<?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>171342</bug_id>
          
          <creation_ts>2017-04-26 14:06:49 -0700</creation_ts>
          <short_desc>Speedometer: Update the Ember.js TodoMVC to a more recent version</short_desc>
          <delta_ts>2017-05-11 23:34:19 -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>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>
          
          <blocked>170513</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Addy Osmani">addyo</reporter>
          <assigned_to name="Addy Osmani">addyo</assigned_to>
          <cc>buildbot</cc>
    
    <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>lforschler</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1301764</commentid>
    <comment_count>0</comment_count>
    <who name="Addy Osmani">addyo</who>
    <bug_when>2017-04-26 14:06:49 -0700</bug_when>
    <thetext>As part of Speedometer 2.0 (https://bugs.webkit.org/show_bug.cgi?id=170513), the Ember.js implementation of TodoMVC needs to be updated to a more recent version. This would update it to a rewrite using ember-cli (the now de facto way of creating Ember apps) and also bump the Ember version used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301768</commentid>
    <comment_count>1</comment_count>
      <attachid>308283</attachid>
    <who name="Addy Osmani">addyo</who>
    <bug_when>2017-04-26 14:16:46 -0700</bug_when>
    <thetext>Created attachment 308283
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1306278</commentid>
    <comment_count>2</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2017-05-08 23:20:27 -0700</bug_when>
    <thetext>As usual, please add a blink line between Reviewed by and the change log description,
and remove these inline comments as they don&apos;t add any value since we&apos;re simply importing files.

We should also probably comment out setItem in resources/todomvc/architecture-examples/emberjs/source/app/services/repo.js.
Is todomvc-fdd2c48cf675753de4a79c857343e23f.js used? If so, that also calls localStorage.setItem.
We might need to override window.localStorage in prepare function instead if the minimized version calls setItem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1307775</commentid>
    <comment_count>3</comment_count>
      <attachid>309870</attachid>
    <who name="Addy Osmani">addyo</who>
    <bug_when>2017-05-11 22:44:33 -0700</bug_when>
    <thetext>Created attachment 309870
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1307776</commentid>
    <comment_count>4</comment_count>
      <attachid>309871</attachid>
    <who name="Addy Osmani">addyo</who>
    <bug_when>2017-05-11 22:48:01 -0700</bug_when>
    <thetext>Created attachment 309871
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1307779</commentid>
    <comment_count>5</comment_count>
    <who name="Addy Osmani">addyo</who>
    <bug_when>2017-05-11 22:51:42 -0700</bug_when>
    <thetext>I&apos;ve added an in-memory localStorage shim that doesn&apos;t persist any data to the implementation. I&apos;ve also added a blank line and trimmed down the inline comments per the other patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1307792</commentid>
    <comment_count>6</comment_count>
      <attachid>309871</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-05-11 23:34:18 -0700</bug_when>
    <thetext>Comment on attachment 309871
Patch

Clearing flags on attachment: 309871

Committed r216735: &lt;http://trac.webkit.org/changeset/216735&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1307793</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-05-11 23:34:19 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>308283</attachid>
            <date>2017-04-26 14:16:46 -0700</date>
            <delta_ts>2017-05-11 22:44:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-171342-20170426141645.patch</filename>
            <type>text/plain</type>
            <size>2599115</size>
            <attacher name="Addy Osmani">addyo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE1ODA4CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCmluZGV4IGI5ZTE0YmUyOGRh
MmFmOTBlNjBmNGI5MTQ4OGI0NzE1ODQ0OGE2Y2IuLjRlZWE4MTRmYzFhOWIyYWQ0NjNkNGZkY2Y0
YmMyYWU1NmIyOGE3YzQgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOTk3IEBACisyMDE3LTA0
LTI2ICBBZGR5IE9zbWFuaSAgPGFkZHlvc21hbmlAZ21haWwuY29tPgorCisgICAgICAgIFNwZWVk
b21ldGVyOiBVcGRhdGUgdGhlIEVtYmVyLmpzIFRvZG9NVkMgdG8gYSBtb3JlIHJlY2VudCB2ZXJz
aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEz
NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgVXBkYXRl
IHRoZSBFbWJlciBUb2RvTVZDIGFwcCBpbiBTcGVlZG9tZXRlciB0byBsYXRlc3QKKworICAgICAg
ICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2Fzc2V0cy90b2RvbXZjLWQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlLmNz
czogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3RvZG9tdmMtZmRkMmM0OGNmNjc1NzUzZGU0
YTc5Yzg1NzM0M2UyM2YuanM6IEFkZGVkLgorICAgICAgICAoZS5kZWZhdWx0LnQuZGVmYXVsdC5D
b21wb25lbnQuZXh0ZW5kLmFjdGlvbnMuc3RhcnRFZGl0aW5nKToKKyAgICAgICAgKGUuZGVmYXVs
dC50LmRlZmF1bHQuQ29tcG9uZW50LmV4dGVuZC5hY3Rpb25zLmRvbmVFZGl0aW5nKToKKyAgICAg
ICAgKGUuZGVmYXVsdC50LmRlZmF1bHQuQ29tcG9uZW50LmV4dGVuZC5hY3Rpb25zLmhhbmRsZUtl
eWRvd24pOgorICAgICAgICAoZS5kZWZhdWx0LnQuZGVmYXVsdC5Db21wb25lbnQuZXh0ZW5kLmFj
dGlvbnMudG9nZ2xlQ29tcGxldGVkKToKKyAgICAgICAgKGUuZGVmYXVsdC50LmRlZmF1bHQuQ29t
cG9uZW50LmV4dGVuZC5hY3Rpb25zLnJlbW92ZVRvZG8pOgorICAgICAgICAoZS5kZWZhdWx0LnQu
ZGVmYXVsdC5Db21wb25lbnQuZXh0ZW5kLmZvY3VzSW5wdXQpOgorICAgICAgICAoZS5kZWZhdWx0
LnQuZGVmYXVsdC5Db21wb25lbnQuZXh0ZW5kLmFjdGlvbnMuZW5hYmxlVG9nZ2xlKToKKyAgICAg
ICAgKGUuZGVmYXVsdC50LmRlZmF1bHQuQ29tcG9uZW50LmV4dGVuZC5hY3Rpb25zLmRpc2FibGVU
b2dnbGUpOgorICAgICAgICAoZS5kZWZhdWx0LnQuZGVmYXVsdC5Db21wb25lbnQuZXh0ZW5kLmFj
dGlvbnMudG9nZ2xlQWxsKToKKyAgICAgICAgKGUuZGVmYXVsdC50LmRlZmF1bHQuQ29udHJvbGxl
ci5leHRlbmQuYWN0aW9ucy5jcmVhdGVUb2RvKToKKyAgICAgICAgKGUuZGVmYXVsdC50LmRlZmF1
bHQuQ29udHJvbGxlci5leHRlbmQuYWN0aW9ucy5jbGVhckNvbXBsZXRlZCk6CisgICAgICAgIChu
KToKKyAgICAgICAgKHIpOgorICAgICAgICAoYSk6CisgICAgICAgIChlLmRlZmF1bHQuaW5pdGlh
bGl6ZSk6CisgICAgICAgIChyLik6CisgICAgICAgICh0KToKKyAgICAgICAgKHIubWFwKToKKyAg
ICAgICAgKGUuZGVmYXVsdC50LmRlZmF1bHQuUm91dGUuZXh0ZW5kLm1vZGVsKToKKyAgICAgICAg
KGUuZGVmYXVsdC50LmRlZmF1bHQuU2VydmljZS5leHRlbmQuZmluZEFsbCk6CisgICAgICAgIChl
LmRlZmF1bHQudC5kZWZhdWx0LlNlcnZpY2UuZXh0ZW5kLmFkZCk6CisgICAgICAgIChlLmRlZmF1
bHQudC5kZWZhdWx0LlNlcnZpY2UuZXh0ZW5kLmRlbGV0ZSk6CisgICAgICAgIChlLmRlZmF1bHQu
dC5kZWZhdWx0LlNlcnZpY2UuZXh0ZW5kLnBlcnNpc3QpOgorICAgICAgICAoZ2V0IHJldHVybik6
CisgICAgICAgIChyZXR1cm4uYnVpbGRGcmFnbWVudCk6CisgICAgICAgIChyZXR1cm4uYnVpbGRS
ZW5kZXJOb2Rlcyk6CisgICAgICAgIChlLmRlZmF1bHQuRW1iZXIuSFRNTEJhcnMudGVtcGxhdGUu
cmV0dXJuLmJ1aWxkRnJhZ21lbnQpOgorICAgICAgICAoZS5kZWZhdWx0LkVtYmVyLkhUTUxCYXJz
LnRlbXBsYXRlLnJldHVybi5idWlsZFJlbmRlck5vZGVzKToKKyAgICAgICAgKGUuZGVmYXVsdC5F
bWJlci5IVE1MQmFycy50ZW1wbGF0ZS5lKToKKyAgICAgICAgKGUuZGVmYXVsdC5FbWJlci5IVE1M
QmFycy50ZW1wbGF0ZS50KToKKyAgICAgICAgKGUuZGVmYXVsdC5FbWJlci5IVE1MQmFycy50ZW1w
bGF0ZS5uKToKKyAgICAgICAgKGUuZGVmYXVsdC5FbWJlci5IVE1MQmFycy50ZW1wbGF0ZS5yKToK
KyAgICAgICAgKGUuZGVmYXVsdC5FbWJlci5IVE1MQmFycy50ZW1wbGF0ZSk6CisgICAgICAgIChj
YXRjaCk6CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci03YjVjOTg1MjA5MTBhZmE1OGQ3NGUw
NWVjODZjZDg3My5jc3M6IEFkZGVkLgorICAgICAgICAoI2lzc3VlLWNvdW50LC5oaWRkZW4sbGFi
ZWxbZm9yPXRvZ2dsZS1hbGxdKToKKyAgICAgICAgKCNmb290ZXIsI2luZm8sI3RvZG9hcHAgaDEs
I3RvZ2dsZS1hbGwpOgorICAgICAgICAoaHIpOgorICAgICAgICAoLmxlYXJuIGEpOgorICAgICAg
ICAoLmxlYXJuIGE6aG92ZXIpOgorICAgICAgICAoLmxlYXJuIGgzLC5sZWFybiBoNCwubGVhcm4g
aDUpOgorICAgICAgICAoLmxlYXJuIGgzKToKKyAgICAgICAgKC5sZWFybiBoNCk6CisgICAgICAg
ICgubGVhcm4gaDUpOgorICAgICAgICAoLmxlYXJuIHVsKToKKyAgICAgICAgKC5sZWFybiBsaSk6
CisgICAgICAgICgubGVhcm4gcCk6CisgICAgICAgICgucXVvdGUgcDphZnRlciwucXVvdGUgcDpi
ZWZvcmUpOgorICAgICAgICAoLnF1b3RlKToKKyAgICAgICAgKC5xdW90ZSBwKToKKyAgICAgICAg
KC5xdW90ZSBwOmJlZm9yZSk6CisgICAgICAgICgucXVvdGUgcDphZnRlcik6CisgICAgICAgICgu
cXVvdGUgZm9vdGVyKToKKyAgICAgICAgKC5xdW90ZSBmb290ZXIgaW1nKToKKyAgICAgICAgKC5x
dW90ZSBmb290ZXIgYSk6CisgICAgICAgICguc3BlZWNoLWJ1YmJsZSk6CisgICAgICAgICguc3Bl
ZWNoLWJ1YmJsZTphZnRlcik6CisgICAgICAgICgubGVhcm4tYmFyPi5sZWFybik6CisgICAgICAg
ICgjbWFpbiwjbmV3LXRvZG8sI3RvZG8tbGlzdCBsaSwjdG9kb2FwcCwuZWRpdCk6CisgICAgICAg
ICgubGVhcm4tYmFyKToKKyAgICAgICAgKEBtZWRpYSAobWluLXdpZHRoOjg5OXB4KSk6CisgICAg
ICAgIChib2R5LGJ1dHRvbixodG1sKToKKyAgICAgICAgKGJ1dHRvbik6CisgICAgICAgIChib2R5
KToKKyAgICAgICAgKGJ1dHRvbixpbnB1dFt0eXBlPWNoZWNrYm94XSk6CisgICAgICAgICgjdG9k
b2FwcCk6CisgICAgICAgICgjdG9kb2FwcCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRl
cik6CisgICAgICAgICgjdG9kb2FwcCBpbnB1dDo6LW1vei1wbGFjZWhvbGRlcik6CisgICAgICAg
ICgjdG9kb2FwcCBpbnB1dDo6aW5wdXQtcGxhY2Vob2xkZXIpOgorICAgICAgICAoI3RvZG9hcHAg
aDEpOgorICAgICAgICAoI25ldy10b2RvLC5lZGl0KToKKyAgICAgICAgKCNuZXctdG9kbyk6Cisg
ICAgICAgICgjbWFpbik6CisgICAgICAgICgjdG9nZ2xlLWFsbCk6CisgICAgICAgICgjdG9nZ2xl
LWFsbDpiZWZvcmUpOgorICAgICAgICAoI3RvZ2dsZS1hbGw6Y2hlY2tlZDpiZWZvcmUpOgorICAg
ICAgICAoI3RvZG8tbGlzdCk6CisgICAgICAgICgjdG9kby1saXN0IGxpKToKKyAgICAgICAgKCN0
b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCk6CisgICAgICAgICgjdG9kby1saXN0IGxpLmVkaXRpbmcp
OgorICAgICAgICAoI3RvZG8tbGlzdCBsaS5lZGl0aW5nIC5lZGl0KToKKyAgICAgICAgKCN0b2Rv
LWxpc3QgbGkuZWRpdGluZyAudmlldyk6CisgICAgICAgICgjdG9kby1saXN0IGxpIC50b2dnbGUp
OgorICAgICAgICAoI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmFmdGVyKToKKyAgICAgICAgKCN0b2Rv
LWxpc3QgbGkgLnRvZ2dsZTpjaGVja2VkOmFmdGVyKToKKyAgICAgICAgKCN0b2RvLWxpc3QgbGkg
bGFiZWwpOgorICAgICAgICAoI3RvZG8tbGlzdCBsaS5jb21wbGV0ZWQgbGFiZWwpOgorICAgICAg
ICAoI3RvZG8tbGlzdCBsaSAuZGVzdHJveSk6CisgICAgICAgICgjZmlsdGVycywjZm9vdGVyOmJl
Zm9yZSk6CisgICAgICAgICgjdG9kby1saXN0IGxpIC5kZXN0cm95OmhvdmVyKToKKyAgICAgICAg
KCNmaWx0ZXJzIGxpIGEsI2luZm8gYSk6CisgICAgICAgICgjdG9kby1saXN0IGxpIC5kZXN0cm95
OmFmdGVyKToKKyAgICAgICAgKCN0b2RvLWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kpOgorICAgICAg
ICAoI3RvZG8tbGlzdCBsaSAuZWRpdCk6CisgICAgICAgICgjdG9kby1saXN0IGxpLmVkaXRpbmc6
bGFzdC1jaGlsZCk6CisgICAgICAgICgjZm9vdGVyKToKKyAgICAgICAgKCNmb290ZXI6YmVmb3Jl
KToKKyAgICAgICAgKCN0b2RvLWNvdW50KToKKyAgICAgICAgKCN0b2RvLWNvdW50IHN0cm9uZyk6
CisgICAgICAgICgjZmlsdGVycyk6CisgICAgICAgICgjZmlsdGVycyBsaSk6CisgICAgICAgICgj
ZmlsdGVycyBsaSBhKToKKyAgICAgICAgKCNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQsI2ZpbHRlcnMg
bGkgYTpob3Zlcik6CisgICAgICAgICgjZmlsdGVycyBsaSBhLnNlbGVjdGVkKToKKyAgICAgICAg
KCNjbGVhci1jb21wbGV0ZWQsaHRtbCAjY2xlYXItY29tcGxldGVkOmFjdGl2ZSk6CisgICAgICAg
ICgjY2xlYXItY29tcGxldGVkOmhvdmVyLCNpbmZvIGE6aG92ZXIpOgorICAgICAgICAoI2luZm8p
OgorICAgICAgICAoI2luZm8gcCk6CisgICAgICAgICgjaW5mbyBhKToKKyAgICAgICAgKCN0b2Rv
LWxpc3QgbGkgLnRvZ2dsZSwjdG9nZ2xlLWFsbCk6CisgICAgICAgIChAbWVkaWEgc2NyZWVuIGFu
ZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApKToKKyAgICAgICAgKEBtZWRpYSAo
bWF4LXdpZHRoOjQzMHB4KSk6CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci05ODM2YWM4YjAx
NmZjZWE2Zjg5Y2NmOTI5MTc3NzJmNi5qczogQWRkZWQuCisgICAgICAgIChjcmVhdGVEZXByZWNh
dGVkTW9kdWxlKToKKyAgICAgICAgKHQpOgorICAgICAgICAocik6CisgICAgICAgIChuKToKKyAg
ICAgICAgKGkpOgorICAgICAgICAobyk6CisgICAgICAgIChhKToKKyAgICAgICAgKHMpOgorICAg
ICAgICAodSk6CisgICAgICAgIChyZXF1aXJlanMucmVxdWlyZS5yZXF1aXJlTW9kdWxlKToKKyAg
ICAgICAgKGxvYWRlci5ub0NvbmZsaWN0KToKKyAgICAgICAgKGYuQXJyYXkuaXNBcnJheS5BcnJh
eS5pc0FycmF5KToKKyAgICAgICAgKG4ucHJvdG90eXBlLm1ha2VEZWZhdWx0RXhwb3J0KToKKyAg
ICAgICAgKG4ucHJvdG90eXBlLmV4cG9ydHMpOgorICAgICAgICAobi5wcm90b3R5cGUudW5zZWUp
OgorICAgICAgICAobi5wcm90b3R5cGUucmVpZnkpOgorICAgICAgICAobi5wcm90b3R5cGUuZmlu
ZERlcHMpOgorICAgICAgICAodC5oYXMpOgorICAgICAgICAobi5wcm90b3R5cGUubWFrZVJlcXVp
cmUpOgorICAgICAgICAoZGVmaW5lKToKKyAgICAgICAgKGRlZmluZS5hbGlhcyk6CisgICAgICAg
IChyZXF1aXJlanMudW5zZWUpOgorICAgICAgICAocmVxdWlyZWpzLmNsZWFyKToKKyAgICAgICAg
KGwpOgorICAgICAgICAoYyk6CisgICAgICAgIChmKToKKyAgICAgICAgKGQpOgorICAgICAgICAo
cCk6CisgICAgICAgIChoKToKKyAgICAgICAgKG0pOgorICAgICAgICAodik6CisgICAgICAgIChi
KToKKyAgICAgICAgKGcpOgorICAgICAgICAoeSk6CisgICAgICAgIChfKToKKyAgICAgICAgKGsp
OgorICAgICAgICAoQyk6CisgICAgICAgIChFKToKKyAgICAgICAgKE8pOgorICAgICAgICAoTik6
CisgICAgICAgIChTKToKKyAgICAgICAgKEEpOgorICAgICAgICAoUCk6CisgICAgICAgIChqKToK
KyAgICAgICAgKFIpOgorICAgICAgICAoTCk6CisgICAgICAgIChEKToKKyAgICAgICAgKE0pOgor
ICAgICAgICAoSSk6CisgICAgICAgIChsLnMucHJvbWlzZSk6CisgICAgICAgIChIKToKKyAgICAg
ICAgKFYpOgorICAgICAgICAocSk6CisgICAgICAgICh6KToKKyAgICAgICAgKEIpOgorICAgICAg
ICAoVSk6CisgICAgICAgIChXKToKKyAgICAgICAgKEspOgorICAgICAgICAob2UpOgorICAgICAg
ICAobGUpOgorICAgICAgICAob2UuZm4ub2UucHJvdG90eXBlLnRvQXJyYXkpOgorICAgICAgICAo
b2UuZm4ub2UucHJvdG90eXBlLnB1c2hTdGFjayk6CisgICAgICAgIChvZS5mbi5vZS5wcm90b3R5
cGUuZWFjaCk6CisgICAgICAgIChvZS5mbi5vZS5wcm90b3R5cGUubWFwKToKKyAgICAgICAgKG9l
LmZuLm9lLnByb3RvdHlwZS5zbGljZSk6CisgICAgICAgIChvZS5mbi5vZS5wcm90b3R5cGUuZmly
c3QpOgorICAgICAgICAob2UuZm4ub2UucHJvdG90eXBlLmxhc3QpOgorICAgICAgICAob2UuZm4u
b2UucHJvdG90eXBlLmVxKToKKyAgICAgICAgKG9lLmZuLm9lLnByb3RvdHlwZS5lbmQpOgorICAg
ICAgICAob2UuZXh0ZW5kLm9lLmZuLmV4dGVuZCk6CisgICAgICAgIChvZS5leHRlbmQpOgorICAg
ICAgICAob2UuZXh0ZW5kLik6CisgICAgICAgIChyLmUpOgorICAgICAgICAobC4pOgorICAgICAg
ICAoZWUpOgorICAgICAgICAodmUuQ0hJTEQpOgorICAgICAgICAodmUuUFNFVURPKToKKyAgICAg
ICAgKGZpbHRlci4pOgorICAgICAgICAoZmlsdGVyLlRBRyk6CisgICAgICAgIChmaWx0ZXIuQ0xB
U1MpOgorICAgICAgICAoZmlsdGVyLkFUVFIpOgorICAgICAgICAoZmlsdGVyLkNISUxEKToKKyAg
ICAgICAgKGZpbHRlci5QU0VVRE8pOgorICAgICAgICAocHNldWRvcy4pOgorICAgICAgICAocHNl
dWRvcy50YXJnZXQpOgorICAgICAgICAocHNldWRvcy5yb290KToKKyAgICAgICAgKHBzZXVkb3Mu
Zm9jdXMpOgorICAgICAgICAocHNldWRvcy5lbmFibGVkKToKKyAgICAgICAgKHBzZXVkb3MuZGlz
YWJsZWQpOgorICAgICAgICAocHNldWRvcy5jaGVja2VkKToKKyAgICAgICAgKHBzZXVkb3Muc2Vs
ZWN0ZWQpOgorICAgICAgICAocHNldWRvcy5lbXB0eSk6CisgICAgICAgIChwc2V1ZG9zLnBhcmVu
dCk6CisgICAgICAgIChwc2V1ZG9zLmhlYWRlcik6CisgICAgICAgIChwc2V1ZG9zLmlucHV0KToK
KyAgICAgICAgKHBzZXVkb3MuYnV0dG9uKToKKyAgICAgICAgKHBzZXVkb3MudGV4dCk6CisgICAg
ICAgIChjZSk6CisgICAgICAgIChFLnQudG9rZW5pemUpOgorICAgICAgICAoTy50LmNvbXBpbGUp
OgorICAgICAgICAoVC50LnNlbGVjdCk6CisgICAgICAgIChmZSk6CisgICAgICAgIChkZSk6Cisg
ICAgICAgIChvZS5maWx0ZXIpOgorICAgICAgICAob2UuZm4uZXh0ZW5kLik6CisgICAgICAgIChv
ZS5mbi5leHRlbmQpOgorICAgICAgICAoZ2Uub2UuZm4uaW5pdCk6CisgICAgICAgIChvZS5lYWNo
KToKKyAgICAgICAgKGMuKToKKyAgICAgICAgKGMuYWRkKToKKyAgICAgICAgKGMucmVtb3ZlKToK
KyAgICAgICAgKGMuaGFzKToKKyAgICAgICAgKGMuZW1wdHkpOgorICAgICAgICAoYy5kaXNhYmxl
KToKKyAgICAgICAgKGMuZGlzYWJsZWQpOgorICAgICAgICAoYy5sb2NrKToKKyAgICAgICAgKGMu
bG9ja2VkKToKKyAgICAgICAgKGMuZmlyZVdpdGgpOgorICAgICAgICAoYy5maXJlKToKKyAgICAg
ICAgKGMuZmlyZWQpOgorICAgICAgICAob2UuQ2FsbGJhY2tzKToKKyAgICAgICAgKG9lLmZuLnJl
YWR5KToKKyAgICAgICAgKG9lLnJlYWR5LnByb21pc2UpOgorICAgICAgICAoa2UpOgorICAgICAg
ICAoQ2UpOgorICAgICAgICAocy5wcm90b3R5cGUucmVnaXN0ZXIpOgorICAgICAgICAocy5wcm90
b3R5cGUuY2FjaGUpOgorICAgICAgICAocy5wcm90b3R5cGUuYWNjZXNzKToKKyAgICAgICAgKHMu
cHJvdG90eXBlLnJlbW92ZSk6CisgICAgICAgIChzLnByb3RvdHlwZS5oYXNEYXRhKToKKyAgICAg
ICAgKGplKToKKyAgICAgICAgKG9lLmV2ZW50Lik6CisgICAgICAgIChvZS5ldmVudC5hZGQpOgor
ICAgICAgICAob2UuZXZlbnQucmVtb3ZlKToKKyAgICAgICAgKG9lLmV2ZW50LmRpc3BhdGNoKToK
KyAgICAgICAgKG9lLmV2ZW50LmhhbmRsZXJzKToKKyAgICAgICAgKG9lLmV2ZW50LmtleUhvb2tz
LmZpbHRlcik6CisgICAgICAgIChvZS5ldmVudC5tb3VzZUhvb2tzLmZpbHRlcik6CisgICAgICAg
IChvZS5ldmVudC5maXgpOgorICAgICAgICAocy5wcm90b3R5cGUuZ2V0IHJldHVybik6CisgICAg
ICAgIChvZS5ldmVudC5zcGVjaWFsLmZvY3VzLnRyaWdnZXIpOgorICAgICAgICAob2UuZXZlbnQu
c3BlY2lhbC5ibHVyLnRyaWdnZXIpOgorICAgICAgICAob2UuZXZlbnQuc3BlY2lhbC5jbGljay50
cmlnZ2VyKToKKyAgICAgICAgKG9lLmV2ZW50LnNwZWNpYWwuY2xpY2suX2RlZmF1bHQpOgorICAg
ICAgICAob2UuZXZlbnQuc3BlY2lhbC5iZWZvcmV1bmxvYWQucG9zdERpc3BhdGNoKToKKyAgICAg
ICAgKHMucHJvdG90eXBlKToKKyAgICAgICAgKG9lLnJlbW92ZUV2ZW50KToKKyAgICAgICAgKG9l
LkV2ZW50KToKKyAgICAgICAgKG9lLkV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCk6Cisg
ICAgICAgIChvZS5FdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uKToKKyAgICAgICAgKG9l
LkV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pOgorICAgICAgICAoWWUp
OgorICAgICAgICAoWGUpOgorICAgICAgICAocy5wcm90b3R5cGUuc2V0IHZhcik6CisgICAgICAg
IChnZXQgb2UpOgorICAgICAgICAoc2V0IGdldCBvZSk6CisgICAgICAgIChSLnByb3RvdHlwZS5p
bml0KToKKyAgICAgICAgKFIucHJvdG90eXBlLmN1cik6CisgICAgICAgIChSLnByb3RvdHlwZS5y
dW4pOgorICAgICAgICAob2UuZWFzaW5nLmxpbmVhcik6CisgICAgICAgIChvZS5lYXNpbmcuc3dp
bmcpOgorICAgICAgICAobi5jb21wbGV0ZSk6CisgICAgICAgIChvZS5zcGVlZCk6CisgICAgICAg
IChvZS5meC50aWNrKToKKyAgICAgICAgKG9lLmZ4LnRpbWVyKToKKyAgICAgICAgKG9lLmZ4LnN0
YXJ0KToKKyAgICAgICAgKG9lLmZ4LnN0b3ApOgorICAgICAgICAob2UuZm4uZGVsYXkpOgorICAg
ICAgICAoUi5wcm9wSG9va3Muc2Nyb2xsVG9wLlIucHJvcEhvb2tzLnNjcm9sbExlZnQuc2V0IGUp
OgorICAgICAgICAoUi5wcm9wSG9va3Muc2Nyb2xsVG9wLlIucHJvcEhvb2tzLnNjcm9sbExlZnQp
OgorICAgICAgICAoc2V0IHV0LnNldCByZXR1cm4pOgorICAgICAgICAoc2V0IHV0KToKKyAgICAg
ICAgKG9wdFNlbGVjdGVkKToKKyAgICAgICAgKHNldCB2YXIpOgorICAgICAgICAob2UucGFyc2VK
U09OKToKKyAgICAgICAgKG9lLnBhcnNlWE1MKToKKyAgICAgICAgKGRlYm91bmNlKToKKyAgICAg
ICAgKGNhbmNlbFRpbWVycyk6CisgICAgICAgIChoYXNUaW1lcnMpOgorICAgICAgICAoY2FuY2Vs
KToKKyAgICAgICAgKF9jYW5jZWxJdGVtKToKKyAgICAgICAgKF9ydW5FeHBpcmVkVGltZXJzKToK
KyAgICAgICAgKF9zY2hlZHVsZUV4cGlyZWRUaW1lcnMpOgorICAgICAgICAoX3JlaW5zdGFsbFRp
bWVyVGltZW91dCk6CisgICAgICAgIChfY2xlYXJUaW1lclRpbWVvdXQpOgorICAgICAgICAoX2lu
c3RhbGxUaW1lclRpbWVvdXQpOgorICAgICAgICAobi5wcm90b3R5cGUuc2NoZWR1bGUpOgorICAg
ICAgICAobi5wcm90b3R5cGUuZmx1c2gpOgorICAgICAgICAoci5wcm90b3R5cGUucHVzaCk6Cisg
ICAgICAgIChyLnByb3RvdHlwZS5wdXNoVW5pcXVlV2l0aG91dEd1aWQpOgorICAgICAgICAoci5w
cm90b3R5cGUudGFyZ2V0UXVldWUpOgorICAgICAgICAoci5wcm90b3R5cGUucHVzaFVuaXF1ZVdp
dGhHdWlkKToKKyAgICAgICAgKHIucHJvdG90eXBlLnB1c2hVbmlxdWUpOgorICAgICAgICAoci5w
cm90b3R5cGUuaW52b2tlKToKKyAgICAgICAgKHIucHJvdG90eXBlLmludm9rZVdpdGhPbkVycm9y
KToKKyAgICAgICAgKHIucHJvdG90eXBlLmZsdXNoKToKKyAgICAgICAgKHIucHJvdG90eXBlLmNh
bmNlbCk6CisgICAgICAgICh0LnNldCBlKToKKyAgICAgICAgKHcpOgorICAgICAgICAodS5wcm90
b3R5cGUubG9va3VwKToKKyAgICAgICAgKHUucHJvdG90eXBlLmxvb2t1cEZhY3RvcnkpOgorICAg
ICAgICAodS5wcm90b3R5cGUuZGVzdHJveSk6CisgICAgICAgICh1LnByb3RvdHlwZS5yZXNldCk6
CisgICAgICAgICh1LnByb3RvdHlwZS5vd25lckluamVjdGlvbik6CisgICAgICAgICh1LnByb3Rv
dHlwZS5jb250YWluZXIpOgorICAgICAgICAodS5wcm90b3R5cGUucmVnaXN0ZXIpOgorICAgICAg
ICAodS5wcm90b3R5cGUudW5yZWdpc3Rlcik6CisgICAgICAgICh1LnByb3RvdHlwZS5yZXNvbHZl
KToKKyAgICAgICAgKHUucHJvdG90eXBlLmRlc2NyaWJlKToKKyAgICAgICAgKHUucHJvdG90eXBl
Lm5vcm1hbGl6ZUZ1bGxOYW1lKToKKyAgICAgICAgKHUucHJvdG90eXBlLm5vcm1hbGl6ZSk6Cisg
ICAgICAgICh1LnByb3RvdHlwZS5tYWtlVG9TdHJpbmcpOgorICAgICAgICAodS5wcm90b3R5cGUu
aGFzKToKKyAgICAgICAgKHUucHJvdG90eXBlLm9wdGlvbnNGb3JUeXBlKToKKyAgICAgICAgKHUu
cHJvdG90eXBlLmdldE9wdGlvbnNGb3JUeXBlKToKKyAgICAgICAgKHUucHJvdG90eXBlLm9wdGlv
bnMpOgorICAgICAgICAodS5wcm90b3R5cGUuZ2V0T3B0aW9ucyk6CisgICAgICAgICh1LnByb3Rv
dHlwZS5nZXRPcHRpb24pOgorICAgICAgICAodS5wcm90b3R5cGUudHlwZUluamVjdGlvbik6Cisg
ICAgICAgICh1LnByb3RvdHlwZS5pbmplY3Rpb24pOgorICAgICAgICAodS5wcm90b3R5cGUuZmFj
dG9yeVR5cGVJbmplY3Rpb24pOgorICAgICAgICAodS5wcm90b3R5cGUuZmFjdG9yeUluamVjdGlv
bik6CisgICAgICAgICh1LnByb3RvdHlwZS5rbm93bkZvclR5cGUpOgorICAgICAgICAodS5wcm90
b3R5cGUudmFsaWRhdGVGdWxsTmFtZSk6CisgICAgICAgICh1LnByb3RvdHlwZS5pc1ZhbGlkRnVs
bE5hbWUpOgorICAgICAgICAodS5wcm90b3R5cGUudmFsaWRhdGVJbmplY3Rpb25zKToKKyAgICAg
ICAgKHUucHJvdG90eXBlLm5vcm1hbGl6ZUluamVjdGlvbnNIYXNoKToKKyAgICAgICAgKHUucHJv
dG90eXBlLmdldEluamVjdGlvbnMpOgorICAgICAgICAodS5wcm90b3R5cGUuZ2V0VHlwZUluamVj
dGlvbnMpOgorICAgICAgICAodS5wcm90b3R5cGUuZ2V0RmFjdG9yeUluamVjdGlvbnMpOgorICAg
ICAgICAodS5wcm90b3R5cGUuZ2V0RmFjdG9yeVR5cGVJbmplY3Rpb25zKToKKyAgICAgICAgKHUu
cHJvdG90eXBlLmV4cGFuZExvY2FsTG9va3VwKToKKyAgICAgICAgKG4ucHJvdG90eXBlLmFkZCk6
CisgICAgICAgIChuLnByb3RvdHlwZS5tYXApOgorICAgICAgICAobi5wcm90b3R5cGUuYWRkRWRn
ZSk6CisgICAgICAgIChuLnByb3RvdHlwZS50b3Bzb3J0KToKKyAgICAgICAgKG4ucHJvdG90eXBl
LmFkZEVkZ2VzKToKKyAgICAgICAgKGwucHJvdG90eXBlLmdldFN0YXRlKToKKyAgICAgICAgKGwu
cHJvdG90eXBlLnNldFN0YXRlKToKKyAgICAgICAgKGwucHJvdG90eXBlLmNsZWFyKToKKyAgICAg
ICAgKGwucHJvdG90eXBlLmRlc3Ryb3kpOgorICAgICAgICAoeC5nZXRFbGVtZW50QnlJZCk6Cisg
ICAgICAgICh4Lmluc2VydEJlZm9yZSk6CisgICAgICAgICh4LmFwcGVuZENoaWxkKToKKyAgICAg
ICAgKHguY2hpbGRBdCk6CisgICAgICAgICh4LmNoaWxkQXRJbmRleCk6CisgICAgICAgICh4LmFw
cGVuZFRleHQpOgorICAgICAgICAoeC5zZXRBdHRyaWJ1dGUpOgorICAgICAgICAoeC5nZXRBdHRy
aWJ1dGUpOgorICAgICAgICAoeC5zZXRBdHRyaWJ1dGVOUyk6CisgICAgICAgICh4LmdldEF0dHJp
YnV0ZU5TKToKKyAgICAgICAgKGcueC5yZW1vdmVBdHRyaWJ1dGUpOgorICAgICAgICAoeC5yZW1v
dmVBdHRyaWJ1dGUpOgorICAgICAgICAoeC5zZXRQcm9wZXJ0eVN0cmljdCk6CisgICAgICAgICh4
LmdldFByb3BlcnR5U3RyaWN0KToKKyAgICAgICAgKHguc2V0UHJvcGVydHkpOgorICAgICAgICAo
bS5tLmNyZWF0ZUVsZW1lbnROUy54LmNyZWF0ZUVsZW1lbnQpOgorICAgICAgICAoeC5jcmVhdGVF
bGVtZW50KToKKyAgICAgICAgKHguc2V0TmFtZXNwYWNlKToKKyAgICAgICAgKHguZGV0ZWN0TmFt
ZXNwYWNlKToKKyAgICAgICAgKHguY3JlYXRlRG9jdW1lbnRGcmFnbWVudCk6CisgICAgICAgICh4
LmNyZWF0ZVRleHROb2RlKToKKyAgICAgICAgKHguY3JlYXRlQ29tbWVudCk6CisgICAgICAgICh4
LnJlcGFpckNsb25lZE5vZGUpOgorICAgICAgICAoeC5jbG9uZU5vZGUpOgorICAgICAgICAoeC5j
cmVhdGVBdHRyTW9ycGgpOgorICAgICAgICAoeC5jcmVhdGVFbGVtZW50TW9ycGgpOgorICAgICAg
ICAoeC5jcmVhdGVVbnNhZmVBdHRyTW9ycGgpOgorICAgICAgICAoeC5jcmVhdGVNb3JwaCk6Cisg
ICAgICAgICh4LmNyZWF0ZUZyYWdtZW50TW9ycGgpOgorICAgICAgICAoeC5yZXBsYWNlQ29udGVu
dFdpdGhNb3JwaCk6CisgICAgICAgICh4LmNyZWF0ZVVuc2FmZU1vcnBoKToKKyAgICAgICAgKHgu
Y3JlYXRlTW9ycGhBdCk6CisgICAgICAgICh4LmNyZWF0ZVVuc2FmZU1vcnBoQXQpOgorICAgICAg
ICAoeC5pbnNlcnRNb3JwaEJlZm9yZSk6CisgICAgICAgICh4LmFwcGVuZE1vcnBoKToKKyAgICAg
ICAgKHguaW5zZXJ0Qm91bmRhcnkpOgorICAgICAgICAoeC5zZXRNb3JwaEhUTUwpOgorICAgICAg
ICAoeC5wYXJzZUhUTUwpOgorICAgICAgICAodS5lLmJ1aWxkSFRNTERPTS5wKToKKyAgICAgICAg
KHUuZS5hZGRDbGFzc2VzLm8pOgorICAgICAgICAoZS5yZW1vdmVDbGFzc2VzLmEpOgorICAgICAg
ICAobS5kLmRlZmF1bHQuZXh0ZW5kLmluaXQpOgorICAgICAgICAobS5kLmRlZmF1bHQuZXh0ZW5k
LmJvb3QpOgorICAgICAgICAobS5kLmRlZmF1bHQuZXh0ZW5kLl9ib290U3luYyk6CisgICAgICAg
IChtLmQuZGVmYXVsdC5leHRlbmQuZGlkQ3JlYXRlUm9vdFZpZXcpOgorICAgICAgICAobS5kLmRl
ZmF1bHQuZXh0ZW5kLnN0YXJ0Um91dGluZyk6CisgICAgICAgIChtLmQuZGVmYXVsdC5leHRlbmQu
c2V0dXBSb3V0ZXIpOgorICAgICAgICAobS5kLmRlZmF1bHQuZXh0ZW5kLmhhbmRsZVVSTCk6Cisg
ICAgICAgIChtLmQuZGVmYXVsdC5leHRlbmQuc2V0dXBFdmVudERpc3BhdGNoZXIpOgorICAgICAg
ICAobS5kLmRlZmF1bHQuZXh0ZW5kLmdldFVSTCk6CisgICAgICAgIChtLmQuZGVmYXVsdC5leHRl
bmQuaSk6CisgICAgICAgIChtLmQuZGVmYXVsdC5leHRlbmQuYSk6CisgICAgICAgIChtLmQuZGVm
YXVsdC5leHRlbmQudmlzaXQpOgorICAgICAgICAoaC5wcm90b3R5cGUudG9FbnZpcm9ubWVudCk6
CisgICAgICAgIChyZXR1cm4ubG9va3VwKToKKyAgICAgICAgKGdldCB2YXIpOgorICAgICAgICAo
TS5lLmNyZWF0ZSk6CisgICAgICAgIChJLmUuY3JlYXRlKToKKyAgICAgICAgKEYuZS5jcmVhdGUp
OgorICAgICAgICAoRik6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLmluaXQpOgorICAgICAg
ICAoai5kZWZhdWx0LmV4dGVuZC5idWlsZEluc3RhbmNlKToKKyAgICAgICAgKGouZGVmYXVsdC5l
eHRlbmQuX3ByZXBhcmVGb3JHbG9iYWxzTW9kZSk6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5k
Ll9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZSk6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLndh
aXRGb3JET01SZWFkeSk6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLmRvbVJlYWR5KToKKyAg
ICAgICAgKGouZGVmYXVsdC5leHRlbmQuZGVmZXJSZWFkaW5lc3MpOgorICAgICAgICAoai5kZWZh
dWx0LmV4dGVuZC5hZHZhbmNlUmVhZGluZXNzKToKKyAgICAgICAgKGouZGVmYXVsdC5leHRlbmQu
Ym9vdCk6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLl9ib290U3luYyk6CisgICAgICAgIChq
LmRlZmF1bHQuZXh0ZW5kLik6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLnJlc2V0KToKKyAg
ICAgICAgKGouZGVmYXVsdC5leHRlbmQuZGlkQmVjb21lUmVhZHkpOgorICAgICAgICAoai5kZWZh
dWx0LmV4dGVuZC5yZWFkeSk6CisgICAgICAgIChqLmRlZmF1bHQuZXh0ZW5kLndpbGxEZXN0cm95
KToKKyAgICAgICAgKGouZGVmYXVsdC5leHRlbmQudmlzaXQpOgorICAgICAgICAocmVvcGVuQ2xh
c3MuYnVpbGRSZWdpc3RyeSk6CisgICAgICAgIChpbml0KToKKyAgICAgICAgKHVucmVnaXN0ZXIp
OgorICAgICAgICAod2lsbERlc3Ryb3kpOgorICAgICAgICAoYnVpbGRJbnN0YW5jZSk6CisgICAg
ICAgIChidWlsZFJlZ2lzdHJ5KToKKyAgICAgICAgKGluaXRpYWxpemVyKToKKyAgICAgICAgKGlu
c3RhbmNlSW5pdGlhbGl6ZXIpOgorICAgICAgICAocnVuSW5pdGlhbGl6ZXJzKToKKyAgICAgICAg
KHJ1bkluc3RhbmNlSW5pdGlhbGl6ZXJzKToKKyAgICAgICAgKF9ydW5Jbml0aWFsaXplcik6Cisg
ICAgICAgIChnLnJlb3BlbkNsYXNzLmJ1aWxkUmVnaXN0cnkpOgorICAgICAgICAoZS5kZWZhdWx0
LmkuZGVmYXVsdC5leHRlbmQuaW5pdCk6CisgICAgICAgIChlLmRlZmF1bHQuaS5kZWZhdWx0LmV4
dGVuZC5ub3JtYWxpemUpOgorICAgICAgICAoZS5kZWZhdWx0LmkuZGVmYXVsdC5leHRlbmQucmVz
b2x2ZSk6CisgICAgICAgIChlLmRlZmF1bHQuaS5kZWZhdWx0LmV4dGVuZC5wYXJzZU5hbWUpOgor
ICAgICAgICAoZS5kZWZhdWx0LmkuZGVmYXVsdC5leHRlbmQuX3BhcnNlTmFtZSk6CisgICAgICAg
IChlLmRlZmF1bHQuaS5kZWZhdWx0LmV4dGVuZC5sb29rdXBEZXNjcmlwdGlvbik6CisgICAgICAg
IChlLmRlZmF1bHQuaS5kZWZhdWx0LmV4dGVuZC5tYWtlVG9TdHJpbmcpOgorICAgICAgICAoZS5k
ZWZhdWx0LmkuZGVmYXVsdC5leHRlbmQudXNlUm91dGVyTmFtaW5nKToKKyAgICAgICAgKGUuZGVm
YXVsdC5pLmRlZmF1bHQuZXh0ZW5kLnJlc29sdmVUZW1wbGF0ZSk6CisgICAgICAgIChlLmRlZmF1
bHQuaS5kZWZhdWx0LmV4dGVuZC5yZXNvbHZlVmlldyk6CisgICAgICAgIChlLmRlZmF1bHQuaS5k
ZWZhdWx0LmV4dGVuZC5yZXNvbHZlQ29udHJvbGxlcik6CisgICAgICAgIChlLmRlZmF1bHQuaS5k
ZWZhdWx0LmV4dGVuZC5yZXNvbHZlUm91dGUpOgorICAgICAgICAoZS5kZWZhdWx0LmkuZGVmYXVs
dC5leHRlbmQucmVzb2x2ZU1vZGVsKToKKyAgICAgICAgKGUuZGVmYXVsdC5pLmRlZmF1bHQuZXh0
ZW5kLnJlc29sdmVIZWxwZXIpOgorICAgICAgICAoZS5kZWZhdWx0LmkuZGVmYXVsdC5leHRlbmQu
cmVzb2x2ZU90aGVyKToKKyAgICAgICAgKGUuZGVmYXVsdC5pLmRlZmF1bHQuZXh0ZW5kLnJlc29s
dmVNYWluKToKKyAgICAgICAgKGUuZGVmYXVsdC5pLmRlZmF1bHQuZXh0ZW5kLl9sb2dMb29rdXAp
OgorICAgICAgICAoZS5kZWZhdWx0LmkuZGVmYXVsdC5leHRlbmQua25vd25Gb3JUeXBlKToKKyAg
ICAgICAgKGUuZGVmYXVsdC5pLmRlZmF1bHQuZXh0ZW5kLnRyYW5zbGF0ZVRvQ29udGFpbmVyRnVs
bG5hbWUpOgorICAgICAgICAoZS5kZWZhdWx0LmEuZGVmYXVsdC5leHRlbmQuY2FuQ2F0YWxvZ0Vu
dHJpZXNCeVR5cGUpOgorICAgICAgICAoZS5kZWZhdWx0LmEuZGVmYXVsdC5leHRlbmQuY2F0YWxv
Z0VudHJpZXNCeVR5cGUpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQuaW5p
dCk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5nZXRGaWx0ZXJzKToKKyAg
ICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLnMpOgorICAgICAgICAoZS5kZWZhdWx0
Lm8uZGVmYXVsdC5leHRlbmQud2F0Y2hNb2RlbFR5cGVzKToKKyAgICAgICAgKGUuZGVmYXVsdC5v
LmRlZmF1bHQuZXh0ZW5kLl9uYW1lVG9DbGFzcyk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZh
dWx0LmV4dGVuZC5mKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLnApOgor
ICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQuaC53aWxsQ2hhbmdlKToKKyAgICAg
ICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLmkpOgorICAgICAgICAoZS5kZWZhdWx0Lm8u
ZGVmYXVsdC5leHRlbmQud2F0Y2hSZWNvcmRzKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1
bHQuZXh0ZW5kLndpbGxEZXN0cm95KToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0
ZW5kLmRldGVjdCk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5jb2x1bW5z
Rm9yVHlwZSk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5hKToKKyAgICAg
ICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLnMuZGlkQ2hhbmdlKToKKyAgICAgICAgKGUu
ZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLnMud2lsbENoYW5nZSk6CisgICAgICAgIChlLmRlZmF1
bHQuby5kZWZhdWx0LmV4dGVuZC51KToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0
ZW5kLm9ic2VydmVNb2RlbFR5cGUpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRl
bmQud3JhcE1vZGVsVHlwZSk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5n
ZXRNb2RlbFR5cGVzKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLl9nZXRP
YmplY3RzT25OYW1lc3BhY2VzKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5k
LmdldFJlY29yZHMpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQud3JhcFJl
Y29yZCk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5nZXRSZWNvcmRDb2x1
bW5WYWx1ZXMpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQuZ2V0UmVjb3Jk
S2V5d29yZHMpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQuZ2V0UmVjb3Jk
RmlsdGVyVmFsdWVzKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLmdldFJl
Y29yZENvbG9yKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLm9ic2VydmVS
ZWNvcmQpOgorICAgICAgICAobi50LmRlZmF1bHQuZXh0ZW5kLnJlY29tcHV0ZSk6CisgICAgICAg
IChhLmdldFNlbGYpOgorICAgICAgICAoYS5iaW5kU2VsZik6CisgICAgICAgIChhLnVwZGF0ZVNl
bGYpOgorICAgICAgICAoYS5nZXRCbG9jayk6CisgICAgICAgIChhLmhhc0Jsb2NrKToKKyAgICAg
ICAgKGEuYmluZEJsb2NrKToKKyAgICAgICAgKGEuZ2V0Q29tcG9uZW50KToKKyAgICAgICAgKGEu
YmluZENvbXBvbmVudCk6CisgICAgICAgIChhLmdldFZpZXcpOgorICAgICAgICAoYS5iaW5kVmll
dyk6CisgICAgICAgIChhLmdldEF0dHJzKToKKyAgICAgICAgKGEuYmluZEF0dHJzKToKKyAgICAg
ICAgKGEuaGFzTG9jYWwpOgorICAgICAgICAoYS5oYXNPd25Mb2NhbCk6CisgICAgICAgIChhLmdl
dExvY2FsKToKKyAgICAgICAgKGEuYmluZExvY2FsKToKKyAgICAgICAgKHMuZ2V0U2VsZik6Cisg
ICAgICAgIChzLmJpbmRTZWxmKToKKyAgICAgICAgKHMudXBkYXRlU2VsZik6CisgICAgICAgIChz
LmdldEJsb2NrKToKKyAgICAgICAgKHMuYmluZEJsb2NrKToKKyAgICAgICAgKHMuaGFzQmxvY2sp
OgorICAgICAgICAocy5nZXRDb21wb25lbnQpOgorICAgICAgICAocy5iaW5kQ29tcG9uZW50KToK
KyAgICAgICAgKHMuZ2V0Vmlldyk6CisgICAgICAgIChzLmJpbmRWaWV3KToKKyAgICAgICAgKHMu
Z2V0QXR0cnMpOgorICAgICAgICAocy5iaW5kQXR0cnMpOgorICAgICAgICAocy5oYXNMb2NhbCk6
CisgICAgICAgIChzLmhhc093bkxvY2FsKToKKyAgICAgICAgKHMuZ2V0TG9jYWwpOgorICAgICAg
ICAocy5iaW5kTG9jYWwpOgorICAgICAgICAoQy5pLmRlZmF1bHQuZXh0ZW5kLmluaXQpOgorICAg
ICAgICAoQy5pLmRlZmF1bHQuZXh0ZW5kLmNvbXB1dGUpOgorICAgICAgICAoZS5kZWZhdWx0KToK
KyAgICAgICAgKGUuZGVmYXVsdC5zZXR1cFN0YXRlKToKKyAgICAgICAgKGUuZGVmYXVsdC5yZW5k
ZXIpOgorICAgICAgICAoZi5yLmRlZmF1bHQuZXh0ZW5kLmluaXQpOgorICAgICAgICAoZi5yLmRl
ZmF1bHQuZXh0ZW5kLmtleSk6CisgICAgICAgIChmLnIuZGVmYXVsdC5leHRlbmQuY29tcHV0ZSk6
CisgICAgICAgIChmLnIuZGVmYXVsdC5leHRlbmQuc2V0VmFsdWUpOgorICAgICAgICAoZi5yLmRl
ZmF1bHQuZXh0ZW5kLnJldmFsaWRhdGUpOgorICAgICAgICAoZi5yLmRlZmF1bHQuZXh0ZW5kLl9j
bGVhck9ic2VydmVkT2JqZWN0KToKKyAgICAgICAgKGUuZGVmYXVsdC5yZXJlbmRlcik6CisgICAg
ICAgIChwLm4uZGVmYXVsdC5leHRlbmQuZi5pbml0KToKKyAgICAgICAgKHAubi5kZWZhdWx0LmV4
dGVuZC5mLnIudXBkYXRlKToKKyAgICAgICAgKHAubi5kZWZhdWx0LmV4dGVuZC5mLmNlbGwpOgor
ICAgICAgICAoZi5zLklOVk9LRSk6CisgICAgICAgIChoLmkuZGVmYXVsdC5leHRlbmQuaW5pdCk6
CisgICAgICAgIChoLmkuZGVmYXVsdC5leHRlbmQuY29tcHV0ZSk6CisgICAgICAgIChoLmkuZGVm
YXVsdC5leHRlbmQuc2V0VmFsdWUpOgorICAgICAgICAoZS5kZWZhdWx0LndpbGxSZW5kZXIpOgor
ICAgICAgICAoZS5kZWZhdWx0LmNoaWxkRW52KToKKyAgICAgICAgKGUuZGVmYXVsdC5pc1N0YWJs
ZSk6CisgICAgICAgIChlLmRlZmF1bHQuaXNFbXB0eSk6CisgICAgICAgIChvLnIuZGVmYXVsdC5l
eHRlbmQuaW5pdCk6CisgICAgICAgIChvLnIuZGVmYXVsdC5leHRlbmQudmFsdWUpOgorICAgICAg
ICAoby5yLmRlZmF1bHQuZXh0ZW5kLm5vdGlmeSk6CisgICAgICAgIChzLmRpZEluaXQpOgorICAg
ICAgICAocy53aWxsU2V0Q29udGVudCk6CisgICAgICAgIChhLmFkZERlc3RydWN0aW9uKToKKyAg
ICAgICAgKGEuY2xlYW51cCk6CisgICAgICAgIChhLmRpZFJlbmRlcik6CisgICAgICAgICh4KToK
KyAgICAgICAgKGguY3JlYXRlKToKKyAgICAgICAgKGgucHJvdG90eXBlLnJlbmRlcik6CisgICAg
ICAgIChoLnByb3RvdHlwZS5yZXJlbmRlcik6CisgICAgICAgIChoLnByb3RvdHlwZS5kZXN0cm95
KToKKyAgICAgICAgKG4udC5kZWZhdWx0LmV4dGVuZC5pbml0KToKKyAgICAgICAgKG4udC5kZWZh
dWx0LmV4dGVuZC5jb21wdXRlKToKKyAgICAgICAgKG4udC5kZWZhdWx0LmV4dGVuZC5kZWFjdGl2
YXRlKToKKyAgICAgICAgKGUuaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZS5hLmRlZmF1bHQuaGFzRE9N
LmwpOgorICAgICAgICAoc2V0IGcpOgorICAgICAgICAoZ2V0IGcpOgorICAgICAgICAoaS5idWls
ZCk6CisgICAgICAgIChpLnByb3RvdHlwZS5jaGlsZFdpdGhNZXRhKToKKyAgICAgICAgKGkucHJv
dG90eXBlLmNoaWxkV2l0aFZpZXcpOgorICAgICAgICAoaS5wcm90b3R5cGUuY2hpbGRXaXRoT3V0
bGV0U3RhdGUpOgorICAgICAgICAoZ2V0IHJldHVybik6CisgICAgICAgIChyZXR1cm4uYnVpbGRG
cmFnbWVudCk6CisgICAgICAgIChyZXR1cm4uYnVpbGRSZW5kZXJOb2Rlcyk6CisgICAgICAgIChl
KToKKyAgICAgICAgKHQuKToKKyAgICAgICAgKHQuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy4w
LnQuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcuU3RyaW5nLnByb3RvdHlwZS5odG1s
U2FmZSk6CisgICAgICAgIChsLnByb3RvdHlwZS5wcmVyZW5kZXJUb3BMZXZlbFZpZXcpOgorICAg
ICAgICAobC5wcm90b3R5cGUucmVuZGVyVG9wTGV2ZWxWaWV3KToKKyAgICAgICAgKGwucHJvdG90
eXBlLnJldmFsaWRhdGVUb3BMZXZlbFZpZXcpOgorICAgICAgICAobC5wcm90b3R5cGUuZGlzcGF0
Y2hMaWZlY3ljbGVIb29rcyk6CisgICAgICAgIChsLnByb3RvdHlwZS5lbnN1cmVWaWV3Tm90UmVu
ZGVyaW5nKToKKyAgICAgICAgKGMucHJvdG90eXBlLmFkZCk6CisgICAgICAgIChjLnByb3RvdHlw
ZS5oYXMpOgorICAgICAgICAoYy5wcm90b3R5cGUuY2xlYXIpOgorICAgICAgICAobC5wcm90b3R5
cGUuY2xlYXJSZW5kZXJlZFZpZXdzKToKKyAgICAgICAgKGwucHJvdG90eXBlLmFwcGVuZFRvKToK
KyAgICAgICAgKGwucHJvdG90eXBlLnJlcGxhY2VJbik6CisgICAgICAgIChsLnByb3RvdHlwZS5j
cmVhdGVFbGVtZW50KToKKyAgICAgICAgKGwucHJvdG90eXBlLmRpZENyZWF0ZUVsZW1lbnQpOgor
ICAgICAgICAobC5wcm90b3R5cGUud2lsbEluc2VydEVsZW1lbnQpOgorICAgICAgICAobC5wcm90
b3R5cGUuc2V0QXR0cnMpOgorICAgICAgICAobC5wcm90b3R5cGUuY29tcG9uZW50SW5pdEF0dHJz
KToKKyAgICAgICAgKGwucHJvdG90eXBlLmRpZEluc2VydEVsZW1lbnQpOgorICAgICAgICAobC5w
cm90b3R5cGUuZGlkVXBkYXRlKToKKyAgICAgICAgKGwucHJvdG90eXBlLmRpZFJlbmRlcik6Cisg
ICAgICAgIChsLnByb3RvdHlwZS51cGRhdGVBdHRycyk6CisgICAgICAgIChsLnByb3RvdHlwZS5j
b21wb25lbnRVcGRhdGVBdHRycyk6CisgICAgICAgIChsLnByb3RvdHlwZS53aWxsVXBkYXRlKToK
KyAgICAgICAgKGwucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUpOgorICAgICAgICAobC5w
cm90b3R5cGUud2lsbFJlbmRlcik6CisgICAgICAgIChsLnByb3RvdHlwZS5jb21wb25lbnRXaWxs
UmVuZGVyKToKKyAgICAgICAgKGwucHJvdG90eXBlLnJlcmVuZGVyKToKKyAgICAgICAgKGwucHJv
dG90eXBlLnJlbW92ZSk6CisgICAgICAgIChsLnByb3RvdHlwZS5yZW5kZXJFbGVtZW50UmVtb3Zh
bCk6CisgICAgICAgIChsLnByb3RvdHlwZS53aWxsUmVtb3ZlRWxlbWVudCk6CisgICAgICAgIChs
LnByb3RvdHlwZS53aWxsRGVzdHJveUVsZW1lbnQpOgorICAgICAgICAobC5wcm90b3R5cGUuZGlk
RGVzdHJveUVsZW1lbnQpOgorICAgICAgICAoZi5jcmVhdGUpOgorICAgICAgICAoZC5jcmVhdGUp
OgorICAgICAgICAoZi5wcm90b3R5cGUpOgorICAgICAgICAoZi5wcm90b3R5cGUud2lsbFdhdGNo
KToKKyAgICAgICAgKGYucHJvdG90eXBlLmRpZFVud2F0Y2gpOgorICAgICAgICAoZi5wcm90b3R5
cGUuc2V0dXApOgorICAgICAgICAoZi5wcm90b3R5cGUudGVhcmRvd24pOgorICAgICAgICAoZi5w
cm90b3R5cGUucmVhZE9ubHkpOgorICAgICAgICAoZi5wcm90b3R5cGUub25lV2F5KToKKyAgICAg
ICAgKGYucHJvdG90eXBlLmNvcHkpOgorICAgICAgICAoZi5wcm90b3R5cGUuZnJvbSk6CisgICAg
ICAgIChmLnByb3RvdHlwZS50byk6CisgICAgICAgIChmLnByb3RvdHlwZS50b1N0cmluZyk6Cisg
ICAgICAgIChmLnByb3RvdHlwZS5jb25uZWN0KToKKyAgICAgICAgKGYucHJvdG90eXBlLmRpc2Nv
bm5lY3QpOgorICAgICAgICAoZi5wcm90b3R5cGUuZnJvbURpZENoYW5nZSk6CisgICAgICAgIChm
LnByb3RvdHlwZS50b0RpZENoYW5nZSk6CisgICAgICAgIChmLnByb3RvdHlwZS5fc2NoZWR1bGVT
eW5jKToKKyAgICAgICAgKGYucHJvdG90eXBlLl9zeW5jKToKKyAgICAgICAgKGZyb20pOgorICAg
ICAgICAodG8pOgorICAgICAgICAoci5wcm90b3R5cGUuc2V0IGUpOgorICAgICAgICAoci5wcm90
b3R5cGUuZ2V0IGUpOgorICAgICAgICAoci5wcm90b3R5cGUucHVyZ2UpOgorICAgICAgICAodS5w
cm90b3R5cGUuYWRkKToKKyAgICAgICAgKHUucHJvdG90eXBlLnJlbW92ZSk6CisgICAgICAgICh1
LnByb3RvdHlwZS5yZXZhbGlkYXRlQWxsKToKKyAgICAgICAgKHUucHJvdG90eXBlLnJldmFsaWRh
dGUpOgorICAgICAgICAodS5wcm90b3R5cGUubm90aWZ5KToKKyAgICAgICAgKGQucHJvdG90eXBl
LnZhbHVlKToKKyAgICAgICAgKGQucHJvdG90eXBlLmRlc3Ryb3kpOgorICAgICAgICAoZC5wcm90
b3R5cGUuY29weSk6CisgICAgICAgIChkLnByb3RvdHlwZS5hZGQpOgorICAgICAgICAoZC5wcm90
b3R5cGUucmVtb3ZlKToKKyAgICAgICAgKGQucHJvdG90eXBlLmNoYWluKToKKyAgICAgICAgKGQu
cHJvdG90eXBlLnVuY2hhaW4pOgorICAgICAgICAoZC5wcm90b3R5cGUubm90aWZ5KToKKyAgICAg
ICAgKGQucHJvdG90eXBlLnBvcHVsYXRlQWZmZWN0ZWQpOgorICAgICAgICAoaC52b2xhdGlsZSk6
CisgICAgICAgIChoLnJlYWRPbmx5KToKKyAgICAgICAgKGgucHJvcGVydHkpOgorICAgICAgICAo
aC5tZXRhKToKKyAgICAgICAgKGguZGlkQ2hhbmdlKToKKyAgICAgICAgKGguX3Rocm93UmVhZE9u
bHlFcnJvcik6CisgICAgICAgIChoLmNsb2JiZXJTZXQpOgorICAgICAgICAoaC52b2xhdGlsZVNl
dCk6CisgICAgICAgIChoLnNldFdpdGhTdXNwZW5kKToKKyAgICAgICAgKGguX3NldCk6CisgICAg
ICAgIChoLnRlYXJkb3duKToKKyAgICAgICAgKHAucmVtb3ZlKToKKyAgICAgICAgKGMuZS50KToK
KyAgICAgICAgKHQuZ2V0IHQpOgorICAgICAgICAodC5zZXQgdCk6CisgICAgICAgIChuLnRvU3Ry
aW5nKToKKyAgICAgICAgKGYuYXNzZXJ0KToKKyAgICAgICAgKGYuaW5mbyk6CisgICAgICAgIChm
Lndhcm4pOgorICAgICAgICAoZi5kZWJ1Zyk6CisgICAgICAgIChmLmRlcHJlY2F0ZSk6CisgICAg
ICAgIChmLmRlcHJlY2F0ZUZ1bmMpOgorICAgICAgICAoZi5ydW5JbkRlYnVnKToKKyAgICAgICAg
KGYuZGVidWdTZWFsKToKKyAgICAgICAgKG8uYSk6CisgICAgICAgIChvLnNldCBlKToKKyAgICAg
ICAgKHIuZGVmYXVsdC5EZWJ1Zy5yZWdpc3RlckRlcHJlY2F0aW9uSGFuZGxlcik6CisgICAgICAg
IChyLmRlZmF1bHQuRGVidWcucmVnaXN0ZXJXYXJuSGFuZGxlcik6CisgICAgICAgIChyZXR1cm4u
dC50LmJpbmQuZSk6CisgICAgICAgIChlLmZsYWdnZWRJbnN0cnVtZW50LmMpOgorICAgICAgICAo
bi5wcm90b3R5cGUuX2dldExpYnJhcnlCeU5hbWUpOgorICAgICAgICAobi5wcm90b3R5cGUucmVn
aXN0ZXIpOgorICAgICAgICAobi5wcm90b3R5cGUucmVnaXN0ZXJDb3JlTGlicmFyeSk6CisgICAg
ICAgIChuLnByb3RvdHlwZS5kZVJlZ2lzdGVyKToKKyAgICAgICAgKGkuZS5uLnN0cmluZ19hcHBl
YXJlZF9oZXJlLnR5cGVvZi5pLmFwcGx5Lm4pOgorICAgICAgICAoaS5lLm4pOgorICAgICAgICAo
dS5jcmVhdGUpOgorICAgICAgICAodS5wcm90b3R5cGUuY2xlYXIpOgorICAgICAgICAodS5wcm90
b3R5cGUuZGVsZXRlKToKKyAgICAgICAgKHUucHJvdG90eXBlLmlzRW1wdHkpOgorICAgICAgICAo
dS5wcm90b3R5cGUuZm9yRWFjaCk6CisgICAgICAgICh1LnByb3RvdHlwZS50b0FycmF5KToKKyAg
ICAgICAgKHUucHJvdG90eXBlLmNvcHkpOgorICAgICAgICAobC5jcmVhdGUpOgorICAgICAgICAo
bC5wcm90b3R5cGUuZ2V0IGUpOgorICAgICAgICAobC5wcm90b3R5cGUuc2V0IGUpOgorICAgICAg
ICAobC5wcm90b3R5cGUuZGVsZXRlKToKKyAgICAgICAgKGwucHJvdG90eXBlLmhhcyk6CisgICAg
ICAgIChsLnByb3RvdHlwZS4wLnRoaXMuc2l6ZS50KToKKyAgICAgICAgKGwucHJvdG90eXBlLmZv
ckVhY2gpOgorICAgICAgICAobC5wcm90b3R5cGUuY29weSk6CisgICAgICAgIChjLmNyZWF0ZSk6
CisgICAgICAgIChjLnByb3RvdHlwZS5jb3B5KToKKyAgICAgICAgKHQudC5wcm90b3R5cGUuc3Ry
aW5nX2FwcGVhcmVkX2hlcmUubik6CisgICAgICAgICh0LnQucHJvdG90eXBlLnN0cmluZ19hcHBl
YXJlZF9oZXJlLmkpOgorICAgICAgICAobi5wcm90b3R5cGUuX2dldE9yQ3JlYXRlT3duTWFwKToK
KyAgICAgICAgKG4ucHJvdG90eXBlLl9nZXRJbmhlcml0ZWQpOgorICAgICAgICAobi5wcm90b3R5
cGUuX2ZpbmRJbmhlcml0ZWQpOgorICAgICAgICAobi5wcm90b3R5cGUuX2ZvckVhY2hJbik6Cisg
ICAgICAgIChpLmFkZFRvTGlzdGVuZXJzKToKKyAgICAgICAgKGkuX2ZpbmFsaXplTGlzdGVuZXJz
KToKKyAgICAgICAgKGkucmVtb3ZlRnJvbUxpc3RlbmVycyk6CisgICAgICAgIChpLm1hdGNoaW5n
TGlzdGVuZXJzKToKKyAgICAgICAgKGkuc3VzcGVuZExpc3RlbmVycyk6CisgICAgICAgIChpLndh
dGNoZWRFdmVudHMpOgorICAgICAgICAoaS5faW5pdGlhbGl6ZUxpc3RlbmVycyk6CisgICAgICAg
IChUKToKKyAgICAgICAgKHIubik6CisgICAgICAgIChyLmkpOgorICAgICAgICAoei5hKToKKyAg
ICAgICAgKFUuYSk6CisgICAgICAgIChNLmFwcGx5UGFydGlhbCk6CisgICAgICAgIChNLmNyZWF0
ZSk6CisgICAgICAgIChHLnJlb3Blbik6CisgICAgICAgIChHLmFwcGx5KToKKyAgICAgICAgKEcu
YXBwbHlQYXJ0aWFsKToKKyAgICAgICAgKEcudG9TdHJpbmcpOgorICAgICAgICAoRy5kZXRlY3Qp
OgorICAgICAgICAoRy53aXRob3V0KToKKyAgICAgICAgKEcua2V5cyk6CisgICAgICAgIChNLm1p
eGlucyk6CisgICAgICAgIChXLnRvU3RyaW5nKToKKyAgICAgICAgKG4ucHJvdG90eXBlLmNsZWFy
KToKKyAgICAgICAgKGEuZS50KToKKyAgICAgICAgKHUuZS50KToKKyAgICAgICAgKHQucmV0dXJu
LnRoaXMuX3N1cGVyLmdldCBlKToKKyAgICAgICAgKGMucHJvdG90eXBlKToKKyAgICAgICAgKGMu
cHJvdG90eXBlLl9zdXBlci5nZXQgbCk6CisgICAgICAgIChsLnByb3RvdHlwZSk6CisgICAgICAg
ICh1LmpvaW4pOgorICAgICAgICAodS5iaW5kKToKKyAgICAgICAgKHUuYmVnaW4pOgorICAgICAg
ICAodS5lbmQpOgorICAgICAgICAodS5zY2hlZHVsZSk6CisgICAgICAgICh1Lmhhc1NjaGVkdWxl
ZFRpbWVycyk6CisgICAgICAgICh1LmNhbmNlbFRpbWVycyk6CisgICAgICAgICh1LnN5bmMpOgor
ICAgICAgICAodS5sYXRlcik6CisgICAgICAgICh1Lm9uY2UpOgorICAgICAgICAodS5zY2hlZHVs
ZU9uY2UpOgorICAgICAgICAodS5uZXh0KToKKyAgICAgICAgKHUuY2FuY2VsKToKKyAgICAgICAg
KHUuZGVib3VuY2UpOgorICAgICAgICAodS50aHJvdHRsZSk6CisgICAgICAgICh1Ll9hZGRRdWV1
ZSk6CisgICAgICAgIChzdWJzY3JpYmUpOgorICAgICAgICAodW5zdWJzY3JpYmUpOgorICAgICAg
ICAocmVwbGFjZSk6CisgICAgICAgIChnZXRWYWx1ZSk6CisgICAgICAgIChzZXRWYWx1ZSk6Cisg
ICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0LmV4dGVuZC5jb21wdXRlKToKKyAgICAgICAgKGUu
ZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5kLnNldFZhbHVlKToKKyAgICAgICAgKGUuZGVmYXVsdC5v
LmRlZmF1bHQuZXh0ZW5kLnNldFNvdXJjZSk6CisgICAgICAgIChlLmRlZmF1bHQuby5kZWZhdWx0
LmV4dGVuZC5yZXZhbGlkYXRlKToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0ZW5k
Ll9jbGVhck9ic2VydmVkT2JqZWN0KToKKyAgICAgICAgKGUuZGVmYXVsdC5vLmRlZmF1bHQuZXh0
ZW5kLmRlYWN0aXZhdGUpOgorICAgICAgICAobi5yLmRlZmF1bHQuZXh0ZW5kLmluaXQpOgorICAg
ICAgICAobi5yLmRlZmF1bHQuZXh0ZW5kLmNvbXB1dGUpOgorICAgICAgICAobi5yLmRlZmF1bHQu
ZXh0ZW5kLnNldFZhbHVlKToKKyAgICAgICAgKG4uci5kZWZhdWx0LmV4dGVuZC5zZXRTb3VyY2Up
OgorICAgICAgICAoZC5wcm90b3R5cGUuX2luaXQpOgorICAgICAgICAoZC5wcm90b3R5cGUuX21h
a2VDaGlsZFN0cmVhbSk6CisgICAgICAgIChkLnByb3RvdHlwZS5yZW1vdmVDaGlsZCk6CisgICAg
ICAgIChkLnByb3RvdHlwZS5nZXRLZXkpOgorICAgICAgICAoZC5wcm90b3R5cGUuZ2V0IGUpOgor
ICAgICAgICAoZC5wcm90b3R5cGUuYWRkTXV0YWJsZURlcGVuZGVuY3kpOgorICAgICAgICAoZC5w
cm90b3R5cGUuYWRkRGVwZW5kZW5jeSk6CisgICAgICAgIChkLnByb3RvdHlwZS5zdWJzY3JpYmVE
ZXBlbmRlbmNpZXMpOgorICAgICAgICAoZC5wcm90b3R5cGUudW5zdWJzY3JpYmVEZXBlbmRlbmNp
ZXMpOgorICAgICAgICAoZC5wcm90b3R5cGUubWF5YmVEZWFjdGl2YXRlKToKKyAgICAgICAgKGQu
cHJvdG90eXBlLmFjdGl2YXRlKToKKyAgICAgICAgKGQucHJvdG90eXBlLnJldmFsaWRhdGUpOgor
ICAgICAgICAoZC5wcm90b3R5cGUuX2NsZWFyT2JzZXJ2ZWRQcm94eSk6CisgICAgICAgIChkLnBy
b3RvdHlwZS5kZWFjdGl2YXRlKToKKyAgICAgICAgKGQucHJvdG90eXBlLmNvbXB1dGUpOgorICAg
ICAgICAoZC5wcm90b3R5cGUuc2V0VmFsdWUpOgorICAgICAgICAoZC5wcm90b3R5cGUubm90aWZ5
RXhjZXB0KToKKyAgICAgICAgKGQucHJvdG90eXBlLnN1YnNjcmliZSk6CisgICAgICAgIChkLnBy
b3RvdHlwZS5wcnVuZSk6CisgICAgICAgIChkLnByb3RvdHlwZS51bnN1YnNjcmliZSk6CisgICAg
ICAgIChkLnByb3RvdHlwZS5ub3RpZnlTdWJzY3JpYmVycyk6CisgICAgICAgIChkLmV4dGVuZCk6
CisgICAgICAgIChnLmQuZXh0ZW5kLmluaXQpOgorICAgICAgICAoZy5kLmV4dGVuZC5jb21wdXRl
KToKKyAgICAgICAgKHJlbW92ZUZyb20pOgorICAgICAgICAoeC5yLmRlZmF1bHQuZXh0ZW5kLmlu
aXQpOgorICAgICAgICAoeC5yLmRlZmF1bHQuZXh0ZW5kLmxhYmVsKToKKyAgICAgICAgKHguci5k
ZWZhdWx0LmV4dGVuZC5jb21wdXRlKToKKyAgICAgICAgKGkudSk6CisgICAgICAgIChpLmUubWFy
a09iamVjdEFzRGlydHkubCk6CisgICAgICAgIChlbHNlLmUubWFya09iamVjdEFzRGlydHkubCk6
CisgICAgICAgICh0LnIpOgorICAgICAgICAoby5wcm90b3R5cGUpOgorICAgICAgICAoby5wcm90
b3R5cGUuaGFzKToKKyAgICAgICAgKG8ucHJvdG90eXBlLmRlbGV0ZSk6CisgICAgICAgIChlLmRl
ZmF1bHQuZS5jbGVhbnVwKToKKyAgICAgICAgKGYucHVzaC4pOgorICAgICAgICAoZi5wdXNoKToK
KyAgICAgICAgKGwucmVnaXN0ZXJBY3Rpb24pOgorICAgICAgICAobC51bnJlZ2lzdGVyQWN0aW9u
KToKKyAgICAgICAgKGQucHJvdG90eXBlKToKKyAgICAgICAgKHYudS5kZWZhdWx0LmV4dGVuZCk6
CisgICAgICAgICh2LnUuZGVmYXVsdC5leHRlbmQuKToKKyAgICAgICAgKHNldCBnZXQgdi50b1N0
cmluZyk6CisgICAgICAgIChzZXQgZ2V0IHYpOgorICAgICAgICAobi50LmRlZmF1bHQuZXh0ZW5k
KToKKyAgICAgICAgKHIuZGVmYXVsdC5yZW9wZW4pOgorICAgICAgICAoZS5kZWZhdWx0LmNyZWF0
ZSk6CisgICAgICAgIChlLmRlZmF1bHQuX2dldEhhc2gpOgorICAgICAgICAoZS5kZWZhdWx0LmEu
ZGVmYXVsdC5leHRlbmQpOgorICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQpOgor
ICAgICAgICAoZS5kZWZhdWx0Lm8uZGVmYXVsdC5leHRlbmQuKToKKyAgICAgICAgKGUuZGVmYXVs
dC5pLmRlZmF1bHQuZXh0ZW5kKToKKyAgICAgICAgKGUuZGVmYXVsdC5pLmRlZmF1bHQuZXh0ZW5k
Lik6CisgICAgICAgIChvLmdldCByZXR1cm4pOgorICAgICAgICAoby4pOgorICAgICAgICAqIFNw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Jvd2VyLmpzb246IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJl
ci1kYXRhL2VtYmVyLWRhdGEuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9u
ZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3JhZ2VfYWRhcHRlci5qczog
UmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyL2VtYmVyLmpzOiBS
ZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGVi
YXJzLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2px
dWVyeS5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMt
Y29tbW9uL2Jhc2UuY3NzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMv
dG9kb212Yy1jb21tb24vYmFzZS5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2JnLnBuZzogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9jcm9z
c2RvbWFpbi54bWw6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2luZGV4Lmh0bWw6CisgICAgICAgICog
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvanMvYXBwLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9f
Y29udHJvbGxlci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2Rv
c19jb250cm9sbGVyLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2hlbHBlcnMvcGx1cmFs
aXplLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzOiBSZW1vdmVk
LgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2pzL3JvdXRlci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92
aWV3cy9lZGl0X3RvZG9fdmlldy5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy90
b2Rvc192aWV3LmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JlYWRtZS5tZDogUmVtb3ZlZC4K
KyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9yb2JvdHMudHh0OiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmJv
d2VycmM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uZWRpdG9yY29uZmlnOiBBZGRlZC4K
KyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvLmVtYmVyLWNsaTogQWRkZWQuCisgICAgICAgICogU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlLy5naXRpZ25vcmU6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uanNoaW50cmM6IEFk
ZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8udHJhdmlzLnltbDogQWRkZWQuCisgICAgICAgICog
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlLy53YXRjaG1hbmNvbmZpZzogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL1JF
QURNRS5tZDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9hcHAuanM6IEFkZGVkLgor
ICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29tcG9uZW50cy8uZ2l0a2VlcDogQWRkZWQuCisgICAg
ICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3RvZG8taXRlbS5qczogQWRkZWQuCisgICAg
ICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5Db21wb25lbnQuZXh0ZW5kLmFjdGlvbnMuc3RhcnRF
ZGl0aW5nKToKKyAgICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVyLkNvbXBvbmVudC5leHRlbmQu
YWN0aW9ucy5kb25lRWRpdGluZyk6CisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5Db21w
b25lbnQuZXh0ZW5kLmFjdGlvbnMuaGFuZGxlS2V5ZG93bik6CisgICAgICAgIChleHBvcnQuZGVm
YXVsdC5FbWJlci5Db21wb25lbnQuZXh0ZW5kLmFjdGlvbnMudG9nZ2xlQ29tcGxldGVkKToKKyAg
ICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVyLkNvbXBvbmVudC5leHRlbmQuYWN0aW9ucy5yZW1v
dmVUb2RvKToKKyAgICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVyLkNvbXBvbmVudC5leHRlbmQu
Zm9jdXNJbnB1dCk6CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3RvZG8tbGlz
dC5qczogQWRkZWQuCisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5Db21wb25lbnQuZXh0
ZW5kLmFjdGlvbnMuZW5hYmxlVG9nZ2xlKToKKyAgICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVy
LkNvbXBvbmVudC5leHRlbmQuYWN0aW9ucy5kaXNhYmxlVG9nZ2xlKToKKyAgICAgICAgKGV4cG9y
dC5kZWZhdWx0LkVtYmVyLkNvbXBvbmVudC5leHRlbmQuYWN0aW9ucy50b2dnbGVBbGwpOgorICAg
ICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvY29udHJvbGxlcnMvYWN0aXZlLmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpzOiBBZGRlZC4KKyAg
ICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kLmFjdGlvbnMuY3Jl
YXRlVG9kbyk6CisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5Db250cm9sbGVyLmV4dGVu
ZC5hY3Rpb25zLmNsZWFyQ29tcGxldGVkKToKKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRy
b2xsZXJzL2NvbXBsZXRlZC5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9oZWxw
ZXJzL2d0LmpzOiBBZGRlZC4KKyAgICAgICAgKGV4cG9ydC5ndCk6CisgICAgICAgICogU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9oZWxwZXJzL3BsdXJhbGl6ZS5qczogQWRkZWQuCisgICAgICAgIChleHBvcnQucGx1
cmFsaXplSGVscGVyKToKKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luZGV4Lmh0bWw6IEFkZGVk
LgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5zdGFuY2UtaW5pdGlhbGl6ZXJzL2dsb2JhbC5q
czogQWRkZWQuCisgICAgICAgIChleHBvcnQuaW5pdGlhbGl6ZSk6CisgICAgICAgICogU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9tb2RlbHMvLmdpdGtlZXA6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
cmVzb2x2ZXIuanM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVyLmpzOiBB
ZGRlZC4KKyAgICAgICAgKFJvdXRlci5tYXApOgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91
dGVzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy9hcHBs
aWNhdGlvbi5qczogQWRkZWQuCisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5Sb3V0ZS5l
eHRlbmQubW9kZWwpOgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvc2VydmljZXMvcmVwby5qczog
QWRkZWQuCisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5TZXJ2aWNlLmV4dGVuZC5maW5k
QWxsKToKKyAgICAgICAgKGV4cG9ydC5kZWZhdWx0LkVtYmVyLlNlcnZpY2UuZXh0ZW5kLmFkZCk6
CisgICAgICAgIChleHBvcnQuZGVmYXVsdC5FbWJlci5TZXJ2aWNlLmV4dGVuZC5kZWxldGUpOgor
ICAgICAgICAoZXhwb3J0LmRlZmF1bHQuRW1iZXIuU2VydmljZS5leHRlbmQucGVyc2lzdCk6Cisg
ICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9zdHlsZXMvYXBwLmNzczogQWRkZWQuCisgICAgICAgICog
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlL2FwcC90ZW1wbGF0ZXMvYWN0aXZlLmhiczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzOiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wbGV0ZWQuaGJzOiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8taXRlbS5oYnM6IEFk
ZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1s
aXN0LmhiczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvaW5kZXgu
aGJzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYm93ZXIuanNvbjogQWRkZWQuCisgICAg
ICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2NvbmZpZy9lbnZpcm9ubWVudC5qczogQWRkZWQuCisgICAgICAgICht
b2R1bGUuZXhwb3J0cyk6CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2VtYmVyLWNsaS1idWlsZC5qczog
QWRkZWQuCisgICAgICAgIChtb2R1bGUuZXhwb3J0cyk6CisgICAgICAgICogU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Bh
Y2thZ2UuanNvbjogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3B1YmxpYy9jcm9zc2RvbWFp
bi54bWw6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wdWJsaWMvcm9ib3RzLnR4dDogQWRk
ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RlbS5qczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL3ZlbmRvci8uZ2l0a2VlcDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3ZlbmRv
ci9iYXNlLmNzczogQWRkZWQuCisgICAgICAgIChocik6CisgICAgICAgICgubGVhcm4gYSk6Cisg
ICAgICAgICgubGVhcm4gYTpob3Zlcik6CisgICAgICAgICgubGVhcm4gaDMsKToKKyAgICAgICAg
KC5sZWFybiBoMyk6CisgICAgICAgICgubGVhcm4gaDQpOgorICAgICAgICAoLmxlYXJuIGg1KToK
KyAgICAgICAgKC5sZWFybiB1bCk6CisgICAgICAgICgubGVhcm4gbGkpOgorICAgICAgICAoLmxl
YXJuIHApOgorICAgICAgICAoI2lzc3VlLWNvdW50KToKKyAgICAgICAgKC5xdW90ZSk6CisgICAg
ICAgICgucXVvdGUgcCk6CisgICAgICAgICgucXVvdGUgcDpiZWZvcmUpOgorICAgICAgICAoLnF1
b3RlIHA6YWZ0ZXIpOgorICAgICAgICAoLnF1b3RlIGZvb3Rlcik6CisgICAgICAgICgucXVvdGUg
Zm9vdGVyIGltZyk6CisgICAgICAgICgucXVvdGUgZm9vdGVyIGEpOgorICAgICAgICAoLnNwZWVj
aC1idWJibGUpOgorICAgICAgICAoLnNwZWVjaC1idWJibGU6YWZ0ZXIpOgorICAgICAgICAoLmxl
YXJuLWJhciA+IC5sZWFybik6CisgICAgICAgIChAbWVkaWEgKG1pbi13aWR0aDogODk5cHgpKToK
KyAgICAgICAgKC5sZWFybi1iYXIpOgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvaW5kZXgu
Y3NzOiBBZGRlZC4KKyAgICAgICAgKGh0bWwsKToKKyAgICAgICAgKGJ1dHRvbik6CisgICAgICAg
IChib2R5KToKKyAgICAgICAgKGJ1dHRvbiwpOgorICAgICAgICAoLmhpZGRlbik6CisgICAgICAg
ICgjdG9kb2FwcCk6CisgICAgICAgICgjdG9kb2FwcCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFj
ZWhvbGRlcik6CisgICAgICAgICgjdG9kb2FwcCBpbnB1dDo6LW1vei1wbGFjZWhvbGRlcik6Cisg
ICAgICAgICgjdG9kb2FwcCBpbnB1dDo6aW5wdXQtcGxhY2Vob2xkZXIpOgorICAgICAgICAoI3Rv
ZG9hcHAgaDEpOgorICAgICAgICAoI25ldy10b2RvLCk6CisgICAgICAgICgjbmV3LXRvZG8pOgor
ICAgICAgICAoI21haW4pOgorICAgICAgICAobGFiZWxbZm9yPSd0b2dnbGUtYWxsJ10pOgorICAg
ICAgICAoI3RvZ2dsZS1hbGwpOgorICAgICAgICAoI3RvZ2dsZS1hbGw6YmVmb3JlKToKKyAgICAg
ICAgKCN0b2dnbGUtYWxsOmNoZWNrZWQ6YmVmb3JlKToKKyAgICAgICAgKCN0b2RvLWxpc3QpOgor
ICAgICAgICAoI3RvZG8tbGlzdCBsaSk6CisgICAgICAgICgjdG9kby1saXN0IGxpOmxhc3QtY2hp
bGQpOgorICAgICAgICAoI3RvZG8tbGlzdCBsaS5lZGl0aW5nKToKKyAgICAgICAgKCN0b2RvLWxp
c3QgbGkuZWRpdGluZyAuZWRpdCk6CisgICAgICAgICgjdG9kby1saXN0IGxpLmVkaXRpbmcgLnZp
ZXcpOgorICAgICAgICAoI3RvZG8tbGlzdCBsaSAudG9nZ2xlKToKKyAgICAgICAgKCN0b2RvLWxp
c3QgbGkgLnRvZ2dsZTphZnRlcik6CisgICAgICAgICgjdG9kby1saXN0IGxpIC50b2dnbGU6Y2hl
Y2tlZDphZnRlcik6CisgICAgICAgICgjdG9kby1saXN0IGxpIGxhYmVsKToKKyAgICAgICAgKCN0
b2RvLWxpc3QgbGkuY29tcGxldGVkIGxhYmVsKToKKyAgICAgICAgKCN0b2RvLWxpc3QgbGkgLmRl
c3Ryb3kpOgorICAgICAgICAoI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3Zlcik6CisgICAgICAg
ICgjdG9kby1saXN0IGxpIC5kZXN0cm95OmFmdGVyKToKKyAgICAgICAgKCN0b2RvLWxpc3QgbGk6
aG92ZXIgLmRlc3Ryb3kpOgorICAgICAgICAoI3RvZG8tbGlzdCBsaSAuZWRpdCk6CisgICAgICAg
ICgjdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZCk6CisgICAgICAgICgjZm9vdGVyKToK
KyAgICAgICAgKCNmb290ZXI6YmVmb3JlKToKKyAgICAgICAgKCN0b2RvLWNvdW50KToKKyAgICAg
ICAgKCN0b2RvLWNvdW50IHN0cm9uZyk6CisgICAgICAgICgjZmlsdGVycyk6CisgICAgICAgICgj
ZmlsdGVycyBsaSk6CisgICAgICAgICgjZmlsdGVycyBsaSBhKToKKyAgICAgICAgKCNmaWx0ZXJz
IGxpIGEuc2VsZWN0ZWQsKToKKyAgICAgICAgKCNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQpOgorICAg
ICAgICAoI2NsZWFyLWNvbXBsZXRlZCwpOgorICAgICAgICAoI2NsZWFyLWNvbXBsZXRlZDpob3Zl
cik6CisgICAgICAgICgjaW5mbyk6CisgICAgICAgICgjaW5mbyBwKToKKyAgICAgICAgKCNpbmZv
IGEpOgorICAgICAgICAoI2luZm8gYTpob3Zlcik6CisgICAgICAgIChAbWVkaWEgc2NyZWVuIGFu
ZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApKToKKyAgICAgICAgKCN0b2dnbGUt
YWxsLCk6CisgICAgICAgIChAbWVkaWEgKG1heC13aWR0aDogNDMwcHgpKToKKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy90ZXN0Lmh0bWw6IFJlbW92ZWQuCisKIDIwMTctMDQtMjUgIE15bGVzIEMuIE1heGZpZWxkICA8
bW1heGZpZWxkQGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQgcGVyZm9ybWFuY2UgdGVzdCBmb3Ig
Rm9udENhY2hlOjpzeXN0ZW1GYWxsYmFja0ZvckNoYXJhY3RlcnMoKQpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy1kNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThl
Y2Y4NDI3ZS5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLWQ0MWQ4Y2Q5
OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQz
NGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Fzc2V0cy90b2RvbXZjLWZkZDJjNDhjZjY3NTc1M2RlNGE3OWM4NTczNDNlMjNmLmpzIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy1mZGQyYzQ4Y2Y2NzU3NTNkZTRhNzljODU3
MzQzZTIzZi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMTQzNjJmNTYxNzAyZjU2Y2Y3YWQwY2MyMDM2ZWJmMmNl
OTU0ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9k
b212Yy1mZGQyYzQ4Y2Y2NzU3NTNkZTRhNzljODU3MzQzZTIzZi5qcwpAQCAtMCwwICsxIEBACisi
dXNlIHN0cmljdCI7ZGVmaW5lKCJ0b2RvbXZjL2FwcCIsWyJleHBvcnRzIiwiZW1iZXIiLCJ0b2Rv
bXZjL3Jlc29sdmVyIiwiZW1iZXItbG9hZC1pbml0aWFsaXplcnMiLCJ0b2RvbXZjL2NvbmZpZy9l
bnZpcm9ubWVudCJdLGZ1bmN0aW9uKGUsdCxuLHIsYSl7dmFyIG89dm9pZCAwO3QuZGVmYXVsdC5N
T0RFTF9GQUNUT1JZX0lOSkVDVElPTlM9ITAsd2luZG93LkFwcD1vPXQuZGVmYXVsdC5BcHBsaWNh
dGlvbi5leHRlbmQoe21vZHVsZVByZWZpeDphLmRlZmF1bHQubW9kdWxlUHJlZml4LHBvZE1vZHVs
ZVByZWZpeDphLmRlZmF1bHQucG9kTW9kdWxlUHJlZml4LFJlc29sdmVyOm4uZGVmYXVsdH0pLCgw
LHIuZGVmYXVsdCkobyxhLmRlZmF1bHQubW9kdWxlUHJlZml4KSxlLmRlZmF1bHQ9b30pLGRlZmlu
ZSgidG9kb212Yy9jb21wb25lbnRzL2FwcC12ZXJzaW9uIixbImV4cG9ydHMiLCJlbWJlci1jbGkt
YXBwLXZlcnNpb24vY29tcG9uZW50cy9hcHAtdmVyc2lvbiIsInRvZG9tdmMvY29uZmlnL2Vudmly
b25tZW50Il0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4uZGVmYXVsdC5BUFAubmFtZSxhPW4uZGVm
YXVsdC5BUFAudmVyc2lvbjtlLmRlZmF1bHQ9dC5kZWZhdWx0LmV4dGVuZCh7dmVyc2lvbjphLG5h
bWU6cn0pfSksZGVmaW5lKCJ0b2RvbXZjL2NvbXBvbmVudHMvdG9kby1pdGVtIixbImV4cG9ydHMi
LCJlbWJlciJdLGZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQuZGVmYXVsdC5Db21wb25lbnQuZXh0
ZW5kKHtyZXBvOnQuZGVmYXVsdC5pbmplY3Quc2VydmljZSgpLHRhZ05hbWU6ImxpIixlZGl0aW5n
OiExLGNsYXNzTmFtZUJpbmRpbmdzOlsidG9kby5jb21wbGV0ZWQiLCJlZGl0aW5nIl0sYWN0aW9u
czp7c3RhcnRFZGl0aW5nOmZ1bmN0aW9uKCl7dGhpcy5nZXQoIm9uU3RhcnRFZGl0IikoKSx0aGlz
LnNldCgiZWRpdGluZyIsITApLHQuZGVmYXVsdC5ydW4uc2NoZWR1bGVPbmNlKCJhZnRlclJlbmRl
ciIsdGhpcywiZm9jdXNJbnB1dCIpfSxkb25lRWRpdGluZzpmdW5jdGlvbihlKXt0aGlzLmdldCgi
ZWRpdGluZyIpJiYodC5kZWZhdWx0LmlzQmxhbmsoZSk/dGhpcy5zZW5kKCJyZW1vdmVUb2RvIik6
KHRoaXMuc2V0KCJ0b2RvLnRpdGxlIixlLnRyaW0oKSksdGhpcy5zZXQoImVkaXRpbmciLCExKSx0
aGlzLmdldCgib25FbmRFZGl0IikoKSkpfSxoYW5kbGVLZXlkb3duOmZ1bmN0aW9uKGUpezEzPT09
ZS5rZXlDb2RlP2UudGFyZ2V0LmJsdXIoKToyNz09PWUua2V5Q29kZSYmdGhpcy5zZXQoImVkaXRp
bmciLCExKX0sdG9nZ2xlQ29tcGxldGVkOmZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0KCJ0b2Rv
Iik7dC5kZWZhdWx0LnNldChuLCJjb21wbGV0ZWQiLGUudGFyZ2V0LmNoZWNrZWQpLHRoaXMuZ2V0
KCJyZXBvIikucGVyc2lzdCgpfSxyZW1vdmVUb2RvOmZ1bmN0aW9uKCl7dGhpcy5nZXQoInJlcG8i
KS5kZWxldGUodGhpcy5nZXQoInRvZG8iKSl9fSxmb2N1c0lucHV0OmZ1bmN0aW9uKCl7dGhpcy5l
bGVtZW50LnF1ZXJ5U2VsZWN0b3IoImlucHV0LmVkaXQiKS5mb2N1cygpfX0pfSksZGVmaW5lKCJ0
b2RvbXZjL2NvbXBvbmVudHMvdG9kby1saXN0IixbImV4cG9ydHMiLCJlbWJlciJdLGZ1bmN0aW9u
KGUsdCl7ZS5kZWZhdWx0PXQuZGVmYXVsdC5Db21wb25lbnQuZXh0ZW5kKHtyZXBvOnQuZGVmYXVs
dC5pbmplY3Quc2VydmljZSgpLHRhZ05hbWU6InNlY3Rpb24iLGVsZW1lbnRJZDoibWFpbiIsY2Fu
VG9nZ2xlOiEwLGFsbENvbXBsZXRlZDp0LmRlZmF1bHQuY29tcHV0ZWQoInRvZG9zLkBlYWNoLmNv
bXBsZXRlZCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoInRvZG9zIikuaXNFdmVyeSgiY29t
cGxldGVkIil9KSxhY3Rpb25zOntlbmFibGVUb2dnbGU6ZnVuY3Rpb24oKXt0aGlzLnNldCgiY2Fu
VG9nZ2xlIiwhMCl9LGRpc2FibGVUb2dnbGU6ZnVuY3Rpb24oKXt0aGlzLnNldCgiY2FuVG9nZ2xl
IiwhMSl9LHRvZ2dsZUFsbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0KCJhbGxDb21wbGV0ZWQi
KTt0aGlzLmdldCgidG9kb3MiKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiB0LmRlZmF1bHQu
c2V0KG4sImNvbXBsZXRlZCIsIWUpfSksdGhpcy5nZXQoInJlcG8iKS5wZXJzaXN0KCl9fX0pfSks
ZGVmaW5lKCJ0b2RvbXZjL2NvbnRyb2xsZXJzL2FjdGl2ZSIsWyJleHBvcnRzIiwiZW1iZXIiXSxm
dW5jdGlvbihlLHQpe2UuZGVmYXVsdD10LmRlZmF1bHQuQ29udHJvbGxlci5leHRlbmQoe3RvZG9z
OnQuZGVmYXVsdC5jb21wdXRlZC5maWx0ZXJCeSgibW9kZWwiLCJjb21wbGV0ZWQiLCExKX0pfSks
ZGVmaW5lKCJ0b2RvbXZjL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uIixbImV4cG9ydHMiLCJlbWJl
ciJdLGZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQuZGVmYXVsdC5Db250cm9sbGVyLmV4dGVuZCh7
cmVwbzp0LmRlZmF1bHQuaW5qZWN0LnNlcnZpY2UoKSxyZW1haW5pbmc6dC5kZWZhdWx0LmNvbXB1
dGVkLmZpbHRlckJ5KCJtb2RlbCIsImNvbXBsZXRlZCIsITEpLGNvbXBsZXRlZDp0LmRlZmF1bHQu
Y29tcHV0ZWQuZmlsdGVyQnkoIm1vZGVsIiwiY29tcGxldGVkIiksYWN0aW9uczp7Y3JlYXRlVG9k
bzpmdW5jdGlvbihlKXsxMyE9PWUua2V5Q29kZXx8dC5kZWZhdWx0LmlzQmxhbmsoZS50YXJnZXQu
dmFsdWUpfHwodGhpcy5nZXQoInJlcG8iKS5hZGQoe3RpdGxlOmUudGFyZ2V0LnZhbHVlLnRyaW0o
KSxjb21wbGV0ZWQ6ITF9KSxlLnRhcmdldC52YWx1ZT0iIil9LGNsZWFyQ29tcGxldGVkOmZ1bmN0
aW9uKCl7dGhpcy5nZXQoIm1vZGVsIikucmVtb3ZlT2JqZWN0cyh0aGlzLmdldCgiY29tcGxldGVk
IikpLHRoaXMuZ2V0KCJyZXBvIikucGVyc2lzdCgpfX19KX0pLGRlZmluZSgidG9kb212Yy9jb250
cm9sbGVycy9jb21wbGV0ZWQiLFsiZXhwb3J0cyIsImVtYmVyIl0sZnVuY3Rpb24oZSx0KXtlLmRl
ZmF1bHQ9dC5kZWZhdWx0LkNvbnRyb2xsZXIuZXh0ZW5kKHt0b2Rvczp0LmRlZmF1bHQuY29tcHV0
ZWQuZmlsdGVyQnkoIm1vZGVsIiwiY29tcGxldGVkIiwhMCl9KX0pLGRlZmluZSgidG9kb212Yy9o
ZWxwZXJzL2d0IixbImV4cG9ydHMiLCJlbWJlciJdLGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihl
KXt2YXIgdD1yKGUsMiksbj10WzBdLGE9dFsxXTtyZXR1cm4gbj5hfXZhciByPWZ1bmN0aW9uKCl7
ZnVuY3Rpb24gZShlLHQpe3ZhciBuPVtdLHI9ITAsYT0hMSxvPXZvaWQgMDt0cnl7Zm9yKHZhciBs
LGk9ZVtTeW1ib2wuaXRlcmF0b3JdKCk7IShyPShsPWkubmV4dCgpKS5kb25lKSYmKG4ucHVzaChs
LnZhbHVlKSwhdHx8bi5sZW5ndGghPT10KTtyPSEwKTt9Y2F0Y2goZSl7YT0hMCxvPWV9ZmluYWxs
eXt0cnl7IXImJmkucmV0dXJuJiZpLnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBvfX1yZXR1
cm4gbn1yZXR1cm4gZnVuY3Rpb24odCxuKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O2lm
KFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpcmV0dXJuIGUodCxuKTt0aHJvdyBuZXcgVHlw
ZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3Rh
bmNlIil9fSgpO2UuZ3Q9bixlLmRlZmF1bHQ9dC5kZWZhdWx0LkhlbHBlci5oZWxwZXIobil9KSxk
ZWZpbmUoInRvZG9tdmMvaGVscGVycy9wbHVyYWxpemUiLFsiZXhwb3J0cyIsImVtYmVyIiwiZW1i
ZXItaW5mbGVjdG9yIl0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSl7dmFyIHQ9YShlLDIp
LHI9dFswXSxvPXRbMV07cmV0dXJuIDE9PT1vP3I6KDAsbi5wbHVyYWxpemUpKHIpfXZhciBhPWZ1
bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciBuPVtdLHI9ITAsYT0hMSxvPXZvaWQgMDt0cnl7
Zm9yKHZhciBsLGk9ZVtTeW1ib2wuaXRlcmF0b3JdKCk7IShyPShsPWkubmV4dCgpKS5kb25lKSYm
KG4ucHVzaChsLnZhbHVlKSwhdHx8bi5sZW5ndGghPT10KTtyPSEwKTt9Y2F0Y2goZSl7YT0hMCxv
PWV9ZmluYWxseXt0cnl7IXImJmkucmV0dXJuJiZpLnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJv
dyBvfX1yZXR1cm4gbn1yZXR1cm4gZnVuY3Rpb24odCxuKXtpZihBcnJheS5pc0FycmF5KHQpKXJl
dHVybiB0O2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpcmV0dXJuIGUodCxuKTt0aHJv
dyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJh
YmxlIGluc3RhbmNlIil9fSgpO2UucGx1cmFsaXplSGVscGVyPXIsZS5kZWZhdWx0PXQuZGVmYXVs
dC5IZWxwZXIuaGVscGVyKHIpfSksZGVmaW5lKCJ0b2RvbXZjL2hlbHBlcnMvc2luZ3VsYXJpemUi
LFsiZXhwb3J0cyIsImVtYmVyLWluZmxlY3Rvci9saWIvaGVscGVycy9zaW5ndWxhcml6ZSJdLGZ1
bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQuZGVmYXVsdH0pLGRlZmluZSgidG9kb212Yy9pbml0aWFs
aXplcnMvYXBwLXZlcnNpb24iLFsiZXhwb3J0cyIsImVtYmVyLWNsaS1hcHAtdmVyc2lvbi9pbml0
aWFsaXplci1mYWN0b3J5IiwidG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQiXSxmdW5jdGlvbihl
LHQsbil7ZS5kZWZhdWx0PXtuYW1lOiJBcHAgVmVyc2lvbiIsaW5pdGlhbGl6ZTooMCx0LmRlZmF1
bHQpKG4uZGVmYXVsdC5BUFAubmFtZSxuLmRlZmF1bHQuQVBQLnZlcnNpb24pfX0pLGRlZmluZSgi
dG9kb212Yy9pbml0aWFsaXplcnMvY29udGFpbmVyLWRlYnVnLWFkYXB0ZXIiLFsiZXhwb3J0cyIs
ImVtYmVyLXJlc29sdmVyL2NvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyIl0sZnVuY3Rpb24oZSx0KXtl
LmRlZmF1bHQ9e25hbWU6ImNvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyIixpbml0aWFsaXplOmZ1bmN0
aW9uKCl7dmFyIGU9YXJndW1lbnRzWzFdfHxhcmd1bWVudHNbMF07ZS5yZWdpc3RlcigiY29udGFp
bmVyLWRlYnVnLWFkYXB0ZXI6bWFpbiIsdC5kZWZhdWx0KSxlLmluamVjdCgiY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXI6bWFpbiIsIm5hbWVzcGFjZSIsImFwcGxpY2F0aW9uOm1haW4iKX19fSksZGVm
aW5lKCJ0b2RvbXZjL2luaXRpYWxpemVycy9leHBvcnQtYXBwbGljYXRpb24tZ2xvYmFsIixbImV4
cG9ydHMiLCJlbWJlciIsInRvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50Il0sZnVuY3Rpb24oZSx0
LG4pe2Z1bmN0aW9uIHIoKXt2YXIgZT1hcmd1bWVudHNbMV18fGFyZ3VtZW50c1swXTtpZihuLmRl
ZmF1bHQuZXhwb3J0QXBwbGljYXRpb25HbG9iYWwhPT0hMSl7dmFyIHI7aWYoInVuZGVmaW5lZCIh
PXR5cGVvZiB3aW5kb3cpcj13aW5kb3c7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2Jh
bClyPWdsb2JhbDtlbHNle2lmKCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZilyZXR1cm47cj1zZWxm
fXZhciBhLG89bi5kZWZhdWx0LmV4cG9ydEFwcGxpY2F0aW9uR2xvYmFsO2E9InN0cmluZyI9PXR5
cGVvZiBvP286dC5kZWZhdWx0LlN0cmluZy5jbGFzc2lmeShuLmRlZmF1bHQubW9kdWxlUHJlZml4
KSxyW2FdfHwoclthXT1lLGUucmVvcGVuKHt3aWxsRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3N1
cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxkZWxldGUgclthXX19KSl9fWUuaW5pdGlhbGl6ZT1y
LGUuZGVmYXVsdD17bmFtZToiZXhwb3J0LWFwcGxpY2F0aW9uLWdsb2JhbCIsaW5pdGlhbGl6ZTpy
fX0pLGRlZmluZSgidG9kb212Yy9pbnN0YW5jZS1pbml0aWFsaXplcnMvZ2xvYmFsIixbImV4cG9y
dHMiXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3dpbmRvdy5BcHA9ZX1lLmluaXRpYWxpemU9
dCxlLmRlZmF1bHQ9e25hbWU6Imdsb2JhbCIsaW5pdGlhbGl6ZTp0fX0pLGRlZmluZSgidG9kb212
Yy9yZXNvbHZlciIsWyJleHBvcnRzIiwiZW1iZXItcmVzb2x2ZXIiXSxmdW5jdGlvbihlLHQpe2Uu
ZGVmYXVsdD10LmRlZmF1bHR9KSxkZWZpbmUoInRvZG9tdmMvcm91dGVyIixbImV4cG9ydHMiLCJl
bWJlciIsInRvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50Il0sZnVuY3Rpb24oZSx0LG4pe3ZhciBy
PXQuZGVmYXVsdC5Sb3V0ZXIuZXh0ZW5kKHtsb2NhdGlvbjpuLmRlZmF1bHQubG9jYXRpb25UeXBl
fSk7ci5tYXAoZnVuY3Rpb24oKXt0aGlzLnJvdXRlKCJhY3RpdmUiKSx0aGlzLnJvdXRlKCJjb21w
bGV0ZWQiKX0pLGUuZGVmYXVsdD1yfSksZGVmaW5lKCJ0b2RvbXZjL3JvdXRlcy9hcHBsaWNhdGlv
biIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10LmRlZmF1bHQu
Um91dGUuZXh0ZW5kKHtyZXBvOnQuZGVmYXVsdC5pbmplY3Quc2VydmljZSgpLG1vZGVsOmZ1bmN0
aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJyZXBvIikuZmluZEFsbCgpfX0pfSksZGVmaW5lKCJ0b2Rv
bXZjL3NlcnZpY2VzL2FqYXgiLFsiZXhwb3J0cyIsImVtYmVyLWFqYXgvc2VydmljZXMvYWpheCJd
LGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJh
YmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9fSl9KSxkZWZpbmUoInRvZG9t
dmMvc2VydmljZXMvcmVwbyIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlvbihlLHQpe2UuZGVm
YXVsdD10LmRlZmF1bHQuU2VydmljZS5leHRlbmQoe2xhc3RJZDowLGRhdGE6bnVsbCxmaW5kQWxs
OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJkYXRhIil8fHRoaXMuc2V0KCJkYXRhIixKU09O
LnBhcnNlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9kb3MiKXx8IltdIikpfSxhZGQ6
ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0LmFzc2lnbih7aWQ6dGhpcy5pbmNyZW1lbnRQcm9wZXJ0
eSgibGFzdElkIil9LGUpO3JldHVybiB0aGlzLmdldCgiZGF0YSIpLnB1c2hPYmplY3QodCksdGhp
cy5wZXJzaXN0KCksdH0sZGVsZXRlOmZ1bmN0aW9uKGUpe3RoaXMuZ2V0KCJkYXRhIikucmVtb3Zl
T2JqZWN0KGUpLHRoaXMucGVyc2lzdCgpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7d2luZG93LmxvY2Fs
U3RvcmFnZS5zZXRJdGVtKCJ0b2RvcyIsSlNPTi5zdHJpbmdpZnkodGhpcy5nZXQoImRhdGEiKSkp
fX0pfSksZGVmaW5lKCJ0b2RvbXZjL3RlbXBsYXRlcy9hY3RpdmUiLFsiZXhwb3J0cyJdLGZ1bmN0
aW9uKGUpe2UuZGVmYXVsdD1FbWJlci5IVE1MQmFycy50ZW1wbGF0ZShmdW5jdGlvbigpe3JldHVy
bnttZXRhOntmcmFnbWVudFJlYXNvbjp7bmFtZToibWlzc2luZy13cmFwcGVyIixwcm9ibGVtczpb
Indyb25nLXR5cGUiXX0scmV2aXNpb246IkVtYmVyQDIuNi4yIixsb2M6e3NvdXJjZTpudWxsLHN0
YXJ0OntsaW5lOjEsY29sdW1uOjB9LGVuZDp7bGluZToxLGNvbHVtbjoyNX19LG1vZHVsZU5hbWU6
InRvZG9tdmMvdGVtcGxhdGVzL2FjdGl2ZS5oYnMifSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVk
RnJhZ21lbnQ6bnVsbCxoYXNSZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3Zh
ciB0PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLG49ZS5jcmVhdGVDb21tZW50KCIiKTtyZXR1
cm4gZS5hcHBlbmRDaGlsZCh0LG4pLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oZSx0LG4p
e3ZhciByPW5ldyBBcnJheSgxKTtyZXR1cm4gclswXT1lLmNyZWF0ZU1vcnBoQXQodCwwLDAsbiks
ZS5pbnNlcnRCb3VuZGFyeSh0LDApLGUuaW5zZXJ0Qm91bmRhcnkodCxudWxsKSxyfSxzdGF0ZW1l
bnRzOltbImlubGluZSIsInRvZG8tbGlzdCIsW10sWyJ0b2RvcyIsWyJzdWJleHByIiwiQG11dCIs
W1siZ2V0IiwidG9kb3MiLFsibG9jIixbbnVsbCxbMSwxOF0sWzEsMjNdXV1dXSxbXSxbXV1dLFsi
bG9jIixbbnVsbCxbMSwwXSxbMSwyNV1dXV1dLGxvY2FsczpbXSx0ZW1wbGF0ZXM6W119fSgpKX0p
LGRlZmluZSgidG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24iLFsiZXhwb3J0cyJdLGZ1bmN0
aW9uKGUpe2UuZGVmYXVsdD1FbWJlci5IVE1MQmFycy50ZW1wbGF0ZShmdW5jdGlvbigpe3ZhciBl
PWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7ZnJhZ21lbnRSZWFzb246
ITEscmV2aXNpb246IkVtYmVyQDIuNi4yIixsb2M6e3NvdXJjZTpudWxsLHN0YXJ0OntsaW5lOjEx
LGNvbHVtbjoxNH0sZW5kOntsaW5lOjExLGNvbHVtbjo2MH19LG1vZHVsZU5hbWU6InRvZG9tdmMv
dGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyJ9LGlzRW1wdHk6ITEsYXJpdHk6MCxjYWNoZWRGcmFn
bWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9
ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj1lLmNyZWF0ZVRleHROb2RlKCJBbGwiKTtyZXR1
cm4gZS5hcHBlbmRDaGlsZCh0LG4pLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oKXtyZXR1
cm5bXX0sc3RhdGVtZW50czpbXSxsb2NhbHM6W10sdGVtcGxhdGVzOltdfX0oKSx0PWZ1bmN0aW9u
KCl7cmV0dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOiExLHJldmlzaW9uOiJFbWJlckAyLjYuMiIs
bG9jOntzb3VyY2U6bnVsbCxzdGFydDp7bGluZToxMixjb2x1bW46MTR9LGVuZDp7bGluZToxMixj
b2x1bW46NjR9fSxtb2R1bGVOYW1lOiJ0b2RvbXZjL3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMi
fSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNSZW5kZXJlZDohMSxi
dWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgp
LG49ZS5jcmVhdGVUZXh0Tm9kZSgiQWN0aXZlIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodCxuKSx0
fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuW119LHN0YXRlbWVudHM6W10sbG9j
YWxzOltdLHRlbXBsYXRlczpbXX19KCksbj1mdW5jdGlvbigpe3JldHVybnttZXRhOntmcmFnbWVu
dFJlYXNvbjohMSxyZXZpc2lvbjoiRW1iZXJAMi42LjIiLGxvYzp7c291cmNlOm51bGwsc3RhcnQ6
e2xpbmU6MTMsY29sdW1uOjE0fSxlbmQ6e2xpbmU6MTMsY29sdW1uOjcwfX0sbW9kdWxlTmFtZToi
dG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIn0saXNFbXB0eTohMSxhcml0eTowLGNh
Y2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6ITEsYnVpbGRGcmFnbWVudDpmdW5jdGlvbihl
KXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWUuY3JlYXRlVGV4dE5vZGUoIkNv
bXBsZXRlZCIpO3JldHVybiBlLmFwcGVuZENoaWxkKHQsbiksdH0sYnVpbGRSZW5kZXJOb2Rlczpm
dW5jdGlvbigpe3JldHVybltdfSxzdGF0ZW1lbnRzOltdLGxvY2FsczpbXSx0ZW1wbGF0ZXM6W119
fSgpLHI9ZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7ZnJhZ21lbnRSZWFzb246ITEscmV2aXNpb246
IkVtYmVyQDIuNi4yIixsb2M6e3NvdXJjZTpudWxsLHN0YXJ0OntsaW5lOjE1LGNvbHVtbjo4fSxl
bmQ6e2xpbmU6MTcsY29sdW1uOjh9fSxtb2R1bGVOYW1lOiJ0b2RvbXZjL3RlbXBsYXRlcy9hcHBs
aWNhdGlvbi5oYnMifSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNS
ZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1l
bnRGcmFnbWVudCgpLG49ZS5jcmVhdGVUZXh0Tm9kZSgiICAgICAgICAgICIpO2UuYXBwZW5kQ2hp
bGQodCxuKTt2YXIgbj1lLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2Uuc2V0QXR0cmlidXRlKG4s
ImlkIiwiY2xlYXItY29tcGxldGVkIik7dmFyIHI9ZS5jcmVhdGVUZXh0Tm9kZSgiQ2xlYXIgY29t
cGxldGVkIik7ZS5hcHBlbmRDaGlsZChuLHIpLGUuYXBwZW5kQ2hpbGQodCxuKTt2YXIgbj1lLmNy
ZWF0ZVRleHROb2RlKCJcbiIpO3JldHVybiBlLmFwcGVuZENoaWxkKHQsbiksdH0sYnVpbGRSZW5k
ZXJOb2RlczpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jaGlsZEF0KHQsWzFdKSxhPW5ldyBBcnJh
eSgxKTtyZXR1cm4gYVswXT1lLmNyZWF0ZUF0dHJNb3JwaChyLCJvbmNsaWNrIiksYX0sc3RhdGVt
ZW50czpbWyJhdHRyaWJ1dGUiLCJvbmNsaWNrIixbInN1YmV4cHIiLCJhY3Rpb24iLFsiY2xlYXJD
b21wbGV0ZWQiXSxbXSxbImxvYyIsW251bGwsWzE2LDQ3XSxbMTYsNzRdXV1dXV0sbG9jYWxzOltd
LHRlbXBsYXRlczpbXX19KCk7cmV0dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOiExLHJldmlzaW9u
OiJFbWJlckAyLjYuMiIsbG9jOntzb3VyY2U6bnVsbCxzdGFydDp7bGluZTo3LGNvbHVtbjo0fSxl
bmQ6e2xpbmU6MTksY29sdW1uOjR9fSxtb2R1bGVOYW1lOiJ0b2RvbXZjL3RlbXBsYXRlcy9hcHBs
aWNhdGlvbi5oYnMifSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNS
ZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1l
bnRGcmFnbWVudCgpLG49ZS5jcmVhdGVUZXh0Tm9kZSgiICAgICAgIik7ZS5hcHBlbmRDaGlsZCh0
LG4pO3ZhciBuPWUuY3JlYXRlRWxlbWVudCgiZm9vdGVyIik7ZS5zZXRBdHRyaWJ1dGUobiwiaWQi
LCJmb290ZXIiKTt2YXIgcj1lLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAgIik7ZS5hcHBlbmRD
aGlsZChuLHIpO3ZhciByPWUuY3JlYXRlRWxlbWVudCgic3BhbiIpO2Uuc2V0QXR0cmlidXRlKHIs
ImlkIiwidG9kby1jb3VudCIpO3ZhciBhPWUuY3JlYXRlRWxlbWVudCgic3Ryb25nIiksbz1lLmNy
ZWF0ZUNvbW1lbnQoIiIpO2UuYXBwZW5kQ2hpbGQoYSxvKSxlLmFwcGVuZENoaWxkKHIsYSk7dmFy
IGE9ZS5jcmVhdGVUZXh0Tm9kZSgiICIpO2UuYXBwZW5kQ2hpbGQocixhKTt2YXIgYT1lLmNyZWF0
ZUNvbW1lbnQoIiIpO2UuYXBwZW5kQ2hpbGQocixhKTt2YXIgYT1lLmNyZWF0ZVRleHROb2RlKCIg
bGVmdCIpO2UuYXBwZW5kQ2hpbGQocixhKSxlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5jcmVh
dGVUZXh0Tm9kZSgiXG4gICAgICAgICIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0
ZUVsZW1lbnQoInVsIik7ZS5zZXRBdHRyaWJ1dGUociwiaWQiLCJmaWx0ZXJzIik7dmFyIGE9ZS5j
cmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAgIik7ZS5hcHBlbmRDaGlsZChyLGEpO3ZhciBhPWUu
Y3JlYXRlRWxlbWVudCgibGkiKSxvPWUuY3JlYXRlQ29tbWVudCgiIik7ZS5hcHBlbmRDaGlsZChh
LG8pLGUuYXBwZW5kQ2hpbGQocixhKTt2YXIgYT1lLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAg
ICAiKTtlLmFwcGVuZENoaWxkKHIsYSk7dmFyIGE9ZS5jcmVhdGVFbGVtZW50KCJsaSIpLG89ZS5j
cmVhdGVDb21tZW50KCIiKTtlLmFwcGVuZENoaWxkKGEsbyksZS5hcHBlbmRDaGlsZChyLGEpO3Zh
ciBhPWUuY3JlYXRlVGV4dE5vZGUoIlxuICAgICAgICAgICIpO2UuYXBwZW5kQ2hpbGQocixhKTt2
YXIgYT1lLmNyZWF0ZUVsZW1lbnQoImxpIiksbz1lLmNyZWF0ZUNvbW1lbnQoIiIpO2UuYXBwZW5k
Q2hpbGQoYSxvKSxlLmFwcGVuZENoaWxkKHIsYSk7dmFyIGE9ZS5jcmVhdGVUZXh0Tm9kZSgiXG4g
ICAgICAgICIpO2UuYXBwZW5kQ2hpbGQocixhKSxlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5j
cmVhdGVUZXh0Tm9kZSgiXG4iKTtlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5jcmVhdGVDb21t
ZW50KCIiKTtlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5jcmVhdGVUZXh0Tm9kZSgiICAgICAg
Iik7ZS5hcHBlbmRDaGlsZChuLHIpLGUuYXBwZW5kQ2hpbGQodCxuKTt2YXIgbj1lLmNyZWF0ZVRl
eHROb2RlKCJcbiIpO3JldHVybiBlLmFwcGVuZENoaWxkKHQsbiksdH0sYnVpbGRSZW5kZXJOb2Rl
czpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jaGlsZEF0KHQsWzFdKSxhPWUuY2hpbGRBdChyLFsx
XSksbz1lLmNoaWxkQXQocixbM10pLGw9bmV3IEFycmF5KDYpO3JldHVybiBsWzBdPWUuY3JlYXRl
TW9ycGhBdChlLmNoaWxkQXQoYSxbMF0pLDAsMCksbFsxXT1lLmNyZWF0ZU1vcnBoQXQoYSwyLDIp
LGxbMl09ZS5jcmVhdGVNb3JwaEF0KGUuY2hpbGRBdChvLFsxXSksMCwwKSxsWzNdPWUuY3JlYXRl
TW9ycGhBdChlLmNoaWxkQXQobyxbM10pLDAsMCksbFs0XT1lLmNyZWF0ZU1vcnBoQXQoZS5jaGls
ZEF0KG8sWzVdKSwwLDApLGxbNV09ZS5jcmVhdGVNb3JwaEF0KHIsNSw1KSxsfSxzdGF0ZW1lbnRz
OltbImNvbnRlbnQiLCJyZW1haW5pbmcubGVuZ3RoIixbImxvYyIsW251bGwsWzksMzhdLFs5LDU4
XV1dXSxbImlubGluZSIsInBsdXJhbGl6ZSIsWyJpdGVtIixbImdldCIsInJlbWFpbmluZy5sZW5n
dGgiLFsibG9jIixbbnVsbCxbOSw4N10sWzksMTAzXV1dXV0sW10sWyJsb2MiLFtudWxsLFs5LDY4
XSxbOSwxMDVdXV1dLFsiYmxvY2siLCJsaW5rLXRvIixbImluZGV4Il0sWyJhY3RpdmVDbGFzcyIs
InNlbGVjdGVkIl0sMCxudWxsLFsibG9jIixbbnVsbCxbMTEsMTRdLFsxMSw3Ml1dXV0sWyJibG9j
ayIsImxpbmstdG8iLFsiYWN0aXZlIl0sWyJhY3RpdmVDbGFzcyIsInNlbGVjdGVkIl0sMSxudWxs
LFsibG9jIixbbnVsbCxbMTIsMTRdLFsxMiw3Nl1dXV0sWyJibG9jayIsImxpbmstdG8iLFsiY29t
cGxldGVkIl0sWyJhY3RpdmVDbGFzcyIsInNlbGVjdGVkIl0sMixudWxsLFsibG9jIixbbnVsbCxb
MTMsMTRdLFsxMyw4Ml1dXV0sWyJibG9jayIsImlmIixbWyJnZXQiLCJjb21wbGV0ZWQubGVuZ3Ro
IixbImxvYyIsW251bGwsWzE1LDE0XSxbMTUsMzBdXV1dXSxbXSwzLG51bGwsWyJsb2MiLFtudWxs
LFsxNSw4XSxbMTcsMTVdXV1dXSxsb2NhbHM6W10sdGVtcGxhdGVzOltlLHQsbixyXX19KCk7cmV0
dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOntuYW1lOiJtaXNzaW5nLXdyYXBwZXIiLHByb2JsZW1z
OlsibXVsdGlwbGUtbm9kZXMiXX0scmV2aXNpb246IkVtYmVyQDIuNi4yIixsb2M6e3NvdXJjZTpu
dWxsLHN0YXJ0OntsaW5lOjEsY29sdW1uOjB9LGVuZDp7bGluZToyOSxjb2x1bW46OX19LG1vZHVs
ZU5hbWU6InRvZG9tdmMvdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyJ9LGlzRW1wdHk6ITEsYXJp
dHk6MCxjYWNoZWRGcmFnbWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21lbnQ6ZnVu
Y3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj1lLmNyZWF0ZUVsZW1l
bnQoInNlY3Rpb24iKTtlLnNldEF0dHJpYnV0ZShuLCJpZCIsInRvZG9hcHAiKTt2YXIgcj1lLmNy
ZWF0ZVRleHROb2RlKCJcbiAgIik7ZS5hcHBlbmRDaGlsZChuLHIpO3ZhciByPWUuY3JlYXRlRWxl
bWVudCgiaGVhZGVyIik7ZS5zZXRBdHRyaWJ1dGUociwiaWQiLCJoZWFkZXIiKTt2YXIgYT1lLmNy
ZWF0ZVRleHROb2RlKCJcbiAgICAiKTtlLmFwcGVuZENoaWxkKHIsYSk7dmFyIGE9ZS5jcmVhdGVF
bGVtZW50KCJoMSIpLG89ZS5jcmVhdGVUZXh0Tm9kZSgidG9kb3MiKTtlLmFwcGVuZENoaWxkKGEs
byksZS5hcHBlbmRDaGlsZChyLGEpO3ZhciBhPWUuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpO2Uu
YXBwZW5kQ2hpbGQocixhKTt2YXIgYT1lLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZS5zZXRBdHRy
aWJ1dGUoYSwidHlwZSIsInRleHQiKSxlLnNldEF0dHJpYnV0ZShhLCJpZCIsIm5ldy10b2RvIiks
ZS5zZXRBdHRyaWJ1dGUoYSwicGxhY2Vob2xkZXIiLCJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/Iiks
ZS5zZXRBdHRyaWJ1dGUoYSwiYXV0b2ZvY3VzIiwiIiksZS5hcHBlbmRDaGlsZChyLGEpO3ZhciBh
PWUuY3JlYXRlVGV4dE5vZGUoIlxuICAiKTtlLmFwcGVuZENoaWxkKHIsYSksZS5hcHBlbmRDaGls
ZChuLHIpO3ZhciByPWUuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpO2UuYXBwZW5kQ2hpbGQobixy
KTt2YXIgcj1lLmNyZWF0ZUNvbW1lbnQoIiIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNy
ZWF0ZVRleHROb2RlKCJcbiIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUNvbW1l
bnQoIiIpO2UuYXBwZW5kQ2hpbGQobixyKSxlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVh
dGVUZXh0Tm9kZSgiXG4iKTtlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVhdGVFbGVtZW50
KCJmb290ZXIiKTtlLnNldEF0dHJpYnV0ZShuLCJpZCIsImluZm8iKTt2YXIgcj1lLmNyZWF0ZVRl
eHROb2RlKCJcbiAgIik7ZS5hcHBlbmRDaGlsZChuLHIpO3ZhciByPWUuY3JlYXRlRWxlbWVudCgi
cCIpLGE9ZS5jcmVhdGVUZXh0Tm9kZSgiRG91YmxlLWNsaWNrIHRvIGVkaXQgYSB0b2RvIik7ZS5h
cHBlbmRDaGlsZChyLGEpLGUuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZVRleHROb2Rl
KCJcbiAgIik7ZS5hcHBlbmRDaGlsZChuLHIpO3ZhciByPWUuY3JlYXRlRWxlbWVudCgicCIpLGE9
ZS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgQ3JlYXRlZCBieVxuICAgICIpO2UuYXBwZW5kQ2hpbGQo
cixhKTt2YXIgYT1lLmNyZWF0ZUVsZW1lbnQoImEiKTtlLnNldEF0dHJpYnV0ZShhLCJocmVmIiwi
aHR0cDovL2dpdGh1Yi5jb20vY2liZXJub3giKTt2YXIgbz1lLmNyZWF0ZVRleHROb2RlKCJNaWd1
ZWwgQ2FtYmEiKTtlLmFwcGVuZENoaWxkKGEsbyksZS5hcHBlbmRDaGlsZChyLGEpO3ZhciBhPWUu
Y3JlYXRlVGV4dE5vZGUoIixcbiAgICAiKTtlLmFwcGVuZENoaWxkKHIsYSk7dmFyIGE9ZS5jcmVh
dGVFbGVtZW50KCJhIik7ZS5zZXRBdHRyaWJ1dGUoYSwiaHJlZiIsImh0dHA6Ly9naXRodWIuY29t
L2FkZHlvc21hbmkiKTt2YXIgbz1lLmNyZWF0ZVRleHROb2RlKCJBZGR5IE9zbWFuaSIpO2UuYXBw
ZW5kQ2hpbGQoYSxvKSxlLmFwcGVuZENoaWxkKHIsYSk7dmFyIGE9ZS5jcmVhdGVUZXh0Tm9kZSgi
XG4gICIpO2UuYXBwZW5kQ2hpbGQocixhKSxlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5jcmVh
dGVUZXh0Tm9kZSgiXG4gICIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUVsZW1l
bnQoInAiKSxhPWUuY3JlYXRlVGV4dE5vZGUoIlBhcnQgb2YgIik7ZS5hcHBlbmRDaGlsZChyLGEp
O3ZhciBhPWUuY3JlYXRlRWxlbWVudCgiYSIpO2Uuc2V0QXR0cmlidXRlKGEsImhyZWYiLCJodHRw
Oi8vdG9kb212Yy5jb20iKTt2YXIgbz1lLmNyZWF0ZVRleHROb2RlKCJUb2RvTVZDIik7ZS5hcHBl
bmRDaGlsZChhLG8pLGUuYXBwZW5kQ2hpbGQocixhKSxlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9
ZS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTtyZXR1cm4gZS5hcHBlbmRDaGlsZChuLHIpLGUuYXBwZW5k
Q2hpbGQodCxuKSx0fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNo
aWxkQXQodCxbMF0pLGE9ZS5jaGlsZEF0KHIsWzEsM10pLG89bmV3IEFycmF5KDMpO3JldHVybiBv
WzBdPWUuY3JlYXRlQXR0ck1vcnBoKGEsIm9ua2V5ZG93biIpLG9bMV09ZS5jcmVhdGVNb3JwaEF0
KHIsMywzKSxvWzJdPWUuY3JlYXRlTW9ycGhBdChyLDUsNSksb30sc3RhdGVtZW50czpbWyJhdHRy
aWJ1dGUiLCJvbmtleWRvd24iLFsic3ViZXhwciIsImFjdGlvbiIsWyJjcmVhdGVUb2RvIl0sW10s
WyJsb2MiLFtudWxsLFs0LDQ3XSxbNCw3MF1dXV1dLFsiY29udGVudCIsIm91dGxldCIsWyJsb2Mi
LFtudWxsLFs2LDRdLFs2LDE0XV1dXSxbImJsb2NrIiwiaWYiLFtbInN1YmV4cHIiLCJndCIsW1si
Z2V0IiwibW9kZWwubGVuZ3RoIixbImxvYyIsW251bGwsWzcsMTRdLFs3LDI2XV1dXSwwXSxbXSxb
ImxvYyIsW251bGwsWzcsMTBdLFs3LDI5XV1dXV0sW10sMCxudWxsLFsibG9jIixbbnVsbCxbNyw0
XSxbMTksMTFdXV1dXSxsb2NhbHM6W10sdGVtcGxhdGVzOltlXX19KCkpfSksZGVmaW5lKCJ0b2Rv
bXZjL3RlbXBsYXRlcy9jb21wbGV0ZWQiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpe2UuZGVmYXVs
dD1FbWJlci5IVE1MQmFycy50ZW1wbGF0ZShmdW5jdGlvbigpe3JldHVybnttZXRhOntmcmFnbWVu
dFJlYXNvbjp7bmFtZToibWlzc2luZy13cmFwcGVyIixwcm9ibGVtczpbIndyb25nLXR5cGUiXX0s
cmV2aXNpb246IkVtYmVyQDIuNi4yIixsb2M6e3NvdXJjZTpudWxsLHN0YXJ0OntsaW5lOjEsY29s
dW1uOjB9LGVuZDp7bGluZToxLGNvbHVtbjoyNX19LG1vZHVsZU5hbWU6InRvZG9tdmMvdGVtcGxh
dGVzL2NvbXBsZXRlZC5oYnMifSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVs
bCxoYXNSZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRl
RG9jdW1lbnRGcmFnbWVudCgpLG49ZS5jcmVhdGVDb21tZW50KCIiKTtyZXR1cm4gZS5hcHBlbmRD
aGlsZCh0LG4pLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBB
cnJheSgxKTtyZXR1cm4gclswXT1lLmNyZWF0ZU1vcnBoQXQodCwwLDAsbiksZS5pbnNlcnRCb3Vu
ZGFyeSh0LDApLGUuaW5zZXJ0Qm91bmRhcnkodCxudWxsKSxyfSxzdGF0ZW1lbnRzOltbImlubGlu
ZSIsInRvZG8tbGlzdCIsW10sWyJ0b2RvcyIsWyJzdWJleHByIiwiQG11dCIsW1siZ2V0IiwidG9k
b3MiLFsibG9jIixbbnVsbCxbMSwxOF0sWzEsMjNdXV1dXSxbXSxbXV1dLFsibG9jIixbbnVsbCxb
MSwwXSxbMSwyNV1dXV1dLGxvY2FsczpbXSx0ZW1wbGF0ZXM6W119fSgpKX0pLGRlZmluZSgidG9k
b212Yy90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWl0ZW0iLFsiZXhwb3J0cyJdLGZ1bmN0aW9u
KGUpe2UuZGVmYXVsdD1FbWJlci5IVE1MQmFycy50ZW1wbGF0ZShmdW5jdGlvbigpe3JldHVybntt
ZXRhOntmcmFnbWVudFJlYXNvbjp7bmFtZToibWlzc2luZy13cmFwcGVyIixwcm9ibGVtczpbIm11
bHRpcGxlLW5vZGVzIl19LHJldmlzaW9uOiJFbWJlckAyLjYuMiIsbG9jOntzb3VyY2U6bnVsbCxz
dGFydDp7bGluZToxLGNvbHVtbjowfSxlbmQ6e2xpbmU6Nixjb2x1bW46MTUzfX0sbW9kdWxlTmFt
ZToidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWl0ZW0uaGJzIn0saXNFbXB0eToh
MSxhcml0eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6ITEsYnVpbGRGcmFnbWVu
dDpmdW5jdGlvbihlKXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWUuY3JlYXRl
RWxlbWVudCgiZGl2Iik7ZS5zZXRBdHRyaWJ1dGUobiwiY2xhc3MiLCJ2aWV3Iik7dmFyIHI9ZS5j
cmVhdGVUZXh0Tm9kZSgiXG4gICIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUVs
ZW1lbnQoImlucHV0Iik7ZS5zZXRBdHRyaWJ1dGUociwidHlwZSIsImNoZWNrYm94IiksZS5zZXRB
dHRyaWJ1dGUociwiY2xhc3MiLCJ0b2dnbGUiKSxlLmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5j
cmVhdGVUZXh0Tm9kZSgiXG4gICIpO2UuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUVs
ZW1lbnQoImxhYmVsIiksYT1lLmNyZWF0ZUNvbW1lbnQoIiIpO2UuYXBwZW5kQ2hpbGQocixhKSxl
LmFwcGVuZENoaWxkKG4scik7dmFyIHI9ZS5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpO2UuYXBwZW5k
Q2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2Uuc2V0QXR0cmlidXRl
KHIsImNsYXNzIiwiZGVzdHJveSIpLGUuYXBwZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZVRl
eHROb2RlKCJcbiIpO2UuYXBwZW5kQ2hpbGQobixyKSxlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49
ZS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTtlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVhdGVF
bGVtZW50KCJpbnB1dCIpO3JldHVybiBlLnNldEF0dHJpYnV0ZShuLCJ0eXBlIiwidGV4dCIpLGUu
c2V0QXR0cmlidXRlKG4sImNsYXNzIiwiZWRpdCIpLGUuc2V0QXR0cmlidXRlKG4sImF1dG9mb2N1
cyIsIiIpLGUuYXBwZW5kQ2hpbGQodCxuKSx0fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0aW9uKGUs
dCxuKXt2YXIgcj1lLmNoaWxkQXQodCxbMF0pLGE9ZS5jaGlsZEF0KHIsWzFdKTt0aGlzLmNhY2hl
ZEZyYWdtZW50JiZlLnJlcGFpckNsb25lZE5vZGUoYSxbXSwhMCk7dmFyIG89ZS5jaGlsZEF0KHIs
WzNdKSxsPWUuY2hpbGRBdChyLFs1XSksaT1lLmNoaWxkQXQodCxbMl0pLGQ9bmV3IEFycmF5KDgp
O3JldHVybiBkWzBdPWUuY3JlYXRlQXR0ck1vcnBoKGEsImNoZWNrZWQiKSxkWzFdPWUuY3JlYXRl
QXR0ck1vcnBoKGEsIm9uY2hhbmdlIiksZFsyXT1lLmNyZWF0ZUF0dHJNb3JwaChvLCJvbmRibGNs
aWNrIiksZFszXT1lLmNyZWF0ZU1vcnBoQXQobywwLDApLGRbNF09ZS5jcmVhdGVBdHRyTW9ycGgo
bCwib25jbGljayIpLGRbNV09ZS5jcmVhdGVBdHRyTW9ycGgoaSwidmFsdWUiKSxkWzZdPWUuY3Jl
YXRlQXR0ck1vcnBoKGksIm9uYmx1ciIpLGRbN109ZS5jcmVhdGVBdHRyTW9ycGgoaSwib25rZXlk
b3duIiksZH0sc3RhdGVtZW50czpbWyJhdHRyaWJ1dGUiLCJjaGVja2VkIixbImdldCIsInRvZG8u
Y29tcGxldGVkIixbImxvYyIsW251bGwsWzIsNTBdLFsyLDY0XV1dXV0sWyJhdHRyaWJ1dGUiLCJv
bmNoYW5nZSIsWyJzdWJleHByIiwiYWN0aW9uIixbInRvZ2dsZUNvbXBsZXRlZCJdLFtdLFsibG9j
IixbbnVsbCxbMiw3Nl0sWzIsMTA0XV1dXV0sWyJhdHRyaWJ1dGUiLCJvbmRibGNsaWNrIixbInN1
YmV4cHIiLCJhY3Rpb24iLFsic3RhcnRFZGl0aW5nIl0sW10sWyJsb2MiLFtudWxsLFszLDIwXSxb
Myw0NV1dXV1dLFsiY29udGVudCIsInRvZG8udGl0bGUiLFsibG9jIixbbnVsbCxbMyw0Nl0sWzMs
NjBdXV1dLFsiYXR0cmlidXRlIiwib25jbGljayIsWyJzdWJleHByIiwiYWN0aW9uIixbInJlbW92
ZVRvZG8iXSxbXSxbImxvYyIsW251bGwsWzQsMThdLFs0LDQxXV1dXV0sWyJhdHRyaWJ1dGUiLCJ2
YWx1ZSIsWyJnZXQiLCJ0b2RvLnRpdGxlIixbImxvYyIsW251bGwsWzYsNDBdLFs2LDUwXV1dXV0s
WyJhdHRyaWJ1dGUiLCJvbmJsdXIiLFsic3ViZXhwciIsImFjdGlvbiIsWyJkb25lRWRpdGluZyJd
LFsidmFsdWUiLCJ0YXJnZXQudmFsdWUiXSxbImxvYyIsW251bGwsWzYsNjBdLFs2LDEwNV1dXV1d
LFsiYXR0cmlidXRlIiwib25rZXlkb3duIixbInN1YmV4cHIiLCJhY3Rpb24iLFsiaGFuZGxlS2V5
ZG93biJdLFtdLFsibG9jIixbbnVsbCxbNiwxMTZdLFs2LDE0Ml1dXV1dXSxsb2NhbHM6W10sdGVt
cGxhdGVzOltdfX0oKSl9KSxkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9k
by1saXN0IixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXtlLmRlZmF1bHQ9RW1iZXIuSFRNTEJhcnMu
dGVtcGxhdGUoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0
dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOiExLHJldmlzaW9uOiJFbWJlckAyLjYuMiIsbG9jOntz
b3VyY2U6bnVsbCxzdGFydDp7bGluZToyLGNvbHVtbjoyfSxlbmQ6e2xpbmU6NCxjb2x1bW46Mn19
LG1vZHVsZU5hbWU6InRvZG9tdmMvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1saXN0LmhicyJ9
LGlzRW1wdHk6ITEsYXJpdHk6MCxjYWNoZWRGcmFnbWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1
aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCks
bj1lLmNyZWF0ZVRleHROb2RlKCIgICAgIik7ZS5hcHBlbmRDaGlsZCh0LG4pO3ZhciBuPWUuY3Jl
YXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZShuLCJ0eXBlIiwiY2hlY2tib3giKSxl
LnNldEF0dHJpYnV0ZShuLCJpZCIsInRvZ2dsZS1hbGwiKSxlLmFwcGVuZENoaWxkKHQsbik7dmFy
IG49ZS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTtyZXR1cm4gZS5hcHBlbmRDaGlsZCh0LG4pLHR9LGJ1
aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY2hpbGRBdCh0LFsxXSk7dGhp
cy5jYWNoZWRGcmFnbWVudCYmZS5yZXBhaXJDbG9uZWROb2RlKHIsW10sITApO3ZhciBhPW5ldyBB
cnJheSgyKTtyZXR1cm4gYVswXT1lLmNyZWF0ZUF0dHJNb3JwaChyLCJjaGVja2VkIiksYVsxXT1l
LmNyZWF0ZUF0dHJNb3JwaChyLCJvbmNoYW5nZSIpLGF9LHN0YXRlbWVudHM6W1siYXR0cmlidXRl
IiwiY2hlY2tlZCIsWyJnZXQiLCJhbGxDb21wbGV0ZWQiLFsibG9jIixbbnVsbCxbMyw1M10sWzMs
NjVdXV1dXSxbImF0dHJpYnV0ZSIsIm9uY2hhbmdlIixbInN1YmV4cHIiLCJhY3Rpb24iLFsidG9n
Z2xlQWxsIl0sW10sWyJsb2MiLFtudWxsLFszLDc3XSxbMyw5OV1dXV1dXSxsb2NhbHM6W10sdGVt
cGxhdGVzOltdfX0oKSx0PWZ1bmN0aW9uKCl7cmV0dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOiEx
LHJldmlzaW9uOiJFbWJlckAyLjYuMiIsbG9jOntzb3VyY2U6bnVsbCxzdGFydDp7bGluZTo2LGNv
bHVtbjo0fSxlbmQ6e2xpbmU6OCxjb2x1bW46NH19LG1vZHVsZU5hbWU6InRvZG9tdmMvdGVtcGxh
dGVzL2NvbXBvbmVudHMvdG9kby1saXN0LmhicyJ9LGlzRW1wdHk6ITEsYXJpdHk6MSxjYWNoZWRG
cmFnbWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSl7dmFy
IHQ9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj1lLmNyZWF0ZVRleHROb2RlKCIgICAgICAi
KTtlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVhdGVDb21tZW50KCIiKTtlLmFwcGVuZENo
aWxkKHQsbik7dmFyIG49ZS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTtyZXR1cm4gZS5hcHBlbmRDaGls
ZCh0LG4pLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBBcnJh
eSgxKTtyZXR1cm4gclswXT1lLmNyZWF0ZU1vcnBoQXQodCwxLDEsbikscn0sc3RhdGVtZW50czpb
WyJpbmxpbmUiLCJ0b2RvLWl0ZW0iLFtdLFsidG9kbyIsWyJzdWJleHByIiwiQG11dCIsW1siZ2V0
IiwidG9kbyIsWyJsb2MiLFtudWxsLFs3LDIzXSxbNywyN11dXV1dLFtdLFtdXSwib25TdGFydEVk
aXQiLFsic3ViZXhwciIsImFjdGlvbiIsWyJkaXNhYmxlVG9nZ2xlIl0sW10sWyJsb2MiLFtudWxs
LFs3LDQwXSxbNyw2NF1dXV0sIm9uRW5kRWRpdCIsWyJzdWJleHByIiwiYWN0aW9uIixbImVuYWJs
ZVRvZ2dsZSJdLFtdLFsibG9jIixbbnVsbCxbNyw3NV0sWzcsOThdXV1dXSxbImxvYyIsW251bGws
WzcsNl0sWzcsMTAwXV1dXV0sbG9jYWxzOlsidG9kbyJdLHRlbXBsYXRlczpbXX19KCk7cmV0dXJu
e21ldGE6e2ZyYWdtZW50UmVhc29uOntuYW1lOiJtaXNzaW5nLXdyYXBwZXIiLHByb2JsZW1zOlsi
d3JvbmctdHlwZSIsIm11bHRpcGxlLW5vZGVzIl19LHJldmlzaW9uOiJFbWJlckAyLjYuMiIsbG9j
Ontzb3VyY2U6bnVsbCxzdGFydDp7bGluZToxLGNvbHVtbjowfSxlbmQ6e2xpbmU6MTAsY29sdW1u
OjB9fSxtb2R1bGVOYW1lOiJ0b2RvbXZjL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8tbGlzdC5o
YnMifSxpc0VtcHR5OiExLGFyaXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNSZW5kZXJlZDoh
MSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVu
dCgpLG49ZS5jcmVhdGVDb21tZW50KCIiKTtlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVh
dGVUZXh0Tm9kZSgiICAiKTtlLmFwcGVuZENoaWxkKHQsbik7dmFyIG49ZS5jcmVhdGVFbGVtZW50
KCJ1bCIpO2Uuc2V0QXR0cmlidXRlKG4sImlkIiwidG9kby1saXN0IiksZS5zZXRBdHRyaWJ1dGUo
biwiY2xhc3MiLCJ0b2RvLWxpc3QiKTt2YXIgcj1lLmNyZWF0ZVRleHROb2RlKCJcbiIpO2UuYXBw
ZW5kQ2hpbGQobixyKTt2YXIgcj1lLmNyZWF0ZUNvbW1lbnQoIiIpO2UuYXBwZW5kQ2hpbGQobixy
KTt2YXIgcj1lLmNyZWF0ZVRleHROb2RlKCIgICIpO2UuYXBwZW5kQ2hpbGQobixyKSxlLmFwcGVu
ZENoaWxkKHQsbik7dmFyIG49ZS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTtyZXR1cm4gZS5hcHBlbmRD
aGlsZCh0LG4pLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBB
cnJheSgyKTtyZXR1cm4gclswXT1lLmNyZWF0ZU1vcnBoQXQodCwwLDAsbiksclsxXT1lLmNyZWF0
ZU1vcnBoQXQoZS5jaGlsZEF0KHQsWzJdKSwxLDEpLGUuaW5zZXJ0Qm91bmRhcnkodCwwKSxyfSxz
dGF0ZW1lbnRzOltbImJsb2NrIiwiaWYiLFtbImdldCIsImNhblRvZ2dsZSIsWyJsb2MiLFtudWxs
LFsyLDhdLFsyLDE3XV1dXV0sW10sMCxudWxsLFsibG9jIixbbnVsbCxbMiwyXSxbNCw5XV1dXSxb
ImJsb2NrIiwiZWFjaCIsW1siZ2V0IiwidG9kb3MiLFsibG9jIixbbnVsbCxbNiwxMl0sWzYsMTdd
XV1dXSxbXSwxLG51bGwsWyJsb2MiLFtudWxsLFs2LDRdLFs4LDEzXV1dXV0sbG9jYWxzOltdLHRl
bXBsYXRlczpbZSx0XX19KCk7cmV0dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOntuYW1lOiJtaXNz
aW5nLXdyYXBwZXIiLHByb2JsZW1zOlsid3JvbmctdHlwZSJdfSxyZXZpc2lvbjoiRW1iZXJAMi42
LjIiLGxvYzp7c291cmNlOm51bGwsc3RhcnQ6e2xpbmU6MSxjb2x1bW46MH0sZW5kOntsaW5lOjEx
LGNvbHVtbjowfX0sbW9kdWxlTmFtZToidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2Rv
LWxpc3QuaGJzIn0saXNFbXB0eTohMSxhcml0eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVu
ZGVyZWQ6ITEsYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50
RnJhZ21lbnQoKSxuPWUuY3JlYXRlQ29tbWVudCgiIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodCxu
KSx0fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgQXJyYXkoMSk7
cmV0dXJuIHJbMF09ZS5jcmVhdGVNb3JwaEF0KHQsMCwwLG4pLGUuaW5zZXJ0Qm91bmRhcnkodCww
KSxlLmluc2VydEJvdW5kYXJ5KHQsbnVsbCkscn0sc3RhdGVtZW50czpbWyJibG9jayIsImlmIixb
WyJnZXQiLCJ0b2Rvcy5sZW5ndGgiLFsibG9jIixbbnVsbCxbMSw2XSxbMSwxOF1dXV1dLFtdLDAs
bnVsbCxbImxvYyIsW251bGwsWzEsMF0sWzEwLDddXV1dXSxsb2NhbHM6W10sdGVtcGxhdGVzOltl
XX19KCkpfSksZGVmaW5lKCJ0b2RvbXZjL3RlbXBsYXRlcy9pbmRleCIsWyJleHBvcnRzIl0sZnVu
Y3Rpb24oZSl7ZS5kZWZhdWx0PUVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKGZ1bmN0aW9uKCl7dmFy
IGU9ZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7ZnJhZ21lbnRSZWFzb246e25hbWU6Im1pc3Npbmct
d3JhcHBlciIscHJvYmxlbXM6WyJ3cm9uZy10eXBlIl19LHJldmlzaW9uOiJFbWJlckAyLjYuMiIs
bG9jOntzb3VyY2U6bnVsbCxzdGFydDp7bGluZToxLGNvbHVtbjowfSxlbmQ6e2xpbmU6Myxjb2x1
bW46MH19LG1vZHVsZU5hbWU6InRvZG9tdmMvdGVtcGxhdGVzL2luZGV4LmhicyJ9LGlzRW1wdHk6
ITEsYXJpdHk6MCxjYWNoZWRGcmFnbWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21l
bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj1lLmNyZWF0
ZVRleHROb2RlKCIgICIpO2UuYXBwZW5kQ2hpbGQodCxuKTt2YXIgbj1lLmNyZWF0ZUNvbW1lbnQo
IiIpO2UuYXBwZW5kQ2hpbGQodCxuKTt2YXIgbj1lLmNyZWF0ZVRleHROb2RlKCJcbiIpO3JldHVy
biBlLmFwcGVuZENoaWxkKHQsbiksdH0sYnVpbGRSZW5kZXJOb2RlczpmdW5jdGlvbihlLHQsbil7
dmFyIHI9bmV3IEFycmF5KDEpO3JldHVybiByWzBdPWUuY3JlYXRlTW9ycGhBdCh0LDEsMSxuKSxy
fSxzdGF0ZW1lbnRzOltbImlubGluZSIsInRvZG8tbGlzdCIsW10sWyJ0b2RvcyIsWyJzdWJleHBy
IiwiQG11dCIsW1siZ2V0IiwibW9kZWwiLFsibG9jIixbbnVsbCxbMiwyMF0sWzIsMjVdXV1dXSxb
XSxbXV1dLFsibG9jIixbbnVsbCxbMiwyXSxbMiwyN11dXV1dLGxvY2FsczpbXSx0ZW1wbGF0ZXM6
W119fSgpO3JldHVybnttZXRhOntmcmFnbWVudFJlYXNvbjp7bmFtZToibWlzc2luZy13cmFwcGVy
Iixwcm9ibGVtczpbIndyb25nLXR5cGUiXX0scmV2aXNpb246IkVtYmVyQDIuNi4yIixsb2M6e3Nv
dXJjZTpudWxsLHN0YXJ0OntsaW5lOjEsY29sdW1uOjB9LGVuZDp7bGluZTo0LGNvbHVtbjowfX0s
bW9kdWxlTmFtZToidG9kb212Yy90ZW1wbGF0ZXMvaW5kZXguaGJzIn0saXNFbXB0eTohMSxhcml0
eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6ITEsYnVpbGRGcmFnbWVudDpmdW5j
dGlvbihlKXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWUuY3JlYXRlQ29tbWVu
dCgiIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodCxuKSx0fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0
aW9uKGUsdCxuKXt2YXIgcj1uZXcgQXJyYXkoMSk7cmV0dXJuIHJbMF09ZS5jcmVhdGVNb3JwaEF0
KHQsMCwwLG4pLGUuaW5zZXJ0Qm91bmRhcnkodCwwKSxlLmluc2VydEJvdW5kYXJ5KHQsbnVsbCks
cn0sc3RhdGVtZW50czpbWyJibG9jayIsImlmIixbWyJnZXQiLCJtb2RlbC5sZW5ndGgiLFsibG9j
IixbbnVsbCxbMSw2XSxbMSwxOF1dXV1dLFtdLDAsbnVsbCxbImxvYyIsW251bGwsWzEsMF0sWzMs
N11dXV1dLGxvY2FsczpbXSx0ZW1wbGF0ZXM6W2VdfX0oKSl9KSxkZWZpbmUoInRvZG9tdmMvY29u
ZmlnL2Vudmlyb25tZW50IixbImVtYmVyIl0sZnVuY3Rpb24oZSl7dmFyIHQ9InRvZG9tdmMiO3Ry
eXt2YXIgbj10KyIvY29uZmlnL2Vudmlyb25tZW50IixyPWUuZGVmYXVsdC4kKCdtZXRhW25hbWU9
IicrbisnIl0nKS5hdHRyKCJjb250ZW50IiksYT1KU09OLnBhcnNlKHVuZXNjYXBlKHIpKTtyZXR1
cm57ZGVmYXVsdDphfX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZWFkIGNv
bmZpZyBmcm9tIG1ldGEgdGFnIHdpdGggbmFtZSAiJytuKyciLicpfX0pLHJ1bm5pbmdUZXN0c3x8
cmVxdWlyZSgidG9kb212Yy9hcHAiKS5kZWZhdWx0LmNyZWF0ZSh7bmFtZToidG9kb212YyIsdmVy
c2lvbjoiMC4wLjArNTBkNDZiNGMifSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLTdiNWM5ODUyMDkxMGFm
YTU4ZDc0ZTA1ZWM4NmNkODczLmNzcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRv
ci03YjVjOTg1MjA5MTBhZmE1OGQ3NGUwNWVjODZjZDg3My5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uM2Y1Y2Zm
OThjZmRjNDk5YzY1ZTU4MmMzMzM1YmUzYzQ1YTgxYWQ4NwotLS0gL2Rldi9udWxsCisrKyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci03YjVjOTg1MjA5MTBhZmE1OGQ3NGUwNWVj
ODZjZDg3My5jc3MKQEAgLTAsMCArMSBAQAorI2lzc3VlLWNvdW50LC5oaWRkZW4sbGFiZWxbZm9y
PXRvZ2dsZS1hbGxde2Rpc3BsYXk6bm9uZX0jZm9vdGVyLCNpbmZvLCN0b2RvYXBwIGgxLCN0b2dn
bGUtYWxse3RleHQtYWxpZ246Y2VudGVyfWhye21hcmdpbjoyMHB4IDA7Ym9yZGVyOjA7Ym9yZGVy
LXRvcDoxcHggZGFzaGVkICNjNWM1YzU7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNmN2Y3Zjd9
LmxlYXJuIGF7Zm9udC13ZWlnaHQ6NDAwO3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiNiODNm
NDV9LmxlYXJuIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtjb2xvcjojNzg3ZTdl
fS5sZWFybiBoMywubGVhcm4gaDQsLmxlYXJuIGg1e21hcmdpbjoxMHB4IDA7Zm9udC13ZWlnaHQ6
NTAwO2xpbmUtaGVpZ2h0OjEuMjtjb2xvcjojMDAwfS5sZWFybiBoM3tmb250LXNpemU6MjRweH0u
bGVhcm4gaDR7Zm9udC1zaXplOjE4cHh9LmxlYXJuIGg1e21hcmdpbi1ib3R0b206MDtmb250LXNp
emU6MTRweH0ubGVhcm4gdWx7cGFkZGluZzowO21hcmdpbjowIDAgMzBweCAyNXB4fS5sZWFybiBs
aXtsaW5lLWhlaWdodDoyMHB4fS5sZWFybiBwe2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjMw
MDtsaW5lLWhlaWdodDoxLjM7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MH0ucXVvdGUgcDph
ZnRlciwucXVvdGUgcDpiZWZvcmV7Zm9udC1zaXplOjUwcHg7b3BhY2l0eTouMTU7cG9zaXRpb246
YWJzb2x1dGV9LnF1b3Rle2JvcmRlcjpub25lO21hcmdpbjoyMHB4IDAgNjBweH0ucXVvdGUgcHtm
b250LXN0eWxlOml0YWxpY30ucXVvdGUgcDpiZWZvcmV7Y29udGVudDon4oCcJzt0b3A6LTIwcHg7
bGVmdDozcHh9LnF1b3RlIHA6YWZ0ZXJ7Y29udGVudDon4oCdJztib3R0b206LTQycHg7cmlnaHQ6
M3B4fS5xdW90ZSBmb290ZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOi00MHB4O3JpZ2h0OjB9
LnF1b3RlIGZvb3RlciBpbWd7Ym9yZGVyLXJhZGl1czozcHh9LnF1b3RlIGZvb3RlciBhe21hcmdp
bi1sZWZ0OjVweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnNwZWVjaC1idWJibGV7cG9zaXRpb246
cmVsYXRpdmU7cGFkZGluZzoxMHB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2JvcmRlci1y
YWRpdXM6NXB4fS5zcGVlY2gtYnViYmxlOmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1
dGU7dG9wOjEwMCU7cmlnaHQ6MzBweDtib3JkZXI6MTNweCBzb2xpZCB0cmFuc3BhcmVudDtib3Jk
ZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubGVhcm4tYmFyPi5sZWFybntwb3NpdGlvbjph
YnNvbHV0ZTt3aWR0aDoyNzJweDt0b3A6OHB4O2xlZnQ6LTMwMHB4O3BhZGRpbmc6MTBweDtib3Jk
ZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjYpO3RyYW5z
aXRpb24tcHJvcGVydHk6bGVmdDt0cmFuc2l0aW9uLWR1cmF0aW9uOi41c30jbWFpbiwjbmV3LXRv
ZG8sI3RvZG8tbGlzdCBsaSwjdG9kb2FwcCwuZWRpdHtwb3NpdGlvbjpyZWxhdGl2ZX1AbWVkaWEg
KG1pbi13aWR0aDo4OTlweCl7LmxlYXJuLWJhcnt3aWR0aDphdXRvO3BhZGRpbmctbGVmdDozMDBw
eH0ubGVhcm4tYmFyPi5sZWFybntsZWZ0OjhweH19Ym9keSxidXR0b24saHRtbHtwYWRkaW5nOjA7
bWFyZ2luOjB9YnV0dG9ue2JvcmRlcjowO2JhY2tncm91bmQ6MCAwO2ZvbnQtc2l6ZToxMDAlO3Zl
cnRpY2FsLWFsaWduOmJhc2VsaW5lO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5o
ZXJpdDtjb2xvcjppbmhlcml0Oy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2FwcGVhcmFuY2U6bm9u
ZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otZm9udC1zbW9vdGhpbmc6
YW50aWFsaWFzZWQ7Zm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9Ym9keXtmb250OjE0cHggJ0hl
bHZldGljYSBOZXVlJyxIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxLjRl
bTtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzRkNGQ0ZDttaW4td2lkdGg6MjMwcHg7bWF4LXdp
ZHRoOjU1MHB4O21hcmdpbjowIGF1dG87LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNl
ZDstbW96LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZvbnQtc21vb3RoaW5nOmFudGlhbGlh
c2VkO2ZvbnQtd2VpZ2h0OjMwMH1idXR0b24saW5wdXRbdHlwZT1jaGVja2JveF17b3V0bGluZTow
fSN0b2RvYXBwe2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MTMwcHggMCA0MHB4O2JveC1zaGFkb3c6
MCAycHggNHB4IDAgcmdiYSgwLDAsMCwuMiksMCAyNXB4IDUwcHggMCByZ2JhKDAsMCwwLC4xKX0j
dG9kb2FwcCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntmb250LXN0eWxlOml0YWxp
Yztmb250LXdlaWdodDozMDA7Y29sb3I6I2U2ZTZlNn0jdG9kb2FwcCBpbnB1dDo6LW1vei1wbGFj
ZWhvbGRlcntmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDozMDA7Y29sb3I6I2U2ZTZlNn0j
dG9kb2FwcCBpbnB1dDo6aW5wdXQtcGxhY2Vob2xkZXJ7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13
ZWlnaHQ6MzAwO2NvbG9yOiNlNmU2ZTZ9I3RvZG9hcHAgaDF7cG9zaXRpb246YWJzb2x1dGU7dG9w
Oi0xNTVweDt3aWR0aDoxMDAlO2ZvbnQtc2l6ZToxMDBweDtmb250LXdlaWdodDoxMDA7Y29sb3I6
cmdiYSgxNzUsNDcsNDcsLjE1KTstd2Via2l0LXRleHQtcmVuZGVyaW5nOm9wdGltaXplTGVnaWJp
bGl0eTstbW96LXRleHQtcmVuZGVyaW5nOm9wdGltaXplTGVnaWJpbGl0eTt0ZXh0LXJlbmRlcmlu
ZzpvcHRpbWl6ZUxlZ2liaWxpdHl9I25ldy10b2RvLC5lZGl0e21hcmdpbjowO3dpZHRoOjEwMCU7
Zm9udC1zaXplOjI0cHg7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDppbmhlcml0O2xp
bmUtaGVpZ2h0OjEuNGVtO291dGxpbmU6MDtjb2xvcjppbmhlcml0O3BhZGRpbmc6NnB4O2JvcmRl
cjoxcHggc29saWQgIzk5OTtib3gtc2hhZG93Omluc2V0IDAgLTFweCA1cHggMCByZ2JhKDAsMCww
LC4yKTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxp
YXNlZDstbW96LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZvbnQtc21vb3RoaW5nOmFudGlh
bGlhc2VkfSNuZXctdG9kb3twYWRkaW5nOjE2cHggMTZweCAxNnB4IDYwcHg7Ym9yZGVyOm5vbmU7
YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMDMpO2JveC1zaGFkb3c6aW5zZXQgMCAtMnB4IDFweCBy
Z2JhKDAsMCwwLC4wMyl9I21haW57ei1pbmRleDoyO2JvcmRlci10b3A6MXB4IHNvbGlkICNlNmU2
ZTZ9I3RvZ2dsZS1hbGx7cG9zaXRpb246YWJzb2x1dGU7dG9wOi01NXB4O2xlZnQ6LTEycHg7d2lk
dGg6NjBweDtoZWlnaHQ6MzRweDtib3JkZXI6bm9uZX0jdG9nZ2xlLWFsbDpiZWZvcmV7Y29udGVu
dDon4p2vJztmb250LXNpemU6MjJweDtjb2xvcjojZTZlNmU2O3BhZGRpbmc6MTBweCAyN3B4fSN0
b2dnbGUtYWxsOmNoZWNrZWQ6YmVmb3Jle2NvbG9yOiM3MzczNzN9I3RvZG8tbGlzdHttYXJnaW46
MDtwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lfSN0b2RvLWxpc3QgbGl7Zm9udC1zaXplOjI0cHg7
Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2VkZWRlZH0jdG9kby1saXN0IGxpOmxhc3QtY2hpbGR7
Ym9yZGVyLWJvdHRvbTpub25lfSN0b2RvLWxpc3QgbGkuZWRpdGluZ3tib3JkZXItYm90dG9tOm5v
bmU7cGFkZGluZzowfSN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRpdHtkaXNwbGF5OmJsb2NrO3dp
ZHRoOjUwNnB4O3BhZGRpbmc6MTNweCAxN3B4IDEycHg7bWFyZ2luOjAgMCAwIDQzcHh9I3RvZG8t
bGlzdCBsaS5lZGl0aW5nIC52aWV3e2Rpc3BsYXk6bm9uZX0jdG9kby1saXN0IGxpIC50b2dnbGV7
dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6NDBweDtoZWlnaHQ6YXV0bztwb3NpdGlvbjphYnNvbHV0
ZTt0b3A6MDtib3R0b206MDttYXJnaW46YXV0byAwO2JvcmRlcjpub25lOy13ZWJraXQtYXBwZWFy
YW5jZTpub25lO2FwcGVhcmFuY2U6bm9uZX0jdG9kby1saXN0IGxpIC50b2dnbGU6YWZ0ZXJ7Y29u
dGVudDp1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cu
dzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9Ii0xMCAtMTgg
MTAwIDEzNSI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiIGZpbGw9Im5vbmUiIHN0cm9r
ZT0iI2VkZWRlZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PC9zdmc+Jyl9I3RvZG8tbGlzdCBsaSAudG9n
Z2xlOmNoZWNrZWQ6YWZ0ZXJ7Y29udGVudDp1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxz
dmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDAiIGhlaWdodD0i
NDAiIHZpZXdCb3g9Ii0xMCAtMTggMTAwIDEzNSI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0i
NTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2JkZGFkNSIgc3Ryb2tlLXdpZHRoPSIzIi8+PHBhdGgg
ZmlsbD0iIzVkYzJhZiIgZD0iTTcyIDI1TDQyIDcxIDI3IDU2bC00IDQgMjAgMjAgMzQtNTJ6Ii8+
PC9zdmc+Jyl9I3RvZG8tbGlzdCBsaSBsYWJlbHt3aGl0ZS1zcGFjZTpwcmU7d29yZC1icmVhazpi
cmVhay13b3JkO3BhZGRpbmc6MTVweCA2MHB4IDE1cHggMTVweDttYXJnaW4tbGVmdDo0NXB4O2Rp
c3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6MS4yO3RyYW5zaXRpb246Y29sb3IgLjRzfSN0b2RvLWxp
c3QgbGkuY29tcGxldGVkIGxhYmVse2NvbG9yOiNkOWQ5ZDk7dGV4dC1kZWNvcmF0aW9uOmxpbmUt
dGhyb3VnaH0jdG9kby1saXN0IGxpIC5kZXN0cm95e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNv
bHV0ZTt0b3A6MDtyaWdodDoxMHB4O2JvdHRvbTowO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7bWFy
Z2luOmF1dG8gMCAxMXB4O2ZvbnQtc2l6ZTozMHB4O2NvbG9yOiNjYzlhOWE7dHJhbnNpdGlvbjpj
b2xvciAuMnMgZWFzZS1vdXR9I2ZpbHRlcnMsI2Zvb3RlcjpiZWZvcmV7cG9zaXRpb246YWJzb2x1
dGU7cmlnaHQ6MDtsZWZ0OjB9I3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3Zlcntjb2xvcjojYWY1
YjVlfSNmaWx0ZXJzIGxpIGEsI2luZm8gYXtjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpu
b25lfSN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXJ7Y29udGVudDonw5cnfSN0b2RvLWxpc3Qg
bGk6aG92ZXIgLmRlc3Ryb3l7ZGlzcGxheTpibG9ja30jdG9kby1saXN0IGxpIC5lZGl0e2Rpc3Bs
YXk6bm9uZX0jdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOi0x
cHh9I2Zvb3Rlcntjb2xvcjojNzc3O3BhZGRpbmc6MTBweCAxNXB4O2hlaWdodDoyMHB4O2JvcmRl
ci10b3A6MXB4IHNvbGlkICNlNmU2ZTZ9I2Zvb3RlcjpiZWZvcmV7Y29udGVudDonJztib3R0b206
MDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Ym94LXNoYWRvdzowIDFweCAxcHggcmdiYSgw
LDAsMCwuMiksMCA4cHggMCAtM3B4ICNmNmY2ZjYsMCA5cHggMXB4IC0zcHggcmdiYSgwLDAsMCwu
MiksMCAxNnB4IDAgLTZweCAjZjZmNmY2LDAgMTdweCAycHggLTZweCByZ2JhKDAsMCwwLC4yKX0j
dG9kby1jb3VudHtmbG9hdDpsZWZ0O3RleHQtYWxpZ246bGVmdH0jdG9kby1jb3VudCBzdHJvbmd7
Zm9udC13ZWlnaHQ6MzAwfSNmaWx0ZXJze21hcmdpbjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5v
bmV9I2ZpbHRlcnMgbGl7ZGlzcGxheTppbmxpbmV9I2ZpbHRlcnMgbGkgYXttYXJnaW46M3B4O3Bh
ZGRpbmc6M3B4IDdweDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6
M3B4fSNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQsI2ZpbHRlcnMgbGkgYTpob3Zlcntib3JkZXItY29s
b3I6cmdiYSgxNzUsNDcsNDcsLjEpfSNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWR7Ym9yZGVyLWNvbG9y
OnJnYmEoMTc1LDQ3LDQ3LC4yKX0jY2xlYXItY29tcGxldGVkLGh0bWwgI2NsZWFyLWNvbXBsZXRl
ZDphY3RpdmV7ZmxvYXQ6cmlnaHQ7bGluZS1oZWlnaHQ6MjBweDt0ZXh0LWRlY29yYXRpb246bm9u
ZTtjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZX0jY2xlYXItY29tcGxldGVkOmhvdmVy
LCNpbmZvIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0jaW5mb3ttYXJnaW46NjVw
eCBhdXRvIDA7Y29sb3I6I2JmYmZiZjtmb250LXNpemU6MTBweDt0ZXh0LXNoYWRvdzowIDFweCAw
IHJnYmEoMjU1LDI1NSwyNTUsLjUpfSNpbmZvIHB7bGluZS1oZWlnaHQ6MX0jaW5mbyBhe2ZvbnQt
d2VpZ2h0OjQwMH1AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJh
dGlvOjApeyN0b2RvLWxpc3QgbGkgLnRvZ2dsZSwjdG9nZ2xlLWFsbHtiYWNrZ3JvdW5kOjAgMH0j
dG9kby1saXN0IGxpIC50b2dnbGV7aGVpZ2h0OjQwcHh9I3RvZ2dsZS1hbGx7LXdlYmtpdC10cmFu
c2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKTstd2Via2l0LWFwcGVh
cmFuY2U6bm9uZTthcHBlYXJhbmNlOm5vbmV9fUBtZWRpYSAobWF4LXdpZHRoOjQzMHB4KXsjZm9v
dGVye2hlaWdodDo1MHB4fSNmaWx0ZXJze2JvdHRvbToxMHB4fX0KXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy92ZW5kb3It
OTgzNmFjOGIwMTZmY2VhNmY4OWNjZjkyOTE3NzcyZjYuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Fzc2V0cy92ZW5kb3ItOTgzNmFjOGIwMTZmY2VhNmY4OWNjZjkyOTE3NzcyZjYuanMKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZDQyYmEyMGIwZDkxODUwYTMwMjM0ODE2NGVhOWE5ZTNlMzg0MWU4MwotLS0gL2Rldi9u
dWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci05ODM2YWM4YjAxNmZj
ZWE2Zjg5Y2NmOTI5MTc3NzJmNi5qcwpAQCAtMCwwICsxLDE4IEBACitmdW5jdGlvbiBjcmVhdGVE
ZXByZWNhdGVkTW9kdWxlKGUpe2RlZmluZShlLFsiZXhwb3J0cyIsImVtYmVyLXJlc29sdmVyL3Jl
c29sdmVyIiwiZW1iZXIiXSxmdW5jdGlvbih0LHIsbil7bi5kZWZhdWx0LmRlcHJlY2F0ZSgiVXNh
Z2Ugb2YgYCIrZSsiYCBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVwZGF0ZSB0byBgZW1i
ZXItcmVzb2x2ZXJgLiIsITEse2lkOiJlbWJlci1yZXNvbHZlci5sZWdhY3ktc2hpbXMiLHVudGls
OiIzLjAuMCJ9KSx0LmRlZmF1bHQ9ci5kZWZhdWx0fSl9d2luZG93LkVtYmVyRU5WPXtGRUFUVVJF
Uzp7fX07dmFyIHJ1bm5pbmdUZXN0cz0hMSxsb2FkZXIsZGVmaW5lLHJlcXVpcmVNb2R1bGUscmVx
dWlyZSxyZXF1aXJlanM7IWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KCl7bD17
ZGVmaW5lOjAscmVxdWlyZTowLHJlaWZ5OjAsZmluZERlcHM6MCxtb2R1bGVzOjAsZXhwb3J0czow
LHJlc29sdmU6MCxyZXNvbHZlUmVsYXRpdmU6MCxmaW5kTW9kdWxlOjAscGVuZGluZ1F1ZXVlTGVu
Z3RoOjB9LHJlcXVpcmVqcy5fc3RhdHM9bH1mdW5jdGlvbiByKGUpe3Rocm93IG5ldyBFcnJvcigi
YW4gdW5zdXBwb3J0ZWQgbW9kdWxlIHdhcyBkZWZpbmVkLCBleHBlY3RlZCBgZGVmaW5lKG5hbWUs
IGRlcHMsIG1vZHVsZSlgIGluc3RlYWQgZ290OiBgIitlKyJgIGFyZ3VtZW50cyB0byBkZWZpbmVg
Iil9ZnVuY3Rpb24gbihlLHQscixuKXtsLm1vZHVsZXMrKyx0aGlzLmlkPWgrKyx0aGlzLm5hbWU9
ZSx0aGlzLmRlcHM9IXQubGVuZ3RoJiZyLmxlbmd0aD9tOnQsdGhpcy5tb2R1bGU9e2V4cG9ydHM6
e319LHRoaXMuY2FsbGJhY2s9cix0aGlzLmZpbmFsaXplZD0hMSx0aGlzLmhhc0V4cG9ydHNBc0Rl
cD0hMSx0aGlzLmlzQWxpYXM9bix0aGlzLnJlaWZpZWQ9bmV3IEFycmF5KHQubGVuZ3RoKSx0aGlz
Ll9mb3VuZERlcHM9ITEsdGhpcy5pc1BlbmRpbmc9ITF9ZnVuY3Rpb24gaShlKXt0aGlzLm5hbWU9
ZX1mdW5jdGlvbiBvKGUsdCl7dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGUg
YCIrZSsiYCBpbXBvcnRlZCBmcm9tIGAiK3QrImAiKX1mdW5jdGlvbiBhKGUsdCxyKXtsLmZpbmRN
b2R1bGUrKztmb3IodmFyIG49ZFtlXXx8ZFtlKyIvaW5kZXgiXTtuJiZuLmlzQWxpYXM7KW49ZFtu
Lm5hbWVdO3JldHVybiBufHxvKGUsdCksIXJ8fG4uZmluYWxpemVkfHxuLmlzUGVuZGluZ3x8KG4u
ZmluZERlcHMociksci5wdXNoKG4pLGwucGVuZGluZ1F1ZXVlTGVuZ3RoKyspLG59ZnVuY3Rpb24g
cyhlLHQpe2lmKGwucmVzb2x2ZSsrLCIuIiE9PWUuY2hhckF0KDApKXJldHVybiBlO2wucmVzb2x2
ZVJlbGF0aXZlKys7Zm9yKHZhciByPWUuc3BsaXQoIi8iKSxuPXQuc3BsaXQoIi8iKSxpPW4uc2xp
Y2UoMCwtMSksbz0wLGE9ci5sZW5ndGg7bzxhO28rKyl7dmFyIHM9cltvXTtpZigiLi4iPT09cyl7
aWYoMD09PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGFjY2VzcyBwYXJlbnQgbW9k
dWxlIG9mIHJvb3QiKTtpLnBvcCgpfWVsc2V7aWYoIi4iPT09cyljb250aW51ZTtpLnB1c2gocyl9
fXJldHVybiBpLmpvaW4oIi8iKX1mdW5jdGlvbiB1KGUpe3JldHVybiEoIWRbZV0mJiFkW2UrIi9p
bmRleCJdKX12YXIgbCxjPXtsb2FkZXI6bG9hZGVyLGRlZmluZTpkZWZpbmUscmVxdWlyZU1vZHVs
ZTpyZXF1aXJlTW9kdWxlLHJlcXVpcmU6cmVxdWlyZSxyZXF1aXJlanM6cmVxdWlyZWpzfTtyZXF1
aXJlanM9cmVxdWlyZT1yZXF1aXJlTW9kdWxlPWZ1bmN0aW9uKGUpe2wucmVxdWlyZSsrO2Zvcih2
YXIgdD1bXSxyPWEoZSwiKHJlcXVpcmUpIix0KSxuPXQubGVuZ3RoLTE7bj49MDtuLS0pdFtuXS5l
eHBvcnRzKCk7cmV0dXJuIHIubW9kdWxlLmV4cG9ydHN9LHQoKSxsb2FkZXI9e25vQ29uZmxpY3Q6
ZnVuY3Rpb24odCl7dmFyIHIsbjtmb3IociBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJmMuaGFz
T3duUHJvcGVydHkocikmJihuPXRbcl0sZVtuXT1lW3JdLGVbcl09Y1tyXSl9fTt2YXIgZjtmPUFy
cmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJh
eV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTt2YXIgZD17fSxwPXt9LGg9
MCxtPVsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXTtuLnByb3RvdHlwZS5tYWtlRGVmYXVs
dEV4cG9ydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubW9kdWxlLmV4cG9ydHM7bnVsbD09PWV8fCJv
YmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGV8fHZvaWQgMCE9PWUuZGVmYXVs
dHx8KGUuZGVmYXVsdD1lKX0sbi5wcm90b3R5cGUuZXhwb3J0cz1mdW5jdGlvbigpe2lmKHRoaXMu
ZmluYWxpemVkKXJldHVybiB0aGlzLm1vZHVsZS5leHBvcnRzO2wuZXhwb3J0cysrLHRoaXMuZmlu
YWxpemVkPSEwLHRoaXMuaXNQZW5kaW5nPSExLGxvYWRlci53cmFwTW9kdWxlcyYmKHRoaXMuY2Fs
bGJhY2s9bG9hZGVyLndyYXBNb2R1bGVzKHRoaXMubmFtZSx0aGlzLmNhbGxiYWNrKSksdGhpcy5y
ZWlmeSgpO3ZhciBlPXRoaXMuY2FsbGJhY2suYXBwbHkodGhpcyx0aGlzLnJlaWZpZWQpO3JldHVy
biB0aGlzLmhhc0V4cG9ydHNBc0RlcCYmdm9pZCAwPT09ZXx8KHRoaXMubW9kdWxlLmV4cG9ydHM9
ZSksdGhpcy5tYWtlRGVmYXVsdEV4cG9ydCgpLHRoaXMubW9kdWxlLmV4cG9ydHN9LG4ucHJvdG90
eXBlLnVuc2VlPWZ1bmN0aW9uKCl7dGhpcy5maW5hbGl6ZWQ9ITEsdGhpcy5fZm91bmREZXBzPSEx
LHRoaXMuaXNQZW5kaW5nPSExLHRoaXMubW9kdWxlPXtleHBvcnRzOnt9fX0sbi5wcm90b3R5cGUu
cmVpZnk9ZnVuY3Rpb24oKXtsLnJlaWZ5Kys7Zm9yKHZhciBlPXRoaXMucmVpZmllZCx0PTA7dDxl
Lmxlbmd0aDt0Kyspe3ZhciByPWVbdF07ZVt0XT1yLmV4cG9ydHM/ci5leHBvcnRzOnIubW9kdWxl
LmV4cG9ydHMoKX19LG4ucHJvdG90eXBlLmZpbmREZXBzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLl9m
b3VuZERlcHMpe2wuZmluZERlcHMrKyx0aGlzLl9mb3VuZERlcHM9ITAsdGhpcy5pc1BlbmRpbmc9
ITA7Zm9yKHZhciB0PXRoaXMuZGVwcyxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl0saT10
aGlzLnJlaWZpZWRbcl09e2V4cG9ydHM6dm9pZCAwLG1vZHVsZTp2b2lkIDB9OyJleHBvcnRzIj09
PW4/KHRoaXMuaGFzRXhwb3J0c0FzRGVwPSEwLGkuZXhwb3J0cz10aGlzLm1vZHVsZS5leHBvcnRz
KToicmVxdWlyZSI9PT1uP2kuZXhwb3J0cz10aGlzLm1ha2VSZXF1aXJlKCk6Im1vZHVsZSI9PT1u
P2kuZXhwb3J0cz10aGlzLm1vZHVsZTppLm1vZHVsZT1hKHMobix0aGlzLm5hbWUpLHRoaXMubmFt
ZSxlKX19fSxuLnByb3RvdHlwZS5tYWtlUmVxdWlyZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMubmFt
ZSx0PWZ1bmN0aW9uKHQpe3JldHVybiByZXF1aXJlKHModCxlKSl9O3JldHVybiB0LmRlZmF1bHQ9
dCx0Lmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdShzKHQsZSkpfSx0fSxkZWZpbmU9ZnVuY3Rpb24o
ZSx0LG8pe2wuZGVmaW5lKyssYXJndW1lbnRzLmxlbmd0aDwyJiZyKGFyZ3VtZW50cy5sZW5ndGgp
LGYodCl8fChvPXQsdD1bXSksbyBpbnN0YW5jZW9mIGk/ZFtlXT1uZXcgbihvLm5hbWUsdCxvLCEw
KTpkW2VdPW5ldyBuKGUsdCxvLCExKX0sZGVmaW5lLnBldGFsPXt9LGRlZmluZS5hbGlhcz1mdW5j
dGlvbihlKXtyZXR1cm4gbmV3IGkoZSl9LHJlcXVpcmVqcy5lbnRyaWVzPXJlcXVpcmVqcy5fZWFr
X3NlZW49ZCxyZXF1aXJlanMuaGFzPXUscmVxdWlyZWpzLnVuc2VlPWZ1bmN0aW9uKGUpe2EoZSwi
KHVuc2VlKSIsITEpLnVuc2VlKCl9LHJlcXVpcmVqcy5jbGVhcj1mdW5jdGlvbigpe3QoKSxyZXF1
aXJlanMuZW50cmllcz1yZXF1aXJlanMuX2Vha19zZWVuPWQ9e30scD17fX0sZGVmaW5lKCJmb28i
LGZ1bmN0aW9uKCl7fSksZGVmaW5lKCJmb28vYmFyIixbXSxmdW5jdGlvbigpe30pLGRlZmluZSgi
Zm9vL2FzZGYiLFsibW9kdWxlIiwiZXhwb3J0cyIsInJlcXVpcmUiXSxmdW5jdGlvbihlLHQscil7
ci5oYXMoImZvby9iYXIiKSYmcigiZm9vL2JhciIpfSksZGVmaW5lKCJmb28vYmF6IixbXSxkZWZp
bmUuYWxpYXMoImZvbyIpKSxkZWZpbmUoImZvby9xdXoiLGRlZmluZS5hbGlhcygiZm9vIikpLGRl
ZmluZSgiZm9vL2JhciIsWyJmb28iLCIuL3F1eiIsIi4vYmF6IiwiLi9hc2RmIiwiLi9iYXIiLCIu
Li9mb28iXSxmdW5jdGlvbigpe30pLGRlZmluZSgiZm9vL21haW4iLFsiZm9vL2JhciJdLGZ1bmN0
aW9uKCl7fSkscmVxdWlyZSgiZm9vL21haW4iKSxyZXF1aXJlLnVuc2VlKCJmb28vYmFyIikscmVx
dWlyZWpzLmNsZWFyKCksIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9m
IG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz17cmVxdWlyZTpyZXF1aXJl
LGRlZmluZTpkZWZpbmV9KX0odGhpcyksZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIG1v
ZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRv
Y3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9y
KCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9
OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGUs
dCl7ZnVuY3Rpb24gcihlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgscj1vZS50
eXBlKGUpO3JldHVybiJmdW5jdGlvbiIhPT1yJiYhb2UuaXNXaW5kb3coZSkmJigiYXJyYXkiPT09
cnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9ZnVuY3Rpb24gbihl
LHQscil7aWYob2UuaXNGdW5jdGlvbih0KSlyZXR1cm4gb2UuZ3JlcChlLGZ1bmN0aW9uKGUsbil7
cmV0dXJuISF0LmNhbGwoZSxuLGUpIT09cn0pO2lmKHQubm9kZVR5cGUpcmV0dXJuIG9lLmdyZXAo
ZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1yfSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtp
ZihtZS50ZXN0KHQpKXJldHVybiBvZS5maWx0ZXIodCxlLHIpO3Q9b2UuZmlsdGVyKHQsZSl9cmV0
dXJuIG9lLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gWi5jYWxsKHQsZSk+LTEhPT1yfSl9ZnVu
Y3Rpb24gaShlLHQpe2Zvcig7KGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlOyk7cmV0dXJuIGV9ZnVu
Y3Rpb24gbyhlKXt2YXIgdD17fTtyZXR1cm4gb2UuZWFjaChlLm1hdGNoKHdlKXx8W10sZnVuY3Rp
b24oZSxyKXt0W3JdPSEwfSksdH1mdW5jdGlvbiBhKCl7Ry5yZW1vdmVFdmVudExpc3RlbmVyKCJE
T01Db250ZW50TG9hZGVkIixhKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGEpLG9lLnJl
YWR5KCl9ZnVuY3Rpb24gcygpe3RoaXMuZXhwYW5kbz1vZS5leHBhbmRvK3MudWlkKyt9ZnVuY3Rp
b24gdShlLHQscil7dmFyIG47aWYodm9pZCAwPT09ciYmMT09PWUubm9kZVR5cGUpaWYobj0iZGF0
YS0iK3QucmVwbGFjZShOZSwiLSQmIikudG9Mb3dlckNhc2UoKSxyPWUuZ2V0QXR0cmlidXRlKG4p
LCJzdHJpbmciPT10eXBlb2Ygcil7dHJ5e3I9InRydWUiPT09cnx8ImZhbHNlIiE9PXImJigibnVs
bCI9PT1yP251bGw6K3IrIiI9PT1yPytyOlRlLnRlc3Qocik/b2UucGFyc2VKU09OKHIpOnIpfWNh
dGNoKGUpe31PZS5zZXQoZSx0LHIpfWVsc2Ugcj12b2lkIDA7cmV0dXJuIHJ9ZnVuY3Rpb24gbChl
LHQscixuKXt2YXIgaSxvPTEsYT0yMCxzPW4/ZnVuY3Rpb24oKXtyZXR1cm4gbi5jdXIoKX06ZnVu
Y3Rpb24oKXtyZXR1cm4gb2UuY3NzKGUsdCwiIil9LHU9cygpLGw9ciYmclszXXx8KG9lLmNzc051
bWJlclt0XT8iIjoicHgiKSxjPShvZS5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJkFlLmV4
ZWMob2UuY3NzKGUsdCkpO2lmKGMmJmNbM10hPT1sKXtsPWx8fGNbM10scj1yfHxbXSxjPSt1fHwx
O2RvIG89b3x8Ii41IixjLz1vLG9lLnN0eWxlKGUsdCxjK2wpO3doaWxlKG8hPT0obz1zKCkvdSkm
JjEhPT1vJiYtLWEpfXJldHVybiByJiYoYz0rY3x8K3V8fDAsaT1yWzFdP2MrKHJbMV0rMSkqclsy
XTorclsyXSxuJiYobi51bml0PWwsbi5zdGFydD1jLG4uZW5kPWkpKSxpfWZ1bmN0aW9uIGMoZSx0
KXt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRF
bGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgZS5xdWVyeVNlbGVj
dG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdO3JldHVybiB2b2lkIDA9PT10fHx0
JiZvZS5ub2RlTmFtZShlLHQpP29lLm1lcmdlKFtlXSxyKTpyfWZ1bmN0aW9uIGYoZSx0KXtmb3Io
dmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspRWUuc2V0KGVbcl0sImdsb2JhbEV2YWwiLCF0fHxF
ZS5nZXQodFtyXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBkKGUsdCxyLG4saSl7Zm9yKHZhciBv
LGEscyx1LGwsZCxwPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGg9W10sbT0wLHY9ZS5sZW5n
dGg7bTx2O20rKylpZihvPWVbbV0sb3x8MD09PW8paWYoIm9iamVjdCI9PT1vZS50eXBlKG8pKW9l
Lm1lcmdlKGgsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihJZS50ZXN0KG8pKXtmb3IoYT1hfHxw
LmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KExlLmV4ZWMobyl8fFsiIiwi
Il0pWzFdLnRvTG93ZXJDYXNlKCksdT1NZVtzXXx8TWUuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsx
XStvZS5odG1sUHJlZmlsdGVyKG8pK3VbMl0sZD11WzBdO2QtLTspYT1hLmxhc3RDaGlsZDtvZS5t
ZXJnZShoLGEuY2hpbGROb2RlcyksYT1wLmZpcnN0Q2hpbGQsYS50ZXh0Q29udGVudD0iIn1lbHNl
IGgucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmb3IocC50ZXh0Q29udGVudD0iIixtPTA7bz1o
W20rK107KWlmKG4mJm9lLmluQXJyYXkobyxuKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPW9l
LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxhPWMocC5hcHBlbmRDaGlsZChvKSwic2NyaXB0
IiksbCYmZihhKSxyKWZvcihkPTA7bz1hW2QrK107KURlLnRlc3Qoby50eXBlfHwiIikmJnIucHVz
aChvKTtyZXR1cm4gcH1mdW5jdGlvbiBwKCl7cmV0dXJuITB9ZnVuY3Rpb24gaCgpe3JldHVybiEx
fWZ1bmN0aW9uIG0oKXt0cnl7cmV0dXJuIEcuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fWZ1bmN0
aW9uIHYoZSx0LHIsbixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXsic3RyaW5n
IiE9dHlwZW9mIHImJihuPW58fHIscj12b2lkIDApO2ZvcihzIGluIHQpdihlLHMscixuLHRbc10s
byk7cmV0dXJuIGV9aWYobnVsbD09biYmbnVsbD09aT8oaT1yLG49cj12b2lkIDApOm51bGw9PWkm
Jigic3RyaW5nIj09dHlwZW9mIHI/KGk9bixuPXZvaWQgMCk6KGk9bixuPXIscj12b2lkIDApKSxp
PT09ITEpaT1oO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLGk9ZnVuY3Rp
b24oZSl7cmV0dXJuIG9lKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9
YS5ndWlkfHwoYS5ndWlkPW9lLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe29lLmV2ZW50LmFk
ZCh0aGlzLHQsaSxuLHIpfSl9ZnVuY3Rpb24gYihlLHQpe3JldHVybiBvZS5ub2RlTmFtZShlLCJ0
YWJsZSIpJiZvZS5ub2RlTmFtZSgxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/
ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVy
RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6ZX1mdW5jdGlvbiBnKGUpe3JldHVybiBl
LnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rp
b24geShlKXt2YXIgdD1VZS5leGVjKGUudHlwZSk7cmV0dXJuIHQ/ZS50eXBlPXRbMV06ZS5yZW1v
dmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIF8oZSx0KXt2YXIgcixuLGksbyxhLHMsdSxs
O2lmKDE9PT10Lm5vZGVUeXBlKXtpZihFZS5oYXNEYXRhKGUpJiYobz1FZS5hY2Nlc3MoZSksYT1F
ZS5zZXQodCxvKSxsPW8uZXZlbnRzKSl7ZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9O2Zvcihp
IGluIGwpZm9yKHI9MCxuPWxbaV0ubGVuZ3RoO3I8bjtyKyspb2UuZXZlbnQuYWRkKHQsaSxsW2ld
W3JdKX1PZS5oYXNEYXRhKGUpJiYocz1PZS5hY2Nlc3MoZSksdT1vZS5leHRlbmQoe30scyksT2Uu
c2V0KHQsdSkpfX1mdW5jdGlvbiB3KGUsdCl7dmFyIHI9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp
OyJpbnB1dCI9PT1yJiZSZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQi
IT09ciYmInRleHRhcmVhIiE9PXJ8fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVu
Y3Rpb24geChlLHQscixuKXt0PVguYXBwbHkoW10sdCk7dmFyIGksbyxhLHMsdSxsLGY9MCxwPWUu
bGVuZ3RoLGg9cC0xLG09dFswXSx2PW9lLmlzRnVuY3Rpb24obSk7aWYodnx8cD4xJiYic3RyaW5n
Ij09dHlwZW9mIG0mJiFuZS5jaGVja0Nsb25lJiZCZS50ZXN0KG0pKXJldHVybiBlLmVhY2goZnVu
Y3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT1tLmNhbGwodGhpcyxpLG8uaHRtbCgpKSks
eChvLHQscixuKX0pO2lmKHAmJihpPWQodCxlWzBdLm93bmVyRG9jdW1lbnQsITEsZSxuKSxvPWku
Zmlyc3RDaGlsZCwxPT09aS5jaGlsZE5vZGVzLmxlbmd0aCYmKGk9byksb3x8bikpe2ZvcihhPW9l
Lm1hcChjKGksInNjcmlwdCIpLGcpLHM9YS5sZW5ndGg7ZjxwO2YrKyl1PWksZiE9PWgmJih1PW9l
LmNsb25lKHUsITAsITApLHMmJm9lLm1lcmdlKGEsYyh1LCJzY3JpcHQiKSkpLHIuY2FsbChlW2Zd
LHUsZik7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsb2UubWFwKGEseSks
Zj0wO2Y8cztmKyspdT1hW2ZdLERlLnRlc3QodS50eXBlfHwiIikmJiFFZS5hY2Nlc3ModSwiZ2xv
YmFsRXZhbCIpJiZvZS5jb250YWlucyhsLHUpJiYodS5zcmM/b2UuX2V2YWxVcmwmJm9lLl9ldmFs
VXJsKHUuc3JjKTpvZS5nbG9iYWxFdmFsKHUudGV4dENvbnRlbnQucmVwbGFjZShXZSwiIikpKX1y
ZXR1cm4gZX1mdW5jdGlvbiBrKGUsdCxyKXtmb3IodmFyIG4saT10P29lLmZpbHRlcih0LGUpOmUs
bz0wO251bGwhPShuPWlbb10pO28rKylyfHwxIT09bi5ub2RlVHlwZXx8b2UuY2xlYW5EYXRhKGMo
bikpLG4ucGFyZW50Tm9kZSYmKHImJm9lLmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmZihj
KG4sInNjcmlwdCIpKSxuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobikpO3JldHVybiBlfWZ1bmN0
aW9uIEMoZSx0KXt2YXIgcj1vZSh0LmNyZWF0ZUVsZW1lbnQoZSkpLmFwcGVuZFRvKHQuYm9keSks
bj1vZS5jc3MoclswXSwiZGlzcGxheSIpO3JldHVybiByLmRldGFjaCgpLG59ZnVuY3Rpb24gRShl
KXt2YXIgdD1HLHI9S2VbZV07cmV0dXJuIHJ8fChyPUMoZSx0KSwibm9uZSIhPT1yJiZyfHwoJGU9
KCRlfHxvZSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIp
KS5hcHBlbmRUbyh0LmRvY3VtZW50RWxlbWVudCksdD0kZVswXS5jb250ZW50RG9jdW1lbnQsdC53
cml0ZSgpLHQuY2xvc2UoKSxyPUMoZSx0KSwkZS5kZXRhY2goKSksS2VbZV09cikscn1mdW5jdGlv
biBPKGUsdCxyKXt2YXIgbixpLG8sYSxzPWUuc3R5bGU7cmV0dXJuIHI9cnx8WWUoZSksYT1yP3Iu
Z2V0UHJvcGVydHlWYWx1ZSh0KXx8clt0XTp2b2lkIDAsIiIhPT1hJiZ2b2lkIDAhPT1hfHxvZS5j
b250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChhPW9lLnN0eWxlKGUsdCkpLHImJiFuZS5waXhl
bE1hcmdpblJpZ2h0KCkmJkdlLnRlc3QoYSkmJlFlLnRlc3QodCkmJihuPXMud2lkdGgsaT1zLm1p
bldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9ci53
aWR0aCxzLndpZHRoPW4scy5taW5XaWR0aD1pLHMubWF4V2lkdGg9byksdm9pZCAwIT09YT9hKyIi
OmF9ZnVuY3Rpb24gVChlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpP3ZvaWQg
ZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX1mdW5j
dGlvbiBOKGUpe2lmKGUgaW4gbnQpcmV0dXJuIGU7Zm9yKHZhciB0PWVbMF0udG9VcHBlckNhc2Uo
KStlLnNsaWNlKDEpLHI9cnQubGVuZ3RoO3ItLTspaWYoZT1ydFtyXSt0LGUgaW4gbnQpcmV0dXJu
IGV9ZnVuY3Rpb24gUyhlLHQscil7dmFyIG49QWUuZXhlYyh0KTtyZXR1cm4gbj9NYXRoLm1heCgw
LG5bMl0tKHJ8fDApKSsoblszXXx8InB4Iik6dH1mdW5jdGlvbiBBKGUsdCxyLG4saSl7Zm9yKHZh
ciBvPXI9PT0obj8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PXQ/MTowLGE9MDtvPDQ7
bys9MikibWFyZ2luIj09PXImJihhKz1vZS5jc3MoZSxyK1BlW29dLCEwLGkpKSxuPygiY29udGVu
dCI9PT1yJiYoYS09b2UuY3NzKGUsInBhZGRpbmciK1BlW29dLCEwLGkpKSwibWFyZ2luIiE9PXIm
JihhLT1vZS5jc3MoZSwiYm9yZGVyIitQZVtvXSsiV2lkdGgiLCEwLGkpKSk6KGErPW9lLmNzcyhl
LCJwYWRkaW5nIitQZVtvXSwhMCxpKSwicGFkZGluZyIhPT1yJiYoYSs9b2UuY3NzKGUsImJvcmRl
ciIrUGVbb10rIldpZHRoIiwhMCxpKSkpO3JldHVybiBhfWZ1bmN0aW9uIFAoZSx0LHIpe3ZhciBu
PSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPVllKGUpLGE9
ImJvcmRlci1ib3giPT09b2UuY3NzKGUsImJveFNpemluZyIsITEsbyk7aWYoaTw9MHx8bnVsbD09
aSl7aWYoaT1PKGUsdCxvKSwoaTwwfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksR2UudGVzdChp
KSlyZXR1cm4gaTtuPWEmJihuZS5ib3hTaXppbmdSZWxpYWJsZSgpfHxpPT09ZS5zdHlsZVt0XSks
aT1wYXJzZUZsb2F0KGkpfHwwfXJldHVybiBpK0EoZSx0LHJ8fChhPyJib3JkZXIiOiJjb250ZW50
IiksbixvKSsicHgifWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIHIsbixpLG89W10sYT0wLHM9ZS5s
ZW5ndGg7YTxzO2ErKyluPWVbYV0sbi5zdHlsZSYmKG9bYV09RWUuZ2V0KG4sIm9sZGRpc3BsYXki
KSxyPW4uc3R5bGUuZGlzcGxheSx0PyhvW2FdfHwibm9uZSIhPT1yfHwobi5zdHlsZS5kaXNwbGF5
PSIiKSwiIj09PW4uc3R5bGUuZGlzcGxheSYmamUobikmJihvW2FdPUVlLmFjY2VzcyhuLCJvbGRk
aXNwbGF5IixFKG4ubm9kZU5hbWUpKSkpOihpPWplKG4pLCJub25lIj09PXImJml8fEVlLnNldChu
LCJvbGRkaXNwbGF5IixpP3I6b2UuY3NzKG4sImRpc3BsYXkiKSkpKTtmb3IoYT0wO2E8czthKysp
bj1lW2FdLG4uc3R5bGUmJih0JiYibm9uZSIhPT1uLnN0eWxlLmRpc3BsYXkmJiIiIT09bi5zdHls
ZS5kaXNwbGF5fHwobi5zdHlsZS5kaXNwbGF5PXQ/b1thXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9
ZnVuY3Rpb24gUihlLHQscixuLGkpe3JldHVybiBuZXcgUi5wcm90b3R5cGUuaW5pdChlLHQscixu
LGkpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aXQ9dm9pZCAw
fSksaXQ9b2Uubm93KCl9ZnVuY3Rpb24gRChlLHQpe3ZhciByLG49MCxpPXtoZWlnaHQ6ZX07Zm9y
KHQ9dD8xOjA7bjw0O24rPTItdClyPVBlW25dLGlbIm1hcmdpbiIrcl09aVsicGFkZGluZyIrcl09
ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gTShlLHQscil7Zm9y
KHZhciBuLGk9KEgudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoSC50d2VlbmVyc1siKiJdKSxvPTAs
YT1pLmxlbmd0aDtvPGE7bysrKWlmKG49aVtvXS5jYWxsKHIsdCxlKSlyZXR1cm4gbn1mdW5jdGlv
biBJKGUsdCxyKXt2YXIgbixpLG8sYSxzLHUsbCxjLGY9dGhpcyxkPXt9LHA9ZS5zdHlsZSxoPWUu
bm9kZVR5cGUmJmplKGUpLG09RWUuZ2V0KGUsImZ4c2hvdyIpO3IucXVldWV8fChzPW9lLl9xdWV1
ZUhvb2tzKGUsImZ4IiksbnVsbD09cy51bnF1ZXVlZCYmKHMudW5xdWV1ZWQ9MCx1PXMuZW1wdHku
ZmlyZSxzLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtzLnVucXVldWVkfHx1KCl9KSxzLnVucXVldWVk
KyssZi5hbHdheXMoZnVuY3Rpb24oKXtmLmFsd2F5cyhmdW5jdGlvbigpe3MudW5xdWV1ZWQtLSxv
ZS5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8cy5lbXB0eS5maXJlKCl9KX0pKSwxPT09ZS5ub2RlVHlw
ZSYmKCJoZWlnaHQiaW4gdHx8IndpZHRoImluIHQpJiYoci5vdmVyZmxvdz1bcC5vdmVyZmxvdyxw
Lm92ZXJmbG93WCxwLm92ZXJmbG93WV0sbD1vZS5jc3MoZSwiZGlzcGxheSIpLGM9Im5vbmUiPT09
bD9FZS5nZXQoZSwib2xkZGlzcGxheSIpfHxFKGUubm9kZU5hbWUpOmwsImlubGluZSI9PT1jJiYi
bm9uZSI9PT1vZS5jc3MoZSwiZmxvYXQiKSYmKHAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLHIu
b3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGYuYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVy
Zmxvdz1yLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPXIub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9
ci5vdmVyZmxvd1syXX0pKTtmb3IobiBpbiB0KWlmKGk9dFtuXSxhdC5leGVjKGkpKXtpZihkZWxl
dGUgdFtuXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGg/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93
IiE9PWl8fCFtfHx2b2lkIDA9PT1tW25dKWNvbnRpbnVlO2g9ITB9ZFtuXT1tJiZtW25dfHxvZS5z
dHlsZShlLG4pfWVsc2UgbD12b2lkIDA7aWYob2UuaXNFbXB0eU9iamVjdChkKSkiaW5saW5lIj09
PSgibm9uZSI9PT1sP0UoZS5ub2RlTmFtZSk6bCkmJihwLmRpc3BsYXk9bCk7ZWxzZXttPyJoaWRk
ZW4iaW4gbSYmKGg9bS5oaWRkZW4pOm09RWUuYWNjZXNzKGUsImZ4c2hvdyIse30pLG8mJihtLmhp
ZGRlbj0haCksaD9vZShlKS5zaG93KCk6Zi5kb25lKGZ1bmN0aW9uKCl7b2UoZSkuaGlkZSgpfSks
Zi5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7RWUucmVtb3ZlKGUsImZ4c2hvdyIpO2Zvcih0IGluIGQp
b2Uuc3R5bGUoZSx0LGRbdF0pfSk7Zm9yKG4gaW4gZClhPU0oaD9tW25dOjAsbixmKSxuIGluIG18
fChtW25dPWEuc3RhcnQsaCYmKGEuZW5kPWEuc3RhcnQsYS5zdGFydD0id2lkdGgiPT09bnx8Imhl
aWdodCI9PT1uPzE6MCkpfX1mdW5jdGlvbiBGKGUsdCl7dmFyIHIsbixpLG8sYTtmb3IociBpbiBl
KWlmKG49b2UuY2FtZWxDYXNlKHIpLGk9dFtuXSxvPWVbcl0sb2UuaXNBcnJheShvKSYmKGk9b1sx
XSxvPWVbcl09b1swXSksciE9PW4mJihlW25dPW8sZGVsZXRlIGVbcl0pLGE9b2UuY3NzSG9va3Nb
bl0sYSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW25dO2ZvcihyIGluIG8p
ciBpbiBlfHwoZVtyXT1vW3JdLHRbcl09aSl9ZWxzZSB0W25dPWl9ZnVuY3Rpb24gSChlLHQscil7
dmFyIG4saSxvPTAsYT1ILnByZWZpbHRlcnMubGVuZ3RoLHM9b2UuRGVmZXJyZWQoKS5hbHdheXMo
ZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9y
KHZhciB0PWl0fHxMKCkscj1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tdCksbj1y
L2wuZHVyYXRpb258fDAsbz0xLW4sYT0wLHU9bC50d2VlbnMubGVuZ3RoO2E8dTthKyspbC50d2Vl
bnNbYV0ucnVuKG8pO3JldHVybiBzLm5vdGlmeVdpdGgoZSxbbCxvLHJdKSxvPDEmJnU/cjoocy5y
ZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTplLHByb3BzOm9lLmV4dGVu
ZCh7fSx0KSxvcHRzOm9lLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6b2UuZWFz
aW5nLl9kZWZhdWx0fSxyKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6cixz
dGFydFRpbWU6aXR8fEwoKSxkdXJhdGlvbjpyLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2Vl
bjpmdW5jdGlvbih0LHIpe3ZhciBuPW9lLlR3ZWVuKGUsbC5vcHRzLHQscixsLm9wdHMuc3BlY2lh
bEVhc2luZ1t0XXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3Rv
cDpmdW5jdGlvbih0KXt2YXIgcj0wLG49dD9sLnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0
aGlzO2ZvcihpPSEwO3I8bjtyKyspbC50d2VlbnNbcl0ucnVuKDEpO3JldHVybiB0PyhzLm5vdGlm
eVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2wsdF0pKTpzLnJlamVjdFdpdGgoZSxb
bCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKEYoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxh
O28rKylpZihuPUgucHJlZmlsdGVyc1tvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIG9lLmlz
RnVuY3Rpb24obi5zdG9wKSYmKG9lLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0
b3A9b2UucHJveHkobi5zdG9wLG4pKSxuO3JldHVybiBvZS5tYXAoYyxNLGwpLG9lLmlzRnVuY3Rp
b24obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwoZSxsKSxvZS5meC50aW1lcihvZS5l
eHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbC5wcm9ncmVzcyhs
Lm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwu
b3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gVihlKXtyZXR1cm4gZS5n
ZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBxKGUpe3Jl
dHVybiBmdW5jdGlvbih0LHIpeyJzdHJpbmciIT10eXBlb2YgdCYmKHI9dCx0PSIqIik7dmFyIG4s
aT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHdlKXx8W107aWYob2UuaXNGdW5jdGlvbihyKSlm
b3IoO249b1tpKytdOykiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwoZVtuXT1lW25dfHxb
XSkudW5zaGlmdChyKSk6KGVbbl09ZVtuXXx8W10pLnB1c2gocil9fWZ1bmN0aW9uIHooZSx0LHIs
bil7ZnVuY3Rpb24gaShzKXt2YXIgdTtyZXR1cm4gb1tzXT0hMCxvZS5lYWNoKGVbc118fFtdLGZ1
bmN0aW9uKGUscyl7dmFyIGw9cyh0LHIsbik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxhfHxv
W2xdP2E/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxpKGwpLCExKX0pLHV9
dmFyIG89e30sYT1lPT09T3Q7cmV0dXJuIGkodC5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZpKCIq
Iil9ZnVuY3Rpb24gQihlLHQpe3ZhciByLG4saT1vZS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8
fHt9O2ZvcihyIGluIHQpdm9pZCAwIT09dFtyXSYmKChpW3JdP2U6bnx8KG49e30pKVtyXT10W3Jd
KTtyZXR1cm4gbiYmb2UuZXh0ZW5kKCEwLGUsbiksZX1mdW5jdGlvbiBVKGUsdCxyKXtmb3IodmFy
IG4saSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgp
LHZvaWQgMD09PW4mJihuPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQt
VHlwZSIpKTtpZihuKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KG4pKXt1LnVuc2hpZnQo
aSk7YnJlYWt9aWYodVswXWluIHIpbz11WzBdO2Vsc2V7Zm9yKGkgaW4gcil7aWYoIXVbMF18fGUu
Y29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1pZihvKXJl
dHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLHJbb119ZnVuY3Rpb24gVyhlLHQscixuKXt2YXIg
aSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5j
b252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07Zm9yKG89Yy5zaGlm
dCgpO287KWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihyW2UucmVzcG9uc2VGaWVsZHNbb11dPXQp
LCF1JiZuJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8s
bz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoYT1s
W3UrIiAiK29dfHxsWyIqICIrb10sIWEpZm9yKGkgaW4gbClpZihzPWkuc3BsaXQoIiAiKSxzWzFd
PT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7YT09PSEwP2E9bFtpXTpsW2ld
IT09ITAmJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZihhIT09ITApaWYoYSYmZS50
aHJvd3MpdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNl
cmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1
cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gJChlLHQscixuKXt2YXIgaTtpZihv
ZS5pc0FycmF5KHQpKW9lLmVhY2godCxmdW5jdGlvbih0LGkpe3J8fEF0LnRlc3QoZSk/bihlLGkp
OiQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxyLG4pfSk7
ZWxzZSBpZihyfHwib2JqZWN0IiE9PW9lLnR5cGUodCkpbihlLHQpO2Vsc2UgZm9yKGkgaW4gdCkk
KGUrIlsiK2krIl0iLHRbaV0scixuKX1mdW5jdGlvbiBLKGUpe3JldHVybiBvZS5pc1dpbmRvdyhl
KT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXZhciBRPVtdLEc9ZS5kb2N1bWVudCxZ
PVEuc2xpY2UsWD1RLmNvbmNhdCxKPVEucHVzaCxaPVEuaW5kZXhPZixlZT17fSx0ZT1lZS50b1N0
cmluZyxyZT1lZS5oYXNPd25Qcm9wZXJ0eSxuZT17fSxpZT0iMi4yLjQiLG9lPWZ1bmN0aW9uKGUs
dCl7cmV0dXJuIG5ldyBvZS5mbi5pbml0KGUsdCl9LGFlPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1
RkVGRlx4QTBdKyQvZyxzZT0vXi1tcy0vLHVlPS8tKFtcZGEtel0pL2dpLGxlPWZ1bmN0aW9uKGUs
dCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX07b2UuZm49b2UucHJvdG90eXBlPXtqcXVlcnk6aWUs
Y29uc3RydWN0b3I6b2Usc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3Jl
dHVybiBZLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9lPDA/dGhp
c1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdOlkuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9u
KGUpe3ZhciB0PW9lLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2Jq
ZWN0PXRoaXMsdC5jb250ZXh0PXRoaXMuY29udGV4dCx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVy
biBvZS5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2so
b2UubWFwKHRoaXMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5jYWxsKHQscix0KX0pKX0sc2xpY2U6
ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soWS5hcHBseSh0aGlzLGFyZ3VtZW50cykp
fSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0
dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxyPStlKyhl
PDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socj49MCYmcjx0P1t0aGlzW3JdXTpbXSl9LGVu
ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0s
cHVzaDpKLHNvcnQ6US5zb3J0LHNwbGljZTpRLnNwbGljZX0sb2UuZXh0ZW5kPW9lLmZuLmV4dGVu
ZD1mdW5jdGlvbigpe3ZhciBlLHQscixuLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJn
dW1lbnRzLmxlbmd0aCxsPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYobD1hLGE9YXJndW1l
bnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8b2UuaXNGdW5jdGlvbihhKXx8KGE9
e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10p
KWZvcih0IGluIGUpcj1hW3RdLG49ZVt0XSxhIT09biYmKGwmJm4mJihvZS5pc1BsYWluT2JqZWN0
KG4pfHwoaT1vZS5pc0FycmF5KG4pKSk/KGk/KGk9ITEsbz1yJiZvZS5pc0FycmF5KHIpP3I6W10p
Om89ciYmb2UuaXNQbGFpbk9iamVjdChyKT9yOnt9LGFbdF09b2UuZXh0ZW5kKGwsbyxuKSk6dm9p
ZCAwIT09biYmKGFbdF09bikpO3JldHVybiBhfSxvZS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIr
KGllK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVu
Y3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9u
OmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT1vZS50eXBlKGUpfSxpc0FycmF5OkFycmF5
LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRv
d30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKTtyZXR1cm4hb2Uu
aXNBcnJheShlKSYmdC1wYXJzZUZsb2F0KHQpKzE+PTB9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24o
ZSl7dmFyIHQ7aWYoIm9iamVjdCIhPT1vZS50eXBlKGUpfHxlLm5vZGVUeXBlfHxvZS5pc1dpbmRv
dyhlKSlyZXR1cm4hMTtpZihlLmNvbnN0cnVjdG9yJiYhcmUuY2FsbChlLCJjb25zdHJ1Y3RvciIp
JiYhcmUuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZXx8e30sImlzUHJvdG90eXBlT2YiKSly
ZXR1cm4hMTtmb3IodCBpbiBlKTtyZXR1cm4gdm9pZCAwPT09dHx8cmUuY2FsbChlLHQpfSxpc0Vt
cHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9
LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8
fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2VlW3RlLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0s
Z2xvYmFsRXZhbDpmdW5jdGlvbihlKXt2YXIgdCxyPWV2YWw7ZT1vZS50cmltKGUpLGUmJigxPT09
ZS5pbmRleE9mKCJ1c2Ugc3RyaWN0Iik/KHQ9Ry5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSx0LnRl
eHQ9ZSxHLmhlYWQuYXBwZW5kQ2hpbGQodCkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSk6cihl
KSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHNlLCJtcy0iKS5yZXBs
YWNlKHVlLGxlKX0sbm9kZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5u
b2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGUs
dCl7dmFyIG4saT0wO2lmKHIoZSkpZm9yKG49ZS5sZW5ndGg7aTxuJiZ0LmNhbGwoZVtpXSxpLGVb
aV0pIT09ITE7aSsrKTtlbHNlIGZvcihpIGluIGUpaWYodC5jYWxsKGVbaV0saSxlW2ldKT09PSEx
KWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIi
KS5yZXBsYWNlKGFlLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0
dXJuIG51bGwhPWUmJihyKE9iamVjdChlKSk/b2UubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/
W2VdOmUpOkouY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbnVs
bD09dD8tMTpaLmNhbGwodCxlLHIpfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0rdC5s
ZW5ndGgsbj0wLGk9ZS5sZW5ndGg7bjxyO24rKyllW2krK109dFtuXTtyZXR1cm4gZS5sZW5ndGg9
aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIG4saT1bXSxvPTAsYT1lLmxlbmd0aCxz
PSFyO288YTtvKyspbj0hdChlW29dLG8pLG4hPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1h
cDpmdW5jdGlvbihlLHQsbil7dmFyIGksbyxhPTAscz1bXTtpZihyKGUpKWZvcihpPWUubGVuZ3Ro
O2E8aTthKyspbz10KGVbYV0sYSxuKSxudWxsIT1vJiZzLnB1c2gobyk7ZWxzZSBmb3IoYSBpbiBl
KW89dChlW2FdLGEsbiksbnVsbCE9byYmcy5wdXNoKG8pO3JldHVybiBYLmFwcGx5KFtdLHMpfSxn
dWlkOjEscHJveHk6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0
JiYocj1lW3RdLHQ9ZSxlPXIpLG9lLmlzRnVuY3Rpb24oZSkpcmV0dXJuIG49WS5jYWxsKGFyZ3Vt
ZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxuLmNvbmNhdChZLmNh
bGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8b2UuZ3VpZCsrLGl9LG5vdzpE
YXRlLm5vdyxzdXBwb3J0Om5lfSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKG9lLmZuW1N5
bWJvbC5pdGVyYXRvcl09UVtTeW1ib2wuaXRlcmF0b3JdKSxvZS5lYWNoKCJCb29sZWFuIE51bWJl
ciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIu
c3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2VlWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNh
c2UoKX0pO3ZhciBjZT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCxyLG4pe3ZhciBpLG8sYSxz
LHUsbCxmLHAsaD10JiZ0Lm93bmVyRG9jdW1lbnQsbT10P3Qubm9kZVR5cGU6OTtpZihyPXJ8fFtd
LCJzdHJpbmciIT10eXBlb2YgZXx8IWV8fDEhPT1tJiY5IT09bSYmMTEhPT1tKXJldHVybiByO2lm
KCFuJiYoKHQ/dC5vd25lckRvY3VtZW50fHx0OlYpIT09aiYmUCh0KSx0PXR8fGosTCkpe2lmKDEx
IT09bSYmKGw9YmUuZXhlYyhlKSkpaWYoaT1sWzFdKXtpZig5PT09bSl7aWYoIShhPXQuZ2V0RWxl
bWVudEJ5SWQoaSkpKXJldHVybiByO2lmKGEuaWQ9PT1pKXJldHVybiByLnB1c2goYSkscn1lbHNl
IGlmKGgmJihhPWguZ2V0RWxlbWVudEJ5SWQoaSkpJiZGKHQsYSkmJmEuaWQ9PT1pKXJldHVybiBy
LnB1c2goYSkscn1lbHNle2lmKGxbMl0pcmV0dXJuIEouYXBwbHkocix0LmdldEVsZW1lbnRzQnlU
YWdOYW1lKGUpKSxyO2lmKChpPWxbM10pJiZ3LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnQuZ2V0
RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSi5hcHBseShyLHQuZ2V0RWxlbWVudHNCeUNsYXNz
TmFtZShpKSkscn1pZih3LnFzYSYmIVdbZSsiICJdJiYoIUR8fCFELnRlc3QoZSkpKXtpZigxIT09
bSloPXQscD1lO2Vsc2UgaWYoIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2Zv
cigocz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UoeWUsIlxcJCYiKTp0LnNldEF0
dHJpYnV0ZSgiaWQiLHM9SCksZj1FKGUpLG89Zi5sZW5ndGgsdT1kZS50ZXN0KHMpPyIjIitzOiJb
aWQ9JyIrcysiJ10iO28tLTspZltvXT11KyIgIitkKGZbb10pO3A9Zi5qb2luKCIsIiksaD1nZS50
ZXN0KGUpJiZjKHQucGFyZW50Tm9kZSl8fHR9aWYocCl0cnl7cmV0dXJuIEouYXBwbHkocixoLnF1
ZXJ5U2VsZWN0b3JBbGwocCkpLHJ9Y2F0Y2goZSl7fWZpbmFsbHl7cz09PUgmJnQucmVtb3ZlQXR0
cmlidXRlKCJpZCIpfX19cmV0dXJuIFQoZS5yZXBsYWNlKHNlLCIkMSIpLHQscixuKX1mdW5jdGlv
biByKCl7ZnVuY3Rpb24gZShyLG4pe3JldHVybiB0LnB1c2gocisiICIpPnguY2FjaGVMZW5ndGgm
JmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtyKyIgIl09bn12YXIgdD1bXTtyZXR1cm4gZX1mdW5jdGlv
biBuKGUpe3JldHVybiBlW0hdPSEwLGV9ZnVuY3Rpb24gaShlKXt2YXIgdD1qLmNyZWF0ZUVsZW1l
bnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBh
cmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIG8o
ZSx0KXtmb3IodmFyIHI9ZS5zcGxpdCgifCIpLG49ci5sZW5ndGg7bi0tOyl4LmF0dHJIYW5kbGVb
cltuXV09dH1mdW5jdGlvbiBhKGUsdCl7dmFyIHI9dCYmZSxuPXImJjE9PT1lLm5vZGVUeXBlJiYx
PT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxLKS0ofmUuc291cmNlSW5kZXh8fEspO2lm
KG4pcmV0dXJuIG47aWYocilmb3IoO3I9ci5uZXh0U2libGluZzspaWYocj09PXQpcmV0dXJuLTE7
cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBzKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj10Lm5v
ZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXImJnQudHlwZT09PWV9fWZ1bmN0
aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPXQubm9kZU5hbWUudG9Mb3dlckNhc2Uo
KTtyZXR1cm4oImlucHV0Ij09PXJ8fCJidXR0b24iPT09cikmJnQudHlwZT09PWV9fWZ1bmN0aW9u
IGwoZSl7cmV0dXJuIG4oZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsbihmdW5jdGlvbihyLG4pe2Zv
cih2YXIgaSxvPWUoW10sci5sZW5ndGgsdCksYT1vLmxlbmd0aDthLS07KXJbaT1vW2FdXSYmKHJb
aV09IShuW2ldPXJbaV0pKX0pfSl9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIh
PXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24g
ZChlKXtmb3IodmFyIHQ9MCxyPWUubGVuZ3RoLG49IiI7dDxyO3QrKyluKz1lW3RdLnZhbHVlO3Jl
dHVybiBufWZ1bmN0aW9uIHAoZSx0LHIpe3ZhciBuPXQuZGlyLGk9ciYmInBhcmVudE5vZGUiPT09
bixvPXorKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LHIsbyl7Zm9yKDt0PXRbbl07KWlmKDE9
PT10Lm5vZGVUeXBlfHxpKXJldHVybiBlKHQscixvKX06ZnVuY3Rpb24odCxyLGEpe3ZhciBzLHUs
bCxjPVtxLG9dO2lmKGEpe2Zvcig7dD10W25dOylpZigoMT09PXQubm9kZVR5cGV8fGkpJiZlKHQs
cixhKSlyZXR1cm4hMH1lbHNlIGZvcig7dD10W25dOylpZigxPT09dC5ub2RlVHlwZXx8aSl7aWYo
bD10W0hdfHwodFtIXT17fSksdT1sW3QudW5pcXVlSURdfHwobFt0LnVuaXF1ZUlEXT17fSksKHM9
dVtuXSkmJnNbMF09PT1xJiZzWzFdPT09bylyZXR1cm4gY1syXT1zWzJdO2lmKHVbbl09YyxjWzJd
PWUodCxyLGEpKXJldHVybiEwfX19ZnVuY3Rpb24gaChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5j
dGlvbih0LHIsbil7Zm9yKHZhciBpPWUubGVuZ3RoO2ktLTspaWYoIWVbaV0odCxyLG4pKXJldHVy
biExO3JldHVybiEwfTplWzBdfWZ1bmN0aW9uIG0oZSxyLG4pe2Zvcih2YXIgaT0wLG89ci5sZW5n
dGg7aTxvO2krKyl0KGUscltpXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB2KGUsdCxyLG4saSl7Zm9y
KHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihy
JiYhcihvLG4saSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24g
YihlLHQscixpLG8sYSl7cmV0dXJuIGkmJiFpW0hdJiYoaT1iKGkpKSxvJiYhb1tIXSYmKG89Yihv
LGEpKSxuKGZ1bmN0aW9uKG4sYSxzLHUpe3ZhciBsLGMsZixkPVtdLHA9W10saD1hLmxlbmd0aCxi
PW58fG0odHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLGc9IWV8fCFuJiZ0P2I6dihiLGQsZSxz
LHUpLHk9cj9vfHwobj9lOmh8fGkpP1tdOmE6ZztpZihyJiZyKGcseSxzLHUpLGkpZm9yKGw9dih5
LHApLGkobCxbXSxzLHUpLGM9bC5sZW5ndGg7Yy0tOykoZj1sW2NdKSYmKHlbcFtjXV09IShnW3Bb
Y11dPWYpKTtpZihuKXtpZihvfHxlKXtpZihvKXtmb3IobD1bXSxjPXkubGVuZ3RoO2MtLTspKGY9
eVtjXSkmJmwucHVzaChnW2NdPWYpO28obnVsbCx5PVtdLGwsdSl9Zm9yKGM9eS5sZW5ndGg7Yy0t
OykoZj15W2NdKSYmKGw9bz9lZShuLGYpOmRbY10pPi0xJiYobltsXT0hKGFbbF09ZikpfX1lbHNl
IHk9dih5PT09YT95LnNwbGljZShoLHkubGVuZ3RoKTp5KSxvP28obnVsbCxhLHksdSk6Si5hcHBs
eShhLHkpfSl9ZnVuY3Rpb24gZyhlKXtmb3IodmFyIHQscixuLGk9ZS5sZW5ndGgsbz14LnJlbGF0
aXZlW2VbMF0udHlwZV0sYT1vfHx4LnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PXAoZnVuY3Rpb24o
ZSl7cmV0dXJuIGU9PT10fSxhLCEwKSxsPXAoZnVuY3Rpb24oZSl7cmV0dXJuIGVlKHQsZSk+LTF9
LGEsITApLGM9W2Z1bmN0aW9uKGUscixuKXt2YXIgaT0hbyYmKG58fHIhPT1OKXx8KCh0PXIpLm5v
ZGVUeXBlP3UoZSxyLG4pOmwoZSxyLG4pKTtyZXR1cm4gdD1udWxsLGl9XTtzPGk7cysrKWlmKHI9
eC5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W3AoaChjKSxyKV07ZWxzZXtpZihyPXguZmlsdGVyW2Vb
c10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpLHJbSF0pe2ZvcihuPSsrcztuPGkmJiF4
LnJlbGF0aXZlW2Vbbl0udHlwZV07bisrKTtyZXR1cm4gYihzPjEmJmgoYykscz4xJiZkKGUuc2xp
Y2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxh
Y2Uoc2UsIiQxIikscixzPG4mJmcoZS5zbGljZShzLG4pKSxuPGkmJmcoZT1lLnNsaWNlKG4pKSxu
PGkmJmQoZSkpfWMucHVzaChyKX1yZXR1cm4gaChjKX1mdW5jdGlvbiB5KGUscil7dmFyIGk9ci5s
ZW5ndGg+MCxvPWUubGVuZ3RoPjAsYT1mdW5jdGlvbihuLGEscyx1LGwpe3ZhciBjLGYsZCxwPTAs
aD0iMCIsbT1uJiZbXSxiPVtdLGc9Tix5PW58fG8mJnguZmluZC5UQUcoIioiLGwpLF89cSs9bnVs
bD09Zz8xOk1hdGgucmFuZG9tKCl8fC4xLHc9eS5sZW5ndGg7Zm9yKGwmJihOPWE9PT1qfHxhfHxs
KTtoIT09dyYmbnVsbCE9KGM9eVtoXSk7aCsrKXtpZihvJiZjKXtmb3IoZj0wLGF8fGMub3duZXJE
b2N1bWVudD09PWp8fChQKGMpLHM9IUwpO2Q9ZVtmKytdOylpZihkKGMsYXx8aixzKSl7dS5wdXNo
KGMpO2JyZWFrfWwmJihxPV8pfWkmJigoYz0hZCYmYykmJnAtLSxuJiZtLnB1c2goYykpfWlmKHAr
PWgsaSYmaCE9PXApe2ZvcihmPTA7ZD1yW2YrK107KWQobSxiLGEscyk7aWYobil7aWYocD4wKWZv
cig7aC0tOyltW2hdfHxiW2hdfHwoYltoXT1ZLmNhbGwodSkpO2I9dihiKX1KLmFwcGx5KHUsYiks
bCYmIW4mJmIubGVuZ3RoPjAmJnArci5sZW5ndGg+MSYmdC51bmlxdWVTb3J0KHUpfXJldHVybiBs
JiYocT1fLE49ZyksbX07cmV0dXJuIGk/bihhKTphfXZhciBfLHcseCxrLEMsRSxPLFQsTixTLEEs
UCxqLFIsTCxELE0sSSxGLEg9InNpenpsZSIrMSpuZXcgRGF0ZSxWPWUuZG9jdW1lbnQscT0wLHo9
MCxCPXIoKSxVPXIoKSxXPXIoKSwkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYoQT0hMCks
MH0sSz0xPDwzMSxRPXt9Lmhhc093blByb3BlcnR5LEc9W10sWT1HLnBvcCxYPUcucHVzaCxKPUcu
cHVzaCxaPUcuc2xpY2UsZWU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8
bjtyKyspaWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuLTF9LHRlPSJjaGVja2VkfHNlbGVjdGVk
fGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58
aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIscmU9Iltc
XHgyMFxcdFxcclxcblxcZl0iLG5lPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIs
aWU9IlxcWyIrcmUrIiooIituZSsiKSg/OiIrcmUrIiooWypeJHwhfl0/PSkiK3JlKyIqKD86Jygo
PzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrbmUrIikp
fCkiK3JlKyIqXFxdIixvZT0iOigiK25lKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSop
J3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18Iitp
ZSsiKSopfC4qKVxcKXwpIixhZT1uZXcgUmVnRXhwKHJlKyIrIiwiZyIpLHNlPW5ldyBSZWdFeHAo
Il4iK3JlKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK3JlKyIrJCIsImciKSx1ZT1uZXcg
UmVnRXhwKCJeIityZSsiKiwiK3JlKyIqIiksbGU9bmV3IFJlZ0V4cCgiXiIrcmUrIiooWz4rfl18
IityZSsiKSIrcmUrIioiKSxjZT1uZXcgUmVnRXhwKCI9IityZSsiKihbXlxcXSdcIl0qPykiK3Jl
KyIqXFxdIiwiZyIpLGZlPW5ldyBSZWdFeHAob2UpLGRlPW5ldyBSZWdFeHAoIl4iK25lKyIkIiks
cGU9e0lEOm5ldyBSZWdFeHAoIl4jKCIrbmUrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIr
bmUrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK25lKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgi
XiIraWUpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitvZSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25s
eXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIityZSsiKihl
dmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrcmUrIiooPzooWystXXwpIityZSsiKihcXGQrKXwp
KSIrcmUrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK3RlKyIpJCIsImkiKSxu
ZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrcmUrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0
fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrcmUrIiooKD86LVxcZCk/XFxkKikiK3JlKyIqXFwpfCko
Pz1bXi1dfCQpIiwiaSIpfSxoZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9p
LG1lPS9eaFxkJC9pLHZlPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxiZT0vXig/OiMoW1x3LV0r
KXwoXHcrKXxcLihbXHctXSspKSQvLGdlPS9bK35dLyx5ZT0vJ3xcXC9nLF9lPW5ldyBSZWdFeHAo
IlxcXFwoW1xcZGEtZl17MSw2fSIrcmUrIj98KCIrcmUrIil8LikiLCJpZyIpLHdlPWZ1bmN0aW9u
KGUsdCxyKXt2YXIgbj0iMHgiK3QtNjU1MzY7cmV0dXJuIG4hPT1ufHxyP3Q6bjwwP1N0cmluZy5m
cm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIz
Jm58NTYzMjApfSx4ZT1mdW5jdGlvbigpe1AoKX07dHJ5e0ouYXBwbHkoRz1aLmNhbGwoVi5jaGls
ZE5vZGVzKSxWLmNoaWxkTm9kZXMpLEdbVi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0
Y2goZSl7Sj17YXBwbHk6Ry5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtYLmFwcGx5KGUsWi5jYWxsKHQp
KX06ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9ZS5sZW5ndGgsbj0wO2VbcisrXT10W24rK107KTtl
Lmxlbmd0aD1yLTF9fX13PXQuc3VwcG9ydD17fSxDPXQuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9
ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhdCYmIkhUTUwi
IT09dC5ub2RlTmFtZX0sUD10LnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1lP2Uu
b3duZXJEb2N1bWVudHx8ZTpWO3JldHVybiBuIT09aiYmOT09PW4ubm9kZVR5cGUmJm4uZG9jdW1l
bnRFbGVtZW50PyhqPW4sUj1qLmRvY3VtZW50RWxlbWVudCxMPSFDKGopLChyPWouZGVmYXVsdFZp
ZXcpJiZyLnRvcCE9PXImJihyLmFkZEV2ZW50TGlzdGVuZXI/ci5hZGRFdmVudExpc3RlbmVyKCJ1
bmxvYWQiLHhlLCExKTpyLmF0dGFjaEV2ZW50JiZyLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIseGUp
KSx3LmF0dHJpYnV0ZXM9aShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdl
dEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSx3LmdldEVsZW1lbnRzQnlUYWdOYW1lPWkoZnVuY3Rp
b24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoai5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSx3LmdldEVsZW1lbnRzQnlDbGFzc05hbWU9dmUu
dGVzdChqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLHcuZ2V0QnlJZD1pKGZ1bmN0aW9uKGUpe3Jl
dHVybiBSLmFwcGVuZENoaWxkKGUpLmlkPUgsIWouZ2V0RWxlbWVudHNCeU5hbWV8fCFqLmdldEVs
ZW1lbnRzQnlOYW1lKEgpLmxlbmd0aH0pLHcuZ2V0QnlJZD8oeC5maW5kLklEPWZ1bmN0aW9uKGUs
dCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZMKXt2YXIgcj10Lmdl
dEVsZW1lbnRCeUlkKGUpO3JldHVybiByP1tyXTpbXX19LHguZmlsdGVyLklEPWZ1bmN0aW9uKGUp
e3ZhciB0PWUucmVwbGFjZShfZSx3ZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0
dHJpYnV0ZSgiaWQiKT09PXR9fSk6KGRlbGV0ZSB4LmZpbmQuSUQseC5maWx0ZXIuSUQ9ZnVuY3Rp
b24oZSl7dmFyIHQ9ZS5yZXBsYWNlKF9lLHdlKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9InVu
ZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgi
aWQiKTtyZXR1cm4gciYmci52YWx1ZT09PXR9fSkseC5maW5kLlRBRz13LmdldEVsZW1lbnRzQnlU
YWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1l
bnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dy5xc2E/dC5xdWVyeVNlbGVj
dG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgcixuPVtdLGk9MCxvPXQuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7Zm9yKDtyPW9baSsrXTspMT09PXIubm9kZVR5
cGUmJm4ucHVzaChyKTtyZXR1cm4gbn1yZXR1cm4gb30seC5maW5kLkNMQVNTPXcuZ2V0RWxlbWVu
dHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0
RWxlbWVudHNCeUNsYXNzTmFtZSYmTClyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUp
fSxNPVtdLEQ9W10sKHcucXNhPXZlLnRlc3Qoai5xdWVyeVNlbGVjdG9yQWxsKSkmJihpKGZ1bmN0
aW9uKGUpe1IuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitIKyInPjwvYT48c2Vs
ZWN0IGlkPSciK0grIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScn
Pjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVe
PScnXSIpLmxlbmd0aCYmRC5wdXNoKCJbKl4kXT0iK3JlKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5
U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fEQucHVzaCgiXFxbIityZSsiKig/OnZh
bHVlfCIrdGUrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitIKyItXSIpLmxlbmd0aHx8
RC5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fEQucHVz
aCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitIKyIrKiIpLmxlbmd0aHx8RC5w
dXNoKCIuIy4rWyt+XSIpfSksaShmdW5jdGlvbihlKXt2YXIgdD1qLmNyZWF0ZUVsZW1lbnQoImlu
cHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNl
dEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVu
Z3RoJiZELnB1c2goIm5hbWUiK3JlKyIqWypeJHwhfl0/PSIpLGUucXVlcnlTZWxlY3RvckFsbCgi
OmVuYWJsZWQiKS5sZW5ndGh8fEQucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5
U2VsZWN0b3JBbGwoIiosOngiKSxELnB1c2goIiwuKjoiKX0pKSwody5tYXRjaGVzU2VsZWN0b3I9
dmUudGVzdChJPVIubWF0Y2hlc3x8Ui53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fFIubW96TWF0Y2hl
c1NlbGVjdG9yfHxSLm9NYXRjaGVzU2VsZWN0b3J8fFIubXNNYXRjaGVzU2VsZWN0b3IpKSYmaShm
dW5jdGlvbihlKXt3LmRpc2Nvbm5lY3RlZE1hdGNoPUkuY2FsbChlLCJkaXYiKSxJLmNhbGwoZSwi
W3MhPScnXTp4IiksTS5wdXNoKCIhPSIsb2UpfSksRD1ELmxlbmd0aCYmbmV3IFJlZ0V4cChELmpv
aW4oInwiKSksTT1NLmxlbmd0aCYmbmV3IFJlZ0V4cChNLmpvaW4oInwiKSksdD12ZS50ZXN0KFIu
Y29tcGFyZURvY3VtZW50UG9zaXRpb24pLEY9dHx8dmUudGVzdChSLmNvbnRhaW5zKT9mdW5jdGlv
bihlLHQpe3ZhciByPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUsbj10JiZ0LnBh
cmVudE5vZGU7cmV0dXJuIGU9PT1ufHwhKCFufHwxIT09bi5ub2RlVHlwZXx8IShyLmNvbnRhaW5z
P3IuY29udGFpbnMobik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbihuKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpZm9yKDt0PXQucGFyZW50Tm9k
ZTspaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LCQ9dD9mdW5jdGlvbihlLHQpe2lmKGU9PT10
KXJldHVybiBBPSEwLDA7dmFyIHI9IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIXQuY29tcGFy
ZURvY3VtZW50UG9zaXRpb247cmV0dXJuIHI/cjoocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0
Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSwxJnJ8fCF3
LnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWp8fGUu
b3duZXJEb2N1bWVudD09PVYmJkYoVixlKT8tMTp0PT09anx8dC5vd25lckRvY3VtZW50PT09ViYm
RihWLHQpPzE6Uz9lZShTLGUpLWVlKFMsdCk6MDo0JnI/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYo
ZT09PXQpcmV0dXJuIEE9ITAsMDt2YXIgcixuPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5v
ZGUscz1bZV0sdT1bdF07aWYoIWl8fCFvKXJldHVybiBlPT09aj8tMTp0PT09aj8xOmk/LTE6bz8x
OlM/ZWUoUyxlKS1lZShTLHQpOjA7aWYoaT09PW8pcmV0dXJuIGEoZSx0KTtmb3Iocj1lO3I9ci5w
YXJlbnROb2RlOylzLnVuc2hpZnQocik7Zm9yKHI9dDtyPXIucGFyZW50Tm9kZTspdS51bnNoaWZ0
KHIpO2Zvcig7c1tuXT09PXVbbl07KW4rKztyZXR1cm4gbj9hKHNbbl0sdVtuXSk6c1tuXT09PVY/
LTE6dVtuXT09PVY/MTowfSxqKTpqfSx0Lm1hdGNoZXM9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChl
LG51bGwsbnVsbCxyKX0sdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSxyKXtpZigoZS5vd25l
ckRvY3VtZW50fHxlKSE9PWomJlAoZSkscj1yLnJlcGxhY2UoY2UsIj0nJDEnXSIpLHcubWF0Y2hl
c1NlbGVjdG9yJiZMJiYhV1tyKyIgIl0mJighTXx8IU0udGVzdChyKSkmJighRHx8IUQudGVzdChy
KSkpdHJ5e3ZhciBuPUkuY2FsbChlLHIpO2lmKG58fHcuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9j
dW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChlKXt9cmV0dXJu
IHQocixqLG51bGwsW2VdKS5sZW5ndGg+MH0sdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVy
bihlLm93bmVyRG9jdW1lbnR8fGUpIT09aiYmUChlKSxGKGUsdCl9LHQuYXR0cj1mdW5jdGlvbihl
LHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT09aiYmUChlKTt2YXIgcj14LmF0dHJIYW5kbGVbdC50
b0xvd2VyQ2FzZSgpXSxuPXImJlEuY2FsbCh4LmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9y
KGUsdCwhTCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1uP246dy5hdHRyaWJ1dGVzfHwhTD9lLmdl
dEF0dHJpYnV0ZSh0KToobj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZuLnNwZWNpZmllZD9uLnZh
bHVlOm51bGx9LHQuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJy
b3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSx0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24o
ZSl7dmFyIHQscj1bXSxuPTAsaT0wO2lmKEE9IXcuZGV0ZWN0RHVwbGljYXRlcyxTPSF3LnNvcnRT
dGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KCQpLEEpe2Zvcig7dD1lW2krK107KXQ9PT1lW2ldJiYo
bj1yLnB1c2goaSkpO2Zvcig7bi0tOyllLnNwbGljZShyW25dLDEpfXJldHVybiBTPW51bGwsZX0s
az10LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQscj0iIixuPTAsaT1lLm5vZGVUeXBlO2lmKGkp
e2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRl
bnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJs
aW5nKXIrPWsoZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ug
Zm9yKDt0PWVbbisrXTspcis9ayh0KTtyZXR1cm4gcn0seD10LnNlbGVjdG9ycz17Y2FjaGVMZW5n
dGg6NTAsY3JlYXRlUHNldWRvOm4sbWF0Y2g6cGUsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0
aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2Rl
In0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91
c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0u
cmVwbGFjZShfZSx3ZSksCitlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZShfZSx3
ZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpm
dW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNs
aWNlKDAsMyk/KGVbM118fHQuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6
MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9
PT1lWzNdKSk6ZVszXSYmdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQs
cj0hZVs2XSYmZVsyXTtyZXR1cm4gcGUuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09
ZVs0XXx8ZVs1XXx8IiI6ciYmZmUudGVzdChyKSYmKHQ9RShyLCEwKSkmJih0PXIuaW5kZXhPZigi
KSIsci5sZW5ndGgtdCktci5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1yLnNs
aWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1l
LnJlcGxhY2UoX2Usd2UpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3Jl
dHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PUJbZSsiICJdO3JldHVybiB0fHwo
dD1uZXcgUmVnRXhwKCIoXnwiK3JlKyIpIitlKyIoIityZSsifCQpIikpJiZCKGUsZnVuY3Rpb24o
ZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFt
ZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNs
YXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFy
IG89dC5hdHRyKGksZSk7cmV0dXJuIG51bGw9PW8/IiE9Ij09PXI6IXJ8fChvKz0iIiwiPSI9PT1y
P289PT1uOiIhPSI9PT1yP28hPT1uOiJePSI9PT1yP24mJjA9PT1vLmluZGV4T2Yobik6Iio9Ij09
PXI/biYmby5pbmRleE9mKG4pPi0xOiIkPSI9PT1yP24mJm8uc2xpY2UoLW4ubGVuZ3RoKT09PW46
In49Ij09PXI/KCIgIitvLnJlcGxhY2UoYWUsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09
PXImJihvPT09bnx8by5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0
aW9uKGUsdCxyLG4saSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNs
aWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1uJiYwPT09aT9mdW5jdGlvbihlKXty
ZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxyLHUpe3ZhciBsLGMsZixkLHAsaCxtPW8h
PT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj10LnBhcmVudE5vZGUsYj1zJiZ0
Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZz0hdSYmIXMseT0hMTtpZih2KXtpZihvKXtmb3IoO207
KXtmb3IoZD10O2Q9ZFttXTspaWYocz9kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iOjE9PT1k
Lm5vZGVUeXBlKXJldHVybiExO2g9bT0ib25seSI9PT1lJiYhaCYmIm5leHRTaWJsaW5nIn1yZXR1
cm4hMH1pZihoPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmZyl7Zm9yKGQ9dixmPWRb
SF18fChkW0hdPXt9KSxjPWZbZC51bmlxdWVJRF18fChmW2QudW5pcXVlSURdPXt9KSxsPWNbZV18
fFtdLHA9bFswXT09PXEmJmxbMV0seT1wJiZsWzJdLGQ9cCYmdi5jaGlsZE5vZGVzW3BdO2Q9Kytw
JiZkJiZkW21dfHwoeT1wPTApfHxoLnBvcCgpOylpZigxPT09ZC5ub2RlVHlwZSYmKyt5JiZkPT09
dCl7Y1tlXT1bcSxwLHldO2JyZWFrfX1lbHNlIGlmKGcmJihkPXQsZj1kW0hdfHwoZFtIXT17fSks
Yz1mW2QudW5pcXVlSURdfHwoZltkLnVuaXF1ZUlEXT17fSksbD1jW2VdfHxbXSxwPWxbMF09PT1x
JiZsWzFdLHk9cCkseT09PSExKWZvcig7KGQ9KytwJiZkJiZkW21dfHwoeT1wPTApfHxoLnBvcCgp
KSYmKChzP2Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PWI6MSE9PWQubm9kZVR5cGUpfHwhKyt5
fHwoZyYmKGY9ZFtIXXx8KGRbSF09e30pLGM9ZltkLnVuaXF1ZUlEXXx8KGZbZC51bmlxdWVJRF09
e30pLGNbZV09W3EseV0pLGQhPT10KSk7KTtyZXR1cm4geS09aSx5PT09bnx8eSVuPT09MCYmeS9u
Pj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHIpe3ZhciBpLG89eC5wc2V1ZG9zW2VdfHx4LnNldEZp
bHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8dC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2Up
O3JldHVybiBvW0hdP28ocik6by5sZW5ndGg+MT8oaT1bZSxlLCIiLHJdLHguc2V0RmlsdGVycy5o
YXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP24oZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4s
aT1vKGUsciksYT1pLmxlbmd0aDthLS07KW49ZWUoZSxpW2FdKSxlW25dPSEodFtuXT1pW2FdKX0p
OmZ1bmN0aW9uKGUpe3JldHVybiBvKGUsMCxpKX0pOm99fSxwc2V1ZG9zOntub3Q6bihmdW5jdGlv
bihlKXt2YXIgdD1bXSxyPVtdLGk9TyhlLnJlcGxhY2Uoc2UsIiQxIikpO3JldHVybiBpW0hdP24o
ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBvLGE9aShlLG51bGwsbixbXSkscz1lLmxlbmd0aDtz
LS07KShvPWFbc10pJiYoZVtzXT0hKHRbc109bykpfSk6ZnVuY3Rpb24oZSxuLG8pe3JldHVybiB0
WzBdPWUsaSh0LG51bGwsbyxyKSx0WzBdPW51bGwsIXIucG9wKCl9fSksaGFzOm4oZnVuY3Rpb24o
ZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KGUscikubGVuZ3RoPjB9fSksY29udGFpbnM6
bihmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoX2Usd2UpLGZ1bmN0aW9uKHQpe3JldHVy
bih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8ayh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5n
Om4oZnVuY3Rpb24oZSl7cmV0dXJuIGRlLnRlc3QoZXx8IiIpfHx0LmVycm9yKCJ1bnN1cHBvcnRl
ZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKF9lLHdlKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQp
e3ZhciByO2RvIGlmKHI9TD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0
QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIHI9ci50b0xvd2VyQ2FzZSgpLHI9PT1lfHwwPT09ci5p
bmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0
dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciByPWUubG9jYXRpb24mJmUubG9jYXRpb24u
aGFzaDtyZXR1cm4gciYmci5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJu
IGU9PT1SfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWouYWN0aXZlRWxlbWVudCYmKCFq
Lmhhc0ZvY3VzfHxqLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgp
fSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1
bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFy
IHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tl
ZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVy
biBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0h
MH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5n
KWlmKGUubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3Jl
dHVybiF4LnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gbWUudGVz
dChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGhlLnRlc3QoZS5ub2RlTmFt
ZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0
dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVu
Y3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYm
InRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0
Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmwoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0
OmwoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmwoZnVuY3Rpb24oZSx0LHIpe3JldHVy
bltyPDA/cit0OnJdfSksZXZlbjpsKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0O3IrPTIp
ZS5wdXNoKHIpO3JldHVybiBlfSksb2RkOmwoZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MTtyPHQ7
cis9MillLnB1c2gocik7cmV0dXJuIGV9KSxsdDpsKGZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIG49
cjwwP3IrdDpyOy0tbj49MDspZS5wdXNoKG4pO3JldHVybiBlfSksZ3Q6bChmdW5jdGlvbihlLHQs
cil7Zm9yKHZhciBuPXI8MD9yK3Q6cjsrK248dDspZS5wdXNoKG4pO3JldHVybiBlfSl9fSx4LnBz
ZXVkb3MubnRoPXgucHNldWRvcy5lcTtmb3IoXyBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxl
OiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSl4LnBzZXVkb3NbX109cyhfKTtmb3IoXyBpbntzdWJt
aXQ6ITAscmVzZXQ6ITB9KXgucHNldWRvc1tfXT11KF8pO3JldHVybiBmLnByb3RvdHlwZT14LmZp
bHRlcnM9eC5wc2V1ZG9zLHguc2V0RmlsdGVycz1uZXcgZixFPXQudG9rZW5pemU9ZnVuY3Rpb24o
ZSxyKXt2YXIgbixpLG8sYSxzLHUsbCxjPVVbZSsiICJdO2lmKGMpcmV0dXJuIHI/MDpjLnNsaWNl
KDApO2ZvcihzPWUsdT1bXSxsPXgucHJlRmlsdGVyO3M7KXtuJiYhKGk9dWUuZXhlYyhzKSl8fChp
JiYocz1zLnNsaWNlKGlbMF0ubGVuZ3RoKXx8cyksdS5wdXNoKG89W10pKSxuPSExLChpPWxlLmV4
ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKHNl
LCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtmb3IoYSBpbiB4LmZpbHRlcikhKGk9cGVbYV0u
ZXhlYyhzKSl8fGxbYV0mJiEoaT1sW2FdKGkpKXx8KG49aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6
bix0eXBlOmEsbWF0Y2hlczppfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0
dXJuIHI/cy5sZW5ndGg6cz90LmVycm9yKGUpOlUoZSx1KS5zbGljZSgwKX0sTz10LmNvbXBpbGU9
ZnVuY3Rpb24oZSx0KXt2YXIgcixuPVtdLGk9W10sbz1XW2UrIiAiXTtpZighbyl7Zm9yKHR8fCh0
PUUoZSkpLHI9dC5sZW5ndGg7ci0tOylvPWcodFtyXSksb1tIXT9uLnB1c2gobyk6aS5wdXNoKG8p
O289VyhlLHkoaSxuKSksby5zZWxlY3Rvcj1lfXJldHVybiBvfSxUPXQuc2VsZWN0PWZ1bmN0aW9u
KGUsdCxyLG4pe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxmPSFuJiZF
KGU9bC5zZWxlY3Rvcnx8ZSk7aWYocj1yfHxbXSwxPT09Zi5sZW5ndGgpe2lmKG89ZlswXT1mWzBd
LnNsaWNlKDApLG8ubGVuZ3RoPjImJiJJRCI9PT0oYT1vWzBdKS50eXBlJiZ3LmdldEJ5SWQmJjk9
PT10Lm5vZGVUeXBlJiZMJiZ4LnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKHQ9KHguZmluZC5JRChh
Lm1hdGNoZXNbMF0ucmVwbGFjZShfZSx3ZSksdCl8fFtdKVswXSwhdClyZXR1cm4gcjtsJiYodD10
LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoaT1wZS5u
ZWVkc0NvbnRleHQudGVzdChlKT8wOm8ubGVuZ3RoO2ktLSYmKGE9b1tpXSwheC5yZWxhdGl2ZVtz
PWEudHlwZV0pOylpZigodT14LmZpbmRbc10pJiYobj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKF9l
LHdlKSxnZS50ZXN0KG9bMF0udHlwZSkmJmModC5wYXJlbnROb2RlKXx8dCkpKXtpZihvLnNwbGlj
ZShpLDEpLGU9bi5sZW5ndGgmJmQobyksIWUpcmV0dXJuIEouYXBwbHkocixuKSxyO2JyZWFrfX1y
ZXR1cm4obHx8TyhlLGYpKShuLHQsIUwsciwhdHx8Z2UudGVzdChlKSYmYyh0LnBhcmVudE5vZGUp
fHx0KSxyfSx3LnNvcnRTdGFibGU9SC5zcGxpdCgiIikuc29ydCgkKS5qb2luKCIiKT09PUgsdy5k
ZXRlY3REdXBsaWNhdGVzPSEhQSxQKCksdy5zb3J0RGV0YWNoZWQ9aShmdW5jdGlvbihlKXtyZXR1
cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGouY3JlYXRlRWxlbWVudCgiZGl2IikpfSks
aShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09
PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxvKCJ0eXBlfGhyZWZ8aGVpZ2h0
fHdpZHRoIixmdW5jdGlvbihlLHQscil7aWYoIXIpcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5
cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSx3LmF0dHJpYnV0ZXMmJmkoZnVuY3Rpb24oZSl7
cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgi
dmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bygi
dmFsdWUiLGZ1bmN0aW9uKGUsdCxyKXtpZighciYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dl
ckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxpKGZ1bmN0aW9uKGUpe3JldHVybiBudWxs
PT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxvKHRlLGZ1bmN0aW9uKGUsdCxyKXt2YXIg
bjtpZighcilyZXR1cm4gZVt0XT09PSEwP3QudG9Mb3dlckNhc2UoKToobj1lLmdldEF0dHJpYnV0
ZU5vZGUodCkpJiZuLnNwZWNpZmllZD9uLnZhbHVlOm51bGx9KSx0fShlKTtvZS5maW5kPWNlLG9l
LmV4cHI9Y2Uuc2VsZWN0b3JzLG9lLmV4cHJbIjoiXT1vZS5leHByLnBzZXVkb3Msb2UudW5pcXVl
U29ydD1vZS51bmlxdWU9Y2UudW5pcXVlU29ydCxvZS50ZXh0PWNlLmdldFRleHQsb2UuaXNYTUxE
b2M9Y2UuaXNYTUwsb2UuY29udGFpbnM9Y2UuY29udGFpbnM7dmFyIGZlPWZ1bmN0aW9uKGUsdCxy
KXtmb3IodmFyIG49W10saT12b2lkIDAhPT1yOyhlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZTspaWYo
MT09PWUubm9kZVR5cGUpe2lmKGkmJm9lKGUpLmlzKHIpKWJyZWFrO24ucHVzaChlKX1yZXR1cm4g
bn0sZGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUu
bm9kZVR5cGUmJmUhPT10JiZyLnB1c2goZSk7cmV0dXJuIHJ9LHBlPW9lLmV4cHIubWF0Y2gubmVl
ZHNDb250ZXh0LGhlPS9ePChbXHctXSspXHMqXC8/Pig/OjxcL1wxPnwpJC8sbWU9L14uW146I1xb
XC4sXSokLztvZS5maWx0ZXI9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRbMF07cmV0dXJuIHImJihl
PSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PW4ubm9kZVR5cGU/b2UuZmluZC5tYXRj
aGVzU2VsZWN0b3IobixlKT9bbl06W106b2UuZmluZC5tYXRjaGVzKGUsb2UuZ3JlcCh0LGZ1bmN0
aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sb2UuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0
aW9uKGUpe3ZhciB0LHI9dGhpcy5sZW5ndGgsbj1bXSxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVv
ZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhvZShlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0w
O3Q8cjt0KyspaWYob2UuY29udGFpbnMoaVt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IodD0wO3Q8
cjt0Kyspb2UuZmluZChlLGlbdF0sbik7cmV0dXJuIG49dGhpcy5wdXNoU3RhY2socj4xP29lLnVu
aXF1ZShuKTpuKSxuLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrZTpl
LG59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobih0aGlzLGV8fFtd
LCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobih0aGlzLGV8fFtd
LCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhbih0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYm
cGUudGVzdChlKT9vZShlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciB2ZSxiZT0vXig/OlxzKig8
W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLGdlPW9lLmZuLmluaXQ9ZnVuY3Rpb24oZSx0LHIp
e3ZhciBuLGk7aWYoIWUpcmV0dXJuIHRoaXM7aWYocj1yfHx2ZSwic3RyaW5nIj09dHlwZW9mIGUp
e2lmKG49IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmZS5sZW5ndGg+PTM/W251bGws
ZSxudWxsXTpiZS5leGVjKGUpLCFufHwhblsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fHIp
LmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKG5bMV0pe2lmKHQ9dCBpbnN0
YW5jZW9mIG9lP3RbMF06dCxvZS5tZXJnZSh0aGlzLG9lLnBhcnNlSFRNTChuWzFdLHQmJnQubm9k
ZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkcsITApKSxoZS50ZXN0KG5bMV0pJiZvZS5pc1BsYWlu
T2JqZWN0KHQpKWZvcihuIGluIHQpb2UuaXNGdW5jdGlvbih0aGlzW25dKT90aGlzW25dKHRbbl0p
OnRoaXMuYXR0cihuLHRbbl0pO3JldHVybiB0aGlzfXJldHVybiBpPUcuZ2V0RWxlbWVudEJ5SWQo
blsyXSksaSYmaS5wYXJlbnROb2RlJiYodGhpcy5sZW5ndGg9MSx0aGlzWzBdPWkpLHRoaXMuY29u
dGV4dD1HLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzLmNvbnRl
eHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6b2UuaXNGdW5jdGlvbihlKT92b2lkIDAh
PT1yLnJlYWR5P3IucmVhZHkoZSk6ZShvZSk6KHZvaWQgMCE9PWUuc2VsZWN0b3ImJih0aGlzLnNl
bGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCksb2UubWFrZUFycmF5KGUs
dGhpcykpfTtnZS5wcm90b3R5cGU9b2UuZm4sdmU9b2UoRyk7dmFyIHllPS9eKD86cGFyZW50c3xw
cmV2KD86VW50aWx8QWxsKSkvLF9lPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHBy
ZXY6ITB9O29lLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PW9lKGUsdGhpcykscj10
Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHI7ZSsr
KWlmKG9lLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihl
LHQpe2Zvcih2YXIgcixuPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9cGUudGVzdChlKXx8InN0cmlu
ZyIhPXR5cGVvZiBlP29lKGUsdHx8dGhpcy5jb250ZXh0KTowO248aTtuKyspZm9yKHI9dGhpc1tu
XTtyJiZyIT09dDtyPXIucGFyZW50Tm9kZSlpZihyLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KHIp
Pi0xOjE9PT1yLm5vZGVUeXBlJiZvZS5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpKSl7by5wdXNo
KHIpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP29lLnVuaXF1ZVNvcnQo
byk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9aLmNh
bGwob2UoZSksdGhpc1swXSk6Wi5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0
aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpm
dW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhvZS51bmlxdWVTb3J0KG9lLm1lcmdl
KHRoaXMuZ2V0KCksb2UoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5h
ZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSks
b2UuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYm
MTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSwi
cGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmZShlLCJw
YXJlbnROb2RlIixyKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gaShlLCJuZXh0U2libGluZyIp
fSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxs
OmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9u
KGUpe3JldHVybiBmZShlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUs
dCxyKXtyZXR1cm4gZmUoZSwibmV4dFNpYmxpbmciLHIpfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0
LHIpe3JldHVybiBmZShlLCJwcmV2aW91c1NpYmxpbmciLHIpfSxzaWJsaW5nczpmdW5jdGlvbihl
KXtyZXR1cm4gZGUoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1
bmN0aW9uKGUpe3JldHVybiBkZShlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXty
ZXR1cm4gZS5jb250ZW50RG9jdW1lbnR8fG9lLm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5j
dGlvbihlLHQpe29lLmZuW2VdPWZ1bmN0aW9uKHIsbil7dmFyIGk9b2UubWFwKHRoaXMsdCxyKTty
ZXR1cm4iVW50aWwiIT09ZS5zbGljZSgtNSkmJihuPXIpLG4mJiJzdHJpbmciPT10eXBlb2YgbiYm
KGk9b2UuZmlsdGVyKG4saSkpLHRoaXMubGVuZ3RoPjEmJihfZVtlXXx8b2UudW5pcXVlU29ydChp
KSx5ZS50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIHdlPS9c
UysvZztvZS5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/byhlKTpv
ZS5leHRlbmQoe30sZSk7dmFyIHQscixuLGksYT1bXSxzPVtdLHU9LTEsbD1mdW5jdGlvbigpe2Zv
cihpPWUub25jZSxuPXQ9ITA7cy5sZW5ndGg7dT0tMSlmb3Iocj1zLnNoaWZ0KCk7Kyt1PGEubGVu
Z3RoOylhW3VdLmFwcGx5KHJbMF0sclsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSYmKHU9YS5sZW5n
dGgscj0hMSk7ZS5tZW1vcnl8fChyPSExKSx0PSExLGkmJihhPXI/W106IiIpfSxjPXthZGQ6ZnVu
Y3Rpb24oKXtyZXR1cm4gYSYmKHImJiF0JiYodT1hLmxlbmd0aC0xLHMucHVzaChyKSksZnVuY3Rp
b24gdChyKXtvZS5lYWNoKHIsZnVuY3Rpb24ocixuKXtvZS5pc0Z1bmN0aW9uKG4pP2UudW5pcXVl
JiZjLmhhcyhuKXx8YS5wdXNoKG4pOm4mJm4ubGVuZ3RoJiYic3RyaW5nIiE9PW9lLnR5cGUobikm
JnQobil9KX0oYXJndW1lbnRzKSxyJiYhdCYmbCgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXty
ZXR1cm4gb2UuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI7KHI9b2UuaW5B
cnJheSh0LGEscikpPi0xOylhLnNwbGljZShyLDEpLHI8PXUmJnUtLX0pLHRoaXN9LGhhczpmdW5j
dGlvbihlKXtyZXR1cm4gZT9vZS5pbkFycmF5KGUsYSk+LTE6YS5sZW5ndGg+MH0sZW1wdHk6ZnVu
Y3Rpb24oKXtyZXR1cm4gYSYmKGE9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4g
aT1zPVtdLGE9cj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFhfSxsb2NrOmZ1
bmN0aW9uKCl7cmV0dXJuIGk9cz1bXSxyfHwoYT1yPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24o
KXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUscil7cmV0dXJuIGl8fChyPXJ8fFtdLHI9
W2Usci5zbGljZT9yLnNsaWNlKCk6cl0scy5wdXNoKHIpLHR8fGwoKSksdGhpc30sZmlyZTpmdW5j
dGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5j
dGlvbigpe3JldHVybiEhbn19O3JldHVybiBjfSxvZS5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9u
KGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIixvZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
InJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixvZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
InJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsb2UuQ2FsbGJhY2tzKCJtZW1vcnkiKV1d
LHI9InBlbmRpbmciLG49e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlv
bigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpm
dW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gb2UuRGVmZXJyZWQoZnVuY3Rpb24ocil7
b2UuZWFjaCh0LGZ1bmN0aW9uKHQsbyl7dmFyIGE9b2UuaXNGdW5jdGlvbihlW3RdKSYmZVt0XTtp
W29bMV1dKGZ1bmN0aW9uKCl7dmFyIGU9YSYmYS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmb2Uu
aXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25l
KHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6cltvWzBdKyJXaXRoIl0odGhpcz09PW4/ci5wcm9t
aXNlKCk6dGhpcyxhP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21p
c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/b2UuZXh0ZW5kKGUsbik6bn19LGk9e307cmV0
dXJuIG4ucGlwZT1uLnRoZW4sb2UuZWFjaCh0LGZ1bmN0aW9uKGUsbyl7dmFyIGE9b1syXSxzPW9b
M107bltvWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sdFsxXmVdWzJdLmRpc2Fi
bGUsdFsyXVsyXS5sb2NrKSxpW29bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbb1swXSsiV2l0aCJd
KHRoaXM9PT1pP246dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbb1swXSsiV2l0aCJdPWEuZmlyZVdp
dGh9KSxuLnByb21pc2UoaSksZSYmZS5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbihlKXt2YXIg
dCxyLG4saT0wLG89WS5jYWxsKGFyZ3VtZW50cyksYT1vLmxlbmd0aCxzPTEhPT1hfHxlJiZvZS5p
c0Z1bmN0aW9uKGUucHJvbWlzZSk/YTowLHU9MT09PXM/ZTpvZS5EZWZlcnJlZCgpLGw9ZnVuY3Rp
b24oZSxyLG4pe3JldHVybiBmdW5jdGlvbihpKXtyW2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVu
Z3RoPjE/WS5jYWxsKGFyZ3VtZW50cyk6aSxuPT09dD91Lm5vdGlmeVdpdGgocixuKTotLXN8fHUu
cmVzb2x2ZVdpdGgocixuKX19O2lmKGE+MSlmb3IodD1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXko
YSksbj1uZXcgQXJyYXkoYSk7aTxhO2krKylvW2ldJiZvZS5pc0Z1bmN0aW9uKG9baV0ucHJvbWlz
ZSk/b1tpXS5wcm9taXNlKCkucHJvZ3Jlc3MobChpLHIsdCkpLmRvbmUobChpLG4sbykpLmZhaWwo
dS5yZWplY3QpOi0tcztyZXR1cm4gc3x8dS5yZXNvbHZlV2l0aChuLG8pLHUucHJvbWlzZSgpfX0p
O3ZhciB4ZTtvZS5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gb2UucmVhZHkucHJvbWlzZSgp
LmRvbmUoZSksdGhpc30sb2UuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFk
eTpmdW5jdGlvbihlKXtlP29lLnJlYWR5V2FpdCsrOm9lLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rp
b24oZSl7KGU9PT0hMD8tLW9lLnJlYWR5V2FpdDpvZS5pc1JlYWR5KXx8KG9lLmlzUmVhZHk9ITAs
ZSE9PSEwJiYtLW9lLnJlYWR5V2FpdD4wfHwoeGUucmVzb2x2ZVdpdGgoRyxbb2VdKSxvZS5mbi50
cmlnZ2VySGFuZGxlciYmKG9lKEcpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG9lKEcpLm9mZigi
cmVhZHkiKSkpKX19KSxvZS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKHQpe3JldHVybiB4ZXx8KHhl
PW9lLkRlZmVycmVkKCksImNvbXBsZXRlIj09PUcucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09Ry5y
ZWFkeVN0YXRlJiYhRy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/ZS5zZXRUaW1lb3V0KG9lLnJl
YWR5KTooRy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixhKSxlLmFkZEV2ZW50
TGlzdGVuZXIoImxvYWQiLGEpKSkseGUucHJvbWlzZSh0KX0sb2UucmVhZHkucHJvbWlzZSgpO3Zh
ciBrZT1mdW5jdGlvbihlLHQscixuLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1y
O2lmKCJvYmplY3QiPT09b2UudHlwZShyKSl7aT0hMDtmb3IocyBpbiByKWtlKGUsdCxzLHJbc10s
ITAsbyxhKX1lbHNlIGlmKHZvaWQgMCE9PW4mJihpPSEwLG9lLmlzRnVuY3Rpb24obil8fChhPSEw
KSxsJiYoYT8odC5jYWxsKGUsbiksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LHIpe3JldHVy
biBsLmNhbGwob2UoZSkscil9KSksdCkpZm9yKDtzPHU7cysrKXQoZVtzXSxyLGE/bjpuLmNhbGwo
ZVtzXSxzLHQoZVtzXSxyKSkpO3JldHVybiBpP2U6bD90LmNhbGwoZSk6dT90KGVbMF0scik6b30s
Q2U9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStl
Lm5vZGVUeXBlfTtzLnVpZD0xLHMucHJvdG90eXBlPXtyZWdpc3RlcjpmdW5jdGlvbihlLHQpe3Zh
ciByPXR8fHt9O3JldHVybiBlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT1yOk9iamVjdC5kZWZp
bmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6cix3cml0YWJsZTohMCxjb25maWd1cmFi
bGU6ITB9KSxlW3RoaXMuZXhwYW5kb119LGNhY2hlOmZ1bmN0aW9uKGUpe2lmKCFDZShlKSlyZXR1
cm57fTt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LENlKGUpJiYoZS5ub2Rl
VHlwZT9lW3RoaXMuZXhwYW5kb109dDpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0aGlzLmV4cGFu
ZG8se3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSkpKSx0fSxzZXQ6ZnVuY3Rpb24oZSx0LHIpe3Zh
ciBuLGk9dGhpcy5jYWNoZShlKTtpZigic3RyaW5nIj09dHlwZW9mIHQpaVt0XT1yO2Vsc2UgZm9y
KG4gaW4gdClpW25dPXRbbl07cmV0dXJuIGl9LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lk
IDA9PT10P3RoaXMuY2FjaGUoZSk6ZVt0aGlzLmV4cGFuZG9dJiZlW3RoaXMuZXhwYW5kb11bdF19
LGFjY2VzczpmdW5jdGlvbihlLHQscil7dmFyIG47cmV0dXJuIHZvaWQgMD09PXR8fHQmJiJzdHJp
bmciPT10eXBlb2YgdCYmdm9pZCAwPT09cj8obj10aGlzLmdldChlLHQpLHZvaWQgMCE9PW4/bjp0
aGlzLmdldChlLG9lLmNhbWVsQ2FzZSh0KSkpOih0aGlzLnNldChlLHQsciksdm9pZCAwIT09cj9y
OnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGksbz1lW3RoaXMuZXhwYW5kb107aWYo
dm9pZCAwIT09byl7aWYodm9pZCAwPT09dCl0aGlzLnJlZ2lzdGVyKGUpO2Vsc2V7b2UuaXNBcnJh
eSh0KT9uPXQuY29uY2F0KHQubWFwKG9lLmNhbWVsQ2FzZSkpOihpPW9lLmNhbWVsQ2FzZSh0KSx0
IGluIG8/bj1bdCxpXToobj1pLG49biBpbiBvP1tuXTpuLm1hdGNoKHdlKXx8W10pKSxyPW4ubGVu
Z3RoO2Zvcig7ci0tOylkZWxldGUgb1tuW3JdXX0odm9pZCAwPT09dHx8b2UuaXNFbXB0eU9iamVj
dChvKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5l
eHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1
cm4gdm9pZCAwIT09dCYmIW9lLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgRWU9bmV3IHMsT2U9bmV3
IHMsVGU9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOZT0vW0EtWl0vZztvZS5leHRl
bmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIE9lLmhhc0RhdGEoZSl8fEVlLmhhc0RhdGEo
ZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBPZS5hY2Nlc3MoZSx0LHIpfSxyZW1vdmVE
YXRhOmZ1bmN0aW9uKGUsdCl7T2UucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxyKXty
ZXR1cm4gRWUuYWNjZXNzKGUsdCxyKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtFZS5yZW1v
dmUoZSx0KX19KSxvZS5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGksbz10
aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWUpe2lmKHRoaXMubGVuZ3RoJiYo
aT1PZS5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFFZS5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtm
b3Iocj1hLmxlbmd0aDtyLS07KWFbcl0mJihuPWFbcl0ubmFtZSwwPT09bi5pbmRleE9mKCJkYXRh
LSIpJiYobj1vZS5jYW1lbENhc2Uobi5zbGljZSg1KSksdShvLG4saVtuXSkpKTtFZS5zZXQobywi
aGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMu
ZWFjaChmdW5jdGlvbigpe09lLnNldCh0aGlzLGUpfSk6a2UodGhpcyxmdW5jdGlvbih0KXt2YXIg
cixuO2lmKG8mJnZvaWQgMD09PXQpe2lmKHI9T2UuZ2V0KG8sZSl8fE9lLmdldChvLGUucmVwbGFj
ZShOZSwiLSQmIikudG9Mb3dlckNhc2UoKSksdm9pZCAwIT09cilyZXR1cm4gcjtpZihuPW9lLmNh
bWVsQ2FzZShlKSxyPU9lLmdldChvLG4pLHZvaWQgMCE9PXIpcmV0dXJuIHI7aWYocj11KG8sbix2
b2lkIDApLHZvaWQgMCE9PXIpcmV0dXJuIHJ9ZWxzZSBuPW9lLmNhbWVsQ2FzZShlKSx0aGlzLmVh
Y2goZnVuY3Rpb24oKXt2YXIgcj1PZS5nZXQodGhpcyxuKTtPZS5zZXQodGhpcyxuLHQpLGUuaW5k
ZXhPZigiLSIpPi0xJiZ2b2lkIDAhPT1yJiZPZS5zZXQodGhpcyxlLHQpfSl9LG51bGwsdCxhcmd1
bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbigpe09lLnJlbW92ZSh0aGlzLGUpfSl9fSksb2UuZXh0ZW5kKHtxdWV1
ZTpmdW5jdGlvbihlLHQscil7dmFyIG47aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixu
PUVlLmdldChlLHQpLHImJighbnx8b2UuaXNBcnJheShyKT9uPUVlLmFjY2VzcyhlLHQsb2UubWFr
ZUFycmF5KHIpKTpuLnB1c2gocikpLG58fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwi
ZngiO3ZhciByPW9lLnF1ZXVlKGUsdCksbj1yLmxlbmd0aCxpPXIuc2hpZnQoKSxvPW9lLl9xdWV1
ZUhvb2tzKGUsdCksYT1mdW5jdGlvbigpe29lLmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09
aSYmKGk9ci5zaGlmdCgpLG4tLSksaSYmKCJmeCI9PT10JiZyLnVuc2hpZnQoImlucHJvZ3Jlc3Mi
KSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFuJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1
ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgcj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gRWUuZ2V0
KGUscil8fEVlLmFjY2VzcyhlLHIse2VtcHR5Om9lLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5h
ZGQoZnVuY3Rpb24oKXtFZS5yZW1vdmUoZSxbdCsicXVldWUiLHJdKX0pfSl9fSksb2UuZm4uZXh0
ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQpe3ZhciByPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBl
JiYodD1lLGU9ImZ4IixyLS0pLGFyZ3VtZW50cy5sZW5ndGg8cj9vZS5xdWV1ZSh0aGlzWzBdLGUp
OnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1vZS5xdWV1ZSh0aGlz
LGUsdCk7b2UuX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09clsw
XSYmb2UuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpe29lLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9u
KGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7
dmFyIHIsbj0xLGk9b2UuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9u
KCl7LS1ufHxpLnJlc29sdmVXaXRoKG8sW29dKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgZSYmKHQ9
ZSxlPXZvaWQgMCksZT1lfHwiZngiO2EtLTspcj1FZS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIiks
ciYmci5lbXB0eSYmKG4rKyxyLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9
fSk7dmFyIFNlPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLEFl
PW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitTZSsiKShbYS16JV0qKSQiLCJpIiksUGU9WyJU
b3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxqZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPXR8
fGUsIm5vbmUiPT09b2UuY3NzKGUsImRpc3BsYXkiKXx8IW9lLmNvbnRhaW5zKGUub3duZXJEb2N1
bWVudCxlKX0sUmU9L14oPzpjaGVja2JveHxyYWRpbykkL2ksTGU9LzwoW1x3Oi1dKykvLERlPS9e
JHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxNZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxl
PSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJd
LGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIs
Ijx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5
Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O01lLm9w
dGdyb3VwPU1lLm9wdGlvbixNZS50Ym9keT1NZS50Zm9vdD1NZS5jb2xncm91cD1NZS5jYXB0aW9u
PU1lLnRoZWFkLE1lLnRoPU1lLnRkO3ZhciBJZT0vPHwmIz9cdys7LzshZnVuY3Rpb24oKXt2YXIg
ZT1HLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0PWUuYXBwZW5kQ2hpbGQoRy5jcmVhdGVFbGVt
ZW50KCJkaXYiKSkscj1HLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ci5zZXRBdHRyaWJ1dGUoInR5
cGUiLCJyYWRpbyIpLHIuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHIuc2V0QXR0
cmlidXRlKCJuYW1lIiwidCIpLHQuYXBwZW5kQ2hpbGQociksbmUuY2hlY2tDbG9uZT10LmNsb25l
Tm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmlubmVySFRNTD0iPHRl
eHRhcmVhPng8L3RleHRhcmVhPiIsbmUubm9DbG9uZUNoZWNrZWQ9ISF0LmNsb25lTm9kZSghMCku
bGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgRmU9L15rZXkvLEhlPS9eKD86bW91c2V8cG9p
bnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxWZT0vXihbXi5dKikoPzpcLiguKyl8
KS87b2UuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LHIsbixpKXt2YXIgbyxhLHMs
dSxsLGMsZixkLHAsaCxtLHY9RWUuZ2V0KGUpO2lmKHYpZm9yKHIuaGFuZGxlciYmKG89cixyPW8u
aGFuZGxlcixpPW8uc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD1vZS5ndWlkKyspLCh1PXYuZXZl
bnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24o
dCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBvZSYmb2UuZXZlbnQudHJpZ2dlcmVkIT09dC50
eXBlP29lLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSx0PSh0fHwi
IikubWF0Y2god2UpfHxbIiJdLGw9dC5sZW5ndGg7bC0tOylzPVZlLmV4ZWModFtsXSl8fFtdLHA9
bT1zWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxwJiYoZj1vZS5ldmVudC5zcGVj
aWFsW3BdfHx7fSxwPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxwLGY9b2UuZXZlbnQu
c3BlY2lhbFtwXXx8e30sYz1vZS5leHRlbmQoe3R5cGU6cCxvcmlnVHlwZTptLGRhdGE6bixoYW5k
bGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmb2UuZXhwci5tYXRj
aC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChkPXVbcF0p
fHwoZD11W3BdPVtdLGQuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJmYuc2V0dXAuY2FsbChlLG4s
aCxhKSE9PSExfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihwLGEpKSxm
LmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPXIu
Z3VpZCkpLGk/ZC5zcGxpY2UoZC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpkLnB1c2goYyksb2UuZXZl
bnQuZ2xvYmFsW3BdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxyLG4saSl7dmFyIG8sYSxzLHUs
bCxjLGYsZCxwLGgsbSx2PUVlLmhhc0RhdGEoZSkmJkVlLmdldChlKTtpZih2JiYodT12LmV2ZW50
cykpe2Zvcih0PSh0fHwiIikubWF0Y2god2UpfHxbIiJdLGw9dC5sZW5ndGg7bC0tOylpZihzPVZl
LmV4ZWModFtsXSl8fFtdLHA9bT1zWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxw
KXtmb3IoZj1vZS5ldmVudC5zcGVjaWFsW3BdfHx7fSxwPShuP2YuZGVsZWdhdGVUeXBlOmYuYmlu
ZFR5cGUpfHxwLGQ9dVtwXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4o
IlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1kLmxlbmd0aDtvLS07KWM9ZFtvXSwhaSYm
bSE9PWMub3JpZ1R5cGV8fHImJnIuZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFj
ZSl8fG4mJm4hPT1jLnNlbGVjdG9yJiYoIioqIiE9PW58fCFjLnNlbGVjdG9yKXx8KGQuc3BsaWNl
KG8sMSksYy5zZWxlY3RvciYmZC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNh
bGwoZSxjKSk7YSYmIWQubGVuZ3RoJiYoZi50ZWFyZG93biYmZi50ZWFyZG93bi5jYWxsKGUsaCx2
LmhhbmRsZSkhPT0hMXx8b2UucmVtb3ZlRXZlbnQoZSxwLHYuaGFuZGxlKSxkZWxldGUgdVtwXSl9
ZWxzZSBmb3IocCBpbiB1KW9lLmV2ZW50LnJlbW92ZShlLHArdFtsXSxyLG4sITApO29lLmlzRW1w
dHlPYmplY3QodSkmJkVlLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5j
dGlvbihlKXtlPW9lLmV2ZW50LmZpeChlKTt2YXIgdCxyLG4saSxvLGE9W10scz1ZLmNhbGwoYXJn
dW1lbnRzKSx1PShFZS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtlLnR5cGVdfHxbXSxsPW9lLmV2
ZW50LnNwZWNpYWxbZS50eXBlXXx8e307aWYoc1swXT1lLGUuZGVsZWdhdGVUYXJnZXQ9dGhpcywh
bC5wcmVEaXNwYXRjaHx8bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsZSkhPT0hMSl7Zm9yKGE9b2Uu
ZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGUsdSksdD0wOyhpPWFbdCsrXSkmJiFlLmlzUHJvcGFn
YXRpb25TdG9wcGVkKCk7KWZvcihlLmN1cnJlbnRUYXJnZXQ9aS5lbGVtLHI9MDsobz1pLmhhbmRs
ZXJzW3IrK10pJiYhZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOyllLnJuYW1lc3Bh
Y2UmJiFlLnJuYW1lc3BhY2UudGVzdChvLm5hbWVzcGFjZSl8fChlLmhhbmRsZU9iaj1vLGUuZGF0
YT1vLmRhdGEsbj0oKG9lLmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8u
aGFuZGxlcikuYXBwbHkoaS5lbGVtLHMpLHZvaWQgMCE9PW4mJihlLnJlc3VsdD1uKT09PSExJiYo
ZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gbC5wb3N0RGlz
cGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxlKSxlLnJlc3VsdH19LGhhbmRsZXJzOmZ1
bmN0aW9uKGUsdCl7dmFyIHIsbixpLG8sYT1bXSxzPXQuZGVsZWdhdGVDb3VudCx1PWUudGFyZ2V0
O2lmKHMmJnUubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHxpc05hTihlLmJ1dHRvbil8fGUu
YnV0dG9uPDEpKWZvcig7dSE9PXRoaXM7dT11LnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PXUubm9k
ZVR5cGUmJih1LmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1lLnR5cGUpKXtmb3Iobj1bXSxyPTA7
cjxzO3IrKylvPXRbcl0saT1vLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1uW2ldJiYobltpXT1vLm5l
ZWRzQ29udGV4dD9vZShpLHRoaXMpLmluZGV4KHUpPi0xOm9lLmZpbmQoaSx0aGlzLG51bGwsW3Vd
KS5sZW5ndGgpLG5baV0mJm4ucHVzaChvKTtuLmxlbmd0aCYmYS5wdXNoKHtlbGVtOnUsaGFuZGxl
cnM6bn0pfXJldHVybiBzPHQubGVuZ3RoJiZhLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczp0LnNs
aWNlKHMpfSksYX0scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJy
ZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtl
eSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5
SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRl
cjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lLndoaWNoJiYoZS53aGljaD1udWxsIT10LmNo
YXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRv
biBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2Ny
ZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt2
YXIgcixuLGksbz10LmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS5wYWdlWCYmbnVsbCE9dC5jbGllbnRY
JiYocj1lLnRhcmdldC5vd25lckRvY3VtZW50fHxHLG49ci5kb2N1bWVudEVsZW1lbnQsaT1yLmJv
ZHksZS5wYWdlWD10LmNsaWVudFgrKG4mJm4uc2Nyb2xsTGVmdHx8aSYmaS5zY3JvbGxMZWZ0fHww
KS0obiYmbi5jbGllbnRMZWZ0fHxpJiZpLmNsaWVudExlZnR8fDApLGUucGFnZVk9dC5jbGllbnRZ
KyhuJiZuLnNjcm9sbFRvcHx8aSYmaS5zY3JvbGxUb3B8fDApLShuJiZuLmNsaWVudFRvcHx8aSYm
aS5jbGllbnRUb3B8fDApKSxlLndoaWNofHx2b2lkIDA9PT1vfHwoZS53aGljaD0xJm8/MToyJm8/
Mzo0Jm8/MjowKSxlfX0sZml4OmZ1bmN0aW9uKGUpe2lmKGVbb2UuZXhwYW5kb10pcmV0dXJuIGU7
dmFyIHQscixuLGk9ZS50eXBlLG89ZSxhPXRoaXMuZml4SG9va3NbaV07Zm9yKGF8fCh0aGlzLmZp
eEhvb2tzW2ldPWE9SGUudGVzdChpKT90aGlzLm1vdXNlSG9va3M6RmUudGVzdChpKT90aGlzLmtl
eUhvb2tzOnt9KSxuPWEucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoYS5wcm9wcyk6dGhpcy5wcm9w
cyxlPW5ldyBvZS5FdmVudChvKSx0PW4ubGVuZ3RoO3QtLTspcj1uW3RdLGVbcl09b1tyXTtyZXR1
cm4gZS50YXJnZXR8fChlLnRhcmdldD1HKSwzPT09ZS50YXJnZXQubm9kZVR5cGUmJihlLnRhcmdl
dD1lLnRhcmdldC5wYXJlbnROb2RlKSxhLmZpbHRlcj9hLmZpbHRlcihlLG8pOmV9LHNwZWNpYWw6
e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1t
KCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1
c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT1tKCkmJnRoaXMuYmx1cily
ZXR1cm4gdGhpcy5ibHVyKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJp
Z2dlcjpmdW5jdGlvbigpe2lmKCJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJm9l
Lm5vZGVOYW1lKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6
ZnVuY3Rpb24oZSl7cmV0dXJuIG9lLm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxv
YWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5h
bEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sb2UucmVt
b3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LHIpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVF
dmVudExpc3RlbmVyKHQscil9LG9lLkV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMgaW5z
dGFuY2VvZiBvZS5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5
cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9p
ZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiZlLnJldHVyblZhbHVlPT09ITE/cDpoKTp0aGlzLnR5
cGU9ZSx0JiZvZS5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8
b2Uubm93KCksdm9pZCh0aGlzW29lLmV4cGFuZG9dPSEwKSk6bmV3IG9lLkV2ZW50KGUsdCl9LG9l
LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2UuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVk
OmgsaXNQcm9wYWdhdGlvblN0b3BwZWQ6aCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpo
LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmln
aW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXAsZSYmIXRoaXMuaXNTaW11bGF0ZWQm
JmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhp
cy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cCxlJiYhdGhpcy5pc1Np
bXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1
bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdh
dGlvblN0b3BwZWQ9cCxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFn
YXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sb2UuZWFjaCh7bW91c2VlbnRlcjoibW91
c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIs
cG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSx0KXtvZS5ldmVudC5zcGVjaWFs
W2VdPXtkZWxlZ2F0ZVR5cGU6dCxiaW5kVHlwZTp0LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgcixu
PXRoaXMsaT1lLnJlbGF0ZWRUYXJnZXQsbz1lLmhhbmRsZU9iajtyZXR1cm4gaSYmKGk9PT1ufHxv
ZS5jb250YWlucyhuLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLHI9by5oYW5kbGVyLmFwcGx5KHRo
aXMsYXJndW1lbnRzKSxlLnR5cGU9dCkscn19fSksb2UuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihl
LHQscixuKXtyZXR1cm4gdih0aGlzLGUsdCxyLG4pfSxvbmU6ZnVuY3Rpb24oZSx0LHIsbil7cmV0
dXJuIHYodGhpcyxlLHQscixuLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGk7aWYoZSYm
ZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIG49ZS5oYW5kbGVPYmosb2UoZS5k
ZWxlZ2F0ZVRhcmdldCkub2ZmKG4ubmFtZXNwYWNlP24ub3JpZ1R5cGUrIi4iK24ubmFtZXNwYWNl
Om4ub3JpZ1R5cGUsbi5zZWxlY3RvcixuLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVv
ZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4gdCE9
PSExJiYiZnVuY3Rpb24iIT10eXBlb2YgdHx8KHI9dCx0PXZvaWQgMCkscj09PSExJiYocj1oKSx0
aGlzLmVhY2goZnVuY3Rpb24oKXtvZS5ldmVudC5yZW1vdmUodGhpcyxlLHIsdCl9KX19KTt2YXIg
cWU9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgo
W1x3Oi1dKylbXj5dKilcLz4vZ2ksemU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksQmU9L2NoZWNr
ZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksVWU9L150cnVlXC8oLiopLyxXZT0vXlxzKjwh
KD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7b2UuZXh0ZW5kKHtodG1sUHJlZmls
dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocWUsIjwkMT48LyQyPiIpfSxjbG9uZTpm
dW5jdGlvbihlLHQscil7dmFyIG4saSxvLGEscz1lLmNsb25lTm9kZSghMCksdT1vZS5jb250YWlu
cyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoIShuZS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5
cGUmJjExIT09ZS5ub2RlVHlwZXx8b2UuaXNYTUxEb2MoZSkpKWZvcihhPWMocyksbz1jKGUpLG49
MCxpPW8ubGVuZ3RoO248aTtuKyspdyhvW25dLGFbbl0pO2lmKHQpaWYocilmb3Iobz1vfHxjKGUp
LGE9YXx8YyhzKSxuPTAsaT1vLmxlbmd0aDtuPGk7bisrKV8ob1tuXSxhW25dKTtlbHNlIF8oZSxz
KTtyZXR1cm4gYT1jKHMsInNjcmlwdCIpLGEubGVuZ3RoPjAmJmYoYSwhdSYmYyhlLCJzY3JpcHQi
KSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyLG4saT1vZS5ldmVudC5zcGVj
aWFsLG89MDt2b2lkIDAhPT0ocj1lW29dKTtvKyspaWYoQ2Uocikpe2lmKHQ9cltFZS5leHBhbmRv
XSl7aWYodC5ldmVudHMpZm9yKG4gaW4gdC5ldmVudHMpaVtuXT9vZS5ldmVudC5yZW1vdmUocixu
KTpvZS5yZW1vdmVFdmVudChyLG4sdC5oYW5kbGUpO3JbRWUuZXhwYW5kb109dm9pZCAwfXJbT2Uu
ZXhwYW5kb10mJihyW09lLmV4cGFuZG9dPXZvaWQgMCl9fX0pLG9lLmZuLmV4dGVuZCh7ZG9tTWFu
aXA6eCxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGsodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0
aW9uKGUpe3JldHVybiBrKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGtlKHRoaXMs
ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/b2UudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCku
ZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkh
PT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRz
Lmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB4KHRoaXMsYXJndW1lbnRzLGZ1bmN0
aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlz
Lm5vZGVUeXBlKXt2YXIgdD1iKHRoaXMsZSk7dC5hcHBlbmRDaGlsZChlKX19KX0scHJlcGVuZDpm
dW5jdGlvbigpe3JldHVybiB4KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlz
Lm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1i
KHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rp
b24oKXtyZXR1cm4geCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUm
JnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigp
e3JldHVybiB4KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhp
cy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1
bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5
cGUmJihvZS5jbGVhbkRhdGEoYyhlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9
LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRo
aXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG9lLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0
aW9uKGUpe3JldHVybiBrZSh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LHI9MCxu
PXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVy
SFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiF6ZS50ZXN0KGUpJiYhTWVbKExlLmV4ZWMoZSl8
fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPW9lLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zv
cig7cjxuO3IrKyl0PXRoaXNbcl18fHt9LDE9PT10Lm5vZGVUeXBlJiYob2UuY2xlYW5EYXRhKGMo
dCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBl
bmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2
YXIgZT1bXTtyZXR1cm4geCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt2YXIgcj10aGlzLnBh
cmVudE5vZGU7b2UuaW5BcnJheSh0aGlzLGUpPDAmJihvZS5jbGVhbkRhdGEoYyh0aGlzKSksciYm
ci5yZXBsYWNlQ2hpbGQodCx0aGlzKSl9LGUpfX0pLG9lLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQi
LHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJh
ZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe29lLmZuW2VdPWZ1
bmN0aW9uKGUpe2Zvcih2YXIgcixuPVtdLGk9b2UoZSksbz1pLmxlbmd0aC0xLGE9MDthPD1vO2Er
KylyPWE9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCksb2UoaVthXSlbdF0ociksSi5hcHBseShuLHIu
Z2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgJGUsS2U9e0hUTUw6ImJsb2Nr
IixCT0RZOiJibG9jayJ9LFFlPS9ebWFyZ2luLyxHZT1uZXcgUmVnRXhwKCJeKCIrU2UrIikoPyFw
eClbYS16JV0rJCIsImkiKSxZZT1mdW5jdGlvbih0KXt2YXIgcj10Lm93bmVyRG9jdW1lbnQuZGVm
YXVsdFZpZXc7cmV0dXJuIHImJnIub3BlbmVyfHwocj1lKSxyLmdldENvbXB1dGVkU3R5bGUodCl9
LFhlPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHls
ZVtvXSxlLnN0eWxlW29dPXRbb107aT1yLmFwcGx5KGUsbnx8W10pO2ZvcihvIGluIHQpZS5zdHls
ZVtvXT1hW29dO3JldHVybiBpfSxKZT1HLmRvY3VtZW50RWxlbWVudDshZnVuY3Rpb24oKXtmdW5j
dGlvbiB0KCl7cy5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDst
bW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246
cmVsYXRpdmU7ZGlzcGxheTpibG9jazttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4
O3RvcDoxJTt3aWR0aDo1MCUiLHMuaW5uZXJIVE1MPSIiLEplLmFwcGVuZENoaWxkKGEpO3ZhciB0
PWUuZ2V0Q29tcHV0ZWRTdHlsZShzKTtyPSIxJSIhPT10LnRvcCxvPSIycHgiPT09dC5tYXJnaW5M
ZWZ0LG49IjRweCI9PT10LndpZHRoLHMuc3R5bGUubWFyZ2luUmlnaHQ9IjUwJSIsaT0iNHB4Ij09
PXQubWFyZ2luUmlnaHQsSmUucmVtb3ZlQ2hpbGQoYSl9dmFyIHIsbixpLG8sYT1HLmNyZWF0ZUVs
ZW1lbnQoImRpdiIpLHM9Ry5jcmVhdGVFbGVtZW50KCJkaXYiKTtzLnN0eWxlJiYocy5zdHlsZS5i
YWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLHMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3Jv
dW5kQ2xpcD0iIixuZS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PXMuc3R5bGUuYmFj
a2dyb3VuZENsaXAsYS5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDo4cHg7aGVpZ2h0OjA7
dG9wOjA7bGVmdDotOTk5OXB4O3BhZGRpbmc6MDttYXJnaW4tdG9wOjFweDtwb3NpdGlvbjphYnNv
bHV0ZSIsYS5hcHBlbmRDaGlsZChzKSxvZS5leHRlbmQobmUse3BpeGVsUG9zaXRpb246ZnVuY3Rp
b24oKXtyZXR1cm4gdCgpLHJ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51
bGw9PW4mJnQoKSxufSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PW4m
JnQoKSxpfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09biYmdCgp
LG99LHJlbGlhYmxlTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXt2YXIgdCxyPXMuYXBwZW5kQ2hpbGQo
Ry5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmV0dXJuIHIuc3R5bGUuY3NzVGV4dD1zLnN0eWxlLmNz
c1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQt
Ym94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixyLnN0eWxlLm1h
cmdpblJpZ2h0PXIuc3R5bGUud2lkdGg9IjAiLHMuc3R5bGUud2lkdGg9IjFweCIsSmUuYXBwZW5k
Q2hpbGQoYSksdD0hcGFyc2VGbG9hdChlLmdldENvbXB1dGVkU3R5bGUocikubWFyZ2luUmlnaHQp
LEplLnJlbW92ZUNoaWxkKGEpLHMucmVtb3ZlQ2hpbGQociksdH19KSl9KCk7dmFyIFplPS9eKG5v
bmV8dGFibGUoPyEtY1tlYV0pLispLyxldD17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5
OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sdHQ9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWln
aHQ6IjQwMCJ9LHJ0PVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sbnQ9Ry5jcmVhdGVFbGVtZW50
KCJkaXYiKS5zdHlsZTtvZS5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24o
ZSx0KXtpZih0KXt2YXIgcj1PKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PXI/IjEiOnJ9fX19LGNz
c051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9w
YWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWln
aHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAs
em9vbTohMH0sY3NzUHJvcHM6e2Zsb2F0OiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGUsdCxy
LG4pe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGks
byxhLHM9b2UuY2FtZWxDYXNlKHQpLHU9ZS5zdHlsZTtyZXR1cm4gdD1vZS5jc3NQcm9wc1tzXXx8
KG9lLmNzc1Byb3BzW3NdPU4ocyl8fHMpLGE9b2UuY3NzSG9va3NbdF18fG9lLmNzc0hvb2tzW3Nd
LHZvaWQgMD09PXI/YSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLG4pKT9pOnVb
dF06KG89dHlwZW9mIHIsInN0cmluZyI9PT1vJiYoaT1BZS5leGVjKHIpKSYmaVsxXSYmKHI9bChl
LHQsaSksbz0ibnVtYmVyIiksbnVsbCE9ciYmcj09PXImJigibnVtYmVyIj09PW8mJihyKz1pJiZp
WzNdfHwob2UuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSxuZS5jbGVhckNsb25lU3R5bGV8fCIiIT09
cnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwodVt0XT0iaW5oZXJpdCIpLGEmJiJzZXQi
aW4gYSYmdm9pZCAwPT09KHI9YS5zZXQoZSxyLG4pKXx8KHVbdF09cikpLHZvaWQgMCl9fSxjc3M6
ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGksbyxhLHM9b2UuY2FtZWxDYXNlKHQpO3JldHVybiB0PW9l
LmNzc1Byb3BzW3NdfHwob2UuY3NzUHJvcHNbc109TihzKXx8cyksYT1vZS5jc3NIb29rc1t0XXx8
b2UuY3NzSG9va3Nbc10sYSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLHIpKSx2b2lkIDA9PT1p
JiYoaT1PKGUsdCxuKSksIm5vcm1hbCI9PT1pJiZ0IGluIHR0JiYoaT10dFt0XSksIiI9PT1yfHxy
PyhvPXBhcnNlRmxvYXQoaSkscj09PSEwfHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksb2UuZWFj
aChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx0KXtvZS5jc3NIb29rc1t0XT17Z2V0OmZ1
bmN0aW9uKGUscixuKXtpZihyKXJldHVybiBaZS50ZXN0KG9lLmNzcyhlLCJkaXNwbGF5IikpJiYw
PT09ZS5vZmZzZXRXaWR0aD9YZShlLGV0LGZ1bmN0aW9uKCl7cmV0dXJuIFAoZSx0LG4pfSk6UChl
LHQsbil9LHNldDpmdW5jdGlvbihlLHIsbil7dmFyIGksbz1uJiZZZShlKSxhPW4mJkEoZSx0LG4s
ImJvcmRlci1ib3giPT09b2UuY3NzKGUsImJveFNpemluZyIsITEsbyksbyk7cmV0dXJuIGEmJihp
PUFlLmV4ZWMocikpJiYicHgiIT09KGlbM118fCJweCIpJiYoZS5zdHlsZVt0XT1yLHI9b2UuY3Nz
KGUsdCkpLFMoZSxyLGEpfX19KSxvZS5jc3NIb29rcy5tYXJnaW5MZWZ0PVQobmUucmVsaWFibGVN
YXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChPKGUsIm1hcmdp
bkxlZnQiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1YZShlLHttYXJnaW5MZWZ0
OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsi
cHgifSksb2UuY3NzSG9va3MubWFyZ2luUmlnaHQ9VChuZS5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1
bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gWGUoZSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sTyxb
ZSwibWFyZ2luUmlnaHQiXSl9KSxvZS5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6
IldpZHRoIn0sZnVuY3Rpb24oZSx0KXtvZS5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24o
cil7Zm9yKHZhciBuPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygcj9yLnNwbGl0KCIgIik6W3Jd
O248NDtuKyspaVtlK1BlW25dK3RdPW9bbl18fG9bbi0yXXx8b1swXTtyZXR1cm4gaX19LFFlLnRl
c3QoZSl8fChvZS5jc3NIb29rc1tlK3RdLnNldD1TKX0pLG9lLmZuLmV4dGVuZCh7Citjc3M6ZnVu
Y3Rpb24oZSx0KXtyZXR1cm4ga2UodGhpcyxmdW5jdGlvbihlLHQscil7dmFyIG4saSxvPXt9LGE9
MDtpZihvZS5pc0FycmF5KHQpKXtmb3Iobj1ZZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2Fd
XT1vZS5jc3MoZSx0W2FdLCExLG4pO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1yP29lLnN0eWxl
KGUsdCxyKTpvZS5jc3MoZSx0KX0sZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rp
b24oKXtyZXR1cm4gaih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBqKHRoaXMpfSx0
b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygp
OnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2plKHRoaXMpP29lKHRoaXMpLnNob3co
KTpvZSh0aGlzKS5oaWRlKCl9KX19KSxvZS5Ud2Vlbj1SLFIucHJvdG90eXBlPXtjb25zdHJ1Y3Rv
cjpSLGluaXQ6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1yLHRo
aXMuZWFzaW5nPWl8fG9lLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0
PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9bix0aGlzLnVuaXQ9b3x8KG9lLmNzc051bWJl
cltyXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9Ui5wcm9wSG9va3NbdGhpcy5wcm9w
XTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6Ui5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRo
aXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQscj1SLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVy
biB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1vZS5lYXNpbmdbdGhpcy5lYXNpbmdd
KGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhp
cy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhp
cy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93
LHRoaXMpLHImJnIuc2V0P3Iuc2V0KHRoaXMpOlIucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlz
KSx0aGlzfX0sUi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9Ui5wcm90b3R5cGUsUi5wcm9wSG9v
a3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9k
ZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9l
LmVsZW1bZS5wcm9wXToodD1vZS5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90
OjApfSxzZXQ6ZnVuY3Rpb24oZSl7b2UuZnguc3RlcFtlLnByb3BdP29lLmZ4LnN0ZXBbZS5wcm9w
XShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbb2UuY3NzUHJvcHNb
ZS5wcm9wXV0mJiFvZS5jc3NIb29rc1tlLnByb3BdP2UuZWxlbVtlLnByb3BdPWUubm93Om9lLnN0
eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSxSLnByb3BIb29rcy5zY3JvbGxUb3A9
Ui5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYm
ZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxvZS5lYXNpbmc9e2xp
bmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0
aC5jb3MoZSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxvZS5meD1SLnByb3RvdHlwZS5p
bml0LG9lLmZ4LnN0ZXA9e307dmFyIGl0LG90LGF0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxz
dD0vcXVldWVIb29rcyQvO29lLkFuaW1hdGlvbj1vZS5leHRlbmQoSCx7dHdlZW5lcnM6eyIqIjpb
ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIGwoci5lbGVt
LGUsQWUuZXhlYyh0KSxyKSxyfV19LHR3ZWVuZXI6ZnVuY3Rpb24oZSx0KXtvZS5pc0Z1bmN0aW9u
KGUpPyh0PWUsZT1bIioiXSk6ZT1lLm1hdGNoKHdlKTtmb3IodmFyIHIsbj0wLGk9ZS5sZW5ndGg7
bjxpO24rKylyPWVbbl0sSC50d2VlbmVyc1tyXT1ILnR3ZWVuZXJzW3JdfHxbXSxILnR3ZWVuZXJz
W3JdLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W0ldLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/
SC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6SC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksb2Uuc3BlZWQ9
ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPWUmJiJvYmplY3QiPT10eXBlb2YgZT9vZS5leHRlbmQoe30s
ZSk6e2NvbXBsZXRlOnJ8fCFyJiZ0fHxvZS5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFz
aW5nOnImJnR8fHQmJiFvZS5pc0Z1bmN0aW9uKHQpJiZ0fTtyZXR1cm4gbi5kdXJhdGlvbj1vZS5m
eC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIG4uZHVyYXRpb24/bi5kdXJhdGlvbjpuLmR1cmF0aW9u
IGluIG9lLmZ4LnNwZWVkcz9vZS5meC5zcGVlZHNbbi5kdXJhdGlvbl06b2UuZnguc3BlZWRzLl9k
ZWZhdWx0LG51bGwhPW4ucXVldWUmJm4ucXVldWUhPT0hMHx8KG4ucXVldWU9ImZ4Iiksbi5vbGQ9
bi5jb21wbGV0ZSxuLmNvbXBsZXRlPWZ1bmN0aW9uKCl7b2UuaXNGdW5jdGlvbihuLm9sZCkmJm4u
b2xkLmNhbGwodGhpcyksbi5xdWV1ZSYmb2UuZGVxdWV1ZSh0aGlzLG4ucXVldWUpfSxufSxvZS5m
bi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdGhpcy5maWx0ZXIoamUp
LmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxyLG4p
fSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpPW9lLmlzRW1wdHlPYmplY3QoZSksbz1v
ZS5zcGVlZCh0LHIsbiksYT1mdW5jdGlvbigpe3ZhciB0PUgodGhpcyxvZS5leHRlbmQoe30sZSks
byk7KGl8fEVlLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlz
aD1hLGl8fG8ucXVldWU9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxz
dG9wOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRl
IGUuc3RvcCx0KHIpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihyPXQsdD1lLGU9dm9pZCAw
KSx0JiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7
dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPW9lLnRpbWVycyxhPUVlLmdldCh0
aGlzKTtpZihpKWFbaV0mJmFbaV0uc3RvcCYmbihhW2ldKTtlbHNlIGZvcihpIGluIGEpYVtpXSYm
YVtpXS5zdG9wJiZzdC50ZXN0KGkpJiZuKGFbaV0pO2ZvcihpPW8ubGVuZ3RoO2ktLTspb1tpXS5l
bGVtIT09dGhpc3x8bnVsbCE9ZSYmb1tpXS5xdWV1ZSE9PWV8fChvW2ldLmFuaW0uc3RvcChyKSx0
PSExLG8uc3BsaWNlKGksMSkpOyF0JiZyfHxvZS5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1
bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigp
e3ZhciB0LHI9RWUuZ2V0KHRoaXMpLG49cltlKyJxdWV1ZSJdLGk9cltlKyJxdWV1ZUhvb2tzIl0s
bz1vZS50aW1lcnMsYT1uP24ubGVuZ3RoOjA7Zm9yKHIuZmluaXNoPSEwLG9lLnF1ZXVlKHRoaXMs
ZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0
XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxp
Y2UodCwxKSk7Zm9yKHQ9MDt0PGE7dCsrKW5bdF0mJm5bdF0uZmluaXNoJiZuW3RdLmZpbmlzaC5j
YWxsKHRoaXMpO2RlbGV0ZSByLmZpbmlzaH0pfX0pLG9lLmVhY2goWyJ0b2dnbGUiLCJzaG93Iiwi
aGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIHI9b2UuZm5bdF07b2UuZm5bdF09ZnVuY3Rpb24oZSxu
LGkpe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP3IuYXBwbHkodGhpcyxhcmd1
bWVudHMpOnRoaXMuYW5pbWF0ZShEKHQsITApLGUsbixpKX19KSxvZS5lYWNoKHtzbGlkZURvd246
RCgic2hvdyIpLHNsaWRlVXA6RCgiaGlkZSIpLHNsaWRlVG9nZ2xlOkQoInRvZ2dsZSIpLGZhZGVJ
bjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntv
cGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXtvZS5mbltlXT1mdW5jdGlvbihlLHIsbil7
cmV0dXJuIHRoaXMuYW5pbWF0ZSh0LGUscixuKX19KSxvZS50aW1lcnM9W10sb2UuZngudGljaz1m
dW5jdGlvbigpe3ZhciBlLHQ9MCxyPW9lLnRpbWVycztmb3IoaXQ9b2Uubm93KCk7dDxyLmxlbmd0
aDt0KyspZT1yW3RdLGUoKXx8clt0XSE9PWV8fHIuc3BsaWNlKHQtLSwxKTtyLmxlbmd0aHx8b2Uu
Znguc3RvcCgpLGl0PXZvaWQgMH0sb2UuZngudGltZXI9ZnVuY3Rpb24oZSl7b2UudGltZXJzLnB1
c2goZSksZSgpP29lLmZ4LnN0YXJ0KCk6b2UudGltZXJzLnBvcCgpfSxvZS5meC5pbnRlcnZhbD0x
MyxvZS5meC5zdGFydD1mdW5jdGlvbigpe290fHwob3Q9ZS5zZXRJbnRlcnZhbChvZS5meC50aWNr
LG9lLmZ4LmludGVydmFsKSl9LG9lLmZ4LnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFySW50ZXJ2YWwo
b3QpLG90PW51bGx9LG9lLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAw
fSxvZS5mbi5kZWxheT1mdW5jdGlvbih0LHIpe3JldHVybiB0PW9lLmZ4P29lLmZ4LnNwZWVkc1t0
XXx8dDp0LHI9cnx8ImZ4Iix0aGlzLnF1ZXVlKHIsZnVuY3Rpb24ocixuKXt2YXIgaT1lLnNldFRp
bWVvdXQocix0KTtuLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rp
b24oKXt2YXIgZT1HLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1HLmNyZWF0ZUVsZW1lbnQoInNl
bGVjdCIpLHI9dC5hcHBlbmRDaGlsZChHLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtlLnR5cGU9
ImNoZWNrYm94IixuZS5jaGVja09uPSIiIT09ZS52YWx1ZSxuZS5vcHRTZWxlY3RlZD1yLnNlbGVj
dGVkLHQuZGlzYWJsZWQ9ITAsbmUub3B0RGlzYWJsZWQ9IXIuZGlzYWJsZWQsZT1HLmNyZWF0ZUVs
ZW1lbnQoImlucHV0IiksZS52YWx1ZT0idCIsZS50eXBlPSJyYWRpbyIsbmUucmFkaW9WYWx1ZT0i
dCI9PT1lLnZhbHVlfSgpO3ZhciB1dCxsdD1vZS5leHByLmF0dHJIYW5kbGU7b2UuZm4uZXh0ZW5k
KHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGtlKHRoaXMsb2UuYXR0cixlLHQsYXJndW1lbnRz
Lmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCl7b2UucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksb2UuZXh0ZW5kKHthdHRyOmZ1bmN0aW9u
KGUsdCxyKXt2YXIgbixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVy
biJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/b2UucHJvcChlLHQscik6KDE9PT1v
JiZvZS5pc1hNTERvYyhlKXx8KHQ9dC50b0xvd2VyQ2FzZSgpLGk9b2UuYXR0ckhvb2tzW3RdfHwo
b2UuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/dXQ6dm9pZCAwKSksdm9pZCAwIT09cj9udWxsPT09
cj92b2lkIG9lLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShuPWkuc2V0
KGUscix0KSk/bjooZS5zZXRBdHRyaWJ1dGUodCxyKyIiKSxyKTppJiYiZ2V0ImluIGkmJm51bGwh
PT0obj1pLmdldChlLHQpKT9uOihuPW9lLmZpbmQuYXR0cihlLHQpLG51bGw9PW4/dm9pZCAwOm4p
KX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighbmUucmFkaW9WYWx1ZSYm
InJhZGlvIj09PXQmJm9lLm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciByPWUudmFsdWU7cmV0dXJu
IGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxyJiYoZS52YWx1ZT1yKSx0fX19fSxyZW1vdmVBdHRy
OmZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpPTAsbz10JiZ0Lm1hdGNoKHdlKTtpZihvJiYxPT09ZS5u
b2RlVHlwZSlmb3IoO3I9b1tpKytdOyluPW9lLnByb3BGaXhbcl18fHIsb2UuZXhwci5tYXRjaC5i
b29sLnRlc3QocikmJihlW25dPSExKSxlLnJlbW92ZUF0dHJpYnV0ZShyKX19KSx1dD17c2V0OmZ1
bmN0aW9uKGUsdCxyKXtyZXR1cm4gdD09PSExP29lLnJlbW92ZUF0dHIoZSxyKTplLnNldEF0dHJp
YnV0ZShyLHIpLHJ9fSxvZS5lYWNoKG9lLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3
Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciByPWx0W3RdfHxvZS5maW5kLmF0dHI7bHRbdF09ZnVuY3Rp
b24oZSx0LG4pe3ZhciBpLG87cmV0dXJuIG58fChvPWx0W3RdLGx0W3RdPWksaT1udWxsIT1yKGUs
dCxuKT90LnRvTG93ZXJDYXNlKCk6bnVsbCxsdFt0XT1vKSxpfX0pO3ZhciBjdD0vXig/OmlucHV0
fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGZ0PS9eKD86YXxhcmVhKSQvaTtvZS5mbi5leHRl
bmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ga2UodGhpcyxvZS5wcm9wLGUsdCxhcmd1bWVu
dHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oKXtkZWxldGUgdGhpc1tvZS5wcm9wRml4W2VdfHxlXX0pfX0pLG9lLmV4dGVuZCh7cHJv
cDpmdW5jdGlvbihlLHQscil7dmFyIG4saSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYy
IT09bylyZXR1cm4gMT09PW8mJm9lLmlzWE1MRG9jKGUpfHwodD1vZS5wcm9wRml4W3RdfHx0LGk9
b2UucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1yP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KG49aS5z
ZXQoZSxyLHQpKT9uOmVbdF09cjppJiYiZ2V0ImluIGkmJm51bGwhPT0obj1pLmdldChlLHQpKT9u
OmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1vZS5maW5k
LmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpjdC50ZXN0KGUubm9k
ZU5hbWUpfHxmdC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4Ontmb3I6
Imh0bWxGb3IiLGNsYXNzOiJjbGFzc05hbWUifX0pLG5lLm9wdFNlbGVjdGVkfHwob2UucHJvcEhv
b2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0
JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5j
dGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5v
ZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxvZS5lYWNoKFsidGFiSW5kZXgiLCJy
ZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFu
IiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVu
Y3Rpb24oKXtvZS5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO3ZhciBkdD0vW1x0
XHJcblxmXS9nO29lLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQscixuLGks
byxhLHMsdT0wO2lmKG9lLmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0
KXtvZSh0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LFYodGhpcykpKX0pO2lmKCJzdHJpbmci
PT10eXBlb2YgZSYmZSlmb3IodD1lLm1hdGNoKHdlKXx8W107cj10aGlzW3UrK107KWlmKGk9Vihy
KSxuPTE9PT1yLm5vZGVUeXBlJiYoIiAiK2krIiAiKS5yZXBsYWNlKGR0LCIgIikpe2ZvcihhPTA7
bz10W2ErK107KW4uaW5kZXhPZigiICIrbysiICIpPDAmJihuKz1vKyIgIik7cz1vZS50cmltKG4p
LGkhPT1zJiZyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFz
czpmdW5jdGlvbihlKXt2YXIgdCxyLG4saSxvLGEscyx1PTA7aWYob2UuaXNGdW5jdGlvbihlKSly
ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe29lKHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0
aGlzLHQsVih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigi
Y2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGUmJmUpZm9yKHQ9ZS5tYXRjaCh3ZSl8fFtd
O3I9dGhpc1t1KytdOylpZihpPVYociksbj0xPT09ci5ub2RlVHlwZSYmKCIgIitpKyIgIikucmVw
bGFjZShkdCwiICIpKXtmb3IoYT0wO289dFthKytdOylmb3IoO24uaW5kZXhPZigiICIrbysiICIp
Pi0xOyluPW4ucmVwbGFjZSgiICIrbysiICIsIiAiKTtzPW9lLnRyaW0obiksaSE9PXMmJnIuc2V0
QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUs
dCl7dmFyIHI9dHlwZW9mIGU7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmInN0cmluZyI9PT1y
P3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOm9lLmlzRnVuY3Rpb24oZSk/
dGhpcy5lYWNoKGZ1bmN0aW9uKHIpe29lKHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLHIs
Vih0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG4saSxvO2lmKCJzdHJp
bmciPT09cilmb3Iobj0wLGk9b2UodGhpcyksbz1lLm1hdGNoKHdlKXx8W107dD1vW24rK107KWku
aGFzQ2xhc3ModCk/aS5yZW1vdmVDbGFzcyh0KTppLmFkZENsYXNzKHQpO2Vsc2Ugdm9pZCAwIT09
ZSYmImJvb2xlYW4iIT09cnx8KHQ9Vih0aGlzKSx0JiZFZS5zZXQodGhpcywiX19jbGFzc05hbWVf
XyIsdCksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsdHx8ZT09
PSExPyIiOkVlLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVu
Y3Rpb24oZSl7dmFyIHQscixuPTA7Zm9yKHQ9IiAiK2UrIiAiO3I9dGhpc1tuKytdOylpZigxPT09
ci5ub2RlVHlwZSYmKCIgIitWKHIpKyIgIikucmVwbGFjZShkdCwiICIpLmluZGV4T2YodCk+LTEp
cmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHB0PS9cci9nLGh0PS9bXHgyMFx0XHJcblxmXSsvZztv
ZS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxyLG4saT10aGlzWzBdO3tpZihhcmd1
bWVudHMubGVuZ3RoKXJldHVybiBuPW9lLmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9u
KHIpe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYoaT1uP2UuY2FsbCh0aGlzLHIsb2UodGhpcyku
dmFsKCkpOmUsbnVsbD09aT9pPSIiOiJudW1iZXIiPT10eXBlb2YgaT9pKz0iIjpvZS5pc0FycmF5
KGkpJiYoaT1vZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLHQ9
b2UudmFsSG9va3NbdGhpcy50eXBlXXx8b2UudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpXSx0JiYic2V0ImluIHQmJnZvaWQgMCE9PXQuc2V0KHRoaXMsaSwidmFsdWUiKXx8KHRo
aXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4gdD1vZS52YWxIb29rc1tpLnR5cGVdfHxvZS52YWxI
b29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHQmJiJnZXQiaW4gdCYmdm9pZCAwIT09KHI9
dC5nZXQoaSwidmFsdWUiKSk/cjoocj1pLnZhbHVlLCJzdHJpbmciPT10eXBlb2Ygcj9yLnJlcGxh
Y2UocHQsIiIpOm51bGw9PXI/IiI6cil9fX0pLG9lLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7
Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW9lLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxs
IT10P3Q6b2UudHJpbShvZS50ZXh0KGUpKS5yZXBsYWNlKGh0LCIgIil9fSxzZWxlY3Q6e2dldDpm
dW5jdGlvbihlKXtmb3IodmFyIHQscixuPWUub3B0aW9ucyxpPWUuc2VsZWN0ZWRJbmRleCxvPSJz
ZWxlY3Qtb25lIj09PWUudHlwZXx8aTwwLGE9bz9udWxsOltdLHM9bz9pKzE6bi5sZW5ndGgsdT1p
PDA/czpvP2k6MDt1PHM7dSsrKWlmKHI9blt1XSwoci5zZWxlY3RlZHx8dT09PWkpJiYobmUub3B0
RGlzYWJsZWQ/IXIuZGlzYWJsZWQ6bnVsbD09PXIuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKSYm
KCFyLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFvZS5ub2RlTmFtZShyLnBhcmVudE5vZGUsIm9wdGdy
b3VwIikpKXtpZih0PW9lKHIpLnZhbCgpLG8pcmV0dXJuIHQ7YS5wdXNoKHQpfXJldHVybiBhfSxz
ZXQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIsbixpPWUub3B0aW9ucyxvPW9lLm1ha2VBcnJheSh0
KSxhPWkubGVuZ3RoO2EtLTspbj1pW2FdLChuLnNlbGVjdGVkPW9lLmluQXJyYXkob2UudmFsSG9v
a3Mub3B0aW9uLmdldChuKSxvKT4tMSkmJihyPSEwKTtyZXR1cm4gcnx8KGUuc2VsZWN0ZWRJbmRl
eD0tMSksb319fX0pLG9lLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtvZS52
YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7aWYob2UuaXNBcnJheSh0KSlyZXR1cm4g
ZS5jaGVja2VkPW9lLmluQXJyYXkob2UoZSkudmFsKCksdCk+LTF9fSxuZS5jaGVja09ufHwob2Uu
dmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1
dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KTt2YXIgbXQ9L14oPzpmb2N1c2luZm9jdXN8Zm9j
dXNvdXRibHVyKSQvO29lLmV4dGVuZChvZS5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LHIsbixp
KXt2YXIgbyxhLHMsdSxsLGMsZixkPVtufHxHXSxwPXJlLmNhbGwodCwidHlwZSIpP3QudHlwZTp0
LGg9cmUuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9
cz1uPW58fEcsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhbXQudGVzdChwK29lLmV2
ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKGg9cC5zcGxpdCgiLiIpLHA9aC5z
aGlmdCgpLGguc29ydCgpKSxsPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCx0PXRbb2UuZXhwYW5k
b10/dDpuZXcgb2UuRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPWk/
MjozLHQubmFtZXNwYWNlPWguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcg
UmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGws
dC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9bikscj1udWxsPT1yP1t0XTpvZS5t
YWtlQXJyYXkocixbdF0pLGY9b2UuZXZlbnQuc3BlY2lhbFtwXXx8e30saXx8IWYudHJpZ2dlcnx8
Zi50cmlnZ2VyLmFwcGx5KG4scikhPT0hMSkpe2lmKCFpJiYhZi5ub0J1YmJsZSYmIW9lLmlzV2lu
ZG93KG4pKXtmb3IodT1mLmRlbGVnYXRlVHlwZXx8cCxtdC50ZXN0KHUrcCl8fChhPWEucGFyZW50
Tm9kZSk7YTthPWEucGFyZW50Tm9kZSlkLnB1c2goYSkscz1hO3M9PT0obi5vd25lckRvY3VtZW50
fHxHKSYmZC5wdXNoKHMuZGVmYXVsdFZpZXd8fHMucGFyZW50V2luZG93fHxlKX1mb3Iobz0wOyhh
PWRbbysrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KXQudHlwZT1vPjE/dTpmLmJpbmRU
eXBlfHxwLGM9KEVlLmdldChhLCJldmVudHMiKXx8e30pW3QudHlwZV0mJkVlLmdldChhLCJoYW5k
bGUiKSxjJiZjLmFwcGx5KGEsciksYz1sJiZhW2xdLGMmJmMuYXBwbHkmJkNlKGEpJiYodC5yZXN1
bHQ9Yy5hcHBseShhLHIpLHQucmVzdWx0PT09ITEmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJu
IHQudHlwZT1wLGl8fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGYuX2RlZmF1bHQmJmYuX2RlZmF1
bHQuYXBwbHkoZC5wb3AoKSxyKSE9PSExfHwhQ2Uobil8fGwmJm9lLmlzRnVuY3Rpb24obltwXSkm
JiFvZS5pc1dpbmRvdyhuKSYmKHM9bltsXSxzJiYobltsXT1udWxsKSxvZS5ldmVudC50cmlnZ2Vy
ZWQ9cCxuW3BdKCksb2UuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxzJiYobltsXT1zKSksdC5yZXN1
bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQscil7dmFyIG49b2UuZXh0ZW5kKG5ldyBvZS5FdmVu
dCxyLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtvZS5ldmVudC50cmlnZ2VyKG4sbnVsbCx0KX19
KSxvZS5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1
bmN0aW9uKCl7b2UuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVu
Y3Rpb24oZSx0KXt2YXIgcj10aGlzWzBdO2lmKHIpcmV0dXJuIG9lLmV2ZW50LnRyaWdnZXIoZSx0
LHIsITApfX0pLG9lLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6
ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92
ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qg
c3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIg
IiksZnVuY3Rpb24oZSx0KXtvZS5mblt0XT1mdW5jdGlvbihlLHIpe3JldHVybiBhcmd1bWVudHMu
bGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxyKTp0aGlzLnRyaWdnZXIodCl9fSksb2UuZm4uZXh0
ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2Vs
ZWF2ZSh0fHxlKX19KSxuZS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZSxuZS5mb2N1c2lufHxvZS5l
YWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBy
PWZ1bmN0aW9uKGUpe29lLmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsb2UuZXZlbnQuZml4KGUp
KX07b2UuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVy
RG9jdW1lbnR8fHRoaXMsaT1FZS5hY2Nlc3Mobix0KTtpfHxuLmFkZEV2ZW50TGlzdGVuZXIoZSxy
LCEwKSxFZS5hY2Nlc3Mobix0LChpfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgbj10
aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsaT1FZS5hY2Nlc3Mobix0KS0xO2k/RWUuYWNjZXNzKG4s
dCxpKToobi5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCksRWUucmVtb3ZlKG4sdCkpfX19KTt2
YXIgdnQ9ZS5sb2NhdGlvbixidD1vZS5ub3coKSxndD0vXD8vO29lLnBhcnNlSlNPTj1mdW5jdGlv
bihlKXtyZXR1cm4gSlNPTi5wYXJzZShlKyIiKX0sb2UucGFyc2VYTUw9ZnVuY3Rpb24odCl7dmFy
IHI7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0cnl7cj0obmV3IGUuRE9N
UGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC94bWwiKX1jYXRjaChlKXtyPXZvaWQgMH1y
ZXR1cm4gciYmIXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxv
ZS5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCkscn07dmFyIHl0PS8jLiokLyxfdD0vKFs/Jl0pXz1b
XiZdKi8sd3Q9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSx4dD0vXig/OmFib3V0fGFwcHxh
cHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxrdD0vXig/OkdFVHxI
RUFEKSQvLEN0PS9eXC9cLy8sRXQ9e30sT3Q9e30sVHQ9IiovIi5jb25jYXQoIioiKSxOdD1HLmNy
ZWF0ZUVsZW1lbnQoImEiKTtOdC5ocmVmPXZ0LmhyZWYsb2UuZXh0ZW5kKHthY3RpdmU6MCxsYXN0
TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDp2dC5ocmVmLHR5cGU6IkdFVCIs
aXNMb2NhbDp4dC50ZXN0KHZ0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5
bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hh
cnNldD1VVEYtOCIsYWNjZXB0czp7IioiOlR0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQv
aHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9q
c29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0
bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRl
eHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4
dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOm9lLnBhcnNlSlNPTiwidGV4dCB4
bWwiOm9lLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0
dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9CKEIoZSxvZS5hamF4U2V0dGluZ3MpLHQpOkIob2Uu
YWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOnEoRXQpLGFqYXhUcmFuc3BvcnQ6cShPdCks
YWpheDpmdW5jdGlvbih0LHIpe2Z1bmN0aW9uIG4odCxyLG4scyl7dmFyIGwsZixnLHksdyxrPXI7
MiE9PV8mJihfPTIsdSYmZS5jbGVhclRpbWVvdXQodSksaT12b2lkIDAsYT1zfHwiIix4LnJlYWR5
U3RhdGU9dD4wPzQ6MCxsPXQ+PTIwMCYmdDwzMDB8fDMwND09PXQsbiYmKHk9VShkLHgsbikpLHk9
VyhkLHkseCxsKSxsPyhkLmlmTW9kaWZpZWQmJih3PXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3Qt
TW9kaWZpZWQiKSx3JiYob2UubGFzdE1vZGlmaWVkW29dPXcpLHc9eC5nZXRSZXNwb25zZUhlYWRl
cigiZXRhZyIpLHcmJihvZS5ldGFnW29dPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1kLnR5cGU/az0i
bm9jb250ZW50IjozMDQ9PT10P2s9Im5vdG1vZGlmaWVkIjooaz15LnN0YXRlLGY9eS5kYXRhLGc9
eS5lcnJvcixsPSFnKSk6KGc9aywhdCYma3x8KGs9ImVycm9yIix0PDAmJih0PTApKSkseC5zdGF0
dXM9dCx4LnN0YXR1c1RleHQ9KHJ8fGspKyIiLGw/bS5yZXNvbHZlV2l0aChwLFtmLGsseF0pOm0u
cmVqZWN0V2l0aChwLFt4LGssZ10pLHguc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxjJiZoLnRyaWdn
ZXIobD8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt4LGQsbD9mOmddKSx2LmZpcmVXaXRoKHAs
W3gsa10pLGMmJihoLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3gsZF0pLC0tb2UuYWN0aXZlfHxv
ZS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9Im9iamVjdCI9PXR5cGVvZiB0JiYocj10LHQ9
dm9pZCAwKSxyPXJ8fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYsZD1vZS5hamF4U2V0dXAoe30sciks
cD1kLmNvbnRleHR8fGQsaD1kLmNvbnRleHQmJihwLm5vZGVUeXBlfHxwLmpxdWVyeSk/b2UocCk6
b2UuZXZlbnQsbT1vZS5EZWZlcnJlZCgpLHY9b2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGI9
ZC5zdGF0dXNDb2RlfHx7fSxnPXt9LHk9e30sXz0wLHc9ImNhbmNlbGVkIix4PXtyZWFkeVN0YXRl
OjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PV8pe2lmKCFzKWZv
cihzPXt9O3Q9d3QuZXhlYyhhKTspc1t0WzFdLnRvTG93ZXJDYXNlKCldPXRbMl07dD1zW2UudG9M
b3dlckNhc2UoKV19cmV0dXJuIG51bGw9PXQ/bnVsbDp0fSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6
ZnVuY3Rpb24oKXtyZXR1cm4gMj09PV8/YTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9u
KGUsdCl7dmFyIHI9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiBffHwoZT15W3JdPXlbcl18fGUsZ1tl
XT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBffHwoZC5taW1l
VHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoXzwyKWZv
cih0IGluIGUpYlt0XT1bYlt0XSxlW3RdXTtlbHNlIHguYWx3YXlzKGVbeC5zdGF0dXNdKTtyZXR1
cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dztyZXR1cm4gaSYmaS5hYm9ydCh0
KSxuKDAsdCksdGhpc319O2lmKG0ucHJvbWlzZSh4KS5jb21wbGV0ZT12LmFkZCx4LnN1Y2Nlc3M9
eC5kb25lLHguZXJyb3I9eC5mYWlsLGQudXJsPSgodHx8ZC51cmx8fHZ0LmhyZWYpKyIiKS5yZXBs
YWNlKHl0LCIiKS5yZXBsYWNlKEN0LHZ0LnByb3RvY29sKyIvLyIpLGQudHlwZT1yLm1ldGhvZHx8
ci50eXBlfHxkLm1ldGhvZHx8ZC50eXBlLGQuZGF0YVR5cGVzPW9lLnRyaW0oZC5kYXRhVHlwZXx8
IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKHdlKXx8WyIiXSxudWxsPT1kLmNyb3NzRG9tYWluKXts
PUcuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtsLmhyZWY9ZC51cmwsbC5ocmVmPWwuaHJlZixkLmNy
b3NzRG9tYWluPU50LnByb3RvY29sKyIvLyIrTnQuaG9zdCE9bC5wcm90b2NvbCsiLy8iK2wuaG9z
dH1jYXRjaChlKXtkLmNyb3NzRG9tYWluPSEwfX1pZihkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJiJz
dHJpbmciIT10eXBlb2YgZC5kYXRhJiYoZC5kYXRhPW9lLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlv
bmFsKSkseihFdCxkLHIseCksMj09PV8pcmV0dXJuIHg7Yz1vZS5ldmVudCYmZC5nbG9iYWwsYyYm
MD09PW9lLmFjdGl2ZSsrJiZvZS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxkLnR5cGU9ZC50
eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFrdC50ZXN0KGQudHlwZSksbz1kLnVybCxk
Lmhhc0NvbnRlbnR8fChkLmRhdGEmJihvPWQudXJsKz0oZ3QudGVzdChvKT8iJiI6Ij8iKStkLmRh
dGEsZGVsZXRlIGQuZGF0YSksZC5jYWNoZT09PSExJiYoZC51cmw9X3QudGVzdChvKT9vLnJlcGxh
Y2UoX3QsIiQxXz0iK2J0KyspOm8rKGd0LnRlc3Qobyk/IiYiOiI/IikrIl89IitidCsrKSksZC5p
Zk1vZGlmaWVkJiYob2UubGFzdE1vZGlmaWVkW29dJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1v
ZGlmaWVkLVNpbmNlIixvZS5sYXN0TW9kaWZpZWRbb10pLG9lLmV0YWdbb10mJnguc2V0UmVxdWVz
dEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsb2UuZXRhZ1tvXSkpLChkLmRhdGEmJmQuaGFzQ29udGVu
dCYmZC5jb250ZW50VHlwZSE9PSExfHxyLmNvbnRlbnRUeXBlKSYmeC5zZXRSZXF1ZXN0SGVhZGVy
KCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0
IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5k
YXRhVHlwZXNbMF1dKygiKiIhPT1kLmRhdGFUeXBlc1swXT8iLCAiK1R0KyI7IHE9MC4wMSI6IiIp
OmQuYWNjZXB0c1siKiJdKTtmb3IoZiBpbiBkLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGYs
ZC5oZWFkZXJzW2ZdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChwLHgsZCk9
PT0hMXx8Mj09PV8pKXJldHVybiB4LmFib3J0KCk7dz0iYWJvcnQiO2ZvcihmIGlue3N1Y2Nlc3M6
MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXhbZl0oZFtmXSk7aWYoaT16KE90LGQscix4KSl7aWYoeC5y
ZWFkeVN0YXRlPTEsYyYmaC50cmlnZ2VyKCJhamF4U2VuZCIsW3gsZF0pLDI9PT1fKXJldHVybiB4
O2QuYXN5bmMmJmQudGltZW91dD4wJiYodT1lLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt4LmFib3J0
KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtfPTEsaS5zZW5kKGcsbil9Y2F0Y2goZSl7aWYo
IShfPDIpKXRocm93IGU7bigtMSxlKX19ZWxzZSBuKC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4g
eH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQscil7cmV0dXJuIG9lLmdldChlLHQsciwianNvbiIpfSxn
ZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gb2UuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIp
fX0pLG9lLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSx0KXtvZVt0XT1mdW5jdGlvbihl
LHIsbixpKXtyZXR1cm4gb2UuaXNGdW5jdGlvbihyKSYmKGk9aXx8bixuPXIscj12b2lkIDApLG9l
LmFqYXgob2UuZXh0ZW5kKHt1cmw6ZSx0eXBlOnQsZGF0YVR5cGU6aSxkYXRhOnIsc3VjY2Vzczpu
fSxvZS5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksb2UuX2V2YWxVcmw9ZnVuY3Rpb24oZSl7cmV0
dXJuIG9lLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEs
Z2xvYmFsOiExLHRocm93czohMH0pfSxvZS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7
dmFyIHQ7cmV0dXJuIG9lLmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe29lKHRo
aXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk6KHRoaXNbMF0mJih0PW9lKGUsdGhpc1swXS5v
d25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2Vy
dEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzO2UuZmlyc3RF
bGVtZW50Q2hpbGQ7KWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlz
KSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gb2UuaXNGdW5jdGlvbihlKT90
aGlzLmVhY2goZnVuY3Rpb24odCl7b2UodGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0p
OnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PW9lKHRoaXMpLHI9dC5jb250ZW50cygpO3IubGVu
Z3RoP3Iud3JhcEFsbChlKTp0LmFwcGVuZChlKX0pfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PW9l
LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXtvZSh0aGlzKS53cmFw
QWxsKHQ/ZS5jYWxsKHRoaXMscik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
cGFyZW50KCkuZWFjaChmdW5jdGlvbigpe29lLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8b2UodGhp
cykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG9lLmV4cHIuZmlsdGVy
cy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIW9lLmV4cHIuZmlsdGVycy52aXNpYmxlKGUpfSxv
ZS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRXaWR0aD4w
fHxlLm9mZnNldEhlaWdodD4wfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPjB9O3ZhciBTdD0v
JTIwL2csQXQ9L1xbXF0kLyxQdD0vXHI/XG4vZyxqdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8
cmVzZXR8ZmlsZSkkL2ksUnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO29l
LnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbj1bXSxpPWZ1bmN0aW9uKGUsdCl7dD1vZS5pc0Z1
bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQsbltuLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50
KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKHZvaWQgMD09PXQmJih0PW9lLmFqYXhT
ZXR0aW5ncyYmb2UuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxvZS5pc0FycmF5KGUpfHxlLmpx
dWVyeSYmIW9lLmlzUGxhaW5PYmplY3QoZSkpb2UuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5h
bWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihyIGluIGUpJChyLGVbcl0sdCxpKTtyZXR1cm4gbi5q
b2luKCImIikucmVwbGFjZShTdCwiKyIpfSxvZS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlv
bigpe3JldHVybiBvZS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJh
eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPW9lLnByb3AodGhp
cywiZWxlbWVudHMiKTtyZXR1cm4gZT9vZS5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5j
dGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhb2UodGhpcykuaXMoIjpk
aXNhYmxlZCIpJiZSdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhanQudGVzdChlKSYmKHRoaXMuY2hl
Y2tlZHx8IVJlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIHI9b2UodGhpcykudmFs
KCk7cmV0dXJuIG51bGw9PXI/bnVsbDpvZS5pc0FycmF5KHIpP29lLm1hcChyLGZ1bmN0aW9uKGUp
e3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoUHQsIlxyXG4iKX19KTp7bmFtZTp0
Lm5hbWUsdmFsdWU6ci5yZXBsYWNlKFB0LCJcclxuIil9fSkuZ2V0KCl9fSksb2UuYWpheFNldHRp
bmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2go
ZSl7fX07dmFyIEx0PXswOjIwMCwxMjIzOjIwNH0sRHQ9b2UuYWpheFNldHRpbmdzLnhocigpO25l
LmNvcnM9ISFEdCYmIndpdGhDcmVkZW50aWFscyJpbiBEdCxuZS5hamF4PUR0PSEhRHQsb2UuYWph
eFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgcixuO2lmKG5lLmNvcnN8fER0JiYhdC5jcm9zc0Rv
bWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4o
dC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylm
b3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO3QubWltZVR5cGUmJnMub3Zl
cnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21h
aW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0
cFJlcXVlc3QiKTtmb3IoYSBpbiBpKXMuc2V0UmVxdWVzdEhlYWRlcihhLGlbYV0pO3I9ZnVuY3Rp
b24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ciYmKHI9bj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFi
b3J0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJv
ciI9PT1lPyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/bygwLCJlcnJvciIpOm8ocy5zdGF0dXMs
cy5zdGF0dXNUZXh0KTpvKEx0W3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0
IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNl
VGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJl
c3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1yKCksbj1zLm9uZXJyb3I9cigiZXJyb3IiKSx2
b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PW46cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rp
b24oKXs0PT09cy5yZWFkeVN0YXRlJiZlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyJiZuKCl9KX0s
cj1yKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNo
KGUpe2lmKHIpdGhyb3cgZX19LGFib3J0OmZ1bmN0aW9uKCl7ciYmcigpfX19KSxvZS5hamF4U2V0
dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2Ny
aXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxj
b250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0
ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIG9lLmdsb2JhbEV2YWwoZSksZX19fSksb2Uu
YWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5j
YWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxvZS5hamF4VHJhbnNwb3J0
KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LHI7cmV0dXJue3Nl
bmQ6ZnVuY3Rpb24obixpKXt0PW9lKCI8c2NyaXB0PiIpLnByb3Aoe2NoYXJzZXQ6ZS5zY3JpcHRD
aGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixyPWZ1bmN0aW9uKGUpe3QucmVtb3Zl
KCkscj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxHLmhlYWQu
YXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7ciYmcigpfX19fSk7dmFyIE10PVtd
LEl0PS8oPSlcPyg/PSZ8JCl8XD9cPy87b2UuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpz
b25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1NdC5wb3AoKXx8b2UuZXhwYW5kbysiXyIrYnQr
KztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLG9lLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1
bmN0aW9uKHQscixuKXt2YXIgaSxvLGEscz10Lmpzb25wIT09ITEmJihJdC50ZXN0KHQudXJsKT8i
dXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5k
ZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkl0LnRlc3QodC5kYXRh
KSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIGk9dC5qc29u
cENhbGxiYWNrPW9lLmlzRnVuY3Rpb24odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2so
KTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShJdCwiJDEiK2kpOnQuanNvbnAh
PT0hMSYmKHQudXJsKz0oZ3QudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5j
b252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fG9lLmVycm9yKGkr
IiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixvPWVbaV0sZVtp
XT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PW8/
b2UoZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1yLmpzb25w
Q2FsbGJhY2ssTXQucHVzaChpKSksYSYmb2UuaXNGdW5jdGlvbihvKSYmbyhhWzBdKSxhPW89dm9p
ZCAwfSksInNjcmlwdCJ9KSxvZS5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LHIpe2lmKCFlfHwic3Ry
aW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKHI9dCx0PSEx
KSx0PXR8fEc7dmFyIG49aGUuZXhlYyhlKSxpPSFyJiZbXTtyZXR1cm4gbj9bdC5jcmVhdGVFbGVt
ZW50KG5bMV0pXToobj1kKFtlXSx0LGkpLGkmJmkubGVuZ3RoJiZvZShpKS5yZW1vdmUoKSxvZS5t
ZXJnZShbXSxuLmNoaWxkTm9kZXMpKX07dmFyIEZ0PW9lLmZuLmxvYWQ7b2UuZm4ubG9hZD1mdW5j
dGlvbihlLHQscil7aWYoInN0cmluZyIhPXR5cGVvZiBlJiZGdClyZXR1cm4gRnQuYXBwbHkodGhp
cyxhcmd1bWVudHMpO3ZhciBuLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4gcz4t
MSYmKG49b2UudHJpbShlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksb2UuaXNGdW5jdGlvbih0
KT8ocj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5n
dGg+MCYmb2UuYWpheCh7dXJsOmUsdHlwZTppfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTp0
fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwobj9vZSgiPGRpdj4iKS5hcHBl
bmQob2UucGFyc2VIVE1MKGUpKS5maW5kKG4pOmUpfSkuYWx3YXlzKHImJmZ1bmN0aW9uKGUsdCl7
YS5lYWNoKGZ1bmN0aW9uKCl7ci5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0p
fSksdGhpc30sb2UuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwi
YWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7b2UuZm5b
dF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxvZS5leHByLmZpbHRlcnMuYW5p
bWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG9lLmdyZXAob2UudGltZXJzLGZ1bmN0aW9uKHQpe3Jl
dHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSxvZS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihl
LHQscil7dmFyIG4saSxvLGEscyx1LGwsYz1vZS5jc3MoZSwicG9zaXRpb24iKSxmPW9lKGUpLGQ9
e307InN0YXRpYyI9PT1jJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWYub2Zmc2V0
KCksbz1vZS5jc3MoZSwidG9wIiksdT1vZS5jc3MoZSwibGVmdCIpLGw9KCJhYnNvbHV0ZSI9PT1j
fHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSxsPyhuPWYucG9zaXRpb24o
KSxhPW4udG9wLGk9bi5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8
MCksb2UuaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUscixvZS5leHRlbmQoe30scykpKSxudWxs
IT10LnRvcCYmKGQudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGQubGVmdD10Lmxl
ZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGQpOmYuY3NzKGQpfX0sb2Uu
Zm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4g
dm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXtvZS5vZmZzZXQuc2V0T2Zmc2V0
KHRoaXMsZSx0KX0pO3ZhciB0LHIsbj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH0sbz1uJiZuLm93
bmVyRG9jdW1lbnQ7aWYobylyZXR1cm4gdD1vLmRvY3VtZW50RWxlbWVudCxvZS5jb250YWlucyh0
LG4pPyhpPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1LKG8pLHt0b3A6aS50b3Arci5wYWdl
WU9mZnNldC10LmNsaWVudFRvcCxsZWZ0OmkubGVmdCtyLnBhZ2VYT2Zmc2V0LXQuY2xpZW50TGVm
dH0pOml9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxyPXRoaXNbMF0s
bj17dG9wOjAsbGVmdDowfTtyZXR1cm4iZml4ZWQiPT09b2UuY3NzKHIsInBvc2l0aW9uIik/dD1y
LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9m
ZnNldCgpLG9lLm5vZGVOYW1lKGVbMF0sImh0bWwiKXx8KG49ZS5vZmZzZXQoKSksbi50b3ArPW9l
LmNzcyhlWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLG4ubGVmdCs9b2UuY3NzKGVbMF0sImJvcmRl
ckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLW4udG9wLW9lLmNzcyhyLCJtYXJnaW5Ub3AiLCEw
KSxsZWZ0OnQubGVmdC1uLmxlZnQtb2UuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQ
YXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhp
cy5vZmZzZXRQYXJlbnQ7ZSYmInN0YXRpYyI9PT1vZS5jc3MoZSwicG9zaXRpb24iKTspZT1lLm9m
ZnNldFBhcmVudDtyZXR1cm4gZXx8SmV9KX19KSxvZS5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9m
ZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIHI9InBhZ2VZ
T2Zmc2V0Ij09PXQ7b2UuZm5bZV09ZnVuY3Rpb24obil7cmV0dXJuIGtlKHRoaXMsZnVuY3Rpb24o
ZSxuLGkpe3ZhciBvPUsoZSk7cmV0dXJuIHZvaWQgMD09PWk/bz9vW3RdOmVbbl06dm9pZChvP28u
c2Nyb2xsVG8ocj9vLnBhZ2VYT2Zmc2V0Omkscj9pOm8ucGFnZVlPZmZzZXQpOmVbbl09aSl9LGUs
bixhcmd1bWVudHMubGVuZ3RoKX19KSxvZS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUs
dCl7b2UuY3NzSG9va3NbdF09VChuZS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUscil7aWYocily
ZXR1cm4gcj1PKGUsdCksR2UudGVzdChyKT9vZShlKS5wb3NpdGlvbigpW3RdKyJweCI6cn0pfSks
b2UuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7b2Uu
ZWFjaCh7cGFkZGluZzoiaW5uZXIiK2UsY29udGVudDp0LCIiOiJvdXRlciIrZX0sZnVuY3Rpb24o
cixuKXtvZS5mbltuXT1mdW5jdGlvbihuLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwi
Ym9vbGVhbiIhPXR5cGVvZiBuKSxhPXJ8fChuPT09ITB8fGk9PT0hMD8ibWFyZ2luIjoiYm9yZGVy
Iik7cmV0dXJuIGtlKHRoaXMsZnVuY3Rpb24odCxyLG4pe3ZhciBpO3JldHVybiBvZS5pc1dpbmRv
dyh0KT90LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlw
ZT8oaT10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0saVsic2Ny
b2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0saVsib2Zmc2V0IitlXSxpWyJjbGllbnQiK2VdKSk6
dm9pZCAwPT09bj9vZS5jc3ModCxyLGEpOm9lLnN0eWxlKHQscixuLGEpfSx0LG8/bjp2b2lkIDAs
byxudWxsKX19KX0pLG9lLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQscil7cmV0dXJuIHRo
aXMub24oZSxudWxsLHQscil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihl
LG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLm9uKHQsZSxy
LG4pfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5n
dGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIscil9LHNpemU6ZnVuY3Rpb24o
KXtyZXR1cm4gdGhpcy5sZW5ndGh9fSksb2UuZm4uYW5kU2VsZj1vZS5mbi5hZGRCYWNrLCJmdW5j
dGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5j
dGlvbigpe3JldHVybiBvZX0pO3ZhciBIdD1lLmpRdWVyeSxWdD1lLiQ7cmV0dXJuIG9lLm5vQ29u
ZmxpY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PW9lJiYoZS4kPVZ0KSx0JiZlLmpRdWVyeT09
PW9lJiYoZS5qUXVlcnk9SHQpLG9lfSx0fHwoZS5qUXVlcnk9ZS4kPW9lKSxvZX0pLGZ1bmN0aW9u
KCl7dmFyIGUsdCxyLG4saT10aGlzOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGkoZSx0KXt0aHJvdyB0
P25ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgbW9kdWxlICIrZSsiIHJlcXVpcmVkIGJ5OiAiK3Qp
Om5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgbW9kdWxlICIrZSl9ZnVuY3Rpb24gbyhlLHQpe3Zh
ciBuPWUsYT1zW25dO2F8fChuKz0iL2luZGV4IixhPXNbbl0pO3ZhciBsPXVbbl07aWYodm9pZCAw
IT09bClyZXR1cm4gbDtsPXVbbl09e30sYXx8aShlLHQpO2Zvcih2YXIgYz1hLmRlcHMsZj1hLmNh
bGxiYWNrLGQ9Yy5sZW5ndGgscD1uZXcgQXJyYXkoZCksaD0wO2g8ZDtoKyspImV4cG9ydHMiPT09
Y1toXT9wW2hdPWw6InJlcXVpcmUiPT09Y1toXT9wW2hdPXI6cFtoXT1vKGNbaF0sbik7cmV0dXJu
IGYuYXBwbHkodGhpcyxwKSxsfXZhciBhPSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93JiYidW5k
ZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5n
LmNhbGwocHJvY2Vzcyk7aWYoYXx8KG49dGhpcy5FbWJlcj10aGlzLkVtYmVyfHx7fSksInVuZGVm
aW5lZCI9PXR5cGVvZiBuJiYobj17fSksInVuZGVmaW5lZCI9PXR5cGVvZiBuLl9fbG9hZGVyKXt2
YXIgcz17fSx1PXt9O2U9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXt9O3I/KG4uZGVwcz10LG4uY2Fs
bGJhY2s9cik6KG4uZGVwcz1bXSxuLmNhbGxiYWNrPXQpLHNbZV09bn0scj10PWZ1bmN0aW9uKGUp
e3JldHVybiBvKGUsbnVsbCl9LHIuZGVmYXVsdD1yLHIuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEh
c1tlXXx8ISFzW2UrIi9pbmRleCJdfSx0Ll9lYWtfc2Vlbj1zLG4uX19sb2FkZXI9e2RlZmluZTpl
LHJlcXVpcmU6cixyZWdpc3RyeTpzfX1lbHNlIGU9bi5fX2xvYWRlci5kZWZpbmUscj10PW4uX19s
b2FkZXIucmVxdWlyZX0oKSxlKCJiYWNrYnVybmVyIixbImV4cG9ydHMiLCJiYWNrYnVybmVyL3V0
aWxzIiwiYmFja2J1cm5lci9wbGF0Zm9ybSIsImJhY2tidXJuZXIvYmluYXJ5LXNlYXJjaCIsImJh
Y2tidXJuZXIvZGVmZXJyZWQtYWN0aW9uLXF1ZXVlcyJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVz
ZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLnF1ZXVlTmFtZXM9ZSx0aGlzLm9wdGlvbnM9
dHx8e30sdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZXx8KHRoaXMub3B0aW9ucy5kZWZhdWx0UXVl
dWU9ZVswXSksdGhpcy5pbnN0YW5jZVN0YWNrPVtdLHRoaXMuX2RlYm91bmNlZXM9W10sdGhpcy5f
dGhyb3R0bGVycz1bXSx0aGlzLl9ldmVudENhbGxiYWNrcz17ZW5kOltdLGJlZ2luOltdfTt2YXIg
bj10aGlzO3RoaXMuX2JvdW5kQ2xlYXJJdGVtcz1mdW5jdGlvbigpe2YoKX0sdGhpcy5fdGltZXJU
aW1lb3V0SWQ9dm9pZCAwLHRoaXMuX3RpbWVycz1bXSx0aGlzLl9wbGF0Zm9ybT10aGlzLm9wdGlv
bnMuX3BsYXRmb3JtfHxyLmRlZmF1bHQsdGhpcy5fYm91bmRSdW5FeHBpcmVkVGltZXJzPWZ1bmN0
aW9uKCl7bi5fcnVuRXhwaXJlZFRpbWVycygpfX1mdW5jdGlvbiBhKGUpe3JldHVybiBlLm9uRXJy
b3J8fGUub25FcnJvclRhcmdldCYmZS5vbkVycm9yVGFyZ2V0W2Uub25FcnJvck1ldGhvZF19ZnVu
Y3Rpb24gcyhlKXtlLmJlZ2luKCksZS5fYXV0b3J1bj1lLl9wbGF0Zm9ybS5zZXRUaW1lb3V0KGZ1
bmN0aW9uKCl7ZS5fYXV0b3J1bj1udWxsLGUuZW5kKCl9KX1mdW5jdGlvbiB1KGUsdCxyKXtyZXR1
cm4gYyhlLHQscil9ZnVuY3Rpb24gbChlLHQscil7cmV0dXJuIGMoZSx0LHIpfWZ1bmN0aW9uIGMo
ZSx0LHIpe2Zvcih2YXIgbixpPS0xLG89MCxhPXIubGVuZ3RoO288YTtvKyspaWYobj1yW29dLG5b
MF09PT1lJiZuWzFdPT09dCl7aT1vO2JyZWFrfXJldHVybiBpfWZ1bmN0aW9uIGYoZSl7dGhpcy5f
cGxhdGZvcm0uY2xlYXJUaW1lb3V0KGVbMl0pfWUuZGVmYXVsdD1vLG8ucHJvdG90eXBlPXtiZWdp
bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucyx0PWUmJmUub25CZWdpbixyPXRoaXMuY3Vy
cmVudEluc3RhbmNlO3ImJnRoaXMuaW5zdGFuY2VTdGFjay5wdXNoKHIpLHRoaXMuY3VycmVudElu
c3RhbmNlPW5ldyBpLmRlZmF1bHQodGhpcy5xdWV1ZU5hbWVzLGUpLHRoaXMuX3RyaWdnZXIoImJl
Z2luIix0aGlzLmN1cnJlbnRJbnN0YW5jZSxyKSx0JiZ0KHRoaXMuY3VycmVudEluc3RhbmNlLHIp
fSxlbmQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMsdD1lJiZlLm9uRW5kLHI9dGhpcy5j
dXJyZW50SW5zdGFuY2Usbj1udWxsLGk9ITE7dHJ5e3IuZmx1c2goKX1maW5hbGx5e2l8fChpPSEw
LHRoaXMuY3VycmVudEluc3RhbmNlPW51bGwsdGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCYmKG49
dGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpLHRoaXMuY3VycmVudEluc3RhbmNlPW4pLHRoaXMuX3Ry
aWdnZXIoImVuZCIscixuKSx0JiZ0KHIsbikpfX0sX3RyaWdnZXI6ZnVuY3Rpb24oZSx0LHIpe3Zh
ciBuPXRoaXMuX2V2ZW50Q2FsbGJhY2tzW2VdO2lmKG4pZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtp
KyspbltpXSh0LHIpfSxvbjpmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRo
cm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciByPXRo
aXMuX2V2ZW50Q2FsbGJhY2tzW2VdO2lmKCFyKXRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBv
bigpIGV2ZW50ICInK2UrJyIgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdCcpO3IucHVzaCh0KX0s
b2ZmOmZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IG9mZigp
IGV2ZW50ICInK2UrJyIgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdCcpO3ZhciByPXRoaXMuX2V2
ZW50Q2FsbGJhY2tzW2VdLG49ITE7aWYocil7aWYodClmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2kr
KylyW2ldPT09dCYmKG49ITAsci5zcGxpY2UoaSwxKSxpLS0pO2lmKCFuKXRocm93IG5ldyBUeXBl
RXJyb3IoIkNhbm5vdCBvZmYoKSBjYWxsYmFjayB0aGF0IGRvZXMgbm90IGV4aXN0Iil9fSxydW46
ZnVuY3Rpb24oKXt2YXIgZSxyLG4saT1hcmd1bWVudHMubGVuZ3RoO2lmKDE9PT1pPyhlPWFyZ3Vt
ZW50c1swXSxyPW51bGwpOihyPWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSksdC5pc1N0cmlu
ZyhlKSYmKGU9cltlXSksaT4yKXtuPW5ldyBBcnJheShpLTIpO2Zvcih2YXIgbz0wLHM9aS0yO288
cztvKyspbltvXT1hcmd1bWVudHNbbysyXX1lbHNlIG49W107dmFyIHU9YSh0aGlzLm9wdGlvbnMp
O3RoaXMuYmVnaW4oKTt2YXIgbD0hMTtpZih1KXRyeXtyZXR1cm4gZS5hcHBseShyLG4pfWNhdGNo
KGUpe3UoZSl9ZmluYWxseXtsfHwobD0hMCx0aGlzLmVuZCgpKX1lbHNlIHRyeXtyZXR1cm4gZS5h
cHBseShyLG4pfWZpbmFsbHl7bHx8KGw9ITAsdGhpcy5lbmQoKSl9fSxqb2luOmZ1bmN0aW9uKCl7
aWYoIXRoaXMuY3VycmVudEluc3RhbmNlKXJldHVybiB0aGlzLnJ1bi5hcHBseSh0aGlzLGFyZ3Vt
ZW50cyk7dmFyIGUscixuPWFyZ3VtZW50cy5sZW5ndGg7aWYoMT09PW4/KGU9YXJndW1lbnRzWzBd
LHI9bnVsbCk6KHI9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdKSx0LmlzU3RyaW5nKGUpJiYo
ZT1yW2VdKSwxPT09bilyZXR1cm4gZSgpO2lmKDI9PT1uKXJldHVybiBlLmNhbGwocik7Zm9yKHZh
ciBpPW5ldyBBcnJheShuLTIpLG89MCxhPW4tMjtvPGE7bysrKWlbb109YXJndW1lbnRzW28rMl07
cmV0dXJuIGUuYXBwbHkocixpKX0sZGVmZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbixpLG89YXJndW1l
bnRzLmxlbmd0aDsyPT09bz8ocj1hcmd1bWVudHNbMV0sbj1udWxsKToobj1hcmd1bWVudHNbMV0s
cj1hcmd1bWVudHNbMl0pLHQuaXNTdHJpbmcocikmJihyPW5bcl0pO3ZhciBhPXRoaXMuREVCVUc/
bmV3IEVycm9yOnZvaWQgMDtpZihvPjMpe2k9bmV3IEFycmF5KG8tMyk7Zm9yKHZhciB1PTM7dTxv
O3UrKylpW3UtM109YXJndW1lbnRzW3VdfWVsc2UgaT12b2lkIDA7cmV0dXJuIHRoaXMuY3VycmVu
dEluc3RhbmNlfHxzKHRoaXMpLHRoaXMuY3VycmVudEluc3RhbmNlLnNjaGVkdWxlKGUsbixyLGks
ITEsYSl9LGRlZmVyT25jZTpmdW5jdGlvbihlKXt2YXIgcixuLGksbz1hcmd1bWVudHMubGVuZ3Ro
OzI9PT1vPyhyPWFyZ3VtZW50c1sxXSxuPW51bGwpOihuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50
c1syXSksdC5pc1N0cmluZyhyKSYmKHI9bltyXSk7dmFyIGE9dGhpcy5ERUJVRz9uZXcgRXJyb3I6
dm9pZCAwO2lmKG8+Myl7aT1uZXcgQXJyYXkoby0zKTtmb3IodmFyIHU9Mzt1PG87dSsrKWlbdS0z
XT1hcmd1bWVudHNbdV19ZWxzZSBpPXZvaWQgMDtyZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2V8
fHModGhpcyksdGhpcy5jdXJyZW50SW5zdGFuY2Uuc2NoZWR1bGUoZSxuLHIsaSwhMCxhKX0sc2V0
VGltZW91dDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihtKXRyeXtvLmFwcGx5KHUsbil9Y2F0
Y2goZSl7bShlKX1lbHNlIG8uYXBwbHkodSxuKX1mb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxu
PW5ldyBBcnJheShyKSxpPTA7aTxyO2krKyluW2ldPWFyZ3VtZW50c1tpXTt2YXIgbyxzLHUsbCxj
LGYsZD1uLmxlbmd0aDtpZigwIT09ZCl7aWYoMT09PWQpbz1uLnNoaWZ0KCkscz0wO2Vsc2UgaWYo
Mj09PWQpbD1uWzBdLGM9blsxXSx0LmlzRnVuY3Rpb24oYyl8fHQuaXNGdW5jdGlvbihsW2NdKT8o
dT1uLnNoaWZ0KCksbz1uLnNoaWZ0KCkscz0wKTp0LmlzQ29lcmNhYmxlTnVtYmVyKGMpPyhvPW4u
c2hpZnQoKSxzPW4uc2hpZnQoKSk6KG89bi5zaGlmdCgpLHM9MCk7ZWxzZXt2YXIgcD1uW24ubGVu
Z3RoLTFdO3M9dC5pc0NvZXJjYWJsZU51bWJlcihwKT9uLnBvcCgpOjAsbD1uWzBdLGY9blsxXSx0
LmlzRnVuY3Rpb24oZil8fHQuaXNTdHJpbmcoZikmJm51bGwhPT1sJiZmIGluIGw/KHU9bi5zaGlm
dCgpLG89bi5zaGlmdCgpKTpvPW4uc2hpZnQoKX12YXIgaD1EYXRlLm5vdygpK3BhcnNlSW50KHMh
PT1zPzA6cywxMCk7dC5pc1N0cmluZyhvKSYmKG89dVtvXSk7dmFyIG09YSh0aGlzLm9wdGlvbnMp
O3JldHVybiB0aGlzLl9zZXRUaW1lb3V0KGUsaCl9fSxfc2V0VGltZW91dDpmdW5jdGlvbihlLHQp
e2lmKDA9PT10aGlzLl90aW1lcnMubGVuZ3RoKXJldHVybiB0aGlzLl90aW1lcnMucHVzaCh0LGUp
LHRoaXMuX2luc3RhbGxUaW1lclRpbWVvdXQoKSxlO3ZhciByPW4uZGVmYXVsdCh0LHRoaXMuX3Rp
bWVycyk7cmV0dXJuIHRoaXMuX3RpbWVycy5zcGxpY2UociwwLHQsZSksMD09PXImJnRoaXMuX3Jl
aW5zdGFsbFRpbWVyVGltZW91dCgpLGV9LHRocm90dGxlOmZ1bmN0aW9uKGUscil7Zm9yKHZhciBu
PXRoaXMsaT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbz0wO288YXJndW1lbnRzLmxlbmd0
aDtvKyspaVtvXT1hcmd1bWVudHNbb107dmFyIGEscyx1LGMsZj1pLnBvcCgpO3JldHVybiB0Lmlz
TnVtYmVyKGYpfHx0LmlzU3RyaW5nKGYpPyhhPWYsZj0hMCk6YT1pLnBvcCgpLGE9cGFyc2VJbnQo
YSwxMCksdT1sKGUscix0aGlzLl90aHJvdHRsZXJzKSx1Pi0xP3RoaXMuX3Rocm90dGxlcnNbdV06
KGM9dGhpcy5fcGxhdGZvcm0uc2V0VGltZW91dChmdW5jdGlvbigpe2Z8fG4ucnVuLmFwcGx5KG4s
aSk7dmFyIHQ9bChlLHIsbi5fdGhyb3R0bGVycyk7Cit0Pi0xJiZuLl90aHJvdHRsZXJzLnNwbGlj
ZSh0LDEpfSxhKSxmJiZ0aGlzLnJ1bi5hcHBseSh0aGlzLGkpLHM9W2UscixjXSx0aGlzLl90aHJv
dHRsZXJzLnB1c2gocykscyl9LGRlYm91bmNlOmZ1bmN0aW9uKGUscil7Zm9yKHZhciBuPXRoaXMs
aT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbz0wO288YXJndW1lbnRzLmxlbmd0aDtvKysp
aVtvXT1hcmd1bWVudHNbb107dmFyIGEscyxsLGMsZj1pLnBvcCgpO3JldHVybiB0LmlzTnVtYmVy
KGYpfHx0LmlzU3RyaW5nKGYpPyhhPWYsZj0hMSk6YT1pLnBvcCgpLGE9cGFyc2VJbnQoYSwxMCks
cz11KGUscix0aGlzLl9kZWJvdW5jZWVzKSxzPi0xJiYobD10aGlzLl9kZWJvdW5jZWVzW3NdLHRo
aXMuX2RlYm91bmNlZXMuc3BsaWNlKHMsMSksdGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0KGxb
Ml0pKSxjPXRoaXMuX3BsYXRmb3JtLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmfHxuLnJ1bi5hcHBs
eShuLGkpO3ZhciB0PXUoZSxyLG4uX2RlYm91bmNlZXMpO3Q+LTEmJm4uX2RlYm91bmNlZXMuc3Bs
aWNlKHQsMSl9LGEpLGYmJnM9PT0tMSYmbi5ydW4uYXBwbHkobixpKSxsPVtlLHIsY10sbi5fZGVi
b3VuY2Vlcy5wdXNoKGwpLGx9LGNhbmNlbFRpbWVyczpmdW5jdGlvbigpe3QuZWFjaCh0aGlzLl90
aHJvdHRsZXJzLHRoaXMuX2JvdW5kQ2xlYXJJdGVtcyksdGhpcy5fdGhyb3R0bGVycz1bXSx0LmVh
Y2godGhpcy5fZGVib3VuY2Vlcyx0aGlzLl9ib3VuZENsZWFySXRlbXMpLHRoaXMuX2RlYm91bmNl
ZXM9W10sdGhpcy5fY2xlYXJUaW1lclRpbWVvdXQoKSx0aGlzLl90aW1lcnM9W10sdGhpcy5fYXV0
b3J1biYmKHRoaXMuX3BsYXRmb3JtLmNsZWFyVGltZW91dCh0aGlzLl9hdXRvcnVuKSx0aGlzLl9h
dXRvcnVuPW51bGwpfSxoYXNUaW1lcnM6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3RpbWVycy5s
ZW5ndGh8fCEhdGhpcy5fZGVib3VuY2Vlcy5sZW5ndGh8fCEhdGhpcy5fdGhyb3R0bGVycy5sZW5n
dGh8fHRoaXMuX2F1dG9ydW59LGNhbmNlbDpmdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgZTtpZihl
JiYib2JqZWN0Ij09PXQmJmUucXVldWUmJmUubWV0aG9kKXJldHVybiBlLnF1ZXVlLmNhbmNlbChl
KTtpZigiZnVuY3Rpb24iIT09dClyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3Rv
dHlwZS50b1N0cmluZy5jYWxsKGUpP3RoaXMuX2NhbmNlbEl0ZW0obCx0aGlzLl90aHJvdHRsZXJz
LGUpfHx0aGlzLl9jYW5jZWxJdGVtKHUsdGhpcy5fZGVib3VuY2VlcyxlKTp2b2lkIDA7Zm9yKHZh
ciByPTAsbj10aGlzLl90aW1lcnMubGVuZ3RoO3I8bjtyKz0yKWlmKHRoaXMuX3RpbWVyc1tyKzFd
PT09ZSlyZXR1cm4gdGhpcy5fdGltZXJzLnNwbGljZShyLDIpLDA9PT1yJiZ0aGlzLl9yZWluc3Rh
bGxUaW1lclRpbWVvdXQoKSwhMH0sX2NhbmNlbEl0ZW06ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGk7
cmV0dXJuIShyLmxlbmd0aDwzKSYmKGk9ZShyWzBdLHJbMV0sdCksaT4tMSYmKG49dFtpXSxuWzJd
PT09clsyXSkmJih0LnNwbGljZShpLDEpLHRoaXMuX3BsYXRmb3JtLmNsZWFyVGltZW91dChyWzJd
KSwhMCkpfSxfcnVuRXhwaXJlZFRpbWVyczpmdW5jdGlvbigpe3RoaXMuX3RpbWVyVGltZW91dElk
PXZvaWQgMCx0aGlzLnJ1bih0aGlzLHRoaXMuX3NjaGVkdWxlRXhwaXJlZFRpbWVycyl9LF9zY2hl
ZHVsZUV4cGlyZWRUaW1lcnM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9RGF0ZS5ub3coKSx0PXRoaXMu
X3RpbWVycyxyPTAsbj10Lmxlbmd0aDtyPG47cis9Mil7dmFyIGk9dFtyXSxvPXRbcisxXTtpZigh
KGk8PWUpKWJyZWFrO3RoaXMuc2NoZWR1bGUodGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZSxudWxs
LG8pfXQuc3BsaWNlKDAsciksdGhpcy5faW5zdGFsbFRpbWVyVGltZW91dCgpfSxfcmVpbnN0YWxs
VGltZXJUaW1lb3V0OmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lclRpbWVvdXQoKSx0aGlzLl9p
bnN0YWxsVGltZXJUaW1lb3V0KCl9LF9jbGVhclRpbWVyVGltZW91dDpmdW5jdGlvbigpe3RoaXMu
X3RpbWVyVGltZW91dElkJiYodGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVy
VGltZW91dElkKSx0aGlzLl90aW1lclRpbWVvdXRJZD12b2lkIDApfSxfaW5zdGFsbFRpbWVyVGlt
ZW91dDpmdW5jdGlvbigpe2lmKHRoaXMuX3RpbWVycy5sZW5ndGgpe3ZhciBlPXRoaXMuX3RpbWVy
c1swXSx0PURhdGUubm93KCkscj1NYXRoLm1heCgwLGUtdCk7dGhpcy5fdGltZXJUaW1lb3V0SWQ9
dGhpcy5fcGxhdGZvcm0uc2V0VGltZW91dCh0aGlzLl9ib3VuZFJ1bkV4cGlyZWRUaW1lcnMscil9
fX0sby5wcm90b3R5cGUuc2NoZWR1bGU9by5wcm90b3R5cGUuZGVmZXIsby5wcm90b3R5cGUuc2No
ZWR1bGVPbmNlPW8ucHJvdG90eXBlLmRlZmVyT25jZSxvLnByb3RvdHlwZS5sYXRlcj1vLnByb3Rv
dHlwZS5zZXRUaW1lb3V0fSksZSgiYmFja2J1cm5lci9iaW5hcnktc2VhcmNoIixbImV4cG9ydHMi
XSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlLHQpe2Zvcih2YXIgcixuLGk9
MCxvPXQubGVuZ3RoLTI7aTxvOyluPShvLWkpLzIscj1pK24tbiUyLGU+PXRbcl0/aT1yKzI6bz1y
O3JldHVybiBlPj10W2ldP2krMjppfWUuZGVmYXVsdD10fSksZSgiYmFja2J1cm5lci9kZWZlcnJl
ZC1hY3Rpb24tcXVldWVzIixbImV4cG9ydHMiLCJiYWNrYnVybmVyL3V0aWxzIiwiYmFja2J1cm5l
ci9xdWV1ZSJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLG4pe3Zh
ciBpPXRoaXMucXVldWVzPXt9O3RoaXMucXVldWVOYW1lcz1lPWV8fFtdLHRoaXMub3B0aW9ucz1u
LHQuZWFjaChlLGZ1bmN0aW9uKGUpe2lbZV09bmV3IHIuZGVmYXVsdChlLG5bZV0sbil9KX1mdW5j
dGlvbiBpKGUpe3Rocm93IG5ldyBFcnJvcigiWW91IGF0dGVtcHRlZCB0byBzY2hlZHVsZSBhbiBh
Y3Rpb24gaW4gYSBxdWV1ZSAoIitlKyIpIHRoYXQgZG9lc24ndCBleGlzdCIpfWZ1bmN0aW9uIG8o
ZSl7dGhyb3cgbmV3IEVycm9yKCJZb3UgYXR0ZW1wdGVkIHRvIHNjaGVkdWxlIGFuIGFjdGlvbiBp
biBhIHF1ZXVlICgiK2UrIikgZm9yIGEgbWV0aG9kIHRoYXQgZG9lc24ndCBleGlzdCIpfWUuZGVm
YXVsdD1uLG4ucHJvdG90eXBlPXtzY2hlZHVsZTpmdW5jdGlvbihlLHQscixuLGEscyl7dmFyIHU9
dGhpcy5xdWV1ZXMsbD11W2VdO3JldHVybiBsfHxpKGUpLHJ8fG8oZSksYT9sLnB1c2hVbmlxdWUo
dCxyLG4scyk6bC5wdXNoKHQscixuLHMpfSxmbHVzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LHI9
dGhpcy5xdWV1ZXMsbj10aGlzLnF1ZXVlTmFtZXMsaT0wLG89bi5sZW5ndGg7aTxvOyl7ZT1uW2ld
LHQ9cltlXTt2YXIgYT10Ll9xdWV1ZS5sZW5ndGg7MD09PWE/aSsrOih0LmZsdXNoKCExKSxpPTAp
fX19fSksZSgiYmFja2J1cm5lci9wbGF0Zm9ybSIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVz
ZSBzdHJpY3QiO3ZhciB0O2lmKCJvYmplY3QiPT10eXBlb2Ygc2VsZil0PXNlbGY7ZWxzZSBpZigi
b2JqZWN0Ij09dHlwZW9mIGdsb2JhbCl0PWdsb2JhbDtlbHNle2lmKCJvYmplY3QiIT10eXBlb2Yg
d2luZG93KXRocm93IG5ldyBFcnJvcigibm8gZ2xvYmFsOiBgc2VsZmAsIGBnbG9iYWxgIG5vciBg
d2luZG93YCB3YXMgZm91bmQiKTt0PXdpbmRvd31lLmRlZmF1bHQ9dH0pLGUoImJhY2tidXJuZXIv
cXVldWUiLFsiZXhwb3J0cyIsImJhY2tidXJuZXIvdXRpbHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ug
c3RyaWN0IjtmdW5jdGlvbiByKGUsdCxyKXt0aGlzLm5hbWU9ZSx0aGlzLmdsb2JhbE9wdGlvbnM9
cnx8e30sdGhpcy5vcHRpb25zPXQsdGhpcy5fcXVldWU9W10sdGhpcy50YXJnZXRRdWV1ZXM9e30s
dGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQ9dm9pZCAwfWUuZGVmYXVsdD1yLHIucHJvdG90eXBlPXtw
dXNoOmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpPXRoaXMuX3F1ZXVlO3JldHVybiBpLnB1c2goZSx0
LHIsbikse3F1ZXVlOnRoaXMsdGFyZ2V0OmUsbWV0aG9kOnR9fSxwdXNoVW5pcXVlV2l0aG91dEd1
aWQ6ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBpPXRoaXMuX3F1ZXVlLG89MCxhPWkubGVuZ3Ro
O288YTtvKz00KXt2YXIgcz1pW29dLHU9aVtvKzFdO2lmKHM9PT1lJiZ1PT09dClyZXR1cm4gaVtv
KzJdPXIsdm9pZChpW28rM109bil9aS5wdXNoKGUsdCxyLG4pfSx0YXJnZXRRdWV1ZTpmdW5jdGlv
bihlLHQscixuLGkpe2Zvcih2YXIgbz10aGlzLl9xdWV1ZSxhPTAscz1lLmxlbmd0aDthPHM7YSs9
Mil7dmFyIHU9ZVthXSxsPWVbYSsxXTtpZih1PT09cilyZXR1cm4gb1tsKzJdPW4sdm9pZChvW2wr
M109aSl9ZS5wdXNoKHIsby5wdXNoKHQscixuLGkpLTQpfSxwdXNoVW5pcXVlV2l0aEd1aWQ6ZnVu
Y3Rpb24oZSx0LHIsbixpKXt2YXIgbz10aGlzLnRhcmdldFF1ZXVlc1tlXTtyZXR1cm4gbz90aGlz
LnRhcmdldFF1ZXVlKG8sdCxyLG4saSk6dGhpcy50YXJnZXRRdWV1ZXNbZV09W3IsdGhpcy5fcXVl
dWUucHVzaCh0LHIsbixpKS00XSx7cXVldWU6dGhpcyx0YXJnZXQ6dCxtZXRob2Q6cn19LHB1c2hV
bmlxdWU6ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9dGhpcy5nbG9iYWxPcHRpb25zLkdVSURfS0VZ
O2lmKGUmJmkpe3ZhciBvPWVbaV07aWYobylyZXR1cm4gdGhpcy5wdXNoVW5pcXVlV2l0aEd1aWQo
byxlLHQscixuKX1yZXR1cm4gdGhpcy5wdXNoVW5pcXVlV2l0aG91dEd1aWQoZSx0LHIsbikse3F1
ZXVlOnRoaXMsdGFyZ2V0OmUsbWV0aG9kOnR9fSxpbnZva2U6ZnVuY3Rpb24oZSx0LHIsbixpKXty
JiZyLmxlbmd0aD4wP3QuYXBwbHkoZSxyKTp0LmNhbGwoZSl9LGludm9rZVdpdGhPbkVycm9yOmZ1
bmN0aW9uKGUsdCxyLG4saSl7dHJ5e3ImJnIubGVuZ3RoPjA/dC5hcHBseShlLHIpOnQuY2FsbChl
KX1jYXRjaChlKXtuKGUsaSl9fSxmbHVzaDpmdW5jdGlvbihlKXt2YXIgcj10aGlzLl9xdWV1ZSxu
PXIubGVuZ3RoO2lmKDAhPT1uKXt2YXIgaSxvLGEscyx1PXRoaXMuZ2xvYmFsT3B0aW9ucyxsPXRo
aXMub3B0aW9ucyxjPWwmJmwuYmVmb3JlLGY9bCYmbC5hZnRlcixkPXUub25FcnJvcnx8dS5vbkVy
cm9yVGFyZ2V0JiZ1Lm9uRXJyb3JUYXJnZXRbdS5vbkVycm9yTWV0aG9kXSxwPWQ/dGhpcy5pbnZv
a2VXaXRoT25FcnJvcjp0aGlzLmludm9rZTt0aGlzLnRhcmdldFF1ZXVlcz1PYmplY3QuY3JlYXRl
KG51bGwpO3ZhciBoPXRoaXMuX3F1ZXVlQmVpbmdGbHVzaGVkPXRoaXMuX3F1ZXVlLnNsaWNlKCk7
dGhpcy5fcXVldWU9W10sYyYmYygpO2Zvcih2YXIgbT0wO208bjttKz00KWk9aFttXSxvPWhbbSsx
XSxhPWhbbSsyXSxzPWhbbSszXSx0LmlzU3RyaW5nKG8pJiYobz1pW29dKSxvJiZwKGksbyxhLGQs
cyk7ZiYmZigpLHRoaXMuX3F1ZXVlQmVpbmdGbHVzaGVkPXZvaWQgMCxlIT09ITEmJnRoaXMuX3F1
ZXVlLmxlbmd0aD4wJiZ0aGlzLmZsdXNoKCEwKX19LGNhbmNlbDpmdW5jdGlvbihlKXt2YXIgdCxy
LG4saSxvPXRoaXMuX3F1ZXVlLGE9ZS50YXJnZXQscz1lLm1ldGhvZCx1PXRoaXMuZ2xvYmFsT3B0
aW9ucy5HVUlEX0tFWTtpZih1JiZ0aGlzLnRhcmdldFF1ZXVlcyYmYSl7dmFyIGw9dGhpcy50YXJn
ZXRRdWV1ZXNbYVt1XV07aWYobClmb3Iobj0wLGk9bC5sZW5ndGg7bjxpO24rKylsW25dPT09cyYm
bC5zcGxpY2UobiwxKX1mb3Iobj0wLGk9by5sZW5ndGg7bjxpO24rPTQpaWYodD1vW25dLHI9b1tu
KzFdLHQ9PT1hJiZyPT09cylyZXR1cm4gby5zcGxpY2Uobiw0KSwhMDtpZihvPXRoaXMuX3F1ZXVl
QmVpbmdGbHVzaGVkKWZvcihuPTAsaT1vLmxlbmd0aDtuPGk7bis9NClpZih0PW9bbl0scj1vW24r
MV0sdD09PWEmJnI9PT1zKXJldHVybiBvW24rMV09bnVsbCwhMH19fSksZSgiYmFja2J1cm5lci91
dGlscyIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0
KXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0KGVbcl0pfWZ1bmN0aW9uIHIoZSl7cmV0dXJu
InN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIG4oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9m
IGV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9ZnVuY3Rpb24gbyhlKXty
ZXR1cm4gaShlKXx8YS50ZXN0KGUpfWUuZWFjaD10LGUuaXNTdHJpbmc9cixlLmlzRnVuY3Rpb249
bixlLmlzTnVtYmVyPWksZS5pc0NvZXJjYWJsZU51bWJlcj1vO3ZhciBhPS9cZCsvfSksZSgiY29u
dGFpbmVyL2NvbnRhaW5lciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLW1l
dGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvZGljdGlvbmFyeSIsImVtYmVyLW1ldGFsL2ZlYXR1cmVz
IiwiY29udGFpbmVyL293bmVyIiwiZW1iZXItcnVudGltZS9taXhpbnMvY29udGFpbmVyX3Byb3h5
IiwiZW1iZXItbWV0YWwvc3ltYm9sIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gdShlLHQpe3RoaXMucmVnaXN0cnk9ZSx0aGlzLm93bmVyPXQmJnQub3du
ZXI/dC5vd25lcjpudWxsLHRoaXMuY2FjaGU9bi5kZWZhdWx0KHQmJnQuY2FjaGU/dC5jYWNoZTpu
dWxsKSx0aGlzLmZhY3RvcnlDYWNoZT1uLmRlZmF1bHQodCYmdC5mYWN0b3J5Q2FjaGU/dC5mYWN0
b3J5Q2FjaGU6bnVsbCksdGhpcy52YWxpZGF0aW9uQ2FjaGU9bi5kZWZhdWx0KHQmJnQudmFsaWRh
dGlvbkNhY2hlP3QudmFsaWRhdGlvbkNhY2hlOm51bGwpLHRoaXMuX2Zha2VDb250YWluZXJUb0lu
amVjdD1hLmJ1aWxkRmFrZUNvbnRhaW5lcldpdGhEZXByZWNhdGlvbnModGhpcyksdGhpc1t4XT12
b2lkIDB9ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlLnJlZ2lzdHJ5LmdldE9wdGlvbih0LCJzaW5n
bGV0b24iKSE9PSExfWZ1bmN0aW9uIGMoZSx0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPD0yfHx2
b2lkIDA9PT1hcmd1bWVudHNbMl0/e306YXJndW1lbnRzWzJdO2lmKCFyLnNvdXJjZXx8KHQ9ZS5y
ZWdpc3RyeS5leHBhbmRMb2NhbExvb2t1cCh0LHIpKSl7aWYodm9pZCAwIT09ZS5jYWNoZVt0XSYm
ci5zaW5nbGV0b24hPT0hMSlyZXR1cm4gZS5jYWNoZVt0XTt2YXIgbj1iKGUsdCk7aWYodm9pZCAw
IT09bilyZXR1cm4gbChlLHQpJiZyLnNpbmdsZXRvbiE9PSExJiYoZS5jYWNoZVt0XT1uKSxufX1m
dW5jdGlvbiBmKGUpe2UuX2R5bmFtaWM9ITB9ZnVuY3Rpb24gZChlKXtyZXR1cm4hIWUuX2R5bmFt
aWN9ZnVuY3Rpb24gcCgpe3ZhciBlPXt9O2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKHZhciB0
LHI9YXJndW1lbnRzWzBdLG49W10saT0xLG89YXJndW1lbnRzLmxlbmd0aDtpPG87aSsrKWFyZ3Vt
ZW50c1tpXSYmKG49bi5jb25jYXQoYXJndW1lbnRzW2ldKSk7Zm9yKHIucmVnaXN0cnkudmFsaWRh
dGVJbmplY3Rpb25zKG4pLGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspdD1uW2ldLGVbdC5wcm9wZXJ0
eV09YyhyLHQuZnVsbE5hbWUpLGwocix0LmZ1bGxOYW1lKXx8ZihlKX1yZXR1cm4gZX1mdW5jdGlv
biBoKGUscil7dmFyIG49YXJndW1lbnRzLmxlbmd0aDw9Mnx8dm9pZCAwPT09YXJndW1lbnRzWzJd
P3t9OmFyZ3VtZW50c1syXSxpPWUucmVnaXN0cnk7aWYoIW4uc291cmNlfHwocj1pLmV4cGFuZExv
Y2FsTG9va3VwKHIsbikpKXt2YXIgbz1lLmZhY3RvcnlDYWNoZTtpZihvW3JdKXJldHVybiBvW3Jd
O3ZhciBhPWkucmVzb2x2ZShyKTtpZih2b2lkIDAhPT1hKXt2YXIgcz1yLnNwbGl0KCI6IilbMF07
aWYoIWF8fCJmdW5jdGlvbiIhPXR5cGVvZiBhLmV4dGVuZHx8IXQuZGVmYXVsdC5NT0RFTF9GQUNU
T1JZX0lOSkVDVElPTlMmJiJtb2RlbCI9PT1zKXJldHVybiBhJiYiZnVuY3Rpb24iPT10eXBlb2Yg
YS5fb25Mb29rdXAmJmEuX29uTG9va3VwKHIpLG9bcl09YSxhO3ZhciB1PW0oZSxyKSxsPXYoZSxy
KSxjPSFkKHUpJiYhZChsKTtsLl90b1N0cmluZz1pLm1ha2VUb1N0cmluZyhhLHIpO3ZhciBmPWEu
ZXh0ZW5kKHUpO3JldHVybiBnKGYucHJvdG90eXBlLGUpLGYucmVvcGVuQ2xhc3MobCksYSYmImZ1
bmN0aW9uIj09dHlwZW9mIGEuX29uTG9va3VwJiZhLl9vbkxvb2t1cChyKSxjJiYob1tyXT1mKSxm
fX19ZnVuY3Rpb24gbShlLHQpe3ZhciByPWUucmVnaXN0cnksbj10LnNwbGl0KCI6IiksaT1uWzBd
LGE9cChlLHIuZ2V0VHlwZUluamVjdGlvbnMoaSksci5nZXRJbmplY3Rpb25zKHQpKTtyZXR1cm4g
YS5fZGVidWdDb250YWluZXJLZXk9dCxvLnNldE93bmVyKGEsZS5vd25lciksYX1mdW5jdGlvbiB2
KGUsdCl7dmFyIHI9ZS5yZWdpc3RyeSxuPXQuc3BsaXQoIjoiKSxpPW5bMF0sbz1wKGUsci5nZXRG
YWN0b3J5VHlwZUluamVjdGlvbnMoaSksci5nZXRGYWN0b3J5SW5qZWN0aW9ucyh0KSk7cmV0dXJu
IG8uX2RlYnVnQ29udGFpbmVyS2V5PXQsb31mdW5jdGlvbiBiKGUsdCl7dmFyIHIsbj1oKGUsdCk7
aWYoZS5yZWdpc3RyeS5nZXRPcHRpb24odCwiaW5zdGFudGlhdGUiKT09PSExKXJldHVybiBuO2lm
KG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuLmNyZWF0ZSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxl
ZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgJyIrdCsiJy4gTW9zdCBsaWtlbHkgYW4gaW1wcm9w
ZXJseSBkZWZpbmVkIGNsYXNzIG9yIGFuIGludmFsaWQgbW9kdWxlIGV4cG9ydC4iKTtyPWUudmFs
aWRhdGlvbkNhY2hlLHJbdF09ITA7dmFyIGk9dm9pZCAwO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBu
LmV4dGVuZClpPW4uY3JlYXRlKCk7ZWxzZXt2YXIgbz1tKGUsdCk7by5jb250YWluZXI9ZS5fZmFr
ZUNvbnRhaW5lclRvSW5qZWN0LGk9bi5jcmVhdGUobyksIU9iamVjdC5pc0Zyb3plbihpKSYmImNv
bnRhaW5lciJpbiBpJiZnKGksZSl9cmV0dXJuIGl9fWZ1bmN0aW9uIGcoZSx0KXtPYmplY3QuZGVm
aW5lUHJvcGVydHkoZSwiY29udGFpbmVyIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEs
Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbeF18fHR9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4g
dGhpc1t4XT1lLGV9fSl9ZnVuY3Rpb24geShlLHQpe2Zvcih2YXIgcixuLGk9ZS5jYWNoZSxvPU9i
amVjdC5rZXlzKGkpLGE9MCxzPW8ubGVuZ3RoO2E8czthKyspcj1vW2FdLG49aVtyXSxlLnJlZ2lz
dHJ5LmdldE9wdGlvbihyLCJpbnN0YW50aWF0ZSIpIT09ITEmJnQobil9ZnVuY3Rpb24gXyhlKXt5
KGUsZnVuY3Rpb24oZSl7ZS5kZXN0cm95JiZlLmRlc3Ryb3koKX0pLGUuY2FjaGUuZGljdD1uLmRl
ZmF1bHQobnVsbCl9ZnVuY3Rpb24gdyhlLHQpe3ZhciByPWUuY2FjaGVbdF07ZGVsZXRlIGUuZmFj
dG9yeUNhY2hlW3RdLHImJihkZWxldGUgZS5jYWNoZVt0XSxyLmRlc3Ryb3kmJnIuZGVzdHJveSgp
KX12YXIgeD1zLmRlZmF1bHQoIkNPTlRBSU5FUl9PVkVSUklERSIpO3UucHJvdG90eXBlPXtvd25l
cjpudWxsLHJlZ2lzdHJ5Om51bGwsY2FjaGU6bnVsbCxmYWN0b3J5Q2FjaGU6bnVsbCx2YWxpZGF0
aW9uQ2FjaGU6bnVsbCxsb29rdXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYyh0aGlzLHRoaXMucmVn
aXN0cnkubm9ybWFsaXplKGUpLHQpfSxsb29rdXBGYWN0b3J5OmZ1bmN0aW9uKGUsdCl7cmV0dXJu
IGgodGhpcyx0aGlzLnJlZ2lzdHJ5Lm5vcm1hbGl6ZShlKSx0KX0sZGVzdHJveTpmdW5jdGlvbigp
e3kodGhpcyxmdW5jdGlvbihlKXtlLmRlc3Ryb3kmJmUuZGVzdHJveSgpfSksdGhpcy5pc0Rlc3Ry
b3llZD0hMH0scmVzZXQ6ZnVuY3Rpb24oZSl7YXJndW1lbnRzLmxlbmd0aD4wP3codGhpcyx0aGlz
LnJlZ2lzdHJ5Lm5vcm1hbGl6ZShlKSk6Xyh0aGlzKX0sb3duZXJJbmplY3Rpb246ZnVuY3Rpb24o
KXt2YXIgZTtyZXR1cm4gZT17fSxlW28uT1dORVJdPXRoaXMub3duZXIsZX19LGUuZGVmYXVsdD11
fSksZSgiY29udGFpbmVyL2luZGV4IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiY29u
dGFpbmVyL3JlZ2lzdHJ5IiwiY29udGFpbmVyL2NvbnRhaW5lciIsImNvbnRhaW5lci9vd25lciJd
LGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO3QuZGVmYXVsdC5NT0RFTF9GQUNUT1JZ
X0lOSkVDVElPTlM9ITEsdC5kZWZhdWx0LkVOViYmInVuZGVmaW5lZCIhPXR5cGVvZiB0LmRlZmF1
bHQuRU5WLk1PREVMX0ZBQ1RPUllfSU5KRUNUSU9OUyYmKHQuZGVmYXVsdC5NT0RFTF9GQUNUT1JZ
X0lOSkVDVElPTlM9ISF0LmRlZmF1bHQuRU5WLk1PREVMX0ZBQ1RPUllfSU5KRUNUSU9OUyksZS5S
ZWdpc3RyeT1yLmRlZmF1bHQsZS5Db250YWluZXI9bi5kZWZhdWx0LGUuZ2V0T3duZXI9aS5nZXRP
d25lcixlLnNldE93bmVyPWkuc2V0T3duZXJ9KSxlKCJjb250YWluZXIvb3duZXIiLFsiZXhwb3J0
cyIsImVtYmVyLW1ldGFsL3N5bWJvbCJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0
aW9uIHIoZSl7cmV0dXJuIGVbaV19ZnVuY3Rpb24gbihlLHQpe2VbaV09dH1lLmdldE93bmVyPXIs
ZS5zZXRPd25lcj1uO3ZhciBpPXQuZGVmYXVsdCgiT1dORVIiKTtlLk9XTkVSPWl9KSxlKCJjb250
YWluZXIvcmVnaXN0cnkiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwiZW1iZXIt
bWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9kaWN0aW9uYXJ5IiwiZW1iZXItbWV0YWwvZW1wdHlf
b2JqZWN0IiwiZW1iZXItbWV0YWwvYXNzaWduIiwiY29udGFpbmVyL2NvbnRhaW5lciIsImVtYmVy
LW1ldGFsL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzKXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gdShlKXt0aGlzLmZhbGxiYWNrPWUmJmUuZmFsbGJhY2s/ZS5mYWxsYmFjazpudWxsLGUm
JmUucmVzb2x2ZXImJih0aGlzLnJlc29sdmVyPWUucmVzb2x2ZXIsImZ1bmN0aW9uIj09dHlwZW9m
IHRoaXMucmVzb2x2ZXImJmwodGhpcykpLHRoaXMucmVnaXN0cmF0aW9ucz1uLmRlZmF1bHQoZSYm
ZS5yZWdpc3RyYXRpb25zP2UucmVnaXN0cmF0aW9uczpudWxsKSx0aGlzLl90eXBlSW5qZWN0aW9u
cz1uLmRlZmF1bHQobnVsbCksdGhpcy5faW5qZWN0aW9ucz1uLmRlZmF1bHQobnVsbCksdGhpcy5f
ZmFjdG9yeVR5cGVJbmplY3Rpb25zPW4uZGVmYXVsdChudWxsKSx0aGlzLl9mYWN0b3J5SW5qZWN0
aW9ucz1uLmRlZmF1bHQobnVsbCksdGhpcy5fbG9jYWxMb29rdXBDYWNoZT1uZXcgaS5kZWZhdWx0
LHRoaXMuX25vcm1hbGl6ZUNhY2hlPW4uZGVmYXVsdChudWxsKSx0aGlzLl9yZXNvbHZlQ2FjaGU9
bi5kZWZhdWx0KG51bGwpLHRoaXMuX2ZhaWxDYWNoZT1uLmRlZmF1bHQobnVsbCksdGhpcy5fb3B0
aW9ucz1uLmRlZmF1bHQobnVsbCksdGhpcy5fdHlwZU9wdGlvbnM9bi5kZWZhdWx0KG51bGwpfWZ1
bmN0aW9uIGwoZSl7ZS5yZXNvbHZlcj17cmVzb2x2ZTplLnJlc29sdmVyfX1mdW5jdGlvbiBjKGUs
dCxyKXt2YXIgbj1lLl9sb2NhbExvb2t1cENhY2hlLG89blt0XTtvfHwobz1uW3RdPW5ldyBpLmRl
ZmF1bHQpO3ZhciBhPW9bcl07aWYodm9pZCAwIT09YSlyZXR1cm4gYTt2YXIgcz1lLnJlc29sdmVy
LmV4cGFuZExvY2FsTG9va3VwKHQscik7cmV0dXJuIG9bcl09c31mdW5jdGlvbiBmKGUsdCxyKXtp
Zighcnx8IXIuc291cmNlfHwodD1lLmV4cGFuZExvY2FsTG9va3VwKHQscikpKXt2YXIgbj1lLl9y
ZXNvbHZlQ2FjaGVbdF07aWYodm9pZCAwIT09bilyZXR1cm4gbjtpZighZS5fZmFpbENhY2hlW3Rd
KXt2YXIgaT12b2lkIDA7cmV0dXJuIGUucmVzb2x2ZXImJihpPWUucmVzb2x2ZXIucmVzb2x2ZSh0
KSksdm9pZCAwPT09aSYmKGk9ZS5yZWdpc3RyYXRpb25zW3RdKSx2b2lkIDA9PT1pP2UuX2ZhaWxD
YWNoZVt0XT0hMDplLl9yZXNvbHZlQ2FjaGVbdF09aSxpfX19ZnVuY3Rpb24gZChlLHQscil7cmV0
dXJuIHZvaWQgMCE9PWUucmVzb2x2ZSh0LHtzb3VyY2U6cn0pfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9
ZVswXSxyPW1bdF07aWYocilyZXR1cm4gcjt2YXIgbj10LnNwbGl0KCI6IiksaT1uWzBdLG89blsx
XTtyZXR1cm4gbVt0XT1zLmludGVybihpKyI6IitvKyItIit2KX1lLnByaXZhdGl6ZT1wO3ZhciBo
PS9eW146XSs6W146XSskLzt1LnByb3RvdHlwZT17ZmFsbGJhY2s6bnVsbCxyZXNvbHZlcjpudWxs
LHJlZ2lzdHJhdGlvbnM6bnVsbCxfdHlwZUluamVjdGlvbnM6bnVsbCxfaW5qZWN0aW9uczpudWxs
LF9mYWN0b3J5VHlwZUluamVjdGlvbnM6bnVsbCxfZmFjdG9yeUluamVjdGlvbnM6bnVsbCxfbm9y
bWFsaXplQ2FjaGU6bnVsbCxfcmVzb2x2ZUNhY2hlOm51bGwsX29wdGlvbnM6bnVsbCxfdHlwZU9w
dGlvbnM6bnVsbCxjb250YWluZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBhLmRlZmF1bHQodGhp
cyxlKX0scmVnaXN0ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPD0yfHx2
b2lkIDA9PT1hcmd1bWVudHNbMl0/e306YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cg
bmV3IFR5cGVFcnJvcigiQXR0ZW1wdGluZyB0byByZWdpc3RlciBhbiB1bmtub3duIGZhY3Rvcnk6
IGAiK2UrImAiKTt2YXIgbj10aGlzLm5vcm1hbGl6ZShlKTtpZih0aGlzLl9yZXNvbHZlQ2FjaGVb
bl0pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmUtcmVnaXN0ZXI6IGAiK2UrImAsIGFzIGl0IGhh
cyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuIik7ZGVsZXRlIHRoaXMuX2ZhaWxDYWNoZVtuXSx0aGlz
LnJlZ2lzdHJhdGlvbnNbbl09dCx0aGlzLl9vcHRpb25zW25dPXJ9LHVucmVnaXN0ZXI6ZnVuY3Rp
b24oZSl7dmFyIHQ9dGhpcy5ub3JtYWxpemUoZSk7dGhpcy5fbG9jYWxMb29rdXBDYWNoZT1uZXcg
aS5kZWZhdWx0LGRlbGV0ZSB0aGlzLnJlZ2lzdHJhdGlvbnNbdF0sZGVsZXRlIHRoaXMuX3Jlc29s
dmVDYWNoZVt0XSxkZWxldGUgdGhpcy5fZmFpbENhY2hlW3RdLGRlbGV0ZSB0aGlzLl9vcHRpb25z
W3RdfSxyZXNvbHZlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9Zih0aGlzLHRoaXMubm9ybWFsaXplKGUp
LHQpO2lmKHZvaWQgMD09PXImJnRoaXMuZmFsbGJhY2spe3ZhciBuO3I9KG49dGhpcy5mYWxsYmFj
aykucmVzb2x2ZS5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHJ9LGRlc2NyaWJlOmZ1bmN0aW9u
KGUpe3JldHVybiB0aGlzLnJlc29sdmVyJiZ0aGlzLnJlc29sdmVyLmxvb2t1cERlc2NyaXB0aW9u
P3RoaXMucmVzb2x2ZXIubG9va3VwRGVzY3JpcHRpb24oZSk6dGhpcy5mYWxsYmFjaz90aGlzLmZh
bGxiYWNrLmRlc2NyaWJlKGUpOmV9LG5vcm1hbGl6ZUZ1bGxOYW1lOmZ1bmN0aW9uKGUpe3JldHVy
biB0aGlzLnJlc29sdmVyJiZ0aGlzLnJlc29sdmVyLm5vcm1hbGl6ZT90aGlzLnJlc29sdmVyLm5v
cm1hbGl6ZShlKTp0aGlzLmZhbGxiYWNrP3RoaXMuZmFsbGJhY2subm9ybWFsaXplRnVsbE5hbWUo
ZSk6ZX0sbm9ybWFsaXplOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub3JtYWxpemVDYWNoZVtl
XXx8KHRoaXMuX25vcm1hbGl6ZUNhY2hlW2VdPXRoaXMubm9ybWFsaXplRnVsbE5hbWUoZSkpfSxt
YWtlVG9TdHJpbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5yZXNvbHZlciYmdGhpcy5yZXNv
bHZlci5tYWtlVG9TdHJpbmc/dGhpcy5yZXNvbHZlci5tYWtlVG9TdHJpbmcoZSx0KTp0aGlzLmZh
bGxiYWNrP3RoaXMuZmFsbGJhY2subWFrZVRvU3RyaW5nKGUsdCk6ZS50b1N0cmluZygpfSxoYXM6
ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5pc1ZhbGlkRnVsbE5hbWUoZSkpcmV0dXJuITE7dmFyIHI9
dm9pZCAwO3JldHVybiByPXQmJnQuc291cmNlJiZ0aGlzLm5vcm1hbGl6ZSh0LnNvdXJjZSksZCh0
aGlzLHRoaXMubm9ybWFsaXplKGUpLHIpfSxvcHRpb25zRm9yVHlwZTpmdW5jdGlvbihlLHQpe3Ro
aXMuX3R5cGVPcHRpb25zW2VdPXR9LGdldE9wdGlvbnNGb3JUeXBlOmZ1bmN0aW9uKGUpe3ZhciB0
PXRoaXMuX3R5cGVPcHRpb25zW2VdO3JldHVybiB2b2lkIDA9PT10JiZ0aGlzLmZhbGxiYWNrJiYo
dD10aGlzLmZhbGxiYWNrLmdldE9wdGlvbnNGb3JUeXBlKGUpKSx0fSxvcHRpb25zOmZ1bmN0aW9u
KGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3VtZW50c1sxXT97fTph
cmd1bWVudHNbMV0scj10aGlzLm5vcm1hbGl6ZShlKTt0aGlzLl9vcHRpb25zW3JdPXR9LGdldE9w
dGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5ub3JtYWxpemUoZSkscj10aGlzLl9vcHRpb25z
W3RdO3JldHVybiB2b2lkIDA9PT1yJiZ0aGlzLmZhbGxiYWNrJiYocj10aGlzLmZhbGxiYWNrLmdl
dE9wdGlvbnMoZSkpLHJ9LGdldE9wdGlvbjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuX29wdGlv
bnNbZV07aWYociYmdm9pZCAwIT09clt0XSlyZXR1cm4gclt0XTt2YXIgbj1lLnNwbGl0KCI6Iilb
MF07cmV0dXJuIHI9dGhpcy5fdHlwZU9wdGlvbnNbbl0sciYmdm9pZCAwIT09clt0XT9yW3RdOnRo
aXMuZmFsbGJhY2s/dGhpcy5mYWxsYmFjay5nZXRPcHRpb24oZSx0KTp2b2lkIDB9LHR5cGVJbmpl
Y3Rpb246ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIuc3BsaXQoIjoiKVswXTtpZihuPT09ZSl0aHJv
dyBuZXcgRXJyb3IoIkNhbm5vdCBpbmplY3QgYSBgIityKyJgIG9uIG90aGVyICIrZSsiKHMpLiIp
O3ZhciBpPXRoaXMuX3R5cGVJbmplY3Rpb25zW2VdfHwodGhpcy5fdHlwZUluamVjdGlvbnNbZV09
W10pO2kucHVzaCh7cHJvcGVydHk6dCxmdWxsTmFtZTpyfSl9LGluamVjdGlvbjpmdW5jdGlvbihl
LHQscil7dGhpcy52YWxpZGF0ZUZ1bGxOYW1lKHIpO3ZhciBuPXRoaXMubm9ybWFsaXplKHIpO2lm
KGUuaW5kZXhPZigiOiIpPT09LTEpcmV0dXJuIHRoaXMudHlwZUluamVjdGlvbihlLHQsbik7dmFy
IGk9dGhpcy5ub3JtYWxpemUoZSksbz10aGlzLl9pbmplY3Rpb25zW2ldfHwodGhpcy5faW5qZWN0
aW9uc1tpXT1bXSk7by5wdXNoKHtwcm9wZXJ0eTp0LGZ1bGxOYW1lOm59KX0sZmFjdG9yeVR5cGVJ
bmplY3Rpb246ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXMuX2ZhY3RvcnlUeXBlSW5qZWN0aW9u
c1tlXXx8KHRoaXMuX2ZhY3RvcnlUeXBlSW5qZWN0aW9uc1tlXT1bXSk7bi5wdXNoKHtwcm9wZXJ0
eTp0LGZ1bGxOYW1lOnRoaXMubm9ybWFsaXplKHIpfSl9LGZhY3RvcnlJbmplY3Rpb246ZnVuY3Rp
b24oZSx0LHIpe3ZhciBuPXRoaXMubm9ybWFsaXplKGUpLGk9dGhpcy5ub3JtYWxpemUocik7aWYo
dGhpcy52YWxpZGF0ZUZ1bGxOYW1lKHIpLGUuaW5kZXhPZigiOiIpPT09LTEpcmV0dXJuIHRoaXMu
ZmFjdG9yeVR5cGVJbmplY3Rpb24obix0LGkpO3ZhciBvPXRoaXMuX2ZhY3RvcnlJbmplY3Rpb25z
W25dfHwodGhpcy5fZmFjdG9yeUluamVjdGlvbnNbbl09W10pO28ucHVzaCh7cHJvcGVydHk6dCxm
dWxsTmFtZTppfSl9LGtub3duRm9yVHlwZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dm9pZCAwLHI9
dm9pZCAwLGk9bi5kZWZhdWx0KG51bGwpLGE9T2JqZWN0LmtleXModGhpcy5yZWdpc3RyYXRpb25z
KSxzPTAsdT1hLmxlbmd0aDtzPHU7cysrKXt2YXIgbD1hW3NdLGM9bC5zcGxpdCgiOiIpWzBdO2M9
PT1lJiYoaVtsXT0hMCl9cmV0dXJuIHRoaXMuZmFsbGJhY2smJih0PXRoaXMuZmFsbGJhY2sua25v
d25Gb3JUeXBlKGUpKSx0aGlzLnJlc29sdmVyJiZ0aGlzLnJlc29sdmVyLmtub3duRm9yVHlwZSYm
KHI9dGhpcy5yZXNvbHZlci5rbm93bkZvclR5cGUoZSkpLG8uZGVmYXVsdCh7fSx0LGkscil9LHZh
bGlkYXRlRnVsbE5hbWU6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaXNWYWxpZEZ1bGxOYW1lKGUpKXRo
cm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgRnVsbG5hbWUsIGV4cGVjdGVkOiBgdHlwZTpuYW1l
YCBnb3Q6ICIrZSk7cmV0dXJuITB9LGlzVmFsaWRGdWxsTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4h
IWgudGVzdChlKX0sdmFsaWRhdGVJbmplY3Rpb25zOmZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciB0
LHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspaWYodD1lW3JdLmZ1bGxOYW1lLCF0aGlzLmhhcyh0KSl0
aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRpbmcgdG8gaW5qZWN0IGFuIHVua25vd24gaW5qZWN0aW9u
OiBgIit0KyJgIil9LG5vcm1hbGl6ZUluamVjdGlvbnNIYXNoOmZ1bmN0aW9uKGUpe3ZhciB0PVtd
O2Zvcih2YXIgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJnQucHVzaCh7cHJvcGVydHk6cixm
dWxsTmFtZTplW3JdfSk7cmV0dXJuIHR9LGdldEluamVjdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9
dGhpcy5faW5qZWN0aW9uc1tlXXx8W107cmV0dXJuIHRoaXMuZmFsbGJhY2smJih0PXQuY29uY2F0
KHRoaXMuZmFsbGJhY2suZ2V0SW5qZWN0aW9ucyhlKSkpLHR9LGdldFR5cGVJbmplY3Rpb25zOmZ1
bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3R5cGVJbmplY3Rpb25zW2VdfHxbXTtyZXR1cm4gdGhpcy5m
YWxsYmFjayYmKHQ9dC5jb25jYXQodGhpcy5mYWxsYmFjay5nZXRUeXBlSW5qZWN0aW9ucyhlKSkp
LHR9LGdldEZhY3RvcnlJbmplY3Rpb25zOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2ZhY3RvcnlJ
bmplY3Rpb25zW2VdfHxbXTtyZXR1cm4gdGhpcy5mYWxsYmFjayYmKHQ9dC5jb25jYXQodGhpcy5m
YWxsYmFjay5nZXRGYWN0b3J5SW5qZWN0aW9ucyhlKSkpLHR9LGdldEZhY3RvcnlUeXBlSW5qZWN0
aW9uczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9mYWN0b3J5VHlwZUluamVjdGlvbnNbZV18fFtd
O3JldHVybiB0aGlzLmZhbGxiYWNrJiYodD10LmNvbmNhdCh0aGlzLmZhbGxiYWNrLmdldEZhY3Rv
cnlUeXBlSW5qZWN0aW9ucyhlKSkpLHR9fSx1LnByb3RvdHlwZS5leHBhbmRMb2NhbExvb2t1cD1m
dW5jdGlvbihlLHQpe2lmKHRoaXMucmVzb2x2ZXImJnRoaXMucmVzb2x2ZXIuZXhwYW5kTG9jYWxM
b29rdXApe3ZhciByPXRoaXMubm9ybWFsaXplKGUpLG49dGhpcy5ub3JtYWxpemUodC5zb3VyY2Up
O3JldHVybiBjKHRoaXMscixuKX1yZXR1cm4gdGhpcy5mYWxsYmFjaz90aGlzLmZhbGxiYWNrLmV4
cGFuZExvY2FsTG9va3VwKGUsdCk6bnVsbH07dmFyIG09bi5kZWZhdWx0KG51bGwpLHY9TWF0aC5m
bG9vcihNYXRoLnJhbmRvbSgpKm5ldyBEYXRlKSsiIjtlLmRlZmF1bHQ9dX0pLGUoImRhZy1tYXAi
LFsiZXhwb3J0cyIsInZlcnRleCIsInZpc2l0Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0
IjtmdW5jdGlvbiBuKCl7dGhpcy5uYW1lcz1bXSx0aGlzLnZlcnRpY2VzPU9iamVjdC5jcmVhdGUo
bnVsbCl9ZS5kZWZhdWx0PW4sbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe2lmKCFlKXRocm93
IG5ldyBFcnJvcigiQ2FuJ3QgYWRkIFZlcnRleCB3aXRob3V0IG5hbWUiKTtpZih2b2lkIDAhPT10
aGlzLnZlcnRpY2VzW2VdKXJldHVybiB0aGlzLnZlcnRpY2VzW2VdO3ZhciByPW5ldyB0LmRlZmF1
bHQoZSk7cmV0dXJuIHRoaXMudmVydGljZXNbZV09cix0aGlzLm5hbWVzLnB1c2goZSkscn0sbi5w
cm90b3R5cGUubWFwPWZ1bmN0aW9uKGUsdCl7dGhpcy5hZGQoZSkudmFsdWU9dH0sbi5wcm90b3R5
cGUuYWRkRWRnZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSxyKXtpZihlLm5hbWU9PT10KXRo
cm93IG5ldyBFcnJvcigiY3ljbGUgZGV0ZWN0ZWQ6ICIrdCsiIDwtICIrci5qb2luKCIgPC0gIikp
fWlmKGUmJnQmJmUhPT10KXt2YXIgaT10aGlzLmFkZChlKSxvPXRoaXMuYWRkKHQpO28uaW5jb21p
bmcuaGFzT3duUHJvcGVydHkoZSl8fChyLmRlZmF1bHQoaSxuKSxpLmhhc091dGdvaW5nPSEwLG8u
aW5jb21pbmdbZV09aSxvLmluY29taW5nTmFtZXMucHVzaChlKSl9fSxuLnByb3RvdHlwZS50b3Bz
b3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG4saT17fSxvPXRoaXMudmVydGljZXMsYT10aGlzLm5hbWVz
LHM9YS5sZW5ndGg7Zm9yKHQ9MDt0PHM7dCsrKW49b1thW3RdXSxuLmhhc091dGdvaW5nfHxyLmRl
ZmF1bHQobixlLGkpfSxuLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbihlLHQscixuKXt2YXIg
aTtpZih0aGlzLm1hcChlLHQpLHIpaWYoInN0cmluZyI9PXR5cGVvZiByKXRoaXMuYWRkRWRnZShl
LHIpO2Vsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl0aGlzLmFkZEVkZ2UoZSxyW2ldKTtpZihu
KWlmKCJzdHJpbmciPT10eXBlb2Ygbil0aGlzLmFkZEVkZ2UobixlKTtlbHNlIGZvcihpPTA7aTxu
Lmxlbmd0aDtpKyspdGhpcy5hZGRFZGdlKG5baV0sZSl9fSksZSgiZGFnLW1hcC51bWQiLFsiZXhw
b3J0cyIsImRhZy1tYXAvcGxhdGZvcm0iLCJkYWctbWFwIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ug
c3RyaWN0IjsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5j
dGlvbigpe3JldHVybiByLmRlZmF1bHR9KToidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9k
dWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ci5kZWZhdWx0OiJ1bmRlZmluZWQiIT10eXBlb2Yg
dC5kZWZhdWx0JiYodC5kZWZhdWx0LkRBRz1yLmRlZmF1bHQpfSksZSgiZGFnLW1hcC9wbGF0Zm9y
bSIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO3ZhciB0O2lmKCJvYmplY3Qi
PT10eXBlb2Ygc2VsZil0PXNlbGY7ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIGdsb2JhbCl0aHJv
dyBuZXcgRXJyb3IoIm5vIGdsb2JhbDogYHNlbGZgIG9yIGBnbG9iYWxgIGZvdW5kIik7dD1nbG9i
YWx9ZS5kZWZhdWx0PXR9KSxlKCJkb20taGVscGVyIixbImV4cG9ydHMiLCJodG1sYmFycy1ydW50
aW1lL21vcnBoIiwibW9ycGgtYXR0ciIsImRvbS1oZWxwZXIvYnVpbGQtaHRtbC1kb20iLCJkb20t
aGVscGVyL2NsYXNzZXMiLCJkb20taGVscGVyL3Byb3AiXSxmdW5jdGlvbihlLHQscixuLGksbyl7
InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUubmFtZXNwYWNlVVJJPT09bi5z
dmdOYW1lc3BhY2UmJiFuLnN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50c1tlLnRhZ05hbWVdP24uc3Zn
TmFtZXNwYWNlOm51bGx9ZnVuY3Rpb24gcyhlLHQpe2lmKCJUQUJMRSI9PT10LnRhZ05hbWUpe3Zh
ciByPV8uZXhlYyhlKTtpZihyKXt2YXIgbj1yWzFdO3JldHVybiJ0ciI9PT1ufHwiY29sIj09PW59
fX1mdW5jdGlvbiB1KGUsdCl7dmFyIHI9dC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTty
ZXR1cm4gci5pbm5lckhUTUw9Ijxzdmc+IitlKyI8L3N2Zz4iLHIuZmlyc3RDaGlsZC5jaGlsZE5v
ZGVzfWZ1bmN0aW9uIGwoZSx0LHIpe3RoaXMuZWxlbWVudD1lLHRoaXMuZG9tPXQsdGhpcy5uYW1l
c3BhY2U9cix0aGlzLmd1aWQ9ImVsZW1lbnQiK3crKyx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5p
c0RpcnR5PSEwfWZ1bmN0aW9uIGMoZSl7aWYodGhpcy5kb2N1bWVudD1lfHxkb2N1bWVudCwhdGhp
cy5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIkEgZG9jdW1lbnQgb2JqZWN0IG11c3QgYmUgcGFz
c2VkIHRvIHRoZSBET01IZWxwZXIsIG9yIGF2YWlsYWJsZSBvbiB0aGUgZ2xvYmFsIHNjb3BlIik7
dGhpcy5jYW5DbG9uZT15LHRoaXMubmFtZXNwYWNlPW51bGwsZih0aGlzKX1mdW5jdGlvbiBmKGUp
e3ZhciB0PXAuY2FsbChlLCJmb29iYXI6YmF6Iik7aWYoImZvb2JhcjoiPT09dCllLnByb3RvY29s
Rm9yVVJMPXA7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIFVSTClDPVVSTCxlLnByb3RvY29sRm9y
VVJMPWg7ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIG1vZHVsZXx8ImZ1bmN0aW9uIiE9dHlwZW9m
IG1vZHVsZS5yZXF1aXJlKXRocm93IG5ldyBFcnJvcigiRE9NIEhlbHBlciBjb3VsZCBub3QgZmlu
ZCB2YWxpZCBVUkwgcGFyc2luZyBtZWNoYW5pc20iKTtDPW1vZHVsZS5yZXF1aXJlKCJ1cmwiKSxl
LnByb3RvY29sRm9yVVJMPWh9ZS5kb2N1bWVudC5jcmVhdGVSYXdIVE1MU2VjdGlvbiYmKGUuc2V0
TW9ycGhIVE1MPWQpfWZ1bmN0aW9uIGQoZSx0KXt2YXIgcj10aGlzLmRvY3VtZW50LmNyZWF0ZVJh
d0hUTUxTZWN0aW9uKHQpO2Uuc2V0Tm9kZShyKX1mdW5jdGlvbiBwKGUpe3JldHVybiBFfHwoRT10
aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSksRS5ocmVmPWUsRS5wcm90b2NvbH1mdW5j
dGlvbiBoKGUpe3ZhciB0PUMucGFyc2UoZSkucHJvdG9jb2w7cmV0dXJuIG51bGw9PT10PyI6Ijp0
fXZhciBtPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LHY9bSYmZnVuY3Rp
b24oZSl7dmFyIHQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmFwcGVuZENoaWxkKGUuY3JlYXRl
VGV4dE5vZGUoIiIpKTt2YXIgcj10LmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1yLmNoaWxkTm9k
ZXMubGVuZ3RofShtKSxiPW0mJmZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRWxlbWVudCgiaW5w
dXQiKTt0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTt2YXIgcj10LmNsb25lTm9k
ZSghMSk7cmV0dXJuIXIuY2hlY2tlZH0obSksZz1tJiYoIW0uY3JlYXRlRWxlbWVudE5TfHxmdW5j
dGlvbihlKXt2YXIgdD1lLmNyZWF0ZUVsZW1lbnROUyhuLnN2Z05hbWVzcGFjZSwic3ZnIik7cmV0
dXJuIHQuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IiwiMCAwIDEwMCAxMDAiKSx0LnJlbW92ZUF0dHJp
YnV0ZSgidmlld0JveCIpLCF0LmdldEF0dHJpYnV0ZSgidmlld0JveCIpfShtKSkseT1tJiZmdW5j
dGlvbihlKXt2YXIgdD1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuYXBwZW5kQ2hpbGQoZS5jcmVh
dGVUZXh0Tm9kZSgiICIpKSx0LmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUoIiAiKSk7dmFy
IHI9dC5jbG9uZU5vZGUoITApO3JldHVybiIgIj09PXIuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWV9
KG0pLF89LzwoW1x3Ol0rKS8sdz0xO2wucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0
dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e30pLHRoaXMuX3N0YXRlfSxsLnByb3RvdHlw
ZS5zZXRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3RhdGU9ZX0sbC5wcm90b3R5cGUu
Y2xlYXI9ZnVuY3Rpb24oKXt9LGwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmVs
ZW1lbnQ9bnVsbCx0aGlzLmRvbT1udWxsfTt2YXIgeD1jLnByb3RvdHlwZTt4LmNvbnN0cnVjdG9y
PWMseC5nZXRFbGVtZW50QnlJZD1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHRoaXMuZG9jdW1l
bnQsdC5nZXRFbGVtZW50QnlJZChlKX0seC5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0LHIpe3Jl
dHVybiBlLmluc2VydEJlZm9yZSh0LHIpfSx4LmFwcGVuZENoaWxkPWZ1bmN0aW9uKGUsdCl7cmV0
dXJuIGUuYXBwZW5kQ2hpbGQodCl9O3ZhciBrO2s9InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0
b3ImJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiUGhhbnRvbUpTIik/ZnVuY3Rpb24oZSx0
KXtyZXR1cm4gZVt0XX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pdGVtKHQpfSx4LmNoaWxkQXQ9
ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9ZSxuPTA7bjx0Lmxlbmd0aDtuKyspcj1rKHIuY2hpbGRO
b2Rlcyx0W25dKTtyZXR1cm4gcn0seC5jaGlsZEF0SW5kZXg9ZnVuY3Rpb24oZSx0KXtmb3IodmFy
IHI9ZS5maXJzdENoaWxkLG49MDtyJiZuPHQ7bisrKXI9ci5uZXh0U2libGluZztyZXR1cm4gcn0s
eC5hcHBlbmRUZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodGhpcy5kb2N1
bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSl9LHguc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsdCxyKXtl
LnNldEF0dHJpYnV0ZSh0LFN0cmluZyhyKSl9LHguZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7
cmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQpfSx4LnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKGUsdCxy
LG4pe2Uuc2V0QXR0cmlidXRlTlModCxyLFN0cmluZyhuKSl9LHguZ2V0QXR0cmlidXRlTlM9ZnVu
Y3Rpb24oZSx0LHIpe3JldHVybiBlLmdldEF0dHJpYnV0ZU5TKHQscil9LGc/eC5yZW1vdmVBdHRy
aWJ1dGU9ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUF0dHJpYnV0ZSh0KX06eC5yZW1vdmVBdHRyaWJ1
dGU9ZnVuY3Rpb24oZSx0KXsic3ZnIj09PWUudGFnTmFtZSYmInZpZXdCb3giPT09dD9lLnNldEF0
dHJpYnV0ZSh0LG51bGwpOmUucmVtb3ZlQXR0cmlidXRlKHQpfSx4LnNldFByb3BlcnR5U3RyaWN0
PWZ1bmN0aW9uKGUsdCxyKXt2b2lkIDA9PT1yJiYocj1udWxsKSxudWxsIT09cnx8InZhbHVlIiE9
PXQmJiJ0eXBlIiE9PXQmJiJzcmMiIT09dHx8KHI9IiIpLGVbdF09cn0seC5nZXRQcm9wZXJ0eVN0
cmljdD1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdfSx4LnNldFByb3BlcnR5PWZ1bmN0aW9uKGUs
dCxyLGkpe2lmKGUubmFtZXNwYWNlVVJJPT09bi5zdmdOYW1lc3BhY2Upby5pc0F0dHJSZW1vdmFs
VmFsdWUocik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6aT9lLnNldEF0dHJpYnV0ZU5TKGksdCxyKTpl
LnNldEF0dHJpYnV0ZSh0LHIpO2Vsc2V7dmFyIGE9by5ub3JtYWxpemVQcm9wZXJ0eShlLHQpLHM9
YS5ub3JtYWxpemVkLHU9YS50eXBlOyJwcm9wIj09PXU/ZVtzXT1yOm8uaXNBdHRyUmVtb3ZhbFZh
bHVlKHIpP2UucmVtb3ZlQXR0cmlidXRlKHQpOmkmJmUuc2V0QXR0cmlidXRlTlM/ZS5zZXRBdHRy
aWJ1dGVOUyhpLHQscik6ZS5zZXRBdHRyaWJ1dGUodCxyKX19LG0mJm0uY3JlYXRlRWxlbWVudE5T
Pyh4LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLm5hbWVzcGFjZTtyZXR1
cm4gdCYmKHI9InN2ZyI9PT1lP24uc3ZnTmFtZXNwYWNlOmEodCkpLHI/dGhpcy5kb2N1bWVudC5j
cmVhdGVFbGVtZW50TlMocixlKTp0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSl9LHguc2V0
QXR0cmlidXRlTlM9ZnVuY3Rpb24oZSx0LHIsbil7ZS5zZXRBdHRyaWJ1dGVOUyh0LHIsU3RyaW5n
KG4pKX0pOih4LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudChlKX0seC5zZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbihlLHQscixuKXtlLnNl
dEF0dHJpYnV0ZShyLFN0cmluZyhuKSl9KSx4LmFkZENsYXNzZXM9aS5hZGRDbGFzc2VzLHgucmVt
b3ZlQ2xhc3Nlcz1pLnJlbW92ZUNsYXNzZXMseC5zZXROYW1lc3BhY2U9ZnVuY3Rpb24oZSl7dGhp
cy5uYW1lc3BhY2U9ZX0seC5kZXRlY3ROYW1lc3BhY2U9ZnVuY3Rpb24oZSl7dGhpcy5uYW1lc3Bh
Y2U9YShlKX0seC5jcmVhdGVEb2N1bWVudEZyYWdtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfSx4LmNyZWF0ZVRleHROb2RlPWZ1bmN0
aW9uKGUpe3JldHVybiB0aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpfSx4LmNyZWF0ZUNv
bW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlKX0s
eC5yZXBhaXJDbG9uZWROb2RlPWZ1bmN0aW9uKGUsdCxyKXtpZih2JiZ0Lmxlbmd0aD4wKWZvcih2
YXIgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7dmFyIG89dGhpcy5kb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZSgiIiksYT10W25dLHM9dGhpcy5jaGlsZEF0SW5kZXgoZSxhKTtzP2UuaW5zZXJ0QmVmb3Jl
KG8scyk6ZS5hcHBlbmRDaGlsZChvKX1iJiZyJiZlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNo
ZWNrZWQiKX0seC5jbG9uZU5vZGU9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmNsb25lTm9kZSghIXQp
O3JldHVybiByfSx4LkF0dHJNb3JwaENsYXNzPXIuZGVmYXVsdCx4LmNyZWF0ZUF0dHJNb3JwaD1m
dW5jdGlvbihlLHQscil7cmV0dXJuIHRoaXMuQXR0ck1vcnBoQ2xhc3MuY3JlYXRlKGUsdCx0aGlz
LHIpfSx4LkVsZW1lbnRNb3JwaENsYXNzPWwseC5jcmVhdGVFbGVtZW50TW9ycGg9ZnVuY3Rpb24o
ZSx0KXtyZXR1cm4gbmV3IHRoaXMuRWxlbWVudE1vcnBoQ2xhc3MoZSx0aGlzLHQpfSx4LmNyZWF0
ZVVuc2FmZUF0dHJNb3JwaD1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcy5jcmVhdGVBdHRyTW9y
cGgoZSx0LHIpO3JldHVybiBuLmVzY2FwZWQ9ITEsbn0seC5Nb3JwaENsYXNzPXQuZGVmYXVsdCx4
LmNyZWF0ZU1vcnBoPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKG4mJjExPT09bi5ub2RlVHlwZSl0aHJv
dyBuZXcgRXJyb3IoIkNhbm5vdCBwYXNzIGEgZnJhZ21lbnQgYXMgdGhlIGNvbnRleHR1YWwgZWxl
bWVudCB0byBjcmVhdGVNb3JwaCIpOyFuJiZlJiYxPT09ZS5ub2RlVHlwZSYmKG49ZSk7dmFyIGk9
bmV3IHRoaXMuTW9ycGhDbGFzcyh0aGlzLG4pO3JldHVybiBpLmZpcnN0Tm9kZT10LGkubGFzdE5v
ZGU9cixpfSx4LmNyZWF0ZUZyYWdtZW50TW9ycGg9ZnVuY3Rpb24oZSl7aWYoZSYmMTE9PT1lLm5v
ZGVUeXBlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBhc3MgYSBmcmFnbWVudCBhcyB0aGUgY29u
dGV4dHVhbCBlbGVtZW50IHRvIGNyZWF0ZU1vcnBoIik7dmFyIHI9dGhpcy5jcmVhdGVEb2N1bWVu
dEZyYWdtZW50KCk7cmV0dXJuIHQuZGVmYXVsdC5jcmVhdGUodGhpcyxlLHIpfSx4LnJlcGxhY2VD
b250ZW50V2l0aE1vcnBoPWZ1bmN0aW9uKGUpe3ZhciByPWUuZmlyc3RDaGlsZDtpZihyKXt2YXIg
bj10LmRlZmF1bHQuYXR0YWNoKHRoaXMsZSxyLGUubGFzdENoaWxkKTtyZXR1cm4gbi5jbGVhcigp
LG59dmFyIGk9dGhpcy5jcmVhdGVDb21tZW50KCIiKTtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChl
LGkpLHQuZGVmYXVsdC5jcmVhdGUodGhpcyxlLGkpfSx4LmNyZWF0ZVVuc2FmZU1vcnBoPWZ1bmN0
aW9uKGUsdCxyLG4pe3ZhciBpPXRoaXMuY3JlYXRlTW9ycGgoZSx0LHIsbik7cmV0dXJuIGkucGFy
c2VUZXh0QXNIVE1MPSEwLGl9LHguY3JlYXRlTW9ycGhBdD1mdW5jdGlvbihlLHQscixuKXt2YXIg
aT10PT09cixvPXRoaXMuY2hpbGRBdEluZGV4KGUsdCksYT1pP286dGhpcy5jaGlsZEF0SW5kZXgo
ZSxyKTtyZXR1cm4gdGhpcy5jcmVhdGVNb3JwaChlLG8sYSxuKX0seC5jcmVhdGVVbnNhZmVNb3Jw
aEF0PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpPXRoaXMuY3JlYXRlTW9ycGhBdChlLHQscixuKTty
ZXR1cm4gaS5wYXJzZVRleHRBc0hUTUw9ITAsaX0seC5pbnNlcnRNb3JwaEJlZm9yZT1mdW5jdGlv
bihlLHQscil7dmFyIG49dGhpcy5kb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKTtyZXR1cm4gZS5p
bnNlcnRCZWZvcmUobix0KSx0aGlzLmNyZWF0ZU1vcnBoKGUsbixuLHIpfSx4LmFwcGVuZE1vcnBo
PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5kb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKTtyZXR1
cm4gZS5hcHBlbmRDaGlsZChyKSx0aGlzLmNyZWF0ZU1vcnBoKGUscixyLHQpfSx4Lmluc2VydEJv
dW5kYXJ5PWZ1bmN0aW9uKGUsdCl7dmFyIHI9bnVsbD09PXQ/bnVsbDp0aGlzLmNoaWxkQXRJbmRl
eChlLHQpO3RoaXMuaW5zZXJ0QmVmb3JlKGUsdGhpcy5jcmVhdGVUZXh0Tm9kZSgiIikscil9LHgu
c2V0TW9ycGhIVE1MPWZ1bmN0aW9uKGUsdCl7ZS5zZXRIVE1MKHQpfSx4LnBhcnNlSFRNTD1mdW5j
dGlvbihlLHQpe3ZhciByO2lmKGEodCk9PT1uLnN2Z05hbWVzcGFjZSlyPXUoZSx0aGlzKTtlbHNl
e3ZhciBpPW4uYnVpbGRIVE1MRE9NKGUsdCx0aGlzKTtpZihzKGUsdCkpe2Zvcih2YXIgbz1pWzBd
O28mJjEhPT1vLm5vZGVUeXBlOylvPW8ubmV4dFNpYmxpbmc7cj1vLmNoaWxkTm9kZXN9ZWxzZSBy
PWl9dmFyIGw9dGhpcy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYociYmci5s
ZW5ndGg+MCl7dmFyIGM9clswXTtmb3IoIlNFTEVDVCI9PT10LnRhZ05hbWUmJihjPWMubmV4dFNp
YmxpbmcpO2M7KXt2YXIgZj1jO2M9Yy5uZXh0U2libGluZyxsLmFwcGVuZENoaWxkKGYpfX1yZXR1
cm4gbH07dmFyIEMsRTtlLmRlZmF1bHQ9Y30pLGUoImRvbS1oZWxwZXIvYnVpbGQtaHRtbC1kb20i
LFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCl7dD0i
JnNoeTsiK3QsZS5pbm5lckhUTUw9dDtmb3IodmFyIHI9ZS5jaGlsZE5vZGVzLG49clswXTsxPT09
bi5ub2RlVHlwZSYmIW4ubm9kZU5hbWU7KW49bi5maXJzdENoaWxkO2lmKDM9PT1uLm5vZGVUeXBl
JiYiwq0iPT09bi5ub2RlVmFsdWUuY2hhckF0KDApKXt2YXIgaT1uLm5vZGVWYWx1ZS5zbGljZSgx
KTtpLmxlbmd0aD9uLm5vZGVWYWx1ZT1uLm5vZGVWYWx1ZS5zbGljZSgxKTpuLnBhcmVudE5vZGUu
cmVtb3ZlQ2hpbGQobil9cmV0dXJuIHJ9ZnVuY3Rpb24gcihlLHIpe3ZhciBpPXIudGFnTmFtZSxv
PXIub3V0ZXJIVE1MfHwobmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHIpO2lm
KCFvKXRocm93IkNhbid0IHNldCBpbm5lckhUTUwgb24gIitpKyIgaW4gdGhpcyBicm93c2VyIjtl
PW4oZSxyKTtmb3IodmFyIGE9ZltpLnRvTG93ZXJDYXNlKCldLHM9by5tYXRjaChuZXcgUmVnRXhw
KCI8IitpKyIoW14+XSopPiIsImkiKSlbMF0sdT0iPC8iK2krIj4iLGw9W3MsZSx1XSxjPWEubGVu
Z3RoLGQ9MStjO2MtLTspbC51bnNoaWZ0KCI8IithW2NdKyI+IiksbC5wdXNoKCI8LyIrYVtjXSsi
PiIpO3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QocCxsLmpvaW4oIiIpKTtm
b3IodmFyIGg9cDtkLS07KWZvcihoPWguZmlyc3RDaGlsZDtoJiYxIT09aC5ub2RlVHlwZTspaD1o
Lm5leHRTaWJsaW5nO2Zvcig7aCYmaC50YWdOYW1lIT09aTspaD1oLm5leHRTaWJsaW5nO3JldHVy
biBoP2guY2hpbGROb2RlczpbXX1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuIlNFTEVDVCI9PT10LnRh
Z05hbWUmJihlPSI8b3B0aW9uPjwvb3B0aW9uPiIrZSksZX12YXIgaT17Zm9yZWlnbk9iamVjdDox
LGRlc2M6MSx0aXRsZToxfTtlLnN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50cz1pO3ZhciBvPSJodHRw
Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7ZS5zdmdOYW1lc3BhY2U9bzt2YXIgYSxzPSJ1bmRlZmlu
ZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LHU9cyYmZnVuY3Rpb24oZSl7aWYodm9pZCAw
IT09ZS5jcmVhdGVFbGVtZW50TlMpe3ZhciB0PWUuY3JlYXRlRWxlbWVudE5TKG8sInRpdGxlIik7
cmV0dXJuIHQuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiIsMD09PXQuY2hpbGROb2Rlcy5sZW5ndGh8
fDEhPT10LmNoaWxkTm9kZXNbMF0ubm9kZVR5cGV9fShzKSxsPXMmJmZ1bmN0aW9uKGUpe3ZhciB0
PWUuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiIs
dC5maXJzdENoaWxkLmlubmVySFRNTD0iPHNjcmlwdD48L3NjcmlwdD4iLCIiPT09dC5maXJzdENo
aWxkLmlubmVySFRNTH0ocyksYz1zJiZmdW5jdGlvbihlKXt2YXIgdD1lLmNyZWF0ZUVsZW1lbnQo
ImRpdiIpO3JldHVybiB0LmlubmVySFRNTD0iVGVzdDogPHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxh
Y2Vob2xkZXInPjwvc2NyaXB0PlZhbHVlIiwiVGVzdDoiPT09dC5jaGlsZE5vZGVzWzBdLm5vZGVW
YWx1ZSYmIiBWYWx1ZSI9PT10LmNoaWxkTm9kZXNbMl0ubm9kZVZhbHVlfShzKSxmPXMmJmZ1bmN0
aW9uKGUpe3ZhciB0LHIsbj1lLmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7dHJ5e24uaW5uZXJIVE1M
PSI8dGJvZHk+PC90Ym9keT4ifWNhdGNoKGUpe31maW5hbGx5e3I9MD09PW4uY2hpbGROb2Rlcy5s
ZW5ndGh9ciYmKHQ9e2NvbGdyb3VwOlsidGFibGUiXSx0YWJsZTpbXSx0Ym9keTpbInRhYmxlIl0s
dGZvb3Q6WyJ0YWJsZSJdLHRoZWFkOlsidGFibGUiXSx0cjpbInRhYmxlIiwidGJvZHkiXX0pO3Zh
ciBpPWUuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7cmV0dXJuIGkuaW5uZXJIVE1MPSI8b3B0aW9u
Pjwvb3B0aW9uPiIsaS5jaGlsZE5vZGVzWzBdfHwodD10fHx7fSx0LnNlbGVjdD1bXSksdH0ocyk7
YT1sP2Z1bmN0aW9uKGUscixpKXtyZXR1cm4gZT1uKGUscikscj1pLmNsb25lTm9kZShyLCExKSx0
KHIsZSksci5jaGlsZE5vZGVzfTpmdW5jdGlvbihlLHQscil7cmV0dXJuIGU9bihlLHQpLHQ9ci5j
bG9uZU5vZGUodCwhMSksdC5pbm5lckhUTUw9ZSx0LmNoaWxkTm9kZXN9O3ZhciBkO2Q9Znx8Yz9m
dW5jdGlvbihlLHQsbil7dmFyIGk9W10sbz1bXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPWUucmVw
bGFjZSgvKFxzKikoPHNjcmlwdCkvZyxmdW5jdGlvbihlLHQscil7cmV0dXJuIGkucHVzaCh0KSxy
fSksZT1lLnJlcGxhY2UoLyg8XC9zY3JpcHQ+KShccyopL2csZnVuY3Rpb24oZSx0LHIpe3JldHVy
biBvLnB1c2gociksdH0pKTt2YXIgcztzPWZbdC50YWdOYW1lLnRvTG93ZXJDYXNlKCldP3IoZSx0
KTphKGUsdCxuKTt2YXIgdSxsLGMsZCxwPVtdO2Zvcih1PTA7dTxzLmxlbmd0aDt1KyspaWYoYz1z
W3VdLDE9PT1jLm5vZGVUeXBlKWlmKCJTQ1JJUFQiPT09Yy50YWdOYW1lKXAucHVzaChjKTtlbHNl
IGZvcihkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGw9MDtsPGQubGVuZ3RoO2wr
KylwLnB1c2goZFtsXSk7dmFyIGgsbSx2LGI7Zm9yKHU9MDt1PHAubGVuZ3RoO3UrKyloPXBbdV0s
dj1pW3VdLHYmJnYubGVuZ3RoPjAmJihtPW4uZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodiksaC5w
YXJlbnROb2RlLmluc2VydEJlZm9yZShtLGgpKSxiPW9bdV0sYiYmYi5sZW5ndGg+MCYmKG09bi5k
b2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiKSxoLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG0saC5u
ZXh0U2libGluZykpO3JldHVybiBzfTphO3ZhciBwO3U/ZS5idWlsZEhUTUxET009cD1mdW5jdGlv
bihlLHQscil7cmV0dXJuIGlbdC50YWdOYW1lXT9kKGUsZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi
ZGl2Iikscik6ZChlLHQscil9OmUuYnVpbGRIVE1MRE9NPXA9ZCxlLmJ1aWxkSFRNTERPTT1wfSks
ZSgiZG9tLWhlbHBlci9jbGFzc2VzIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gdChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiI7cmV0dXJu
IiIhPT10JiYiICIhPT10P3Quc3BsaXQoIiAiKTpbXX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBy
PTAsbj1lLmxlbmd0aCxpPTAsbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKTtyPG47cisrKWZvcihp
PTA7aTxvO2krKylpZih0W2ldPT09ZVtyXSl7YVtpXT1yO2JyZWFrfXJldHVybiBhfWZ1bmN0aW9u
IG4oZSxuKXtmb3IodmFyIGk9dChlKSxvPXIoaSxuKSxhPSExLHM9MCx1PW4ubGVuZ3RoO3M8dTtz
Kyspdm9pZCAwPT09b1tzXSYmKGE9ITAsaS5wdXNoKG5bc10pKTthJiZlLnNldEF0dHJpYnV0ZSgi
Y2xhc3MiLGkubGVuZ3RoPjA/aS5qb2luKCIgIik6IiIpfWZ1bmN0aW9uIGkoZSxuKXtmb3IodmFy
IGk9dChlKSxvPXIobixpKSxhPSExLHM9W10sdT0wLGw9aS5sZW5ndGg7dTxsO3UrKyl2b2lkIDA9
PT1vW3VdP3MucHVzaChpW3VdKTphPSEwO2EmJmUuc2V0QXR0cmlidXRlKCJjbGFzcyIscy5sZW5n
dGg+MD9zLmpvaW4oIiAiKToiIil9dmFyIG8sYSxzPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1l
bnQmJmRvY3VtZW50LHU9cyYmZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJkaXYiKTtyZXR1cm4hIWUuY2xhc3NMaXN0JiYoZS5jbGFzc0xpc3QuYWRkKCJib28iKSxlLmNs
YXNzTGlzdC5hZGQoImJvbyIsImJheiIpLCJib28gYmF6Ij09PWUuY2xhc3NOYW1lKX0oKTt1Pyhl
LmFkZENsYXNzZXM9bz1mdW5jdGlvbihlLHQpe2UuY2xhc3NMaXN0PzE9PT10Lmxlbmd0aD9lLmNs
YXNzTGlzdC5hZGQodFswXSk6Mj09PXQubGVuZ3RoP2UuY2xhc3NMaXN0LmFkZCh0WzBdLHRbMV0p
OmUuY2xhc3NMaXN0LmFkZC5hcHBseShlLmNsYXNzTGlzdCx0KTpuKGUsdCl9LGUucmVtb3ZlQ2xh
c3Nlcz1hPWZ1bmN0aW9uKGUsdCl7ZS5jbGFzc0xpc3Q/MT09PXQubGVuZ3RoP2UuY2xhc3NMaXN0
LnJlbW92ZSh0WzBdKToyPT09dC5sZW5ndGg/ZS5jbGFzc0xpc3QucmVtb3ZlKHRbMF0sdFsxXSk6
ZS5jbGFzc0xpc3QucmVtb3ZlLmFwcGx5KGUuY2xhc3NMaXN0LHQpOmkoZSx0KX0pOihlLmFkZENs
YXNzZXM9bz1uLGUucmVtb3ZlQ2xhc3Nlcz1hPWkpLGUuYWRkQ2xhc3Nlcz1vLGUucmVtb3ZlQ2xh
c3Nlcz1hfSksZSgiZG9tLWhlbHBlci9wcm9wIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNl
IHN0cmljdCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PWV9ZnVuY3Rp
b24gcihlLHQpe3ZhciByLGk7aWYodCBpbiBlKWk9dCxyPSJwcm9wIjtlbHNle3ZhciBvPXQudG9M
b3dlckNhc2UoKTtvIGluIGU/KHI9InByb3AiLGk9byk6KHI9ImF0dHIiLGk9dCl9cmV0dXJuInBy
b3AiIT09cnx8InN0eWxlIiE9PWkudG9Mb3dlckNhc2UoKSYmIW4oZS50YWdOYW1lLGkpfHwocj0i
YXR0ciIpLHtub3JtYWxpemVkOmksdHlwZTpyfX1mdW5jdGlvbiBuKGUsdCl7dmFyIHI9aVtlLnRv
VXBwZXJDYXNlKCldO3JldHVybiByJiZyW3QudG9Mb3dlckNhc2UoKV18fCExfWUuaXNBdHRyUmVt
b3ZhbFZhbHVlPXQsZS5ub3JtYWxpemVQcm9wZXJ0eT1yO3ZhciBpPXtCVVRUT046e3R5cGU6ITAs
Zm9ybTohMH0sSU5QVVQ6e2xpc3Q6ITAsdHlwZTohMCxmb3JtOiEwLGF1dG9jb3JyZWN0OiEwfSxT
RUxFQ1Q6e2Zvcm06ITB9LE9QVElPTjp7Zm9ybTohMH0sVEVYVEFSRUE6e2Zvcm06ITB9LExBQkVM
Ontmb3JtOiEwfSxGSUVMRFNFVDp7Zm9ybTohMH0sTEVHRU5EOntmb3JtOiEwfSxPQkpFQ1Q6e2Zv
cm06ITB9fX0pLGUoImVtYmVyLWFwcGxpY2F0aW9uL2luZGV4IixbImV4cG9ydHMiLCJlbWJlci1t
ZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZmVhdHVyZXMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9s
YXp5X2xvYWQiLCJlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vcmVzb2x2ZXIiLCJlbWJlci1hcHBs
aWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24iLCJlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBw
bGljYXRpb24taW5zdGFuY2UiLCJlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vZW5naW5lIiwiZW1i
ZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZS1pbnN0YW5jZSJdLGZ1bmN0aW9uKGUsdCxyLG4s
aSxvLGEscyx1KXsidXNlIHN0cmljdCI7dC5kZWZhdWx0LkFwcGxpY2F0aW9uPW8uZGVmYXVsdCx0
LmRlZmF1bHQuUmVzb2x2ZXI9aS5SZXNvbHZlcix0LmRlZmF1bHQuRGVmYXVsdFJlc29sdmVyPWku
ZGVmYXVsdCxuLnJ1bkxvYWRIb29rcygiRW1iZXIuQXBwbGljYXRpb24iLG8uZGVmYXVsdCl9KSxl
KCJlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24taW5zdGFuY2UiLFsiZXhwb3J0
cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXIt
bWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwvc3ltYm9sIiwiZW1iZXItbWV0YWwvcnVu
X2xvb3AiLCJlbWJlci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL3JlZ2lz
dHJ5X3Byb3h5IiwiZW1iZXItbWV0YWwvYXNzaWduIiwiZW1iZXItbWV0YWwvZW52aXJvbm1lbnQi
LCJlbWJlci1ydW50aW1lL2V4dC9yc3ZwIiwiZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSIsImVt
YmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUtaW5zdGFuY2UiXSxmdW5jdGlvbihlLHQscixu
LGksbyxhLHMsdSxsLGMsZixkKXsidXNlIHN0cmljdCI7dmFyIHA9aS5kZWZhdWx0KCJJTlRFUk5B
TF9CT09UX09QVElPTlMiKTtlLklOVEVSTkFMX0JPT1RfT1BUSU9OUz1wO3ZhciBoPXZvaWQgMCxt
PWQuZGVmYXVsdC5leHRlbmQoe2FwcGxpY2F0aW9uOm51bGwsY3VzdG9tRXZlbnRzOm51bGwscm9v
dEVsZW1lbnQ6bnVsbCxpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1
bWVudHMpLHRoaXMucmVnaXN0ZXIoIi1hcHBsaWNhdGlvbi1pbnN0YW5jZTptYWluIix0aGlzLHtp
bnN0YW50aWF0ZTohMX0pLHRoaXMuX2Jvb3RlZD0hMX0sYm9vdDpmdW5jdGlvbigpe3ZhciBlPXRo
aXMsdD1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1l
bnRzWzBdO3JldHVybiB0aGlzLl9ib290UHJvbWlzZT90aGlzLl9ib290UHJvbWlzZToodGhpcy5f
Ym9vdFByb21pc2U9bmV3IGMuZGVmYXVsdC5Qcm9taXNlKGZ1bmN0aW9uKHIpe3JldHVybiByKGUu
X2Jvb3RTeW5jKHQpKX0pLHRoaXMuX2Jvb3RQcm9taXNlKX0sX2Jvb3RTeW5jOmZ1bmN0aW9uKGUp
e2lmKHRoaXMuX2Jvb3RlZClyZXR1cm4gdGhpcztlPW5ldyBoKGUpO3ZhciB0PXRoaXMuX19yZWdp
c3RyeV9fO2lmKHQucmVnaXN0ZXIoIi1lbnZpcm9ubWVudDptYWluIixlLnRvRW52aXJvbm1lbnQo
KSx7aW5zdGFudGlhdGU6ITF9KSx0LmluamVjdGlvbigidmlldyIsIl9lbnZpcm9ubWVudCIsIi1l
bnZpcm9ubWVudDptYWluIiksdC5pbmplY3Rpb24oInJvdXRlIiwiX2Vudmlyb25tZW50IiwiLWVu
dmlyb25tZW50Om1haW4iKSx0LnJlZ2lzdGVyKCJzZXJ2aWNlOi1kb2N1bWVudCIsZS5kb2N1bWVu
dCx7CitpbnN0YW50aWF0ZTohMX0pLGUuaXNJbnRlcmFjdGl2ZT8odC5pbmplY3Rpb24oInZpZXci
LCJyZW5kZXJlciIsInJlbmRlcmVyOi1kb20iKSx0LmluamVjdGlvbigiY29tcG9uZW50IiwicmVu
ZGVyZXIiLCJyZW5kZXJlcjotZG9tIikpOih0LmluamVjdGlvbigidmlldyIsInJlbmRlcmVyIiwi
cmVuZGVyZXI6LWluZXJ0IiksdC5pbmplY3Rpb24oImNvbXBvbmVudCIsInJlbmRlcmVyIiwicmVu
ZGVyZXI6LWluZXJ0IikpLGUucm9vdEVsZW1lbnQ/dGhpcy5yb290RWxlbWVudD1lLnJvb3RFbGVt
ZW50OnRoaXMucm9vdEVsZW1lbnQ9dGhpcy5hcHBsaWNhdGlvbi5yb290RWxlbWVudCxlLmxvY2F0
aW9uKXt2YXIgaT1yLmdldCh0aGlzLCJyb3V0ZXIiKTtuLnNldChpLCJsb2NhdGlvbiIsZS5sb2Nh
dGlvbil9cmV0dXJuIHRoaXMuYXBwbGljYXRpb24ucnVuSW5zdGFuY2VJbml0aWFsaXplcnModGhp
cyksZS5pc0ludGVyYWN0aXZlJiZ0aGlzLnNldHVwRXZlbnREaXNwYXRjaGVyKCksdGhpcy5fYm9v
dGVkPSEwLHRoaXN9LHJvdXRlcjphLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9v
a3VwKCJyb3V0ZXI6bWFpbiIpfSkucmVhZE9ubHkoKSxkaWRDcmVhdGVSb290VmlldzpmdW5jdGlv
bihlKXtlLmFwcGVuZFRvKHRoaXMucm9vdEVsZW1lbnQpfSxzdGFydFJvdXRpbmc6ZnVuY3Rpb24o
KXt2YXIgZT1yLmdldCh0aGlzLCJyb3V0ZXIiKTtlLnN0YXJ0Um91dGluZygpLHRoaXMuX2RpZFNl
dHVwUm91dGVyPSEwfSxzZXR1cFJvdXRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLl9kaWRTZXR1cFJv
dXRlcil7dGhpcy5fZGlkU2V0dXBSb3V0ZXI9ITA7dmFyIGU9ci5nZXQodGhpcywicm91dGVyIik7
ZS5zZXR1cFJvdXRlcigpfX0saGFuZGxlVVJMOmZ1bmN0aW9uKGUpe3ZhciB0PXIuZ2V0KHRoaXMs
InJvdXRlciIpO3JldHVybiB0aGlzLnNldHVwUm91dGVyKCksdC5oYW5kbGVVUkwoZSl9LHNldHVw
RXZlbnREaXNwYXRjaGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sb29rdXAoImV2ZW50X2Rpc3Bh
dGNoZXI6bWFpbiIpLHQ9ci5nZXQodGhpcy5hcHBsaWNhdGlvbiwiY3VzdG9tRXZlbnRzIiksbj1y
LmdldCh0aGlzLCJjdXN0b21FdmVudHMiKSxpPXUuZGVmYXVsdCh7fSx0LG4pO3JldHVybiBlLnNl
dHVwKGksdGhpcy5yb290RWxlbWVudCksZX0sZ2V0VVJMOmZ1bmN0aW9uKCl7dmFyIGU9ci5nZXQo
dGhpcywicm91dGVyIik7cmV0dXJuIHIuZ2V0KGUsInVybCIpfSx2aXNpdDpmdW5jdGlvbihlKXt2
YXIgdD10aGlzO3RoaXMuc2V0dXBSb3V0ZXIoKTt2YXIgbj1yLmdldCh0aGlzLCJyb3V0ZXIiKSxp
PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjLmRlZmF1bHQuUHJvbWlzZShmdW5jdGlvbihlKXtvLmRl
ZmF1bHQubmV4dChudWxsLGUsdCl9KX0sYT1mdW5jdGlvbihlKXtpZihlLmVycm9yKXRocm93IGUu
ZXJyb3I7aWYoIlRyYW5zaXRpb25BYm9ydGVkIj09PWUubmFtZSYmbi5yb3V0ZXIuYWN0aXZlVHJh
bnNpdGlvbilyZXR1cm4gbi5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbi50aGVuKGksYSk7dGhyb3ci
VHJhbnNpdGlvbkFib3J0ZWQiPT09ZS5uYW1lP25ldyBFcnJvcihlLm1lc3NhZ2UpOmV9LHM9ci5n
ZXQobiwibG9jYXRpb24iKTtyZXR1cm4gcy5zZXRVUkwoZSksbi5oYW5kbGVVUkwocy5nZXRVUkwo
KSkudGhlbihpLGEpfX0pO2g9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2
b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1lbnRzWzBdO3RoaXMualF1ZXJ5PWYuZGVmYXVs
dCx0aGlzLmlzSW50ZXJhY3RpdmU9bC5kZWZhdWx0Lmhhc0RPTSx2b2lkIDAhPT1lLmlzQnJvd3Nl
cj90aGlzLmlzQnJvd3Nlcj0hIWUuaXNCcm93c2VyOnRoaXMuaXNCcm93c2VyPWwuZGVmYXVsdC5o
YXNET00sdGhpcy5pc0Jyb3dzZXJ8fCh0aGlzLmpRdWVyeT1udWxsLHRoaXMuaXNJbnRlcmFjdGl2
ZT0hMSx0aGlzLmxvY2F0aW9uPSJub25lIiksdm9pZCAwIT09ZS5zaG91bGRSZW5kZXI/dGhpcy5z
aG91bGRSZW5kZXI9ISFlLnNob3VsZFJlbmRlcjp0aGlzLnNob3VsZFJlbmRlcj0hMCx0aGlzLnNo
b3VsZFJlbmRlcnx8KHRoaXMualF1ZXJ5PW51bGwsdGhpcy5pc0ludGVyYWN0aXZlPSExKSxlLmRv
Y3VtZW50P3RoaXMuZG9jdW1lbnQ9ZS5kb2N1bWVudDp0aGlzLmRvY3VtZW50PSJ1bmRlZmluZWQi
IT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6bnVsbCxlLnJvb3RFbGVtZW50JiYodGhpcy5yb290
RWxlbWVudD1lLnJvb3RFbGVtZW50KSx2b2lkIDAhPT1lLmxvY2F0aW9uJiYodGhpcy5sb2NhdGlv
bj1lLmxvY2F0aW9uKSx2b2lkIDAhPT1lLmpRdWVyeSYmKHRoaXMualF1ZXJ5PWUualF1ZXJ5KSx2
b2lkIDAhPT1lLmlzSW50ZXJhY3RpdmUmJih0aGlzLmlzSW50ZXJhY3RpdmU9ISFlLmlzSW50ZXJh
Y3RpdmUpfSxoLnByb3RvdHlwZS50b0Vudmlyb25tZW50PWZ1bmN0aW9uKCl7dmFyIGU9dS5kZWZh
dWx0KHt9LGwuZGVmYXVsdCk7cmV0dXJuIGUuaGFzRE9NPXRoaXMuaXNCcm93c2VyLGUub3B0aW9u
cz10aGlzLGV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwiY29udGFpbmVyIix7
Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczty
ZXR1cm57bG9va3VwOmZ1bmN0aW9uKCl7cmV0dXJuIGUubG9va3VwLmFwcGx5KGUsYXJndW1lbnRz
KX19fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwicmVnaXN0cnkiLHtjb25m
aWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5idWlsZEZh
a2VSZWdpc3RyeVdpdGhEZXByZWNhdGlvbnModGhpcywiQXBwbGljYXRpb25JbnN0YW5jZSIpfX0p
LGUuZGVmYXVsdD1tfSksZSgiZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2FwcGxpY2F0aW9uIixb
ImV4cG9ydHMiLCJlbWJlci1tZXRhbCIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwv
cHJvcGVydHlfZ2V0IiwiZW1iZXItcnVudGltZS9zeXN0ZW0vbGF6eV9sb2FkIiwiZW1iZXItbWV0
YWwvcnVuX2xvb3AiLCJlbWJlci1ydW50aW1lL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIiLCJlbWJl
ci1odG1sYmFycy9zeXN0ZW0vZG9tLWhlbHBlciIsImVtYmVyLW1ldGFsLXZpZXdzIiwiZW1iZXIt
aHRtbGJhcnMvdGVtcGxhdGVzL3RvcC1sZXZlbC12aWV3IiwiZW1iZXItcm91dGluZy12aWV3cy92
aWV3cy9vdXRsZXQiLCJlbWJlci12aWV3cy92aWV3cy92aWV3IiwiZW1iZXItdmlld3Mvc3lzdGVt
L2V2ZW50X2Rpc3BhdGNoZXIiLCJlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5IiwiZW1iZXItcm91
dGluZy9zeXN0ZW0vcm91dGUiLCJlbWJlci1yb3V0aW5nL3N5c3RlbS9yb3V0ZXIiLCJlbWJlci1y
b3V0aW5nL2xvY2F0aW9uL2hhc2hfbG9jYXRpb24iLCJlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2hp
c3RvcnlfbG9jYXRpb24iLCJlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2F1dG9fbG9jYXRpb24iLCJl
bWJlci1yb3V0aW5nL2xvY2F0aW9uL25vbmVfbG9jYXRpb24iLCJlbWJlci1yb3V0aW5nL3N5c3Rl
bS9jYWNoZSIsImVtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBsaWNhdGlvbi1pbnN0YW5jZSIs
ImVtYmVyLXZpZXdzL3ZpZXdzL3RleHRfZmllbGQiLCJlbWJlci12aWV3cy92aWV3cy90ZXh0X2Fy
ZWEiLCJlbWJlci12aWV3cy92aWV3cy9jaGVja2JveCIsImVtYmVyLXJvdXRpbmctdmlld3MvY29t
cG9uZW50cy9saW5rLXRvIiwiZW1iZXItcm91dGluZy9zZXJ2aWNlcy9yb3V0aW5nIiwiZW1iZXIt
ZXh0ZW5zaW9uLXN1cHBvcnQvY29udGFpbmVyX2RlYnVnX2FkYXB0ZXIiLCJlbWJlci1ydW50aW1l
L21peGlucy9yZWdpc3RyeV9wcm94eSIsImNvbnRhaW5lci9yZWdpc3RyeSIsImVtYmVyLW1ldGFs
L2Vudmlyb25tZW50IiwiZW1iZXItcnVudGltZS9leHQvcnN2cCIsImVtYmVyLWFwcGxpY2F0aW9u
L3N5c3RlbS9lbmdpbmUiLCJyZXF1aXJlIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxj
LGYsZCxwLGgsbSx2LGIsZyx5LF8sdyx4LGssQyxFLE8sVCxOLFMsQSxQLGosUil7InVzZSBzdHJp
Y3QiO2Z1bmN0aW9uIEwoZSx0KXtyZXR1cm4gZS5yYXc9dCxlfWZ1bmN0aW9uIEQoKXtVPSExLFc9
ITF9ZnVuY3Rpb24gTShlKXtlLm9wdGlvbnNGb3JUeXBlKCJjb21wb25lbnQiLHtzaW5nbGV0b246
ITF9KSxlLm9wdGlvbnNGb3JUeXBlKCJ2aWV3Iix7c2luZ2xldG9uOiExfSksZS5pbmplY3Rpb24o
InJlbmRlcmVyIiwiZG9tIiwic2VydmljZTotZG9tLWhlbHBlciIpLGUucmVnaXN0ZXIoImNvbnRy
b2xsZXI6YmFzaWMiLGEuZGVmYXVsdCx7aW5zdGFudGlhdGU6ITF9KSxlLmluamVjdGlvbigic2Vy
dmljZTotZG9tLWhlbHBlciIsImRvY3VtZW50Iiwic2VydmljZTotZG9jdW1lbnQiKSxlLnJlZ2lz
dGVyKCItdmlldy1yZWdpc3RyeTptYWluIix7Y3JlYXRlOmZ1bmN0aW9uKCl7cmV0dXJue319fSks
ZS5pbmplY3Rpb24oInZpZXciLCJfdmlld1JlZ2lzdHJ5IiwiLXZpZXctcmVnaXN0cnk6bWFpbiIp
LGUuaW5qZWN0aW9uKCJyb3V0ZSIsIl90b3BMZXZlbFZpZXdUZW1wbGF0ZSIsInRlbXBsYXRlOi1v
dXRsZXQiKSxlLnJlZ2lzdGVyKCJyb3V0ZTpiYXNpYyIsaC5kZWZhdWx0KSxlLnJlZ2lzdGVyKCJl
dmVudF9kaXNwYXRjaGVyOm1haW4iLGQuZGVmYXVsdCksZS5pbmplY3Rpb24oInJvdXRlcjptYWlu
IiwibmFtZXNwYWNlIiwiYXBwbGljYXRpb246bWFpbiIpLGUuaW5qZWN0aW9uKCJ2aWV3Oi1vdXRs
ZXQiLCJuYW1lc3BhY2UiLCJhcHBsaWNhdGlvbjptYWluIiksZS5yZWdpc3RlcigibG9jYXRpb246
YXV0byIsZy5kZWZhdWx0KSxlLnJlZ2lzdGVyKCJsb2NhdGlvbjpoYXNoIix2LmRlZmF1bHQpLGUu
cmVnaXN0ZXIoImxvY2F0aW9uOmhpc3RvcnkiLGIuZGVmYXVsdCksZS5yZWdpc3RlcigibG9jYXRp
b246bm9uZSIseS5kZWZhdWx0KSxlLmluamVjdGlvbigiY29udHJvbGxlciIsInRhcmdldCIsInJv
dXRlcjptYWluIiksZS5pbmplY3Rpb24oImNvbnRyb2xsZXIiLCJuYW1lc3BhY2UiLCJhcHBsaWNh
dGlvbjptYWluIiksZS5yZWdpc3RlcihTLnByaXZhdGl6ZShxKSxfLmRlZmF1bHQpLGUuaW5qZWN0
aW9uKCJyb3V0ZXIiLCJfYnVja2V0Q2FjaGUiLFMucHJpdmF0aXplKHEpKSxlLmluamVjdGlvbigi
cm91dGUiLCJfYnVja2V0Q2FjaGUiLFMucHJpdmF0aXplKHEpKSxlLmluamVjdGlvbigiY29udHJv
bGxlciIsIl9idWNrZXRDYWNoZSIsUy5wcml2YXRpemUocSkpLGUuaW5qZWN0aW9uKCJyb3V0ZSIs
InJvdXRlciIsInJvdXRlcjptYWluIiksZS5yZWdpc3RlcigiY29tcG9uZW50Oi10ZXh0LWZpZWxk
Iix4LmRlZmF1bHQpLGUucmVnaXN0ZXIoImNvbXBvbmVudDotdGV4dC1hcmVhIixrLmRlZmF1bHQp
LGUucmVnaXN0ZXIoImNvbXBvbmVudDotY2hlY2tib3giLEMuZGVmYXVsdCksZS5yZWdpc3Rlcigi
Y29tcG9uZW50OmxpbmstdG8iLEUuZGVmYXVsdCksZS5yZWdpc3Rlcigic2VydmljZTotcm91dGlu
ZyIsTy5kZWZhdWx0KSxlLmluamVjdGlvbigic2VydmljZTotcm91dGluZyIsInJvdXRlciIsInJv
dXRlcjptYWluIiksZS5yZWdpc3RlcigicmVzb2x2ZXItZm9yLWRlYnVnZ2luZzptYWluIixlLnJl
c29sdmVyLHtpbnN0YW50aWF0ZTohMX0pLGUuaW5qZWN0aW9uKCJjb250YWluZXItZGVidWctYWRh
cHRlcjptYWluIiwicmVzb2x2ZXIiLCJyZXNvbHZlci1mb3ItZGVidWdnaW5nOm1haW4iKSxlLmlu
amVjdGlvbigiZGF0YS1hZGFwdGVyOm1haW4iLCJjb250YWluZXJEZWJ1Z0FkYXB0ZXIiLCJjb250
YWluZXItZGVidWctYWRhcHRlcjptYWluIiksZS5yZWdpc3RlcigiY29udGFpbmVyLWRlYnVnLWFk
YXB0ZXI6bWFpbiIsVC5kZWZhdWx0KX1mdW5jdGlvbiBJKGUpe00oZSk7dmFyIHQ9Ui5kZWZhdWx0
KCJlbWJlci1nbGltbWVyL2Vudmlyb25tZW50IikuZGVmYXVsdDtlLnJlZ2lzdGVyKCJzZXJ2aWNl
Oi1nbGltbWVyLWVudmlyb25tZW50Iix0KSxlLmluamVjdGlvbigic2VydmljZTotZ2xpbW1lci1l
bnZpcm9ubWVudCIsImRvbSIsInNlcnZpY2U6LWRvbS1oZWxwZXIiKSxlLmluamVjdGlvbigicmVu
ZGVyZXIiLCJlbnYiLCJzZXJ2aWNlOi1nbGltbWVyLWVudmlyb25tZW50Iik7dmFyIHI9Ui5kZWZh
dWx0KCJlbWJlci1nbGltbWVyL2VtYmVyLXJvdXRpbmctdmlldyIpLk91dGxldFZpZXc7ZS5yZWdp
c3Rlcigidmlldzotb3V0bGV0IixyKTt2YXIgbj1SLmRlZmF1bHQoImVtYmVyLWdsaW1tZXIvZW1i
ZXItbWV0YWwtdmlld3MiKSxpPW4uSW50ZXJhY3RpdmVSZW5kZXJlcixvPW4uSW5lcnRSZW5kZXJl
cjtlLnJlZ2lzdGVyKCJyZW5kZXJlcjotZG9tIixpKSxlLnJlZ2lzdGVyKCJyZW5kZXJlcjotaW5l
cnQiLG8pO3ZhciBhPVIuZGVmYXVsdCgiZW1iZXItZ2xpbW1lci9kb20iKS5kZWZhdWx0O2UucmVn
aXN0ZXIoInNlcnZpY2U6LWRvbS1oZWxwZXIiLHtjcmVhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5k
b2N1bWVudDtyZXR1cm4gbmV3IGEodCl9fSk7dmFyIHM9Ui5kZWZhdWx0KCJlbWJlci1nbGltbWVy
L3RlbXBsYXRlcy9vdXRsZXQiKS5kZWZhdWx0LHU9Ui5kZWZhdWx0KCJlbWJlci1nbGltbWVyL3Rl
bXBsYXRlcy9jb21wb25lbnQiKS5kZWZhdWx0O2UucmVnaXN0ZXIoUy5wcml2YXRpemUoeiksdSks
ZS5yZWdpc3RlcigidGVtcGxhdGU6LW91dGxldCIscyksZS5pbmplY3Rpb24oInZpZXc6LW91dGxl
dCIsInRlbXBsYXRlIiwidGVtcGxhdGU6LW91dGxldCIpLGUuaW5qZWN0aW9uKCJ0ZW1wbGF0ZSIs
ImVudiIsInNlcnZpY2U6LWdsaW1tZXItZW52aXJvbm1lbnQiKSxlLm9wdGlvbnNGb3JUeXBlKCJo
ZWxwZXIiLHtpbnN0YW50aWF0ZTohMX0pfWZ1bmN0aW9uIEYoZSl7TShlKSxlLm9wdGlvbnNGb3JU
eXBlKCJ0ZW1wbGF0ZSIse2luc3RhbnRpYXRlOiExfSksZS5yZWdpc3Rlcigidmlldzotb3V0bGV0
IixjLk91dGxldFZpZXcpO3ZhciB0PXUuSW50ZXJhY3RpdmVSZW5kZXJlcixyPXUuSW5lcnRSZW5k
ZXJlcjtlLnJlZ2lzdGVyKCJyZW5kZXJlcjotZG9tIix0KSxlLnJlZ2lzdGVyKCJyZW5kZXJlcjot
aW5lcnQiLHIpLGUucmVnaXN0ZXIoInNlcnZpY2U6LWRvbS1oZWxwZXIiLHtjcmVhdGU6ZnVuY3Rp
b24oZSl7dmFyIHQ9ZS5kb2N1bWVudDtyZXR1cm4gbmV3IHMuZGVmYXVsdCh0KX19KSxlLnJlZ2lz
dGVyKCJ0ZW1wbGF0ZTotb3V0bGV0IixsLmRlZmF1bHQpLGUucmVnaXN0ZXIoInZpZXc6dG9wbGV2
ZWwiLGYuZGVmYXVsdC5leHRlbmQoKSl9ZnVuY3Rpb24gSCgpe0J8fChCPSEwLEEuZGVmYXVsdC5o
YXNET00mJnQuZGVmYXVsdC5saWJyYXJpZXMucmVnaXN0ZXJDb3JlTGlicmFyeSgialF1ZXJ5Iixw
LmRlZmF1bHQoKS5qcXVlcnkpKX1mdW5jdGlvbiBWKCl7aWYodC5kZWZhdWx0LkxPR19WRVJTSU9O
KXt0LmRlZmF1bHQuTE9HX1ZFUlNJT049ITE7Zm9yKHZhciBlPXQuZGVmYXVsdC5saWJyYXJpZXMu
X3JlZ2lzdHJ5LHI9ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4uZ2V0KGUsIm5hbWUubGVuZ3Ro
Iil9KSxpPU1hdGgubWF4LmFwcGx5KHRoaXMsciksbz0wLGE9ZS5sZW5ndGg7bzxhO28rKyl7dmFy
IHM9ZVtvXTtuZXcgQXJyYXkoaS1zLm5hbWUubGVuZ3RoKzEpLmpvaW4oIiAiKX19fWUuX3Jlc2V0
TGVnYWN5QWRkb25XYXJuaW5ncz1EO3ZhciBxPUwoWyItYnVja2V0LWNhY2hlOm1haW4iXSxbIi1i
dWNrZXQtY2FjaGU6bWFpbiJdKSx6PUwoWyJ0ZW1wbGF0ZTpjb21wb25lbnRzLy1kZWZhdWx0Il0s
WyJ0ZW1wbGF0ZTpjb21wb25lbnRzLy1kZWZhdWx0Il0pLEI9ITEsVT0hMSxXPSExLCQ9ai5kZWZh
dWx0LmV4dGVuZCh7X3N1cHByZXNzRGVmZXJyZWREZXByZWNhdGlvbjohMCxyb290RWxlbWVudDoi
Ym9keSIsZXZlbnREaXNwYXRjaGVyOm51bGwsY3VzdG9tRXZlbnRzOm51bGwsYXV0b2Jvb3Q6ITAs
X2dsb2JhbHNNb2RlOiEwLGluaXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxh
cmd1bWVudHMpLHRoaXMuJHx8KHRoaXMuJD1wLmRlZmF1bHQpLEgoKSxWKCksdGhpcy5fcmVhZGlu
ZXNzRGVmZXJyYWxzPTEsdGhpcy5fYm9vdGVkPSExLHRoaXMuYXV0b2Jvb3Q9dGhpcy5fZ2xvYmFs
c01vZGU9ISF0aGlzLmF1dG9ib290LHRoaXMuX2dsb2JhbHNNb2RlJiZ0aGlzLl9wcmVwYXJlRm9y
R2xvYmFsc01vZGUoKSx0aGlzLmF1dG9ib290JiZ0aGlzLndhaXRGb3JET01SZWFkeSgpfSxidWls
ZEluc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDw9MHx8dm9pZCAwPT09
YXJndW1lbnRzWzBdP3t9OmFyZ3VtZW50c1swXTtyZXR1cm4gZS5iYXNlPXRoaXMsZS5hcHBsaWNh
dGlvbj10aGlzLHcuZGVmYXVsdC5jcmVhdGUoZSl9LF9wcmVwYXJlRm9yR2xvYmFsc01vZGU6ZnVu
Y3Rpb24oKXt0aGlzLlJvdXRlcj0odGhpcy5Sb3V0ZXJ8fG0uZGVmYXVsdCkuZXh0ZW5kKCksdGhp
cy5fYnVpbGREZXByZWNhdGVkSW5zdGFuY2UoKX0sX2J1aWxkRGVwcmVjYXRlZEluc3RhbmNlOmZ1
bmN0aW9uKCl7dmFyIGU9dGhpcy5idWlsZEluc3RhbmNlKCk7dGhpcy5fX2RlcHJlY2F0ZWRJbnN0
YW5jZV9fPWUsdGhpcy5fX2NvbnRhaW5lcl9fPWUuX19jb250YWluZXJfXyxmLmRlZmF1bHQudmll
d3M9ZS5sb29rdXAoIi12aWV3LXJlZ2lzdHJ5Om1haW4iKX0sd2FpdEZvckRPTVJlYWR5OmZ1bmN0
aW9uKCl7IXRoaXMuJHx8dGhpcy4kLmlzUmVhZHk/by5kZWZhdWx0LnNjaGVkdWxlKCJhY3Rpb25z
Iix0aGlzLCJkb21SZWFkeSIpOnRoaXMuJCgpLnJlYWR5KG8uZGVmYXVsdC5iaW5kKHRoaXMsImRv
bVJlYWR5IikpfSxkb21SZWFkeTpmdW5jdGlvbigpe3RoaXMuaXNEZXN0cm95ZWR8fHRoaXMuX2Jv
b3RTeW5jKCl9LGRlZmVyUmVhZGluZXNzOmZ1bmN0aW9uKCl7dGhpcy5fcmVhZGluZXNzRGVmZXJy
YWxzKyt9LGFkdmFuY2VSZWFkaW5lc3M6ZnVuY3Rpb24oKXt0aGlzLl9yZWFkaW5lc3NEZWZlcnJh
bHMtLSwwPT09dGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzJiZvLmRlZmF1bHQub25jZSh0aGlzLHRo
aXMuZGlkQmVjb21lUmVhZHkpfSxib290OmZ1bmN0aW9uKCl7aWYodGhpcy5fYm9vdFByb21pc2Up
cmV0dXJuIHRoaXMuX2Jvb3RQcm9taXNlO3RyeXt0aGlzLl9ib290U3luYygpfWNhdGNoKGUpe31y
ZXR1cm4gdGhpcy5fYm9vdFByb21pc2V9LF9ib290U3luYzpmdW5jdGlvbigpe2lmKCF0aGlzLl9i
b290ZWQpe3QuZGVmYXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfVklFV19TVVBQT1JUJiYhVSYmKFU9
ITApLHQuZGVmYXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfQ09OVFJPTExFUl9TVVBQT1JUJiYhVyYm
KFc9ITApO3ZhciBlPXRoaXMuX2Jvb3RSZXNvbHZlcj1uZXcgUC5kZWZhdWx0LmRlZmVyO3RoaXMu
X2Jvb3RQcm9taXNlPWUucHJvbWlzZTt0cnl7dGhpcy5ydW5Jbml0aWFsaXplcnMoKSxpLnJ1bkxv
YWRIb29rcygiYXBwbGljYXRpb24iLHRoaXMpLHRoaXMuYWR2YW5jZVJlYWRpbmVzcygpfWNhdGNo
KHQpe3Rocm93IGUucmVqZWN0KHQpLHR9fX0scmVzZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7
by5kZWZhdWx0KHQsImRlc3Ryb3kiKSx0aGlzLl9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZSgpLG8u
ZGVmYXVsdC5zY2hlZHVsZSgiYWN0aW9ucyIsdGhpcywiX2Jvb3RTeW5jIil9dmFyIHQ9dGhpcy5f
X2RlcHJlY2F0ZWRJbnN0YW5jZV9fO3RoaXMuX3JlYWRpbmVzc0RlZmVycmFscz0xLHRoaXMuX2Jv
b3RQcm9taXNlPW51bGwsdGhpcy5fYm9vdFJlc29sdmVyPW51bGwsdGhpcy5fYm9vdGVkPSExLG8u
ZGVmYXVsdC5qb2luKHRoaXMsZSl9LGRpZEJlY29tZVJlYWR5OmZ1bmN0aW9uKCl7dHJ5e2lmKHQu
ZGVmYXVsdC50ZXN0aW5nfHwodC5kZWZhdWx0Lk5hbWVzcGFjZS5wcm9jZXNzQWxsKCksdC5kZWZh
dWx0LkJPT1RFRD0hMCksdGhpcy5hdXRvYm9vdCl7dmFyIGU9dm9pZCAwO2U9dGhpcy5fZ2xvYmFs
c01vZGU/dGhpcy5fX2RlcHJlY2F0ZWRJbnN0YW5jZV9fOnRoaXMuYnVpbGRJbnN0YW5jZSgpLGUu
X2Jvb3RTeW5jKCksdGhpcy5yZWFkeSgpLGUuc3RhcnRSb3V0aW5nKCl9dGhpcy5fYm9vdFJlc29s
dmVyLnJlc29sdmUodGhpcyksdGhpcy5fYm9vdGVkPSEwfWNhdGNoKGUpe3Rocm93IHRoaXMuX2Jv
b3RSZXNvbHZlci5yZWplY3QoZSksZX19LHJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHdp
bGxEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQu
ZGVmYXVsdC5CT09URUQ9ITEsdGhpcy5fYm9vdGVkPSExLHRoaXMuX2Jvb3RQcm9taXNlPW51bGws
dGhpcy5fYm9vdFJlc29sdmVyPW51bGwsaS5fbG9hZGVkLmFwcGxpY2F0aW9uPT09dGhpcyYmKGku
X2xvYWRlZC5hcHBsaWNhdGlvbj12b2lkIDApLHRoaXMuX2dsb2JhbHNNb2RlJiZ0aGlzLl9fZGVw
cmVjYXRlZEluc3RhbmNlX18mJnRoaXMuX19kZXByZWNhdGVkSW5zdGFuY2VfXy5kZXN0cm95KCl9
LHZpc2l0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyZXR1cm4gdGhpcy5ib290KCkudGhlbihm
dW5jdGlvbigpe3JldHVybiByLmJ1aWxkSW5zdGFuY2UoKS5ib290KHQpLnRoZW4oZnVuY3Rpb24o
dCl7cmV0dXJuIHQudmlzaXQoZSl9KX0pfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkLnByb3Rv
dHlwZSwicmVnaXN0cnkiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rp
b24oKXtyZXR1cm4gTi5idWlsZEZha2VSZWdpc3RyeVdpdGhEZXByZWNhdGlvbnModGhpcywiQXBw
bGljYXRpb24iKX19KSwkLnJlb3BlbkNsYXNzKHtidWlsZFJlZ2lzdHJ5OmZ1bmN0aW9uKGUpe3Zh
ciB0PWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3VtZW50c1sxXT97fTphcmd1bWVu
dHNbMV0scj10aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHIucmVnaXN0
ZXIoImFwcGxpY2F0aW9uOm1haW4iLGUse2luc3RhbnRpYXRlOiExfSksdFtqLkdMSU1NRVJdP0ko
cik6RihyKSxyfX0pLGUuZGVmYXVsdD0kfSksZSgiZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2Vu
Z2luZS1pbnN0YW5jZSIsWyJleHBvcnRzIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0Iiwi
Y29udGFpbmVyL3JlZ2lzdHJ5IiwiZW1iZXItcnVudGltZS9taXhpbnMvY29udGFpbmVyX3Byb3h5
IiwiZW1iZXItcnVudGltZS9taXhpbnMvcmVnaXN0cnlfcHJveHkiLCJlbWJlci1tZXRhbC9ydW5f
bG9vcCJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNlIHN0cmljdCI7dmFyIGE9dC5kZWZhdWx0
LmV4dGVuZChpLmRlZmF1bHQsbi5kZWZhdWx0LHtiYXNlOm51bGwsaW5pdDpmdW5jdGlvbigpe3Ro
aXMuX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT10aGlzLmJhc2U7ZXx8KGU9dGhp
cy5hcHBsaWNhdGlvbix0aGlzLmJhc2U9ZSk7dmFyIHQ9dGhpcy5fX3JlZ2lzdHJ5X189bmV3IHIu
ZGVmYXVsdCh7ZmFsbGJhY2s6ZS5fX3JlZ2lzdHJ5X199KTt0aGlzLl9fY29udGFpbmVyX189dC5j
b250YWluZXIoe293bmVyOnRoaXN9KX0sdW5yZWdpc3RlcjpmdW5jdGlvbihlKXt0aGlzLl9fY29u
dGFpbmVyX18ucmVzZXQoZSksdGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx3aWxs
RGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvLmRl
ZmF1bHQodGhpcy5fX2NvbnRhaW5lcl9fLCJkZXN0cm95Iil9fSk7ZS5kZWZhdWx0PWF9KSxlKCJl
bWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vZW5naW5lIixbImV4cG9ydHMiLCJlbWJlci1ydW50aW1l
L3N5c3RlbS9uYW1lc3BhY2UiLCJjb250YWluZXIvcmVnaXN0cnkiLCJlbWJlci1ydW50aW1lL21p
eGlucy9yZWdpc3RyeV9wcm94eSIsImRhZy1tYXAiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQi
LCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1l
dGFsL3V0aWxzIiwiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwiZW1iZXItYXBwbGljYXRpb24v
c3lzdGVtL3Jlc29sdmVyIiwiZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZS1pbnN0YW5j
ZSIsImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwiZW1iZXItbWV0YWwvc3ltYm9sIl0sZnVuY3Rpb24o
ZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaChlKXt2
YXIgdD1bXTtmb3IodmFyIHIgaW4gZSl0LnB1c2gocik7cmV0dXJuIHR9ZnVuY3Rpb24gbShlKXt2
YXIgdD1lLmdldCgiUmVzb2x2ZXIiKXx8Yy5kZWZhdWx0O3JldHVybiB0LmNyZWF0ZSh7bmFtZXNw
YWNlOmV9KX1mdW5jdGlvbiB2KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXRo
aXMuc3VwZXJjbGFzc1tlXSYmdGhpcy5zdXBlcmNsYXNzW2VdPT09dGhpc1tlXSl7dmFyIHI9e307
cltlXT1PYmplY3QuY3JlYXRlKHRoaXNbZV0pLHRoaXMucmVvcGVuQ2xhc3Mocil9dGhpc1tlXVt0
Lm5hbWVdPXR9fXZhciBiPXAuZGVmYXVsdCgiR0xJTU1FUiIpO2UuR0xJTU1FUj1iO3ZhciBnPXQu
ZGVmYXVsdC5leHRlbmQobi5kZWZhdWx0LHtpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIuYXBw
bHkodGhpcyxhcmd1bWVudHMpLHZvaWQgMD09PXRoaXNbYl0mJih0aGlzW2JdPWQuZGVmYXVsdCgi
ZW1iZXItZ2xpbW1lciIpKSx0aGlzLmJ1aWxkUmVnaXN0cnkoKX0sYnVpbGRJbnN0YW5jZTpmdW5j
dGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97
fTphcmd1bWVudHNbMF07cmV0dXJuIGUuYmFzZT10aGlzLGYuZGVmYXVsdC5jcmVhdGUoZSl9LGJ1
aWxkUmVnaXN0cnk6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuX19yZWdpc3RyeV9fPXRoaXMuY29u
c3RydWN0b3IuYnVpbGRSZWdpc3RyeSh0aGlzLChlPXt9LGVbYl09dGhpc1tiXSxlKSk7cmV0dXJu
IHR9LGluaXRpYWxpemVyOmZ1bmN0aW9uKGUpe3RoaXMuY29uc3RydWN0b3IuaW5pdGlhbGl6ZXIo
ZSl9LGluc3RhbmNlSW5pdGlhbGl6ZXI6ZnVuY3Rpb24oZSl7dGhpcy5jb25zdHJ1Y3Rvci5pbnN0
YW5jZUluaXRpYWxpemVyKGUpfSxydW5Jbml0aWFsaXplcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlz
O3RoaXMuX3J1bkluaXRpYWxpemVyKCJpbml0aWFsaXplcnMiLGZ1bmN0aW9uKHQscil7Mj09PXIu
aW5pdGlhbGl6ZS5sZW5ndGg/ci5pbml0aWFsaXplKGUuX19yZWdpc3RyeV9fLGUpOnIuaW5pdGlh
bGl6ZShlKX0pfSxydW5JbnN0YW5jZUluaXRpYWxpemVyczpmdW5jdGlvbihlKXt0aGlzLl9ydW5J
bml0aWFsaXplcigiaW5zdGFuY2VJbml0aWFsaXplcnMiLGZ1bmN0aW9uKHQscil7ci5pbml0aWFs
aXplKGUpfSl9LF9ydW5Jbml0aWFsaXplcjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuPW8uZ2V0
KHRoaXMuY29uc3RydWN0b3IsZSksYT1oKG4pLHM9bmV3IGkuZGVmYXVsdCx1PTA7dTxhLmxlbmd0
aDt1Kyspcj1uW2FbdV1dLHMuYWRkRWRnZXMoci5uYW1lLHIsci5iZWZvcmUsci5hZnRlcik7cy50
b3Bzb3J0KGZ1bmN0aW9uKGUpe3QoZS5uYW1lLGUudmFsdWUpfSl9fSk7Zy5yZW9wZW5DbGFzcyh7
aW5pdGlhbGl6ZXJzOm5ldyBsLmRlZmF1bHQsaW5zdGFuY2VJbml0aWFsaXplcnM6bmV3IGwuZGVm
YXVsdCxpbml0aWFsaXplcjp2KCJpbml0aWFsaXplcnMiLCJpbml0aWFsaXplciIpLGluc3RhbmNl
SW5pdGlhbGl6ZXI6digiaW5zdGFuY2VJbml0aWFsaXplcnMiLCJpbnN0YW5jZSBpbml0aWFsaXpl
ciIpLGJ1aWxkUmVnaXN0cnk6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHIuZGVmYXVsdCh7cmVzb2x2
ZXI6bShlKX0pO3JldHVybiB0LnNldD1hLnNldCx0fSxyZXNvbHZlcjpudWxsLFJlc29sdmVyOm51
bGx9KSxlLmRlZmF1bHQ9Z30pLGUoImVtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9yZXNvbHZlciIs
WyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQi
LCJlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmciLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmpl
Y3QiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9uYW1lc3BhY2UiLCJlbWJlci1odG1sYmFycy9oZWxw
ZXJzIiwiZW1iZXItYXBwbGljYXRpb24vdXRpbHMvdmFsaWRhdGUtdHlwZSIsImVtYmVyLW1ldGFs
L2RpY3Rpb25hcnkiLCJlbWJlci1odG1sYmFycy90ZW1wbGF0ZV9yZWdpc3RyeSJdLGZ1bmN0aW9u
KGUsdCxyLG4saSxvLGEscyx1LGwpeyJ1c2Ugc3RyaWN0Ijt2YXIgYz1pLmRlZmF1bHQuZXh0ZW5k
KHtuYW1lc3BhY2U6bnVsbCxub3JtYWxpemU6bnVsbCxyZXNvbHZlOm51bGwscGFyc2VOYW1lOm51
bGwsbG9va3VwRGVzY3JpcHRpb246bnVsbCxtYWtlVG9TdHJpbmc6bnVsbCxyZXNvbHZlT3RoZXI6
bnVsbCxfbG9nTG9va3VwOm51bGx9KTtlLlJlc29sdmVyPWMsZS5kZWZhdWx0PWkuZGVmYXVsdC5l
eHRlbmQoe25hbWVzcGFjZTpudWxsLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9wYXJzZU5hbWVDYWNo
ZT11LmRlZmF1bHQobnVsbCl9LG5vcm1hbGl6ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCI6
IiwyKSxyPXRbMF0sbj10WzFdO2lmKCJ0ZW1wbGF0ZSIhPT1yKXt2YXIgaT1uO3JldHVybiBpLmlu
ZGV4T2YoIi4iKT4tMSYmKGk9aS5yZXBsYWNlKC9cLiguKS9nLGZ1bmN0aW9uKGUpe3JldHVybiBl
LmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpfSkpLG4uaW5kZXhPZigiXyIpPi0xJiYoaT1pLnJlcGxh
Y2UoL18oLikvZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKX0p
KSxuLmluZGV4T2YoIi0iKT4tMSYmKGk9aS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oZSl7cmV0
dXJuIGUuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCl9KSkscisiOiIraX1yZXR1cm4gZX0scmVzb2x2
ZTpmdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMucGFyc2VOYW1lKGUpLG49ci5yZXNvbHZlTWV0aG9k
TmFtZTtyZXR1cm4gdGhpc1tuXSYmKHQ9dGhpc1tuXShyKSksdD10fHx0aGlzLnJlc29sdmVPdGhl
cihyKSxyLnJvb3QmJnIucm9vdC5MT0dfUkVTT0xWRVImJnRoaXMuX2xvZ0xvb2t1cCh0LHIpLHQm
JnMuZGVmYXVsdCh0LHIpLHR9LHBhcnNlTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGFy
c2VOYW1lQ2FjaGVbZV18fCh0aGlzLl9wYXJzZU5hbWVDYWNoZVtlXT10aGlzLl9wYXJzZU5hbWUo
ZSkpfSxfcGFyc2VOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIjoiKSxpPXRbMF0sYT10
WzFdLHM9YSx1PXIuZ2V0KHRoaXMsIm5hbWVzcGFjZSIpLGw9dSxjPXMubGFzdEluZGV4T2YoIi8i
KSxmPWMhPT0tMT9zLnNsaWNlKDAsYyk6bnVsbDtpZigidGVtcGxhdGUiIT09aSYmYyE9PS0xKXt2
YXIgZD1zLnNwbGl0KCIvIik7cz1kW2QubGVuZ3RoLTFdO3ZhciBwPW4uY2FwaXRhbGl6ZShkLnNs
aWNlKDAsLTEpLmpvaW4oIi4iKSk7bD1vLmRlZmF1bHQuYnlOYW1lKHApfXZhciBoPSJtYWluIj09
PWE/Ik1haW4iOm4uY2xhc3NpZnkoaSk7aWYoIXN8fCFpKXRocm93IG5ldyBUeXBlRXJyb3IoIklu
dmFsaWQgZnVsbE5hbWU6IGAiK2UrImAsIG11c3QgYmUgb2YgdGhlIGZvcm0gYHR5cGU6bmFtZWAg
Iik7cmV0dXJue2Z1bGxOYW1lOmUsdHlwZTppLGZ1bGxOYW1lV2l0aG91dFR5cGU6YSxkaXJuYW1l
OmYsbmFtZTpzLHJvb3Q6bCxyZXNvbHZlTWV0aG9kTmFtZToicmVzb2x2ZSIraH19LGxvb2t1cERl
c2NyaXB0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0LHI9dGhpcy5wYXJzZU5hbWUoZSk7cmV0dXJuInRl
bXBsYXRlIj09PXIudHlwZT8idGVtcGxhdGUgYXQgIityLmZ1bGxOYW1lV2l0aG91dFR5cGUucmVw
bGFjZSgvXC4vZywiLyIpOih0PXIucm9vdCsiLiIrbi5jbGFzc2lmeShyLm5hbWUpLnJlcGxhY2Uo
L1wuL2csIiIpLCJtb2RlbCIhPT1yLnR5cGUmJih0Kz1uLmNsYXNzaWZ5KHIudHlwZSkpLHQpfSxt
YWtlVG9TdHJpbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b1N0cmluZygpfSx1c2VSb3V0ZXJO
YW1pbmc6ZnVuY3Rpb24oZSl7ZS5uYW1lPWUubmFtZS5yZXBsYWNlKC9cLi9nLCJfIiksImJhc2lj
Ij09PWUubmFtZSYmKGUubmFtZT0iIil9LHJlc29sdmVUZW1wbGF0ZTpmdW5jdGlvbihlKXt2YXIg
dD1lLmZ1bGxOYW1lV2l0aG91dFR5cGUucmVwbGFjZSgvXC4vZywiLyIpO3JldHVybiBsLmdldCh0
KXx8bC5nZXQobi5kZWNhbWVsaXplKHQpKX0scmVzb2x2ZVZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJu
IHRoaXMudXNlUm91dGVyTmFtaW5nKGUpLHRoaXMucmVzb2x2ZU90aGVyKGUpfSxyZXNvbHZlQ29u
dHJvbGxlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51c2VSb3V0ZXJOYW1pbmcoZSksdGhpcy5y
ZXNvbHZlT3RoZXIoZSl9LHJlc29sdmVSb3V0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51c2VS
b3V0ZXJOYW1pbmcoZSksdGhpcy5yZXNvbHZlT3RoZXIoZSl9LHJlc29sdmVNb2RlbDpmdW5jdGlv
bihlKXt2YXIgdD1uLmNsYXNzaWZ5KGUubmFtZSksaT1yLmdldChlLnJvb3QsdCk7aWYoaSlyZXR1
cm4gaX0scmVzb2x2ZUhlbHBlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIo
ZSl8fGEuZGVmYXVsdFtlLmZ1bGxOYW1lV2l0aG91dFR5cGVdfSxyZXNvbHZlT3RoZXI6ZnVuY3Rp
b24oZSl7dmFyIHQ9bi5jbGFzc2lmeShlLm5hbWUpK24uY2xhc3NpZnkoZS50eXBlKSxpPXIuZ2V0
KGUucm9vdCx0KTtpZihpKXJldHVybiBpfSxyZXNvbHZlTWFpbjpmdW5jdGlvbihlKXt2YXIgdD1u
LmNsYXNzaWZ5KGUudHlwZSk7cmV0dXJuIHIuZ2V0KGUucm9vdCx0KX0sX2xvZ0xvb2t1cDpmdW5j
dGlvbihlLHQpe3ZhciByLG47cj1lPyJb4pyTXSI6IlsgXSIsbj10LmZ1bGxOYW1lLmxlbmd0aD42
MD8iLiI6bmV3IEFycmF5KDYwLXQuZnVsbE5hbWUubGVuZ3RoKS5qb2luKCIuIil9LGtub3duRm9y
VHlwZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ci5nZXQodGhpcywibmFtZXNwYWNlIiksaT1uLmNs
YXNzaWZ5KGUpLG89bmV3IFJlZ0V4cChpKyIkIiksYT11LmRlZmF1bHQobnVsbCkscz1PYmplY3Qu
a2V5cyh0KSxsPTAsYz1zLmxlbmd0aDtsPGM7bCsrKXt2YXIgZj1zW2xdO2lmKG8udGVzdChmKSl7
dmFyIGQ9dGhpcy50cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKGUsZik7YVtkXT0hMH19cmV0
dXJuIGF9LHRyYW5zbGF0ZVRvQ29udGFpbmVyRnVsbG5hbWU6ZnVuY3Rpb24oZSx0KXt2YXIgcj1u
LmNsYXNzaWZ5KGUpLGk9dC5zbGljZSgwLHIubGVuZ3RoKi0xKSxvPW4uZGFzaGVyaXplKGkpO3Jl
dHVybiBlKyI6IitvfX0pfSksZSgiZW1iZXItYXBwbGljYXRpb24vdXRpbHMvdmFsaWRhdGUtdHlw
ZSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3Ry
aWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIHI9blt0LnR5cGVdO2lmKHIpe3JbMF0sclsxXSxyWzJd
fX1lLmRlZmF1bHQ9cjt2YXIgbj17cm91dGU6WyJhc3NlcnQiLCJpc1JvdXRlRmFjdG9yeSIsIkVt
YmVyLlJvdXRlIl0sY29tcG9uZW50OlsiZGVwcmVjYXRlIiwiaXNDb21wb25lbnRGYWN0b3J5Iiwi
RW1iZXIuQ29tcG9uZW50Il0sdmlldzpbImRlcHJlY2F0ZSIsImlzVmlld0ZhY3RvcnkiLCJFbWJl
ci5WaWV3Il0sc2VydmljZTpbImRlcHJlY2F0ZSIsImlzU2VydmljZUZhY3RvcnkiLCJFbWJlci5T
ZXJ2aWNlIl19fSksZSgiZW1iZXItZXh0ZW5zaW9uLXN1cHBvcnQvY29udGFpbmVyX2RlYnVnX2Fk
YXB0ZXIiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1ydW50aW1lL3N5c3Rl
bS9uYXRpdmVfYXJyYXkiLCJlbWJlci1ydW50aW1lL3V0aWxzIiwiZW1iZXItcnVudGltZS9zeXN0
ZW0vc3RyaW5nIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlIiwiZW1iZXItcnVudGlt
ZS9zeXN0ZW0vb2JqZWN0Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSl7InVzZSBzdHJpY3QiO2Uu
ZGVmYXVsdD1hLmRlZmF1bHQuZXh0ZW5kKHtyZXNvbHZlcjpudWxsLGNhbkNhdGFsb2dFbnRyaWVz
QnlUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiJtb2RlbCIhPT1lJiYidGVtcGxhdGUiIT09ZX0sY2F0
YWxvZ0VudHJpZXNCeVR5cGU6ZnVuY3Rpb24oZSl7dmFyIGE9ci5BKG8uZGVmYXVsdC5OQU1FU1BB
Q0VTKSxzPXIuQSgpLHU9bmV3IFJlZ0V4cChpLmNsYXNzaWZ5KGUpKyIkIik7cmV0dXJuIGEuZm9y
RWFjaChmdW5jdGlvbihlKXtpZihlIT09dC5kZWZhdWx0KWZvcih2YXIgciBpbiBlKWlmKGUuaGFz
T3duUHJvcGVydHkocikmJnUudGVzdChyKSl7dmFyIG89ZVtyXTsiY2xhc3MiPT09bi50eXBlT2Yo
bykmJnMucHVzaChpLmRhc2hlcml6ZShyLnJlcGxhY2UodSwiIikpKX19KSxzfX0pfSksZSgiZW1i
ZXItZXh0ZW5zaW9uLXN1cHBvcnQvZGF0YV9hZGFwdGVyIixbImV4cG9ydHMiLCJlbWJlci1tZXRh
bC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9ydW5fbG9vcCIsImVtYmVyLXJ1bnRpbWUvc3lz
dGVtL3N0cmluZyIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL25hbWVzcGFjZSIsImVtYmVyLXJ1bnRp
bWUvc3lzdGVtL29iamVjdCIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2ZV9hcnJheSIsImVt
YmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBsaWNhdGlvbiIsImNvbnRhaW5lci9vd25lciIsImVt
YmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCl7
InVzZSBzdHJpY3QiO2UuZGVmYXVsdD1vLmRlZmF1bHQuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKCl7
dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVsZWFzZU1ldGhvZHM9YS5B
KCl9LGNvbnRhaW5lckRlYnVnQWRhcHRlcjp2b2lkIDAsYXR0cmlidXRlTGltaXQ6MyxhY2NlcHRz
TW9kZWxOYW1lOiEwLHJlbGVhc2VNZXRob2RzOmEuQSgpLGdldEZpbHRlcnM6ZnVuY3Rpb24oKXty
ZXR1cm4gYS5BKCl9LHdhdGNoTW9kZWxUeXBlczpmdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcyxp
PXRoaXMuZ2V0TW9kZWxUeXBlcygpLG89YS5BKCk7cj1pLm1hcChmdW5jdGlvbihlKXt2YXIgcj1l
LmtsYXNzLGk9bi53cmFwTW9kZWxUeXBlKHIsZS5uYW1lKTtyZXR1cm4gby5wdXNoKG4ub2JzZXJ2
ZU1vZGVsVHlwZShlLm5hbWUsdCkpLGl9KSxlKHIpO3ZhciBzPWZ1bmN0aW9uKCl7by5mb3JFYWNo
KGZ1bmN0aW9uKGUpe3JldHVybiBlKCl9KSxuLnJlbGVhc2VNZXRob2RzLnJlbW92ZU9iamVjdChz
KX07cmV0dXJuIHRoaXMucmVsZWFzZU1ldGhvZHMucHVzaE9iamVjdChzKSxzfSxfbmFtZVRvQ2xh
c3M6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmdldE93bmVyKHRo
aXMpLl9sb29rdXBGYWN0b3J5KCJtb2RlbDoiK2UpKSxlfSx3YXRjaFJlY29yZHM6ZnVuY3Rpb24o
ZSx0LHIsbil7dmFyIGksbz10aGlzLHM9YS5BKCksdT10aGlzLl9uYW1lVG9DbGFzcyhlKSxjPXRo
aXMuZ2V0UmVjb3Jkcyh1LGUpLGY9ZnVuY3Rpb24oZSl7cihbZV0pfSxkPWMubWFwKGZ1bmN0aW9u
KGUpe3JldHVybiBzLnB1c2goby5vYnNlcnZlUmVjb3JkKGUsZikpLG8ud3JhcFJlY29yZChlKX0p
LHA9ZnVuY3Rpb24oZSxyLGksYSl7Zm9yKHZhciB1PXI7dTxyK2E7dSsrKXt2YXIgYz1sLm9iamVj
dEF0KGUsdSksZD1vLndyYXBSZWNvcmQoYyk7cy5wdXNoKG8ub2JzZXJ2ZVJlY29yZChjLGYpKSx0
KFtkXSl9aSYmbihyLGkpfSxoPXtkaWRDaGFuZ2U6cCx3aWxsQ2hhbmdlOmZ1bmN0aW9uKCl7cmV0
dXJuIHRoaXN9fTtyZXR1cm4gbC5hZGRBcnJheU9ic2VydmVyKGMsdGhpcyxoKSxpPWZ1bmN0aW9u
KCl7cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UoKX0pLGwucmVtb3ZlQXJyYXlPYnNlcnZlcihjLG8s
aCksby5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QoaSl9LHQoZCksdGhpcy5yZWxlYXNlTWV0
aG9kcy5wdXNoT2JqZWN0KGkpLGl9LHdpbGxEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIu
YXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlv
bihlKXtlKCl9KX0sZGV0ZWN0OmZ1bmN0aW9uKGUpe3JldHVybiExfSxjb2x1bW5zRm9yVHlwZTpm
dW5jdGlvbihlKXtyZXR1cm4gYS5BKCl9LG9ic2VydmVNb2RlbFR5cGU6ZnVuY3Rpb24oZSx0KXt2
YXIgbj10aGlzLGk9dGhpcy5fbmFtZVRvQ2xhc3MoZSksbz10aGlzLmdldFJlY29yZHMoaSxlKSxh
PWZ1bmN0aW9uKCl7dChbbi53cmFwTW9kZWxUeXBlKGksZSldKX0scz17ZGlkQ2hhbmdlOmZ1bmN0
aW9uKCl7ci5kZWZhdWx0LnNjaGVkdWxlT25jZSgiYWN0aW9ucyIsdGhpcyxhKX0sd2lsbENoYW5n
ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfX07bC5hZGRBcnJheU9ic2VydmVyKG8sdGhpcyxzKTt2
YXIgdT1mdW5jdGlvbigpe2wucmVtb3ZlQXJyYXlPYnNlcnZlcihvLG4scyl9O3JldHVybiB1fSx3
cmFwTW9kZWxUeXBlOmZ1bmN0aW9uKGUscil7dmFyIG4saT10aGlzLmdldFJlY29yZHMoZSxyKTty
ZXR1cm4gbj17bmFtZTpyLGNvdW50OnQuZ2V0KGksImxlbmd0aCIpLGNvbHVtbnM6dGhpcy5jb2x1
bW5zRm9yVHlwZShlKSxvYmplY3Q6ZX19LGdldE1vZGVsVHlwZXM6ZnVuY3Rpb24oKXt2YXIgZSx0
PXRoaXMscj10aGlzLmdldCgiY29udGFpbmVyRGVidWdBZGFwdGVyIik7cmV0dXJuIGU9ci5jYW5D
YXRhbG9nRW50cmllc0J5VHlwZSgibW9kZWwiKT9yLmNhdGFsb2dFbnRyaWVzQnlUeXBlKCJtb2Rl
bCIpOnRoaXMuX2dldE9iamVjdHNPbk5hbWVzcGFjZXMoKSxlPWEuQShlKS5tYXAoZnVuY3Rpb24o
ZSl7cmV0dXJue2tsYXNzOnQuX25hbWVUb0NsYXNzKGUpLG5hbWU6ZX19KSxlPWEuQShlKS5maWx0
ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZGV0ZWN0KGUua2xhc3MpfSksYS5BKGUpfSxfZ2V0T2Jq
ZWN0c09uTmFtZXNwYWNlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1hLkEoaS5kZWZhdWx0Lk5B
TUVTUEFDRVMpLHI9YS5BKCk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIGkg
aW4gdClpZih0Lmhhc093blByb3BlcnR5KGkpJiZlLmRldGVjdCh0W2ldKSl7dmFyIG89bi5kYXNo
ZXJpemUoaSk7dCBpbnN0YW5jZW9mIHMuZGVmYXVsdHx8IXQudG9TdHJpbmcoKXx8KG89dCsiLyIr
byksci5wdXNoKG8pfX0pLHJ9LGdldFJlY29yZHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuQSgpfSx3
cmFwUmVjb3JkOmZ1bmN0aW9uKGUpe3ZhciB0PXtvYmplY3Q6ZX07cmV0dXJuIHQuY29sdW1uVmFs
dWVzPXRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKGUpLHQuc2VhcmNoS2V5d29yZHM9dGhpcy5n
ZXRSZWNvcmRLZXl3b3JkcyhlKSx0LmZpbHRlclZhbHVlcz10aGlzLmdldFJlY29yZEZpbHRlclZh
bHVlcyhlKSx0LmNvbG9yPXRoaXMuZ2V0UmVjb3JkQ29sb3IoZSksdH0sZ2V0UmVjb3JkQ29sdW1u
VmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybnt9fSxnZXRSZWNvcmRLZXl3b3JkczpmdW5jdGlvbihl
KXtyZXR1cm4gYS5BKCl9LGdldFJlY29yZEZpbHRlclZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm57
fX0sZ2V0UmVjb3JkQ29sb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGx9LG9ic2VydmVSZWNvcmQ6
ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt9fX0pfSksZSgiZW1iZXItZXh0ZW5zaW9u
LXN1cHBvcnQvaW5kZXgiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1leHRl
bnNpb24tc3VwcG9ydC9kYXRhX2FkYXB0ZXIiLCJlbWJlci1leHRlbnNpb24tc3VwcG9ydC9jb250
YWluZXJfZGVidWdfYWRhcHRlciJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijt0LmRl
ZmF1bHQuRGF0YUFkYXB0ZXI9ci5kZWZhdWx0LHQuZGVmYXVsdC5Db250YWluZXJEZWJ1Z0FkYXB0
ZXI9bi5kZWZhdWx0fSksZSgiZW1iZXItaHRtbGJhcnMvY29tcGF0IixbImV4cG9ydHMiLCJlbWJl
ci1tZXRhbC9jb3JlIiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvc3RyaW5nIl0sZnVuY3Rpb24oZSx0
LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10LmRlZmF1bHQuSGFuZGxlYmFycz10LmRlZmF1bHQuSGFu
ZGxlYmFyc3x8e307bi5TYWZlU3RyaW5nPXIuU2FmZVN0cmluZyxuLlV0aWxzPXtlc2NhcGVFeHBy
ZXNzaW9uOnIuZXNjYXBlRXhwcmVzc2lvbn0sZS5kZWZhdWx0PW59KSxlKCJlbWJlci1odG1sYmFy
cy9lbnYiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsIiwiZW1iZXItbWV0YWwvZW52aXJvbm1lbnQi
LCJodG1sYmFycy1ydW50aW1lIiwiZW1iZXItbWV0YWwvYXNzaWduIiwiZW1iZXItaHRtbGJhcnMv
aG9va3Mvc3ViZXhwciIsImVtYmVyLWh0bWxiYXJzL2hvb2tzL2NvbmNhdCIsImVtYmVyLWh0bWxi
YXJzL2hvb2tzL2xpbmstcmVuZGVyLW5vZGUiLCJlbWJlci1odG1sYmFycy9ob29rcy9jcmVhdGUt
ZnJlc2gtc2NvcGUiLCJlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLXNoYWRvdy1zY29wZSIsImVt
YmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2VsZiIsImVtYmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQt
c2NvcGUiLCJlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLWxvY2FsIiwiZW1iZXItaHRtbGJhcnMv
aG9va3MvYmluZC1ibG9jayIsImVtYmVyLWh0bWxiYXJzL2hvb2tzL3VwZGF0ZS1zZWxmIiwiZW1i
ZXItaHRtbGJhcnMvaG9va3MvZ2V0LXJvb3QiLCJlbWJlci1odG1sYmFycy9ob29rcy9nZXQtY2hp
bGQiLCJlbWJlci1odG1sYmFycy9ob29rcy9nZXQtYmxvY2siLCJlbWJlci1odG1sYmFycy9ob29r
cy9nZXQtdmFsdWUiLCJlbWJlci1odG1sYmFycy9ob29rcy9nZXQtY2VsbC1vci12YWx1ZSIsImVt
YmVyLWh0bWxiYXJzL2hvb2tzL2NsZWFudXAtcmVuZGVyLW5vZGUiLCJlbWJlci1odG1sYmFycy9o
b29rcy9kZXN0cm95LXJlbmRlci1ub2RlIiwiZW1iZXItaHRtbGJhcnMvaG9va3MvZGlkLXJlbmRl
ci1ub2RlIiwiZW1iZXItaHRtbGJhcnMvaG9va3Mvd2lsbC1jbGVhbnVwLXRyZWUiLCJlbWJlci1o
dG1sYmFycy9ob29rcy9kaWQtY2xlYW51cC10cmVlIiwiZW1iZXItaHRtbGJhcnMvaG9va3MvY2xh
c3NpZnkiLCJlbWJlci1odG1sYmFycy9ob29rcy9jb21wb25lbnQiLCJlbWJlci1odG1sYmFycy9o
b29rcy9sb29rdXAtaGVscGVyIiwiZW1iZXItaHRtbGJhcnMvaG9va3MvaGFzLWhlbHBlciIsImVt
YmVyLWh0bWxiYXJzL2hvb2tzL2ludm9rZS1oZWxwZXIiLCJlbWJlci1odG1sYmFycy9ob29rcy9l
bGVtZW50IiwiZW1iZXItaHRtbGJhcnMvaGVscGVycyIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRz
IiwiZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxwZXIiLCJlbWJlci1odG1sYmFycy9rZXl3
b3Jkcy9kZWJ1Z2dlciIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3dpdGgiLCJlbWJlci1odG1s
YmFycy9rZXl3b3Jkcy9vdXRsZXQiLCJlbWJlci1odG1sYmFycy9rZXl3b3Jkcy91bmJvdW5kIiwi
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvdmlldyIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nv
bXBvbmVudCIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2VsZW1lbnQtY29tcG9uZW50IiwiZW1i
ZXItaHRtbGJhcnMva2V5d29yZHMvcGFydGlhbCIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2lu
cHV0IiwiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvdGV4dGFyZWEiLCJlbWJlci1odG1sYmFycy9r
ZXl3b3Jkcy95aWVsZCIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL211dCIsImVtYmVyLWh0bWxi
YXJzL2tleXdvcmRzL3JlYWRvbmx5IiwiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZ2V0Il0sZnVu
Y3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwLGgsbSx2LGIsZyx5LF8sdyx4LGssQyxF
LE8sVCxOLFMsQSxQLGosUixMLEQsTSxJLEYsSCxWLHEseixCLFUsVywkLEspeyJ1c2Ugc3RyaWN0
Ijt2YXIgUT1pLmRlZmF1bHQoe30sbi5ob29rcyk7US5rZXl3b3Jkcz1qLmRlZmF1bHQsaS5kZWZh
dWx0KFEse2xpbmtSZW5kZXJOb2RlOnMuZGVmYXVsdCxjcmVhdGVGcmVzaFNjb3BlOnUuZGVmYXVs
dCxjcmVhdGVDaGlsZFNjb3BlOnUuY3JlYXRlQ2hpbGRTY29wZSxiaW5kU2hhZG93U2NvcGU6bC5k
ZWZhdWx0LGJpbmRTZWxmOmMuZGVmYXVsdCxiaW5kU2NvcGU6Zi5kZWZhdWx0LGJpbmRMb2NhbDpk
LmRlZmF1bHQsYmluZEJsb2NrOnAuZGVmYXVsdCx1cGRhdGVTZWxmOmguZGVmYXVsdCxnZXRCbG9j
azpiLmRlZmF1bHQsZ2V0Um9vdDptLmRlZmF1bHQsZ2V0Q2hpbGQ6di5kZWZhdWx0LGdldFZhbHVl
OmcuZGVmYXVsdCxnZXRDZWxsT3JWYWx1ZTp5LmRlZmF1bHQsc3ViZXhwcjpvLmRlZmF1bHQsY29u
Y2F0OmEuZGVmYXVsdCxjbGVhbnVwUmVuZGVyTm9kZTpfLmRlZmF1bHQsZGVzdHJveVJlbmRlck5v
ZGU6dy5kZWZhdWx0LHdpbGxDbGVhbnVwVHJlZTprLmRlZmF1bHQsZGlkQ2xlYW51cFRyZWU6Qy5k
ZWZhdWx0LGRpZFJlbmRlck5vZGU6eC5kZWZhdWx0LGNsYXNzaWZ5OkUuZGVmYXVsdCxjb21wb25l
bnQ6Ty5kZWZhdWx0LGxvb2t1cEhlbHBlcjpULmRlZmF1bHQsaGFzSGVscGVyOk4uZGVmYXVsdCxp
bnZva2VIZWxwZXI6Uy5kZWZhdWx0LGVsZW1lbnQ6QS5kZWZhdWx0fSksai5yZWdpc3RlcktleXdv
cmQoImRlYnVnZ2VyIixMLmRlZmF1bHQpLGoucmVnaXN0ZXJLZXl3b3JkKCJ3aXRoIixELmRlZmF1
bHQpLGoucmVnaXN0ZXJLZXl3b3JkKCJvdXRsZXQiLE0uZGVmYXVsdCksai5yZWdpc3RlcktleXdv
cmQoInVuYm91bmQiLEkuZGVmYXVsdCksai5yZWdpc3RlcktleXdvcmQoImNvbXBvbmVudCIsSC5k
ZWZhdWx0KSxqLnJlZ2lzdGVyS2V5d29yZCgiQGVsZW1lbnRfY29tcG9uZW50IixWLmRlZmF1bHQp
LGoucmVnaXN0ZXJLZXl3b3JkKCJwYXJ0aWFsIixxLmRlZmF1bHQpLGoucmVnaXN0ZXJLZXl3b3Jk
KCJpbnB1dCIsei5kZWZhdWx0KSxqLnJlZ2lzdGVyS2V5d29yZCgidGV4dGFyZWEiLEIuZGVmYXVs
dCksai5yZWdpc3RlcktleXdvcmQoInlpZWxkIixVLmRlZmF1bHQpLGoucmVnaXN0ZXJLZXl3b3Jk
KCJtdXQiLFcuZGVmYXVsdCksai5yZWdpc3RlcktleXdvcmQoIkBtdXQiLFcucHJpdmF0ZU11dCks
ai5yZWdpc3RlcktleXdvcmQoInJlYWRvbmx5IiwkLmRlZmF1bHQpLGoucmVnaXN0ZXJLZXl3b3Jk
KCJnZXQiLEsuZGVmYXVsdCksdC5kZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBP
UlQmJmoucmVnaXN0ZXJLZXl3b3JkKCJ2aWV3IixGLmRlZmF1bHQpLGUuZGVmYXVsdD17aG9va3M6
USxoZWxwZXJzOlAuZGVmYXVsdCx1c2VGcmFnbWVudENhY2hlOiEwfTt2YXIgRz1yLmRlZmF1bHQu
aGFzRE9NP25ldyBSLmRlZmF1bHQ6bnVsbDtlLmRvbUhlbHBlcj1HfSksZSgiZW1iZXItaHRtbGJh
cnMvZ2xpbW1lci1jb21wb25lbnQiLFsiZXhwb3J0cyIsImVtYmVyLXZpZXdzL3ZpZXdzL2NvcmVf
dmlldyIsImVtYmVyLXZpZXdzL21peGlucy92aWV3X2NoaWxkX3ZpZXdzX3N1cHBvcnQiLCJlbWJl
ci12aWV3cy9taXhpbnMvdmlld19zdGF0ZV9zdXBwb3J0IiwiZW1iZXItdmlld3MvbWl4aW5zL3Rl
bXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0IiwiZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVz
X3N1cHBvcnQiLCJlbWJlci12aWV3cy9taXhpbnMvaW5zdHJ1bWVudGF0aW9uX3N1cHBvcnQiLCJl
bWJlci12aWV3cy9taXhpbnMvYXJpYV9yb2xlX3N1cHBvcnQiLCJlbWJlci12aWV3cy9taXhpbnMv
dmlld19zdXBwb3J0IiwiZW1iZXItdmlld3Mvdmlld3MvdmlldyJdLGZ1bmN0aW9uKGUsdCxyLG4s
aSxvLGEscyx1LGwpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9dC5kZWZhdWx0LmV4dGVuZChyLmRl
ZmF1bHQsbi5kZWZhdWx0LGkuZGVmYXVsdCxvLmRlZmF1bHQsYS5kZWZhdWx0LHMuZGVmYXVsdCx1
LmRlZmF1bHQse2lzQ29tcG9uZW50OiEwLGlzR2xpbW1lckNvbXBvbmVudDohMCxpbml0OmZ1bmN0
aW9uKCl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3ZpZXdSZWdpc3Ry
eT10aGlzLl92aWV3UmVnaXN0cnl8fGwuZGVmYXVsdC52aWV3c319KX0pLGUoImVtYmVyLWh0bWxi
YXJzL2hlbHBlciIsWyJleHBvcnRzIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0Il0sZnVu
Y3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm57aXNIZWxwZXJJbnN0
YW5jZTohMCxjb21wdXRlOmV9fWUuaGVscGVyPXI7dmFyIG49dC5kZWZhdWx0LmV4dGVuZCh7aXNI
ZWxwZXJJbnN0YW5jZTohMCxyZWNvbXB1dGU6ZnVuY3Rpb24oKXt0aGlzLl9zdHJlYW0ubm90aWZ5
KCl9fSk7bi5yZW9wZW5DbGFzcyh7aXNIZWxwZXJGYWN0b3J5OiEwfSksZS5kZWZhdWx0PW59KSxl
KCJlbWJlci1odG1sYmFycy9oZWxwZXJzIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9lbXB0eV9v
YmplY3QiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7bltlXT10
fWUucmVnaXN0ZXJIZWxwZXI9cjt2YXIgbj1uZXcgdC5kZWZhdWx0O2UuZGVmYXVsdD1ufSksZSgi
ZW1iZXItaHRtbGJhcnMvaGVscGVycy8taHRtbC1zYWZlIixbImV4cG9ydHMiLCJodG1sYmFycy11
dGlsL3NhZmUtc3RyaW5nIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl
KXt2YXIgcj1lWzBdO3JldHVybiBuZXcgdC5kZWZhdWx0KHIpfWUuZGVmYXVsdD1yfSksZSgiZW1i
ZXItaHRtbGJhcnMvaGVscGVycy8tam9pbi1jbGFzc2VzIixbImV4cG9ydHMiXSxmdW5jdGlvbihl
KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtmb3IodmFyIHQ9W10scj0wLG49ZS5sZW5ndGg7
cjxuO3IrKyl7dmFyIGk9ZVtyXTtpJiZ0LnB1c2goaSl9cmV0dXJuIHQuam9pbigiICIpfWUuZGVm
YXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaGVscGVycy8tbm9ybWFsaXplLWNsYXNzIixbImV4
cG9ydHMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmciLCJlbWJlci1tZXRhbC9wYXRoX2Nh
Y2hlIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsbil7dmFyIGk9
ZVswXSxvPWVbMV0sYT1uLmFjdGl2ZUNsYXNzLHM9bi5pbmFjdGl2ZUNsYXNzO2lmKGF8fHMpcmV0
dXJuIG8/YTpzO2lmKG89PT0hMCl7aWYoaSYmci5pc1BhdGgoaSkpe3ZhciB1PWkuc3BsaXQoIi4i
KTtpPXVbdS5sZW5ndGgtMV19cmV0dXJuIHQuZGFzaGVyaXplKGkpfXJldHVybiBvIT09ITEmJm51
bGwhPW8/bzpudWxsfWUuZGVmYXVsdD1ufSksZSgiZW1iZXItaHRtbGJhcnMvaGVscGVycy9jb25j
YXQiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3Jl
dHVybiBlLmpvaW4oIiIpfWUuZGVmYXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaGVscGVycy9l
YWNoLWluIixbImV4cG9ydHMiLCJlbWJlci12aWV3cy9zdHJlYW1zL3Nob3VsZF9kaXNwbGF5Il0s
ZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSxyLG4pe3ZhciBpLG8s
YSxzPWVbMF07aWYoaT1zP09iamVjdC5rZXlzKHMpOltdLHQuZGVmYXVsdChpKSlmb3IoYT0wO2E8
aS5sZW5ndGg7YSsrKW89aVthXSxuLnRlbXBsYXRlLnlpZWxkSXRlbShvLFtvLHNbb11dKTtlbHNl
IG4uaW52ZXJzZS55aWVsZCYmbi5pbnZlcnNlLnlpZWxkKCl9O2UuZGVmYXVsdD1yfSksZSgiZW1i
ZXItaHRtbGJhcnMvaGVscGVycy9lYWNoIixbImV4cG9ydHMiLCJlbWJlci12aWV3cy9zdHJlYW1z
L3Nob3VsZF9kaXNwbGF5IiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvZGVjb2RlLWVhY2gta2V5Il0s
ZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsbixvKXt2YXIgYT1lWzBd
LHM9bi5rZXk7dC5kZWZhdWx0KGEpP2koYSxmdW5jdGlvbihlLHQpe3ZhciBuPXIuZGVmYXVsdChl
LHMsdCk7by50ZW1wbGF0ZS55aWVsZEl0ZW0obixbZSx0XSl9KTpvLmludmVyc2UueWllbGQmJm8u
aW52ZXJzZS55aWVsZCgpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZS5mb3JFYWNoP2UuZm9yRWFj
aCh0KTpBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsdCl9ZS5kZWZhdWx0PW59KSxlKCJl
bWJlci1odG1sYmFycy9oZWxwZXJzL2hhc2giLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ug
c3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxyKXtyZXR1cm4gdH1lLmRlZmF1bHQ9dH0pLGUoImVtYmVy
LWh0bWxiYXJzL2hlbHBlcnMvaWZfdW5sZXNzIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1
ZyIsImVtYmVyLXZpZXdzL3N0cmVhbXMvc2hvdWxkX2Rpc3BsYXkiXSxmdW5jdGlvbihlLHQscil7
InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0LG4pe3JldHVybiBvKGUsdCxuLHIuZGVmYXVsdChl
WzBdKSl9ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIG8oZSx0LG4sIXIuZGVmYXVsdChlWzBdKSl9
ZnVuY3Rpb24gbyhlLHQscixuKXtpZihuKXtpZighci50ZW1wbGF0ZS55aWVsZClyZXR1cm4gZVsx
XTtyLnRlbXBsYXRlLnlpZWxkKCl9ZWxzZXtpZighci5pbnZlcnNlLnlpZWxkKXJldHVybiBlWzJd
O3IuaW52ZXJzZS55aWVsZCgpfX1lLmlmSGVscGVyPW4sZS51bmxlc3NIZWxwZXI9aX0pLGUoImVt
YmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9jIixbImV4cG9ydHMiLCJlbWJlci1odG1sYmFycy9oZWxw
ZXIiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmciXSxmdW5jdGlvbihlLHQscil7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHIubG9jLmFwcGx5KG51bGwsZSl9ZS5kZWZhdWx0
PXQuaGVscGVyKG4pfSksZSgiZW1iZXItaHRtbGJhcnMvaGVscGVycy9sb2ciLFsiZXhwb3J0cyIs
ImVtYmVyLW1ldGFsL2xvZ2dlciJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IHIoZSl7dC5kZWZhdWx0LmxvZy5hcHBseShudWxsLGUpfWUuZGVmYXVsdD1yfSksZSgiZW1iZXIt
aHRtbGJhcnMvaGVscGVycy93aXRoIixbImV4cG9ydHMiLCJlbWJlci12aWV3cy9zdHJlYW1zL3No
b3VsZF9kaXNwbGF5Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIs
bil7dC5kZWZhdWx0KGVbMF0pP24udGVtcGxhdGUueWllbGQoW2VbMF1dKTpuLmludmVyc2UmJm4u
aW52ZXJzZS55aWVsZCYmbi5pbnZlcnNlLnlpZWxkKFtdKX1lLmRlZmF1bHQ9cn0pLGUoImVtYmVy
LWh0bWxiYXJzL2hvb2tzL2JpbmQtYmxvY2siLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ug
c3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPD0zfHx2b2lk
IDA9PT1hcmd1bWVudHNbM10/ImRlZmF1bHQiOmFyZ3VtZW50c1szXTt0LmJpbmRCbG9jayhuLHIp
fWUuZGVmYXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1sb2NhbCIsWyJleHBv
cnRzIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iLCJlbWJlci1tZXRhbC9zdHJlYW1zL3By
b3h5LXN0cmVhbSJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLG4s
aSxvKXtpZihuLmhhc093bkxvY2FsKGkpKXt2YXIgYT1uLmdldExvY2FsKGkpO2EhPT1vJiZhLnNl
dFNvdXJjZShvKX1lbHNle3ZhciBzPXQud3JhcChvLHIuZGVmYXVsdCxpKTtuLmJpbmRMb2NhbChp
LHMpfX1lLmRlZmF1bHQ9bn0pLGUoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2NvcGUiLFsi
ZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCl7fWUuZGVm
YXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1zZWxmIixbImV4cG9ydHMiLCJl
bWJlci1tZXRhbCIsImVtYmVyLW1ldGFsL3N0cmVhbXMvcHJveHktc3RyZWFtIl0sZnVuY3Rpb24o
ZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUscixuKXtpZihuJiZuLmlzVmlldyl7dC5k
ZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQmJnIuYmluZExvY2FsKCJ2aWV3
IixpKG4sInZpZXciKSk7dmFyIG89aShuLCIiKTtyZXR1cm4gdm9pZChuLmlzR2xpbW1lckNvbXBv
bmVudD9yLmJpbmRTZWxmKG8pOnIuYmluZFNlbGYoaShvLmdldEtleSgiY29udGV4dCIpLCIiKSkp
fXZhciBhPWkobiwiIik7ci5iaW5kU2VsZihhKX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG5ldyBy
LmRlZmF1bHQoZSx0KX1lLmRlZmF1bHQ9bn0pLGUoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQt
c2hhZG93LXNjb3BlIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVh
bSJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LHIsaSl7aWYoaSl7
dmFyIG89aS52aWV3O3JldHVybiBvJiYhby5pc0NvbXBvbmVudCYmKHIuYmluZExvY2FsKCJ2aWV3
IixuKG8sInZpZXciKSksby5pc1ZpZXcmJnIuYmluZFNlbGYobihyLmdldExvY2FsKCJ2aWV3Iiku
Z2V0S2V5KCJjb250ZXh0IiksIiIpKSksci5iaW5kVmlldyhvKSxvJiZpLmF0dHJzJiZyLmJpbmRD
b21wb25lbnQobyksImF0dHJzImluIGkmJnIuYmluZEF0dHJzKGkuYXR0cnMpLHJ9fWZ1bmN0aW9u
IG4oZSxyKXtyZXR1cm4gbmV3IHQuZGVmYXVsdChlLHIpfWUuZGVmYXVsdD1yfSksZSgiZW1iZXIt
aHRtbGJhcnMvaG9va3MvY2xhc3NpZnkiLFsiZXhwb3J0cyIsImVtYmVyLWh0bWxiYXJzL3V0aWxz
L2lzLWNvbXBvbmVudCJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSxy
LG4pe3JldHVybiB0LmRlZmF1bHQoZSxyLG4pPyJjb21wb25lbnQiOm51bGx9ZS5kZWZhdWx0PXJ9
KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9jbGVhbnVwLXJlbmRlci1ub2RlIixbImV4cG9ydHMi
XSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtlLmNsZWFudXAmJmUuY2xl
YW51cCgpfWUuZGVmYXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaG9va3MvY29tcG9uZW50Iixb
ImV4cG9ydHMiLCJlbWJlci1tZXRhbC9mZWF0dXJlcyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1i
ZXItaHRtbGJhcnMvbm9kZS1tYW5hZ2Vycy9jb21wb25lbnQtbm9kZS1tYW5hZ2VyIiwiZW1iZXIt
dmlld3Mvc3lzdGVtL2J1aWxkLWNvbXBvbmVudC10ZW1wbGF0ZSIsImVtYmVyLWh0bWxiYXJzL3V0
aWxzL2xvb2t1cC1jb21wb25lbnQiLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1tZXRhbC9l
bXB0eV9vYmplY3QiLCJlbWJlci1tZXRhbC9jYWNoZSIsImVtYmVyLWh0bWxiYXJzL3N5c3RlbS9s
b29rdXAtaGVscGVyIiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvZXh0cmFjdC1wb3NpdGlvbmFsLXBh
cmFtcyIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtY29tcG9uZW50Il0sZnVuY3Rp
b24oZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGUsdCxy
LHUsZCxoLG0sdil7dmFyIGI9ZS5nZXRTdGF0ZSgpLGc9dTtpZihsLkNPTlRBSU5TX0RPVF9DQUNI
RS5nZXQoZykpe3ZhciB5PXQuaG9va3MuZ2V0KHQscixnKSxfPXkudmFsdWUoKTtpZihmLmlzQ29t
cG9uZW50Q2VsbChfKSl7Zz1fW2YuQ09NUE9ORU5UX1BBVEhdO3ZhciB3PWEuZGVmYXVsdChuZXcg
cy5kZWZhdWx0LGgpO2YucHJvY2Vzc1Bvc2l0aW9uYWxQYXJhbXNGcm9tQ2VsbChfLGQsdyksZD1b
XSxoPWYubWVyZ2VJbk5ld0hhc2goX1tmLkNPTVBPTkVOVF9IQVNIXSx3KX19aWYoYi5tYW5hZ2Vy
KXt2YXIgeD1iLm1hbmFnZXIsaz1udWxsO3JldHVybiB4LmJsb2NrP2s9eC5ibG9jay50ZW1wbGF0
ZS5tZXRhOnguc2NvcGUmJnguc2NvcGUuX3ZpZXcmJihrPXguc2NvcGUuX3ZpZXcudGVtcGxhdGUu
bWV0YSksdC5tZXRhLm1vZHVsZU5hbWU9ayYmay5tb2R1bGVOYW1lfHx0Lm1ldGEmJnQubWV0YS5t
b2R1bGVOYW1lLGMuZGVmYXVsdChlLHguY29tcG9uZW50LmNvbnN0cnVjdG9yLGQsaCwhMSksdm9p
ZCBiLm1hbmFnZXIucmVyZW5kZXIodCxoLHYpfXZhciBDPSExLEU9ITEsTz0hMSxUPXAuZ2V0KGcp
O1QmJihnPVRbMl0sQz0hMCxFPSEhVFsxXSksbC5DT05UQUlOU19EQVNIX0NBQ0hFLmdldChnKSYm
KE89ITApO3ZhciBOPXQudmlldyxTPXQudmlldyxBPVMmJlMuX2lzQW5nbGVCcmFja2V0LFA9UyYm
IVMuX2lzQW5nbGVCcmFja2V0LGo9QyYmIU8mJkEsUj1DJiZFJiZnPT09dC52aWV3LnRhZ05hbWUs
TD1DJiYhTyYmUCxEPXZvaWQgMCxNPXZvaWQgMDtpZihPfHwhQyl7dmFyIEk9e30sRj10Lm1ldGEm
JnQubWV0YS5tb2R1bGVOYW1lO0YmJihJLnNvdXJjZT0idGVtcGxhdGU6IitGKTt2YXIgSD1vLmRl
ZmF1bHQodC5vd25lcixnLEkpO0Q9SC5jb21wb25lbnQsTT1ILmxheW91dCxDJiZPJiYhRCYmIU0m
JihqPSEwKX1pZihSfHxqKXt2YXIgVj17Y29tcG9uZW50OlMsCit0YWdOYW1lOmcsaXNBbmdsZUJy
YWNrZXQ6ITAsaXNDb21wb25lbnRFbGVtZW50OiEwLG91dGVyQXR0cnM6ci5nZXRBdHRycygpLHBh
cmVudFNjb3BlOnJ9LHE9e3RlbXBsYXRlczptLHNjb3BlOnJ9LHo9aS5kZWZhdWx0KFYsaCxxKSxC
PXouYmxvY2s7Qi5pbnZva2UodCxbXSx2b2lkIDAsZSxyLHYpfWVsc2UgaWYoTCl7dmFyIEI9aS5i
dWlsZEhUTUxUZW1wbGF0ZShnLGgse3RlbXBsYXRlczptLHNjb3BlOnJ9KTtCLmludm9rZSh0LFtd
LHZvaWQgMCxlLHIsdil9ZWxzZXt2YXIgVT1uLmRlZmF1bHQuY3JlYXRlKGUsdCx7dGFnTmFtZTpn
LHBhcmFtczpkLGF0dHJzOmgscGFyZW50VmlldzpOLHRlbXBsYXRlczptLGlzQW5nbGVCcmFja2V0
OkMsaXNUb3BMZXZlbDpFLGNvbXBvbmVudDpELGxheW91dDpNLHBhcmVudFNjb3BlOnJ9KTtiLm1h
bmFnZXI9VSxVLnJlbmRlcih0LHYpfX1lLmRlZmF1bHQ9ZDt2YXIgcD1uZXcgdS5kZWZhdWx0KDFl
MyxmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvXihAPyk8KC4qKT4kLyl9KX0pLGUoImVtYmVy
LWh0bWxiYXJzL2hvb2tzL2NvbmNhdCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvc3RyZWFtcy91
dGlscyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSxyKXtyZXR1cm4g
dC5jb25jYXQociwiIil9ZS5kZWZhdWx0PXJ9KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9jcmVh
dGUtZnJlc2gtc2NvcGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL3N0cmVhbXMvcHJveHktc3Ry
ZWFtIiwiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3Ry
aWN0IjtmdW5jdGlvbiBuKGUpe3RoaXMuX3NlbGY9dm9pZCAwLHRoaXMuX2Jsb2Nrcz12b2lkIDAs
dGhpcy5fY29tcG9uZW50PXZvaWQgMCx0aGlzLl92aWV3PXZvaWQgMCx0aGlzLl9hdHRycz12b2lk
IDAsdGhpcy5fbG9jYWxzPXZvaWQgMCx0aGlzLl9sb2NhbFByZXNlbnQ9dm9pZCAwLHRoaXMub3Zl
cnJpZGVDb250cm9sbGVyPXZvaWQgMCx0aGlzLnBhcmVudD1lfWZ1bmN0aW9uIGkoKXtyZXR1cm4g
bmV3IG4ocyl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gbmV3IG4oZSl9ZS5kZWZhdWx0PWksZS5jcmVh
dGVDaGlsZFNjb3BlPW87dmFyIGE9bi5wcm90b3R5cGU7YS5nZXRTZWxmPWZ1bmN0aW9uKCl7cmV0
dXJuIHRoaXMuX3NlbGZ8fHRoaXMucGFyZW50LmdldFNlbGYoKX0sYS5iaW5kU2VsZj1mdW5jdGlv
bihlKXt0aGlzLl9zZWxmPWV9LGEudXBkYXRlU2VsZj1mdW5jdGlvbihlLHIpe3ZhciBuPXRoaXMu
X3NlbGY7bj9uLnNldFNvdXJjZShlKTp0aGlzLl9zZWxmPW5ldyB0LmRlZmF1bHQoZSxyKX0sYS5n
ZXRCbG9jaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fYmxvY2tzP3RoaXMuX2Jsb2Nrc1tlXXx8
dGhpcy5wYXJlbnQuZ2V0QmxvY2soZSk6dGhpcy5wYXJlbnQuZ2V0QmxvY2soZSl9LGEuaGFzQmxv
Y2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2Jsb2Nrcz8hKCF0aGlzLl9ibG9ja3NbZV0mJiF0
aGlzLnBhcmVudC5oYXNCbG9jayhlKSk6dGhpcy5wYXJlbnQuaGFzQmxvY2soZSl9LGEuYmluZEJs
b2NrPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYmxvY2tzfHwodGhpcy5fYmxvY2tzPW5ldyByLmRlZmF1
bHQpLHRoaXMuX2Jsb2Nrc1tlXT10fSxhLmdldENvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0
aGlzLl9jb21wb25lbnR8fHRoaXMucGFyZW50LmdldENvbXBvbmVudCgpfSxhLmJpbmRDb21wb25l
bnQ9ZnVuY3Rpb24oZSl7dGhpcy5fY29tcG9uZW50PWV9LGEuZ2V0Vmlldz1mdW5jdGlvbigpe3Jl
dHVybiB0aGlzLl92aWV3fHx0aGlzLnBhcmVudC5nZXRWaWV3KCl9LGEuYmluZFZpZXc9ZnVuY3Rp
b24oZSl7dGhpcy5fdmlldz1lfSxhLmdldEF0dHJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F0
dHJzfHx0aGlzLnBhcmVudC5nZXRBdHRycygpfSxhLmJpbmRBdHRycz1mdW5jdGlvbihlKXt0aGlz
Ll9hdHRycz1lfSxhLmhhc0xvY2FsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9sb2NhbFByZXNl
bnQ/dGhpcy5fbG9jYWxQcmVzZW50W2VdfHx0aGlzLnBhcmVudC5oYXNMb2NhbChlKTp0aGlzLnBh
cmVudC5oYXNMb2NhbChlKX0sYS5oYXNPd25Mb2NhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5f
bG9jYWxQcmVzZW50JiZ0aGlzLl9sb2NhbFByZXNlbnRbZV19LGEuZ2V0TG9jYWw9ZnVuY3Rpb24o
ZSl7cmV0dXJuIHRoaXMuX2xvY2FsUHJlc2VudCYmdGhpcy5fbG9jYWxQcmVzZW50W2VdP3RoaXMu
X2xvY2Fsc1tlXTp0aGlzLnBhcmVudC5nZXRMb2NhbChlKX0sYS5iaW5kTG9jYWw9ZnVuY3Rpb24o
ZSx0KXt0aGlzLl9sb2NhbFByZXNlbnR8fCh0aGlzLl9sb2NhbFByZXNlbnQ9bmV3IHIuZGVmYXVs
dCx0aGlzLl9sb2NhbHM9bmV3IHIuZGVmYXVsdCksdGhpcy5fbG9jYWxQcmVzZW50W2VdPSEwLHRo
aXMuX2xvY2Fsc1tlXT10fTt2YXIgcz17X3NlbGY6dm9pZCAwLF9ibG9ja3M6dm9pZCAwLF9jb21w
b25lbnQ6dm9pZCAwLF92aWV3OnZvaWQgMCxfYXR0cnM6dm9pZCAwLF9sb2NhbHM6dm9pZCAwLF9s
b2NhbFByZXNlbnQ6dm9pZCAwLG92ZXJyaWRlQ29udHJvbGxlcjp2b2lkIDAsZ2V0U2VsZjpmdW5j
dGlvbigpe3JldHVybiBudWxsfSxiaW5kU2VsZjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbH0sdXBk
YXRlU2VsZjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsfSxnZXRCbG9jazpmdW5jdGlvbihlKXty
ZXR1cm4gbnVsbH0sYmluZEJsb2NrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGx9LGhhc0Jsb2Nr
OmZ1bmN0aW9uKGUpe3JldHVybiExfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVs
bH0sYmluZENvbXBvbmVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRWaWV3OmZ1bmN0aW9u
KCl7cmV0dXJuIG51bGx9LGJpbmRWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSxnZXRBdHRy
czpmdW5jdGlvbigpe3JldHVybiBudWxsfSxiaW5kQXR0cnM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51
bGx9LGhhc0xvY2FsOmZ1bmN0aW9uKGUpe3JldHVybiExfSxoYXNPd25Mb2NhbDpmdW5jdGlvbihl
KXtyZXR1cm4hMX0sZ2V0TG9jYWw6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGx9LGJpbmRMb2NhbDpm
dW5jdGlvbihlLHQpe3JldHVybiBudWxsfX19KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9kZXN0
cm95LXJlbmRlci1ub2RlIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gdChlKXtlLmVtYmVyVmlldyYmZS5lbWJlclZpZXcuZGVzdHJveSgpO3ZhciB0PWUuc3Ry
ZWFtVW5zdWJzY3JpYmVycztpZih0KWZvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyl0W3Jd
KCl9ZS5kZWZhdWx0PXR9KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9kaWQtY2xlYW51cC10cmVl
IixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtlLnZp
ZXcub3duZXJWaWV3Ll9kZXN0cm95aW5nU3VidHJlZUZvclZpZXc9bnVsbH1lLmRlZmF1bHQ9dH0p
LGUoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2RpZC1yZW5kZXItbm9kZSIsWyJleHBvcnRzIl0sZnVu
Y3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXt0LnJlbmRlcmVkTm9kZXMuYWRk
KGUpfWUuZGVmYXVsdD10fSksZSgiZW1iZXItaHRtbGJhcnMvaG9va3MvZWxlbWVudCIsWyJleHBv
cnRzIiwiZW1iZXItaHRtbGJhcnMvc3lzdGVtL2xvb2t1cC1oZWxwZXIiLCJodG1sYmFycy1ydW50
aW1lL2hvb2tzIiwiZW1iZXItaHRtbGJhcnMvc3lzdGVtL2ludm9rZS1oZWxwZXIiXSxmdW5jdGlv
bihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLGksbyxhLHMsdSxsKXtpZighci5o
YW5kbGVSZWRpcmVjdChlLGksbyxhLHMsdSxudWxsLG51bGwsbCkpe3ZhciBjLGY9dC5maW5kSGVs
cGVyKGEsby5nZXRTZWxmKCksaSk7aWYoZil7dmFyIGQ9bi5idWlsZEhlbHBlclN0cmVhbShmLHMs
dSx7ZWxlbWVudDplLmVsZW1lbnR9LGksbyxhKTtjPWQudmFsdWUoKX1lbHNlIGM9aS5ob29rcy5n
ZXQoaSxvLGEpO2kuaG9va3MuZ2V0VmFsdWUoYyl9fWUuZGVmYXVsdD1pfSksZSgiZW1iZXItaHRt
bGJhcnMvaG9va3MvZ2V0LWJsb2NrIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBlLmdldEJsb2NrKHQpfWUuZGVmYXVsdD10fSksZSgi
ZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LWNlbGwtb3ItdmFsdWUiLFsiZXhwb3J0cyIsImVtYmVy
LW1ldGFsL3N0cmVhbXMvdXRpbHMiLCJlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9tdXQiXSxmdW5j
dGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGUmJmVbci5NVVRB
QkxFX1JFRkVSRU5DRV0/ZS5jZWxsKCk6dC5yZWFkKGUpfWUuZGVmYXVsdD1ufSksZSgiZW1iZXIt
aHRtbGJhcnMvaG9va3MvZ2V0LWNoaWxkIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9zdHJlYW1z
L3V0aWxzIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIpe3JldHVy
biB0LmlzU3RyZWFtKGUpP2UuZ2V0S2V5KHIpOmVbcl19ZS5kZWZhdWx0PXJ9KSxlKCJlbWJlci1o
dG1sYmFycy9ob29rcy9nZXQtcm9vdCIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJp
Y3QiO2Z1bmN0aW9uIHQoZSx0KXtpZigidGhpcyI9PT10KXJldHVybltlLmdldFNlbGYoKV07aWYo
Imhhc0Jsb2NrIj09PXQpcmV0dXJuWyEhZS5oYXNCbG9jaygiZGVmYXVsdCIpXTtpZigiaGFzQmxv
Y2tQYXJhbXMiPT09dCl7dmFyIG49ZS5nZXRCbG9jaygiZGVmYXVsdCIpO3JldHVyblshIW4mJm4u
YXJpdHldfXJldHVybiBlLmhhc0xvY2FsKHQpP1tlLmdldExvY2FsKHQpXTpbcihlLHQpXX1mdW5j
dGlvbiByKGUsdCl7aWYoImF0dHJzIj09PXQpe3ZhciByPWUuZ2V0QXR0cnMoKTtpZihyKXJldHVy
biByfXZhciBuPWUuZ2V0U2VsZigpfHxlLmdldExvY2FsKCJ2aWV3Iik7aWYobilyZXR1cm4gbi5n
ZXRLZXkodCk7dmFyIGk9ZS5nZXRBdHRycygpO3JldHVybiBpJiZ0IGluIGk/aVt0XTp2b2lkIDB9
ZS5kZWZhdWx0PXR9KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9nZXQtdmFsdWUiLFsiZXhwb3J0
cyIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiLCJlbWJlci12aWV3cy9jb21wYXQvYXR0cnMt
cHJveHkiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7dmFyIG49
dC5yZWFkKGUpO3JldHVybiBuJiZuW3IuTVVUQUJMRV9DRUxMXT9uLnZhbHVlOm59ZS5kZWZhdWx0
PW59KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9oYXMtaGVscGVyIixbImV4cG9ydHMiLCJlbWJl
ci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlciJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJp
Y3QiO2Z1bmN0aW9uIHIoZSxyLG4pe2lmKGUuaGVscGVyc1tuXSlyZXR1cm4hMDt2YXIgaT1lLm93
bmVyO2lmKHQudmFsaWRhdGVMYXp5SGVscGVyTmFtZShuLGksZS5ob29rcy5rZXl3b3Jkcykpe3Zh
ciBvPSJoZWxwZXI6IituO2lmKGkuaGFzUmVnaXN0cmF0aW9uKG8pKXJldHVybiEwO3ZhciBhPXt9
LHM9ZS5tZXRhJiZlLm1ldGEubW9kdWxlTmFtZTtpZihzJiYoYS5zb3VyY2U9InRlbXBsYXRlOiIr
cyksaS5oYXNSZWdpc3RyYXRpb24obyxhKSlyZXR1cm4hMH1yZXR1cm4hMX1lLmRlZmF1bHQ9cn0p
LGUoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2ludm9rZS1oZWxwZXIiLFsiZXhwb3J0cyIsImVtYmVy
LWh0bWxiYXJzL3N5c3RlbS9pbnZva2UtaGVscGVyIiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vi
c2NyaWJlIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsbixpLG8s
YSxzLHUsbCxjKXt2YXIgZj10LmJ1aWxkSGVscGVyU3RyZWFtKHUsYSxzLGwsbixpKTtpZihmLmxp
bmthYmxlKXtpZihlKXtmb3IodmFyIGQ9ITEscD0wLGg9YS5sZW5ndGg7cDxoO3ArKylkPSEwLGYu
YWRkRGVwZW5kZW5jeShhW3BdKTtmb3IodmFyIG0gaW4gcylkPSEwLGYuYWRkRGVwZW5kZW5jeShz
W21dKTtkJiZyLmRlZmF1bHQoZSxuLGksZil9cmV0dXJue2xpbms6ITAsdmFsdWU6Zn19cmV0dXJu
e3ZhbHVlOmYudmFsdWUoKX19ZS5kZWZhdWx0PW59KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy9s
aW5rLXJlbmRlci1ub2RlIixbImV4cG9ydHMiLCJlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3Jp
YmUiLCJlbWJlci1ydW50aW1lL3V0aWxzIiwiZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyIsImVt
YmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyIiwiZW1iZXItaHRtbGJhcnMva2V5d29y
ZHMvY2xvc3VyZS1jb21wb25lbnQiXSxmdW5jdGlvbihlLHQscixuLGksbyl7InVzZSBzdHJpY3Qi
O2Z1bmN0aW9uIGEoZSxyLG4sYSx1LGwpe2lmKGUuc3RyZWFtVW5zdWJzY3JpYmVycylyZXR1cm4h
MDt2YXIgYz1yLmhvb2tzLmtleXdvcmRzW2FdO2lmKGMmJmMubGluayljLmxpbmsoZS5nZXRTdGF0
ZSgpLHUsbCk7ZWxzZXtpZigidW5ib3VuZCI9PT1hKXJldHVybiEwO3MoYSx1KX1pZihpLkNPTlRB
SU5TX0RPVF9DQUNIRS5nZXQoYSkpe3ZhciBmPXIuaG9va3MuZ2V0KHIsbixhKSxkPWYudmFsdWUo
KTtpZihvLmlzQ29tcG9uZW50Q2VsbChkKSl7dmFyIHA9by5tZXJnZUluTmV3SGFzaChkW28uQ09N
UE9ORU5UX0hBU0hdLGwpO2Zvcih2YXIgaCBpbiBwKXQuZGVmYXVsdChlLHIsbixwW2hdKX19aWYo
dSYmdS5sZW5ndGgpZm9yKHZhciBtPTA7bTx1Lmxlbmd0aDttKyspdC5kZWZhdWx0KGUscixuLHVb
bV0pO2lmKGwpZm9yKHZhciBoIGluIGwpdC5kZWZhdWx0KGUscixuLGxbaF0pO3JldHVybiEwfWZ1
bmN0aW9uIHMoZSx0KXtzd2l0Y2goZSl7Y2FzZSJ1bmxlc3MiOmNhc2UiaWYiOnRbMF09bCh0WzBd
LGMpO2JyZWFrO2Nhc2UiZWFjaCI6dFswXT11KHRbMF0pO2JyZWFrO2Nhc2Uid2l0aCI6dFswXT1s
KHRbMF0sZil9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZChlLCJbXSIpLHI9bi5jaGFpbihlLGZ1bmN0
aW9uKCl7cmV0dXJuIG4ucmVhZCh0KSxuLnJlYWQoZSl9LCJlYWNoIik7cmV0dXJuIHIuYWRkRGVw
ZW5kZW5jeSh0KSxyfWZ1bmN0aW9uIGwoZSx0KXt2YXIgaT1kKGUsImxlbmd0aCIpLG89ZChlLCJp
c1RydXRoeSIpLGE9bi5jaGFpbihlLGZ1bmN0aW9uKCl7dmFyIGE9bi5yZWFkKGUpLHM9bi5yZWFk
KGkpLHU9bi5yZWFkKG8pO3JldHVybiByLmlzQXJyYXkoYSk/cz4wJiZ0KGEpOiJib29sZWFuIj09
dHlwZW9mIHU/ISF1JiZ0KGEpOnQoYSl9LCJTaG91bGREaXNwbGF5Iik7cmV0dXJuIG4uYWRkRGVw
ZW5kZW5jeShhLGkpLG4uYWRkRGVwZW5kZW5jeShhLG8pLGF9ZnVuY3Rpb24gYyhlKXtyZXR1cm4h
IWV9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZX1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIG4uaXNTdHJl
YW0oZSk/ZS5nZXRLZXkodCk6ZSYmZVt0XX1lLmRlZmF1bHQ9YSxlLmxpbmtQYXJhbXNGb3I9c30p
LGUoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2xvb2t1cC1oZWxwZXIiLFsiZXhwb3J0cyIsImVtYmVy
LWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gcihlLHIsbil7cmV0dXJuIHQuZGVmYXVsdChuLHIuZ2V0U2VsZigpLGUpfWUu
ZGVmYXVsdD1yfSksZSgiZW1iZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwciIsWyJleHBvcnRzIiwi
ZW1iZXItaHRtbGJhcnMvc3lzdGVtL2xvb2t1cC1oZWxwZXIiLCJlbWJlci1odG1sYmFycy9zeXN0
ZW0vaW52b2tlLWhlbHBlciIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiLCJlbWJlci1odG1s
YmFycy9ob29rcy9saW5rLXJlbmRlci1ub2RlIl0sZnVuY3Rpb24oZSx0LHIsbixpKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gbyhlLG4sbyxzLHUpe3ZhciBsPWUuaG9va3Mua2V5d29yZHNbb107aWYo
bClyZXR1cm4gbChudWxsLGUsbixzLHUsbnVsbCxudWxsKTtpLmxpbmtQYXJhbXNGb3IobyxzKTtm
b3IodmFyIGM9YShzLHUsbyksZj10LmRlZmF1bHQobyxuLmdldFNlbGYoKSxlKSxkPXIuYnVpbGRI
ZWxwZXJTdHJlYW0oZixzLHUsbnVsbCxlLG4sYykscD0wLGg9cy5sZW5ndGg7cDxoO3ArKylkLmFk
ZERlcGVuZGVuY3koc1twXSk7Zm9yKHZhciBtIGluIHUpZC5hZGREZXBlbmRlbmN5KHVbbV0pO3Jl
dHVybiBkfWZ1bmN0aW9uIGEoZSx0LHIpe3ZhciBuPXMoZSksaT11KHQpLG89IigiK3I7cmV0dXJu
IG4mJihvKz0iICIrbiksaSYmKG8rPSIgIitpKSxvKyIpIn1mdW5jdGlvbiBzKGUpe3JldHVybiBu
LmxhYmVsc0ZvcihlKS5qb2luKCIgIil9ZnVuY3Rpb24gdShlKXt2YXIgdD1bXTtmb3IodmFyIHIg
aW4gZSl0LnB1c2gocisiPSIrbi5sYWJlbEZvcihlW3JdKSk7cmV0dXJuIHQuam9pbigiICIpfWUu
ZGVmYXVsdD1vLGUubGFiZWxGb3JTdWJleHByPWF9KSxlKCJlbWJlci1odG1sYmFycy9ob29rcy91
cGRhdGUtc2VsZiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0
LG4pe3ZhciBpPW47aWYoaSYmaS5oYXNCb3VuZENvbnRyb2xsZXIpe3ZhciBvPWksYT1vLmNvbnRy
b2xsZXI7aT1pLnNlbGYsdC51cGRhdGVMb2NhbCgiY29udHJvbGxlciIsYXx8aSl9cmV0dXJuIGkm
JmkuaXNWaWV3Pyh0LnVwZGF0ZUxvY2FsKCJ2aWV3IixpKSx2b2lkIHQudXBkYXRlU2VsZihyLmdl
dChpLCJjb250ZXh0IiksIiIpKTp2b2lkIHQudXBkYXRlU2VsZihpKX1lLmRlZmF1bHQ9bn0pLGUo
ImVtYmVyLWh0bWxiYXJzL2hvb2tzL3dpbGwtY2xlYW51cC10cmVlIixbImV4cG9ydHMiXSxmdW5j
dGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXt2YXIgdD1lLnZpZXc7dC5vd25lclZp
ZXcuX2Rlc3Ryb3lpbmdTdWJ0cmVlRm9yVmlldz10fWUuZGVmYXVsdD10fSksZSgiZW1iZXItaHRt
bGJhcnMvaW5kZXgiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci10ZW1wbGF0
ZS1jb21waWxlciIsImVtYmVyLWh0bWxiYXJzL3N5c3RlbS9tYWtlX2JvdW5kX2hlbHBlciIsImVt
YmVyLWh0bWxiYXJzL2hlbHBlcnMiLCJlbWJlci1odG1sYmFycy9oZWxwZXJzL2lmX3VubGVzcyIs
ImVtYmVyLWh0bWxiYXJzL2hlbHBlcnMvd2l0aCIsImVtYmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9j
IiwiZW1iZXItaHRtbGJhcnMvaGVscGVycy9sb2ciLCJlbWJlci1odG1sYmFycy9oZWxwZXJzL2Vh
Y2giLCJlbWJlci1odG1sYmFycy9oZWxwZXJzL2VhY2gtaW4iLCJlbWJlci1odG1sYmFycy9oZWxw
ZXJzLy1ub3JtYWxpemUtY2xhc3MiLCJlbWJlci1odG1sYmFycy9oZWxwZXJzL2NvbmNhdCIsImVt
YmVyLWh0bWxiYXJzL2hlbHBlcnMvLWpvaW4tY2xhc3NlcyIsImVtYmVyLWh0bWxiYXJzL2hlbHBl
cnMvLWh0bWwtc2FmZSIsImVtYmVyLWh0bWxiYXJzL2hlbHBlcnMvaGFzaCIsImVtYmVyLWh0bWxi
YXJzL3N5c3RlbS9kb20taGVscGVyIiwiZW1iZXItaHRtbGJhcnMvaGVscGVyIiwiZW1iZXItaHRt
bGJhcnMvdGVtcGxhdGVfcmVnaXN0cnkiLCJlbWJlci1odG1sYmFycy9zeXN0ZW0vYm9vdHN0cmFw
IiwiZW1iZXItaHRtbGJhcnMvY29tcGF0Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxj
LGYsZCxwLGgsbSx2LGIsZyx5LF8peyJ1c2Ugc3RyaWN0IjtpLnJlZ2lzdGVySGVscGVyKCJpZiIs
by5pZkhlbHBlciksaS5yZWdpc3RlckhlbHBlcigidW5sZXNzIixvLnVubGVzc0hlbHBlciksaS5y
ZWdpc3RlckhlbHBlcigid2l0aCIsYS5kZWZhdWx0KSxpLnJlZ2lzdGVySGVscGVyKCJsb2MiLHMu
ZGVmYXVsdCksaS5yZWdpc3RlckhlbHBlcigibG9nIix1LmRlZmF1bHQpLGkucmVnaXN0ZXJIZWxw
ZXIoImVhY2giLGwuZGVmYXVsdCksaS5yZWdpc3RlckhlbHBlcigiZWFjaC1pbiIsYy5kZWZhdWx0
KSxpLnJlZ2lzdGVySGVscGVyKCItbm9ybWFsaXplLWNsYXNzIixmLmRlZmF1bHQpLGkucmVnaXN0
ZXJIZWxwZXIoImNvbmNhdCIsZC5kZWZhdWx0KSxpLnJlZ2lzdGVySGVscGVyKCItam9pbi1jbGFz
c2VzIixwLmRlZmF1bHQpLGkucmVnaXN0ZXJIZWxwZXIoIi1odG1sLXNhZmUiLGguZGVmYXVsdCks
aS5yZWdpc3RlckhlbHBlcigiaGFzaCIsbS5kZWZhdWx0KSx0LmRlZmF1bHQuSFRNTEJhcnM9e3Rl
bXBsYXRlOnIudGVtcGxhdGUsY29tcGlsZTpyLmNvbXBpbGUscHJlY29tcGlsZTpyLnByZWNvbXBp
bGUsbWFrZUJvdW5kSGVscGVyOm4uZGVmYXVsdCxyZWdpc3RlclBsdWdpbjpyLnJlZ2lzdGVyUGx1
Z2luLERPTUhlbHBlcjp2LmRlZmF1bHR9LGIuZGVmYXVsdC5oZWxwZXI9Yi5oZWxwZXIsdC5kZWZh
dWx0LkhlbHBlcj1iLmRlZmF1bHQsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZGVmYXVsdCwiVEVN
UExBVEVTIix7Y29uZmlndXJhYmxlOiExLGdldDpnLmdldFRlbXBsYXRlcyxzZXQ6Zy5zZXRUZW1w
bGF0ZXN9KX0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzIixbImV4cG9ydHMiLCJodG1sYmFy
cy1ydW50aW1lIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe25b
ZV09dH1lLnJlZ2lzdGVyS2V5d29yZD1yO3ZhciBuPU9iamVjdC5jcmVhdGUodC5ob29rcy5rZXl3
b3Jkcyk7ZS5kZWZhdWx0PW59KSxlKCJlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWNv
bXBvbmVudCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9pc19u
b25lIiwiZW1iZXItbWV0YWwvc3ltYm9sIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iLCJl
bWJlci1tZXRhbC9lbXB0eV9vYmplY3QiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzIiwiZW1i
ZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwciIsImVtYmVyLW1ldGFsL2Fzc2lnbiIsImVtYmVyLWh0
bWxiYXJzL3V0aWxzL2V4dHJhY3QtcG9zaXRpb25hbC1wYXJhbXMiLCJlbWJlci1odG1sYmFycy91
dGlscy9sb29rdXAtY29tcG9uZW50Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjKXsi
dXNlIHN0cmljdCI7ZnVuY3Rpb24gZihlLHQscil7dmFyIG49dFswXSxpPXQuc2xpY2UoMSksbz1u
ZXcgQyhlLG4saSxyKTtyZXR1cm4gby5hZGREZXBlbmRlbmN5KG4pLGkuZm9yRWFjaChmdW5jdGlv
bihlKXtyZXR1cm4gby5hZGREZXBlbmRlbmN5KGUpfSksT2JqZWN0LmtleXMocikuZm9yRWFjaChm
dW5jdGlvbihlKXtyZXR1cm4gby5hZGREZXBlbmRlbmN5KHJbZV0pfSksb31mdW5jdGlvbiBkKGUs
dCxyLG4saSl7dmFyIHM9YS5yZWFkKHQpLGw9dS5kZWZhdWx0KG5ldyBvLmRlZmF1bHQsbik7cmV0
dXJuIHAocyk/aChzLHIsbCk6dihlLHMscixsKX1mdW5jdGlvbiBwKGUpe3JldHVybiBlJiZlW19d
fWZ1bmN0aW9uIGgoZSx0LHIpe3ZhciBuO3JldHVybiBtKGUsdCxyKSxuPXt9LG5bd109ZVt3XSxu
W2tdPWcoZVtrXSxyKSxuW3hdPWVbeF0sbltfXT0hMCxufWZ1bmN0aW9uIG0oZSx0LHIpe3ZhciBu
PWVbeF07bC5wcm9jZXNzUG9zaXRpb25hbFBhcmFtcyhudWxsLG4sdCxyKX1mdW5jdGlvbiB2KGUs
dCxyLG4pe3ZhciBpLG89YihlLm93bmVyLHQpO3JldHVybiBsLnByb2Nlc3NQb3NpdGlvbmFsUGFy
YW1zKG51bGwsbyxyLG4pLGk9e30saVt3XT10LGlba109bixpW3hdPW8saVtfXT0hMCxpfWZ1bmN0
aW9uIGIoZSx0KXtpZighdClyZXR1cm5bXTt2YXIgcj1jLmRlZmF1bHQoZSx0KSxuPXIuY29tcG9u
ZW50O3JldHVybiBuJiZuLnBvc2l0aW9uYWxQYXJhbXM/bi5wb3NpdGlvbmFsUGFyYW1zOltdfWZ1
bmN0aW9uIGcoZSx0KXtyZXR1cm4gdS5kZWZhdWx0KHt9LGUsdCl9ZS5kZWZhdWx0PWYsZS5pc0Nv
bXBvbmVudENlbGw9cCxlLnByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGw9bSxlLm1lcmdl
SW5OZXdIYXNoPWc7dmFyIHk9bi5kZWZhdWx0KCJDT01QT05FTlRfUkVGRVJFTkNFIik7ZS5DT01Q
T05FTlRfUkVGRVJFTkNFPXk7dmFyIF89bi5kZWZhdWx0KCJDT01QT05FTlRfQ0VMTCIpO2UuQ09N
UE9ORU5UX0NFTEw9Xzt2YXIgdz1uLmRlZmF1bHQoIkNPTVBPTkVOVF9QQVRIIik7ZS5DT01QT05F
TlRfUEFUSD13O3ZhciB4PW4uZGVmYXVsdCgiQ09NUE9ORU5UX1BPU0lUSU9OQUxfUEFSQU1TIik7
ZS5DT01QT05FTlRfUE9TSVRJT05BTF9QQVJBTVM9eDt2YXIgaz1uLmRlZmF1bHQoIkNPTVBPTkVO
VF9IQVNIIik7ZS5DT01QT05FTlRfSEFTSD1rO3ZhciBDPWkuZGVmYXVsdC5leHRlbmQoe2luaXQ6
ZnVuY3Rpb24oZSx0LHIsbil7dGhpcy5fZW52PWUsdGhpcy5fcGF0aD10LHRoaXMuX3BhcmFtcz1y
LHRoaXMuX2hhc2g9bix0aGlzLmxhYmVsPXMubGFiZWxGb3JTdWJleHByKFt0XS5jb25jYXQociks
biwiY29tcG9uZW50IiksdGhpc1t5XT0hMH0sY29tcHV0ZTpmdW5jdGlvbigpe3JldHVybiBkKHRo
aXMuX2Vudix0aGlzLl9wYXRoLHRoaXMuX3BhcmFtcyx0aGlzLl9oYXNoLHRoaXMubGFiZWwpfX0p
fSksZSgiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvY29tcG9uZW50IixbImV4cG9ydHMiLCJodG1s
YmFycy1ydW50aW1lL2hvb2tzIiwiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvY2xvc3VyZS1jb21w
b25lbnQiLCJlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QiLCJlbWJlci1tZXRhbC9hc3NpZ24iXSxm
dW5jdGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9ZnVuY3Rpb24oZSxvLGEs
cyx1LGwsYyxmKXtpZighZSlyZXR1cm4gci5kZWZhdWx0KG8scyx1KTt2YXIgZD1pLmRlZmF1bHQo
bmV3IG4uZGVmYXVsdCx1KTtyZXR1cm4gdC5rZXl3b3JkKCJAZWxlbWVudF9jb21wb25lbnQiLGUs
byxhLHMsZCxsLGMsZiksITB9fSksZSgiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZGVidWdnZXIi
LFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gcihlLHQscil7dC5ob29rcy5nZXRWYWx1ZShyLmdldExvY2FsKCJ2aWV3Iikp
LHQuaG9va3MuZ2V0VmFsdWUoci5nZXRTZWxmKCkpO3JldHVybiEwfWUuZGVmYXVsdD1yfSksZSgi
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1jb21wb25lbnQiLFsiZXhwb3J0cyIsImVt
YmVyLW1ldGFsL2Fzc2lnbiIsImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtY29tcG9u
ZW50IiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvbG9va3VwLWNvbXBvbmVudCIsImVtYmVyLWh0bWxi
YXJzL3V0aWxzL2V4dHJhY3QtcG9zaXRpb25hbC1wYXJhbXMiXSxmdW5jdGlvbihlLHQscixuLGkp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dmFyIG49dC5ob29rcy5nZXRWYWx1ZShlKTty
ZXR1cm4gci5pc0NvbXBvbmVudENlbGwobikmJihuPW5bci5DT01QT05FTlRfUEFUSF0pLG59ZnVu
Y3Rpb24gYShlLHQsbyxhLHMsdSxsLGMpe3ZhciBmPWFbMF0sZD1hLnNsaWNlKDEpLHA9IShhcmd1
bWVudHMubGVuZ3RoPD04fHx2b2lkIDA9PT1hcmd1bWVudHNbOF0pJiZhcmd1bWVudHNbOF0saD1l
LmdldFN0YXRlKCksbT1oLmNvbXBvbmVudFBhdGg7aWYodm9pZCAwIT09bSYmbnVsbCE9PW0pe2lm
KGY9dC5ob29rcy5nZXRWYWx1ZShmKSxwKXt2YXIgdj1uLmRlZmF1bHQodC5vd25lcixtKSxiPXYu
Y29tcG9uZW50O2kuZGVmYXVsdChudWxsLGIsZCxzKX1pZihyLmlzQ29tcG9uZW50Q2VsbChmKSl7
dmFyIGc9dC5ob29rcy5nZXRWYWx1ZShmKTtyLnByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNl
bGwoZyxkLHMpLGQ9W10scz1yLm1lcmdlSW5OZXdIYXNoKGdbci5DT01QT05FTlRfSEFTSF0scyl9
dmFyIHk9e2RlZmF1bHQ6dSxpbnZlcnNlOmx9O3QuaG9va3MuY29tcG9uZW50KGUsdCxvLG0sZCxz
LHksYyl9fWUuZGVmYXVsdD17c2V0dXBTdGF0ZTpmdW5jdGlvbihlLHIsbixpLGEpe3ZhciBzPW8o
aVswXSxyKTtyZXR1cm4gdC5kZWZhdWx0KHt9LGUse2NvbXBvbmVudFBhdGg6cyxpc0NvbXBvbmVu
dEhlbHBlcjohMH0pfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRTdGF0ZSgpO3QubWFu
YWdlciYmdC5tYW5hZ2VyLmRlc3Ryb3koKSx0Lm1hbmFnZXI9bnVsbDtmb3IodmFyIHI9YXJndW1l
bnRzLmxlbmd0aCxuPUFycmF5KHI+MT9yLTE6MCksaT0xO2k8cjtpKyspbltpLTFdPWFyZ3VtZW50
c1tpXTthLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KG4pKX0scmVyZW5kZXI6YX19KSxlKCJlbWJl
ci1odG1sYmFycy9rZXl3b3Jkcy9nZXQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwi
ZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzIiwi
ZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vic2NyaWJlIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0
IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiXSxmdW5j
dGlvbihlLHQscixuLGksbyxhLHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUsdCl7dmFyIHI9
ZS5sYWJlbD9lLmxhYmVsOiIiLG49dC5sYWJlbD90LmxhYmVsOiIiO3JldHVybiIoZ2V0ICIrcisi
ICIrbisiKSJ9ZnVuY3Rpb24gbChlLHQpe3JldHVybiBuLmlzU3RyZWFtKHQpP25ldyBmKGUsdCk6
ZS5nZXQodCl9ZnVuY3Rpb24gYyhlLHQscixuLG8sYSxzLHUpe2lmKG51bGw9PT1lKXJldHVybiBk
KG4pO3ZhciBsPXZvaWQgMDtyZXR1cm4gZS5saW5rZWRSZXN1bHQ/bD1lLmxpbmtlZFJlc3VsdDoo
bD1kKG4pLGkuZGVmYXVsdChlLHQscixsKSx0Lmhvb2tzLmxpbmtSZW5kZXJOb2RlKGUsdCxyLG51
bGwsbixvKSxlLmxpbmtlZFJlc3VsdD1sKSx0Lmhvb2tzLnJhbmdlKGUsdCxyLG51bGwsbCx1KSwh
MH12YXIgZj1yLmRlZmF1bHQuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9dShlLHQp
O3RoaXMubGFiZWw9cix0aGlzLnBhdGg9cix0aGlzLnNvdXJjZURlcD10aGlzLmFkZE11dGFibGVE
ZXBlbmRlbmN5KGUpLHRoaXMua2V5RGVwPXRoaXMuYWRkTXV0YWJsZURlcGVuZGVuY3kodCksdGhp
cy5vYnNlcnZlZE9iamVjdD1udWxsLHRoaXMub2JzZXJ2ZWRLZXk9bnVsbH0sa2V5OmZ1bmN0aW9u
KCl7dmFyIGU9dGhpcy5rZXlEZXAuZ2V0VmFsdWUoKTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0
dXJuIGV9LGNvbXB1dGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNvdXJjZURlcC5nZXRWYWx1ZSgp
LHQ9dGhpcy5rZXkoKTtpZihlJiZ0KXJldHVybiBvLmdldChlLHQpfSxzZXRWYWx1ZTpmdW5jdGlv
bihlKXt2YXIgdD10aGlzLnNvdXJjZURlcC5nZXRWYWx1ZSgpLHI9dGhpcy5rZXkoKTt0JiZhLnNl
dCh0LHIsZSl9LF9zdXBlciRyZXZhbGlkYXRlOnIuZGVmYXVsdC5wcm90b3R5cGUucmV2YWxpZGF0
ZSxyZXZhbGlkYXRlOmZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyJHJldmFsaWRhdGUoZSk7dmFyIHQ9
dGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKSxyPXRoaXMua2V5KCk7dD09PXRoaXMub2JzZXJ2ZWRP
YmplY3QmJnI9PT10aGlzLm9ic2VydmVkS2V5fHwodGhpcy5fY2xlYXJPYnNlcnZlZE9iamVjdCgp
LHQmJiJvYmplY3QiPT10eXBlb2YgdCYmciYmKHMuYWRkT2JzZXJ2ZXIodCxyLHRoaXMsdGhpcy5u
b3RpZnkpLHRoaXMub2JzZXJ2ZWRPYmplY3Q9dCx0aGlzLm9ic2VydmVkS2V5PXIpKX0sX2NsZWFy
T2JzZXJ2ZWRPYmplY3Q6ZnVuY3Rpb24oKXt0aGlzLm9ic2VydmVkT2JqZWN0JiYocy5yZW1vdmVP
YnNlcnZlcih0aGlzLm9ic2VydmVkT2JqZWN0LHRoaXMub2JzZXJ2ZWRLZXksdGhpcyx0aGlzLm5v
dGlmeSksdGhpcy5vYnNlcnZlZE9iamVjdD1udWxsLHRoaXMub2JzZXJ2ZWRLZXk9bnVsbCl9fSks
ZD1mdW5jdGlvbihlKXt2YXIgdD1lWzBdLHI9ZVsxXSxuPWwodCxyKTtyZXR1cm4gbn07ZS5kZWZh
dWx0PWN9KSxlKCJlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9pbnB1dCIsWyJleHBvcnRzIiwiZW1i
ZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9hc3NpZ24iXSxmdW5jdGlvbihlLHQscil7InVz
ZSBzdHJpY3QiO2UuZGVmYXVsdD17c2V0dXBTdGF0ZTpmdW5jdGlvbihlLHQsbyxhLHMpe3ZhciB1
PXQuaG9va3MuZ2V0VmFsdWUocy50eXBlKSxsPWlbdV18fG47cmV0dXJuIHIuZGVmYXVsdCh7fSxl
LHtjb21wb25lbnROYW1lOmx9KX0scmVuZGVyOmZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyl7dC5o
b29rcy5jb21wb25lbnQoZSx0LHIsZS5nZXRTdGF0ZSgpLmNvbXBvbmVudE5hbWUsbixpLHtkZWZh
dWx0Om8saW52ZXJzZTphfSxzKX0scmVyZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlci5hcHBs
eSh0aGlzLGFyZ3VtZW50cyl9fTt2YXIgbj0iLXRleHQtZmllbGQiLGk9e2NoZWNrYm94OiItY2hl
Y2tib3gifX0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL211dCIsWyJleHBvcnRzIiwiZW1i
ZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9zeW1ib2wiLCJlbWJlci1tZXRhbC9zdHJlYW1z
L3Byb3h5LXN0cmVhbSIsImVtYmVyLW1ldGFsL3N0cmVhbXMvc3RyZWFtIiwiZW1iZXItbWV0YWwv
c3RyZWFtcy91dGlscyIsImVtYmVyLXZpZXdzL2NvbXBhdC9hdHRycy1wcm94eSIsImVtYmVyLXJv
dXRpbmctaHRtbGJhcnMva2V5d29yZHMvY2xvc3VyZS1hY3Rpb24iXSxmdW5jdGlvbihlLHQscixu
LGksbyxhLHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUsdCxyLG4saSxvLGEpe2lmKG51bGw9
PT1lKXt2YXIgcz1uWzBdO3JldHVybiBjKHQuaG9va3MuZ2V0VmFsdWUscyl9cmV0dXJuITB9ZnVu
Y3Rpb24gbChlLHQscixuLGksbyxhKXtpZihudWxsPT09ZSl7dmFyIHM9blswXTtyZXR1cm4gYyh0
Lmhvb2tzLmdldFZhbHVlLHMsITApfXJldHVybiEwfWZ1bmN0aW9uIGMoZSx0LHIpe2lmKHImJiFv
LmlzU3RyZWFtKHQpKXt2YXIgbj10O3Q9bmV3IGgobil9cmV0dXJuIHRbZF0/dDpuZXcgcCh0KX12
YXIgZjtlLmRlZmF1bHQ9dSxlLnByaXZhdGVNdXQ9bDt2YXIgZD1yLmRlZmF1bHQoIk1VVEFCTEVf
UkVGRVJFTkNFIik7ZS5NVVRBQkxFX1JFRkVSRU5DRT1kO3ZhciBwPW4uZGVmYXVsdC5leHRlbmQo
KGY9e2luaXQ6ZnVuY3Rpb24oZSl7dGhpcy5sYWJlbD0iKG11dCAiK2UubGFiZWwrIikiLHRoaXMu
cGF0aD1lLnBhdGgsdGhpcy5zb3VyY2VEZXA9dGhpcy5hZGRNdXRhYmxlRGVwZW5kZW5jeShlKSx0
aGlzW2RdPSEwfSxjZWxsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUudmFsdWUoKTtpZih0JiZ0
W3MuQUNUSU9OXSlyZXR1cm4gdDt2YXIgcj17dmFsdWU6dCx1cGRhdGU6ZnVuY3Rpb24odCl7ZS5z
ZXRWYWx1ZSh0KX19O3JldHVybiByW2EuTVVUQUJMRV9DRUxMXT0hMCxyfX0sZltzLklOVk9LRV09
ZnVuY3Rpb24oZSl7dGhpcy5zZXRWYWx1ZShlKX0sZikpLGg9aS5kZWZhdWx0LmV4dGVuZCh7aW5p
dDpmdW5jdGlvbihlKXt0aGlzLmxpdGVyYWw9ZSx0aGlzLmxhYmVsPSIobGl0ZXJhbCAiK2UrIiki
fSxjb21wdXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGl0ZXJhbH0sc2V0VmFsdWU6ZnVuY3Rp
b24oZSl7dGhpcy5saXRlcmFsPWUsdGhpcy5ub3RpZnkoKX19KX0pLGUoImVtYmVyLWh0bWxiYXJz
L2tleXdvcmRzL291dGxldCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL3ZpZXctbm9k
ZS1tYW5hZ2VyIiwiZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVzL3RvcC1sZXZlbC12aWV3IiwiZW1i
ZXItbWV0YWwvZmVhdHVyZXMiXSxmdW5jdGlvbihlLHQscixuLGksbyl7InVzZSBzdHJpY3QiO2Z1
bmN0aW9uIGEoZSl7cmV0dXJuIWV8fCFlLnJlbmRlci5WaWV3Q2xhc3MmJiFlLnJlbmRlci50ZW1w
bGF0ZX1mdW5jdGlvbiBzKGUsdCl7aWYoIWUmJiF0KXJldHVybiEwO2lmKCFlfHwhdClyZXR1cm4h
MTtlPWUucmVuZGVyLHQ9dC5yZW5kZXI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0
eShyKSYmZVtyXSE9PXRbcl0mJiJuYW1lIiE9PXIpcmV0dXJuITE7cmV0dXJuITB9aS5kZWZhdWx0
Lm1ldGEucmV2aXNpb249IkVtYmVyQDIuNi4yIixlLmRlZmF1bHQ9e3dpbGxSZW5kZXI6ZnVuY3Rp
b24oZSx0KXt0LnZpZXcub3duZXJWaWV3Ll9vdXRsZXRzLnB1c2goZSl9LHNldHVwU3RhdGU6ZnVu
Y3Rpb24oZSx0LHIsbixpKXt2YXIgbz10Lm91dGxldFN0YXRlLGE9dC5ob29rcy5nZXRWYWx1ZSxz
PWEoblswXSl8fCJtYWluIix1PW9bc107cmV0dXJue291dGxldFN0YXRlOnUsaGFzUGFyZW50T3V0
bGV0OnQuaGFzUGFyZW50T3V0bGV0LG1hbmFnZXI6ZS5tYW5hZ2VyfX0sY2hpbGRFbnY6ZnVuY3Rp
b24oZSx0KXt2YXIgcj1lLm91dGxldFN0YXRlLG49ciYmci5yZW5kZXIsaT1uJiZuLnRlbXBsYXRl
JiZuLnRlbXBsYXRlLm1ldGE7cmV0dXJuIHQuY2hpbGRXaXRoT3V0bGV0U3RhdGUociYmci5vdXRs
ZXRzLCEwLGkpfSxpc1N0YWJsZTpmdW5jdGlvbihlLHQpe3JldHVybiBzKGUub3V0bGV0U3RhdGUs
dC5vdXRsZXRTdGF0ZSl9LGlzRW1wdHk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZS5vdXRsZXRTdGF0
ZSl9LHJlbmRlcjpmdW5jdGlvbihlLHQsaSxvLGEscyx1LGwpe3ZhciBjPWUuZ2V0U3RhdGUoKSxm
PXQudmlldyxkPWMub3V0bGV0U3RhdGUscD1kLnJlbmRlcixoPXQub3duZXIubG9va3VwKCJhcHBs
aWNhdGlvbjptYWluIiksbT0oci5nZXQoaCwiTE9HX1ZJRVdfTE9PS1VQUyIpLGQucmVuZGVyLlZp
ZXdDbGFzcyk7Yy5oYXNQYXJlbnRPdXRsZXR8fG18fChtPXQub3duZXIuX2xvb2t1cEZhY3Rvcnko
InZpZXc6dG9wbGV2ZWwiKSk7dmFyIHYsYixnPXt9O3Y/KGI9e2NvbXBvbmVudDp2fSxnPXAuYXR0
cnMpOihiPXtjb21wb25lbnQ6bSxzZWxmOnAuY29udHJvbGxlcixjcmVhdGVPcHRpb25zOntjb250
cm9sbGVyOnAuY29udHJvbGxlcn19LHM9c3x8cC50ZW1wbGF0ZSYmcC50ZW1wbGF0ZS5yYXcpLGMu
bWFuYWdlciYmKGMubWFuYWdlci5kZXN0cm95KCksYy5tYW5hZ2VyPW51bGwpO3ZhciB5PW4uZGVm
YXVsdC5jcmVhdGUoZSx0LGcsYixmLG51bGwsbnVsbCxzKTtjLm1hbmFnZXI9eSx5LnJlbmRlcih0
LGEsbCl9fX0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3BhcnRpYWwiLFsiZXhwb3J0cyIs
ImVtYmVyLXZpZXdzL3N5c3RlbS9sb29rdXBfcGFydGlhbCIsImh0bWxiYXJzLXJ1bnRpbWUiXSxm
dW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD17c2V0dXBTdGF0ZTpmdW5jdGlv
bihlLHQscixuLGkpe3JldHVybntwYXJ0aWFsTmFtZTp0Lmhvb2tzLmdldFZhbHVlKG5bMF0pfX0s
cmVuZGVyOmZ1bmN0aW9uKGUsbixpLG8sYSxzLHUsbCl7dmFyIGM9ZS5nZXRTdGF0ZSgpO2lmKCFj
LnBhcnRpYWxOYW1lKXJldHVybiEwO3ZhciBmPXQuZGVmYXVsdChuLGMucGFydGlhbE5hbWUpO3Jl
dHVybiFmfHx2b2lkIHIuaW50ZXJuYWwuaG9zdEJsb2NrKGUsbixpLGYucmF3LG51bGwsbnVsbCxs
LGZ1bmN0aW9uKGUpe2UudGVtcGxhdGVzLnRlbXBsYXRlLnlpZWxkKCl9KX19fSksZSgiZW1iZXIt
aHRtbGJhcnMva2V5d29yZHMvcmVhZG9ubHkiLFsiZXhwb3J0cyIsImVtYmVyLWh0bWxiYXJzL2tl
eXdvcmRzL211dCJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSxyLG4s
aSxvLGEscyl7aWYobnVsbD09PWUpe3ZhciB1PWlbMF07cmV0dXJuIHUmJnVbdC5NVVRBQkxFX1JF
RkVSRU5DRV0/dS5zb3VyY2VEZXAuZGVwZW5kZWU6dX1yZXR1cm4hMH1lLmRlZmF1bHQ9cn0pLGUo
ImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3RleHRhcmVhIixbImV4cG9ydHMiXSxmdW5jdGlvbihl
KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlLHQscixuLGksbyxhLHMpe3JldHVybiB0Lmhvb2tz
LmNvbXBvbmVudChlLHQsciwiLXRleHQtYXJlYSIsbixpLHtkZWZhdWx0Om8saW52ZXJzZTphfSxz
KSwhMH1lLmRlZmF1bHQ9dH0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3VuYm91bmQiLFsi
ZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0i
LCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJp
Y3QiO2Z1bmN0aW9uIGkoZSx0LHIsbixpLGEscyx1KXtpZihudWxsPT09ZSlyZXR1cm4gbmV3IG8o
blswXSk7dmFyIGw9dm9pZCAwO3JldHVybiBlLmxpbmtlZFJlc3VsdD9sPWUubGlua2VkUmVzdWx0
OihsPW5ldyBvKG5bMF0pLGUubGlua2VkUmVzdWx0PWwpLHQuaG9va3MucmFuZ2UoZSx0LHIsbnVs
bCxsLHUpLCEwfWUuZGVmYXVsdD1pO3ZhciBvPXIuZGVmYXVsdC5leHRlbmQoe2luaXQ6ZnVuY3Rp
b24oZSl7dGhpcy5sYWJlbD0iKHZvbGF0aWxlICIrZS5sYWJlbCsiKSIsdGhpcy5zb3VyY2U9ZSx0
aGlzLmFkZERlcGVuZGVuY3koZSl9LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucmVhZCh0aGlz
LnNvdXJjZSl9LG5vdGlmeTpmdW5jdGlvbigpe319KX0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdv
cmRzL3ZpZXciLFsiZXhwb3J0cyIsImVtYmVyLXZpZXdzL3N0cmVhbXMvdXRpbHMiLCJlbWJlci12
aWV3cy92aWV3cy92aWV3IiwiZW1iZXItaHRtbGJhcnMvbm9kZS1tYW5hZ2Vycy92aWV3LW5vZGUt
bWFuYWdlciJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsbil7
dmFyIGk7cmV0dXJuIGk9ZT90LnJlYWRWaWV3RmFjdG9yeShlLG4pOm4/bi5fbG9va3VwRmFjdG9y
eSgidmlldzp0b3BsZXZlbCIpOnIuZGVmYXVsdH1mdW5jdGlvbiBvKGUsdCxyKXt2YXIgbj17fTtm
b3IodmFyIGkgaW4gZSlpPT09dD9uW3JdPWVbaV06bltpXT1lW2ldO3JldHVybiBufWUuZGVmYXVs
dD17c2V0dXBTdGF0ZTpmdW5jdGlvbihlLHQscixuLG8pe3ZhciBhPXQuaG9va3MuZ2V0VmFsdWUs
cz1hKHIuZ2V0U2VsZigpKSx1PWUudmlld0NsYXNzT3JJbnN0YW5jZTt1fHwodT1pKGEoblswXSks
dC5vd25lcikpO3ZhciBsPXIuaGFzTG9jYWwoInZpZXciKT9udWxsOmEoci5nZXRTZWxmKCkpO3Jl
dHVybnttYW5hZ2VyOmUubWFuYWdlcixwYXJlbnRWaWV3OnQudmlldyxjb250cm9sbGVyOmwsdGFy
Z2V0T2JqZWN0OnMsdmlld0NsYXNzT3JJbnN0YW5jZTp1fX0scmVyZW5kZXI6ZnVuY3Rpb24oZSx0
LHIsbixpLG8sYSxzKXtpZihPYmplY3Qua2V5cyhpKS5sZW5ndGgpcmV0dXJuIGUuZ2V0U3RhdGUo
KS5tYW5hZ2VyLnJlcmVuZGVyKHQsaSxzLCEwKX0scmVuZGVyOmZ1bmN0aW9uKGUsdCxyLGksYSxz
LHUsbCl7YS50YWcmJihhPW8oYSwidGFnIiwidGFnTmFtZSIpKSxhLmNsYXNzTmFtZUJpbmRpbmdz
JiYoYS5jbGFzc05hbWVCaW5kaW5ncz1hLmNsYXNzTmFtZUJpbmRpbmdzLnNwbGl0KCIgIikpO3Zh
ciBjPWUuZ2V0U3RhdGUoKSxmPWMucGFyZW50VmlldyxkPXtjb21wb25lbnQ6Yy52aWV3Q2xhc3NP
ckluc3RhbmNlLGxheW91dDpudWxsfTtkLmNyZWF0ZU9wdGlvbnM9e30sYy5jb250cm9sbGVyJiYo
ZC5jcmVhdGVPcHRpb25zLl9jb250cm9sbGVyPWMuY29udHJvbGxlciksYy50YXJnZXRPYmplY3Qm
JihkLmNyZWF0ZU9wdGlvbnMuX3RhcmdldE9iamVjdD1jLnRhcmdldE9iamVjdCksYy5tYW5hZ2Vy
JiYoYy5tYW5hZ2VyLmRlc3Ryb3koKSxjLm1hbmFnZXI9bnVsbCk7dmFyIHA9bi5kZWZhdWx0LmNy
ZWF0ZShlLHQsYSxkLGYsbnVsbCxyLHMpO2MubWFuYWdlcj1wLHAucmVuZGVyKHQsYSxsKX19fSks
ZSgiZW1iZXItaHRtbGJhcnMva2V5d29yZHMvd2l0aCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
ZGVidWciLCJodG1sYmFycy1ydW50aW1lIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijtl
LmRlZmF1bHQ9e2lzU3RhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzRW1wdHk6ZnVuY3Rpb24o
ZSl7cmV0dXJuITF9LHJlbmRlcjpmdW5jdGlvbihlLHQsbixpLG8sYSxzLHUpe3IuaW50ZXJuYWwu
Y29udGludWVCbG9jayhlLHQsbiwid2l0aCIsaSxvLGEscyx1KX0scmVyZW5kZXI6ZnVuY3Rpb24o
ZSx0LG4saSxvLGEscyx1KXtyLmludGVybmFsLmNvbnRpbnVlQmxvY2soZSx0LG4sIndpdGgiLGks
byxhLHMsdSl9fX0pLGUoImVtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3lpZWxkIixbImV4cG9ydHMi
XSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlLHQscixuLGksbyxhLHMpe3Zh
ciB1PXQuaG9va3MuZ2V0VmFsdWUoaS50byl8fCJkZWZhdWx0IixsPXIuZ2V0QmxvY2sodSk7cmV0
dXJuIGwmJmwuaW52b2tlKHQsbixpLnNlbGYsZSxyLHMpLCEwfWUuZGVmYXVsdD10fSksZSgiZW1i
ZXItaHRtbGJhcnMvbW9ycGhzL2F0dHItbW9ycGgiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Rl
YnVnIiwiZG9tLWhlbHBlciIsImVtYmVyLW1ldGFsL2lzX25vbmUiXSxmdW5jdGlvbihlLHQscixu
KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQpe312YXIgbz1yLmRlZmF1bHQucHJvdG90eXBl
LkF0dHJNb3JwaENsYXNzLGE9IkJpbmRpbmcgc3R5bGUgYXR0cmlidXRlcyBtYXkgaW50cm9kdWNl
IGNyb3NzLXNpdGUgc2NyaXB0aW5nIHZ1bG5lcmFiaWxpdGllczsgcGxlYXNlIGVuc3VyZSB0aGF0
IHZhbHVlcyBiZWluZyBib3VuZCBhcmUgcHJvcGVybHkgZXNjYXBlZC4gRm9yIG1vcmUgaW5mb3Jt
YXRpb24sIGluY2x1ZGluZyBob3cgdG8gZGlzYWJsZSB0aGlzIHdhcm5pbmcsIHNlZSBodHRwOi8v
ZW1iZXJqcy5jb20vZGVwcmVjYXRpb25zL3YxLngvI3RvY19iaW5kaW5nLXN0eWxlLWF0dHJpYnV0
ZXMuIjtlLnN0eWxlV2FybmluZz1hO3ZhciBzPW8ucHJvdG90eXBlO3MuZGlkSW5pdD1mdW5jdGlv
bigpe3RoaXMuc3RyZWFtVW5zdWJzY3JpYmVycz1udWxsfSxzLndpbGxTZXRDb250ZW50PWZ1bmN0
aW9uKGUpe2kodGhpcyxlKX0sZS5kZWZhdWx0PW99KSxlKCJlbWJlci1odG1sYmFycy9tb3JwaHMv
bW9ycGgiLFsiZXhwb3J0cyIsImRvbS1oZWxwZXIiLCJlbWJlci1tZXRhbC9kZWJ1ZyJdLGZ1bmN0
aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3RoaXMuSFRNTEJhcnNNb3Jw
aCRjb25zdHJ1Y3RvcihlLHQpLHRoaXMuZW1iZXJWaWV3PW51bGwsdGhpcy5lbWJlclRvRGVzdHJv
eT1udWxsLHRoaXMuc3RyZWFtVW5zdWJzY3JpYmVycz1udWxsLHRoaXMuZ3VpZD1vKyssdGhpcy5z
aG91bGRSZWNlaXZlQXR0cnM9ITF9dmFyIGk9dC5kZWZhdWx0LnByb3RvdHlwZS5Nb3JwaENsYXNz
LG89MSxhPW4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpO2EuSFRNTEJhcnNN
b3JwaCRjb25zdHJ1Y3Rvcj1pLGEuSFRNTEJhcnNNb3JwaCRjbGVhcj1pLnByb3RvdHlwZS5jbGVh
cixhLmFkZERlc3RydWN0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuZW1iZXJUb0Rlc3Ryb3k9dGhpcy5l
bWJlclRvRGVzdHJveXx8W10sdGhpcy5lbWJlclRvRGVzdHJveS5wdXNoKGUpfSxhLmNsZWFudXA9
ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVtYmVyVmlldztpZihlKXt2YXIgdD1lLnBhcmVudFZpZXc7
dCYmZS5vd25lclZpZXcuX2Rlc3Ryb3lpbmdTdWJ0cmVlRm9yVmlldz09PXQmJnQucmVtb3ZlQ2hp
bGQoZSl9dmFyIHI9dGhpcy5lbWJlclRvRGVzdHJveTtpZihyKXtmb3IodmFyIG49MCxpPXIubGVu
Z3RoO248aTtuKyspcltuXS5kZXN0cm95KCk7dGhpcy5lbWJlclRvRGVzdHJveT1udWxsfX0sYS5k
aWRSZW5kZXI9ZnVuY3Rpb24oZSx0KXtlLnJlbmRlcmVkTm9kZXMuYWRkKHRoaXMpfSxlLmRlZmF1
bHQ9bn0pLGUoImVtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvY29tcG9uZW50LW5vZGUtbWFu
YWdlciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci12aWV3cy9zeXN0ZW0v
YnVpbGQtY29tcG9uZW50LXRlbXBsYXRlIiwiZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LWNlbGwt
b3ItdmFsdWUiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0
eV9zZXQiLCJlbWJlci12aWV3cy9jb21wYXQvYXR0cnMtcHJveHkiLCJlbWJlci1odG1sYmFycy9z
eXN0ZW0vaW5zdHJ1bWVudGF0aW9uLXN1cHBvcnQiLCJlbWJlci12aWV3cy9jb21wb25lbnRzL2Nv
bXBvbmVudCIsImVtYmVyLWh0bWxiYXJzL2dsaW1tZXItY29tcG9uZW50IiwiZW1iZXItaHRtbGJh
cnMvdXRpbHMvZXh0cmFjdC1wb3NpdGlvbmFsLXBhcmFtcyIsImVtYmVyLW1ldGFsL3N5bWJvbCIs
ImNvbnRhaW5lci9vd25lciIsImVtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC12YWx1ZSJdLGZ1bmN0
aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGgo
ZSx0LHIsbixpLG8sYSl7dGhpcy5jb21wb25lbnQ9ZSx0aGlzLmlzQW5nbGVCcmFja2V0PXQsdGhp
cy5zY29wZT1yLHRoaXMucmVuZGVyTm9kZT1uLHRoaXMuYXR0cnM9aSx0aGlzLmJsb2NrPW8sdGhp
cy5leHBlY3RFbGVtZW50PWF9ZnVuY3Rpb24gbShlLHQscixuLGkpe24/aS50YWdOYW1lPXQ6ZS50
YWdOYW1lJiYoaS50YWdOYW1lPXAuZGVmYXVsdChlLnRhZ05hbWUpKX1mdW5jdGlvbiB2KGUsdCl7
ZS5pZCYmKHQuZWxlbWVudElkPXAuZGVmYXVsdChlLmlkKSksZS5fZGVmYXVsdFRhZ05hbWUmJih0
Ll9kZWZhdWx0VGFnTmFtZT1wLmRlZmF1bHQoZS5fZGVmYXVsdFRhZ05hbWUpKSxlLnZpZXdOYW1l
JiYodC52aWV3TmFtZT1wLmRlZmF1bHQoZS52aWV3TmFtZSkpfWZ1bmN0aW9uIGIoZSl7Zm9yKHZh
ciB0PWU7dDspe2lmKDE9PT10Lm5vZGVUeXBlKXJldHVybiB0O3Q9ZS5uZXh0U2libGluZ319ZnVu
Y3Rpb24gZyhlLHQscixuLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg8PTV8fHZvaWQgMD09PWFy
Z3VtZW50c1s1XT97fTphcmd1bWVudHNbNV07dD8oci5hdHRycz15KGEpLHIuX2lzQW5nbGVCcmFj
a2V0PSEwKTp3KGEsciksZC5zZXRPd25lcihyLGkub3duZXIpLHIucmVuZGVyZXI9ci5wYXJlbnRW
aWV3P3IucGFyZW50Vmlldy5yZW5kZXJlcjppLm93bmVyLmxvb2t1cCgicmVuZGVyZXI6LWRvbSIp
LHIuX3ZpZXdSZWdpc3RyeT1yLnBhcmVudFZpZXc/ci5wYXJlbnRWaWV3Ll92aWV3UmVnaXN0cnk6
aS5vd25lci5sb29rdXAoIi12aWV3LXJlZ2lzdHJ5Om1haW4iKTt2YXIgcz1lLmNyZWF0ZShyKTty
ZXR1cm4gci5wYXJlbnRWaWV3JiYoci5wYXJlbnRWaWV3LmFwcGVuZENoaWxkKHMpLHIudmlld05h
bWUmJm8uc2V0KHIucGFyZW50VmlldyxyLnZpZXdOYW1lLHMpKSxzLl9yZW5kZXJOb2RlPW4sbi5l
bWJlclZpZXc9cyxuLmJ1aWxkQ2hpbGRFbnY9eCxzfWZ1bmN0aW9uIHkoZSl7dmFyIHQ9e307Zm9y
KHZhciByIGluIGUpdFtyXT1uLmRlZmF1bHQoZVtyXSk7cmV0dXJuIHR9ZnVuY3Rpb24gXyhlKXt2
YXIgdD17fTtmb3IodmFyIHIgaW4gZSl0W3JdPXAuZGVmYXVsdChlW3JdKTtyZXR1cm4gdH1mdW5j
dGlvbiB3KGUsdCl7dmFyIHI9e307Zm9yKHZhciBpIGluIGUpe3ZhciBvPW4uZGVmYXVsdChlW2ld
KTtyW2ldPW8sImF0dHJzIiE9PWkmJihvJiZvW2EuTVVUQUJMRV9DRUxMXSYmKG89by52YWx1ZSks
dFtpXT1vKX1yZXR1cm4gdC5hdHRycz1yfWZ1bmN0aW9uIHgoZSx0KXtyZXR1cm4gdC5jaGlsZFdp
dGhWaWV3KHRoaXMuZW1iZXJWaWV3KX1lLmNyZWF0ZUNvbXBvbmVudD1nLGUudGFrZUxlZ2FjeVNu
YXBzaG90PV87dmFyIGs9Zi5kZWZhdWx0KCJIQVNfQkxPQ0siKTtlLkhBU19CTE9DSz1rLGUuZGVm
YXVsdD1oLGguY3JlYXRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxhPW4udGFnTmFtZSxzPW4ucGFy
YW1zLGY9bi5hdHRycyxkPXZvaWQgMD09PWY/e306ZixiPW4ucGFyZW50Vmlldyx5PW4ucGFyZW50
U2NvcGUsXz1uLmlzQW5nbGVCcmFja2V0LHc9bi5jb21wb25lbnQseD1uLmxheW91dCxDPW4udGVt
cGxhdGVzO3c9d3x8KF8/bC5kZWZhdWx0OnUuZGVmYXVsdCk7dmFyIEU9KG89e3BhcmVudFZpZXc6
Yn0sb1trXT0hIUMuZGVmYXVsdCxvKTttKGQsYSx3LF8sRSksdihkLEUpLHkuaGFzTG9jYWwoImNv
bnRyb2xsZXIiKT9FLl9jb250cm9sbGVyPXAuZGVmYXVsdCh5LmdldExvY2FsKCJjb250cm9sbGVy
IikpOkUuX3RhcmdldE9iamVjdD1wLmRlZmF1bHQoeS5nZXRTZWxmKCkpLGMuZGVmYXVsdChlLHcs
cyxkKSx3PWcodyxfLEUsZSx0LGQpLHh8fCh4PWkuZ2V0KHcsImxheW91dCIpKTt2YXIgTz1yLmRl
ZmF1bHQoe2xheW91dDp4LGNvbXBvbmVudDp3LGlzQW5nbGVCcmFja2V0Ol99LGQse3RlbXBsYXRl
czpDLHNjb3BlOnl9KTtyZXR1cm4gbmV3IGgodyxfLHksZSxkLE8uYmxvY2ssTy5jcmVhdGVkRWxl
bWVudCl9LGgucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuY29tcG9u
ZW50O3JldHVybiBzLmluc3RydW1lbnQocixmdW5jdGlvbigpe3ZhciBuPXRoaXMuYmxvY2smJnRo
aXMuYmxvY2sudGVtcGxhdGUubWV0YSxpPWUuY2hpbGRXaXRoVmlldyhyLG4pO2kucmVuZGVyZXIu
Y29tcG9uZW50V2lsbFJlbmRlcihyKSxpLnJlbmRlcmVkVmlld3MucHVzaChyLmVsZW1lbnRJZCks
dGhpcy5ibG9jayYmdGhpcy5ibG9jay5pbnZva2UoaSxbXSx2b2lkIDAsdGhpcy5yZW5kZXJOb2Rl
LHRoaXMuc2NvcGUsdCk7dmFyIG89dm9pZCAwOyh0aGlzLmV4cGVjdEVsZW1lbnR8fHIuaXNHbGlt
bWVyQ29tcG9uZW50KSYmKG89dGhpcy5yZW5kZXJOb2RlLmZpcnN0Tm9kZSxvJiYxIT09by5ub2Rl
VHlwZSYmKG89YihvKSkpLGkuZGVzdGluZWRGb3JET00mJihpLnJlbmRlcmVyLmRpZENyZWF0ZUVs
ZW1lbnQocixvKSxpLnJlbmRlcmVyLndpbGxJbnNlcnRFbGVtZW50KHIsbyksaS5saWZlY3ljbGVI
b29rcy5wdXNoKHt0eXBlOiJkaWRJbnNlcnRFbGVtZW50Iix2aWV3OnJ9KSl9LHRoaXMpfSxoLnBy
b3RvdHlwZS5yZXJlbmRlcj1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcy5jb21wb25lbnQ7cmV0
dXJuIHMuaW5zdHJ1bWVudChuLGZ1bmN0aW9uKCl7dmFyIGk9ZS5jaGlsZFdpdGhWaWV3KG4pLG89
eSh0KTtyZXR1cm4gbi5fcmVuZGVyTm9kZS5zaG91bGRSZWNlaXZlQXR0cnMmJihuLl9wcm9wYWdh
dGVBdHRyc1RvVGhpcyYmbi5fcHJvcGFnYXRlQXR0cnNUb1RoaXMoXyh0KSksaS5yZW5kZXJlci5j
b21wb25lbnRVcGRhdGVBdHRycyhuLG8pLG4uX3JlbmRlck5vZGUuc2hvdWxkUmVjZWl2ZUF0dHJz
PSExKSxpLnJlbmRlcmVyLmNvbXBvbmVudFdpbGxVcGRhdGUobixvKSxpLnJlbmRlcmVyLmNvbXBv
bmVudFdpbGxSZW5kZXIobiksaS5yZW5kZXJlZFZpZXdzLnB1c2gobi5lbGVtZW50SWQpLHRoaXMu
YmxvY2smJnRoaXMuYmxvY2suaW52b2tlKGksW10sdm9pZCAwLHRoaXMucmVuZGVyTm9kZSx0aGlz
LnNjb3BlLHIpLGkubGlmZWN5Y2xlSG9va3MucHVzaCh7dHlwZToiZGlkVXBkYXRlIix2aWV3Om59
KSxpfSx0aGlzKX0saC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY29t
cG9uZW50O2UuX3JlbmRlck5vZGU9bnVsbCxlLmRlc3Ryb3koKX19KSxlKCJlbWJlci1odG1sYmFy
cy9ub2RlLW1hbmFnZXJzL3ZpZXctbm9kZS1tYW5hZ2VyIixbImV4cG9ydHMiLCJlbWJlci1tZXRh
bC9hc3NpZ24iLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLXZpZXdzL3N5c3RlbS9idWlsZC1j
b21wb25lbnQtdGVtcGxhdGUiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRh
bC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9zZXRfcHJvcGVydGllcyIsImVtYmVyLXZpZXdz
L3ZpZXdzL3ZpZXciLCJlbWJlci12aWV3cy9jb21wYXQvYXR0cnMtcHJveHkiLCJlbWJlci1odG1s
YmFycy9ob29rcy9nZXQtY2VsbC1vci12YWx1ZSIsImVtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnN0
cnVtZW50YXRpb24tc3VwcG9ydCIsImVtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvY29tcG9u
ZW50LW5vZGUtbWFuYWdlciIsImNvbnRhaW5lci9vd25lciIsImVtYmVyLWh0bWxiYXJzL2hvb2tz
L2dldC12YWx1ZSJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCl7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIGgoZSx0LHIsbixpKXt0aGlzLmNvbXBvbmVudD1lLHRoaXMuc2NvcGU9
dCx0aGlzLnJlbmRlck5vZGU9cix0aGlzLmJsb2NrPW4sdGhpcy5leHBlY3RFbGVtZW50PWl9ZnVu
Y3Rpb24gbShlKXtyZXR1cm4gZS5pc0NvbXBvbmVudD9udWxsOmkuZ2V0KGUsInRlbXBsYXRlIil9
ZnVuY3Rpb24gdihlLHIsbixpLHUpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg8PTV8fHZvaWQgMD09
PWFyZ3VtZW50c1s1XT97fTphcmd1bWVudHNbNV0sYz1iKGwpLHA9dC5kZWZhdWx0KHt9LHIpLGg9
cy5kZWZhdWx0LnByb3RvKCkuY29udHJvbGxlcixtPSJjb250cm9sbGVyImluIGx8fCJjb250cm9s
bGVyImluIHA7aWYoIXAub3duZXJWaWV3JiZyLnBhcmVudFZpZXcmJihwLm93bmVyVmlldz1yLnBh
cmVudFZpZXcub3duZXJWaWV3KSxwLmF0dHJzPWMsZS5jcmVhdGUpe3ZhciB2PWUucHJvdG8oKTtu
JiZ0LmRlZmF1bHQocCxuKSxnKHAsYyk7dmFyIHk9dS5vd25lcjtkLnNldE93bmVyKHAseSkscC5y
ZW5kZXJlcj1yLnBhcmVudFZpZXc/ci5wYXJlbnRWaWV3LnJlbmRlcmVyOnkmJnkubG9va3VwKCJy
ZW5kZXJlcjotZG9tIikscC5fdmlld1JlZ2lzdHJ5PXIucGFyZW50Vmlldz9yLnBhcmVudFZpZXcu
X3ZpZXdSZWdpc3RyeTp5JiZ5Lmxvb2t1cCgiLXZpZXctcmVnaXN0cnk6bWFpbiIpLCh2LmNvbnRy
b2xsZXIhPT1ofHxtKSYmZGVsZXRlIHAuX2NvbnRleHQsZT1lLmNyZWF0ZShwKX1lbHNlIHUucmVu
ZGVyZXIuY29tcG9uZW50VXBkYXRlQXR0cnMoZSxjKSxhLmRlZmF1bHQoZSxwKSxlLl9wcm9wYWdh
dGVBdHRyc1RvVGhpcyYmZS5fcHJvcGFnYXRlQXR0cnNUb1RoaXMoZi50YWtlTGVnYWN5U25hcHNo
b3QobCkpO3JldHVybiByLnBhcmVudFZpZXcmJihyLnBhcmVudFZpZXcuYXBwZW5kQ2hpbGQoZSks
ci52aWV3TmFtZSYmby5zZXQoci5wYXJlbnRWaWV3LHIudmlld05hbWUsZSkpLGUuX3JlbmRlck5v
ZGU9aSxpLmVtYmVyVmlldz1lLGV9ZnVuY3Rpb24gYihlKXt2YXIgdD17fTtmb3IodmFyIHIgaW4g
ZSl0W3JdPWwuZGVmYXVsdChlW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiBnKGUsdCl7Zm9yKHZhciBy
IGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmImF0dHJzIiE9PXIpe3ZhciBuPXRbcl07biYm
blt1Lk1VVEFCTEVfQ0VMTF0/ZVtyXT1uLnZhbHVlOmVbcl09bn1yZXR1cm4gZX1lLmNyZWF0ZU9y
VXBkYXRlQ29tcG9uZW50PXYsZS5kZWZhdWx0PWgsaC5jcmVhdGU9ZnVuY3Rpb24oZSx0LHIsbyxh
LHMsdSxsKXt2YXIgYyxmPXtsYXlvdXQ6by5sYXlvdXR9O2lmKG8uY29tcG9uZW50KXt2YXIgZD17
cGFyZW50VmlldzphfTtpZihyJiZyLmlkJiYoZC5lbGVtZW50SWQ9cC5kZWZhdWx0KHIuaWQpKSxy
JiZyLnRhZ05hbWUmJihkLnRhZ05hbWU9cC5kZWZhdWx0KHIudGFnTmFtZSkpLHImJnIuX2RlZmF1
bHRUYWdOYW1lJiYoZC5fZGVmYXVsdFRhZ05hbWU9cC5kZWZhdWx0KHIuX2RlZmF1bHRUYWdOYW1l
KSksciYmci52aWV3TmFtZSYmKGQudmlld05hbWU9cC5kZWZhdWx0KHIudmlld05hbWUpKSxvLmNv
bXBvbmVudC5jcmVhdGUmJnUpe3ZhciBiPXUuZ2V0U2VsZigpO2ImJihkLl9jb250ZXh0PXAuZGVm
YXVsdCh1LmdldFNlbGYoKSkpfW8uc2VsZiYmKGQuX2NvbnRleHQ9cC5kZWZhdWx0KG8uc2VsZikp
LGM9Zi5jb21wb25lbnQ9dihvLmNvbXBvbmVudCxkLG8uY3JlYXRlT3B0aW9ucyxlLHQscik7dmFy
IGc9aS5nZXQoYywibGF5b3V0Iik7Zz9mLmxheW91dD1nOmYubGF5b3V0PW0oYyl8fGYubGF5b3V0
LGUuZW1iZXJWaWV3PWN9dmFyIHk9bi5kZWZhdWx0KGYscix7dGVtcGxhdGVzOntkZWZhdWx0Omx9
LHNjb3BlOnUsc2VsZjpvLnNlbGZ9KTtyZXR1cm4gbmV3IGgoYyx1LGUseS5ibG9jayx5LmNyZWF0
ZWRFbGVtZW50KX0saC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlz
LmNvbXBvbmVudDtyZXR1cm4gYy5pbnN0cnVtZW50KG4sZnVuY3Rpb24oKXt2YXIgdD1lO2lmKG4p
dD1lLmNoaWxkV2l0aFZpZXcobik7ZWxzZXt2YXIgaT10aGlzLmJsb2NrJiZ0aGlzLmJsb2NrLnRl
bXBsYXRlLm1ldGE7dD1lLmNoaWxkV2l0aE1ldGEoaSl9aWYobiYmKGUucmVuZGVyZXIud2lsbFJl
bmRlcihuKSxlLnJlbmRlcmVkVmlld3MucHVzaChuLmVsZW1lbnRJZCkpLHRoaXMuYmxvY2smJnRo
aXMuYmxvY2suaW52b2tlKHQsW10sdm9pZCAwLHRoaXMucmVuZGVyTm9kZSx0aGlzLnNjb3BlLHIp
LG4pe3ZhciBvPXRoaXMuZXhwZWN0RWxlbWVudCYmdGhpcy5yZW5kZXJOb2RlLmZpcnN0Tm9kZTtl
LmRlc3RpbmVkRm9yRE9NJiYoZS5yZW5kZXJlci5kaWRDcmVhdGVFbGVtZW50KG4sbyksZS5yZW5k
ZXJlci53aWxsSW5zZXJ0RWxlbWVudChuLG8pLGUubGlmZWN5Y2xlSG9va3MucHVzaCh7dHlwZToi
ZGlkSW5zZXJ0RWxlbWVudCIsdmlldzpufSkpfX0sdGhpcyl9LGgucHJvdG90eXBlLnJlcmVuZGVy
PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzLmNvbXBvbmVudDtyZXR1cm4gYy5pbnN0cnVtZW50
KG4sZnVuY3Rpb24oKXt2YXIgaT1lO2lmKG4pe2k9ZS5jaGlsZFdpdGhWaWV3KG4pO3ZhciBvPWIo
dCk7ZS5yZW5kZXJlci53aWxsVXBkYXRlKG4sbyksbi5fcmVuZGVyTm9kZS5zaG91bGRSZWNlaXZl
QXR0cnMmJihuLl9wcm9wYWdhdGVBdHRyc1RvVGhpcyYmbi5fcHJvcGFnYXRlQXR0cnNUb1RoaXMo
Zi50YWtlTGVnYWN5U25hcHNob3QodCkpLGUucmVuZGVyZXIuY29tcG9uZW50VXBkYXRlQXR0cnMo
bixvKSxuLl9yZW5kZXJOb2RlLnNob3VsZFJlY2VpdmVBdHRycz0hMSksZS5yZW5kZXJlci53aWxs
UmVuZGVyKG4pLGUucmVuZGVyZWRWaWV3cy5wdXNoKG4uZWxlbWVudElkKX1lbHNle3ZhciBhPXRo
aXMuYmxvY2smJnRoaXMuYmxvY2sudGVtcGxhdGUubWV0YTtpPWUuY2hpbGRXaXRoTWV0YShhKX1y
ZXR1cm4gdGhpcy5ibG9jayYmdGhpcy5ibG9jay5pbnZva2UoaSxbXSx2b2lkIDAsdGhpcy5yZW5k
ZXJOb2RlLHRoaXMuc2NvcGUsciksaX0sdGhpcyl9LGgucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rp
b24oKXt0aGlzLmNvbXBvbmVudCYmKHRoaXMuY29tcG9uZW50LmRlc3Ryb3koKSx0aGlzLmNvbXBv
bmVudD1udWxsKX19KSxlKCJlbWJlci1odG1sYmFycy9zdHJlYW1zL2J1aWx0LWluLWhlbHBlciIs
WyJleHBvcnRzIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iLCJlbWJlci1odG1sYmFycy9z
dHJlYW1zL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10LmRlZmF1
bHQuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGUsdCxyLG4saSxvLGEpe3RoaXMuaGVscGVyPWUsdGhp
cy5wYXJhbXM9dCx0aGlzLnRlbXBsYXRlcz1uLHRoaXMuZW52PWksdGhpcy5zY29wZT1vLHRoaXMu
aGFzaD1yLHRoaXMubGFiZWw9YX0sY29tcHV0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlbHBl
cihyLmdldEFycmF5VmFsdWVzKHRoaXMucGFyYW1zKSxyLmdldEhhc2hWYWx1ZXModGhpcy5oYXNo
KSx0aGlzLnRlbXBsYXRlcyx0aGlzLmVudix0aGlzLnNjb3BlKX19KTtlLmRlZmF1bHQ9bn0pLGUo
ImVtYmVyLWh0bWxiYXJzL3N0cmVhbXMvaGVscGVyLWZhY3RvcnkiLFsiZXhwb3J0cyIsImVtYmVy
LW1ldGFsL3N0cmVhbXMvc3RyZWFtIiwiZW1iZXItaHRtbGJhcnMvc3RyZWFtcy91dGlscyJdLGZ1
bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49dC5kZWZhdWx0LmV4dGVuZCh7aW5pdDpm
dW5jdGlvbihlLHQscixuKXt0aGlzLmhlbHBlckZhY3Rvcnk9ZSx0aGlzLnBhcmFtcz10LHRoaXMu
aGFzaD1yLHRoaXMubGlua2FibGU9ITAsdGhpcy5oZWxwZXI9bnVsbCx0aGlzLmxhYmVsPW59LGNv
bXB1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWxwZXJ8fCh0aGlzLmhlbHBlcj10aGlzLmhl
bHBlckZhY3RvcnkuY3JlYXRlKHtfc3RyZWFtOnRoaXN9KSksdGhpcy5oZWxwZXIuY29tcHV0ZShy
LmdldEFycmF5VmFsdWVzKHRoaXMucGFyYW1zKSxyLmdldEhhc2hWYWx1ZXModGhpcy5oYXNoKSl9
LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLnN1cGVyJGRlYWN0aXZhdGUoKSx0aGlzLmhlbHBl
ciYmKHRoaXMuaGVscGVyLmRlc3Ryb3koKSx0aGlzLmhlbHBlcj1udWxsKX0sc3VwZXIkZGVhY3Rp
dmF0ZTp0LmRlZmF1bHQucHJvdG90eXBlLmRlYWN0aXZhdGV9KTtlLmRlZmF1bHQ9bn0pLGUoImVt
YmVyLWh0bWxiYXJzL3N0cmVhbXMvaGVscGVyLWluc3RhbmNlIixbImV4cG9ydHMiLCJlbWJlci1t
ZXRhbC9zdHJlYW1zL3N0cmVhbSIsImVtYmVyLWh0bWxiYXJzL3N0cmVhbXMvdXRpbHMiXSxmdW5j
dGlvbihlLHQscil7CisidXNlIHN0cmljdCI7dmFyIG49dC5kZWZhdWx0LmV4dGVuZCh7aW5pdDpm
dW5jdGlvbihlLHQscixuKXt0aGlzLmhlbHBlcj1lLHRoaXMucGFyYW1zPXQsdGhpcy5oYXNoPXIs
dGhpcy5saW5rYWJsZT0hMCx0aGlzLmxhYmVsPW59LGNvbXB1dGU6ZnVuY3Rpb24oKXtyZXR1cm4g
dGhpcy5oZWxwZXIuY29tcHV0ZShyLmdldEFycmF5VmFsdWVzKHRoaXMucGFyYW1zKSxyLmdldEhh
c2hWYWx1ZXModGhpcy5oYXNoKSl9fSk7ZS5kZWZhdWx0PW59KSxlKCJlbWJlci1odG1sYmFycy9z
dHJlYW1zL3V0aWxzIixbImV4cG9ydHMiLCJlbWJlci1odG1sYmFycy9ob29rcy9nZXQtdmFsdWUi
XSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcih2YXIgcj1lLmxl
bmd0aCxuPW5ldyBBcnJheShyKSxpPTA7aTxyO2krKyluW2ldPXQuZGVmYXVsdChlW2ldKTtyZXR1
cm4gbn1mdW5jdGlvbiBuKGUpe3ZhciByPXt9O2Zvcih2YXIgbiBpbiBlKXJbbl09dC5kZWZhdWx0
KGVbbl0pO3JldHVybiByfWUuZ2V0QXJyYXlWYWx1ZXM9cixlLmdldEhhc2hWYWx1ZXM9bn0pLGUo
ImVtYmVyLWh0bWxiYXJzL3N5c3RlbS9hcHBlbmQtdGVtcGxhdGVkLXZpZXciLFsiZXhwb3J0cyIs
ImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItdmll
d3Mvdmlld3MvdmlldyJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBp
KGUsdCxpLG8pe3ZhciBhO2E9bi5kZWZhdWx0LmRldGVjdEluc3RhbmNlKGkpP2k6aS5wcm90bygp
O3ZhciBzPSFhLmNvbnRyb2xsZXI7cmV0dXJuIGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLmlz
RGVzY3JpcHRvciYmKHM9ITApLCFzfHxhLmNvbnRyb2xsZXJCaW5kaW5nfHxvLmNvbnRyb2xsZXJ8
fG8uY29udHJvbGxlckJpbmRpbmd8fChvLl9jb250ZXh0PXIuZ2V0KGUsImNvbnRleHQiKSksby5f
bW9ycGg9dCxlLmFwcGVuZENoaWxkKGksbyl9ZS5kZWZhdWx0PWl9KSxlKCJlbWJlci1odG1sYmFy
cy9zeXN0ZW0vYm9vdHN0cmFwIixbImV4cG9ydHMiLCJlbWJlci12aWV3cy9jb21wb25lbnRfbG9v
a3VwIiwiZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSIsImVtYmVyLW1ldGFsL2Vycm9yIiwiZW1i
ZXItcnVudGltZS9zeXN0ZW0vbGF6eV9sb2FkIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lz
dGVtL2NvbXBpbGUiLCJlbWJlci1tZXRhbC9lbnZpcm9ubWVudCIsImVtYmVyLWh0bWxiYXJzL3Rl
bXBsYXRlX3JlZ2lzdHJ5Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzKXsidXNlIHN0cmljdCI7
ZnVuY3Rpb24gdShlKXt2YXIgdD0nc2NyaXB0W3R5cGU9InRleHQveC1oYW5kbGViYXJzIl0sIHNj
cmlwdFt0eXBlPSJ0ZXh0L3gtcmF3LWhhbmRsZWJhcnMiXSc7ci5kZWZhdWx0KHQsZSkuZWFjaChm
dW5jdGlvbigpe3ZhciBlLHQsaT1yLmRlZmF1bHQodGhpcyksYT1pLmF0dHIoImRhdGEtdGVtcGxh
dGUtbmFtZSIpfHxpLmF0dHIoImlkIil8fCJhcHBsaWNhdGlvbiI7aWYoInRleHQveC1yYXctaGFu
ZGxlYmFycyI9PT1pLmF0dHIoInR5cGUiKT8odD1yLmRlZmF1bHQucHJveHkoSGFuZGxlYmFycy5j
b21waWxlLEhhbmRsZWJhcnMpLGU9dChpLmh0bWwoKSkpOmU9by5kZWZhdWx0KGkuaHRtbCgpLHtt
b2R1bGVOYW1lOmF9KSxzLmhhcyhhKSl0aHJvdyBuZXcgbi5kZWZhdWx0KCdUZW1wbGF0ZSBuYW1l
ZCAiJythKyciIGFscmVhZHkgZXhpc3RzLicpO3Muc2V0KGEsZSksaS5yZW1vdmUoKX0pfWZ1bmN0
aW9uIGwoKXt1KHIuZGVmYXVsdChkb2N1bWVudCkpfWZ1bmN0aW9uIGMoZSl7ZS5yZWdpc3Rlcigi
Y29tcG9uZW50LWxvb2t1cDptYWluIix0LmRlZmF1bHQpfWkub25Mb2FkKCJFbWJlci5BcHBsaWNh
dGlvbiIsZnVuY3Rpb24oZSl7ZS5pbml0aWFsaXplcih7bmFtZToiZG9tVGVtcGxhdGVzIixpbml0
aWFsaXplOmEuZGVmYXVsdC5oYXNET00/bDpmdW5jdGlvbigpe319KSxlLmluc3RhbmNlSW5pdGlh
bGl6ZXIoe25hbWU6InJlZ2lzdGVyQ29tcG9uZW50TG9va3VwIixpbml0aWFsaXplOmN9KX0pLGUu
ZGVmYXVsdD11fSksZSgiZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxwZXIiLFsiZXhwb3J0
cyIsImRvbS1oZWxwZXIiLCJlbWJlci1odG1sYmFycy9tb3JwaHMvbW9ycGgiLCJlbWJlci1odG1s
YmFycy9tb3JwaHMvYXR0ci1tb3JwaCJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijtm
dW5jdGlvbiBpKGUpe3QuZGVmYXVsdC5jYWxsKHRoaXMsZSl9dmFyIG89aS5wcm90b3R5cGU9T2Jq
ZWN0LmNyZWF0ZSh0LmRlZmF1bHQucHJvdG90eXBlKTtvLk1vcnBoQ2xhc3M9ci5kZWZhdWx0LG8u
QXR0ck1vcnBoQ2xhc3M9bi5kZWZhdWx0LGUuZGVmYXVsdD1pfSksZSgiZW1iZXItaHRtbGJhcnMv
c3lzdGVtL2luc3RydW1lbnRhdGlvbi1zdXBwb3J0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9p
bnN0cnVtZW50YXRpb24iXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs
cixuKXt2YXIgaSxvLGEscztyZXR1cm4gdC5zdWJzY3JpYmVycy5sZW5ndGg/KGk9ZT9lLmluc3Ry
dW1lbnROYW1lOiJub2RlIixhPXt9LGUmJmUuaW5zdHJ1bWVudERldGFpbHMoYSkscz10Ll9pbnN0
cnVtZW50U3RhcnQoInJlbmRlci4iK2ksZnVuY3Rpb24oKXtyZXR1cm4gYX0pLG89ci5jYWxsKG4p
LHMmJnMoKSxvKTpyLmNhbGwobil9ZS5pbnN0cnVtZW50PXJ9KSxlKCJlbWJlci1odG1sYmFycy9z
eXN0ZW0vaW52b2tlLWhlbHBlciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJl
ci1odG1sYmFycy9zdHJlYW1zL2hlbHBlci1pbnN0YW5jZSIsImVtYmVyLWh0bWxiYXJzL3N0cmVh
bXMvaGVscGVyLWZhY3RvcnkiLCJlbWJlci1odG1sYmFycy9zdHJlYW1zL2J1aWx0LWluLWhlbHBl
ciJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0LG8sYSxz
LHUsbCl7ZS5pc0hlbHBlckluc3RhbmNlfHxlLmlzSGVscGVyRmFjdG9yeTtyZXR1cm4gZS5pc0hl
bHBlckZhY3Rvcnk/bmV3IG4uZGVmYXVsdChlLHQsbyxsKTplLmlzSGVscGVySW5zdGFuY2U/bmV3
IHIuZGVmYXVsdChlLHQsbyxsKTooYT1hfHx7dGVtcGxhdGU6e30saW52ZXJzZTp7fX0sbmV3IGku
ZGVmYXVsdChlLHQsbyxhLHMsdSxsKSl9ZS5idWlsZEhlbHBlclN0cmVhbT1vfSksZSgiZW1iZXIt
aHRtbGJhcnMvc3lzdGVtL2xvb2t1cC1oZWxwZXIiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Rl
YnVnIiwiZW1iZXItbWV0YWwvY2FjaGUiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1
bmN0aW9uIG4oZSx0LHIpe3JldHVybiB0JiYhKGUgaW4gcil9ZnVuY3Rpb24gaShlLHQscixpKXt2
YXIgbz1yLmhlbHBlcnNbZV07aWYoIW8pe3ZhciBhPXIub3duZXI7aWYobihlLGEsci5ob29rcy5r
ZXl3b3Jkcykpe3ZhciBzPSJoZWxwZXI6IitlLHU9YS5oYXNSZWdpc3RyYXRpb24ocyxpKTt1JiYo
bz1hLl9sb29rdXBGYWN0b3J5KHMsaSkpfX1yZXR1cm4gb31mdW5jdGlvbiBvKGUsdCxyKXt2YXIg
bj17fSxvPXIubWV0YSYmci5tZXRhLm1vZHVsZU5hbWU7byYmKG4uc291cmNlPSJ0ZW1wbGF0ZToi
K28pO3ZhciBhPWkoZSx0LHIsbik7cmV0dXJuIGE/YTppKGUsdCxyKX1mdW5jdGlvbiBhKGUsdCxy
KXt2YXIgbj1vKGUsdCxyKTtyZXR1cm4gbn1lLnZhbGlkYXRlTGF6eUhlbHBlck5hbWU9bixlLmZp
bmRIZWxwZXI9byxlLmRlZmF1bHQ9YTt2YXIgcz1uZXcgci5kZWZhdWx0KDFlMyxmdW5jdGlvbihl
KXtyZXR1cm4gZS5pbmRleE9mKCItIikhPT0tMX0pO2UuQ09OVEFJTlNfREFTSF9DQUNIRT1zO3Zh
ciB1PW5ldyByLmRlZmF1bHQoMWUzLGZ1bmN0aW9uKGUpe3JldHVybiBlLmluZGV4T2YoIi4iKSE9
PS0xfSk7ZS5DT05UQUlOU19ET1RfQ0FDSEU9dX0pLGUoImVtYmVyLWh0bWxiYXJzL3N5c3RlbS9t
YWtlX2JvdW5kX2hlbHBlciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1o
dG1sYmFycy9oZWxwZXIiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4o
ZSl7cmV0dXJuIHIuaGVscGVyKGUpfWUuZGVmYXVsdD1ufSksZSgiZW1iZXItaHRtbGJhcnMvc3lz
dGVtL3JlbmRlci1lbnYiLFsiZXhwb3J0cyIsImVtYmVyLWh0bWxiYXJzL2VudiIsImVtYmVyLW1l
dGFsLXZpZXdzIiwiY29udGFpbmVyL293bmVyIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJp
Y3QiO2Z1bmN0aW9uIGkoZSl7dGhpcy5saWZlY3ljbGVIb29rcz1lLmxpZmVjeWNsZUhvb2tzfHxb
XSx0aGlzLnJlbmRlcmVkVmlld3M9ZS5yZW5kZXJlZFZpZXdzfHxbXSx0aGlzLnJlbmRlcmVkTm9k
ZXM9ZS5yZW5kZXJlZE5vZGVzfHxuZXcgci5Nb3JwaFNldCx0aGlzLmhhc1BhcmVudE91dGxldD1l
Lmhhc1BhcmVudE91dGxldHx8ITEsdGhpcy52aWV3PWUudmlldyx0aGlzLm91dGxldFN0YXRlPWUu
b3V0bGV0U3RhdGUsdGhpcy5vd25lcj1lLm93bmVyLHRoaXMucmVuZGVyZXI9ZS5yZW5kZXJlcix0
aGlzLmRvbT1lLmRvbSx0aGlzLm1ldGE9ZS5tZXRhLHRoaXMuaG9va3M9dC5kZWZhdWx0Lmhvb2tz
LHRoaXMuaGVscGVycz10LmRlZmF1bHQuaGVscGVycyx0aGlzLnVzZUZyYWdtZW50Q2FjaGU9dC5k
ZWZhdWx0LnVzZUZyYWdtZW50Q2FjaGUsdGhpcy5kZXN0aW5lZEZvckRPTT10aGlzLnJlbmRlcmVy
Ll9kZXN0aW5lZEZvckRPTX1lLmRlZmF1bHQ9aSxpLmJ1aWxkPWZ1bmN0aW9uKGUsdCl7cmV0dXJu
IG5ldyBpKHt2aWV3OmUsb3V0bGV0U3RhdGU6ZS5vdXRsZXRTdGF0ZSxvd25lcjpuLmdldE93bmVy
KGUpLHJlbmRlcmVyOmUucmVuZGVyZXIsZG9tOmUucmVuZGVyZXIuX2RvbSxtZXRhOnR9KX0saS5w
cm90b3R5cGUuY2hpbGRXaXRoTWV0YT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGkoe3ZpZXc6dGhp
cy52aWV3LG91dGxldFN0YXRlOnRoaXMub3V0bGV0U3RhdGUsb3duZXI6dGhpcy5vd25lcixyZW5k
ZXJlcjp0aGlzLnJlbmRlcmVyLGRvbTp0aGlzLmRvbSxsaWZlY3ljbGVIb29rczp0aGlzLmxpZmVj
eWNsZUhvb2tzLHJlbmRlcmVkVmlld3M6dGhpcy5yZW5kZXJlZFZpZXdzLHJlbmRlcmVkTm9kZXM6
dGhpcy5yZW5kZXJlZE5vZGVzLGhhc1BhcmVudE91dGxldDp0aGlzLmhhc1BhcmVudE91dGxldCxt
ZXRhOmV9KX0saS5wcm90b3R5cGUuY2hpbGRXaXRoVmlldz1mdW5jdGlvbihlKXt2YXIgdD1hcmd1
bWVudHMubGVuZ3RoPD0xfHx2b2lkIDA9PT1hcmd1bWVudHNbMV0/dGhpcy5tZXRhOmFyZ3VtZW50
c1sxXTtyZXR1cm4gbmV3IGkoe3ZpZXc6ZSxvdXRsZXRTdGF0ZTp0aGlzLm91dGxldFN0YXRlLG93
bmVyOnRoaXMub3duZXIscmVuZGVyZXI6dGhpcy5yZW5kZXJlcixkb206dGhpcy5kb20sbGlmZWN5
Y2xlSG9va3M6dGhpcy5saWZlY3ljbGVIb29rcyxyZW5kZXJlZFZpZXdzOnRoaXMucmVuZGVyZWRW
aWV3cyxyZW5kZXJlZE5vZGVzOnRoaXMucmVuZGVyZWROb2RlcyxoYXNQYXJlbnRPdXRsZXQ6dGhp
cy5oYXNQYXJlbnRPdXRsZXQsbWV0YTp0fSl9LGkucHJvdG90eXBlLmNoaWxkV2l0aE91dGxldFN0
YXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3Vt
ZW50c1sxXT90aGlzLmhhc1BhcmVudE91dGxldDphcmd1bWVudHNbMV0scj1hcmd1bWVudHMubGVu
Z3RoPD0yfHx2b2lkIDA9PT1hcmd1bWVudHNbMl0/dGhpcy5tZXRhOmFyZ3VtZW50c1syXTtyZXR1
cm4gbmV3IGkoe3ZpZXc6dGhpcy52aWV3LG91dGxldFN0YXRlOmUsb3duZXI6dGhpcy5vd25lcixy
ZW5kZXJlcjp0aGlzLnJlbmRlcmVyLGRvbTp0aGlzLmRvbSxsaWZlY3ljbGVIb29rczp0aGlzLmxp
ZmVjeWNsZUhvb2tzLHJlbmRlcmVkVmlld3M6dGhpcy5yZW5kZXJlZFZpZXdzLHJlbmRlcmVkTm9k
ZXM6dGhpcy5yZW5kZXJlZE5vZGVzLGhhc1BhcmVudE91dGxldDp0LG1ldGE6cn0pfX0pLGUoImVt
YmVyLWh0bWxiYXJzL3N5c3RlbS9yZW5kZXItdmlldyIsWyJleHBvcnRzIiwiZW1iZXItaHRtbGJh
cnMvbm9kZS1tYW5hZ2Vycy92aWV3LW5vZGUtbWFuYWdlciIsImVtYmVyLWh0bWxiYXJzL3N5c3Rl
bS9yZW5kZXItZW52Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUs
bixpKXt2YXIgbz1uJiZuLnRlbXBsYXRlJiZuLnRlbXBsYXRlLm1ldGEsYT1yLmRlZmF1bHQuYnVp
bGQoZSxvKTtlLmVudj1hLHQuY3JlYXRlT3JVcGRhdGVDb21wb25lbnQoZSx7fSxudWxsLGksYSk7
dmFyIHM9bmV3IHQuZGVmYXVsdChlLG51bGwsaSxuLCIiIT09ZS50YWdOYW1lKTtzLnJlbmRlcihh
LHt9KX1lLnJlbmRlckhUTUxCYXJzQmxvY2s9bn0pLGUoImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRl
X3JlZ2lzdHJ5IixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
dChlKXthPWV9ZnVuY3Rpb24gcigpe3JldHVybiBhfWZ1bmN0aW9uIG4oZSl7aWYoYS5oYXNPd25Q
cm9wZXJ0eShlKSlyZXR1cm4gYVtlXX1mdW5jdGlvbiBpKGUpe3JldHVybiBhLmhhc093blByb3Bl
cnR5KGUpfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gYVtlXT10fWUuc2V0VGVtcGxhdGVzPXQsZS5n
ZXRUZW1wbGF0ZXM9cixlLmdldD1uLGUuaGFzPWksZS5zZXQ9bzt2YXIgYT17fX0pLGUoImVtYmVy
LWh0bWxiYXJzL3RlbXBsYXRlcy9jb21wb25lbnQiLFsiZXhwb3J0cyIsImVtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Uu
ZGVmYXVsdD10LmRlZmF1bHQoZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7fSxpc0VtcHR5OiExLGFy
aXR5OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNSZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1
bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHI9ZS5jcmVhdGVDb21t
ZW50KCIiKTtyZXR1cm4gZS5hcHBlbmRDaGlsZCh0LHIpLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVu
Y3Rpb24oZSx0LHIpe3ZhciBuPW5ldyBBcnJheSgxKTtyZXR1cm4gblswXT1lLmNyZWF0ZU1vcnBo
QXQodCwwLDAsciksZS5pbnNlcnRCb3VuZGFyeSh0LDApLGUuaW5zZXJ0Qm91bmRhcnkodCxudWxs
KSxufSxzdGF0ZW1lbnRzOltbImNvbnRlbnQiLCJ5aWVsZCIsWyJsb2MiLFtudWxsLFsxLDBdLFsx
LDldXV1dXSxsb2NhbHM6W10sdGVtcGxhdGVzOltdfX0oKSl9KSxlKCJlbWJlci1odG1sYmFycy90
ZW1wbGF0ZXMvZW1wdHkiLFsiZXhwb3J0cyIsImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3Rl
bS90ZW1wbGF0ZSJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD10LmRlZmF1
bHQoZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7fSxpc0VtcHR5OiEwLGFyaXR5OjAsY2FjaGVkRnJh
Z21lbnQ6bnVsbCxoYXNSZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUpe3ZhciB0
PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO3JldHVybiB0fSxidWlsZFJlbmRlck5vZGVzOmZ1
bmN0aW9uKCl7cmV0dXJuW119LHN0YXRlbWVudHM6W10sbG9jYWxzOltdLHRlbXBsYXRlczpbXX19
KCkpfSksZSgiZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVzL2xpbmstdG8iLFsiZXhwb3J0cyIsImVt
YmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSJdLGZ1bmN0aW9uKGUsdCl7InVz
ZSBzdHJpY3QiO2UuZGVmYXVsdD10LmRlZmF1bHQoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigp
e3JldHVybnttZXRhOnt9LGlzRW1wdHk6ITEsYXJpdHk6MCxjYWNoZWRGcmFnbWVudDpudWxsLGhh
c1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEb2N1
bWVudEZyYWdtZW50KCkscj1lLmNyZWF0ZUNvbW1lbnQoIiIpO3JldHVybiBlLmFwcGVuZENoaWxk
KHQsciksdH0sYnVpbGRSZW5kZXJOb2RlczpmdW5jdGlvbihlLHQscil7dmFyIG49bmV3IEFycmF5
KDEpO3JldHVybiBuWzBdPWUuY3JlYXRlTW9ycGhBdCh0LDAsMCxyKSxlLmluc2VydEJvdW5kYXJ5
KHQsMCksZS5pbnNlcnRCb3VuZGFyeSh0LG51bGwpLG59LHN0YXRlbWVudHM6W1siY29udGVudCIs
ImxpbmtUaXRsZSIsWyJsb2MiLFtudWxsLFsxLDE3XSxbMSwzMF1dXV1dLGxvY2FsczpbXSx0ZW1w
bGF0ZXM6W119fSgpLHQ9ZnVuY3Rpb24oKXtyZXR1cm57bWV0YTp7fSxpc0VtcHR5OiExLGFyaXR5
OjAsY2FjaGVkRnJhZ21lbnQ6bnVsbCxoYXNSZW5kZXJlZDohMSxidWlsZEZyYWdtZW50OmZ1bmN0
aW9uKGUpe3ZhciB0PWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHI9ZS5jcmVhdGVDb21tZW50
KCIiKTtyZXR1cm4gZS5hcHBlbmRDaGlsZCh0LHIpLHR9LGJ1aWxkUmVuZGVyTm9kZXM6ZnVuY3Rp
b24oZSx0LHIpe3ZhciBuPW5ldyBBcnJheSgxKTtyZXR1cm4gblswXT1lLmNyZWF0ZU1vcnBoQXQo
dCwwLDAsciksZS5pbnNlcnRCb3VuZGFyeSh0LDApLGUuaW5zZXJ0Qm91bmRhcnkodCxudWxsKSxu
fSxzdGF0ZW1lbnRzOltbImNvbnRlbnQiLCJ5aWVsZCIsWyJsb2MiLFtudWxsLFsxLDM4XSxbMSw0
N11dXV1dLGxvY2FsczpbXSx0ZW1wbGF0ZXM6W119fSgpO3JldHVybnttZXRhOnt9LGlzRW1wdHk6
ITEsYXJpdHk6MCxjYWNoZWRGcmFnbWVudDpudWxsLGhhc1JlbmRlcmVkOiExLGJ1aWxkRnJhZ21l
bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscj1lLmNyZWF0
ZUNvbW1lbnQoIiIpO3JldHVybiBlLmFwcGVuZENoaWxkKHQsciksdH0sYnVpbGRSZW5kZXJOb2Rl
czpmdW5jdGlvbihlLHQscil7dmFyIG49bmV3IEFycmF5KDEpO3JldHVybiBuWzBdPWUuY3JlYXRl
TW9ycGhBdCh0LDAsMCxyKSxlLmluc2VydEJvdW5kYXJ5KHQsMCksZS5pbnNlcnRCb3VuZGFyeSh0
LG51bGwpLG59LHN0YXRlbWVudHM6W1siYmxvY2siLCJpZiIsW1siZ2V0IiwibGlua1RpdGxlIixb
ImxvYyIsW251bGwsWzEsNl0sWzEsMTVdXV1dXSxbXSwwLDEsWyJsb2MiLFtudWxsLFsxLDBdLFsx
LDU0XV1dXV0sbG9jYWxzOltdLHRlbXBsYXRlczpbZSx0XX19KCkpfSksZSgiZW1iZXItaHRtbGJh
cnMvdGVtcGxhdGVzL3RvcC1sZXZlbC12aWV3IixbImV4cG9ydHMiLCJlbWJlci10ZW1wbGF0ZS1j
b21waWxlci9zeXN0ZW0vdGVtcGxhdGUiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtlLmRl
ZmF1bHQ9dC5kZWZhdWx0KGZ1bmN0aW9uKCl7cmV0dXJue21ldGE6e30saXNFbXB0eTohMSxhcml0
eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6ITEsYnVpbGRGcmFnbWVudDpmdW5j
dGlvbihlKXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxyPWUuY3JlYXRlQ29tbWVu
dCgiIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodCxyKSx0fSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0
aW9uKGUsdCxyKXt2YXIgbj1uZXcgQXJyYXkoMSk7cmV0dXJuIG5bMF09ZS5jcmVhdGVNb3JwaEF0
KHQsMCwwLHIpLGUuaW5zZXJ0Qm91bmRhcnkodCwwKSxlLmluc2VydEJvdW5kYXJ5KHQsbnVsbCks
bn0sc3RhdGVtZW50czpbWyJjb250ZW50Iiwib3V0bGV0IixbImxvYyIsW251bGwsWzEsMF0sWzEs
MTBdXV1dXSxsb2NhbHM6W10sdGVtcGxhdGVzOltdfX0oKSl9KSxlKCJlbWJlci1odG1sYmFycy91
dGlscy9kZWNvZGUtZWFjaC1rZXkiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dl
dCIsImVtYmVyLW1ldGFsL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5j
dGlvbiBuKGUpe3ZhciB0PXZvaWQgMCxuPXR5cGVvZiBlO3JldHVybiB0PSJzdHJpbmciPT09bnx8
Im51bWJlciI9PT1uP2U6ci5ndWlkRm9yKGUpfWZ1bmN0aW9uIGkoZSxyLGkpe3ZhciBvO3N3aXRj
aChyKXtjYXNlIkBpbmRleCI6bz1pO2JyZWFrO2Nhc2UiQGlkZW50aXR5IjpvPW4oZSk7YnJlYWs7
ZGVmYXVsdDpvPXI/dC5nZXQoZSxyKTpuKGUpfXJldHVybiJudW1iZXIiPT10eXBlb2YgbyYmKG89
U3RyaW5nKG8pKSxvfWUuZGVmYXVsdD1pfSksZSgiZW1iZXItaHRtbGJhcnMvdXRpbHMvZXh0cmFj
dC1wb3NpdGlvbmFsLXBhcmFtcyIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJl
ci1tZXRhbC9zdHJlYW1zL3N0cmVhbSIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiXSxmdW5j
dGlvbihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQscixuKXt2YXIgaT1hcmd1
bWVudHMubGVuZ3RoPD00fHx2b2lkIDA9PT1hcmd1bWVudHNbNF18fGFyZ3VtZW50c1s0XSxhPXQu
cG9zaXRpb25hbFBhcmFtczthJiZvKGUsYSxyLG4saSl9ZnVuY3Rpb24gbyhlLHQscixuKXt2YXIg
aT1hcmd1bWVudHMubGVuZ3RoPD00fHx2b2lkIDA9PT1hcmd1bWVudHNbNF18fGFyZ3VtZW50c1s0
XSxvPSJzdHJpbmciPT10eXBlb2YgdDtvP3MoZSx0LHIsbixpKTphKGUsdCxyLG4saSl9ZnVuY3Rp
b24gYShlLHQscixuLGkpe2Zvcih2YXIgbz1NYXRoLm1pbihyLmxlbmd0aCx0Lmxlbmd0aCksYT0w
O2E8bzthKyspe3ZhciBzPXJbYV07blt0W2FdXT1zfX1mdW5jdGlvbiBzKGUsdCxpLG8sYSl7dmFy
IHM9dCBpbiBvO2lmKDAhPT1pLmxlbmd0aHx8IXMpe3ZhciB1PW5ldyByLlN0cmVhbShmdW5jdGlv
bigpe3JldHVybiBuLnJlYWRBcnJheShpLnNsaWNlKDApKX0sInBhcmFtcyIpO29bdF09dTtmb3Io
dmFyIGw9MDtsPGkubGVuZ3RoO2wrKyl7dmFyIGM9aVtsXTt1LmFkZERlcGVuZGVuY3koYyl9fX1l
LmRlZmF1bHQ9aSxlLnByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zPW99KSxlKCJlbWJlci1odG1sYmFy
cy91dGlscy9pcy1jb21wb25lbnQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwi
ZW1iZXItaHRtbGJhcnMvc3lzdGVtL2xvb2t1cC1oZWxwZXIiLCJlbWJlci1odG1sYmFycy9rZXl3
b3Jkcy9jbG9zdXJlLWNvbXBvbmVudCIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiXSxmdW5j
dGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxyKXtyZXR1cm4gZS5o
YXNSZWdpc3RyYXRpb24oImNvbXBvbmVudDoiK3Qscil8fGUuaGFzUmVnaXN0cmF0aW9uKCJ0ZW1w
bGF0ZTpjb21wb25lbnRzLyIrdCxyKX1mdW5jdGlvbiBhKGUsdCxhKXt2YXIgcz1lLm93bmVyO2lm
KCFzKXJldHVybiExO2lmKCJzdHJpbmciPT10eXBlb2YgYSl7aWYoci5DT05UQUlOU19ET1RfQ0FD
SEUuZ2V0KGEpKXt2YXIgdT1lLmhvb2tzLmdldChlLHQsYSk7aWYoaS5pc1N0cmVhbSh1KSl7dmFy
IGw9dS52YWx1ZSgpO2lmKG4uaXNDb21wb25lbnRDZWxsKGwpKXJldHVybiEwfX1pZighci5DT05U
QUlOU19EQVNIX0NBQ0hFLmdldChhKSlyZXR1cm4hMTtpZihvKHMsYSkpcmV0dXJuITA7dmFyIGM9
ZS5tZXRhJiZlLm1ldGEubW9kdWxlTmFtZTtpZighYylyZXR1cm4hMTt2YXIgZj17c291cmNlOiJ0
ZW1wbGF0ZToiK2N9O3JldHVybiBvKHMsYSxmKX19ZS5kZWZhdWx0PWF9KSxlKCJlbWJlci1odG1s
YmFycy91dGlscy9sb29rdXAtY29tcG9uZW50IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9mZWF0
dXJlcyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LHIsbil7cmV0
dXJue2NvbXBvbmVudDplLmNvbXBvbmVudEZvcihyLHQsbiksbGF5b3V0OmUubGF5b3V0Rm9yKHIs
dCxuKX19ZnVuY3Rpb24gbihlLHQsbil7dmFyIGk9ZS5sb29rdXAoImNvbXBvbmVudC1sb29rdXA6
bWFpbiIpLG89biYmbi5zb3VyY2U7aWYobyl7dmFyIGE9cihpLGUsdCxuKTtpZihhLmNvbXBvbmVu
dHx8YS5sYXlvdXQpcmV0dXJuIGF9cmV0dXJuIHIoaSxlLHQpfWUuZGVmYXVsdD1ufSksZSgiZW1i
ZXItaHRtbGJhcnMvdXRpbHMvbmV3LXN0cmVhbSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvc3Ry
ZWFtcy9wcm94eS1zdHJlYW0iLCJlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUiXSxmdW5j
dGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSxuLGksbyxhKXt2YXIgcz1uZXcg
dC5kZWZhdWx0KGksYT8iIjpuKTtvJiZyLmRlZmF1bHQobyxlLHMpLGVbbl09c31lLmRlZmF1bHQ9
bn0pLGUoImVtYmVyLWh0bWxiYXJzL3V0aWxzL25vcm1hbGl6ZS1zZWxmIixbImV4cG9ydHMiXSxm
dW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gdm9pZCAwPT09ZT9u
dWxsOmV9ZS5kZWZhdWx0PXR9KSxlKCJlbWJlci1odG1sYmFycy91dGlscy9zdHJpbmciLFsiZXhw
b3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmciLCJo
dG1sYmFycy11dGlsIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGko
ZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1lP2U9IiI6InN0cmluZyIhPXR5cGVvZiBlJiYo
ZT0iIitlKSxuZXcgbi5TYWZlU3RyaW5nKGUpfXIuZGVmYXVsdC5odG1sU2FmZT1pLCh0LmRlZmF1
bHQuRVhURU5EX1BST1RPVFlQRVM9PT0hMHx8dC5kZWZhdWx0LkVYVEVORF9QUk9UT1RZUEVTLlN0
cmluZykmJihTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlPWZ1bmN0aW9uKCl7cmV0dXJuIGkodGhp
cyl9KSxlLlNhZmVTdHJpbmc9bi5TYWZlU3RyaW5nLGUuaHRtbFNhZmU9aSxlLmVzY2FwZUV4cHJl
c3Npb249bi5lc2NhcGVFeHByZXNzaW9ufSksZSgiZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vic2Ny
aWJlIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzIl0sZnVuY3Rpb24oZSx0
KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIsbixpKXtpZih0LmlzU3RyZWFtKGkpKXt2YXIg
bz1uLmdldENvbXBvbmVudCgpLGE9ZS5zdHJlYW1VbnN1YnNjcmliZXJzPWUuc3RyZWFtVW5zdWJz
Y3JpYmVyc3x8W107YS5wdXNoKGkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7ZS5pc0RpcnR5PSEwLG8m
Jm8uX3JlbmRlck5vZGUmJihvLl9yZW5kZXJOb2RlLmlzRGlydHk9ITApLGUuZ2V0U3RhdGUoKS5t
YW5hZ2VyJiYoZS5zaG91bGRSZWNlaXZlQXR0cnM9ITApLGUub3duZXJOb2RlLmVtYmVyVmlldy5z
Y2hlZHVsZVJldmFsaWRhdGUoZSx0LmxhYmVsRm9yKGkpKX0pKX19ZS5kZWZhdWx0PXJ9KSxlKCJl
bWJlci1odG1sYmFycy91dGlscy91cGRhdGUtc2NvcGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFs
L3N0cmVhbXMvcHJveHktc3RyZWFtIiwiZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vic2NyaWJlIl0s
ZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsbixpLG8sYSl7dmFyIHM9
ZVtuXTtpZihzKXMuc2V0U291cmNlKGkpO2Vsc2V7dmFyIHU9bmV3IHQuZGVmYXVsdChpLGE/bnVs
bDpuKTtvJiZyLmRlZmF1bHQobyxlLHUpLGVbbl09dX19ZS5kZWZhdWx0PW59KSxlKCJlbWJlci1t
ZXRhbC12aWV3cy9odG1sYmFycy1yZW5kZXJlciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvcnVu
X2xvb3AiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9z
ZXQiLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1tZXRhbC9zZXRfcHJvcGVydGllcyIsImVt
YmVyLXZpZXdzL3N5c3RlbS9idWlsZC1jb21wb25lbnQtdGVtcGxhdGUiLCJlbWJlci1tZXRhbC9l
bnZpcm9ubWVudCIsImh0bWxiYXJzLXJ1bnRpbWUiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMs
dSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDw9MXx8
dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXSxyPXQuZGVzdGluZWRGb3JET007
dGhpcy5fZG9tPWUsdGhpcy5fZGVzdGluZWRGb3JET009dm9pZCAwPT09cj9zLmRlZmF1bHQuaGFz
RE9NOnJ9ZnVuY3Rpb24gYygpe3RoaXMubW9ycGhzPVtdfWUuUmVuZGVyZXI9bCxlLk1vcnBoU2V0
PWMsbC5wcm90b3R5cGUucHJlcmVuZGVyVG9wTGV2ZWxWaWV3PWZ1bmN0aW9uKGUsdCl7aWYoImlu
RE9NIj09PWUuX3N0YXRlKXRocm93IG5ldyBFcnJvcigiWW91IGNhbm5vdCBpbnNlcnQgYSBWaWV3
IHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZCIpO2Uub3duZXJWaWV3PXQuZW1iZXJWaWV3
PWUsZS5fcmVuZGVyTm9kZT10O3ZhciBuPXIuZ2V0KGUsImxheW91dCIpLGk9ci5nZXQoZSwidGVt
cGxhdGUiKSxvPXtjb21wb25lbnQ6ZSxsYXlvdXQ6bn0scz1hLmRlZmF1bHQobyx7fSx7c2VsZjpl
LHRlbXBsYXRlczppP3tkZWZhdWx0OmkucmF3fTp2b2lkIDB9KS5ibG9jaztlLnJlbmRlckJsb2Nr
KHMsdCksZS5sYXN0UmVzdWx0PXQubGFzdFJlc3VsdCx0aGlzLmNsZWFyUmVuZGVyZWRWaWV3cyhl
LmVudil9LGwucHJvdG90eXBlLnJlbmRlclRvcExldmVsVmlldz1mdW5jdGlvbihlLHQpe2UuX3dp
bGxJbnNlcnQmJihlLl93aWxsSW5zZXJ0PSExLHRoaXMucHJlcmVuZGVyVG9wTGV2ZWxWaWV3KGUs
dCksdGhpcy5kaXNwYXRjaExpZmVjeWNsZUhvb2tzKGUuZW52KSl9LGwucHJvdG90eXBlLnJldmFs
aWRhdGVUb3BMZXZlbFZpZXc9ZnVuY3Rpb24oZSl7ZS5fcmVuZGVyTm9kZS5sYXN0UmVzdWx0JiYo
ZS5fcmVuZGVyTm9kZS5sYXN0UmVzdWx0LnJldmFsaWRhdGUoZS5lbnYpLCJpbkRPTSI9PT1lLl9z
dGF0ZSYmdGhpcy5kaXNwYXRjaExpZmVjeWNsZUhvb2tzKGUuZW52KSx0aGlzLmNsZWFyUmVuZGVy
ZWRWaWV3cyhlLmVudikpfSxsLnByb3RvdHlwZS5kaXNwYXRjaExpZmVjeWNsZUhvb2tzPWZ1bmN0
aW9uKGUpe3ZhciB0LHIsbj1lLnZpZXcsaT1lLmxpZmVjeWNsZUhvb2tzO2Zvcih0PTA7dDxpLmxl
bmd0aDt0Kyspe3N3aXRjaChyPWlbdF0sbi5fZGlzcGF0Y2hpbmc9ci50eXBlLHIudHlwZSl7Y2Fz
ZSJkaWRJbnNlcnRFbGVtZW50Ijp0aGlzLmRpZEluc2VydEVsZW1lbnQoci52aWV3KTticmVhaztj
YXNlImRpZFVwZGF0ZSI6dGhpcy5kaWRVcGRhdGUoci52aWV3KX10aGlzLmRpZFJlbmRlcihyLnZp
ZXcpfW4uX2Rpc3BhdGNoaW5nPW51bGwsZS5saWZlY3ljbGVIb29rcy5sZW5ndGg9MH0sbC5wcm90
b3R5cGUuZW5zdXJlVmlld05vdFJlbmRlcmluZz1mdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyVmll
dy5lbnY7aWYodCYmdC5yZW5kZXJlZFZpZXdzLmluZGV4T2YoZS5lbGVtZW50SWQpIT09LTEpdGhy
b3cgbmV3IEVycm9yKCJTb21ldGhpbmcgeW91IGRpZCBjYXVzZWQgYSB2aWV3IHRvIHJlLXJlbmRl
ciBhZnRlciBpdCByZW5kZXJlZCBidXQgYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBE
T00uIil9LGMucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLm1vcnBocy5wdXNoKGUpLGUu
c2Vlbj0hMH0sYy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNlZW59LGMucHJv
dG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMubW9ycGhzLHQ9MCxyPWUubGVu
Z3RoO3Q8cjt0KyspZVt0XS5zZWVuPSExO3RoaXMubW9ycGhzPVtdfSxsLnByb3RvdHlwZS5jbGVh
clJlbmRlcmVkVmlld3M9ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlZE5vZGVzLmNsZWFyKCksZS5yZW5k
ZXJlZFZpZXdzLmxlbmd0aD0wfSxsLnByb3RvdHlwZS5hcHBlbmRUbz1mdW5jdGlvbihlLHIpe3Zh
ciBuPXRoaXMuX2RvbS5hcHBlbmRNb3JwaChyKTtuLm93bmVyTm9kZT1uLGUuX3dpbGxJbnNlcnQ9
ITAsdC5kZWZhdWx0LnNjaGVkdWxlKCJyZW5kZXIiLHRoaXMsdGhpcy5yZW5kZXJUb3BMZXZlbFZp
ZXcsZSxuKX0sbC5wcm90b3R5cGUucmVwbGFjZUluPWZ1bmN0aW9uKGUscil7dmFyIG49dGhpcy5f
ZG9tLnJlcGxhY2VDb250ZW50V2l0aE1vcnBoKHIpO24ub3duZXJOb2RlPW4sZS5fd2lsbEluc2Vy
dD0hMCx0LmRlZmF1bHQuc2NoZWR1bGVPbmNlKCJyZW5kZXIiLHRoaXMsdGhpcy5yZW5kZXJUb3BM
ZXZlbFZpZXcsZSxuKX0sbC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXt2YXIg
dD10aGlzLl9kb20uY3JlYXRlRnJhZ21lbnRNb3JwaCgpO3Qub3duZXJOb2RlPXQsdGhpcy5wcmVy
ZW5kZXJUb3BMZXZlbFZpZXcoZSx0KX0sbC5wcm90b3R5cGUuZGlkQ3JlYXRlRWxlbWVudD1mdW5j
dGlvbihlLHQpe3QmJihlLmVsZW1lbnQ9dCksZS5fdHJhbnNpdGlvblRvJiZlLl90cmFuc2l0aW9u
VG8oImhhc0VsZW1lbnQiKX0sbC5wcm90b3R5cGUud2lsbEluc2VydEVsZW1lbnQ9ZnVuY3Rpb24o
ZSl7ZS50cmlnZ2VyJiZlLnRyaWdnZXIoIndpbGxJbnNlcnRFbGVtZW50Iil9LGwucHJvdG90eXBl
LnNldEF0dHJzPWZ1bmN0aW9uKGUsdCl7bi5zZXQoZSwiYXR0cnMiLHQpfSxsLnByb3RvdHlwZS5j
b21wb25lbnRJbml0QXR0cnM9ZnVuY3Rpb24oZSx0KXtlLnRyaWdnZXIoImRpZEluaXRBdHRycyIs
e2F0dHJzOnR9KSxlLnRyaWdnZXIoImRpZFJlY2VpdmVBdHRycyIse25ld0F0dHJzOnR9KX0sbC5w
cm90b3R5cGUuZGlkSW5zZXJ0RWxlbWVudD1mdW5jdGlvbihlKXtlLl90cmFuc2l0aW9uVG8mJmUu
X3RyYW5zaXRpb25UbygiaW5ET00iKSxlLnRyaWdnZXImJmUudHJpZ2dlcigiZGlkSW5zZXJ0RWxl
bWVudCIpfSxsLnByb3RvdHlwZS5kaWRVcGRhdGU9ZnVuY3Rpb24oZSl7ZS50cmlnZ2VyJiZlLnRy
aWdnZXIoImRpZFVwZGF0ZSIpfSxsLnByb3RvdHlwZS5kaWRSZW5kZXI9ZnVuY3Rpb24oZSl7ZS50
cmlnZ2VyJiZlLnRyaWdnZXIoImRpZFJlbmRlciIpfSxsLnByb3RvdHlwZS51cGRhdGVBdHRycz1m
dW5jdGlvbihlLHQpe3RoaXMuc2V0QXR0cnMoZSx0KX0sbC5wcm90b3R5cGUuY29tcG9uZW50VXBk
YXRlQXR0cnM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1udWxsO2UuYXR0cnM/KHI9aS5kZWZhdWx0KHt9
LGUuYXR0cnMpLG8uZGVmYXVsdChlLmF0dHJzLHQpKTpuLnNldChlLCJhdHRycyIsdCksZS50cmln
Z2VyKCJkaWRVcGRhdGVBdHRycyIse29sZEF0dHJzOnIsbmV3QXR0cnM6dH0pLGUudHJpZ2dlcigi
ZGlkUmVjZWl2ZUF0dHJzIix7b2xkQXR0cnM6cixuZXdBdHRyczp0fSl9LGwucHJvdG90eXBlLndp
bGxVcGRhdGU9ZnVuY3Rpb24oZSx0KXtlLl93aWxsVXBkYXRlJiZlLl93aWxsVXBkYXRlKHQpfSxs
LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVXBkYXRlPWZ1bmN0aW9uKGUpe2UudHJpZ2dlcigid2ls
bFVwZGF0ZSIpfSxsLnByb3RvdHlwZS53aWxsUmVuZGVyPWZ1bmN0aW9uKGUpe2UuX3dpbGxSZW5k
ZXImJmUuX3dpbGxSZW5kZXIoKX0sbC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlbmRlcj1mdW5j
dGlvbihlKXtlLnRyaWdnZXIoIndpbGxSZW5kZXIiKX0sbC5wcm90b3R5cGUucmVyZW5kZXI9ZnVu
Y3Rpb24oZSl7dmFyIHQ9ZS5fcmVuZGVyTm9kZTt0LmlzRGlydHk9ITAsdS5pbnRlcm5hbC52aXNp
dENoaWxkcmVuKHQuY2hpbGROb2RlcyxmdW5jdGlvbihlKXtlLmdldFN0YXRlKCkubWFuYWdlciYm
KGUuc2hvdWxkUmVjZWl2ZUF0dHJzPSEwKSxlLmlzRGlydHk9ITB9KSx0Lm93bmVyTm9kZS5lbWJl
clZpZXcuc2NoZWR1bGVSZXZhbGlkYXRlKHQsZS50b1N0cmluZygpLCJyZXJlbmRlcmluZyIpfSxs
LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSxyKXt0aGlzLndpbGxEZXN0cm95RWxlbWVudChl
KSxlLl93aWxsUmVtb3ZlRWxlbWVudD0hMCx0LmRlZmF1bHQuc2NoZWR1bGUoInJlbmRlciIsdGhp
cyx0aGlzLnJlbmRlckVsZW1lbnRSZW1vdmFsLGUpfSxsLnByb3RvdHlwZS5yZW5kZXJFbGVtZW50
UmVtb3ZhbD1mdW5jdGlvbihlKXtlLl93aWxsUmVtb3ZlRWxlbWVudCYmKGUuX3dpbGxSZW1vdmVF
bGVtZW50PSExLGUuX3JlbmRlck5vZGUmJmUuZWxlbWVudCYmZS5lbGVtZW50LnBhcmVudE5vZGUm
JmUuX3JlbmRlck5vZGUuY2xlYXIoKSx0aGlzLmRpZERlc3Ryb3lFbGVtZW50KGUpKX0sbC5wcm90
b3R5cGUud2lsbFJlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt9LGwucHJvdG90eXBlLndpbGxEZXN0
cm95RWxlbWVudD1mdW5jdGlvbihlKXtlLl93aWxsRGVzdHJveUVsZW1lbnQmJmUuX3dpbGxEZXN0
cm95RWxlbWVudCgpLGUudHJpZ2dlciYmKGUudHJpZ2dlcigid2lsbERlc3Ryb3lFbGVtZW50Iiks
ZS50cmlnZ2VyKCJ3aWxsQ2xlYXJSZW5kZXIiKSksZS5fdHJhbnNpdGlvblRvJiZlLl90cmFuc2l0
aW9uVG8oImRlc3Ryb3lpbmciKX0sbC5wcm90b3R5cGUuZGlkRGVzdHJveUVsZW1lbnQ9ZnVuY3Rp
b24oZSl7ZS5lbGVtZW50PW51bGwsImRlc3Ryb3lpbmciIT09ZS5fc3RhdGUmJmUuX3RyYW5zaXRp
b25UbyYmZS5fdHJhbnNpdGlvblRvKCJwcmVSZW5kZXIiKSxlLnRyaWdnZXImJmUudHJpZ2dlcigi
ZGlkRGVzdHJveUVsZW1lbnQiKX07dmFyIGY9e2NyZWF0ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmRv
bTtyZXR1cm4gbmV3IGwodCx7ZGVzdGluZWRGb3JET006ITF9KX19O2UuSW5lcnRSZW5kZXJlcj1m
O3ZhciBkPXtjcmVhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kb207cmV0dXJuIG5ldyBsKHQse2Rl
c3RpbmVkRm9yRE9NOiEwfSl9fTtlLkludGVyYWN0aXZlUmVuZGVyZXI9ZH0pLGUoImVtYmVyLW1l
dGFsLXZpZXdzL2luZGV4IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC12aWV3cy9odG1sYmFycy1y
ZW5kZXJlciJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIg
cj10KHt9LGUpO3JldHVybiBkZWxldGUgci5kZWZhdWx0LHJ9ZnVuY3Rpb24gbihlLHQpe2Zvcih2
YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSxuPTA7bjxyLmxlbmd0aDtuKyspe3Zh
ciBpPXJbbl0sbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk7byYmby5jb25m
aWd1cmFibGUmJnZvaWQgMD09PWVbaV0mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGksbyl9cmV0
dXJuIGV9bihlLHIodCxuKSl9KSxlKCJlbWJlci1tZXRhbC9hbGlhcyIsWyJleHBvcnRzIiwiZW1i
ZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9lcnJvciIsImVtYmVyLW1ldGFsL3Byb3BlcnRpZXMi
LCJlbWJlci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL3V0aWxzIiwiZW1iZXItbWV0YWwv
bWV0YSIsImVtYmVyLW1ldGFsL2RlcGVuZGVudF9rZXlzIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8s
YSxzLHUsbCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoZSl7cmV0dXJuIG5ldyBmKGUpfWZ1bmN0
aW9uIGYoZSl7dGhpcy5pc0Rlc2NyaXB0b3I9ITAsdGhpcy5hbHRLZXk9ZSx0aGlzLl9kZXBlbmRl
bnRLZXlzPVtlXX1mdW5jdGlvbiBkKGUsdCxyKXt0aHJvdyBuZXcgaS5kZWZhdWx0KCJDYW5ub3Qg
c2V0IHJlYWQtb25seSBwcm9wZXJ0eSAnIit0KyInIG9uIG9iamVjdDogIitzLmluc3BlY3QoZSkp
fWZ1bmN0aW9uIHAoZSx0LHIpe3JldHVybiBvLmRlZmluZVByb3BlcnR5KGUsdCxudWxsKSxuLnNl
dChlLHQscil9ZS5kZWZhdWx0PWMsZS5BbGlhc2VkUHJvcGVydHk9ZixmLnByb3RvdHlwZT1PYmpl
Y3QuY3JlYXRlKG8uRGVzY3JpcHRvci5wcm90b3R5cGUpLGYucHJvdG90eXBlLmdldD1mdW5jdGlv
bihlLHQpe3JldHVybiByLmdldChlLHRoaXMuYWx0S2V5KX0sZi5wcm90b3R5cGUuc2V0PWZ1bmN0
aW9uKGUsdCxyKXtyZXR1cm4gbi5zZXQoZSx0aGlzLmFsdEtleSxyKX0sZi5wcm90b3R5cGUud2ls
bFdhdGNoPWZ1bmN0aW9uKGUsdCl7bC5hZGREZXBlbmRlbnRLZXlzKHRoaXMsZSx0LHUubWV0YShl
KSl9LGYucHJvdG90eXBlLmRpZFVud2F0Y2g9ZnVuY3Rpb24oZSx0KXtsLnJlbW92ZURlcGVuZGVu
dEtleXModGhpcyxlLHQsdS5tZXRhKGUpKX0sZi5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oZSx0
KXt2YXIgcj11Lm1ldGEoZSk7ci5wZWVrV2F0Y2hpbmcodCkmJmwuYWRkRGVwZW5kZW50S2V5cyh0
aGlzLGUsdCxyKX0sZi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oZSx0KXt2YXIgcj11Lm1l
dGEoZSk7ci5wZWVrV2F0Y2hpbmcodCkmJmwucmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLGUsdCxy
KX0sZi5wcm90b3R5cGUucmVhZE9ubHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQ9ZCx0aGlz
fSxmLnByb3RvdHlwZS5vbmVXYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXQ9cCx0aGlzfSxm
LnByb3RvdHlwZS5fbWV0YT12b2lkIDAsZi5wcm90b3R5cGUubWV0YT1hLkNvbXB1dGVkUHJvcGVy
dHkucHJvdG90eXBlLm1ldGF9KSxlKCJlbWJlci1tZXRhbC9hc3NpZ24iLFsiZXhwb3J0cyJdLGZ1
bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe2Zvcih2YXIgdD1hcmd1bWVudHMu
bGVuZ3RoLHI9QXJyYXkodD4xP3QtMTowKSxuPTE7bjx0O24rKylyW24tMV09YXJndW1lbnRzW25d
O2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9cltpXTtpZihhKWZvcih2YXIg
cz1PYmplY3Qua2V5cyhhKSx1PTAsbD1zLmxlbmd0aDt1PGw7dSsrKXt2YXIgYz1zW3VdO2VbY109
YVtjXX19cmV0dXJuIGV9ZS5kZWZhdWx0PXR9KSxlKCJlbWJlci1tZXRhbC9iaW5kaW5nIixbImV4
cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvbG9nZ2VyIiwiZW1iZXItbWV0
YWwvcnVuX2xvb3AiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dl
dCIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCIsImVtYmVyLW1ldGFsL3V0aWxzIiwiZW1iZXIt
bWV0YWwvZXZlbnRzIiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9wYXRoX2Nh
Y2hlIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjKXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gZihlLHQpe3RoaXMuX2Zyb209dCx0aGlzLl90bz1lLHRoaXMuX29uZVdheT12b2lkIDAsdGhp
cy5fZGlyZWN0aW9uPXZvaWQgMCx0aGlzLl9yZWFkeVRvU3luYz12b2lkIDAsdGhpcy5fZnJvbU9i
aj12b2lkIDAsdGhpcy5fZnJvbVBhdGg9dm9pZCAwLHRoaXMuX3RvT2JqPXZvaWQgMH1mdW5jdGlv
biBkKGUsdCl7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKGVbcl09dFtyXSl9
ZnVuY3Rpb24gcChlLHQscil7cmV0dXJuIG5ldyBmKHQscikuY29ubmVjdChlKX1lLmJpbmQ9cCx0
LmRlZmF1bHQuTE9HX0JJTkRJTkdTPSEhdC5kZWZhdWx0LkVOVi5MT0dfQklORElOR1MsZi5wcm90
b3R5cGU9e2NvcHk6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgZih0aGlzLl90byx0aGlzLl9mcm9tKTty
ZXR1cm4gdGhpcy5fb25lV2F5JiYoZS5fb25lV2F5PSEwKSxlfSxmcm9tOmZ1bmN0aW9uKGUpe3Jl
dHVybiB0aGlzLl9mcm9tPWUsdGhpc30sdG86ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3RvPWUs
dGhpc30sb25lV2F5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZVdheT0hMCx0aGlzfSx0b1N0
cmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX29uZVdheT8iW29uZVdheV0iOiIiO3JldHVybiJF
bWJlci5CaW5kaW5nPCIrcy5ndWlkRm9yKHRoaXMpKyI+KCIrdGhpcy5fZnJvbSsiIC0+ICIrdGhp
cy5fdG8rIikiK2V9LGNvbm5lY3Q6ZnVuY3Rpb24oZSl7dmFyIHI9dm9pZCAwLG49dm9pZCAwO2lm
KGMuaXNHbG9iYWxQYXRoKHRoaXMuX2Zyb20pKXt2YXIgaT1jLmdldEZpcnN0S2V5KHRoaXMuX2Zy
b20pLHM9dC5kZWZhdWx0Lmxvb2t1cFtpXTtzJiYocj1zLG49Yy5nZXRUYWlsUGF0aCh0aGlzLl9m
cm9tKSl9cmV0dXJuIHZvaWQgMD09PXImJihyPWUsbj10aGlzLl9mcm9tKSxhLnRyeVNldChlLHRo
aXMuX3RvLG8uZ2V0KHIsbikpLGwuYWRkT2JzZXJ2ZXIocixuLHRoaXMsImZyb21EaWRDaGFuZ2Ui
KSx0aGlzLl9vbmVXYXl8fGwuYWRkT2JzZXJ2ZXIoZSx0aGlzLl90byx0aGlzLCJ0b0RpZENoYW5n
ZSIpLHUuYWRkTGlzdGVuZXIoZSwid2lsbERlc3Ryb3kiLHRoaXMsImRpc2Nvbm5lY3QiKSx0aGlz
Ll9yZWFkeVRvU3luYz0hMCx0aGlzLl9mcm9tT2JqPXIsdGhpcy5fZnJvbVBhdGg9bix0aGlzLl90
b09iaj1lLHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gbC5yZW1vdmVPYnNlcnZl
cih0aGlzLl9mcm9tT2JqLHRoaXMuX2Zyb21QYXRoLHRoaXMsImZyb21EaWRDaGFuZ2UiKSx0aGlz
Ll9vbmVXYXl8fGwucmVtb3ZlT2JzZXJ2ZXIodGhpcy5fdG9PYmosdGhpcy5fdG8sdGhpcywidG9E
aWRDaGFuZ2UiKSx0aGlzLl9yZWFkeVRvU3luYz0hMSx0aGlzfSxmcm9tRGlkQ2hhbmdlOmZ1bmN0
aW9uKGUpe3RoaXMuX3NjaGVkdWxlU3luYygiZndkIil9LHRvRGlkQ2hhbmdlOmZ1bmN0aW9uKGUp
e3RoaXMuX3NjaGVkdWxlU3luYygiYmFjayIpfSxfc2NoZWR1bGVTeW5jOmZ1bmN0aW9uKGUpe3Zh
ciB0PXRoaXMuX2RpcmVjdGlvbjt2b2lkIDA9PT10JiYobi5kZWZhdWx0LnNjaGVkdWxlKCJzeW5j
Iix0aGlzLCJfc3luYyIpLHRoaXMuX2RpcmVjdGlvbj1lKSwiYmFjayI9PT10JiYiZndkIj09PWUm
Jih0aGlzLl9kaXJlY3Rpb249ImZ3ZCIpfSxfc3luYzpmdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVs
dC5MT0dfQklORElOR1Msbj10aGlzLl90b09iajtpZighbi5pc0Rlc3Ryb3llZCYmdGhpcy5fcmVh
ZHlUb1N5bmMpe3ZhciBpPXRoaXMuX2RpcmVjdGlvbixzPXRoaXMuX2Zyb21PYmosdT10aGlzLl9m
cm9tUGF0aDtpZih0aGlzLl9kaXJlY3Rpb249dm9pZCAwLCJmd2QiPT09aSl7dmFyIGM9by5nZXQo
cyx1KTtlJiZyLmRlZmF1bHQubG9nKCIgIix0aGlzLnRvU3RyaW5nKCksIi0+IixjLHMpLHRoaXMu
X29uZVdheT9hLnRyeVNldChuLHRoaXMuX3RvLGMpOmwuX3N1c3BlbmRPYnNlcnZlcihuLHRoaXMu
X3RvLHRoaXMsInRvRGlkQ2hhbmdlIixmdW5jdGlvbigpe2EudHJ5U2V0KG4sdGhpcy5fdG8sYyl9
KX1lbHNlIGlmKCJiYWNrIj09PWkpe3ZhciBmPW8uZ2V0KG4sdGhpcy5fdG8pO2UmJnIuZGVmYXVs
dC5sb2coIiAiLHRoaXMudG9TdHJpbmcoKSwiPC0iLGYsbiksbC5fc3VzcGVuZE9ic2VydmVyKHMs
dSx0aGlzLCJmcm9tRGlkQ2hhbmdlIixmdW5jdGlvbigpe2EudHJ5U2V0KHMsdSxmKX0pfX19fSxk
KGYse2Zyb206ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IHQodm9pZCAwLGUpfSx0
bzpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBuZXcgdChlLHZvaWQgMCl9fSksZS5CaW5k
aW5nPWZ9KSxlKCJlbWJlci1tZXRhbC9jYWNoZSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZW1w
dHlfb2JqZWN0Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIpe3Ro
aXMuc3RvcmU9bmV3IHQuZGVmYXVsdCx0aGlzLnNpemU9MCx0aGlzLm1pc3Nlcz0wLHRoaXMuaGl0
cz0wLHRoaXMubGltaXQ9ZSx0aGlzLmZ1bmM9cn1lLmRlZmF1bHQ9cjt2YXIgbj1mdW5jdGlvbigp
e307ci5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmxpbWl0PnRoaXMu
c2l6ZSYmKHRoaXMuc2l6ZSsrLHZvaWQgMD09PXQ/dGhpcy5zdG9yZVtlXT1uOnRoaXMuc3RvcmVb
ZV09dCksdH0sZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3RvcmVbZV07cmV0dXJuIHZvaWQg
MD09PXQ/KHRoaXMubWlzc2VzKyssdD10aGlzLnNldChlLHRoaXMuZnVuYyhlKSkpOnQ9PT1uPyh0
aGlzLmhpdHMrKyx0PXZvaWQgMCk6dGhpcy5oaXRzKyssdH0scHVyZ2U6ZnVuY3Rpb24oKXt0aGlz
LnN0b3JlPW5ldyB0LmRlZmF1bHQsdGhpcy5zaXplPTAsdGhpcy5oaXRzPTAsdGhpcy5taXNzZXM9
MH19fSksZSgiZW1iZXItbWV0YWwvY2hhaW5zIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvd2F0Y2hfa2V5IiwiZW1i
ZXItbWV0YWwvZW1wdHlfb2JqZWN0Il0sZnVuY3Rpb24oZSx0LHIsbixpKXsidXNlIHN0cmljdCI7
ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZS5tYXRjaChtKVswXX1mdW5jdGlvbiBhKGUpe3JldHVybiBl
JiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4hKGEoZSkmJmUuaXNEZXNj
cmlwdG9yJiZlLl92b2xhdGlsZT09PSExKX1mdW5jdGlvbiB1KCl7dGhpcy5jaGFpbnM9bmV3IGku
ZGVmYXVsdH1mdW5jdGlvbiBsKCl7cmV0dXJuIG5ldyB1fWZ1bmN0aW9uIGMoZSx0LGkpe2lmKGEo
ZSkpe3ZhciBvPXIubWV0YShlKTtvLndyaXRhYmxlQ2hhaW5XYXRjaGVycyhsKS5hZGQodCxpKSxu
LndhdGNoS2V5KGUsdCxvKX19ZnVuY3Rpb24gZihlLHQsaSl7aWYoYShlKSl7dmFyIG89ci5wZWVr
TWV0YShlKTtvJiZvLnJlYWRhYmxlQ2hhaW5XYXRjaGVycygpJiYobz1yLm1ldGEoZSksby5yZWFk
YWJsZUNoYWluV2F0Y2hlcnMoKS5yZW1vdmUodCxpKSxuLnVud2F0Y2hLZXkoZSx0LG8pKX19ZnVu
Y3Rpb24gZChlLHQscil7dGhpcy5fcGFyZW50PWUsdGhpcy5fa2V5PXQsdGhpcy5fd2F0Y2hpbmc9
dm9pZCAwPT09cix0aGlzLl9jaGFpbnM9dm9pZCAwLHRoaXMuX29iamVjdD12b2lkIDAsdGhpcy5j
b3VudD0wLHRoaXMuX3ZhbHVlPXIsdGhpcy5fcGF0aHM9e30sdGhpcy5fd2F0Y2hpbmcmJih0aGlz
Ll9vYmplY3Q9ZS52YWx1ZSgpLHRoaXMuX29iamVjdCYmYyh0aGlzLl9vYmplY3QsdGhpcy5fa2V5
LHRoaXMpKX1mdW5jdGlvbiBwKGUsbil7aWYoZSl7dmFyIGk9ci5wZWVrTWV0YShlKTtpZighaXx8
aS5wcm90byE9PWUpe2lmKHMoZVtuXSkpcmV0dXJuIHQuZ2V0KGUsbik7dmFyIG89aS5yZWFkYWJs
ZUNhY2hlKCk7cmV0dXJuIG8mJm4gaW4gbz9vW25dOnZvaWQgMH19fWZ1bmN0aW9uIGgoZSl7dmFy
IHQ9ci5wZWVrTWV0YShlKTtpZih0KXt0PXIubWV0YShlKTt2YXIgbj10LnJlYWRhYmxlQ2hhaW5X
YXRjaGVycygpO24mJm4ucmV2YWxpZGF0ZUFsbCgpLHQucmVhZGFibGVDaGFpbnMoKSYmdC53cml0
YWJsZUNoYWlucygpfX1lLmZpbmlzaENoYWlucz1oO3ZhciBtPS9eKFteXC5dKykvO3UucHJvdG90
eXBlPXthZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmNoYWluc1tlXTt2b2lkIDA9PT1yP3Ro
aXMuY2hhaW5zW2VdPVt0XTpyLnB1c2godCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciByPXRo
aXMuY2hhaW5zW2VdO2lmKHIpZm9yKHZhciBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKWlmKHJbbl09
PT10KXtyLnNwbGljZShuLDEpO2JyZWFrfX0saGFzOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5j
aGFpbnNbZV07aWYocilmb3IodmFyIG49MCxpPXIubGVuZ3RoO248aTtuKyspaWYocltuXT09PXQp
cmV0dXJuITA7cmV0dXJuITF9LHJldmFsaWRhdGVBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4g
dGhpcy5jaGFpbnMpdGhpcy5ub3RpZnkoZSwhMCx2b2lkIDApfSxyZXZhbGlkYXRlOmZ1bmN0aW9u
KGUpe3RoaXMubm90aWZ5KGUsITAsdm9pZCAwKX0sbm90aWZ5OmZ1bmN0aW9uKGUsdCxyKXt2YXIg
bj10aGlzLmNoYWluc1tlXTtpZih2b2lkIDAhPT1uJiYwIT09bi5sZW5ndGgpe3ZhciBpPXZvaWQg
MDtyJiYoaT1bXSk7Zm9yKHZhciBvPTAsYT1uLmxlbmd0aDtvPGE7bysrKW5bb10ubm90aWZ5KHQs
aSk7aWYodm9pZCAwIT09cilmb3IodmFyIG89MCxhPWkubGVuZ3RoO288YTtvKz0yKXt2YXIgcz1p
W29dLHU9aVtvKzFdO3Iocyx1KX19fX0sZC5wcm90b3R5cGU9e3ZhbHVlOmZ1bmN0aW9uKCl7aWYo
dm9pZCAwPT09dGhpcy5fdmFsdWUmJnRoaXMuX3dhdGNoaW5nKXt2YXIgZT10aGlzLl9wYXJlbnQu
dmFsdWUoKTt0aGlzLl92YWx1ZT1wKGUsdGhpcy5fa2V5KX1yZXR1cm4gdGhpcy5fdmFsdWV9LGRl
c3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLl93YXRjaGluZyl7dmFyIGU9dGhpcy5fb2JqZWN0O2Um
JmYoZSx0aGlzLl9rZXksdGhpcyksdGhpcy5fd2F0Y2hpbmc9ITF9fSxjb3B5OmZ1bmN0aW9uKGUp
e3ZhciB0LHI9bmV3IGQobnVsbCxudWxsLGUpLG49dGhpcy5fcGF0aHM7Zm9yKHQgaW4gbiluW3Rd
PD0wfHxyLmFkZCh0KTtyZXR1cm4gcn0sYWRkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3BhdGhz
O3RbZV09KHRbZV18fDApKzE7dmFyIHI9byhlKSxuPWUuc2xpY2Uoci5sZW5ndGgrMSk7dGhpcy5j
aGFpbihyLG4pfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcGF0aHM7dFtlXT4wJiZ0
W2VdLS07dmFyIHI9byhlKSxuPWUuc2xpY2Uoci5sZW5ndGgrMSk7dGhpcy51bmNoYWluKHIsbil9
LGNoYWluOmZ1bmN0aW9uKGUsdCl7dmFyIHIsbj10aGlzLl9jaGFpbnM7dm9pZCAwPT09bj9uPXRo
aXMuX2NoYWlucz1uZXcgaS5kZWZhdWx0OnI9bltlXSx2b2lkIDA9PT1yJiYocj1uW2VdPW5ldyBk
KHRoaXMsZSx2b2lkIDApKSxyLmNvdW50KyssdCYmKGU9byh0KSx0PXQuc2xpY2UoZS5sZW5ndGgr
MSksci5jaGFpbihlLHQpKX0sdW5jaGFpbjpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuX2NoYWlu
cyxuPXJbZV07aWYodCYmdC5sZW5ndGg+MSl7dmFyIGk9byh0KSxhPXQuc2xpY2UoaS5sZW5ndGgr
MSk7bi51bmNoYWluKGksYSl9bi5jb3VudC0tLG4uY291bnQ8PTAmJihyW24uX2tleV09dm9pZCAw
LG4uZGVzdHJveSgpKX0sbm90aWZ5OmZ1bmN0aW9uKGUsdCl7aWYoZSYmdGhpcy5fd2F0Y2hpbmcp
e3ZhciByPXRoaXMuX3BhcmVudC52YWx1ZSgpO3IhPT10aGlzLl9vYmplY3QmJihmKHRoaXMuX29i
amVjdCx0aGlzLl9rZXksdGhpcyksdGhpcy5fb2JqZWN0PXIsYyhyLHRoaXMuX2tleSx0aGlzKSks
dGhpcy5fdmFsdWU9dm9pZCAwfXZhciBuLGk9dGhpcy5fY2hhaW5zO2lmKGkpZm9yKHZhciBvIGlu
IGkpbj1pW29dLHZvaWQgMCE9PW4mJm4ubm90aWZ5KGUsdCk7dCYmdGhpcy5fcGFyZW50JiZ0aGlz
Ll9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZCh0aGlzLl9rZXksMSx0KX0scG9wdWxhdGVBZmZlY3Rl
ZDpmdW5jdGlvbihlLHQscil7dGhpcy5fa2V5JiYoZT10aGlzLl9rZXkrIi4iK2UpLHRoaXMuX3Bh
cmVudD90aGlzLl9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZChlLHQrMSxyKTp0PjEmJnIucHVzaCh0
aGlzLnZhbHVlKCksZSl9fSxlLnJlbW92ZUNoYWluV2F0Y2hlcj1mLGUuQ2hhaW5Ob2RlPWR9KSxl
KCJlbWJlci1tZXRhbC9jb21wdXRlZCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJl
bWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFs
L21ldGEiLCJlbWJlci1tZXRhbC9leHBhbmRfcHJvcGVydGllcyIsImVtYmVyLW1ldGFsL2Vycm9y
IiwiZW1iZXItbWV0YWwvcHJvcGVydGllcyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cyIs
ImVtYmVyLW1ldGFsL2RlcGVuZGVudF9rZXlzIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUs
bCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoKXt9ZnVuY3Rpb24gZihlLHQpe3RoaXMuaXNEZXNj
cmlwdG9yPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuX2dldHRlcj1lOih0aGlzLl9nZXR0
ZXI9ZS5nZXQsdGhpcy5fc2V0dGVyPWUuc2V0KSx0aGlzLl9kZXBlbmRlbnRLZXlzPXZvaWQgMCx0
aGlzLl9zdXNwZW5kZWQ9dm9pZCAwLHRoaXMuX21ldGE9dm9pZCAwLHRoaXMuX3ZvbGF0aWxlPSEx
LHRoaXMuX2RlcGVuZGVudEtleXM9dCYmdC5kZXBlbmRlbnRLZXlzLHRoaXMuX3JlYWRPbmx5PSEx
fWZ1bmN0aW9uIGQoZSl7dmFyIHQ7YXJndW1lbnRzLmxlbmd0aD4xJiYodD1bXS5zbGljZS5jYWxs
KGFyZ3VtZW50cyksZT10LnBvcCgpKTt2YXIgcj1uZXcgZihlKTtyZXR1cm4gdCYmci5wcm9wZXJ0
eS5hcHBseShyLHQpLHJ9ZnVuY3Rpb24gcChlLHQpe3ZhciByPWkucGVla01ldGEoZSksbj1yJiZy
LnNvdXJjZT09PWUmJnIucmVhZGFibGVDYWNoZSgpLG89biYmblt0XTtpZihvIT09YylyZXR1cm4g
b31lLmRlZmF1bHQ9ZDtmLnByb3RvdHlwZT1uZXcgcy5EZXNjcmlwdG9yO3ZhciBoPWYucHJvdG90
eXBlO2gudm9sYXRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm9sYXRpbGU9ITAsdGhpc30s
aC5yZWFkT25seT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkT25seT0hMCx0aGlzfSxoLnBy
b3BlcnR5PWZ1bmN0aW9uKCl7dmFyIGUsdD1mdW5jdGlvbih0KXtlLnB1c2godCl9O2U9W107Zm9y
KHZhciByPTAsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspby5kZWZhdWx0KGFyZ3VtZW50c1ty
XSx0KTtyZXR1cm4gdGhpcy5fZGVwZW5kZW50S2V5cz1lLHRoaXN9LGgubWV0YT1mdW5jdGlvbihl
KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fbWV0YXx8e306KHRoaXMuX21ldGE9
ZSx0aGlzKX0saC5kaWRDaGFuZ2U9ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5fdm9sYXRpbGUmJnRo
aXMuX3N1c3BlbmRlZCE9PWUpe3ZhciByPWkucGVla01ldGEoZSk7aWYociYmci5zb3VyY2U9PT1l
KXt2YXIgbj1yLnJlYWRhYmxlQ2FjaGUoKTtuJiZ2b2lkIDAhPT1uW3RdJiYoblt0XT12b2lkIDAs
bC5yZW1vdmVEZXBlbmRlbnRLZXlzKHRoaXMsZSx0LHIpKX19fSxoLmdldD1mdW5jdGlvbihlLHQp
e2lmKHRoaXMuX3ZvbGF0aWxlKXJldHVybiB0aGlzLl9nZXR0ZXIuY2FsbChlLHQpO3ZhciByPWku
bWV0YShlKSxuPXIud3JpdGFibGVDYWNoZSgpLG89blt0XTtpZihvIT09Yyl7aWYodm9pZCAwIT09
bylyZXR1cm4gbzt2YXIgYT10aGlzLl9nZXR0ZXIuY2FsbChlLHQpO3ZvaWQgMD09PWE/blt0XT1j
Om5bdF09YTt2YXIgcz1yLnJlYWRhYmxlQ2hhaW5XYXRjaGVycygpO3JldHVybiBzJiZzLnJldmFs
aWRhdGUodCksbC5hZGREZXBlbmRlbnRLZXlzKHRoaXMsZSx0LHIpLGF9fSxoLnNldD1mdW5jdGlv
bihlLHQscil7cmV0dXJuIHRoaXMuX3JlYWRPbmx5JiZ0aGlzLl90aHJvd1JlYWRPbmx5RXJyb3Io
ZSx0KSx0aGlzLl9zZXR0ZXI/dGhpcy5fdm9sYXRpbGU/dGhpcy52b2xhdGlsZVNldChlLHQscik6
dGhpcy5zZXRXaXRoU3VzcGVuZChlLHQscik6dGhpcy5jbG9iYmVyU2V0KGUsdCxyKX0saC5fdGhy
b3dSZWFkT25seUVycm9yPWZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IGEuZGVmYXVsdCgnQ2Fubm90
IHNldCByZWFkLW9ubHkgcHJvcGVydHkgIicrdCsnIiBvbiBvYmplY3Q6ICcrbi5pbnNwZWN0KGUp
KX0saC5jbG9iYmVyU2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1wKGUsdCk7cmV0dXJuIHMuZGVm
aW5lUHJvcGVydHkoZSx0LG51bGwsaSksci5zZXQoZSx0LG4pLG59LGgudm9sYXRpbGVTZXQ9ZnVu
Y3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLl9zZXR0ZXIuY2FsbChlLHQscil9LGguc2V0V2l0aFN1
c3BlbmQ9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXMuX3N1c3BlbmRlZDt0aGlzLl9zdXNwZW5k
ZWQ9ZTt0cnl7cmV0dXJuIHRoaXMuX3NldChlLHQscil9ZmluYWxseXt0aGlzLl9zdXNwZW5kZWQ9
bn19LGguX3NldD1mdW5jdGlvbihlLHQscil7dmFyIG49aS5tZXRhKGUpLG89bi53cml0YWJsZUNh
Y2hlKCksYT0hMSxzPXZvaWQgMDt2b2lkIDAhPT1vW3RdJiYob1t0XSE9PWMmJihzPW9bdF0pLGE9
ITApO3ZhciBmPXRoaXMuX3NldHRlci5jYWxsKGUsdCxyLHMpO2lmKGEmJnM9PT1mKXJldHVybiBm
O3ZhciBkPW4ucGVla1dhdGNoaW5nKHQpO3JldHVybiBkJiZ1LnByb3BlcnR5V2lsbENoYW5nZShl
LHQpLGEmJihvW3RdPXZvaWQgMCksYXx8bC5hZGREZXBlbmRlbnRLZXlzKHRoaXMsZSx0LG4pLHZv
aWQgMD09PWY/b1t0XT1jOm9bdF09ZixkJiZ1LnByb3BlcnR5RGlkQ2hhbmdlKGUsdCksZn0saC50
ZWFyZG93bj1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLl92b2xhdGlsZSl7dmFyIHI9aS5tZXRhKGUp
LG49ci5yZWFkYWJsZUNhY2hlKCk7biYmdm9pZCAwIT09blt0XSYmKGwucmVtb3ZlRGVwZW5kZW50
S2V5cyh0aGlzLGUsdCxyKSxuW3RdPXZvaWQgMCl9fSxwLnNldD1mdW5jdGlvbihlLHQscil7dm9p
ZCAwPT09cj9lW3RdPWM6ZVt0XT1yfSxwLmdldD1mdW5jdGlvbihlLHQpe3ZhciByPWVbdF07aWYo
ciE9PWMpcmV0dXJuIHJ9LHAucmVtb3ZlPWZ1bmN0aW9uKGUsdCl7ZVt0XT12b2lkIDB9LGUuQ29t
cHV0ZWRQcm9wZXJ0eT1mLGUuY29tcHV0ZWQ9ZCxlLmNhY2hlRm9yPXB9KSxlKCJlbWJlci1tZXRh
bC9jb21wdXRlZF9tYWNyb3MiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXIt
bWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0
YWwvY29tcHV0ZWQiLCJlbWJlci1tZXRhbC9pc19lbXB0eSIsImVtYmVyLW1ldGFsL2lzX25vbmUi
LCJlbWJlci1tZXRhbC9hbGlhcyIsImVtYmVyLW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzIl0sZnVu
Y3Rpb24oZSx0LHIsbixpLG8sYSxzLHUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKGUsdCl7Zm9y
KHZhciBuPXt9LGk9MDtpPHQubGVuZ3RoO2krKyluW3RbaV1dPXIuZ2V0KGUsdFtpXSk7cmV0dXJu
IG59ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3IucHVzaChl
KX1mb3IodmFyIHI9W10sbj1pLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhp
cyxbbCh0aGlzLHIpXSl9KSxvPWFyZ3VtZW50cy5sZW5ndGgsYT1BcnJheShvKSxzPTA7czxvO3Mr
KylhW3NdPWFyZ3VtZW50c1tzXTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl1LmRlZmF1bHQo
YVtjXSx0KTtyZXR1cm4gbi5wcm9wZXJ0eS5hcHBseShuLHIpfX1mdW5jdGlvbiBmKGUpe3JldHVy
biBpLmNvbXB1dGVkKGUrIi5sZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdChyLmdl
dCh0aGlzLGUpKX0pfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGkuY29tcHV0ZWQoZSsiLmxlbmd0aCIs
ZnVuY3Rpb24oKXtyZXR1cm4hby5kZWZhdWx0KHIuZ2V0KHRoaXMsZSkpfSl9ZnVuY3Rpb24gcChl
KXtyZXR1cm4gaS5jb21wdXRlZChlLGZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVmYXVsdChyLmdldCh0
aGlzLGUpKX0pfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGkuY29tcHV0ZWQoZSxmdW5jdGlvbigpe3Jl
dHVybiFyLmdldCh0aGlzLGUpfSl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gaS5jb21wdXRlZChlLGZ1
bmN0aW9uKCl7cmV0dXJuISFyLmdldCh0aGlzLGUpfSl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBp
LmNvbXB1dGVkKGUsZnVuY3Rpb24oKXt2YXIgbj1yLmdldCh0aGlzLGUpO3JldHVybiJzdHJpbmci
PT10eXBlb2YgbiYmdC50ZXN0KG4pfSl9ZnVuY3Rpb24gYihlLHQpe3JldHVybiBpLmNvbXB1dGVk
KGUsZnVuY3Rpb24oKXtyZXR1cm4gci5nZXQodGhpcyxlKT09PXR9KX1mdW5jdGlvbiBnKGUsdCl7
cmV0dXJuIGkuY29tcHV0ZWQoZSxmdW5jdGlvbigpe3JldHVybiByLmdldCh0aGlzLGUpPnR9KX1m
dW5jdGlvbiB5KGUsdCl7cmV0dXJuIGkuY29tcHV0ZWQoZSxmdW5jdGlvbigpe3JldHVybiByLmdl
dCh0aGlzLGUpPj10fSl9ZnVuY3Rpb24gXyhlLHQpe3JldHVybiBpLmNvbXB1dGVkKGUsZnVuY3Rp
b24oKXtyZXR1cm4gci5nZXQodGhpcyxlKTx0fSl9ZnVuY3Rpb24gdyhlLHQpe3JldHVybiBpLmNv
bXB1dGVkKGUsZnVuY3Rpb24oKXtyZXR1cm4gci5nZXQodGhpcyxlKTw9dH0pfWZ1bmN0aW9uIHgo
ZSl7cmV0dXJuIHMuZGVmYXVsdChlKS5vbmVXYXkoKX1mdW5jdGlvbiBrKGUpe3JldHVybiBzLmRl
ZmF1bHQoZSkucmVhZE9ubHkoKX1mdW5jdGlvbiBDKGUsdCl7cmV0dXJuIGkuY29tcHV0ZWQoZSx7
Z2V0OmZ1bmN0aW9uKHQpe3JldHVybiByLmdldCh0aGlzLGUpfSxzZXQ6ZnVuY3Rpb24odCxyKXty
ZXR1cm4gbi5zZXQodGhpcyxlLHIpLHJ9fSl9ZS5lbXB0eT1mLGUubm90RW1wdHk9ZCxlLm5vbmU9
cCxlLm5vdD1oLGUuYm9vbD1tLGUubWF0Y2g9dixlLmVxdWFsPWIsZS5ndD1nLGUuZ3RlPXksZS5s
dD1fLGUubHRlPXcsZS5vbmVXYXk9eCxlLnJlYWRPbmx5PWssZS5kZXByZWNhdGluZ0FsaWFzPUM7
dmFyIEU9YyhmdW5jdGlvbihlKXt2YXIgdDtmb3IodmFyIHIgaW4gZSlpZih0PWVbcl0sZS5oYXNP
d25Qcm9wZXJ0eShyKSYmIXQpcmV0dXJuIHQ7cmV0dXJuIHR9KTtlLmFuZD1FO3ZhciBPPWMoZnVu
Y3Rpb24oZSl7dmFyIHQ7Zm9yKHZhciByIGluIGUpaWYodD1lW3JdLGUuaGFzT3duUHJvcGVydHko
cikmJnQpcmV0dXJuIHQ7cmV0dXJuIHR9KTtlLm9yPU99KSxlKCJlbWJlci1tZXRhbC9jb3JlIixb
ImV4cG9ydHMiLCJyZXF1aXJlIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
cigpe3JldHVybiB0aGlzfSJ1bmRlZmluZWQiPT10eXBlb2YgbiYmKG49e30pO3ZhciBvPWl8fHt9
O24uaW1wb3J0cz1uLmltcG9ydHN8fG8sbi5sb29rdXA9bi5sb29rdXB8fG87dmFyIGE9bi5leHBv
cnRzPW4uZXhwb3J0c3x8bzthLkVtPWEuRW1iZXI9bixuLmlzTmFtZXNwYWNlPSEwLG4udG9TdHJp
bmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW1iZXIifTt2YXIgcz10LmRlZmF1bHQoImVtYmVyLW1ldGFs
L2RlYnVnIik7bi5hc3NlcnQ9cy5hc3NlcnQsbi53YXJuPXMud2FybiwKK24uZGVidWc9cy5kZWJ1
ZyxuLmRlcHJlY2F0ZT1zLmRlcHJlY2F0ZSxuLmRlcHJlY2F0ZUZ1bmM9cy5kZXByZWNhdGVGdW5j
LG4ucnVuSW5EZWJ1Zz1zLnJ1bkluRGVidWcsbi5WRVJTSU9OPSIyLjYuMiIsbi5FTlY/bi5hc3Nl
cnQoIkVtYmVyLkVOViBzaG91bGQgYmUgYW4gb2JqZWN0LiIsIm9iamVjdCIhPXR5cGVvZiBuLkVO
Vik6InVuZGVmaW5lZCIhPXR5cGVvZiBFbWJlckVOVj9uLkVOVj1FbWJlckVOVjoidW5kZWZpbmVk
IiE9dHlwZW9mIEVOVj9uLkVOVj1FTlY6bi5FTlY9e30sbi5FTlYuRU5BQkxFX0FMTF9GRUFUVVJF
UyYmKG4uRU5WLkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFUz1uLkVOVi5FTkFCTEVfQUxMX0ZFQVRV
UkVTKSxuLmNvbmZpZz1uLmNvbmZpZ3x8e30sbi5FWFRFTkRfUFJPVE9UWVBFUz1uLkVOVi5FWFRF
TkRfUFJPVE9UWVBFUywidW5kZWZpbmVkIj09dHlwZW9mIG4uRVhURU5EX1BST1RPVFlQRVMmJihu
LkVYVEVORF9QUk9UT1RZUEVTPSEwKSxuLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OPW4u
RU5WLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OIT09ITEsbi5MT0dfVkVSU0lPTj1uLkVO
Vi5MT0dfVkVSU0lPTiE9PSExLGUuSz1yLG4uSz1yLGUuZGVmYXVsdD1ufSksZSgiZW1iZXItbWV0
YWwvZGVidWciLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0
KGUpe3JldHVybiBmW2VdfWZ1bmN0aW9uIHIoZSx0KXtmW2VdPXR9ZnVuY3Rpb24gbigpe3JldHVy
biBmLmFzc2VydC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiBpKCl7cmV0dXJuIGYu
aW5mby5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiBvKCl7cmV0dXJuIGYud2Fybi5h
cHBseSh2b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiBhKCl7cmV0dXJuIGYuZGVidWcuYXBwbHko
dm9pZCAwLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcygpe3JldHVybiBmLmRlcHJlY2F0ZS5hcHBseSh2
b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiB1KCl7cmV0dXJuIGYuZGVwcmVjYXRlRnVuYy5hcHBs
eSh2b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiBsKCl7cmV0dXJuIGYucnVuSW5EZWJ1Zy5hcHBs
eSh2b2lkIDAsYXJndW1lbnRzKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGYuZGVidWdTZWFsLmFwcGx5
KHZvaWQgMCxhcmd1bWVudHMpfWUuZ2V0RGVidWdGdW5jdGlvbj10LGUuc2V0RGVidWdGdW5jdGlv
bj1yLGUuYXNzZXJ0PW4sZS5pbmZvPWksZS53YXJuPW8sZS5kZWJ1Zz1hLGUuZGVwcmVjYXRlPXMs
ZS5kZXByZWNhdGVGdW5jPXUsZS5ydW5JbkRlYnVnPWwsZS5kZWJ1Z1NlYWw9Yzt2YXIgZj17YXNz
ZXJ0OmZ1bmN0aW9uKCl7fSxpbmZvOmZ1bmN0aW9uKCl7fSx3YXJuOmZ1bmN0aW9uKCl7fSxkZWJ1
ZzpmdW5jdGlvbigpe30sZGVwcmVjYXRlOmZ1bmN0aW9uKCl7fSxkZXByZWNhdGVGdW5jOmZ1bmN0
aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxyPTA7cjxlO3IrKyl0
W3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX0scnVuSW5EZWJ1ZzpmdW5jdGlv
bigpe30sZGVidWdTZWFsOmZ1bmN0aW9uKCl7fX07ZS5kZWJ1Z0Z1bmN0aW9ucz1mfSksZSgiZW1i
ZXItbWV0YWwvZGVwZW5kZW50X2tleXMiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL3dhdGNoaW5n
Il0sZnVuY3Rpb24oZSx0KXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIsbixpKXt2YXIg
byxhLHMsdT1lLl9kZXBlbmRlbnRLZXlzO2lmKHUpZm9yKG89MCxhPXUubGVuZ3RoO288YTtvKysp
cz11W29dLGkud3JpdGVEZXBzKHMsbiwoaS5wZWVrRGVwcyhzLG4pfHwwKSsxKSx0LndhdGNoKHIs
cyxpKX1mdW5jdGlvbiBuKGUscixuLGkpe3ZhciBvLGEscyx1PWUuX2RlcGVuZGVudEtleXM7aWYo
dSlmb3Iobz0wLGE9dS5sZW5ndGg7bzxhO28rKylzPXVbb10saS53cml0ZURlcHMocyxuLChpLnBl
ZWtEZXBzKHMsbil8fDApLTEpLHQudW53YXRjaChyLHMsaSl9ZS5hZGREZXBlbmRlbnRLZXlzPXIs
ZS5yZW1vdmVEZXBlbmRlbnRLZXlzPW59KSxlKCJlbWJlci1tZXRhbC9kZXByZWNhdGVfcHJvcGVy
dHkiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0Il0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIGkoZSx0LGksbyl7ZnVuY3Rpb24gYSgpe31PYmplY3QuZGVmaW5lUHJv
cGVydHkoZSx0LHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxzZXQ6ZnVuY3Rpb24oZSl7
YSgpLG4uc2V0KHRoaXMsaSxlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKSxyLmdldCh0aGlz
LGkpfX0pfWUuZGVwcmVjYXRlUHJvcGVydHk9aX0pLGUoImVtYmVyLW1ldGFsL2RpY3Rpb25hcnki
LFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2VtcHR5X29iamVjdCJdLGZ1bmN0aW9uKGUsdCl7InVz
ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHI7cmV0dXJuIHI9bnVsbD09PWU/bmV3IHQuZGVm
YXVsdDpPYmplY3QuY3JlYXRlKGUpLHIuX2RpY3Q9bnVsbCxkZWxldGUgci5fZGljdCxyfWUuZGVm
YXVsdD1yfSksZSgiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IixbImV4cG9ydHMiXSxmdW5jdGlv
bihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdCgpe312YXIgcj1PYmplY3QuY3JlYXRlKG51bGws
e2NvbnN0cnVjdG9yOnt2YWx1ZTp2b2lkIDAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH19KTt0
LnByb3RvdHlwZT1yLGUuZGVmYXVsdD10fSksZSgiZW1iZXItbWV0YWwvZW52aXJvbm1lbnQiLFsi
ZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2
YXIgcixuPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRv
Y3VtZW50JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQmJiF0LmRl
ZmF1bHQuRU5WLmRpc2FibGVCcm93c2VyRW52aXJvbm1lbnQ7cj1uP3toYXNET006ITAsaXNDaHJv
bWU6ISF3aW5kb3cuY2hyb21lJiYhd2luZG93Lm9wZXJhLGlzRmlyZWZveDoidW5kZWZpbmVkIiE9
dHlwZW9mIEluc3RhbGxUcmlnZ2VyLGlzUGhhbnRvbTohIXdpbmRvdy5jYWxsUGhhbnRvbSxsb2Nh
dGlvbjp3aW5kb3cubG9jYXRpb24saGlzdG9yeTp3aW5kb3cuaGlzdG9yeSx1c2VyQWdlbnQ6d2lu
ZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsZ2xvYmFsOndpbmRvd306e2hhc0RPTTohMSxpc0Nocm9t
ZTohMSxpc0ZpcmVmb3g6ITEsaXNQaGFudG9tOiExLGxvY2F0aW9uOm51bGwsaGlzdG9yeTpudWxs
LHVzZXJBZ2VudDoiTHlueCAodGV4dG1vZGUpIixnbG9iYWw6bnVsbH0sZS5kZWZhdWx0PXJ9KSxl
KCJlbWJlci1tZXRhbC9lcnJvciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSJdLGZ1bmN0
aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt2YXIgZT1FcnJvci5hcHBseSh0aGlz
LGFyZ3VtZW50cyk7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1Ry
YWNlKHRoaXMsdC5kZWZhdWx0LkVycm9yKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl0aGlz
W25bcl1dPWVbbltyXV19ZS5kZWZhdWx0PXI7dmFyIG49WyJkZXNjcmlwdGlvbiIsImZpbGVOYW1l
IiwibGluZU51bWJlciIsIm1lc3NhZ2UiLCJuYW1lIiwibnVtYmVyIiwic3RhY2siXTtyLnByb3Rv
dHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSl9KSxlKCJlbWJlci1tZXRhbC9ldmVu
dHMiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvdXRpbHMiLCJl
bWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMiXSxmdW5jdGlvbihl
LHQscixuLGkpeyJubyB1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxyKXtmb3IodmFyIG49LTEs
aT1lLmxlbmd0aC0zO2k+PTA7aS09MylpZih0PT09ZVtpXSYmcj09PWVbaSsxXSl7bj1pO2JyZWFr
fXJldHVybiBufWZ1bmN0aW9uIGEoZSx0LHIpe3ZhciBpPW4ucGVla01ldGEoZSk7aWYoaSl7Zm9y
KHZhciBhPWkubWF0Y2hpbmdMaXN0ZW5lcnModCkscz1bXSx1PWEubGVuZ3RoLTM7dT49MDt1LT0z
KXt2YXIgbD1hW3VdLGM9YVt1KzFdLGY9YVt1KzJdLGQ9byhyLGwsYyk7ZD09PS0xJiYoci5wdXNo
KGwsYyxmKSxzLnB1c2gobCxjLGYpKX1yZXR1cm4gc319ZnVuY3Rpb24gcyhlLHQscixvLGEpe298
fCJmdW5jdGlvbiIhPXR5cGVvZiByfHwobz1yLHI9bnVsbCk7dmFyIHM9MDthJiYoc3w9aS5PTkNF
KSxuLm1ldGEoZSkuYWRkVG9MaXN0ZW5lcnModCxyLG8scyksImZ1bmN0aW9uIj09dHlwZW9mIGUu
ZGlkQWRkTGlzdGVuZXImJmUuZGlkQWRkTGlzdGVuZXIodCxyLG8pfWZ1bmN0aW9uIHUoZSx0LHIs
aSl7aXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHJ8fChpPXIscj1udWxsKSxuLm1ldGEoZSkucmVtb3Zl
RnJvbUxpc3RlbmVycyh0LHIsaSxmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLmRpZFJl
bW92ZUxpc3RlbmVyJiZlLmRpZFJlbW92ZUxpc3RlbmVyLmFwcGx5KGUsYXJndW1lbnRzKX0pfWZ1
bmN0aW9uIGwoZSx0LHIsbixpKXtyZXR1cm4gYyhlLFt0XSxyLG4saSl9ZnVuY3Rpb24gYyhlLHQs
cixpLG8pe3JldHVybiBpfHwiZnVuY3Rpb24iIT10eXBlb2Ygcnx8KGk9cixyPW51bGwpLG4ubWV0
YShlKS5zdXNwZW5kTGlzdGVuZXJzKHQscixpLG8pfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIG4ubWV0
YShlKS53YXRjaGVkRXZlbnRzKCl9ZnVuY3Rpb24gZChlLHQsbyxhKXtpZighYSl7dmFyIHM9bi5w
ZWVrTWV0YShlKTthPXMmJnMubWF0Y2hpbmdMaXN0ZW5lcnModCl9aWYoYSYmMCE9PWEubGVuZ3Ro
KXtmb3IodmFyIGw9YS5sZW5ndGgtMztsPj0wO2wtPTMpe3ZhciBjPWFbbF0sZj1hW2wrMV0sZD1h
W2wrMl07ZiYmKGQmaS5TVVNQRU5ERUR8fChkJmkuT05DRSYmdShlLHQsYyxmKSxjfHwoYz1lKSwi
c3RyaW5nIj09dHlwZW9mIGY/bz9yLmFwcGx5U3RyKGMsZixvKTpjW2ZdKCk6bz9mLmFwcGx5KGMs
byk6Zi5jYWxsKGMpKSl9cmV0dXJuITB9fWZ1bmN0aW9uIHAoZSx0KXt2YXIgcj1uLnBlZWtNZXRh
KGUpO3JldHVybiEhciYmci5tYXRjaGluZ0xpc3RlbmVycyh0KS5sZW5ndGg+MH1mdW5jdGlvbiBo
KGUsdCl7dmFyIHI9W10saT1uLnBlZWtNZXRhKGUpLG89aSYmaS5tYXRjaGluZ0xpc3RlbmVycyh0
KTtpZighbylyZXR1cm4gcjtmb3IodmFyIGE9MCxzPW8ubGVuZ3RoO2E8czthKz0zKXt2YXIgdT1v
W2FdLGw9b1thKzFdO3IucHVzaChbdSxsXSl9cmV0dXJuIHJ9ZnVuY3Rpb24gbSgpe2Zvcih2YXIg
ZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSkscj0wO3I8ZTtyKyspdFtyXT1hcmd1bWVudHNb
cl07dmFyIG49dC5wb3AoKSxpPXQ7cmV0dXJuIG4uX19lbWJlcl9saXN0ZW5zX189aSxufWUuYWNj
dW11bGF0ZUxpc3RlbmVycz1hLGUuYWRkTGlzdGVuZXI9cyxlLnJlbW92ZUxpc3RlbmVyPXUsZS5z
dXNwZW5kTGlzdGVuZXI9bCxlLnN1c3BlbmRMaXN0ZW5lcnM9YyxlLndhdGNoZWRFdmVudHM9Zixl
LnNlbmRFdmVudD1kLGUuaGFzTGlzdGVuZXJzPXAsZS5saXN0ZW5lcnNGb3I9aCxlLm9uPW19KSxl
KCJlbWJlci1tZXRhbC9leHBhbmRfcHJvcGVydGllcyIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
ZGVidWciXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZh
ciByPWUuc3BsaXQoaSksYT1bcl0scz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgdT1yW3NdO3UuaW5k
ZXhPZigiLCIpPj0wJiYoYT1uKGEsdS5zcGxpdCgiLCIpLHMpKX1mb3IodmFyIHM9MDtzPGEubGVu
Z3RoO3MrKyl0KGFbc10uam9pbigiIikucmVwbGFjZShvLCIuW10iKSl9ZnVuY3Rpb24gbihlLHQs
cil7dmFyIG49W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXt0LmZvckVhY2goZnVuY3Rp
b24odCl7dmFyIGk9ZS5zbGljZSgwKTtpW3JdPXQsbi5wdXNoKGkpfSl9KSxufWUuZGVmYXVsdD1y
O3ZhciBpPS9ce3xcfS8sbz0vXC5AZWFjaCQvfSksZSgiZW1iZXItbWV0YWwvZmVhdHVyZXMiLFsi
ZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1tZXRhbC9hc3NpZ24iXSxmdW5jdGlv
bihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7dmFyIHI9b1tlXTtyZXR1cm4gcj09
PSEwfHxyPT09ITF8fHZvaWQgMD09PXI/cjohIXQuZGVmYXVsdC5FTlYuRU5BQkxFX09QVElPTkFM
X0ZFQVRVUkVTfWUuZGVmYXVsdD1uO3ZhciBpPXt9O2UuS05PV05fRkVBVFVSRVM9aTt2YXIgbz1y
LmRlZmF1bHQoaSx0LmRlZmF1bHQuRU5WLkZFQVRVUkVTKTtlLkZFQVRVUkVTPW99KSxlKCJlbWJl
ci1tZXRhbC9nZXRfcHJvcGVydGllcyIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgcj17fSxu
PWFyZ3VtZW50cyxpPTE7Mj09PWFyZ3VtZW50cy5sZW5ndGgmJkFycmF5LmlzQXJyYXkoYXJndW1l
bnRzWzFdKSYmKGk9MCxuPWFyZ3VtZW50c1sxXSk7Zm9yKHZhciBvPW4ubGVuZ3RoO2k8bztpKysp
cltuW2ldXT10LmdldChlLG5baV0pO3JldHVybiByfWUuZGVmYXVsdD1yfSksZSgiZW1iZXItbWV0
YWwvaW5kZXgiLFsiZXhwb3J0cyIsInJlcXVpcmUiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXIt
bWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9mZWF0dXJlcyIsImVtYmVyLW1ldGFsL2Fzc2lnbiIs
ImVtYmVyLW1ldGFsL21lcmdlIiwiZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0aW9uIiwiZW1iZXIt
bWV0YWwvdXRpbHMiLCJlbWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvZXJyb3IiLCJlbWJl
ci1tZXRhbC9jYWNoZSIsImVtYmVyLW1ldGFsL2xvZ2dlciIsImVtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCIsImVtYmVyLW1ldGFsL2V2ZW50cyIsImVtYmVyLW1ldGFsL29ic2VydmVyX3NldCIsImVt
YmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cyIsImVtYmVyLW1ldGFsL3Byb3BlcnRpZXMiLCJlbWJl
ci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9tYXAiLCJlbWJlci1tZXRhbC9nZXRf
cHJvcGVydGllcyIsImVtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVzIiwiZW1iZXItbWV0YWwvd2F0
Y2hfa2V5IiwiZW1iZXItbWV0YWwvY2hhaW5zIiwiZW1iZXItbWV0YWwvd2F0Y2hfcGF0aCIsImVt
YmVyLW1ldGFsL3dhdGNoaW5nIiwiZW1iZXItbWV0YWwvZXhwYW5kX3Byb3BlcnRpZXMiLCJlbWJl
ci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL2FsaWFzIiwiZW1iZXItbWV0YWwvY29tcHV0
ZWRfbWFjcm9zIiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9taXhpbiIsImVt
YmVyLW1ldGFsL2JpbmRpbmciLCJlbWJlci1tZXRhbC9wYXRoX2NhY2hlIiwiZW1iZXItbWV0YWwv
cnVuX2xvb3AiLCJlbWJlci1tZXRhbC9saWJyYXJpZXMiLCJlbWJlci1tZXRhbC9pc19ub25lIiwi
ZW1iZXItbWV0YWwvaXNfZW1wdHkiLCJlbWJlci1tZXRhbC9pc19ibGFuayIsImVtYmVyLW1ldGFs
L2lzX3ByZXNlbnQiLCJiYWNrYnVybmVyIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxj
LGYsZCxwLGgsbSx2LGIsZyx5LF8sdyx4LGssQyxFLE8sVCxOLFMsQSxQLGosUixMLEQsTSxJLEYs
SCxWKXsidXNlIHN0cmljdCI7VC5jb21wdXRlZC5lbXB0eT1TLmVtcHR5LFQuY29tcHV0ZWQubm90
RW1wdHk9Uy5ub3RFbXB0eSxULmNvbXB1dGVkLm5vbmU9Uy5ub25lLFQuY29tcHV0ZWQubm90PVMu
bm90LFQuY29tcHV0ZWQuYm9vbD1TLmJvb2wsVC5jb21wdXRlZC5tYXRjaD1TLm1hdGNoLFQuY29t
cHV0ZWQuZXF1YWw9Uy5lcXVhbCxULmNvbXB1dGVkLmd0PVMuZ3QsVC5jb21wdXRlZC5ndGU9Uy5n
dGUsVC5jb21wdXRlZC5sdD1TLmx0LFQuY29tcHV0ZWQubHRlPVMubHRlLFQuY29tcHV0ZWQuYWxp
YXM9Ti5kZWZhdWx0LFQuY29tcHV0ZWQub25lV2F5PVMub25lV2F5LFQuY29tcHV0ZWQucmVhZHM9
Uy5vbmVXYXksVC5jb21wdXRlZC5yZWFkT25seT1TLnJlYWRPbmx5LFQuY29tcHV0ZWQuZGVmYXVs
dFRvPVMuZGVmYXVsdFRvLFQuY29tcHV0ZWQuZGVwcmVjYXRpbmdBbGlhcz1TLmRlcHJlY2F0aW5n
QWxpYXMsVC5jb21wdXRlZC5hbmQ9Uy5hbmQsVC5jb21wdXRlZC5vcj1TLm9yLFQuY29tcHV0ZWQu
YW55PVMuYW55O3ZhciBxPXIuZGVmYXVsdC5JbnN0cnVtZW50YXRpb249e307cS5pbnN0cnVtZW50
PXMuaW5zdHJ1bWVudCxxLnN1YnNjcmliZT1zLnN1YnNjcmliZSxxLnVuc3Vic2NyaWJlPXMudW5z
dWJzY3JpYmUscS5yZXNldD1zLnJlc2V0LHIuZGVmYXVsdC5pbnN0cnVtZW50PXMuaW5zdHJ1bWVu
dCxyLmRlZmF1bHQuc3Vic2NyaWJlPXMuc3Vic2NyaWJlLHIuZGVmYXVsdC5fQ2FjaGU9Zi5kZWZh
dWx0LHIuZGVmYXVsdC5nZW5lcmF0ZUd1aWQ9dS5nZW5lcmF0ZUd1aWQsci5kZWZhdWx0LkdVSURf
S0VZPXUuR1VJRF9LRVksci5kZWZhdWx0LnBsYXRmb3JtPXtkZWZpbmVQcm9wZXJ0eTohMCxoYXNQ
cm9wZXJ0eUFjY2Vzc29yczohMH0sci5kZWZhdWx0LkVycm9yPWMuZGVmYXVsdCxyLmRlZmF1bHQu
Z3VpZEZvcj11Lmd1aWRGb3Isci5kZWZhdWx0Lk1FVEFfREVTQz1sLk1FVEFfREVTQyxyLmRlZmF1
bHQubWV0YT1sLm1ldGEsci5kZWZhdWx0Lmluc3BlY3Q9dS5pbnNwZWN0LHIuZGVmYXVsdC50cnlD
YXRjaEZpbmFsbHk9dS5kZXByZWNhdGVkVHJ5Q2F0Y2hGaW5hbGx5LHIuZGVmYXVsdC5tYWtlQXJy
YXk9dS5tYWtlQXJyYXksci5kZWZhdWx0LmNhbkludm9rZT11LmNhbkludm9rZSxyLmRlZmF1bHQu
dHJ5SW52b2tlPXUudHJ5SW52b2tlLHIuZGVmYXVsdC53cmFwPXUud3JhcCxyLmRlZmF1bHQuYXBw
bHk9dS5hcHBseSxyLmRlZmF1bHQuYXBwbHlTdHI9dS5hcHBseVN0cixyLmRlZmF1bHQudXVpZD11
LnV1aWQsci5kZWZhdWx0LkxvZ2dlcj1kLmRlZmF1bHQsci5kZWZhdWx0LmdldD1wLmdldCxyLmRl
ZmF1bHQuZ2V0V2l0aERlZmF1bHQ9cC5nZXRXaXRoRGVmYXVsdCxyLmRlZmF1bHQuX2dldFBhdGg9
cC5fZ2V0UGF0aCxyLmRlZmF1bHQub249aC5vbixyLmRlZmF1bHQuYWRkTGlzdGVuZXI9aC5hZGRM
aXN0ZW5lcixyLmRlZmF1bHQucmVtb3ZlTGlzdGVuZXI9aC5yZW1vdmVMaXN0ZW5lcixyLmRlZmF1
bHQuX3N1c3BlbmRMaXN0ZW5lcj1oLnN1c3BlbmRMaXN0ZW5lcixyLmRlZmF1bHQuX3N1c3BlbmRM
aXN0ZW5lcnM9aC5zdXNwZW5kTGlzdGVuZXJzLHIuZGVmYXVsdC5zZW5kRXZlbnQ9aC5zZW5kRXZl
bnQsci5kZWZhdWx0Lmhhc0xpc3RlbmVycz1oLmhhc0xpc3RlbmVycyxyLmRlZmF1bHQud2F0Y2hl
ZEV2ZW50cz1oLndhdGNoZWRFdmVudHMsci5kZWZhdWx0Lmxpc3RlbmVyc0Zvcj1oLmxpc3RlbmVy
c0ZvcixyLmRlZmF1bHQuYWNjdW11bGF0ZUxpc3RlbmVycz1oLmFjY3VtdWxhdGVMaXN0ZW5lcnMs
ci5kZWZhdWx0Ll9PYnNlcnZlclNldD1tLmRlZmF1bHQsci5kZWZhdWx0LnByb3BlcnR5V2lsbENo
YW5nZT12LnByb3BlcnR5V2lsbENoYW5nZSxyLmRlZmF1bHQucHJvcGVydHlEaWRDaGFuZ2U9di5w
cm9wZXJ0eURpZENoYW5nZSxyLmRlZmF1bHQub3ZlcnJpZGVDaGFpbnM9di5vdmVycmlkZUNoYWlu
cyxyLmRlZmF1bHQuYmVnaW5Qcm9wZXJ0eUNoYW5nZXM9di5iZWdpblByb3BlcnR5Q2hhbmdlcyxy
LmRlZmF1bHQuZW5kUHJvcGVydHlDaGFuZ2VzPXYuZW5kUHJvcGVydHlDaGFuZ2VzLHIuZGVmYXVs
dC5jaGFuZ2VQcm9wZXJ0aWVzPXYuY2hhbmdlUHJvcGVydGllcyxyLmRlZmF1bHQuZGVmaW5lUHJv
cGVydHk9Yi5kZWZpbmVQcm9wZXJ0eSxyLmRlZmF1bHQuc2V0PWcuc2V0LHIuZGVmYXVsdC50cnlT
ZXQ9Zy50cnlTZXQsci5kZWZhdWx0Lk9yZGVyZWRTZXQ9eS5PcmRlcmVkU2V0LHIuZGVmYXVsdC5N
YXA9eS5NYXAsci5kZWZhdWx0Lk1hcFdpdGhEZWZhdWx0PXkuTWFwV2l0aERlZmF1bHQsci5kZWZh
dWx0LmdldFByb3BlcnRpZXM9Xy5kZWZhdWx0LHIuZGVmYXVsdC5zZXRQcm9wZXJ0aWVzPXcuZGVm
YXVsdCxyLmRlZmF1bHQud2F0Y2hLZXk9eC53YXRjaEtleSxyLmRlZmF1bHQudW53YXRjaEtleT14
LnVud2F0Y2hLZXksci5kZWZhdWx0LnJlbW92ZUNoYWluV2F0Y2hlcj1rLnJlbW92ZUNoYWluV2F0
Y2hlcixyLmRlZmF1bHQuX0NoYWluTm9kZT1rLkNoYWluTm9kZSxyLmRlZmF1bHQuZmluaXNoQ2hh
aW5zPWsuZmluaXNoQ2hhaW5zLHIuZGVmYXVsdC53YXRjaFBhdGg9Qy53YXRjaFBhdGgsci5kZWZh
dWx0LnVud2F0Y2hQYXRoPUMudW53YXRjaFBhdGgsci5kZWZhdWx0LndhdGNoPUUud2F0Y2gsci5k
ZWZhdWx0LmlzV2F0Y2hpbmc9RS5pc1dhdGNoaW5nLHIuZGVmYXVsdC51bndhdGNoPUUudW53YXRj
aCxyLmRlZmF1bHQucmV3YXRjaD1FLnJld2F0Y2gsci5kZWZhdWx0LmRlc3Ryb3k9RS5kZXN0cm95
LHIuZGVmYXVsdC5leHBhbmRQcm9wZXJ0aWVzPU8uZGVmYXVsdCxyLmRlZmF1bHQuQ29tcHV0ZWRQ
cm9wZXJ0eT1ULkNvbXB1dGVkUHJvcGVydHksci5kZWZhdWx0LmNvbXB1dGVkPVQuY29tcHV0ZWQs
ci5kZWZhdWx0LmNhY2hlRm9yPVQuY2FjaGVGb3Isci5kZWZhdWx0LmFkZE9ic2VydmVyPUEuYWRk
T2JzZXJ2ZXIsci5kZWZhdWx0Lm9ic2VydmVyc0Zvcj1BLm9ic2VydmVyc0ZvcixyLmRlZmF1bHQu
cmVtb3ZlT2JzZXJ2ZXI9QS5yZW1vdmVPYnNlcnZlcixyLmRlZmF1bHQuX3N1c3BlbmRPYnNlcnZl
cj1BLl9zdXNwZW5kT2JzZXJ2ZXIsci5kZWZhdWx0Ll9zdXNwZW5kT2JzZXJ2ZXJzPUEuX3N1c3Bl
bmRPYnNlcnZlcnMsci5kZWZhdWx0LklTX0JJTkRJTkc9UC5JU19CSU5ESU5HLHIuZGVmYXVsdC5y
ZXF1aXJlZD1QLnJlcXVpcmVkLHIuZGVmYXVsdC5hbGlhc01ldGhvZD1QLmFsaWFzTWV0aG9kLHIu
ZGVmYXVsdC5vYnNlcnZlcj1QLm9ic2VydmVyLHIuZGVmYXVsdC5pbW1lZGlhdGVPYnNlcnZlcj1Q
Ll9pbW1lZGlhdGVPYnNlcnZlcixyLmRlZmF1bHQubWl4aW49UC5taXhpbixyLmRlZmF1bHQuTWl4
aW49UC5NaXhpbixyLmRlZmF1bHQuYmluZD1qLmJpbmQsci5kZWZhdWx0LkJpbmRpbmc9ai5CaW5k
aW5nLHIuZGVmYXVsdC5pc0dsb2JhbFBhdGg9Ui5pc0dsb2JhbFBhdGgsci5kZWZhdWx0LnJ1bj1M
LmRlZmF1bHQsci5kZWZhdWx0LkJhY2tidXJuZXI9Vi5kZWZhdWx0LHIuZGVmYXVsdC5fQmFja2J1
cm5lcj1WLmRlZmF1bHQsci5kZWZhdWx0LmxpYnJhcmllcz1uZXcgRC5kZWZhdWx0LHIuZGVmYXVs
dC5saWJyYXJpZXMucmVnaXN0ZXJDb3JlTGlicmFyeSgiRW1iZXIiLHIuZGVmYXVsdC5WRVJTSU9O
KSxyLmRlZmF1bHQuaXNOb25lPU0uZGVmYXVsdCxyLmRlZmF1bHQuaXNFbXB0eT1JLmRlZmF1bHQs
ci5kZWZhdWx0LmlzQmxhbms9Ri5kZWZhdWx0LHIuZGVmYXVsdC5pc1ByZXNlbnQ9SC5kZWZhdWx0
LHIuZGVmYXVsdC5hc3NpZ249T2JqZWN0LmFzc2lnbnx8by5kZWZhdWx0LHIuZGVmYXVsdC5tZXJn
ZT1hLmRlZmF1bHQsci5kZWZhdWx0LkZFQVRVUkVTPWkuRkVBVFVSRVMsci5kZWZhdWx0LkZFQVRV
UkVTLmlzRW5hYmxlZD1pLmRlZmF1bHQsci5kZWZhdWx0Lm9uZXJyb3I9bnVsbCx0LmhhcygiZW1i
ZXItZGVidWciKT90LmRlZmF1bHQoImVtYmVyLWRlYnVnIik6KHIuZGVmYXVsdC5EZWJ1Zz17fSxy
LmRlZmF1bHQuRGVidWcucmVnaXN0ZXJEZXByZWNhdGlvbkhhbmRsZXI9ZnVuY3Rpb24oKXt9LHIu
ZGVmYXVsdC5EZWJ1Zy5yZWdpc3Rlcldhcm5IYW5kbGVyPWZ1bmN0aW9uKCl7fSksci5kZWZhdWx0
LmNyZWF0ZT1uLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLmNyZWF0ZSBpcyBkZXByZWNhdGVkIGluIGZh
dm9yIG9mIE9iamVjdC5jcmVhdGUiLHtpZDoiZW1iZXItbWV0YWwuZW1iZXItY3JlYXRlIix1bnRp
bDoiMy4wLjAifSxPYmplY3QuY3JlYXRlKSxyLmRlZmF1bHQua2V5cz1uLmRlcHJlY2F0ZUZ1bmMo
IkVtYmVyLmtleXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBPYmplY3Qua2V5cyIse2lkOiJl
bWJlci1tZXRhbC5lbWJlci5rZXlzIix1bnRpbDoiMy4wLjAifSxPYmplY3Qua2V5cyksZS5kZWZh
dWx0PXIuZGVmYXVsdH0pLGUoImVtYmVyLW1ldGFsL2luamVjdGVkX3Byb3BlcnR5IixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL2NvbXB1dGVkIiwiZW1iZXItbWV0
YWwvYWxpYXMiLCJlbWJlci1tZXRhbC9wcm9wZXJ0aWVzIiwiY29udGFpbmVyL293bmVyIl0sZnVu
Y3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCl7dGhpcy50eXBl
PWUsdGhpcy5uYW1lPXQsdGhpcy5fc3VwZXIkQ29uc3RydWN0b3IocyksYy5vbmVXYXkuY2FsbCh0
aGlzKX1mdW5jdGlvbiBzKGUpe3ZhciB0PXRoaXNbZV0scj1vLmdldE93bmVyKHRoaXMpfHx0aGlz
LmNvbnRhaW5lcjtyZXR1cm4gci5sb29rdXAodC50eXBlKyI6IisodC5uYW1lfHxlKSl9YS5wcm90
b3R5cGU9T2JqZWN0LmNyZWF0ZShpLkRlc2NyaXB0b3IucHJvdG90eXBlKTt2YXIgdT1hLnByb3Rv
dHlwZSxsPXIuQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUsYz1uLkFsaWFzZWRQcm9wZXJ0eS5w
cm90b3R5cGU7dS5fc3VwZXIkQ29uc3RydWN0b3I9ci5Db21wdXRlZFByb3BlcnR5LHUuZ2V0PWwu
Z2V0LHUucmVhZE9ubHk9bC5yZWFkT25seSx1LnRlYXJkb3duPWwudGVhcmRvd24sZS5kZWZhdWx0
PWF9KSxlKCJlbWJlci1tZXRhbC9pbnN0cnVtZW50YXRpb24iLFsiZXhwb3J0cyIsImVtYmVyLW1l
dGFsL2NvcmUiLCJlbWJlci1tZXRhbC9mZWF0dXJlcyJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gbihlLHQscixuKXtpZihhcmd1bWVudHMubGVuZ3RoPD0zJiYiZnVuY3Rp
b24iPT10eXBlb2YgdCYmKG49cixyPXQsdD12b2lkIDApLDA9PT1sLmxlbmd0aClyZXR1cm4gci5j
YWxsKG4pO3ZhciBhPXR8fHt9LHM9byhlLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTtyZXR1cm4gcz9p
KHIscyxhLG4pOnIuY2FsbChuKX1mdW5jdGlvbiBpKGUsdCxyLG4pe3ZhciBpPXZvaWQgMDt0cnl7
aT1lLmNhbGwobil9Y2F0Y2goZSl7ci5leGNlcHRpb249ZSxpPXJ9ZmluYWxseXtyZXR1cm4gdCgp
LGl9fWZ1bmN0aW9uIG8oZSxyKXt2YXIgbj1mW2VdO2lmKG58fChuPWQoZSkpLDAhPT1uLmxlbmd0
aCl7dmFyIGksbz1yKCksYT10LmRlZmF1bHQuU1RSVUNUVVJFRF9QUk9GSUxFO2EmJihpPWUrIjog
IitvLm9iamVjdCxjb25zb2xlLnRpbWUoaSkpO3ZhciBzLHUsbD1uLmxlbmd0aCxjPW5ldyBBcnJh
eShsKSxoPXAoKTtmb3Iocz0wO3M8bDtzKyspdT1uW3NdLGNbc109dS5iZWZvcmUoZSxoLG8pO3Jl
dHVybiBmdW5jdGlvbigpe3ZhciB0LHIscyx1PXAoKTtmb3IodD0wLHI9bi5sZW5ndGg7dDxyO3Qr
KylzPW5bdF0sImZ1bmN0aW9uIj09dHlwZW9mIHMuYWZ0ZXImJnMuYWZ0ZXIoZSx1LG8sY1t0XSk7
YSYmY29uc29sZS50aW1lRW5kKGkpfX19ZnVuY3Rpb24gYShlLHQpe2Zvcih2YXIgcixuPWUuc3Bs
aXQoIi4iKSxpPVtdLG89MCxhPW4ubGVuZ3RoO288YTtvKyspcj1uW29dLCIqIj09PXI/aS5wdXNo
KCJbXlxcLl0qIik6aS5wdXNoKHIpO2k9aS5qb2luKCJcXC4iKSxpKz0iKFxcLi4qKT8iO3ZhciBz
PXtwYXR0ZXJuOmUscmVnZXg6bmV3IFJlZ0V4cCgiXiIraSsiJCIpLG9iamVjdDp0fTtyZXR1cm4g
bC5wdXNoKHMpLGY9e30sc31mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxyPTAsbj1sLmxlbmd0aDty
PG47cisrKWxbcl09PT1lJiYodD1yKTtsLnNwbGljZSh0LDEpLGY9e319ZnVuY3Rpb24gdSgpe2wu
bGVuZ3RoPTAsZj17fX1lLmluc3RydW1lbnQ9bixlLl9pbnN0cnVtZW50U3RhcnQ9byxlLnN1YnNj
cmliZT1hLGUudW5zdWJzY3JpYmU9cyxlLnJlc2V0PXU7dmFyIGw9W107ZS5zdWJzY3JpYmVycz1s
O3ZhciBjLGY9e30sZD1mdW5jdGlvbihlKXtmb3IodmFyIHQscj1bXSxuPTAsaT1sLmxlbmd0aDtu
PGk7bisrKXQ9bFtuXSx0LnJlZ2V4LnRlc3QoZSkmJnIucHVzaCh0Lm9iamVjdCk7cmV0dXJuIGZb
ZV09cixyfSxwPWZ1bmN0aW9uKCl7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2lu
ZG93LnBlcmZvcm1hbmNlfHx7fTp7fSx0PWUubm93fHxlLm1vek5vd3x8ZS53ZWJraXROb3d8fGUu
bXNOb3d8fGUub05vdztyZXR1cm4gdD90LmJpbmQoZSk6ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERh
dGV9fSgpO2UuZmxhZ2dlZEluc3RydW1lbnQ9Yz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHIoKX0s
ZS5mbGFnZ2VkSW5zdHJ1bWVudD1jfSksZSgiZW1iZXItbWV0YWwvaXNfYmxhbmsiLFsiZXhwb3J0
cyIsImVtYmVyLW1ldGFsL2lzX2VtcHR5Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gcihlKXtyZXR1cm4gdC5kZWZhdWx0KGUpfHwic3RyaW5nIj09dHlwZW9mIGUmJm51bGw9
PT1lLm1hdGNoKC9cUy8pfWUuZGVmYXVsdD1yfSksZSgiZW1iZXItbWV0YWwvaXNfZW1wdHkiLFsi
ZXhwb3J0cyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL2lzX25vbmUi
XSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7dmFyIG49ci5kZWZh
dWx0KGUpO2lmKG4pcmV0dXJuIG47aWYoIm51bWJlciI9PXR5cGVvZiBlLnNpemUpcmV0dXJuIWUu
c2l6ZTt2YXIgaT10eXBlb2YgZTtpZigib2JqZWN0Ij09PWkpe3ZhciBvPXQuZ2V0KGUsInNpemUi
KTtpZigibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuIW99aWYoIm51bWJlciI9PXR5cGVvZiBlLmxl
bmd0aCYmImZ1bmN0aW9uIiE9PWkpcmV0dXJuIWUubGVuZ3RoO2lmKCJvYmplY3QiPT09aSl7dmFy
IGE9dC5nZXQoZSwibGVuZ3RoIik7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiFhfXJldHVy
biExfWUuZGVmYXVsdD1ufSksZSgiZW1iZXItbWV0YWwvaXNfbm9uZSIsWyJleHBvcnRzIl0sZnVu
Y3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lk
IDA9PT1lfWUuZGVmYXVsdD10fSksZSgiZW1iZXItbWV0YWwvaXNfcHJlc2VudCIsWyJleHBvcnRz
IiwiZW1iZXItbWV0YWwvaXNfYmxhbmsiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5j
dGlvbiByKGUpe3JldHVybiF0LmRlZmF1bHQoZSl9ZS5kZWZhdWx0PXJ9KSxlKCJlbWJlci1tZXRh
bC9saWJyYXJpZXMiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwv
ZmVhdHVyZXMiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXt0aGlz
Ll9yZWdpc3RyeT1bXSx0aGlzLl9jb3JlTGliSW5kZXg9MH1uLnByb3RvdHlwZT17Y29uc3RydWN0
b3I6bixfZ2V0TGlicmFyeUJ5TmFtZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fcmVnaXN0
cnkscj10Lmxlbmd0aCxuPTA7bjxyO24rKylpZih0W25dLm5hbWU9PT1lKXJldHVybiB0W25dfSxy
ZWdpc3RlcjpmdW5jdGlvbihlLHQscil7dmFyIG49dGhpcy5fcmVnaXN0cnkubGVuZ3RoO3RoaXMu
X2dldExpYnJhcnlCeU5hbWUoZSl8fChyJiYobj10aGlzLl9jb3JlTGliSW5kZXgrKyksdGhpcy5f
cmVnaXN0cnkuc3BsaWNlKG4sMCx7bmFtZTplLHZlcnNpb246dH0pKX0scmVnaXN0ZXJDb3JlTGli
cmFyeTpmdW5jdGlvbihlLHQpe3RoaXMucmVnaXN0ZXIoZSx0LCEwKX0sZGVSZWdpc3RlcjpmdW5j
dGlvbihlKXt2YXIgdCxyPXRoaXMuX2dldExpYnJhcnlCeU5hbWUoZSk7ciYmKHQ9dGhpcy5fcmVn
aXN0cnkuaW5kZXhPZihyKSx0aGlzLl9yZWdpc3RyeS5zcGxpY2UodCwxKSl9fSxlLmRlZmF1bHQ9
bn0pLGUoImVtYmVyLW1ldGFsL2xvZ2dlciIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIs
ImVtYmVyLW1ldGFsL2Vycm9yIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlv
biBuKCl7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gaShlKXt2YXIgcixuO3QuZGVmYXVsdC5pbXBvcnRz
LmNvbnNvbGU/cj10LmRlZmF1bHQuaW1wb3J0cy5jb25zb2xlOiJ1bmRlZmluZWQiIT10eXBlb2Yg
Y29uc29sZSYmKHI9Y29uc29sZSk7dmFyIGk9Im9iamVjdCI9PXR5cGVvZiByP3JbZV06bnVsbDtp
ZihpKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLmJpbmQ/KG49aS5iaW5kKHIpLG4uZGlzcGxh
eU5hbWU9ImNvbnNvbGUuIitlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBpLmFwcGx5PyhuPWZ1bmN0
aW9uKCl7aS5hcHBseShyLGFyZ3VtZW50cyl9LG4uZGlzcGxheU5hbWU9ImNvbnNvbGUuIitlLG4p
OmZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsIiwg
Iik7aShlKX19ZnVuY3Rpb24gbyhlLHQpe2lmKCFlKXRyeXt0aHJvdyBuZXcgci5kZWZhdWx0KCJh
c3NlcnRpb24gZmFpbGVkOiAiK3QpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJv
dyBlfSwwKX19ZS5kZWZhdWx0PXtsb2c6aSgibG9nIil8fG4sd2FybjppKCJ3YXJuIil8fG4sZXJy
b3I6aSgiZXJyb3IiKXx8bixpbmZvOmkoImluZm8iKXx8bixkZWJ1ZzppKCJkZWJ1ZyIpfHxpKCJp
bmZvIil8fG4sYXNzZXJ0OmkoImFzc2VydCIpfHxvfX0pLGUoImVtYmVyLW1ldGFsL21hcCIsWyJl
eHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLW1ldGFsL3V0aWxzIiwiZW1iZXItbWV0
YWwvZW1wdHlfb2JqZWN0Il0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IGkoZSl7dGhyb3cgbmV3IFR5cGVFcnJvcihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
ZSkrIiBpcyBub3QgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8oZSl7dGhyb3cgbmV3IFR5cGVFcnJv
cigiQ29uc3RydWN0b3IgIitlKyIgcmVxdWlyZXMgJ25ldyciKX1mdW5jdGlvbiBhKGUpe3ZhciB0
PW5ldyBuLmRlZmF1bHQ7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdO3JldHVybiB0fWZ1bmN0aW9u
IHMoZSx0KXt2YXIgcj1lLl9rZXlzLmNvcHkoKSxuPWEoZS5fdmFsdWVzKTtyZXR1cm4gdC5fa2V5
cz1yLHQuX3ZhbHVlcz1uLHQuc2l6ZT1lLnNpemUsdH1mdW5jdGlvbiB1KCl7dGhpcyBpbnN0YW5j
ZW9mIHU/KHRoaXMuY2xlYXIoKSx0aGlzLl9zaWxlbmNlUmVtb3ZlRGVwcmVjYXRpb249ITEpOm8o
Ik9yZGVyZWRTZXQiKX1mdW5jdGlvbiBsKCl7dGhpcyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0
b3I/KHRoaXMuX2tleXM9dS5jcmVhdGUoKSx0aGlzLl9rZXlzLl9zaWxlbmNlUmVtb3ZlRGVwcmVj
YXRpb249ITAsdGhpcy5fdmFsdWVzPW5ldyBuLmRlZmF1bHQsdGhpcy5zaXplPTApOm8oIk9yZGVy
ZWRTZXQiKX1mdW5jdGlvbiBjKGUpe3RoaXMuX3N1cGVyJGNvbnN0cnVjdG9yKCksdGhpcy5kZWZh
dWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWV9dS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3Jl
dHVybiBuZXcgZX0sdS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnUsY2xlYXI6ZnVuY3Rpb24oKXt0
aGlzLnByZXNlbmNlU2V0PW5ldyBuLmRlZmF1bHQsdGhpcy5saXN0PVtdLHRoaXMuc2l6ZT0wfSxh
ZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxyLmd1aWRGb3IoZSksaT10aGlzLnByZXNlbmNlU2V0
LG89dGhpcy5saXN0O3JldHVybiBpW25dIT09ITAmJihpW25dPSEwLHRoaXMuc2l6ZT1vLnB1c2go
ZSkpLHRoaXN9LGRlbGV0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fHIuZ3VpZEZvcihlKSxpPXRo
aXMucHJlc2VuY2VTZXQsbz10aGlzLmxpc3Q7aWYoaVtuXT09PSEwKXtkZWxldGUgaVtuXTt2YXIg
YT1vLmluZGV4T2YoZSk7cmV0dXJuIGE+LTEmJm8uc3BsaWNlKGEsMSksdGhpcy5zaXplPW8ubGVu
Z3RoLCEwfXJldHVybiExfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemV9
LGhhczpmdW5jdGlvbihlKXtpZigwPT09dGhpcy5zaXplKXJldHVybiExO3ZhciB0PXIuZ3VpZEZv
cihlKSxuPXRoaXMucHJlc2VuY2VTZXQ7cmV0dXJuIG5bdF09PT0hMH0sZm9yRWFjaDpmdW5jdGlv
bihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmaShlKSwwIT09dGhpcy5zaXplKXt2YXIgdCxy
PXRoaXMubGlzdCxuPWFyZ3VtZW50cy5sZW5ndGg7aWYoMj09PW4pZm9yKHQ9MDt0PHIubGVuZ3Ro
O3QrKyllLmNhbGwoYXJndW1lbnRzWzFdLHJbdF0pO2Vsc2UgZm9yKHQ9MDt0PHIubGVuZ3RoO3Qr
KyllKHJbdF0pfX0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxpc3Quc2xpY2UoKX0s
Y29weTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IsdD1uZXcgZTtyZXR1cm4gdC5f
c2lsZW5jZVJlbW92ZURlcHJlY2F0aW9uPXRoaXMuX3NpbGVuY2VSZW1vdmVEZXByZWNhdGlvbix0
LnByZXNlbmNlU2V0PWEodGhpcy5wcmVzZW5jZVNldCksdC5saXN0PXRoaXMudG9BcnJheSgpLHQu
c2l6ZT10aGlzLnNpemUsdH19LHQuZGVmYXVsdC5NYXA9bCxsLmNyZWF0ZT1mdW5jdGlvbigpe3Zh
ciBlPXRoaXM7cmV0dXJuIG5ldyBlfSxsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bCxzaXplOjAs
Z2V0OmZ1bmN0aW9uKGUpe2lmKDAhPT10aGlzLnNpemUpe3ZhciB0PXRoaXMuX3ZhbHVlcyxuPXIu
Z3VpZEZvcihlKTtyZXR1cm4gdFtuXX19LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2tl
eXMsaT10aGlzLl92YWx1ZXMsbz1yLmd1aWRGb3IoZSksYT1lPT09LTA/MDplO3JldHVybiBuLmFk
ZChhLG8pLGlbb109dCx0aGlzLnNpemU9bi5zaXplLHRoaXN9LGRlbGV0ZTpmdW5jdGlvbihlKXtp
ZigwPT09dGhpcy5zaXplKXJldHVybiExO3ZhciB0PXRoaXMuX2tleXMsbj10aGlzLl92YWx1ZXMs
aT1yLmd1aWRGb3IoZSk7cmV0dXJuISF0LmRlbGV0ZShlLGkpJiYoZGVsZXRlIG5baV0sdGhpcy5z
aXplPXQuc2l6ZSwhMCl9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fa2V5cy5oYXMoZSl9
LGZvckVhY2g6ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJmkoZSksMCE9PXRo
aXMuc2l6ZSl7dmFyIHQscixuPWFyZ3VtZW50cy5sZW5ndGgsbz10aGlzOzI9PT1uPyhyPWFyZ3Vt
ZW50c1sxXSx0PWZ1bmN0aW9uKHQpe2UuY2FsbChyLG8uZ2V0KHQpLHQsbyl9KTp0PWZ1bmN0aW9u
KHQpe2Uoby5nZXQodCksdCxvKX0sdGhpcy5fa2V5cy5mb3JFYWNoKHQpfX0sY2xlYXI6ZnVuY3Rp
b24oKXt0aGlzLl9rZXlzLmNsZWFyKCksdGhpcy5fdmFsdWVzPW5ldyBuLmRlZmF1bHQsdGhpcy5z
aXplPTB9LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gcyh0aGlzLG5ldyBsKX19LGMuY3JlYXRlPWZ1
bmN0aW9uKGUpe3JldHVybiBlP25ldyBjKGUpOm5ldyBsfSxjLnByb3RvdHlwZT1PYmplY3QuY3Jl
YXRlKGwucHJvdG90eXBlKSxjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLl9z
dXBlciRjb25zdHJ1Y3Rvcj1sLGMucHJvdG90eXBlLl9zdXBlciRnZXQ9bC5wcm90b3R5cGUuZ2V0
LGMucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmhhcyhlKTtpZih0KXJldHVy
biB0aGlzLl9zdXBlciRnZXQoZSk7dmFyIHI9dGhpcy5kZWZhdWx0VmFsdWUoZSk7cmV0dXJuIHRo
aXMuc2V0KGUscikscn0sYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY29u
c3RydWN0b3I7cmV0dXJuIHModGhpcyxuZXcgZSh7ZGVmYXVsdFZhbHVlOnRoaXMuZGVmYXVsdFZh
bHVlfSkpfSxlLmRlZmF1bHQ9bCxlLk9yZGVyZWRTZXQ9dSxlLk1hcD1sLGUuTWFwV2l0aERlZmF1
bHQ9Y30pLGUoImVtYmVyLW1ldGFsL21lcmdlIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNl
IHN0cmljdCI7ZnVuY3Rpb24gdChlLHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJu
IGU7Zm9yKHZhciByLG49T2JqZWN0LmtleXModCksaT1uLmxlbmd0aCxvPTA7bzxpO28rKylyPW5b
b10sZVtyXT10W3JdO3JldHVybiBlfWUuZGVmYXVsdD10fSksZSgiZW1iZXItbWV0YWwvbWV0YSIs
WyJleHBvcnRzIiwiZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMiLCJlbWJlci1tZXRhbC9lbXB0
eV9vYmplY3QiXSxmdW5jdGlvbihlLHQscil7Im5vIHVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0
KXt0aGlzLl9jYWNoZT12b2lkIDAsdGhpcy5fd2Vhaz12b2lkIDAsdGhpcy5fd2F0Y2hpbmc9dm9p
ZCAwLHRoaXMuX21peGlucz12b2lkIDAsdGhpcy5fYmluZGluZ3M9dm9pZCAwLHRoaXMuX3ZhbHVl
cz12b2lkIDAsdGhpcy5fZGVwcz12b2lkIDAsdGhpcy5fY2hhaW5XYXRjaGVycz12b2lkIDAsdGhp
cy5fY2hhaW5zPXZvaWQgMCx0aGlzLl90YWc9dm9pZCAwLHRoaXMuc291cmNlPWUsdGhpcy5wcm90
bz12b2lkIDAsdGhpcy5wYXJlbnQ9dCx0aGlzLl9pbml0aWFsaXplTGlzdGVuZXJzKCl9ZnVuY3Rp
b24gaShlLHQpe3ZhciByPWwoZSksbj1jKGUpO3QucHJvdG90eXBlWyJ3cml0YWJsZSIrbl09ZnVu
Y3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVPd25NYXAocil9LHQucHJvdG90eXBlWyJy
ZWFkYWJsZSIrbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tyXX19ZnVuY3Rpb24gbyhlLHQpe3Zh
ciBuPWwoZSksaT1jKGUpO3QucHJvdG90eXBlWyJ3cml0ZSIraV09ZnVuY3Rpb24oZSx0KXt2YXIg
cj10aGlzLl9nZXRPckNyZWF0ZU93bk1hcChuKTtyW2VdPXR9LHQucHJvdG90eXBlWyJwZWVrIitp
XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZmluZEluaGVyaXRlZChuLGUpfSx0LnByb3RvdHlw
ZVsiZm9yRWFjaCIraV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMsaT1uZXcgci5kZWZhdWx0
O3ZvaWQgMCE9PXQ7KXt2YXIgbz10W25dO2lmKG8pZm9yKHZhciBhIGluIG8paVthXXx8KGlbYV09
ITAsZShhLG9bYV0pKTt0PXQucGFyZW50fX0sdC5wcm90b3R5cGVbImNsZWFyIitpXT1mdW5jdGlv
bigpe3RoaXNbbl09dm9pZCAwfSx0LnByb3RvdHlwZVsiZGVsZXRlRnJvbSIraV09ZnVuY3Rpb24o
ZSl7ZGVsZXRlIHRoaXMuX2dldE9yQ3JlYXRlT3duTWFwKG4pW2VdfSx0LnByb3RvdHlwZVsiaGFz
SW4iK2ldPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9maW5kSW5oZXJpdGVkKG4s
ZSl9fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj1sKGUpLGk9YyhlKTt0LnByb3RvdHlwZVsid3JpdGUi
K2ldPWZ1bmN0aW9uKGUsdCxpKXt2YXIgbz10aGlzLl9nZXRPckNyZWF0ZU93bk1hcChuKSxhPW9b
ZV07YXx8KGE9b1tlXT1uZXcgci5kZWZhdWx0KSxhW3RdPWl9LHQucHJvdG90eXBlWyJwZWVrIitp
XT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10aGlzO3ZvaWQgMCE9PXI7KXt2YXIgaT1yW25dO2lm
KGkpe3ZhciBvPWlbZV07aWYobyYmdm9pZCAwIT09b1t0XSlyZXR1cm4gb1t0XX1yPXIucGFyZW50
fX0sdC5wcm90b3R5cGVbImhhcyIraV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXM7dm9pZCAw
IT09dDspe2lmKHRbbl0mJnRbbl1bZV0pcmV0dXJuITA7dD10LnBhcmVudH1yZXR1cm4hMX0sdC5w
cm90b3R5cGVbImZvckVhY2hJbiIraV09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fZm9yRWFj
aEluKG4sZSx0KX19ZnVuY3Rpb24gcyhlLHQpe3ZhciByPWwoZSksbj1jKGUpO3QucHJvdG90eXBl
WyJ3cml0YWJsZSIrbl09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1tyXTtyZXR1cm4gdHx8KHQ9dGhp
c1tyXT1lKHRoaXMuc291cmNlKSksdH0sdC5wcm90b3R5cGVbInJlYWRhYmxlIituXT1mdW5jdGlv
bigpe3JldHVybiB0aGlzW3JdfX1mdW5jdGlvbiB1KGUsdCl7dmFyIHI9bChlKSxuPWMoZSk7dC5w
cm90b3R5cGVbIndyaXRhYmxlIituXT1mdW5jdGlvbihlKXt2YXIgdD10aGlzW3JdO3JldHVybiB0
fHwodD10aGlzLnBhcmVudD90aGlzW3JdPXRoaXMucGFyZW50WyJ3cml0YWJsZSIrbl0oZSkuY29w
eSh0aGlzLnNvdXJjZSk6dGhpc1tyXT1lKHRoaXMuc291cmNlKSksdH0sdC5wcm90b3R5cGVbInJl
YWRhYmxlIituXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRJbmhlcml0ZWQocil9fWZ1bmN0
aW9uIGwoZSl7cmV0dXJuIl8iK2V9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9eXHcv
LGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBmKGUpe3ZhciB0
PWQoZSkscj12b2lkIDA7aWYodCl7aWYodC5zb3VyY2U9PT1lKXJldHVybiB0O3I9dH12YXIgaT1u
ZXcgbihlLHIpO3JldHVybiBfKGUsaSksaX1mdW5jdGlvbiBkKGUpe3JldHVybiBlW3ZdfWZ1bmN0
aW9uIHAoZSl7Im9iamVjdCI9PXR5cGVvZiBlW3ZdJiYoZVt2XT1udWxsKX1lLm1ldGE9ZixlLnBl
ZWtNZXRhPWQsZS5kZWxldGVNZXRhPXA7dmFyIGg9e2NhY2hlOmksd2VhazppLHdhdGNoaW5nOm8s
bWl4aW5zOm8sYmluZGluZ3M6byx2YWx1ZXM6byxkZXBzOmEsY2hhaW5XYXRjaGVyczpzLGNoYWlu
czp1LHRhZzpzfSxtPU9iamVjdC5rZXlzKGgpLHY9Il9fZW1iZXJfbWV0YV9fIjtmb3IodmFyIGIg
aW4gdC5wcm90b01ldGhvZHMpbi5wcm90b3R5cGVbYl09dC5wcm90b01ldGhvZHNbYl07bS5mb3JF
YWNoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdKGUsbil9KSxuLnByb3RvdHlwZS5fZ2V0T3JDcmVh
dGVPd25NYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1tlXTtyZXR1cm4gdHx8KHQ9dGhpc1tlXT1u
ZXcgci5kZWZhdWx0KSx0fSxuLnByb3RvdHlwZS5fZ2V0SW5oZXJpdGVkPWZ1bmN0aW9uKGUpe2Zv
cih2YXIgdD10aGlzO3ZvaWQgMCE9PXQ7KXtpZih0W2VdKXJldHVybiB0W2VdO3Q9dC5wYXJlbnR9
fSxuLnByb3RvdHlwZS5fZmluZEluaGVyaXRlZD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10aGlz
O3ZvaWQgMCE9PXI7KXt2YXIgbj1yW2VdO2lmKG4pe3ZhciBpPW5bdF07aWYodm9pZCAwIT09aSly
ZXR1cm4gaX1yPXIucGFyZW50fX0sbi5wcm90b3R5cGUuX2ZvckVhY2hJbj1mdW5jdGlvbihlLHQs
bil7Zm9yKHZhciBpPXRoaXMsbz1uZXcgci5kZWZhdWx0LGE9W107dm9pZCAwIT09aTspe3ZhciBz
PWlbZV07aWYocyl7dmFyIHU9c1t0XTtpZih1KWZvcih2YXIgbCBpbiB1KW9bbF18fChvW2xdPSEw
LGEucHVzaChbbCx1W2xdXSkpfWk9aS5wYXJlbnR9Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKysp
e3ZhciBmPWFbY10sbD1mWzBdLGQ9ZlsxXTtuKGwsZCl9fTt2YXIgZz17d3JpdGFibGU6ITAsY29u
ZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbH07ZS5NRVRBX0RFU0M9Zzt2YXIg
eT17bmFtZTp2LGRlc2NyaXB0b3I6Z30sXz1mdW5jdGlvbihlLHQpe251bGwhPT1lW3ZdJiYoZS5f
X2RlZmluZU5vbkVudW1lcmFibGU/ZS5fX2RlZmluZU5vbkVudW1lcmFibGUoeSk6T2JqZWN0LmRl
ZmluZVByb3BlcnR5KGUsdixnKSksZVt2XT10fX0pLGUoImVtYmVyLW1ldGFsL21ldGFfbGlzdGVu
ZXJzIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlLHQs
cil7Zm9yKHZhciBuPXRbcisxXSxpPXRbcisyXSxvPTA7bzxlLmxlbmd0aC0yO28rPTMpaWYoZVtv
XT09PW4mJmVbbysxXT09PWkpcmV0dXJuO2UucHVzaChuLGksdFtyKzNdKX12YXIgcj0xO2UuT05D
RT1yO3ZhciBuPTI7ZS5TVVNQRU5ERUQ9bjt2YXIgaT17YWRkVG9MaXN0ZW5lcnM6ZnVuY3Rpb24o
ZSx0LHIsbil7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPVtdKSx0aGlzLl9saXN0
ZW5lcnMucHVzaChlLHQscixuKX0sX2ZpbmFsaXplTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRo
aXMuX2xpc3RlbmVyc0ZpbmFsaXplZCl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJz
PVtdKTtmb3IodmFyIGU9dGhpcy5wYXJlbnQ7ZTspe3ZhciB0PWUuX2xpc3RlbmVycztpZih0JiYo
dGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVycy5jb25jYXQodCkpLGUuX2xpc3RlbmVyc0Zp
bmFsaXplZClicmVhaztlPWUucGFyZW50fXRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZD0hMH19LHJl
bW92ZUZyb21MaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBpPXRoaXM7aTspe3Zh
ciBvPWkuX2xpc3RlbmVycztpZihvKWZvcih2YXIgYT1vLmxlbmd0aC00O2E+PTA7YS09NClpZihv
W2FdPT09ZSYmKCFyfHxvW2ErMV09PT10JiZvW2ErMl09PT1yKSl7aWYoaSE9PXRoaXMpcmV0dXJu
IHRoaXMuX2ZpbmFsaXplTGlzdGVuZXJzKCksdGhpcy5yZW1vdmVGcm9tTGlzdGVuZXJzKGUsdCxy
KTsiZnVuY3Rpb24iPT10eXBlb2YgbiYmbihlLHQsb1thKzJdKSxvLnNwbGljZShhLDQpfWlmKGku
X2xpc3RlbmVyc0ZpbmFsaXplZClicmVhaztpPWkucGFyZW50fX0sbWF0Y2hpbmdMaXN0ZW5lcnM6
ZnVuY3Rpb24oZSl7Zm9yKHZhciByPXRoaXMsaT1bXTtyOyl7dmFyIG89ci5fbGlzdGVuZXJzO2lm
KG8pZm9yKHZhciBhPTA7YTxvLmxlbmd0aC0zO2ErPTQpb1thXT09PWUmJnQoaSxvLGEpO2lmKHIu
X2xpc3RlbmVyc0ZpbmFsaXplZClicmVhaztyPXIucGFyZW50fXZhciBzPXRoaXMuX3N1c3BlbmRl
ZExpc3RlbmVycztpZihzKWZvcih2YXIgdT0wO3U8cy5sZW5ndGgtMjt1Kz0zKWlmKGU9PT1zW3Vd
KWZvcih2YXIgbD0wO2w8aS5sZW5ndGgtMjtsKz0zKWlbbF09PT1zW3UrMV0mJmlbbCsxXT09PXNb
dSsyXSYmKGlbbCsyXXw9bik7cmV0dXJuIGl9LHN1c3BlbmRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0
LHIsbil7dmFyIGk9dGhpcy5fc3VzcGVuZGVkTGlzdGVuZXJzO2l8fChpPXRoaXMuX3N1c3BlbmRl
ZExpc3RlbmVycz1bXSk7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspaS5wdXNoKGVbb10sdCxy
KTt0cnl7cmV0dXJuIG4uY2FsbCh0KX1maW5hbGx5e2lmKGkubGVuZ3RoPT09ZS5sZW5ndGgpdGhp
cy5fc3VzcGVuZGVkTGlzdGVuZXJzPXZvaWQgMDtlbHNlIGZvcih2YXIgbz1pLmxlbmd0aC0zO28+
PTA7by09MylpW28rMV09PT10JiZpW28rMl09PT1yJiZlLmluZGV4T2YoaVtvXSkhPT0tMSYmaS5z
cGxpY2UobywzKX19LHdhdGNoZWRFdmVudHM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyx0PXt9
O2U7KXt2YXIgcj1lLl9saXN0ZW5lcnM7aWYocilmb3IodmFyIG49MDtuPHIubGVuZ3RoLTM7bis9
NCl0W3Jbbl1dPSEwO2lmKGUuX2xpc3RlbmVyc0ZpbmFsaXplZClicmVhaztlPWUucGFyZW50fXJl
dHVybiBPYmplY3Qua2V5cyh0KX0sX2luaXRpYWxpemVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlz
Ll9saXN0ZW5lcnM9dm9pZCAwLHRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZD12b2lkIDAsdGhpcy5f
c3VzcGVuZGVkTGlzdGVuZXJzPXZvaWQgMH19O2UucHJvdG9NZXRob2RzPWl9KSxlKCJlbWJlci1t
ZXRhbC9taXhpbiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLW1ldGFsL2Vy
cm9yIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1tZXRh
bC9lbXB0eV9vYmplY3QiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFsL21ldGEiLCJlbWJl
ci1tZXRhbC9leHBhbmRfcHJvcGVydGllcyIsImVtYmVyLW1ldGFsL3Byb3BlcnRpZXMiLCJlbWJl
ci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL2JpbmRpbmciLCJlbWJlci1tZXRhbC9vYnNl
cnZlciIsImVtYmVyLW1ldGFsL2V2ZW50cyIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiXSxm
dW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxsLGMsZixkLHAsaCxtLHYpeyJubyB1c2Ugc3RyaWN0
IjtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGcoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUm
JmUuaXNNZXRob2QhPT0hMSYmZSE9PUJvb2xlYW4mJmUhPT1PYmplY3QmJmUhPT1OdW1iZXImJmUh
PT1BcnJheSYmZSE9PURhdGUmJmUhPT1TdHJpbmd9ZnVuY3Rpb24geShlLHQpe3ZhciByO3JldHVy
biB0IGluc3RhbmNlb2YgTT8ocj11Lmd1aWRGb3IodCksZS5wZWVrTWl4aW5zKHIpP0s6KGUud3Jp
dGVNaXhpbnMocix0KSx0LnByb3BlcnRpZXMpKTp0fWZ1bmN0aW9uIF8oZSx0LHIsbil7dmFyIGk7
cmV0dXJuIGk9cltlXXx8bltlXSx0W2VdJiYoaT1pP2kuY29uY2F0KHRbZV0pOnRbZV0pLGl9ZnVu
Y3Rpb24gdyhlLHQscixuLGksbyl7dmFyIGE7aWYodm9pZCAwPT09blt0XSYmKGE9aVt0XSksIWEp
e3ZhciBzPW9bdF0sbD1udWxsIT09cyYmIm9iamVjdCI9PXR5cGVvZiBzJiZzLmlzRGVzY3JpcHRv
cj9zOnZvaWQgMDthPWx9cmV0dXJuIHZvaWQgMCE9PWEmJmEgaW5zdGFuY2VvZiBkLkNvbXB1dGVk
UHJvcGVydHk/KHI9T2JqZWN0LmNyZWF0ZShyKSxyLl9nZXR0ZXI9dS53cmFwKHIuX2dldHRlcixh
Ll9nZXR0ZXIpLGEuX3NldHRlciYmKHIuX3NldHRlcj9yLl9zZXR0ZXI9dS53cmFwKHIuX3NldHRl
cixhLl9zZXR0ZXIpOnIuX3NldHRlcj1hLl9zZXR0ZXIpLHIpOnJ9ZnVuY3Rpb24geChlLHQscixu
LGkpe3ZhciBvO3JldHVybiB2b2lkIDA9PT1pW3RdJiYobz1uW3RdKSxvPW98fGVbdF0sdm9pZCAw
PT09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8/cjp1LndyYXAocixvKX1mdW5jdGlvbiBrKGUsdCxy
LG4pe3ZhciBpPW5bdF18fGVbdF07cmV0dXJuIGk/ImZ1bmN0aW9uIj09dHlwZW9mIGkuY29uY2F0
P251bGw9PT1yfHx2b2lkIDA9PT1yP2k6aS5jb25jYXQocik6dS5tYWtlQXJyYXkoaSkuY29uY2F0
KHIpOnUubWFrZUFycmF5KHIpfWZ1bmN0aW9uIEMoZSx0LHIsbil7dmFyIG89blt0XXx8ZVt0XTtp
ZighbylyZXR1cm4gcjt2YXIgYT1pLmRlZmF1bHQoe30sbykscz0hMTtmb3IodmFyIHUgaW4gcilp
ZihyLmhhc093blByb3BlcnR5KHUpKXt2YXIgbD1yW3VdO2cobCk/KHM9ITAsYVt1XT14KGUsdSxs
LG8se30pKTphW3VdPWx9cmV0dXJuIHMmJihhLl9zdXBlcj1iKSxhfWZ1bmN0aW9uIEUoZSx0LHIs
bixpLG8sYSxzKXtpZihyIGluc3RhbmNlb2YgZi5EZXNjcmlwdG9yKXtpZihyPT09VyYmaVt0XSly
ZXR1cm4gSztyLl9nZXR0ZXImJihyPXcobix0LHIsbyxpLGUpKSxpW3RdPXIsb1t0XT12b2lkIDB9
ZWxzZSBhJiZhLmluZGV4T2YodCk+PTB8fCJjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIj09PXR8fCJt
ZXJnZWRQcm9wZXJ0aWVzIj09PXQ/cj1rKGUsdCxyLG8pOnMmJnMuaW5kZXhPZih0KT49MD9yPUMo
ZSx0LHIsbyk6ZyhyKSYmKHI9eChlLHQscixvLGkpKSxpW3RdPXZvaWQgMCxvW3RdPXJ9ZnVuY3Rp
b24gTyhlLHQscixuLGksbyl7ZnVuY3Rpb24gYShlKXtkZWxldGUgcltlXSxkZWxldGUgbltlXX1m
b3IodmFyIHMsdSxjLGYsZCxwLGg9MCxtPWUubGVuZ3RoO2g8bTtoKyspaWYocz1lW2hdLHU9eSh0
LHMpLHUhPT1LKWlmKHUpe3A9bC5tZXRhKGkpLGkud2lsbE1lcmdlTWl4aW4mJmkud2lsbE1lcmdl
TWl4aW4odSksZj1fKCJjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIix1LG4saSksZD1fKCJtZXJnZWRQ
cm9wZXJ0aWVzIix1LG4saSk7Zm9yKGMgaW4gdSl1Lmhhc093blByb3BlcnR5KGMpJiYoby5wdXNo
KGMpLEUoaSxjLHVbY10scCxyLG4sZixkKSk7dS5oYXNPd25Qcm9wZXJ0eSgidG9TdHJpbmciKSYm
KGkudG9TdHJpbmc9dS50b1N0cmluZyl9ZWxzZSBzLm1peGlucyYmKE8ocy5taXhpbnMsdCxyLG4s
aSxvKSxzLl93aXRob3V0JiZzLl93aXRob3V0LmZvckVhY2goYSkpfWZ1bmN0aW9uIFQoZSx0LHIs
bil7US50ZXN0KHQpJiZuLndyaXRlQmluZGluZ3ModCxyKX1mdW5jdGlvbiBOKGUsdCxyKXt2YXIg
bj1mdW5jdGlvbihyKXtoLl9zdXNwZW5kT2JzZXJ2ZXIoZSx0LG51bGwsaSxmdW5jdGlvbigpe3Mu
dHJ5U2V0KGUsdCxyLnZhbHVlKCkpfSl9LGk9ZnVuY3Rpb24oKXtyLnNldFZhbHVlKGEuZ2V0KGUs
dCksbil9O3Muc2V0KGUsdCxyLnZhbHVlKCkpLGguYWRkT2JzZXJ2ZXIoZSx0LG51bGwsaSksci5z
dWJzY3JpYmUobiksdm9pZCAwPT09ZS5fc3RyZWFtQmluZGluZ1N1YnNjcmlwdGlvbnMmJihlLl9z
dHJlYW1CaW5kaW5nU3Vic2NyaXB0aW9ucz1uZXcgby5kZWZhdWx0KSxlLl9zdHJlYW1CaW5kaW5n
U3Vic2NyaXB0aW9uc1t0XT1ufWZ1bmN0aW9uIFMoZSx0KXt0LmZvckVhY2hCaW5kaW5ncyhmdW5j
dGlvbih0LHIpe2lmKHIpe3ZhciBuPXQuc2xpY2UoMCwtNyk7aWYodi5pc1N0cmVhbShyKSlyZXR1
cm4gdm9pZCBOKGUsbixyKTtyIGluc3RhbmNlb2YgcC5CaW5kaW5nPyhyPXIuY29weSgpLHIudG8o
bikpOnI9bmV3IHAuQmluZGluZyhuLHIpLHIuY29ubmVjdChlKSxlW3RdPXJ9fSksdC5jbGVhckJp
bmRpbmdzKCl9ZnVuY3Rpb24gQShlLHQpe3JldHVybiBTKGUsdHx8bC5tZXRhKGUpKSxlfWZ1bmN0
aW9uIFAoZSx0LHIsbixpKXt2YXIgbyxhLHM9dC5tZXRob2ROYW1lO3JldHVybiBuW3NdfHxpW3Nd
PyhvPWlbc10sdD1uW3NdKTooYT1lW3NdKSYmbnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSYm
YS5pc0Rlc2NyaXB0b3I/KHQ9YSxvPXZvaWQgMCk6KHQ9dm9pZCAwLG89ZVtzXSkse2Rlc2M6dCx2
YWx1ZTpvfX1mdW5jdGlvbiBqKGUsdCxyLG4saSl7dmFyIG89cltuXTtpZihvKWZvcih2YXIgYT0w
LHM9by5sZW5ndGg7YTxzO2ErKylpKGUsb1thXSxudWxsLHQpfWZ1bmN0aW9uIFIoZSx0LHIpe3Zh
ciBuPWVbdF07ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihqKGUsdCxuLCJfX2VtYmVyX29ic2VydmVz
QmVmb3JlX18iLGguX3JlbW92ZUJlZm9yZU9ic2VydmVyKSxqKGUsdCxuLCJfX2VtYmVyX29ic2Vy
dmVzX18iLGgucmVtb3ZlT2JzZXJ2ZXIpLGooZSx0LG4sIl9fZW1iZXJfbGlzdGVuc19fIixtLnJl
bW92ZUxpc3RlbmVyKSksImZ1bmN0aW9uIj09dHlwZW9mIHImJihqKGUsdCxyLCJfX2VtYmVyX29i
c2VydmVzQmVmb3JlX18iLGguX2FkZEJlZm9yZU9ic2VydmVyKSxqKGUsdCxyLCJfX2VtYmVyX29i
c2VydmVzX18iLGguYWRkT2JzZXJ2ZXIpLGooZSx0LHIsIl9fZW1iZXJfbGlzdGVuc19fIixtLmFk
ZExpc3RlbmVyKSl9ZnVuY3Rpb24gTChlLHQscil7dmFyIG4saSxvLGE9e30scz17fSx1PWwubWV0
YShlKSxjPVtdO2UuX3N1cGVyPWIsTyh0LHUsYSxzLGUsYyk7Zm9yKHZhciBkPTAscD1jLmxlbmd0
aDtkPHA7ZCsrKWlmKG49Y1tkXSwiY29uc3RydWN0b3IiIT09biYmcy5oYXNPd25Qcm9wZXJ0eShu
KSYmKG89YVtuXSxpPXNbbl0sbyE9PVcpKXtmb3IoO28mJm8gaW5zdGFuY2VvZiBWOyl7dmFyIGg9
UChlLG8sdSxhLHMpO289aC5kZXNjLGk9aC52YWx1ZX12b2lkIDA9PT1vJiZ2b2lkIDA9PT1pfHwo
UihlLG4saSksVChlLG4saSx1KSxmLmRlZmluZVByb3BlcnR5KGUsbixvLGksdSkpfXJldHVybiBy
fHxBKGUsdSksZX1mdW5jdGlvbiBEKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9QXJy
YXkodD4xP3QtMTowKSxuPTE7bjx0O24rKylyW24tMV09YXJndW1lbnRzW25dO3JldHVybiBMKGUs
ciwhMSksZX1mdW5jdGlvbiBNKGUsdCl7dGhpcy5wcm9wZXJ0aWVzPXQ7dmFyIHI9ZSYmZS5sZW5n
dGg7aWYocj4wKXtmb3IodmFyIG49bmV3IEFycmF5KHIpLGk9MDtpPHI7aSsrKXt2YXIgbz1lW2ld
O28gaW5zdGFuY2VvZiBNP25baV09bzpuW2ldPW5ldyBNKHZvaWQgMCxvKX10aGlzLm1peGlucz1u
fWVsc2UgdGhpcy5taXhpbnM9dm9pZCAwO3RoaXMub3duZXJDb25zdHJ1Y3Rvcj12b2lkIDAsdGhp
cy5fd2l0aG91dD12b2lkIDAsdGhpc1t1LkdVSURfS0VZXT1udWxsLHRoaXNbdS5HVUlEX0tFWSsi
X25hbWUiXT1udWxsfWZ1bmN0aW9uIEkoZSx0LHIpe3ZhciBuPXUuZ3VpZEZvcihlKTtpZihyW25d
KXJldHVybiExO2lmKHJbbl09ITAsZT09PXQpcmV0dXJuITA7Zm9yKHZhciBpPWUubWl4aW5zLG89
aT9pLmxlbmd0aDowOy0tbz49MDspaWYoSShpW29dLHQscikpcmV0dXJuITA7cmV0dXJuITF9ZnVu
Y3Rpb24gRihlLHQscil7aWYoIXJbdS5ndWlkRm9yKHQpXSlpZihyW3UuZ3VpZEZvcih0KV09ITAs
dC5wcm9wZXJ0aWVzKWZvcih2YXIgbj1PYmplY3Qua2V5cyh0LnByb3BlcnRpZXMpLGk9MDtpPG4u
bGVuZ3RoO2krKyl7dmFyIG89bltpXTtlW29dPSEwfWVsc2UgdC5taXhpbnMmJnQubWl4aW5zLmZv
ckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIEYoZSx0LHIpfSl9ZnVuY3Rpb24gSCgpe3JldHVybiBX
fWZ1bmN0aW9uIFYoZSl7dGhpcy5pc0Rlc2NyaXB0b3I9ITAsdGhpcy5tZXRob2ROYW1lPWV9ZnVu
Y3Rpb24gcShlKXtyZXR1cm4gbmV3IFYoZSl9ZnVuY3Rpb24geigpe2Zvcih2YXIgZT1hcmd1bWVu
dHMubGVuZ3RoLHQ9QXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07dmFyIGks
bz10LnNsaWNlKC0xKVswXSxhPWZ1bmN0aW9uKGUpe2kucHVzaChlKX0scz10LnNsaWNlKDAsLTEp
OyJmdW5jdGlvbiIhPXR5cGVvZiBvJiYobz10WzBdLHM9dC5zbGljZSgxKSksaT1bXTtmb3IodmFy
IHU9MDt1PHMubGVuZ3RoOysrdSljLmRlZmF1bHQoc1t1XSxhKTtpZigiZnVuY3Rpb24iIT10eXBl
b2Ygbyl0aHJvdyBuZXcgci5kZWZhdWx0KCJFbWJlci5vYnNlcnZlciBjYWxsZWQgd2l0aG91dCBh
IGZ1bmN0aW9uIik7cmV0dXJuIG8uX19lbWJlcl9vYnNlcnZlc19fPWksb31mdW5jdGlvbiBCKCl7
Zm9yKHZhciBlPTAsdD1hcmd1bWVudHMubGVuZ3RoO2U8dDtlKyspe2FyZ3VtZW50c1tlXX1yZXR1
cm4gei5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVSgpe2Zvcih2YXIgZT1hcmd1bWVu
dHMubGVuZ3RoLHI9QXJyYXkoZSksbj0wO248ZTtuKyspcltuXT1hcmd1bWVudHNbbl07dmFyIGks
bz1yLnNsaWNlKC0xKVswXSxhPWZ1bmN0aW9uKGUpe2kucHVzaChlKX0scz1yLnNsaWNlKDAsLTEp
OyJmdW5jdGlvbiIhPXR5cGVvZiBvJiYobz1yWzBdLHM9ci5zbGljZSgxKSksaT1bXTtmb3IodmFy
IHU9MDt1PHMubGVuZ3RoOysrdSljLmRlZmF1bHQoc1t1XSxhKTtpZigiZnVuY3Rpb24iIT10eXBl
b2Ygbyl0aHJvdyBuZXcgdC5kZWZhdWx0LkVycm9yKCJFbWJlci5iZWZvcmVPYnNlcnZlciBjYWxs
ZWQgd2l0aG91dCBhIGZ1bmN0aW9uIik7cmV0dXJuIG8uX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9f
PWksb31lLm1peGluPUQsZS5kZWZhdWx0PU0sZS5yZXF1aXJlZD1ILGUuYWxpYXNNZXRob2Q9cSxl
Lm9ic2VydmVyPXosZS5faW1tZWRpYXRlT2JzZXJ2ZXI9QixlLl9iZWZvcmVPYnNlcnZlcj1VLGIu
X19oYXNTdXBlcj0hMTt2YXIgVywkPVtdLnNsaWNlLEs9e30sUT0vXi4rQmluZGluZyQvO00uX2Fw
cGx5PUwsTS5hcHBseVBhcnRpYWw9ZnVuY3Rpb24oZSl7dmFyIHQ9JC5jYWxsKGFyZ3VtZW50cywx
KTtyZXR1cm4gTChlLHQsITApfSxNLmZpbmlzaFBhcnRpYWw9QSx0LmRlZmF1bHQuYW55VW5wcm9j
ZXNzZWRNaXhpbnM9ITEsTS5jcmVhdGU9ZnVuY3Rpb24oKXt0LmRlZmF1bHQuYW55VW5wcm9jZXNz
ZWRNaXhpbnM9ITA7Zm9yKHZhciBlPXRoaXMscj1hcmd1bWVudHMubGVuZ3RoLG49QXJyYXkociks
aT0wO2k8cjtpKyspbltpXT1hcmd1bWVudHNbaV07cmV0dXJuIG5ldyBlKG4sdm9pZCAwKX07dmFy
IEc9TS5wcm90b3R5cGU7Ry5yZW9wZW49ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLnByb3BlcnRpZXM/
KGU9bmV3IE0odm9pZCAwLHRoaXMucHJvcGVydGllcyksdGhpcy5wcm9wZXJ0aWVzPXZvaWQgMCx0
aGlzLm1peGlucz1bZV0pOnRoaXMubWl4aW5zfHwodGhpcy5taXhpbnM9W10pO3ZhciB0LHI9YXJn
dW1lbnRzLmxlbmd0aCxuPXRoaXMubWl4aW5zO2Zvcih0PTA7dDxyO3QrKyllPWFyZ3VtZW50c1t0
XSxlIGluc3RhbmNlb2YgTT9uLnB1c2goZSk6bi5wdXNoKG5ldyBNKHZvaWQgMCxlKSk7cmV0dXJu
IHRoaXN9LEcuYXBwbHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEwoZSxbdGhpc10sITEpfSxHLmFwcGx5
UGFydGlhbD1mdW5jdGlvbihlKXtyZXR1cm4gTChlLFt0aGlzXSwhMCl9LEcudG9TdHJpbmc9ZnVu
Y3Rpb24oKXtyZXR1cm4iKHVua25vd24gbWl4aW4pIn0sRy5kZXRlY3Q9ZnVuY3Rpb24oZSl7aWYo
IWUpcmV0dXJuITE7aWYoZSBpbnN0YW5jZW9mIE0pcmV0dXJuIEkoZSx0aGlzLHt9KTt2YXIgdD1s
LnBlZWtNZXRhKGUpO3JldHVybiEhdCYmISF0LnBlZWtNaXhpbnModS5ndWlkRm9yKHRoaXMpKX0s
Ry53aXRob3V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyBNKFt0aGlzXSksdD1hcmd1bWVudHMu
bGVuZ3RoLHI9QXJyYXkodCksbj0wO248dDtuKyspcltuXT1hcmd1bWVudHNbbl07cmV0dXJuIGUu
X3dpdGhvdXQ9cixlfSxHLmtleXM9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9O0YoZSx0aGlzLHQp
O3ZhciByPU9iamVjdC5rZXlzKGUpO3JldHVybiByfSxNLm1peGlucz1mdW5jdGlvbihlKXt2YXIg
dD1sLnBlZWtNZXRhKGUpLHI9W107cmV0dXJuIHQ/KHQuZm9yRWFjaE1peGlucyhmdW5jdGlvbihl
LHQpe3QucHJvcGVydGllc3x8ci5wdXNoKHQpOworfSkscik6cn0sZS5SRVFVSVJFRD1XPW5ldyBm
LkRlc2NyaXB0b3IsVy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIoUmVxdWlyZWQgUHJvcGVy
dHkpIn0sVi5wcm90b3R5cGU9bmV3IGYuRGVzY3JpcHRvcixlLklTX0JJTkRJTkc9USxlLk1peGlu
PU0sZS5yZXF1aXJlZD1ILGUuUkVRVUlSRUQ9V30pLGUoImVtYmVyLW1ldGFsL29ic2VydmVyIixb
ImV4cG9ydHMiLCJlbWJlci1tZXRhbC93YXRjaGluZyIsImVtYmVyLW1ldGFsL2V2ZW50cyJdLGZ1
bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZStkfWZ1bmN0
aW9uIGkoZSl7cmV0dXJuIGUrcH1mdW5jdGlvbiBvKGUsaSxvLGEpe3JldHVybiByLmFkZExpc3Rl
bmVyKGUsbihpKSxvLGEpLHQud2F0Y2goZSxpKSx0aGlzfWZ1bmN0aW9uIGEoZSx0KXtyZXR1cm4g
ci5saXN0ZW5lcnNGb3IoZSxuKHQpKX1mdW5jdGlvbiBzKGUsaSxvLGEpe3JldHVybiB0LnVud2F0
Y2goZSxpKSxyLnJlbW92ZUxpc3RlbmVyKGUsbihpKSxvLGEpLHRoaXN9ZnVuY3Rpb24gdShlLG4s
byxhKXtyZXR1cm4gci5hZGRMaXN0ZW5lcihlLGkobiksbyxhKSx0LndhdGNoKGUsbiksdGhpc31m
dW5jdGlvbiBsKGUsdCxpLG8sYSl7cmV0dXJuIHIuc3VzcGVuZExpc3RlbmVyKGUsbih0KSxpLG8s
YSl9ZnVuY3Rpb24gYyhlLHQsaSxvLGEpe3ZhciBzPXQubWFwKG4pO3JldHVybiByLnN1c3BlbmRM
aXN0ZW5lcnMoZSxzLGksbyxhKX1mdW5jdGlvbiBmKGUsbixvLGEpe3JldHVybiB0LnVud2F0Y2go
ZSxuKSxyLnJlbW92ZUxpc3RlbmVyKGUsaShuKSxvLGEpLHRoaXN9ZS5hZGRPYnNlcnZlcj1vLGUu
b2JzZXJ2ZXJzRm9yPWEsZS5yZW1vdmVPYnNlcnZlcj1zLGUuX2FkZEJlZm9yZU9ic2VydmVyPXUs
ZS5fc3VzcGVuZE9ic2VydmVyPWwsZS5fc3VzcGVuZE9ic2VydmVycz1jLGUuX3JlbW92ZUJlZm9y
ZU9ic2VydmVyPWY7dmFyIGQ9IjpjaGFuZ2UiLHA9IjpiZWZvcmUifSksZSgiZW1iZXItbWV0YWwv
b2JzZXJ2ZXJfc2V0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFs
L2V2ZW50cyJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe3RoaXMu
Y2xlYXIoKX1lLmRlZmF1bHQ9bixuLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSxyLG4pe3ZhciBp
LG89dGhpcy5vYnNlcnZlclNldCxhPXRoaXMub2JzZXJ2ZXJzLHM9dC5ndWlkRm9yKGUpLHU9b1tz
XTtyZXR1cm4gdXx8KG9bc109dT17fSksaT11W3JdLHZvaWQgMD09PWkmJihpPWEucHVzaCh7c2Vu
ZGVyOmUsa2V5TmFtZTpyLGV2ZW50TmFtZTpuLGxpc3RlbmVyczpbXX0pLTEsdVtyXT1pKSxhW2ld
Lmxpc3RlbmVyc30sbi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt2YXIgZSx0LG4saSxvPXRo
aXMub2JzZXJ2ZXJzO2Zvcih0aGlzLmNsZWFyKCksZT0wLHQ9by5sZW5ndGg7ZTx0OysrZSluPW9b
ZV0saT1uLnNlbmRlcixpLmlzRGVzdHJveWluZ3x8aS5pc0Rlc3Ryb3llZHx8ci5zZW5kRXZlbnQo
aSxuLmV2ZW50TmFtZSxbaSxuLmtleU5hbWVdLG4ubGlzdGVuZXJzKX0sbi5wcm90b3R5cGUuY2xl
YXI9ZnVuY3Rpb24oKXt0aGlzLm9ic2VydmVyU2V0PXt9LHRoaXMub2JzZXJ2ZXJzPVtdfX0pLGUo
ImVtYmVyLW1ldGFsL3BhdGhfY2FjaGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NhY2hlIl0s
ZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZi5nZXQoZSl9
ZnVuY3Rpb24gbihlKXtyZXR1cm4gZC5nZXQoZSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gcC5nZXQo
ZSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gaC5nZXQoZSkhPT0tMX1mdW5jdGlvbiBhKGUpe3JldHVy
biBtLmdldChlKX1mdW5jdGlvbiBzKGUpe3JldHVybiB2LmdldChlKX1lLmlzR2xvYmFsPXIsZS5p
c0dsb2JhbFBhdGg9bixlLmhhc1RoaXM9aSxlLmlzUGF0aD1vLGUuZ2V0Rmlyc3RLZXk9YSxlLmdl
dFRhaWxQYXRoPXM7dmFyIHU9L15bQS1aJF0vLGw9L15bQS1aJF0uKltcLl0vLGM9InRoaXMuIixm
PW5ldyB0LmRlZmF1bHQoMWUzLGZ1bmN0aW9uKGUpe3JldHVybiB1LnRlc3QoZSl9KSxkPW5ldyB0
LmRlZmF1bHQoMWUzLGZ1bmN0aW9uKGUpe3JldHVybiBsLnRlc3QoZSl9KSxwPW5ldyB0LmRlZmF1
bHQoMWUzLGZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS5sYXN0SW5kZXhPZihjLDApfSksaD1uZXcg
dC5kZWZhdWx0KDFlMyxmdW5jdGlvbihlKXtyZXR1cm4gZS5pbmRleE9mKCIuIil9KSxtPW5ldyB0
LmRlZmF1bHQoMWUzLGZ1bmN0aW9uKGUpe3ZhciB0PWguZ2V0KGUpO3JldHVybiB0PT09LTE/ZTpl
LnNsaWNlKDAsdCl9KSx2PW5ldyB0LmRlZmF1bHQoMWUzLGZ1bmN0aW9uKGUpe3ZhciB0PWguZ2V0
KGUpO2lmKHQhPT0tMSlyZXR1cm4gZS5zbGljZSh0KzEpfSksYj17aXNHbG9iYWxDYWNoZTpmLGlz
R2xvYmFsUGF0aENhY2hlOmQsaGFzVGhpc0NhY2hlOnAsZmlyc3REb3RJbmRleENhY2hlOmgsZmly
c3RLZXlDYWNoZTptLHRhaWxQYXRoQ2FjaGU6dn07ZS5jYWNoZXM9Yn0pLGUoImVtYmVyLW1ldGFs
L3Byb3BlcnRpZXMiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwv
ZmVhdHVyZXMiLCJlbWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRz
Il0sZnVuY3Rpb24oZSx0LHIsbixpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbygpe3RoaXMuaXNE
ZXNjcmlwdG9yPSEwfWZ1bmN0aW9uIGEoZSl7ZnVuY3Rpb24gdChlKXt9cmV0dXJuIHQuaXNNYW5k
YXRvcnlTZXR0ZXI9ITAsdH1mdW5jdGlvbiBzKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRo
aXMuX19lbWJlcl9tZXRhX187cmV0dXJuIHQmJnQucGVla1ZhbHVlcyhlKX19ZnVuY3Rpb24gdShl
KXtmdW5jdGlvbiB0KCl7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO3JldHVybiB0
JiZ0W2VdfXJldHVybiB0LmlzSW5oZXJpdGluZ0dldHRlcj0hMCx0fWZ1bmN0aW9uIGwoZSx0LHIs
YSxzKXt2YXIgdSxsLGMsZjtzfHwocz1uLm1ldGEoZSkpO3ZhciBkPXMucGVla1dhdGNoaW5nKHQp
O3JldHVybiB1PWVbdF0sbD1udWxsIT09dSYmIm9iamVjdCI9PXR5cGVvZiB1JiZ1LmlzRGVzY3Jp
cHRvcj91OnZvaWQgMCxjPXZvaWQgMCE9PWQmJmQ+MCxsJiZsLnRlYXJkb3duKGUsdCksciBpbnN0
YW5jZW9mIG8/KGY9cixlW3RdPWYsci5zZXR1cCYmci5zZXR1cChlLHQpKTpudWxsPT1yPyhmPWEs
ZVt0XT1hKTooZj1yLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQscikpLGMmJmkub3ZlcnJpZGVD
aGFpbnMoZSx0LHMpLGUuZGlkRGVmaW5lUHJvcGVydHkmJmUuZGlkRGVmaW5lUHJvcGVydHkoZSx0
LGYpLHRoaXN9ZS5EZXNjcmlwdG9yPW8sZS5NQU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OPWEsZS5E
RUZBVUxUX0dFVFRFUl9GVU5DVElPTj1zLGUuSU5IRVJJVElOR19HRVRURVJfRlVOQ1RJT049dSxl
LmRlZmluZVByb3BlcnR5PWw7KGZ1bmN0aW9uKCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShPYmplY3Qu
cHJvdG90eXBlLHtwcm9wOntjb25maWd1cmFibGU6ITAsdmFsdWU6MX19KTtyZXR1cm4gT2JqZWN0
LmRlZmluZVByb3BlcnR5KGUsInByb3AiLHtjb25maWd1cmFibGU6ITAsdmFsdWU6Mn0pLDI9PT1l
LnByb3B9KSgpfSksZSgiZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzIixbImV4cG9ydHMiLCJl
bWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFsL21ldGEiLCJlbWJlci1tZXRhbC9ldmVudHMi
LCJlbWJlci1tZXRhbC9vYnNlcnZlcl9zZXQiLCJlbWJlci1tZXRhbC9zeW1ib2wiXSxmdW5jdGlv
bihlLHQscixuLGksbyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoZSx0KXt2YXIgbj1yLnBlZWtN
ZXRhKGUpLGk9biYmbi5wZWVrV2F0Y2hpbmcodCk+MHx8Imxlbmd0aCI9PT10LG89biYmbi5wcm90
byxhPWVbdF0scz1udWxsIT09YSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmlzRGVzY3JpcHRvcj9h
OnZvaWQgMDtpJiZvIT09ZSYmKHMmJnMud2lsbENoYW5nZSYmcy53aWxsQ2hhbmdlKGUsdCksdShl
LHQsbiksZihlLHQsbiksYihlLHQpKX1mdW5jdGlvbiBzKGUsdCl7dmFyIG49ci5wZWVrTWV0YShl
KSxpPW4mJm4ucGVla1dhdGNoaW5nKHQpPjB8fCJsZW5ndGgiPT09dCxvPW4mJm4ucHJvdG8sYT1l
W3RdLHM9bnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5pc0Rlc2NyaXB0b3I/YTp2b2lk
IDA7byE9PWUmJihzJiZzLmRpZENoYW5nZSYmcy5kaWRDaGFuZ2UoZSx0KSxlW3ldJiZlW3ldKHQp
LChpfHwibGVuZ3RoIj09PXQpJiYobiYmbi5oYXNEZXBzKHQpJiZsKGUsdCxuKSxkKGUsdCxuLCEx
KSxnKGUsdCkpKX1mdW5jdGlvbiB1KGUsdCxyKXtpZighZS5pc0Rlc3Ryb3lpbmcmJnImJnIuaGFz
RGVwcyh0KSl7dmFyIG49XyxpPSFuO2kmJihuPV89e30pLGMoYSxlLHQsbixyKSxpJiYoXz1udWxs
KX19ZnVuY3Rpb24gbChlLHQscil7aWYoIWUuaXNEZXN0cm95aW5nJiZyJiZyLmhhc0RlcHModCkp
e3ZhciBuPXcsaT0hbjtpJiYobj13PXt9KSxjKHMsZSx0LG4sciksaSYmKHc9bnVsbCl9fWZ1bmN0
aW9uIGMoZSxyLG4saSxvKXt2YXIgYSxzLHU9dC5ndWlkRm9yKHIpLGw9aVt1XTtsfHwobD1pW3Vd
PXt9KSxsW25dfHwobFtuXT0hMCxvLmZvckVhY2hJbkRlcHMobixmdW5jdGlvbih0LG4pe24mJihh
PXJbdF0scz1udWxsIT09YSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmlzRGVzY3JpcHRvcj9hOnZv
aWQgMCxzJiZzLl9zdXNwZW5kZWQ9PT1yfHxlKHIsdCkpfSkpfWZ1bmN0aW9uIGYoZSx0LHIpe3Zh
ciBuPXIucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7biYmbi5ub3RpZnkodCwhMSxhKX1mdW5jdGlv
biBkKGUsdCxyKXt2YXIgbj1yLnJlYWRhYmxlQ2hhaW5XYXRjaGVycygpO24mJm4ubm90aWZ5KHQs
ITAscyl9ZnVuY3Rpb24gcChlLHQscil7dmFyIG49ci5yZWFkYWJsZUNoYWluV2F0Y2hlcnMoKTtu
JiZuLnJldmFsaWRhdGUodCl9ZnVuY3Rpb24gaCgpe0MrK31mdW5jdGlvbiBtKCl7Qy0tLEM8PTAm
Jih4LmNsZWFyKCksay5mbHVzaCgpKX1mdW5jdGlvbiB2KGUsdCl7aCgpO3RyeXtlLmNhbGwodCl9
ZmluYWxseXttLmNhbGwodCl9fWZ1bmN0aW9uIGIoZSx0KXtpZighZS5pc0Rlc3Ryb3lpbmcpe3Zh
ciByLGksbz10KyI6YmVmb3JlIjtDPyhyPXguYWRkKGUsdCxvKSxpPW4uYWNjdW11bGF0ZUxpc3Rl
bmVycyhlLG8sciksbi5zZW5kRXZlbnQoZSxvLFtlLHRdLGkpKTpuLnNlbmRFdmVudChlLG8sW2Us
dF0pfX1mdW5jdGlvbiBnKGUsdCl7aWYoIWUuaXNEZXN0cm95aW5nKXt2YXIgcixpPXQrIjpjaGFu
Z2UiO0M/KHI9ay5hZGQoZSx0LGkpLG4uYWNjdW11bGF0ZUxpc3RlbmVycyhlLGkscikpOm4uc2Vu
ZEV2ZW50KGUsaSxbZSx0XSl9fXZhciB5PW8uZGVmYXVsdCgiUFJPUEVSVFlfRElEX0NIQU5HRSIp
O2UuUFJPUEVSVFlfRElEX0NIQU5HRT15O3ZhciBfLHcseD1uZXcgaS5kZWZhdWx0LGs9bmV3IGku
ZGVmYXVsdCxDPTA7ZS5wcm9wZXJ0eVdpbGxDaGFuZ2U9YSxlLnByb3BlcnR5RGlkQ2hhbmdlPXMs
ZS5vdmVycmlkZUNoYWlucz1wLGUuYmVnaW5Qcm9wZXJ0eUNoYW5nZXM9aCxlLmVuZFByb3BlcnR5
Q2hhbmdlcz1tLGUuY2hhbmdlUHJvcGVydGllcz12fSksZSgiZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL3BhdGhfY2Fj
aGUiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtpZigiIj09
PXQpcmV0dXJuIGU7dmFyIG4sbz1lW3RdLGE9bnVsbCE9PW8mJiJvYmplY3QiPT10eXBlb2YgbyYm
by5pc0Rlc2NyaXB0b3I/bzp2b2lkIDA7cmV0dXJuIHZvaWQgMD09PWEmJnIuaXNQYXRoKHQpP2ko
ZSx0KTphP2EuZ2V0KGUsdCk6KG49byx2b2lkIDAhPT1ufHwib2JqZWN0IiE9dHlwZW9mIGV8fHQg
aW4gZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUudW5rbm93blByb3BlcnR5P246ZS51bmtub3duUHJv
cGVydHkodCkpfWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIHI9ZSxpPXQuc3BsaXQoIi4iKSxhPTA7
YTxpLmxlbmd0aDthKyspe2lmKCFvKHIpKXJldHVybjtpZihyPW4ocixpW2FdKSxyJiZyLmlzRGVz
dHJveWVkKXJldHVybn1yZXR1cm4gcn1mdW5jdGlvbiBvKGUpe3JldHVybiBudWxsIT1lJiZzW3R5
cGVvZiBlXX1mdW5jdGlvbiBhKGUsdCxyKXt2YXIgaT1uKGUsdCk7cmV0dXJuIHZvaWQgMD09PWk/
cjppfWUuZ2V0PW4sZS5fZ2V0UGF0aD1pLGUuZ2V0V2l0aERlZmF1bHQ9YTt2YXIgcz17b2JqZWN0
OiEwLGZ1bmN0aW9uOiEwLHN0cmluZzohMH07ZS5kZWZhdWx0PW59KSxlKCJlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwv
ZmVhdHVyZXMiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0
eV9ldmVudHMiLCJlbWJlci1tZXRhbC9wcm9wZXJ0aWVzIiwiZW1iZXItbWV0YWwvZXJyb3IiLCJl
bWJlci1tZXRhbC9wYXRoX2NhY2hlIiwiZW1iZXItbWV0YWwvbWV0YSIsImVtYmVyLW1ldGFsL3V0
aWxzIiwiZW1iZXItbWV0YWwvdGFncyJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyl7
InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSx0LHIsbil7dmFyIG89dm9pZCAwLGE9dm9pZCAwLGw9
dm9pZCAwO2UmJihvPXUucGVla01ldGEoZSksYT1lW3RdLGw9bnVsbCE9PWEmJiJvYmplY3QiPT10
eXBlb2YgYSYmYS5pc0Rlc2NyaXB0b3I/YTp2b2lkIDAsYy5tYXJrT2JqZWN0QXNEaXJ0eShvKSk7
dmFyIGYscDtpZih2b2lkIDA9PT1sJiZzLmlzUGF0aCh0KSlyZXR1cm4gZChlLHQscixuKTtpZihs
KWwuc2V0KGUsdCxyKTtlbHNle2lmKHZvaWQgMCE9PXImJiJvYmplY3QiPT10eXBlb2YgZSYmZVt0
XT09PXIpcmV0dXJuIHI7Zj0ib2JqZWN0Ij09dHlwZW9mIGUmJiEodCBpbiBlKSxmJiYiZnVuY3Rp
b24iPT10eXBlb2YgZS5zZXRVbmtub3duUHJvcGVydHk/ZS5zZXRVbmtub3duUHJvcGVydHkodCxy
KTpvJiZvLnBlZWtXYXRjaGluZyh0KT4wPyhvLnByb3RvIT09ZSYmKHA9ZVt0XSksciE9PXAmJihp
LnByb3BlcnR5V2lsbENoYW5nZShlLHQpLGVbdF09cixpLnByb3BlcnR5RGlkQ2hhbmdlKGUsdCkp
KTooZVt0XT1yLGVbaS5QUk9QRVJUWV9ESURfQ0hBTkdFXSYmZVtpLlBST1BFUlRZX0RJRF9DSEFO
R0VdKHQpKX1yZXR1cm4gcn1mdW5jdGlvbiBkKGUsdCxyLGkpe3ZhciBvO2lmKG89dC5zbGljZSh0
Lmxhc3RJbmRleE9mKCIuIikrMSksdD10PT09bz9vOnQuc2xpY2UoMCx0Lmxlbmd0aC0oby5sZW5n
dGgrMSkpLCJ0aGlzIiE9PXQmJihlPW4uX2dldFBhdGgoZSx0KSksIW98fDA9PT1vLmxlbmd0aCl0
aHJvdyBuZXcgYS5kZWZhdWx0KCJQcm9wZXJ0eSBzZXQgZmFpbGVkOiBZb3UgcGFzc2VkIGFuIGVt
cHR5IHBhdGgiKTtpZighZSl7aWYoaSlyZXR1cm47dGhyb3cgbmV3IGEuZGVmYXVsdCgnUHJvcGVy
dHkgc2V0IGZhaWxlZDogb2JqZWN0IGluIHBhdGggIicrdCsnIiBjb3VsZCBub3QgYmUgZm91bmQg
b3Igd2FzIGRlc3Ryb3llZC4nKX1yZXR1cm4gZihlLG8scil9ZnVuY3Rpb24gcChlLHQscil7cmV0
dXJuIGYoZSx0LHIsITApfWUuc2V0PWYsZS50cnlTZXQ9cH0pLGUoImVtYmVyLW1ldGFsL3JlcGxh
Y2UiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxy
LGkpe2Zvcih2YXIgbyxhLHM9W10uY29uY2F0KGkpLHU9W10sbD02ZTQsYz10LGY9cjtzLmxlbmd0
aDspbz1mPmw/bDpmLG88PTAmJihvPTApLGE9cy5zcGxpY2UoMCxsKSxhPVtjLG9dLmNvbmNhdChh
KSxjKz1sLGYtPW8sdT11LmNvbmNhdChuLmFwcGx5KGUsYSkpO3JldHVybiB1fWZ1bmN0aW9uIHIo
ZSxyLG4saSl7cmV0dXJuIGUucmVwbGFjZT9lLnJlcGxhY2UocixuLGkpOnQoZSxyLG4saSl9ZS5f
cmVwbGFjZT10LGUuZGVmYXVsdD1yO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zcGxpY2V9KSxlKCJl
bWJlci1tZXRhbC9ydW5fbG9vcCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVy
LW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvdXRpbHMiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9l
dmVudHMiLCJiYWNrYnVybmVyIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0Ijtm
dW5jdGlvbiBhKGUpe3UuY3VycmVudFJ1bkxvb3A9ZX1mdW5jdGlvbiBzKGUsdCl7dS5jdXJyZW50
UnVuTG9vcD10fWZ1bmN0aW9uIHUoKXtyZXR1cm4gYy5ydW4uYXBwbHkoYyxhcmd1bWVudHMpfWZ1
bmN0aW9uIGwoKXshdS5jdXJyZW50UnVuTG9vcH1lLmRlZmF1bHQ9dTt2YXIgYz1uZXcgby5kZWZh
dWx0KFsic3luYyIsImFjdGlvbnMiLCJkZXN0cm95Il0se0dVSURfS0VZOm4uR1VJRF9LRVksc3lu
Yzp7YmVmb3JlOmkuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMsYWZ0ZXI6aS5lbmRQcm9wZXJ0eUNoYW5n
ZXN9LGRlZmF1bHRRdWV1ZToiYWN0aW9ucyIsb25CZWdpbjphLG9uRW5kOnMsb25FcnJvclRhcmdl
dDp0LmRlZmF1bHQsb25FcnJvck1ldGhvZDoib25lcnJvciJ9KTt1LmpvaW49ZnVuY3Rpb24oKXty
ZXR1cm4gYy5qb2luLmFwcGx5KGMsYXJndW1lbnRzKX0sdS5iaW5kPWZ1bmN0aW9uKCl7Zm9yKHZh
ciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxyPTA7cjxlO3IrKyl0W3JdPWFyZ3VtZW50
c1tyXTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5
KGUpLG49MDtuPGU7bisrKXJbbl09YXJndW1lbnRzW25dO3JldHVybiB1LmpvaW4uYXBwbHkodSx0
LmNvbmNhdChyKSl9fSx1LmJhY2tidXJuZXI9Yyx1LmN1cnJlbnRSdW5Mb29wPW51bGwsdS5xdWV1
ZXM9Yy5xdWV1ZU5hbWVzLHUuYmVnaW49ZnVuY3Rpb24oKXtjLmJlZ2luKCl9LHUuZW5kPWZ1bmN0
aW9uKCl7Yy5lbmQoKX0sdS5zY2hlZHVsZT1mdW5jdGlvbigpe2woKSxjLnNjaGVkdWxlLmFwcGx5
KGMsYXJndW1lbnRzKX0sdS5oYXNTY2hlZHVsZWRUaW1lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gYy5o
YXNUaW1lcnMoKX0sdS5jYW5jZWxUaW1lcnM9ZnVuY3Rpb24oKXtjLmNhbmNlbFRpbWVycygpfSx1
LnN5bmM9ZnVuY3Rpb24oKXtjLmN1cnJlbnRJbnN0YW5jZSYmYy5jdXJyZW50SW5zdGFuY2UucXVl
dWVzLnN5bmMuZmx1c2goKX0sdS5sYXRlcj1mdW5jdGlvbigpe3JldHVybiBjLmxhdGVyLmFwcGx5
KGMsYXJndW1lbnRzKX0sdS5vbmNlPWZ1bmN0aW9uKCl7bCgpO2Zvcih2YXIgZT1hcmd1bWVudHMu
bGVuZ3RoLHQ9QXJyYXkoZSkscj0wO3I8ZTtyKyspdFtyXT1hcmd1bWVudHNbcl07cmV0dXJuIHQu
dW5zaGlmdCgiYWN0aW9ucyIpLGMuc2NoZWR1bGVPbmNlLmFwcGx5KGMsdCl9LHUuc2NoZWR1bGVP
bmNlPWZ1bmN0aW9uKCl7cmV0dXJuIGwoKSxjLnNjaGVkdWxlT25jZS5hcHBseShjLGFyZ3VtZW50
cyl9LHUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXko
ZSkscj0wO3I8ZTtyKyspdFtyXT1hcmd1bWVudHNbcl07cmV0dXJuIHQucHVzaCgxKSxjLmxhdGVy
LmFwcGx5KGMsdCl9LHUuY2FuY2VsPWZ1bmN0aW9uKGUpe3JldHVybiBjLmNhbmNlbChlKX0sdS5k
ZWJvdW5jZT1mdW5jdGlvbigpe3JldHVybiBjLmRlYm91bmNlLmFwcGx5KGMsYXJndW1lbnRzKX0s
dS50aHJvdHRsZT1mdW5jdGlvbigpe3JldHVybiBjLnRocm90dGxlLmFwcGx5KGMsYXJndW1lbnRz
KX0sdS5fYWRkUXVldWU9ZnVuY3Rpb24oZSx0KXt1LnF1ZXVlcy5pbmRleE9mKGUpPT09LTEmJnUu
cXVldWVzLnNwbGljZSh1LnF1ZXVlcy5pbmRleE9mKHQpKzEsMCxlKX19KSxlKCJlbWJlci1tZXRh
bC9zZXRfcHJvcGVydGllcyIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRz
IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0
IjtmdW5jdGlvbiBuKGUsbil7cmV0dXJuIG4mJiJvYmplY3QiPT10eXBlb2Ygbj8odC5jaGFuZ2VQ
cm9wZXJ0aWVzKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGk9T2JqZWN0LmtleXMobiksbz0wLGE9aS5s
ZW5ndGg7bzxhO28rKyl0PWlbb10sci5zZXQoZSx0LG5bdF0pfSksbik6bn1lLmRlZmF1bHQ9bn0p
LGUoImVtYmVyLW1ldGFsL3N0cmVhbXMvZGVwZW5kZW5jeSIsWyJleHBvcnRzIiwiZW1iZXItbWV0
YWwvZGVidWciLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxz
Il0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0KXt0aGlzLm5l
eHQ9bnVsbCx0aGlzLnByZXY9bnVsbCx0aGlzLmRlcGVuZGVyPWUsdGhpcy5kZXBlbmRlZT10LHRo
aXMudW5zdWJzY3JpcHRpb249bnVsbH1yLmRlZmF1bHQoaS5wcm90b3R5cGUse3N1YnNjcmliZTpm
dW5jdGlvbigpe3RoaXMudW5zdWJzY3JpcHRpb249bi5zdWJzY3JpYmUodGhpcy5kZXBlbmRlZSx0
aGlzLmRlcGVuZGVyLm5vdGlmeSx0aGlzLmRlcGVuZGVyKX0sdW5zdWJzY3JpYmU6ZnVuY3Rpb24o
KXt0aGlzLnVuc3Vic2NyaXB0aW9uJiYodGhpcy51bnN1YnNjcmlwdGlvbigpLHRoaXMudW5zdWJz
Y3JpcHRpb249bnVsbCl9LHJlcGxhY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGVwZW5kZWUh
PT1lJiYodGhpcy5kZXBlbmRlZT1lLHRoaXMudW5zdWJzY3JpcHRpb24mJih0aGlzLnVuc3Vic2Ny
aWJlKCksdGhpcy5zdWJzY3JpYmUoKSksITApfSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBu
LnJlYWQodGhpcy5kZXBlbmRlZSl9LHNldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuLnNldFZh
bHVlKHRoaXMuZGVwZW5kZWUsZSl9fSksZS5kZWZhdWx0PWl9KSxlKCJlbWJlci1tZXRhbC9zdHJl
YW1zL2tleS1zdHJlYW0iLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0
YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwv
b2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbSIsImVtYmVyLW1ldGFsL3N0cmVh
bXMvdXRpbHMiXSxmdW5jdGlvbihlLHQscixuLGksbyxhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
cyhlLHQpe3JldHVybiBlLmxhYmVsP2UubGFiZWwrIi4iK3Q6dH1lLmRlZmF1bHQ9by5kZWZhdWx0
LmV4dGVuZCh7aW5pdDpmdW5jdGlvbihlLHQpe3ZhciByPXMoZSx0KTt0aGlzLnBhdGg9cix0aGlz
Lm9ic2VydmVkT2JqZWN0PW51bGwsdGhpcy5rZXk9dCx0aGlzLnNvdXJjZURlcD10aGlzLmFkZE11
dGFibGVEZXBlbmRlbmN5KGUpLHRoaXMubGFiZWw9cn0sY29tcHV0ZTpmdW5jdGlvbigpe3ZhciBl
PXRoaXMuc291cmNlRGVwLmdldFZhbHVlKCksdD10eXBlb2YgZTtpZihlJiYiYm9vbGVhbiIhPT10
KXJldHVybiJvYmplY3QiPT09dD9yLmdldChlLHRoaXMua2V5KTplW3RoaXMua2V5XX0sc2V0VmFs
dWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTt0JiZuLnNldCh0
LHRoaXMua2V5LGUpfSxzZXRTb3VyY2U6ZnVuY3Rpb24oZSl7dGhpcy5zb3VyY2VEZXAucmVwbGFj
ZShlKSx0aGlzLm5vdGlmeSgpfSxfc3VwZXIkcmV2YWxpZGF0ZTpvLmRlZmF1bHQucHJvdG90eXBl
LnJldmFsaWRhdGUscmV2YWxpZGF0ZTpmdW5jdGlvbihlKXt0aGlzLl9zdXBlciRyZXZhbGlkYXRl
KGUpO3ZhciB0PXRoaXMuc291cmNlRGVwLmdldFZhbHVlKCk7dCE9PXRoaXMub2JzZXJ2ZWRPYmpl
Y3QmJih0aGlzLl9jbGVhck9ic2VydmVkT2JqZWN0KCksdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYo
aS5hZGRPYnNlcnZlcih0LHRoaXMua2V5LHRoaXMsdGhpcy5ub3RpZnkpLHRoaXMub2JzZXJ2ZWRP
YmplY3Q9dCkpfSxfc3VwZXIkZGVhY3RpdmF0ZTpvLmRlZmF1bHQucHJvdG90eXBlLmRlYWN0aXZh
dGUsX2NsZWFyT2JzZXJ2ZWRPYmplY3Q6ZnVuY3Rpb24oKXt0aGlzLm9ic2VydmVkT2JqZWN0JiYo
aS5yZW1vdmVPYnNlcnZlcih0aGlzLm9ic2VydmVkT2JqZWN0LHRoaXMua2V5LHRoaXMsdGhpcy5u
b3RpZnkpLHRoaXMub2JzZXJ2ZWRPYmplY3Q9bnVsbCl9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt0
aGlzLl9zdXBlciRkZWFjdGl2YXRlKCksdGhpcy5fY2xlYXJPYnNlcnZlZE9iamVjdCgpfX0pfSks
ZSgiZW1iZXItbWV0YWwvc3RyZWFtcy9wcm94eS1zdHJlYW0iLFsiZXhwb3J0cyIsImVtYmVyLXJ1
bnRpbWUvc3lzdGVtL29iamVjdCIsImVtYmVyLW1ldGFsL3N0cmVhbXMvc3RyZWFtIl0sZnVuY3Rp
b24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yLmRlZmF1bHQuZXh0ZW5kKHtpbml0OmZ1bmN0
aW9uKGUsdCl7dGhpcy5sYWJlbD10LHRoaXMuc291cmNlRGVwPXRoaXMuYWRkTXV0YWJsZURlcGVu
ZGVuY3koZSl9LGNvbXB1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VEZXAuZ2V0VmFs
dWUoKX0sc2V0VmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zb3VyY2VEZXAuc2V0VmFsdWUoZSl9LHNl
dFNvdXJjZTpmdW5jdGlvbihlKXt2YXIgcj10aGlzLnNvdXJjZURlcC5yZXBsYWNlKGUpOyFyJiZl
IGluc3RhbmNlb2YgdC5kZWZhdWx0fHx0aGlzLm5vdGlmeSgpfX0pO24uZXh0ZW5kPXIuZGVmYXVs
dC5leHRlbmQsZS5kZWZhdWx0PW59KSxlKCJlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbSIsWyJl
eHBvcnRzIiwiZW1iZXItbWV0YWwvYXNzaWduIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1t
ZXRhbC9wYXRoX2NhY2hlIiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9zdHJl
YW1zL3V0aWxzIiwiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwiZW1iZXItbWV0YWwvc3RyZWFt
cy9zdWJzY3JpYmVyIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9kZXBlbmRlbmN5IiwiZW1iZXItbWV0
YWwvdXRpbHMiLCJyZXF1aXJlIiwiZW1iZXItbWV0YWwvc3ltYm9sIl0sZnVuY3Rpb24oZSx0LHIs
bixpLG8sYSxzLHUsbCxjLGYpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGUpe3RoaXMuX2luaXQo
ZSl9ZnVuY3Rpb24gcChlLHQscil7cmV0dXJuIG8uaXNTdHJlYW0oZSk/ZTpuZXcgdChlLHIpfWZ1
bmN0aW9uIGgoZSl7cmV0dXJuIHZvaWQgMD09PWU/IihubyBsYWJlbCkiOmV9ZS53cmFwPXA7dmFy
IG09Zi5kZWZhdWx0KCJJU19TVFJFQU0iKTtlLklTX1NUUkVBTT1tO3ZhciB2LGI7ZC5wcm90b3R5
cGU9e19pbml0OmZ1bmN0aW9uKGUpe3RoaXNbbV09ITAsdGhpcy5sYWJlbD1oKGUpLHRoaXMuaXNB
Y3RpdmU9ITEsdGhpcy5pc0RpcnR5PSEwLHRoaXMuaXNEZXN0cm95ZWQ9ITEsdGhpcy5jYWNoZT12
b2lkIDAsdGhpcy5jaGlsZHJlbj12b2lkIDAsdGhpcy5zdWJzY3JpYmVySGVhZD1udWxsLHRoaXMu
c3Vic2NyaWJlclRhaWw9bnVsbCx0aGlzLmRlcGVuZGVuY3lIZWFkPW51bGwsdGhpcy5kZXBlbmRl
bmN5VGFpbD1udWxsLHRoaXMub2JzZXJ2ZWRQcm94eT1udWxsLHRoaXMuX19lbWJlcl9tZXRhX189
bnVsbCx0aGlzW2wuR1VJRF9LRVldPW51bGx9LF9tYWtlQ2hpbGRTdHJlYW06ZnVuY3Rpb24oZSl7
cmV0dXJuIG5ldyh2PXZ8fGMuZGVmYXVsdCgiZW1iZXItbWV0YWwvc3RyZWFtcy9rZXktc3RyZWFt
IikuZGVmYXVsdCkodGhpcyxlKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMu
Y2hpbGRyZW5bZV19LGdldEtleTpmdW5jdGlvbihlKXt2b2lkIDA9PT10aGlzLmNoaWxkcmVuJiYo
dGhpcy5jaGlsZHJlbj1uZXcgYS5kZWZhdWx0KTt2YXIgdD10aGlzLmNoaWxkcmVuW2VdO3JldHVy
biB2b2lkIDA9PT10JiYodD10aGlzLl9tYWtlQ2hpbGRTdHJlYW0oZSksdGhpcy5jaGlsZHJlbltl
XT10KSx0fSxnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5nZXRGaXJzdEtleShlKSxyPW4uZ2V0VGFp
bFBhdGgoZSk7dm9pZCAwPT09dGhpcy5jaGlsZHJlbiYmKHRoaXMuY2hpbGRyZW49bmV3IGEuZGVm
YXVsdCk7dmFyIGk9dGhpcy5jaGlsZHJlblt0XTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9dGhpcy5f
bWFrZUNoaWxkU3RyZWFtKHQsZSksdGhpcy5jaGlsZHJlblt0XT1pKSx2b2lkIDA9PT1yP2k6aS5n
ZXQocil9LHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZXx8KHRoaXMuaXNEaXJ0eT0hMCk7
dmFyIGU9ITE7cmV0dXJuIXRoaXMuaXNBY3RpdmUmJnRoaXMuc3Vic2NyaWJlckhlYWQmJih0aGlz
LmFjdGl2YXRlKCksZT0hMCksdGhpcy5pc0RpcnR5JiYodGhpcy5pc0FjdGl2ZSYmKGU9ITApLHRo
aXMuY2FjaGU9dGhpcy5jb21wdXRlKCksdGhpcy5pc0RpcnR5PSExKSxlJiZ0aGlzLnJldmFsaWRh
dGUodGhpcy5jYWNoZSksdGhpcy5jYWNoZX0sYWRkTXV0YWJsZURlcGVuZGVuY3k6ZnVuY3Rpb24o
ZSl7dmFyIHQ9bmV3IHUuZGVmYXVsdCh0aGlzLGUpO2lmKHRoaXMuaXNBY3RpdmUmJnQuc3Vic2Ny
aWJlKCksbnVsbD09PXRoaXMuZGVwZW5kZW5jeUhlYWQpdGhpcy5kZXBlbmRlbmN5SGVhZD10aGlz
LmRlcGVuZGVuY3lUYWlsPXQ7ZWxzZXt2YXIgcj10aGlzLmRlcGVuZGVuY3lUYWlsO3IubmV4dD10
LHQucHJldj1yLHRoaXMuZGVwZW5kZW5jeVRhaWw9dH1yZXR1cm4gdH0sYWRkRGVwZW5kZW5jeTpm
dW5jdGlvbihlKXtvLmlzU3RyZWFtKGUpJiZ0aGlzLmFkZE11dGFibGVEZXBlbmRlbmN5KGUpfSxz
dWJzY3JpYmVEZXBlbmRlbmNpZXM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBlbmRlbmN5
SGVhZDtlOyl7dmFyIHQ9ZS5uZXh0O2Uuc3Vic2NyaWJlKCksZT10fX0sdW5zdWJzY3JpYmVEZXBl
bmRlbmNpZXM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBlbmRlbmN5SGVhZDtlOyl7dmFy
IHQ9ZS5uZXh0O2UudW5zdWJzY3JpYmUoKSxlPXR9fSxtYXliZURlYWN0aXZhdGU6ZnVuY3Rpb24o
KXshdGhpcy5zdWJzY3JpYmVySGVhZCYmdGhpcy5pc0FjdGl2ZSYmKHRoaXMuaXNBY3RpdmU9ITEs
dGhpcy51bnN1YnNjcmliZURlcGVuZGVuY2llcygpLHRoaXMuZGVhY3RpdmF0ZSgpKX0sYWN0aXZh
dGU6ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlPSEwLHRoaXMuc3Vic2NyaWJlRGVwZW5kZW5jaWVz
KCl9LHJldmFsaWRhdGU6ZnVuY3Rpb24oZSl7ZSE9PXRoaXMub2JzZXJ2ZWRQcm94eSYmKHRoaXMu
X2NsZWFyT2JzZXJ2ZWRQcm94eSgpLGI9Ynx8Yy5kZWZhdWx0KCJlbWJlci1ydW50aW1lL21peGlu
cy8tcHJveHkiKS5kZWZhdWx0LGIuZGV0ZWN0KGUpJiYoaS5hZGRPYnNlcnZlcihlLCJjb250ZW50
Iix0aGlzLHRoaXMubm90aWZ5KSx0aGlzLm9ic2VydmVkUHJveHk9ZSkpfSxfY2xlYXJPYnNlcnZl
ZFByb3h5OmZ1bmN0aW9uKCl7dGhpcy5vYnNlcnZlZFByb3h5JiYoaS5yZW1vdmVPYnNlcnZlcih0
aGlzLm9ic2VydmVkUHJveHksImNvbnRlbnQiLHRoaXMsdGhpcy5ub3RpZnkpLHRoaXMub2JzZXJ2
ZWRQcm94eT1udWxsKX0sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFyT2JzZXJ2ZWRQ
cm94eSgpfSxjb21wdXRlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTdHJlYW0gZXJyb3I6
IGNvbXB1dGUgbm90IGltcGxlbWVudGVkIil9LHNldFZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3
IEVycm9yKCJTdHJlYW0gZXJyb3I6IHNldFZhbHVlIG5vdCBpbXBsZW1lbnRlZCIpfSxub3RpZnk6
ZnVuY3Rpb24oKXt0aGlzLm5vdGlmeUV4Y2VwdCgpfSxub3RpZnlFeGNlcHQ6ZnVuY3Rpb24oZSx0
KXt0aGlzLmlzRGlydHl8fCh0aGlzLmlzRGlydHk9ITAsdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhl
LHQpKX0sc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9bmV3IHMuZGVmYXVsdChlLHQsdGhp
cyk7aWYobnVsbD09PXRoaXMuc3Vic2NyaWJlckhlYWQpdGhpcy5zdWJzY3JpYmVySGVhZD10aGlz
LnN1YnNjcmliZXJUYWlsPXI7ZWxzZXt2YXIgbj10aGlzLnN1YnNjcmliZXJUYWlsO24ubmV4dD1y
LHIucHJldj1uLHRoaXMuc3Vic2NyaWJlclRhaWw9cn12YXIgaT10aGlzO3JldHVybiBmdW5jdGlv
bihlKXtyLnJlbW92ZUZyb20oaSksZSYmaS5wcnVuZSgpfX0scHJ1bmU6ZnVuY3Rpb24oKXtudWxs
PT09dGhpcy5zdWJzY3JpYmVySGVhZCYmdGhpcy5kZXN0cm95KCEwKX0sdW5zdWJzY3JpYmU6ZnVu
Y3Rpb24oZSx0KXtmb3IodmFyIHI9dGhpcy5zdWJzY3JpYmVySGVhZDtyOyl7dmFyIG49ci5uZXh0
O3IuY2FsbGJhY2s9PT1lJiZyLmNvbnRleHQ9PT10JiZyLnJlbW92ZUZyb20odGhpcykscj1ufX0s
bm90aWZ5U3Vic2NyaWJlcnM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9dGhpcy5zdWJzY3JpYmVy
SGVhZDtyOyl7dmFyIG49ci5uZXh0LGk9ci5jYWxsYmFjayxvPXIuY29udGV4dDtyPW4saT09PWUm
Jm89PT10fHwodm9pZCAwPT09bz9pKHRoaXMpOmkuY2FsbChvLHRoaXMpKX19LGRlc3Ryb3k6ZnVu
Y3Rpb24oZSl7aWYoIXRoaXMuaXNEZXN0cm95ZWQpe3RoaXMuaXNEZXN0cm95ZWQ9ITAsdGhpcy5z
dWJzY3JpYmVySGVhZD10aGlzLnN1YnNjcmliZXJUYWlsPW51bGwsdGhpcy5tYXliZURlYWN0aXZh
dGUoKTt2YXIgdD10aGlzLmRlcGVuZGVuY2llcztpZih0KWZvcih2YXIgcj0wLG49dC5sZW5ndGg7
cjxuO3IrKyl0W3JdKGUpO3JldHVybiEwfX19LGQuZXh0ZW5kPWZ1bmN0aW9uKGUpe3ZhciByPWZ1
bmN0aW9uKCl7dGhpcy5faW5pdCgpLHRoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3Jl
dHVybiByLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKSx0LmRlZmF1bHQo
ci5wcm90b3R5cGUsZSksci5leHRlbmQ9ZC5leHRlbmQscn07dmFyIGc9ZC5leHRlbmQoe2luaXQ6
ZnVuY3Rpb24oZSx0KXt0aGlzLl9jb21wdXRlPWUsdGhpcy5sYWJlbD10fSxjb21wdXRlOmZ1bmN0
aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXB1dGUoKX19KTtlLmRlZmF1bHQ9ZCxlLlN0cmVhbT1nfSks
ZSgiZW1iZXItbWV0YWwvc3RyZWFtcy9zdWJzY3JpYmVyIixbImV4cG9ydHMiLCJlbWJlci1tZXRh
bC9hc3NpZ24iXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dGhp
cy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGwsdGhpcy5jYWxsYmFjaz1lLHRoaXMuY29udGV4dD10
fXQuZGVmYXVsdChyLnByb3RvdHlwZSx7cmVtb3ZlRnJvbTpmdW5jdGlvbihlKXt2YXIgdD10aGlz
Lm5leHQscj10aGlzLnByZXY7cj9yLm5leHQ9dDplLnN1YnNjcmliZXJIZWFkPXQsdD90LnByZXY9
cjplLnN1YnNjcmliZXJUYWlsPXIsZS5tYXliZURlYWN0aXZhdGUoKX19KSxlLmRlZmF1bHQ9cn0p
LGUoImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Rl
YnVnIiwiZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iXSxmdW5jdGlvbihlLHQscil7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGUmJmVbci5JU19TVFJFQU1dfWZ1bmN0aW9uIGko
ZSx0LG4pe2lmKGUmJmVbci5JU19TVFJFQU1dKXJldHVybiBlLnN1YnNjcmliZSh0LG4pfWZ1bmN0
aW9uIG8oZSx0LG4pe2UmJmVbci5JU19TVFJFQU1dJiZlLnVuc3Vic2NyaWJlKHQsbil9ZnVuY3Rp
b24gYShlKXtyZXR1cm4gZSYmZVtyLklTX1NUUkVBTV0/ZS52YWx1ZSgpOmV9ZnVuY3Rpb24gcyhl
KXtmb3IodmFyIHQ9ZS5sZW5ndGgscj1uZXcgQXJyYXkodCksbj0wO248dDtuKyspcltuXT1hKGVb
bl0pO3JldHVybiByfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9e307Zm9yKHZhciByIGluIGUpdFtyXT1h
KGVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIGwoZSl7Zm9yKHZhciB0PWUubGVuZ3RoLHI9ITEsaT0w
O2k8dDtpKyspaWYobihlW2ldKSl7cj0hMDticmVha31yZXR1cm4gcn1mdW5jdGlvbiBjKGUpe3Zh
ciB0PSExO2Zvcih2YXIgciBpbiBlKWlmKG4oZVtyXSkpe3Q9ITA7YnJlYWt9cmV0dXJuIHR9ZnVu
Y3Rpb24gZihlLHQpe3ZhciByPWwoZSk7aWYocil7Zm9yKHZhciBuPW5ldyB4KGUsdCksaT0wLG89
ZS5sZW5ndGg7aTxvO2krKyliKG4sZVtpXSk7cmV0dXJuIG59cmV0dXJuIGUuam9pbih0KX1mdW5j
dGlvbiBkKGUpe2Zvcih2YXIgdD1bXSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3Jd
O3QucHVzaChoKGkpKX1yZXR1cm4gdH1mdW5jdGlvbiBwKGUpe3ZhciB0PVtdO2Zvcih2YXIgciBp
biBlKXQucHVzaChyKyI6ICIrbShlW3JdKSk7cmV0dXJuIHQubGVuZ3RoPyJ7ICIrdC5qb2luKCIs
ICIpKyIgfSI6Int9In1mdW5jdGlvbiBoKGUpe2lmKG4oZSkpe3ZhciB0PWU7cmV0dXJuImZ1bmN0
aW9uIj09dHlwZW9mIHQubGFiZWw/dC5sYWJlbCgpOnQubGFiZWx9cmV0dXJuIG0oZSl9ZnVuY3Rp
b24gbShlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4nIicrZSsnIic7Y2Fz
ZSJvYmplY3QiOnJldHVybiJ7IC4uLiB9IjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24o
KSB7IC4uLiB9IjtkZWZhdWx0OnJldHVybiBTdHJpbmcoZSl9fWZ1bmN0aW9uIHYoZSx0KXt2YXIg
bj1uZXcgci5TdHJlYW0oZnVuY3Rpb24oKXtyZXR1cm4gZS52YWx1ZSgpfHx0LnZhbHVlKCl9LGZ1
bmN0aW9uKCl7cmV0dXJuIGgoZSkrIiB8fCAiK2godCl9KTtyZXR1cm4gbi5hZGREZXBlbmRlbmN5
KGUpLG4uYWRkRGVwZW5kZW5jeSh0KSxufWZ1bmN0aW9uIGIoZSx0KXtuKGUpJiZlLmFkZERlcGVu
ZGVuY3kodCl9ZnVuY3Rpb24gZyhlLHQsbil7Zm9yKHZhciBpPW5ldyByLlN0cmVhbShmdW5jdGlv
bigpe3ZhciByPXMoZSk7cmV0dXJuIHQ/dChyKTpyfSxmdW5jdGlvbigpe3JldHVybiBuKyIoIitk
KGUpKyIpIn0pLG89MCxhPWUubGVuZ3RoO288YTtvKyspaS5hZGREZXBlbmRlbmN5KGVbb10pO3Jl
dHVybiBpfWZ1bmN0aW9uIHkoZSx0LG4pe3ZhciBpPW5ldyByLlN0cmVhbShmdW5jdGlvbigpe3Zh
ciByPXUoZSk7cmV0dXJuIHQ/dChyKTpyfSxmdW5jdGlvbigpe3JldHVybiBuKyIoIitwKGUpKyIp
In0pO2Zvcih2YXIgbyBpbiBlKWkuYWRkRGVwZW5kZW5jeShlW29dKTtyZXR1cm4gaX1mdW5jdGlv
biBfKGUsdCxpKXtpZihuKGUpKXt2YXIgbz1uZXcgci5TdHJlYW0odCxmdW5jdGlvbigpe3JldHVy
biBpKyIoIitoKGUpKyIpIn0pO3JldHVybiBvLmFkZERlcGVuZGVuY3koZSksb31yZXR1cm4gdCgp
fWZ1bmN0aW9uIHcoZSx0KXtlJiZlW3IuSVNfU1RSRUFNXSYmZS5zZXRWYWx1ZSh0KX1lLmlzU3Ry
ZWFtPW4sZS5zdWJzY3JpYmU9aSxlLnVuc3Vic2NyaWJlPW8sZS5yZWFkPWEsZS5yZWFkQXJyYXk9
cyxlLnJlYWRIYXNoPXUsZS5zY2FuQXJyYXk9bCxlLnNjYW5IYXNoPWMsZS5jb25jYXQ9ZixlLmxh
YmVsc0Zvcj1kLGUubGFiZWxzRm9yT2JqZWN0PXAsZS5sYWJlbEZvcj1oLGUub3I9dixlLmFkZERl
cGVuZGVuY3k9YixlLnppcD1nLGUuemlwSGFzaD15LGUuY2hhaW49XyxlLnNldFZhbHVlPXc7dmFy
IHg9ci5kZWZhdWx0LmV4dGVuZCh7aW5pdDpmdW5jdGlvbihlLHQpe3RoaXMuYXJyYXk9ZSx0aGlz
LnNlcGFyYXRvcj10LHRoaXMuaXNDb25jYXQ9ITB9LGxhYmVsOmZ1bmN0aW9uKCl7dmFyIGU9ZCh0
aGlzLmFycmF5KTtyZXR1cm4iY29uY2F0KFsiK2Uuam9pbigiLCAiKSsiXTsgc2VwYXJhdG9yPSIr
bSh0aGlzLnNlcGFyYXRvcikrIikifSxjb21wdXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGYocyh0aGlz
LmFycmF5KSx0aGlzLnNlcGFyYXRvcil9fSl9KSxlKCJlbWJlci1tZXRhbC9zeW1ib2wiLFsiZXhw
b3J0cyIsImVtYmVyLW1ldGFsL3V0aWxzIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gcihlKXtyZXR1cm4gdC5pbnRlcm4oZSsiIFtpZD0iK3QuR1VJRF9LRVkrTWF0aC5mbG9v
cihNYXRoLnJhbmRvbSgpKm5ldyBEYXRlKSsiXSIpfWUuZGVmYXVsdD1yfSksZSgiZW1iZXItbWV0
YWwvdGFncyIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvbWV0YSIsInJlcXVpcmUiXSxmdW5jdGlv
bihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSxyKXtpZighaSl0aHJvdyBuZXcgRXJy
b3IoIkNhbm5vdCBjYWxsIHRhZ0ZvciB3aXRob3V0IEdsaW1tZXIiKTtpZihlJiYib2JqZWN0Ij09
dHlwZW9mIGUpe3ZhciBuPXJ8fHQubWV0YShlKTtyZXR1cm4gbi53cml0YWJsZVRhZyh1KX1yZXR1
cm4gb31lLnRhZ0Zvcj1uO3ZhciBpPXIuaGFzKCJnbGltbWVyLXJlZmVyZW5jZSIpLG89dm9pZCAw
LGE9dm9pZCAwLHM9dm9pZCAwLHU9dm9pZCAwLGw9dm9pZCAwO2lmKGUubWFya09iamVjdEFzRGly
dHk9bCxpKXt2YXIgYz1yLmRlZmF1bHQoImdsaW1tZXItcmVmZXJlbmNlIik7cz1jLkRpcnR5YWJs
ZVRhZyxvPWMuQ09OU1RBTlRfVEFHLGE9Yy5DVVJSRU5UX1RBRyx1PWZ1bmN0aW9uKCl7cmV0dXJu
IG5ldyBzfSxlLm1hcmtPYmplY3RBc0RpcnR5PWw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5yZWFk
YWJsZVRhZygpfHxhO3QuZGlydHkoKX19ZWxzZSBlLm1hcmtPYmplY3RBc0RpcnR5PWw9ZnVuY3Rp
b24oKXt9fSksZSgiZW1iZXItbWV0YWwvdXRpbHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJu
byB1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KCl7cmV0dXJuKyt2fWZ1bmN0aW9uIHIoZSl7dmFyIHQ9
e307dFtlXT0xO2Zvcih2YXIgciBpbiB0KWlmKHI9PT1lKXJldHVybiByO3JldHVybiBlfWZ1bmN0
aW9uIG4oZSxyKXtyfHwocj1iKTt2YXIgbj1yK3QoKTtyZXR1cm4gZSYmKG51bGw9PT1lW19dP2Vb
X109bjoody52YWx1ZT1uLGUuX19kZWZpbmVOb25FbnVtZXJhYmxlP2UuX19kZWZpbmVOb25FbnVt
ZXJhYmxlKGspOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLF8sdykpKSxufWZ1bmN0aW9uIGkoZSl7
aWYoZSYmZVtfXSlyZXR1cm4gZVtfXTtpZih2b2lkIDA9PT1lKXJldHVybiIodW5kZWZpbmVkKSI7
aWYobnVsbD09PWUpcmV0dXJuIihudWxsKSI7dmFyIHIsbj10eXBlb2YgZTtzd2l0Y2gobil7Y2Fz
ZSJudW1iZXIiOnJldHVybiByPWdbZV0scnx8KHI9Z1tlXT0ibnUiK2UpLHI7Y2FzZSJzdHJpbmci
OnJldHVybiByPXlbZV0scnx8KHI9eVtlXT0ic3QiK3QoKSkscjtjYXNlImJvb2xlYW4iOnJldHVy
biBlPyIodHJ1ZSkiOiIoZmFsc2UpIjtkZWZhdWx0OnJldHVybiBlPT09T2JqZWN0PyIoT2JqZWN0
KSI6ZT09PUFycmF5PyIoQXJyYXkpIjoocj1iK3QoKSxudWxsPT09ZVtfXT9lW19dPXI6KHcudmFs
dWU9cixlLl9fZGVmaW5lTm9uRW51bWVyYWJsZT9lLl9fZGVmaW5lTm9uRW51bWVyYWJsZShrKTpP
YmplY3QuZGVmaW5lUHJvcGVydHkoZSxfLHcpKSxyKX19ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBh
KGUpe3JldHVybiB2b2lkIDA9PT1lLl9faGFzU3VwZXImJihlLl9faGFzU3VwZXI9TyhlKSksZS5f
X2hhc1N1cGVyfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gYShlKT8hdC53cmFwcGVkRnVuY3Rpb24m
JmEodCk/dShlLHUodCxvKSk6dShlLHQpOmV9ZnVuY3Rpb24gdShlLHQpe2Z1bmN0aW9uIHIoKXt2
YXIgcj10aGlzLl9zdXBlcjt0aGlzLl9zdXBlcj10O3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVu
dHMpO3JldHVybiB0aGlzLl9zdXBlcj1yLG59cmV0dXJuIHIud3JhcHBlZEZ1bmN0aW9uPWUsci5f
X2VtYmVyX29ic2VydmVzX189ZS5fX2VtYmVyX29ic2VydmVzX18sci5fX2VtYmVyX29ic2VydmVz
QmVmb3JlX189ZS5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18sci5fX2VtYmVyX2xpc3RlbnNfXz1l
Ll9fZW1iZXJfbGlzdGVuc19fLHJ9ZnVuY3Rpb24gbChlLHQpe3JldHVybiEoIWV8fCJmdW5jdGlv
biIhPXR5cGVvZiBlW3RdKX1mdW5jdGlvbiBjKGUsdCxyKXtpZihsKGUsdCkpcmV0dXJuIHI/cChl
LHQscik6cChlLHQpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1lP1td
OkFycmF5LmlzQXJyYXkoZSk/ZTpbZV19ZnVuY3Rpb24gZChlKXtpZihudWxsPT09ZSlyZXR1cm4i
bnVsbCI7aWYodm9pZCAwPT09ZSlyZXR1cm4idW5kZWZpbmVkIjtpZihBcnJheS5pc0FycmF5KGUp
KXJldHVybiJbIitlKyJdIjt2YXIgdD10eXBlb2YgZTtpZigib2JqZWN0IiE9PXQmJiJzeW1ib2wi
IT09dClyZXR1cm4iIitlO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvU3RyaW5nJiZlLnRvU3Ry
aW5nIT09VClyZXR1cm4gZS50b1N0cmluZygpO3ZhciByLG49W107Zm9yKHZhciBpIGluIGUpaWYo
ZS5oYXNPd25Qcm9wZXJ0eShpKSl7aWYocj1lW2ldLCJ0b1N0cmluZyI9PT1yKWNvbnRpbnVlOyJm
dW5jdGlvbiI9PXR5cGVvZiByJiYocj0iZnVuY3Rpb24oKSB7IC4uLiB9IiksciYmImZ1bmN0aW9u
IiE9dHlwZW9mIHIudG9TdHJpbmc/bi5wdXNoKGkrIjogIitULmNhbGwocikpOm4ucHVzaChpKyI6
ICIrcil9cmV0dXJuInsiK24uam9pbigiLCAiKSsifSJ9ZnVuY3Rpb24gcChlLHQscil7dmFyIG49
ciYmci5sZW5ndGg7aWYoIXJ8fCFuKXJldHVybiBlW3RdKCk7c3dpdGNoKG4pe2Nhc2UgMTpyZXR1
cm4gZVt0XShyWzBdKTtjYXNlIDI6cmV0dXJuIGVbdF0oclswXSxyWzFdKTtjYXNlIDM6cmV0dXJu
IGVbdF0oclswXSxyWzFdLHJbMl0pO2Nhc2UgNDpyZXR1cm4gZVt0XShyWzBdLHJbMV0sclsyXSxy
WzNdKTtjYXNlIDU6cmV0dXJuIGVbdF0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdKTtkZWZhdWx0
OnJldHVybiBlW3RdLmFwcGx5KGUscil9fWZ1bmN0aW9uIGgoZSx0KXtmb3IodmFyIHI9ZTtyOyl7
dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLHQpO2lmKG4pcmV0dXJuIG47
cj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbShlKXtyZXR1
cm4gZSYmZS50b1N0cmluZz9lLnRvU3RyaW5nKCk6VC5jYWxsKGUpfWUudXVpZD10LGUuaW50ZXJu
PXIsZS5nZW5lcmF0ZUd1aWQ9bixlLmd1aWRGb3I9aSxlLndyYXA9cyxlLnRyeUludm9rZT1jLGUu
bWFrZUFycmF5PWYsZS5pbnNwZWN0PWQsZS5hcHBseVN0cj1wLGUubG9va3VwRGVzY3JpcHRvcj1o
LGUudG9TdHJpbmc9bTt2YXIgdj0wLGI9ImVtYmVyIixnPVtdLHk9e30sXz1yKCJfX2VtYmVyIisg
K25ldyBEYXRlKSx3PXt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2
YWx1ZTpudWxsfTtlLkdVSURfREVTQz13O3ZhciB4PXtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6
ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsfSxrPXtuYW1lOl8sZGVzY3JpcHRvcjp4fTtlLkdV
SURfS0VZX1BST1BFUlRZPWs7dmFyIEM9L1wuKF9zdXBlcnxjYWxsXCh0aGlzfGFwcGx5XCh0aGlz
KS8sRT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsTz1mdW5jdGlvbigpe3ZhciBlPUUuY2Fs
bChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkuaW5kZXhPZigicmV0dXJuIHRoaXMiKT4tMTtyZXR1
cm4gZT9mdW5jdGlvbihlKXtyZXR1cm4gQy50ZXN0KEUuY2FsbChlKSl9OmZ1bmN0aW9uKCl7cmV0
dXJuITB9fSgpO2UuY2hlY2tIYXNTdXBlcj1PLG8uX19oYXNTdXBlcj0hMTt2YXIgVD1PYmplY3Qu
cHJvdG90eXBlLnRvU3RyaW5nO2UuR1VJRF9LRVk9XyxlLm1ha2VBcnJheT1mLGUuY2FuSW52b2tl
PWx9KSxlKCJlbWJlci1tZXRhbC93YXRjaF9rZXkiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Zl
YXR1cmVzIiwiZW1iZXItbWV0YWwvbWV0YSIsImVtYmVyLW1ldGFsL3Byb3BlcnRpZXMiLCJlbWJl
ci1tZXRhbC91dGlscyJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IG8oZSx0LG4pe2lmKCJsZW5ndGgiIT09dHx8IUFycmF5LmlzQXJyYXkoZSkpe3ZhciBpPW58fHIu
bWV0YShlKTtpZihpLnBlZWtXYXRjaGluZyh0KSlpLndyaXRlV2F0Y2hpbmcodCwoaS5wZWVrV2F0
Y2hpbmcodCl8fDApKzEpO2Vsc2V7aS53cml0ZVdhdGNoaW5nKHQsMSk7dmFyIG89ZVt0XSxhPW51
bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8mJm8uaXNEZXNjcmlwdG9yP286dm9pZCAwO2EmJmEu
d2lsbFdhdGNoJiZhLndpbGxXYXRjaChlLHQpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLndpbGxXYXRj
aFByb3BlcnR5JiZlLndpbGxXYXRjaFByb3BlcnR5KHQpfX19ZnVuY3Rpb24gYShlLHQsbil7dmFy
IGk9bnx8ci5tZXRhKGUpLG89aS5wZWVrV2F0Y2hpbmcodCk7aWYoMT09PW8pe2kud3JpdGVXYXRj
aGluZyh0LDApO3ZhciBhPWVbdF0scz1udWxsIT09YSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmlz
RGVzY3JpcHRvcj9hOnZvaWQgMDtzJiZzLmRpZFVud2F0Y2gmJnMuZGlkVW53YXRjaChlLHQpLCJm
dW5jdGlvbiI9PXR5cGVvZiBlLmRpZFVud2F0Y2hQcm9wZXJ0eSYmZS5kaWRVbndhdGNoUHJvcGVy
dHkodCl9ZWxzZSBvPjEmJmkud3JpdGVXYXRjaGluZyh0LG8tMSl9ZS53YXRjaEtleT1vLGUudW53
YXRjaEtleT1hfSksZSgiZW1iZXItbWV0YWwvd2F0Y2hfcGF0aCIsWyJleHBvcnRzIiwiZW1iZXIt
bWV0YWwvbWV0YSIsImVtYmVyLW1ldGFsL2NoYWlucyJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gbihlLHIpe3JldHVybihyfHx0Lm1ldGEoZSkpLndyaXRhYmxlQ2hhaW5z
KGkpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG5ldyByLkNoYWluTm9kZShudWxsLG51bGwsZSl9ZnVu
Y3Rpb24gbyhlLHIsaSl7aWYoImxlbmd0aCIhPT1yfHwhQXJyYXkuaXNBcnJheShlKSl7dmFyIG89
aXx8dC5tZXRhKGUpLGE9by5wZWVrV2F0Y2hpbmcocil8fDA7YT9vLndyaXRlV2F0Y2hpbmcocixh
KzEpOihvLndyaXRlV2F0Y2hpbmcociwxKSxuKGUsbykuYWRkKHIpKX19ZnVuY3Rpb24gYShlLHIs
aSl7dmFyIG89aXx8dC5tZXRhKGUpLGE9by5wZWVrV2F0Y2hpbmcocil8fDA7MT09PWE/KG8ud3Jp
dGVXYXRjaGluZyhyLDApLG4oZSxvKS5yZW1vdmUocikpOmE+MSYmby53cml0ZVdhdGNoaW5nKHIs
YS0xKX1lLndhdGNoUGF0aD1vLGUudW53YXRjaFBhdGg9YX0pLGUoImVtYmVyLW1ldGFsL3dhdGNo
aW5nIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jaGFpbnMiLCJlbWJlci1tZXRhbC93YXRjaF9r
ZXkiLCJlbWJlci1tZXRhbC93YXRjaF9wYXRoIiwiZW1iZXItbWV0YWwvcGF0aF9jYWNoZSIsImVt
YmVyLW1ldGFsL21ldGEiXSxmdW5jdGlvbihlLHQscixuLGksbyl7InVzZSBzdHJpY3QiO2Z1bmN0
aW9uIGEoZSx0LG8peyJsZW5ndGgiPT09dCYmQXJyYXkuaXNBcnJheShlKXx8KGkuaXNQYXRoKHQp
P24ud2F0Y2hQYXRoKGUsdCxvKTpyLndhdGNoS2V5KGUsdCxvKSl9ZnVuY3Rpb24gcyhlLHQpe3Zh
ciByPW8ucGVla01ldGEoZSk7cmV0dXJuKHImJnIucGVla1dhdGNoaW5nKHQpKT4wfWZ1bmN0aW9u
IHUoZSx0KXt2YXIgcj1vLnBlZWtNZXRhKGUpO3JldHVybiByJiZyLnBlZWtXYXRjaGluZyh0KXx8
MH1mdW5jdGlvbiBsKGUsdCxvKXsibGVuZ3RoIj09PXQmJkFycmF5LmlzQXJyYXkoZSl8fChpLmlz
UGF0aCh0KT9uLnVud2F0Y2hQYXRoKGUsdCxvKTpyLnVud2F0Y2hLZXkoZSx0LG8pKX1mdW5jdGlv
biBjKGUpe3ZhciByLG4saSxhLHM9by5wZWVrTWV0YShlKTtpZihzJiYoby5kZWxldGVNZXRhKGUp
LHI9cy5yZWFkYWJsZUNoYWlucygpKSlmb3IoZi5wdXNoKHIpO2YubGVuZ3RoPjA7KXtpZihyPWYu
cG9wKCksbj1yLl9jaGFpbnMpZm9yKGkgaW4gbil2b2lkIDAhPT1uW2ldJiZmLnB1c2gobltpXSk7
ci5fd2F0Y2hpbmcmJihhPXIuX29iamVjdCxhJiZ0LnJlbW92ZUNoYWluV2F0Y2hlcihhLHIuX2tl
eSxyKSl9fWUuaXNXYXRjaGluZz1zLGUud2F0Y2hlckNvdW50PXUsZS51bndhdGNoPWwsZS5kZXN0
cm95PWMsZS53YXRjaD1hO3ZhciBmPVtdfSksZSgiZW1iZXItbWV0YWwvd2Vha19tYXAiLFsiZXhw
b3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvdXRpbHMiLCJlbWJlci1tZXRh
bC9tZXRhIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoKXt9ZnVu
Y3Rpb24gbygpe3RoaXMuX2lkPXIuR1VJRF9LRVkrYSsrfWUuZGVmYXVsdD1vO3ZhciBhPTA7by5w
cm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3ZhciB0PW4ucGVla01ldGEoZSk7aWYodCl7dmFyIHI9
dC5yZWFkYWJsZVdlYWsoKTtpZihyKXtpZihyW3RoaXMuX2lkXT09PWkpcmV0dXJuO3JldHVybiBy
W3RoaXMuX2lkXX19fSxvLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAw
PT09dCYmKHQ9aSksbi5tZXRhKGUpLndyaXRhYmxlV2VhaygpW3RoaXMuX2lkXT10LHRoaXN9LG8u
cHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXt2YXIgdD1uLnBlZWtNZXRhKGUpO2lmKHQpe3ZhciBy
PXQucmVhZGFibGVXZWFrKCk7aWYocilyZXR1cm4gdm9pZCAwIT09clt0aGlzLl9pZF19cmV0dXJu
ITF9LG8ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMuaGFzKGUpJiYo
ZGVsZXRlIG4ubWV0YShlKS53cml0YWJsZVdlYWsoKVt0aGlzLl9pZF0sITApfX0pLGUoImVtYmVy
LXJvdXRpbmctaHRtbGJhcnMvaGVscGVycy9xdWVyeS1wYXJhbXMiLFsiZXhwb3J0cyIsImVtYmVy
LW1ldGFsL2RlYnVnIiwiZW1iZXItcm91dGluZy9zeXN0ZW0vcXVlcnlfcGFyYW1zIl0sZnVuY3Rp
b24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIHIuZGVmYXVsdC5j
cmVhdGUoe3ZhbHVlczp0fSl9ZS5xdWVyeVBhcmFtc0hlbHBlcj1ufSksZSgiZW1iZXItcm91dGlu
Zy1odG1sYmFycy9pbmRleCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLWh0
bWxiYXJzL2hlbHBlcnMiLCJlbWJlci1odG1sYmFycy9rZXl3b3JkcyIsImVtYmVyLXJvdXRpbmct
aHRtbGJhcnMvaGVscGVycy9xdWVyeS1wYXJhbXMiLCJlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tl
eXdvcmRzL2FjdGlvbiIsImVtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1h
Y3Rpb24iLCJlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdvcmRzL3JlbmRlciJdLGZ1bmN0aW9u
KGUsdCxyLG4saSxvLGEscyl7InVzZSBzdHJpY3QiO3IucmVnaXN0ZXJIZWxwZXIoInF1ZXJ5LXBh
cmFtcyIsaS5xdWVyeVBhcmFtc0hlbHBlciksbi5yZWdpc3RlcktleXdvcmQoImFjdGlvbiIsby5k
ZWZhdWx0KSxuLnJlZ2lzdGVyS2V5d29yZCgiQGVsZW1lbnRfYWN0aW9uIixhLmRlZmF1bHQpLG4u
cmVnaXN0ZXJLZXl3b3JkKCJyZW5kZXIiLHMuZGVmYXVsdCksZS5kZWZhdWx0PXQuZGVmYXVsdH0p
LGUoImVtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvYWN0aW9uIixbImV4cG9ydHMiLCJo
dG1sYmFycy1ydW50aW1lL2hvb2tzIiwiZW1iZXItcm91dGluZy1odG1sYmFycy9rZXl3b3Jkcy9j
bG9zdXJlLWFjdGlvbiJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PWZ1
bmN0aW9uKGUsbixpLG8sYSxzLHUsbCl7cmV0dXJuIGU/KHQua2V5d29yZCgiQGVsZW1lbnRfYWN0
aW9uIixlLG4saSxvLGEscyx1LGwpLCEwKTpyLmRlZmF1bHQoZSxuLGksbyxhLHMsdSxsKX19KSxl
KCJlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtYWN0aW9uIixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbSIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRp
bHMiLCJlbWJlci1tZXRhbC9zeW1ib2wiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJl
ci1odG1sYmFycy9ob29rcy9zdWJleHByIiwiZW1iZXItbWV0YWwvZXJyb3IiLCJlbWJlci1tZXRh
bC9ydW5fbG9vcCIsImVtYmVyLW1ldGFsL2luc3RydW1lbnRhdGlvbiIsImVtYmVyLW1ldGFsL2lz
X25vbmUiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxsKXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gYyhlLG4saSxzLHUsYyxwLGgpe3ZhciBtPW5ldyB0LlN0cmVhbShmdW5jdGlvbigpe3ZhciBl
PXNbMF0sdD1yLnJlYWRBcnJheShzLnNsaWNlKDEscy5sZW5ndGgpKSxuPXZvaWQgMCxjPXZvaWQg
MCxwPXZvaWQgMDtpZihsLmRlZmF1bHQoZSkpe3ZhciBoPW8ubGFiZWxGb3JTdWJleHByKHMsdSwi
YWN0aW9uIik7dGhyb3cgbmV3IGEuZGVmYXVsdCgiQWN0aW9uIHBhc3NlZCBpcyBudWxsIG9yIHVu
ZGVmaW5lZCBpbiAiK2grIiBmcm9tICIrci5yZWFkKGkuZ2V0U2VsZigpKSsiLiIpfWlmKGVbZF0p
bj1lLGM9ZVtkXTtlbHNle249ci5yZWFkKGkuZ2V0U2VsZigpKSxjPXIucmVhZChlKTt2YXIgbT10
eXBlb2YgYztpZigic3RyaW5nIj09PW0pe3ZhciB2PWM7aWYoYz1udWxsLHUudGFyZ2V0JiYobj1y
LnJlYWQodS50YXJnZXQpKSxuLmFjdGlvbnMmJihjPW4uYWN0aW9uc1t2XSksIWMpdGhyb3cgbmV3
IGEuZGVmYXVsdCgiQW4gYWN0aW9uIG5hbWVkICciK3YrIicgd2FzIG5vdCBmb3VuZCBpbiAiK24r
Ii4iKX1lbHNlIGlmKGMmJiJmdW5jdGlvbiI9PXR5cGVvZiBjW2RdKW49YyxjPWNbZF07ZWxzZSBp
ZigiZnVuY3Rpb24iIT09bSl0aHJvdyBuZXcgYS5kZWZhdWx0KCJBbiBhY3Rpb24gY291bGQgbm90
IGJlIG1hZGUgZm9yIGAiK2UubGFiZWwrImAgaW4gIituKyIuIFBsZWFzZSBjb25maXJtIHRoYXQg
eW91IGFyZSB1c2luZyBlaXRoZXIgYSBxdW90ZWQgYWN0aW9uIG5hbWUgKGkuZS4gYChhY3Rpb24g
JyIrZS5sYWJlbCsiJylgKSBvciBhIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiAiK24rIi4iKX1yZXR1
cm4gdS52YWx1ZSYmKHA9ci5yZWFkKHUudmFsdWUpKSxmKHRoaXMsbixjLHAsdCl9LGZ1bmN0aW9u
KCl7cmV0dXJuIG8ubGFiZWxGb3JTdWJleHByKHMsdSwiYWN0aW9uIil9KTtyZXR1cm4gcy5mb3JF
YWNoKG0uYWRkRGVwZW5kZW5jeSxtKSxPYmplY3Qua2V5cyh1KS5mb3JFYWNoKGZ1bmN0aW9uKGUp
e3JldHVybiBtLmFkZERlcGVuZGVuY3koZSl9KSxtfWZ1bmN0aW9uIGYoZSx0LG4sbyxhKXt2YXIg
bDtyZXR1cm4gbD1hLmxlbmd0aD4wP2Z1bmN0aW9uKCl7Zm9yKHZhciBsPWEsYz1hcmd1bWVudHMu
bGVuZ3RoLGY9QXJyYXkoYyksZD0wO2Q8YztkKyspZltkXT1hcmd1bWVudHNbZF07Zi5sZW5ndGg+
MCYmKGw9YS5jb25jYXQoZikpLG8mJmwubGVuZ3RoPjAmJihsWzBdPWkuZ2V0KGxbMF0sbykpO3Zh
ciBwPXt0YXJnZXQ6dCxhcmdzOmwsbGFiZWw6ci5sYWJlbEZvcihlKX07cmV0dXJuIHUuZmxhZ2dl
ZEluc3RydW1lbnQoImludGVyYWN0aW9uLmVtYmVyLWFjdGlvbiIscCxmdW5jdGlvbigpe3JldHVy
biBzLmRlZmF1bHQuam9pbi5hcHBseShzLmRlZmF1bHQsW3Qsbl0uY29uY2F0KGwpKX0pfTpmdW5j
dGlvbigpe2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoLGw9QXJyYXkoYSksYz0wO2M8YTtjKysp
bFtjXT1hcmd1bWVudHNbY107byYmbC5sZW5ndGg+MCYmKGxbMF09aS5nZXQobFswXSxvKSk7dmFy
IGY9e3RhcmdldDp0LGFyZ3M6bCxsYWJlbDpyLmxhYmVsRm9yKGUpfTtyZXR1cm4gdS5mbGFnZ2Vk
SW5zdHJ1bWVudCgiaW50ZXJhY3Rpb24uZW1iZXItYWN0aW9uIixmLGZ1bmN0aW9uKCl7cmV0dXJu
IHMuZGVmYXVsdC5qb2luLmFwcGx5KHMuZGVmYXVsdCxbdCxuXS5jb25jYXQobCkpfSl9LGxbcF09
ITAsbH1lLmRlZmF1bHQ9Yzt2YXIgZD1uLmRlZmF1bHQoIklOVk9LRSIpO2UuSU5WT0tFPWQ7dmFy
IHA9bi5kZWZhdWx0KCJBQ1RJT04iKTtlLkFDVElPTj1wfSksZSgiZW1iZXItcm91dGluZy1odG1s
YmFycy9rZXl3b3Jkcy9lbGVtZW50LWFjdGlvbiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVi
dWciLCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMiLCJlbWJl
ci1tZXRhbC9ydW5fbG9vcCIsImVtYmVyLXZpZXdzL3N0cmVhbXMvdXRpbHMiLCJlbWJlci12aWV3
cy9zeXN0ZW0vdXRpbHMiLCJlbWJlci12aWV3cy9zeXN0ZW0vYWN0aW9uX21hbmFnZXIiXSxmdW5j
dGlvbihlLHQscixuLGksbyxhLHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUsdCl7aWYoInVu
ZGVmaW5lZCI9PXR5cGVvZiB0KXtpZihmLnRlc3QoZS50eXBlKSlyZXR1cm4gYS5pc1NpbXBsZUNs
aWNrKGUpO3Q9IiJ9aWYodC5pbmRleE9mKCJhbnkiKT49MClyZXR1cm4hMDtmb3IodmFyIHI9MCxu
PWMubGVuZ3RoO3I8bjtyKyspaWYoZVtjW3JdKyJLZXkiXSYmdC5pbmRleE9mKGNbcl0pPT09LTEp
cmV0dXJuITE7cmV0dXJuITB9ZS5kZWZhdWx0PXtzZXR1cFN0YXRlOmZ1bmN0aW9uKGUsdCxyLG4s
aSl7Zm9yKHZhciBhPXQuaG9va3MuZ2V0LHM9dC5ob29rcy5nZXRWYWx1ZSx1PXMoblswXSksbD1b
XSxjPTEsZj1uLmxlbmd0aDtjPGY7YysrKWwucHVzaChvLnJlYWRVbndyYXBwZWRNb2RlbChuW2Nd
KSk7dmFyIGQ7cmV0dXJuIGQ9aS50YXJnZXQ/cygic3RyaW5nIj09dHlwZW9mIGkudGFyZ2V0P2Eo
dCxyLGkudGFyZ2V0KTppLnRhcmdldCk6cyhyLmdldExvY2FsKCJjb250cm9sbGVyIikpfHxzKHIu
Z2V0U2VsZigpKSx7YWN0aW9uTmFtZTp1LGFjdGlvbkFyZ3M6bCx0YXJnZXQ6ZH19LGlzU3RhYmxl
OmZ1bmN0aW9uKGUsdCxyLG4saSl7cmV0dXJuITB9LHJlbmRlcjpmdW5jdGlvbihlLHQsbixpLG8s
YSxzLHUpe3ZhciBjPXQuZG9tLmdldEF0dHJpYnV0ZShlLmVsZW1lbnQsImRhdGEtZW1iZXItYWN0
aW9uIil8fHIudXVpZCgpO2wucmVnaXN0ZXJBY3Rpb24oe2FjdGlvbklkOmMsbm9kZTplLGV2ZW50
TmFtZTpvLm9ufHwiY2xpY2siLGJ1YmJsZXM6by5idWJibGVzLHByZXZlbnREZWZhdWx0Om8ucHJl
dmVudERlZmF1bHQsd2l0aEtleUNvZGU6by53aXRoS2V5Q29kZSxhbGxvd2VkS2V5czpvLmFsbG93
ZWRLZXlzfSksZS5jbGVhbnVwPWZ1bmN0aW9uKCl7bC51bnJlZ2lzdGVyQWN0aW9uKGMpfSx0LmRv
bS5zZXRBdHRyaWJ1dGUoZS5lbGVtZW50LCJkYXRhLWVtYmVyLWFjdGlvbiIsYyl9fTt2YXIgbD17
fTtlLkFjdGlvbkhlbHBlcj1sLGwucmVnaXN0ZXJlZEFjdGlvbnM9cy5kZWZhdWx0LnJlZ2lzdGVy
ZWRBY3Rpb25zLGwucmVnaXN0ZXJBY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hY3Rpb25JZCxy
PWUubm9kZSxvPWUuZXZlbnROYW1lLGE9ZS5wcmV2ZW50RGVmYXVsdCxsPWUuYnViYmxlcyxjPWUu
YWxsb3dlZEtleXMsZj1zLmRlZmF1bHQucmVnaXN0ZXJlZEFjdGlvbnNbdF07cmV0dXJuIGZ8fChm
PXMuZGVmYXVsdC5yZWdpc3RlcmVkQWN0aW9uc1t0XT1bXSksZi5wdXNoKHtldmVudE5hbWU6byxo
YW5kbGVyOmZ1bmN0aW9uKGUpe2lmKCF1KGUsbi5yZWFkKGMpKSlyZXR1cm4hMDtuLnJlYWQoYSkh
PT0hMSYmZS5wcmV2ZW50RGVmYXVsdCgpLG4ucmVhZChsKT09PSExJiZlLnN0b3BQcm9wYWdhdGlv
bigpO3ZhciB0PXIuZ2V0U3RhdGUoKSxvPXQudGFyZ2V0LHM9dC5hY3Rpb25OYW1lLGY9dC5hY3Rp
b25BcmdzO2kuZGVmYXVsdChmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzP3Zv
aWQgcy5hcHBseShvLGYpOnZvaWQoby5zZW5kP28uc2VuZC5hcHBseShvLFtzXS5jb25jYXQoZikp
Om9bc10uYXBwbHkobyxmKSl9KX19KSx0fSxsLnVucmVnaXN0ZXJBY3Rpb249ZnVuY3Rpb24oZSl7
ZGVsZXRlIHMuZGVmYXVsdC5yZWdpc3RlcmVkQWN0aW9uc1tlXX07dmFyIGM9WyJhbHQiLCJzaGlm
dCIsIm1ldGEiLCJjdHJsIl0sZj0vXmNsaWNrfG1vdXNlfHRvdWNoL30pLGUoImVtYmVyLXJvdXRp
bmctaHRtbGJhcnMva2V5d29yZHMvcmVuZGVyIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1
ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL2VtcHR5X29iamVjdCIs
ImVtYmVyLW1ldGFsL2Vycm9yIiwiZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyIsImVtYmVyLXJ1
bnRpbWUvc3lzdGVtL3N0cmluZyIsImVtYmVyLXJvdXRpbmcvc3lzdGVtL2dlbmVyYXRlX2NvbnRy
b2xsZXIiLCJlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL3ZpZXctbm9kZS1tYW5hZ2VyIl0s
ZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKGUsdCl7
dmFyIHI9dC52aWV3Lm93bmVyVmlldztpZihyJiZyLm91dGxldFN0YXRlKXt2YXIgaT1yLm91dGxl
dFN0YXRlO2lmKGkubWFpbil7dmFyIG89aS5tYWluLm91dGxldHMuX19lbWJlcl9vcnBoYW5zX187
aWYobyl7dmFyIGE9by5vdXRsZXRzW2VdO2lmKGEpe3ZhciBzPW5ldyBuLmRlZmF1bHQ7cmV0dXJu
IHNbYS5yZW5kZXIub3V0bGV0XT1hLGEud2FzVXNlZD0hMCxzfX19fX1mdW5jdGlvbiBjKGUsdCl7
aWYoIWUmJiF0KXJldHVybiEwO2lmKCFlfHwhdClyZXR1cm4hMTtmb3IodmFyIHIgaW4gZSlpZigh
ZihlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGYoZSx0KXtpZighZSYmIXQp
cmV0dXJuITA7aWYoIWV8fCF0KXJldHVybiExO2U9ZS5yZW5kZXIsdD10LnJlbmRlcjtmb3IodmFy
IHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpJiZlW3JdIT09dFtyXSYmIm5hbWUiIT09cily
ZXR1cm4hMTtyZXR1cm4hMH1lLmRlZmF1bHQ9e3dpbGxSZW5kZXI6ZnVuY3Rpb24oZSx0KXt0LnZp
ZXcub3duZXJWaWV3Ll9vdXRsZXRzJiZ0LnZpZXcub3duZXJWaWV3Ll9vdXRsZXRzLnB1c2goZSk7
Cit9LHNldHVwU3RhdGU6ZnVuY3Rpb24oZSx0LHIsbixpKXt2YXIgbz1uWzBdO3JldHVybntwYXJl
bnRWaWV3OnQudmlldyxtYW5hZ2VyOmUubWFuYWdlcixjb250cm9sbGVyOmUuY29udHJvbGxlcixj
aGlsZE91dGxldFN0YXRlOmwobyx0KX19LGNoaWxkRW52OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQu
Y2hpbGRXaXRoT3V0bGV0U3RhdGUoZS5jaGlsZE91dGxldFN0YXRlKX0saXNTdGFibGU6ZnVuY3Rp
b24oZSx0KXtyZXR1cm4gYyhlLmNoaWxkT3V0bGV0U3RhdGUsdC5jaGlsZE91dGxldFN0YXRlKX0s
aXNFbXB0eTpmdW5jdGlvbihlKXtyZXR1cm4hMX0scmVuZGVyOmZ1bmN0aW9uKGUsdCxuLGwsYyxm
LGQscCl7dmFyIGg9ZS5nZXRTdGF0ZSgpLG09bFswXSx2PWxbMV0sYj10Lm93bmVyLGc9Yi5sb29r
dXAoInJvdXRlcjptYWluIik7aWYoMT09PWwubGVuZ3RoKTtlbHNlIGlmKDIhPT1sLmxlbmd0aCl0
aHJvdyBuZXcgaS5kZWZhdWx0KCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGVOYW1lIHRvIHJlbmRl
ciIpO3ZhciB5PSJ0ZW1wbGF0ZToiK20sXz1iLmxvb2t1cCgidmlldzoiK20pO198fChfPWIubG9v
a3VwKCJ2aWV3OmRlZmF1bHQiKSk7dmFyIHc9XyYmISFyLmdldChfLCJ0ZW1wbGF0ZSIpO2Z8fHd8
fChmPWIubG9va3VwKHkpKSxfJiYoXy5vd25lclZpZXc9dC52aWV3Lm93bmVyVmlldyk7dmFyIHgs
aztjLmNvbnRyb2xsZXI/KHg9Yy5jb250cm9sbGVyLGs9ImNvbnRyb2xsZXI6Iit4LGRlbGV0ZSBj
LmNvbnRyb2xsZXIpOih4PW0saz0iY29udHJvbGxlcjoiK3gpO3ZhciBDLEU9ZztpZihsLmxlbmd0
aD4xKXt2YXIgTz1iLl9sb29rdXBGYWN0b3J5KGspfHxzLmdlbmVyYXRlQ29udHJvbGxlckZhY3Rv
cnkoYix4KTtDPU8uY3JlYXRlKHttb2RlbDpvLnJlYWQodiksdGFyZ2V0OkV9KSxlLmFkZERlc3Ry
dWN0aW9uKEMpfWVsc2UgQz1iLmxvb2t1cChrKXx8cy5kZWZhdWx0KGIseCksQy5zZXRQcm9wZXJ0
aWVzKHt0YXJnZXQ6RX0pO18mJl8uc2V0KCJjb250cm9sbGVyIixDKSxoLmNvbnRyb2xsZXI9Qyxj
LnZpZXdOYW1lPWEuY2FtZWxpemUobSksZiYmZi5yYXcmJihmPWYucmF3KTt2YXIgVD17bGF5b3V0
Om51bGwsc2VsZjpDfTtfJiYoVC5jb21wb25lbnQ9Xyk7dmFyIE49dS5kZWZhdWx0LmNyZWF0ZShl
LHQsYyxULGgucGFyZW50VmlldyxudWxsLG51bGwsZik7aC5tYW5hZ2VyPU4sZyYmMT09PWwubGVu
Z3RoJiZnLl9jb25uZWN0QWN0aXZlQ29tcG9uZW50Tm9kZShtLE4pLE4ucmVuZGVyKHQsYyxwKX0s
cmVyZW5kZXI6ZnVuY3Rpb24oZSx0LHIsbixpLGEscyx1KXtpZihuLmxlbmd0aD4xKXt2YXIgbD1v
LnJlYWQoblsxXSk7ZS5nZXRTdGF0ZSgpLmNvbnRyb2xsZXIuc2V0KCJtb2RlbCIsbCl9fX19KSxl
KCJlbWJlci1yb3V0aW5nLXZpZXdzL2NvbXBvbmVudHMvbGluay10byIsWyJleHBvcnRzIiwiZW1i
ZXItbWV0YWwvZmVhdHVyZXMiLCJlbWJlci1tZXRhbC9sb2dnZXIiLCJlbWJlci1tZXRhbC9kZWJ1
ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL2NvbXB1dGVkIiwiZW1i
ZXItbWV0YWwvY29tcHV0ZWRfbWFjcm9zIiwiZW1iZXItdmlld3Mvc3lzdGVtL3V0aWxzIiwiZW1i
ZXItdmlld3MvY29tcG9uZW50cy9jb21wb25lbnQiLCJlbWJlci1ydW50aW1lL2luamVjdCIsImVt
YmVyLXJ1bnRpbWUvc3lzdGVtL3NlcnZpY2UiLCJlbWJlci1ydW50aW1lL21peGlucy9jb250cm9s
bGVyIiwiZW1iZXItaHRtbGJhcnMvbm9kZS1tYW5hZ2Vycy9jb21wb25lbnQtbm9kZS1tYW5hZ2Vy
IiwiZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVzL2xpbmstdG8iLCJyZXF1aXJlIl0sZnVuY3Rpb24o
ZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwLGgpeyJ1c2Ugc3RyaWN0Ijt2YXIgbT1wLmRlZmF1
bHQsdj11LmRlZmF1bHQuZXh0ZW5kKHtsYXlvdXQ6bSx0YWdOYW1lOiJhIixjdXJyZW50V2hlbjph
LmRlcHJlY2F0aW5nQWxpYXMoImN1cnJlbnQtd2hlbiIse2lkOiJlbWJlci1yb3V0aW5nLXZpZXcu
ZGVwcmVjYXRlZC1jdXJyZW50LXdoZW4iLHVudGlsOiIzLjAuMCJ9KSwiY3VycmVudC13aGVuIjpu
dWxsLHRpdGxlOm51bGwscmVsOm51bGwsdGFiaW5kZXg6bnVsbCx0YXJnZXQ6bnVsbCxhY3RpdmVD
bGFzczoiYWN0aXZlIixsb2FkaW5nQ2xhc3M6ImxvYWRpbmciLGRpc2FibGVkQ2xhc3M6ImRpc2Fi
bGVkIixfaXNEaXNhYmxlZDohMSxyZXBsYWNlOiExLGF0dHJpYnV0ZUJpbmRpbmdzOlsiaHJlZiIs
InRpdGxlIiwicmVsIiwidGFiaW5kZXgiLCJ0YXJnZXQiXSxjbGFzc05hbWVCaW5kaW5nczpbImFj
dGl2ZSIsImxvYWRpbmciLCJkaXNhYmxlZCIsInRyYW5zaXRpb25pbmdJbiIsInRyYW5zaXRpb25p
bmdPdXQiXSxldmVudE5hbWU6ImNsaWNrIixpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIuYXBw
bHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWkuZ2V0KHRoaXMsImV2ZW50TmFtZSIpO3RoaXMub24o
ZSx0aGlzLHRoaXMuX2ludm9rZSl9LF9yb3V0aW5nOmwuZGVmYXVsdC5zZXJ2aWNlKCItcm91dGlu
ZyIpLGRpc2FibGVkOm8uY29tcHV0ZWQoe2dldDpmdW5jdGlvbihlLHQpe3JldHVybiExfSxzZXQ6
ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09dCYmdGhpcy5zZXQoIl9pc0Rpc2FibGVkIix0
KSwhIXQmJmkuZ2V0KHRoaXMsImRpc2FibGVkQ2xhc3MiKX19KSxfY29tcHV0ZUFjdGl2ZTpmdW5j
dGlvbihlKXtpZihpLmdldCh0aGlzLCJsb2FkaW5nIikpcmV0dXJuITE7dmFyIHQ9aS5nZXQodGhp
cywiX3JvdXRpbmciKSxyPWkuZ2V0KHRoaXMsIm1vZGVscyIpLG49aS5nZXQodGhpcywicmVzb2x2
ZWRRdWVyeVBhcmFtcyIpLG89aS5nZXQodGhpcywiY3VycmVudC13aGVuIiksYT0hIW87bz1vfHxp
LmdldCh0aGlzLCJxdWFsaWZpZWRSb3V0ZU5hbWUiKSxvPW8uc3BsaXQoIiAiKTtmb3IodmFyIHM9
MCx1PW8ubGVuZ3RoO3M8dTtzKyspaWYodC5pc0FjdGl2ZUZvclJvdXRlKHIsbixvW3NdLGUsYSkp
cmV0dXJuIGkuZ2V0KHRoaXMsImFjdGl2ZUNsYXNzIik7cmV0dXJuITF9LGFjdGl2ZTpvLmNvbXB1
dGVkKCJhdHRycy5wYXJhbXMiLCJfcm91dGluZy5jdXJyZW50U3RhdGUiLGZ1bmN0aW9uKCl7dmFy
IGU9aS5nZXQodGhpcywiX3JvdXRpbmcuY3VycmVudFN0YXRlIik7cmV0dXJuISFlJiZ0aGlzLl9j
b21wdXRlQWN0aXZlKGUpfSksd2lsbEJlQWN0aXZlOm8uY29tcHV0ZWQoIl9yb3V0aW5nLnRhcmdl
dFN0YXRlIixmdW5jdGlvbigpe3ZhciBlPWkuZ2V0KHRoaXMsIl9yb3V0aW5nIiksdD1pLmdldChl
LCJ0YXJnZXRTdGF0ZSIpO2lmKGkuZ2V0KGUsImN1cnJlbnRTdGF0ZSIpIT09dClyZXR1cm4hIXRo
aXMuX2NvbXB1dGVBY3RpdmUodCl9KSx0cmFuc2l0aW9uaW5nSW46by5jb21wdXRlZCgiYWN0aXZl
Iiwid2lsbEJlQWN0aXZlIixmdW5jdGlvbigpe3ZhciBlPWkuZ2V0KHRoaXMsIndpbGxCZUFjdGl2
ZSIpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZSYmKCFpLmdldCh0aGlzLCJhY3RpdmUiKSYm
ZSYmImVtYmVyLXRyYW5zaXRpb25pbmctaW4iKX0pLHRyYW5zaXRpb25pbmdPdXQ6by5jb21wdXRl
ZCgiYWN0aXZlIiwid2lsbEJlQWN0aXZlIixmdW5jdGlvbigpe3ZhciBlPWkuZ2V0KHRoaXMsIndp
bGxCZUFjdGl2ZSIpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgZSYmKGkuZ2V0KHRoaXMsImFj
dGl2ZSIpJiYhZSYmImVtYmVyLXRyYW5zaXRpb25pbmctb3V0Iil9KSxfaW52b2tlOmZ1bmN0aW9u
KGUpe2lmKCFzLmlzU2ltcGxlQ2xpY2soZSkpcmV0dXJuITA7dmFyIHQ9aS5nZXQodGhpcywicHJl
dmVudERlZmF1bHQiKSxuPWkuZ2V0KHRoaXMsInRhcmdldCIpO2lmKHQhPT0hMSYmKG4mJiJfc2Vs
ZiIhPT1ufHxlLnByZXZlbnREZWZhdWx0KCkpLGkuZ2V0KHRoaXMsImJ1YmJsZXMiKT09PSExJiZl
LnN0b3BQcm9wYWdhdGlvbigpLGkuZ2V0KHRoaXMsIl9pc0Rpc2FibGVkIikpcmV0dXJuITE7aWYo
aS5nZXQodGhpcywibG9hZGluZyIpKXJldHVybiByLmRlZmF1bHQud2FybigiVGhpcyBsaW5rLXRv
IGlzIGluIGFuIGluYWN0aXZlIGxvYWRpbmcgc3RhdGUgYmVjYXVzZSBhdCBsZWFzdCBvbmUgb2Yg
aXRzIHBhcmFtZXRlcnMgcHJlc2VudGx5IGhhcyBhIG51bGwvdW5kZWZpbmVkIHZhbHVlLCBvciB0
aGUgcHJvdmlkZWQgcm91dGUgbmFtZSBpcyBpbnZhbGlkLiIpLCExO2lmKG4mJiJfc2VsZiIhPT1u
KXJldHVybiExO3ZhciBvPWkuZ2V0KHRoaXMsIl9yb3V0aW5nIiksYT1pLmdldCh0aGlzLCJxdWFs
aWZpZWRSb3V0ZU5hbWUiKSx1PWkuZ2V0KHRoaXMsIm1vZGVscyIpLGw9aS5nZXQodGhpcywicXVl
cnlQYXJhbXMudmFsdWVzIiksYz1pLmdldCh0aGlzLCJyZXBsYWNlIik7by50cmFuc2l0aW9uVG8o
YSx1LGwsYyl9LHF1ZXJ5UGFyYW1zOm51bGwscXVhbGlmaWVkUm91dGVOYW1lOm8uY29tcHV0ZWQo
InRhcmdldFJvdXRlTmFtZSIsIl9yb3V0aW5nLmN1cnJlbnRTdGF0ZSIsZnVuY3Rpb24oKXt2YXIg
ZT1pLmdldCh0aGlzLCJwYXJhbXMiKS5zbGljZSgpLHQ9ZVtlLmxlbmd0aC0xXTt0JiZ0LmlzUXVl
cnlQYXJhbXMmJmUucG9wKCk7dmFyIHI9dGhpc1tkLkhBU19CTE9DS10/MD09PWUubGVuZ3RoOjE9
PT1lLmxlbmd0aDtyZXR1cm4gcj9pLmdldCh0aGlzLCJfcm91dGluZy5jdXJyZW50Um91dGVOYW1l
Iik6aS5nZXQodGhpcywidGFyZ2V0Um91dGVOYW1lIil9KSxyZXNvbHZlZFF1ZXJ5UGFyYW1zOm8u
Y29tcHV0ZWQoInF1ZXJ5UGFyYW1zIixmdW5jdGlvbigpe3ZhciBlPXt9LHQ9aS5nZXQodGhpcywi
cXVlcnlQYXJhbXMiKTtpZighdClyZXR1cm4gZTt2YXIgcj10LnZhbHVlcztmb3IodmFyIG4gaW4g
cilyLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT1yW25dKTtyZXR1cm4gZX0pLGhyZWY6by5jb21w
dXRlZCgibW9kZWxzIiwicXVhbGlmaWVkUm91dGVOYW1lIixmdW5jdGlvbigpe2lmKCJhIj09PWku
Z2V0KHRoaXMsInRhZ05hbWUiKSl7dmFyIGU9aS5nZXQodGhpcywicXVhbGlmaWVkUm91dGVOYW1l
IiksdD1pLmdldCh0aGlzLCJtb2RlbHMiKTtpZihpLmdldCh0aGlzLCJsb2FkaW5nIikpcmV0dXJu
IGkuZ2V0KHRoaXMsImxvYWRpbmdIcmVmIik7dmFyIHI9aS5nZXQodGhpcywiX3JvdXRpbmciKSxu
PWkuZ2V0KHRoaXMsInF1ZXJ5UGFyYW1zLnZhbHVlcyIpO3JldHVybiByLmdlbmVyYXRlVVJMKGUs
dCxuKX19KSxsb2FkaW5nOm8uY29tcHV0ZWQoIl9tb2RlbHNBcmVMb2FkZWQiLCJxdWFsaWZpZWRS
b3V0ZU5hbWUiLGZ1bmN0aW9uKCl7dmFyIGU9aS5nZXQodGhpcywicXVhbGlmaWVkUm91dGVOYW1l
IiksdD1pLmdldCh0aGlzLCJfbW9kZWxzQXJlTG9hZGVkIik7aWYoIXR8fG51bGw9PWUpcmV0dXJu
IGkuZ2V0KHRoaXMsImxvYWRpbmdDbGFzcyIpfSksX21vZGVsc0FyZUxvYWRlZDpvLmNvbXB1dGVk
KCJtb2RlbHMiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWkuZ2V0KHRoaXMsIm1vZGVscyIpLHQ9MCxy
PWUubGVuZ3RoO3Q8cjt0KyspaWYobnVsbD09ZVt0XSlyZXR1cm4hMTtyZXR1cm4hMH0pLF9nZXRN
b2RlbHM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoLTEscj1uZXcgQXJyYXkodCksbj0w
O248dDtuKyspe2Zvcih2YXIgaT1lW24rMV07Zi5kZWZhdWx0LmRldGVjdChpKTspaT1pLmdldCgi
bW9kZWwiKTtyW25dPWl9cmV0dXJuIHJ9LGxvYWRpbmdIcmVmOiIjIix3aWxsUmVuZGVyOmZ1bmN0
aW9uKCl7dmFyIGU9dm9pZCAwLHQ9aS5nZXQodGhpcywicGFyYW1zIikuc2xpY2UoKSxyPWkuZ2V0
KHRoaXMsImRpc2FibGVkV2hlbiIpO3ZvaWQgMCE9PXImJnRoaXMuc2V0KCJkaXNhYmxlZCIsciks
dGhpc1tkLkhBU19CTE9DS118fHRoaXMuc2V0KCJsaW5rVGl0bGUiLHQuc2hpZnQoKSksdGhpcy5z
ZXQoInRhcmdldFJvdXRlTmFtZSIsdFswXSk7dmFyIG49dFt0Lmxlbmd0aC0xXTtlPW4mJm4uaXNR
dWVyeVBhcmFtcz90LnBvcCgpOnt9LHRoaXMuc2V0KCJxdWVyeVBhcmFtcyIsZSksdC5sZW5ndGg+
MT90aGlzLnNldCgibW9kZWxzIix0aGlzLl9nZXRNb2RlbHModCkpOnRoaXMuc2V0KCJtb2RlbHMi
LFtdKX19KTt2LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxpbmtDb21wb25lbnQifSx2LnJl
b3BlbkNsYXNzKHtwb3NpdGlvbmFsUGFyYW1zOiJwYXJhbXMifSksZS5kZWZhdWx0PXZ9KSxlKCJl
bWJlci1yb3V0aW5nLXZpZXdzL2luZGV4IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwi
ZW1iZXItcm91dGluZy12aWV3cy9jb21wb25lbnRzL2xpbmstdG8iLCJlbWJlci1yb3V0aW5nLXZp
ZXdzL3ZpZXdzL291dGxldCJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijt0LmRlZmF1
bHQuTGlua0NvbXBvbmVudD1yLmRlZmF1bHQsdC5kZWZhdWx0Lk91dGxldFZpZXc9bi5PdXRsZXRW
aWV3LGUuZGVmYXVsdD10LmRlZmF1bHR9KSxlKCJlbWJlci1yb3V0aW5nLXZpZXdzL3ZpZXdzL291
dGxldCIsWyJleHBvcnRzIiwiZW1iZXItdmlld3Mvdmlld3MvdmlldyIsImVtYmVyLWh0bWxiYXJz
L3RlbXBsYXRlcy90b3AtbGV2ZWwtdmlldyJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7
dmFyIG49dC5kZWZhdWx0LmV4dGVuZCh7ZGVmYXVsdFRlbXBsYXRlOnIuZGVmYXVsdCxpbml0OmZ1
bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLl9vdXRsZXRzPVtdfSxzZXRPdXRsZXRTdGF0ZTpm
dW5jdGlvbihlKXt0aGlzLm91dGxldFN0YXRlPXttYWluOmV9LHRoaXMuZW52JiYodGhpcy5lbnYu
b3V0bGV0U3RhdGU9dGhpcy5vdXRsZXRTdGF0ZSksdGhpcy5sYXN0UmVzdWx0JiYodGhpcy5kaXJ0
eU91dGxldHMoKSx0aGlzLl9vdXRsZXRzPVtdLHRoaXMuc2NoZWR1bGVSZXZhbGlkYXRlKG51bGws
bnVsbCkpfSxkaXJ0eU91dGxldHM6ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX291dGxl
dHMubGVuZ3RoO2UrKyl0aGlzLl9vdXRsZXRzW2VdLmlzRGlydHk9ITB9fSk7ZS5Db3JlT3V0bGV0
Vmlldz1uO3ZhciBpPW4uZXh0ZW5kKHt0YWdOYW1lOiIifSk7ZS5PdXRsZXRWaWV3PWl9KSxlKCJl
bWJlci1yb3V0aW5nL2V4dC9jb250cm9sbGVyIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQiLCJlbWJlci1ydW50aW1lL21peGlucy9jb250cm9sbGVyIl0sZnVuY3Rpb24oZSx0
LHIpeyJ1c2Ugc3RyaWN0IjtyLmRlZmF1bHQucmVvcGVuKHtjb25jYXRlbmF0ZWRQcm9wZXJ0aWVz
OlsicXVlcnlQYXJhbXMiXSxxdWVyeVBhcmFtczpudWxsLF9xcERlbGVnYXRlOm51bGwsX3FwQ2hh
bmdlZDpmdW5jdGlvbihlLHIpe3ZhciBuPXIuc3Vic3RyKDAsci5sZW5ndGgtMyksaT1lLl9xcERl
bGVnYXRlLG89dC5nZXQoZSxuKTtpKG4sbyl9LHRyYW5zaXRpb25Ub1JvdXRlOmZ1bmN0aW9uKCl7
dmFyIGU9dC5nZXQodGhpcywidGFyZ2V0Iikscj1lLnRyYW5zaXRpb25Ub1JvdXRlfHxlLnRyYW5z
aXRpb25UbztyZXR1cm4gci5hcHBseShlLGFyZ3VtZW50cyl9LHJlcGxhY2VSb3V0ZTpmdW5jdGlv
bigpe3ZhciBlPXQuZ2V0KHRoaXMsInRhcmdldCIpLHI9ZS5yZXBsYWNlUm91dGV8fGUucmVwbGFj
ZVdpdGg7cmV0dXJuIHIuYXBwbHkoZSxhcmd1bWVudHMpfX0pLGUuZGVmYXVsdD1yLmRlZmF1bHR9
KSxlKCJlbWJlci1yb3V0aW5nL2V4dC9ydW5fbG9vcCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
cnVuX2xvb3AiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0LmRlZmF1bHQuX2FkZFF1ZXVl
KCJyb3V0ZXJUcmFuc2l0aW9ucyIsImFjdGlvbnMiKX0pLGUoImVtYmVyLXJvdXRpbmcvaW5kZXgi
LFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1yb3V0aW5nL2V4dC9ydW5fbG9v
cCIsImVtYmVyLXJvdXRpbmcvZXh0L2NvbnRyb2xsZXIiLCJlbWJlci1yb3V0aW5nL2xvY2F0aW9u
L2FwaSIsImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vbm9uZV9sb2NhdGlvbiIsImVtYmVyLXJvdXRp
bmcvbG9jYXRpb24vaGFzaF9sb2NhdGlvbiIsImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vaGlzdG9y
eV9sb2NhdGlvbiIsImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2NhdGlvbiIsImVtYmVy
LXJvdXRpbmcvc3lzdGVtL2dlbmVyYXRlX2NvbnRyb2xsZXIiLCJlbWJlci1yb3V0aW5nL3N5c3Rl
bS9jb250cm9sbGVyX2ZvciIsImVtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCIsImVtYmVyLXJvdXRp
bmcvc3lzdGVtL3JvdXRlciIsImVtYmVyLXJvdXRpbmcvc3lzdGVtL3JvdXRlIl0sZnVuY3Rpb24o
ZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwKXsidXNlIHN0cmljdCI7dC5kZWZhdWx0LkxvY2F0
aW9uPWkuZGVmYXVsdCx0LmRlZmF1bHQuQXV0b0xvY2F0aW9uPXUuZGVmYXVsdCx0LmRlZmF1bHQu
SGFzaExvY2F0aW9uPWEuZGVmYXVsdCx0LmRlZmF1bHQuSGlzdG9yeUxvY2F0aW9uPXMuZGVmYXVs
dCx0LmRlZmF1bHQuTm9uZUxvY2F0aW9uPW8uZGVmYXVsdCx0LmRlZmF1bHQuY29udHJvbGxlckZv
cj1jLmRlZmF1bHQsdC5kZWZhdWx0LmdlbmVyYXRlQ29udHJvbGxlckZhY3Rvcnk9bC5nZW5lcmF0
ZUNvbnRyb2xsZXJGYWN0b3J5LHQuZGVmYXVsdC5nZW5lcmF0ZUNvbnRyb2xsZXI9bC5kZWZhdWx0
LHQuZGVmYXVsdC5Sb3V0ZXJEU0w9Zi5kZWZhdWx0LHQuZGVmYXVsdC5Sb3V0ZXI9ZC5kZWZhdWx0
LHQuZGVmYXVsdC5Sb3V0ZT1wLmRlZmF1bHQsZS5kZWZhdWx0PXQuZGVmYXVsdH0pLGUoImVtYmVy
LXJvdXRpbmcvbG9jYXRpb24vYXBpIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVt
YmVyLW1ldGFsL2Vudmlyb25tZW50IiwiZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsIl0sZnVu
Y3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD17Y3JlYXRlOmZ1bmN0aW9uKGUp
e3ZhciB0PWUmJmUuaW1wbGVtZW50YXRpb24scj10aGlzLmltcGxlbWVudGF0aW9uc1t0XTtyZXR1
cm4gci5jcmVhdGUuYXBwbHkocixhcmd1bWVudHMpfSxpbXBsZW1lbnRhdGlvbnM6e30sX2xvY2F0
aW9uOnIuZGVmYXVsdC5sb2NhdGlvbixfZ2V0SGFzaDpmdW5jdGlvbigpe3JldHVybiBuLmdldEhh
c2godGhpcy5sb2NhdGlvbil9fX0pLGUoImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2Nh
dGlvbiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9wcm9wZXJ0
eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC91dGlscyIsImNv
bnRhaW5lci9vd25lciIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCIsImVtYmVyLW1ldGFs
L2Vudmlyb25tZW50IiwiZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsIl0sZnVuY3Rpb24oZSx0
LHIsbixpLG8sYSxzLHUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKGUpe3JldHVybiBmdW5jdGlv
bigpe2Zvcih2YXIgdD1yLmdldCh0aGlzLCJjb25jcmV0ZUltcGxlbWVudGF0aW9uIiksbj1hcmd1
bWVudHMubGVuZ3RoLG89QXJyYXkobiksYT0wO2E8bjthKyspb1thXT1hcmd1bWVudHNbYV07cmV0
dXJuIGkudHJ5SW52b2tlKHQsZSxvKX19ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmxvY2F0aW9uLHI9
ZS51c2VyQWdlbnQsbj1lLmhpc3RvcnksaT1lLmRvY3VtZW50TW9kZSxvPWUuZ2xvYmFsLGE9ZS5y
b290VVJMLHM9Im5vbmUiLGw9ITEsYz11LmdldEZ1bGxQYXRoKHQpO2lmKHUuc3VwcG9ydHNIaXN0
b3J5KHIsbikpe3ZhciBwPWYoYSx0KTtpZihjPT09cClyZXR1cm4iaGlzdG9yeSI7Ii8jIj09PWMu
c3Vic3RyKDAsMik/KG4ucmVwbGFjZVN0YXRlKHtwYXRoOnB9LG51bGwscCkscz0iaGlzdG9yeSIp
OihsPSEwLHUucmVwbGFjZVBhdGgodCxwKSl9ZWxzZSBpZih1LnN1cHBvcnRzSGFzaENoYW5nZShp
LG8pKXt2YXIgaD1kKGEsdCk7Yz09PWh8fCIvIj09PWMmJiIvIy8iPT09aD9zPSJoYXNoIjoobD0h
MCx1LnJlcGxhY2VQYXRoKHQsaCkpfXJldHVybiFsJiZzfWZ1bmN0aW9uIGYoZSx0KXt2YXIgcixu
LGk9dS5nZXRQYXRoKHQpLG89dS5nZXRIYXNoKHQpLGE9dS5nZXRRdWVyeSh0KTtpLmluZGV4T2Yo
ZSk7cmV0dXJuIiMvIj09PW8uc3Vic3RyKDAsMik/KG49by5zdWJzdHIoMSkuc3BsaXQoIiMiKSxy
PW4uc2hpZnQoKSwiLyI9PT1pLnNsaWNlKC0xKSYmKHI9ci5zdWJzdHIoMSkpLGk9aStyK2Esbi5s
ZW5ndGgmJihpKz0iIyIrbi5qb2luKCIjIikpKTppPWkrYStvLGl9ZnVuY3Rpb24gZChlLHQpe3Zh
ciByPWUsbj1mKGUsdCksaT1uLnN1YnN0cihlLmxlbmd0aCk7cmV0dXJuIiIhPT1pJiYoIi8iIT09
aS5jaGFyQXQoMCkmJihpPSIvIitpKSxyKz0iIyIraSkscn1lLmdldEhpc3RvcnlQYXRoPWYsZS5n
ZXRIYXNoUGF0aD1kLGUuZGVmYXVsdD1hLmRlZmF1bHQuZXh0ZW5kKHtsb2NhdGlvbjpzLmRlZmF1
bHQubG9jYXRpb24saGlzdG9yeTpzLmRlZmF1bHQuaGlzdG9yeSxnbG9iYWw6cy5kZWZhdWx0Lmds
b2JhbCx1c2VyQWdlbnQ6cy5kZWZhdWx0LnVzZXJBZ2VudCxjYW5jZWxSb3V0ZXJTZXR1cDohMSxy
b290VVJMOiIvIixkZXRlY3Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJvb3RVUkwsdD1jKHtsb2Nh
dGlvbjp0aGlzLmxvY2F0aW9uLGhpc3Rvcnk6dGhpcy5oaXN0b3J5LHVzZXJBZ2VudDp0aGlzLnVz
ZXJBZ2VudCxyb290VVJMOmUsZG9jdW1lbnRNb2RlOnRoaXMuZG9jdW1lbnRNb2RlLGdsb2JhbDp0
aGlzLmdsb2JhbH0pO3Q9PT0hMSYmKG4uc2V0KHRoaXMsImNhbmNlbFJvdXRlclNldHVwIiwhMCks
dD0ibm9uZSIpO3ZhciByPW8uZ2V0T3duZXIodGhpcykubG9va3VwKCJsb2NhdGlvbjoiK3QpO24u
c2V0KHIsInJvb3RVUkwiLGUpLG4uc2V0KHRoaXMsImNvbmNyZXRlSW1wbGVtZW50YXRpb24iLHIp
fSxpbml0U3RhdGU6bCgiaW5pdFN0YXRlIiksZ2V0VVJMOmwoImdldFVSTCIpLHNldFVSTDpsKCJz
ZXRVUkwiKSxyZXBsYWNlVVJMOmwoInJlcGxhY2VVUkwiKSxvblVwZGF0ZVVSTDpsKCJvblVwZGF0
ZVVSTCIpLGZvcm1hdFVSTDpsKCJmb3JtYXRVUkwiKSx3aWxsRGVzdHJveTpmdW5jdGlvbigpe3Zh
ciBlPXIuZ2V0KHRoaXMsImNvbmNyZXRlSW1wbGVtZW50YXRpb24iKTtlJiZlLmRlc3Ryb3koKX19
KX0pLGUoImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vaGFzaF9sb2NhdGlvbiIsWyJleHBvcnRzIiwi
ZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1i
ZXItbWV0YWwvcnVuX2xvb3AiLCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLXJ1bnRpbWUvc3lz
dGVtL29iamVjdCIsImVtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXBpIiwiZW1iZXItdmlld3Mvc3lz
dGVtL2pxdWVyeSJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyl7InVzZSBzdHJpY3QiO2UuZGVm
YXVsdD1vLmRlZmF1bHQuZXh0ZW5kKHtpbXBsZW1lbnRhdGlvbjoiaGFzaCIsaW5pdDpmdW5jdGlv
bigpe3Iuc2V0KHRoaXMsImxvY2F0aW9uIix0LmdldCh0aGlzLCJfbG9jYXRpb24iKXx8d2luZG93
LmxvY2F0aW9uKX0sZ2V0SGFzaDphLmRlZmF1bHQuX2dldEhhc2gsZ2V0VVJMOmZ1bmN0aW9uKCl7
dmFyIGU9dGhpcy5nZXRIYXNoKCkuc3Vic3RyKDEpLHQ9ZTtyZXR1cm4iLyIhPT10LmNoYXJBdCgw
KSYmKHQ9Ii8iLGUmJih0Kz0iIyIrZSkpLHR9LHNldFVSTDpmdW5jdGlvbihlKXt0LmdldCh0aGlz
LCJsb2NhdGlvbiIpLmhhc2g9ZSxyLnNldCh0aGlzLCJsYXN0U2V0VVJMIixlKX0scmVwbGFjZVVS
TDpmdW5jdGlvbihlKXt0LmdldCh0aGlzLCJsb2NhdGlvbiIpLnJlcGxhY2UoIiMiK2UpLHIuc2V0
KHRoaXMsImxhc3RTZXRVUkwiLGUpfSxvblVwZGF0ZVVSTDpmdW5jdGlvbihlKXt2YXIgbz10aGlz
LGE9aS5ndWlkRm9yKHRoaXMpO3MuZGVmYXVsdCh3aW5kb3cpLm9uKCJoYXNoY2hhbmdlLmVtYmVy
LWxvY2F0aW9uLSIrYSxmdW5jdGlvbigpe24uZGVmYXVsdChmdW5jdGlvbigpe3ZhciBuPW8uZ2V0
VVJMKCk7dC5nZXQobywibGFzdFNldFVSTCIpIT09biYmKHIuc2V0KG8sImxhc3RTZXRVUkwiLG51
bGwpLGUobikpfSl9KX0sZm9ybWF0VVJMOmZ1bmN0aW9uKGUpe3JldHVybiIjIitlfSx3aWxsRGVz
dHJveTpmdW5jdGlvbigpe3ZhciBlPWkuZ3VpZEZvcih0aGlzKTtzLmRlZmF1bHQod2luZG93KS5v
ZmYoImhhc2hjaGFuZ2UuZW1iZXItbG9jYXRpb24tIitlKX19KX0pLGUoImVtYmVyLXJvdXRpbmcv
bG9jYXRpb24vaGlzdG9yeV9sb2NhdGlvbiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwvdXRpbHMiLCJl
bWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QiLCJlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2FwaSIs
ImVtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnkiXSxmdW5jdGlvbihlLHQscixuLGksbyxhKXsidXNl
IHN0cmljdCI7dmFyIHM9ITE7ZS5kZWZhdWx0PWkuZGVmYXVsdC5leHRlbmQoe2ltcGxlbWVudGF0
aW9uOiJoaXN0b3J5Iixpbml0OmZ1bmN0aW9uKCl7ci5zZXQodGhpcywibG9jYXRpb24iLHQuZ2V0
KHRoaXMsImxvY2F0aW9uIil8fHdpbmRvdy5sb2NhdGlvbiksci5zZXQodGhpcywiYmFzZVVSTCIs
YS5kZWZhdWx0KCJiYXNlIikuYXR0cigiaHJlZiIpfHwiIil9LGluaXRTdGF0ZTpmdW5jdGlvbigp
e3ZhciBlPXQuZ2V0KHRoaXMsImhpc3RvcnkiKXx8d2luZG93Lmhpc3Rvcnk7ci5zZXQodGhpcywi
aGlzdG9yeSIsZSksZSYmInN0YXRlImluIGUmJih0aGlzLnN1cHBvcnRzSGlzdG9yeT0hMCksdGhp
cy5yZXBsYWNlU3RhdGUodGhpcy5mb3JtYXRVUkwodGhpcy5nZXRVUkwoKSkpfSxyb290VVJMOiIv
IixnZXRVUkw6ZnVuY3Rpb24oKXt2YXIgZT10LmdldCh0aGlzLCJsb2NhdGlvbiIpLHI9ZS5wYXRo
bmFtZSxuPXQuZ2V0KHRoaXMsInJvb3RVUkwiKSxpPXQuZ2V0KHRoaXMsImJhc2VVUkwiKTtuPW4u
cmVwbGFjZSgvXC8kLywiIiksaT1pLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciBvPXIucmVwbGFjZShu
ZXcgUmVnRXhwKCJeIitpKyIoPz0vfCQpIiksIiIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiXiIrbisi
KD89L3wkKSIpLCIiKSxhPWUuc2VhcmNofHwiIjtyZXR1cm4gbys9YSxvKz10aGlzLmdldEhhc2go
KX0sc2V0VVJMOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U3RhdGUoKTtlPXRoaXMuZm9ybWF0
VVJMKGUpLHQmJnQucGF0aD09PWV8fHRoaXMucHVzaFN0YXRlKGUpfSxyZXBsYWNlVVJMOmZ1bmN0
aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U3RhdGUoKTtlPXRoaXMuZm9ybWF0VVJMKGUpLHQmJnQucGF0
aD09PWV8fHRoaXMucmVwbGFjZVN0YXRlKGUpfSxnZXRTdGF0ZTpmdW5jdGlvbigpe3JldHVybiB0
aGlzLnN1cHBvcnRzSGlzdG9yeT90LmdldCh0aGlzLCJoaXN0b3J5Iikuc3RhdGU6dGhpcy5faGlz
dG9yeVN0YXRlfSxwdXNoU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHI9e3BhdGg6ZX07dC5nZXQodGhp
cywiaGlzdG9yeSIpLnB1c2hTdGF0ZShyLG51bGwsZSksdGhpcy5faGlzdG9yeVN0YXRlPXIsdGhp
cy5fcHJldmlvdXNVUkw9dGhpcy5nZXRVUkwoKX0scmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUpe3Zh
ciByPXtwYXRoOmV9O3QuZ2V0KHRoaXMsImhpc3RvcnkiKS5yZXBsYWNlU3RhdGUocixudWxsLGUp
LHRoaXMuX2hpc3RvcnlTdGF0ZT1yLHRoaXMuX3ByZXZpb3VzVVJMPXRoaXMuZ2V0VVJMKCl9LG9u
VXBkYXRlVVJMOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1uLmd1aWRGb3IodGhpcyk7YS5kZWZh
dWx0KHdpbmRvdykub24oInBvcHN0YXRlLmVtYmVyLWxvY2F0aW9uLSIrcixmdW5jdGlvbihyKXso
c3x8KHM9ITAsdC5nZXRVUkwoKSE9PXQuX3ByZXZpb3VzVVJMKSkmJmUodC5nZXRVUkwoKSl9KX0s
Zm9ybWF0VVJMOmZ1bmN0aW9uKGUpe3ZhciByPXQuZ2V0KHRoaXMsInJvb3RVUkwiKSxuPXQuZ2V0
KHRoaXMsImJhc2VVUkwiKTtyZXR1cm4iIiE9PWU/KHI9ci5yZXBsYWNlKC9cLyQvLCIiKSxuPW4u
cmVwbGFjZSgvXC8kLywiIikpOm4ubWF0Y2goL15cLy8pJiZyLm1hdGNoKC9eXC8vKSYmKG49bi5y
ZXBsYWNlKC9cLyQvLCIiKSksbityK2V9LHdpbGxEZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9bi5n
dWlkRm9yKHRoaXMpO2EuZGVmYXVsdCh3aW5kb3cpLm9mZigicG9wc3RhdGUuZW1iZXItbG9jYXRp
b24tIitlKX0sZ2V0SGFzaDpvLmRlZmF1bHQuX2dldEhhc2h9KX0pLGUoImVtYmVyLXJvdXRpbmcv
bG9jYXRpb24vbm9uZV9sb2NhdGlvbiIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJl
bWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJl
ci1ydW50aW1lL3N5c3RlbS9vYmplY3QiXSxmdW5jdGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0
IjtlLmRlZmF1bHQ9aS5kZWZhdWx0LmV4dGVuZCh7aW1wbGVtZW50YXRpb246Im5vbmUiLHBhdGg6
IiIsZGV0ZWN0OmZ1bmN0aW9uKCl7dGhpcy5yb290VVJMfSxyb290VVJMOiIvIixnZXRVUkw6ZnVu
Y3Rpb24oKXt2YXIgZT1yLmdldCh0aGlzLCJwYXRoIiksdD1yLmdldCh0aGlzLCJyb290VVJMIik7
cmV0dXJuIHQ9dC5yZXBsYWNlKC9cLyQvLCIiKSxlLnJlcGxhY2UobmV3IFJlZ0V4cCgiXiIrdCsi
KD89L3wkKSIpLCIiKX0sc2V0VVJMOmZ1bmN0aW9uKGUpe24uc2V0KHRoaXMsInBhdGgiLGUpfSxv
blVwZGF0ZVVSTDpmdW5jdGlvbihlKXt0aGlzLnVwZGF0ZUNhbGxiYWNrPWV9LGhhbmRsZVVSTDpm
dW5jdGlvbihlKXtuLnNldCh0aGlzLCJwYXRoIixlKSx0aGlzLnVwZGF0ZUNhbGxiYWNrKGUpfSxm
b3JtYXRVUkw6ZnVuY3Rpb24oZSl7dmFyIHQ9ci5nZXQodGhpcywicm9vdFVSTCIpO3JldHVybiIi
IT09ZSYmKHQ9dC5yZXBsYWNlKC9cLyQvLCIiKSksdCtlfX0pfSksZSgiZW1iZXItcm91dGluZy9s
b2NhdGlvbi91dGlsIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gdChlKXt2YXIgdD1lLnBhdGhuYW1lO3JldHVybiIvIiE9PXQuY2hhckF0KDApJiYodD0iLyIr
dCksdH1mdW5jdGlvbiByKGUpe3JldHVybiBlLnNlYXJjaH1mdW5jdGlvbiBuKGUpe3ZhciB0PWUu
aHJlZixyPXQuaW5kZXhPZigiIyIpO3JldHVybiByPT09LTE/IiI6dC5zdWJzdHIocil9ZnVuY3Rp
b24gaShlKXtyZXR1cm4gdChlKStyKGUpK24oZSl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1lLm9yaWdp
bjtyZXR1cm4gdHx8KHQ9ZS5wcm90b2NvbCsiLy8iK2UuaG9zdG5hbWUsZS5wb3J0JiYodCs9Ijoi
K2UucG9ydCkpLHR9ZnVuY3Rpb24gYShlLHQpe3JldHVybiJvbmhhc2hjaGFuZ2UiaW4gdCYmKHZv
aWQgMD09PWV8fGU+Nyl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybihlLmluZGV4T2YoIkFuZHJvaWQg
Mi4iKT09PS0xJiZlLmluZGV4T2YoIkFuZHJvaWQgNC4wIik9PT0tMXx8ZS5pbmRleE9mKCJNb2Jp
bGUgU2FmYXJpIik9PT0tMXx8ZS5pbmRleE9mKCJDaHJvbWUiKSE9PS0xfHxlLmluZGV4T2YoIldp
bmRvd3MgUGhvbmUiKSE9PS0xKSYmISEodCYmInB1c2hTdGF0ZSJpbiB0KX1mdW5jdGlvbiB1KGUs
dCl7ZS5yZXBsYWNlKG8oZSkrdCl9ZS5nZXRQYXRoPXQsZS5nZXRRdWVyeT1yLGUuZ2V0SGFzaD1u
LGUuZ2V0RnVsbFBhdGg9aSxlLmdldE9yaWdpbj1vLGUuc3VwcG9ydHNIYXNoQ2hhbmdlPWEsZS5z
dXBwb3J0c0hpc3Rvcnk9cyxlLnJlcGxhY2VQYXRoPXV9KSxlKCJlbWJlci1yb3V0aW5nL3NlcnZp
Y2VzL3JvdXRpbmciLFsiZXhwb3J0cyIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL3NlcnZpY2UiLCJl
bWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9jb21wdXRlZF9tYWNyb3MiLCJl
bWJlci1yb3V0aW5nL3V0aWxzIiwiZW1iZXItbWV0YWwvYXNzaWduIl0sZnVuY3Rpb24oZSx0LHIs
bixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCl7Zm9yKHZhciByPTAsbj0wLGk9dC5s
ZW5ndGg7bjxpJiYocis9dFtuXS5uYW1lcy5sZW5ndGgsdFtuXS5oYW5kbGVyIT09ZSk7bisrKTty
ZXR1cm4gcn1lLmRlZmF1bHQ9dC5kZWZhdWx0LmV4dGVuZCh7cm91dGVyOm51bGwsdGFyZ2V0U3Rh
dGU6bi5yZWFkT25seSgicm91dGVyLnRhcmdldFN0YXRlIiksY3VycmVudFN0YXRlOm4ucmVhZE9u
bHkoInJvdXRlci5jdXJyZW50U3RhdGUiKSxjdXJyZW50Um91dGVOYW1lOm4ucmVhZE9ubHkoInJv
dXRlci5jdXJyZW50Um91dGVOYW1lIiksY3VycmVudFBhdGg6bi5yZWFkT25seSgicm91dGVyLmN1
cnJlbnRQYXRoIiksYXZhaWxhYmxlUm91dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlz
KHIuZ2V0KHRoaXMsInJvdXRlciIpLnJvdXRlci5yZWNvZ25pemVyLm5hbWVzKX0saGFzUm91dGU6
ZnVuY3Rpb24oZSl7cmV0dXJuIHIuZ2V0KHRoaXMsInJvdXRlciIpLmhhc1JvdXRlKGUpfSx0cmFu
c2l0aW9uVG86ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG89ci5nZXQodGhpcywicm91dGVyIiksYT1v
Ll9kb1RyYW5zaXRpb24oZSx0LG4pO2kmJmEubWV0aG9kKCJyZXBsYWNlIil9LG5vcm1hbGl6ZVF1
ZXJ5UGFyYW1zOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yLmdldCh0aGlzLCJyb3V0ZXIiKTtpLl9w
cmVwYXJlUXVlcnlQYXJhbXMoZSx0LG4pfSxnZW5lcmF0ZVVSTDpmdW5jdGlvbihlLHQsbil7dmFy
IGE9ci5nZXQodGhpcywicm91dGVyIik7aWYoYS5yb3V0ZXIpe3ZhciBzPXt9O28uZGVmYXVsdChz
LG4pLHRoaXMubm9ybWFsaXplUXVlcnlQYXJhbXMoZSx0LHMpO3ZhciB1PWkucm91dGVBcmdzKGUs
dCxzKTtyZXR1cm4gYS5nZW5lcmF0ZS5hcHBseShhLHUpfX0saXNBY3RpdmVGb3JSb3V0ZTpmdW5j
dGlvbihlLHQsbixpLG8pe3ZhciBzPXIuZ2V0KHRoaXMsInJvdXRlciIpLHU9cy5yb3V0ZXIucmVj
b2duaXplci5oYW5kbGVyc0ZvcihuKSxsPXVbdS5sZW5ndGgtMV0uaGFuZGxlcixjPWEobix1KTty
ZXR1cm4gZS5sZW5ndGg+YyYmKG49bCksaS5pc0FjdGl2ZUludGVudChuLGUsdCwhbyl9fSl9KSxl
KCJlbWJlci1yb3V0aW5nL3N5c3RlbS9jYWNoZSIsWyJleHBvcnRzIiwiZW1iZXItcnVudGltZS9z
eXN0ZW0vb2JqZWN0Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PXQuZGVm
YXVsdC5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPXt9fSxoYXM6ZnVuY3Rpb24o
ZSl7cmV0dXJuIGUgaW4gdGhpcy5jYWNoZX0sc3Rhc2g6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRo
aXMuY2FjaGVbZV07bnx8KG49dGhpcy5jYWNoZVtlXT17fSksblt0XT1yfSxsb29rdXA6ZnVuY3Rp
b24oZSx0LHIpe3ZhciBuPXRoaXMuY2FjaGU7aWYoIShlIGluIG4pKXJldHVybiByO3ZhciBpPW5b
ZV07cmV0dXJuIHQgaW4gaT9pW3RdOnJ9LGNhY2hlOm51bGx9KX0pLGUoImVtYmVyLXJvdXRpbmcv
c3lzdGVtL2NvbnRyb2xsZXJfZm9yIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gdChlLHQscil7cmV0dXJuIGUubG9va3VwKCJjb250cm9sbGVyOiIrdCxyKX1l
LmRlZmF1bHQ9dH0pLGUoImVtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCIsWyJleHBvcnRzIiwiZW1i
ZXItbWV0YWwvZGVidWciXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUs
dCl7dGhpcy5wYXJlbnQ9ZSx0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0ZXM9dCYmdC5lbmFibGVM
b2FkaW5nU3Vic3RhdGVzLHRoaXMubWF0Y2hlcz1bXSx0aGlzLmV4cGxpY2l0SW5kZXg9dm9pZCAw
LHRoaXMub3B0aW9ucz10fWZ1bmN0aW9uIG4oZSl7cmV0dXJuIGUucGFyZW50JiYiYXBwbGljYXRp
b24iIT09ZS5wYXJlbnR9ZnVuY3Rpb24gaShlLHQscil7cmV0dXJuIG4oZSkmJnIhPT0hMD9lLnBh
cmVudCsiLiIrdDp0fWZ1bmN0aW9uIG8oZSx0LHIsbil7cj1yfHx7fTt2YXIgbz1pKGUsdCxyLnJl
c2V0TmFtZXNwYWNlKTsic3RyaW5nIiE9dHlwZW9mIHIucGF0aCYmKHIucGF0aD0iLyIrdCksZS5w
dXNoKHIucGF0aCxvLG4pfWUuZGVmYXVsdD1yLHIucHJvdG90eXBlPXtyb3V0ZTpmdW5jdGlvbihl
LHQsbil7dmFyIGE9Ii9fdW51c2VkX2R1bW15X2Vycm9yX3BhdGhfcm91dGVfIitlKyIvOmVycm9y
IjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD17
fSksMT09PWFyZ3VtZW50cy5sZW5ndGgmJih0PXt9KSx0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0
ZXMmJihvKHRoaXMsZSsiX2xvYWRpbmciLHtyZXNldE5hbWVzcGFjZTp0LnJlc2V0TmFtZXNwYWNl
fSksbyh0aGlzLGUrIl9lcnJvciIse3BhdGg6YX0pKSxuKXt2YXIgcz1pKHRoaXMsZSx0LnJlc2V0
TmFtZXNwYWNlKSx1PW5ldyByKHMsdGhpcy5vcHRpb25zKTtvKHUsImxvYWRpbmciKSxvKHUsImVy
cm9yIix7cGF0aDphfSksbi5jYWxsKHUpLG8odGhpcyxlLHQsdS5nZW5lcmF0ZSgpKX1lbHNlIG8o
dGhpcyxlLHQpfSxwdXNoOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10LnNwbGl0KCIuIik7IiIhPT1l
JiYiLyIhPT1lJiYiaW5kZXgiIT09bltuLmxlbmd0aC0xXXx8KHRoaXMuZXhwbGljaXRJbmRleD0h
MCksdGhpcy5tYXRjaGVzLnB1c2goW2UsdCxyXSl9LHJlc291cmNlOmZ1bmN0aW9uKGUsdCxyKXsy
PT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQsdD17fSksMT09
PWFyZ3VtZW50cy5sZW5ndGgmJih0PXt9KSx0LnJlc2V0TmFtZXNwYWNlPSEwLHRoaXMucm91dGUo
ZSx0LHIpfSxnZW5lcmF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWF0Y2hlcztyZXR1cm4gdGhp
cy5leHBsaWNpdEluZGV4fHx0aGlzLnJvdXRlKCJpbmRleCIse3BhdGg6Ii8ifSksZnVuY3Rpb24o
dCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO3QoaVswXSkudG8o
aVsxXSxpWzJdKX19fX0sci5tYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHI7cmV0dXJuIGUuY2Fs
bCh0KSx0fX0pLGUoImVtYmVyLXJvdXRpbmcvc3lzdGVtL2dlbmVyYXRlX2NvbnRyb2xsZXIiLFsi
ZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0Il0s
ZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCxyKXt2YXIgbixpO3Jl
dHVybiBuPWUuX2xvb2t1cEZhY3RvcnkoImNvbnRyb2xsZXI6YmFzaWMiKS5leHRlbmQoe2lzR2Vu
ZXJhdGVkOiEwLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIihnZW5lcmF0ZWQgIit0KyIgY29u
dHJvbGxlcikifX0pLGk9ImNvbnRyb2xsZXI6Iit0LGUucmVnaXN0ZXIoaSxuKSxufWZ1bmN0aW9u
IGkoZSx0LGkpe24oZSx0LGkpO3ZhciBvPSJjb250cm9sbGVyOiIrdCxhPWUubG9va3VwKG8pO3Jl
dHVybiByLmdldChhLCJuYW1lc3BhY2UuTE9HX0FDVElWRV9HRU5FUkFUSU9OIiksYX1lLmdlbmVy
YXRlQ29udHJvbGxlckZhY3Rvcnk9bixlLmRlZmF1bHQ9aX0pLGUoImVtYmVyLXJvdXRpbmcvc3lz
dGVtL3F1ZXJ5X3BhcmFtcyIsWyJleHBvcnRzIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0
Il0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PXQuZGVmYXVsdC5leHRlbmQo
e2lzUXVlcnlQYXJhbXM6ITAsdmFsdWVzOm51bGx9KX0pO2UoImVtYmVyLXJvdXRpbmcvc3lzdGVt
L3JvdXRlIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWci
LCJlbWJlci1tZXRhbC9mZWF0dXJlcyIsImVtYmVyLW1ldGFsL2Vycm9yIiwiZW1iZXItbWV0YWwv
cHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwvZ2V0
X3Byb3BlcnRpZXMiLCJlbWJlci1tZXRhbC9pc19ub25lIiwiZW1iZXItbWV0YWwvY29tcHV0ZWQi
LCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1ydW50aW1lL3V0aWxzIiwiZW1iZXItbWV0YWwv
cnVuX2xvb3AiLCJlbWJlci1ydW50aW1lL2NvcHkiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJp
bmciLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9u
YXRpdmVfYXJyYXkiLCJlbWJlci1ydW50aW1lL21peGlucy9ldmVudGVkIiwiZW1iZXItcnVudGlt
ZS9taXhpbnMvYWN0aW9uX2hhbmRsZXIiLCJlbWJlci1yb3V0aW5nL3N5c3RlbS9nZW5lcmF0ZV9j
b250cm9sbGVyIiwiZW1iZXItcm91dGluZy91dGlscyIsImNvbnRhaW5lci9vd25lciIsImVtYmVy
LW1ldGFsL2lzX2VtcHR5Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwLGgs
bSx2LGIsZyx5LF8sdyx4KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaygpe3JldHVybiB0aGlzfWZ1
bmN0aW9uIEMoZSl7dmFyIHQ9RShlLGUucm91dGVyLnJvdXRlci5zdGF0ZS5oYW5kbGVySW5mb3Ms
LTEpO3JldHVybiB0JiZ0LmhhbmRsZXJ9ZnVuY3Rpb24gRShlLHQscil7aWYodClmb3IodmFyIG4s
aT1yfHwwLG89MCxhPXQubGVuZ3RoO288YTtvKyspaWYobj10W29dLmhhbmRsZXIsbj09PWUpcmV0
dXJuIHRbbytpXX1mdW5jdGlvbiBPKGUsdCxyLG4sYSl7dmFyIHMsdSxsLGMsZj1hJiZhLmNvbnRy
b2xsZXIsZD1vLmdldChlLnJvdXRlciwibmFtZXNwYWNlLkxPR19WSUVXX0xPT0tVUFMiKSxwPWEm
JmEuaW50byYmYS5pbnRvLnJlcGxhY2UoL1wvL2csIi4iKSxoPWEmJmEub3V0bGV0fHwibWFpbiIs
bT13LmdldE93bmVyKGUpO2lmKG4/KG49bi5yZXBsYWNlKC9cLy9nLCIuIikscz1uKToobj1lLnJv
dXRlTmFtZSxzPWUudGVtcGxhdGVOYW1lfHxuKSxmfHwoZj10P20ubG9va3VwKCJjb250cm9sbGVy
OiIrbil8fGUuY29udHJvbGxlck5hbWV8fGUucm91dGVOYW1lOmUuY29udHJvbGxlck5hbWV8fG0u
bG9va3VwKCJjb250cm9sbGVyOiIrbikpLCJzdHJpbmciPT10eXBlb2YgZil7dmFyIHY9ZjtpZihm
PW0ubG9va3VwKCJjb250cm9sbGVyOiIrdiksIWYpdGhyb3cgbmV3IGkuZGVmYXVsdCgiWW91IHBh
c3NlZCBgY29udHJvbGxlcjogJyIrdisiJ2AgaW50byB0aGUgYHJlbmRlcmAgbWV0aG9kLCBidXQg
bm8gc3VjaCBjb250cm9sbGVyIGNvdWxkIGJlIGZvdW5kLiIpfWlmKGEmJk9iamVjdC5rZXlzKGEp
LmluZGV4T2YoIm91dGxldCIpIT09LTEmJiJ1bmRlZmluZWQiPT10eXBlb2YgYS5vdXRsZXQpdGhy
b3cgbmV3IGkuZGVmYXVsdCgiWW91IHBhc3NlZCB1bmRlZmluZWQgYXMgdGhlIG91dGxldCBuYW1l
LiIpO2EmJmEubW9kZWwmJmYuc2V0KCJtb2RlbCIsYS5tb2RlbCksdT1hJiZhLnZpZXd8fHQmJm58
fGUudmlld05hbWV8fG4sbD1tLl9sb29rdXBGYWN0b3J5KCJ2aWV3OiIrdSksYz1tLmxvb2t1cCgi
dGVtcGxhdGU6IitzKTt2YXIgYjtwJiYoYj1DKGUpKSYmcD09PUMoZSkucm91dGVOYW1lJiYocD12
b2lkIDApO3ZhciBnPXtvd25lcjptLGludG86cCxvdXRsZXQ6aCxuYW1lOm4sY29udHJvbGxlcjpm
LFZpZXdDbGFzczpsLHRlbXBsYXRlOmN8fGUuX3RvcExldmVsVmlld1RlbXBsYXRlfSx5PXZvaWQg
MDtpZighbCYmIWMmJiF5JiZkKTtyZXR1cm4gZ31mdW5jdGlvbiBUKGUsdCl7aWYodC5mdWxsUXVl
cnlQYXJhbXMpcmV0dXJuIHQuZnVsbFF1ZXJ5UGFyYW1zO3QuZnVsbFF1ZXJ5UGFyYW1zPXt9LGMu
ZGVmYXVsdCh0LmZ1bGxRdWVyeVBhcmFtcyx0LnF1ZXJ5UGFyYW1zKTt2YXIgcj10LmhhbmRsZXJJ
bmZvc1t0LmhhbmRsZXJJbmZvcy5sZW5ndGgtMV0ubmFtZTtyZXR1cm4gZS5fZGVzZXJpYWxpemVR
dWVyeVBhcmFtcyhyLHQuZnVsbFF1ZXJ5UGFyYW1zKSx0LmZ1bGxRdWVyeVBhcmFtc31mdW5jdGlv
biBOKGUsdCl7dC5xdWVyeVBhcmFtc0Zvcj10LnF1ZXJ5UGFyYW1zRm9yfHx7fTt2YXIgcj1lLnJv
dXRlTmFtZTtpZih0LnF1ZXJ5UGFyYW1zRm9yW3JdKXJldHVybiB0LnF1ZXJ5UGFyYW1zRm9yW3Jd
O2Zvcih2YXIgbj1UKGUucm91dGVyLHQpLGk9dC5xdWVyeVBhcmFtc0ZvcltyXT17fSxhPW8uZ2V0
KGUsIl9xcCIpLHM9YS5xcHMsdT0wLGw9cy5sZW5ndGg7dTxsOysrdSl7dmFyIGM9c1t1XSxmPWMu
cHJvcCBpbiBuO2lbYy5wcm9wXT1mP25bYy5wcm9wXTpTKGMuZGVmYXVsdFZhbHVlKX1yZXR1cm4g
aX1mdW5jdGlvbiBTKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3YuQShlLnNsaWNlKCkpOmV9
ZnVuY3Rpb24gQShlLHQpe3ZhciByLG49e307cj17ZGVmYXVsdFZhbHVlOiEwLHR5cGU6ITAsc2Nv
cGU6ITAsYXM6ITB9O2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBv
PXt9O2MuZGVmYXVsdChvLGVbaV0pLGMuZGVmYXVsdChvLHRbaV0pLG5baV09byxyW2ldPSEwfWZv
cih2YXIgYSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoYSkmJiFyW2FdKXt2YXIgcz17fTtjLmRl
ZmF1bHQocyx0W2FdLGVbYV0pLG5bYV09c31yZXR1cm4gbn1mdW5jdGlvbiBQKGUsdCl7dC5mb3JF
YWNoKGZ1bmN0aW9uKHQpe2UuYWRkT2JzZXJ2ZXIodCsiLltdIixlLGUuX3FwQ2hhbmdlZCl9KX12
YXIgaj1BcnJheS5wcm90b3R5cGUuc2xpY2UsUj1tLmRlZmF1bHQuZXh0ZW5kKGcuZGVmYXVsdCxi
LmRlZmF1bHQse3F1ZXJ5UGFyYW1zOnt9LF9xcDpsLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFyIGUs
dCxyPXRoaXMsbj10aGlzLmNvbnRyb2xsZXJOYW1lfHx0aGlzLnJvdXRlTmFtZSxpPXcuZ2V0T3du
ZXIodGhpcykuX2xvb2t1cEZhY3RvcnkoImNvbnRyb2xsZXI6IituKSxhPW8uZ2V0KHRoaXMsInF1
ZXJ5UGFyYW1zIikscz0hIU9iamVjdC5rZXlzKGEpLmxlbmd0aDtpZihpKXtlPWkucHJvdG8oKTt2
YXIgdT1vLmdldChlLCJxdWVyeVBhcmFtcyIpLGw9Xy5ub3JtYWxpemVDb250cm9sbGVyUXVlcnlQ
YXJhbXModSk7dD1BKGwsYSl9ZWxzZSBpZihzKXt2YXIgYz15LmdlbmVyYXRlQ29udHJvbGxlckZh
Y3Rvcnkody5nZXRPd25lcih0aGlzKSxuKTtlPWMucHJvdG8oKSx0PWF9dmFyIGQ9W10scD17fSxo
PVtdO2Zvcih2YXIgbSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobSkmJiJ1bmtub3duUHJvcGVy
dHkiIT09bSYmIl9zdXBlciIhPT1tKXt2YXIgYixnPXRbbV0seD1nLnNjb3BlfHwibW9kZWwiOyJj
b250cm9sbGVyIj09PXgmJihiPVtdKTt2YXIgaz1nLmFzfHx0aGlzLnNlcmlhbGl6ZVF1ZXJ5UGFy
YW1LZXkobSksQz1vLmdldChlLG0pO0FycmF5LmlzQXJyYXkoQykmJihDPXYuQShDLnNsaWNlKCkp
KTt2YXIgRT1nLnR5cGV8fGYudHlwZU9mKEMpLE89dGhpcy5zZXJpYWxpemVRdWVyeVBhcmFtKEMs
ayxFKSxUPW4rIjoiK20sTj17dW5kZWNvcmF0ZWREZWZhdWx0VmFsdWU6by5nZXQoZSxtKSxkZWZh
dWx0VmFsdWU6QyxzZXJpYWxpemVkRGVmYXVsdFZhbHVlOk8sc2VyaWFsaXplZFZhbHVlOk8sdHlw
ZTpFLHVybEtleTprLHByb3A6bSxzY29wZWRQcm9wZXJ0eU5hbWU6VCxjdHJsOm4scm91dGU6dGhp
cyxwYXJ0czpiLHZhbHVlczpudWxsLHNjb3BlOngscHJlZml4OiIifTtwW21dPXBba109cFtUXT1O
LGQucHVzaChOKSxoLnB1c2gobSl9cmV0dXJue3FwczpkLG1hcDpwLHByb3BlcnR5TmFtZXM6aCxz
dGF0ZXM6e2luYWN0aXZlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cFtlXTtyLl9xcENoYW5nZWQoZSx0
LG4pfSxhY3RpdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1wW2VdO3JldHVybiByLl9xcENoYW5nZWQo
ZSx0LG4pLHIuX2FjdGl2ZVFQQ2hhbmdlZChwW2VdLHQpfSxhbGxvd092ZXJyaWRlczpmdW5jdGlv
bihlLHQpe3ZhciBuPXBbZV07cmV0dXJuIHIuX3FwQ2hhbmdlZChlLHQsbiksci5fdXBkYXRpbmdR
UENoYW5nZWQocFtlXSl9fX19KSxfbmFtZXM6bnVsbCxfc3Rhc2hOYW1lczpmdW5jdGlvbihlLHQp
e3ZhciByPWU7aWYoIXRoaXMuX25hbWVzKXt2YXIgbj10aGlzLl9uYW1lcz1yLl9uYW1lcztuLmxl
bmd0aHx8KHI9dCxuPXImJnIuX25hbWVzfHxbXSk7Zm9yKHZhciBpPW8uZ2V0KHRoaXMsIl9xcC5x
cHMiKSxhPWkubGVuZ3RoLHM9bmV3IEFycmF5KG4ubGVuZ3RoKSx1PTAsbD1uLmxlbmd0aDt1PGw7
Kyt1KXNbdV09ci5uYW1lKyIuIituW3VdO2Zvcih2YXIgYz0wO2M8YTsrK2Mpe3ZhciBmPWlbY107
Im1vZGVsIj09PWYuc2NvcGUmJihmLnBhcnRzPXMpLGYucHJlZml4PWYuY3RybH19fSxfYWN0aXZl
UVBDaGFuZ2VkOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5yb3V0ZXI7ci5fYWN0aXZlUVBDaGFu
Z2VkKGUuc2NvcGVkUHJvcGVydHlOYW1lLHQpfSxfdXBkYXRpbmdRUENoYW5nZWQ6ZnVuY3Rpb24o
ZSl7dmFyIHQ9dGhpcy5yb3V0ZXI7dC5fdXBkYXRpbmdRUENoYW5nZWQoZS51cmxLZXkpfSxtZXJn
ZWRQcm9wZXJ0aWVzOlsicXVlcnlQYXJhbXMiXSxwYXJhbXNGb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9
dy5nZXRPd25lcih0aGlzKS5sb29rdXAoInJvdXRlOiIrZSk7aWYoIXQpcmV0dXJue307dmFyIHI9
dGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5zaXRpb24sbj1yP3Iuc3RhdGU6dGhpcy5yb3V0
ZXIucm91dGVyLnN0YXRlLGk9e307cmV0dXJuIGMuZGVmYXVsdChpLG4ucGFyYW1zW2VdKSxjLmRl
ZmF1bHQoaSxOKHQsbikpLGl9LHNlcmlhbGl6ZVF1ZXJ5UGFyYW1LZXk6ZnVuY3Rpb24oZSl7cmV0
dXJuIGV9LHNlcmlhbGl6ZVF1ZXJ5UGFyYW06ZnVuY3Rpb24oZSx0LHIpe3JldHVybiJhcnJheSI9
PT1yP0pTT04uc3RyaW5naWZ5KGUpOiIiK2V9LGRlc2VyaWFsaXplUXVlcnlQYXJhbTpmdW5jdGlv
bihlLHQscil7cmV0dXJuImJvb2xlYW4iPT09cj8idHJ1ZSI9PT1lOiJudW1iZXIiPT09cj9OdW1i
ZXIoZSkudmFsdWVPZigpOiJhcnJheSI9PT1yP3YuQShKU09OLnBhcnNlKGUpKTplfSxfb3B0aW9u
c0ZvclF1ZXJ5UGFyYW06ZnVuY3Rpb24oZSl7cmV0dXJuIG8uZ2V0KHRoaXMsInF1ZXJ5UGFyYW1z
LiIrZS51cmxLZXkpfHxvLmdldCh0aGlzLCJxdWVyeVBhcmFtcy4iK2UucHJvcCl8fHt9fSxyZXNl
dENvbnRyb2xsZXI6ayxleGl0OmZ1bmN0aW9uKCl7dGhpcy5kZWFjdGl2YXRlKCksdGhpcy50cmln
Z2VyKCJkZWFjdGl2YXRlIiksdGhpcy50ZWFyZG93blZpZXdzKCl9LF9yZXNldDpmdW5jdGlvbihl
LHQpe3ZhciByPXRoaXMuY29udHJvbGxlcjtyLl9xcERlbGVnYXRlPW8uZ2V0KHRoaXMsIl9xcC5z
dGF0ZXMuaW5hY3RpdmUiKSx0aGlzLnJlc2V0Q29udHJvbGxlcihyLGUsdCl9LGVudGVyOmZ1bmN0
aW9uKCl7dGhpcy5jb25uZWN0aW9ucz1bXSx0aGlzLmFjdGl2YXRlKCksdGhpcy50cmlnZ2VyKCJh
Y3RpdmF0ZSIpfSx2aWV3TmFtZTpudWxsLHRlbXBsYXRlTmFtZTpudWxsLGNvbnRyb2xsZXJOYW1l
Om51bGwsYWN0aW9uczp7cXVlcnlQYXJhbXNEaWRDaGFuZ2U6ZnVuY3Rpb24oZSx0LHIpe2Zvcih2
YXIgbj1vLmdldCh0aGlzLCJfcXAiKS5tYXAsaT1PYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0
LmtleXMocikpLGE9MCxzPWkubGVuZ3RoO2E8czsrK2Epe3ZhciB1PW5baVthXV07dSYmby5nZXQo
dGhpcy5fb3B0aW9uc0ZvclF1ZXJ5UGFyYW0odSksInJlZnJlc2hNb2RlbCIpJiZ0aGlzLnJvdXRl
ci5jdXJyZW50U3RhdGUmJnRoaXMucmVmcmVzaCgpfXJldHVybiEwfSxmaW5hbGl6ZVF1ZXJ5UGFy
YW1DaGFuZ2U6ZnVuY3Rpb24oZSx0LHIpe2lmKCJhcHBsaWNhdGlvbiIhPT10aGlzLnJvdXRlTmFt
ZSlyZXR1cm4hMDtpZihyKXt2YXIgbixpPXIuc3RhdGUuaGFuZGxlckluZm9zLHM9dGhpcy5yb3V0
ZXIsdT1zLl9xdWVyeVBhcmFtc0ZvcihpW2kubGVuZ3RoLTFdLm5hbWUpLGw9cy5fcXBVcGRhdGVz
O18uc3Rhc2hQYXJhbU5hbWVzKHMsaSk7Zm9yKHZhciBjPTAsZj11LnFwcy5sZW5ndGg7YzxmOysr
Yyl7dmFyIGQscCxoPXUucXBzW2NdLG09aC5yb3V0ZSx2PW0uY29udHJvbGxlcixiPWgudXJsS2V5
IGluIGUmJmgudXJsS2V5O2wmJmgudXJsS2V5IGluIGw/KGQ9by5nZXQodixoLnByb3ApLHA9bS5z
ZXJpYWxpemVRdWVyeVBhcmFtKGQsaC51cmxLZXksaC50eXBlKSk6Yj8ocD1lW2JdLGQ9bS5kZXNl
cmlhbGl6ZVF1ZXJ5UGFyYW0ocCxoLnVybEtleSxoLnR5cGUpKToocD1oLnNlcmlhbGl6ZWREZWZh
dWx0VmFsdWUsZD1TKGguZGVmYXVsdFZhbHVlKSksdi5fcXBEZWxlZ2F0ZT1vLmdldChtLCJfcXAu
c3RhdGVzLmluYWN0aXZlIik7dmFyIGc9cCE9PWguc2VyaWFsaXplZFZhbHVlO2lmKGcpe2lmKHIu
cXVlcnlQYXJhbXNPbmx5JiZuIT09ITEpe3ZhciB5PW0uX29wdGlvbnNGb3JRdWVyeVBhcmFtKGgp
LHc9by5nZXQoeSwicmVwbGFjZSIpO3c/bj0hMDp3PT09ITEmJihuPSExKX1hLnNldCh2LGgucHJv
cCxkKX1oLnNlcmlhbGl6ZWRWYWx1ZT1wO3ZhciB4PWguc2VyaWFsaXplZERlZmF1bHRWYWx1ZT09
PXA7eHx8dC5wdXNoKHt2YWx1ZTpwLHZpc2libGU6ITAsa2V5OmJ8fGgudXJsS2V5fSl9biYmci5t
ZXRob2QoInJlcGxhY2UiKSx1LnFwcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW8uZ2V0KGUu
cm91dGUsIl9xcCIpLHI9ZS5yb3V0ZS5jb250cm9sbGVyO3IuX3FwRGVsZWdhdGU9by5nZXQodCwi
c3RhdGVzLmFjdGl2ZSIpfSkscy5fcXBVcGRhdGVzPW51bGx9fX0sZGVhY3RpdmF0ZTprLGFjdGl2
YXRlOmssdHJhbnNpdGlvblRvOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5yb3V0ZXI7cmV0dXJu
IHIudHJhbnNpdGlvblRvLmFwcGx5KHIsYXJndW1lbnRzKX0saW50ZXJtZWRpYXRlVHJhbnNpdGlv
blRvOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yb3V0ZXI7ZS5pbnRlcm1lZGlhdGVUcmFuc2l0aW9u
VG8uYXBwbHkoZSxhcmd1bWVudHMpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm91
dGVyLnJvdXRlci5yZWZyZXNoKHRoaXMpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXRo
aXMucm91dGVyO3JldHVybiBlLnJlcGxhY2VXaXRoLmFwcGx5KGUsYXJndW1lbnRzKX0sc2VuZDpm
dW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZSksbj0wO248ZTtu
KyspcltuXT1hcmd1bWVudHNbbl07aWYodGhpcy5yb3V0ZXImJnRoaXMucm91dGVyLnJvdXRlcnx8
IXQuZGVmYXVsdC50ZXN0aW5nKXt2YXIgaTsoaT10aGlzLnJvdXRlcikuc2VuZC5hcHBseShpLHIp
fWVsc2V7dmFyIG89clswXTtyPWouY2FsbChyLDEpO3ZhciBhPXRoaXMuYWN0aW9uc1tvXTtpZihh
KXJldHVybiB0aGlzLmFjdGlvbnNbb10uYXBwbHkodGhpcyxyKX19LHNldHVwOmZ1bmN0aW9uKGUs
dCl7dmFyIHIsbj10aGlzLmNvbnRyb2xsZXJOYW1lfHx0aGlzLnJvdXRlTmFtZSxpPXRoaXMuY29u
dHJvbGxlckZvcihuLCEwKTtpZihyPWk/aTp0aGlzLmdlbmVyYXRlQ29udHJvbGxlcihuLGUpLCF0
aGlzLmNvbnRyb2xsZXIpe3ZhciBzPW8uZ2V0KHRoaXMsIl9xcC5wcm9wZXJ0eU5hbWVzIik7UChy
LHMpLHRoaXMuY29udHJvbGxlcj1yfXZhciB1PW8uZ2V0KHRoaXMsIl9xcCIpLGw9dS5zdGF0ZXM7
aWYodCl7Xy5zdGFzaFBhcmFtTmFtZXModGhpcy5yb3V0ZXIsdC5zdGF0ZS5oYW5kbGVySW5mb3Mp
O3ZhciBjPXQucGFyYW1zLGY9dS5wcm9wZXJ0eU5hbWVzLGQ9dGhpcy5fYnVja2V0Q2FjaGU7Zi5m
b3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXUubWFwW2VdO3QudmFsdWVzPWM7dmFyIG49Xy5jYWxj
dWxhdGVDYWNoZUtleSh0LnByZWZpeCx0LnBhcnRzLHQudmFsdWVzKTtpZihkKXt2YXIgaT1kLmxv
b2t1cChuLGUsdC51bmRlY29yYXRlZERlZmF1bHRWYWx1ZSk7YS5zZXQocixlLGkpfX0pfWlmKHIu
X3FwRGVsZWdhdGU9bC5hbGxvd092ZXJyaWRlcyx0KXt2YXIgcD1OKHRoaXMsdC5zdGF0ZSk7ci5z
ZXRQcm9wZXJ0aWVzKHApfXRoaXMuc2V0dXBDb250cm9sbGVyKHIsZSx0KSx0aGlzLl9lbnZpcm9u
bWVudCYmIXRoaXMuX2Vudmlyb25tZW50Lm9wdGlvbnMuc2hvdWxkUmVuZGVyfHx0aGlzLnJlbmRl
clRlbXBsYXRlKHIsZSl9LF9xcENoYW5nZWQ6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBuPV8u
Y2FsY3VsYXRlQ2FjaGVLZXkoci5wcmVmaXh8fCIiLHIucGFydHMsci52YWx1ZXMpLGk9dGhpcy5f
YnVja2V0Q2FjaGU7aSYmaS5zdGFzaChuLGUsdCl9fSxiZWZvcmVNb2RlbDprLGFmdGVyTW9kZWw6
ayxyZWRpcmVjdDprLGNvbnRleHREaWRDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRNb2Rl
bD10aGlzLmNvbnRleHR9LG1vZGVsOmZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLGEscz1vLmdldCh0
aGlzLCJfcXAubWFwIik7Zm9yKHZhciB1IGluIGUpInF1ZXJ5UGFyYW1zIj09PXV8fHMmJnUgaW4g
c3x8KChyPXUubWF0Y2goL14oLiopX2lkJC8pKSYmKG49clsxXSxhPWVbdV0pLGk9ITApO2lmKCFu
JiZpKXJldHVybiBwLmRlZmF1bHQoZSk7aWYoIW4pe2lmKHQucmVzb2x2ZUluZGV4PDEpcmV0dXJu
O3ZhciBsPXQuc3RhdGUuaGFuZGxlckluZm9zW3QucmVzb2x2ZUluZGV4LTFdLmNvbnRleHQ7cmV0
dXJuIGx9cmV0dXJuIHRoaXMuZmluZE1vZGVsKG4sYSl9LGRlc2VyaWFsaXplOmZ1bmN0aW9uKGUs
dCl7cmV0dXJuIHRoaXMubW9kZWwodGhpcy5wYXJhbXNGb3IodGhpcy5yb3V0ZU5hbWUpLHQpfSxm
aW5kTW9kZWw6ZnVuY3Rpb24oKXt2YXIgZT1vLmdldCh0aGlzLCJzdG9yZSIpO3JldHVybiBlLmZp
bmQuYXBwbHkoZSxhcmd1bWVudHMpfSxzdG9yZTpsLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFyIGU9
dy5nZXRPd25lcih0aGlzKTt0aGlzLnJvdXRlTmFtZSxvLmdldCh0aGlzLCJyb3V0ZXIubmFtZXNw
YWNlIik7cmV0dXJue2ZpbmQ6ZnVuY3Rpb24odCxyKXt2YXIgbj1lLl9sb29rdXBGYWN0b3J5KCJt
b2RlbDoiK3QpO2lmKG4pcmV0dXJuIG4uZmluZChyKX19fSksc2VyaWFsaXplOmZ1bmN0aW9uKGUs
dCl7aWYoISh0Lmxlbmd0aDwxKSYmZSl7dmFyIHI9dFswXSxuPXt9O3JldHVybiAxPT09dC5sZW5n
dGg/ciBpbiBlP25bcl09by5nZXQoZSxyKTovX2lkJC8udGVzdChyKSYmKG5bcl09by5nZXQoZSwi
aWQiKSk6bj1zLmRlZmF1bHQoZSx0KSxufX0sc2V0dXBDb250cm9sbGVyOmZ1bmN0aW9uKGUsdCxy
KXtlJiZ2b2lkIDAhPT10JiZhLnNldChlLCJtb2RlbCIsdCl9LGNvbnRyb2xsZXJGb3I6ZnVuY3Rp
b24oZSx0KXt2YXIgcixuPXcuZ2V0T3duZXIodGhpcyksaT1uLmxvb2t1cCgicm91dGU6IitlKTty
ZXR1cm4gaSYmaS5jb250cm9sbGVyTmFtZSYmKGU9aS5jb250cm9sbGVyTmFtZSkscj1uLmxvb2t1
cCgiY29udHJvbGxlcjoiK2UpfSxnZW5lcmF0ZUNvbnRyb2xsZXI6ZnVuY3Rpb24oZSx0KXt2YXIg
cj13LmdldE93bmVyKHRoaXMpO3JldHVybiB0PXR8fHRoaXMubW9kZWxGb3IoZSkseS5kZWZhdWx0
KHIsZSx0KX0sbW9kZWxGb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5nZXRPd25lcih0aGlzKS5sb29r
dXAoInJvdXRlOiIrZSkscj10aGlzLnJvdXRlcj90aGlzLnJvdXRlci5yb3V0ZXIuYWN0aXZlVHJh
bnNpdGlvbjpudWxsO2lmKHIpe3ZhciBuPXQmJnQucm91dGVOYW1lfHxlO2lmKHIucmVzb2x2ZWRN
b2RlbHMuaGFzT3duUHJvcGVydHkobikpcmV0dXJuIHIucmVzb2x2ZWRNb2RlbHNbbl19cmV0dXJu
IHQmJnQuY3VycmVudE1vZGVsfSxyZW5kZXJUZW1wbGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMucmVu
ZGVyKCl9LHJlbmRlcjpmdW5jdGlvbihlLHQpe3ZhciByLG49InN0cmluZyI9PXR5cGVvZiBlJiYh
IWUsaT0wPT09YXJndW1lbnRzLmxlbmd0aHx8eC5kZWZhdWx0KGFyZ3VtZW50c1swXSk7Im9iamVj
dCIhPXR5cGVvZiBlfHx0P3I9ZToocj10aGlzLnJvdXRlTmFtZSx0PWUpO3ZhciBvPU8odGhpcyxu
LGkscix0KTt0aGlzLmNvbm5lY3Rpb25zLnB1c2gobyksZC5kZWZhdWx0Lm9uY2UodGhpcy5yb3V0
ZXIsIl9zZXRPdXRsZXRzIil9LGRpc2Nvbm5lY3RPdXRsZXQ6ZnVuY3Rpb24oZSl7dmFyIHQscjtp
ZihlJiYic3RyaW5nIiE9dHlwZW9mIGUpe2lmKHQ9ZS5vdXRsZXQscj1lLnBhcmVudFZpZXcsZSYm
T2JqZWN0LmtleXMoZSkuaW5kZXhPZigib3V0bGV0IikhPT0tMSYmInVuZGVmaW5lZCI9PXR5cGVv
ZiBlLm91dGxldCl0aHJvdyBuZXcgaS5kZWZhdWx0KCJZb3UgcGFzc2VkIHVuZGVmaW5lZCBhcyB0
aGUgb3V0bGV0IG5hbWUuIil9ZWxzZSB0PWU7cj1yJiZyLnJlcGxhY2UoL1wvL2csIi4iKSx0PXR8
fCJtYWluIix0aGlzLl9kaXNjb25uZWN0T3V0bGV0KHQscik7Zm9yKHZhciBuPTA7bjx0aGlzLnJv
dXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGg7bisrKXRoaXMucm91dGVyLnJv
dXRlci5jdXJyZW50SGFuZGxlckluZm9zW25dLmhhbmRsZXIuX2Rpc2Nvbm5lY3RPdXRsZXQodCxy
KX0sX2Rpc2Nvbm5lY3RPdXRsZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgcj1DKHRoaXMpO3ImJnQ9PT1y
LnJvdXRlTmFtZSYmKHQ9dm9pZCAwKTtmb3IodmFyIG49MDtuPHRoaXMuY29ubmVjdGlvbnMubGVu
Z3RoO24rKyl7dmFyIGk9dGhpcy5jb25uZWN0aW9uc1tuXTtpLm91dGxldD09PWUmJmkuaW50bz09
PXQmJih0aGlzLmNvbm5lY3Rpb25zW25dPXtvd25lcjppLm93bmVyLGludG86aS5pbnRvLG91dGxl
dDppLm91dGxldCxuYW1lOmkubmFtZSxjb250cm9sbGVyOnZvaWQgMCx0ZW1wbGF0ZTp2b2lkIDAs
Vmlld0NsYXNzOnZvaWQgMH0sZC5kZWZhdWx0Lm9uY2UodGhpcy5yb3V0ZXIsIl9zZXRPdXRsZXRz
IikpfX0sd2lsbERlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRlYXJkb3duVmlld3MoKX0sdGVhcmRv
d25WaWV3czpmdW5jdGlvbigpe3RoaXMuY29ubmVjdGlvbnMmJnRoaXMuY29ubmVjdGlvbnMubGVu
Z3RoPjAmJih0aGlzLmNvbm5lY3Rpb25zPVtdLGQuZGVmYXVsdC5vbmNlKHRoaXMucm91dGVyLCJf
c2V0T3V0bGV0cyIpKX19KTtnLmRlcHJlY2F0ZVVuZGVyc2NvcmVBY3Rpb25zKFIpLFIucmVvcGVu
Q2xhc3Moe2lzUm91dGVGYWN0b3J5OiEwfSksZS5kZWZhdWx0PVJ9KTtlKCJlbWJlci1yb3V0aW5n
L3N5c3RlbS9yb3V0ZXIiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2xvZ2dlciIsImVtYmVyLW1l
dGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvZXJyb3IiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQi
LCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0aWVzIiwiZW1i
ZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwiZW1iZXItbWV0YWwvY29tcHV0ZWQiLCJlbWJlci1tZXRh
bC9hc3NpZ24iLCJlbWJlci1tZXRhbC9ydW5fbG9vcCIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL29i
amVjdCIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQiLCJlbWJlci1yb3V0aW5nL3N5c3Rl
bS9kc2wiLCJlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2FwaSIsImVtYmVyLXJvdXRpbmcvdXRpbHMi
LCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLXJvdXRpbmcvc3lzdGVtL3JvdXRlcl9zdGF0ZSIs
ImNvbnRhaW5lci9vd25lciIsImVtYmVyLW1ldGFsL2RpY3Rpb25hcnkiLCJyb3V0ZXIiLCJyb3V0
ZXIvdHJhbnNpdGlvbiJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCxoLG0s
dixiLGcseSxfLHcpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB4KCl7cmV0dXJuIHRoaXN9ZnVuY3Rp
b24gayhlLHQscil7Zm9yKHZhciBuLGksbz10LnN0YXRlLmhhbmRsZXJJbmZvcyxhPSExLHM9by5s
ZW5ndGgtMTtzPj0wOy0tcylpZihuPW9bc10saT1uLmhhbmRsZXIsYSl7aWYocihpLG9bcysxXS5o
YW5kbGVyKSE9PSEwKXJldHVybiExfWVsc2UgZT09PWkmJihhPSEwKTtyZXR1cm4hMH1mdW5jdGlv
biBDKGUscil7dmFyIG4saT1bXTtuPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIm9iamVjdCI9PXR5
cGVvZiBlLmVycm9yVGhyb3duP2UuZXJyb3JUaHJvd246ZSxyJiZpLnB1c2gociksbiYmKG4ubWVz
c2FnZSYmaS5wdXNoKG4ubWVzc2FnZSksbi5zdGFjayYmaS5wdXNoKG4uc3RhY2spLCJzdHJpbmci
PT10eXBlb2YgbiYmaS5wdXNoKG4pKSx0LmRlZmF1bHQuZXJyb3IuYXBwbHkodGhpcyxpKX1mdW5j
dGlvbiBFKGUsdCxyKXt2YXIgbixpPWUucm91dGVyLG89dC5yb3V0ZU5hbWUuc3BsaXQoIi4iKS5w
b3AoKSxhPSJhcHBsaWNhdGlvbiI9PT1lLnJvdXRlTmFtZT8iIjplLnJvdXRlTmFtZSsiLiI7cmV0
dXJuIG49YStvKyJfIityLE8oaSxuKT9uOihuPWErcixPKGksbik/bjp2b2lkIDApfWZ1bmN0aW9u
IE8oZSx0KXt2YXIgcj1nLmdldE93bmVyKGUpO3JldHVybiBlLmhhc1JvdXRlKHQpJiYoci5oYXNS
ZWdpc3RyYXRpb24oInRlbXBsYXRlOiIrdCl8fHIuaGFzUmVnaXN0cmF0aW9uKCJyb3V0ZToiK3Qp
KX1mdW5jdGlvbiBUKGUsdCxyKXt2YXIgaT1yLnNoaWZ0KCk7aWYoIWUpe2lmKHQpcmV0dXJuO3Ro
cm93IG5ldyBuLmRlZmF1bHQoIkNhbid0IHRyaWdnZXIgYWN0aW9uICciK2krIicgYmVjYXVzZSB5
b3VyIGFwcCBoYXNuJ3QgZmluaXNoZWQgdHJhbnNpdGlvbmluZyBpbnRvIGl0cyBmaXJzdCByb3V0
ZS4gVG8gdHJpZ2dlciBhbiBhY3Rpb24gb24gZGVzdGluYXRpb24gcm91dGVzIGR1cmluZyBhIHRy
YW5zaXRpb24sIHlvdSBjYW4gY2FsbCBgLnNlbmQoKWAgb24gdGhlIGBUcmFuc2l0aW9uYCBvYmpl
Y3QgcGFzc2VkIHRvIHRoZSBgbW9kZWwvYmVmb3JlTW9kZWwvYWZ0ZXJNb2RlbGAgaG9va3MuIik7
Cit9Zm9yKHZhciBvLGEscz0hMSx1PWUubGVuZ3RoLTE7dT49MDt1LS0paWYobz1lW3VdLGE9by5o
YW5kbGVyLGEuYWN0aW9ucyYmYS5hY3Rpb25zW2ldKXtpZihhLmFjdGlvbnNbaV0uYXBwbHkoYSxy
KSE9PSEwKXtpZigiZXJyb3IiPT09aSl7dmFyIGw9di5ndWlkRm9yKHJbMF0pO2Eucm91dGVyLl9t
YXJrRXJyb3JBc0hhbmRsZWQobCl9cmV0dXJufXM9ITB9aWYoSFtpXSlyZXR1cm4gdm9pZCBIW2ld
LmFwcGx5KG51bGwscik7aWYoIXMmJiF0KXRocm93IG5ldyBuLmRlZmF1bHQoIk5vdGhpbmcgaGFu
ZGxlZCB0aGUgYWN0aW9uICciK2krIicuIElmIHlvdSBkaWQgaGFuZGxlIHRoZSBhY3Rpb24sIHRo
aXMgZXJyb3IgY2FuIGJlIGNhdXNlZCBieSByZXR1cm5pbmcgdHJ1ZSBmcm9tIGFuIGFjdGlvbiBo
YW5kbGVyIGluIGEgY29udHJvbGxlciwgY2F1c2luZyB0aGUgYWN0aW9uIHRvIGJ1YmJsZS4iKX1m
dW5jdGlvbiBOKGUsdCxyKXtmb3IodmFyIG49ZS5yb3V0ZXIsaT1uLmFwcGx5SW50ZW50KHQsciks
bz1pLmhhbmRsZXJJbmZvcyxhPWkucGFyYW1zLHM9MCx1PW8ubGVuZ3RoO3M8dTsrK3Mpe3ZhciBs
PW9bc107bC5pc1Jlc29sdmVkfHwobD1sLmJlY29tZVJlc29sdmVkKG51bGwsbC5jb250ZXh0KSks
YVtsLm5hbWVdPWwucGFyYW1zfXJldHVybiBpfWZ1bmN0aW9uIFMoZSl7dmFyIHQ9ZS5yb3V0ZXIu
Y3VycmVudEhhbmRsZXJJbmZvcyxyPUYuX3JvdXRlUGF0aCh0KSxuPXRbdC5sZW5ndGgtMV0ubmFt
ZTtvLnNldChlLCJjdXJyZW50UGF0aCIsciksby5zZXQoZSwiY3VycmVudFJvdXRlTmFtZSIsbik7
dmFyIGk9Zy5nZXRPd25lcihlKS5sb29rdXAoImNvbnRyb2xsZXI6YXBwbGljYXRpb24iKTtpJiYo
ImN1cnJlbnRQYXRoImluIGl8fGEuZGVmaW5lUHJvcGVydHkoaSwiY3VycmVudFBhdGgiKSxvLnNl
dChpLCJjdXJyZW50UGF0aCIsciksImN1cnJlbnRSb3V0ZU5hbWUiaW4gaXx8YS5kZWZpbmVQcm9w
ZXJ0eShpLCJjdXJyZW50Um91dGVOYW1lIiksby5zZXQoaSwiY3VycmVudFJvdXRlTmFtZSIsbikp
fWZ1bmN0aW9uIEEoZSx0KXt2YXIgcj1iLmRlZmF1bHQuY3JlYXRlKHtlbWJlclJvdXRlcjp0LHJv
dXRlckpzOnQucm91dGVyLHJvdXRlckpzU3RhdGU6ZS5zdGF0ZX0pO3QuY3VycmVudFN0YXRlfHx0
LnNldCgiY3VycmVudFN0YXRlIixyKSx0LnNldCgidGFyZ2V0U3RhdGUiLHIpLGUucHJvbWlzZT1l
LmNhdGNoKGZ1bmN0aW9uKGUpe3ZhciByPXYuZ3VpZEZvcihlKTtpZighdC5faXNFcnJvckhhbmRs
ZWQocikpdGhyb3cgZTt0Ll9jbGVhckhhbmRsZWRFcnJvcihyKX0pfWZ1bmN0aW9uIFAoZSl7cmV0
dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoIiI9PT1lfHwiLyI9PT1lLmNoYXJBdCgwKSl9ZnVuY3Rp
b24gaihlLHQscixuKXt2YXIgaT1lLl9xdWVyeVBhcmFtc0Zvcih0KTtmb3IodmFyIG8gaW4gcilp
ZihyLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1yW29dLHM9aS5tYXBbb107cyYmbihvLGEscyl9
fWZ1bmN0aW9uIFIoZSx0KXtpZihlKWZvcih2YXIgcj1bZV07ci5sZW5ndGg+MDspe3ZhciBuPXIu
c2hpZnQoKTtpZihuLnJlbmRlci5uYW1lPT09dClyZXR1cm4gbjt2YXIgaT1uLm91dGxldHM7Zm9y
KHZhciBvIGluIGkpci5wdXNoKGlbb10pfX1mdW5jdGlvbiBMKGUsdCxyKXt2YXIgbixpPXtyZW5k
ZXI6cixvdXRsZXRzOm5ldyBzLmRlZmF1bHR9O3JldHVybiBuPXIuaW50bz9SKGUsci5pbnRvKTp0
LG4/by5zZXQobi5vdXRsZXRzLHIub3V0bGV0LGkpOnIuaW50bz9EKGUsci5pbnRvLGkpOmU9aSx7
bGl2ZVJvdXRlczplLG93blN0YXRlOml9fWZ1bmN0aW9uIEQoZSx0LHIpe2Uub3V0bGV0cy5fX2Vt
YmVyX29ycGhhbnNfX3x8KGUub3V0bGV0cy5fX2VtYmVyX29ycGhhbnNfXz17cmVuZGVyOntuYW1l
OiJfX2VtYmVyX29ycGhhbnNfXyJ9LG91dGxldHM6bmV3IHMuZGVmYXVsdH0pLGUub3V0bGV0cy5f
X2VtYmVyX29ycGhhbnNfXy5vdXRsZXRzW3RdPXIsYy5kZWZhdWx0LnNjaGVkdWxlKCJhZnRlclJl
bmRlciIsZnVuY3Rpb24oKXt9KX1mdW5jdGlvbiBNKGUsdCxyKXt2YXIgbj1SKGUsci5yb3V0ZU5h
bWUpO3JldHVybiBuP246KHQub3V0bGV0cy5tYWluPXtyZW5kZXI6e25hbWU6ci5yb3V0ZU5hbWUs
b3V0bGV0OiJtYWluIn0sb3V0bGV0czp7fX0sdCl9ZS50cmlnZ2VyRXZlbnQ9VDt2YXIgST1bXS5z
bGljZSxGPWYuZGVmYXVsdC5leHRlbmQoZC5kZWZhdWx0LHtsb2NhdGlvbjoiaGFzaCIscm9vdFVS
TDoiLyIsX2luaXRSb3V0ZXJKczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucm91dGVyPW5ldyBfLmRl
ZmF1bHQ7ZS50cmlnZ2VyRXZlbnQ9VCxlLl90cmlnZ2VyV2lsbENoYW5nZUNvbnRleHQ9eCxlLl90
cmlnZ2VyV2lsbExlYXZlPXg7dmFyIHI9dGhpcy5jb25zdHJ1Y3Rvci5kc2xDYWxsYmFja3N8fFt4
XSxuPXRoaXMuX2J1aWxkRFNMKCk7bi5yb3V0ZSgiYXBwbGljYXRpb24iLHtwYXRoOiIvIixyZXNl
dE5hbWVzcGFjZTohMCxvdmVycmlkZU5hbWVBc3NlcnRpb246ITB9LGZ1bmN0aW9uKCl7Zm9yKHZh
ciBlPTA7ZTxyLmxlbmd0aDtlKyspcltlXS5jYWxsKHRoaXMpfSksaS5nZXQodGhpcywibmFtZXNw
YWNlLkxPR19UUkFOU0lUSU9OU19JTlRFUk5BTCIpJiYoZS5sb2c9dC5kZWZhdWx0LmRlYnVnKSxl
Lm1hcChuLmdlbmVyYXRlKCkpfSxfYnVpbGREU0w6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9oYXNN
b2R1bGVCYXNlZFJlc29sdmVyKCk7cmV0dXJuIG5ldyBwLmRlZmF1bHQobnVsbCx7ZW5hYmxlTG9h
ZGluZ1N1YnN0YXRlczohIWV9KX0saW5pdDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5KHRo
aXMsYXJndW1lbnRzKSx0aGlzLl9hY3RpdmVWaWV3cz17fSx0aGlzLl9xcENhY2hlPW5ldyBzLmRl
ZmF1bHQsdGhpcy5fcmVzZXRRdWV1ZWRRdWVyeVBhcmFtZXRlckNoYW5nZXMoKSx0aGlzLl9oYW5k
bGVkRXJyb3JzPXkuZGVmYXVsdChudWxsKX0sX3Jlc2V0UXVldWVkUXVlcnlQYXJhbWV0ZXJDaGFu
Z2VzOmZ1bmN0aW9uKCl7dGhpcy5fcXVldWVkUVBDaGFuZ2VzPXt9fSx1cmw6dS5jb21wdXRlZChm
dW5jdGlvbigpe3JldHVybiBpLmdldCh0aGlzLCJsb2NhdGlvbiIpLmdldFVSTCgpfSksX2hhc01v
ZHVsZUJhc2VkUmVzb2x2ZXI6ZnVuY3Rpb24oKXt2YXIgZT1nLmdldE93bmVyKHRoaXMpO2lmKCFl
KXJldHVybiExO3ZhciB0PWUuYXBwbGljYXRpb24mJmUuYXBwbGljYXRpb24uX19yZWdpc3RyeV9f
JiZlLmFwcGxpY2F0aW9uLl9fcmVnaXN0cnlfXy5yZXNvbHZlcjtyZXR1cm4hIXQmJiEhdC5tb2R1
bGVCYXNlZFJlc29sdmVyfSxzdGFydFJvdXRpbmc6ZnVuY3Rpb24oKXt2YXIgZT1pLmdldCh0aGlz
LCJpbml0aWFsVVJMIik7aWYodGhpcy5zZXR1cFJvdXRlcigpKXsidW5kZWZpbmVkIj09dHlwZW9m
IGUmJihlPWkuZ2V0KHRoaXMsImxvY2F0aW9uIikuZ2V0VVJMKCkpO3ZhciB0PXRoaXMuaGFuZGxl
VVJMKGUpO2lmKHQmJnQuZXJyb3IpdGhyb3cgdC5lcnJvcn19LHNldHVwUm91dGVyOmZ1bmN0aW9u
KCl7dmFyIGU9dGhpczt0aGlzLl9pbml0Um91dGVySnMoKSx0aGlzLl9zZXR1cExvY2F0aW9uKCk7
dmFyIHQ9dGhpcy5yb3V0ZXIscj1pLmdldCh0aGlzLCJsb2NhdGlvbiIpO3JldHVybiFpLmdldChy
LCJjYW5jZWxSb3V0ZXJTZXR1cCIpJiYodGhpcy5fc2V0dXBSb3V0ZXIodCxyKSxyLm9uVXBkYXRl
VVJMKGZ1bmN0aW9uKHQpe2UuaGFuZGxlVVJMKHQpfSksITApfSxkaWRUcmFuc2l0aW9uOmZ1bmN0
aW9uKGUpe1ModGhpcyksdGhpcy5fY2FuY2VsU2xvd1RyYW5zaXRpb25UaW1lcigpLHRoaXMubm90
aWZ5UHJvcGVydHlDaGFuZ2UoInVybCIpLHRoaXMuc2V0KCJjdXJyZW50U3RhdGUiLHRoaXMudGFy
Z2V0U3RhdGUpLGMuZGVmYXVsdC5vbmNlKHRoaXMsdGhpcy50cmlnZ2VyLCJkaWRUcmFuc2l0aW9u
IiksaS5nZXQodGhpcywibmFtZXNwYWNlIikuTE9HX1RSQU5TSVRJT05TJiZ0LmRlZmF1bHQubG9n
KCJUcmFuc2l0aW9uZWQgaW50byAnIitGLl9yb3V0ZVBhdGgoZSkrIiciKX0sX3NldE91dGxldHM6
ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcy5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyxuPW51
bGw7aWYocil7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe2U9cltpXS5oYW5kbGVyO2Zvcih2
YXIgbyxhPWUuY29ubmVjdGlvbnMscz0wO3M8YS5sZW5ndGg7cysrKXt2YXIgdT1MKG4sdCxhW3Nd
KTtuPXUubGl2ZVJvdXRlcyx1Lm93blN0YXRlLnJlbmRlci5uYW1lIT09ZS5yb3V0ZU5hbWUmJiJt
YWluIiE9PXUub3duU3RhdGUucmVuZGVyLm91dGxldHx8KG89dS5vd25TdGF0ZSl9MD09PWEubGVu
Z3RoJiYobz1NKG4sdCxlKSksdD1vfWlmKHRoaXMuX3RvcGxldmVsVmlldyl0aGlzLl90b3BsZXZl
bFZpZXcuc2V0T3V0bGV0U3RhdGUobik7ZWxzZXt2YXIgbD1nLmdldE93bmVyKHRoaXMpLGM9bC5f
bG9va3VwRmFjdG9yeSgidmlldzotb3V0bGV0Iik7dGhpcy5fdG9wbGV2ZWxWaWV3PWMuY3JlYXRl
KCksdGhpcy5fdG9wbGV2ZWxWaWV3LnNldE91dGxldFN0YXRlKG4pO3ZhciBmPWwubG9va3VwKCIt
YXBwbGljYXRpb24taW5zdGFuY2U6bWFpbiIpO2YuZGlkQ3JlYXRlUm9vdFZpZXcodGhpcy5fdG9w
bGV2ZWxWaWV3KX19fSx3aWxsVHJhbnNpdGlvbjpmdW5jdGlvbihlLHIsbil7Yy5kZWZhdWx0Lm9u
Y2UodGhpcyx0aGlzLnRyaWdnZXIsIndpbGxUcmFuc2l0aW9uIixuKSxpLmdldCh0aGlzLCJuYW1l
c3BhY2UiKS5MT0dfVFJBTlNJVElPTlMmJnQuZGVmYXVsdC5sb2coIlByZXBhcmluZyB0byB0cmFu
c2l0aW9uIGZyb20gJyIrRi5fcm91dGVQYXRoKGUpKyInIHRvICciK0YuX3JvdXRlUGF0aChyKSsi
JyIpfSxoYW5kbGVVUkw6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5zcGxpdCgvIyguKyk/LylbMF0s
dGhpcy5fZG9VUkxUcmFuc2l0aW9uKCJoYW5kbGVVUkwiLGUpfSxfZG9VUkxUcmFuc2l0aW9uOmZ1
bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5yb3V0ZXJbZV0odHx8Ii8iKTtyZXR1cm4gQShyLHRoaXMp
LHJ9LHRyYW5zaXRpb25UbzpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cy5sZW5ndGgs
cj1BcnJheSh0KSxuPTA7bjx0O24rKylyW25dPWFyZ3VtZW50c1tuXTtpZihQKHJbMF0pKXJldHVy
biB0aGlzLl9kb1VSTFRyYW5zaXRpb24oInRyYW5zaXRpb25UbyIsclswXSk7dmFyIGk9cltyLmxl
bmd0aC0xXTtlPWkmJmkuaGFzT3duUHJvcGVydHkoInF1ZXJ5UGFyYW1zIik/ci5wb3AoKS5xdWVy
eVBhcmFtczp7fTt2YXIgbz1yLnNoaWZ0KCk7cmV0dXJuIHRoaXMuX2RvVHJhbnNpdGlvbihvLHIs
ZSl9LGludGVybWVkaWF0ZVRyYW5zaXRpb25UbzpmdW5jdGlvbigpe3ZhciBlOyhlPXRoaXMucm91
dGVyKS5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8uYXBwbHkoZSxhcmd1bWVudHMpLFModGhpcyk7
dmFyIHI9dGhpcy5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcztpLmdldCh0aGlzLCJuYW1lc3Bh
Y2UiKS5MT0dfVFJBTlNJVElPTlMmJnQuZGVmYXVsdC5sb2coIkludGVybWVkaWF0ZS10cmFuc2l0
aW9uZWQgaW50byAnIitGLl9yb3V0ZVBhdGgocikrIiciKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24o
KXtyZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLm1ldGhvZCgi
cmVwbGFjZSIpfSxnZW5lcmF0ZTpmdW5jdGlvbigpe3ZhciBlLHQ9KGU9dGhpcy5yb3V0ZXIpLmdl
bmVyYXRlLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5sb2NhdGlvbi5mb3JtYXRVUkwo
dCl9LGlzQWN0aXZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucm91dGVyO3JldHVybiB0LmlzQWN0
aXZlLmFwcGx5KHQsYXJndW1lbnRzKX0saXNBY3RpdmVJbnRlbnQ6ZnVuY3Rpb24oZSx0LHIpe3Jl
dHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5pc0FjdGl2ZUludGVudChlLHQscil9LHNlbmQ6ZnVuY3Rp
b24oZSx0KXt2YXIgcjsocj10aGlzLnJvdXRlcikudHJpZ2dlci5hcHBseShyLGFyZ3VtZW50cyl9
LGhhc1JvdXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvdXRlci5oYXNSb3V0ZShlKX0scmVz
ZXQ6ZnVuY3Rpb24oKXt0aGlzLnJvdXRlciYmdGhpcy5yb3V0ZXIucmVzZXQoKX0sd2lsbERlc3Ry
b3k6ZnVuY3Rpb24oKXt0aGlzLl90b3BsZXZlbFZpZXcmJih0aGlzLl90b3BsZXZlbFZpZXcuZGVz
dHJveSgpLHRoaXMuX3RvcGxldmVsVmlldz1udWxsKSx0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFy
Z3VtZW50cyksdGhpcy5yZXNldCgpfSxfbG9va3VwQWN0aXZlQ29tcG9uZW50Tm9kZTpmdW5jdGlv
bihlKXtyZXR1cm4gdGhpcy5fYWN0aXZlVmlld3NbZV19LF9hY3RpdmVRUENoYW5nZWQ6ZnVuY3Rp
b24oZSx0KXt0aGlzLl9xdWV1ZWRRUENoYW5nZXNbZV09dCxjLmRlZmF1bHQub25jZSh0aGlzLHRo
aXMuX2ZpcmVRdWVyeVBhcmFtVHJhbnNpdGlvbil9LF91cGRhdGluZ1FQQ2hhbmdlZDpmdW5jdGlv
bihlKXt0aGlzLl9xcFVwZGF0ZXN8fCh0aGlzLl9xcFVwZGF0ZXM9e30pLHRoaXMuX3FwVXBkYXRl
c1tlXT0hMH0sX2ZpcmVRdWVyeVBhcmFtVHJhbnNpdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNp
dGlvblRvKHtxdWVyeVBhcmFtczp0aGlzLl9xdWV1ZWRRUENoYW5nZXN9KSx0aGlzLl9yZXNldFF1
ZXVlZFF1ZXJ5UGFyYW1ldGVyQ2hhbmdlcygpfSxfY29ubmVjdEFjdGl2ZUNvbXBvbmVudE5vZGU6
ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7ZGVsZXRlIG5bZV19dmFyIG49dGhpcy5fYWN0aXZl
Vmlld3M7dGhpcy5fYWN0aXZlVmlld3NbZV09dCx0LnJlbmRlck5vZGUuYWRkRGVzdHJ1Y3Rpb24o
e2Rlc3Ryb3k6cn0pfSxfc2V0dXBMb2NhdGlvbjpmdW5jdGlvbigpe3ZhciBlPWkuZ2V0KHRoaXMs
ImxvY2F0aW9uIiksdD1pLmdldCh0aGlzLCJyb290VVJMIikscj1nLmdldE93bmVyKHRoaXMpO2lm
KCJzdHJpbmciPT10eXBlb2YgZSYmcil7dmFyIG49ci5sb29rdXAoImxvY2F0aW9uOiIrZSk7aWYo
InVuZGVmaW5lZCIhPXR5cGVvZiBuKWU9by5zZXQodGhpcywibG9jYXRpb24iLG4pO2Vsc2V7dmFy
IGE9e2ltcGxlbWVudGF0aW9uOmV9O2U9by5zZXQodGhpcywibG9jYXRpb24iLGguZGVmYXVsdC5j
cmVhdGUoYSkpfX1udWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYodCYmby5zZXQoZSwicm9v
dFVSTCIsdCksImZ1bmN0aW9uIj09dHlwZW9mIGUuZGV0ZWN0JiZlLmRldGVjdCgpLCJmdW5jdGlv
biI9PXR5cGVvZiBlLmluaXRTdGF0ZSYmZS5pbml0U3RhdGUoKSl9LF9nZXRIYW5kbGVyRnVuY3Rp
b246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9bmV3IHMuZGVmYXVsdCxyPWcuZ2V0T3duZXIodGhp
cyksbj1yLl9sb29rdXBGYWN0b3J5KCJyb3V0ZTpiYXNpYyIpO3JldHVybiBmdW5jdGlvbihvKXt2
YXIgYT0icm91dGU6IitvLHM9ci5sb29rdXAoYSk7cmV0dXJuIHRbb10/czoodFtvXT0hMCxzfHwo
ci5yZWdpc3RlcihhLG4uZXh0ZW5kKCkpLHM9ci5sb29rdXAoYSksaS5nZXQoZSwibmFtZXNwYWNl
LkxPR19BQ1RJVkVfR0VORVJBVElPTiIpKSxzLnJvdXRlTmFtZT1vLHMpfX0sX3NldHVwUm91dGVy
OmZ1bmN0aW9uKGUsdCl7dmFyIHIsbj10aGlzO2UuZ2V0SGFuZGxlcj10aGlzLl9nZXRIYW5kbGVy
RnVuY3Rpb24oKTt2YXIgaT1mdW5jdGlvbigpe3Quc2V0VVJMKHIpfTtpZihlLnVwZGF0ZVVSTD1m
dW5jdGlvbihlKXtyPWUsYy5kZWZhdWx0Lm9uY2UoaSl9LHQucmVwbGFjZVVSTCl7dmFyIG89ZnVu
Y3Rpb24oKXt0LnJlcGxhY2VVUkwocil9O2UucmVwbGFjZVVSTD1mdW5jdGlvbihlKXtyPWUsYy5k
ZWZhdWx0Lm9uY2Uobyl9fWUuZGlkVHJhbnNpdGlvbj1mdW5jdGlvbihlKXtuLmRpZFRyYW5zaXRp
b24oZSl9LGUud2lsbFRyYW5zaXRpb249ZnVuY3Rpb24oZSx0LHIpe24ud2lsbFRyYW5zaXRpb24o
ZSx0LHIpfX0sX3NlcmlhbGl6ZVF1ZXJ5UGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIHI9e307aih0
aGlzLGUsdCxmdW5jdGlvbihlLG4saSl7dmFyIG89aS51cmxLZXk7cltvXXx8KHJbb109W10pLHJb
b10ucHVzaCh7cXA6aSx2YWx1ZTpufSksZGVsZXRlIHRbZV19KTtmb3IodmFyIG4gaW4gcil7dmFy
IGk9cltuXSxvPWlbMF0ucXA7dFtvLnVybEtleV09by5yb3V0ZS5zZXJpYWxpemVRdWVyeVBhcmFt
KGlbMF0udmFsdWUsby51cmxLZXksby50eXBlKX19LF9kZXNlcmlhbGl6ZVF1ZXJ5UGFyYW1zOmZ1
bmN0aW9uKGUsdCl7aih0aGlzLGUsdCxmdW5jdGlvbihlLHIsbil7ZGVsZXRlIHRbZV0sdFtuLnBy
b3BdPW4ucm91dGUuZGVzZXJpYWxpemVRdWVyeVBhcmFtKHIsbi51cmxLZXksbi50eXBlKX0pfSxf
cHJ1bmVEZWZhdWx0UXVlcnlQYXJhbVZhbHVlczpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuX3F1
ZXJ5UGFyYW1zRm9yKGUpO2Zvcih2YXIgbiBpbiB0KXt2YXIgaT1yLm1hcFtuXTtpJiZpLnNlcmlh
bGl6ZWREZWZhdWx0VmFsdWU9PT10W25dJiZkZWxldGUgdFtuXX19LF9kb1RyYW5zaXRpb246ZnVu
Y3Rpb24oZSx0LHIpe3ZhciBuPWV8fG0uZ2V0QWN0aXZlVGFyZ2V0TmFtZSh0aGlzLnJvdXRlciks
aT17fTt0aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9uJiZsLmRlZmF1bHQoaSx0aGlzLnJvdXRl
ci5hY3RpdmVUcmFuc2l0aW9uLnF1ZXJ5UGFyYW1zKSxsLmRlZmF1bHQoaSxyKSx0aGlzLl9wcmVw
YXJlUXVlcnlQYXJhbXMobix0LGkpO3ZhciBvPW0ucm91dGVBcmdzKG4sdCxpKSxhPXRoaXMucm91
dGVyLnRyYW5zaXRpb25Uby5hcHBseSh0aGlzLnJvdXRlcixvKTtyZXR1cm4gQShhLHRoaXMpLGF9
LF9wcmVwYXJlUXVlcnlQYXJhbXM6ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2h5ZHJhdGVVbnN1cHBs
aWVkUXVlcnlQYXJhbXMoZSx0LHIpLHRoaXMuX3NlcmlhbGl6ZVF1ZXJ5UGFyYW1zKGUsciksdGhp
cy5fcHJ1bmVEZWZhdWx0UXVlcnlQYXJhbVZhbHVlcyhlLHIpfSxfcXVlcnlQYXJhbXNGb3I6ZnVu
Y3Rpb24oZSl7aWYodGhpcy5fcXBDYWNoZVtlXSlyZXR1cm4gdGhpcy5fcXBDYWNoZVtlXTt2YXIg
dD17fSxyPVtdO3RoaXMuX3FwQ2FjaGVbZV09e21hcDp0LHFwczpyfTtmb3IodmFyIG49dGhpcy5y
b3V0ZXIsbz1uLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IoZSksYT0wLHM9by5sZW5ndGg7YTxzOysr
YSl7dmFyIHU9b1thXSxjPW4uZ2V0SGFuZGxlcih1LmhhbmRsZXIpLGY9aS5nZXQoYywiX3FwIik7
ZiYmKGwuZGVmYXVsdCh0LGYubWFwKSxyLnB1c2guYXBwbHkocixmLnFwcykpfXJldHVybntxcHM6
cixtYXA6dH19LF9oeWRyYXRlVW5zdXBwbGllZFF1ZXJ5UGFyYW1zOmZ1bmN0aW9uKGUsdCxyKXt2
YXIgbj1OKHRoaXMsZSx0KSxvPW4uaGFuZGxlckluZm9zLGE9dGhpcy5fYnVja2V0Q2FjaGU7bS5z
dGFzaFBhcmFtTmFtZXModGhpcyxvKTtmb3IodmFyIHM9MCx1PW8ubGVuZ3RoO3M8dTsrK3MpZm9y
KHZhciBsPW9bc10uaGFuZGxlcixjPWkuZ2V0KGwsIl9xcCIpLGY9MCxkPWMucXBzLmxlbmd0aDtm
PGQ7KytmKXt2YXIgcD1jLnFwc1tmXSxoPXAucHJvcCBpbiByJiZwLnByb3B8fHAuc2NvcGVkUHJv
cGVydHlOYW1lIGluIHImJnAuc2NvcGVkUHJvcGVydHlOYW1lO2lmKGgpaCE9PXAuc2NvcGVkUHJv
cGVydHlOYW1lJiYocltwLnNjb3BlZFByb3BlcnR5TmFtZV09cltoXSxkZWxldGUgcltoXSk7ZWxz
ZXt2YXIgdj1tLmNhbGN1bGF0ZUNhY2hlS2V5KHAuY3RybCxwLnBhcnRzLG4ucGFyYW1zKTtyW3Au
c2NvcGVkUHJvcGVydHlOYW1lXT1hLmxvb2t1cCh2LHAucHJvcCxwLmRlZmF1bHRWYWx1ZSl9fX0s
X3NjaGVkdWxlTG9hZGluZ0V2ZW50OmZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FuY2VsU2xvd1RyYW5z
aXRpb25UaW1lcigpLHRoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXI9Yy5kZWZhdWx0LnNjaGVkdWxl
T25jZSgicm91dGVyVHJhbnNpdGlvbnMiLHRoaXMsIl9oYW5kbGVTbG93VHJhbnNpdGlvbiIsZSx0
KX0sY3VycmVudFN0YXRlOm51bGwsdGFyZ2V0U3RhdGU6bnVsbCxfaGFuZGxlU2xvd1RyYW5zaXRp
b246ZnVuY3Rpb24oZSx0KXt0aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9uJiYodGhpcy5zZXQo
InRhcmdldFN0YXRlIixiLmRlZmF1bHQuY3JlYXRlKHtlbWJlclJvdXRlcjp0aGlzLHJvdXRlckpz
OnRoaXMucm91dGVyLHJvdXRlckpzU3RhdGU6dGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbi5z
dGF0ZX0pKSxlLnRyaWdnZXIoITAsImxvYWRpbmciLGUsdCkpfSxfY2FuY2VsU2xvd1RyYW5zaXRp
b25UaW1lcjpmdW5jdGlvbigpe3RoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXImJmMuZGVmYXVsdC5j
YW5jZWwodGhpcy5fc2xvd1RyYW5zaXRpb25UaW1lciksdGhpcy5fc2xvd1RyYW5zaXRpb25UaW1l
cj1udWxsfSxfbWFya0Vycm9yQXNIYW5kbGVkOmZ1bmN0aW9uKGUpe3RoaXMuX2hhbmRsZWRFcnJv
cnNbZV09ITB9LF9pc0Vycm9ySGFuZGxlZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faGFuZGxl
ZEVycm9yc1tlXX0sX2NsZWFySGFuZGxlZEVycm9yOmZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLl9o
YW5kbGVkRXJyb3JzW2VdfX0pLEg9e3dpbGxSZXNvbHZlTW9kZWw6ZnVuY3Rpb24oZSx0KXt0LnJv
dXRlci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQoZSx0KX0sZXJyb3I6ZnVuY3Rpb24oZSx0LHIpe3Zh
ciBuPXIucm91dGVyLGk9ayhyLHQsZnVuY3Rpb24odCxyKXt2YXIgaT1FKHQsciwiZXJyb3IiKTty
ZXR1cm4haXx8dm9pZCBuLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbyhpLGUpfSk7cmV0dXJuIGkm
Jk8oci5yb3V0ZXIsImFwcGxpY2F0aW9uX2Vycm9yIik/dm9pZCBuLmludGVybWVkaWF0ZVRyYW5z
aXRpb25UbygiYXBwbGljYXRpb25fZXJyb3IiLGUpOnZvaWQgQyhlLCJFcnJvciB3aGlsZSBwcm9j
ZXNzaW5nIHJvdXRlOiAiK3QudGFyZ2V0TmFtZSl9LGxvYWRpbmc6ZnVuY3Rpb24oZSx0KXt2YXIg
cj10LnJvdXRlcixuPWsodCxlLGZ1bmN0aW9uKHQsbil7dmFyIGk9RSh0LG4sImxvYWRpbmciKTty
ZXR1cm4gaT92b2lkIHIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKGkpOmUucGl2b3RIYW5kbGVy
IT09dHx8dm9pZCAwfSk7aWYobiYmTyh0LnJvdXRlciwiYXBwbGljYXRpb25fbG9hZGluZyIpKXJl
dHVybiB2b2lkIHIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCJhcHBsaWNhdGlvbl9sb2FkaW5n
Iil9fTtGLnJlb3BlbkNsYXNzKHtyb3V0ZXI6bnVsbCxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRo
aXMuZHNsQ2FsbGJhY2tzfHwodGhpcy5kc2xDYWxsYmFja3M9W10sdGhpcy5yZW9wZW5DbGFzcyh7
ZHNsQ2FsbGJhY2tzOnRoaXMuZHNsQ2FsbGJhY2tzfSkpLHRoaXMuZHNsQ2FsbGJhY2tzLnB1c2go
ZSksdGhpc30sX3JvdXRlUGF0aDpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7Zm9yKHZhciBy
PTAsbj1lLmxlbmd0aDtyPG47KytyKWlmKGVbcl0hPT10W3JdKXJldHVybiExO3JldHVybiEwfWZv
cih2YXIgcixuLGksbz1bXSxhPTEscz1lLmxlbmd0aDthPHM7YSsrKXtmb3Iocj1lW2FdLm5hbWUs
bj1yLnNwbGl0KCIuIiksaT1JLmNhbGwobyk7aS5sZW5ndGgmJiF0KGksbik7KWkuc2hpZnQoKTtv
LnB1c2guYXBwbHkobyxuLnNsaWNlKGkubGVuZ3RoKSl9cmV0dXJuIG8uam9pbigiLiIpfX0pLGUu
ZGVmYXVsdD1GfSksZSgiZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGVyX3N0YXRlIixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbC9pc19lbXB0eSIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCIs
ImVtYmVyLW1ldGFsL2Fzc2lnbiJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5j
dGlvbiBpKGUsdCl7dmFyIHI7Zm9yKHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpJiZlW3Jd
IT09dFtyXSlyZXR1cm4hMTtmb3IociBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikmJmVbcl0h
PT10W3JdKXJldHVybiExO3JldHVybiEwfXZhciBvPU9iamVjdC5rZXlzLGE9ci5kZWZhdWx0LmV4
dGVuZCh7ZW1iZXJSb3V0ZXI6bnVsbCxyb3V0ZXJKczpudWxsLHJvdXRlckpzU3RhdGU6bnVsbCxp
c0FjdGl2ZUludGVudDpmdW5jdGlvbihlLHIsYSxzKXt2YXIgdT10aGlzLnJvdXRlckpzU3RhdGU7
aWYoIXRoaXMucm91dGVySnMuaXNBY3RpdmVJbnRlbnQoZSxyLG51bGwsdSkpcmV0dXJuITE7dmFy
IGw9dC5kZWZhdWx0KG8oYSkpO2lmKHMmJiFsKXt2YXIgYz17fTtyZXR1cm4gbi5kZWZhdWx0KGMs
YSksdGhpcy5lbWJlclJvdXRlci5fcHJlcGFyZVF1ZXJ5UGFyYW1zKGUscixjKSxpKGMsdS5xdWVy
eVBhcmFtcyl9cmV0dXJuITB9fSk7ZS5kZWZhdWx0PWF9KSxlKCJlbWJlci1yb3V0aW5nL3V0aWxz
IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9n
ZXQiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0LHIpe3ZhciBu
PVtdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmbi5wdXNoKCIiK2UpLG4ucHVzaC5hcHBseShu
LHQpLG4ucHVzaCh7cXVlcnlQYXJhbXM6cn0pLG59ZnVuY3Rpb24gaShlKXt2YXIgdD1lLmFjdGl2
ZVRyYW5zaXRpb24/ZS5hY3RpdmVUcmFuc2l0aW9uLnN0YXRlLmhhbmRsZXJJbmZvczplLnN0YXRl
LmhhbmRsZXJJbmZvcztyZXR1cm4gdFt0Lmxlbmd0aC0xXS5uYW1lfWZ1bmN0aW9uIG8oZSx0KXtp
ZighdC5fbmFtZXNTdGFzaGVkKXtmb3IodmFyIHI9dFt0Lmxlbmd0aC0xXS5uYW1lLG49ZS5yb3V0
ZXIucmVjb2duaXplci5oYW5kbGVyc0ZvcihyKSxpPW51bGwsbz0wLGE9dC5sZW5ndGg7bzxhOysr
byl7dmFyIHM9dFtvXSx1PW5bb10ubmFtZXM7dS5sZW5ndGgmJihpPXMpLHMuX25hbWVzPXU7dmFy
IGw9cy5oYW5kbGVyO2wuX3N0YXNoTmFtZXMocyxpKX10Ll9uYW1lc1N0YXNoZWQ9ITB9fWZ1bmN0
aW9uIGEoZSx0KXtmb3IodmFyIHI9ZS5zcGxpdCgiLiIpLG49IiIsaT0wLG89ci5sZW5ndGg7aTxv
O2krKyl7dmFyIGE9ci5zbGljZSgwLGkrMSkuam9pbigiLiIpO2lmKDAhPT10LmluZGV4T2YoYSkp
YnJlYWs7bj1hfXJldHVybiBufWZ1bmN0aW9uIHMoZSx0LG4pe2Zvcih2YXIgaT10fHxbXSxvPSIi
LHM9MCx1PWkubGVuZ3RoO3M8dTsrK3Mpe3ZhciBsLGY9aVtzXSxkPWEoZSxmKTtpZihuKWlmKGQm
JmQgaW4gbil7dmFyIHA9MD09PWYuaW5kZXhPZihkKT9mLnN1YnN0cihkLmxlbmd0aCsxKTpmO2w9
ci5nZXQobltkXSxwKX1lbHNlIGw9ci5nZXQobixmKTtvKz0iOjoiK2YrIjoiK2x9cmV0dXJuIGUr
by5yZXBsYWNlKGMsIi0iKX1mdW5jdGlvbiB1KGUpe2lmKGUuX3FwTWFwKXJldHVybiBlLl9xcE1h
cDtmb3IodmFyIHQ9ZS5fcXBNYXA9e30scj0wLG49ZS5sZW5ndGg7cjxuOysrcilsKGVbcl0sdCk7
cmV0dXJuIHR9ZnVuY3Rpb24gbChlLHIpe3ZhciBuLGk9ZTsic3RyaW5nIj09dHlwZW9mIGkmJihu
PXt9LG5baV09e2FzOm51bGx9LGk9bik7Zm9yKHZhciBvIGluIGkpe2lmKCFpLmhhc093blByb3Bl
cnR5KG8pKXJldHVybjt2YXIgYT1pW29dOyJzdHJpbmciPT10eXBlb2YgYSYmKGE9e2FzOmF9KSxu
PXJbb118fHthczpudWxsLHNjb3BlOiJtb2RlbCJ9LHQuZGVmYXVsdChuLGEpLHJbb109bn19ZS5y
b3V0ZUFyZ3M9bixlLmdldEFjdGl2ZVRhcmdldE5hbWU9aSxlLnN0YXNoUGFyYW1OYW1lcz1vLGUu
Y2FsY3VsYXRlQ2FjaGVLZXk9cyxlLm5vcm1hbGl6ZUNvbnRyb2xsZXJRdWVyeVBhcmFtcz11O3Zh
ciBjPS9cLi9nfSksZSgiZW1iZXItcnVudGltZS9jb21wYXJlIixbImV4cG9ydHMiLCJlbWJlci1y
dW50aW1lL3V0aWxzIiwiZW1iZXItcnVudGltZS9taXhpbnMvY29tcGFyYWJsZSJdLGZ1bmN0aW9u
KGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQpe3ZhciByPWUtdDtyZXR1cm4ocj4w
KS0ocjwwKX1mdW5jdGlvbiBpKGUsYSl7aWYoZT09PWEpcmV0dXJuIDA7dmFyIHM9dC50eXBlT2Yo
ZSksdT10LnR5cGVPZihhKTtpZihyLmRlZmF1bHQpe2lmKCJpbnN0YW5jZSI9PT1zJiZyLmRlZmF1
bHQuZGV0ZWN0KGUpJiZlLmNvbnN0cnVjdG9yLmNvbXBhcmUpcmV0dXJuIGUuY29uc3RydWN0b3Iu
Y29tcGFyZShlLGEpO2lmKCJpbnN0YW5jZSI9PT11JiZyLmRlZmF1bHQuZGV0ZWN0KGEpJiZhLmNv
bnN0cnVjdG9yLmNvbXBhcmUpcmV0dXJuIGEuY29uc3RydWN0b3IuY29tcGFyZShhLGUpKi0xfXZh
ciBsPW4ob1tzXSxvW3VdKTtpZigwIT09bClyZXR1cm4gbDtzd2l0Y2gocyl7Y2FzZSJib29sZWFu
IjpjYXNlIm51bWJlciI6cmV0dXJuIG4oZSxhKTtjYXNlInN0cmluZyI6cmV0dXJuIG4oZS5sb2Nh
bGVDb21wYXJlKGEpLDApO2Nhc2UiYXJyYXkiOmZvcih2YXIgYz1lLmxlbmd0aCxmPWEubGVuZ3Ro
LGQ9TWF0aC5taW4oYyxmKSxwPTA7cDxkO3ArKyl7dmFyIGg9aShlW3BdLGFbcF0pO2lmKDAhPT1o
KXJldHVybiBofXJldHVybiBuKGMsZik7Y2FzZSJpbnN0YW5jZSI6cmV0dXJuIHIuZGVmYXVsdCYm
ci5kZWZhdWx0LmRldGVjdChlKT9lLmNvbXBhcmUoZSxhKTowO2Nhc2UiZGF0ZSI6cmV0dXJuIG4o
ZS5nZXRUaW1lKCksYS5nZXRUaW1lKCkpO2RlZmF1bHQ6cmV0dXJuIDB9fWUuZGVmYXVsdD1pO3Zh
ciBvPXt1bmRlZmluZWQ6MCxudWxsOjEsYm9vbGVhbjoyLG51bWJlcjozLHN0cmluZzo0LGFycmF5
OjUsb2JqZWN0OjYsaW5zdGFuY2U6NyxmdW5jdGlvbjo4LGNsYXNzOjksZGF0ZToxMH19KSxlKCJl
bWJlci1ydW50aW1lL2NvbXB1dGVkL3JlZHVjZV9jb21wdXRlZF9tYWNyb3MiLFsiZXhwb3J0cyIs
ImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0
YWwvZXJyb3IiLCJlbWJlci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL29ic2VydmVyIiwi
ZW1iZXItcnVudGltZS9jb21wYXJlIiwiZW1iZXItcnVudGltZS91dGlscyIsImVtYmVyLXJ1bnRp
bWUvc3lzdGVtL25hdGl2ZV9hcnJheSIsImVtYmVyLW1ldGFsL2lzX25vbmUiLCJlbWJlci1tZXRh
bC9nZXRfcHJvcGVydGllcyIsImVtYmVyLW1ldGFsL2VtcHR5X29iamVjdCIsImVtYmVyLW1ldGFs
L3V0aWxzIiwiZW1iZXItbWV0YWwvd2Vha19tYXAiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMs
dSxsLGMsZixkLHApeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBoKGUsdCxuKXtyZXR1cm4gaS5jb21w
dXRlZChlKyIuW10iLGZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxvPXIuZ2V0KHRoaXMsZSk7cmV0dXJu
IG51bGw9PT1vfHwib2JqZWN0IiE9dHlwZW9mIG8/bjpvLnJlZHVjZShmdW5jdGlvbihlLHIsbixv
KXtyZXR1cm4gdC5jYWxsKGksZSxyLG4sbyl9LG4pfSkucmVhZE9ubHkoKX1mdW5jdGlvbiBtKGUs
dCl7dmFyIG47cmV0dXJuL0BlYWNoLy50ZXN0KGUpP249ZS5yZXBsYWNlKC9cLkBlYWNoLiokLywi
Iik6KG49ZSxlKz0iLltdIiksaS5jb21wdXRlZChlLGZ1bmN0aW9uKCl7dmFyIGU9ci5nZXQodGhp
cyxuKTtyZXR1cm4gcy5pc0FycmF5KGUpP3UuQSh0LmNhbGwodGhpcyxlKSk6dS5BKCl9KS5yZWFk
T25seSgpfWZ1bmN0aW9uIHYoZSx0KXt2YXIgcj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsi
LltdIn0pO3JldHVybiByLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gdS5BKHQuY2FsbCh0aGlzLGUp
KX0pLGkuY29tcHV0ZWQuYXBwbHkodGhpcyxyKS5yZWFkT25seSgpfWZ1bmN0aW9uIGIoZSl7cmV0
dXJuIGgoZSxmdW5jdGlvbihlLHQpe3JldHVybiBlK3R9LDApfWZ1bmN0aW9uIGcoZSl7cmV0dXJu
IGgoZSxmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1heChlLHQpfSwtKDEvMCkpfWZ1bmN0aW9u
IHkoZSl7cmV0dXJuIGgoZSxmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1pbihlLHQpfSwxLzAp
fWZ1bmN0aW9uIF8oZSx0KXtyZXR1cm4gbShlLGZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcCh0LHRo
aXMpfSl9ZnVuY3Rpb24gdyhlLHQpe3JldHVybiBfKGUrIi5AZWFjaC4iK3QsZnVuY3Rpb24oZSl7
cmV0dXJuIHIuZ2V0KGUsdCl9KX1mdW5jdGlvbiB4KGUsdCl7cmV0dXJuIG0oZSxmdW5jdGlvbihl
KXtyZXR1cm4gZS5maWx0ZXIodCx0aGlzKX0pfWZ1bmN0aW9uIGsoZSx0LG4pe3ZhciBpO3JldHVy
biBpPTI9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKGUpe3JldHVybiByLmdldChlLHQpfTpm
dW5jdGlvbihlKXtyZXR1cm4gci5nZXQoZSx0KT09PW59LHgoZSsiLkBlYWNoLiIrdCxpKX1mdW5j
dGlvbiBDKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxuPTA7bjxlO24r
Kyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdih0LGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj11
LkEoKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPXIuZ2V0KHQsZSk7cy5pc0Fy
cmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5pbmRleE9mKGUpPT09LTEmJm4ucHVzaChl
KX0pfSksbn0pfWZ1bmN0aW9uIEUoZSx0KXtyZXR1cm4gaS5jb21wdXRlZChlKyIuW10iLGZ1bmN0
aW9uKCl7dmFyIG49dS5BKCksaT1uZXcgZi5kZWZhdWx0LG89ci5nZXQodGhpcyxlKTtyZXR1cm4g
cy5pc0FycmF5KG8pJiZvLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG89ZC5ndWlkRm9yKHIuZ2V0
KGUsdCkpO28gaW4gaXx8KGlbb109ITAsbi5wdXNoKGUpKX0pLG59KS5yZWFkT25seSgpfWZ1bmN0
aW9uIE8oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisr
KXRbbl09YXJndW1lbnRzW25dO3JldHVybiB2KHQsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWUu
bWFwKGZ1bmN0aW9uKGUpe3ZhciBuPXIuZ2V0KHQsZSk7cmV0dXJuIHMuaXNBcnJheShuKT9uOltd
fSksaT1uLnBvcCgpLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3Qr
Kyl7Zm9yKHZhciByPSExLGk9blt0XSxvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXT09PWUpe3I9
ITA7YnJlYWt9aWYocj09PSExKXJldHVybiExfXJldHVybiEwfSk7cmV0dXJuIHUuQShpKX0pfWZ1
bmN0aW9uIFQoZSx0KXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgbi5kZWZhdWx0
KCJzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkgdHdvIGRlcGVuZGVudCBhcnJheXMuIik7cmV0dXJu
IGkuY29tcHV0ZWQoZSsiLltdIix0KyIuW10iLGZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5nZXQoZSks
bj10aGlzLmdldCh0KTtyZXR1cm4gcy5pc0FycmF5KHIpP3MuaXNBcnJheShuKT9yLmZpbHRlcihm
dW5jdGlvbihlKXtyZXR1cm4gbi5pbmRleE9mKGUpPT09LTF9KTp1LkEocik6dS5BKCl9KS5yZWFk
T25seSgpfWZ1bmN0aW9uIE4oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUp
LHI9MDtyPGU7cisrKXRbcl09YXJndW1lbnRzW3JdO3JldHVybiB2KHQsZnVuY3Rpb24oKXt2YXIg
ZT1jLmRlZmF1bHQodGhpcyx0KSxyPXUuQSgpO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVy
dHkobikmJihsLmRlZmF1bHQoZVtuXSk/ci5wdXNoKG51bGwpOnIucHVzaChlW25dKSk7cmV0dXJu
IHJ9KX1mdW5jdGlvbiBTKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/QShlLHQpOlAo
ZSx0KX1mdW5jdGlvbiBBKGUsdCl7cmV0dXJuIG0oZSxmdW5jdGlvbihlKXt2YXIgcj10aGlzO3Jl
dHVybiBlLnNsaWNlKCkuc29ydChmdW5jdGlvbihlLG4pe3JldHVybiB0LmNhbGwocixlLG4pfSl9
KX1mdW5jdGlvbiBQKGUsdCl7dmFyIG49bmV3IGkuQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihp
KXtmdW5jdGlvbiBhKCl7dGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZShpKX12YXIgbD10aGlzLGM9
IkB0aGlzIj09PWUsZj1yLmdldCh0aGlzLHQpLGQ9aihmKSxoPW4uX2FjdGl2ZU9ic2VydmVyTWFw
fHwobi5fYWN0aXZlT2JzZXJ2ZXJNYXA9bmV3IHAuZGVmYXVsdCksbT1oLmdldCh0aGlzKTttJiZt
LmZvckVhY2goZnVuY3Rpb24oZSl7by5yZW1vdmVPYnNlcnZlci5hcHBseShudWxsLGUpfSksbT1k
Lm1hcChmdW5jdGlvbih0KXt2YXIgcj10WzBdLG49Yz8iQGVhY2guIityOmUrIi5AZWFjaC4iK3Is
aT1bbCxuLGFdO3JldHVybiBvLmFkZE9ic2VydmVyLmFwcGx5KG51bGwsaSksaX0pLGguc2V0KHRo
aXMsbSk7dmFyIHY9Yz90aGlzOnIuZ2V0KHRoaXMsZSk7cmV0dXJuIHMuaXNBcnJheSh2KT9SKHYs
ZCk6dS5BKCl9KTtyZXR1cm4gbi5fYWN0aXZlT2JzZXJ2ZXJNYXA9dm9pZCAwLG4ucHJvcGVydHko
dCsiLltdIikucmVhZE9ubHkoKX1mdW5jdGlvbiBqKGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihl
KXt2YXIgdD1lLnNwbGl0KCI6Iikscj10WzBdLG49dFsxXTtyZXR1cm4gbj1ufHwiYXNjIixbcixu
XX0pfWZ1bmN0aW9uIFIoZSx0KXtyZXR1cm4gdS5BKGUuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKGUs
bil7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV0scz1vWzBdLHU9b1sxXSxs
PWEuZGVmYXVsdChyLmdldChlLHMpLHIuZ2V0KG4scykpO2lmKDAhPT1sKXJldHVybiJkZXNjIj09
PXU/LTEqbDpsfXJldHVybiAwfSkpfWUuc3VtPWIsZS5tYXg9ZyxlLm1pbj15LGUubWFwPV8sZS5t
YXBCeT13LGUuZmlsdGVyPXgsZS5maWx0ZXJCeT1rLGUudW5pcT1DLGUudW5pcUJ5PUUsZS5pbnRl
cnNlY3Q9TyxlLnNldERpZmY9VCxlLmNvbGxlY3Q9TixlLnNvcnQ9Uzt2YXIgTD1DO2UudW5pb249
TH0pLGUoImVtYmVyLXJ1bnRpbWUvY29udHJvbGxlcnMvY29udHJvbGxlciIsWyJleHBvcnRzIiwi
ZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QiLCJlbWJlci1y
dW50aW1lL21peGlucy9jb250cm9sbGVyIiwiZW1iZXItcnVudGltZS9pbmplY3QiLCJlbWJlci1y
dW50aW1lL21peGlucy9hY3Rpb25faGFuZGxlciJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNl
IHN0cmljdCI7ZnVuY3Rpb24gYShlKXt9dmFyIHM9ci5kZWZhdWx0LmV4dGVuZChuLmRlZmF1bHQp
O28uZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMocyksaS5jcmVhdGVJbmplY3Rpb25IZWxwZXIo
ImNvbnRyb2xsZXIiLGEpLGUuZGVmYXVsdD1zfSksZSgiZW1iZXItcnVudGltZS9jb3B5IixbImV4
cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCIs
ImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvcHlhYmxlIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIGkoZSx0LHIsbyl7dmFyIGEscyx1O2lmKCJvYmplY3QiIT10eXBlb2Yg
ZXx8bnVsbD09PWUpcmV0dXJuIGU7aWYodCYmKHM9ci5pbmRleE9mKGUpKT49MClyZXR1cm4gb1tz
XTtpZihBcnJheS5pc0FycmF5KGUpKXtpZihhPWUuc2xpY2UoKSx0KWZvcihzPWEubGVuZ3RoOy0t
cz49MDspYVtzXT1pKGFbc10sdCxyLG8pfWVsc2UgaWYobi5kZWZhdWx0JiZuLmRlZmF1bHQuZGV0
ZWN0KGUpKWE9ZS5jb3B5KHQscixvKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBEYXRlKWE9bmV3IERh
dGUoZS5nZXRUaW1lKCkpO2Vsc2V7YT17fTtmb3IodSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFz
T3duUHJvcGVydHkuY2FsbChlLHUpJiYiX18iIT09dS5zdWJzdHJpbmcoMCwyKSYmKGFbdV09dD9p
KGVbdV0sdCxyLG8pOmVbdV0pfXJldHVybiB0JiYoci5wdXNoKGUpLG8ucHVzaChhKSksYX1mdW5j
dGlvbiBvKGUsdCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZT9lOm4uZGVmYXVs
dCYmbi5kZWZhdWx0LmRldGVjdChlKT9lLmNvcHkodCk6aShlLHQsdD9bXTpudWxsLHQ/W106bnVs
bCl9ZS5kZWZhdWx0PW99KSxlKCJlbWJlci1ydW50aW1lL2NvcmUiLFsiZXhwb3J0cyJdLGZ1bmN0
aW9uKGUpeyJ1c2Ugc3RyaWN0In0pLGUoImVtYmVyLXJ1bnRpbWUvZXh0L2Z1bmN0aW9uIixbImV4
cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRh
bC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL21peGluIl0sZnVuY3Rpb24oZSx0LHIsbixpKXsidXNl
IHN0cmljdCI7dmFyIG89QXJyYXkucHJvdG90eXBlLnNsaWNlLGE9RnVuY3Rpb24ucHJvdG90eXBl
Oyh0LmRlZmF1bHQuRVhURU5EX1BST1RPVFlQRVM9PT0hMHx8dC5kZWZhdWx0LkVYVEVORF9QUk9U
T1RZUEVTLkZ1bmN0aW9uKSYmKGEucHJvcGVydHk9ZnVuY3Rpb24oKXt2YXIgZT1uLmNvbXB1dGVk
KHRoaXMpO3JldHVybiBlLnByb3BlcnR5LmFwcGx5KGUsYXJndW1lbnRzKX0sYS5vYnNlcnZlcz1m
dW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSkscj0wO3I8ZTty
KyspdFtyXT1hcmd1bWVudHNbcl07cmV0dXJuIHQucHVzaCh0aGlzKSxpLm9ic2VydmVyLmFwcGx5
KHRoaXMsdCl9LGEuX29ic2VydmVzSW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5v
YnNlcnZlcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGEub2JzZXJ2ZXNJbW1lZGlhdGVseT1yLmRl
cHJlY2F0ZUZ1bmMoIkZ1bmN0aW9uI29ic2VydmVzSW1tZWRpYXRlbHkgaXMgZGVwcmVjYXRlZC4g
VXNlIEZ1bmN0aW9uI29ic2VydmVzIGluc3RlYWQiLHtpZDoiZW1iZXItcnVudGltZS5leHQtZnVu
Y3Rpb24iLHVudGlsOiIzLjAuMCJ9LGEuX29ic2VydmVzSW1tZWRpYXRlbHkpLGEub249ZnVuY3Rp
b24oKXt2YXIgZT1vLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5fX2VtYmVyX2xpc3RlbnNf
Xz1lLHRoaXN9KX0pLGUoImVtYmVyLXJ1bnRpbWUvZXh0L3JzdnAiLFsiZXhwb3J0cyIsImVtYmVy
LW1ldGFsL2NvcmUiLCJyZXF1aXJlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9s
b2dnZXIiLCJlbWJlci1tZXRhbC9ydW5fbG9vcCIsInJzdnAiXSxmdW5jdGlvbihlLHQscixuLGks
byxhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcyhlKXt2YXIgbjtpZihlJiZlLmVycm9yVGhyb3du
PyhuPWUuZXJyb3JUaHJvd24sInN0cmluZyI9PXR5cGVvZiBuJiYobj1uZXcgRXJyb3IobikpLE9i
amVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX3JlYXNvbl93aXRoX2Vycm9yX3Rocm93bl9fIix7dmFs
dWU6ZSxlbnVtZXJhYmxlOiExfSkpOm49ZSwoIW58fCJVbnJlY29nbml6ZWRVUkxFcnJvciIhPT1u
Lm5hbWUpJiZuJiYiVHJhbnNpdGlvbkFib3J0ZWQiIT09bi5uYW1lKWlmKHQuZGVmYXVsdC50ZXN0
aW5nKXtpZighbCYmci5oYXMoYykmJihsPXIuZGVmYXVsdChjKS5kZWZhdWx0KSwhbHx8IWwuYWRh
cHRlcil0aHJvdyBuO2wuYWRhcHRlci5leGNlcHRpb24obiksaS5kZWZhdWx0LmVycm9yKG4uc3Rh
Y2spfWVsc2UgdC5kZWZhdWx0Lm9uZXJyb3I/dC5kZWZhdWx0Lm9uZXJyb3Iobik6aS5kZWZhdWx0
LmVycm9yKG4uc3RhY2spfWZ1bmN0aW9uIHUoZSl7by5kZWZhdWx0LnNjaGVkdWxlKG8uZGVmYXVs
dC5xdWV1ZXNbby5kZWZhdWx0LnF1ZXVlcy5sZW5ndGgtMV0sZSl9ZS5vbmVycm9yRGVmYXVsdD1z
LGUuYWZ0ZXI9dTt2YXIgbCxjPSJlbWJlci10ZXN0aW5nL3Rlc3QiLGY9ZnVuY3Rpb24oKXt0LmRl
ZmF1bHQuVGVzdCYmdC5kZWZhdWx0LlRlc3QuYWRhcHRlciYmdC5kZWZhdWx0LlRlc3QuYWRhcHRl
ci5hc3luY1N0YXJ0KCl9LGQ9ZnVuY3Rpb24oKXt0LmRlZmF1bHQuVGVzdCYmdC5kZWZhdWx0LlRl
c3QuYWRhcHRlciYmdC5kZWZhdWx0LlRlc3QuYWRhcHRlci5hc3luY0VuZCgpfTthLmNvbmZpZ3Vy
ZSgiYXN5bmMiLGZ1bmN0aW9uKGUscil7dmFyIG49IW8uZGVmYXVsdC5jdXJyZW50UnVuTG9vcDt0
LmRlZmF1bHQudGVzdGluZyYmbiYmZigpLG8uZGVmYXVsdC5iYWNrYnVybmVyLnNjaGVkdWxlKCJh
Y3Rpb25zIixmdW5jdGlvbigpe3QuZGVmYXVsdC50ZXN0aW5nJiZuJiZkKCksZShyKX0pfSksYS5v
bigiZXJyb3IiLHMpLGEuY29uZmlndXJlKCJhZnRlciIsdSksZS5kZWZhdWx0PWF9KSxlKCJlbWJl
ci1ydW50aW1lL2V4dC9zdHJpbmciLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJl
ci1ydW50aW1lL3N5c3RlbS9zdHJpbmciXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3Zh
ciBuPVN0cmluZy5wcm90b3R5cGU7KHQuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUz09PSEwfHx0
LmRlZmF1bHQuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nKSYmKG4uZm10PWZ1bmN0aW9uKCl7Zm9y
KHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3Vt
ZW50c1tuXTtyZXR1cm4gci5mbXQodGhpcyx0KX0sbi53PWZ1bmN0aW9uKCl7cmV0dXJuIHIudyh0
aGlzKX0sbi5sb2M9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5
KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiByLmxvYyh0aGlzLHQpfSxu
LmNhbWVsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHIuY2FtZWxpemUodGhpcyl9LG4uZGVjYW1lbGl6
ZT1mdW5jdGlvbigpe3JldHVybiByLmRlY2FtZWxpemUodGhpcyl9LG4uZGFzaGVyaXplPWZ1bmN0
aW9uKCl7cmV0dXJuIHIuZGFzaGVyaXplKHRoaXMpfSxuLnVuZGVyc2NvcmU9ZnVuY3Rpb24oKXty
ZXR1cm4gci51bmRlcnNjb3JlKHRoaXMpfSxuLmNsYXNzaWZ5PWZ1bmN0aW9uKCl7cmV0dXJuIHIu
Y2xhc3NpZnkodGhpcyl9LG4uY2FwaXRhbGl6ZT1mdW5jdGlvbigpe3JldHVybiByLmNhcGl0YWxp
emUodGhpcyl9KX0pLGUoImVtYmVyLXJ1bnRpbWUvaW5kZXgiLFsiZXhwb3J0cyIsImVtYmVyLW1l
dGFsIiwiZW1iZXItcnVudGltZS9pcy1lcXVhbCIsImVtYmVyLXJ1bnRpbWUvY29tcGFyZSIsImVt
YmVyLXJ1bnRpbWUvY29weSIsImVtYmVyLXJ1bnRpbWUvaW5qZWN0IiwiZW1iZXItcnVudGltZS9z
eXN0ZW0vbmFtZXNwYWNlIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0IiwiZW1iZXItcnVu
dGltZS9zeXN0ZW0vY29udGFpbmVyIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vYXJyYXlfcHJveHki
LCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3RfcHJveHkiLCJlbWJlci1ydW50aW1lL3N5c3Rl
bS9jb3JlX29iamVjdCIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2ZV9hcnJheSIsImVtYmVy
LXJ1bnRpbWUvc3lzdGVtL3N0cmluZyIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL2xhenlfbG9hZCIs
ImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5IiwiZW1iZXItcnVudGltZS9taXhpbnMvY29tcGFy
YWJsZSIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvcHlhYmxlIiwiZW1iZXItcnVudGltZS9taXhp
bnMvZW51bWVyYWJsZSIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2ZyZWV6YWJsZSIsImVtYmVyLXJ1
bnRpbWUvbWl4aW5zLy1wcm94eSIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL29ic2VydmFibGUiLCJl
bWJlci1ydW50aW1lL21peGlucy9hY3Rpb25faGFuZGxlciIsImVtYmVyLXJ1bnRpbWUvbWl4aW5z
L211dGFibGVfZW51bWVyYWJsZSIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL211dGFibGVfYXJyYXki
LCJlbWJlci1ydW50aW1lL21peGlucy90YXJnZXRfYWN0aW9uX3N1cHBvcnQiLCJlbWJlci1ydW50
aW1lL21peGlucy9ldmVudGVkIiwiZW1iZXItcnVudGltZS9taXhpbnMvcHJvbWlzZV9wcm94eSIs
ImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwiZW1iZXItcnVudGltZS9jb21wdXRlZC9yZWR1Y2VfY29t
cHV0ZWRfbWFjcm9zIiwiZW1iZXItcnVudGltZS9jb250cm9sbGVycy9jb250cm9sbGVyIiwiZW1i
ZXItcnVudGltZS9taXhpbnMvY29udHJvbGxlciIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL3NlcnZp
Y2UiLCJlbWJlci1ydW50aW1lL2V4dC9yc3ZwIiwiZW1iZXItcnVudGltZS9leHQvc3RyaW5nIiwi
ZW1iZXItcnVudGltZS9leHQvZnVuY3Rpb24iLCJlbWJlci1ydW50aW1lL3V0aWxzIiwiZW1iZXIt
cnVudGltZS9taXhpbnMvcmVnaXN0cnlfcHJveHkiLCJlbWJlci1ydW50aW1lL21peGlucy9jb250
YWluZXJfcHJveHkiLCJlbWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeSJdLGZ1bmN0aW9uKGUs
dCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCxoLG0sdixiLGcseSxfLHcseCxrLEMsRSxPLFQsTixT
LEEsUCxqLFIsTCxELE0sSSxGLEgpeyJ1c2Ugc3RyaWN0Ijt0LmRlZmF1bHQuY29tcGFyZT1uLmRl
ZmF1bHQsdC5kZWZhdWx0LmNvcHk9aS5kZWZhdWx0LHQuZGVmYXVsdC5pc0VxdWFsPXIuZGVmYXVs
dCx0LmRlZmF1bHQuaW5qZWN0PW8uZGVmYXVsdCx0LmRlZmF1bHQuQXJyYXk9bS5kZWZhdWx0LHQu
ZGVmYXVsdC5Db21wYXJhYmxlPXYuZGVmYXVsdCx0LmRlZmF1bHQuQ29weWFibGU9Yi5kZWZhdWx0
LHQuZGVmYXVsdC5GcmVlemFibGU9eS5GcmVlemFibGUsdC5kZWZhdWx0LkZST1pFTl9FUlJPUj15
LkZST1pFTl9FUlJPUix0LmRlZmF1bHQuTXV0YWJsZUVudW1lcmFibGU9ay5kZWZhdWx0LHQuZGVm
YXVsdC5NdXRhYmxlQXJyYXk9Qy5kZWZhdWx0LHQuZGVmYXVsdC5UYXJnZXRBY3Rpb25TdXBwb3J0
PUUuZGVmYXVsdCx0LmRlZmF1bHQuRXZlbnRlZD1PLmRlZmF1bHQsdC5kZWZhdWx0LlByb21pc2VQ
cm94eU1peGluPVQuZGVmYXVsdCx0LmRlZmF1bHQuT2JzZXJ2YWJsZT13LmRlZmF1bHQsdC5kZWZh
dWx0LnR5cGVPZj1NLnR5cGVPZix0LmRlZmF1bHQuaXNBcnJheT1NLmlzQXJyYXk7dmFyIFY9dC5k
ZWZhdWx0LmNvbXB1dGVkO1Yuc3VtPVMuc3VtLFYubWluPVMubWluLFYubWF4PVMubWF4LFYubWFw
PVMubWFwLFYuc29ydD1TLnNvcnQsVi5zZXREaWZmPVMuc2V0RGlmZixWLm1hcEJ5PVMubWFwQnks
Vi5maWx0ZXI9Uy5maWx0ZXIsVi5maWx0ZXJCeT1TLmZpbHRlckJ5LFYudW5pcT1TLnVuaXEsVi51
bmlvbj1TLnVuaW9uLFYuaW50ZXJzZWN0PVMuaW50ZXJzZWN0LFYuY29sbGVjdD1TLmNvbGxlY3Qs
dC5kZWZhdWx0LlN0cmluZz1wLmRlZmF1bHQsdC5kZWZhdWx0Lk9iamVjdD1zLmRlZmF1bHQsdC5k
ZWZhdWx0LkNvbnRhaW5lcj11LkNvbnRhaW5lcix0LmRlZmF1bHQuUmVnaXN0cnk9dS5SZWdpc3Ry
eSx0LmRlZmF1bHQuZ2V0T3duZXI9dS5nZXRPd25lcix0LmRlZmF1bHQuc2V0T3duZXI9dS5zZXRP
d25lcix0LmRlZmF1bHQuX1JlZ2lzdHJ5UHJveHlNaXhpbj1JLmRlZmF1bHQsdC5kZWZhdWx0Ll9D
b250YWluZXJQcm94eU1peGluPUYuZGVmYXVsdCx0LmRlZmF1bHQuTmFtZXNwYWNlPWEuZGVmYXVs
dCx0LmRlZmF1bHQuRW51bWVyYWJsZT1nLmRlZmF1bHQsdC5kZWZhdWx0LkFycmF5UHJveHk9bC5k
ZWZhdWx0LHQuZGVmYXVsdC5PYmplY3RQcm94eT1jLmRlZmF1bHQsdC5kZWZhdWx0LkFjdGlvbkhh
bmRsZXI9eC5kZWZhdWx0LHQuZGVmYXVsdC5Db3JlT2JqZWN0PWYuZGVmYXVsdCx0LmRlZmF1bHQu
TmF0aXZlQXJyYXk9ZC5kZWZhdWx0LHQuZGVmYXVsdC5vbkxvYWQ9aC5vbkxvYWQsdC5kZWZhdWx0
LnJ1bkxvYWRIb29rcz1oLnJ1bkxvYWRIb29rcyx0LmRlZmF1bHQuQ29udHJvbGxlcj1BLmRlZmF1
bHQsdC5kZWZhdWx0LkNvbnRyb2xsZXJNaXhpbj1QLmRlZmF1bHQsdC5kZWZhdWx0LlNlcnZpY2U9
ai5kZWZhdWx0LHQuZGVmYXVsdC5fUHJveHlNaXhpbj1fLmRlZmF1bHQsdC5kZWZhdWx0LlJTVlA9
Ui5kZWZhdWx0LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LmRlZmF1bHQsIlNUUklOR1MiLHtjb25m
aWd1cmFibGU6ITEsZ2V0OkguZ2V0U3RyaW5ncyxzZXQ6SC5zZXRTdHJpbmdzfSksZS5kZWZhdWx0
PXQuZGVmYXVsdH0pLGUoImVtYmVyLXJ1bnRpbWUvaW5qZWN0IixbImV4cG9ydHMiLCJlbWJlci1t
ZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL2luamVjdGVkX3Byb3BlcnR5Il0sZnVuY3Rpb24oZSx0
LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7fWZ1bmN0aW9uIGkoZSx0KXthW2VdPXQsbltl
XT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIuZGVmYXVsdChlLHQpfX1mdW5jdGlvbiBvKGUpe3Zh
ciB0LG4saSxvLHMsdT1lLnByb3RvKCksbD1bXTtmb3IodCBpbiB1KW49dVt0XSxuIGluc3RhbmNl
b2Ygci5kZWZhdWx0JiZsLmluZGV4T2Yobi50eXBlKT09PS0xJiZsLnB1c2gobi50eXBlKTtpZihs
Lmxlbmd0aClmb3Iobz0wLHM9bC5sZW5ndGg7bzxzO28rKylpPWFbbFtvXV0sImZ1bmN0aW9uIj09
dHlwZW9mIGkmJmkoZSk7cmV0dXJuITB9ZS5kZWZhdWx0PW4sZS5jcmVhdGVJbmplY3Rpb25IZWxw
ZXI9aSxlLnZhbGlkYXRlUHJvcGVydHlJbmplY3Rpb25zPW87dmFyIGE9e319KSxlKCJlbWJlci1y
dW50aW1lL2lzLWVxdWFsIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gdChlLHQpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5pc0VxdWFsP2UuaXNF
cXVhbCh0KTplIGluc3RhbmNlb2YgRGF0ZSYmdCBpbnN0YW5jZW9mIERhdGU/ZS5nZXRUaW1lKCk9
PT10LmdldFRpbWUoKTplPT09dH1lLmRlZmF1bHQ9dH0pLGUoImVtYmVyLXJ1bnRpbWUvbWl4aW5z
Ly1wcm94eSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9tZXRhIiwi
ZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMiLCJlbWJl
ci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL3Byb3BlcnRpZXMiLCJlbWJlci1tZXRhbC9t
aXhpbiIsImVtYmVyLW1ldGFsL3N5bWJvbCJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGws
Yyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSl7cmV0dXJuIGUmJmVbbV19ZnVuY3Rpb24gZChl
LHQpe3ZhciByPXQuc2xpY2UoOCk7ciBpbiB0aGlzfHxhLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LHIpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgcj10LnNsaWNlKDgpO3IgaW4gdGhpc3x8YS5wcm9wZXJ0
eURpZENoYW5nZSh0aGlzLHIpfXZhciBoO2UuaXNQcm94eT1mO3ZhciBtPWMuZGVmYXVsdCgiSVNf
UFJPWFkiKTtlLmRlZmF1bHQ9bC5NaXhpbi5jcmVhdGUoKGg9e30saFttXT0hMCxoLmNvbnRlbnQ9
bnVsbCxoLl9jb250ZW50RGlkQ2hhbmdlPWwub2JzZXJ2ZXIoImNvbnRlbnQiLGZ1bmN0aW9uKCl7
fSksaC5pc1RydXRoeT1zLmNvbXB1dGVkLmJvb2woImNvbnRlbnQiKSxoLl9kZWJ1Z0NvbnRhaW5l
cktleT1udWxsLGgud2lsbFdhdGNoUHJvcGVydHk9ZnVuY3Rpb24oZSl7dmFyIHQ9ImNvbnRlbnQu
IitlO28uX2FkZEJlZm9yZU9ic2VydmVyKHRoaXMsdCxudWxsLGQpLG8uYWRkT2JzZXJ2ZXIodGhp
cyx0LG51bGwscCl9LGguZGlkVW53YXRjaFByb3BlcnR5PWZ1bmN0aW9uKGUpe3ZhciB0PSJjb250
ZW50LiIrZTtvLl9yZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlzLHQsbnVsbCxkKSxvLnJlbW92ZU9i
c2VydmVyKHRoaXMsdCxudWxsLHApfSxoLnVua25vd25Qcm9wZXJ0eT1mdW5jdGlvbihlKXt2YXIg
dD1yLmdldCh0aGlzLCJjb250ZW50Iik7aWYodClyZXR1cm4gci5nZXQodCxlKX0saC5zZXRVbmtu
b3duUHJvcGVydHk9ZnVuY3Rpb24oZSx0KXt2YXIgbz1pLm1ldGEodGhpcyk7aWYoby5wcm90bz09
PXRoaXMpcmV0dXJuIHUuZGVmaW5lUHJvcGVydHkodGhpcyxlLG51bGwsdCksdDt2YXIgYT1yLmdl
dCh0aGlzLCJjb250ZW50Iik7cmV0dXJuIG4uc2V0KGEsZSx0KX0saCkpfSksZSgiZW1iZXItcnVu
dGltZS9taXhpbnMvYWN0aW9uX2hhbmRsZXIiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVn
IiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiXSxmdW5jdGlv
bihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtPYmplY3QuZGVmaW5lUHJvcGVy
dHkoZS5wcm90b3R5cGUsIl9hY3Rpb25zIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEs
c2V0OmZ1bmN0aW9uKGUpe30sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0KHRoaXMsImFjdGlv
bnMiKX19KX1lLmRlcHJlY2F0ZVVuZGVyc2NvcmVBY3Rpb25zPWk7dmFyIG89ci5NaXhpbi5jcmVh
dGUoe21lcmdlZFByb3BlcnRpZXM6WyJhY3Rpb25zIl0sc2VuZDpmdW5jdGlvbihlKXtmb3IodmFy
IHQ9YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspcltpLTFd
PWFyZ3VtZW50c1tpXTt2YXIgbztpZih0aGlzLmFjdGlvbnMmJnRoaXMuYWN0aW9uc1tlXSl7dmFy
IGE9dGhpcy5hY3Rpb25zW2VdLmFwcGx5KHRoaXMscik9PT0hMDtpZighYSlyZXR1cm59aWYobz1u
LmdldCh0aGlzLCJ0YXJnZXQiKSl7dmFyIHM7KHM9bykuc2VuZC5hcHBseShzLGFyZ3VtZW50cyl9
fSx3aWxsTWVyZ2VNaXhpbjpmdW5jdGlvbihlKXtlLl9hY3Rpb25zJiYoZS5hY3Rpb25zPWUuX2Fj
dGlvbnMsZGVsZXRlIGUuX2FjdGlvbnMpfX0pO2UuZGVmYXVsdD1vfSksZSgiZW1iZXItcnVudGlt
ZS9taXhpbnMvYXJyYXkiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1tZXRh
bC9zeW1ib2wiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9jb21wdXRl
ZCIsImVtYmVyLW1ldGFsL2lzX25vbmUiLCJlbWJlci1ydW50aW1lL21peGlucy9lbnVtZXJhYmxl
IiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMiLCJlbWJl
ci1tZXRhbC9ldmVudHMiLCJlbWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvdGFncyIsImVt
YmVyLXJ1bnRpbWUvc3lzdGVtL2VhY2hfcHJveHkiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMs
dSxsLGMsZixkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcChlLHQscixpLG8pe3ZhciBhPXImJnIu
d2lsbENoYW5nZXx8ImFycmF5V2lsbENoYW5nZSIscz1yJiZyLmRpZENoYW5nZXx8ImFycmF5RGlk
Q2hhbmdlIixsPW4uZ2V0KGUsImhhc0FycmF5T2JzZXJ2ZXJzIik7cmV0dXJuIGw9PT1vJiZ1LnBy
b3BlcnR5V2lsbENoYW5nZShlLCJoYXNBcnJheU9ic2VydmVycyIpLGkoZSwiQGFycmF5OmJlZm9y
ZSIsdCxhKSxpKGUsIkBhcnJheTpjaGFuZ2UiLHQscyksbD09PW8mJnUucHJvcGVydHlEaWRDaGFu
Z2UoZSwiaGFzQXJyYXlPYnNlcnZlcnMiKSxlfWZ1bmN0aW9uIGgoZSx0LHIpe3JldHVybiBwKGUs
dCxyLGwuYWRkTGlzdGVuZXIsITEpfWZ1bmN0aW9uIG0oZSx0LHIpe3JldHVybiBwKGUsdCxyLGwu
cmVtb3ZlTGlzdGVuZXIsITApfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4gZS5vYmplY3RBdD9lLm9i
amVjdEF0KHQpOmVbdF19ZnVuY3Rpb24gYihlKXtyZXR1cm4gZSYmISFlW3ldfXZhciBnO2UuYWRk
QXJyYXlPYnNlcnZlcj1oLGUucmVtb3ZlQXJyYXlPYnNlcnZlcj1tLGUub2JqZWN0QXQ9dixlLmlz
RW1iZXJBcnJheT1iO3ZhciB5PXIuZGVmYXVsdCgiRU1CRVJfQVJSQVkiKTtlLmRlZmF1bHQ9cy5N
aXhpbi5jcmVhdGUoYS5kZWZhdWx0LChnPXt9LGdbeV09ITAsZy5sZW5ndGg9bnVsbCxnLm9iamVj
dEF0PWZ1bmN0aW9uKGUpe2lmKCEoZTwwfHxlPj1uLmdldCh0aGlzLCJsZW5ndGgiKSkpcmV0dXJu
IG4uZ2V0KHRoaXMsZSl9LGcub2JqZWN0c0F0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJu
IGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2KHQsZSl9KX0sZy5uZXh0T2JqZWN0PWZ1bmN0aW9u
KGUpe3JldHVybiB2KHRoaXMsZSl9LGdbIltdIl09aS5jb21wdXRlZCh7Z2V0OmZ1bmN0aW9uKGUp
e3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5yZXBsYWNlKDAsbi5n
ZXQodGhpcywibGVuZ3RoIiksdCksdGhpc319KSxnLmZpcnN0T2JqZWN0PWkuY29tcHV0ZWQoZnVu
Y3Rpb24oKXtyZXR1cm4gdih0aGlzLDApfSkucmVhZE9ubHkoKSxnLmxhc3RPYmplY3Q9aS5jb21w
dXRlZChmdW5jdGlvbigpe3JldHVybiB2KHRoaXMsbi5nZXQodGhpcywibGVuZ3RoIiktMSl9KS5y
ZWFkT25seSgpLGcuY29udGFpbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5kZXhPZihlKT49
MH0sZy5zbGljZT1mdW5jdGlvbihlLHIpe3ZhciBpPXQuZGVmYXVsdC5BKCksYT1uLmdldCh0aGlz
LCJsZW5ndGgiKTtmb3Ioby5kZWZhdWx0KGUpJiYoZT0wKSwoby5kZWZhdWx0KHIpfHxyPmEpJiYo
cj1hKSxlPDAmJihlPWErZSkscjwwJiYocj1hK3IpO2U8cjspaVtpLmxlbmd0aF09dih0aGlzLGUr
Kyk7cmV0dXJuIGl9LGcuaW5kZXhPZj1mdW5jdGlvbihlLHQpe3ZhciByLGk9bi5nZXQodGhpcywi
bGVuZ3RoIik7Zm9yKHZvaWQgMD09PXQmJih0PTApLHQ8MCYmKHQrPWkpLHI9dDtyPGk7cisrKWlm
KHYodGhpcyxyKT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9LGcubGFzdEluZGV4T2Y9ZnVuY3Rpb24o
ZSx0KXt2YXIgcixpPW4uZ2V0KHRoaXMsImxlbmd0aCIpO2Zvcigodm9pZCAwPT09dHx8dD49aSkm
Jih0PWktMSksdDwwJiYodCs9aSkscj10O3I+PTA7ci0tKWlmKHYodGhpcyxyKT09PWUpcmV0dXJu
IHI7cmV0dXJuLTF9LGcuYWRkQXJyYXlPYnNlcnZlcj1mdW5jdGlvbihlLHQpe3JldHVybiBoKHRo
aXMsZSx0KX0sZy5yZW1vdmVBcnJheU9ic2VydmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG0odGhp
cyxlLHQpfSxnLmhhc0FycmF5T2JzZXJ2ZXJzPWkuY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1cm4g
bC5oYXNMaXN0ZW5lcnModGhpcywiQGFycmF5OmNoYW5nZSIpfHxsLmhhc0xpc3RlbmVycyh0aGlz
LCJAYXJyYXk6YmVmb3JlIil9KSxnLmFycmF5Q29udGVudFdpbGxDaGFuZ2U9ZnVuY3Rpb24oZSx0
LHIpe3ZhciBpLG87aWYodm9pZCAwPT09ZT8oZT0wLHQ9cj0tMSk6KHZvaWQgMD09PXQmJih0PS0x
KSx2b2lkIDA9PT1yJiYocj0tMSkpLHRoaXMuX19lYWNoJiZ0aGlzLl9fZWFjaC5hcnJheVdpbGxD
aGFuZ2UodGhpcyxlLHQsciksbC5zZW5kRXZlbnQodGhpcywiQGFycmF5OmJlZm9yZSIsW3RoaXMs
ZSx0LHJdKSxlPj0wJiZ0Pj0wJiZuLmdldCh0aGlzLCJoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzIikp
e2k9W10sbz1lK3Q7Zm9yKHZhciBhPWU7YTxvO2ErKylpLnB1c2godih0aGlzLGEpKX1lbHNlIGk9
dDtyZXR1cm4gdGhpcy5lbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2UoaSxyKSx0aGlzfSxnLmFy
cmF5Q29udGVudERpZENoYW5nZT1mdW5jdGlvbihlLHQscil7dmFyIG8sYTtpZihmLm1hcmtPYmpl
Y3RBc0RpcnR5KGMubWV0YSh0aGlzKSksdm9pZCAwPT09ZT8oZT0wLHQ9cj0tMSk6KHZvaWQgMD09
PXQmJih0PS0xKSx2b2lkIDA9PT1yJiYocj0tMSkpLGU+PTAmJnI+PTAmJm4uZ2V0KHRoaXMsImhh
c0VudW1lcmFibGVPYnNlcnZlcnMiKSl7bz1bXSxhPWUrcjtmb3IodmFyIHM9ZTtzPGE7cysrKW8u
cHVzaCh2KHRoaXMscykpfWVsc2Ugbz1yO3RoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2Uo
dCxvKSx0aGlzLl9fZWFjaCYmdGhpcy5fX2VhY2guYXJyYXlEaWRDaGFuZ2UodGhpcyxlLHQsciks
bC5zZW5kRXZlbnQodGhpcywiQGFycmF5OmNoYW5nZSIsW3RoaXMsZSx0LHJdKTt2YXIgZD1uLmdl
dCh0aGlzLCJsZW5ndGgiKSxwPWkuY2FjaGVGb3IodGhpcywiZmlyc3RPYmplY3QiKSxoPWkuY2Fj
aGVGb3IodGhpcywibGFzdE9iamVjdCIpO3JldHVybiB2KHRoaXMsMCkhPT1wJiYodS5wcm9wZXJ0
eVdpbGxDaGFuZ2UodGhpcywiZmlyc3RPYmplY3QiKSx1LnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMs
ImZpcnN0T2JqZWN0IikpLHYodGhpcyxkLTEpIT09aCYmKHUucHJvcGVydHlXaWxsQ2hhbmdlKHRo
aXMsImxhc3RPYmplY3QiKSx1LnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsImxhc3RPYmplY3QiKSks
dGhpc30sZ1siQGVhY2giXT1pLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19lYWNo
fHwodGhpcy5fX2VhY2g9bmV3IGQuZGVmYXVsdCh0aGlzKSksdGhpcy5fX2VhY2h9KS52b2xhdGls
ZSgpLGcpKX0pLGUoImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbXBhcmFibGUiLFsiZXhwb3J0cyIs
ImVtYmVyLW1ldGFsL21peGluIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0
PXQuTWl4aW4uY3JlYXRlKHtjb21wYXJlOm51bGx9KX0pLGUoImVtYmVyLXJ1bnRpbWUvbWl4aW5z
L2NvbnRhaW5lcl9wcm94eSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvcnVuX2xvb3AiLCJlbWJl
ci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL21peGluIl0sZnVuY3Rpb24oZSx0LHIsbil7InVz
ZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7dmFyIHQ9e30scj17bG9va3VwOiJsb29rdXAiLGxvb2t1
cEZhY3Rvcnk6Il9sb29rdXBGYWN0b3J5In07Zm9yKHZhciBuIGluIHIpdFtuXT1vKGUsbixyW25d
KTtyZXR1cm4gdH1mdW5jdGlvbiBvKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0
XS5hcHBseShlLGFyZ3VtZW50cyl9fWUuYnVpbGRGYWtlQ29udGFpbmVyV2l0aERlcHJlY2F0aW9u
cz1pLGUuZGVmYXVsdD1uLk1peGluLmNyZWF0ZSh7X19jb250YWluZXJfXzpudWxsLG93bmVySW5q
ZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19jb250YWluZXJfXy5vd25lckluamVjdGlv
bigpOworfSxsb29rdXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fX2NvbnRhaW5lcl9fLmxv
b2t1cChlLHQpfSxfbG9va3VwRmFjdG9yeTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9fY29u
dGFpbmVyX18ubG9va3VwRmFjdG9yeShlLHQpfSx3aWxsRGVzdHJveTpmdW5jdGlvbigpe3RoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9fY29udGFpbmVyX18mJnQuZGVmYXVs
dCh0aGlzLl9fY29udGFpbmVyX18sImRlc3Ryb3kiKX19KX0pLGUoImVtYmVyLXJ1bnRpbWUvbWl4
aW5zL2NvbnRyb2xsZXIiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL21peGluIiwiZW1iZXItbWV0
YWwvYWxpYXMiLCJlbWJlci1ydW50aW1lL21peGlucy9hY3Rpb25faGFuZGxlciIsImVtYmVyLXJ1
bnRpbWUvbWl4aW5zL2NvbnRyb2xsZXJfY29udGVudF9tb2RlbF9hbGlhc19kZXByZWNhdGlvbiJd
LGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD10Lk1peGluLmNyZWF0
ZShuLmRlZmF1bHQsaS5kZWZhdWx0LHtpc0NvbnRyb2xsZXI6ITAsdGFyZ2V0Om51bGwscGFyZW50
Q29udHJvbGxlcjpudWxsLHN0b3JlOm51bGwsbW9kZWw6bnVsbCxjb250ZW50OnIuZGVmYXVsdCgi
bW9kZWwiKX0pfSksZSgiZW1iZXItcnVudGltZS9taXhpbnMvY29udHJvbGxlcl9jb250ZW50X21v
ZGVsX2FsaWFzX2RlcHJlY2F0aW9uIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVt
YmVyLW1ldGFsL21peGluIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9
ci5NaXhpbi5jcmVhdGUoe3dpbGxNZXJnZU1peGluOmZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyLmFw
cGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgdD0hIWUubW9kZWw7ZS5jb250ZW50JiYhdCYmKGUubW9k
ZWw9ZS5jb250ZW50LGRlbGV0ZSBlLmNvbnRlbnQpfX0pfSksZSgiZW1iZXItcnVudGltZS9taXhp
bnMvY29weWFibGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwv
cHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1ydW50aW1lL21peGlucy9m
cmVlemFibGUiLCJlbWJlci1tZXRhbC9lcnJvciJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNl
IHN0cmljdCI7ZS5kZWZhdWx0PW4uTWl4aW4uY3JlYXRlKHtjb3B5Om51bGwsZnJvemVuQ29weTpm
dW5jdGlvbigpe2lmKGkuRnJlZXphYmxlJiZpLkZyZWV6YWJsZS5kZXRlY3QodGhpcykpcmV0dXJu
IHIuZ2V0KHRoaXMsImlzRnJvemVuIik/dGhpczp0aGlzLmNvcHkoKS5mcmVlemUoKTt0aHJvdyBu
ZXcgby5kZWZhdWx0KHRoaXMrIiBkb2VzIG5vdCBzdXBwb3J0IGZyZWV6aW5nIil9fSl9KSxlKCJl
bWJlci1ydW50aW1lL21peGlucy9lbnVtZXJhYmxlIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9taXhp
biIsImVtYmVyLW1ldGFsL3V0aWxzIiwiZW1iZXItbWV0YWwvY29tcHV0ZWQiLCJlbWJlci1tZXRh
bC9lbXB0eV9vYmplY3QiLCJlbWJlci1tZXRhbC9mZWF0dXJlcyIsImVtYmVyLW1ldGFsL3Byb3Bl
cnR5X2V2ZW50cyIsImVtYmVyLW1ldGFsL2V2ZW50cyIsImVtYmVyLXJ1bnRpbWUvY29tcGFyZSIs
InJlcXVpcmUiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxsLGMsZil7InVzZSBzdHJpY3Qi
O2Z1bmN0aW9uIGQoKXtyZXR1cm4odnx8KHY9Zi5kZWZhdWx0KCJlbWJlci1ydW50aW1lL3N5c3Rl
bS9uYXRpdmVfYXJyYXkiKS5BKSkoKX1mdW5jdGlvbiBwKCl7cmV0dXJuIDA9PT1iLmxlbmd0aD97
fTpiLnBvcCgpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGIucHVzaChlKSxudWxsfWZ1bmN0aW9uIG0o
ZSxyKXtmdW5jdGlvbiBuKG4pe3ZhciBvPXQuZ2V0KG4sZSk7cmV0dXJuIGk/cj09PW86ISFvfXZh
ciBpPTI9PT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBufXZhciB2PXZvaWQgMCxiPVtdLGc9bi5N
aXhpbi5jcmVhdGUoe25leHRPYmplY3Q6bnVsbCxmaXJzdE9iamVjdDpvLmNvbXB1dGVkKCJbXSIs
ZnVuY3Rpb24oKXtpZigwIT09dC5nZXQodGhpcywibGVuZ3RoIikpe3ZhciBlPXAoKSxyPXRoaXMu
bmV4dE9iamVjdCgwLG51bGwsZSk7cmV0dXJuIGgoZSkscn19KS5yZWFkT25seSgpLGxhc3RPYmpl
Y3Q6by5jb21wdXRlZCgiW10iLGZ1bmN0aW9uKCl7dmFyIGU9dC5nZXQodGhpcywibGVuZ3RoIik7
aWYoMCE9PWUpe3ZhciByLG49cCgpLGk9MCxvPW51bGw7ZG8gbz1yLHI9dGhpcy5uZXh0T2JqZWN0
KGkrKyxvLG4pO3doaWxlKHZvaWQgMCE9PXIpO3JldHVybiBoKG4pLG99fSkucmVhZE9ubHkoKSxj
b250YWluczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9
PT1lfSk7cmV0dXJuIHZvaWQgMCE9PXR9LGZvckVhY2g6ZnVuY3Rpb24oZSxyKXtpZigiZnVuY3Rp
b24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBuPXAoKSxpPXQuZ2V0KHRoaXMs
Imxlbmd0aCIpLG89bnVsbDt2b2lkIDA9PT1yJiYocj1udWxsKTtmb3IodmFyIGE9MDthPGk7YSsr
KXt2YXIgcz10aGlzLm5leHRPYmplY3QoYSxvLG4pO2UuY2FsbChyLHMsYSx0aGlzKSxvPXN9cmV0
dXJuIG89bnVsbCxuPWgobiksdGhpc30sZ2V0RWFjaDpuLmFsaWFzTWV0aG9kKCJtYXBCeSIpLHNl
dEVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKG4pe3Iuc2V0
KG4sZSx0KX0pfSxtYXA6ZnVuY3Rpb24oZSx0KXt2YXIgcj1kKCk7cmV0dXJuIHRoaXMuZm9yRWFj
aChmdW5jdGlvbihuLGksbyl7cltpXT1lLmNhbGwodCxuLGksbyl9KSxyfSxtYXBCeTpmdW5jdGlv
bihlKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHQuZ2V0KHIsZSl9KX0sZmls
dGVyOmZ1bmN0aW9uKGUsdCl7dmFyIHI9ZCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24o
bixpLG8pe2UuY2FsbCh0LG4saSxvKSYmci5wdXNoKG4pfSkscn0scmVqZWN0OmZ1bmN0aW9uKGUs
dCl7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIWUuYXBwbHkodCxhcmd1bWVu
dHMpfSl9LGZpbHRlckJ5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZmlsdGVyKG0uYXBwbHko
dGhpcyxhcmd1bWVudHMpKX0scmVqZWN0Qnk6ZnVuY3Rpb24oZSxyKXt2YXIgbj1mdW5jdGlvbihu
KXtyZXR1cm4gdC5nZXQobixlKT09PXJ9LGk9ZnVuY3Rpb24ocil7cmV0dXJuISF0LmdldChyLGUp
fSxvPTI9PT1hcmd1bWVudHMubGVuZ3RoP246aTtyZXR1cm4gdGhpcy5yZWplY3Qobyl9LGZpbmQ6
ZnVuY3Rpb24oZSxyKXt2YXIgbj10LmdldCh0aGlzLCJsZW5ndGgiKTt2b2lkIDA9PT1yJiYocj1u
dWxsKTtmb3IodmFyIGksbyxhPXAoKSxzPSExLHU9bnVsbCxsPTA7bDxuJiYhcztsKyspaT10aGlz
Lm5leHRPYmplY3QobCx1LGEpLChzPWUuY2FsbChyLGksbCx0aGlzKSkmJihvPWkpLHU9aTtyZXR1
cm4gaT11PW51bGwsYT1oKGEpLG99LGZpbmRCeTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmZp
bmQobS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxldmVyeTpmdW5jdGlvbihlLHQpe3JldHVybiF0
aGlzLmZpbmQoZnVuY3Rpb24ocixuLGkpe3JldHVybiFlLmNhbGwodCxyLG4saSl9KX0saXNFdmVy
eTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmV2ZXJ5KG0uYXBwbHkodGhpcyxhcmd1bWVudHMp
KX0sYW55OmZ1bmN0aW9uKGUscil7dmFyIG4saSxvPXQuZ2V0KHRoaXMsImxlbmd0aCIpLGE9cCgp
LHM9ITEsdT1udWxsO2Zvcih2b2lkIDA9PT1yJiYocj1udWxsKSxpPTA7aTxvJiYhcztpKyspbj10
aGlzLm5leHRPYmplY3QoaSx1LGEpLHM9ZS5jYWxsKHIsbixpLHRoaXMpLHU9bjtyZXR1cm4gbj11
PW51bGwsYT1oKGEpLHN9LGlzQW55OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYW55KG0uYXBw
bHkodGhpcyxhcmd1bWVudHMpKX0scmVkdWNlOmZ1bmN0aW9uKGUsdCxyKXtpZigiZnVuY3Rpb24i
IT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBuPXQ7cmV0dXJuIHRoaXMuZm9yRWFj
aChmdW5jdGlvbih0LGkpe249ZShuLHQsaSx0aGlzLHIpfSx0aGlzKSxufSxpbnZva2U6ZnVuY3Rp
b24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheSh0PjE/dC0xOjApLG49MTtu
PHQ7bisrKXJbbi0xXT1hcmd1bWVudHNbbl07dmFyIGk9ZCgpO3JldHVybiB0aGlzLmZvckVhY2go
ZnVuY3Rpb24odCxuKXt2YXIgbz10JiZ0W2VdOyJmdW5jdGlvbiI9PXR5cGVvZiBvJiYoaVtuXT1y
P28uYXBwbHkodCxyKTp0W2VdKCkpfSx0aGlzKSxpfSx0b0FycmF5OmZ1bmN0aW9uKCl7dmFyIGU9
ZCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24odCxyKXtlW3JdPXR9KSxlfSxjb21wYWN0
OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1l
fSl9LHdpdGhvdXQ6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udGFpbnMoZSkpcmV0dXJuIHRoaXM7
dmFyIHQ9ZCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7ciE9PWUmJih0W3QubGVu
Z3RoXT1yKX0pLHR9LHVuaXE6ZnVuY3Rpb24oKXt2YXIgZT1kKCk7cmV0dXJuIHRoaXMuZm9yRWFj
aChmdW5jdGlvbih0KXtlLmluZGV4T2YodCk8MCYmZS5wdXNoKHQpfSksZX0sIltdIjpvLmNvbXB1
dGVkKHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXN9fSksYWRkRW51bWVyYWJsZU9ic2VydmVy
OmZ1bmN0aW9uKGUscil7dmFyIG49ciYmci53aWxsQ2hhbmdlfHwiZW51bWVyYWJsZVdpbGxDaGFu
Z2UiLGk9ciYmci5kaWRDaGFuZ2V8fCJlbnVtZXJhYmxlRGlkQ2hhbmdlIixvPXQuZ2V0KHRoaXMs
Imhhc0VudW1lcmFibGVPYnNlcnZlcnMiKTtyZXR1cm4gb3x8dS5wcm9wZXJ0eVdpbGxDaGFuZ2Uo
dGhpcywiaGFzRW51bWVyYWJsZU9ic2VydmVycyIpLGwuYWRkTGlzdGVuZXIodGhpcywiQGVudW1l
cmFibGU6YmVmb3JlIixlLG4pLGwuYWRkTGlzdGVuZXIodGhpcywiQGVudW1lcmFibGU6Y2hhbmdl
IixlLGkpLG98fHUucHJvcGVydHlEaWRDaGFuZ2UodGhpcywiaGFzRW51bWVyYWJsZU9ic2VydmVy
cyIpLHRoaXN9LHJlbW92ZUVudW1lcmFibGVPYnNlcnZlcjpmdW5jdGlvbihlLHIpe3ZhciBuPXIm
JnIud2lsbENoYW5nZXx8ImVudW1lcmFibGVXaWxsQ2hhbmdlIixpPXImJnIuZGlkQ2hhbmdlfHwi
ZW51bWVyYWJsZURpZENoYW5nZSIsbz10LmdldCh0aGlzLCJoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJz
Iik7cmV0dXJuIG8mJnUucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsImhhc0VudW1lcmFibGVPYnNl
cnZlcnMiKSxsLnJlbW92ZUxpc3RlbmVyKHRoaXMsIkBlbnVtZXJhYmxlOmJlZm9yZSIsZSxuKSxs
LnJlbW92ZUxpc3RlbmVyKHRoaXMsIkBlbnVtZXJhYmxlOmNoYW5nZSIsZSxpKSxvJiZ1LnByb3Bl
cnR5RGlkQ2hhbmdlKHRoaXMsImhhc0VudW1lcmFibGVPYnNlcnZlcnMiKSx0aGlzfSxoYXNFbnVt
ZXJhYmxlT2JzZXJ2ZXJzOm8uY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1cm4gbC5oYXNMaXN0ZW5l
cnModGhpcywiQGVudW1lcmFibGU6Y2hhbmdlIil8fGwuaGFzTGlzdGVuZXJzKHRoaXMsIkBlbnVt
ZXJhYmxlOmJlZm9yZSIpfSksZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlOmZ1bmN0aW9uKGUs
cil7dmFyIG4saSxvO3JldHVybiBuPSJudW1iZXIiPT10eXBlb2YgZT9lOmU/dC5nZXQoZSwibGVu
Z3RoIik6ZT0tMSxpPSJudW1iZXIiPT10eXBlb2Ygcj9yOnI/dC5nZXQociwibGVuZ3RoIik6cj0t
MSxvPWk8MHx8bjwwfHxpLW4hPT0wLGU9PT0tMSYmKGU9bnVsbCkscj09PS0xJiYocj1udWxsKSx1
LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCJbXSIpLG8mJnUucHJvcGVydHlXaWxsQ2hhbmdlKHRo
aXMsImxlbmd0aCIpLGwuc2VuZEV2ZW50KHRoaXMsIkBlbnVtZXJhYmxlOmJlZm9yZSIsW3RoaXMs
ZSxyXSksdGhpc30sZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2U6ZnVuY3Rpb24oZSxyKXt2YXIg
bixpLG87cmV0dXJuIG49Im51bWJlciI9PXR5cGVvZiBlP2U6ZT90LmdldChlLCJsZW5ndGgiKTpl
PS0xLGk9Im51bWJlciI9PXR5cGVvZiByP3I6cj90LmdldChyLCJsZW5ndGgiKTpyPS0xLG89aTww
fHxuPDB8fGktbiE9PTAsZT09PS0xJiYoZT1udWxsKSxyPT09LTEmJihyPW51bGwpLGwuc2VuZEV2
ZW50KHRoaXMsIkBlbnVtZXJhYmxlOmNoYW5nZSIsW3RoaXMsZSxyXSksbyYmdS5wcm9wZXJ0eURp
ZENoYW5nZSh0aGlzLCJsZW5ndGgiKSx1LnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIltdIiksdGhp
c30sc29ydEJ5OmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLnRvQXJyYXko
KS5zb3J0KGZ1bmN0aW9uKHIsbil7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVb
aV0sYT10LmdldChyLG8pLHM9dC5nZXQobixvKSx1PWMuZGVmYXVsdChhLHMpO2lmKHUpcmV0dXJu
IHV9cmV0dXJuIDB9KX19KTtlLmRlZmF1bHQ9Z30pLGUoImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2
ZW50ZWQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL21peGluIiwiZW1iZXItbWV0YWwvZXZlbnRz
Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9dC5NaXhpbi5jcmVhdGUo
e29uOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci5hZGRMaXN0ZW5lcih0aGlzLGUsdCxuKSx0aGlz
fSxvbmU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBufHwobj10LHQ9bnVsbCksci5hZGRMaXN0ZW5l
cih0aGlzLGUsdCxuLCEwKSx0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1
bWVudHMubGVuZ3RoLG49QXJyYXkodD4xP3QtMTowKSxpPTE7aTx0O2krKyluW2ktMV09YXJndW1l
bnRzW2ldO3Iuc2VuZEV2ZW50KHRoaXMsZSxuKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4g
ci5yZW1vdmVMaXN0ZW5lcih0aGlzLGUsdCxuKSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJu
IHIuaGFzTGlzdGVuZXJzKHRoaXMsZSl9fSl9KSxlKCJlbWJlci1ydW50aW1lL21peGlucy9mcmVl
emFibGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvbWl4aW4i
LCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiXSxm
dW5jdGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1yLk1peGluLmNyZWF0ZSh7aW5p
dDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saXNGcm96ZW46
ITEsZnJlZXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0KHRoaXMsImlzRnJvemVuIik/dGhpczoo
aS5zZXQodGhpcywiaXNGcm96ZW4iLCEwKSx0aGlzKX19KTtlLkZyZWV6YWJsZT1vO3ZhciBhPSJG
cm96ZW4gb2JqZWN0IGNhbm5vdCBiZSBtb2RpZmllZC4iO2UuRlJPWkVOX0VSUk9SPWF9KSxlKCJl
bWJlci1ydW50aW1lL21peGlucy9tdXRhYmxlX2FycmF5IixbImV4cG9ydHMiLCJlbWJlci1tZXRh
bC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9lcnJvciIsImVtYmVyLW1ldGFsL21peGluIiwi
ZW1iZXItcnVudGltZS9taXhpbnMvYXJyYXkiLCJlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxl
X2VudW1lcmFibGUiLCJlbWJlci1ydW50aW1lL21peGlucy9lbnVtZXJhYmxlIl0sZnVuY3Rpb24o
ZSx0LHIsbixpLG8sYSl7InVzZSBzdHJpY3QiO3ZhciBzPSJJbmRleCBvdXQgb2YgcmFuZ2UiLHU9
W107ZS5kZWZhdWx0PW4uTWl4aW4uY3JlYXRlKGkuZGVmYXVsdCxvLmRlZmF1bHQse3JlcGxhY2U6
bnVsbCxjbGVhcjpmdW5jdGlvbigpe3ZhciBlPXQuZ2V0KHRoaXMsImxlbmd0aCIpO3JldHVybiAw
PT09ZT90aGlzOih0aGlzLnJlcGxhY2UoMCxlLHUpLHRoaXMpfSxpbnNlcnRBdDpmdW5jdGlvbihl
LG4pe2lmKGU+dC5nZXQodGhpcywibGVuZ3RoIikpdGhyb3cgbmV3IHIuZGVmYXVsdChzKTtyZXR1
cm4gdGhpcy5yZXBsYWNlKGUsMCxbbl0pLHRoaXN9LHJlbW92ZUF0OmZ1bmN0aW9uKGUsbil7aWYo
Im51bWJlciI9PXR5cGVvZiBlKXtpZihlPDB8fGU+PXQuZ2V0KHRoaXMsImxlbmd0aCIpKXRocm93
IG5ldyByLmRlZmF1bHQocyk7dm9pZCAwPT09biYmKG49MSksdGhpcy5yZXBsYWNlKGUsbix1KX1y
ZXR1cm4gdGhpc30scHVzaE9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbnNlcnRBdCh0
LmdldCh0aGlzLCJsZW5ndGgiKSxlKSxlfSxwdXNoT2JqZWN0czpmdW5jdGlvbihlKXtpZighYS5k
ZWZhdWx0LmRldGVjdChlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigi
TXVzdCBwYXNzIEVtYmVyLkVudW1lcmFibGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1c2hPYmpl
Y3RzIik7cmV0dXJuIHRoaXMucmVwbGFjZSh0LmdldCh0aGlzLCJsZW5ndGgiKSwwLGUpLHRoaXN9
LHBvcE9iamVjdDpmdW5jdGlvbigpe3ZhciBlPXQuZ2V0KHRoaXMsImxlbmd0aCIpO2lmKDA9PT1l
KXJldHVybiBudWxsO3ZhciByPWkub2JqZWN0QXQodGhpcyxlLTEpO3JldHVybiB0aGlzLnJlbW92
ZUF0KGUtMSwxKSxyfSxzaGlmdE9iamVjdDpmdW5jdGlvbigpe2lmKDA9PT10LmdldCh0aGlzLCJs
ZW5ndGgiKSlyZXR1cm4gbnVsbDt2YXIgZT1pLm9iamVjdEF0KHRoaXMsMCk7cmV0dXJuIHRoaXMu
cmVtb3ZlQXQoMCksZX0sdW5zaGlmdE9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbnNl
cnRBdCgwLGUpLGV9LHVuc2hpZnRPYmplY3RzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlcGxh
Y2UoMCwwLGUpLHRoaXN9LHJldmVyc2VPYmplY3RzOmZ1bmN0aW9uKCl7dmFyIGU9dC5nZXQodGhp
cywibGVuZ3RoIik7aWYoMD09PWUpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy50b0FycmF5KCkucmV2
ZXJzZSgpO3JldHVybiB0aGlzLnJlcGxhY2UoMCxlLHIpLHRoaXN9LHNldE9iamVjdHM6ZnVuY3Rp
b24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0aGlzLmNsZWFyKCk7dmFyIHI9dC5nZXQodGhp
cywibGVuZ3RoIik7cmV0dXJuIHRoaXMucmVwbGFjZSgwLHIsZSksdGhpc30scmVtb3ZlT2JqZWN0
OmZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10LmdldCh0aGlzLCJsZW5ndGgiKXx8MDstLXI+PTA7KXt2
YXIgbj1pLm9iamVjdEF0KHRoaXMscik7bj09PWUmJnRoaXMucmVtb3ZlQXQocil9cmV0dXJuIHRo
aXN9LGFkZE9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb250YWlucyhlKXx8dGhpcy5w
dXNoT2JqZWN0KGUpLHRoaXN9fSl9KSxlKCJlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxlX2Vu
dW1lcmFibGUiLFsiZXhwb3J0cyIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2VudW1lcmFibGUiLCJl
bWJlci1tZXRhbC9taXhpbiIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cyJdLGZ1bmN0aW9u
KGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9ci5NaXhpbi5jcmVhdGUodC5kZWZhdWx0
LHthZGRPYmplY3Q6bnVsbCxhZGRPYmplY3RzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJu
IG4uYmVnaW5Qcm9wZXJ0eUNoYW5nZXModGhpcyksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVy
biB0LmFkZE9iamVjdChlKX0pLG4uZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpLHRoaXN9LHJlbW92
ZU9iamVjdDpudWxsLHJlbW92ZU9iamVjdHM6ZnVuY3Rpb24oZSl7bi5iZWdpblByb3BlcnR5Q2hh
bmdlcyh0aGlzKTtmb3IodmFyIHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLnJlbW92ZU9iamVj
dChlW3RdKTtyZXR1cm4gbi5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyksdGhpc319KX0pLGUoImVt
YmVyLXJ1bnRpbWUvbWl4aW5zL29ic2VydmFibGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Rl
YnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0
IiwiZW1iZXItbWV0YWwvZ2V0X3Byb3BlcnRpZXMiLCJlbWJlci1tZXRhbC9zZXRfcHJvcGVydGll
cyIsImVtYmVyLW1ldGFsL21peGluIiwiZW1iZXItbWV0YWwvZXZlbnRzIiwiZW1iZXItbWV0YWwv
cHJvcGVydHlfZXZlbnRzIiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC9jb21w
dXRlZCIsImVtYmVyLW1ldGFsL2lzX25vbmUiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxs
LGMsZil7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD1hLk1peGluLmNyZWF0ZSh7Z2V0OmZ1bmN0aW9u
KGUpe3JldHVybiByLmdldCh0aGlzLGUpfSxnZXRQcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7Zm9yKHZh
ciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxyPTA7cjxlO3IrKyl0W3JdPWFyZ3VtZW50
c1tyXTtyZXR1cm4gaS5kZWZhdWx0LmFwcGx5KG51bGwsW3RoaXNdLmNvbmNhdCh0KSl9LHNldDpm
dW5jdGlvbihlLHQpe3JldHVybiBuLnNldCh0aGlzLGUsdCl9LHNldFByb3BlcnRpZXM6ZnVuY3Rp
b24oZSl7cmV0dXJuIG8uZGVmYXVsdCh0aGlzLGUpfSxiZWdpblByb3BlcnR5Q2hhbmdlczpmdW5j
dGlvbigpe3JldHVybiB1LmJlZ2luUHJvcGVydHlDaGFuZ2VzKCksdGhpc30sZW5kUHJvcGVydHlD
aGFuZ2VzOmZ1bmN0aW9uKCl7cmV0dXJuIHUuZW5kUHJvcGVydHlDaGFuZ2VzKCksdGhpc30scHJv
cGVydHlXaWxsQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB1LnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLGUpLHRoaXN9LHByb3BlcnR5RGlkQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB1LnByb3Bl
cnR5RGlkQ2hhbmdlKHRoaXMsZSksdGhpc30sbm90aWZ5UHJvcGVydHlDaGFuZ2U6ZnVuY3Rpb24o
ZSl7cmV0dXJuIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGUpLHRoaXMucHJvcGVydHlEaWRDaGFu
Z2UoZSksdGhpc30sYWRkT2JzZXJ2ZXI6ZnVuY3Rpb24oZSx0LHIpe2wuYWRkT2JzZXJ2ZXIodGhp
cyxlLHQscil9LHJlbW92ZU9ic2VydmVyOmZ1bmN0aW9uKGUsdCxyKXtsLnJlbW92ZU9ic2VydmVy
KHRoaXMsZSx0LHIpfSxoYXNPYnNlcnZlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gcy5oYXNMaXN0
ZW5lcnModGhpcyxlKyI6Y2hhbmdlIil9LGdldFdpdGhEZWZhdWx0OmZ1bmN0aW9uKGUsdCl7cmV0
dXJuIHIuZ2V0V2l0aERlZmF1bHQodGhpcyxlLHQpfSxpbmNyZW1lbnRQcm9wZXJ0eTpmdW5jdGlv
bihlLHQpe3JldHVybiBmLmRlZmF1bHQodCkmJih0PTEpLG4uc2V0KHRoaXMsZSwocGFyc2VGbG9h
dChyLmdldCh0aGlzLGUpKXx8MCkrdCl9LGRlY3JlbWVudFByb3BlcnR5OmZ1bmN0aW9uKGUsdCl7
cmV0dXJuIGYuZGVmYXVsdCh0KSYmKHQ9MSksbi5zZXQodGhpcyxlLChyLmdldCh0aGlzLGUpfHww
KS10KX0sdG9nZ2xlUHJvcGVydHk6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uc2V0KHRoaXMsZSwhci5n
ZXQodGhpcyxlKSl9LGNhY2hlRm9yOmZ1bmN0aW9uKGUpe3JldHVybiBjLmNhY2hlRm9yKHRoaXMs
ZSl9LG9ic2VydmVyc0ZvcktleTpmdW5jdGlvbihlKXtyZXR1cm4gbC5vYnNlcnZlcnNGb3IodGhp
cyxlKX19KX0pLGUoImVtYmVyLXJ1bnRpbWUvbWl4aW5zL3Byb21pc2VfcHJveHkiLFsiZXhwb3J0
cyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVz
IiwiZW1iZXItbWV0YWwvY29tcHV0ZWQiLCJlbWJlci1tZXRhbC9taXhpbiIsImVtYmVyLW1ldGFs
L2Vycm9yIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUs
dCl7cmV0dXJuIHIuZGVmYXVsdChlLHtpc0Z1bGZpbGxlZDohMSxpc1JlamVjdGVkOiExfSksdC50
aGVuKGZ1bmN0aW9uKHQpe3JldHVybiByLmRlZmF1bHQoZSx7Y29udGVudDp0LGlzRnVsZmlsbGVk
OiEwfSksdH0sZnVuY3Rpb24odCl7dGhyb3cgci5kZWZhdWx0KGUse3JlYXNvbjp0LGlzUmVqZWN0
ZWQ6ITB9KSx0fSwiRW1iZXI6IFByb21pc2VQcm94eSIpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1
bmN0aW9uKCl7dmFyIHI9dC5nZXQodGhpcywicHJvbWlzZSIpO3JldHVybiByW2VdLmFwcGx5KHIs
YXJndW1lbnRzKX19dmFyIHU9bi5jb21wdXRlZC5ub3QsbD1uLmNvbXB1dGVkLm9yO2UuZGVmYXVs
dD1pLk1peGluLmNyZWF0ZSh7cmVhc29uOm51bGwsaXNQZW5kaW5nOnUoImlzU2V0dGxlZCIpLnJl
YWRPbmx5KCksaXNTZXR0bGVkOmwoImlzUmVqZWN0ZWQiLCJpc0Z1bGZpbGxlZCIpLnJlYWRPbmx5
KCksaXNSZWplY3RlZDohMSxpc0Z1bGZpbGxlZDohMSxwcm9taXNlOm4uY29tcHV0ZWQoe2dldDpm
dW5jdGlvbigpe3Rocm93IG5ldyBvLmRlZmF1bHQoIlByb21pc2VQcm94eSdzIHByb21pc2UgbXVz
dCBiZSBzZXQiKX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEodGhpcyx0KX19KSx0aGVuOnMo
InRoZW4iKSxjYXRjaDpzKCJjYXRjaCIpLGZpbmFsbHk6cygiZmluYWxseSIpfSl9KSxlKCJlbWJl
ci1ydW50aW1lL21peGlucy9yZWdpc3RyeV9wcm94eSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
ZGVidWciLCJlbWJlci1tZXRhbC9taXhpbiJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7
ZnVuY3Rpb24gbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLl9fcmVn
aXN0cnlfXylbZV0uYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBpKGUsdCl7dmFyIHI9e30s
bj17cmVzb2x2ZToicmVzb2x2ZVJlZ2lzdHJhdGlvbiIscmVnaXN0ZXI6InJlZ2lzdGVyIix1bnJl
Z2lzdGVyOiJ1bnJlZ2lzdGVyIixoYXM6Imhhc1JlZ2lzdHJhdGlvbiIsb3B0aW9uOiJyZWdpc3Rl
ck9wdGlvbiIsb3B0aW9uczoicmVnaXN0ZXJPcHRpb25zIixnZXRPcHRpb25zOiJyZWdpc3RlcmVk
T3B0aW9ucyIsb3B0aW9uc0ZvclR5cGU6InJlZ2lzdGVyT3B0aW9uc0ZvclR5cGUiLGdldE9wdGlv
bnNGb3JUeXBlOiJyZWdpc3RlcmVkT3B0aW9uc0ZvclR5cGUiLGluamVjdGlvbjoiaW5qZWN0In07
Zm9yKHZhciBpIGluIG4pcltpXT1vKGUsdCxpLG5baV0pO3JldHVybiByfWZ1bmN0aW9uIG8oZSx0
LHIsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbbl0uYXBwbHkoZSxhcmd1bWVudHMpfX1l
LmJ1aWxkRmFrZVJlZ2lzdHJ5V2l0aERlcHJlY2F0aW9ucz1pLGUuZGVmYXVsdD1yLk1peGluLmNy
ZWF0ZSh7X19yZWdpc3RyeV9fOm51bGwscmVzb2x2ZVJlZ2lzdHJhdGlvbjpuKCJyZXNvbHZlIiks
cmVnaXN0ZXI6bigicmVnaXN0ZXIiKSx1bnJlZ2lzdGVyOm4oInVucmVnaXN0ZXIiKSxoYXNSZWdp
c3RyYXRpb246bigiaGFzIikscmVnaXN0ZXJPcHRpb246bigib3B0aW9uIikscmVnaXN0ZXJlZE9w
dGlvbjpuKCJnZXRPcHRpb24iKSxyZWdpc3Rlck9wdGlvbnM6bigib3B0aW9ucyIpLHJlZ2lzdGVy
ZWRPcHRpb25zOm4oImdldE9wdGlvbnMiKSxyZWdpc3Rlck9wdGlvbnNGb3JUeXBlOm4oIm9wdGlv
bnNGb3JUeXBlIikscmVnaXN0ZXJlZE9wdGlvbnNGb3JUeXBlOm4oImdldE9wdGlvbnNGb3JUeXBl
IiksaW5qZWN0Om4oImluamVjdGlvbiIpfSl9KSxlKCJlbWJlci1ydW50aW1lL21peGlucy90YXJn
ZXRfYWN0aW9uX3N1cHBvcnQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1t
ZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL21peGlu
IiwiZW1iZXItbWV0YWwvY29tcHV0ZWQiXSxmdW5jdGlvbihlLHQscixuLGksbyl7InVzZSBzdHJp
Y3QiO3ZhciBhPWkuTWl4aW4uY3JlYXRlKHt0YXJnZXQ6bnVsbCxhY3Rpb246bnVsbCxhY3Rpb25D
b250ZXh0Om51bGwsdGFyZ2V0T2JqZWN0Om8uY29tcHV0ZWQoInRhcmdldCIsZnVuY3Rpb24oKXtp
Zih0aGlzLl90YXJnZXRPYmplY3QpcmV0dXJuIHRoaXMuX3RhcmdldE9iamVjdDt2YXIgZT1uLmdl
dCh0aGlzLCJ0YXJnZXQiKTtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciByPW4uZ2V0KHRoaXMs
ZSk7cmV0dXJuIHZvaWQgMD09PXImJihyPW4uZ2V0KHQuZGVmYXVsdC5sb29rdXAsZSkpLHJ9cmV0
dXJuIGV9KSxhY3Rpb25Db250ZXh0T2JqZWN0Om8uY29tcHV0ZWQoZnVuY3Rpb24oKXt2YXIgZT1u
LmdldCh0aGlzLCJhY3Rpb25Db250ZXh0Iik7aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgcj1u
LmdldCh0aGlzLGUpO3JldHVybiB2b2lkIDA9PT1yJiYocj1uLmdldCh0LmRlZmF1bHQubG9va3Vw
LGUpKSxyfXJldHVybiBlfSkucHJvcGVydHkoImFjdGlvbkNvbnRleHQiKSx0cmlnZ2VyQWN0aW9u
OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciByPVtdO3JldHVybiB0JiZyLnB1c2godCks
ci5jb25jYXQoZSl9dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDw9MHx8dm9pZCAwPT09YXJndW1lbnRz
WzBdP3t9OmFyZ3VtZW50c1swXSxyPXQuYWN0aW9ufHxuLmdldCh0aGlzLCJhY3Rpb24iKSxpPXQu
dGFyZ2V0fHxuLmdldCh0aGlzLCJ0YXJnZXRPYmplY3QiKSxvPXQuYWN0aW9uQ29udGV4dDtpZigi
dW5kZWZpbmVkIj09dHlwZW9mIG8mJihvPW4uZ2V0KHRoaXMsImFjdGlvbkNvbnRleHRPYmplY3Qi
KXx8dGhpcyksaSYmcil7dmFyIGE7cmV0dXJuIGE9aS5zZW5kP2kuc2VuZC5hcHBseShpLGUobyxy
KSk6aVtyXS5hcHBseShpLGUobykpLGEhPT0hMSYmKGE9ITApLGF9cmV0dXJuITF9fSk7ZS5kZWZh
dWx0PWF9KSxlKCJlbWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeSIsWyJleHBvcnRzIl0sZnVu
Y3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7aT1lfWZ1bmN0aW9uIHIoKXtyZXR1
cm4gaX1mdW5jdGlvbiBuKGUpe3JldHVybiBpW2VdfWUuc2V0U3RyaW5ncz10LGUuZ2V0U3RyaW5n
cz1yLGUuZ2V0PW47dmFyIGk9e319KSxlKCJlbWJlci1ydW50aW1lL3N5c3RlbS9hcHBsaWNhdGlv
biIsWyJleHBvcnRzIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlIl0sZnVuY3Rpb24o
ZSx0KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PXQuZGVmYXVsdC5leHRlbmQoKX0pLGUoImVtYmVy
LXJ1bnRpbWUvc3lzdGVtL2FycmF5X3Byb3h5IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1
ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLXJ1bnRpbWUvdXRpbHMiLCJlbWJl
ci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL21peGluIiwiZW1iZXItbWV0YWwvcHJvcGVy
dHlfZXZlbnRzIiwiZW1iZXItbWV0YWwvZXJyb3IiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmpl
Y3QiLCJlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxlX2FycmF5IiwiZW1iZXItcnVudGltZS9t
aXhpbnMvZW51bWVyYWJsZSIsImVtYmVyLW1ldGFsL2FsaWFzIiwiZW1iZXItcnVudGltZS9taXhp
bnMvYXJyYXkiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxsLGMsZixkKXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gcCgpe3JldHVybiB0aGlzfXZhciBoPSJJbmRleCBvdXQgb2YgcmFuZ2UiLG09
W10sdj11LmRlZmF1bHQuZXh0ZW5kKGwuZGVmYXVsdCx7Y29udGVudDpudWxsLGFycmFuZ2VkQ29u
dGVudDpmLmRlZmF1bHQoImNvbnRlbnQiKSxvYmplY3RBdENvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0
dXJuIGQub2JqZWN0QXQoci5nZXQodGhpcywiYXJyYW5nZWRDb250ZW50IiksZSl9LHJlcGxhY2VD
b250ZW50OmZ1bmN0aW9uKGUsdCxuKXtyLmdldCh0aGlzLCJjb250ZW50IikucmVwbGFjZShlLHQs
bil9LF9jb250ZW50V2lsbENoYW5nZTpvLl9iZWZvcmVPYnNlcnZlcigiY29udGVudCIsZnVuY3Rp
b24oKXt0aGlzLl90ZWFyZG93bkNvbnRlbnQoKX0pLF90ZWFyZG93bkNvbnRlbnQ6ZnVuY3Rpb24o
KXt2YXIgZT1yLmdldCh0aGlzLCJjb250ZW50Iik7ZSYmZC5yZW1vdmVBcnJheU9ic2VydmVyKGUs
dGhpcyx7d2lsbENoYW5nZToiY29udGVudEFycmF5V2lsbENoYW5nZSIsZGlkQ2hhbmdlOiJjb250
ZW50QXJyYXlEaWRDaGFuZ2UifSl9LGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6cCxjb250ZW50QXJy
YXlEaWRDaGFuZ2U6cCxfY29udGVudERpZENoYW5nZTpvLm9ic2VydmVyKCJjb250ZW50IixmdW5j
dGlvbigpe3IuZ2V0KHRoaXMsImNvbnRlbnQiKTt0aGlzLl9zZXR1cENvbnRlbnQoKX0pLF9zZXR1
cENvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgZT1yLmdldCh0aGlzLCJjb250ZW50Iik7ZSYmZC5hZGRB
cnJheU9ic2VydmVyKGUsdGhpcyx7d2lsbENoYW5nZToiY29udGVudEFycmF5V2lsbENoYW5nZSIs
ZGlkQ2hhbmdlOiJjb250ZW50QXJyYXlEaWRDaGFuZ2UifSl9LF9hcnJhbmdlZENvbnRlbnRXaWxs
Q2hhbmdlOm8uX2JlZm9yZU9ic2VydmVyKCJhcnJhbmdlZENvbnRlbnQiLGZ1bmN0aW9uKCl7dmFy
IGU9ci5nZXQodGhpcywiYXJyYW5nZWRDb250ZW50IiksdD1lP3IuZ2V0KGUsImxlbmd0aCIpOjA7
dGhpcy5hcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2UodGhpcywwLHQsdm9pZCAwKSx0aGlz
LmFycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2UodGhpcyksdGhpcy5fdGVhcmRvd25BcnJhbmdlZENv
bnRlbnQoZSl9KSxfYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOm8ub2JzZXJ2ZXIoImFycmFuZ2Vk
Q29udGVudCIsZnVuY3Rpb24oKXt2YXIgZT1yLmdldCh0aGlzLCJhcnJhbmdlZENvbnRlbnQiKSx0
PWU/ci5nZXQoZSwibGVuZ3RoIik6MDt0aGlzLl9zZXR1cEFycmFuZ2VkQ29udGVudCgpLHRoaXMu
YXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRoaXMpLHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlE
aWRDaGFuZ2UodGhpcywwLHZvaWQgMCx0KX0pLF9zZXR1cEFycmFuZ2VkQ29udGVudDpmdW5jdGlv
bigpe3ZhciBlPXIuZ2V0KHRoaXMsImFycmFuZ2VkQ29udGVudCIpO2UmJmQuYWRkQXJyYXlPYnNl
cnZlcihlLHRoaXMse3dpbGxDaGFuZ2U6ImFycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZSIs
ZGlkQ2hhbmdlOiJhcnJhbmdlZENvbnRlbnRBcnJheURpZENoYW5nZSJ9KX0sX3RlYXJkb3duQXJy
YW5nZWRDb250ZW50OmZ1bmN0aW9uKCl7dmFyIGU9ci5nZXQodGhpcywiYXJyYW5nZWRDb250ZW50
Iik7ZSYmZC5yZW1vdmVBcnJheU9ic2VydmVyKGUsdGhpcyx7d2lsbENoYW5nZToiYXJyYW5nZWRD
b250ZW50QXJyYXlXaWxsQ2hhbmdlIixkaWRDaGFuZ2U6ImFycmFuZ2VkQ29udGVudEFycmF5RGlk
Q2hhbmdlIn0pfSxhcnJhbmdlZENvbnRlbnRXaWxsQ2hhbmdlOnAsYXJyYW5nZWRDb250ZW50RGlk
Q2hhbmdlOnAsb2JqZWN0QXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHIuZ2V0KHRoaXMsImNvbnRlbnQi
KSYmdGhpcy5vYmplY3RBdENvbnRlbnQoZSl9LGxlbmd0aDppLmNvbXB1dGVkKGZ1bmN0aW9uKCl7
dmFyIGU9ci5nZXQodGhpcywiYXJyYW5nZWRDb250ZW50Iik7cmV0dXJuIGU/ci5nZXQoZSwibGVu
Z3RoIik6MH0pLF9yZXBsYWNlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yLmdldCh0aGlzLCJjb250
ZW50Iik7cmV0dXJuIGkmJnRoaXMucmVwbGFjZUNvbnRlbnQoZSx0LG4pLHRoaXN9LHJlcGxhY2U6
ZnVuY3Rpb24oKXtpZihyLmdldCh0aGlzLCJhcnJhbmdlZENvbnRlbnQiKSE9PXIuZ2V0KHRoaXMs
ImNvbnRlbnQiKSl0aHJvdyBuZXcgcy5kZWZhdWx0KCJVc2luZyByZXBsYWNlIG9uIGFuIGFycmFu
Z2VkIEFycmF5UHJveHkgaXMgbm90IGFsbG93ZWQuIik7dGhpcy5fcmVwbGFjZS5hcHBseSh0aGlz
LGFyZ3VtZW50cyl9LF9pbnNlcnRBdDpmdW5jdGlvbihlLHQpe2lmKGU+ci5nZXQodGhpcywiY29u
dGVudC5sZW5ndGgiKSl0aHJvdyBuZXcgcy5kZWZhdWx0KGgpO3JldHVybiB0aGlzLl9yZXBsYWNl
KGUsMCxbdF0pLHRoaXN9LGluc2VydEF0OmZ1bmN0aW9uKGUsdCl7aWYoci5nZXQodGhpcywiYXJy
YW5nZWRDb250ZW50Iik9PT1yLmdldCh0aGlzLCJjb250ZW50IikpcmV0dXJuIHRoaXMuX2luc2Vy
dEF0KGUsdCk7dGhyb3cgbmV3IHMuZGVmYXVsdCgiVXNpbmcgaW5zZXJ0QXQgb24gYW4gYXJyYW5n
ZWQgQXJyYXlQcm94eSBpcyBub3QgYWxsb3dlZC4iKX0scmVtb3ZlQXQ6ZnVuY3Rpb24oZSx0KXtp
ZigibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBuLGk9ci5nZXQodGhpcywiY29udGVudCIpLG89ci5n
ZXQodGhpcywiYXJyYW5nZWRDb250ZW50IiksdT1bXTtpZihlPDB8fGU+PXIuZ2V0KHRoaXMsImxl
bmd0aCIpKXRocm93IG5ldyBzLmRlZmF1bHQoaCk7Zm9yKHZvaWQgMD09PXQmJih0PTEpLG49ZTtu
PGUrdDtuKyspdS5wdXNoKGkuaW5kZXhPZihkLm9iamVjdEF0KG8sbikpKTtmb3IodS5zb3J0KGZ1
bmN0aW9uKGUsdCl7cmV0dXJuIHQtZX0pLGEuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKSxuPTA7bjx1
Lmxlbmd0aDtuKyspdGhpcy5fcmVwbGFjZSh1W25dLDEsbSk7YS5lbmRQcm9wZXJ0eUNoYW5nZXMo
KX1yZXR1cm4gdGhpc30scHVzaE9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW5zZXJ0
QXQoci5nZXQodGhpcywiY29udGVudC5sZW5ndGgiKSxlKSxlfSxwdXNoT2JqZWN0czpmdW5jdGlv
bihlKXtpZighYy5kZWZhdWx0LmRldGVjdChlKSYmIW4uaXNBcnJheShlKSl0aHJvdyBuZXcgVHlw
ZUVycm9yKCJNdXN0IHBhc3MgRW1iZXIuRW51bWVyYWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkj
cHVzaE9iamVjdHMiKTtyZXR1cm4gdGhpcy5fcmVwbGFjZShyLmdldCh0aGlzLCJsZW5ndGgiKSww
LGUpLHRoaXN9LHNldE9iamVjdHM6ZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0
aGlzLmNsZWFyKCk7dmFyIHQ9ci5nZXQodGhpcywibGVuZ3RoIik7cmV0dXJuIHRoaXMuX3JlcGxh
Y2UoMCx0LGUpLHRoaXN9LHVuc2hpZnRPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2lu
c2VydEF0KDAsZSksZX0sdW5zaGlmdE9iamVjdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Jl
cGxhY2UoMCwwLGUpLHRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50b0FycmF5KCk7
cmV0dXJuIGUuc2xpY2UuYXBwbHkoZSxhcmd1bWVudHMpfSxhcnJhbmdlZENvbnRlbnRBcnJheVdp
bGxDaGFuZ2U6ZnVuY3Rpb24oZSx0LHIsbil7dGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdlKHQs
cixuKX0sYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2U6ZnVuY3Rpb24oZSx0LHIsbil7dGhp
cy5hcnJheUNvbnRlbnREaWRDaGFuZ2UodCxyLG4pfSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3Vw
ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3NldHVwQ29udGVudCgpLHRoaXMuX3NldHVw
QXJyYW5nZWRDb250ZW50KCl9LHdpbGxEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fdGVhcmRvd25B
cnJhbmdlZENvbnRlbnQoKSx0aGlzLl90ZWFyZG93bkNvbnRlbnQoKX19KTtlLmRlZmF1bHQ9dn0p
LGUoImVtYmVyLXJ1bnRpbWUvc3lzdGVtL2NvbnRhaW5lciIsWyJleHBvcnRzIiwiZW1iZXItbWV0
YWwvcHJvcGVydHlfc2V0IiwiY29udGFpbmVyL3JlZ2lzdHJ5IiwiY29udGFpbmVyL2NvbnRhaW5l
ciIsImNvbnRhaW5lci9vd25lciJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO3Iu
ZGVmYXVsdC5zZXQ9dC5zZXQsbi5kZWZhdWx0LnNldD10LnNldCxlLlJlZ2lzdHJ5PXIuZGVmYXVs
dCxlLkNvbnRhaW5lcj1uLmRlZmF1bHQsZS5nZXRPd25lcj1pLmdldE93bmVyLGUuc2V0T3duZXI9
aS5zZXRPd25lcn0pLGUoImVtYmVyLXJ1bnRpbWUvc3lzdGVtL2NvcmVfb2JqZWN0IixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwiZW1iZXItbWV0
YWwvYXNzaWduIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvdXRpbHMi
LCJlbWJlci1tZXRhbC9tZXRhIiwiZW1iZXItbWV0YWwvY2hhaW5zIiwiZW1iZXItbWV0YWwvZXZl
bnRzIiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9lcnJvciIsImVtYmVyLXJ1bnRp
bWUvbWl4aW5zL2FjdGlvbl9oYW5kbGVyIiwiZW1iZXItbWV0YWwvcHJvcGVydGllcyIsImVtYmVy
LW1ldGFsL2JpbmRpbmciLCJlbWJlci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1ldGFsL2luamVj
dGVkX3Byb3BlcnR5IiwiZW1iZXItbWV0YWwvcnVuX2xvb3AiLCJlbWJlci1tZXRhbC93YXRjaGlu
ZyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1ydW50aW1lL2luamVjdCIsImVtYmVyLW1ldGFs
L3N5bWJvbCJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCxoLG0sdixiLGcs
eSxfKXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gdygpe3ZhciBlLHQ9ITEscj1mdW5jdGlvbigp
e3R8fHIucHJvdG8oKSxhcmd1bWVudHMubGVuZ3RoPjAmJihlPVthcmd1bWVudHNbMF1dKSx0aGlz
Ll9fZGVmaW5lTm9uRW51bWVyYWJsZShvLkdVSURfS0VZX1BST1BFUlRZKTt2YXIgaT1hLm1ldGEo
dGhpcyksZj1pLnByb3RvO2lmKGkucHJvdG89dGhpcyxlKXt2YXIgZD1lO2U9bnVsbDtmb3IodmFy
IHA9dGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzLGg9dGhpcy5tZXJnZWRQcm9wZXJ0aWVzLG09
MCx2PWQubGVuZ3RoO208djttKyspe3ZhciBiPWRbbV07aWYoIm9iamVjdCIhPXR5cGVvZiBiJiZ2
b2lkIDAhPT1iKXRocm93IG5ldyBjLmRlZmF1bHQoIkVtYmVyLk9iamVjdC5jcmVhdGUgb25seSBh
Y2NlcHRzIG9iamVjdHMuIik7aWYoYilmb3IodmFyIGc9T2JqZWN0LmtleXMoYikseT0wLF89Zy5s
ZW5ndGg7eTxfO3krKyl7dmFyIHc9Z1t5XSx4PWJbd107bC5JU19CSU5ESU5HLnRlc3QodykmJmku
d3JpdGVCaW5kaW5ncyh3LHgpO3ZhciBDPXRoaXNbd10sRT1udWxsIT09QyYmIm9iamVjdCI9PXR5
cGVvZiBDJiZDLmlzRGVzY3JpcHRvcj9DOnZvaWQgMDtpZihwJiZwLmxlbmd0aD4wJiZwLmluZGV4
T2Yodyk+PTApe3ZhciBUPXRoaXNbd107eD1UPyJmdW5jdGlvbiI9PXR5cGVvZiBULmNvbmNhdD9U
LmNvbmNhdCh4KTpvLm1ha2VBcnJheShUKS5jb25jYXQoeCk6by5tYWtlQXJyYXkoeCl9aWYoaCYm
aC5sZW5ndGgmJmguaW5kZXhPZih3KT49MCl7dmFyIE49dGhpc1t3XTt4PW4uZGVmYXVsdCh7fSxO
LHgpfUU/RS5zZXQodGhpcyx3LHgpOiJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnNldFVua25vd25Q
cm9wZXJ0eXx8dyBpbiB0aGlzP3RoaXNbd109eDp0aGlzLnNldFVua25vd25Qcm9wZXJ0eSh3LHgp
fX19Tyh0aGlzLGkpO3ZhciBTPWFyZ3VtZW50cy5sZW5ndGg7aWYoMD09PVMpdGhpcy5pbml0KCk7
ZWxzZSBpZigxPT09Uyl0aGlzLmluaXQoYXJndW1lbnRzWzBdKTtlbHNle2Zvcih2YXIgQT1uZXcg
QXJyYXkoUyksUD0wO1A8UztQKyspQVtQXT1hcmd1bWVudHNbUF07dGhpcy5pbml0LmFwcGx5KHRo
aXMsQSl9dGhpc1trXSgpLGkucHJvdG89ZixzLmZpbmlzaENoYWlucyh0aGlzKSx1LnNlbmRFdmVu
dCh0aGlzLCJpbml0Iil9O3JldHVybiByLnRvU3RyaW5nPWwuTWl4aW4ucHJvdG90eXBlLnRvU3Ry
aW5nLHIud2lsbFJlb3Blbj1mdW5jdGlvbigpe3QmJihyLlByb3RvdHlwZU1peGluPWwuTWl4aW4u
Y3JlYXRlKHIuUHJvdG90eXBlTWl4aW4pKSx0PSExfSxyLl9pbml0UHJvcGVydGllcz1mdW5jdGlv
bih0KXtlPXR9LHIucHJvdG89ZnVuY3Rpb24oKXt2YXIgZT1yLnN1cGVyY2xhc3M7cmV0dXJuIGUm
JmUucHJvdG8oKSx0fHwodD0hMCxyLlByb3RvdHlwZU1peGluLmFwcGx5UGFydGlhbChyLnByb3Rv
dHlwZSkpLHRoaXMucHJvdG90eXBlfSxyfXZhciB4LGs9Xy5kZWZhdWx0KCJQT1NUX0lOSVQiKTtl
LlBPU1RfSU5JVD1rO3ZhciBDPXYuZGVmYXVsdC5zY2hlZHVsZSxFPWwuTWl4aW4uX2FwcGx5LE89
bC5NaXhpbi5maW5pc2hQYXJ0aWFsLFQ9bC5NaXhpbi5wcm90b3R5cGUucmVvcGVuLE49ITEsUz13
KCk7Uy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJFbWJlci5Db3JlT2JqZWN0In0sUy5Qcm90
b3R5cGVNaXhpbj1sLk1peGluLmNyZWF0ZSgoeD17cmVvcGVuOmZ1bmN0aW9uKCl7Zm9yKHZhciBl
PWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxyPTA7cjxlO3IrKyl0W3JdPWFyZ3VtZW50c1ty
XTtyZXR1cm4gRSh0aGlzLHQsITApLHRoaXN9LGluaXQ6ZnVuY3Rpb24oKXt9fSx4W2tdPWZ1bmN0
aW9uKCl7fSx4Ll9fZGVmaW5lTm9uRW51bWVyYWJsZT1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5l
UHJvcGVydHkodGhpcyxlLm5hbWUsZS5kZXNjcmlwdG9yKX0seC5jb25jYXRlbmF0ZWRQcm9wZXJ0
aWVzPW51bGwseC5tZXJnZWRQcm9wZXJ0aWVzPW51bGwseC5pc0Rlc3Ryb3llZD0hMSx4LmlzRGVz
dHJveWluZz0hMSx4LmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighdGhpcy5pc0Rlc3Ryb3lpbmcpcmV0
dXJuIHRoaXMuaXNEZXN0cm95aW5nPSEwLEMoImFjdGlvbnMiLHRoaXMsdGhpcy53aWxsRGVzdHJv
eSksQygiZGVzdHJveSIsdGhpcyx0aGlzLl9zY2hlZHVsZWREZXN0cm95KSx0aGlzfSx4LndpbGxE
ZXN0cm95PWcuSyx4Ll9zY2hlZHVsZWREZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5pc0Rlc3Ryb3ll
ZHx8KGIuZGVzdHJveSh0aGlzKSx0aGlzLmlzRGVzdHJveWVkPSEwKX0seC5iaW5kPWZ1bmN0aW9u
KGUsdCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBwLkJpbmRpbmd8fCh0PXAuQmluZGluZy5mcm9tKHQp
KSx0LnRvKGUpLmNvbm5lY3QodGhpcyksdH0seC50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPSJm
dW5jdGlvbiI9PXR5cGVvZiB0aGlzLnRvU3RyaW5nRXh0ZW5zaW9uLHQ9ZT8iOiIrdGhpcy50b1N0
cmluZ0V4dGVuc2lvbigpOiIiLHI9IjwiK3RoaXMuY29uc3RydWN0b3IudG9TdHJpbmcoKSsiOiIr
by5ndWlkRm9yKHRoaXMpK3QrIj4iO3JldHVybiByfSx4KSksUy5Qcm90b3R5cGVNaXhpbi5vd25l
ckNvbnN0cnVjdG9yPVMsUy5fX3N1cGVyX189bnVsbDt2YXIgQT17Q2xhc3NNaXhpbjpsLlJFUVVJ
UkVELFByb3RvdHlwZU1peGluOmwuUkVRVUlSRUQsaXNDbGFzczohMCxpc01ldGhvZDohMSxleHRl
bmQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXcoKTtyZXR1cm4gdC5DbGFzc01peGluPWwuTWl4aW4uY3Jl
YXRlKHRoaXMuQ2xhc3NNaXhpbiksdC5Qcm90b3R5cGVNaXhpbj1sLk1peGluLmNyZWF0ZSh0aGlz
LlByb3RvdHlwZU1peGluKSx0LkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3Rvcj10LHQuUHJvdG90
eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3Rvcj10LFQuYXBwbHkodC5Qcm90b3R5cGVNaXhpbixhcmd1
bWVudHMpLHQuc3VwZXJjbGFzcz10aGlzLHQuX19zdXBlcl9fPXRoaXMucHJvdG90eXBlLGU9dC5w
cm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0aGlzLnByb3RvdHlwZSksZS5jb25zdHJ1Y3Rvcj10LG8u
Z2VuZXJhdGVHdWlkKGUpLGEubWV0YShlKS5wcm90bz1lLHQuQ2xhc3NNaXhpbi5hcHBseSh0KSx0
fSxjcmVhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGgscj1B
cnJheSh0KSxuPTA7bjx0O24rKylyW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gci5sZW5ndGg+MCYm
dGhpcy5faW5pdFByb3BlcnRpZXMociksbmV3IGV9LHJlb3BlbjpmdW5jdGlvbigpe3JldHVybiB0
aGlzLndpbGxSZW9wZW4oKSxULmFwcGx5KHRoaXMuUHJvdG90eXBlTWl4aW4sYXJndW1lbnRzKSx0
aGlzfSxyZW9wZW5DbGFzczpmdW5jdGlvbigpe3JldHVybiBULmFwcGx5KHRoaXMuQ2xhc3NNaXhp
bixhcmd1bWVudHMpLEUodGhpcyxhcmd1bWVudHMsITEpLHRoaXN9LGRldGVjdDpmdW5jdGlvbihl
KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4hMTtmb3IoO2U7KXtpZihlPT09dGhpcyly
ZXR1cm4hMDtlPWUuc3VwZXJjbGFzc31yZXR1cm4hMX0sZGV0ZWN0SW5zdGFuY2U6ZnVuY3Rpb24o
ZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0aGlzfSxtZXRhRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSl7
dmFyIHQ9dGhpcy5wcm90bygpLHI9dFtlXSxuPW51bGwhPT1yJiYib2JqZWN0Ij09dHlwZW9mIHIm
JnIuaXNEZXNjcmlwdG9yP3I6dm9pZCAwO3JldHVybiBuLl9tZXRhfHx7fX0sX2NvbXB1dGVkUHJv
cGVydGllczpoLmNvbXB1dGVkKGZ1bmN0aW9uKCl7Tj0hMDt2YXIgZSx0PXRoaXMucHJvdG8oKSxy
PVtdO2Zvcih2YXIgbiBpbiB0KWU9dFtuXSxlJiZlLmlzRGVzY3JpcHRvciYmci5wdXNoKHtuYW1l
Om4sbWV0YTplLl9tZXRhfSk7cmV0dXJuIHJ9KS5yZWFkT25seSgpLGVhY2hDb21wdXRlZFByb3Bl
cnR5OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG49e30sbz1pLmdldCh0aGlzLCJfY29tcHV0ZWRQ
cm9wZXJ0aWVzIiksYT0wLHM9by5sZW5ndGg7YTxzO2ErKylyPW9bYV0sZS5jYWxsKHR8fHRoaXMs
ci5uYW1lLHIubWV0YXx8bil9fTtBLl9sYXp5SW5qZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlLHQs
cj17fSxuPXRoaXMucHJvdG8oKTtmb3IoZSBpbiBuKXQ9bltlXSx0IGluc3RhbmNlb2YgbS5kZWZh
dWx0JiYocltlXT10LnR5cGUrIjoiKyh0Lm5hbWV8fGUpKTtyZXR1cm4gcn07dmFyIFA9bC5NaXhp
bi5jcmVhdGUoQSk7UC5vd25lckNvbnN0cnVjdG9yPVMsUy5DbGFzc01peGluPVAsUC5hcHBseShT
KSxTLnJlb3Blbih7ZGlkRGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LHIpe2lmKE4hPT0hMSYm
ciBpbnN0YW5jZW9mIGguQ29tcHV0ZWRQcm9wZXJ0eSl7dmFyIG49YS5tZXRhKHRoaXMuY29uc3Ry
dWN0b3IpLnJlYWRhYmxlQ2FjaGUoKTtuJiZ2b2lkIDAhPT1uLl9jb21wdXRlZFByb3BlcnRpZXMm
JihuLl9jb21wdXRlZFByb3BlcnRpZXM9dm9pZCAwKX19fSksZS5kZWZhdWx0PVN9KSxlKCJlbWJl
ci1ydW50aW1lL3N5c3RlbS9lYWNoX3Byb3h5IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1
ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL29ic2VydmVyIiwiZW1i
ZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzIiwiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwiZW1i
ZXItcnVudGltZS9taXhpbnMvYXJyYXkiXSxmdW5jdGlvbihlLHQscixuLGksbyxhKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gcyhlKXt0aGlzLl9jb250ZW50PWUsdGhpcy5fa2V5cz12b2lkIDAsdGhp
cy5fX2VtYmVyX21ldGFfXz1udWxsfWZ1bmN0aW9uIHUoZSx0LHIsaSxvKXtmb3IoOy0tbz49aTsp
e3ZhciBzPWEub2JqZWN0QXQoZSxvKTtzJiYobi5fYWRkQmVmb3JlT2JzZXJ2ZXIocyx0LHIsImNv
bnRlbnRLZXlXaWxsQ2hhbmdlIiksbi5hZGRPYnNlcnZlcihzLHQsciwiY29udGVudEtleURpZENo
YW5nZSIpKX19ZnVuY3Rpb24gbChlLHQscixpLG8pe2Zvcig7LS1vPj1pOyl7dmFyIHM9YS5vYmpl
Y3RBdChlLG8pO3MmJihuLl9yZW1vdmVCZWZvcmVPYnNlcnZlcihzLHQsciwiY29udGVudEtleVdp
bGxDaGFuZ2UiKSxuLnJlbW92ZU9ic2VydmVyKHMsdCxyLCJjb250ZW50S2V5RGlkQ2hhbmdlIikp
fX1zLnByb3RvdHlwZT17X19kZWZpbmVOb25FbnVtZXJhYmxlOmZ1bmN0aW9uKGUpe3RoaXNbZS5u
YW1lXT1lLmRlc2NyaXB0b3IudmFsdWV9LGFycmF5V2lsbENoYW5nZTpmdW5jdGlvbihlLHQscixu
KXt2YXIgbz10aGlzLl9rZXlzLGE9cj4wP3QrcjotMTtmb3IodmFyIHMgaW4gbylhPjAmJmwoZSxz
LHRoaXMsdCxhKSxpLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLHMpfSxhcnJheURpZENoYW5nZTpm
dW5jdGlvbihlLHQscixuKXt2YXIgbz10aGlzLl9rZXlzLGE9bj4wP3QrbjotMTtmb3IodmFyIHMg
aW4gbylhPjAmJnUoZSxzLHRoaXMsdCxhKSxpLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMscyl9LHdp
bGxXYXRjaFByb3BlcnR5OmZ1bmN0aW9uKGUpe3RoaXMuYmVnaW5PYnNlcnZpbmdDb250ZW50S2V5
KGUpfSxkaWRVbndhdGNoUHJvcGVydHk6ZnVuY3Rpb24oZSl7dGhpcy5zdG9wT2JzZXJ2aW5nQ29u
dGVudEtleShlKX0sYmVnaW5PYnNlcnZpbmdDb250ZW50S2V5OmZ1bmN0aW9uKGUpe3ZhciB0PXRo
aXMuX2tleXM7aWYodHx8KHQ9dGhpcy5fa2V5cz1uZXcgby5kZWZhdWx0KSx0W2VdKXRbZV0rKztl
bHNle3RbZV09MTt2YXIgbj10aGlzLl9jb250ZW50LGk9ci5nZXQobiwibGVuZ3RoIik7dShuLGUs
dGhpcywwLGkpfX0sc3RvcE9ic2VydmluZ0NvbnRlbnRLZXk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhp
cy5fa2V5cztpZih0JiZ0W2VdPjAmJi0tdFtlXTw9MCl7dmFyIG49dGhpcy5fY29udGVudCxpPXIu
Z2V0KG4sImxlbmd0aCIpO2wobixlLHRoaXMsMCxpKX19LGNvbnRlbnRLZXlXaWxsQ2hhbmdlOmZ1
bmN0aW9uKGUsdCl7aS5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcyx0KX0sY29udGVudEtleURpZENo
YW5nZTpmdW5jdGlvbihlLHQpe2kucHJvcGVydHlEaWRDaGFuZ2UodGhpcyx0KX19LGUuZGVmYXVs
dD1zfSksZSgiZW1iZXItcnVudGltZS9zeXN0ZW0vbGF6eV9sb2FkIixbImV4cG9ydHMiLCJlbWJl
ci1tZXRhbC9jb3JlIiwiZW1iZXItcnVudGltZS9zeXN0ZW0vbmF0aXZlX2FycmF5Il0sZnVuY3Rp
b24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUsdCl7dmFyIG49YVtlXTtvW2VdPW9b
ZV18fHIuQSgpLG9bZV0ucHVzaE9iamVjdCh0KSxuJiZ0KG4pfWZ1bmN0aW9uIGkoZSx0KXtpZihh
W2VdPXQsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cu
ZGlzcGF0Y2hFdmVudCYmImZ1bmN0aW9uIj09dHlwZW9mIEN1c3RvbUV2ZW50KXt2YXIgcj1uZXcg
Q3VzdG9tRXZlbnQoZSx7ZGV0YWlsOnQsbmFtZTplfSk7d2luZG93LmRpc3BhdGNoRXZlbnQocil9
b1tlXSYmb1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSl9ZS5vbkxvYWQ9bixl
LnJ1bkxvYWRIb29rcz1pO3ZhciBvPXQuZGVmYXVsdC5FTlYuRU1CRVJfTE9BRF9IT09LU3x8e30s
YT17fSxzPWE7ZS5fbG9hZGVkPXN9KSxlKCJlbWJlci1ydW50aW1lL3N5c3RlbS9uYW1lc3BhY2Ui
LFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2NvcmUiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQi
LCJlbWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFsL21peGluIiwiZW1iZXItcnVudGltZS9z
eXN0ZW0vb2JqZWN0Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlv
biBhKGUsdCxyKXt2YXIgaT1lLmxlbmd0aDtoW2Uuam9pbigiLiIpXT10O2Zvcih2YXIgbyBpbiB0
KWlmKG0uY2FsbCh0LG8pKXt2YXIgcz10W29dO2lmKGVbaV09byxzJiZzLnRvU3RyaW5nPT09YyYm
IXNbYl0pc1tiXT1lLmpvaW4oIi4iKTtlbHNlIGlmKHMmJnMuaXNOYW1lc3BhY2Upe2lmKHJbbi5n
dWlkRm9yKHMpXSljb250aW51ZTtyW24uZ3VpZEZvcihzKV09ITAsYShlLHMscil9fWUubGVuZ3Ro
PWl9ZnVuY3Rpb24gcyhlLHQpe3RyeXt2YXIgcj1lW3RdO3JldHVybiByJiZyLmlzTmFtZXNwYWNl
JiZyfWNhdGNoKGUpe319ZnVuY3Rpb24gdSgpe3ZhciBlLHI9dC5kZWZhdWx0Lmxvb2t1cDtpZigh
cC5QUk9DRVNTRUQpZm9yKHZhciBuIGluIHIpdi50ZXN0KG4pJiYoci5oYXNPd25Qcm9wZXJ0eSYm
IXIuaGFzT3duUHJvcGVydHkobil8fChlPXMocixuKSxlJiYoZVtiXT1uKSkpfWZ1bmN0aW9uIGwo
ZSl7dmFyIHQ9ZS5zdXBlcmNsYXNzO3JldHVybiB0P3RbYl0/dFtiXTpsKHQpOnZvaWQgMH1mdW5j
dGlvbiBjKCl7dC5kZWZhdWx0LkJPT1RFRHx8dGhpc1tiXXx8ZigpO3ZhciBlO2lmKHRoaXNbYl0p
ZT10aGlzW2JdO2Vsc2UgaWYodGhpcy5fdG9TdHJpbmcpZT10aGlzLl90b1N0cmluZztlbHNle3Zh
ciByPWwodGhpcyk7ZT1yPyIoc3ViY2xhc3Mgb2YgIityKyIpIjoiKHVua25vd24gbWl4aW4pIix0
aGlzLnRvU3RyaW5nPWQoZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZigpe3ZhciBlPSFwLlBST0NFU1NF
RCxyPXQuZGVmYXVsdC5hbnlVbnByb2Nlc3NlZE1peGlucztpZihlJiYodSgpLHAuUFJPQ0VTU0VE
PSEwKSxlfHxyKXtmb3IodmFyIG4saT1wLk5BTUVTUEFDRVMsbz0wLHM9aS5sZW5ndGg7bzxzO28r
KyluPWlbb10sYShbbi50b1N0cmluZygpXSxuLHt9KTt0LmRlZmF1bHQuYW55VW5wcm9jZXNzZWRN
aXhpbnM9ITF9fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fXZhciBw
PW8uZGVmYXVsdC5leHRlbmQoe2lzTmFtZXNwYWNlOiEwLGluaXQ6ZnVuY3Rpb24oKXtwLk5BTUVT
UEFDRVMucHVzaCh0aGlzKSxwLlBST0NFU1NFRD0hMX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIg
ZT1yLmdldCh0aGlzLCJuYW1lIil8fHIuZ2V0KHRoaXMsIm1vZHVsZVByZWZpeCIpO3JldHVybiBl
P2U6KHUoKSx0aGlzW2JdKX0sbmFtZUNsYXNzZXM6ZnVuY3Rpb24oKXthKFt0aGlzLnRvU3RyaW5n
KCldLHRoaXMse30pfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9cC5OQU1FU1BBQ0VTLHI9dGhp
cy50b1N0cmluZygpO3ImJih0LmRlZmF1bHQubG9va3VwW3JdPXZvaWQgMCxkZWxldGUgcC5OQU1F
U1BBQ0VTX0JZX0lEW3JdKSxlLnNwbGljZShlLmluZGV4T2YodGhpcyksMSksdGhpcy5fc3VwZXIu
YXBwbHkodGhpcyxhcmd1bWVudHMpfX0pO3AucmVvcGVuQ2xhc3Moe05BTUVTUEFDRVM6W3QuZGVm
YXVsdF0sTkFNRVNQQUNFU19CWV9JRDp7fSxQUk9DRVNTRUQ6ITEscHJvY2Vzc0FsbDpmLGJ5TmFt
ZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5kZWZhdWx0LkJPT1RFRHx8ZigpLGhbZV19fSk7dmFyIGg9
cC5OQU1FU1BBQ0VTX0JZX0lELG09e30uaGFzT3duUHJvcGVydHksdj0vXltBLVpdLyxiPXQuZGVm
YXVsdC5OQU1FX0tFWT1uLkdVSURfS0VZKyJfbmFtZSI7aS5NaXhpbi5wcm90b3R5cGUudG9TdHJp
bmc9YyxlLmRlZmF1bHQ9cH0pLGUoImVtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2ZV9hcnJheSIs
WyJleHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLW1ldGFsL3JlcGxhY2UiLCJlbWJl
ci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9taXhpbiIsImVtYmVyLXJ1bnRpbWUv
bWl4aW5zL2FycmF5IiwiZW1iZXItcnVudGltZS9taXhpbnMvbXV0YWJsZV9hcnJheSIsImVtYmVy
LXJ1bnRpbWUvbWl4aW5zL29ic2VydmFibGUiLCJlbWJlci1ydW50aW1lL21peGlucy9jb3B5YWJs
ZSIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2ZyZWV6YWJsZSIsImVtYmVyLXJ1bnRpbWUvY29weSJd
LGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyl7InVzZSBzdHJpY3QiO3ZhciBmPWkuTWl4
aW4uY3JlYXRlKGEuZGVmYXVsdCxzLmRlZmF1bHQsdS5kZWZhdWx0LHtnZXQ6ZnVuY3Rpb24oZSl7
cmV0dXJuImxlbmd0aCI9PT1lP3RoaXMubGVuZ3RoOiJudW1iZXIiPT10eXBlb2YgZT90aGlzW2Vd
OnRoaXMuX3N1cGVyKGUpfSxvYmplY3RBdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlXX0scmVw
bGFjZTpmdW5jdGlvbihlLHQsaSl7aWYodGhpcy5pc0Zyb3plbil0aHJvdyBsLkZST1pFTl9FUlJP
Ujt2YXIgbz1pP24uZ2V0KGksImxlbmd0aCIpOjA7cmV0dXJuIHRoaXMuYXJyYXlDb250ZW50V2ls
bENoYW5nZShlLHQsbyksMD09PW8/dGhpcy5zcGxpY2UoZSx0KTpyLl9yZXBsYWNlKHRoaXMsZSx0
LGkpLHRoaXMuYXJyYXlDb250ZW50RGlkQ2hhbmdlKGUsdCxvKSx0aGlzfSx1bmtub3duUHJvcGVy
dHk6ZnVuY3Rpb24oZSx0KXt2YXIgcjtyZXR1cm4gdm9pZCAwIT09dCYmdm9pZCAwPT09ciYmKHI9
dGhpc1tlXT10KSxyfSxpbmRleE9mOkFycmF5LnByb3RvdHlwZS5pbmRleE9mLGxhc3RJbmRleE9m
OkFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZixjb3B5OmZ1bmN0aW9uKGUpe3JldHVybiBlP3Ro
aXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjLmRlZmF1bHQoZSwhMCl9KTp0aGlzLnNsaWNlKCl9
fSksZD1bImxlbmd0aCJdO2Yua2V5cygpLmZvckVhY2goZnVuY3Rpb24oZSl7QXJyYXkucHJvdG90
eXBlW2VdJiZkLnB1c2goZSl9KSxlLk5hdGl2ZUFycmF5PWY9Zi53aXRob3V0LmFwcGx5KGYsZCk7
dmFyIHA7dC5kZWZhdWx0LkVYVEVORF9QUk9UT1RZUEVTPT09ITB8fHQuZGVmYXVsdC5FWFRFTkRf
UFJPVE9UWVBFUy5BcnJheT8oZi5hcHBseShBcnJheS5wcm90b3R5cGUpLGUuQT1wPWZ1bmN0aW9u
KGUpe3JldHVybiBlfHxbXX0pOmUuQT1wPWZ1bmN0aW9uKGUpe3JldHVybiBlfHwoZT1bXSksby5k
ZWZhdWx0LmRldGVjdChlKT9lOmYuYXBwbHkoZSl9LHQuZGVmYXVsdC5BPXAsZS5BPXAsZS5OYXRp
dmVBcnJheT1mLGUuZGVmYXVsdD1mfSksZSgiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0Iixb
ImV4cG9ydHMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9jb3JlX29iamVjdCIsImVtYmVyLXJ1bnRp
bWUvbWl4aW5zL29ic2VydmFibGUiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBu
PXQuZGVmYXVsdC5leHRlbmQoci5kZWZhdWx0KTtuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJu
IkVtYmVyLk9iamVjdCJ9LGUuZGVmYXVsdD1ufSksZSgiZW1iZXItcnVudGltZS9zeXN0ZW0vb2Jq
ZWN0X3Byb3h5IixbImV4cG9ydHMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QiLCJlbWJl
ci1ydW50aW1lL21peGlucy8tcHJveHkiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Uu
ZGVmYXVsdD10LmRlZmF1bHQuZXh0ZW5kKHIuZGVmYXVsdCl9KSxlKCJlbWJlci1ydW50aW1lL3N5
c3RlbS9zZXJ2aWNlIixbImV4cG9ydHMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QiLCJl
bWJlci1ydW50aW1lL2luamVjdCJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ci5jcmVh
dGVJbmplY3Rpb25IZWxwZXIoInNlcnZpY2UiKTt2YXIgbj10LmRlZmF1bHQuZXh0ZW5kKCk7bi5y
ZW9wZW5DbGFzcyh7aXNTZXJ2aWNlRmFjdG9yeTohMH0pLGUuZGVmYXVsdD1ufSksZSgiZW1iZXIt
cnVudGltZS9zeXN0ZW0vc3RyaW5nIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVt
YmVyLW1ldGFsL3V0aWxzIiwiZW1iZXItcnVudGltZS91dGlscyIsImVtYmVyLXJ1bnRpbWUvc3Ry
aW5nX3JlZ2lzdHJ5IiwiZW1iZXItbWV0YWwvY2FjaGUiXSxmdW5jdGlvbihlLHQscixuLGksbyl7
InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoZSx0KXt2YXIgaT10O2lmKCFuLmlzQXJyYXkoaSl8fGFy
Z3VtZW50cy5sZW5ndGg+Mil7aT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtmb3IodmFy
IG89MSxhPWFyZ3VtZW50cy5sZW5ndGg7bzxhO28rKylpW28tMV09YXJndW1lbnRzW29dfXZhciBz
PTA7cmV0dXJuIGUucmVwbGFjZSgvJUAoWzAtOV0rKT8vZyxmdW5jdGlvbihlLHQpe3JldHVybiB0
PXQ/cGFyc2VJbnQodCwxMCktMTpzKyssZT1pW3RdLG51bGw9PT1lPyIobnVsbCkiOnZvaWQgMD09
PWU/IiI6ci5pbnNwZWN0KGUpfSl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBhLmFwcGx5KHZvaWQg
MCxhcmd1bWVudHMpfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4oIW4uaXNBcnJheSh0KXx8YXJndW1l
bnRzLmxlbmd0aD4yKSYmKHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEp
KSxlPWkuZ2V0KGUpfHxlLGEoZSx0KX1mdW5jdGlvbiBsKGUpe3JldHVybiBlLnNwbGl0KC9ccysv
KX1mdW5jdGlvbiBjKGUpe3JldHVybiBQLmdldChlKX1mdW5jdGlvbiBmKGUpe3JldHVybiBiLmdl
dChlKX1mdW5jdGlvbiBkKGUpe3JldHVybiBfLmdldChlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBD
LmdldChlKX1mdW5jdGlvbiBoKGUpe3JldHVybiBULmdldChlKX1mdW5jdGlvbiBtKGUpe3JldHVy
biBTLmdldChlKX12YXIgdj0vWyBfXS9nLGI9bmV3IG8uZGVmYXVsdCgxZTMsZnVuY3Rpb24oZSl7
cmV0dXJuIGMoZSkucmVwbGFjZSh2LCItIil9KSxnPS8oXC18XF98XC58XHMpKyguKT8vZyx5PS8o
XnxcLykoW0EtWl0pL2csXz1uZXcgby5kZWZhdWx0KDFlMyxmdW5jdGlvbihlKXtyZXR1cm4gZS5y
ZXBsYWNlKGcsZnVuY3Rpb24oZSx0LHIpe3JldHVybiByP3IudG9VcHBlckNhc2UoKToiIn0pLnJl
cGxhY2UoeSxmdW5jdGlvbihlLHQscil7cmV0dXJuIGUudG9Mb3dlckNhc2UoKX0pfSksdz0vXihc
LXxfKSsoLik/Lyx4PS8oLikoXC18XF98XC58XHMpKyguKT8vZyxrPS8oXnxcL3xcLikoW2Etel0p
L2csQz1uZXcgby5kZWZhdWx0KDFlMyxmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZnVuY3Rpb24oZSx0
LHIpe3JldHVybiByPyJfIityLnRvVXBwZXJDYXNlKCk6IiJ9LHI9ZnVuY3Rpb24oZSx0LHIsbil7
cmV0dXJuIHQrKG4/bi50b1VwcGVyQ2FzZSgpOiIiKX0sbj1lLnNwbGl0KCIvIiksaT0wLG89bi5s
ZW5ndGg7aTxvO2krKyluW2ldPW5baV0ucmVwbGFjZSh3LHQpLnJlcGxhY2UoeCxyKTtyZXR1cm4g
bi5qb2luKCIvIikucmVwbGFjZShrLGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZS50b1VwcGVyQ2Fz
ZSgpfSl9KSxFPS8oW2EtelxkXSkoW0EtWl0rKS9nLE89L1wtfFxzKy9nLFQ9bmV3IG8uZGVmYXVs
dCgxZTMsZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShFLCIkMV8kMiIpLnJlcGxhY2UoTywi
XyIpLnRvTG93ZXJDYXNlKCl9KSxOPS8oXnxcLykoW2Etel0pL2csUz1uZXcgby5kZWZhdWx0KDFl
MyxmdW5jdGlvbihlKXsKK3JldHVybiBlLnJlcGxhY2UoTixmdW5jdGlvbihlLHQscil7cmV0dXJu
IGUudG9VcHBlckNhc2UoKX0pfSksQT0vKFthLXpcZF0pKFtBLVpdKS9nLFA9bmV3IG8uZGVmYXVs
dCgxZTMsZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShBLCIkMV8kMiIpLnRvTG93ZXJDYXNl
KCl9KTtlLmRlZmF1bHQ9e2ZtdDpzLGxvYzp1LHc6bCxkZWNhbWVsaXplOmMsZGFzaGVyaXplOmYs
Y2FtZWxpemU6ZCxjbGFzc2lmeTpwLHVuZGVyc2NvcmU6aCxjYXBpdGFsaXplOm19LGUuZm10PXMs
ZS5sb2M9dSxlLnc9bCxlLmRlY2FtZWxpemU9YyxlLmRhc2hlcml6ZT1mLGUuY2FtZWxpemU9ZCxl
LmNsYXNzaWZ5PXAsZS51bmRlcnNjb3JlPWgsZS5jYXBpdGFsaXplPW19KSxlKCJlbWJlci1ydW50
aW1lL3V0aWxzIixbImV4cG9ydHMiLCJlbWJlci1ydW50aW1lL21peGlucy9hcnJheSIsImVtYmVy
LXJ1bnRpbWUvc3lzdGVtL29iamVjdCJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gbihlKXtpZighZXx8ZS5zZXRJbnRlcnZhbClyZXR1cm4hMTtpZihBcnJheS5pc0FycmF5
KGUpKXJldHVybiEwO2lmKHQuZGVmYXVsdC5kZXRlY3QoZSkpcmV0dXJuITA7dmFyIHI9aShlKTty
ZXR1cm4iYXJyYXkiPT09cnx8dm9pZCAwIT09ZS5sZW5ndGgmJiJvYmplY3QiPT09cn1mdW5jdGlv
biBpKGUpe2lmKG51bGw9PT1lKXJldHVybiJudWxsIjtpZih2b2lkIDA9PT1lKXJldHVybiJ1bmRl
ZmluZWQiO3ZhciB0PW9bYS5jYWxsKGUpXXx8Im9iamVjdCI7cmV0dXJuImZ1bmN0aW9uIj09PXQ/
ci5kZWZhdWx0LmRldGVjdChlKSYmKHQ9ImNsYXNzIik6Im9iamVjdCI9PT10JiYoZSBpbnN0YW5j
ZW9mIEVycm9yP3Q9ImVycm9yIjplIGluc3RhbmNlb2Ygci5kZWZhdWx0P3Q9Imluc3RhbmNlIjpl
IGluc3RhbmNlb2YgRGF0ZSYmKHQ9ImRhdGUiKSksdH1lLmlzQXJyYXk9bixlLnR5cGVPZj1pO3Zh
ciBvPXsiW29iamVjdCBCb29sZWFuXSI6ImJvb2xlYW4iLCJbb2JqZWN0IE51bWJlcl0iOiJudW1i
ZXIiLCJbb2JqZWN0IFN0cmluZ10iOiJzdHJpbmciLCJbb2JqZWN0IEZ1bmN0aW9uXSI6ImZ1bmN0
aW9uIiwiW29iamVjdCBBcnJheV0iOiJhcnJheSIsIltvYmplY3QgRGF0ZV0iOiJkYXRlIiwiW29i
amVjdCBSZWdFeHBdIjoicmVnZXhwIiwiW29iamVjdCBPYmplY3RdIjoib2JqZWN0In0sYT1PYmpl
Y3QucHJvdG90eXBlLnRvU3RyaW5nfSksZSgiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvY29tcGF0
IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIv
Y29tcGF0L3ByZWNvbXBpbGUiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY29tcGls
ZSIsImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSJdLGZ1bmN0aW9uKGUs
dCxyLG4saSl7InVzZSBzdHJpY3QiO3ZhciBvPXQuZGVmYXVsdC5IYW5kbGViYXJzPXQuZGVmYXVs
dC5IYW5kbGViYXJzfHx7fTtvLnByZWNvbXBpbGU9ci5kZWZhdWx0LG8uY29tcGlsZT1uLmRlZmF1
bHQsby50ZW1wbGF0ZT1pLmRlZmF1bHR9KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9jb21w
YXQvcHJlY29tcGlsZSIsWyJleHBvcnRzIiwicmVxdWlyZSIsImVtYmVyLXRlbXBsYXRlLWNvbXBp
bGVyL3N5c3RlbS9jb21waWxlX29wdGlvbnMiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3Qi
O3ZhciBuLGk7ZS5kZWZhdWx0PWZ1bmN0aW9uKGUpe2lmKCghbnx8IWkpJiZ0LmhhcygiaHRtbGJh
cnMtY29tcGlsZXIvY29tcGlsZXIiKSl7dmFyIG89dC5kZWZhdWx0KCJodG1sYmFycy1jb21waWxl
ci9jb21waWxlciIpO249by5jb21waWxlLGk9by5jb21waWxlU3BlY31pZighbnx8IWkpdGhyb3cg
bmV3IEVycm9yKCJDYW5ub3QgY2FsbCBgcHJlY29tcGlsZWAgd2l0aG91dCB0aGUgdGVtcGxhdGUg
Y29tcGlsZXIgbG9hZGVkLiBQbGVhc2UgbG9hZCBgZW1iZXItdGVtcGxhdGUtY29tcGlsZXIuanNg
IHByaW9yIHRvIGNhbGxpbmcgYHByZWNvbXBpbGVgLiIpO3ZhciBhPXZvaWQgMD09PWFyZ3VtZW50
c1sxXXx8YXJndW1lbnRzWzFdLHM9YT9uOmk7cmV0dXJuIHMoZSxyLmRlZmF1bHQoKSl9fSksZSgi
ZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvaW5kZXgiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsIiwi
ZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL3ByZWNvbXBpbGUiLCJlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9zeXN0ZW0vY29tcGlsZSIsImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3Rl
bS90ZW1wbGF0ZSIsImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMiLCJlbWJlci10ZW1w
bGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1vbGQtYmluZGluZy1zeW50YXgiLCJlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1vbGQtY2xhc3MtYmluZGluZy1z
eW50YXgiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pdGVtLWNs
YXNzIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tY2xvc3VyZS1j
b21wb25lbnQtYXR0cnMtaW50by1tdXQiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5z
L3RyYW5zZm9ybS1jb21wb25lbnQtYXR0cnMtaW50by1tdXQiLCJlbWJlci10ZW1wbGF0ZS1jb21w
aWxlci9wbHVnaW5zL3RyYW5zZm9ybS1jb21wb25lbnQtY3VybHktdG8tcmVhZG9ubHkiLCJlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1hbmdsZS1icmFja2V0LWNvbXBv
bmVudHMiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pbnB1dC1v
bi10by1vbkV2ZW50IiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0t
dG9wLWxldmVsLWNvbXBvbmVudHMiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL2Rl
cHJlY2F0ZS1yZW5kZXItbW9kZWwiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3By
ZXZlbnQtcmVuZGVyLWJsb2NrIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFu
c2Zvcm0taW5saW5lLWxpbmstdG8iLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL2Fz
c2VydC1uby12aWV3LWFuZC1jb250cm9sbGVyLXBhdGhzIiwiZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvcGx1Z2lucy9hc3NlcnQtbm8tdmlldy1oZWxwZXIiLCJlbWJlci10ZW1wbGF0ZS1jb21waWxl
ci9wbHVnaW5zL2Fzc2VydC1uby1lYWNoLWluIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvY29t
cGF0Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjLGYsZCxwLGgsbSx2LGIsZyx5LF8s
dyl7InVzZSBzdHJpY3QiO28ucmVnaXN0ZXJQbHVnaW4oImFzdCIsYS5kZWZhdWx0KSxvLnJlZ2lz
dGVyUGx1Z2luKCJhc3QiLHMuZGVmYXVsdCksby5yZWdpc3RlclBsdWdpbigiYXN0Iix1LmRlZmF1
bHQpLG8ucmVnaXN0ZXJQbHVnaW4oImFzdCIsbC5kZWZhdWx0KSxvLnJlZ2lzdGVyUGx1Z2luKCJh
c3QiLGMuZGVmYXVsdCksby5yZWdpc3RlclBsdWdpbigiYXN0IixmLmRlZmF1bHQpLG8ucmVnaXN0
ZXJQbHVnaW4oImFzdCIsZC5kZWZhdWx0KSxvLnJlZ2lzdGVyUGx1Z2luKCJhc3QiLHAuZGVmYXVs
dCksby5yZWdpc3RlclBsdWdpbigiYXN0IixoLmRlZmF1bHQpLG8ucmVnaXN0ZXJQbHVnaW4oImFz
dCIsbS5kZWZhdWx0KSxvLnJlZ2lzdGVyUGx1Z2luKCJhc3QiLHYuZGVmYXVsdCksby5yZWdpc3Rl
clBsdWdpbigiYXN0IixfLmRlZmF1bHQpLG8ucmVnaXN0ZXJQbHVnaW4oImFzdCIsYi5kZWZhdWx0
KSx0LmRlZmF1bHQuRU5WLl9FTkFCTEVfTEVHQUNZX1ZJRVdfU1VQUE9SVHx8KG8ucmVnaXN0ZXJQ
bHVnaW4oImFzdCIsZy5kZWZhdWx0KSxvLnJlZ2lzdGVyUGx1Z2luKCJhc3QiLHkuZGVmYXVsdCkp
LGUuX0VtYmVyPXQuZGVmYXVsdCxlLnByZWNvbXBpbGU9ci5kZWZhdWx0LGUuY29tcGlsZT1uLmRl
ZmF1bHQsZS50ZW1wbGF0ZT1pLmRlZmF1bHQsZS5yZWdpc3RlclBsdWdpbj1vLnJlZ2lzdGVyUGx1
Z2lufSksZSgiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucyIsWyJleHBvcnRzIl0sZnVu
Y3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXtpZighcltlXSl0aHJvdyBuZXcg
RXJyb3IoJ0F0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgIicrdCsnIiBhcyAiJytlKyciIHdoaWNoIGlz
IG5vdCBhIHZhbGlkIEhUTUxCYXJzIHBsdWdpbiB0eXBlLicpO3JbZV0ucHVzaCh0KX1lLnJlZ2lz
dGVyUGx1Z2luPXQ7dmFyIHI9e2FzdDpbXX07ZS5kZWZhdWx0PXJ9KSxlKCJlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9wbHVnaW5zL2Fzc2VydC1uby1lYWNoLWluIixbImV4cG9ydHMiLCJlbWJlci1t
ZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9z
eXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXkiXSxmdW5jdGlvbihlLHQscixuKXsidXNl
IHN0cmljdCI7ZnVuY3Rpb24gaSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09
PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5zeW50YXg9bnVsbCx0aGlzLm9wdGlv
bnM9ZX1mdW5jdGlvbiBvKGUsdCl7bi5kZWZhdWx0KGUsdC5sb2MpLHQucGFyYW1zWzBdLm9yaWdp
bmFsLHQucGFyYW1zWzJdLm9yaWdpbmFsfWZ1bmN0aW9uIGEoZSl7cmV0dXJuKCJCbG9ja1N0YXRl
bWVudCI9PT1lLnR5cGV8fCJNdXN0YWNoZVN0YXRlbWVudCI9PT1lLnR5cGUpJiYiZWFjaCI9PT1l
LnBhdGgub3JpZ2luYWwmJjM9PT1lLnBhcmFtcy5sZW5ndGgmJiJQYXRoRXhwcmVzc2lvbiI9PT1l
LnBhcmFtc1sxXS50eXBlJiYiaW4iPT09ZS5wYXJhbXNbMV0ub3JpZ2luYWx9aS5wcm90b3R5cGUu
dHJhbnNmb3JtPWZ1bmN0aW9uKGUpe2lmKHQuZGVmYXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfVklF
V19TVVBQT1JUKXJldHVybiBlO3ZhciByPW5ldyB0aGlzLnN5bnRheC5XYWxrZXIsbj10aGlzLm9w
dGlvbnMmJnRoaXMub3B0aW9ucy5tb2R1bGVOYW1lO3JldHVybiByLnZpc2l0KGUsZnVuY3Rpb24o
ZSl7YShlKSYmbyhuLGUpfSksZX0sZS5kZWZhdWx0PWl9KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21w
aWxlci9wbHVnaW5zL2Fzc2VydC1uby12aWV3LWFuZC1jb250cm9sbGVyLXBhdGhzIixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXkiXSxmdW5jdGlvbihl
LHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8
PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5zeW50YXg9bnVs
bCx0aGlzLm9wdGlvbnM9ZX1mdW5jdGlvbiBvKGUsdCxyKXtpZihyJiZyLnBhaXJzKXt2YXIgbixp
LG8scztmb3Iobj0wLGk9ci5wYWlycy5sZW5ndGg7bjxpO24rKylvPXIucGFpcnNbbl0scz1vLnZh
bHVlLnBhcmFtcyxhKGUsbyxzKX19ZnVuY3Rpb24gYShlLHQscil7aWYocil7dmFyIG4saSxvO2Zv
cihuPTAsaT1yLmxlbmd0aDtuPGk7bisrKW89cltuXSxzKGUsdCxvKX19ZnVuY3Rpb24gcyhlLHQs
cil7fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIk11c3RhY2hlU3RhdGVtZW50Ij09PWUudHlwZXx8IkJs
b2NrU3RhdGVtZW50Ij09PWUudHlwZX1pLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7
dmFyIHQ9bmV3IHRoaXMuc3ludGF4LldhbGtlcixyPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25z
Lm1vZHVsZU5hbWU7cmV0dXJuIHQudmlzaXQoZSxmdW5jdGlvbihlKXt1KGUpJiYocyhyLGUsZS5w
YXRoKSxhKHIsZSxlLnBhcmFtcyksbyhyLGUsZS5oYXNoKSl9KSxlfSxlLmRlZmF1bHQ9aX0pLGUo
ImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNzZXJ0LW5vLXZpZXctaGVscGVyIixb
ImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci10
ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXkiXSxmdW5j
dGlvbihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSgpe3ZhciBlPWFyZ3VtZW50cy5s
ZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5zeW50
YXg9bnVsbCx0aGlzLm9wdGlvbnM9ZX1mdW5jdGlvbiBvKGUsdCl7dmFyIHI9dC5wYXJhbXMubGVu
Z3RoJiZ0LnBhcmFtc1swXS52YWx1ZX1mdW5jdGlvbiBhKGUpe3JldHVybigiTXVzdGFjaGVTdGF0
ZW1lbnQiPT09ZS50eXBlfHwiQmxvY2tTdGF0ZW1lbnQiPT09ZS50eXBlKSYmInZpZXciPT09ZS5w
YXRoLnBhcnRzWzBdfWkucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihlKXtpZih0LmRlZmF1
bHQuRU5WLl9FTkFCTEVfTEVHQUNZX1ZJRVdfU1VQUE9SVClyZXR1cm4gZTt2YXIgcj1uZXcgdGhp
cy5zeW50YXguV2Fsa2VyLG49dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubW9kdWxlTmFtZTty
ZXR1cm4gci52aXNpdChlLGZ1bmN0aW9uKGUpe2EoZSkmJm8obixlKX0pLGV9LGUuZGVmYXVsdD1p
fSksZSgiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy9kZXByZWNhdGUtcmVuZGVyLW1v
ZGVsIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLXRlbXBsYXRlLWNvbXBp
bGVyL3N5c3RlbS9jYWxjdWxhdGUtbG9jYXRpb24tZGlzcGxheSJdLGZ1bmN0aW9uKGUsdCxyKXsi
dXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlKXt0aGlzLnN5bnRheD1udWxsLHRoaXMub3B0aW9ucz1l
fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIk11c3RhY2hlU3RhdGVtZW50Ij09PWUudHlwZSYmInJlbmRl
ciI9PT1lLnBhdGgub3JpZ2luYWwmJmUucGFyYW1zLmxlbmd0aD4xfWZ1bmN0aW9uIG8oZSx0KXtm
b3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdChlW3JdKX1lLmRlZmF1bHQ9bixuLnByb3Rv
dHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIHQ9KHRoaXMub3B0aW9ucy5tb2R1bGVOYW1l
LG5ldyB0aGlzLnN5bnRheC5XYWxrZXIpO3JldHVybiB0LnZpc2l0KGUsZnVuY3Rpb24oZSl7aShl
KSYmbyhlLnBhcmFtcyxmdW5jdGlvbihlKXsiUGF0aEV4cHJlc3Npb24iIT09ZS50eXBlfSl9KSxl
fX0pLGUoImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvcHJldmVudC1yZW5kZXItYmxv
Y2siLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Vycm9yIiwiZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2NhdGlvbi1kaXNwbGF5Il0sZnVuY3Rpb24oZSx0LHIpeyJ1
c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUpe3RoaXMuc3ludGF4PW51bGwsdGhpcy5vcHRpb25zPWV9
ZnVuY3Rpb24gaShlKXtyZXR1cm4iQmxvY2tTdGF0ZW1lbnQiPT09ZS50eXBlJiYicmVuZGVyIj09
PWUucGF0aC5vcmlnaW5hbH1mdW5jdGlvbiBvKGUsdCl7dmFyIG49ci5kZWZhdWx0KGUsdC5sb2Mp
O3JldHVybiJVc2FnZSBvZiBgcmVuZGVyYCBpbiBibG9jayBmb3JtIGlzIHVuc3VwcG9ydGVkICIr
bisiLiJ9ZS5kZWZhdWx0PW4sbi5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGUpe3ZhciBy
PXRoaXMub3B0aW9ucy5tb2R1bGVOYW1lLG49bmV3IHRoaXMuc3ludGF4LldhbGtlcjtyZXR1cm4g
bi52aXNpdChlLGZ1bmN0aW9uKGUpe2lmKGkoZSkpdGhyb3cgbmV3IHQuZGVmYXVsdChvKHIsZSkp
fSksZX19KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1hbmds
ZS1icmFja2V0LWNvbXBvbmVudHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0
IjtmdW5jdGlvbiB0KCl7dGhpcy5zeW50YXg9bnVsbH1mdW5jdGlvbiByKGUpe3JldHVybiJDb21w
b25lbnROb2RlIj09PWUudHlwZX10LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFy
IHQ9bmV3IHRoaXMuc3ludGF4LldhbGtlcjtyZXR1cm4gdC52aXNpdChlLGZ1bmN0aW9uKGUpe3Io
ZSkmJihlLnRhZz0iPCIrZS50YWcrIj4iKX0pLGV9LGUuZGVmYXVsdD10fSksZSgiZW1iZXItdGVt
cGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tY2xvc3VyZS1jb21wb25lbnQtYXR0cnMt
aW50by1tdXQiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0
KCl7dGhpcy5zeW50YXg9bnVsbH1mdW5jdGlvbiByKGUpe3JldHVybiJTdWJFeHByZXNzaW9uIj09
PWUudHlwZSYmImNvbXBvbmVudCI9PT1lLnBhdGgub3JpZ2luYWx9ZnVuY3Rpb24gbihlLHQpe2Zv
cih2YXIgcj0xO3I8dC5wYXJhbXMubGVuZ3RoO3IrKykiUGF0aEV4cHJlc3Npb24iPT09dC5wYXJh
bXNbcl0udHlwZSYmKHQucGFyYW1zW3JdPWUuc2V4cHIoZS5wYXRoKCJAbXV0IiksW3QucGFyYW1z
W3JdXSkpO2kodC5oYXNoLnBhaXJzLGZ1bmN0aW9uKHQpe3ZhciByPXQudmFsdWU7IlBhdGhFeHBy
ZXNzaW9uIj09PXIudHlwZSYmKHQudmFsdWU9ZS5zZXhwcihlLnBhdGgoIkBtdXQiKSxbdC52YWx1
ZV0pKX0pfWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdChl
W3JdKX10LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zeW50YXgu
YnVpbGRlcnM7cmV0dXJuIHRoaXMuc3ludGF4LnRyYXZlcnNlKGUse1N1YkV4cHJlc3Npb246ZnVu
Y3Rpb24oZSl7cihlKSYmbih0LGUpfX0pLGV9LGUuZGVmYXVsdD10fSksZSgiZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tY29tcG9uZW50LWF0dHJzLWludG8tbXV0Iixb
ImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdCgpe3RoaXMuc3lu
dGF4PW51bGx9ZnVuY3Rpb24gcihlKXtyZXR1cm4iQmxvY2tTdGF0ZW1lbnQiPT09ZS50eXBlfHwi
TXVzdGFjaGVTdGF0ZW1lbnQiPT09ZS50eXBlfWZ1bmN0aW9uIG4oZSx0KXtmb3IodmFyIHI9MCxu
PWUubGVuZ3RoO3I8bjtyKyspdChlW3JdKX10LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24o
ZSl7dmFyIHQ9dGhpcy5zeW50YXguYnVpbGRlcnMsaT1uZXcgdGhpcy5zeW50YXguV2Fsa2VyO3Jl
dHVybiBpLnZpc2l0KGUsZnVuY3Rpb24oZSl7cihlKSYmbihlLmhhc2gucGFpcnMsZnVuY3Rpb24o
ZSl7dmFyIHI9ZS52YWx1ZTsiUGF0aEV4cHJlc3Npb24iPT09ci50eXBlJiYoZS52YWx1ZT10LnNl
eHByKHQucGF0aCgiQG11dCIpLFtlLnZhbHVlXSkpfSl9KSxlfSxlLmRlZmF1bHQ9dH0pLGUoImVt
YmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWNvbXBvbmVudC1jdXJseS10
by1yZWFkb25seSIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IHQoKXt0aGlzLnN5bnRheD1udWxsfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIkNvbXBvbmVudE5vZGUi
PT09ZS50eXBlfWZ1bmN0aW9uIG4oZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKysp
dChlW3JdKX10LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zeW50
YXguYnVpbGRlcnMsaT1uZXcgdGhpcy5zeW50YXguV2Fsa2VyO3JldHVybiBpLnZpc2l0KGUsZnVu
Y3Rpb24oZSl7cihlKSYmbihlLmF0dHJpYnV0ZXMsZnVuY3Rpb24oZSl7Ik11c3RhY2hlU3RhdGVt
ZW50Ij09PWUudmFsdWUudHlwZSYmKGUudmFsdWUucGFyYW1zLmxlbmd0aHx8ZS52YWx1ZS5oYXNo
LnBhaXJzLmxlbmd0aHx8KGUudmFsdWU9dC5tdXN0YWNoZSh0LnBhdGgoInJlYWRvbmx5IiksW2Uu
dmFsdWUucGF0aF0sbnVsbCwhZS52YWx1ZS5lc2NhcGUpKSl9KX0pLGV9LGUuZGVmYXVsdD10fSks
ZSgiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0taW5saW5lLWxpbmst
dG8iLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3Ro
aXMub3B0aW9ucz1lLHRoaXMuc3ludGF4PW51bGx9ZS5kZWZhdWx0PXQsdC5wcm90b3R5cGUudHJh
bnNmb3JtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm4gYS5wcm9ncmFtKFtyKGUs
dCldLG51bGwsdCl9ZnVuY3Rpb24gcihlLHQpe3N3aXRjaChlLnR5cGUpe2Nhc2UiUGF0aEV4cHJl
c3Npb24iOnJldHVybiBhLm11c3RhY2hlKGUsbnVsbCxudWxsLG51bGwsdCk7Y2FzZSJTdWJFeHBy
ZXNzaW9uIjpyZXR1cm4gYS5tdXN0YWNoZShlLnBhdGgsZS5wYXJhbXMsZS5oYXNoLG51bGwsdCk7
ZGVmYXVsdDpyZXR1cm4gYS50ZXh0KCIiK2UudmFsdWUsdCl9fWZ1bmN0aW9uIG4oZSl7cmV0dXJu
IGEuc2V4cHIoIi1odG1sLXNhZmUiLFtlXSl9dmFyIGk9dGhpcy5zeW50YXgsbz1pLnRyYXZlcnNl
LGE9aS5idWlsZGVycztyZXR1cm4gbyhlLHtNdXN0YWNoZVN0YXRlbWVudDpmdW5jdGlvbihlKXtp
ZigibGluay10byI9PT1lLnBhdGgub3JpZ2luYWwpe3ZhciByPWUuZXNjYXBlZD9lLnBhcmFtc1sw
XTpuKGUucGFyYW1zWzBdKTtyZXR1cm4gYS5ibG9jaygibGluay10byIsZS5wYXJhbXMuc2xpY2Uo
MSksZS5oYXNoLHQocixlLmxvYyksbnVsbCxlLmxvYyl9fX0pLGV9fSksZSgiZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0taW5wdXQtb24tdG8tb25FdmVudCIsWyJleHBv
cnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0v
Y2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXkiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3Qi
O2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVu
dHNbMF0/e306YXJndW1lbnRzWzBdO3RoaXMuc3ludGF4PW51bGwsdGhpcy5vcHRpb25zPWV9ZnVu
Y3Rpb24gaShlLHQpe2Zvcih2YXIgcj0wLG49ZS5wYWlycy5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9
ZS5wYWlyc1tyXTtpZihpLmtleT09PXQpcmV0dXJuIGl9cmV0dXJuITF9ZnVuY3Rpb24gbyhlLHQp
e2Zvcih2YXIgcj1bXSxuPTAsaT1lLnBhaXJzLmxlbmd0aDtuPGk7bisrKXt2YXIgbz1lLnBhaXJz
W25dO28hPT10JiZyLnB1c2gobyl9ZS5wYWlycz1yfW4ucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5j
dGlvbihlKXt2YXIgdD10aGlzLG49dC5zeW50YXguYnVpbGRlcnMsYT1uZXcgdC5zeW50YXguV2Fs
a2VyLHM9dC5vcHRpb25zLm1vZHVsZU5hbWU7cmV0dXJuIGEudmlzaXQoZSxmdW5jdGlvbihlKXtp
Zih0LnZhbGlkYXRlKGUpKXt2YXIgYT1pKGUuaGFzaCwiYWN0aW9uIiksdT1pKGUuaGFzaCwib24i
KSxsPWkoZS5oYXNoLCJvbkV2ZW50IiksYz11fHxsO3IuZGVmYXVsdChzLGUubG9jKTtpZihjJiYi
U3RyaW5nTGl0ZXJhbCIhPT1jLnZhbHVlLnR5cGUpcmV0dXJuIHZvaWQoYy5rZXk9Im9uRXZlbnQi
KTtpZihvKGUuaGFzaCxjKSxvKGUuaGFzaCxhKSwhYSlyZXR1cm47Yz9jLmtleSsnPSInK2MudmFs
dWUudmFsdWUrJyIgJzoiIjtjJiYia2V5UHJlc3MiPT09Yy52YWx1ZS52YWx1ZSYmKGMudmFsdWUu
dmFsdWU9ImtleS1wcmVzcyIpOyhjP2MudmFsdWUudmFsdWU6ImVudGVyIikrJz0iJythLnZhbHVl
Lm9yaWdpbmFsKyciJztjfHwoYz1uLnBhaXIoIm9uRXZlbnQiLG4uc3RyaW5nKCJlbnRlciIpKSks
ZS5oYXNoLnBhaXJzLnB1c2gobi5wYWlyKGMudmFsdWUudmFsdWUsYS52YWx1ZSkpfX0pLGV9LG4u
cHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiJNdXN0YWNoZVN0YXRlbWVudCI9
PT1lLnR5cGUmJiJpbnB1dCI9PT1lLnBhdGgub3JpZ2luYWwmJihpKGUuaGFzaCwiYWN0aW9uIil8
fGkoZS5oYXNoLCJvbiIpfHxpKGUuaGFzaCwib25FdmVudCIpKX0sZS5kZWZhdWx0PW59KSxlKCJl
bWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pdGVtLWNsYXNzIixbImV4
cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdCgpe3RoaXMuc3ludGF4
PW51bGx9ZnVuY3Rpb24gcihlKXtyZXR1cm4oIkJsb2NrU3RhdGVtZW50Ij09PWUudHlwZXx8Ik11
c3RhY2hlU3RhdGVtZW50Ij09PWUudHlwZSkmJiJjb2xsZWN0aW9uIj09PWUucGF0aC5vcmlnaW5h
bH1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQoZVtyXSl9
ZS5kZWZhdWx0PXQsdC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMu
c3ludGF4LmJ1aWxkZXJzLGk9bmV3IHRoaXMuc3ludGF4LldhbGtlcjtyZXR1cm4gaS52aXNpdChl
LGZ1bmN0aW9uKGUpe3IoZSkmJm4oZS5oYXNoLnBhaXJzLGZ1bmN0aW9uKGUpe3ZhciByPWUua2V5
LG49ZS52YWx1ZTtpZigiaXRlbUNsYXNzIj09PXImJiJTdHJpbmdMaXRlcmFsIiE9PW4udHlwZSl7
dmFyIGk9bi5vcmlnaW5hbCxvPVtuXSxhPVt0LnN0cmluZyhpKSx0LnBhdGgoaSldO28ucHVzaCh0
LnNleHByKHQuc3RyaW5nKCItbm9ybWFsaXplLWNsYXNzIiksYSkpO3ZhciBzPXQuc2V4cHIodC5z
dHJpbmcoImlmIiksbyk7ZS52YWx1ZT1zfX0pfSksZX19KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21w
aWxlci9wbHVnaW5zL3RyYW5zZm9ybS1vbGQtYmluZGluZy1zeW50YXgiLFsiZXhwb3J0cyIsImVt
YmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0
ZS1sb2NhdGlvbi1kaXNwbGF5Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlv
biBuKGUpe3RoaXMuc3ludGF4PW51bGwsdGhpcy5vcHRpb25zPWV9ZnVuY3Rpb24gaShlKXtyZXR1
cm4iQmxvY2tTdGF0ZW1lbnQiPT09ZS50eXBlfHwiTXVzdGFjaGVTdGF0ZW1lbnQiPT09ZS50eXBl
fWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdChlW3JdKX1l
LmRlZmF1bHQ9bixuLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5v
cHRpb25zLm1vZHVsZU5hbWUsbj10aGlzLnN5bnRheC5idWlsZGVycyxhPW5ldyB0aGlzLnN5bnRh
eC5XYWxrZXI7cmV0dXJuIGEudmlzaXQoZSxmdW5jdGlvbihlKXtpKGUpJiZvKGUuaGFzaC5wYWly
cyxmdW5jdGlvbihlKXt2YXIgaT1lLmtleSxvPWUudmFsdWU7ci5kZWZhdWx0KHQsZS5sb2MpO2lm
KCJjbGFzc0JpbmRpbmciIT09aSYmIkJpbmRpbmciPT09aS5zdWJzdHIoLTcpKXt2YXIgYT1pLnNs
aWNlKDAsLTcpO2Uua2V5PWEsIlN0cmluZ0xpdGVyYWwiPT09by50eXBlJiYoZS52YWx1ZT1uLnBh
dGgoby5vcmlnaW5hbCkpfX0pfSksZX19KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVn
aW5zL3RyYW5zZm9ybS1vbGQtY2xhc3MtYmluZGluZy1zeW50YXgiLFsiZXhwb3J0cyJdLGZ1bmN0
aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3RoaXMuc3ludGF4PW51bGwsdGhpcy5v
cHRpb25zPWV9ZnVuY3Rpb24gcihlLHQscil7Zm9yKHZhciBuPTAsaT1lLmxlbmd0aDtuPGk7bisr
KXt2YXIgbz1lW25dLGE9b1swXSxzPW9bMV0sdT1vWzJdLGw9dm9pZCAwO2lmKCIiPT09YSlsPXIu
c3RyaW5nKHMpO2Vsc2V7dmFyIGM9W3IucGF0aChhKV07aWYocyljLnB1c2goci5zdHJpbmcocykp
O2Vsc2V7dmFyIGY9W3Iuc3RyaW5nKGEpLHIucGF0aChhKV0sZD1yLmhhc2goKTt2b2lkIDAhPT1z
JiZkLnBhaXJzLnB1c2goci5wYWlyKCJhY3RpdmVDbGFzcyIsci5zdHJpbmcocykpKSx2b2lkIDAh
PT11JiZkLnBhaXJzLnB1c2goci5wYWlyKCJpbmFjdGl2ZUNsYXNzIixyLnN0cmluZyh1KSkpLGMu
cHVzaChyLnNleHByKHIuc3RyaW5nKCItbm9ybWFsaXplLWNsYXNzIiksZixkKSl9dSYmYy5wdXNo
KHIuc3RyaW5nKHUpKSxsPXIuc2V4cHIoci5zdHJpbmcoImlmIiksYyl9dC5wdXNoKGwpLHQucHVz
aChyLnN0cmluZygiICIpKX19ZnVuY3Rpb24gbihlKXtyZXR1cm4iQmxvY2tTdGF0ZW1lbnQiPT09
ZS50eXBlfHwiTXVzdGFjaGVTdGF0ZW1lbnQiPT09ZS50eXBlfWZ1bmN0aW9uIGkoZSx0KXtmb3Io
dmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdChlW3JdLHIpfWZ1bmN0aW9uIG8oZSl7Zm9yKHZh
ciB0PWUuc3BsaXQoIiAiKSxyPTAsbj10Lmxlbmd0aDtyPG47cisrKXRbcl09dFtyXS5zcGxpdCgi
OiIpO3JldHVybiB0fWUuZGVmYXVsdD10LHQucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihl
KXt2YXIgdD10aGlzLnN5bnRheC5idWlsZGVycyxhPW5ldyB0aGlzLnN5bnRheC5XYWxrZXI7cmV0
dXJuIGEudmlzaXQoZSxmdW5jdGlvbihlKXtpZihuKGUpKXt2YXIgYT1bXSxzPVtdLHU9dm9pZCAw
O2lmKGkoZS5oYXNoLnBhaXJzLGZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5rZXk7ImNsYXNzQmluZGlu
ZyI9PT1yfHwiY2xhc3NOYW1lQmluZGluZ3MiPT09cj8ocy5wdXNoKHQpLGEucHVzaChlKSk6ImNs
YXNzIj09PXImJih1PWUpfSksMCE9PWEubGVuZ3RoKXt2YXIgbD1bXTt1PyhsLnB1c2godS52YWx1
ZSksbC5wdXNoKHQuc3RyaW5nKCIgIikpKToodT10LnBhaXIoImNsYXNzIixudWxsKSxlLmhhc2gu
cGFpcnMucHVzaCh1KSksaShzLGZ1bmN0aW9uKHQpe2UuaGFzaC5wYWlycy5zcGxpY2UodCwxKX0p
LGkoYSxmdW5jdGlvbihlKXt2YXIgbj1lLnZhbHVlLGk9KGUubG9jLFtdKTtpZigiU3RyaW5nTGl0
ZXJhbCI9PT1uLnR5cGUpe3ZhciBhPW8obi5vcmlnaW5hbCk7cihhLGksdCksbC5wdXNoLmFwcGx5
KGwsaSl9fSk7dmFyIGM9dC5oYXNoKCk7dS52YWx1ZT10LnNleHByKHQuc3RyaW5nKCJjb25jYXQi
KSxsLGMpfX19KSxlfX0pLGUoImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNm
b3JtLXRvcC1sZXZlbC1jb21wb25lbnRzIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gdCgpe3RoaXMuc3ludGF4PW51bGx9ZnVuY3Rpb24gcihlLHQscil7dmFy
IG49ZS5sb2MsaT1lLmJvZHk7aWYobiYmMT09PW4uc3RhcnQubGluZSYmMD09PW4uc3RhcnQuY29s
dW1uKXtmb3IodmFyIG89dm9pZCAwLGE9dm9pZCAwLHM9MCx1PTAsbD1pLmxlbmd0aDt1PGw7dSsr
KXt2YXIgYz1pW3VdO2lmKCJUZXh0Tm9kZSIhPT1jLnR5cGV8fCEvXltcc10qJC8udGVzdChjLmNo
YXJzKSl7aWYocysrPjApcmV0dXJuITE7IkNvbXBvbmVudE5vZGUiIT09Yy50eXBlJiYiRWxlbWVu
dE5vZGUiIT09Yy50eXBlfHwobz1jLGE9dSl9fW8mJiJDb21wb25lbnROb2RlIj09PW8udHlwZSYm
dChvKX19dC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3ludGF4
LmJ1aWxkZXJzO3JldHVybiByKGUsZnVuY3Rpb24oZSl7IkNvbXBvbmVudE5vZGUiPT09ZS50eXBl
JiYoZS50YWc9IkAiK2UudGFnLGUuaXNTdGF0aWM9ITApfSxmdW5jdGlvbihlKXt2YXIgcj1lLmF0
dHJpYnV0ZXMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZS5lc2NhcGVkPT09ITF9KTtp
ZihlLm1vZGlmaWVycy5sZW5ndGh8fHIpcmV0dXJuIGU7dmFyIG49dC5wcm9ncmFtKGUuY2hpbGRy
ZW4pLGk9dC5jb21wb25lbnQoIkA8IitlLnRhZysiPiIsZS5hdHRyaWJ1dGVzLG4sZS5sb2MpO3Jl
dHVybiBpLmlzU3RhdGljPSEwLGl9KSxlfSxlLmRlZmF1bHQ9dH0pLGUoImVtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyL3N5c3RlbS9jYWxjdWxhdGUtbG9jYXRpb24tZGlzcGxheSIsWyJleHBvcnRzIl0s
ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXt2YXIgcj10fHx7fSxuPXIu
c3RhcnR8fHt9LGk9bi5jb2x1bW4sbz1uLmxpbmUsYT0iIjtyZXR1cm4gZSYmKGErPSInIitlKyIn
ICIpLHZvaWQgMCE9PW8mJnZvaWQgMCE9PWkmJihlJiYoYSs9IkAgIiksYSs9IkwiK28rIjpDIitp
KSxhJiYoYT0iKCIrYSsiKSAiKSxhfWUuZGVmYXVsdD10fSksZSgiZW1iZXItdGVtcGxhdGUtY29t
cGlsZXIvc3lzdGVtL2NvbXBpbGUiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2ZlYXR1cmVzIiwi
cmVxdWlyZSIsImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS9jb21waWxlX29wdGlvbnMi
LCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vdGVtcGxhdGUiXSxmdW5jdGlvbihlLHQs
cixuLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbztlLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0KXtpZighbyYm
ci5oYXMoImh0bWxiYXJzLWNvbXBpbGVyL2NvbXBpbGVyIikmJihvPXIuZGVmYXVsdCgiaHRtbGJh
cnMtY29tcGlsZXIvY29tcGlsZXIiKS5jb21waWxlKSwhbyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5v
dCBjYWxsIGBjb21waWxlYCB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBjb21waWxlciBsb2FkZWQuIFBs
ZWFzZSBsb2FkIGBlbWJlci10ZW1wbGF0ZS1jb21waWxlci5qc2AgcHJpb3IgdG8gY2FsbGluZyBg
Y29tcGlsZWAuIik7dmFyIGE9byhlLG4uZGVmYXVsdCh0KSk7cmV0dXJuIGkuZGVmYXVsdChhKX19
KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY29tcGlsZV9vcHRpb25zIixbImV4
cG9ydHMiLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVn
aW5zIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj12b2lkIDAsaT12b2lkIDA7
bj1mdW5jdGlvbihlKXt2YXIgbj0hMCxvPXZvaWQgMDtvPWU9PT0hMD97fTp0LmRlZmF1bHQoe30s
ZSksby5kaXNhYmxlQ29tcG9uZW50R2VuZXJhdGlvbj1uO3ZhciBhPXthc3Q6ci5kZWZhdWx0LmFz
dC5zbGljZSgpfTtyZXR1cm4gby5wbHVnaW5zJiZvLnBsdWdpbnMuYXN0JiYoYS5hc3Q9YS5hc3Qu
Y29uY2F0KG8ucGx1Z2lucy5hc3QpKSxvLnBsdWdpbnM9YSxvLmJ1aWxkTWV0YT1mdW5jdGlvbihl
KXtyZXR1cm57ZnJhZ21lbnRSZWFzb246aShlKSxyZXZpc2lvbjoiRW1iZXJAMi42LjIiLGxvYzpl
LmxvYyxtb2R1bGVOYW1lOm8ubW9kdWxlTmFtZX19LG99LGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5s
b2Mscj1lLmJvZHk7aWYoIXR8fDEhPT10LnN0YXJ0LmxpbmV8fDAhPT10LnN0YXJ0LmNvbHVtbily
ZXR1cm4hMTtmb3IodmFyIG49dm9pZCAwLGk9MCxvPXt9LGE9MCxzPXIubGVuZ3RoO2E8czthKysp
e3ZhciB1PXJbYV07IlRleHROb2RlIj09PXUudHlwZSYmL15bXHNdKiQvLnRlc3QodS5jaGFycyl8
fChpKys+MCYmKG9bIm11bHRpcGxlLW5vZGVzIl09ITApLCJDb21wb25lbnROb2RlIj09PXUudHlw
ZXx8IkVsZW1lbnROb2RlIj09PXUudHlwZT9uPXU6b1sid3JvbmctdHlwZSJdPSEwKX1pZigwPT09
aSlyZXR1cm57bmFtZToibWlzc2luZy13cmFwcGVyIixwcm9ibGVtczpbImVtcHR5LWJvZHkiXX07
dmFyIGw9T2JqZWN0LmtleXMobyk7cmV0dXJuIGwubGVuZ3RoP3tuYW1lOiJtaXNzaW5nLXdyYXBw
ZXIiLHByb2JsZW1zOmx9OiJDb21wb25lbnROb2RlIiE9PW4udHlwZSYmKG4ubW9kaWZpZXJzLmxl
bmd0aD97bmFtZToibW9kaWZpZXJzIixtb2RpZmllcnM6bi5tb2RpZmllcnMubWFwKGZ1bmN0aW9u
KGUpe3JldHVybiBlLnBhdGgub3JpZ2luYWx9KX06ISFuLmF0dHJpYnV0ZXMuc29tZShmdW5jdGlv
bihlKXtyZXR1cm4hZS52YWx1ZS5lc2NhcGVkfSkmJntuYW1lOiJ0cmlwbGUtY3VybGllcyJ9KX0s
ZS5kZWZhdWx0PW59KSxlKCJlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vcHJlY29tcGls
ZSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZmVhdHVyZXMiLCJyZXF1aXJlIiwiZW1iZXItdGVt
cGxhdGUtY29tcGlsZXIvc3lzdGVtL2NvbXBpbGVfb3B0aW9ucyJdLGZ1bmN0aW9uKGUsdCxyLG4p
eyJ1c2Ugc3RyaWN0Ijt2YXIgaTtlLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0KXtpZighaSYmci5oYXMo
Imh0bWxiYXJzLWNvbXBpbGVyL2NvbXBpbGVyIikmJihpPXIuZGVmYXVsdCgiaHRtbGJhcnMtY29t
cGlsZXIvY29tcGlsZXIiKS5jb21waWxlU3BlYyksIWkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qg
Y2FsbCBgY29tcGlsZVNwZWNgIHdpdGhvdXQgdGhlIHRlbXBsYXRlIGNvbXBpbGVyIGxvYWRlZC4g
UGxlYXNlIGxvYWQgYGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyLmpzYCBwcmlvciB0byBjYWxsaW5n
IGBjb21waWxlU3BlY2AuIik7cmV0dXJuIGkoZSxuLmRlZmF1bHQodCkpfX0pLGUoImVtYmVyLXRl
bXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
ZmVhdHVyZXMiLCJyZXF1aXJlIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj12
b2lkIDAsaT1yLmRlZmF1bHQoImh0bWxiYXJzLXJ1bnRpbWUvaG9va3MiKSxvPWkud3JhcDtuPWZ1
bmN0aW9uKGUpe3JldHVybiBlLnJlbmRlcnx8KGU9byhlKSksZS5pc1RvcD0hMCxlLmlzTWV0aG9k
PSExLGV9LGUuZGVmYXVsdD1ufSksZSgiZW1iZXItdmlld3MvY29tcGF0L2F0dHJzLXByb3h5Iixb
ImV4cG9ydHMiLCJlbWJlci1tZXRhbC9taXhpbiIsImVtYmVyLW1ldGFsL3N5bWJvbCIsImVtYmVy
LW1ldGFsL3Byb3BlcnR5X2V2ZW50cyJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijtm
dW5jdGlvbiBpKGUpe3JldHVybiJZb3UgdHJpZWQgdG8gbG9vayB1cCBhbiBhdHRyaWJ1dGUgZGly
ZWN0bHkgb24gdGhlIGNvbXBvbmVudC4gVGhpcyBpcyBkZXByZWNhdGVkLiBVc2UgYXR0cnMuIitl
KyIgaW5zdGVhZC4ifWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUmJmVbYV19ZS5kZXByZWNhdGlvbj1p
O3ZhciBhPXIuZGVmYXVsdCgiTVVUQUJMRV9DRUxMIik7ZS5NVVRBQkxFX0NFTEw9YTt2YXIgcz17
YXR0cnM6bnVsbCxnZXRBdHRyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYXR0cnM7aWYodClyZXR1
cm4gdGhpcy5nZXRBdHRyRm9yKHQsZSl9LGdldEF0dHJGb3I6ZnVuY3Rpb24oZSx0KXt2YXIgcj1l
W3RdO3JldHVybiBvKHIpP3IudmFsdWU6cn0sc2V0QXR0cjpmdW5jdGlvbihlLHQpe3ZhciByPXRo
aXMuYXR0cnMsbj1yW2VdO2lmKCFvKG4pKXRocm93IG5ldyBFcnJvcigiWW91IGNhbid0IHVwZGF0
ZSBhdHRycy4iK2UrIiwgYmVjYXVzZSBpdCdzIG5vdCBtdXRhYmxlIik7bi51cGRhdGUodCl9LF9w
cm9wYWdhdGVBdHRyc1RvVGhpczpmdW5jdGlvbihlKXt0aGlzLl9pc0Rpc3BhdGNoaW5nQXR0cnM9
ITAsdGhpcy5zZXRQcm9wZXJ0aWVzKGUpLHRoaXMuX2lzRGlzcGF0Y2hpbmdBdHRycz0hMX19O3Nb
bi5QUk9QRVJUWV9ESURfQ0hBTkdFXT1mdW5jdGlvbihlKXt0aGlzLl9pc0FuZ2xlQnJhY2tldHx8
dGhpcy5faXNEaXNwYXRjaGluZ0F0dHJzfHx0aGlzLl9jdXJyZW50U3RhdGUmJnRoaXMuX2N1cnJl
bnRTdGF0ZS5sZWdhY3lQcm9wZXJ0eURpZENoYW5nZSh0aGlzLGUpfSxlLmRlZmF1bHQ9dC5NaXhp
bi5jcmVhdGUocyl9KSxlKCJlbWJlci12aWV3cy9jb21wb25lbnRfbG9va3VwIixbImV4cG9ydHMi
LCJlbWJlci1tZXRhbC9jb3JlIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1ydW50aW1lL3N5
c3RlbS9vYmplY3QiLCJlbWJlci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlciIsImNvbnRh
aW5lci9vd25lciJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0
PW4uZGVmYXVsdC5leHRlbmQoe2ludmFsaWROYW1lOmZ1bmN0aW9uKGUpe2lmKCFpLkNPTlRBSU5T
X0RBU0hfQ0FDSEUuZ2V0KGUpKXJldHVybiEwfSxsb29rdXBGYWN0b3J5OmZ1bmN0aW9uKGUscil7
cj1yfHxvLmdldE93bmVyKHRoaXMpO3ZhciBuPSJjb21wb25lbnQ6IitlLGk9InRlbXBsYXRlOmNv
bXBvbmVudHMvIitlLGE9ciYmci5oYXNSZWdpc3RyYXRpb24oaSk7YSYmci5pbmplY3QobiwibGF5
b3V0IixpKTt2YXIgcz1yLl9sb29rdXBGYWN0b3J5KG4pO2lmKGF8fHMpcmV0dXJuIHN8fChyLnJl
Z2lzdGVyKG4sdC5kZWZhdWx0LkNvbXBvbmVudCkscz1yLl9sb29rdXBGYWN0b3J5KG4pKSxzfSxj
b21wb25lbnRGb3I6ZnVuY3Rpb24oZSx0LHIpe2lmKCF0aGlzLmludmFsaWROYW1lKGUpKXt2YXIg
bj0iY29tcG9uZW50OiIrZTtyZXR1cm4gdC5fbG9va3VwRmFjdG9yeShuLHIpfX0sbGF5b3V0Rm9y
OmZ1bmN0aW9uKGUsdCxyKXtpZighdGhpcy5pbnZhbGlkTmFtZShlKSl7dmFyIG49InRlbXBsYXRl
OmNvbXBvbmVudHMvIitlO3JldHVybiB0Lmxvb2t1cChuLHIpfX19KX0pLGUoImVtYmVyLXZpZXdz
L2NvbXBvbmVudHMvY29tcG9uZW50IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVt
YmVyLW1ldGFsL2Vudmlyb25tZW50IiwiZW1iZXItcnVudGltZS9taXhpbnMvdGFyZ2V0X2FjdGlv
bl9zdXBwb3J0IiwiZW1iZXItdmlld3Mvdmlld3MvdmlldyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCIsImVtYmVyLW1ldGFsL2lzX25vbmUiLCJl
bWJlci1tZXRhbC91dGlscyIsImVtYmVyLW1ldGFsL2NvbXB1dGVkIiwiZW1iZXItdmlld3MvY29t
cGF0L2F0dHJzLXByb3h5IiwiY29udGFpbmVyL293bmVyIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8s
YSxzLHUsbCxjLGYpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGUsdCl7cmV0dXJuIHQmJnRbYy5N
VVRBQkxFX0NFTExdJiYodD10LnZhbHVlKSx0fXZhciBwPWkuZGVmYXVsdC5leHRlbmQobi5kZWZh
dWx0LHtpc0NvbXBvbmVudDohMCxjb250cm9sbGVyOm51bGwsY29udGV4dDpudWxsLGluc3RydW1l
bnROYW1lOiJjb21wb25lbnQiLGluc3RydW1lbnREaXNwbGF5OmwuY29tcHV0ZWQoZnVuY3Rpb24o
KXtpZih0aGlzLl9kZWJ1Z0NvbnRhaW5lcktleSlyZXR1cm4ie3siK3RoaXMuX2RlYnVnQ29udGFp
bmVyS2V5LnNwbGl0KCI6IilbMV0rIn19In0pLGluaXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdXBl
ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS5zZXQodGhpcywiY29udHJvbGxlciIsdGhpcyksYS5z
ZXQodGhpcywiY29udGV4dCIsdGhpcyksIXRoaXMubGF5b3V0JiZ0aGlzLmxheW91dE5hbWUmJmYu
Z2V0T3duZXIodGhpcykpe3ZhciBlPW8uZ2V0KHRoaXMsImxheW91dE5hbWUiKTt0aGlzLmxheW91
dD10aGlzLnRlbXBsYXRlRm9yTmFtZShlKX10aGlzLmRlZmF1bHRMYXlvdXQmJiF0aGlzLmxheW91
dCYmKHRoaXMubGF5b3V0PXRoaXMuZGVmYXVsdExheW91dCl9LHRlbXBsYXRlOm51bGwsbGF5b3V0
TmFtZTpudWxsLGxheW91dDpudWxsLHRhcmdldE9iamVjdDpsLmNvbXB1dGVkKCJjb250cm9sbGVy
IixmdW5jdGlvbihlKXtpZih0aGlzLl90YXJnZXRPYmplY3QpcmV0dXJuIHRoaXMuX3RhcmdldE9i
amVjdDtpZih0aGlzLl9jb250cm9sbGVyKXJldHVybiB0aGlzLl9jb250cm9sbGVyO3ZhciB0PW8u
Z2V0KHRoaXMsInBhcmVudFZpZXciKTtyZXR1cm4gdD9vLmdldCh0LCJjb250cm9sbGVyIik6bnVs
bH0pLHNlbmRBY3Rpb246ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1B
cnJheSh0PjE/dC0xOjApLG49MTtuPHQ7bisrKXJbbi0xXT1hcmd1bWVudHNbbl07dmFyIGk7dm9p
ZCAwPT09ZSYmKGU9ImFjdGlvbiIpLGk9by5nZXQodGhpcywiYXR0cnMuIitlKXx8by5nZXQodGhp
cyxlKSxpPWQodGhpcyxpKSx2b2lkIDAhPT1pJiYoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBs
eSh2b2lkIDAscik6dGhpcy50cmlnZ2VyQWN0aW9uKHthY3Rpb246aSxhY3Rpb25Db250ZXh0OnJ9
KSl9LHNlbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheSh0
PjE/dC0xOjApLG49MTtuPHQ7bisrKXJbbi0xXT1hcmd1bWVudHNbbl07dmFyIGksYT10aGlzLmFj
dGlvbnMmJnRoaXMuYWN0aW9uc1tlXTtpZihhKXt2YXIgcz1hLmFwcGx5KHRoaXMscik9PT0hMDtp
ZighcylyZXR1cm59aWYoaT1vLmdldCh0aGlzLCJ0YXJnZXQiKSl7dmFyIGw7KGw9aSkuc2VuZC5h
cHBseShsLGFyZ3VtZW50cyl9ZWxzZSBpZighYSl0aHJvdyBuZXcgRXJyb3IodS5pbnNwZWN0KHRo
aXMpKyIgaGFkIG5vIGFjdGlvbiBoYW5kbGVyIGZvcjogIitlKX19KTtwLnJlb3BlbkNsYXNzKHtp
c0NvbXBvbmVudEZhY3Rvcnk6ITB9KSxlLmRlZmF1bHQ9cH0pLGUoImVtYmVyLXZpZXdzL2luZGV4
IixbImV4cG9ydHMiLCJlbWJlci1ydW50aW1lIiwiZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSIs
ImVtYmVyLXZpZXdzL3N5c3RlbS91dGlscyIsImVtYmVyLXZpZXdzL3N5c3RlbS9leHQiLCJlbWJl
ci1tZXRhbC12aWV3cyIsImVtYmVyLXZpZXdzL2NvbXBvbmVudHMvY29tcG9uZW50IiwiZW1iZXIt
dmlld3Mvc3lzdGVtL2V2ZW50X2Rpc3BhdGNoZXIiLCJlbWJlci12aWV3cy9taXhpbnMvdmlld190
YXJnZXRfYWN0aW9uX3N1cHBvcnQiLCJlbWJlci12aWV3cy9jb21wb25lbnRfbG9va3VwIiwiZW1i
ZXItdmlld3Mvdmlld3MvY2hlY2tib3giLCJlbWJlci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0
IiwiZW1iZXItdmlld3Mvdmlld3MvdGV4dF9maWVsZCIsImVtYmVyLXZpZXdzL3ZpZXdzL3RleHRf
YXJlYSJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQscCl7InVzZSBzdHJpY3Qi
O3QuZGVmYXVsdC4kPXIuZGVmYXVsdCx0LmRlZmF1bHQuVmlld1RhcmdldEFjdGlvblN1cHBvcnQ9
dS5kZWZhdWx0O3ZhciBoPXQuZGVmYXVsdC5WaWV3VXRpbHM9e307aC5pc1NpbXBsZUNsaWNrPW4u
aXNTaW1wbGVDbGljayxoLmdldFZpZXdDbGllbnRSZWN0cz1uLmdldFZpZXdDbGllbnRSZWN0cyxo
LmdldFZpZXdCb3VuZGluZ0NsaWVudFJlY3Q9bi5nZXRWaWV3Qm91bmRpbmdDbGllbnRSZWN0LHQu
ZGVmYXVsdC5fUmVuZGVyZXI9by5SZW5kZXJlcix0LmRlZmF1bHQuQ2hlY2tib3g9Yy5kZWZhdWx0
LHQuZGVmYXVsdC5UZXh0RmllbGQ9ZC5kZWZhdWx0LHQuZGVmYXVsdC5UZXh0QXJlYT1wLmRlZmF1
bHQsdC5kZWZhdWx0LlRleHRTdXBwb3J0PWYuZGVmYXVsdCx0LmRlZmF1bHQuQ29tcG9uZW50TG9v
a3VwPWwuZGVmYXVsdCx0LmRlZmF1bHQuQ29tcG9uZW50PWEuZGVmYXVsdCx0LmRlZmF1bHQuRXZl
bnREaXNwYXRjaGVyPXMuZGVmYXVsdCxlLmRlZmF1bHQ9dC5kZWZhdWx0fSksZSgiZW1iZXItdmll
d3MvbWl4aW5zL2FyaWFfcm9sZV9zdXBwb3J0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9taXhp
biJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD10Lk1peGluLmNyZWF0ZSh7
YXR0cmlidXRlQmluZGluZ3M6WyJhcmlhUm9sZTpyb2xlIl0sYXJpYVJvbGU6bnVsbH0pfSksZSgi
ZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVzX3N1cHBvcnQiLFsiZXhwb3J0cyIsImVtYmVy
LW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1ydW50aW1lL3N5c3RlbS9u
YXRpdmVfYXJyYXkiXSxmdW5jdGlvbihlLHQscixuKXsidXNlIHN0cmljdCI7dmFyIGk9W107ZS5k
ZWZhdWx0PXIuTWl4aW4uY3JlYXRlKHtjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOlsiY2xhc3NOYW1l
cyIsImNsYXNzTmFtZUJpbmRpbmdzIl0saW5pdDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5
KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNsYXNzTmFtZUJpbmRpbmdzPW4uQSh0aGlzLmNsYXNzTmFt
ZUJpbmRpbmdzLnNsaWNlKCkpLHRoaXMuY2xhc3NOYW1lcz1uLkEodGhpcy5jbGFzc05hbWVzLnNs
aWNlKCkpfSxjbGFzc05hbWVzOlsiZW1iZXItdmlldyJdLGNsYXNzTmFtZUJpbmRpbmdzOml9KX0p
LGUoImVtYmVyLXZpZXdzL21peGlucy9pbnN0cnVtZW50YXRpb25fc3VwcG9ydCIsWyJleHBvcnRz
IiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiXSxmdW5jdGlv
bihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXQuTWl4aW4uY3JlYXRlKHtpbnN0cnVtZW50RGlz
cGxheToiIixpbnN0cnVtZW50TmFtZToidmlldyIsaW5zdHJ1bWVudERldGFpbHM6ZnVuY3Rpb24o
ZSl7ZS50ZW1wbGF0ZT1yLmdldCh0aGlzLCJ0ZW1wbGF0ZU5hbWUiKSx0aGlzLl9zdXBlcihlKX19
KTtlLmRlZmF1bHQ9bn0pLGUoImVtYmVyLXZpZXdzL21peGlucy9sZWdhY3lfY2hpbGRfdmlld3Nf
c3VwcG9ydCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJjb250YWluZXIvb3duZXIiXSxm
dW5jdGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9dC5NaXhpbi5jcmVhdGUo
e2xpbmtDaGlsZDpmdW5jdGlvbihlKXtlW2kuT1dORVJdfHxpLnNldE93bmVyKGUsaS5nZXRPd25l
cih0aGlzKSksci5nZXQoZSwicGFyZW50VmlldyIpIT09dGhpcyYmKG4uc2V0KGUsInBhcmVudFZp
ZXciLHRoaXMpLGUudHJpZ2dlcigicGFyZW50Vmlld0RpZENoYW5nZSIpKSxlLm93bmVyVmlldz10
aGlzLm93bmVyVmlld30sdW5saW5rQ2hpbGQ6ZnVuY3Rpb24oZSl7bi5zZXQoZSwicGFyZW50Vmll
dyIsbnVsbCksZS50cmlnZ2VyKCJwYXJlbnRWaWV3RGlkQ2hhbmdlIil9fSl9KSxlKCJlbWJlci12
aWV3cy9taXhpbnMvbGVnYWN5X3ZpZXdfc3VwcG9ydCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwv
ZGVidWciLCJlbWJlci1tZXRhbC9taXhpbiIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCJdLGZ1
bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1yLk1peGluLmNyZWF0ZSh7bXV0YXRl
Q2hpbGRWaWV3czpmdW5jdGlvbihlKXtmb3IodmFyIHQscj1uLmdldCh0aGlzLCJjaGlsZFZpZXdz
IiksaT1yLmxlbmd0aDstLWk+PTA7KXQ9cltpXSxlKHRoaXMsdCxpKTtyZXR1cm4gdGhpc30scmVt
b3ZlQWxsQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1
bmN0aW9uKGUsdCl7ZS5yZW1vdmVDaGlsZCh0KX0pfSxkZXN0cm95QWxsQ2hpbGRyZW46ZnVuY3Rp
b24oKXtyZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0aW9uKGUsdCl7dC5kZXN0cm95
KCl9KX0sbmVhcmVzdENoaWxkT2Y6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW4uZ2V0KHRoaXMsInBh
cmVudFZpZXciKTt0Oyl7aWYobi5nZXQodCwicGFyZW50VmlldyIpaW5zdGFuY2VvZiBlKXJldHVy
biB0O3Q9bi5nZXQodCwicGFyZW50VmlldyIpfX0sbmVhcmVzdEluc3RhbmNlT2Y6ZnVuY3Rpb24o
ZSl7Zm9yKHZhciB0PW4uZ2V0KHRoaXMsInBhcmVudFZpZXciKTt0Oyl7aWYodCBpbnN0YW5jZW9m
IGUpcmV0dXJuIHQ7dD1uLmdldCh0LCJwYXJlbnRWaWV3Iil9fSxfY29udGV4dERpZENoYW5nZTpy
Lm9ic2VydmVyKCJjb250ZXh0IixmdW5jdGlvbigpe3RoaXMucmVyZW5kZXIoKX0pfSk7ZS5kZWZh
dWx0PWl9KSxlKCJlbWJlci12aWV3cy9taXhpbnMvdGVtcGxhdGVfcmVuZGVyaW5nX3N1cHBvcnQi
LFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL21peGluIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmlj
dCI7dmFyIG4saT10Lk1peGluLmNyZWF0ZSh7cmVuZGVyQmxvY2s6ZnVuY3Rpb24oZSx0KXtyZXR1
cm4gdm9pZCAwPT09biYmKG49cigiZW1iZXItaHRtbGJhcnMvc3lzdGVtL3JlbmRlci12aWV3Iikp
LG4ucmVuZGVySFRNTEJhcnNCbG9jayh0aGlzLGUsdCl9fSk7ZS5kZWZhdWx0PWl9KSxlKCJlbWJl
ci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQiLCJlbWJlci1tZXRhbC9taXhpbiIs
ImVtYmVyLXJ1bnRpbWUvbWl4aW5zL3RhcmdldF9hY3Rpb25fc3VwcG9ydCJdLGZ1bmN0aW9uKGUs
dCxyLG4saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSxyLG4pe3ZhciBpPXQuZ2V0KHIsImF0
dHJzLiIrZSl8fHQuZ2V0KHIsZSksbz10LmdldChyLCJvbkV2ZW50IiksYT10LmdldChyLCJ2YWx1
ZSIpOyhvPT09ZXx8ImtleVByZXNzIj09PW8mJiJrZXktcHJlc3MiPT09ZSkmJnIuc2VuZEFjdGlv
bigiYWN0aW9uIixhKSxyLnNlbmRBY3Rpb24oZSxhKSwoaXx8bz09PWUpJiYodC5nZXQociwiYnVi
YmxlcyIpfHxuLnN0b3BQcm9wYWdhdGlvbigpKX12YXIgYT17MTM6Imluc2VydE5ld2xpbmUiLDI3
OiJjYW5jZWwifSxzPW4uTWl4aW4uY3JlYXRlKGkuZGVmYXVsdCx7dmFsdWU6IiIsYXR0cmlidXRl
QmluZGluZ3M6WyJhdXRvY2FwaXRhbGl6ZSIsImF1dG9jb3JyZWN0IiwiYXV0b2ZvY3VzIiwiZGlz
YWJsZWQiLCJmb3JtIiwibWF4bGVuZ3RoIiwicGxhY2Vob2xkZXIiLCJyZWFkb25seSIsInJlcXVp
cmVkIiwic2VsZWN0aW9uRGlyZWN0aW9uIiwic3BlbGxjaGVjayIsInRhYmluZGV4IiwidGl0bGUi
XSxwbGFjZWhvbGRlcjpudWxsLGRpc2FibGVkOiExLG1heGxlbmd0aDpudWxsLGluaXQ6ZnVuY3Rp
b24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vbigicGFzdGUiLHRo
aXMsdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKSx0aGlzLm9uKCJjdXQiLHRoaXMsdGhpcy5f
ZWxlbWVudFZhbHVlRGlkQ2hhbmdlKSx0aGlzLm9uKCJpbnB1dCIsdGhpcyx0aGlzLl9lbGVtZW50
VmFsdWVEaWRDaGFuZ2UpfSxhY3Rpb246bnVsbCxvbkV2ZW50OiJlbnRlciIsYnViYmxlczohMSxp
bnRlcnByZXRLZXlFdmVudHM6ZnVuY3Rpb24oZSl7dmFyIHQ9YSxyPXRbZS5rZXlDb2RlXTtpZih0
aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UoKSxyKXJldHVybiB0aGlzW3JdKGUpfSxfZWxlbWVu
dFZhbHVlRGlkQ2hhbmdlOmZ1bmN0aW9uKCl7ci5zZXQodGhpcywidmFsdWUiLHRoaXMucmVhZERP
TUF0dHIoInZhbHVlIikpfSxjaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5fZWxlbWVudFZhbHVlRGlk
Q2hhbmdlKGUpfSxpbnNlcnROZXdsaW5lOmZ1bmN0aW9uKGUpe28oImVudGVyIix0aGlzLGUpLG8o
Imluc2VydC1uZXdsaW5lIix0aGlzLGUpfSxjYW5jZWw6ZnVuY3Rpb24oZSl7bygiZXNjYXBlLXBy
ZXNzIix0aGlzLGUpfSxmb2N1c0luOmZ1bmN0aW9uKGUpe28oImZvY3VzLWluIix0aGlzLGUpfSxm
b2N1c091dDpmdW5jdGlvbihlKXt0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UoZSksbygiZm9j
dXMtb3V0Iix0aGlzLGUpfSxrZXlQcmVzczpmdW5jdGlvbihlKXtvKCJrZXktcHJlc3MiLHRoaXMs
ZSl9LGtleVVwOmZ1bmN0aW9uKGUpe3RoaXMuaW50ZXJwcmV0S2V5RXZlbnRzKGUpLHRoaXMuc2Vu
ZEFjdGlvbigia2V5LXVwIix0LmdldCh0aGlzLCJ2YWx1ZSIpLGUpfSxrZXlEb3duOmZ1bmN0aW9u
KGUpe3RoaXMuc2VuZEFjdGlvbigia2V5LWRvd24iLHQuZ2V0KHRoaXMsInZhbHVlIiksZSl9fSk7
ZS5kZWZhdWx0PXN9KSxlKCJlbWJlci12aWV3cy9taXhpbnMvdmlld19jaGlsZF92aWV3c19zdXBw
b3J0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL21peGluIiwi
ZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0IiwiZW1i
ZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9uYXRpdmVfYXJy
YXkiLCJjb250YWluZXIvb3duZXIiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMpeyJ1c2Ugc3Ry
aWN0Ijt2YXIgdT1bXTtlLmRlZmF1bHQ9ci5NaXhpbi5jcmVhdGUoe2NoaWxkVmlld3M6dSxpbml0
OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuY2hpbGRW
aWV3cz1hLkEodGhpcy5jaGlsZFZpZXdzLnNsaWNlKCkpLHRoaXMub3duZXJWaWV3PXRoaXMub3du
ZXJWaWV3fHx0aGlzfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlKXt0aGlzLmxpbmtDaGlsZChlKSx0
aGlzLmNoaWxkVmlld3MucHVzaChlKX0sZGVzdHJveUNoaWxkOmZ1bmN0aW9uKGUpe2UuZGVzdHJv
eSgpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtpZighdGhpcy5pc0Rlc3Ryb3lpbmcpe3RoaXMu
dW5saW5rQ2hpbGQoZSk7dmFyIHQ9bi5nZXQodGhpcywiY2hpbGRWaWV3cyIpLHI9dC5pbmRleE9m
KGUpO3JldHVybiByIT09LTEmJnQuc3BsaWNlKHIsMSksdGhpc319LGNyZWF0ZUNoaWxkVmlldzpm
dW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPD0xfHx2b2lkIDA9PT1hcmd1bWVudHNb
MV0/e306YXJndW1lbnRzWzFdO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoImNyZWF0ZUNoaWxk
Vmlld3MgZmlyc3QgYXJndW1lbnQgbXVzdCBleGlzdCIpO3ZhciByPXMuZ2V0T3duZXIodGhpcyk7
aWYoZS5pc1ZpZXcmJmUucGFyZW50Vmlldz09PXRoaXMmJnMuZ2V0T3duZXIoZSk9PT1yKXJldHVy
biBlO3ZhciBuO2lmKHQucGFyZW50Vmlldz10aGlzLHQucmVuZGVyZXI9dGhpcy5yZW5kZXJlcix0
Ll92aWV3UmVnaXN0cnk9dGhpcy5fdmlld1JlZ2lzdHJ5LGUuaXNWaWV3RmFjdG9yeSlzLnNldE93
bmVyKHQsciksbj1lLmNyZWF0ZSh0KSxuLnZpZXdOYW1lJiZpLnNldCh0aGlzLG4udmlld05hbWUs
bik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBhPSJ2aWV3OiIrZSx1PXIuX2xvb2t1
cEZhY3RvcnkoYSk7bj11LmNyZWF0ZSh0KX1lbHNlIG49ZSxzLnNldE93bmVyKHQsciksby5kZWZh
dWx0KG4sdCk7cmV0dXJuIHRoaXMubGlua0NoaWxkKG4pLG59LGxpbmtDaGlsZDpmdW5jdGlvbihl
KXtlW3MuT1dORVJdfHxzLnNldE93bmVyKGUscy5nZXRPd25lcih0aGlzKSksZS5wYXJlbnRWaWV3
PXRoaXMsZS5vd25lclZpZXc9dGhpcy5vd25lclZpZXd9LHVubGlua0NoaWxkOmZ1bmN0aW9uKGUp
e2UucGFyZW50Vmlldz1udWxsfX0pfSksZSgiZW1iZXItdmlld3MvbWl4aW5zL3ZpZXdfY29udGV4
dF9zdXBwb3J0IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9taXhpbiIsImVtYmVyLW1ldGFsL2Nv
bXB1dGVkIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwvcHJvcGVydHlf
c2V0IiwiZW1iZXItdmlld3MvbWl4aW5zL2xlZ2FjeV92aWV3X3N1cHBvcnQiLCJlbWJlci1tZXRh
bC9ldmVudHMiXSxmdW5jdGlvbihlLHQscixuLGksbyxhKXsidXNlIHN0cmljdCI7dmFyIHM9dC5N
aXhpbi5jcmVhdGUoby5kZWZhdWx0LHtjb250ZXh0OnIuY29tcHV0ZWQoe2dldDpmdW5jdGlvbigp
e3JldHVybiBuLmdldCh0aGlzLCJfY29udGV4dCIpfSxzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4g
aS5zZXQodGhpcywiX2NvbnRleHQiLHQpLHR9fSksX2NvbnRleHQ6ci5jb21wdXRlZCh7Z2V0OmZ1
bmN0aW9uKCl7dmFyIGUsdDtyZXR1cm4odD1uLmdldCh0aGlzLCJjb250cm9sbGVyIikpP3Q6KGU9
dGhpcy5wYXJlbnRWaWV3LGU/bi5nZXQoZSwiX2NvbnRleHQiKTpudWxsKX0sc2V0OmZ1bmN0aW9u
KGUsdCl7cmV0dXJuIHR9fSksX2NvbnRyb2xsZXI6bnVsbCxjb250cm9sbGVyOnIuY29tcHV0ZWQo
e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250cm9sbGVyP3RoaXMuX2NvbnRyb2xsZXI6
dGhpcy5wYXJlbnRWaWV3P24uZ2V0KHRoaXMucGFyZW50VmlldywiY29udHJvbGxlciIpOm51bGx9
LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9jb250cm9sbGVyPXQsdH19KSxfbGVnYWN5
Q29udHJvbGxlckRpZENoYW5nZTp0Lm9ic2VydmVyKCJjb250cm9sbGVyIixmdW5jdGlvbigpe3Ro
aXMuY2hpbGRWaWV3cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdGlmeVByb3BlcnR5
Q2hhbmdlKCJjb250cm9sbGVyIil9KX0pLF9ub3RpZnlDb250cm9sbGVyQ2hhbmdlOmEub24oInBh
cmVudFZpZXdEaWRDaGFuZ2UiLGZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgi
Y29udHJvbGxlciIpfSl9KTtlLmRlZmF1bHQ9c30pLGUoImVtYmVyLXZpZXdzL21peGlucy92aWV3
X3N0YXRlX3N1cHBvcnQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0
YWwvbWl4aW4iXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIuTWl4aW4uY3Jl
YXRlKHt0cmFuc2l0aW9uVG86ZnVuY3Rpb24oZSl7dGhpcy5fdHJhbnNpdGlvblRvKGUpfSxfdHJh
bnNpdGlvblRvOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRTdGF0ZSxyPXRoaXMuX2N1
cnJlbnRTdGF0ZT10aGlzLl9zdGF0ZXNbZV07dGhpcy5fc3RhdGU9ZSx0JiZ0LmV4aXQmJnQuZXhp
dCh0aGlzKSxyLmVudGVyJiZyLmVudGVyKHRoaXMpfX0pO2UuZGVmYXVsdD1ufSksZSgiZW1iZXIt
dmlld3MvbWl4aW5zL3ZpZXdfc3VwcG9ydCIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWci
LCJlbWJlci1tZXRhbC9lcnJvciIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1l
dGFsL3J1bl9sb29wIiwiZW1iZXItbWV0YWwvb2JzZXJ2ZXIiLCJlbWJlci1tZXRhbC91dGlscyIs
ImVtYmVyLW1ldGFsL2NvbXB1dGVkIiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1ydW50aW1l
L3N5c3RlbS9jb3JlX29iamVjdCIsImVtYmVyLW1ldGFsL3N5bWJvbCIsImNvbnRhaW5lci9vd25l
ciIsImVtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnkiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMs
dSxsLGMsZixkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcCgpe3JldHVybiB0aGlzfXZhciBoLG09
Yy5kZWZhdWx0KCJJTklUX1dBU19DQUxMRUQiKTtlLmRlZmF1bHQ9dS5NaXhpbi5jcmVhdGUoKGg9
e2NvbmNhdGVuYXRlZFByb3BlcnRpZXM6WyJhdHRyaWJ1dGVCaW5kaW5ncyJdLGlzVmlldzohMCx0
ZW1wbGF0ZU5hbWU6bnVsbCxsYXlvdXROYW1lOm51bGwsdGVtcGxhdGU6cy5jb21wdXRlZCh7Z2V0
OmZ1bmN0aW9uKCl7dmFyIGU9bi5nZXQodGhpcywidGVtcGxhdGVOYW1lIiksdD10aGlzLnRlbXBs
YXRlRm9yTmFtZShlLCJ0ZW1wbGF0ZSIpO3JldHVybiB0fHxuLmdldCh0aGlzLCJkZWZhdWx0VGVt
cGxhdGUiKX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMCE9PXQ/dDpuLmdldCh0aGlz
LGUpfX0pLGxheW91dDpzLmNvbXB1dGVkKHtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5nZXQodGhp
cywibGF5b3V0TmFtZSIpLHI9dGhpcy50ZW1wbGF0ZUZvck5hbWUodCwibGF5b3V0Iik7cmV0dXJu
IHJ8fG4uZ2V0KHRoaXMsImRlZmF1bHRMYXlvdXQiKX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJu
IHR9fSksdGVtcGxhdGVGb3JOYW1lOmZ1bmN0aW9uKGUsdCl7aWYoZSl7dmFyIG49Zi5nZXRPd25l
cih0aGlzKTtpZighbil0aHJvdyBuZXcgci5kZWZhdWx0KCJDb250YWluZXIgd2FzIG5vdCBmb3Vu
ZCB3aGVuIGxvb2tpbmcgdXAgYSB2aWV3cyB0ZW1wbGF0ZS4gVGhpcyBpcyBtb3N0IGxpa2VseSBk
dWUgdG8gbWFudWFsbHkgaW5zdGFudGlhdGluZyBhbiBFbWJlci5WaWV3LiBTZWU6IGh0dHA6Ly9n
aXQuaW8vRUtQcG5BIik7cmV0dXJuIG4ubG9va3VwKCJ0ZW1wbGF0ZToiK2UpfX0sbmVhcmVzdE9m
VHlwZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9bi5nZXQodGhpcywicGFyZW50VmlldyIpLHI9ZSBp
bnN0YW5jZW9mIHUuTWl4aW4/ZnVuY3Rpb24odCl7cmV0dXJuIGUuZGV0ZWN0KHQpfTpmdW5jdGlv
bih0KXtyZXR1cm4gZS5kZXRlY3QodC5jb25zdHJ1Y3Rvcil9O3Q7KXtpZihyKHQpKXJldHVybiB0
O3Q9bi5nZXQodCwicGFyZW50VmlldyIpfX0sbmVhcmVzdFdpdGhQcm9wZXJ0eTpmdW5jdGlvbihl
KXtmb3IodmFyIHQ9bi5nZXQodGhpcywicGFyZW50VmlldyIpO3Q7KXtpZihlIGluIHQpcmV0dXJu
IHQ7dD1uLmdldCh0LCJwYXJlbnRWaWV3Iil9fSxyZXJlbmRlcjpmdW5jdGlvbigpe3JldHVybiB0
aGlzLl9jdXJyZW50U3RhdGUucmVyZW5kZXIodGhpcyl9LGVsZW1lbnQ6bnVsbCwkOmZ1bmN0aW9u
KGUpe3JldHVybiB0aGlzLl9jdXJyZW50U3RhdGUuJCh0aGlzLGUpfSxmb3JFYWNoQ2hpbGRWaWV3
OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2hpbGRWaWV3cztpZighdClyZXR1cm4gdGhpczt2YXIg
cixuLGk9dC5sZW5ndGg7Zm9yKG49MDtuPGk7bisrKXI9dFtuXSxlKHIpO3JldHVybiB0aGlzfSxh
cHBlbmRUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9lbnZpcm9ubWVudD90aGlzLl9lbnZpcm9u
bWVudC5vcHRpb25zLmpRdWVyeTpkLmRlZmF1bHQ7aWYodCl7dmFyIHI9dChlKTt0aGlzLnJlbmRl
cmVyLmFwcGVuZFRvKHRoaXMsclswXSl9ZWxzZXt2YXIgcj1lO3RoaXMucmVuZGVyZXIuYXBwZW5k
VG8odGhpcyxyKX1yZXR1cm4gdGhpc30scmVuZGVyVG9FbGVtZW50OmZ1bmN0aW9uKGUpe2U9ZXx8
ImJvZHkiO3ZhciB0PXRoaXMucmVuZGVyZXIuX2RvbS5jcmVhdGVFbGVtZW50KGUpO3JldHVybiB0
aGlzLnJlbmRlcmVyLmFwcGVuZFRvKHRoaXMsdCksdH0scmVwbGFjZUluOmZ1bmN0aW9uKGUpe3Zh
ciB0PWQuZGVmYXVsdChlKTtyZXR1cm4gdGhpcy5yZW5kZXJlci5yZXBsYWNlSW4odGhpcyx0WzBd
KSwKK3RoaXN9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZFRvKGRvY3VtZW50
LmJvZHkpfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZWRGcm9tRE9NfHx0aGlzLmRlc3Ry
b3lFbGVtZW50KCksdGhpcy5fd2lsbEluc2VydD0hMX0sZWxlbWVudElkOm51bGwsZmluZEVsZW1l
bnRJblBhcmVudEVsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9IiMiK3RoaXMuZWxlbWVudElkO3Jl
dHVybiBkLmRlZmF1bHQodClbMF18fGQuZGVmYXVsdCh0LGUpWzBdfSxjcmVhdGVFbGVtZW50OmZ1
bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudD90aGlzOih0aGlzLnJlbmRlcmVyLmNyZWF0ZUVs
ZW1lbnQodGhpcyksdGhpcyl9LHdpbGxJbnNlcnRFbGVtZW50OnAsZGlkSW5zZXJ0RWxlbWVudDpw
LHdpbGxDbGVhclJlbmRlcjpwLGRlc3Ryb3lFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
X2N1cnJlbnRTdGF0ZS5kZXN0cm95RWxlbWVudCh0aGlzKX0sd2lsbERlc3Ryb3lFbGVtZW50OnAs
cGFyZW50Vmlld0RpZENoYW5nZTpwLHRhZ05hbWU6bnVsbCxyZWFkRE9NQXR0cjpmdW5jdGlvbihl
KXt2YXIgdD10aGlzLl9yZW5kZXJOb2RlLmNoaWxkTm9kZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3Jl
dHVybiB0LmF0dHJOYW1lPT09ZX0pWzBdO3JldHVybiB0P3QuZ2V0Q29udGVudCgpOm51bGx9LGlu
aXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5lbGVt
ZW50SWR8fCh0aGlzLmVsZW1lbnRJZD1hLmd1aWRGb3IodGhpcykpLHRoaXMuc2NoZWR1bGVkUmV2
YWxpZGF0aW9uPSExLHRoaXNbbV09ITAsImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZGlkSW5pdEF0
dHJzfX0saFtsLlBPU1RfSU5JVF09ZnVuY3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFy
Z3VtZW50cyksdGhpcy5yZW5kZXJlci5jb21wb25lbnRJbml0QXR0cnModGhpcyx0aGlzLmF0dHJz
fHx7fSl9LGguX19kZWZpbmVOb25FbnVtZXJhYmxlPWZ1bmN0aW9uKGUpe3RoaXNbZS5uYW1lXT1l
LmRlc2NyaXB0b3IudmFsdWV9LGgucmV2YWxpZGF0ZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIu
cmV2YWxpZGF0ZVRvcExldmVsVmlldyh0aGlzKSx0aGlzLnNjaGVkdWxlZFJldmFsaWRhdGlvbj0h
MX0saC5zY2hlZHVsZVJldmFsaWRhdGU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlJiYhdGhpcy5f
ZGlzcGF0Y2hpbmcmJnRoaXMuZW52LnJlbmRlcmVkTm9kZXMuaGFzKGUpP3ZvaWQgaS5kZWZhdWx0
LnNjaGVkdWxlT25jZSgicmVuZGVyIix0aGlzLHRoaXMucmV2YWxpZGF0ZSk6dm9pZCh0aGlzLnNj
aGVkdWxlZFJldmFsaWRhdGlvbiYmIXRoaXMuX2Rpc3BhdGNoaW5nfHwodGhpcy5zY2hlZHVsZWRS
ZXZhbGlkYXRpb249ITAsaS5kZWZhdWx0LnNjaGVkdWxlT25jZSgicmVuZGVyIix0aGlzLHRoaXMu
cmV2YWxpZGF0ZSkpKX0saC50ZW1wbGF0ZVJlbmRlcmVyPW51bGwsaC5yZW1vdmVGcm9tUGFyZW50
PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wYXJlbnRWaWV3O3JldHVybiB0aGlzLnJlbW92ZSgpLGUm
JmUucmVtb3ZlQ2hpbGQodGhpcyksdGhpc30saC5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhp
cy5wYXJlbnRWaWV3LHQ9dGhpcy52aWV3TmFtZTtpZih0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFy
Z3VtZW50cykpcmV0dXJuIHQmJmUmJmUuc2V0KHQsbnVsbCksdGhpcy5sYXN0UmVzdWx0JiZ0aGlz
Lmxhc3RSZXN1bHQuZGVzdHJveSgpLHRoaXN9LGguaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oZSx0KXty
ZXR1cm4gdGhpcy5fY3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMsZSx0KX0saC5fcmVnaXN0
ZXI9ZnVuY3Rpb24oKXt0aGlzLl92aWV3UmVnaXN0cnlbdGhpcy5lbGVtZW50SWRdPXRoaXN9LGgu
X3VucmVnaXN0ZXI9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fdmlld1JlZ2lzdHJ5W3RoaXMuZWxl
bWVudElkXX0saC5yZWdpc3Rlck9ic2VydmVyPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKG58fCJmdW5j
dGlvbiIhPXR5cGVvZiByfHwobj1yLHI9bnVsbCksZSYmIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIg
aT10aGlzLl93cmFwQXNTY2hlZHVsZWQobik7by5hZGRPYnNlcnZlcihlLHQscixpKSx0aGlzLm9u
ZSgid2lsbENsZWFyUmVuZGVyIixmdW5jdGlvbigpe28ucmVtb3ZlT2JzZXJ2ZXIoZSx0LHIsaSl9
KX19LGguX3dyYXBBc1NjaGVkdWxlZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLHI9ZnVuY3Rpb24o
KXt0Ll9jdXJyZW50U3RhdGUuaW52b2tlT2JzZXJ2ZXIodGhpcyxlKX0sbj1mdW5jdGlvbigpe2ku
ZGVmYXVsdC5zY2hlZHVsZU9uY2UoInJlbmRlciIsdGhpcyxyKX07cmV0dXJuIG59LGgpKX0pLGUo
ImVtYmVyLXZpZXdzL21peGlucy92aWV3X3RhcmdldF9hY3Rpb25fc3VwcG9ydCIsWyJleHBvcnRz
IiwiZW1iZXItbWV0YWwvbWl4aW4iLCJlbWJlci1ydW50aW1lL21peGlucy90YXJnZXRfYWN0aW9u
X3N1cHBvcnQiLCJlbWJlci1tZXRhbC9hbGlhcyJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3Ry
aWN0IjtlLmRlZmF1bHQ9dC5NaXhpbi5jcmVhdGUoci5kZWZhdWx0LHt0YXJnZXQ6bi5kZWZhdWx0
KCJjb250cm9sbGVyIiksYWN0aW9uQ29udGV4dDpuLmRlZmF1bHQoImNvbnRleHQiKX0pfSksZSgi
ZW1iZXItdmlld3MvbWl4aW5zL3Zpc2liaWxpdHlfc3VwcG9ydCIsWyJleHBvcnRzIiwiZW1iZXIt
bWV0YWwvbWl4aW4iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRhbC9ydW5f
bG9vcCJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKCl7cmV0dXJu
IHRoaXN9dmFyIG89dC5NaXhpbi5jcmVhdGUoe2lzVmlzaWJsZTohMCxiZWNhbWVWaXNpYmxlOmks
YmVjYW1lSGlkZGVuOmksX2lzVmlzaWJsZURpZENoYW5nZTp0Lm9ic2VydmVyKCJpc1Zpc2libGUi
LGZ1bmN0aW9uKCl7dGhpcy5faXNWaXNpYmxlIT09ci5nZXQodGhpcywiaXNWaXNpYmxlIikmJm4u
ZGVmYXVsdC5zY2hlZHVsZU9uY2UoInJlbmRlciIsdGhpcyx0aGlzLl90b2dnbGVWaXNpYmlsaXR5
KX0pLF90b2dnbGVWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kKCksdD1yLmdldCh0
aGlzLCJpc1Zpc2libGUiKTt0aGlzLl9pc1Zpc2libGUhPT10JiYodGhpcy5faXNWaXNpYmxlPXQs
ZSYmKGUudG9nZ2xlKHQpLHRoaXMuX2lzQW5jZXN0b3JIaWRkZW4oKXx8KHQ/dGhpcy5fbm90aWZ5
QmVjYW1lVmlzaWJsZSgpOnRoaXMuX25vdGlmeUJlY2FtZUhpZGRlbigpKSkpfSxfbm90aWZ5QmVj
YW1lVmlzaWJsZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigiYmVjYW1lVmlzaWJsZSIpLHRoaXMu
Zm9yRWFjaENoaWxkVmlldyhmdW5jdGlvbihlKXt2YXIgdD1yLmdldChlLCJpc1Zpc2libGUiKTso
dHx8bnVsbD09PXQpJiZlLl9ub3RpZnlCZWNhbWVWaXNpYmxlKCl9KX0sX25vdGlmeUJlY2FtZUhp
ZGRlbjpmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigiYmVjYW1lSGlkZGVuIiksdGhpcy5mb3JFYWNo
Q2hpbGRWaWV3KGZ1bmN0aW9uKGUpe3ZhciB0PXIuZ2V0KGUsImlzVmlzaWJsZSIpOyh0fHxudWxs
PT09dCkmJmUuX25vdGlmeUJlY2FtZUhpZGRlbigpfSl9LF9pc0FuY2VzdG9ySGlkZGVuOmZ1bmN0
aW9uKCl7Zm9yKHZhciBlPXIuZ2V0KHRoaXMsInBhcmVudFZpZXciKTtlOyl7aWYoci5nZXQoZSwi
aXNWaXNpYmxlIik9PT0hMSlyZXR1cm4hMDtlPXIuZ2V0KGUsInBhcmVudFZpZXciKX1yZXR1cm4h
MX19KTtlLmRlZmF1bHQ9b30pLGUoImVtYmVyLXZpZXdzL3N0cmVhbXMvY2xhc3NfbmFtZV9iaW5k
aW5nIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCIsImVtYmVyLW1ldGFsL3V0aWxzIiwiZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyIsImVt
YmVyLXJ1bnRpbWUvc3lzdGVtL3N0cmluZyJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNlIHN0
cmljdCI7ZnVuY3Rpb24gYShlKXt2YXIgdCxyLG49ZS5zcGxpdCgiOiIpLGk9blswXSxvPSIiO3Jl
dHVybiBuLmxlbmd0aD4xJiYodD1uWzFdLDM9PT1uLmxlbmd0aCYmKHI9blsyXSksbz0iOiIrdCxy
JiYobys9IjoiK3IpKSx7cGF0aDppLGNsYXNzTmFtZXM6byxjbGFzc05hbWU6IiI9PT10P3ZvaWQg
MDp0LGZhbHN5Q2xhc3NOYW1lOnJ9fWZ1bmN0aW9uIHMoZSx0LGksYSl7aWYobi5pc0FycmF5KHQp
JiYodD0wIT09ci5nZXQodCwibGVuZ3RoIikpLGl8fGEpcmV0dXJuIGkmJnQ/aTphJiYhdD9hOm51
bGw7aWYodD09PSEwKXt2YXIgcz1lLnNwbGl0KCIuIik7cmV0dXJuIG8uZGFzaGVyaXplKHNbcy5s
ZW5ndGgtMV0pfXJldHVybiB0IT09ITEmJm51bGwhPXQ/dDpudWxsfWZ1bmN0aW9uIHUoZSx0LHIp
e3I9cnx8IiI7dmFyIG49YSh0KTtpZigiIj09PW4ucGF0aClyZXR1cm4gcyhuLnBhdGgsITAsbi5j
bGFzc05hbWUsbi5mYWxzeUNsYXNzTmFtZSk7dmFyIG89ZS5nZXRTdHJlYW0ocituLnBhdGgpO3Jl
dHVybiBpLmNoYWluKG8sZnVuY3Rpb24oKXtyZXR1cm4gcyhuLnBhdGgsaS5yZWFkKG8pLG4uY2xh
c3NOYW1lLG4uZmFsc3lDbGFzc05hbWUpfSl9ZS5wYXJzZVByb3BlcnR5UGF0aD1hLGUuY2xhc3NT
dHJpbmdGb3JWYWx1ZT1zLGUuc3RyZWFtaWZ5Q2xhc3NOYW1lQmluZGluZz11fSksZSgiZW1iZXIt
dmlld3Mvc3RyZWFtcy9zaG91bGRfZGlzcGxheSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVi
dWciLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1ydW50aW1lL3V0aWxzIiwiZW1i
ZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0iLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzIl0sZnVu
Y3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUpe2lmKG8uaXNTdHJl
YW0oZSkpcmV0dXJuIG5ldyBzKGUpO3ZhciB0PXR5cGVvZiBlO2lmKCJib29sZWFuIj09PXQpcmV0
dXJuIGU7aWYodCYmIm9iamVjdCI9PT10JiZudWxsIT09ZSl7dmFyIGk9ci5nZXQoZSwiaXNUcnV0
aHkiKTtpZigiYm9vbGVhbiI9PXR5cGVvZiBpKXJldHVybiBpfXJldHVybiBuLmlzQXJyYXkoZSk/
MCE9PXIuZ2V0KGUsImxlbmd0aCIpOiEhZX1lLmRlZmF1bHQ9YTt2YXIgcz1pLmRlZmF1bHQuZXh0
ZW5kKHtpbml0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0KCJpc1RydXRoeSIpO3RoaXMuaW5pdCgp
LHRoaXMucHJlZGljYXRlPWUsdGhpcy5pc1RydXRoeT10LHRoaXMubGVuZ3RoRGVwPW51bGwsdGhp
cy5hZGREZXBlbmRlbmN5KGUpLHRoaXMuYWRkRGVwZW5kZW5jeSh0KX0sY29tcHV0ZTpmdW5jdGlv
bigpe3ZhciBlPW8ucmVhZCh0aGlzLmlzVHJ1dGh5KTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBl
P2U6dGhpcy5sZW5ndGhEZXA/MCE9PXRoaXMubGVuZ3RoRGVwLmdldFZhbHVlKCk6ISFvLnJlYWQo
dGhpcy5wcmVkaWNhdGUpfSxyZXZhbGlkYXRlOmZ1bmN0aW9uKCl7bi5pc0FycmF5KG8ucmVhZCh0
aGlzLnByZWRpY2F0ZSkpP3RoaXMubGVuZ3RoRGVwfHwodGhpcy5sZW5ndGhEZXA9dGhpcy5hZGRN
dXRhYmxlRGVwZW5kZW5jeSh0aGlzLnByZWRpY2F0ZS5nZXQoImxlbmd0aCIpKSk6dGhpcy5sZW5n
dGhEZXAmJih0aGlzLmxlbmd0aERlcC5kZXN0cm95KCksdGhpcy5sZW5ndGhEZXA9bnVsbCl9fSl9
KSxlKCJlbWJlci12aWV3cy9zdHJlYW1zL3V0aWxzIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9k
ZWJ1ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL3N0cmVhbXMvdXRp
bHMiLCJlbWJlci1ydW50aW1lL21peGlucy9jb250cm9sbGVyIl0sZnVuY3Rpb24oZSx0LHIsbixp
KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3ZhciByLGk9bi5yZWFkKGUpO3JldHVybiBy
PSJzdHJpbmciPT10eXBlb2YgaT90Ll9sb29rdXBGYWN0b3J5KCJ2aWV3OiIraSk6aX1mdW5jdGlv
biBhKGUsdCl7dmFyIHI9bi5yZWFkKGUpLGk9dC5sb29rdXAoImNvbXBvbmVudC1sb29rdXA6bWFp
biIpO3JldHVybiBpLmxvb2t1cEZhY3Rvcnkocix0KX1mdW5jdGlvbiBzKGUpe2lmKG4uaXNTdHJl
YW0oZSkpe3ZhciB0PWUudmFsdWUoKTtpZigiY29udHJvbGxlciIhPT1lLmxhYmVsKWZvcig7aS5k
ZWZhdWx0LmRldGVjdCh0KTspdD1yLmdldCh0LCJtb2RlbCIpO3JldHVybiB0fXJldHVybiBlfWUu
cmVhZFZpZXdGYWN0b3J5PW8sZS5yZWFkQ29tcG9uZW50RmFjdG9yeT1hLGUucmVhZFVud3JhcHBl
ZE1vZGVsPXN9KSxlKCJlbWJlci12aWV3cy9zeXN0ZW0vYWN0aW9uX21hbmFnZXIiLFsiZXhwb3J0
cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KCl7fXQucmVnaXN0ZXJlZEFj
dGlvbnM9e30sZS5kZWZhdWx0PXR9KSxlKCJlbWJlci12aWV3cy9zeXN0ZW0vYnVpbGQtY29tcG9u
ZW50LXRlbXBsYXRlIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9kZWJ1ZyIsImVtYmVyLW1ldGFs
L3Byb3BlcnR5X2dldCIsImVtYmVyLW1ldGFsL2Fzc2lnbiIsImh0bWxiYXJzLXJ1bnRpbWUiLCJl
bWJlci1odG1sYmFycy9ob29rcy9nZXQtdmFsdWUiLCJlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxz
Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMoZSx0LHIp
e3ZhciBuLG8sYT1lLmNvbXBvbmVudCxzPWUudGFnTmFtZSx1PWUubGF5b3V0LGM9ZS5pc0FuZ2xl
QnJhY2tldCxiPWUuaXNDb21wb25lbnRFbGVtZW50LGc9ZS5vdXRlckF0dHJzO2lmKHZvaWQgMD09
PWEmJihhPW51bGwpLHUmJnUucmF3KXt2YXIgXz1kKHIudGVtcGxhdGVzLHIuc2NvcGUsci5zZWxm
LGEpO249cCh1LnJhdyxfLHIuc2VsZixhLHQpLG89dS5yYXcubWV0YX1lbHNlIHIudGVtcGxhdGVz
JiZyLnRlbXBsYXRlcy5kZWZhdWx0JiYobj1mKHIudGVtcGxhdGVzLmRlZmF1bHQsci5zY29wZSxy
LnNlbGYsYSksbz1yLnRlbXBsYXRlcy5kZWZhdWx0Lm1ldGEpO2lmKGEmJiFhLl9pc0FuZ2xlQnJh
Y2tldHx8YilpZihzPXN8fG0oYSksIiIhPT1zKXtiJiYodD1sKHQsZykpO3ZhciB3PXYoYSxjLHQp
LHg9aS5pbnRlcm5hbC5tYW51YWxFbGVtZW50KHMsdyk7eC5tZXRhPW8sbj1oKHgsbixhKX1lbHNl
IHkoYSk7cmV0dXJue2NyZWF0ZWRFbGVtZW50OiEhcyxibG9jazpufX1mdW5jdGlvbiB1KGUsdCxy
KXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdCl7dmFyIGE9dFtvXTsic3RyaW5nIj09dHlwZW9mIGE/
bltvXT1hOm5bb109WyJ2YWx1ZSIsYV19dmFyIHM9ci50ZW1wbGF0ZXMuZGVmYXVsdCx1PWkuaW50
ZXJuYWwubWFudWFsRWxlbWVudChlLG4scy5pc0VtcHR5KTtpZihzLmlzRW1wdHkpcmV0dXJuIGMo
dSx7c2NvcGU6ci5zY29wZX0pO3ZhciBsPWMoci50ZW1wbGF0ZXMuZGVmYXVsdCxyKTtyZXR1cm4g
Yyh1LHt5aWVsZFRvOmwsc2NvcGU6ci5zY29wZX0pfWZ1bmN0aW9uIGwoZSx0KXt2YXIgcj1uLmRl
ZmF1bHQoe30sZSx0KTtyZXR1cm4gZS5jbGFzcyYmdC5jbGFzcyYmKHIuY2xhc3M9WyJzdWJleHBy
IiwiLWpvaW4tY2xhc3NlcyIsW1sidmFsdWUiLGUuY2xhc3NdLFsidmFsdWUiLHQuY2xhc3NdXSxb
XV0pLHJ9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiBpLmludGVybmFsLmJsb2NrRm9yKGkucmVuZGVy
LGUsdCl9ZnVuY3Rpb24gZihlLHQscixuKXtyZXR1cm4gYyhlLHtzY29wZTp0LHNlbGY6cixvcHRp
b25zOnt2aWV3Om59fSl9ZnVuY3Rpb24gZChlLHQscixuKXtpZihlKXt2YXIgaT17fTtmb3IodmFy
IG8gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT1lW29dO2EmJihpW29dPWYoZVtv
XSx0LHIsbikpfXJldHVybiBpfX1mdW5jdGlvbiBwKGUsdCxyLG4saSl7cmV0dXJuIGMoZSx7eWll
bGRUbzp0LHNlbGY6cnx8bixvcHRpb25zOnt2aWV3Om4sYXR0cnM6aX19KX1mdW5jdGlvbiBoKGUs
dCxyKXtyZXR1cm4gYyhlLHt5aWVsZFRvOnQsc2VsZjpyLG9wdGlvbnM6e3ZpZXc6cn19KX1mdW5j
dGlvbiBtKGUpe3ZhciB0PWUudGFnTmFtZTtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBl
b2YgdCYmdC5pc0Rlc2NyaXB0b3ImJih0PXIuZ2V0KGUsInRhZ05hbWUiKSksbnVsbCE9PXQmJnZv
aWQgMCE9PXR8fCh0PWUuX2RlZmF1bHRUYWdOYW1lfHwiZGl2IiksdH1mdW5jdGlvbiB2KGUsdCxu
KXt2YXIgaSxhLHM9e30sdT1lLmF0dHJpYnV0ZUJpbmRpbmdzLGw9ZS5pc0NvbXBvbmVudD8iIjoi
dmlldy4iO2lmKG4uaWQmJm8uZGVmYXVsdChuLmlkKT8ocy5pZD1vLmRlZmF1bHQobi5pZCksZS5l
bGVtZW50SWQ9cy5pZCk6cy5pZD1lLmVsZW1lbnRJZCx1KWZvcihpPTAsYT11Lmxlbmd0aDtpPGE7
aSsrKXt2YXIgYyxmLGQ9dVtpXSxwPWQuaW5kZXhPZigiOiIpO2lmKHAhPT0tMSl7dmFyIGg9ZC5z
dWJzdHJpbmcoMCxwKTtjPWQuc3Vic3RyaW5nKHArMSksZj1bImdldCIsIiIrbCtoXX1lbHNlIG5b
ZF0/KGM9ZCxmPVsidmFsdWUiLG5bZF1dKTooYz1kLGY9WyJnZXQiLCIiK2wrZF0pO3NbY109Zn1p
Zih0KWZvcih2YXIgbSBpbiBuKXt2YXIgdj1uW21dO3YmJigic3RyaW5nIj09dHlwZW9mIHZ8fHYu
aXNDb25jYXQpJiYoc1ttXT1bInZhbHVlIix2XSl9bi50YWdOYW1lJiYoZS50YWdOYW1lPW4udGFn
TmFtZSk7dmFyIGc9YihlLG4sbCk7aWYoZyYmKHMuY2xhc3M9Zyksci5nZXQoZSwiaXNWaXNpYmxl
Iik9PT0hMSl7dmFyIHk9WyJzdWJleHByIiwiLWh0bWwtc2FmZSIsWyJkaXNwbGF5OiBub25lOyJd
LFtdXSxfPXMuc3R5bGU7Xz9zLnN0eWxlPVsic3ViZXhwciIsImNvbmNhdCIsW18sIiAiLHldLFtd
XTpzLnN0eWxlPXl9cmV0dXJuIHN9ZnVuY3Rpb24gYihlLHQsbil7dmFyIGksbyxzPVtdLHU9ci5n
ZXQoZSwiY2xhc3NOYW1lcyIpLGw9ci5nZXQoZSwiY2xhc3NOYW1lQmluZGluZ3MiKTtpZih0LmNs
YXNzJiYoYS5pc1N0cmVhbSh0LmNsYXNzKT9zLnB1c2goWyJzdWJleHByIiwiLW5vcm1hbGl6ZS1j
bGFzcyIsW1sidmFsdWUiLHQuY2xhc3MucGF0aF0sWyJ2YWx1ZSIsdC5jbGFzc11dLFtdXSk6cy5w
dXNoKHQuY2xhc3MpKSx0LmNsYXNzQmluZGluZyYmZyh0LmNsYXNzQmluZGluZy5zcGxpdCgiICIp
LHMsbiksdSlmb3IoaT0wLG89dS5sZW5ndGg7aTxvO2krKylzLnB1c2godVtpXSk7aWYobCYmZyhs
LHMsbiksYi5sZW5ndGgpcmV0dXJuWyJzdWJleHByIiwiLWpvaW4tY2xhc3NlcyIscyxbXV19ZnVu
Y3Rpb24gZyhlLHQscil7dmFyIG4saTtmb3Iobj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl7dmFyIG89
ZVtuXSxhPW8uc3BsaXQoIjoiKSxzPWFbMF0sdT1hWzFdLGw9YVsyXTtpZigiIiE9PXMpe3ZhciBj
PSIiK3Irczt0LnB1c2goWyJzdWJleHByIiwiLW5vcm1hbGl6ZS1jbGFzcyIsW1sidmFsdWUiLHNd
LFsiZ2V0IixjXV0sWyJhY3RpdmVDbGFzcyIsdSwiaW5hY3RpdmVDbGFzcyIsbF1dKX1lbHNlIHQu
cHVzaCh1KX19ZnVuY3Rpb24geShlKXt9ZS5kZWZhdWx0PXMsZS5idWlsZEhUTUxUZW1wbGF0ZT11
fSksZSgiZW1iZXItdmlld3Mvc3lzdGVtL2V2ZW50X2Rpc3BhdGNoZXIiLFsiZXhwb3J0cyIsImVt
YmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItbWV0YWwv
cHJvcGVydHlfc2V0IiwiZW1iZXItbWV0YWwvaXNfbm9uZSIsImVtYmVyLW1ldGFsL3J1bl9sb29w
IiwiZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0IiwiZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVy
eSIsImVtYmVyLXZpZXdzL3N5c3RlbS9hY3Rpb25fbWFuYWdlciIsImVtYmVyLXZpZXdzL3ZpZXdz
L3ZpZXciLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJjb250YWluZXIvb3duZXIiLCJlbWJlci1tZXRh
bC9lbnZpcm9ubWVudCJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvLGEscyx1LGwsYyxmLGQpeyJ1c2Ug
c3RyaWN0Ijt2YXIgcD0iZW1iZXItYXBwbGljYXRpb24iO2UuZGVmYXVsdD1hLmRlZmF1bHQuZXh0
ZW5kKHtldmVudHM6e3RvdWNoc3RhcnQ6InRvdWNoU3RhcnQiLHRvdWNobW92ZToidG91Y2hNb3Zl
Iix0b3VjaGVuZDoidG91Y2hFbmQiLHRvdWNoY2FuY2VsOiJ0b3VjaENhbmNlbCIsa2V5ZG93bjoi
a2V5RG93biIsa2V5dXA6ImtleVVwIixrZXlwcmVzczoia2V5UHJlc3MiLG1vdXNlZG93bjoibW91
c2VEb3duIixtb3VzZXVwOiJtb3VzZVVwIixjb250ZXh0bWVudToiY29udGV4dE1lbnUiLGNsaWNr
OiJjbGljayIsZGJsY2xpY2s6ImRvdWJsZUNsaWNrIixtb3VzZW1vdmU6Im1vdXNlTW92ZSIsZm9j
dXNpbjoiZm9jdXNJbiIsZm9jdXNvdXQ6ImZvY3VzT3V0Iixtb3VzZWVudGVyOiJtb3VzZUVudGVy
Iixtb3VzZWxlYXZlOiJtb3VzZUxlYXZlIixzdWJtaXQ6InN1Ym1pdCIsaW5wdXQ6ImlucHV0Iixj
aGFuZ2U6ImNoYW5nZSIsZHJhZ3N0YXJ0OiJkcmFnU3RhcnQiLGRyYWc6ImRyYWciLGRyYWdlbnRl
cjoiZHJhZ0VudGVyIixkcmFnbGVhdmU6ImRyYWdMZWF2ZSIsZHJhZ292ZXI6ImRyYWdPdmVyIixk
cm9wOiJkcm9wIixkcmFnZW5kOiJkcmFnRW5kIn0scm9vdEVsZW1lbnQ6ImJvZHkiLGNhbkRpc3Bh
dGNoVG9FdmVudE1hbmFnZXI6ITAsaW5pdDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyKCl9LHNldHVw
OmZ1bmN0aW9uKGUsdCl7dmFyIG8sYT10aGlzLl9maW5hbEV2ZW50cz1jLmRlZmF1bHQoe30sci5n
ZXQodGhpcywiZXZlbnRzIiksZSk7aS5kZWZhdWx0KHQpfHxuLnNldCh0aGlzLCJyb290RWxlbWVu
dCIsdCksdD1zLmRlZmF1bHQoci5nZXQodGhpcywicm9vdEVsZW1lbnQiKSksdC5hZGRDbGFzcyhw
KTtmb3IobyBpbiBhKWEuaGFzT3duUHJvcGVydHkobykmJnRoaXMuc2V0dXBIYW5kbGVyKHQsbyxh
W29dKX0sc2V0dXBIYW5kbGVyOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzLGk9Zi5nZXRPd25l
cih0aGlzKSxvPWkmJmkubG9va3VwKCItdmlldy1yZWdpc3RyeTptYWluIil8fGwuZGVmYXVsdC52
aWV3cztudWxsIT09ciYmKGUub24odCsiLmVtYmVyIiwiLmVtYmVyLXZpZXciLGZ1bmN0aW9uKGUs
dCl7dmFyIGk9b1t0aGlzLmlkXSxhPSEwLHM9bi5jYW5EaXNwYXRjaFRvRXZlbnRNYW5hZ2VyP24u
X2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyKGkscik6bnVsbDtyZXR1cm4gcyYmcyE9PXQ/YT1uLl9k
aXNwYXRjaEV2ZW50KHMsZSxyLGkpOmkmJihhPW4uX2J1YmJsZUV2ZW50KGksZSxyKSksYX0pLGUu
b24odCsiLmVtYmVyIiwiW2RhdGEtZW1iZXItYWN0aW9uXSIsZnVuY3Rpb24oZSl7dmFyIHQ9cy5k
ZWZhdWx0KGUuY3VycmVudFRhcmdldCkuYXR0cigiZGF0YS1lbWJlci1hY3Rpb24iKSxuPXUuZGVm
YXVsdC5yZWdpc3RlcmVkQWN0aW9uc1t0XTtpZihuKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxv
O2krKyl7dmFyIGE9bltpXTtpZihhJiZhLmV2ZW50TmFtZT09PXIpcmV0dXJuIGEuaGFuZGxlcihl
KX19KSl9LF9maW5kTmVhcmVzdEV2ZW50TWFuYWdlcjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1u
dWxsO2UmJihuPXIuZ2V0KGUsImV2ZW50TWFuYWdlciIpLCFufHwhblt0XSk7KWU9ci5nZXQoZSwi
cGFyZW50VmlldyIpO3JldHVybiBufSxfZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihlLHQscixuKXt2
YXIgaT0hMCxhPWVbcl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGE/KGk9by5kZWZhdWx0KGUs
YSx0LG4pLHQuc3RvcFByb3BhZ2F0aW9uKCkpOmk9dGhpcy5fYnViYmxlRXZlbnQobix0LHIpLGl9
LF9idWJibGVFdmVudDpmdW5jdGlvbihlLHQscil7cmV0dXJuIGUuaGFuZGxlRXZlbnQocix0KX0s
ZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXIuZ2V0KHRoaXMsInJvb3RFbGVtZW50Iik7cmV0dXJu
IHMuZGVmYXVsdChlKS5vZmYoIi5lbWJlciIsIioqIikucmVtb3ZlQ2xhc3MocCksdGhpcy5fc3Vw
ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiIoRXZl
bnREaXNwYXRjaGVyKSJ9fSl9KSxlKCJlbWJlci12aWV3cy9zeXN0ZW0vZXh0IixbImV4cG9ydHMi
LCJlbWJlci1tZXRhbC9ydW5fbG9vcCJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3QuZGVm
YXVsdC5fYWRkUXVldWUoInJlbmRlciIsImFjdGlvbnMiKSx0LmRlZmF1bHQuX2FkZFF1ZXVlKCJh
ZnRlclJlbmRlciIsInJlbmRlciIpfSksZSgiZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSIsWyJl
eHBvcnRzIiwiZW1iZXItbWV0YWwvY29yZSIsImVtYmVyLW1ldGFsL2Vudmlyb25tZW50Il0sZnVu
Y3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgbztpZihuLmRlZmF1bHQuaGFzRE9NJiYobz10
LmRlZmF1bHQuaW1wb3J0cyYmdC5kZWZhdWx0LmltcG9ydHMualF1ZXJ5fHxpJiZpLmpRdWVyeSxv
fHwiZnVuY3Rpb24iIT10eXBlb2Ygcnx8KG89cigianF1ZXJ5IikpLG8pKXt2YXIgYT1bImRyYWdz
dGFydCIsImRyYWciLCJkcmFnZW50ZXIiLCJkcmFnbGVhdmUiLCJkcmFnb3ZlciIsImRyb3AiLCJk
cmFnZW5kIl07YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe28uZXZlbnQuZml4SG9va3NbZV09e3Byb3Bz
OlsiZGF0YVRyYW5zZmVyIl19fSl9ZS5kZWZhdWx0PW99KSxlKCJlbWJlci12aWV3cy9zeXN0ZW0v
bG9va3VwX3BhcnRpYWwiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2RlYnVnIiwiZW1iZXItbWV0
YWwvZXJyb3IiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0KXtp
ZihudWxsIT10KXt2YXIgcj10LnNwbGl0KCIvIiksbj1yW3IubGVuZ3RoLTFdO3Jbci5sZW5ndGgt
MV09Il8iK247dmFyIG89ci5qb2luKCIvIiksYT1pKGUsbyx0KTtyZXR1cm4gYX19ZnVuY3Rpb24g
aShlLHQsbil7aWYobil7aWYoIWUub3duZXIpdGhyb3cgbmV3IHIuZGVmYXVsdCgiQ29udGFpbmVy
IHdhcyBub3QgZm91bmQgd2hlbiBsb29raW5nIHVwIGEgdmlld3MgdGVtcGxhdGUuIFRoaXMgaXMg
bW9zdCBsaWtlbHkgZHVlIHRvIG1hbnVhbGx5IGluc3RhbnRpYXRpbmcgYW4gRW1iZXIuVmlldy4g
U2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQSIpO3JldHVybiBlLm93bmVyLmxvb2t1cCgidGVtcGxh
dGU6Iit0KXx8ZS5vd25lci5sb29rdXAoInRlbXBsYXRlOiIrbil9fWUuZGVmYXVsdD1ufSksZSgi
ZW1iZXItdmlld3Mvc3lzdGVtL3BsYXRmb3JtIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9lbnZp
cm9ubWVudCJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciByPXQuZGVmYXVsdC5oYXNE
T00mJmZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdD1kb2N1
bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgibmFtZSIs
ImZvbyIpLGUuYXBwZW5kQ2hpbGQodCksISFlLmlubmVySFRNTC5tYXRjaCgiZm9vIil9KCk7ZS5j
YW5TZXROYW1lT25JbnB1dHM9cn0pLGUoImVtYmVyLXZpZXdzL3N5c3RlbS91dGlscyIsWyJleHBv
cnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZS5zaGlm
dEtleXx8ZS5tZXRhS2V5fHxlLmFsdEtleXx8ZS5jdHJsS2V5LHI9ZS53aGljaD4xO3JldHVybiF0
JiYhcn1mdW5jdGlvbiByKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQu
c2V0U3RhcnRCZWZvcmUoZS5fcmVuZGVyTm9kZS5maXJzdE5vZGUpLHQuc2V0RW5kQWZ0ZXIoZS5f
cmVuZGVyTm9kZS5sYXN0Tm9kZSksdH1mdW5jdGlvbiBuKGUpe3ZhciB0PXIoZSk7cmV0dXJuIHQu
Z2V0Q2xpZW50UmVjdHMoKX1mdW5jdGlvbiBpKGUpe3ZhciB0PXIoZSk7cmV0dXJuIHQuZ2V0Qm91
bmRpbmdDbGllbnRSZWN0KCl9ZS5pc1NpbXBsZUNsaWNrPXQsZS5nZXRWaWV3Q2xpZW50UmVjdHM9
bixlLmdldFZpZXdCb3VuZGluZ0NsaWVudFJlY3Q9aX0pLGUoImVtYmVyLXZpZXdzL3ZpZXdzL2No
ZWNrYm94IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQiLCJlbWJlci1tZXRh
bC9wcm9wZXJ0eV9zZXQiLCJlbWJlci12aWV3cy9jb21wb25lbnRzL2NvbXBvbmVudCJdLGZ1bmN0
aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9bi5kZWZhdWx0LmV4dGVuZCh7aW5z
dHJ1bWVudERpc3BsYXk6J3t7aW5wdXQgdHlwZT0iY2hlY2tib3gifX0nLGNsYXNzTmFtZXM6WyJl
bWJlci1jaGVja2JveCJdLHRhZ05hbWU6ImlucHV0IixhdHRyaWJ1dGVCaW5kaW5nczpbInR5cGUi
LCJjaGVja2VkIiwiaW5kZXRlcm1pbmF0ZSIsImRpc2FibGVkIiwidGFiaW5kZXgiLCJuYW1lIiwi
YXV0b2ZvY3VzIiwicmVxdWlyZWQiLCJmb3JtIl0sdHlwZToiY2hlY2tib3giLGNoZWNrZWQ6ITEs
ZGlzYWJsZWQ6ITEsaW5kZXRlcm1pbmF0ZTohMSxkaWRJbnNlcnRFbGVtZW50OmZ1bmN0aW9uKCl7
dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZ2V0KHRoaXMsImVsZW1lbnQiKS5p
bmRldGVybWluYXRlPSEhdC5nZXQodGhpcywiaW5kZXRlcm1pbmF0ZSIpfSxjaGFuZ2U6ZnVuY3Rp
b24oKXtyLnNldCh0aGlzLCJjaGVja2VkIix0aGlzLiQoKS5wcm9wKCJjaGVja2VkIikpfX0pfSks
ZSgiZW1iZXItdmlld3Mvdmlld3MvY29yZV92aWV3IixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9k
ZWJ1ZyIsImVtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCIsImVtYmVyLXJ1bnRpbWUvc3lzdGVtL29i
amVjdCIsImVtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQiLCJlbWJlci1ydW50aW1lL21peGlu
cy9hY3Rpb25faGFuZGxlciIsImVtYmVyLXJ1bnRpbWUvdXRpbHMiLCJlbWJlci1tZXRhbC12aWV3
cyIsImVtYmVyLXZpZXdzL3ZpZXdzL3N0YXRlcyIsImh0bWxiYXJzLXJ1bnRpbWUiLCJyZXF1aXJl
Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUsbCxjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
Zigpe3JldHVybiBoPWh8fGMuZGVmYXVsdCgiZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxw
ZXIiKS5kZWZhdWx0fXZhciBkLHA9bi5kZWZhdWx0LmV4dGVuZChpLmRlZmF1bHQsby5kZWZhdWx0
LHtpc1ZpZXc6ITAsX3N0YXRlczp1LmNsb25lU3RhdGVzKHUuc3RhdGVzKSxpbml0OmZ1bmN0aW9u
KCl7aWYodGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N0YXRlPSJwcmVS
ZW5kZXIiLHRoaXMuX2N1cnJlbnRTdGF0ZT10aGlzLl9zdGF0ZXMucHJlUmVuZGVyLHRoaXMuX2lz
VmlzaWJsZT1yLmdldCh0aGlzLCJpc1Zpc2libGUiKSwhdGhpcy5yZW5kZXJlcil7dmFyIGU9Zigp
O2Q9ZHx8cy5JbnRlcmFjdGl2ZVJlbmRlcmVyLmNyZWF0ZSh7ZG9tOm5ldyBlfSksdGhpcy5yZW5k
ZXJlcj1kfXRoaXMuX2Rlc3Ryb3lpbmdTdWJ0cmVlRm9yVmlldz1udWxsLHRoaXMuX2Rpc3BhdGNo
aW5nPW51bGx9LHBhcmVudFZpZXc6bnVsbCxpbnN0cnVtZW50TmFtZToiY29yZV92aWV3IixpbnN0
cnVtZW50RGV0YWlsczpmdW5jdGlvbihlKXtlLm9iamVjdD10aGlzLnRvU3RyaW5nKCksZS5jb250
YWluZXJLZXk9dGhpcy5fZGVidWdDb250YWluZXJLZXksZS52aWV3PXRoaXN9LHRyaWdnZXI6ZnVu
Y3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRz
WzBdLHQ9dGhpc1tlXTtpZih0KXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJh
eShyLTEpLGk9MTtpPHI7aSsrKW5baS0xXT1hcmd1bWVudHNbaV07cmV0dXJuIHQuYXBwbHkodGhp
cyxuKX19LGhhczpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT09YS50eXBlT2YodGhpc1tl
XSl8fHRoaXMuX3N1cGVyKGUpfSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3VwZXIuYXBw
bHkodGhpcyxhcmd1bWVudHMpKXJldHVybiB0aGlzLl9jdXJyZW50U3RhdGUuY2xlYW51cCh0aGlz
KSwhdGhpcy5vd25lclZpZXcuX2Rlc3Ryb3lpbmdTdWJ0cmVlRm9yVmlldyYmdGhpcy5fcmVuZGVy
Tm9kZSYmbC5pbnRlcm5hbC5jbGVhck1vcnBoKHRoaXMuX3JlbmRlck5vZGUsdGhpcy5vd25lclZp
ZXcuZW52LCEwKSx0aGlzfX0pO28uZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMocCkscC5yZW9w
ZW5DbGFzcyh7aXNWaWV3RmFjdG9yeTohMH0pO3ZhciBoO2UuZGVmYXVsdD1wfSksZSgiZW1iZXIt
dmlld3Mvdmlld3Mvc3RhdGVzIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJl
ci12aWV3cy92aWV3cy9zdGF0ZXMvZGVmYXVsdCIsImVtYmVyLXZpZXdzL3ZpZXdzL3N0YXRlcy9w
cmVfcmVuZGVyIiwiZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2hhc19lbGVtZW50IiwiZW1iZXIt
dmlld3Mvdmlld3Mvc3RhdGVzL2luX2RvbSIsImVtYmVyLXZpZXdzL3ZpZXdzL3N0YXRlcy9kZXN0
cm95aW5nIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMo
ZSl7dmFyIHI9e307ci5fZGVmYXVsdD17fSxyLnByZVJlbmRlcj1PYmplY3QuY3JlYXRlKHIuX2Rl
ZmF1bHQpLHIuZGVzdHJveWluZz1PYmplY3QuY3JlYXRlKHIuX2RlZmF1bHQpLHIuaGFzRWxlbWVu
dD1PYmplY3QuY3JlYXRlKHIuX2RlZmF1bHQpLHIuaW5ET009T2JqZWN0LmNyZWF0ZShyLmhhc0Vs
ZW1lbnQpO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJnQuZGVmYXVsdChyW25d
LGVbbl0pO3JldHVybiByfWUuY2xvbmVTdGF0ZXM9czt2YXIgdT17X2RlZmF1bHQ6ci5kZWZhdWx0
LHByZVJlbmRlcjpuLmRlZmF1bHQsaW5ET006by5kZWZhdWx0LGhhc0VsZW1lbnQ6aS5kZWZhdWx0
LGRlc3Ryb3lpbmc6YS5kZWZhdWx0fTtlLnN0YXRlcz11fSksZSgiZW1iZXItdmlld3Mvdmlld3Mv
c3RhdGVzL2RlZmF1bHQiLFsiZXhwb3J0cyIsImVtYmVyLW1ldGFsL2Vycm9yIiwiZW1iZXItbWV0
YWwvcHJvcGVydHlfZ2V0IiwiZW1iZXItdmlld3MvY29tcGF0L2F0dHJzLXByb3h5Il0sZnVuY3Rp
b24oZSx0LHIsbil7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD17YXBwZW5kQ2hpbGQ6ZnVuY3Rpb24o
KXt0aHJvdyBuZXcgdC5kZWZhdWx0KCJZb3UgY2FuJ3QgdXNlIGFwcGVuZENoaWxkIG91dHNpZGUg
b2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzIil9LCQ6ZnVuY3Rpb24oKXt9LGdldEVsZW1lbnQ6ZnVu
Y3Rpb24oKXtyZXR1cm4gbnVsbH0sbGVnYWN5UHJvcGVydHlEaWRDaGFuZ2U6ZnVuY3Rpb24oZSx0
KXt2YXIgaT1lLmF0dHJzO2lmKGkmJnQgaW4gaSl7dmFyIG89aVt0XTtpZihvJiZvW24uTVVUQUJM
RV9DRUxMXSl7dmFyIGE9ci5nZXQoZSx0KTtpZihhPT09by52YWx1ZSlyZXR1cm47by51cGRhdGUo
YSl9fX0saGFuZGxlRXZlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY2xlYW51cDpmdW5jdGlvbigp
e30sZGVzdHJveUVsZW1lbnQ6ZnVuY3Rpb24oKXt9LHJlcmVuZGVyOmZ1bmN0aW9uKGUpe2UucmVu
ZGVyZXIuZW5zdXJlVmlld05vdFJlbmRlcmluZyhlKX0saW52b2tlT2JzZXJ2ZXI6ZnVuY3Rpb24o
KXt9fX0pLGUoImVtYmVyLXZpZXdzL3ZpZXdzL3N0YXRlcy9kZXN0cm95aW5nIixbImV4cG9ydHMi
LCJlbWJlci1tZXRhbC9hc3NpZ24iLCJlbWJlci12aWV3cy92aWV3cy9zdGF0ZXMvZGVmYXVsdCIs
ImVtYmVyLW1ldGFsL2Vycm9yIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3QiO3ZhciBp
PU9iamVjdC5jcmVhdGUoci5kZWZhdWx0KTt0LmRlZmF1bHQoaSx7YXBwZW5kQ2hpbGQ6ZnVuY3Rp
b24oKXt0aHJvdyBuZXcgbi5kZWZhdWx0KCJZb3UgY2FuJ3QgY2FsbCBhcHBlbmRDaGlsZCBvbiBh
IHZpZXcgYmVpbmcgZGVzdHJveWVkIil9LHJlcmVuZGVyOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IG4u
ZGVmYXVsdCgiWW91IGNhbid0IGNhbGwgcmVyZW5kZXIgb24gYSB2aWV3IGJlaW5nIGRlc3Ryb3ll
ZCIpfSxkZXN0cm95RWxlbWVudDpmdW5jdGlvbigpe3Rocm93IG5ldyBuLmRlZmF1bHQoIllvdSBj
YW4ndCBjYWxsIGRlc3Ryb3lFbGVtZW50IG9uIGEgdmlldyBiZWluZyBkZXN0cm95ZWQiKX19KSxl
LmRlZmF1bHQ9aX0pLGUoImVtYmVyLXZpZXdzL3ZpZXdzL3N0YXRlcy9oYXNfZWxlbWVudCIsWyJl
eHBvcnRzIiwiZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2RlZmF1bHQiLCJlbWJlci1tZXRhbC9h
c3NpZ24iLCJlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5IiwiZW1iZXItbWV0YWwvcnVuX2xvb3Ai
LCJlbWJlci1tZXRhbC9pbnN0cnVtZW50YXRpb24iLCJlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQi
XSxmdW5jdGlvbihlLHQscixuLGksbyxhKXsidXNlIHN0cmljdCI7dmFyIHM9T2JqZWN0LmNyZWF0
ZSh0LmRlZmF1bHQpO3IuZGVmYXVsdChzLHskOmZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5lbGVtZW50
O3JldHVybiB0P24uZGVmYXVsdCh0LHIpOm4uZGVmYXVsdChyKX0sZ2V0RWxlbWVudDpmdW5jdGlv
bihlKXt2YXIgdD1hLmdldChlLCJwYXJlbnRWaWV3Iik7cmV0dXJuIHQmJih0PWEuZ2V0KHQsImVs
ZW1lbnQiKSksdD9lLmZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50KHQpOm4uZGVmYXVsdCgiIyIr
YS5nZXQoZSwiZWxlbWVudElkIikpWzBdfSxyZXJlbmRlcjpmdW5jdGlvbihlKXtlLnJlbmRlcmVy
LmVuc3VyZVZpZXdOb3RSZW5kZXJpbmcoZSksZS5yZW5kZXJlci5yZXJlbmRlcihlKX0sY2xlYW51
cDpmdW5jdGlvbihlKXtlLl9jdXJyZW50U3RhdGUuZGVzdHJveUVsZW1lbnQoZSl9LGRlc3Ryb3lF
bGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbmRlcmVyLnJlbW92ZShlLCExKSxlfSxoYW5k
bGVFdmVudDpmdW5jdGlvbihlLHQscil7cmV0dXJuIWUuaGFzKHQpfHxvLmZsYWdnZWRJbnN0cnVt
ZW50KCJpbnRlcmFjdGlvbi4iK3Qse2V2ZW50OnIsdmlldzplfSxmdW5jdGlvbigpe3JldHVybiBp
LmRlZmF1bHQuam9pbihlLGUudHJpZ2dlcix0LHIpfSl9LGludm9rZU9ic2VydmVyOmZ1bmN0aW9u
KGUsdCl7dC5jYWxsKGUpfX0pLGUuZGVmYXVsdD1zfSksZSgiZW1iZXItdmlld3Mvdmlld3Mvc3Rh
dGVzL2luX2RvbSIsWyJleHBvcnRzIiwiZW1iZXItbWV0YWwvZGVidWciLCJlbWJlci1tZXRhbC9h
c3NpZ24iLCJlbWJlci1tZXRhbC9lcnJvciIsImVtYmVyLW1ldGFsL29ic2VydmVyIiwiZW1iZXIt
dmlld3Mvdmlld3Mvc3RhdGVzL2hhc19lbGVtZW50Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1
c2Ugc3RyaWN0Ijt2YXIgYT1PYmplY3QuY3JlYXRlKG8uZGVmYXVsdCk7ci5kZWZhdWx0KGEse2Vu
dGVyOmZ1bmN0aW9uKGUpeyIiIT09ZS50YWdOYW1lJiZlLl9yZWdpc3RlcigpfSxleGl0OmZ1bmN0
aW9uKGUpe2UuX3VucmVnaXN0ZXIoKX19KSxlLmRlZmF1bHQ9YX0pLGUoImVtYmVyLXZpZXdzL3Zp
ZXdzL3N0YXRlcy9wcmVfcmVuZGVyIixbImV4cG9ydHMiLCJlbWJlci12aWV3cy92aWV3cy9zdGF0
ZXMvZGVmYXVsdCIsImVtYmVyLW1ldGFsL2Fzc2lnbiJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0
cmljdCI7dmFyIG49T2JqZWN0LmNyZWF0ZSh0LmRlZmF1bHQpO3IuZGVmYXVsdChuLHtsZWdhY3lQ
cm9wZXJ0eURpZENoYW5nZTpmdW5jdGlvbihlLHQpe319KSxlLmRlZmF1bHQ9bn0pLGUoImVtYmVy
LXZpZXdzL3ZpZXdzL3RleHRfYXJlYSIsWyJleHBvcnRzIiwiZW1iZXItdmlld3MvY29tcG9uZW50
cy9jb21wb25lbnQiLCJlbWJlci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0Il0sZnVuY3Rpb24o
ZSx0LHIpeyJ1c2Ugc3RyaWN0IjtlLmRlZmF1bHQ9dC5kZWZhdWx0LmV4dGVuZChyLmRlZmF1bHQs
e2luc3RydW1lbnREaXNwbGF5OiJ7e3RleHRhcmVhfX0iLGNsYXNzTmFtZXM6WyJlbWJlci10ZXh0
LWFyZWEiXSx0YWdOYW1lOiJ0ZXh0YXJlYSIsYXR0cmlidXRlQmluZGluZ3M6WyJyb3dzIiwiY29s
cyIsIm5hbWUiLCJzZWxlY3Rpb25FbmQiLCJzZWxlY3Rpb25TdGFydCIsIndyYXAiLCJsYW5nIiwi
ZGlyIiwidmFsdWUiXSxyb3dzOm51bGwsY29sczpudWxsfSl9KSxlKCJlbWJlci12aWV3cy92aWV3
cy90ZXh0X2ZpZWxkIixbImV4cG9ydHMiLCJlbWJlci1tZXRhbC9jb21wdXRlZCIsImVtYmVyLW1l
dGFsL2Vudmlyb25tZW50IiwiZW1iZXItdmlld3MvY29tcG9uZW50cy9jb21wb25lbnQiLCJlbWJl
ci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0IiwiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0Il0s
ZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUpe2lmKGUgaW4g
dSlyZXR1cm4gdVtlXTtpZighci5kZWZhdWx0Lmhhc0RPTSlyZXR1cm4gdVtlXT1lLGU7c3x8KHM9
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSk7dHJ5e3MudHlwZT1lfWNhdGNoKGUpe31y
ZXR1cm4gdVtlXT1zLnR5cGU9PT1lfXZhciBzLHU9bmV3IG8uZGVmYXVsdDtlLmRlZmF1bHQ9bi5k
ZWZhdWx0LmV4dGVuZChpLmRlZmF1bHQse2luc3RydW1lbnREaXNwbGF5Oid7e2lucHV0IHR5cGU9
InRleHQifX0nLGNsYXNzTmFtZXM6WyJlbWJlci10ZXh0LWZpZWxkIl0sdGFnTmFtZToiaW5wdXQi
LGF0dHJpYnV0ZUJpbmRpbmdzOlsiYWNjZXB0IiwiYXV0b2NvbXBsZXRlIiwiYXV0b3NhdmUiLCJk
aXIiLCJmb3JtYWN0aW9uIiwiZm9ybWVuY3R5cGUiLCJmb3JtbWV0aG9kIiwiZm9ybW5vdmFsaWRh
dGUiLCJmb3JtdGFyZ2V0IiwiaGVpZ2h0IiwiaW5wdXRtb2RlIiwibGFuZyIsImxpc3QiLCJtYXgi
LCJtaW4iLCJtdWx0aXBsZSIsIm5hbWUiLCJwYXR0ZXJuIiwic2l6ZSIsInN0ZXAiLCJ0eXBlIiwi
dmFsdWUiLCJ3aWR0aCJdLGRlZmF1bHRMYXlvdXQ6bnVsbCx2YWx1ZToiIix0eXBlOnQuY29tcHV0
ZWQoe2dldDpmdW5jdGlvbigpe3JldHVybiJ0ZXh0In0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9
InRleHQiO3JldHVybiBhKHQpJiYocj10KSxyfX0pLHNpemU6bnVsbCxwYXR0ZXJuOm51bGwsbWlu
Om51bGwsbWF4Om51bGx9KX0pLGUoImVtYmVyLXZpZXdzL3ZpZXdzL3ZpZXciLFsiZXhwb3J0cyIs
ImVtYmVyLXZpZXdzL3N5c3RlbS9leHQiLCJlbWJlci12aWV3cy92aWV3cy9jb3JlX3ZpZXciLCJl
bWJlci12aWV3cy9taXhpbnMvdmlld19jb250ZXh0X3N1cHBvcnQiLCJlbWJlci12aWV3cy9taXhp
bnMvdmlld19jaGlsZF92aWV3c19zdXBwb3J0IiwiZW1iZXItdmlld3MvbWl4aW5zL2xlZ2FjeV9j
aGlsZF92aWV3c19zdXBwb3J0IiwiZW1iZXItdmlld3MvbWl4aW5zL3ZpZXdfc3RhdGVfc3VwcG9y
dCIsImVtYmVyLXZpZXdzL21peGlucy90ZW1wbGF0ZV9yZW5kZXJpbmdfc3VwcG9ydCIsImVtYmVy
LXZpZXdzL21peGlucy9jbGFzc19uYW1lc19zdXBwb3J0IiwiZW1iZXItdmlld3MvbWl4aW5zL2xl
Z2FjeV92aWV3X3N1cHBvcnQiLCJlbWJlci12aWV3cy9taXhpbnMvaW5zdHJ1bWVudGF0aW9uX3N1
cHBvcnQiLCJlbWJlci12aWV3cy9taXhpbnMvYXJpYV9yb2xlX3N1cHBvcnQiLCJlbWJlci12aWV3
cy9taXhpbnMvdmlzaWJpbGl0eV9zdXBwb3J0IiwiZW1iZXItdmlld3MvY29tcGF0L2F0dHJzLXBy
b3h5IiwiZW1iZXItdmlld3MvbWl4aW5zL3ZpZXdfc3VwcG9ydCJdLGZ1bmN0aW9uKGUsdCxyLG4s
aSxvLGEscyx1LGwsYyxmLGQscCxoKXsidXNlIHN0cmljdCI7dmFyIG09ci5kZWZhdWx0LmV4dGVu
ZChuLmRlZmF1bHQsaS5kZWZhdWx0LG8uZGVmYXVsdCxhLmRlZmF1bHQscy5kZWZhdWx0LHUuZGVm
YXVsdCxsLmRlZmF1bHQsYy5kZWZhdWx0LGQuZGVmYXVsdCxwLmRlZmF1bHQsZi5kZWZhdWx0LGgu
ZGVmYXVsdCx7aW5pdDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRz
KSx0aGlzLl92aWV3UmVnaXN0cnl8fCh0aGlzLl92aWV3UmVnaXN0cnk9bS52aWV3cyl9LF9jbGFz
c1N0cmluZ0ZvclByb3BlcnR5OmZ1bmN0aW9uKGUpe3JldHVybiBtLl9jbGFzc1N0cmluZ0ZvclZh
bHVlKGUucGF0aCxlLnN0cmVhbS52YWx1ZSgpLGUuY2xhc3NOYW1lLGUuZmFsc3lDbGFzc05hbWUp
fX0pO20ucmVvcGVuQ2xhc3Moe3ZpZXdzOnt9fSksZS5kZWZhdWx0PW0sZS5WaWV3Q29udGV4dFN1
cHBvcnQ9bi5kZWZhdWx0LGUuVmlld0NoaWxkVmlld3NTdXBwb3J0PWkuZGVmYXVsdCxlLlZpZXdT
dGF0ZVN1cHBvcnQ9YS5kZWZhdWx0LGUuVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0PXMuZGVmYXVs
dCxlLkNsYXNzTmFtZXNTdXBwb3J0PXUuZGVmYXVsdH0pLGUoImVtYmVyL2luZGV4IixbImV4cG9y
dHMiLCJlbWJlci1tZXRhbCIsImVtYmVyLXJ1bnRpbWUiLCJlbWJlci12aWV3cyIsImVtYmVyLXJv
dXRpbmciLCJlbWJlci1hcHBsaWNhdGlvbiIsImVtYmVyLWV4dGVuc2lvbi1zdXBwb3J0IiwiZW1i
ZXItaHRtbGJhcnMiLCJlbWJlci1yb3V0aW5nLWh0bWxiYXJzIiwiZW1iZXItcm91dGluZy12aWV3
cyIsInJlcXVpcmUiLCJlbWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQiXSxmdW5jdGlvbihl
LHQscixuLGksbyxhLHMsdSxsLGMsZil7InVzZSBzdHJpY3QiO2MuaGFzKCJlbWJlci10ZW1wbGF0
ZS1jb21waWxlciIpJiZjLmRlZmF1bHQoImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyIiksYy5oYXMo
ImVtYmVyLXRlc3RpbmciKSYmYy5kZWZhdWx0KCJlbWJlci10ZXN0aW5nIiksZi5ydW5Mb2FkSG9v
a3MoIkVtYmVyIil9KSxlKCJodG1sYmFycy1ydW50aW1lIixbImV4cG9ydHMiLCJodG1sYmFycy1y
dW50aW1lL2hvb2tzIiwiaHRtbGJhcnMtcnVudGltZS9yZW5kZXIiLCJodG1sYmFycy11dGlsL21v
cnBoLXV0aWxzIiwiaHRtbGJhcnMtdXRpbC90ZW1wbGF0ZS11dGlscyJdLGZ1bmN0aW9uKGUsdCxy
LG4saSl7InVzZSBzdHJpY3QiO3ZhciBvPXtibG9ja0ZvcjppLmJsb2NrRm9yLG1hbnVhbEVsZW1l
bnQ6ci5tYW51YWxFbGVtZW50LGhvc3RCbG9jazp0Lmhvc3RCbG9jayxjb250aW51ZUJsb2NrOnQu
Y29udGludWVCbG9jayxob3N0WWllbGRXaXRoU2hhZG93VGVtcGxhdGU6dC5ob3N0WWllbGRXaXRo
U2hhZG93VGVtcGxhdGUsdmlzaXRDaGlsZHJlbjpuLnZpc2l0Q2hpbGRyZW4sdmFsaWRhdGVDaGls
ZE1vcnBoczpuLnZhbGlkYXRlQ2hpbGRNb3JwaHMsY2xlYXJNb3JwaDppLmNsZWFyTW9ycGh9O2Uu
aG9va3M9dC5kZWZhdWx0LGUucmVuZGVyPXIuZGVmYXVsdCxlLmludGVybmFsPW99KSxlKCJodG1s
YmFycy1ydW50aW1lL2V4cHJlc3Npb24tdmlzaXRvciIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7
InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0LHIpe2Zvcih2YXIgaT1bXSxvPTAsYT1lLmxlbmd0
aDtvPGE7bysrKWkucHVzaChuKGVbb10sdCxyKS52YWx1ZSk7cmV0dXJuIGl9ZnVuY3Rpb24gcihl
LHQscil7Zm9yKHZhciBpPXt9LG89MCxhPWUubGVuZ3RoO288YTtvKz0yKXt2YXIgcz1lW29dLHU9
ZVtvKzFdO2lbc109bih1LHQscikudmFsdWV9cmV0dXJuIGl9ZnVuY3Rpb24gbihlLHQscil7dmFy
IG49e3ZhbHVlOm51bGx9O3JldHVybiJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/bi52YWx1
ZT1lOm4udmFsdWU9aShlLHQsciksbn1mdW5jdGlvbiBpKGUsdCxyKXtzd2l0Y2goZVswXSl7Y2Fz
ZSJ2YWx1ZSI6cmV0dXJuIGVbMV07Y2FzZSJnZXQiOnJldHVybiBvKGUsdCxyKTtjYXNlInN1YmV4
cHIiOnJldHVybiBhKGUsdCxyKTtjYXNlImNvbmNhdCI6cmV0dXJuIHMoZSx0LHIpfX1mdW5jdGlv
biBvKGUsdCxyKXt2YXIgbj1lWzFdO3JldHVybiB0Lmhvb2tzLmdldCh0LHIsbil9ZnVuY3Rpb24g
YShlLG4saSl7dmFyIG89ZVsxXSxhPWVbMl0scz1lWzNdLHU9dChhLG4saSksbD1yKHMsbixpKTty
ZXR1cm4gbi5ob29rcy5zdWJleHByKG4saSxvLHUsbCl9ZnVuY3Rpb24gcyhlLHIsbil7dmFyIGk9
ZVsxXSxvPXQoaSxyLG4pO3JldHVybiByLmhvb2tzLmNvbmNhdChyLG8pfWUuYWNjZXB0UGFyYW1z
PXQsZS5hY2NlcHRIYXNoPXJ9KSxlKCJodG1sYmFycy1ydW50aW1lL2hvb2tzIixbImV4cG9ydHMi
LCJodG1sYmFycy1ydW50aW1lL3JlbmRlciIsIm1vcnBoLXJhbmdlL21vcnBoLWxpc3QiLCJodG1s
YmFycy11dGlsL29iamVjdC11dGlscyIsImh0bWxiYXJzLXV0aWwvbW9ycGgtdXRpbHMiLCJodG1s
YmFycy11dGlsL3RlbXBsYXRlLXV0aWxzIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8peyJ1c2Ugc3Ry
aWN0IjtmdW5jdGlvbiBhKGUpe3JldHVybiBudWxsPT09ZT9udWxsOnttZXRhOmUubWV0YSxhcml0
eTplLmFyaXR5LHJhdzplLHJlbmRlcjpmdW5jdGlvbihyLG4saSxvKXt2YXIgYT1uLmhvb2tzLmNy
ZWF0ZUZyZXNoU2NvcGUoKSxzPWkmJmkuY29udGV4dHVhbEVsZW1lbnQsdT1uZXcgdC5SZW5kZXJP
cHRpb25zKG51bGwscixvLHMpO3JldHVybiB0LmRlZmF1bHQoZSxuLGEsdSl9fX1mdW5jdGlvbiBz
KGUsdCxyLG4saSxvKXtpZighZSlyZXR1cm57fTt2YXIgYT11KGUsdCxyLG4saSxvKTtyZXR1cm57
bWV0YTplLm1ldGEsYXJpdHk6ZS5hcml0eSx5aWVsZDphLHlpZWxkSXRlbTpsKGUsdCxyLG4saSxv
KSxyYXc6ZSxyZW5kZXI6ZnVuY3Rpb24oZSx0KXthKHQsZSl9fX1mdW5jdGlvbiB1KGUscixuLGks
YSxzKXtyZXR1cm4gZnVuY3Rpb24odSxsKXthLm1vcnBoVG9DbGVhcj1udWxsLGkubW9ycGhMaXN0
JiYoby5jbGVhck1vcnBoTGlzdChpLm1vcnBoTGlzdCxpLHIpLGEubW9ycGhMaXN0VG9DbGVhcj1u
dWxsKTt2YXIgZj1uO2lmKGkubGFzdFlpZWxkZWQmJmMoZSxpLmxhc3RZaWVsZGVkKSlyZXR1cm4g
aS5sYXN0UmVzdWx0LnJldmFsaWRhdGVXaXRoKHIsdm9pZCAwLGwsdSxzKTsodm9pZCAwIT09bHx8
bnVsbD09PW58fGUuYXJpdHkpJiYoZj1yLmhvb2tzLmNyZWF0ZUNoaWxkU2NvcGUobikpLGkubGFz
dFlpZWxkZWQ9e3NlbGY6bCx0ZW1wbGF0ZTplLHNoYWRvd1RlbXBsYXRlOm51bGx9O3ZhciBkPW5l
dyB0LlJlbmRlck9wdGlvbnMoaSxsLHUpO3QuZGVmYXVsdChlLHIsZixkKX19ZnVuY3Rpb24gbChl
LG4saSxvLGEscyl7ZnVuY3Rpb24gbChlKXtmb3IodmFyIHQ9Yzt0LmtleSE9PWU7KWZbdC5rZXld
PXQsdD10Lm5leHRNb3JwaDtyZXR1cm4gYz10Lm5leHRNb3JwaCx0fXZhciBjPW51bGwsZj17fSxk
PW8ubW9ycGhMaXN0O3JldHVybiBkJiYoYz1kLmZpcnN0Q2hpbGRNb3JwaCksZnVuY3Rpb24oZCxw
LGgpe2lmKCJzdHJpbmciIT10eXBlb2YgZCl0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IHByb3Zp
ZGUgYSBzdHJpbmcga2V5IHdoZW4gY2FsbGluZyBgeWllbGRJdGVtYDsgeW91IHByb3ZpZGVkICIr
ZCk7YS5tb3JwaExpc3RUb0NsZWFyPW51bGwsby5sYXN0WWllbGRlZD1udWxsO3ZhciBtLHY7by5t
b3JwaExpc3R8fChvLm1vcnBoTGlzdD1uZXcgci5kZWZhdWx0LG8ubW9ycGhNYXA9e30sby5zZXRN
b3JwaExpc3Qoby5tb3JwaExpc3QpKSxtPW8ubW9ycGhMaXN0LHY9by5tb3JwaE1hcDt2YXIgYj1h
LmhhbmRsZWRNb3JwaHMsZz12b2lkIDA7aWYoZCBpbiBiKXt2YXIgeT1hLmNvbGxpc2lvbnM7dm9p
ZCAwPT09eSYmKHk9YS5jb2xsaXNpb25zPXt9KTt2YXIgXz0wfHlbZF07eVtkXT0rK18sZz1kKyIt
LXo4bVMyaHZEVzBBLS0iK199ZWxzZSBnPWQ7aWYoYyYmYy5rZXk9PT1nKXUoZSxuLGksYyxhLHMp
KHAsaCksYz1jLm5leHRNb3JwaCxiW2ddPWM7ZWxzZSBpZih2b2lkIDAhPT12W2ddKXt2YXIgdz12
W2ddO2cgaW4gZj9tLmluc2VydEJlZm9yZU1vcnBoKHcsYyk6bChnKSxiW3cua2V5XT13LHUoZSxu
LGksdyxhLHMpKHAsaCl9ZWxzZXt2YXIgeD10LmNyZWF0ZUNoaWxkTW9ycGgobi5kb20sbyk7eC5r
ZXk9Zyx2W2ddPWJbZ109eCxtLmluc2VydEJlZm9yZU1vcnBoKHgsYyksdShlLG4saSx4LGEscyko
cCxoKX1hLm1vcnBoTGlzdFRvUHJ1bmU9bSxvLmNoaWxkTm9kZXM9bnVsbH19ZnVuY3Rpb24gYyhl
LHQpe3JldHVybiF0LnNoYWRvd1RlbXBsYXRlJiZlPT09dC50ZW1wbGF0ZX1mdW5jdGlvbiBmKGUs
dCxyLG4saSxhKXt2YXIgdT1pLmxhc3RSZXN1bHQ/aTpudWxsLGw9bmV3IG8uUmVuZGVyU3RhdGUo
dSxpLm1vcnBoTGlzdHx8bnVsbCk7cmV0dXJue3RlbXBsYXRlczp7dGVtcGxhdGU6cyhlLHIsbixp
LGwsYSksaW52ZXJzZTpzKHQscixuLGksbCxhKX0scmVuZGVyU3RhdGU6bH19ZnVuY3Rpb24gZChl
KXtyZXR1cm57YXJpdHk6ZS50ZW1wbGF0ZS5hcml0eSx5aWVsZDplLnRlbXBsYXRlLnlpZWxkLHlp
ZWxkSXRlbTplLnRlbXBsYXRlLnlpZWxkSXRlbSx5aWVsZEluOmUudGVtcGxhdGUueWllbGRJbn19
ZnVuY3Rpb24gcChlLHQpe3JldHVybiB0P2UuaG9va3MuY3JlYXRlQ2hpbGRTY29wZSh0KTplLmhv
b2tzLmNyZWF0ZUZyZXNoU2NvcGUoKX1mdW5jdGlvbiBoKCl7cmV0dXJue3NlbGY6bnVsbCxibG9j
a3M6e30sbG9jYWxzOnt9LGxvY2FsUHJlc2VudDp7fX19ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5o
b29rcy5jcmVhdGVGcmVzaFNjb3BlKCl9ZnVuY3Rpb24gdihlKXt2YXIgdD1PYmplY3QuY3JlYXRl
KGUpO3JldHVybiB0LmxvY2Fscz1PYmplY3QuY3JlYXRlKGUubG9jYWxzKSx0LmxvY2FsUHJlc2Vu
dD1PYmplY3QuY3JlYXRlKGUubG9jYWxQcmVzZW50KSx0LmJsb2Nrcz1PYmplY3QuY3JlYXRlKGUu
YmxvY2tzKSx0fWZ1bmN0aW9uIGIoZSx0LHIpe3Quc2VsZj1yfWZ1bmN0aW9uIGcoZSx0LHIpe2Uu
aG9va3MuYmluZFNlbGYoZSx0LHIpfWZ1bmN0aW9uIHkoZSx0LHIsbil7dC5sb2NhbFByZXNlbnRb
cl09ITAsdC5sb2NhbHNbcl09bn1mdW5jdGlvbiBfKGUsdCxyLG4pe2UuaG9va3MuYmluZExvY2Fs
KGUsdCxyLG4pfWZ1bmN0aW9uIHcoZSx0LHIpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8PTN8fHZv
aWQgMD09PWFyZ3VtZW50c1szXT8iZGVmYXVsdCI6YXJndW1lbnRzWzNdO3QuYmxvY2tzW25dPXJ9
ZnVuY3Rpb24geChlLHQscixuLGksbyxhLHMsdSl7RShlLHQscixuLGksbyxhLHMsdSl8fGsoZSx0
LHIsbixpLG8sYSxzLHUpfWZ1bmN0aW9uIGsoZSx0LHIsbixpLG8sYSxzLHUpe0MoZSx0LHIsYSxz
LG51bGwsdSxmdW5jdGlvbihhKXt2YXIgcz10Lmhvb2tzLmxvb2t1cEhlbHBlcih0LHIsbik7cmV0
dXJuIHQuaG9va3MuaW52b2tlSGVscGVyKGUsdCxyLHUsaSxvLHMsYS50ZW1wbGF0ZXMsZChhLnRl
bXBsYXRlcykpfSl9ZnVuY3Rpb24gQyhlLHQscixuLGksYSxzLHUpe3ZhciBsPWYobixpLHQscixl
LHMpO28ucmVuZGVyQW5kQ2xlYW51cChlLHQsbCxhLHUpfWZ1bmN0aW9uIEUoZSx0LHIsbixpLG8s
YSxzLHUpe2lmKCFuKXJldHVybiExO3ZhciBsPXQuaG9va3MuY2xhc3NpZnkodCxyLG4pO2lmKGwp
e3N3aXRjaChsKXtjYXNlImNvbXBvbmVudCI6dC5ob29rcy5jb21wb25lbnQoZSx0LHIsbixpLG8s
e2RlZmF1bHQ6YSxpbnZlcnNlOnN9LHUpO2JyZWFrO2Nhc2UiaW5saW5lIjp0Lmhvb2tzLmlubGlu
ZShlLHQscixuLGksbyx1KTticmVhaztjYXNlImJsb2NrIjp0Lmhvb2tzLmJsb2NrKGUsdCxyLG4s
aSxvLGEscyx1KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgSFRNTEJh
cnMgcmVkaXJlY3Rpb24gdG8gIitsKyIgbm90IHN1cHBvcnRlZCIpfXJldHVybiEwfXJldHVybiEh
TyhuLGUsdCxyLGksbyxhLHMsdSl9ZnVuY3Rpb24gTyhlLHQscixhLHMsdSxsLGMsZil7dmFyIGQ9
ci5ob29rcy5rZXl3b3Jkc1tlXTtpZighZClyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2Yg
ZClyZXR1cm4gZCh0LHIsYSxzLHUsbCxjLGYpO2Qud2lsbFJlbmRlciYmZC53aWxsUmVuZGVyKHQs
cik7dmFyIHAsaDtkLnNldHVwU3RhdGUmJihwPW4uc2hhbGxvd0NvcHkodC5nZXRTdGF0ZSgpKSxo
PXQuc2V0U3RhdGUoZC5zZXR1cFN0YXRlKHAscixhLHMsdSkpKSxkLmNoaWxkRW52JiYocj1kLmNo
aWxkRW52KHQuZ2V0U3RhdGUoKSxyKSx0LmJ1aWxkQ2hpbGRFbnY9ZC5jaGlsZEVudik7dmFyIG09
IXQucmVuZGVyZWQ7aWYoZC5pc0VtcHR5KXt2YXIgdj1kLmlzRW1wdHkodC5nZXRTdGF0ZSgpLHIs
YSxzLHUpO2lmKHYpcmV0dXJuIG18fG8uY2xlYXJNb3JwaCh0LHIsITEpLCEwfWlmKG0pcmV0dXJu
IGQucmVuZGVyJiZkLnJlbmRlcih0LHIsYSxzLHUsbCxjLGYpLHQucmVuZGVyZWQ9ITAsITA7dmFy
IGI7aWYoYj1kLmlzU3RhYmxlP2QuaXNTdGFibGUocCxoKTpUKHAsaCkpe2lmKGQucmVyZW5kZXIp
e3ZhciBnPWQucmVyZW5kZXIodCxyLGEscyx1LGwsYyxmKTtyPWd8fHJ9cmV0dXJuIGkudmFsaWRh
dGVDaGlsZE1vcnBocyhyLHQsZiksITB9cmV0dXJuIG8uY2xlYXJNb3JwaCh0LHIsITEpLGQucmVu
ZGVyPyhkLnJlbmRlcih0LHIsYSxzLHUsbCxjLGYpLHQucmVuZGVyZWQ9ITAsITApOnZvaWQgMH1m
dW5jdGlvbiBUKGUsdCl7aWYobi5rZXlMZW5ndGgoZSkhPT1uLmtleUxlbmd0aCh0KSlyZXR1cm4h
MTtmb3IodmFyIHIgaW4gZSlpZihlW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlv
biBOKCl7fWZ1bmN0aW9uIFMoZSx0LHIsbixvLGEscyl7aWYoIUUoZSx0LHIsbixvLGEsbnVsbCxu
dWxsLHMpKXt2YXIgdT12b2lkIDAsbD12b2lkIDA7aWYoZS5saW5rZWRSZXN1bHQpdT10Lmhvb2tz
LmdldFZhbHVlKGUubGlua2VkUmVzdWx0KSxsPSEwO2Vsc2V7dmFyIGM9ZihudWxsLG51bGwsdCxy
LGUpLHA9dC5ob29rcy5sb29rdXBIZWxwZXIodCxyLG4pLGg9dC5ob29rcy5pbnZva2VIZWxwZXIo
ZSx0LHIscyxvLGEscCxjLnRlbXBsYXRlcyxkKGMudGVtcGxhdGVzKSk7aCYmaC5saW5rJiYoZS5s
aW5rZWRSZXN1bHQ9aC52YWx1ZSxpLmxpbmtQYXJhbXModCxyLGUsIkBjb250ZW50LWhlbHBlciIs
W2UubGlua2VkUmVzdWx0XSxudWxsKSksaCYmInZhbHVlImluIGgmJih1PXQuaG9va3MuZ2V0VmFs
dWUoaC52YWx1ZSksbD0hMCl9bCYmKGUubGFzdFZhbHVlIT09dSYmZS5zZXRDb250ZW50KHUpLGUu
bGFzdFZhbHVlPXUpfX1mdW5jdGlvbiBBKGUsdCxyLG4saSxvLGEscyx1KXtPKGUsdCxyLG4saSxv
LGEscyx1KX1mdW5jdGlvbiBQKGUsdCxyLG4saSxvLGEscyx1KXt2YXIgbD1qKHQsaSksYz1SKHQs
byk7cmV0dXJue3ZhbHVlOmEuY2FsbCh1LGwsYyxzKX19ZnVuY3Rpb24gaihlLHQpe2Zvcih2YXIg
cj1uZXcgQXJyYXkodC5sZW5ndGgpLG49MCxpPXQubGVuZ3RoO248aTtuKyspcltuXT1lLmhvb2tz
LmdldENlbGxPclZhbHVlKHRbbl0pO3JldHVybiByfWZ1bmN0aW9uIFIoZSx0KXt2YXIgcj17fTtm
b3IodmFyIG4gaW4gdClyW25dPWUuaG9va3MuZ2V0Q2VsbE9yVmFsdWUodFtuXSk7cmV0dXJuIHJ9
ZnVuY3Rpb24gTCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIEQoZSx0LHIsbil7dmFyIGk9dC5wYXJ0
aWFsc1tuXTtyZXR1cm4gaS5yZW5kZXIoci5zZWxmLHQse30pLmZyYWdtZW50fWZ1bmN0aW9uIE0o
ZSx0LHIsbixpLG8pe0UoZSx0LHIsbixbXSx7fSxudWxsLG51bGwsbyl8fChpPXQuaG9va3MuZ2V0
VmFsdWUoaSksZS5sYXN0VmFsdWUhPT1pJiZlLnNldENvbnRlbnQoaSksZS5sYXN0VmFsdWU9aSl9
ZnVuY3Rpb24gSShlLHQscixuLGksbyxhKXtpZighRShlLHQscixuLGksbyxudWxsLG51bGwsYSkp
e3ZhciBzPXQuaG9va3MubG9va3VwSGVscGVyKHQscixuKTtzJiZ0Lmhvb2tzLmludm9rZUhlbHBl
cihudWxsLHQscixudWxsLGksbyxzLHtlbGVtZW50OmUuZWxlbWVudH0pfX1mdW5jdGlvbiBGKGUs
dCxyLG4saSl7aT10Lmhvb2tzLmdldFZhbHVlKGkpLGUubGFzdFZhbHVlIT09aSYmZS5zZXRDb250
ZW50KGkpLGUubGFzdFZhbHVlPWl9ZnVuY3Rpb24gSChlLHQscixuLGkpe3ZhciBvPWUuaG9va3Mu
bG9va3VwSGVscGVyKGUsdCxyKSxhPWUuaG9va3MuaW52b2tlSGVscGVyKG51bGwsZSx0LG51bGws
bixpLG8se30pO2lmKGEmJiJ2YWx1ZSJpbiBhKXJldHVybiBlLmhvb2tzLmdldFZhbHVlKGEudmFs
dWUpfWZ1bmN0aW9uIFYoZSx0LHIpe2lmKCIiPT09cilyZXR1cm4gdC5zZWxmO2Zvcih2YXIgbj1y
LnNwbGl0KCIuIiksaT1lLmhvb2tzLmdldFJvb3QodCxuWzBdKVswXSxvPTE7bzxuLmxlbmd0aCYm
aTtvKyspaT1lLmhvb2tzLmdldENoaWxkKGksbltvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gcShlLHQp
e3JldHVybiBlLmxvY2FsUHJlc2VudFt0XT9bZS5sb2NhbHNbdF1dOmUuc2VsZj9bZS5zZWxmW3Rd
XTpbdm9pZCAwXX1mdW5jdGlvbiB6KGUsdCl7cmV0dXJuIGUuYmxvY2tzW3RdfWZ1bmN0aW9uIEIo
ZSx0KXtyZXR1cm4gZVt0XX1mdW5jdGlvbiBVKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7cmV0
dXJuIGV9ZnVuY3Rpb24gJChlLHQscixuLGksbyxhLHMpe3JldHVybiB0Lmhvb2tzLmhhc0hlbHBl
cih0LHIsbik/dC5ob29rcy5ibG9jayhlLHQscixuLGksbyxhLmRlZmF1bHQsYS5pbnZlcnNlLHMp
OnZvaWQgUShlLHQscixuLG8sYS5kZWZhdWx0KX1mdW5jdGlvbiBLKGUsdCl7Zm9yKHZhciByPSIi
LG49MCxpPXQubGVuZ3RoO248aTtuKyspcis9ZS5ob29rcy5nZXRWYWx1ZSh0W25dKTtyZXR1cm4g
cn1mdW5jdGlvbiBRKGUscixuLGksbyxhKXt2YXIgcz1yLmRvbS5jcmVhdGVFbGVtZW50KGkpO2Zv
cih2YXIgdSBpbiBvKXMuc2V0QXR0cmlidXRlKHUsci5ob29rcy5nZXRWYWx1ZShvW3VdKSk7dmFy
IGw9dC5kZWZhdWx0KGEscixuLHt9KS5mcmFnbWVudDtzLmFwcGVuZENoaWxkKGwpLGUuc2V0Tm9k
ZShzKX1mdW5jdGlvbiBHKGUsdCxyKXtyZXR1cm4gdm9pZCAwIT09ZS5oZWxwZXJzW3JdfWZ1bmN0
aW9uIFkoZSx0LHIpe3JldHVybiBlLmhlbHBlcnNbcl19ZnVuY3Rpb24gWCgpe31mdW5jdGlvbiBK
KGUsdCl7ZS5ob29rcy5iaW5kU2NvcGUoZSx0KX1lLndyYXA9YSxlLndyYXBGb3JIZWxwZXI9cyxl
LmNyZWF0ZVNjb3BlPXAsZS5jcmVhdGVGcmVzaFNjb3BlPWgsZS5iaW5kU2hhZG93U2NvcGU9bSxl
LmNyZWF0ZUNoaWxkU2NvcGU9dixlLmJpbmRTZWxmPWIsZS51cGRhdGVTZWxmPWcsZS5iaW5kTG9j
YWw9eSxlLnVwZGF0ZUxvY2FsPV8sZS5iaW5kQmxvY2s9dyxlLmJsb2NrPXgsZS5jb250aW51ZUJs
b2NrPWssZS5ob3N0QmxvY2s9QyxlLmhhbmRsZVJlZGlyZWN0PUUsZS5oYW5kbGVLZXl3b3JkPU8s
ZS5saW5rUmVuZGVyTm9kZT1OLGUuaW5saW5lPVMsZS5rZXl3b3JkPUEsZS5pbnZva2VIZWxwZXI9
UCxlLmNsYXNzaWZ5PUwsZS5wYXJ0aWFsPUQsZS5yYW5nZT1NLGUuZWxlbWVudD1JLGUuYXR0cmli
dXRlPUYsZS5zdWJleHByPUgsZS5nZXQ9VixlLmdldFJvb3Q9cSxlLmdldEJsb2NrPXosZS5nZXRD
aGlsZD1CLGUuZ2V0VmFsdWU9VSxlLmdldENlbGxPclZhbHVlPVcsZS5jb21wb25lbnQ9JCxlLmNv
bmNhdD1LLGUuaGFzSGVscGVyPUcsZS5sb29rdXBIZWxwZXI9WSxlLmJpbmRTY29wZT1YLGUudXBk
YXRlU2NvcGU9Sjt2YXIgWj17cGFydGlhbDpmdW5jdGlvbihlLHQscixuKXt2YXIgaT10Lmhvb2tz
LnBhcnRpYWwoZSx0LHIsblswXSk7cmV0dXJuIGUuc2V0Q29udGVudChpKSwhMH0seWllbGQ6ZnVu
Y3Rpb24oZSx0LHIsbixpLG8sYSxzKXt2YXIgdT10Lmhvb2tzLmdldFZhbHVlKGkudG8pfHwiZGVm
YXVsdCIsbD10Lmhvb2tzLmdldEJsb2NrKHIsdSk7cmV0dXJuIGwmJmwuaW52b2tlKHQsbixpLnNl
bGYsZSxyLHMpLCEwfSxoYXNCbG9jazpmdW5jdGlvbihlLHQscixuKXt2YXIgaT10Lmhvb2tzLmdl
dFZhbHVlKG5bMF0pfHwiZGVmYXVsdCI7cmV0dXJuISF0Lmhvb2tzLmdldEJsb2NrKHIsaSl9LGhh
c0Jsb2NrUGFyYW1zOmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpPXQuaG9va3MuZ2V0VmFsdWUoblsw
XSl8fCJkZWZhdWx0IixvPXQuaG9va3MuZ2V0QmxvY2socixpKTtyZXR1cm4hKCFvfHwhby5hcml0
eSl9fTtlLmtleXdvcmRzPVosZS5kZWZhdWx0PXtiaW5kTG9jYWw6eSxiaW5kU2VsZjpiLGJpbmRT
Y29wZTpYLGNsYXNzaWZ5OkwsY29tcG9uZW50OiQsY29uY2F0OkssY3JlYXRlRnJlc2hTY29wZTpo
LGdldENoaWxkOkIsZ2V0Um9vdDpxLGdldEJsb2NrOnosZ2V0VmFsdWU6VSxnZXRDZWxsT3JWYWx1
ZTpXLGtleXdvcmRzOlosbGlua1JlbmRlck5vZGU6TixwYXJ0aWFsOkQsc3ViZXhwcjpILGJpbmRC
bG9jazp3LGJpbmRTaGFkb3dTY29wZTptLHVwZGF0ZUxvY2FsOl8sdXBkYXRlU2VsZjpnLHVwZGF0
ZVNjb3BlOkosY3JlYXRlQ2hpbGRTY29wZTp2LGhhc0hlbHBlcjpHLGxvb2t1cEhlbHBlcjpZLGlu
dm9rZUhlbHBlcjpQLGNsZWFudXBSZW5kZXJOb2RlOm51bGwsZGVzdHJveVJlbmRlck5vZGU6bnVs
bCx3aWxsQ2xlYW51cFRyZWU6bnVsbCxkaWRDbGVhbnVwVHJlZTpudWxsLHdpbGxSZW5kZXJOb2Rl
Om51bGwsZGlkUmVuZGVyTm9kZTpudWxsLGF0dHJpYnV0ZTpGLGJsb2NrOngsY3JlYXRlU2NvcGU6
cCxlbGVtZW50OkksZ2V0OlYsaW5saW5lOlMscmFuZ2U6TSxrZXl3b3JkOkF9fSksZSgiaHRtbGJh
cnMtcnVudGltZS9tb3JwaCIsWyJleHBvcnRzIiwibW9ycGgtcmFuZ2UiXSxmdW5jdGlvbihlLHQp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dGhpcy5zdXBlciRjb25zdHJ1Y3RvcihlLHQp
LHRoaXMuX3N0YXRlPXZvaWQgMCx0aGlzLm93bmVyTm9kZT1udWxsLHRoaXMuaXNEaXJ0eT0hMSx0
aGlzLmlzU3VidHJlZURpcnR5PSExLHRoaXMubGFzdFlpZWxkZWQ9bnVsbCx0aGlzLmxhc3RSZXN1
bHQ9bnVsbCx0aGlzLmxhc3RWYWx1ZT1udWxsLAordGhpcy5idWlsZENoaWxkRW52PW51bGwsdGhp
cy5tb3JwaExpc3Q9bnVsbCx0aGlzLm1vcnBoTWFwPW51bGwsdGhpcy5rZXk9bnVsbCx0aGlzLmxp
bmtlZFBhcmFtcz1udWxsLHRoaXMubGlua2VkUmVzdWx0PW51bGwsdGhpcy5jaGlsZE5vZGVzPW51
bGwsdGhpcy5yZW5kZXJlZD0hMSx0aGlzLmd1aWQ9InJhbmdlIituKyssdGhpcy5zZWVuPSExfXZh
ciBuPTE7ci5lbXB0eT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyByKGUsdCk7cmV0dXJuIG4uY2xl
YXIoKSxufSxyLmNyZWF0ZT1mdW5jdGlvbihlLHQsbil7dmFyIGk9bmV3IHIoZSx0KTtyZXR1cm4g
aS5zZXROb2RlKG4pLGl9LHIuYXR0YWNoPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvPW5ldyByKGUs
dCk7cmV0dXJuIG8uc2V0UmFuZ2UobixpKSxvfTt2YXIgaT1yLnByb3RvdHlwZT1PYmplY3QuY3Jl
YXRlKHQuZGVmYXVsdC5wcm90b3R5cGUpO2kuY29uc3RydWN0b3I9cixpLnN1cGVyJGNvbnN0cnVj
dG9yPXQuZGVmYXVsdCxpLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXRlfHwo
dGhpcy5fc3RhdGU9e30pLHRoaXMuX3N0YXRlfSxpLnNldFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVy
biB0aGlzLl9zdGF0ZT1lfSxlLmRlZmF1bHQ9cn0pLGUoImh0bWxiYXJzLXJ1bnRpbWUvbm9kZS12
aXNpdG9yIixbImV4cG9ydHMiLCJodG1sYmFycy11dGlsL21vcnBoLXV0aWxzIiwiaHRtbGJhcnMt
cnVudGltZS9leHByZXNzaW9uLXZpc2l0b3IiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3Qi
O2Z1bmN0aW9uIG4oZSxuLGksbyxhLHMpe3JldHVybiBpLmxpbmtlZFBhcmFtcz8oYT1pLmxpbmtl
ZFBhcmFtcy5wYXJhbXMscz1pLmxpbmtlZFBhcmFtcy5oYXNoKTooYT1hJiZyLmFjY2VwdFBhcmFt
cyhhLGUsbikscz1zJiZyLmFjY2VwdEhhc2gocyxlLG4pKSx0LmxpbmtQYXJhbXMoZSxuLGksbyxh
LHMpLFthLHNdfWZ1bmN0aW9uIGkoZSxyLG4saSl7dmFyIG89ci5pc0RpcnR5LHM9ci5pc1N1YnRy
ZWVEaXJ0eSx1PWU7cyYmKG49YSksb3x8cz9pKG4pOihyLmJ1aWxkQ2hpbGRFbnYmJih1PXIuYnVp
bGRDaGlsZEVudihyLmdldFN0YXRlKCksdSkpLHQudmFsaWRhdGVDaGlsZE1vcnBocyh1LHIsbikp
fWZ1bmN0aW9uIG8oZSx0LHIpe3JldHVybiB2b2lkIDAhPT1lLmhvb2tzLmtleXdvcmRzW3JdfHxl
Lmhvb2tzLmhhc0hlbHBlcihlLHQscil9dmFyIGE9e2Jsb2NrOmZ1bmN0aW9uKGUsdCxyLGksbyxh
KXt2YXIgcz1lWzFdLHU9ZVsyXSxsPWVbM10sYz1lWzRdLGY9ZVs1XSxkPW4ocixpLHQscyx1LGwp
O3QuaXNEaXJ0eT10LmlzU3VidHJlZURpcnR5PSExLHIuaG9va3MuYmxvY2sodCxyLGkscyxkWzBd
LGRbMV0sbnVsbD09PWM/bnVsbDpvLnRlbXBsYXRlc1tjXSxudWxsPT09Zj9udWxsOm8udGVtcGxh
dGVzW2ZdLGEpfSxpbmxpbmU6ZnVuY3Rpb24oZSx0LHIsaSxvKXt2YXIgYT1lWzFdLHM9ZVsyXSx1
PWVbM10sbD1uKHIsaSx0LGEscyx1KTt0LmlzRGlydHk9dC5pc1N1YnRyZWVEaXJ0eT0hMSxyLmhv
b2tzLmlubGluZSh0LHIsaSxhLGxbMF0sbFsxXSxvKX0sY29udGVudDpmdW5jdGlvbihlLHIsbixp
LGEpe3ZhciBzPWVbMV07aWYoci5pc0RpcnR5PXIuaXNTdWJ0cmVlRGlydHk9ITEsbyhuLGkscykp
cmV0dXJuIG4uaG9va3MuaW5saW5lKHIsbixpLHMsW10se30sYSksdm9pZChyLmxpbmtlZFJlc3Vs
dCYmdC5saW5rUGFyYW1zKG4saSxyLCJAY29udGVudC1oZWxwZXIiLFtyLmxpbmtlZFJlc3VsdF0s
bnVsbCkpO3ZhciB1PXZvaWQgMDt1PXIubGlua2VkUGFyYW1zP3IubGlua2VkUGFyYW1zLnBhcmFt
czpbbi5ob29rcy5nZXQobixpLHMpXSx0LmxpbmtQYXJhbXMobixpLHIsIkByYW5nZSIsdSxudWxs
KSxuLmhvb2tzLnJhbmdlKHIsbixpLHMsdVswXSxhKX0sZWxlbWVudDpmdW5jdGlvbihlLHQscixp
LG8pe3ZhciBhPWVbMV0scz1lWzJdLHU9ZVszXSxsPW4ocixpLHQsYSxzLHUpO3QuaXNEaXJ0eT10
LmlzU3VidHJlZURpcnR5PSExLHIuaG9va3MuZWxlbWVudCh0LHIsaSxhLGxbMF0sbFsxXSxvKX0s
YXR0cmlidXRlOmZ1bmN0aW9uKGUsdCxyLGkpe3ZhciBvPWVbMV0sYT1lWzJdLHM9bihyLGksdCwi
QGF0dHJpYnV0ZSIsW2FdLG51bGwpO3QuaXNEaXJ0eT10LmlzU3VidHJlZURpcnR5PSExLHIuaG9v
a3MuYXR0cmlidXRlKHQscixpLG8sc1swXVswXSl9LGNvbXBvbmVudDpmdW5jdGlvbihlLHQscixp
LG8sYSl7dmFyIHM9ZVsxXSx1PWVbMl0sbD1lWzNdLGM9ZVs0XSxmPW4ocixpLHQscyxbXSx1KSxk
PXtkZWZhdWx0Om8udGVtcGxhdGVzW2xdLGludmVyc2U6by50ZW1wbGF0ZXNbY119O3QuaXNEaXJ0
eT10LmlzU3VidHJlZURpcnR5PSExLHIuaG9va3MuY29tcG9uZW50KHQscixpLHMsZlswXSxmWzFd
LGQsYSl9LGF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBhPWVbMV07ci5ob29r
cy5hdHRyaWJ1dGVzKHQscixuLGEsaSxvKX19O2UuQWx3YXlzRGlydHlWaXNpdG9yPWEsZS5kZWZh
dWx0PXtibG9jazpmdW5jdGlvbihlLHQscixuLG8scyl7aShyLHQscyxmdW5jdGlvbihpKXthLmJs
b2NrKGUsdCxyLG4sbyxpKX0pfSxpbmxpbmU6ZnVuY3Rpb24oZSx0LHIsbixvKXtpKHIsdCxvLGZ1
bmN0aW9uKGkpe2EuaW5saW5lKGUsdCxyLG4saSl9KX0sY29udGVudDpmdW5jdGlvbihlLHQscixu
LG8pe2kocix0LG8sZnVuY3Rpb24oaSl7YS5jb250ZW50KGUsdCxyLG4saSl9KX0sZWxlbWVudDpm
dW5jdGlvbihlLHQscixuLG8scyl7aShyLHQscyxmdW5jdGlvbihpKXthLmVsZW1lbnQoZSx0LHIs
bixvLGkpfSl9LGF0dHJpYnV0ZTpmdW5jdGlvbihlLHQscixuLG8pe2kocix0LG51bGwsZnVuY3Rp
b24oKXthLmF0dHJpYnV0ZShlLHQscixuLG8pfSl9LGNvbXBvbmVudDpmdW5jdGlvbihlLHQscixu
LG8scyl7aShyLHQscyxmdW5jdGlvbihpKXthLmNvbXBvbmVudChlLHQscixuLG8saSl9KX0sYXR0
cmlidXRlczpmdW5jdGlvbihlLHQscixuLGksbyl7YS5hdHRyaWJ1dGVzKGUsdCxyLG4saSxvKX19
fSksZSgiaHRtbGJhcnMtcnVudGltZS9yZW5kZXIiLFsiZXhwb3J0cyIsImh0bWxiYXJzLXV0aWwv
bW9ycGgtdXRpbHMiLCJodG1sYmFycy1ydW50aW1lL25vZGUtdmlzaXRvciIsImh0bWxiYXJzLXJ1
bnRpbWUvbW9ycGgiLCJodG1sYmFycy11dGlsL3RlbXBsYXRlLXV0aWxzIiwiaHRtbGJhcnMtdXRp
bC92b2lkLXRhZy1uYW1lcyJdLGZ1bmN0aW9uKGUsdCxyLG4saSxvKXsidXNlIHN0cmljdCI7ZnVu
Y3Rpb24gYShlLHQscixuKXt2YXIgaSxvPXQuZG9tO24mJihuLnJlbmRlck5vZGU/aT1uLnJlbmRl
ck5vZGUuY29udGV4dHVhbEVsZW1lbnQ6bi5jb250ZXh0dWFsRWxlbWVudCYmKGk9bi5jb250ZXh0
dWFsRWxlbWVudCkpLG8uZGV0ZWN0TmFtZXNwYWNlKGkpO3ZhciBhPXUuYnVpbGQodCxyLGUsbixp
KTtyZXR1cm4gYS5yZW5kZXIoKSxhfWZ1bmN0aW9uIHMoZSx0LHIsbil7dGhpcy5yZW5kZXJOb2Rl
PWV8fG51bGwsdGhpcy5zZWxmPXQsdGhpcy5ibG9ja0FyZ3VtZW50cz1yfHxudWxsLHRoaXMuY29u
dGV4dHVhbEVsZW1lbnQ9bnx8bnVsbH1mdW5jdGlvbiB1KGUsdCxyLG4saSxvLGEscyx1KXt0aGlz
LnJvb3Q9bix0aGlzLmZyYWdtZW50PWEsdGhpcy5ub2Rlcz1vLHRoaXMudGVtcGxhdGU9cyx0aGlz
LnN0YXRlbWVudHM9cy5zdGF0ZW1lbnRzLnNsaWNlKCksdGhpcy5lbnY9ZSx0aGlzLnNjb3BlPXQs
dGhpcy5zaG91bGRTZXRDb250ZW50PXUsdm9pZCAwIT09ci5zZWxmJiZ0aGlzLmJpbmRTZWxmKHIu
c2VsZiksdm9pZCAwIT09ci5ibG9ja0FyZ3VtZW50cyYmdGhpcy5iaW5kTG9jYWxzKHIuYmxvY2tB
cmd1bWVudHMpLHRoaXMuaW5pdGlhbGl6ZU5vZGVzKGkpfWZ1bmN0aW9uIGwoZSx0LHIpe3ZhciBu
PVtdO2Zvcih2YXIgaSBpbiB0KSJzdHJpbmciIT10eXBlb2YgdFtpXSYmbi5wdXNoKFsiYXR0cmli
dXRlIixpLHRbaV1dKTt2YXIgYT1yfHxvLmRlZmF1bHRbZV07YXx8bi5wdXNoKFsiY29udGVudCIs
InlpZWxkIl0pO3ZhciBzPXthcml0eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6
ITEsYnVpbGRGcmFnbWVudDpmdW5jdGlvbihyKXt2YXIgbj1yLmNyZWF0ZURvY3VtZW50RnJhZ21l
bnQoKTsic3ZnIj09PWUmJnIuc2V0TmFtZXNwYWNlKGgpO3ZhciBpPXIuY3JlYXRlRWxlbWVudChl
KTtmb3IodmFyIG8gaW4gdCkic3RyaW5nIj09dHlwZW9mIHRbb10mJnIuc2V0QXR0cmlidXRlKGks
byx0W29dKTtpZighYSl7dmFyIHM9ci5jcmVhdGVDb21tZW50KCIiKTtyLmFwcGVuZENoaWxkKGks
cyl9cmV0dXJuIHIuYXBwZW5kQ2hpbGQobixpKSxufSxidWlsZFJlbmRlck5vZGVzOmZ1bmN0aW9u
KGUscil7dmFyIG49ZS5jaGlsZEF0KHIsWzBdKSxpPVtdO2Zvcih2YXIgbyBpbiB0KSJzdHJpbmci
IT10eXBlb2YgdFtvXSYmaS5wdXNoKGUuY3JlYXRlQXR0ck1vcnBoKG4sbykpO3JldHVybiBhfHxp
LnB1c2goZS5jcmVhdGVNb3JwaEF0KG4sMCwwKSksaX0sc3RhdGVtZW50czpuLGxvY2FsczpbXSx0
ZW1wbGF0ZXM6W119O3JldHVybiBzfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9W107Zm9yKHZhciByIGlu
IGUpInN0cmluZyIhPXR5cGVvZiBlW3JdJiZ0LnB1c2goWyJhdHRyaWJ1dGUiLHIsZVtyXV0pO3Zh
ciBuPXthcml0eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVyZWQ6ITEsYnVpbGRGcmFn
bWVudDpmdW5jdGlvbih0KXt2YXIgcj10aGlzLmVsZW1lbnQ7Imh0dHA6Ly93d3cudzMub3JnLzIw
MDAvc3ZnIj09PXIubmFtZXNwYWNlVVJJJiZ0LnNldE5hbWVzcGFjZShoKTtmb3IodmFyIG4gaW4g
ZSkic3RyaW5nIj09dHlwZW9mIGVbbl0mJnQuc2V0QXR0cmlidXRlKHIsbixlW25dKTtyZXR1cm4g
cn0sYnVpbGRSZW5kZXJOb2RlczpmdW5jdGlvbih0KXt2YXIgcj10aGlzLmVsZW1lbnQsbj1bXTtm
b3IodmFyIGkgaW4gZSkic3RyaW5nIiE9dHlwZW9mIGVbaV0mJm4ucHVzaCh0LmNyZWF0ZUF0dHJN
b3JwaChyLGkpKTtyZXR1cm4gbn0sc3RhdGVtZW50czp0LGxvY2FsczpbXSx0ZW1wbGF0ZXM6W10s
ZWxlbWVudDpudWxsfTtyZXR1cm4gbn1mdW5jdGlvbiBmKGUsdCl7ZS5vd25lck5vZGU9dH1mdW5j
dGlvbiBkKGUsdCxyKXt2YXIgaT1uLmRlZmF1bHQuZW1wdHkoZSxyfHx0LmNvbnRleHR1YWxFbGVt
ZW50KTtyZXR1cm4gZihpLHQub3duZXJOb2RlKSxpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgcixuPXQu
ZG9tO3JldHVybiB0LnVzZUZyYWdtZW50Q2FjaGUmJm4uY2FuQ2xvbmU/KG51bGw9PT1lLmNhY2hl
ZEZyYWdtZW50JiYocj1lLmJ1aWxkRnJhZ21lbnQobiksZS5oYXNSZW5kZXJlZD9lLmNhY2hlZEZy
YWdtZW50PXI6ZS5oYXNSZW5kZXJlZD0hMCksZS5jYWNoZWRGcmFnbWVudCYmKHI9bi5jbG9uZU5v
ZGUoZS5jYWNoZWRGcmFnbWVudCwhMCkpKTpyfHwocj1lLmJ1aWxkRnJhZ21lbnQobikpLHJ9ZS5k
ZWZhdWx0PWEsZS5SZW5kZXJPcHRpb25zPXMsZS5tYW51YWxFbGVtZW50PWwsZS5hdHRhY2hBdHRy
aWJ1dGVzPWMsZS5jcmVhdGVDaGlsZE1vcnBoPWQsZS5nZXRDYWNoZWRGcmFnbWVudD1wO3ZhciBo
PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7dS5idWlsZD1mdW5jdGlvbihlLHIsbixvLGEp
e3ZhciBzLGwsYyxmPWUuZG9tLGQ9cChuLGUpLGg9bi5idWlsZFJlbmRlck5vZGVzKGYsZCxhKTty
ZXR1cm4gbyYmby5yZW5kZXJOb2RlPyhzPW8ucmVuZGVyTm9kZSxsPXMub3duZXJOb2RlLGM9ITAp
OihzPWYuY3JlYXRlTW9ycGgobnVsbCxkLmZpcnN0Q2hpbGQsZC5sYXN0Q2hpbGQsYSksbD1zLHMu
b3duZXJOb2RlPWwsYz0hMSkscy5jaGlsZE5vZGVzJiZ0LnZpc2l0Q2hpbGRyZW4ocy5jaGlsZE5v
ZGVzLGZ1bmN0aW9uKHQpe2kuY2xlYXJNb3JwaCh0LGUsITApfSkscy5jaGlsZE5vZGVzPWgsbmV3
IHUoZSxyLG8scyxsLGgsZCxuLGMpfSx1LnByb3RvdHlwZS5pbml0aWFsaXplTm9kZXM9ZnVuY3Rp
b24oZSl7Zm9yKHZhciB0PXRoaXMucm9vdC5jaGlsZE5vZGVzLHI9MCxuPXQubGVuZ3RoO3I8bjty
KyspdFtyXS5vd25lck5vZGU9ZX0sdS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5y
b290Lmxhc3RSZXN1bHQ9dGhpcyx0aGlzLnJvb3QucmVuZGVyZWQ9ITAsdGhpcy5wb3B1bGF0ZU5v
ZGVzKHIuQWx3YXlzRGlydHlWaXNpdG9yKSx0aGlzLnNob3VsZFNldENvbnRlbnQmJnRoaXMucm9v
dC5zZXRDb250ZW50JiZ0aGlzLnJvb3Quc2V0Q29udGVudCh0aGlzLmZyYWdtZW50KX0sdS5wcm90
b3R5cGUuZGlydHk9ZnVuY3Rpb24oKXt0LnZpc2l0Q2hpbGRyZW4oW3RoaXMucm9vdF0sZnVuY3Rp
b24oZSl7ZS5pc0RpcnR5PSEwfSl9LHUucHJvdG90eXBlLnJldmFsaWRhdGU9ZnVuY3Rpb24oZSx0
LG4saSl7dGhpcy5yZXZhbGlkYXRlV2l0aChlLGksdCxuLHIuZGVmYXVsdCl9LHUucHJvdG90eXBl
LnJlcmVuZGVyPWZ1bmN0aW9uKGUsdCxuLGkpe3RoaXMucmV2YWxpZGF0ZVdpdGgoZSxpLHQsbixy
LkFsd2F5c0RpcnR5VmlzaXRvcil9LHUucHJvdG90eXBlLnJldmFsaWRhdGVXaXRoPWZ1bmN0aW9u
KGUsdCxyLG4saSl7dm9pZCAwIT09ZSYmKHRoaXMuZW52PWUpLHZvaWQgMCE9PXQmJih0aGlzLnNj
b3BlPXQpLHRoaXMudXBkYXRlU2NvcGUoKSx2b2lkIDAhPT1yJiZ0aGlzLnVwZGF0ZVNlbGYociks
dm9pZCAwIT09biYmdGhpcy51cGRhdGVMb2NhbHMobiksdGhpcy5wb3B1bGF0ZU5vZGVzKGkpfSx1
LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yb290O2kuY2xlYXJNb3Jw
aChlLHRoaXMuZW52LCEwKX0sdS5wcm90b3R5cGUucG9wdWxhdGVOb2Rlcz1mdW5jdGlvbihlKXt2
YXIgdCxyLG49dGhpcy5lbnYsaT10aGlzLnNjb3BlLG89dGhpcy50ZW1wbGF0ZSxhPXRoaXMubm9k
ZXMscz10aGlzLnN0YXRlbWVudHM7Zm9yKHQ9MCxyPXMubGVuZ3RoO3Q8cjt0Kyspe3ZhciB1PXNb
dF0sbD1hW3RdO3N3aXRjaChuLmhvb2tzLndpbGxSZW5kZXJOb2RlJiZuLmhvb2tzLndpbGxSZW5k
ZXJOb2RlKGwsbixpKSx1WzBdKXtjYXNlImJsb2NrIjplLmJsb2NrKHUsbCxuLGksbyxlKTticmVh
aztjYXNlImlubGluZSI6ZS5pbmxpbmUodSxsLG4saSxlKTticmVhaztjYXNlImNvbnRlbnQiOmUu
Y29udGVudCh1LGwsbixpLGUpO2JyZWFrO2Nhc2UiZWxlbWVudCI6ZS5lbGVtZW50KHUsbCxuLGks
byxlKTticmVhaztjYXNlImF0dHJpYnV0ZSI6ZS5hdHRyaWJ1dGUodSxsLG4saSk7YnJlYWs7Y2Fz
ZSJjb21wb25lbnQiOmUuY29tcG9uZW50KHUsbCxuLGksbyxlKX1uLmhvb2tzLmRpZFJlbmRlck5v
ZGUmJm4uaG9va3MuZGlkUmVuZGVyTm9kZShsLG4saSl9fSx1LnByb3RvdHlwZS5iaW5kU2NvcGU9
ZnVuY3Rpb24oKXt0aGlzLmVudi5ob29rcy5iaW5kU2NvcGUodGhpcy5lbnYsdGhpcy5zY29wZSl9
LHUucHJvdG90eXBlLnVwZGF0ZVNjb3BlPWZ1bmN0aW9uKCl7dGhpcy5lbnYuaG9va3MudXBkYXRl
U2NvcGUodGhpcy5lbnYsdGhpcy5zY29wZSl9LHUucHJvdG90eXBlLmJpbmRTZWxmPWZ1bmN0aW9u
KGUpe3RoaXMuZW52Lmhvb2tzLmJpbmRTZWxmKHRoaXMuZW52LHRoaXMuc2NvcGUsZSl9LHUucHJv
dG90eXBlLnVwZGF0ZVNlbGY9ZnVuY3Rpb24oZSl7dGhpcy5lbnYuaG9va3MudXBkYXRlU2VsZih0
aGlzLmVudix0aGlzLnNjb3BlLGUpfSx1LnByb3RvdHlwZS5iaW5kTG9jYWxzPWZ1bmN0aW9uKGUp
e2Zvcih2YXIgdD10aGlzLnRlbXBsYXRlLmxvY2FscyxyPTAsbj10Lmxlbmd0aDtyPG47cisrKXRo
aXMuZW52Lmhvb2tzLmJpbmRMb2NhbCh0aGlzLmVudix0aGlzLnNjb3BlLHRbcl0sZVtyXSl9LHUu
cHJvdG90eXBlLnVwZGF0ZUxvY2Fscz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50ZW1wbGF0
ZS5sb2NhbHMscj0wLG49dC5sZW5ndGg7cjxuO3IrKyl0aGlzLmVudi5ob29rcy51cGRhdGVMb2Nh
bCh0aGlzLmVudix0aGlzLnNjb3BlLHRbcl0sZVtyXSl9fSksZSgiaHRtbGJhcnMtdXRpbCIsWyJl
eHBvcnRzIiwiaHRtbGJhcnMtdXRpbC9zYWZlLXN0cmluZyIsImh0bWxiYXJzLXV0aWwvaGFuZGxl
YmFycy91dGlscyIsImh0bWxiYXJzLXV0aWwvbmFtZXNwYWNlcyIsImh0bWxiYXJzLXV0aWwvbW9y
cGgtdXRpbHMiXSxmdW5jdGlvbihlLHQscixuLGkpeyJ1c2Ugc3RyaWN0IjtlLlNhZmVTdHJpbmc9
dC5kZWZhdWx0LGUuZXNjYXBlRXhwcmVzc2lvbj1yLmVzY2FwZUV4cHJlc3Npb24sZS5nZXRBdHRy
TmFtZXNwYWNlPW4uZ2V0QXR0ck5hbWVzcGFjZSxlLnZhbGlkYXRlQ2hpbGRNb3JwaHM9aS52YWxp
ZGF0ZUNoaWxkTW9ycGhzLGUubGlua1BhcmFtcz1pLmxpbmtQYXJhbXMsZS5kdW1wPWkuZHVtcH0p
LGUoImh0bWxiYXJzLXV0aWwvYXJyYXktdXRpbHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1
c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxyKXt2YXIgbixpO2lmKHZvaWQgMD09PXIpZm9yKG49
MCxpPWUubGVuZ3RoO248aTtuKyspdChlW25dLG4sZSk7ZWxzZSBmb3Iobj0wLGk9ZS5sZW5ndGg7
bjxpO24rKyl0LmNhbGwocixlW25dLG4sZSl9ZnVuY3Rpb24gcihlLHQpe3ZhciByLG4saT1bXTtm
b3Iocj0wLG49ZS5sZW5ndGg7cjxuO3IrKylpLnB1c2godChlW3JdLHIsZSkpO3JldHVybiBpfWUu
Zm9yRWFjaD10LGUubWFwPXI7dmFyIG47bj1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlv
bihlLHQscil7cmV0dXJuIGUuaW5kZXhPZih0LHIpfTpmdW5jdGlvbihlLHQscil7dm9pZCAwPT09
cnx8bnVsbD09PXI/cj0wOnI8MCYmKHI9TWF0aC5tYXgoMCxlLmxlbmd0aCtyKSk7Zm9yKHZhciBu
PXIsaT1lLmxlbmd0aDtuPGk7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfTt2YXIg
aT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2Jq
ZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtlLmlzQXJyYXk9aTt2YXIgbz1uO2UuaW5k
ZXhPZkFycmF5PW99KSxlKCJodG1sYmFycy11dGlsL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmciLFsi
ZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3RoaXMuc3Ry
aW5nPWV9dC5wcm90b3R5cGUudG9TdHJpbmc9dC5wcm90b3R5cGUudG9IVE1MPWZ1bmN0aW9uKCl7
cmV0dXJuIiIrdGhpcy5zdHJpbmd9LGUuZGVmYXVsdD10fSksZSgiaHRtbGJhcnMtdXRpbC9oYW5k
bGViYXJzL3V0aWxzIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gdChlKXtyZXR1cm4gdVtlXX1mdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRz
Lmxlbmd0aDt0KyspZm9yKHZhciByIGluIGFyZ3VtZW50c1t0XSlPYmplY3QucHJvdG90eXBlLmhh
c093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW3RdLHIpJiYoZVtyXT1hcmd1bWVudHNbdF1bcl0p
O3JldHVybiBlfWZ1bmN0aW9uIG4oZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKysp
aWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gaShlKXtpZigic3RyaW5nIiE9
dHlwZW9mIGUpe2lmKGUmJmUudG9IVE1MKXJldHVybiBlLnRvSFRNTCgpO2lmKG51bGw9PWUpcmV0
dXJuIiI7aWYoIWUpcmV0dXJuIGUrIiI7ZT0iIitlfXJldHVybiBjLnRlc3QoZSk/ZS5yZXBsYWNl
KGwsdCk6ZX1mdW5jdGlvbiBvKGUpe3JldHVybiFlJiYwIT09ZXx8ISghcChlKXx8MCE9PWUubGVu
Z3RoKX1mdW5jdGlvbiBhKGUsdCl7cmV0dXJuIGUucGF0aD10LGV9ZnVuY3Rpb24gcyhlLHQpe3Jl
dHVybihlP2UrIi4iOiIiKSt0fWUuZXh0ZW5kPXIsZS5pbmRleE9mPW4sZS5lc2NhcGVFeHByZXNz
aW9uPWksZS5pc0VtcHR5PW8sZS5ibG9ja1BhcmFtcz1hLGUuYXBwZW5kQ29udGV4dFBhdGg9czt2
YXIgdT17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6
IiYjeDI3OyIsImAiOiImI3g2MDsifSxsPS9bJjw+IidgXS9nLGM9L1smPD4iJ2BdLyxmPU9iamVj
dC5wcm90b3R5cGUudG9TdHJpbmc7ZS50b1N0cmluZz1mO3ZhciBkPWZ1bmN0aW9uKGUpe3JldHVy
biJmdW5jdGlvbiI9PXR5cGVvZiBlfTtkKC94LykmJihlLmlzRnVuY3Rpb249ZD1mdW5jdGlvbihl
KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIltvYmplY3QgRnVuY3Rpb25dIj09PWYuY2Fs
bChlKX0pO3ZhciBkO2UuaXNGdW5jdGlvbj1kO3ZhciBwPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9u
KGUpe3JldHVybiEoIWV8fCJvYmplY3QiIT10eXBlb2YgZSkmJiJbb2JqZWN0IEFycmF5XSI9PT1m
LmNhbGwoZSl9O2UuaXNBcnJheT1wfSksZSgiaHRtbGJhcnMtdXRpbC9tb3JwaC11dGlscyIsWyJl
eHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXtpZihlJiYw
IT09ZS5sZW5ndGgpZm9yKGU9ZS5zbGljZSgpO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKTtpZih0
KHIpLHIuY2hpbGROb2RlcyllLnB1c2guYXBwbHkoZSxyLmNoaWxkTm9kZXMpO2Vsc2UgaWYoci5m
aXJzdENoaWxkTW9ycGgpZm9yKHZhciBuPXIuZmlyc3RDaGlsZE1vcnBoO247KWUucHVzaChuKSxu
PW4ubmV4dE1vcnBoO2Vsc2UgaWYoci5tb3JwaExpc3QpZm9yKHZhciBuPXIubW9ycGhMaXN0LmZp
cnN0Q2hpbGRNb3JwaDtuOyllLnB1c2gobiksbj1uLm5leHRNb3JwaH19ZnVuY3Rpb24gcihlLHQs
bil7dmFyIGk9dC5tb3JwaExpc3Q7aWYodC5tb3JwaExpc3QpZm9yKHZhciBvPWkuZmlyc3RDaGls
ZE1vcnBoO287KXt2YXIgYT1vLm5leHRNb3JwaDtyKGUsbyxuKSxvPWF9ZWxzZSBpZih0Lmxhc3RS
ZXN1bHQpdC5sYXN0UmVzdWx0LnJldmFsaWRhdGVXaXRoKGUsdm9pZCAwLHZvaWQgMCx2b2lkIDAs
bik7ZWxzZSBpZih0LmNoaWxkTm9kZXMpZm9yKHZhciBzPTAsdT10LmNoaWxkTm9kZXMubGVuZ3Ro
O3M8dTtzKyspcihlLHQuY2hpbGROb2Rlc1tzXSxuKX1mdW5jdGlvbiBuKGUsdCxyLG4saSxvKXty
LmxpbmtlZFBhcmFtc3x8ZS5ob29rcy5saW5rUmVuZGVyTm9kZShyLGUsdCxuLGksbykmJihyLmxp
bmtlZFBhcmFtcz17cGFyYW1zOmksaGFzaDpvfSl9ZnVuY3Rpb24gaShlKXtpZihjb25zb2xlLmdy
b3VwKGUsZS5pc0RpcnR5KSxlLmNoaWxkTm9kZXMpbyhlLmNoaWxkTm9kZXMsaSk7ZWxzZSBpZihl
LmZpcnN0Q2hpbGRNb3JwaClmb3IodmFyIHQ9ZS5maXJzdENoaWxkTW9ycGg7dDspaSh0KSx0PXQu
bmV4dE1vcnBoO2Vsc2UgZS5tb3JwaExpc3QmJmkoZS5tb3JwaExpc3QpO2NvbnNvbGUuZ3JvdXBF
bmQoKX1mdW5jdGlvbiBvKGUsdCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQoZVty
XSl9ZS52aXNpdENoaWxkcmVuPXQsZS52YWxpZGF0ZUNoaWxkTW9ycGhzPXIsZS5saW5rUGFyYW1z
PW4sZS5kdW1wPWl9KSxlKCJodG1sYmFycy11dGlsL25hbWVzcGFjZXMiLFsiZXhwb3J0cyJdLGZ1
bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCl7aWYodClyZXR1cm4gdDt2YXIg
bixpPWUuaW5kZXhPZigiOiIpO2lmKGkhPT0tMSl7dmFyIG89ZS5zbGljZSgwLGkpO249cltvXX1y
ZXR1cm4gbnx8bnVsbH1lLmdldEF0dHJOYW1lc3BhY2U9dDt2YXIgcj17aHRtbDoiaHR0cDovL3d3
dy53My5vcmcvMTk5OS94aHRtbCIsbWF0aG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgv
TWF0aE1MIixzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4bGluazoiaHR0cDovL3d3
dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1l
c3BhY2UifX0pLGUoImh0bWxiYXJzLXV0aWwvb2JqZWN0LXV0aWxzIixbImV4cG9ydHMiXSxmdW5j
dGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlLHQpe2Zvcih2YXIgciBpbiB0KWUuaGFz
T3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pO3JldHVybiBlfWZ1bmN0aW9uIHIoZSl7cmV0dXJu
IHQoe30sZSl9ZnVuY3Rpb24gbihlKXt2YXIgdD17fTtmb3IodmFyIHIgaW4gZSllLmhhc093blBy
b3BlcnR5KHIpJiYodFtyXT0hMCk7cmV0dXJuIHR9ZnVuY3Rpb24gaShlKXt2YXIgdD0wO2Zvcih2
YXIgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJnQrKztyZXR1cm4gdH1lLm1lcmdlPXQsZS5z
aGFsbG93Q29weT1yLGUua2V5U2V0PW4sZS5rZXlMZW5ndGg9aX0pLGUoImh0bWxiYXJzLXV0aWwv
cXVvdGluZyIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQo
ZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC9cXC9nLCJcXFxcIiksZT1lLnJlcGxhY2UoLyIvZywnXFwi
JyksZT1lLnJlcGxhY2UoL1xuL2csIlxcbiIpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuJyInK3QoZSkr
JyInfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIlsiK2UrIl0ifWZ1bmN0aW9uIGkoZSl7cmV0dXJuInsi
K2Uuam9pbigiLCAiKSsifSJ9ZnVuY3Rpb24gbyhlLHQpe2Zvcih2YXIgcj0iIjt0LS07KXIrPWU7
cmV0dXJuIHJ9ZS5oYXNoPWksZS5yZXBlYXQ9byxlLmVzY2FwZVN0cmluZz10LGUuc3RyaW5nPXIs
ZS5hcnJheT1ufSksZSgiaHRtbGJhcnMtdXRpbC9zYWZlLXN0cmluZyIsWyJleHBvcnRzIiwiaHRt
bGJhcnMtdXRpbC9oYW5kbGViYXJzL3NhZmUtc3RyaW5nIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0
cmljdCI7ZS5kZWZhdWx0PXQuZGVmYXVsdH0pLGUoImh0bWxiYXJzLXV0aWwvdGVtcGxhdGUtdXRp
bHMiLFsiZXhwb3J0cyIsImh0bWxiYXJzLXV0aWwvbW9ycGgtdXRpbHMiLCJodG1sYmFycy1ydW50
aW1lL3JlbmRlciJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLHQp
e3RoaXMubW9ycGhMaXN0VG9DbGVhcj10LHRoaXMubW9ycGhMaXN0VG9QcnVuZT1udWxsLHRoaXMu
aGFuZGxlZE1vcnBocz17fSx0aGlzLmNvbGxpc2lvbnM9dm9pZCAwLHRoaXMubW9ycGhUb0NsZWFy
PWUsdGhpcy5zaGFkb3dPcHRpb25zPW51bGx9ZnVuY3Rpb24gaShlLHQscil7dGhpcy5yZW5kZXI9
ZSx0aGlzLnRlbXBsYXRlPXQsdGhpcy5ibG9ja09wdGlvbnM9cix0aGlzLmFyaXR5PXQuYXJpdHl9
ZnVuY3Rpb24gbyhlLHQscil7cmV0dXJuIG5ldyBpKGUsdCxyKX1mdW5jdGlvbiBhKGUsdCxyKXtp
ZihyKWlmKHIgaW5zdGFuY2VvZiBpKWUuaG9va3MuYmluZEJsb2NrKGUsdCxyKTtlbHNlIGZvcih2
YXIgbiBpbiByKXIuaGFzT3duUHJvcGVydHkobikmJmUuaG9va3MuYmluZEJsb2NrKGUsdCxyW25d
LG4pfWZ1bmN0aW9uIHMoZSx0LHIsbixpKXt2YXIgbz1yLnJlbmRlclN0YXRlO28uY29sbGlzaW9u
cz12b2lkIDAsby5zaGFkb3dPcHRpb25zPW47dmFyIGE9aShyKTtpZighYXx8IWEuaGFuZGxlZCl7
dmFyIHM9ZS5tb3JwaE1hcCxjPW8ubW9ycGhMaXN0VG9QcnVuZTtpZihjKWZvcih2YXIgZj1vLmhh
bmRsZWRNb3JwaHMsZD1jLmZpcnN0Q2hpbGRNb3JwaDtkOyl7dmFyIHA9ZC5uZXh0TW9ycGg7ZC5r
ZXkgaW4gZnx8KHNbZC5rZXldPXZvaWQgMCx1KGQsdCwhMCksZC5kZXN0cm95KCkpLGQ9cH1jPW8u
bW9ycGhMaXN0VG9DbGVhcixjJiZsKGMsZSx0KTt2YXIgaD1vLm1vcnBoVG9DbGVhcjtoJiZ1KGgs
dCl9fWZ1bmN0aW9uIHUoZSxyLG4pe2Z1bmN0aW9uIGkoZSl7byYmbyhlKSxhJiZhKGUpfXZhciBv
PXIuaG9va3MuY2xlYW51cFJlbmRlck5vZGUsYT1yLmhvb2tzLmRlc3Ryb3lSZW5kZXJOb2RlLHM9
ci5ob29rcy53aWxsQ2xlYW51cFRyZWUsdT1yLmhvb2tzLmRpZENsZWFudXBUcmVlO3MmJnMocixl
LG4pLG8mJm8oZSksbiYmYSYmYShlKSx0LnZpc2l0Q2hpbGRyZW4oZS5jaGlsZE5vZGVzLGkpLGUu
Y2xlYXIoKSx1JiZ1KHIsZSxuKSxlLmxhc3RSZXN1bHQ9bnVsbCxlLmxhc3RZaWVsZGVkPW51bGws
ZS5jaGlsZE5vZGVzPW51bGx9ZnVuY3Rpb24gbChlLHQscil7Zm9yKHZhciBuPWUuZmlyc3RDaGls
ZE1vcnBoO247KXt2YXIgaT1uLm5leHRNb3JwaDt0Lm1vcnBoTWFwW24ua2V5XT12b2lkIDAsdShu
LHIsITApLG4uZGVzdHJveSgpLG49aX1lLmNsZWFyKCksdC5tb3JwaExpc3Q9bnVsbH1lLlJlbmRl
clN0YXRlPW4sZS5ibG9ja0Zvcj1vLGUucmVuZGVyQW5kQ2xlYW51cD1zLGUuY2xlYXJNb3JwaD11
LGUuY2xlYXJNb3JwaExpc3Q9bCxpLnByb3RvdHlwZS5pbnZva2U9ZnVuY3Rpb24oZSx0LHIsbixp
LG8pe24ubGFzdFJlc3VsdD9uLmxhc3RSZXN1bHQucmV2YWxpZGF0ZVdpdGgoZSx2b2lkIDAscix0
LG8pOnRoaXMuX2ZpcnN0UmVuZGVyKGUsdCxyLG4saSl9LGkucHJvdG90eXBlLl9maXJzdFJlbmRl
cj1mdW5jdGlvbihlLHQsaSxvLHUpe3ZhciBsPXtyZW5kZXJTdGF0ZTpuZXcgbihvKX0sYz10aGlz
LnJlbmRlcixmPXRoaXMudGVtcGxhdGUsZD10aGlzLmJsb2NrT3B0aW9ucy5zY29wZSxwPWQ/ZS5o
b29rcy5jcmVhdGVDaGlsZFNjb3BlKGQpOmUuaG9va3MuY3JlYXRlRnJlc2hTY29wZSgpO2UuaG9v
a3MuYmluZFNoYWRvd1Njb3BlKGUsdSxwLHRoaXMuYmxvY2tPcHRpb25zLm9wdGlvbnMpLHZvaWQg
MCE9PWk/ZS5ob29rcy5iaW5kU2VsZihlLHAsaSk6dm9pZCAwIT09dGhpcy5ibG9ja09wdGlvbnMu
c2VsZiYmZS5ob29rcy5iaW5kU2VsZihlLHAsdGhpcy5ibG9ja09wdGlvbnMuc2VsZiksYShlLHAs
dGhpcy5ibG9ja09wdGlvbnMueWllbGRUbykscyhvLGUsbCxudWxsLGZ1bmN0aW9uKCl7bC5yZW5k
ZXJTdGF0ZS5tb3JwaFRvQ2xlYXI9bnVsbDt2YXIgbj1uZXcgci5SZW5kZXJPcHRpb25zKG8sdm9p
ZCAwLHQpO2MoZixlLHAsbil9KX19KSxlKCJodG1sYmFycy11dGlsL3ZvaWQtdGFnLW5hbWVzIixb
ImV4cG9ydHMiLCJodG1sYmFycy11dGlsL2FycmF5LXV0aWxzIl0sZnVuY3Rpb24oZSx0KXsidXNl
IHN0cmljdCI7dmFyIHI9ImFyZWEgYmFzZSBiciBjb2wgY29tbWFuZCBlbWJlZCBociBpbWcgaW5w
dXQga2V5Z2VuIGxpbmsgbWV0YSBwYXJhbSBzb3VyY2UgdHJhY2sgd2JyIixuPXt9O3QuZm9yRWFj
aChyLnNwbGl0KCIgIiksZnVuY3Rpb24oZSl7bltlXT0hMH0pLGUuZGVmYXVsdD1ufSksZSgibW9y
cGgtYXR0ciIsWyJleHBvcnRzIiwibW9ycGgtYXR0ci9zYW5pdGl6ZS1hdHRyaWJ1dGUtdmFsdWUi
LCJkb20taGVscGVyL3Byb3AiLCJkb20taGVscGVyL2J1aWxkLWh0bWwtZG9tIiwiaHRtbGJhcnMt
dXRpbCJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oKXtyZXR1
cm4gdGhpcy5kb21IZWxwZXIuZ2V0UHJvcGVydHlTdHJpY3QodGhpcy5lbGVtZW50LHRoaXMuYXR0
ck5hbWUpfWZ1bmN0aW9uIGEoZSl7aWYodGhpcy5fcmVuZGVyZWRJbml0aWFsbHk9PT0hMHx8IXIu
aXNBdHRyUmVtb3ZhbFZhbHVlKGUpKXt2YXIgdD10aGlzLmVsZW1lbnQsbj10aGlzLmF0dHJOYW1l
OyJ2YWx1ZSI9PT1uJiYiSU5QVVQiPT09dC50YWdOYW1lJiZ0LnZhbHVlPT09ZXx8dGhpcy5kb21I
ZWxwZXIuc2V0UHJvcGVydHlTdHJpY3QodCxuLGUpfXRoaXMuX3JlbmRlcmVkSW5pdGlhbGx5PSEw
fWZ1bmN0aW9uIHMoKXtyZXR1cm4gdGhpcy5kb21IZWxwZXIuZ2V0QXR0cmlidXRlKHRoaXMuZWxl
bWVudCx0aGlzLmF0dHJOYW1lKX1mdW5jdGlvbiB1KGUpe3IuaXNBdHRyUmVtb3ZhbFZhbHVlKGUp
P3RoaXMuZG9tSGVscGVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsdGhpcy5hdHRyTmFt
ZSk6dGhpcy5kb21IZWxwZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCx0aGlzLmF0dHJOYW1l
LGUpfWZ1bmN0aW9uIGwoKXtyZXR1cm4gdGhpcy5kb21IZWxwZXIuZ2V0QXR0cmlidXRlTlModGhp
cy5lbGVtZW50LHRoaXMubmFtZXNwYWNlLHRoaXMuYXR0ck5hbWUpfWZ1bmN0aW9uIGMoZSl7ci5p
c0F0dHJSZW1vdmFsVmFsdWUoZSk/dGhpcy5kb21IZWxwZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMu
ZWxlbWVudCx0aGlzLmF0dHJOYW1lKTp0aGlzLmRvbUhlbHBlci5zZXRBdHRyaWJ1dGVOUyh0aGlz
LmVsZW1lbnQsdGhpcy5uYW1lc3BhY2UsdGhpcy5hdHRyTmFtZSxlKX1mdW5jdGlvbiBmKGUsdCxp
KXt2YXIgbz1yLm5vcm1hbGl6ZVByb3BlcnR5KGUsdCksYT1vLm5vcm1hbGl6ZWQscz1vLnR5cGU7
cmV0dXJuIGUubmFtZXNwYWNlVVJJPT09bi5zdmdOYW1lc3BhY2V8fCJzdHlsZSI9PT10fHwiYXR0
ciI9PT1zP25ldyBtKGUsYSxpKTpuZXcgcChlLGEsaSl9ZnVuY3Rpb24gZChlLHQscil7dGhpcy5l
bGVtZW50PWUsdGhpcy5kb21IZWxwZXI9cix0aGlzLmF0dHJOYW1lPXQsdGhpcy5fc3RhdGU9dm9p
ZCAwLHRoaXMuaXNEaXJ0eT0hMSx0aGlzLmlzU3VidHJlZURpcnR5PSExLHRoaXMuZXNjYXBlZD0h
MCx0aGlzLmxhc3RWYWx1ZT12LHRoaXMubGFzdFJlc3VsdD1udWxsLHRoaXMubGFzdFlpZWxkZWQ9
bnVsbCx0aGlzLmNoaWxkTm9kZXM9bnVsbCx0aGlzLmxpbmtlZFBhcmFtcz1udWxsLHRoaXMubGlu
a2VkUmVzdWx0PW51bGwsdGhpcy5ndWlkPSJhdHRyIitiKyssdGhpcy5zZWVuPSExLHRoaXMub3du
ZXJOb2RlPW51bGwsdGhpcy5yZW5kZXJlZD0hMSx0aGlzLl9yZW5kZXJlZEluaXRpYWxseT0hMSx0
aGlzLm5hbWVzcGFjZT12b2lkIDAsdGhpcy5kaWRJbml0KCl9ZnVuY3Rpb24gcChlLHQscil7dGhp
cy5fJHN1cGVyQXR0ck1vcnBoKGUsdCxyKX1mdW5jdGlvbiBoKGUsdCxyLG4pe3RoaXMuXyRzdXBl
ckF0dHJNb3JwaChlLHQsciksdGhpcy5uYW1lc3BhY2U9bn1mdW5jdGlvbiBtKGUsdCxyKXt0aGlz
Ll8kc3VwZXJBdHRyTW9ycGgoZSx0LHIpfXZhciB2PXt1bnNldDohMH0sYj0xO2QuY3JlYXRlPWZ1
bmN0aW9uKGUsdCxyLG4pe3ZhciBvPWkuZ2V0QXR0ck5hbWVzcGFjZSh0LG4pO3JldHVybiBvP25l
dyBoKGUsdCxyLG8pOmYoZSx0LHIpfSxkLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3Jl
dHVybiB0aGlzLl9zdGF0ZXx8KHRoaXMuX3N0YXRlPXt9KSx0aGlzLl9zdGF0ZX0sZC5wcm90b3R5
cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3N0YXRlPWV9LGQucHJvdG90eXBl
LmRpZEluaXQ9ZnVuY3Rpb24oKXt9LGQucHJvdG90eXBlLndpbGxTZXRDb250ZW50PWZ1bmN0aW9u
KCl7fSxkLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMud2lsbFNldENv
bnRlbnQoZSksdGhpcy5sYXN0VmFsdWUhPT1lKWlmKHRoaXMubGFzdFZhbHVlPWUsdGhpcy5lc2Nh
cGVkKXt2YXIgcj10LnNhbml0aXplQXR0cmlidXRlVmFsdWUodGhpcy5kb21IZWxwZXIsdGhpcy5l
bGVtZW50LHRoaXMuYXR0ck5hbWUsZSk7dGhpcy5fdXBkYXRlKHIsdGhpcy5uYW1lc3BhY2UpfWVs
c2UgdGhpcy5fdXBkYXRlKGUsdGhpcy5uYW1lc3BhY2UpfSxkLnByb3RvdHlwZS5nZXRDb250ZW50
PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXN0VmFsdWU9dGhpcy5fZ2V0KCk7cmV0dXJuIGV9LGQu
cHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7fSxkLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9u
KCl7dGhpcy5lbGVtZW50PW51bGwsdGhpcy5kb21IZWxwZXI9bnVsbH0sZC5wcm90b3R5cGUuXyRz
dXBlckF0dHJNb3JwaD1kLHAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHAu
cHJvdG90eXBlLl91cGRhdGU9YSxwLnByb3RvdHlwZS5fZ2V0PW8saC5wcm90b3R5cGU9T2JqZWN0
LmNyZWF0ZShkLnByb3RvdHlwZSksaC5wcm90b3R5cGUuX3VwZGF0ZT1jLGgucHJvdG90eXBlLl9n
ZXQ9bCxtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxtLnByb3RvdHlwZS5f
dXBkYXRlPXUsbS5wcm90b3R5cGUuX2dldD1zLGUuZGVmYXVsdD1kLGUuc2FuaXRpemVBdHRyaWJ1
dGVWYWx1ZT10LnNhbml0aXplQXR0cmlidXRlVmFsdWV9KSxlKCJtb3JwaC1hdHRyL3Nhbml0aXpl
LWF0dHJpYnV0ZS12YWx1ZSIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1
bmN0aW9uIHQoZSx0LHMsdSl7dmFyIGw7aWYobD10P3QudGFnTmFtZS50b1VwcGVyQ2FzZSgpOm51
bGwsdSYmdS50b0hUTUwpcmV0dXJuIHUudG9IVE1MKCk7aWYoKG51bGw9PT1sfHxuW2xdKSYmb1tz
XSl7dmFyIGM9ZS5wcm90b2NvbEZvclVSTCh1KTtpZihyW2NdPT09ITApcmV0dXJuInVuc2FmZToi
K3V9cmV0dXJuIGlbbF0mJmFbc10/InVuc2FmZToiK3U6dX1lLnNhbml0aXplQXR0cmlidXRlVmFs
dWU9dDt2YXIgcj17ImphdmFzY3JpcHQ6IjohMCwidmJzY3JpcHQ6IjohMH0sbj17QTohMCxCT0RZ
OiEwLExJTks6ITAsSU1HOiEwLElGUkFNRTohMCxCQVNFOiEwLEZPUk06ITB9LGk9e0VNQkVEOiEw
fSxvPXtocmVmOiEwLHNyYzohMCxiYWNrZ3JvdW5kOiEwLGFjdGlvbjohMH07ZS5iYWRBdHRyaWJ1
dGVzPW87dmFyIGE9e3NyYzohMH19KSxlKCJtb3JwaC1yYW5nZSIsWyJleHBvcnRzIiwibW9ycGgt
cmFuZ2UvdXRpbHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7
dGhpcy5kb21IZWxwZXI9ZSx0aGlzLmNvbnRleHR1YWxFbGVtZW50PXQsdGhpcy5maXJzdE5vZGU9
bnVsbCx0aGlzLmxhc3ROb2RlPW51bGwsdGhpcy5wYXJzZVRleHRBc0hUTUw9ITEsdGhpcy5wYXJl
bnRNb3JwaExpc3Q9bnVsbCx0aGlzLnByZXZpb3VzTW9ycGg9bnVsbCx0aGlzLm5leHRNb3JwaD1u
dWxsfWZ1bmN0aW9uIG4oZSl7dmFyIHQscj1lLm5hbWU7dGhyb3cgdD1yPyJVbnN1cHBvcnRlZCBD
b250ZW50OiBDYW5ub3QgYmluZCB0byBmdW5jdGlvbiBgIityKyJgIjoiVW5zdXBwb3J0ZWQgQ29u
dGVudDogQ2Fubm90IGJpbmQgdG8gZnVuY3Rpb24iLG5ldyBUeXBlRXJyb3IodCl9ci5lbXB0eT1m
dW5jdGlvbihlLHQpe3ZhciBuPW5ldyByKGUsdCk7cmV0dXJuIG4uY2xlYXIoKSxufSxyLmNyZWF0
ZT1mdW5jdGlvbihlLHQsbil7dmFyIGk9bmV3IHIoZSx0KTtyZXR1cm4gaS5zZXROb2RlKG4pLGl9
LHIuYXR0YWNoPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvPW5ldyByKGUsdCk7cmV0dXJuIG8uc2V0
UmFuZ2UobixpKSxvfSxyLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9
PT1lfHx2b2lkIDA9PT1lKXJldHVybiB0aGlzLmNsZWFyKCk7dmFyIHQ9dHlwZW9mIGU7c3dpdGNo
KHQpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gdGhpcy5wYXJzZVRleHRBc0hUTUw/dGhpcy5kb21IZWxw
ZXIuc2V0TW9ycGhIVE1MKHRoaXMsZSk6dGhpcy5zZXRUZXh0KGUpO2Nhc2Uib2JqZWN0IjppZigi
bnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUpcmV0dXJuIHRoaXMuc2V0Tm9kZShlKTtpZigiZnVu
Y3Rpb24iPT10eXBlb2YgZS50b0hUTUwpcmV0dXJuIHRoaXMuc2V0SFRNTChlLnRvSFRNTCgpKTtp
Zih0aGlzLnBhcnNlVGV4dEFzSFRNTClyZXR1cm4gdGhpcy5zZXRIVE1MKGUudG9TdHJpbmcoKSk7
Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6cmV0dXJuIHRoaXMuc2V0VGV4dChlLnRvU3RyaW5n
KCkpO2Nhc2UiZnVuY3Rpb24iOm4oZSk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bnN1
cHBvcnRlZCBjb250ZW50Iil9fSxyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3ZhciBlPXRo
aXMuc2V0Tm9kZSh0aGlzLmRvbUhlbHBlci5jcmVhdGVDb21tZW50KCIiKSk7cmV0dXJuIGV9LHIu
cHJvdG90eXBlLnNldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5maXJzdE5vZGUscj10aGlz
Lmxhc3ROb2RlO3JldHVybiB0JiZyPT09dCYmMz09PXQubm9kZVR5cGU/KHQubm9kZVZhbHVlPWUs
dCk6dGhpcy5zZXROb2RlKGU/dGhpcy5kb21IZWxwZXIuY3JlYXRlVGV4dE5vZGUoZSk6dGhpcy5k
b21IZWxwZXIuY3JlYXRlQ29tbWVudCgiIikpfSxyLnByb3RvdHlwZS5zZXROb2RlPWZ1bmN0aW9u
KGUpe3ZhciB0LHI7c3dpdGNoKGUubm9kZVR5cGUpe2Nhc2UgMzp0PWUscj1lO2JyZWFrO2Nhc2Ug
MTE6dD1lLmZpcnN0Q2hpbGQscj1lLmxhc3RDaGlsZCxudWxsPT09dCYmKHQ9dGhpcy5kb21IZWxw
ZXIuY3JlYXRlQ29tbWVudCgiIiksZS5hcHBlbmRDaGlsZCh0KSxyPXQpO2JyZWFrO2RlZmF1bHQ6
dD1lLHI9ZX1yZXR1cm4gdGhpcy5zZXRSYW5nZSh0LHIpLGV9LHIucHJvdG90eXBlLnNldFJhbmdl
PWZ1bmN0aW9uKGUscil7dmFyIG49dGhpcy5maXJzdE5vZGU7aWYobnVsbCE9PW4pe3ZhciBpPW4u
cGFyZW50Tm9kZTtudWxsIT09aSYmKHQuaW5zZXJ0QmVmb3JlKGksZSxyLG4pLHQuY2xlYXIoaSxu
LHRoaXMubGFzdE5vZGUpKX10aGlzLmZpcnN0Tm9kZT1lLHRoaXMubGFzdE5vZGU9cix0aGlzLnBh
cmVudE1vcnBoTGlzdCYmKHRoaXMuX3N5bmNGaXJzdE5vZGUoKSx0aGlzLl9zeW5jTGFzdE5vZGUo
KSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnVubGluaygpO3ZhciBlPXRo
aXMuZmlyc3ROb2RlLHI9dGhpcy5sYXN0Tm9kZSxuPWUmJmUucGFyZW50Tm9kZTt0aGlzLmZpcnN0
Tm9kZT1udWxsLHRoaXMubGFzdE5vZGU9bnVsbCx0LmNsZWFyKG4sZSxyKX0sci5wcm90b3R5cGUu
dW5saW5rPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wYXJlbnRNb3JwaExpc3QsdD10aGlzLnByZXZp
b3VzTW9ycGgscj10aGlzLm5leHRNb3JwaDtpZih0P3I/KHQubmV4dE1vcnBoPXIsci5wcmV2aW91
c01vcnBoPXQpOih0Lm5leHRNb3JwaD1udWxsLGUubGFzdENoaWxkTW9ycGg9dCk6cj8oci5wcmV2
aW91c01vcnBoPW51bGwsZS5maXJzdENoaWxkTW9ycGg9cik6ZSYmKGUubGFzdENoaWxkTW9ycGg9
ZS5maXJzdENoaWxkTW9ycGg9bnVsbCksdGhpcy5wYXJlbnRNb3JwaExpc3Q9bnVsbCx0aGlzLm5l
eHRNb3JwaD1udWxsLHRoaXMucHJldmlvdXNNb3JwaD1udWxsLGUmJmUubW91bnRlZE1vcnBoKXtp
ZighZS5maXJzdENoaWxkTW9ycGgpcmV0dXJuIHZvaWQgZS5tb3VudGVkTW9ycGguY2xlYXIoKTtl
LmZpcnN0Q2hpbGRNb3JwaC5fc3luY0ZpcnN0Tm9kZSgpLGUubGFzdENoaWxkTW9ycGguX3N5bmNM
YXN0Tm9kZSgpfX0sci5wcm90b3R5cGUuc2V0SFRNTD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmRv
bUhlbHBlci5wYXJzZUhUTUwoZSx0aGlzLmNvbnRleHR1YWxFbGVtZW50KTtyZXR1cm4gdGhpcy5z
ZXROb2RlKHQpfSxyLnByb3RvdHlwZS5zZXRNb3JwaExpc3Q9ZnVuY3Rpb24oZSl7ZS5tb3VudGVk
TW9ycGg9dGhpcyx0aGlzLmNsZWFyKCk7dmFyIHQ9dGhpcy5maXJzdE5vZGU7aWYoZS5maXJzdENo
aWxkTW9ycGgpe3RoaXMuZmlyc3ROb2RlPWUuZmlyc3RDaGlsZE1vcnBoLmZpcnN0Tm9kZSx0aGlz
Lmxhc3ROb2RlPWUubGFzdENoaWxkTW9ycGgubGFzdE5vZGU7Zm9yKHZhciByPWUuZmlyc3RDaGls
ZE1vcnBoO3I7KXt2YXIgbj1yLm5leHRNb3JwaDtyLmluc2VydEJlZm9yZU5vZGUodCxudWxsKSxy
PW59dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfX0sci5wcm90b3R5cGUuX3N5bmNGaXJzdE5v
ZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD10aGlzOyhlPXQucGFyZW50TW9ycGhMaXN0KSYmbnVs
bCE9PWUubW91bnRlZE1vcnBoJiZ0PT09ZS5maXJzdENoaWxkTW9ycGgmJnQuZmlyc3ROb2RlIT09
ZS5tb3VudGVkTW9ycGguZmlyc3ROb2RlOyllLm1vdW50ZWRNb3JwaC5maXJzdE5vZGU9dC5maXJz
dE5vZGUsdD1lLm1vdW50ZWRNb3JwaH0sci5wcm90b3R5cGUuX3N5bmNMYXN0Tm9kZT1mdW5jdGlv
bigpe2Zvcih2YXIgZSx0PXRoaXM7KGU9dC5wYXJlbnRNb3JwaExpc3QpJiZudWxsIT09ZS5tb3Vu
dGVkTW9ycGgmJnQ9PT1lLmxhc3RDaGlsZE1vcnBoJiZ0Lmxhc3ROb2RlIT09ZS5tb3VudGVkTW9y
cGgubGFzdE5vZGU7KWUubW91bnRlZE1vcnBoLmxhc3ROb2RlPXQubGFzdE5vZGUsdD1lLm1vdW50
ZWRNb3JwaH0sci5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlTm9kZT1mdW5jdGlvbihlLHIpe3QuaW5z
ZXJ0QmVmb3JlKGUsdGhpcy5maXJzdE5vZGUsdGhpcy5sYXN0Tm9kZSxyKX0sci5wcm90b3R5cGUu
YXBwZW5kVG9Ob2RlPWZ1bmN0aW9uKGUpe3QuaW5zZXJ0QmVmb3JlKGUsdGhpcy5maXJzdE5vZGUs
dGhpcy5sYXN0Tm9kZSxudWxsKX0sZS5kZWZhdWx0PXJ9KSxlKCJtb3JwaC1yYW5nZS9tb3JwaC1s
aXN0IixbImV4cG9ydHMiLCJtb3JwaC1yYW5nZS91dGlscyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIHIoKXt0aGlzLmZpcnN0Q2hpbGRNb3JwaD1udWxsLHRoaXMubGFzdENo
aWxkTW9ycGg9bnVsbCx0aGlzLm1vdW50ZWRNb3JwaD1udWxsfXZhciBuPXIucHJvdG90eXBlO24u
Y2xlYXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5maXJzdENoaWxkTW9ycGg7ZTspe3ZhciB0
PWUubmV4dE1vcnBoO2UucHJldmlvdXNNb3JwaD1udWxsLGUubmV4dE1vcnBoPW51bGwsZS5wYXJl
bnRNb3JwaExpc3Q9bnVsbCxlPXR9dGhpcy5maXJzdENoaWxkTW9ycGg9dGhpcy5sYXN0Q2hpbGRN
b3JwaD1udWxsfSxuLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LG4uYXBwZW5kTW9ycGg9ZnVuY3Rpb24o
ZSl7dGhpcy5pbnNlcnRCZWZvcmVNb3JwaChlLG51bGwpfSxuLmluc2VydEJlZm9yZU1vcnBoPWZ1
bmN0aW9uKGUscil7aWYobnVsbCE9PWUucGFyZW50TW9ycGhMaXN0JiZlLnVubGluaygpLHImJnIu
cGFyZW50TW9ycGhMaXN0IT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIlRoZSBtb3JwaCBiZWZvcmUg
d2hpY2ggdGhlIG5ldyBtb3JwaCBpcyB0byBiZSBpbnNlcnRlZCBpcyBub3QgYSBjaGlsZCBvZiB0
aGlzIG1vcnBoLiIpO3ZhciBuPXRoaXMubW91bnRlZE1vcnBoO2lmKG4pe3ZhciBpPW4uZmlyc3RO
b2RlLnBhcmVudE5vZGUsbz1yP3IuZmlyc3ROb2RlOm4ubGFzdE5vZGUubmV4dFNpYmxpbmc7dC5p
bnNlcnRCZWZvcmUoaSxlLmZpcnN0Tm9kZSxlLmxhc3ROb2RlLG8pLHRoaXMuZmlyc3RDaGlsZE1v
cnBofHx0LmNsZWFyKHRoaXMubW91bnRlZE1vcnBoLmZpcnN0Tm9kZS5wYXJlbnROb2RlLHRoaXMu
bW91bnRlZE1vcnBoLmZpcnN0Tm9kZSx0aGlzLm1vdW50ZWRNb3JwaC5sYXN0Tm9kZSl9ZS5wYXJl
bnRNb3JwaExpc3Q9dGhpczt2YXIgYT1yP3IucHJldmlvdXNNb3JwaDp0aGlzLmxhc3RDaGlsZE1v
cnBoO2E/KGEubmV4dE1vcnBoPWUsZS5wcmV2aW91c01vcnBoPWEpOnRoaXMuZmlyc3RDaGlsZE1v
cnBoPWUscj8oci5wcmV2aW91c01vcnBoPWUsZS5uZXh0TW9ycGg9cik6dGhpcy5sYXN0Q2hpbGRN
b3JwaD1lLHRoaXMuZmlyc3RDaGlsZE1vcnBoLl9zeW5jRmlyc3ROb2RlKCksdGhpcy5sYXN0Q2hp
bGRNb3JwaC5fc3luY0xhc3ROb2RlKCl9LG4ucmVtb3ZlQ2hpbGRNb3JwaD1mdW5jdGlvbihlKXtp
ZihlLnBhcmVudE1vcnBoTGlzdCE9PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVtb3Zl
IGEgbW9ycGggZnJvbSBhIHBhcmVudCBpdCBpcyBub3QgaW5zaWRlIG9mIik7ZS5kZXN0cm95KCl9
LGUuZGVmYXVsdD1yfSksZSgibW9ycGgtcmFuZ2UvbW9ycGgtbGlzdC51bWQiLFsiZXhwb3J0cyIs
Im1vcnBoLXJhbmdlL21vcnBoLWxpc3QiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjshZnVu
Y3Rpb24odCxyKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShb
XSxyKToib2JqZWN0Ij09dHlwZW9mIGU/bW9kdWxlLmV4cG9ydHM9cigpOnQuTW9ycGhMaXN0PXIo
KX0odm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH0pfSksZSgibW9ycGgtcmFuZ2Uv
dXRpbHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUs
dCxyKXtpZihlKXt2YXIgbixpPXQ7ZG97aWYobj1pLm5leHRTaWJsaW5nLGUucmVtb3ZlQ2hpbGQo
aSksaT09PXIpYnJlYWs7aT1ufXdoaWxlKGkpfX1mdW5jdGlvbiByKGUsdCxyLG4pe3ZhciBpLG89
dDtkb3tpZihpPW8ubmV4dFNpYmxpbmcsZS5pbnNlcnRCZWZvcmUobyxuKSxvPT09cilicmVhaztv
PWl9d2hpbGUobyl9ZS5jbGVhcj10LGUuaW5zZXJ0QmVmb3JlPXJ9KSxlKCJyb3V0ZS1yZWNvZ25p
emVyIixbImV4cG9ydHMiLCJyb3V0ZS1yZWNvZ25pemVyL2RzbCJdLGZ1bmN0aW9uKGUsdCl7InVz
ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5w
cm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBuKGUpe3RoaXMuc3RyaW5nPWV9ZnVu
Y3Rpb24gaShlKXt0aGlzLm5hbWU9ZX1mdW5jdGlvbiBvKGUpe3RoaXMubmFtZT1lfWZ1bmN0aW9u
IGEoKXt9ZnVuY3Rpb24gcyhlLHQscil7Ii8iPT09ZS5jaGFyQXQoMCkmJihlPWUuc3Vic3RyKDEp
KTtmb3IodmFyIHM9ZS5zcGxpdCgiLyIpLHU9W10sbD0wLGM9cy5sZW5ndGg7bDxjO2wrKyl7dmFy
IGYsZD1zW2xdOyhmPWQubWF0Y2goL146KFteXC9dKykkLykpPyh1LnB1c2gobmV3IGkoZlsxXSkp
LHQucHVzaChmWzFdKSxyLmR5bmFtaWNzKyspOihmPWQubWF0Y2goL15cKihbXlwvXSspJC8pKT8o
dS5wdXNoKG5ldyBvKGZbMV0pKSx0LnB1c2goZlsxXSksci5zdGFycysrKToiIj09PWQ/dS5wdXNo
KG5ldyBhKToodS5wdXNoKG5ldyBuKGQpKSxyLnN0YXRpY3MrKyl9cmV0dXJuIHV9ZnVuY3Rpb24g
dShlKXt0aGlzLmNoYXJTcGVjPWUsdGhpcy5uZXh0U3RhdGVzPVtdfWZ1bmN0aW9uIGwoZSl7cmV0
dXJuIGUuc29ydChmdW5jdGlvbihlLHQpe2lmKGUudHlwZXMuc3RhcnMhPT10LnR5cGVzLnN0YXJz
KXJldHVybiBlLnR5cGVzLnN0YXJzLXQudHlwZXMuc3RhcnM7aWYoZS50eXBlcy5zdGFycyl7aWYo
ZS50eXBlcy5zdGF0aWNzIT09dC50eXBlcy5zdGF0aWNzKXJldHVybiB0LnR5cGVzLnN0YXRpY3Mt
ZS50eXBlcy5zdGF0aWNzO2lmKGUudHlwZXMuZHluYW1pY3MhPT10LnR5cGVzLmR5bmFtaWNzKXJl
dHVybiB0LnR5cGVzLmR5bmFtaWNzLWUudHlwZXMuZHluYW1pY3N9cmV0dXJuIGUudHlwZXMuZHlu
YW1pY3MhPT10LnR5cGVzLmR5bmFtaWNzP2UudHlwZXMuZHluYW1pY3MtdC50eXBlcy5keW5hbWlj
czplLnR5cGVzLnN0YXRpY3MhPT10LnR5cGVzLnN0YXRpY3M/dC50eXBlcy5zdGF0aWNzLWUudHlw
ZXMuc3RhdGljczowfSl9ZnVuY3Rpb24gYyhlLHQpe2Zvcih2YXIgcj1bXSxuPTAsaT1lLmxlbmd0
aDtuPGk7bisrKXt2YXIgbz1lW25dO3I9ci5jb25jYXQoby5tYXRjaCh0KSl9cmV0dXJuIHJ9ZnVu
Y3Rpb24gZihlKXt0aGlzLnF1ZXJ5UGFyYW1zPWV8fHt9fWZ1bmN0aW9uIGQoZSx0LHIpe2Zvcih2
YXIgbj1lLmhhbmRsZXJzLGk9ZS5yZWdleCxvPXQubWF0Y2goaSksYT0xLHM9bmV3IGYociksdT0w
LGw9bi5sZW5ndGg7dTxsO3UrKyl7Zm9yKHZhciBjPW5bdV0sZD1jLm5hbWVzLHA9e30saD0wLG09
ZC5sZW5ndGg7aDxtO2grKylwW2RbaF1dPW9bYSsrXTtzLnB1c2goe2hhbmRsZXI6Yy5oYW5kbGVy
LHBhcmFtczpwLGlzRHluYW1pYzohIWQubGVuZ3RofSl9cmV0dXJuIHN9ZnVuY3Rpb24gcChlLHQp
e3JldHVybiB0LmVhY2hDaGFyKGZ1bmN0aW9uKHQpe2U9ZS5wdXQodCl9KSxlfWZ1bmN0aW9uIGgo
ZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC9cKy9nbSwiJTIwIiksZGVjb2RlVVJJQ29tcG9uZW50KGUp
fXZhciBtPVsiLyIsIi4iLCIqIiwiKyIsIj8iLCJ8IiwiKCIsIikiLCJbIiwiXSIsInsiLCJ9Iiwi
XFwiXSx2PW5ldyBSZWdFeHAoIihcXCIrbS5qb2luKCJ8XFwiKSsiKSIsImciKTtuLnByb3RvdHlw
ZT17ZWFjaENoYXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9dGhpcy5zdHJpbmcsbj0wLGk9ci5s
ZW5ndGg7bjxpO24rKyl0PXIuY2hhckF0KG4pLGUoe3ZhbGlkQ2hhcnM6dH0pfSxyZWdleDpmdW5j
dGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5yZXBsYWNlKHYsIlxcJDEiKX0sZ2VuZXJhdGU6ZnVu
Y3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJpbmd9fSxpLnByb3RvdHlwZT17ZWFjaENoYXI6ZnVuY3Rp
b24oZSl7ZSh7aW52YWxpZENoYXJzOiIvIixyZXBlYXQ6ITB9KX0scmVnZXg6ZnVuY3Rpb24oKXty
ZXR1cm4iKFteL10rKSJ9LGdlbmVyYXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlW3RoaXMubmFtZV19
fSxvLnByb3RvdHlwZT17ZWFjaENoYXI6ZnVuY3Rpb24oZSl7ZSh7aW52YWxpZENoYXJzOiIiLHJl
cGVhdDohMH0pfSxyZWdleDpmdW5jdGlvbigpe3JldHVybiIoLispIn0sZ2VuZXJhdGU6ZnVuY3Rp
b24oZSl7cmV0dXJuIGVbdGhpcy5uYW1lXX19LGEucHJvdG90eXBlPXtlYWNoQ2hhcjpmdW5jdGlv
bigpe30scmVnZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2VuZXJhdGU6ZnVuY3Rpb24oKXtyZXR1
cm4iIn19LHUucHJvdG90eXBlPXtnZXQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMubmV4dFN0
YXRlcyxyPTAsbj10Lmxlbmd0aDtyPG47cisrKXt2YXIgaT10W3JdLG89aS5jaGFyU3BlYy52YWxp
ZENoYXJzPT09ZS52YWxpZENoYXJzO2lmKG89byYmaS5jaGFyU3BlYy5pbnZhbGlkQ2hhcnM9PT1l
LmludmFsaWRDaGFycylyZXR1cm4gaX19LHB1dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4odD10
aGlzLmdldChlKSk/dDoodD1uZXcgdShlKSx0aGlzLm5leHRTdGF0ZXMucHVzaCh0KSxlLnJlcGVh
dCYmdC5uZXh0U3RhdGVzLnB1c2godCksdCl9LG1hdGNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxy
LG4saT10aGlzLm5leHRTdGF0ZXMsbz1bXSxhPTAscz1pLmxlbmd0aDthPHM7YSsrKXQ9aVthXSxy
PXQuY2hhclNwZWMsInVuZGVmaW5lZCIhPXR5cGVvZihuPXIudmFsaWRDaGFycyk/bi5pbmRleE9m
KGUpIT09LTEmJm8ucHVzaCh0KToidW5kZWZpbmVkIiE9dHlwZW9mKG49ci5pbnZhbGlkQ2hhcnMp
JiZuLmluZGV4T2YoZSk9PT0tMSYmby5wdXNoKHQpO3JldHVybiBvfX07dmFyIGI9T2JqZWN0LmNy
ZWF0ZXx8ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGU9ZSxuZXcg
dH07Zi5wcm90b3R5cGU9Yih7c3BsaWNlOkFycmF5LnByb3RvdHlwZS5zcGxpY2Usc2xpY2U6QXJy
YXkucHJvdG90eXBlLnNsaWNlLHB1c2g6QXJyYXkucHJvdG90eXBlLnB1c2gsbGVuZ3RoOjAscXVl
cnlQYXJhbXM6bnVsbH0pO3ZhciBnPWZ1bmN0aW9uKCl7dGhpcy5yb290U3RhdGU9bmV3IHUsdGhp
cy5uYW1lcz17fX07Zy5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuPXRo
aXMucm9vdFN0YXRlLGk9Il4iLG89e3N0YXRpY3M6MCxkeW5hbWljczowLHN0YXJzOjB9LHU9W10s
bD1bXSxjPSEwLGY9MCxkPWUubGVuZ3RoO2Y8ZDtmKyspe3ZhciBoPWVbZl0sbT1bXSx2PXMoaC5w
YXRoLG0sbyk7bD1sLmNvbmNhdCh2KTtmb3IodmFyIGI9MCxnPXYubGVuZ3RoO2I8ZztiKyspe3Zh
ciB5PXZbYl07eSBpbnN0YW5jZW9mIGF8fChjPSExLG49bi5wdXQoe3ZhbGlkQ2hhcnM6Ii8ifSks
aSs9Ii8iLG49cChuLHkpLGkrPXkucmVnZXgoKSl9dmFyIF89e2hhbmRsZXI6aC5oYW5kbGVyLG5h
bWVzOm19O3UucHVzaChfKX1jJiYobj1uLnB1dCh7dmFsaWRDaGFyczoiLyJ9KSxpKz0iLyIpLG4u
aGFuZGxlcnM9dSxuLnJlZ2V4PW5ldyBSZWdFeHAoaSsiJCIpLG4udHlwZXM9bywocj10JiZ0LmFz
KSYmKHRoaXMubmFtZXNbcl09e3NlZ21lbnRzOmwsaGFuZGxlcnM6dX0pfSxoYW5kbGVyc0Zvcjpm
dW5jdGlvbihlKXt2YXIgdD10aGlzLm5hbWVzW2VdLHI9W107aWYoIXQpdGhyb3cgbmV3IEVycm9y
KCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiK2UpO2Zvcih2YXIgbj0wLGk9dC5oYW5kbGVycy5s
ZW5ndGg7bjxpO24rKylyLnB1c2godC5oYW5kbGVyc1tuXSk7cmV0dXJuIHJ9LGhhc1JvdXRlOmZ1
bmN0aW9uKGUpe3JldHVybiEhdGhpcy5uYW1lc1tlXX0sZ2VuZXJhdGU6ZnVuY3Rpb24oZSx0KXt2
YXIgcj10aGlzLm5hbWVzW2VdLG49IiI7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBu
byByb3V0ZSBuYW1lZCAiK2UpO2Zvcih2YXIgaT1yLnNlZ21lbnRzLG89MCxzPWkubGVuZ3RoO288
cztvKyspe3ZhciB1PWlbb107dSBpbnN0YW5jZW9mIGF8fChuKz0iLyIsbis9dS5nZW5lcmF0ZSh0
KSl9cmV0dXJuIi8iIT09bi5jaGFyQXQoMCkmJihuPSIvIituKSx0JiZ0LnF1ZXJ5UGFyYW1zJiYo
bis9dGhpcy5nZW5lcmF0ZVF1ZXJ5U3RyaW5nKHQucXVlcnlQYXJhbXMsci5oYW5kbGVycykpLG59
LGdlbmVyYXRlUXVlcnlTdHJpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxpPVtdO2Zvcih2YXIg
byBpbiBlKWUuaGFzT3duUHJvcGVydHkobykmJmkucHVzaChvKTtpLnNvcnQoKTtmb3IodmFyIGE9
MCxzPWkubGVuZ3RoO2E8czthKyspe289aVthXTt2YXIgdT1lW29dO2lmKG51bGwhPXUpe3ZhciBs
PWVuY29kZVVSSUNvbXBvbmVudChvKTtpZihyKHUpKWZvcih2YXIgYz0wLGY9dS5sZW5ndGg7Yzxm
O2MrKyl7dmFyIGQ9bysiW109IitlbmNvZGVVUklDb21wb25lbnQodVtjXSk7bi5wdXNoKGQpfWVs
c2UgbCs9Ij0iK2VuY29kZVVSSUNvbXBvbmVudCh1KSxuLnB1c2gobCl9fXJldHVybiAwPT09bi5s
ZW5ndGg/IiI6Ij8iK24uam9pbigiJiIpfSxwYXJzZVF1ZXJ5U3RyaW5nOmZ1bmN0aW9uKGUpe2Zv
cih2YXIgdD1lLnNwbGl0KCImIikscj17fSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpLG89dFtu
XS5zcGxpdCgiPSIpLGE9aChvWzBdKSxzPWEubGVuZ3RoLHU9ITE7MT09PW8ubGVuZ3RoP2k9InRy
dWUiOihzPjImJiJbXSI9PT1hLnNsaWNlKHMtMikmJih1PSEwLGE9YS5zbGljZSgwLHMtMiksclth
XXx8KHJbYV09W10pKSxpPW9bMV0/aChvWzFdKToiIiksdT9yW2FdLnB1c2goaSk6clthXT1pfXJl
dHVybiByfSxyZWNvZ25pemU6ZnVuY3Rpb24oZSl7dmFyIHQscixuLGksbz1bdGhpcy5yb290U3Rh
dGVdLGE9e30scz0hMTtpZihpPWUuaW5kZXhPZigiPyIpLGkhPT0tMSl7dmFyIHU9ZS5zdWJzdHIo
aSsxLGUubGVuZ3RoKTtlPWUuc3Vic3RyKDAsaSksYT10aGlzLnBhcnNlUXVlcnlTdHJpbmcodSl9
Zm9yKGU9ZGVjb2RlVVJJKGUpLCIvIiE9PWUuY2hhckF0KDApJiYoZT0iLyIrZSksdD1lLmxlbmd0
aCx0PjEmJiIvIj09PWUuY2hhckF0KHQtMSkmJihlPWUuc3Vic3RyKDAsdC0xKSxzPSEwKSxyPTAs
bj1lLmxlbmd0aDtyPG4mJihvPWMobyxlLmNoYXJBdChyKSksby5sZW5ndGgpO3IrKyk7dmFyIGY9
W107Zm9yKHI9MCxuPW8ubGVuZ3RoO3I8bjtyKyspb1tyXS5oYW5kbGVycyYmZi5wdXNoKG9bcl0p
O289bChmKTt2YXIgcD1mWzBdO2lmKHAmJnAuaGFuZGxlcnMpcmV0dXJuIHMmJiIoLispJCI9PT1w
LnJlZ2V4LnNvdXJjZS5zbGljZSgtNSkmJihlKz0iLyIpLGQocCxlLGEpfX0sZy5wcm90b3R5cGUu
bWFwPXQuZGVmYXVsdCxnLlZFUlNJT049IjAuMS41IixlLmRlZmF1bHQ9Z30pLGUoInJvdXRlLXJl
Y29nbml6ZXIvZHNsIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gdChlLHQscil7dGhpcy5wYXRoPWUsdGhpcy5tYXRjaGVyPXQsdGhpcy5kZWxlZ2F0ZT1yfWZ1
bmN0aW9uIHIoZSl7dGhpcy5yb3V0ZXM9e30sdGhpcy5jaGlsZHJlbj17fSx0aGlzLnRhcmdldD1l
fWZ1bmN0aW9uIG4oZSxyLGkpe3JldHVybiBmdW5jdGlvbihvLGEpe3ZhciBzPWUrbztyZXR1cm4g
YT92b2lkIGEobihzLHIsaSkpOm5ldyB0KGUrbyxyLGkpfX1mdW5jdGlvbiBpKGUsdCxyKXtmb3Io
dmFyIG49MCxpPTAsbz1lLmxlbmd0aDtpPG87aSsrKW4rPWVbaV0ucGF0aC5sZW5ndGg7dD10LnN1
YnN0cihuKTt2YXIgYT17cGF0aDp0LGhhbmRsZXI6cn07ZS5wdXNoKGEpfWZ1bmN0aW9uIG8oZSx0
LHIsbil7dmFyIGE9dC5yb3V0ZXM7Zm9yKHZhciBzIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShz
KSl7dmFyIHU9ZS5zbGljZSgpO2kodSxzLGFbc10pLHQuY2hpbGRyZW5bc10/byh1LHQuY2hpbGRy
ZW5bc10scixuKTpyLmNhbGwobix1KX19dC5wcm90b3R5cGU9e3RvOmZ1bmN0aW9uKGUsdCl7dmFy
IHI9dGhpcy5kZWxlZ2F0ZTtpZihyJiZyLndpbGxBZGRSb3V0ZSYmKGU9ci53aWxsQWRkUm91dGUo
dGhpcy5tYXRjaGVyLnRhcmdldCxlKSksdGhpcy5tYXRjaGVyLmFkZCh0aGlzLnBhdGgsZSksdCl7
aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiWW91IG11c3QgaGF2ZSBhbiBhcmd1bWVu
dCBpbiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIGB0b2AiKTt0aGlzLm1hdGNoZXIuYWRkQ2hpbGQo
dGhpcy5wYXRoLGUsdCx0aGlzLmRlbGVnYXRlKX1yZXR1cm4gdGhpc319LHIucHJvdG90eXBlPXth
ZGQ6ZnVuY3Rpb24oZSx0KXt0aGlzLnJvdXRlc1tlXT10fSxhZGRDaGlsZDpmdW5jdGlvbihlLHQs
aSxvKXt2YXIgYT1uZXcgcih0KTt0aGlzLmNoaWxkcmVuW2VdPWE7dmFyIHM9bihlLGEsbyk7byYm
by5jb250ZXh0RW50ZXJlZCYmby5jb250ZXh0RW50ZXJlZCh0LHMpLGkocyl9fSxlLmRlZmF1bHQ9
ZnVuY3Rpb24oZSx0KXt2YXIgaT1uZXcgcjtlKG4oIiIsaSx0aGlzLmRlbGVnYXRlKSksbyhbXSxp
LGZ1bmN0aW9uKGUpe3Q/dCh0aGlzLGUpOnRoaXMuYWRkKGUpfSx0aGlzKX19KSxlKCJyb3V0ZXIi
LFsiZXhwb3J0cyIsInJvdXRlci9yb3V0ZXIiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijtl
LmRlZmF1bHQ9dC5kZWZhdWx0fSksZSgicm91dGVyL2hhbmRsZXItaW5mbyIsWyJleHBvcnRzIiwi
cm91dGVyL3V0aWxzIiwicnN2cC9wcm9taXNlIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0
IjtmdW5jdGlvbiBuKGUpe3ZhciByPWV8fHt9O3QubWVyZ2UodGhpcyxyKSx0aGlzLmluaXRpYWxp
emUocil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlXiF0KXJldHVybiExO2lmKCFlKXJldHVybiEwO2Zv
cih2YXIgciBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkocikmJmVbcl0hPT10W3JdKXJldHVybiEx
O3JldHVybiEwfW4ucHJvdG90eXBlPXtuYW1lOm51bGwsaGFuZGxlcjpudWxsLHBhcmFtczpudWxs
LGNvbnRleHQ6bnVsbCxmYWN0b3J5Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe30sbG9nOmZ1
bmN0aW9uKGUsdCl7ZS5sb2cmJmUubG9nKHRoaXMubmFtZSsiOiAiK3QpfSxwcm9taXNlTGFiZWw6
ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvbWlzZUxhYmVsKCInIit0aGlzLm5hbWUrIicgIitlKX0s
Z2V0VW5yZXNvbHZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24o
KXtyZXR1cm4gdGhpcy5wYXJhbXN8fHt9fSxyZXNvbHZlOmZ1bmN0aW9uKGUsbil7dmFyIGk9dC5i
aW5kKHRoaXMsdGhpcy5jaGVja0ZvckFib3J0LGUpLG89dC5iaW5kKHRoaXMsdGhpcy5ydW5CZWZv
cmVNb2RlbEhvb2ssbiksYT10LmJpbmQodGhpcyx0aGlzLmdldE1vZGVsLG4pLHM9dC5iaW5kKHRo
aXMsdGhpcy5ydW5BZnRlck1vZGVsSG9vayxuKSx1PXQuYmluZCh0aGlzLHRoaXMuYmVjb21lUmVz
b2x2ZWQsbik7cmV0dXJuIHIuZGVmYXVsdC5yZXNvbHZlKHZvaWQgMCx0aGlzLnByb21pc2VMYWJl
bCgiU3RhcnQgaGFuZGxlciIpKS50aGVuKGksbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiQ2hlY2sg
Zm9yIGFib3J0IikpLnRoZW4obyxudWxsLHRoaXMucHJvbWlzZUxhYmVsKCJCZWZvcmUgbW9kZWwi
KSkudGhlbihpLG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQgZHVyaW5n
ICdiZWZvcmVNb2RlbCcgaG9vayIpKS50aGVuKGEsbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiTW9k
ZWwiKSkudGhlbihpLG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQgaW4g
J21vZGVsJyBob29rIikpLnRoZW4ocyxudWxsLHRoaXMucHJvbWlzZUxhYmVsKCJBZnRlciBtb2Rl
bCIpKS50aGVuKGksbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiQ2hlY2sgaWYgYWJvcnRlZCBpbiAn
YWZ0ZXJNb2RlbCcgaG9vayIpKS50aGVuKHUsbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiQmVjb21l
IHJlc29sdmVkIikpfSxydW5CZWZvcmVNb2RlbEhvb2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJp
Z2dlciYmZS50cmlnZ2VyKCEwLCJ3aWxsUmVzb2x2ZU1vZGVsIixlLHRoaXMuaGFuZGxlciksdGhp
cy5ydW5TaGFyZWRNb2RlbEhvb2soZSwiYmVmb3JlTW9kZWwiLFtdKX0scnVuQWZ0ZXJNb2RlbEhv
b2s6ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLm5hbWU7cmV0dXJuIHRoaXMuc3Rhc2hSZXNvbHZl
ZE1vZGVsKGUsdCksdGhpcy5ydW5TaGFyZWRNb2RlbEhvb2soZSwiYWZ0ZXJNb2RlbCIsW3RdKS50
aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVzb2x2ZWRNb2RlbHNbcl19LG51bGwsdGhpcy5wcm9t
aXNlTGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgcmV0dXJuIG1vZGVsIHZhbHVl
IikpfSxydW5TaGFyZWRNb2RlbEhvb2s6ZnVuY3Rpb24oZSxuLGkpe3RoaXMubG9nKGUsImNhbGxp
bmcgIituKyIgaG9vayIpLHRoaXMucXVlcnlQYXJhbXMmJmkucHVzaCh0aGlzLnF1ZXJ5UGFyYW1z
KSxpLnB1c2goZSk7dmFyIG89dC5hcHBseUhvb2sodGhpcy5oYW5kbGVyLG4saSk7cmV0dXJuIG8m
Jm8uaXNUcmFuc2l0aW9uJiYobz1udWxsKSxyLmRlZmF1bHQucmVzb2x2ZShvLHRoaXMucHJvbWlz
ZUxhYmVsKCJSZXNvbHZlIHZhbHVlIHJldHVybmVkIGZyb20gb25lIG9mIHRoZSBtb2RlbCBob29r
cyIpKTsKK30sZ2V0TW9kZWw6bnVsbCxjaGVja0ZvckFib3J0OmZ1bmN0aW9uKGUsdCl7cmV0dXJu
IHIuZGVmYXVsdC5yZXNvbHZlKGUoKSx0aGlzLnByb21pc2VMYWJlbCgiQ2hlY2sgZm9yIGFib3J0
IikpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdH0sbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiSWdu
b3JlIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBjb250aW51ZSIpKX0sc3Rhc2hSZXNvbHZlZE1vZGVs
OmZ1bmN0aW9uKGUsdCl7ZS5yZXNvbHZlZE1vZGVscz1lLnJlc29sdmVkTW9kZWxzfHx7fSxlLnJl
c29sdmVkTW9kZWxzW3RoaXMubmFtZV09dH0sYmVjb21lUmVzb2x2ZWQ6ZnVuY3Rpb24oZSx0KXt2
YXIgcj10aGlzLnNlcmlhbGl6ZSh0KTtyZXR1cm4gZSYmKHRoaXMuc3Rhc2hSZXNvbHZlZE1vZGVs
KGUsdCksZS5wYXJhbXM9ZS5wYXJhbXN8fHt9LGUucGFyYW1zW3RoaXMubmFtZV09ciksdGhpcy5m
YWN0b3J5KCJyZXNvbHZlZCIse2NvbnRleHQ6dCxuYW1lOnRoaXMubmFtZSxoYW5kbGVyOnRoaXMu
aGFuZGxlcixwYXJhbXM6cn0pfSxzaG91bGRTdXBlcmNlZGU6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0
dXJuITA7dmFyIHQ9ZS5jb250ZXh0PT09dGhpcy5jb250ZXh0O3JldHVybiBlLm5hbWUhPT10aGlz
Lm5hbWV8fHRoaXMuaGFzT3duUHJvcGVydHkoImNvbnRleHQiKSYmIXR8fHRoaXMuaGFzT3duUHJv
cGVydHkoInBhcmFtcyIpJiYhaSh0aGlzLnBhcmFtcyxlLnBhcmFtcyl9fSxlLmRlZmF1bHQ9bn0p
LGUoInJvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeSIsWyJleHBvcnRzIiwicm91dGVyL2hhbmRs
ZXItaW5mby9yZXNvbHZlZC1oYW5kbGVyLWluZm8iLCJyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVz
b2x2ZWQtaGFuZGxlci1pbmZvLWJ5LW9iamVjdCIsInJvdXRlci9oYW5kbGVyLWluZm8vdW5yZXNv
bHZlZC1oYW5kbGVyLWluZm8tYnktcGFyYW0iXSxmdW5jdGlvbihlLHQscixuKXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gaShlLHQpe3ZhciByPWkua2xhc3Nlc1tlXSxuPW5ldyByKHR8fHt9KTtyZXR1
cm4gbi5mYWN0b3J5PWksbn1pLmtsYXNzZXM9e3Jlc29sdmVkOnQuZGVmYXVsdCxwYXJhbTpuLmRl
ZmF1bHQsb2JqZWN0OnIuZGVmYXVsdH0sZS5kZWZhdWx0PWl9KSxlKCJyb3V0ZXIvaGFuZGxlci1p
bmZvL3Jlc29sdmVkLWhhbmRsZXItaW5mbyIsWyJleHBvcnRzIiwicm91dGVyL2hhbmRsZXItaW5m
byIsInJvdXRlci91dGlscyIsInJzdnAvcHJvbWlzZSJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ug
c3RyaWN0Ijt2YXIgaT1yLnN1YmNsYXNzKHQuZGVmYXVsdCx7cmVzb2x2ZTpmdW5jdGlvbihlLHQp
e3JldHVybiB0JiZ0LnJlc29sdmVkTW9kZWxzJiYodC5yZXNvbHZlZE1vZGVsc1t0aGlzLm5hbWVd
PXRoaXMuY29udGV4dCksbi5kZWZhdWx0LnJlc29sdmUodGhpcyx0aGlzLnByb21pc2VMYWJlbCgi
UmVzb2x2ZSIpKX0sZ2V0VW5yZXNvbHZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZhY3Rvcnko
InBhcmFtIix7bmFtZTp0aGlzLm5hbWUsaGFuZGxlcjp0aGlzLmhhbmRsZXIscGFyYW1zOnRoaXMu
cGFyYW1zfSl9LGlzUmVzb2x2ZWQ6ITB9KTtlLmRlZmF1bHQ9aX0pLGUoInJvdXRlci9oYW5kbGVy
LWluZm8vdW5yZXNvbHZlZC1oYW5kbGVyLWluZm8tYnktb2JqZWN0IixbImV4cG9ydHMiLCJyb3V0
ZXIvaGFuZGxlci1pbmZvIiwicm91dGVyL3V0aWxzIiwicnN2cC9wcm9taXNlIl0sZnVuY3Rpb24o
ZSx0LHIsbil7InVzZSBzdHJpY3QiO3ZhciBpPXIuc3ViY2xhc3ModC5kZWZhdWx0LHtnZXRNb2Rl
bDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb2coZSx0aGlzLm5hbWUrIjogcmVzb2x2aW5nIHBy
b3ZpZGVkIG1vZGVsIiksbi5kZWZhdWx0LnJlc29sdmUodGhpcy5jb250ZXh0KX0saW5pdGlhbGl6
ZTpmdW5jdGlvbihlKXt0aGlzLm5hbWVzPWUubmFtZXN8fFtdLHRoaXMuY29udGV4dD1lLmNvbnRl
eHR9LHNlcmlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgdD1lfHx0aGlzLmNvbnRleHQsbj10aGlzLm5h
bWVzLGk9dGhpcy5oYW5kbGVyLG89e307aWYoci5pc1BhcmFtKHQpKXJldHVybiBvW25bMF1dPXQs
bztpZihpLnNlcmlhbGl6ZSlyZXR1cm4gaS5zZXJpYWxpemUodCxuKTtpZigxPT09bi5sZW5ndGgp
e3ZhciBhPW5bMF07cmV0dXJuL19pZCQvLnRlc3QoYSk/b1thXT10LmlkOm9bYV09dCxvfX19KTtl
LmRlZmF1bHQ9aX0pLGUoInJvdXRlci9oYW5kbGVyLWluZm8vdW5yZXNvbHZlZC1oYW5kbGVyLWlu
Zm8tYnktcGFyYW0iLFsiZXhwb3J0cyIsInJvdXRlci9oYW5kbGVyLWluZm8iLCJyb3V0ZXIvdXRp
bHMiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIuc3ViY2xhc3ModC5kZWZh
dWx0LHtpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3RoaXMucGFyYW1zPWUucGFyYW1zfHx7fX0sZ2V0
TW9kZWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJhbXM7ZSYmZS5xdWVyeVBhcmFtcyYmKHQ9
e30sci5tZXJnZSh0LHRoaXMucGFyYW1zKSx0LnF1ZXJ5UGFyYW1zPWUucXVlcnlQYXJhbXMpO3Zh
ciBuPXRoaXMuaGFuZGxlcixpPXIucmVzb2x2ZUhvb2sobiwiZGVzZXJpYWxpemUiKXx8ci5yZXNv
bHZlSG9vayhuLCJtb2RlbCIpO3JldHVybiB0aGlzLnJ1blNoYXJlZE1vZGVsSG9vayhlLGksW3Rd
KX19KTtlLmRlZmF1bHQ9bn0pLGUoInJvdXRlci9yb3V0ZXIiLFsiZXhwb3J0cyIsInJvdXRlLXJl
Y29nbml6ZXIiLCJyc3ZwL3Byb21pc2UiLCJyb3V0ZXIvdXRpbHMiLCJyb3V0ZXIvdHJhbnNpdGlv
bi1zdGF0ZSIsInJvdXRlci90cmFuc2l0aW9uIiwicm91dGVyL3RyYW5zaXRpb24taW50ZW50L25h
bWVkLXRyYW5zaXRpb24taW50ZW50Iiwicm91dGVyL3RyYW5zaXRpb24taW50ZW50L3VybC10cmFu
c2l0aW9uLWludGVudCIsInJvdXRlci9oYW5kbGVyLWluZm8iXSxmdW5jdGlvbihlLHQscixuLGks
byxhLHMsdSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwoZSl7dmFyIHI9ZXx8e307dGhpcy5nZXRI
YW5kbGVyPXIuZ2V0SGFuZGxlcnx8dGhpcy5nZXRIYW5kbGVyLHRoaXMudXBkYXRlVVJMPXIudXBk
YXRlVVJMfHx0aGlzLnVwZGF0ZVVSTCx0aGlzLnJlcGxhY2VVUkw9ci5yZXBsYWNlVVJMfHx0aGlz
LnJlcGxhY2VVUkwsdGhpcy5kaWRUcmFuc2l0aW9uPXIuZGlkVHJhbnNpdGlvbnx8dGhpcy5kaWRU
cmFuc2l0aW9uLHRoaXMud2lsbFRyYW5zaXRpb249ci53aWxsVHJhbnNpdGlvbnx8dGhpcy53aWxs
VHJhbnNpdGlvbix0aGlzLmRlbGVnYXRlPXIuZGVsZWdhdGV8fHRoaXMuZGVsZWdhdGUsdGhpcy50
cmlnZ2VyRXZlbnQ9ci50cmlnZ2VyRXZlbnR8fHRoaXMudHJpZ2dlckV2ZW50LHRoaXMubG9nPXIu
bG9nfHx0aGlzLmxvZyx0aGlzLnJlY29nbml6ZXI9bmV3IHQuZGVmYXVsdCx0aGlzLnJlc2V0KCl9
ZnVuY3Rpb24gYyhlLHQpe3ZhciByLGk9ISF0aGlzLmFjdGl2ZVRyYW5zaXRpb24sYT1pP3RoaXMu
YWN0aXZlVHJhbnNpdGlvbi5zdGF0ZTp0aGlzLnN0YXRlLHM9ZS5hcHBseVRvU3RhdGUoYSx0aGlz
LnJlY29nbml6ZXIsdGhpcy5nZXRIYW5kbGVyLHQpLHU9bi5nZXRDaGFuZ2VsaXN0KGEucXVlcnlQ
YXJhbXMscy5xdWVyeVBhcmFtcyk7cmV0dXJuIGcocy5oYW5kbGVySW5mb3MsYS5oYW5kbGVySW5m
b3MpP3UmJihyPXRoaXMucXVlcnlQYXJhbXNUcmFuc2l0aW9uKHUsaSxhLHMpKT9yOnRoaXMuYWN0
aXZlVHJhbnNpdGlvbnx8bmV3IG8uVHJhbnNpdGlvbih0aGlzKTp0P3ZvaWQgZCh0aGlzLHMpOihy
PW5ldyBvLlRyYW5zaXRpb24odGhpcyxlLHMpLHRoaXMuYWN0aXZlVHJhbnNpdGlvbiYmdGhpcy5h
Y3RpdmVUcmFuc2l0aW9uLmFib3J0KCksdGhpcy5hY3RpdmVUcmFuc2l0aW9uPXIsci5wcm9taXNl
PXIucHJvbWlzZS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiB2KHIsZS5zdGF0ZSl9LG51bGwsbi5w
cm9taXNlTGFiZWwoIlNldHRsZSB0cmFuc2l0aW9uIHByb21pc2Ugd2hlbiB0cmFuc2l0aW9uIGlz
IGZpbmFsaXplZCIpKSxpfHxfKHRoaXMscyxyKSxmKHRoaXMscyx1KSxyKX1mdW5jdGlvbiBmKGUs
dCxyKXtyJiYoZS5fY2hhbmdlZFF1ZXJ5UGFyYW1zPXIuYWxsLG4udHJpZ2dlcihlLHQuaGFuZGxl
ckluZm9zLCEwLFsicXVlcnlQYXJhbXNEaWRDaGFuZ2UiLHIuY2hhbmdlZCxyLmFsbCxyLnJlbW92
ZWRdKSxlLl9jaGFuZ2VkUXVlcnlQYXJhbXM9bnVsbCl9ZnVuY3Rpb24gZChlLHQscil7dmFyIGks
byxhLHM9aChlLnN0YXRlLHQpO2ZvcihpPTAsbz1zLmV4aXRlZC5sZW5ndGg7aTxvO2krKylhPXMu
ZXhpdGVkW2ldLmhhbmRsZXIsZGVsZXRlIGEuY29udGV4dCxuLmNhbGxIb29rKGEsInJlc2V0Iiwh
MCxyKSxuLmNhbGxIb29rKGEsImV4aXQiLHIpO3ZhciB1PWUub2xkU3RhdGU9ZS5zdGF0ZTtlLnN0
YXRlPXQ7dmFyIGw9ZS5jdXJyZW50SGFuZGxlckluZm9zPXMudW5jaGFuZ2VkLnNsaWNlKCk7dHJ5
e2ZvcihpPTAsbz1zLnJlc2V0Lmxlbmd0aDtpPG87aSsrKWE9cy5yZXNldFtpXS5oYW5kbGVyLG4u
Y2FsbEhvb2soYSwicmVzZXQiLCExLHIpO2ZvcihpPTAsbz1zLnVwZGF0ZWRDb250ZXh0Lmxlbmd0
aDtpPG87aSsrKXAobCxzLnVwZGF0ZWRDb250ZXh0W2ldLCExLHIpO2ZvcihpPTAsbz1zLmVudGVy
ZWQubGVuZ3RoO2k8bztpKyspcChsLHMuZW50ZXJlZFtpXSwhMCxyKX1jYXRjaCh0KXt0aHJvdyBl
LnN0YXRlPXUsZS5jdXJyZW50SGFuZGxlckluZm9zPXUuaGFuZGxlckluZm9zLHR9ZS5zdGF0ZS5x
dWVyeVBhcmFtcz15KGUsbCx0LnF1ZXJ5UGFyYW1zLHIpfWZ1bmN0aW9uIHAoZSx0LHIsaSl7dmFy
IGE9dC5oYW5kbGVyLHM9dC5jb250ZXh0O2lmKHImJm4uY2FsbEhvb2soYSwiZW50ZXIiLGkpLGkm
JmkuaXNBYm9ydGVkKXRocm93IG5ldyBvLlRyYW5zaXRpb25BYm9ydGVkO2lmKGEuY29udGV4dD1z
LG4uY2FsbEhvb2soYSwiY29udGV4dERpZENoYW5nZSIpLG4uY2FsbEhvb2soYSwic2V0dXAiLHMs
aSksaSYmaS5pc0Fib3J0ZWQpdGhyb3cgbmV3IG8uVHJhbnNpdGlvbkFib3J0ZWQ7cmV0dXJuIGUu
cHVzaCh0KSwhMH1mdW5jdGlvbiBoKGUsdCl7dmFyIHIsbixpLG89ZS5oYW5kbGVySW5mb3MsYT10
LmhhbmRsZXJJbmZvcyxzPXt1cGRhdGVkQ29udGV4dDpbXSxleGl0ZWQ6W10sZW50ZXJlZDpbXSx1
bmNoYW5nZWQ6W119LHU9ITE7Zm9yKG49MCxpPWEubGVuZ3RoO248aTtuKyspe3ZhciBsPW9bbl0s
Yz1hW25dO2wmJmwuaGFuZGxlcj09PWMuaGFuZGxlcnx8KHI9ITApLHI/KHMuZW50ZXJlZC5wdXNo
KGMpLGwmJnMuZXhpdGVkLnVuc2hpZnQobCkpOnV8fGwuY29udGV4dCE9PWMuY29udGV4dD8odT0h
MCxzLnVwZGF0ZWRDb250ZXh0LnB1c2goYykpOnMudW5jaGFuZ2VkLnB1c2gobCl9Zm9yKG49YS5s
ZW5ndGgsaT1vLmxlbmd0aDtuPGk7bisrKXMuZXhpdGVkLnVuc2hpZnQob1tuXSk7cmV0dXJuIHMu
cmVzZXQ9cy51cGRhdGVkQ29udGV4dC5zbGljZSgpLHMucmVzZXQucmV2ZXJzZSgpLHN9ZnVuY3Rp
b24gbShlLHQscil7dmFyIGk9ZS51cmxNZXRob2Q7aWYoaSl7Zm9yKHZhciBvPWUucm91dGVyLGE9
dC5oYW5kbGVySW5mb3Mscz1hW2EubGVuZ3RoLTFdLm5hbWUsdT17fSxsPWEubGVuZ3RoLTE7bD49
MDstLWwpe3ZhciBjPWFbbF07bi5tZXJnZSh1LGMucGFyYW1zKSxjLmhhbmRsZXIuaW5hY2Nlc3Np
YmxlQnlVUkwmJihpPW51bGwpfWlmKGkpe3UucXVlcnlQYXJhbXM9ZS5fdmlzaWJsZVF1ZXJ5UGFy
YW1zfHx0LnF1ZXJ5UGFyYW1zO3ZhciBmPW8ucmVjb2duaXplci5nZW5lcmF0ZShzLHUpOyJyZXBs
YWNlIj09PWk/by5yZXBsYWNlVVJMKGYpOm8udXBkYXRlVVJMKGYpfX19ZnVuY3Rpb24gdihlLHQp
e3RyeXtuLmxvZyhlLnJvdXRlcixlLnNlcXVlbmNlLCJSZXNvbHZlZCBhbGwgbW9kZWxzIG9uIGRl
c3RpbmF0aW9uIHJvdXRlOyBmaW5hbGl6aW5nIHRyYW5zaXRpb24uIik7dmFyIGk9ZS5yb3V0ZXIs
YT10LmhhbmRsZXJJbmZvcztlLnNlcXVlbmNlO3JldHVybiBkKGksdCxlKSxlLmlzQWJvcnRlZD8o
aS5zdGF0ZS5oYW5kbGVySW5mb3M9aS5jdXJyZW50SGFuZGxlckluZm9zLHIuZGVmYXVsdC5yZWpl
Y3Qoby5sb2dBYm9ydChlKSkpOihtKGUsdCxlLmludGVudC51cmwpLGUuaXNBY3RpdmU9ITEsaS5h
Y3RpdmVUcmFuc2l0aW9uPW51bGwsbi50cmlnZ2VyKGksaS5jdXJyZW50SGFuZGxlckluZm9zLCEw
LFsiZGlkVHJhbnNpdGlvbiJdKSxpLmRpZFRyYW5zaXRpb24mJmkuZGlkVHJhbnNpdGlvbihpLmN1
cnJlbnRIYW5kbGVySW5mb3MpLG4ubG9nKGksZS5zZXF1ZW5jZSwiVFJBTlNJVElPTiBDT01QTEVU
RS4iKSxhW2EubGVuZ3RoLTFdLmhhbmRsZXIpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIG8u
VHJhbnNpdGlvbkFib3J0ZWQpKXt2YXIgcz1lLnN0YXRlLmhhbmRsZXJJbmZvcztlLnRyaWdnZXIo
ITAsImVycm9yIix0LGUsc1tzLmxlbmd0aC0xXS5oYW5kbGVyKSxlLmFib3J0KCl9dGhyb3cgdH19
ZnVuY3Rpb24gYihlLHQscil7dmFyIGk9dFswXXx8Ii8iLG89dFt0Lmxlbmd0aC0xXSx1PXt9O28m
Jm8uaGFzT3duUHJvcGVydHkoInF1ZXJ5UGFyYW1zIikmJih1PXcuY2FsbCh0KS5xdWVyeVBhcmFt
cyk7dmFyIGw7aWYoMD09PXQubGVuZ3RoKXtuLmxvZyhlLCJVcGRhdGluZyBxdWVyeSBwYXJhbXMi
KTt2YXIgYz1lLnN0YXRlLmhhbmRsZXJJbmZvcztsPW5ldyBhLmRlZmF1bHQoe25hbWU6Y1tjLmxl
bmd0aC0xXS5uYW1lLGNvbnRleHRzOltdLHF1ZXJ5UGFyYW1zOnV9KX1lbHNlIi8iPT09aS5jaGFy
QXQoMCk/KG4ubG9nKGUsIkF0dGVtcHRpbmcgVVJMIHRyYW5zaXRpb24gdG8gIitpKSxsPW5ldyBz
LmRlZmF1bHQoe3VybDppfSkpOihuLmxvZyhlLCJBdHRlbXB0aW5nIHRyYW5zaXRpb24gdG8gIitp
KSxsPW5ldyBhLmRlZmF1bHQoe25hbWU6dFswXSxjb250ZXh0czpuLnNsaWNlLmNhbGwodCwxKSxx
dWVyeVBhcmFtczp1fSkpO3JldHVybiBlLnRyYW5zaXRpb25CeUludGVudChsLHIpfWZ1bmN0aW9u
IGcoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcj0wLG49ZS5s
ZW5ndGg7cjxuOysrcilpZihlW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB5
KGUsdCxyLGkpe2Zvcih2YXIgbyBpbiByKXIuaGFzT3duUHJvcGVydHkobykmJm51bGw9PT1yW29d
JiZkZWxldGUgcltvXTt2YXIgYT1bXTtuLnRyaWdnZXIoZSx0LCEwLFsiZmluYWxpemVRdWVyeVBh
cmFtQ2hhbmdlIixyLGEsaV0pLGkmJihpLl92aXNpYmxlUXVlcnlQYXJhbXM9e30pO2Zvcih2YXIg
cz17fSx1PTAsbD1hLmxlbmd0aDt1PGw7Kyt1KXt2YXIgYz1hW3VdO3NbYy5rZXldPWMudmFsdWUs
aSYmYy52aXNpYmxlIT09ITEmJihpLl92aXNpYmxlUXVlcnlQYXJhbXNbYy5rZXldPWMudmFsdWUp
fXJldHVybiBzfWZ1bmN0aW9uIF8oZSx0LHIpe3ZhciBpLG8sYSxzLHUsbCxjPWUuc3RhdGUuaGFu
ZGxlckluZm9zLGY9W10sZD1udWxsO2ZvcihzPWMubGVuZ3RoLGE9MDthPHM7YSsrKXtpZih1PWNb
YV0sbD10LmhhbmRsZXJJbmZvc1thXSwhbHx8dS5uYW1lIT09bC5uYW1lKXtkPWE7YnJlYWt9bC5p
c1Jlc29sdmVkfHxmLnB1c2godSl9bnVsbCE9PWQmJihpPWMuc2xpY2UoZCxzKSxvPWZ1bmN0aW9u
KGUpe2Zvcih2YXIgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKylpZihpW3RdLm5hbWU9PT1lKXJldHVy
biEwO3JldHVybiExfSksbi50cmlnZ2VyKGUsYywhMCxbIndpbGxUcmFuc2l0aW9uIixyXSksZS53
aWxsVHJhbnNpdGlvbiYmZS53aWxsVHJhbnNpdGlvbihjLHQuaGFuZGxlckluZm9zLHIpfXZhciB3
PUFycmF5LnByb3RvdHlwZS5wb3A7bC5wcm90b3R5cGU9e21hcDpmdW5jdGlvbihlKXt0aGlzLnJl
Y29nbml6ZXIuZGVsZWdhdGU9dGhpcy5kZWxlZ2F0ZSx0aGlzLnJlY29nbml6ZXIubWFwKGUsZnVu
Y3Rpb24oZSx0KXtmb3IodmFyIHI9dC5sZW5ndGgtMSxuPSEwO3I+PTAmJm47LS1yKXt2YXIgaT10
W3JdO2UuYWRkKHQse2FzOmkuaGFuZGxlcn0pLG49Ii8iPT09aS5wYXRofHwiIj09PWkucGF0aHx8
Ii5pbmRleCI9PT1pLmhhbmRsZXIuc2xpY2UoLTYpfX0pfSxoYXNSb3V0ZTpmdW5jdGlvbihlKXty
ZXR1cm4gdGhpcy5yZWNvZ25pemVyLmhhc1JvdXRlKGUpfSxnZXRIYW5kbGVyOmZ1bmN0aW9uKCl7
fSxxdWVyeVBhcmFtc1RyYW5zaXRpb246ZnVuY3Rpb24oZSx0LHIsaSl7dmFyIGE9dGhpcztpZihm
KHRoaXMsaSxlKSwhdCYmdGhpcy5hY3RpdmVUcmFuc2l0aW9uKXJldHVybiB0aGlzLmFjdGl2ZVRy
YW5zaXRpb247dmFyIHM9bmV3IG8uVHJhbnNpdGlvbih0aGlzKTtyZXR1cm4gcy5xdWVyeVBhcmFt
c09ubHk9ITAsci5xdWVyeVBhcmFtcz15KHRoaXMsaS5oYW5kbGVySW5mb3MsaS5xdWVyeVBhcmFt
cyxzKSxzLnByb21pc2U9cy5wcm9taXNlLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIG0ocyxyLCEw
KSxhLmRpZFRyYW5zaXRpb24mJmEuZGlkVHJhbnNpdGlvbihhLmN1cnJlbnRIYW5kbGVySW5mb3Mp
LGV9LG51bGwsbi5wcm9taXNlTGFiZWwoIlRyYW5zaXRpb24gY29tcGxldGUiKSksc30sdHJhbnNp
dGlvbkJ5SW50ZW50OmZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBjLmFwcGx5KHRoaXMsYXJndW1l
bnRzKX1jYXRjaCh0KXtyZXR1cm4gbmV3IG8uVHJhbnNpdGlvbih0aGlzLGUsbnVsbCx0KX19LHJl
c2V0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0ZSYmbi5mb3JFYWNoKHRoaXMuc3RhdGUuaGFuZGxlcklu
Zm9zLnNsaWNlKCkucmV2ZXJzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGFuZGxlcjtuLmNhbGxI
b29rKHQsImV4aXQiKX0pLHRoaXMuc3RhdGU9bmV3IGkuZGVmYXVsdCx0aGlzLmN1cnJlbnRIYW5k
bGVySW5mb3M9bnVsbH0sYWN0aXZlVHJhbnNpdGlvbjpudWxsLGhhbmRsZVVSTDpmdW5jdGlvbihl
KXt2YXIgdD1uLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4iLyIhPT1lLmNoYXJBdCgwKSYm
KHRbMF09Ii8iK2UpLGIodGhpcyx0KS5tZXRob2QobnVsbCl9LHVwZGF0ZVVSTDpmdW5jdGlvbigp
e3Rocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxyZXBsYWNl
VVJMOmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlVVJMKGUpfSx0cmFuc2l0aW9uVG86ZnVuY3Rpb24o
ZSl7cmV0dXJuIGIodGhpcyxhcmd1bWVudHMpfSxpbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG86ZnVu
Y3Rpb24oZSl7cmV0dXJuIGIodGhpcyxhcmd1bWVudHMsITApfSxyZWZyZXNoOmZ1bmN0aW9uKGUp
e2Zvcih2YXIgdD10aGlzLmFjdGl2ZVRyYW5zaXRpb24/dGhpcy5hY3RpdmVUcmFuc2l0aW9uLnN0
YXRlOnRoaXMuc3RhdGUscj10LmhhbmRsZXJJbmZvcyxpPXt9LG89MCxzPXIubGVuZ3RoO288czsr
K28pe3ZhciB1PXJbb107aVt1Lm5hbWVdPXUucGFyYW1zfHx7fX1uLmxvZyh0aGlzLCJTdGFydGlu
ZyBhIHJlZnJlc2ggdHJhbnNpdGlvbiIpO3ZhciBsPW5ldyBhLmRlZmF1bHQoe25hbWU6cltyLmxl
bmd0aC0xXS5uYW1lLHBpdm90SGFuZGxlcjplfHxyWzBdLmhhbmRsZXIsY29udGV4dHM6W10scXVl
cnlQYXJhbXM6dGhpcy5fY2hhbmdlZFF1ZXJ5UGFyYW1zfHx0LnF1ZXJ5UGFyYW1zfHx7fX0pO3Jl
dHVybiB0aGlzLnRyYW5zaXRpb25CeUludGVudChsLCExKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24o
ZSl7cmV0dXJuIGIodGhpcyxhcmd1bWVudHMpLm1ldGhvZCgicmVwbGFjZSIpfSxnZW5lcmF0ZTpm
dW5jdGlvbihlKXtmb3IodmFyIHQ9bi5leHRyYWN0UXVlcnlQYXJhbXMobi5zbGljZS5jYWxsKGFy
Z3VtZW50cywxKSkscj10WzBdLGk9dFsxXSxvPW5ldyBhLmRlZmF1bHQoe25hbWU6ZSxjb250ZXh0
czpyfSkscz1vLmFwcGx5VG9TdGF0ZSh0aGlzLnN0YXRlLHRoaXMucmVjb2duaXplcix0aGlzLmdl
dEhhbmRsZXIpLHU9e30sbD0wLGM9cy5oYW5kbGVySW5mb3MubGVuZ3RoO2w8YzsrK2wpe3ZhciBm
PXMuaGFuZGxlckluZm9zW2xdLGQ9Zi5zZXJpYWxpemUoKTtuLm1lcmdlKHUsZCl9cmV0dXJuIHUu
cXVlcnlQYXJhbXM9aSx0aGlzLnJlY29nbml6ZXIuZ2VuZXJhdGUoZSx1KX0sYXBwbHlJbnRlbnQ6
ZnVuY3Rpb24oZSx0KXt2YXIgcj1uZXcgYS5kZWZhdWx0KHtuYW1lOmUsY29udGV4dHM6dH0pLG49
dGhpcy5hY3RpdmVUcmFuc2l0aW9uJiZ0aGlzLmFjdGl2ZVRyYW5zaXRpb24uc3RhdGV8fHRoaXMu
c3RhdGU7cmV0dXJuIHIuYXBwbHlUb1N0YXRlKG4sdGhpcy5yZWNvZ25pemVyLHRoaXMuZ2V0SGFu
ZGxlcil9LGlzQWN0aXZlSW50ZW50OmZ1bmN0aW9uKGUsdCxyLG8pe3ZhciBzLHUsbD1vfHx0aGlz
LnN0YXRlLGM9bC5oYW5kbGVySW5mb3M7aWYoIWMubGVuZ3RoKXJldHVybiExO3ZhciBmPWNbYy5s
ZW5ndGgtMV0ubmFtZSxkPXRoaXMucmVjb2duaXplci5oYW5kbGVyc0ZvcihmKSxwPTA7Zm9yKHU9
ZC5sZW5ndGg7cDx1JiYocz1jW3BdLHMubmFtZSE9PWUpOysrcCk7aWYocD09PWQubGVuZ3RoKXJl
dHVybiExO3ZhciBoPW5ldyBpLmRlZmF1bHQ7aC5oYW5kbGVySW5mb3M9Yy5zbGljZSgwLHArMSks
ZD1kLnNsaWNlKDAscCsxKTt2YXIgbT1uZXcgYS5kZWZhdWx0KHtuYW1lOmYsY29udGV4dHM6dH0p
LHY9bS5hcHBseVRvSGFuZGxlcnMoaCxkLHRoaXMuZ2V0SGFuZGxlcixmLCEwLCEwKSxiPWcodi5o
YW5kbGVySW5mb3MsaC5oYW5kbGVySW5mb3MpO2lmKCFyfHwhYilyZXR1cm4gYjt2YXIgeT17fTtu
Lm1lcmdlKHkscik7dmFyIF89bC5xdWVyeVBhcmFtcztmb3IodmFyIHcgaW4gXylfLmhhc093blBy
b3BlcnR5KHcpJiZ5Lmhhc093blByb3BlcnR5KHcpJiYoeVt3XT1fW3ddKTtyZXR1cm4gYiYmIW4u
Z2V0Q2hhbmdlbGlzdCh5LHIpfSxpc0FjdGl2ZTpmdW5jdGlvbihlKXt2YXIgdD1uLmV4dHJhY3RR
dWVyeVBhcmFtcyhuLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTtyZXR1cm4gdGhpcy5pc0FjdGl2
ZUludGVudChlLHRbMF0sdFsxXSl9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5zbGljZS5j
YWxsKGFyZ3VtZW50cyk7bi50cmlnZ2VyKHRoaXMsdGhpcy5jdXJyZW50SGFuZGxlckluZm9zLCEx
LHQpfSxsb2c6bnVsbH0sZS5kZWZhdWx0PWx9KSxlKCJyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQi
LFsiZXhwb3J0cyIsInJvdXRlci91dGlscyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1
bmN0aW9uIHIoZSl7dGhpcy5pbml0aWFsaXplKGUpLHRoaXMuZGF0YT10aGlzLmRhdGF8fHt9fXIu
cHJvdG90eXBlPXtpbml0aWFsaXplOm51bGwsYXBwbHlUb1N0YXRlOm51bGx9LGUuZGVmYXVsdD1y
fSksZSgicm91dGVyL3RyYW5zaXRpb24taW50ZW50L25hbWVkLXRyYW5zaXRpb24taW50ZW50Iixb
ImV4cG9ydHMiLCJyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQiLCJyb3V0ZXIvdHJhbnNpdGlvbi1z
dGF0ZSIsInJvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeSIsInJvdXRlci91dGlscyJdLGZ1bmN0
aW9uKGUsdCxyLG4saSl7InVzZSBzdHJpY3QiO2UuZGVmYXVsdD1pLnN1YmNsYXNzKHQuZGVmYXVs
dCx7bmFtZTpudWxsLHBpdm90SGFuZGxlcjpudWxsLGNvbnRleHRzOm51bGwscXVlcnlQYXJhbXM6
bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3RoaXMubmFtZT1lLm5hbWUsdGhpcy5waXZvdEhh
bmRsZXI9ZS5waXZvdEhhbmRsZXIsdGhpcy5jb250ZXh0cz1lLmNvbnRleHRzfHxbXSx0aGlzLnF1
ZXJ5UGFyYW1zPWUucXVlcnlQYXJhbXN9LGFwcGx5VG9TdGF0ZTpmdW5jdGlvbihlLHQscixuKXt2
YXIgbz1pLmV4dHJhY3RRdWVyeVBhcmFtcyhbdGhpcy5uYW1lXS5jb25jYXQodGhpcy5jb250ZXh0
cykpLGE9b1swXSxzPShvWzFdLHQuaGFuZGxlcnNGb3IoYVswXSkpLHU9c1tzLmxlbmd0aC0xXS5o
YW5kbGVyO3JldHVybiB0aGlzLmFwcGx5VG9IYW5kbGVycyhlLHMscix1LG4pfSxhcHBseVRvSGFu
ZGxlcnM6ZnVuY3Rpb24oZSx0LG4sbyxhLHMpe3ZhciB1LGwsYz1uZXcgci5kZWZhdWx0LGY9dGhp
cy5jb250ZXh0cy5zbGljZSgwKSxkPXQubGVuZ3RoO2lmKHRoaXMucGl2b3RIYW5kbGVyKWZvcih1
PTAsbD10Lmxlbmd0aDt1PGw7Kyt1KWlmKG4odFt1XS5oYW5kbGVyKT09PXRoaXMucGl2b3RIYW5k
bGVyKXtkPXU7YnJlYWt9IXRoaXMucGl2b3RIYW5kbGVyO2Zvcih1PXQubGVuZ3RoLTE7dT49MDst
LXUpe3ZhciBwPXRbdV0saD1wLmhhbmRsZXIsbT1uKGgpLHY9ZS5oYW5kbGVySW5mb3NbdV0sYj1u
dWxsO2lmKGI9cC5uYW1lcy5sZW5ndGg+MD91Pj1kP3RoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5m
byhoLG0scC5uYW1lcyxmLHYpOnRoaXMuZ2V0SGFuZGxlckluZm9Gb3JEeW5hbWljU2VnbWVudCho
LG0scC5uYW1lcyxmLHYsbyx1KTp0aGlzLmNyZWF0ZVBhcmFtSGFuZGxlckluZm8oaCxtLHAubmFt
ZXMsZix2KSxzKXtiPWIuYmVjb21lUmVzb2x2ZWQobnVsbCxiLmNvbnRleHQpO3ZhciBnPXYmJnYu
Y29udGV4dDtwLm5hbWVzLmxlbmd0aD4wJiZiLmNvbnRleHQ9PT1nJiYoYi5wYXJhbXM9diYmdi5w
YXJhbXMpLGIuY29udGV4dD1nfXZhciB5PXY7KHU+PWR8fGIuc2hvdWxkU3VwZXJjZWRlKHYpKSYm
KGQ9TWF0aC5taW4odSxkKSx5PWIpLGEmJiFzJiYoeT15LmJlY29tZVJlc29sdmVkKG51bGwseS5j
b250ZXh0KSksYy5oYW5kbGVySW5mb3MudW5zaGlmdCh5KX1pZihmLmxlbmd0aD4wKXRocm93IG5l
dyBFcnJvcigiTW9yZSBjb250ZXh0IG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiB0aGVyZSBhcmUg
ZHluYW1pYyBzZWdtZW50cyBmb3IgdGhlIHJvdXRlOiAiK28pO3JldHVybiBhfHx0aGlzLmludmFs
aWRhdGVDaGlsZHJlbihjLmhhbmRsZXJJbmZvcyxkKSxpLm1lcmdlKGMucXVlcnlQYXJhbXMsdGhp
cy5xdWVyeVBhcmFtc3x8e30pLGN9LGludmFsaWRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQpe2Zv
cih2YXIgcj10LG49ZS5sZW5ndGg7cjxuOysrcil7ZVtyXTtlW3JdPWVbcl0uZ2V0VW5yZXNvbHZl
ZCgpfX0sZ2V0SGFuZGxlckluZm9Gb3JEeW5hbWljU2VnbWVudDpmdW5jdGlvbihlLHQscixvLGEs
cyx1KXt2YXIgbDtyLmxlbmd0aDtpZihvLmxlbmd0aD4wKXtpZihsPW9bby5sZW5ndGgtMV0saS5p
c1BhcmFtKGwpKXJldHVybiB0aGlzLmNyZWF0ZVBhcmFtSGFuZGxlckluZm8oZSx0LHIsbyxhKTtv
LnBvcCgpfWVsc2V7aWYoYSYmYS5uYW1lPT09ZSlyZXR1cm4gYTtpZighdGhpcy5wcmVUcmFuc2l0
aW9uU3RhdGUpcmV0dXJuIGE7dmFyIGM9dGhpcy5wcmVUcmFuc2l0aW9uU3RhdGUuaGFuZGxlcklu
Zm9zW3VdO2w9YyYmYy5jb250ZXh0fXJldHVybiBuLmRlZmF1bHQoIm9iamVjdCIse25hbWU6ZSxo
YW5kbGVyOnQsY29udGV4dDpsLG5hbWVzOnJ9KX0sY3JlYXRlUGFyYW1IYW5kbGVySW5mbzpmdW5j
dGlvbihlLHQscixvLGEpe2Zvcih2YXIgcz17fSx1PXIubGVuZ3RoO3UtLTspe3ZhciBsPWEmJmU9
PT1hLm5hbWUmJmEucGFyYW1zfHx7fSxjPW9bby5sZW5ndGgtMV0sZj1yW3VdO2lmKGkuaXNQYXJh
bShjKSlzW2ZdPSIiK28ucG9wKCk7ZWxzZXtpZighbC5oYXNPd25Qcm9wZXJ0eShmKSl0aHJvdyBu
ZXcgRXJyb3IoIllvdSBkaWRuJ3QgcHJvdmlkZSBlbm91Z2ggc3RyaW5nL251bWVyaWMgcGFyYW1l
dGVycyB0byBzYXRpc2Z5IGFsbCBvZiB0aGUgZHluYW1pYyBzZWdtZW50cyBmb3Igcm91dGUgIitl
KTtzW2ZdPWxbZl19fXJldHVybiBuLmRlZmF1bHQoInBhcmFtIix7bmFtZTplLGhhbmRsZXI6dCxw
YXJhbXM6c30pfX0pfSksZSgicm91dGVyL3RyYW5zaXRpb24taW50ZW50L3VybC10cmFuc2l0aW9u
LWludGVudCIsWyJleHBvcnRzIiwicm91dGVyL3RyYW5zaXRpb24taW50ZW50Iiwicm91dGVyL3Ry
YW5zaXRpb24tc3RhdGUiLCJyb3V0ZXIvaGFuZGxlci1pbmZvL2ZhY3RvcnkiLCJyb3V0ZXIvdXRp
bHMiLCJyb3V0ZXIvdW5yZWNvZ25pemVkLXVybC1lcnJvciJdLGZ1bmN0aW9uKGUsdCxyLG4saSxv
KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PWkuc3ViY2xhc3ModC5kZWZhdWx0LHt1cmw6bnVsbCxp
bml0aWFsaXplOmZ1bmN0aW9uKGUpe3RoaXMudXJsPWUudXJsfSxhcHBseVRvU3RhdGU6ZnVuY3Rp
b24oZSx0LGEpe3ZhciBzLHUsbD1uZXcgci5kZWZhdWx0LGM9dC5yZWNvZ25pemUodGhpcy51cmwp
O2lmKCFjKXRocm93IG5ldyBvLmRlZmF1bHQodGhpcy51cmwpO3ZhciBmPSExO2ZvcihzPTAsdT1j
Lmxlbmd0aDtzPHU7KytzKXt2YXIgZD1jW3NdLHA9ZC5oYW5kbGVyLGg9YShwKTtpZihoLmluYWNj
ZXNzaWJsZUJ5VVJMKXRocm93IG5ldyBvLmRlZmF1bHQodGhpcy51cmwpO3ZhciBtPW4uZGVmYXVs
dCgicGFyYW0iLHtuYW1lOnAsaGFuZGxlcjpoLHBhcmFtczpkLnBhcmFtc30pLHY9ZS5oYW5kbGVy
SW5mb3Nbc107Znx8bS5zaG91bGRTdXBlcmNlZGUodik/KGY9ITAsbC5oYW5kbGVySW5mb3Nbc109
bSk6bC5oYW5kbGVySW5mb3Nbc109dn1yZXR1cm4gaS5tZXJnZShsLnF1ZXJ5UGFyYW1zLGMucXVl
cnlQYXJhbXMpLGx9fSl9KSxlKCJyb3V0ZXIvdHJhbnNpdGlvbi1zdGF0ZSIsWyJleHBvcnRzIiwi
cm91dGVyL2hhbmRsZXItaW5mbyIsInJvdXRlci91dGlscyIsInJzdnAvcHJvbWlzZSJdLGZ1bmN0
aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3RoaXMuaGFuZGxlckluZm9z
PVtdLHRoaXMucXVlcnlQYXJhbXM9e30sdGhpcy5wYXJhbXM9e319aS5wcm90b3R5cGU9e2hhbmRs
ZXJJbmZvczpudWxsLHF1ZXJ5UGFyYW1zOm51bGwscGFyYW1zOm51bGwscHJvbWlzZUxhYmVsOmZ1
bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiByLmZvckVhY2godGhpcy5oYW5kbGVySW5mb3MsZnVu
Y3Rpb24oZSl7IiIhPT10JiYodCs9Ii4iKSx0Kz1lLm5hbWV9KSxyLnByb21pc2VMYWJlbCgiJyIr
dCsiJzogIitlKX0scmVzb2x2ZTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gbi5k
ZWZhdWx0LnJlc29sdmUoZSgpLGwucHJvbWlzZUxhYmVsKCJDaGVjayBpZiBzaG91bGQgY29udGlu
dWUiKSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIGM9ITAsbi5kZWZhdWx0LnJlamVjdChlKX0s
bC5wcm9taXNlTGFiZWwoIkhhbmRsZSBhYm9ydCIpKX1mdW5jdGlvbiBvKGUpe3ZhciByPWwuaGFu
ZGxlckluZm9zLGk9dC5yZXNvbHZlSW5kZXg+PXIubGVuZ3RoP3IubGVuZ3RoLTE6dC5yZXNvbHZl
SW5kZXg7cmV0dXJuIG4uZGVmYXVsdC5yZWplY3Qoe2Vycm9yOmUsaGFuZGxlcldpdGhFcnJvcjps
LmhhbmRsZXJJbmZvc1tpXS5oYW5kbGVyLHdhc0Fib3J0ZWQ6YyxzdGF0ZTpsfSl9ZnVuY3Rpb24g
YShlKXt2YXIgbj1sLmhhbmRsZXJJbmZvc1t0LnJlc29sdmVJbmRleF0uaXNSZXNvbHZlZDtpZihs
LmhhbmRsZXJJbmZvc1t0LnJlc29sdmVJbmRleCsrXT1lLCFuKXt2YXIgbz1lLmhhbmRsZXI7ci5j
YWxsSG9vayhvLCJyZWRpcmVjdCIsZS5jb250ZXh0LHQpfXJldHVybiBpKCkudGhlbihzLG51bGws
bC5wcm9taXNlTGFiZWwoIlJlc29sdmUgaGFuZGxlciIpKX1mdW5jdGlvbiBzKCl7aWYodC5yZXNv
bHZlSW5kZXg9PT1sLmhhbmRsZXJJbmZvcy5sZW5ndGgpcmV0dXJue2Vycm9yOm51bGwsc3RhdGU6
bH07dmFyIGU9bC5oYW5kbGVySW5mb3NbdC5yZXNvbHZlSW5kZXhdO3JldHVybiBlLnJlc29sdmUo
aSx0KS50aGVuKGEsbnVsbCxsLnByb21pc2VMYWJlbCgiUHJvY2VlZCIpKX12YXIgdT10aGlzLnBh
cmFtcztyLmZvckVhY2godGhpcy5oYW5kbGVySW5mb3MsZnVuY3Rpb24oZSl7dVtlLm5hbWVdPWUu
cGFyYW1zfHx7fX0pLHQ9dHx8e30sdC5yZXNvbHZlSW5kZXg9MDt2YXIgbD10aGlzLGM9ITE7cmV0
dXJuIG4uZGVmYXVsdC5yZXNvbHZlKG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIlN0YXJ0IHRyYW5z
aXRpb24iKSkudGhlbihzLG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIlJlc29sdmUgaGFuZGxlciIp
KS5jYXRjaChvLHRoaXMucHJvbWlzZUxhYmVsKCJIYW5kbGUgZXJyb3IiKSl9fSxlLmRlZmF1bHQ9
aX0pLGUoInJvdXRlci90cmFuc2l0aW9uIixbImV4cG9ydHMiLCJyc3ZwL3Byb21pc2UiLCJyb3V0
ZXIvaGFuZGxlci1pbmZvIiwicm91dGVyL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIGkoZSxyLGEscyl7ZnVuY3Rpb24gdSgpe2lmKGwuaXNBYm9ydGVkKXJl
dHVybiB0LmRlZmF1bHQucmVqZWN0KHZvaWQgMCxuLnByb21pc2VMYWJlbCgiVHJhbnNpdGlvbiBh
Ym9ydGVkIC0gcmVqZWN0IikpfXZhciBsPXRoaXM7aWYodGhpcy5zdGF0ZT1hfHxlLnN0YXRlLHRo
aXMuaW50ZW50PXIsdGhpcy5yb3V0ZXI9ZSx0aGlzLmRhdGE9dGhpcy5pbnRlbnQmJnRoaXMuaW50
ZW50LmRhdGF8fHt9LHRoaXMucmVzb2x2ZWRNb2RlbHM9e30sdGhpcy5xdWVyeVBhcmFtcz17fSxz
KXJldHVybiB0aGlzLnByb21pc2U9dC5kZWZhdWx0LnJlamVjdChzKSx2b2lkKHRoaXMuZXJyb3I9
cyk7aWYoYSl7dGhpcy5wYXJhbXM9YS5wYXJhbXMsdGhpcy5xdWVyeVBhcmFtcz1hLnF1ZXJ5UGFy
YW1zLHRoaXMuaGFuZGxlckluZm9zPWEuaGFuZGxlckluZm9zO3ZhciBjPWEuaGFuZGxlckluZm9z
Lmxlbmd0aDtjJiYodGhpcy50YXJnZXROYW1lPWEuaGFuZGxlckluZm9zW2MtMV0ubmFtZSk7Zm9y
KHZhciBmPTA7ZjxjOysrZil7dmFyIGQ9YS5oYW5kbGVySW5mb3NbZl07aWYoIWQuaXNSZXNvbHZl
ZClicmVhazt0aGlzLnBpdm90SGFuZGxlcj1kLmhhbmRsZXJ9dGhpcy5zZXF1ZW5jZT1pLmN1cnJl
bnRTZXF1ZW5jZSsrLHRoaXMucHJvbWlzZT1hLnJlc29sdmUodSx0aGlzKS5jYXRjaChmdW5jdGlv
bihlKXtyZXR1cm4gZS53YXNBYm9ydGVkfHxsLmlzQWJvcnRlZD90LmRlZmF1bHQucmVqZWN0KG8o
bCkpOihsLnRyaWdnZXIoImVycm9yIixlLmVycm9yLGwsZS5oYW5kbGVyV2l0aEVycm9yKSxsLmFi
b3J0KCksdC5kZWZhdWx0LnJlamVjdChlLmVycm9yKSl9LG4ucHJvbWlzZUxhYmVsKCJIYW5kbGUg
QWJvcnQiKSl9ZWxzZSB0aGlzLnByb21pc2U9dC5kZWZhdWx0LnJlc29sdmUodGhpcy5zdGF0ZSks
dGhpcy5wYXJhbXM9e319ZnVuY3Rpb24gbyhlKXtyZXR1cm4gbi5sb2coZS5yb3V0ZXIsZS5zZXF1
ZW5jZSwiZGV0ZWN0ZWQgYWJvcnQuIiksbmV3IGF9ZnVuY3Rpb24gYShlKXt0aGlzLm1lc3NhZ2U9
ZXx8IlRyYW5zaXRpb25BYm9ydGVkIix0aGlzLm5hbWU9IlRyYW5zaXRpb25BYm9ydGVkIn1pLmN1
cnJlbnRTZXF1ZW5jZT0wLGkucHJvdG90eXBlPXt0YXJnZXROYW1lOm51bGwsdXJsTWV0aG9kOiJ1
cGRhdGUiLGludGVudDpudWxsLHBhcmFtczpudWxsLHBpdm90SGFuZGxlcjpudWxsLHJlc29sdmVJ
bmRleDowLGhhbmRsZXJJbmZvczpudWxsLHJlc29sdmVkTW9kZWxzOm51bGwsaXNBY3RpdmU6ITAs
c3RhdGU6bnVsbCxxdWVyeVBhcmFtc09ubHk6ITEsaXNUcmFuc2l0aW9uOiEwLGlzRXhpdGluZzpm
dW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5oYW5kbGVySW5mb3Mscj0wLG49dC5sZW5ndGg7cjxu
Oysrcil7dmFyIGk9dFtyXTtpZihpLm5hbWU9PT1lfHxpLmhhbmRsZXI9PT1lKXJldHVybiExfXJl
dHVybiEwfSxwcm9taXNlOm51bGwsZGF0YTpudWxsLHRoZW46ZnVuY3Rpb24oZSx0LHIpe3JldHVy
biB0aGlzLnByb21pc2UudGhlbihlLHQscil9LGNhdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRo
aXMucHJvbWlzZS5jYXRjaChlLHQpfSxmaW5hbGx5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMu
cHJvbWlzZS5maW5hbGx5KGUsdCl9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNBYm9y
dGVkP3RoaXM6KG4ubG9nKHRoaXMucm91dGVyLHRoaXMuc2VxdWVuY2UsdGhpcy50YXJnZXROYW1l
KyI6IHRyYW5zaXRpb24gd2FzIGFib3J0ZWQiKSx0aGlzLmludGVudC5wcmVUcmFuc2l0aW9uU3Rh
dGU9dGhpcy5yb3V0ZXIuc3RhdGUsdGhpcy5pc0Fib3J0ZWQ9ITAsdGhpcy5pc0FjdGl2ZT0hMSx0
aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9uPW51bGwsdGhpcyl9LHJldHJ5OmZ1bmN0aW9uKCl7
cmV0dXJuIHRoaXMuYWJvcnQoKSx0aGlzLnJvdXRlci50cmFuc2l0aW9uQnlJbnRlbnQodGhpcy5p
bnRlbnQsITEpfSxtZXRob2Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXJsTWV0aG9kPWUsdGhp
c30sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD1uLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsiYm9v
bGVhbiI9PXR5cGVvZiBlP3Quc2hpZnQoKTplPSExLG4udHJpZ2dlcih0aGlzLnJvdXRlcix0aGlz
LnN0YXRlLmhhbmRsZXJJbmZvcy5zbGljZSgwLHRoaXMucmVzb2x2ZUluZGV4KzEpLGUsdCl9LGZv
bGxvd1JlZGlyZWN0czpmdW5jdGlvbigpe3ZhciBlPXRoaXMucm91dGVyO3JldHVybiB0aGlzLnBy
b21pc2UuY2F0Y2goZnVuY3Rpb24ocil7cmV0dXJuIGUuYWN0aXZlVHJhbnNpdGlvbj9lLmFjdGl2
ZVRyYW5zaXRpb24uZm9sbG93UmVkaXJlY3RzKCk6dC5kZWZhdWx0LnJlamVjdChyKX0pfSx0b1N0
cmluZzpmdW5jdGlvbigpe3JldHVybiJUcmFuc2l0aW9uIChzZXF1ZW5jZSAiK3RoaXMuc2VxdWVu
Y2UrIikifSxsb2c6ZnVuY3Rpb24oZSl7bi5sb2codGhpcy5yb3V0ZXIsdGhpcy5zZXF1ZW5jZSxl
KX19LGkucHJvdG90eXBlLnNlbmQ9aS5wcm90b3R5cGUudHJpZ2dlcixlLlRyYW5zaXRpb249aSxl
LmxvZ0Fib3J0PW8sZS5UcmFuc2l0aW9uQWJvcnRlZD1hfSksZSgicm91dGVyL3VucmVjb2duaXpl
ZC11cmwtZXJyb3IiLFsiZXhwb3J0cyIsInJvdXRlci91dGlscyJdLGZ1bmN0aW9uKGUsdCl7InVz
ZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5tZXNzYWdlPWV8fCJVbnJlY29nbml6ZWRVUkxF
cnJvciIsdGhpcy5uYW1lPSJVbnJlY29nbml6ZWRVUkxFcnJvciIsRXJyb3IuY2FsbCh0aGlzKX1y
LnByb3RvdHlwZT10Lm9DcmVhdGUoRXJyb3IucHJvdG90eXBlKSxlLmRlZmF1bHQ9cn0pLGUoInJv
dXRlci91dGlscyIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IHQoZSx0KXtmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYoZVtyXT10W3JdKX1m
dW5jdGlvbiByKGUpe3ZhciB0LHIsbj1lJiZlLmxlbmd0aDtyZXR1cm4gbiYmbj4wJiZlW24tMV0m
JmVbbi0xXS5oYXNPd25Qcm9wZXJ0eSgicXVlcnlQYXJhbXMiKT8ocj1lW24tMV0ucXVlcnlQYXJh
bXMsdD12LmNhbGwoZSwwLG4tMSksW3Qscl0pOltlLG51bGxdfWZ1bmN0aW9uIG4oZSl7Zm9yKHZh
ciB0IGluIGUpaWYoIm51bWJlciI9PXR5cGVvZiBlW3RdKWVbdF09IiIrZVt0XTtlbHNlIGlmKGIo
ZVt0XSkpZm9yKHZhciByPTAsbj1lW3RdLmxlbmd0aDtyPG47cisrKWVbdF1bcl09IiIrZVt0XVty
XX1mdW5jdGlvbiBpKGUsdCxyKXtlLmxvZyYmKDM9PT1hcmd1bWVudHMubGVuZ3RoP2UubG9nKCJU
cmFuc2l0aW9uICMiK3QrIjogIityKToocj10LGUubG9nKHIpKSl9ZnVuY3Rpb24gbyhlLHQpe3Zh
ciByPWFyZ3VtZW50cztyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9di5jYWxsKHIsMik7cmV0dXJu
IGkucHVzaChuKSx0LmFwcGx5KGUsaSl9fWZ1bmN0aW9uIGEoZSl7cmV0dXJuInN0cmluZyI9PXR5
cGVvZiBlfHxlIGluc3RhbmNlb2YgU3RyaW5nfHwibnVtYmVyIj09dHlwZW9mIGV8fGUgaW5zdGFu
Y2VvZiBOdW1iZXJ9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuJiYh
MSE9PXQoZVtyXSk7cisrKTt9ZnVuY3Rpb24gdShlLHQscixuKXtpZihlLnRyaWdnZXJFdmVudCly
ZXR1cm4gdm9pZCBlLnRyaWdnZXJFdmVudCh0LHIsbik7dmFyIGk9bi5zaGlmdCgpO2lmKCF0KXtp
ZihyKXJldHVybjt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCB0cmlnZ2VyIGV2ZW50ICciK2kr
IicuIFRoZXJlIGFyZSBubyBhY3RpdmUgaGFuZGxlcnMiKX1mb3IodmFyIG89ITEsYT10Lmxlbmd0
aC0xO2E+PTA7YS0tKXt2YXIgcz10W2FdLHU9cy5oYW5kbGVyO2lmKHUuZXZlbnRzJiZ1LmV2ZW50
c1tpXSl7aWYodS5ldmVudHNbaV0uYXBwbHkodSxuKSE9PSEwKXJldHVybjtvPSEwfX1pZighbyYm
IXIpdGhyb3cgbmV3IEVycm9yKCJOb3RoaW5nIGhhbmRsZWQgdGhlIGV2ZW50ICciK2krIicuIil9
ZnVuY3Rpb24gbChlLHIpe3ZhciBpLG89e2FsbDp7fSxjaGFuZ2VkOnt9LHJlbW92ZWQ6e319O3Qo
by5hbGwscik7dmFyIGE9ITE7bihlKSxuKHIpO2ZvcihpIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShp
KSYmKHIuaGFzT3duUHJvcGVydHkoaSl8fChhPSEwLG8ucmVtb3ZlZFtpXT1lW2ldKSk7Zm9yKGkg
aW4gcilpZihyLmhhc093blByb3BlcnR5KGkpKWlmKGIoZVtpXSkmJmIocltpXSkpaWYoZVtpXS5s
ZW5ndGghPT1yW2ldLmxlbmd0aClvLmNoYW5nZWRbaV09cltpXSxhPSEwO2Vsc2UgZm9yKHZhciBz
PTAsdT1lW2ldLmxlbmd0aDtzPHU7cysrKWVbaV1bc10hPT1yW2ldW3NdJiYoby5jaGFuZ2VkW2ld
PXJbaV0sYT0hMCk7ZWxzZSBlW2ldIT09cltpXSYmKG8uY2hhbmdlZFtpXT1yW2ldLGE9ITApO3Jl
dHVybiBhJiZvfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIlJvdXRlcjogIitlfWZ1bmN0aW9uIGYoZSxy
KXtmdW5jdGlvbiBuKHQpe2UuY2FsbCh0aGlzLHR8fHt9KX1yZXR1cm4gbi5wcm90b3R5cGU9Zyhl
LnByb3RvdHlwZSksdChuLnByb3RvdHlwZSxyKSxufWZ1bmN0aW9uIGQoZSx0KXtpZihlKXt2YXIg
cj0iXyIrdDtyZXR1cm4gZVtyXSYmcnx8ZVt0XSYmdH19ZnVuY3Rpb24gcChlLHQscixuKXt2YXIg
aT1kKGUsdCk7cmV0dXJuIGkmJmVbaV0uY2FsbChlLHIsbil9ZnVuY3Rpb24gaChlLHQscil7dmFy
IG49ZChlLHQpO2lmKG4pcmV0dXJuIDA9PT1yLmxlbmd0aD9lW25dLmNhbGwoZSk6MT09PXIubGVu
Z3RoP2Vbbl0uY2FsbChlLHJbMF0pOjI9PT1yLmxlbmd0aD9lW25dLmNhbGwoZSxyWzBdLHJbMV0p
OmVbbl0uYXBwbHkoZSxyKX1lLmV4dHJhY3RRdWVyeVBhcmFtcz1yLGUubG9nPWksZS5iaW5kPW8s
ZS5mb3JFYWNoPXMsZS50cmlnZ2VyPXUsZS5nZXRDaGFuZ2VsaXN0PWwsZS5wcm9taXNlTGFiZWw9
YyxlLnN1YmNsYXNzPWY7dmFyIG0sdj1BcnJheS5wcm90b3R5cGUuc2xpY2U7bT1BcnJheS5pc0Fy
cmF5P0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9i
amVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX07dmFyIGI9bTtlLmlzQXJyYXk9Yjt2YXIg
Zz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3Rv
dHlwZT1lLG5ldyB0fTtlLm9DcmVhdGU9ZyxlLm1lcmdlPXQsZS5zbGljZT12LGUuaXNQYXJhbT1h
LGUuY29lcmNlUXVlcnlQYXJhbXNUb1N0cmluZz1uLGUuY2FsbEhvb2s9cCxlLnJlc29sdmVIb29r
PWQsZS5hcHBseUhvb2s9aH0pLGUoInJzdnAiLFsiZXhwb3J0cyIsInJzdnAvcHJvbWlzZSIsInJz
dnAvZXZlbnRzIiwicnN2cC9ub2RlIiwicnN2cC9hbGwiLCJyc3ZwL2FsbC1zZXR0bGVkIiwicnN2
cC9yYWNlIiwicnN2cC9oYXNoIiwicnN2cC9oYXNoLXNldHRsZWQiLCJyc3ZwL3JldGhyb3ciLCJy
c3ZwL2RlZmVyIiwicnN2cC9jb25maWciLCJyc3ZwL21hcCIsInJzdnAvcmVzb2x2ZSIsInJzdnAv
cmVqZWN0IiwicnN2cC9maWx0ZXIiLCJyc3ZwL2FzYXAiXSxmdW5jdGlvbihlLHQscixuLGksbyxh
LHMsdSxsLGMsZixkLHAsaCxtLHYpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGUsdCl7Zi5jb25m
aWcuYXN5bmMoZSx0KX1mdW5jdGlvbiBnKCl7Zi5jb25maWcub24uYXBwbHkoZi5jb25maWcsYXJn
dW1lbnRzKX1mdW5jdGlvbiB5KCl7Zi5jb25maWcub2ZmLmFwcGx5KGYuY29uZmlnLGFyZ3VtZW50
cyl9Zi5jb25maWcuYXN5bmM9di5kZWZhdWx0LGYuY29uZmlnLmFmdGVyPWZ1bmN0aW9uKGUpe3Nl
dFRpbWVvdXQoZSwwKX07dmFyIF89cC5kZWZhdWx0O2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2lu
ZG93JiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5fX1BST01JU0VfSU5TVFJVTUVOVEFUSU9OX18p
e3ZhciB3PXdpbmRvdy5fX1BST01JU0VfSU5TVFJVTUVOVEFUSU9OX187Zi5jb25maWd1cmUoImlu
c3RydW1lbnQiLCEwKTtmb3IodmFyIHggaW4gdyl3Lmhhc093blByb3BlcnR5KHgpJiZnKHgsd1t4
XSl9ZS5jYXN0PV8sZS5Qcm9taXNlPXQuZGVmYXVsdCxlLkV2ZW50VGFyZ2V0PXIuZGVmYXVsdCxl
LmFsbD1pLmRlZmF1bHQsZS5hbGxTZXR0bGVkPW8uZGVmYXVsdCxlLnJhY2U9YS5kZWZhdWx0LGUu
aGFzaD1zLmRlZmF1bHQsZS5oYXNoU2V0dGxlZD11LmRlZmF1bHQsZS5yZXRocm93PWwuZGVmYXVs
dCxlLmRlZmVyPWMuZGVmYXVsdCxlLmRlbm9kZWlmeT1uLmRlZmF1bHQsZS5jb25maWd1cmU9Zi5j
b25maWd1cmUsZS5vbj1nLGUub2ZmPXksZS5yZXNvbHZlPXAuZGVmYXVsdCxlLnJlamVjdD1oLmRl
ZmF1bHQsZS5hc3luYz1iLGUubWFwPWQuZGVmYXVsdCxlLmZpbHRlcj1tLmRlZmF1bHR9KSxlKCJy
c3ZwLnVtZCIsWyJleHBvcnRzIiwicnN2cC9wbGF0Zm9ybSIsInJzdnAiXSxmdW5jdGlvbihlLHQs
cil7InVzZSBzdHJpY3QiO3ZhciBuPXtyYWNlOnIucmFjZSxQcm9taXNlOnIuUHJvbWlzZSxhbGxT
ZXR0bGVkOnIuYWxsU2V0dGxlZCxoYXNoOnIuaGFzaCxoYXNoU2V0dGxlZDpyLmhhc2hTZXR0bGVk
LGRlbm9kZWlmeTpyLmRlbm9kZWlmeSxvbjpyLm9uLG9mZjpyLm9mZixtYXA6ci5tYXAsZmlsdGVy
OnIuZmlsdGVyLHJlc29sdmU6ci5yZXNvbHZlLHJlamVjdDpyLnJlamVjdCxhbGw6ci5hbGwscmV0
aHJvdzpyLnJldGhyb3csZGVmZXI6ci5kZWZlcixFdmVudFRhcmdldDpyLkV2ZW50VGFyZ2V0LGNv
bmZpZ3VyZTpyLmNvbmZpZ3VyZSxhc3luYzpyLmFzeW5jfTsiZnVuY3Rpb24iPT10eXBlb2YgZGVm
aW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBufSk6InVuZGVmaW5lZCIh
PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPW46InVuZGVmaW5l
ZCIhPXR5cGVvZiB0LmRlZmF1bHQmJih0LmRlZmF1bHQuUlNWUD1uKX0pLGUoInJzdnAvLWludGVy
bmFsIixbImV4cG9ydHMiLCJyc3ZwL3V0aWxzIiwicnN2cC9pbnN0cnVtZW50IiwicnN2cC9jb25m
aWciXSxmdW5jdGlvbihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSgpe3JldHVybiBu
ZXcgVHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1l
IHByb21pc2UuIil9ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBhKGUpe3RyeXtyZXR1cm4gZS50aGVu
fWNhdGNoKGUpe3JldHVybiBDLmVycm9yPWUsQ319ZnVuY3Rpb24gcyhlLHQscixuKXt0cnl7ZS5j
YWxsKHQscixuKX1jYXRjaChlKXtyZXR1cm4gZX19ZnVuY3Rpb24gdShlLHQscil7bi5jb25maWcu
YXN5bmMoZnVuY3Rpb24oZSl7dmFyIG49ITEsaT1zKHIsdCxmdW5jdGlvbihyKXtufHwobj0hMCx0
IT09cj9mKGUscik6cChlLHIpKX0sZnVuY3Rpb24odCl7bnx8KG49ITAsaChlLHQpKX0sIlNldHRs
ZTogIisoZS5fbGFiZWx8fCIgdW5rbm93biBwcm9taXNlIikpOyFuJiZpJiYobj0hMCxoKGUsaSkp
fSxlKX1mdW5jdGlvbiBsKGUsdCl7dC5fc3RhdGU9PT14P3AoZSx0Ll9yZXN1bHQpOnQuX3N0YXRl
PT09az8odC5fb25FcnJvcj1udWxsLGgoZSx0Ll9yZXN1bHQpKTptKHQsdm9pZCAwLGZ1bmN0aW9u
KHIpe3QhPT1yP2YoZSxyKTpwKGUscil9LGZ1bmN0aW9uKHQpe2goZSx0KX0pfWZ1bmN0aW9uIGMo
ZSxyKXtpZihyLmNvbnN0cnVjdG9yPT09ZS5jb25zdHJ1Y3RvcilsKGUscik7ZWxzZXt2YXIgbj1h
KHIpO249PT1DP2goZSxDLmVycm9yKTp2b2lkIDA9PT1uP3AoZSxyKTp0LmlzRnVuY3Rpb24obik/
dShlLHIsbik6cChlLHIpfX1mdW5jdGlvbiBmKGUscil7ZT09PXI/cChlLHIpOnQub2JqZWN0T3JG
dW5jdGlvbihyKT9jKGUscik6cChlLHIpfWZ1bmN0aW9uIGQoZSl7ZS5fb25FcnJvciYmZS5fb25F
cnJvcihlLl9yZXN1bHQpLHYoZSl9ZnVuY3Rpb24gcChlLHQpe2UuX3N0YXRlPT09dyYmKGUuX3Jl
c3VsdD10LGUuX3N0YXRlPXgsMD09PWUuX3N1YnNjcmliZXJzLmxlbmd0aD9uLmNvbmZpZy5pbnN0
cnVtZW50JiZyLmRlZmF1bHQoImZ1bGZpbGxlZCIsZSk6bi5jb25maWcuYXN5bmModixlKSl9ZnVu
Y3Rpb24gaChlLHQpe2UuX3N0YXRlPT09dyYmKGUuX3N0YXRlPWssZS5fcmVzdWx0PXQsbi5jb25m
aWcuYXN5bmMoZCxlKSl9ZnVuY3Rpb24gbShlLHQscixpKXt2YXIgbz1lLl9zdWJzY3JpYmVycyxh
PW8ubGVuZ3RoO2UuX29uRXJyb3I9bnVsbCxvW2FdPXQsb1thK3hdPXIsb1thK2tdPWksMD09PWEm
JmUuX3N0YXRlJiZuLmNvbmZpZy5hc3luYyh2LGUpfWZ1bmN0aW9uIHYoZSl7dmFyIHQ9ZS5fc3Vi
c2NyaWJlcnMsaT1lLl9zdGF0ZTtpZihuLmNvbmZpZy5pbnN0cnVtZW50JiZyLmRlZmF1bHQoaT09
PXg/ImZ1bGZpbGxlZCI6InJlamVjdGVkIixlKSwwIT09dC5sZW5ndGgpe2Zvcih2YXIgbyxhLHM9
ZS5fcmVzdWx0LHU9MDt1PHQubGVuZ3RoO3UrPTMpbz10W3VdLGE9dFt1K2ldLG8/eShpLG8sYSxz
KTphKHMpO2UuX3N1YnNjcmliZXJzLmxlbmd0aD0wfX1mdW5jdGlvbiBiKCl7dGhpcy5lcnJvcj1u
dWxsfWZ1bmN0aW9uIGcoZSx0KXt0cnl7cmV0dXJuIGUodCl9Y2F0Y2goZSl7cmV0dXJuIEUuZXJy
b3I9ZSxFfX1mdW5jdGlvbiB5KGUscixuLG8pe3ZhciBhLHMsdSxsLGM9dC5pc0Z1bmN0aW9uKG4p
O2lmKGMpe2lmKGE9ZyhuLG8pLGE9PT1FPyhsPSEwLHM9YS5lcnJvcixhPW51bGwpOnU9ITAscj09
PWEpcmV0dXJuIHZvaWQgaChyLGkoKSl9ZWxzZSBhPW8sdT0hMDtyLl9zdGF0ZSE9PXd8fChjJiZ1
P2YocixhKTpsP2gocixzKTplPT09eD9wKHIsYSk6ZT09PWsmJmgocixhKSl9ZnVuY3Rpb24gXyhl
LHQpe3ZhciByPSExO3RyeXt0KGZ1bmN0aW9uKHQpe3J8fChyPSEwLGYoZSx0KSl9LGZ1bmN0aW9u
KHQpe3J8fChyPSEwLGgoZSx0KSl9KX1jYXRjaCh0KXtoKGUsdCl9fXZhciB3PXZvaWQgMCx4PTEs
az0yLEM9bmV3IGIsRT1uZXcgYjtlLm5vb3A9byxlLnJlc29sdmU9ZixlLnJlamVjdD1oLGUuZnVs
ZmlsbD1wLGUuc3Vic2NyaWJlPW0sZS5wdWJsaXNoPXYsZS5wdWJsaXNoUmVqZWN0aW9uPWQsZS5p
bml0aWFsaXplUHJvbWlzZT1fLGUuaW52b2tlQ2FsbGJhY2s9eSxlLkZVTEZJTExFRD14LGUuUkVK
RUNURUQ9ayxlLlBFTkRJTkc9d30pLGUoInJzdnAvYWxsLXNldHRsZWQiLFsiZXhwb3J0cyIsInJz
dnAvZW51bWVyYXRvciIsInJzdnAvcHJvbWlzZSIsInJzdnAvdXRpbHMiXSxmdW5jdGlvbihlLHQs
cixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQscil7dGhpcy5fc3VwZXJDb25zdHJ1Y3Rv
cihlLHQsITEscil9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBuZXcgaShyLmRlZmF1bHQsZSx0KS5w
cm9taXNlfWUuZGVmYXVsdD1vLGkucHJvdG90eXBlPW4ub19jcmVhdGUodC5kZWZhdWx0LnByb3Rv
dHlwZSksaS5wcm90b3R5cGUuX3N1cGVyQ29uc3RydWN0b3I9dC5kZWZhdWx0LGkucHJvdG90eXBl
Ll9tYWtlUmVzdWx0PXQubWFrZVNldHRsZWRSZXN1bHQsaS5wcm90b3R5cGUuX3ZhbGlkYXRpb25F
cnJvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoImFsbFNldHRsZWQgbXVzdCBiZSBjYWxs
ZWQgd2l0aCBhbiBhcnJheSIpfX0pLGUoInJzdnAvYWxsIixbImV4cG9ydHMiLCJyc3ZwL3Byb21p
c2UiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUscil7cmV0dXJuIHQu
ZGVmYXVsdC5hbGwoZSxyKX1lLmRlZmF1bHQ9cn0pLGUoInJzdnAvYXNhcCIsWyJleHBvcnRzIl0s
ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSx0KXtnW2RdPWUsZ1tkKzFdPXQs
ZCs9MiwyPT09ZCYmZigpfWZ1bmN0aW9uIG4oKXt2YXIgZT1wcm9jZXNzLm5leHRUaWNrLHQ9cHJv
Y2Vzcy52ZXJzaW9ucy5ub2RlLm1hdGNoKC9eKD86KFxkKylcLik/KD86KFxkKylcLik/KFwqfFxk
KykkLyk7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJiIwIj09PXRbMV0mJiIxMCI9PT10WzJdJiYo
ZT1zZXRJbW1lZGlhdGUpLGZ1bmN0aW9uKCl7ZSh1KX19ZnVuY3Rpb24gaSgpe3JldHVybiBmdW5j
dGlvbigpe2ModSl9fWZ1bmN0aW9uIG8oKXt2YXIgZT0wLHQ9bmV3IG0odSkscj1kb2N1bWVudC5j
cmVhdGVUZXh0Tm9kZSgiIik7cmV0dXJuIHQub2JzZXJ2ZShyLHtjaGFyYWN0ZXJEYXRhOiEwfSks
ZnVuY3Rpb24oKXtyLmRhdGE9ZT0rK2UlMn19ZnVuY3Rpb24gYSgpe3ZhciBlPW5ldyBNZXNzYWdl
Q2hhbm5lbDtyZXR1cm4gZS5wb3J0MS5vbm1lc3NhZ2U9dSxmdW5jdGlvbigpe2UucG9ydDIucG9z
dE1lc3NhZ2UoMCl9fWZ1bmN0aW9uIHMoKXtyZXR1cm4gZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHUs
MSl9fWZ1bmN0aW9uIHUoKXtmb3IodmFyIGU9MDtlPGQ7ZSs9Mil7dmFyIHQ9Z1tlXSxyPWdbZSsx
XTt0KHIpLGdbZV09dm9pZCAwLGdbZSsxXT12b2lkIDB9ZD0wfWZ1bmN0aW9uIGwoKXt0cnl7dmFy
IGU9cix0PWUoInZlcnR4Iik7cmV0dXJuIGM9dC5ydW5Pbkxvb3B8fHQucnVuT25Db250ZXh0LGko
KX1jYXRjaChlKXtyZXR1cm4gcygpfX1lLmRlZmF1bHQ9dDt2YXIgYyxmLGQ9MCxwPSh7fS50b1N0
cmluZywidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwKSxoPXB8fHt9LG09
aC5NdXRhdGlvbk9ic2VydmVyfHxoLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdj0idW5kZWZpbmVk
Ij09dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiYiW29iamVjdCBw
cm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpLGI9InVuZGVmaW5lZCIhPXR5cGVv
ZiBVaW50OENsYW1wZWRBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBpbXBvcnRTY3JpcHRzJiYi
dW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsLGc9bmV3IEFycmF5KDFlMyk7Zj12P24o
KTptP28oKTpiP2EoKTp2b2lkIDA9PT1wJiYiZnVuY3Rpb24iPT10eXBlb2Ygcj9sKCk6cygpfSks
ZSgicnN2cC9jb25maWciLFsiZXhwb3J0cyIsInJzdnAvZXZlbnRzIl0sZnVuY3Rpb24oZSx0KXsi
dXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiJvbmVycm9yIj09PWU/dm9pZCBuLm9u
KCJlcnJvciIsdCk6MiE9PWFyZ3VtZW50cy5sZW5ndGg/bltlXTp2b2lkKG5bZV09dCl9dmFyIG49
e2luc3RydW1lbnQ6ITF9O3QuZGVmYXVsdC5taXhpbihuKSxlLmNvbmZpZz1uLGUuY29uZmlndXJl
PXJ9KSxlKCJyc3ZwL2RlZmVyIixbImV4cG9ydHMiLCJyc3ZwL3Byb21pc2UiXSxmdW5jdGlvbihl
LHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciByPXt9O3JldHVybiByLnByb21pc2U9
bmV3IHQuZGVmYXVsdChmdW5jdGlvbihlLHQpe3IucmVzb2x2ZT1lLHIucmVqZWN0PXR9LGUpLHJ9
ZS5kZWZhdWx0PXJ9KSxlKCJyc3ZwL2VudW1lcmF0b3IiLFsiZXhwb3J0cyIsInJzdnAvdXRpbHMi
LCJyc3ZwLy1pbnRlcm5hbCJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
bihlLHQsbil7cmV0dXJuIGU9PT1yLkZVTEZJTExFRD97c3RhdGU6ImZ1bGZpbGxlZCIsdmFsdWU6
bn06e3N0YXRlOiJyZWplY3RlZCIscmVhc29uOm59fWZ1bmN0aW9uIGkoZSx0LG4saSl7dmFyIG89
dGhpcztvLl9pbnN0YW5jZUNvbnN0cnVjdG9yPWUsby5wcm9taXNlPW5ldyBlKHIubm9vcCxpKSxv
Ll9hYm9ydE9uUmVqZWN0PW4sby5fdmFsaWRhdGVJbnB1dCh0KT8oby5faW5wdXQ9dCxvLmxlbmd0
aD10Lmxlbmd0aCxvLl9yZW1haW5pbmc9dC5sZW5ndGgsby5faW5pdCgpLDA9PT1vLmxlbmd0aD9y
LmZ1bGZpbGwoby5wcm9taXNlLG8uX3Jlc3VsdCk6KG8ubGVuZ3RoPW8ubGVuZ3RofHwwLG8uX2Vu
dW1lcmF0ZSgpLDA9PT1vLl9yZW1haW5pbmcmJnIuZnVsZmlsbChvLnByb21pc2Usby5fcmVzdWx0
KSkpOnIucmVqZWN0KG8ucHJvbWlzZSxvLl92YWxpZGF0aW9uRXJyb3IoKSl9ZS5tYWtlU2V0dGxl
ZFJlc3VsdD1uLGUuZGVmYXVsdD1pLGkucHJvdG90eXBlLl92YWxpZGF0ZUlucHV0PWZ1bmN0aW9u
KGUpe3JldHVybiB0LmlzQXJyYXkoZSl9LGkucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3I9ZnVu
Y3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQg
YW4gQXJyYXkiKX0saS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHQ9bmV3
IEFycmF5KHRoaXMubGVuZ3RoKX0saS5wcm90b3R5cGUuX2VudW1lcmF0ZT1mdW5jdGlvbigpe2Zv
cih2YXIgZT10aGlzLHQ9ZS5sZW5ndGgsbj1lLnByb21pc2UsaT1lLl9pbnB1dCxvPTA7bi5fc3Rh
dGU9PT1yLlBFTkRJTkcmJm88dDtvKyspZS5fZWFjaEVudHJ5KGlbb10sbyl9LGkucHJvdG90eXBl
Ll9lYWNoRW50cnk9ZnVuY3Rpb24oZSxuKXt2YXIgaT10aGlzLG89aS5faW5zdGFuY2VDb25zdHJ1
Y3Rvcjt0LmlzTWF5YmVUaGVuYWJsZShlKT9lLmNvbnN0cnVjdG9yPT09byYmZS5fc3RhdGUhPT1y
LlBFTkRJTkc/KGUuX29uRXJyb3I9bnVsbCxpLl9zZXR0bGVkQXQoZS5fc3RhdGUsbixlLl9yZXN1
bHQpKTppLl93aWxsU2V0dGxlQXQoby5yZXNvbHZlKGUpLG4pOihpLl9yZW1haW5pbmctLSxpLl9y
ZXN1bHRbbl09aS5fbWFrZVJlc3VsdChyLkZVTEZJTExFRCxuLGUpKX0saS5wcm90b3R5cGUuX3Nl
dHRsZWRBdD1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcyxvPWkucHJvbWlzZTtvLl9zdGF0ZT09
PXIuUEVORElORyYmKGkuX3JlbWFpbmluZy0tLGkuX2Fib3J0T25SZWplY3QmJmU9PT1yLlJFSkVD
VEVEP3IucmVqZWN0KG8sbik6aS5fcmVzdWx0W3RdPWkuX21ha2VSZXN1bHQoZSx0LG4pKSwwPT09
aS5fcmVtYWluaW5nJiZyLmZ1bGZpbGwobyxpLl9yZXN1bHQpfSxpLnByb3RvdHlwZS5fbWFrZVJl
c3VsdD1mdW5jdGlvbihlLHQscil7cmV0dXJuIHJ9LGkucHJvdG90eXBlLl93aWxsU2V0dGxlQXQ9
ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3Iuc3Vic2NyaWJlKGUsdm9pZCAwLGZ1bmN0aW9uKGUp
e24uX3NldHRsZWRBdChyLkZVTEZJTExFRCx0LGUpfSxmdW5jdGlvbihlKXtuLl9zZXR0bGVkQXQo
ci5SRUpFQ1RFRCx0LGUpfSl9fSksZSgicnN2cC9ldmVudHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9u
KGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aDty
PG47cisrKWlmKGVbcl09PT10KXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHIoZSl7dmFyIHQ9
ZS5fcHJvbWlzZUNhbGxiYWNrcztyZXR1cm4gdHx8KHQ9ZS5fcHJvbWlzZUNhbGxiYWNrcz17fSks
dH1lLmRlZmF1bHQ9e21peGluOmZ1bmN0aW9uKGUpe3JldHVybiBlLm9uPXRoaXMub24sZS5vZmY9
dGhpcy5vZmYsZS50cmlnZ2VyPXRoaXMudHJpZ2dlcixlLl9wcm9taXNlQ2FsbGJhY2tzPXZvaWQg
MCxlfSxvbjpmdW5jdGlvbihlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBU
eXBlRXJyb3IoIkNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBpLG89cih0aGlzKTtp
PW9bZV0saXx8KGk9b1tlXT1bXSksdChpLG4pPT09LTEmJmkucHVzaChuKX0sb2ZmOmZ1bmN0aW9u
KGUsbil7dmFyIGksbyxhPXIodGhpcyk7cmV0dXJuIG4/KGk9YVtlXSxvPXQoaSxuKSx2b2lkKG8h
PT0tMSYmaS5zcGxpY2UobywxKSkpOnZvaWQoYVtlXT1bXSl9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0
KXt2YXIgbixpLG89cih0aGlzKTtpZihuPW9bZV0pZm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKysp
KGk9blthXSkodCl9fX0pLGUoInJzdnAvZmlsdGVyIixbImV4cG9ydHMiLCJyc3ZwL3Byb21pc2Ui
LCJyc3ZwL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUs
bixpKXtyZXR1cm4gdC5kZWZhdWx0LmFsbChlLGkpLnRoZW4oZnVuY3Rpb24oZSl7aWYoIXIuaXNG
dW5jdGlvbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24g
YXMgZmlsdGVyJ3Mgc2Vjb25kIGFyZ3VtZW50LiIpO2Zvcih2YXIgbz1lLmxlbmd0aCxhPW5ldyBB
cnJheShvKSxzPTA7czxvO3MrKylhW3NdPW4oZVtzXSk7cmV0dXJuIHQuZGVmYXVsdC5hbGwoYSxp
KS50aGVuKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1uZXcgQXJyYXkobyksbj0wLGk9MDtpPG87aSsr
KXRbaV0mJihyW25dPWVbaV0sbisrKTtyZXR1cm4gci5sZW5ndGg9bixyfSl9KX1lLmRlZmF1bHQ9
bn0pLGUoInJzdnAvaGFzaC1zZXR0bGVkIixbImV4cG9ydHMiLCJyc3ZwL3Byb21pc2UiLCJyc3Zw
L2VudW1lcmF0b3IiLCJyc3ZwL3Byb21pc2UtaGFzaCIsInJzdnAvdXRpbHMiXSxmdW5jdGlvbihl
LHQscixuLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxyKXt0aGlzLl9zdXBlckNvbnN0
cnVjdG9yKGUsdCwhMSxyKX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIG5ldyBvKHQuZGVmYXVsdCxl
LHIpLnByb21pc2V9ZS5kZWZhdWx0PWEsby5wcm90b3R5cGU9aS5vX2NyZWF0ZShuLmRlZmF1bHQu
cHJvdG90eXBlKSxvLnByb3RvdHlwZS5fc3VwZXJDb25zdHJ1Y3Rvcj1yLmRlZmF1bHQsby5wcm90
b3R5cGUuX21ha2VSZXN1bHQ9ci5tYWtlU2V0dGxlZFJlc3VsdCxvLnByb3RvdHlwZS5fdmFsaWRh
dGlvbkVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiaGFzaFNldHRsZWQgbXVzdCBi
ZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QiKX19KSxlKCJyc3ZwL2hhc2giLFsiZXhwb3J0cyIsInJz
dnAvcHJvbWlzZSIsInJzdnAvcHJvbWlzZS1oYXNoIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3Ry
aWN0IjtmdW5jdGlvbiBuKGUsbil7cmV0dXJuIG5ldyByLmRlZmF1bHQodC5kZWZhdWx0LGUsbiku
cHJvbWlzZX1lLmRlZmF1bHQ9bn0pLGUoInJzdnAvaW5zdHJ1bWVudCIsWyJleHBvcnRzIiwicnN2
cC9jb25maWciLCJyc3ZwL3V0aWxzIl0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5j
dGlvbiBuKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgZSxyPTA7cjxvLmxlbmd0aDty
Kyspe2U9b1tyXTt2YXIgbj1lLnBheWxvYWQ7bi5ndWlkPW4ua2V5K24uaWQsbi5jaGlsZEd1aWQ9
bi5rZXkrbi5jaGlsZElkLG4uZXJyb3ImJihuLnN0YWNrPW4uZXJyb3Iuc3RhY2spLHQuY29uZmln
LnRyaWdnZXIoZS5uYW1lLGUucGF5bG9hZCl9by5sZW5ndGg9MH0sNTApfWZ1bmN0aW9uIGkoZSxp
LGEpezE9PT1vLnB1c2goe25hbWU6ZSxwYXlsb2FkOntrZXk6aS5fZ3VpZEtleSxpZDppLl9pZCxl
dmVudE5hbWU6ZSxkZXRhaWw6aS5fcmVzdWx0LGNoaWxkSWQ6YSYmYS5faWQsbGFiZWw6aS5fbGFi
ZWwsdGltZVN0YW1wOnIubm93KCksZXJyb3I6dC5jb25maWdbImluc3RydW1lbnQtd2l0aC1zdGFj
ayJdP25ldyBFcnJvcihpLl9sYWJlbCk6bnVsbH19KSYmbigpfWUuZGVmYXVsdD1pO3ZhciBvPVtd
fSksZSgicnN2cC9tYXAiLFsiZXhwb3J0cyIsInJzdnAvcHJvbWlzZSIsInJzdnAvdXRpbHMiXSxm
dW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSxuLGkpe3JldHVybiB0LmRl
ZmF1bHQuYWxsKGUsaSkudGhlbihmdW5jdGlvbihlKXtpZighci5pc0Z1bmN0aW9uKG4pKXRocm93
IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBtYXAncyBzZWNvbmQg
YXJndW1lbnQuIik7Zm9yKHZhciBvPWUubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9MDtzPG87cysr
KWFbc109bihlW3NdKTtyZXR1cm4gdC5kZWZhdWx0LmFsbChhLGkpfSl9ZS5kZWZhdWx0PW59KSxl
KCJyc3ZwL25vZGUiLFsiZXhwb3J0cyIsInJzdnAvcHJvbWlzZSIsInJzdnAvLWludGVybmFsIiwi
cnN2cC91dGlscyJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUs
dCl7Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLG49MDtuPHIubGVuZ3Ro
O24rKyl7dmFyIGk9cltuXSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTtv
JiZvLmNvbmZpZ3VyYWJsZSYmdm9pZCAwPT09ZVtpXSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUs
aSxvKX1yZXR1cm4gZX1mdW5jdGlvbiBvKCl7dGhpcy52YWx1ZT12b2lkIDB9ZnVuY3Rpb24gYShl
KXt0cnl7cmV0dXJuIGUudGhlbn1jYXRjaChlKXtyZXR1cm4gbS52YWx1ZT1lLG19fWZ1bmN0aW9u
IHMoZSx0LHIpe3RyeXtlLmFwcGx5KHQscil9Y2F0Y2goZSl7cmV0dXJuIG0udmFsdWU9ZSxtfX1m
dW5jdGlvbiB1KGUsdCl7Zm9yKHZhciByLG4saT17fSxvPWUubGVuZ3RoLGE9bmV3IEFycmF5KG8p
LHM9MDtzPG87cysrKWFbc109ZVtzXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXI9dFtuXSxpW3Jd
PWFbbisxXTtyZXR1cm4gaX1mdW5jdGlvbiBsKGUpe2Zvcih2YXIgdD1lLmxlbmd0aCxyPW5ldyBB
cnJheSh0LTEpLG49MTtuPHQ7bisrKXJbbi0xXT1lW25dOworcmV0dXJuIHJ9ZnVuY3Rpb24gYyhl
LHQpe3JldHVybnt0aGVuOmZ1bmN0aW9uKHIsbil7cmV0dXJuIGUuY2FsbCh0LHIsbil9fX1mdW5j
dGlvbiBmKGUsbyl7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGksYT10aGlzLHM9YXJndW1lbnRz
Lmxlbmd0aCxmPW5ldyBBcnJheShzKzEpLG09ITEsYj0wO2I8czsrK2Ipe2lmKGk9YXJndW1lbnRz
W2JdLCFtKXtpZihtPWgoaSksbT09PXYpe3ZhciBnPW5ldyB0LmRlZmF1bHQoci5ub29wKTtyZXR1
cm4gci5yZWplY3QoZyx2LnZhbHVlKSxnfW0mJm0hPT0hMCYmKGk9YyhtLGkpKX1mW2JdPWl9dmFy
IHk9bmV3IHQuZGVmYXVsdChyLm5vb3ApO3JldHVybiBmW3NdPWZ1bmN0aW9uKGUsdCl7ZT9yLnJl
amVjdCh5LGUpOnZvaWQgMD09PW8/ci5yZXNvbHZlKHksdCk6bz09PSEwP3IucmVzb2x2ZSh5LGwo
YXJndW1lbnRzKSk6bi5pc0FycmF5KG8pP3IucmVzb2x2ZSh5LHUoYXJndW1lbnRzLG8pKTpyLnJl
c29sdmUoeSx0KX0sbT9wKHksZixlLGEpOmQoeSxmLGUsYSl9O3JldHVybiBpKGEsZSksYX1mdW5j
dGlvbiBkKGUsdCxuLGkpe3ZhciBvPXMobixpLHQpO3JldHVybiBvPT09bSYmci5yZWplY3QoZSxv
LnZhbHVlKSxlfWZ1bmN0aW9uIHAoZSxuLGksbyl7cmV0dXJuIHQuZGVmYXVsdC5hbGwobikudGhl
bihmdW5jdGlvbih0KXt2YXIgbj1zKGksbyx0KTtyZXR1cm4gbj09PW0mJnIucmVqZWN0KGUsbi52
YWx1ZSksZX0pfWZ1bmN0aW9uIGgoZSl7cmV0dXJuISghZXx8Im9iamVjdCIhPXR5cGVvZiBlKSYm
KGUuY29uc3RydWN0b3I9PT10LmRlZmF1bHR8fGEoZSkpfWUuZGVmYXVsdD1mO3ZhciBtPW5ldyBv
LHY9bmV3IG99KSxlKCJyc3ZwL3BsYXRmb3JtIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNl
IHN0cmljdCI7dmFyIHQ7aWYoIm9iamVjdCI9PXR5cGVvZiBzZWxmKXQ9c2VsZjtlbHNle2lmKCJv
YmplY3QiIT10eXBlb2YgZ2xvYmFsKXRocm93IG5ldyBFcnJvcigibm8gZ2xvYmFsOiBgc2VsZmAg
b3IgYGdsb2JhbGAgZm91bmQiKTt0PWdsb2JhbH1lLmRlZmF1bHQ9dH0pLGUoInJzdnAvcHJvbWlz
ZS1oYXNoIixbImV4cG9ydHMiLCJyc3ZwL2VudW1lcmF0b3IiLCJyc3ZwLy1pbnRlcm5hbCIsInJz
dnAvdXRpbHMiXSxmdW5jdGlvbihlLHQscixuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQs
cil7dGhpcy5fc3VwZXJDb25zdHJ1Y3RvcihlLHQsITAscil9ZS5kZWZhdWx0PWksaS5wcm90b3R5
cGU9bi5vX2NyZWF0ZSh0LmRlZmF1bHQucHJvdG90eXBlKSxpLnByb3RvdHlwZS5fc3VwZXJDb25z
dHJ1Y3Rvcj10LmRlZmF1bHQsaS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1
bHQ9e319LGkucHJvdG90eXBlLl92YWxpZGF0ZUlucHV0PWZ1bmN0aW9uKGUpe3JldHVybiBlJiYi
b2JqZWN0Ij09dHlwZW9mIGV9LGkucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3I9ZnVuY3Rpb24o
KXtyZXR1cm4gbmV3IEVycm9yKCJQcm9taXNlLmhhc2ggbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBv
YmplY3QiKX0saS5wcm90b3R5cGUuX2VudW1lcmF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1l
LnByb21pc2Usbj1lLl9pbnB1dCxpPVtdO2Zvcih2YXIgbyBpbiBuKXQuX3N0YXRlPT09ci5QRU5E
SU5HJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixvKSYmaS5wdXNoKHtw
b3NpdGlvbjpvLGVudHJ5Om5bb119KTt2YXIgYT1pLmxlbmd0aDtlLl9yZW1haW5pbmc9YTtmb3Io
dmFyIHMsdT0wO3QuX3N0YXRlPT09ci5QRU5ESU5HJiZ1PGE7dSsrKXM9aVt1XSxlLl9lYWNoRW50
cnkocy5lbnRyeSxzLnBvc2l0aW9uKX19KSxlKCJyc3ZwL3Byb21pc2UiLFsiZXhwb3J0cyIsInJz
dnAvY29uZmlnIiwicnN2cC9pbnN0cnVtZW50IiwicnN2cC91dGlscyIsInJzdnAvLWludGVybmFs
IiwicnN2cC9wcm9taXNlL2FsbCIsInJzdnAvcHJvbWlzZS9yYWNlIiwicnN2cC9wcm9taXNlL3Jl
c29sdmUiLCJyc3ZwL3Byb21pc2UvcmVqZWN0Il0sZnVuY3Rpb24oZSx0LHIsbixpLG8sYSxzLHUp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3Qg
cGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJv
bWlzZSBjb25zdHJ1Y3RvciIpfWZ1bmN0aW9uIGMoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWls
ZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3Is
IHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4i
KX1mdW5jdGlvbiBmKGUsbyl7dmFyIGE9dGhpczthLl9pZD1wKyssYS5fbGFiZWw9byxhLl9zdGF0
ZT12b2lkIDAsYS5fcmVzdWx0PXZvaWQgMCxhLl9zdWJzY3JpYmVycz1bXSx0LmNvbmZpZy5pbnN0
cnVtZW50JiZyLmRlZmF1bHQoImNyZWF0ZWQiLGEpLGkubm9vcCE9PWUmJihuLmlzRnVuY3Rpb24o
ZSl8fGwoKSxhIGluc3RhbmNlb2YgZnx8YygpLGkuaW5pdGlhbGl6ZVByb21pc2UoYSxlKSl9ZS5k
ZWZhdWx0PWY7dmFyIGQ9InJzdnBfIituLm5vdygpKyItIixwPTA7Zi5jYXN0PXMuZGVmYXVsdCxm
LmFsbD1vLmRlZmF1bHQsZi5yYWNlPWEuZGVmYXVsdCxmLnJlc29sdmU9cy5kZWZhdWx0LGYucmVq
ZWN0PXUuZGVmYXVsdCxmLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZixfZ3VpZEtleTpkLF9vbkVy
cm9yOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7dC5jb25maWcuYWZ0ZXIoZnVuY3Rpb24oKXtyLl9v
bkVycm9yJiZ0LmNvbmZpZy50cmlnZ2VyKCJlcnJvciIsZSl9KX0sdGhlbjpmdW5jdGlvbihlLG4s
byl7dmFyIGE9dGhpcyxzPWEuX3N0YXRlO2lmKHM9PT1pLkZVTEZJTExFRCYmIWV8fHM9PT1pLlJF
SkVDVEVEJiYhbilyZXR1cm4gdC5jb25maWcuaW5zdHJ1bWVudCYmci5kZWZhdWx0KCJjaGFpbmVk
IixhLGEpLGE7YS5fb25FcnJvcj1udWxsO3ZhciB1PW5ldyBhLmNvbnN0cnVjdG9yKGkubm9vcCxv
KSxsPWEuX3Jlc3VsdDtpZih0LmNvbmZpZy5pbnN0cnVtZW50JiZyLmRlZmF1bHQoImNoYWluZWQi
LGEsdSkscyl7dmFyIGM9YXJndW1lbnRzW3MtMV07dC5jb25maWcuYXN5bmMoZnVuY3Rpb24oKXtp
Lmludm9rZUNhbGxiYWNrKHMsdSxjLGwpfSl9ZWxzZSBpLnN1YnNjcmliZShhLHUsZSxuKTtyZXR1
cm4gdX0sY2F0Y2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxlLHQpfSxm
aW5hbGx5OmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxuPXIuY29uc3RydWN0b3I7cmV0dXJuIHIu
dGhlbihmdW5jdGlvbih0KXtyZXR1cm4gbi5yZXNvbHZlKGUoKSkudGhlbihmdW5jdGlvbigpe3Jl
dHVybiB0fSl9LGZ1bmN0aW9uKHQpe3JldHVybiBuLnJlc29sdmUoZSgpKS50aGVuKGZ1bmN0aW9u
KCl7dGhyb3cgdH0pfSx0KX19fSksZSgicnN2cC9wcm9taXNlL2FsbCIsWyJleHBvcnRzIiwicnN2
cC9lbnVtZXJhdG9yIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHIp
e3JldHVybiBuZXcgdC5kZWZhdWx0KHRoaXMsZSwhMCxyKS5wcm9taXNlfWUuZGVmYXVsdD1yfSks
ZSgicnN2cC9wcm9taXNlL3JhY2UiLFsiZXhwb3J0cyIsInJzdnAvdXRpbHMiLCJyc3ZwLy1pbnRl
cm5hbCJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlLG4pe2Z1bmN0
aW9uIGkoZSl7ci5yZXNvbHZlKHMsZSl9ZnVuY3Rpb24gbyhlKXtyLnJlamVjdChzLGUpfXZhciBh
PXRoaXMscz1uZXcgYShyLm5vb3Asbik7aWYoIXQuaXNBcnJheShlKSlyZXR1cm4gci5yZWplY3Qo
cyxuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuIikpLHM7Zm9y
KHZhciB1PWUubGVuZ3RoLGw9MDtzLl9zdGF0ZT09PXIuUEVORElORyYmbDx1O2wrKylyLnN1YnNj
cmliZShhLnJlc29sdmUoZVtsXSksdm9pZCAwLGksbyk7cmV0dXJuIHN9ZS5kZWZhdWx0PW59KSxl
KCJyc3ZwL3Byb21pc2UvcmVqZWN0IixbImV4cG9ydHMiLCJyc3ZwLy1pbnRlcm5hbCJdLGZ1bmN0
aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSxyKXt2YXIgbj10aGlzLGk9bmV3IG4o
dC5ub29wLHIpO3JldHVybiB0LnJlamVjdChpLGUpLGl9ZS5kZWZhdWx0PXJ9KSxlKCJyc3ZwL3By
b21pc2UvcmVzb2x2ZSIsWyJleHBvcnRzIiwicnN2cC8taW50ZXJuYWwiXSxmdW5jdGlvbihlLHQp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUscil7dmFyIG49dGhpcztpZihlJiYib2JqZWN0Ij09
dHlwZW9mIGUmJmUuY29uc3RydWN0b3I9PT1uKXJldHVybiBlO3ZhciBpPW5ldyBuKHQubm9vcCxy
KTtyZXR1cm4gdC5yZXNvbHZlKGksZSksaX1lLmRlZmF1bHQ9cn0pLGUoInJzdnAvcmFjZSIsWyJl
eHBvcnRzIiwicnN2cC9wcm9taXNlIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rp
b24gcihlLHIpe3JldHVybiB0LmRlZmF1bHQucmFjZShlLHIpfWUuZGVmYXVsdD1yfSksZSgicnN2
cC9yZWplY3QiLFsiZXhwb3J0cyIsInJzdnAvcHJvbWlzZSJdLGZ1bmN0aW9uKGUsdCl7InVzZSBz
dHJpY3QiO2Z1bmN0aW9uIHIoZSxyKXtyZXR1cm4gdC5kZWZhdWx0LnJlamVjdChlLHIpfWUuZGVm
YXVsdD1yfSksZSgicnN2cC9yZXNvbHZlIixbImV4cG9ydHMiLCJyc3ZwL3Byb21pc2UiXSxmdW5j
dGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUscil7cmV0dXJuIHQuZGVmYXVsdC5y
ZXNvbHZlKGUscil9ZS5kZWZhdWx0PXJ9KSxlKCJyc3ZwL3JldGhyb3ciLFsiZXhwb3J0cyJdLGZ1
bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3Rocm93IHNldFRpbWVvdXQoZnVu
Y3Rpb24oKXt0aHJvdyBlfSksZX1lLmRlZmF1bHQ9dH0pLGUoInJzdnAvdXRpbHMiLFsiZXhwb3J0
cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3JldHVybiJmdW5jdGlv
biI9PXR5cGVvZiBlfHwib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIHIoZSl7
cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24gbihlKXtyZXR1cm4ib2JqZWN0Ij09
dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIGkoKXt9ZS5vYmplY3RPckZ1bmN0aW9uPXQsZS5p
c0Z1bmN0aW9uPXIsZS5pc01heWJlVGhlbmFibGU9bjt2YXIgbztvPUFycmF5LmlzQXJyYXk/QXJy
YXkuaXNBcnJheTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnBy
b3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTt2YXIgYT1vO2UuaXNBcnJheT1hO3ZhciBzPURhdGUu
bm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTtlLm5vdz1zO3ZhciB1
PU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl0aHJvdyBu
ZXcgRXJyb3IoIlNlY29uZCBhcmd1bWVudCBub3Qgc3VwcG9ydGVkIik7aWYoIm9iamVjdCIhPXR5
cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0Iik7
cmV0dXJuIGkucHJvdG90eXBlPWUsbmV3IGl9O2Uub19jcmVhdGU9dX0pLGUoInZlcnRleCIsWyJl
eHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7dGhpcy5uYW1l
PWUsdGhpcy5pbmNvbWluZz17fSx0aGlzLmluY29taW5nTmFtZXM9W10sdGhpcy5oYXNPdXRnb2lu
Zz0hMSx0aGlzLnZhbHVlPW51bGx9ZS5kZWZhdWx0PXR9KSxlKCJ2aXNpdCIsWyJleHBvcnRzIl0s
ZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSxyLG4saSl7dmFyIG8sYT1lLm5h
bWUscz1lLmluY29taW5nLHU9ZS5pbmNvbWluZ05hbWVzLGw9dS5sZW5ndGg7aWYobnx8KG49e30p
LGl8fChpPVtdKSwhbi5oYXNPd25Qcm9wZXJ0eShhKSl7Zm9yKGkucHVzaChhKSxuW2FdPSEwLG89
MDtvPGw7bysrKXQoc1t1W29dXSxyLG4saSk7cihlLGkpLGkucG9wKCl9fWUuZGVmYXVsdD10fSks
dCgiZW1iZXIiKX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgZT17ZW1iZXI6e2RlZmF1
bHQ6RW1iZXJ9LCJlbWJlci1hcHBsaWNhdGlvbiI6e2RlZmF1bHQ6RW1iZXIuQXBwbGljYXRpb259
LCJlbWJlci1hcnJheSI6e2RlZmF1bHQ6RW1iZXIuQXJyYXl9LCJlbWJlci1hcnJheS9tdXRhYmxl
Ijp7ZGVmYXVsdDpFbWJlci5NdXRhYmxlQXJyYXl9LCJlbWJlci1hcnJheS91dGlscyI6e0E6RW1i
ZXIuQSxpc0VtYmVyQXJyYXk6RW1iZXIuaXNBcnJheSx3cmFwOkVtYmVyLm1ha2VBcnJheX0sImVt
YmVyLWNvbXBvbmVudCI6e2RlZmF1bHQ6RW1iZXIuQ29tcG9uZW50fSwiZW1iZXItY29tcG9uZW50
cy9jaGVja2JveCI6e2RlZmF1bHQ6RW1iZXIuQ2hlY2tib3h9LCJlbWJlci1jb21wb25lbnRzL3Rl
eHQtYXJlYSI6e2RlZmF1bHQ6RW1iZXIuVGV4dEFyZWF9LCJlbWJlci1jb21wb25lbnRzL3RleHQt
ZmllbGQiOntkZWZhdWx0OkVtYmVyLlRleHRGaWVsZH0sImVtYmVyLWNvbnRyb2xsZXIiOntkZWZh
dWx0OkVtYmVyLkNvbnRyb2xsZXJ9LCJlbWJlci1jb250cm9sbGVyL2luamVjdCI6e2RlZmF1bHQ6
RW1iZXIuaW5qZWN0LmNvbnRyb2xsZXJ9LCJlbWJlci1jb250cm9sbGVyL3Byb3h5Ijp7ZGVmYXVs
dDpFbWJlci5BcnJheVByb3h5fSwiZW1iZXItY29udHJvbGxlcnMvc29ydGFibGUiOntkZWZhdWx0
OkVtYmVyLlNvcnRhYmxlTWl4aW59LCJlbWJlci1kZWJ1ZyI6e2xvZzpFbWJlci5kZWJ1ZyxpbnNw
ZWN0OkVtYmVyLmluc3BlY3QscnVuOkVtYmVyLnJ1bkluRGVidWcsd2FybjpFbWJlci53YXJufSwi
ZW1iZXItZGVidWcvY29udGFpbmVyLWRlYnVnLWFkYXB0ZXIiOntkZWZhdWx0OkVtYmVyLkNvbnRh
aW5lckRlYnVnQWRhcHRlcn0sImVtYmVyLWRlYnVnL2RhdGEtYWRhcHRlciI6e2RlZmF1bHQ6RW1i
ZXIuRGF0YUFkYXB0ZXJ9LCJlbWJlci1kZXByZWNhdGlvbnMiOntkZXByZWNhdGU6RW1iZXIuZGVw
cmVjYXRlLGRlcHJlY2F0ZUZ1bmM6RW1iZXIuZGVwcmVjYXRlRnVuY30sImVtYmVyLWVudW1lcmFi
bGUiOntkZWZhdWx0OkVtYmVyLkVudW1lcmFibGV9LCJlbWJlci1ldmVudGVkIjp7ZGVmYXVsdDpF
bWJlci5FdmVudGVkfSwiZW1iZXItZXZlbnRlZC9vbiI6e2RlZmF1bHQ6RW1iZXIub259LCJlbWJl
ci1nbG9iYWxzLXJlc29sdmVyIjp7ZGVmYXVsdDpFbWJlci5EZWZhdWx0UmVzb2x2ZXJ9LCJlbWJl
ci1oZWxwZXIiOntkZWZhdWx0OkVtYmVyLkhlbHBlcixoZWxwZXI6RW1iZXIuSGVscGVyJiZFbWJl
ci5IZWxwZXIuaGVscGVyfSwiZW1iZXItaW5zdHJ1bWVudGF0aW9uIjp7aW5zdHJ1bWVudDpFbWJl
ci5JbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCxyZXNldDpFbWJlci5JbnN0cnVtZW50YXRpb24u
cmVzZXQsc3Vic2NyaWJlOkVtYmVyLkluc3RydW1lbnRhdGlvbi5zdWJzY3JpYmUsdW5zdWJzY3Jp
YmU6RW1iZXIuSW5zdHJ1bWVudGF0aW9uLnVuc3Vic2NyaWJlfSwiZW1iZXItbG9jYXRpb25zL2hh
c2giOntkZWZhdWx0OkVtYmVyLkhhc2hMb2NhdGlvbn0sImVtYmVyLWxvY2F0aW9ucy9oaXN0b3J5
Ijp7ZGVmYXVsdDpFbWJlci5IaXN0b3J5TG9jYXRpb259LCJlbWJlci1sb2NhdGlvbnMvbm9uZSI6
e2RlZmF1bHQ6RW1iZXIuTm9uZUxvY2F0aW9ufSwiZW1iZXItbWFwIjp7ZGVmYXVsdDpFbWJlci5N
YXAsd2l0aERlZmF1bHQ6RW1iZXIuTWFwV2l0aERlZmF1bHR9LCJlbWJlci1tZXRhbC9kZXN0cm95
Ijp7ZGVmYXVsdDpFbWJlci5kZXN0cm95fSwiZW1iZXItbWV0YWwvZXZlbnRzIjp7YWRkTGlzdGVu
ZXI6RW1iZXIuYWRkTGlzdGVuZXIscmVtb3ZlTGlzdGVuZXI6RW1iZXIucmVtb3ZlTGlzdGVuZXIs
c2VuZDpFbWJlci5zZW5kRXZlbnR9LCJlbWJlci1tZXRhbC9nZXQiOntkZWZhdWx0OkVtYmVyLmdl
dCxnZXRQcm9wZXJ0aWVzOkVtYmVyLmdldFByb3BlcnRpZXN9LCJlbWJlci1tZXRhbC9taXhpbiI6
e2RlZmF1bHQ6RW1iZXIuTWl4aW59LCJlbWJlci1tZXRhbC9vYnNlcnZlciI6e2RlZmF1bHQ6RW1i
ZXIub2JzZXJ2ZXIsYWRkT2JzZXJ2ZXI6RW1iZXIuYWRkT2JzZXJ2ZXIscmVtb3ZlT2JzZXJ2ZXI6
RW1iZXIucmVtb3ZlT2JzZXJ2ZXJ9LCJlbWJlci1tZXRhbC9vbi1sb2FkIjp7ZGVmYXVsdDpFbWJl
ci5vbkxvYWQscnVuOkVtYmVyLnJ1bkxvYWRIb29rc30sImVtYmVyLW1ldGFsL3NldCI6e2RlZmF1
bHQ6RW1iZXIuc2V0LHNldFByb3BlcnRpZXM6RW1iZXIuc2V0UHJvcGVydGllcyx0cnlTZXQ6RW1i
ZXIudHJ5U2V0fSwiZW1iZXItbWV0YWwvdXRpbHMiOnthbGlhc01ldGhvZDpFbWJlci5hbGlhc01l
dGhvZCxhc3NlcnQ6RW1iZXIuYXNzZXJ0LGNhY2hlRm9yOkVtYmVyLmNhY2hlRm9yLGNvcHk6RW1i
ZXIuY29weSxndWlkRm9yOkVtYmVyLmd1aWRGb3J9LCJlbWJlci1vYmplY3QiOntkZWZhdWx0OkVt
YmVyLk9iamVjdH0sImVtYmVyLXBsYXRmb3JtIjp7YXNzaWduOkVtYmVyLm1lcmdlLGNyZWF0ZTpF
bWJlci5jcmVhdGUsZGVmaW5lUHJvcGVydHk6RW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHks
aGFzQWNjZXNzb3JzOkVtYmVyLnBsYXRmb3JtLmhhc1Byb3BlcnR5QWNjZXNzb3JzLGtleXM6RW1i
ZXIua2V5c30sImVtYmVyLXJvdXRlIjp7ZGVmYXVsdDpFbWJlci5Sb3V0ZX0sImVtYmVyLXJvdXRl
ciI6e2RlZmF1bHQ6RW1iZXIuUm91dGVyfSwiZW1iZXItcnVubG9vcCI6e2RlZmF1bHQ6RW1iZXIu
cnVuLGJlZ2luOkVtYmVyLnJ1bi5iZWdpbixiaW5kOkVtYmVyLnJ1bi5iaW5kLGNhbmNlbDpFbWJl
ci5ydW4uY2FuY2VsLGRlYm91bmNlOkVtYmVyLnJ1bi5kZWJvdW5jZSxlbmQ6RW1iZXIucnVuLmVu
ZCxqb2luOkVtYmVyLnJ1bi5qb2luLGxhdGVyOkVtYmVyLnJ1bi5sYXRlcixuZXh0OkVtYmVyLnJ1
bi5uZXh0LG9uY2U6RW1iZXIucnVuLm9uY2Usc2NoZWR1bGU6RW1iZXIucnVuLnNjaGVkdWxlLHNj
aGVkdWxlT25jZTpFbWJlci5ydW4uc2NoZWR1bGVPbmNlLHRocm90dGxlOkVtYmVyLnJ1bi50aHJv
dHRsZX0sImVtYmVyLXNlcnZpY2UiOntkZWZhdWx0OkVtYmVyLlNlcnZpY2V9LCJlbWJlci1zZXJ2
aWNlL2luamVjdCI6e2RlZmF1bHQ6RW1iZXIuaW5qZWN0LnNlcnZpY2V9LCJlbWJlci1zZXQvb3Jk
ZXJlZCI6e2RlZmF1bHQ6RW1iZXIuT3JkZXJlZFNldH0sImVtYmVyLXN0cmluZyI6e2NhbWVsaXpl
OkVtYmVyLlN0cmluZy5jYW1lbGl6ZSxjYXBpdGFsaXplOkVtYmVyLlN0cmluZy5jYXBpdGFsaXpl
LGNsYXNzaWZ5OkVtYmVyLlN0cmluZy5jbGFzc2lmeSxkYXNoZXJpemU6RW1iZXIuU3RyaW5nLmRh
c2hlcml6ZSxkZWNhbWVsaXplOkVtYmVyLlN0cmluZy5kZWNhbWVsaXplLGZtdDpFbWJlci5TdHJp
bmcuZm10LGh0bWxTYWZlOkVtYmVyLlN0cmluZy5odG1sU2FmZSxsb2M6RW1iZXIuU3RyaW5nLmxv
Yyx1bmRlcnNjb3JlOkVtYmVyLlN0cmluZy51bmRlcnNjb3JlLHc6RW1iZXIuU3RyaW5nLnd9LCJl
bWJlci11dGlscyI6e2lzQmxhbms6RW1iZXIuaXNCbGFuayxpc0VtcHR5OkVtYmVyLmlzRW1wdHks
aXNOb25lOkVtYmVyLmlzTm9uZSxpc1ByZXNlbnQ6RW1iZXIuaXNQcmVzZW50LHRyeUludm9rZTpF
bWJlci50cnlJbnZva2UsdHlwZU9mOkVtYmVyLnR5cGVPZn19O2VbImVtYmVyLWNvbXB1dGVkIl09
e2RlZmF1bHQ6RW1iZXIuY29tcHV0ZWR9O2Zvcih2YXIgdD1bImVtcHR5Iiwibm90RW1wdHkiLCJu
b25lIiwibm90IiwiYm9vbCIsIm1hdGNoIiwiZXF1YWwiLCJndCIsImd0ZSIsImx0IiwibHRlIiwi
YWxpYXMiLCJvbmVXYXkiLCJyZWFkcyIsInJlYWRPbmx5IiwiZGVwcmVjYXRpbmdBbGlhcyIsImFu
ZCIsIm9yIiwiY29sbGVjdCIsInN1bSIsIm1pbiIsIm1heCIsIm1hcCIsInNvcnQiLCJzZXREaWZm
IiwibWFwQnkiLCJtYXBQcm9wZXJ0eSIsImZpbHRlciIsImZpbHRlckJ5IiwiZmlsdGVyUHJvcGVy
dHkiLCJ1bmlxIiwidW5pb24iLCJpbnRlcnNlY3QiXSxuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXt2
YXIgbz10W25dO2VbImVtYmVyLWNvbXB1dGVkIl1bb109RW1iZXIuY29tcHV0ZWRbb119Zm9yKHZh
ciBhIGluIGUpcihhLGVbYV0pfWZ1bmN0aW9uIHQoKXtpZihFbWJlci5UZXN0KXt2YXIgZT17ImVt
YmVyLXRlc3QiOntkZWZhdWx0OkVtYmVyLlRlc3R9LCJlbWJlci10ZXN0L2FkYXB0ZXIiOntkZWZh
dWx0OkVtYmVyLlRlc3QuQWRhcHRlcn0sImVtYmVyLXRlc3QvcXVuaXQtYWRhcHRlciI6e2RlZmF1
bHQ6RW1iZXIuVGVzdC5RVW5pdEFkYXB0ZXJ9fTtmb3IodmFyIHQgaW4gZSlyKHQsZVt0XSl9fWZ1
bmN0aW9uIHIoZSx0KXtkZWZpbmUoZSxbXSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtyZXR1cm4g
dH0pfWUoKSx0KCkscigianF1ZXJ5Iix7ZGVmYXVsdDpzZWxmLmpRdWVyeX0pLHIoInJzdnAiLHtk
ZWZhdWx0OkVtYmVyLlJTVlB9KX0oKSxkZWZpbmUoImVtYmVyL2xvYWQtaW5pdGlhbGl6ZXJzIixb
ImV4cG9ydHMiLCJlbWJlci1sb2FkLWluaXRpYWxpemVycyIsImVtYmVyIl0sZnVuY3Rpb24oZSx0
LHIpe3IuZGVmYXVsdC5kZXByZWNhdGUoIlVzYWdlIG9mIGBlbWJlci9sb2FkLWluaXRpYWxpemVy
c2AgbW9kdWxlIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1cGRhdGUgdG8gYGVtYmVyLWxvYWQtaW5p
dGlhbGl6ZXJzYC4iLCExLHtpZDoiZW1iZXItbG9hZC1pbml0aWFsaXplcnMubGVnYWN5LXNoaW1z
Iix1bnRpbDoiMy4wLjAifSksZS5kZWZhdWx0PXQuZGVmYXVsdH0pLGNyZWF0ZURlcHJlY2F0ZWRN
b2R1bGUoImVtYmVyL3Jlc29sdmVyIiksY3JlYXRlRGVwcmVjYXRlZE1vZHVsZSgicmVzb2x2ZXIi
KSxkZWZpbmUoImVtYmVyLWFqYXgvZXJyb3JzIixbImV4cG9ydHMiLCJlbWJlciJdLGZ1bmN0aW9u
KGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDw9
MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdPyJBamF4IG9wZXJhdGlvbiBmYWlsZWQiOmFyZ3VtZW50
c1sxXTthLmNhbGwodGhpcyx0KSx0aGlzLmVycm9ycz1lfHxbe3RpdGxlOiJBamF4IEVycm9yIixk
ZXRhaWw6dH1dfWZ1bmN0aW9uIG4oZSl7ci5jYWxsKHRoaXMsZSwiUmVxdWVzdCB3YXMgcmVqZWN0
ZWQgYmVjYXVzZSBpdCB3YXMgaW52YWxpZCIpfWZ1bmN0aW9uIGkoZSl7ci5jYWxsKHRoaXMsZSwi
QWpheCBhdXRob3JpemF0aW9uIGZhaWxlZCIpfWZ1bmN0aW9uIG8oZSl7ci5jYWxsKHRoaXMsZSwi
UmVxdWVzdCB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB1c2VyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gcGVy
Zm9ybSB0aGlzIG9wZXJhdGlvbi4iKX1lLkFqYXhFcnJvcj1yLGUuSW52YWxpZEVycm9yPW4sZS5V
bmF1dGhvcml6ZWRFcnJvcj1pLGUuRm9yYmlkZGVuRXJyb3I9bzt2YXIgYT10LmRlZmF1bHQuRXJy
b3I7ci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSksbi5wcm90b3R5cGU9T2Jq
ZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3Rv
dHlwZSksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSl9KSxkZWZpbmUoImVt
YmVyLWFqYXgvaW5kZXgiLFsiZXhwb3J0cyIsImVtYmVyLWFqYXgvcmVxdWVzdCJdLGZ1bmN0aW9u
KGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51
bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fX0pfSksZGVmaW5lKCJl
bWJlci1hamF4L21ha2UtcHJvbWlzZSIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlvbihlLHQp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciByPWUudHlwZXx8IkdFVCI7cmV0dXJuIG5l
dyBhLlByb21pc2UoZnVuY3Rpb24ocixvKXtlLnN1Y2Nlc3M9bihyKSxlLmVycm9yPWkobyksdC5k
ZWZhdWx0LiQuYWpheChlKX0sImVtYmVyLWFqYXg6ICIrcisiIHRvICIrZS51cmwpfWZ1bmN0aW9u
IG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtvKG51bGwsZSx7cmVzcG9uc2U6dCx0ZXh0U3Rh
dHVzOnIsanFYSFI6bn0pfX1mdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbih0LHIsbil7byhu
dWxsLGUse2pxWEhSOnQsdGV4dFN0YXR1czpyLGVycm9yVGhyb3duOm59KX19ZS5kZWZhdWx0PXI7
dmFyIG89dC5kZWZhdWx0LnJ1bixhPXQuZGVmYXVsdC5SU1ZQfSksZGVmaW5lKCJlbWJlci1hamF4
L3JhdyIsWyJleHBvcnRzIiwiZW1iZXItYWpheC9tYWtlLXByb21pc2UiLCJlbWJlci1hamF4L3V0
aWxzL3BhcnNlLWFyZ3MiLCJlbWJlciJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0Ijtm
dW5jdGlvbiBpKCl7YSgiZW1iZXItYWpheC9yYXcgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBy
ZW1vdmVkIGluIGVtYmVyLWFqYXhAMi4wLjAiLCExLHtpZDoiZW1iZXItYWpheC5yYXcifSk7dmFy
IGU9ci5kZWZhdWx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSxuPW8oZSwzKSxpPW5bMF0scz1uWzFd
LHU9blsyXTtyZXR1cm4gdXx8KHU9e30pLHUudXJsPWksdS50eXBlPXMsKDAsdC5kZWZhdWx0KSh1
KX12YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2YXIgcj1bXSxuPSEwLGk9ITEsbz12
b2lkIDA7dHJ5e2Zvcih2YXIgYSxzPWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0oYT1zLm5leHQo
KSkuZG9uZSkmJihyLnB1c2goYS52YWx1ZSksIXR8fHIubGVuZ3RoIT09dCk7bj0hMCk7fWNhdGNo
KGUpe2k9ITAsbz1lfWZpbmFsbHl7dHJ5eyFuJiZzLnJldHVybiYmcy5yZXR1cm4oKX1maW5hbGx5
e2lmKGkpdGhyb3cgb319cmV0dXJuIHJ9cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYoQXJyYXkuaXNB
cnJheSh0KSlyZXR1cm4gdDtpZihTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBl
KHQscik7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJl
IG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX0oKTtlLmRlZmF1bHQ9aTt2YXIgYT1uLmRlZmF1bHQu
ZGVwcmVjYXRlfSksZGVmaW5lKCJlbWJlci1hamF4L3JlcXVlc3QiLFsiZXhwb3J0cyIsImVtYmVy
LWFqYXgvcmF3IiwiZW1iZXIiXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9u
IG4oKXtyZXR1cm4gaSgiZW1iZXItYWpheC9yZXF1ZXN0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwg
YmUgcmVtb3ZlZCBpbiBlbWJlci1hamF4QDIuMC4wIiwhMSx7aWQ6ImVtYmVyLWFqYXgucmF3In0p
LHQuZGVmYXVsdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVy
biBlLnJlc3BvbnNlfSxudWxsLCJlbWJlci1hamF4OiB1bndyYXAgcmF3IGFqYXggcmVzcG9uc2Ui
KX1lLmRlZmF1bHQ9bjt2YXIgaT1yLmRlZmF1bHQuZGVwcmVjYXRlfSksZGVmaW5lKCJlbWJlci1h
amF4L3NlcnZpY2VzL2FqYXgiLFsiZXhwb3J0cyIsImVtYmVyIiwiZW1iZXItYWpheC9lcnJvcnMi
LCJlbWJlci1hamF4L3V0aWxzL3BhcnNlLXJlc3BvbnNlLWhlYWRlcnMiXSxmdW5jdGlvbihlLHQs
cixuKXsidXNlIHN0cmljdCI7dmFyIGk9dC5kZWZhdWx0LmRlcHJlY2F0ZSxvPXQuZGVmYXVsdC5n
ZXQsYT10LmRlZmF1bHQuaXNCbGFuaztlLmRlZmF1bHQ9dC5kZWZhdWx0LlNlcnZpY2UuZXh0ZW5k
KHtyZXF1ZXN0OmZ1bmN0aW9uKGUsbyl7dmFyIGEscz10aGlzO2FyZ3VtZW50cy5sZW5ndGg+Mnx8
InN0cmluZyI9PXR5cGVvZiBvPyhpKCJlbWJlci1hamF4L2FqYXgjcmVxdWVzdCBjYWxsaW5nIHJl
cXVlc3Qgd2l0aCBgdHlwZWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGVt
YmVyLWFqYXhAMS4wLjAuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSB0eXBlIHBhc3MgYW4gb2Jq
ZWN0IGxpa2Uge3R5cGU6ICdERUxFVEUnfSIsITEse2lkOiJlbWJlci1hamF4LnNlcnZpY2UucmVx
dWVzdCJ9KSxhcmd1bWVudHMubGVuZ3RoPjI/KGE9YXJndW1lbnRzWzJdLGEudHlwZT1vKTphPXt0
eXBlOm99KTphPW87dmFyIHU9dGhpcy5vcHRpb25zKGUsYSk7cmV0dXJuIG5ldyB0LmRlZmF1bHQu
UlNWUC5Qcm9taXNlKGZ1bmN0aW9uKGUsaSl7dS5zdWNjZXNzPWZ1bmN0aW9uKHQsbyxhKXt2YXIg
dT1zLmhhbmRsZVJlc3BvbnNlKGEuc3RhdHVzLCgwLG4uZGVmYXVsdCkoYS5nZXRBbGxSZXNwb25z
ZUhlYWRlcnMoKSksdCk7dSBpbnN0YW5jZW9mIHIuQWpheEVycm9yP2kodSk6ZSh1KX0sdS5lcnJv
cj1mdW5jdGlvbihlLHQscil7dmFyIG89dm9pZCAwO28gaW5zdGFuY2VvZiBFcnJvcnx8KG89ciBp
bnN0YW5jZW9mIEVycm9yP3I6cy5oYW5kbGVSZXNwb25zZShlLnN0YXR1cywoMCxuLmRlZmF1bHQp
KGUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLHMucGFyc2VFcnJvclJlc3BvbnNlKGUucmVzcG9u
c2VUZXh0KXx8cikpLGkobyl9LHQuZGVmYXVsdC4kLmFqYXgodSl9LCJlbWJlci1hamF4OiAiK3Uu
dHlwZSsiIHRvICIrZSl9LHBvc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGUs
dGhpcy5fYWRkVHlwZVRvT3B0aW9uc0Zvcih0LCJQT1NUIikpfSxwdXQ6ZnVuY3Rpb24oZSx0KXty
ZXR1cm4gdGhpcy5yZXF1ZXN0KGUsdGhpcy5fYWRkVHlwZVRvT3B0aW9uc0Zvcih0LCJQVVQiKSl9
LHBhdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucmVxdWVzdChlLHRoaXMuX2FkZFR5cGVU
b09wdGlvbnNGb3IodCwiUEFUQ0giKSl9LGRlbDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnJl
cXVlc3QoZSx0aGlzLl9hZGRUeXBlVG9PcHRpb25zRm9yKHQsIkRFTEVURSIpKX0sX2FkZFR5cGVU
b09wdGlvbnNGb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lfHx7fSxlLnR5cGU9dCxlfSxvcHRp
b25zOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dHx8e307ci51cmw9dGhpcy5fYnVpbGRVUkwoZSksci50
eXBlPXIudHlwZXx8IkdFVCIsci5kYXRhVHlwZT1yLmRhdGFUeXBlfHwianNvbiIsci5jb250ZXh0
PXRoaXM7dmFyIG49byh0aGlzLCJoZWFkZXJzIik7cmV0dXJuIHZvaWQgMCE9PW4mJihyLmJlZm9y
ZVNlbmQ9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1
cm4gZS5zZXRSZXF1ZXN0SGVhZGVyKHQsblt0XSl9KX0pLHJ9LF9idWlsZFVSTDpmdW5jdGlvbihl
KXt2YXIgdD1vKHRoaXMsImhvc3QiKTtpZihhKHQpKXJldHVybiBlO3ZhciByPVN0cmluZy5wcm90
b3R5cGUuc3RhcnRzV2l0aHx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHwwLHRoaXMuaW5kZXhP
ZihlLHQpPT09dH07cmV0dXJuIHIuY2FsbChlLCIvIik/IiIrdCtlOnQrIi8iK2V9LGhhbmRsZVJl
c3BvbnNlOmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmlzU3VjY2VzcyhlLHQsbikpcmV0dXJuIG47
aWYodGhpcy5pc1VuYXV0aG9yaXplZChlLHQsbikpcmV0dXJuIG5ldyByLlVuYXV0aG9yaXplZEVy
cm9yKG4uZXJyb3JzKTtpZih0aGlzLmlzRm9yYmlkZGVuKGUsdCxuKSlyZXR1cm4gbmV3IHIuRm9y
YmlkZGVuRXJyb3Iobi5lcnJvcnMpO2lmKHRoaXMuaXNJbnZhbGlkKGUsdCxuKSlyZXR1cm4gbmV3
IHIuSW52YWxpZEVycm9yKG4uZXJyb3JzKTt2YXIgaT10aGlzLm5vcm1hbGl6ZUVycm9yUmVzcG9u
c2UoZSx0LG4pO3JldHVybiBuZXcgci5BamF4RXJyb3IoaSl9LGlzVW5hdXRob3JpemVkOmZ1bmN0
aW9uKGUpe3JldHVybiA0MDE9PT1lfSxpc0ZvcmJpZGRlbjpmdW5jdGlvbihlKXtyZXR1cm4gNDAz
PT09ZX0saXNJbnZhbGlkOmZ1bmN0aW9uKGUpe3JldHVybiA0MjI9PT1lfSxpc1N1Y2Nlc3M6ZnVu
Y3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB8fDMwND09PWV9LHBhcnNlRXJyb3JSZXNwb25z
ZTpmdW5jdGlvbihlKXt2YXIgcj1lO3RyeXtyPXQuZGVmYXVsdC4kLnBhcnNlSlNPTihlKX1jYXRj
aChlKXt9cmV0dXJuIHJ9LG5vcm1hbGl6ZUVycm9yUmVzcG9uc2U6ZnVuY3Rpb24oZSx0LHIpe3Jl
dHVybiByJiYib2JqZWN0Ij09dHlwZW9mIHImJnIuZXJyb3JzP3IuZXJyb3JzOlt7c3RhdHVzOiIi
K2UsdGl0bGU6IlRoZSBiYWNrZW5kIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIixkZXRhaWw6IiIr
cn1dfX0pfSksZGVmaW5lKCJlbWJlci1hamF4L3V0aWxzL3BhcnNlLWFyZ3MiLFsiZXhwb3J0cyJd
LGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KCl7dmFyIGU9W10uc2xpY2UuYXBw
bHkoYXJndW1lbnRzKTtpZigxPT09ZS5sZW5ndGgpe2lmKCJzdHJpbmciPT10eXBlb2YgZVswXSl7
dmFyIHQ9cihlLDEpLG49dFswXTtyZXR1cm5bbl19dmFyIGk9cihlLDEpLG89aVswXSxuPW8udXJs
O2RlbGV0ZSBvLnVybDt2YXIgYT1vLnR5cGV8fG8ubWV0aG9kO3JldHVybiBkZWxldGUgby50eXBl
LGRlbGV0ZSBvLm1ldGhvZCxbbixhLG9dfWlmKDI9PT1lLmxlbmd0aCl7dmFyIHM9cihlLDEpLG49
c1swXTtpZigib2JqZWN0Ij09dHlwZW9mIGVbMV0pe3ZhciBvPWVbMV0sYT1vLnR5cGV8fG8ubWV0
aG9kO3JldHVybiBkZWxldGUgby50eXBlLGRlbGV0ZSBvLm1ldGhvZCxbbixhLG9dfXZhciBhPWVb
MV07cmV0dXJuW24sYV19cmV0dXJuIGV9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7
dmFyIHI9W10sbj0hMCxpPSExLG89dm9pZCAwO3RyeXtmb3IodmFyIGEscz1lW1N5bWJvbC5pdGVy
YXRvcl0oKTshKG49KGE9cy5uZXh0KCkpLmRvbmUpJiYoci5wdXNoKGEudmFsdWUpLCF0fHxyLmxl
bmd0aCE9PXQpO249ITApO31jYXRjaChlKXtpPSEwLG89ZX1maW5hbGx5e3RyeXshbiYmcy5yZXR1
cm4mJnMucmV0dXJuKCl9ZmluYWxseXtpZihpKXRocm93IG99fXJldHVybiByfXJldHVybiBmdW5j
dGlvbih0LHIpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ7aWYoU3ltYm9sLml0ZXJhdG9y
IGluIE9iamVjdCh0KSlyZXR1cm4gZSh0LHIpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQg
YXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCk7ZS5kZWZh
dWx0PXR9KSxkZWZpbmUoImVtYmVyLWFqYXgvdXRpbHMvcGFyc2UtcmVzcG9uc2UtaGVhZGVycyIs
WyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9
T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gdDtmb3IodmFyIHI9ZS5zcGxpdCgiXHJc
biIpLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXSxvPWkuaW5kZXhPZigiOiAiKTtpZihv
PjApe3ZhciBhPWkuc3Vic3RyaW5nKDAsbykscz1pLnN1YnN0cmluZyhvKzIpO3RbYV09c319cmV0
dXJuIHR9ZS5kZWZhdWx0PXR9KSxkZWZpbmUoImVtYmVyLWNsaS1hcHAtdmVyc2lvbi9jb21wb25l
bnRzL2FwcC12ZXJzaW9uIixbImV4cG9ydHMiLCJlbWJlciIsImVtYmVyLWNsaS1hcHAtdmVyc2lv
bi90ZW1wbGF0ZXMvYXBwLXZlcnNpb24iXSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2Uu
ZGVmYXVsdD10LmRlZmF1bHQuQ29tcG9uZW50LmV4dGVuZCh7dGFnTmFtZToic3BhbiIsbGF5b3V0
OnIuZGVmYXVsdH0pfSksZGVmaW5lKCJlbWJlci1jbGktYXBwLXZlcnNpb24vaW5pdGlhbGl6ZXIt
ZmFjdG9yeSIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijtm
dW5jdGlvbiByKGUscil7dmFyIGk9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWkmJmUmJnIpe3Zh
ciBvPW4oZSk7dC5kZWZhdWx0LmxpYnJhcmllcy5yZWdpc3RlcihvLHIpLGk9ITB9fX1lLmRlZmF1
bHQ9cjt2YXIgbj10LmRlZmF1bHQuU3RyaW5nLmNsYXNzaWZ5fSksZGVmaW5lKCJlbWJlci1jbGkt
YXBwLXZlcnNpb24vdGVtcGxhdGVzL2FwcC12ZXJzaW9uIixbImV4cG9ydHMiXSxmdW5jdGlvbihl
KXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PUVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKGZ1bmN0aW9u
KCl7cmV0dXJue21ldGE6e2ZyYWdtZW50UmVhc29uOntuYW1lOiJtaXNzaW5nLXdyYXBwZXIiLHBy
b2JsZW1zOlsid3JvbmctdHlwZSJdfSxyZXZpc2lvbjoiRW1iZXJAMi42LjIiLGxvYzp7c291cmNl
Om51bGwsc3RhcnQ6e2xpbmU6MSxjb2x1bW46MH0sZW5kOntsaW5lOjIsY29sdW1uOjB9fSxtb2R1
bGVOYW1lOiJtb2R1bGVzL2VtYmVyLWNsaS1hcHAtdmVyc2lvbi90ZW1wbGF0ZXMvYXBwLXZlcnNp
b24uaGJzIn0saXNFbXB0eTohMSxhcml0eTowLGNhY2hlZEZyYWdtZW50Om51bGwsaGFzUmVuZGVy
ZWQ6ITEsYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmNyZWF0ZURvY3VtZW50RnJh
Z21lbnQoKSxyPWUuY3JlYXRlQ29tbWVudCgiIik7ZS5hcHBlbmRDaGlsZCh0LHIpO3ZhciByPWUu
Y3JlYXRlVGV4dE5vZGUoIlxuIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodCxyKSx0fSxidWlsZFJl
bmRlck5vZGVzOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1uZXcgQXJyYXkoMSk7cmV0dXJuIG5bMF09
ZS5jcmVhdGVNb3JwaEF0KHQsMCwwLHIpLGUuaW5zZXJ0Qm91bmRhcnkodCwwKSxufSxzdGF0ZW1l
bnRzOltbImNvbnRlbnQiLCJ2ZXJzaW9uIixbImxvYyIsW251bGwsWzEsMF0sWzEsMTFdXV1dXSxs
b2NhbHM6W10sdGVtcGxhdGVzOltdfX0oKSl9KSxkZWZpbmUoImVtYmVyLWluZmxlY3Rvci9pbmRl
eCIsWyJleHBvcnRzIiwiZW1iZXIiLCJlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbSIsImVtYmVy
LWluZmxlY3Rvci9saWIvZXh0L3N0cmluZyJdLGZ1bmN0aW9uKGUsdCxyLG4peyJ1c2Ugc3RyaWN0
IjtyLkluZmxlY3Rvci5kZWZhdWx0UnVsZXM9ci5kZWZhdWx0UnVsZXMsdC5kZWZhdWx0LkluZmxl
Y3Rvcj1yLkluZmxlY3Rvcix0LmRlZmF1bHQuU3RyaW5nLnBsdXJhbGl6ZT1yLnBsdXJhbGl6ZSx0
LmRlZmF1bHQuU3RyaW5nLnNpbmd1bGFyaXplPXIuc2luZ3VsYXJpemUsZS5kZWZhdWx0PXIuSW5m
bGVjdG9yLGUucGx1cmFsaXplPXIucGx1cmFsaXplLGUuc2luZ3VsYXJpemU9ci5zaW5ndWxhcml6
ZSxlLmRlZmF1bHRSdWxlcz1yLmRlZmF1bHRSdWxlcywidW5kZWZpbmVkIiE9dHlwZW9mIGRlZmlu
ZSYmZGVmaW5lLmFtZD9kZWZpbmUoImVtYmVyLWluZmxlY3RvciIsWyJleHBvcnRzIl0sZnVuY3Rp
b24oZSl7cmV0dXJuIGUuZGVmYXVsdD1yLkluZmxlY3RvcixyLkluZmxlY3Rvcn0pOiJ1bmRlZmlu
ZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXIuSW5m
bGVjdG9yKX0pLGRlZmluZSgiZW1iZXItaW5mbGVjdG9yL2xpYi9leHQvc3RyaW5nIixbImV4cG9y
dHMiLCJlbWJlciIsImVtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL3N0cmluZyJdLGZ1bmN0aW9u
KGUsdCxyKXsidXNlIHN0cmljdCI7KHQuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUz09PSEwfHx0
LmRlZmF1bHQuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nKSYmKFN0cmluZy5wcm90b3R5cGUucGx1
cmFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuKDAsci5wbHVyYWxpemUpKHRoaXMpfSxTdHJpbmcucHJv
dG90eXBlLnNpbmd1bGFyaXplPWZ1bmN0aW9uKCl7cmV0dXJuKDAsci5zaW5ndWxhcml6ZSkodGhp
cyl9KX0pLGRlZmluZSgiZW1iZXItaW5mbGVjdG9yL2xpYi9oZWxwZXJzL3BsdXJhbGl6ZSIsWyJl
eHBvcnRzIiwiZW1iZXItaW5mbGVjdG9yIiwiZW1iZXItaW5mbGVjdG9yL2xpYi91dGlscy9tYWtl
LWhlbHBlciJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PSgwLHIuZGVm
YXVsdCkoZnVuY3Rpb24oZSl7dmFyIHI9dm9pZCAwLG49dm9pZCAwO3JldHVybiAxPT09ZS5sZW5n
dGg/KG49ZVswXSwoMCx0LnBsdXJhbGl6ZSkobikpOihyPWVbMF0sbj1lWzFdLDEhPT1wYXJzZUZs
b2F0KHIpJiYobj0oMCx0LnBsdXJhbGl6ZSkobikpLHIrIiAiK24pfSl9KSxkZWZpbmUoImVtYmVy
LWluZmxlY3Rvci9saWIvaGVscGVycy9zaW5ndWxhcml6ZSIsWyJleHBvcnRzIiwiZW1iZXItaW5m
bGVjdG9yIiwiZW1iZXItaW5mbGVjdG9yL2xpYi91dGlscy9tYWtlLWhlbHBlciJdLGZ1bmN0aW9u
KGUsdCxyKXsidXNlIHN0cmljdCI7ZS5kZWZhdWx0PSgwLHIuZGVmYXVsdCkoZnVuY3Rpb24oZSl7
cmV0dXJuKDAsdC5zaW5ndWxhcml6ZSkoZVswXSl9KX0pLGRlZmluZSgiZW1iZXItaW5mbGVjdG9y
L2xpYi9zeXN0ZW0iLFsiZXhwb3J0cyIsImVtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL2luZmxl
Y3RvciIsImVtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL3N0cmluZyIsImVtYmVyLWluZmxlY3Rv
ci9saWIvc3lzdGVtL2luZmxlY3Rpb25zIl0sZnVuY3Rpb24oZSx0LHIsbil7InVzZSBzdHJpY3Qi
O3QuZGVmYXVsdC5pbmZsZWN0b3I9bmV3IHQuZGVmYXVsdChuLmRlZmF1bHQpLGUuSW5mbGVjdG9y
PXQuZGVmYXVsdCxlLnNpbmd1bGFyaXplPXIuc2luZ3VsYXJpemUsZS5wbHVyYWxpemU9ci5wbHVy
YWxpemUsZS5kZWZhdWx0UnVsZXM9bi5kZWZhdWx0fSksZGVmaW5lKCJlbWJlci1pbmZsZWN0b3Iv
bGliL3N5c3RlbS9pbmZsZWN0aW9ucyIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJp
Y3QiO2UuZGVmYXVsdD17cGx1cmFsczpbWy8kLywicyJdLFsvcyQvaSwicyJdLFsvXihheHx0ZXN0
KWlzJC9pLCIkMWVzIl0sWy8ob2N0b3B8dmlyKXVzJC9pLCIkMWkiXSxbLyhvY3RvcHx2aXIpaSQv
aSwiJDFpIl0sWy8oYWxpYXN8c3RhdHVzKSQvaSwiJDFlcyJdLFsvKGJ1KXMkL2ksIiQxc2VzIl0s
Wy8oYnVmZmFsfHRvbWF0KW8kL2ksIiQxb2VzIl0sWy8oW3RpXSl1bSQvaSwiJDFhIl0sWy8oW3Rp
XSlhJC9pLCIkMWEiXSxbL3NpcyQvaSwic2VzIl0sWy8oPzooW15mXSlmZXwoW2xyXSlmKSQvaSwi
JDEkMnZlcyJdLFsvKGhpdmUpJC9pLCIkMXMiXSxbLyhbXmFlaW91eV18cXUpeSQvaSwiJDFpZXMi
XSxbLyh4fGNofHNzfHNoKSQvaSwiJDFlcyJdLFsvKG1hdHJ8dmVydHxpbmQpKD86aXh8ZXgpJC9p
LCIkMWljZXMiXSxbL14obXxsKW91c2UkL2ksIiQxaWNlIl0sWy9eKG18bClpY2UkL2ksIiQxaWNl
Il0sWy9eKG94KSQvaSwiJDFlbiJdLFsvXihveGVuKSQvaSwiJDEiXSxbLyhxdWl6KSQvaSwiJDF6
ZXMiXV0sc2luZ3VsYXI6W1svcyQvaSwiIl0sWy8oc3MpJC9pLCIkMSJdLFsvKG4pZXdzJC9pLCIk
MWV3cyJdLFsvKFt0aV0pYSQvaSwiJDF1bSJdLFsvKChhKW5hbHl8KGIpYXwoZClpYWdub3wocClh
cmVudGhlfChwKXJvZ25vfChzKXlub3B8KHQpaGUpKHNpc3xzZXMpJC9pLCIkMXNpcyJdLFsvKF5h
bmFseSkoc2lzfHNlcykkL2ksIiQxc2lzIl0sWy8oW15mXSl2ZXMkL2ksIiQxZmUiXSxbLyhoaXZl
KXMkL2ksIiQxIl0sWy8odGl2ZSlzJC9pLCIkMSJdLFsvKFtscl0pdmVzJC9pLCIkMWYiXSxbLyhb
XmFlaW91eV18cXUpaWVzJC9pLCIkMXkiXSxbLyhzKWVyaWVzJC9pLCIkMWVyaWVzIl0sWy8obSlv
dmllcyQvaSwiJDFvdmllIl0sWy8oeHxjaHxzc3xzaCllcyQvaSwiJDEiXSxbL14obXxsKWljZSQv
aSwiJDFvdXNlIl0sWy8oYnVzKShlcyk/JC9pLCIkMSJdLFsvKG8pZXMkL2ksIiQxIl0sWy8oc2hv
ZSlzJC9pLCIkMSJdLFsvKGNyaXN8dGVzdCkoaXN8ZXMpJC9pLCIkMWlzIl0sWy9eKGEpeFtpZV1z
JC9pLCIkMXhpcyJdLFsvKG9jdG9wfHZpcikodXN8aSkkL2ksIiQxdXMiXSxbLyhhbGlhc3xzdGF0
dXMpKGVzKT8kL2ksIiQxIl0sWy9eKG94KWVuL2ksIiQxIl0sWy8odmVydHxpbmQpaWNlcyQvaSwi
JDFleCJdLFsvKG1hdHIpaWNlcyQvaSwiJDFpeCJdLFsvKHF1aXopemVzJC9pLCIkMSJdLFsvKGRh
dGFiYXNlKXMkL2ksIiQxIl1dLGlycmVndWxhclBhaXJzOltbInBlcnNvbiIsInBlb3BsZSJdLFsi
bWFuIiwibWVuIl0sWyJjaGlsZCIsImNoaWxkcmVuIl0sWyJzZXgiLCJzZXhlcyJdLFsibW92ZSIs
Im1vdmVzIl0sWyJjb3ciLCJraW5lIl0sWyJ6b21iaWUiLCJ6b21iaWVzIl1dLHVuY291bnRhYmxl
OlsiZXF1aXBtZW50IiwiaW5mb3JtYXRpb24iLCJyaWNlIiwibW9uZXkiLCJzcGVjaWVzIiwic2Vy
aWVzIiwiZmlzaCIsInNoZWVwIiwiamVhbnMiLCJwb2xpY2UiXX19KSxkZWZpbmUoImVtYmVyLWlu
ZmxlY3Rvci9saWIvc3lzdGVtL2luZmxlY3RvciIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlv
bihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciByPTAsbj10Lmxlbmd0
aDtyPG47cisrKWUudW5jb3VudGFibGVbdFtyXS50b0xvd2VyQ2FzZSgpXT0hMH1mdW5jdGlvbiBu
KGUsdCl7Zm9yKHZhciByLG49MCxpPXQubGVuZ3RoO248aTtuKyspcj10W25dLGUuaXJyZWd1bGFy
W3JbMF0udG9Mb3dlckNhc2UoKV09clsxXSxlLmlycmVndWxhcltyWzFdLnRvTG93ZXJDYXNlKCld
PXJbMV0sZS5pcnJlZ3VsYXJJbnZlcnNlW3JbMV0udG9Mb3dlckNhc2UoKV09clswXSxlLmlycmVn
dWxhckludmVyc2VbclswXS50b0xvd2VyQ2FzZSgpXT1yWzBdfWZ1bmN0aW9uIGkoZSl7ZT1lfHx7
fSxlLnVuY291bnRhYmxlPWUudW5jb3VudGFibGV8fG8oKSxlLmlycmVndWxhclBhaXJzPWUuaXJy
ZWd1bGFyUGFpcnN8fG8oKTt2YXIgdD10aGlzLnJ1bGVzPXtwbHVyYWxzOmUucGx1cmFsc3x8W10s
c2luZ3VsYXI6ZS5zaW5ndWxhcnx8W10saXJyZWd1bGFyOm8oKSxpcnJlZ3VsYXJJbnZlcnNlOm8o
KSx1bmNvdW50YWJsZTpvKCl9O3IodCxlLnVuY291bnRhYmxlKSxuKHQsZS5pcnJlZ3VsYXJQYWly
cyksdGhpcy5lbmFibGVDYWNoZSgpfWZ1bmN0aW9uIG8oKXt2YXIgZT1PYmplY3QuY3JlYXRlKG51
bGwpO3JldHVybiBlLl9kaWN0PW51bGwsZGVsZXRlIGUuX2RpY3QsZX12YXIgYT10LmRlZmF1bHQu
U3RyaW5nLmNhcGl0YWxpemUscz0vXlxzKiQvLHU9LyhbXHdcLy1dK1tfXC9ccy1dKShbYS16XGRd
KyQpLyxsPS8oW1x3XC9ccy1dKykoW0EtWl1bYS16XGRdKiQpLyxjPS9bQS1aXVthLXpcZF0qJC87
aWYoIU9iamVjdC5jcmVhdGUmJiFPYmplY3QuY3JlYXRlKG51bGwpLmhhc093blByb3BlcnR5KXRo
cm93IG5ldyBFcnJvcigiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmNyZWF0
ZShudWxsKSwgcGxlYXNlIHBvbHlmaWwgd2l0aCBlczUtc2hhbTogaHR0cDovL2dpdC5pby95QlUy
cmciKTtpLnByb3RvdHlwZT17ZW5hYmxlQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLnB1cmdlQ2FjaGUo
KSx0aGlzLnNpbmd1bGFyaXplPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9jYWNoZVVzZWQ9ITAs
dGhpcy5fc0NhY2hlW2VdfHwodGhpcy5fc0NhY2hlW2VdPXRoaXMuX3Npbmd1bGFyaXplKGUpKX0s
dGhpcy5wbHVyYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2NhY2hlVXNlZD0hMCx0aGlz
Ll9wQ2FjaGVbZV18fCh0aGlzLl9wQ2FjaGVbZV09dGhpcy5fcGx1cmFsaXplKGUpKX19LHB1cmdl
Q2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZVVzZWQ9ITEsdGhpcy5fc0NhY2hlPW8oKSx0aGlz
Ll9wQ2FjaGU9bygpfSxkaXNhYmxlQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9zQ2FjaGU9bnVsbCx0
aGlzLl9wQ2FjaGU9bnVsbCx0aGlzLnNpbmd1bGFyaXplPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlz
Ll9zaW5ndWxhcml6ZShlKX0sdGhpcy5wbHVyYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMu
X3BsdXJhbGl6ZShlKX19LHBsdXJhbDpmdW5jdGlvbihlLHQpe3RoaXMuX2NhY2hlVXNlZCYmdGhp
cy5wdXJnZUNhY2hlKCksdGhpcy5ydWxlcy5wbHVyYWxzLnB1c2goW2UsdC50b0xvd2VyQ2FzZSgp
XSl9LHNpbmd1bGFyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FjaGVVc2VkJiZ0aGlzLnB1cmdlQ2Fj
aGUoKSx0aGlzLnJ1bGVzLnNpbmd1bGFyLnB1c2goW2UsdC50b0xvd2VyQ2FzZSgpXSl9LHVuY291
bnRhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuX2NhY2hlVXNlZCYmdGhpcy5wdXJnZUNhY2hlKCkscih0
aGlzLnJ1bGVzLFtlLnRvTG93ZXJDYXNlKCldKX0saXJyZWd1bGFyOmZ1bmN0aW9uKGUsdCl7dGhp
cy5fY2FjaGVVc2VkJiZ0aGlzLnB1cmdlQ2FjaGUoKSxuKHRoaXMucnVsZXMsW1tlLHRdXSl9LHBs
dXJhbGl6ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcGx1cmFsaXplKGUpfSxfcGx1cmFsaXpl
OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluZmxlY3QoZSx0aGlzLnJ1bGVzLnBsdXJhbHMsdGhp
cy5ydWxlcy5pcnJlZ3VsYXIpfSxzaW5ndWxhcml6ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5f
c2luZ3VsYXJpemUoZSl9LF9zaW5ndWxhcml6ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbmZs
ZWN0KGUsdGhpcy5ydWxlcy5zaW5ndWxhcix0aGlzLnJ1bGVzLmlycmVndWxhckludmVyc2UpfSxp
bmZsZWN0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbixpLG8sZixkLHAsaCxtLHYsYixnO2lmKG09IWV8
fHMudGVzdChlKSx2PWMudGVzdChlKSxwPSIiLG0pcmV0dXJuIGU7aWYoZj1lLnRvTG93ZXJDYXNl
KCksZD11LmV4ZWMoZSl8fGwuZXhlYyhlKSxkJiYocD1kWzFdLGg9ZFsyXS50b0xvd2VyQ2FzZSgp
KSxnPXRoaXMucnVsZXMudW5jb3VudGFibGVbZl18fHRoaXMucnVsZXMudW5jb3VudGFibGVbaF0p
cmV0dXJuIGU7Zm9yKGIgaW4gdGhpcy5ydWxlcy5pcnJlZ3VsYXIpaWYoZi5tYXRjaChiKyIkIikp
cmV0dXJuIGk9cltiXSx2JiZyW2hdJiYoaT1hKGkpLGI9YShiKSksZS5yZXBsYWNlKGIsaSk7Zm9y
KHZhciB5PXQubGVuZ3RoLF89MDt5Pl8mJihuPXRbeS0xXSxiPW5bMF0sIWIudGVzdChlKSk7eS0t
KTtyZXR1cm4gbj1ufHxbXSxiPW5bMF0saT1uWzFdLG89ZS5yZXBsYWNlKGIsaSl9fSxlLmRlZmF1
bHQ9aX0pLGRlZmluZSgiZW1iZXItaW5mbGVjdG9yL2xpYi9zeXN0ZW0vc3RyaW5nIixbImV4cG9y
dHMiLCJlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9pbmZsZWN0b3IiXSxmdW5jdGlvbihlLHQp
eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiB0LmRlZmF1bHQuaW5mbGVjdG9yLnBs
dXJhbGl6ZShlKX1mdW5jdGlvbiBuKGUpe3JldHVybiB0LmRlZmF1bHQuaW5mbGVjdG9yLnNpbmd1
bGFyaXplKGUpfWUucGx1cmFsaXplPXIsZS5zaW5ndWxhcml6ZT1ufSksZGVmaW5lKCJlbWJlci1p
bmZsZWN0b3IvbGliL3V0aWxzL21ha2UtaGVscGVyIixbImV4cG9ydHMiLCJlbWJlciJdLGZ1bmN0
aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQuZGVmYXVsdC5IZWxw
ZXI/dC5kZWZhdWx0LkhlbHBlci5oZWxwZXIoZSk6dC5kZWZhdWx0LkhUTUxCYXJzP3QuZGVmYXVs
dC5IVE1MQmFycy5tYWtlQm91bmRIZWxwZXIoZSk6dC5kZWZhdWx0LkhhbmRsZWJhcnMubWFrZUJv
dW5kSGVscGVyKGUpfWUuZGVmYXVsdD1yfSksZGVmaW5lKCJlbWJlci1sb2FkLWluaXRpYWxpemVy
cy9pbmRleCIsWyJleHBvcnRzIiwiZW1iZXIiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijtl
LmRlZmF1bHQ9ZnVuY3Rpb24oZSxyKXt2YXIgbj1uZXcgUmVnRXhwKCJeIityKyIvKCg/Omluc3Rh
bmNlLSk/aW5pdGlhbGl6ZXJzKS8iKSxpPU9iamVjdC5rZXlzfHx0LmRlZmF1bHQua2V5cztpKHJl
cXVpcmVqcy5fZWFrX3NlZW4pLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bW9kdWxlTmFtZTplLG1h
dGNoZXM6bi5leGVjKGUpfX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaGVzJiYy
PT09ZS5tYXRjaGVzLmxlbmd0aH0pLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG49ci5tb2R1bGVO
YW1lLGk9cmVxdWlyZShuLG51bGwsbnVsbCwhMCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKG4rIiBt
dXN0IGV4cG9ydCBhbiBpbml0aWFsaXplci4iKTt2YXIgbz10LmRlZmF1bHQuU3RyaW5nLmNhbWVs
aXplKHIubWF0Y2hlc1sxXS5zdWJzdHJpbmcoMCxyLm1hdGNoZXNbMV0ubGVuZ3RoLTEpKSxhPWku
ZGVmYXVsdDtpZighYS5uYW1lKXt2YXIgcz1uLm1hdGNoKC9bXlwvXStcLz8kLylbMF07YS5uYW1l
PXN9ZVtvXSYmZVtvXShhKX0pfX0pLGRlZmluZSgiZW1iZXItcmVzb2x2ZXIvY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXIiLFsiZXhwb3J0cyIsImVtYmVyIiwiZW1iZXItcmVzb2x2ZXIvdXRpbHMvbW9k
dWxlLXJlZ2lzdHJ5Il0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKGUs
dCxyKXt2YXIgbj10Lm1hdGNoKG5ldyBSZWdFeHAoIl4vPyIrcisiLyguKykvIitlKyIkIikpO2lm
KG4pcmV0dXJuIG5bMV19dmFyIGk9dC5kZWZhdWx0LkNvbnRhaW5lckRlYnVnQWRhcHRlcixvPW51
bGw7InVuZGVmaW5lZCIhPXR5cGVvZiBpJiYobz1pLmV4dGVuZCh7X21vZHVsZVJlZ2lzdHJ5Om51
bGwsaW5pdDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlz
Ll9tb2R1bGVSZWdpc3RyeXx8KHRoaXMuX21vZHVsZVJlZ2lzdHJ5PW5ldyByLmRlZmF1bHQpfSxj
YW5DYXRhbG9nRW50cmllc0J5VHlwZTpmdW5jdGlvbigpe3JldHVybiEwfSxjYXRhbG9nRW50cmll
c0J5VHlwZTpmdW5jdGlvbihlKXtmb3IodmFyIHI9dGhpcy5fbW9kdWxlUmVnaXN0cnkubW9kdWxl
TmFtZXMoKSxpPXQuZGVmYXVsdC5BKCksbz10aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXgsYT0w
LHM9ci5sZW5ndGg7YTxzO2ErKyl7dmFyIHU9clthXTtpZih1LmluZGV4T2YoZSkhPT0tMSl7dmFy
IGw9bihlLHUsdGhpcy5uYW1lc3BhY2UucG9kTW9kdWxlUHJlZml4fHxvKTtsfHwobD11LnNwbGl0
KGUrInMvIikucG9wKCkpLGkuYWRkT2JqZWN0KGwpfX1yZXR1cm4gaX19KSksZS5kZWZhdWx0PW99
KSxkZWZpbmUoImVtYmVyLXJlc29sdmVyL2luZGV4IixbImV4cG9ydHMiLCJlbWJlci1yZXNvbHZl
ci9yZXNvbHZlciJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9w
ZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5k
ZWZhdWx0fX0pfSksZGVmaW5lKCJlbWJlci1yZXNvbHZlci9yZXNvbHZlciIsWyJleHBvcnRzIiwi
ZW1iZXIiLCJlbWJlci1yZXNvbHZlci91dGlscy9tb2R1bGUtcmVnaXN0cnkiLCJlbWJlci1yZXNv
bHZlci91dGlscy9jbGFzcy1mYWN0b3J5IiwiZW1iZXItcmVzb2x2ZXIvdXRpbHMvbWFrZS1kaWN0
aW9uYXJ5Il0sZnVuY3Rpb24oZSx0LHIsbixpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtp
ZihlLnBhcnNlZE5hbWU9PT0hMClyZXR1cm4gZTt2YXIgdCxyLG4saT1lLnNwbGl0KCJAIik7aWYo
ImhlbHBlcjpAY29udGVudC1oZWxwZXIiIT09ZSYmMj09PWkubGVuZ3RoKXt2YXIgbz1pWzBdLnNw
bGl0KCI6Iik7aWYoMj09PW8ubGVuZ3RoKXQ9b1sxXSxyPW9bMF0sbj1pWzFdO2Vsc2V7dmFyIGE9
aVsxXS5zcGxpdCgiOiIpO3Q9aVswXSxyPWFbMF0sbj1hWzFdfX1lbHNlIGk9ZS5zcGxpdCgiOiIp
LHI9aVswXSxuPWlbMV07dmFyIHM9bix1PWModGhpcywibmFtZXNwYWNlIiksZj11O3JldHVybntw
YXJzZWROYW1lOiEwLGZ1bGxOYW1lOmUscHJlZml4OnR8fHRoaXMucHJlZml4KHt0eXBlOnJ9KSx0
eXBlOnIsZnVsbE5hbWVXaXRob3V0VHlwZTpzLG5hbWU6bixyb290OmYscmVzb2x2ZU1ldGhvZE5h
bWU6InJlc29sdmUiK2wocil9fWZ1bmN0aW9uIGEoZSl7dC5kZWZhdWx0LmFzc2VydCgiYG1vZHVs
ZVByZWZpeGAgbXVzdCBiZSBkZWZpbmVkIix0aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXgpO3Zh
ciByPXRoaXMuZmluZE1vZHVsZU5hbWUoZSk7aWYocil7dmFyIGk9dGhpcy5fZXh0cmFjdERlZmF1
bHRFeHBvcnQocixlKTtpZih2b2lkIDA9PT1pKXRocm93IG5ldyBFcnJvcigiIEV4cGVjdGVkIHRv
IGZpbmQ6ICciK2UuZnVsbE5hbWUrIicgd2l0aGluICciK3IrIicgYnV0IGdvdCAndW5kZWZpbmVk
Jy4gRGlkIHlvdSBmb3JnZXQgdG8gYGV4cG9ydCBkZWZhdWx0YCB3aXRoaW4gJyIrcisiJz8iKTty
ZXR1cm4gdGhpcy5zaG91bGRXcmFwSW5DbGFzc0ZhY3RvcnkoaSxlKSYmKGk9KDAsbi5kZWZhdWx0
KShpKSksaX1yZXR1cm4gdGhpcy5fc3VwZXIoZSl9dmFyIHM9dC5kZWZhdWx0LlN0cmluZyx1PXMu
dW5kZXJzY29yZSxsPXMuY2xhc3NpZnksYz10LmRlZmF1bHQuZ2V0LGY9dC5kZWZhdWx0LkRlZmF1
bHRSZXNvbHZlcixkPWYuZXh0ZW5kKHtyZXNvbHZlT3RoZXI6YSxwYXJzZU5hbWU6byxyZXNvbHZl
VGVtcGxhdGU6YSxwbHVyYWxpemVkVHlwZXM6bnVsbCxtb2R1bGVSZWdpc3RyeTpudWxsLG1ha2VU
b1N0cmluZzpmdW5jdGlvbihlLHQpe3JldHVybiIiK3RoaXMubmFtZXNwYWNlLm1vZHVsZVByZWZp
eCsiQCIrdCsiOiJ9LHNob3VsZFdyYXBJbkNsYXNzRmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiEx
fSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm1vZHVsZUJhc2VkUmVzb2x2ZXI9
ITAsdGhpcy5fbW9kdWxlUmVnaXN0cnl8fCh0aGlzLl9tb2R1bGVSZWdpc3RyeT1uZXcgci5kZWZh
dWx0KSx0aGlzLl9ub3JtYWxpemVDYWNoZT0oMCxpLmRlZmF1bHQpKCksdGhpcy5wbHVyYWxpemVk
VHlwZXM9dGhpcy5wbHVyYWxpemVkVHlwZXN8fCgwLGkuZGVmYXVsdCkoKSx0aGlzLnBsdXJhbGl6
ZWRUeXBlcy5jb25maWd8fCh0aGlzLnBsdXJhbGl6ZWRUeXBlcy5jb25maWc9ImNvbmZpZyIpLHRo
aXMuX2RlcHJlY2F0ZWRQb2RNb2R1bGVQcmVmaXg9ITF9LG5vcm1hbGl6ZTpmdW5jdGlvbihlKXty
ZXR1cm4gdGhpcy5fbm9ybWFsaXplQ2FjaGVbZV18fCh0aGlzLl9ub3JtYWxpemVDYWNoZVtlXT10
aGlzLl9ub3JtYWxpemUoZSkpfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGUpe3ZhciByPWUuc3BsaXQo
IjoiKTtyZXR1cm4gci5sZW5ndGg+MT9yWzBdKyI6Iit0LmRlZmF1bHQuU3RyaW5nLmRhc2hlcml6
ZShyWzFdLnJlcGxhY2UoL1wuL2csIi8iKSk6ZX0scGx1cmFsaXplOmZ1bmN0aW9uKGUpe3JldHVy
biB0aGlzLnBsdXJhbGl6ZWRUeXBlc1tlXXx8KHRoaXMucGx1cmFsaXplZFR5cGVzW2VdPWUrInMi
KX0scG9kQmFzZWRMb29rdXBXaXRoUHJlZml4OmZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5mdWxsTmFt
ZVdpdGhvdXRUeXBlO3JldHVybiJ0ZW1wbGF0ZSI9PT10LnR5cGUmJihyPXIucmVwbGFjZSgvXmNv
bXBvbmVudHNcLy8sIiIpKSxlKyIvIityKyIvIit0LnR5cGV9LHBvZEJhc2VkTW9kdWxlTmFtZTpm
dW5jdGlvbihlKXt2YXIgdD10aGlzLm5hbWVzcGFjZS5wb2RNb2R1bGVQcmVmaXh8fHRoaXMubmFt
ZXNwYWNlLm1vZHVsZVByZWZpeDtyZXR1cm4gdGhpcy5wb2RCYXNlZExvb2t1cFdpdGhQcmVmaXgo
dCxlKX0scG9kQmFzZWRDb21wb25lbnRzSW5TdWJkaXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5u
YW1lc3BhY2UucG9kTW9kdWxlUHJlZml4fHx0aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7aWYo
dCs9Ii9jb21wb25lbnRzIiwiY29tcG9uZW50Ij09PWUudHlwZXx8ZS5mdWxsTmFtZVdpdGhvdXRU
eXBlLm1hdGNoKC9eY29tcG9uZW50cy8pKXJldHVybiB0aGlzLnBvZEJhc2VkTG9va3VwV2l0aFBy
ZWZpeCh0LGUpfSxyZXNvbHZlRW5naW5lOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZnVsbE5hbWVXaXRo
b3V0VHlwZSxyPXQrIi9lbmdpbmUiO2lmKHRoaXMuX21vZHVsZVJlZ2lzdHJ5LmhhcyhyKSlyZXR1
cm4gdGhpcy5fZXh0cmFjdERlZmF1bHRFeHBvcnQocil9LHJlc29sdmVSb3V0ZU1hcDpmdW5jdGlv
bihlKXt2YXIgcj1lLmZ1bGxOYW1lV2l0aG91dFR5cGUsbj1yKyIvcm91dGVzIjtpZih0aGlzLl9t
b2R1bGVSZWdpc3RyeS5oYXMobikpe3ZhciBpPXRoaXMuX2V4dHJhY3REZWZhdWx0RXhwb3J0KG4p
O3JldHVybiB0LmRlZmF1bHQuYXNzZXJ0KCJUaGUgcm91dGUgbWFwIGZvciAiK3IrIiBzaG91bGQg
YmUgd3JhcHBlZCBieSAnYnVpbGRSb3V0ZXMnIGJlZm9yZSBleHBvcnRpbmcuIixpLmlzUm91dGVN
YXApLGl9fSxtYWluTW9kdWxlTmFtZTpmdW5jdGlvbihlKXt2YXIgdD1lLnByZWZpeCsiLyIrZS50
eXBlO2lmKCJtYWluIj09PWUuZnVsbE5hbWVXaXRob3V0VHlwZSlyZXR1cm4gdH0sZGVmYXVsdE1v
ZHVsZU5hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucHJlZml4KyIvIit0aGlzLnBsdXJhbGl6ZShl
LnR5cGUpKyIvIitlLmZ1bGxOYW1lV2l0aG91dFR5cGV9LHByZWZpeDpmdW5jdGlvbihlKXt2YXIg
dD10aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7cmV0dXJuIHRoaXMubmFtZXNwYWNlW2UudHlw
ZSsiUHJlZml4Il0mJih0PXRoaXMubmFtZXNwYWNlW2UudHlwZSsiUHJlZml4Il0pLHR9LG1vZHVs
ZU5hbWVMb29rdXBQYXR0ZXJuczp0LmRlZmF1bHQuY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1cm5b
dGhpcy5wb2RCYXNlZE1vZHVsZU5hbWUsdGhpcy5wb2RCYXNlZENvbXBvbmVudHNJblN1YmRpcix0
aGlzLm1haW5Nb2R1bGVOYW1lLHRoaXMuZGVmYXVsdE1vZHVsZU5hbWVdfSksZmluZE1vZHVsZU5h
bWU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIsbj10aGlzLmdldCgibW9kdWxlTmFtZUxvb2t1cFBh
dHRlcm5zIiksaT0wLG89bi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9bltpXSxzPWEuY2FsbCh0aGlz
LGUpO2lmKHMmJihzPXRoaXMuY2hvb3NlTW9kdWxlTmFtZShzKSkscyYmdGhpcy5fbW9kdWxlUmVn
aXN0cnkuaGFzKHMpJiYocj1zKSx0fHx0aGlzLl9sb2dMb29rdXAocixlLHMpLHIpcmV0dXJuIHJ9
fSxjaG9vc2VNb2R1bGVOYW1lOmZ1bmN0aW9uKGUpe3ZhciByPXUoZSk7aWYoZSE9PXImJnRoaXMu
X21vZHVsZVJlZ2lzdHJ5LmhhcyhlKSYmdGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKHIpKXRocm93
IG5ldyBUeXBlRXJyb3IoIkFtYmlndW91cyBtb2R1bGUgbmFtZXM6IGAiK2UrImAgYW5kIGAiK3Ir
ImAiKTtpZih0aGlzLl9tb2R1bGVSZWdpc3RyeS5oYXMoZSkpcmV0dXJuIGU7aWYodGhpcy5fbW9k
dWxlUmVnaXN0cnkuaGFzKHIpKXJldHVybiByO3ZhciBuPWUucmVwbGFjZSgvXC8tKFteXC9dKikk
LywiL18kMSIpO3JldHVybiB0aGlzLl9tb2R1bGVSZWdpc3RyeS5oYXMobik/KHQuZGVmYXVsdC5k
ZXByZWNhdGUoJ01vZHVsZXMgc2hvdWxkIG5vdCBjb250YWluIHVuZGVyc2NvcmVzLiBBdHRlbXB0
ZWQgdG8gbG9va3VwICInK2UrJyIgd2hpY2ggd2FzIG5vdCBmb3VuZC4gUGxlYXNlIHJlbmFtZSAi
JytuKyciIHRvICInK2UrJyIgaW5zdGVhZC4nLCExLHtpZDoiZW1iZXItcmVzb2x2ZXIudW5kZXJz
Y29yZWQtbW9kdWxlcyIsdW50aWw6IjMuMC4wIn0pLG4pOmV9LGxvb2t1cERlc2NyaXB0aW9uOmZ1
bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyc2VOYW1lKGUpLHI9dGhpcy5maW5kTW9kdWxlTmFtZSh0
LCEwKTtyZXR1cm4gcn0sX2xvZ0xvb2t1cDpmdW5jdGlvbihlLHIsbil7aWYodC5kZWZhdWx0LkVO
Vi5MT0dfTU9EVUxFX1JFU09MVkVSfHxyLnJvb3QuTE9HX1JFU09MVkVSKXt2YXIgaSxvO2k9ZT8i
W+Kck10iOiJbIF0iLG89ci5mdWxsTmFtZS5sZW5ndGg+NjA/Ii4iOm5ldyBBcnJheSg2MC1yLmZ1
bGxOYW1lLmxlbmd0aCkuam9pbigiLiIpLG58fChuPXRoaXMubG9va3VwRGVzY3JpcHRpb24ocikp
LHQuZGVmYXVsdC5Mb2dnZXIuaW5mbyhpLHIuZnVsbE5hbWUsbyxuKX19LGtub3duRm9yVHlwZTpm
dW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5fbW9kdWxlUmVnaXN0cnkubW9kdWxlTmFtZXMoKSxy
PSgwLGkuZGVmYXVsdCkoKSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXt2YXIgYT10W25dLHM9dGhp
cy50cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKGUsYSk7cyYmKHJbc109ITApfXJldHVybiBy
fSx0cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5w
cmVmaXgoe3R5cGU6ZX0pLG49cisiLyIsaT0iLyIrZSxvPXQuaW5kZXhPZihuKSxhPXQuaW5kZXhP
ZihpKTtpZigwPT09byYmYT09PXQubGVuZ3RoLWkubGVuZ3RoJiZ0Lmxlbmd0aD5uLmxlbmd0aCtp
Lmxlbmd0aClyZXR1cm4gZSsiOiIrdC5zbGljZShvK24ubGVuZ3RoLGEpO3ZhciBzPXRoaXMucGx1
cmFsaXplKGUpLHU9cisiLyIrcysiLyI7cmV0dXJuIDA9PT10LmluZGV4T2YodSkmJnQubGVuZ3Ro
PnUubGVuZ3RoP2UrIjoiK3Quc2xpY2UodS5sZW5ndGgpOnZvaWQgMH0sX2V4dHJhY3REZWZhdWx0
RXhwb3J0OmZ1bmN0aW9uKGUpe3ZhciB0PXJlcXVpcmUoZSxudWxsLG51bGwsITApO3JldHVybiB0
JiZ0LmRlZmF1bHQmJih0PXQuZGVmYXVsdCksdH19KTtkLnJlb3BlbkNsYXNzKHttb2R1bGVCYXNl
ZFJlc29sdmVyOiEwfSksZS5kZWZhdWx0PWR9KSxkZWZpbmUoImVtYmVyLXJlc29sdmVyL3V0aWxz
L2NsYXNzLWZhY3RvcnkiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5j
dGlvbiB0KGUpe3JldHVybntjcmVhdGU6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlw
ZW9mIGUuZXh0ZW5kP2UuZXh0ZW5kKHQpOmV9fX1lLmRlZmF1bHQ9dH0pLGRlZmluZSgiZW1iZXIt
cmVzb2x2ZXIvdXRpbHMvY3JlYXRlIixbImV4cG9ydHMiLCJlbWJlciJdLGZ1bmN0aW9uKGUsdCl7
InVzZSBzdHJpY3QiOwordmFyIHI9T2JqZWN0LmNyZWF0ZXx8dC5kZWZhdWx0LmNyZWF0ZTtpZigh
cnx8cihudWxsKS5oYXNPd25Qcm9wZXJ0eSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgYnJvd3NlciBk
b2VzIG5vdCBzdXBwb3J0IE9iamVjdC5jcmVhdGUobnVsbCksIHBsZWFzZSBwb2x5ZmlsIHdpdGgg
ZXM1LXNoYW06IGh0dHA6Ly9naXQuaW8veUJVMnJnIik7ZS5kZWZhdWx0PXJ9KSxkZWZpbmUoImVt
YmVyLXJlc29sdmVyL3V0aWxzL21ha2UtZGljdGlvbmFyeSIsWyJleHBvcnRzIiwiZW1iZXItcmVz
b2x2ZXIvdXRpbHMvY3JlYXRlIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24g
cigpe3ZhciBlPSgwLHQuZGVmYXVsdCkobnVsbCk7cmV0dXJuIGUuX2RpY3Q9bnVsbCxkZWxldGUg
ZS5fZGljdCxlfWUuZGVmYXVsdD1yfSksZGVmaW5lKCJlbWJlci1yZXNvbHZlci91dGlscy9tb2R1
bGUtcmVnaXN0cnkiLFsiZXhwb3J0cyIsImVtYmVyIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmlj
dCI7ZnVuY3Rpb24gcihlKXt0aGlzLl9lbnRyaWVzPWV8fHJlcXVpcmVqcy5lbnRyaWVzfSJ1bmRl
ZmluZWQiPT10eXBlb2YgcmVxdWlyZWpzLmVudHJpZXMmJihyZXF1aXJlanMuZW50cmllcz1yZXF1
aXJlanMuX2Vha19zZWVuKSxyLnByb3RvdHlwZS5tb2R1bGVOYW1lcz1mdW5jdGlvbigpe3JldHVy
bihPYmplY3Qua2V5c3x8dC5kZWZhdWx0LmtleXMpKHRoaXMuX2VudHJpZXMpfSxyLnByb3RvdHlw
ZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW4gdGhpcy5fZW50cmllc30sci5wcm90b3R5cGUu
Z2V0PWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3Vt
ZW50c1sxXT8iZGVmYXVsdCI6YXJndW1lbnRzWzFdLHI9cmVxdWlyZShlKTtyZXR1cm4gciYmclt0
XX0sZS5kZWZhdWx0PXJ9KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyLmpzb24gYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jv
d2VyLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OWU0OTgyMmFmMDViNjRl
OTZhMTMwZTk5ODcxYjQwOTk4OTA4Y2YuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlci5qc29uCisrKyAvZGV2L251
bGwKQEAgLTEsMTIgKzAsMCBAQAotewotICAibmFtZSI6ICJ0b2RvbXZjLWVtYmVyanMiLAotICAi
dmVyc2lvbiI6ICIwLjAuMCIsCi0gICJkZXBlbmRlbmNpZXMiOiB7Ci0gICAgInRvZG9tdmMtY29t
bW9uIjogIn4wLjEuNCIsCi0gICAgImpxdWVyeSI6ICJ+Mi4xLjAiLAotICAgICJoYW5kbGViYXJz
IjogIn4xLjMuMCIsCi0gICAgImVtYmVyIjogIn4xLjMuMSIsCi0gICAgImVtYmVyLWRhdGEiOiAi
MS4wLjAtYmV0YS42IiwKLSAgICAiZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIiOiAibGF0ZXN0
IgotICB9Ci19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVu
dHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9j
b21wb25lbnRzL2VtYmVyLWRhdGEvZW1iZXItZGF0YS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggNzYyYTlkNzc5NWJhZGY2NDAyZDAzNmViYjU5MDkzMTBkNGViMzZjMi4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpzCisrKyAvZGV2L251
bGwKQEAgLTEsMTA2MjAgKzAsMCBAQAotLyohCi0gKiBAb3ZlcnZpZXcgIEVtYmVyIERhdGEKLSAq
IEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEtMjAxNCBUaWxkZSBJbmMuIGFuZCBjb250cmlidXRv
cnMuCi0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDExIExpdmluZ1NvY2lhbCBJ
bmMuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlIChzZWUgbGljZW5z
ZS5qcykKLSAqIEB2ZXJzaW9uICAgMS4wLjAtYmV0YS42Ci0gKi8KLQotCi0oZnVuY3Rpb24oKSB7
Ci12YXIgZGVmaW5lLCByZXF1aXJlTW9kdWxlOwotCi0oZnVuY3Rpb24oKSB7Ci0gIHZhciByZWdp
c3RyeSA9IHt9LCBzZWVuID0ge307Ci0KLSAgZGVmaW5lID0gZnVuY3Rpb24obmFtZSwgZGVwcywg
Y2FsbGJhY2spIHsKLSAgICByZWdpc3RyeVtuYW1lXSA9IHsgZGVwczogZGVwcywgY2FsbGJhY2s6
IGNhbGxiYWNrIH07Ci0gIH07Ci0KLSAgcmVxdWlyZU1vZHVsZSA9IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1cm4gc2VlbltuYW1lXTsgfQotICAgIHNlZW5bbmFt
ZV0gPSB7fTsKLQotICAgIHZhciBtb2QsIGRlcHMsIGNhbGxiYWNrLCByZWlmaWVkICwgZXhwb3J0
czsKLQotICAgIG1vZCA9IHJlZ2lzdHJ5W25hbWVdOwotCi0gICAgaWYgKCFtb2QpIHsKLSAgICAg
IHRocm93IG5ldyBFcnJvcigiTW9kdWxlICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKLSAg
ICB9Ci0KLSAgICBkZXBzID0gbW9kLmRlcHM7Ci0gICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2s7
Ci0gICAgcmVpZmllZCA9IFtdOwotICAgIGV4cG9ydHM7Ci0KLSAgICBmb3IgKHZhciBpPTAsIGw9
ZGVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBpZiAoZGVwc1tpXSA9PT0gJ2V4cG9ydHMn
KSB7Ci0gICAgICAgIHJlaWZpZWQucHVzaChleHBvcnRzID0ge30pOwotICAgICAgfSBlbHNlIHsK
LSAgICAgICAgcmVpZmllZC5wdXNoKHJlcXVpcmVNb2R1bGUoZGVwc1tpXSkpOwotICAgICAgfQot
ICAgIH0KLQotICAgIHZhciB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIHJlaWZpZWQpOwot
ICAgIHJldHVybiBzZWVuW25hbWVdID0gZXhwb3J0cyB8fCB2YWx1ZTsKLSAgfTsKLX0pKCk7Ci0o
ZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi0vKioKLSAgQWxs
IEVtYmVyIERhdGEgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiB0
aGlzIG5hbWVzcGFjZS4KLQotICBAY2xhc3MgRFMKLSAgQHN0YXRpYwotKi8KLXZhciBEUzsKLWlm
ICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIERTKSB7Ci0gIC8qKgotICAgIEBwcm9wZXJ0eSBWRVJT
SU9OCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgJzEuMC4wLWJldGEuNicKLSAgICBA
c3RhdGljCi0gICovCi0gIERTID0gRW1iZXIuTmFtZXNwYWNlLmNyZWF0ZSh7Ci0gICAgVkVSU0lP
TjogJzEuMC4wLWJldGEuNicKLSAgfSk7Ci0KLSAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Yg
d2luZG93KSB7Ci0gICAgd2luZG93LkRTID0gRFM7Ci0gIH0KLQotICBpZiAoRW1iZXIubGlicmFy
aWVzKSB7Ci0gICAgRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyIERh
dGEnLCBEUy5WRVJTSU9OKTsKLSAgfQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi0gIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGVuYWJsZSBkZXByZWNhdGlvbiBvZiBj
b250YWluZXIgcGF0aHMgYW5kIHByb3ZpZGUKLSAgYSBkZWNlbnQgbWVzc2FnZSB0byB0aGUgdXNl
ciBpbmRpY2F0aW5nIGhvdyB0byBmaXggdGhlIGlzc3VlLgotCi0gIEBjbGFzcyBDb250YWluZXJQ
cm94eQotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRlCi0qLwotdmFyIENvbnRhaW5lclByb3h5
ID0gZnVuY3Rpb24gKGNvbnRhaW5lcil7Ci0gIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwot
fTsKLQotQ29udGFpbmVyUHJveHkucHJvdG90eXBlLmFsaWFzZWRGYWN0b3J5ID0gZnVuY3Rpb24o
cGF0aCwgcHJlTG9va3VwKSB7Ci0gIHZhciBfdGhpcyA9IHRoaXM7Ci0KLSAgcmV0dXJuIHtjcmVh
dGU6IGZ1bmN0aW9uKCl7IAotICAgIGlmIChwcmVMb29rdXApIHsgcHJlTG9va3VwKCk7IH0KLQot
ICAgIHJldHVybiBfdGhpcy5jb250YWluZXIubG9va3VwKHBhdGgpOyAKLSAgfX07Ci19OwotCi1D
b250YWluZXJQcm94eS5wcm90b3R5cGUucmVnaXN0ZXJBbGlhcyA9IGZ1bmN0aW9uKHNvdXJjZSwg
ZGVzdCwgcHJlTG9va3VwKSB7Ci0gIHZhciBmYWN0b3J5ID0gdGhpcy5hbGlhc2VkRmFjdG9yeShk
ZXN0LCBwcmVMb29rdXApOwotCi0gIHJldHVybiB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcihzb3Vy
Y2UsIGZhY3RvcnkpOwotfTsKLQotQ29udGFpbmVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyRGVw
cmVjYXRpb24gPSBmdW5jdGlvbihkZXByZWNhdGVkLCB2YWxpZCkgewotICB2YXIgcHJlTG9va3Vw
Q2FsbGJhY2sgPSBmdW5jdGlvbigpewotICAgIEVtYmVyLmRlcHJlY2F0ZSgiWW91IHRyaWVkIHRv
IGxvb2sgdXAgJyIgKyBkZXByZWNhdGVkICsgIicsICIgKwotICAgICAgICAgICAgICAgICAgICAi
YnV0IHRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnIiArIHZhbGlkICsgIicu
IiwgZmFsc2UpOwotICB9OwotCi0gIHJldHVybiB0aGlzLnJlZ2lzdGVyQWxpYXMoZGVwcmVjYXRl
ZCwgdmFsaWQsIHByZUxvb2t1cENhbGxiYWNrKTsKLX07Ci0KLUNvbnRhaW5lclByb3h5LnByb3Rv
dHlwZS5yZWdpc3RlckRlcHJlY2F0aW9ucyA9IGZ1bmN0aW9uKHByb3h5UGFpcnMpIHsKLSAgZm9y
ICh2YXIgaSA9IHByb3h5UGFpcnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7Ci0gICAgdmFyIHByb3h5
UGFpciA9IHByb3h5UGFpcnNbaSAtIDFdLAotICAgICAgICBkZXByZWNhdGVkID0gcHJveHlQYWly
WydkZXByZWNhdGVkJ10sCi0gICAgICAgIHZhbGlkID0gcHJveHlQYWlyWyd2YWxpZCddOwotCi0g
ICAgdGhpcy5yZWdpc3RlckRlcHJlY2F0aW9uKGRlcHJlY2F0ZWQsIHZhbGlkKTsKLSAgfQotfTsK
LQotRFMuQ29udGFpbmVyUHJveHkgPSBDb250YWluZXJQcm94eTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25l
ID0gRW1iZXIuaXNOb25lOwotCi0vLyBTaW1wbGUgZGlzcGF0Y2hlciB0byBzdXBwb3J0IG92ZXJy
aWRpbmcgdGhlIGFsaWFzZWQKLS8vIG1ldGhvZCBpbiBzdWJjbGFzc2VzLgotZnVuY3Rpb24gYWxp
YXNNZXRob2QobWV0aG9kTmFtZSkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IHRoaXNbbWV0aG9kTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfTsKLX0KLQotLyoq
Ci0gIEluIEVtYmVyIERhdGEgYSBTZXJpYWxpemVyIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBk
ZXNlcmlhbGl6ZQotICByZWNvcmRzIHdoZW4gdGhleSBhcmUgdHJhbnNmZXJyZWQgaW4gYW5kIG91
dCBvZiBhbiBleHRlcm5hbCBzb3VyY2UuCi0gIFRoaXMgcHJvY2VzcyBpbnZvbHZlcyBub3JtYWxp
emluZyBwcm9wZXJ0eSBuYW1lcywgdHJhbnNmb3JtaW5nCi0gIGF0dHJpYnV0ZSB2YWx1ZXMgYW5k
IHNlcmlhbGl6aW5nIHJlbGF0aW9uc2hpcHMuCi0KLSAgRm9yIG1heGltdW0gcGVyZm9ybWFuY2Ug
RW1iZXIgRGF0YSByZWNvbW1lbmRzIHlvdSB1c2UgdGhlCi0gIFtSRVNUU2VyaWFsaXplcl0oRFMu
UkVTVFNlcmlhbGl6ZXIuaHRtbCkgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLgotCi0gIGBKU09O
U2VyaWFsaXplcmAgaXMgdXNlZnVsIGZvciBzaW1wbGVyIG9yIGxlZ2FjeSBiYWNrZW5kcyB0aGF0
IG1heQotICBub3Qgc3VwcG9ydCB0aGUgaHR0cDovL2pzb25hcGkub3JnLyBzcGVjLgotCi0gIEBj
bGFzcyBKU09OU2VyaWFsaXplcgotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuSlNPTlNlcmlhbGl6
ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgLyoqCi0gICAgVGhlIHByaW1hcnlLZXkgaXMg
dXNlZCB3aGVuIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gICAgZGF0YS4gRW1iZXIg
RGF0YSBhbHdheXMgdXNlcyB0aGUgYGlkYCBwcm9wZXJ0eSB0byBzdG9yZSB0aGUgaWQgb2YKLSAg
ICB0aGUgcmVjb3JkLiBUaGUgZXh0ZXJuYWwgc291cmNlIG1heSBub3QgYWx3YXlzIGZvbGxvdyB0
aGlzCi0gICAgY29udmVudGlvbi4gSW4gdGhlc2UgY2FzZXMgaXQgaXMgdXNlZnVsIHRvIG92ZXJy
aWRlIHRoZQotICAgIHByaW1hcnlLZXkgcHJvcGVydHkgdG8gbWF0Y2ggdGhlIHByaW1hcnlLZXkg
b2YgeW91ciBleHRlcm5hbAotICAgIHN0b3JlLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXpl
ci5leHRlbmQoewotICAgICAgcHJpbWFyeUtleTogJ19pZCcKLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIEBwcm9wZXJ0eSBwcmltYXJ5S2V5Ci0gICAgQHR5cGUge1N0cmluZ30KLSAgICBAZGVmYXVs
dCAnaWQnCi0gICovCi0gIHByaW1hcnlLZXk6ICdpZCcsCi0KLSAgLyoqCi0gICBHaXZlbiBhIHN1
YmNsYXNzIG9mIGBEUy5Nb2RlbGAgYW5kIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRob2Qgd2lsbAot
ICAgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggYXR0cmlidXRlIG9mIHRoZSBgRFMuTW9kZWxgIGFuZCBp
bnZva2UgdGhlCi0gICBgRFMuVHJhbnNmb3JtI2Rlc2VyaWFsaXplYCBtZXRob2Qgb24gdGhlIG1h
dGNoaW5nIHByb3BlcnR5IG9mIHRoZQotICAgSlNPTiBvYmplY3QuICBUaGlzIG1ldGhvZCBpcyB0
eXBpY2FsbHkgY2FsbGVkIGFmdGVyIHRoZQotICAgc2VyaWFsaXplcidzIGBub3JtYWxpemVgIG1l
dGhvZC4KLQotICAgQG1ldGhvZCBhcHBseVRyYW5zZm9ybXMKLSAgIEBwcml2YXRlCi0gICBAcGFy
YW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICBAcGFyYW0ge09iamVjdH0gZGF0YSBU
aGUgZGF0YSB0byB0cmFuc2Zvcm0KLSAgIEByZXR1cm4ge09iamVjdH0gZGF0YSBUaGUgdHJhbnNm
b3JtZWQgZGF0YSBvYmplY3QKLSAgKi8KLSAgYXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0eXBl
LCBkYXRhKSB7Ci0gICAgdHlwZS5lYWNoVHJhbnNmb3JtZWRBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5
LCB0eXBlKSB7Ci0gICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1Gb3IodHlwZSk7
Ci0gICAgICBkYXRhW2tleV0gPSB0cmFuc2Zvcm0uZGVzZXJpYWxpemUoZGF0YVtrZXldKTsKLSAg
ICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9LAotCi0gIC8qKgotICAgIE5vcm1h
bGl6ZXMgYSBwYXJ0IG9mIHRoZSBKU09OIHBheWxvYWQgcmV0dXJuZWQgYnkKLSAgICB0aGUgc2Vy
dmVyLiBZb3Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBtdW5nZSB0aGUgaGFzaAotICAg
IGFuZCBjYWxsIHN1cGVyIGlmIHlvdSBoYXZlIGdlbmVyaWMgbm9ybWFsaXphdGlvbiB0byBkby4K
LQotICAgIEl0IHRha2VzIHRoZSB0eXBlIG9mIHRoZSByZWNvcmQgdGhhdCBpcyBiZWluZyBub3Jt
YWxpemVkCi0gICAgKGFzIGEgRFMuTW9kZWwgY2xhc3MpLCB0aGUgcHJvcGVydHkgd2hlcmUgdGhl
IGhhc2ggd2FzCi0gICAgb3JpZ2luYWxseSBmb3VuZCwgYW5kIHRoZSBoYXNoIHRvIG5vcm1hbGl6
ZS4KLQotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gbm9ybWFs
aXplIHVuZGVyc2NvcmVkIGtleXMgdG8gY2FtZWxpemVkCi0gICAgb3Igb3RoZXIgZ2VuZXJhbC1w
dXJwb3NlIG5vcm1hbGl6YXRpb25zLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRl
bmQoewotICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgICAgIHZh
ciBmaWVsZHMgPSBFbWJlci5nZXQodHlwZSwgJ2ZpZWxkcycpOwotICAgICAgICBmaWVsZHMuZm9y
RWFjaChmdW5jdGlvbihmaWVsZCkgewotICAgICAgICAgIHZhciBwYXlsb2FkRmllbGQgPSBFbWJl
ci5TdHJpbmcudW5kZXJzY29yZShmaWVsZCk7Ci0gICAgICAgICAgaWYgKGZpZWxkID09PSBwYXls
b2FkRmllbGQpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgICBoYXNoW2ZpZWxkXSA9IGhhc2hbcGF5
bG9hZEZpZWxkXTsKLSAgICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkRmllbGRdOwotICAgICAg
ICB9KTsKLSAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAg
IEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0g
aGFzaAotICAgIEByZXR1cm4ge09iamVjdH0KLSAgKi8KLSAgbm9ybWFsaXplOiBmdW5jdGlvbih0
eXBlLCBoYXNoKSB7Ci0gICAgaWYgKCFoYXNoKSB7IHJldHVybiBoYXNoOyB9Ci0KLSAgICB0aGlz
LmFwcGx5VHJhbnNmb3Jtcyh0eXBlLCBoYXNoKTsKLSAgICByZXR1cm4gaGFzaDsKLSAgfSwKLQot
ICAvLyBTRVJJQUxJWkUKLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgc2F2ZWQg
aW4gb3JkZXIgdG8gY29udmVydCB0aGUKLSAgICByZWNvcmQgaW50byBKU09OLgotCi0gICAgQnkg
ZGVmYXVsdCwgaXQgY3JlYXRlcyBhIEpTT04gb2JqZWN0IHdpdGggYSBrZXkgZm9yCi0gICAgZWFj
aCBhdHRyaWJ1dGUgYW5kIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhhbXBs
ZSwgY29uc2lkZXIgdGhpcyBtb2RlbDoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29t
bWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB0aXRsZTogRFMuYXR0cigpLAotICAgICAg
Ym9keTogRFMuYXR0cigpLAotCi0gICAgICBhdXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicpCi0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxkIGNy
ZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAg
ICAgInRpdGxlIjogIlJhaWxzIGlzIHVuYWdpIiwKLSAgICAgICJib2R5IjogIlJhaWxzPyBPbWFr
YXNlPyBPX08iLAotICAgICAgImF1dGhvciI6IDEyCi0gICAgfQotICAgIGBgYAotCi0gICAgQnkg
ZGVmYXVsdCwgYXR0cmlidXRlcyBhcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMsIHVubGVzcwotICAg
IHlvdSBzcGVjaWZpZWQgYW4gYXR0cmlidXRlIHR5cGUgKGBEUy5hdHRyKCdkYXRlJylgKS4gSWYK
LSAgICB5b3Ugc3BlY2lmeSBhIHRyYW5zZm9ybSwgdGhlIEphdmFTY3JpcHQgdmFsdWUgd2lsbCBi
ZQotICAgIHNlcmlhbGl6ZWQgd2hlbiBpbnNlcnRlZCBpbnRvIHRoZSBKU09OIGhhc2guCi0KLSAg
ICBCeSBkZWZhdWx0LCBiZWxvbmdzLXRvIHJlbGF0aW9uc2hpcHMgYXJlIGNvbnZlcnRlZCBpbnRv
Ci0gICAgSURzIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgotCi0gICAgIyMgSURz
Ci0KLSAgICBgc2VyaWFsaXplYCB0YWtlcyBhbiBvcHRpb25zIGhhc2ggd2l0aCBhIHNpbmdsZSBv
cHRpb246Ci0gICAgYGluY2x1ZGVJZGAuIElmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgYHNlcmlh
bGl6ZWAgd2lsbCwKLSAgICBieSBkZWZhdWx0IGluY2x1ZGUgdGhlIElEIGluIHRoZSBKU09OIG9i
amVjdCBpdCBidWlsZHMuCi0KLSAgICBUaGUgYWRhcHRlciBwYXNzZXMgaW4gYGluY2x1ZGVJZDog
dHJ1ZWAgd2hlbiBzZXJpYWxpemluZwotICAgIGEgcmVjb3JkIGZvciBgY3JlYXRlUmVjb3JkYCwg
YnV0IG5vdCBmb3IgYHVwZGF0ZVJlY29yZGAuCi0KLSAgICAjIyBDdXN0b21pemF0aW9uCi0KLSAg
ICBZb3VyIHNlcnZlciBtYXkgZXhwZWN0IGEgZGlmZmVyZW50IEpTT04gZm9ybWF0IHRoYW4gdGhl
Ci0gICAgYnVpbHQtaW4gc2VyaWFsaXphdGlvbiBmb3JtYXQuCi0KLSAgICBJbiB0aGF0IGNhc2Us
IHlvdSBjYW4gaW1wbGVtZW50IGBzZXJpYWxpemVgIHlvdXJzZWxmIGFuZAotICAgIHJldHVybiBh
IEpTT04gaGFzaCBvZiB5b3VyIGNob29zaW5nLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFw
cC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBzZXJp
YWxpemU6IGZ1bmN0aW9uKHBvc3QsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7Ci0g
ICAgICAgICAgUE9TVF9UVEw6IHBvc3QuZ2V0KCd0aXRsZScpLAotICAgICAgICAgIFBPU1RfQkRZ
OiBwb3N0LmdldCgnYm9keScpLAotICAgICAgICAgIFBPU1RfQ01TOiBwb3N0LmdldCgnY29tbWVu
dHMnKS5tYXBQcm9wZXJ0eSgnaWQnKQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMu
aW5jbHVkZUlkKSB7Ci0gICAgICAgICAganNvbi5QT1NUX0lEXyA9IHBvc3QuZ2V0KCdpZCcpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGpzb247Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICAjIyBDdXN0b21pemluZyBhbiBBcHAtV2lkZSBTZXJpYWxpemVyCi0KLSAgICBJ
ZiB5b3Ugd2FudCB0byBkZWZpbmUgYSBzZXJpYWxpemVyIGZvciB5b3VyIGVudGlyZQotICAgIGFw
cGxpY2F0aW9uLCB5b3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYGVhY2hBdHRyaWJ1dGVgCi0g
ICAgYW5kIGBlYWNoUmVsYXRpb25zaGlwYCBvbiB0aGUgcmVjb3JkLgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5l
eHRlbmQoewotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAg
ICAgICAgdmFyIGpzb24gPSB7fTsKLQotICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5j
dGlvbihuYW1lKSB7Ci0gICAgICAgICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9
IHJlY29yZC5nZXQobmFtZSk7Ci0gICAgICAgIH0pCi0KLSAgICAgICAgcmVjb3JkLmVhY2hSZWxh
dGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAgaWYgKHJl
bGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAgICAgIGpzb25bc2VydmVy
SGFzTWFueU5hbWUobmFtZSldID0gcmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsKLSAgICAg
ICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewot
ICAgICAgICAgIGpzb24uSURfID0gcmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBqc29uOwotICAgICAgfQotICAgIH0pOwotCi0gICAgZnVuY3Rpb24gc2VydmVy
QXR0cmlidXRlTmFtZShhdHRyaWJ1dGUpIHsKLSAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJz
Y29yZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2VydmVySGFzTWFu
eU5hbWUobmFtZSkgewotICAgICAgcmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5n
dWxhcml6ZSgpKSArICJfSURTIjsKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNlcmlhbGl6
ZXIgd2lsbCBnZW5lcmF0ZSBKU09OIHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHsKLSAgICAgICJUSVRMRSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAg
ICJCT0RZIjogIlllcC4gT21ha2FzZS4iLAotICAgICAgIkNPTU1FTlRfSURTIjogWyAxLCAyLCAz
IF0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICAjIyBUd2Vha2luZyB0aGUgRGVmYXVsdCBKU09OCi0K
LSAgICBJZiB5b3UganVzdCB3YW50IHRvIGRvIHNvbWUgc21hbGwgdHdlYWtzIG9uIHRoZSBkZWZh
dWx0IEpTT04sCi0gICAgeW91IGNhbiBjYWxsIHN1cGVyIGZpcnN0IGFuZCBtYWtlIHRoZSB0d2Vh
a3Mgb24gdGhlIHJldHVybmVkCi0gICAgSlNPTi4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBB
cHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2Vy
aWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB0
aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotCi0gICAgICAgIGpzb24uc3ViamVj
dCA9IGpzb24udGl0bGU7Ci0gICAgICAgIGRlbGV0ZSBqc29uLnRpdGxlOwotCi0gICAgICAgIHJl
dHVybiBqc29uOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJp
YWxpemUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFy
YW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm4ge09iamVjdH0ganNvbgotICAqLwotICBz
ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgIHZhciBqc29uID0ge307
Ci0KLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVJZCkgewotICAgICAgdmFyIGlk
ID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0KLSAgICAgIGlmIChpZCkgewotICAgICAgICBqc29uW2dl
dCh0aGlzLCAncHJpbWFyeUtleScpXSA9IGlkOwotICAgICAgfQotICAgIH0KLQotICAgIHJlY29y
ZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSwgYXR0cmlidXRlKSB7Ci0gICAgICB0aGlzLnNl
cmlhbGl6ZUF0dHJpYnV0ZShyZWNvcmQsIGpzb24sIGtleSwgYXR0cmlidXRlKTsKLSAgICB9LCB0
aGlzKTsKLQotICAgIHJlY29yZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRp
b25zaGlwKSB7Ci0gICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7
Ci0gICAgICAgIHRoaXMuc2VyaWFsaXplQmVsb25nc1RvKHJlY29yZCwganNvbiwgcmVsYXRpb25z
aGlwKTsKLSAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55Jykg
ewotICAgICAgICB0aGlzLnNlcmlhbGl6ZUhhc01hbnkocmVjb3JkLCBqc29uLCByZWxhdGlvbnNo
aXApOwotICAgICAgfQotICAgIH0sIHRoaXMpOwotCi0gICAgcmV0dXJuIGpzb247Ci0gIH0sCi0K
LSAgLyoqCi0gICBgc2VyaWFsaXplQXR0cmlidXRlYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUg
aG93IGBEUy5hdHRyYAotICAgcHJvcGVydGllcyBhcmUgc2VyaWFsaXplZAotCi0gICBGb3IgZXhh
bXBsZSBpZiB5b3Ugd2FudGVkIHRvIGVuc3VyZSBhbGwgeW91IGF0dHJpYnV0ZXMgd2VyZSBhbHdh
eXMKLSAgIHNlcmlhbGl6ZWQgYXMgcHJvcGVydGllcyBvbiBhbiBgYXR0cmlidXRlc2Agb2JqZWN0
IHlvdSBjb3VsZAotICAgd3JpdGU6Ci0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNh
dGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICBzZXJpYWxp
emVBdHRyaWJ1dGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGVzKSB7Ci0g
ICAgICAganNvbi5hdHRyaWJ1dGVzID0ganNvbi5hdHRyaWJ1dGVzIHx8IHt9OwotICAgICAgIHRo
aXMuX3N1cGVyKHJlY29yZCwganNvbi5hdHRyaWJ1dGVzLCBrZXksIGF0dHJpYnV0ZXMpOwotICAg
ICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBAbWV0aG9kIHNlcmlhbGl6ZUF0dHJpYnV0ZQotICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICBAcGFyYW0ge09iamVjdH0ganNvbgotICAgQHBh
cmFtIHtTdHJpbmd9IGtleQotICAgQHBhcmFtIHtPYmplY3R9IGF0dHJpYnV0ZQotICAqLwotICBz
ZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGUp
IHsKLSAgICB2YXIgYXR0cnMgPSBnZXQodGhpcywgJ2F0dHJzJyk7Ci0gICAgdmFyIHZhbHVlID0g
Z2V0KHJlY29yZCwga2V5KSwgdHlwZSA9IGF0dHJpYnV0ZS50eXBlOwotCi0gICAgaWYgKHR5cGUp
IHsKLSAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybUZvcih0eXBlKTsKLSAgICAg
IHZhbHVlID0gdHJhbnNmb3JtLnNlcmlhbGl6ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gaWYg
cHJvdmlkZWQsIHVzZSB0aGUgbWFwcGluZyBwcm92aWRlZCBieSBgYXR0cnNgIGluCi0gICAgLy8g
dGhlIHNlcmlhbGl6ZXIKLSAgICBrZXkgPSBhdHRycyAmJiBhdHRyc1trZXldIHx8ICh0aGlzLmtl
eUZvckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXkpOwotCi0gICAg
anNvbltrZXldID0gdmFsdWU7Ci0gIH0sCi0KLSAgLyoqCi0gICBgc2VyaWFsaXplQmVsb25nc1Rv
YCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgaG93IGBEUy5iZWxvbmdzVG9gCi0gICBwcm9wZXJ0
aWVzIGFyZSBzZXJpYWxpemVkLgotCi0gICBFeGFtcGxlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAg
IEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgIHNl
cmlhbGl6ZUJlbG9uZ3NUbzogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsK
LSAgICAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleTsKLQotICAgICAgIHZhciBiZWxvbmdz
VG8gPSBnZXQocmVjb3JkLCBrZXkpOwotCi0gICAgICAga2V5ID0gdGhpcy5rZXlGb3JSZWxhdGlv
bnNoaXAgPyB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksICJiZWxvbmdzVG8iKSA6IGtleTsK
LQotICAgICAgIGpzb25ba2V5XSA9IEVtYmVyLmlzTm9uZShiZWxvbmdzVG8pID8gYmVsb25nc1Rv
IDogYmVsb25nc1RvLnRvSlNPTigpOwotICAgICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBAbWV0
aG9kIHNlcmlhbGl6ZUJlbG9uZ3NUbwotICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICBA
cGFyYW0ge09iamVjdH0ganNvbgotICAgQHBhcmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcAotICAq
LwotICBzZXJpYWxpemVCZWxvbmdzVG86IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25z
aGlwKSB7Ci0gICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0KLSAgICB2YXIgYmVsb25n
c1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLQotICAgIGtleSA9IHRoaXMua2V5Rm9yUmVsYXRpb25z
aGlwID8gdGhpcy5rZXlGb3JSZWxhdGlvbnNoaXAoa2V5LCAiYmVsb25nc1RvIikgOiBrZXk7Ci0K
LSAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykpIHsKLSAgICAgIGpzb25ba2V5XSA9IGJlbG9uZ3NU
bzsKLSAgICB9IGVsc2UgewotICAgICAganNvbltrZXldID0gZ2V0KGJlbG9uZ3NUbywgJ2lkJyk7
Ci0gICAgfQotCi0gICAgaWYgKHJlbGF0aW9uc2hpcC5vcHRpb25zLnBvbHltb3JwaGljKSB7Ci0g
ICAgICB0aGlzLnNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZShyZWNvcmQsIGpzb24sIHJlbGF0aW9u
c2hpcCk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgYHNlcmlhbGl6ZUhhc01hbnlgIGNhbiBi
ZSB1c2VkIHRvIGN1c3RvbWl6ZSBob3cgYERTLmhhc01hbnlgCi0gICBwcm9wZXJ0aWVzIGFyZSBz
ZXJpYWxpemVkLgotCi0gICBFeGFtcGxlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Qb3N0
U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgIHNlcmlhbGl6ZUhh
c01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgdmFy
IGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0gICAgICAgaWYgKGtleSA9PT0gJ2NvbW1lbnRzJykg
ewotICAgICAgICAgcmV0dXJuOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICB0aGlzLl9zdXBl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgICAgIH0KLSAgICAgfQotICAgfSk7Ci0gICBg
YGAKLQotICAgQG1ldGhvZCBzZXJpYWxpemVIYXNNYW55Ci0gICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQKLSAgIEBwYXJhbSB7T2JqZWN0fSBqc29uCi0gICBAcGFyYW0ge09iamVjdH0gcmVsYXRp
b25zaGlwCi0gICovCi0gIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwg
cmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0KLSAgICB2
YXIgcmVsYXRpb25zaGlwVHlwZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxh
dGlvbnNoaXBUeXBlKHJlY29yZC5jb25zdHJ1Y3RvciwgcmVsYXRpb25zaGlwKTsKLQotICAgIGlm
IChyZWxhdGlvbnNoaXBUeXBlID09PSAnbWFueVRvTm9uZScgfHwgcmVsYXRpb25zaGlwVHlwZSA9
PT0gJ21hbnlUb01hbnknKSB7Ci0gICAgICBqc29uW2tleV0gPSBnZXQocmVjb3JkLCBrZXkpLm1h
cEJ5KCdpZCcpOwotICAgICAgLy8gVE9ETyBzdXBwb3J0IGZvciBwb2x5bW9ycGhpYyBtYW55VG9O
b25lIGFuZCBtYW55VG9NYW55IHJlbGF0aW9uc2hpcHMKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIGhvdyBwb2x5bW9ycGhpYyBv
YmplY3RzIGFyZQotICAgIHNlcmlhbGl6ZWQuIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUg
cG9seW1vcnBoaWMgaWYKLSAgICBge3BvbHltb3JwaGljOiB0cnVlfWAgaXMgcGFzcyBhcyB0aGUg
c2Vjb25kIGFyZ3VtZW50IHRvIHRoZQotICAgIGBEUy5iZWxvbmdzVG9gIGZ1bmN0aW9uLgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Db21tZW50U2VyaWFsaXpl
ciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemVQb2x5bW9ycGhp
Y1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHZh
ciBrZXkgPSByZWxhdGlvbnNoaXAua2V5LAotICAgICAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJl
Y29yZCwga2V5KTsKLSAgICAgICAga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUgPyB0aGlzLmtl
eUZvckF0dHJpYnV0ZShrZXkpIDoga2V5OwotICAgICAgICBqc29uW2tleSArICJfdHlwZSJdID0g
YmVsb25nc1RvLmNvbnN0cnVjdG9yLnR5cGVLZXk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICBgYGAK
LQotICAgIEBtZXRob2Qgc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlCi0gICAgQHBhcmFtIHtEUy5N
b2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGpzb24KLSAgICBAcGFyYW0ge09iamVj
dH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTogRW1iZXIu
SywKLQotICAvLyBFWFRSQUNUCi0KLSAgLyoqCi0gICAgVGhlIGBleHRyYWN0YCBtZXRob2QgaXMg
dXNlZCB0byBkZXNlcmlhbGl6ZSBwYXlsb2FkIGRhdGEgZnJvbSB0aGUKLSAgICBzZXJ2ZXIuIEJ5
IGRlZmF1bHQgdGhlIGBKU09OU2VyaWFsaXplcmAgZG9lcyBub3QgcHVzaCB0aGUgcmVjb3Jkcwot
ICAgIGludG8gdGhlIHN0b3JlLiBIb3dldmVyIHJlY29yZHMgdGhhdCBzdWJjbGFzcyBgSlNPTlNl
cmlhbGl6ZXJgCi0gICAgc3VjaCBhcyB0aGUgYFJFU1RTZXJpYWxpemVyYCBtYXkgcHVzaCByZWNv
cmRzIGludG8gdGhlIHN0b3JlIGFzCi0gICAgcGFydCBvZiB0aGUgZXh0cmFjdCBjYWxsLgotCi0g
ICAgVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIGEgbW9yZSBzcGVjaWZpYyBleHRyYWN0IG1ldGhv
ZCBiYXNlZCBvbgotICAgIHRoZSBgcmVxdWVzdFR5cGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBnZXQgPSBFbWJlci5nZXQ7Ci0gICAgc29ja2V0Lm9uKCdt
ZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkgewotICAgICAgdmFyIG1vZGVsTmFtZSA9IG1lc3Nh
Z2UubW9kZWw7Ci0gICAgICB2YXIgZGF0YSA9IG1lc3NhZ2UuZGF0YTsKLSAgICAgIHZhciB0eXBl
ID0gc3RvcmUubW9kZWxGb3IobW9kZWxOYW1lKTsKLSAgICAgIHZhciBzZXJpYWxpemVyID0gc3Rv
cmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVLZXkpOwotICAgICAgdmFyIHJlY29yZCA9IHNlcmlh
bGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgZGF0YSwgZ2V0KGRhdGEsICdpZCcpLCAnc2luZ2xl
Jyk7Ci0gICAgICBzdG9yZS5wdXNoKG1vZGVsTmFtZSwgcmVjb3JkKTsKLSAgICB9KTsKLSAgICBg
YGAKLQotICAgIEBtZXRob2QgZXh0cmFjdAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0g
ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0
fSBwYXlsb2FkCi0gICAgQHBhcmFtIHtTdHJpbmcgb3IgTnVtYmVyfSBpZAotICAgIEBwYXJhbSB7
U3RyaW5nfSByZXF1ZXN0VHlwZQotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJp
YWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBh
eWxvYWQsIGlkLCByZXF1ZXN0VHlwZSkgewotICAgIHRoaXMuZXh0cmFjdE1ldGEoc3RvcmUsIHR5
cGUsIHBheWxvYWQpOwotCi0gICAgdmFyIHNwZWNpZmljRXh0cmFjdCA9ICJleHRyYWN0IiArIHJl
cXVlc3RUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVxdWVzdFR5cGUuc3Vic3RyKDEp
OwotICAgIHJldHVybiB0aGlzW3NwZWNpZmljRXh0cmFjdF0oc3RvcmUsIHR5cGUsIHBheWxvYWQs
IGlkLCByZXF1ZXN0VHlwZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kQWxsYCBp
cyBhIGhvb2sgaW50byB0aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuIGEKLSAgICBjYWxsIGlz
IG1hZGUgdG8gYERTLlN0b3JlI2ZpbmRBbGxgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFu
Ci0gICAgYWxpYXMgZm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2RfZXh0cmFjdEFycmF5KS4KLQot
ICAgIEBtZXRob2QgZXh0cmFjdEZpbmRBbGwKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlh
bGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0RmluZEFsbDogYWxpYXNNZXRob2QoJ2V4dHJh
Y3RBcnJheScpLAotICAvKioKLSAgICBgZXh0cmFjdEZpbmRRdWVyeWAgaXMgYSBob29rIGludG8g
dGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5T
dG9yZSNmaW5kUXVlcnlgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCi0gICAgYWxpYXMg
Zm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2RfZXh0cmFjdEFycmF5KS4KLQotICAgIEBtZXRob2Qg
ZXh0cmFjdEZpbmRRdWVyeQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2Fk
Ci0gICAgQHJldHVybiB7QXJyYXl9IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmpl
Y3RzCi0gICovCi0gIGV4dHJhY3RGaW5kUXVlcnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXkn
KSwKLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kTWFueWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJh
Y3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5k
TWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMKLSAgICBhbGlhcyBmb3IgW2V4dHJhY3RB
cnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkpLgotCi0gICAgQG1ldGhvZCBleHRyYWN0RmluZE1h
bnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4g
e0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBl
eHRyYWN0RmluZE1hbnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKLSAgLyoqCi0gICAg
YGV4dHJhY3RGaW5kSGFzTWFueWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVz
ZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kSGFzTWFueWAuIEJ5
IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMKLSAgICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21l
dGhvZF9leHRyYWN0QXJyYXkpLgotCi0gICAgQG1ldGhvZCBleHRyYWN0RmluZEhhc01hbnkKLSAg
ICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5
fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0
RmluZEhhc01hbnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKLQotICAvKioKLSAgICBg
ZXh0cmFjdENyZWF0ZVJlY29yZGAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVz
ZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNjcmVhdGVSZWNvcmRgLiBC
eSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzCi0gICAgYWxpYXMgZm9yIFtleHRyYWN0U2F2ZV0oI21l
dGhvZF9leHRyYWN0U2F2ZSkuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RDcmVhdGVSZWNvcmQKLSAg
ICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVj
dH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdENyZWF0ZVJl
Y29yZDogYWxpYXNNZXRob2QoJ2V4dHJhY3RTYXZlJyksCi0gIC8qKgotICAgIGBleHRyYWN0VXBk
YXRlUmVjb3JkYCBpcyBhIGhvb2sgaW50byB0aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuCi0g
ICAgYSBjYWxsIGlzIG1hZGUgdG8gYERTLlN0b3JlI3VwZGF0ZWAuIEJ5IGRlZmF1bHQgdGhpcyBt
ZXRob2QgaXMgYWxpYXMKLSAgICBmb3IgW2V4dHJhY3RTYXZlXSgjbWV0aG9kX2V4dHJhY3RTYXZl
KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdFVwZGF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3Rv
cmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBw
YXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNl
cmlhbGl6ZWQgcGF5bG9hZAotICAqLwotICBleHRyYWN0VXBkYXRlUmVjb3JkOiBhbGlhc01ldGhv
ZCgnZXh0cmFjdFNhdmUnKSwKLSAgLyoqCi0gICAgYGV4dHJhY3REZWxldGVSZWNvcmRgIGlzIGEg
aG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhvZCB1c2VkIHdoZW4KLSAgICBhIGNhbGwgaXMgbWFk
ZSB0byBgRFMuU3RvcmUjZGVsZXRlUmVjb3JkYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwot
ICAgIGFsaWFzIGZvciBbZXh0cmFjdFNhdmVdKCNtZXRob2RfZXh0cmFjdFNhdmUpLgotCi0gICAg
QG1ldGhvZCBleHRyYWN0RGVsZXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK
LSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IHBheWxvYWQKLSAgICBAcmV0dXJuIHtPYmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBw
YXlsb2FkCi0gICovCi0gIGV4dHJhY3REZWxldGVSZWNvcmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0
U2F2ZScpLAotCi0gIC8qKgotICAgIGBleHRyYWN0RmluZGAgaXMgYSBob29rIGludG8gdGhlIGV4
dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAgIGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNm
aW5kYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNp
bmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmQK
LSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09i
amVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdEZpbmQ6
IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCi0gIC8qKgotICAgIGBleHRyYWN0RmluZEJl
bG9uZ3NUb2AgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAg
IGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kQmVsb25nc1RvYC4gQnkgZGVmYXVsdCB0
aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRy
YWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmRCZWxvbmdzVG8KLSAgICBAcGFy
YW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5
cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNv
biBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdEZpbmRCZWxvbmdzVG86
IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCi0gIC8qKgotICAgIGBleHRyYWN0U2F2ZWAg
aXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhIGNhbGwKLSAgICBp
cyBtYWRlIHRvIGBEUy5Nb2RlbCNzYXZlYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyBhbGlh
cwotICAgIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAg
IEBtZXRob2QgZXh0cmFjdFNhdmUKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBw
YXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5
bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQK
LSAgKi8KLSAgZXh0cmFjdFNhdmU6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCi0KLSAg
LyoqCi0gICAgYGV4dHJhY3RTaW5nbGVgIGlzIHVzZWQgdG8gZGVzZXJpYWxpemUgYSBzaW5nbGUg
cmVjb3JkIHJldHVybmVkCi0gICAgZnJvbSB0aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFs
aXplci5leHRlbmQoewotICAgICAgZXh0cmFjdFNpbmdsZTogZnVuY3Rpb24oc3RvcmUsIHR5cGUs
IHBheWxvYWQpIHsKLSAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IHBheWxvYWQuX2VtYmVkZGVk
LmNvbW1lbnQ7Ci0gICAgICAgIGRlbGV0ZSBwYXlsb2FkLl9lbWJlZGRlZDsKLQotICAgICAgICBy
ZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwotICAgICAgfSwKLSAgICB9
KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXh0cmFjdFNpbmdsZQotICAgIEBwYXJhbSB7RFMu
U3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAg
IEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBk
ZXNlcmlhbGl6ZWQgcGF5bG9hZAotICAqLwotICBleHRyYWN0U2luZ2xlOiBmdW5jdGlvbihzdG9y
ZSwgdHlwZSwgcGF5bG9hZCkgewotICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0eXBlLCBwYXls
b2FkKTsKLSAgfSwKLQotICAvKioKLSAgICBgZXh0cmFjdEFycmF5YCBpcyB1c2VkIHRvIGRlc2Vy
aWFsaXplIGFuIGFycmF5IG9mIHJlY29yZHMKLSAgICByZXR1cm5lZCBmcm9tIHRoZSBhZGFwdGVy
LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFs
aXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBleHRyYWN0QXJyYXk6IGZ1
bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkKSB7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkLm1h
cChmdW5jdGlvbihqc29uKSB7Ci0gICAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNpbmdsZShq
c29uKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIGV4dHJhY3RBcnJheQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAg
QHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBw
YXlsb2FkCi0gICAgQHJldHVybiB7QXJyYXl9IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXpl
ZCBvYmplY3RzCi0gICovCi0gIGV4dHJhY3RBcnJheTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBh
eWxvYWQpIHsKLSAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodHlwZSwgcGF5bG9hZCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgYGV4dHJhY3RNZXRhYCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFueSBt
ZXRhIGluZm9ybWF0aW9uIGluIHRoZQotICAgIGFkYXB0ZXIgcGF5bG9hZC4gQnkgZGVmYXVsdCBF
bWJlciBEYXRhIGV4cGVjdHMgbWV0YSBpbmZvcm1hdGlvbiB0bwotICAgIGJlIGxvY2F0ZWQgb24g
dGhlIGBtZXRhYCBwcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZCBvYmplY3QuCi0KLSAgICBFeGFtcGxl
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNl
cmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIGV4dHJhY3RNZXRhOiBmdW5jdGlvbihzdG9yZSwgdHlw
ZSwgcGF5bG9hZCkgewotICAgICAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLl9wYWdpbmF0aW9u
KSB7Ci0gICAgICAgICAgc3RvcmUubWV0YUZvclR5cGUodHlwZSwgcGF5bG9hZC5fcGFnaW5hdGlv
bik7Ci0gICAgICAgICAgZGVsZXRlIHBheWxvYWQuX3BhZ2luYXRpb247Ci0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXh0cmFjdE1ldGEKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAqLwotICBleHRyYWN0TWV0YTog
ZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICBpZiAocGF5bG9hZCAmJiBwYXls
b2FkLm1ldGEpIHsKLSAgICAgIHN0b3JlLm1ldGFGb3JUeXBlKHR5cGUsIHBheWxvYWQubWV0YSk7
Ci0gICAgICBkZWxldGUgcGF5bG9hZC5tZXRhOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgIGBr
ZXlGb3JBdHRyaWJ1dGVgIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBydWxlcyBmb3IgaG93IHRvIGNv
bnZlcnQgYW4KLSAgIGF0dHJpYnV0ZSBuYW1lIGluIHlvdXIgbW9kZWwgdG8gYSBrZXkgaW4geW91
ciBKU09OLgotCi0gICBFeGFtcGxlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNh
dGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICBrZXlGb3JB
dHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIpIHsKLSAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVu
ZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKTsKLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQot
ICAgQG1ldGhvZCBrZXlGb3JBdHRyaWJ1dGUKLSAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgIEBy
ZXR1cm4ge1N0cmluZ30gbm9ybWFsaXplZCBrZXkKLSAgKi8KLQotCi0gIC8qKgotICAgYGtleUZv
clJlbGF0aW9uc2hpcGAgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGtleSB3aGVuCi0g
ICBzZXJpYWxpemluZyByZWxhdGlvbnNoaXAgcHJvcGVydGllcy4gQnkgZGVmYXVsdCBgSlNPTlNl
cmlhbGl6ZXJgCi0gICBkb2VzIG5vdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMg
bWV0aG9kLgotCi0gICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBvc3RT
ZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIGtleUZvclJlbGF0
aW9uc2hpcDogZnVuY3Rpb24oa2V5LCByZWxhdGlvbnNoaXApIHsKLSAgICAgICAgIHJldHVybiAn
cmVsXycgKyBFbWJlci5TdHJpbmcudW5kZXJzY29yZShrZXkpOwotICAgICAgfQotICAgIH0pOwot
ICAgIGBgYAotCi0gICBAbWV0aG9kIGtleUZvclJlbGF0aW9uc2hpcAotICAgQHBhcmFtIHtTdHJp
bmd9IGtleQotICAgQHBhcmFtIHtTdHJpbmd9IHJlbGF0aW9uc2hpcCB0eXBlCi0gICBAcmV0dXJu
IHtTdHJpbmd9IG5vcm1hbGl6ZWQga2V5Ci0gICovCi0KLSAgLy8gSEVMUEVSUwotCi0gIC8qKgot
ICAgQG1ldGhvZCB0cmFuc2Zvcm1Gb3IKLSAgIEBwcml2YXRlCi0gICBAcGFyYW0ge1N0cmluZ30g
YXR0cmlidXRlVHlwZQotICAgQHBhcmFtIHtCb29sZWFufSBza2lwQXNzZXJ0aW9uCi0gICBAcmV0
dXJuIHtEUy5UcmFuc2Zvcm19IHRyYW5zZm9ybQotICAqLwotICB0cmFuc2Zvcm1Gb3I6IGZ1bmN0
aW9uKGF0dHJpYnV0ZVR5cGUsIHNraXBBc3NlcnRpb24pIHsKLSAgICB2YXIgdHJhbnNmb3JtID0g
dGhpcy5jb250YWluZXIubG9va3VwKCd0cmFuc2Zvcm06JyArIGF0dHJpYnV0ZVR5cGUpOwotICAg
IEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgdHJhbnNmb3JtIGZvciAnIiArIGF0dHJpYnV0
ZVR5cGUgKyAiJyIsIHNraXBBc3NlcnRpb24gfHwgISF0cmFuc2Zvcm0pOwotICAgIHJldHVybiB0
cmFuc2Zvcm07Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0g
IEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLXZhciBnZXQgPSBFbWJlci5nZXQsIGNhcGl0YWxpemUg
PSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRl
cnNjb3JlLCBEUyA9IHdpbmRvdy5EUyA7Ci0KLS8qKgotICBFeHRlbmQgYEVtYmVyLkRhdGFBZGFw
dGVyYCB3aXRoIEVEIHNwZWNpZmljIGNvZGUuCi0KLSAgQGNsYXNzIERlYnVnQWRhcHRlcgotICBA
bmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLkRhdGFBZGFwdGVyCi0gIEBwcml2YXRlCi0q
LwotRFMuRGVidWdBZGFwdGVyID0gRW1iZXIuRGF0YUFkYXB0ZXIuZXh0ZW5kKHsKLSAgZ2V0Rmls
dGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFsKLSAgICAgIHsgbmFtZTogJ2lzTmV3Jywg
ZGVzYzogJ05ldycgfSwKLSAgICAgIHsgbmFtZTogJ2lzTW9kaWZpZWQnLCBkZXNjOiAnTW9kaWZp
ZWQnIH0sCi0gICAgICB7IG5hbWU6ICdpc0NsZWFuJywgZGVzYzogJ0NsZWFuJyB9Ci0gICAgXTsK
LSAgfSwKLQotICBkZXRlY3Q6IGZ1bmN0aW9uKGtsYXNzKSB7Ci0gICAgcmV0dXJuIGtsYXNzICE9
PSBEUy5Nb2RlbCAmJiBEUy5Nb2RlbC5kZXRlY3Qoa2xhc3MpOwotICB9LAotCi0gIGNvbHVtbnNG
b3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGNvbHVtbnMgPSBbeyBuYW1lOiAnaWQn
LCBkZXNjOiAnSWQnIH1dLCBjb3VudCA9IDAsIHNlbGYgPSB0aGlzOwotICAgIGdldCh0eXBlLCAn
YXR0cmlidXRlcycpLmZvckVhY2goZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgICBpZiAo
Y291bnQrKyA+IHNlbGYuYXR0cmlidXRlTGltaXQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAg
IHZhciBkZXNjID0gY2FwaXRhbGl6ZSh1bmRlcnNjb3JlKG5hbWUpLnJlcGxhY2UoJ18nLCAnICcp
KTsKLSAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogbmFtZSwgZGVzYzogZGVzYyB9KTsKLSAg
ICB9KTsKLSAgICByZXR1cm4gY29sdW1uczsKLSAgfSwKLQotICBnZXRSZWNvcmRzOiBmdW5jdGlv
bih0eXBlKSB7Ci0gICAgcmV0dXJuIHRoaXMuZ2V0KCdzdG9yZScpLmFsbCh0eXBlKTsKLSAgfSwK
LQotICBnZXRSZWNvcmRDb2x1bW5WYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciBz
ZWxmID0gdGhpcywgY291bnQgPSAwLAotICAgICAgICBjb2x1bW5WYWx1ZXMgPSB7IGlkOiBnZXQo
cmVjb3JkLCAnaWQnKSB9OwotCi0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5
KSB7Ci0gICAgICBpZiAoY291bnQrKyA+IHNlbGYuYXR0cmlidXRlTGltaXQpIHsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5
KTsKLSAgICAgIGNvbHVtblZhbHVlc1trZXldID0gdmFsdWU7Ci0gICAgfSk7Ci0gICAgcmV0dXJu
IGNvbHVtblZhbHVlczsKLSAgfSwKLQotICBnZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVj
b3JkKSB7Ci0gICAgdmFyIGtleXdvcmRzID0gW10sIGtleXMgPSBFbWJlci5BKFsnaWQnXSk7Ci0g
ICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBrZXlzLnB1c2go
a2V5KTsKLSAgICB9KTsKLSAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBr
ZXl3b3Jkcy5wdXNoKGdldChyZWNvcmQsIGtleSkpOwotICAgIH0pOwotICAgIHJldHVybiBrZXl3
b3JkczsKLSAgfSwKLQotICBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkg
ewotICAgIHJldHVybiB7Ci0gICAgICBpc05ldzogcmVjb3JkLmdldCgnaXNOZXcnKSwKLSAgICAg
IGlzTW9kaWZpZWQ6IHJlY29yZC5nZXQoJ2lzRGlydHknKSAmJiAhcmVjb3JkLmdldCgnaXNOZXcn
KSwKLSAgICAgIGlzQ2xlYW46ICFyZWNvcmQuZ2V0KCdpc0RpcnR5JykKLSAgICB9OwotICB9LAot
Ci0gIGdldFJlY29yZENvbG9yOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICB2YXIgY29sb3IgPSAn
YmxhY2snOwotICAgIGlmIChyZWNvcmQuZ2V0KCdpc05ldycpKSB7Ci0gICAgICBjb2xvciA9ICdn
cmVlbic7Ci0gICAgfSBlbHNlIGlmIChyZWNvcmQuZ2V0KCdpc0RpcnR5JykpIHsKLSAgICAgIGNv
bG9yID0gJ2JsdWUnOwotICAgIH0KLSAgICByZXR1cm4gY29sb3I7Ci0gIH0sCi0KLSAgb2JzZXJ2
ZVJlY29yZDogZnVuY3Rpb24ocmVjb3JkLCByZWNvcmRVcGRhdGVkKSB7Ci0gICAgdmFyIHJlbGVh
c2VNZXRob2RzID0gRW1iZXIuQSgpLCBzZWxmID0gdGhpcywKLSAgICAgICAga2V5c1RvT2JzZXJ2
ZSA9IEVtYmVyLkEoWydpZCcsICdpc05ldycsICdpc0RpcnR5J10pOwotCi0gICAgcmVjb3JkLmVh
Y2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBrZXlzVG9PYnNlcnZlLnB1c2goa2V5
KTsKLSAgICB9KTsKLQotICAgIGtleXNUb09ic2VydmUuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsK
LSAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJlY29yZFVwZGF0ZWQo
c2VsZi53cmFwUmVjb3JkKHJlY29yZCkpOwotICAgICAgfTsKLSAgICAgIEVtYmVyLmFkZE9ic2Vy
dmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsKLSAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5k
bGVyKTsKLSAgICAgIH0pOwotICAgIH0pOwotCi0gICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigp
IHsKLSAgICAgIHJlbGVhc2VNZXRob2RzLmZvckVhY2goZnVuY3Rpb24oZm4pIHsgZm4oKTsgfSAp
OwotICAgIH07Ci0KLSAgICByZXR1cm4gcmVsZWFzZTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotICBUaGUgYERTLlRyYW5zZm9ybWAgY2xhc3MgaXMgdXNl
ZCB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIG1vZGVsCi0gIGF0dHJpYnV0ZXMgd2hlbiB0
aGV5IGFyZSBzYXZlZCBvciBsb2FkZWQgZnJvbSBhbgotICBhZGFwdGVyLiBTdWJjbGFzc2luZyBg
RFMuVHJhbnNmb3JtYCBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGN1c3RvbQotICBhdHRyaWJ1dGVz
LiBBbGwgc3ViY2xhc3NlcyBvZiBgRFMuVHJhbnNmb3JtYCBtdXN0IGltcGxlbWVudCBhCi0gIGBz
ZXJpYWxpemVgIGFuZCBhIGBkZXNlcmlhbGl6ZWAgbWV0aG9kLgotCi0gIEV4YW1wbGUKLQotICBg
YGBqYXZhc2NyaXB0Ci0gIEFwcC5SYXdUcmFuc2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsK
LSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIHNl
cmlhbGl6ZWQ7Ci0gICAgfSwKLSAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkg
ewotICAgICAgcmV0dXJuIGRlc2VyaWFsaXplZDsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBV
c2FnZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuUmVx
dWlyZW1lbnQgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIG5hbWU6IGF0dHIoJ3N0cmluZycpLAot
ICAgIG9wdGlvbnNBcnJheTogYXR0cigncmF3JykKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBU
cmFuc2Zvcm0KLSAgQG5hbWVzcGFjZSBEUwotICovCi1EUy5UcmFuc2Zvcm0gPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKHsKLSAgLyoqCi0gICAgV2hlbiBnaXZlbiBhIGRlc2VyaWFsaXplZCB2YWx1ZSBm
cm9tIGEgcmVjb3JkIGF0dHJpYnV0ZSB0aGlzCi0gICAgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBz
ZXJpYWxpemVkIHZhbHVlLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxpemVkKSB7Ci0gICAgICByZXR1cm4gRW1iZXIu
aXNFbXB0eShkZXNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICAg
IH0KLSAgICBgYGAKLQotICAgIEBtZXRob2Qgc2VyaWFsaXplCi0gICAgQHBhcmFtIGRlc2VyaWFs
aXplZCBUaGUgZGVzZXJpYWxpemVkIHZhbHVlCi0gICAgQHJldHVybiBUaGUgc2VyaWFsaXplZCB2
YWx1ZQotICAqLwotICBzZXJpYWxpemU6IEVtYmVyLnJlcXVpcmVkKCksCi0KLSAgLyoqCi0gICAg
V2hlbiBnaXZlbiBhIHNlcmlhbGl6ZSB2YWx1ZSBmcm9tIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRo
b2QgbXVzdAotICAgIHJldHVybiB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGZvciB0aGUgcmVjb3Jk
IGF0dHJpYnV0ZS4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBkZXNl
cmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIGVtcHR5KHNlcmlh
bGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsKLSAgICB9Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIGRlc2VyaWFsaXplCi0gICAgQHBhcmFtIHNlcmlhbGl6ZWQgVGhlIHNlcmlhbGl6
ZWQgdmFsdWUKLSAgICBAcmV0dXJuIFRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUKLSAgKi8KLSAgZGVz
ZXJpYWxpemU6IEVtYmVyLnJlcXVpcmVkKCkKLQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0KLS8qKgotICBUaGUgYERTLkJvb2xlYW5UcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQg
dG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICBib29sZWFuIGF0dHJpYnV0ZXMgb24gRW1i
ZXIgRGF0YSByZWNvcmQgb2JqZWN0cy4gVGhpcyB0cmFuc2Zvcm0gaXMKLSAgdXNlZCB3aGVuIGBi
b29sZWFuYCBpcyBwYXNzZWQgYXMgdGhlIHR5cGUgcGFyYW1ldGVyIHRvIHRoZQotICBbRFMuYXR0
cl0oLi4vLi4vZGF0YSNtZXRob2RfYXR0cikgZnVuY3Rpb24uCi0KLSAgVXNhZ2UKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBhdHRyID0gRFMuYXR0cjsKLSAgQXBwLlVzZXIgPSBEUy5Nb2RlbC5l
eHRlbmQoewotICAgIGlzQWRtaW46IGF0dHIoJ2Jvb2xlYW4nKSwKLSAgICBuYW1lOiBhdHRyKCdz
dHJpbmcnKSwKLSAgICBlbWFpbDogYXR0cignc3RyaW5nJykKLSAgfSk7Ci0gIGBgYAotCi0gIEBj
bGFzcyBCb29sZWFuVHJhbnNmb3JtCi0gIEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNw
YWNlIERTCi0gKi8KLURTLkJvb2xlYW5UcmFuc2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsK
LSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKLSAgICB2YXIgdHlwZSA9IHR5
cGVvZiBzZXJpYWxpemVkOwotCi0gICAgaWYgKHR5cGUgPT09ICJib29sZWFuIikgewotICAgICAg
cmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09PSAic3RyaW5nIikgewot
ICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQubWF0Y2goL150cnVlJHxedCR8XjEkL2kpICE9PSBudWxs
OwotICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gIm51bWJlciIpIHsKLSAgICAgIHJldHVybiBzZXJp
YWxpemVkID09PSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICB9LAotCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJu
IEJvb2xlYW4oZGVzZXJpYWxpemVkKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgVGhlIGBEUy5EYXRlVHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNl
cmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKLSAgZGF0ZSBhdHRyaWJ1dGVzIG9uIEVtYmVyIERhdGEg
cmVjb3JkIG9iamVjdHMuIFRoaXMgdHJhbnNmb3JtIGlzIHVzZWQKLSAgd2hlbiBgZGF0ZWAgaXMg
cGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKLSAgW0RTLmF0dHJdKC4uLy4uL2Rh
dGEjbWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGF0dHIg
PSBEUy5hdHRyOwotICBBcHAuU2NvcmUgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHZhbHVlOiBh
dHRyKCdudW1iZXInKSwKLSAgICBwbGF5ZXI6IERTLmJlbG9uZ3NUbygncGxheWVyJyksCi0gICAg
ZGF0ZTogYXR0cignZGF0ZScpCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgRGF0ZVRyYW5zZm9y
bQotICBAZXh0ZW5kcyBEUy5UcmFuc2Zvcm0KLSAgQG5hbWVzcGFjZSBEUwotICovCi1EUy5EYXRl
VHJhbnNmb3JtID0gRFMuVHJhbnNmb3JtLmV4dGVuZCh7Ci0KLSAgZGVzZXJpYWxpemU6IGZ1bmN0
aW9uKHNlcmlhbGl6ZWQpIHsKLSAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwotCi0g
ICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKSB7Ci0gICAgICByZXR1cm4gbmV3IERhdGUoRW1iZXIu
RGF0ZS5wYXJzZShzZXJpYWxpemVkKSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09PSAibnVtYmVy
IikgewotICAgICAgcmV0dXJuIG5ldyBEYXRlKHNlcmlhbGl6ZWQpOwotICAgIH0gZWxzZSBpZiAo
c2VyaWFsaXplZCA9PT0gbnVsbCB8fCBzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHsKLSAgICAg
IC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGF0YSwKLSAgICAgIC8vIHJl
dHVybiB1bmRlZmluZWQsIG5vdCBudWxsLgotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfSwKLQotICBzZXJpYWxpemU6
IGZ1bmN0aW9uKGRhdGUpIHsKLSAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAg
IC8vIFNlcmlhbGl6ZSBpdCBhcyBhIG51bWJlciB0byBtYWludGFpbiBtaWxsaXNlY29uZCBwcmVj
aXNpb24KLSAgICAgIHJldHVybiBOdW1iZXIoZGF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJl
dHVybiBudWxsOwotICAgIH0KLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBlbXB0eSA9IEVtYmVyLmlzRW1wdHk7Ci0vKioKLSAgVGhlIGBEUy5OdW1iZXJUcmFu
c2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICBudW1l
cmljIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0YSByZWNvcmQgb2JqZWN0cy4gVGhpcyB0cmFuc2Zv
cm0gaXMKLSAgdXNlZCB3aGVuIGBudW1iZXJgIGlzIHBhc3NlZCBhcyB0aGUgdHlwZSBwYXJhbWV0
ZXIgdG8gdGhlCi0gIFtEUy5hdHRyXSguLi8uLi9kYXRhI21ldGhvZF9hdHRyKSBmdW5jdGlvbi4K
LQotICBVc2FnZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBB
cHAuU2NvcmUgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwK
LSAgICBwbGF5ZXI6IERTLmJlbG9uZ3NUbygncGxheWVyJyksCi0gICAgZGF0ZTogYXR0cignZGF0
ZScpCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgTnVtYmVyVHJhbnNmb3JtCi0gIEBleHRlbmRz
IERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNlIERTCi0gKi8KLURTLk51bWJlclRyYW5zZm9ybSA9
IERTLlRyYW5zZm9ybS5leHRlbmQoewotCi0gIGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJpYWxp
emVkKSB7Ci0gICAgcmV0dXJuIGVtcHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJp
YWxpemVkKTsKLSAgfSwKLQotICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgewot
ICAgIHJldHVybiBlbXB0eShkZXNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6
ZWQpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBub25lID0g
RW1iZXIuaXNOb25lOwotCi0vKioKLSAgVGhlIGBEUy5TdHJpbmdUcmFuc2Zvcm1gIGNsYXNzIGlz
IHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICBzdHJpbmcgYXR0cmlidXRlcyBv
biBFbWJlciBEYXRhIHJlY29yZCBvYmplY3RzLiBUaGlzIHRyYW5zZm9ybSBpcwotICB1c2VkIHdo
ZW4gYHN0cmluZ2AgaXMgcGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKLSAgW0RT
LmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgotCi0gIFVzYWdlCi0KLSAg
YGBgamF2YXNjcmlwdAotICB2YXIgYXR0ciA9IERTLmF0dHI7Ci0gIEFwcC5Vc2VyID0gRFMuTW9k
ZWwuZXh0ZW5kKHsKLSAgICBpc0FkbWluOiBhdHRyKCdib29sZWFuJyksCi0gICAgbmFtZTogYXR0
cignc3RyaW5nJyksCi0gICAgZW1haWw6IGF0dHIoJ3N0cmluZycpCi0gIH0pOwotICBgYGAKLQot
ICBAY2xhc3MgU3RyaW5nVHJhbnNmb3JtCi0gIEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFt
ZXNwYWNlIERTCi0gKi8KLURTLlN0cmluZ1RyYW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQo
ewotCi0gIGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIG5v
bmUoc2VyaWFsaXplZCkgPyBudWxsIDogU3RyaW5nKHNlcmlhbGl6ZWQpOwotICB9LAotCi0gIHNl
cmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIG5vbmUoZGVzZXJp
YWxpemVkKSA/IG51bGwgOiBTdHJpbmcoZGVzZXJpYWxpemVkKTsKLSAgfQotCi19KTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLXZhciBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8q
Ci0gIFRoaXMgY29kZSByZWdpc3RlcnMgYW4gaW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlv
bi4KLQotICBJZiBhbiBFbWJlci5qcyBkZXZlbG9wZXIgZGVmaW5lcyBhIHN1YmNsYXNzIG9mIERT
LlN0b3JlIG9uIHRoZWlyIGFwcGxpY2F0aW9uLAotICB0aGlzIGNvZGUgd2lsbCBhdXRvbWF0aWNh
bGx5IGluc3RhbnRpYXRlIGl0IGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBvbiB0aGUKLSAgcm91dGVy
LgotCi0gIEFkZGl0aW9uYWxseSwgYWZ0ZXIgYW4gYXBwbGljYXRpb24ncyBjb250cm9sbGVycyBo
YXZlIGJlZW4gaW5qZWN0ZWQsIHRoZXkgd2lsbAotICBlYWNoIGhhdmUgdGhlIHN0b3JlIG1hZGUg
YXZhaWxhYmxlIHRvIHRoZW0uCi0KLSAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMg
YXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0KLSAgQXBwLlN0b3JlID0g
RFMuU3RvcmUuZXh0ZW5kKHsKLSAgICBhZGFwdGVyOiAnY3VzdG9tJwotICB9KTsKLQotICBBcHAu
UG9zdHNDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgLy8g
Li4uCi0gIH0pOwotCi0gIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLCBgQXBw
LlN0b3JlYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKLSAgaW5zdGFudGlhdGVkLCBhbmQgdGhlIGlu
c3RhbmNlIG9mIGBBcHAuUG9zdHNDb250cm9sbGVyYCB3aWxsIGhhdmUgaXRzIGBzdG9yZWAKLSAg
cHJvcGVydHkgc2V0IHRvIHRoYXQgaW5zdGFuY2UuCi0KLSAgTm90ZSB0aGF0IHRoaXMgY29kZSB3
aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBgZW1iZXItYXBwbGljYXRpb25gIHBhY2thZ2UgaXMKLSAg
bG9hZGVkLiBJZiBFbWJlciBEYXRhIGlzIGJlaW5nIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgb3Ro
ZXIgdGhhbiBhCi0gIHR5cGljYWwgYXBwbGljYXRpb24gKGUuZy4sIG5vZGUuanMgd2hlcmUgb25s
eSBgZW1iZXItcnVudGltZWAgaXMgYXZhaWxhYmxlKSwKLSAgdGhpcyBjb2RlIHdpbGwgYmUgaWdu
b3JlZC4KLSovCi0KLUVtYmVyLm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihB
cHBsaWNhdGlvbikgewotICBBcHBsaWNhdGlvbi5pbml0aWFsaXplcih7Ci0gICAgbmFtZTogInN0
b3JlIiwKLQotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24p
IHsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRpb24u
U3RvcmUgfHwgRFMuU3RvcmUpOwotCi0gICAgICAvLyBhbGxvdyBvbGRlciBuYW1lcyB0byBiZSBs
b29rZWQgdXAKLQotICAgICAgdmFyIHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRh
aW5lcik7Ci0gICAgICBwcm94eS5yZWdpc3RlckRlcHJlY2F0aW9ucyhbCi0gICAgICAgIHtkZXBy
ZWNhdGVkOiAnc2VyaWFsaXplcjpfZGVmYXVsdCcsICB2YWxpZDogJ3NlcmlhbGl6ZXI6LWRlZmF1
bHQnfSwKLSAgICAgICAge2RlcHJlY2F0ZWQ6ICdzZXJpYWxpemVyOl9yZXN0JywgICAgIHZhbGlk
OiAnc2VyaWFsaXplcjotcmVzdCd9LAotICAgICAgICB7ZGVwcmVjYXRlZDogJ2FkYXB0ZXI6X3Jl
c3QnLCAgICAgICAgdmFsaWQ6ICdhZGFwdGVyOi1yZXN0J30KLSAgICAgIF0pOwotCi0gICAgICAv
LyBuZXcgZ28gZm9yd2FyZCBwYXRocwotICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3Nlcmlh
bGl6ZXI6LWRlZmF1bHQnLCBEUy5KU09OU2VyaWFsaXplcik7Ci0gICAgICBhcHBsaWNhdGlvbi5y
ZWdpc3Rlcignc2VyaWFsaXplcjotcmVzdCcsIERTLlJFU1RTZXJpYWxpemVyKTsKLSAgICAgIGFw
cGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1yZXN0JywgRFMuUkVTVEFkYXB0ZXIpOwotCi0g
ICAgICAvLyBFYWdlcmx5IGdlbmVyYXRlIHRoZSBzdG9yZSBzbyBkZWZhdWx0U3RvcmUgaXMgcG9w
dWxhdGVkLgotICAgICAgLy8gVE9ETzogRG8gdGhpcyBpbiBhIGZpbmlzaGVyIGhvb2sKLSAgICAg
IGNvbnRhaW5lci5sb29rdXAoJ3N0b3JlOm1haW4nKTsKLSAgICB9Ci0gIH0pOwotCi0gIEFwcGxp
Y2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAidHJhbnNmb3JtcyIsCi0gICAgYmVmb3Jl
OiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNh
dGlvbikgewotICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3RyYW5zZm9ybTpib29sZWFuJywg
RFMuQm9vbGVhblRyYW5zZm9ybSk7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcigndHJhbnNm
b3JtOmRhdGUnLCBEUy5EYXRlVHJhbnNmb3JtKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVy
KCd0cmFuc2Zvcm06bnVtYmVyJywgRFMuTnVtYmVyVHJhbnNmb3JtKTsKLSAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06c3RyaW5nJywgRFMuU3RyaW5nVHJhbnNmb3JtKTsKLSAg
ICB9Ci0gIH0pOwotCi0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAiZGF0
YS1hZGFwdGVyIiwKLSAgICBiZWZvcmU6ICJzdG9yZSIsCi0KLSAgICBpbml0aWFsaXplOiBmdW5j
dGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9uKSB7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rl
cignZGF0YS1hZGFwdGVyOm1haW4nLCBEUy5EZWJ1Z0FkYXB0ZXIpOwotICAgIH0KLSAgfSk7Ci0K
LSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJpbmplY3RTdG9yZSIsCi0g
ICAgYmVmb3JlOiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVy
LCBhcHBsaWNhdGlvbikgewotICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdjb250cm9sbGVyJywg
J3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91dGUn
LCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwotICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdzZXJp
YWxpemVyJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAgICAgIGFwcGxpY2F0aW9uLmluamVj
dCgnZGF0YS1hZGFwdGVyJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAgICB9Ci0gIH0pOwot
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVy
LWRhdGEKLSovCi0KLS8qKgotICBEYXRlLnBhcnNlIHdpdGggcHJvZ3Jlc3NpdmUgZW5oYW5jZW1l
bnQgZm9yIElTTyA4NjAxIDxodHRwczovL2dpdGh1Yi5jb20vY3Nub3Zlci9qcy1pc284NjAxPgot
Ci0gIMKpIDIwMTEgQ29saW4gU25vdmVyIDxodHRwOi8vemV0YWZsZWV0LmNvbT4KLQotICBSZWxl
YXNlZCB1bmRlciBNSVQgbGljZW5zZS4KLQotICBAY2xhc3MgRGF0ZQotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBzdGF0aWMKLSovCi1FbWJlci5EYXRlID0gRW1iZXIuRGF0ZSB8fCB7fTsKLQotdmFy
IG9yaWdQYXJzZSA9IERhdGUucGFyc2UsIG51bWVyaWNLZXlzID0gWyAxLCA0LCA1LCA2LCA3LCAx
MCwgMTEgXTsKLQotLyoqCi0gIEBtZXRob2QgcGFyc2UKLSAgQHBhcmFtIGRhdGUKLSovCi1FbWJl
ci5EYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRhdGUpIHsKLSAgICB2YXIgdGltZXN0YW1wLCBzdHJ1
Y3QsIG1pbnV0ZXNPZmZzZXQgPSAwOwotCi0gICAgLy8gRVM1IMKnMTUuOS40LjIgc3RhdGVzIHRo
YXQgdGhlIHN0cmluZyBzaG91bGQgYXR0ZW1wdCB0byBiZSBwYXJzZWQgYXMgYSBEYXRlIFRpbWUg
U3RyaW5nIEZvcm1hdCBzdHJpbmcKLSAgICAvLyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGFueSBp
bXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRlIHBhcnNpbmcsIHNvIHRoYXTigJlzIHdoYXQgd2Ug
ZG8sIGV2ZW4gaWYgbmF0aXZlCi0gICAgLy8gaW1wbGVtZW50YXRpb25zIGNvdWxkIGJlIGZhc3Rl
cgotICAgIC8vICAgICAgICAgICAgICAxIFlZWVkgICAgICAgICAgICAgICAgMiBNTSAgICAgICAz
IEREICAgICAgICAgICA0IEhIICAgIDUgbW0gICAgICAgNiBzcyAgICAgICAgNyBtc2VjICAgICAg
ICA4IFogOSDCsSAgICAxMCB0ekhIICAgIDExIHR6bW0KLSAgICBpZiAoKHN0cnVjdCA9IC9eKFxk
ezR9fFsrXC1dXGR7Nn0pKD86LShcZHsyfSkoPzotKFxkezJ9KSk/KT8oPzpUKFxkezJ9KTooXGR7
Mn0pKD86OihcZHsyfSkoPzpcLihcZHszfSkpPyk/KD86KFopfChbK1wtXSkoXGR7Mn0pKD86Oihc
ZHsyfSkpPyk/KT8kLy5leGVjKGRhdGUpKSkgewotICAgICAgICAvLyBhdm9pZCBOYU4gdGltZXN0
YW1wcyBjYXVzZWQgYnkg4oCcdW5kZWZpbmVk4oCdIHZhbHVlcyBiZWluZyBwYXNzZWQgdG8gRGF0
ZS5VVEMKLSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGs7IChrID0gbnVtZXJpY0tleXNbaV0pOyAr
K2kpIHsKLSAgICAgICAgICAgIHN0cnVjdFtrXSA9ICtzdHJ1Y3Rba10gfHwgMDsKLSAgICAgICAg
fQotCi0gICAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBkYXlzIGFuZCBtb250aHMKLSAgICAgICAg
c3RydWN0WzJdID0gKCtzdHJ1Y3RbMl0gfHwgMSkgLSAxOwotICAgICAgICBzdHJ1Y3RbM10gPSAr
c3RydWN0WzNdIHx8IDE7Ci0KLSAgICAgICAgaWYgKHN0cnVjdFs4XSAhPT0gJ1onICYmIHN0cnVj
dFs5XSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICBtaW51dGVzT2Zmc2V0ID0gc3RydWN0
WzEwXSAqIDYwICsgc3RydWN0WzExXTsKLQotICAgICAgICAgICAgaWYgKHN0cnVjdFs5XSA9PT0g
JysnKSB7Ci0gICAgICAgICAgICAgICAgbWludXRlc09mZnNldCA9IDAgLSBtaW51dGVzT2Zmc2V0
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5V
VEMoc3RydWN0WzFdLCBzdHJ1Y3RbMl0sIHN0cnVjdFszXSwgc3RydWN0WzRdLCBzdHJ1Y3RbNV0g
KyBtaW51dGVzT2Zmc2V0LCBzdHJ1Y3RbNl0sIHN0cnVjdFs3XSk7Ci0gICAgfQotICAgIGVsc2Ug
ewotICAgICAgICB0aW1lc3RhbXAgPSBvcmlnUGFyc2UgPyBvcmlnUGFyc2UoZGF0ZSkgOiBOYU47
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRpbWVzdGFtcDsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRf
UFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5EYXRlKSB7Ci0g
IERhdGUucGFyc2UgPSBFbWJlci5EYXRlLnBhcnNlOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1i
ZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0v
KioKLSAgQSByZWNvcmQgYXJyYXkgaXMgYW4gYXJyYXkgdGhhdCBjb250YWlucyByZWNvcmRzIG9m
IGEgY2VydGFpbiB0eXBlLiBUaGUgcmVjb3JkCi0gIGFycmF5IG1hdGVyaWFsaXplcyByZWNvcmRz
IGFzIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHJldHJpZXZlZCBmb3IgdGhlIGZpcnN0Ci0gIHRpbWUu
IFlvdSBzaG91bGQgbm90IGNyZWF0ZSByZWNvcmQgYXJyYXlzIHlvdXJzZWxmLiBJbnN0ZWFkLCBh
biBpbnN0YW5jZSBvZgotICBgRFMuUmVjb3JkQXJyYXlgIG9yIGl0cyBzdWJjbGFzc2VzIHdpbGwg
YmUgcmV0dXJuZWQgYnkgeW91ciBhcHBsaWNhdGlvbidzIHN0b3JlCi0gIGluIHJlc3BvbnNlIHRv
IHF1ZXJpZXMuCi0KLSAgQGNsYXNzIFJlY29yZEFycmF5Ci0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4
dGVuZHMgRW1iZXIuQXJyYXlQcm94eQotICBAdXNlcyBFbWJlci5FdmVudGVkCi0qLwotCi1EUy5S
ZWNvcmRBcnJheSA9IEVtYmVyLkFycmF5UHJveHkuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLSAg
LyoqCi0gICAgVGhlIG1vZGVsIHR5cGUgY29udGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5Lgot
Ci0gICAgQHByb3BlcnR5IHR5cGUKLSAgICBAdHlwZSBEUy5Nb2RlbAotICAqLwotICB0eXBlOiBu
dWxsLAotCi0gIC8qKgotICAgIFRoZSBhcnJheSBvZiBjbGllbnQgaWRzIGJhY2tpbmcgdGhlIHJl
Y29yZCBhcnJheS4gV2hlbiBhCi0gICAgcmVjb3JkIGlzIHJlcXVlc3RlZCBmcm9tIHRoZSByZWNv
cmQgYXJyYXksIHRoZSByZWNvcmQKLSAgICBmb3IgdGhlIGNsaWVudCBpZCBhdCB0aGUgc2FtZSBp
bmRleCBpcyBtYXRlcmlhbGl6ZWQsIGlmCi0gICAgbmVjZXNzYXJ5LCBieSB0aGUgc3RvcmUuCi0K
LSAgICBAcHJvcGVydHkgY29udGVudAotICAgIEBwcml2YXRlCi0gICAgQHR5cGUgRW1iZXIuQXJy
YXkKLSAgKi8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioKLSAgICBUaGUgZmxhZyB0byBzaWdu
YWwgYSBgUmVjb3JkQXJyYXlgIGlzIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEuCi0KLSAgICBFeGFt
cGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHBlb3BsZSA9IHN0b3JlLmFsbChBcHAu
UGVyc29uKTsKLSAgICBwZW9wbGUuZ2V0KCdpc0xvYWRlZCcpOyAvLyB0cnVlCi0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgaXNMb2FkZWQKLSAgICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGlzTG9h
ZGVkOiBmYWxzZSwKLSAgLyoqCi0gICAgVGhlIGZsYWcgdG8gc2lnbmFsIGEgYFJlY29yZEFycmF5
YCBpcyBjdXJyZW50bHkgbG9hZGluZyBkYXRhLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciBwZW9wbGUgPSBzdG9yZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVv
cGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBmYWxzZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAg
ICBwZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBwcm9w
ZXJ0eSBpc1VwZGF0aW5nCi0gICAgQHR5cGUgQm9vbGVhbgotICAqLwotICBpc1VwZGF0aW5nOiBm
YWxzZSwKLQotICAvKioKLSAgICBUaGUgc3RvcmUgdGhhdCBjcmVhdGVkIHRoaXMgcmVjb3JkIGFy
cmF5LgotCi0gICAgQHByb3BlcnR5IHN0b3JlCi0gICAgQHByaXZhdGUKLSAgICBAdHlwZSBEUy5T
dG9yZQotICAqLwotICBzdG9yZTogbnVsbCwKLQotICAvKioKLSAgICBSZXRyaWV2ZXMgYW4gb2Jq
ZWN0IGZyb20gdGhlIGNvbnRlbnQgYnkgaW5kZXguCi0KLSAgICBAbWV0aG9kIG9iamVjdEF0Q29u
dGVudAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtOdW1iZXJ9IGluZGV4Ci0gICAgQHJldHVy
biB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlu
ZGV4KSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLQotICAgIHJl
dHVybiBjb250ZW50Lm9iamVjdEF0KGluZGV4KTsKLSAgfSwKLQotICAvKioKLSAgICBVc2VkIHRv
IGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYWxsIG9mIHRoZSByZWNvcmRzIGluIHRoaXMgYXJy
YXkKLSAgICBmcm9tIHRoZSBhZGFwdGVyLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIHZhciBwZW9wbGUgPSBzdG9yZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVvcGxl
LmdldCgnaXNVcGRhdGluZycpOyAvLyBmYWxzZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAgICBw
ZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
dXBkYXRlCi0gICovCi0gIHVwZGF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAn
aXNVcGRhdGluZycpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdz
dG9yZScpLAotICAgICAgICB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJyk7Ci0KLSAgICByZXR1cm4g
c3RvcmUuZmV0Y2hBbGwodHlwZSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBhIHJl
Y29yZCB0byB0aGUgYFJlY29yZEFycmF5YC4KLQotICAgIEBtZXRob2QgYWRkUmVjb3JkCi0gICAg
QHByaXZhdGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgYWRkUmVjb3Jk
OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3Qo
cmVjb3JkKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGEgcmVjb3JkIHRvIHRoZSBgUmVj
b3JkQXJyYXlgLgotCi0gICAgQG1ldGhvZCByZW1vdmVSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICByZW1vdmVSZWNvcmQ6IGZ1bmN0aW9u
KHJlY29yZCkgewotICAgIGdldCh0aGlzLCAnY29udGVudCcpLnJlbW92ZU9iamVjdChyZWNvcmQp
OwotICB9LAotCi0gIC8qKgotICAgIFNhdmVzIGFsbCBvZiB0aGUgcmVjb3JkcyBpbiB0aGUgYFJl
Y29yZEFycmF5YC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIg
bWVzc2FnZXMgPSBzdG9yZS5hbGwoQXBwLk1lc3NhZ2UpOwotICAgIG1lc3NhZ2VzLmZvckVhY2go
ZnVuY3Rpb24obWVzc2FnZSkgewotICAgICAgbWVzc2FnZS5zZXQoJ2hhc0JlZW5TZWVuJywgdHJ1
ZSk7Ci0gICAgfSk7Ci0gICAgbWVzc2FnZXMuc2F2ZSgpOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBzYXZlCi0gICAgQHJldHVybiB7RFMuUHJvbWlzZUFycmF5fSBwcm9taXNlCi0gICovCi0gIHNh
dmU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwcm9taXNlTGFiZWwgPSAiRFM6IFJlY29yZEFycmF5
I3NhdmUgIiArIGdldCh0aGlzLCAndHlwZScpOwotICAgIHZhciBwcm9taXNlID0gRW1iZXIuUlNW
UC5hbGwodGhpcy5pbnZva2UoInNhdmUiKSwgcHJvbWlzZUxhYmVsKS50aGVuKGZ1bmN0aW9uKGFy
cmF5KSB7Ci0gICAgICByZXR1cm4gRW1iZXIuQShhcnJheSk7Ci0gICAgfSwgbnVsbCwgIkRTOiBS
ZWNvcmRBcnJheSNzYXZlIGFwcGx5IEVtYmVyLk5hdGl2ZUFycmF5Iik7Ci0KLSAgICByZXR1cm4g
RFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2UgfSk7Ci0gIH0KLX0pOwot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQot
Ki8KLQotdmFyIGdldCA9IEVtYmVyLmdldDsKLQotLyoqCi0gIFJlcHJlc2VudHMgYSBsaXN0IG9m
IHJlY29yZHMgd2hvc2UgbWVtYmVyc2hpcCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotICBzdG9yZS4g
QXMgcmVjb3JkcyBhcmUgY3JlYXRlZCwgbG9hZGVkLCBvciBtb2RpZmllZCwgdGhlIHN0b3JlCi0g
IGV2YWx1YXRlcyB0aGVtIHRvIGRldGVybWluZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRo
ZSByZWNvcmQKLSAgYXJyYXkuCi0KLSAgQGNsYXNzIEZpbHRlcmVkUmVjb3JkQXJyYXkKLSAgQG5h
bWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5SZWNvcmRBcnJheQotKi8KLURTLkZpbHRlcmVkUmVj
b3JkQXJyYXkgPSBEUy5SZWNvcmRBcnJheS5leHRlbmQoewotICAvKioKLSAgICBUaGUgZmlsdGVy
RnVuY3Rpb24gaXMgYSBmdW5jdGlvbiB1c2VkIHRvIHRlc3QgcmVjb3JkcyBmcm9tIHRoZSBzdG9y
ZSB0bwotICAgIGRldGVybWluZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQg
YXJyYXkuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFsbFBl
b3BsZSA9IHN0b3JlLmFsbCgncGVyc29uJyk7Ci0gICAgYWxsUGVvcGxlLm1hcEJ5KCduYW1lJyk7
IC8vIFsiVG9tIERhbGUiLCAiWWVodWRhIEthdHoiLCAiVHJlayBHbG93YWNraSJdCi0KLSAgICB2
YXIgcGVvcGxlID0gc3RvcmUuZmlsdGVyKCdwZXJzb24nLCBmdW5jdGlvbihwZXJzb24pIHsKLSAg
ICAgIGlmIChwZXJzb24uZ2V0KCduYW1lJykubWF0Y2goL0thdHokLykpIHsgcmV0dXJuIHRydWU7
IH0KLSAgICB9KTsKLSAgICBwZW9wbGUubWFwQnkoJ25hbWUnKTsgLy8gWyJZZWh1ZGEgS2F0eiJd
Ci0KLSAgICB2YXIgbm90S2F0ekZpbHRlciA9IGZ1bmN0aW9uKHBlcnNvbikgewotICAgICAgcmV0
dXJuICFwZXJzb24uZ2V0KCduYW1lJykubWF0Y2goL0thdHokLyk7Ci0gICAgfTsKLSAgICBwZW9w
bGUuc2V0KCdmaWx0ZXJGdW5jdGlvbicsIG5vdEthdHpGaWx0ZXIpOwotICAgIHBlb3BsZS5tYXBC
eSgnbmFtZScpOyAvLyBbIlRvbSBEYWxlIiwgIlRyZWsgR2xvd2Fja2kiXQotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCBmaWx0ZXJGdW5jdGlvbgotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAot
ICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbiB0
aGUgYXJyYXkKLSAgKi8KLSAgZmlsdGVyRnVuY3Rpb246IG51bGwsCi0gIGlzTG9hZGVkOiB0cnVl
LAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0eXBlID0gZ2V0KHRoaXMsICd0
eXBlJykudG9TdHJpbmcoKTsKLSAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSByZXN1bHQgb2YgYSBj
bGllbnQtc2lkZSBmaWx0ZXIgKG9uICIgKyB0eXBlICsgIikgaXMgaW1tdXRhYmxlLiIpOwotICB9
LAotCi0gIC8qKgotICAgIEBtZXRob2QgdXBkYXRlRmlsdGVyCi0gICAgQHByaXZhdGUKLSAgKi8K
LSAgdXBkYXRlRmlsdGVyOiBFbWJlci5vYnNlcnZlcihmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFu
YWdlciA9IGdldCh0aGlzLCAnbWFuYWdlcicpOwotICAgIG1hbmFnZXIudXBkYXRlRmlsdGVyKHRo
aXMsIGdldCh0aGlzLCAndHlwZScpLCBnZXQodGhpcywgJ2ZpbHRlckZ1bmN0aW9uJykpOwotICB9
LCAnZmlsdGVyRnVuY3Rpb24nKQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0v
KioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQ7Ci0KLS8qKgotICBSZXByZXNlbnRzIGFuIG9yZGVyZWQgbGlzdCBvZiByZWNv
cmRzIHdob3NlIG9yZGVyIGFuZCBtZW1iZXJzaGlwIGlzCi0gIGRldGVybWluZWQgYnkgdGhlIGFk
YXB0ZXIuIEZvciBleGFtcGxlLCBhIHF1ZXJ5IHNlbnQgdG8gdGhlIGFkYXB0ZXIKLSAgbWF5IHRy
aWdnZXIgYSBzZWFyY2ggb24gdGhlIHNlcnZlciwgd2hvc2UgcmVzdWx0cyB3b3VsZCBiZSBsb2Fk
ZWQKLSAgaW50byBhbiBpbnN0YW5jZSBvZiB0aGUgYEFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJh
eWAuCi0KLSAgQGNsYXNzIEFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQotICBAbmFtZXNwYWNl
IERTCi0gIEBleHRlbmRzIERTLlJlY29yZEFycmF5Ci0qLwotRFMuQWRhcHRlclBvcHVsYXRlZFJl
Y29yZEFycmF5ID0gRFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKLSAgcXVlcnk6IG51bGwsCi0KLSAg
cmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50
b1N0cmluZygpOwotICAgIHRocm93IG5ldyBFcnJvcigiVGhlIHJlc3VsdCBvZiBhIHNlcnZlciBx
dWVyeSAob24gIiArIHR5cGUgKyAiKSBpcyBpbW11dGFibGUuIik7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgQG1ldGhvZCBsb2FkCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0FycmF5fSBkYXRhCi0g
ICovCi0gIGxvYWQ6IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywg
J3N0b3JlJyksCi0gICAgICAgIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKSwKLSAgICAgICAgcmVj
b3JkcyA9IHN0b3JlLnB1c2hNYW55KHR5cGUsIGRhdGEpLAotICAgICAgICBtZXRhID0gc3RvcmUu
bWV0YWRhdGFGb3IodHlwZSk7Ci0KLSAgICB0aGlzLnNldFByb3BlcnRpZXMoewotICAgICAgY29u
dGVudDogRW1iZXIuQShyZWNvcmRzKSwKLSAgICAgIGlzTG9hZGVkOiB0cnVlLAotICAgICAgbWV0
YTogbWV0YQotICAgIH0pOwotCi0gICAgLy8gVE9ETzogZG9lcyB0cmlnZ2VyaW5nIGRpZExvYWQg
ZXZlbnQgc2hvdWxkIGJlIHRoZSBsYXN0IGFjdGlvbiBvZiB0aGUgcnVuTG9vcD8KLSAgICBFbWJl
ci5ydW4ub25jZSh0aGlzLCAndHJpZ2dlcicsICdkaWRMb2FkJyk7Ci0gIH0KLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIG1hcCA9IEVtYmVyLkVu
dW1lcmFibGVVdGlscy5tYXA7Ci0KLS8qKgotICBBIGBNYW55QXJyYXlgIGlzIGEgYFJlY29yZEFy
cmF5YCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIGEgaGFzLW1hbnkKLSAgcmVsYXRp
b25zaGlwLgotCi0gIFRoZSBgTWFueUFycmF5YCBpcyBpbnN0YW50aWF0ZWQgbGF6aWx5IHRoZSBm
aXJzdCB0aW1lIHRoZSByZWxhdGlvbnNoaXAgaXMKLSAgcmVxdWVzdGVkLgotCi0gICMjIyBJbnZl
cnNlcwotCi0gIE9mdGVuLCB0aGUgcmVsYXRpb25zaGlwcyBpbiBFbWJlciBEYXRhIGFwcGxpY2F0
aW9ucyB3aWxsIGhhdmUKLSAgYW4gaW52ZXJzZS4gRm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZv
bGxvd2luZyBtb2RlbHMgYXJlCi0gIGRlZmluZWQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
UG9zdCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgY29tbWVudHM6IERTLmhhc01hbnkoJ2NvbW1l
bnQnKQotICB9KTsKLQotICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgcG9z
dDogRFMuYmVsb25nc1RvKCdwb3N0JykKLSAgfSk7Ci0gIGBgYAotCi0gIElmIHlvdSBjcmVhdGVk
IGEgbmV3IGluc3RhbmNlIG9mIGBBcHAuUG9zdGAgYW5kIGFkZGVkCi0gIGEgYEFwcC5Db21tZW50
YCByZWNvcmQgdG8gaXRzIGBjb21tZW50c2AgaGFzLW1hbnkKLSAgcmVsYXRpb25zaGlwLCB5b3Ug
d291bGQgZXhwZWN0IHRoZSBjb21tZW50J3MgYHBvc3RgCi0gIHByb3BlcnR5IHRvIGJlIHNldCB0
byB0aGUgcG9zdCB0aGF0IGNvbnRhaW5lZAotICB0aGUgaGFzLW1hbnkuCi0KLSAgV2UgY2FsbCB0
aGUgcmVjb3JkIHRvIHdoaWNoIGEgcmVsYXRpb25zaGlwIGJlbG9uZ3MgdGhlCi0gIHJlbGF0aW9u
c2hpcCdzIF9vd25lcl8uCi0KLSAgQGNsYXNzIE1hbnlBcnJheQotICBAbmFtZXNwYWNlIERTCi0g
IEBleHRlbmRzIERTLlJlY29yZEFycmF5Ci0qLwotRFMuTWFueUFycmF5ID0gRFMuUmVjb3JkQXJy
YXkuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jID0gRW1iZXIuT3JkZXJl
ZFNldC5jcmVhdGUoKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGUgcHJvcGVydHkgbmFtZSBvZiB0
aGUgcmVsYXRpb25zaGlwCi0KLSAgICBAcHJvcGVydHkge1N0cmluZ30gbmFtZQotICAgIEBwcml2
YXRlCi0gICovCi0gIG5hbWU6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIHJlY29yZCB0byB3aGlj
aCB0aGlzIHJlbGF0aW9uc2hpcCBiZWxvbmdzLgotCi0gICAgQHByb3BlcnR5IHtEUy5Nb2RlbH0g
b3duZXIKLSAgICBAcHJpdmF0ZQotICAqLwotICBvd25lcjogbnVsbCwKLQotICAvKioKLSAgICBg
dHJ1ZWAgaWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBwb2x5bW9ycGhpYywgYGZhbHNlYCBvdGhlcndp
c2UuCi0KLSAgICBAcHJvcGVydHkge0Jvb2xlYW59IGlzUG9seW1vcnBoaWMKLSAgICBAcHJpdmF0
ZQotICAqLwotICBpc1BvbHltb3JwaGljOiBmYWxzZSwKLQotICAvLyBMT0FESU5HIFNUQVRFCi0K
LSAgaXNMb2FkZWQ6IGZhbHNlLAotCi0gIC8qKgotICAgIFVzZWQgZm9yIGFzeW5jIGBoYXNNYW55
YCBhcnJheXMKLSAgICB0byBrZWVwIHRyYWNrIG9mIHdoZW4gdGhleSB3aWxsIHJlc29sdmUuCi0K
LSAgICBAcHJvcGVydHkge0VtYmVyLlJTVlAuUHJvbWlzZX0gcHJvbWlzZQotICAgIEBwcml2YXRl
Ci0gICovCi0gIHByb21pc2U6IG51bGwsCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkaW5nUmVj
b3Jkc0NvdW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGNvdW50Ci0gICAgQHByaXZhdGUKLSAgKi8K
LSAgbG9hZGluZ1JlY29yZHNDb3VudDogZnVuY3Rpb24oY291bnQpIHsKLSAgICB0aGlzLmxvYWRp
bmdSZWNvcmRzQ291bnQgPSBjb3VudDsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGxvYWRl
ZFJlY29yZAotICAgIEBwcml2YXRlCi0gICovCi0gIGxvYWRlZFJlY29yZDogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5sb2FkaW5nUmVjb3Jkc0NvdW50LS07Ci0gICAgaWYgKHRoaXMubG9hZGluZ1Jl
Y29yZHNDb3VudCA9PT0gMCkgewotICAgICAgc2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOwot
ICAgICAgdGhpcy50cmlnZ2VyKCdkaWRMb2FkJyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAg
IEBtZXRob2QgZmV0Y2gKLSAgICBAcHJpdmF0ZQotICAqLwotICBmZXRjaDogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIHJlY29yZHMgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc3RvcmUg
PSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicp
LAotICAgICAgICByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBNYW55QXJyYXkjZmV0
Y2ggIiArIGdldCh0aGlzLCAndHlwZScpKTsKLQotICAgIHZhciB1bmxvYWRlZFJlY29yZHMgPSBy
ZWNvcmRzLmZpbHRlclByb3BlcnR5KCdpc0VtcHR5JywgdHJ1ZSk7Ci0gICAgc3RvcmUuZmV0Y2hN
YW55KHVubG9hZGVkUmVjb3Jkcywgb3duZXIsIHJlc29sdmVyKTsKLSAgfSwKLQotICAvLyBPdmVy
cmlkZXMgRW1iZXIuQXJyYXkncyByZXBsYWNlIG1ldGhvZCB0byBpbXBsZW1lbnQKLSAgcmVwbGFj
ZUNvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4LCByZW1vdmVkLCBhZGRlZCkgewotICAgIC8vIE1hcCB0
aGUgYXJyYXkgb2YgcmVjb3JkIG9iamVjdHMgaW50byBhbiBhcnJheSBvZiAgY2xpZW50IGlkcy4K
LSAgICBhZGRlZCA9IG1hcChhZGRlZCwgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBFbWJlci5h
c3NlcnQoIllvdSBjYW5ub3QgYWRkICciICsgcmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXkgKyAi
JyByZWNvcmRzIHRvIHRoaXMgcmVsYXRpb25zaGlwIChvbmx5ICciICsgdGhpcy50eXBlLnR5cGVL
ZXkgKyAiJyBhbGxvd2VkKSIsICF0aGlzLnR5cGUgfHwgcmVjb3JkIGluc3RhbmNlb2YgdGhpcy50
eXBlKTsKLSAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB0aGlzLl9z
dXBlcihpbmRleCwgcmVtb3ZlZCwgYWRkZWQpOwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERp
ZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIucnVuLm9uY2UodGhpcywgJ2ZldGNoJyk7
Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50V2lsbENoYW5nZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92
ZWQsIGFkZGVkKSB7Ci0gICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAg
ICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyk7Ci0KLSAgICBpZiAoIW93bmVyLl9zdXNwZW5kZWRS
ZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAvLyBUaGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2Yg
Y29kZSB0aGF0IGNvbnRpbnVlcyBpbnNpZGUKLSAgICAgIC8vIG9mIGFycmF5Q29udGVudERpZENo
YW5nZS4gSXQgZ2V0cyBvciBjcmVhdGVzIGEgY2hhbmdlIGZyb20KLSAgICAgIC8vIHRoZSBjaGls
ZCBvYmplY3QsIGFkZHMgdGhlIGN1cnJlbnQgb3duZXIgYXMgdGhlIG9sZAotICAgICAgLy8gcGFy
ZW50IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAotICAg
ICAgLy8gZnJvbSBhIE1hbnlBcnJheSwgYW5kIHNldHMgYG5ld1BhcmVudGAgdG8gbnVsbC4KLSAg
ICAgIC8vCi0gICAgICAvLyBMYXRlciwgaWYgdGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVy
IE1hbnlBcnJheSwKLSAgICAgIC8vIHRoZSBgYXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3aWxsIHNl
dCBgbmV3UGFyZW50YCBvbgotICAgICAgLy8gdGhlIGNoYW5nZS4KLSAgICAgIGZvciAodmFyIGk9
aW5kZXg7IGk8aW5kZXgrcmVtb3ZlZDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQo
dGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpKTsKLQotICAgICAgICB2YXIgY2hhbmdlID0gRFMu
UmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lciwgcmVjb3JkLCBnZXQodGhpcywg
J3N0b3JlJyksIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwKLSAg
ICAgICAgICBjaGFuZ2VUeXBlOiAicmVtb3ZlIiwKLSAgICAgICAgICBraW5kOiAiaGFzTWFueSIs
Ci0gICAgICAgICAga2V5OiBuYW1lCi0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuX2NoYW5n
ZXNUb1N5bmMuYWRkKGNoYW5nZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50RGlk
Q2hhbmdlOiBmdW5jdGlvbihpbmRleCwgcmVtb3ZlZCwgYWRkZWQpIHsKLSAgICB0aGlzLl9zdXBl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotCi0gICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdv
d25lcicpLAotICAgICAgICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyksCi0gICAgICAgIHN0b3Jl
ID0gZ2V0KHRoaXMsICdzdG9yZScpOwotCi0gICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRp
b25zaGlwcykgewotICAgICAgLy8gVGhpcyBjb2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBjb2Rl
IHRoYXQgc3RhcnRlZCBpbgotICAgICAgLy8gYGFycmF5Q29udGVudFdpbGxDaGFuZ2VgLiBJdCBn
ZXRzIG9yIGNyZWF0ZXMgYSBjaGFuZ2UKLSAgICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwg
YW5kIGFkZHMgdGhlIGN1cnJlbnQgb3duZXIgYXMKLSAgICAgIC8vIHRoZSBuZXcgcGFyZW50Lgot
ICAgICAgZm9yICh2YXIgaT1pbmRleDsgaTxpbmRleCthZGRlZDsgaSsrKSB7Ci0gICAgICAgIHZh
ciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpKTsKLQotICAgICAgICB2
YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lciwgcmVj
b3JkLCBzdG9yZSwgewotICAgICAgICAgIHBhcmVudFR5cGU6IG93bmVyLmNvbnN0cnVjdG9yLAot
ICAgICAgICAgIGNoYW5nZVR5cGU6ICJhZGQiLAotICAgICAgICAgIGtpbmQ6Imhhc01hbnkiLAot
ICAgICAgICAgIGtleTogbmFtZQotICAgICAgICB9KTsKLSAgICAgICAgY2hhbmdlLmhhc01hbnlO
YW1lID0gbmFtZTsKLQotICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2UpOwot
ICAgICAgfQotCi0gICAgICAvLyBXZSB3YWl0IHVudGlsIHRoZSBhcnJheSBoYXMgZmluaXNoZWQg
YmVpbmcKLSAgICAgIC8vIG11dGF0ZWQgYmVmb3JlIHN5bmNpbmcgdGhlIE9uZVRvTWFueUNoYW5n
ZXMgY3JlYXRlZAotICAgICAgLy8gaW4gYXJyYXlDb250ZW50V2lsbENoYW5nZSwgc28gdGhhdCB0
aGUgYXJyYXkKLSAgICAgIC8vIG1lbWJlcnNoaXAgdGVzdCBpbiB0aGUgc3luYygpIGxvZ2ljIG9w
ZXJhdGVzCi0gICAgICAvLyBvbiB0aGUgZmluYWwgcmVzdWx0cy4KLSAgICAgIHRoaXMuX2NoYW5n
ZXNUb1N5bmMuZm9yRWFjaChmdW5jdGlvbihjaGFuZ2UpIHsKLSAgICAgICAgY2hhbmdlLnN5bmMo
KTsKLSAgICAgIH0pOwotCi0gICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7Ci0gICAg
fQotICB9LAotCi0gIC8qKgotICAgIENyZWF0ZSBhIGNoaWxkIHJlY29yZCB3aXRoaW4gdGhlIG93
bmVyCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFt
IHtPYmplY3R9IGhhc2gKLSAgICBAcmV0dXJuIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGNy
ZWF0ZVJlY29yZDogZnVuY3Rpb24oaGFzaCkgewotICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAn
b3duZXInKSwKLSAgICAgICAgc3RvcmUgPSBnZXQob3duZXIsICdzdG9yZScpLAotICAgICAgICB0
eXBlID0gZ2V0KHRoaXMsICd0eXBlJyksCi0gICAgICAgIHJlY29yZDsKLQotICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbm5vdCBhZGQgJyIgKyB0eXBlLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRo
aXMgcG9seW1vcnBoaWMgcmVsYXRpb25zaGlwLiIsICFnZXQodGhpcywgJ2lzUG9seW1vcnBoaWMn
KSk7Ci0KLSAgICByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQuY2FsbChzdG9yZSwgdHlwZSwg
aGFzaCk7Ci0gICAgdGhpcy5wdXNoT2JqZWN0KHJlY29yZCk7Ci0KLSAgICByZXR1cm4gcmVjb3Jk
OwotICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1
bGUgZW1iZXItZGF0YQotKi8KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFs
cyBFbWJlciovCi0vKmpzaGludCBlcW51bGw6dHJ1ZSovCi0vKioKLSAgQG1vZHVsZSBlbWJlci1k
YXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgb25j
ZSA9IEVtYmVyLnJ1bi5vbmNlOwotdmFyIGlzTm9uZSA9IEVtYmVyLmlzTm9uZTsKLXZhciBmb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci12YXIgaW5kZXhPZiA9IEVtYmVy
LkVudW1lcmFibGVVdGlscy5pbmRleE9mOwotdmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5tYXA7Ci12YXIgcmVzb2x2ZSA9IEVtYmVyLlJTVlAucmVzb2x2ZTsKLXZhciBjb3B5ID0gRW1i
ZXIuY29weTsKLQotLy8gSW1wbGVtZW50b3JzIE5vdGU6Ci0vLwotLy8gICBUaGUgdmFyaWFibGVz
IGluIHRoaXMgZmlsZSBhcmUgY29uc2lzdGVudGx5IG5hbWVkIGFjY29yZGluZyB0byB0aGUgZm9s
bG93aW5nCi0vLyAgIHNjaGVtZToKLS8vCi0vLyAgICogK2lkKyBtZWFucyBhbiBpZGVudGlmaWVy
IG1hbmFnZWQgYnkgYW4gZXh0ZXJuYWwgc291cmNlLCBwcm92aWRlZCBpbnNpZGUKLS8vICAgICB0
aGUgZGF0YSBwcm92aWRlZCBieSB0aGF0IHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2Vk
IHRvIGJlIHN0cmluZ3MKLS8vICAgICBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LgotLy8g
ICAqICtjbGllbnRJZCsgbWVhbnMgYSB0cmFuc2llbnQgbnVtZXJpY2FsIGlkZW50aWZpZXIgZ2Vu
ZXJhdGVkIGF0IHJ1bnRpbWUgYnkKLS8vICAgICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0
YW50IHByaW1hcmlseSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cyBtYXkKLS8vICAgICBu
b3QgeWV0IGhhdmUgYW4gZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCi0vLyAgICogK3JlZmVyZW5j
ZSsgbWVhbnMgYSByZWNvcmQgcmVmZXJlbmNlIG9iamVjdCwgd2hpY2ggaG9sZHMgbWV0YWRhdGEg
YWJvdXQgYQotLy8gICAgIHJlY29yZCwgZXZlbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5
IG1hdGVyaWFsaXplZC4KLS8vICAgKiArdHlwZSsgbWVhbnMgYSBzdWJjbGFzcyBvZiBEUy5Nb2Rl
bC4KLQotLy8gVXNlZCBieSB0aGUgc3RvcmUgdG8gbm9ybWFsaXplIElEcyBlbnRlcmluZyB0aGUg
c3RvcmUuICBEZXNwaXRlIHRoZSBmYWN0Ci0vLyB0aGF0IGRldmVsb3BlcnMgbWF5IHByb3ZpZGUg
SURzIGFzIG51bWJlcnMgKGUuZy4sIGBzdG9yZS5maW5kKFBlcnNvbiwgMSlgKSwKLS8vIGl0IGlz
IGltcG9ydGFudCB0aGF0IGludGVybmFsbHkgd2UgdXNlIHN0cmluZ3MsIHNpbmNlIElEcyBtYXkg
YmUgc2VyaWFsaXplZAotLy8gYW5kIGxvc2UgdHlwZSBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxl
LCBFbWJlcidzIHJvdXRlciBtYXkgcHV0IGEgcmVjb3JkJ3MKLS8vIElEIGludG8gdGhlIFVSTCwg
YW5kIGlmIHdlIGxhdGVyIHRyeSB0byBkZXNlcmlhbGl6ZSB0aGF0IFVSTCBhbmQgZmluZCB0aGUK
LS8vIGNvcnJlc3BvbmRpbmcgcmVjb3JkLCB3ZSB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGEgc3Ry
aW5nIG9yIGEgbnVtYmVyLgotdmFyIGNvZXJjZUlkID0gZnVuY3Rpb24oaWQpIHsKLSAgcmV0dXJu
IGlkID09IG51bGwgPyBudWxsIDogaWQrJyc7Ci19OwotCi0vKioKLSAgVGhlIHN0b3JlIGNvbnRh
aW5zIGFsbCBvZiB0aGUgZGF0YSBmb3IgcmVjb3JkcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgot
ICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYERTLk1v
ZGVsYCB0aGF0IHdyYXAKLSAgdGhlIGluZGl2aWR1YWwgZGF0YSBmb3IgYSByZWNvcmQsIHNvIHRo
YXQgdGhleSBjYW4gYmUgYm91bmQgdG8gaW4geW91cgotICBIYW5kbGViYXJzIHRlbXBsYXRlcy4K
LQotICBEZWZpbmUgeW91ciBhcHBsaWNhdGlvbidzIHN0b3JlIGxpa2UgdGhpczoKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIE15QXBwLlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKCk7Ci0gIGBgYAotCi0g
IE1vc3QgRW1iZXIuanMgYXBwbGljYXRpb25zIHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIGBEUy5T
dG9yZWAgdGhhdCBpcwotICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlaXIgYEVtYmVyLkFw
cGxpY2F0aW9uYC4KLQotICBZb3UgY2FuIHJldHJpZXZlIG1vZGVscyBmcm9tIHRoZSBzdG9yZSBp
biBzZXZlcmFsIHdheXMuIFRvIHJldHJpZXZlIGEgcmVjb3JkCi0gIGZvciBhIHNwZWNpZmljIGlk
LCB1c2UgYERTLlN0b3JlYCdzIGBmaW5kKClgIG1ldGhvZDoKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IHZhciBwZXJzb24gPSBzdG9yZS5maW5kKCdwZXJzb24nLCAxMjMpOwotICBgYGAKLQotICBJZiB5
b3VyIGFwcGxpY2F0aW9uIGhhcyBtdWx0aXBsZSBgRFMuU3RvcmVgIGluc3RhbmNlcyAoYW4gdW51
c3VhbCBjYXNlKSwgeW91IGNhbgotICBzcGVjaWZ5IHdoaWNoIHN0b3JlIHNob3VsZCBiZSB1c2Vk
OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHBlcnNvbiA9IHN0b3JlLmZpbmQoQXBwLlBlcnNv
biwgMTIzKTsKLSAgYGBgCi0KLSAgQnkgZGVmYXVsdCwgdGhlIHN0b3JlIHdpbGwgdGFsayB0byB5
b3VyIGJhY2tlbmQgdXNpbmcgYSBzdGFuZGFyZAotICBSRVNUIG1lY2hhbmlzbS4gWW91IGNhbiBj
dXN0b21pemUgaG93IHRoZSBzdG9yZSB0YWxrcyB0byB5b3VyCi0gIGJhY2tlbmQgYnkgc3BlY2lm
eWluZyBhIGN1c3RvbSBhZGFwdGVyOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgIE15QXBwLnN0b3Jl
ID0gRFMuU3RvcmUuY3JlYXRlKHsKLSAgICAgYWRhcHRlcjogJ015QXBwLkN1c3RvbUFkYXB0ZXIn
Ci0gICB9KTsKLSAgIGBgYAotCi0gIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCB3cml0aW5nIGEg
Y3VzdG9tIGFkYXB0ZXIgYnkgcmVhZGluZyB0aGUgYERTLkFkYXB0ZXJgCi0gIGRvY3VtZW50YXRp
b24uCi0KLSAgQGNsYXNzIFN0b3JlCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIu
T2JqZWN0Ci0qLwotRFMuU3RvcmUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAg
ICBAbWV0aG9kIGluaXQKLSAgICBAcHJpdmF0ZQotICAqLwotICBpbml0OiBmdW5jdGlvbigpIHsK
LSAgICAvLyBpbnRlcm5hbCBib29ra2VlcGluZzsgbm90IG9ic2VydmFibGUKLSAgICB0aGlzLnR5
cGVNYXBzID0ge307Ci0gICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIgPSBEUy5SZWNvcmRBcnJh
eU1hbmFnZXIuY3JlYXRlKHsKLSAgICAgIHN0b3JlOiB0aGlzCi0gICAgfSk7Ci0gICAgdGhpcy5f
cmVsYXRpb25zaGlwQ2hhbmdlcyA9IHt9OwotICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0g
IH0sCi0KLSAgLyoqCi0gICAgVGhlIGFkYXB0ZXIgdG8gdXNlIHRvIGNvbW11bmljYXRlIHRvIGEg
YmFja2VuZCBzZXJ2ZXIgb3Igb3RoZXIgcGVyc2lzdGVuY2UgbGF5ZXIuCi0KLSAgICBUaGlzIGNh
biBiZSBzcGVjaWZpZWQgYXMgYW4gaW5zdGFuY2UsIGNsYXNzLCBvciBzdHJpbmcuCi0KLSAgICBJ
ZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGBBcHAuQ3VzdG9tQWRhcHRlcmAgYXMgYSBzdHJpbmcsIGRv
OgotCi0gICAgYGBganMKLSAgICBhZGFwdGVyOiAnY3VzdG9tJwotICAgIGBgYAotCi0gICAgQHBy
b3BlcnR5IGFkYXB0ZXIKLSAgICBAZGVmYXVsdCBEUy5SRVNUQWRhcHRlcgotICAgIEB0eXBlIHtE
Uy5BZGFwdGVyfFN0cmluZ30KLSAgKi8KLSAgYWRhcHRlcjogJy1yZXN0JywKLQotICAvKioKLSAg
ICBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIGEgY3Vz
dG9tCi0gICAgdHlwZS1zcGVjaWZpYyBzZXJpYWxpemVyLCBpZiBvbmUgZXhpc3RzLgotCi0gICAg
VGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZToKLQotICAgICogYGluY2x1ZGVJZGA6IGB0cnVlYCBp
ZiB0aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJlIGluY2x1ZGVkIGluCi0gICAgICB0aGUgSlNPTiBy
ZXByZXNlbnRhdGlvbgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcHJpdmF0ZQotICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zIGFuIG9wdGlvbnMgaGFzaAotICAqLwotICBzZXJpYWxpemU6
IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXJG
b3IocmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXkpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMp
OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVydHkgcmV0dXJucyB0aGUgYWRhcHRlciwg
YWZ0ZXIgcmVzb2x2aW5nIGEgcG9zc2libGUKLSAgICBzdHJpbmcga2V5LgotCi0gICAgSWYgdGhl
IHN1cHBsaWVkIGBhZGFwdGVyYCB3YXMgYSBjbGFzcywgb3IgYSBTdHJpbmcgcHJvcGVydHkKLSAg
ICBwYXRoIHJlc29sdmVkIHRvIGEgY2xhc3MsIHRoaXMgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0
ZSB0aGUKLSAgICBjbGFzcy4KLQotICAgIFRoaXMgcHJvcGVydHkgaXMgY2FjaGVhYmxlLCBzbyB0
aGUgc2FtZSBpbnN0YW5jZSBvZiBhIHNwZWNpZmllZAotICAgIGFkYXB0ZXIgY2xhc3Mgc2hvdWxk
IGJlIHVzZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUuCi0KLSAgICBAcHJvcGVydHkg
ZGVmYXVsdEFkYXB0ZXIKLSAgICBAcHJpdmF0ZQotICAgIEByZXR1cm5zIERTLkFkYXB0ZXIKLSAg
Ki8KLSAgZGVmYXVsdEFkYXB0ZXI6IEVtYmVyLmNvbXB1dGVkKCdhZGFwdGVyJywgZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGFkYXB0ZXIgPSBnZXQodGhpcywgJ2FkYXB0ZXInKTsKLQotICAgIEVtYmVy
LmFzc2VydCgnWW91IHRyaWVkIHRvIHNldCBgYWRhcHRlcmAgcHJvcGVydHkgdG8gYW4gaW5zdGFu
Y2Ugb2YgYERTLkFkYXB0ZXJgLCB3aGVyZSBpdCBzaG91bGQgYmUgYSBuYW1lIG9yIGEgZmFjdG9y
eScsICEoYWRhcHRlciBpbnN0YW5jZW9mIERTLkFkYXB0ZXIpKTsKLQotICAgIGlmICh0eXBlb2Yg
YWRhcHRlciA9PT0gJ3N0cmluZycpIHsKLSAgICAgIGFkYXB0ZXIgPSB0aGlzLmNvbnRhaW5lci5s
b29rdXAoJ2FkYXB0ZXI6JyArIGFkYXB0ZXIpIHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRh
cHRlcjphcHBsaWNhdGlvbicpIHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjotcmVz
dCcpOwotICAgIH0KLQotICAgIGlmIChEUy5BZGFwdGVyLmRldGVjdChhZGFwdGVyKSkgewotICAg
ICAgYWRhcHRlciA9IGFkYXB0ZXIuY3JlYXRlKHsgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciB9
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfSksCi0KLSAgLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uCi0gIC8vIC4gQ1JFQVRFIE5FVyBSRUNPUkQgLgotICAvLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4KLQotICAvKioKLSAgICBDcmVhdGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJy
ZW50IHN0b3JlLiBUaGUgcHJvcGVydGllcyBwYXNzZWQKLSAgICB0byB0aGlzIG1ldGhvZCBhcmUg
c2V0IG9uIHRoZSBuZXdseSBjcmVhdGVkIHJlY29yZC4KLQotICAgIFRvIGNyZWF0ZSBhIG5ldyBp
bnN0YW5jZSBvZiBgQXBwLlBvc3RgOgotCi0gICAgYGBganMKLSAgICBzdG9yZS5jcmVhdGVSZWNv
cmQoJ3Bvc3QnLCB7Ci0gICAgICB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSB0
eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMg
dG8gc2V0IG9uIHRoZQotICAgICAgbmV3bHkgY3JlYXRlZCByZWNvcmQuCi0gICAgQHJldHVybnMg
e0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBw
cm9wZXJ0aWVzKSB7Ci0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICBwcm9w
ZXJ0aWVzID0gY29weShwcm9wZXJ0aWVzKSB8fCB7fTsKLQotICAgIC8vIElmIHRoZSBwYXNzZWQg
cHJvcGVydGllcyBkbyBub3QgaW5jbHVkZSBhIHByaW1hcnkga2V5LAotICAgIC8vIGdpdmUgdGhl
IGFkYXB0ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gZ2VuZXJhdGUgb25lLiBUeXBpY2FsbHksCi0gICAg
Ly8gY2xpZW50LXNpZGUgSUQgZ2VuZXJhdG9ycyB3aWxsIHVzZSBzb21ldGhpbmcgbGlrZSB1dWlk
LmpzCi0gICAgLy8gdG8gYXZvaWQgY29uZmxpY3RzLgotCi0gICAgaWYgKGlzTm9uZShwcm9wZXJ0
aWVzLmlkKSkgewotICAgICAgcHJvcGVydGllcy5pZCA9IHRoaXMuX2dlbmVyYXRlSWQodHlwZSk7
Ci0gICAgfQotCi0gICAgLy8gQ29lcmNlIElEIHRvIGEgc3RyaW5nCi0gICAgcHJvcGVydGllcy5p
ZCA9IGNvZXJjZUlkKHByb3BlcnRpZXMuaWQpOwotCi0gICAgdmFyIHJlY29yZCA9IHRoaXMuYnVp
bGRSZWNvcmQodHlwZSwgcHJvcGVydGllcy5pZCk7Ci0KLSAgICAvLyBNb3ZlIHRoZSByZWNvcmQg
b3V0IG9mIGl0cyBpbml0aWFsIGBlbXB0eWAgc3RhdGUgaW50bwotICAgIC8vIHRoZSBgbG9hZGVk
YCBzdGF0ZS4KLSAgICByZWNvcmQubG9hZGVkRGF0YSgpOwotCi0gICAgLy8gU2V0IHRoZSBwcm9w
ZXJ0aWVzIHNwZWNpZmllZCBvbiB0aGUgcmVjb3JkLgotICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVz
KHByb3BlcnRpZXMpOwotCi0gICAgcmV0dXJuIHJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBJ
ZiBwb3NzaWJsZSwgdGhpcyBtZXRob2QgYXNrcyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBhbiBJ
RCBmb3IKLSAgICBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBfZ2VuZXJh
dGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJu
cyB7U3RyaW5nfSBpZiB0aGUgYWRhcHRlciBjYW4gZ2VuZXJhdGUgb25lLCBhbiBJRAotICAqLwot
ICBfZ2VuZXJhdGVJZDogZnVuY3Rpb24odHlwZSkgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5h
ZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgaWYgKGFkYXB0ZXIgJiYgYWRhcHRlci5nZW5lcmF0ZUlk
Rm9yUmVjb3JkKSB7Ci0gICAgICByZXR1cm4gYWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKHRo
aXMpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4u
Li4uLi4uCi0gIC8vIC4gREVMRVRFIFJFQ09SRCAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0K
LSAgLyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgZGVsZXRlZCB2aWEgdGhl
IHN0b3JlLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwb3N0
ID0gc3RvcmUuY3JlYXRlUmVjb3JkKCdwb3N0JywgewotICAgICAgdGl0bGU6ICJSYWlscyBpcyBv
bWFrYXNlIgotICAgIH0pOwotCi0gICAgc3RvcmUuZGVsZXRlUmVjb3JkKHBvc3QpOwotICAgIGBg
YAotCi0gICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNv
cmQKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICByZWNvcmQu
ZGVsZXRlUmVjb3JkKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29y
ZCBjYW4gYmUgdW5sb2FkZWQgdmlhIHRoZSBzdG9yZS4gT25seQotICAgIG5vbi1kaXJ0eSByZWNv
cmRzIGNhbiBiZSB1bmxvYWRlZC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICBzdG9yZS5maW5kKCdwb3N0JywgMSkudGhlbihmdW5jdGlvbihwb3N0KSB7Ci0gICAgICBz
dG9yZS51bmxvYWRSZWNvcmQocG9zdCk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9k
IHVubG9hZFJlY29yZAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICB1bmxv
YWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJlY29yZC51bmxvYWRSZWNvcmQoKTsK
LSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gRklORCBSRUNPUkRTIC4KLSAg
Ly8gLi4uLi4uLi4uLi4uLi4uLgotCi0gIC8qKgotICAgIFRoaXMgaXMgdGhlIG1haW4gZW50cnkg
cG9pbnQgaW50byBmaW5kaW5nIHJlY29yZHMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8KLSAgICB0
aGlzIG1ldGhvZCBpcyB0aGUgbW9kZWwncyBuYW1lIGFzIGEgc3RyaW5nLgotCi0gICAgLS0tCi0K
LSAgICBUbyBmaW5kIGEgcmVjb3JkIGJ5IElELCBwYXNzIHRoZSBgaWRgIGFzIHRoZSBzZWNvbmQg
cGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNvbics
IDEpOwotICAgIGBgYAotCi0gICAgVGhlIGBmaW5kYCBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJu
IGEgKipwcm9taXNlKiogdGhhdCB3aWxsIGJlIHJlc29sdmVkCi0gICAgd2l0aCB0aGUgcmVjb3Jk
LiBJZiB0aGUgcmVjb3JkIHdhcyBhbHJlYWR5IGluIHRoZSBzdG9yZSwgdGhlIHByb21pc2Ugd2ls
bAotICAgIGJlIHJlc29sdmVkIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIHRoZSBzdG9yZSB3aWxs
IGFzayB0aGUgYWRhcHRlcidzIGBmaW5kYAotICAgIG1ldGhvZCB0byBmaW5kIHRoZSBuZWNlc3Nh
cnkgZGF0YS4KLQotICAgIFRoZSBgZmluZGAgbWV0aG9kIHdpbGwgYWx3YXlzIHJlc29sdmUgaXRz
IHByb21pc2Ugd2l0aCB0aGUgc2FtZSBvYmplY3QgZm9yCi0gICAgYSBnaXZlbiB0eXBlIGFuZCBg
aWRgLgotCi0gICAgLS0tCi0KLSAgICBUbyBmaW5kIGFsbCByZWNvcmRzIGZvciBhIHR5cGUsIGNh
bGwgYGZpbmRgIHdpdGggbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzOgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNvbicpOwotICAgIGBgYAotCi0gICAgVGhpcyB3aWxs
IGFzayB0aGUgYWRhcHRlcidzIGBmaW5kQWxsYCBtZXRob2QgdG8gZmluZCB0aGUgcmVjb3JkcyBm
b3IgdGhlCi0gICAgZ2l2ZW4gdHlwZSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJl
IHJlc29sdmVkIG9uY2UgdGhlIHNlcnZlcgotICAgIHJldHVybnMgdGhlIHZhbHVlcy4KLQotICAg
IC0tLQotCi0gICAgVG8gZmluZCBhIHJlY29yZCBieSBhIHF1ZXJ5LCBjYWxsIGBmaW5kYCB3aXRo
IGEgaGFzaCBhcyB0aGUgc2Vjb25kCi0gICAgcGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgeyBwYWdlOiAxIH0pOwotICAgIGBgYAotCi0g
ICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRlcidzIGBmaW5kUXVlcnlgIG1ldGhvZCB0byBmaW5k
IHRoZSByZWNvcmRzIGZvcgotICAgIHRoZSBxdWVyeSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhh
dCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhlIHNlcnZlcgotICAgIHJlc3BvbmRzLgotCi0gICAg
QG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdHxTdHJpbmd8SW50ZWdlcnxudWxsfSBpZAotICAgIEBy
ZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZDogZnVuY3Rpb24odHlwZSwgaWQp
IHsKLSAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgewotICAgICAgcmV0dXJuIHRoaXMuZmluZEFs
bCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBhcmUgcGFzc2VkIGEgcXVlcnkgaW5zdGVhZCBv
ZiBhbiBpZC4KLSAgICBpZiAoRW1iZXIudHlwZU9mKGlkKSA9PT0gJ29iamVjdCcpIHsKLSAgICAg
IHJldHVybiB0aGlzLmZpbmRRdWVyeSh0eXBlLCBpZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRo
aXMuZmluZEJ5SWQodHlwZSwgY29lcmNlSWQoaWQpKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlz
IG1ldGhvZCByZXR1cm5zIGEgcmVjb3JkIGZvciBhIGdpdmVuIHR5cGUgYW5kIGlkIGNvbWJpbmF0
aW9uLgotCi0gICAgQG1ldGhvZCBmaW5kQnlJZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtT
dHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ3xJ
bnRlZ2VyfSBpZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEJ5
SWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7
Ci0KLSAgICB2YXIgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZCh0eXBlLCBpZCk7Ci0KLSAgICB2
YXIgcHJvbWlzZSA9IHRoaXMuZmV0Y2hSZWNvcmQocmVjb3JkKSB8fCByZXNvbHZlKHJlY29yZCwg
IkRTOiBTdG9yZSNmaW5kQnlJZCAiICsgdHlwZSArICIgd2l0aCBpZDogIiArIGlkKTsKLSAgICBy
ZXR1cm4gcHJvbWlzZU9iamVjdChwcm9taXNlKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1l
dGhvZCBtYWtlcyBhIHNlcmllcyBvZiByZXF1ZXN0cyB0byB0aGUgYWRhcHRlcidzIGBmaW5kYCBt
ZXRob2QKLSAgICBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZXkg
YXJlIGFsbCBsb2FkZWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZmluZEJ5SWRzCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcGFyYW0ge0FycmF5fSBpZHMKLSAgICBAcmV0
dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kQnlJZHM6IGZ1bmN0aW9uKHR5cGUs
IGlkcykgewotICAgIHZhciBzdG9yZSA9IHRoaXM7Ci0gICAgdmFyIHByb21pc2VMYWJlbCA9ICJE
UzogU3RvcmUjZmluZEJ5SWRzICIgKyB0eXBlOwotICAgIHJldHVybiBwcm9taXNlQXJyYXkoRW1i
ZXIuUlNWUC5hbGwobWFwKGlkcywgZnVuY3Rpb24oaWQpIHsKLSAgICAgIHJldHVybiBzdG9yZS5m
aW5kQnlJZCh0eXBlLCBpZCk7Ci0gICAgfSkpLnRoZW4oRW1iZXIuQSwgbnVsbCwgIkRTOiBTdG9y
ZSNmaW5kQnlJZHMgb2YgIiArIHR5cGUgKyAiIGNvbXBsZXRlIikpOwotICB9LAotCi0gIC8qKgot
ICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBgZmluZEJ5SWRgIGlmIGl0IGRpc2NvdmVycyB0
aGF0IGEgcGFydGljdWxhcgotICAgIHR5cGUvaWQgcGFpciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0
IHRvIGtpY2sgb2ZmIGEgcmVxdWVzdCB0byB0aGUKLSAgICBhZGFwdGVyLgotCi0gICAgQG1ldGhv
ZCBmZXRjaFJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
Ci0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmV0Y2hSZWNvcmQ6IGZ1
bmN0aW9uKHJlY29yZCkgewotICAgIGlmIChpc05vbmUocmVjb3JkKSkgeyByZXR1cm4gbnVsbDsg
fQotICAgIGlmIChyZWNvcmQuX2xvYWRpbmdQcm9taXNlKSB7IHJldHVybiByZWNvcmQuX2xvYWRp
bmdQcm9taXNlOyB9Ci0gICAgaWYgKCFnZXQocmVjb3JkLCAnaXNFbXB0eScpKSB7IHJldHVybiBu
dWxsOyB9Ci0KLSAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgaWQg
PSBnZXQocmVjb3JkLCAnaWQnKTsKLQotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9y
KHR5cGUpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gZmluZCBhIHJlY29yZCBi
dXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAg
ICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBmaW5kIGEgcmVjb3JkIGJ1dCB5b3VyIGFkYXB0
ZXIgKGZvciAiICsgdHlwZSArICIpIGRvZXMgbm90IGltcGxlbWVudCAnZmluZCciLCBhZGFwdGVy
LmZpbmQpOwotCi0gICAgdmFyIHByb21pc2UgPSBfZmluZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBp
ZCk7Ci0gICAgcmVjb3JkLmxvYWRpbmdEYXRhKHByb21pc2UpOwotICAgIHJldHVybiBwcm9taXNl
OwotICB9LAotCi0gIC8qKgotICAgIEdldCBhIHJlY29yZCBieSBhIGdpdmVuIHR5cGUgYW5kIElE
IHdpdGhvdXQgdHJpZ2dlcmluZyBhIGZldGNoLgotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCBzeW5j
aHJvbm91c2x5IHJldHVybiB0aGUgcmVjb3JkIGlmIGl0J3MgYXZhaWxhYmxlLgotICAgIE90aGVy
d2lzZSwgaXQgd2lsbCByZXR1cm4gbnVsbC4KLQotICAgIGBgYGpzCi0gICAgdmFyIHBvc3QgPSBz
dG9yZS5nZXRCeUlkKCdwb3N0JywgMSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGdldEJ5SWQK
LSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBw
YXJhbSB7U3RyaW5nfEludGVnZXJ9IGlkCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0g
ICovCi0gIGdldEJ5SWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgaWYgKHRoaXMuaGFzUmVj
b3JkRm9ySWQodHlwZSwgaWQpKSB7Ci0gICAgICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0eXBl
LCBpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHJlY29yZCdzIGByZWxvYWRg
IG1ldGhvZC4KLQotICAgIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBhZGFwdGVyJ3MgYGZpbmRgIG1l
dGhvZCwgd2hpY2ggcmV0dXJucyBhIHByb21pc2UuIFdoZW4KLSAgICAqKnRoYXQqKiBwcm9taXNl
IHJlc29sdmVzLCBgcmVsb2FkUmVjb3JkYCB3aWxsIHJlc29sdmUgdGhlIHByb21pc2UgcmV0dXJu
ZWQKLSAgICBieSB0aGUgcmVjb3JkJ3MgYHJlbG9hZGAuCi0KLSAgICBAbWV0aG9kIHJlbG9hZFJl
Y29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJl
Y29yZCkgewotICAgIHZhciB0eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLAotICAgICAgICBhZGFw
dGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpLAotICAgICAgICBpZCA9IGdldChyZWNvcmQsICdp
ZCcpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHJlbG9hZCBhIHJlY29yZCB3aXRo
b3V0IGFuIElEIiwgaWQpOwotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHJlbG9hZCBh
IHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFw
dGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byByZWxvYWQgYSByZWNvcmQgYnV0
IHlvdXIgYWRhcHRlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRgIiwgYWRhcHRlci5maW5kKTsK
LQotICAgIHJldHVybiBfZmluZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBpZCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgdGFrZXMgYSBsaXN0IG9mIHJlY29yZHMsIGdyb3VwcyB0aGUg
cmVjb3JkcyBieSB0eXBlLAotICAgIGNvbnZlcnRzIHRoZSByZWNvcmRzIGludG8gSURzLCBhbmQg
dGhlbiBpbnZva2VzIHRoZSBhZGFwdGVyJ3MgYGZpbmRNYW55YAotICAgIG1ldGhvZC4KLQotICAg
IFRoZSByZWNvcmRzIGFyZSBncm91cGVkIGJ5IHR5cGUgdG8gaW52b2tlIGBmaW5kTWFueWAgb24g
YWRhcHRlcnMKLSAgICBmb3IgZWFjaCB1bmlxdWUgdHlwZSBpbiByZWNvcmRzLgotCi0gICAgSXQg
aXMgdXNlZCBib3RoIGJ5IGEgYnJhbmQgbmV3IHJlbGF0aW9uc2hpcCAodmlhIHRoZSBgZmluZE1h
bnlgCi0gICAgbWV0aG9kKSBvciB3aGVuIHRoZSBkYXRhIHVuZGVybHlpbmcgYW4gZXhpc3Rpbmcg
cmVsYXRpb25zaGlwCi0gICAgY2hhbmdlcy4KLQotICAgIEBtZXRob2QgZmV0Y2hNYW55Ci0gICAg
QHByaXZhdGUKLSAgICBAcGFyYW0ge0FycmF5fSByZWNvcmRzCi0gICAgQHBhcmFtIHtEUy5Nb2Rl
bH0gb3duZXIKLSAgICBAcGFyYW0ge1Jlc29sdmVyfSByZXNvbHZlcgotICAqLwotICBmZXRjaE1h
bnk6IGZ1bmN0aW9uKHJlY29yZHMsIG93bmVyLCByZXNvbHZlcikgewotICAgIGlmICghcmVjb3Jk
cy5sZW5ndGgpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBHcm91cCBCeSBUeXBlCi0gICAgdmFyIHJl
Y29yZHNCeVR5cGVNYXAgPSBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgZGVm
YXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIEVtYmVyLkEoKTsgfQotICAgIH0pOwotCi0g
ICAgZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZHNCeVR5
cGVNYXAuZ2V0KHJlY29yZC5jb25zdHJ1Y3RvcikucHVzaChyZWNvcmQpOwotICAgIH0pOwotCi0g
ICAgZm9yRWFjaChyZWNvcmRzQnlUeXBlTWFwLCBmdW5jdGlvbih0eXBlLCByZWNvcmRzKSB7Ci0g
ICAgICB2YXIgaWRzID0gcmVjb3Jkcy5tYXBQcm9wZXJ0eSgnaWQnKSwKLSAgICAgICAgICBhZGFw
dGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgICBFbWJlci5hc3NlcnQoIllvdSB0
cmllZCB0byBsb2FkIG1hbnkgcmVjb3JkcyBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIg
KyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRv
IGxvYWQgbWFueSByZWNvcmRzIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBm
aW5kTWFueWAiLCBhZGFwdGVyLmZpbmRNYW55KTsKLQotICAgICAgcmVzb2x2ZXIucmVzb2x2ZShf
ZmluZE1hbnkoYWRhcHRlciwgdGhpcywgdHlwZSwgaWRzLCBvd25lcikpOwotICAgIH0sIHRoaXMp
OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgdHJ1ZSBpZiBhIHJlY29yZCBmb3IgYSBnaXZl
biB0eXBlIGFuZCBJRCBpcyBhbHJlYWR5IGxvYWRlZC4KLQotICAgIEBtZXRob2QgaGFzUmVjb3Jk
Rm9ySWQKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGlkCi0gICAgQHJldHVybnMge0Jvb2xlYW59Ci0g
ICovCi0gIGhhc1JlY29yZEZvcklkOiBmdW5jdGlvbih0eXBlLCBpZCkgewotICAgIGlkID0gY29l
cmNlSWQoaWQpOwotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotICAgIHJldHVybiAh
IXRoaXMudHlwZU1hcEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZXR1cm5zIGlkIHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJRC4gSWYgb25lIGlzbid0
IGFscmVhZHkgbG9hZGVkLAotICAgIGl0IGJ1aWxkcyBhIG5ldyByZWNvcmQgYW5kIGxlYXZlcyBp
dCBpbiB0aGUgYGVtcHR5YCBzdGF0ZS4KLQotICAgIEBtZXRob2QgcmVjb3JkRm9ySWQKLSAgICBA
cHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
Ci0gICAgQHBhcmFtIHtTdHJpbmd8SW50ZWdlcn0gaWQKLSAgICBAcmV0dXJucyB7RFMuTW9kZWx9
IHJlY29yZAotICAqLwotICByZWNvcmRGb3JJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICB0
eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKLQotICAgIGlkID0gY29lcmNlSWQoaWQpOwotCi0g
ICAgdmFyIHJlY29yZCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKLQot
ICAgIGlmICghcmVjb3JkKSB7Ci0gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKHR5cGUs
IGlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIEBt
ZXRob2QgZmluZE1hbnkKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IG93bmVy
Ci0gICAgQHBhcmFtIHtBcnJheX0gcmVjb3JkcwotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAg
ICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9IHJlY29yZHMKLSAgKi8KLSAgZmluZE1hbnk6IGZ1bmN0
aW9uKG93bmVyLCByZWNvcmRzLCB0eXBlLCByZXNvbHZlcikgewotICAgIHR5cGUgPSB0aGlzLm1v
ZGVsRm9yKHR5cGUpOwotCi0gICAgcmVjb3JkcyA9IEVtYmVyLkEocmVjb3Jkcyk7Ci0KLSAgICB2
YXIgdW5sb2FkZWRSZWNvcmRzID0gcmVjb3Jkcy5maWx0ZXJQcm9wZXJ0eSgnaXNFbXB0eScsIHRy
dWUpLAotICAgICAgICBtYW55QXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVN
YW55QXJyYXkodHlwZSwgcmVjb3Jkcyk7Ci0KLSAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3Jkcywg
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQubG9hZGluZ0RhdGEoKTsKLSAgICB9KTsK
LQotICAgIG1hbnlBcnJheS5sb2FkaW5nUmVjb3Jkc0NvdW50ID0gdW5sb2FkZWRSZWNvcmRzLmxl
bmd0aDsKLQotICAgIGlmICh1bmxvYWRlZFJlY29yZHMubGVuZ3RoKSB7Ci0gICAgICBmb3JFYWNo
KHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHRoaXMucmVjb3Jk
QXJyYXlNYW5hZ2VyLnJlZ2lzdGVyV2FpdGluZ1JlY29yZEFycmF5KHJlY29yZCwgbWFueUFycmF5
KTsKLSAgICAgIH0sIHRoaXMpOwotCi0gICAgICB0aGlzLmZldGNoTWFueSh1bmxvYWRlZFJlY29y
ZHMsIG93bmVyLCByZXNvbHZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChyZXNvbHZlcikg
eyByZXNvbHZlci5yZXNvbHZlKCk7IH0KLSAgICAgIG1hbnlBcnJheS5zZXQoJ2lzTG9hZGVkJywg
dHJ1ZSk7Ci0gICAgICBFbWJlci5ydW4ub25jZShtYW55QXJyYXksICd0cmlnZ2VyJywgJ2RpZExv
YWQnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWFueUFycmF5OwotICB9LAotCi0gIC8qKgotICAg
IElmIGEgcmVsYXRpb25zaGlwIHdhcyBvcmlnaW5hbGx5IHBvcHVsYXRlZCBieSB0aGUgYWRhcHRl
ciBhcyBhIGxpbmsKLSAgICAoYXMgb3Bwb3NlZCB0byBhIGxpc3Qgb2YgSURzKSwgdGhpcyBtZXRo
b2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0gICAgcmVsYXRpb25zaGlwIGlzIGZldGNoZWQuCi0KLSAg
ICBUaGUgbGluayAod2hpY2ggaXMgdXN1YWxseSBhIFVSTCkgaXMgcGFzc2VkIHRocm91Z2ggdW5j
aGFuZ2VkLCBzbyB0aGUKLSAgICBhZGFwdGVyIGNhbiBtYWtlIHdoYXRldmVyIHJlcXVlc3QgaXQg
d2FudHMuCi0KLSAgICBUaGUgdXN1YWwgdXNlLWNhc2UgaXMgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVn
aXN0ZXIgYSBVUkwgYXMgYSBsaW5rLCBhbmQKLSAgICB0aGVuIHVzZSB0aGF0IFVSTCBpbiB0aGUg
ZnV0dXJlIHRvIG1ha2UgYSByZXF1ZXN0IGZvciB0aGUgcmVsYXRpb25zaGlwLgotCi0gICAgQG1l
dGhvZCBmaW5kSGFzTWFueQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3du
ZXIKLSAgICBAcGFyYW0ge2FueX0gbGluawotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAgICBA
cmV0dXJuIHtEUy5NYW55QXJyYXl9Ci0gICovCi0gIGZpbmRIYXNNYW55OiBmdW5jdGlvbihvd25l
ciwgbGluaywgcmVsYXRpb25zaGlwLCByZXNvbHZlcikgewotICAgIHZhciBhZGFwdGVyID0gdGhp
cy5hZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVjdG9yKTsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91
IHRyaWVkIHRvIGxvYWQgYSBoYXNNYW55IHJlbGF0aW9uc2hpcCBidXQgeW91IGhhdmUgbm8gYWRh
cHRlciAoZm9yICIgKyBvd25lci5jb25zdHJ1Y3RvciArICIpIiwgYWRhcHRlcik7Ci0gICAgRW1i
ZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBhIGhhc01hbnkgcmVsYXRpb25zaGlwIGZyb20g
YSBzcGVjaWZpZWQgYGxpbmtgIGluIHRoZSBvcmlnaW5hbCBwYXlsb2FkIGJ1dCB5b3VyIGFkYXB0
ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5kSGFzTWFueWAiLCBhZGFwdGVyLmZpbmRIYXNNYW55
KTsKLQotICAgIHZhciByZWNvcmRzID0gdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlTWFu
eUFycmF5KHJlbGF0aW9uc2hpcC50eXBlLCBFbWJlci5BKFtdKSk7Ci0gICAgcmVzb2x2ZXIucmVz
b2x2ZShfZmluZEhhc01hbnkoYWRhcHRlciwgdGhpcywgb3duZXIsIGxpbmssIHJlbGF0aW9uc2hp
cCkpOwotICAgIHJldHVybiByZWNvcmRzOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmlu
ZEJlbG9uZ3NUbwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAg
ICBAcGFyYW0ge2FueX0gbGluawotICAgIEBwYXJhbSB7UmVsYXRpb25zaGlwfSByZWxhdGlvbnNo
aXAKLSAgICBAcGFyYW0ge1Jlc29sdmVyfSByZXNvbHZlcgotICAqLwotICBmaW5kQmVsb25nc1Rv
OiBmdW5jdGlvbihvd25lciwgbGluaywgcmVsYXRpb25zaGlwLCByZXNvbHZlcikgewotICAgIHZh
ciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVjdG9yKTsKLQotICAgIEVt
YmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBiZWxvbmdzVG8gcmVsYXRpb25zaGlwIGJ1
dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBh
ZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGEgYmVsb25nc1Rv
IHJlbGF0aW9uc2hpcCBmcm9tIGEgc3BlY2lmaWVkIGBsaW5rYCBpbiB0aGUgb3JpZ2luYWwgcGF5
bG9hZCBidXQgeW91ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZEJlbG9uZ3NUb2Ai
LCBhZGFwdGVyLmZpbmRCZWxvbmdzVG8pOwotCi0gICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEJl
bG9uZ3NUbyhhZGFwdGVyLCB0aGlzLCBvd25lciwgbGluaywgcmVsYXRpb25zaGlwKSk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgZGVsZWdhdGVzIGEgcXVlcnkgdG8gdGhlIGFkYXB0
ZXIuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZQotICAgIGFkYXB0ZXItbGV2ZWwgc2VtYW50
aWNzIGFyZSBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLQotICAgIEV4cG9zaW5nIHF1ZXJp
ZXMgdGhpcyB3YXkgc2VlbXMgcHJlZmVyYWJsZSB0byBjcmVhdGluZyBhbiBhYnN0cmFjdCBxdWVy
eQotICAgIGxhbmd1YWdlIGZvciBhbGwgc2VydmVyLXNpZGUgcXVlcmllcywgYW5kIHRoZW4gcmVx
dWlyZSBhbGwgYWRhcHRlcnMgdG8KLSAgICBpbXBsZW1lbnQgdGhlbS4KLQotICAgIFRoaXMgbWV0
aG9kIHJldHVybnMgYSBwcm9taXNlLCB3aGljaCBpcyByZXNvbHZlZCB3aXRoIGEgYFJlY29yZEFy
cmF5YAotICAgIG9uY2UgdGhlIHNlcnZlciByZXR1cm5zLgotCi0gICAgQG1ldGhvZCBmaW5kUXVl
cnkKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1v
ZGVsfSB0eXBlCi0gICAgQHBhcmFtIHthbnl9IHF1ZXJ5IGFuIG9wYXF1ZSBxdWVyeSB0byBiZSB1
c2VkIGJ5IHRoZSBhZGFwdGVyCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwot
ICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHR5cGUsIHF1ZXJ5KSB7Ci0gICAgdHlwZSA9IHRoaXMubW9k
ZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgot
ICAgICAgLmNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheSh0eXBlLCBxdWVyeSk7Ci0K
LSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcih0eXBlKSwKLSAgICAgICAgcHJvbWlz
ZUxhYmVsID0gIkRTOiBTdG9yZSNmaW5kUXVlcnkgIiArIHR5cGUsCi0gICAgICAgIHJlc29sdmVy
ID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNlTGFiZWwpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZ
b3UgdHJpZWQgdG8gbG9hZCBhIHF1ZXJ5IGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiAr
IHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxv
YWQgYSBxdWVyeSBidXQgeW91ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZFF1ZXJ5
YCIsIGFkYXB0ZXIuZmluZFF1ZXJ5KTsKLQotICAgIHJlc29sdmVyLnJlc29sdmUoX2ZpbmRRdWVy
eShhZGFwdGVyLCB0aGlzLCB0eXBlLCBxdWVyeSwgYXJyYXkpKTsKLQotICAgIHJldHVybiBwcm9t
aXNlQXJyYXkocmVzb2x2ZXIucHJvbWlzZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRo
b2QgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVjb3JkcyBhZGFwdGVyIGNhbiBmaW5kLgotICAg
IEl0IHRyaWdnZXJzIHRoZSBhZGFwdGVyJ3MgYGZpbmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFu
IG9wcG9ydHVuaXR5IHRvIHBvcHVsYXRlCi0gICAgdGhlIGFycmF5IHdpdGggcmVjb3JkcyBvZiB0
aGF0IHR5cGUuCi0KLSAgICBAbWV0aG9kIGZpbmRBbGwKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7RFMu
QWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5fQotICAqLwotICBmaW5kQWxsOiBmdW5jdGlvbih0
eXBlKSB7Ci0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICByZXR1cm4gdGhp
cy5mZXRjaEFsbCh0eXBlLCB0aGlzLmFsbCh0eXBlKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCBmZXRjaEFsbAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7RFMuUmVjb3JkQXJyYXl9IGFycmF5Ci0gICAgQHJldHVybnMge1Byb21pc2V9
IHByb21pc2UKLSAgKi8KLSAgZmV0Y2hBbGw6IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7Ci0gICAg
dmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3IodHlwZSksCi0gICAgICAgIHNpbmNlVG9rZW4g
PSB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0YWRhdGEuc2luY2U7Ci0KLSAgICBzZXQoYXJyYXks
ICdpc1VwZGF0aW5nJywgdHJ1ZSk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBs
b2FkIGFsbCByZWNvcmRzIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAi
KSIsIGFkYXB0ZXIpOwotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYWxsIHJl
Y29yZHMgYnV0IHlvdXIgYWRhcHRlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGZpbmRBbGxgIiwgYWRh
cHRlci5maW5kQWxsKTsKLQotICAgIHJldHVybiBwcm9taXNlQXJyYXkoX2ZpbmRBbGwoYWRhcHRl
ciwgdGhpcywgdHlwZSwgc2luY2VUb2tlbikpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2Qg
ZGlkVXBkYXRlQWxsCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQotICAqLwotICBkaWRVcGRh
dGVBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB2YXIgZmluZEFsbENhY2hlID0gdGhpcy50eXBl
TWFwRm9yKHR5cGUpLmZpbmRBbGxDYWNoZTsKLSAgICBzZXQoZmluZEFsbENhY2hlLCAnaXNVcGRh
dGluZycsIGZhbHNlKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEg
ZmlsdGVyZWQgYXJyYXkgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMKLSAg
ICBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAgTm90ZSB0aGF0IGJlY2F1c2UgaXQncyBqdXN0IGEg
ZmlsdGVyLCBpdCB3aWxsIGhhdmUgYW55IGxvY2FsbHkKLSAgICBjcmVhdGVkIHJlY29yZHMgb2Yg
dGhlIHR5cGUuCi0KLSAgICBBbHNvIG5vdGUgdGhhdCBtdWx0aXBsZSBjYWxscyB0byBgYWxsYCBm
b3IgYSBnaXZlbiB0eXBlIHdpbGwgYWx3YXlzCi0gICAgcmV0dXJuIHRoZSBzYW1lIFJlY29yZEFy
cmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBsb2NhbF9w
b3N0cyA9IHN0b3JlLmFsbChBcHAuUG9zdCk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFsbAot
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJl
dHVybiB7RFMuUmVjb3JkQXJyYXl9Ci0gICovCi0gIGFsbDogZnVuY3Rpb24odHlwZSkgewotICAg
IHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotCi0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5
cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGZpbmRBbGxDYWNoZSA9IHR5cGVNYXAuZmluZEFsbENh
Y2hlOwotCi0gICAgaWYgKGZpbmRBbGxDYWNoZSkgeyByZXR1cm4gZmluZEFsbENhY2hlOyB9Ci0K
LSAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVSZWNvcmRBcnJh
eSh0eXBlKTsKLQotICAgIHR5cGVNYXAuZmluZEFsbENhY2hlID0gYXJyYXk7Ci0gICAgcmV0dXJu
IGFycmF5OwotICB9LAotCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgdW5sb2FkcyBhbGwgb2Yg
dGhlIGtub3duIHJlY29yZHMgZm9yIGEgZ2l2ZW4gdHlwZS4KLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICBzdG9yZS51bmxvYWRBbGwoQXBwLlBvc3QpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1
bmxvYWRBbGwKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAqLwotICB1bmxvYWRBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhpcy5t
b2RlbEZvcih0eXBlKTsKLQotICAgIHZhciB0eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUp
LAotICAgICAgICByZWNvcmRzID0gdHlwZU1hcC5yZWNvcmRzLnNwbGljZSgwKSwgcmVjb3JkOwot
Ci0gICAgd2hpbGUocmVjb3JkID0gcmVjb3Jkcy5wb3AoKSkgewotICAgICAgcmVjb3JkLnVubG9h
ZFJlY29yZCgpOwotICAgIH0KLQotICAgIHR5cGVNYXAuZmluZEFsbENhY2hlID0gbnVsbDsKLSAg
fSwKLQotICAvKioKLSAgICBUYWtlcyBhIHR5cGUgYW5kIGZpbHRlciBmdW5jdGlvbiwgYW5kIHJl
dHVybnMgYSBsaXZlIFJlY29yZEFycmF5IHRoYXQKLSAgICByZW1haW5zIHVwIHRvIGRhdGUgYXMg
bmV3IHJlY29yZHMgYXJlIGxvYWRlZCBpbnRvIHRoZSBzdG9yZSBvciBjcmVhdGVkCi0gICAgbG9j
YWxseS4KLQotICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0YWtlcyBhIG1hdGVyaWFsaXplZCBy
ZWNvcmQsIGFuZCByZXR1cm5zIHRydWUKLSAgICBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNs
dWRlZCBpbiB0aGUgZmlsdGVyIGFuZCBmYWxzZSBpZiBpdCBzaG91bGQKLSAgICBub3QuCi0KLSAg
ICBUaGUgZmlsdGVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIG9uIGFsbCByZWNvcmRzIGZvciB0
aGUgdHlwZSB3aGVuCi0gICAgaXQgaXMgY3JlYXRlZCwgYW5kIHRoZW4gb25jZSBvbiBlYWNoIG5l
d2x5IGxvYWRlZCBvciBjcmVhdGVkIHJlY29yZC4KLQotICAgIElmIGFueSBvZiBhIHJlY29yZCdz
IHByb3BlcnRpZXMgY2hhbmdlLCBvciBpZiBpdCBjaGFuZ2VzIHN0YXRlLCB0aGUKLSAgICBmaWx0
ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGFnYWluIHRvIGRldGVybWluZSB3aGV0aGVyIGl0
IHNob3VsZAotICAgIHN0aWxsIGJlIGluIHRoZSBhcnJheS4KLQotICAgIE9wdGlvbmFsbHkgeW91
IGNhbiBwYXNzIGEgcXVlcnkgd2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgYXQgZmlyc3QuIFRoZQot
ICAgIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBjb3VsZCB0aGVuIGFwcGVhciBpbiB0
aGUgZmlsdGVyIGlmIHRoZXkKLSAgICBtYXRjaCB0aGUgZmlsdGVyIGZ1bmN0aW9uLgotCi0gICAg
RXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbHRlcihBcHAuUG9zdCwg
e3VucmVhZDogdHJ1ZX0sIGZ1bmN0aW9uKHBvc3QpIHsKLSAgICAgIHJldHVybiBwb3N0LmdldCgn
dW5yZWFkJyk7Ci0gICAgfSkudGhlbihmdW5jdGlvbih1bnJlYWRQb3N0cykgewotICAgICAgdW5y
ZWFkUG9zdHMuZ2V0KCdsZW5ndGgnKTsgLy8gNQotICAgICAgdmFyIHVucmVhZFBvc3QgPSB1bnJl
YWRQb3N0cy5vYmplY3RBdCgwKTsKLSAgICAgIHVucmVhZFBvc3Quc2V0KCd1bnJlYWQnLCBmYWxz
ZSk7Ci0gICAgICB1bnJlYWRQb3N0cy5nZXQoJ2xlbmd0aCcpOyAvLyA0Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBAbWV0aG9kIGZpbHRlcgotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5IG9wdGlvbmFsIHF1
ZXJ5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyCi0gICAgQHJldHVybiB7RFMuUHJvbWlz
ZUFycmF5fQotICAqLwotICBmaWx0ZXI6IGZ1bmN0aW9uKHR5cGUsIHF1ZXJ5LCBmaWx0ZXIpIHsK
LSAgICB2YXIgcHJvbWlzZTsKLQotICAgIC8vIGFsbG93IGFuIG9wdGlvbmFsIHNlcnZlciBxdWVy
eQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7Ci0gICAgICBwcm9taXNlID0gdGhp
cy5maW5kUXVlcnkodHlwZSwgcXVlcnkpOwotICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0
aCA9PT0gMikgewotICAgICAgZmlsdGVyID0gcXVlcnk7Ci0gICAgfQotCi0gICAgdHlwZSA9IHRo
aXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFu
YWdlcgotICAgICAgLmNyZWF0ZUZpbHRlcmVkUmVjb3JkQXJyYXkodHlwZSwgZmlsdGVyKTsKLSAg
ICBwcm9taXNlID0gcHJvbWlzZSB8fCByZXNvbHZlKGFycmF5KTsKLQotICAgIHJldHVybiBwcm9t
aXNlQXJyYXkocHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGFycmF5Owot
ICAgIH0sIG51bGwsICJEUzogU3RvcmUjZmlsdGVyIG9mICIgKyB0eXBlKSk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBpZiBhIGNlcnRhaW4gcmVjb3JkIGlzIGFscmVh
ZHkgbG9hZGVkCi0gICAgaW4gdGhlIHN0b3JlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBrbm93IGJl
Zm9yZWhhbmQgaWYgYSBmaW5kKCkKLSAgICB3aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhh
dCBpdCB3aWxsIGJlIGEgY2FjaGUgaGl0LgotCi0gICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBzdG9yZS5yZWNvcmRJc0xvYWRlZChBcHAuUG9zdCwgMSk7IC8vIGZhbHNlCi0g
ICAgc3RvcmUuZmluZChBcHAuUG9zdCwgMSkudGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHN0b3Jl
LnJlY29yZElzTG9hZGVkKEFwcC5Qb3N0LCAxKTsgLy8gdHJ1ZQotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQG1ldGhvZCByZWNvcmRJc0xvYWRlZAotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtzdHJpbmd9IGlkCi0gICAgQHJldHVy
biB7Ym9vbGVhbn0KLSAgKi8KLSAgcmVjb3JkSXNMb2FkZWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7
Ci0gICAgaWYgKCF0aGlzLmhhc1JlY29yZEZvcklkKHR5cGUsIGlkKSkgeyByZXR1cm4gZmFsc2U7
IH0KLSAgICByZXR1cm4gIWdldCh0aGlzLnJlY29yZEZvcklkKHR5cGUsIGlkKSwgJ2lzRW1wdHkn
KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBtZXRhZGF0YSBm
b3IgYSBzcGVjaWZpYyB0eXBlLgotCi0gICAgQG1ldGhvZCBtZXRhZGF0YUZvcgotICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7b2Jq
ZWN0fQotICAqLwotICBtZXRhZGF0YUZvcjogZnVuY3Rpb24odHlwZSkgewotICAgIHR5cGUgPSB0
aGlzLm1vZGVsRm9yKHR5cGUpOwotICAgIHJldHVybiB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0
YWRhdGE7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uCi0gIC8vIC4gVVBEQVRJTkcgLgotICAv
LyAuLi4uLi4uLi4uLi4KLQotICAvKioKLSAgICBJZiB0aGUgYWRhcHRlciB1cGRhdGVzIGF0dHJp
YnV0ZXMgb3IgYWNrbm93bGVkZ2VzIGNyZWF0aW9uCi0gICAgb3IgZGVsZXRpb24sIHRoZSByZWNv
cmQgd2lsbCBub3RpZnkgdGhlIHN0b3JlIHRvIHVwZGF0ZSBpdHMKLSAgICBtZW1iZXJzaGlwIGlu
IGFueSBmaWx0ZXJzLgotICAgIFRvIGF2b2lkIHRocmFzaGluZywgdGhpcyBtZXRob2QgaXMgaW52
b2tlZCBvbmx5IG9uY2UgcGVyCi0KLSAgICBydW4gbG9vcCBwZXIgcmVjb3JkLgotCi0gICAgQG1l
dGhvZCBkYXRhV2FzVXBkYXRlZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtDbGFzc30gdHlw
ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBkYXRhV2FzVXBkYXRlZDog
ZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7Ci0gICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVj
b3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4KLSAgLy8g
LiBQRVJTSVNUSU5HIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4KLQotICAvKioKLSAgICBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgYnkgYHJlY29yZC5zYXZlYCwgYW5kIGdldHMgcGFzc2VkIGEKLSAgICBy
ZXNvbHZlciBmb3IgdGhlIHByb21pc2UgdGhhdCBgcmVjb3JkLnNhdmVgIHJldHVybnMuCi0KLSAg
ICBJdCBzY2hlZHVsZXMgc2F2aW5nIHRvIGhhcHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9v
cC4KLQotICAgIEBtZXRob2Qgc2NoZWR1bGVTYXZlCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0g
e0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge1Jlc29sdmVyfSByZXNvbHZlcgotICAqLwot
ICBzY2hlZHVsZVNhdmU6IGZ1bmN0aW9uKHJlY29yZCwgcmVzb2x2ZXIpIHsKLSAgICByZWNvcmQu
YWRhcHRlcldpbGxDb21taXQoKTsKLSAgICB0aGlzLl9wZW5kaW5nU2F2ZS5wdXNoKFtyZWNvcmQs
IHJlc29sdmVyXSk7Ci0gICAgb25jZSh0aGlzLCAnZmx1c2hQZW5kaW5nU2F2ZScpOwotICB9LAot
Ci0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBydW4g
bG9vcCwgYW5kCi0gICAgZmx1c2hlcyBhbnkgcmVjb3JkcyBwYXNzZWQgaW50byBgc2NoZWR1bGVT
YXZlYAotCi0gICAgQG1ldGhvZCBmbHVzaFBlbmRpbmdTYXZlCi0gICAgQHByaXZhdGUKLSAgKi8K
LSAgZmx1c2hQZW5kaW5nU2F2ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHBlbmRpbmcgPSB0aGlz
Ll9wZW5kaW5nU2F2ZS5zbGljZSgpOwotICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0KLSAg
ICBmb3JFYWNoKHBlbmRpbmcsIGZ1bmN0aW9uKHR1cGxlKSB7Ci0gICAgICB2YXIgcmVjb3JkID0g
dHVwbGVbMF0sIHJlc29sdmVyID0gdHVwbGVbMV0sCi0gICAgICAgICAgYWRhcHRlciA9IHRoaXMu
YWRhcHRlckZvcihyZWNvcmQuY29uc3RydWN0b3IpLAotICAgICAgICAgIG9wZXJhdGlvbjsKLQot
ICAgICAgaWYgKGdldChyZWNvcmQsICdpc05ldycpKSB7Ci0gICAgICAgIG9wZXJhdGlvbiA9ICdj
cmVhdGVSZWNvcmQnOwotICAgICAgfSBlbHNlIGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykp
IHsKLSAgICAgICAgb3BlcmF0aW9uID0gJ2RlbGV0ZVJlY29yZCc7Ci0gICAgICB9IGVsc2Ugewot
ICAgICAgICBvcGVyYXRpb24gPSAndXBkYXRlUmVjb3JkJzsKLSAgICAgIH0KLQotICAgICAgcmVz
b2x2ZXIucmVzb2x2ZShfY29tbWl0KGFkYXB0ZXIsIHRoaXMsIG9wZXJhdGlvbiwgcmVjb3JkKSk7
Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVk
IG9uY2UgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgYW4KLSAgICBhZGFwdGVyJ3MgYGNyZWF0ZVJl
Y29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBkZWxldGVSZWNvcmRgCi0gICAgaXMgcmVzb2x2ZWQu
Ci0KLSAgICBJZiB0aGUgZGF0YSBwcm92aWRlcyBhIHNlcnZlci1nZW5lcmF0ZWQgSUQsIGl0IHdp
bGwKLSAgICB1cGRhdGUgdGhlIHJlY29yZCBhbmQgdGhlIHN0b3JlJ3MgaW5kZXhlcy4KLQotICAg
IEBtZXRob2QgZGlkU2F2ZVJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2Rl
bH0gcmVjb3JkIHRoZSBpbi1mbGlnaHQgcmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEg
b3B0aW9uYWwgZGF0YSAoc2VlIGFib3ZlKQotICAqLwotICBkaWRTYXZlUmVjb3JkOiBmdW5jdGlv
bihyZWNvcmQsIGRhdGEpIHsKLSAgICBpZiAoZGF0YSkgewotICAgICAgLy8gbm9ybWFsaXplIHJl
bGF0aW9uc2hpcCBJRHMgaW50byByZWNvcmRzCi0gICAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRp
b25zaGlwcyh0aGlzLCByZWNvcmQuY29uc3RydWN0b3IsIGRhdGEsIHJlY29yZCk7Ci0KLSAgICAg
IHRoaXMudXBkYXRlSWQocmVjb3JkLCBkYXRhKTsKLSAgICB9Ci0KLSAgICByZWNvcmQuYWRhcHRl
ckRpZENvbW1pdChkYXRhKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxs
ZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhbgotICAgIGFkYXB0ZXIncyBgY3JlYXRl
UmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKLSAgICBpcyByZWplY3Rl
ZCB3aXRoIGEgYERTLkludmFsaWRFcnJvcmAuCi0KLSAgICBAbWV0aG9kIHJlY29yZFdhc0ludmFs
aWQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJh
bSB7T2JqZWN0fSBlcnJvcnMKLSAgKi8KLSAgcmVjb3JkV2FzSW52YWxpZDogZnVuY3Rpb24ocmVj
b3JkLCBlcnJvcnMpIHsKLSAgICByZWNvcmQuYWRhcHRlckRpZEludmFsaWRhdGUoZXJyb3JzKTsK
LSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlz
ZSByZXR1cm5lZCBieSBhbgotICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJl
Y29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKLSAgICBpcyByZWplY3RlZCAod2l0aCBhbnl0aGluZyBv
dGhlciB0aGFuIGEgYERTLkludmFsaWRFcnJvcmApLgotCi0gICAgQG1ldGhvZCByZWNvcmRXYXNF
cnJvcgotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0g
IHJlY29yZFdhc0Vycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICByZWNvcmQuYWRhcHRlckRp
ZEVycm9yKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgV2hlbiBhbiBhZGFwdGVyJ3MgYGNyZWF0ZVJl
Y29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBkZWxldGVSZWNvcmRgCi0gICAgcmVzb2x2ZXMgd2l0
aCBkYXRhLCB0aGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgSUQgZnJvbSB0aGUgc3VwcGxpZWQKLSAg
ICBkYXRhLgotCi0gICAgQG1ldGhvZCB1cGRhdGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFt
IHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEKLSAgKi8KLSAgdXBk
YXRlSWQ6IGZ1bmN0aW9uKHJlY29yZCwgZGF0YSkgewotICAgIHZhciBvbGRJZCA9IGdldChyZWNv
cmQsICdpZCcpLAotICAgICAgICBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpOwotCi0gICAgRW1iZXIu
YXNzZXJ0KCJBbiBhZGFwdGVyIGNhbm5vdCBhc3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhh
dCBhbHJlYWR5IGhhcyBhbiBpZC4gIiArIHJlY29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAi
IGFuZCB5b3UgdHJpZWQgdG8gdXBkYXRlIGl0IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkg
aGFwcGVuZWQgYmVjYXVzZSB5b3VyIHNlcnZlciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRv
IGEgZmluZCBvciB1cGRhdGUgdGhhdCBoYWQgYSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlv
dSBzZW50LiIsIG9sZElkID09PSBudWxsIHx8IGlkID09PSBvbGRJZCk7Ci0KLSAgICB0aGlzLnR5
cGVNYXBGb3IocmVjb3JkLmNvbnN0cnVjdG9yKS5pZFRvUmVjb3JkW2lkXSA9IHJlY29yZDsKLQot
ICAgIHNldChyZWNvcmQsICdpZCcsIGlkKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEg
bWFwIG9mIElEcyB0byBjbGllbnQgSURzIGZvciBhIGdpdmVuIHR5cGUuCi0KLSAgICBAbWV0aG9k
IHR5cGVNYXBGb3IKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB0eXBlCi0gICAgQHJldHVybiB7
T2JqZWN0fSB0eXBlTWFwCi0gICovCi0gIHR5cGVNYXBGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICB2YXIgdHlwZU1hcHMgPSBnZXQodGhpcywgJ3R5cGVNYXBzJyksCi0gICAgICAgIGd1aWQgPSBF
bWJlci5ndWlkRm9yKHR5cGUpLAotICAgICAgICB0eXBlTWFwOwotCi0gICAgdHlwZU1hcCA9IHR5
cGVNYXBzW2d1aWRdOwotCi0gICAgaWYgKHR5cGVNYXApIHsgcmV0dXJuIHR5cGVNYXA7IH0KLQot
ICAgIHR5cGVNYXAgPSB7Ci0gICAgICBpZFRvUmVjb3JkOiB7fSwKLSAgICAgIHJlY29yZHM6IFtd
LAotICAgICAgbWV0YWRhdGE6IHt9Ci0gICAgfTsKLQotICAgIHR5cGVNYXBzW2d1aWRdID0gdHlw
ZU1hcDsKLQotICAgIHJldHVybiB0eXBlTWFwOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4u
Li4KLSAgLy8gLiBMT0FESU5HIERBVEEgLgotICAvLyAuLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoq
Ci0gICAgVGhpcyBpbnRlcm5hbCBtZXRob2QgaXMgdXNlZCBieSBgcHVzaGAuCi0KLSAgICBAbWV0
aG9kIF9sb2FkCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCi0gICAgQHBhcmFtIHtC
b29sZWFufSBwYXJ0aWFsIHRoZSBkYXRhIHNob3VsZCBiZSBtZXJnZWQgaW50bwotICAgICAgdGhl
IGV4aXN0aW5nIGRhdGEsIG5vdCByZXBsYWNlIGl0LgotICAqLwotICBfbG9hZDogZnVuY3Rpb24o
dHlwZSwgZGF0YSwgcGFydGlhbCkgewotICAgIHZhciBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpLAot
ICAgICAgICByZWNvcmQgPSB0aGlzLnJlY29yZEZvcklkKHR5cGUsIGlkKTsKLQotICAgIHJlY29y
ZC5zZXR1cERhdGEoZGF0YSwgcGFydGlhbCk7Ci0gICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIu
cmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0g
IC8qKgotICAgIFJldHVybnMgYSBtb2RlbCBjbGFzcyBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gVXNl
ZCBieQotICAgIG1ldGhvZHMgdGhhdCB0YWtlIGEgdHlwZSBrZXkgKGxpa2UgYGZpbmRgLCBgY3Jl
YXRlUmVjb3JkYCwKLSAgICBldGMuKQotCi0gICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSBrZXkKLSAgICBAcmV0dXJucyB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9Ci0gICovCi0gIG1vZGVsRm9yOiBmdW5jdGlvbihrZXkpIHsKLSAg
ICB2YXIgZmFjdG9yeTsKLQotCi0gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7Ci0g
ICAgICB2YXIgbm9ybWFsaXplZEtleSA9IHRoaXMuY29udGFpbmVyLm5vcm1hbGl6ZSgnbW9kZWw6
JyArIGtleSk7Ci0KLSAgICAgIGZhY3RvcnkgPSB0aGlzLmNvbnRhaW5lci5sb29rdXBGYWN0b3J5
KG5vcm1hbGl6ZWRLZXkpOwotICAgICAgaWYgKCFmYWN0b3J5KSB7IHRocm93IG5ldyBFbWJlci5F
cnJvcigiTm8gbW9kZWwgd2FzIGZvdW5kIGZvciAnIiArIGtleSArICInIik7IH0KLSAgICAgIGZh
Y3RvcnkudHlwZUtleSA9IG5vcm1hbGl6ZWRLZXkuc3BsaXQoJzonLCAyKVsxXTsKLSAgICB9IGVs
c2UgewotICAgICAgLy8gQSBmYWN0b3J5IGFscmVhZHkgc3VwcGxpZWQuCi0gICAgICBmYWN0b3J5
ID0ga2V5OwotICAgIH0KLQotICAgIGZhY3Rvcnkuc3RvcmUgPSB0aGlzOwotICAgIHJldHVybiBm
YWN0b3J5OwotICB9LAotCi0gIC8qKgotICAgIFB1c2ggc29tZSBkYXRhIGZvciBhIGdpdmVuIHR5
cGUgaW50byB0aGUgc3RvcmUuCi0KLSAgICBUaGlzIG1ldGhvZCBleHBlY3RzIG5vcm1hbGl6ZWQg
ZGF0YToKLQotICAgICogVGhlIElEIGlzIGEga2V5IG5hbWVkIGBpZGAgKGFuIElEIGlzIG1hbmRh
dG9yeSkKLSAgICAqIFRoZSBuYW1lcyBvZiBhdHRyaWJ1dGVzIGFyZSB0aGUgb25lcyB5b3UgdXNl
ZCBpbgotICAgICAgeW91ciBtb2RlbCdzIGBEUy5hdHRyYHMuCi0gICAgKiBZb3VyIHJlbGF0aW9u
c2hpcHMgbXVzdCBiZToKLSAgICAgICogcmVwcmVzZW50ZWQgYXMgSURzIG9yIEFycmF5cyBvZiBJ
RHMKLSAgICAgICogcmVwcmVzZW50ZWQgYXMgbW9kZWwgaW5zdGFuY2VzCi0gICAgICAqIHJlcHJl
c2VudGVkIGFzIFVSTHMsIHVuZGVyIHRoZSBgbGlua3NgIGtleQotCi0gICAgRm9yIHRoaXMgbW9k
ZWw6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAg
ICAgZmlyc3ROYW1lOiBEUy5hdHRyKCksCi0gICAgICBsYXN0TmFtZTogRFMuYXR0cigpLAotCi0g
ICAgICBjaGlsZHJlbjogRFMuaGFzTWFueSgncGVyc29uJykKLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIFRvIHJlcHJlc2VudCB0aGUgY2hpbGRyZW4gYXMgSURzOgotCi0gICAgYGBganMKLSAgICB7
Ci0gICAgICBpZDogMSwKLSAgICAgIGZpcnN0TmFtZTogIlRvbSIsCi0gICAgICBsYXN0TmFtZTog
IkRhbGUiLAotICAgICAgY2hpbGRyZW46IFsxLCAyLCAzXQotICAgIH0KLSAgICBgYGAKLQotICAg
IFRvIHJlcHJlc2VudCB0aGUgY2hpbGRyZW4gcmVsYXRpb25zaGlwIGFzIGEgVVJMOgotCi0gICAg
YGBganMKLSAgICB7Ci0gICAgICBpZDogMSwKLSAgICAgIGZpcnN0TmFtZTogIlRvbSIsCi0gICAg
ICBsYXN0TmFtZTogIkRhbGUiLAotICAgICAgbGlua3M6IHsKLSAgICAgICAgY2hpbGRyZW46ICIv
cGVvcGxlLzEvY2hpbGRyZW4iCi0gICAgICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgSWYgeW91
J3JlIHN0cmVhbWluZyBkYXRhIG9yIGltcGxlbWVudGluZyBhbiBhZGFwdGVyLAotICAgIG1ha2Ug
c3VyZSB0aGF0IHlvdSBoYXZlIGNvbnZlcnRlZCB0aGUgaW5jb21pbmcgZGF0YQotICAgIGludG8g
dGhpcyBmb3JtLgotCi0gICAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGlu
IGJyYW5kIG5ldwotICAgIHJlY29yZHMsIGFzIHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJl
Y29yZHMuCi0KLSAgICBAbWV0aG9kIHB1c2gKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCi0gICAgQHJldHVy
bnMge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRoYXQgd2FzIGNyZWF0ZWQgb3IKLSAgICAgIHVwZGF0
ZWQuCi0gICovCi0gIHB1c2g6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIF9wYXJ0aWFsKSB7Ci0gICAg
Ly8gX3BhcnRpYWwgaXMgYW4gaW50ZXJuYWwgcGFyYW0gdXNlZCBieSBgdXBkYXRlYC4KLSAgICAv
LyBJZiBwYXNzZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlCi0gICAgLy8gbWVy
Z2VkIGludG8gdGhlIGV4aXN0aW5nIGRhdGEsIG5vdCByZXBsYWNlIGl0LgotCi0gICAgRW1iZXIu
YXNzZXJ0KCJZb3UgbXVzdCBpbmNsdWRlIGFuIGBpZGAgaW4gYSBoYXNoIHBhc3NlZCB0byBgcHVz
aGAiLCBkYXRhLmlkICE9IG51bGwpOwotCi0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7
Ci0KLSAgICAvLyBub3JtYWxpemUgcmVsYXRpb25zaGlwIElEcyBpbnRvIHJlY29yZHMKLSAgICBk
YXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlwcyh0aGlzLCB0eXBlLCBkYXRhKTsKLQotICAgIHRo
aXMuX2xvYWQodHlwZSwgZGF0YSwgX3BhcnRpYWwpOwotCi0gICAgcmV0dXJuIHRoaXMucmVjb3Jk
Rm9ySWQodHlwZSwgZGF0YS5pZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUHVzaCBzb21lIHJhdyBk
YXRhIGludG8gdGhlIHN0b3JlLgotCi0gICAgVGhlIGRhdGEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5
IGRlc2VyaWFsaXplZCB1c2luZyB0aGUKLSAgICBzZXJpYWxpemVyIGZvciB0aGUgYHR5cGVgIHBh
cmFtLgotCi0gICAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5k
IG5ldwotICAgIHJlY29yZHMsIGFzIHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMu
Ci0KLSAgICBZb3UgY2FuIHB1c2ggaW4gbW9yZSB0aGFuIG9uZSB0eXBlIG9mIG9iamVjdCBhdCBv
bmNlLgotICAgIEFsbCBvYmplY3RzIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5
IHRoZQotICAgIHNlcmlhbGl6ZXIuCi0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNl
cmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2RlbFNlcmlhbGl6ZXI7Ci0KLSAgICB2YXIgcHVzaERhdGEg
PSB7Ci0gICAgICBwb3N0czogWwotICAgICAgICB7aWQ6IDEsIHBvc3RfdGl0bGU6ICJHcmVhdCBw
b3N0IiwgY29tbWVudF9pZHM6IFsyXX0KLSAgICAgIF0sCi0gICAgICBjb21tZW50czogWwotICAg
ICAgICB7aWQ6IDIsIGNvbW1lbnRfYm9keTogIkluc2lnaHRmdWwgY29tbWVudCJ9Ci0gICAgICBd
Ci0gICAgfQotCi0gICAgc3RvcmUucHVzaFBheWxvYWQoJ3Bvc3QnLCBwdXNoRGF0YSk7Ci0gICAg
YGBgCi0KLSAgICBAbWV0aG9kIHB1c2hQYXlsb2FkCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUK
LSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0RTLk1vZGVsfSB0aGUg
cmVjb3JkIHRoYXQgd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZC4KLSAgKi8KLSAgcHVzaFBheWxvYWQ6
IGZ1bmN0aW9uICh0eXBlLCBwYXlsb2FkKSB7Ci0gICAgdmFyIHNlcmlhbGl6ZXI7Ci0gICAgaWYg
KCFwYXlsb2FkKSB7Ci0gICAgICBwYXlsb2FkID0gdHlwZTsKLSAgICAgIHNlcmlhbGl6ZXIgPSBk
ZWZhdWx0U2VyaWFsaXplcih0aGlzLmNvbnRhaW5lcik7Ci0gICAgICBFbWJlci5hc3NlcnQoIllv
dSBjYW5ub3QgdXNlIGBzdG9yZSNwdXNoUGF5bG9hZGAgd2l0aG91dCBhIHR5cGUgdW5sZXNzIHlv
dXIgZGVmYXVsdCBzZXJpYWxpemVyIGRlZmluZXMgYHB1c2hQYXlsb2FkYCIsIHNlcmlhbGl6ZXIu
cHVzaFBheWxvYWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZXJpYWxpemVyID0gdGhpcy5zZXJp
YWxpemVyRm9yKHR5cGUpOwotICAgIH0KLSAgICBzZXJpYWxpemVyLnB1c2hQYXlsb2FkKHRoaXMs
IHBheWxvYWQpOwotICB9LAotCi0gIHVwZGF0ZTogZnVuY3Rpb24odHlwZSwgZGF0YSkgewotICAg
IEVtYmVyLmFzc2VydCgiWW91IG11c3QgaW5jbHVkZSBhbiBgaWRgIGluIGEgaGFzaCBwYXNzZWQg
dG8gYHVwZGF0ZWAiLCBkYXRhLmlkICE9IG51bGwpOwotCi0gICAgcmV0dXJuIHRoaXMucHVzaCh0
eXBlLCBkYXRhLCB0cnVlKTsKLSAgfSwKLQotICAvKioKLSAgICBJZiB5b3UgaGF2ZSBhbiBBcnJh
eSBvZiBub3JtYWxpemVkIGRhdGEgdG8gcHVzaCwKLSAgICB5b3UgY2FuIGNhbGwgYHB1c2hNYW55
YCB3aXRoIHRoZSBBcnJheSwgYW5kIGl0IHdpbGwKLSAgICBjYWxsIGBwdXNoYCByZXBlYXRlZGx5
IGZvciB5b3UuCi0KLSAgICBAbWV0aG9kIHB1c2hNYW55Ci0gICAgQHBhcmFtIHtTdHJpbmcgb3Ig
c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0FycmF5fSBkYXRhcwotICAg
IEByZXR1cm4ge0FycmF5fQotICAqLwotICBwdXNoTWFueTogZnVuY3Rpb24odHlwZSwgZGF0YXMp
IHsKLSAgICByZXR1cm4gbWFwKGRhdGFzLCBmdW5jdGlvbihkYXRhKSB7Ci0gICAgICByZXR1cm4g
dGhpcy5wdXNoKHR5cGUsIGRhdGEpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIC8qKgotICAg
IElmIHlvdSBoYXZlIHNvbWUgbWV0YWRhdGEgdG8gc2V0IGZvciBhIHR5cGUKLSAgICB5b3UgY2Fu
IGNhbGwgYG1ldGFGb3JUeXBlYC4KLQotICAgIEBtZXRob2QgbWV0YUZvclR5cGUKLSAgICBAcGFy
YW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBtZXRhZGF0YQotICAqLwotICBtZXRhRm9yVHlwZTogZnVuY3Rpb24odHlwZSwgbWV0YWRh
dGEpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKLQotICAgIEVtYmVyLm1lcmdl
KHRoaXMudHlwZU1hcEZvcih0eXBlKS5tZXRhZGF0YSwgbWV0YWRhdGEpOwotICB9LAotCi0gIC8q
KgotICAgIEJ1aWxkIGEgYnJhbmQgbmV3IHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlLCBJRCwgYW5k
Ci0gICAgaW5pdGlhbCBkYXRhLgotCi0gICAgQG1ldGhvZCBidWlsZFJlY29yZAotICAgIEBwcml2
YXRlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7
U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCi0gICAgQHJldHVybnMge0RTLk1v
ZGVsfSByZWNvcmQKLSAgKi8KLSAgYnVpbGRSZWNvcmQ6IGZ1bmN0aW9uKHR5cGUsIGlkLCBkYXRh
KSB7Ci0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGlk
VG9SZWNvcmQgPSB0eXBlTWFwLmlkVG9SZWNvcmQ7Ci0KLSAgICBFbWJlci5hc3NlcnQoJ1RoZSBp
ZCAnICsgaWQgKyAnIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB3aXRoIGFub3RoZXIgcmVjb3JkIG9m
IHR5cGUgJyArIHR5cGUudG9TdHJpbmcoKSArICcuJywgIWlkIHx8ICFpZFRvUmVjb3JkW2lkXSk7
Ci0KLSAgICAvLyBsb29rdXBGYWN0b3J5IHNob3VsZCByZWFsbHkgcmV0dXJuIGFuIG9iamVjdCB0
aGF0IGNyZWF0ZXMKLSAgICAvLyBpbnN0YW5jZXMgd2l0aCB0aGUgaW5qZWN0aW9ucyBhcHBsaWVk
Ci0gICAgdmFyIHJlY29yZCA9IHR5cGUuX2NyZWF0ZSh7Ci0gICAgICBpZDogaWQsCi0gICAgICBz
dG9yZTogdGhpcywKLSAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIKLSAgICB9KTsKLQot
ICAgIGlmIChkYXRhKSB7Ci0gICAgICByZWNvcmQuc2V0dXBEYXRhKGRhdGEpOwotICAgIH0KLQot
ICAgIC8vIGlmIHdlJ3JlIGNyZWF0aW5nIGFuIGl0ZW0sIHRoaXMgcHJvY2VzcyB3aWxsIGJlIGRv
bmUKLSAgICAvLyBsYXRlciwgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIHBlcnNpc3RlZC4KLSAg
ICBpZiAoaWQpIHsKLSAgICAgIGlkVG9SZWNvcmRbaWRdID0gcmVjb3JkOwotICAgIH0KLQotICAg
IHR5cGVNYXAucmVjb3Jkcy5wdXNoKHJlY29yZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9
LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLgotICAvLyAuIERFU1RSVUNUSU9OIC4KLSAgLy8gLi4u
Li4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgV2hlbiBhIHJlY29yZCBpcyBkZXN0cm95ZWQsIHRo
aXMgdW4taW5kZXhlcyBpdCBhbmQKLSAgICByZW1vdmVzIGl0IGZyb20gYW55IHJlY29yZCBhcnJh
eXMgc28gaXQgY2FuIGJlIEdDZWQuCi0KLSAgICBAbWV0aG9kIGRlbWF0ZXJpYWxpemVSZWNvcmQK
LSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBkZW1h
dGVyaWFsaXplUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICB2YXIgdHlwZSA9IHJlY29y
ZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgdHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwK
LSAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAnaWQnKTsKLQotICAgIHJlY29yZC51cGRhdGVSZWNv
cmRBcnJheXMoKTsKLQotICAgIGlmIChpZCkgewotICAgICAgZGVsZXRlIHR5cGVNYXAuaWRUb1Jl
Y29yZFtpZF07Ci0gICAgfQotCi0gICAgdmFyIGxvYyA9IGluZGV4T2YodHlwZU1hcC5yZWNvcmRz
LCByZWNvcmQpOwotICAgIHR5cGVNYXAucmVjb3Jkcy5zcGxpY2UobG9jLCAxKTsKLSAgfSwKLQot
ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBSRUxBVElPTlNISVAgQ0hBTkdF
UyAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gIGFkZFJlbGF0aW9uc2hpcENo
YW5nZUZvcjogZnVuY3Rpb24oY2hpbGRSZWNvcmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBh
cmVudEtleSwgY2hhbmdlKSB7Ci0gICAgdmFyIGNsaWVudElkID0gY2hpbGRSZWNvcmQuY2xpZW50
SWQsCi0gICAgICAgIHBhcmVudENsaWVudElkID0gcGFyZW50UmVjb3JkID8gcGFyZW50UmVjb3Jk
IDogcGFyZW50UmVjb3JkOwotICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKLSAg
ICB2YXIgY2hhbmdlcyA9IHRoaXMuX3JlbGF0aW9uc2hpcENoYW5nZXM7Ci0gICAgaWYgKCEoY2xp
ZW50SWQgaW4gY2hhbmdlcykpIHsKLSAgICAgIGNoYW5nZXNbY2xpZW50SWRdID0ge307Ci0gICAg
fQotICAgIGlmICghKHBhcmVudENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSkgewotICAg
ICAgY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50Q2xpZW50SWRdID0ge307Ci0gICAgfQotICAgIGlm
ICghKGtleSBpbiBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF0pKSB7Ci0gICAgICBj
aGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XSA9IHt9OwotICAgIH0KLSAgICBj
aGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XVtjaGFuZ2UuY2hhbmdlVHlwZV0g
PSBjaGFuZ2U7Ci0gIH0sCi0KLSAgcmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdlRm9yOiBmdW5jdGlv
bihjbGllbnRSZWNvcmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBhcmVudEtleSwgdHlwZSkg
ewotICAgIHZhciBjbGllbnRJZCA9IGNsaWVudFJlY29yZC5jbGllbnRJZCwKLSAgICAgICAgcGFy
ZW50Q2xpZW50SWQgPSBwYXJlbnRSZWNvcmQgPyBwYXJlbnRSZWNvcmQuY2xpZW50SWQgOiBwYXJl
bnRSZWNvcmQ7Ci0gICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9yZWxhdGlvbnNoaXBDaGFuZ2VzOwot
ICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKLSAgICBpZiAoIShjbGllbnRJZCBp
biBjaGFuZ2VzKSB8fCAhKHBhcmVudENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSB8fCAh
KGtleSBpbiBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF0pKXsKLSAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgZGVsZXRlIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtr
ZXldW3R5cGVdOwotICB9LAotCi0gIHJlbGF0aW9uc2hpcENoYW5nZVBhaXJzRm9yOiBmdW5jdGlv
bihyZWNvcmQpewotICAgIHZhciB0b1JldHVybiA9IFtdOwotCi0gICAgaWYoICFyZWNvcmQgKSB7
IHJldHVybiB0b1JldHVybjsgfQotCi0gICAgLy9UT0RPKElnb3IpIFdoYXQgYWJvdXQgdGhlIG90
aGVyIHNpZGUKLSAgICB2YXIgY2hhbmdlc09iamVjdCA9IHRoaXMuX3JlbGF0aW9uc2hpcENoYW5n
ZXNbcmVjb3JkLmNsaWVudElkXTsKLSAgICBmb3IgKHZhciBvYmpLZXkgaW4gY2hhbmdlc09iamVj
dCl7Ci0gICAgICBpZihjaGFuZ2VzT2JqZWN0Lmhhc093blByb3BlcnR5KG9iaktleSkpewotICAg
ICAgICBmb3IgKHZhciBjaGFuZ2VLZXkgaW4gY2hhbmdlc09iamVjdFtvYmpLZXldKXsKLSAgICAg
ICAgICBpZihjaGFuZ2VzT2JqZWN0W29iaktleV0uaGFzT3duUHJvcGVydHkoY2hhbmdlS2V5KSl7
Ci0gICAgICAgICAgICB0b1JldHVybi5wdXNoKGNoYW5nZXNPYmplY3Rbb2JqS2V5XVtjaGFuZ2VL
ZXldKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IHRvUmV0dXJuOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBQ
RVItVFlQRSBBREFQVEVSUwotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0g
ICAgUmV0dXJucyB0aGUgYWRhcHRlciBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAgQG1ldGhvZCBh
ZGFwdGVyRm9yCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVs
fSB0eXBlCi0gICAgQHJldHVybnMgRFMuQWRhcHRlcgotICAqLwotICBhZGFwdGVyRm9yOiBmdW5j
dGlvbih0eXBlKSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBhZGFwdGVy
OwotCi0gICAgaWYgKGNvbnRhaW5lcikgewotICAgICAgYWRhcHRlciA9IGNvbnRhaW5lci5sb29r
dXAoJ2FkYXB0ZXI6JyArIHR5cGUudHlwZUtleSkgfHwgY29udGFpbmVyLmxvb2t1cCgnYWRhcHRl
cjphcHBsaWNhdGlvbicpOwotICAgIH0KLQotICAgIHJldHVybiBhZGFwdGVyIHx8IGdldCh0aGlz
LCAnZGVmYXVsdEFkYXB0ZXInKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLSAgLy8gLiBSRUNPUkQgQ0hBTkdFIE5PVElGSUNBVElPTiAuCi0gIC8vIC4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotCi0gIC8qKgotICAgIFJldHVybnMgYW4gaW5zdGFu
Y2Ugb2YgdGhlIHNlcmlhbGl6ZXIgZm9yIGEgZ2l2ZW4gdHlwZS4gRm9yCi0gICAgZXhhbXBsZSwg
YHNlcmlhbGl6ZXJGb3IoJ3BlcnNvbicpYCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgotICAg
IGBBcHAuUGVyc29uU2VyaWFsaXplcmAuCi0KLSAgICBJZiBubyBgQXBwLlBlcnNvblNlcmlhbGl6
ZXJgIGlzIGZvdW5kLCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sKLSAgICBmb3IgYW4gYEFwcC5BcHBs
aWNhdGlvblNlcmlhbGl6ZXJgICh0aGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvcgotICAgIHlvdXIg
ZW50aXJlIGFwcGxpY2F0aW9uKS4KLQotICAgIElmIG5vIGBBcHAuQXBwbGljYXRpb25TZXJpYWxp
emVyYCBpcyBmb3VuZCwgaXQgd2lsbCBmYWxsIGJhY2sKLSAgICB0byBhbiBpbnN0YW5jZSBvZiBg
RFMuSlNPTlNlcmlhbGl6ZXJgLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVyRm9yCi0gICAgQHBy
aXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQot
ICAgIEByZXR1cm4ge0RTLlNlcmlhbGl6ZXJ9Ci0gICovCi0gIHNlcmlhbGl6ZXJGb3I6IGZ1bmN0
aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKLSAgICB2YXIgYWRh
cHRlciA9IHRoaXMuYWRhcHRlckZvcih0eXBlKTsKLQotICAgIHJldHVybiBzZXJpYWxpemVyRm9y
KHRoaXMuY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGFkYXB0ZXIgJiYgYWRhcHRlci5kZWZhdWx0
U2VyaWFsaXplcik7Ci0gIH0KLX0pOwotCi1mdW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbnNoaXBz
KHN0b3JlLCB0eXBlLCBkYXRhLCByZWNvcmQpIHsKLSAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1
bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgLy8gQSBsaW5rICh1c3VhbGx5IGEgVVJM
KSB3YXMgYWxyZWFkeSBwcm92aWRlZCBpbgotICAgIC8vIG5vcm1hbGl6ZWQgZm9ybQotICAgIGlm
IChkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nba2V5XSkgewotICAgICAgaWYgKHJlY29yZCAmJiBy
ZWxhdGlvbnNoaXAub3B0aW9ucy5hc3luYykgeyByZWNvcmQuX3JlbGF0aW9uc2hpcHNba2V5XSA9
IG51bGw7IH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YXIga2luZCA9IHJlbGF0aW9u
c2hpcC5raW5kLAotICAgICAgICB2YWx1ZSA9IGRhdGFba2V5XTsKLQotICAgIGlmICh2YWx1ZSA9
PSBudWxsKSB7IHJldHVybjsgfQotCi0gICAgaWYgKGtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0g
ICAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0b3JlLCBkYXRhLCBrZXksIHJlbGF0aW9uc2hpcCwg
dmFsdWUpOwotICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gJ2hhc01hbnknKSB7Ci0gICAgICBkZXNl
cmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIHZhbHVlKTsK
LSAgICAgIGFkZFVuc2F2ZWRSZWNvcmRzKHJlY29yZCwga2V5LCB2YWx1ZSk7Ci0gICAgfQotICB9
KTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQotZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRJZChz
dG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIGlkKSB7Ci0gIGlmIChpc05vbmUoaWQpIHx8
IGlkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2YXIgdHlw
ZTsKLQotICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJp
bmcnKSB7Ci0gICAgdHlwZSA9IHR5cGVGb3IocmVsYXRpb25zaGlwLCBrZXksIGRhdGEpOwotICAg
IGRhdGFba2V5XSA9IHN0b3JlLnJlY29yZEZvcklkKHR5cGUsIGlkKTsKLSAgfSBlbHNlIGlmICh0
eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7Ci0gICAgLy8gcG9seW1vcnBoaWMKLSAgICBkYXRhW2tl
eV0gPSBzdG9yZS5yZWNvcmRGb3JJZChpZC50eXBlLCBpZC5pZCk7Ci0gIH0KLX0KLQotZnVuY3Rp
b24gdHlwZUZvcihyZWxhdGlvbnNoaXAsIGtleSwgZGF0YSkgewotICBpZiAocmVsYXRpb25zaGlw
Lm9wdGlvbnMucG9seW1vcnBoaWMpIHsKLSAgICByZXR1cm4gZGF0YVtrZXkgKyAiVHlwZSJdOwot
ICB9IGVsc2UgewotICAgIHJldHVybiByZWxhdGlvbnNoaXAudHlwZTsKLSAgfQotfQotCi1mdW5j
dGlvbiBkZXNlcmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAs
IGlkcykgewotICBmb3IgKHZhciBpPTAsIGw9aWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBk
ZXNlcmlhbGl6ZVJlY29yZElkKHN0b3JlLCBpZHMsIGksIHJlbGF0aW9uc2hpcCwgaWRzW2ldKTsK
LSAgfQotfQotCi0vLyBJZiB0aGVyZSBhcmUgYW55IHVuc2F2ZWQgcmVjb3JkcyB0aGF0IGFyZSBp
biBhIGhhc01hbnkgdGhleSB3b24ndCBiZQotLy8gaW4gdGhlIHBheWxvYWQsIHNvIGFkZCB0aGVt
IGJhY2sgaW4gbWFudWFsbHkuCi1mdW5jdGlvbiBhZGRVbnNhdmVkUmVjb3JkcyhyZWNvcmQsIGtl
eSwgZGF0YSkgewotICBpZihyZWNvcmQpIHsKLSAgICBkYXRhLnB1c2hPYmplY3RzKHJlY29yZC5n
ZXQoa2V5KS5maWx0ZXJCeSgnaXNOZXcnKSk7Ci0gIH0KLX0KLQotLy8gRGVsZWdhdGlvbiB0byB0
aGUgYWRhcHRlciBhbmQgcHJvbWlzZSBtYW5hZ2VtZW50Ci0vKioKLSAgQSBgUHJvbWlzZUFycmF5
YCBpcyBhbiBvYmplY3QgdGhhdCBhY3RzIGxpa2UgYm90aCBhbiBgRW1iZXIuQXJyYXlgCi0gIGFu
ZCBhIHByb21pc2UuIFdoZW4gdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdGhlIHRoZSByZXN1bHRp
bmcgdmFsdWUKLSAgd2lsbCBiZSBzZXQgdG8gdGhlIGBQcm9taXNlQXJyYXlgJ3MgYGNvbnRlbnRg
IHByb3BlcnR5LiBUaGlzIG1ha2VzCi0gIGl0IGVhc3kgdG8gY3JlYXRlIGRhdGEgYmluZGluZ3Mg
d2l0aCB0aGUgYFByb21pc2VBcnJheWAgdGhhdCB3aWxsIGJlCi0gIHVwZGF0ZWQgd2hlbiB0aGUg
cHJvbWlzZSByZXNvbHZlcy4KLQotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIFtFbWJl
ci5Qcm9taXNlUHJveHlNaXhpbgotICBkb2N1bWVudGF0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIu
UHJvbWlzZVByb3h5TWl4aW4uaHRtbCkuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQK
LSAgdmFyIHByb21pc2VBcnJheSA9IERTLlByb21pc2VBcnJheS5jcmVhdGUoewotICAgIHByb21p
c2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3RlL2RhdGEuanNvbicpCi0gIH0pOwotCi0gIHByb21p
c2VBcnJheS5nZXQoJ2xlbmd0aCcpOyAvLyAwCi0KLSAgcHJvbWlzZUFycmF5LnRoZW4oZnVuY3Rp
b24oKSB7Ci0gICAgcHJvbWlzZUFycmF5LmdldCgnbGVuZ3RoJyk7IC8vIDEwMAotICB9KTsKLSAg
YGBgCi0KLSAgQGNsYXNzIFByb21pc2VBcnJheQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRz
IEVtYmVyLkFycmF5UHJveHkKLSAgQHVzZXMgRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KLSovCi1E
Uy5Qcm9taXNlQXJyYXkgPSBFbWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJv
eHlNaXhpbik7Ci0vKioKLSAgQSBgUHJvbWlzZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgYWN0
cyBsaWtlIGJvdGggYW4gYEVtYmVyLk9iamVjdGAKLSAgYW5kIGEgcHJvbWlzZS4gV2hlbiB0aGUg
cHJvbWlzZSBpcyByZXNvbHZlZCB0aGUgdGhlIHJlc3VsdGluZyB2YWx1ZQotICB3aWxsIGJlIHNl
dCB0byB0aGUgYFByb21pc2VPYmplY3RgJ3MgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2Vz
Ci0gIGl0IGVhc3kgdG8gY3JlYXRlIGRhdGEgYmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VPYmpl
Y3RgIHRoYXQgd2lsbAotICBiZSB1cGRhdGVkIHdoZW4gdGhlIHByb21pc2UgcmVzb2x2ZXMuCi0K
LSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4K
LSAgZG9jdW1lbnRhdGlvbl0oL2FwaS9jbGFzc2VzL0VtYmVyLlByb21pc2VQcm94eU1peGluLmh0
bWwpLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBwcm9taXNlT2JqZWN0
ID0gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoewotICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3Nv
bWUvcmVtb3RlL2RhdGEuanNvbicpCi0gIH0pOwotCi0gIHByb21pc2VPYmplY3QuZ2V0KCduYW1l
Jyk7IC8vIG51bGwKLQotICBwcm9taXNlT2JqZWN0LnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgcHJv
bWlzZU9iamVjdC5nZXQoJ25hbWUnKTsgLy8gJ1RvbXN0ZXInCi0gIH0pOwotICBgYGAKLQotICBA
Y2xhc3MgUHJvbWlzZU9iamVjdAotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLk9i
amVjdFByb3h5Ci0gIEB1c2VzIEVtYmVyLlByb21pc2VQcm94eU1peGluCi0qLwotRFMuUHJvbWlz
ZU9iamVjdCA9IEVtYmVyLk9iamVjdFByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhp
bik7Ci0KLWZ1bmN0aW9uIHByb21pc2VPYmplY3QocHJvbWlzZSkgewotICByZXR1cm4gRFMuUHJv
bWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBwcm9taXNlIH0pOwotfQotCi1mdW5jdGlvbiBw
cm9taXNlQXJyYXkocHJvbWlzZSkgewotICByZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7
IHByb21pc2U6IHByb21pc2UgfSk7Ci19Ci0KLWZ1bmN0aW9uIGlzVGhlbmFibGUob2JqZWN0KSB7
Ci0gIHJldHVybiBvYmplY3QgJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nOwot
fQotCi1mdW5jdGlvbiBzZXJpYWxpemVyRm9yKGNvbnRhaW5lciwgdHlwZSwgZGVmYXVsdFNlcmlh
bGl6ZXIpIHsKLSAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6Jyt0eXBlKSB8
fAotICAgICAgICAgICAgICAgICBjb250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0
aW9uJykgfHwKLSAgICAgICAgICAgICAgICAgY29udGFpbmVyLmxvb2t1cCgnc2VyaWFsaXplcjon
ICsgZGVmYXVsdFNlcmlhbGl6ZXIpIHx8Ci0gICAgICAgICAgICAgICAgIGNvbnRhaW5lci5sb29r
dXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsKLX0KLQotZnVuY3Rpb24gZGVmYXVsdFNlcmlhbGl6
ZXIoY29udGFpbmVyKSB7Ci0gIHJldHVybiBjb250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFw
cGxpY2F0aW9uJykgfHwKLSAgICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRl
ZmF1bHQnKTsKLX0KLQotZnVuY3Rpb24gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlw
ZSkgewotICB2YXIgc2VyaWFsaXplciA9IGFkYXB0ZXIuc2VyaWFsaXplciwKLSAgICAgIGRlZmF1
bHRTZXJpYWxpemVyID0gYWRhcHRlci5kZWZhdWx0U2VyaWFsaXplciwKLSAgICAgIGNvbnRhaW5l
ciA9IGFkYXB0ZXIuY29udGFpbmVyOwotCi0gIGlmIChjb250YWluZXIgJiYgc2VyaWFsaXplciA9
PT0gdW5kZWZpbmVkKSB7Ci0gICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3IoY29udGFpbmVy
LCB0eXBlLnR5cGVLZXksIGRlZmF1bHRTZXJpYWxpemVyKTsKLSAgfQotCi0gIGlmIChzZXJpYWxp
emVyID09PSBudWxsIHx8IHNlcmlhbGl6ZXIgPT09IHVuZGVmaW5lZCkgewotICAgIHNlcmlhbGl6
ZXIgPSB7Ci0gICAgICBleHRyYWN0OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeyBy
ZXR1cm4gcGF5bG9hZDsgfQotICAgIH07Ci0gIH0KLQotICByZXR1cm4gc2VyaWFsaXplcjsKLX0K
LQotZnVuY3Rpb24gX2ZpbmQoYWRhcHRlciwgc3RvcmUsIHR5cGUsIGlkKSB7Ci0gIHZhciBwcm9t
aXNlID0gYWRhcHRlci5maW5kKHN0b3JlLCB0eXBlLCBpZCksCi0gICAgICBzZXJpYWxpemVyID0g
c2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSk7Ci0KLSAgcmV0dXJuIHJlc29sdmUo
cHJvbWlzZSwgIkRTOiBIYW5kbGUgQWRhcHRlciNmaW5kIG9mICIgKyB0eXBlICsgIiB3aXRoIGlk
OiAiICsgaWQpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91
IG1hZGUgYSByZXF1ZXN0IGZvciBhICIgKyB0eXBlLnR5cGVLZXkgKyAiIHdpdGggaWQgIiArIGlk
ICsgIiwgYnV0IHRoZSBhZGFwdGVyJ3MgcmVzcG9uc2UgZGlkIG5vdCBoYXZlIGFueSBkYXRhIiwg
cGF5bG9hZCk7Ci0gICAgcGF5bG9hZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwg
cGF5bG9hZCwgaWQsICdmaW5kJyk7Ci0KLSAgICByZXR1cm4gc3RvcmUucHVzaCh0eXBlLCBwYXls
b2FkKTsKLSAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuZ2V0
QnlJZCh0eXBlLCBpZCk7Ci0gICAgcmVjb3JkLm5vdEZvdW5kKCk7Ci0gICAgdGhyb3cgZXJyb3I7
Ci0gIH0sICJEUzogRXh0cmFjdCBwYXlsb2FkIG9mICciICsgdHlwZSArICInIik7Ci19Ci0KLWZ1
bmN0aW9uIF9maW5kTWFueShhZGFwdGVyLCBzdG9yZSwgdHlwZSwgaWRzLCBvd25lcikgewotICB2
YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZE1hbnkoc3RvcmUsIHR5cGUsIGlkcywgb3duZXIpLAot
ICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpOwot
Ci0gIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZE1hbnkg
b2YgIiArIHR5cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJp
YWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5kTWFueScpOwot
Ci0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgcmVzcG9uc2UgZnJvbSBhIGZpbmRNYW55IG11c3QgYmUg
YW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5zcGVjdChwYXlsb2FkKSwgRW1iZXIudHlwZU9mKHBh
eWxvYWQpID09PSAnYXJyYXknKTsKLQotICAgIHN0b3JlLnB1c2hNYW55KHR5cGUsIHBheWxvYWQp
OwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgdHlwZSk7Ci19Ci0KLWZ1
bmN0aW9uIF9maW5kSGFzTWFueShhZGFwdGVyLCBzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlv
bnNoaXApIHsKLSAgdmFyIHByb21pc2UgPSBhZGFwdGVyLmZpbmRIYXNNYW55KHN0b3JlLCByZWNv
cmQsIGxpbmssIHJlbGF0aW9uc2hpcCksCi0gICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZv
ckFkYXB0ZXIoYWRhcHRlciwgcmVsYXRpb25zaGlwLnR5cGUpOwotCi0gIHJldHVybiByZXNvbHZl
KHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZEhhc01hbnkgb2YgIiArIHJlY29yZCAr
ICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAg
IHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBw
YXlsb2FkLCBudWxsLCAnZmluZEhhc01hbnknKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVGhlIHJl
c3BvbnNlIGZyb20gYSBmaW5kSGFzTWFueSBtdXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVtYmVy
Lmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7Ci0K
LSAgICB2YXIgcmVjb3JkcyA9IHN0b3JlLnB1c2hNYW55KHJlbGF0aW9uc2hpcC50eXBlLCBwYXls
b2FkKTsKLSAgICByZWNvcmQudXBkYXRlSGFzTWFueShyZWxhdGlvbnNoaXAua2V5LCByZWNvcmRz
KTsKLSAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0IHBheWxvYWQgb2YgIiArIHJlY29yZCArICIgOiBo
YXNNYW55ICIgKyByZWxhdGlvbnNoaXAudHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQmVsb25n
c1RvKGFkYXB0ZXIsIHN0b3JlLCByZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCkgewotICB2YXIg
cHJvbWlzZSA9IGFkYXB0ZXIuZmluZEJlbG9uZ3NUbyhzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxh
dGlvbnNoaXApLAotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0
ZXIsIHJlbGF0aW9uc2hpcC50eXBlKTsKLQotICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6
IEhhbmRsZSBBZGFwdGVyI2ZpbmRCZWxvbmdzVG8gb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVs
YXRpb25zaGlwLnR5cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBz
ZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxs
LCAnZmluZEJlbG9uZ3NUbycpOwotCi0gICAgdmFyIHJlY29yZCA9IHN0b3JlLnB1c2gocmVsYXRp
b25zaGlwLnR5cGUsIHBheWxvYWQpOwotICAgIHJlY29yZC51cGRhdGVCZWxvbmdzVG8ocmVsYXRp
b25zaGlwLmtleSwgcmVjb3JkKTsKLSAgICByZXR1cm4gcmVjb3JkOwotICB9LCBudWxsLCAiRFM6
IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgcmVjb3JkICsgIiA6ICIgKyByZWxhdGlvbnNoaXAudHlw
ZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQWxsKGFkYXB0ZXIsIHN0b3JlLCB0eXBlLCBzaW5jZVRv
a2VuKSB7Ci0gIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5kQWxsKHN0b3JlLCB0eXBlLCBzaW5j
ZVRva2VuKSwKLSAgICAgIHNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVy
LCB0eXBlKTsKLQotICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVy
I2ZpbmRBbGwgb2YgIiArIHR5cGUpLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxv
YWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5k
QWxsJyk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9tIGEgZmluZEFsbCBt
dXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5
cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7Ci0KLSAgICBzdG9yZS5wdXNoTWFueSh0eXBlLCBw
YXlsb2FkKTsKLSAgICBzdG9yZS5kaWRVcGRhdGVBbGwodHlwZSk7Ci0gICAgcmV0dXJuIHN0b3Jl
LmFsbCh0eXBlKTsKLSAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0IHBheWxvYWQgb2YgZmluZEFsbCAi
ICsgdHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kUXVlcnkoYWRhcHRlciwgc3RvcmUsIHR5cGUs
IHF1ZXJ5LCByZWNvcmRBcnJheSkgewotICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZFF1ZXJ5
KHN0b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3JkQXJyYXkpLAotICAgICAgc2VyaWFsaXplciA9IHNl
cmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHBy
b21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZFF1ZXJ5IG9mICIgKyB0eXBlKS50aGVuKGZ1
bmN0aW9uKHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0gc2VyaWFsaXplci5leHRyYWN0KHN0b3Jl
LCB0eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZFF1ZXJ5Jyk7Ci0KLSAgICBFbWJlci5hc3NlcnQo
IlRoZSByZXNwb25zZSBmcm9tIGEgZmluZFF1ZXJ5IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsg
RW1iZXIuaW5zcGVjdChwYXlsb2FkKSwgRW1iZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXkn
KTsKLQotICAgIHJlY29yZEFycmF5LmxvYWQocGF5bG9hZCk7Ci0gICAgcmV0dXJuIHJlY29yZEFy
cmF5OwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBvZiBmaW5kUXVlcnkgIiArIHR5
cGUpOwotfQotCi1mdW5jdGlvbiBfY29tbWl0KGFkYXB0ZXIsIHN0b3JlLCBvcGVyYXRpb24sIHJl
Y29yZCkgewotICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgIHByb21pc2Ug
PSBhZGFwdGVyW29wZXJhdGlvbl0oc3RvcmUsIHR5cGUsIHJlY29yZCksCi0gICAgICBzZXJpYWxp
emVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSk7Ci0KLSAgRW1iZXIuYXNz
ZXJ0KCJZb3VyIGFkYXB0ZXIncyAnIiArIG9wZXJhdGlvbiArICInIG1ldGhvZCBtdXN0IHJldHVy
biBhIHByb21pc2UsIGJ1dCBpdCByZXR1cm5lZCAiICsgcHJvbWlzZSwgaXNUaGVuYWJsZShwcm9t
aXNlKSk7Ci0KLSAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihwYXlsb2FkKSB7Ci0gICAg
aWYgKHBheWxvYWQpIHsgcGF5bG9hZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwg
cGF5bG9hZCwgZ2V0KHJlY29yZCwgJ2lkJyksIG9wZXJhdGlvbik7IH0KLSAgICBzdG9yZS5kaWRT
YXZlUmVjb3JkKHJlY29yZCwgcGF5bG9hZCk7Ci0gICAgcmV0dXJuIHJlY29yZDsKLSAgfSwgZnVu
Y3Rpb24ocmVhc29uKSB7Ci0gICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIERTLkludmFsaWRFcnJv
cikgewotICAgICAgc3RvcmUucmVjb3JkV2FzSW52YWxpZChyZWNvcmQsIHJlYXNvbi5lcnJvcnMp
OwotICAgIH0gZWxzZSB7Ci0gICAgICBzdG9yZS5yZWNvcmRXYXNFcnJvcihyZWNvcmQsIHJlYXNv
bik7Ci0gICAgfQotCi0gICAgdGhyb3cgcmVhc29uOwotICB9LCAiRFM6IEV4dHJhY3QgYW5kIG5v
dGlmeSBhYm91dCAiICsgb3BlcmF0aW9uICsgIiBjb21wbGV0aW9uIG9mICIgKyByZWNvcmQpOwot
fQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0
YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotLyoKLSAgVGhp
cyBmaWxlIGVuY2Fwc3VsYXRlcyB0aGUgdmFyaW91cyBzdGF0ZXMgdGhhdCBhIHJlY29yZCBjYW4g
dHJhbnNpdGlvbgotICB0aHJvdWdoIGR1cmluZyBpdHMgbGlmZWN5Y2xlLgotKi8KLS8qKgotICAj
IyMgU3RhdGUKLQotICBFYWNoIHJlY29yZCBoYXMgYSBgY3VycmVudFN0YXRlYCBwcm9wZXJ0eSB0
aGF0IGV4cGxpY2l0bHkgdHJhY2tzIHdoYXQKLSAgc3RhdGUgYSByZWNvcmQgaXMgaW4gYXQgYW55
IGdpdmVuIHRpbWUuIEZvciBpbnN0YW5jZSwgaWYgYSByZWNvcmQgaXMKLSAgbmV3bHkgY3JlYXRl
ZCBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLAot
ICBpdCB3b3VsZCBiZSBpbiB0aGUgYHJvb3QubG9hZGVkLmNyZWF0ZWQudW5jb21taXR0ZWRgIHN0
YXRlLiAgSWYgYQotICByZWNvcmQgaGFzIGhhZCBsb2NhbCBtb2RpZmljYXRpb25zIG1hZGUgdG8g
aXQgdGhhdCBhcmUgaW4gdGhlCi0gIHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSByZWNvcmQg
d291bGQgYmUgaW4gdGhlCi0gIGByb290LmxvYWRlZC51cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4g
KFRoZXNlIHN0YXRlIHBhdGhzIHdpbGwgYmUKLSAgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJl
bG93LikKLQotICBFdmVudHMgYXJlIHNlbnQgYnkgdGhlIHJlY29yZCBvciBpdHMgc3RvcmUgdG8g
dGhlIHJlY29yZCdzCi0gIGBjdXJyZW50U3RhdGVgIHByb3BlcnR5LiBIb3cgdGhlIHN0YXRlIHJl
YWN0cyB0byB0aGVzZSBldmVudHMgaXMKLSAgZGVwZW5kZW50IG9uIHdoaWNoIHN0YXRlIGl0IGlz
IGluLiBJbiBzb21lIHN0YXRlcywgY2VydGFpbiBldmVudHMKLSAgd2lsbCBiZSBpbnZhbGlkIGFu
ZCB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCi0KLSAgU3RhdGVzIGFyZSBo
aWVyYXJjaGljYWwgYW5kIGV2ZXJ5IHN0YXRlIGlzIGEgc3Vic3RhdGUgb2YgdGhlCi0gIGBSb290
U3RhdGVgLiBGb3IgZXhhbXBsZSwgYSByZWNvcmQgY2FuIGJlIGluIHRoZQotICBgcm9vdC5kZWxl
dGVkLnVuY29tbWl0dGVkYCBzdGF0ZSwgdGhlbiB0cmFuc2l0aW9uIGludG8gdGhlCi0gIGByb290
LmRlbGV0ZWQuaW5GbGlnaHRgIHN0YXRlLiBJZiBhIGNoaWxkIHN0YXRlIGRvZXMgbm90IGltcGxl
bWVudAotICBhbiBldmVudCBoYW5kbGVyLCB0aGUgc3RhdGUgbWFuYWdlciB3aWxsIGF0dGVtcHQg
dG8gaW52b2tlIHRoZSBldmVudAotICBvbiBhbGwgcGFyZW50IHN0YXRlcyB1bnRpbCB0aGUgcm9v
dCBzdGF0ZSBpcyByZWFjaGVkLiBUaGUgc3RhdGUKLSAgaGllcmFyY2h5IG9mIGEgcmVjb3JkIGlz
IGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBhIHBhdGggc3RyaW5nLiBZb3UKLSAgY2FuIGRldGVybWlu
ZSBhIHJlY29yZCdzIGN1cnJlbnQgc3RhdGUgYnkgZ2V0dGluZyB0aGUgc3RhdGUncwotICBgc3Rh
dGVOYW1lYCBwcm9wZXJ0eToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHJlY29yZC5nZXQoJ2N1cnJl
bnRTdGF0ZS5zdGF0ZU5hbWUnKTsKLSAgLy89PiAicm9vdC5jcmVhdGVkLnVuY29tbWl0dGVkIgot
ICAgYGBgCi0KLSAgVGhlIGhpZXJhcmNoeSBvZiB2YWxpZCBzdGF0ZXMgdGhhdCBzaGlwIHdpdGgg
ZW1iZXIgZGF0YSBsb29rcyBsaWtlCi0gIHRoaXM6Ci0KLSAgYGBgdGV4dAotICAqIHJvb3QKLSAg
ICAqIGRlbGV0ZWQKLSAgICAgICogc2F2ZWQKLSAgICAgICogdW5jb21taXR0ZWQKLSAgICAgICog
aW5GbGlnaHQKLSAgICAqIGVtcHR5Ci0gICAgKiBsb2FkZWQKLSAgICAgICogY3JlYXRlZAotICAg
ICAgICAqIHVuY29tbWl0dGVkCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAgICogc2F2ZWQKLSAg
ICAgICogdXBkYXRlZAotICAgICAgICAqIHVuY29tbWl0dGVkCi0gICAgICAgICogaW5GbGlnaHQK
LSAgICAqIGxvYWRpbmcKLSAgYGBgCi0KLSAgVGhlIGBEUy5Nb2RlbGAgc3RhdGVzIGFyZSB0aGVt
c2VsdmVzIHN0YXRlbGVzcy4gV2hhdCB3ZSBtZWFuIGlzCi0gIHRoYXQsIHRoZSBoaWVyYXJjaGlj
YWwgc3RhdGVzIHRoYXQgZWFjaCBvZiAqdGhvc2UqIHBvaW50cyB0byBpcyBhCi0gIHNoYXJlZCBk
YXRhIHN0cnVjdHVyZS4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGluc3RlYWQgb2YgZWFjaAot
ICByZWNvcmQgZ2V0dGluZyBpdHMgb3duIGNvcHkgb2YgdGhlIGhpZXJhcmNoeSBvZiBzdGF0ZXMs
IGVhY2ggcmVjb3JkCi0gIHBvaW50cyB0byB0aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBp
bnN0YW5jZS4gSG93IGRvZXMgYSBzdGF0ZQotICBrbm93IHdoaWNoIHJlY29yZCBpdCBzaG91bGQg
YmUgYWN0aW5nIG9uPyBXZSBwYXNzIHRoZSByZWNvcmQKLSAgaW5zdGFuY2UgaW50byB0aGUgc3Rh
dGUncyBldmVudCBoYW5kbGVycyBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0KLSAgVGhlIHJlY29y
ZCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB3aGVyZSB5b3Ugc2hvdWxkIHN0YXNo
Ci0gIHN0YXRlIGFib3V0IHRoZSByZWNvcmQgaWYgbmVlZGVkOyB5b3Ugc2hvdWxkIG5ldmVyIHN0
b3JlIGRhdGEgb24gdGhlIHN0YXRlCi0gIG9iamVjdCBpdHNlbGYuCi0KLSAgIyMjIEV2ZW50cyBh
bmQgRmxhZ3MKLQotICBBIHN0YXRlIG1heSBpbXBsZW1lbnQgemVybyBvciBtb3JlIGV2ZW50cyBh
bmQgZmxhZ3MuCi0KLSAgIyMjIyBFdmVudHMKLQotICBFdmVudHMgYXJlIG5hbWVkIGZ1bmN0aW9u
cyB0aGF0IGFyZSBpbnZva2VkIHdoZW4gc2VudCB0byBhIHJlY29yZC4gVGhlCi0gIHJlY29yZCB3
aWxsIGZpcnN0IGxvb2sgZm9yIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgb24gdGhlCi0g
IGN1cnJlbnQgc3RhdGUuIElmIG5vIG1ldGhvZCBpcyBmb3VuZCwgaXQgd2lsbCBzZWFyY2ggdGhl
IGN1cnJlbnQKLSAgc3RhdGUncyBwYXJlbnQsIGFuZCB0aGVuIGl0cyBncmFuZHBhcmVudCwgYW5k
IHNvIG9uIHVudGlsIHJlYWNoaW5nCi0gIHRoZSB0b3Agb2YgdGhlIGhpZXJhcmNoeS4gSWYgdGhl
IHJvb3QgaXMgcmVhY2hlZCB3aXRob3V0IGFuIGV2ZW50Ci0gIGhhbmRsZXIgYmVpbmcgZm91bmQs
IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4gVGhpcyBjYW4gYmUgdmVyeQotICBoZWxwZnVs
IHdoZW4gZGVidWdnaW5nIG5ldyBmZWF0dXJlcy4KLQotICBIZXJlJ3MgYW4gZXhhbXBsZSBpbXBs
ZW1lbnRhdGlvbiBvZiBhIHN0YXRlIHdpdGggYSBgbXlFdmVudGAgZXZlbnQgaGFuZGxlcjoKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIGFTdGF0ZTogRFMuU3RhdGUuY3JlYXRlKHsKLSAgICBteUV2ZW50
OiBmdW5jdGlvbihtYW5hZ2VyLCBwYXJhbSkgewotICAgICAgY29uc29sZS5sb2coIlJlY2VpdmVk
IG15RXZlbnQgd2l0aCIsIHBhcmFtKTsKLSAgICB9Ci0gIH0pCi0gIGBgYAotCi0gIFRvIHRyaWdn
ZXIgdGhpcyBldmVudDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHJlY29yZC5zZW5kKCdteUV2ZW50
JywgJ2ZvbycpOwotICAvLz0+ICJSZWNlaXZlZCBteUV2ZW50IHdpdGggZm9vIgotICBgYGAKLQot
ICBOb3RlIHRoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGNhbiBiZSBzZW50IHRvIGEgcmVjb3Jk
J3MgYHNlbmQoKWAgbWV0aG9kLAotICB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25k
IHBhcmFtZXRlciB0byB0aGUgZXZlbnQgaGFuZGxlci4KLQotICBFdmVudHMgc2hvdWxkIHRyYW5z
aXRpb24gdG8gYSBkaWZmZXJlbnQgc3RhdGUgaWYgYXBwcm9wcmlhdGUuIFRoaXMgY2FuIGJlCi0g
IGRvbmUgYnkgY2FsbGluZyB0aGUgcmVjb3JkJ3MgYHRyYW5zaXRpb25UbygpYCBtZXRob2Qgd2l0
aCBhIHBhdGggdG8gdGhlCi0gIGRlc2lyZWQgc3RhdGUuIFRoZSBzdGF0ZSBtYW5hZ2VyIHdpbGwg
YXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzdGF0ZSBwYXRoCi0gIHJlbGF0aXZlIHRvIHRoZSBjdXJy
ZW50IHN0YXRlLiBJZiBubyBzdGF0ZSBpcyBmb3VuZCBhdCB0aGF0IHBhdGgsIGl0IHdpbGwKLSAg
YXR0ZW1wdCB0byByZXNvbHZlIGl0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlJ3MgcGFy
ZW50LCBhbmQgdGhlbiBpdHMKLSAgcGFyZW50LCBhbmQgc28gb24gdW50aWwgdGhlIHJvb3QgaXMg
cmVhY2hlZC4gRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBoaWVyYXJjaHkKLSAgbGlrZSB0aGlzOgot
Ci0gICAgICAqIGNyZWF0ZWQKLSAgICAgICAgKiB1bmNvbW1pdHRlZCA8LS0gY3VycmVudFN0YXRl
Ci0gICAgICAgICogaW5GbGlnaHQKLSAgICAgICogdXBkYXRlZAotICAgICAgICAqIGluRmxpZ2h0
Ci0KLSAgSWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgYHVuY29tbWl0dGVkYCBzdGF0ZSwgY2Fs
bGluZwotICBgdHJhbnNpdGlvblRvKCdpbkZsaWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvIHRo
ZSBgY3JlYXRlZC5pbkZsaWdodGAgc3RhdGUsCi0gIHdoaWxlIGNhbGxpbmcgYHRyYW5zaXRpb25U
bygndXBkYXRlZC5pbkZsaWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvCi0gIHRoZSBgdXBkYXRl
ZC5pbkZsaWdodGAgc3RhdGUuCi0KLSAgUmVtZW1iZXIgdGhhdCAqb25seSBldmVudHMqIHNob3Vs
ZCBldmVyIGNhdXNlIGEgc3RhdGUgdHJhbnNpdGlvbi4gWW91IHNob3VsZAotICBuZXZlciBjYWxs
IGB0cmFuc2l0aW9uVG8oKWAgZnJvbSBvdXRzaWRlIGEgc3RhdGUncyBldmVudCBoYW5kbGVyLiBJ
ZiB5b3UgYXJlCi0gIHRlbXB0ZWQgdG8gZG8gc28sIGNyZWF0ZSBhIG5ldyBldmVudCBhbmQgc2Vu
ZCB0aGF0IHRvIHRoZSBzdGF0ZSBtYW5hZ2VyLgotCi0gICMjIyMgRmxhZ3MKLQotICBGbGFncyBh
cmUgQm9vbGVhbiB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRyb3NwZWN0IGEgcmVjb3Jk
J3MgY3VycmVudAotICBzdGF0ZSBpbiBhIG1vcmUgdXNlci1mcmllbmRseSB3YXkgdGhhbiBleGFt
aW5pbmcgaXRzIHN0YXRlIHBhdGguIEZvciBleGFtcGxlLAotICBpbnN0ZWFkIG9mIGRvaW5nIHRo
aXM6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgc3RhdGVQYXRoID0gcmVjb3JkLmdldCgnc3Rh
dGVNYW5hZ2VyLmN1cnJlbnRQYXRoJyk7Ci0gIGlmIChzdGF0ZVBhdGggPT09ICdjcmVhdGVkLmlu
RmxpZ2h0JykgewotICAgIGRvU29tZXRoaW5nKCk7Ci0gIH0KLSAgYGBgCi0KLSAgWW91IGNhbiBz
YXk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBpZiAocmVjb3JkLmdldCgnaXNOZXcnKSAmJiByZWNv
cmQuZ2V0KCdpc1NhdmluZycpKSB7Ci0gICAgZG9Tb21ldGhpbmcoKTsKLSAgfQotICBgYGAKLQot
ICBJZiB5b3VyIHN0YXRlIGRvZXMgbm90IHNldCBhIHZhbHVlIGZvciBhIGdpdmVuIGZsYWcsIHRo
ZSB2YWx1ZSB3aWxsCi0gIGJlIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgKG9yIHRoZSBmaXJz
dCBwbGFjZSBpbiB0aGUgc3RhdGUgaGllcmFyY2h5Ci0gIHdoZXJlIGl0IGlzIGRlZmluZWQpLgot
Ci0gIFRoZSBjdXJyZW50IHNldCBvZiBmbGFncyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91IHdh
bnQgdG8gYWRkIGEgbmV3IGZsYWcsCi0gIGluIGFkZGl0aW9uIHRvIHRoZSBhcmVhIGJlbG93LCB5
b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGVjbGFyZSBpdCBpbiB0aGUKLSAgYERTLk1vZGVsYCBjbGFz
cy4KLQotCi0gICAqIFtpc0VtcHR5XShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lzRW1wdHkpCi0g
ICAqIFtpc0xvYWRpbmddKERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNMb2FkaW5nKQotICAgKiBb
aXNMb2FkZWRdKERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNMb2FkZWQpCi0gICAqIFtpc0RpcnR5
XShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lzRGlydHkpCi0gICAqIFtpc1NhdmluZ10oRFMuTW9k
ZWwuaHRtbCNwcm9wZXJ0eV9pc1NhdmluZykKLSAgICogW2lzRGVsZXRlZF0oRFMuTW9kZWwuaHRt
bCNwcm9wZXJ0eV9pc0RlbGV0ZWQpCi0gICAqIFtpc05ld10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0
eV9pc05ldykKLSAgICogW2lzVmFsaWRdKERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNWYWxpZCkK
LQotICBAbmFtZXNwYWNlIERTCi0gIEBjbGFzcyBSb290U3RhdGUKLSovCi0KLXZhciBoYXNEZWZp
bmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG9iamVjdCkgewotICAvLyBJZ25vcmUgaW50ZXJuYWwg
cHJvcGVydHkgZGVmaW5lZCBieSBzaW11bGF0ZWQgYEVtYmVyLmNyZWF0ZWAuCi0gIHZhciBuYW1l
cyA9IEVtYmVyLmtleXMob2JqZWN0KTsKLSAgdmFyIGksIGwsIG5hbWU7Ci0gIGZvciAoaSA9IDAs
IGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7Ci0gICAgbmFtZSA9IG5hbWVzW2ldOwot
ICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgb2JqZWN0W25hbWVdKSB7IHJl
dHVybiB0cnVlOyB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19OwotCi12YXIgZGlkU2V0UHJv
cGVydHkgPSBmdW5jdGlvbihyZWNvcmQsIGNvbnRleHQpIHsKLSAgaWYgKGNvbnRleHQudmFsdWUg
PT09IGNvbnRleHQub3JpZ2luYWxWYWx1ZSkgewotICAgIGRlbGV0ZSByZWNvcmQuX2F0dHJpYnV0
ZXNbY29udGV4dC5uYW1lXTsKLSAgICByZWNvcmQuc2VuZCgncHJvcGVydHlXYXNSZXNldCcsIGNv
bnRleHQubmFtZSk7Ci0gIH0gZWxzZSBpZiAoY29udGV4dC52YWx1ZSAhPT0gY29udGV4dC5vbGRW
YWx1ZSkgewotICAgIHJlY29yZC5zZW5kKCdiZWNvbWVEaXJ0eScpOwotICB9Ci0KLSAgcmVjb3Jk
LnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci19OwotCi0vLyBJbXBsZW1lbnRhdGlvbiBub3Rl
czoKLS8vCi0vLyBFYWNoIHN0YXRlIGhhcyBhIGJvb2xlYW4gdmFsdWUgZm9yIGFsbCBvZiB0aGUg
Zm9sbG93aW5nIGZsYWdzOgotLy8KLS8vICogaXNMb2FkZWQ6IFRoZSByZWNvcmQgaGFzIGEgcG9w
dWxhdGVkIGBkYXRhYCBwcm9wZXJ0eS4gV2hlbiBhCi0vLyAgIHJlY29yZCBpcyBsb2FkZWQgdmlh
IGBzdG9yZS5maW5kYCwgYGlzTG9hZGVkYCBpcyBmYWxzZQotLy8gICB1bnRpbCB0aGUgYWRhcHRl
ciBzZXRzIGl0LiBXaGVuIGEgcmVjb3JkIGlzIGNyZWF0ZWQgbG9jYWxseSwKLS8vICAgaXRzIGBp
c0xvYWRlZGAgcHJvcGVydHkgaXMgYWx3YXlzIHRydWUuCi0vLyAqIGlzRGlydHk6IFRoZSByZWNv
cmQgaGFzIGxvY2FsIGNoYW5nZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgotLy8gICBzYXZlZCBi
eSB0aGUgYWRhcHRlci4gVGhpcyBpbmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCi0vLyAg
IGNyZWF0ZWQgKGJ1dCBub3QgeWV0IHNhdmVkKSBvciBkZWxldGVkLgotLy8gKiBpc1NhdmluZzog
VGhlIHJlY29yZCBoYXMgYmVlbiBjb21taXR0ZWQsIGJ1dAotLy8gICB0aGUgYWRhcHRlciBoYXMg
bm90IHlldCBhY2tub3dsZWRnZWQgdGhhdCB0aGUgY2hhbmdlcyBoYXZlCi0vLyAgIGJlZW4gcGVy
c2lzdGVkIHRvIHRoZSBiYWNrZW5kLgotLy8gKiBpc0RlbGV0ZWQ6IFRoZSByZWNvcmQgd2FzIG1h
cmtlZCBmb3IgZGVsZXRpb24uIFdoZW4gYGlzRGVsZXRlZGAKLS8vICAgaXMgdHJ1ZSBhbmQgYGlz
RGlydHlgIGlzIHRydWUsIHRoZSByZWNvcmQgaXMgZGVsZXRlZCBsb2NhbGx5Ci0vLyAgIGJ1dCB0
aGUgZGVsZXRpb24gd2FzIG5vdCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMKLS8v
ICAgdHJ1ZSwgdGhlIGNoYW5nZSBpcyBpbi1mbGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0eWAgYW5k
Ci0vLyAgIGBpc1NhdmluZ2AgYXJlIGZhbHNlLCB0aGUgY2hhbmdlIGhhcyBwZXJzaXN0ZWQuCi0v
LyAqIGlzRXJyb3I6IFRoZSBhZGFwdGVyIHJlcG9ydGVkIHRoYXQgaXQgd2FzIHVuYWJsZSB0byBz
YXZlCi0vLyAgIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVz
dWx0IGluIHRoZQotLy8gICByZWNvcmQgaGF2aW5nIGl0cyBgaXNWYWxpZGAgcHJvcGVydHkgYmVj
b21lIGZhbHNlIGlmIHRoZQotLy8gICBhZGFwdGVyIHJlcG9ydGVkIHRoYXQgc2VydmVyLXNpZGUg
dmFsaWRhdGlvbnMgZmFpbGVkLgotLy8gKiBpc05ldzogVGhlIHJlY29yZCB3YXMgY3JlYXRlZCBv
biB0aGUgY2xpZW50IGFuZCB0aGUgYWRhcHRlcgotLy8gICBkaWQgbm90IHlldCByZXBvcnQgdGhh
dCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLgotLy8gKiBpc1ZhbGlkOiBObyBjbGllbnQtc2lk
ZSB2YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCBhbmQgdGhlCi0vLyAgIGFkYXB0ZXIgZGlkIG5vdCBy
ZXBvcnQgYW55IHNlcnZlci1zaWRlIHZhbGlkYXRpb24gZmFpbHVyZXMuCi0KLS8vIFRoZSBkaXJ0
eSBzdGF0ZSBpcyBhIGFic3RyYWN0IHN0YXRlIHdob3NlIGZ1bmN0aW9uYWxpdHkgaXMKLS8vIHNo
YXJlZCBiZXR3ZWVuIHRoZSBgY3JlYXRlZGAgYW5kIGB1cGRhdGVkYCBzdGF0ZXMuCi0vLwotLy8g
VGhlIGRlbGV0ZWQgc3RhdGUgc2hhcmVzIHRoZSBgaXNEaXJ0eWAgZmxhZyB3aXRoIHRoZQotLy8g
c3ViY2xhc3NlcyBvZiBgRGlydHlTdGF0ZWAsIGJ1dCB3aXRoIGEgdmVyeSBkaWZmZXJlbnQKLS8v
IGltcGxlbWVudGF0aW9uLgotLy8KLS8vIERpcnR5IHN0YXRlcyBoYXZlIHRocmVlIGNoaWxkIHN0
YXRlczoKLS8vCi0vLyBgdW5jb21taXR0ZWRgOiB0aGUgc3RvcmUgaGFzIG5vdCB5ZXQgaGFuZGVk
IG9mZiB0aGUgcmVjb3JkCi0vLyAgIHRvIGJlIHNhdmVkLgotLy8gYGluRmxpZ2h0YDogdGhlIHN0
b3JlIGhhcyBoYW5kZWQgb2ZmIHRoZSByZWNvcmQgdG8gYmUgc2F2ZWQsCi0vLyAgIGJ1dCB0aGUg
YWRhcHRlciBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgc3VjY2Vzcy4KLS8vIGBpbnZhbGlkYDog
dGhlIHJlY29yZCBoYXMgaW52YWxpZCBpbmZvcm1hdGlvbiBhbmQgY2Fubm90IGJlCi0vLyAgIHNl
bmQgdG8gdGhlIGFkYXB0ZXIgeWV0LgotdmFyIERpcnR5U3RhdGUgPSB7Ci0gIGluaXRpYWxTdGF0
ZTogJ3VuY29tbWl0dGVkJywKLQotICAvLyBGTEFHUwotICBpc0RpcnR5OiB0cnVlLAotCi0gIC8v
IFNVQlNUQVRFUwotCi0gIC8vIFdoZW4gYSByZWNvcmQgZmlyc3QgYmVjb21lcyBkaXJ0eSwgaXQg
aXMgYHVuY29tbWl0dGVkYC4KLSAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBsb2NhbCBw
ZW5kaW5nIGNoYW5nZXMsIGJ1dCB0aGV5Ci0gIC8vIGhhdmUgbm90IHlldCBiZWd1biB0byBiZSBz
YXZlZCwgYW5kIGFyZSBub3QgaW52YWxpZC4KLSAgdW5jb21taXR0ZWQ6IHsKLSAgICAvLyBFVkVO
VFMKLSAgICBkaWRTZXRQcm9wZXJ0eTogZGlkU2V0UHJvcGVydHksCi0KLSAgICBwcm9wZXJ0eVdh
c1Jlc2V0OiBmdW5jdGlvbihyZWNvcmQsIG5hbWUpIHsKLSAgICAgIHZhciBzdGlsbERpcnR5ID0g
ZmFsc2U7Ci0KLSAgICAgIGZvciAodmFyIHByb3AgaW4gcmVjb3JkLl9hdHRyaWJ1dGVzKSB7Ci0g
ICAgICAgIHN0aWxsRGlydHkgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAg
ICAgaWYgKCFzdGlsbERpcnR5KSB7IHJlY29yZC5zZW5kKCdyb2xsZWRCYWNrJyk7IH0KLSAgICB9
LAotCi0gICAgcHVzaGVkRGF0YTogRW1iZXIuSywKLQotICAgIGJlY29tZURpcnR5OiBFbWJlci5L
LAotCi0gICAgd2lsbENvbW1pdDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJh
bnNpdGlvblRvKCdpbkZsaWdodCcpOwotICAgIH0sCi0KLSAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0
aW9uKHJlY29yZCwgcmVzb2x2ZSkgewotICAgICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUn
KS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0gICAgfSwKLQotICAgIHJvbGxlZEJhY2s6IGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnbG9hZGVkLnNhdmVkJyk7
Ci0gICAgfSwKLQotICAgIGJlY2FtZUludmFsaWQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAg
cmVjb3JkLnRyYW5zaXRpb25UbygnaW52YWxpZCcpOwotICAgIH0sCi0KLSAgICByb2xsYmFjazog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQucm9sbGJhY2soKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgLy8gT25jZSBhIHJlY29yZCBoYXMgYmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBhZGFwdGVy
IHRvIGJlCi0gIC8vIHNhdmVkLCBpdCBpcyBpbiB0aGUgJ2luIGZsaWdodCcgc3RhdGUuIENoYW5n
ZXMgdG8gdGhlCi0gIC8vIHJlY29yZCBjYW5ub3QgYmUgbWFkZSBkdXJpbmcgdGhpcyB3aW5kb3cu
Ci0gIGluRmxpZ2h0OiB7Ci0gICAgLy8gRkxBR1MKLSAgICBpc1NhdmluZzogdHJ1ZSwKLQotICAg
IC8vIEVWRU5UUwotICAgIGRpZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0eSwKLSAgICBiZWNv
bWVEaXJ0eTogRW1iZXIuSywKLSAgICBwdXNoZWREYXRhOiBFbWJlci5LLAotCi0gICAgLy8gVE9E
TzogTW9yZSByb2J1c3Qgc2VtYW50aWNzIGFyb3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAotICAg
IHdpbGxDb21taXQ6IEVtYmVyLkssCi0KLSAgICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29yZCkg
ewotICAgICAgdmFyIGRpcnR5VHlwZSA9IGdldCh0aGlzLCAnZGlydHlUeXBlJyk7Ci0KLSAgICAg
IHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVkJyk7Ci0gICAgICByZWNvcmQuc2VuZCgnaW52b2tl
TGlmZWN5Y2xlQ2FsbGJhY2tzJywgZGlydHlUeXBlKTsKLSAgICB9LAotCi0gICAgYmVjYW1lSW52
YWxpZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbnZh
bGlkJyk7Ci0gICAgICByZWNvcmQuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJyk7Ci0g
ICAgfSwKLQotICAgIGJlY2FtZUVycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29y
ZC50cmFuc2l0aW9uVG8oJ3VuY29tbWl0dGVkJyk7Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVy
KCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0gICAgfQotICB9LAotCi0gIC8vIEEgcmVjb3JkIGlz
IGluIHRoZSBgaW52YWxpZGAgc3RhdGUgd2hlbiBpdHMgY2xpZW50LXNpZGUKLSAgLy8gaW52YWxp
ZGF0aW9ucyBoYXZlIGZhaWxlZCwgb3IgaWYgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZAotICAv
LyB0aGUgdGhlIHJlY29yZCBmYWlsZWQgc2VydmVyLXNpZGUgaW52YWxpZGF0aW9ucy4KLSAgaW52
YWxpZDogewotICAgIC8vIEZMQUdTCi0gICAgaXNWYWxpZDogZmFsc2UsCi0KLSAgICAvLyBFVkVO
VFMKLSAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRy
YW5zaXRpb25UbygnZGVsZXRlZC51bmNvbW1pdHRlZCcpOwotICAgICAgcmVjb3JkLmNsZWFyUmVs
YXRpb25zaGlwcygpOwotICAgIH0sCi0KLSAgICBkaWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24ocmVj
b3JkLCBjb250ZXh0KSB7Ci0gICAgICBnZXQocmVjb3JkLCAnZXJyb3JzJykucmVtb3ZlKGNvbnRl
eHQubmFtZSk7Ci0KLSAgICAgIGRpZFNldFByb3BlcnR5KHJlY29yZCwgY29udGV4dCk7Ci0gICAg
fSwKLQotICAgIGJlY29tZURpcnR5OiBFbWJlci5LLAotCi0gICAgcm9sbGVkQmFjazogZnVuY3Rp
b24ocmVjb3JkKSB7Ci0gICAgICBnZXQocmVjb3JkLCAnZXJyb3JzJykuY2xlYXIoKTsKLSAgICB9
LAotCi0gICAgYmVjYW1lVmFsaWQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRy
YW5zaXRpb25UbygndW5jb21taXR0ZWQnKTsKLSAgICB9LAotCi0gICAgaW52b2tlTGlmZWN5Y2xl
Q2FsbGJhY2tzOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIo
J2JlY2FtZUludmFsaWQnLCByZWNvcmQpOwotICAgIH0KLSAgfQotfTsKLQotLy8gVGhlIGNyZWF0
ZWQgYW5kIHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIG91dHNpZGUgdGhlIHN0YXRlCi0vLyBj
aGFydCBzbyB3ZSBjYW4gcmVvcGVuIHRoZWlyIHN1YnN0YXRlcyBhbmQgYWRkIG1peGlucyBhcwot
Ly8gbmVjZXNzYXJ5LgotCi1mdW5jdGlvbiBkZWVwQ2xvbmUob2JqZWN0KSB7Ci0gIHZhciBjbG9u
ZSA9IHt9LCB2YWx1ZTsKLQotICBmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgewotICAgIHZhbHVl
ID0gb2JqZWN0W3Byb3BdOwotICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmpl
Y3QnKSB7Ci0gICAgICBjbG9uZVtwcm9wXSA9IGRlZXBDbG9uZSh2YWx1ZSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIGNsb25lW3Byb3BdID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNs
b25lOwotfQotCi1mdW5jdGlvbiBtaXhpbihvcmlnaW5hbCwgaGFzaCkgewotICBmb3IgKHZhciBw
cm9wIGluIGhhc2gpIHsKLSAgICBvcmlnaW5hbFtwcm9wXSA9IGhhc2hbcHJvcF07Ci0gIH0KLQot
ICByZXR1cm4gb3JpZ2luYWw7Ci19Ci0KLWZ1bmN0aW9uIGRpcnR5U3RhdGUob3B0aW9ucykgewot
ICB2YXIgbmV3U3RhdGUgPSBkZWVwQ2xvbmUoRGlydHlTdGF0ZSk7Ci0gIHJldHVybiBtaXhpbihu
ZXdTdGF0ZSwgb3B0aW9ucyk7Ci19Ci0KLXZhciBjcmVhdGVkU3RhdGUgPSBkaXJ0eVN0YXRlKHsK
LSAgZGlydHlUeXBlOiAnY3JlYXRlZCcsCi0KLSAgLy8gRkxBR1MKLSAgaXNOZXc6IHRydWUKLX0p
OwotCi1jcmVhdGVkU3RhdGUudW5jb21taXR0ZWQucm9sbGVkQmFjayA9IGZ1bmN0aW9uKHJlY29y
ZCkgewotICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnNhdmVkJyk7Ci19OwotCi12YXIg
dXBkYXRlZFN0YXRlID0gZGlydHlTdGF0ZSh7Ci0gIGRpcnR5VHlwZTogJ3VwZGF0ZWQnCi19KTsK
LQotY3JlYXRlZFN0YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29y
ZCkgewotICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBzKCk7Ci0gIHJlY29yZC50cmFuc2l0aW9u
VG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLX07Ci0KLWNyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5yb2xs
YmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgewotICBEaXJ0eVN0YXRlLnVuY29tbWl0dGVkLnJvbGxi
YWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0
ZWQuc2F2ZWQnKTsKLX07Ci0KLWNyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5wcm9wZXJ0eVdhc1Jl
c2V0ID0gRW1iZXIuSzsKLQotdXBkYXRlZFN0YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9
IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29t
bWl0dGVkJyk7Ci0gIHJlY29yZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKLX07Ci0KLXZhciBSb290
U3RhdGUgPSB7Ci0gIC8vIEZMQUdTCi0gIGlzRW1wdHk6IGZhbHNlLAotICBpc0xvYWRpbmc6IGZh
bHNlLAotICBpc0xvYWRlZDogZmFsc2UsCi0gIGlzRGlydHk6IGZhbHNlLAotICBpc1NhdmluZzog
ZmFsc2UsCi0gIGlzRGVsZXRlZDogZmFsc2UsCi0gIGlzTmV3OiBmYWxzZSwKLSAgaXNWYWxpZDog
dHJ1ZSwKLQotICAvLyBERUZBVUxUIEVWRU5UUwotCi0gIC8vIFRyeWluZyB0byByb2xsIGJhY2sg
aWYgeW91J3JlIG5vdCBpbiB0aGUgZGlydHkgc3RhdGUKLSAgLy8gZG9lc24ndCBjaGFuZ2UgeW91
ciBzdGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSBpbiB0aGUKLSAgLy8gaW4tZmxpZ2h0IHN0
YXRlLCByb2xsaW5nIGJhY2sgdGhlIHJlY29yZCBkb2Vzbid0IG1vdmUKLSAgLy8geW91IG91dCBv
ZiB0aGUgaW4tZmxpZ2h0IHN0YXRlLgotICByb2xsZWRCYWNrOiBFbWJlci5LLAotCi0gIHByb3Bl
cnR5V2FzUmVzZXQ6IEVtYmVyLkssCi0KLSAgLy8gU1VCU1RBVEVTCi0KLSAgLy8gQSByZWNvcmQg
YmVnaW5zIGl0cyBsaWZlY3ljbGUgaW4gdGhlIGBlbXB0eWAgc3RhdGUuCi0gIC8vIElmIGl0cyBk
YXRhIHdpbGwgY29tZSBmcm9tIHRoZSBhZGFwdGVyLCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24g
aW50byB0aGUgYGxvYWRpbmdgIHN0YXRlLiBPdGhlcndpc2UsIGlmCi0gIC8vIHRoZSByZWNvcmQg
aXMgYmVpbmcgY3JlYXRlZCBvbiB0aGUgY2xpZW50LCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24g
aW50byB0aGUgYGNyZWF0ZWRgIHN0YXRlLgotICBlbXB0eTogewotICAgIGlzRW1wdHk6IHRydWUs
Ci0KLSAgICAvLyBFVkVOVFMKLSAgICBsb2FkaW5nRGF0YTogZnVuY3Rpb24ocmVjb3JkLCBwcm9t
aXNlKSB7Ci0gICAgICByZWNvcmQuX2xvYWRpbmdQcm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHJl
Y29yZC50cmFuc2l0aW9uVG8oJ2xvYWRpbmcnKTsKLSAgICB9LAotCi0gICAgbG9hZGVkRGF0YTog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuY3Jl
YXRlZC51bmNvbW1pdHRlZCcpOwotCi0gICAgICByZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9i
c2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAgICAgcmVjb3JkLm5vdGlmeVByb3BlcnR5Q2hhbmdl
KCdkYXRhJyk7Ci0gICAgICB9KTsKLSAgICB9LAotCi0gICAgcHVzaGVkRGF0YTogZnVuY3Rpb24o
cmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKLSAg
ICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8g
QSByZWNvcmQgZW50ZXJzIHRoaXMgc3RhdGUgd2hlbiB0aGUgc3RvcmUgYXNrcwotICAvLyB0aGUg
YWRhcHRlciBmb3IgaXRzIGRhdGEuIEl0IHJlbWFpbnMgaW4gdGhpcyBzdGF0ZQotICAvLyB1bnRp
bCB0aGUgYWRhcHRlciBwcm92aWRlcyB0aGUgcmVxdWVzdGVkIGRhdGEuCi0gIC8vCi0gIC8vIFVz
dWFsbHksIHRoaXMgcHJvY2VzcyBpcyBhc3luY2hyb25vdXMsIHVzaW5nIGFuCi0gIC8vIFhIUiB0
byByZXRyaWV2ZSB0aGUgZGF0YS4KLSAgbG9hZGluZzogewotICAgIC8vIEZMQUdTCi0gICAgaXNM
b2FkaW5nOiB0cnVlLAotCi0gICAgZXhpdDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNv
cmQuX2xvYWRpbmdQcm9taXNlID0gbnVsbDsKLSAgICB9LAotCi0gICAgLy8gRVZFTlRTCi0gICAg
cHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRv
KCdsb2FkZWQuc2F2ZWQnKTsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsK
LSAgICAgIHNldChyZWNvcmQsICdpc0Vycm9yJywgZmFsc2UpOwotICAgIH0sCi0KLSAgICBiZWNh
bWVFcnJvcjogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdi
ZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0gICAgfSwKLQotICAgIG5vdEZvdW5kOiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2VtcHR5Jyk7Ci0gICAgfQotICB9
LAotCi0gIC8vIEEgcmVjb3JkIGVudGVycyB0aGlzIHN0YXRlIHdoZW4gaXRzIGRhdGEgaXMgcG9w
dWxhdGVkLgotICAvLyBNb3N0IG9mIGEgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lk
ZSBzdWJzdGF0ZXMKLSAgLy8gb2YgdGhlIGBsb2FkZWRgIHN0YXRlLgotICBsb2FkZWQ6IHsKLSAg
ICBpbml0aWFsU3RhdGU6ICdzYXZlZCcsCi0KLSAgICAvLyBGTEFHUwotICAgIGlzTG9hZGVkOiB0
cnVlLAotCi0gICAgLy8gU1VCU1RBVEVTCi0KLSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwg
Y2hhbmdlcyB0byBhIHJlY29yZCwgaXQgcmVtYWlucwotICAgIC8vIGluIHRoZSBgc2F2ZWRgIHN0
YXRlLgotICAgIHNhdmVkOiB7Ci0gICAgICBzZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAg
ICAgIHZhciBhdHRycyA9IHJlY29yZC5fYXR0cmlidXRlcywKLSAgICAgICAgICAgIGlzRGlydHkg
PSBmYWxzZTsKLQotICAgICAgICBmb3IgKHZhciBwcm9wIGluIGF0dHJzKSB7Ci0gICAgICAgICAg
aWYgKGF0dHJzLmhhc093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgICBpc0RpcnR5ID0g
dHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIGlmIChpc0RpcnR5KSB7Ci0gICAgICAgICAgcmVjb3JkLmFkYXB0ZXJEaWREaXJ0eSgpOwot
ICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICAvLyBFVkVOVFMKLSAgICAgIGRpZFNldFByb3Bl
cnR5OiBkaWRTZXRQcm9wZXJ0eSwKLQotICAgICAgcHVzaGVkRGF0YTogRW1iZXIuSywKLQotICAg
ICAgYmVjb21lRGlydHk6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNp
dGlvblRvKCd1cGRhdGVkLnVuY29tbWl0dGVkJyk7Ci0gICAgICB9LAotCi0gICAgICB3aWxsQ29t
bWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndXBk
YXRlZC5pbkZsaWdodCcpOwotICAgICAgfSwKLQotICAgICAgcmVsb2FkUmVjb3JkOiBmdW5jdGlv
bihyZWNvcmQsIHJlc29sdmUpIHsKLSAgICAgICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUn
KS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0gICAgICB9LAotCi0gICAgICBkZWxldGVSZWNvcmQ6
IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVk
LnVuY29tbWl0dGVkJyk7Ci0gICAgICAgIHJlY29yZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKLSAg
ICAgIH0sCi0KLSAgICAgIHVubG9hZFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAg
IC8vIGNsZWFyIHJlbGF0aW9uc2hpcHMgYmVmb3JlIG1vdmluZyB0byBkZWxldGVkIHN0YXRlCi0g
ICAgICAgIC8vIG90aGVyd2lzZSBpdCBmYWlscwotICAgICAgICByZWNvcmQuY2xlYXJSZWxhdGlv
bnNoaXBzKCk7Ci0gICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsK
LSAgICAgIH0sCi0KLSAgICAgIGRpZENvbW1pdDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAg
IHJlY29yZC5zZW5kKCdpbnZva2VMaWZlY3ljbGVDYWxsYmFja3MnLCBnZXQocmVjb3JkLCAnbGFz
dERpcnR5VHlwZScpKTsKLSAgICAgIH0sCi0KLSAgICAgIC8vIGxvYWRlZC5zYXZlZC5ub3RGb3Vu
ZCB3b3VsZCBiZSB0cmlnZ2VyZWQgYnkgYSBmYWlsZWQKLSAgICAgIC8vIGByZWxvYWQoKWAgb24g
YW4gdW5jaGFuZ2VkIHJlY29yZAotICAgICAgbm90Rm91bmQ6IEVtYmVyLksKLQotICAgIH0sCi0K
LSAgICAvLyBBIHJlY29yZCBpcyBpbiB0aGlzIHN0YXRlIGFmdGVyIGl0IGhhcyBiZWVuIGxvY2Fs
bHkKLSAgICAvLyBjcmVhdGVkIGJ1dCBiZWZvcmUgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZCB0
aGF0Ci0gICAgLy8gaXQgaGFzIGJlZW4gc2F2ZWQuCi0gICAgY3JlYXRlZDogY3JlYXRlZFN0YXRl
LAotCi0gICAgLy8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCBoYXMgYWxyZWFkeSBi
ZWVuCi0gICAgLy8gc2F2ZWQgdG8gdGhlIHNlcnZlciwgYnV0IHRoZXJlIGFyZSBuZXcgbG9jYWwg
Y2hhbmdlcwotICAgIC8vIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQuCi0gICAgdXBkYXRl
ZDogdXBkYXRlZFN0YXRlCi0gIH0sCi0KLSAgLy8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBp
ZiBpdCB3YXMgZGVsZXRlZCBmcm9tIHRoZSBzdG9yZS4KLSAgZGVsZXRlZDogewotICAgIGluaXRp
YWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKLSAgICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKLQotICAg
IC8vIEZMQUdTCi0gICAgaXNEZWxldGVkOiB0cnVlLAotICAgIGlzTG9hZGVkOiB0cnVlLAotICAg
IGlzRGlydHk6IHRydWUsCi0KLSAgICAvLyBUUkFOU0lUSU9OUwotICAgIHNldHVwOiBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKLSAgICB9LAot
Ci0gICAgLy8gU1VCU1RBVEVTCi0KLSAgICAvLyBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0ZWQsIGl0
IGVudGVycyB0aGUgYHN0YXJ0YAotICAgIC8vIHN0YXRlLiBJdCB3aWxsIGV4aXQgdGhpcyBzdGF0
ZSB3aGVuIHRoZSByZWNvcmQKLSAgICAvLyBzdGFydHMgdG8gY29tbWl0LgotICAgIHVuY29tbWl0
dGVkOiB7Ci0KLSAgICAgIC8vIEVWRU5UUwotCi0gICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnaW5GbGlnaHQnKTsKLSAgICAg
IH0sCi0KLSAgICAgIHJvbGxiYWNrOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3Jk
LnJvbGxiYWNrKCk7Ci0gICAgICB9LAotCi0gICAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLSAg
ICAgIGRlbGV0ZVJlY29yZDogRW1iZXIuSywKLQotICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24o
cmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2xvYWRlZC5zYXZlZCcpOwot
ICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBBZnRlciBhIHJlY29yZCBzdGFydHMgY29tbWl0dGlu
ZywgYnV0Ci0gICAgLy8gYmVmb3JlIHRoZSBhZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZSBkZWxl
dGlvbgotICAgIC8vIGhhcyBzYXZlZCB0byB0aGUgc2VydmVyLCBhIHJlY29yZCBpcyBpbiB0aGUK
LSAgICAvLyBgaW5GbGlnaHRgIHN1YnN0YXRlIG9mIGBkZWxldGVkYC4KLSAgICBpbkZsaWdodDog
ewotICAgICAgLy8gRkxBR1MKLSAgICAgIGlzU2F2aW5nOiB0cnVlLAotCi0gICAgICAvLyBFVkVO
VFMKLQotICAgICAgLy8gVE9ETzogTW9yZSByb2J1c3Qgc2VtYW50aWNzIGFyb3VuZCBzYXZlLXdo
aWxlLWluLWZsaWdodAotICAgICAgd2lsbENvbW1pdDogRW1iZXIuSywKLSAgICAgIGRpZENvbW1p
dDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVk
Jyk7Ci0KLSAgICAgICAgcmVjb3JkLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOwot
ICAgICAgfSwKLQotICAgICAgYmVjYW1lRXJyb3I6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAg
ICByZWNvcmQudHJhbnNpdGlvblRvKCd1bmNvbW1pdHRlZCcpOwotICAgICAgICByZWNvcmQudHJp
Z2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAg
IC8vIE9uY2UgdGhlIGFkYXB0ZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGRlbGV0aW9uIGhhcwotICAg
IC8vIGJlZW4gc2F2ZWQsIHRoZSByZWNvcmQgZW50ZXJzIHRoZSBgc2F2ZWRgIHN1YnN0YXRlCi0g
ICAgLy8gb2YgYGRlbGV0ZWRgLgotICAgIHNhdmVkOiB7Ci0gICAgICAvLyBGTEFHUwotICAgICAg
aXNEaXJ0eTogZmFsc2UsCi0KLSAgICAgIHNldHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAg
ICAgdmFyIHN0b3JlID0gZ2V0KHJlY29yZCwgJ3N0b3JlJyk7Ci0gICAgICAgIHN0b3JlLmRlbWF0
ZXJpYWxpemVSZWNvcmQocmVjb3JkKTsKLSAgICAgIH0sCi0KLSAgICAgIGludm9rZUxpZmVjeWNs
ZUNhbGxiYWNrczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC50cmlnZ2VyTGF0
ZXIoJ2RpZERlbGV0ZScsIHJlY29yZCk7Ci0gICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2Rp
ZENvbW1pdCcsIHJlY29yZCk7Ci0gICAgICB9Ci0gICAgfQotICB9LAotCi0gIGludm9rZUxpZmVj
eWNsZUNhbGxiYWNrczogZnVuY3Rpb24ocmVjb3JkLCBkaXJ0eVR5cGUpIHsKLSAgICBpZiAoZGly
dHlUeXBlID09PSAnY3JlYXRlZCcpIHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENy
ZWF0ZScsIHJlY29yZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIo
J2RpZFVwZGF0ZScsIHJlY29yZCk7Ci0gICAgfQotCi0gICAgcmVjb3JkLnRyaWdnZXJMYXRlcign
ZGlkQ29tbWl0JywgcmVjb3JkKTsKLSAgfQotfTsKLQotZnVuY3Rpb24gd2lyZVN0YXRlKG9iamVj
dCwgcGFyZW50LCBuYW1lKSB7Ci0gIC8qanNoaW50IHByb3RvOnRydWUqLwotICAvLyBUT0RPOiBV
c2UgT2JqZWN0LmNyZWF0ZSBhbmQgY29weSBpbnN0ZWFkCi0gIG9iamVjdCA9IG1peGluKHBhcmVu
dCA/IEVtYmVyLmNyZWF0ZShwYXJlbnQpIDoge30sIG9iamVjdCk7Ci0gIG9iamVjdC5wYXJlbnRT
dGF0ZSA9IHBhcmVudDsKLSAgb2JqZWN0LnN0YXRlTmFtZSA9IG5hbWU7Ci0KLSAgZm9yICh2YXIg
cHJvcCBpbiBvYmplY3QpIHsKLSAgICBpZiAoIW9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8
fCBwcm9wID09PSAncGFyZW50U3RhdGUnIHx8IHByb3AgPT09ICdzdGF0ZU5hbWUnKSB7IGNvbnRp
bnVlOyB9Ci0gICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09ICdvYmplY3QnKSB7Ci0gICAg
ICBvYmplY3RbcHJvcF0gPSB3aXJlU3RhdGUob2JqZWN0W3Byb3BdLCBvYmplY3QsIG5hbWUgKyAi
LiIgKyBwcm9wKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gb2JqZWN0OwotfQotCi1Sb290U3Rh
dGUgPSB3aXJlU3RhdGUoUm9vdFN0YXRlLCBudWxsLCAicm9vdCIpOwotCi1EUy5Sb290U3RhdGUg
PSBSb290U3RhdGU7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBpc0VtcHR5ID0gRW1iZXIuaXNFbXB0eTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyLWRh
dGEKLSovCi0KLS8qKgotICBIb2xkcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiByZWNv
cmQgb3JnYW5pemVkIGJ5IGF0dHJpYnV0ZSBuYW1lcy4KLQotICBAY2xhc3MgRXJyb3JzCi0gIEBu
YW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLkVudW1l
cmFibGUKLSAgQHVzZXMgRW1iZXIuRXZlbnRlZAotICovCi1EUy5FcnJvcnMgPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKEVtYmVyLkVudW1lcmFibGUsIEVtYmVyLkV2ZW50ZWQsIHsKLSAgLyoqCi0gICAg
UmVnaXN0ZXIgd2l0aCB0YXJnZXQgaGFuZGxlcgotCi0gICAgQG1ldGhvZCByZWdpc3RlckhhbmRs
ZXJzCi0gICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGJl
Y2FtZUludmFsaWQKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBiZWNhbWVWYWxpZAotICAqLwotICBy
ZWdpc3RlckhhbmRsZXJzOiBmdW5jdGlvbih0YXJnZXQsIGJlY2FtZUludmFsaWQsIGJlY2FtZVZh
bGlkKSB7Ci0gICAgdGhpcy5vbignYmVjYW1lSW52YWxpZCcsIHRhcmdldCwgYmVjYW1lSW52YWxp
ZCk7Ci0gICAgdGhpcy5vbignYmVjYW1lVmFsaWQnLCB0YXJnZXQsIGJlY2FtZVZhbGlkKTsKLSAg
fSwKLQotICAvKioKLSAgICBAcHJvcGVydHkgZXJyb3JzQnlBdHRyaWJ1dGVOYW1lCi0gICAgQHR5
cGUge0VtYmVyLk1hcFdpdGhEZWZhdWx0fQotICAgIEBwcml2YXRlCi0gICovCi0gIGVycm9yc0J5
QXR0cmlidXRlTmFtZTogRW1iZXIucmVkdWNlQ29tcHV0ZWQoImNvbnRlbnQiLCB7Ci0gICAgaW5p
dGlhbFZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBFbWJlci5NYXBXaXRoRGVmYXVs
dC5jcmVhdGUoewotICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgewotICAgICAgICAg
IHJldHVybiBFbWJlci5BKCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0sCi0KLSAgICBh
ZGRlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywgZXJyb3IpIHsKLSAgICAgIGVycm9ycy5nZXQoZXJy
b3IuYXR0cmlidXRlKS5wdXNoT2JqZWN0KGVycm9yKTsKLQotICAgICAgcmV0dXJuIGVycm9yczsK
LSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywgZXJyb3IpIHsKLSAg
ICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmlidXRlKS5yZW1vdmVPYmplY3QoZXJyb3IpOwotCi0g
ICAgICByZXR1cm4gZXJyb3JzOwotICAgIH0KLSAgfSksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBl
cnJvcnMgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlCi0KLSAgICBAbWV0aG9kIGVycm9yc0ZvcgotICAg
IEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUKLSAgICBAcmV0dXJucyB7QXJyYXl9Ci0gICovCi0g
IGVycm9yc0ZvcjogZnVuY3Rpb24oYXR0cmlidXRlKSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAn
ZXJyb3JzQnlBdHRyaWJ1dGVOYW1lJykuZ2V0KGF0dHJpYnV0ZSk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICovCi0gIG1lc3NhZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY29udGVudCcsICdtZXNzYWdl
JyksCi0KLSAgLyoqCi0gICAgQHByb3BlcnR5IGNvbnRlbnQKLSAgICBAdHlwZSB7QXJyYXl9Ci0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgY29udGVudDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1bmtu
b3duUHJvcGVydHkKLSAgICBAcHJpdmF0ZQotICAqLwotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0
aW9uKGF0dHJpYnV0ZSkgewotICAgIHZhciBlcnJvcnMgPSB0aGlzLmVycm9yc0ZvcihhdHRyaWJ1
dGUpOwotICAgIGlmIChpc0VtcHR5KGVycm9ycykpIHsgcmV0dXJuIG51bGw7IH0KLSAgICByZXR1
cm4gZXJyb3JzOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBw
cml2YXRlCi0gICovCi0gIG5leHRPYmplY3Q6IGZ1bmN0aW9uKGluZGV4LCBwcmV2aW91c09iamVj
dCwgY29udGV4dCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChp
bmRleCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVG90YWwgbnVtYmVyIG9mIGVycm9ycy4KLQotICAg
IEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlwZSB7TnVtYmVyfQotICAgIEByZWFkT25seQotICAq
LwotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkLm9uZVdheSgnY29udGVudC5sZW5ndGgnKS5yZWFk
T25seSgpLAotCi0gIC8qKgotICAgIEBwcm9wZXJ0eSBpc0VtcHR5Ci0gICAgQHR5cGUge0Jvb2xl
YW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzRW1wdHk6IEVtYmVyLmNvbXB1dGVkLm5vdCgn
bGVuZ3RoJykucmVhZE9ubHkoKSwKLQotICAvKioKLSAgICBBZGRzIGVycm9yIG1lc3NhZ2VzIHRv
IGEgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5kcwotICAgIGBiZWNhbWVJbnZhbGlkYCBldmVudCB0
byB0aGUgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBhZGQKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0
cmlidXRlCi0gICAgQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2VzCi0gICovCi0gIGFkZDog
ZnVuY3Rpb24oYXR0cmlidXRlLCBtZXNzYWdlcykgewotICAgIHZhciB3YXNFbXB0eSA9IGdldCh0
aGlzLCAnaXNFbXB0eScpOwotCi0gICAgbWVzc2FnZXMgPSB0aGlzLl9maW5kT3JDcmVhdGVNZXNz
YWdlcyhhdHRyaWJ1dGUsIG1lc3NhZ2VzKTsKLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRP
YmplY3RzKG1lc3NhZ2VzKTsKLQotICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmli
dXRlKTsKLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKCk7Ci0KLSAgICBpZiAo
d2FzRW1wdHkgJiYgIWdldCh0aGlzLCAnaXNFbXB0eScpKSB7Ci0gICAgICB0aGlzLnRyaWdnZXIo
J2JlY2FtZUludmFsaWQnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBfZmlu
ZE9yQ3JlYXRlTWVzc2FnZXMKLSAgICBAcHJpdmF0ZQotICAqLwotICBfZmluZE9yQ3JlYXRlTWVz
c2FnZXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZSwgbWVzc2FnZXMpIHsKLSAgICB2YXIgZXJyb3JzID0g
dGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKTsKLQotICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXko
bWVzc2FnZXMpLm1hcChmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gZXJyb3JzLmZp
bmRCeSgnbWVzc2FnZScsIG1lc3NhZ2UpIHx8IHsKLSAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1
dGUsCi0gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UKLSAgICAgIH07Ci0gICAgfSk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gYXR0
cmlidXRlIGFuZCBzZW5kcwotICAgIGBiZWNhbWVWYWxpZGAgZXZlbnQgdG8gdGhlIHJlY29yZCBp
ZiB0aGVyZSBubyBtb3JlIGVycm9ycyBsZWZ0LgotCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBA
cGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCi0gICovCi0gIHJlbW92ZTogZnVuY3Rpb24oYXR0cmli
dXRlKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNFbXB0eScpKSB7IHJldHVybjsgfQotCi0gICAg
dmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5yZWplY3RCeSgnYXR0cmlidXRlJywg
YXR0cmlidXRlKTsKLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5zZXRPYmplY3RzKGNvbnRlbnQp
OwotCi0gICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZShhdHRyaWJ1dGUpOwotICAgIHRoaXMu
ZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKTsKLQotICAgIGlmIChnZXQodGhpcywgJ2lzRW1w
dHknKSkgewotICAgICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVWYWxpZCcpOwotICAgIH0KLSAgfSwK
LQotICAvKioKLSAgICBSZW1vdmVzIGFsbCBlcnJvciBtZXNzYWdlcyBhbmQgc2VuZHMgYGJlY2Ft
ZVZhbGlkYCBldmVudAotICAgIHRvIHRoZSByZWNvcmQuCi0KLSAgICBAbWV0aG9kIGNsZWFyCi0g
ICovCi0gIGNsZWFyOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0VtcHR5Jykp
IHsgcmV0dXJuOyB9Ci0KLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5jbGVhcigpOwotICAgIHRo
aXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKTsKLQotICAgIHRoaXMudHJpZ2dlcignYmVj
YW1lVmFsaWQnKTsKLSAgfSwKLQotICAvKioKLSAgICBDaGVja3MgaWYgdGhlcmUgaXMgZXJyb3Ig
bWVzc2FnZXMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCi0KLSAgICBAbWV0aG9kIGhhcwotICAg
IEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUKLSAgICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBp
ZiB0aGVyZSBzb21lIGVycm9ycyBvbiBnaXZlbiBhdHRyaWJ1dGUKLSAgKi8KLSAgaGFzOiBmdW5j
dGlvbihhdHRyaWJ1dGUpIHsKLSAgICByZXR1cm4gIWlzRW1wdHkodGhpcy5lcnJvcnNGb3IoYXR0
cmlidXRlKSk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0g
IEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1i
ZXIuc2V0LAotICAgIG1lcmdlID0gRW1iZXIubWVyZ2U7Ci0KLXZhciByZXRyaWV2ZUZyb21DdXJy
ZW50U3RhdGUgPSBFbWJlci5jb21wdXRlZCgnY3VycmVudFN0YXRlJywgZnVuY3Rpb24oa2V5LCB2
YWx1ZSkgewotICByZXR1cm4gZ2V0KGdldCh0aGlzLCAnY3VycmVudFN0YXRlJyksIGtleSk7Ci19
KS5yZWFkT25seSgpOwotCi0vKioKLQotICBUaGUgbW9kZWwgY2xhc3MgdGhhdCBhbGwgRW1iZXIg
RGF0YSByZWNvcmRzIGRlc2NlbmQgZnJvbS4KLQotICBAY2xhc3MgTW9kZWwKLSAgQG5hbWVzcGFj
ZSBEUwotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSAgQHVzZXMgRW1iZXIuRXZlbnRlZAotKi8K
LURTLk1vZGVsID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVkLCB7Ci0gIC8qKgot
ICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBlbXB0
eWAKLSAgICBzdGF0ZS4gRW1wdHkgaXMgdGhlIGZpcnN0IHN0YXRlIGFsbCByZWNvcmRzIGVudGVy
IGFmdGVyIHRoZXkgaGF2ZQotICAgIGJlZW4gY3JlYXRlZC4gTW9zdCByZWNvcmRzIGNyZWF0ZWQg
YnkgdGhlIHN0b3JlIHdpbGwgcXVpY2tseQotICAgIHRyYW5zaXRpb24gdG8gdGhlIGBsb2FkaW5n
YCBzdGF0ZSBpZiBkYXRhIG5lZWRzIHRvIGJlIGZldGNoZWQgZnJvbQotICAgIHRoZSBzZXJ2ZXIg
b3IgdGhlIGBjcmVhdGVkYCBzdGF0ZSBpZiB0aGUgcmVjb3JkIGlzIGNyZWF0ZWQgb24gdGhlCi0g
ICAgY2xpZW50LiBBIHJlY29yZCBjYW4gYWxzbyBlbnRlciB0aGUgZW1wdHkgc3RhdGUgaWYgdGhl
IGFkYXB0ZXIgaXMKLSAgICB1bmFibGUgdG8gbG9jYXRlIHRoZSByZWNvcmQuCi0KLSAgICBAcHJv
cGVydHkgaXNFbXB0eQotICAgIEB0eXBlIHtCb29sZWFufQotICAgIEByZWFkT25seQotICAqLwot
ICBpc0VtcHR5OiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMg
cHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBsb2FkaW5nYCBzdGF0ZS4g
QQotICAgIHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIHRoZSBzdG9yZSBhc2tzIHRoZSBh
ZGFwdGVyIGZvciBpdHMKLSAgICBkYXRhLiBJdCByZW1haW5zIGluIHRoaXMgc3RhdGUgdW50aWwg
dGhlIGFkYXB0ZXIgcHJvdmlkZXMgdGhlCi0gICAgcmVxdWVzdGVkIGRhdGEuCi0KLSAgICBAcHJv
cGVydHkgaXNMb2FkaW5nCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICov
Ci0gIGlzTG9hZGluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotICAvKioKLSAgICBJZiB0
aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgbG9hZGVkYCBzdGF0
ZS4gQQotICAgIHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlzIHBvcHVs
YXRlZC4gTW9zdCBvZiBhCi0gICAgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBz
dWJzdGF0ZXMgb2YgdGhlIGBsb2FkZWRgCi0gICAgc3RhdGUuCi0KLSAgICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAu
TW9kZWwpOwotICAgIHJlY29yZC5nZXQoJ2lzTG9hZGVkJyk7IC8vIHRydWUKLQotICAgIHN0b3Jl
LmZpbmQoJ21vZGVsJywgMSkudGhlbihmdW5jdGlvbihtb2RlbCkgewotICAgICAgbW9kZWwuZ2V0
KCdpc0xvYWRlZCcpOyAvLyB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkg
aXNMb2FkZWQKLSAgICBAdHlwZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNM
b2FkZWQ6IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhpcyBwcm9w
ZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBpcyBpbiB0aGUgYGRpcnR5YCBzdGF0ZS4gVGhlCi0g
ICAgcmVjb3JkIGhhcyBsb2NhbCBjaGFuZ2VzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQg
YnkgdGhlCi0gICAgYWRhcHRlci4gVGhpcyBpbmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVu
IGNyZWF0ZWQgKGJ1dCBub3QgeWV0Ci0gICAgc2F2ZWQpIG9yIGRlbGV0ZWQuCi0KLSAgICBFeGFt
cGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJl
Y29yZChBcHAuTW9kZWwpOwotICAgIHJlY29yZC5nZXQoJ2lzRGlydHknKTsgLy8gdHJ1ZQotCi0g
ICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBt
b2RlbC5nZXQoJ2lzRGlydHknKTsgLy8gZmFsc2UKLSAgICAgIG1vZGVsLnNldCgnZm9vJywgJ3Nv
bWUgdmFsdWUnKTsKLSAgICAgIG1vZGVsLnNldCgnaXNEaXJ0eScpOyAvLyB0cnVlCi0gICAgfSk7
Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNEaXJ0eQotICAgIEB0eXBlIHtCb29sZWFufQot
ICAgIEByZWFkT25seQotICAqLwotICBpc0RpcnR5OiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUs
Ci0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4g
dGhlIGBzYXZpbmdgIHN0YXRlLiBBCi0gICAgcmVjb3JkIGVudGVycyB0aGUgc2F2aW5nIHN0YXRl
IHdoZW4gYHNhdmVgIGlzIGNhbGxlZCwgYnV0IHRoZQotICAgIGFkYXB0ZXIgaGFzIG5vdCB5ZXQg
YWNrbm93bGVkZ2VkIHRoYXQgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuCi0gICAgcGVyc2lzdGVkIHRv
IHRoZSBiYWNrZW5kLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZh
ciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBwLk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0
KCdpc1NhdmluZycpOyAvLyBmYWxzZQotICAgIHZhciBwcm9taXNlID0gcmVjb3JkLnNhdmUoKTsK
LSAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycpOyAvLyB0cnVlCi0gICAgcHJvbWlzZS50aGVuKGZ1
bmN0aW9uKCkgewotICAgICAgcmVjb3JkLmdldCgnaXNTYXZpbmcnKTsgLy8gZmFsc2UKLSAgICB9
KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBpc1NhdmluZwotICAgIEB0eXBlIHtCb29sZWFu
fQotICAgIEByZWFkT25seQotICAqLwotICBpc1NhdmluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0
YXRlLAotICAvKioKLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlz
IGluIHRoZSBgZGVsZXRlZGAgc3RhdGUKLSAgICBhbmQgaGFzIGJlZW4gbWFya2VkIGZvciBkZWxl
dGlvbi4gV2hlbiBgaXNEZWxldGVkYCBpcyB0cnVlIGFuZAotICAgIGBpc0RpcnR5YCBpcyB0cnVl
LCB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQgbG9jYWxseSBidXQgdGhlIGRlbGV0aW9uCi0gICAgd2Fz
IG5vdCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMgdHJ1ZSwgdGhlIGNoYW5nZSBp
cwotICAgIGluLWZsaWdodC4gV2hlbiBib3RoIGBpc0RpcnR5YCBhbmQgYGlzU2F2aW5nYCBhcmUg
ZmFsc2UsIHRoZQotICAgIGNoYW5nZSBoYXMgcGVyc2lzdGVkLgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBw
Lk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0KCdpc0RlbGV0ZWQnKTsgLy8gZmFsc2UKLSAgICByZWNv
cmQuZGVsZXRlUmVjb3JkKCk7Ci0gICAgcmVjb3JkLmdldCgnaXNEZWxldGVkJyk7IC8vIHRydWUK
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBpc0RlbGV0ZWQKLSAgICBAdHlwZSB7Qm9vbGVhbn0K
LSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNEZWxldGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3Rh
dGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMg
aW4gdGhlIGBuZXdgIHN0YXRlLiBBCi0gICAgcmVjb3JkIHdpbGwgYmUgaW4gdGhlIGBuZXdgIHN0
YXRlIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRlZCBvbiB0aGUKLSAgICBjbGllbnQgYW5kIHRoZSBh
ZGFwdGVyIGhhcyBub3QgeWV0IHJlcG9ydCB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkKLSAgICBz
YXZlZC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVjb3Jk
ID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnaXNOZXcn
KTsgLy8gdHJ1ZQotCi0gICAgcmVjb3JkLnNhdmUoKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0g
ICAgICBtb2RlbC5nZXQoJ2lzTmV3Jyk7IC8vIGZhbHNlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAcHJvcGVydHkgaXNOZXcKLSAgICBAdHlwZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAg
Ki8KLSAgaXNOZXc6IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhp
cyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBpcyBpbiB0aGUgYHZhbGlkYCBzdGF0ZS4g
QQotICAgIHJlY29yZCB3aWxsIGJlIGluIHRoZSBgdmFsaWRgIHN0YXRlIHdoZW4gbm8gY2xpZW50
LXNpZGUKLSAgICB2YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCBhbmQgdGhlIGFkYXB0ZXIgZGlkIG5v
dCByZXBvcnQgYW55Ci0gICAgc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KLQotICAg
IEBwcm9wZXJ0eSBpc1ZhbGlkCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0g
ICovCi0gIGlzVmFsaWQ6IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYg
dGhlIHJlY29yZCBpcyBpbiB0aGUgZGlydHkgc3RhdGUgdGhpcyBwcm9wZXJ0eSB3aWxsIHJlcG9y
dCB3aGF0Ci0gICAga2luZCBvZiBjaGFuZ2UgaGFzIGNhdXNlZCBpdCB0byBtb3ZlIGludG8gdGhl
IGRpcnR5Ci0gICAgc3RhdGUuIFBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLSAgICAtIGBjcmVhdGVk
YCBUaGUgcmVjb3JkIGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBz
YXZlZCB0byB0aGUgYWRhcHRlci4KLSAgICAtIGB1cGRhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVu
IHVwZGF0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4K
LSAgICAtIGBkZWxldGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIGRlbGV0ZWQgYnkgdGhlIGNsaWVu
dCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5N
b2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnZGlydHlUeXBlJyk7IC8vICdjcmVhdGVkJwotICAgIGBg
YAotCi0gICAgQHByb3BlcnR5IGRpcnR5VHlwZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICAgQHJl
YWRPbmx5Ci0gICovCi0gIGRpcnR5VHlwZTogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotCi0g
IC8qKgotICAgIElmIGB0cnVlYCB0aGUgYWRhcHRlciByZXBvcnRlZCB0aGF0IGl0IHdhcyB1bmFi
bGUgdG8gc2F2ZSBsb2NhbAotICAgIGNoYW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFs
c28gcmVzdWx0IGluIHRoZSByZWNvcmQgaGF2aW5nCi0gICAgaXRzIGBpc1ZhbGlkYCBwcm9wZXJ0
eSBiZWNvbWUgZmFsc2UgaWYgdGhlIGFkYXB0ZXIgcmVwb3J0ZWQgdGhhdAotICAgIHNlcnZlci1z
aWRlIHZhbGlkYXRpb25zIGZhaWxlZC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICByZWNvcmQuZ2V0KCdpc0Vycm9yJyk7IC8vIGZhbHNlCi0gICAgcmVjb3JkLnNldCgn
Zm9vJywgJ2ludmFsaWQgdmFsdWUnKTsKLSAgICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVu
Y3Rpb24oKSB7Ci0gICAgICByZWNvcmQuZ2V0KCdpc0Vycm9yJyk7IC8vIHRydWUKLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBpc0Vycm9yCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0g
ICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzRXJyb3I6IGZhbHNlLAotICAvKioKLSAgICBJZiBgdHJ1
ZWAgdGhlIHN0b3JlIGlzIGF0dGVtcHRpbmcgdG8gcmVsb2FkIHRoZSByZWNvcmQgZm9ybSB0aGUg
YWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQu
Z2V0KCdpc1JlbG9hZGluZycpOyAvLyBmYWxzZQotICAgIHJlY29yZC5yZWxvYWQoKTsKLSAgICBy
ZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycpOyAvLyB0cnVlCi0gICAgYGBgCi0KLSAgICBAcHJvcGVy
dHkgaXNSZWxvYWRpbmcKLSAgICBAdHlwZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8K
LSAgaXNSZWxvYWRpbmc6IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBgY2xpZW50SWRgIHByb3Bl
cnR5IGlzIGEgdHJhbnNpZW50IG51bWVyaWNhbCBpZGVudGlmaWVyCi0gICAgZ2VuZXJhdGVkIGF0
IHJ1bnRpbWUgYnkgdGhlIGRhdGEgc3RvcmUuIEl0IGlzIGltcG9ydGFudAotICAgIHByaW1hcmls
eSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cyBtYXkgbm90IHlldCBoYXZlIGFuCi0gICAg
ZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCi0KLSAgICBAcHJvcGVydHkgY2xpZW50SWQKLSAgICBA
cHJpdmF0ZQotICAgIEB0eXBlIHtOdW1iZXJ8U3RyaW5nfQotICAqLwotICBjbGllbnRJZDogbnVs
bCwKLSAgLyoqCi0gICAgQWxsIGVtYmVyIG1vZGVscyBoYXZlIGFuIGlkIHByb3BlcnR5LiBUaGlz
IGlzIGFuIGlkZW50aWZpZXIKLSAgICBtYW5hZ2VkIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4gVGhl
c2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJlCi0gICAgc3RyaW5ncyBiZWZvcmUgYmVpbmcgdXNl
ZCBpbnRlcm5hbGx5LiBOb3RlIHdoZW4gZGVjbGFyaW5nIHRoZQotICAgIGF0dHJpYnV0ZXMgZm9y
IGEgbW9kZWwgaXQgaXMgYW4gZXJyb3IgdG8gZGVjbGFyZSBhbiBpZAotICAgIGF0dHJpYnV0ZS4K
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3Jk
KEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnaWQnKTsgLy8gbnVsbAotCi0gICAgc3RvcmUu
ZmluZCgnbW9kZWwnLCAxKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQo
J2lkJyk7IC8vICcxJwotICAgIH0pOwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGlkCi0gICAg
QHR5cGUge1N0cmluZ30KLSAgKi8KLSAgaWQ6IG51bGwsCi0gIHRyYW5zYWN0aW9uOiBudWxsLAot
ICAvKioKLSAgICBAcHJvcGVydHkgY3VycmVudFN0YXRlCi0gICAgQHByaXZhdGUKLSAgICBAdHlw
ZSB7T2JqZWN0fQotICAqLwotICBjdXJyZW50U3RhdGU6IG51bGwsCi0gIC8qKgotICAgIFdoZW4g
dGhlIHJlY29yZCBpcyBpbiB0aGUgYGludmFsaWRgIHN0YXRlIHRoaXMgb2JqZWN0IHdpbGwgY29u
dGFpbgotICAgIGFueSBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuIFdoZW4gcHJlc2Vu
dCB0aGUgZXJyb3JzIGhhc2gKLSAgICB0eXBpY2FsbHkgY29udGFpbnMga2V5cyBjb3JyZXNwb25k
aW5nIHRvIHRoZSBpbnZhbGlkIHByb3BlcnR5IG5hbWVzCi0gICAgYW5kIHZhbHVlcyB3aGljaCBh
cmUgYW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
cmVjb3JkLmdldCgnZXJyb3JzLmxlbmd0aCcpOyAvLyAwCi0gICAgcmVjb3JkLnNldCgnZm9vJywg
J2ludmFsaWQgdmFsdWUnKTsKLSAgICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24o
KSB7Ci0gICAgICByZWNvcmQuZ2V0KCdlcnJvcnMnKS5nZXQoJ2ZvbycpOyAvLyBbJ2ZvbyBzaG91
bGQgYmUgYSBudW1iZXIuJ10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBlcnJv
cnMKLSAgICBAdHlwZSB7T2JqZWN0fQotICAqLwotICBlcnJvcnM6IG51bGwsCi0KLSAgLyoqCi0g
ICAgQ3JlYXRlIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkLCB1c2luZyB0aGUg
c2VyaWFsaXphdGlvbgotICAgIHN0cmF0ZWd5IG9mIHRoZSBzdG9yZSdzIGFkYXB0ZXIuCi0KLSAg
IGBzZXJpYWxpemVgIHRha2VzIGFuIG9wdGlvbmFsIGhhc2ggYXMgYSBwYXJhbWV0ZXIsIGN1cnJl
bnRseQotICAgIHN1cHBvcnRlZCBvcHRpb25zIGFyZToKLQotICAgLSBgaW5jbHVkZUlkYDogYHRy
dWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICBK
U09OIHJlcHJlc2VudGF0aW9uLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0g
e09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm5zIHtPYmplY3R9IGFuIG9iamVjdCB3aG9zZSB2
YWx1ZXMgYXJlIHByaW1pdGl2ZSBKU09OIHZhbHVlcyBvbmx5Ci0gICovCi0gIHNlcmlhbGl6ZTog
ZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsK
LSAgICByZXR1cm4gc3RvcmUuc2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwotICB9LAotCi0gIC8q
KgotICAgIFVzZSBbRFMuSlNPTlNlcmlhbGl6ZXJdKERTLkpTT05TZXJpYWxpemVyLmh0bWwpIHRv
Ci0gICAgZ2V0IHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVjb3JkLgotCi0gICAgYHRv
SlNPTmAgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBhIHBhcmFtZXRlciwgY3VycmVudGx5Ci0g
ICAgc3VwcG9ydGVkIG9wdGlvbnMgYXJlOgotCi0gICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlm
IHRoZSByZWNvcmQncyBJRCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICBKU09OIHJl
cHJlc2VudGF0aW9uLgotCi0gICAgQG1ldGhvZCB0b0pTT04KLSAgICBAcGFyYW0ge09iamVjdH0g
b3B0aW9ucwotICAgIEByZXR1cm5zIHtPYmplY3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0
aGUgb2JqZWN0LgotICAqLwotICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgICAvLyBj
b250YWluZXIgaXMgZm9yIGxhenkgdHJhbnNmb3JtIGxvb2t1cHMKLSAgICB2YXIgc2VyaWFsaXpl
ciA9IERTLkpTT05TZXJpYWxpemVyLmNyZWF0ZSh7IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIg
fSk7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwotICB9
LAotCi0gIC8qKgotICAgIEZpcmVkIHdoZW4gdGhlIHJlY29yZCBpcyBsb2FkZWQgZnJvbSB0aGUg
c2VydmVyLgotCi0gICAgQGV2ZW50IGRpZExvYWQKLSAgKi8KLSAgZGlkTG9hZDogRW1iZXIuSywK
LQotICAvKioKLSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgaXMgdXBkYXRlZC4KLQotICAgIEBl
dmVudCBkaWRVcGRhdGUKLSAgKi8KLSAgZGlkVXBkYXRlOiBFbWJlci5LLAotCi0gIC8qKgotICAg
IEZpcmVkIHdoZW4gdGhlIHJlY29yZCBpcyBjcmVhdGVkLgotCi0gICAgQGV2ZW50IGRpZENyZWF0
ZQotICAqLwotICBkaWRDcmVhdGU6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgRmlyZWQgd2hlbiB0
aGUgcmVjb3JkIGlzIGRlbGV0ZWQuCi0KLSAgICBAZXZlbnQgZGlkRGVsZXRlCi0gICovCi0gIGRp
ZERlbGV0ZTogRW1iZXIuSywKLQotICAvKioKLSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgYmVj
b21lcyBpbnZhbGlkLgotCi0gICAgQGV2ZW50IGJlY2FtZUludmFsaWQKLSAgKi8KLSAgYmVjYW1l
SW52YWxpZDogRW1iZXIuSywKLQotICAvKioKLSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgZW50
ZXJzIHRoZSBlcnJvciBzdGF0ZS4KLQotICAgIEBldmVudCBiZWNhbWVFcnJvcgotICAqLwotICBi
ZWNhbWVFcnJvcjogRW1iZXIuSywKLQotICAvKioKLSAgICBAcHJvcGVydHkgZGF0YQotICAgIEBw
cml2YXRlCi0gICAgQHR5cGUge09iamVjdH0KLSAgKi8KLSAgZGF0YTogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEgfHwge307Ci0gICAgcmV0
dXJuIHRoaXMuX2RhdGE7Ci0gIH0pLnByb3BlcnR5KCksCi0KLSAgX2RhdGE6IG51bGwsCi0KLSAg
aW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgc2V0KHRoaXMsICdjdXJyZW50U3RhdGUnLCBEUy5Sb290
U3RhdGUuZW1wdHkpOwotICAgIHZhciBlcnJvcnMgPSBEUy5FcnJvcnMuY3JlYXRlKCk7Ci0gICAg
ZXJyb3JzLnJlZ2lzdGVySGFuZGxlcnModGhpcywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnNl
bmQoJ2JlY2FtZUludmFsaWQnKTsKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2Vu
ZCgnYmVjYW1lVmFsaWQnKTsKLSAgICB9KTsKLSAgICBzZXQodGhpcywgJ2Vycm9ycycsIGVycm9y
cyk7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9zZXR1cCgpOwotICB9LAotCi0gIF9z
ZXR1cDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fY2hhbmdlc1RvU3luYyA9IHt9OwotICAgIHRo
aXMuX2RlZmVycmVkVHJpZ2dlcnMgPSBbXTsKLSAgICB0aGlzLl9kYXRhID0ge307Ci0gICAgdGhp
cy5fYXR0cmlidXRlcyA9IHt9OwotICAgIHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9Owot
ICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7fTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IHNlbmQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lCi0gICAgQHBhcmFt
IHtPYmplY3R9IGNvbnRleHQKLSAgKi8KLSAgc2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkg
ewotICAgIHZhciBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpOwotCi0g
ICAgaWYgKCFjdXJyZW50U3RhdGVbbmFtZV0pIHsKLSAgICAgIHRoaXMuX3VuaGFuZGxlZEV2ZW50
KGN1cnJlbnRTdGF0ZSwgbmFtZSwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1cnJl
bnRTdGF0ZVtuYW1lXSh0aGlzLCBjb250ZXh0KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IHRyYW5zaXRpb25UbwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAg
Ki8KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgLy8gUE9TU0lCTEUgVE9E
TzogUmVtb3ZlIHRoaXMgY29kZSBhbmQgcmVwbGFjZSB3aXRoCi0gICAgLy8gYWx3YXlzIGhhdmlu
ZyBkaXJlY3QgcmVmZXJlbmNlcyB0byBzdGF0ZSBvYmplY3RzCi0KLSAgICB2YXIgcGl2b3ROYW1l
ID0gbmFtZS5zcGxpdCgiLiIsIDEpLAotICAgICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywg
J2N1cnJlbnRTdGF0ZScpLAotICAgICAgICBzdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKLQotICAgIGRv
IHsKLSAgICAgIGlmIChzdGF0ZS5leGl0KSB7IHN0YXRlLmV4aXQodGhpcyk7IH0KLSAgICAgIHN0
YXRlID0gc3RhdGUucGFyZW50U3RhdGU7Ci0gICAgfSB3aGlsZSAoIXN0YXRlLmhhc093blByb3Bl
cnR5KHBpdm90TmFtZSkpOwotCi0gICAgdmFyIHBhdGggPSBuYW1lLnNwbGl0KCIuIik7Ci0KLSAg
ICB2YXIgc2V0dXBzID0gW10sIGVudGVycyA9IFtdLCBpLCBsOwotCi0gICAgZm9yIChpPTAsIGw9
cGF0aC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBzdGF0ZSA9IHN0YXRlW3BhdGhbaV1dOwot
Ci0gICAgICBpZiAoc3RhdGUuZW50ZXIpIHsgZW50ZXJzLnB1c2goc3RhdGUpOyB9Ci0gICAgICBp
ZiAoc3RhdGUuc2V0dXApIHsgc2V0dXBzLnB1c2goc3RhdGUpOyB9Ci0gICAgfQotCi0gICAgZm9y
IChpPTAsIGw9ZW50ZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGVudGVyc1tpXS5lbnRl
cih0aGlzKTsKLSAgICB9Ci0KLSAgICBzZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScsIHN0YXRlKTsK
LQotICAgIGZvciAoaT0wLCBsPXNldHVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBzZXR1
cHNbaV0uc2V0dXAodGhpcyk7Ci0gICAgfQotCi0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNM
YXRlcigpOwotICB9LAotCi0gIF91bmhhbmRsZWRFdmVudDogZnVuY3Rpb24oc3RhdGUsIG5hbWUs
IGNvbnRleHQpIHsKLSAgICB2YXIgZXJyb3JNZXNzYWdlID0gIkF0dGVtcHRlZCB0byBoYW5kbGUg
ZXZlbnQgYCIgKyBuYW1lICsgImAgIjsKLSAgICBlcnJvck1lc3NhZ2UgICAgKz0gIm9uICIgKyBT
dHJpbmcodGhpcykgKyAiIHdoaWxlIGluIHN0YXRlICI7Ci0gICAgZXJyb3JNZXNzYWdlICAgICs9
IHN0YXRlLnN0YXRlTmFtZSArICIuICI7Ci0KLSAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVk
KSB7Ci0gICAgICBlcnJvck1lc3NhZ2UgICs9ICJDYWxsZWQgd2l0aCAiICsgRW1iZXIuaW5zcGVj
dChjb250ZXh0KSArICIuIjsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJy
b3JNZXNzYWdlKTsKLSAgfSwKLQotICB3aXRoVHJhbnNhY3Rpb246IGZ1bmN0aW9uKGZuKSB7Ci0g
ICAgdmFyIHRyYW5zYWN0aW9uID0gZ2V0KHRoaXMsICd0cmFuc2FjdGlvbicpOwotICAgIGlmICh0
cmFuc2FjdGlvbikgeyBmbih0cmFuc2FjdGlvbik7IH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0
aG9kIGxvYWRpbmdEYXRhCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1Byb21pc2V9IHByb21p
c2UKLSAgKi8KLSAgbG9hZGluZ0RhdGE6IGZ1bmN0aW9uKHByb21pc2UpIHsKLSAgICB0aGlzLnNl
bmQoJ2xvYWRpbmdEYXRhJywgcHJvbWlzZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBs
b2FkZWREYXRhCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgbG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5zZW5kKCdsb2FkZWREYXRhJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhv
ZCBub3RGb3VuZAotICAgIEBwcml2YXRlCi0gICovCi0gIG5vdEZvdW5kOiBmdW5jdGlvbigpIHsK
LSAgICB0aGlzLnNlbmQoJ25vdEZvdW5kJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBw
dXNoZWREYXRhCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgcHVzaGVkRGF0YTogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5zZW5kKCdwdXNoZWREYXRhJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTWFya3Mg
dGhlIHJlY29yZCBhcyBkZWxldGVkIGJ1dCBkb2VzIG5vdCBzYXZlIGl0LiBZb3UgbXVzdCBjYWxs
Ci0gICAgYHNhdmVgIGFmdGVyd2FyZHMgaWYgeW91IHdhbnQgdG8gcGVyc2lzdCBpdC4gWW91IG1p
Z2h0IHVzZSB0aGlzCi0gICAgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRv
IHN0aWxsIGByb2xsYmFjaygpYCBhCi0gICAgZGVsZXRlIGFmdGVyIGl0IHdhcyBtYWRlLgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgc29mdERl
bGV0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykuZGVsZXRlUmVj
b3JkKCk7Ci0gICAgICAgIH0sCi0gICAgICAgIGNvbmZpcm06IGZ1bmN0aW9uKCkgewotICAgICAg
ICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnNhdmUoKTsKLSAgICAgICAgfSwKLSAgICAgICAgdW5kbzog
ZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykucm9sbGJhY2soKTsKLSAg
ICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBkZWxldGVS
ZWNvcmQKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQo
J2RlbGV0ZVJlY29yZCcpOwotICB9LAotCi0gIC8qKgotICAgIFNhbWUgYXMgYGRlbGV0ZVJlY29y
ZGAsIGJ1dCBzYXZlcyB0aGUgcmVjb3JkIGltbWVkaWF0ZWx5LgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUu
ZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVsZXRlOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcjsKLSAgICAgICAgICB0
aGlzLmdldCgnbW9kZWwnKS5kZXN0cm95UmVjb3JkKCkudGhlbihmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgIGNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJ21vZGVsLmluZGV4Jyk7Ci0gICAg
ICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBt
ZXRob2QgZGVzdHJveVJlY29yZAotICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0
IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgYWRhcHRlciByZXR1cm5zCi0gICAgc3VjY2Vzc2Z1
bGx5IG9yIHJlamVjdGVkIGlmIHRoZSBhZGFwdGVyIHJldHVybnMgd2l0aCBhbiBlcnJvci4KLSAg
Ki8KLSAgZGVzdHJveVJlY29yZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5kZWxldGVSZWNvcmQo
KTsKLSAgICByZXR1cm4gdGhpcy5zYXZlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1
bmxvYWRSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAqLwotICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9u
KCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IHVubG9hZCBhIGxvYWRlZCwgbm9u
LWRpcnR5IHJlY29yZC4iLCAhZ2V0KHRoaXMsICdpc0RpcnR5JykpOwotCi0gICAgdGhpcy5zZW5k
KCd1bmxvYWRSZWNvcmQnKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGNsZWFyUmVsYXRp
b25zaGlwcwotICAgIEBwcml2YXRlCi0gICovCi0gIGNsZWFyUmVsYXRpb25zaGlwczogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9u
c2hpcCkgewotICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnYmVsb25nc1RvJykgewot
ICAgICAgICBzZXQodGhpcywgbmFtZSwgbnVsbCk7Ci0gICAgICB9IGVsc2UgaWYgKHJlbGF0aW9u
c2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAgdmFyIGhhc01hbnkgPSB0aGlzLl9y
ZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcC5uYW1lXTsKLSAgICAgICAgaWYgKGhhc01hbnkpIHsg
aGFzTWFueS5jbGVhcigpOyB9Ci0gICAgICB9Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmRBcnJheXMKLSAgICBAcHJpdmF0ZQotICAqLwotICB1
cGRhdGVSZWNvcmRBcnJheXM6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3VwZGF0aW5nUmVjb3Jk
QXJyYXlzTGF0ZXIgPSBmYWxzZTsKLSAgICBnZXQodGhpcywgJ3N0b3JlJykuZGF0YVdhc1VwZGF0
ZWQodGhpcy5jb25zdHJ1Y3RvciwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBh
biBvYmplY3QsIHdob3NlIGtleXMgYXJlIGNoYW5nZWQgcHJvcGVydGllcywgYW5kIHZhbHVlIGlz
Ci0gICAgYW4gW29sZFByb3AsIG5ld1Byb3BdIGFycmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5NYXNjb3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAg
bmFtZTogYXR0cignc3RyaW5nJykKLSAgICB9KTsKLQotICAgIHZhciBwZXJzb24gPSBzdG9yZS5j
cmVhdGVSZWNvcmQoJ3BlcnNvbicpOwotICAgIHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAv
LyB7fQotICAgIHBlcnNvbi5zZXQoJ25hbWUnLCAnVG9tc3RlcicpOwotICAgIHBlcnNvbi5jaGFu
Z2VkQXR0cmlidXRlcygpOyAvLyB7bmFtZTogW3VuZGVmaW5lZCwgJ1RvbXN0ZXInXX0KLSAgICBg
YGAKLQotICAgIEBtZXRob2QgY2hhbmdlZEF0dHJpYnV0ZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9
IGFuIG9iamVjdCwgd2hvc2Uga2V5cyBhcmUgY2hhbmdlZCBwcm9wZXJ0aWVzLAotICAgICAgYW5k
IHZhbHVlIGlzIGFuIFtvbGRQcm9wLCBuZXdQcm9wXSBhcnJheS4KLSAgKi8KLSAgY2hhbmdlZEF0
dHJpYnV0ZXM6IGZ1bmN0aW9uKCkgewotICAgIHZhciBvbGREYXRhID0gZ2V0KHRoaXMsICdfZGF0
YScpLAotICAgICAgICBuZXdEYXRhID0gZ2V0KHRoaXMsICdfYXR0cmlidXRlcycpLAotICAgICAg
ICBkaWZmRGF0YSA9IHt9LAotICAgICAgICBwcm9wOwotCi0gICAgZm9yIChwcm9wIGluIG5ld0Rh
dGEpIHsKLSAgICAgIGRpZmZEYXRhW3Byb3BdID0gW29sZERhdGFbcHJvcF0sIG5ld0RhdGFbcHJv
cF1dOwotICAgIH0KLQotICAgIHJldHVybiBkaWZmRGF0YTsKLSAgfSwKLQotICAvKioKLSAgICBA
bWV0aG9kIGFkYXB0ZXJXaWxsQ29tbWl0Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgYWRhcHRlcldp
bGxDb21taXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2VuZCgnd2lsbENvbW1pdCcpOwotICB9
LAotCi0gIC8qKgotICAgIElmIHRoZSBhZGFwdGVyIGRpZCBub3QgcmV0dXJuIGEgaGFzaCBpbiBy
ZXNwb25zZSB0byBhIGNvbW1pdCwKLSAgICBtZXJnZSB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFu
ZCByZWxhdGlvbnNoaXBzIGludG8gdGhlIGV4aXN0aW5nCi0gICAgc2F2ZWQgZGF0YS4KLQotICAg
IEBtZXRob2QgYWRhcHRlckRpZENvbW1pdAotICAqLwotICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5j
dGlvbihkYXRhKSB7Ci0gICAgc2V0KHRoaXMsICdpc0Vycm9yJywgZmFsc2UpOwotCi0gICAgaWYg
KGRhdGEpIHsKLSAgICAgIHRoaXMuX2RhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICBF
bWJlci5taXhpbih0aGlzLl9kYXRhLCB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMpOwotICAgIH0K
LQotICAgIHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9OwotCi0gICAgdGhpcy5zZW5kKCdk
aWRDb21taXQnKTsKLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0KLSAgICBp
ZiAoIWRhdGEpIHsgcmV0dXJuOyB9Ci0KLSAgICB0aGlzLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNl
cnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRh
Jyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBhZGFwdGVyRGlkRGlydHkK
LSAgICBAcHJpdmF0ZQotICAqLwotICBhZGFwdGVyRGlkRGlydHk6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuc2VuZCgnYmVjb21lRGlydHknKTsKLSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xh
dGVyKCk7Ci0gIH0sCi0KLSAgZGF0YURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5yZWxvYWRIYXNNYW55cygpOwotICB9LCAnZGF0YScpLAotCi0gIHJlbG9h
ZEhhc01hbnlzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcmVsYXRpb25zaGlwcyA9IGdldCh0aGlz
LmNvbnN0cnVjdG9yLCAncmVsYXRpb25zaGlwc0J5TmFtZScpOwotICAgIHRoaXMudXBkYXRlUmVj
b3JkQXJyYXlzTGF0ZXIoKTsKLSAgICByZWxhdGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24obmFt
ZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBpZiAodGhpcy5fZGF0YS5saW5rcyAmJiB0aGlzLl9k
YXRhLmxpbmtzW25hbWVdKSB7IHJldHVybjsgfQotICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5k
ID09PSAnaGFzTWFueScpIHsKLSAgICAgICAgdGhpcy5oYXNNYW55RGlkQ2hhbmdlKHJlbGF0aW9u
c2hpcC5rZXkpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIGhhc01hbnlEaWRD
aGFuZ2U6IGZ1bmN0aW9uKGtleSkgewotICAgIHZhciBoYXNNYW55ID0gdGhpcy5fcmVsYXRpb25z
aGlwc1trZXldOwotCi0gICAgaWYgKGhhc01hbnkpIHsKLSAgICAgIHZhciByZWNvcmRzID0gdGhp
cy5fZGF0YVtrZXldIHx8IFtdOwotCi0gICAgICBzZXQoaGFzTWFueSwgJ2NvbnRlbnQnLCBFbWJl
ci5BKHJlY29yZHMpKTsKLSAgICAgIHNldChoYXNNYW55LCAnaXNMb2FkZWQnLCB0cnVlKTsKLSAg
ICAgIGhhc01hbnkudHJpZ2dlcignZGlkTG9hZCcpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAg
ICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5c0xhdGVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAg
dXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6IGZ1bmN0aW9uKCkgewotICAgIC8vIHF1aWNrIGhhY2sg
KHNvbWV0aGluZyBsaWtlIHRoaXMgY291bGQgYmUgcHVzaGVkIGludG8gcnVuLm9uY2UKLSAgICBp
ZiAodGhpcy5fdXBkYXRpbmdSZWNvcmRBcnJheXNMYXRlcikgeyByZXR1cm47IH0KLSAgICB0aGlz
Ll91cGRhdGluZ1JlY29yZEFycmF5c0xhdGVyID0gdHJ1ZTsKLQotICAgIEVtYmVyLnJ1bi5zY2hl
ZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAbWV0aG9kIHNldHVwRGF0YQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtP
YmplY3R9IGRhdGEKLSAgICBAcGFyYW0ge0Jvb2xlYW59IHBhcnRpYWwgdGhlIGRhdGEgc2hvdWxk
IGJlIG1lcmdlZCBpbnRvCi0gICAgICB0aGUgZXhpc3RpbmcgZGF0YSwgbm90IHJlcGxhY2UgaXQu
Ci0gICovCi0gIHNldHVwRGF0YTogZnVuY3Rpb24oZGF0YSwgcGFydGlhbCkgewotICAgIGlmIChw
YXJ0aWFsKSB7Ci0gICAgICBFbWJlci5tZXJnZSh0aGlzLl9kYXRhLCBkYXRhKTsKLSAgICB9IGVs
c2UgewotICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7Ci0gICAgfQotCi0gICAgdmFyIHJlbGF0aW9u
c2hpcHMgPSB0aGlzLl9yZWxhdGlvbnNoaXBzOwotCi0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlw
KGZ1bmN0aW9uKG5hbWUsIHJlbCkgewotICAgICAgaWYgKGRhdGEubGlua3MgJiYgZGF0YS5saW5r
c1tuYW1lXSkgeyByZXR1cm47IH0KLSAgICAgIGlmIChyZWwub3B0aW9ucy5hc3luYykgeyByZWxh
dGlvbnNoaXBzW25hbWVdID0gbnVsbDsgfQotICAgIH0pOwotCi0gICAgaWYgKGRhdGEpIHsgdGhp
cy5wdXNoZWREYXRhKCk7IH0KLQotICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVy
cyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsK
LSAgICB9KTsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUlkOiBmdW5jdGlvbihpZCkgewotICAgIHNl
dCh0aGlzLCAnaWQnLCBpZCk7Ci0gIH0sCi0KLSAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5j
dGlvbihhdHRyaWJ1dGVzKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBoYXNoIG9m
IGF0dHJpYnV0ZXMgdG8gbWF0ZXJpYWxpemVBdHRyaWJ1dGVzIiwgISFhdHRyaWJ1dGVzKTsKLSAg
ICBtZXJnZSh0aGlzLl9kYXRhLCBhdHRyaWJ1dGVzKTsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUF0
dHJpYnV0ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKLSAgICB0aGlzLl9kYXRhW25hbWVdID0g
dmFsdWU7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVIYXNNYW55Ci0gICAgQHBy
aXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlY29y
ZHMKLSAgKi8KLSAgdXBkYXRlSGFzTWFueTogZnVuY3Rpb24obmFtZSwgcmVjb3JkcykgewotICAg
IHRoaXMuX2RhdGFbbmFtZV0gPSByZWNvcmRzOwotICAgIHRoaXMuaGFzTWFueURpZENoYW5nZShu
YW1lKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHVwZGF0ZUJlbG9uZ3NUbwotICAgIEBw
cml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQKLSAgKi8KLSAgdXBkYXRlQmVsb25nc1RvOiBmdW5jdGlvbihuYW1lLCByZWNvcmQpIHsK
LSAgICB0aGlzLl9kYXRhW25hbWVdID0gcmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIElmIHRo
ZSBtb2RlbCBgaXNEaXJ0eWAgdGhpcyBmdW5jdGlvbiB3aWxsIGRpc2NhcmQgYW55IHVuc2F2ZWQK
LSAgICBjaGFuZ2VzCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVj
b3JkLmdldCgnbmFtZScpOyAvLyAnVW50aXRsZWQgRG9jdW1lbnQnCi0gICAgcmVjb3JkLnNldCgn
bmFtZScsICdEb2MgMScpOwotICAgIHJlY29yZC5nZXQoJ25hbWUnKTsgLy8gJ0RvYyAxJwotICAg
IHJlY29yZC5yb2xsYmFjaygpOwotICAgIHJlY29yZC5nZXQoJ25hbWUnKTsgLy8gJ1VudGl0bGVk
IERvY3VtZW50JwotICAgIGBgYAotCi0gICAgQG1ldGhvZCByb2xsYmFjawotICAqLwotICByb2xs
YmFjazogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9OwotCi0gICAgaWYg
KGdldCh0aGlzLCAnaXNFcnJvcicpKSB7Ci0gICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMg
PSB7fTsKLSAgICAgIHNldCh0aGlzLCAnaXNFcnJvcicsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBp
ZiAoIWdldCh0aGlzLCAnaXNWYWxpZCcpKSB7Ci0gICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0
ZXMgPSB7fTsKLSAgICB9Ci0KLSAgICB0aGlzLnNlbmQoJ3JvbGxlZEJhY2snKTsKLQotICAgIHRo
aXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMu
bm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsKLSAgICB9KTsKLSAgfSwKLQotICB0b1N0cmlu
Z0V4dGVuc2lvbjogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAnaWQnKTsKLSAg
fSwKLQotICAvKioKLSAgICBUaGUgZ29hbCBvZiB0aGlzIG1ldGhvZCBpcyB0byB0ZW1wb3Jhcmls
eSBkaXNhYmxlIHNwZWNpZmljIG9ic2VydmVycwotICAgIHRoYXQgdGFrZSBhY3Rpb24gaW4gcmVz
cG9uc2UgdG8gYXBwbGljYXRpb24gY2hhbmdlcy4KLQotICAgIFRoaXMgYWxsb3dzIHRoZSBzeXN0
ZW0gdG8gbWFrZSBjaGFuZ2VzIChzdWNoIGFzIG1hdGVyaWFsaXphdGlvbiBhbmQKLSAgICByb2xs
YmFjaykgdGhhdCBzaG91bGQgbm90IHRyaWdnZXIgc2Vjb25kYXJ5IGJlaGF2aW9yIChzdWNoIGFz
IHNldHRpbmcgYW4KLSAgICBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvciBtYXJraW5nIHJlY29yZHMg
YXMgZGlydHkpLgotCi0gICAgVGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5
IGNoYW5nZSBhcyBFbWJlciBwcm9wZXIgcHJvdmlkZXMKLSAgICBiZXR0ZXIgaW5mcmFzdHJ1Y3R1
cmUgZm9yIHN1c3BlbmRpbmcgZ3JvdXBzIG9mIG9ic2VydmVycywgYW5kIGlmIEFycmF5Ci0gICAg
b2JzZXJ2YXRpb24gYmVjb21lcyBtb3JlIHVuaWZpZWQgd2l0aCByZWd1bGFyIG9ic2VydmVycy4K
LQotICAgIEBtZXRob2Qgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycwotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIGNhbGxiYWNrCi0gICAgQHBhcmFtIGJpbmRpbmcKLSAgKi8KLSAgc3VzcGVu
ZFJlbGF0aW9uc2hpcE9ic2VydmVyczogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAg
ICB2YXIgb2JzZXJ2ZXJzID0gZ2V0KHRoaXMuY29uc3RydWN0b3IsICdyZWxhdGlvbnNoaXBOYW1l
cycpLmJlbG9uZ3NUbzsKLSAgICB2YXIgc2VsZiA9IHRoaXM7Ci0KLSAgICB0cnkgewotICAgICAg
dGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IHRydWU7Ci0gICAgICBFbWJlci5fc3VzcGVu
ZE9ic2VydmVycyhzZWxmLCBvYnNlcnZlcnMsIG51bGwsICdiZWxvbmdzVG9EaWRDaGFuZ2UnLCBm
dW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIuX3N1c3BlbmRCZWZvcmVPYnNlcnZlcnMoc2VsZiwg
b2JzZXJ2ZXJzLCBudWxsLCAnYmVsb25nc1RvV2lsbENoYW5nZScsIGZ1bmN0aW9uKCkgewotICAg
ICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyB8fCBzZWxmKTsKLSAgICAgICAgfSk7Ci0gICAg
ICB9KTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlw
cyA9IGZhbHNlOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBTYXZlIHRoZSByZWNvcmQgYW5k
IHBlcnNpc3QgYW55IGNoYW5nZXMgdG8gdGhlIHJlY29yZCB0byBhbgotICAgIGV4dGVuYWwgc291
cmNlIHZpYSB0aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICByZWNvcmQuc2V0KCduYW1lJywgJ1RvbXN0ZXInKTsKLSAgICByZWNvcmQuc2F2ZSgpLnRo
ZW4oZnVuY3Rpb24oKXsKLSAgICAgIC8vIFN1Y2Nlc3MgY2FsbGJhY2sKLSAgICB9LCBmdW5jdGlv
bigpIHsKLSAgICAgIC8vIEVycm9yIGNhbGxiYWNrCi0gICAgfSk7Ci0gICAgYGBgCi0gICAgQG1l
dGhvZCBzYXZlCi0gICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBy
ZXNvbHZlZCB3aGVuIHRoZSBhZGFwdGVyIHJldHVybnMKLSAgICBzdWNjZXNzZnVsbHkgb3IgcmVq
ZWN0ZWQgaWYgdGhlIGFkYXB0ZXIgcmV0dXJucyB3aXRoIGFuIGVycm9yLgotICAqLwotICBzYXZl
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcHJvbWlzZUxhYmVsID0gIkRTOiBNb2RlbCNzYXZlICIg
KyB0aGlzOwotICAgIHZhciByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIocHJvbWlzZUxhYmVs
KTsKLQotICAgIHRoaXMuZ2V0KCdzdG9yZScpLnNjaGVkdWxlU2F2ZSh0aGlzLCByZXNvbHZlcik7
Ci0gICAgdGhpcy5faW5GbGlnaHRBdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlczsKLSAgICB0
aGlzLl9hdHRyaWJ1dGVzID0ge307Ci0KLSAgICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVh
dGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9taXNlIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJl
bG9hZCB0aGUgcmVjb3JkIGZyb20gdGhlIGFkYXB0ZXIuCi0KLSAgICBUaGlzIHdpbGwgb25seSB3
b3JrIGlmIHRoZSByZWNvcmQgaGFzIGFscmVhZHkgZmluaXNoZWQgbG9hZGluZwotICAgIGFuZCBo
YXMgbm90IHlldCBiZWVuIG1vZGlmaWVkIChgaXNMb2FkZWRgIGJ1dCBub3QgYGlzRGlydHlgLAot
ICAgIG9yIGBpc1NhdmluZ2ApLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIEFwcC5Nb2RlbFZpZXdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rp
b25zOiB7Ci0gICAgICAgIHJlbG9hZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5nZXQo
J21vZGVsJykucmVsb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAK
LQotICAgIEBtZXRob2QgcmVsb2FkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRo
YXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZWNvcmQgd2hlbiB0aGUKLSAgICBhZGFwdGVy
IHJldHVybnMgc3VjY2Vzc2Z1bGx5IG9yIHJlamVjdGVkIGlmIHRoZSBhZGFwdGVyIHJldHVybnMK
LSAgICB3aXRoIGFuIGVycm9yLgotICAqLwotICByZWxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIHNl
dCh0aGlzLCAnaXNSZWxvYWRpbmcnLCB0cnVlKTsKLQotICAgIHZhciAgcmVjb3JkID0gdGhpczsK
LQotICAgIHZhciBwcm9taXNlTGFiZWwgPSAiRFM6IE1vZGVsI3JlbG9hZCBvZiAiICsgdGhpczsK
LSAgICB2YXIgcHJvbWlzZSA9IG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2
ZSl7Ci0gICAgICAgcmVjb3JkLnNlbmQoJ3JlbG9hZFJlY29yZCcsIHJlc29sdmUpOwotICAgIH0s
IHByb21pc2VMYWJlbCkudGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHJlY29yZC5zZXQoJ2lzUmVs
b2FkaW5nJywgZmFsc2UpOwotICAgICAgcmVjb3JkLnNldCgnaXNFcnJvcicsIGZhbHNlKTsKLSAg
ICAgIHJldHVybiByZWNvcmQ7Ci0gICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICByZWNv
cmQuc2V0KCdpc0Vycm9yJywgdHJ1ZSk7Ci0gICAgICB0aHJvdyByZWFzb247Ci0gICAgfSwgIkRT
OiBNb2RlbCNyZWxvYWQgY29tcGxldGUsIHVwZGF0ZSBmbGFncyIpOwotCi0gICAgcmV0dXJuIERT
LlByb21pc2VPYmplY3QuY3JlYXRlKHsgcHJvbWlzZTogcHJvbWlzZSB9KTsKLSAgfSwKLQotICAv
LyBGT1IgVVNFIERVUklORyBDT01NSVQgUFJPQ0VTUwotCi0gIGFkYXB0ZXJEaWRVcGRhdGVBdHRy
aWJ1dGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKSB7Ci0KLSAgICAvLyBJZiBhIHZh
bHVlIGlzIHBhc3NlZCBpbiwgdXBkYXRlIHRoZSBpbnRlcm5hbCBhdHRyaWJ1dGVzIGFuZCBjbGVh
cgotICAgIC8vIHRoZSBhdHRyaWJ1dGUgY2FjaGUgc28gaXQgcGlja3MgdXAgdGhlIG5ldyB2YWx1
ZS4gT3RoZXJ3aXNlLAotICAgIC8vIGNvbGxhcHNlIHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhl
IGludGVybmFsIGF0dHJpYnV0ZXMgYmVjYXVzZQotICAgIC8vIHRoZSBhZGFwdGVyIGhhcyBhY2tu
b3dsZWRnZWQgaXQuCi0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHRoaXMu
X2RhdGFbYXR0cmlidXRlTmFtZV0gPSB2YWx1ZTsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlD
aGFuZ2UoYXR0cmlidXRlTmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX2RhdGFbYXR0
cmlidXRlTmFtZV0gPSB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07Ci0g
ICAgfQotCi0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICB9LAotCi0gIC8q
KgotICAgIEBtZXRob2QgYWRhcHRlckRpZEludmFsaWRhdGUKLSAgICBAcHJpdmF0ZQotICAqLwot
ICBhZGFwdGVyRGlkSW52YWxpZGF0ZTogZnVuY3Rpb24oZXJyb3JzKSB7Ci0gICAgdmFyIHJlY29y
ZEVycm9ycyA9IGdldCh0aGlzLCAnZXJyb3JzJyk7Ci0gICAgZnVuY3Rpb24gYWRkRXJyb3IobmFt
ZSkgewotICAgICAgaWYgKGVycm9yc1tuYW1lXSkgewotICAgICAgICByZWNvcmRFcnJvcnMuYWRk
KG5hbWUsIGVycm9yc1tuYW1lXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGhpcy5lYWNoQXR0
cmlidXRlKGFkZEVycm9yKTsKLSAgICB0aGlzLmVhY2hSZWxhdGlvbnNoaXAoYWRkRXJyb3IpOwot
ICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgYWRhcHRlckRpZEVycm9yCi0gICAgQHByaXZhdGUK
LSAgKi8KLSAgYWRhcHRlckRpZEVycm9yOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2Jl
Y2FtZUVycm9yJyk7Ci0gICAgc2V0KHRoaXMsICdpc0Vycm9yJywgdHJ1ZSk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gRW1iZXIuRXZl
bnRlZCB0bwotICAgIGFsc28gY2FsbCBtZXRob2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0KLSAg
ICBAbWV0aG9kIHRyaWdnZXIKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSBuYW1lCi0gICovCi0g
IHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICBFbWJlci50cnlJbnZva2UodGhpcywgbmFt
ZSwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0
aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0gIHRyaWdnZXJMYXRlcjogZnVuY3Rpb24oKSB7Ci0g
ICAgaWYgKHRoaXMuX2RlZmVycmVkVHJpZ2dlcnMucHVzaChhcmd1bWVudHMpICE9PSAxKSB7IHJl
dHVybjsgfQotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsICdfdHJpZ2dl
ckRlZmVycmVkVHJpZ2dlcnMnKTsKLSAgfSwKLQotICBfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnM6
IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIGk9MCwgbD10aGlzLl9kZWZlcnJlZFRyaWdnZXJz
Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCB0aGlz
Ll9kZWZlcnJlZFRyaWdnZXJzW2ldKTsKLSAgICB9Ci0KLSAgICB0aGlzLl9kZWZlcnJlZFRyaWdn
ZXJzLmxlbmd0aCA9IDA7Ci0gIH0KLX0pOwotCi1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0KLSAg
LyoqCi0gICAgQWxpYXMgRFMuTW9kZWwncyBgY3JlYXRlYCBtZXRob2QgdG8gYF9jcmVhdGVgLiBU
aGlzIGFsbG93cyB1cyB0byBjcmVhdGUgRFMuTW9kZWwKLSAgICBpbnN0YW5jZXMgZnJvbSB3aXRo
aW4gdGhlIHN0b3JlLCBidXQgaWYgZW5kIHVzZXJzIGFjY2lkZW50YWxseSBjYWxsIGBjcmVhdGUo
KWAKLSAgICAoaW5zdGVhZCBvZiBgY3JlYXRlUmVjb3JkKClgKSwgd2UgY2FuIHJhaXNlIGFuIGVy
cm9yLgotCi0gICAgQG1ldGhvZCBfY3JlYXRlCi0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0g
ICovCi0gIF9jcmVhdGU6IERTLk1vZGVsLmNyZWF0ZSwKLQotICAvKioKLSAgICBPdmVycmlkZSB0
aGUgY2xhc3MnIGBjcmVhdGUoKWAgbWV0aG9kIHRvIHJhaXNlIGFuIGVycm9yLiBUaGlzCi0gICAg
cHJldmVudHMgZW5kIHVzZXJzIGZyb20gaW5hZHZlcnRlbnRseSBjYWxsaW5nIGBjcmVhdGUoKWAg
aW5zdGVhZAotICAgIG9mIGBjcmVhdGVSZWNvcmQoKWAuIFRoZSBzdG9yZSBpcyBzdGlsbCBhYmxl
IHRvIGNyZWF0ZSBpbnN0YW5jZXMKLSAgICBieSBjYWxsaW5nIHRoZSBgX2NyZWF0ZSgpYCBtZXRo
b2QuIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhCi0gICAgYERTLk1vZGVsYCB1c2UgW3N0b3Jl
LmNyZWF0ZVJlY29yZF0oRFMuU3RvcmUuaHRtbCNtZXRob2RfY3JlYXRlUmVjb3JkKS4KLQotICAg
IEBtZXRob2QgY3JlYXRlCi0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0gICovCi0gIGNyZWF0
ZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJZb3Ugc2hvdWxkIG5v
dCBjYWxsIGBjcmVhdGVgIG9uIGEgbW9kZWwuIEluc3RlYWQsIGNhbGwgYHN0b3JlLmNyZWF0ZVJl
Y29yZGAgd2l0aCB0aGUgYXR0cmlidXRlcyB5b3Ugd291bGQgbGlrZSB0byBzZXQuIik7Ci0gIH0K
LX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXIt
ZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldDsKLQotLyoqCi0gIEBjbGFzcyBNb2RlbAot
ICBAbmFtZXNwYWNlIERTCi0qLwotRFMuTW9kZWwucmVvcGVuQ2xhc3MoewotICAvKioKLSAgICBB
IG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRp
ZXMKLSAgICBkZXNjcmliZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1l
dGEgb2JqZWN0IGZvciB0aGUKLSAgICBwcm9wZXJ0eS4KLQotICAgIEV4YW1wbGUKLQotICAgIGBg
YGphdmFzY3JpcHQKLQotICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAg
Zmlyc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcn
KSwKLSAgICAgIGJpcnRoZGF5OiBhdHRyKCdkYXRlJykKLSAgICB9KTsKLQotICAgIHZhciBhdHRy
aWJ1dGVzID0gRW1iZXIuZ2V0KEFwcC5QZXJzb24sICdhdHRyaWJ1dGVzJykKLQotICAgIGF0dHJp
YnV0ZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBjb25zb2xlLmxvZyhu
YW1lLCBtZXRhKTsKLSAgICB9KTsKLQotICAgIC8vIHByaW50czoKLSAgICAvLyBmaXJzdE5hbWUg
e3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJl
bnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImZpcnN0TmFtZSJ9Ci0gICAgLy8gbGFzdE5hbWUge3R5
cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRU
eXBlOiBmdW5jdGlvbiwgbmFtZTogImxhc3ROYW1lIn0KLSAgICAvLyBiaXJ0aGRheSB7dHlwZTog
ImRhdGUiLCBpc0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBm
dW5jdGlvbiwgbmFtZTogImJpcnRoZGF5In0KLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBhdHRy
aWJ1dGVzCi0gICAgQHN0YXRpYwotICAgIEB0eXBlIHtFbWJlci5NYXB9Ci0gICAgQHJlYWRPbmx5
Ci0gICovCi0gIGF0dHJpYnV0ZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZh
ciBtYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7Ci0KLSAgICB0aGlzLmVhY2hDb21wdXRlZFByb3Bl
cnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKLSAgICAgIGlmIChtZXRhLmlzQXR0cmlidXRlKSB7
Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiWW91IG1heSBub3Qgc2V0IGBpZGAgYXMgYW4gYXR0cmli
dXRlIG9uIHlvdXIgbW9kZWwuIFBsZWFzZSByZW1vdmUgYW55IGxpbmVzIHRoYXQgbG9vayBsaWtl
OiBgaWQ6IERTLmF0dHIoJzx0eXBlPicpYCBmcm9tICIgKyB0aGlzLnRvU3RyaW5nKCksIG5hbWUg
IT09ICdpZCcpOwotCi0gICAgICAgIG1ldGEubmFtZSA9IG5hbWU7Ci0gICAgICAgIG1hcC5zZXQo
bmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gbWFwOwotICB9KSwK
LQotICAvKioKLSAgICBBIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUg
bW9kZWwgKHByb3BlcnRpZXMKLSAgICBkZXNjcmliZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZh
bHVlcyBhcmUgdHlwZSBvZiB0cmFuc2Zvcm1hdGlvbgotICAgIGFwcGxpZWQgdG8gZWFjaCBhdHRy
aWJ1dGUuIFRoaXMgbWFwIGRvZXMgbm90IGluY2x1ZGUgYW55Ci0gICAgYXR0cmlidXRlcyB0aGF0
IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0aW9uIHR5cGUuCi0KLSAgICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAg
ICBmaXJzdE5hbWU6IGF0dHIoKSwKLSAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAg
ICAgIGJpcnRoZGF5OiBhdHRyKCdkYXRlJykKLSAgICB9KTsKLQotICAgIHZhciB0cmFuc2Zvcm1l
ZEF0dHJpYnV0ZXMgPSBFbWJlci5nZXQoQXBwLlBlcnNvbiwgJ3RyYW5zZm9ybWVkQXR0cmlidXRl
cycpCi0KLSAgICB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwg
dHlwZSkgewotICAgICAgY29uc29sZS5sb2coZmllbGQsIHR5cGUpOwotICAgIH0pOwotCi0gICAg
Ly8gcHJpbnRzOgotICAgIC8vIGxhc3ROYW1lIHN0cmluZwotICAgIC8vIGJpcnRoZGF5IGRhdGUK
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMKLSAgICBAc3Rh
dGljCi0gICAgQHR5cGUge0VtYmVyLk1hcH0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgdHJhbnNm
b3JtZWRBdHRyaWJ1dGVzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFw
ID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0gICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1bmN0aW9u
KGtleSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEudHlwZSkgewotICAgICAgICBtYXAuc2V0KGtl
eSwgbWV0YS50eXBlKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0p
LAotCi0gIC8qKgotICAgIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG1v
ZGVsLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24gb24gZWFjaAotICAgIGF0dHJpYnV0ZS4K
LQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZv
bGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihuYW1lLCBtZXRhKTsKLSAgICBgYGAKLQot
ICAgIC0gYG5hbWVgIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb3BlcnR5IGluIHRoZSBpdGVy
YXRpb24KLSAgICAtIGBtZXRhYCB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgcHJv
cGVydHkgaW4gdGhlIGl0ZXJhdGlvbgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEg
Y2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVj
dCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4KLQotICAgIEV4YW1w
bGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5k
KHsKLSAgICAgIGZpcnN0TmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgICBsYXN0TmFtZTogYXR0
cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRheTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAg
ICBBcHAuUGVyc29uLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAg
Y29uc29sZS5sb2cobmFtZSwgbWV0YSk7Ci0gICAgfSk7Ci0KLSAgICAvLyBwcmludHM6Ci0gICAg
Ly8gZmlyc3ROYW1lIHt0eXBlOiAic3RyaW5nIiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6
IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24sIG5hbWU6ICJmaXJzdE5hbWUifQotICAgIC8v
IGxhc3ROYW1lIHt0eXBlOiAic3RyaW5nIiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9i
amVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24sIG5hbWU6ICJsYXN0TmFtZSJ9Ci0gICAgLy8gYmly
dGhkYXkge3R5cGU6ICJkYXRlIiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwg
cGFyZW50VHlwZTogZnVuY3Rpb24sIG5hbWU6ICJiaXJ0aGRheSJ9Ci0gICBgYGAKLQotICAgIEBt
ZXRob2QgZWFjaEF0dHJpYnV0ZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBj
YWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJn
ZXQgb2JqZWN0IHRvIHVzZQotICAgIEBzdGF0aWMKLSAgKi8KLSAgZWFjaEF0dHJpYnV0ZTogZnVu
Y3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhpcywgJ2F0dHJpYnV0ZXMnKS5m
b3JFYWNoKGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKLSAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGlu
ZywgbmFtZSwgbWV0YSk7Ci0gICAgfSwgYmluZGluZyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRl
cmF0ZXMgdGhyb3VnaCB0aGUgdHJhbnNmb3JtZWRBdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCwgY2Fs
bGluZwotICAgIHRoZSBwYXNzZWQgZnVuY3Rpb24gb24gZWFjaCBhdHRyaWJ1dGUuIE5vdGUgdGhl
IGNhbGxiYWNrIHdpbGwgbm90IGJlCi0gICAgY2FsbGVkIGZvciBhbnkgYXR0cmlidXRlcyB0aGF0
IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0aW9uIHR5cGUuCi0KLSAgICBUaGUgY2FsbGJhY2sg
bWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChh
bGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgZnVuY3Rpb24obmFtZSwgdHlwZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBuYW1lYCB0aGUgbmFt
ZSBvZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBpbiB0aGUgaXRlcmF0aW9uCi0gICAgLSBgdHlwZWAg
YSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0cmFuc2Zvcm1lZAot
ICAgICAgYXBwbGllZCB0byB0aGUgYXR0cmlidXRlCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRp
b24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0g
ICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5QZXJzb24gPSBEUy5Nb2Rl
bC5leHRlbmQoewotICAgICAgZmlyc3ROYW1lOiBhdHRyKCksCi0gICAgICBsYXN0TmFtZTogYXR0
cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRheTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAg
ICBBcHAuUGVyc29uLmVhY2hUcmFuc2Zvcm1lZEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lLCB0eXBl
KSB7Ci0gICAgICBjb25zb2xlLmxvZyhuYW1lLCB0eXBlKTsKLSAgICB9KTsKLQotICAgIC8vIHBy
aW50czoKLSAgICAvLyBsYXN0TmFtZSBzdHJpbmcKLSAgICAvLyBiaXJ0aGRheSBkYXRlCi0gICBg
YGAKLQotICAgIEBtZXRob2QgZWFjaFRyYW5zZm9ybWVkQXR0cmlidXRlCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09i
amVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHN0YXRpYwotICAq
LwotICBlYWNoVHJhbnNmb3JtZWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5n
KSB7Ci0gICAgZ2V0KHRoaXMsICd0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0
aW9uKG5hbWUsIHR5cGUpIHsKLSAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgdHlw
ZSk7Ci0gICAgfSk7Ci0gIH0KLX0pOwotCi0KLURTLk1vZGVsLnJlb3Blbih7Ci0gIGVhY2hBdHRy
aWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rv
ci5lYWNoQXR0cmlidXRlKGNhbGxiYWNrLCBiaW5kaW5nKTsKLSAgfQotfSk7Ci0KLWZ1bmN0aW9u
IGdldERlZmF1bHRWYWx1ZShyZWNvcmQsIG9wdGlvbnMsIGtleSkgewotICBpZiAodHlwZW9mIG9w
dGlvbnMuZGVmYXVsdFZhbHVlID09PSAiZnVuY3Rpb24iKSB7Ci0gICAgcmV0dXJuIG9wdGlvbnMu
ZGVmYXVsdFZhbHVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZh
bHVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGhhc1ZhbHVlKHJlY29yZCwga2V5KSB7Ci0gIHJldHVy
biByZWNvcmQuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSB8fAotICAgICAgICAgcmVj
b3JkLl9pbkZsaWdodEF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSB8fAotICAgICAgICAg
cmVjb3JkLl9kYXRhLmhhc093blByb3BlcnR5KGtleSk7Ci19Ci0KLWZ1bmN0aW9uIGdldFZhbHVl
KHJlY29yZCwga2V5KSB7Ci0gIGlmIChyZWNvcmQuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHko
a2V5KSkgewotICAgIHJldHVybiByZWNvcmQuX2F0dHJpYnV0ZXNba2V5XTsKLSAgfSBlbHNlIGlm
IChyZWNvcmQuX2luRmxpZ2h0QXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAg
cmV0dXJuIHJlY29yZC5faW5GbGlnaHRBdHRyaWJ1dGVzW2tleV07Ci0gIH0gZWxzZSB7Ci0gICAg
cmV0dXJuIHJlY29yZC5fZGF0YVtrZXldOwotICB9Ci19Ci0KLS8qKgotICBgRFMuYXR0cmAgZGVm
aW5lcyBhbiBhdHRyaWJ1dGUgb24gYSBbRFMuTW9kZWxdKERTLk1vZGVsLmh0bWwpLgotICBCeSBk
ZWZhdWx0LCBhdHRyaWJ1dGVzIGFyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcywgaG93ZXZlciB5b3Ug
Y2FuIHNwZWNpZnkgYW4KLSAgb3B0aW9uYWwgdHlwZSB0byBoYXZlIHRoZSB2YWx1ZSBhdXRvbWF0
aWNhbGx5IHRyYW5zZm9ybWVkLgotICBFbWJlciBEYXRhIHNoaXBzIHdpdGggZm91ciBiYXNpYyB0
cmFuc2Zvcm0gdHlwZXM6IGBzdHJpbmdgLCBgbnVtYmVyYCwKLSAgYGJvb2xlYW5gIGFuZCBgZGF0
ZWAuIFlvdSBjYW4gZGVmaW5lIHlvdXIgb3duIHRyYW5zZm9ybXMgYnkgc3ViY2xhc3NpbmcKLSAg
W0RTLlRyYW5zZm9ybV0oRFMuVHJhbnNmb3JtLmh0bWwpLgotCi0gIGBEUy5hdHRyYCB0YWtlcyBh
biBvcHRpb25hbCBoYXNoIGFzIGEgc2Vjb25kIHBhcmFtZXRlciwgY3VycmVudGx5Ci0gIHN1cHBv
cnRlZCBvcHRpb25zIGFyZToKLQotICAtIGBkZWZhdWx0VmFsdWVgOiBQYXNzIGEgc3RyaW5nIG9y
IGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlCi0gICAgICAgICAg
ICAgICAgICAgIHRvIGEgZGVmYXVsdCB2YWx1ZSBpZiBub25lIGlzIHN1cHBsaWVkLgotCi0gIEV4
YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBhdHRyID0gRFMuYXR0cjsKLQotICBBcHAu
VXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgdXNlcm5hbWU6IGF0dHIoJ3N0cmluZycpLAot
ICAgIGVtYWlsOiBhdHRyKCdzdHJpbmcnKSwKLSAgICB2ZXJpZmllZDogYXR0cignYm9vbGVhbics
IHtkZWZhdWx0VmFsdWU6IGZhbHNlfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEBuYW1lc3BhY2UKLSAg
QG1ldGhvZCBhdHRyCi0gIEBmb3IgRFMKLSAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIGF0dHJp
YnV0ZSB0eXBlCi0gIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCi0g
IEByZXR1cm4ge0F0dHJpYnV0ZX0KLSovCi0KLURTLmF0dHIgPSBmdW5jdGlvbih0eXBlLCBvcHRp
b25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0gewotICAg
IHR5cGU6IHR5cGUsCi0gICAgaXNBdHRyaWJ1dGU6IHRydWUsCi0gICAgb3B0aW9uczogb3B0aW9u
cwotICB9OwotCi0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7
Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllv
dSBtYXkgbm90IHNldCBgaWRgIGFzIGFuIGF0dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2Ug
cmVtb3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sgbGlrZTogYGlkOiBEUy5hdHRyKCc8dHlwZT4nKWAg
ZnJvbSAiICsgdGhpcy5jb25zdHJ1Y3Rvci50b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOwotICAg
ICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fYXR0cmlidXRlc1trZXldIHx8IHRoaXMuX2luRmxpZ2h0
QXR0cmlidXRlc1trZXldIHx8IHRoaXMuX2RhdGFba2V5XTsKLQotICAgICAgdGhpcy5zZW5kKCdk
aWRTZXRQcm9wZXJ0eScsIHsKLSAgICAgICAgbmFtZToga2V5LAotICAgICAgICBvbGRWYWx1ZTog
b2xkVmFsdWUsCi0gICAgICAgIG9yaWdpbmFsVmFsdWU6IHRoaXMuX2RhdGFba2V5XSwKLSAgICAg
ICAgdmFsdWU6IHZhbHVlCi0gICAgICB9KTsKLQotICAgICAgdGhpcy5fYXR0cmlidXRlc1trZXld
ID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfSBlbHNlIGlmIChoYXNWYWx1ZSh0
aGlzLCBrZXkpKSB7Ci0gICAgICByZXR1cm4gZ2V0VmFsdWUodGhpcywga2V5KTsKLSAgICB9IGVs
c2UgewotICAgICAgcmV0dXJuIGdldERlZmF1bHRWYWx1ZSh0aGlzLCBvcHRpb25zLCBrZXkpOwot
ICAgIH0KLQotICAvLyBgZGF0YWAgaXMgbmV2ZXIgc2V0IGRpcmVjdGx5LiBIb3dldmVyLCBpdCBt
YXkgYmUKLSAgLy8gaW52YWxpZGF0ZWQgZnJvbSB0aGUgc3RhdGUgbWFuYWdlcidzIHNldERhdGEK
LSAgLy8gZXZlbnQuCi0gIH0pLnByb3BlcnR5KCdkYXRhJykubWV0YShtZXRhKTsKLX07Ci0KLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSov
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRh
Ci0qLwotCi0vKioKLSAgQW4gQXR0cmlidXRlQ2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHdoZW5l
dmVyIGEgcmVjb3JkJ3MKLSAgYXR0cmlidXRlIGNoYW5nZXMgdmFsdWUuIEl0IGlzIHVzZWQgdG8g
dHJhY2sgY2hhbmdlcyB0byBhCi0gIHJlY29yZCBiZXR3ZWVuIHRyYW5zYWN0aW9uIGNvbW1pdHMu
Ci0KLSAgQGNsYXNzIEF0dHJpYnV0ZUNoYW5nZQotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRl
Ci0gIEBjb25zdHJ1Y3RvcgotKi8KLXZhciBBdHRyaWJ1dGVDaGFuZ2UgPSBEUy5BdHRyaWJ1dGVD
aGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHRoaXMucmVjb3JkID0gb3B0aW9ucy5yZWNv
cmQ7Ci0gIHRoaXMuc3RvcmUgPSBvcHRpb25zLnN0b3JlOwotICB0aGlzLm5hbWUgPSBvcHRpb25z
Lm5hbWU7Ci0gIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlOwotICB0aGlzLm9sZFZhbHVlID0g
b3B0aW9ucy5vbGRWYWx1ZTsKLX07Ci0KLUF0dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBm
dW5jdGlvbihvcHRpb25zKSB7Ci0gIHJldHVybiBuZXcgQXR0cmlidXRlQ2hhbmdlKG9wdGlvbnMp
OwotfTsKLQotQXR0cmlidXRlQ2hhbmdlLnByb3RvdHlwZSA9IHsKLSAgc3luYzogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKHRoaXMudmFsdWUgIT09IHRoaXMub2xkVmFsdWUpIHsKLSAgICAgIHRoaXMu
cmVjb3JkLnNlbmQoJ2JlY29tZURpcnR5Jyk7Ci0gICAgICB0aGlzLnJlY29yZC51cGRhdGVSZWNv
cmRBcnJheXNMYXRlcigpOwotICAgIH0KLQotICAgIC8vIFRPRE86IFVzZSB0aGlzIG9iamVjdCBp
biB0aGUgY29tbWl0IHByb2Nlc3MKLSAgICB0aGlzLmRlc3Ryb3koKTsKLSAgfSwKLQotICAvKioK
LSAgICBJZiB0aGUgQXR0cmlidXRlQ2hhbmdlIGlzIGRlc3Ryb3llZCAoZWl0aGVyIGJ5IGJlaW5n
IHJvbGxlZCBiYWNrCi0gICAgb3IgYmVpbmcgY29tbWl0dGVkKSwgcmVtb3ZlIGl0IGZyb20gdGhl
IGxpc3Qgb2YgcGVuZGluZyBjaGFuZ2VzCi0gICAgb24gdGhlIHJlY29yZC4KLQotICAgIEBtZXRo
b2QgZGVzdHJveQotICAqLwotICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICBkZWxldGUgdGhp
cy5yZWNvcmQuX2NoYW5nZXNUb1N5bmNbdGhpcy5uYW1lXTsKLSAgfQotfTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51
bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci0KLS8qKgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdl
Ci0gIEBuYW1lc3BhY2UgRFMKLSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRFMuUmVs
YXRpb25zaGlwQ2hhbmdlID0gZnVuY3Rpb24ob3B0aW9ucykgewotICB0aGlzLnBhcmVudFJlY29y
ZCA9IG9wdGlvbnMucGFyZW50UmVjb3JkOwotICB0aGlzLmNoaWxkUmVjb3JkID0gb3B0aW9ucy5j
aGlsZFJlY29yZDsKLSAgdGhpcy5maXJzdFJlY29yZCA9IG9wdGlvbnMuZmlyc3RSZWNvcmQ7Ci0g
IHRoaXMuZmlyc3RSZWNvcmRLaW5kID0gb3B0aW9ucy5maXJzdFJlY29yZEtpbmQ7Ci0gIHRoaXMu
Zmlyc3RSZWNvcmROYW1lID0gb3B0aW9ucy5maXJzdFJlY29yZE5hbWU7Ci0gIHRoaXMuc2Vjb25k
UmVjb3JkID0gb3B0aW9ucy5zZWNvbmRSZWNvcmQ7Ci0gIHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9
IG9wdGlvbnMuc2Vjb25kUmVjb3JkS2luZDsKLSAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gb3B0
aW9ucy5zZWNvbmRSZWNvcmROYW1lOwotICB0aGlzLmNoYW5nZVR5cGUgPSBvcHRpb25zLmNoYW5n
ZVR5cGU7Ci0gIHRoaXMuc3RvcmUgPSBvcHRpb25zLnN0b3JlOwotCi0gIHRoaXMuY29tbWl0dGVk
ID0ge307Ci19OwotCi0vKioKLSAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZUFkZAotICBAbmFt
ZXNwYWNlIERTCi0gIEBwcml2YXRlCi0gIEBjb25zdHJ1Y3RvcgotKi8KLURTLlJlbGF0aW9uc2hp
cENoYW5nZUFkZCA9IGZ1bmN0aW9uKG9wdGlvbnMpewotICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2Uu
Y2FsbCh0aGlzLCBvcHRpb25zKTsKLX07Ci0KLS8qKgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hh
bmdlUmVtb3ZlCi0gIEBuYW1lc3BhY2UgRFMKLSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCi0q
LwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIERT
LlJlbGF0aW9uc2hpcENoYW5nZS5jYWxsKHRoaXMsIG9wdGlvbnMpOwotfTsKLQotRFMuUmVsYXRp
b25zaGlwQ2hhbmdlLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBE
Uy5SZWxhdGlvbnNoaXBDaGFuZ2Uob3B0aW9ucyk7Ci19OwotCi1EUy5SZWxhdGlvbnNoaXBDaGFu
Z2VBZGQuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewotICByZXR1cm4gbmV3IERTLlJlbGF0
aW9uc2hpcENoYW5nZUFkZChvcHRpb25zKTsKLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZVJl
bW92ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHJldHVybiBuZXcgRFMuUmVsYXRp
b25zaGlwQ2hhbmdlUmVtb3ZlKG9wdGlvbnMpOwotfTsKLQotRFMuT25lVG9NYW55Q2hhbmdlID0g
e307Ci1EUy5PbmVUb05vbmVDaGFuZ2UgPSB7fTsKLURTLk1hbnlUb05vbmVDaGFuZ2UgPSB7fTsK
LURTLk9uZVRvT25lQ2hhbmdlID0ge307Ci1EUy5NYW55VG9NYW55Q2hhbmdlID0ge307Ci0KLURT
LlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0g
IGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFkZCIpewotICAgIHJldHVybiBEUy5SZWxhdGlv
bnNoaXBDaGFuZ2VBZGQuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci0gIGlmKG9wdGlvbnMuY2hhbmdl
VHlwZSA9PT0gInJlbW92ZSIpewotICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1v
dmUuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci19OwotCi0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5k
ZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlID0gZnVuY3Rpb24ocmVjb3JkVHlwZSwga25vd25TaWRl
KXsKLSAgdmFyIGtub3duS2V5ID0ga25vd25TaWRlLmtleSwga2V5LCBvdGhlcktpbmQ7Ci0gIHZh
ciBrbm93bktpbmQgPSBrbm93blNpZGUua2luZDsKLQotICB2YXIgaW52ZXJzZSA9IHJlY29yZFR5
cGUuaW52ZXJzZUZvcihrbm93bktleSk7Ci0KLSAgaWYgKGludmVyc2UpewotICAgIGtleSA9IGlu
dmVyc2UubmFtZTsKLSAgICBvdGhlcktpbmQgPSBpbnZlcnNlLmtpbmQ7Ci0gIH0KLQotICBpZiAo
IWludmVyc2UpewotICAgIHJldHVybiBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRv
Tm9uZSIgOiAibWFueVRvTm9uZSI7Ci0gIH0KLSAgZWxzZXsKLSAgICBpZihvdGhlcktpbmQgPT09
ICJiZWxvbmdzVG8iKXsKLSAgICAgIHJldHVybiBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8g
Im9uZVRvT25lIiA6ICJtYW55VG9PbmUiOwotICAgIH0KLSAgICBlbHNlewotICAgICAgcmV0dXJu
IGtub3duS2luZCA9PT0gImJlbG9uZ3NUbyIgPyAib25lVG9NYW55IiA6ICJtYW55VG9NYW55IjsK
LSAgICB9Ci0gIH0KLQotfTsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9
IGZ1bmN0aW9uKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKXsKLSAg
Ly8gR2V0IHRoZSB0eXBlIG9mIHRoZSBjaGlsZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQg
SUQKLSAgdmFyIGZpcnN0UmVjb3JkVHlwZSA9IGZpcnN0UmVjb3JkLmNvbnN0cnVjdG9yLCBjaGFu
Z2VUeXBlOwotICBjaGFuZ2VUeXBlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmRldGVybWluZVJl
bGF0aW9uc2hpcFR5cGUoZmlyc3RSZWNvcmRUeXBlLCBvcHRpb25zKTsKLSAgaWYgKGNoYW5nZVR5
cGUgPT09ICJvbmVUb01hbnkiKXsKLSAgICByZXR1cm4gRFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0
ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25kUmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7Ci0gIH0K
LSAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gIm1hbnlUb09uZSIpewotICAgIHJldHVybiBEUy5P
bmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlKHNlY29uZFJlY29yZCwgZmlyc3RSZWNvcmQsIHN0
b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9Ob25l
Iil7Ci0gICAgcmV0dXJuIERTLk9uZVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNv
cmQsIHNlY29uZFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNoYW5n
ZVR5cGUgPT09ICJtYW55VG9Ob25lIil7Ci0gICAgcmV0dXJuIERTLk1hbnlUb05vbmVDaGFuZ2Uu
Y3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsK
LSAgfQotICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9PbmUiKXsKLSAgICByZXR1cm4g
RFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQs
IHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAibWFueVRv
TWFueSIpewotICAgIHJldHVybiBEUy5NYW55VG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJz
dFJlY29yZCwgc2Vjb25kUmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7Ci0gIH0KLX07Ci0KLURTLk9u
ZVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50
UmVjb3JkLCBzdG9yZSwgb3B0aW9ucykgewotICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7Ci0gIHZh
ciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7Ci0gICAgICBw
YXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwKLSAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29y
ZCwKLSAgICAgIGZpcnN0UmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwK
LSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0UmVjb3Jk
TmFtZToga2V5LAotICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVsb25nc1RvIgotICB9KTsKLQot
ICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50
UmVjb3JkLCBudWxsLCBjaGFuZ2UpOwotCi0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi1EUy5NYW55
VG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGNoaWxkUmVjb3JkLCBwYXJlbnRS
ZWNvcmQsIHN0b3JlLCBvcHRpb25zKSB7Ci0gIHZhciBrZXkgPSBvcHRpb25zLmtleTsKLSAgdmFy
IGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBh
cmVudFJlY29yZDogY2hpbGRSZWNvcmQsCi0gICAgICBjaGlsZFJlY29yZDogcGFyZW50UmVjb3Jk
LAotICAgICAgc2Vjb25kUmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwK
LSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIHNlY29uZFJlY29y
ZE5hbWU6IG9wdGlvbnMua2V5LAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiCi0g
IH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5
LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7Ci0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi0K
LURTLk1hbnlUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQs
IHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKLSAgLy8gSWYgdGhlIG5hbWUgb2YgdGhl
IGJlbG9uZ3NUbyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgc3BlY2lmaWVkLAotICAvLyB1
c2UgdGhhdAotICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9v
ayBpdCB1cCBvbiB0aGUgY2hpbGQncyB0eXBlCi0gIC8vIGRlZmluaXRpb24uCi0gIHZhciBrZXkg
PSBvcHRpb25zLmtleTsKLQotICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9j
cmVhdGVDaGFuZ2UoewotICAgICAgcGFyZW50UmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBj
aGlsZFJlY29yZDogY2hpbGRSZWNvcmQsCi0gICAgICBmaXJzdFJlY29yZDogY2hpbGRSZWNvcmQs
Ci0gICAgICBzZWNvbmRSZWNvcmQ6IHBhcmVudFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkS2lu
ZDogImhhc01hbnkiLAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiLAotICAgICAg
c3RvcmU6IHN0b3JlLAotICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAotICAg
ICAgZmlyc3RSZWNvcmROYW1lOiAga2V5Ci0gIH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9uc2hp
cENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7
Ci0KLQotICByZXR1cm4gY2hhbmdlOwotfTsKLQotRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hh
bmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMp
IHsKLSAgdmFyIGtleTsKLQotICAvLyBJZiB0aGUgbmFtZSBvZiB0aGUgYmVsb25nc1RvIHNpZGUg
b2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVjaWZpZWQsCi0gIC8vIHVzZSB0aGF0Ci0gIC8vIElm
IHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRoZSBj
aGlsZCdzIHR5cGUKLSAgLy8gZGVmaW5pdGlvbi4KLSAgaWYgKG9wdGlvbnMucGFyZW50VHlwZSkg
ewotICAgIGtleSA9IG9wdGlvbnMucGFyZW50VHlwZS5pbnZlcnNlRm9yKG9wdGlvbnMua2V5KS5u
YW1lOwotICB9IGVsc2UgaWYgKG9wdGlvbnMua2V5KSB7Ci0gICAga2V5ID0gb3B0aW9ucy5rZXk7
Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHBh
cmVudFR5cGUgb3IgYmVsb25nc1RvTmFtZSBvcHRpb24gdG8gT25lVG9NYW55Q2hhbmdlLmZvckNo
aWxkQW5kUGFyZW50IiwgZmFsc2UpOwotICB9Ci0KLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9u
c2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBhcmVudFJlY29yZDogcGFyZW50UmVj
b3JkLAotICAgICAgY2hpbGRSZWNvcmQ6IGNoaWxkUmVjb3JkLAotICAgICAgZmlyc3RSZWNvcmQ6
IGNoaWxkUmVjb3JkLAotICAgICAgc2Vjb25kUmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBm
aXJzdFJlY29yZEtpbmQ6ICJiZWxvbmdzVG8iLAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImJl
bG9uZ3NUbyIsCi0gICAgICBzdG9yZTogc3RvcmUsCi0gICAgICBjaGFuZ2VUeXBlOiBvcHRpb25z
LmNoYW5nZVR5cGUsCi0gICAgICBmaXJzdFJlY29yZE5hbWU6ICBrZXkKLSAgfSk7Ci0KLSAgc3Rv
cmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVjb3JkLCBrZXksIHBhcmVudFJlY29y
ZCwgbnVsbCwgY2hhbmdlKTsKLQotCi0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi1EUy5PbmVUb09u
ZUNoYW5nZS5tYWludGFpbkludmFyaWFudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGls
ZFJlY29yZCwga2V5KXsKLSAgaWYgKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFkZCIgJiYgc3Rv
cmUucmVjb3JkSXNNYXRlcmlhbGl6ZWQoY2hpbGRSZWNvcmQpKSB7Ci0gICAgdmFyIG9sZFBhcmVu
dCA9IGdldChjaGlsZFJlY29yZCwga2V5KTsKLSAgICBpZiAob2xkUGFyZW50KXsKLSAgICAgIHZh
ciBjb3JyZXNwb25kaW5nQ2hhbmdlID0gRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNo
aWxkUmVjb3JkLCBvbGRQYXJlbnQsIHN0b3JlLCB7Ci0gICAgICAgICAgcGFyZW50VHlwZTogb3B0
aW9ucy5wYXJlbnRUeXBlLAotICAgICAgICAgIGhhc01hbnlOYW1lOiBvcHRpb25zLmhhc01hbnlO
YW1lLAotICAgICAgICAgIGNoYW5nZVR5cGU6ICJyZW1vdmUiLAotICAgICAgICAgIGtleTogb3B0
aW9ucy5rZXkKLSAgICAgICAgfSk7Ci0gICAgICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VG
b3IoY2hpbGRSZWNvcmQsIGtleSwgb3B0aW9ucy5wYXJlbnRSZWNvcmQgLCBudWxsLCBjb3JyZXNw
b25kaW5nQ2hhbmdlKTsKLSAgICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5jKCk7Ci0gICAgfQot
ICB9Ci19OwotCi1EUy5PbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hp
bGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKLSAgdmFyIGtleTsKLQot
ICAvLyBJZiB0aGUgbmFtZSBvZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hp
cCBpcyBzcGVjaWZpZWQsCi0gIC8vIHVzZSB0aGF0Ci0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBw
YXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKLSAgLy8g
ZGVmaW5pdGlvbi4KLSAgaWYgKG9wdGlvbnMucGFyZW50VHlwZSkgewotICAgIGtleSA9IG9wdGlv
bnMucGFyZW50VHlwZS5pbnZlcnNlRm9yKG9wdGlvbnMua2V5KS5uYW1lOwotICAgIERTLk9uZVRv
TWFueUNoYW5nZS5tYWludGFpbkludmFyaWFudCggb3B0aW9ucywgc3RvcmUsIGNoaWxkUmVjb3Jk
LCBrZXkgKTsKLSAgfSBlbHNlIGlmIChvcHRpb25zLmtleSkgewotICAgIGtleSA9IG9wdGlvbnMu
a2V5OwotICB9IGVsc2UgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBlaXRoZXIg
YSBwYXJlbnRUeXBlIG9yIGJlbG9uZ3NUb05hbWUgb3B0aW9uIHRvIE9uZVRvTWFueUNoYW5nZS5m
b3JDaGlsZEFuZFBhcmVudCIsIGZhbHNlKTsKLSAgfQotCi0gIHZhciBjaGFuZ2UgPSBEUy5SZWxh
dGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7Ci0gICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVu
dFJlY29yZCwKLSAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIGZpcnN0UmVj
b3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIHNlY29uZFJlY29yZDogcGFyZW50UmVjb3JkLAotICAg
ICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVsb25nc1RvIiwKLSAgICAgIHNlY29uZFJlY29yZEtpbmQ6
ICJoYXNNYW55IiwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlv
bnMuY2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0UmVjb3JkTmFtZTogIGtleQotICB9KTsKLQotICBz
dG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVj
b3JkLCBjaGFuZ2UuZ2V0U2Vjb25kUmVjb3JkTmFtZSgpLCBjaGFuZ2UpOwotCi0KLSAgcmV0dXJu
IGNoYW5nZTsKLX07Ci0KLQotRFMuT25lVG9NYW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50ID0g
ZnVuY3Rpb24ob3B0aW9ucywgc3RvcmUsIGNoaWxkUmVjb3JkLCBrZXkpewotICBpZiAob3B0aW9u
cy5jaGFuZ2VUeXBlID09PSAiYWRkIiAmJiBjaGlsZFJlY29yZCkgewotICAgIHZhciBvbGRQYXJl
bnQgPSBnZXQoY2hpbGRSZWNvcmQsIGtleSk7Ci0gICAgaWYgKG9sZFBhcmVudCl7Ci0gICAgICB2
YXIgY29ycmVzcG9uZGluZ0NoYW5nZSA9IERTLk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2Uo
Y2hpbGRSZWNvcmQsIG9sZFBhcmVudCwgc3RvcmUsIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBv
cHRpb25zLnBhcmVudFR5cGUsCi0gICAgICAgICAgaGFzTWFueU5hbWU6IG9wdGlvbnMuaGFzTWFu
eU5hbWUsCi0gICAgICAgICAgY2hhbmdlVHlwZTogInJlbW92ZSIsCi0gICAgICAgICAga2V5OiBv
cHRpb25zLmtleQotICAgICAgICB9KTsKLSAgICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5n
ZUZvcihjaGlsZFJlY29yZCwga2V5LCBvcHRpb25zLnBhcmVudFJlY29yZCwgY29ycmVzcG9uZGlu
Z0NoYW5nZS5nZXRTZWNvbmRSZWNvcmROYW1lKCksIGNvcnJlc3BvbmRpbmdDaGFuZ2UpOwotICAg
ICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5jKCk7Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAg
QGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZQotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuUmVsYXRp
b25zaGlwQ2hhbmdlLnByb3RvdHlwZSA9IHsKLQotICBnZXRTZWNvbmRSZWNvcmROYW1lOiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgbmFtZSA9IHRoaXMuc2Vjb25kUmVjb3JkTmFtZSwgcGFyZW50Owot
Ci0gICAgaWYgKCFuYW1lKSB7Ci0gICAgICBwYXJlbnQgPSB0aGlzLnNlY29uZFJlY29yZDsKLSAg
ICAgIGlmICghcGFyZW50KSB7IHJldHVybjsgfQotCi0gICAgICB2YXIgY2hpbGRUeXBlID0gdGhp
cy5maXJzdFJlY29yZC5jb25zdHJ1Y3RvcjsKLSAgICAgIHZhciBpbnZlcnNlID0gY2hpbGRUeXBl
LmludmVyc2VGb3IodGhpcy5maXJzdFJlY29yZE5hbWUpOwotICAgICAgdGhpcy5zZWNvbmRSZWNv
cmROYW1lID0gaW52ZXJzZS5uYW1lOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLnNlY29uZFJl
Y29yZE5hbWU7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlv
bnNoaXAgb24gdGhlIGJlbG9uZ3NUbyBzaWRlLgotCi0gICAgQG1ldGhvZCBnZXRGaXJzdFJlY29y
ZE5hbWUKLSAgICBAcmV0dXJuIHtTdHJpbmd9Ci0gICovCi0gIGdldEZpcnN0UmVjb3JkTmFtZTog
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWUgPSB0aGlzLmZpcnN0UmVjb3JkTmFtZTsKLSAgICBy
ZXR1cm4gbmFtZTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICBAcHJp
dmF0ZQotICAqLwotICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY2hpbGRSZWNvcmQg
PSB0aGlzLmNoaWxkUmVjb3JkLAotICAgICAgICBiZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJz
dFJlY29yZE5hbWUoKSwKLSAgICAgICAgaGFzTWFueU5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29y
ZE5hbWUoKSwKLSAgICAgICAgc3RvcmUgPSB0aGlzLnN0b3JlOwotCi0gICAgc3RvcmUucmVtb3Zl
UmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVjb3JkLCBiZWxvbmdzVG9OYW1lLCB0aGlzLnBh
cmVudFJlY29yZCwgaGFzTWFueU5hbWUsIHRoaXMuY2hhbmdlVHlwZSk7Ci0gIH0sCi0KLSAgZ2V0
U2Vjb25kUmVjb3JkOiBmdW5jdGlvbigpewotICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZDsK
LSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGdldEZpcnN0UmVjb3JkCi0gICAgQHByaXZhdGUK
LSAgKi8KLSAgZ2V0Rmlyc3RSZWNvcmQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmZp
cnN0UmVjb3JkOwotICB9LAotCi0gIGNvYWxlc2NlOiBmdW5jdGlvbigpewotICAgIHZhciByZWxh
dGlvbnNoaXBQYWlycyA9IHRoaXMuc3RvcmUucmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IodGhp
cy5maXJzdFJlY29yZCk7Ci0gICAgZm9yRWFjaChyZWxhdGlvbnNoaXBQYWlycywgZnVuY3Rpb24o
cGFpcil7Ci0gICAgICB2YXIgYWRkZWRDaGFuZ2UgPSBwYWlyWyJhZGQiXTsKLSAgICAgIHZhciBy
ZW1vdmVkQ2hhbmdlID0gcGFpclsicmVtb3ZlIl07Ci0gICAgICBpZihhZGRlZENoYW5nZSAmJiBy
ZW1vdmVkQ2hhbmdlKSB7Ci0gICAgICAgIGFkZGVkQ2hhbmdlLmRlc3Ryb3koKTsKLSAgICAgICAg
cmVtb3ZlZENoYW5nZS5kZXN0cm95KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLURT
LlJlbGF0aW9uc2hpcENoYW5nZUFkZC5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoRFMuUmVsYXRp
b25zaGlwQ2hhbmdlLmNyZWF0ZSh7fSkpOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnBy
b3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7
Ci0KLS8vIHRoZSBvYmplY3QgaXMgYSB2YWx1ZSwgYW5kIG5vdCBhIHByb21pc2UKLWZ1bmN0aW9u
IGlzVmFsdWUob2JqZWN0KSB7Ci0gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAm
JiAoIW9iamVjdC50aGVuIHx8IHR5cGVvZiBvYmplY3QudGhlbiAhPT0gJ2Z1bmN0aW9uJyk7Ci19
Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFkZC5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJhZGQi
OwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRkLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7
Ci0gIHZhciBzZWNvbmRSZWNvcmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0g
ICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAg
Zmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQg
PSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwotCi0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lm
aWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFt
ZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVj
dG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsg
Y2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91
IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hp
bGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55
IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMu
bGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgaWYgKHNl
Y29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2Yg
RFMuTW9kZWwpIHsKLSAgICBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8i
KXsKLSAgICAgIHNlY29uZFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0
aW9uKCl7Ci0gICAgICAgIHNldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIGZpcnN0
UmVjb3JkKTsKLSAgICAgIH0pOwotCi0gICAgIH0KLSAgICAgZWxzZSBpZih0aGlzLnNlY29uZFJl
Y29yZEtpbmQgPT09ICJoYXNNYW55Iil7Ci0gICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJlbGF0
aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpewotICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0g
Z2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSk7Ci0gICAgICAgIGlmIChpc1ZhbHVl
KHJlbGF0aW9uc2hpcCkpIHsgcmVsYXRpb25zaGlwLmFkZE9iamVjdChmaXJzdFJlY29yZCk7IH0K
LSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIGlmIChmaXJzdFJlY29yZCBpbnN0YW5jZW9mIERT
Lk1vZGVsICYmIHNlY29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGdldChmaXJzdFJl
Y29yZCwgZmlyc3RSZWNvcmROYW1lKSAhPT0gc2Vjb25kUmVjb3JkKSB7Ci0gICAgaWYodGhpcy5m
aXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIGZpcnN0UmVjb3JkLnN1c3Bl
bmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgc2V0KGZpcnN0UmVj
b3JkLCBmaXJzdFJlY29yZE5hbWUsIHNlY29uZFJlY29yZCk7Ci0gICAgICB9KTsKLSAgICB9Ci0g
ICAgZWxzZSBpZih0aGlzLmZpcnN0UmVjb3JkS2luZCA9PT0gImhhc01hbnkiKXsKLSAgICAgIGZp
cnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAg
ICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKTsK
LSAgICAgICAgaWYgKGlzVmFsdWUocmVsYXRpb25zaGlwKSkgeyByZWxhdGlvbnNoaXAuYWRkT2Jq
ZWN0KHNlY29uZFJlY29yZCk7IH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIHRoaXMuY29h
bGVzY2UoKTsKLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5wcm90b3R5cGUuY2hh
bmdlVHlwZSA9ICJyZW1vdmUiOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlw
ZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzZWNvbmRSZWNvcmROYW1lID0gdGhpcy5nZXRT
ZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlzLmdldEZpcnN0
UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCks
Ci0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwotCi0gIC8vRW1i
ZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikg
b24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlz
Lmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZl
cnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOwot
ICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NU
b05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNp
ZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQg
fHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNN
YW55TmFtZSk7Ci0KLSAgaWYgKHNlY29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGZp
cnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsKLSAgICBpZih0aGlzLnNlY29uZFJlY29y
ZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIHNlY29uZFJlY29yZC5zdXNwZW5kUmVsYXRp
b25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7Ci0gICAgICAgIHNldChzZWNvbmRSZWNvcmQsIHNl
Y29uZFJlY29yZE5hbWUsIG51bGwpOwotICAgICAgfSk7Ci0gICAgfQotICAgIGVsc2UgaWYodGhp
cy5zZWNvbmRSZWNvcmRLaW5kID09PSAiaGFzTWFueSIpewotICAgICAgc2Vjb25kUmVjb3JkLnN1
c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHJlbGF0
aW9uc2hpcCA9IGdldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUpOwotICAgICAgICBp
ZiAoaXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3QoZmly
c3RSZWNvcmQpOyB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmlyc3RSZWNvcmQg
aW5zdGFuY2VvZiBEUy5Nb2RlbCAmJiBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSkp
IHsKLSAgICBpZih0aGlzLmZpcnN0UmVjb3JkS2luZCA9PT0gImJlbG9uZ3NUbyIpewotICAgICAg
Zmlyc3RSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpewotICAg
ICAgICBzZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSwgbnVsbCk7Ci0gICAgICB9KTsK
LSAgICAgfQotICAgICBlbHNlIGlmKHRoaXMuZmlyc3RSZWNvcmRLaW5kID09PSAiaGFzTWFueSIp
ewotICAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rp
b24oKXsKLSAgICAgICAgIHZhciByZWxhdGlvbnNoaXAgPSBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0
UmVjb3JkTmFtZSk7Ci0gICAgICAgICBpZiAoaXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7IHJlbGF0
aW9uc2hpcC5yZW1vdmVPYmplY3Qoc2Vjb25kUmVjb3JkKTsgfQotICAgICAgfSk7Ci0gICAgfQot
ICB9Ci0KLSAgdGhpcy5jb2FsZXNjZSgpOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCi0gICAgaXNOb25l
ID0gRW1iZXIuaXNOb25lOwotCi0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi1mdW5j
dGlvbiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBvcHRpb25zLCBtZXRhKSB7Ci0gIHJldHVybiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhp
cywgJ2RhdGEnKSwKLSAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAg
IHByb21pc2VMYWJlbCA9ICJEUzogQXN5bmMgYmVsb25nc1RvICIgKyB0aGlzICsgIiA6ICIgKyBr
ZXk7Ci0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgY2FuIG9ubHkgYWRkIGEgJyIgKyB0eXBlICsgIicgcmVjb3JkIHRvIHRoaXMgcmVs
YXRpb25zaGlwIiwgIXZhbHVlIHx8IHZhbHVlIGluc3RhbmNlb2Ygc3RvcmUubW9kZWxGb3IodHlw
ZSkpOwotICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogRFMuUHJvbWlz
ZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBFbWJlci5SU1ZQLnJlc29sdmUodmFsdWUsIHByb21p
c2VMYWJlbCkgfSk7Ci0gICAgfQotCi0gICAgdmFyIGxpbmsgPSBkYXRhLmxpbmtzICYmIGRhdGEu
bGlua3Nba2V5XSwKLSAgICAgICAgYmVsb25nc1RvID0gZGF0YVtrZXldOwotCi0gICAgaWYoIWlz
Tm9uZShiZWxvbmdzVG8pKSB7Ci0gICAgICB2YXIgcHJvbWlzZSA9IHN0b3JlLmZldGNoUmVjb3Jk
KGJlbG9uZ3NUbykgfHwgRW1iZXIuUlNWUC5yZXNvbHZlKGJlbG9uZ3NUbywgcHJvbWlzZUxhYmVs
KTsKLSAgICAgIHJldHVybiBEUy5Qcm9taXNlT2JqZWN0LmNyZWF0ZSh7IHByb21pc2U6IHByb21p
c2V9KTsKLSAgICB9IGVsc2UgaWYgKGxpbmspIHsKLSAgICAgIHZhciByZXNvbHZlciA9IEVtYmVy
LlJTVlAuZGVmZXIoIkRTOiBBc3luYyBiZWxvbmdzVG8gKGxpbmspICIgKyB0aGlzICsgIiA6ICIg
KyBrZXkpOwotICAgICAgc3RvcmUuZmluZEJlbG9uZ3NUbyh0aGlzLCBsaW5rLCBtZXRhLCByZXNv
bHZlcik7Ci0gICAgICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBy
ZXNvbHZlci5wcm9taXNlIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAg
ICB9Ci0gIH0pLnByb3BlcnR5KCdkYXRhJykubWV0YShtZXRhKTsKLX0KLQotLyoqCi0gIGBEUy5i
ZWxvbmdzVG9gIGlzIHVzZWQgdG8gZGVmaW5lIE9uZS1Uby1PbmUgYW5kIE9uZS1Uby1NYW55Ci0g
IHJlbGF0aW9uc2hpcHMgb24gYSBbRFMuTW9kZWxdKERTLk1vZGVsLmh0bWwpLgotCi0KLSAgYERT
LmJlbG9uZ3NUb2AgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIs
IGN1cnJlbnRseQotICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6Ci0KLSAgLSBgYXN5bmNgOiBBIGJv
b2xlYW4gdmFsdWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3lu
YyByZWxhdGlvbnNoaXAuCi0gIC0gYGludmVyc2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5
IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9uIGEKLSAgICByZWxhdGVkIG1vZGVsIGluIGEgT25lLVRv
LU1hbnkgcmVsYXRpb25zaGlwLiBTZWUgW0V4cGxpY2l0IEludmVyc2VzXSgjdG9jX2V4cGxpY2l0
LWludmVyc2VzKQotCi0gICMjIyMgT25lLVRvLU9uZQotICBUbyBkZWNsYXJlIGEgb25lLXRvLW9u
ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2A6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAg
cHJvZmlsZTogRFMuYmVsb25nc1RvKCdwcm9maWxlJykKLSAgfSk7Ci0KLSAgQXBwLlByb2ZpbGUg
PSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHVzZXI6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gIH0p
OwotICBgYGAKLQotICAjIyMjIE9uZS1Uby1NYW55Ci0gIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFu
eSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2Ag
aW4gY29tYmluYXRpb24gd2l0aCBgRFMuaGFzTWFueWAsIGxpa2UgdGhpczoKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBjb21tZW50czogRFMu
aGFzTWFueSgnY29tbWVudCcpCi0gIH0pOwotCi0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ3Bvc3QnKQotICB9KTsKLSAgYGBgCi0KLSAg
QG5hbWVzcGFjZQotICBAbWV0aG9kIGJlbG9uZ3NUbwotICBAZm9yIERTCi0gIEBwYXJhbSB7U3Ry
aW5nIG9yIERTLk1vZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAK
LSAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlvbnMKLSAgQHJldHVybiB7
RW1iZXIuY29tcHV0ZWR9IHJlbGF0aW9uc2hpcAotKi8KLURTLmJlbG9uZ3NUbyA9IGZ1bmN0aW9u
KHR5cGUsIG9wdGlvbnMpIHsKLSAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JykgewotICAg
IG9wdGlvbnMgPSB0eXBlOwotICAgIHR5cGUgPSB1bmRlZmluZWQ7Ci0gIH0gZWxzZSB7Ci0gICAg
RW1iZXIuYXNzZXJ0KCJUaGUgZmlyc3QgYXJndW1lbnQgRFMuYmVsb25nc1RvIG11c3QgYmUgYSBt
b2RlbCB0eXBlIG9yIHN0cmluZywgbGlrZSBEUy5iZWxvbmdzVG8oQXBwLlBlcnNvbikiLCAhIXR5
cGUgJiYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCBEUy5Nb2RlbC5kZXRlY3QodHlwZSkp
KTsKLSAgfQotCi0gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0geyB0
eXBlOiB0eXBlLCBpc1JlbGF0aW9uc2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDog
J2JlbG9uZ3NUbycgfTsKLQotICBpZiAob3B0aW9ucy5hc3luYykgewotICAgIHJldHVybiBhc3lu
Y0JlbG9uZ3NUbyh0eXBlLCBvcHRpb25zLCBtZXRhKTsKLSAgfQotCi0gIHJldHVybiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhpcywg
J2RhdGEnKSwKLSAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksIGJlbG9uZ3NUbywg
dHlwZUNsYXNzOwotCi0gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewotICAgICAg
dHlwZUNsYXNzID0gc3RvcmUubW9kZWxGb3IodHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5
cGVDbGFzcyA9IHR5cGU7Ci0gICAgfQotCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIp
IHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IGFkZCBhICciICsgdHlwZSArICIn
IHJlY29yZCB0byB0aGlzIHJlbGF0aW9uc2hpcCIsICF2YWx1ZSB8fCB2YWx1ZSBpbnN0YW5jZW9m
IHR5cGVDbGFzcyk7Ci0gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2
YWx1ZTsKLSAgICB9Ci0KLSAgICBiZWxvbmdzVG8gPSBkYXRhW2tleV07Ci0KLSAgICBpZiAoaXNO
b25lKGJlbG9uZ3NUbykpIHsgcmV0dXJuIG51bGw7IH0KLQotICAgIHN0b3JlLmZldGNoUmVjb3Jk
KGJlbG9uZ3NUbyk7Ci0KLSAgICByZXR1cm4gYmVsb25nc1RvOwotICB9KS5wcm9wZXJ0eSgnZGF0
YScpLm1ldGEobWV0YSk7Ci19OwotCi0vKioKLSAgVGhlc2Ugb2JzZXJ2ZXJzIG9ic2VydmUgYWxs
IGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcHMgb24gdGhlIHJlY29yZC4gU2VlCi0gIGByZWxhdGlv
bnNoaXBzL2V4dGAgdG8gc2VlIGhvdyB0aGVzZSBvYnNlcnZlcnMgZ2V0IHRoZWlyIGRlcGVuZGVu
Y2llcy4KLQotICBAY2xhc3MgTW9kZWwKLSAgQG5hbWVzcGFjZSBEUwotKi8KLURTLk1vZGVsLnJl
b3Blbih7Ci0KLSAgLyoqCi0gICAgQG1ldGhvZCBiZWxvbmdzVG9XaWxsQ2hhbmdlCi0gICAgQHBy
aXZhdGUKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHJlY29yZAotICAgIEBwYXJhbSBrZXkKLSAg
Ki8KLSAgYmVsb25nc1RvV2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24o
cmVjb3JkLCBrZXkpIHsKLSAgICBpZiAoZ2V0KHJlY29yZCwgJ2lzTG9hZGVkJykpIHsKLSAgICAg
IHZhciBvbGRQYXJlbnQgPSBnZXQocmVjb3JkLCBrZXkpOwotCi0gICAgICBpZiAob2xkUGFyZW50
KSB7Ci0gICAgICAgIHZhciBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpLAotICAgICAgICAg
ICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG9s
ZFBhcmVudCwgc3RvcmUsIHsga2V5OiBrZXksIGtpbmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBl
OiAicmVtb3ZlIiB9KTsKLQotICAgICAgICBjaGFuZ2Uuc3luYygpOwotICAgICAgICB0aGlzLl9j
aGFuZ2VzVG9TeW5jW2tleV0gPSBjaGFuZ2U7Ci0gICAgICB9Ci0gICAgfQotICB9KSwKLQotICAv
KioKLSAgICBAbWV0aG9kIGJlbG9uZ3NUb0RpZENoYW5nZQotICAgIEBwcml2YXRlCi0gICAgQHN0
YXRpYwotICAgIEBwYXJhbSByZWNvcmQKLSAgICBAcGFyYW0ga2V5Ci0gICovCi0gIGJlbG9uZ3NU
b0RpZENoYW5nZTogRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkp
IHsKLSAgICBpZiAoZ2V0KHJlY29yZCwgJ2lzTG9hZGVkJykpIHsKLSAgICAgIHZhciBuZXdQYXJl
bnQgPSBnZXQocmVjb3JkLCBrZXkpOwotCi0gICAgICBpZiAobmV3UGFyZW50KSB7Ci0gICAgICAg
IHZhciBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpLAotICAgICAgICAgICAgY2hhbmdlID0g
RFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG5ld1BhcmVudCwgc3Rv
cmUsIHsga2V5OiBrZXksIGtpbmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBlOiAiYWRkIiB9KTsK
LQotICAgICAgICBjaGFuZ2Uuc3luYygpOwotICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZSB0
aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV07Ci0gIH0pCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldCwgc2V0UHJvcGVydGllcyA9IEVtYmVyLnNldFByb3BlcnRp
ZXM7Ci0KLWZ1bmN0aW9uIGFzeW5jSGFzTWFueSh0eXBlLCBvcHRpb25zLCBtZXRhKSB7Ci0gIHJl
dHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIHJlbGF0
aW9uc2hpcCA9IHRoaXMuX3JlbGF0aW9uc2hpcHNba2V5XSwKLSAgICAgICAgcHJvbWlzZUxhYmVs
ID0gIkRTOiBBc3luYyBoYXNNYW55ICIgKyB0aGlzICsgIiA6ICIgKyBrZXk7Ci0KLSAgICBpZiAo
IXJlbGF0aW9uc2hpcCkgewotICAgICAgdmFyIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihw
cm9taXNlTGFiZWwpOwotICAgICAgcmVsYXRpb25zaGlwID0gYnVpbGRSZWxhdGlvbnNoaXAodGhp
cywga2V5LCBvcHRpb25zLCBmdW5jdGlvbihzdG9yZSwgZGF0YSkgewotICAgICAgICB2YXIgbGlu
ayA9IGRhdGEubGlua3MgJiYgZGF0YS5saW5rc1trZXldOwotICAgICAgICB2YXIgcmVsOwotICAg
ICAgICBpZiAobGluaykgewotICAgICAgICAgIHJlbCA9IHN0b3JlLmZpbmRIYXNNYW55KHRoaXMs
IGxpbmssIG1ldGEsIHJlc29sdmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWwg
PSBzdG9yZS5maW5kTWFueSh0aGlzLCBkYXRhW2tleV0sIG1ldGEudHlwZSwgcmVzb2x2ZXIpOwot
ICAgICAgICB9Ci0gICAgICAgIC8vIGNhY2hlIHRoZSBwcm9taXNlIHNvIHdlIGNhbiB1c2UgaXQK
LSAgICAgICAgLy8gd2hlbiB3ZSBjb21lIGJhY2sgYW5kIGRvbid0IG5lZWQgdG8gcmVidWlsZAot
ICAgICAgICAvLyB0aGUgcmVsYXRpb25zaGlwLgotICAgICAgICBzZXQocmVsLCAncHJvbWlzZScs
IHJlc29sdmVyLnByb21pc2UpOwotICAgICAgICByZXR1cm4gcmVsOwotICAgICAgfSk7Ci0gICAg
fQotCi0gICAgdmFyIHByb21pc2UgPSByZWxhdGlvbnNoaXAuZ2V0KCdwcm9taXNlJykudGhlbihm
dW5jdGlvbigpIHsKLSAgICAgIHJldHVybiByZWxhdGlvbnNoaXA7Ci0gICAgfSwgbnVsbCwgIkRT
OiBBc3luYyBoYXNNYW55IHJlY29yZHMgcmVjZWl2ZWQiKTsKLQotICAgIHJldHVybiBEUy5Qcm9t
aXNlQXJyYXkuY3JlYXRlKHsgcHJvbWlzZTogcHJvbWlzZSB9KTsKLSAgfSkucHJvcGVydHkoJ2Rh
dGEnKS5tZXRhKG1ldGEpOwotfQotCi1mdW5jdGlvbiBidWlsZFJlbGF0aW9uc2hpcChyZWNvcmQs
IGtleSwgb3B0aW9ucywgY2FsbGJhY2spIHsKLSAgdmFyIHJlbHMgPSByZWNvcmQuX3JlbGF0aW9u
c2hpcHM7Ci0KLSAgaWYgKHJlbHNba2V5XSkgeyByZXR1cm4gcmVsc1trZXldOyB9Ci0KLSAgdmFy
IGRhdGEgPSBnZXQocmVjb3JkLCAnZGF0YScpLAotICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAn
c3RvcmUnKTsKLQotICB2YXIgcmVsYXRpb25zaGlwID0gcmVsc1trZXldID0gY2FsbGJhY2suY2Fs
bChyZWNvcmQsIHN0b3JlLCBkYXRhKTsKLQotICByZXR1cm4gc2V0UHJvcGVydGllcyhyZWxhdGlv
bnNoaXAsIHsKLSAgICBvd25lcjogcmVjb3JkLCBuYW1lOiBrZXksIGlzUG9seW1vcnBoaWM6IG9w
dGlvbnMucG9seW1vcnBoaWMKLSAgfSk7Ci19Ci0KLWZ1bmN0aW9uIGhhc1JlbGF0aW9uc2hpcCh0
eXBlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gIHZhciBtZXRh
ID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0aW9uc2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywg
a2luZDogJ2hhc01hbnknIH07Ci0KLSAgaWYgKG9wdGlvbnMuYXN5bmMpIHsKLSAgICByZXR1cm4g
YXN5bmNIYXNNYW55KHR5cGUsIG9wdGlvbnMsIG1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gYnVpbGRSZWxhdGlv
bnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBmdW5jdGlvbihzdG9yZSwgZGF0YSkgewotICAgICAg
dmFyIHJlY29yZHMgPSBkYXRhW2tleV07Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBsb29rZWQg
dXAgdGhlICciICsga2V5ICsgIicgcmVsYXRpb25zaGlwIG9uICciICsgdGhpcyArICInIGJ1dCBz
b21lIG9mIHRoZSBhc3NvY2lhdGVkIHJlY29yZHMgd2VyZSBub3QgbG9hZGVkLiBFaXRoZXIgbWFr
ZSBzdXJlIHRoZXkgYXJlIGFsbCBsb2FkZWQgdG9nZXRoZXIgd2l0aCB0aGUgcGFyZW50IHJlY29y
ZCwgb3Igc3BlY2lmeSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgYXN5bmMgKGBEUy5oYXNNYW55
KHsgYXN5bmM6IHRydWUgfSlgKSIsIEVtYmVyLkEocmVjb3JkcykuZXZlcnlQcm9wZXJ0eSgnaXNF
bXB0eScsIGZhbHNlKSk7Ci0gICAgICByZXR1cm4gc3RvcmUuZmluZE1hbnkodGhpcywgZGF0YVtr
ZXldLCBtZXRhLnR5cGUpOwotICAgIH0pOwotICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0
YSk7Ci19Ci0KLS8qKgotICBgRFMuaGFzTWFueWAgaXMgdXNlZCB0byBkZWZpbmUgT25lLVRvLU1h
bnkgYW5kIE1hbnktVG8tTWFueQotICByZWxhdGlvbnNoaXBzIG9uIGEgW0RTLk1vZGVsXShEUy5N
b2RlbC5odG1sKS4KLQotICBgRFMuaGFzTWFueWAgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBh
IHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRseQotICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6Ci0K
LSAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFsdWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUg
dGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlvbnNoaXAuCi0gIC0gYGludmVyc2VgOiBBIHN0cmlu
ZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9uIGEgcmVsYXRlZCBtb2Rl
bC4KLQotICAjIyMjIE9uZS1Uby1NYW55Ci0gIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxh
dGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2AgaW4gY29t
YmluYXRpb24gd2l0aCBgRFMuaGFzTWFueWAsIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBjb21tZW50czogRFMuaGFzTWFu
eSgnY29tbWVudCcpCi0gIH0pOwotCi0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsK
LSAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ3Bvc3QnKQotICB9KTsKLSAgYGBgCi0KLSAgIyMjIyBN
YW55LVRvLU1hbnkKLSAgVG8gZGVjbGFyZSBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0
d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERTLmhhc01hbnlgOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHRhZ3M6IERTLmhhc01hbnkoJ3Rh
ZycpCi0gIH0pOwotCi0gIEFwcC5UYWcgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHBvc3RzOiBE
Uy5oYXNNYW55KCdwb3N0JykKLSAgfSk7Ci0gIGBgYAotCi0gICMjIyMgRXhwbGljaXQgSW52ZXJz
ZXMKLQotICBFbWJlciBEYXRhIHdpbGwgZG8gaXRzIGJlc3QgdG8gZGlzY292ZXIgd2hpY2ggcmVs
YXRpb25zaGlwcyBtYXAgdG8KLSAgb25lIGFub3RoZXIuIEluIHRoZSBvbmUtdG8tbWFueSBjb2Rl
IGFib3ZlLCBmb3IgZXhhbXBsZSwgRW1iZXIgRGF0YQotICBjYW4gZmlndXJlIG91dCB0aGF0IGNo
YW5naW5nIHRoZSBgY29tbWVudHNgIHJlbGF0aW9uc2hpcCBzaG91bGQgdXBkYXRlCi0gIHRoZSBg
cG9zdGAgcmVsYXRpb25zaGlwIG9uIHRoZSBpbnZlcnNlIGJlY2F1c2UgcG9zdCBpcyB0aGUgb25s
eQotICByZWxhdGlvbnNoaXAgdG8gdGhhdCBtb2RlbC4KLQotICBIb3dldmVyLCBzb21ldGltZXMg
eW91IG1heSBoYXZlIG11bHRpcGxlIGBiZWxvbmdzVG9gL2BoYXNNYW55c2AgZm9yIHRoZQotICBz
YW1lIHR5cGUuIFlvdSBjYW4gc3BlY2lmeSB3aGljaCBwcm9wZXJ0eSBvbiB0aGUgcmVsYXRlZCBt
b2RlbCBpcwotICB0aGUgaW52ZXJzZSB1c2luZyBgRFMuaGFzTWFueWAncyBgaW52ZXJzZWAgb3B0
aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGJlbG9uZ3NUbyA9IERTLmJlbG9uZ3NUbywK
LSAgICAgIGhhc01hbnkgPSBEUy5oYXNNYW55OwotCi0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwu
ZXh0ZW5kKHsKLSAgICBvbmVQb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICB0d29Qb3N0OiBi
ZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICByZWRQb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICBi
bHVlUG9zdDogYmVsb25nc1RvKCdwb3N0JykKLSAgfSk7Ci0KLSAgQXBwLlBvc3QgPSBEUy5Nb2Rl
bC5leHRlbmQoewotICAgIGNvbW1lbnRzOiBoYXNNYW55KCdjb21tZW50JywgewotICAgICAgaW52
ZXJzZTogJ3JlZFBvc3QnCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBz
cGVjaWZ5IGFuIGludmVyc2Ugb24gYSBgYmVsb25nc1RvYCwgd2hpY2ggd29ya3MgaG93Ci0gIHlv
dSdkIGV4cGVjdC4KLQotICBAbmFtZXNwYWNlCi0gIEBtZXRob2QgaGFzTWFueQotICBAZm9yIERT
Ci0gIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1vZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRo
ZSByZWxhdGlvbnNoaXAKLSAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlv
bnMKLSAgQHJldHVybiB7RW1iZXIuY29tcHV0ZWR9IHJlbGF0aW9uc2hpcAotKi8KLURTLmhhc01h
bnkgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7Ci0gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29i
amVjdCcpIHsKLSAgICBvcHRpb25zID0gdHlwZTsKLSAgICB0eXBlID0gdW5kZWZpbmVkOwotICB9
Ci0gIHJldHVybiBoYXNSZWxhdGlvbnNoaXAodHlwZSwgb3B0aW9ucyk7Ci19OwotCi19KSgpOwot
Ci0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotCi0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi0vKgotICBUaGlzIGZpbGUgZGVm
aW5lcyBzZXZlcmFsIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2UgYERTLk1vZGVsYCBjbGFzcyB0aGF0
Ci0gIGFkZCBzdXBwb3J0IGZvciBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXBzLgotKi8KLQotLyoq
Ci0gIEBjbGFzcyBNb2RlbAotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuTW9kZWwucmVvcGVuKHsK
LQotICAvKioKLSAgICBUaGlzIEVtYmVyLmpzIGhvb2sgYWxsb3dzIGFuIG9iamVjdCB0byBiZSBu
b3RpZmllZCB3aGVuIGEgcHJvcGVydHkKLSAgICBpcyBkZWZpbmVkLgotCi0gICAgSW4gdGhpcyBj
YXNlLCB3ZSB1c2UgaXQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbiBFbWJlciBEYXRhIHVzZXIgZGVm
aW5lcyBhCi0gICAgYmVsb25ncy10byByZWxhdGlvbnNoaXAuIEluIHRoYXQgY2FzZSwgd2UgbmVl
ZCB0byBzZXQgdXAgb2JzZXJ2ZXJzIGZvcgotICAgIGVhY2ggb25lLCBhbGxvd2luZyB1cyB0byB0
cmFjayByZWxhdGlvbnNoaXAgY2hhbmdlcyBhbmQgYXV0b21hdGljYWxseQotICAgIHJlZmxlY3Qg
Y2hhbmdlcyBpbiB0aGUgaW52ZXJzZSBoYXMtbWFueSBhcnJheS4KLQotICAgIFRoaXMgaG9vayBw
YXNzZXMgdGhlIGNsYXNzIGJlaW5nIHNldCB1cCwgYXMgd2VsbCBhcyB0aGUga2V5IGFuZCB2YWx1
ZQotICAgIGJlaW5nIGRlZmluZWQuIFNvLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlciBkb2Vz
IHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAg
IHBhcmVudDogRFMuYmVsb25nc1RvKCd1c2VyJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRo
aXMgaG9vayB3b3VsZCBiZSBjYWxsZWQgd2l0aCAicGFyZW50IiBhcyB0aGUga2V5IGFuZCB0aGUg
Y29tcHV0ZWQKLSAgICBwcm9wZXJ0eSByZXR1cm5lZCBieSBgRFMuYmVsb25nc1RvYCBhcyB0aGUg
dmFsdWUuCi0KLSAgICBAbWV0aG9kIGRpZERlZmluZVByb3BlcnR5Ci0gICAgQHBhcmFtIHByb3Rv
Ci0gICAgQHBhcmFtIGtleQotICAgIEBwYXJhbSB2YWx1ZQotICAqLwotICBkaWREZWZpbmVQcm9w
ZXJ0eTogZnVuY3Rpb24ocHJvdG8sIGtleSwgdmFsdWUpIHsKLSAgICAvLyBDaGVjayBpZiB0aGUg
dmFsdWUgYmVpbmcgc2V0IGlzIGEgY29tcHV0ZWQgcHJvcGVydHkuCi0gICAgaWYgKHZhbHVlIGlu
c3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikgewotCi0gICAgICAvLyBJZiBpdCBpcywgZ2V0IHRo
ZSBtZXRhZGF0YSBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhpcyBpcwotICAgICAgLy8gcG9wdWxh
dGVkIGJ5IHRoZSBgRFMuYmVsb25nc1RvYCBoZWxwZXIgd2hlbiBpdCBpcyBjcmVhdGluZwotICAg
ICAgLy8gdGhlIGNvbXB1dGVkIHByb3BlcnR5LgotICAgICAgdmFyIG1ldGEgPSB2YWx1ZS5tZXRh
KCk7Ci0KLSAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlwICYmIG1ldGEua2luZCA9PT0gJ2Jl
bG9uZ3NUbycpIHsKLSAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwg
J2JlbG9uZ3NUb0RpZENoYW5nZScpOwotICAgICAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcihw
cm90bywga2V5LCBudWxsLCAnYmVsb25nc1RvV2lsbENoYW5nZScpOwotICAgICAgfQotCi0gICAg
ICBtZXRhLnBhcmVudFR5cGUgPSBwcm90by5jb25zdHJ1Y3RvcjsKLSAgICB9Ci0gIH0KLX0pOwot
Ci0vKgotICBUaGVzZSBEUy5Nb2RlbCBleHRlbnNpb25zIGFkZCBjbGFzcyBtZXRob2RzIHRoYXQg
cHJvdmlkZSByZWxhdGlvbnNoaXAKLSAgaW50cm9zcGVjdGlvbiBhYmlsaXRpZXMgYWJvdXQgcmVs
YXRpb25zaGlwcy4KLQotICBBIG5vdGUgYWJvdXQgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgY29u
dGFpbmVkIGhlcmU6Ci0KLSAgKipUaGVzZSBwcm9wZXJ0aWVzIGFyZSBlZmZlY3RpdmVseSBzZWFs
ZWQgb25jZSBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLioqCi0gIFRvIGF2b2lkIHJlcGVhdGVk
bHkgZG9pbmcgZXhwZW5zaXZlIGl0ZXJhdGlvbiBvdmVyIGEgbW9kZWwncyBmaWVsZHMsIHRoZXNl
Ci0gIHZhbHVlcyBhcmUgY29tcHV0ZWQgb25jZSBhbmQgdGhlbiBjYWNoZWQgZm9yIHRoZSByZW1h
aW5kZXIgb2YgdGhlIHJ1bnRpbWUgb2YKLSAgeW91ciBhcHBsaWNhdGlvbi4KLQotICBJZiB5b3Vy
IGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1vZGlmeSBhIGNsYXNzIGFmdGVyIGl0cyBpbml0aWFsIGRl
ZmluaXRpb24KLSAgKGZvciBleGFtcGxlLCB1c2luZyBgcmVvcGVuKClgIHRvIGFkZCBhZGRpdGlv
bmFsIGF0dHJpYnV0ZXMpLCBtYWtlIHN1cmUgeW91Ci0gIGRvIGl0IGJlZm9yZSB1c2luZyB5b3Vy
IG1vZGVsIHdpdGggdGhlIHN0b3JlLCB3aGljaCB1c2VzIHRoZXNlIHByb3BlcnRpZXMKLSAgZXh0
ZW5zaXZlbHkuCi0qLwotCi1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0gIC8qKgotICAgIEZvciBh
IGdpdmVuIHJlbGF0aW9uc2hpcCBuYW1lLCByZXR1cm5zIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSBy
ZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIG1vZGVsIGxp
a2UgdGhpczoKLQotICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICAgIGNvbW1lbnRzOiBEUy5oYXNNYW55KCdjb21tZW50JykKLSAgICB9KTsKLSAg
IGBgYAotCi0gICAgQ2FsbGluZyBgQXBwLlBvc3QudHlwZUZvclJlbGF0aW9uc2hpcCgnY29tbWVu
dHMnKWAgd2lsbCByZXR1cm4gYEFwcC5Db21tZW50YC4KLQotICAgIEBtZXRob2QgdHlwZUZvclJl
bGF0aW9uc2hpcAotICAgIEBzdGF0aWMKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFt
ZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0gICAgQHJldHVybiB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHRoZSB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAsIG9yIHVuZGVmaW5lZAotICAqLwotICB0eXBl
Rm9yUmVsYXRpb25zaGlwOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgdmFyIHJlbGF0aW9uc2hpcCA9
IGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5TmFtZScpLmdldChuYW1lKTsKLSAgICByZXR1cm4g
cmVsYXRpb25zaGlwICYmIHJlbGF0aW9uc2hpcC50eXBlOwotICB9LAotCi0gIGludmVyc2VGb3I6
IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgaW52ZXJzZVR5cGUgPSB0aGlzLnR5cGVGb3JSZWxh
dGlvbnNoaXAobmFtZSk7Ci0KLSAgICBpZiAoIWludmVyc2VUeXBlKSB7IHJldHVybiBudWxsOyB9
Ci0KLSAgICB2YXIgb3B0aW9ucyA9IHRoaXMubWV0YUZvclByb3BlcnR5KG5hbWUpLm9wdGlvbnM7
Ci0KLSAgICBpZiAob3B0aW9ucy5pbnZlcnNlID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9Ci0K
LSAgICB2YXIgaW52ZXJzZU5hbWUsIGludmVyc2VLaW5kOwotCi0gICAgaWYgKG9wdGlvbnMuaW52
ZXJzZSkgewotICAgICAgaW52ZXJzZU5hbWUgPSBvcHRpb25zLmludmVyc2U7Ci0gICAgICBpbnZl
cnNlS2luZCA9IEVtYmVyLmdldChpbnZlcnNlVHlwZSwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5n
ZXQoaW52ZXJzZU5hbWUpLmtpbmQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhciBwb3NzaWJsZVJl
bGF0aW9uc2hpcHMgPSBmaW5kUG9zc2libGVJbnZlcnNlcyh0aGlzLCBpbnZlcnNlVHlwZSk7Ci0K
LSAgICAgIGlmIChwb3NzaWJsZVJlbGF0aW9uc2hpcHMubGVuZ3RoID09PSAwKSB7IHJldHVybiBu
dWxsOyB9Ci0KLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IGRlZmluZWQgdGhlICciICsgbmFtZSAr
ICInIHJlbGF0aW9uc2hpcCBvbiAiICsgdGhpcyArICIsIGJ1dCBtdWx0aXBsZSBwb3NzaWJsZSBp
bnZlcnNlIHJlbGF0aW9uc2hpcHMgb2YgdHlwZSAiICsgdGhpcyArICIgd2VyZSBmb3VuZCBvbiAi
ICsgaW52ZXJzZVR5cGUgKyAiLiBMb29rIGF0IGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvbW9k
ZWxzL2RlZmluaW5nLW1vZGVscy8jdG9jX2V4cGxpY2l0LWludmVyc2VzIGZvciBob3cgdG8gZXhw
bGljaXRseSBzcGVjaWZ5IGludmVyc2VzIiwgcG9zc2libGVSZWxhdGlvbnNoaXBzLmxlbmd0aCA9
PT0gMSk7Ci0KLSAgICAgIGludmVyc2VOYW1lID0gcG9zc2libGVSZWxhdGlvbnNoaXBzWzBdLm5h
bWU7Ci0gICAgICBpbnZlcnNlS2luZCA9IHBvc3NpYmxlUmVsYXRpb25zaGlwc1swXS5raW5kOwot
ICAgIH0KLQotICAgIGZ1bmN0aW9uIGZpbmRQb3NzaWJsZUludmVyc2VzKHR5cGUsIGludmVyc2VU
eXBlLCBwb3NzaWJsZVJlbGF0aW9uc2hpcHMpIHsKLSAgICAgIHBvc3NpYmxlUmVsYXRpb25zaGlw
cyA9IHBvc3NpYmxlUmVsYXRpb25zaGlwcyB8fCBbXTsKLQotICAgICAgdmFyIHJlbGF0aW9uc2hp
cE1hcCA9IGdldChpbnZlcnNlVHlwZSwgJ3JlbGF0aW9uc2hpcHMnKTsKLSAgICAgIGlmICghcmVs
YXRpb25zaGlwTWFwKSB7IHJldHVybjsgfQotCi0gICAgICB2YXIgcmVsYXRpb25zaGlwcyA9IHJl
bGF0aW9uc2hpcE1hcC5nZXQodHlwZSk7Ci0gICAgICBpZiAocmVsYXRpb25zaGlwcykgewotICAg
ICAgICBwb3NzaWJsZVJlbGF0aW9uc2hpcHMucHVzaC5hcHBseShwb3NzaWJsZVJlbGF0aW9uc2hp
cHMsIHJlbGF0aW9uc2hpcE1hcC5nZXQodHlwZSkpOwotICAgICAgfQotCi0gICAgICBpZiAodHlw
ZS5zdXBlcmNsYXNzKSB7Ci0gICAgICAgIGZpbmRQb3NzaWJsZUludmVyc2VzKHR5cGUuc3VwZXJj
bGFzcywgaW52ZXJzZVR5cGUsIHBvc3NpYmxlUmVsYXRpb25zaGlwcyk7Ci0gICAgICB9Ci0KLSAg
ICAgIHJldHVybiBwb3NzaWJsZVJlbGF0aW9uc2hpcHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHsK
LSAgICAgIHR5cGU6IGludmVyc2VUeXBlLAotICAgICAgbmFtZTogaW52ZXJzZU5hbWUsCi0gICAg
ICBraW5kOiBpbnZlcnNlS2luZAotICAgIH07Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIG1vZGVs
J3MgcmVsYXRpb25zaGlwcyBhcyBhIG1hcCwga2V5ZWQgb24gdGhlIHR5cGUgb2YgdGhlCi0gICAg
cmVsYXRpb25zaGlwLiBUaGUgdmFsdWUgb2YgZWFjaCBlbnRyeSBpcyBhbiBhcnJheSBjb250YWlu
aW5nIGEgZGVzY3JpcHRvcgotICAgIGZvciBlYWNoIHJlbGF0aW9uc2hpcCB3aXRoIHRoYXQgdHlw
ZSwgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0gICAgYXMgd2VsbCBh
cyB0aGUgdHlwZS4KLQotICAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1vZGVs
IGRlZmluaXRpb246Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkJsb2cgPSBEUy5Nb2Rl
bC5leHRlbmQoewotICAgICAgdXNlcnM6IERTLmhhc01hbnkoJ3VzZXInKSwKLSAgICAgIG93bmVy
OiBEUy5iZWxvbmdzVG8oJ3VzZXInKSwKLSAgICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykK
LSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoaXMgY29tcHV0ZWQgcHJvcGVydHkgd291bGQgcmV0
dXJuIGEgbWFwIGRlc2NyaWJpbmcgdGhlc2UKLSAgICByZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBFbWJlci5nZXQo
QXBwLkJsb2csICdyZWxhdGlvbnNoaXBzJyk7Ci0gICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlVz
ZXIpOwotICAgIC8vPT4gWyB7IG5hbWU6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAotICAg
IC8vICAgICB7IG5hbWU6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nIH0gXQotICAgIHJlbGF0
aW9uc2hpcHMuZ2V0KEFwcC5Qb3N0KTsKLSAgICAvLz0+IFsgeyBuYW1lOiAncG9zdHMnLCBraW5k
OiAnaGFzTWFueScgfSBdCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwcwot
ICAgIEBzdGF0aWMKLSAgICBAdHlwZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAg
cmVsYXRpb25zaGlwczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9
IG5ldyBFbWJlci5NYXBXaXRoRGVmYXVsdCh7Ci0gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9u
KCkgeyByZXR1cm4gW107IH0KLSAgICB9KTsKLQotICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGNv
bXB1dGVkIHByb3BlcnR5IG9uIHRoZSBjbGFzcwotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVy
dHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotCi0gICAgICAvLyBJZiB0aGUgY29tcHV0ZWQgcHJv
cGVydHkgaXMgYSByZWxhdGlvbnNoaXAsIGFkZAotICAgICAgLy8gaXQgdG8gdGhlIG1hcC4KLSAg
ICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIGlmICh0eXBlb2YgbWV0YS50
eXBlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIG1ldGEudHlwZSA9IHRoaXMuc3RvcmUubW9k
ZWxGb3IobWV0YS50eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciByZWxhdGlvbnNoaXBz
Rm9yVHlwZSA9IG1hcC5nZXQobWV0YS50eXBlKTsKLQotICAgICAgICByZWxhdGlvbnNoaXBzRm9y
VHlwZS5wdXNoKHsgbmFtZTogbmFtZSwga2luZDogbWV0YS5raW5kIH0pOwotICAgICAgfQotICAg
IH0pOwotCi0gICAgcmV0dXJuIG1hcDsKLSAgfSksCi0KLSAgLyoqCi0gICAgQSBoYXNoIGNvbnRh
aW5pbmcgbGlzdHMgb2YgdGhlIG1vZGVsJ3MgcmVsYXRpb25zaGlwcywgZ3JvdXBlZAotICAgIGJ5
IHRoZSByZWxhdGlvbnNoaXAga2luZC4gRm9yIGV4YW1wbGUsIGdpdmVuIGEgbW9kZWwgd2l0aCB0
aGlzCi0gICAgZGVmaW5pdGlvbjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxvZyA9
IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAg
ICAgb3duZXI6IERTLmJlbG9uZ3NUbygndXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFu
eSgncG9zdCcpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNv
bnRhaW4gdGhlIGZvbGxvd2luZzoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVsYXRp
b25zaGlwTmFtZXMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdyZWxhdGlvbnNoaXBOYW1lcycpOwot
ICAgIHJlbGF0aW9uc2hpcE5hbWVzLmhhc01hbnk7Ci0gICAgLy89PiBbJ3VzZXJzJywgJ3Bvc3Rz
J10KLSAgICByZWxhdGlvbnNoaXBOYW1lcy5iZWxvbmdzVG87Ci0gICAgLy89PiBbJ293bmVyJ10K
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSByZWxhdGlvbnNoaXBOYW1lcwotICAgIEBzdGF0aWMK
LSAgICBAdHlwZSBPYmplY3QKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwTmFt
ZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBuYW1lcyA9IHsgaGFzTWFu
eTogW10sIGJlbG9uZ3NUbzogW10gfTsKLQotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHko
ZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsK
LSAgICAgICAgbmFtZXNbbWV0YS5raW5kXS5wdXNoKG5hbWUpOwotICAgICAgfQotICAgIH0pOwot
Ci0gICAgcmV0dXJuIG5hbWVzOwotICB9KSwKLQotICAvKioKLSAgICBBbiBhcnJheSBvZiB0eXBl
cyBkaXJlY3RseSByZWxhdGVkIHRvIGEgbW9kZWwuIEVhY2ggdHlwZSB3aWxsIGJlCi0gICAgaW5j
bHVkZWQgb25jZSwgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIHJlbGF0aW9uc2hpcHMgaXQg
aGFzIHdpdGgKLSAgICB0aGUgbW9kZWwuCi0KLSAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2Rl
bCB3aXRoIHRoaXMgZGVmaW5pdGlvbjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxv
ZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAot
ICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygndXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFz
TWFueSgncG9zdCcpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxk
IGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVs
YXRlZFR5cGVzID0gRW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRlZFR5cGVzJyk7Ci0gICAgLy89
PiBbIEFwcC5Vc2VyLCBBcHAuUG9zdCBdCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRl
ZFR5cGVzCi0gICAgQHN0YXRpYwotICAgIEB0eXBlIEVtYmVyLkFycmF5Ci0gICAgQHJlYWRPbmx5
Ci0gICovCi0gIHJlbGF0ZWRUeXBlczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHR5cGUsCi0gICAgICAgIHR5cGVzID0gRW1iZXIuQSgpOwotCi0gICAgLy8gTG9vcCB0aHJv
dWdoIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkgb24gdGhlIGNsYXNzLAotICAgIC8vIGFuZCBjcmVh
dGUgYW4gYXJyYXkgb2YgdGhlIHVuaXF1ZSB0eXBlcyBpbnZvbHZlZAotICAgIC8vIGluIHJlbGF0
aW9uc2hpcHMKLSAgICB0aGlzLmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1l
dGEpIHsKLSAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHR5cGUgPSBt
ZXRhLnR5cGU7Ci0KLSAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewotICAg
ICAgICAgIHR5cGUgPSBnZXQodGhpcywgdHlwZSwgZmFsc2UpIHx8IHRoaXMuc3RvcmUubW9kZWxG
b3IodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZp
ZWQgYSBoYXNNYW55ICgiICsgbWV0YS50eXBlICsgIikgb24gIiArIG1ldGEucGFyZW50VHlwZSAr
ICIgYnV0ICIgKyBtZXRhLnR5cGUgKyAiIHdhcyBub3QgZm91bmQuIiwgIHR5cGUpOwotCi0gICAg
ICAgIGlmICghdHlwZXMuY29udGFpbnModHlwZSkpIHsKLSAgICAgICAgICBFbWJlci5hc3NlcnQo
IlRyeWluZyB0byBzaWRlbG9hZCAiICsgbmFtZSArICIgb24gIiArIHRoaXMudG9TdHJpbmcoKSAr
ICIgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgZXhpc3QuIiwgISF0eXBlKTsKLSAgICAgICAgICB0eXBl
cy5wdXNoKHR5cGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4g
dHlwZXM7Ci0gIH0pLAotCi0gIC8qKgotICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSByZWxh
dGlvbnNoaXBzIG9mIGEgbW9kZWwgYW5kIHdob3NlIHZhbHVlcyBhcmUKLSAgICByZWxhdGlvbnNo
aXAgZGVzY3JpcHRvcnMuCi0KLSAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRo
aXMKLSAgICBkZWZpbml0aW9uOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5CbG9nID0g
RFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVzZXJzOiBEUy5oYXNNYW55KCd1c2VyJyksCi0gICAg
ICBvd25lcjogRFMuYmVsb25nc1RvKCd1c2VyJyksCi0KLSAgICAgIHBvc3RzOiBEUy5oYXNNYW55
KCdwb3N0JykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoaXMgcHJvcGVydHkgd291bGQgY29u
dGFpbiB0aGUgZm9sbG93aW5nOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciByZWxhdGlv
bnNoaXBzQnlOYW1lID0gRW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRpb25zaGlwc0J5TmFtZScp
OwotICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCd1c2VycycpOwotICAgIC8vPT4geyBrZXk6
ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JywgdHlwZTogQXBwLlVzZXIgfQotICAgIHJlbGF0aW9u
c2hpcHNCeU5hbWUuZ2V0KCdvd25lcicpOwotICAgIC8vPT4geyBrZXk6ICdvd25lcicsIGtpbmQ6
ICdiZWxvbmdzVG8nLCB0eXBlOiBBcHAuVXNlciB9Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkg
cmVsYXRpb25zaGlwc0J5TmFtZQotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBFbWJlci5NYXAKLSAg
ICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwc0J5TmFtZTogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKLQot
ICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAg
ICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgbWV0YS5rZXkgPSBuYW1lOwot
ICAgICAgICB0eXBlID0gbWV0YS50eXBlOwotCi0gICAgICAgIGlmICghdHlwZSAmJiBtZXRhLmtp
bmQgPT09ICdoYXNNYW55JykgewotICAgICAgICAgIHR5cGUgPSBFbWJlci5TdHJpbmcuc2luZ3Vs
YXJpemUobmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXR5cGUpIHsKLSAgICAgICAgICB0eXBl
ID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmlu
ZycpIHsKLSAgICAgICAgICBtZXRhLnR5cGUgPSB0aGlzLnN0b3JlLm1vZGVsRm9yKHR5cGUpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgbWFwLnNldChuYW1lLCBtZXRhKTsKLSAgICAgIH0KLSAgICB9
KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0pLAotCi0gIC8qKgotICAgIEEgbWFwIHdob3NlIGtl
eXMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIG1vZGVsIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHN0cmlu
Z3MKLSAgICBkZXNjcmliaW5nIHRoZSBraW5kIG9mIHRoZSBmaWVsZC4gQSBtb2RlbCdzIGZpZWxk
cyBhcmUgdGhlIHVuaW9uIG9mIGFsbCBvZiBpdHMKLSAgICBhdHRyaWJ1dGVzIGFuZCByZWxhdGlv
bnNoaXBzLgotCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICBB
cHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1c2VyczogRFMuaGFzTWFueSgndXNl
cicpLAotICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygndXNlcicpLAotCi0gICAgICBwb3N0czog
RFMuaGFzTWFueSgncG9zdCcpLAotCi0gICAgICB0aXRsZTogRFMuYXR0cignc3RyaW5nJykKLSAg
ICB9KTsKLQotICAgIHZhciBmaWVsZHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdmaWVsZHMnKTsK
LSAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwga2luZCkgewotICAgICAgY29uc29s
ZS5sb2coZmllbGQsIGtpbmQpOwotICAgIH0pOwotCi0gICAgLy8gcHJpbnRzOgotICAgIC8vIHVz
ZXJzLCBoYXNNYW55Ci0gICAgLy8gb3duZXIsIGJlbG9uZ3NUbwotICAgIC8vIHBvc3RzLCBoYXNN
YW55Ci0gICAgLy8gdGl0bGUsIGF0dHJpYnV0ZQotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGZp
ZWxkcwotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAg
Ki8KLSAgZmllbGRzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwID0g
RW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0gICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5j
dGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgewotICAg
ICAgICBtYXAuc2V0KG5hbWUsIG1ldGEua2luZCk7Ci0gICAgICB9IGVsc2UgaWYgKG1ldGEuaXNB
dHRyaWJ1dGUpIHsKLSAgICAgICAgbWFwLnNldChuYW1lLCAnYXR0cmlidXRlJyk7Ci0gICAgICB9
Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gbWFwOwotICB9KSwKLQotICAvKioKLSAgICBHaXZlbiBh
IGNhbGxiYWNrLCBpdGVyYXRlcyBvdmVyIGVhY2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhl
IG1vZGVsLAotICAgIGludm9raW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBuYW1lIG9mIGVhY2gg
cmVsYXRpb25zaGlwIGFuZCBpdHMgcmVsYXRpb25zaGlwCi0gICAgZGVzY3JpcHRvci4KLQotICAg
IEBtZXRob2QgZWFjaFJlbGF0aW9uc2hpcAotICAgIEBzdGF0aWMKLSAgICBAcGFyYW0ge0Z1bmN0
aW9ufSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gaW52b2tlCi0gICAgQHBhcmFtIHthbnl9IGJp
bmRpbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUg
Ym91bmQKLSAgKi8KLSAgZWFjaFJlbGF0aW9uc2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRp
bmcpIHsKLSAgICBnZXQodGhpcywgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5mb3JFYWNoKGZ1bmN0
aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBu
YW1lLCByZWxhdGlvbnNoaXApOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIEdpdmVuIGEg
Y2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFjaCBvZiB0aGUgdHlwZXMgcmVsYXRlZCB0byBhIG1v
ZGVsLAotICAgIGludm9raW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSByZWxhdGVkIHR5cGUncyBj
bGFzcy4gRWFjaCB0eXBlIHdpbGwgYmUKLSAgICByZXR1cm5lZCBqdXN0IG9uY2UsIHJlZ2FyZGxl
c3Mgb2YgaG93IG1hbnkgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgaXQgaGFzCi0gICAgd2l0aCBh
IG1vZGVsLgotCi0gICAgQG1ldGhvZCBlYWNoUmVsYXRlZFR5cGUKLSAgICBAc3RhdGljCi0gICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBw
YXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhp
c2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0gIGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2Fs
bGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhpcywgJ3JlbGF0ZWRUeXBlcycpLmZvckVhY2go
ZnVuY3Rpb24odHlwZSkgewotICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCB0eXBlKTsKLSAg
ICB9KTsKLSAgfQotfSk7Ci0KLURTLk1vZGVsLnJlb3Blbih7Ci0gIC8qKgotICAgIEdpdmVuIGEg
Y2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFjaCBvZiB0aGUgcmVsYXRpb25zaGlwcyBpbiB0aGUg
bW9kZWwsCi0gICAgaW52b2tpbmcgdGhlIGNhbGxiYWNrIHdpdGggdGhlIG5hbWUgb2YgZWFjaCBy
ZWxhdGlvbnNoaXAgYW5kIGl0cyByZWxhdGlvbnNoaXAKLSAgICBkZXNjcmlwdG9yLgotCi0gICAg
QG1ldGhvZCBlYWNoUmVsYXRpb25zaGlwCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sg
dGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1
ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0g
IGVhY2hSZWxhdGlvbnNoaXA6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgdGhp
cy5jb25zdHJ1Y3Rvci5lYWNoUmVsYXRpb25zaGlwKGNhbGxiYWNrLCBiaW5kaW5nKTsKLSAgfQot
fSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1k
YXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1i
ZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFy
IGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKLQotLyoqCi0gIEBjbGFz
cyBSZWNvcmRBcnJheU1hbmFnZXIKLSAgQG5hbWVzcGFjZSBEUwotICBAcHJpdmF0ZQotICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKLSovCi1EUy5SZWNvcmRBcnJheU1hbmFnZXIgPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5maWx0ZXJlZFJlY29y
ZEFycmF5cyA9IEVtYmVyLk1hcFdpdGhEZWZhdWx0LmNyZWF0ZSh7Ci0gICAgICBkZWZhdWx0VmFs
dWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0KLSAgICB9KTsKLQotICAgIHRoaXMuY2hhbmdl
ZFJlY29yZHMgPSBbXTsKLSAgfSwKLQotICByZWNvcmREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlY29y
ZCkgewotICAgIGlmICh0aGlzLmNoYW5nZWRSZWNvcmRzLnB1c2gocmVjb3JkKSAhPT0gMSkgeyBy
ZXR1cm47IH0KLQotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMu
dXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwKLQotICByZWNvcmRBcnJheXNGb3JSZWNvcmQ6IGZ1
bmN0aW9uKHJlY29yZCkgewotICAgIHJlY29yZC5fcmVjb3JkQXJyYXlzID0gcmVjb3JkLl9yZWNv
cmRBcnJheXMgfHwgRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgICByZXR1cm4gcmVjb3Jk
Ll9yZWNvcmRBcnJheXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgaXMgaW52b2tl
ZCB3aGVuZXZlciBkYXRhIGlzIGxvYWRlZCBpbnRvIHRoZSBzdG9yZSBieSB0aGUKLSAgICBhZGFw
dGVyIG9yIHVwZGF0ZWQgYnkgdGhlIGFkYXB0ZXIsIG9yIHdoZW4gYSByZWNvcmQgaGFzIGNoYW5n
ZWQuCi0KLSAgICBJdCB1cGRhdGVzIGFsbCByZWNvcmQgYXJyYXlzIHRoYXQgYSByZWNvcmQgYmVs
b25ncyB0by4KLQotICAgIFRvIGF2b2lkIHRocmFzaGluZywgaXQgb25seSBydW5zIGF0IG1vc3Qg
b25jZSBwZXIgcnVuIGxvb3AuCi0KLSAgICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5cwotICAg
IEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGNsaWVudElk
Ci0gICovCi0gIHVwZGF0ZVJlY29yZEFycmF5czogZnVuY3Rpb24oKSB7Ci0gICAgZm9yRWFjaCh0
aGlzLmNoYW5nZWRSZWNvcmRzLCBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIGlmIChnZXQocmVj
b3JkLCAnaXNEZWxldGVkJykpIHsKLSAgICAgICAgdGhpcy5fcmVjb3JkV2FzRGVsZXRlZChyZWNv
cmQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5fcmVjb3JkV2FzQ2hhbmdlZChyZWNv
cmQpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwotCi0gICAgdGhpcy5jaGFuZ2VkUmVjb3Jkcy5s
ZW5ndGggPSAwOwotICB9LAotCi0gIF9yZWNvcmRXYXNEZWxldGVkOiBmdW5jdGlvbiAocmVjb3Jk
KSB7Ci0gICAgdmFyIHJlY29yZEFycmF5cyA9IHJlY29yZC5fcmVjb3JkQXJyYXlzOwotCi0gICAg
aWYgKCFyZWNvcmRBcnJheXMpIHsgcmV0dXJuOyB9Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5
cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwot
ICAgIH0pOwotICB9LAotCi0gIF9yZWNvcmRXYXNDaGFuZ2VkOiBmdW5jdGlvbiAocmVjb3JkKSB7
Ci0gICAgdmFyIHR5cGUgPSByZWNvcmQuY29uc3RydWN0b3IsCi0gICAgICAgIHJlY29yZEFycmF5
cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUpLAotICAgICAgICBmaWx0ZXI7
Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAgIGZp
bHRlciA9IGdldChhcnJheSwgJ2ZpbHRlckZ1bmN0aW9uJyk7Ci0gICAgICB0aGlzLnVwZGF0ZVJl
Y29yZEFycmF5KGFycmF5LCBmaWx0ZXIsIHR5cGUsIHJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0K
LSAgICAvLyBsb29wIHRocm91Z2ggYWxsIG1hbnlBcnJheXMgY29udGFpbmluZyBhbiB1bmxvYWRl
ZCBjb3B5IG9mIHRoaXMKLSAgICAvLyBjbGllbnRJZCBhbmQgbm90aWZ5IHRoZW0gdGhhdCB0aGUg
cmVjb3JkIHdhcyBsb2FkZWQuCi0gICAgdmFyIG1hbnlBcnJheXMgPSByZWNvcmQuX2xvYWRpbmdS
ZWNvcmRBcnJheXM7Ci0KLSAgICBpZiAobWFueUFycmF5cykgewotICAgICAgZm9yICh2YXIgaT0w
LCBsPW1hbnlBcnJheXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICBtYW55QXJyYXlzW2ld
LmxvYWRlZFJlY29yZCgpOwotICAgICAgfQotCi0gICAgICByZWNvcmQuX2xvYWRpbmdSZWNvcmRB
cnJheXMgPSBbXTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXBkYXRlIGFuIGluZGl2aWR1
YWwgZmlsdGVyLgotCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmRBcnJheQotICAgIEBwYXJhbSB7
RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0gYXJyYXkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0
ZXIKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCi0gICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBj
bGllbnRJZAotICAqLwotICB1cGRhdGVSZWNvcmRBcnJheTogZnVuY3Rpb24oYXJyYXksIGZpbHRl
ciwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIHNob3VsZEJlSW5BcnJheTsKLQotICAgIGlmICgh
ZmlsdGVyKSB7Ci0gICAgICBzaG91bGRCZUluQXJyYXkgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0g
ICAgICBzaG91bGRCZUluQXJyYXkgPSBmaWx0ZXIocmVjb3JkKTsKLSAgICB9Ci0KLSAgICB2YXIg
cmVjb3JkQXJyYXlzID0gdGhpcy5yZWNvcmRBcnJheXNGb3JSZWNvcmQocmVjb3JkKTsKLQotICAg
IGlmIChzaG91bGRCZUluQXJyYXkpIHsKLSAgICAgIHJlY29yZEFycmF5cy5hZGQoYXJyYXkpOwot
ICAgICAgYXJyYXkuYWRkUmVjb3JkKHJlY29yZCk7Ci0gICAgfSBlbHNlIGlmICghc2hvdWxkQmVJ
bkFycmF5KSB7Ci0gICAgICByZWNvcmRBcnJheXMucmVtb3ZlKGFycmF5KTsKLSAgICAgIGFycmF5
LnJlbW92ZVJlY29yZChyZWNvcmQpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1l
dGhvZCBpcyBpbnZva2VkIGlmIHRoZSBgZmlsdGVyRnVuY3Rpb25gIHByb3BlcnR5IGlzCi0gICAg
Y2hhbmdlZCBvbiBhIGBEUy5GaWx0ZXJlZFJlY29yZEFycmF5YC4KLQotICAgIEl0IGVzc2VudGlh
bGx5IHJlLXJ1bnMgdGhlIGZpbHRlciBmcm9tIHNjcmF0Y2guIFRoaXMgc2FtZQotICAgIG1ldGhv
ZCBpcyBpbnZva2VkIHdoZW4gdGhlIGZpbHRlciBpcyBjcmVhdGVkIGluIHRoIGZpcnN0IHBsYWNl
LgotCi0gICAgQG1ldGhvZCB1cGRhdGVGaWx0ZXIKLSAgICBAcGFyYW0gYXJyYXkKLSAgICBAcGFy
YW0gdHlwZQotICAgIEBwYXJhbSBmaWx0ZXIKLSAgKi8KLSAgdXBkYXRlRmlsdGVyOiBmdW5jdGlv
bihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnN0b3JlLnR5
cGVNYXBGb3IodHlwZSksCi0gICAgICAgIHJlY29yZHMgPSB0eXBlTWFwLnJlY29yZHMsIHJlY29y
ZDsKLQotICAgIGZvciAodmFyIGk9MCwgbD1yZWNvcmRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgIHJlY29yZCA9IHJlY29yZHNbaV07Ci0KLSAgICAgIGlmICghZ2V0KHJlY29yZCwgJ2lzRGVs
ZXRlZCcpICYmICFnZXQocmVjb3JkLCAnaXNFbXB0eScpKSB7Ci0gICAgICAgIHRoaXMudXBkYXRl
UmVjb3JkQXJyYXkoYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKTsKLSAgICAgIH0KLSAgICB9
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgYERTLk1hbnlBcnJheWAgZm9yIGEgdHlwZSBh
bmQgbGlzdCBvZiByZWNvcmQgcmVmZXJlbmNlcywgYW5kIGluZGV4Ci0gICAgdGhlIGBNYW55QXJy
YXlgIHVuZGVyIGVhY2ggcmVmZXJlbmNlLiBUaGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSBy
ZW1vdmUKLSAgICByZWNvcmRzIGZyb20gYE1hbnlBcnJheWBzIHdoZW4gdGhleSBhcmUgZGVsZXRl
ZC4KLQotICAgIEBtZXRob2QgY3JlYXRlTWFueUFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30gdHlw
ZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlZmVyZW5jZXMKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJy
YXl9Ci0gICovCi0gIGNyZWF0ZU1hbnlBcnJheTogZnVuY3Rpb24odHlwZSwgcmVjb3Jkcykgewot
ICAgIHZhciBtYW55QXJyYXkgPSBEUy5NYW55QXJyYXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5
cGUsCi0gICAgICBjb250ZW50OiByZWNvcmRzLAotICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAg
ICB9KTsKLQotICAgIGZvckVhY2gocmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICB2
YXIgYXJyYXlzID0gdGhpcy5yZWNvcmRBcnJheXNGb3JSZWNvcmQocmVjb3JkKTsKLSAgICAgIGFy
cmF5cy5hZGQobWFueUFycmF5KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBtYW55QXJy
YXk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgYERTLlJlY29yZEFycmF5YCBmb3IgYSB0
eXBlIGFuZCByZWdpc3RlciBpdCBmb3IgdXBkYXRlcy4KLQotICAgIEBtZXRob2QgY3JlYXRlUmVj
b3JkQXJyYXkKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCi0gICAgQHJldHVybiB7RFMuUmVjb3Jk
QXJyYXl9Ci0gICovCi0gIGNyZWF0ZVJlY29yZEFycmF5OiBmdW5jdGlvbih0eXBlKSB7Ci0gICAg
dmFyIGFycmF5ID0gRFMuUmVjb3JkQXJyYXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0g
ICAgICBjb250ZW50OiBFbWJlci5BKCksCi0gICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAgICAg
IGlzTG9hZGVkOiB0cnVlCi0gICAgfSk7Ci0KLSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVyZWRSZWNv
cmRBcnJheShhcnJheSwgdHlwZSk7Ci0KLSAgICByZXR1cm4gYXJyYXk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQ3JlYXRlIGEgYERTLkZpbHRlcmVkUmVjb3JkQXJyYXlgIGZvciBhIHR5cGUgYW5kIHJl
Z2lzdGVyIGl0IGZvciB1cGRhdGVzLgotCi0gICAgQG1ldGhvZCBjcmVhdGVGaWx0ZXJlZFJlY29y
ZEFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZp
bHRlcgotICAgIEByZXR1cm4ge0RTLkZpbHRlcmVkUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0
ZUZpbHRlcmVkUmVjb3JkQXJyYXk6IGZ1bmN0aW9uKHR5cGUsIGZpbHRlcikgewotICAgIHZhciBh
cnJheSA9IERTLkZpbHRlcmVkUmVjb3JkQXJyYXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUs
Ci0gICAgICBjb250ZW50OiBFbWJlci5BKCksCi0gICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAg
ICAgIG1hbmFnZXI6IHRoaXMsCi0gICAgICBmaWx0ZXJGdW5jdGlvbjogZmlsdGVyCi0gICAgfSk7
Ci0KLSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSwgZmls
dGVyKTsKLQotICAgIHJldHVybiBhcnJheTsKLSAgfSwKLQotICAvKioKLSAgICBDcmVhdGUgYSBg
RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5YCBmb3IgYSB0eXBlIHdpdGggZ2l2ZW4gcXVl
cnkuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQotICAg
IEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcmV0
dXJuIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZUFkYXB0
ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheTogZnVuY3Rpb24odHlwZSwgcXVlcnkpIHsKLSAgICByZXR1
cm4gRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5LmNyZWF0ZSh7Ci0gICAgICB0eXBlOiB0
eXBlLAotICAgICAgcXVlcnk6IHF1ZXJ5LAotICAgICAgY29udGVudDogRW1iZXIuQSgpLAotICAg
ICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBSZWdpc3Rl
ciBhIFJlY29yZEFycmF5IGZvciBhIGdpdmVuIHR5cGUgdG8gYmUgYmFja2VkIGJ5Ci0gICAgYSBm
aWx0ZXIgZnVuY3Rpb24uIFRoaXMgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gdXBkYXRlCi0gICAg
YXV0b21hdGljYWxseSB3aGVuIHJlY29yZHMgb2YgdGhhdCB0eXBlIGNoYW5nZSBhdHRyaWJ1dGUK
LSAgICB2YWx1ZXMgb3Igc3RhdGVzLgotCi0gICAgQG1ldGhvZCByZWdpc3RlckZpbHRlcmVkUmVj
b3JkQXJyYXkKLSAgICBAcGFyYW0ge0RTLlJlY29yZEFycmF5fSBhcnJheQotICAgIEBwYXJhbSB7
Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKLSAgKi8KLSAgcmVnaXN0
ZXJGaWx0ZXJlZFJlY29yZEFycmF5OiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0g
ICAgdmFyIHJlY29yZEFycmF5cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUp
OwotICAgIHJlY29yZEFycmF5cy5wdXNoKGFycmF5KTsKLQotICAgIHRoaXMudXBkYXRlRmlsdGVy
KGFycmF5LCB0eXBlLCBmaWx0ZXIpOwotICB9LAotCi0gIC8vIEludGVybmFsbHksIHdlIG1haW50
YWluIGEgbWFwIG9mIGFsbCB1bmxvYWRlZCBJRHMgcmVxdWVzdGVkIGJ5Ci0gIC8vIGEgTWFueUFy
cmF5LiBBcyB0aGUgYWRhcHRlciBsb2FkcyBkYXRhIGludG8gdGhlIHN0b3JlLCB0aGUKLSAgLy8g
c3RvcmUgbm90aWZpZXMgYW55IGludGVyZXN0ZWQgTWFueUFycmF5cy4gV2hlbiB0aGUgTWFueUFy
cmF5J3MKLSAgLy8gdG90YWwgbnVtYmVyIG9mIGxvYWRpbmcgcmVjb3JkcyBkcm9wcyB0byB6ZXJv
LCBpdCBiZWNvbWVzCi0gIC8vIGBpc0xvYWRlZGAgYW5kIGZpcmVzIGEgYGRpZExvYWRgIGV2ZW50
LgotICByZWdpc3RlcldhaXRpbmdSZWNvcmRBcnJheTogZnVuY3Rpb24ocmVjb3JkLCBhcnJheSkg
ewotICAgIHZhciBsb2FkaW5nUmVjb3JkQXJyYXlzID0gcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJy
YXlzIHx8IFtdOwotICAgIGxvYWRpbmdSZWNvcmRBcnJheXMucHVzaChhcnJheSk7Ci0gICAgcmVj
b3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzID0gbG9hZGluZ1JlY29yZEFycmF5czsKLSAgfQotfSk7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRh
Ci0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgbWFwID0g
RW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwOwotCi12YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRp
b24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVy
JywgJ3N0YWNrJ107Ci0KLS8qKgotICBBIGBEUy5JbnZhbGlkRXJyb3JgIGlzIHVzZWQgYnkgYW4g
YWRhcHRlciB0byBzaWduYWwgdGhlIGV4dGVybmFsIEFQSQotICB3YXMgdW5hYmxlIHRvIHByb2Nl
c3MgYSByZXF1ZXN0IGJlY2F1c2UgdGhlIGNvbnRlbnQgd2FzIG5vdAotICBzZW1hbnRpY2FsbHkg
Y29ycmVjdCBvciBtZWFuaW5nZnVsIHBlciB0aGUgQVBJLiBVc3VhbGx5IHRoaXMgbWVhbnMgYQot
ICByZWNvcmQgZmFpbGVkIHNvbWUgZm9ybSBvZiBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uLiBXaGVu
IGEgcHJvbWlzZQotICBmcm9tIGFuIGFkYXB0ZXIgaXMgcmVqZWN0ZWQgd2l0aCBhIGBEUy5JbnZh
bGlkRXJyb3JgIHRoZSByZWNvcmQgd2lsbAotICB0cmFuc2l0aW9uIHRvIHRoZSBgaW52YWxpZGAg
c3RhdGUgYW5kIHRoZSBlcnJvcnMgd2lsbCBiZSBzZXQgdG8gdGhlCi0gIGBlcnJvcnNgIHByb3Bl
cnR5IG9uIHRoZSByZWNvcmQuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
LkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJFU1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAgYWpheEVy
cm9yOiBmdW5jdGlvbihqcVhIUikgewotICAgICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFY
SFIpOwotCi0gICAgICBpZiAoanFYSFIgJiYganFYSFIuc3RhdHVzID09PSA0MjIpIHsKLSAgICAg
ICAgdmFyIGpzb25FcnJvcnMgPSBFbWJlci4kLnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQp
WyJlcnJvcnMiXTsKLSAgICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9y
cyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAg
fQotICB9KTsKLSAgYGBgCi0KLSAgQGNsYXNzIEludmFsaWRFcnJvcgotICBAbmFtZXNwYWNlIERT
Ci0qLwotRFMuSW52YWxpZEVycm9yID0gZnVuY3Rpb24oZXJyb3JzKSB7Ci0gIHZhciB0bXAgPSBF
cnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCAiVGhlIGJhY2tlbmQgcmVqZWN0
ZWQgdGhlIGNvbW1pdCBiZWNhdXNlIGl0IHdhcyBpbnZhbGlkOiAiICsgRW1iZXIuaW5zcGVjdChl
cnJvcnMpKTsKLSAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7Ci0KLSAgZm9yICh2YXIgaT0wLCBsPWVy
cm9yUHJvcHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIHRoaXNbZXJyb3JQcm9wc1tpXV0gPSB0
bXBbZXJyb3JQcm9wc1tpXV07Ci0gIH0KLX07Ci1EUy5JbnZhbGlkRXJyb3IucHJvdG90eXBlID0g
RW1iZXIuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Ci0KLS8qKgotICBBbiBhZGFwdGVyIGlzIGFu
IG9iamVjdCB0aGF0IHJlY2VpdmVzIHJlcXVlc3RzIGZyb20gYSBzdG9yZSBhbmQKLSAgdHJhbnNs
YXRlcyB0aGVtIGludG8gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiB0byB0YWtlIGFnYWluc3QgeW91
cgotICBwZXJzaXN0ZW5jZSBsYXllci4gVGhlIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkg
YW4gSFRUUCBBUEksIGJ1dAotICBtYXkgYmUgYW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dzZXIn
cyBsb2NhbCBzdG9yYWdlLiBUeXBpY2FsbHkgdGhlCi0gIGFkYXB0ZXIgaXMgbm90IGludm9rZWQg
ZGlyZWN0bHkgaW5zdGVhZCBpdHMgZnVuY3Rpb25hbGl0eSBpcyBhY2Nlc3NlZAotICB0aHJvdWdo
IHRoZSBgc3RvcmVgLgotCi0gICMjIyBDcmVhdGluZyBhbiBBZGFwdGVyCi0KLSAgRmlyc3QsIGNy
ZWF0ZSBhIG5ldyBzdWJjbGFzcyBvZiBgRFMuQWRhcHRlcmA6Ci0KLSAgYGBgamF2YXNjcmlwdAot
ICBBcHAuTXlBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAgIC8vIC4uLnlvdXIgY29k
ZSBoZXJlCi0gIH0pOwotICBgYGAKLQotICBUbyB0ZWxsIHlvdXIgc3RvcmUgd2hpY2ggYWRhcHRl
ciB0byB1c2UsIHNldCBpdHMgYGFkYXB0ZXJgIHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQXBwLnN0b3JlID0gRFMuU3RvcmUuY3JlYXRlKHsKLSAgICBhZGFwdGVyOiAnTXlBZGFwdGVy
JwotICB9KTsKLSAgYGBgCi0KLSAgYERTLkFkYXB0ZXJgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xh
c3MgdGhhdCB5b3Ugc2hvdWxkIG92ZXJyaWRlIGluIHlvdXIKLSAgYXBwbGljYXRpb24gdG8gY3Vz
dG9taXplIGl0IGZvciB5b3VyIGJhY2tlbmQuIFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCi0g
IHRoYXQgeW91IHNob3VsZCBpbXBsZW1lbnQgaXM6Ci0KLSAgICAqIGBmaW5kKClgCi0gICAgKiBg
Y3JlYXRlUmVjb3JkKClgCi0gICAgKiBgdXBkYXRlUmVjb3JkKClgCi0gICAgKiBgZGVsZXRlUmVj
b3JkKClgCi0gICAgKiBgZmluZEFsbCgpYAotICAgICogYGZpbmRRdWVyeSgpYAotCi0gIFRvIGlt
cHJvdmUgdGhlIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNh
biBvcHRpbWl6ZQotICB5b3VyIGFkYXB0ZXIgYnkgb3ZlcnJpZGluZyB0aGVzZSBsb3dlci1sZXZl
bCBtZXRob2RzOgotCi0gICAgKiBgZmluZE1hbnkoKWAKLQotCi0gIEZvciBhbiBleGFtcGxlIGlt
cGxlbWVudGF0aW9uLCBzZWUgYERTLlJFU1RBZGFwdGVyYCwgdGhlCi0gIGluY2x1ZGVkIFJFU1Qg
YWRhcHRlci4KLQotICBAY2xhc3MgQWRhcHRlcgotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRz
IEVtYmVyLk9iamVjdAotKi8KLQotRFMuQWRhcHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewot
Ci0gIC8qKgotICAgIElmIHlvdSB3b3VsZCBsaWtlIHlvdXIgYWRhcHRlciB0byB1c2UgYSBjdXN0
b20gc2VyaWFsaXplciB5b3UgY2FuCi0gICAgc2V0IHRoZSBgZGVmYXVsdFNlcmlhbGl6ZXJgIHBy
b3BlcnR5IHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBjdXN0b20KLSAgICBzZXJpYWxpemVyLgotCi0g
ICAgTm90ZSB0aGUgYGRlZmF1bHRTZXJpYWxpemVyYCBzZXJpYWxpemVyIGhhcyBhIGxvd2VyIHBy
aW9yaXR5IHRoZW4KLSAgICBhIG1vZGVsIHNwZWNpZmljIHNlcmlhbGl6ZXIgKGkuZS4gYFBvc3RT
ZXJpYWxpemVyYCkgb3IgdGhlCi0gICAgYGFwcGxpY2F0aW9uYCBzZXJpYWxpemVyLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBEamFuZ29BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQo
ewotICAgICAgZGVmYXVsdFNlcmlhbGl6ZXI6ICdkamFuZ28nCi0gICAgfSk7Ci0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgZGVmYXVsdFNlcmlhbGl6ZXIKLSAgICBAdHlwZSB7U3RyaW5nfQotICAq
LwotCi0gIC8qKgotICAgIFRoZSBgZmluZCgpYCBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBz
dG9yZSBpcyBhc2tlZCBmb3IgYSByZWNvcmQgdGhhdAotICAgIGhhcyBub3QgcHJldmlvdXNseSBi
ZWVuIGxvYWRlZC4gSW4gcmVzcG9uc2UgdG8gYGZpbmQoKWAgYmVpbmcgY2FsbGVkLCB5b3UKLSAg
ICBzaG91bGQgcXVlcnkgeW91ciBwZXJzaXN0ZW5jZSBsYXllciBmb3IgYSByZWNvcmQgd2l0aCB0
aGUgZ2l2ZW4gSUQuIE9uY2UKLSAgICBmb3VuZCwgeW91IGNhbiBhc3luY2hyb25vdXNseSBjYWxs
IHRoZSBzdG9yZSdzIGBwdXNoKClgIG1ldGhvZCB0byBwdXNoCi0gICAgdGhlIHJlY29yZCBpbnRv
IHRoZSBzdG9yZS4KLQotICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBgZmluZGAgaW1wbGVtZW50YXRp
b246Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERT
LkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkg
ewotICAgICAgICB2YXIgdXJsID0gW3R5cGUsIGlkXS5qb2luKCcvJyk7Ci0KLSAgICAgICAgcmV0
dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0g
ICAgICAgICAgalF1ZXJ5LmdldEpTT04odXJsKS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAg
ICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCBkYXRhKTsKLSAgICAgICAgICB9LCBmdW5j
dGlvbihqcVhIUikgewotICAgICAgICAgICAganFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1
ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2VzCi0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwg
cmVqZWN0LCBqcVhIUik7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgICAgfQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0g
c3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFt
IHtTdHJpbmd9IGlkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5k
OiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCi0KLSAgLyoqCi0gICAgVGhlIGBmaW5kQWxsKClg
IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB5b3UgY2FsbCBgZmluZGAgb24gdGhlIHN0b3JlCi0gICAg
d2l0aG91dCBhbiBJRCAoaS5lLiBgc3RvcmUuZmluZCgncG9zdCcpYCkuCi0KLSAgICBFeGFtcGxl
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFk
YXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBzaW5j
ZVRva2VuKSB7Ci0gICAgICAgIHZhciB1cmwgPSB0eXBlOwotICAgICAgICB2YXIgcXVlcnkgPSB7
IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0gICAgICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9t
aXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewotICAgICAgICAgIGpRdWVyeS5nZXRKU09O
KHVybCwgcXVlcnkpLnRoZW4oZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAgRW1iZXIucnVu
KG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7Ci0g
ICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVy
ZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsK
LSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0K
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZmluZEFsbAotICAgIEBwYXJhbSB7RFMuU3RvcmV9
IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7U3RyaW5nfSBzaW5jZVRva2VuCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBmaW5kQWxsOiBudWxsLAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3
aGVuIHlvdSBjYWxsIGBmaW5kYCBvbiB0aGUgc3RvcmUgd2l0aCBhCi0gICAgcXVlcnkgb2JqZWN0
IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIChpLmUuIGBzdG9yZS5maW5kKCdwZXJzb24nLCB7Ci0g
ICAgcGFnZTogMSB9KWApLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0gICAgICBmaW5k
UXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSkgewotICAgICAgICB2YXIgdXJsID0g
dHlwZTsKLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVz
b2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmdldEpTT04odXJsLCBxdWVyeSkudGhl
bihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwg
ZGF0YSk7Ci0gICAgICAgICAgfSwgZnVuY3Rpb24oanFYSFIpIHsKLSAgICAgICAgICAgIGpxWEhS
LnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBwcm9taXNlcwotICAg
ICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVjdCwganFYSFIpOwotICAgICAgICAgIH0pOwot
ICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcml2YXRlCi0g
ICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBw
YXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcXVl
cnkKLSAgICBAcGFyYW0ge0RTLkFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheX0gcmVjb3JkQXJy
YXkKLSAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIGZpbmRRdWVyeTogbnVs
bCwKLQotICAvKioKLSAgICBJZiB0aGUgZ2xvYmFsbHkgdW5pcXVlIElEcyBmb3IgeW91ciByZWNv
cmRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudCwKLSAgICBpbXBsZW1lbnQgdGhl
IGBnZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZv
a2VkCi0gICAgZWFjaCB0aW1lIHlvdSBjcmVhdGUgYSBuZXcgcmVjb3JkLCBhbmQgdGhlIHZhbHVl
IHJldHVybmVkIGZyb20gaXQgd2lsbCBiZQotICAgIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQncyBg
cHJpbWFyeUtleWAuCi0KLSAgICBNb3N0IHRyYWRpdGlvbmFsIFJFU1QtbGlrZSBIVFRQIEFQSXMg
d2lsbCBub3QgdXNlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCB0aGUgSUQKLSAgICBvZiB0aGUgcmVj
b3JkIHdpbGwgYmUgc2V0IGJ5IHRoZSBzZXJ2ZXIsIGFuZCB5b3VyIGFkYXB0ZXIgd2lsbCB1cGRh
dGUgdGhlIHN0b3JlCi0gICAgd2l0aCB0aGUgbmV3IElEIHdoZW4gaXQgY2FsbHMgYGRpZENyZWF0
ZVJlY29yZCgpYC4gT25seSBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYKLSAgICB5b3UgaW50ZW5k
IHRvIGdlbmVyYXRlIHJlY29yZCBJRHMgb24gdGhlIGNsaWVudC1zaWRlLgotCi0gICAgVGhlIGBn
ZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmVx
dWVzdGluZyBzdG9yZSBhcwotICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSBuZXdseSBj
cmVhdGVkIHJlY29yZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcjoKLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBnZW5lcmF0ZUlkRm9yUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgcmVjb3JkKSB7Ci0g
ICAgICB2YXIgdXVpZCA9IEFwcC5nZW5lcmF0ZVVVSURXaXRoU3RhdGlzdGljYWxseUxvd09kZHNP
ZkNvbGxpc2lvbigpOwotICAgICAgcmV0dXJuIHV1aWQ7Ci0gICAgfQotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK
LSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtTdHJpbmd8TnVtYmVy
fSBpZAotICAqLwotICBnZW5lcmF0ZUlkRm9yUmVjb3JkOiBudWxsLAotCi0gIC8qKgotICAgIFBy
b3hpZXMgdG8gdGhlIHNlcmlhbGl6ZXIncyBgc2VyaWFsaXplYCBtZXRob2QuCi0KLSAgICBFeGFt
cGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERT
LkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5
cGUsIHJlY29yZCkgewotICAgICAgICB2YXIgZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwg
eyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHZhciB1cmwgPSB0eXBlOwotCi0gICAgICAg
IC8vIC4uLgotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxp
emUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gICBv
cHRpb25zCi0gICAgQHJldHVybiB7T2JqZWN0fSBzZXJpYWxpemVkIHJlY29yZAotICAqLwotICBz
ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgIHJldHVybiBnZXQocmVj
b3JkLCAnc3RvcmUnKS5zZXJpYWxpemVyRm9yKHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5KS5z
ZXJpYWxpemUocmVjb3JkLCBvcHRpb25zKTsKLSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQg
dGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlIGNyZWF0aW9uIG9mCi0gICAg
bmV3IHJlY29yZHMuCi0KLSAgICBTZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIHNlbmQgaXQgdG8g
dGhlIHNlcnZlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAu
QXBwbGljYXRpb25BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAgICAgY3JlYXRlUmVj
b3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0g
dGhpcy5zZXJpYWxpemUocmVjb3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KTsKLSAgICAgICAgdmFy
IHVybCA9IHR5cGU7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVu
Y3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmFqYXgoewotICAgICAg
ICAgICAgdHlwZTogJ1BPU1QnLAotICAgICAgICAgICAgdXJsOiB1cmwsCi0gICAgICAgICAgICBk
YXRhVHlwZTogJ2pzb24nLAotICAgICAgICAgICAgZGF0YTogZGF0YQotICAgICAgICAgIH0pLnRo
ZW4oZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUs
IGRhdGEpOwotICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhI
Ui50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAg
ICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsK
LSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNy
ZWF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZSAgIHRoZSBEUy5Nb2RlbCBjbGFzcyBvZiB0aGUgcmVjb3Jk
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQot
ICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyB0byBoYW5kbGUg
dGhlIHVwZGF0aW5nIG9mCi0gICAgYSByZWNvcmQuCi0KLSAgICBTZXJpYWxpemVzIHRoZSByZWNv
cmQgdXBkYXRlIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCi0KLSAgICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIu
ZXh0ZW5kKHsKLSAgICAgIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29y
ZCkgewotICAgICAgICB2YXIgZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRl
SWQ6IHRydWUgfSk7Ci0gICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgICAg
IHZhciB1cmwgPSBbdHlwZSwgaWRdLmpvaW4oJy8nKTsKLQotICAgICAgICByZXR1cm4gbmV3IEVt
YmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBq
UXVlcnkuYWpheCh7Ci0gICAgICAgICAgICB0eXBlOiAnUFVUJywKLSAgICAgICAgICAgIHVybDog
dXJsLAotICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKLSAgICAgICAgICAgIGRhdGE6IGRh
dGEKLSAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgICAgIEVtYmVy
LnJ1bihudWxsLCByZXNvbHZlLCBkYXRhKTsKLSAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikg
ewotICAgICAgICAgICAganFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1h
bm5lcmVkIHByb21pc2VzCi0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhI
Uik7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotICAgIGBg
YAotCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y
ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUgICB0aGUgRFMuTW9kZWwg
Y2xhc3Mgb2YgdGhlIHJlY29yZAotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBy
ZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgdXBkYXRlUmVjb3JkOiBFbWJlci5yZXF1
aXJlZChGdW5jdGlvbiksCi0KLSAgLyoqCi0gICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGEg
c3ViY2xhc3MgdG8gaGFuZGxlIHRoZSBkZWxldGlvbiBvZgotICAgIGEgcmVjb3JkLgotCi0gICAg
U2VuZHMgYSBkZWxldGUgcmVxdWVzdCBmb3IgdGhlIHJlY29yZCB0byB0aGUgc2VydmVyLgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0
ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0gICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnNlcmlhbGl6ZShy
ZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOwotICAgICAgICB2YXIgaWQgPSByZWNvcmQuZ2V0
KCdpZCcpOwotICAgICAgICB2YXIgdXJsID0gW3R5cGUsIGlkXS5qb2luKCcvJyk7Ci0KLSAgICAg
ICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0
KSB7Ci0gICAgICAgICAgalF1ZXJ5LmFqYXgoewotICAgICAgICAgICAgdHlwZTogJ0RFTEVURScs
Ci0gICAgICAgICAgICB1cmw6IHVybCwKLSAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCi0g
ICAgICAgICAgICBkYXRhOiBkYXRhCi0gICAgICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7
Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7Ci0gICAgICAgICAg
fSwgZnVuY3Rpb24oanFYSFIpIHsKLSAgICAgICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0
YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBwcm9taXNlcwotICAgICAgICAgICAgRW1iZXIucnVu
KG51bGwsIHJlamVjdCwganFYSFIpOwotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBh
cmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0
eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNvcmQKLSAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIGRlbGV0
ZVJlY29yZDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAotCi0gIC8qKgotICAgIEZpbmQgbXVs
dGlwbGUgcmVjb3JkcyBhdCBvbmNlLgotCi0gICAgQnkgZGVmYXVsdCwgaXQgbG9vcHMgb3ZlciB0
aGUgcHJvdmlkZWQgaWRzIGFuZCBjYWxscyBgZmluZGAgb24gZWFjaC4KLSAgICBNYXkgYmUgb3Zl
cndyaXR0ZW4gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YK
LSAgICBzZXJ2ZXIgcmVxdWVzdHMuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAg
IGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWRzKSB7Ci0gICAgICAgIHZhciB1cmwg
PSB0eXBlOwotICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBqUXVlcnkuZ2V0SlNPTih1cmwsIHtpZHM6IGlk
c30pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJl
c29sdmUsIGRhdGEpOwotICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAg
ICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlz
ZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAg
ICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0
aG9kIGZpbmRNYW55Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1
YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNv
cmRzCi0gICAgQHBhcmFtIHtBcnJheX0gICAgaWRzCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZQotICAqLwotICBmaW5kTWFueTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgewotICAg
IHZhciBwcm9taXNlcyA9IG1hcC5jYWxsKGlkcywgZnVuY3Rpb24oaWQpIHsKLSAgICAgIHJldHVy
biB0aGlzLmZpbmQoc3RvcmUsIHR5cGUsIGlkKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVy
biBFbWJlci5SU1ZQLmFsbChwcm9taXNlcyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51
bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLXZhciBjb3VudGVyID0gMDsKLQotLyoqCi0gIGBEUy5G
aXh0dXJlQWRhcHRlcmAgaXMgYW4gYWRhcHRlciB0aGF0IGxvYWRzIHJlY29yZHMgZnJvbSBtZW1v
cnkuCi0gIEl0cyBwcmltYXJpbHkgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuIFlv
dSBjYW4gYWxzbyB1c2UKLSAgYERTLkZpeHR1cmVBZGFwdGVyYCB3aGlsZSB3b3JraW5nIG9uIHRo
ZSBBUEkgYnV0IGFyZSBub3QgcmVhZHkgdG8KLSAgaW50ZWdyYXRlIHlldC4gSXQgaXMgYSBmdWxs
eSBmdW5jdGlvbmluZyBhZGFwdGVyLiBBbGwgQ1JVRCBtZXRob2RzCi0gIGFyZSBpbXBsZW1lbnRl
ZC4gWW91IGNhbiBhbHNvIGltcGxlbWVudCBxdWVyeSBsb2dpYyB0aGF0IGEgcmVtb3RlCi0gIHN5
c3RlbSB3b3VsZCBkby4gSXRzIHBvc3NpYmxlIHRvIGRvIGRldmVsb3AgeW91ciBlbnRpcmUgYXBw
bGljYXRpb24KLSAgd2l0aCBgRFMuRml4dHVyZUFkYXB0ZXJgLgotCi0gIEZvciBpbmZvcm1hdGlv
biBvbiBob3cgdG8gdXNlIHRoZSBgRml4dHVyZUFkYXB0ZXJgIGluIHlvdXIKLSAgYXBwbGljYXRp
b24gcGxlYXNlIHNlZSB0aGUgW0ZpeHR1cmVBZGFwdGVyCi0gIGd1aWRlXSgvZ3VpZGVzL21vZGVs
cy90aGUtZml4dHVyZS1hZGFwdGVyLykuCi0KLSAgQGNsYXNzIEZpeHR1cmVBZGFwdGVyCi0gIEBu
YW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRFMuQWRhcHRlcgotKi8KLURTLkZpeHR1cmVBZGFwdGVy
ID0gRFMuQWRhcHRlci5leHRlbmQoewotICAvLyBieSBkZWZhdWx0LCBmaXh0dXJlcyBhcmUgYWxy
ZWFkeSBpbiBub3JtYWxpemVkIGZvcm0KLSAgc2VyaWFsaXplcjogbnVsbCwKLQotICAvKioKLSAg
ICBJZiBgc2ltdWxhdGVSZW1vdGVSZXNwb25zZWAgaXMgYHRydWVgIHRoZSBgRml4dHVyZUFkYXB0
ZXJgIHdpbGwKLSAgICB3YWl0IGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2
aW5nIHByb21pc2VzIHdpdGggdGhlCi0gICAgZml4dHVyZSB2YWx1ZXMuIFRoZSB3YWl0IHRpbWUg
Y2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBgbGF0ZW5jeWAKLSAgICBwcm9wZXJ0eS4KLQotICAg
IEBwcm9wZXJ0eSBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0g
ICAgQGRlZmF1bHQgdHJ1ZQotICAqLwotICBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlOiB0cnVlLAot
Ci0gIC8qKgotICAgIEJ5IGRlZmF1bHQgdGhlIGBGaXh0dXJlQWRhcHRlcmAgd2lsbCBzaW11bGF0
ZSBhIHdhaXQgb2YgdGhlCi0gICAgYGxhdGVuY3lgIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2
aW5nIHByb21pc2VzIHdpdGggdGhlIGZpeHR1cmUKLSAgICB2YWx1ZXMuIFRoaXMgYmVoYXZpb3Ig
Y2FuIGJlIHR1cm5lZCBvZmYgdmlhIHRoZQotICAgIGBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlYCBw
cm9wZXJ0eS4KLQotICAgIEBwcm9wZXJ0eSBsYXRlbmN5Ci0gICAgQHR5cGUge051bWJlcn0KLSAg
ICBAZGVmYXVsdCA1MAotICAqLwotICBsYXRlbmN5OiA1MCwKLQotICAvKioKLSAgICBJbXBsZW1l
bnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBh
IHR5cGUKLQotICAgIEBtZXRob2QgZml4dHVyZXNGb3JUeXBlCi0gICAgQHBhcmFtIHtTdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEByZXR1cm4ge0FycmF5fQotICAqLwotICBmaXh0dXJl
c0ZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICBpZiAodHlwZS5GSVhUVVJFUykgewotICAg
ICAgdmFyIGZpeHR1cmVzID0gRW1iZXIuQSh0eXBlLkZJWFRVUkVTKTsKLSAgICAgIHJldHVybiBm
aXh0dXJlcy5tYXAoZnVuY3Rpb24oZml4dHVyZSl7Ci0gICAgICAgIHZhciBmaXh0dXJlSWRUeXBl
ID0gdHlwZW9mIGZpeHR1cmUuaWQ7Ci0gICAgICAgIGlmKGZpeHR1cmVJZFR5cGUgIT09ICJudW1i
ZXIiICYmIGZpeHR1cmVJZFR5cGUgIT09ICJzdHJpbmciKXsKLSAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoZm10KCd0aGUgaWQgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkIGFzIGEgbnVtYmVyIG9y
IHN0cmluZyBmb3IgZml4dHVyZSAlQCcsIFtmaXh0dXJlXSkpOwotICAgICAgICB9Ci0gICAgICAg
IGZpeHR1cmUuaWQgPSBmaXh0dXJlLmlkICsgJyc7Ci0gICAgICAgIHJldHVybiBmaXh0dXJlOwot
ICAgICAgfSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9LAotCi0gIC8qKgotICAgIElt
cGxlbWVudCB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byBxdWVyeSBmaXh0dXJlcyBkYXRhCi0KLSAg
ICBAbWV0aG9kIHF1ZXJ5Rml4dHVyZXMKLSAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCi0gICAg
QHBhcmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0g
dHlwZQotICAgIEByZXR1cm4ge1Byb21pc2V8QXJyYXl9Ci0gICovCi0gIHF1ZXJ5Rml4dHVyZXM6
IGZ1bmN0aW9uKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSkgewotICAgIEVtYmVyLmFzc2VydCgnTm90
IGltcGxlbWVudGVkOiBZb3UgbXVzdCBvdmVycmlkZSB0aGUgRFMuRml4dHVyZUFkYXB0ZXI6OnF1
ZXJ5Rml4dHVyZXMgbWV0aG9kIHRvIHN1cHBvcnQgcXVlcnlpbmcgdGhlIGZpeHR1cmUgc3RvcmUu
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVGaXh0dXJlcwotICAgIEBwYXJh
bSB7U3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJl
Ci0gICovCi0gIHVwZGF0ZUZpeHR1cmVzOiBmdW5jdGlvbih0eXBlLCBmaXh0dXJlKSB7Ci0gICAg
aWYoIXR5cGUuRklYVFVSRVMpIHsKLSAgICAgIHR5cGUuRklYVFVSRVMgPSBbXTsKLSAgICB9Ci0K
LSAgICB2YXIgZml4dHVyZXMgPSB0eXBlLkZJWFRVUkVTOwotCi0gICAgdGhpcy5kZWxldGVMb2Fk
ZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgZml4dHVyZXMucHVzaChmaXh0dXJlKTsK
LSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJv
dmlkZSBqc29uIGZvciBDUlVEIG1ldGhvZHMKLQotICAgIEBtZXRob2QgbW9ja0pTT04KLSAgICBA
cGFyYW0ge1N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0g
cmVjb3JkCi0gICovCi0gIG1vY2tKU09OOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7
Ci0gICAgcmV0dXJuIHN0b3JlLnNlcmlhbGl6ZXJGb3IodHlwZSkuc2VyaWFsaXplKHJlY29yZCwg
eyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBnZW5lcmF0
ZUlkRm9yUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RT
Lk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtTdHJpbmd9IGlkCi0gICovCi0gIGdlbmVyYXRl
SWRGb3JSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlKSB7Ci0gICAgcmV0dXJuICJmaXh0dXJlLSIgKyBj
b3VudGVyKys7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBmaW5kOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWQpIHsKLSAgICB2YXIgZml4dHVyZXMg
PSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKSwKLSAgICAgICAgZml4dHVyZTsKLQotICAgIEVt
YmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBl
LnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGlmIChmaXh0dXJlcykgewotICAgICAgZml4
dHVyZSA9IEVtYmVyLkEoZml4dHVyZXMpLmZpbmRQcm9wZXJ0eSgnaWQnLCBpZCk7Ci0gICAgfQot
Ci0gICAgaWYgKGZpeHR1cmUpIHsKLSAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2Fs
bChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpeHR1cmU7Ci0gICAgICB9LCB0aGlzKTsK
LSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJhbSB7
RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7QXJyYXl9IGlkcwotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAg
Ki8KLSAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZHMpIHsKLSAgICB2YXIgZml4
dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgi
VW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCks
IGZpeHR1cmVzKTsKLQotICAgIGlmIChmaXh0dXJlcykgewotICAgICAgZml4dHVyZXMgPSBmaXh0
dXJlcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgewotICAgICAgICByZXR1cm4gaW5kZXhPZihpZHMs
IGl0ZW0uaWQpICE9PSAtMTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIGlmIChmaXh0dXJlcykg
ewotICAgICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAg
ICAgICByZXR1cm4gZml4dHVyZXM7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGZpbmRBbGwKLSAgICBAcGFyYW0ge0RTLlN0
b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBA
cGFyYW0ge1N0cmluZ30gc2luY2VUb2tlbgotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UK
LSAgKi8KLSAgZmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUpIHsKLSAgICB2YXIgZml4dHVy
ZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5h
YmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZp
eHR1cmVzKTsKLQotICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigp
IHsKLSAgICAgIHJldHVybiBmaXh0dXJlczsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICAvKioK
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZmluZFF1ZXJ5Ci0gICAgQHBhcmFtIHtEUy5TdG9y
ZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBh
cmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAgQHBhcmFtIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3Jk
QXJyYXl9IHJlY29yZEFycmF5Ci0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwot
ICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSwgYXJyYXkpIHsKLSAgICB2
YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBlKTsKLQotICAgIEVtYmVyLmFz
c2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3Ry
aW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGZpeHR1cmVzID0gdGhpcy5xdWVyeUZpeHR1cmVzKGZp
eHR1cmVzLCBxdWVyeSwgdHlwZSk7Ci0KLSAgICBpZiAoZml4dHVyZXMpIHsKLSAgICAgIHJldHVy
biB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZp
eHR1cmVzOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRo
b2QgY3JlYXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0g
e3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk
Ci0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IGZ1
bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9j
a0pTT04oc3RvcmUsIHR5cGUsIHJlY29yZCk7Ci0KLSAgICB0aGlzLnVwZGF0ZUZpeHR1cmVzKHR5
cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGZpeHR1cmU7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y
ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RT
Lk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIHVw
ZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgIHZhciBmaXh0
dXJlID0gdGhpcy5tb2NrSlNPTihzdG9yZSwgdHlwZSwgcmVjb3JkKTsKLQotICAgIHRoaXMudXBk
YXRlRml4dHVyZXModHlwZSwgZml4dHVyZSk7Ci0KLSAgICByZXR1cm4gdGhpcy5zaW11bGF0ZVJl
bW90ZUNhbGwoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gZml4dHVyZTsKLSAgICB9LCB0aGlz
KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGRlbGV0ZVJlY29yZAotICAgIEBwYXJhbSB7
RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQot
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21p
c2UKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7
Ci0gICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1vY2tKU09OKHN0b3JlLCB0eXBlLCByZWNvcmQpOwot
Ci0gICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0
dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgLy8gbm8gcGF5
bG9hZCBpbiBhIGRlbGV0aW9uCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9KTsKLSAgfSwKLQot
ICAvKgotICAgIEBtZXRob2QgZGVsZXRlTG9hZGVkRml4dHVyZQotICAgIEBwcml2YXRlCi0gICAg
QHBhcmFtIHR5cGUKLSAgICBAcGFyYW0gcmVjb3JkCi0gICovCi0gIGRlbGV0ZUxvYWRlZEZpeHR1
cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkgewotICAgIHZhciBleGlzdGluZ0ZpeHR1cmUgPSB0
aGlzLmZpbmRFeGlzdGluZ0ZpeHR1cmUodHlwZSwgcmVjb3JkKTsKLQotICAgIGlmKGV4aXN0aW5n
Rml4dHVyZSkgewotICAgICAgdmFyIGluZGV4ID0gaW5kZXhPZih0eXBlLkZJWFRVUkVTLCBleGlz
dGluZ0ZpeHR1cmUpOwotICAgICAgdHlwZS5GSVhUVVJFUy5zcGxpY2UoaW5kZXgsIDEpOwotICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9LAotCi0gIC8qCi0gICAgQG1ldGhvZCBmaW5kRXhp
c3RpbmdGaXh0dXJlCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0gdHlwZQotICAgIEBwYXJhbSBy
ZWNvcmQKLSAgKi8KLSAgZmluZEV4aXN0aW5nRml4dHVyZTogZnVuY3Rpb24odHlwZSwgcmVjb3Jk
KSB7Ci0gICAgdmFyIGZpeHR1cmVzID0gdGhpcy5maXh0dXJlc0ZvclR5cGUodHlwZSk7Ci0gICAg
dmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0KLSAgICByZXR1cm4gdGhpcy5maW5kRml4dHVy
ZUJ5SWQoZml4dHVyZXMsIGlkKTsKLSAgfSwKLQotICAvKgotICAgIEBtZXRob2QgZmluZEZpeHR1
cmVCeUlkCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0gZml4dHVyZXMKLSAgICBAcGFyYW0gaWQK
LSAgKi8KLSAgZmluZEZpeHR1cmVCeUlkOiBmdW5jdGlvbihmaXh0dXJlcywgaWQpIHsKLSAgICBy
ZXR1cm4gRW1iZXIuQShmaXh0dXJlcykuZmluZChmdW5jdGlvbihyKSB7Ci0gICAgICBpZignJytn
ZXQociwgJ2lkJykgPT09ICcnK2lkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBl
bHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0g
IC8qCi0gICAgQG1ldGhvZCBzaW11bGF0ZVJlbW90ZUNhbGwKLSAgICBAcHJpdmF0ZQotICAgIEBw
YXJhbSBjYWxsYmFjawotICAgIEBwYXJhbSBjb250ZXh0Ci0gICovCi0gIHNpbXVsYXRlUmVtb3Rl
Q2FsbDogZnVuY3Rpb24oY2FsbGJhY2ssIGNvbnRleHQpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRo
aXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZl
KSB7Ci0gICAgICBpZiAoZ2V0KGFkYXB0ZXIsICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsK
LSAgICAgICAgLy8gU2NoZWR1bGUgd2l0aCBzZXRUaW1lb3V0Ci0gICAgICAgIEVtYmVyLnJ1bi5s
YXRlcihmdW5jdGlvbigpIHsKLSAgICAgICAgICByZXNvbHZlKGNhbGxiYWNrLmNhbGwoY29udGV4
dCkpOwotICAgICAgICB9LCBnZXQoYWRhcHRlciwgJ2xhdGVuY3knKSk7Ci0gICAgICB9IGVsc2Ug
ewotICAgICAgICAvLyBBc3luY2hyb25vdXMsIGJ1dCBhdCB0aGUgb2YgdGhlIHJ1bmxvb3Agd2l0
aCB6ZXJvIGxhdGVuY3kKLSAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgbnVs
bCwgZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgcmVzb2x2ZShjYWxsYmFjay5jYWxsKGNvbnRleHQp
KTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSwgIkRTOiBGaXh0dXJlQWRhcHRlciNzaW11
bGF0ZVJlbW90ZUNhbGwiKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVh
Y2g7Ci12YXIgbWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwOwotCi1mdW5jdGlvbiBjb2Vy
Y2VJZChpZCkgewotICByZXR1cm4gaWQgPT0gbnVsbCA/IG51bGwgOiBpZCsnJzsKLX0KLQotLyoq
Ci0gIE5vcm1hbGx5LCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhlIGBSRVNUU2VyaWFsaXplcmAg
YnkgaW1wbGVtZW50aW5nCi0gIHRoZSBgbm9ybWFsaXplYCBtZXRob2QgYW5kIGluZGl2aWR1YWwg
bm9ybWFsaXphdGlvbnMgdW5kZXIKLSAgYG5vcm1hbGl6ZUhhc2hgLgotCi0gIFRoaXMgYWxsb3dz
IHlvdSB0byBkbyB3aGF0ZXZlciBraW5kIG9mIG11bmdpbmcgeW91IG5lZWQsIGFuZCBpcwotICBl
c3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3VyIHNlcnZlciBpcyBpbmNvbnNpc3RlbnQgYW5kIHlvdSBu
ZWVkIHRvCi0gIGRvIG11bmdpbmcgZGlmZmVyZW50bHkgZm9yIG1hbnkgZGlmZmVyZW50IGtpbmRz
IG9mIHJlc3BvbnNlcy4KLQotICBTZWUgdGhlIGBub3JtYWxpemVgIGRvY3VtZW50YXRpb24gZm9y
IG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIyMgQWNyb3NzIHRoZSBCb2FyZCBOb3JtYWxpemF0aW9u
Ci0KLSAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgaG9va3MgdGhhdCB5b3UgbWlnaHQgZmlu
ZCB1c2VmdWwgdG8gZGVmaW5lZAotICBhY3Jvc3MtdGhlLWJvYXJkIHJ1bGVzIGZvciB5b3VyIHBh
eWxvYWQuIFRoZXNlIHJ1bGVzIHdpbGwgYmUgdXNlZnVsCi0gIGlmIHlvdXIgc2VydmVyIGlzIGNv
bnNpc3RlbnQsIG9yIGlmIHlvdSdyZSBidWlsZGluZyBhbiBhZGFwdGVyIGZvcgotICBhbiBpbmZy
YXN0cnVjdHVyZSBzZXJ2aWNlLCBsaWtlIFBhcnNlLCBhbmQgd2FudCB0byBlbmNvZGUgc2Vydmlj
ZQotICBjb252ZW50aW9ucy4KLQotICBGb3IgZXhhbXBsZSwgaWYgYWxsIG9mIHlvdXIga2V5cyBh
cmUgdW5kZXJzY29yZWQgYW5kIGFsbC1jYXBzLCBidXQKLSAgb3RoZXJ3aXNlIGNvbnNpc3RlbnQg
d2l0aCB0aGUgbmFtZXMgeW91IHVzZSBpbiB5b3VyIG1vZGVscywgeW91Ci0gIGNhbiBpbXBsZW1l
bnQgYWNyb3NzLXRoZS1ib2FyZCBydWxlcyBmb3IgaG93IHRvIGNvbnZlcnQgYW4gYXR0cmlidXRl
Ci0gIG5hbWUgaW4geW91ciBtb2RlbCB0byBhIGtleSBpbiB5b3VyIEpTT04uCi0KLSAgYGBganMK
LSAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7
Ci0gICAga2V5Rm9yQXR0cmlidXRlOiBmdW5jdGlvbihhdHRyKSB7Ci0gICAgICByZXR1cm4gRW1i
ZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKTsKLSAgICB9Ci0gIH0pOwot
ICBgYGAKLQotICBZb3UgY2FuIGFsc28gaW1wbGVtZW50IGBrZXlGb3JSZWxhdGlvbnNoaXBgLCB3
aGljaCB0YWtlcyB0aGUgbmFtZQotICBvZiB0aGUgcmVsYXRpb25zaGlwIGFzIHRoZSBmaXJzdCBw
YXJhbWV0ZXIsIGFuZCB0aGUga2luZCBvZgotICByZWxhdGlvbnNoaXAgKGBoYXNNYW55YCBvciBg
YmVsb25nc1RvYCkgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCi0KLSAgQGNsYXNzIFJFU1RTZXJp
YWxpemVyCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRFMuSlNPTlNlcmlhbGl6ZXIKLSov
Ci1EUy5SRVNUU2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gIC8qKgot
ICAgIElmIHlvdSB3YW50IHRvIGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFy
dCBvZiB0aGUgcGF5bG9hZCwgeW91Ci0gICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1h
bGl6ZUhhc2hgLgotCi0gICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcganNvbiB3
aGVyZSB0aGUgdGhlIGBJRHNgIHVuZGVyCi0gICAgYCJjb21tZW50cyJgIGFyZSBwcm92aWRlZCBh
cyBgX2lkYCBpbnN0ZWFkIG9mIGBpZGAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAg
ICAgInBvc3QiOiB7Ci0gICAgICAgICJpZCI6IDEsCi0gICAgICAgICJ0aXRsZSI6ICJSYWlscyBp
cyBvbWFrYXNlIiwKLSAgICAgICAgImNvbW1lbnRzIjogWyAxLCAyIF0KLSAgICAgIH0sCi0gICAg
ICAiY29tbWVudHMiOiBbewotICAgICAgICAiX2lkIjogMSwKLSAgICAgICAgImJvZHkiOiAiRklS
U1QiCi0gICAgICB9LCB7Ci0gICAgICAgICJfaWQiOiAyLAotICAgICAgICAiYm9keSI6ICJSYWls
cyBpcyB1bmFnaSIKLSAgICAgIH1dCi0gICAgfQotICAgIGBgYAotCi0gICAgWW91IHVzZSBgbm9y
bWFsaXplSGFzaGAgdG8gbm9ybWFsaXplIGp1c3QgdGhlIGNvbW1lbnRzOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVu
ZCh7Ci0gICAgICBub3JtYWxpemVIYXNoOiB7Ci0gICAgICAgIGNvbW1lbnRzOiBmdW5jdGlvbiho
YXNoKSB7Ci0gICAgICAgICAgaGFzaC5pZCA9IGhhc2guX2lkOwotICAgICAgICAgIGRlbGV0ZSBo
YXNoLl9pZDsKLSAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgICAgfQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgVGhlIGtleSB1bmRlciBgbm9ybWFsaXplSGFzaGAgaXMgdXN1
YWxseSBqdXN0IHRoZSBvcmlnaW5hbCBrZXkKLSAgICB0aGF0IHdhcyBpbiB0aGUgb3JpZ2luYWwg
cGF5bG9hZC4gSG93ZXZlciwga2V5IG5hbWVzIHdpbGwgYmUKLSAgICBpbXBhY3RlZCBieSBhbnkg
bW9kaWZpY2F0aW9ucyBkb25lIGluIHRoZSBgbm9ybWFsaXplUGF5bG9hZGAKLSAgICBtZXRob2Qu
IFRoZSBgRFMuUkVTVFNlcmlhbGl6ZXJgJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBu
bwotICAgIGNoYW5nZXMgdG8gdGhlIHBheWxvYWQga2V5cy4KLQotICAgIEBwcm9wZXJ0eSBub3Jt
YWxpemVIYXNoCi0gICAgQHR5cGUge09iamVjdH0KLSAgICBAZGVmYXVsdCB1bmRlZmluZWQKLSAg
Ki8KLQotICAvKioKLSAgICBOb3JtYWxpemVzIGEgcGFydCBvZiB0aGUgSlNPTiBwYXlsb2FkIHJl
dHVybmVkIGJ5Ci0gICAgdGhlIHNlcnZlci4gWW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhv
ZCwgbXVuZ2UgdGhlIGhhc2gKLSAgICBhbmQgY2FsbCBzdXBlciBpZiB5b3UgaGF2ZSBnZW5lcmlj
IG5vcm1hbGl6YXRpb24gdG8gZG8uCi0KLSAgICBJdCB0YWtlcyB0aGUgdHlwZSBvZiB0aGUgcmVj
b3JkIHRoYXQgaXMgYmVpbmcgbm9ybWFsaXplZAotICAgIChhcyBhIERTLk1vZGVsIGNsYXNzKSwg
dGhlIHByb3BlcnR5IHdoZXJlIHRoZSBoYXNoIHdhcwotICAgIG9yaWdpbmFsbHkgZm91bmQsIGFu
ZCB0aGUgaGFzaCB0byBub3JtYWxpemUuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUg
YSBwYXlsb2FkIHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAg
ICAicG9zdCI6IHsKLSAgICAgICAgImlkIjogMSwKLSAgICAgICAgInRpdGxlIjogIlJhaWxzIGlz
IG9tYWthc2UiLAotICAgICAgICAiY29tbWVudHMiOiBbIDEsIDIgXQotICAgICAgfSwKLSAgICAg
ICJjb21tZW50cyI6IFt7Ci0gICAgICAgICJpZCI6IDEsCi0gICAgICAgICJib2R5IjogIkZJUlNU
IgotICAgICAgfSwgewotICAgICAgICAiaWQiOiAyLAotICAgICAgICAiYm9keSI6ICJSYWlscyBp
cyB1bmFnaSIKLSAgICAgIH1dCi0gICAgfQotICAgIGBgYAotCi0gICAgVGhlIGBub3JtYWxpemVg
IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aHJlZSB0aW1lczoKLQotICAgICogV2l0aCBgQXBwLlBv
c3RgLCBgInBvc3RzImAgYW5kIGB7IGlkOiAxLCB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiLCAu
Li4gfWAKLSAgICAqIFdpdGggYEFwcC5Db21tZW50YCwgYCJjb21tZW50cyJgIGFuZCBgeyBpZDog
MSwgYm9keTogIkZJUlNUIiB9YAotICAgICogV2l0aCBgQXBwLkNvbW1lbnRgLCBgImNvbW1lbnRz
ImAgYW5kIGB7IGlkOiAyLCBib2R5OiAiUmFpbHMgaXMgdW5hZ2kiIH1gCi0KLSAgICBZb3UgY2Fu
IHVzZSB0aGlzIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHRvIG5vcm1hbGl6ZSB1bmRlcnNjb3JlZCBr
ZXlzIHRvIGNhbWVsaXplZAotICAgIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSBub3JtYWxpemF0
aW9ucy4KLQotICAgIElmIHlvdSB3YW50IHRvIGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRv
IHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwgeW91Ci0gICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5k
ZXIgYG5vcm1hbGl6ZUhhc2hgLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBgSURzYCB1bmRl
ciBgImNvbW1lbnRzImAgYXJlIHByb3ZpZGVkIGFzIGBfaWRgIGluc3RlYWQgb2YKLSAgICBgaWRg
LCB5b3UgY2FuIHNwZWNpZnkgaG93IHRvIG5vcm1hbGl6ZSBqdXN0IHRoZSBjb21tZW50czoKLQot
ICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0
ZW5kKHsKLSAgICAgIG5vcm1hbGl6ZUhhc2g6IHsKLSAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9u
KGhhc2gpIHsKLSAgICAgICAgICBoYXNoLmlkID0gaGFzaC5faWQ7Ci0gICAgICAgICAgZGVsZXRl
IGhhc2guX2lkOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUga2V5IHVuZGVyIGBub3JtYWxpemVIYXNoYCBpcyBq
dXN0IHRoZSBvcmlnaW5hbCBrZXkgdGhhdCB3YXMgaW4gdGhlIG9yaWdpbmFsCi0gICAgcGF5bG9h
ZC4KLQotICAgIEBtZXRob2Qgbm9ybWFsaXplCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtTdHJpbmd9
IHByb3AKLSAgICBAcmV0dXJucyB7T2JqZWN0fQotICAqLwotICBub3JtYWxpemU6IGZ1bmN0aW9u
KHR5cGUsIGhhc2gsIHByb3ApIHsKLSAgICB0aGlzLm5vcm1hbGl6ZUlkKGhhc2gpOwotICAgIHRo
aXMubm9ybWFsaXplQXR0cmlidXRlcyh0eXBlLCBoYXNoKTsKLSAgICB0aGlzLm5vcm1hbGl6ZVJl
bGF0aW9uc2hpcHModHlwZSwgaGFzaCk7Ci0KLSAgICB0aGlzLm5vcm1hbGl6ZVVzaW5nRGVjbGFy
ZWRNYXBwaW5nKHR5cGUsIGhhc2gpOwotCi0gICAgaWYgKHRoaXMubm9ybWFsaXplSGFzaCAmJiB0
aGlzLm5vcm1hbGl6ZUhhc2hbcHJvcF0pIHsKLSAgICAgIHRoaXMubm9ybWFsaXplSGFzaFtwcm9w
XShoYXNoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIodHlwZSwgaGFzaCwgcHJv
cCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm9ybWFs
aXplIGFsbCBwYXlsb2FkcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkKLSAgICByZXByZXNl
bnQgc2luZ2xlIHJlY29yZHMgb3IgYW4gYXJyYXkuCi0KLSAgICBGb3IgZXhhbXBsZSwgeW91IG1p
Z2h0IHdhbnQgdG8gcmVtb3ZlIHNvbWUgZXh0cmFuZW91cyBkYXRhIGZyb20gdGhlIHBheWxvYWQ6
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2Vy
aWFsaXplci5leHRlbmQoewotICAgICAgbm9ybWFsaXplUGF5bG9hZDogZnVuY3Rpb24odHlwZSwg
cGF5bG9hZCkgewotICAgICAgICBkZWxldGUgcGF5bG9hZC52ZXJzaW9uOwotICAgICAgICBkZWxl
dGUgcGF5bG9hZC5zdGF0dXM7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkOwotICAgICAgfQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBub3JtYWxpemVQYXlsb2FkCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0g
ICAgQHJldHVybnMge09iamVjdH0gdGhlIG5vcm1hbGl6ZWQgcGF5bG9hZAotICAqLwotICBub3Jt
YWxpemVQYXlsb2FkOiBmdW5jdGlvbih0eXBlLCBwYXlsb2FkKSB7Ci0gICAgcmV0dXJuIHBheWxv
YWQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3JtYWxpemVJZAotICAgIEBwcml2YXRl
Ci0gICovCi0gIG5vcm1hbGl6ZUlkOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgdmFyIHByaW1hcnlL
ZXkgPSBnZXQodGhpcywgJ3ByaW1hcnlLZXknKTsKLQotICAgIGlmIChwcmltYXJ5S2V5ID09PSAn
aWQnKSB7IHJldHVybjsgfQotCi0gICAgaGFzaC5pZCA9IGhhc2hbcHJpbWFyeUtleV07Ci0gICAg
ZGVsZXRlIGhhc2hbcHJpbWFyeUtleV07Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3Jt
YWxpemVVc2luZ0RlY2xhcmVkTWFwcGluZwotICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6
ZVVzaW5nRGVjbGFyZWRNYXBwaW5nOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIGF0
dHJzID0gZ2V0KHRoaXMsICdhdHRycycpLCBwYXlsb2FkS2V5LCBrZXk7Ci0KLSAgICBpZiAoYXR0
cnMpIHsKLSAgICAgIGZvciAoa2V5IGluIGF0dHJzKSB7Ci0gICAgICAgIHBheWxvYWRLZXkgPSBh
dHRyc1trZXldOwotICAgICAgICBpZiAocGF5bG9hZEtleSAmJiBwYXlsb2FkS2V5LmtleSkgewot
ICAgICAgICAgIHBheWxvYWRLZXkgPSBwYXlsb2FkS2V5LmtleTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAodHlwZW9mIHBheWxvYWRLZXkgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgaGFzaFtr
ZXldID0gaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5
XTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IG5vcm1hbGl6ZUF0dHJpYnV0ZXMKLSAgICBAcHJpdmF0ZQotICAqLwotICBub3JtYWxpemVBdHRy
aWJ1dGVzOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIHBheWxvYWRLZXksIGtleTsK
LQotICAgIGlmICh0aGlzLmtleUZvckF0dHJpYnV0ZSkgewotICAgICAgdHlwZS5lYWNoQXR0cmli
dXRlKGZ1bmN0aW9uKGtleSkgewotICAgICAgICBwYXlsb2FkS2V5ID0gdGhpcy5rZXlGb3JBdHRy
aWJ1dGUoa2V5KTsKLSAgICAgICAgaWYgKGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0K
LQotICAgICAgICBoYXNoW2tleV0gPSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICBkZWxldGUg
aGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgIH0sIHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioK
LSAgICBAbWV0aG9kIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcHMKLSAgICBAcHJpdmF0ZQotICAqLwot
ICBub3JtYWxpemVSZWxhdGlvbnNoaXBzOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFy
IHBheWxvYWRLZXksIGtleTsKLQotICAgIGlmICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgewot
ICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7
Ci0gICAgICAgIHBheWxvYWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0
aW9uc2hpcC5raW5kKTsKLSAgICAgICAgaWYgKGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47
IH0KLQotICAgICAgICBoYXNoW2tleV0gPSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICBkZWxl
dGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgIH0sIHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAv
KioKLSAgICBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIGhhcyByZXR1cm5lZCBhIHBheWxvYWQgcmVw
cmVzZW50aW5nCi0gICAgYSBzaW5nbGUgcmVjb3JkLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEg
YGZpbmRgIG9yIGBzYXZlYC4KLQotICAgIEl0IGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gY2xlYW4g
dXAgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGludG8gdGhlIG5vcm1hbGl6ZWQKLSAgICBmb3JtIGV4
cGVjdGVkIGJ5IEVtYmVyIERhdGEuCi0KLSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBqdXN0IHJl
c3RydWN0dXJlIHRoZSB0b3AtbGV2ZWwgb2YgeW91ciBwYXlsb2FkLCBhbmQKLSAgICBkbyBtb3Jl
IGZpbmUtZ3JhaW5lZCBub3JtYWxpemF0aW9uIGluIHRoZSBgbm9ybWFsaXplYCBtZXRob2QuCi0K
LSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXlsb2FkIGxpa2UgdGhpcyBpbiByZXNw
b25zZSB0byBhIHJlcXVlc3QgZm9yCi0gICAgcG9zdCAxOgotCi0gICAgYGBganMKLSAgICB7Ci0g
ICAgICAiaWQiOiAxLAotICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAotCi0gICAg
ICAiX2VtYmVkZGVkIjogewotICAgICAgICAiY29tbWVudCI6IFt7Ci0gICAgICAgICAgIl9pZCI6
IDEsCi0gICAgICAgICAgImNvbW1lbnRfdGl0bGUiOiAiRklSU1QiCi0gICAgICAgIH0sIHsKLSAg
ICAgICAgICAiX2lkIjogMiwKLSAgICAgICAgICAiY29tbWVudF90aXRsZSI6ICJSYWlscyBpcyB1
bmFnaSIKLSAgICAgICAgfV0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBZb3UgY291
bGQgaW1wbGVtZW50IGEgc2VyaWFsaXplciB0aGF0IGxvb2tzIGxpa2UgdGhpcyB0byBnZXQgeW91
ciBwYXlsb2FkCi0gICAgaW50byBzaGFwZToKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJp
YWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIC8vIEZpcnN0LCByZXN0
cnVjdHVyZSB0aGUgdG9wLWxldmVsIHNvIGl0J3Mgb3JnYW5pemVkIGJ5IHR5cGUKLSAgICAgIGV4
dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5
cGUpIHsKLSAgICAgICAgdmFyIGNvbW1lbnRzID0gcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudDsK
LSAgICAgICAgZGVsZXRlIHBheWxvYWQuX2VtYmVkZGVkOwotCi0gICAgICAgIHBheWxvYWQgPSB7
IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdDogcGF5bG9hZCB9OwotICAgICAgICByZXR1cm4gdGhp
cy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gICAgICB9
LAotCi0gICAgICBub3JtYWxpemVIYXNoOiB7Ci0gICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBp
bmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAoYWZ0ZXIgYGV4dHJhY3RgKQotICAgICAgICAvLyBh
cmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1lbnRzYAotICAgICAgICBjb21tZW50czogZnVuY3Rp
b24oaGFzaCkgewotICAgICAgICAgIGhhc2guaWQgPSBoYXNoLl9pZDsKLSAgICAgICAgICBoYXNo
LnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxlOwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsK
LSAgICAgICAgICBkZWxldGUgaGFzaC5jb21tZW50X3RpdGxlOwotICAgICAgICAgIHJldHVybiBo
YXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSkKLSAgICBgYGAKLQotICAgIFdoZW4geW91
IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdFNpbmds
ZWAsIHRoZQotICAgIGJ1aWx0LWluIGltcGxlbWVudGF0aW9uIHdpbGwgZmluZCB0aGUgcHJpbWFy
eSByZWNvcmQgaW4geW91ciBub3JtYWxpemVkCi0gICAgcGF5bG9hZCBhbmQgcHVzaCB0aGUgcmVt
YWluaW5nIHJlY29yZHMgaW50byB0aGUgc3RvcmUuCi0KLSAgICBUaGUgcHJpbWFyeSByZWNvcmQg
aXMgdGhlIHNpbmdsZSBoYXNoIGZvdW5kIHVuZGVyIGBwb3N0YCBvciB0aGUgZmlyc3QKLSAgICBl
bGVtZW50IG9mIHRoZSBgcG9zdHNgIGFycmF5LgotCi0gICAgVGhlIHByaW1hcnkgcmVjb3JkIGhh
cyBzcGVjaWFsIG1lYW5pbmcgd2hlbiB0aGUgcmVjb3JkIGlzIGJlaW5nIGNyZWF0ZWQKLSAgICBm
b3IgdGhlIGZpcnN0IHRpbWUgb3IgdXBkYXRlZCAoYGNyZWF0ZVJlY29yZGAgb3IgYHVwZGF0ZVJl
Y29yZGApLiBJbgotICAgIHBhcnRpY3VsYXIsIGl0IHdpbGwgdXBkYXRlIHRoZSBwcm9wZXJ0aWVz
IG9mIHRoZSByZWNvcmQgdGhhdCB3YXMgc2F2ZWQuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RTaW5n
bGUKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEBwYXJhbSB7
U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7J2ZpbmQnfCdjcmVhdGVSZWNvcmQnfCd1cGRhdGVSZWNv
cmQnfCdkZWxldGVSZWNvcmQnfSByZXF1ZXN0VHlwZQotICAgIEByZXR1cm5zIHtPYmplY3R9IHRo
ZSBwcmltYXJ5IHJlc3BvbnNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0Ci0gICovCi0gIGV4dHJh
Y3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBwcmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQs
IHJlcXVlc3RUeXBlKSB7Ci0gICAgcGF5bG9hZCA9IHRoaXMubm9ybWFsaXplUGF5bG9hZChwcmlt
YXJ5VHlwZSwgcGF5bG9hZCk7Ci0KLSAgICB2YXIgcHJpbWFyeVR5cGVOYW1lID0gcHJpbWFyeVR5
cGUudHlwZUtleSwKLSAgICAgICAgcHJpbWFyeVJlY29yZDsKLQotICAgIGZvciAodmFyIHByb3Ag
aW4gcGF5bG9hZCkgewotICAgICAgdmFyIHR5cGVOYW1lICA9IHRoaXMudHlwZUZvclJvb3QocHJv
cCksCi0gICAgICAgICAgdHlwZSA9IHN0b3JlLm1vZGVsRm9yKHR5cGVOYW1lKSwKLSAgICAgICAg
ICBpc1ByaW1hcnkgPSB0eXBlLnR5cGVLZXkgPT09IHByaW1hcnlUeXBlTmFtZTsKLQotICAgICAg
Ly8gbGVnYWN5IHN1cHBvcnQgZm9yIHNpbmd1bGFyIHJlc291cmNlcwotICAgICAgaWYgKGlzUHJp
bWFyeSAmJiBFbWJlci50eXBlT2YocGF5bG9hZFtwcm9wXSkgIT09ICJhcnJheSIgKSB7Ci0gICAg
ICAgIHByaW1hcnlSZWNvcmQgPSB0aGlzLm5vcm1hbGl6ZShwcmltYXJ5VHlwZSwgcGF5bG9hZFtw
cm9wXSwgcHJvcCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKmpzaGlu
dCBsb29wZnVuYzp0cnVlKi8KLSAgICAgIGZvckVhY2guY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5j
dGlvbihoYXNoKSB7Ci0gICAgICAgIHZhciB0eXBlTmFtZSA9IHRoaXMudHlwZUZvclJvb3QocHJv
cCksCi0gICAgICAgICAgICB0eXBlID0gc3RvcmUubW9kZWxGb3IodHlwZU5hbWUpLAotICAgICAg
ICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUpOwotCi0gICAg
ICAgIGhhc2ggPSB0eXBlU2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0K
LSAgICAgICAgdmFyIGlzRmlyc3RDcmVhdGVkUmVjb3JkID0gaXNQcmltYXJ5ICYmICFyZWNvcmRJ
ZCAmJiAhcHJpbWFyeVJlY29yZCwKLSAgICAgICAgICAgIGlzVXBkYXRlZFJlY29yZCA9IGlzUHJp
bWFyeSAmJiBjb2VyY2VJZChoYXNoLmlkKSA9PT0gcmVjb3JkSWQ7Ci0KLSAgICAgICAgLy8gZmlu
ZCB0aGUgcHJpbWFyeSByZWNvcmQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEl0J3MgZWl0aGVy
OgotICAgICAgICAvLyAqIHRoZSByZWNvcmQgd2l0aCB0aGUgc2FtZSBJRCBhcyB0aGUgb3JpZ2lu
YWwgcmVxdWVzdAotICAgICAgICAvLyAqIGluIHRoZSBjYXNlIG9mIGEgbmV3bHkgY3JlYXRlZCBy
ZWNvcmQgdGhhdCBkaWRuJ3QgaGF2ZSBhbiBJRCwgdGhlIGZpcnN0Ci0gICAgICAgIC8vICAgcmVj
b3JkIGluIHRoZSBBcnJheQotICAgICAgICBpZiAoaXNGaXJzdENyZWF0ZWRSZWNvcmQgfHwgaXNV
cGRhdGVkUmVjb3JkKSB7Ci0gICAgICAgICAgcHJpbWFyeVJlY29yZCA9IGhhc2g7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgc3RvcmUucHVzaCh0eXBlTmFtZSwgaGFzaCk7Ci0gICAgICAg
IH0KLSAgICAgIH0sIHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiBwcmltYXJ5UmVjb3JkOwot
ICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkIGEg
cGF5bG9hZCByZXByZXNlbnRpbmcKLSAgICBtdWx0aXBsZSByZWNvcmRzLCBzdWNoIGFzIGluIHJl
c3BvbnNlIHRvIGEgYGZpbmRBbGxgIG9yIGBmaW5kUXVlcnlgLgotCi0gICAgSXQgaXMgeW91ciBv
cHBvcnR1bml0eSB0byBjbGVhbiB1cCB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgaW50byB0aGUgbm9y
bWFsaXplZAotICAgIGZvcm0gZXhwZWN0ZWQgYnkgRW1iZXIgRGF0YS4KLQotICAgIElmIHlvdSB3
YW50LCB5b3UgY2FuIGp1c3QgcmVzdHJ1Y3R1cmUgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIHBheWxv
YWQsIGFuZAotICAgIGRvIG1vcmUgZmluZS1ncmFpbmVkIG5vcm1hbGl6YXRpb24gaW4gdGhlIGBu
b3JtYWxpemVgIG1ldGhvZC4KLQotICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBheWxv
YWQgbGlrZSB0aGlzIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBmb3IKLSAgICBhbGwgcG9zdHM6
Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJfZW1iZWRkZWQiOiB7Ci0gICAgICAgICJwb3N0
IjogW3sKLSAgICAgICAgICAiaWQiOiAxLAotICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBv
bWFrYXNlIgotICAgICAgICB9LCB7Ci0gICAgICAgICAgImlkIjogMiwKLSAgICAgICAgICAidGl0
bGUiOiAiVGhlIFBhcmxleSBMZXR0ZXIiCi0gICAgICAgIH1dLAotICAgICAgICAiY29tbWVudCI6
IFt7Ci0gICAgICAgICAgIl9pZCI6IDEsCi0gICAgICAgICAgImNvbW1lbnRfdGl0bGUiOiAiUmFp
bHMgaXMgdW5hZ2kiCi0gICAgICAgICAgInBvc3RfaWQiOiAxCi0gICAgICAgIH0sIHsKLSAgICAg
ICAgICAiX2lkIjogMiwKLSAgICAgICAgICAiY29tbWVudF90aXRsZSI6ICJEb24ndCB0cmVhZCBv
biBtZSIsCi0gICAgICAgICAgInBvc3RfaWQiOiAyCi0gICAgICAgIH1dCi0gICAgICB9Ci0gICAg
fQotICAgIGBgYAotCi0gICAgWW91IGNvdWxkIGltcGxlbWVudCBhIHNlcmlhbGl6ZXIgdGhhdCBs
b29rcyBsaWtlIHRoaXMgdG8gZ2V0IHlvdXIgcGF5bG9hZAotICAgIGludG8gc2hhcGU6Ci0KLSAg
ICBgYGBqcwotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVu
ZCh7Ci0gICAgICAvLyBGaXJzdCwgcmVzdHJ1Y3R1cmUgdGhlIHRvcC1sZXZlbCBzbyBpdCdzIG9y
Z2FuaXplZCBieSB0eXBlCi0gICAgICAvLyBhbmQgdGhlIGNvbW1lbnRzIGFyZSBsaXN0ZWQgdW5k
ZXIgYSBwb3N0J3MgYGNvbW1lbnRzYCBrZXkuCi0gICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9u
KHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsKLSAgICAgICAgdmFyIHBv
c3RzID0gcGF5bG9hZC5fZW1iZWRkZWQucG9zdDsKLSAgICAgICAgdmFyIGNvbW1lbnRzID0gW107
Ci0gICAgICAgIHZhciBwb3N0Q2FjaGUgPSB7fTsKLQotICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1
bmN0aW9uKHBvc3QpIHsKLSAgICAgICAgICBwb3N0LmNvbW1lbnRzID0gW107Ci0gICAgICAgICAg
cG9zdENhY2hlW3Bvc3QuaWRdID0gcG9zdDsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGF5bG9h
ZC5fZW1iZWRkZWQuY29tbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGNvbW1lbnQpIHsKLSAgICAgICAg
ICBjb21tZW50cy5wdXNoKGNvbW1lbnQpOwotICAgICAgICAgIHBvc3RDYWNoZVtjb21tZW50LnBv
c3RfaWRdLmNvbW1lbnRzLnB1c2goY29tbWVudCk7Ci0gICAgICAgICAgZGVsZXRlIGNvbW1lbnQu
cG9zdF9pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21t
ZW50cywgcG9zdHM6IHBheWxvYWQgfTsKLQotICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3Rv
cmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gICAgICB9LAotCi0gICAgICBu
b3JtYWxpemVIYXNoOiB7Ci0gICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNv
bW1lbnRzLCB3aGljaCAoYWZ0ZXIgYGV4dHJhY3RgKQotICAgICAgICAvLyBhcmUgbm93IGxvY2F0
ZWQgdW5kZXIgYGNvbW1lbnRzYAotICAgICAgICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgewot
ICAgICAgICAgIGhhc2guaWQgPSBoYXNoLl9pZDsKLSAgICAgICAgICBoYXNoLnRpdGxlID0gaGFz
aC5jb21tZW50X3RpdGxlOwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICBk
ZWxldGUgaGFzaC5jb21tZW50X3RpdGxlOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfSkKLSAgICBgYGAKLQotICAgIFdoZW4geW91IGNhbGwgc3VwZXIg
ZnJvbSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdEFycmF5YCwgdGhlCi0gICAg
YnVpbHQtaW4gaW1wbGVtZW50YXRpb24gd2lsbCBmaW5kIHRoZSBwcmltYXJ5IGFycmF5IGluIHlv
dXIgbm9ybWFsaXplZAotICAgIHBheWxvYWQgYW5kIHB1c2ggdGhlIHJlbWFpbmluZyByZWNvcmRz
IGludG8gdGhlIHN0b3JlLgotCi0gICAgVGhlIHByaW1hcnkgYXJyYXkgaXMgdGhlIGFycmF5IGZv
dW5kIHVuZGVyIGBwb3N0c2AuCi0KLSAgICBUaGUgcHJpbWFyeSByZWNvcmQgaGFzIHNwZWNpYWwg
bWVhbmluZyB3aGVuIHJlc3BvbmRpbmcgdG8gYGZpbmRRdWVyeWAKLSAgICBvciBgZmluZEhhc01h
bnlgLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJpbWFyeSBhcnJheSB3aWxsIGJlY29tZSB0aGUKLSAg
ICBsaXN0IG9mIHJlY29yZHMgaW4gdGhlIHJlY29yZCBhcnJheSB0aGF0IGtpY2tlZCBvZmYgdGhl
IHJlcXVlc3QuCi0KLSAgICBJZiB5b3VyIHByaW1hcnkgYXJyYXkgY29udGFpbnMgc2Vjb25kYXJ5
IChlbWJlZGRlZCkgcmVjb3JkcyBvZiB0aGUgc2FtZSB0eXBlLAotICAgIHlvdSBjYW5ub3QgcGxh
Y2UgdGhlc2UgaW50byB0aGUgcHJpbWFyeSBhcnJheSBgcG9zdHNgLiBJbnN0ZWFkLCBwbGFjZSB0
aGUKLSAgICBzZWNvbmRhcnkgaXRlbXMgaW50byBhbiB1bmRlcnNjb3JlIHByZWZpeGVkIHByb3Bl
cnR5IGBfcG9zdHNgLCB3aGljaCB3aWxsCi0gICAgcHVzaCB0aGVzZSBpdGVtcyBpbnRvIHRoZSBz
dG9yZSBhbmQgd2lsbCBub3QgYWZmZWN0IHRoZSByZXN1bHRpbmcgcXVlcnkuCi0KLSAgICBAbWV0
aG9kIGV4dHJhY3RBcnJheQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2Fk
Ci0gICAgQHBhcmFtIHsnZmluZEFsbCd8J2ZpbmRNYW55J3wnZmluZEhhc01hbnknfCdmaW5kUXVl
cnknfSByZXF1ZXN0VHlwZQotICAgIEByZXR1cm5zIHtBcnJheX0gVGhlIHByaW1hcnkgYXJyYXkg
dGhhdCB3YXMgcmV0dXJuZWQgaW4gcmVzcG9uc2UKLSAgICAgIHRvIHRoZSBvcmlnaW5hbCBxdWVy
eS4KLSAgKi8KLSAgZXh0cmFjdEFycmF5OiBmdW5jdGlvbihzdG9yZSwgcHJpbWFyeVR5cGUsIHBh
eWxvYWQpIHsKLSAgICBwYXlsb2FkID0gdGhpcy5ub3JtYWxpemVQYXlsb2FkKHByaW1hcnlUeXBl
LCBwYXlsb2FkKTsKLQotICAgIHZhciBwcmltYXJ5VHlwZU5hbWUgPSBwcmltYXJ5VHlwZS50eXBl
S2V5LAotICAgICAgICBwcmltYXJ5QXJyYXk7Ci0KLSAgICBmb3IgKHZhciBwcm9wIGluIHBheWxv
YWQpIHsKLSAgICAgIHZhciB0eXBlS2V5ID0gcHJvcCwKLSAgICAgICAgICBmb3JjZWRTZWNvbmRh
cnkgPSBmYWxzZTsKLQotICAgICAgaWYgKHByb3AuY2hhckF0KDApID09PSAnXycpIHsKLSAgICAg
ICAgZm9yY2VkU2Vjb25kYXJ5ID0gdHJ1ZTsKLSAgICAgICAgdHlwZUtleSA9IHByb3Auc3Vic3Ry
KDEpOwotICAgICAgfQotCi0gICAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHR5
cGVLZXkpLAotICAgICAgICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSksCi0gICAg
ICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUpLAotICAgICAg
ICAgIGlzUHJpbWFyeSA9ICghZm9yY2VkU2Vjb25kYXJ5ICYmICh0eXBlLnR5cGVLZXkgPT09IHBy
aW1hcnlUeXBlTmFtZSkpOwotCi0gICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KLSAgICAg
IHZhciBub3JtYWxpemVkQXJyYXkgPSBtYXAuY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbiho
YXNoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlU2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFz
aCwgcHJvcCk7Ci0gICAgICB9LCB0aGlzKTsKLQotICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAg
ICAgICBwcmltYXJ5QXJyYXkgPSBub3JtYWxpemVkQXJyYXk7Ci0gICAgICB9IGVsc2UgewotICAg
ICAgICBzdG9yZS5wdXNoTWFueSh0eXBlTmFtZSwgbm9ybWFsaXplZEFycmF5KTsKLSAgICAgIH0K
LSAgICB9Ci0KLSAgICByZXR1cm4gcHJpbWFyeUFycmF5OwotICB9LAotCi0gIC8qKgotICAgIFRo
aXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gcHVzaCBhIHBheWxvYWQgY29udGFpbmluZyB0b3AtbGV2
ZWwKLSAgICBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIG9yZ2FuaXplZCBwZXIgdHlwZS4KLQotICAg
IGBgYGpzCi0gICAgewotICAgICAgInBvc3RzIjogW3sKLSAgICAgICAgImlkIjogIjEiLAotICAg
ICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAgICJhdXRob3IiLCAiMSIs
Ci0gICAgICAgICJjb21tZW50cyI6IFsgIjEiIF0KLSAgICAgIH1dLAotICAgICAgImNvbW1lbnRz
IjogW3sKLSAgICAgICAgImlkIjogIjEiLAotICAgICAgICAiYm9keSI6ICJGSVJTVCIKLSAgICAg
IH1dLAotICAgICAgInVzZXJzIjogW3sKLSAgICAgICAgImlkIjogIjEiLAotICAgICAgICAibmFt
ZSI6ICJAZDJoIgotICAgICAgfV0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBJdCB3aWxsIGZpcnN0
IG5vcm1hbGl6ZSB0aGUgcGF5bG9hZCwgc28geW91IGNhbiB1c2UgdGhpcyB0byBwdXNoCi0gICAg
aW4gZGF0YSBzdHJlYW1pbmcgaW4gZnJvbSB5b3VyIHNlcnZlciBzdHJ1Y3R1cmVkIHRoZSBzYW1l
IHdheQotICAgIHRoYXQgZmV0Y2hlcyBhbmQgc2F2ZXMgYXJlIHN0cnVjdHVyZWQuCi0KLSAgICBA
bWV0aG9kIHB1c2hQYXlsb2FkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFy
YW0ge09iamVjdH0gcGF5bG9hZAotICAqLwotICBwdXNoUGF5bG9hZDogZnVuY3Rpb24oc3RvcmUs
IHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0gdGhpcy5ub3JtYWxpemVQYXlsb2FkKG51bGwsIHBh
eWxvYWQpOwotCi0gICAgZm9yICh2YXIgcHJvcCBpbiBwYXlsb2FkKSB7Ci0gICAgICB2YXIgdHlw
ZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHByb3ApLAotICAgICAgICAgIHR5cGUgPSBzdG9yZS5t
b2RlbEZvcih0eXBlTmFtZSk7Ci0KLSAgICAgIC8qanNoaW50IGxvb3BmdW5jOnRydWUqLwotICAg
ICAgdmFyIG5vcm1hbGl6ZWRBcnJheSA9IG1hcC5jYWxsKEVtYmVyLm1ha2VBcnJheShwYXlsb2Fk
W3Byb3BdKSwgZnVuY3Rpb24oaGFzaCkgewotICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUo
dHlwZSwgaGFzaCwgcHJvcCk7Ci0gICAgICB9LCB0aGlzKTsKLQotICAgICAgc3RvcmUucHVzaE1h
bnkodHlwZU5hbWUsIG5vcm1hbGl6ZWRBcnJheSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAg
IFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIG5vcm1hbGl6ZSB0aGUgSlNPTiByb290IGtleXMg
cmV0dXJuZWQKLSAgICBpbnRvIHRoZSBtb2RlbCB0eXBlIGV4cGVjdGVkIGJ5IHlvdXIgc3RvcmUu
Ci0KLSAgICBGb3IgZXhhbXBsZSwgeW91ciBzZXJ2ZXIgbWF5IHJldHVybiB1bmRlcnNjb3JlZCBy
b290IGtleXMgcmF0aGVyIHRoYW4KLSAgICB0aGUgZXhwZWN0ZWQgY2FtZWxjYXNlZCB2ZXJzaW9u
cy4KLQotICAgIGBgYGpzCi0gICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RT
ZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICB0eXBlRm9yUm9vdDogZnVuY3Rpb24ocm9vdCkgewot
ICAgICAgICB2YXIgY2FtZWxpemVkID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKHJvb3QpOwotICAg
ICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnNpbmd1bGFyaXplKGNhbWVsaXplZCk7Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHR5cGVGb3JSb290Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IHJvb3QKLSAgICBAcmV0dXJucyB7U3RyaW5nfSB0aGUgbW9kZWwncyB0eXBlS2V5
Ci0gICovCi0gIHR5cGVGb3JSb290OiBmdW5jdGlvbihyb290KSB7Ci0gICAgcmV0dXJuIEVtYmVy
LlN0cmluZy5zaW5ndWxhcml6ZShyb290KTsKLSAgfSwKLQotICAvLyBTRVJJQUxJWkUKLQotICAv
KioKLSAgICBDYWxsZWQgd2hlbiBhIHJlY29yZCBpcyBzYXZlZCBpbiBvcmRlciB0byBjb252ZXJ0
IHRoZQotICAgIHJlY29yZCBpbnRvIEpTT04uCi0KLSAgICBCeSBkZWZhdWx0LCBpdCBjcmVhdGVz
IGEgSlNPTiBvYmplY3Qgd2l0aCBhIGtleSBmb3IKLSAgICBlYWNoIGF0dHJpYnV0ZSBhbmQgYmVs
b25nc1RvIHJlbGF0aW9uc2hpcC4KLQotICAgIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIG1v
ZGVsOgotCi0gICAgYGBganMKLSAgICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgICB0aXRsZTogRFMuYXR0cigpLAotICAgICAgYm9keTogRFMuYXR0cigpLAotCi0gICAgICBh
dXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUg
ZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0K
LSAgICBgYGBqcwotICAgIHsKLSAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIsCi0gICAg
ICAiYm9keSI6ICJSYWlscz8gT21ha2FzZT8gT19PIiwKLSAgICAgICJhdXRob3IiOiAxMgotICAg
IH0KLSAgICBgYGAKLQotICAgIEJ5IGRlZmF1bHQsIGF0dHJpYnV0ZXMgYXJlIHBhc3NlZCB0aHJv
dWdoIGFzLWlzLCB1bmxlc3MKLSAgICB5b3Ugc3BlY2lmaWVkIGFuIGF0dHJpYnV0ZSB0eXBlIChg
RFMuYXR0cignZGF0ZScpYCkuIElmCi0gICAgeW91IHNwZWNpZnkgYSB0cmFuc2Zvcm0sIHRoZSBK
YXZhU2NyaXB0IHZhbHVlIHdpbGwgYmUKLSAgICBzZXJpYWxpemVkIHdoZW4gaW5zZXJ0ZWQgaW50
byB0aGUgSlNPTiBoYXNoLgotCi0gICAgQnkgZGVmYXVsdCwgYmVsb25ncy10byByZWxhdGlvbnNo
aXBzIGFyZSBjb252ZXJ0ZWQgaW50bwotICAgIElEcyB3aGVuIGluc2VydGVkIGludG8gdGhlIEpT
T04gaGFzaC4KLQotICAgICMjIElEcwotCi0gICAgYHNlcmlhbGl6ZWAgdGFrZXMgYW4gb3B0aW9u
cyBoYXNoIHdpdGggYSBzaW5nbGUgb3B0aW9uOgotICAgIGBpbmNsdWRlSWRgLiBJZiB0aGlzIG9w
dGlvbiBpcyBgdHJ1ZWAsIGBzZXJpYWxpemVgIHdpbGwsCi0gICAgYnkgZGVmYXVsdCBpbmNsdWRl
IHRoZSBJRCBpbiB0aGUgSlNPTiBvYmplY3QgaXQgYnVpbGRzLgotCi0gICAgVGhlIGFkYXB0ZXIg
cGFzc2VzIGluIGBpbmNsdWRlSWQ6IHRydWVgIHdoZW4gc2VyaWFsaXppbmcKLSAgICBhIHJlY29y
ZCBmb3IgYGNyZWF0ZVJlY29yZGAsIGJ1dCBub3QgZm9yIGB1cGRhdGVSZWNvcmRgLgotCi0gICAg
IyMgQ3VzdG9taXphdGlvbgotCi0gICAgWW91ciBzZXJ2ZXIgbWF5IGV4cGVjdCBhIGRpZmZlcmVu
dCBKU09OIGZvcm1hdCB0aGFuIHRoZQotICAgIGJ1aWx0LWluIHNlcmlhbGl6YXRpb24gZm9ybWF0
LgotCi0gICAgSW4gdGhhdCBjYXNlLCB5b3UgY2FuIGltcGxlbWVudCBgc2VyaWFsaXplYCB5b3Vy
c2VsZiBhbmQKLSAgICByZXR1cm4gYSBKU09OIGhhc2ggb2YgeW91ciBjaG9vc2luZy4KLQotICAg
IGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5k
KHsKLSAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24ocG9zdCwgb3B0aW9ucykgewotICAgICAgICB2
YXIganNvbiA9IHsKLSAgICAgICAgICBQT1NUX1RUTDogcG9zdC5nZXQoJ3RpdGxlJyksCi0gICAg
ICAgICAgUE9TVF9CRFk6IHBvc3QuZ2V0KCdib2R5JyksCi0gICAgICAgICAgUE9TVF9DTVM6IHBv
c3QuZ2V0KCdjb21tZW50cycpLm1hcFByb3BlcnR5KCdpZCcpCi0gICAgICAgIH0KLQotICAgICAg
ICBpZiAob3B0aW9ucy5pbmNsdWRlSWQpIHsKLSAgICAgICAgICBqc29uLlBPU1RfSURfID0gcG9z
dC5nZXQoJ2lkJyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ganNvbjsKLSAgICAgIH0K
LSAgICB9KTsKLSAgICBgYGAKLQotICAgICMjIEN1c3RvbWl6aW5nIGFuIEFwcC1XaWRlIFNlcmlh
bGl6ZXIKLQotICAgIElmIHlvdSB3YW50IHRvIGRlZmluZSBhIHNlcmlhbGl6ZXIgZm9yIHlvdXIg
ZW50aXJlCi0gICAgYXBwbGljYXRpb24sIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSBgZWFj
aEF0dHJpYnV0ZWAKLSAgICBhbmQgYGVhY2hSZWxhdGlvbnNoaXBgIG9uIHRoZSByZWNvcmQuCi0K
LSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFs
aXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMp
IHsKLSAgICAgICAgdmFyIGpzb24gPSB7fTsKLQotICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0
ZShmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5h
bWUpXSA9IHJlY29yZC5nZXQobmFtZSk7Ci0gICAgICAgIH0pCi0KLSAgICAgICAgcmVjb3JkLmVh
Y2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAg
aWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAgICAgIGpzb25b
c2VydmVySGFzTWFueU5hbWUobmFtZSldID0gcmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsK
LSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJ
ZCkgewotICAgICAgICAgIGpzb24uSURfID0gcmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIHJldHVybiBqc29uOwotICAgICAgfQotICAgIH0pOwotCi0gICAgZnVuY3Rpb24g
c2VydmVyQXR0cmlidXRlTmFtZShhdHRyaWJ1dGUpIHsKLSAgICAgIHJldHVybiBhdHRyaWJ1dGUu
dW5kZXJzY29yZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2VydmVy
SGFzTWFueU5hbWUobmFtZSkgewotICAgICAgcmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFt
ZS5zaW5ndWxhcml6ZSgpKSArICJfSURTIjsKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNl
cmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBKU09OIHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICAg
YGBganMKLSAgICB7Ci0gICAgICAiVElUTEUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAi
Qk9EWSI6ICJZZXAuIE9tYWthc2UuIiwKLSAgICAgICJDT01NRU5UX0lEUyI6IFsgMSwgMiwgMyBd
Ci0gICAgfQotICAgIGBgYAotCi0gICAgIyMgVHdlYWtpbmcgdGhlIERlZmF1bHQgSlNPTgotCi0g
ICAgSWYgeW91IGp1c3Qgd2FudCB0byBkbyBzb21lIHNtYWxsIHR3ZWFrcyBvbiB0aGUgZGVmYXVs
dCBKU09OLAotICAgIHlvdSBjYW4gY2FsbCBzdXBlciBmaXJzdCBhbmQgbWFrZSB0aGUgdHdlYWtz
IG9uIHRoZSByZXR1cm5lZAotICAgIEpTT04uCi0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0U2Vy
aWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemU6IGZ1
bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgICAgICB2YXIganNvbiA9IHRoaXMuX3N1cGVy
KHJlY29yZCwgb3B0aW9ucyk7Ci0KLSAgICAgICAganNvbi5zdWJqZWN0ID0ganNvbi50aXRsZTsK
LSAgICAgICAgZGVsZXRlIGpzb24udGl0bGU7Ci0KLSAgICAgICAgcmV0dXJuIGpzb247Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNlcmlhbGl6ZQotICAgIEBwYXJh
bSByZWNvcmQKLSAgICBAcGFyYW0gb3B0aW9ucwotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9u
KHJlY29yZCwgb3B0aW9ucykgewotICAgIHJldHVybiB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBh
cmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRv
IGN1c3RvbWl6ZSB0aGUgcm9vdCBrZXlzIHNlcmlhbGl6ZWQgaW50byB0aGUgSlNPTi4KLSAgICBC
eSBkZWZhdWx0IHRoZSBSRVNUIFNlcmlhbGl6ZXIgc2VuZHMgY2FtZWxpemVkIHJvb3Qga2V5cy4K
LSAgICBGb3IgZXhhbXBsZSwgeW91ciBzZXJ2ZXIgbWF5IGV4cGVjdCB1bmRlcnNjb3JlZCByb290
IG9iamVjdHMuCi0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBE
Uy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplSW50b0hhc2g6IGZ1bmN0
aW9uKGRhdGEsIHR5cGUsIHJlY29yZCwgb3B0aW9ucykgewotICAgICAgICB2YXIgcm9vdCA9IEVt
YmVyLlN0cmluZy5kZWNhbWVsaXplKHR5cGUudHlwZUtleSk7Ci0gICAgICAgIGRhdGFbcm9vdF0g
PSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICAgICAgfQotICAgIH0pOwotICAg
IGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVJbnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0
fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0g
IHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlvbihoYXNoLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMp
IHsKLSAgICB2YXIgcm9vdCA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSh0eXBlLnR5cGVLZXkpOwot
ICAgIGhhc2hbcm9vdF0gPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAot
Ci0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBob3cgcG9s
eW1vcnBoaWMgb2JqZWN0cyBhcmUgc2VyaWFsaXplZC4KLSAgICBCeSBkZWZhdWx0IHRoZSBKU09O
IFNlcmlhbGl6ZXIgY3JlYXRlcyB0aGUga2V5IGJ5IGFwcGVuZGluZyBgVHlwZWAgdG8KLSAgICB0
aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSBmcm9tIHRoZSBtb2RlbCdzIGNhbWVsY2FzZWQgbW9kZWwg
bmFtZS4KLQotICAgIEBtZXRob2Qgc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlCi0gICAgQHBhcmFt
IHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGpzb24KLSAgICBAcGFyYW0g
e09iamVjdH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTog
ZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsKLSAgICB2YXIga2V5ID0gcmVs
YXRpb25zaGlwLmtleSwKLSAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLSAg
ICBrZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkg
OiBrZXk7Ci0gICAganNvbltrZXkgKyAiVHlwZSJdID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKGJl
bG9uZ3NUby5jb25zdHJ1Y3Rvci50eXBlS2V5KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0g
RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9s
eWZpbGxzLmZvckVhY2g7Ci0KLS8qKgotICBUaGUgUkVTVCBhZGFwdGVyIGFsbG93cyB5b3VyIHN0
b3JlIHRvIGNvbW11bmljYXRlIHdpdGggYW4gSFRUUCBzZXJ2ZXIgYnkKLSAgdHJhbnNtaXR0aW5n
IEpTT04gdmlhIFhIUi4gTW9zdCBFbWJlci5qcyBhcHBzIHRoYXQgY29uc3VtZSBhIEpTT04gQVBJ
Ci0gIHNob3VsZCB1c2UgdGhlIFJFU1QgYWRhcHRlci4KLQotICBUaGlzIGFkYXB0ZXIgaXMgZGVz
aWduZWQgYXJvdW5kIHRoZSBpZGVhIHRoYXQgdGhlIEpTT04gZXhjaGFuZ2VkIHdpdGgKLSAgdGhl
IHNlcnZlciBzaG91bGQgYmUgY29udmVudGlvbmFsLgotCi0gICMjIEpTT04gU3RydWN0dXJlCi0K
LSAgVGhlIFJFU1QgYWRhcHRlciBleHBlY3RzIHRoZSBKU09OIHJldHVybmVkIGZyb20geW91ciBz
ZXJ2ZXIgdG8gZm9sbG93Ci0gIHRoZXNlIGNvbnZlbnRpb25zLgotCi0gICMjIyBPYmplY3QgUm9v
dAotCi0gIFRoZSBKU09OIHBheWxvYWQgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5z
IHRoZSByZWNvcmQgaW5zaWRlIGEKLSAgcm9vdCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGluIHJl
c3BvbnNlIHRvIGEgYEdFVGAgcmVxdWVzdCBmb3IKLSAgYC9wb3N0cy8xYCwgdGhlIEpTT04gc2hv
dWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAicG9zdCI6IHsKLSAgICAg
ICJ0aXRsZSI6ICJJJ20gUnVubmluZyB0byBSZWZvcm0gdGhlIFczQydzIFRhZyIsCi0gICAgICAi
YXV0aG9yIjogIlllaHVkYSBLYXR6IgotICAgIH0KLSAgfQotICBgYGAKLQotICAjIyMgQ29udmVu
dGlvbmFsIE5hbWVzCi0KLSAgQXR0cmlidXRlIG5hbWVzIGluIHlvdXIgSlNPTiBwYXlsb2FkIHNo
b3VsZCBiZSB0aGUgY2FtZWxDYXNlZCB2ZXJzaW9ucyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5
b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVy
c29uYCBtb2RlbDoKLQotICBgYGBqcwotICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsK
LSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGxhc3ROYW1lOiBEUy5hdHRy
KCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQotICB9KTsKLSAg
YGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBg
YGpzCi0gIHsKLSAgICAicGVyc29uIjogewotICAgICAgImZpcnN0TmFtZSI6ICJCYXJhY2siLAot
ICAgICAgImxhc3ROYW1lIjogIk9iYW1hIiwKLSAgICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVu
dCIKLSAgICB9Ci0gIH0KLSAgYGBgCi0KLSAgIyMgQ3VzdG9taXphdGlvbgotCi0gICMjIyBFbmRw
b2ludCBwYXRoIGN1c3RvbWl6YXRpb24KLQotICBFbmRwb2ludCBwYXRocyBjYW4gYmUgcHJlZml4
ZWQgd2l0aCBhIGBuYW1lc3BhY2VgIGJ5IHNldHRpbmcgdGhlIG5hbWVzcGFjZQotICBwcm9wZXJ0
eSBvbiB0aGUgYWRhcHRlcjoKLQotICBgYGBqcwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewot
ICAgIG5hbWVzcGFjZTogJ2FwaS8xJwotICB9KTsKLSAgYGBgCi0gIFJlcXVlc3RzIGZvciBgQXBw
LlBlcnNvbmAgd291bGQgbm93IHRhcmdldCBgL2FwaS8xL3Blb3BsZS8xYC4KLQotICAjIyMgSG9z
dCBjdXN0b21pemF0aW9uCi0KLSAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5
IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4KLQotICBgYGBqcwotICBEUy5SRVNUQWRhcHRl
ci5yZW9wZW4oewotICAgIGhvc3Q6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbScKLSAgfSk7Ci0g
IGBgYAotCi0gICMjIyBIZWFkZXJzIGN1c3RvbWl6YXRpb24KLQotICBTb21lIEFQSXMgcmVxdWly
ZSBIVFRQIGhlYWRlcnMsIGUuZy4gdG8gcHJvdmlkZSBhbiBBUEkga2V5LiBBbiBhcnJheSBvZgot
ICBoZWFkZXJzIGNhbiBiZSBhZGRlZCB0byB0aGUgYWRhcHRlciB3aGljaCBhcmUgcGFzc2VkIHdp
dGggZXZlcnkgcmVxdWVzdDoKLQotICBgYGBqcwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewot
ICAgIGhlYWRlcnM6IHsKLSAgICAgICJBUElfS0VZIjogInNlY3JldCBrZXkiLAotICAgICAgIkFO
T1RIRVJfSEVBREVSIjogIlNvbWUgaGVhZGVyIHZhbHVlIgotICAgIH0KLSAgfSk7Ci0gIGBgYAot
Ci0gIEBjbGFzcyBSRVNUQWRhcHRlcgotICBAY29uc3RydWN0b3IKLSAgQG5hbWVzcGFjZSBEUwot
ICBAZXh0ZW5kcyBEUy5BZGFwdGVyCi0qLwotRFMuUkVTVEFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4
dGVuZCh7Ci0gIGRlZmF1bHRTZXJpYWxpemVyOiAnLXJlc3QnLAotCi0KLSAgLyoqCi0gICAgRW5k
cG9pbnQgcGF0aHMgY2FuIGJlIHByZWZpeGVkIHdpdGggYSBgbmFtZXNwYWNlYCBieSBzZXR0aW5n
IHRoZSBuYW1lc3BhY2UKLSAgICBwcm9wZXJ0eSBvbiB0aGUgYWRhcHRlcjoKLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgICAgbmFtZXNwYWNlOiAn
YXBpLzEnCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBSZXF1ZXN0cyBmb3IgYEFwcC5Qb3N0YCB3
b3VsZCBub3cgdGFyZ2V0IGAvYXBpLzEvcG9zdC9gLgotCi0gICAgQHByb3BlcnR5IG5hbWVzcGFj
ZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICovCi0KLSAgLyoqCi0gICAgQW4gYWRhcHRlciBjYW4g
dGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4KLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgICAgaG9zdDog
J2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJwotICAgIH0pOwotICAgIGBgYAotCi0gICAgUmVxdWVz
dHMgZm9yIGBBcHAuUG9zdGAgd291bGQgbm93IHRhcmdldCBgaHR0cHM6Ly9hcGkuZXhhbXBsZS5j
b20vcG9zdC9gLgotCi0gICAgQHByb3BlcnR5IGhvc3QKLSAgICBAdHlwZSB7U3RyaW5nfQotICAq
LwotCi0gIC8qKgotICAgIFNvbWUgQVBJcyByZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBw
cm92aWRlIGFuIEFQSSBrZXkuIEFuIGFycmF5IG9mCi0gICAgaGVhZGVycyBjYW4gYmUgYWRkZWQg
dG8gdGhlIGFkYXB0ZXIgd2hpY2ggYXJlIHBhc3NlZCB3aXRoIGV2ZXJ5IHJlcXVlc3Q6Ci0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgRFMuUkVTVEFkYXB0ZXIucmVvcGVuKHsKLSAgICAgIGhlYWRl
cnM6IHsKLSAgICAgICAgIkFQSV9LRVkiOiAic2VjcmV0IGtleSIsCi0gICAgICAgICJBTk9USEVS
X0hFQURFUiI6ICJTb21lIGhlYWRlciB2YWx1ZSIKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAK
LQotICAgIEBwcm9wZXJ0eSBoZWFkZXJzCi0gICAgQHR5cGUge09iamVjdH0KLSAgKi8KLQotICAv
KioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIHRoZSBKU09OIGZv
ciBhIGdpdmVuCi0gICAgdHlwZSBhbmQgSUQuCi0KLSAgICBUaGUgYGZpbmRgIG1ldGhvZCBtYWtl
cyBhbiBBamF4IHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwgYW5kIHJl
dHVybnMgYQotICAgIHByb21pc2UgZm9yIHRoZSByZXN1bHRpbmcgcGF5bG9hZC4KLQotICAgIFRo
aXMgbWV0aG9kIHBlcmZvcm1zIGFuIEhUVFAgYEdFVGAgcmVxdWVzdCB3aXRoIHRoZSBpZCBwcm92
aWRlZCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcuCi0KLSAgICBAbWV0aG9kIGZpbmQKLSAg
ICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30gaWQKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0g
cHJvbWlzZQotICAqLwotICBmaW5kOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWQpIHsKLSAgICBy
ZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwodHlwZS50eXBlS2V5LCBpZCksICdHRVQnKTsK
LSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNo
IGEgSlNPTiBhcnJheSBmb3IgYWxsCi0gICAgb2YgdGhlIHJlY29yZHMgZm9yIGEgZ2l2ZW4gdHlw
ZS4KLQotICAgIFRoZSBgZmluZEFsbGAgbWV0aG9kIG1ha2VzIGFuIEFqYXggKEhUVFAgR0VUKSBy
ZXF1ZXN0IHRvIGEgVVJMIGNvbXB1dGVkIGJ5IGBidWlsZFVSTGAsIGFuZCByZXR1cm5zIGEKLSAg
ICBwcm9taXNlIGZvciB0aGUgcmVzdWx0aW5nIHBheWxvYWQuCi0KLSAgICBAcHJpdmF0ZQotICAg
IEBtZXRob2QgZmluZEFsbAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRv
a2VuCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEFsbDogZnVu
Y3Rpb24oc3RvcmUsIHR5cGUsIHNpbmNlVG9rZW4pIHsKLSAgICB2YXIgcXVlcnk7Ci0KLSAgICBp
ZiAoc2luY2VUb2tlbikgewotICAgICAgcXVlcnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSks
ICdHRVQnLCB7IGRhdGE6IHF1ZXJ5IH0pOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0
aGUgc3RvcmUgaW4gb3JkZXIgdG8gZmV0Y2ggYSBKU09OIGFycmF5IGZvcgotICAgIHRoZSByZWNv
cmRzIHRoYXQgbWF0Y2ggYSBwYXJ0aWN1bGFyIHF1ZXJ5LgotCi0gICAgVGhlIGBmaW5kUXVlcnlg
IG1ldGhvZCBtYWtlcyBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRl
ZCBieSBgYnVpbGRVUkxgLCBhbmQgcmV0dXJucyBhCi0gICAgcHJvbWlzZSBmb3IgdGhlIHJlc3Vs
dGluZyBwYXlsb2FkLgotCi0gICAgVGhlIGBxdWVyeWAgYXJndW1lbnQgaXMgYSBzaW1wbGUgSmF2
YVNjcmlwdCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseQotICAgIHRvIHRoZSBz
ZXJ2ZXIgYXMgcGFyYW1ldGVycy4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBmaW5kUXVl
cnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcmV0dXJucyB7
UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCBxdWVyeSkgewotICAgIHJldHVybiB0aGlzLmFqYXgodGhpcy5idWlsZFVSTCh0eXBlLnR5cGVL
ZXkpLCAnR0VUJywgeyBkYXRhOiBxdWVyeSB9KTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQg
YnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUg
dW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1tYW55IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3Jp
Z2luYWxseQotICAgIHNwZWNpZmllZCBhcyBJRHMuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhl
IG9yaWdpbmFsIHBheWxvYWQgbG9va3MgbGlrZToKLQotICAgIGBgYGpzCi0gICAgewotICAgICAg
ImlkIjogMSwKLSAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICJjb21t
ZW50cyI6IFsgMSwgMiwgMyBdCi0gICAgfQotICAgIGBgYAotCi0gICAgVGhlIElEcyB3aWxsIGJl
IHBhc3NlZCBhcyBhIFVSTC1lbmNvZGVkIEFycmF5IG9mIElEcywgaW4gdGhpcyBmb3JtOgotCi0g
ICAgYGBgCi0gICAgaWRzW109MSZpZHNbXT0yJmlkc1tdPTMKLSAgICBgYGAKLQotICAgIE1hbnkg
c2VydmVycywgc3VjaCBhcyBSYWlscyBhbmQgUEhQLCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVy
dCB0aGlzIFVSTC1lbmNvZGVkIGFycmF5Ci0gICAgaW50byBhbiBBcnJheSBmb3IgeW91IG9uIHRo
ZSBzZXJ2ZXItc2lkZS4gSWYgeW91IHdhbnQgdG8gZW5jb2RlIHRoZQotICAgIElEcywgZGlmZmVy
ZW50bHksIGp1c3Qgb3ZlcnJpZGUgdGhpcyAob25lLWxpbmUpIG1ldGhvZC4KLQotICAgIFRoZSBg
ZmluZE1hbnlgIG1ldGhvZCBtYWtlcyBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVS
TCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBhbmQgcmV0dXJucyBhCi0gICAgcHJvbWlzZSBmb3Ig
dGhlIHJlc3VsdGluZyBwYXlsb2FkLgotCi0gICAgQG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7QXJyYXl9IGlkcwotICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNl
Ci0gICovCi0gIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWRzKSB7Ci0gICAgcmV0
dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6
IHsgaWRzOiBpZHMgfSB9KTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3Jl
IGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVj
b3JkcyBpbiBhIGhhcy1tYW55IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQotICAg
IHNwZWNpZmllZCBhcyBhIFVSTCAoaW5zaWRlIG9mIGBsaW5rc2ApLgotCi0gICAgRm9yIGV4YW1w
bGUsIGlmIHlvdXIgb3JpZ2luYWwgcGF5bG9hZCBsb29rcyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBq
cwotICAgIHsKLSAgICAgICJwb3N0IjogewotICAgICAgICAiaWQiOiAxLAotICAgICAgICAidGl0
bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAgICJsaW5rcyI6IHsgImNvbW1lbnRzIjog
Ii9wb3N0cy8xL2NvbW1lbnRzIiB9Ci0gICAgICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgVGhp
cyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcGFyZW50IHJlY29yZCBhbmQgYC9wb3N0
cy8xL2NvbW1lbnRzYC4KLQotICAgIFRoZSBgZmluZEhhc01hbnlgIG1ldGhvZCB3aWxsIG1ha2Ug
YW4gQWpheCAoSFRUUCBHRVQpIHJlcXVlc3QgdG8gdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIFVS
TC4KLSAgICBJZiB0aGUgVVJMIGlzIGhvc3QtcmVsYXRpdmUgKHN0YXJ0aW5nIHdpdGggYSBzaW5n
bGUgc2xhc2gpLCB0aGUKLSAgICByZXF1ZXN0IHdpbGwgdXNlIHRoZSBob3N0IHNwZWNpZmllZCBv
biB0aGUgYWRhcHRlciAoaWYgYW55KS4KLQotICAgIEBtZXRob2QgZmluZEhhc01hbnkKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAg
IEBwYXJhbSB7U3RyaW5nfSB1cmwKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBmaW5kSGFzTWFueTogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJsKSB7Ci0gICAgdmFy
IGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwKLSAgICAgICAgaWQgICA9IGdldChyZWNvcmQsICdp
ZCcpLAotICAgICAgICB0eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXk7Ci0KLSAgICBp
ZiAoaG9zdCAmJiB1cmwuY2hhckF0KDApID09PSAnLycgJiYgdXJsLmNoYXJBdCgxKSAhPT0gJy8n
KSB7Ci0gICAgICB1cmwgPSBob3N0ICsgdXJsOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLmFq
YXgodGhpcy51cmxQcmVmaXgodXJsLCB0aGlzLmJ1aWxkVVJMKHR5cGUsIGlkKSksICdHRVQnKTsK
LSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNo
IGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGJlbG9uZ3Mt
dG8gcmVsYXRpb25zaGlwIHRoYXQgd2VyZSBvcmlnaW5hbGx5Ci0gICAgc3BlY2lmaWVkIGFzIGEg
VVJMIChpbnNpZGUgb2YgYGxpbmtzYCkuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBvcmln
aW5hbCBwYXlsb2FkIGxvb2tzIGxpa2UgdGhpczoKLQotICAgIGBgYGpzCi0gICAgewotICAgICAg
InBlcnNvbiI6IHsKLSAgICAgICAgImlkIjogMSwKLSAgICAgICAgIm5hbWUiOiAiVG9tIERhbGUi
LAotICAgICAgICAibGlua3MiOiB7ICJncm91cCI6ICIvcGVvcGxlLzEvZ3JvdXAiIH0KLSAgICAg
IH0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRo
IHRoZSBwYXJlbnQgcmVjb3JkIGFuZCBgL3Blb3BsZS8xL2dyb3VwYC4KLQotICAgIFRoZSBgZmlu
ZEJlbG9uZ3NUb2AgbWV0aG9kIHdpbGwgbWFrZSBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0
byB0aGUgb3JpZ2luYWxseSBzcGVjaWZpZWQgVVJMLgotCi0gICAgQG1ldGhvZCBmaW5kQmVsb25n
c1RvCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQKLSAgICBAcGFyYW0ge1N0cmluZ30gdXJsCi0gICAgQHJldHVybnMge1Byb21pc2V9IHBy
b21pc2UKLSAgKi8KLSAgZmluZEJlbG9uZ3NUbzogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJs
KSB7Ci0gICAgdmFyIGlkICAgPSBnZXQocmVjb3JkLCAnaWQnKSwKLSAgICAgICAgdHlwZSA9IHJl
Y29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5OwotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLnVy
bFByZWZpeCh1cmwsIHRoaXMuYnVpbGRVUkwodHlwZSwgaWQpKSwgJ0dFVCcpOwotICB9LAotCi0g
IC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhIG5ld2x5IGNyZWF0ZWQgcmVjb3Jk
IGlzCi0gICAgc2F2ZWQgdmlhIHRoZSBgc2F2ZWAgbWV0aG9kIG9uIGEgbW9kZWwgcmVjb3JkIGlu
c3RhbmNlLgotCi0gICAgVGhlIGBjcmVhdGVSZWNvcmRgIG1ldGhvZCBzZXJpYWxpemVzIHRoZSBy
ZWNvcmQgYW5kIG1ha2VzIGFuIEFqYXggKEhUVFAgUE9TVCkgcmVxdWVzdAotICAgIHRvIGEgVVJM
IGNvbXB1dGVkIGJ5IGBidWlsZFVSTGAuCi0KLSAgICBTZWUgYHNlcmlhbGl6ZWAgZm9yIGluZm9y
bWF0aW9uIG9uIGhvdyB0byBjdXN0b21pemUgdGhlIHNlcmlhbGl6ZWQgZm9ybQotICAgIG9mIGEg
cmVjb3JkLgotCi0gICAgQG1ldGhvZCBjcmVhdGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3Jl
fSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFy
YW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICB2
YXIgZGF0YSA9IHt9OwotICAgIHZhciBzZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0
eXBlLnR5cGVLZXkpOwotCi0gICAgc2VyaWFsaXplci5zZXJpYWxpemVJbnRvSGFzaChkYXRhLCB0
eXBlLCByZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOwotCi0gICAgcmV0dXJuIHRoaXMuYWph
eCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICJQT1NUIiwgeyBkYXRhOiBkYXRhIH0pOwot
ICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhbiBleGlzdGluZyBy
ZWNvcmQgaXMgc2F2ZWQKLSAgICB2aWEgdGhlIGBzYXZlYCBtZXRob2Qgb24gYSBtb2RlbCByZWNv
cmQgaW5zdGFuY2UuCi0KLSAgICBUaGUgYHVwZGF0ZVJlY29yZGAgbWV0aG9kIHNlcmlhbGl6ZXMg
dGhlIHJlY29yZCBhbmQgbWFrZXMgYW4gQWpheCAoSFRUUCBQVVQpIHJlcXVlc3QKLSAgICB0byBh
IFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLgotCi0gICAgU2VlIGBzZXJpYWxpemVgIGZvciBp
bmZvcm1hdGlvbiBvbiBob3cgdG8gY3VzdG9taXplIHRoZSBzZXJpYWxpemVkIGZvcm0KLSAgICBv
ZiBhIHJlY29yZC4KLQotICAgIEBtZXRob2QgdXBkYXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5T
dG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UK
LSAgKi8KLSAgdXBkYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0g
ICAgdmFyIGRhdGEgPSB7fTsKLSAgICB2YXIgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJG
b3IodHlwZS50eXBlS2V5KTsKLQotICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplSW50b0hhc2goZGF0
YSwgdHlwZSwgcmVjb3JkKTsKLQotICAgIHZhciBpZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0g
ICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSwgaWQpLCAiUFVU
IiwgeyBkYXRhOiBkYXRhIH0pOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3Rv
cmUgd2hlbiBhIHJlY29yZCBpcyBkZWxldGVkLgotCi0gICAgVGhlIGBkZWxldGVSZWNvcmRgIG1l
dGhvZCAgbWFrZXMgYW4gQWpheCAoSFRUUCBERUxFVEUpIHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0
ZWQgYnkgYGJ1aWxkVVJMYC4KLQotICAgIEBtZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBhcmFt
IHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHBy
b21pc2UKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3Jk
KSB7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0KLSAgICByZXR1cm4gdGhpcy5h
amF4KHRoaXMuYnVpbGRVUkwodHlwZS50eXBlS2V5LCBpZCksICJERUxFVEUiKTsKLSAgfSwKLQot
ICAvKioKLSAgICBCdWlsZHMgYSBVUkwgZm9yIGEgZ2l2ZW4gdHlwZSBhbmQgb3B0aW9uYWwgSUQu
Ci0KLSAgICBCeSBkZWZhdWx0LCBpdCBwbHVyYWxpemVzIHRoZSB0eXBlJ3MgbmFtZSAoZm9yIGV4
YW1wbGUsICdwb3N0JwotICAgIGJlY29tZXMgJ3Bvc3RzJyBhbmQgJ3BlcnNvbicgYmVjb21lcyAn
cGVvcGxlJykuIFRvIG92ZXJyaWRlIHRoZQotICAgIHBsdXJhbGl6YXRpb24gc2VlIFtwYXRoRm9y
VHlwZV0oI21ldGhvZF9wYXRoRm9yVHlwZSkuCi0KLSAgICBJZiBhbiBJRCBpcyBzcGVjaWZpZWQs
IGl0IGFkZHMgdGhlIElEIHRvIHRoZSBwYXRoIGdlbmVyYXRlZAotICAgIGZvciB0aGUgdHlwZSwg
c2VwYXJhdGVkIGJ5IGEgYC9gLgotCi0gICAgQG1ldGhvZCBidWlsZFVSTAotICAgIEBwYXJhbSB7
U3RyaW5nfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQHJldHVybnMge1N0cmlu
Z30gdXJsCi0gICovCi0gIGJ1aWxkVVJMOiBmdW5jdGlvbih0eXBlLCBpZCkgewotICAgIHZhciB1
cmwgPSBbXSwKLSAgICAgICAgaG9zdCA9IGdldCh0aGlzLCAnaG9zdCcpLAotICAgICAgICBwcmVm
aXggPSB0aGlzLnVybFByZWZpeCgpOwotCi0gICAgaWYgKHR5cGUpIHsgdXJsLnB1c2godGhpcy5w
YXRoRm9yVHlwZSh0eXBlKSk7IH0KLSAgICBpZiAoaWQpIHsgdXJsLnB1c2goaWQpOyB9Ci0KLSAg
ICBpZiAocHJlZml4KSB7IHVybC51bnNoaWZ0KHByZWZpeCk7IH0KLQotICAgIHVybCA9IHVybC5q
b2luKCcvJyk7Ci0gICAgaWYgKCFob3N0ICYmIHVybCkgeyB1cmwgPSAnLycgKyB1cmw7IH0KLQot
ICAgIHJldHVybiB1cmw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cmxQcmVmaXgKLSAg
ICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gICAgQHBhcmFtIHtTdHJpbmd9
IHBhcmVudFVybAotICAgIEByZXR1cm4ge1N0cmluZ30gdXJsUHJlZml4Ci0gICovCi0gIHVybFBy
ZWZpeDogZnVuY3Rpb24ocGF0aCwgcGFyZW50VVJMKSB7Ci0gICAgdmFyIGhvc3QgPSBnZXQodGhp
cywgJ2hvc3QnKSwKLSAgICAgICAgbmFtZXNwYWNlID0gZ2V0KHRoaXMsICduYW1lc3BhY2UnKSwK
LSAgICAgICAgdXJsID0gW107Ci0KLSAgICBpZiAocGF0aCkgewotICAgICAgLy8gQWJzb2x1dGUg
cGF0aAotICAgICAgaWYgKHBhdGguY2hhckF0KDApID09PSAnLycpIHsKLSAgICAgICAgaWYgKGhv
c3QpIHsKLSAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTsKLSAgICAgICAgICB1cmwucHVz
aChob3N0KTsKLSAgICAgICAgfQotICAgICAgLy8gUmVsYXRpdmUgcGF0aAotICAgICAgfSBlbHNl
IGlmICghL15odHRwKHMpPzpcL1wvLy50ZXN0KHBhdGgpKSB7Ci0gICAgICAgIHVybC5wdXNoKHBh
cmVudFVSTCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChob3N0KSB7IHVybC5w
dXNoKGhvc3QpOyB9Ci0gICAgICBpZiAobmFtZXNwYWNlKSB7IHVybC5wdXNoKG5hbWVzcGFjZSk7
IH0KLSAgICB9Ci0KLSAgICBpZiAocGF0aCkgewotICAgICAgdXJsLnB1c2gocGF0aCk7Ci0gICAg
fQotCi0gICAgcmV0dXJuIHVybC5qb2luKCcvJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRGV0ZXJt
aW5lcyB0aGUgcGF0aG5hbWUgZm9yIGEgZ2l2ZW4gdHlwZS4KLQotICAgIEJ5IGRlZmF1bHQsIGl0
IHBsdXJhbGl6ZXMgdGhlIHR5cGUncyBuYW1lIChmb3IgZXhhbXBsZSwKLSAgICAncG9zdCcgYmVj
b21lcyAncG9zdHMnIGFuZCAncGVyc29uJyBiZWNvbWVzICdwZW9wbGUnKS4KLQotICAgICMjIyBQ
YXRobmFtZSBjdXN0b21pemF0aW9uCi0KLSAgICBGb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBv
YmplY3QgTGluZUl0ZW0gd2l0aCBhbgotICAgIGVuZHBvaW50IG9mICIvbGluZV9pdGVtcy8iLgot
Ci0gICAgYGBganMKLSAgICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgICAgcGF0aEZvclR5
cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICAgICAgdmFyIGRlY2FtZWxpemVkID0gRW1iZXIuU3Ry
aW5nLmRlY2FtZWxpemUodHlwZSk7Ci0gICAgICAgIHJldHVybiBFbWJlci5TdHJpbmcucGx1cmFs
aXplKGRlY2FtZWxpemVkKTsKLSAgICAgIH07Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0
aG9kIHBhdGhGb3JUeXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJucyB7
U3RyaW5nfSBwYXRoCi0gICoqLwotICBwYXRoRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAg
IHZhciBjYW1lbGl6ZWQgPSBFbWJlci5TdHJpbmcuY2FtZWxpemUodHlwZSk7Ci0gICAgcmV0dXJu
IEVtYmVyLlN0cmluZy5wbHVyYWxpemUoY2FtZWxpemVkKTsKLSAgfSwKLQotICAvKioKLSAgICBU
YWtlcyBhbiBhamF4IHJlc3BvbnNlLCBhbmQgcmV0dXJucyBhIHJlbGV2YW50IGVycm9yLgotCi0g
ICAgUmV0dXJuaW5nIGEgYERTLkludmFsaWRFcnJvcmAgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGNh
dXNlIHRoZQotICAgIHJlY29yZCB0byB0cmFuc2l0aW9uIGludG8gdGhlIGBpbnZhbGlkYCBzdGF0
ZSBhbmQgbWFrZSB0aGUKLSAgICBgZXJyb3JzYCBvYmplY3QgYXZhaWxhYmxlIG9uIHRoZSByZWNv
cmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERT
LlJFU1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAgICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7
Ci0gICAgICAgIHZhciBlcnJvciA9IHRoaXMuX3N1cGVyKGpxWEhSKTsKLQotICAgICAgICBpZiAo
anFYSFIgJiYganFYSFIuc3RhdHVzID09PSA0MjIpIHsKLSAgICAgICAgICB2YXIganNvbkVycm9y
cyA9IEVtYmVyLiQucGFyc2VKU09OKGpxWEhSLnJlc3BvbnNlVGV4dClbImVycm9ycyJdOwotCi0g
ICAgICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9ycyk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBOb3RlOiBBcyBhIGNvcnJlY3RuZXNzIG9wdGltaXphdGlv
biwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YKLSAgICB0aGUgYGFqYXhFcnJvcmAgbWV0
aG9kIHN0cmlwcyBvdXQgdGhlIGB0aGVuYCBtZXRob2QgZnJvbSBqcXVlcnkncwotICAgIGFqYXgg
cmVzcG9uc2UgKGpxWEhSKS4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUganFYSFIncwot
ICAgIGB0aGVuYCBtZXRob2QgZnVsZmlsbHMgdGhlIHByb21pc2Ugd2l0aCBpdHNlbGYgcmVzdWx0
aW5nIGluIGEKLSAgICBjaXJjdWxhciAidGhlbmFibGUiIGNoYWluIHdoaWNoIG1heSBjYXVzZSBw
cm9ibGVtcyBmb3Igc29tZQotICAgIHByb21pc2UgbGlicmFyaWVzLgotCi0gICAgQG1ldGhvZCBh
amF4RXJyb3IKLSAgICBAcGFyYW0gIHtPYmplY3R9IGpxWEhSCi0gICAgQHJldHVybiB7T2JqZWN0
fSBqcVhIUgotICAqLwotICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgaWYgKGpx
WEhSKSB7Ci0gICAgICBqcVhIUi50aGVuID0gbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4ganFY
SFI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGFrZXMgYSBVUkwsIGFuIEhUVFAgbWV0aG9kIGFuZCBh
IGhhc2ggb2YgZGF0YSwgYW5kIG1ha2VzIGFuCi0gICAgSFRUUCByZXF1ZXN0LgotCi0gICAgV2hl
biB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggYSBwYXlsb2FkLCBFbWJlciBEYXRhIHdpbGwgY2Fs
bCBpbnRvIGBleHRyYWN0U2luZ2xlYAotICAgIG9yIGBleHRyYWN0QXJyYXlgIChkZXBlbmRpbmcg
b24gd2hldGhlciB0aGUgb3JpZ2luYWwgcXVlcnkgd2FzIGZvciBvbmUgcmVjb3JkIG9yCi0gICAg
bWFueSByZWNvcmRzKS4KLQotICAgIEJ5IGRlZmF1bHQsIGBhamF4YCBtZXRob2QgaGFzIHRoZSBm
b2xsb3dpbmcgYmVoYXZpb3I6Ci0KLSAgICAqIEl0IHNldHMgdGhlIHJlc3BvbnNlIGBkYXRhVHlw
ZWAgdG8gYCJqc29uImAKLSAgICAqIElmIHRoZSBIVFRQIG1ldGhvZCBpcyBub3QgYCJHRVQiYCwg
aXQgc2V0cyB0aGUgYENvbnRlbnQtVHlwZWAgdG8gYmUKLSAgICAgIGBhcHBsaWNhdGlvbi9qc29u
OyBjaGFyc2V0PXV0Zi04YAotICAgICogSWYgdGhlIEhUVFAgbWV0aG9kIGlzIG5vdCBgIkdFVCJg
LCBpdCBzdHJpbmdpZmllcyB0aGUgZGF0YSBwYXNzZWQgaW4uIFRoZQotICAgICAgZGF0YSBpcyB0
aGUgc2VyaWFsaXplZCByZWNvcmQgaW4gdGhlIGNhc2Ugb2YgYSBzYXZlLgotICAgICogUmVnaXN0
ZXJzIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgaGFuZGxlcnMuCi0KLSAgICBAbWV0aG9kIGFqYXgKLSAg
ICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwKLSAgICBAcGFyYW0ge1N0cmluZ30g
dHlwZSBUaGUgcmVxdWVzdCB0eXBlIEdFVCwgUE9TVCwgUFVULCBERUxFVEUgZXRjLgotICAgIEBw
YXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwot
ICBhamF4OiBmdW5jdGlvbih1cmwsIHR5cGUsIGhhc2gpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRo
aXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZl
LCByZWplY3QpIHsKLSAgICAgIGhhc2ggPSBhZGFwdGVyLmFqYXhPcHRpb25zKHVybCwgdHlwZSwg
aGFzaCk7Ci0KLSAgICAgIGhhc2guc3VjY2VzcyA9IGZ1bmN0aW9uKGpzb24pIHsKLSAgICAgICAg
RW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGpzb24pOwotICAgICAgfTsKLQotICAgICAgaGFzaC5l
cnJvciA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewotICAgICAg
ICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBhZGFwdGVyLmFqYXhFcnJvcihqcVhIUikpOwotICAg
ICAgfTsKLQotICAgICAgRW1iZXIuJC5hamF4KGhhc2gpOwotICAgIH0sICJEUzogUmVzdEFkYXB0
ZXIjYWpheCAiICsgdHlwZSArICIgdG8gIiArIHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCBhamF4T3B0aW9ucwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHVybAot
ICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSByZXF1ZXN0IHR5cGUgR0VULCBQT1NULCBQVVQs
IERFTEVURSBldGMuCi0gICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgICBAcmV0dXJuIHtPYmpl
Y3R9IGhhc2gKLSAgKi8KLSAgYWpheE9wdGlvbnM6IGZ1bmN0aW9uKHVybCwgdHlwZSwgaGFzaCkg
ewotICAgIGhhc2ggPSBoYXNoIHx8IHt9OwotICAgIGhhc2gudXJsID0gdXJsOwotICAgIGhhc2gu
dHlwZSA9IHR5cGU7Ci0gICAgaGFzaC5kYXRhVHlwZSA9ICdqc29uJzsKLSAgICBoYXNoLmNvbnRl
eHQgPSB0aGlzOwotCi0gICAgaWYgKGhhc2guZGF0YSAmJiB0eXBlICE9PSAnR0VUJykgewotICAg
ICAgaGFzaC5jb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JzsK
LSAgICAgIGhhc2guZGF0YSA9IEpTT04uc3RyaW5naWZ5KGhhc2guZGF0YSk7Ci0gICAgfQotCi0g
ICAgaWYgKHRoaXMuaGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICB2YXIgaGVhZGVycyA9
IHRoaXMuaGVhZGVyczsKLSAgICAgIGhhc2guYmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4aHIpIHsK
LSAgICAgICAgZm9yRWFjaC5jYWxsKEVtYmVyLmtleXMoaGVhZGVycyksIGZ1bmN0aW9uKGtleSkg
ewotICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTsKLSAg
ICAgICAgfSk7Ci0gICAgICB9OwotICAgIH0KLQotCi0gICAgcmV0dXJuIGhhc2g7Ci0gIH0KLQot
fSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1k
YXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRFMuTW9kZWwucmVvcGVuKHsK
LQotICAvKioKLSAgICBQcm92aWRlcyBpbmZvIGFib3V0IHRoZSBtb2RlbCBmb3IgZGVidWdnaW5n
IHB1cnBvc2VzCi0gICAgYnkgZ3JvdXBpbmcgdGhlIHByb3BlcnRpZXMgaW50byBtb3JlIHNlbWFu
dGljIGdyb3Vwcy4KLQotICAgIE1lYW50IHRvIGJlIHVzZWQgYnkgZGVidWdnaW5nIHRvb2xzIHN1
Y2ggYXMgdGhlIENocm9tZSBFbWJlciBFeHRlbnNpb24uCi0KLSAgICAtIEdyb3VwcyBhbGwgYXR0
cmlidXRlcyBpbiAiQXR0cmlidXRlcyIgZ3JvdXAuCi0gICAgLSBHcm91cHMgYWxsIGJlbG9uZ3NU
byByZWxhdGlvbnNoaXBzIGluICJCZWxvbmdzIFRvIiBncm91cC4KLSAgICAtIEdyb3VwcyBhbGwg
aGFzTWFueSByZWxhdGlvbnNoaXBzIGluICJIYXMgTWFueSIgZ3JvdXAuCi0gICAgLSBHcm91cHMg
YWxsIGZsYWdzIGluICJGbGFncyIgZ3JvdXAuCi0gICAgLSBGbGFncyByZWxhdGlvbnNoaXAgQ1Bz
IGFzIGV4cGVuc2l2ZSBwcm9wZXJ0aWVzLgotCi0gICAgQG1ldGhvZCBfZGVidWdJbmZvCi0gICAg
QGZvciBEUy5Nb2RlbAotICAgIEBwcml2YXRlCi0gICovCi0gIF9kZWJ1Z0luZm86IGZ1bmN0aW9u
KCkgewotICAgIHZhciBhdHRyaWJ1dGVzID0gWydpZCddLAotICAgICAgICByZWxhdGlvbnNoaXBz
ID0geyBiZWxvbmdzVG86IFtdLCBoYXNNYW55OiBbXSB9LAotICAgICAgICBleHBlbnNpdmVQcm9w
ZXJ0aWVzID0gW107Ci0KLSAgICB0aGlzLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0
YSkgewotICAgICAgYXR0cmlidXRlcy5wdXNoKG5hbWUpOwotICAgIH0sIHRoaXMpOwotCi0gICAg
dGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAg
ICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXAua2luZF0ucHVzaChuYW1lKTsKLSAgICAgIGV4
cGVuc2l2ZVByb3BlcnRpZXMucHVzaChuYW1lKTsKLSAgICB9KTsKLQotICAgIHZhciBncm91cHMg
PSBbCi0gICAgICB7Ci0gICAgICAgIG5hbWU6ICdBdHRyaWJ1dGVzJywKLSAgICAgICAgcHJvcGVy
dGllczogYXR0cmlidXRlcywKLSAgICAgICAgZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAg
ewotICAgICAgICBuYW1lOiAnQmVsb25ncyBUbycsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0
aW9uc2hpcHMuYmVsb25nc1RvLAotICAgICAgICBleHBhbmQ6IHRydWUKLSAgICAgIH0sCi0gICAg
ICB7Ci0gICAgICAgIG5hbWU6ICdIYXMgTWFueScsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0
aW9uc2hpcHMuaGFzTWFueSwKLSAgICAgICAgZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAg
ewotICAgICAgICBuYW1lOiAnRmxhZ3MnLAotICAgICAgICBwcm9wZXJ0aWVzOiBbJ2lzTG9hZGVk
JywgJ2lzRGlydHknLCAnaXNTYXZpbmcnLCAnaXNEZWxldGVkJywgJ2lzRXJyb3InLCAnaXNOZXcn
LCAnaXNWYWxpZCddCi0gICAgICB9Ci0gICAgXTsKLQotICAgIHJldHVybiB7Ci0gICAgICBwcm9w
ZXJ0eUluZm86IHsKLSAgICAgICAgLy8gaW5jbHVkZSBhbGwgb3RoZXIgbWl4aW5zIC8gcHJvcGVy
dGllcyAobm90IGp1c3QgdGhlIGdyb3VwZWQgb25lcykKLSAgICAgICAgaW5jbHVkZU90aGVyUHJv
cGVydGllczogdHJ1ZSwKLSAgICAgICAgZ3JvdXBzOiBncm91cHMsCi0gICAgICAgIC8vIGRvbid0
IHByZS1jYWxjdWxhdGUgdW5sZXNzIGNhY2hlZAotICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVz
OiBleHBlbnNpdmVQcm9wZXJ0aWVzCi0gICAgICB9Ci0gICAgfTsKLSAgfQotCi19KTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0K
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgRW1iZXIgRGF0YQotCi0gIEBtb2R1
bGUgZW1iZXItZGF0YQotICBAbWFpbiBlbWJlci1kYXRhCi0qLwotCi19KSgpOwotCi0oZnVuY3Rp
b24oKSB7Ci1FbWJlci5TdHJpbmcucGx1cmFsaXplID0gZnVuY3Rpb24od29yZCkgewotICByZXR1
cm4gRW1iZXIuSW5mbGVjdG9yLmluZmxlY3Rvci5wbHVyYWxpemUod29yZCk7Ci19OwotCi1FbWJl
ci5TdHJpbmcuc2luZ3VsYXJpemUgPSBmdW5jdGlvbih3b3JkKSB7Ci0gIHJldHVybiBFbWJlci5J
bmZsZWN0b3IuaW5mbGVjdG9yLnNpbmd1bGFyaXplKHdvcmQpOwotfTsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLXZhciBCTEFOS19SRUdFWCA9IC9eXHMqJC87Ci0KLWZ1bmN0aW9uIGxv
YWRVbmNvdW50YWJsZShydWxlcywgdW5jb3VudGFibGUpIHsKLSAgZm9yICh2YXIgaSA9IDAsIGxl
bmd0aCA9IHVuY291bnRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgcnVsZXMu
dW5jb3VudGFibGVbdW5jb3VudGFibGVbaV0udG9Mb3dlckNhc2UoKV0gPSB0cnVlOwotICB9Ci19
Ci0KLWZ1bmN0aW9uIGxvYWRJcnJlZ3VsYXIocnVsZXMsIGlycmVndWxhclBhaXJzKSB7Ci0gIHZh
ciBwYWlyOwotCi0gIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBpcnJlZ3VsYXJQYWlycy5sZW5n
dGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAgIHBhaXIgPSBpcnJlZ3VsYXJQYWlyc1tpXTsKLQot
ICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFpclsxXTsKLSAg
ICBydWxlcy5pcnJlZ3VsYXJJbnZlcnNlW3BhaXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBd
OwotICB9Ci19Ci0KLS8qKgotICBJbmZsZWN0b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20g
Zm9yIHN1cHBseWluZyBpbmZsZWN0aW9uIHJ1bGVzIGZvciB5b3VyCi0gIGFwcGxpY2F0aW9uLiBF
bWJlciBpbmNsdWRlcyBhIGRlZmF1bHQgc2V0IG9mIGluZmxlY3Rpb24gcnVsZXMsIGFuZCBwcm92
aWRlcyBhbgotICBBUEkgZm9yIHByb3ZpZGluZyBhZGRpdGlvbmFsIHJ1bGVzLgotCi0gIEV4YW1w
bGVzOgotCi0gIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIG5vIHJ1bGVzLgotCi0gIGBgYGpz
Ci0gIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5mbGVjdG9yKCk7Ci0gIGBgYAotCi0gIENy
ZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIHRoZSBkZWZhdWx0IGVtYmVyIHJ1bGVzZXQuCi0KLSAg
YGBganMKLSAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVj
dG9yLmRlZmF1bHRSdWxlcyk7Ci0KLSAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnY293JykgLy89PiAn
a2luZScKLSAgaW5mbGVjdG9yLnNpbmd1bGFyaXplKCdraW5lJykgLy89PiAnY293JwotICBgYGAK
LQotICBDcmVhdGluZyBhbiBpbmZsZWN0b3IgYW5kIGFkZGluZyBydWxlcyBsYXRlci4KLQotICBg
YGBqYXZhc2NyaXB0Ci0gIHZhciBpbmZsZWN0b3IgPSBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9y
OwotCi0gIGluZmxlY3Rvci5wbHVyYWxpemUoJ2FkdmljZScpIC8vID0+ICdhZHZpY2VzJwotICBp
bmZsZWN0b3IudW5jb3VudGFibGUoJ2FkdmljZScpOwotICBpbmZsZWN0b3IucGx1cmFsaXplKCdh
ZHZpY2UnKSAvLyA9PiAnYWR2aWNlJwotCi0gIGluZmxlY3Rvci5wbHVyYWxpemUoJ2Zvcm11bGEn
KSAvLyA9PiAnZm9ybXVsYXMnCi0gIGluZmxlY3Rvci5pcnJlZ3VsYXIoJ2Zvcm11bGEnLCAnZm9y
bXVsYWUnKTsKLSAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnZm9ybXVsYScpIC8vID0+ICdmb3JtdWxh
ZScKLQotICAvLyB5b3Ugd291bGQgbm90IG5lZWQgdG8gYWRkIHRoZXNlIGFzIHRoZXkgYXJlIHRo
ZSBkZWZhdWx0IHJ1bGVzCi0gIGluZmxlY3Rvci5wbHVyYWwoLyQvLCAncycpOwotICBpbmZsZWN0
b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKLSAgYGBgCi0KLSAgQ3JlYXRpbmcgYW4gaW5mbGVjdG9y
IHdpdGggYSBub25kZWZhdWx0IHJ1bGVzZXQuCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcnVs
ZXMgPSB7Ci0gICAgcGx1cmFsczogIFsgLyQvLCAncycgXSwKLSAgICBzaW5ndWxhcjogWyAvXHMk
LywgJycgXSwKLSAgICBpcnJlZ3VsYXJQYWlyczogWwotICAgICAgWyAnY293JywgJ2tpbmUnIF0K
LSAgICBdLAotICAgIHVuY291bnRhYmxlOiBbICdmaXNoJyBdCi0gIH07Ci0KLSAgdmFyIGluZmxl
Y3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IocnVsZXMpOwotICBgYGAKLQotICBAY2xhc3MgSW5m
bGVjdG9yCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi1mdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNl
dCkgewotICBydWxlU2V0ID0gcnVsZVNldCB8fCB7fTsKLSAgcnVsZVNldC51bmNvdW50YWJsZSA9
IHJ1bGVTZXQudW5jb3VudGFibGUgfHwge307Ci0gIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgPSBy
dWxlU2V0LmlycmVndWxhclBhaXJzIHx8IHt9OwotCi0gIHZhciBydWxlcyA9IHRoaXMucnVsZXMg
PSB7Ci0gICAgcGx1cmFsczogIHJ1bGVTZXQucGx1cmFscyB8fCBbXSwKLSAgICBzaW5ndWxhcjog
cnVsZVNldC5zaW5ndWxhciB8fCBbXSwKLSAgICBpcnJlZ3VsYXI6IHt9LAotICAgIGlycmVndWxh
ckludmVyc2U6IHt9LAotICAgIHVuY291bnRhYmxlOiB7fQotICB9OwotCi0gIGxvYWRVbmNvdW50
YWJsZShydWxlcywgcnVsZVNldC51bmNvdW50YWJsZSk7Ci0gIGxvYWRJcnJlZ3VsYXIocnVsZXMs
IHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMpOwotfQotCi1JbmZsZWN0b3IucHJvdG90eXBlID0gewot
ICAvKioKLSAgICBAbWV0aG9kIHBsdXJhbAotICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAotICAg
IEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcKLSAgKi8KLSAgcGx1cmFsOiBmdW5jdGlvbihyZWdleCwg
c3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5wbHVyYWxzLnB1c2goW3JlZ2V4LCBzdHJpbmcudG9M
b3dlckNhc2UoKV0pOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2Qgc2luZ3VsYXIKLSAgICBA
cGFyYW0ge1JlZ0V4cH0gcmVnZXgKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyaW5nCi0gICovCi0g
IHNpbmd1bGFyOiBmdW5jdGlvbihyZWdleCwgc3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5zaW5n
dWxhci5wdXNoKFtyZWdleCwgc3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKLSAgfSwKLQotICAvKioK
LSAgICBAbWV0aG9kIHVuY291bnRhYmxlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHJlZ2V4Ci0gICov
Ci0gIHVuY291bnRhYmxlOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICBsb2FkVW5jb3VudGFibGUo
dGhpcy5ydWxlcywgW3N0cmluZy50b0xvd2VyQ2FzZSgpXSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QG1ldGhvZCBpcnJlZ3VsYXIKLSAgICBAcGFyYW0ge1N0cmluZ30gc2luZ3VsYXIKLSAgICBAcGFy
YW0ge1N0cmluZ30gcGx1cmFsCi0gICovCi0gIGlycmVndWxhcjogZnVuY3Rpb24gKHNpbmd1bGFy
LCBwbHVyYWwpIHsKLSAgICBsb2FkSXJyZWd1bGFyKHRoaXMucnVsZXMsIFtbc2luZ3VsYXIsIHBs
dXJhbF1dKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHBsdXJhbGl6ZQotICAgIEBwYXJh
bSB7U3RyaW5nfSB3b3JkCi0gICovCi0gIHBsdXJhbGl6ZTogZnVuY3Rpb24od29yZCkgewotICAg
IHJldHVybiB0aGlzLmluZmxlY3Qod29yZCwgdGhpcy5ydWxlcy5wbHVyYWxzLCB0aGlzLnJ1bGVz
LmlycmVndWxhcik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBzaW5ndWxhcml6ZQotICAg
IEBwYXJhbSB7U3RyaW5nfSB3b3JkCi0gICovCi0gIHNpbmd1bGFyaXplOiBmdW5jdGlvbih3b3Jk
KSB7Ci0gICAgcmV0dXJuIHRoaXMuaW5mbGVjdCh3b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCAg
dGhpcy5ydWxlcy5pcnJlZ3VsYXJJbnZlcnNlKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJvdGVj
dGVkCi0KLSAgICBAbWV0aG9kIGluZmxlY3QKLSAgICBAcGFyYW0ge1N0cmluZ30gd29yZAotICAg
IEBwYXJhbSB7T2JqZWN0fSB0eXBlUnVsZXMKLSAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFy
Ci0gICovCi0gIGluZmxlY3Q6IGZ1bmN0aW9uKHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7
Ci0gICAgdmFyIGluZmxlY3Rpb24sIHN1YnN0aXR1dGlvbiwgcmVzdWx0LCBsb3dlcmNhc2UsIGlz
QmxhbmssCi0gICAgaXNVbmNvdW50YWJsZSwgaXNJcnJlZ3VsYXIsIGlzSXJyZWd1bGFySW52ZXJz
ZSwgcnVsZTsKLQotICAgIGlzQmxhbmsgPSBCTEFOS19SRUdFWC50ZXN0KHdvcmQpOwotCi0gICAg
aWYgKGlzQmxhbmspIHsKLSAgICAgIHJldHVybiB3b3JkOwotICAgIH0KLQotICAgIGxvd2VyY2Fz
ZSA9IHdvcmQudG9Mb3dlckNhc2UoKTsKLQotICAgIGlzVW5jb3VudGFibGUgPSB0aGlzLnJ1bGVz
LnVuY291bnRhYmxlW2xvd2VyY2FzZV07Ci0KLSAgICBpZiAoaXNVbmNvdW50YWJsZSkgewotICAg
ICAgcmV0dXJuIHdvcmQ7Ci0gICAgfQotCi0gICAgaXNJcnJlZ3VsYXIgPSBpcnJlZ3VsYXIgJiYg
aXJyZWd1bGFyW2xvd2VyY2FzZV07Ci0KLSAgICBpZiAoaXNJcnJlZ3VsYXIpIHsKLSAgICAgIHJl
dHVybiBpc0lycmVndWxhcjsKLSAgICB9Ci0KLSAgICBmb3IgKHZhciBpID0gdHlwZVJ1bGVzLmxl
bmd0aCwgbWluID0gMDsgaSA+IG1pbjsgaS0tKSB7Ci0gICAgICAgaW5mbGVjdGlvbiA9IHR5cGVS
dWxlc1tpLTFdOwotICAgICAgIHJ1bGUgPSBpbmZsZWN0aW9uWzBdOwotCi0gICAgICBpZiAocnVs
ZS50ZXN0KHdvcmQpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlu
ZmxlY3Rpb24gPSBpbmZsZWN0aW9uIHx8IFtdOwotCi0gICAgcnVsZSA9IGluZmxlY3Rpb25bMF07
Ci0gICAgc3Vic3RpdHV0aW9uID0gaW5mbGVjdGlvblsxXTsKLQotICAgIHJlc3VsdCA9IHdvcmQu
cmVwbGFjZShydWxlLCBzdWJzdGl0dXRpb24pOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQot
fTsKLQotRW1iZXIuSW5mbGVjdG9yID0gSW5mbGVjdG9yOwotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyA9IHsKLSAgcGx1cmFsczogWwot
ICAgIFsvJC8sICdzJ10sCi0gICAgWy9zJC9pLCAncyddLAotICAgIFsvXihheHx0ZXN0KWlzJC9p
LCAnJDFlcyddLAotICAgIFsvKG9jdG9wfHZpcil1cyQvaSwgJyQxaSddLAotICAgIFsvKG9jdG9w
fHZpcilpJC9pLCAnJDFpJ10sCi0gICAgWy8oYWxpYXN8c3RhdHVzKSQvaSwgJyQxZXMnXSwKLSAg
ICBbLyhidSlzJC9pLCAnJDFzZXMnXSwKLSAgICBbLyhidWZmYWx8dG9tYXQpbyQvaSwgJyQxb2Vz
J10sCi0gICAgWy8oW3RpXSl1bSQvaSwgJyQxYSddLAotICAgIFsvKFt0aV0pYSQvaSwgJyQxYSdd
LAotICAgIFsvc2lzJC9pLCAnc2VzJ10sCi0gICAgWy8oPzooW15mXSlmZXwoW2xyXSlmKSQvaSwg
JyQxJDJ2ZXMnXSwKLSAgICBbLyhoaXZlKSQvaSwgJyQxcyddLAotICAgIFsvKFteYWVpb3V5XXxx
dSl5JC9pLCAnJDFpZXMnXSwKLSAgICBbLyh4fGNofHNzfHNoKSQvaSwgJyQxZXMnXSwKLSAgICBb
LyhtYXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQvaSwgJyQxaWNlcyddLAotICAgIFsvXihtfGwpb3Vz
ZSQvaSwgJyQxaWNlJ10sCi0gICAgWy9eKG18bClpY2UkL2ksICckMWljZSddLAotICAgIFsvXihv
eCkkL2ksICckMWVuJ10sCi0gICAgWy9eKG94ZW4pJC9pLCAnJDEnXSwKLSAgICBbLyhxdWl6KSQv
aSwgJyQxemVzJ10KLSAgXSwKLQotICBzaW5ndWxhcjogWwotICAgIFsvcyQvaSwgJyddLAotICAg
IFsvKHNzKSQvaSwgJyQxJ10sCi0gICAgWy8obilld3MkL2ksICckMWV3cyddLAotICAgIFsvKFt0
aV0pYSQvaSwgJyQxdW0nXSwKLSAgICBbLygoYSluYWx5fChiKWF8KGQpaWFnbm98KHApYXJlbnRo
ZXwocClyb2dub3wocyl5bm9wfCh0KWhlKShzaXN8c2VzKSQvaSwgJyQxc2lzJ10sCi0gICAgWy8o
XmFuYWx5KShzaXN8c2VzKSQvaSwgJyQxc2lzJ10sCi0gICAgWy8oW15mXSl2ZXMkL2ksICckMWZl
J10sCi0gICAgWy8oaGl2ZSlzJC9pLCAnJDEnXSwKLSAgICBbLyh0aXZlKXMkL2ksICckMSddLAot
ICAgIFsvKFtscl0pdmVzJC9pLCAnJDFmJ10sCi0gICAgWy8oW15hZWlvdXldfHF1KWllcyQvaSwg
JyQxeSddLAotICAgIFsvKHMpZXJpZXMkL2ksICckMWVyaWVzJ10sCi0gICAgWy8obSlvdmllcyQv
aSwgJyQxb3ZpZSddLAotICAgIFsvKHh8Y2h8c3N8c2gpZXMkL2ksICckMSddLAotICAgIFsvXiht
fGwpaWNlJC9pLCAnJDFvdXNlJ10sCi0gICAgWy8oYnVzKShlcyk/JC9pLCAnJDEnXSwKLSAgICBb
LyhvKWVzJC9pLCAnJDEnXSwKLSAgICBbLyhzaG9lKXMkL2ksICckMSddLAotICAgIFsvKGNyaXN8
dGVzdCkoaXN8ZXMpJC9pLCAnJDFpcyddLAotICAgIFsvXihhKXhbaWVdcyQvaSwgJyQxeGlzJ10s
Ci0gICAgWy8ob2N0b3B8dmlyKSh1c3xpKSQvaSwgJyQxdXMnXSwKLSAgICBbLyhhbGlhc3xzdGF0
dXMpKGVzKT8kL2ksICckMSddLAotICAgIFsvXihveCllbi9pLCAnJDEnXSwKLSAgICBbLyh2ZXJ0
fGluZClpY2VzJC9pLCAnJDFleCddLAotICAgIFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwKLSAg
ICBbLyhxdWl6KXplcyQvaSwgJyQxJ10sCi0gICAgWy8oZGF0YWJhc2UpcyQvaSwgJyQxJ10KLSAg
XSwKLQotICBpcnJlZ3VsYXJQYWlyczogWwotICAgIFsncGVyc29uJywgJ3Blb3BsZSddLAotICAg
IFsnbWFuJywgJ21lbiddLAotICAgIFsnY2hpbGQnLCAnY2hpbGRyZW4nXSwKLSAgICBbJ3NleCcs
ICdzZXhlcyddLAotICAgIFsnbW92ZScsICdtb3ZlcyddLAotICAgIFsnY293JywgJ2tpbmUnXSwK
LSAgICBbJ3pvbWJpZScsICd6b21iaWVzJ10KLSAgXSwKLQotICB1bmNvdW50YWJsZTogWwotICAg
ICdlcXVpcG1lbnQnLAotICAgICdpbmZvcm1hdGlvbicsCi0gICAgJ3JpY2UnLAotICAgICdtb25l
eScsCi0gICAgJ3NwZWNpZXMnLAotICAgICdzZXJpZXMnLAotICAgICdmaXNoJywKLSAgICAnc2hl
ZXAnLAotICAgICdqZWFucycsCi0gICAgJ3BvbGljZScKLSAgXQotfTsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBF
bWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpIHsKLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3Nz
TGluayAiRW1iZXIuU3RyaW5nL3BsdXJhbGl6ZSJ9fXt7L2Nyb3NzTGlua319Ci0KLSAgICBAbWV0
aG9kIHBsdXJhbGl6ZQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUu
cGx1cmFsaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxp
emUodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3Ry
aW5nL3Npbmd1bGFyaXplIn19e3svY3Jvc3NMaW5rfX0KLQotICAgIEBtZXRob2Qgc2luZ3VsYXJp
emUKLSAgICBAZm9yIFN0cmluZwotICAqLwotICBTdHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXpl
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZSh0aGlz
KTsKLSAgfTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLUVtYmVyLkluZmxlY3Rv
ci5pbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5mbGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0
UnVsZXMpOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LAotICAgIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKLSAgICBj
YW1lbGl6ZSA9ICAgRW1iZXIuU3RyaW5nLmNhbWVsaXplLAotICAgIGNhcGl0YWxpemUgPSBFbWJl
ci5TdHJpbmcuY2FwaXRhbGl6ZSwKLSAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2Ft
ZWxpemUsCi0gICAgc2luZ3VsYXJpemUgPSBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUsCi0gICAg
dW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlOwotCi1EUy5BY3RpdmVNb2RlbFNl
cmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAvLyBTRVJJQUxJWkUKLQot
ICAvKioKLSAgICBDb252ZXJ0cyBjYW1lbGNhc2VkIGF0dHJpYnV0ZXMgdG8gdW5kZXJzY29yZWQg
d2hlbiBzZXJpYWxpemluZy4KLQotICAgIEBtZXRob2Qga2V5Rm9yQXR0cmlidXRlCi0gICAgQHBh
cmFtIHtTdHJpbmd9IGF0dHJpYnV0ZQotICAgIEByZXR1cm5zIFN0cmluZwotICAqLwotICBrZXlG
b3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIpIHsKLSAgICByZXR1cm4gZGVjYW1lbGl6ZShhdHRy
KTsKLSAgfSwKLQotICAvKioKLSAgICBVbmRlcnNjb3JlcyByZWxhdGlvbnNoaXAgbmFtZXMgYW5k
IGFwcGVuZHMgIl9pZCIgb3IgIl9pZHMiIHdoZW4gc2VyaWFsaXppbmcKLSAgICByZWxhdGlvbnNo
aXAga2V5cy4KLQotICAgIEBtZXRob2Qga2V5Rm9yUmVsYXRpb25zaGlwCi0gICAgQHBhcmFtIHtT
dHJpbmd9IGtleQotICAgIEBwYXJhbSB7U3RyaW5nfSBraW5kCi0gICAgQHJldHVybnMgU3RyaW5n
Ci0gICovCi0gIGtleUZvclJlbGF0aW9uc2hpcDogZnVuY3Rpb24oa2V5LCBraW5kKSB7Ci0gICAg
a2V5ID0gZGVjYW1lbGl6ZShrZXkpOwotICAgIGlmIChraW5kID09PSAiYmVsb25nc1RvIikgewot
ICAgICAgcmV0dXJuIGtleSArICJfaWQiOwotICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImhhc01h
bnkiKSB7Ci0gICAgICByZXR1cm4gc2luZ3VsYXJpemUoa2V5KSArICJfaWRzIjsKLSAgICB9IGVs
c2UgewotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgRG9lcyBu
b3Qgc2VyaWFsaXplIGhhc01hbnkgcmVsYXRpb25zaGlwcyBieSBkZWZhdWx0LgotICAqLwotICBz
ZXJpYWxpemVIYXNNYW55OiBFbWJlci5LLAotCi0gIC8qKgotICAgIFVuZGVyc2NvcmVzIHRoZSBK
U09OIHJvb3Qga2V5cyB3aGVuIHNlcmlhbGl6aW5nLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVJ
bnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJh
bSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0gIHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlvbihk
YXRhLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMpIHsKLSAgICB2YXIgcm9vdCA9IHVuZGVyc2NvcmUo
ZGVjYW1lbGl6ZSh0eXBlLnR5cGVLZXkpKTsKLSAgICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxp
emUocmVjb3JkLCBvcHRpb25zKTsKLSAgfSwKLQotICAvKioKLSAgICBTZXJpYWxpemVzIGEgcG9s
eW1vcnBoaWMgdHlwZSBhcyBhIGZ1bGx5IGNhcGl0YWxpemVkIG1vZGVsIG5hbWUuCi0KLSAgICBA
bWV0aG9kIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJl
Y29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBqc29uCi0gICAgQHBhcmFtIHJlbGF0aW9uc2hpcAot
ICAqLwotICBzZXJpYWxpemVQb2x5bW9ycGhpY1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwg
cmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXksCi0gICAgICAg
IGJlbG9uZ3NUbyA9IGdldChyZWNvcmQsIGtleSk7Ci0gICAga2V5ID0gdGhpcy5rZXlGb3JBdHRy
aWJ1dGUoa2V5KTsKLSAgICBqc29uW2tleSArICJfdHlwZSJdID0gY2FwaXRhbGl6ZShjYW1lbGl6
ZShiZWxvbmdzVG8uY29uc3RydWN0b3IudHlwZUtleSkpOwotICB9LAotCi0gIC8vIEVYVFJBQ1QK
LQotICAvKioKLSAgICBFeHRyYWN0cyB0aGUgbW9kZWwgdHlwZUtleSBmcm9tIHVuZGVyc2NvcmVk
IHJvb3Qgb2JqZWN0cy4KLQotICAgIEBtZXRob2QgdHlwZUZvclJvb3QKLSAgICBAcGFyYW0ge1N0
cmluZ30gcm9vdAotICAgIEByZXR1cm5zIFN0cmluZyB0aGUgbW9kZWwncyB0eXBlS2V5Ci0gICov
Ci0gIHR5cGVGb3JSb290OiBmdW5jdGlvbihyb290KSB7Ci0gICAgdmFyIGNhbWVsaXplZCA9IGNh
bWVsaXplKHJvb3QpOwotICAgIHJldHVybiBzaW5ndWxhcml6ZShjYW1lbGl6ZWQpOwotICB9LAot
Ci0gIC8qKgotICAgIEFkZCBleHRyYSBzdGVwIHRvIGBEUy5SRVNUU2VyaWFsaXplci5ub3JtYWxp
emVgIHNvIGxpbmtzIGFyZQotICAgIG5vcm1hbGl6ZWQuCi0KLSAgICBJZiB5b3VyIHBheWxvYWQg
bG9va3MgbGlrZSB0aGlzCi0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJwb3N0IjogewotICAg
ICAgICAiaWQiOiAxLAotICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAg
ICAgICJsaW5rcyI6IHsgImZsYWdnZWRfY29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQi
IH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBgCi0gICAgVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiB3
b3VsZCBsb29rIGxpa2UgdGhpcwotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAicG9zdCI6IHsK
LSAgICAgICAgImlkIjogMSwKLSAgICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAot
ICAgICAgICAibGlua3MiOiB7ICJmbGFnZ2VkQ29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdn
ZWQiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gaGFzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wCi0gICAgQHJldHVybnMgT2JqZWN0Ci0g
ICovCi0KLSAgbm9ybWFsaXplOiBmdW5jdGlvbih0eXBlLCBoYXNoLCBwcm9wKSB7Ci0gICAgdGhp
cy5ub3JtYWxpemVMaW5rcyhoYXNoKTsKLQotICAgIHJldHVybiB0aGlzLl9zdXBlcih0eXBlLCBo
YXNoLCBwcm9wKTsKLSAgfSwKLQotICAvKioKLSAgICBDb252ZXJ0IGBzbmFrZV9jYXNlZGAgbGlu
a3MgIHRvIGBjYW1lbENhc2VgCi0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZUxpbmtzCi0gICAgQHBh
cmFtIHtPYmplY3R9IGhhc2gKLSAgKi8KLQotICBub3JtYWxpemVMaW5rczogZnVuY3Rpb24oZGF0
YSl7Ci0gICAgaWYgKGRhdGEubGlua3MpIHsKLSAgICAgIHZhciBsaW5rcyA9IGRhdGEubGlua3M7
Ci0KLSAgICAgIGZvciAodmFyIGxpbmsgaW4gbGlua3MpIHsKLSAgICAgICAgdmFyIGNhbWVsaXpl
ZExpbmsgPSBjYW1lbGl6ZShsaW5rKTsKLQotICAgICAgICBpZiAoY2FtZWxpemVkTGluayAhPT0g
bGluaykgewotICAgICAgICAgIGxpbmtzW2NhbWVsaXplZExpbmtdID0gbGlua3NbbGlua107Ci0g
ICAgICAgICAgZGVsZXRlIGxpbmtzW2xpbmtdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQot
ICB9LAotCi0gIC8qKgotICAgIE5vcm1hbGl6ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSBmcm9tIHRo
ZSBKU09OLgotCi0gICAgTm9ybWFsaXplOgotICAgIGBgYGpzCi0gICAgICB7Ci0gICAgICAgIGlk
OiAiMSIKLSAgICAgICAgbWluaW9uOiB7IHR5cGU6ICJldmlsX21pbmlvbiIsIGlkOiAiMTIifQot
ICAgICAgfQotICAgIGBgYAotCi0gICAgVG86Ci0gICAgYGBganMKLSAgICAgIHsKLSAgICAgICAg
aWQ6ICIxIgotICAgICAgICBtaW5pb246IHsgdHlwZTogImV2aWxNaW5pb24iLCBpZDogIjEyIn0K
LSAgICAgIH0KLSAgICBgYGAKLQotICAgIEBtZXRob2Qgbm9ybWFsaXplUmVsYXRpb25zaGlwcwot
ICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcHM6IGZ1bmN0aW9uKHR5
cGUsIGhhc2gpIHsKLSAgICB2YXIgcGF5bG9hZEtleSwgcGF5bG9hZDsKLQotICAgIGlmICh0aGlz
LmtleUZvclJlbGF0aW9uc2hpcCkgewotICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0
aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIGlmIChyZWxhdGlvbnNoaXAub3B0aW9u
cy5wb2x5bW9ycGhpYykgewotICAgICAgICAgIHBheWxvYWRLZXkgPSB0aGlzLmtleUZvckF0dHJp
YnV0ZShrZXkpOwotICAgICAgICAgIHBheWxvYWQgPSBoYXNoW3BheWxvYWRLZXldOwotICAgICAg
ICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWQudHlwZSkgewotICAgICAgICAgICAgcGF5bG9hZC50
eXBlID0gdGhpcy50eXBlRm9yUm9vdChwYXlsb2FkLnR5cGUpOwotICAgICAgICAgIH0gZWxzZSBp
ZiAocGF5bG9hZCAmJiByZWxhdGlvbnNoaXAua2luZCA9PT0gImhhc01hbnkiKSB7Ci0gICAgICAg
ICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgICAgICAgICBmb3JFYWNoKHBheWxvYWQsIGZ1bmN0
aW9uKHNpbmdsZSkgewotICAgICAgICAgICAgICBzaW5nbGUudHlwZSA9IHNlbGYudHlwZUZvclJv
b3Qoc2luZ2xlLnR5cGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIHBheWxvYWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChr
ZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKLSAgICAgICAgICBwYXlsb2FkID0gaGFzaFtwYXlsb2Fk
S2V5XTsKLSAgICAgICAgfQotCi0gICAgICAgIGhhc2hba2V5XSA9IHBheWxvYWQ7Ci0KLSAgICAg
ICAgaWYgKGtleSAhPT0gcGF5bG9hZEtleSkgewotICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxv
YWRLZXldOwotICAgICAgICB9Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0KLX0pOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdldDsKLXZhciBmb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci0KLS8qKgotICBUaGUgRW1iZWRk
ZWRSZWNvcmRzTWl4aW4gYWxsb3dzIHlvdSB0byBhZGQgZW1iZWRkZWQgcmVjb3JkIHN1cHBvcnQg
dG8geW91cgotICBzZXJpYWxpemVycy4KLSAgVG8gc2V0IHVwIGVtYmVkZGVkIHJlY29yZHMsIHlv
dSBpbmNsdWRlIHRoZSBtaXhpbiBpbnRvIHRoZSBzZXJpYWxpemVyIGFuZCB0aGVuCi0gIGRlZmlu
ZSB5b3VyIGVtYmVkZGVkIHJlbGF0aW9ucy4KLQotICBgYGBqcwotICBBcHAuUG9zdFNlcmlhbGl6
ZXIgPSBEUy5BY3RpdmVNb2RlbFNlcmlhbGl6ZXIuZXh0ZW5kKERTLkVtYmVkZGVkUmVjb3Jkc01p
eGluLCB7Ci0gICAgYXR0cnM6IHsKLSAgICAgIGNvbW1lbnRzOiB7ZW1iZWRkZWQ6ICdhbHdheXMn
fQotICAgIH0KLSAgfSkKLSAgYGBgCi0KLSAgQ3VycmVudGx5IG9ubHkgYHtlbWJlZGRlZDogJ2Fs
d2F5cyd9YCByZWNvcmRzIGFyZSBzdXBwb3J0ZWQuCi0KLSAgQGNsYXNzIEVtYmVkZGVkUmVjb3Jk
c01peGluCi0gIEBuYW1lc3BhY2UgRFMKLSovCi1EUy5FbWJlZGRlZFJlY29yZHNNaXhpbiA9IEVt
YmVyLk1peGluLmNyZWF0ZSh7Ci0KLSAgLyoqCi0gICAgU2VyaWFsaXplIGhhcy1tYXkgcmVsYXRp
b25zaGlwIHdoZW4gaXQgaXMgY29uZmlndXJlZCBhcyBlbWJlZGRlZCBvYmplY3RzLgotCi0gICAg
QG1ldGhvZCBzZXJpYWxpemVIYXNNYW55Ci0gICovCi0gIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0
aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtleSAgID0gcmVsYXRp
b25zaGlwLmtleSwKLSAgICAgICAgYXR0cnMgPSBnZXQodGhpcywgJ2F0dHJzJyksCi0gICAgICAg
IGVtYmVkID0gYXR0cnMgJiYgYXR0cnNba2V5XSAmJiBhdHRyc1trZXldLmVtYmVkZGVkID09PSAn
YWx3YXlzJzsKLQotICAgIGlmIChlbWJlZCkgewotICAgICAganNvblt0aGlzLmtleUZvckF0dHJp
YnV0ZShrZXkpXSA9IGdldChyZWNvcmQsIGtleSkubWFwKGZ1bmN0aW9uKHJlbGF0aW9uKSB7Ci0g
ICAgICAgIHZhciBkYXRhID0gcmVsYXRpb24uc2VyaWFsaXplKCksCi0gICAgICAgICAgICBwcmlt
YXJ5S2V5ID0gZ2V0KHRoaXMsICdwcmltYXJ5S2V5Jyk7Ci0KLSAgICAgICAgZGF0YVtwcmltYXJ5
S2V5XSA9IGdldChyZWxhdGlvbiwgcHJpbWFyeUtleSk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7
Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgRXh0cmFjdCBlbWJl
ZGRlZCBvYmplY3RzIG91dCBvZiB0aGUgcGF5bG9hZCBmb3IgYSBzaW5nbGUgb2JqZWN0Ci0gICAg
YW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1ldGhv
ZCBleHRyYWN0U2luZ2xlCi0gICovCi0gIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBw
cmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7Ci0gICAgdmFyIHJv
b3QgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShwcmltYXJ5VHlwZS50eXBlS2V5KSwKLSAgICAgICAg
cGFydGlhbCA9IHBheWxvYWRbcm9vdF07Ci0KLSAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVk
KHN0b3JlLCB0aGlzLCBwcmltYXJ5VHlwZSwgcGFydGlhbCwgcGF5bG9hZCk7Ci0KLSAgICByZXR1
cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHByaW1hcnlUeXBlLCBwYXlsb2FkLCByZWNvcmRJZCwgcmVx
dWVzdFR5cGUpOwotICB9LAotCi0gIC8qKgotICAgIEV4dHJhY3QgZW1iZWRkZWQgb2JqZWN0cyBv
dXQgb2YgYSBzdGFuZGFyZCBwYXlsb2FkCi0gICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQg
b2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1ldGhvZCBleHRyYWN0QXJyYXkKLSAgKi8KLSAgZXh0
cmFjdEFycmF5OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewotICAgIHZhciByb290
ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUodHlwZS50eXBlS2V5KSwKLSAgICAgICAgcGFydGlhbHMg
PSBwYXlsb2FkW0VtYmVyLlN0cmluZy5wbHVyYWxpemUocm9vdCldOwotCi0gICAgZm9yRWFjaChw
YXJ0aWFscywgZnVuY3Rpb24ocGFydGlhbCkgewotICAgICAgdXBkYXRlUGF5bG9hZFdpdGhFbWJl
ZGRlZChzdG9yZSwgdGhpcywgdHlwZSwgcGFydGlhbCwgcGF5bG9hZCk7Ci0gICAgfSwgdGhpcyk7
Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwotICB9Ci19
KTsKLQotZnVuY3Rpb24gdXBkYXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgc2VyaWFsaXpl
ciwgdHlwZSwgcGFydGlhbCwgcGF5bG9hZCkgewotICB2YXIgYXR0cnMgPSBnZXQoc2VyaWFsaXpl
ciwgJ2F0dHJzJyk7Ci0KLSAgaWYgKCFhdHRycykgewotICAgIHJldHVybjsKLSAgfQotCi0gIHR5
cGUuZWFjaFJlbGF0aW9uc2hpcChmdW5jdGlvbihrZXksIHJlbGF0aW9uc2hpcCkgewotICAgIHZh
ciBleHBhbmRlZEtleSwgZW1iZWRkZWRUeXBlS2V5LCBhdHRyaWJ1dGUsIGlkcywKLSAgICAgICAg
Y29uZmlnID0gYXR0cnNba2V5XSwKLSAgICAgICAgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6
ZXJGb3IocmVsYXRpb25zaGlwLnR5cGUudHlwZUtleSksCi0gICAgICAgIHByaW1hcnlLZXkgPSBn
ZXQoc2VyaWFsaXplciwgInByaW1hcnlLZXkiKTsKLQotICAgIGlmIChyZWxhdGlvbnNoaXAua2lu
ZCAhPT0gImhhc01hbnkiKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNvbmZp
ZyAmJiAoY29uZmlnLmVtYmVkZGVkID09PSAnYWx3YXlzJyB8fCBjb25maWcuZW1iZWRkZWQgPT09
ICdsb2FkJykpIHsKLSAgICAgIC8vIHVuZGVyc2NvcmUgZm9yY2VzIHRoZSBlbWJlZGRlZCByZWNv
cmRzIHRvIGJlIHNpZGUgbG9hZGVkLgotICAgICAgLy8gaXQgaXMgbmVlZGVkIHdoZW4gbWFpbiB0
eXBlID09PSByZWxhdGlvbnNoaXAudHlwZQotICAgICAgZW1iZWRkZWRUeXBlS2V5ID0gJ18nICsg
RW1iZXIuU3RyaW5nLnBsdXJhbGl6ZShyZWxhdGlvbnNoaXAudHlwZS50eXBlS2V5KTsKLSAgICAg
IGV4cGFuZGVkS2V5ID0gdGhpcy5rZXlGb3JSZWxhdGlvbnNoaXAoa2V5LCByZWxhdGlvbnNoaXAu
a2luZCk7Ci0gICAgICBhdHRyaWJ1dGUgID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAg
ICAgIGlkcyA9IFtdOwotCi0gICAgICBpZiAoIXBhcnRpYWxbYXR0cmlidXRlXSkgewotICAgICAg
ICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSA9IHBh
eWxvYWRbZW1iZWRkZWRUeXBlS2V5XSB8fCBbXTsKLQotICAgICAgZm9yRWFjaChwYXJ0aWFsW2F0
dHJpYnV0ZV0sIGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgdmFyIGVtYmVkZGVkVHlwZSA9IHN0
b3JlLm1vZGVsRm9yKHJlbGF0aW9uc2hpcC50eXBlLnR5cGVLZXkpOwotICAgICAgICB1cGRhdGVQ
YXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCBzZXJpYWxpemVyLCBlbWJlZGRlZFR5cGUsIGRhdGEs
IHBheWxvYWQpOwotICAgICAgICBpZHMucHVzaChkYXRhW3ByaW1hcnlLZXldKTsKLSAgICAgICAg
cGF5bG9hZFtlbWJlZGRlZFR5cGVLZXldLnB1c2goZGF0YSk7Ci0gICAgICB9KTsKLQotICAgICAg
cGFydGlhbFtleHBhbmRlZEtleV0gPSBpZHM7Ci0gICAgICBkZWxldGUgcGFydGlhbFthdHRyaWJ1
dGVdOwotICAgIH0KLSAgfSwgc2VyaWFsaXplcik7Ci19Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGZvckVhY2ggPSBFbWJl
ci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKLXZhciBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5n
LmRlY2FtZWxpemUsCi0gICAgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLAot
ICAgIHBsdXJhbGl6ZSAgPSBFbWJlci5TdHJpbmcucGx1cmFsaXplOwotCi0vKioKLSAgVGhlIEFj
dGl2ZU1vZGVsQWRhcHRlciBpcyBhIHN1YmNsYXNzIG9mIHRoZSBSRVNUQWRhcHRlciBkZXNpZ25l
ZCB0byBpbnRlZ3JhdGUKLSAgd2l0aCBhIEpTT04gQVBJIHRoYXQgdXNlcyBhbiB1bmRlcnNjb3Jl
ZCBuYW1pbmcgY29udmVudGlvbiBpbnN0ZWFkIG9mIGNhbWVsY2FzaW5nLgotICBJdCBoYXMgYmVl
biBkZXNpZ25lZCB0byB3b3JrIG91dCBvZiB0aGUgYm94IHdpdGggdGhlCi0gIFthY3RpdmVfbW9k
ZWxfc2VyaWFsaXplcnNdKGh0dHA6Ly9naXRodWIuY29tL3JhaWxzLWFwaS9hY3RpdmVfbW9kZWxf
c2VyaWFsaXplcnMpCi0gIFJ1YnkgZ2VtLgotCi0gIFRoaXMgYWRhcHRlciBleHRlbmRzIHRoZSBE
Uy5SRVNUQWRhcHRlciBieSBtYWtpbmcgY29uc2lzdGVudCB1c2Ugb2YgdGhlIGNhbWVsaXphdGlv
biwKLSAgZGVjYW1lbGl6YXRpb24gYW5kIHBsdXJhbGl6YXRpb24gbWV0aG9kcyB0byBub3JtYWxp
emUgdGhlIHNlcmlhbGl6ZWQgSlNPTiBpbnRvIGEKLSAgZm9ybWF0IHRoYXQgaXMgY29tcGF0aWJs
ZSB3aXRoIGEgY29udmVudGlvbmFsIFJhaWxzIGJhY2tlbmQgYW5kIEVtYmVyIERhdGEuCi0KLSAg
IyMgSlNPTiBTdHJ1Y3R1cmUKLQotICBUaGUgQWN0aXZlTW9kZWxBZGFwdGVyIGV4cGVjdHMgdGhl
IEpTT04gcmV0dXJuZWQgZnJvbSB5b3VyIHNlcnZlciB0byBmb2xsb3cKLSAgdGhlIFJFU1QgYWRh
cHRlciBjb252ZW50aW9ucyBzdWJzdGl0dXRpbmcgdW5kZXJzY29yZWQga2V5cyBmb3IgY2FtZWxj
YXNlZCBvbmVzLgotCi0gICMjIyBDb252ZW50aW9uYWwgTmFtZXMKLQotICBBdHRyaWJ1dGUgbmFt
ZXMgaW4geW91ciBKU09OIHBheWxvYWQgc2hvdWxkIGJlIHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9u
cyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBGb3Ig
ZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVyc29uYCBtb2RlbDoKLQotICBgYGBqcwotICBBcHAu
RmFtb3VzUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIo
J3N0cmluZycpLAotICAgIGxhc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0
aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJu
ZWQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAiZmFtb3VzX3Bl
cnNvbiI6IHsKLSAgICAgICJmaXJzdF9uYW1lIjogIkJhcmFjayIsCi0gICAgICAibGFzdF9uYW1l
IjogIk9iYW1hIiwKLSAgICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKLSAgICB9Ci0gIH0K
LSAgYGBgCi0KLSAgQGNsYXNzIEFjdGl2ZU1vZGVsQWRhcHRlcgotICBAY29uc3RydWN0b3IKLSAg
QG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5BZGFwdGVyCi0qKi8KLQotRFMuQWN0aXZlTW9k
ZWxBZGFwdGVyID0gRFMuUkVTVEFkYXB0ZXIuZXh0ZW5kKHsKLSAgZGVmYXVsdFNlcmlhbGl6ZXI6
ICctYWN0aXZlLW1vZGVsJywKLSAgLyoqCi0gICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBvdmVy
cmlkZXMgdGhlIGBwYXRoRm9yVHlwZWAgbWV0aG9kIHRvIGJ1aWxkCi0gICAgdW5kZXJzY29yZWQg
VVJMcyBieSBkZWNhbWVsaXppbmcgYW5kIHBsdXJhbGl6aW5nIHRoZSBvYmplY3QgdHlwZSBuYW1l
LgotCi0gICAgYGBganMKLSAgICAgIHRoaXMucGF0aEZvclR5cGUoImZhbW91c1BlcnNvbiIpOwot
ICAgICAgLy89PiAiZmFtb3VzX3Blb3BsZSIKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcGF0aEZv
clR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQotICAgIEByZXR1cm5zIFN0cmluZwotICAq
LwotICBwYXRoRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHZhciBkZWNhbWVsaXplZCA9
IGRlY2FtZWxpemUodHlwZSk7Ci0gICAgdmFyIHVuZGVyc2NvcmVkID0gdW5kZXJzY29yZShkZWNh
bWVsaXplZCk7Ci0gICAgcmV0dXJuIHBsdXJhbGl6ZSh1bmRlcnNjb3JlZCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBhamF4RXJyb3Jg
IG1ldGhvZAotICAgIHRvIHJldHVybiBhIERTLkludmFsaWRFcnJvciBmb3IgYWxsIDQyMiBVbnBy
b2Nlc3NhYmxlIEVudGl0eQotICAgIHJlc3BvbnNlcy4KLQotICAgIEEgNDIyIEhUVFAgcmVzcG9u
c2UgZnJvbSB0aGUgc2VydmVyIGdlbmVyYWxseSBpbXBsaWVzIHRoYXQgdGhlIHJlcXVlc3QKLSAg
ICB3YXMgd2VsbCBmb3JtZWQgYnV0IHRoZSBBUEkgd2FzIHVuYWJsZSB0byBwcm9jZXNzIGl0IGJl
Y2F1c2UgdGhlCi0gICAgY29udGVudCB3YXMgbm90IHNlbWFudGljYWxseSBjb3JyZWN0IG9yIG1l
YW5pbmdmdWwgcGVyIHRoZSBBUEkuCi0KLSAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiA0MjIg
SFRUUCBFcnJvciBjb2RlIHNlZSAxMS4yIFdlYkRBViBSRkMgNDkxOAotICAgIGh0dHBzOi8vdG9v
bHMuaWV0Zi5vcmcvaHRtbC9yZmM0OTE4I3NlY3Rpb24tMTEuMgotCi0gICAgQG1ldGhvZCBhamF4
RXJyb3IKLSAgICBAcGFyYW0ganFYSFIKLSAgICBAcmV0dXJucyBlcnJvcgotICAqLwotICBhamF4
RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFY
SFIpOwotCi0gICAgaWYgKGpxWEhSICYmIGpxWEhSLnN0YXR1cyA9PT0gNDIyKSB7Ci0gICAgICB2
YXIgcmVzcG9uc2UgPSBFbWJlci4kLnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQpLAotICAg
ICAgICAgIGVycm9ycyA9IHt9OwotCi0gICAgICBpZiAocmVzcG9uc2UuZXJyb3JzICE9PSB1bmRl
ZmluZWQpIHsKLSAgICAgICAgdmFyIGpzb25FcnJvcnMgPSByZXNwb25zZS5lcnJvcnM7Ci0KLSAg
ICAgICAgZm9yRWFjaChFbWJlci5rZXlzKGpzb25FcnJvcnMpLCBmdW5jdGlvbihrZXkpIHsKLSAg
ICAgICAgICBlcnJvcnNbRW1iZXIuU3RyaW5nLmNhbWVsaXplKGtleSldID0ganNvbkVycm9yc1tr
ZXldOwotICAgICAgICB9KTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlk
RXJyb3IoZXJyb3JzKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0K
LSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24o
QXBwbGljYXRpb24pIHsKLSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJh
Y3RpdmVNb2RlbEFkYXB0ZXIiLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVy
LCBhcHBsaWNhdGlvbikgewotICAgICAgdmFyIHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5
KGNvbnRhaW5lcik7Ci0gICAgICBwcm94eS5yZWdpc3RlckRlcHJlY2F0aW9ucyhbCi0gICAgICAg
IHtkZXByZWNhdGVkOiAnc2VyaWFsaXplcjpfYW1zJywgIHZhbGlkOiAnc2VyaWFsaXplcjotYWN0
aXZlLW1vZGVsJ30sCi0gICAgICAgIHtkZXByZWNhdGVkOiAnYWRhcHRlcjpfYW1zJywgICAgIHZh
bGlkOiAnYWRhcHRlcjotYWN0aXZlLW1vZGVsJ30KLSAgICAgIF0pOwotCi0gICAgICBhcHBsaWNh
dGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjotYWN0aXZlLW1vZGVsJywgRFMuQWN0aXZlTW9kZWxT
ZXJpYWxpemVyKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1hY3RpdmUt
bW9kZWwnLCBEUy5BY3RpdmVNb2RlbEFkYXB0ZXIpOwotICAgIH0KLSAgfSk7Ci19KTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi19KSgpOwpkaWZmIC0tZ2l0IGEv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1h
ZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVyLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dl
cl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFw
dGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkxOTI2NGU0ZDcyMDkwOTFi
NzU4YTc2NjdiODJiYzFlY2UxODkwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1s
b2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3JhZ2VfYWRhcHRlci5qcworKysgL2Rldi9udWxs
CkBAIC0xLDEyNiArMCwwIEBACi0vKmdsb2JhbCBFbWJlciovCi0vKmdsb2JhbCBEUyovCi0ndXNl
IHN0cmljdCc7Ci0KLURTLkxTQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKEVtYmVyLkV2ZW50
ZWQsIHsKLQotICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5fbG9hZERhdGEo
KTsKLSAgICB9LAotCi0gICAgZ2VuZXJhdGVJZEZvclJlY29yZDogZnVuY3Rpb24gKCkgewotICAg
ICAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzMikuc2xpY2UoMikuc3Vic3RyKDAs
IDUpOwotICAgIH0sCi0KLSAgICBmaW5kOiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIGlkKSB7Ci0g
ICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAg
ICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29y
ZHNbaWRdKSk7Ci0gICAgfSwKLQotICAgIGZpbmRNYW55OiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUs
IGlkcykgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0
eXBlKTsKLSAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdHMucHVzaChFbWJlci5j
b3B5KG5hbWVzcGFjZS5yZWNvcmRzW2lkc1tpXV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm4gRW1iZXIuUlNWUC5yZXNvbHZlKHJlc3VsdHMpOwotICAgIH0sCi0KLSAgLy8gU3VwcG9ydHMg
cXVlcmllcyB0aGF0IGxvb2sgbGlrZSB0aGlzOgotICAvLwotICAvLyAgIHsKLSAgLy8gICAgIDxw
cm9wZXJ0eSB0byBxdWVyeT46IDx2YWx1ZSBvciByZWdleCAoZm9yIHN0cmluZ3MpIHRvIG1hdGNo
PiwKLSAgLy8gICAgIC4uLgotICAvLyAgIH0KLSAgLy8KLSAgLy8gRXZlcnkgcHJvcGVydHkgYWRk
ZWQgdG8gdGhlIHF1ZXJ5IGlzIGFuICJBTkQiIHF1ZXJ5LCBub3QgIk9SIgotICAvLwotICAvLyBF
eGFtcGxlOgotICAvLwotICAvLyAgbWF0Y2ggcmVjb3JkcyB3aXRoICJjb21wbGV0ZTogdHJ1ZSIg
YW5kIHRoZSBuYW1lICJmb28iIG9yICJiYXIiCi0gIC8vCi0gIC8vICAgIHsgY29tcGxldGU6IHRy
dWUsIG5hbWU6IC9mb298YmFyLyB9Ci0gICAgZmluZFF1ZXJ5OiBmdW5jdGlvbiAoc3RvcmUsIHR5
cGUsIHF1ZXJ5LCByZWNvcmRBcnJheSkgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5f
bmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnF1ZXJ5
KG5hbWVzcGFjZS5yZWNvcmRzLCBxdWVyeSk7Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJl
c29sdmUocmVzdWx0cyk7Ci0gICAgfSwKLQotICAgIHF1ZXJ5OiBmdW5jdGlvbiAocmVjb3Jkcywg
cXVlcnkpIHsKLSAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKLSAgICAgICAgdmFyIGlkLCByZWNv
cmQsIHByb3BlcnR5LCB0ZXN0LCBwdXNoOwotICAgICAgICBmb3IgKGlkIGluIHJlY29yZHMpIHsK
LSAgICAgICAgICAgIHJlY29yZCA9IHJlY29yZHNbaWRdOwotICAgICAgICAgICAgZm9yIChwcm9w
ZXJ0eSBpbiBxdWVyeSkgewotICAgICAgICAgICAgICAgIHRlc3QgPSBxdWVyeVtwcm9wZXJ0eV07
Ci0gICAgICAgICAgICAgICAgcHVzaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChPYmpl
Y3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGVzdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHB1c2ggPSB0ZXN0LnRlc3QocmVjb3JkW3Byb3BlcnR5XSk7
Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHVzaCA9IHJl
Y29yZFtwcm9wZXJ0eV0gPT09IHRlc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKHB1c2gpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2go
cmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0
czsKLSAgICB9LAotCi0gICAgZmluZEFsbDogZnVuY3Rpb24gKHN0b3JlLCB0eXBlKSB7Ci0gICAg
ICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgICAg
ICB2YXIgcmVzdWx0cyA9IFtdOwotICAgICAgICBmb3IgKHZhciBpZCBpbiBuYW1lc3BhY2UucmVj
b3JkcykgewotICAgICAgICAgICAgcmVzdWx0cy5wdXNoKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJl
Y29yZHNbaWRdKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVzb2x2
ZShyZXN1bHRzKTsKLSAgICB9LAotCi0gICAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbiAoc3RvcmUs
IHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNl
Rm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdGhpcy5fYWRkUmVjb3JkVG9OYW1lc3BhY2UobmFtZXNw
YWNlLCByZWNvcmQpOwotICAgICAgICB0aGlzLl9zYXZlRGF0YSgpOwotICAgICAgICByZXR1cm4g
RW1iZXIuUlNWUC5yZXNvbHZlKCk7Ci0gICAgfSwKLQotICAgIHVwZGF0ZVJlY29yZDogZnVuY3Rp
b24gKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMu
X25hbWVzcGFjZUZvclR5cGUodHlwZSk7Ci0gICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lk
Jyk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNvcmRzW2lkXSA9IHJlY29yZC50b0pTT04oeyBpbmNs
dWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHRoaXMuX3NhdmVEYXRhKCk7Ci0gICAgICAgIHJldHVy
biBFbWJlci5SU1ZQLnJlc29sdmUoKTsKLSAgICB9LAotCi0gICAgZGVsZXRlUmVjb3JkOiBmdW5j
dGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdmFyIGlkID0gcmVjb3JkLmdldCgn
aWQnKTsKLSAgICAgICAgZGVsZXRlIG5hbWVzcGFjZS5yZWNvcmRzW2lkXTsKLSAgICAgICAgdGhp
cy5fc2F2ZURhdGEoKTsKLSAgICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVzb2x2ZSgpOwotICAg
IH0sCi0KLSAgLy8gcHJpdmF0ZQotCi0gICAgX2dldE5hbWVzcGFjZTogZnVuY3Rpb24gKCkgewot
ICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgfHwgJ0RTLkxTQWRhcHRlcic7Ci0gICAgfSwK
LQotICAgIF9sb2FkRGF0YTogZnVuY3Rpb24gKCkgewotICAgICAgICB0aGlzLl9kYXRhID0ge307
Ci0gICAgfSwKLQotICAgIF9zYXZlRGF0YTogZnVuY3Rpb24gKCkgewotICAgIH0sCi0KLSAgICBf
bmFtZXNwYWNlRm9yVHlwZTogZnVuY3Rpb24gKHR5cGUpIHsKLSAgICAgICAgdmFyIG5hbWVzcGFj
ZSA9IHR5cGUudXJsIHx8IHR5cGUudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuX2Rh
dGFbbmFtZXNwYWNlXSB8fCAoCi0gICAgICAgICAgICB0aGlzLl9kYXRhW25hbWVzcGFjZV0gPSB7
cmVjb3Jkczoge319Ci0gICAgICAgICk7Ci0gICAgfSwKLQotICAgIF9hZGRSZWNvcmRUb05hbWVz
cGFjZTogZnVuY3Rpb24gKG5hbWVzcGFjZSwgcmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0g
cmVjb3JkLnNlcmlhbGl6ZSh7aW5jbHVkZUlkOiB0cnVlfSk7Ci0gICAgICAgIG5hbWVzcGFjZS5y
ZWNvcmRzW2RhdGEuaWRdID0gZGF0YTsKLSAgICB9Ci19KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJlci5qcyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJlci5qcwpkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggYTU1NjcxMWE4Yzg2NjFkNmU4NDRiZDYwZDFlYTJjYmYyNzI3ODVjNy4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMKKysrIC9kZXYvbnVsbApA
QCAtMSw0MDU4MyArMCwwIEBACi0vKiEKLSAqIEBvdmVydmlldyAgRW1iZXIgLSBKYXZhU2NyaXB0
IEFwcGxpY2F0aW9uIEZyYW1ld29yawotICogQGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMS0yMDE0
IFRpbGRlIEluYy4gYW5kIGNvbnRyaWJ1dG9ycwotICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5
cmlnaHQgMjAwNi0yMDExIFN0cm9iZSBJbmMuCi0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHly
aWdodCAyMDA4LTIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQGxpY2Vu
c2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZQotICogICAgICAgICAgICBTZWUgaHR0cHM6
Ly9yYXcuZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL21hc3Rlci9MSUNFTlNFCi0gKiBAdmVy
c2lvbiAgIDEuMy4xCi0gKi8KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKmdsb2JhbCBfX2ZhaWxfXyov
Ci0KLS8qKgotRW1iZXIgRGVidWcKLQotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1k
ZWJ1ZwotKi8KLQotLyoqCi1AY2xhc3MgRW1iZXIKLSovCi0KLWlmICgndW5kZWZpbmVkJyA9PT0g
dHlwZW9mIEVtYmVyKSB7Ci0gIEVtYmVyID0ge307Ci0KLSAgaWYgKCd1bmRlZmluZWQnICE9PSB0
eXBlb2Ygd2luZG93KSB7Ci0gICAgd2luZG93LkVtID0gd2luZG93LkVtYmVyID0gRW0gPSBFbWJl
cjsKLSAgfQotfQotCi0vLyBUaGlzIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBs
b2dpYyBpbgotLy8gYHBhY2thZ2VzL2VtYmVyLW1ldGFsL2xpYi9jb3JlLmpzYC4KLS8vCi0vLyBU
aGlzIGlzIGR1cGxpY2F0ZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBgRW1iZXIuRU5WYAotLy8gaXMg
c2V0dXAgZXZlbiBpZiBgRW1iZXJgIGlzIG5vdCBsb2FkZWQgeWV0LgotaWYgKEVtYmVyLkVOVikg
ewotICAvLyBkbyBub3RoaW5nIGlmIEVtYmVyLkVOViBpcyBhbHJlYWR5IHNldHVwCi19IGVsc2Ug
aWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgRW1iZXJFTlYpIHsKLSAgRW1iZXIuRU5WID0gRW1i
ZXJFTlY7Ci19IGVsc2UgaWYoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFTlYpIHsKLSAgRW1iZXIu
RU5WID0gRU5WOwotfSBlbHNlIHsKLSAgRW1iZXIuRU5WID0ge307Ci19Ci0KLWlmICghKCdNQU5E
QVRPUllfU0VUVEVSJyBpbiBFbWJlci5FTlYpKSB7Ci0gIEVtYmVyLkVOVi5NQU5EQVRPUllfU0VU
VEVSID0gdHJ1ZTsgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBkZWJ1ZyBkaXN0Ci19Ci0KLS8qKgot
ICBEZWZpbmUgYW4gYXNzZXJ0aW9uIHRoYXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhl
IGNvbmRpdGlvbiBpcyBub3QKLSAgbWV0LiBFbWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBh
bnkgY2FsbHMgdG8gYEVtYmVyLmFzc2VydCgpYCB3aGVuCi0gIGRvaW5nIGEgcHJvZHVjdGlvbiBi
dWlsZC4gRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIFRlc3QgZm9yIHRydXRoaW5l
c3MKLSAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBhc3MgYSB2YWxpZCBvYmplY3QnLCBvYmopOwotICAv
LyBGYWlsIHVuY29uZGl0aW9uYWxseQotICBFbWJlci5hc3NlcnQoJ1RoaXMgY29kZSBwYXRoIHNo
b3VsZCBuZXZlciBiZSBydW4nKQotICBgYGAKLQotICBAbWV0aG9kIGFzc2VydAotICBAcGFyYW0g
e1N0cmluZ30gZGVzYyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3NlcnRpb24uIFRoaXMgd2lsbCBi
ZWNvbWUKLSAgICB0aGUgdGV4dCBvZiB0aGUgRXJyb3IgdGhyb3duIGlmIHRoZSBhc3NlcnRpb24g
ZmFpbHMuCi0gIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdCBNdXN0IGJlIHRydXRoeSBmb3IgdGhlIGFz
c2VydGlvbiB0byBwYXNzLiBJZgotICAgIGZhbHN5LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJv
d24uCi0qLwotRW1iZXIuYXNzZXJ0ID0gZnVuY3Rpb24oZGVzYywgdGVzdCkgewotICBpZiAoIXRl
c3QpIHsKLSAgICBFbWJlci5Mb2dnZXIuYXNzZXJ0KHRlc3QsIGRlc2MpOwotICB9Ci0KLSAgaWYg
KEVtYmVyLnRlc3RpbmcgJiYgIXRlc3QpIHsKLSAgICAvLyB3aGVuIHRlc3RpbmcsIGVuc3VyZSB0
ZXN0IGZhaWx1cmVzIHdoZW4gYXNzZXJ0aW9ucyBmYWlsCi0gICAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKCJBc3NlcnRpb24gRmFpbGVkOiAiICsgZGVzYyk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gIERp
c3BsYXkgYSB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2UuIEVtYmVyIGJ1aWxkIHRv
b2xzIHdpbGwKLSAgcmVtb3ZlIGFueSBjYWxscyB0byBgRW1iZXIud2FybigpYCB3aGVuIGRvaW5n
IGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBAbWV0aG9kIHdhcm4KLSAgQHBhcmFtIHtTdHJpbmd9
IG1lc3NhZ2UgQSB3YXJuaW5nIHRvIGRpc3BsYXkuCi0gIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdCBB
biBvcHRpb25hbCBib29sZWFuLiBJZiBmYWxzeSwgdGhlIHdhcm5pbmcKLSAgICB3aWxsIGJlIGRp
c3BsYXllZC4KLSovCi1FbWJlci53YXJuID0gZnVuY3Rpb24obWVzc2FnZSwgdGVzdCkgewotICBp
ZiAoIXRlc3QpIHsKLSAgICBFbWJlci5Mb2dnZXIud2FybigiV0FSTklORzogIittZXNzYWdlKTsK
LSAgICBpZiAoJ3RyYWNlJyBpbiBFbWJlci5Mb2dnZXIpIEVtYmVyLkxvZ2dlci50cmFjZSgpOwot
ICB9Ci19OwotCi0vKioKLSAgRGlzcGxheSBhIGRlYnVnIG5vdGljZS4gRW1iZXIgYnVpbGQgdG9v
bHMgd2lsbCByZW1vdmUgYW55IGNhbGxzIHRvCi0gIGBFbWJlci5kZWJ1ZygpYCB3aGVuIGRvaW5n
IGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmRlYnVnKCJJ
J20gYSBkZWJ1ZyBub3RpY2UhIik7Ci0gIGBgYAotCi0gIEBtZXRob2QgZGVidWcKLSAgQHBhcmFt
IHtTdHJpbmd9IG1lc3NhZ2UgQSBkZWJ1ZyBtZXNzYWdlIHRvIGRpc3BsYXkuCi0qLwotRW1iZXIu
ZGVidWcgPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gIEVtYmVyLkxvZ2dlci5kZWJ1ZygiREVCVUc6
ICIrbWVzc2FnZSk7Ci19OwotCi0vKioKLSAgRGlzcGxheSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcg
d2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBhbmQgYSBzdGFjayB0cmFjZQotICAoQ2hyb21lIGFu
ZCBGaXJlZm94IG9ubHkpLiBFbWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMg
dG8KLSAgYEVtYmVyLmRlcHJlY2F0ZSgpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4K
LQotICBAbWV0aG9kIGRlcHJlY2F0ZQotICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2Ny
aXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4KLSAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IEFuIG9w
dGlvbmFsIGJvb2xlYW4uIElmIGZhbHN5LCB0aGUgZGVwcmVjYXRpb24KLSAgICB3aWxsIGJlIGRp
c3BsYXllZC4KLSovCi1FbWJlci5kZXByZWNhdGUgPSBmdW5jdGlvbihtZXNzYWdlLCB0ZXN0KSB7
Ci0gIGlmIChFbWJlci5URVNUSU5HX0RFUFJFQ0FUSU9OKSB7IHJldHVybjsgfQotCi0gIGlmIChh
cmd1bWVudHMubGVuZ3RoID09PSAxKSB7IHRlc3QgPSBmYWxzZTsgfQotICBpZiAodGVzdCkgeyBy
ZXR1cm47IH0KLQotICBpZiAoRW1iZXIuRU5WLlJBSVNFX09OX0RFUFJFQ0FUSU9OKSB7IHRocm93
IG5ldyBFbWJlci5FcnJvcihtZXNzYWdlKTsgfQotCi0gIHZhciBlcnJvcjsKLQotICAvLyBXaGVu
IHVzaW5nIG5ldyBFcnJvciwgd2UgY2FuJ3QgZG8gdGhlIGFyZ3VtZW50cyBjaGVjayBmb3IgQ2hy
b21lLiBBbHRlcm5hdGl2ZXMgYXJlIHdlbGNvbWUKLSAgdHJ5IHsgX19mYWlsX18uZmFpbCgpOyB9
IGNhdGNoIChlKSB7IGVycm9yID0gZTsgfQotCi0gIGlmIChFbWJlci5MT0dfU1RBQ0tUUkFDRV9P
Tl9ERVBSRUNBVElPTiAmJiBlcnJvci5zdGFjaykgewotICAgIHZhciBzdGFjaywgc3RhY2tTdHIg
PSAnJzsKLSAgICBpZiAoZXJyb3JbJ2FyZ3VtZW50cyddKSB7Ci0gICAgICAvLyBDaHJvbWUKLSAg
ICAgIHN0YWNrID0gZXJyb3Iuc3RhY2sucmVwbGFjZSgvXlxzK2F0XHMrL2dtLCAnJykuCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoL14oW15cKF0rPykoW1xuJF0pL2dtLCAne2Fu
b255bW91c30oJDEpJDInKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSgvXk9i
amVjdC48YW5vbnltb3VzPlxzKlwoKFteXCldKylcKS9nbSwgJ3thbm9ueW1vdXN9KCQxKScpLnNw
bGl0KCdcbicpOwotICAgICAgc3RhY2suc2hpZnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8g
RmlyZWZveAotICAgICAgc3RhY2sgPSBlcnJvci5zdGFjay5yZXBsYWNlKC8oPzpcbkA6MCk/XHMr
JC9tLCAnJykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoL15cKC9nbSwgJ3th
bm9ueW1vdXN9KCcpLnNwbGl0KCdcbicpOwotICAgIH0KLQotICAgIHN0YWNrU3RyID0gIlxuICAg
ICIgKyBzdGFjay5zbGljZSgyKS5qb2luKCJcbiAgICAiKTsKLSAgICBtZXNzYWdlID0gbWVzc2Fn
ZSArIHN0YWNrU3RyOwotICB9Ci0KLSAgRW1iZXIuTG9nZ2VyLndhcm4oIkRFUFJFQ0FUSU9OOiAi
K21lc3NhZ2UpOwotfTsKLQotCi0KLS8qKgotICBBbGlhcyBhbiBvbGQsIGRlcHJlY2F0ZWQgbWV0
aG9kIHdpdGggaXRzIG5ldyBjb3VudGVycGFydC4KLQotICBEaXNwbGF5IGEgZGVwcmVjYXRpb24g
d2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBhIHN0YWNrIHRyYWNlCi0gIChD
aHJvbWUgYW5kIEZpcmVmb3ggb25seSkgd2hlbiB0aGUgYXNzaWduZWQgbWV0aG9kIGlzIGNhbGxl
ZC4KLQotICBFbWJlciBidWlsZCB0b29scyB3aWxsIG5vdCByZW1vdmUgY2FsbHMgdG8gYEVtYmVy
LmRlcHJlY2F0ZUZ1bmMoKWAsIHRob3VnaAotICBubyB3YXJuaW5ncyB3aWxsIGJlIHNob3duIGlu
IHByb2R1Y3Rpb24uCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5vbGRNZXRob2QgPSBFbWJl
ci5kZXByZWNhdGVGdW5jKCJQbGVhc2UgdXNlIHRoZSBuZXcsIHVwZGF0ZWQgbWV0aG9kIiwgRW1i
ZXIubmV3TWV0aG9kKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBkZXByZWNhdGVGdW5jCi0gIEBwYXJh
bSB7U3RyaW5nfSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2YgdGhlIGRlcHJlY2F0aW9uLgotICBA
cGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBuZXcgZnVuY3Rpb24gY2FsbGVkIHRvIHJlcGxhY2Ug
aXRzIGRlcHJlY2F0ZWQgY291bnRlcnBhcnQuCi0gIEByZXR1cm4ge0Z1bmN0aW9ufSBhIG5ldyBm
dW5jdGlvbiB0aGF0IHdyYXBwZWQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggYSBkZXByZWNh
dGlvbiB3YXJuaW5nCi0qLwotRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGZ1bmN0aW9uKG1lc3NhZ2Us
IGZ1bmMpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZShtZXNz
YWdlKTsKLSAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9OwotfTsK
LQotCi0vLyBJbmZvcm0gdGhlIGRldmVsb3BlciBhYm91dCB0aGUgRW1iZXIgSW5zcGVjdG9yIGlm
IG5vdCBpbnN0YWxsZWQuCi1pZiAoIUVtYmVyLnRlc3RpbmcpIHsKLSAgaWYgKHR5cGVvZiB3aW5k
b3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jaHJvbWUgJiYgd2luZG93LmFkZEV2ZW50TGlz
dGVuZXIpIHsKLSAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCkg
ewotICAgICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5kYXRhc2V0ICYmICFk
b2N1bWVudC5ib2R5LmRhdGFzZXQuZW1iZXJFeHRlbnNpb24pIHsKLSAgICAgICAgRW1iZXIuZGVi
dWcoJ0ZvciBtb3JlIGFkdmFuY2VkIGRlYnVnZ2luZywgaW5zdGFsbCB0aGUgRW1iZXIgSW5zcGVj
dG9yIGZyb20gaHR0cHM6Ly9jaHJvbWUuZ29vZ2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvZW1iZXIt
aW5zcGVjdG9yL2JtZGJsbmNlZ2tlbmthY2llaWhmaHBqZnBwb2NvbmhpJyk7Ci0gICAgICB9Ci0g
ICAgfSwgZmFsc2UpOwotICB9Ci19Ci0KLX0pKCk7Ci0KLS8qIQotICogQG92ZXJ2aWV3ICBFbWJl
ciAtIEphdmFTY3JpcHQgQXBwbGljYXRpb24gRnJhbWV3b3JrCi0gKiBAY29weXJpZ2h0IENvcHly
aWdodCAyMDExLTIwMTQgVGlsZGUgSW5jLiBhbmQgY29udHJpYnV0b3JzCi0gKiAgICAgICAgICAg
IFBvcnRpb25zIENvcHlyaWdodCAyMDA2LTIwMTEgU3Ryb2JlIEluYy4KLSAqICAgICAgICAgICAg
UG9ydGlvbnMgQ29weXJpZ2h0IDIwMDgtMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlCi0gKiAgICAgICAg
ICAgIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL2VtYmVyanMvZW1iZXIuanMvbWFzdGVyL0xJ
Q0VOU0UKLSAqIEB2ZXJzaW9uICAgMS4zLjEKLSAqLwotCi0KLShmdW5jdGlvbigpIHsKLXZhciBk
ZWZpbmUsIHJlcXVpcmVNb2R1bGUsIHJlcXVpcmUsIHJlcXVpcmVqczsKLQotKGZ1bmN0aW9uKCkg
ewotICB2YXIgcmVnaXN0cnkgPSB7fSwgc2VlbiA9IHt9OwotCi0gIGRlZmluZSA9IGZ1bmN0aW9u
KG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7Ci0gICAgcmVnaXN0cnlbbmFtZV0gPSB7IGRlcHM6IGRl
cHMsIGNhbGxiYWNrOiBjYWxsYmFjayB9OwotICB9OwotCi0gIHJlcXVpcmVqcyA9IHJlcXVpcmUg
PSByZXF1aXJlTW9kdWxlID0gZnVuY3Rpb24obmFtZSkgewotICByZXF1aXJlanMuX2Vha19zZWVu
ID0gcmVnaXN0cnk7Ci0KLSAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1cm4gc2VlbltuYW1lXTsg
fQotICAgIHNlZW5bbmFtZV0gPSB7fTsKLQotICAgIGlmICghcmVnaXN0cnlbbmFtZV0pIHsKLSAg
ICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgbW9kdWxlICIgKyBuYW1lKTsKLSAg
ICB9Ci0KLSAgICB2YXIgbW9kID0gcmVnaXN0cnlbbmFtZV0sCi0gICAgICAgIGRlcHMgPSBtb2Qu
ZGVwcywKLSAgICAgICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2ssCi0gICAgICAgIHJlaWZpZWQg
PSBbXSwKLSAgICAgICAgZXhwb3J0czsKLQotICAgIGZvciAodmFyIGk9MCwgbD1kZXBzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgIGlmIChkZXBzW2ldID09PSAnZXhwb3J0cycpIHsKLSAgICAg
ICAgcmVpZmllZC5wdXNoKGV4cG9ydHMgPSB7fSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBy
ZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShyZXNvbHZlKGRlcHNbaV0pKSk7Ci0gICAgICB9Ci0g
ICAgfQotCi0gICAgdmFyIHZhbHVlID0gY2FsbGJhY2suYXBwbHkodGhpcywgcmVpZmllZCk7Ci0g
ICAgcmV0dXJuIHNlZW5bbmFtZV0gPSBleHBvcnRzIHx8IHZhbHVlOwotCi0gICAgZnVuY3Rpb24g
cmVzb2x2ZShjaGlsZCkgewotICAgICAgaWYgKGNoaWxkLmNoYXJBdCgwKSAhPT0gJy4nKSB7IHJl
dHVybiBjaGlsZDsgfQotICAgICAgdmFyIHBhcnRzID0gY2hpbGQuc3BsaXQoIi8iKTsKLSAgICAg
IHZhciBwYXJlbnRCYXNlID0gbmFtZS5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKTsKLQotICAgICAg
Zm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHBh
cnQgPSBwYXJ0c1tpXTsKLQotICAgICAgICBpZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNl
LnBvcCgpOyB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcnQgPT09ICcuJykgeyBjb250aW51ZTsgfQot
ICAgICAgICBlbHNlIHsgcGFyZW50QmFzZS5wdXNoKHBhcnQpOyB9Ci0gICAgICB9Ci0KLSAgICAg
IHJldHVybiBwYXJlbnRCYXNlLmpvaW4oIi8iKTsKLSAgICB9Ci0gIH07Ci19KSgpOwotKGZ1bmN0
aW9uKCkgewotLypnbG9iYWxzIEVtOnRydWUgRU5WIEVtYmVyRU5WIE1ldGFtb3JwaEVOVjp0cnVl
ICovCi0KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQot
LyoqCi0gIEFsbCBFbWJlciBtZXRob2RzIGFuZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW5zaWRl
IG9mIHRoaXMgbmFtZXNwYWNlLiBZb3UKLSAgZ2VuZXJhbGx5IHNob3VsZCBub3QgYWRkIG5ldyBw
cm9wZXJ0aWVzIHRvIHRoaXMgbmFtZXNwYWNlIGFzIGl0IG1heSBiZQotICBvdmVyd3JpdHRlbiBi
eSBmdXR1cmUgdmVyc2lvbnMgb2YgRW1iZXIuCi0KLSAgWW91IGNhbiBhbHNvIHVzZSB0aGUgc2hv
cnRoYW5kIGBFbWAgaW5zdGVhZCBvZiBgRW1iZXJgLgotCi0gIEVtYmVyLVJ1bnRpbWUgaXMgYSBm
cmFtZXdvcmsgdGhhdCBwcm92aWRlcyBjb3JlIGZ1bmN0aW9ucyBmb3IgRW1iZXIgaW5jbHVkaW5n
Ci0gIGNyb3NzLXBsYXRmb3JtIGZ1bmN0aW9ucywgc3VwcG9ydCBmb3IgcHJvcGVydHkgb2JzZXJ2
aW5nIGFuZCBvYmplY3RzLiBJdHMKLSAgZm9jdXMgaXMgb24gc21hbGwgc2l6ZSBhbmQgcGVyZm9y
bWFuY2UuIFlvdSBjYW4gdXNlIHRoaXMgaW4gcGxhY2Ugb2Ygb3IKLSAgYWxvbmctc2lkZSBvdGhl
ciBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJpZXMgc3VjaCBhcyBqUXVlcnkuCi0KLSAgVGhlIGNvcmUg
UnVudGltZSBmcmFtZXdvcmsgaXMgYmFzZWQgb24gdGhlIGpRdWVyeSBBUEkgd2l0aCBhIG51bWJl
ciBvZgotICBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLgotCi0gIEBjbGFzcyBFbWJlcgotICBA
c3RhdGljCi0gIEB2ZXJzaW9uIDEuMy4xCi0qLwotCi1pZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVv
ZiBFbWJlcikgewotICAvLyBDcmVhdGUgY29yZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2UgYW4g
aW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNwYWNlIHNvIHRoYXQKLSAgLy8gb2JqZWN0cyBhc3NpZ25l
ZCB0byBpdCBhcmUgZ2l2ZW4gYSBzYW5lIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgRW1iZXIg
PSB7fTsKLX0KLQotLy8gRGVmYXVsdCBpbXBvcnRzLCBleHBvcnRzIGFuZCBsb29rdXAgdG8gdGhl
IGdsb2JhbCBvYmplY3Q7Ci12YXIgaW1wb3J0cyA9IEVtYmVyLmltcG9ydHMgPSBFbWJlci5pbXBv
cnRzIHx8IHRoaXM7Ci12YXIgZXhwb3J0cyA9IEVtYmVyLmV4cG9ydHMgPSBFbWJlci5leHBvcnRz
IHx8IHRoaXM7Ci12YXIgbG9va3VwICA9IEVtYmVyLmxvb2t1cCAgPSBFbWJlci5sb29rdXAgIHx8
IHRoaXM7Ci0KLS8vIGFsaWFzZXMgbmVlZGVkIHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3Zp
bmcgdGhlIGdsb2JhbCBjb250ZXh0Ci1leHBvcnRzLkVtID0gZXhwb3J0cy5FbWJlciA9IEVtID0g
RW1iZXI7Ci0KLS8vIE1ha2Ugc3VyZSB0aGVzZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFs
cmVhZHkgZGVmaW5lZCBvciBub3QKLQotRW1iZXIuaXNOYW1lc3BhY2UgPSB0cnVlOwotCi1FbWJl
ci50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gIkVtYmVyIjsgfTsKLQotCi0vKioKLSAg
QHByb3BlcnR5IFZFUlNJT04KLSAgQHR5cGUgU3RyaW5nCi0gIEBkZWZhdWx0ICcxLjMuMScKLSAg
QHN0YXRpYwotKi8KLUVtYmVyLlZFUlNJT04gPSAnMS4zLjEnOwotCi0vKioKLSAgU3RhbmRhcmQg
ZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMuIFlvdSBjYW4gZGVmaW5lIHRoZXNlIGluIGEgZ2xvYmFs
IGBFbWJlckVOVmAKLSAgdmFyaWFibGUgYmVmb3JlIGxvYWRpbmcgRW1iZXIgdG8gY29udHJvbCB2
YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCi0KLSAgRm9yIGJhY2t3YXJkcyBjb21wYXRp
YmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBFbWJlciB0aGUgZ2xvYmFsIGBFTlZgCi0g
IHZhcmlhYmxlIHdpbGwgYmUgdXNlZCBpZiBgRW1iZXJFTlZgIGlzIG5vdCBkZWZpbmVkLgotCi0g
IEBwcm9wZXJ0eSBFTlYKLSAgQHR5cGUgSGFzaAotKi8KLQotLy8gVGhpcyBuZWVkcyB0byBiZSBr
ZXB0IGluIHN5bmMgd2l0aCB0aGUgbG9naWMgaW4KLS8vIGBwYWNrYWdlcy9lbWJlci1kZWJ1Zy9s
aWIvbWFpbi5qc2AuCi1pZiAoRW1iZXIuRU5WKSB7Ci0gIC8vIGRvIG5vdGhpbmcgaWYgRW1iZXIu
RU5WIGlzIGFscmVhZHkgc2V0dXAKLX0gZWxzZSBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBF
bWJlckVOVikgewotICBFbWJlci5FTlYgPSBFbWJlckVOVjsKLX0gZWxzZSBpZigndW5kZWZpbmVk
JyAhPT0gdHlwZW9mIEVOVikgewotICBFbWJlci5FTlYgPSBFTlY7Ci19IGVsc2UgewotICBFbWJl
ci5FTlYgPSB7fTsKLX0KLQotRW1iZXIuY29uZmlnID0gRW1iZXIuY29uZmlnIHx8IHt9OwotCi0v
LyBXZSBkaXNhYmxlIHRoZSBSQU5HRSBBUEkgYnkgZGVmYXVsdCBmb3IgcGVyZm9ybWFuY2UgcmVh
c29ucwotaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuRU5WLkRJU0FCTEVfUkFOR0Vf
QVBJKSB7Ci0gIEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQSSA9IHRydWU7Ci19Ci0KLWlmICgi
dW5kZWZpbmVkIiA9PT0gdHlwZW9mIE1ldGFtb3JwaEVOVikgewotICBleHBvcnRzLk1ldGFtb3Jw
aEVOViA9IHt9OwotfQotCi1NZXRhbW9ycGhFTlYuRElTQUJMRV9SQU5HRV9BUEkgPSBFbWJlci5F
TlYuRElTQUJMRV9SQU5HRV9BUEk7Ci0KLS8qKgotICBIYXNoIG9mIGVuYWJsZWQgQ2FuYXJ5IGZl
YXR1cmVzLiBBZGQgdG8gYmVmb3JlIGNyZWF0aW5nIHlvdXIgYXBwbGljYXRpb24uCi0KLSAgWW91
IGNhbiBhbHNvIGRlZmluZSBgRU5WLkZFQVRVUkVTYCBpZiB5b3UgbmVlZCB0byBlbmFibGUgZmVh
dHVyZXMgZmxhZ2dlZCBhdCBydW50aW1lLgotCi0gIEBwcm9wZXJ0eSBGRUFUVVJFUwotICBAdHlw
ZSBIYXNoCi0qLwotCi1FbWJlci5GRUFUVVJFUyA9IEVtYmVyLkVOVi5GRUFUVVJFUyB8fCB7fTsK
LQotLyoqCi0gIFRlc3QgdGhhdCBhIGZlYXR1cmUgaXMgZW5hYmxlZC4gUGFyc2VkIGJ5IEVtYmVy
J3MgYnVpbGQgdG9vbHMgdG8gbGVhdmUKLSAgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG91dCBvZiBi
ZXRhL3N0YWJsZSBidWlsZHMuCi0KLSAgWW91IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBjb25m
aWd1cmF0aW9uIG9wdGlvbnM6Ci0KLSAgKiBgRU5WLkVOQUJMRV9BTExfRkVBVFVSRVNgIC0gZm9y
Y2UgYWxsIGZlYXR1cmVzIHRvIGJlIGVuYWJsZWQuCi0gICogYEVOVi5FTkFCTEVfT1BUSU9OQUxf
RkVBVFVSRVNgIC0gZW5hYmxlIGFueSBmZWF0dXJlcyB0aGF0IGhhdmUgbm90IGJlZW4gZXhwbGlj
aXRseQotICAgIGVuYWJsZWQvZGlzYWJsZWQuCi0KLSAgQG1ldGhvZCBpc0VuYWJsZWQKLSAgQHBh
cmFtIHtzdHJpbmd9IGZlYXR1cmUKLSovCi0KLUVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCA9IGZ1
bmN0aW9uKGZlYXR1cmUpIHsKLSAgdmFyIGZlYXR1cmVWYWx1ZSA9IEVtYmVyLkZFQVRVUkVTW2Zl
YXR1cmVdOwotCi0gIGlmIChFbWJlci5FTlYuRU5BQkxFX0FMTF9GRUFUVVJFUykgewotICAgIHJl
dHVybiB0cnVlOwotICB9IGVsc2UgaWYgKGZlYXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJl
VmFsdWUgPT09IGZhbHNlIHx8IGZlYXR1cmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgcmV0
dXJuIGZlYXR1cmVWYWx1ZTsKLSAgfSBlbHNlIGlmIChFbWJlci5FTlYuRU5BQkxFX09QVElPTkFM
X0ZFQVRVUkVTKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZh
bHNlOwotICB9Ci19OwotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBCT09UU1RSQVAKLS8vCi0KLS8qKgotICBEZXRlcm1p
bmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGVuaGFuY2VzIHNvbWUgYnVpbHQtaW4gb2JqZWN0IHBy
b3RvdHlwZXMgdG8KLSAgcHJvdmlkZSBhIG1vcmUgZnJpZW5kbHkgQVBJLiBJZiBlbmFibGVkLCBh
IGZldyBtZXRob2RzIHdpbGwgYmUgYWRkZWQgdG8KLSAgYEZ1bmN0aW9uYCwgYFN0cmluZ2AsIGFu
ZCBgQXJyYXlgLiBgT2JqZWN0LnByb3RvdHlwZWAgd2lsbCBub3QgYmUgZW5oYW5jZWQsCi0gIHdo
aWNoIGlzIHRoZSBvbmUgdGhhdCBjYXVzZXMgbW9zdCB0cm91YmxlIGZvciBwZW9wbGUuCi0KLSAg
SW4gZ2VuZXJhbCB3ZSByZWNvbW1lbmQgbGVhdmluZyB0aGlzIG9wdGlvbiBzZXQgdG8gdHJ1ZSBz
aW5jZSBpdCByYXJlbHkKLSAgY29uZmxpY3RzIHdpdGggb3RoZXIgY29kZS4gSWYgeW91IG5lZWQg
dG8gdHVybiBpdCBvZmYgaG93ZXZlciwgeW91IGNhbgotICBkZWZpbmUgYW4gYEVOVi5FWFRFTkRf
UFJPVE9UWVBFU2AgY29uZmlnIHRvIGRpc2FibGUgaXQuCi0KLSAgQHByb3BlcnR5IEVYVEVORF9Q
Uk9UT1RZUEVTCi0gIEB0eXBlIEJvb2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkVY
VEVORF9QUk9UT1RZUEVTID0gRW1iZXIuRU5WLkVYVEVORF9QUk9UT1RZUEVTOwotCi1pZiAodHlw
ZW9mIEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSAndW5kZWZpbmVkJykgewotICBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUyA9IHRydWU7Ci19Ci0KLS8qKgotICBEZXRlcm1pbmVzIHdoZXRoZXIg
RW1iZXIgbG9ncyBhIGZ1bGwgc3RhY2sgdHJhY2UgZHVyaW5nIGRlcHJlY2F0aW9uIHdhcm5pbmdz
Ci0KLSAgQHByb3BlcnR5IExPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OCi0gIEB0eXBlIEJv
b2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJF
Q0FUSU9OID0gKEVtYmVyLkVOVi5MT0dfU1RBQ0tUUkFDRV9PTl9ERVBSRUNBVElPTiAhPT0gZmFs
c2UpOwotCi0vKioKLSAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVtYmVyIHNob3VsZCBhZGQgRUNNQVNj
cmlwdCA1IHNoaW1zIHRvIG9sZGVyIGJyb3dzZXJzLgotCi0gIEBwcm9wZXJ0eSBTSElNX0VTNQot
ICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTCi0qLwot
RW1iZXIuU0hJTV9FUzUgPSAoRW1iZXIuRU5WLlNISU1fRVM1ID09PSBmYWxzZSkgPyBmYWxzZSA6
IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTOwotCi0vKioKLSAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVt
YmVyIGxvZ3MgaW5mbyBhYm91dCB2ZXJzaW9uIG9mIHVzZWQgbGlicmFyaWVzCi0KLSAgQHByb3Bl
cnR5IExPR19WRVJTSU9OCi0gIEB0eXBlIEJvb2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVt
YmVyLkxPR19WRVJTSU9OID0gKEVtYmVyLkVOVi5MT0dfVkVSU0lPTiA9PT0gZmFsc2UpID8gZmFs
c2UgOiB0cnVlOwotCi0vKioKLSAgRW1wdHkgZnVuY3Rpb24uIFVzZWZ1bCBmb3Igc29tZSBvcGVy
YXRpb25zLiBBbHdheXMgcmV0dXJucyBgdGhpc2AuCi0KLSAgQG1ldGhvZCBLCi0gIEBwcml2YXRl
Ci0gIEByZXR1cm4ge09iamVjdH0KLSovCi1FbWJlci5LID0gZnVuY3Rpb24oKSB7IHJldHVybiB0
aGlzOyB9OwotCi0KLS8vIFN0dWIgb3V0IHRoZSBtZXRob2RzIGRlZmluZWQgYnkgdGhlIGVtYmVy
LWRlYnVnIHBhY2thZ2UgaW4gY2FzZSBpdCdzIG5vdCBsb2FkZWQKLQotaWYgKCd1bmRlZmluZWQn
ID09PSB0eXBlb2YgRW1iZXIuYXNzZXJ0KSB7IEVtYmVyLmFzc2VydCA9IEVtYmVyLks7IH0KLWlm
ICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyLndhcm4pIHsgRW1iZXIud2FybiA9IEVtYmVy
Lks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyLmRlYnVnKSB7IEVtYmVyLmRl
YnVnID0gRW1iZXIuSzsgfQotaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuZGVwcmVj
YXRlKSB7IEVtYmVyLmRlcHJlY2F0ZSA9IEVtYmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0g
dHlwZW9mIEVtYmVyLmRlcHJlY2F0ZUZ1bmMpIHsKLSAgRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGZ1
bmN0aW9uKF8sIGZ1bmMpIHsgcmV0dXJuIGZ1bmM7IH07Ci19Ci0KLS8qKgotICBQcmV2aW91c2x5
IHdlIHVzZWQgYEVtYmVyLiQudXVpZGAsIGhvd2V2ZXIgYCQudXVpZGAgaGFzIGJlZW4gcmVtb3Zl
ZCBmcm9tCi0gIGpRdWVyeSBtYXN0ZXIuIFdlJ2xsIGp1c3QgYm9vdHN0cmFwIG91ciBvd24gdXVp
ZCBub3cuCi0KLSAgQHByb3BlcnR5IHV1aWQKLSAgQHR5cGUgTnVtYmVyCi0gIEBwcml2YXRlCi0q
LwotRW1iZXIudXVpZCA9IDA7Ci0KLS8qKgotICBNZXJnZSB0aGUgY29udGVudHMgb2YgdHdvIG9i
amVjdHMgdG9nZXRoZXIgaW50byB0aGUgZmlyc3Qgb2JqZWN0LgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgRW1iZXIubWVyZ2Uoe2ZpcnN0OiAnVG9tJ30sIHtsYXN0OiAnRGFsZSd9KTsgLy8ge2ZpcnN0
OiAnVG9tJywgbGFzdDogJ0RhbGUnfQotICB2YXIgYSA9IHtmaXJzdDogJ1llaHVkYSd9LCBiID0g
e2xhc3Q6ICdLYXR6J307Ci0gIEVtYmVyLm1lcmdlKGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1ll
aHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0ge2xhc3Q6ICdLYXR6J30KLSAgYGBgCi0KLSAgQG1l
dGhvZCBtZXJnZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5hbCBUaGUg
b2JqZWN0IHRvIG1lcmdlIGludG8KLSAgQHBhcmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVj
dCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbQotICBAcmV0dXJuIHtPYmplY3R9Ci0qLwotRW1iZXIu
bWVyZ2UgPSBmdW5jdGlvbihvcmlnaW5hbCwgdXBkYXRlcykgewotICBmb3IgKHZhciBwcm9wIGlu
IHVwZGF0ZXMpIHsKLSAgICBpZiAoIXVwZGF0ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29u
dGludWU7IH0KLSAgICBvcmlnaW5hbFtwcm9wXSA9IHVwZGF0ZXNbcHJvcF07Ci0gIH0KLSAgcmV0
dXJuIG9yaWdpbmFsOwotfTsKLQotLyoqCi0gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZh
bHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLiBUaGlzIGF2b2lkcyBlcnJvcnMKLSAgZnJvbSBKU0xp
bnQgY29tcGxhaW5pbmcgYWJvdXQgdXNlIG9mID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkK
LSAgY29uZnVzaW5nLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuaXNOb25lKCk7ICAgICAg
ICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzTm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQot
ICBFbWJlci5pc05vbmUodW5kZWZpbmVkKTsgICAgIC8vIHRydWUKLSAgRW1iZXIuaXNOb25lKCcn
KTsgICAgICAgICAgICAvLyBmYWxzZQotICBFbWJlci5pc05vbmUoW10pOyAgICAgICAgICAgIC8v
IGZhbHNlCi0gIEVtYmVyLmlzTm9uZShmdW5jdGlvbigpIHt9KTsgIC8vIGZhbHNlCi0gIGBgYAot
Ci0gIEBtZXRob2QgaXNOb25lCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBW
YWx1ZSB0byB0ZXN0Ci0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1iZXIuaXNOb25lID0gZnVu
Y3Rpb24ob2JqKSB7Ci0gIHJldHVybiBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7
Ci19OwotRW1iZXIubm9uZSA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLm5vbmUgaXMgZGVw
cmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5pc05vbmUgaW5zdGVhZC4iLCBFbWJlci5pc05vbmUp
OwotCi0vKioKLSAgVmVyaWZpZXMgdGhhdCBhIHZhbHVlIGlzIGBudWxsYCBvciBhbiBlbXB0eSBz
dHJpbmcsIGVtcHR5IGFycmF5LAotICBvciBlbXB0eSBmdW5jdGlvbi4KLQotICBDb25zdHJhaW5z
IHRoZSBydWxlcyBvbiBgRW1iZXIuaXNOb25lYCBieSByZXR1cm5pbmcgZmFsc2UgZm9yIGVtcHR5
Ci0gIHN0cmluZyBhbmQgZW1wdHkgYXJyYXlzLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIu
aXNFbXB0eSgpOyAgICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkobnVsbCk7
ICAgICAgICAgICAgLy8gdHJ1ZQotICBFbWJlci5pc0VtcHR5KHVuZGVmaW5lZCk7ICAgICAgIC8v
IHRydWUKLSAgRW1iZXIuaXNFbXB0eSgnJyk7ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVy
LmlzRW1wdHkoW10pOyAgICAgICAgICAgICAgLy8gdHJ1ZQotICBFbWJlci5pc0VtcHR5KCdBZGFt
IEhhd2tpbnMnKTsgIC8vIGZhbHNlCi0gIEVtYmVyLmlzRW1wdHkoWzAsMSwyXSk7ICAgICAgICAg
Ly8gZmFsc2UKLSAgYGBgCi0KLSAgQG1ldGhvZCBpc0VtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBh
cmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0ZXN0Ci0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwot
RW1iZXIuaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikgewotICByZXR1cm4gRW1iZXIuaXNOb25lKG9i
aikgfHwgKG9iai5sZW5ndGggPT09IDAgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykgfHwg
KHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIEVtYmVyLmdldChvYmosICdsZW5ndGgnKSA9PT0g
MCk7Ci19OwotRW1iZXIuZW1wdHkgPSBFbWJlci5kZXByZWNhdGVGdW5jKCJFbWJlci5lbXB0eSBp
cyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLmlzRW1wdHkgaW5zdGVhZC4iLCBFbWJlci5p
c0VtcHR5KSA7Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBOb2Rl
ICovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLS8qKgotICBQbGF0Zm9ybSBzcGVj
aWZpYyBtZXRob2RzIGFuZCBmZWF0dXJlIGRldGVjdG9ycyBuZWVkZWQgYnkgdGhlIGZyYW1ld29y
ay4KLQotICBAY2xhc3MgcGxhdGZvcm0KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0q
LwotdmFyIHBsYXRmb3JtID0gRW1iZXIucGxhdGZvcm0gPSB7fTsKLQotCi0vKioKLSAgSWRlbnRp
Y2FsIHRvIGBPYmplY3QuY3JlYXRlKClgLiBJbXBsZW1lbnRzIGlmIG5vdCBhdmFpbGFibGUgbmF0
aXZlbHkuCi0KLSAgQG1ldGhvZCBjcmVhdGUKLSAgQGZvciBFbWJlcgotKi8KLUVtYmVyLmNyZWF0
ZSA9IE9iamVjdC5jcmVhdGU7Ci0KLS8vIElFOCBoYXMgT2JqZWN0LmNyZWF0ZSBidXQgaXQgY291
bGRuJ3QgdHJlYXQgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi1pZiAoRW1iZXIuY3JlYXRlKSB7Ci0g
IGlmIChFbWJlci5jcmVhdGUoe2E6IDF9LCB7YToge3ZhbHVlOiAyfX0pLmEgIT09IDIpIHsKLSAg
ICBFbWJlci5jcmVhdGUgPSBudWxsOwotICB9Ci19Ci0KLS8vIFNUVUJfT0JKRUNUX0NSRUFURSBh
bGxvd3MgdXMgdG8gb3ZlcnJpZGUgb3RoZXIgbGlicmFyaWVzIHRoYXQgc3R1YgotLy8gT2JqZWN0
LmNyZWF0ZSBkaWZmZXJlbnQgdGhhbiB3ZSB3b3VsZCBwcmVmZXIKLWlmICghRW1iZXIuY3JlYXRl
IHx8IEVtYmVyLkVOVi5TVFVCX09CSkVDVF9DUkVBVEUpIHsKLSAgdmFyIEsgPSBmdW5jdGlvbigp
IHt9OwotCi0gIEVtYmVyLmNyZWF0ZSA9IGZ1bmN0aW9uKG9iaiwgcHJvcHMpIHsKLSAgICBLLnBy
b3RvdHlwZSA9IG9iajsKLSAgICBvYmogPSBuZXcgSygpOwotICAgIGlmIChwcm9wcykgewotICAg
ICAgSy5wcm90b3R5cGUgPSBvYmo7Ci0gICAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7Ci0g
ICAgICAgIEsucHJvdG90eXBlW3Byb3BdID0gcHJvcHNbcHJvcF0udmFsdWU7Ci0gICAgICB9Ci0g
ICAgICBvYmogPSBuZXcgSygpOwotICAgIH0KLSAgICBLLnByb3RvdHlwZSA9IG51bGw7Ci0KLSAg
ICByZXR1cm4gb2JqOwotICB9OwotCi0gIEVtYmVyLmNyZWF0ZS5pc1NpbXVsYXRlZCA9IHRydWU7
Ci19Ci0KLXZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKLXZhciBj
YW5SZWRlZmluZVByb3BlcnRpZXMsIGNhbkRlZmluZVByb3BlcnR5T25ET007Ci0KLS8vIENhdGNo
IElFOCB3aGVyZSBPYmplY3QuZGVmaW5lUHJvcGVydHkgZXhpc3RzIGJ1dCBvbmx5IHdvcmtzIG9u
IERPTSBlbGVtZW50cwotaWYgKGRlZmluZVByb3BlcnR5KSB7Ci0gIHRyeSB7Ci0gICAgZGVmaW5l
UHJvcGVydHkoe30sICdhJyx7Z2V0OmZ1bmN0aW9uKCkge319KTsKLSAgfSBjYXRjaCAoZSkgewot
ICAgIGRlZmluZVByb3BlcnR5ID0gbnVsbDsKLSAgfQotfQotCi1pZiAoZGVmaW5lUHJvcGVydHkp
IHsKLSAgLy8gRGV0ZWN0cyBhIGJ1ZyBpbiBBbmRyb2lkIDwzLjIgd2hlcmUgeW91IGNhbm5vdCBy
ZWRlZmluZSBhIHByb3BlcnR5IHVzaW5nCi0gIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBvbmNl
IGFjY2Vzc29ycyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuCi0gIGNhblJlZGVmaW5lUHJvcGVydGll
cyA9IChmdW5jdGlvbigpIHsKLSAgICB2YXIgb2JqID0ge307Ci0KLSAgICBkZWZpbmVQcm9wZXJ0
eShvYmosICdhJywgewotICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgZW51bWVyYWJs
ZTogdHJ1ZSwKLSAgICAgIGdldDogZnVuY3Rpb24oKSB7IH0sCi0gICAgICBzZXQ6IGZ1bmN0aW9u
KCkgeyB9Ci0gICAgfSk7Ci0KLSAgICBkZWZpbmVQcm9wZXJ0eShvYmosICdhJywgewotICAgICAg
Y29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgIHdyaXRh
YmxlOiB0cnVlLAotICAgICAgdmFsdWU6IHRydWUKLSAgICB9KTsKLQotICAgIHJldHVybiBvYmou
YSA9PT0gdHJ1ZTsKLSAgfSkoKTsKLQotICAvLyBUaGlzIGlzIGZvciBTYWZhcmkgNS4wLCB3aGlj
aCBzdXBwb3J0cyBPYmplY3QuZGVmaW5lUHJvcGVydHksIGJ1dCBub3QKLSAgLy8gb24gRE9NIG5v
ZGVzLgotICBjYW5EZWZpbmVQcm9wZXJ0eU9uRE9NID0gKGZ1bmN0aW9uKCkgewotICAgIHRyeSB7
Ci0gICAgICBkZWZpbmVQcm9wZXJ0eShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2Rl
ZmluZVByb3BlcnR5T25ET00nLCB7fSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGNhdGNo
KGUpIHsgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9KSgpOwotCi0gIGlmICghY2FuUmVkZWZp
bmVQcm9wZXJ0aWVzKSB7Ci0gICAgZGVmaW5lUHJvcGVydHkgPSBudWxsOwotICB9IGVsc2UgaWYg
KCFjYW5EZWZpbmVQcm9wZXJ0eU9uRE9NKSB7Ci0gICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlv
bihvYmosIGtleU5hbWUsIGRlc2MpIHsKLSAgICAgIHZhciBpc05vZGU7Ci0KLSAgICAgIGlmICh0
eXBlb2YgTm9kZSA9PT0gIm9iamVjdCIpIHsKLSAgICAgICAgaXNOb2RlID0gb2JqIGluc3RhbmNl
b2YgTm9kZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzTm9kZSA9IHR5cGVvZiBvYmogPT09
ICJvYmplY3QiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgPT09ICJudW1iZXIiICYmIHR5cGVvZiBv
Ymoubm9kZU5hbWUgPT09ICJzdHJpbmciOwotICAgICAgfQotCi0gICAgICBpZiAoaXNOb2RlKSB7
Ci0gICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBoYXZlIGEgd2FybmluZyBoZXJlPwotICAgICAg
ICByZXR1cm4gKG9ialtrZXlOYW1lXSA9IGRlc2MudmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MpOwot
ICAgICAgfQotICAgIH07Ci0gIH0KLX0KLQotLyoqCi1AY2xhc3MgcGxhdGZvcm0KLUBuYW1lc3Bh
Y2UgRW1iZXIKLSovCi0KLS8qKgotICBJZGVudGljYWwgdG8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0
eSgpYC4gSW1wbGVtZW50cyBhcyBtdWNoIGZ1bmN0aW9uYWxpdHkKLSAgYXMgcG9zc2libGUgaWYg
bm90IGF2YWlsYWJsZSBuYXRpdmVseS4KLQotICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Ci0gIEBw
YXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBtb2RpZnkKLSAgQHBhcmFtIHtTdHJpbmd9
IGtleU5hbWUgcHJvcGVydHkgbmFtZSB0byBtb2RpZnkKLSAgQHBhcmFtIHtPYmplY3R9IGRlc2Mg
ZGVzY3JpcHRvciBoYXNoCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotcGxhdGZvcm0uZGVmaW5lUHJv
cGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsKLQotLyoqCi0gIFNldCB0byB0cnVlIGlmIHRoZSBwbGF0
Zm9ybSBzdXBwb3J0cyBuYXRpdmUgZ2V0dGVycyBhbmQgc2V0dGVycy4KLQotICBAcHJvcGVydHkg
aGFzUHJvcGVydHlBY2Nlc3NvcnMKLSAgQGZpbmFsCi0qLwotcGxhdGZvcm0uaGFzUHJvcGVydHlB
Y2Nlc3NvcnMgPSB0cnVlOwotCi1pZiAoIXBsYXRmb3JtLmRlZmluZVByb3BlcnR5KSB7Ci0gIHBs
YXRmb3JtLmhhc1Byb3BlcnR5QWNjZXNzb3JzID0gZmFsc2U7Ci0KLSAgcGxhdGZvcm0uZGVmaW5l
UHJvcGVydHkgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIGRlc2MpIHsKLSAgICBpZiAoIWRlc2Mu
Z2V0KSB7IG9ialtrZXlOYW1lXSA9IGRlc2MudmFsdWU7IH0KLSAgfTsKLQotICBwbGF0Zm9ybS5k
ZWZpbmVQcm9wZXJ0eS5pc1NpbXVsYXRlZCA9IHRydWU7Ci19Ci0KLWlmIChFbWJlci5FTlYuTUFO
REFUT1JZX1NFVFRFUiAmJiAhcGxhdGZvcm0uaGFzUHJvcGVydHlBY2Nlc3NvcnMpIHsKLSAgRW1i
ZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIgPSBmYWxzZTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qanNoaW50IG5ld2NhcDpmYWxzZSovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0
YWwKLSovCi0KLS8vIE5PVEU6IFRoZXJlIGlzIGEgYnVnIGluIGpzaGludCB0aGF0IGRvZXNuJ3Qg
cmVjb2duaXplIGBPYmplY3QoKWAgd2l0aG91dCBgbmV3YAotLy8gYXMgYmVpbmcgb2sgdW5sZXNz
IGJvdGggYG5ld2NhcDpmYWxzZWAgYW5kIG5vdCBgdXNlIHN0cmljdGAuCi0vLyBodHRwczovL2dp
dGh1Yi5jb20vanNoaW50L2pzaGludC9pc3N1ZXMvMzkyCi0KLS8vIFRlc3RpbmcgdGhpcyBpcyBu
b3QgaWRlYWwsIGJ1dCB3ZSB3YW50IHRvIHVzZSBuYXRpdmUgZnVuY3Rpb25zCi0vLyBpZiBhdmFp
bGFibGUsIGJ1dCBub3QgdG8gdXNlIHZlcnNpb25zIGNyZWF0ZWQgYnkgbGlicmFyaWVzIGxpa2Ug
UHJvdG90eXBlCi12YXIgaXNOYXRpdmVGdW5jID0gZnVuY3Rpb24oZnVuYykgewotICAvLyBUaGlz
IHNob3VsZCBwcm9iYWJseSB3b3JrIGluIGFsbCBicm93c2VycyBsaWtlbHkgdG8gaGF2ZSBFUzUg
YXJyYXkgbWV0aG9kcwotICByZXR1cm4gZnVuYyAmJiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJp
bmcuY2FsbChmdW5jKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykgPiAtMTsKLX07Ci0KLS8vIEZy
b206IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNl
L0dsb2JhbF9PYmplY3RzL2FycmF5L21hcAotdmFyIGFycmF5TWFwID0gaXNOYXRpdmVGdW5jKEFy
cmF5LnByb3RvdHlwZS5tYXApID8gQXJyYXkucHJvdG90eXBlLm1hcCA6IGZ1bmN0aW9uKGZ1biAv
KiwgdGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0cmljdCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQg
MCB8fCB0aGlzID09PSBudWxsKSB7Ci0gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0K
LSAgdmFyIHQgPSBPYmplY3QodGhpcyk7Ci0gIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAg
aWYgKHR5cGVvZiBmdW4gIT09ICJmdW5jdGlvbiIpIHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9y
KCk7Ci0gIH0KLQotICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbik7Ci0gIHZhciB0aGlzcCA9IGFy
Z3VtZW50c1sxXTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChp
IGluIHQpIHsKLSAgICAgIHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKLSAg
ICB9Ci0gIH0KLQotICByZXR1cm4gcmVzOwotfTsKLQotLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9w
ZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJy
YXkvZm9yZWFjaAotdmFyIGFycmF5Rm9yRWFjaCA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5
cGUuZm9yRWFjaCkgPyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA6IGZ1bmN0aW9uKGZ1biAvKiwg
dGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0cmljdCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQgMCB8
fCB0aGlzID09PSBudWxsKSB7Ci0gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0KLSAg
dmFyIHQgPSBPYmplY3QodGhpcyk7Ci0gIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAgaWYg
KHR5cGVvZiBmdW4gIT09ICJmdW5jdGlvbiIpIHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7
Ci0gIH0KLQotICB2YXIgdGhpc3AgPSBhcmd1bWVudHNbMV07Ci0gIGZvciAodmFyIGkgPSAwOyBp
IDwgbGVuOyBpKyspIHsKLSAgICBpZiAoaSBpbiB0KSB7Ci0gICAgICBmdW4uY2FsbCh0aGlzcCwg
dFtpXSwgaSwgdCk7Ci0gICAgfQotICB9Ci19OwotCi12YXIgYXJyYXlJbmRleE9mID0gaXNOYXRp
dmVGdW5jKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSA/IEFycmF5LnByb3RvdHlwZS5pbmRleE9m
IDogZnVuY3Rpb24gKG9iaiwgZnJvbUluZGV4KSB7Ci0gIGlmIChmcm9tSW5kZXggPT09IG51bGwg
fHwgZnJvbUluZGV4ID09PSB1bmRlZmluZWQpIHsgZnJvbUluZGV4ID0gMDsgfQotICBlbHNlIGlm
IChmcm9tSW5kZXggPCAwKSB7IGZyb21JbmRleCA9IE1hdGgubWF4KDAsIHRoaXMubGVuZ3RoICsg
ZnJvbUluZGV4KTsgfQotICBmb3IgKHZhciBpID0gZnJvbUluZGV4LCBqID0gdGhpcy5sZW5ndGg7
IGkgPCBqOyBpKyspIHsKLSAgICBpZiAodGhpc1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9Ci0g
IH0KLSAgcmV0dXJuIC0xOwotfTsKLQotLyoqCi0gIEFycmF5IHBvbHlmaWxscyB0byBzdXBwb3J0
IEVTNSBmZWF0dXJlcyBpbiBvbGRlciBicm93c2Vycy4KLQotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBwcm9wZXJ0eSBBcnJheVBvbHlmaWxscwotKi8KLUVtYmVyLkFycmF5UG9seWZpbGxzID0gewot
ICBtYXA6IGFycmF5TWFwLAotICBmb3JFYWNoOiBhcnJheUZvckVhY2gsCi0gIGluZGV4T2Y6IGFy
cmF5SW5kZXhPZgotfTsKLQotaWYgKEVtYmVyLlNISU1fRVM1KSB7Ci0gIGlmICghQXJyYXkucHJv
dG90eXBlLm1hcCkgewotICAgIEFycmF5LnByb3RvdHlwZS5tYXAgPSBhcnJheU1hcDsKLSAgfQot
Ci0gIGlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKLSAgICBBcnJheS5wcm90b3R5cGUu
Zm9yRWFjaCA9IGFycmF5Rm9yRWFjaDsKLSAgfQotCi0gIGlmICghQXJyYXkucHJvdG90eXBlLmlu
ZGV4T2YpIHsKLSAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGFycmF5SW5kZXhPZjsKLSAg
fQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGVycm9yUHJvcHMgPSBbJ2Rl
c2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywg
J251bWJlcicsICdzdGFjayddOwotCi0vKioKLSAgQSBzdWJjbGFzcyBvZiB0aGUgSmF2YVNjcmlw
dCBFcnJvciBvYmplY3QgZm9yIHVzZSBpbiBFbWJlci4KLQotICBAY2xhc3MgRXJyb3IKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFcnJvcgotICBAY29uc3RydWN0b3IKLSovCi1FbWJl
ci5FcnJvciA9IGZ1bmN0aW9uKCkgewotICB2YXIgdG1wID0gRXJyb3IuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKLQotICAvLyBBZGRzIGEgYHN0YWNrYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gZXJy
b3Igb2JqZWN0IHRoYXQgd2lsbCB5aWVsZCB0aGUKLSAgLy8gc3RhY2sgdHJhY2UgYXQgdGhlIHRp
bWUgY2FwdHVyZVN0YWNrVHJhY2Ugd2FzIGNhbGxlZC4KLSAgLy8gV2hlbiBjb2xsZWN0aW5nIHRo
ZSBzdGFjayB0cmFjZSBhbGwgZnJhbWVzIGFib3ZlIHRoZSB0b3Btb3N0IGNhbGwKLSAgLy8gdG8g
dGhpcyBmdW5jdGlvbiwgaW5jbHVkaW5nIHRoYXQgY2FsbCwgd2lsbCBiZSBsZWZ0IG91dCBvZiB0
aGUKLSAgLy8gc3RhY2sgdHJhY2UuCi0gIC8vIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugd2UgY2Fu
IGhpZGUgRW1iZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscwotICAvLyB0aGF0IGFyZSBub3QgdmVy
eSBoZWxwZnVsIGZvciB0aGUgdXNlci4KLSAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7
Ci0gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRW1iZXIuRXJyb3IpOwotICB9Ci0g
IC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0
IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3b3JrLgotICBmb3IgKHZhciBp
ZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsKLSAgICB0aGlzW2Vycm9y
UHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTsKLSAgfQotfTsKLQotRW1iZXIuRXJy
b3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Ci0KLS8vIC4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8v
IEVSUk9SIEhBTkRMSU5HCi0vLwotCi0vKioKLSAgQSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQg
dG8gYEVtYmVyLm9uZXJyb3JgIHRvIGJlIGNhbGxlZCB3aGVuIEVtYmVyCi0gIGludGVybmFscyBl
bmNvdW50ZXIgYW4gZXJyb3IuIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWFsaXplZCBlcnJvciBo
YW5kbGluZwotICBhbmQgcmVwb3J0aW5nIGNvZGUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJl
ci5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHsKLSAgICBFbS4kLmFqYXgoJy9yZXBvcnQtZXJy
b3InLCAnUE9TVCcsIHsKLSAgICAgIHN0YWNrOiBlcnJvci5zdGFjaywKLSAgICAgIG90aGVySW5m
b3JtYXRpb246ICd3aGF0ZXZlciBhcHAgc3RhdGUgeW91IHdhbnQgdG8gcHJvdmlkZScKLSAgICB9
KTsKLSAgfTsKLSAgYGBgCi0KLSAgQGV2ZW50IG9uZXJyb3IKLSAgQGZvciBFbWJlcgotICBAcGFy
YW0ge0V4Y2VwdGlvbn0gZXJyb3IgdGhlIGVycm9yIG9iamVjdAotKi8KLUVtYmVyLm9uZXJyb3Ig
PSBudWxsOwotCi0vKioKLSAgV3JhcCBjb2RlIGJsb2NrIGluIGEgdHJ5L2NhdGNoIGlmIGBFbWJl
ci5vbmVycm9yYCBpcyBzZXQuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoYW5kbGVFcnJvcnMK
LSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCi0gIEBwYXJhbSBbY29udGV4
dF0KLSovCi1FbWJlci5oYW5kbGVFcnJvcnMgPSBmdW5jdGlvbihmdW5jLCBjb250ZXh0KSB7Ci0g
IC8vIFVuZm9ydHVuYXRlbHkgaW4gc29tZSBicm93c2VycyB3ZSBsb3NlIHRoZSBiYWNrdHJhY2Ug
aWYgd2UgcmV0aHJvdyB0aGUgZXhpc3RpbmcgZXJyb3IsCi0gIC8vIHNvIGluIHRoZSBldmVudCB0
aGF0IHdlIGRvbid0IGhhdmUgYW4gYG9uZXJyb3JgIGhhbmRsZXIgd2UgZG9uJ3Qgd3JhcCBpbiBh
IHRyeS9jYXRjaAotICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIEVtYmVyLm9uZXJyb3IpIHsK
LSAgICB0cnkgewotICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0IHx8IHRoaXMpOwotICAg
IH0gY2F0Y2ggKGVycm9yKSB7Ci0gICAgICBFbWJlci5vbmVycm9yKGVycm9yKTsKLSAgICB9Ci0g
IH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0IHx8IHRoaXMpOwotICB9Ci19
OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFs
Ci0qLwotCi0vKioKLSAgUHJlZml4IHVzZWQgZm9yIGd1aWRzIHRocm91Z2ggb3V0IEVtYmVyLgot
ICBAcHJpdmF0ZQotKi8KLUVtYmVyLkdVSURfUFJFRklYID0gJ2VtYmVyJzsKLQotCi12YXIgb19k
ZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5LAotICAgIG9fY3Jl
YXRlID0gRW1iZXIuY3JlYXRlLAotICAgIC8vIFVzZWQgZm9yIGd1aWQgZ2VuZXJhdGlvbi4uLgot
ICAgIEdVSURfS0VZID0gJ19fZW1iZXInKyAoKyBuZXcgRGF0ZSgpKSwKLSAgICB1dWlkICAgICAg
ICAgPSAwLAotICAgIG51bWJlckNhY2hlICA9IFtdLAotICAgIHN0cmluZ0NhY2hlICA9IHt9Owot
Ci12YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSOwotCi0v
KioKLSAgQSB1bmlxdWUga2V5IHVzZWQgdG8gYXNzaWduIGd1aWRzIGFuZCBvdGhlciBwcml2YXRl
IG1ldGFkYXRhIHRvIG9iamVjdHMuCi0gIElmIHlvdSBpbnNwZWN0IGFuIG9iamVjdCBpbiB5b3Vy
IGJyb3dzZXIgZGVidWdnZXIgeW91IHdpbGwgb2Z0ZW4gc2VlIHRoZXNlLgotICBUaGV5IGNhbiBi
ZSBzYWZlbHkgaWdub3JlZC4KLQotICBPbiBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQsIHRoZXNl
IHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGggZW51bWVyYXRpb24KLSAgZGlzYWJsZWQgc28gdGhl
eSB3b24ndCBzaG93IHVwIHdoZW4geW91IGl0ZXJhdGUgb3ZlciB5b3VyIHByb3BlcnRpZXMuCi0K
LSAgQHByaXZhdGUKLSAgQHByb3BlcnR5IEdVSURfS0VZCi0gIEBmb3IgRW1iZXIKLSAgQHR5cGUg
U3RyaW5nCi0gIEBmaW5hbAotKi8KLUVtYmVyLkdVSURfS0VZID0gR1VJRF9LRVk7Ci0KLXZhciBH
VUlEX0RFU0MgPSB7Ci0gIHdyaXRhYmxlOiAgICBmYWxzZSwKLSAgY29uZmlndXJhYmxlOiBmYWxz
ZSwKLSAgZW51bWVyYWJsZTogIGZhbHNlLAotICB2YWx1ZTogbnVsbAotfTsKLQotLyoqCi0gIEdl
bmVyYXRlcyBhIG5ldyBndWlkLCBvcHRpb25hbGx5IHNhdmluZyB0aGUgZ3VpZCB0byB0aGUgb2Jq
ZWN0IHRoYXQgeW91Ci0gIHBhc3MgaW4uIFlvdSB3aWxsIHJhcmVseSBuZWVkIHRvIHVzZSB0aGlz
IG1ldGhvZC4gSW5zdGVhZCB5b3Ugc2hvdWxkCi0gIGNhbGwgYEVtYmVyLmd1aWRGb3Iob2JqKWAs
IHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBndWlkIGlmIGF2YWlsYWJsZS4KLQotICBAcHJpdmF0
ZQotICBAbWV0aG9kIGdlbmVyYXRlR3VpZAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBbb2JqXSBPYmplY3QgdGhlIGd1aWQgd2lsbCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0
aGUgZ3VpZCB3aWxsCi0gICAgYmUgc2F2ZWQgb24gdGhlIG9iamVjdCBhbmQgcmV1c2VkIHdoZW5l
dmVyIHlvdSBwYXNzIHRoZSBzYW1lIG9iamVjdAotICAgIGFnYWluLgotCi0gICAgSWYgbm8gb2Jq
ZWN0IGlzIHBhc3NlZCwganVzdCBnZW5lcmF0ZSBhIG5ldyBndWlkLgotICBAcGFyYW0ge1N0cmlu
Z30gW3ByZWZpeF0gUHJlZml4IHRvIHBsYWNlIGluIGZyb250IG9mIHRoZSBndWlkLiBVc2VmdWwg
d2hlbiB5b3Ugd2FudCB0bwotICAgIHNlcGFyYXRlIHRoZSBndWlkIGludG8gc2VwYXJhdGUgbmFt
ZXNwYWNlcy4KLSAgQHJldHVybiB7U3RyaW5nfSB0aGUgZ3VpZAotKi8KLUVtYmVyLmdlbmVyYXRl
R3VpZCA9IGZ1bmN0aW9uIGdlbmVyYXRlR3VpZChvYmosIHByZWZpeCkgewotICBpZiAoIXByZWZp
eCkgcHJlZml4ID0gRW1iZXIuR1VJRF9QUkVGSVg7Ci0gIHZhciByZXQgPSAocHJlZml4ICsgKHV1
aWQrKykpOwotICBpZiAob2JqKSB7Ci0gICAgR1VJRF9ERVNDLnZhbHVlID0gcmV0OwotICAgIG9f
ZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJRF9ERVNDKTsKLSAgfQotICByZXR1cm4g
cmV0OwotfTsKLQotLyoqCi0gIFJldHVybnMgYSB1bmlxdWUgaWQgZm9yIHRoZSBvYmplY3QuIElm
IHRoZSBvYmplY3QgZG9lcyBub3QgeWV0IGhhdmUgYSBndWlkLAotICBvbmUgd2lsbCBiZSBhc3Np
Z25lZCB0byBpdC4gWW91IGNhbiBjYWxsIHRoaXMgb24gYW55IG9iamVjdCwKLSAgYEVtYmVyLk9i
amVjdGAtYmFzZWQgb3Igbm90LCBidXQgYmUgYXdhcmUgdGhhdCBpdCB3aWxsIGFkZCBhIGBfZ3Vp
ZGAKLSAgcHJvcGVydHkuCi0KLSAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIG1ldGhvZCBvbiBET00g
RWxlbWVudCBvYmplY3RzLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgZ3VpZEZvcgotICBAZm9y
IEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogYW55IG9iamVjdCwgc3RyaW5nLCBudW1iZXIs
IEVsZW1lbnQsIG9yIHByaW1pdGl2ZQotICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmlxdWUgZ3Vp
ZCBmb3IgdGhpcyBpbnN0YW5jZS4KLSovCi1FbWJlci5ndWlkRm9yID0gZnVuY3Rpb24gZ3VpZEZv
cihvYmopIHsKLQotICAvLyBzcGVjaWFsIGNhc2VzIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gYWRk
IGEga2V5IHRvIG9iamVjdAotICBpZiAob2JqID09PSB1bmRlZmluZWQpIHJldHVybiAiKHVuZGVm
aW5lZCkiOwotICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gIihudWxsKSI7Ci0KLSAgdmFyIHJl
dDsKLSAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqOwotCi0gIC8vIERvbid0IGFsbG93IHByb3RvdHlw
ZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRvIGNoYW5nZSB0aGUgZ3VpZEZvcgotICBzd2l0Y2go
dHlwZSkgewotICAgIGNhc2UgJ251bWJlcic6Ci0gICAgICByZXQgPSBudW1iZXJDYWNoZVtvYmpd
OwotICAgICAgaWYgKCFyZXQpIHJldCA9IG51bWJlckNhY2hlW29ial0gPSAnbnUnK29iajsKLSAg
ICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICdzdHJpbmcnOgotICAgICAgcmV0ID0gc3RyaW5n
Q2FjaGVbb2JqXTsKLSAgICAgIGlmICghcmV0KSByZXQgPSBzdHJpbmdDYWNoZVtvYmpdID0gJ3N0
JysodXVpZCsrKTsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICdib29sZWFuJzoKLSAg
ICAgIHJldHVybiBvYmogPyAnKHRydWUpJyA6ICcoZmFsc2UpJzsKLQotICAgIGRlZmF1bHQ6Ci0g
ICAgICBpZiAob2JqW0dVSURfS0VZXSkgcmV0dXJuIG9ialtHVUlEX0tFWV07Ci0gICAgICBpZiAo
b2JqID09PSBPYmplY3QpIHJldHVybiAnKE9iamVjdCknOwotICAgICAgaWYgKG9iaiA9PT0gQXJy
YXkpICByZXR1cm4gJyhBcnJheSknOwotICAgICAgcmV0ID0gJ2VtYmVyJysodXVpZCsrKTsKLSAg
ICAgIEdVSURfREVTQy52YWx1ZSA9IHJldDsKLSAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBH
VUlEX0tFWSwgR1VJRF9ERVNDKTsKLSAgICAgIHJldHVybiByZXQ7Ci0gIH0KLX07Ci0KLS8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
LS8vIE1FVEEKLS8vCi0KLXZhciBNRVRBX0RFU0MgPSB7Ci0gIHdyaXRhYmxlOiAgICB0cnVlLAot
ICBjb25maWd1cmFibGU6IGZhbHNlLAotICBlbnVtZXJhYmxlOiAgZmFsc2UsCi0gIHZhbHVlOiBu
dWxsCi19OwotCi12YXIgTUVUQV9LRVkgPSBFbWJlci5HVUlEX0tFWSsnX21ldGEnOwotCi0vKioK
LSAgVGhlIGtleSB1c2VkIHRvIHN0b3JlIG1ldGEgaW5mb3JtYXRpb24gb24gb2JqZWN0IGZvciBw
cm9wZXJ0eSBvYnNlcnZpbmcuCi0KLSAgQHByb3BlcnR5IE1FVEFfS0VZCi0gIEBmb3IgRW1iZXIK
LSAgQHByaXZhdGUKLSAgQGZpbmFsCi0gIEB0eXBlIFN0cmluZwotKi8KLUVtYmVyLk1FVEFfS0VZ
ID0gTUVUQV9LRVk7Ci0KLXZhciBpc0RlZmluZVByb3BlcnR5U2ltdWxhdGVkID0gRW1iZXIucGxh
dGZvcm0uZGVmaW5lUHJvcGVydHkuaXNTaW11bGF0ZWQ7Ci0KLWZ1bmN0aW9uIE1ldGEob2JqKSB7
Ci0gIHRoaXMuZGVzY3MgPSB7fTsKLSAgdGhpcy53YXRjaGluZyA9IHt9OwotICB0aGlzLmNhY2hl
ID0ge307Ci0gIHRoaXMuc291cmNlID0gb2JqOwotfQotCi1NZXRhLnByb3RvdHlwZSA9IHsKLSAg
ZGVzY3M6IG51bGwsCi0gIGRlcHM6IG51bGwsCi0gIHdhdGNoaW5nOiBudWxsLAotICBsaXN0ZW5l
cnM6IG51bGwsCi0gIGNhY2hlOiBudWxsLAotICBzb3VyY2U6IG51bGwsCi0gIG1peGluczogbnVs
bCwKLSAgYmluZGluZ3M6IG51bGwsCi0gIGNoYWluczogbnVsbCwKLSAgY2hhaW5XYXRjaGVyczog
bnVsbCwKLSAgdmFsdWVzOiBudWxsCi19OwotCi1pZiAoaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRl
ZCkgewotICAvLyBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGVudW1lcmFibGUgZmFs
c2UKLSAgLy8gbWFrZSBtZXRhIGZhaWwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoKSB0byBoaWRlIGZy
b20KLSAgLy8galF1ZXJ5LmV4dGVuZCgpIGJ5IGhhdmluZyBhIHByb3BlcnR5IHRoYXQgZmFpbHMK
LSAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2suCi0gIE1ldGEucHJvdG90eXBlLl9fcHJldmVudFBs
YWluT2JqZWN0X18gPSB0cnVlOwotCi0gIC8vIFdpdGhvdXQgbm9uLWVudW1lcmFibGUgcHJvcGVy
dGllcywgbWV0YSBvYmplY3RzIHdpbGwgYmUgb3V0cHV0IGluIEpTT04KLSAgLy8gdW5sZXNzIGV4
cGxpY2l0bHkgc3VwcHJlc3NlZAotICBNZXRhLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAo
KSB7IH07Ci19Ci0KLS8vIFBsYWNlaG9sZGVyIGZvciBub24td3JpdGFibGUgbWV0YXMuCi12YXIg
RU1QVFlfTUVUQSA9IG5ldyBNZXRhKG51bGwpOwotCi1pZiAoTUFOREFUT1JZX1NFVFRFUikgeyBF
TVBUWV9NRVRBLnZhbHVlcyA9IHt9OyB9Ci0KLUVtYmVyLkVNUFRZX01FVEEgPSBFTVBUWV9NRVRB
OwotCi0vKioKLSAgUmV0cmlldmVzIHRoZSBtZXRhIGhhc2ggZm9yIGFuIG9iamVjdC4gSWYgYHdy
aXRhYmxlYCBpcyB0cnVlIGVuc3VyZXMgdGhlCi0gIGhhc2ggaXMgd3JpdGFibGUgZm9yIHRoaXMg
b2JqZWN0IGFzIHdlbGwuCi0KLSAgVGhlIG1ldGEgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9u
IGFib3V0IGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzIGFzCi0gIHdlbGwgYXMgYW55IHdh
dGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIFlvdSBnZW5lcmFsbHkgd2ls
bAotICBub3QgYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkgYnV0IGluc3RlYWQgd29y
ayB3aXRoIGhpZ2hlciBsZXZlbAotICBtZXRob2RzIHRoYXQgbWFuaXB1bGF0ZSB0aGlzIGhhc2gg
aW5kaXJlY3RseS4KLQotICBAbWV0aG9kIG1ldGEKLSAgQGZvciBFbWJlcgotICBAcHJpdmF0ZQot
Ci0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSBtZXRhIGZvcgot
ICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJsZT10cnVlXSBQYXNzIGBmYWxzZWAgaWYgeW91IGRv
IG5vdCBpbnRlbmQgdG8gbW9kaWZ5Ci0gICAgdGhlIG1ldGEgaGFzaCwgYWxsb3dpbmcgdGhlIG1l
dGhvZCB0byBhdm9pZCBtYWtpbmcgYW4gdW5uZWNlc3NhcnkgY29weS4KLSAgQHJldHVybiB7T2Jq
ZWN0fSB0aGUgbWV0YSBoYXNoIGZvciBhbiBvYmplY3QKLSovCi1FbWJlci5tZXRhID0gZnVuY3Rp
b24gbWV0YShvYmosIHdyaXRhYmxlKSB7Ci0KLSAgdmFyIHJldCA9IG9ialtNRVRBX0tFWV07Ci0g
IGlmICh3cml0YWJsZT09PWZhbHNlKSByZXR1cm4gcmV0IHx8IEVNUFRZX01FVEE7Ci0KLSAgaWYg
KCFyZXQpIHsKLSAgICBpZiAoIWlzRGVmaW5lUHJvcGVydHlTaW11bGF0ZWQpIG9fZGVmaW5lUHJv
cGVydHkob2JqLCBNRVRBX0tFWSwgTUVUQV9ERVNDKTsKLQotICAgIHJldCA9IG5ldyBNZXRhKG9i
aik7Ci0KLSAgICBpZiAoTUFOREFUT1JZX1NFVFRFUikgeyByZXQudmFsdWVzID0ge307IH0KLQot
ICAgIG9ialtNRVRBX0tFWV0gPSByZXQ7Ci0KLSAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgYWNj
aWRlbnRhbGx5IHRyeSB0byBjcmVhdGUgY29uc3RydWN0b3IgbGlrZSBkZXNjCi0gICAgcmV0LmRl
c2NzLmNvbnN0cnVjdG9yID0gbnVsbDsKLQotICB9IGVsc2UgaWYgKHJldC5zb3VyY2UgIT09IG9i
aikgewotICAgIGlmICghaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCkgb19kZWZpbmVQcm9wZXJ0
eShvYmosIE1FVEFfS0VZLCBNRVRBX0RFU0MpOwotCi0gICAgcmV0ID0gb19jcmVhdGUocmV0KTsK
LSAgICByZXQuZGVzY3MgICAgPSBvX2NyZWF0ZShyZXQuZGVzY3MpOwotICAgIHJldC53YXRjaGlu
ZyA9IG9fY3JlYXRlKHJldC53YXRjaGluZyk7Ci0gICAgcmV0LmNhY2hlICAgID0ge307Ci0gICAg
cmV0LnNvdXJjZSAgID0gb2JqOwotCi0gICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgcmV0LnZh
bHVlcyA9IG9fY3JlYXRlKHJldC52YWx1ZXMpOyB9Ci0KLSAgICBvYmpbTUVUQV9LRVldID0gcmV0
OwotICB9Ci0gIHJldHVybiByZXQ7Ci19OwotCi1FbWJlci5nZXRNZXRhID0gZnVuY3Rpb24gZ2V0
TWV0YShvYmosIHByb3BlcnR5KSB7Ci0gIHZhciBtZXRhID0gRW1iZXIubWV0YShvYmosIGZhbHNl
KTsKLSAgcmV0dXJuIG1ldGFbcHJvcGVydHldOwotfTsKLQotRW1iZXIuc2V0TWV0YSA9IGZ1bmN0
aW9uIHNldE1ldGEob2JqLCBwcm9wZXJ0eSwgdmFsdWUpIHsKLSAgdmFyIG1ldGEgPSBFbWJlci5t
ZXRhKG9iaiwgdHJ1ZSk7Ci0gIG1ldGFbcHJvcGVydHldID0gdmFsdWU7Ci0gIHJldHVybiB2YWx1
ZTsKLX07Ci0KLS8qKgotICBAZGVwcmVjYXRlZAotICBAcHJpdmF0ZQotCi0gIEluIG9yZGVyIHRv
IHN0b3JlIGRlZmF1bHRzIGZvciBhIGNsYXNzLCBhIHByb3RvdHlwZSBtYXkgbmVlZCB0byBjcmVh
dGUKLSAgYSBkZWZhdWx0IG1ldGEgb2JqZWN0LCB3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieSBh
bnkgb2JqZWN0cyBpbnN0YW50aWF0ZWQKLSAgZnJvbSB0aGUgY2xhc3MncyBjb25zdHJ1Y3Rvci4K
LQotICBIb3dldmVyLCB0aGUgcHJvcGVydGllcyBvZiB0aGF0IG1ldGEgb2JqZWN0IGFyZSBvbmx5
IHNoYWxsb3ctY2xvbmVkLAotICBzbyBpZiBhIHByb3BlcnR5IGlzIGEgaGFzaCAobGlrZSB0aGUg
ZXZlbnQgc3lzdGVtJ3MgYGxpc3RlbmVyc2AgaGFzaCksCi0gIGl0IHdpbGwgYnkgZGVmYXVsdCBi
ZSBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcy4KLQotICBUaGlzIG1l
dGhvZCBhbGxvd3MgZXh0ZW5zaW9ucyB0byBkZWVwbHkgY2xvbmUgYSBzZXJpZXMgb2YgbmVzdGVk
IGhhc2hlcyBvcgotICBvdGhlciBjb21wbGV4IG9iamVjdHMuIEZvciBpbnN0YW5jZSwgdGhlIGV2
ZW50IHN5c3RlbSBtaWdodCBwYXNzCi0gIGBbJ2xpc3RlbmVycycsICdmb286Y2hhbmdlJywgJ2Vt
YmVyMTU3J11gIHRvIGBwcmVwYXJlTWV0YVBhdGhgLCB3aGljaCB3aWxsCi0gIHdhbGsgZG93biB0
aGUga2V5cyBwcm92aWRlZC4KLQotICBGb3IgZWFjaCBrZXksIGlmIHRoZSBrZXkgZG9lcyBub3Qg
ZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIElmIGl0IGFscmVhZHkKLSAgZXhpc3RzIGFuZCBpdCB3YXMg
aW5oZXJpdGVkIGZyb20gaXRzIGNvbnN0cnVjdG9yLCB0aGUgY29uc3RydWN0b3IncwotICBrZXkg
aXMgY2xvbmVkLgotCi0gIFlvdSBjYW4gYWxzbyBwYXNzIGZhbHNlIGZvciBgd3JpdGFibGVgLCB3
aGljaCB3aWxsIHNpbXBseSByZXR1cm4KLSAgdW5kZWZpbmVkIGlmIGBwcmVwYXJlTWV0YVBhdGhg
IGRpc2NvdmVycyBhbnkgcGFydCBvZiB0aGUgcGF0aCB0aGF0Ci0gIHNoYXJlZCBvciB1bmRlZmlu
ZWQuCi0KLSAgQG1ldGhvZCBtZXRhUGF0aAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBvYmogVGhlIG9iamVjdCB3aG9zZSBtZXRhIHdlIGFyZSBleGFtaW5pbmcKLSAgQHBhcmFtIHtB
cnJheX0gcGF0aCBBbiBhcnJheSBvZiBrZXlzIHRvIHdhbGsgZG93bgotICBAcGFyYW0ge0Jvb2xl
YW59IHdyaXRhYmxlIHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhIG5ldyBtZXRhCi0gICAgKG9y
IG1ldGEgcHJvcGVydHkpIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmIGl0J3MK
LSAgICBzaGFyZWQgd2l0aCBpdHMgY29uc3RydWN0b3IKLSovCi1FbWJlci5tZXRhUGF0aCA9IGZ1
bmN0aW9uIG1ldGFQYXRoKG9iaiwgcGF0aCwgd3JpdGFibGUpIHsKLSAgRW1iZXIuZGVwcmVjYXRl
KCJFbWJlci5tZXRhUGF0aCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBm
dXR1cmUgcmVsZWFzZXMuIik7Ci0gIHZhciBtZXRhID0gRW1iZXIubWV0YShvYmosIHdyaXRhYmxl
KSwga2V5TmFtZSwgdmFsdWU7Ci0KLSAgZm9yICh2YXIgaT0wLCBsPXBhdGgubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgIGtleU5hbWUgPSBwYXRoW2ldOwotICAgIHZhbHVlID0gbWV0YVtrZXlOYW1l
XTsKLQotICAgIGlmICghdmFsdWUpIHsKLSAgICAgIGlmICghd3JpdGFibGUpIHsgcmV0dXJuIHVu
ZGVmaW5lZDsgfQotICAgICAgdmFsdWUgPSBtZXRhW2tleU5hbWVdID0geyBfX2VtYmVyX3NvdXJj
ZV9fOiBvYmogfTsKLSAgICB9IGVsc2UgaWYgKHZhbHVlLl9fZW1iZXJfc291cmNlX18gIT09IG9i
aikgewotICAgICAgaWYgKCF3cml0YWJsZSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9Ci0gICAgICB2
YWx1ZSA9IG1ldGFba2V5TmFtZV0gPSBvX2NyZWF0ZSh2YWx1ZSk7Ci0gICAgICB2YWx1ZS5fX2Vt
YmVyX3NvdXJjZV9fID0gb2JqOwotICAgIH0KLQotICAgIG1ldGEgPSB2YWx1ZTsKLSAgfQotCi0g
IHJldHVybiB2YWx1ZTsKLX07Ci0KLS8qKgotICBXcmFwcyB0aGUgcGFzc2VkIGZ1bmN0aW9uIHNv
IHRoYXQgYHRoaXMuX3N1cGVyYCB3aWxsIHBvaW50IHRvIHRoZSBzdXBlckZ1bmMKLSAgd2hlbiB0
aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhpcyBpcyB0aGUgcHJpbWl0aXZlIHdlIHVzZSB0byBp
bXBsZW1lbnQKLSAgY2FsbHMgdG8gc3VwZXIuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCB3cmFw
Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8g
Y2FsbAotICBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckZ1bmMgVGhlIHN1cGVyIGZ1bmN0aW9uLgot
ICBAcmV0dXJuIHtGdW5jdGlvbn0gd3JhcHBlZCBmdW5jdGlvbi4KLSovCi1FbWJlci53cmFwID0g
ZnVuY3Rpb24oZnVuYywgc3VwZXJGdW5jKSB7Ci0gIGZ1bmN0aW9uIEsoKSB7fQotCi0gIGZ1bmN0
aW9uIHN1cGVyV3JhcHBlcigpIHsKLSAgICB2YXIgcmV0LCBzdXAgPSB0aGlzLl9zdXBlcjsKLSAg
ICB0aGlzLl9zdXBlciA9IHN1cGVyRnVuYyB8fCBLOwotICAgIHJldCA9IGZ1bmMuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKLSAgICB0aGlzLl9zdXBlciA9IHN1cDsKLSAgICByZXR1cm4gcmV0Owot
ICB9Ci0KLSAgc3VwZXJXcmFwcGVyLndyYXBwZWRGdW5jdGlvbiA9IGZ1bmM7Ci0gIHN1cGVyV3Jh
cHBlci5fX2VtYmVyX29ic2VydmVzX18gPSBmdW5jLl9fZW1iZXJfb2JzZXJ2ZXNfXzsKLSAgc3Vw
ZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyA9IGZ1bmMuX19lbWJlcl9vYnNlcnZl
c0JlZm9yZV9fOwotICBzdXBlcldyYXBwZXIuX19lbWJlcl9saXN0ZW5zX18gPSBmdW5jLl9fZW1i
ZXJfbGlzdGVuc19fOwotCi0gIHJldHVybiBzdXBlcldyYXBwZXI7Ci19OwotCi0vKioKLSAgUmV0
dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2Uu
Ci0KLSAgRW1iZXIgQXJyYXkgUHJvdG9jb2w6Ci0KLSAgICAtIHRoZSBvYmplY3QgaGFzIGFuIG9i
amVjdEF0IHByb3BlcnR5Ci0gICAgLSB0aGUgb2JqZWN0IGlzIGEgbmF0aXZlIEFycmF5Ci0gICAg
LSB0aGUgb2JqZWN0IGlzIGFuIE9iamVjdCwgYW5kIGhhcyBhIGxlbmd0aCBwcm9wZXJ0eQotCi0g
IFVubGlrZSBgRW1iZXIudHlwZU9mYCB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUgZXZlbiBpZiB0
aGUgcGFzc2VkIG9iamVjdCBpcwotICBub3QgZm9ybWFsbHkgYXJyYXkgYnV0IGFwcGVhcnMgdG8g
YmUgYXJyYXktbGlrZSAoaS5lLiBpbXBsZW1lbnRzIGBFbWJlci5BcnJheWApCi0KLSAgYGBgamF2
YXNjcmlwdAotICBFbWJlci5pc0FycmF5KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBmYWxzZQotICBFbWJlci5pc0FycmF5KFtdKTsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzQXJyYXkoIEVt
YmVyLkFycmF5UHJveHkuY3JlYXRlKHsgY29udGVudDogW10gfSkgKTsgIC8vIHRydWUKLSAgYGBg
Ci0KLSAgQG1ldGhvZCBpc0FycmF5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9i
aiBUaGUgb2JqZWN0IHRvIHRlc3QKLSAgQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGFz
c2VkIG9iamVjdCBpcyBhbiBhcnJheSBvciBBcnJheS1saWtlCi0qLwotRW1iZXIuaXNBcnJheSA9
IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9iaiB8fCBvYmouc2V0SW50ZXJ2YWwpIHsgcmV0dXJu
IGZhbHNlOyB9Ci0gIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeyBy
ZXR1cm4gdHJ1ZTsgfQotICBpZiAoRW1iZXIuQXJyYXkgJiYgRW1iZXIuQXJyYXkuZGV0ZWN0KG9i
aikpIHsgcmV0dXJuIHRydWU7IH0KLSAgaWYgKChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpICYm
ICdvYmplY3QnPT09dHlwZW9mIG9iaikgeyByZXR1cm4gdHJ1ZTsgfQotICByZXR1cm4gZmFsc2U7
Ci19OwotCi0vKioKLSAgRm9yY2VzIHRoZSBwYXNzZWQgb2JqZWN0IHRvIGJlIHBhcnQgb2YgYW4g
YXJyYXkuIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeQotICBhbiBhcnJheSBvciBhcnJheS1saWtl
LCByZXR1cm5zIHRoZSBvYmplY3QuIE90aGVyd2lzZSBhZGRzIHRoZSBvYmplY3QgdG8KLSAgYW4g
YXJyYXkuIElmIG9iaiBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHJldHVybnMgYW4gZW1wdHkg
YXJyYXkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5tYWtlQXJyYXkoKTsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBbXQotICBFbWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAg
ICAgICAgICAgICAgICAvLyBbXQotICBFbWJlci5tYWtlQXJyYXkodW5kZWZpbmVkKTsgICAgICAg
ICAgICAgICAgICAvLyBbXQotICBFbWJlci5tYWtlQXJyYXkoJ2xpbmRzYXknKTsgICAgICAgICAg
ICAgICAgICAvLyBbJ2xpbmRzYXknXQotICBFbWJlci5tYWtlQXJyYXkoWzEsMiw0Ml0pOyAgICAg
ICAgICAgICAgICAgICAvLyBbMSwyLDQyXQotCi0gIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJy
YXlQcm94eS5jcmVhdGUoeyBjb250ZW50OiBbXSB9KTsKLSAgRW1iZXIubWFrZUFycmF5KGNvbnRy
b2xsZXIpID09PSBjb250cm9sbGVyOyAgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIG1ha2VB
cnJheQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdAotICBA
cmV0dXJuIHtBcnJheX0KLSovCi1FbWJlci5tYWtlQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKLSAg
aWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH0KLSAg
cmV0dXJuIEVtYmVyLmlzQXJyYXkob2JqKSA/IG9iaiA6IFtvYmpdOwotfTsKLQotZnVuY3Rpb24g
Y2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkgewotICByZXR1cm4gISEob2JqICYmIHR5cGVvZiBv
YmpbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpOwotfQotCi0vKioKLSAgQ2hlY2tzIHRvIHNl
ZSBpZiB0aGUgYG1ldGhvZE5hbWVgIGV4aXN0cyBvbiB0aGUgYG9iamAuCi0KLSAgYGBgamF2YXNj
cmlwdAotICB2YXIgZm9vID0ge2JhcjogRW1iZXIuSywgYmF6OiBudWxsfTsKLSAgRW1iZXIuY2Fu
SW52b2tlKGZvbywgJ2JhcicpOyAvLyB0cnVlCi0gIEVtYmVyLmNhbkludm9rZShmb28sICdiYXon
KTsgLy8gZmFsc2UKLSAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JhdCcpOyAvLyBmYWxzZQotICBg
YGAKLQotICBAbWV0aG9kIGNhbkludm9rZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBvYmogVGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIG1ldGhvZAotICBAcGFyYW0ge1N0cmlu
Z30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2hlY2sgZm9yCi0gIEByZXR1cm4ge0Jv
b2xlYW59Ci0qLwotRW1iZXIuY2FuSW52b2tlID0gY2FuSW52b2tlOwotCi0vKioKLSAgQ2hlY2tz
IHRvIHNlZSBpZiB0aGUgYG1ldGhvZE5hbWVgIGV4aXN0cyBvbiB0aGUgYG9iamAsCi0gIGFuZCBp
ZiBpdCBkb2VzLCBpbnZva2VzIGl0IHdpdGggdGhlIGFyZ3VtZW50cyBwYXNzZWQuCi0KLSAgYGBg
amF2YXNjcmlwdAotICB2YXIgZCA9IG5ldyBEYXRlKCcwMy8xNS8yMDEzJyk7Ci0gIEVtYmVyLnRy
eUludm9rZShkLCAnZ2V0VGltZScpOyAvLyAxMzYzMzIwMDAwMDAwCi0gIEVtYmVyLnRyeUludm9r
ZShkLCAnc2V0RnVsbFllYXInLCBbMjAxNF0pOyAvLyAxMzk0ODU2MDAwMDAwCi0gIEVtYmVyLnRy
eUludm9rZShkLCAnbm9TdWNoTWV0aG9kJywgWzIwMTRdKTsgLy8gdW5kZWZpbmVkCi0gIGBgYAot
Ci0gIEBtZXRob2QgdHJ5SW52b2tlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9i
aiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUgbWV0aG9kCi0gIEBwYXJhbSB7U3RyaW5nfSBt
ZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjaGVjayBmb3IKLSAgQHBhcmFtIHtBcnJheX0g
W2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kCi0gIEByZXR1cm4geyp9
IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGludm9rZWQgbWV0aG9kIG9yIHVuZGVmaW5lZCBpZiBp
dCBjYW5ub3QgYmUgaW52b2tlZAotKi8KLUVtYmVyLnRyeUludm9rZSA9IGZ1bmN0aW9uKG9iaiwg
bWV0aG9kTmFtZSwgYXJncykgewotICBpZiAoY2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkpIHsK
LSAgICByZXR1cm4gb2JqW21ldGhvZE5hbWVdLmFwcGx5KG9iaiwgYXJncyB8fCBbXSk7Ci0gIH0K
LX07Ci0KLS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL3B1bGwvMTYxNwot
dmFyIG5lZWRzRmluYWxseUZpeCA9IChmdW5jdGlvbigpIHsKLSAgdmFyIGNvdW50ID0gMDsKLSAg
dHJ5ewotICAgIHRyeSB7IH0KLSAgICBmaW5hbGx5IHsKLSAgICAgIGNvdW50Kys7Ci0gICAgICB0
aHJvdyBuZXcgRXJyb3IoJ25lZWRzRmluYWxseUZpeFRlc3QnKTsKLSAgICB9Ci0gIH0gY2F0Y2gg
KGUpIHt9Ci0KLSAgcmV0dXJuIGNvdW50ICE9PSAxOwotfSkoKTsKLQotLyoqCi0gIFByb3ZpZGVz
IHRyeSB7IH0gZmluYWxseSB7IH0gZnVuY3Rpb25hbGl0eSwgd2hpbGUgd29ya2luZwotICBhcm91
bmQgU2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkgYnVnLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IHRyeWFibGUgPSBmdW5jdGlvbigpIHsKLSAgICBzb21lUmVzb3VyY2UubG9jaygpOwotICAgIHJ1
bkNhbGxiYWNrKCk7IC8vIE1heSB0aHJvdyBlcnJvci4KLSAgfTsKLSAgdmFyIGZpbmFsaXplciA9
IGZ1bmN0aW9uKCkgewotICAgIHNvbWVSZXNvdXJjZS51bmxvY2soKTsKLSAgfTsKLSAgRW1iZXIu
dHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6ZXIpOwotICBgYGAKLQotICBAbWV0aG9kIHRyeUZp
bmFsbHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9ufSB0cnlhYmxlIFRoZSBmdW5j
dGlvbiB0byBydW4gdGhlIHRyeSBjYWxsYmFjawotICBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5hbGl6
ZXIgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgZmluYWxseSBjYWxsYmFjawotICBAcGFyYW0ge09i
amVjdH0gW2JpbmRpbmddIFRoZSBvcHRpb25hbCBjYWxsaW5nIG9iamVjdC4gRGVmYXVsdHMgdG8g
J3RoaXMnCi0gIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRoYXQgb2YgdGhl
IGZpbmFsaXplciwKLSAgdW5sZXNzIHRoYXQgdmFsdWUgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBj
YXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUKLSAgb2YgdGhlIHRyeWFibGUKLSovCi0KLWlmIChu
ZWVkc0ZpbmFsbHlGaXgpIHsKLSAgRW1iZXIudHJ5RmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUs
IGZpbmFsaXplciwgYmluZGluZykgewotICAgIHZhciByZXN1bHQsIGZpbmFsUmVzdWx0LCBmaW5h
bEVycm9yOwotCi0gICAgYmluZGluZyA9IGJpbmRpbmcgfHwgdGhpczsKLQotICAgIHRyeSB7Ci0g
ICAgICByZXN1bHQgPSB0cnlhYmxlLmNhbGwoYmluZGluZyk7Ci0gICAgfSBmaW5hbGx5IHsKLSAg
ICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7
Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICAgIGZpbmFsRXJyb3IgPSBlOwotICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChmaW5hbEVycm9yKSB7IHRocm93IGZpbmFsRXJyb3I7IH0KLQotICAg
IHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3Vs
dDsKLSAgfTsKLX0gZWxzZSB7Ci0gIEVtYmVyLnRyeUZpbmFsbHkgPSBmdW5jdGlvbih0cnlhYmxl
LCBmaW5hbGl6ZXIsIGJpbmRpbmcpIHsKLSAgICB2YXIgcmVzdWx0LCBmaW5hbFJlc3VsdDsKLQot
ICAgIGJpbmRpbmcgPSBiaW5kaW5nIHx8IHRoaXM7Ci0KLSAgICB0cnkgewotICAgICAgcmVzdWx0
ID0gdHJ5YWJsZS5jYWxsKGJpbmRpbmcpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBmaW5hbFJl
c3VsdCA9IGZpbmFsaXplci5jYWxsKGJpbmRpbmcpOwotICAgIH0KLQotICAgIHJldHVybiAoZmlu
YWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0K
LQotLyoqCi0gIFByb3ZpZGVzIHRyeSB7IH0gY2F0Y2ggZmluYWxseSB7IH0gZnVuY3Rpb25hbGl0
eSwgd2hpbGUgd29ya2luZwotICBhcm91bmQgU2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkgYnVnLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHRyeWFibGUgPSBmdW5jdGlvbigpIHsKLSAgICBmb3Ig
KGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgbGlzdGVuZXIgPSBs
aXN0ZW5lcnNbaV07Ci0gICAgICBiZWZvcmVWYWx1ZXNbaV0gPSBsaXN0ZW5lci5iZWZvcmUobmFt
ZSwgdGltZSgpLCBwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FsbGJhY2suY2FsbChi
aW5kaW5nKTsKLSAgfTsKLQotICB2YXIgY2F0Y2hhYmxlID0gZnVuY3Rpb24oZSkgewotICAgIHBh
eWxvYWQgPSBwYXlsb2FkIHx8IHt9OwotICAgIHBheWxvYWQuZXhjZXB0aW9uID0gZTsKLSAgfTsK
LQotICB2YXIgZmluYWxpemVyID0gZnVuY3Rpb24oKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlzdGVu
ZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwot
ICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFtZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNb
aV0pOwotICAgIH0KLSAgfTsKLSAgRW1iZXIudHJ5Q2F0Y2hGaW5hbGx5KHRyeWFibGUsIGNhdGNo
YWJsZSwgZmluYWxpemVyKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCB0cnlDYXRjaEZpbmFsbHkKLSAg
QGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBy
dW4gdGhlIHRyeSBjYWxsYmFjawotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYXRjaGFibGUgVGhlIGZ1
bmN0aW9uIHRvIHJ1biB0aGUgY2F0Y2hhYmxlIGNhbGxiYWNrCi0gIEBwYXJhbSB7RnVuY3Rpb259
IGZpbmFsaXplciBUaGUgZnVuY3Rpb24gdG8gcnVuIHRoZSBmaW5hbGx5IGNhbGxiYWNrCi0gIEBw
YXJhbSB7T2JqZWN0fSBbYmluZGluZ10gVGhlIG9wdGlvbmFsIGNhbGxpbmcgb2JqZWN0LiBEZWZh
dWx0cyB0byAndGhpcycKLSAgQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGhh
dCBvZiB0aGUgZmluYWxpemVyLAotICB1bmxlc3MgdGhhdCB2YWx1ZSBpcyB1bmRlZmluZWQsIGlu
IHdoaWNoIGNhc2UgaXQgaXMgdGhlIHJldHVybiB2YWx1ZQotICBvZiB0aGUgdHJ5YWJsZS4KLSov
Ci1pZiAobmVlZHNGaW5hbGx5Rml4KSB7Ci0gIEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0
aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmluYWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFyIHJl
c3VsdCwgZmluYWxSZXN1bHQsIGZpbmFsRXJyb3I7Ci0KLSAgICBiaW5kaW5nID0gYmluZGluZyB8
fCB0aGlzOwotCi0gICAgdHJ5IHsKLSAgICAgIHJlc3VsdCA9IHRyeWFibGUuY2FsbChiaW5kaW5n
KTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChi
aW5kaW5nLCBlcnJvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZp
bmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7Ci0gICAgICB9IGNhdGNoIChlKSB7
Ci0gICAgICAgIGZpbmFsRXJyb3IgPSBlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5h
bEVycm9yKSB7IHRocm93IGZpbmFsRXJyb3I7IH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQg
PT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0gZWxzZSB7Ci0g
IEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmlu
YWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFyIHJlc3VsdCwgZmluYWxSZXN1bHQ7Ci0KLSAgICBi
aW5kaW5nID0gYmluZGluZyB8fCB0aGlzOwotCi0gICAgdHJ5IHsKLSAgICAgIHJlc3VsdCA9IHRy
eWFibGUuY2FsbChiaW5kaW5nKTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICByZXN1bHQg
PSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBlcnJvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAg
IGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6IGZpbmFsUmVzdWx0Owot
ICB9OwotfQotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0v
LyBUWVBJTkcgJiBBUlJBWSBNRVNTQUdJTkcKLS8vCi0KLXZhciBUWVBFX01BUCA9IHt9OwotdmFy
IHQgPSAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9i
amVjdCIuc3BsaXQoIiAiKTsKLUVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBm
dW5jdGlvbihuYW1lKSB7Ci0gIFRZUEVfTUFQWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0g
bmFtZS50b0xvd2VyQ2FzZSgpOwotfSk7Ci0KLXZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5
cGUudG9TdHJpbmc7Ci0KLS8qKgotICBSZXR1cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUg
cGFzc2VkIGl0ZW0uCi0KLSAgVXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVv
ZmAgdG8gZ2V0IHRoZSB0eXBlIG9mIGFuIGl0ZW0uCi0gIEl0IHdpbGwgcmV0dXJuIHRoZSBzYW1l
IHJlc3VsdCBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCBpbmNsdWRlcyBhIGJpdAotICBtb3JlIGRl
dGFpbC4gSGVyZSBpcyB3aGF0IHdpbGwgYmUgcmV0dXJuZWQ6Ci0KLSAgICAgIHwgUmV0dXJuIFZh
bHVlICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfAotICAgICAgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJp
bmcgcHJpbWl0aXZlIG9yIFN0cmluZyBvYmplY3QuICAgICAgICAgICAgICAgICAgIHwKLSAgICAg
IHwgJ251bWJlcicgICAgICB8IE51bWJlciBwcmltaXRpdmUgb3IgTnVtYmVyIG9iamVjdC4gICAg
ICAgICAgICAgICAgICAgfAotICAgICAgfCAnYm9vbGVhbicgICAgIHwgQm9vbGVhbiBwcmltaXRp
dmUgb3IgQm9vbGVhbiBvYmplY3QuICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdudWxsJyAg
ICAgICAgfCBOdWxsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHwKLSAgICAgIHwgJ3VuZGVmaW5lZCcgICB8IFVuZGVmaW5lZCB2YWx1ZSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAnZnVuY3Rpb24nICAgIHwgQSBm
dW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAg
ICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ3JlZ2V4cCcgICAgICB8IEFuIGluc3RhbmNlIG9m
IFJlZ0V4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAnZGF0ZScg
ICAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgRGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8Ci0gICAgICB8ICdjbGFzcycgICAgICAgfCBBbiBFbWJlciBjbGFzcyAoY3JlYXRlZCB1
c2luZyBFbWJlci5PYmplY3QuZXh0ZW5kKCkpIHwKLSAgICAgIHwgJ2luc3RhbmNlJyAgICB8IEFu
IEVtYmVyIG9iamVjdCBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAg
ICAgfCAnZXJyb3InICAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgdGhlIEVycm9yIG9iamVjdCAgICAg
ICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdvYmplY3QnICAgICAgfCBBIEphdmFTY3JpcHQg
b2JqZWN0IG5vdCBpbmhlcml0aW5nIGZyb20gRW1iZXIuT2JqZWN0IHwKLQotICBFeGFtcGxlczoK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnR5cGVPZigpOyAgICAgICAgICAgICAgICAgICAg
ICAgLy8gJ3VuZGVmaW5lZCcKLSAgRW1iZXIudHlwZU9mKG51bGwpOyAgICAgICAgICAgICAgICAg
ICAvLyAnbnVsbCcKLSAgRW1iZXIudHlwZU9mKHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAvLyAn
dW5kZWZpbmVkJwotICBFbWJlci50eXBlT2YoJ21pY2hhZWwnKTsgICAgICAgICAgICAgIC8vICdz
dHJpbmcnCi0gIEVtYmVyLnR5cGVPZihuZXcgU3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmlu
ZycKLSAgRW1iZXIudHlwZU9mKDEwMSk7ICAgICAgICAgICAgICAgICAgICAvLyAnbnVtYmVyJwot
ICBFbWJlci50eXBlT2YobmV3IE51bWJlcigxMDEpKTsgICAgICAgIC8vICdudW1iZXInCi0gIEVt
YmVyLnR5cGVPZih0cnVlKTsgICAgICAgICAgICAgICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVy
LnR5cGVPZihuZXcgQm9vbGVhbih0cnVlKSk7ICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVyLnR5
cGVPZihFbWJlci5tYWtlQXJyYXkpOyAgICAgICAgLy8gJ2Z1bmN0aW9uJwotICBFbWJlci50eXBl
T2YoWzEsMiw5MF0pOyAgICAgICAgICAgICAgIC8vICdhcnJheScKLSAgRW1iZXIudHlwZU9mKC9h
YmMvKTsgICAgICAgICAgICAgICAgICAvLyAncmVnZXhwJwotICBFbWJlci50eXBlT2YobmV3IERh
dGUoKSk7ICAgICAgICAgICAgIC8vICdkYXRlJwotICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0
LmV4dGVuZCgpKTsgIC8vICdjbGFzcycKLSAgRW1iZXIudHlwZU9mKEVtYmVyLk9iamVjdC5jcmVh
dGUoKSk7ICAvLyAnaW5zdGFuY2UnCi0gIEVtYmVyLnR5cGVPZihuZXcgRXJyb3IoJ3RlYW1vY2ls
JykpOyAgLy8gJ2Vycm9yJwotCi0gIC8vICJub3JtYWwiIEphdmFTY3JpcHQgb2JqZWN0Ci0gIEVt
YmVyLnR5cGVPZih7YTogJ2InfSk7ICAgICAgICAgICAgICAvLyAnb2JqZWN0JwotICBgYGAKLQot
ICBAbWV0aG9kIHR5cGVPZgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRo
ZSBpdGVtIHRvIGNoZWNrCi0gIEByZXR1cm4ge1N0cmluZ30gdGhlIHR5cGUKLSovCi1FbWJlci50
eXBlT2YgPSBmdW5jdGlvbihpdGVtKSB7Ci0gIHZhciByZXQ7Ci0KLSAgcmV0ID0gKGl0ZW0gPT09
IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSA/IFN0cmluZyhpdGVtKSA6IFRZUEVfTUFQW3Rv
U3RyaW5nLmNhbGwoaXRlbSldIHx8ICdvYmplY3QnOwotCi0gIGlmIChyZXQgPT09ICdmdW5jdGlv
bicpIHsKLSAgICBpZiAoRW1iZXIuT2JqZWN0ICYmIEVtYmVyLk9iamVjdC5kZXRlY3QoaXRlbSkp
IHJldCA9ICdjbGFzcyc7Ci0gIH0gZWxzZSBpZiAocmV0ID09PSAnb2JqZWN0JykgewotICAgIGlm
IChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHJldCA9ICdlcnJvcic7Ci0gICAgZWxzZSBpZiAoRW1i
ZXIuT2JqZWN0ICYmIGl0ZW0gaW5zdGFuY2VvZiBFbWJlci5PYmplY3QpIHJldCA9ICdpbnN0YW5j
ZSc7Ci0gICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIERhdGUpIHJldCA9ICdkYXRlJzsKLSAg
fQotCi0gIHJldHVybiByZXQ7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8g
RW1iZXIudHJ5Q2F0Y2hGaW5hbGx5Ci0KLS8qKgotICBUaGUgcHVycG9zZSBvZiB0aGUgRW1iZXIg
SW5zdHJ1bWVudGF0aW9uIG1vZHVsZSBpcwotICB0byBwcm92aWRlIGVmZmljaWVudCwgZ2VuZXJh
bC1wdXJwb3NlIGluc3RydW1lbnRhdGlvbgotICBmb3IgRW1iZXIuCi0KLSAgU3Vic2NyaWJlIHRv
IGEgbGlzdGVuZXIgYnkgdXNpbmcgYEVtYmVyLnN1YnNjcmliZWA6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5zdWJzY3JpYmUoInJlbmRlciIsIHsKLSAgICBiZWZvcmU6IGZ1bmN0aW9uKG5h
bWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgewotCi0gICAgfSwKLQotICAgIGFmdGVyOiBmdW5jdGlv
bihuYW1lLCB0aW1lc3RhbXAsIHBheWxvYWQpIHsKLQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0g
IElmIHlvdSByZXR1cm4gYSB2YWx1ZSBmcm9tIHRoZSBgYmVmb3JlYCBjYWxsYmFjaywgdGhhdCBz
YW1lCi0gIHZhbHVlIHdpbGwgYmUgcGFzc2VkIGFzIGEgZm91cnRoIHBhcmFtZXRlciB0byB0aGUg
YGFmdGVyYAotICBjYWxsYmFjay4KLQotICBJbnN0cnVtZW50IGEgYmxvY2sgb2YgY29kZSBieSB1
c2luZyBgRW1iZXIuaW5zdHJ1bWVudGA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5pbnN0
cnVtZW50KCJyZW5kZXIuaGFuZGxlYmFycyIsIHBheWxvYWQsIGZ1bmN0aW9uKCkgewotICAgIC8v
IHJlbmRlcmluZyBsb2dpYwotICB9LCBiaW5kaW5nKTsKLSAgYGBgCi0KLSAgRXZlbnQgbmFtZXMg
cGFzc2VkIHRvIGBFbWJlci5pbnN0cnVtZW50YCBhcmUgbmFtZXNwYWNlZAotICBieSBwZXJpb2Rz
LCBmcm9tIG1vcmUgZ2VuZXJhbCB0byBtb3JlIHNwZWNpZmljLiBTdWJzY3JpYmVycwotICBjYW4g
bGlzdGVuIGZvciBldmVudHMgYnkgd2hhdGV2ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQot
ICBhcmUgaW50ZXJlc3RlZCBpbi4KLQotICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50
IGlzIGByZW5kZXIuaGFuZGxlYmFyc2AsCi0gIGFuZCB0aGUgc3Vic2NyaWJlciBsaXN0ZW5lZCBm
b3IgYWxsIGV2ZW50cyBiZWdpbm5pbmcgd2l0aAotICBgcmVuZGVyYC4gSXQgd291bGQgcmVjZWl2
ZSBjYWxsYmFja3MgZm9yIGV2ZW50cyBuYW1lZAotICBgcmVuZGVyYCwgYHJlbmRlci5oYW5kbGVi
YXJzYCwgYHJlbmRlci5jb250YWluZXJgLCBvcgotICBldmVuIGByZW5kZXIuaGFuZGxlYmFycy5s
YXlvdXRgLgotCi0gIEBjbGFzcyBJbnN0cnVtZW50YXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAc3RhdGljCi0qLwotRW1iZXIuSW5zdHJ1bWVudGF0aW9uID0ge307Ci0KLXZhciBzdWJzY3Jp
YmVycyA9IFtdLCBjYWNoZSA9IHt9OwotCi12YXIgcG9wdWxhdGVMaXN0ZW5lcnMgPSBmdW5jdGlv
bihuYW1lKSB7Ci0gIHZhciBsaXN0ZW5lcnMgPSBbXSwgc3Vic2NyaWJlcjsKLQotICBmb3IgKHZh
ciBpPTAsIGw9c3Vic2NyaWJlcnMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIHN1YnNjcmliZXIg
PSBzdWJzY3JpYmVyc1tpXTsKLSAgICBpZiAoc3Vic2NyaWJlci5yZWdleC50ZXN0KG5hbWUpKSB7
Ci0gICAgICBsaXN0ZW5lcnMucHVzaChzdWJzY3JpYmVyLm9iamVjdCk7Ci0gICAgfQotICB9Ci0K
LSAgY2FjaGVbbmFtZV0gPSBsaXN0ZW5lcnM7Ci0gIHJldHVybiBsaXN0ZW5lcnM7Ci19OwotCi12
YXIgdGltZSA9IChmdW5jdGlvbigpIHsKLSAgdmFyIHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlw
ZW9mIHdpbmRvdyA/IHdpbmRvdy5wZXJmb3JtYW5jZSB8fCB7fSA6IHt9OwotICB2YXIgZm4gPSBw
ZXJmLm5vdyB8fCBwZXJmLm1vek5vdyB8fCBwZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8
IHBlcmYub05vdzsKLSAgLy8gZm4uYmluZCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBhbGwgdGhlIGJy
b3dzZXJzIHRoYXQgc3VwcG9ydCB0aGUgYWR2YW5jZWQgd2luZG93LnBlcmZvcm1hbmNlLi4uIDst
KQotICByZXR1cm4gZm4gPyBmbi5iaW5kKHBlcmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3
IERhdGUoKTsgfTsKLX0pKCk7Ci0KLS8qKgotICBOb3RpZmllcyBldmVudCdzIHN1YnNjcmliZXJz
LCBjYWxscyBgYmVmb3JlYCBhbmQgYGFmdGVyYCBob29rcy4KLQotICBAbWV0aG9kIGluc3RydW1l
bnQKLSAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24KLQotICBAcGFyYW0ge1N0cmlu
Z30gW25hbWVdIE5hbWVzcGFjZWQgZXZlbnQgbmFtZS4KLSAgQHBhcmFtIHtPYmplY3R9IHBheWxv
YWQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gdGhhdCB5b3UncmUgaW5z
dHJ1bWVudGluZy4KLSAgQHBhcmFtIHtPYmplY3R9IGJpbmRpbmcgQ29udGV4dCB0aGF0IGluc3Ry
dW1lbnQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguCi0qLwotRW1iZXIuSW5zdHJ1bWVudGF0aW9u
Lmluc3RydW1lbnQgPSBmdW5jdGlvbihuYW1lLCBwYXlsb2FkLCBjYWxsYmFjaywgYmluZGluZykg
ewotICB2YXIgbGlzdGVuZXJzID0gY2FjaGVbbmFtZV0sIHRpbWVOYW1lLCByZXQ7Ci0KLSAgaWYg
KEVtYmVyLlNUUlVDVFVSRURfUFJPRklMRSkgewotICAgIHRpbWVOYW1lID0gbmFtZSArICI6ICIg
KyBwYXlsb2FkLm9iamVjdDsKLSAgICBjb25zb2xlLnRpbWUodGltZU5hbWUpOwotICB9Ci0KLSAg
aWYgKCFsaXN0ZW5lcnMpIHsKLSAgICBsaXN0ZW5lcnMgPSBwb3B1bGF0ZUxpc3RlbmVycyhuYW1l
KTsKLSAgfQotCi0gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0ID0gY2Fs
bGJhY2suY2FsbChiaW5kaW5nKTsKLSAgICBpZiAoRW1iZXIuU1RSVUNUVVJFRF9QUk9GSUxFKSB7
IGNvbnNvbGUudGltZUVuZCh0aW1lTmFtZSk7IH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAg
dmFyIGJlZm9yZVZhbHVlcyA9IFtdLCBsaXN0ZW5lciwgaSwgbDsKLQotICBmdW5jdGlvbiB0cnlh
YmxlKCkgewotICAgIGZvciAoaT0wLCBsPWxpc3RlbmVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKLSAgICAgIGJlZm9yZVZhbHVlc1tpXSA9IGxp
c3RlbmVyLmJlZm9yZShuYW1lLCB0aW1lKCksIHBheWxvYWQpOwotICAgIH0KLQotICAgIHJldHVy
biBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2F0Y2hhYmxlKGUp
IHsKLSAgICBwYXlsb2FkID0gcGF5bG9hZCB8fCB7fTsKLSAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9
IGU7Ci0gIH0KLQotICBmdW5jdGlvbiBmaW5hbGl6ZXIoKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlz
dGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ld
OwotICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFtZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1
ZXNbaV0pOwotICAgIH0KLQotICAgIGlmIChFbWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsKLSAg
ICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEVt
YmVyLnRyeUNhdGNoRmluYWxseSh0cnlhYmxlLCBjYXRjaGFibGUsIGZpbmFsaXplcik7Ci19Owot
Ci0vKioKLSAgU3Vic2NyaWJlcyB0byBhIHBhcnRpY3VsYXIgZXZlbnQgb3IgaW5zdHJ1bWVudGVk
IGJsb2NrIG9mIGNvZGUuCi0KLSAgQG1ldGhvZCBzdWJzY3JpYmUKLSAgQG5hbWVzcGFjZSBFbWJl
ci5JbnN0cnVtZW50YXRpb24KLQotICBAcGFyYW0ge1N0cmluZ30gW3BhdHRlcm5dIE5hbWVzcGFj
ZWQgZXZlbnQgbmFtZS4KLSAgQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIEJlZm9yZSBhbmQgQWZ0
ZXIgaG9va3MuCi0KLSAgQHJldHVybiB7U3Vic2NyaWJlcn0KLSovCi1FbWJlci5JbnN0cnVtZW50
YXRpb24uc3Vic2NyaWJlID0gZnVuY3Rpb24ocGF0dGVybiwgb2JqZWN0KSB7Ci0gIHZhciBwYXRo
cyA9IHBhdHRlcm4uc3BsaXQoIi4iKSwgcGF0aCwgcmVnZXggPSBbXTsKLQotICBmb3IgKHZhciBp
PTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIHBhdGggPSBwYXRoc1tpXTsKLSAg
ICBpZiAocGF0aCA9PT0gIioiKSB7Ci0gICAgICByZWdleC5wdXNoKCJbXlxcLl0qIik7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHJlZ2V4LnB1c2gocGF0aCk7Ci0gICAgfQotICB9Ci0KLSAgcmVnZXgg
PSByZWdleC5qb2luKCJcXC4iKTsKLSAgcmVnZXggPSByZWdleCArICIoXFwuLiopPyI7Ci0KLSAg
dmFyIHN1YnNjcmliZXIgPSB7Ci0gICAgcGF0dGVybjogcGF0dGVybiwKLSAgICByZWdleDogbmV3
IFJlZ0V4cCgiXiIgKyByZWdleCArICIkIiksCi0gICAgb2JqZWN0OiBvYmplY3QKLSAgfTsKLQot
ICBzdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpOwotICBjYWNoZSA9IHt9OwotCi0gIHJldHVy
biBzdWJzY3JpYmVyOwotfTsKLQotLyoqCi0gIFVuc3Vic2NyaWJlcyBmcm9tIGEgcGFydGljdWxh
ciBldmVudCBvciBpbnN0cnVtZW50ZWQgYmxvY2sgb2YgY29kZS4KLQotICBAbWV0aG9kIHVuc3Vi
c2NyaWJlCi0gIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1bWVudGF0aW9uCi0KLSAgQHBhcmFtIHtP
YmplY3R9IFtzdWJzY3JpYmVyXQotKi8KLUVtYmVyLkluc3RydW1lbnRhdGlvbi51bnN1YnNjcmli
ZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKLSAgdmFyIGluZGV4OwotCi0gIGZvciAodmFyIGk9
MCwgbD1zdWJzY3JpYmVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgaWYgKHN1YnNjcmliZXJz
W2ldID09PSBzdWJzY3JpYmVyKSB7Ci0gICAgICBpbmRleCA9IGk7Ci0gICAgfQotICB9Ci0KLSAg
c3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTsKLSAgY2FjaGUgPSB7fTsKLX07Ci0KLS8qKgot
ICBSZXNldHMgYEVtYmVyLkluc3RydW1lbnRhdGlvbmAgYnkgZmx1c2hpbmcgbGlzdCBvZiBzdWJz
Y3JpYmVycy4KLQotICBAbWV0aG9kIHJlc2V0Ci0gIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1bWVu
dGF0aW9uCi0qLwotRW1iZXIuSW5zdHJ1bWVudGF0aW9uLnJlc2V0ID0gZnVuY3Rpb24oKSB7Ci0g
IHN1YnNjcmliZXJzID0gW107Ci0gIGNhY2hlID0ge307Ci19OwotCi1FbWJlci5pbnN0cnVtZW50
ID0gRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQ7Ci1FbWJlci5zdWJzY3JpYmUgPSBF
bWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlOwotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBtYXAsIGZvckVhY2gsIGluZGV4T2YsIHNwbGljZTsKLW1hcCAgICAgPSBBcnJheS5w
cm90b3R5cGUubWFwICAgICB8fCBFbWJlci5BcnJheVBvbHlmaWxscy5tYXA7Ci1mb3JFYWNoID0g
QXJyYXkucHJvdG90eXBlLmZvckVhY2ggfHwgRW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsK
LWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB8fCBFbWJlci5BcnJheVBvbHlmaWxs
cy5pbmRleE9mOwotc3BsaWNlID0gQXJyYXkucHJvdG90eXBlLnNwbGljZTsKLQotdmFyIHV0aWxz
ID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzID0gewotICBtYXA6IGZ1bmN0aW9uKG9iaiwgY2FsbGJh
Y2ssIHRoaXNBcmcpIHsKLSAgICByZXR1cm4gb2JqLm1hcCA/IG9iai5tYXAuY2FsbChvYmosIGNh
bGxiYWNrLCB0aGlzQXJnKSA6IG1hcC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwotICB9
LAotCi0gIGZvckVhY2g6IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKLSAgICBy
ZXR1cm4gb2JqLmZvckVhY2ggPyBvYmouZm9yRWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNB
cmcpIDogZm9yRWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwotICB9LAotCi0gIGlu
ZGV4T2Y6IGZ1bmN0aW9uKG9iaiwgZWxlbWVudCwgaW5kZXgpIHsKLSAgICByZXR1cm4gb2JqLmlu
ZGV4T2YgPyBvYmouaW5kZXhPZi5jYWxsKG9iaiwgZWxlbWVudCwgaW5kZXgpIDogaW5kZXhPZi5j
YWxsKG9iaiwgZWxlbWVudCwgaW5kZXgpOwotICB9LAotCi0gIGluZGV4ZXNPZjogZnVuY3Rpb24o
b2JqLCBlbGVtZW50cykgewotICAgIHJldHVybiBlbGVtZW50cyA9PT0gdW5kZWZpbmVkID8gW10g
OiB1dGlscy5tYXAoZWxlbWVudHMsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB1dGls
cy5pbmRleE9mKG9iaiwgaXRlbSk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgYWRkT2JqZWN0OiBmdW5j
dGlvbihhcnJheSwgaXRlbSkgewotICAgIHZhciBpbmRleCA9IHV0aWxzLmluZGV4T2YoYXJyYXks
IGl0ZW0pOwotICAgIGlmIChpbmRleCA9PT0gLTEpIHsgYXJyYXkucHVzaChpdGVtKTsgfQotICB9
LAotCi0gIHJlbW92ZU9iamVjdDogZnVuY3Rpb24oYXJyYXksIGl0ZW0pIHsKLSAgICB2YXIgaW5k
ZXggPSB1dGlscy5pbmRleE9mKGFycmF5LCBpdGVtKTsKLSAgICBpZiAoaW5kZXggIT09IC0xKSB7
IGFycmF5LnNwbGljZShpbmRleCwgMSk7IH0KLSAgfSwKLQotICBfcmVwbGFjZTogZnVuY3Rpb24o
YXJyYXksIGlkeCwgYW10LCBvYmplY3RzKSB7Ci0gICAgdmFyIGFyZ3MgPSBbXS5jb25jYXQob2Jq
ZWN0cyksIGNodW5rLCByZXQgPSBbXSwKLSAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5j
b20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU2NTg4Ci0gICAgICAgIHNpemUgPSA2MDAw
MCwgc3RhcnQgPSBpZHgsIGVuZHMgPSBhbXQsIGNvdW50OwotCi0gICAgd2hpbGUgKGFyZ3MubGVu
Z3RoKSB7Ci0gICAgICBjb3VudCA9IGVuZHMgPiBzaXplID8gc2l6ZSA6IGVuZHM7Ci0gICAgICBp
ZiAoY291bnQgPD0gMCkgeyBjb3VudCA9IDA7IH0KLQotICAgICAgY2h1bmsgPSBhcmdzLnNwbGlj
ZSgwLCBzaXplKTsKLSAgICAgIGNodW5rID0gW3N0YXJ0LCBjb3VudF0uY29uY2F0KGNodW5rKTsK
LQotICAgICAgc3RhcnQgKz0gc2l6ZTsKLSAgICAgIGVuZHMgLT0gY291bnQ7Ci0KLSAgICAgIHJl
dCA9IHJldC5jb25jYXQoc3BsaWNlLmFwcGx5KGFycmF5LCBjaHVuaykpOwotICAgIH0KLSAgICBy
ZXR1cm4gcmV0OwotICB9LAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKGFycmF5LCBpZHgsIGFtdCwg
b2JqZWN0cykgewotICAgIGlmIChhcnJheS5yZXBsYWNlKSB7Ci0gICAgICByZXR1cm4gYXJyYXku
cmVwbGFjZShpZHgsIGFtdCwgb2JqZWN0cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1
dGlscy5fcmVwbGFjZShhcnJheSwgaWR4LCBhbXQsIG9iamVjdHMpOwotICAgIH0KLSAgfSwKLQot
ICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uKGFycmF5MSwgYXJyYXkyKSB7Ci0gICAgdmFyIGludGVy
c2VjdGlvbiA9IFtdOwotCi0gICAgdXRpbHMuZm9yRWFjaChhcnJheTEsIGZ1bmN0aW9uKGVsZW1l
bnQpIHsKLSAgICAgIGlmICh1dGlscy5pbmRleE9mKGFycmF5MiwgZWxlbWVudCkgPj0gMCkgewot
ICAgICAgICBpbnRlcnNlY3Rpb24ucHVzaChlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIHJldHVybiBpbnRlcnNlY3Rpb247Ci0gIH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLXZhciBNRVRBX0tFWSA9IEVt
YmVyLk1FVEFfS0VZLCBnZXQ7Ci0KLXZhciBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1B
TkRBVE9SWV9TRVRURVI7Ci0KLXZhciBJU19HTE9CQUxfUEFUSCA9IC9eKFtBLVokXXwoWzAtOV1b
QS1aJF0pKS4qW1wuXCpdLzsKLXZhciBIQVNfVEhJUyAgPSAvXnRoaXNbXC5cKl0vOwotdmFyIEZJ
UlNUX0tFWSA9IC9eKFteXC5cKl0rKS87Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEdFVCBBTkQgU0VUCi0vLwotLy8g
SWYgd2UgYXJlIG9uIGEgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIHVz
ZSB0aG9zZS4KLS8vIE90aGVyd2lzZSBzaW11bGF0ZSBhY2Nlc3NvcnMgYnkgbG9va2luZyB1cCB0
aGUgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlCi0vLyBvYmplY3QuCi0KLS8qKgotICBHZXRzIHRo
ZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gSWYgdGhlIHByb3BlcnR5IGlzIGNv
bXB1dGVkLAotICB0aGUgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkLiBJZiB0aGUgcHJvcGVydHkg
aXMgbm90IGRlZmluZWQgYnV0IHRoZQotICBvYmplY3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Q
cm9wZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQuCi0KLSAgSWYgeW91IHBs
YW4gdG8gcnVuIG9uIElFOCBhbmQgb2xkZXIgYnJvd3NlcnMgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0
aGlzCi0gIG1ldGhvZCBhbnl0aW1lIHlvdSB3YW50IHRvIHJldHJpZXZlIGEgcHJvcGVydHkgb24g
YW4gb2JqZWN0IHRoYXQgeW91IGRvbid0Ci0gIGtub3cgZm9yIHN1cmUgaXMgcHJpdmF0ZS4gKFBy
b3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZSAnXycKLSAgYXJlIGNvbnNpZGVy
ZWQgcHJpdmF0ZS4pCi0KLSAgT24gYWxsIG5ld2VyIGJyb3dzZXJzLCB5b3Ugb25seSBuZWVkIHRv
IHVzZSB0aGlzIG1ldGhvZCB0byByZXRyaWV2ZQotICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0
eSBtaWdodCBub3QgYmUgZGVmaW5lZCBvbiB0aGUgb2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byBy
ZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBp
Z25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAgTm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxm
IGlzIGB1bmRlZmluZWRgLCB0aGlzIG1ldGhvZCB3aWxsIHRocm93Ci0gIGFuIGVycm9yLgotCi0g
IEBtZXRob2QgZ2V0Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2Jq
ZWN0IHRvIHJldHJpZXZlIGZyb20uCi0gIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9w
ZXJ0eSBrZXkgdG8gcmV0cmlldmUKLSAgQHJldHVybiB7T2JqZWN0fSB0aGUgcHJvcGVydHkgdmFs
dWUgb3IgYG51bGxgLgotKi8KLWdldCA9IGZ1bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKLSAg
Ly8gSGVscGVycyB0aGF0IG9wZXJhdGUgd2l0aCAndGhpcycgd2l0aGluIGFuICNlYWNoCi0gIGlm
IChrZXlOYW1lID09PSAnJykgewotICAgIHJldHVybiBvYmo7Ci0gIH0KLQotICBpZiAoIWtleU5h
bWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2JqKSB7Ci0gICAga2V5TmFtZSA9IG9iajsKLSAgICBv
YmogPSBudWxsOwotICB9Ci0KLSAgRW1iZXIuYXNzZXJ0KCJDYW5ub3QgY2FsbCBnZXQgd2l0aCAi
KyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5hbWUpOwotICBFbWJlci5hc3NlcnQoIkNhbm5vdCBj
YWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsiJyBvbiBhbiB1bmRlZmluZWQgb2JqZWN0LiIsIG9i
aiAhPT0gdW5kZWZpbmVkKTsKLQotICBpZiAob2JqID09PSBudWxsIHx8IGtleU5hbWUuaW5kZXhP
ZignLicpICE9PSAtMSkgewotICAgIHJldHVybiBnZXRQYXRoKG9iaiwga2V5TmFtZSk7Ci0gIH0K
LQotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nb
a2V5TmFtZV0sIHJldDsKLSAgaWYgKGRlc2MpIHsKLSAgICByZXR1cm4gZGVzYy5nZXQob2JqLCBr
ZXlOYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBtZXRhICYm
IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0gPiAwKSB7Ci0gICAgICByZXQgPSBtZXRhLnZhbHVlc1tr
ZXlOYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0ID0gb2JqW2tleU5hbWVdOwotICAgIH0K
LQotICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCAmJgotICAgICAgICAnb2JqZWN0JyA9PT0gdHlw
ZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4gb2JqKSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2Jq
LnVua25vd25Qcm9wZXJ0eSkgewotICAgICAgcmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5
TmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotfTsKLQotLy8gQ3VycmVudGx5
IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRlc3RzCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRl
QWNjZXNzb3JzKSB7Ci0gIEVtYmVyLmdldCA9IGdldDsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRl
QWNjZXNzb3JzKCk7Ci0gIGdldCA9IEVtYmVyLmdldDsKLX0KLQotLyoqCi0gIE5vcm1hbGl6ZXMg
YSB0YXJnZXQvcGF0aCBwYWlyIHRvIHJlZmxlY3QgdGhhdCBhY3R1YWwgdGFyZ2V0L3BhdGggdGhh
dCBzaG91bGQKLSAgYmUgb2JzZXJ2ZWQsIGV0Yy4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgcGFz
c2luZyBpbiBnbG9iYWwgcHJvcGVydHkKLSAgcGF0aHMgKGkuZS4gYSBwYXRoIGJlZ2lubmluZyB3
aXRoIGEgY2FwdGlhbCBsZXR0ZXIgbm90IGRlZmluZWQgb24gdGhlCi0gIHRhcmdldCkgYW5kICog
c2VwYXJhdG9ycy4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIG5vcm1hbGl6ZVR1cGxlCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgY3VycmVudCB0YXJnZXQuIE1h
eSBiZSBgbnVsbGAuCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcGF0aCBvbiB0aGUgdGFyZ2V0
IG9yIGEgZ2xvYmFsIHByb3BlcnR5IHBhdGguCi0gIEByZXR1cm4ge0FycmF5fSBhIHRlbXBvcmFy
eSBhcnJheSB3aXRoIHRoZSBub3JtYWxpemVkIHRhcmdldC9wYXRoIHBhaXIuCi0qLwotdmFyIG5v
cm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFsaXplVHVwbGUgPSBmdW5jdGlvbih0YXJnZXQsIHBh
dGgpIHsKLSAgdmFyIGhhc1RoaXMgID0gSEFTX1RISVMudGVzdChwYXRoKSwKLSAgICAgIGlzR2xv
YmFsID0gIWhhc1RoaXMgJiYgSVNfR0xPQkFMX1BBVEgudGVzdChwYXRoKSwKLSAgICAgIGtleTsK
LQotICBpZiAoIXRhcmdldCB8fCBpc0dsb2JhbCkgdGFyZ2V0ID0gRW1iZXIubG9va3VwOwotICBp
ZiAoaGFzVGhpcykgcGF0aCA9IHBhdGguc2xpY2UoNSk7Ci0KLSAgaWYgKHRhcmdldCA9PT0gRW1i
ZXIubG9va3VwKSB7Ci0gICAga2V5ID0gcGF0aC5tYXRjaChGSVJTVF9LRVkpWzBdOwotICAgIHRh
cmdldCA9IGdldCh0YXJnZXQsIGtleSk7Ci0gICAgcGF0aCAgID0gcGF0aC5zbGljZShrZXkubGVu
Z3RoKzEpOwotICB9Ci0KLSAgLy8gbXVzdCByZXR1cm4gc29tZSBraW5kIG9mIHBhdGggdG8gYmUg
dmFsaWQgZWxzZSBvdGhlciB0aGluZ3Mgd2lsbCBicmVhay4KLSAgaWYgKCFwYXRoIHx8IHBhdGgu
bGVuZ3RoPT09MCkgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCdJbnZhbGlkIFBhdGgnKTsKLQotICBy
ZXR1cm4gWyB0YXJnZXQsIHBhdGggXTsKLX07Ci0KLXZhciBnZXRQYXRoID0gRW1iZXIuX2dldFBh
dGggPSBmdW5jdGlvbihyb290LCBwYXRoKSB7Ci0gIHZhciBoYXNUaGlzLCBwYXJ0cywgdHVwbGUs
IGlkeCwgbGVuOwotCi0gIC8vIElmIHRoZXJlIGlzIG5vIHJvb3QgYW5kIHBhdGggaXMgYSBrZXkg
bmFtZSwgcmV0dXJuIHRoYXQKLSAgLy8gcHJvcGVydHkgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4K
LSAgLy8gRS5nLiBnZXQoJ0VtYmVyJykgLT4gRW1iZXIKLSAgaWYgKHJvb3QgPT09IG51bGwgJiYg
cGF0aC5pbmRleE9mKCcuJykgPT09IC0xKSB7IHJldHVybiBnZXQoRW1iZXIubG9va3VwLCBwYXRo
KTsgfQotCi0gIC8vIGRldGVjdCBjb21wbGljYXRlZCBwYXRocyBhbmQgbm9ybWFsaXplIHRoZW0K
LSAgaGFzVGhpcyAgPSBIQVNfVEhJUy50ZXN0KHBhdGgpOwotCi0gIGlmICghcm9vdCB8fCBoYXNU
aGlzKSB7Ci0gICAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShyb290LCBwYXRoKTsKLSAgICByb290
ID0gdHVwbGVbMF07Ci0gICAgcGF0aCA9IHR1cGxlWzFdOwotICAgIHR1cGxlLmxlbmd0aCA9IDA7
Ci0gIH0KLQotICBwYXJ0cyA9IHBhdGguc3BsaXQoIi4iKTsKLSAgbGVuID0gcGFydHMubGVuZ3Ro
OwotICBmb3IgKGlkeCA9IDA7IHJvb3QgIT0gbnVsbCAmJiBpZHggPCBsZW47IGlkeCsrKSB7Ci0g
ICAgcm9vdCA9IGdldChyb290LCBwYXJ0c1tpZHhdLCB0cnVlKTsKLSAgICBpZiAocm9vdCAmJiBy
b290LmlzRGVzdHJveWVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0KLSAgfQotICByZXR1cm4gcm9v
dDsKLX07Ci0KLUVtYmVyLmdldFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ocm9vdCwga2V5LCBkZWZh
dWx0VmFsdWUpIHsKLSAgdmFyIHZhbHVlID0gZ2V0KHJvb3QsIGtleSk7Ci0KLSAgaWYgKHZhbHVl
ID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRlZmF1bHRWYWx1ZTsgfQotICByZXR1cm4gdmFsdWU7
Ci19OwotCi0KLUVtYmVyLmdldCA9IGdldDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIG9fY3JlYXRlID0gRW1iZXIuY3Jl
YXRlLAotICAgIG1ldGFGb3IgPSBFbWJlci5tZXRhLAotICAgIE1FVEFfS0VZID0gRW1iZXIuTUVU
QV9LRVksCi0gICAgYV9zbGljZSA9IFtdLnNsaWNlLAotICAgIC8qIGxpc3RlbmVyIGZsYWdzICov
Ci0gICAgT05DRSA9IDEsIFNVU1BFTkRFRCA9IDI7Ci0KLS8qCi0gIFRoZSBldmVudCBzeXN0ZW0g
dXNlcyBhIHNlcmllcyBvZiBuZXN0ZWQgaGFzaGVzIHRvIHN0b3JlIGxpc3RlbmVycyBvbiBhbgot
ICBvYmplY3QuIFdoZW4gYSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50
IGFycml2ZXMsIHRoZXNlCi0gIGhhc2hlcyBhcmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGlj
aCB0YXJnZXQgYW5kIGFjdGlvbiBwYWlyIHRvIGludm9rZS4KLQotICBUaGUgaGFzaGVzIGFyZSBz
dG9yZWQgaW4gdGhlIG9iamVjdCdzIG1ldGEgaGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgotCi0g
ICAgICAvLyBPYmplY3QncyBtZXRhIGhhc2gKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJzOiB7
ICAgICAgIC8vIHZhcmlhYmxlIG5hbWU6IGBsaXN0ZW5lclNldGAKLSAgICAgICAgICAiZm9vOmNo
YW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5hbWU6IGBhY3Rpb25zYAotICAgICAgICAgICAgdGFyZ2V0
LCBtZXRob2QsIGZsYWdzCi0gICAgICAgICAgXQotICAgICAgICB9Ci0gICAgICB9Ci0KLSovCi0K
LWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHRhcmdldCwgbWV0aG9kKSB7Ci0gIHZhciBpbmRleCA9
IC0xOwotICBmb3IgKHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMykg
ewotICAgIGlmICh0YXJnZXQgPT09IGFycmF5W2ldICYmIG1ldGhvZCA9PT0gYXJyYXlbaSsxXSkg
eyBpbmRleCA9IGk7IGJyZWFrOyB9Ci0gIH0KLSAgcmV0dXJuIGluZGV4OwotfQotCi1mdW5jdGlv
biBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSB7Ci0gIHZhciBtZXRhID0gbWV0YUZvcihvYmos
IHRydWUpLAotICAgICAgYWN0aW9uczsKLQotICBpZiAoIW1ldGEubGlzdGVuZXJzKSB7IG1ldGEu
bGlzdGVuZXJzID0ge307IH0KLQotICBpZiAoIW1ldGEuaGFzT3duUHJvcGVydHkoJ2xpc3RlbmVy
cycpKSB7Ci0gICAgLy8gc2V0dXAgaW5oZXJpdGVkIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBvYmpl
Y3QKLSAgICBtZXRhLmxpc3RlbmVycyA9IG9fY3JlYXRlKG1ldGEubGlzdGVuZXJzKTsKLSAgfQot
Ci0gIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotCi0gIC8vIGlmIHRoZXJl
IGFyZSBhY3Rpb25zLCBidXQgdGhlIGV2ZW50TmFtZSBkb2Vzbid0IGV4aXN0IGluIG91ciBsaXN0
ZW5lcnMsIHRoZW4gY29weSB0aGVtIGZyb20gdGhlIHByb3RvdHlwZQotICBpZiAoYWN0aW9ucyAm
JiAhbWV0YS5saXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkgewotICAgIGFjdGlv
bnMgPSBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1l
XS5zbGljZSgpOwotICB9IGVsc2UgaWYgKCFhY3Rpb25zKSB7Ci0gICAgYWN0aW9ucyA9IG1ldGEu
bGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTsKLSAgfQotCi0gIHJldHVybiBhY3Rpb25zOwotfQot
Ci1mdW5jdGlvbiBhY3Rpb25zVW5pb24ob2JqLCBldmVudE5hbWUsIG90aGVyQWN0aW9ucykgewot
ICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCi0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRh
Lmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotCi0gIGlmICghYWN0aW9u
cykgeyByZXR1cm47IH0KLSAgZm9yICh2YXIgaSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAw
OyBpIC09IDMpIHsKLSAgICB2YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXSwKLSAgICAgICAgbWV0aG9k
ID0gYWN0aW9uc1tpKzFdLAotICAgICAgICBmbGFncyA9IGFjdGlvbnNbaSsyXSwKLSAgICAgICAg
YWN0aW9uSW5kZXggPSBpbmRleE9mKG90aGVyQWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0g
ICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkgewotICAgICAgb3RoZXJBY3Rpb25zLnB1c2godGFy
Z2V0LCBtZXRob2QsIGZsYWdzKTsKLSAgICB9Ci0gIH0KLX0KLQotZnVuY3Rpb24gYWN0aW9uc0Rp
ZmYob2JqLCBldmVudE5hbWUsIG90aGVyQWN0aW9ucykgewotICB2YXIgbWV0YSA9IG9ialtNRVRB
X0tFWV0sCi0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxp
c3RlbmVyc1tldmVudE5hbWVdLAotICAgICAgZGlmZkFjdGlvbnMgPSBbXTsKLQotICBpZiAoIWFj
dGlvbnMpIHsgcmV0dXJuOyB9Ci0gIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkg
Pj0gMDsgaSAtPSAzKSB7Ci0gICAgdmFyIHRhcmdldCA9IGFjdGlvbnNbaV0sCi0gICAgICAgIG1l
dGhvZCA9IGFjdGlvbnNbaSsxXSwKLSAgICAgICAgZmxhZ3MgPSBhY3Rpb25zW2krMl0sCi0gICAg
ICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihvdGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsK
LQotICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsgY29udGludWU7IH0KLQotICAgIG90aGVy
QWN0aW9ucy5wdXNoKHRhcmdldCwgbWV0aG9kLCBmbGFncyk7Ci0gICAgZGlmZkFjdGlvbnMucHVz
aCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3MpOwotICB9Ci0KLSAgcmV0dXJuIGRpZmZBY3Rpb25zOwot
fQotCi0vKioKLSAgQWRkIGFuIGV2ZW50IGxpc3RlbmVyCi0KLSAgQG1ldGhvZCBhZGRMaXN0ZW5l
cgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFt
ZQotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2Jq
ZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1
bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRg
Ci0gIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBBIGZsYWcgd2hldGhlciBhIGZ1bmN0aW9uIHNob3Vs
ZCBvbmx5IGJlIGNhbGxlZCBvbmNlCi0qLwotZnVuY3Rpb24gYWRkTGlzdGVuZXIob2JqLCBldmVu
dE5hbWUsIHRhcmdldCwgbWV0aG9kLCBvbmNlKSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3Qg
cGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIuYWRkTGlzdGVu
ZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7Ci0KLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9u
JyA9PT0gdHlwZW9mIHRhcmdldCkgewotICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQg
PSBudWxsOwotICB9Ci0KLSAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1l
KSwKLSAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCks
Ci0gICAgICBmbGFncyA9IDA7Ci0KLSAgaWYgKG9uY2UpIGZsYWdzIHw9IE9OQ0U7Ci0KLSAgaWYg
KGFjdGlvbkluZGV4ICE9PSAtMSkgeyByZXR1cm47IH0KLQotICBhY3Rpb25zLnB1c2godGFyZ2V0
LCBtZXRob2QsIGZsYWdzKTsKLQotICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRB
ZGRMaXN0ZW5lcikgewotICAgIG9iai5kaWRBZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwg
bWV0aG9kKTsKLSAgfQotfQotCi0vKioKLSAgUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyCi0KLSAg
QXJndW1lbnRzIHNob3VsZCBtYXRjaCB0aG9zZSBwYXNzZWQgdG8gYEVtYmVyLmFkZExpc3RlbmVy
YC4KLQotICBAbWV0aG9kIHJlbW92ZUxpc3RlbmVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9i
agotICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9u
fSB0YXJnZXRPck1ldGhvZCBBIHRhcmdldCBvYmplY3Qgb3IgYSBmdW5jdGlvbgotICBAcGFyYW0g
e0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEgZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5j
dGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdldGAKLSovCi1mdW5jdGlvbiByZW1vdmVMaXN0ZW5l
cihvYmosIGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3Ug
bXVzdCBwYXNzIGF0IGxlYXN0IGFuIG9iamVjdCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5yZW1v
dmVMaXN0ZW5lciIsICEhb2JqICYmICEhZXZlbnROYW1lKTsKLQotICBpZiAoIW1ldGhvZCAmJiAn
ZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAg
IHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICBmdW5jdGlvbiBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0
LCBtZXRob2QpIHsKLSAgICB2YXIgYWN0aW9ucyA9IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUp
LAotICAgICAgICBhY3Rpb25JbmRleCA9IGluZGV4T2YoYWN0aW9ucywgdGFyZ2V0LCBtZXRob2Qp
OwotCi0gICAgLy8gYWN0aW9uIGRvZXNuJ3QgZXhpc3QsIGdpdmUgdXAgc2lsZW50bHkKLSAgICBp
ZiAoYWN0aW9uSW5kZXggPT09IC0xKSB7IHJldHVybjsgfQotCi0gICAgYWN0aW9ucy5zcGxpY2Uo
YWN0aW9uSW5kZXgsIDMpOwotCi0gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlk
UmVtb3ZlTGlzdGVuZXIpIHsKLSAgICAgIG9iai5kaWRSZW1vdmVMaXN0ZW5lcihldmVudE5hbWUs
IHRhcmdldCwgbWV0aG9kKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWV0aG9kKSB7Ci0gICAgX3Jl
bW92ZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgbWV0YSA9
IG9ialtNRVRBX0tFWV0sCi0gICAgICAgIGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJz
ICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07Ci0KLSAgICBpZiAoIWFjdGlvbnMpIHsgcmV0
dXJuOyB9Ci0gICAgZm9yICh2YXIgaSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09
IDMpIHsKLSAgICAgIF9yZW1vdmVMaXN0ZW5lcihhY3Rpb25zW2ldLCBhY3Rpb25zW2krMV0pOwot
ICAgIH0KLSAgfQotfQotCi0vKioKLSAgU3VzcGVuZCBsaXN0ZW5lciBkdXJpbmcgY2FsbGJhY2su
Ci0KLSAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50
IGxpc3RlbmVyCi0gIHdoZW4gaXQgaXMgdGFraW5nIGFuIGFjdGlvbiB0aGF0IHdvdWxkIGNhdXNl
IHRoZSBldmVudCwgZS5nLgotICBhbiBvYmplY3QgbWlnaHQgc3VzcGVuZCBpdHMgcHJvcGVydHkg
Y2hhbmdlIGxpc3RlbmVyIHdoaWxlIGl0IGlzCi0gIHNldHRpbmcgdGhhdCBwcm9wZXJ0eS4KLQot
ICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1c3BlbmRMaXN0ZW5lcgotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBAcGFyYW0ge09iamVjdHxG
dW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAg
QHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9m
IGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259
IGNhbGxiYWNrCi0qLwotZnVuY3Rpb24gc3VzcGVuZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0
YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9
PT0gdHlwZW9mIHRhcmdldCkgewotICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBu
dWxsOwotICB9Ci0KLSAgdmFyIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwK
LSAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7Ci0K
LSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgewotICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0g
fD0gU1VTUEVOREVEOyAvLyBtYXJrIHRoZSBhY3Rpb24gYXMgc3VzcGVuZGVkCi0gIH0KLQotICBm
dW5jdGlvbiB0cnlhYmxlKCkgICB7IHJldHVybiBjYWxsYmFjay5jYWxsKHRhcmdldCk7IH0KLSAg
ZnVuY3Rpb24gZmluYWxpemVyKCkgeyBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7IGFjdGlvbnNb
YWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRFRDsgfSB9Ci0KLSAgcmV0dXJuIEVtYmVyLnRyeUZp
bmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsKLX0KLQotLyoqCi0gIFN1c3BlbmRzIG11bHRpcGxl
IGxpc3RlbmVycyBkdXJpbmcgYSBjYWxsYmFjay4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1
c3BlbmRMaXN0ZW5lcnMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7QXJy
YXl9IGV2ZW50TmFtZSBBcnJheSBvZiBldmVudCBuYW1lcwotICBAcGFyYW0ge09iamVjdHxGdW5j
dGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBh
cmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEg
ZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNh
bGxiYWNrCi0qLwotZnVuY3Rpb24gc3VzcGVuZExpc3RlbmVycyhvYmosIGV2ZW50TmFtZXMsIHRh
cmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewotICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09
PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51
bGw7Ci0gIH0KLQotICB2YXIgc3VzcGVuZGVkQWN0aW9ucyA9IFtdLAotICAgICAgYWN0aW9uc0xp
c3QgPSBbXSwKLSAgICAgIGV2ZW50TmFtZSwgYWN0aW9ucywgaSwgbDsKLQotICBmb3IgKGk9MCwg
bD1ldmVudE5hbWVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBldmVudE5hbWUgPSBldmVudE5h
bWVzW2ldOwotICAgIGFjdGlvbnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKTsKLSAgICB2
YXIgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKLQotICAg
IGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsKLSAgICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0g
fD0gU1VTUEVOREVEOwotICAgICAgc3VzcGVuZGVkQWN0aW9ucy5wdXNoKGFjdGlvbkluZGV4KTsK
LSAgICAgIGFjdGlvbnNMaXN0LnB1c2goYWN0aW9ucyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rp
b24gdHJ5YWJsZSgpIHsgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGFyZ2V0KTsgfQotCi0gIGZ1bmN0
aW9uIGZpbmFsaXplcigpIHsKLSAgICBmb3IgKHZhciBpID0gMCwgbCA9IHN1c3BlbmRlZEFjdGlv
bnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICB2YXIgYWN0aW9uSW5kZXggPSBzdXNwZW5k
ZWRBY3Rpb25zW2ldOwotICAgICAgYWN0aW9uc0xpc3RbaV1bYWN0aW9uSW5kZXgrMl0gJj0gflNV
U1BFTkRFRDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxl
LCBmaW5hbGl6ZXIpOwotfQotCi0vKioKLSAgUmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50bHkgd2F0
Y2hlZCBldmVudHMKLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHdhdGNoZWRFdmVudHMKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0gb2JqCi0qLwotZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsK
LSAgdmFyIGxpc3RlbmVycyA9IG9ialtNRVRBX0tFWV0ubGlzdGVuZXJzLCByZXQgPSBbXTsKLQot
ICBpZiAobGlzdGVuZXJzKSB7Ci0gICAgZm9yKHZhciBldmVudE5hbWUgaW4gbGlzdGVuZXJzKSB7
Ci0gICAgICBpZiAobGlzdGVuZXJzW2V2ZW50TmFtZV0pIHsgcmV0LnB1c2goZXZlbnROYW1lKTsg
fQotICAgIH0KLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vKioKLSAgU2VuZCBhbiBldmVudC4g
VGhlIGV4ZWN1dGlvbiBvZiBzdXNwZW5kZWQgbGlzdGVuZXJzCi0gIGlzIHNraXBwZWQsIGFuZCBv
bmNlIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4gQSBsaXN0ZW5lciB3aXRob3V0Ci0gIGEgdGFyZ2V0
IGlzIGV4ZWN1dGVkIG9uIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiBhbiBhcnJheSBvZiBhY3Rpb25z
Ci0gIGlzIG5vdCBwYXNzZWQsIHRoZSBhY3Rpb25zIHN0b3JlZCBvbiB0aGUgcGFzc2VkIG9iamVj
dCBhcmUgaW52b2tlZC4KLQotICBAbWV0aG9kIHNlbmRFdmVudAotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBAcGFyYW0ge0FycmF5fSBw
YXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZWFjaCBsaXN0ZW5lci4KLSAgQHBhcmFtIHtB
cnJheX0gYWN0aW9ucyBPcHRpb25hbCBhcnJheSBvZiBhY3Rpb25zIChsaXN0ZW5lcnMpLgotICBA
cmV0dXJuIHRydWUKLSovCi1mdW5jdGlvbiBzZW5kRXZlbnQob2JqLCBldmVudE5hbWUsIHBhcmFt
cywgYWN0aW9ucykgewotICAvLyBmaXJzdCBnaXZlIG9iamVjdCBhIGNoYW5jZSB0byBoYW5kbGUg
aXQKLSAgaWYgKG9iaiAhPT0gRW1iZXIgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZW5k
RXZlbnQpIHsKLSAgICBvYmouc2VuZEV2ZW50KGV2ZW50TmFtZSwgcGFyYW1zKTsKLSAgfQotCi0g
IGlmICghYWN0aW9ucykgewotICAgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgICBhY3Rp
b25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVd
OwotICB9Ci0KLSAgaWYgKCFhY3Rpb25zKSB7IHJldHVybjsgfQotCi0gIGZvciAodmFyIGkgPSBh
Y3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7IC8vIGxvb3BpbmcgaW4gcmV2ZXJz
ZSBmb3Igb25jZSBsaXN0ZW5lcnMKLSAgICB2YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXSwgbWV0aG9k
ID0gYWN0aW9uc1tpKzFdLCBmbGFncyA9IGFjdGlvbnNbaSsyXTsKLSAgICBpZiAoIW1ldGhvZCkg
eyBjb250aW51ZTsgfQotICAgIGlmIChmbGFncyAmIFNVU1BFTkRFRCkgeyBjb250aW51ZTsgfQot
ICAgIGlmIChmbGFncyAmIE9OQ0UpIHsgcmVtb3ZlTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRh
cmdldCwgbWV0aG9kKTsgfQotICAgIGlmICghdGFyZ2V0KSB7IHRhcmdldCA9IG9iajsgfQotICAg
IGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1ldGhvZCkgeyBtZXRob2QgPSB0YXJnZXRbbWV0aG9k
XTsgfQotICAgIGlmIChwYXJhbXMpIHsKLSAgICAgIG1ldGhvZC5hcHBseSh0YXJnZXQsIHBhcmFt
cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1ldGhvZC5jYWxsKHRhcmdldCk7Ci0gICAgfQotICB9
Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoYXNMaXN0
ZW5lcnMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBldmVu
dE5hbWUKLSovCi1mdW5jdGlvbiBoYXNMaXN0ZW5lcnMob2JqLCBldmVudE5hbWUpIHsKLSAgdmFy
IG1ldGEgPSBvYmpbTUVUQV9LRVldLAotICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0
ZW5lcnMgJiYgbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXTsKLQotICByZXR1cm4gISEoYWN0aW9u
cyAmJiBhY3Rpb25zLmxlbmd0aCk7Ci19Ci0KLS8qKgotICBAcHJpdmF0ZQotICBAbWV0aG9kIGxp
c3RlbmVyc0ZvcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQotKi8KLWZ1bmN0aW9uIGxpc3RlbmVyc0ZvcihvYmosIGV2ZW50TmFtZSkgewot
ICB2YXIgcmV0ID0gW107Ci0gIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwKLSAgICAgIGFjdGlv
bnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07
Ci0KLSAgaWYgKCFhY3Rpb25zKSB7IHJldHVybiByZXQ7IH0KLQotICBmb3IgKHZhciBpID0gMCwg
bCA9IGFjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSArPSAzKSB7Ci0gICAgdmFyIHRhcmdldCA9IGFj
dGlvbnNbaV0sCi0gICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaSsxXTsKLSAgICByZXQucHVzaChb
dGFyZ2V0LCBtZXRob2RdKTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBEZWZp
bmUgYSBwcm9wZXJ0eSBhcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4K
LSAgYSBzcGVjaWZpZWQgZXZlbnQgb3IgZXZlbnRzIGFyZSB0cmlnZ2VyZWQuCi0KLQotICBgYGAg
amF2YXNjcmlwdAotICB2YXIgSm9iID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbG9nQ29t
cGxldGVkOiBFbWJlci5vbignY29tcGxldGVkJywgZnVuY3Rpb24oKXsKLSAgICAgIGNvbnNvbGUu
bG9nKCdKb2IgY29tcGxldGVkIScpOwotICAgIH0pCi0gIH0pOwotICB2YXIgam9iID0gSm9iLmNy
ZWF0ZSgpOwotICBFbWJlci5zZW5kRXZlbnQoam9iLCAnY29tcGxldGVkJyk7IC8vIExvZ3MgIkpv
YiBjb21wbGV0ZWQhIgotIGBgYAotCi0gIEBtZXRob2Qgb24KLSAgQGZvciBFbWJlcgotICBAcGFy
YW0ge1N0cmluZ30gZXZlbnROYW1lcyoKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0
dXJuIGZ1bmMKLSovCi1FbWJlci5vbiA9IGZ1bmN0aW9uKCl7Ci0gIHZhciBmdW5jID0gYV9zbGlj
ZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAotICAgICAgZXZlbnRzID0gYV9zbGljZS5jYWxsKGFy
Z3VtZW50cywgMCwgLTEpOwotICBmdW5jLl9fZW1iZXJfbGlzdGVuc19fID0gZXZlbnRzOwotICBy
ZXR1cm4gZnVuYzsKLX07Ci0KLUVtYmVyLmFkZExpc3RlbmVyID0gYWRkTGlzdGVuZXI7Ci1FbWJl
ci5yZW1vdmVMaXN0ZW5lciA9IHJlbW92ZUxpc3RlbmVyOwotRW1iZXIuX3N1c3BlbmRMaXN0ZW5l
ciA9IHN1c3BlbmRMaXN0ZW5lcjsKLUVtYmVyLl9zdXNwZW5kTGlzdGVuZXJzID0gc3VzcGVuZExp
c3RlbmVyczsKLUVtYmVyLnNlbmRFdmVudCA9IHNlbmRFdmVudDsKLUVtYmVyLmhhc0xpc3RlbmVy
cyA9IGhhc0xpc3RlbmVyczsKLUVtYmVyLndhdGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRzOwot
RW1iZXIubGlzdGVuZXJzRm9yID0gbGlzdGVuZXJzRm9yOwotRW1iZXIubGlzdGVuZXJzRGlmZiA9
IGFjdGlvbnNEaWZmOwotRW1iZXIubGlzdGVuZXJzVW5pb24gPSBhY3Rpb25zVW5pb247Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0g
ICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50OwotCi0vKgotICB0aGlzLm9ic2VydmVyU2V0
ID0gewotICAgIFtzZW5kZXJHdWlkXTogeyAvLyB2YXJpYWJsZSBuYW1lOiBga2V5U2V0YAotICAg
ICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKLSAgICB9Ci0gIH0sCi0gIHRoaXMub2JzZXJ2ZXJzID0g
WwotICAgIHsKLSAgICAgIHNlbmRlcjogb2JqLAotICAgICAga2V5TmFtZToga2V5TmFtZSwKLSAg
ICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAotICAgICAgbGlzdGVuZXJzOiBbCi0gICAgICAgIFt0
YXJnZXQsIG1ldGhvZCwgZmxhZ3NdCi0gICAgICBdCi0gICAgfSwKLSAgICAuLi4KLSAgXQotKi8K
LXZhciBPYnNlcnZlclNldCA9IEVtYmVyLl9PYnNlcnZlclNldCA9IGZ1bmN0aW9uKCkgewotICB0
aGlzLmNsZWFyKCk7Ci19OwotCi1PYnNlcnZlclNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24o
c2VuZGVyLCBrZXlOYW1lLCBldmVudE5hbWUpIHsKLSAgdmFyIG9ic2VydmVyU2V0ID0gdGhpcy5v
YnNlcnZlclNldCwKLSAgICAgIG9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzLAotICAgICAgc2Vu
ZGVyR3VpZCA9IGd1aWRGb3Ioc2VuZGVyKSwKLSAgICAgIGtleVNldCA9IG9ic2VydmVyU2V0W3Nl
bmRlckd1aWRdLAotICAgICAgaW5kZXg7Ci0KLSAgaWYgKCFrZXlTZXQpIHsKLSAgICBvYnNlcnZl
clNldFtzZW5kZXJHdWlkXSA9IGtleVNldCA9IHt9OwotICB9Ci0gIGluZGV4ID0ga2V5U2V0W2tl
eU5hbWVdOwotICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgewotICAgIGluZGV4ID0gb2JzZXJ2
ZXJzLnB1c2goewotICAgICAgc2VuZGVyOiBzZW5kZXIsCi0gICAgICBrZXlOYW1lOiBrZXlOYW1l
LAotICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUsCi0gICAgICBsaXN0ZW5lcnM6IFtdCi0gICAg
fSkgLSAxOwotICAgIGtleVNldFtrZXlOYW1lXSA9IGluZGV4OwotICB9Ci0gIHJldHVybiBvYnNl
cnZlcnNbaW5kZXhdLmxpc3RlbmVyczsKLX07Ci0KLU9ic2VydmVyU2V0LnByb3RvdHlwZS5mbHVz
aCA9IGZ1bmN0aW9uKCkgewotICB2YXIgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMsIGksIGxl
biwgb2JzZXJ2ZXIsIHNlbmRlcjsKLSAgdGhpcy5jbGVhcigpOwotICBmb3IgKGk9MCwgbGVuPW9i
c2VydmVycy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewotICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJz
W2ldOwotICAgIHNlbmRlciA9IG9ic2VydmVyLnNlbmRlcjsKLSAgICBpZiAoc2VuZGVyLmlzRGVz
dHJveWluZyB8fCBzZW5kZXIuaXNEZXN0cm95ZWQpIHsgY29udGludWU7IH0KLSAgICBzZW5kRXZl
bnQoc2VuZGVyLCBvYnNlcnZlci5ldmVudE5hbWUsIFtzZW5kZXIsIG9ic2VydmVyLmtleU5hbWVd
LCBvYnNlcnZlci5saXN0ZW5lcnMpOwotICB9Ci19OwotCi1PYnNlcnZlclNldC5wcm90b3R5cGUu
Y2xlYXIgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5vYnNlcnZlclNldCA9IHt9OwotICB0aGlzLm9i
c2VydmVycyA9IFtdOwotfTsKLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZv
ciA9IEVtYmVyLm1ldGEsCi0gICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgdHJ5Rmlu
YWxseSA9IEVtYmVyLnRyeUZpbmFsbHksCi0gICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50
LAotICAgIGxpc3RlbmVyc1VuaW9uID0gRW1iZXIubGlzdGVuZXJzVW5pb24sCi0gICAgbGlzdGVu
ZXJzRGlmZiA9IEVtYmVyLmxpc3RlbmVyc0RpZmYsCi0gICAgT2JzZXJ2ZXJTZXQgPSBFbWJlci5f
T2JzZXJ2ZXJTZXQsCi0gICAgYmVmb3JlT2JzZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2ZXJTZXQoKSwK
LSAgICBvYnNlcnZlclNldCA9IG5ldyBPYnNlcnZlclNldCgpLAotICAgIGRlZmVycmVkID0gMDsK
LQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgotLy8gUFJPUEVSVFkgQ0hBTkdFUwotLy8KLQotLyoqCi0gIFRoaXMgZnVuY3Rpb24g
aXMgY2FsbGVkIGp1c3QgYmVmb3JlIGFuIG9iamVjdCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFu
Z2UuCi0gIEl0IHdpbGwgbm90aWZ5IGFueSBiZWZvcmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJlIGNh
Y2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCi0KLSAgTm9ybWFsbHkgeW91IHdpbGwgbm90IG5lZWQg
dG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSBidXQgaWYgZm9yIHNvbWUKLSAgcmVhc29uIHlv
dSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4gaW52b2tlIHRoaXMgbWV0
aG9kCi0gIG1hbnVhbGx5IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKClgIHdo
aWNoIHlvdSBzaG91bGQgY2FsbCBqdXN0Ci0gIGFmdGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSBjaGFu
Z2VzLgotCi0gIEBtZXRob2QgcHJvcGVydHlXaWxsQ2hhbmdlCi0gIEBmb3IgRW1iZXIKLSAgQHBh
cmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBj
aGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0
aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJldHVybiB7dm9pZH0KLSovCi1mdW5jdGlvbiBwcm9w
ZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmosIGZh
bHNlKSwKLSAgICAgIHdhdGNoaW5nID0gbS53YXRjaGluZ1trZXlOYW1lXSA+IDAgfHwga2V5TmFt
ZSA9PT0gJ2xlbmd0aCcsCi0gICAgICBwcm90byA9IG0ucHJvdG8sCi0gICAgICBkZXNjID0gbS5k
ZXNjc1trZXlOYW1lXTsKLQotICBpZiAoIXdhdGNoaW5nKSB7IHJldHVybjsgfQotICBpZiAocHJv
dG8gPT09IG9iaikgeyByZXR1cm47IH0KLSAgaWYgKGRlc2MgJiYgZGVzYy53aWxsQ2hhbmdlKSB7
IGRlc2Mud2lsbENoYW5nZShvYmosIGtleU5hbWUpOyB9Ci0gIGRlcGVuZGVudEtleXNXaWxsQ2hh
bmdlKG9iaiwga2V5TmFtZSwgbSk7Ci0gIGNoYWluc1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBt
KTsKLSAgbm90aWZ5QmVmb3JlT2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSk7Ci19Ci1FbWJlci5wcm9w
ZXJ0eVdpbGxDaGFuZ2UgPSBwcm9wZXJ0eVdpbGxDaGFuZ2U7Ci0KLS8qKgotICBUaGlzIGZ1bmN0
aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4K
LSAgSXQgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyBhbmQgY2xlYXIgY2FjaGVzIGFtb25nIG90
aGVyIHRoaW5ncy4KLQotICBOb3JtYWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMg
bWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Igc29tZQotICByZWFzb24geW91IGNhbid0IGRpcmVj
dGx5IHdhdGNoIGEgcHJvcGVydHkgeW91IGNhbiBpbnZva2UgdGhpcyBtZXRob2QKLSAgbWFudWFs
bHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKClgIHdoaWNoIHlvdSBzaG91
bGQgY2FsbCBqdXN0Ci0gIGJlZm9yZSB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KLQotICBA
bWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9
IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBh
cmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxs
IGNoYW5nZS4KLSAgQHJldHVybiB7dm9pZH0KLSovCi1mdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5n
ZShvYmosIGtleU5hbWUpIHsKLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLAotICAgICAg
d2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tleU5hbWVdID4gMCB8fCBrZXlOYW1lID09PSAnbGVuZ3Ro
JywKLSAgICAgIHByb3RvID0gbS5wcm90bywKLSAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVd
OwotCi0gIGlmIChwcm90byA9PT0gb2JqKSB7IHJldHVybjsgfQotCi0gIC8vIHNob3VsZG4ndCB0
aGlzIG1lYW4gdGhhdCB3ZSdyZSB3YXRjaGluZyB0aGlzIGtleT8KLSAgaWYgKGRlc2MgJiYgZGVz
Yy5kaWRDaGFuZ2UpIHsgZGVzYy5kaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKTsgfQotICBpZiAoIXdh
dGNoaW5nICYmIGtleU5hbWUgIT09ICdsZW5ndGgnKSB7IHJldHVybjsgfQotCi0gIGRlcGVuZGVu
dEtleXNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKLSAgY2hhaW5zRGlkQ2hhbmdlKG9iaiwg
a2V5TmFtZSwgbSwgZmFsc2UpOwotICBub3RpZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKLX0K
LUVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlID0gcHJvcGVydHlEaWRDaGFuZ2U7Ci0KLXZhciBXSUxM
X1NFRU4sIERJRF9TRUVOOwotCi0vLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBpcyBhYm91
dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNhY2hlIG9mIGFueSBkZXBlbmRlbnQga2V5cyAoYW5k
IG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9mIGNoYW5nZXMsIGV0Yy4uLikKLWZ1bmN0aW9uIGRl
cGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwgZGVwS2V5LCBtZXRhKSB7Ci0gIGlmIChvYmouaXNE
ZXN0cm95aW5nKSB7IHJldHVybjsgfQotCi0gIHZhciBzZWVuID0gV0lMTF9TRUVOLCB0b3AgPSAh
c2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0gV0lMTF9TRUVOID0ge307IH0KLSAgaXRlckRlcHMo
cHJvcGVydHlXaWxsQ2hhbmdlLCBvYmosIGRlcEtleSwgc2VlbiwgbWV0YSk7Ci0gIGlmICh0b3Ap
IHsgV0lMTF9TRUVOID0gbnVsbDsgfQotfQotCi0vLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0
eSBoYXMganVzdCBjaGFuZ2VkIHRvIHVwZGF0ZSBkZXBlbmRlbnQga2V5cwotZnVuY3Rpb24gZGVw
ZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRlcEtleSwgbWV0YSkgewotICBpZiAob2JqLmlzRGVz
dHJveWluZykgeyByZXR1cm47IH0KLQotICB2YXIgc2VlbiA9IERJRF9TRUVOLCB0b3AgPSAhc2Vl
bjsKLSAgaWYgKHRvcCkgeyBzZWVuID0gRElEX1NFRU4gPSB7fTsgfQotICBpdGVyRGVwcyhwcm9w
ZXJ0eURpZENoYW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOwotICBpZiAodG9wKSB7IERJ
RF9TRUVOID0gbnVsbDsgfQotfQotCi1mdW5jdGlvbiBpdGVyRGVwcyhtZXRob2QsIG9iaiwgZGVw
S2V5LCBzZWVuLCBtZXRhKSB7Ci0gIHZhciBndWlkID0gZ3VpZEZvcihvYmopOwotICBpZiAoIXNl
ZW5bZ3VpZF0pIHNlZW5bZ3VpZF0gPSB7fTsKLSAgaWYgKHNlZW5bZ3VpZF1bZGVwS2V5XSkgcmV0
dXJuOwotICBzZWVuW2d1aWRdW2RlcEtleV0gPSB0cnVlOwotCi0gIHZhciBkZXBzID0gbWV0YS5k
ZXBzOwotICBkZXBzID0gZGVwcyAmJiBkZXBzW2RlcEtleV07Ci0gIGlmIChkZXBzKSB7Ci0gICAg
Zm9yKHZhciBrZXkgaW4gZGVwcykgewotICAgICAgdmFyIGRlc2MgPSBtZXRhLmRlc2NzW2tleV07
Ci0gICAgICBpZiAoZGVzYyAmJiBkZXNjLl9zdXNwZW5kZWQgPT09IG9iaikgY29udGludWU7Ci0g
ICAgICBtZXRob2Qob2JqLCBrZXkpOwotICAgIH0KLSAgfQotfQotCi1mdW5jdGlvbiBjaGFpbnNX
aWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSkgewotICBpZiAoIShtLmhhc093blByb3BlcnR5KCdj
aGFpbldhdGNoZXJzJykgJiYKLSAgICAgICAgbS5jaGFpbldhdGNoZXJzW2tleU5hbWVdKSkgewot
ICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1l
XSwKLSAgICAgIGV2ZW50cyA9IFtdLAotICAgICAgaSwgbDsKLQotICBmb3IoaSA9IDAsIGwgPSBu
b2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBub2Rlc1tpXS53aWxsQ2hhbmdlKGV2ZW50
cyk7Ci0gIH0KLQotICBmb3IgKGkgPSAwLCBsID0gZXZlbnRzLmxlbmd0aDsgaSA8IGw7IGkgKz0g
MikgewotICAgIHByb3BlcnR5V2lsbENoYW5nZShldmVudHNbaV0sIGV2ZW50c1tpKzFdKTsKLSAg
fQotfQotCi1mdW5jdGlvbiBjaGFpbnNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtLCBzdXBwcmVz
c0V2ZW50cykgewotICBpZiAoIShtLmhhc093blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYK
LSAgICAgICAgbS5jaGFpbldhdGNoZXJzW2tleU5hbWVdKSkgewotICAgIHJldHVybjsKLSAgfQot
Ci0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1lXSwKLSAgICAgIGV2ZW50cyA9
IHN1cHByZXNzRXZlbnRzID8gbnVsbCA6IFtdLAotICAgICAgaSwgbDsKLQotICBmb3IoaSA9IDAs
IGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBub2Rlc1tpXS5kaWRDaGFuZ2Uo
ZXZlbnRzKTsKLSAgfQotCi0gIGlmIChzdXBwcmVzc0V2ZW50cykgewotICAgIHJldHVybjsKLSAg
fQotCi0gIGZvciAoaSA9IDAsIGwgPSBldmVudHMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Ci0g
ICAgcHJvcGVydHlEaWRDaGFuZ2UoZXZlbnRzW2ldLCBldmVudHNbaSsxXSk7Ci0gIH0KLX0KLQot
RW1iZXIub3ZlcnJpZGVDaGFpbnMgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIG0pIHsKLSAgY2hh
aW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSwgdHJ1ZSk7Ci19OwotCi0vKioKLSAgQG1ldGhv
ZCBiZWdpblByb3BlcnR5Q2hhbmdlcwotICBAY2hhaW5hYmxlCi0gIEBwcml2YXRlCi0qLwotZnVu
Y3Rpb24gYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKSB7Ci0gIGRlZmVycmVkKys7Ci19Ci0KLUVtYmVy
LmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVnaW5Qcm9wZXJ0eUNoYW5nZXM7Ci0KLS8qKgotICBA
bWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcwotICBAcHJpdmF0ZQotKi8KLWZ1bmN0aW9uIGVuZFBy
b3BlcnR5Q2hhbmdlcygpIHsKLSAgZGVmZXJyZWQtLTsKLSAgaWYgKGRlZmVycmVkPD0wKSB7Ci0g
ICAgYmVmb3JlT2JzZXJ2ZXJTZXQuY2xlYXIoKTsKLSAgICBvYnNlcnZlclNldC5mbHVzaCgpOwot
ICB9Ci19Ci0KLUVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcyA9IGVuZFByb3BlcnR5Q2hhbmdlczsK
LQotLyoqCi0gIE1ha2UgYSBzZXJpZXMgb2YgcHJvcGVydHkgY2hhbmdlcyB0b2dldGhlciBpbiBh
bgotICBleGNlcHRpb24tc2FmZSB3YXkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5jaGFu
Z2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgewotICAgIG9iajEuc2V0KCdmb28nLCBtYXlCbG93VXBX
aGVuU2V0KTsKLSAgICBvYmoyLnNldCgnYmFyJywgYmF6KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBt
ZXRob2QgY2hhbmdlUHJvcGVydGllcwotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBA
cGFyYW0gW2JpbmRpbmddCi0qLwotRW1iZXIuY2hhbmdlUHJvcGVydGllcyA9IGZ1bmN0aW9uKGNi
LCBiaW5kaW5nKSB7Ci0gIGJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7Ci0gIHRyeUZpbmFsbHkoY2Is
IGVuZFByb3BlcnR5Q2hhbmdlcywgYmluZGluZyk7Ci19OwotCi1mdW5jdGlvbiBub3RpZnlCZWZv
cmVPYnNlcnZlcnMob2JqLCBrZXlOYW1lKSB7Ci0gIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJl
dHVybjsgfQotCi0gIHZhciBldmVudE5hbWUgPSBrZXlOYW1lICsgJzpiZWZvcmUnLCBsaXN0ZW5l
cnMsIGRpZmY7Ci0gIGlmIChkZWZlcnJlZCkgewotICAgIGxpc3RlbmVycyA9IGJlZm9yZU9ic2Vy
dmVyU2V0LmFkZChvYmosIGtleU5hbWUsIGV2ZW50TmFtZSk7Ci0gICAgZGlmZiA9IGxpc3RlbmVy
c0RpZmYob2JqLCBldmVudE5hbWUsIGxpc3RlbmVycyk7Ci0gICAgc2VuZEV2ZW50KG9iaiwgZXZl
bnROYW1lLCBbb2JqLCBrZXlOYW1lXSwgZGlmZik7Ci0gIH0gZWxzZSB7Ci0gICAgc2VuZEV2ZW50
KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlOYW1lXSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gbm90
aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSkgewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyBy
ZXR1cm47IH0KLQotICB2YXIgZXZlbnROYW1lID0ga2V5TmFtZSArICc6Y2hhbmdlJywgbGlzdGVu
ZXJzOwotICBpZiAoZGVmZXJyZWQpIHsKLSAgICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNldC5hZGQo
b2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOwotICAgIGxpc3RlbmVyc1VuaW9uKG9iaiwgZXZlbnRO
YW1lLCBsaXN0ZW5lcnMpOwotICB9IGVsc2UgewotICAgIHNlbmRFdmVudChvYmosIGV2ZW50TmFt
ZSwgW29iaiwga2V5TmFtZV0pOwotICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci0vLyBNRVRBX0tFWQotLy8gX2dldFBhdGgKLS8vIHByb3BlcnR5V2lsbENoYW5nZSwgcHJvcGVy
dHlEaWRDaGFuZ2UKLQotdmFyIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgTUFOREFU
T1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSLAotICAgIElTX0dMT0JBTCA9
IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS8sCi0gICAgZ2V0UGF0aCA9IEVtYmVyLl9nZXRQYXRo
OwotCi0vKioKLSAgU2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QsIHJl
c3BlY3RpbmcgY29tcHV0ZWQgcHJvcGVydGllcwotICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBh
bmQgb3RoZXIgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIElmIHRoZQotICBwcm9wZXJ0eSBpcyBu
b3QgZGVmaW5lZCBidXQgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBgc2V0VW5rbm93blByb3Bl
cnR5YAotICBtZXRob2QgdGhlbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBhcyB3ZWxsLgotCi0gIElm
IHlvdSBwbGFuIHRvIHJ1biBvbiBJRTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3Vs
ZCB1c2UgdGhpcwotICBtZXRob2QgYW55dGltZSB5b3Ugd2FudCB0byBzZXQgYSBwcm9wZXJ0eSBv
biBhbiBvYmplY3QgdGhhdCB5b3UgZG9uJ3QKLSAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRlLiAo
UHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlICdfJwotICBhcmUgY29uc2lk
ZXJlZCBwcml2YXRlLikKLQotICBPbiBhbGwgbmV3ZXIgYnJvd3NlcnMsIHlvdSBvbmx5IG5lZWQg
dG8gdXNlIHRoaXMgbWV0aG9kIHRvIHNldAotICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBt
aWdodCBub3QgYmUgZGVmaW5lZCBvbiB0aGUgb2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNw
ZWN0IHRoZSBgc2V0VW5rbm93blByb3BlcnR5YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBp
Z25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAgQG1ldGhvZCBzZXQKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gbW9kaWZ5LgotICBAcGFyYW0ge1N0cmlu
Z30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5IHRvIHNldAotICBAcGFyYW0ge09iamVjdH0gdmFs
dWUgVGhlIHZhbHVlIHRvIHNldAotICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgdmFsdWUu
Ci0qLwotdmFyIHNldCA9IGZ1bmN0aW9uIHNldChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFu
dCkgewotICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHsKLSAgICBFbWJlci5hc3NlcnQo
IlBhdGggJyIgKyBvYmogKyAiJyBtdXN0IGJlIGdsb2JhbCBpZiBubyBvYmogaXMgZ2l2ZW4uIiwg
SVNfR0xPQkFMLnRlc3Qob2JqKSk7Ci0gICAgdmFsdWUgPSBrZXlOYW1lOwotICAgIGtleU5hbWUg
PSBvYmo7Ci0gICAgb2JqID0gbnVsbDsKLSAgfQotCi0gIEVtYmVyLmFzc2VydCgiQ2Fubm90IGNh
bGwgc2V0IHdpdGggIisga2V5TmFtZSArIiBrZXkuIiwgISFrZXlOYW1lKTsKLQotICBpZiAoIW9i
aiB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsKLSAgICByZXR1cm4gc2V0UGF0aChv
YmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFudCk7Ci0gIH0KLQotICBFbWJlci5hc3NlcnQoIllv
dSBuZWVkIHRvIHByb3ZpZGUgYW4gb2JqZWN0IGFuZCBrZXkgdG8gYHNldGAuIiwgISFvYmogJiYg
a2V5TmFtZSAhPT0gdW5kZWZpbmVkKTsKLSAgRW1iZXIuYXNzZXJ0KCdjYWxsaW5nIHNldCBvbiBk
ZXN0cm95ZWQgb2JqZWN0JywgIW9iai5pc0Rlc3Ryb3llZCk7Ci0KLSAgdmFyIG1ldGEgPSBvYmpb
TUVUQV9LRVldLCBkZXNjID0gbWV0YSAmJiBtZXRhLmRlc2NzW2tleU5hbWVdLAotICAgICAgaXNV
bmtub3duLCBjdXJyZW50VmFsdWU7Ci0gIGlmIChkZXNjKSB7Ci0gICAgZGVzYy5zZXQob2JqLCBr
ZXlOYW1lLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgaXNVbmtub3duID0gJ29iamVjdCcgPT09
IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGluIG9iaik7Ci0KLSAgICAvLyBzZXRVbmtub3duUHJv
cGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlzIGFuIG9iamVjdCwKLSAgICAvLyB0aGUgcHJvcGVy
dHkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQotICAgIC8vIGBzZXRVbmtub3duUHJv
cGVydHlgIG1ldGhvZCBleGlzdHMgb24gdGhlIG9iamVjdAotICAgIGlmIChpc1Vua25vd24gJiYg
J2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZXRVbmtub3duUHJvcGVydHkpIHsKLSAgICAgIG9i
ai5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAobWV0
YSAmJiBtZXRhLndhdGNoaW5nW2tleU5hbWVdID4gMCkgewotICAgICAgaWYgKE1BTkRBVE9SWV9T
RVRURVIpIHsKLSAgICAgICAgY3VycmVudFZhbHVlID0gbWV0YS52YWx1ZXNba2V5TmFtZV07Ci0g
ICAgICB9IGVsc2UgewotICAgICAgICBjdXJyZW50VmFsdWUgPSBvYmpba2V5TmFtZV07Ci0gICAg
ICB9Ci0gICAgICAvLyBvbmx5IHRyaWdnZXIgYSBjaGFuZ2UgaWYgdGhlIHZhbHVlIGhhcyBjaGFu
Z2VkCi0gICAgICBpZiAodmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkgewotICAgICAgICBFbWJlci5w
cm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsKLSAgICAgICAgaWYgKE1BTkRBVE9SWV9T
RVRURVIpIHsKLSAgICAgICAgICBpZiAoKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEo
a2V5TmFtZSBpbiBvYmopKSB8fCAhb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtleU5hbWUpKSB7
Ci0gICAgICAgICAgICBFbWJlci5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIHZh
bHVlKTsgLy8gc2V0dXAgbWFuZGF0b3J5IHNldHRlcgotICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBtZXRhLnZhbHVlc1trZXlOYW1lXSA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgfQot
ICAgICAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpOwotICAgICAgfQot
ICAgIH0gZWxzZSB7Ci0gICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAg
cmV0dXJuIHZhbHVlOwotfTsKLQotLy8gQ3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRh
IHRlc3RzCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKSB7Ci0gIEVtYmVyLnNl
dCA9IHNldDsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIHNldCA9IEVt
YmVyLnNldDsKLX0KLQotZnVuY3Rpb24gc2V0UGF0aChyb290LCBwYXRoLCB2YWx1ZSwgdG9sZXJh
bnQpIHsKLSAgdmFyIGtleU5hbWU7Ci0KLSAgLy8gZ2V0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHBh
dGgKLSAga2V5TmFtZSA9IHBhdGguc2xpY2UocGF0aC5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0K
LSAgLy8gZ2V0IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXJ0Ci0gIHBhdGggICAgPSAocGF0aCA9
PT0ga2V5TmFtZSkgPyBrZXlOYW1lIDogcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aC0oa2V5TmFt
ZS5sZW5ndGgrMSkpOwotCi0gIC8vIHVubGVzcyB0aGUgcGF0aCBpcyB0aGlzLCBsb29rIHVwIHRo
ZSBmaXJzdCBwYXJ0IHRvCi0gIC8vIGdldCB0aGUgcm9vdAotICBpZiAocGF0aCAhPT0gJ3RoaXMn
KSB7Ci0gICAgcm9vdCA9IGdldFBhdGgocm9vdCwgcGF0aCk7Ci0gIH0KLQotICBpZiAoIWtleU5h
bWUgfHwga2V5TmFtZS5sZW5ndGggPT09IDApIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3Io
J1Byb3BlcnR5IHNldCBmYWlsZWQ6IFlvdSBwYXNzZWQgYW4gZW1wdHkgcGF0aCcpOwotICB9Ci0K
LSAgaWYgKCFyb290KSB7Ci0gICAgaWYgKHRvbGVyYW50KSB7IHJldHVybjsgfQotICAgIGVsc2Ug
eyB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1Byb3BlcnR5IHNldCBmYWlsZWQ6IG9iamVjdCBpbiBw
YXRoICInK3BhdGgrJyIgY291bGQgbm90IGJlIGZvdW5kIG9yIHdhcyBkZXN0cm95ZWQuJyk7IH0K
LSAgfQotCi0gIHJldHVybiBzZXQocm9vdCwga2V5TmFtZSwgdmFsdWUpOwotfQotCi1FbWJlci5z
ZXQgPSBzZXQ7Ci0KLS8qKgotICBFcnJvci10b2xlcmFudCBmb3JtIG9mIGBFbWJlci5zZXRgLiBX
aWxsIG5vdCBibG93IHVwIGlmIGFueSBwYXJ0IG9mIHRoZQotICBjaGFpbiBpcyBgdW5kZWZpbmVk
YCwgYG51bGxgLCBvciBkZXN0cm95ZWQuCi0KLSAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3aGVu
IHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1heSB0cnkgdG8gdXBkYXRlIGFmdGVyCi0gIGFuIG9i
amVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCi0KLSAgQG1ldGhvZCB0cnlTZXQKLSAgQGZvciBFbWJl
cgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gbW9kaWZ5LgotICBAcGFyYW0g
e1N0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byBzZXQKLSAgQHBhcmFtIHtPYmplY3R9
IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSovCi1FbWJlci50cnlTZXQgPSBmdW5jdGlvbihyb290
LCBwYXRoLCB2YWx1ZSkgewotICByZXR1cm4gc2V0KHJvb3QsIHBhdGgsIHZhbHVlLCB0cnVlKTsK
LX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXItbWV0
YWwKLSovCi0KLS8qCi0gIEphdmFTY3JpcHQgKGJlZm9yZSBFUzYpIGRvZXMgbm90IGhhdmUgYSBN
YXAgaW1wbGVtZW50YXRpb24uIE9iamVjdHMsCi0gIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGFzIGRp
Y3Rpb25hcmllcywgbWF5IG9ubHkgaGF2ZSBTdHJpbmdzIGFzIGtleXMuCi0KLSAgQmVjYXVzZSBF
bWJlciBoYXMgYSB3YXkgdG8gZ2V0IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGV2ZXJ5IG9iamVj
dAotICB2aWEgYEVtYmVyLmd1aWRGb3JgLCB3ZSBjYW4gaW1wbGVtZW50IGEgcGVyZm9ybWFudCBN
YXAgd2l0aCBhcmJpdHJhcnkKLSAga2V5cy4gQmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIGlu
IGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFwIGlzCi0gIGltcGxlbWVudGVkIGFzIGEgcHVyZSBK
YXZhU2NyaXB0IG9iamVjdCBmb3IgcGVyZm9ybWFuY2UuCi0KLSAgVGhpcyBpbXBsZW1lbnRhdGlv
biBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgot
ICBtYXBzIChodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnNp
bXBsZV9tYXBzX2FuZF9zZXRzKSwKLSAgd2l0aCB0d28gZXhjZXB0aW9ucy4gRmlyc3QsIGJlY2F1
c2Ugd2UgbmVlZCBvdXIgaW1wbGVtZW50YXRpb24gdG8gYmUgcGxlYXNhbnQKLSAgb24gb2xkZXIg
YnJvd3NlcnMsIHdlIGRvIG5vdCB1c2UgdGhlIGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVg
IGluc3RlYWQpLgotICBTZWNvbmQsIGFzIHdlIGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4t
Vk0gaXRlcmF0aW9uLCB3ZSBpbXBsZW1lbnQgYQotICBmb3JFYWNoIG1ldGhvZCBmb3IgaXRlcmF0
aW9uLgotCi0gIE1hcCBpcyBtb2NrZWQgb3V0IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3Qs
IHNvIHlvdSBjYW4gZG8KLSAgYEVtYmVyLk1hcC5jcmVhdGUoKWAgZm9yIHN5bW1ldHJ5IHdpdGgg
b3RoZXIgRW1iZXIgY2xhc3Nlcy4KLSovCi12YXIgc2V0ID0gRW1iZXIuc2V0LAotICAgIGd1aWRG
b3IgPSBFbWJlci5ndWlkRm9yLAotICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5p
bmRleE9mOwotCi12YXIgY29weSA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgb3V0cHV0ID0ge307
Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKLSAgICBpZiAob2JqLmhhc093blByb3BlcnR5
KHByb3ApKSB7IG91dHB1dFtwcm9wXSA9IG9ialtwcm9wXTsgfQotICB9Ci0KLSAgcmV0dXJuIG91
dHB1dDsKLX07Ci0KLXZhciBjb3B5TWFwID0gZnVuY3Rpb24ob3JpZ2luYWwsIG5ld09iamVjdCkg
ewotICB2YXIga2V5cyA9IG9yaWdpbmFsLmtleXMuY29weSgpLAotICAgICAgdmFsdWVzID0gY29w
eShvcmlnaW5hbC52YWx1ZXMpOwotCi0gIG5ld09iamVjdC5rZXlzID0ga2V5czsKLSAgbmV3T2Jq
ZWN0LnZhbHVlcyA9IHZhbHVlczsKLSAgbmV3T2JqZWN0Lmxlbmd0aCA9IG9yaWdpbmFsLmxlbmd0
aDsKLQotICByZXR1cm4gbmV3T2JqZWN0OwotfTsKLQotLyoqCi0gIFRoaXMgY2xhc3MgaXMgdXNl
ZCBpbnRlcm5hbGx5IGJ5IEVtYmVyIGFuZCBFbWJlciBEYXRhLgotICBQbGVhc2UgZG8gbm90IHVz
ZSBpdCBhdCB0aGlzIHRpbWUuIFdlIHBsYW4gdG8gY2xlYW4gaXQgdXAKLSAgYW5kIGFkZCBtYW55
IHRlc3RzIHNvb24uCi0KLSAgQGNsYXNzIE9yZGVyZWRTZXQKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAY29uc3RydWN0b3IKLSAgQHByaXZhdGUKLSovCi12YXIgT3JkZXJlZFNldCA9IEVtYmVyLk9y
ZGVyZWRTZXQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5jbGVhcigpOwotfTsKLQotLyoqCi0gIEBt
ZXRob2QgY3JlYXRlCi0gIEBzdGF0aWMKLSAgQHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSov
Ci1PcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gbmV3IE9yZGVyZWRT
ZXQoKTsKLX07Ci0KLQotT3JkZXJlZFNldC5wcm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIEBtZXRo
b2QgY2xlYXIKLSAgKi8KLSAgY2xlYXI6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucHJlc2VuY2VT
ZXQgPSB7fTsKLSAgICB0aGlzLmxpc3QgPSBbXTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IGFkZAotICAgIEBwYXJhbSBvYmoKLSAgKi8KLSAgYWRkOiBmdW5jdGlvbihvYmopIHsKLSAgICB2
YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAgICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNl
bmNlU2V0LAotICAgICAgICBsaXN0ID0gdGhpcy5saXN0OwotCi0gICAgaWYgKGd1aWQgaW4gcHJl
c2VuY2VTZXQpIHsgcmV0dXJuOyB9Ci0KLSAgICBwcmVzZW5jZVNldFtndWlkXSA9IHRydWU7Ci0g
ICAgbGlzdC5wdXNoKG9iaik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCByZW1vdmUKLSAg
ICBAcGFyYW0gb2JqCi0gICovCi0gIHJlbW92ZTogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGd1
aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNl
dCwKLSAgICAgICAgbGlzdCA9IHRoaXMubGlzdDsKLQotICAgIGRlbGV0ZSBwcmVzZW5jZVNldFtn
dWlkXTsKLQotICAgIHZhciBpbmRleCA9IGluZGV4T2YuY2FsbChsaXN0LCBvYmopOwotICAgIGlm
IChpbmRleCA+IC0xKSB7Ci0gICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7Ci0gICAgfQotICB9
LAotCi0gIC8qKgotICAgIEBtZXRob2QgaXNFbXB0eQotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0g
ICovCi0gIGlzRW1wdHk6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3Ro
ID09PSAwOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIG9iagot
ICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhczogZnVuY3Rpb24ob2JqKSB7Ci0gICAg
dmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVz
ZW5jZVNldDsKLQotICAgIHJldHVybiBndWlkIGluIHByZXNlbmNlU2V0OwotICB9LAotCi0gIC8q
KgotICAgIEBtZXRob2QgZm9yRWFjaAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gICAgQHBh
cmFtIHNlbGYKLSAgKi8KLSAgZm9yRWFjaDogZnVuY3Rpb24oZm4sIHNlbGYpIHsKLSAgICAvLyBh
bGxvdyBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uCi0gICAgdmFyIGxpc3QgPSB0aGlzLnRvQXJy
YXkoKTsKLQotICAgIGZvciAodmFyIGkgPSAwLCBqID0gbGlzdC5sZW5ndGg7IGkgPCBqOyBpKysp
IHsKLSAgICAgIGZuLmNhbGwoc2VsZiwgbGlzdFtpXSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIEBtZXRob2QgdG9BcnJheQotICAgIEByZXR1cm4ge0FycmF5fQotICAqLwotICB0b0FycmF5
OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5saXN0LnNsaWNlKCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQG1ldGhvZCBjb3B5Ci0gICAgQHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSAg
Ki8KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNldCA9IG5ldyBPcmRlcmVkU2V0KCk7
Ci0KLSAgICBzZXQucHJlc2VuY2VTZXQgPSBjb3B5KHRoaXMucHJlc2VuY2VTZXQpOwotICAgIHNl
dC5saXN0ID0gdGhpcy50b0FycmF5KCk7Ci0KLSAgICByZXR1cm4gc2V0OwotICB9Ci19OwotCi0v
KioKLSAgQSBNYXAgc3RvcmVzIHZhbHVlcyBpbmRleGVkIGJ5IGtleXMuIFVubGlrZSBKYXZhU2Ny
aXB0J3MKLSAgZGVmYXVsdCBPYmplY3RzLCB0aGUga2V5cyBvZiBhIE1hcCBjYW4gYmUgYW55IEph
dmFTY3JpcHQKLSAgb2JqZWN0LgotCi0gIEludGVybmFsbHksIGEgTWFwIGhhcyB0d28gZGF0YSBz
dHJ1Y3R1cmVzOgotCi0gIDEuIGBrZXlzYDogYW4gT3JkZXJlZFNldCBvZiBhbGwgb2YgdGhlIGV4
aXN0aW5nIGtleXMKLSAgMi4gYHZhbHVlc2A6IGEgSmF2YVNjcmlwdCBPYmplY3QgaW5kZXhlZCBi
eSB0aGUgYEVtYmVyLmd1aWRGb3Ioa2V5KWAKLQotICBXaGVuIGEga2V5L3ZhbHVlIHBhaXIgaXMg
YWRkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB3ZQotICBhZGQgdGhlIGtleSB0byB0aGUgYGtleXNg
IE9yZGVyZWRTZXQsIGFuZCBjcmVhdGUgb3IKLSAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVz
YC4gV2hlbiBhbiBlbnRyeSBpcyBkZWxldGVkLAotICB3ZSBkZWxldGUgaXRzIGVudHJ5IGluIGBr
ZXlzYCBhbmQgYHZhbHVlc2AuCi0KLSAgQGNsYXNzIE1hcAotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBwcml2YXRlCi0gIEBjb25zdHJ1Y3RvcgotKi8KLXZhciBNYXAgPSBFbWJlci5NYXAgPSBmdW5j
dGlvbigpIHsKLSAgdGhpcy5rZXlzID0gRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgdGhp
cy52YWx1ZXMgPSB7fTsKLX07Ci0KLS8qKgotICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0q
LwotTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gbmV3IE1hcCgpOwotfTsKLQot
TWFwLnByb3RvdHlwZSA9IHsKLSAgLyoqCi0gICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNoYW5nZSBh
cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG1hcCBjaGFuZ2VzLgotICAgCi0gICAgQHBy
b3BlcnR5IGxlbmd0aAotICAgIEB0eXBlIG51bWJlcgotICAgIEBkZWZhdWx0IDAKLSAgKi8KLSAg
bGVuZ3RoOiAwLAotICAgIAotICAgIAotICAvKioKLSAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNz
b2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LgotCi0gICAgQG1ldGhvZCBnZXQKLSAgICBAcGFyYW0g
eyp9IGtleQotICAgIEByZXR1cm4geyp9IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtl
eSwgb3IgYHVuZGVmaW5lZGAKLSAgKi8KLSAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIg
dmFsdWVzID0gdGhpcy52YWx1ZXMsCi0gICAgICAgIGd1aWQgPSBndWlkRm9yKGtleSk7Ci0KLSAg
ICByZXR1cm4gdmFsdWVzW2d1aWRdOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYSB2YWx1ZSB0
byB0aGUgbWFwLiBJZiBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGJlZW4K
LSAgICBwcm92aWRlZCwgdGhlIG5ldyB2YWx1ZSB3aWxsIHJlcGxhY2UgdGhlIG9sZCB2YWx1ZS4K
LQotICAgIEBtZXRob2Qgc2V0Ci0gICAgQHBhcmFtIHsqfSBrZXkKLSAgICBAcGFyYW0geyp9IHZh
bHVlCi0gICovCi0gIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBrZXlzID0g
dGhpcy5rZXlzLAotICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9
IGd1aWRGb3Ioa2V5KTsKLQotICAgIGtleXMuYWRkKGtleSk7Ci0gICAgdmFsdWVzW2d1aWRdID0g
dmFsdWU7Ci0gICAgc2V0KHRoaXMsICdsZW5ndGgnLCBrZXlzLmxpc3QubGVuZ3RoKTsKLSAgfSwK
LQotICAvKioKLSAgICBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgbWFwIGZvciBhbiBhc3NvY2lh
dGVkIGtleS4KLQotICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgQHBhcmFtIHsqfSBrZXkKLSAgICBA
cmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFuIGl0ZW0gd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVy
d2lzZQotICAqLwotICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewotICAgIC8vIGRvbid0IHVzZSBF
UzYgImRlbGV0ZSIgYmVjYXVzZSBpdCB3aWxsIGJlIGFubm95aW5nCi0gICAgLy8gdG8gdXNlIGlu
IGJyb3dzZXJzIHRoYXQgYXJlIG5vdCBFUzYgZnJpZW5kbHk7Ci0gICAgdmFyIGtleXMgPSB0aGlz
LmtleXMsCi0gICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLAotICAgICAgICBndWlkID0gZ3Vp
ZEZvcihrZXkpOwotCi0gICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgewotICAg
ICAga2V5cy5yZW1vdmUoa2V5KTsKLSAgICAgIGRlbGV0ZSB2YWx1ZXNbZ3VpZF07Ci0gICAgICBz
ZXQodGhpcywgJ2xlbmd0aCcsIGtleXMubGlzdC5sZW5ndGgpOwotICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQ2hlY2sgd2hldGhlciBhIGtleSBpcyBwcmVzZW50LgotCi0gICAgQG1ldGhvZCBoYXMK
LSAgICBAcGFyYW0geyp9IGtleQotICAgIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGl0
ZW0gd2FzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lzZQotICAqLwotICBoYXM6IGZ1bmN0aW9uKGtl
eSkgewotICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRG
b3Ioa2V5KTsKLQotICAgIHJldHVybiB2YWx1ZXMuaGFzT3duUHJvcGVydHkoZ3VpZCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVyIGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzLiBDYWxs
cyB0aGUgZnVuY3Rpb24gb25jZQotICAgIGZvciBlYWNoIGtleSwgcGFzc2luZyBpbiB0aGUga2V5
IGFuZCB2YWx1ZSwgaW4gdGhhdCBvcmRlci4KLQotICAgIFRoZSBrZXlzIGFyZSBndWFyYW50ZWVk
IHRvIGJlIGl0ZXJhdGVkIG92ZXIgaW4gaW5zZXJ0aW9uIG9yZGVyLgotCi0gICAgQG1ldGhvZCBm
b3JFYWNoCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcGFyYW0geyp9IHNl
bGYgaWYgcGFzc2VkLCB0aGUgYHRoaXNgIHZhbHVlIGluc2lkZSB0aGUKLSAgICAgIGNhbGxiYWNr
LiBCeSBkZWZhdWx0LCBgdGhpc2AgaXMgdGhlIG1hcC4KLSAgKi8KLSAgZm9yRWFjaDogZnVuY3Rp
b24oY2FsbGJhY2ssIHNlbGYpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMua2V5cywKLSAgICAgICAg
dmFsdWVzID0gdGhpcy52YWx1ZXM7Ci0KLSAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7
Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoc2Vs
Ziwga2V5LCB2YWx1ZXNbZ3VpZF0pOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRo
b2QgY29weQotICAgIEByZXR1cm4ge0VtYmVyLk1hcH0KLSAgKi8KLSAgY29weTogZnVuY3Rpb24o
KSB7Ci0gICAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IE1hcCgpKTsKLSAgfQotfTsKLQotLyoq
Ci0gIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRz
IEVtYmVyLk1hcAotICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSAgQHBhcmFtIFtvcHRpb25z
XQotICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQotKi8KLXZhciBNYXBXaXRo
RGVmYXVsdCA9IEVtYmVyLk1hcFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBN
YXAuY2FsbCh0aGlzKTsKLSAgdGhpcy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1
ZTsKLX07Ci0KLS8qKgotICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBbb3B0
aW9uc10KLSAgICBAcGFyYW0geyp9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV0KLSAgQHJldHVybiB7
RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIuTWFwfSBJZiBvcHRpb25zIGFyZSBwYXNzZWQsIHJl
dHVybnMKLSAgICBgRW1iZXIuTWFwV2l0aERlZmF1bHRgIG90aGVyd2lzZSByZXR1cm5zIGBFbWJl
ci5NYXBgCi0qLwotTWFwV2l0aERlZmF1bHQuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewot
ICBpZiAob3B0aW9ucykgewotICAgIHJldHVybiBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9ucyk7
Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5ldyBNYXAoKTsKLSAgfQotfTsKLQotTWFwV2l0aERl
ZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKE1hcC5wcm90b3R5cGUpOwotCi0vKioKLSAg
UmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS4KLQotICBAbWV0
aG9kIGdldAotICBAcGFyYW0geyp9IGtleQotICBAcmV0dXJuIHsqfSB0aGUgdmFsdWUgYXNzb2Np
YXRlZCB3aXRoIHRoZSBrZXksIG9yIHRoZSBkZWZhdWx0IHZhbHVlCi0qLwotTWFwV2l0aERlZmF1
bHQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkgewotICB2YXIgaGFzVmFsdWUgPSB0aGlz
LmhhcyhrZXkpOwotCi0gIGlmIChoYXNWYWx1ZSkgewotICAgIHJldHVybiBNYXAucHJvdG90eXBl
LmdldC5jYWxsKHRoaXMsIGtleSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyIGRlZmF1bHRWYWx1ZSA9
IHRoaXMuZGVmYXVsdFZhbHVlKGtleSk7Ci0gICAgdGhpcy5zZXQoa2V5LCBkZWZhdWx0VmFsdWUp
OwotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIH0KLX07Ci0KLS8qKgotICBAbWV0aG9kIGNv
cHkKLSAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR9Ci0qLwotTWFwV2l0aERlZmF1bHQu
cHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3
IE1hcFdpdGhEZWZhdWx0KHsKLSAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlCi0g
IH0pKTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1mdW5jdGlvbiBjb25zb2xl
TWV0aG9kKG5hbWUpIHsKLSAgdmFyIGNvbnNvbGVPYmosIGxvZ1RvQ29uc29sZTsKLSAgaWYgKEVt
YmVyLmltcG9ydHMuY29uc29sZSkgewotICAgIGNvbnNvbGVPYmogPSBFbWJlci5pbXBvcnRzLmNv
bnNvbGU7Ci0gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7Ci0g
ICAgY29uc29sZU9iaiA9IGNvbnNvbGU7Ci0gIH0KLQotICB2YXIgbWV0aG9kID0gdHlwZW9mIGNv
bnNvbGVPYmogPT09ICdvYmplY3QnID8gY29uc29sZU9ialtuYW1lXSA6IG51bGw7Ci0KLSAgaWYg
KG1ldGhvZCkgewotICAgIC8vIE9sZGVyIElFIGRvZXNuJ3Qgc3VwcG9ydCBhcHBseSwgYnV0IENo
cm9tZSBuZWVkcyBpdAotICAgIGlmIChtZXRob2QuYXBwbHkpIHsKLSAgICAgIGxvZ1RvQ29uc29s
ZSA9IGZ1bmN0aW9uKCkgewotICAgICAgICBtZXRob2QuYXBwbHkoY29uc29sZU9iaiwgYXJndW1l
bnRzKTsKLSAgICAgIH07Ci0gICAgICBsb2dUb0NvbnNvbGUuZGlzcGxheU5hbWUgPSAnY29uc29s
ZS4nICsgbmFtZTsKLSAgICAgIHJldHVybiBsb2dUb0NvbnNvbGU7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIG1lc3NhZ2UgPSBBcnJheS5wcm90
b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywgJywgJyk7Ci0gICAgICAgIG1ldGhvZChtZXNzYWdl
KTsKLSAgICAgIH07Ci0gICAgfQotICB9Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydFBvbHlmaWxsKHRl
c3QsIG1lc3NhZ2UpIHsKLSAgaWYgKCF0ZXN0KSB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIGF0dGVt
cHQgdG8gcHJlc2VydmUgdGhlIHN0YWNrCi0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoImFz
c2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdlKTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAg
ICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICB0aHJvdyBlcnJvcjsKLSAgICAgIH0s
IDApOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1wbHkg
dXNlcyB0aGUgbWV0aG9kcyBmcm9tIGBpbXBvcnRzLmNvbnNvbGVgLgotICBPdmVycmlkZSB0aGlz
IHRvIHByb3ZpZGUgbW9yZSByb2J1c3QgbG9nZ2luZyBmdW5jdGlvbmFsaXR5LgotCi0gIEBjbGFz
cyBMb2dnZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLkxvZ2dlciA9IHsKLSAgLyoq
Ci0gICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUuCi0gICBZb3UgY2FuIHBhc3Mg
YXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdhbnQgYW5kIHRoZXkgd2lsbCBiZSBqb2luZWQgdG9n
ZXRoZXIgd2l0aCBhIHNwYWNlLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBmb28gPSAx
OwotICAgIEVtYmVyLkxvZ2dlci5sb2coJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxv
ZyB2YWx1ZSBvZiBmb286IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZQotICAgIGBg
YAotCi0gICBAbWV0aG9kIGxvZwotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Kn0g
YXJndW1lbnRzCi0gICovCi0gIGxvZzogICBjb25zb2xlTWV0aG9kKCdsb2cnKSAgIHx8IEVtYmVy
LkssCi0KLSAgLyoqCi0gICBQcmludHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRo
IGEgd2FybmluZyBpY29uLgotICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlv
dSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5Mb2dnZXIud2FybignU29tZXRoaW5nIGhhcHBl
bmVkIScpOyAvLyAiU29tZXRoaW5nIGhhcHBlbmVkISIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBj
b25zb2xlIHdpdGggYSB3YXJuaW5nIGljb24uCi0gICAgYGBgCi0KLSAgIEBtZXRob2Qgd2Fybgot
ICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIHdh
cm46ICBjb25zb2xlTWV0aG9kKCd3YXJuJykgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBQcmlu
dHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRoIGFuIGVycm9yIGljb24sIHJlZCB0
ZXh0IGFuZCBhIHN0YWNrIHRyYWNlLgotICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRz
IGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFj
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0RhbmdlciEg
RGFuZ2VyIScpOyAvLyAiRGFuZ2VyISBEYW5nZXIhIiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNv
bnNvbGUgaW4gcmVkIHRleHQuCi0gICAgYGBgCi0KLSAgIEBtZXRob2QgZXJyb3IKLSAgIEBmb3Ig
RW1iZXIuTG9nZ2VyCi0gICBAcGFyYW0geyp9IGFyZ3VtZW50cwotICAqLwotICBlcnJvcjogY29u
c29sZU1ldGhvZCgnZXJyb3InKSB8fCBFbWJlci5LLAotCi0gIC8qKgotICAgTG9ncyB0aGUgYXJn
dW1lbnRzIHRvIHRoZSBjb25zb2xlLgotICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRz
IGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFj
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dn
ZXIuaW5mbygnbG9nIHZhbHVlIG9mIGZvbzonLCBmb28pOyAvLyAibG9nIHZhbHVlIG9mIGZvbzog
MSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlCi0gICAgYGBgCi0KLSAgIEBtZXRob2Qg
aW5mbwotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICov
Ci0gIGluZm86ICBjb25zb2xlTWV0aG9kKCdpbmZvJykgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0g
ICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgotICAgWW91
IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUg
am9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dnZXIuZGVidWcoJ2xvZyB2YWx1ZSBvZiBmb286Jywg
Zm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBmb286IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29u
c29sZQotICAgIGBgYAotCi0gICBAbWV0aG9kIGRlYnVnCi0gICBAZm9yIEVtYmVyLkxvZ2dlcgot
ICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKLSAgKi8KLSAgZGVidWc6IGNvbnNvbGVNZXRob2QoJ2Rl
YnVnJykgfHwgY29uc29sZU1ldGhvZCgnaW5mbycpIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBJ
ZiB0aGUgdmFsdWUgcGFzc2VkIGludG8gYEVtYmVyLkxvZ2dlci5hc3NlcnRgIGlzIG5vdCB0cnV0
aHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aXRoIGEgc3RhY2sgdHJhY2UuCi0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVlKTsgLy8gdW5kZWZpbmVkCi0g
ICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVlID09PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3Nl
cnRpb24gZmFpbGVkIGVycm9yLgotICAgIGBgYAotCi0gICBAbWV0aG9kIGFzc2VydAotICAgQGZv
ciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBWYWx1ZSB0byB0ZXN0Ci0g
ICovCi0gIGFzc2VydDogY29uc29sZU1ldGhvZCgnYXNzZXJ0JykgfHwgYXNzZXJ0UG9seWZpbGwK
LX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1t
ZXRhbAotKi8KLQotdmFyIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgbWV0YUZvciA9
IEVtYmVyLm1ldGEsCi0gICAgb2JqZWN0RGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5k
ZWZpbmVQcm9wZXJ0eTsKLQotdmFyIE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFU
T1JZX1NFVFRFUjsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVTQ1JJUFRPUgotLy8KLQotLyoqCi0gIE9iamVjdHMg
b2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQgYW4gaW50ZXJmYWNlIHRvIHJlc3BvbmQgdG8gcmVx
dWVzdHMgdG8KLSAgZ2V0IGFuZCBzZXQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRs
ZXMgc2ltcGxlIHByb3BlcnRpZXMuCi0KLSAgWW91IGdlbmVyYWxseSB3b24ndCBuZWVkIHRvIGNy
ZWF0ZSBvciBzdWJjbGFzcyB0aGlzIGRpcmVjdGx5LgotCi0gIEBjbGFzcyBEZXNjcmlwdG9yCi0g
IEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRW1iZXIu
RGVzY3JpcHRvciA9IGZ1bmN0aW9uKCkge307Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIERFRklOSU5HIFBST1BFUlRJ
RVMgQVBJCi0vLwotCi12YXIgTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTiA9IEVtYmVyLk1BTkRB
VE9SWV9TRVRURVJfRlVOQ1RJT04gPSBmdW5jdGlvbih2YWx1ZSkgewotICBFbWJlci5hc3NlcnQo
IllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSAob2YgIiAr
IHRoaXMgKyAiKSIsIGZhbHNlKTsKLX07Ci0KLXZhciBERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9
IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OID0gZnVuY3Rpb24obmFtZSkgewotICByZXR1
cm4gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1ldGEgPSB0aGlzW01FVEFfS0VZXTsKLSAgICByZXR1
cm4gbWV0YSAmJiBtZXRhLnZhbHVlc1tuYW1lXTsKLSAgfTsKLX07Ci0KLS8qKgotICBOT1RFOiBU
aGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCB1c2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZSBBUEku
IFlvdSBhbG1vc3QKLSAgbmV2ZXIgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJ
bnN0ZWFkIHlvdSBzaG91bGQgdXNlCi0gIGBFbWJlci5taXhpbigpYCB0byBkZWZpbmUgbmV3IHBy
b3BlcnRpZXMuCi0KLSAgRGVmaW5lcyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gVGhpcyBtZXRo
b2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBFUzUKLSAgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBt
ZXRob2QgZXhjZXB0IHRoYXQgaXQgY2FuIGFsc28gYWNjZXB0IGNvbXB1dGVkCi0gIHByb3BlcnRp
ZXMgYW5kIG90aGVyIHNwZWNpYWwgZGVzY3JpcHRvcnMuCi0KLSAgTm9ybWFsbHkgdGhpcyBtZXRo
b2QgdGFrZXMgb25seSB0aHJlZSBwYXJhbWV0ZXJzLiBIb3dldmVyIGlmIHlvdSBwYXNzIGFuCi0g
IGluc3RhbmNlIG9mIGBFbWJlci5EZXNjcmlwdG9yYCBhcyB0aGUgdGhpcmQgcGFyYW0gdGhlbiB5
b3UgY2FuIHBhc3MgYW4KLSAgb3B0aW9uYWwgdmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIu
IFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbgotICBjcmVhdGluZyBuZXcgZGVzY3Jp
cHRvciBoYXNoZXMgZm9yIGVhY2ggcHJvcGVydHkuCi0KLSAgIyMgRXhhbXBsZXMKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIC8vIEVTNSBjb21wYXRpYmxlIG1vZGUKLSAgRW1iZXIuZGVmaW5lUHJvcGVy
dHkoY29udGFjdCwgJ2ZpcnN0TmFtZScsIHsKLSAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICBjb25m
aWd1cmFibGU6IGZhbHNlLAotICAgIGVudW1lcmFibGU6IHRydWUsCi0gICAgdmFsdWU6ICdDaGFy
bGVzJwotICB9KTsKLQotICAvLyBkZWZpbmUgYSBzaW1wbGUgcHJvcGVydHkKLSAgRW1iZXIuZGVm
aW5lUHJvcGVydHkoY29udGFjdCwgJ2xhc3ROYW1lJywgdW5kZWZpbmVkLCAnSm9sbGV5Jyk7Ci0K
LSAgLy8gZGVmaW5lIGEgY29tcHV0ZWQgcHJvcGVydHkKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHko
Y29udGFjdCwgJ2Z1bGxOYW1lJywgRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0
dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlzLmxhc3ROYW1lOwotICB9KS5wcm9wZXJ0eSgnZmly
c3ROYW1lJywgJ2xhc3ROYW1lJykpOwotICBgYGAKLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGRl
ZmluZVByb3BlcnR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiB0aGUgb2Jq
ZWN0IHRvIGRlZmluZSB0aGlzIHByb3BlcnR5IG9uLiBUaGlzIG1heSBiZSBhIHByb3RvdHlwZS4K
LSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gIEBw
YXJhbSB7RW1iZXIuRGVzY3JpcHRvcn0gW2Rlc2NdIGFuIGluc3RhbmNlIG9mIGBFbWJlci5EZXNj
cmlwdG9yYCAodHlwaWNhbGx5IGEKLSAgICBjb21wdXRlZCBwcm9wZXJ0eSkgb3IgYW4gRVM1IGRl
c2NyaXB0b3IuCi0gICAgWW91IG11c3QgcHJvdmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJv
dGguCi0gIEBwYXJhbSB7Kn0gW2RhdGFdIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZGVzY3JpcHRv
ciwgdGhhdCB3aWxsCi0gICAgYmVjb21lIHRoZSBleHBsaWNpdCB2YWx1ZSBvZiB0aGlzIHByb3Bl
cnR5LgotKi8KLUVtYmVyLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBk
ZXNjLCBkYXRhLCBtZXRhKSB7Ci0gIHZhciBkZXNjcywgZXhpc3RpbmdEZXNjLCB3YXRjaGluZywg
dmFsdWU7Ci0KLSAgaWYgKCFtZXRhKSBtZXRhID0gbWV0YUZvcihvYmopOwotICBkZXNjcyA9IG1l
dGEuZGVzY3M7Ci0gIGV4aXN0aW5nRGVzYyA9IG1ldGEuZGVzY3Nba2V5TmFtZV07Ci0gIHdhdGNo
aW5nID0gbWV0YS53YXRjaGluZ1trZXlOYW1lXSA+IDA7Ci0KLSAgaWYgKGV4aXN0aW5nRGVzYyBp
bnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3IpIHsKLSAgICBleGlzdGluZ0Rlc2MudGVhcmRvd24o
b2JqLCBrZXlOYW1lKTsKLSAgfQotCi0gIGlmIChkZXNjIGluc3RhbmNlb2YgRW1iZXIuRGVzY3Jp
cHRvcikgewotICAgIHZhbHVlID0gZGVzYzsKLQotICAgIGRlc2NzW2tleU5hbWVdID0gZGVzYzsK
LSAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRjaGluZykgewotICAgICAgb2JqZWN0RGVm
aW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7Ci0gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwK
LSAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgICAgd3JpdGFibGU6IHRydWUsCi0gICAg
ICAgIHZhbHVlOiB1bmRlZmluZWQgLy8gbWFrZSBlbnVtZXJhYmxlCi0gICAgICB9KTsKLSAgICB9
IGVsc2UgewotICAgICAgb2JqW2tleU5hbWVdID0gdW5kZWZpbmVkOyAvLyBtYWtlIGVudW1lcmFi
bGUKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZGVzY3Nba2V5TmFtZV0gPSB1bmRlZmluZWQ7IC8v
IHNoYWRvdyBkZXNjcmlwdG9yIGluIHByb3RvCi0gICAgaWYgKGRlc2MgPT0gbnVsbCkgewotICAg
ICAgdmFsdWUgPSBkYXRhOwotCi0gICAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRjaGlu
ZykgewotICAgICAgICBtZXRhLnZhbHVlc1trZXlOYW1lXSA9IGRhdGE7Ci0gICAgICAgIG9iamVj
dERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgewotICAgICAgICAgIGNvbmZpZ3VyYWJsZTog
dHJ1ZSwKLSAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAotICAgICAgICAgIHNldDogTUFOREFU
T1JZX1NFVFRFUl9GVU5DVElPTiwKLSAgICAgICAgICBnZXQ6IERFRkFVTFRfR0VUVEVSX0ZVTkNU
SU9OKGtleU5hbWUpCi0gICAgICAgIH0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2JqW2tl
eU5hbWVdID0gZGF0YTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdmFsdWUgPSBkZXNj
OwotCi0gICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggRVM1Ci0gICAgICBvYmplY3REZWZpbmVQ
cm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MpOwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGtleSBp
cyBiZWluZyB3YXRjaGVkLCBvdmVycmlkZSBjaGFpbnMgdGhhdAotICAvLyB3ZXJlIGluaXRpYWxp
emVkIHdpdGggdGhlIHByb3RvdHlwZQotICBpZiAod2F0Y2hpbmcpIHsgRW1iZXIub3ZlcnJpZGVD
aGFpbnMob2JqLCBrZXlOYW1lLCBtZXRhKTsgfQotCi0gIC8vIFRoZSBgdmFsdWVgIHBhc3NlZCB0
byB0aGUgYGRpZERlZmluZVByb3BlcnR5YCBob29rIGlzCi0gIC8vIGVpdGhlciB0aGUgZGVzY3Jp
cHRvciBvciBkYXRhLCB3aGljaGV2ZXIgd2FzIHBhc3NlZC4KLSAgaWYgKG9iai5kaWREZWZpbmVQ
cm9wZXJ0eSkgeyBvYmouZGlkRGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB2YWx1ZSk7IH0K
LQotICByZXR1cm4gdGhpczsKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZh
ciBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgotICBUbyBnZXQgbXVsdGlwbGUgcHJvcGVydGllcyBh
dCBvbmNlLCBjYWxsIGBFbWJlci5nZXRQcm9wZXJ0aWVzYAotICB3aXRoIGFuIG9iamVjdCBmb2xs
b3dlZCBieSBhIGxpc3Qgb2Ygc3RyaW5ncyBvciBhbiBhcnJheToKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLmdldFByb3BlcnRpZXMocmVjb3JkLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywg
J3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlw
Q29kZTogJzEwMDExJyB9Ci0gIGBgYAotCi0gIGlzIGVxdWl2YWxlbnQgdG86Ci0KLSAgYGBgamF2
YXNjcmlwdAotICBFbWJlci5nZXRQcm9wZXJ0aWVzKHJlY29yZCwgWydmaXJzdE5hbWUnLCAnbGFz
dE5hbWUnLCAnemlwQ29kZSddKTsgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAn
RG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0gIGBgYAotCi0gIEBtZXRob2QgZ2V0UHJvcGVydGll
cwotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMg
dG8gZ2V0Ci0gIEByZXR1cm4ge0hhc2h9Ci0qLwotRW1iZXIuZ2V0UHJvcGVydGllcyA9IGZ1bmN0
aW9uKG9iaikgewotICB2YXIgcmV0ID0ge30sCi0gICAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1l
bnRzLAotICAgICAgaSA9IDE7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgRW1i
ZXIudHlwZU9mKGFyZ3VtZW50c1sxXSkgPT09ICdhcnJheScpIHsKLSAgICBpID0gMDsKLSAgICBw
cm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFdOwotICB9Ci0gIGZvcih2YXIgbGVuID0gcHJvcGVy
dHlOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewotICAgIHJldFtwcm9wZXJ0eU5hbWVzW2ld
XSA9IGdldChvYmosIHByb3BlcnR5TmFtZXNbaV0pOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGNoYW5nZVByb3BlcnRpZXMgPSBFbWJl
ci5jaGFuZ2VQcm9wZXJ0aWVzLAotICAgIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFNldCBh
IGxpc3Qgb2YgcHJvcGVydGllcyBvbiBhbiBvYmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNl
dCBpbnNpZGUKLSAgYSBzaW5nbGUgYGJlZ2luUHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3Bl
cnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gIG9ic2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgYW5PYmplY3Quc2V0UHJvcGVydGllcyh7Ci0gICAgZmlyc3ROYW1l
OiAiU3RhbmxleSIsCi0gICAgbGFzdE5hbWU6ICJTdHVhcnQiLAotICAgIGFnZTogIjIxIgotICB9
KQotICBgYGAKLQotICBAbWV0aG9kIHNldFByb3BlcnRpZXMKLSAgQHBhcmFtIHNlbGYKLSAgQHBh
cmFtIHtPYmplY3R9IGhhc2gKLSAgQHJldHVybiBzZWxmCi0qLwotRW1iZXIuc2V0UHJvcGVydGll
cyA9IGZ1bmN0aW9uKHNlbGYsIGhhc2gpIHsKLSAgY2hhbmdlUHJvcGVydGllcyhmdW5jdGlvbigp
IHsKLSAgICBmb3IodmFyIHByb3AgaW4gaGFzaCkgewotICAgICAgaWYgKGhhc2guaGFzT3duUHJv
cGVydHkocHJvcCkpIHsgc2V0KHNlbGYsIHByb3AsIGhhc2hbcHJvcF0pOyB9Ci0gICAgfQotICB9
KTsKLSAgcmV0dXJuIHNlbGY7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFy
IG1ldGFGb3IgPSBFbWJlci5tZXRhLCAvLyB1dGlscy5qcwotICAgIHR5cGVPZiA9IEVtYmVyLnR5
cGVPZiwgLy8gdXRpbHMuanMKLSAgICBNQU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRB
VE9SWV9TRVRURVIsCi0gICAgb19kZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmlu
ZVByb3BlcnR5OwotCi1FbWJlci53YXRjaEtleSA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewot
ICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlm
IChrZXlOYW1lID09PSAnbGVuZ3RoJyAmJiB0eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1
cm47IH0KLQotICB2YXIgbSA9IG1ldGFGb3Iob2JqKSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nOwot
Ci0gIC8vIGFjdGl2YXRlIHdhdGNoaW5nIGZpcnN0IHRpbWUKLSAgaWYgKCF3YXRjaGluZ1trZXlO
YW1lXSkgewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gMTsKLQotICAgIGlmICgnZnVuY3Rpb24n
ID09PSB0eXBlb2Ygb2JqLndpbGxXYXRjaFByb3BlcnR5KSB7Ci0gICAgICBvYmoud2lsbFdhdGNo
UHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYg
a2V5TmFtZSBpbiBvYmopIHsKLSAgICAgIG0udmFsdWVzW2tleU5hbWVdID0gb2JqW2tleU5hbWVd
OwotICAgICAgb19kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKLSAgICAgICAgY29uZmln
dXJhYmxlOiB0cnVlLAotICAgICAgICBlbnVtZXJhYmxlOiBvYmoucHJvcGVydHlJc0VudW1lcmFi
bGUoa2V5TmFtZSksCi0gICAgICAgIHNldDogRW1iZXIuTUFOREFUT1JZX1NFVFRFUl9GVU5DVElP
TiwKLSAgICAgICAgZ2V0OiBFbWJlci5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1lKQot
ICAgICAgfSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gKHdh
dGNoaW5nW2tleU5hbWVdIHx8IDApICsgMTsKLSAgfQotfTsKLQotCi1FbWJlci51bndhdGNoS2V5
ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRj
aGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYgKHdhdGNoaW5nW2tleU5hbWVdID09PSAxKSB7Ci0g
ICAgd2F0Y2hpbmdba2V5TmFtZV0gPSAwOwotCi0gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVv
ZiBvYmouZGlkVW53YXRjaFByb3BlcnR5KSB7Ci0gICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5
KGtleU5hbWUpOwotICAgIH0KLQotICAgIGlmIChNQU5EQVRPUllfU0VUVEVSICYmIGtleU5hbWUg
aW4gb2JqKSB7Ci0gICAgICBvX2RlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgewotICAgICAg
ICBjb25maWd1cmFibGU6IHRydWUsCi0gICAgICAgIGVudW1lcmFibGU6IG9iai5wcm9wZXJ0eUlz
RW51bWVyYWJsZShrZXlOYW1lKSwKLSAgICAgICAgc2V0OiBmdW5jdGlvbih2YWwpIHsKLSAgICAg
ICAgICAvLyByZWRlZmluZSB0byBzZXQgYXMgZW51bWVyYWJsZQotICAgICAgICAgIG9fZGVmaW5l
UHJvcGVydHkob2JqLCBrZXlOYW1lLCB7Ci0gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUs
Ci0gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICAgICAgICAgIGVudW1lcmFibGU6IHRy
dWUsCi0gICAgICAgICAgICB2YWx1ZTogdmFsCi0gICAgICAgICAgfSk7Ci0gICAgICAgICAgZGVs
ZXRlIG0udmFsdWVzW2tleU5hbWVdOwotICAgICAgICB9LAotICAgICAgICBnZXQ6IEVtYmVyLkRF
RkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUpCi0gICAgICB9KTsKLSAgICB9Ci0gIH0gZWxz
ZSBpZiAod2F0Y2hpbmdba2V5TmFtZV0gPiAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5TmFtZV0tLTsK
LSAgfQotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBtZXRhRm9yID0gRW1i
ZXIubWV0YSwgLy8gdXRpbHMuanMKLSAgICBnZXQgPSBFbWJlci5nZXQsIC8vIHByb3BlcnR5X2dl
dC5qcwotICAgIG5vcm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFsaXplVHVwbGUsIC8vIHByb3Bl
cnR5X2dldC5qcwotICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLCAv
LyBhcnJheS5qcwotICAgIHdhcm4gPSBFbWJlci53YXJuLAotICAgIHdhdGNoS2V5ID0gRW1iZXIu
d2F0Y2hLZXksCi0gICAgdW53YXRjaEtleSA9IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgRklSU1Rf
S0VZID0gL14oW15cLlwqXSspLzsKLQotZnVuY3Rpb24gZmlyc3RLZXkocGF0aCkgewotICByZXR1
cm4gcGF0aC5tYXRjaChGSVJTVF9LRVkpWzBdOwotfQotCi12YXIgcGVuZGluZ1F1ZXVlID0gW107
Ci0KLS8vIGF0dGVtcHRzIHRvIGFkZCB0aGUgcGVuZGluZ1F1ZXVlIGNoYWlucyBhZ2Fpbi4gSWYg
c29tZSBvZiB0aGVtIGVuZCB1cAotLy8gYmFjayBpbiB0aGUgcXVldWUgYW5kIHJlc2NoZWR1bGUg
aXMgdHJ1ZSwgc2NoZWR1bGVzIGEgdGltZW91dCB0byB0cnkKLS8vIGFnYWluLgotRW1iZXIuZmx1
c2hQZW5kaW5nQ2hhaW5zID0gZnVuY3Rpb24oKSB7Ci0gIGlmIChwZW5kaW5nUXVldWUubGVuZ3Ro
ID09PSAwKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIHF1ZXVlID0gcGVu
ZGluZ1F1ZXVlOwotICBwZW5kaW5nUXVldWUgPSBbXTsKLQotICBmb3JFYWNoLmNhbGwocXVldWUs
IGZ1bmN0aW9uKHEpIHsgcVswXS5hZGQocVsxXSk7IH0pOwotCi0gIHdhcm4oJ1dhdGNoaW5nIGFu
IHVuZGVmaW5lZCBnbG9iYWwsIEVtYmVyIGV4cGVjdHMgd2F0Y2hlZCBnbG9iYWxzIHRvIGJlIHNl
dHVwIGJ5IHRoZSB0aW1lIHRoZSBydW4gbG9vcCBpcyBmbHVzaGVkLCBjaGVjayBmb3IgdHlwb3Mn
LCBwZW5kaW5nUXVldWUubGVuZ3RoID09PSAwKTsKLX07Ci0KLQotZnVuY3Rpb24gYWRkQ2hhaW5X
YXRjaGVyKG9iaiwga2V5TmFtZSwgbm9kZSkgewotICBpZiAoIW9iaiB8fCAoJ29iamVjdCcgIT09
IHR5cGVvZiBvYmopKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIG0gPSBt
ZXRhRm9yKG9iaiksIG5vZGVzID0gbS5jaGFpbldhdGNoZXJzOwotCi0gIGlmICghbS5oYXNPd25Q
cm9wZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7Ci0gICAgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnMg
PSB7fTsKLSAgfQotCi0gIGlmICghbm9kZXNba2V5TmFtZV0pIHsgbm9kZXNba2V5TmFtZV0gPSBb
XTsgfQotICBub2Rlc1trZXlOYW1lXS5wdXNoKG5vZGUpOwotICB3YXRjaEtleShvYmosIGtleU5h
bWUpOwotfQotCi12YXIgcmVtb3ZlQ2hhaW5XYXRjaGVyID0gRW1iZXIucmVtb3ZlQ2hhaW5XYXRj
aGVyID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBub2RlKSB7Ci0gIGlmICghb2JqIHx8ICdvYmpl
Y3QnICE9PSB0eXBlb2Ygb2JqKSB7IHJldHVybjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAgdmFy
IG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpOwotICBpZiAoIW0uaGFzT3duUHJvcGVydHkoJ2NoYWlu
V2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8gbm90aGluZyB0byBkbwotCi0gIHZhciBub2RlcyA9
IG0uY2hhaW5XYXRjaGVyczsKLQotICBpZiAobm9kZXNba2V5TmFtZV0pIHsKLSAgICBub2RlcyA9
IG5vZGVzW2tleU5hbWVdOwotICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBp
IDwgbDsgaSsrKSB7Ci0gICAgICBpZiAobm9kZXNbaV0gPT09IG5vZGUpIHsgbm9kZXMuc3BsaWNl
KGksIDEpOyB9Ci0gICAgfQotICB9Ci0gIHVud2F0Y2hLZXkob2JqLCBrZXlOYW1lKTsKLX07Ci0K
LS8vIEEgQ2hhaW5Ob2RlIHdhdGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91
IHByb3ZpZGUgYSBzdGFydGluZwotLy8gdmFsdWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3
b24ndCBhY3R1YWxseSB3YXRjaCBpdC4gRm9yIGEgcm9vdCBub2RlCi0vLyBwYXNzIG51bGwgZm9y
IHBhcmVudCBhbmQga2V5IGFuZCBvYmplY3QgZm9yIHZhbHVlLgotdmFyIENoYWluTm9kZSA9IEVt
YmVyLl9DaGFpbk5vZGUgPSBmdW5jdGlvbihwYXJlbnQsIGtleSwgdmFsdWUpIHsKLSAgdGhpcy5f
cGFyZW50ID0gcGFyZW50OwotICB0aGlzLl9rZXkgICAgPSBrZXk7Ci0KLSAgLy8gX3dhdGNoaW5n
IGlzIHRydWUgd2hlbiBjYWxsaW5nIGdldCh0aGlzLl9wYXJlbnQsIHRoaXMuX2tleSkgd2lsbAot
ICAvLyByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4KLSAgLy8KLSAgLy8gSXQgaXMgZmFs
c2UgZm9yIHRoZSByb290IG9mIGEgY2hhaW4gKGJlY2F1c2Ugd2UgaGF2ZSBubyBwYXJlbnQpCi0g
IC8vIGFuZCBmb3IgZ2xvYmFsIHBhdGhzIChiZWNhdXNlIHRoZSBwYXJlbnQgbm9kZSBpcyB0aGUg
b2JqZWN0IHdpdGgKLSAgLy8gdGhlIG9ic2VydmVyIG9uIGl0KQotICB0aGlzLl93YXRjaGluZyA9
IHZhbHVlPT09dW5kZWZpbmVkOwotCi0gIHRoaXMuX3ZhbHVlICA9IHZhbHVlOwotICB0aGlzLl9w
YXRocyA9IHt9OwotICBpZiAodGhpcy5fd2F0Y2hpbmcpIHsKLSAgICB0aGlzLl9vYmplY3QgPSBw
YXJlbnQudmFsdWUoKTsKLSAgICBpZiAodGhpcy5fb2JqZWN0KSB7IGFkZENoYWluV2F0Y2hlcih0
aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7IH0KLSAgfQotCi0gIC8vIFNwZWNpYWwtY2Fz
ZTogdGhlIEVhY2hQcm94eSByZWxpZXMgb24gaW1tZWRpYXRlIGV2YWx1YXRpb24gdG8KLSAgLy8g
ZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCi0gIC8vCi0gIC8vIFRPRE86IFJlcGxhY2UgdGhpcyB3
aXRoIGFuIGVmZmljaWVudCBjYWxsYmFjayB0aGF0IHRoZSBFYWNoUHJveHkKLSAgLy8gY2FuIGlt
cGxlbWVudC4KLSAgaWYgKHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuX2tleSA9PT0gJ0Bl
YWNoJykgewotICAgIHRoaXMudmFsdWUoKTsKLSAgfQotfTsKLQotdmFyIENoYWluTm9kZVByb3Rv
dHlwZSA9IENoYWluTm9kZS5wcm90b3R5cGU7Ci0KLWZ1bmN0aW9uIGxhenlHZXQob2JqLCBrZXkp
IHsKLSAgaWYgKCFvYmopIHJldHVybiB1bmRlZmluZWQ7Ci0KLSAgdmFyIG1ldGEgPSBtZXRhRm9y
KG9iaiwgZmFsc2UpOwotICAvLyBjaGVjayBpZiBvYmplY3QgbWVhbnQgb25seSB0byBiZSBhIHBy
b3RvdHlwZQotICBpZiAobWV0YS5wcm90byA9PT0gb2JqKSByZXR1cm4gdW5kZWZpbmVkOwotCi0g
IGlmIChrZXkgPT09ICJAZWFjaCIpIHJldHVybiBnZXQob2JqLCBrZXkpOwotCi0gIC8vIGlmIGEg
Q1Agb25seSByZXR1cm4gY2FjaGVkIHZhbHVlCi0gIHZhciBkZXNjID0gbWV0YS5kZXNjc1trZXld
OwotICBpZiAoZGVzYyAmJiBkZXNjLl9jYWNoZWFibGUpIHsKLSAgICBpZiAoa2V5IGluIG1ldGEu
Y2FjaGUpIHsKLSAgICAgIHJldHVybiBtZXRhLmNhY2hlW2tleV07Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGdldChvYmosIGtl
eSk7Ci19Ci0KLUNoYWluTm9kZVByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uKCkgewotICBpZiAo
dGhpcy5fdmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93YXRjaGluZykgewotICAgIHZhciBv
YmogPSB0aGlzLl9wYXJlbnQudmFsdWUoKTsKLSAgICB0aGlzLl92YWx1ZSA9IGxhenlHZXQob2Jq
LCB0aGlzLl9rZXkpOwotICB9Ci0gIHJldHVybiB0aGlzLl92YWx1ZTsKLX07Ci0KLUNoYWluTm9k
ZVByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7Ci0gIGlmICh0aGlzLl93YXRjaGluZykg
ewotICAgIHZhciBvYmogPSB0aGlzLl9vYmplY3Q7Ci0gICAgaWYgKG9iaikgeyByZW1vdmVDaGFp
bldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRoaXMpOyB9Ci0gICAgdGhpcy5fd2F0Y2hpbmcgPSBm
YWxzZTsgLy8gc28gZnV0dXJlIGNhbGxzIGRvIG5vdGhpbmcKLSAgfQotfTsKLQotLy8gY29waWVz
IGEgdG9wIGxldmVsIG9iamVjdCBvbmx5Ci1DaGFpbk5vZGVQcm90b3R5cGUuY29weSA9IGZ1bmN0
aW9uKG9iaikgewotICB2YXIgcmV0ID0gbmV3IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopLAot
ICAgICAgcGF0aHMgPSB0aGlzLl9wYXRocywgcGF0aDsKLSAgZm9yIChwYXRoIGluIHBhdGhzKSB7
Ci0gICAgaWYgKHBhdGhzW3BhdGhdIDw9IDApIHsgY29udGludWU7IH0gLy8gdGhpcyBjaGVjayB3
aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2YWxzLgotICAgIHJldC5hZGQocGF0aCk7Ci0gIH0K
LSAgcmV0dXJuIHJldDsKLX07Ci0KLS8vIGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlIG9mIGEgY2hh
aW4gdG8gc2V0dXAgd2F0Y2hlcnMgb24gdGhlIHNwZWNpZmllZAotLy8gcGF0aC4KLUNoYWluTm9k
ZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihwYXRoKSB7Ci0gIHZhciBvYmosIHR1cGxlLCBrZXks
IHNyYywgcGF0aHM7Ci0KLSAgcGF0aHMgPSB0aGlzLl9wYXRoczsKLSAgcGF0aHNbcGF0aF0gPSAo
cGF0aHNbcGF0aF0gfHwgMCkgKyAxOwotCi0gIG9iaiA9IHRoaXMudmFsdWUoKTsKLSAgdHVwbGUg
PSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgpOwotCi0gIC8vIHRoZSBwYXRoIHdhcyBhIGxvY2Fs
IHBhdGgKLSAgaWYgKHR1cGxlWzBdICYmIHR1cGxlWzBdID09PSBvYmopIHsKLSAgICBwYXRoID0g
dHVwbGVbMV07Ci0gICAga2V5ICA9IGZpcnN0S2V5KHBhdGgpOwotICAgIHBhdGggPSBwYXRoLnNs
aWNlKGtleS5sZW5ndGgrMSk7Ci0KLSAgLy8gZ2xvYmFsIHBhdGgsIGJ1dCBvYmplY3QgZG9lcyBu
b3QgZXhpc3QgeWV0LgotICAvLyBwdXQgaW50byBhIHF1ZXVlIGFuZCB0cnkgdG8gY29ubmVjdCBs
YXRlci4KLSAgfSBlbHNlIGlmICghdHVwbGVbMF0pIHsKLSAgICBwZW5kaW5nUXVldWUucHVzaChb
dGhpcywgcGF0aF0pOwotICAgIHR1cGxlLmxlbmd0aCA9IDA7Ci0gICAgcmV0dXJuOwotCi0gIC8v
IGdsb2JhbCBwYXRoLCBhbmQgb2JqZWN0IGFscmVhZHkgZXhpc3RzCi0gIH0gZWxzZSB7Ci0gICAg
c3JjICA9IHR1cGxlWzBdOwotICAgIGtleSAgPSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxl
bmd0aCsxKSk7Ci0gICAgcGF0aCA9IHR1cGxlWzFdOwotICB9Ci0KLSAgdHVwbGUubGVuZ3RoID0g
MDsKLSAgdGhpcy5jaGFpbihrZXksIHBhdGgsIHNyYyk7Ci19OwotCi0vLyBjYWxsZWQgb24gdGhl
IHJvb3Qgbm9kZSBvZiBhIGNoYWluIHRvIHRlYXJkb3duIHdhdGNoZXIgb24gdGhlIHNwZWNpZmll
ZAotLy8gcGF0aAotQ2hhaW5Ob2RlUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHBhdGgpIHsK
LSAgdmFyIG9iaiwgdHVwbGUsIGtleSwgc3JjLCBwYXRoczsKLQotICBwYXRocyA9IHRoaXMuX3Bh
dGhzOwotICBpZiAocGF0aHNbcGF0aF0gPiAwKSB7IHBhdGhzW3BhdGhdLS07IH0KLQotICBvYmog
PSB0aGlzLnZhbHVlKCk7Ci0gIHR1cGxlID0gbm9ybWFsaXplVHVwbGUob2JqLCBwYXRoKTsKLSAg
aWYgKHR1cGxlWzBdID09PSBvYmopIHsKLSAgICBwYXRoID0gdHVwbGVbMV07Ci0gICAga2V5ICA9
IGZpcnN0S2V5KHBhdGgpOwotICAgIHBhdGggPSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Ci0g
IH0gZWxzZSB7Ci0gICAgc3JjICA9IHR1cGxlWzBdOwotICAgIGtleSAgPSBwYXRoLnNsaWNlKDAs
IDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7Ci0gICAgcGF0aCA9IHR1cGxlWzFdOwotICB9Ci0KLSAg
dHVwbGUubGVuZ3RoID0gMDsKLSAgdGhpcy51bmNoYWluKGtleSwgcGF0aCk7Ci19OwotCi1DaGFp
bk5vZGVQcm90b3R5cGUuY291bnQgPSAwOwotCi1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW4gPSBm
dW5jdGlvbihrZXksIHBhdGgsIHNyYykgewotICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zLCBu
b2RlOwotICBpZiAoIWNoYWlucykgeyBjaGFpbnMgPSB0aGlzLl9jaGFpbnMgPSB7fTsgfQotCi0g
IG5vZGUgPSBjaGFpbnNba2V5XTsKLSAgaWYgKCFub2RlKSB7IG5vZGUgPSBjaGFpbnNba2V5XSA9
IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCBzcmMpOyB9Ci0gIG5vZGUuY291bnQrKzsgLy8gY291
bnQgY2hhaW5zLi4uCi0KLSAgLy8gY2hhaW4gcmVzdCBvZiBwYXRoIGlmIHRoZXJlIGlzIG9uZQot
ICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aD4wKSB7Ci0gICAga2V5ID0gZmlyc3RLZXkocGF0aCk7
Ci0gICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCsxKTsKLSAgICBub2RlLmNoYWluKGtl
eSwgcGF0aCk7IC8vIE5PVEU6IG5vIHNyYyBtZWFucyBpdCB3aWxsIG9ic2VydmUgY2hhbmdlcy4u
LgotICB9Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUudW5jaGFpbiA9IGZ1bmN0aW9uKGtleSwg
cGF0aCkgewotICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zLCBub2RlID0gY2hhaW5zW2tleV07
Ci0KLSAgLy8gdW5jaGFpbiByZXN0IG9mIHBhdGggZmlyc3QuLi4KLSAgaWYgKHBhdGggJiYgcGF0
aC5sZW5ndGg+MSkgewotICAgIGtleSAgPSBmaXJzdEtleShwYXRoKTsKLSAgICBwYXRoID0gcGF0
aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICAgIG5vZGUudW5jaGFpbihrZXksIHBhdGgpOwotICB9
Ci0KLSAgLy8gZGVsZXRlIG5vZGUgaWYgbmVlZGVkLgotICBub2RlLmNvdW50LS07Ci0gIGlmIChu
b2RlLmNvdW50PD0wKSB7Ci0gICAgZGVsZXRlIGNoYWluc1tub2RlLl9rZXldOwotICAgIG5vZGUu
ZGVzdHJveSgpOwotICB9Ci0KLX07Ci0KLUNoYWluTm9kZVByb3RvdHlwZS53aWxsQ2hhbmdlID0g
ZnVuY3Rpb24oZXZlbnRzKSB7Ci0gIHZhciBjaGFpbnMgPSB0aGlzLl9jaGFpbnM7Ci0gIGlmIChj
aGFpbnMpIHsKLSAgICBmb3IodmFyIGtleSBpbiBjaGFpbnMpIHsKLSAgICAgIGlmICghY2hhaW5z
Lmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgIGNoYWluc1trZXldLndp
bGxDaGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGhpcy5fcGFyZW50KSB7IHRo
aXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2UodGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9
Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5XaWxsQ2hhbmdlID0gZnVuY3Rpb24oY2hh
aW4sIHBhdGgsIGRlcHRoLCBldmVudHMpIHsKLSAgaWYgKHRoaXMuX2tleSkgeyBwYXRoID0gdGhp
cy5fa2V5ICsgJy4nICsgcGF0aDsgfQotCi0gIGlmICh0aGlzLl9wYXJlbnQpIHsKLSAgICB0aGlz
Ll9wYXJlbnQuY2hhaW5XaWxsQ2hhbmdlKHRoaXMsIHBhdGgsIGRlcHRoKzEsIGV2ZW50cyk7Ci0g
IH0gZWxzZSB7Ci0gICAgaWYgKGRlcHRoID4gMSkgewotICAgICAgZXZlbnRzLnB1c2godGhpcy52
YWx1ZSgpLCBwYXRoKTsKLSAgICB9Ci0gICAgcGF0aCA9ICd0aGlzLicgKyBwYXRoOwotICAgIGlm
ICh0aGlzLl9wYXRoc1twYXRoXSA+IDApIHsKLSAgICAgIGV2ZW50cy5wdXNoKHRoaXMudmFsdWUo
KSwgcGF0aCk7Ci0gICAgfQotICB9Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5EaWRD
aGFuZ2UgPSBmdW5jdGlvbihjaGFpbiwgcGF0aCwgZGVwdGgsIGV2ZW50cykgewotICBpZiAodGhp
cy5fa2V5KSB7IHBhdGggPSB0aGlzLl9rZXkgKyAnLicgKyBwYXRoOyB9Ci0gIGlmICh0aGlzLl9w
YXJlbnQpIHsKLSAgICB0aGlzLl9wYXJlbnQuY2hhaW5EaWRDaGFuZ2UodGhpcywgcGF0aCwgZGVw
dGgrMSwgZXZlbnRzKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZGVwdGggPiAxKSB7Ci0gICAgICBl
dmVudHMucHVzaCh0aGlzLnZhbHVlKCksIHBhdGgpOwotICAgIH0KLSAgICBwYXRoID0gJ3RoaXMu
JyArIHBhdGg7Ci0gICAgaWYgKHRoaXMuX3BhdGhzW3BhdGhdID4gMCkgewotICAgICAgZXZlbnRz
LnB1c2godGhpcy52YWx1ZSgpLCBwYXRoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLUNoYWluTm9kZVBy
b3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbihldmVudHMpIHsKLSAgLy8gaW52YWxpZGF0ZSBt
eSBvd24gdmFsdWUgZmlyc3QuCi0gIGlmICh0aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmog
PSB0aGlzLl9wYXJlbnQudmFsdWUoKTsKLSAgICBpZiAob2JqICE9PSB0aGlzLl9vYmplY3QpIHsK
LSAgICAgIHJlbW92ZUNoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7
Ci0gICAgICB0aGlzLl9vYmplY3QgPSBvYmo7Ci0gICAgICBhZGRDaGFpbldhdGNoZXIob2JqLCB0
aGlzLl9rZXksIHRoaXMpOwotICAgIH0KLSAgICB0aGlzLl92YWx1ZSAgPSB1bmRlZmluZWQ7Ci0K
LSAgICAvLyBTcGVjaWFsLWNhc2U6IHRoZSBFYWNoUHJveHkgcmVsaWVzIG9uIGltbWVkaWF0ZSBl
dmFsdWF0aW9uIHRvCi0gICAgLy8gZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCi0gICAgaWYgKHRo
aXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuX2tleSA9PT0gJ0BlYWNoJykKLSAgICAgIHRoaXMu
dmFsdWUoKTsKLSAgfQotCi0gIC8vIHRoZW4gbm90aWZ5IGNoYWlucy4uLgotICB2YXIgY2hhaW5z
ID0gdGhpcy5fY2hhaW5zOwotICBpZiAoY2hhaW5zKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gY2hh
aW5zKSB7Ci0gICAgICBpZiAoIWNoYWlucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVl
OyB9Ci0gICAgICBjaGFpbnNba2V5XS5kaWRDaGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0gIH0KLQot
ICAvLyBpZiBubyBldmVudHMgYXJlIHBhc3NlZCBpbiB0aGVuIHdlIG9ubHkgY2FyZSBhYm91dCB0
aGUgYWJvdmUgd2lyaW5nIHVwZGF0ZQotICBpZiAoZXZlbnRzID09PSBudWxsKSB7IHJldHVybjsg
fQotCi0gIC8vIGFuZCBmaW5hbGx5IHRlbGwgcGFyZW50IGFib3V0IG15IHBhdGggY2hhbmdpbmcu
Li4KLSAgaWYgKHRoaXMuX3BhcmVudCkgeyB0aGlzLl9wYXJlbnQuY2hhaW5EaWRDaGFuZ2UodGhp
cywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9Ci19OwotCi1FbWJlci5maW5pc2hDaGFpbnMgPSBm
dW5jdGlvbihvYmopIHsKLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBt
LmNoYWluczsKLSAgaWYgKGNoYWlucykgewotICAgIGlmIChjaGFpbnMudmFsdWUoKSAhPT0gb2Jq
KSB7Ci0gICAgICBtLmNoYWlucyA9IGNoYWlucyA9IGNoYWlucy5jb3B5KG9iaik7Ci0gICAgfQot
ICAgIGNoYWlucy5kaWRDaGFuZ2UobnVsbCk7Ci0gIH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZvciA9IEVt
YmVyLm1ldGEsIC8vIHV0aWxzLmpzCi0gICAgdHlwZU9mID0gRW1iZXIudHlwZU9mLCAvLyB1dGls
cy5qcwotICAgIENoYWluTm9kZSA9IEVtYmVyLl9DaGFpbk5vZGU7IC8vIGNoYWlucy5qcwotCi0v
LyBnZXQgdGhlIGNoYWlucyBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0LiBJZiB0aGUgY3VycmVudCBv
YmplY3QgaGFzCi0vLyBjaGFpbnMgaW5oZXJpdGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBi
ZSBjbG9uZWQgYW5kIHJlY29uZmlndXJlZCBmb3IKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLWZ1
bmN0aW9uIGNoYWluc0ZvcihvYmopIHsKLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiksIHJldCA9IG0u
Y2hhaW5zOwotICBpZiAoIXJldCkgewotICAgIHJldCA9IG0uY2hhaW5zID0gbmV3IENoYWluTm9k
ZShudWxsLCBudWxsLCBvYmopOwotICB9IGVsc2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmopIHsK
LSAgICByZXQgPSBtLmNoYWlucyA9IHJldC5jb3B5KG9iaik7Ci0gIH0KLSAgcmV0dXJuIHJldDsK
LX0KLQotRW1iZXIud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2JqLCBrZXlQYXRoKSB7Ci0gIC8vIGNh
bid0IHdhdGNoIGxlbmd0aCBvbiBBcnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KLSAgaWYgKGtleVBh
dGggPT09ICdsZW5ndGgnICYmIHR5cGVPZihvYmopID09PSAnYXJyYXknKSB7IHJldHVybjsgfQot
Ci0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYg
KCF3YXRjaGluZ1trZXlQYXRoXSkgeyAvLyBhY3RpdmF0ZSB3YXRjaGluZyBmaXJzdCB0aW1lCi0g
ICAgd2F0Y2hpbmdba2V5UGF0aF0gPSAxOwotICAgIGNoYWluc0ZvcihvYmopLmFkZChrZXlQYXRo
KTsKLSAgfSBlbHNlIHsKLSAgICB3YXRjaGluZ1trZXlQYXRoXSA9ICh3YXRjaGluZ1trZXlQYXRo
XSB8fCAwKSArIDE7Ci0gIH0KLX07Ci0KLUVtYmVyLnVud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2Jq
LCBrZXlQYXRoKSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hp
bmc7Ci0KLSAgaWYgKHdhdGNoaW5nW2tleVBhdGhdID09PSAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5
UGF0aF0gPSAwOwotICAgIGNoYWluc0ZvcihvYmopLnJlbW92ZShrZXlQYXRoKTsKLSAgfSBlbHNl
IGlmICh3YXRjaGluZ1trZXlQYXRoXSA+IDEpIHsKLSAgICB3YXRjaGluZ1trZXlQYXRoXS0tOwot
ICB9Ci19OwotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1t
ZXRhbAotKi8KLQotdmFyIG1ldGFGb3IgPSBFbWJlci5tZXRhLCAvLyB1dGlscy5qcwotICAgIEdV
SURfS0VZID0gRW1iZXIuR1VJRF9LRVksIC8vIHV0aWxzLmpzCi0gICAgTUVUQV9LRVkgPSBFbWJl
ci5NRVRBX0tFWSwgLy8gdXRpbHMuanMKLSAgICByZW1vdmVDaGFpbldhdGNoZXIgPSBFbWJlci5y
ZW1vdmVDaGFpbldhdGNoZXIsCi0gICAgd2F0Y2hLZXkgPSBFbWJlci53YXRjaEtleSwgLy8gd2F0
Y2hfa2V5LmpzCi0gICAgdW53YXRjaEtleSA9IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgd2F0Y2hQ
YXRoID0gRW1iZXIud2F0Y2hQYXRoLCAvLyB3YXRjaF9wYXRoLmpzCi0gICAgdW53YXRjaFBhdGgg
PSBFbWJlci51bndhdGNoUGF0aCwKLSAgICB0eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxz
LmpzCi0gICAgZ2VuZXJhdGVHdWlkID0gRW1iZXIuZ2VuZXJhdGVHdWlkLAotICAgIElTX1BBVEgg
PSAvW1wuXCpdLzsKLQotLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgcGF0aCBpcyBqdXN0
IGEga2V5TmFtZQotZnVuY3Rpb24gaXNLZXlOYW1lKHBhdGgpIHsKLSAgcmV0dXJuIHBhdGg9PT0n
KicgfHwgIUlTX1BBVEgudGVzdChwYXRoKTsKLX0KLQotLyoqCi0gIFN0YXJ0cyB3YXRjaGluZyBh
IHByb3BlcnR5IG9uIGFuIG9iamVjdC4gV2hlbmV2ZXIgdGhlIHByb3BlcnR5IGNoYW5nZXMsCi0g
IGludm9rZXMgYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBFbWJlci5wcm9wZXJ0eURp
ZENoYW5nZWAuIFRoaXMgaXMgdGhlCi0gIHByaW1pdGl2ZSB1c2VkIGJ5IG9ic2VydmVycyBhbmQg
ZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91IHdpbGwgbmV2ZXIgY2FsbAotICB0aGlzIG1ldGhv
ZCBkaXJlY3RseSBidXQgaW5zdGVhZCB1c2UgaGlnaGVyIGxldmVsIG1ldGhvZHMgbGlrZQotICBg
RW1iZXIuYWRkT2JzZXJ2ZXIoKWAKLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHdhdGNoCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZQotKi8KLUVt
YmVyLndhdGNoID0gZnVuY3Rpb24ob2JqLCBfa2V5UGF0aCkgewotICAvLyBjYW4ndCB3YXRjaCBs
ZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChfa2V5UGF0aCA9PT0gJ2xl
bmd0aCcgJiYgdHlwZU9mKG9iaikgPT09ICdhcnJheScpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKGlz
S2V5TmFtZShfa2V5UGF0aCkpIHsKLSAgICB3YXRjaEtleShvYmosIF9rZXlQYXRoKTsKLSAgfSBl
bHNlIHsKLSAgICB3YXRjaFBhdGgob2JqLCBfa2V5UGF0aCk7Ci0gIH0KLX07Ci0KLUVtYmVyLmlz
V2F0Y2hpbmcgPSBmdW5jdGlvbiBpc1dhdGNoaW5nKG9iaiwga2V5KSB7Ci0gIHZhciBtZXRhID0g
b2JqW01FVEFfS0VZXTsKLSAgcmV0dXJuIChtZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5XSkgPiAw
OwotfTsKLQotRW1iZXIud2F0Y2guZmx1c2hQZW5kaW5nID0gRW1iZXIuZmx1c2hQZW5kaW5nQ2hh
aW5zOwotCi1FbWJlci51bndhdGNoID0gZnVuY3Rpb24ob2JqLCBfa2V5UGF0aCkgewotICAvLyBj
YW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChfa2V5
UGF0aCA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9mKG9iaikgPT09ICdhcnJheScpIHsgcmV0dXJuOyB9
Ci0KLSAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsKLSAgICB1bndhdGNoS2V5KG9iaiwgX2tl
eVBhdGgpOwotICB9IGVsc2UgewotICAgIHVud2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgpOwotICB9
Ci19OwotCi0vKioKLSAgQ2FsbCBvbiBhbiBvYmplY3Qgd2hlbiB5b3UgZmlyc3QgYmVnZXQgaXQg
ZnJvbSBhbm90aGVyIG9iamVjdC4gVGhpcyB3aWxsCi0gIHNldHVwIGFueSBjaGFpbmVkIHdhdGNo
ZXJzIG9uIHRoZSBvYmplY3QgaW5zdGFuY2UgYXMgbmVlZGVkLiBUaGlzIG1ldGhvZCBpcwotICBz
YWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCByZXdh
dGNoCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotKi8KLUVtYmVyLnJld2F0Y2ggPSBmdW5j
dGlvbihvYmopIHsKLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBtLmNo
YWluczsKLQotICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBoYXMgaXRzIG93biBndWlkLgotICBp
ZiAoR1VJRF9LRVkgaW4gb2JqICYmICFvYmouaGFzT3duUHJvcGVydHkoR1VJRF9LRVkpKSB7Ci0g
ICAgZ2VuZXJhdGVHdWlkKG9iaik7Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgYW55IGNoYWluZWQg
d2F0Y2hlcnMgdXBkYXRlLgotICBpZiAoY2hhaW5zICYmIGNoYWlucy52YWx1ZSgpICE9PSBvYmop
IHsKLSAgICBtLmNoYWlucyA9IGNoYWlucy5jb3B5KG9iaik7Ci0gIH0KLX07Ci0KLXZhciBOT0RF
X1NUQUNLID0gW107Ci0KLS8qKgotICBUZWFycyBkb3duIHRoZSBtZXRhIG9uIGFuIG9iamVjdCBz
byB0aGF0IGl0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgTXVsdGlwbGUgY2FsbHMgd2ls
bCBoYXZlIG5vIGVmZmVjdC4KLQotICBAbWV0aG9kIGRlc3Ryb3kKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0ge09iamVjdH0gb2JqICB0aGUgb2JqZWN0IHRvIGRlc3Ryb3kKLSAgQHJldHVybiB7dm9p
ZH0KLSovCi1FbWJlci5kZXN0cm95ID0gZnVuY3Rpb24gKG9iaikgewotICB2YXIgbWV0YSA9IG9i
altNRVRBX0tFWV0sIG5vZGUsIG5vZGVzLCBrZXksIG5vZGVPYmplY3Q7Ci0gIGlmIChtZXRhKSB7
Ci0gICAgb2JqW01FVEFfS0VZXSA9IG51bGw7Ci0gICAgLy8gcmVtb3ZlIGNoYWluV2F0Y2hlcnMg
dG8gcmVtb3ZlIGNpcmN1bGFyIHJlZmVyZW5jZXMgdGhhdCB3b3VsZCBwcmV2ZW50IEdDCi0gICAg
bm9kZSA9IG1ldGEuY2hhaW5zOwotICAgIGlmIChub2RlKSB7Ci0gICAgICBOT0RFX1NUQUNLLnB1
c2gobm9kZSk7Ci0gICAgICAvLyBwcm9jZXNzIHRyZWUKLSAgICAgIHdoaWxlIChOT0RFX1NUQUNL
Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgbm9kZSA9IE5PREVfU1RBQ0sucG9wKCk7Ci0gICAgICAg
IC8vIHB1c2ggY2hpbGRyZW4KLSAgICAgICAgbm9kZXMgPSBub2RlLl9jaGFpbnM7Ci0gICAgICAg
IGlmIChub2RlcykgewotICAgICAgICAgIGZvciAoa2V5IGluIG5vZGVzKSB7Ci0gICAgICAgICAg
ICBpZiAobm9kZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAgICAgICAgICAgICBOT0RFX1NU
QUNLLnB1c2gobm9kZXNba2V5XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICAgIC8vIHJlbW92ZSBjaGFpbldhdGNoZXIgaW4gbm9kZSBvYmplY3QKLSAgICAg
ICAgaWYgKG5vZGUuX3dhdGNoaW5nKSB7Ci0gICAgICAgICAgbm9kZU9iamVjdCA9IG5vZGUuX29i
amVjdDsKLSAgICAgICAgICBpZiAobm9kZU9iamVjdCkgewotICAgICAgICAgICAgcmVtb3ZlQ2hh
aW5XYXRjaGVyKG5vZGVPYmplY3QsIG5vZGUuX2tleSwgbm9kZSk7Ci0gICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0qLwotCi1FbWJlci53YXJuKCJUaGUgQ1Bf
REVGQVVMVF9DQUNIRUFCTEUgZmxhZyBoYXMgYmVlbiByZW1vdmVkIGFuZCBjb21wdXRlZCBwcm9w
ZXJ0aWVzIGFyZSBhbHdheXMgY2FjaGVkIGJ5IGRlZmF1bHQuIFVzZSBgdm9sYXRpbGVgIGlmIHlv
dSBkb24ndCB3YW50IGNhY2hpbmcuIiwgRW1iZXIuRU5WLkNQX0RFRkFVTFRfQ0FDSEVBQkxFICE9
PSBmYWxzZSk7Ci0KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQs
Ci0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgYV9zbGljZSA9IFtdLnNsaWNlLAotICAg
IG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVks
Ci0gICAgd2F0Y2ggPSBFbWJlci53YXRjaCwKLSAgICB1bndhdGNoID0gRW1iZXIudW53YXRjaDsK
LQotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0vLyBERVBFTkRFTlQgS0VZUwotLy8KLQotLy8gZGF0YSBzdHJ1Y3R1cmU6Ci0v
LyAgbWV0YS5kZXBzID0gewotLy8gICAnZGVwS2V5JzogewotLy8gICAgICdrZXlOYW1lJzogY291
bnQsCi0vLyAgIH0KLS8vICB9Ci0KLS8qCi0gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hcCBv
ZiB1bmlxdWUgZGVwZW5kZW5jaWVzIGZvciBhCi0gIGdpdmVuIG9iamVjdCBhbmQga2V5LgotKi8K
LWZ1bmN0aW9uIGtleXNGb3JEZXAoZGVwc01ldGEsIGRlcEtleSkgewotICB2YXIga2V5cyA9IGRl
cHNNZXRhW2RlcEtleV07Ci0gIGlmICgha2V5cykgewotICAgIC8vIGlmIHRoZXJlIGFyZSBubyBk
ZXBlbmRlbmNpZXMgeWV0IGZvciBhIHRoZSBnaXZlbiBrZXkKLSAgICAvLyBjcmVhdGUgYSBuZXcg
ZW1wdHkgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBrZXkKLSAgICBrZXlzID0gZGVwc01l
dGFbZGVwS2V5XSA9IHt9OwotICB9IGVsc2UgaWYgKCFkZXBzTWV0YS5oYXNPd25Qcm9wZXJ0eShk
ZXBLZXkpKSB7Ci0gICAgLy8gb3RoZXJ3aXNlIGlmIHRoZSBkZXBlbmRlbmN5IGxpc3QgaXMgaW5o
ZXJpdGVkIGZyb20KLSAgICAvLyBhIHN1cGVyY2xhc3MsIGNsb25lIHRoZSBoYXNoCi0gICAga2V5
cyA9IGRlcHNNZXRhW2RlcEtleV0gPSBvX2NyZWF0ZShrZXlzKTsKLSAgfQotICByZXR1cm4ga2V5
czsKLX0KLQotZnVuY3Rpb24gbWV0YUZvckRlcHMobWV0YSkgewotICByZXR1cm4ga2V5c0ZvckRl
cChtZXRhLCAnZGVwcycpOwotfQotCi1mdW5jdGlvbiBhZGREZXBlbmRlbnRLZXlzKGRlc2MsIG9i
aiwga2V5TmFtZSwgbWV0YSkgewotICAvLyB0aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRl
cGVuZGVudCBrZXlzLCBzbwotICAvLyBhZGQgYWxsIG9mIGl0cyBkZXBlbmRlbnQga2V5cy4KLSAg
dmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRlbnRLZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4sIGRl
cEtleSwga2V5czsKLSAgaWYgKCFkZXBLZXlzKSByZXR1cm47Ci0KLSAgZGVwc01ldGEgPSBtZXRh
Rm9yRGVwcyhtZXRhKTsKLQotICBmb3IoaWR4ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlk
eCA8IGxlbjsgaWR4KyspIHsKLSAgICBkZXBLZXkgPSBkZXBLZXlzW2lkeF07Ci0gICAgLy8gTG9v
a3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5Ci0gICAga2V5cyA9IGtleXNGb3JEZXAoZGVwc01ldGEs
IGRlcEtleSk7Ci0gICAgLy8gSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGltZXMgZGVwS2V5IGRl
cGVuZHMgb24ga2V5TmFtZS4KLSAgICBrZXlzW2tleU5hbWVdID0gKGtleXNba2V5TmFtZV0gfHwg
MCkgKyAxOwotICAgIC8vIFdhdGNoIHRoZSBkZXBLZXkKLSAgICB3YXRjaChvYmosIGRlcEtleSk7
Ci0gIH0KLX0KLQotZnVuY3Rpb24gcmVtb3ZlRGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5h
bWUsIG1ldGEpIHsKLSAgLy8gdGhlIGRlc2NyaXB0b3IgaGFzIGEgbGlzdCBvZiBkZXBlbmRlbnQg
a2V5cywgc28KLSAgLy8gYWRkIGFsbCBvZiBpdHMgZGVwZW5kZW50IGtleXMuCi0gIHZhciBkZXBL
ZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5cywgZGVwc01ldGEsIGlkeCwgbGVuLCBkZXBLZXksIGtl
eXM7Ci0gIGlmICghZGVwS2V5cykgcmV0dXJuOwotCi0gIGRlcHNNZXRhID0gbWV0YUZvckRlcHMo
bWV0YSk7Ci0KLSAgZm9yKGlkeCA9IDAsIGxlbiA9IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47
IGlkeCsrKSB7Ci0gICAgZGVwS2V5ID0gZGVwS2V5c1tpZHhdOwotICAgIC8vIExvb2t1cCBrZXlz
IG1ldGEgZm9yIGRlcEtleQotICAgIGtleXMgPSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkp
OwotICAgIC8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9u
IGtleU5hbWUuCi0gICAga2V5c1trZXlOYW1lXSA9IChrZXlzW2tleU5hbWVdIHx8IDApIC0gMTsK
LSAgICAvLyBXYXRjaCB0aGUgZGVwS2V5Ci0gICAgdW53YXRjaChvYmosIGRlcEtleSk7Ci0gIH0K
LX0KLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotLy8gQ09NUFVURUQgUFJPUEVSVFkKLS8vCi0KLS8qKgotICBBIGNvbXB1dGVk
IHByb3BlcnR5IHRyYW5zZm9ybXMgYW4gb2JqZWN0cyBmdW5jdGlvbiBpbnRvIGEgcHJvcGVydHku
Ci0KLSAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24gYmFja2luZyB0aGUgY29tcHV0ZWQgcHJvcGVy
dHkgd2lsbCBvbmx5IGJlIGNhbGxlZAotICBvbmNlIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgY2Fj
aGVkLiBZb3UgY2FuIHNwZWNpZnkgdmFyaW91cyBwcm9wZXJ0aWVzCi0gIHRoYXQgeW91ciBjb21w
dXRlZCBwcm9wZXJ0eSBpcyBkZXBlbmRlbnQgb24uIFRoaXMgd2lsbCBmb3JjZSB0aGUgY2FjaGVk
Ci0gIHJlc3VsdCB0byBiZSByZWNvbXB1dGVkIGlmIHRoZSBkZXBlbmRlbmNpZXMgYXJlIG1vZGlm
aWVkLgotCi0gIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3ZSBkZWNsYXJlIGEgY29tcHV0ZWQg
cHJvcGVydHkgKGJ5IGNhbGxpbmcKLSAgYC5wcm9wZXJ0eSgpYCBvbiB0aGUgZnVsbE5hbWUgZnVu
Y3Rpb24pIGFuZCBzZXR1cCB0aGUgcHJvcGVydGllcwotICBkZXBlbmRlbmNpZXMgKGRlcGVuZGlu
ZyBvbiBmaXJzdE5hbWUgYW5kIGxhc3ROYW1lKS4gVGhlIGZ1bGxOYW1lIGZ1bmN0aW9uCi0gIHdp
bGwgYmUgY2FsbGVkIG9uY2UgKHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGltZXMgaXQgaXMgYWNj
ZXNzZWQpIGFzIGxvbmcKLSAgYXMgaXQncyBkZXBlbmRlbmNpZXMgaGF2ZSBub3QgYmVlbiBjaGFu
Z2VkLiBPbmNlIGZpcnN0TmFtZSBvciBsYXN0TmFtZSBhcmUgdXBkYXRlZAotICBhbnkgZnV0dXJl
IGNhbGxzIChvciBhbnl0aGluZyBib3VuZCkgdG8gZnVsbE5hbWUgd2lsbCBpbmNvcnBvcmF0ZSB0
aGUgbmV3Ci0gIHZhbHVlcy4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIFBlcnNvbiA9IEVtYmVyLk9i
amVjdC5leHRlbmQoewotICAgIC8vIHRoZXNlIHdpbGwgYmUgc3VwcGxpZWQgYnkgYGNyZWF0ZWAK
LSAgICBmaXJzdE5hbWU6IG51bGwsCi0gICAgbGFzdE5hbWU6IG51bGwsCi0KLSAgICBmdWxsTmFt
ZTogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFt
ZScpOwotICAgICAgdmFyIGxhc3ROYW1lID0gdGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAg
cmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2ZpcnN0
TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwotCi0gIHZhciB0b20gPSBQZXJzb24uY3JlYXRlKHsK
LSAgICBmaXJzdE5hbWU6ICJUb20iLAotICAgIGxhc3ROYW1lOiAiRGFsZSIKLSAgfSk7Ci0KLSAg
dG9tLmdldCgnZnVsbE5hbWUnKSAvLyAiVG9tIERhbGUiCi0gIGBgYAotCi0gIFlvdSBjYW4gYWxz
byBkZWZpbmUgd2hhdCBFbWJlciBzaG91bGQgZG8gd2hlbiBzZXR0aW5nIGEgY29tcHV0ZWQgcHJv
cGVydHkuCi0gIElmIHlvdSB0cnkgdG8gc2V0IGEgY29tcHV0ZWQgcHJvcGVydHksIGl0IHdpbGwg
YmUgaW52b2tlZCB3aXRoIHRoZSBrZXkgYW5kCi0gIHZhbHVlIHlvdSB3YW50IHRvIHNldCBpdCB0
by4gWW91IGNhbiBhbHNvIGFjY2VwdCB0aGUgcHJldmlvdXMgdmFsdWUgYXMgdGhlCi0gIHRoaXJk
IHBhcmFtZXRlci4KLQotICBgYGBqYXZhc2NyaXB0Ci0KLSBQZXJzb24gPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKLSAgICAvLyB0aGVzZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IGBjcmVhdGVgCi0gICAg
Zmlyc3ROYW1lOiBudWxsLAotICAgIGxhc3ROYW1lOiBudWxsLAotCi0gICAgZnVsbE5hbWU6IGZ1
bmN0aW9uKGtleSwgdmFsdWUsIG9sZFZhbHVlKSB7Ci0gICAgICAvLyBnZXR0ZXIKLSAgICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICAgIHZhciBmaXJzdE5hbWUgPSB0aGlz
LmdldCgnZmlyc3ROYW1lJyk7Ci0gICAgICAgIHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0
TmFtZScpOwotCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTsKLQot
ICAgICAgLy8gc2V0dGVyCi0gICAgICB9IGVsc2UgewotICAgICAgICB2YXIgbmFtZSA9IHZhbHVl
LnNwbGl0KCIgIik7Ci0KLSAgICAgICAgdGhpcy5zZXQoJ2ZpcnN0TmFtZScsIG5hbWVbMF0pOwot
ICAgICAgICB0aGlzLnNldCgnbGFzdE5hbWUnLCBuYW1lWzFdKTsKLQotICAgICAgICByZXR1cm4g
dmFsdWU7Ci0gICAgICB9Ci0gICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykK
LSAgfSk7Ci0KLSAgdmFyIHBlcnNvbiA9IFBlcnNvbi5jcmVhdGUoKTsKLSAgcGVyc29uLnNldCgn
ZnVsbE5hbWUnLCAiUGV0ZXIgV2FnZW5ldCIpOwotICBwZXJzb24uZ2V0KCdmaXJzdE5hbWUnKSAv
LyBQZXRlcgotICBwZXJzb24uZ2V0KCdsYXN0TmFtZScpIC8vIFdhZ2VuZXQKLSAgYGBgCi0KLSAg
QGNsYXNzIENvbXB1dGVkUHJvcGVydHkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
bWJlci5EZXNjcmlwdG9yCi0gIEBjb25zdHJ1Y3RvcgotKi8KLWZ1bmN0aW9uIENvbXB1dGVkUHJv
cGVydHkoZnVuYywgb3B0cykgewotICB0aGlzLmZ1bmMgPSBmdW5jOwotCi0gIHRoaXMuX2NhY2hl
YWJsZSA9IChvcHRzICYmIG9wdHMuY2FjaGVhYmxlICE9PSB1bmRlZmluZWQpID8gb3B0cy5jYWNo
ZWFibGUgOiB0cnVlOwotICB0aGlzLl9kZXBlbmRlbnRLZXlzID0gb3B0cyAmJiBvcHRzLmRlcGVu
ZGVudEtleXM7Ci0gIHRoaXMuX3JlYWRPbmx5ID0gb3B0cyAmJiAob3B0cy5yZWFkT25seSAhPT0g
dW5kZWZpbmVkIHx8ICEhb3B0cy5yZWFkT25seSk7Ci19Ci0KLUVtYmVyLkNvbXB1dGVkUHJvcGVy
dHkgPSBDb21wdXRlZFByb3BlcnR5OwotQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcg
RW1iZXIuRGVzY3JpcHRvcigpOwotCi12YXIgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZSA9IENv
bXB1dGVkUHJvcGVydHkucHJvdG90eXBlOwotCi0vKioKLSAgUHJvcGVydGllcyBhcmUgY2FjaGVh
YmxlIGJ5IGRlZmF1bHQuIENvbXB1dGVkIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseQotICBj
YWNoZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHlvdXIgZnVuY3Rpb24gdW50aWwgb25lIG9mIHRoZSBk
ZXBlbmRlbnQga2V5cyBjaGFuZ2VzLgotCi0gIENhbGwgYHZvbGF0aWxlKClgIHRvIHNldCBpdCBp
bnRvIG5vbi1jYWNoZWQgbW9kZS4gV2hlbiBpbiB0aGlzIG1vZGUKLSAgdGhlIGNvbXB1dGVkIHBy
b3BlcnR5IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KLQot
ICBIb3dldmVyLCBpZiBhIHByb3BlcnR5IGlzIHByb3Blcmx5IG9ic2VydmFibGUsIHRoZXJlIGlz
IG5vIHJlYXNvbiB0byBkaXNhYmxlCi0gIGNhY2hpbmcuCi0KLSAgQG1ldGhvZCBjYWNoZWFibGUK
LSAgQHBhcmFtIHtCb29sZWFufSBhRmxhZyBvcHRpb25hbCBzZXQgdG8gYGZhbHNlYCB0byBkaXNh
YmxlIGNhY2hpbmcKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gdGhpcwotICBA
Y2hhaW5hYmxlCi0qLwotQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5jYWNoZWFibGUgPSBmdW5j
dGlvbihhRmxhZykgewotICB0aGlzLl9jYWNoZWFibGUgPSBhRmxhZyAhPT0gZmFsc2U7Ci0gIHJl
dHVybiB0aGlzOwotfTsKLQotLyoqCi0gIENhbGwgb24gYSBjb21wdXRlZCBwcm9wZXJ0eSB0byBz
ZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUuIFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21w
dXRlZCBwcm9wZXJ0eSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1cm4gdmFs
dWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5vdXRzaWRlU2VydmljZSA9IEVtYmVyLk9i
amVjdC5leHRlbmQoewotICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBPdXRz
aWRlU2VydmljZS5nZXRWYWx1ZSgpOwotICAgIH0ucHJvcGVydHkoKS52b2xhdGlsZSgpCi0gIH0p
LmNyZWF0ZSgpOwotICBgYGAKLQotICBAbWV0aG9kIHZvbGF0aWxlCi0gIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKLSAgQGNoYWluYWJsZQotKi8KLUNvbXB1dGVkUHJvcGVy
dHlQcm90b3R5cGUudm9sYXRpbGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuY2FjaGVh
YmxlKGZhbHNlKTsKLX07Ci0KLS8qKgotICBDYWxsIG9uIGEgY29tcHV0ZWQgcHJvcGVydHkgdG8g
c2V0IGl0IGludG8gcmVhZC1vbmx5IG1vZGUuIFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21w
dXRlZCBwcm9wZXJ0eSB3aWxsIHRocm93IGFuIGVycm9yIHdoZW4gc2V0LgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgTXlBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgZ3VpZDog
ZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gJ2d1aWQtZ3VpZC1ndWlkJzsKLSAgICB9LnByb3Bl
cnR5KCkucmVhZE9ubHkoKQotICB9KTsKLQotICBNeUFwcC5wZXJzb24gPSBNeUFwcC5QZXJzb24u
Y3JlYXRlKCk7Ci0KLSAgTXlBcHAucGVyc29uLnNldCgnZ3VpZCcsICduZXctZ3VpZCcpOyAvLyB3
aWxsIHRocm93IGFuIGV4Y2VwdGlvbgotICBgYGAKLQotICBAbWV0aG9kIHJlYWRPbmx5Ci0gIEBy
ZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKLSAgQGNoYWluYWJsZQotKi8KLUNv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUucmVhZE9ubHkgPSBmdW5jdGlvbihyZWFkT25seSkgewot
ICB0aGlzLl9yZWFkT25seSA9IHJlYWRPbmx5ID09PSB1bmRlZmluZWQgfHwgISFyZWFkT25seTsK
LSAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioKLSAgU2V0cyB0aGUgZGVwZW5kZW50IGtleXMgb24g
dGhpcyBjb21wdXRlZCBwcm9wZXJ0eS4gUGFzcyBhbnkgbnVtYmVyIG9mCi0gIGFyZ3VtZW50cyBj
b250YWluaW5nIGtleSBwYXRocyB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBv
bi4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIE15QXBwLlByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoewotICAgIGZ1bGxOYW1lOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAg
IHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUn
KTsKLQotICAgICAgLy8gVGVsbCBFbWJlciB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVw
ZW5kcyBvbiBmaXJzdE5hbWUKLSAgICAgIC8vIGFuZCBsYXN0TmFtZQotICAgIH0pLnByb3BlcnR5
KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICB9KTsKLQotICBNeUFwcC5wcmVzaWRlbnQgPSBN
eUFwcC5QcmVzaWRlbnQuY3JlYXRlKHsKLSAgICBmaXJzdE5hbWU6ICdCYXJhY2snLAotICAgIGxh
c3ROYW1lOiAnT2JhbWEnLAotICB9KTsKLSAgTXlBcHAucHJlc2lkZW50LmdldCgnZnVsbE5hbWUn
KTsgLy8gQmFyYWNrIE9iYW1hCi0gIGBgYAotCi0gIEBtZXRob2QgcHJvcGVydHkKLSAgQHBhcmFt
IHtTdHJpbmd9IHBhdGgqIHplcm8gb3IgbW9yZSBwcm9wZXJ0eSBwYXRocwotICBAcmV0dXJuIHtF
bWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCi0gIEBjaGFpbmFibGUKLSovCi1Db21wdXRlZFBy
b3BlcnR5UHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzOwotCi0g
IAotICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgCi0KLSAgdGhpcy5fZGVw
ZW5kZW50S2V5cyA9IGFyZ3M7Ci0gIHJldHVybiB0aGlzOwotfTsKLQotLyoqCi0gIEluIHNvbWUg
Y2FzZXMsIHlvdSBtYXkgd2FudCB0byBhbm5vdGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGgg
YWRkaXRpb25hbAotICBtZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZh
bHVlcyB0aGV5IG9wZXJhdGUgb24uIEZvciBleGFtcGxlLAotICBjb21wdXRlZCBwcm9wZXJ0eSBm
dW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgdmFyaWFibGVzIHRoYXQgYXJlIHRoZW4gbm8gbG9uZ2Vy
Ci0gIGF2YWlsYWJsZSBmb3IgaW50cm9zcGVjdGlvbi4KLQotICBZb3UgY2FuIHBhc3MgYSBoYXNo
IG9mIHRoZXNlIHZhbHVlcyB0byBhIGNvbXB1dGVkIHByb3BlcnR5IGxpa2UgdGhpczoKLQotICBg
YGAKLSAgcGVyc29uOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgn
cGVyc29uSWQnKTsKLSAgICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQg
fSk7Ci0gIH0ucHJvcGVydHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNvbiB9KQotICBgYGAKLQot
ICBUaGUgaGFzaCB0aGF0IHlvdSBwYXNzIHRvIHRoZSBgbWV0YSgpYCBmdW5jdGlvbiB3aWxsIGJl
IHNhdmVkIG9uIHRoZQotICBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBg
X21ldGFgIGtleS4gRW1iZXIgcnVudGltZQotICBleHBvc2VzIGEgcHVibGljIEFQSSBmb3IgcmV0
cmlldmluZyB0aGVzZSB2YWx1ZXMgZnJvbSBjbGFzc2VzLAotICB2aWEgdGhlIGBtZXRhRm9yUHJv
cGVydHkoKWAgZnVuY3Rpb24uCi0KLSAgQG1ldGhvZCBtZXRhCi0gIEBwYXJhbSB7SGFzaH0gbWV0
YQotICBAY2hhaW5hYmxlCi0qLwotCi1Db21wdXRlZFByb3BlcnR5UHJvdG90eXBlLm1ldGEgPSBm
dW5jdGlvbihtZXRhKSB7Ci0gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0
dXJuIHRoaXMuX21ldGEgfHwge307Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy5fbWV0YSA9IG1ldGE7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX07Ci0KLS8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8K
LUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZGlkQ2hhbmdlID0gZnVuY3Rpb24ob2JqLCBrZXlO
YW1lKSB7Ci0gIC8vIF9zdXNwZW5kZWQgaXMgc2V0IHZpYSBhIENQLnNldCB0byBlbnN1cmUgd2Ug
ZG9uJ3QgY2xlYXIKLSAgLy8gdGhlIGNhY2hlZCB2YWx1ZSBzZXQgYnkgdGhlIHNldHRlcgotICBp
ZiAodGhpcy5fY2FjaGVhYmxlICYmIHRoaXMuX3N1c3BlbmRlZCAhPT0gb2JqKSB7Ci0gICAgdmFy
IG1ldGEgPSBtZXRhRm9yKG9iaik7Ci0gICAgaWYgKGtleU5hbWUgaW4gbWV0YS5jYWNoZSkgewot
ICAgICAgZGVsZXRlIG1ldGEuY2FjaGVba2V5TmFtZV07Ci0gICAgICByZW1vdmVEZXBlbmRlbnRL
ZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlv
biBmaW5pc2hDaGFpbnMoY2hhaW5Ob2RlcykKLXsKLSAgZm9yICh2YXIgaT0wLCBsPWNoYWluTm9k
ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGNoYWluTm9kZXNbaV0uZGlkQ2hhbmdlKG51bGwp
OwotICB9Ci19Ci0KLS8qKgotICBBY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBiYWNr
aW5nIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KLSAgSWYgdGhpcyBwcm9wZXJ0eSBoYXMgYWxyZWFk
eSBiZWVuIGNhY2hlZCwgcmV0dXJuIHRoZSBjYWNoZWQgcmVzdWx0LgotICBPdGhlcndpc2UsIGNh
bGwgdGhlIGZ1bmN0aW9uIHBhc3NpbmcgdGhlIHByb3BlcnR5IG5hbWUgYXMgYW4gYXJndW1lbnQu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBQZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
ICBmdWxsTmFtZTogZnVuY3Rpb24oa2V5TmFtZSkgewotICAgICAgLy8gdGhlIGtleU5hbWUgcGFy
YW1ldGVyIGlzICdmdWxsTmFtZScgaW4gdGhpcyBjYXNlLgotCi0gICAgICByZXR1cm4gdGhpcy5n
ZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0gICAgfS5wcm9w
ZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKLSAgfSk7Ci0KLQotICB2YXIgdG9tID0gUGVy
c29uLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1lOiAiVG9tIiwKLSAgICBsYXN0TmFtZTogIkRhbGUi
Ci0gIH0pOwotCi0gIHRvbS5nZXQoJ2Z1bGxOYW1lJykgLy8gIlRvbSBEYWxlIgotICBgYGAKLQot
ICBAbWV0aG9kIGdldAotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUga2V5IGJlaW5nIGFj
Y2Vzc2VkLgotICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0
aW9uIGJhY2tpbmcgdGhlIENQLgotKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0g
ZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gIHZhciByZXQsIGNhY2hlLCBtZXRhLCBjaGFpbk5v
ZGVzOwotICBpZiAodGhpcy5fY2FjaGVhYmxlKSB7Ci0gICAgbWV0YSA9IG1ldGFGb3Iob2JqKTsK
LSAgICBjYWNoZSA9IG1ldGEuY2FjaGU7Ci0gICAgaWYgKGtleU5hbWUgaW4gY2FjaGUpIHsgcmV0
dXJuIGNhY2hlW2tleU5hbWVdOyB9Ci0gICAgcmV0ID0gY2FjaGVba2V5TmFtZV0gPSB0aGlzLmZ1
bmMuY2FsbChvYmosIGtleU5hbWUpOwotICAgIGNoYWluTm9kZXMgPSBtZXRhLmNoYWluV2F0Y2hl
cnMgJiYgbWV0YS5jaGFpbldhdGNoZXJzW2tleU5hbWVdOwotICAgIGlmIChjaGFpbk5vZGVzKSB7
IGZpbmlzaENoYWlucyhjaGFpbk5vZGVzKTsgfQotICAgIGFkZERlcGVuZGVudEtleXModGhpcywg
b2JqLCBrZXlOYW1lLCBtZXRhKTsKLSAgfSBlbHNlIHsKLSAgICByZXQgPSB0aGlzLmZ1bmMuY2Fs
bChvYmosIGtleU5hbWUpOwotICB9Ci0gIHJldHVybiByZXQ7Ci19OwotCi0vKioKLSAgU2V0IHRo
ZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3BlcnR5LiBJZiB0aGUgZnVuY3Rpb24gdGhhdCBiYWNr
cyB5b3VyCi0gIGNvbXB1dGVkIHByb3BlcnR5IGRvZXMgbm90IGFjY2VwdCBhcmd1bWVudHMgdGhl
biB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yCi0gIHNldHRpbmcgd291bGQgYmUgdG8gZGVmaW5lIHRo
ZSBwcm9wZXJ0eSBvbiB0aGUgY3VycmVudCBvYmplY3QsIGFuZCBzZXQKLSAgdGhlIHZhbHVlIG9m
IHRoZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgYmVpbmcgc2V0LgotCi0gIEdlbmVyYWxseSBzcGVh
a2luZyBpZiB5b3UgaW50ZW5kIGZvciB5b3VyIGNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIHNldAot
ICB5b3VyIGJhY2tpbmcgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBlaXRoZXIgdHdvIG9yIHRocmVl
IGFyZ3VtZW50cy4KLQotICBAbWV0aG9kIHNldAotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU
aGUga2V5IGJlaW5nIGFjY2Vzc2VkLgotICBAcGFyYW0ge09iamVjdH0gbmV3VmFsdWUgVGhlIG5l
dyB2YWx1ZSBiZWluZyBhc3NpZ25lZC4KLSAgQHBhcmFtIHtTdHJpbmd9IG9sZFZhbHVlIFRoZSBv
bGQgdmFsdWUgYmVpbmcgcmVwbGFjZWQuCi0gIEByZXR1cm4ge09iamVjdH0gVGhlIHJldHVybiB2
YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYmFja2luZyB0aGUgQ1AuCi0qLwotQ29tcHV0ZWRQcm9wZXJ0
eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIHZhbHVlKSB7Ci0gIHZhciBj
YWNoZWFibGUgPSB0aGlzLl9jYWNoZWFibGUsCi0gICAgICBmdW5jID0gdGhpcy5mdW5jLAotICAg
ICAgbWV0YSA9IG1ldGFGb3Iob2JqLCBjYWNoZWFibGUpLAotICAgICAgd2F0Y2hlZCA9IG1ldGEu
d2F0Y2hpbmdba2V5TmFtZV0sCi0gICAgICBvbGRTdXNwZW5kZWQgPSB0aGlzLl9zdXNwZW5kZWQs
Ci0gICAgICBoYWRDYWNoZWRWYWx1ZSA9IGZhbHNlLAotICAgICAgY2FjaGUgPSBtZXRhLmNhY2hl
LAotICAgICAgZnVuY0FyZ0xlbmd0aCwgY2FjaGVkVmFsdWUsIHJldDsKLQotICBpZiAodGhpcy5f
cmVhZE9ubHkpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ0Nhbm5vdCBTZXQ6ICcgKyBr
ZXlOYW1lICsgJyBvbjogJyArIG9iai50b1N0cmluZygpICk7Ci0gIH0KLQotICB0aGlzLl9zdXNw
ZW5kZWQgPSBvYmo7Ci0KLSAgdHJ5IHsKLQotICAgIGlmIChjYWNoZWFibGUgJiYgY2FjaGUuaGFz
T3duUHJvcGVydHkoa2V5TmFtZSkpIHsKLSAgICAgIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5TmFt
ZV07Ci0gICAgICBoYWRDYWNoZWRWYWx1ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sg
aWYgdGhlIENQIGhhcyBiZWVuIHdyYXBwZWQuIElmIGlmIGhhcywgdXNlIHRoZQotICAgIC8vIGxl
bmd0aCBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgotICAgIGZ1bmNBcmdMZW5ndGggPSAoZnVu
Yy53cmFwcGVkRnVuY3Rpb24gPyBmdW5jLndyYXBwZWRGdW5jdGlvbi5sZW5ndGggOiBmdW5jLmxl
bmd0aCk7Ci0KLSAgICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21wdXRl
ZCBwcm9wZXJ0aWVzCi0gICAgLy8gdGhhdCBjaGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9PT0g
MiB0byBkZXRlcm1pbmUgaWYKLSAgICAvLyB0aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBvbmx5
IHBhc3MgdGhlIG9sZCBjYWNoZWQKLSAgICAvLyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVy
dHkgb3B0cyBpbnRvIGEgdGhpcmQKLSAgICAvLyBhcmd1bWVudC4KLSAgICBpZiAoZnVuY0FyZ0xl
bmd0aCA9PT0gMykgewotICAgICAgcmV0ID0gZnVuYy5jYWxsKG9iaiwga2V5TmFtZSwgdmFsdWUs
IGNhY2hlZFZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGZ1bmNBcmdMZW5ndGggPT09IDIpIHsKLSAg
ICAgIHJldCA9IGZ1bmMuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBudWxsLCBjYWNoZWRWYWx1
ZSk7Ci0gICAgICBFbWJlci5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7Ci0gICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKGhhZENhY2hlZFZhbHVlICYmIGNhY2hlZFZhbHVlID09PSByZXQp
IHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAod2F0Y2hlZCkgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFu
Z2Uob2JqLCBrZXlOYW1lKTsgfQotCi0gICAgaWYgKGhhZENhY2hlZFZhbHVlKSB7Ci0gICAgICBk
ZWxldGUgY2FjaGVba2V5TmFtZV07Ci0gICAgfQotCi0gICAgaWYgKGNhY2hlYWJsZSkgewotICAg
ICAgaWYgKCFoYWRDYWNoZWRWYWx1ZSkgewotICAgICAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMs
IG9iaiwga2V5TmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZVtrZXlOYW1lXSA9IHJl
dDsKLSAgICB9Ci0KLSAgICBpZiAod2F0Y2hlZCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShv
YmosIGtleU5hbWUpOyB9Ci0gIH0gZmluYWxseSB7Ci0gICAgdGhpcy5fc3VzcGVuZGVkID0gb2xk
U3VzcGVuZGVkOwotICB9Ci0gIHJldHVybiByZXQ7Ci19OwotCi0vKiBjYWxsZWQgYmVmb3JlIHBy
b3BlcnR5IGlzIG92ZXJyaWRkZW4gKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUudGVhcmRv
d24gPSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7
Ci0KLSAgaWYgKGtleU5hbWUgaW4gbWV0YS5jYWNoZSkgewotICAgIHJlbW92ZURlcGVuZGVudEtl
eXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRhKTsKLSAgfQotCi0gIGlmICh0aGlzLl9jYWNoZWFi
bGUpIHsgZGVsZXRlIG1ldGEuY2FjaGVba2V5TmFtZV07IH0KLQotICByZXR1cm4gbnVsbDsgLy8g
bm8gdmFsdWUgdG8gcmVzdG9yZQotfTsKLQotCi0vKioKLSAgVGhpcyBoZWxwZXIgcmV0dXJucyBh
IG5ldyBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRoYXQgd3JhcHMgdGhlIHBhc3NlZAotICBjb21wdXRl
ZCBwcm9wZXJ0eSBmdW5jdGlvbi4gWW91IGNhbiB1c2UgdGhpcyBoZWxwZXIgdG8gZGVmaW5lIHBy
b3BlcnRpZXMKLSAgd2l0aCBtaXhpbnMgb3IgdmlhIGBFbWJlci5kZWZpbmVQcm9wZXJ0eSgpYC4K
LQotICBUaGUgZnVuY3Rpb24geW91IHBhc3Mgd2lsbCBiZSB1c2VkIHRvIGJvdGggZ2V0IGFuZCBz
ZXQgcHJvcGVydHkgdmFsdWVzLgotICBUaGUgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCB0d28gcGFy
YW1ldGVycywga2V5IGFuZCB2YWx1ZS4gSWYgdmFsdWUgaXMgbm90Ci0gIHVuZGVmaW5lZCB5b3Ug
c2hvdWxkIHNldCB0aGUgdmFsdWUgZmlyc3QuIEluIGVpdGhlciBjYXNlIHJldHVybiB0aGUKLSAg
Y3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gIEBtZXRob2QgY29tcHV0ZWQKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBm
dW5jdGlvbi4KLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gcHJvcGVydHkgZGVz
Y3JpcHRvciBpbnN0YW5jZQotKi8KLUVtYmVyLmNvbXB1dGVkID0gZnVuY3Rpb24oZnVuYykgewot
ICB2YXIgYXJnczsKLQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKLSAgICBhcmdzID0g
YV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpOwotICAgIGZ1bmMgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzLCAtMSlbMF07Ci0gIH0KLQotICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlv
biIpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNvbXB1dGVkIFByb3BlcnR5IGRlY2xh
cmVkIHdpdGhvdXQgYSBwcm9wZXJ0eSBmdW5jdGlvbiIpOwotICB9Ci0KLSAgdmFyIGNwID0gbmV3
IENvbXB1dGVkUHJvcGVydHkoZnVuYyk7Ci0KLSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0
eS5hcHBseShjcCwgYXJncyk7Ci0gIH0KLQotICByZXR1cm4gY3A7Ci19OwotCi0vKioKLSAgUmV0
dXJucyB0aGUgY2FjaGVkIHZhbHVlIGZvciBhIHByb3BlcnR5LCBpZiBvbmUgZXhpc3RzLgotICBU
aGlzIGNhbiBiZSB1c2VmdWwgZm9yIHBlZWtpbmcgYXQgdGhlIHZhbHVlIG9mIGEgY29tcHV0ZWQK
LSAgcHJvcGVydHkgdGhhdCBpcyBnZW5lcmF0ZWQgbGF6aWx5LCB3aXRob3V0IGFjY2lkZW50YWxs
eSBjYXVzaW5nCi0gIGl0IHRvIGJlIGNyZWF0ZWQuCi0KLSAgQG1ldGhvZCBjYWNoZUZvcgotICBA
Zm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0
eSB5b3Ugd2FudCB0byBjaGVjawotICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBuYW1lIG9mIHRo
ZSBwcm9wZXJ0eSB3aG9zZSBjYWNoZWQgdmFsdWUgeW91IHdhbnQKLSAgICB0byByZXR1cm4KLSAg
QHJldHVybiB7T2JqZWN0fSB0aGUgY2FjaGVkIHZhbHVlCi0qLwotRW1iZXIuY2FjaGVGb3IgPSBm
dW5jdGlvbiBjYWNoZUZvcihvYmosIGtleSkgewotICB2YXIgY2FjaGUgPSBtZXRhRm9yKG9iaiwg
ZmFsc2UpLmNhY2hlOwotCi0gIGlmIChjYWNoZSAmJiBrZXkgaW4gY2FjaGUpIHsKLSAgICByZXR1
cm4gY2FjaGVba2V5XTsKLSAgfQotfTsKLQotZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhzZWxmLCBw
cm9wZXJ0eU5hbWVzKSB7Ci0gIHZhciByZXQgPSB7fTsKLSAgZm9yKHZhciBpID0gMDsgaSA8IHBy
b3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICByZXRbcHJvcGVydHlOYW1lc1tpXV0gPSBn
ZXQoc2VsZiwgcHJvcGVydHlOYW1lc1tpXSk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVu
Y3Rpb24gcmVnaXN0ZXJDb21wdXRlZChuYW1lLCBtYWNybykgewotICBFbWJlci5jb21wdXRlZFtu
YW1lXSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICAgIHZhciBhcmdzID0gYV9zbGljZS5j
YWxsKGFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwg
ZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gbWFjcm8uYXBwbHkodGhpcywgYXJncyk7Ci0gICAg
fSk7Ci0gIH07Ci19Ci0KLWZ1bmN0aW9uIHJlZ2lzdGVyQ29tcHV0ZWRXaXRoUHJvcGVydGllcyhu
YW1lLCBtYWNybykgewotICBFbWJlci5jb21wdXRlZFtuYW1lXSA9IGZ1bmN0aW9uKCkgewotICAg
IHZhciBwcm9wZXJ0aWVzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0KLSAgICB2YXIgY29t
cHV0ZWQgPSBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBtYWNyby5h
cHBseSh0aGlzLCBbZ2V0UHJvcGVydGllcyh0aGlzLCBwcm9wZXJ0aWVzKV0pOwotICAgIH0pOwot
Ci0gICAgcmV0dXJuIGNvbXB1dGVkLnByb3BlcnR5LmFwcGx5KGNvbXB1dGVkLCBwcm9wZXJ0aWVz
KTsKLSAgfTsKLX0KLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRy
dWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXBlbmRlbnQKLSAgcHJvcGVydHkgaXMgbnVsbCwgYW4g
ZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90ZTog
V2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQuZW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ug
c3VyZSB0bwotICB1c2UgdGhlIGBhcnJheS5bXWAgc3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4g
c3Vic2NyaWJlIHRvIHRyYW5zaXRpb25zCi0gIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRl
cy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgVG9Eb0xpc3QgPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgICBkb25lOiBFbWJlci5jb21wdXRlZC5lbXB0eSgndG9kb3Mu
W10nKSAvLyBkZXRlY3QgYXJyYXkgY2hhbmdlcwotICB9KTsKLSAgdmFyIHRvZG9MaXN0ID0gVG9E
b0xpc3QuY3JlYXRlKHt0b2RvczogWydVbml0IFRlc3QnLCAnRG9jdW1lbnRhdGlvbicsICdSZWxl
YXNlJ119KTsKLSAgdG9kb0xpc3QuZ2V0KCdkb25lJyk7IC8vIGZhbHNlCi0gIHRvZG9MaXN0Lmdl
dCgndG9kb3MnKS5jbGVhcigpOyAvLyBbXQotICB0b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gdHJ1
ZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLmVtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBh
cmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl
cnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBuZWdhdGUKLSAgdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eQotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2VtcHR5JywgZnVuY3Rpb24oZGVw
ZW5kZW50S2V5KSB7Ci0gIHJldHVybiBFbWJlci5pc0VtcHR5KGdldCh0aGlzLCBkZXBlbmRlbnRL
ZXkpKTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1
ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGRlcGVuZGVudAotICBwcm9wZXJ0eSBpcyBOT1QgbnVsbCwg
YW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90
ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQubm90RW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5
IG1ha2Ugc3VyZSB0bwotICB1c2UgdGhlIGBhcnJheS5bXWAgc3ludGF4IHNvIHRoZSBjb21wdXRl
ZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRpb25zCi0gIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5
IHN0YXRlcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc1N0dWZmOiBFbWJlci5jb21wdXRlZC5ub3RF
bXB0eSgnYmFja3BhY2suW10nKQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0
ZSh7YmFja3BhY2s6IFsnRm9vZCcsICdTbGVlcGluZyBCYWcnLCAnVGVudCddfSk7Ci0gIGhhbXN0
ZXIuZ2V0KCdoYXNTdHVmZicpOyAvLyB0cnVlCi0gIGhhbXN0ZXIuZ2V0KCdiYWNrcGFjaycpLmNs
ZWFyKCk7IC8vIFtdCi0gIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAvLyBmYWxzZQotICBgYGAK
LQotICBAbWV0aG9kIGNvbXB1dGVkLm5vdEVtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtT
dHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBj
b21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKLSAgb3JpZ2luYWwgdmFsdWUg
Zm9yIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdub3RFbXB0
eScsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gIUVtYmVyLmlzRW1wdHkoZ2V0
KHRoaXMsIGRlcGVuZGVudEtleSkpOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5
IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50Ci0gIHByb3Bl
cnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBUaGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQg
Y29tcGxhaW5pbmcKLSAgYWJvdXQgdXNlIG9mID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkg
Y29uZnVzaW5nLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVy
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaXNIdW5ncnk6IEVtYmVyLmNvbXB1dGVkLm5v
bmUoJ2Zvb2QnKQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBo
YW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8gdHJ1ZQotICBoYW1zdGVyLnNldCgnZm9vZCcsICdC
YW5hbmEnKTsKLSAgaGFtc3Rlci5nZXQoJ2lzSHVuZ3J5Jyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIu
c2V0KCdmb29kJywgbnVsbCk7Ci0gIGhhbXN0ZXIuZ2V0KCdpc0h1bmdyeScpOyAvLyB0cnVlCi0g
IGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubm9uZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0g
Y29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKLSAgcmV0dXJucyB0cnVlIGlmIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eSBpcyBudWxsIG9yIHVuZGVmaW5lZC4KLSovCi1yZWdpc3RlckNvbXB1dGVk
KCdub25lJywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVybiBFbWJlci5pc05vbmUo
Z2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgcmV0dXJucyB0aGUgaW52ZXJzZSBib29sZWFuIHZhbHVlCi0gIG9mIHRoZSBvcmln
aW5hbCB2YWx1ZSBmb3IgdGhlIGRlcGVuZGVudCBwcm9wZXJ0eS4KLQotICBFeGFtcGxlCi0KLSAg
YGBgamF2YXNjcmlwdAotICB2YXIgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGlz
QW5vbnltb3VzOiBFbWJlci5jb21wdXRlZC5ub3QoJ2xvZ2dlZEluJykKLSAgfSk7Ci0gIHZhciB1
c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0pOwotICB1c2VyLmdldCgnaXNBbm9u
eW1vdXMnKTsgLy8gdHJ1ZQotICB1c2VyLnNldCgnbG9nZ2VkSW4nLCB0cnVlKTsKLSAgdXNlci5n
ZXQoJ2lzQW5vbnltb3VzJyk7IC8vIGZhbHNlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQu
bm90Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1
cm5zCi0gIGludmVyc2Ugb2YgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eQotKi8KLXJl
Z2lzdGVyQ29tcHV0ZWQoJ25vdCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4g
IWdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgY29udmVydHMgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0eQotICBpbnRv
IGEgYm9vbGVhbiB2YWx1ZS4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFzQmFuYW5hczogRW1iZXIuY29tcHV0ZWQuYm9vbCgn
bnVtQmFuYW5hcycpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0g
IGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1C
YW5hbmFzJywgMCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhh
bXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMSk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7
IC8vIHRydWUKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCBudWxsKTsKLSAgaGFtc3Rlci5n
ZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5i
b29sCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjb252
ZXJ0cwotICB0byBib29sZWFuIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkKLSovCi1y
ZWdpc3RlckNvbXB1dGVkKCdib29sJywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVy
biAhIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHBy
b3BlcnR5IHdoaWNoIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0aGUKLSAgZGVwZW5k
ZW50IHByb3BlcnR5IGFnYWluc3QgYSBnaXZlbiBSZWdFeHAsIHJldHVybmluZyBgdHJ1ZWAKLSAg
aWYgdGhleSB2YWx1ZXMgbWF0Y2hlcyB0aGUgUmVnRXhwIGFuZCBgZmFsc2VgIGlmIGl0IGRvZXMg
bm90LgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBVc2VyID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFzVmFsaWRFbWFpbDogRW1iZXIuY29tcHV0ZWQubWF0Y2go
J2VtYWlsJywgL14uK0AuK1wuLiskLykKLSAgfSk7Ci0gIHZhciB1c2VyID0gVXNlci5jcmVhdGUo
e2xvZ2dlZEluOiBmYWxzZX0pOwotICB1c2VyLmdldCgnaGFzVmFsaWRFbWFpbCcpOyAvLyBmYWxz
ZQotICB1c2VyLnNldCgnZW1haWwnLCAnJyk7Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7
IC8vIGZhbHNlCi0gIHVzZXIuc2V0KCdlbWFpbCcsICdlbWJlcl9oYW1zdGVyQGV4YW1wbGUuY29t
Jyk7Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAgQG1l
dGhvZCBjb21wdXRlZC5tYXRjaAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBl
bmRlbnRLZXkKLSAgQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cAotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBtYXRjaAotICB0aGUgb3JpZ2lu
YWwgdmFsdWUgZm9yIHByb3BlcnR5IGFnYWluc3QgYSBnaXZlbiBSZWdFeHAKLSovCi1yZWdpc3Rl
ckNvbXB1dGVkKCdtYXRjaCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgcmVnZXhwKSB7Ci0gIHZh
ciB2YWx1ZSA9IGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwotICByZXR1cm4gdHlwZW9mIHZhbHVl
ID09PSAnc3RyaW5nJyA/IHJlZ2V4cC50ZXN0KHZhbHVlKSA6IGZhbHNlOwotfSk7Ci0KLS8qKgot
ICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBk
ZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgotCi0gIEV4
YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4
dGVuZCh7Ci0gICAgbmFwVGltZTogRW1iZXIuY29tcHV0ZWQuZXF1YWwoJ3N0YXRlJywgJ3NsZWVw
eScpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIu
Z2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdzbGVlcHkn
KTsKLSAgaGFtc3Rlci5nZXQoJ25hcFRpbWUnKTsgLy8gdHJ1ZQotICBoYW1zdGVyLnNldCgnc3Rh
dGUnLCAnaHVuZ3J5Jyk7Ci0gIGhhbXN0ZXIuZ2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0gIGBg
YAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZXF1YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0
cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxPYmplY3R9IHZhbHVl
Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdo
aWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlz
IGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdlcXVhbCcs
IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKLSAgcmV0dXJuIGdldCh0aGlzLCBkZXBl
bmRlbnRLZXkpID09PSB2YWx1ZTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0
aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmllZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMg
Z3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2
YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc1Rv
b01hbnlCYW5hbmFzOiBFbWJlci5jb21wdXRlZC5ndCgnbnVtQmFuYW5hcycsIDEwKQotICB9KTsK
LSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnaGFzVG9v
TWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsK
LSAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIu
c2V0KCdudW1CYW5hbmFzJywgMTEpOwotICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMn
KTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLmd0Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcGFyYW0ge051bWJlcn0gdmFsdWUK
LSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hp
Y2ggcmV0dXJucyB0cnVlIGlmCi0gIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMg
Z3JlYXRlciB0aGVuIGdpdmVuIHZhbHVlLgotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2d0JywgZnVu
Y3Rpb24oZGVwZW5kZW50S2V5LCB2YWx1ZSkgewotICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVu
dEtleSkgPiB2YWx1ZTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJl
dHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnR5Ci0gIGlzIGdyZWF0
ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuCi0KLSAgRXhhbXBsZQotCi0g
IGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
ICBoYXNUb29NYW55QmFuYW5hczogRW1iZXIuY29tcHV0ZWQuZ3RlKCdudW1CYW5hbmFzJywgMTAp
Ci0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0
KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBmYWxzZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5h
cycsIDMpOwotICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAg
aGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAxMCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55
QmFuYW5hcycpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZ3RlCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcGFyYW0ge051bWJl
cn0gdmFsdWUKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJv
cGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCi0gIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJv
cGVydHkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGVuIGdpdmVuIHZhbHVlLgotKi8KLXJlZ2lzdGVy
Q29tcHV0ZWQoJ2d0ZScsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKLSAgcmV0dXJu
IGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID49IHZhbHVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1
dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg
cHJvcGVydHkKLSAgaXMgbGVzcyB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxl
Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewotICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmx0KCdudW1CYW5hbmFzJywg
MykKLSAgfSk7Ci0gIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5n
ZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5h
cycsIDMpOwotICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQotICBo
YW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDIpOwotICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFu
YW5hcycpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubHQKLSAgQGZvciBF
bWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJhbSB7TnVtYmVyfSB2
YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0
eSB3aGljaCByZXR1cm5zIHRydWUgaWYKLSAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0
eSBpcyBsZXNzIHRoZW4gZ2l2ZW4gdmFsdWUuCi0qLwotcmVnaXN0ZXJDb21wdXRlZCgnbHQnLCBm
dW5jdGlvbihkZXBlbmRlbnRLZXksIHZhbHVlKSB7Ci0gIHJldHVybiBnZXQodGhpcywgZGVwZW5k
ZW50S2V5KSA8IHZhbHVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQg
cmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgbGVz
cyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAg
YGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAg
IG5lZWRzTW9yZUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmx0ZSgnbnVtQmFuYW5hcycsIDMpCi0g
IH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdu
ZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRydWUKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCA1
KTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rl
ci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMn
KTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLmx0ZQotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtOdW1iZXJ9IHZhbHVl
Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdo
aWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlz
IGxlc3Mgb3IgZXF1YWwgdGhlbiBnaXZlbiB2YWx1ZS4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCds
dGUnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHZhbHVlKSB7Ci0gIHJldHVybiBnZXQodGhpcywg
ZGVwZW5kZW50S2V5KSA8PSB2YWx1ZTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0
eSB0aGF0IHBlcmZvcm1zIGEgbG9naWNhbCBgYW5kYCBvbiB0aGUKLSAgb3JpZ2luYWwgdmFsdWVz
IGZvciB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnRpZXMuCi0KLSAgRXhhbXBsZQotCi0g
IGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
ICByZWFkeUZvckNhbXA6IEVtYmVyLmNvbXB1dGVkLmFuZCgnaGFzVGVudCcsICdoYXNCYWNrcGFj
aycpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIu
Z2V0KCdyZWFkeUZvckNhbXAnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ2hhc1RlbnQnLCB0
cnVlKTsKLSAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyBmYWxzZQotICBoYW1zdGVy
LnNldCgnaGFzQmFja3BhY2snLCB0cnVlKTsKLSAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcp
OyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuYW5kCi0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0
ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcGVyZm9ybXMKLSAgYSBsb2dpY2Fs
IGBhbmRgIG9uIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHByb3Bl
cnRpZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdhbmQnLCBmdW5jdGlv
bihwcm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYg
KHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhcHJvcGVydGllc1trZXldKSB7Ci0g
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfSk7Ci0KLS8q
KgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zIGEgbG9naWNhbCBgb3JgIG9u
IHRoZQotICBvcmlnaW5hbCB2YWx1ZXMgZm9yIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVy
dGllcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoewotICAgIHJlYWR5Rm9yUmFpbjogRW1iZXIuY29tcHV0ZWQub3Io
J2hhc0phY2tldCcsICdoYXNVbWJyZWxsYScpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0
ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdyZWFkeUZvclJhaW4nKTsgLy8gZmFsc2UKLSAg
aGFtc3Rlci5zZXQoJ2hhc0phY2tldCcsIHRydWUpOwotICBoYW1zdGVyLmdldCgncmVhZHlGb3JS
YWluJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5vcgotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkqCi0gIEByZXR1cm4ge0VtYmVyLkNv
bXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zCi0gIGEgbG9n
aWNhbCBgb3JgIG9uIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHBy
b3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdvcicsIGZ1bmN0
aW9uKHByb3BlcnRpZXMpIHsKLSAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHsKLSAgICBp
ZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHByb3BlcnRpZXNba2V5XSkgewot
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0pOwotCi0v
KioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2
YWx1ZQotICBmcm9tIGEgbGlzdCBvZiBkZXBlbmRlbnQgcHJvcGVydGllcy4KLQotICBFeGFtcGxl
Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewotICAgIGhhc0Nsb3RoZXM6IEVtYmVyLmNvbXB1dGVkLmFueSgnaGF0JywgJ3NoaXJ0JykKLSAg
fSk7Ci0gIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5nZXQoJ2hh
c0Nsb3RoZXMnKTsgLy8gbnVsbAotICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnSGF3YWlpYW4gU2hp
cnQnKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0Nsb3RoZXMnKTsgLy8gJ0hhd2FpaWFuIFNoaXJ0Jwot
ICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLmFueQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkqCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9
IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMKLSAgdGhlIGZpcnN0IHRydXRoeSB2YWx1
ZSBvZiBnaXZlbiBsaXN0IG9mIHByb3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQ
cm9wZXJ0aWVzKCdhbnknLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFyIGtleSBp
biBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAm
JiBwcm9wZXJ0aWVzW2tleV0pIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2tleV07Ci0gICAg
fQotICB9Ci0gIHJldHVybiBudWxsOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5
IHRoYXQgcmV0dXJucyB0aGUgYXJyYXkgb2YgdmFsdWVzCi0gIGZvciB0aGUgcHJvdmlkZWQgZGVw
ZW5kZW50IHByb3BlcnRpZXMuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBjbG90aGVzOiBFbWJlci5jb21w
dXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQnKQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1z
dGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnY2xvdGhlcycpOyAvLyBbbnVsbCwgbnVsbF0K
LSAgaGFtc3Rlci5zZXQoJ2hhdCcsICdDYW1wIEhhdCcpOwotICBoYW1zdGVyLnNldCgnc2hpcnQn
LCAnQ2FtcCBTaGlydCcpOwotICBoYW1zdGVyLmdldCgnY2xvdGhlcycpOyAvLyBbJ0NhbXAgSGF0
JywgJ0NhbXAgU2hpcnQnXQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLmNvbGxlY3QKLSAg
QGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgotICBAcmV0dXJuIHtF
bWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBtYXBzCi0gIHZh
bHVlcyBvZiBhbGwgcGFzc2VkIHByb3BlcnRpZXMgaW4gdG8gYW4gYXJyYXkuCi0qLwotcmVnaXN0
ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdjb2xsZWN0JywgZnVuY3Rpb24ocHJvcGVydGllcykg
ewotICB2YXIgcmVzID0gW107Ci0gIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAg
aWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAgICAgaWYgKEVtYmVyLmlz
Tm9uZShwcm9wZXJ0aWVzW2tleV0pKSB7Ci0gICAgICAgIHJlcy5wdXNoKG51bGwpOwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1trZXldKTsKLSAgICAgIH0KLSAg
ICB9Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0pOwotCi0vKioKLSAgQ3JlYXRlcyBhIG5ldyBwcm9w
ZXJ0eSB0aGF0IGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIHByb3BlcnR5Ci0gIG9uIGFuIG9iamVj
dC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBiZWhhdmUgYXMKLSAgdGhv
dWdoIHRoZXkgd2VyZSBjYWxsZWQgb24gdGhlIG9yaWdpbmFsIHByb3BlcnR5LgotCi0gIGBgYGph
dmFzY3JpcHQKLSAgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFtZTogJ0Fs
ZXggTWF0Y2huZWVyJywKLSAgICBub21lbjogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ25hbWUnKQot
ICB9KTsKLQotICBhbGV4ID0gUGVyc29uLmNyZWF0ZSgpOwotICBhbGV4LmdldCgnbm9tZW4nKTsg
Ly8gJ0FsZXggTWF0Y2huZWVyJwotICBhbGV4LmdldCgnbmFtZScpOyAgLy8gJ0FsZXggTWF0Y2hu
ZWVyJwotCi0gIGFsZXguc2V0KCdub21lbicsICdAbWFjaHR5Jyk7Ci0gIGFsZXguZ2V0KCduYW1l
Jyk7ICAvLyAnQG1hY2h0eScKLSAgYGBgCi0gIEBtZXRob2QgY29tcHV0ZWQuYWxpYXMKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KLSAg
YWxpYXMgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KLSovCi1FbWJlci5jb21w
dXRlZC5hbGlhcyA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIuY29t
cHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3Vt
ZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICBzZXQodGhpcywgZGVwZW5kZW50S2V5LCB2YWx1ZSk7
Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBnZXQodGhp
cywgZGVwZW5kZW50S2V5KTsKLSAgICB9Ci0gIH0pOwotfTsKLQotLyoqCi0gIFdoZXJlIGBjb21w
dXRlZC5hbGlhc2AgYWxpYXNlcyBgZ2V0YCBhbmQgYHNldGAsIGFuZCBhbGxvd3MgZm9yIGJpZGly
ZWN0aW9uYWwKLSAgZGF0YSBmbG93LCBgY29tcHV0ZWQub25lV2F5YCBvbmx5IHByb3ZpZGVzIGFu
IGFsaWFzZWQgYGdldGAuIFRoZSBgc2V0YCB3aWxsCi0gIG5vdCBtdXRhdGUgdGhlIHVwc3RyZWFt
IHByb3BlcnR5LCByYXRoZXIgY2F1c2VzIHRoZSBjdXJyZW50IHByb3BlcnR5IHRvCi0gIGJlY29t
ZSB0aGUgdmFsdWUgc2V0LiBUaGlzIGNhdXNlcyB0aGUgZG93bnN0cmVhbSBwcm9wZXJ0eSB0byBw
ZXJtZW50YW50bHkKLSAgZGl2ZXJnZSBmcm9tIHRoZSB1cHN0cmVhbSBwcm9wZXJ0eS4KLQotICBF
eGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7
Ci0gICAgZmlyc3ROYW1lOiBudWxsLAotICAgIGxhc3ROYW1lOiBudWxsLAotICAgIG5pY2tOYW1l
OiBFbWJlci5jb21wdXRlZC5vbmVXYXkoJ2ZpcnN0TmFtZScpCi0gIH0pOwotCi0gIHVzZXIgPSBV
c2VyLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1lOiAnVGVkZHknLAotICAgIGxhc3ROYW1lOiAgJ1pl
ZW5ueScKLSAgfSk7Ci0KLSAgdXNlci5nZXQoJ25pY2tOYW1lJyk7Ci0gICMgJ1RlZGR5JwotCi0g
IHVzZXIuc2V0KCduaWNrTmFtZScsICdUZWRkeUJlYXInKTsKLSAgIyAnVGVkZHlCZWFyJwotCi0g
IHVzZXIuZ2V0KCdmaXJzdE5hbWUnKTsKLSAgIyAnVGVkZHknCi0gIGBgYAotCi0gIEBtZXRob2Qg
Y29tcHV0ZWQub25lV2F5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0
eSB3aGljaCBjcmVhdGVzIGEKLSAgb25lIHdheSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3Jp
Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5LgotKi8KLUVtYmVyLmNvbXB1dGVkLm9uZVdheSA9IGZ1
bmN0aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50
S2V5LCBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7Ci0g
IH0pOwotfTsKLQotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGFjdHMgbGlrZSBh
IHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVyLAotICBidXQgcmV0dXJucyB0aGUgdmFsdWUgYXQg
dGhlIHByb3ZpZGVkIGBkZWZhdWx0UGF0aGAgaWYgdGhlCi0gIHByb3BlcnR5IGl0c2VsZiBoYXMg
bm90IGJlZW4gc2V0IHRvIGEgdmFsdWUKLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAot
ICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHdpc2hMaXN0OiBFbWJl
ci5jb21wdXRlZC5kZWZhdWx0VG8oJ2Zhdm9yaXRlRm9vZCcpCi0gIH0pOwotICB2YXIgaGFtc3Rl
ciA9IEhhbXN0ZXIuY3JlYXRlKHtmYXZvcml0ZUZvb2Q6ICdCYW5hbmEnfSk7Ci0gIGhhbXN0ZXIu
Z2V0KCd3aXNoTGlzdCcpOyAvLyAnQmFuYW5hJwotICBoYW1zdGVyLnNldCgnd2lzaExpc3QnLCAn
TW9yZSBVbml0IFRlc3RzJyk7Ci0gIGhhbXN0ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnTW9yZSBV
bml0IFRlc3RzJwotICBoYW1zdGVyLmdldCgnZmF2b3JpdGVGb29kJyk7IC8vICdCYW5hbmEnCi0g
IGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZGVmYXVsdFRvCi0gIEBmb3IgRW1iZXIKLSAgQHBh
cmFtIHtTdHJpbmd9IGRlZmF1bHRQYXRoCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVy
dHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGFjdHMgbGlrZQotICBhIHN0YW5kYXJkIGdldHRl
ciBhbmQgc2V0dGVyLCBidXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGZyb20gYGRlZmF1bHRQYXRo
YC4KLSovCi1FbWJlci5jb21wdXRlZC5kZWZhdWx0VG8gPSBmdW5jdGlvbihkZWZhdWx0UGF0aCkg
ewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCBuZXdWYWx1ZSwgY2FjaGVk
VmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewotICAgICAgcmV0dXJu
IGNhY2hlZFZhbHVlICE9IG51bGwgPyBjYWNoZWRWYWx1ZSA6IGdldCh0aGlzLCBkZWZhdWx0UGF0
aCk7Ci0gICAgfQotICAgIHJldHVybiBuZXdWYWx1ZSAhPSBudWxsID8gbmV3VmFsdWUgOiBnZXQo
dGhpcywgZGVmYXVsdFBhdGgpOwotICB9KTsKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlv
bigpIHsKLS8vIEVtYmVyLnRyeUZpbmFsbHkKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8K
LQotdmFyIEFGVEVSX09CU0VSVkVSUyA9ICc6Y2hhbmdlJywKLSAgICBCRUZPUkVfT0JTRVJWRVJT
ID0gJzpiZWZvcmUnOwotCi1mdW5jdGlvbiBjaGFuZ2VFdmVudChrZXlOYW1lKSB7Ci0gIHJldHVy
biBrZXlOYW1lK0FGVEVSX09CU0VSVkVSUzsKLX0KLQotZnVuY3Rpb24gYmVmb3JlRXZlbnQoa2V5
TmFtZSkgewotICByZXR1cm4ga2V5TmFtZStCRUZPUkVfT0JTRVJWRVJTOwotfQotCi0vKioKLSAg
QG1ldGhvZCBhZGRPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRo
Ci0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1
bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5hZGRPYnNlcnZlciA9IGZ1bmN0aW9u
KG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwg
Y2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0gIEVtYmVyLndhdGNoKG9iaiwg
X3BhdGgpOwotCi0gIHJldHVybiB0aGlzOwotfTsKLQotRW1iZXIub2JzZXJ2ZXJzRm9yID0gZnVu
Y3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVybiBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBjaGFu
Z2VFdmVudChwYXRoKSk7Ci19OwotCi0vKioKLSAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgotICBA
cGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0
aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0K
LSovCi1FbWJlci5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwg
bWV0aG9kKSB7Ci0gIEVtYmVyLnVud2F0Y2gob2JqLCBfcGF0aCk7Ci0gIEVtYmVyLnJlbW92ZUxp
c3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgcmV0
dXJuIHRoaXM7Ci19OwotCi0vKioKLSAgQG1ldGhvZCBhZGRCZWZvcmVPYnNlcnZlcgotICBAcGFy
YW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9u
fSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSov
Ci1FbWJlci5hZGRCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwg
bWV0aG9kKSB7Ci0gIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQoX3BhdGgpLCB0
YXJnZXQsIG1ldGhvZCk7Ci0gIEVtYmVyLndhdGNoKG9iaiwgX3BhdGgpOwotCi0gIHJldHVybiB0
aGlzOwotfTsKLQotLy8gU3VzcGVuZCBvYnNlcnZlciBkdXJpbmcgY2FsbGJhY2suCi0vLwotLy8g
VGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB0YXJnZXQgb2YgdGhlIG9ic2VydmVyCi0v
LyB3aGlsZSBpdCBpcyBzZXR0aW5nIHRoZSBvYnNlcnZlZCBwYXRoLgotRW1iZXIuX3N1c3BlbmRC
ZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxi
YWNrKSB7Ci0gIHJldHVybiBFbWJlci5fc3VzcGVuZExpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQo
cGF0aCksIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7Ci19OwotCi1FbWJlci5fc3VzcGVuZE9i
c2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsK
LSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVuZXIob2JqLCBjaGFuZ2VFdmVudChwYXRoKSwg
dGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsKLX07Ci0KLXZhciBtYXAgPSBFbWJlci5BcnJheVBv
bHlmaWxscy5tYXA7Ci0KLUVtYmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXJzID0gZnVuY3Rpb24o
b2JqLCBwYXRocywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7Ci0gIHZhciBldmVudHMgPSBt
YXAuY2FsbChwYXRocywgYmVmb3JlRXZlbnQpOwotICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0
ZW5lcnMob2JqLCBldmVudHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7Ci19OwotCi1FbWJl
ci5fc3VzcGVuZE9ic2VydmVycyA9IGZ1bmN0aW9uKG9iaiwgcGF0aHMsIHRhcmdldCwgbWV0aG9k
LCBjYWxsYmFjaykgewotICB2YXIgZXZlbnRzID0gbWFwLmNhbGwocGF0aHMsIGNoYW5nZUV2ZW50
KTsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0YXJnZXQs
IG1ldGhvZCwgY2FsbGJhY2spOwotfTsKLQotRW1iZXIuYmVmb3JlT2JzZXJ2ZXJzRm9yID0gZnVu
Y3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVybiBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBiZWZv
cmVFdmVudChwYXRoKSk7Ci19OwotCi0vKioKLSAgQG1ldGhvZCByZW1vdmVCZWZvcmVPYnNlcnZl
cgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0
fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21l
dGhvZF0KLSovCi1FbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3Bh
dGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLnVud2F0Y2gob2JqLCBfcGF0aCk7Ci0gIEVt
YmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhv
ZCk7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
ZGVmaW5lKCJiYWNrYnVybmVyL3F1ZXVlIiwKLSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9f
ZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIGZ1bmN0aW9uIFF1ZXVlKGRhcSwg
bmFtZSwgb3B0aW9ucykgewotICAgICAgdGhpcy5kYXEgPSBkYXE7Ci0gICAgICB0aGlzLm5hbWUg
PSBuYW1lOwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgIHRoaXMuX3F1ZXVl
ID0gW107Ci0gICAgfQotCi0gICAgUXVldWUucHJvdG90eXBlID0gewotICAgICAgZGFxOiBudWxs
LAotICAgICAgbmFtZTogbnVsbCwKLSAgICAgIG9wdGlvbnM6IG51bGwsCi0gICAgICBfcXVldWU6
IG51bGwsCi0KLSAgICAgIHB1c2g6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFj
aykgewotICAgICAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTsKLSAgICAgICAgcXVldWUucHVz
aCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOwotICAgICAgICByZXR1cm4ge3F1ZXVlOiB0
aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9kOiBtZXRob2R9OwotICAgICAgfSwKLQotICAgICAg
cHVzaFVuaXF1ZTogZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7Ci0gICAg
ICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0aG9k
LCBpLCBsOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBp
ICs9IDQpIHsKLSAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gcXVldWVbaV07Ci0gICAgICAgICAg
Y3VycmVudE1ldGhvZCA9IHF1ZXVlW2krMV07Ci0KLSAgICAgICAgICBpZiAoY3VycmVudFRhcmdl
dCA9PT0gdGFyZ2V0ICYmIGN1cnJlbnRNZXRob2QgPT09IG1ldGhvZCkgewotICAgICAgICAgICAg
cXVldWVbaSsyXSA9IGFyZ3M7IC8vIHJlcGxhY2UgYXJncwotICAgICAgICAgICAgcXVldWVbaSsz
XSA9IHN0YWNrOyAvLyByZXBsYWNlIHN0YWNrCi0gICAgICAgICAgICByZXR1cm4ge3F1ZXVlOiB0
aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9kOiBtZXRob2R9OyAvLyBUT0RPOiB0ZXN0IHRoaXMg
Y29kZSBwYXRoCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5fcXVldWUu
cHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOwotICAgICAgICByZXR1cm4ge3F1ZXVl
OiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9kOiBtZXRob2R9OwotICAgICAgfSwKLQotICAg
ICAgLy8gVE9ETzogcmVtb3ZlIG1lLCBvbmx5IGJlaW5nIHVzZWQgZm9yIEVtYmVyLnJ1bi5zeW5j
Ci0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1
ZXVlLAotICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKLSAgICAgICAgICAgIGJl
Zm9yZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iZWZvcmUsCi0gICAgICAgICAgICBhZnRlciA9IG9w
dGlvbnMgJiYgb3B0aW9ucy5hZnRlciwKLSAgICAgICAgICAgIHRhcmdldCwgbWV0aG9kLCBhcmdz
LCBzdGFjaywgaSwgbCA9IHF1ZXVlLmxlbmd0aDsKLQotICAgICAgICBpZiAobCAmJiBiZWZvcmUp
IHsgYmVmb3JlKCk7IH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gNCkgewotICAg
ICAgICAgIHRhcmdldCA9IHF1ZXVlW2ldOwotICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlW2krMV07
Ci0gICAgICAgICAgYXJncyAgID0gcXVldWVbaSsyXTsKLSAgICAgICAgICBzdGFjayAgPSBxdWV1
ZVtpKzNdOyAvLyBEZWJ1Z2dpbmcgYXNzaXN0YW5jZQotCi0gICAgICAgICAgLy8gVE9ETzogZXJy
b3IgaGFuZGxpbmcKLSAgICAgICAgICBpZiAoYXJncyAmJiBhcmdzLmxlbmd0aCA+IDApIHsKLSAg
ICAgICAgICAgIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwotICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXQpOwotICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgICBpZiAobCAmJiBhZnRlcikgeyBhZnRlcigpOyB9Ci0KLSAgICAgICAgLy8gY2hl
Y2sgaWYgbmV3IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICBpZiAocXVldWUubGVuZ3Ro
ID4gbCkgewotICAgICAgICAgIHRoaXMuX3F1ZXVlID0gcXVldWUuc2xpY2UobCk7Ci0gICAgICAg
ICAgdGhpcy5mbHVzaCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMuX3F1ZXVl
Lmxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIGNhbmNlbDogZnVuY3Rp
b24oYWN0aW9uVG9DYW5jZWwpIHsKLSAgICAgICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWUsIGN1
cnJlbnRUYXJnZXQsIGN1cnJlbnRNZXRob2QsIGksIGw7Ci0KLSAgICAgICAgZm9yIChpID0gMCwg
bCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJn
ZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQot
ICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYg
Y3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9DYW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICBx
dWV1ZS5zcGxpY2UoaSwgNCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBub3QgZm91bmQgaW4gY3VycmVudCBxdWV1ZQot
ICAgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUgcXVldWUgdGhhdCBpcyBiZWluZyBmbHVzaGVkCi0g
ICAgICAgIHF1ZXVlID0gdGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQ7Ci0gICAgICAgIGlmICghcXVl
dWUpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMCwg
bCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJn
ZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQot
ICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYg
Y3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9DYW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICAv
LyBkb24ndCBtZXNzIHdpdGggYXJyYXkgZHVyaW5nIGZsdXNoCi0gICAgICAgICAgICAvLyBqdXN0
IG51bGxpZnkgdGhlIG1ldGhvZAotICAgICAgICAgICAgcXVldWVbaSsxXSA9IG51bGw7Ci0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAg
ICB9OwotCi0KLSAgICBfX2V4cG9ydHNfXy5RdWV1ZSA9IFF1ZXVlOwotICB9KTsKLQotZGVmaW5l
KCJiYWNrYnVybmVyL2RlZmVycmVkX2FjdGlvbl9xdWV1ZXMiLAotICBbImJhY2tidXJuZXIvcXVl
dWUiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18p
IHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFF1ZXVlID0gX19kZXBlbmRlbmN5MV9fLlF1
ZXVlOwotCi0gICAgZnVuY3Rpb24gRGVmZXJyZWRBY3Rpb25RdWV1ZXMocXVldWVOYW1lcywgb3B0
aW9ucykgewotICAgICAgdmFyIHF1ZXVlcyA9IHRoaXMucXVldWVzID0ge307Ci0gICAgICB0aGlz
LnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzID0gcXVldWVOYW1lcyB8fCBbXTsKLQotICAgICAgdmFy
IHF1ZXVlTmFtZTsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcXVldWVOYW1lcy5sZW5ndGg7
IGkgPCBsOyBpKyspIHsKLSAgICAgICAgcXVldWVOYW1lID0gcXVldWVOYW1lc1tpXTsKLSAgICAg
ICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcgUXVldWUodGhpcywgcXVldWVOYW1lLCBvcHRpb25z
W3F1ZXVlTmFtZV0pOwotICAgICAgfQotICAgIH0KLQotICAgIERlZmVycmVkQWN0aW9uUXVldWVz
LnByb3RvdHlwZSA9IHsKLSAgICAgIHF1ZXVlTmFtZXM6IG51bGwsCi0gICAgICBxdWV1ZXM6IG51
bGwsCi0KLSAgICAgIHNjaGVkdWxlOiBmdW5jdGlvbihxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9k
LCBhcmdzLCBvbmNlRmxhZywgc3RhY2spIHsKLSAgICAgICAgdmFyIHF1ZXVlcyA9IHRoaXMucXVl
dWVzLAotICAgICAgICAgICAgcXVldWUgPSBxdWV1ZXNbcXVldWVOYW1lXTsKLQotICAgICAgICBp
ZiAoIXF1ZXVlKSB7IHRocm93IG5ldyBFcnJvcigiWW91IGF0dGVtcHRlZCB0byBzY2hlZHVsZSBh
biBhY3Rpb24gaW4gYSBxdWV1ZSAoIiArIHF1ZXVlTmFtZSArICIpIHRoYXQgZG9lc24ndCBleGlz
dCIpOyB9Ci0KLSAgICAgICAgaWYgKG9uY2VGbGFnKSB7Ci0gICAgICAgICAgcmV0dXJuIHF1ZXVl
LnB1c2hVbmlxdWUodGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKTsKLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICByZXR1cm4gcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3Rh
Y2spOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHZhciBxdWV1ZXMgPSB0aGlzLnF1ZXVlcywKLSAgICAgICAgICAgIHF1ZXVlTmFtZXMg
PSB0aGlzLnF1ZXVlTmFtZXMsCi0gICAgICAgICAgICBxdWV1ZU5hbWUsIHF1ZXVlLCBxdWV1ZUl0
ZW1zLCBwcmlvclF1ZXVlTmFtZUluZGV4LAotICAgICAgICAgICAgcXVldWVOYW1lSW5kZXggPSAw
LCBudW1iZXJPZlF1ZXVlcyA9IHF1ZXVlTmFtZXMubGVuZ3RoOwotCi0gICAgICAgIG91dGVybG9v
cDoKLSAgICAgICAgd2hpbGUgKHF1ZXVlTmFtZUluZGV4IDwgbnVtYmVyT2ZRdWV1ZXMpIHsKLSAg
ICAgICAgICBxdWV1ZU5hbWUgPSBxdWV1ZU5hbWVzW3F1ZXVlTmFtZUluZGV4XTsKLSAgICAgICAg
ICBxdWV1ZSA9IHF1ZXVlc1txdWV1ZU5hbWVdOwotICAgICAgICAgIHF1ZXVlSXRlbXMgPSBxdWV1
ZS5fcXVldWVCZWluZ0ZsdXNoZWQgPSBxdWV1ZS5fcXVldWUuc2xpY2UoKTsKLSAgICAgICAgICBx
dWV1ZS5fcXVldWUgPSBbXTsKLQotICAgICAgICAgIHZhciBvcHRpb25zID0gcXVldWUub3B0aW9u
cywKLSAgICAgICAgICAgICAgYmVmb3JlID0gb3B0aW9ucyAmJiBvcHRpb25zLmJlZm9yZSwKLSAg
ICAgICAgICAgICAgYWZ0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYWZ0ZXIsCi0gICAgICAgICAg
ICAgIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaywKLSAgICAgICAgICAgICAgcXVldWVJbmRl
eCA9IDAsIG51bWJlck9mUXVldWVJdGVtcyA9IHF1ZXVlSXRlbXMubGVuZ3RoOwotCi0gICAgICAg
ICAgaWYgKG51bWJlck9mUXVldWVJdGVtcyAmJiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KLSAgICAg
ICAgICB3aGlsZSAocXVldWVJbmRleCA8IG51bWJlck9mUXVldWVJdGVtcykgewotICAgICAgICAg
ICAgdGFyZ2V0ID0gcXVldWVJdGVtc1txdWV1ZUluZGV4XTsKLSAgICAgICAgICAgIG1ldGhvZCA9
IHF1ZXVlSXRlbXNbcXVldWVJbmRleCsxXTsKLSAgICAgICAgICAgIGFyZ3MgICA9IHF1ZXVlSXRl
bXNbcXVldWVJbmRleCsyXTsKLSAgICAgICAgICAgIHN0YWNrICA9IHF1ZXVlSXRlbXNbcXVldWVJ
bmRleCszXTsgLy8gRGVidWdnaW5nIGFzc2lzdGFuY2UKLQotICAgICAgICAgICAgaWYgKHR5cGVv
ZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7IG1ldGhvZCA9IHRhcmdldFttZXRob2RdOyB9Ci0KLSAg
ICAgICAgICAgIC8vIG1ldGhvZCBjb3VsZCBoYXZlIGJlZW4gbnVsbGlmaWVkIC8gY2FuY2VsZWQg
ZHVyaW5nIGZsdXNoCi0gICAgICAgICAgICBpZiAobWV0aG9kKSB7Ci0gICAgICAgICAgICAgIC8v
IFRPRE86IGVycm9yIGhhbmRsaW5nCi0gICAgICAgICAgICAgIGlmIChhcmdzICYmIGFyZ3MubGVu
Z3RoID4gMCkgewotICAgICAgICAgICAgICAgIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwot
ICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRhcmdl
dCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcXVldWVJ
bmRleCArPSA0OwotICAgICAgICAgIH0KLSAgICAgICAgICBxdWV1ZS5fcXVldWVCZWluZ0ZsdXNo
ZWQgPSBudWxsOwotICAgICAgICAgIGlmIChudW1iZXJPZlF1ZXVlSXRlbXMgJiYgYWZ0ZXIpIHsg
YWZ0ZXIoKTsgfQotCi0gICAgICAgICAgaWYgKChwcmlvclF1ZXVlTmFtZUluZGV4ID0gaW5kZXhP
ZlByaW9yUXVldWVXaXRoQWN0aW9ucyh0aGlzLCBxdWV1ZU5hbWVJbmRleCkpICE9PSAtMSkgewot
ICAgICAgICAgICAgcXVldWVOYW1lSW5kZXggPSBwcmlvclF1ZXVlTmFtZUluZGV4OwotICAgICAg
ICAgICAgY29udGludWUgb3V0ZXJsb29wOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHF1ZXVl
TmFtZUluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24g
aW5kZXhPZlByaW9yUXVldWVXaXRoQWN0aW9ucyhkYXEsIGN1cnJlbnRRdWV1ZUluZGV4KSB7Ci0g
ICAgICB2YXIgcXVldWVOYW1lLCBxdWV1ZTsKLQotICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBj
dXJyZW50UXVldWVJbmRleDsgaSA8PSBsOyBpKyspIHsKLSAgICAgICAgcXVldWVOYW1lID0gZGFx
LnF1ZXVlTmFtZXNbaV07Ci0gICAgICAgIHF1ZXVlID0gZGFxLnF1ZXVlc1txdWV1ZU5hbWVdOwot
ICAgICAgICBpZiAocXVldWUuX3F1ZXVlLmxlbmd0aCkgeyByZXR1cm4gaTsgfQotICAgICAgfQot
Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0KLSAgICBfX2V4cG9ydHNfXy5EZWZlcnJlZEFj
dGlvblF1ZXVlcyA9IERlZmVycmVkQWN0aW9uUXVldWVzOwotICB9KTsKLQotZGVmaW5lKCJiYWNr
YnVybmVyIiwKLSAgWyJiYWNrYnVybmVyL2RlZmVycmVkX2FjdGlvbl9xdWV1ZXMiLCJleHBvcnRz
Il0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNl
IHN0cmljdCI7Ci0gICAgdmFyIERlZmVycmVkQWN0aW9uUXVldWVzID0gX19kZXBlbmRlbmN5MV9f
LkRlZmVycmVkQWN0aW9uUXVldWVzOwotCi0gICAgdmFyIHNsaWNlID0gW10uc2xpY2UsCi0gICAg
ICAgIHBvcCA9IFtdLnBvcCwKLSAgICAgICAgdGhyb3R0bGVycyA9IFtdLAotICAgICAgICBkZWJv
dW5jZWVzID0gW10sCi0gICAgICAgIHRpbWVycyA9IFtdLAotICAgICAgICBhdXRvcnVuLCBsYXRl
clRpbWVyLCBsYXRlclRpbWVyRXhwaXJlc0F0LAotICAgICAgICBnbG9iYWwgPSB0aGlzLAotICAg
ICAgICBOVU1CRVIgPSAvXGQrLzsKLQotICAgIGZ1bmN0aW9uIGlzQ29lcmNhYmxlTnVtYmVyKG51
bWJlcikgewotICAgICAgcmV0dXJuIHR5cGVvZiBudW1iZXIgPT09ICdudW1iZXInIHx8IE5VTUJF
Ui50ZXN0KG51bWJlcik7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gQmFja2J1cm5lcihxdWV1ZU5h
bWVzLCBvcHRpb25zKSB7Ci0gICAgICB0aGlzLnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzOwotICAg
ICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgICAgIGlmICghdGhpcy5vcHRpb25z
LmRlZmF1bHRRdWV1ZSkgewotICAgICAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlID0gcXVl
dWVOYW1lc1swXTsKLSAgICAgIH0KLSAgICAgIHRoaXMuaW5zdGFuY2VTdGFjayA9IFtdOwotICAg
IH0KLQotICAgIEJhY2tidXJuZXIucHJvdG90eXBlID0gewotICAgICAgcXVldWVOYW1lczogbnVs
bCwKLSAgICAgIG9wdGlvbnM6IG51bGwsCi0gICAgICBjdXJyZW50SW5zdGFuY2U6IG51bGwsCi0g
ICAgICBpbnN0YW5jZVN0YWNrOiBudWxsLAotCi0gICAgICBiZWdpbjogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHZhciBvbkJlZ2luID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5vbkJlZ2lu
LAotICAgICAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IHRoaXMuY3VycmVudEluc3RhbmNlOwot
Ci0gICAgICAgIGlmIChwcmV2aW91c0luc3RhbmNlKSB7Ci0gICAgICAgICAgdGhpcy5pbnN0YW5j
ZVN0YWNrLnB1c2gocHJldmlvdXNJbnN0YW5jZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlz
LmN1cnJlbnRJbnN0YW5jZSA9IG5ldyBEZWZlcnJlZEFjdGlvblF1ZXVlcyh0aGlzLnF1ZXVlTmFt
ZXMsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAgIGlmIChvbkJlZ2luKSB7Ci0gICAgICAgICAgb25C
ZWdpbih0aGlzLmN1cnJlbnRJbnN0YW5jZSwgcHJldmlvdXNJbnN0YW5jZSk7Ci0gICAgICAgIH0K
LSAgICAgIH0sCi0KLSAgICAgIGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBvbkVuZCA9
IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub25FbmQsCi0gICAgICAgICAgICBjdXJyZW50
SW5zdGFuY2UgPSB0aGlzLmN1cnJlbnRJbnN0YW5jZSwKLSAgICAgICAgICAgIG5leHRJbnN0YW5j
ZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1
c2goKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5j
ZSA9IG51bGw7Ci0KLSAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCkgewot
ICAgICAgICAgICAgbmV4dEluc3RhbmNlID0gdGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpOwotICAg
ICAgICAgICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7Ci0gICAgICAgICAg
fQotCi0gICAgICAgICAgaWYgKG9uRW5kKSB7Ci0gICAgICAgICAgICBvbkVuZChjdXJyZW50SW5z
dGFuY2UsIG5leHRJbnN0YW5jZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9LAot
Ci0gICAgICBydW46IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qLCBhcmdzICovKSB7Ci0gICAg
ICAgIHZhciByZXQ7Ci0gICAgICAgIHRoaXMuYmVnaW4oKTsKLQotICAgICAgICBpZiAoIW1ldGhv
ZCkgewotICAgICAgICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICAgICAgICB0YXJnZXQgPSBudWxs
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7
Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBQcmV2ZW50IFNhZmFyaSBkb3VibGUtZmluYWxseS4KLSAgICAgICAgdmFyIGZpbmFsbHlB
bHJlYWR5Q2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKGFyZ3Vt
ZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICByZXQgPSBtZXRob2QuYXBwbHkodGFyZ2V0
LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICByZXQgPSBtZXRob2QuY2FsbCh0YXJnZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBm
aW5hbGx5IHsKLSAgICAgICAgICBpZiAoIWZpbmFsbHlBbHJlYWR5Q2FsbGVkKSB7Ci0gICAgICAg
ICAgICBmaW5hbGx5QWxyZWFkeUNhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmVuZCgp
OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfSwK
LQotICAgICAgZGVmZXI6IGZ1bmN0aW9uKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QgLyogLCBh
cmdzICovKSB7Ci0gICAgICAgIGlmICghbWV0aG9kKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFy
Z2V0OwotICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAo
dHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICBtZXRob2QgPSB0YXJnZXRb
bWV0aG9kXTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBu
ZXcgRXJyb3IoKSA6IHVuZGVmaW5lZCwKLSAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMubGVu
Z3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKSA6IHVuZGVmaW5lZDsKLSAgICAgICAg
aWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkgeyBjcmVhdGVBdXRvcnVuKHRoaXMpOyB9Ci0gICAg
ICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbnN0YW5jZS5zY2hlZHVsZShxdWV1ZU5hbWUsIHRhcmdl
dCwgbWV0aG9kLCBhcmdzLCBmYWxzZSwgc3RhY2spOwotICAgICAgfSwKLQotICAgICAgZGVmZXJP
bmNlOiBmdW5jdGlvbihxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kIC8qICwgYXJncyAqLykgewot
ICAgICAgICBpZiAoIW1ldGhvZCkgewotICAgICAgICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICAg
ICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVvZiBtZXRo
b2QgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07Ci0g
ICAgICAgIH0KLQotICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLkRFQlVHID8gbmV3IEVycm9yKCkg
OiB1bmRlZmluZWQsCi0gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBz
bGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiB1bmRlZmluZWQ7Ci0gICAgICAgIGlmICghdGhpcy5j
dXJyZW50SW5zdGFuY2UpIHsgY3JlYXRlQXV0b3J1bih0aGlzKTsgfQotICAgICAgICByZXR1cm4g
dGhpcy5jdXJyZW50SW5zdGFuY2Uuc2NoZWR1bGUocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCwg
YXJncywgdHJ1ZSwgc3RhY2spOwotICAgICAgfSwKLQotICAgICAgc2V0VGltZW91dDogZnVuY3Rp
b24oKSB7Ci0gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAg
ICB2YXIgbGVuZ3RoID0gYXJncy5sZW5ndGg7Ci0gICAgICAgIHZhciBtZXRob2QsIHdhaXQsIHRh
cmdldDsKLSAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwotICAgICAgICB2YXIgbWV0aG9kT3JUYXJn
ZXQsIG1ldGhvZE9yV2FpdCwgbWV0aG9kT3JBcmdzOwotCi0gICAgICAgIGlmIChsZW5ndGggPT09
IDApIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAx
KSB7Ci0gICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOwotICAgICAgICAgIHdhaXQgPSAw
OwotICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMikgewotICAgICAgICAgIG1ldGhvZE9y
VGFyZ2V0ID0gYXJnc1swXTsKLSAgICAgICAgICBtZXRob2RPcldhaXQgPSBhcmdzWzFdOwotCi0g
ICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2RPcldhaXQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9m
ICBtZXRob2RPclRhcmdldFttZXRob2RPcldhaXRdID09PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAg
ICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgICBtZXRob2QgPSBhcmdzLnNo
aWZ0KCk7Ci0gICAgICAgICAgICB3YWl0ID0gMDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29l
cmNhYmxlTnVtYmVyKG1ldGhvZE9yV2FpdCkpIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Mu
c2hpZnQoKTsKLSAgICAgICAgICAgIHdhaXQgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIHdh
aXQgPSAgMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFyIGxh
c3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07Ci0KLSAgICAgICAgICBpZiAoaXNDb2VyY2FibGVO
dW1iZXIobGFzdCkpIHsKLSAgICAgICAgICAgIHdhaXQgPSBhcmdzLnBvcCgpOwotICAgICAgICAg
IH0KLQotICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJnc1swXTsKLSAgICAgICAgICBtZXRo
b2RPckFyZ3MgPSBhcmdzWzFdOwotCi0gICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2RPckFyZ3Mg
PT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBtZXRob2RPckFyZ3MgPT09ICdzdHJpbmcnICYmCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhv
ZE9yVGFyZ2V0ICE9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1ldGhvZE9yQXJncyBpbiBtZXRob2RPclRhcmdldCkpIHsKLSAg
ICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFy
Z3Muc2hpZnQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0aG9kID0gYXJn
cy5zaGlmdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhciBleGVjdXRl
QXQgPSAoK25ldyBEYXRlKCkpICsgcGFyc2VJbnQod2FpdCwgMTApOwotCi0gICAgICAgIGlmICh0
eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykgewotICAgICAgICAgIG1ldGhvZCA9IHRhcmdldFtt
ZXRob2RdOwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gZm4oKSB7Ci0gICAgICAgICAg
bWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5k
IHBvc2l0aW9uIHRvIGluc2VydCAtIFRPRE86IGJpbmFyeSBzZWFyY2gKLSAgICAgICAgdmFyIGks
IGw7Ci0gICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aW1lcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAy
KSB7Ci0gICAgICAgICAgaWYgKGV4ZWN1dGVBdCA8IHRpbWVyc1tpXSkgeyBicmVhazsgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgdGltZXJzLnNwbGljZShpLCAwLCBleGVjdXRlQXQsIGZuKTsKLQot
ICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNlbGYsIGV4ZWN1dGVBdCwgd2FpdCk7Ci0KLSAgICAg
ICAgcmV0dXJuIGZuOwotICAgICAgfSwKLQotICAgICAgdGhyb3R0bGU6IGZ1bmN0aW9uKHRhcmdl
dCwgbWV0aG9kIC8qICwgYXJncywgd2FpdCAqLykgewotICAgICAgICB2YXIgc2VsZiA9IHRoaXMs
Ci0gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAotICAgICAgICAgICAgd2FpdCA9IHBhcnNl
SW50KHBvcC5jYWxsKGFyZ3MpLCAxMCksCi0gICAgICAgICAgICB0aHJvdHRsZXIsCi0gICAgICAg
ICAgICBpbmRleCwKLSAgICAgICAgICAgIHRpbWVyOwotCi0gICAgICAgIGluZGV4ID0gZmluZFRo
cm90dGxlcih0YXJnZXQsIG1ldGhvZCk7Ci0gICAgICAgIGlmIChpbmRleCA+IC0xKSB7IHJldHVy
biB0aHJvdHRsZXJzW2luZGV4XTsgfSAvLyB0aHJvdHRsZWQKLQotICAgICAgICB0aW1lciA9IGds
b2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICAgIHNlbGYucnVuLmFwcGx5KHNl
bGYsIGFyZ3MpOwotCi0gICAgICAgICAgdmFyIGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQs
IG1ldGhvZCk7Ci0gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsgdGhyb3R0bGVycy5zcGxpY2Uo
aW5kZXgsIDEpOyB9Ci0gICAgICAgIH0sIHdhaXQpOwotCi0gICAgICAgIHRocm90dGxlciA9IFt0
YXJnZXQsIG1ldGhvZCwgdGltZXJdOwotCi0gICAgICAgIHRocm90dGxlcnMucHVzaCh0aHJvdHRs
ZXIpOwotCi0gICAgICAgIHJldHVybiB0aHJvdHRsZXI7Ci0gICAgICB9LAotCi0gICAgICBkZWJv
dW5jZTogZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QgLyogLCBhcmdzLCB3YWl0LCBbaW1tZWRpYXRl
XSAqLykgewotICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCi0gICAgICAgICAgICBhcmdzID0gYXJn
dW1lbnRzLAotICAgICAgICAgICAgaW1tZWRpYXRlID0gcG9wLmNhbGwoYXJncyksCi0gICAgICAg
ICAgICB3YWl0LAotICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICBkZWJvdW5jZWUsCi0g
ICAgICAgICAgICB0aW1lcjsKLQotICAgICAgICBpZiAodHlwZW9mIGltbWVkaWF0ZSA9PT0gIm51
bWJlciIgfHwgdHlwZW9mIGltbWVkaWF0ZSA9PT0gInN0cmluZyIpIHsKLSAgICAgICAgICB3YWl0
ID0gaW1tZWRpYXRlOwotICAgICAgICAgIGltbWVkaWF0ZSA9IGZhbHNlOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgIHdhaXQgPSBwb3AuY2FsbChhcmdzKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAxMCk7Ci0gICAgICAgIC8vIFJlbW92ZSBkZWJvdW5j
ZWUKLSAgICAgICAgaW5kZXggPSBmaW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKLQotICAg
ICAgICBpZiAoaW5kZXggPiAtMSkgewotICAgICAgICAgIGRlYm91bmNlZSA9IGRlYm91bmNlZXNb
aW5kZXhdOwotICAgICAgICAgIGRlYm91bmNlZXMuc3BsaWNlKGluZGV4LCAxKTsKLSAgICAgICAg
ICBjbGVhclRpbWVvdXQoZGVib3VuY2VlWzJdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRpbWVy
ID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgaWYgKCFpbW1lZGlh
dGUpIHsKLSAgICAgICAgICAgIHNlbGYucnVuLmFwcGx5KHNlbGYsIGFyZ3MpOwotICAgICAgICAg
IH0KLSAgICAgICAgICB2YXIgaW5kZXggPSBmaW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKTsK
LSAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewotICAgICAgICAgICAgZGVib3VuY2Vlcy5zcGxp
Y2UoaW5kZXgsIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwgd2FpdCk7Ci0KLSAgICAgICAg
aWYgKGltbWVkaWF0ZSAmJiBpbmRleCA9PT0gLTEpIHsKLSAgICAgICAgICBzZWxmLnJ1bi5hcHBs
eShzZWxmLCBhcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQs
IG1ldGhvZCwgdGltZXJdOwotCi0gICAgICAgIGRlYm91bmNlZXMucHVzaChkZWJvdW5jZWUpOwot
Ci0gICAgICAgIHJldHVybiBkZWJvdW5jZWU7Ci0gICAgICB9LAotCi0gICAgICBjYW5jZWxUaW1l
cnM6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgaSwgbGVuOwotCi0gICAgICAgIGZvciAoaSA9
IDAsIGxlbiA9IHRocm90dGxlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICBj
bGVhclRpbWVvdXQodGhyb3R0bGVyc1tpXVsyXSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3R0
bGVycyA9IFtdOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGRlYm91bmNlZXMubGVuZ3Ro
OyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2Vlc1tpXVsy
XSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVib3VuY2VlcyA9IFtdOwotCi0gICAgICAgIGlmIChs
YXRlclRpbWVyKSB7Ci0gICAgICAgICAgY2xlYXJUaW1lb3V0KGxhdGVyVGltZXIpOwotICAgICAg
ICAgIGxhdGVyVGltZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRpbWVycyA9IFtdOwot
Ci0gICAgICAgIGlmIChhdXRvcnVuKSB7Ci0gICAgICAgICAgY2xlYXJUaW1lb3V0KGF1dG9ydW4p
OwotICAgICAgICAgIGF1dG9ydW4gPSBudWxsOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAg
ICBoYXNUaW1lcnM6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gISF0aW1lcnMubGVuZ3Ro
IHx8IGF1dG9ydW47Ci0gICAgICB9LAotCi0gICAgICBjYW5jZWw6IGZ1bmN0aW9uKHRpbWVyKSB7
Ci0gICAgICAgIHZhciB0aW1lclR5cGUgPSB0eXBlb2YgdGltZXI7Ci0KLSAgICAgICAgaWYgKHRp
bWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVjdCcgJiYgdGltZXIucXVldWUgJiYgdGltZXIubWV0
aG9kKSB7IC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBkZWZlck9uY2UKLSAgICAgICAgICByZXR1cm4g
dGltZXIucXVldWUuY2FuY2VsKHRpbWVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aW1lclR5cGUg
PT09ICdmdW5jdGlvbicpIHsgLy8gd2UncmUgY2FuY2VsbGluZyBhIHNldFRpbWVvdXQKLSAgICAg
ICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRpbWVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsK
LSAgICAgICAgICAgIGlmICh0aW1lcnNbaSArIDFdID09PSB0aW1lcikgewotICAgICAgICAgICAg
ICB0aW1lcnMuc3BsaWNlKGksIDIpOyAvLyByZW1vdmUgdGhlIHR3byBlbGVtZW50cwotICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAg
IH0gZWxzZSBpZiAod2luZG93LnRvU3RyaW5nLmNhbGwodGltZXIpID09PSAiW29iamVjdCBBcnJh
eV0iKXsgLy8gd2UncmUgY2FuY2VsbGluZyBhIHRocm90dGxlIG9yIGRlYm91bmNlCi0gICAgICAg
ICAgcmV0dXJuIHRoaXMuX2NhbmNlbEl0ZW0oZmluZFRocm90dGxlciwgdGhyb3R0bGVycywgdGlt
ZXIpIHx8IAotICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbEl0ZW0oZmluZERlYm91bmNl
ZSwgZGVib3VuY2VlcywgdGltZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVy
bjsgLy8gdGltZXIgd2FzIG51bGwgb3Igbm90IGEgdGltZXIKLSAgICAgICAgfQotICAgICAgfSwK
LQotICAgICAgX2NhbmNlbEl0ZW06IGZ1bmN0aW9uKGZpbmRNZXRob2QsIGFycmF5LCB0aW1lcil7
Ci0gICAgICAgIHZhciBpdGVtLAotICAgICAgICAgICAgaW5kZXg7Ci0KLSAgICAgICAgaWYgKHRp
bWVyLmxlbmd0aCA8IDMpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgICAgaW5kZXggPSBmaW5k
TWV0aG9kKHRpbWVyWzBdLCB0aW1lclsxXSk7Ci0KLSAgICAgICAgaWYoaW5kZXggPiAtMSkgewot
Ci0gICAgICAgICAgaXRlbSA9IGFycmF5W2luZGV4XTsKLQotICAgICAgICAgIGlmKGl0ZW1bMl0g
PT09IHRpbWVyWzJdKXsKLSAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7Ci0gICAg
ICAgICAgICBjbGVhclRpbWVvdXQodGltZXJbMl0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
fQotCi0gICAgfTsKLQotICAgIEJhY2tidXJuZXIucHJvdG90eXBlLnNjaGVkdWxlID0gQmFja2J1
cm5lci5wcm90b3R5cGUuZGVmZXI7Ci0gICAgQmFja2J1cm5lci5wcm90b3R5cGUuc2NoZWR1bGVP
bmNlID0gQmFja2J1cm5lci5wcm90b3R5cGUuZGVmZXJPbmNlOwotICAgIEJhY2tidXJuZXIucHJv
dG90eXBlLmxhdGVyID0gQmFja2J1cm5lci5wcm90b3R5cGUuc2V0VGltZW91dDsKLQotICAgIGZ1
bmN0aW9uIGNyZWF0ZUF1dG9ydW4oYmFja2J1cm5lcikgewotICAgICAgYmFja2J1cm5lci5iZWdp
bigpOwotICAgICAgYXV0b3J1biA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAg
ICAgICBhdXRvcnVuID0gbnVsbDsKLSAgICAgICAgYmFja2J1cm5lci5lbmQoKTsKLSAgICAgIH0p
OwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHVwZGF0ZUxhdGVyVGltZXIoc2VsZiwgZXhlY3V0ZUF0
LCB3YWl0KSB7Ci0gICAgICBpZiAoIWxhdGVyVGltZXIgfHwgZXhlY3V0ZUF0IDwgbGF0ZXJUaW1l
ckV4cGlyZXNBdCkgewotICAgICAgICBpZiAobGF0ZXJUaW1lcikgewotICAgICAgICAgIGNsZWFy
VGltZW91dChsYXRlclRpbWVyKTsKLSAgICAgICAgfQotICAgICAgICBsYXRlclRpbWVyID0gZ2xv
YmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgbGF0ZXJUaW1lciA9IG51bGw7
Ci0gICAgICAgICAgbGF0ZXJUaW1lckV4cGlyZXNBdCA9IG51bGw7Ci0gICAgICAgICAgZXhlY3V0
ZVRpbWVycyhzZWxmKTsKLSAgICAgICAgfSwgd2FpdCk7Ci0gICAgICAgIGxhdGVyVGltZXJFeHBp
cmVzQXQgPSBleGVjdXRlQXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZXhlY3V0
ZVRpbWVycyhzZWxmKSB7Ci0gICAgICB2YXIgbm93ID0gK25ldyBEYXRlKCksCi0gICAgICAgICAg
dGltZSwgZm5zLCBpLCBsOwotCi0gICAgICBzZWxmLnJ1bihmdW5jdGlvbigpIHsKLSAgICAgICAg
Ly8gVE9ETzogYmluYXJ5IHNlYXJjaAotICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGltZXJzLmxl
bmd0aDsgaSA8IGw7IGkgKz0gMikgewotICAgICAgICAgIHRpbWUgPSB0aW1lcnNbaV07Ci0gICAg
ICAgICAgaWYgKHRpbWUgPiBub3cpIHsgYnJlYWs7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGZu
cyA9IHRpbWVycy5zcGxpY2UoMCwgaSk7Ci0KLSAgICAgICAgZm9yIChpID0gMSwgbCA9IGZucy5s
ZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKLSAgICAgICAgICBzZWxmLnNjaGVkdWxlKHNlbGYub3B0
aW9ucy5kZWZhdWx0UXVldWUsIG51bGwsIGZuc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwot
Ci0gICAgICBpZiAodGltZXJzLmxlbmd0aCkgewotICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNl
bGYsIHRpbWVyc1swXSwgdGltZXJzWzBdIC0gbm93KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBm
dW5jdGlvbiBmaW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKSB7Ci0gICAgICB2YXIgZGVib3Vu
Y2VlLAotICAgICAgICAgIGluZGV4ID0gLTE7Ci0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0g
ZGVib3VuY2Vlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgZGVib3VuY2VlID0gZGVi
b3VuY2Vlc1tpXTsKLSAgICAgICAgaWYgKGRlYm91bmNlZVswXSA9PT0gdGFyZ2V0ICYmIGRlYm91
bmNlZVsxXSA9PT0gbWV0aG9kKSB7Ci0gICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0K
LSAgICBmdW5jdGlvbiBmaW5kVGhyb3R0bGVyKHRhcmdldCwgbWV0aG9kKSB7Ci0gICAgICB2YXIg
dGhyb3R0bGVyLAotICAgICAgICAgIGluZGV4ID0gLTE7Ci0KLSAgICAgIGZvciAodmFyIGkgPSAw
LCBsID0gdGhyb3R0bGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgdGhyb3R0bGVy
ID0gdGhyb3R0bGVyc1tpXTsKLSAgICAgICAgaWYgKHRocm90dGxlclswXSA9PT0gdGFyZ2V0ICYm
IHRocm90dGxlclsxXSA9PT0gbWV0aG9kKSB7Ci0gICAgICAgICAgaW5kZXggPSBpOwotICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBpbmRleDsKLSAg
ICB9Ci0KLQotICAgIF9fZXhwb3J0c19fLkJhY2tidXJuZXIgPSBCYWNrYnVybmVyOwotICB9KTsK
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgb25CZWdpbiA9IGZ1bmN0aW9uKGN1cnJl
bnQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gY3VycmVudDsKLX07Ci0KLXZhciBv
bkVuZCA9IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRSdW5M
b29wID0gbmV4dDsKLX07Ci0KLXZhciBCYWNrYnVybmVyID0gcmVxdWlyZU1vZHVsZSgnYmFja2J1
cm5lcicpLkJhY2tidXJuZXIsCi0gICAgYmFja2J1cm5lciA9IG5ldyBCYWNrYnVybmVyKFsnc3lu
YycsICdhY3Rpb25zJywgJ2Rlc3Ryb3knXSwgewotICAgICAgc3luYzogewotICAgICAgICBiZWZv
cmU6IEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzLAotICAgICAgICBhZnRlcjogRW1iZXIuZW5k
UHJvcGVydHlDaGFuZ2VzCi0gICAgICB9LAotICAgICAgZGVmYXVsdFF1ZXVlOiAnYWN0aW9ucycs
Ci0gICAgICBvbkJlZ2luOiBvbkJlZ2luLAotICAgICAgb25FbmQ6IG9uRW5kCi0gICAgfSksCi0g
ICAgc2xpY2UgPSBbXS5zbGljZTsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gRW1iZXIucnVuIC0gdGhpcyBpcyBpZGVh
bGx5IHRoZSBvbmx5IHB1YmxpYyBBUEkgdGhlIGRldiBzZWVzCi0vLwotCi0vKioKLSAgUnVucyB0
aGUgcGFzc2VkIHRhcmdldCBhbmQgbWV0aG9kIGluc2lkZSBvZiBhIFJ1bkxvb3AsIGVuc3VyaW5n
IGFueQotICBkZWZlcnJlZCBhY3Rpb25zIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBk
YXRlcyBhcmUgZmx1c2hlZCBhdCB0aGUKLSAgZW5kLgotCi0gIE5vcm1hbGx5IHlvdSBzaG91bGQg
bm90IG5lZWQgdG8gaW52b2tlIHRoaXMgbWV0aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCi0gIHlv
dSBhcmUgaW1wbGVtZW50aW5nIHJhdyBldmVudCBoYW5kbGVycyB3aGVuIGludGVyZmFjaW5nIHdp
dGggb3RoZXIKLSAgbGlicmFyaWVzIG9yIHBsdWdpbnMsIHlvdSBzaG91bGQgcHJvYmFibHkgd3Jh
cCBhbGwgb2YgeW91ciBjb2RlIGluc2lkZSB0aGlzCi0gIGNhbGwuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdp
dGhpbiBhIFJ1bkxvb3AKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBydW4KLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAc3RhdGljCi0gIEBjb25zdHJ1Y3RvcgotICBAcGFyYW0ge09iamVjdH0gW3Rh
cmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBjYWxsCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5n
fSBtZXRob2QgTWV0aG9kIHRvIGludm9rZS4KLSAgICBNYXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0
cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcKLSAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVw
IG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgotICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBBbnkgYWRk
aXRpb25hbCBhcmd1bWVudHMgeW91IHdpc2ggdG8gcGFzcyB0byB0aGUgbWV0aG9kLgotICBAcmV0
dXJuIHtPYmplY3R9IHJldHVybiB2YWx1ZSBmcm9tIGludm9raW5nIHRoZSBwYXNzZWQgZnVuY3Rp
b24uCi0qLwotRW1iZXIucnVuID0gZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIHJl
dDsKLQotICBpZiAoRW1iZXIub25lcnJvcikgewotICAgIHRyeSB7Ci0gICAgICByZXQgPSBiYWNr
YnVybmVyLnJ1bi5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwotICAgIH0gY2F0Y2ggKGUp
IHsKLSAgICAgIEVtYmVyLm9uZXJyb3IoZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldCA9
IGJhY2tidXJuZXIucnVuLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7Ci0gIH0KLQotICBy
ZXR1cm4gcmV0OwotfTsKLQotLyoqCi0gIElmIG5vIHJ1bi1sb29wIGlzIHByZXNlbnQsIGl0IGNy
ZWF0ZXMgYSBuZXcgb25lLiBJZiBhIHJ1biBsb29wIGlzCi0gIHByZXNlbnQgaXQgd2lsbCBxdWV1
ZSBpdHNlbGYgdG8gcnVuIG9uIHRoZSBleGlzdGluZyBydW4tbG9vcHMgYWN0aW9uCi0gIHF1ZXVl
LgotCi0gIFBsZWFzZSBub3RlOiBUaGlzIGlzIG5vdCBmb3Igbm9ybWFsIHVzYWdlLCBhbmQgc2hv
dWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi0gIElmIGludm9rZWQgd2hlbiBub3Qgd2l0aGluIGEg
cnVuIGxvb3A6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4uam9pbihmdW5jdGlvbigp
IHsKLSAgICAvLyBjcmVhdGVzIGEgbmV3IHJ1bi1sb29wCi0gIH0pOwotICBgYGAKLQotICBBbHRl
cm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGluIGFuIGV4aXN0aW5nIHJ1biBsb29wOgotCi0gIGBg
YGphdmFzY3JpcHQKLSAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgIC8vIGNyZWF0ZXMgYSBu
ZXcgcnVuLWxvb3AKLSAgICBFbWJlci5ydW4uam9pbihmdW5jdGlvbigpIHsKLSAgICAgIC8vIGpv
aW5zIHdpdGggdGhlIGV4aXN0aW5nIHJ1bi1sb29wLCBhbmQgcXVldWVzIGZvciBpbnZvY2F0aW9u
IG9uCi0gICAgICAvLyB0aGUgZXhpc3RpbmcgcnVuLWxvb3BzIGFjdGlvbiBxdWV1ZS4KLSAgICB9
KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRob2Qgam9pbgotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGNhbGwKLSAgQHBh
cmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gaW52b2tlLgotICAgIE1heSBi
ZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZwotICAgIHRoZW4g
aXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0YXJnZXQuCi0gIEBwYXJhbSB7T2Jq
ZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRv
IHRoZSBtZXRob2QuCi0gIEByZXR1cm4ge09iamVjdH0gUmV0dXJuIHZhbHVlIGZyb20gaW52b2tp
bmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4gUGxlYXNlIG5vdGUsCi0gIHdoZW4gY2FsbGVkIHdpdGhp
biBhbiBleGlzdGluZyBsb29wLCBubyByZXR1cm4gdmFsdWUgaXMgcG9zc2libGUuCi0qLwotRW1i
ZXIucnVuLmpvaW4gPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgewotICBpZiAoIUVtYmVyLnJ1
bi5jdXJyZW50UnVuTG9vcCkgewotICAgIHJldHVybiBFbWJlci5ydW4uYXBwbHkoRW1iZXIucnVu
LCBhcmd1bWVudHMpOwotICB9Ci0KLSAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7
Ci0gIGFyZ3MudW5zaGlmdCgnYWN0aW9ucycpOwotICBFbWJlci5ydW4uc2NoZWR1bGUuYXBwbHko
RW1iZXIucnVuLCBhcmdzKTsKLX07Ci0KLUVtYmVyLnJ1bi5iYWNrYnVybmVyID0gYmFja2J1cm5l
cjsKLQotdmFyIHJ1biA9IEVtYmVyLnJ1bjsKLQotRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0g
bnVsbDsKLQotRW1iZXIucnVuLnF1ZXVlcyA9IGJhY2tidXJuZXIucXVldWVOYW1lczsKLQotLyoq
Ci0gIEJlZ2lucyBhIG5ldyBSdW5Mb29wLiBBbnkgZGVmZXJyZWQgYWN0aW9ucyBpbnZva2VkIGFm
dGVyIHRoZSBiZWdpbiB3aWxsCi0gIGJlIGJ1ZmZlcmVkIHVudGlsIHlvdSBpbnZva2UgYSBtYXRj
aGluZyBjYWxsIHRvIGBFbWJlci5ydW4uZW5kKClgLiBUaGlzIGlzCi0gIGEgbG93ZXItbGV2ZWwg
d2F5IHRvIHVzZSBhIFJ1bkxvb3AgaW5zdGVhZCBvZiB1c2luZyBgRW1iZXIucnVuKClgLgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVuLmJlZ2luKCk7Ci0gIC8vIGNvZGUgdG8gYmUgZXhl
Y3V0ZSB3aXRoaW4gYSBSdW5Mb29wCi0gIEVtYmVyLnJ1bi5lbmQoKTsKLSAgYGBgCi0KLSAgQG1l
dGhvZCBiZWdpbgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1bi5iZWdpbiA9IGZ1bmN0
aW9uKCkgewotICBiYWNrYnVybmVyLmJlZ2luKCk7Ci19OwotCi0vKioKLSAgRW5kcyBhIFJ1bkxv
b3AuIFRoaXMgbXVzdCBiZSBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgeW91IGNhbGwKLSAgYEVtYmVy
LnJ1bi5iZWdpbigpYCB0byBmbHVzaCBhbnkgZGVmZXJyZWQgYWN0aW9ucy4gVGhpcyBpcyBhIGxv
d2VyLWxldmVsIHdheQotICB0byB1c2UgYSBSdW5Mb29wIGluc3RlYWQgb2YgdXNpbmcgYEVtYmVy
LnJ1bigpYC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bi5iZWdpbigpOwotICAvLyBj
b2RlIHRvIGJlIGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcAotICBFbWJlci5ydW4uZW5kKCk7Ci0g
IGBgYAotCi0gIEBtZXRob2QgZW5kCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLmVu
ZCA9IGZ1bmN0aW9uKCkgewotICBiYWNrYnVybmVyLmVuZCgpOwotfTsKLQotLyoqCi0gIEFycmF5
IG9mIG5hbWVkIHF1ZXVlcy4gVGhpcyBhcnJheSBkZXRlcm1pbmVzIHRoZSBvcmRlciBpbiB3aGlj
aCBxdWV1ZXMKLSAgYXJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgUnVuTG9vcC4gWW91IGNh
biBkZWZpbmUgeW91ciBvd24gcXVldWVzIGJ5Ci0gIHNpbXBseSBhZGRpbmcgdGhlIHF1ZXVlIG5h
bWUgdG8gdGhpcyBhcnJheS4gTm9ybWFsbHkgeW91IHNob3VsZCBub3QgbmVlZAotICB0byBpbnNw
ZWN0IG9yIG1vZGlmeSB0aGlzIHByb3BlcnR5LgotCi0gIEBwcm9wZXJ0eSBxdWV1ZXMKLSAgQHR5
cGUgQXJyYXkKLSAgQGRlZmF1bHQgWydzeW5jJywgJ2FjdGlvbnMnLCAnZGVzdHJveSddCi0qLwot
Ci0vKioKLSAgQWRkcyB0aGUgcGFzc2VkIHRhcmdldC9tZXRob2QgYW5kIGFueSBvcHRpb25hbCBh
cmd1bWVudHMgdG8gdGhlIG5hbWVkCi0gIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQg
b2YgdGhlIFJ1bkxvb3AuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5Ci0gIHN0YXJ0ZWQgYSBSdW5M
b29wIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UK
LSAgYXV0b21hdGljYWxseS4KLQotICBBdCB0aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhv
ZHMgc2NoZWR1bGVkIGluIHRoaXMgd2F5IHdpbGwgYmUgaW52b2tlZC4KLSAgTWV0aG9kcyB3aWxs
IGJlIGludm9rZWQgaW4gYW4gb3JkZXIgbWF0Y2hpbmcgdGhlIG5hbWVkIHF1ZXVlcyBkZWZpbmVk
IGluCi0gIHRoZSBgRW1iZXIucnVuLnF1ZXVlc2AgcHJvcGVydHkuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5ydW4uc2NoZWR1bGUoJ3N5bmMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAv
LyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4g
YmluZGluZ3MgYXJlIHN5bmNlZAotICAgIGNvbnNvbGUubG9nKCJzY2hlZHVsZWQgb24gc3luYyBx
dWV1ZSIpOwotICB9KTsKLQotICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBm
dW5jdGlvbigpIHsKLSAgICAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlICdhY3Rpb25z
JyBxdWV1ZSwgYWZ0ZXIgYmluZGluZ3MgaGF2ZSBzeW5jZWQuCi0gICAgY29uc29sZS5sb2coInNj
aGVkdWxlZCBvbiBhY3Rpb25zIHF1ZXVlIik7Ci0gIH0pOwotCi0gIC8vIE5vdGUgdGhlIGZ1bmN0
aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBiYXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4K
LSAgLy8gT3V0cHV0IHdvdWxkIGJlOgotICAvLyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlCi0g
IC8vICAgc2NoZWR1bGVkIG9uIGFjdGlvbnMgcXVldWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBzY2hl
ZHVsZQotICBAcGFyYW0ge1N0cmluZ30gcXVldWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIHNj
aGVkdWxlIGFnYWluc3QuCi0gICAgRGVmYXVsdCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlv
bnMnCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2JqZWN0IHRvIHVzZSBhcyB0
aGUgY29udGV4dCB3aGVuIGludm9raW5nIGEgbWV0aG9kLgotICBAcGFyYW0ge1N0cmluZ3xGdW5j
dGlvbn0gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLiBJZiB5b3UgcGFzcyBhIHN0cmluZyBp
dAotICAgIHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIHRpbWUg
dGhlIHNjaGVkdWxlZCBpdGVtIGlzCi0gICAgaW52b2tlZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdl
IHRoZSB0YXJnZXQgZnVuY3Rpb24uCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzKl0gT3B0
aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVldWVkIG1ldGhvZC4KLSAgQHJl
dHVybiB7dm9pZH0KLSovCi1FbWJlci5ydW4uc2NoZWR1bGUgPSBmdW5jdGlvbihxdWV1ZSwgdGFy
Z2V0LCBtZXRob2QpIHsKLSAgY2hlY2tBdXRvUnVuKCk7Ci0gIGJhY2tidXJuZXIuc2NoZWR1bGUu
YXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07Ci0KLS8vIFVzZWQgYnkgZ2xvYmFsIHRl
c3QgdGVhcmRvd24KLUVtYmVyLnJ1bi5oYXNTY2hlZHVsZWRUaW1lcnMgPSBmdW5jdGlvbigpIHsK
LSAgcmV0dXJuIGJhY2tidXJuZXIuaGFzVGltZXJzKCk7Ci19OwotCi0vLyBVc2VkIGJ5IGdsb2Jh
bCB0ZXN0IHRlYXJkb3duCi1FbWJlci5ydW4uY2FuY2VsVGltZXJzID0gZnVuY3Rpb24gKCkgewot
ICBiYWNrYnVybmVyLmNhbmNlbFRpbWVycygpOwotfTsKLQotLyoqCi0gIEltbWVkaWF0ZWx5IGZs
dXNoZXMgYW55IGV2ZW50cyBzY2hlZHVsZWQgaW4gdGhlICdzeW5jJyBxdWV1ZS4gQmluZGluZ3MK
LSAgdXNlIHRoaXMgcXVldWUgc28gdGhpcyBtZXRob2QgaXMgYSB1c2VmdWwgd2F5IHRvIGltbWVk
aWF0ZWx5IGZvcmNlIGFsbAotICBiaW5kaW5ncyBpbiB0aGUgYXBwbGljYXRpb24gdG8gc3luYy4K
LQotICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYW55dGltZSB5b3UgbmVlZCBhbnkgY2hh
bmdlZCBzdGF0ZSB0byBwcm9wYWdhdGUKLSAgdGhyb3VnaG91dCB0aGUgYXBwIGltbWVkaWF0ZWx5
IHdpdGhvdXQgcmVwYWludGluZyB0aGUgVUkgKHdoaWNoIGhhcHBlbnMKLSAgaW4gdGhlIGxhdGVy
ICdyZW5kZXInIHF1ZXVlIGFkZGVkIGJ5IHRoZSBgZW1iZXItdmlld3NgIHBhY2thZ2UpLgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVuLnN5bmMoKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBz
eW5jCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLnN5bmMgPSBmdW5jdGlvbigpIHsK
LSAgaWYgKGJhY2tidXJuZXIuY3VycmVudEluc3RhbmNlKSB7Ci0gICAgYmFja2J1cm5lci5jdXJy
ZW50SW5zdGFuY2UucXVldWVzLnN5bmMuZmx1c2goKTsKLSAgfQotfTsKLQotLyoqCi0gIEludm9r
ZXMgdGhlIHBhc3NlZCB0YXJnZXQvbWV0aG9kIGFuZCBvcHRpb25hbCBhcmd1bWVudHMgYWZ0ZXIg
YSBzcGVjaWZpZWQKLSAgcGVyaW9kIGlmIHRpbWUuIFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlz
IG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBhIG51bWJlcgotICBvZiBtaWxsaXNlY29uZHMuCi0KLSAg
WW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUg
YWN0aW9uIGFmdGVyIGEKLSAgcGVyaW9kIG9mIHRpbWUgaW5zdGVhZCBvZiB1c2luZyBgc2V0VGlt
ZW91dCgpYC4gVGhpcyBtZXRob2Qgd2lsbCBlbnN1cmUgdGhhdAotICBpdGVtcyB0aGF0IGV4cGly
ZSBkdXJpbmcgdGhlIHNhbWUgc2NyaXB0IGV4ZWN1dGlvbiBjeWNsZSBhbGwgZXhlY3V0ZQotICB0
b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyBhIHJlYWwg
c2V0VGltZW91dC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bi5sYXRlcihteUNvbnRl
eHQsIGZ1bmN0aW9uKCkgewotICAgIC8vIGNvZGUgaGVyZSB3aWxsIGV4ZWN1dGUgd2l0aGluIGEg
UnVuTG9vcCBpbiBhYm91dCA1MDBtcyB3aXRoIHRoaXMgPT0gbXlDb250ZXh0Ci0gIH0sIDUwMCk7
Ci0gIGBgYAotCi0gIEBtZXRob2QgbGF0ZXIKLSAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRh
cmdldCBvZiBtZXRob2QgdG8gaW52b2tlCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRo
b2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCi0gICAgSWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2ls
bCBiZSByZXNvbHZlZCBvbiB0aGUKLSAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBp
cyBpbnZva2VkLgotICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMg
dG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAgQHBhcmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9m
IG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBAcmV0dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHlvdSBj
YW4gdXNlIHRvIGNhbmNlbCB0aGUgdGltZXIgaW4KLSAgICBgRW1iZXIucnVuLmNhbmNlbGAgbGF0
ZXIuCi0qLwotRW1iZXIucnVuLmxhdGVyID0gZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAg
cmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07
Ci0KLS8qKgotICBTY2hlZHVsZSBhIGZ1bmN0aW9uIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhl
IGN1cnJlbnQgUnVuTG9vcC4gVGhpcyBpcyBlcXVpdmFsZW50Ci0gIHRvIGNhbGxpbmcgYHNjaGVk
dWxlT25jZWAgd2l0aCB0aGUgImFjdGlvbnMiIHF1ZXVlLgotCi0gIEBtZXRob2Qgb25jZQotICBA
cGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvZiB0aGUgbWV0aG9kIHRvIGludm9r
ZS4KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9r
ZS4KLSAgICBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQot
ICAgIHRhcmdldCBhdCB0aGUgdGltZSB0aGUgbWV0aG9kIGlzIGludm9rZWQuCi0gIEBwYXJhbSB7
T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0
LgotICBAcmV0dXJuIHtPYmplY3R9IHRpbWVyCi0qLwotRW1iZXIucnVuLm9uY2UgPSBmdW5jdGlv
bih0YXJnZXQsIG1ldGhvZCkgewotICBjaGVja0F1dG9SdW4oKTsKLSAgdmFyIGFyZ3MgPSBzbGlj
ZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3MudW5zaGlmdCgnYWN0aW9ucycpOwotICByZXR1cm4g
YmFja2J1cm5lci5zY2hlZHVsZU9uY2UuYXBwbHkoYmFja2J1cm5lciwgYXJncyk7Ci19OwotCi0v
KioKLSAgU2NoZWR1bGVzIGEgZnVuY3Rpb24gdG8gcnVuIG9uZSB0aW1lIGluIGEgZ2l2ZW4gcXVl
dWUgb2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4KLSAgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRo
ZSBzYW1lIHF1ZXVlL3RhcmdldC9tZXRob2QgY29tYmluYXRpb24gd2lsbCBoYXZlCi0gIG5vIGVm
ZmVjdCAocGFzdCB0aGUgaW5pdGlhbCBjYWxsKS4KLQotICBOb3RlIHRoYXQgYWx0aG91Z2ggeW91
IGNhbiBwYXNzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGVzZSB3aWxsIG5vdCBiZQotICBjb25zaWRl
cmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGljYXRlcy4gTmV3IGFyZ3VtZW50cyB3aWxsIHJlcGxh
Y2UgcHJldmlvdXMKLSAgY2FsbHMuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4oZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHNheUhpID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdoaScp
OyB9Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgnYWZ0ZXJSZW5kZXInLCBteUNvbnRleHQs
IHNheUhpKTsKLSAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdhZnRlclJlbmRlcicsIG15Q29u
dGV4dCwgc2F5SGkpOwotICAgIC8vIHNheUhpIHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlLCBp
biB0aGUgYWZ0ZXJSZW5kZXIgcXVldWUgb2YgdGhlIFJ1bkxvb3AKLSAgfSk7Ci0gIGBgYAotCi0g
IEFsc28gbm90ZSB0aGF0IHBhc3NpbmcgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHRvIGBFbWJlci5y
dW4uc2NoZWR1bGVPbmNlYCB3aWxsCi0gIG5vdCBwcmV2ZW50IGFkZGl0aW9uYWwgY2FsbHMgd2l0
aCBhbiBpZGVudGljYWwgYW5vbnltb3VzIGZ1bmN0aW9uIGZyb20KLSAgc2NoZWR1bGluZyB0aGUg
aXRlbXMgbXVsdGlwbGUgdGltZXMsIGUuZy46Ci0KLSAgYGBgamF2YXNjcmlwdAotICBmdW5jdGlv
biBzY2hlZHVsZUl0KCkgewotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCBt
eUNvbnRleHQsIGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygiQ2xvc3VyZSIpOyB9KTsKLSAgfQot
ICBzY2hlZHVsZUl0KCk7Ci0gIHNjaGVkdWxlSXQoKTsKLSAgLy8gIkNsb3N1cmUiIHdpbGwgcHJp
bnQgdHdpY2UsIGV2ZW4gdGhvdWdoIHdlJ3JlIHVzaW5nIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNl
YCwKLSAgLy8gYmVjYXVzZSB0aGUgZnVuY3Rpb24gd2UgcGFzcyB0byBpdCBpcyBhbm9ueW1vdXMg
YW5kIHdvbid0IG1hdGNoIHRoZQotICAvLyBwcmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24u
Ci0gIGBgYAotCi0gIEF2YWlsYWJsZSBxdWV1ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZv
dW5kIGF0IGBFbWJlci5ydW4ucXVldWVzYAotCi0gIEBtZXRob2Qgc2NoZWR1bGVPbmNlCi0gIEBw
YXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBh
Z2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUgJ3N5bmMnIGFuZCAnYWN0aW9ucycuCi0gIEBwYXJh
bSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgot
ICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgot
ICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCi0gICAg
dGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgQHBhcmFtIHtPYmpl
Y3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0g
IEByZXR1cm4ge09iamVjdH0gdGltZXIKLSovCi1FbWJlci5ydW4uc2NoZWR1bGVPbmNlID0gZnVu
Y3Rpb24ocXVldWUsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIGNoZWNrQXV0b1J1bigpOwotICByZXR1
cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2UuYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsK
LX07Ci0KLS8qKgotICBTY2hlZHVsZXMgYW4gaXRlbSB0byBydW4gZnJvbSB3aXRoaW4gYSBzZXBh
cmF0ZSBydW4gbG9vcCwgYWZ0ZXIKLSAgY29udHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUg
c3lzdGVtLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwotICBgRW1iZXIucnVuLmxhdGVy
YCB3aXRoIGEgd2FpdCB0aW1lIG9mIDFtcy4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1
bi5uZXh0KG15Q29udGV4dCwgZnVuY3Rpb24oKSB7Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRl
ZCBpbiB0aGUgbmV4dCBydW4gbG9vcCwKLSAgICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBh
ZnRlciB0aGUgY3VycmVudCBvbmUKLSAgfSk7Ci0gIGBgYAotCi0gIE11bHRpcGxlIG9wZXJhdGlv
bnMgc2NoZWR1bGVkIHdpdGggYEVtYmVyLnJ1bi5uZXh0YCB3aWxsIGNvYWxlc2NlCi0gIGludG8g
dGhlIHNhbWUgbGF0ZXIgcnVuIGxvb3AsIGFsb25nIHdpdGggYW55IG90aGVyIG9wZXJhdGlvbnMK
LSAgc2NoZWR1bGVkIGJ5IGBFbWJlci5ydW4ubGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3Vu
ZCB0aGUgc2FtZQotICB0aW1lIHRoYXQgYEVtYmVyLnJ1bi5uZXh0YCBvcGVyYXRpb25zIHdpbGwg
ZmlyZS4KLQotICBOb3RlIHRoYXQgdGhlcmUgYXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0byB1c2lu
ZyBgRW1iZXIucnVuLm5leHRgLgotICBGb3IgaW5zdGFuY2UsIGlmIHlvdSdkIGxpa2UgdG8gc2No
ZWR1bGUgYW4gb3BlcmF0aW9uIHRvIGhhcHBlbgotICBhZnRlciBhbGwgRE9NIGVsZW1lbnQgb3Bl
cmF0aW9ucyBoYXZlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIGN1cnJlbnQKLSAgcnVuIGxvb3AsIHlv
dSBjYW4gbWFrZSB1c2Ugb2YgdGhlIGBhZnRlclJlbmRlcmAgcnVuIGxvb3AgcXVldWUgKGFkZGVk
Ci0gIGJ5IHRoZSBgZW1iZXItdmlld3NgIHBhY2thZ2UsIGFsb25nIHdpdGggdGhlIHByZWNlZGlu
ZyBgcmVuZGVyYCBxdWV1ZQotICB3aGVyZSBhbGwgdGhlIERPTSBlbGVtZW50IG9wZXJhdGlvbnMg
aGFwcGVuKS4gRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5NeUNvbGxlY3Rpb25W
aWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHsKLSAgICBkaWRJbnNlcnRFbGVtZW50
OiBmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVy
JywgdGhpcywgJ3Byb2Nlc3NDaGlsZEVsZW1lbnRzJyk7Ci0gICAgfSwKLSAgICBwcm9jZXNzQ2hp
bGRFbGVtZW50czogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGgg
Y29sbGVjdGlvblZpZXcncyBjaGlsZCB2aWV3Ci0gICAgICAvLyBlbGVtZW50cyBhZnRlciB0aGV5
J3ZlIGZpbmlzaGVkIHJlbmRlcmluZywgd2hpY2gKLSAgICAgIC8vIGNhbid0IGJlIGRvbmUgd2l0
aGluIHRoZSBDb2xsZWN0aW9uVmlldydzCi0gICAgICAvLyBgZGlkSW5zZXJ0RWxlbWVudGAgaG9v
ayBiZWNhdXNlIHRoYXQgZ2V0cyBydW4KLSAgICAgIC8vIGJlZm9yZSB0aGUgY2hpbGQgZWxlbWVu
dHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBET00uCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAg
T25lIGJlbmVmaXQgb2YgdGhlIGFib3ZlIGFwcHJvYWNoIGNvbXBhcmVkIHRvIHVzaW5nIGBFbWJl
ci5ydW4ubmV4dGAgaXMKLSAgdGhhdCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHBlcmZvcm0gRE9NL0NT
UyBvcGVyYXRpb25zIGJlZm9yZSB1bnByb2Nlc3NlZAotICBlbGVtZW50cyBhcmUgcmVuZGVyZWQg
dG8gdGhlIHNjcmVlbiwgd2hpY2ggbWF5IHByZXZlbnQgZmxpY2tlcmluZyBvcgotICBvdGhlciBh
cnRpZmFjdHMgY2F1c2VkIGJ5IGRlbGF5aW5nIHByb2Nlc3NpbmcgdW50aWwgYWZ0ZXIgcmVuZGVy
aW5nLgotCi0gIFRoZSBvdGhlciBtYWpvciBiZW5lZml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBp
cyB0aGF0IGBFbWJlci5ydW4ubmV4dGAKLSAgaW50cm9kdWNlcyBhbiBlbGVtZW50IG9mIG5vbi1k
ZXRlcm1pbmlzbSwgd2hpY2ggY2FuIG1ha2UgdGhpbmdzIG11Y2gKLSAgaGFyZGVyIHRvIHRlc3Qs
IGR1ZSB0byBpdHMgcmVsaWFuY2Ugb24gYHNldFRpbWVvdXRgOyBpdCdzIG11Y2ggaGFyZGVyCi0g
IHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Ygc2NoZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5
IGFyZSBzY2hlZHVsZWQKLSAgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBydW4gbG9vcCwgaS5lLiB3
aXRoIGBFbWJlci5ydW4ubmV4dGAuCi0KLSAgQG1ldGhvZCBuZXh0Ci0gIEBwYXJhbSB7T2JqZWN0
fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGludm9rZQotICBAcGFyYW0ge0Z1bmN0aW9u
fFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEg
c3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1l
IHRoZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9u
YWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0g
dGltZXIKLSovCi1FbWJlci5ydW4ubmV4dCA9IGZ1bmN0aW9uKCkgewotICB2YXIgYXJncyA9IHNs
aWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgYXJncy5wdXNoKDEpOwotICByZXR1cm4gYmFja2J1cm5l
ci5sYXRlci5hcHBseShiYWNrYnVybmVyLCBhcmdzKTsKLX07Ci0KLS8qKgotICBDYW5jZWxzIGEg
c2NoZWR1bGVkIGl0ZW0uIE11c3QgYmUgYSB2YWx1ZSByZXR1cm5lZCBieSBgRW1iZXIucnVuLmxh
dGVyKClgLAotICBgRW1iZXIucnVuLm9uY2UoKWAsIG9yIGBFbWJlci5ydW4ubmV4dCgpYC4KLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBydW5OZXh0ID0gRW1iZXIucnVuLm5leHQobXlDb250ZXh0
LCBmdW5jdGlvbigpIHsKLSAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAotICB9KTsKLSAgRW1i
ZXIucnVuLmNhbmNlbChydW5OZXh0KTsKLQotICB2YXIgcnVuTGF0ZXIgPSBFbWJlci5ydW4ubGF0
ZXIobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKLSAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAot
ICB9LCA1MDApOwotICBFbWJlci5ydW4uY2FuY2VsKHJ1bkxhdGVyKTsKLQotICB2YXIgcnVuT25j
ZSA9IEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4dCwgZnVuY3Rpb24oKSB7Ci0gICAgLy8gd2lsbCBu
b3QgYmUgZXhlY3V0ZWQKLSAgfSk7Ci0gIEVtYmVyLnJ1bi5jYW5jZWwocnVuT25jZSk7Ci0gIGBg
YAotCi0gIEBtZXRob2QgY2FuY2VsCi0gIEBwYXJhbSB7T2JqZWN0fSB0aW1lciBUaW1lciBvYmpl
Y3QgdG8gY2FuY2VsCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLmNhbmNlbCA9IGZ1
bmN0aW9uKHRpbWVyKSB7Ci0gIHJldHVybiBiYWNrYnVybmVyLmNhbmNlbCh0aW1lcik7Ci19Owot
Ci0vKioKLSAgRGVsYXkgY2FsbGluZyB0aGUgdGFyZ2V0IG1ldGhvZCB1bnRpbCB0aGUgZGVib3Vu
Y2UgcGVyaW9kIGhhcyBlbGFwc2VkCi0gIHdpdGggbm8gYWRkaXRpb25hbCBkZWJvdW5jZSBjYWxs
cy4gSWYgYGRlYm91bmNlYCBpcyBjYWxsZWQgYWdhaW4gYmVmb3JlCi0gIHRoZSBzcGVjaWZpZWQg
dGltZSBoYXMgZWxhcHNlZCwgdGhlIHRpbWVyIGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBlcmlv
ZAotICBtdXN0IHBhc3MgYWdhaW4gYmVmb3JlIHRoZSB0YXJnZXQgbWV0aG9kIGlzIGNhbGxlZC4K
LQotICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIGFuIGV2ZW50IG1heSBiZSBjYWxs
ZWQgbXVsdGlwbGUgdGltZXMKLSAgYnV0IHRoZSBhY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVk
IG9uY2Ugd2hlbiB0aGUgZXZlbnQgaXMgZG9uZSBmaXJpbmcuCi0gIEEgY29tbW9uIGV4YW1wbGUg
aXMgZm9yIHNjcm9sbCBldmVudHMgd2hlcmUgeW91IG9ubHkgd2FudCB1cGRhdGVzIHRvCi0gIGhh
cHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vhc2VkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicp
OyB9OwotICAgIHZhciBteUNvbnRleHQgPSB7bmFtZTogJ2RlYm91bmNlJ307Ci0KLSAgICBFbWJl
ci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyBsZXNzIHRo
YW4gMTUwbXMgcGFzc2VzCi0KLSAgICBFbWJlci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBteUZ1
bmMsIDE1MCk7Ci0KLSAgICAvLyAxNTBtcyBwYXNzZXMKLSAgICAvLyBteUZ1bmMgaXMgaW52b2tl
ZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0Ci0gICAgLy8gY29uc29sZSBsb2dzICdkZWJvdW5jZSBy
YW4uJyBvbmUgdGltZS4KLSAgYGBgCi0KLSAgQG1ldGhvZCBkZWJvdW5jZQotICBAcGFyYW0ge09i
amVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZva2UKLSAgQHBhcmFtIHtGdW5j
dGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBNYXkgYmUgYSBm
dW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcKLSAgICB0aGVuIGl0IHdp
bGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgotICBAcGFyYW0ge09iamVjdH0g
W2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAgQHBh
cmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBAcGFy
YW0ge0Jvb2xlYW59IGltbWVkaWF0ZSBUcmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGlu
ZyBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB3YWl0IGludGVydmFsLgotICBA
cmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1bi5kZWJvdW5jZSA9IGZ1bmN0aW9uKCkgewotICBy
ZXR1cm4gYmFja2J1cm5lci5kZWJvdW5jZS5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwot
fTsKLQotLyoqCi0gIEVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgbWV0aG9kIGlzIG5ldmVyIGNhbGxl
ZCBtb3JlIGZyZXF1ZW50bHkgdGhhbgotICB0aGUgc3BlY2lmaWVkIHNwYWNpbmcgcGVyaW9kLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUu
bG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OwotICAgIHZhciBteUNvbnRleHQgPSB7bmFtZTog
J3Rocm90dGxlJ307Ci0KLSAgICBFbWJlci5ydW4udGhyb3R0bGUobXlDb250ZXh0LCBteUZ1bmMs
IDE1MCk7Ci0KLSAgICAvLyA1MG1zIHBhc3NlcwotICAgIEVtYmVyLnJ1bi50aHJvdHRsZShteUNv
bnRleHQsIG15RnVuYywgMTUwKTsKLQotICAgIC8vIDUwbXMgcGFzc2VzCi0gICAgRW1iZXIucnVu
LnRocm90dGxlKG15Q29udGV4dCwgbXlGdW5jLCAxNTApOwotCi0gICAgLy8gNTBtcyBwYXNzZXMK
LSAgICBFbWJlci5ydW4udGhyb3R0bGUobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAv
LyAxNTBtcyBwYXNzZXMKLSAgICAvLyBteUZ1bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlD
b250ZXh0Ci0gICAgLy8gY29uc29sZSBsb2dzICd0aHJvdHRsZSByYW4uJyB0d2ljZSwgMTUwbXMg
YXBhcnQuCi0gIGBgYAotCi0gIEBtZXRob2QgdGhyb3R0bGUKLSAgQHBhcmFtIHtPYmplY3R9IFt0
YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCi0gIEBwYXJhbSB7RnVuY3Rpb258U3Ry
aW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCi0gICAgTWF5IGJlIGEgZnVuY3Rpb24g
b3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCi0gICAgdGhlbiBpdCB3aWxsIGJlIGxv
b2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0g
T3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0gIEBwYXJhbSB7TnVt
YmVyfSBzcGFjaW5nIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc3BhY2Ugb3V0IHJlcXVlc3Rz
LgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1bi50aHJvdHRsZSA9IGZ1bmN0aW9uKCkg
ewotICByZXR1cm4gYmFja2J1cm5lci50aHJvdHRsZS5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVu
dHMpOwotfTsKLQotLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGFuIGF1dG9ydW4gZHVyaW5nIHRlc3Rp
bmcKLWZ1bmN0aW9uIGNoZWNrQXV0b1J1bigpIHsKLSAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1
bkxvb3ApIHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBoYXZlIHR1cm5lZCBvbiB0ZXN0aW5nIG1v
ZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4tbG9vcCdzIGF1dG9ydW4uIFlvdSB3aWxsIG5lZWQg
dG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5jaHJvbm91cyBzaWRlLWVmZmVjdHMgaW4gYW4gRW1i
ZXIucnVuIiwgIUVtYmVyLnRlc3RpbmcpOwotICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vLyBFbWJlci5Mb2dnZXIKLS8vIGdldAotLy8gc2V0Ci0vLyBndWlkRm9yLCBtZXRh
Ci0vLyBhZGRPYnNlcnZlciwgcmVtb3ZlT2JzZXJ2ZXIKLS8vIEVtYmVyLnJ1bi5zY2hlZHVsZQot
LyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0qLwotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8vCi0K
LS8qKgotICBEZWJ1ZyBwYXJhbWV0ZXIgeW91IGNhbiB0dXJuIG9uLiBUaGlzIHdpbGwgbG9nIGFs
bCBiaW5kaW5ncyB0aGF0IGZpcmUgdG8KLSAgdGhlIGNvbnNvbGUuIFRoaXMgc2hvdWxkIGJlIGRp
c2FibGVkIGluIHByb2R1Y3Rpb24gY29kZS4gTm90ZSB0aGF0IHlvdQotICBjYW4gYWxzbyBlbmFi
bGUgdGhpcyBmcm9tIHRoZSBjb25zb2xlIG9yIHRlbXBvcmFyaWx5LgotCi0gIEBwcm9wZXJ0eSBM
T0dfQklORElOR1MKLSAgQGZvciBFbWJlcgotICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0IGZh
bHNlCi0qLwotRW1iZXIuTE9HX0JJTkRJTkdTID0gZmFsc2UgfHwgISFFbWJlci5FTlYuTE9HX0JJ
TkRJTkdTOwotCi12YXIgZ2V0ICAgICA9IEVtYmVyLmdldCwKLSAgICBzZXQgICAgID0gRW1iZXIu
c2V0LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAgIElTX0dMT0JBTCA9IC9eKFtB
LVokXXwoWzAtOV1bQS1aJF0pKS87Ci0KLS8qKgotICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3Zp
ZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcuLCBgTXlBcHAuZm9vQ29udHJvbGxlci5iYXJgKQotICBp
bnN0ZWFkIG9mIGxvY2FsIChgZm9vLmJhci5iYXpgKS4KLQotICBAbWV0aG9kIGlzR2xvYmFsUGF0
aAotICBAZm9yIEVtYmVyCi0gIEBwcml2YXRlCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBy
ZXR1cm4gQm9vbGVhbgotKi8KLXZhciBpc0dsb2JhbFBhdGggPSBFbWJlci5pc0dsb2JhbFBhdGgg
PSBmdW5jdGlvbihwYXRoKSB7Ci0gIHJldHVybiBJU19HTE9CQUwudGVzdChwYXRoKTsKLX07Ci0K
LWZ1bmN0aW9uIGdldFdpdGhHbG9iYWxzKG9iaiwgcGF0aCkgewotICByZXR1cm4gZ2V0KGlzR2xv
YmFsUGF0aChwYXRoKSA/IEVtYmVyLmxvb2t1cCA6IG9iaiwgcGF0aCk7Ci19Ci0KLS8vIC4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8v
IEJJTkRJTkcKLS8vCi0KLXZhciBCaW5kaW5nID0gZnVuY3Rpb24odG9QYXRoLCBmcm9tUGF0aCkg
ewotICB0aGlzLl9kaXJlY3Rpb24gPSAnZndkJzsKLSAgdGhpcy5fZnJvbSA9IGZyb21QYXRoOwot
ICB0aGlzLl90byAgID0gdG9QYXRoOwotICB0aGlzLl9kaXJlY3Rpb25NYXAgPSBFbWJlci5NYXAu
Y3JlYXRlKCk7Ci19OwotCi0vKioKLUBjbGFzcyBCaW5kaW5nCi1AbmFtZXNwYWNlIEVtYmVyCi0q
LwotCi1CaW5kaW5nLnByb3RvdHlwZSA9IHsKLSAgLyoqCi0gICAgVGhpcyBjb3BpZXMgdGhlIEJp
bmRpbmcgc28gaXQgY2FuIGJlIGNvbm5lY3RlZCB0byBhbm90aGVyIG9iamVjdC4KLQotICAgIEBt
ZXRob2QgY29weQotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBj
b3B5OiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFyIGNvcHkgPSBuZXcgQmluZGluZyh0aGlzLl90bywg
dGhpcy5fZnJvbSk7Ci0gICAgaWYgKHRoaXMuX29uZVdheSkgeyBjb3B5Ll9vbmVXYXkgPSB0cnVl
OyB9Ci0gICAgcmV0dXJuIGNvcHk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBDT05GSUcKLSAgLy8K
LQotICAvKioKLSAgICBUaGlzIHdpbGwgc2V0IGBmcm9tYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBz
cGVjaWZpZWQgdmFsdWUuIEl0IHdpbGwgbm90Ci0gICAgYXR0ZW1wdCB0byByZXNvbHZlIHRoaXMg
cHJvcGVydHkgcGF0aCB0byBhbiBhY3R1YWwgb2JqZWN0IHVudGlsIHlvdQotICAgIGNvbm5lY3Qg
dGhlIGJpbmRpbmcuCi0KLSAgICBUaGUgYmluZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3Bl
cnR5IHBhdGggc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2JqZWN0Ci0gICAgeW91IHBhc3Mgd2hlbiB5
b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRpbmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMK
LSAgICBgZ2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0g
ICAgQG1ldGhvZCBmcm9tCi0gICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggdGhlIHByb3BlcnR5IHBh
dGggdG8gY29ubmVjdCB0bwotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAq
LwotICBmcm9tOiBmdW5jdGlvbihwYXRoKSB7Ci0gICAgdGhpcy5fZnJvbSA9IHBhdGg7Ci0gICAg
cmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyB3aWxsIHNldCB0aGUgYHRvYCBw
cm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIEl0IHdpbGwgbm90Ci0gICAgYXR0
ZW1wdCB0byByZXNvbHZlIHRoaXMgcHJvcGVydHkgcGF0aCB0byBhbiBhY3R1YWwgb2JqZWN0IHVu
dGlsIHlvdQotICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCi0KLSAgICBUaGUgYmluZGluZyB3aWxs
IHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBhdGggc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2JqZWN0
Ci0gICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRpbmcuIEl0IGZvbGxv
d3MgdGhlIHNhbWUgcnVsZXMgYXMKLSAgICBgZ2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBt
b3JlIGluZm9ybWF0aW9uLgotCi0gICAgQG1ldGhvZCB0bwotICAgIEBwYXJhbSB7U3RyaW5nfFR1
cGxlfSBwYXRoIEEgcHJvcGVydHkgcGF0aCBvciB0dXBsZQotICAgIEByZXR1cm4ge0VtYmVyLkJp
bmRpbmd9IGB0aGlzYAotICAqLwotICB0bzogZnVuY3Rpb24ocGF0aCkgewotICAgIHRoaXMuX3Rv
ID0gcGF0aDsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBDb25maWd1cmVz
IHRoZSBiaW5kaW5nIGFzIG9uZSB3YXkuIEEgb25lLXdheSBiaW5kaW5nIHdpbGwgcmVsYXkgY2hh
bmdlcwotICAgIG9uIHRoZSBgZnJvbWAgc2lkZSB0byB0aGUgYHRvYCBzaWRlLCBidXQgbm90IHRo
ZSBvdGhlciB3YXkgYXJvdW5kLiBUaGlzCi0gICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hhbmdlIHRo
ZSBgdG9gIHNpZGUgZGlyZWN0bHksIHRoZSBgZnJvbWAgc2lkZSBtYXkgaGF2ZQotICAgIGEgZGlm
ZmVyZW50IHZhbHVlLgotCi0gICAgQG1ldGhvZCBvbmVXYXkKLSAgICBAcmV0dXJuIHtFbWJlci5C
aW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgb25lV2F5OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9v
bmVXYXkgPSB0cnVlOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRo
b2QgdG9TdHJpbmcKLSAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBv
ZiBiaW5kaW5nCi0gICovCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb25lV2F5
ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXldJyA6ICcnOwotICAgIHJldHVybiAiRW1iZXIuQmlu
ZGluZzwiICsgZ3VpZEZvcih0aGlzKSArICI+KCIgKyB0aGlzLl9mcm9tICsgIiAtPiAiICsgdGhp
cy5fdG8gKyAiKSIgKyBvbmVXYXk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBDT05ORUNUIEFORCBT
WU5DCi0gIC8vCi0KLSAgLyoqCi0gICAgQXR0ZW1wdHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcg
aW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBhbmQgcmVsYXkKLSAgICBjaGFuZ2VzLiBU
aGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB5b3UgaGF2ZSBub3Qgc2V0IHRo
ZQotICAgIGZyb20vdG8gcHJvcGVydGllcyB5ZXQuCi0KLSAgICBAbWV0aG9kIGNvbm5lY3QKLSAg
ICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCBmb3IgdGhpcyBiaW5kaW5nLgot
ICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBjb25uZWN0OiBmdW5j
dGlvbihvYmopIHsKLSAgICBFbWJlci5hc3NlcnQoJ011c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0
byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScsICEhb2JqKTsKLQotICAgIHZhciBmcm9tUGF0aCA9
IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMuX3RvOwotICAgIEVtYmVyLnRyeVNldChvYmosIHRv
UGF0aCwgZ2V0V2l0aEdsb2JhbHMob2JqLCBmcm9tUGF0aCkpOwotCi0gICAgLy8gYWRkIGFuIG9i
c2VydmVyIG9uIHRoZSBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgYmluZGluZyBzaG91
bGQgYmUgdXBkYXRlZAotICAgIEVtYmVyLmFkZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgsIHRoaXMs
IHRoaXMuZnJvbURpZENoYW5nZSk7Ci0KLSAgICAvLyBpZiB0aGUgYmluZGluZyBpcyBhIHR3by13
YXkgYmluZGluZywgYWxzbyBzZXQgdXAgYW4gb2JzZXJ2ZXIgb24gdGhlIHRhcmdldAotICAgIGlm
ICghdGhpcy5fb25lV2F5KSB7IEVtYmVyLmFkZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0
aGlzLnRvRGlkQ2hhbmdlKTsgfQotCi0gICAgdGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOwotCi0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRGlzY29ubmVjdHMgdGhlIGJpbmRp
bmcgaW5zdGFuY2UuIENoYW5nZXMgd2lsbCBubyBsb25nZXIgYmUgcmVsYXllZC4gWW91Ci0gICAg
d2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0KLSAgICBAbWV0aG9k
IGRpc2Nvbm5lY3QKLSAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCB5b3Ug
cGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUgYmluZGluZy4KLSAgICBAcmV0dXJuIHtFbWJlci5C
aW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgZGlzY29ubmVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAg
RW1iZXIuYXNzZXJ0KCdNdXN0IHBhc3MgYSB2YWxpZCBvYmplY3QgdG8gRW1iZXIuQmluZGluZy5k
aXNjb25uZWN0KCknLCAhIW9iaik7Ci0KLSAgICB2YXIgdHdvV2F5ID0gIXRoaXMuX29uZVdheTsK
LQotICAgIC8vIHJlbW92ZSBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHNvIHdlJ3JlIG5vIGxv
bmdlciBub3RpZmllZCBvZgotICAgIC8vIGNoYW5nZXMgdGhhdCBzaG91bGQgdXBkYXRlIGJpbmRp
bmdzLgotICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKG9iaiwgdGhpcy5fZnJvbSwgdGhpcywgdGhp
cy5mcm9tRGlkQ2hhbmdlKTsKLQotICAgIC8vIGlmIHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJl
bW92ZSB0aGUgb2JzZXJ2ZXIgZnJvbSB0aGUgdGFyZ2V0IGFzIHdlbGwKLSAgICBpZiAodHdvV2F5
KSB7IEVtYmVyLnJlbW92ZU9ic2VydmVyKG9iaiwgdGhpcy5fdG8sIHRoaXMsIHRoaXMudG9EaWRD
aGFuZ2UpOyB9Ci0KLSAgICB0aGlzLl9yZWFkeVRvU3luYyA9IGZhbHNlOyAvLyBkaXNhYmxlIHNj
aGVkdWxlZCBzeW5jcy4uLgotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8g
UFJJVkFURQotICAvLwotCi0gIC8qIGNhbGxlZCB3aGVuIHRoZSBmcm9tIHNpZGUgY2hhbmdlcyAq
LwotICBmcm9tRGlkQ2hhbmdlOiBmdW5jdGlvbih0YXJnZXQpIHsKLSAgICB0aGlzLl9zY2hlZHVs
ZVN5bmModGFyZ2V0LCAnZndkJyk7Ci0gIH0sCi0KLSAgLyogY2FsbGVkIHdoZW4gdGhlIHRvIHNp
ZGUgY2hhbmdlcyAqLwotICB0b0RpZENoYW5nZTogZnVuY3Rpb24odGFyZ2V0KSB7Ci0gICAgdGhp
cy5fc2NoZWR1bGVTeW5jKHRhcmdldCwgJ2JhY2snKTsKLSAgfSwKLQotICBfc2NoZWR1bGVTeW5j
OiBmdW5jdGlvbihvYmosIGRpcikgewotICAgIHZhciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJl
Y3Rpb25NYXA7Ci0gICAgdmFyIGV4aXN0aW5nRGlyID0gZGlyZWN0aW9uTWFwLmdldChvYmopOwot
Ci0gICAgLy8gaWYgd2UgaGF2ZW4ndCBzY2hlZHVsZWQgdGhlIGJpbmRpbmcgeWV0LCBzY2hlZHVs
ZSBpdAotICAgIGlmICghZXhpc3RpbmdEaXIpIHsKLSAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgn
c3luYycsIHRoaXMsIHRoaXMuX3N5bmMsIG9iaik7Ci0gICAgICBkaXJlY3Rpb25NYXAuc2V0KG9i
aiwgZGlyKTsKLSAgICB9Ci0KLSAgICAvLyBJZiBib3RoIGEgJ2JhY2snIGFuZCAnZndkJyBzeW5j
IGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhlIHNhbWUgb2JqZWN0LAotICAgIC8vIGRlZmF1bHQg
dG8gYSAnZndkJyBzeW5jIHNvIHRoYXQgaXQgcmVtYWlucyBkZXRlcm1pbmlzdGljLgotICAgIGlm
IChleGlzdGluZ0RpciA9PT0gJ2JhY2snICYmIGRpciA9PT0gJ2Z3ZCcpIHsKLSAgICAgIGRpcmVj
dGlvbk1hcC5zZXQob2JqLCAnZndkJyk7Ci0gICAgfQotICB9LAotCi0gIF9zeW5jOiBmdW5jdGlv
bihvYmopIHsKLSAgICB2YXIgbG9nID0gRW1iZXIuTE9HX0JJTkRJTkdTOwotCi0gICAgLy8gZG9u
J3Qgc3luY2hyb25pemUgZGVzdHJveWVkIG9iamVjdHMgb3IgZGlzY29ubmVjdGVkIGJpbmRpbmdz
Ci0gICAgaWYgKG9iai5pc0Rlc3Ryb3llZCB8fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsgcmV0dXJu
OyB9Ci0KLSAgICAvLyBnZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmluZGluZyBmb3IgdGhlIG9i
amVjdCB3ZSBhcmUKLSAgICAvLyBzeW5jaHJvbml6aW5nIGZyb20KLSAgICB2YXIgZGlyZWN0aW9u
TWFwID0gdGhpcy5fZGlyZWN0aW9uTWFwOwotICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25N
YXAuZ2V0KG9iaik7Ci0KLSAgICB2YXIgZnJvbVBhdGggPSB0aGlzLl9mcm9tLCB0b1BhdGggPSB0
aGlzLl90bzsKLQotICAgIGRpcmVjdGlvbk1hcC5yZW1vdmUob2JqKTsKLQotICAgIC8vIGlmIHdl
J3JlIHN5bmNocm9uaXppbmcgZnJvbSB0aGUgcmVtb3RlIG9iamVjdC4uLgotICAgIGlmIChkaXJl
Y3Rpb24gPT09ICdmd2QnKSB7Ci0gICAgICB2YXIgZnJvbVZhbHVlID0gZ2V0V2l0aEdsb2JhbHMo
b2JqLCB0aGlzLl9mcm9tKTsKLSAgICAgIGlmIChsb2cpIHsKLSAgICAgICAgRW1iZXIuTG9nZ2Vy
LmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwgJy0+JywgZnJvbVZhbHVlLCBvYmopOwotICAgICAg
fQotICAgICAgaWYgKHRoaXMuX29uZVdheSkgewotICAgICAgICBFbWJlci50cnlTZXQob2JqLCB0
b1BhdGgsIGZyb21WYWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFbWJlci5fc3VzcGVu
ZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlkQ2hhbmdlLCBmdW5jdGlvbiAo
KSB7Ci0gICAgICAgICAgRW1iZXIudHJ5U2V0KG9iaiwgdG9QYXRoLCBmcm9tVmFsdWUpOwotICAg
ICAgICB9KTsKLSAgICAgIH0KLSAgICAvLyBpZiB3ZSdyZSBzeW5jaHJvbml6aW5nICp0byogdGhl
IHJlbW90ZSBvYmplY3QKLSAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2JhY2snKSB7Ci0g
ICAgICB2YXIgdG9WYWx1ZSA9IGdldChvYmosIHRoaXMuX3RvKTsKLSAgICAgIGlmIChsb2cpIHsK
LSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwgJzwtJywgdG9W
YWx1ZSwgb2JqKTsKLSAgICAgIH0KLSAgICAgIEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXIob2JqLCBm
cm9tUGF0aCwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAg
IEVtYmVyLnRyeVNldChFbWJlci5pc0dsb2JhbFBhdGgoZnJvbVBhdGgpID8gRW1iZXIubG9va3Vw
IDogb2JqLCBmcm9tUGF0aCwgdG9WYWx1ZSk7Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotfTsK
LQotZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKHRvLCBmcm9tKSB7Ci0gIGZvciAodmFyIGtleSBp
biBmcm9tKSB7Ci0gICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAgICAgdG9b
a2V5XSA9IGZyb21ba2V5XTsKLSAgICB9Ci0gIH0KLX0KLQotbWl4aW5Qcm9wZXJ0aWVzKEJpbmRp
bmcsIHsKLQotICAvKgotICAgIFNlZSBgRW1iZXIuQmluZGluZy5mcm9tYC4KLQotICAgIEBtZXRo
b2QgZnJvbQotICAgIEBzdGF0aWMKLSAgKi8KLSAgZnJvbTogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IEMgPSB0aGlzLCBiaW5kaW5nID0gbmV3IEMoKTsKLSAgICByZXR1cm4gYmluZGluZy5mcm9tLmFw
cGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoKLSAgICBTZWUgYEVtYmVyLkJp
bmRpbmcudG9gLgotCi0gICAgQG1ldGhvZCB0bwotICAgIEBzdGF0aWMKLSAgKi8KLSAgdG86IGZ1
bmN0aW9uKCkgewotICAgIHZhciBDID0gdGhpcywgYmluZGluZyA9IG5ldyBDKCk7Ci0gICAgcmV0
dXJuIGJpbmRpbmcudG8uYXBwbHkoYmluZGluZywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioK
LSAgICBDcmVhdGVzIGEgbmV3IEJpbmRpbmcgaW5zdGFuY2UgYW5kIG1ha2VzIGl0IGFwcGx5IGlu
IGEgc2luZ2xlIGRpcmVjdGlvbi4KLSAgICBBIG9uZS13YXkgYmluZGluZyB3aWxsIHJlbGF5IGNo
YW5nZXMgb24gdGhlIGBmcm9tYCBzaWRlIG9iamVjdCAoc3VwcGxpZWQKLSAgICBhcyB0aGUgYGZy
b21gIGFyZ3VtZW50KSB0aGUgYHRvYCBzaWRlLCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5k
LgotICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgY2hhbmdlIHRoZSAidG8iIHNpZGUgZGlyZWN0
bHksIHRoZSAiZnJvbSIgc2lkZSBtYXkgaGF2ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgotCi0g
ICAgU2VlIGBCaW5kaW5nLm9uZVdheWAuCi0KLSAgICBAbWV0aG9kIG9uZVdheQotICAgIEBwYXJh
bSB7U3RyaW5nfSBmcm9tIGZyb20gcGF0aC4KLSAgICBAcGFyYW0ge0Jvb2xlYW59IFtmbGFnXSAo
T3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBoZXJlIHdpbGwgbWFrZSB0aGUKLSAgICAgIGJpbmRp
bmcgYG9uZVdheWAuIFlvdSBjYW4gaW5zdGVhZCBwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBgb25l
V2F5YCwgbWFraW5nIHRoZQotICAgICAgYmluZGluZyB0d28gd2F5IGFnYWluLgotICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBvbmVXYXk6IGZ1bmN0aW9uKGZyb20s
IGZsYWcpIHsKLSAgICB2YXIgQyA9IHRoaXMsIGJpbmRpbmcgPSBuZXcgQyhudWxsLCBmcm9tKTsK
LSAgICByZXR1cm4gYmluZGluZy5vbmVXYXkoZmxhZyk7Ci0gIH0KLQotfSk7Ci0KLS8qKgotICBB
biBgRW1iZXIuQmluZGluZ2AgY29ubmVjdHMgdGhlIHByb3BlcnRpZXMgb2YgdHdvIG9iamVjdHMg
c28gdGhhdCB3aGVuZXZlcgotICB0aGUgdmFsdWUgb2Ygb25lIHByb3BlcnR5IGNoYW5nZXMsIHRo
ZSBvdGhlciBwcm9wZXJ0eSB3aWxsIGJlIGNoYW5nZWQgYWxzby4KLQotICAjIyBBdXRvbWF0aWMg
Q3JlYXRpb24gb2YgQmluZGluZ3Mgd2l0aCBgL14qQmluZGluZy9gLW5hbWVkIFByb3BlcnRpZXMK
LQotICBZb3UgZG8gbm90IHVzdWFsbHkgY3JlYXRlIEJpbmRpbmcgb2JqZWN0cyBkaXJlY3RseSBi
dXQgaW5zdGVhZCBkZXNjcmliZQotICBiaW5kaW5ncyBpbiB5b3VyIGNsYXNzIG9yIG9iamVjdCBk
ZWZpbml0aW9uIHVzaW5nIGF1dG9tYXRpYyBiaW5kaW5nCi0gIGRldGVjdGlvbi4KLQotICBQcm9w
ZXJ0aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5nYCBzdWZmaXggd2lsbCBiZSBjb252ZXJ0ZWQgdG8g
YEVtYmVyLkJpbmRpbmdgCi0gIGluc3RhbmNlcy4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkg
c2hvdWxkIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBhdGgKLSAgdG8gYW5vdGhlciBvYmpl
Y3Qgb3IgYSBjdXN0b20gYmluZGluZyBpbnN0YW5jZWQgY3JlYXRlZCB1c2luZyBCaW5kaW5nIGhl
bHBlcnMKLSAgKHNlZSAiT25lIFdheSBCaW5kaW5ncyIpOgotCi0gIGBgYAotICB2YWx1ZUJpbmRp
bmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci50aXRsZSIKLSAgYGBgCi0KLSAgVGhpcyB3aWxsIGNy
ZWF0ZSBhIGJpbmRpbmcgZnJvbSBgTXlBcHAuc29tZUNvbnRyb2xsZXIudGl0bGVgIHRvIHRoZSBg
dmFsdWVgCi0gIHByb3BlcnR5IG9mIHlvdXIgb2JqZWN0IGluc3RhbmNlIGF1dG9tYXRpY2FsbHku
IE5vdyB0aGUgdHdvIHZhbHVlcyB3aWxsIGJlCi0gIGtlcHQgaW4gc3luYy4KLQotICAjIyBPbmUg
V2F5IEJpbmRpbmdzCi0KLSAgT25lIGVzcGVjaWFsbHkgdXNlZnVsIGJpbmRpbmcgY3VzdG9taXph
dGlvbiB5b3UgY2FuIHVzZSBpcyB0aGUgYG9uZVdheSgpYAotICBoZWxwZXIuIFRoaXMgaGVscGVy
IHRlbGxzIEVtYmVyIHRoYXQgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4KLSAgcmVjZWl2aW5n
IGNoYW5nZXMgb24gdGhlIG9iamVjdCB5b3UgYXJlIGJpbmRpbmcgZnJvbS4gRm9yIGV4YW1wbGUs
IGlmIHlvdQotICBhcmUgYmluZGluZyB0byBhIHByZWZlcmVuY2UgYW5kIHlvdSB3YW50IHRvIGJl
IG5vdGlmaWVkIGlmIHRoZSBwcmVmZXJlbmNlCi0gIGhhcyBjaGFuZ2VkLCBidXQgeW91ciBvYmpl
Y3Qgd2lsbCBub3QgYmUgY2hhbmdpbmcgdGhlIHByZWZlcmVuY2UgaXRzZWxmLCB5b3UKLSAgY291
bGQgZG86Ci0KLSAgYGBgCi0gIGJpZ1RpdGxlc0JpbmRpbmc6IEVtYmVyLkJpbmRpbmcub25lV2F5
KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzIikKLSAgYGBgCi0KLSAgVGhp
cyB3YXkgaWYgdGhlIHZhbHVlIG9mIGBNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0
bGVzYCBjaGFuZ2VzIHRoZQotICBgYmlnVGl0bGVzYCBwcm9wZXJ0eSBvZiB5b3VyIG9iamVjdCB3
aWxsIGNoYW5nZSBhbHNvLiBIb3dldmVyLCBpZiB5b3UKLSAgY2hhbmdlIHRoZSB2YWx1ZSBvZiB5
b3VyIGBiaWdUaXRsZXNgIHByb3BlcnR5LCBpdCB3aWxsIG5vdCB1cGRhdGUgdGhlCi0gIGBwcmVm
ZXJlbmNlc0NvbnRyb2xsZXJgLgotCi0gIE9uZSB3YXkgYmluZGluZ3MgYXJlIGFsbW9zdCB0d2lj
ZSBhcyBmYXN0IHRvIHNldHVwIGFuZCB0d2ljZSBhcyBmYXN0IHRvCi0gIGV4ZWN1dGUgYmVjYXVz
ZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3b3JyeSBhYm91dCBjaGFuZ2VzIHRvIG9uZSBzaWRl
LgotCi0gIFlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgb25lIHdheSBiaW5kaW5ncyBhbnl0aW1l
IHlvdSBoYXZlIGFuIG9iamVjdCB0aGF0Ci0gIG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5k
IHlvdSBkbyBub3QgaW50ZW5kIHRvIGNoYW5nZSBhIHByb3BlcnR5OyBvbmx5Ci0gIHRvIG1vbml0
b3IgaXQgZm9yIGNoYW5nZXMgKHN1Y2ggYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLgotCi0gICMj
IEFkZGluZyBCaW5kaW5ncyBNYW51YWxseQotCi0gIEFsbCBvZiB0aGUgZXhhbXBsZXMgYWJvdmUg
c2hvdyB5b3UgaG93IHRvIGNvbmZpZ3VyZSBhIGN1c3RvbSBiaW5kaW5nLCBidXQgdGhlCi0gIHJl
c3VsdCBvZiB0aGVzZSBjdXN0b21pemF0aW9ucyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwg
bm90IGEgZnVsbHkgYWN0aXZlCi0gIEJpbmRpbmcgaW5zdGFuY2UuIFRoZSBiaW5kaW5nIHdpbGwg
YWN0dWFsbHkgYmVjb21lIGFjdGl2ZSBvbmx5IHdoZW4geW91Ci0gIGluc3RhbnRpYXRlIHRoZSBv
YmplY3QgdGhlIGJpbmRpbmcgYmVsb25ncyB0by4gSXQgaXMgdXNlZnVsIGhvd2V2ZXIsIHRvCi0g
IHVuZGVyc3RhbmQgd2hhdCBhY3R1YWxseSBoYXBwZW5zIHdoZW4gdGhlIGJpbmRpbmcgaXMgYWN0
aXZhdGVkLgotCi0gIEZvciBhIGJpbmRpbmcgdG8gZnVuY3Rpb24gaXQgbXVzdCBoYXZlIGF0IGxl
YXN0IGEgYGZyb21gIHByb3BlcnR5IGFuZCBhIGB0b2AKLSAgcHJvcGVydHkuIFRoZSBgZnJvbWAg
cHJvcGVydHkgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9rZXkgdGhhdCB5b3Ugd2FudCB0bwot
ICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2AgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9rZXkg
eW91IHdhbnQgdG8gYmluZCB0by4KLQotICBXaGVuIHlvdSBkZWZpbmUgYSBjdXN0b20gYmluZGlu
ZywgeW91IGFyZSB1c3VhbGx5IGRlc2NyaWJpbmcgdGhlIHByb3BlcnR5Ci0gIHlvdSB3YW50IHRv
IGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWVgIGluIHRoZSBl
eGFtcGxlcwotICBhYm92ZSkuIFdoZW4geW91ciBvYmplY3QgaXMgY3JlYXRlZCwgaXQgd2lsbCBh
dXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgdmFsdWUKLSAgeW91IHdhbnQgdG8gYmluZCBgdG9gIGJh
c2VkIG9uIHRoZSBuYW1lIG9mIHlvdXIgYmluZGluZyBrZXkuIEluIHRoZQotICBleGFtcGxlcyBh
Ym92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9iamVjdHMgd2lsbCBlZmZlY3RpdmVseSBjYWxsCi0g
IHNvbWV0aGluZyBsaWtlIHRoaXMgb24geW91ciBiaW5kaW5nOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcuZnJvbSh0aGlzLnZhbHVlQmluZGluZykudG8oInZh
bHVlIik7Ci0gIGBgYAotCi0gIFRoaXMgY3JlYXRlcyBhIG5ldyBiaW5kaW5nIGluc3RhbmNlIGJh
c2VkIG9uIHRoZSB0ZW1wbGF0ZSB5b3UgcHJvdmlkZSwgYW5kCi0gIHNldHMgdGhlIHRvIHBhdGgg
dG8gdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2YgdGhlIG5ldyBvYmplY3QuIE5vdyB0aGF0IHRoZQot
ICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBp
dCBzaW1wbHkgbmVlZHMgdG8gYmUKLSAgY29ubmVjdGVkIHRvIGJlY29tZSBhY3RpdmUuIFRoaXMg
aXMgZG9uZSB0aHJvdWdoIHRoZSBgY29ubmVjdCgpYCBtZXRob2Q6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7Ci0gIGBgYAotCi0gIE5vdGUgdGhhdCB3aGVuIHlv
dSBjb25uZWN0IGEgYmluZGluZyB5b3UgcGFzcyB0aGUgb2JqZWN0IHlvdSB3YW50IGl0IHRvIGJl
Ci0gIGNvbm5lY3RlZCB0by4gVGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IGZv
ciBib3RoIHRoZSBmcm9tIGFuZAotICB0byBzaWRlIG9mIHRoZSBiaW5kaW5nIHdoZW4gaW5zcGVj
dGluZyByZWxhdGl2ZSBwYXRocy4gVGhpcyBhbGxvd3MgdGhlCi0gIGJpbmRpbmcgdG8gYmUgYXV0
b21hdGljYWxseSBpbmhlcml0ZWQgYnkgc3ViY2xhc3NlZCBvYmplY3RzIGFzIHdlbGwuCi0KLSAg
Tm93IHRoYXQgdGhlIGJpbmRpbmcgaXMgY29ubmVjdGVkLCBpdCB3aWxsIG9ic2VydmUgYm90aCB0
aGUgZnJvbSBhbmQgdG8gc2lkZQotICBhbmQgcmVsYXkgY2hhbmdlcy4KLQotICBJZiB5b3UgZXZl
ciBuZWVkZWQgdG8gZG8gc28gKHlvdSBhbG1vc3QgbmV2ZXIgd2lsbCwgYnV0IGl0IGlzIHVzZWZ1
bCB0bwotICB1bmRlcnN0YW5kIHRoaXMgYW55d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0
ZSBhbiBhY3RpdmUgYmluZGluZyBieQotICB1c2luZyB0aGUgYEVtYmVyLmJpbmQoKWAgaGVscGVy
IG1ldGhvZC4gKFRoaXMgaXMgdGhlIHNhbWUgbWV0aG9kIHVzZWQgYnkKLSAgdG8gc2V0dXAgeW91
ciBiaW5kaW5ncyBvbiBvYmplY3RzKToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmJpbmQo
TXlBcHAuYW5vdGhlck9iamVjdCwgInZhbHVlIiwgIk15QXBwLnNvbWVDb250cm9sbGVyLnZhbHVl
Iik7Ci0gIGBgYAotCi0gIEJvdGggb2YgdGhlc2UgY29kZSBmcmFnbWVudHMgaGF2ZSB0aGUgc2Ft
ZSBlZmZlY3QgYXMgZG9pbmcgdGhlIG1vc3QgZnJpZW5kbHkKLSAgZm9ybSBvZiBiaW5kaW5nIGNy
ZWF0aW9uIGxpa2Ugc286Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5hbm90aGVyT2JqZWN0
ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgdmFsdWVCaW5kaW5nOiAiTXlBcHAuc29tZUNv
bnRyb2xsZXIudmFsdWUiLAotCi0gICAgLy8gT1RIRVIgQ09ERSBGT1IgVEhJUyBPQkpFQ1QuLi4K
LSAgfSk7Ci0gIGBgYAotCi0gIEVtYmVyJ3MgYnVpbHQgaW4gYmluZGluZyBjcmVhdGlvbiBtZXRo
b2QgbWFrZXMgaXQgZWFzeSB0byBhdXRvbWF0aWNhbGx5Ci0gIGNyZWF0ZSBiaW5kaW5ncyBmb3Ig
eW91LiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIGhpZ2hlc3QtbGV2ZWwgQVBJcwotICBhdmFp
bGFibGUsIGV2ZW4gaWYgeW91IHVuZGVyc3RhbmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCi0K
LSAgQGNsYXNzIEJpbmRpbmcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc2luY2UgRW1iZXIgMC45
Ci0qLwotRW1iZXIuQmluZGluZyA9IEJpbmRpbmc7Ci0KLQotLyoqCi0gIEdsb2JhbCBoZWxwZXIg
bWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiBKdXN0IHBhc3MgdGhlIHJvb3Qgb2JqZWN0
Ci0gIGFsb25nIHdpdGggYSBgdG9gIGFuZCBgZnJvbWAgcGF0aCB0byBjcmVhdGUgYW5kIGNvbm5l
Y3QgdGhlIGJpbmRpbmcuCi0KLSAgQG1ldGhvZCBiaW5kCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHRyYW5zZm9ybS4KLSAgQHBhcmFt
IHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRvIHRoZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCi0g
ICAgTXVzdCBiZSByZWxhdGl2ZSB0byBvYmouCi0gIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBw
YXRoIHRvIHRoZSAnZnJvbScgc2lkZSBvZiB0aGUgYmluZGluZy4KLSAgICBNdXN0IGJlIHJlbGF0
aXZlIHRvIG9iaiBvciBhIGdsb2JhbCBwYXRoLgotICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBi
aW5kaW5nIGluc3RhbmNlCi0qLwotRW1iZXIuYmluZCA9IGZ1bmN0aW9uKG9iaiwgdG8sIGZyb20p
IHsKLSAgcmV0dXJuIG5ldyBFbWJlci5CaW5kaW5nKHRvLCBmcm9tKS5jb25uZWN0KG9iaik7Ci19
OwotCi0vKioKLSAgQG1ldGhvZCBvbmVXYXkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVj
dH0gb2JqIFRoZSByb290IG9iamVjdCBvZiB0aGUgdHJhbnNmb3JtLgotICBAcGFyYW0ge1N0cmlu
Z30gdG8gVGhlIHBhdGggdG8gdGhlICd0bycgc2lkZSBvZiB0aGUgYmluZGluZy4KLSAgICBNdXN0
IGJlIHJlbGF0aXZlIHRvIG9iai4KLSAgQHBhcmFtIHtTdHJpbmd9IGZyb20gVGhlIHBhdGggdG8g
dGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgotICAgIE11c3QgYmUgcmVsYXRpdmUgdG8g
b2JqIG9yIGEgZ2xvYmFsIHBhdGguCi0gIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGJpbmRpbmcg
aW5zdGFuY2UKLSovCi1FbWJlci5vbmVXYXkgPSBmdW5jdGlvbihvYmosIHRvLCBmcm9tKSB7Ci0g
IHJldHVybiBuZXcgRW1iZXIuQmluZGluZyh0bywgZnJvbSkub25lV2F5KCkuY29ubmVjdChvYmop
OwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIE1peGluLCBSRVFVSVJFRCwgQWxpYXMs
Ci0gICAgYV9tYXAgPSBFbWJlci5BcnJheVBvbHlmaWxscy5tYXAsCi0gICAgYV9pbmRleE9mID0g
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZiwKLSAgICBhX2ZvckVhY2ggPSBFbWJlci5BcnJh
eVBvbHlmaWxscy5mb3JFYWNoLAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAgICBvX2NyZWF0
ZSA9IEVtYmVyLmNyZWF0ZSwKLSAgICBkZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3Bl
cnR5LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOwotCi0KLWZ1bmN0aW9uIG1peGluc01l
dGEob2JqKSB7Ci0gIHZhciBtID0gRW1iZXIubWV0YShvYmosIHRydWUpLCByZXQgPSBtLm1peGlu
czsKLSAgaWYgKCFyZXQpIHsKLSAgICByZXQgPSBtLm1peGlucyA9IHt9OwotICB9IGVsc2UgaWYg
KCFtLmhhc093blByb3BlcnR5KCdtaXhpbnMnKSkgewotICAgIHJldCA9IG0ubWl4aW5zID0gb19j
cmVhdGUocmV0KTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1mdW5jdGlvbiBpbml0TWl4aW4o
bWl4aW4sIGFyZ3MpIHsKLSAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7Ci0gICAgbWl4
aW4ubWl4aW5zID0gYV9tYXAuY2FsbChhcmdzLCBmdW5jdGlvbih4KSB7Ci0gICAgICBpZiAoeCBp
bnN0YW5jZW9mIE1peGluKSB7IHJldHVybiB4OyB9Ci0KLSAgICAgIC8vIE5vdGU6IE1hbnVhbGx5
IHNldHVwIGEgcHJpbWl0aXZlIG1peGluIGhlcmUuIFRoaXMgaXMgdGhlIG9ubHkKLSAgICAgIC8v
IHdheSB0byBhY3R1YWxseSBnZXQgYSBwcmltaXRpdmUgbWl4aW4uIFRoaXMgd2F5IG5vcm1hbCBj
cmVhdGlvbgotICAgICAgLy8gb2YgbWl4aW5zIHdpbGwgZ2l2ZSB5b3UgY29tYmluZWQgbWl4aW5z
Li4uCi0gICAgICB2YXIgbWl4aW4gPSBuZXcgTWl4aW4oKTsKLSAgICAgIG1peGluLnByb3BlcnRp
ZXMgPSB4OwotICAgICAgcmV0dXJuIG1peGluOwotICAgIH0pOwotICB9Ci0gIHJldHVybiBtaXhp
bjsKLX0KLQotZnVuY3Rpb24gaXNNZXRob2Qob2JqKSB7Ci0gIHJldHVybiAnZnVuY3Rpb24nID09
PSB0eXBlb2Ygb2JqICYmCi0gICAgICAgICBvYmouaXNNZXRob2QgIT09IGZhbHNlICYmCi0gICAg
ICAgICBvYmogIT09IEJvb2xlYW4gJiYgb2JqICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIg
JiYgb2JqICE9PSBBcnJheSAmJiBvYmogIT09IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Ci19Ci0K
LXZhciBDT05USU5VRSA9IHt9OwotCi1mdW5jdGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0
YSwgbWl4aW4pIHsKLSAgdmFyIGd1aWQ7Ci0KLSAgaWYgKG1peGluIGluc3RhbmNlb2YgTWl4aW4p
IHsKLSAgICBndWlkID0gZ3VpZEZvcihtaXhpbik7Ci0gICAgaWYgKG1peGluc01ldGFbZ3VpZF0p
IHsgcmV0dXJuIENPTlRJTlVFOyB9Ci0gICAgbWl4aW5zTWV0YVtndWlkXSA9IG1peGluOwotICAg
IHJldHVybiBtaXhpbi5wcm9wZXJ0aWVzOwotICB9IGVsc2UgewotICAgIHJldHVybiBtaXhpbjsg
Ly8gYXBwbHkgYW5vbnltb3VzIG1peGluIHByb3BlcnRpZXMKLSAgfQotfQotCi1mdW5jdGlvbiBj
b25jYXRlbmF0ZWRNaXhpblByb3BlcnRpZXMoY29uY2F0UHJvcCwgcHJvcHMsIHZhbHVlcywgYmFz
ZSkgewotICB2YXIgY29uY2F0czsKLQotICAvLyByZXNldCBiZWZvcmUgYWRkaW5nIGVhY2ggbmV3
IG1peGluIHRvIHBpY2t1cCBjb25jYXRzIGZyb20gcHJldmlvdXMKLSAgY29uY2F0cyA9IHZhbHVl
c1tjb25jYXRQcm9wXSB8fCBiYXNlW2NvbmNhdFByb3BdOwotICBpZiAocHJvcHNbY29uY2F0UHJv
cF0pIHsKLSAgICBjb25jYXRzID0gY29uY2F0cyA/IGNvbmNhdHMuY29uY2F0KHByb3BzW2NvbmNh
dFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3BdOwotICB9Ci0KLSAgcmV0dXJuIGNvbmNhdHM7Ci19
Ci0KLWZ1bmN0aW9uIGdpdmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCBwcm9wZXJ0eSwgdmFs
dWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJQcm9wZXJ0eTsKLQotICAvLyBDb21wdXRlZCBwcm9w
ZXJ0aWVzIG92ZXJyaWRlIG1ldGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCi0g
IGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgLy8gRmluZCB0aGUgb3JpZ2lu
YWwgZGVzY3JpcHRvciBpbiBhIHBhcmVudCBtaXhpbgotICAgIHN1cGVyUHJvcGVydHkgPSBkZXNj
c1trZXldOwotICB9Ci0KLSAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIGRlc2Ny
aXB0b3IgaW4gYSBwYXJlbnQgbWl4aW4sIGZpbmQKLSAgLy8gaXQgb24gdGhlIG9yaWdpbmFsIG9i
amVjdC4KLSAgc3VwZXJQcm9wZXJ0eSA9IHN1cGVyUHJvcGVydHkgfHwgbWV0YS5kZXNjc1trZXld
OwotCi0gIGlmICghc3VwZXJQcm9wZXJ0eSB8fCAhKHN1cGVyUHJvcGVydHkgaW5zdGFuY2VvZiBF
bWJlci5Db21wdXRlZFByb3BlcnR5KSkgewotICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgfQotCi0g
IC8vIFNpbmNlIG11bHRpcGxlIG1peGlucyBtYXkgaW5oZXJpdCBmcm9tIHRoZSBzYW1lIHBhcmVu
dCwgd2UgbmVlZAotICAvLyB0byBjbG9uZSB0aGUgY29tcHV0ZWQgcHJvcGVydHkgc28gdGhhdCBv
dGhlciBtaXhpbnMgZG8gbm90IHJlY2VpdmUKLSAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KLSAg
cHJvcGVydHkgPSBvX2NyZWF0ZShwcm9wZXJ0eSk7Ci0gIHByb3BlcnR5LmZ1bmMgPSBFbWJlci53
cmFwKHByb3BlcnR5LmZ1bmMsIHN1cGVyUHJvcGVydHkuZnVuYyk7Ci0KLSAgcmV0dXJuIHByb3Bl
cnR5OwotfQotCi1mdW5jdGlvbiBnaXZlTWV0aG9kU3VwZXIob2JqLCBrZXksIG1ldGhvZCwgdmFs
dWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJNZXRob2Q7Ci0KLSAgLy8gTWV0aG9kcyBvdmVyd3Jp
dGUgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCi0g
IGlmIChkZXNjc1trZXldID09PSB1bmRlZmluZWQpIHsKLSAgICAvLyBGaW5kIHRoZSBvcmlnaW5h
bCBtZXRob2QgaW4gYSBwYXJlbnQgbWl4aW4KLSAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXld
OwotICB9Ci0KLSAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIHZhbHVlIGluIGEg
cGFyZW50IG1peGluLCBmaW5kIGl0IGluCi0gIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QKLSAgc3Vw
ZXJNZXRob2QgPSBzdXBlck1ldGhvZCB8fCBvYmpba2V5XTsKLQotICAvLyBPbmx5IHdyYXAgdGhl
IG5ldyBtZXRob2QgaWYgdGhlIG9yaWdpbmFsIG1ldGhvZCB3YXMgYSBmdW5jdGlvbgotICBpZiAo
J2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHN1cGVyTWV0aG9kKSB7Ci0gICAgcmV0dXJuIG1ldGhvZDsK
LSAgfQotCi0gIHJldHVybiBFbWJlci53cmFwKG1ldGhvZCwgc3VwZXJNZXRob2QpOwotfQotCi1m
dW5jdGlvbiBhcHBseUNvbmNhdGVuYXRlZFByb3BlcnRpZXMob2JqLCBrZXksIHZhbHVlLCB2YWx1
ZXMpIHsKLSAgdmFyIGJhc2VWYWx1ZSA9IHZhbHVlc1trZXldIHx8IG9ialtrZXldOwotCi0gIGlm
IChiYXNlVmFsdWUpIHsKLSAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VWYWx1ZS5j
b25jYXQpIHsKLSAgICAgIHJldHVybiBiYXNlVmFsdWUuY29uY2F0KHZhbHVlKTsKLSAgICB9IGVs
c2UgewotICAgICAgcmV0dXJuIEVtYmVyLm1ha2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1
ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXkodmFsdWUp
OwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5TWVyZ2VkUHJvcGVydGllcyhvYmosIGtleSwgdmFs
dWUsIHZhbHVlcykgewotICB2YXIgYmFzZVZhbHVlID0gdmFsdWVzW2tleV0gfHwgb2JqW2tleV07
Ci0KLSAgaWYgKCFiYXNlVmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9Ci0KLSAgdmFyIG5ld0Jhc2Ug
PSBFbWJlci5tZXJnZSh7fSwgYmFzZVZhbHVlKTsKLSAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkg
ewotICAgIGlmICghdmFsdWUuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLQot
ICAgIHZhciBwcm9wVmFsdWUgPSB2YWx1ZVtwcm9wXTsKLSAgICBpZiAoaXNNZXRob2QocHJvcFZh
bHVlKSkgewotICAgICAgLy8gVE9ETzogc3VwcG9ydCBmb3IgQ29tcHV0ZWQgUHJvcGVydGllcywg
ZXRjPwotICAgICAgbmV3QmFzZVtwcm9wXSA9IGdpdmVNZXRob2RTdXBlcihvYmosIHByb3AsIHBy
b3BWYWx1ZSwgYmFzZVZhbHVlLCB7fSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5ld0Jhc2VbcHJv
cF0gPSBwcm9wVmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5ld0Jhc2U7Ci19Ci0KLWZ1
bmN0aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHZhbHVlLCBtZXRhLCBkZXNj
cywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncykgewotICBpZiAodmFsdWUgaW5zdGFuY2VvZiBF
bWJlci5EZXNjcmlwdG9yKSB7Ci0gICAgaWYgKHZhbHVlID09PSBSRVFVSVJFRCAmJiBkZXNjc1tr
ZXldKSB7IHJldHVybiBDT05USU5VRTsgfQotCi0gICAgLy8gV3JhcCBkZXNjcmlwdG9yIGZ1bmN0
aW9uIHRvIGltcGxlbWVudAotICAgIC8vIF9zdXBlcigpIGlmIG5lZWRlZAotICAgIGlmICh2YWx1
ZS5mdW5jKSB7Ci0gICAgICB2YWx1ZSA9IGdpdmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCB2
YWx1ZSwgdmFsdWVzLCBkZXNjcyk7Ci0gICAgfQotCi0gICAgZGVzY3Nba2V5XSAgPSB2YWx1ZTsK
LSAgICB2YWx1ZXNba2V5XSA9IHVuZGVmaW5lZDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKGNvbmNh
dHMgJiYgYV9pbmRleE9mLmNhbGwoY29uY2F0cywga2V5KSA+PSAwKSB8fAotICAgICAgICAgICAg
ICAgIGtleSA9PT0gJ2NvbmNhdGVuYXRlZFByb3BlcnRpZXMnIHx8Ci0gICAgICAgICAgICAgICAg
a2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycpIHsKLSAgICAgIHZhbHVlID0gYXBwbHlDb25jYXRl
bmF0ZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7Ci0gICAgfSBlbHNlIGlm
ICgobWVyZ2luZ3MgJiYgYV9pbmRleE9mLmNhbGwobWVyZ2luZ3MsIGtleSkgPj0gMCkpIHsKLSAg
ICAgIHZhbHVlID0gYXBwbHlNZXJnZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVl
cyk7Ci0gICAgfSBlbHNlIGlmIChpc01ldGhvZCh2YWx1ZSkpIHsKLSAgICAgIHZhbHVlID0gZ2l2
ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVzY3MpOwotICAgIH0KLQot
ICAgIGRlc2NzW2tleV0gPSB1bmRlZmluZWQ7Ci0gICAgdmFsdWVzW2tleV0gPSB2YWx1ZTsKLSAg
fQotfQotCi1mdW5jdGlvbiBtZXJnZU1peGlucyhtaXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJh
c2UsIGtleXMpIHsKLSAgdmFyIG1peGluLCBwcm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywg
bWV0YTsKLQotICBmdW5jdGlvbiByZW1vdmVLZXlzKGtleU5hbWUpIHsKLSAgICBkZWxldGUgZGVz
Y3Nba2V5TmFtZV07Ci0gICAgZGVsZXRlIHZhbHVlc1trZXlOYW1lXTsKLSAgfQotCi0gIGZvcih2
YXIgaT0wLCBsPW1peGlucy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgbWl4aW4gPSBtaXhpbnNb
aV07Ci0gICAgRW1iZXIuYXNzZXJ0KCdFeHBlY3RlZCBoYXNoIG9yIE1peGluIGluc3RhbmNlLCBn
b3QgJyArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtaXhpbiksCi0gICAgICAgICAg
ICAgICAgIHR5cGVvZiBtaXhpbiA9PT0gJ29iamVjdCcgJiYgbWl4aW4gIT09IG51bGwgJiYgT2Jq
ZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7
Ci0KLSAgICBwcm9wcyA9IG1peGluUHJvcGVydGllcyhtLCBtaXhpbik7Ci0gICAgaWYgKHByb3Bz
ID09PSBDT05USU5VRSkgeyBjb250aW51ZTsgfQotCi0gICAgaWYgKHByb3BzKSB7Ci0gICAgICBt
ZXRhID0gRW1iZXIubWV0YShiYXNlKTsKLSAgICAgIGlmIChiYXNlLndpbGxNZXJnZU1peGluKSB7
IGJhc2Uud2lsbE1lcmdlTWl4aW4ocHJvcHMpOyB9Ci0gICAgICBjb25jYXRzID0gY29uY2F0ZW5h
dGVkTWl4aW5Qcm9wZXJ0aWVzKCdjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzJywgcHJvcHMsIHZhbHVl
cywgYmFzZSk7Ci0gICAgICBtZXJnaW5ncyA9IGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcygn
bWVyZ2VkUHJvcGVydGllcycsIHByb3BzLCB2YWx1ZXMsIGJhc2UpOwotCi0gICAgICBmb3IgKGtl
eSBpbiBwcm9wcykgewotICAgICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsg
Y29udGludWU7IH0KLSAgICAgICAga2V5cy5wdXNoKGtleSk7Ci0gICAgICAgIGFkZE5vcm1hbGl6
ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHByb3BzW2tleV0sIG1ldGEsIGRlc2NzLCB2YWx1ZXMsIGNv
bmNhdHMsIG1lcmdpbmdzKTsKLSAgICAgIH0KLQotICAgICAgLy8gbWFudWFsbHkgY29weSB0b1N0
cmluZygpIGJlY2F1c2Ugc29tZSBKUyBlbmdpbmVzIGRvIG5vdCBlbnVtZXJhdGUgaXQKLSAgICAg
IGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkgeyBiYXNlLnRvU3RyaW5nID0g
cHJvcHMudG9TdHJpbmc7IH0KLSAgICB9IGVsc2UgaWYgKG1peGluLm1peGlucykgewotICAgICAg
bWVyZ2VNaXhpbnMobWl4aW4ubWl4aW5zLCBtLCBkZXNjcywgdmFsdWVzLCBiYXNlLCBrZXlzKTsK
LSAgICAgIGlmIChtaXhpbi5fd2l0aG91dCkgeyBhX2ZvckVhY2guY2FsbChtaXhpbi5fd2l0aG91
dCwgcmVtb3ZlS2V5cyk7IH0KLSAgICB9Ci0gIH0KLX0KLQotdmFyIElTX0JJTkRJTkcgPSBFbWJl
ci5JU19CSU5ESU5HID0gL14uK0JpbmRpbmckLzsKLQotZnVuY3Rpb24gZGV0ZWN0QmluZGluZyhv
YmosIGtleSwgdmFsdWUsIG0pIHsKLSAgaWYgKElTX0JJTkRJTkcudGVzdChrZXkpKSB7Ci0gICAg
dmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsKLSAgICBpZiAoIWJpbmRpbmdzKSB7Ci0gICAgICBi
aW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsKLSAgICB9IGVsc2UgaWYgKCFtLmhhc093blByb3Bl
cnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSBvX2NyZWF0
ZShtLmJpbmRpbmdzKTsKLSAgICB9Ci0gICAgYmluZGluZ3Nba2V5XSA9IHZhbHVlOwotICB9Ci19
Ci0KLWZ1bmN0aW9uIGNvbm5lY3RCaW5kaW5ncyhvYmosIG0pIHsKLSAgLy8gVE9ETyBNaXhpbi5h
cHBseShpbnN0YW5jZSkgc2hvdWxkIGRpc2Nvbm5lY3QgYmluZGluZyBpZiBleGlzdHMKLSAgdmFy
IGJpbmRpbmdzID0gbS5iaW5kaW5ncywga2V5LCBiaW5kaW5nLCB0bzsKLSAgaWYgKGJpbmRpbmdz
KSB7Ci0gICAgZm9yIChrZXkgaW4gYmluZGluZ3MpIHsKLSAgICAgIGJpbmRpbmcgPSBiaW5kaW5n
c1trZXldOwotICAgICAgaWYgKGJpbmRpbmcpIHsKLSAgICAgICAgdG8gPSBrZXkuc2xpY2UoMCwg
LTcpOyAvLyBzdHJpcCBCaW5kaW5nIG9mZiBlbmQKLSAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFu
Y2VvZiBFbWJlci5CaW5kaW5nKSB7Ci0gICAgICAgICAgYmluZGluZyA9IGJpbmRpbmcuY29weSgp
OyAvLyBjb3B5IHByb3RvdHlwZXMnIGluc3RhbmNlCi0gICAgICAgICAgYmluZGluZy50byh0byk7
Ci0gICAgICAgIH0gZWxzZSB7IC8vIGJpbmRpbmcgaXMgc3RyaW5nIHBhdGgKLSAgICAgICAgICBi
aW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmcodG8sIGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAg
ICAgIGJpbmRpbmcuY29ubmVjdChvYmopOwotICAgICAgICBvYmpba2V5XSA9IGJpbmRpbmc7Ci0g
ICAgICB9Ci0gICAgfQotICAgIC8vIG1hcmsgYXMgYXBwbGllZAotICAgIG0uYmluZGluZ3MgPSB7
fTsKLSAgfQotfQotCi1mdW5jdGlvbiBmaW5pc2hQYXJ0aWFsKG9iaiwgbSkgewotICBjb25uZWN0
QmluZGluZ3Mob2JqLCBtIHx8IEVtYmVyLm1ldGEob2JqKSk7Ci0gIHJldHVybiBvYmo7Ci19Ci0K
LWZ1bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcykgewotICB2
YXIgYWx0S2V5ID0gZGVzYy5tZXRob2ROYW1lLCB2YWx1ZTsKLSAgaWYgKGRlc2NzW2FsdEtleV0g
fHwgdmFsdWVzW2FsdEtleV0pIHsKLSAgICB2YWx1ZSA9IHZhbHVlc1thbHRLZXldOwotICAgIGRl
c2MgID0gZGVzY3NbYWx0S2V5XTsKLSAgfSBlbHNlIGlmIChtLmRlc2NzW2FsdEtleV0pIHsKLSAg
ICBkZXNjICA9IG0uZGVzY3NbYWx0S2V5XTsKLSAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKLSAgfSBl
bHNlIHsKLSAgICBkZXNjID0gdW5kZWZpbmVkOwotICAgIHZhbHVlID0gb2JqW2FsdEtleV07Ci0g
IH0KLQotICByZXR1cm4geyBkZXNjOiBkZXNjLCB2YWx1ZTogdmFsdWUgfTsKLX0KLQotZnVuY3Rp
b24gdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVu
ZXIsIHBhdGhzS2V5LCB1cGRhdGVNZXRob2QpIHsKLSAgdmFyIHBhdGhzID0gb2JzZXJ2ZXJPckxp
c3RlbmVyW3BhdGhzS2V5XTsKLQotICBpZiAocGF0aHMpIHsKLSAgICBmb3IgKHZhciBpPTAsIGw9
cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgRW1iZXJbdXBkYXRlTWV0aG9kXShvYmos
IHBhdGhzW2ldLCBudWxsLCBrZXkpOwotICAgIH0KLSAgfQotfQotCi1mdW5jdGlvbiByZXBsYWNl
T2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIpIHsKLSAg
dmFyIHByZXYgPSBvYmpba2V5XTsKLQotICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHByZXYp
IHsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2Vt
YmVyX29ic2VydmVzQmVmb3JlX18nLCAncmVtb3ZlQmVmb3JlT2JzZXJ2ZXInKTsKLSAgICB1cGRh
dGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVz
X18nLCAncmVtb3ZlT2JzZXJ2ZXInKTsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMo
b2JqLCBrZXksIHByZXYsICdfX2VtYmVyX2xpc3RlbnNfXycsICdyZW1vdmVMaXN0ZW5lcicpOwot
ICB9Ci0KLSAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYnNlcnZlck9yTGlzdGVuZXIpIHsK
LSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0
ZW5lciwgJ19fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXycsICdhZGRCZWZvcmVPYnNlcnZlcicpOwot
ICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3Rl
bmVyLCAnX19lbWJlcl9vYnNlcnZlc19fJywgJ2FkZE9ic2VydmVyJyk7Ci0gICAgdXBkYXRlT2Jz
ZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVy
X2xpc3RlbnNfXycsICdhZGRMaXN0ZW5lcicpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5TWl4
aW4ob2JqLCBtaXhpbnMsIHBhcnRpYWwpIHsKLSAgdmFyIGRlc2NzID0ge30sIHZhbHVlcyA9IHt9
LCBtID0gRW1iZXIubWV0YShvYmopLAotICAgICAga2V5LCB2YWx1ZSwgZGVzYywga2V5cyA9IFtd
OwotCi0gIC8vIEdvIHRocm91Z2ggYWxsIG1peGlucyBhbmQgaGFzaGVzIHBhc3NlZCBpbiwgYW5k
OgotICAvLwotICAvLyAqIEhhbmRsZSBjb25jYXRlbmF0ZWQgcHJvcGVydGllcwotICAvLyAqIEhh
bmRsZSBtZXJnZWQgcHJvcGVydGllcwotICAvLyAqIFNldCB1cCBfc3VwZXIgd3JhcHBpbmcgaWYg
bmVjZXNzYXJ5Ci0gIC8vICogU2V0IHVwIGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCi0g
IC8vICogQ29weWluZyBgdG9TdHJpbmdgIGluIGJyb2tlbiBicm93c2VycwotICBtZXJnZU1peGlu
cyhtaXhpbnMsIG1peGluc01ldGEob2JqKSwgZGVzY3MsIHZhbHVlcywgb2JqLCBrZXlzKTsKLQot
ICBmb3IodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBrZXkg
PSBrZXlzW2ldOwotICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwgIXZhbHVlcy5oYXNP
d25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICBkZXNjID0gZGVzY3Nba2V5XTsK
LSAgICB2YWx1ZSA9IHZhbHVlc1trZXldOwotCi0gICAgaWYgKGRlc2MgPT09IFJFUVVJUkVEKSB7
IGNvbnRpbnVlOyB9Ci0KLSAgICB3aGlsZSAoZGVzYyAmJiBkZXNjIGluc3RhbmNlb2YgQWxpYXMp
IHsKLSAgICAgIHZhciBmb2xsb3dlZCA9IGZvbGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3Ms
IHZhbHVlcyk7Ci0gICAgICBkZXNjID0gZm9sbG93ZWQuZGVzYzsKLSAgICAgIHZhbHVlID0gZm9s
bG93ZWQudmFsdWU7Ci0gICAgfQotCi0gICAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiB2YWx1
ZSA9PT0gdW5kZWZpbmVkKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICByZXBsYWNlT2JzZXJ2ZXJzQW5k
TGlzdGVuZXJzKG9iaiwga2V5LCB2YWx1ZSk7Ci0gICAgZGV0ZWN0QmluZGluZyhvYmosIGtleSwg
dmFsdWUsIG0pOwotICAgIGRlZmluZVByb3BlcnR5KG9iaiwga2V5LCBkZXNjLCB2YWx1ZSwgbSk7
Ci0gIH0KLQotICBpZiAoIXBhcnRpYWwpIHsgLy8gZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBlCi0g
ICAgZmluaXNoUGFydGlhbChvYmosIG0pOwotICB9Ci0KLSAgcmV0dXJuIG9iajsKLX0KLQotLyoq
Ci0gIEBtZXRob2QgbWl4aW4KLSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSBt
aXhpbnMqCi0gIEByZXR1cm4gb2JqCi0qLwotRW1iZXIubWl4aW4gPSBmdW5jdGlvbihvYmopIHsK
LSAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgYXBwbHlNaXhpbihv
YmosIGFyZ3MsIGZhbHNlKTsKLSAgcmV0dXJuIG9iajsKLX07Ci0KLS8qKgotICBUaGUgYEVtYmVy
Lk1peGluYCBjbGFzcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtaXhpbnMsIHdob3NlIHByb3BlcnRp
ZXMgY2FuIGJlCi0gIGFkZGVkIHRvIG90aGVyIGNsYXNzZXMuIEZvciBpbnN0YW5jZSwKLQotICBg
YGBqYXZhc2NyaXB0Ci0gIEFwcC5FZGl0YWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAg
ZWRpdDogZnVuY3Rpb24oKSB7Ci0gICAgICBjb25zb2xlLmxvZygnc3RhcnRpbmcgdG8gZWRpdCcp
OwotICAgICAgdGhpcy5zZXQoJ2lzRWRpdGluZycsIHRydWUpOwotICAgIH0sCi0gICAgaXNFZGl0
aW5nOiBmYWxzZQotICB9KTsKLQotICAvLyBNaXggbWl4aW5zIGludG8gY2xhc3NlcyBieSBwYXNz
aW5nIHRoZW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyB0bwotICAvLyAuZXh0ZW5kLgotICBBcHAu
Q29tbWVudFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChBcHAuRWRpdGFibGUsIHsKLSAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCd7eyNpZiB2aWV3LmlzRWRpdGluZ319Li4u
e3tlbHNlfX0uLi57ey9pZn19JykKLSAgfSk7Ci0KLSAgY29tbWVudFZpZXcgPSBBcHAuQ29tbWVu
dFZpZXcuY3JlYXRlKCk7Ci0gIGNvbW1lbnRWaWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRp
bmcgdG8gZWRpdCcKLSAgYGBgCi0KLSAgTm90ZSB0aGF0IE1peGlucyBhcmUgY3JlYXRlZCB3aXRo
IGBFbWJlci5NaXhpbi5jcmVhdGVgLCBub3QKLSAgYEVtYmVyLk1peGluLmV4dGVuZGAuCi0KLSAg
Tm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSBzbyBhcnJh
eXMgYW5kIG9iamVjdCBsaXRlcmFscwotICBkZWZpbmVkIGFzIHByb3BlcnRpZXMgd2lsbCBiZSBz
aGFyZWQgYW1vbmdzdCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBtaXhpbi4KLSAgSWYgeW91
IHdhbnQgdG8gZGVmaW5lIGFuIHByb3BlcnR5IGluIGEgbWl4aW4gdGhhdCBpcyBub3Qgc2hhcmVk
LCB5b3UgY2FuIGRlZmluZQotICBpdCBlaXRoZXIgYXMgYSBjb21wdXRlZCBwcm9wZXJ0eSBvciBo
YXZlIGl0IGJlIGNyZWF0ZWQgb24gaW5pdGlhbGl6YXRpb24gb2YgdGhlIG9iamVjdC4KLQotICBg
YGBqYXZhc2NyaXB0Ci0gIC8vZmlsdGVycyBhcnJheSB3aWxsIGJlIHNoYXJlZCBhbW9uZ3N0IGFu
eSBvYmplY3QgaW1wbGVtZW50aW5nIG1peGluCi0gIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4
aW4uY3JlYXRlKHsKLSAgICBmaWx0ZXJzOiBFbWJlci5BKCkKLSAgfSk7Ci0KLSAgLy9maWx0ZXJz
IHdpbGwgYmUgYSBzZXBhcmF0ZSAgYXJyYXkgZm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcg
dGhlIG1peGluCi0gIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICBm
aWx0ZXJzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3JldHVybiBFbWJlci5BKCk7fSkKLSAg
fSk7Ci0KLSAgLy9maWx0ZXJzIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNlcGFyYXRlIGFycmF5IGR1
cmluZyB0aGUgb2JqZWN0J3MgaW5pdGlhbGl6YXRpb24KLSAgQXBwLkZpbHRlcmFibGUgPSBFbWJl
ci5NaXhpbi5jcmVhdGUoewotICAgIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5fc3Vw
ZXIoKTsKLSAgICAgIHRoaXMuc2V0KCJmaWx0ZXJzIiwgRW1iZXIuQSgpKTsKLSAgICB9Ci0gIH0p
OwotICBgYGAKLQotICBAY2xhc3MgTWl4aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVy
Lk1peGluID0gZnVuY3Rpb24oKSB7IHJldHVybiBpbml0TWl4aW4odGhpcywgYXJndW1lbnRzKTsg
fTsKLQotTWl4aW4gPSBFbWJlci5NaXhpbjsKLQotTWl4aW4ucHJvdG90eXBlID0gewotICBwcm9w
ZXJ0aWVzOiBudWxsLAotICBtaXhpbnM6IG51bGwsCi0gIG93bmVyQ29uc3RydWN0b3I6IG51bGwK
LX07Ci0KLU1peGluLl9hcHBseSA9IGFwcGx5TWl4aW47Ci0KLU1peGluLmFwcGx5UGFydGlhbCA9
IGZ1bmN0aW9uKG9iaikgewotICB2YXIgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEp
OwotICByZXR1cm4gYXBwbHlNaXhpbihvYmosIGFyZ3MsIHRydWUpOwotfTsKLQotTWl4aW4uZmlu
aXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7Ci0KLUVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5z
ID0gZmFsc2U7Ci0KLS8qKgotICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBh
cmd1bWVudHMqCi0qLwotTWl4aW4uY3JlYXRlID0gZnVuY3Rpb24oKSB7Ci0gIEVtYmVyLmFueVVu
cHJvY2Vzc2VkTWl4aW5zID0gdHJ1ZTsKLSAgdmFyIE0gPSB0aGlzOwotICByZXR1cm4gaW5pdE1p
eGluKG5ldyBNKCksIGFyZ3VtZW50cyk7Ci19OwotCi12YXIgTWl4aW5Qcm90b3R5cGUgPSBNaXhp
bi5wcm90b3R5cGU7Ci0KLS8qKgotICBAbWV0aG9kIHJlb3BlbgotICBAcGFyYW0gYXJndW1lbnRz
KgotKi8KLU1peGluUHJvdG90eXBlLnJlb3BlbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgbWl4aW4s
IHRtcDsKLQotICBpZiAodGhpcy5wcm9wZXJ0aWVzKSB7Ci0gICAgbWl4aW4gPSBNaXhpbi5jcmVh
dGUoKTsKLSAgICBtaXhpbi5wcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzOwotICAgIGRlbGV0
ZSB0aGlzLnByb3BlcnRpZXM7Ci0gICAgdGhpcy5taXhpbnMgPSBbbWl4aW5dOwotICB9IGVsc2Ug
aWYgKCF0aGlzLm1peGlucykgewotICAgIHRoaXMubWl4aW5zID0gW107Ci0gIH0KLQotICB2YXIg
bGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWl4aW5zID0gdGhpcy5taXhpbnMsIGlkeDsKLQotICBm
b3IoaWR4PTA7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBtaXhpbiA9IGFyZ3VtZW50c1tpZHhd
OwotICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290
ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWl4aW4pLAotICAgICAgICAgICAg
ICAgICB0eXBlb2YgbWl4aW4gPT09ICdvYmplY3QnICYmIG1peGluICE9PSBudWxsICYmIE9iamVj
dC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtaXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOwot
Ci0gICAgaWYgKG1peGluIGluc3RhbmNlb2YgTWl4aW4pIHsKLSAgICAgIG1peGlucy5wdXNoKG1p
eGluKTsKLSAgICB9IGVsc2UgewotICAgICAgdG1wID0gTWl4aW4uY3JlYXRlKCk7Ci0gICAgICB0
bXAucHJvcGVydGllcyA9IG1peGluOwotICAgICAgbWl4aW5zLnB1c2godG1wKTsKLSAgICB9Ci0g
IH0KLQotICByZXR1cm4gdGhpczsKLX07Ci0KLS8qKgotICBAbWV0aG9kIGFwcGx5Ci0gIEBwYXJh
bSBvYmoKLSAgQHJldHVybiBhcHBsaWVkIG9iamVjdAotKi8KLU1peGluUHJvdG90eXBlLmFwcGx5
ID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVybiBhcHBseU1peGluKG9iaiwgW3RoaXNdLCBmYWxz
ZSk7Ci19OwotCi1NaXhpblByb3RvdHlwZS5hcHBseVBhcnRpYWwgPSBmdW5jdGlvbihvYmopIHsK
LSAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBbdGhpc10sIHRydWUpOwotfTsKLQotZnVuY3Rpb24g
X2RldGVjdChjdXJNaXhpbiwgdGFyZ2V0TWl4aW4sIHNlZW4pIHsKLSAgdmFyIGd1aWQgPSBndWlk
Rm9yKGN1ck1peGluKTsKLQotICBpZiAoc2VlbltndWlkXSkgeyByZXR1cm4gZmFsc2U7IH0KLSAg
c2VlbltndWlkXSA9IHRydWU7Ci0KLSAgaWYgKGN1ck1peGluID09PSB0YXJnZXRNaXhpbikgeyBy
ZXR1cm4gdHJ1ZTsgfQotICB2YXIgbWl4aW5zID0gY3VyTWl4aW4ubWl4aW5zLCBsb2MgPSBtaXhp
bnMgPyBtaXhpbnMubGVuZ3RoIDogMDsKLSAgd2hpbGUgKC0tbG9jID49IDApIHsKLSAgICBpZiAo
X2RldGVjdChtaXhpbnNbbG9jXSwgdGFyZ2V0TWl4aW4sIHNlZW4pKSB7IHJldHVybiB0cnVlOyB9
Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAgQG1ldGhvZCBkZXRlY3QKLSAgQHBh
cmFtIG9iagotICBAcmV0dXJuIHtCb29sZWFufQotKi8KLU1peGluUHJvdG90eXBlLmRldGVjdCA9
IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9iaikgeyByZXR1cm4gZmFsc2U7IH0KLSAgaWYgKG9i
aiBpbnN0YW5jZW9mIE1peGluKSB7IHJldHVybiBfZGV0ZWN0KG9iaiwgdGhpcywge30pOyB9Ci0g
IHZhciBtaXhpbnMgPSBFbWJlci5tZXRhKG9iaiwgZmFsc2UpLm1peGluczsKLSAgaWYgKG1peGlu
cykgewotICAgIHJldHVybiAhIW1peGluc1tndWlkRm9yKHRoaXMpXTsKLSAgfQotICByZXR1cm4g
ZmFsc2U7Ci19OwotCi1NaXhpblByb3RvdHlwZS53aXRob3V0ID0gZnVuY3Rpb24oKSB7Ci0gIHZh
ciByZXQgPSBuZXcgTWl4aW4odGhpcyk7Ci0gIHJldC5fd2l0aG91dCA9IGFfc2xpY2UuY2FsbChh
cmd1bWVudHMpOwotICByZXR1cm4gcmV0OwotfTsKLQotZnVuY3Rpb24gX2tleXMocmV0LCBtaXhp
biwgc2VlbikgewotICBpZiAoc2VlbltndWlkRm9yKG1peGluKV0pIHsgcmV0dXJuOyB9Ci0gIHNl
ZW5bZ3VpZEZvcihtaXhpbildID0gdHJ1ZTsKLQotICBpZiAobWl4aW4ucHJvcGVydGllcykgewot
ICAgIHZhciBwcm9wcyA9IG1peGluLnByb3BlcnRpZXM7Ci0gICAgZm9yICh2YXIga2V5IGluIHBy
b3BzKSB7Ci0gICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyByZXRba2V5XSA9
IHRydWU7IH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAobWl4aW4ubWl4aW5zKSB7Ci0gICAgYV9mb3JF
YWNoLmNhbGwobWl4aW4ubWl4aW5zLCBmdW5jdGlvbih4KSB7IF9rZXlzKHJldCwgeCwgc2Vlbik7
IH0pOwotICB9Ci19Ci0KLU1peGluUHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKLSAgdmFy
IGtleXMgPSB7fSwgc2VlbiA9IHt9LCByZXQgPSBbXTsKLSAgX2tleXMoa2V5cywgdGhpcywgc2Vl
bik7Ci0gIGZvcih2YXIga2V5IGluIGtleXMpIHsKLSAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0
eShrZXkpKSB7IHJldC5wdXNoKGtleSk7IH0KLSAgfQotICByZXR1cm4gcmV0OwotfTsKLQotLy8g
cmV0dXJucyB0aGUgbWl4aW5zIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSBzcGVjaWZpZWQgb2Jq
ZWN0Ci0vLyBUT0RPOiBNYWtlIEVtYmVyLm1peGluCi1NaXhpbi5taXhpbnMgPSBmdW5jdGlvbihv
YmopIHsKLSAgdmFyIG1peGlucyA9IEVtYmVyLm1ldGEob2JqLCBmYWxzZSkubWl4aW5zLCByZXQg
PSBbXTsKLQotICBpZiAoIW1peGlucykgeyByZXR1cm4gcmV0OyB9Ci0KLSAgZm9yICh2YXIga2V5
IGluIG1peGlucykgewotICAgIHZhciBtaXhpbiA9IG1peGluc1trZXldOwotCi0gICAgLy8gc2tp
cCBwcmltaXRpdmUgbWl4aW5zIHNpbmNlIHRoZXNlIGFyZSBhbHdheXMgYW5vbnltb3VzCi0gICAg
aWYgKCFtaXhpbi5wcm9wZXJ0aWVzKSB7IHJldC5wdXNoKG1peGluKTsgfQotICB9Ci0KLSAgcmV0
dXJuIHJldDsKLX07Ci0KLVJFUVVJUkVEID0gbmV3IEVtYmVyLkRlc2NyaXB0b3IoKTsKLVJFUVVJ
UkVELnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAnKFJlcXVpcmVkIFByb3BlcnR5KSc7
IH07Ci0KLS8qKgotICBEZW5vdGVzIGEgcmVxdWlyZWQgcHJvcGVydHkgZm9yIGEgbWl4aW4KLQot
ICBAbWV0aG9kIHJlcXVpcmVkCi0gIEBmb3IgRW1iZXIKLSovCi1FbWJlci5yZXF1aXJlZCA9IGZ1
bmN0aW9uKCkgewotICByZXR1cm4gUkVRVUlSRUQ7Ci19OwotCi1BbGlhcyA9IGZ1bmN0aW9uKG1l
dGhvZE5hbWUpIHsKLSAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLX07Ci1BbGlhcy5w
cm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwotCi0vKioKLSAgTWFrZXMgYSBwcm9w
ZXJ0eSBvciBtZXRob2QgYXZhaWxhYmxlIHZpYSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAuUGFpbnRTYW1wbGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
ICBjb2xvcjogJ3JlZCcsCi0gICAgY29sb3VyOiBFbWJlci5hbGlhcygnY29sb3InKSwKLSAgICBu
YW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiAiWmVkIjsKLSAgICB9LAotICAgIG1vbmlr
ZXI6IEVtYmVyLmFsaWFzKCJuYW1lIikKLSAgfSk7Ci0KLSAgdmFyIHBhaW50U2FtcGxlID0gQXBw
LlBhaW50U2FtcGxlLmNyZWF0ZSgpCi0gIHBhaW50U2FtcGxlLmdldCgnY29sb3VyJyk7ICAvLyAn
cmVkJwotICBwYWludFNhbXBsZS5tb25pa2VyKCk7ICAgICAgLy8gJ1plZCcKLSAgYGBgCi0KLSAg
QG1ldGhvZCBhbGlhcwotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1l
IG5hbWUgb2YgdGhlIG1ldGhvZCBvciBwcm9wZXJ0eSB0byBhbGlhcwotICBAcmV0dXJuIHtFbWJl
ci5EZXNjcmlwdG9yfQotICBAZGVwcmVjYXRlZCBVc2UgYEVtYmVyLmFsaWFzTWV0aG9kYCBvciBg
RW1iZXIuY29tcHV0ZWQuYWxpYXNgIGluc3RlYWQKLSovCi1FbWJlci5hbGlhcyA9IGZ1bmN0aW9u
KG1ldGhvZE5hbWUpIHsKLSAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5hbGlhcyBpcyBkZXByZWNh
dGVkLiBQbGVhc2UgdXNlIEVtYmVyLmFsaWFzTWV0aG9kIG9yIEVtYmVyLmNvbXB1dGVkLmFsaWFz
IGluc3RlYWQuIik7Ci0gIHJldHVybiBuZXcgQWxpYXMobWV0aG9kTmFtZSk7Ci19OwotCi0vKioK
LSAgTWFrZXMgYSBtZXRob2QgYXZhaWxhYmxlIHZpYSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAg
bmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gJ1RvbWh1ZGEgS2F0emRhbGUnOwotICAg
IH0sCi0gICAgbW9uaWtlcjogRW1iZXIuYWxpYXNNZXRob2QoJ25hbWUnKQotICB9KTsKLQotICB2
YXIgZ29vZEd1eSA9IEFwcC5QZXJzb24uY3JlYXRlKCkKLSAgYGBgCi0KLSAgQG1ldGhvZCBhbGlh
c01ldGhvZAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUg
b2YgdGhlIG1ldGhvZCB0byBhbGlhcwotICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotKi8K
LUVtYmVyLmFsaWFzTWV0aG9kID0gZnVuY3Rpb24obWV0aG9kTmFtZSkgewotICByZXR1cm4gbmV3
IEFsaWFzKG1ldGhvZE5hbWUpOwotfTsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gT0JTRVJWRVIgSEVMUEVSCi0vLwot
Ci0vKioKLSAgU3BlY2lmeSBhIG1ldGhvZCB0aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICB2YWx1ZU9i
c2VydmVyOiBFbWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEV4
ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKLSAgICB9KQotICB9
KTsKLSAgYGBgCi0KLSAgSW4gdGhlIGZ1dHVyZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFzeW5j
aHJvbm91cy4gSWYgeW91IHdhbnQgdG8gZW5zdXJlCi0gIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1
c2UgYGltbWVkaWF0ZU9ic2VydmVyYC4KLQotICBBbHNvIGF2YWlsYWJsZSBhcyBgRnVuY3Rpb24u
cHJvdG90eXBlLm9ic2VydmVzYCBpZiBwcm90b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAgZW5hYmxl
ZC4KLQotICBAbWV0aG9kIG9ic2VydmVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9
IHByb3BlcnR5TmFtZXMqCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKLSAgQHJldHVybiBmdW5j
Ci0qLwotRW1iZXIub2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGZ1bmMgID0gYV9zbGlj
ZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdOwotICB2YXIgcGF0aHM7Ci0KLSAgCi0gICAgcGF0aHMg
PSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0KLSAgICBpZiAodHlwZW9mIGZ1bmMg
IT09ICJmdW5jdGlvbiIpIHsKLSAgICAgIC8vIHJldmVydCB0byBvbGQsIHNvZnQtZGVwcmVjYXRl
ZCBhcmd1bWVudCBvcmRlcmluZwotCi0gICAgICBmdW5jICA9IGFyZ3VtZW50c1swXTsKLSAgICAg
IHBhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7Ci0gICAgfQotICAKLQotICBpZiAo
dHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3Io
IkVtYmVyLm9ic2VydmVyIGNhbGxlZCB3aXRob3V0IGEgZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZ1
bmMuX19lbWJlcl9vYnNlcnZlc19fID0gcGF0aHM7Ci0gIHJldHVybiBmdW5jOwotfTsKLQotLyoq
Ci0gIFNwZWNpZnkgYSBtZXRob2QgdGhhdCBvYnNlcnZlcyBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNlcnZl
cjogRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIoJ3ZhbHVlJywgZnVuY3Rpb24oKSB7Ci0gICAgICAv
LyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfSkK
LSAgfSk7Ci0gIGBgYAotCi0gIEluIHRoZSBmdXR1cmUsIGBFbWJlci5vYnNlcnZlcmAgbWF5IGJl
Y29tZSBhc3luY2hyb25vdXMuIEluIHRoaXMgZXZlbnQsCi0gIGBFbWJlci5pbW1lZGlhdGVPYnNl
cnZlcmAgd2lsbCBtYWludGFpbiB0aGUgc3luY2hyb25vdXMgYmVoYXZpb3IuCi0KLSAgQWxzbyBh
dmFpbGFibGUgYXMgYEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZlc0ltbWVkaWF0ZWx5YCBpZiBw
cm90b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAgZW5hYmxlZC4KLQotICBAbWV0aG9kIGltbWVkaWF0
ZU9ic2VydmVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMq
Ci0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKLSAgQHJldHVybiBmdW5jCi0qLwotRW1iZXIuaW1t
ZWRpYXRlT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgZm9yICh2YXIgaT0wLCBsPWFyZ3VtZW50
cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKLSAgICBF
bWJlci5hc3NlcnQoIkltbWVkaWF0ZSBvYnNlcnZlcnMgbXVzdCBvYnNlcnZlIGludGVybmFsIHBy
b3BlcnRpZXMgb25seSwgbm90IHByb3BlcnRpZXMgb24gb3RoZXIgb2JqZWN0cy4iLCB0eXBlb2Yg
YXJnICE9PSAic3RyaW5nIiB8fCBhcmcuaW5kZXhPZignLicpID09PSAtMSk7Ci0gIH0KLQotICBy
ZXR1cm4gRW1iZXIub2JzZXJ2ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgot
ICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5IGFyZSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRz
IGBvYmpgLCBga2V5TmFtZWAuCi0KLSAgTm90ZSwgYEBlYWNoLnByb3BlcnR5YCBvYnNlcnZlciBp
cyBjYWxsZWQgcGVyIGVhY2ggYWRkIG9yIHJlcGxhY2Ugb2YgYW4gZWxlbWVudAotICBhbmQgaXQn
cyBub3QgY2FsbGVkIHdpdGggYSBzcGVjaWZpYyBlbnVtZXJhdGlvbiBpdGVtLgotCi0gIEEgYGJl
Zm9yZU9ic2VydmVyYCBmaXJlcyBiZWZvcmUgYSBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIEEgYGJl
Zm9yZU9ic2VydmVyYCBpcyBhbiBhbHRlcm5hdGl2ZSBmb3JtIG9mIGAub2JzZXJ2ZXNCZWZvcmUo
KWAuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKHsKLQotICAgIGZyaWVuZHM6IFt7IG5hbWU6ICdUb20nIH0sIHsgbmFtZTogJ1N0ZWZhbicg
fSwgeyBuYW1lOiAnS3JpcycgfV0sCi0KLSAgICB2YWx1ZVdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9y
ZU9ic2VydmVyKCdjb250ZW50LnZhbHVlJywgZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gICAg
ICB0aGlzLmNoYW5naW5nRnJvbSA9IG9iai5nZXQoa2V5TmFtZSk7Ci0gICAgfSksCi0KLSAgICB2
YWx1ZURpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRlbnQudmFsdWUnLCBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKLSAgICAgICAgLy8gb25seSBydW4gaWYgdXBkYXRpbmcgYSB2YWx1ZSBh
bHJlYWR5IGluIHRoZSBET00KLSAgICAgICAgaWYgKHRoaXMuZ2V0KCdzdGF0ZScpID09PSAnaW5E
T00nKSB7Ci0gICAgICAgICAgdmFyIGNvbG9yID0gb2JqLmdldChrZXlOYW1lKSA+IHRoaXMuY2hh
bmdpbmdGcm9tID8gJ2dyZWVuJyA6ICdyZWQnOwotICAgICAgICAgIC8vIGxvZ2ljCi0gICAgICAg
IH0KLSAgICB9KSwKLQotICAgIGZyaWVuZHNEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdmcmll
bmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgICAgIC8vIHNvbWUg
bG9naWMKLSAgICAgIC8vIG9iai5nZXQoa2V5TmFtZSkgcmV0dXJucyBmcmllbmRzIGFycmF5Ci0g
ICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90
b3R5cGUub2JzZXJ2ZXNCZWZvcmVgIGlmIHByb3RvdHlwZSBleHRlbnNpb25zIGFyZQotICBlbmFi
bGVkLgotCi0gIEBtZXRob2QgYmVmb3JlT2JzZXJ2ZXIKLSAgQGZvciBFbWJlcgotICBAcGFyYW0g
e1N0cmluZ30gcHJvcGVydHlOYW1lcyoKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0
dXJuIGZ1bmMKLSovCi1FbWJlci5iZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICB2YXIg
ZnVuYyAgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF07Ci0gIHZhciBwYXRoczsKLQot
ICAKLSAgICBwYXRocyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKTsKLQotICAgIGlm
ICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9uIikgewotICAgICAgLy8gcmV2ZXJ0IHRvIG9sZCwg
c29mdC1kZXByZWNhdGVkIGFyZ3VtZW50IG9yZGVyaW5nCi0KLSAgICAgIGZ1bmMgID0gYXJndW1l
bnRzWzBdOwotICAgICAgcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICB9
Ci0gIAotCi0gIGlmICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9uIikgewotICAgIHRocm93IG5l
dyBFbWJlci5FcnJvcigiRW1iZXIuYmVmb3JlT2JzZXJ2ZXIgY2FsbGVkIHdpdGhvdXQgYSBmdW5j
dGlvbiIpOwotICB9Ci0KLSAgZnVuYy5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsK
LSAgcmV0dXJuIGZ1bmM7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gUHJv
dmlkZXMgYSB3YXkgdG8gcmVnaXN0ZXIgbGlicmFyeSB2ZXJzaW9ucyB3aXRoIGVtYmVyLgotdmFy
IGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKLSAgICBpbmRleE9mID0g
RW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLUVtYmVyLmxpYnJhcmllcyA9IGZ1bmN0
aW9uKCkgewotICB2YXIgbGlicmFyaWVzICAgID0gW107Ci0gIHZhciBjb3JlTGliSW5kZXggPSAw
OwotCi0gIHZhciBnZXRMaWJyYXJ5ID0gZnVuY3Rpb24obmFtZSkgewotICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAobGlicmFyaWVzW2ld
Lm5hbWUgPT09IG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGxpYnJhcmllc1tpXTsKLSAgICAgIH0K
LSAgICB9Ci0gIH07Ci0KLSAgbGlicmFyaWVzLnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgdmVy
c2lvbikgewotICAgIGlmICghZ2V0TGlicmFyeShuYW1lKSkgewotICAgICAgbGlicmFyaWVzLnB1
c2goe25hbWU6IG5hbWUsIHZlcnNpb246IHZlcnNpb259KTsKLSAgICB9Ci0gIH07Ci0KLSAgbGli
cmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkgPSBmdW5jdGlvbihuYW1lLCB2ZXJzaW9uKSB7Ci0g
ICAgaWYgKCFnZXRMaWJyYXJ5KG5hbWUpKSB7Ci0gICAgICBsaWJyYXJpZXMuc3BsaWNlKGNvcmVM
aWJJbmRleCsrLCAwLCB7bmFtZTogbmFtZSwgdmVyc2lvbjogdmVyc2lvbn0pOwotICAgIH0KLSAg
fTsKLQotICBsaWJyYXJpZXMuZGVSZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIg
bGliID0gZ2V0TGlicmFyeShuYW1lKTsKLSAgICBpZiAobGliKSBsaWJyYXJpZXMuc3BsaWNlKGlu
ZGV4T2YobGlicmFyaWVzLCBsaWIpLCAxKTsKLSAgfTsKLQotICBsaWJyYXJpZXMuZWFjaCA9IGZ1
bmN0aW9uIChjYWxsYmFjaykgewotICAgIGZvckVhY2gobGlicmFyaWVzLCBmdW5jdGlvbihsaWIp
IHsKLSAgICAgIGNhbGxiYWNrKGxpYi5uYW1lLCBsaWIudmVyc2lvbik7Ci0gICAgfSk7Ci0gIH07
Ci0KLSAgcmV0dXJuIGxpYnJhcmllczsKLX0oKTsKLQotRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVy
Q29yZUxpYnJhcnkoJ0VtYmVyJywgRW1iZXIuVkVSU0lPTik7Ci0KLX0pKCk7Ci0KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0vKioKLUVtYmVyIE1ldGFsCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItbWV0YWwKLSovCi0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAY2xhc3Mg
UlNWUAotICBAbW9kdWxlIFJTVlAKLSAgKi8KLWRlZmluZSgicnN2cC9hbGwiLCAKLSAgWyIuL3By
b21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRz
X18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kx
X19bImRlZmF1bHQiXTsKLQotICAgIC8qKgotICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxp
YXMgZm9yIGBSU1ZQLlByb21pc2UuYWxsYC4KLQotICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBm
b3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgQXJyYXkgb2YgcHJvbWlzZXMuCi0g
ICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgQW4gb3B0aW9uYWwgbGFiZWwuIFRoaXMgaXMgdXNl
ZnVsCi0gICAgICBmb3IgdG9vbGluZy4KLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhw
b3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBhbGwoYXJyYXksIGxhYmVsKSB7Ci0gICAgICBy
ZXR1cm4gUHJvbWlzZS5hbGwoYXJyYXksIGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgi
cnN2cC9hbGxfc2V0dGxlZCIsIAotICBbIi4vcHJvbWlzZSIsIi4vdXRpbHMiLCJleHBvcnRzIl0s
Ci0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNf
XykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFf
X1siZGVmYXVsdCJdOwotICAgIHZhciBpc0FycmF5ID0gX19kZXBlbmRlbmN5Ml9fLmlzQXJyYXk7
Ci0gICAgdmFyIGlzTm9uVGhlbmFibGUgPSBfX2RlcGVuZGVuY3kyX18uaXNOb25UaGVuYWJsZTsK
LQotICAgIC8qKgotICAgICAgYFJTVlAuYWxsU2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNWUC5h
bGxgLCBidXQgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKLSAgICAgIGEgZmFpbC1mYXN0IG1ldGhv
ZCwgaXQgd2FpdHMgdW50aWwgYWxsIHRoZSBwcm9taXNlcyBoYXZlIHJldHVybmVkIGFuZAotICAg
ICAgc2hvd3MgeW91IGFsbCB0aGUgcmVzdWx0cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQg
dG8gaGFuZGxlIG11bHRpcGxlCi0gICAgICBwcm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRo
ZXIgYXMgYSBzZXQuCi0KLSAgICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVk
IHdoZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KLSAgICAgIHNldHRsZWQuIFRo
ZSByZXR1cm4gcHJvbWlzZSBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiB0aGUgc3RhdGVz
IG9mCi0gICAgICB0aGUgcHJvbWlzZXMgcGFzc2VkIGludG8gdGhlIGBwcm9taXNlc2AgYXJyYXkg
YXJndW1lbnQuCi0KLSAgICAgIEVhY2ggc3RhdGUgb2JqZWN0IHdpbGwgZWl0aGVyIGluZGljYXRl
IGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiwgYW5kCi0gICAgICBwcm92aWRlIHRoZSBjb3JyZXNw
b25kaW5nIHZhbHVlIG9yIHJlYXNvbi4gVGhlIHN0YXRlcyB3aWxsIHRha2Ugb25lIG9mCi0gICAg
ICB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHsg
c3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfQotICAgICAgICBvcgotICAgICAgeyBz
dGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiByZWFzb24gfQotICAgICAgYGBgCi0KLSAgICAgIEV4
YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAu
UHJvbWlzZS5yZXNvbHZlKDEpOwotICAgICAgdmFyIHByb21pc2UyID0gUlNWUC5Qcm9taXNlLnJl
amVjdChuZXcgRXJyb3IoJzInKSk7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLlByb21pc2Uu
cmVqZWN0KG5ldyBFcnJvcignMycpKTsKLSAgICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEs
IHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0gICAgICBSU1ZQLmFsbFNldHRsZWQocHJvbWlzZXMp
LnRoZW4oZnVuY3Rpb24oYXJyYXkpewotICAgICAgICAvLyBhcnJheSA9PSBbCi0gICAgICAgIC8v
ICAgeyBzdGF0ZTogJ2Z1bGZpbGxlZCcsIHZhbHVlOiAxIH0sCi0gICAgICAgIC8vICAgeyBzdGF0
ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJvciB9LAotICAgICAgICAvLyAgIHsgc3RhdGU6ICdy
ZWplY3RlZCcsIHJlYXNvbjogRXJyb3IgfQotICAgICAgICAvLyBdCi0gICAgICAgIC8vIE5vdGUg
dGhhdCBmb3IgdGhlIHNlY29uZCBpdGVtLCByZWFzb24ubWVzc2FnZSB3aWxsIGJlICIyIiwgYW5k
IGZvciB0aGUKLSAgICAgICAgLy8gdGhpcmQgaXRlbSwgcmVhc29uLm1lc3NhZ2Ugd2lsbCBiZSAi
MyIuCi0gICAgICB9LCBmdW5jdGlvbihlcnJvcikgewotICAgICAgICAvLyBOb3QgcnVuLiAoVGhp
cyBibG9jayB3b3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhbGxTZXR0bGVkIGhhZCBmYWlsZWQsCi0g
ICAgICAgIC8vIGZvciBpbnN0YW5jZSBpZiBwYXNzZWQgYW4gaW5jb3JyZWN0IGFyZ3VtZW50IHR5
cGUuKQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBhbGxTZXR0bGVkCi0g
ICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzCi0gICAgICBAcGFy
YW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHBy
b21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNl
fSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgdGhlIHNldHRsZWQK
LSAgICAgIHN0YXRlcyBvZiB0aGUgY29uc3RpdHVlbnQgcHJvbWlzZXMuCi0gICAgICBAc3RhdGlj
Ci0gICAgKi8KLQotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBhbGxTZXR0
bGVkKGVudHJpZXMsIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24o
cmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgIGlmICghaXNBcnJheShlbnRyaWVzKSkgewotICAg
ICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gYWxs
U2V0dGxlZC4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciByZW1haW5pbmcgPSBlbnRyaWVz
Lmxlbmd0aDsKLSAgICAgICAgdmFyIGVudHJ5OwotCi0gICAgICAgIGlmIChyZW1haW5pbmcgPT09
IDApIHsKLSAgICAgICAgICByZXNvbHZlKFtdKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShyZW1haW5pbmcpOwotCi0gICAg
ICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZFJlc29sdmVyKGluZGV4KSB7Ci0gICAgICAgICAgcmV0dXJu
IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAgICAgICByZXNvbHZlQWxsKGluZGV4LCBmdWxmaWxs
ZWQodmFsdWUpKTsKLSAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24g
cmVqZWN0ZWRSZXNvbHZlcihpbmRleCkgewotICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZWFz
b24pIHsKLSAgICAgICAgICAgIHJlc29sdmVBbGwoaW5kZXgsIHJlamVjdGVkKHJlYXNvbikpOwot
ICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiByZXNvbHZlQWxsKGlu
ZGV4LCB2YWx1ZSkgewotICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gdmFsdWU7Ci0gICAgICAg
ICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7Ci0gICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMp
OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsg
aW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewotICAgICAgICAgIGVudHJ5ID0gZW50
cmllc1tpbmRleF07Ci0KLSAgICAgICAgICBpZiAoaXNOb25UaGVuYWJsZShlbnRyeSkpIHsKLSAg
ICAgICAgICAgIHJlc29sdmVBbGwoaW5kZXgsIGZ1bGZpbGxlZChlbnRyeSkpOwotICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVk
UmVzb2x2ZXIoaW5kZXgpLCByZWplY3RlZFJlc29sdmVyKGluZGV4KSk7Ci0gICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICB9LCBsYWJlbCk7Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGZ1bGZp
bGxlZCh2YWx1ZSkgewotICAgICAgcmV0dXJuIHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTog
dmFsdWUgfTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWplY3RlZChyZWFzb24pIHsKLSAgICAg
IHJldHVybiB7IHN0YXRlOiAncmVqZWN0ZWQnLCByZWFzb246IHJlYXNvbiB9OwotICAgIH0KLSAg
fSk7Ci1kZWZpbmUoInJzdnAvY29uZmlnIiwgCi0gIFsiLi9ldmVudHMiLCJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmlj
dCI7Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0K
LSAgICB2YXIgY29uZmlnID0gewotICAgICAgaW5zdHJ1bWVudDogZmFsc2UKLSAgICB9OwotCi0g
ICAgRXZlbnRUYXJnZXQubWl4aW4oY29uZmlnKTsKLQotICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZShu
YW1lLCB2YWx1ZSkgewotICAgICAgaWYgKG5hbWUgPT09ICdvbmVycm9yJykgewotICAgICAgICAv
LyBoYW5kbGUgZm9yIGxlZ2FjeSB1c2VycyB0aGF0IGV4cGVjdCB0aGUgYWN0dWFsCi0gICAgICAg
IC8vIGVycm9yIHRvIGJlIHBhc3NlZCB0byB0aGVpciBmdW5jdGlvbiBhZGRlZCB2aWEKLSAgICAg
ICAgLy8gYFJTVlAuY29uZmlndXJlKCdvbmVycm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAotICAg
ICAgICBjb25maWcub24oJ2Vycm9yJywgdmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9
Ci0KLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7Ci0gICAgICAgIGNvbmZpZ1tu
YW1lXSA9IHZhbHVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1tuYW1l
XTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5jb25maWcgPSBjb25maWc7Ci0g
ICAgX19leHBvcnRzX18uY29uZmlndXJlID0gY29uZmlndXJlOwotICB9KTsKLWRlZmluZSgicnN2
cC9kZWZlciIsIAotICBbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBl
bmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJv
bWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotCi0gICAgLyoqCi0gICAgICBgUlNW
UC5kZWZlcmAgcmV0dXJucyBhbiBvYmplY3Qgc2ltaWxhciB0byBqUXVlcnkncyBgJC5EZWZlcnJl
ZGAuCi0gICAgICBgUlNWUC5kZWZlcmAgc2hvdWxkIGJlIHVzZWQgd2hlbiBwb3J0aW5nIG92ZXIg
Y29kZSByZWxpYW50IG9uIGAkLkRlZmVycmVkYCdzCi0gICAgICBpbnRlcmZhY2UuIE5ldyBjb2Rl
IHNob3VsZCB1c2UgdGhlIGBSU1ZQLlByb21pc2VgIGNvbnN0cnVjdG9yIGluc3RlYWQuCi0KLSAg
ICAgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBgUlNWUC5kZWZlcmAgaXMgYSBwbGFpbiBvYmpl
Y3Qgd2l0aCB0aHJlZSBwcm9wZXJ0aWVzOgotCi0gICAgICAqIHByb21pc2UgLSBhbiBgUlNWUC5Q
cm9taXNlYC4KLSAgICAgICogcmVqZWN0IC0gYSBmdW5jdGlvbiB0aGF0IGNhdXNlcyB0aGUgYHBy
b21pc2VgIHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgIGJlY29tZSByZWplY3Rl
ZAotICAgICAgKiByZXNvbHZlIC0gYSBmdW5jdGlvbiB0aGF0IGNhdXNlcyB0aGUgYHByb21pc2Vg
IHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgIGJlY29tZSBmdWxmaWxsZWQuCi0K
LSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgdmFyIGRlZmVy
cmVkID0gUlNWUC5kZWZlcigpOwotCi0gICAgICAgZGVmZXJyZWQucmVzb2x2ZSgiU3VjY2VzcyEi
KTsKLQotICAgICAgIGRlZmVyZWQucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKLSAgICAg
ICAgIC8vIHZhbHVlIGhlcmUgaXMgIlN1Y2Nlc3MhIgotICAgICAgIH0pOwotICAgICAgIGBgYAot
Ci0gICAgICBAbWV0aG9kIGRlZmVyCi0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7T2JqZWN0fQotICAgICAqLwot
Ci0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGRlZmVyKGxhYmVsKSB7Ci0g
ICAgICB2YXIgZGVmZXJyZWQgPSB7IH07Ci0KLSAgICAgIGRlZmVycmVkLnByb21pc2UgPSBuZXcg
UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgZGVmZXJyZWQucmVz
b2x2ZSA9IHJlc29sdmU7Ci0gICAgICAgIGRlZmVycmVkLnJlamVjdCA9IHJlamVjdDsKLSAgICAg
IH0sIGxhYmVsKTsKLQotICAgICAgcmV0dXJuIGRlZmVycmVkOwotICAgIH07Ci0gIH0pOwotZGVm
aW5lKCJyc3ZwL2V2ZW50cyIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRz
X18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbihjYWxs
YmFja3MsIGNhbGxiYWNrKSB7Ci0gICAgICBmb3IgKHZhciBpPTAsIGw9Y2FsbGJhY2tzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2spIHsg
cmV0dXJuIGk7IH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIC0xOwotICAgIH07Ci0KLSAgICB2
YXIgY2FsbGJhY2tzRm9yID0gZnVuY3Rpb24ob2JqZWN0KSB7Ci0gICAgICB2YXIgY2FsbGJhY2tz
ID0gb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tzOwotCi0gICAgICBpZiAoIWNhbGxiYWNrcykgewot
ICAgICAgICBjYWxsYmFja3MgPSBvYmplY3QuX3Byb21pc2VDYWxsYmFja3MgPSB7fTsKLSAgICAg
IH0KLQotICAgICAgcmV0dXJuIGNhbGxiYWNrczsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICBA
Y2xhc3MgUlNWUC5FdmVudFRhcmdldAotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQi
XSA9IHsKLQotICAgICAgLyoqCi0gICAgICAgIGBSU1ZQLkV2ZW50VGFyZ2V0Lm1peGluYCBleHRl
bmRzIGFuIG9iamVjdCB3aXRoIEV2ZW50VGFyZ2V0IG1ldGhvZHMuIEZvcgotICAgICAgICBFeGFt
cGxlOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIG9iamVjdCA9IHt9Owot
Ci0gICAgICAgIFJTVlAuRXZlbnRUYXJnZXQubWl4aW4ob2JqZWN0KTsKLQotICAgICAgICBvYmpl
Y3Qub24oImZpbmlzaGVkIiwgZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgICAgICAvLyBoYW5kbGUg
ZXZlbnQKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgb2JqZWN0LnRyaWdnZXIoImZpbmlzaGVkIiwg
eyBkZXRhaWw6IHZhbHVlIH0pOwotICAgICAgICBgYGAKLQotICAgICAgICBgRXZlbnRUYXJnZXQu
bWl4aW5gIGFsc28gd29ya3Mgd2l0aCBwcm90b3R5cGVzOgotCi0gICAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgICAgdmFyIFBlcnNvbiA9IGZ1bmN0aW9uKCkge307Ci0gICAgICAgIFJTVlAuRXZl
bnRUYXJnZXQubWl4aW4oUGVyc29uLnByb3RvdHlwZSk7Ci0KLSAgICAgICAgdmFyIHllaHVkYSA9
IG5ldyBQZXJzb24oKTsKLSAgICAgICAgdmFyIHRvbSA9IG5ldyBQZXJzb24oKTsKLQotICAgICAg
ICB5ZWh1ZGEub24oInBva2UiLCBmdW5jdGlvbihldmVudCkgewotICAgICAgICAgIGNvbnNvbGUu
bG9nKCJZZWh1ZGEgc2F5cyBPVyIpOwotICAgICAgICB9KTsKLQotICAgICAgICB0b20ub24oInBv
a2UiLCBmdW5jdGlvbihldmVudCkgewotICAgICAgICAgIGNvbnNvbGUubG9nKCJUb20gc2F5cyBP
VyIpOwotICAgICAgICB9KTsKLQotICAgICAgICB5ZWh1ZGEudHJpZ2dlcigicG9rZSIpOwotICAg
ICAgICB0b20udHJpZ2dlcigicG9rZSIpOwotICAgICAgICBgYGAKLQotICAgICAgICBAbWV0aG9k
IG1peGluCi0gICAgICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb2JqZWN0IHRvIGV4dGVuZCB3
aXRoIEV2ZW50VGFyZ2V0IG1ldGhvZHMKLSAgICAgICAgQHByaXZhdGUKLSAgICAgICovCi0gICAg
ICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0KSB7Ci0gICAgICAgIG9iamVjdC5vbiA9IHRoaXMub247
Ci0gICAgICAgIG9iamVjdC5vZmYgPSB0aGlzLm9mZjsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIg
PSB0aGlzLnRyaWdnZXI7Ci0gICAgICAgIG9iamVjdC5fcHJvbWlzZUNhbGxiYWNrcyA9IHVuZGVm
aW5lZDsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAg
ICAgICBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBleGVjdXRlZCB3aGVuIGBldmVudE5hbWVg
IGlzIHRyaWdnZXJlZAotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9u
KCdldmVudCcsIGZ1bmN0aW9uKGV2ZW50SW5mbyl7Ci0gICAgICAgICAgLy8gaGFuZGxlIHRoZSBl
dmVudAotICAgICAgICB9KTsKLQotICAgICAgICBvYmplY3QudHJpZ2dlcignZXZlbnQnKTsKLSAg
ICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCBvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30g
ZXZlbnROYW1lIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IKLSAgICAgICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50
IGlzIHRyaWdnZXJlZC4KLSAgICAgICAgQHByaXZhdGUKLSAgICAgICovCi0gICAgICBvbjogZnVu
Y3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewotICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0g
Y2FsbGJhY2tzRm9yKHRoaXMpLCBjYWxsYmFja3M7Ci0KLSAgICAgICAgY2FsbGJhY2tzID0gYWxs
Q2FsbGJhY2tzW2V2ZW50TmFtZV07Ci0KLSAgICAgICAgaWYgKCFjYWxsYmFja3MpIHsKLSAgICAg
ICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXSA9IFtdOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFjaykgPT09IC0xKSB7Ci0g
ICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgWW91IGNhbiB1c2UgYG9mZmAgdG8gc3RvcCBmaXJpbmcgYSBw
YXJ0aWN1bGFyIGNhbGxiYWNrIGZvciBhbiBldmVudDoKLQotICAgICAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgICAgIGZ1bmN0aW9uIGRvU3R1ZmYoKSB7IC8vIGRvIHN0dWZmISB9Ci0gICAgICAgIG9i
amVjdC5vbignc3R1ZmYnLCBkb1N0dWZmKTsKLQotICAgICAgICBvYmplY3QudHJpZ2dlcignc3R1
ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIGJlIGNhbGxlZAotCi0gICAgICAgIC8vIFVucmVnaXN0ZXIg
T05MWSB0aGUgZG9TdHVmZiBjYWxsYmFjawotICAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicsIGRv
U3R1ZmYpOwotICAgICAgICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxs
IE5PVCBiZSBjYWxsZWQKLSAgICAgICAgYGBgCi0KLSAgICAgICAgSWYgeW91IGRvbid0IHBhc3Mg
YSBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGBvZmZgLCBBTEwgY2FsbGJhY2tzIGZvciB0aGUKLSAg
ICAgICAgZXZlbnQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZXZlbnQgZmlyZXMuIEZv
ciBleGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNhbGxiYWNr
MSA9IGZ1bmN0aW9uKCl7fTsKLSAgICAgICAgdmFyIGNhbGxiYWNrMiA9IGZ1bmN0aW9uKCl7fTsK
LQotICAgICAgICBvYmplY3Qub24oJ3N0dWZmJywgY2FsbGJhY2sxKTsKLSAgICAgICAgb2JqZWN0
Lm9uKCdzdHVmZicsIGNhbGxiYWNrMik7Ci0KLSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZm
Jyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2syIHdpbGwgYmUgZXhlY3V0ZWQuCi0KLSAgICAg
ICAgb2JqZWN0Lm9mZignc3R1ZmYnKTsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7
IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2syIHdpbGwgbm90IGJlIGV4ZWN1dGVkIQotICAgICAg
ICBgYGAKLQotICAgICAgICBAbWV0aG9kIG9mZgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZXZl
bnROYW1lIGV2ZW50IHRvIHN0b3AgbGlzdGVuaW5nIHRvCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rp
b259IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3VtZW50LiBJZiBnaXZlbiwgb25seSB0aGUgZnVuY3Rp
b24KLSAgICAgICAgZ2l2ZW4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGV2ZW50J3MgY2FsbGJh
Y2sgcXVldWUuIElmIG5vIGBjYWxsYmFja2AKLSAgICAgICAgYXJndW1lbnQgaXMgZ2l2ZW4sIGFs
bCBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sKLSAg
ICAgICAgcXVldWUuCi0gICAgICAgIEBwcml2YXRlCi0KLSAgICAgICovCi0gICAgICBvZmY6IGZ1
bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKLSAgICAgICAgdmFyIGFsbENhbGxiYWNrcyA9
IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJhY2tzLCBpbmRleDsKLQotICAgICAgICBpZiAoIWNh
bGxiYWNrKSB7Ci0gICAgICAgICAgYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKLSAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFj
a3NbZXZlbnROYW1lXTsKLQotICAgICAgICBpbmRleCA9IGluZGV4T2YoY2FsbGJhY2tzLCBjYWxs
YmFjayk7Ci0KLSAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeyBjYWxsYmFja3Muc3BsaWNlKGlu
ZGV4LCAxKTsgfQotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIFVzZSBgdHJpZ2dlcmAg
dG8gZmlyZSBjdXN0b20gZXZlbnRzLiBGb3IgZXhhbXBsZToKLQotICAgICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICAgIG9iamVjdC5vbignZm9vJywgZnVuY3Rpb24oKXsKLSAgICAgICAgICBjb25z
b2xlLmxvZygnZm9vIGV2ZW50IGhhcHBlbmVkIScpOwotICAgICAgICB9KTsKLSAgICAgICAgb2Jq
ZWN0LnRyaWdnZXIoJ2ZvbycpOwotICAgICAgICAvLyAnZm9vIGV2ZW50IGhhcHBlbmVkIScgbG9n
Z2VkIHRvIHRoZSBjb25zb2xlCi0gICAgICAgIGBgYAotCi0gICAgICAgIFlvdSBjYW4gYWxzbyBw
YXNzIGEgdmFsdWUgYXMgYSBzZWNvbmQgYXJndW1lbnQgdG8gYHRyaWdnZXJgIHRoYXQgd2lsbCBi
ZQotICAgICAgICBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gYWxsIGV2ZW50IGxpc3RlbmVycyBm
b3IgdGhlIGV2ZW50OgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9u
KCdmb28nLCBmdW5jdGlvbih2YWx1ZSl7Ci0gICAgICAgICAgY29uc29sZS5sb2codmFsdWUubmFt
ZSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG9iamVjdC50cmlnZ2VyKCdmb28nLCB7IG5hbWU6
ICdiYXInIH0pOwotICAgICAgICAvLyAnYmFyJyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUKLSAgICAg
ICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCB0cmlnZ2VyCi0gICAgICAgIEBwYXJhbSB7U3RyaW5n
fSBldmVudE5hbWUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gYmUgdHJpZ2dlcmVkCi0gICAgICAgIEBw
YXJhbSB7QW55fSBvcHRpb25zIG9wdGlvbmFsIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbnkgZXZl
bnQgaGFuZGxlcnMgZm9yCi0gICAgICAgIHRoZSBnaXZlbiBgZXZlbnROYW1lYAotICAgICAgICBA
cHJpdmF0ZQotICAgICAgKi8KLSAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgb3B0
aW9ucykgewotICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0gY2FsbGJhY2tzRm9yKHRoaXMpLAot
ICAgICAgICAgICAgY2FsbGJhY2tzLCBjYWxsYmFja1R1cGxlLCBjYWxsYmFjaywgYmluZGluZzsK
LQotICAgICAgICBpZiAoY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0pIHsKLSAg
ICAgICAgICAvLyBEb24ndCBjYWNoZSB0aGUgY2FsbGJhY2tzLmxlbmd0aCBzaW5jZSBpdCBtYXkg
Z3JvdwotICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsK
LSAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldOwotCi0gICAgICAgICAgICBjYWxs
YmFjayhvcHRpb25zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Owot
ICB9KTsKLWRlZmluZSgicnN2cC9maWx0ZXIiLCAKLSAgWyIuL2FsbCIsIi4vbWFwIiwiLi91dGls
cyIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3ky
X18sIF9fZGVwZW5kZW5jeTNfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0g
ICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBtYXAgPSBf
X2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsKLSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5k
ZW5jeTNfXy5pc0Z1bmN0aW9uOwotICAgIHZhciBpc0FycmF5ID0gX19kZXBlbmRlbmN5M19fLmlz
QXJyYXk7Ci0KLSAgICAvKioKLSAgICAgYFJTVlAuZmlsdGVyYCBpcyBzaW1pbGFyIHRvIEphdmFT
Y3JpcHQncyBuYXRpdmUgYGZpbHRlcmAgbWV0aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAgd2Fp
dHMgZm9yIGFsbCBwcm9taXNlcyB0byBiZWNvbWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRo
ZSBgZmlsdGVyRm5gIG9uCi0gICAgICBlYWNoIGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4g
YFJTVlAuZmlsdGVyYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBm
dWxmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYGZpbHRlckZuYCBvbiB0aGUgdmFs
dWVzIHRoZQotICAgICAgcHJvbWlzZXMgYmVjb21lIGZ1bGZpbGxlZCB3aXRoLgotCi0gICAgICBG
b3IgZXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotCi0gICAgICB2YXIgcHJvbWlzZTEg
PSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7
Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlc29sdmUoMyk7Ci0KLSAgICAgIHZhciBmaWx0
ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0pewotICAgICAgICByZXR1cm4gaXRlbSA+IDE7Ci0gICAgICB9
OwotCi0gICAgICBSU1ZQLmZpbHRlcihwcm9taXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24o
cmVzdWx0KXsKLSAgICAgICAgLy8gcmVzdWx0IGlzIFsgMiwgMyBdCi0gICAgICB9KTsKLSAgICAg
IGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuZmls
dGVyYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCi0gICAgICB0aGF0IGlzIHJlamVj
dGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2Un
cwotICAgICAgcmVqZWN0aW9uIGhhbmRsZXIuIEZvciBleGFtcGxlOgotCi0gICAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIg
cHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3IoIjIiKSk7Ci0gICAgICB2YXIgcHJvbWlz
ZTMgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3IoIjMiKSk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBb
IHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTsKLQotICAgICAgdmFyIGZpbHRlckZuID0g
ZnVuY3Rpb24oaXRlbSl7Ci0gICAgICAgIHJldHVybiBpdGVtID4gMTsKLSAgICAgIH07Ci0KLSAg
ICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbikudGhlbihmdW5jdGlvbihhcnJheSl7
Ci0gICAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVj
dGVkIHByb21pc2VzIQotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIHJl
YXNvbi5tZXNzYWdlID09PSAiMiIKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIGBSU1ZQ
LmZpbHRlcmAgd2lsbCBhbHNvIHdhaXQgZm9yIGFueSBwcm9taXNlcyByZXR1cm5lZCBmcm9tIGBm
aWx0ZXJGbmAuCi0gICAgICBGb3IgaW5zdGFuY2UsIHlvdSBtYXkgd2FudCB0byBmZXRjaCBhIGxp
c3Qgb2YgdXNlcnMgdGhlbiByZXR1cm4gYSBzdWJzZXQKLSAgICAgIG9mIHRob3NlIHVzZXJzIGJh
c2VkIG9uIHNvbWUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbjoKLQotICAgICAgYGBgamF2YXNjcmlw
dAotCi0gICAgICB2YXIgYWxpY2UgPSB7IG5hbWU6ICdhbGljZScgfTsKLSAgICAgIHZhciBib2Ig
ICA9IHsgbmFtZTogJ2JvYicgfTsKLSAgICAgIHZhciB1c2VycyA9IFsgYWxpY2UsIGJvYiBdOwot
Ci0gICAgICB2YXIgcHJvbWlzZXMgPSB1c2Vycy5tYXAoZnVuY3Rpb24odXNlcil7Ci0gICAgICAg
IHJldHVybiBSU1ZQLnJlc29sdmUodXNlcik7Ci0gICAgICB9KTsKLQotICAgICAgdmFyIGZpbHRl
ckZuID0gZnVuY3Rpb24odXNlcil7Ci0gICAgICAgIC8vIEhlcmUsIEFsaWNlIGhhcyBwZXJtaXNz
aW9ucyB0byBjcmVhdGUgYSBibG9nIHBvc3QsIGJ1dCBCb2IgZG9lcyBub3QuCi0gICAgICAgIHJl
dHVybiBnZXRQcml2aWxlZ2VzRm9yVXNlcih1c2VyKS50aGVuKGZ1bmN0aW9uKHByaXZzKXsKLSAg
ICAgICAgICByZXR1cm4gcHJpdnMuY2FuX2NyZWF0ZV9ibG9nX3Bvc3QgPT09IHRydWU7Ci0gICAg
ICAgIH0pOwotICAgICAgfTsKLSAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbiku
dGhlbihmdW5jdGlvbih1c2Vycyl7Ci0gICAgICAgIC8vIHRydWUsIGJlY2F1c2UgdGhlIHNlcnZl
ciB0b2xkIHVzIG9ubHkgQWxpY2UgY2FuIGNyZWF0ZSBhIGJsb2cgcG9zdC4KLSAgICAgICAgdXNl
cnMubGVuZ3RoID09PSAxOwotICAgICAgICAvLyBmYWxzZSwgYmVjYXVzZSBBbGljZSBpcyB0aGUg
b25seSB1c2VyIHByZXNlbnQgaW4gYHVzZXJzYAotICAgICAgICB1c2Vyc1swXSA9PT0gYm9iOwot
ICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBmaWx0ZXIKLSAgICAgIEBmb3Ig
UlNWUAotICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKLSAgICAgIEBwYXJhbSB7RnVuY3Rp
b259IGZpbHRlckZuIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggcmVzb2x2ZWQgdmFs
dWUgdG8KLSAgICAgIGZpbHRlciB0aGUgZmluYWwgcmVzdWx0cy4KLSAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4gVXNlZnVs
IGZvcgotICAgICAgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAg
ICBmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkgewotICAgICAgcmV0
dXJuIGFsbChwcm9taXNlcywgbGFiZWwpLnRoZW4oZnVuY3Rpb24odmFsdWVzKXsKLSAgICAgICAg
aWYgKCFpc0FycmF5KHByb21pc2VzKSkgewotICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
J1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gZmlsdGVyLicpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCFpc0Z1bmN0aW9uKGZpbHRlckZuKSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcigiWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIHRvIGZpbHRlcidzIHNlY29uZCBhcmd1bWVu
dC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXAocHJvbWlzZXMsIGZpbHRlckZu
LCBsYWJlbCkudGhlbihmdW5jdGlvbihmaWx0ZXJSZXN1bHRzKXsKLSAgICAgICAgICAgdmFyIGks
Ci0gICAgICAgICAgICAgICB2YWx1ZXNMZW4gPSB2YWx1ZXMubGVuZ3RoLAotICAgICAgICAgICAg
ICAgZmlsdGVyZWQgPSBbXTsKLQotICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzTGVu
OyBpKyspewotICAgICAgICAgICAgIGlmKGZpbHRlclJlc3VsdHNbaV0pIGZpbHRlcmVkLnB1c2go
dmFsdWVzW2ldKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7Ci0g
ICAgICAgIH0pOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQi
XSA9IGZpbHRlcjsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvaGFzaCIsIAotICBbIi4vcHJvbWlzZSIs
Ii4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBl
bmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJv
bWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBpc05vblRoZW5hYmxl
ID0gX19kZXBlbmRlbmN5Ml9fLmlzTm9uVGhlbmFibGU7Ci0gICAgdmFyIGtleXNPZiA9IF9fZGVw
ZW5kZW5jeTJfXy5rZXlzT2Y7Ci0KLSAgICAvKioKLSAgICAgIGBSU1ZQLmhhc2hgIGlzIHNpbWls
YXIgdG8gYFJTVlAuYWxsYCwgYnV0IHRha2VzIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5
Ci0gICAgICBmb3IgaXRzIGBwcm9taXNlc2AgYXJndW1lbnQuCi0KLSAgICAgIFJldHVybnMgYSBw
cm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZl
IGJlZW4KLSAgICAgIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21l
IHJlamVjdGVkLiBUaGUgcmV0dXJuZWQgcHJvbWlzZQotICAgICAgaXMgZnVsZmlsbGVkIHdpdGgg
YSBoYXNoIHRoYXQgaGFzIHRoZSBzYW1lIGtleSBuYW1lcyBhcyB0aGUgYHByb21pc2VzYCBvYmpl
Y3QKLSAgICAgIGFyZ3VtZW50LiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgb2JqZWN0IGFy
ZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAotICAgICAgc2ltcGx5IGJlIGNvcGllZCBvdmVyIHRv
IHRoZSBmdWxmaWxsZWQgb2JqZWN0LgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZXMgPSB7Ci0gICAgICAgIG15UHJvbWlzZTogUlNWUC5y
ZXNvbHZlKDEpLAotICAgICAgICB5b3VyUHJvbWlzZTogUlNWUC5yZXNvbHZlKDIpLAotICAgICAg
ICB0aGVpclByb21pc2U6IFJTVlAucmVzb2x2ZSgzKSwKLSAgICAgICAgbm90QVByb21pc2U6IDQK
LSAgICAgIH07Ci0KLSAgICAgIFJTVlAuaGFzaChwcm9taXNlcykudGhlbihmdW5jdGlvbihoYXNo
KXsKLSAgICAgICAgLy8gaGFzaCBoZXJlIGlzIGFuIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6Ci0g
ICAgICAgIC8vIHsKLSAgICAgICAgLy8gICBteVByb21pc2U6IDEsCi0gICAgICAgIC8vICAgeW91
clByb21pc2U6IDIsCi0gICAgICAgIC8vICAgdGhlaXJQcm9taXNlOiAzLAotICAgICAgICAvLyAg
IG5vdEFQcm9taXNlOiA0Ci0gICAgICAgIC8vIH0KLSAgICAgIH0pOwotICAgICAgYGBgYAotCi0g
ICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJl
amVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQotICAgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJl
IGdpdmVuIGFzIHRoZSByZWFzb24gdG8gdGhlIHJlamVjdGlvbiBoYW5kbGVyLgotCi0gICAgICBF
eGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZXMgPSB7Ci0g
ICAgICAgIG15UHJvbWlzZTogUlNWUC5yZXNvbHZlKDEpLAotICAgICAgICByZWplY3RlZFByb21p
c2U6IFJTVlAucmVqZWN0KG5ldyBFcnJvcigicmVqZWN0ZWRQcm9taXNlIikpLAotICAgICAgICBh
bm90aGVyUmVqZWN0ZWRQcm9taXNlOiBSU1ZQLnJlamVjdChuZXcgRXJyb3IoImFub3RoZXJSZWpl
Y3RlZFByb21pc2UiKSksCi0gICAgICB9OwotCi0gICAgICBSU1ZQLmhhc2gocHJvbWlzZXMpLnRo
ZW4oZnVuY3Rpb24oaGFzaCl7Ci0gICAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1
c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQotICAgICAgfSwgZnVuY3Rpb24ocmVhc29u
KSB7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAicmVqZWN0ZWRQcm9taXNlIgotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQW4gaW1wb3J0YW50IG5vdGU6IGBSU1ZQLmhhc2hg
IGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMgdGhhdAotICAgICAgYXJl
IGp1c3QgYSBzZXQgb2Yga2V5cyBhbmQgdmFsdWVzLiBgUlNWUC5oYXNoYCB3aWxsIE5PVCBwcmVz
ZXJ2ZSBwcm90b3R5cGUKLSAgICAgIGNoYWlucy4KLQotICAgICAgRXhhbXBsZToKLQotICAgICAg
YGBgamF2YXNjcmlwdAotICAgICAgZnVuY3Rpb24gTXlDb25zdHJ1Y3RvcigpewotICAgICAgICB0
aGlzLmV4YW1wbGUgPSBSU1ZQLnJlc29sdmUoIkV4YW1wbGUiKTsKLSAgICAgIH0KLQotICAgICAg
TXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSB7Ci0gICAgICAgIHByb3RvUHJvcGVydHk6IFJTVlAu
cmVzb2x2ZSgiUHJvdG8gUHJvcGVydHkiKQotICAgICAgfTsKLQotICAgICAgdmFyIG15T2JqZWN0
ID0gbmV3IE15Q29uc3RydWN0b3IoKTsKLQotICAgICAgUlNWUC5oYXNoKG15T2JqZWN0KS50aGVu
KGZ1bmN0aW9uKGhhc2gpewotICAgICAgICAvLyBwcm90b1Byb3BlcnR5IHdpbGwgbm90IGJlIHBy
ZXNlbnQsIGluc3RlYWQgeW91IHdpbGwganVzdCBoYXZlIGFuCi0gICAgICAgIC8vIG9iamVjdCB0
aGF0IGxvb2tzIGxpa2U6Ci0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gICBleGFtcGxlOiAiRXhh
bXBsZSIKLSAgICAgICAgLy8gfQotICAgICAgICAvLwotICAgICAgICAvLyBoYXNoLmhhc093blBy
b3BlcnR5KCdwcm90b1Byb3BlcnR5Jyk7IC8vIGZhbHNlCi0gICAgICAgIC8vICd1bmRlZmluZWQn
ID09PSB0eXBlb2YgaGFzaC5wcm90b1Byb3BlcnR5Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0g
ICAgICBAbWV0aG9kIGhhc2gKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtPYmplY3R9
IHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIHRo
YXQgZGVzY3JpYmVzIHRoZSBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBw
cm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKLSAgICAgIGhhdmUgYmVlbiBmdWxmaWxsZWQsIG9yIHJl
amVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC4KLSAgICAgIEBzdGF0aWMKLSAg
ICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBoYXNoKG9iamVjdCwg
bGFiZWwpIHsKLSAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWpl
Y3QpewotICAgICAgICB2YXIgcmVzdWx0cyA9IHt9OwotICAgICAgICB2YXIga2V5cyA9IGtleXNP
ZihvYmplY3QpOwotICAgICAgICB2YXIgcmVtYWluaW5nID0ga2V5cy5sZW5ndGg7Ci0gICAgICAg
IHZhciBlbnRyeSwgcHJvcGVydHk7Ci0KLSAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewot
ICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0KLSAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWRUbyhwcm9wZXJ0eSkgewotICAgICAgICAgIHJl
dHVybiBmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSB2
YWx1ZTsKLSAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAg
ICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAg
IH0KLQotICAgICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHsKLSAgICAgICAgICBy
ZW1haW5pbmcgPSAwOwotICAgICAgICAgIHJlamVjdChyZWFzb24pOwotICAgICAgICB9Ci0KLSAg
ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAg
cHJvcGVydHkgPSBrZXlzW2ldOwotICAgICAgICAgIGVudHJ5ID0gb2JqZWN0W3Byb3BlcnR5XTsK
LQotICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVudHJ5KSkgewotICAgICAgICAgICAgcmVz
dWx0c1twcm9wZXJ0eV0gPSBlbnRyeTsKLSAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0g
MCkgewotICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVs
ZmlsbGVkVG8ocHJvcGVydHkpLCBvblJlamVjdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgICB9KTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9pbnN0cnVtZW50IiwgCi0g
IFsiLi9jb25maWciLCIuL3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVu
Y3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7
Ci0gICAgdmFyIGNvbmZpZyA9IF9fZGVwZW5kZW5jeTFfXy5jb25maWc7Ci0gICAgdmFyIG5vdyA9
IF9fZGVwZW5kZW5jeTJfXy5ub3c7Ci0KLSAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVu
Y3Rpb24gaW5zdHJ1bWVudChldmVudE5hbWUsIHByb21pc2UsIGNoaWxkKSB7Ci0gICAgICAvLyBp
bnN0cnVtZW50YXRpb24gc2hvdWxkIG5vdCBkaXNydXB0IG5vcm1hbCB1c2FnZS4KLSAgICAgIHRy
eSB7Ci0gICAgICAgIGNvbmZpZy50cmlnZ2VyKGV2ZW50TmFtZSwgewotICAgICAgICAgIGd1aWQ6
IHByb21pc2UuX2d1aWRLZXkgKyBwcm9taXNlLl9pZCwKLSAgICAgICAgICBldmVudE5hbWU6IGV2
ZW50TmFtZSwKLSAgICAgICAgICBkZXRhaWw6IHByb21pc2UuX2RldGFpbCwKLSAgICAgICAgICBj
aGlsZEd1aWQ6IGNoaWxkICYmIHByb21pc2UuX2d1aWRLZXkgKyBjaGlsZC5faWQsCi0gICAgICAg
ICAgbGFiZWw6IHByb21pc2UuX2xhYmVsLAotICAgICAgICAgIHRpbWVTdGFtcDogbm93KCksCi0g
ICAgICAgICAgc3RhY2s6IG5ldyBFcnJvcihwcm9taXNlLl9sYWJlbCkuc3RhY2sKLSAgICAgICAg
fSk7Ci0gICAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24o
KXsKLSAgICAgICAgICB0aHJvdyBlcnJvcjsKLSAgICAgICAgfSwgMCk7Ci0gICAgICB9Ci0gICAg
fTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvbWFwIiwgCi0gIFsiLi9wcm9taXNlIiwiLi9hbGwiLCIu
L3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5k
ZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0
IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZh
ciBhbGwgPSBfX2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsKLSAgICB2YXIgaXNBcnJheSA9IF9f
ZGVwZW5kZW5jeTNfXy5pc0FycmF5OwotICAgIHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5
M19fLmlzRnVuY3Rpb247Ci0KLSAgICAvKioKLSAgICAgYFJTVlAubWFwYCBpcyBzaW1pbGFyIHRv
IEphdmFTY3JpcHQncyBuYXRpdmUgYG1hcGAgbWV0aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAg
d2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBiZWNvbWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5n
IHRoZSBgbWFwRm5gIG9uCi0gICAgICBlYWNoIGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4g
YFJTVlAubWFwYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBmdWxm
aWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYG1hcEZuYCBvbiB0aGUgdmFsdWVzIHRo
ZSBwcm9taXNlcwotICAgICAgYmVjb21lIGZ1bGZpbGxlZCB3aXRoLgotCi0gICAgICBGb3IgZXhh
bXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotCi0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQ
LnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7Ci0gICAg
ICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlc29sdmUoMyk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBb
IHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTsKLQotICAgICAgdmFyIG1hcEZuID0gZnVu
Y3Rpb24oaXRlbSl7Ci0gICAgICAgIHJldHVybiBpdGVtICsgMTsKLSAgICAgIH07Ci0KLSAgICAg
IFJTVlAubWFwKHByb21pc2VzLCBtYXBGbikudGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAg
ICAvLyByZXN1bHQgaXMgWyAyLCAzLCA0IF0KLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAg
IElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgUlNWUC5tYXBgIGFyZSByZWplY3Rl
ZCwgdGhlIGZpcnN0IHByb21pc2UKLSAgICAgIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZl
biBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZSdzCi0gICAgICByZWplY3Rp
b24gaGFuZGxlci4gRm9yIGV4YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZh
ciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKLSAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAu
cmVqZWN0KG5ldyBFcnJvcigiMiIpKTsKLSAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0
KG5ldyBFcnJvcigiMyIpKTsKLSAgICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21p
c2UyLCBwcm9taXNlMyBdOwotCi0gICAgICB2YXIgbWFwRm4gPSBmdW5jdGlvbihpdGVtKXsKLSAg
ICAgICAgcmV0dXJuIGl0ZW0gKyAxOwotICAgICAgfTsKLQotICAgICAgUlNWUC5tYXAocHJvbWlz
ZXMsIG1hcEZuKS50aGVuKGZ1bmN0aW9uKGFycmF5KXsKLSAgICAgICAgLy8gQ29kZSBoZXJlIG5l
dmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhCi0gICAgICB9LCBm
dW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICIyIgotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgYFJTVlAubWFwYCB3aWxsIGFsc28gd2FpdCBpZiBh
IHByb21pc2UgaXMgcmV0dXJuZWQgZnJvbSBgbWFwRm5gLiBGb3IgZXhhbXBsZSwKLSAgICAgIHNh
eSB5b3Ugd2FudCB0byBnZXQgYWxsIGNvbW1lbnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywg
YnV0IHlvdSBuZWVkCi0gICAgICB0aGUgYmxvZyBwb3N0cyBmaXJzdCBiZWN1YXNlIHRoZXkgY29u
dGFpbiBhIHVybCB0byB0aG9zZSBjb21tZW50cy4KLQotICAgICAgYGBgamF2c2NyaXB0Ci0KLSAg
ICAgIHZhciBtYXBGbiA9IGZ1bmN0aW9uKGJsb2dQb3N0KXsKLSAgICAgICAgLy8gZ2V0Q29tbWVu
dHMgZG9lcyBzb21lIGFqYXggYW5kIHJldHVybnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVs
ZmlsbGVkCi0gICAgICAgIC8vIHdpdGggc29tZSBjb21tZW50cyBkYXRhCi0gICAgICAgIHJldHVy
biBnZXRDb21tZW50cyhibG9nUG9zdC5jb21tZW50c191cmwpOwotICAgICAgfTsKLQotICAgICAg
Ly8gZ2V0QmxvZ1Bvc3RzIGRvZXMgc29tZSBhamF4IGFuZCByZXR1cm5zIGFuIFJTVlAuUHJvbWlz
ZSB0aGF0IGlzIGZ1bGZpbGxlZAotICAgICAgLy8gd2l0aCBzb21lIGJsb2cgcG9zdCBkYXRhCi0g
ICAgICBSU1ZQLm1hcChnZXRCbG9nUG9zdHMoKSwgbWFwRm4pLnRoZW4oZnVuY3Rpb24oY29tbWVu
dHMpewotICAgICAgICAvLyBjb21tZW50cyBpcyB0aGUgcmVzdWx0IG9mIGFza2luZyB0aGUgc2Vy
dmVyIGZvciB0aGUgY29tbWVudHMKLSAgICAgICAgLy8gb2YgYWxsIGJsb2cgcG9zdHMgcmV0dXJu
ZWQgZnJvbSBnZXRCbG9nUG9zdHMoKQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1l
dGhvZCBtYXAKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMK
LSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG1hcEZuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBl
YWNoIGZ1bGZpbGxlZCBwcm9taXNlLgotICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlv
bmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRv
b2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVk
IHdpdGggdGhlIHJlc3VsdCBvZiBjYWxsaW5nCi0gICAgICBgbWFwRm5gIG9uIGVhY2ggZnVsZmls
bGVkIHByb21pc2Ugb3IgdmFsdWUgd2hlbiB0aGV5IGJlY29tZSBmdWxmaWxsZWQuCi0gICAgICAg
VGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCBpZiBhbnkgb2YgdGhlIGdpdmVuIGBwcm9taXNl
c2AgYmVjb21lIHJlamVjdGVkLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIG1hcChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7Ci0g
ICAgICByZXR1cm4gYWxsKHByb21pc2VzLCBsYWJlbCkudGhlbihmdW5jdGlvbihyZXN1bHRzKXsK
LSAgICAgICAgaWYgKCFpc0FycmF5KHByb21pc2VzKSkgewotICAgICAgICAgIHRocm93IG5ldyBU
eXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gbWFwLicpOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKG1hcEZuKSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5
cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIHRvIG1hcCdzIHNlY29uZCBhcmd1bWVu
dC4iKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgdmFyIHJlc3VsdExlbiA9IHJlc3VsdHMubGVu
Z3RoLAotICAgICAgICAgICAgbWFwcGVkUmVzdWx0cyA9IFtdLAotICAgICAgICAgICAgaTsKLQot
ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzdWx0TGVuOyBpKyspewotICAgICAgICAgIG1hcHBl
ZFJlc3VsdHMucHVzaChtYXBGbihyZXN1bHRzW2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBy
ZXR1cm4gYWxsKG1hcHBlZFJlc3VsdHMsIGxhYmVsKTsKLSAgICAgIH0pOwotICAgIH07Ci0gIH0p
OwotZGVmaW5lKCJyc3ZwL25vZGUiLCAKLSAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7
Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIHZh
ciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKLQotICAgIGZ1bmN0aW9uIG1ha2VOb2Rl
Q2FsbGJhY2tGb3IocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICByZXR1cm4gZnVuY3Rpb24gKGVy
cm9yLCB2YWx1ZSkgewotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICByZWplY3QoZXJy
b3IpOwotICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAg
ICAgcmVzb2x2ZShzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgIHJlc29sdmUodmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQot
ICAgIC8qKgotICAgICAgYFJTVlAuZGVub2RlaWZ5YCB0YWtlcyBhICJub2RlLXN0eWxlIiBmdW5j
dGlvbiBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKLSAgICAgIHdpbGwgcmV0dXJuIGFuIGBS
U1ZQLlByb21pc2VgLiBZb3UgY2FuIHVzZSBgZGVub2RlaWZ5YCBpbiBOb2RlLmpzIG9yIHRoZQot
ICAgICAgYnJvd3NlciB3aGVuIHlvdSdkIHByZWZlciB0byB1c2UgcHJvbWlzZXMgb3ZlciB1c2lu
ZyBjYWxsYmFja3MuIEZvciBleGFtcGxlLAotICAgICAgYGRlbm9kZWlmeWAgdHJhbnNmb3JtcyB0
aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgZnMgPSByZXF1
aXJlKCdmcycpOwotCi0gICAgICBmcy5yZWFkRmlsZSgnbXlmaWxlLnR4dCcsIGZ1bmN0aW9uKGVy
ciwgZGF0YSl7Ci0gICAgICAgIGlmIChlcnIpIHJldHVybiBoYW5kbGVFcnJvcihlcnIpOwotICAg
ICAgICBoYW5kbGVEYXRhKGRhdGEpOwotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgaW50
bzoKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsK
LQotICAgICAgdmFyIHJlYWRGaWxlID0gUlNWUC5kZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotCi0g
ICAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcpLnRoZW4oaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3Ip
OwotICAgICAgYGBgCi0KLSAgICAgIFVzaW5nIGBkZW5vZGVpZnlgIG1ha2VzIGl0IGVhc2llciB0
byBjb21wb3NlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGluc3RlYWQKLSAgICAgIG9mIHVzaW5n
IGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6Ci0KLSAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci0gICAgICB2YXIgbG9nID0gcmVxdWly
ZSgnc29tZS1hc3luYy1sb2dnZXInKTsKLQotICAgICAgZnMucmVhZEZpbGUoJ215ZmlsZS50eHQn
LCBmdW5jdGlvbihlcnIsIGRhdGEpewotICAgICAgICBpZiAoZXJyKSByZXR1cm4gaGFuZGxlRXJy
b3IoZXJyKTsKLSAgICAgICAgZnMud3JpdGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEsIGZ1bmN0
aW9uKGVycil7Ci0gICAgICAgICAgaWYgKGVycikgdGhyb3cgZXJyOwotICAgICAgICAgIGxvZygn
c3VjY2VzcycsIGZ1bmN0aW9uKGVycikgewotICAgICAgICAgICAgaWYgKGVycikgdGhyb3cgZXJy
OwotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAg
ICAgIFlvdSBjYW4gY2hhaW4gdGhlIG9wZXJhdGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZy
b20gdGhlIHJldHVybmVkIHByb21pc2U6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZh
ciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci0gICAgICB2YXIgZGVub2RlaWZ5ID0gUlNWUC5kZW5vZGVp
Znk7Ci0gICAgICB2YXIgcmVhZEZpbGUgPSBkZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotICAgICAg
dmFyIHdyaXRlRmlsZSA9IGRlbm9kZWlmeShmcy53cml0ZUZpbGUpOwotICAgICAgdmFyIGxvZyA9
IGRlbm9kZWlmeShyZXF1aXJlKCdzb21lLWFzeW5jLWxvZ2dlcicpKTsKLQotICAgICAgcmVhZEZp
bGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0aW9uKGRhdGEpewotICAgICAgICByZXR1cm4gd3Jp
dGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEpOwotICAgICAgfSkudGhlbihmdW5jdGlvbigpewot
ICAgICAgICByZXR1cm4gbG9nKCdTVUNDRVNTJyk7Ci0gICAgICB9KS50aGVuKGZ1bmN0aW9uKCl7
Ci0gICAgICAgIC8vIHN1Y2Nlc3MgaGFuZGxlcgotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsK
LSAgICAgICAgLy8gcmVqZWN0aW9uIGhhbmRsZXIKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAg
ICAgIEBtZXRob2QgZGVub2RlaWZ5Ci0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7RnVu
Y3Rpb259IG5vZGVGdW5jIGEgIm5vZGUtc3R5bGUiIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjYWxs
YmFjayBhcwotICAgICAgaXRzIGxhc3QgYXJndW1lbnQuIFRoZSBjYWxsYmFjayBleHBlY3RzIGFu
IGVycm9yIHRvIGJlIHBhc3NlZCBhcyBpdHMgZmlyc3QKLSAgICAgIGFyZ3VtZW50IChpZiBhbiBl
cnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIG51bGwpLCBhbmQgdGhlIHZhbHVlIGZyb20gdGhlCi0g
ICAgICBvcGVyYXRpb24gYXMgaXRzIHNlY29uZCBhcmd1bWVudCAoImZ1bmN0aW9uKGVyciwgdmFs
dWUpeyB9IikuCi0gICAgICBAcGFyYW0ge0FueX0gYmluZGluZyBvcHRpb25hbCBhcmd1bWVudCBm
b3IgYmluZGluZyB0aGUgInRoaXMiIHZhbHVlIHdoZW4KLSAgICAgIGNhbGxpbmcgdGhlIGBub2Rl
RnVuY2AgZnVuY3Rpb24uCi0gICAgICBAcmV0dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0
IHdyYXBzIGBub2RlRnVuY2AgdG8gcmV0dXJuIGFuCi0gICAgICBgUlNWUC5Qcm9taXNlYAotICAg
ICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9u
IGRlbm9kZWlmeShub2RlRnVuYywgYmluZGluZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkg
IHsKLSAgICAgICAgdmFyIG5vZGVBcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCByZXNvbHZl
LCByZWplY3Q7Ci0gICAgICAgIHZhciB0aGlzQXJnID0gdGhpcyB8fCBiaW5kaW5nOwotCi0gICAg
ICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAg
ICAgICBQcm9taXNlLmFsbChub2RlQXJncykudGhlbihmdW5jdGlvbihub2RlQXJncykgewotICAg
ICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgbm9kZUFyZ3MucHVzaChtYWtlTm9kZUNhbGxi
YWNrRm9yKHJlc29sdmUsIHJlamVjdCkpOwotICAgICAgICAgICAgICBub2RlRnVuYy5hcHBseSh0
aGlzQXJnLCBub2RlQXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICAg
ICAgcmVqZWN0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgICB9KTsK
LSAgICAgIH07Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvcHJvbWlzZSIsIAotICBbIi4v
Y29uZmlnIiwiLi9ldmVudHMiLCIuL2luc3RydW1lbnQiLCIuL3V0aWxzIiwiLi9wcm9taXNlL2Nh
c3QiLCIuL3Byb21pc2UvYWxsIiwiLi9wcm9taXNlL3JhY2UiLCIuL3Byb21pc2UvcmVzb2x2ZSIs
Ii4vcHJvbWlzZS9yZWplY3QiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFf
XywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19k
ZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2X18sIF9fZGVwZW5kZW5jeTdfXywgX19kZXBlbmRl
bmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3Qi
OwotICAgIHZhciBjb25maWcgPSBfX2RlcGVuZGVuY3kxX18uY29uZmlnOwotICAgIHZhciBFdmVu
dFRhcmdldCA9IF9fZGVwZW5kZW5jeTJfX1siZGVmYXVsdCJdOwotICAgIHZhciBpbnN0cnVtZW50
ID0gX19kZXBlbmRlbmN5M19fWyJkZWZhdWx0Il07Ci0gICAgdmFyIG9iamVjdE9yRnVuY3Rpb24g
PSBfX2RlcGVuZGVuY3k0X18ub2JqZWN0T3JGdW5jdGlvbjsKLSAgICB2YXIgaXNGdW5jdGlvbiA9
IF9fZGVwZW5kZW5jeTRfXy5pc0Z1bmN0aW9uOwotICAgIHZhciBub3cgPSBfX2RlcGVuZGVuY3k0
X18ubm93OwotICAgIHZhciBjYXN0ID0gX19kZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07Ci0gICAg
dmFyIGFsbCA9IF9fZGVwZW5kZW5jeTZfX1siZGVmYXVsdCJdOwotICAgIHZhciByYWNlID0gX19k
ZXBlbmRlbmN5N19fWyJkZWZhdWx0Il07Ci0gICAgdmFyIFJlc29sdmUgPSBfX2RlcGVuZGVuY3k4
X19bImRlZmF1bHQiXTsKLSAgICB2YXIgUmVqZWN0ID0gX19kZXBlbmRlbmN5OV9fWyJkZWZhdWx0
Il07Ci0KLSAgICB2YXIgZ3VpZEtleSA9ICdyc3ZwXycgKyBub3coKSArICctJzsKLSAgICB2YXIg
Y291bnRlciA9IDA7Ci0KLSAgICBmdW5jdGlvbiBub29wKCkge30KLQotICAgIF9fZXhwb3J0c19f
WyJkZWZhdWx0Il0gPSBQcm9taXNlOwotCi0KLSAgICAvKioKLSAgICAgIFByb21pc2Ugb2JqZWN0
cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0
aW9uLiBUaGUKLSAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNl
IGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoCi0gICAgICByZWdpc3RlcnMgY2Fs
bGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZeKAmXMgZXZlbnR1YWwgdmFsdWUgb3Ig
dGhlIHJlYXNvbgotICAgICAgd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuCi0K
LSAgICAgIFRlcm1pbm9sb2d5Ci0gICAgICAtLS0tLS0tLS0tLQotCi0gICAgICAtIGBwcm9taXNl
YCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVo
YXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLgotICAgICAgLSBgdGhlbmFibGVg
IGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLgot
ICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcg
dW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBhIHByb21pc2UpLgotICAgICAgLSBgZXhjZXB0aW9u
YCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCi0g
ICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3
YXMgcmVqZWN0ZWQuCi0gICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBv
ZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciByZWplY3RlZC4KLQotICAgICAgQSBwcm9taXNlIGNh
biBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVj
dGVkLgotCi0gICAgICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxt
ZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZAotICAgICAgc3RhdGUuICBQcm9taXNl
cyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRo
ZQotICAgICAgcmVqZWN0ZWQgc3RhdGUuICBBIGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEg
dGhlbmFibGUuICBTaW1pbGFybHksIGEKLSAgICAgIHJlamVjdGlvbiByZWFzb24gaXMgbmV2ZXIg
YSB0aGVuYWJsZS4KLQotICAgICAgUHJvbWlzZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2
ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgYWxzbyBhCi0gICAgICBwcm9taXNlLCB0aGVu
IHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1
ZSdzCi0gICAgICBzZXR0bGVkIHN0YXRlLiAgU28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBh
IHByb21pc2UgdGhhdCByZWplY3RzIHdpbGwKLSAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHBy
b21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGwKLSAgICAg
IGl0c2VsZiBmdWxmaWxsLgotCi0KLSAgICAgIEJhc2ljIFVzYWdlOgotICAgICAgLS0tLS0tLS0t
LS0tCi0KLSAgICAgIGBgYGpzCi0gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0
aW9uKHJlc29sdmUsIHJlamVjdCkgewotICAgICAgICAvLyBvbiBzdWNjZXNzCi0gICAgICAgIHJl
c29sdmUodmFsdWUpOwotCi0gICAgICAgIC8vIG9uIGZhaWx1cmUKLSAgICAgICAgcmVqZWN0KHJl
YXNvbik7Ci0gICAgICB9KTsKLQotICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7
Ci0gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50Ci0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsK
LSAgICAgICAgLy8gb24gcmVqZWN0aW9uCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBB
ZHZhbmNlZCBVc2FnZToKLSAgICAgIC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBQcm9taXNlcyBz
aGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNo
IGFzCi0gICAgICBgWE1MSHR0cFJlcXVlc3Rgcy4KLQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0
aW9uIGdldEpTT04odXJsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpewotICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Qo
KTsKLQotICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpOwotICAgICAgICAgIHhoci5vbnJl
YWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyOwotICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAn
anNvbic7Ci0gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNh
dGlvbi9qc29uJyk7Ci0gICAgICAgICAgeGhyLnNlbmQoKTsKLQotICAgICAgICAgIGZ1bmN0aW9u
IGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRP
TkUpIHsKLSAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApIHsKLSAgICAgICAg
ICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpOwotICAgICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoImdldEpTT046IGAiICsgdXJsICsgImAg
ZmFpbGVkIHdpdGggc3RhdHVzOiBbIiArIHRoaXMuc3RhdHVzICsgIl0iKTsKLSAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0pOwotICAgICAgfQot
Ci0gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikgewotICAg
ICAgICAvLyBvbiBmdWxmaWxsbWVudAotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAg
ICAgIC8vIG9uIHJlamVjdGlvbgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgVW5saWtl
IGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy4KLQot
ICAgICAgYGBganMKLSAgICAgIFByb21pc2UuYWxsKFsKLSAgICAgICAgZ2V0SlNPTignL3Bvc3Rz
JyksCi0gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpCi0gICAgICBdKS50aGVuKGZ1bmN0aW9u
KHZhbHVlcyl7Ci0gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT04KLSAgICAgICAgdmFs
dWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTgotCi0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAg
ICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBAY2xhc3MgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFy
YW0ge2Z1bmN0aW9ufQotICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmlu
ZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0g
ICAgICBAY29uc3RydWN0b3IKLSAgICAqLwotICAgIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIs
IGxhYmVsKSB7Ci0gICAgICBpZiAoIWlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7Ci0gICAgICAgIHRo
cm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0
aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTsKLSAgICAgIH0K
LQotICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7Ci0gICAgICAgIHRocm93
IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNl
IHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNh
bGxlZCBhcyBhIGZ1bmN0aW9uLiIpOwotICAgICAgfQotCi0gICAgICB0aGlzLl9pZCA9IGNvdW50
ZXIrKzsKLSAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7Ci0gICAgICB0aGlzLl9zdWJzY3JpYmVy
cyA9IFtdOwotCi0gICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAgICAgaW5zdHJ1
bWVudCgnY3JlYXRlZCcsIHRoaXMpOwotICAgICAgfQotCi0gICAgICBpZiAobm9vcCAhPT0gcmVz
b2x2ZXIpIHsKLSAgICAgICAgaW52b2tlUmVzb2x2ZXIocmVzb2x2ZXIsIHRoaXMpOwotICAgICAg
fQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNl
KSB7Ci0gICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkgewotICAgICAgICByZXNv
bHZlKHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gcmVqZWN0UHJv
bWlzZShyZWFzb24pIHsKLSAgICAgICAgcmVqZWN0KHByb21pc2UsIHJlYXNvbik7Ci0gICAgICB9
Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJlc29sdmVyKHJlc29sdmVQcm9taXNlLCByZWplY3RQ
cm9taXNlKTsKLSAgICAgIH0gY2F0Y2goZSkgewotICAgICAgICByZWplY3RQcm9taXNlKGUpOwot
ICAgICAgfQotICAgIH0KLQotICAgIFByb21pc2UuY2FzdCA9IGNhc3Q7Ci0gICAgUHJvbWlzZS5h
bGwgPSBhbGw7Ci0gICAgUHJvbWlzZS5yYWNlID0gcmFjZTsKLSAgICBQcm9taXNlLnJlc29sdmUg
PSBSZXNvbHZlOwotICAgIFByb21pc2UucmVqZWN0ID0gUmVqZWN0OwotCi0gICAgdmFyIFBFTkRJ
TkcgICA9IHZvaWQgMDsKLSAgICB2YXIgU0VBTEVEICAgID0gMDsKLSAgICB2YXIgRlVMRklMTEVE
ID0gMTsKLSAgICB2YXIgUkVKRUNURUQgID0gMjsKLQotICAgIGZ1bmN0aW9uIHN1YnNjcmliZShw
YXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikgewotICAgICAgdmFyIHN1
YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVyczsKLSAgICAgIHZhciBsZW5ndGggPSBzdWJz
Y3JpYmVycy5sZW5ndGg7Ci0KLSAgICAgIHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDsKLSAg
ICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50OwotICAg
ICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdICA9IG9uUmVqZWN0aW9uOwotICAgIH0K
LQotICAgIGZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSwgc2V0dGxlZCkgewotICAgICAgdmFyIGNo
aWxkLCBjYWxsYmFjaywgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycywgZGV0YWls
ID0gcHJvbWlzZS5fZGV0YWlsOwotCi0gICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAg
ICAgICAgaW5zdHJ1bWVudChzZXR0bGVkID09PSBGVUxGSUxMRUQgPyAnZnVsZmlsbGVkJyA6ICdy
ZWplY3RlZCcsIHByb21pc2UpOwotICAgICAgfQotCi0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAzKSB7Ci0gICAgICAgIGNoaWxkID0gc3Vic2NyaWJl
cnNbaV07Ci0gICAgICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdOwotCi0g
ICAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTsK
LSAgICAgIH0KLQotICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMgPSBudWxsOwotICAgIH0KLQot
ICAgIFByb21pc2UucHJvdG90eXBlID0gewotICAgICAgY29uc3RydWN0b3I6IFByb21pc2UsCi0K
LSAgICAgIF9pZDogdW5kZWZpbmVkLAotICAgICAgX2d1aWRLZXk6IGd1aWRLZXksCi0gICAgICBf
bGFiZWw6IHVuZGVmaW5lZCwKLQotICAgICAgX3N0YXRlOiB1bmRlZmluZWQsCi0gICAgICBfZGV0
YWlsOiB1bmRlZmluZWQsCi0gICAgICBfc3Vic2NyaWJlcnM6IHVuZGVmaW5lZCwKLQotICAgICAg
X29uZXJyb3I6IGZ1bmN0aW9uIChyZWFzb24pIHsKLSAgICAgICAgY29uZmlnLnRyaWdnZXIoJ2Vy
cm9yJywgcmVhc29uKTsKLSAgICAgIH0sCi0KLSAgICAvKioKLSAgICAgIFRoZSBwcmltYXJ5IHdh
eSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0
aG9kLAotICAgICAgd2hpY2ggcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBh
IHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUKLSAgICAgIHJlYXNvbiB3aHkgdGhlIHBy
b21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC4KLQotICAgICAgYGBganMKLSAgICAgIGZpbmRVc2Vy
KCkudGhlbihmdW5jdGlvbih1c2VyKXsKLSAgICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGUKLSAg
ICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7Ci0gICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUs
IGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5Ci0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBDaGFpbmluZwotICAgICAgLS0tLS0tLS0KLQotICAgICAgVGhlIHJldHVybiB2YWx1
ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAiZG93bnN0cmVh
bSIKLSAgICAgIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRo
ZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1lbnQKLSAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVy
LCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLgotCi0gICAg
ICBgYGBqcwotICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAg
IHJldHVybiB1c2VyLm5hbWU7Ci0gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7Ci0gICAgICAg
IHJldHVybiAiZGVmYXVsdCBuYW1lIjsKLSAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1l
KSB7Ci0gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwg
YmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXQKLSAgICAgICAgLy8gd2lsbCBiZSBgImRl
ZmF1bHQgbmFtZSJgCi0gICAgICB9KTsKLQotICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9u
ICh1c2VyKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiRm91bmQgdXNlciwgYnV0IHN0aWxs
IHVuaGFwcHkiKTsKLSAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKLSAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Iik7Ci0gICAg
ICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewotICAgICAgICAvLyBuZXZlciByZWFjaGVkCi0g
ICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7Ci0gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVs
ZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICJGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweSIu
Ci0gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgImBm
aW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHkiLgotICAgICAgfSk7Ci0gICAgICBg
YGAKLSAgICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJl
amVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVy
dGhlciBkb3duc3RyZWFtLgotCi0gICAgICBgYGBqcwotICAgICAgZmluZFVzZXIoKS50aGVuKGZ1
bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbigi
VXBzdHJlYW0gZXJyb3IiKTsKLSAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0gICAg
ICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0g
ICAgICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKLSAg
ICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhl
IHdheSBkb3duIHRvIGhlcmUKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEFzc2ltaWxh
dGlvbgotICAgICAgLS0tLS0tLS0tLS0tCi0KLSAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91
IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlCi0g
ICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJl
dHVybmluZyBhIHByb21pc2UgaW4gdGhlCi0gICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24g
aGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZwotICAg
ICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQg
KmFzc2ltaWxhdGlvbiouCi0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kVXNlcigpLnRoZW4oZnVu
Y3Rpb24gKHVzZXIpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIp
OwotICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKLSAgICAgICAgLy8gVGhlIHVz
ZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZQotICAgICAgfSk7Ci0gICAgICBgYGAKLQot
ICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0
cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWplY3QuCi0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5k
VXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50
c0J5QXV0aG9yKHVzZXIpOwotICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKLSAg
ICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0
aGUgdmFsdWUgaGVyZQotICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewotICAgICAgICAvLyBJ
ZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBo
ZXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBTaW1wbGUgRXhhbXBsZQotICAgICAg
LS0tLS0tLS0tLS0tLS0KLQotICAgICAgU3luY2hyb25vdXMgRXhhbXBsZQotCi0gICAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgICB2YXIgcmVzdWx0OwotCi0gICAgICB0cnkgewotICAgICAgICByZXN1
bHQgPSBmaW5kUmVzdWx0KCk7Ci0gICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVh
c29uKSB7Ci0gICAgICAgIC8vIGZhaWx1cmUKLSAgICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBF
cnJiYWNrIEV4YW1wbGUKLQotICAgICAgYGBganMKLSAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24o
cmVzdWx0LCBlcnIpewotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgLy8gZmFpbHVyZQot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotICAgICAg
fSk7Ci0gICAgICBgYGAKLQotICAgICAgUHJvbWlzZSBFeGFtcGxlOwotCi0gICAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAg
ICAvLyBzdWNjZXNzCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pewotICAgICAgICAvLyBmYWls
dXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBBZHZhbmNlZCBFeGFtcGxlCi0gICAg
ICAtLS0tLS0tLS0tLS0tLQotCi0gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlCi0KLSAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgIHZhciBhdXRob3IsIGJvb2tzOwotCi0gICAgICB0cnkgewotICAg
ICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7Ci0gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5
QXV0aG9yKGF1dGhvcik7Ci0gICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVhc29u
KSB7Ci0gICAgICAgIC8vIGZhaWx1cmUKLSAgICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBFcnJi
YWNrIEV4YW1wbGUKLQotICAgICAgYGBganMKLQotICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhi
b29rcykgewotCi0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7Ci0K
LSAgICAgIH0KLQotICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7Ci0gICAg
ICAgIGlmIChlcnIpIHsKLSAgICAgICAgICBmYWlsdXJlKGVycik7Ci0gICAgICAgICAgLy8gZmFp
bHVyZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5k
Qm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7Ci0gICAgICAgICAg
ICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICBmYWlsdXJlKGVycik7Ci0gICAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgIGZv
dW5kQm9va3MoYm9va3MpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAg
ICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7Ci0g
ICAgICAgICAgICBmYWlsdXJlKGVycik7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIHN1Y2Nl
c3MKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgUHJvbWlzZSBFeGFt
cGxlOwotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBmaW5kQXV0aG9yKCkuCi0gICAgICAg
IHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLgotICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXsK
LSAgICAgICAgICAvLyBmb3VuZCBib29rcwotICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29u
KXsKLSAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgIH0pOwotICAgICAgYGBg
Ci0KLSAgICAgIEBtZXRob2QgdGhlbgotICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxs
ZWQKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWQKLSAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0KLSAgICAqLwot
ICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24sIGxhYmVsKSB7
Ci0gICAgICAgIHZhciBwcm9taXNlID0gdGhpczsKLSAgICAgICAgdGhpcy5fb25lcnJvciA9IG51
bGw7Ci0KLSAgICAgICAgdmFyIHRoZW5Qcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9v
cCwgbGFiZWwpOwotCi0gICAgICAgIGlmICh0aGlzLl9zdGF0ZSkgewotICAgICAgICAgIHZhciBj
YWxsYmFja3MgPSBhcmd1bWVudHM7Ci0gICAgICAgICAgY29uZmlnLmFzeW5jKGZ1bmN0aW9uIGlu
dm9rZVByb21pc2VDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKHByb21p
c2UuX3N0YXRlLCB0aGVuUHJvbWlzZSwgY2FsbGJhY2tzW3Byb21pc2UuX3N0YXRlIC0gMV0sIHBy
b21pc2UuX2RldGFpbCk7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgc3Vic2NyaWJlKHRoaXMsIHRoZW5Qcm9taXNlLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlv
bik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAg
ICAgICBpbnN0cnVtZW50KCdjaGFpbmVkJywgcHJvbWlzZSwgdGhlblByb21pc2UpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW5Qcm9taXNlOwotICAgICAgfSwKLQotICAgIC8qKgot
ICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWpl
Y3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZQotICAgICAgYXMgdGhlIGNhdGNoIGJsb2Nr
IG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC4KLQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0aW9u
IGZpbmRBdXRob3IoKXsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjb3VsZG4ndCBmaW5kIHRo
YXQgYXV0aG9yIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN5bmNocm9ub3VzCi0gICAgICB0cnkg
ewotICAgICAgICBmaW5kQXV0aG9yKCk7Ci0gICAgICB9IGNhdGNoKHJlYXNvbikgewotICAgICAg
ICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAgfQotCi0gICAgICAvLyBhc3luYyB3aXRo
IHByb21pc2VzCi0gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAg
ICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAg
ICAgIEBtZXRob2QgY2F0Y2gKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCi0g
ICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0
aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1By
b21pc2V9Ci0gICAgKi8KLSAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uLCBsYWJl
bCkgewotICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uLCBsYWJlbCk7
Ci0gICAgICB9LAotCi0gICAgLyoqCi0gICAgICBgZmluYWxseWAgd2lsbCBiZSBpbnZva2VkIHJl
Z2FyZGxlc3Mgb2YgdGhlIHByb21pc2UncyBmYXRlIGp1c3QgYXMgbmF0aXZlCi0gICAgICB0cnkv
Y2F0Y2gvZmluYWxseSBiZWhhdmVzCi0KLSAgICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6Ci0KLSAg
ICAgIGBgYGpzCi0gICAgICBmaW5kQXV0aG9yKCkgewotICAgICAgICBpZiAoTWF0aC5yYW5kb20o
KSA+IDAuNSkgewotICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBuZXcgQXV0aG9yKCk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAg
IHJldHVybiBmaW5kQXV0aG9yKCk7IC8vIHN1Y2NlZWQgb3IgZmFpbAotICAgICAgfSBjYXRjaChl
cnJvcikgewotICAgICAgICByZXR1cm4gZmluZE90aGVyQXV0aGVyKCk7Ci0gICAgICB9IGZpbmFs
bHkgewotICAgICAgICAvLyBhbHdheXMgcnVucwotICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0
aGUgcmV0dXJuIHZhbHVlCi0gICAgICB9Ci0gICAgICBgYGAKLQotICAgICAgQXN5bmNocm9ub3Vz
IGV4YW1wbGU6Ci0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rp
b24ocmVhc29uKXsKLSAgICAgICAgcmV0dXJuIGZpbmRPdGhlckF1dGhlcigpOwotICAgICAgfSku
ZmluYWxseShmdW5jdGlvbigpewotICAgICAgICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwg
b3Igbm90Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBAbWV0aG9kIGZpbmFsbHkKLSAg
ICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFi
ZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1
bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICAgICdm
aW5hbGx5JzogZnVuY3Rpb24oY2FsbGJhY2ssIGxhYmVsKSB7Ci0gICAgICAgIHZhciBjb25zdHJ1
Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5j
dGlvbih2YWx1ZSkgewotICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5jYXN0KGNhbGxiYWNr
KCkpLnRoZW4oZnVuY3Rpb24oKXsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAg
ICB9KTsKLSAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgICAgcmV0dXJuIGNv
bnN0cnVjdG9yLmNhc3QoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigpewotICAgICAgICAgICAg
dGhyb3cgcmVhc29uOwotICAgICAgICAgIH0pOwotICAgICAgICB9LCBsYWJlbCk7Ci0gICAgICB9
Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2Us
IGNhbGxiYWNrLCBkZXRhaWwpIHsKLSAgICAgIHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24o
Y2FsbGJhY2spLAotICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7Ci0K
LSAgICAgIGlmIChoYXNDYWxsYmFjaykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHZhbHVl
ID0gY2FsbGJhY2soZGV0YWlsKTsKLSAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlOwotICAgICAg
ICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICAgIGVycm9y
ID0gZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWUgPSBkZXRhaWw7
Ci0gICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYW5kbGVU
aGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNl
IGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHsKLSAgICAgICAgcmVzb2x2ZShwcm9taXNl
LCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkgewotICAgICAgICByZWplY3QocHJv
bWlzZSwgZXJyb3IpOwotICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBGVUxGSUxMRUQpIHsK
LSAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHNldHRs
ZWQgPT09IFJFSkVDVEVEKSB7Ci0gICAgICAgIHJlamVjdChwcm9taXNlLCB2YWx1ZSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gaGFuZGxlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUp
IHsKLSAgICAgIHZhciB0aGVuID0gbnVsbCwKLSAgICAgIHJlc29sdmVkOwotCi0gICAgICB0cnkg
ewotICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcg
VHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHBy
b21pc2UuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1
ZSkpIHsKLSAgICAgICAgICB0aGVuID0gdmFsdWUudGhlbjsKLQotICAgICAgICAgIGlmIChpc0Z1
bmN0aW9uKHRoZW4pKSB7Ci0gICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZh
bCkgewotICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAg
ICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0g
dmFsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWwpOwotICAgICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTsKLSAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgZnVuY3Rpb24odmFsKSB7Ci0gICAgICAgICAg
ICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgICByZXNvbHZl
ZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgcmVqZWN0KHByb21pc2UsIHZhbCk7Ci0gICAgICAg
ICAgICB9LCAnZGVyaXZlZCBmcm9tOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBw
cm9taXNlJykpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgIH0gY2F0Y2ggKGVycm9yKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlZCkgeyBy
ZXR1cm4gdHJ1ZTsgfQotICAgICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpOwotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IGZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpIHsKLSAgICAgIGlmIChwcm9taXNlID09
PSB2YWx1ZSkgewotICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0gZWxz
ZSBpZiAoIWhhbmRsZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKSkgewotICAgICAgICBmdWxmaWxs
KHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxs
KHByb21pc2UsIHZhbHVlKSB7Ci0gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcp
IHsgcmV0dXJuOyB9Ci0gICAgICBwcm9taXNlLl9zdGF0ZSA9IFNFQUxFRDsKLSAgICAgIHByb21p
c2UuX2RldGFpbCA9IHZhbHVlOwotCi0gICAgICBjb25maWcuYXN5bmMocHVibGlzaEZ1bGZpbGxt
ZW50LCBwcm9taXNlKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVh
c29uKSB7Ci0gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9
Ci0gICAgICBwcm9taXNlLl9zdGF0ZSA9IFNFQUxFRDsKLSAgICAgIHByb21pc2UuX2RldGFpbCA9
IHJlYXNvbjsKLQotICAgICAgY29uZmlnLmFzeW5jKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2Up
OwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHB1Ymxpc2hGdWxmaWxsbWVudChwcm9taXNlKSB7Ci0g
ICAgICBwdWJsaXNoKHByb21pc2UsIHByb21pc2UuX3N0YXRlID0gRlVMRklMTEVEKTsKLSAgICB9
Ci0KLSAgICBmdW5jdGlvbiBwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHsKLSAgICAgIGlmIChw
cm9taXNlLl9vbmVycm9yKSB7Ci0gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fZGV0
YWlsKTsKLSAgICAgIH0KLQotICAgICAgcHVibGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9
IFJFSkVDVEVEKTsKLSAgICB9Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvYWxsIiwgCi0g
IFsiLi4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19l
eHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVu
ZGVuY3kxX18uaXNBcnJheTsKLSAgICB2YXIgaXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFf
Xy5pc05vblRoZW5hYmxlOwotCi0gICAgLyoqCi0gICAgICBgUlNWUC5Qcm9taXNlLmFsbGAgYWNj
ZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGlj
aAotICAgICAgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVz
IGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBvcgotICAgICAgcmVqZWN0ZWQgd2l0aCB0aGUgcmVh
c29uIG9mIHRoZSBmaXJzdCBwYXNzZWQgcHJvbWlzZSB0byBiZSByZWplY3RlZC4gSXQgY2FzdHMg
YWxsCi0gICAgICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFz
IGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCi0KLSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgIGBgYGph
dmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKLSAgICAgIHZh
ciBwcm9taXNlMiA9IFJTVlAucmVzb2x2ZSgyKTsKLSAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAu
cmVzb2x2ZSgzKTsKLSAgICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBw
cm9taXNlMyBdOwotCi0gICAgICBSU1ZQLlByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0
aW9uKGFycmF5KXsKLSAgICAgICAgLy8gVGhlIGFycmF5IGhlcmUgd291bGQgYmUgWyAxLCAyLCAz
IF07Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNl
c2AgZ2l2ZW4gdG8gYFJTVlAuYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCi0g
ICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhl
IHJldHVybmVkIHByb21pc2VzJ3MKLSAgICAgIHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBs
ZToKLQotICAgICAgRXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHBy
b21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOwotICAgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZWpl
Y3QobmV3IEVycm9yKCIyIikpOwotICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3
IEVycm9yKCIzIikpOwotICAgICAgdmFyIHByb21pc2VzID0gWyBwcm9taXNlMSwgcHJvbWlzZTIs
IHByb21pc2UzIF07Ci0KLSAgICAgIFJTVlAuUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVu
Y3Rpb24oYXJyYXkpewotICAgICAgICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVucyBiZWNhdXNlIHRo
ZXJlIGFyZSByZWplY3RlZCBwcm9taXNlcyEKLSAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7Ci0g
ICAgICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09ICIyIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQot
ICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBmb3IgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFyYW0g
e0FycmF5fSBlbnRyaWVzIGFycmF5IG9mIHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30g
bGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVz
ZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBp
cyBmdWxmaWxsZWQgd2hlbiBhbGwgYHByb21pc2VzYCBoYXZlIGJlZW4KLSAgICAgIGZ1bGZpbGxl
ZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLgotICAgICAgQHN0
YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGFsbChl
bnRyaWVzLCBsYWJlbCkgewotCi0gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwotICAg
ICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsKLQotICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rv
cihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgaWYgKCFpc0FycmF5KGVudHJp
ZXMpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBh
cnJheSB0byBhbGwuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcmVtYWluaW5nID0gZW50
cmllcy5sZW5ndGg7Ci0gICAgICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KHJlbWFpbmluZyk7
Ci0gICAgICAgIHZhciBlbnRyeSwgcGVuZGluZyA9IHRydWU7Ci0KLSAgICAgICAgaWYgKHJlbWFp
bmluZyA9PT0gMCkgewotICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7Ci0gICAgICAgICAgcmV0
dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gZnVsZmlsbG1lbnRBdChpbmRleCkg
ewotICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0
c1tpbmRleF0gPSB2YWx1ZTsKLSAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewot
ICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAg
IH07Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHsK
LSAgICAgICAgICByZW1haW5pbmcgPSAwOwotICAgICAgICAgIHJlamVjdChyZWFzb24pOwotICAg
ICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGVudHJpZXMubGVu
Z3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKLSAgICAg
ICAgICBpZiAoaXNOb25UaGVuYWJsZShlbnRyeSkpIHsKLSAgICAgICAgICAgIHJlc3VsdHNbaW5k
ZXhdID0gZW50cnk7Ci0gICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIHsKLSAgICAg
ICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgQ29uc3RydWN0b3IuY2FzdChlbnRyeSkudGhlbihmdWxmaWxsbWVu
dEF0KGluZGV4KSwgb25SZWplY3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
fSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvY2FzdCIsIAot
ICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmlj
dCI7Ci0gICAgLyoqCi0gICAgICBgUlNWUC5Qcm9taXNlLmNhc3RgIGNvZXJjZXMgaXRzIGFyZ3Vt
ZW50IHRvIGEgcHJvbWlzZSwgb3IgcmV0dXJucyB0aGUKLSAgICAgIGFyZ3VtZW50IGlmIGl0IGlz
IGFscmVhZHkgYSBwcm9taXNlIHdoaWNoIHNoYXJlcyBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNh
c3Rlci4KLQotICAgICAgRXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFy
IHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVzb2x2ZSgxKTsKLSAgICAgIHZhciBjYXN0ZWQgPSBS
U1ZQLlByb21pc2UuY2FzdChwcm9taXNlKTsKLQotICAgICAgY29uc29sZS5sb2cocHJvbWlzZSA9
PT0gY2FzdGVkKTsgLy8gdHJ1ZQotICAgICAgYGBgCi0KLSAgICAgIEluIHRoZSBjYXNlIG9mIGEg
cHJvbWlzZSB3aG9zZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCBtYXRjaCwgaXQgaXMgYXNzaW1pbGF0
ZWQuCi0gICAgICBUaGUgcmVzdWx0aW5nIHByb21pc2Ugd2lsbCBmdWxmaWxsIG9yIHJlamVjdCBi
YXNlZCBvbiB0aGUgb3V0Y29tZSBvZiB0aGUKLSAgICAgIHByb21pc2UgYmVpbmcgY2FzdGVkLgot
Ci0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgdGhlbm5h
YmxlID0gJC5nZXRKU09OKCcvYXBpL2ZvbycpOwotICAgICAgdmFyIGNhc3RlZCA9IFJTVlAuUHJv
bWlzZS5jYXN0KHRoZW5uYWJsZSk7Ci0KLSAgICAgIGNvbnNvbGUubG9nKHRoZW5uYWJsZSA9PT0g
Y2FzdGVkKTsgLy8gZmFsc2UKLSAgICAgIGNvbnNvbGUubG9nKGNhc3RlZCBpbnN0YW5jZW9mIFJT
VlAuUHJvbWlzZSkgLy8gdHJ1ZQotCi0gICAgICBjYXN0ZWQudGhlbihmdW5jdGlvbihkYXRhKSB7
Ci0gICAgICAgIC8vIGRhdGEgaXMgdGhlIHZhbHVlIGdldEpTT04gZnVsZmlsbHMgd2l0aAotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tcHJvbWlzZSwg
YSBwcm9taXNlIHdoaWNoIHdpbGwgZnVsZmlsbCB3aXRoIHRoYXQgdmFsdWUgaXMKLSAgICAgIHJl
dHVybmVkLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2
YXIgdmFsdWUgPSAxOyAvLyBjb3VsZCBiZSBhIG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCB1bmRl
ZmluZWQuLi4KLSAgICAgIHZhciBjYXN0ZWQgPSBSU1ZQLlByb21pc2UuY2FzdCh2YWx1ZSk7Ci0K
LSAgICAgIGNvbnNvbGUubG9nKHZhbHVlID09PSBjYXN0ZWQpOyAvLyBmYWxzZQotICAgICAgY29u
c29sZS5sb2coY2FzdGVkIGluc3RhbmNlb2YgUlNWUC5Qcm9taXNlKSAvLyB0cnVlCi0KLSAgICAg
IGNhc3RlZC50aGVuKGZ1bmN0aW9uKHZhbCkgewotICAgICAgICB2YWwgPT09IHZhbHVlIC8vID0+
IHRydWUKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIGBSU1ZQLlByb21pc2UuY2FzdGAg
aXMgc2ltaWxhciB0byBgUlNWUC5Qcm9taXNlLnJlc29sdmVgLCBidXQgYFJTVlAuUHJvbWlzZS5j
YXN0YCBkaWZmZXJzIGluIHRoZQotICAgICAgZm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICogYFJT
VlAuUHJvbWlzZS5jYXN0YCBzZXJ2ZXMgYXMgYSBtZW1vcnktZWZmaWNpZW50IHdheSBvZiBnZXR0
aW5nIGEgcHJvbWlzZSwgd2hlbiB5b3UKLSAgICAgIGhhdmUgc29tZXRoaW5nIHRoYXQgY291bGQg
ZWl0aGVyIGJlIGEgcHJvbWlzZSBvciBhIHZhbHVlLiBSU1ZQLnJlc29sdmUKLSAgICAgIHdpbGwg
aGF2ZSB0aGUgc2FtZSBlZmZlY3QgYnV0IHdpbGwgY3JlYXRlIGEgbmV3IHByb21pc2Ugd3JhcHBl
ciBpZiB0aGUKLSAgICAgIGFyZ3VtZW50IGlzIGEgcHJvbWlzZS4KLSAgICAgICogYFJTVlAuUHJv
bWlzZS5jYXN0YCBpcyBhIHdheSBvZiBjYXN0aW5nIGluY29taW5nIHRoZW5hYmxlcyBvciBwcm9t
aXNlIHN1YmNsYXNzZXMgdG8KLSAgICAgIHByb21pc2VzIG9mIHRoZSBleGFjdCBjbGFzcyBzcGVj
aWZpZWQsIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBvYmplY3QncyBgdGhlbmAgaXMKLSAgICAgIGVu
c3VyZWQgdG8gaGF2ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGNvbnN0cnVjdG9yIHlvdSBhcmUgY2Fs
bGluZyBjYXN0IG9uIChpLmUuLCBSU1ZQLlByb21pc2UpLgotCi0gICAgICBAbWV0aG9kIGNhc3QK
LSAgICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdG8gYmUgY2FzdGVkCi0gICAgICBAcGFyYW0g
e1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4K
LSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21p
c2UKLSAgICAgIEBzdGF0aWMKLSAgICAqLwotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9
IGZ1bmN0aW9uIGNhc3Qob2JqZWN0LCBsYWJlbCkgewotICAgICAgLypqc2hpbnQgdmFsaWR0aGlz
OnRydWUgKi8KLSAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7Ci0KLSAgICAgIGlmIChvYmpl
Y3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09
PSBDb25zdHJ1Y3RvcikgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgfQotCi0gICAg
ICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUpIHsKLSAgICAgICAgcmVz
b2x2ZShvYmplY3QpOwotICAgICAgfSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJy
c3ZwL3Byb21pc2UvcmFjZSIsIAotICBbIi4uL3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5jdGlv
bihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAg
IC8qIGdsb2JhbCB0b1N0cmluZyAqLwotCi0gICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kx
X18uaXNBcnJheTsKLSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5kZW5jeTFfXy5pc0Z1bmN0
aW9uOwotICAgIHZhciBpc05vblRoZW5hYmxlID0gX19kZXBlbmRlbmN5MV9fLmlzTm9uVGhlbmFi
bGU7Ci0KLSAgICAvKioKLSAgICAgIGBSU1ZQLlByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBw
cm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZQotICAgICAgZmly
c3QgcGFzc2VkIHByb21pc2UgdG8gc2V0dGxlLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZTEgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0
aW9uKHJlc29sdmUsIHJlamVjdCl7Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAg
ICAgICAgICByZXNvbHZlKCJwcm9taXNlIDEiKTsKLSAgICAgICAgfSwgMjAwKTsKLSAgICAgIH0p
OwotCi0gICAgICB2YXIgcHJvbWlzZTIgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29s
dmUsIHJlamVjdCl7Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICBy
ZXNvbHZlKCJwcm9taXNlIDIiKTsKLSAgICAgICAgfSwgMTAwKTsKLSAgICAgIH0pOwotCi0gICAg
ICBSU1ZQLlByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihy
ZXN1bHQpewotICAgICAgICAvLyByZXN1bHQgPT09ICJwcm9taXNlIDIiIGJlY2F1c2UgaXQgd2Fz
IHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMQotICAgICAgICAvLyB3YXMgcmVzb2x2ZWQuCi0gICAg
ICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBgUlNWUC5Qcm9taXNlLnJhY2VgIGlzIGRldGVybWlu
aXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3QKLSAgICAgIHNldHRsZWQg
cHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBsZSwgZXZlbiBpZiBvdGhlciBwcm9taXNlcyBnaXZl
biB0byB0aGUKLSAgICAgIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBi
dXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlzZSBoYXMKLSAgICAgIGJlY29tZSByZWplY3RlZCBi
ZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJlY2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZAot
ICAgICAgcHJvbWlzZSB3aWxsIGJlY29tZSByZWplY3RlZDoKLQotICAgICAgYGBgamF2YXNjcmlw
dAotICAgICAgdmFyIHByb21pc2UxID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZl
LCByZWplY3QpewotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgcmVz
b2x2ZSgicHJvbWlzZSAxIik7Ci0gICAgICAgIH0sIDIwMCk7Ci0gICAgICB9KTsKLQotICAgICAg
dmFyIHByb21pc2UyID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qp
ewotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgcmVqZWN0KG5ldyBF
cnJvcigicHJvbWlzZSAyIikpOwotICAgICAgICB9LCAxMDApOwotICAgICAgfSk7Ci0KLSAgICAg
IFJTVlAuUHJvbWlzZS5yYWNlKFtwcm9taXNlMSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJl
c3VsdCl7Ci0gICAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zCi0gICAgICB9LCBmdW5jdGlv
bihyZWFzb24pewotICAgICAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gInByb21pc2UyIiBiZWNh
dXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0ZWQgYmVmb3JlCi0gICAgICAgIC8vIHByb21pc2Ug
MSBiZWNhbWUgZnVsZmlsbGVkCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBBbiBleGFt
cGxlIHJlYWwtd29ybGQgdXNlIGNhc2UgaXMgaW1wbGVtZW50aW5nIHRpbWVvdXRzOgotCi0gICAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgICBSU1ZQLlByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24n
KSwgdGltZW91dCg1MDAwKV0pCi0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByYWNlCi0gICAg
ICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlCi0g
ICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBkZXNjcmliaW5n
IHRoZSBwcm9taXNlIHJldHVybmVkLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAg
QHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5
IGFzIHRoZSBmaXJzdCBwYXNzZWQKLSAgICAgIHByb21pc2UgdG8gc2V0dGxlLgotICAgICAgQHN0
YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJhY2Uo
ZW50cmllcywgbGFiZWwpIHsKLSAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovCi0gICAg
ICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLCBlbnRyeTsKLQotICAgICAgcmV0dXJuIG5ldyBDb25z
dHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgaWYgKCFpc0FycmF5
KGVudHJpZXMpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFz
cyBhbiBhcnJheSB0byByYWNlLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHBlbmRpbmcg
PSB0cnVlOwotCi0gICAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHsgaWYgKHBl
bmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyByZXNvbHZlKHZhbHVlKTsgfSB9Ci0gICAgICAgIGZ1
bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikgIHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZh
bHNlOyByZWplY3QocmVhc29uKTsgfSB9Ci0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBl
bnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgZW50cnkgPSBlbnRyaWVzW2ldOwotICAg
ICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVudHJ5KSkgewotICAgICAgICAgICAgcGVuZGluZyA9
IGZhbHNlOwotICAgICAgICAgICAgcmVzb2x2ZShlbnRyeSk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yLmNhc3QoZW50cnkp
LnRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgfSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2Uv
cmVqZWN0IiwgCi0gIFsiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2V4cG9ydHNfXykgewotICAg
ICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAgICAgIGBSU1ZQLlByb21pc2UucmVqZWN0YCByZXR1
cm5zIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBwYXNzZWQgYHJlYXNvbmAuCi0gICAgICBJ
dCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQK
LSAgICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpewotICAgICAgICByZWplY3QobmV3IEVycm9yKCdXSE9PUFMnKSk7Ci0gICAgICB9KTsK
LQotICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKLSAgICAgICAgLy8gQ29kZSBo
ZXJlIGRvZXNuJ3QgcnVuIGJlY2F1c2UgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQhCi0gICAgICB9
LCBmdW5jdGlvbihyZWFzb24pewotICAgICAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09Q
UycKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUg
YWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKLQotICAg
ICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVqZWN0
KG5ldyBFcnJvcignV0hPT1BTJykpOwotCi0gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFs
dWUpewotICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlz
ZSBpcyByZWplY3RlZCEKLSAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7Ci0gICAgICAgIC8vIHJl
YXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJwotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
QG1ldGhvZCByZWplY3QKLSAgICAgIEBwYXJhbSB7QW55fSByZWFzb24gdmFsdWUgdGhhdCB0aGUg
cmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGguCi0gICAgICBAcGFyYW0ge1N0
cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQg
cHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21p
c2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC4KLSAgICAgIEBz
dGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiByZWpl
Y3QocmVhc29uLCBsYWJlbCkgewotICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KLSAg
ICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7Ci0KLSAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0
b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewotICAgICAgICByZWplY3QocmVhc29uKTsK
LSAgICAgIH0sIGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9wcm9taXNlL3Jl
c29sdmUiLCAKLSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAg
InVzZSBzdHJpY3QiOwotICAgIC8qKgotICAgICAgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYCByZXR1
cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdpdGggdGhlCi0gICAgICBw
YXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOgotCi0gICAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBSU1ZQLlByb21pc2UoZnVu
Y3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKLSAgICAgICAgcmVzb2x2ZSgxKTsKLSAgICAgIH0pOwot
Ci0gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAvLyB2YWx1ZSA9
PT0gMQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgSW5zdGVhZCBvZiB3cml0aW5nIHRo
ZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOgotCi0g
ICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZSA9IFJTVlAuUHJvbWlzZS5yZXNv
bHZlKDEpOwotCi0gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAv
LyB2YWx1ZSA9PT0gMQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByZXNv
bHZlCi0gICAgICBAcGFyYW0ge0FueX0gdmFsdWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJv
bWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGgKLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBv
cHRpb25hbCBzdHJpbmcgZm9yIGlkZW50aWZ5aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlLgotICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNl
IHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCi0gICAgICBgdmFsdWVg
Ci0gICAgICBAc3RhdGljCi0gICAgKi8KLSAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVu
Y3Rpb24gcmVzb2x2ZSh2YWx1ZSwgbGFiZWwpIHsKLSAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0
cnVlICovCi0gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOwotCi0gICAgICByZXR1cm4gbmV3
IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewotICAgICAgICByZXNvbHZl
KHZhbHVlKTsKLSAgICAgIH0sIGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9y
YWNlIiwgCi0gIFsiLi9wcm9taXNlIiwiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVu
Y3kxX18sIF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9taXNl
ID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0KLSAgICAvKioKLSAgICAgIFRoaXMgaXMg
YSBjb252ZW5pZW50IGFsaWFzIGZvciBgUlNWUC5Qcm9taXNlLnJhY2VgLgotCi0gICAgICBAbWV0
aG9kIHJhY2UKLSAgICAgIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFycmF5IG9mIHByb21pc2VzLgot
ICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEFuIG9wdGlvbmFsIGxhYmVsLiBUaGlzIGlzIHVz
ZWZ1bAotICAgICAgZm9yIHRvb2xpbmcuCi0gICAgICBAc3RhdGljCi0gICAgKi8KLSAgICBfX2V4
cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmFjZShhcnJheSwgbGFiZWwpIHsKLSAgICAg
IHJldHVybiBQcm9taXNlLnJhY2UoYXJyYXksIGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmlu
ZSgicnN2cC9yZWplY3QiLCAKLSAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9u
KF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAg
dmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIC8qKgotICAg
ICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIGBSU1ZQLlByb21pc2UucmVqZWN0YC4K
LQotICAgICAgQG1ldGhvZCByZWplY3QKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtB
bnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0
ZWQgd2l0aC4KLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9y
IGlkZW50aWZ5aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29s
aW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhl
IGdpdmVuIGByZWFzb25gLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19b
ImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJlamVjdChyZWFzb24sIGxhYmVsKSB7Ci0gICAgICByZXR1
cm4gUHJvbWlzZS5yZWplY3QocmVhc29uLCBsYWJlbCk7Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUo
InJzdnAvcmVzb2x2ZSIsIAotICBbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24o
X19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2
YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotCi0gICAgLyoqCi0gICAg
ICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYC4K
LQotICAgICAgQG1ldGhvZCByZXNvbHZlCi0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7
QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2
ZWQgd2l0aAotICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3Ig
aWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xp
bmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSBm
dWxmaWxsZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgIGB2YWx1ZWAKLSAgICAgIEBzdGF0aWMKLSAg
ICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiByZXNvbHZlKHZhbHVl
LCBsYWJlbCkgewotICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSwgbGFiZWwpOwot
ICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3JldGhyb3ciLCAKLSAgWyJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIC8qKgotICAg
ICAgYFJTVlAucmV0aHJvd2Agd2lsbCByZXRocm93IGFuIGVycm9yIG9uIHRoZSBuZXh0IHR1cm4g
b2YgdGhlIEphdmFTY3JpcHQgZXZlbnQKLSAgICAgIGxvb3AgaW4gb3JkZXIgdG8gYWlkIGRlYnVn
Z2luZy4KLQotICAgICAgUHJvbWlzZXMgQSsgc3BlY2lmaWVzIHRoYXQgYW55IGV4Y2VwdGlvbnMg
dGhhdCBvY2N1ciB3aXRoIGEgcHJvbWlzZSBtdXN0IGJlCi0gICAgICBjYXVnaHQgYnkgdGhlIHBy
b21pc2VzIGltcGxlbWVudGF0aW9uIGFuZCBidWJibGVkIHRvIHRoZSBsYXN0IGhhbmRsZXIuIEZv
cgotICAgICAgdGhpcyByZWFzb24sIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cyBz
cGVjaWZ5IGEgc2Vjb25kIHJlamVjdGlvbgotICAgICAgaGFuZGxlciBmdW5jdGlvbiB0byBgdGhl
bmAuIEhvd2V2ZXIsIGBSU1ZQLnJldGhyb3dgIHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAg
ICAgb3V0c2lkZSBvZiB0aGUgcHJvbWlzZSwgc28gaXQgYnViYmxlcyB1cCB0byB5b3VyIGNvbnNv
bGUgaWYgaW4gdGhlIGJyb3dzZXIsCi0gICAgICBvciBkb21haW4vY2F1c2UgdW5jYXVnaHQgZXhj
ZXB0aW9uIGluIE5vZGUuIGByZXRocm93YCB3aWxsIGFsc28gdGhyb3cgdGhlCi0gICAgICBlcnJv
ciBhZ2FpbiBzbyB0aGUgZXJyb3IgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIHByb21pc2UgcGVyIHRo
ZSBzcGVjLgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBmdW5jdGlvbiB0aHJvd3MoKXsK
LSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaG9vcHMhJyk7Ci0gICAgICB9Ci0KLSAgICAgIHZh
ciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpewot
ICAgICAgICB0aHJvd3MoKTsKLSAgICAgIH0pOwotCi0gICAgICBwcm9taXNlLmNhdGNoKFJTVlAu
cmV0aHJvdykudGhlbihmdW5jdGlvbigpewotICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBy
dW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBiZWNhbWUgcmVqZWN0ZWQgZHVlIHRvIGFuCi0gICAgICAg
IC8vIGVycm9yIQotICAgICAgfSwgZnVuY3Rpb24gKGVycil7Ci0gICAgICAgIC8vIGhhbmRsZSB0
aGUgZXJyb3IgaGVyZQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgVGhlICdXaG9vcHMn
IGVycm9yIHdpbGwgYmUgdGhyb3duIG9uIHRoZSBuZXh0IHR1cm4gb2YgdGhlIGV2ZW50IGxvb3AK
LSAgICAgIGFuZCB5b3UgY2FuIHdhdGNoIGZvciBpdCBpbiB5b3VyIGNvbnNvbGUuIFlvdSBjYW4g
YWxzbyBoYW5kbGUgaXQgdXNpbmcgYQotICAgICAgcmVqZWN0aW9uIGhhbmRsZXIgZ2l2ZW4gdG8g
YC50aGVuYCBvciBgLmNhdGNoYCBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KLQotICAgICAgQG1l
dGhvZCByZXRocm93Ci0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7RXJyb3J9IHJlYXNv
biByZWFzb24gdGhlIHByb21pc2UgYmVjYW1lIHJlamVjdGVkLgotICAgICAgQHRocm93cyBFcnJv
cgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1
bmN0aW9uIHJldGhyb3cocmVhc29uKSB7Ci0gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewot
ICAgICAgICB0aHJvdyByZWFzb247Ci0gICAgICB9KTsKLSAgICAgIHRocm93IHJlYXNvbjsKLSAg
ICB9OwotICB9KTsKLWRlZmluZSgicnN2cC91dGlscyIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVu
Y3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgZnVuY3Rpb24gb2Jq
ZWN0T3JGdW5jdGlvbih4KSB7Ci0gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIg
fHwgKHR5cGVvZiB4ID09PSAib2JqZWN0IiAmJiB4ICE9PSBudWxsKTsKLSAgICB9Ci0KLSAgICBf
X2V4cG9ydHNfXy5vYmplY3RPckZ1bmN0aW9uID0gb2JqZWN0T3JGdW5jdGlvbjtmdW5jdGlvbiBp
c0Z1bmN0aW9uKHgpIHsKLSAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIjsKLSAg
ICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtmdW5jdGlvbiBp
c05vblRoZW5hYmxlKHgpIHsKLSAgICAgIHJldHVybiAhb2JqZWN0T3JGdW5jdGlvbih4KTsKLSAg
ICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc05vblRoZW5hYmxlID0gaXNOb25UaGVuYWJsZTtmdW5j
dGlvbiBpc0FycmF5KHgpIHsKLSAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5n
LmNhbGwoeCkgPT09ICJbb2JqZWN0IEFycmF5XSI7Ci0gICAgfQotCi0gICAgX19leHBvcnRzX18u
aXNBcnJheSA9IGlzQXJyYXk7Ly8gRGF0ZS5ub3cgaXMgbm90IGF2YWlsYWJsZSBpbiBicm93c2Vy
cyA8IElFOQotICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3Mv
V2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvbm93I0NvbXBhdGli
aWxpdHkKLSAgICB2YXIgbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcg
RGF0ZSgpLmdldFRpbWUoKTsgfTsKLSAgICBfX2V4cG9ydHNfXy5ub3cgPSBub3c7Ci0gICAgdmFy
IGtleXNPZiA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uKG9iamVjdCkgewotICAgICAgdmFyIHJl
c3VsdCA9IFtdOwotCi0gICAgICBmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgewotICAgICAgICBy
ZXN1bHQucHVzaChwcm9wKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9
OwotICAgIF9fZXhwb3J0c19fLmtleXNPZiA9IGtleXNPZjsKLSAgfSk7Ci1kZWZpbmUoInJzdnAi
LCAKLSAgWyIuL3JzdnAvcHJvbWlzZSIsIi4vcnN2cC9ldmVudHMiLCIuL3JzdnAvbm9kZSIsIi4v
cnN2cC9hbGwiLCIuL3JzdnAvYWxsX3NldHRsZWQiLCIuL3JzdnAvcmFjZSIsIi4vcnN2cC9oYXNo
IiwiLi9yc3ZwL3JldGhyb3ciLCIuL3JzdnAvZGVmZXIiLCIuL3JzdnAvY29uZmlnIiwiLi9yc3Zw
L21hcCIsIi4vcnN2cC9yZXNvbHZlIiwiLi9yc3ZwL3JlamVjdCIsIi4vcnN2cC9maWx0ZXIiLCJl
eHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBf
X2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVu
ZGVuY3k2X18sIF9fZGVwZW5kZW5jeTdfXywgX19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5
X18sIF9fZGVwZW5kZW5jeTEwX18sIF9fZGVwZW5kZW5jeTExX18sIF9fZGVwZW5kZW5jeTEyX18s
IF9fZGVwZW5kZW5jeTEzX18sIF9fZGVwZW5kZW5jeTE0X18sIF9fZXhwb3J0c19fKSB7Ci0gICAg
InVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0
Il07Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0gX19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07Ci0g
ICAgdmFyIGRlbm9kZWlmeSA9IF9fZGVwZW5kZW5jeTNfX1siZGVmYXVsdCJdOwotICAgIHZhciBh
bGwgPSBfX2RlcGVuZGVuY3k0X19bImRlZmF1bHQiXTsKLSAgICB2YXIgYWxsU2V0dGxlZCA9IF9f
ZGVwZW5kZW5jeTVfX1siZGVmYXVsdCJdOwotICAgIHZhciByYWNlID0gX19kZXBlbmRlbmN5Nl9f
WyJkZWZhdWx0Il07Ci0gICAgdmFyIGhhc2ggPSBfX2RlcGVuZGVuY3k3X19bImRlZmF1bHQiXTsK
LSAgICB2YXIgcmV0aHJvdyA9IF9fZGVwZW5kZW5jeThfX1siZGVmYXVsdCJdOwotICAgIHZhciBk
ZWZlciA9IF9fZGVwZW5kZW5jeTlfX1siZGVmYXVsdCJdOwotICAgIHZhciBjb25maWcgPSBfX2Rl
cGVuZGVuY3kxMF9fLmNvbmZpZzsKLSAgICB2YXIgY29uZmlndXJlID0gX19kZXBlbmRlbmN5MTBf
Xy5jb25maWd1cmU7Ci0gICAgdmFyIG1hcCA9IF9fZGVwZW5kZW5jeTExX19bImRlZmF1bHQiXTsK
LSAgICB2YXIgcmVzb2x2ZSA9IF9fZGVwZW5kZW5jeTEyX19bImRlZmF1bHQiXTsKLSAgICB2YXIg
cmVqZWN0ID0gX19kZXBlbmRlbmN5MTNfX1siZGVmYXVsdCJdOwotICAgIHZhciBmaWx0ZXIgPSBf
X2RlcGVuZGVuY3kxNF9fWyJkZWZhdWx0Il07Ci0KLSAgICBmdW5jdGlvbiBhc3luYyhjYWxsYmFj
aywgYXJnKSB7Ci0gICAgICBjb25maWcuYXN5bmMoY2FsbGJhY2ssIGFyZyk7Ci0gICAgfQotCi0g
ICAgZnVuY3Rpb24gb24oKSB7Ci0gICAgICBjb25maWcub24uYXBwbHkoY29uZmlnLCBhcmd1bWVu
dHMpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIG9mZigpIHsKLSAgICAgIGNvbmZpZy5vZmYuYXBw
bHkoY29uZmlnLCBhcmd1bWVudHMpOwotICAgIH0KLQotICAgIC8vIFNldCB1cCBpbnN0cnVtZW50
YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJPTUlTRV9JTlRSVU1FTlRBVElPTl9fYAotICAgIGlm
ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Ll9fUFJPTUlT
RV9JTlNUUlVNRU5UQVRJT05fXyA9PT0gJ29iamVjdCcpIHsKLSAgICAgIHZhciBjYWxsYmFja3Mg
PSB3aW5kb3cuX19QUk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fOwotICAgICAgY29uZmlndXJlKCdp
bnN0cnVtZW50JywgdHJ1ZSk7Ci0gICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gY2FsbGJhY2tz
KSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkgewot
ICAgICAgICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2tzW2V2ZW50TmFtZV0pOwotICAgICAgICB9
Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX19leHBvcnRzX18uUHJvbWlzZSA9IFByb21pc2U7Ci0g
ICAgX19leHBvcnRzX18uRXZlbnRUYXJnZXQgPSBFdmVudFRhcmdldDsKLSAgICBfX2V4cG9ydHNf
Xy5hbGwgPSBhbGw7Ci0gICAgX19leHBvcnRzX18uYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7Ci0g
ICAgX19leHBvcnRzX18ucmFjZSA9IHJhY2U7Ci0gICAgX19leHBvcnRzX18uaGFzaCA9IGhhc2g7
Ci0gICAgX19leHBvcnRzX18ucmV0aHJvdyA9IHJldGhyb3c7Ci0gICAgX19leHBvcnRzX18uZGVm
ZXIgPSBkZWZlcjsKLSAgICBfX2V4cG9ydHNfXy5kZW5vZGVpZnkgPSBkZW5vZGVpZnk7Ci0gICAg
X19leHBvcnRzX18uY29uZmlndXJlID0gY29uZmlndXJlOwotICAgIF9fZXhwb3J0c19fLm9uID0g
b247Ci0gICAgX19leHBvcnRzX18ub2ZmID0gb2ZmOwotICAgIF9fZXhwb3J0c19fLnJlc29sdmUg
PSByZXNvbHZlOwotICAgIF9fZXhwb3J0c19fLnJlamVjdCA9IHJlamVjdDsKLSAgICBfX2V4cG9y
dHNfXy5hc3luYyA9IGFzeW5jOwotICAgIF9fZXhwb3J0c19fLm1hcCA9IG1hcDsKLSAgICBfX2V4
cG9ydHNfXy5maWx0ZXIgPSBmaWx0ZXI7Ci0gIH0pOwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7
Ci0vKioKLVB1YmxpYyBhcGkgZm9yIHRoZSBjb250YWluZXIgaXMgc3RpbGwgaW4gZmx1eC4KLVRo
ZSBwdWJsaWMgYXBpLCBzcGVjaWZpZWQgb24gdGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBzaG91
bGQgYmUgY29uc2lkZXJlZCB0aGUgc3RhYmxlIGFwaS4KLS8vIEBtb2R1bGUgY29udGFpbmVyCi0g
IEBwcml2YXRlCi0qLwotCi0vKgotIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgbW9kZWwgZmFjdG9y
eSBpbmplY3Rpb25zIChkaXNhYmxlZCBieSBkZWZhdWx0KQotIElmIG1vZGVsIGZhY3RvcnkgaW5q
ZWN0aW9ucyBhcmUgZW5hYmxlZCwgbW9kZWxzIHNob3VsZCBub3QgYmUKLSBhY2Nlc3NlZCBnbG9i
YWxseSAob25seSB0aHJvdWdoIGBjb250YWluZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6bW9kZWxO
YW1lJykpYCk7Ci0qLwotRW1iZXIuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TID0gZmFsc2UgfHwg
ISFFbWJlci5FTlYuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TOwotCi1kZWZpbmUoImNvbnRhaW5l
ciIsCi0gIFtdLAotICBmdW5jdGlvbigpIHsKLQotICAgIC8vIEEgc2FmZSBhbmQgc2ltcGxlIGlu
aGVyaXRpbmcgb2JqZWN0LgotICAgIGZ1bmN0aW9uIEluaGVyaXRpbmdEaWN0KHBhcmVudCkgewot
ICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmRpY3QgPSB7fTsKLSAgICB9
Ci0KLSAgICBJbmhlcml0aW5nRGljdC5wcm90b3R5cGUgPSB7Ci0KLSAgICAgIC8qKgotICAgICAg
ICBAcHJvcGVydHkgcGFyZW50Ci0gICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAg
IEBkZWZhdWx0IG51bGwKLSAgICAgICovCi0KLSAgICAgIHBhcmVudDogbnVsbCwKLQotICAgICAg
LyoqCi0gICAgICAgIE9iamVjdCB1c2VkIHRvIHN0b3JlIHRoZSBjdXJyZW50IG5vZGVzIGRhdGEu
Ci0KLSAgICAgICAgQHByb3BlcnR5IGRpY3QKLSAgICAgICAgQHR5cGUgT2JqZWN0Ci0gICAgICAg
IEBkZWZhdWx0IE9iamVjdAotICAgICAgKi8KLSAgICAgIGRpY3Q6IG51bGwsCi0KLSAgICAgIC8q
KgotICAgICAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZ2l2ZW4gYSBrZXksIGlmIHRoZSB2YWx1ZSBp
cyBwcmVzZW50IGF0IHRoZSBjdXJyZW50Ci0gICAgICAgIGxldmVsIHVzZSBpdCwgb3RoZXJ3aXNl
IHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgYW5kIHRyeSBhZ2Fpbi4gSWYKLSAgICAgICAg
bm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5kLCByZXR1cm4gdW5kZWZpbmVkLgotCi0gICAgICAgIEBt
ZXRob2QgZ2V0Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgICAgICAgQHJldHVybiB7
YW55fQotICAgICAgKi8KLSAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBk
aWN0ID0gdGhpcy5kaWN0OwotCi0gICAgICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkp
IHsKLSAgICAgICAgICByZXR1cm4gZGljdFtrZXldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KHRoaXMucGFyZW50KSB7Ci0gICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldChrZXkpOwot
ICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgU2V0IHRoZSBnaXZlbiB2
YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgYXQgdGhlIGN1cnJlbnQgbGV2ZWwuCi0KLSAgICAgICAg
QG1ldGhvZCBzZXQKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgICAgICBAcGFyYW0g
e0FueX0gdmFsdWUKLSAgICAgICovCi0gICAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
LSAgICAgICAgdGhpcy5kaWN0W2tleV0gPSB2YWx1ZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgot
ICAgICAgICBEZWxldGUgdGhlIGdpdmVuIGtleQotCi0gICAgICAgIEBtZXRob2QgcmVtb3ZlCi0g
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgICAgICovCi0gICAgICByZW1vdmU6IGZ1bmN0
aW9uKGtleSkgewotICAgICAgICBkZWxldGUgdGhpcy5kaWN0W2tleV07Ci0gICAgICB9LAotCi0g
ICAgICAvKioKLSAgICAgICAgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgZ2l2ZW4gYSBrZXks
IGlmIHRoZSBrZXkgaXMgcHJlc2VudCBhdCB0aGUgY3VycmVudAotICAgICAgICBsZXZlbCByZXR1
cm4gdHJ1ZSwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgYW5kIHRyeSBh
Z2Fpbi4gSWYKLSAgICAgICAgbm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5kLCByZXR1cm4gZmFsc2Uu
Ci0KLSAgICAgICAgQG1ldGhvZCBoYXMKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAg
ICAgICBAcmV0dXJuIHtCb29sZWFufQotICAgICAgKi8KLSAgICAgIGhhczogZnVuY3Rpb24oa2V5
KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhpcy5kaWN0OwotCi0gICAgICAgIGlmIChkaWN0Lmhh
c093blByb3BlcnR5KGtleSkpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgewotICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVu
dC5oYXMoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0s
Ci0KLSAgICAgIC8qKgotICAgICAgICBJdGVyYXRlIGFuZCBpbnZva2UgYSBjYWxsYmFjayBmb3Ig
ZWFjaCBsb2NhbCBrZXktdmFsdWUgcGFpci4KLQotICAgICAgICBAbWV0aG9kIGVhY2hMb2NhbAot
ICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICAgICAgICBAcGFyYW0ge09iamVj
dH0gYmluZGluZwotICAgICAgKi8KLSAgICAgIGVhY2hMb2NhbDogZnVuY3Rpb24oY2FsbGJhY2ss
IGJpbmRpbmcpIHsKLSAgICAgICAgdmFyIGRpY3QgPSB0aGlzLmRpY3Q7Ci0KLSAgICAgICAgZm9y
ICh2YXIgcHJvcCBpbiBkaWN0KSB7Ci0gICAgICAgICAgaWYgKGRpY3QuaGFzT3duUHJvcGVydHko
cHJvcCkpIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgcHJvcCwgZGljdFtw
cm9wXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLQotCi0gICAg
Ly8gQSBsaWdodHdlaWdodCBjb250YWluZXIgdGhhdCBoZWxwcyB0byBhc3NlbWJsZSBhbmQgZGVj
b3VwbGUgY29tcG9uZW50cy4KLSAgICAvLyBQdWJsaWMgYXBpIGZvciB0aGUgY29udGFpbmVyIGlz
IHN0aWxsIGluIGZsdXguCi0gICAgLy8gVGhlIHB1YmxpYyBhcGksIHNwZWNpZmllZCBvbiB0aGUg
YXBwbGljYXRpb24gbmFtZXNwYWNlIHNob3VsZCBiZSBjb25zaWRlcmVkIHRoZSBzdGFibGUgYXBp
LgotICAgIGZ1bmN0aW9uIENvbnRhaW5lcihwYXJlbnQpIHsKLSAgICAgIHRoaXMucGFyZW50ID0g
cGFyZW50OwotICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwotCi0gICAgICB0aGlzLnJlc29sdmVy
ID0gcGFyZW50ICYmIHBhcmVudC5yZXNvbHZlciB8fCBmdW5jdGlvbigpIHt9OwotCi0gICAgICB0
aGlzLnJlZ2lzdHJ5ID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQucmVnaXN0
cnkpOwotICAgICAgdGhpcy5jYWNoZSA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFy
ZW50LmNhY2hlKTsKLSAgICAgIHRoaXMuZmFjdG9yeUNhY2hlID0gbmV3IEluaGVyaXRpbmdEaWN0
KHBhcmVudCAmJiBwYXJlbnQuY2FjaGUpOwotICAgICAgdGhpcy50eXBlSW5qZWN0aW9ucyA9IG5l
dyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LnR5cGVJbmplY3Rpb25zKTsKLSAgICAg
IHRoaXMuaW5qZWN0aW9ucyA9IHt9OwotCi0gICAgICB0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9u
cyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LmZhY3RvcnlUeXBlSW5qZWN0
aW9ucyk7Ci0gICAgICB0aGlzLmZhY3RvcnlJbmplY3Rpb25zID0ge307Ci0KLSAgICAgIHRoaXMu
X29wdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYmIHBhcmVudC5fb3B0aW9ucyk7
Ci0gICAgICB0aGlzLl90eXBlT3B0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYg
cGFyZW50Ll90eXBlT3B0aW9ucyk7Ci0gICAgfQotCi0gICAgQ29udGFpbmVyLnByb3RvdHlwZSA9
IHsKLQotICAgICAgLyoqCi0gICAgICAgIEBwcm9wZXJ0eSBwYXJlbnQKLSAgICAgICAgQHR5cGUg
Q29udGFpbmVyCi0gICAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAgICovCi0gICAgICBwYXJlbnQ6
IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICBAcHJvcGVydHkgY2hpbGRyZW4KLSAgICAgICAg
QHR5cGUgQXJyYXkKLSAgICAgICAgQGRlZmF1bHQgW10KLSAgICAgICovCi0gICAgICBjaGlsZHJl
bjogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBwcm9wZXJ0eSByZXNvbHZlcgotICAgICAg
ICBAdHlwZSBmdW5jdGlvbgotICAgICAgKi8KLSAgICAgIHJlc29sdmVyOiBudWxsLAotCi0gICAg
ICAvKioKLSAgICAgICAgQHByb3BlcnR5IHJlZ2lzdHJ5Ci0gICAgICAgIEB0eXBlIEluaGVyaXRp
bmdEaWN0Ci0gICAgICAqLwotICAgICAgcmVnaXN0cnk6IG51bGwsCi0KLSAgICAgIC8qKgotICAg
ICAgICBAcHJvcGVydHkgY2FjaGUKLSAgICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKLSAgICAg
ICovCi0gICAgICBjYWNoZTogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBwcm9wZXJ0eSB0
eXBlSW5qZWN0aW9ucwotICAgICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8KLSAg
ICAgIHR5cGVJbmplY3Rpb25zOiBudWxsLAotCi0gICAgICAvKioKLSAgICAgICAgQHByb3BlcnR5
IGluamVjdGlvbnMKLSAgICAgICAgQHR5cGUgT2JqZWN0Ci0gICAgICAgIEBkZWZhdWx0IHt9Ci0g
ICAgICAqLwotICAgICAgaW5qZWN0aW9uczogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBw
cml2YXRlCi0KLSAgICAgICAgQHByb3BlcnR5IF9vcHRpb25zCi0gICAgICAgIEB0eXBlIEluaGVy
aXRpbmdEaWN0Ci0gICAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAgICovCi0gICAgICBfb3B0aW9u
czogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBwcml2YXRlCi0KLSAgICAgICAgQHByb3Bl
cnR5IF90eXBlT3B0aW9ucwotICAgICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8K
LSAgICAgIF90eXBlT3B0aW9uczogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIFJldHVybnMg
YSBuZXcgY2hpbGQgb2YgdGhlIGN1cnJlbnQgY29udGFpbmVyLiBUaGVzZSBjaGlsZHJlbiBhcmUg
Y29uZmlndXJlZAotICAgICAgICB0byBjb3JyZWN0bHkgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50
IGNvbnRhaW5lci4KLQotICAgICAgICBAbWV0aG9kIGNoaWxkCi0gICAgICAgIEByZXR1cm4ge0Nv
bnRhaW5lcn0KLSAgICAgICovCi0gICAgICBjaGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZh
ciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHRoaXMpOwotICAgICAgICB0aGlzLmNoaWxkcmVu
LnB1c2goY29udGFpbmVyKTsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKLSAgICAgIH0sCi0K
LSAgICAgIC8qKgotICAgICAgICBTZXRzIGEga2V5LXZhbHVlIHBhaXIgb24gdGhlIGN1cnJlbnQg
Y29udGFpbmVyLiBJZiBhIHBhcmVudCBjb250YWluZXIsCi0gICAgICAgIGhhcyB0aGUgc2FtZSBr
ZXksIG9uY2Ugc2V0IG9uIGEgY2hpbGQsIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHdpbGwgZGl2ZXJn
ZQotICAgICAgICBhcyBleHBlY3RlZC4KLQotICAgICAgICBAbWV0aG9kIHNldAotICAgICAgICBA
cGFyYW0ge09iamVjdH0gb2JqZWN0Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgICAg
ICAgQHBhcmFtIHthbnl9IHZhbHVlCi0gICAgICAqLwotICAgICAgc2V0OiBmdW5jdGlvbihvYmpl
Y3QsIGtleSwgdmFsdWUpIHsKLSAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKLSAgICAgIH0s
Ci0KLSAgICAgIC8qKgotICAgICAgICBSZWdpc3RlcnMgYSBmYWN0b3J5IGZvciBsYXRlciBpbmpl
Y3Rpb24uCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
ICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgUGVyc29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKLSAg
ICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdmcnVpdDpmYXZvcml0ZScsIE9yYW5nZSk7Ci0gICAg
ICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29tbXVuaWNhdGlvbjptYWluJywgRW1haWwsIHtzaW5n
bGV0b246IGZhbHNlfSk7Ci0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2QgcmVnaXN0ZXIK
LSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rp
b259IGZhY3RvcnkKLSAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKLSAgICAgICovCi0g
ICAgICByZWdpc3RlcjogZnVuY3Rpb24oZnVsbE5hbWUsIGZhY3RvcnksIG9wdGlvbnMpIHsKLSAg
ICAgICAgaWYgKGZ1bGxOYW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAgICB0aHJv
dyBuZXcgVHlwZUVycm9yKCJtYWxmb3JtZWQgZnVsbE5hbWUsIGV4cGVjdGVkOiBgdHlwZTpuYW1l
YCBnb3Q6ICIgKyBmdWxsTmFtZSArICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWN0
b3J5ID09PSB1bmRlZmluZWQpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdHRl
bXB0aW5nIHRvIHJlZ2lzdGVyIGFuIHVua25vd24gZmFjdG9yeTogYCcgKyBmdWxsTmFtZSArICdg
Jyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1h
bGl6ZShmdWxsTmFtZSk7Ci0KLSAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKG5vcm1hbGl6ZWRO
YW1lKSkgewotICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlLXJlZ2lzdGVyOiBg
JyArIGZ1bGxOYW1lICsnYCwgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBsb29rZWQgdXAuJyk7Ci0g
ICAgICAgIH0KLQotICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldChub3JtYWxpemVkTmFtZSwgZmFj
dG9yeSk7Ci0gICAgICAgIHRoaXMuX29wdGlvbnMuc2V0KG5vcm1hbGl6ZWROYW1lLCBvcHRpb25z
IHx8IHt9KTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBVbnJlZ2lzdGVyIGEgZnVs
bE5hbWUKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBu
ZXcgQ29udGFpbmVyKCk7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignbW9kZWw6dXNlcics
IFVzZXIpOwotCi0gICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ21vZGVsOnVzZXInKSBpbnN0YW5j
ZW9mIFVzZXIgLy89PiB0cnVlCi0KLSAgICAgICAgY29udGFpbmVyLnVucmVnaXN0ZXIoJ21vZGVs
OnVzZXInKQotICAgICAgICBjb250YWluZXIubG9va3VwKCdtb2RlbDp1c2VyJykgPT09IHVuZGVm
aW5lZCAvLz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCB1bnJlZ2lzdGVy
Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICovCi0gICAgICB1bnJl
Z2lzdGVyOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICB2YXIgbm9ybWFsaXplZE5hbWUg
PSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7Ci0KLSAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1v
dmUobm9ybWFsaXplZE5hbWUpOwotICAgICAgICB0aGlzLmNhY2hlLnJlbW92ZShub3JtYWxpemVk
TmFtZSk7Ci0gICAgICAgIHRoaXMuZmFjdG9yeUNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7
Ci0gICAgICAgIHRoaXMuX29wdGlvbnMucmVtb3ZlKG5vcm1hbGl6ZWROYW1lKTsKLSAgICAgIH0s
Ci0KLSAgICAgIC8qKgotICAgICAgICBHaXZlbiBhIGZ1bGxOYW1lIHJldHVybiB0aGUgY29ycmVz
cG9uZGluZyBmYWN0b3J5LgotCi0gICAgICAgIEJ5IGRlZmF1bHQgYHJlc29sdmVgIHdpbGwgcmV0
cmlldmUgdGhlIGZhY3RvcnkgZnJvbQotICAgICAgICBpdHMgY29udGFpbmVyJ3MgcmVnaXN0cnku
Ci0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENv
bnRhaW5lcigpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdp
dHRlcik7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlc29sdmUoJ2FwaTp0d2l0dGVyJykgLy8gPT4g
VHdpdHRlcgotICAgICAgICBgYGAKLQotICAgICAgICBPcHRpb25hbGx5IHRoZSBjb250YWluZXIg
Y2FuIGJlIHByb3ZpZGVkIHdpdGggYSBjdXN0b20gcmVzb2x2ZXIuCi0gICAgICAgIElmIHByb3Zp
ZGVkLCBgcmVzb2x2ZWAgd2lsbCBmaXJzdCBwcm92aWRlIHRoZSBjdXN0b20gcmVzb2x2ZXIKLSAg
ICAgICAgdGhlIG9wcGVydHVuaXR5IHRvIHJlc29sdmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2Ug
aXQgd2lsbCBmYWxsYmFjawotICAgICAgICB0byB0aGUgcmVnaXN0cnkuCi0KLSAgICAgICAgYGBg
amF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAg
ICAgICBjb250YWluZXIucmVzb2x2ZXIgPSBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICAg
IC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBzeXN0ZW0gb2YgY2hvaWNlCi0gICAgICAgIH07Ci0K
LSAgICAgICAgLy8gdGhlIHR3aXR0ZXIgZmFjdG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxlIHN5
c3RlbQotICAgICAgICBjb250YWluZXIucmVzb2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0
dGVyCi0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2QgcmVzb2x2ZQotICAgICAgICBAcGFy
YW0ge1N0cmluZ30gZnVsbE5hbWUKLSAgICAgICAgQHJldHVybiB7RnVuY3Rpb259IGZ1bGxOYW1l
J3MgZmFjdG9yeQotICAgICAgKi8KLSAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7
Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyKGZ1bGxOYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5
LmdldChmdWxsTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQSBob29rIHRo
YXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHRoZSByZXNvbHZlciB3aWxsCi0gICAgICAg
IGF0dGVtcHQgdG8gZmluZCB0aGUgZmFjdG9yeS4KLQotICAgICAgICBGb3IgZXhhbXBsZSwgdGhl
IGRlZmF1bHQgRW1iZXIgYC5kZXNjcmliZWAgcmV0dXJucyB0aGUgZnVsbAotICAgICAgICBjbGFz
cyBuYW1lIChpbmNsdWRpbmcgbmFtZXNwYWNlKSB3aGVyZSBFbWJlcidzIHJlc29sdmVyIGV4cGVj
dHMKLSAgICAgICAgdG8gZmluZCB0aGUgYGZ1bGxOYW1lYC4KLQotICAgICAgICBAbWV0aG9kIGRl
c2NyaWJlCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICBAcmV0dXJu
IHtzdHJpbmd9IGRlc2NyaWJlZCBmdWxsTmFtZQotICAgICAgKi8KLSAgICAgIGRlc2NyaWJlOiBm
dW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgQSBob29rIHRvIGVuYWJsZSBjdXN0b20gZnVsbE5hbWUgbm9y
bWFsaXphdGlvbiBiZWhhdmlvdXIKLQotICAgICAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgICAg
ICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKLSAgICAgICAgQHJldHVybiB7c3RyaW5nfSBub3Jt
YWxpemVkIGZ1bGxOYW1lCi0gICAgICAqLwotICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbihmdWxs
TmFtZSkgewotICAgICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgICB9LAotCi0gICAgICAvKioK
LSAgICAgICAgQG1ldGhvZCBtYWtlVG9TdHJpbmcKLQotICAgICAgICBAcGFyYW0ge2FueX0gZmFj
dG9yeQotICAgICAgICBAcGFyYW0ge3N0cmluZ30gZnVsbE5hbWUKLSAgICAgICAgQHJldHVybiB7
ZnVuY3Rpb259IHRvU3RyaW5nIGZ1bmN0aW9uCi0gICAgICAqLwotICAgICAgbWFrZVRvU3RyaW5n
OiBmdW5jdGlvbihmYWN0b3J5LCBmdWxsTmFtZSkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS50
b1N0cmluZygpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5h
bWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZS4KLQotICAgICAgICBUaGUgZGVmYXVs
dCBiZWhhdmlvdXIgaXMgZm9yIGxvb2t1cCB0byByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2Uu
Ci0gICAgICAgIFRoZSBzaW5nbGV0b24gaXMgc2NvcGVkIHRvIHRoZSBjb250YWluZXIsIGFsbG93
aW5nIG11bHRpcGxlIGNvbnRhaW5lcnMKLSAgICAgICAgdG8gYWxsIGhhdmUgdGhlaXIgb3duIGxv
Y2FsbHkgc2NvcGVkIHNpbmdsZXRvbnMuCi0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAg
ICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAgICAgICBjb250YWluZXIucmVn
aXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdpdHRlcik7Ci0KLSAgICAgICAgdmFyIHR3aXR0ZXIgPSBj
b250YWluZXIubG9va3VwKCdhcGk6dHdpdHRlcicpOwotCi0gICAgICAgIHR3aXR0ZXIgaW5zdGFu
Y2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCi0KLSAgICAgICAgLy8gYnkgZGVmYXVsdCB0aGUgY29u
dGFpbmVyIHdpbGwgcmV0dXJuIHNpbmdsZXRvbnMKLSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29u
dGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInKTsKLSAgICAgICAgdHdpdHRlciBpbnN0YW5jZW9m
IFR3aXR0ZXI7IC8vID0+IHRydWUKLQotICAgICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsgLy89
PiB0cnVlCi0gICAgICAgIGBgYAotCi0gICAgICAgIElmIHNpbmdsZXRvbnMgYXJlIG5vdCB3YW50
ZWQgYW4gb3B0aW9uYWwgZmxhZyBjYW4gYmUgcHJvdmlkZWQgYXQgbG9va3VwLgotCi0gICAgICAg
IGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsK
LSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwotCi0g
ICAgICAgIHZhciB0d2l0dGVyID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNp
bmdsZXRvbjogZmFsc2UgfSk7Ci0gICAgICAgIHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29r
dXAoJ2FwaTp0d2l0dGVyJywgeyBzaW5nbGV0b246IGZhbHNlIH0pOwotCi0gICAgICAgIHR3aXR0
ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IGZhbHNlCi0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRo
b2QgbG9va3VwCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICBAcGFy
YW0ge09iamVjdH0gb3B0aW9ucwotICAgICAgICBAcmV0dXJuIHthbnl9Ci0gICAgICAqLwotICAg
ICAgbG9va3VwOiBmdW5jdGlvbihmdWxsTmFtZSwgb3B0aW9ucykgewotICAgICAgICBmdWxsTmFt
ZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1lKTsKLQotICAgICAgICBvcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKLQotICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoZnVsbE5hbWUpICYmIG9wdGlv
bnMuc2luZ2xldG9uICE9PSBmYWxzZSkgewotICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdl
dChmdWxsTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgdmFsdWUgPSBpbnN0YW50aWF0
ZSh0aGlzLCBmdWxsTmFtZSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsg
cmV0dXJuOyB9Ci0KLSAgICAgICAgaWYgKGlzU2luZ2xldG9uKHRoaXMsIGZ1bGxOYW1lKSAmJiBv
cHRpb25zLnNpbmdsZXRvbiAhPT0gZmFsc2UpIHsKLSAgICAgICAgICB0aGlzLmNhY2hlLnNldChm
dWxsTmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAg
ICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBj
b3JyZXNwb25kaW5nIGZhY3RvcnkuCi0KLSAgICAgICAgQG1ldGhvZCBsb29rdXBGYWN0b3J5Ci0g
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICBAcmV0dXJuIHthbnl9Ci0g
ICAgICAqLwotICAgICAgbG9va3VwRmFjdG9yeTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICAg
ICAgcmV0dXJuIGZhY3RvcnlGb3IodGhpcywgZnVsbE5hbWUpOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBh
d2FyZSBvZiBpdHMgZmFjdG9yeQotICAgICAgICBvciBzaW5nbGV0b24gaW5zdGFuY2UuCi0KLSAg
ICAgICAgQG1ldGhvZCBoYXMKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCi0gICAg
ICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAgICAqLwotICAgICAgaGFzOiBmdW5jdGlvbihmdWxs
TmFtZSkgewotICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoZnVsbE5hbWUpKSB7Ci0gICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gISF0aGlzLnJlc29s
dmUoZnVsbE5hbWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEFsbG93IHJlZ2lz
dGVyaW5nIG9wdGlvbnMgZm9yIGFsbCBmYWN0b3JpZXMgb2YgYSB0eXBlLgotCi0gICAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLQot
ICAgICAgICAvLyBpZiBhbGwgb2YgdHlwZSBgY29ubmVjdGlvbmAgbXVzdCBub3QgYmUgc2luZ2xl
dG9ucwotICAgICAgICBjb250YWluZXIub3B0aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNp
bmdsZXRvbjogZmFsc2UgfSk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb25uZWN0
aW9uOnR3aXR0ZXInLCBUd2l0dGVyQ29ubmVjdGlvbik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdp
c3RlcignY29ubmVjdGlvbjpmYWNlYm9vaycsIEZhY2Vib29rQ29ubmVjdGlvbik7Ci0KLSAgICAg
ICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsK
LSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0
dGVyJyk7Ci0KLSAgICAgICAgdHdpdHRlciA9PT0gdHdpdHRlcjI7IC8vID0+IGZhbHNlCi0KLSAg
ICAgICAgdmFyIGZhY2Vib29rID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9v
aycpOwotICAgICAgICB2YXIgZmFjZWJvb2syID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlv
bjpmYWNlYm9vaycpOwotCi0gICAgICAgIGZhY2Vib29rID09PSBmYWNlYm9vazI7IC8vID0+IGZh
bHNlCi0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2Qgb3B0aW9uc0ZvclR5cGUKLSAgICAg
ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMK
LSAgICAgICovCi0gICAgICBvcHRpb25zRm9yVHlwZTogZnVuY3Rpb24odHlwZSwgb3B0aW9ucykg
ewotICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdvcHRp
b25zRm9yVHlwZScpOyB9Ci0KLSAgICAgICAgdGhpcy5fdHlwZU9wdGlvbnMuc2V0KHR5cGUsIG9w
dGlvbnMpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEBtZXRob2Qgb3B0aW9ucwot
ICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQotICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0
aW9ucwotICAgICAgKi8KLSAgICAgIG9wdGlvbnM6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsK
LSAgICAgICAgdGhpcy5vcHRpb25zRm9yVHlwZSh0eXBlLCBvcHRpb25zKTsKLSAgICAgIH0sCi0K
LSAgICAgIC8qKgotICAgICAgICBVc2VkIG9ubHkgdmlhIGBpbmplY3Rpb25gLgotCi0gICAgICAg
IFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgZm9ybSBvZiBpbmplY3Rpb24sIHNwZWNpZmljYWxseSBl
bmFibGluZwotICAgICAgICBhbGwgb2JqZWN0cyBvZiBvbmUgdHlwZSB0byBiZSBpbmplY3RlZCB3
aXRoIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIKLSAgICAgICAgb2JqZWN0LgotCi0gICAgICAgIEZv
ciBleGFtcGxlLCBwcm92aWRlZCBlYWNoIG9iamVjdCBvZiB0eXBlIGBjb250cm9sbGVyYCBuZWVk
ZWQgYSBgcm91dGVyYC4KLSAgICAgICAgb25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAg
ICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5l
cigpOwotCi0gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCBSb3V0ZXIp
OwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6dXNlcicsIFVzZXJDb250
cm9sbGVyKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb250cm9sbGVyOnBvc3QnLCBQ
b3N0Q29udHJvbGxlcik7Ci0KLSAgICAgICAgY29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRy
b2xsZXInLCAncm91dGVyJywgJ3JvdXRlcjptYWluJyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBj
b250YWluZXIubG9va3VwKCdjb250cm9sbGVyOnVzZXInKTsKLSAgICAgICAgdmFyIHBvc3QgPSBj
b250YWluZXIubG9va3VwKCdjb250cm9sbGVyOnBvc3QnKTsKLQotICAgICAgICB1c2VyLnJvdXRl
ciBpbnN0YW5jZW9mIFJvdXRlcjsgLy89PiB0cnVlCi0gICAgICAgIHBvc3Qucm91dGVyIGluc3Rh
bmNlb2YgUm91dGVyOyAvLz0+IHRydWUKLQotICAgICAgICAvLyBib3RoIGNvbnRyb2xsZXJzIHNo
YXJlIHRoZSBzYW1lIHJvdXRlcgotICAgICAgICB1c2VyLnJvdXRlciA9PT0gcG9zdC5yb3V0ZXI7
IC8vPT4gdHJ1ZQotICAgICAgICBgYGAKLQotICAgICAgICBAcHJpdmF0ZQotICAgICAgICBAbWV0
aG9kIHR5cGVJbmplY3Rpb24KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFt
ZQotICAgICAgKi8KLSAgICAgIHR5cGVJbmplY3Rpb246IGZ1bmN0aW9uKHR5cGUsIHByb3BlcnR5
LCBmdWxsTmFtZSkgewotICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3Bl
cmF0aW9uKCd0eXBlSW5qZWN0aW9uJyk7IH0KLQotICAgICAgICBhZGRUeXBlSW5qZWN0aW9uKHRo
aXMudHlwZUluamVjdGlvbnMsIHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSk7Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgRGVmaW5lcyBpbmplY3Rpb24gcnVsZXMuCi0KLSAgICAgICAg
VGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcyBvbnRvIG9iamVjdHMg
d2hlbiB0aGV5Ci0gICAgICAgIGFyZSBpbnN0YW50aWF0ZWQuCi0KLSAgICAgICAgVHdvIGZvcm1z
IG9mIGluamVjdGlvbnMgYXJlIHBvc3NpYmxlOgotCi0gICAgICAgICogSW5qZWN0aW5nIG9uZSBm
dWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1lCi0gICAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxs
TmFtZSBvbiBhIHR5cGUKLQotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLQotICAgICAgICBj
b250YWluZXIucmVnaXN0ZXIoJ3NvdXJjZTptYWluJywgU291cmNlKTsKLSAgICAgICAgY29udGFp
bmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgVXNlcik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdp
c3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOwotCi0gICAgICAgIC8vIGluamVjdGluZyBvbmUgZnVs
bE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQotICAgICAgICAvLyBlZy4gZWFjaCB1c2VyIG1vZGVs
IGdldHMgYSBwb3N0IG1vZGVsCi0gICAgICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ21vZGVsOnVz
ZXInLCAncG9zdCcsICdtb2RlbDpwb3N0Jyk7Ci0KLSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBm
dWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKLSAgICAgICAgY29udGFpbmVyLmluamVjdGlvbignbW9k
ZWwnLCAnc291cmNlJywgJ3NvdXJjZTptYWluJyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBjb250
YWluZXIubG9va3VwKCdtb2RlbDp1c2VyJyk7Ci0gICAgICAgIHZhciBwb3N0ID0gY29udGFpbmVy
Lmxvb2t1cCgnbW9kZWw6cG9zdCcpOwotCi0gICAgICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2Yg
U291cmNlOyAvLz0+IHRydWUKLSAgICAgICAgcG9zdC5zb3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7
IC8vPT4gdHJ1ZQotCi0gICAgICAgIHVzZXIucG9zdCBpbnN0YW5jZW9mIFBvc3Q7IC8vPT4gdHJ1
ZQotCi0gICAgICAgIC8vIGFuZCBib3RoIG1vZGVscyBzaGFyZSB0aGUgc2FtZSBzb3VyY2UKLSAg
ICAgICAgdXNlci5zb3VyY2UgPT09IHBvc3Quc291cmNlOyAvLz0+IHRydWUKLSAgICAgICAgYGBg
Ci0KLSAgICAgICAgQG1ldGhvZCBpbmplY3Rpb24KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZh
Y3RvcnlOYW1lCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQotICAgICAgICBAcGFy
YW0ge1N0cmluZ30gaW5qZWN0aW9uTmFtZQotICAgICAgKi8KLSAgICAgIGluamVjdGlvbjogZnVu
Y3Rpb24oZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7Ci0gICAgICAgIGlm
ICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9Ci0K
LSAgICAgICAgaWYgKGZhY3RvcnlOYW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAg
ICByZXR1cm4gdGhpcy50eXBlSW5qZWN0aW9uKGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0
aW9uTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRJbmplY3Rpb24odGhpcy5pbmplY3Rp
b25zLCBmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpOwotICAgICAgfSwKLQot
Ci0gICAgICAvKioKLSAgICAgICAgVXNlZCBvbmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCi0K
LSAgICAgICAgUHJvdmlkZXMgYSBzcGVjaWFsaXplZCBmb3JtIG9mIGluamVjdGlvbiwgc3BlY2lm
aWNhbGx5IGVuYWJsaW5nCi0gICAgICAgIGFsbCBmYWN0b3J5IG9mIG9uZSB0eXBlIHRvIGJlIGlu
amVjdGVkIHdpdGggYSByZWZlcmVuY2UgdG8gYW5vdGhlcgotICAgICAgICBvYmplY3QuCi0KLSAg
ICAgICAgRm9yIGV4YW1wbGUsIHByb3ZpZGVkIGVhY2ggZmFjdG9yeSBvZiB0eXBlIGBtb2RlbGAg
bmVlZGVkIGEgYHN0b3JlYC4KLSAgICAgICAgb25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0K
LSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRh
aW5lcigpOwotCi0gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFNvbWVT
dG9yZSk7Ci0KLSAgICAgICAgY29udGFpbmVyLmZhY3RvcnlUeXBlSW5qZWN0aW9uKCdtb2RlbCcs
ICdzdG9yZScsICdzdG9yZTptYWluJyk7Ci0KLSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVy
Lmxvb2t1cCgnc3RvcmU6bWFpbicpOwotICAgICAgICB2YXIgVXNlckZhY3RvcnkgPSBjb250YWlu
ZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6dXNlcicpOwotCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0
b3JlIGluc3RhbmNlb2YgU29tZVN0b3JlOyAvLz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAg
ICAgQHByaXZhdGUKLSAgICAgICAgQG1ldGhvZCBmYWN0b3J5VHlwZUluamVjdGlvbgotICAgICAg
ICBAcGFyYW0ge1N0cmluZ30gdHlwZQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkK
LSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCi0gICAgICAqLwotICAgICAgZmFjdG9y
eVR5cGVJbmplY3Rpb246IGZ1bmN0aW9uKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewotICAg
ICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdmYWN0b3J5VHlw
ZUluamVjdGlvbicpOyB9Ci0KLSAgICAgICAgYWRkVHlwZUluamVjdGlvbih0aGlzLmZhY3RvcnlU
eXBlSW5qZWN0aW9ucywgdHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKTsKLSAgICAgIH0sCi0KLSAg
ICAgIC8qKgotICAgICAgICBEZWZpbmVzIGZhY3RvcnkgaW5qZWN0aW9uIHJ1bGVzLgotCi0gICAg
ICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmplY3Rpb24gcnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWlu
c3QgZmFjdG9yaWVzLCB2aWEKLSAgICAgICAgYENvbnRhaW5lciNsb29rdXBGYWN0b3J5YC4KLQot
ICAgICAgICBUaGVzZSBydWxlcyBhcmUgdXNlZCB0byBpbmplY3Qgb2JqZWN0cyBvbnRvIGZhY3Rv
cmllcyB3aGVuIHRoZXkKLSAgICAgICAgYXJlIGxvb2tlZCB1cC4KLQotICAgICAgICBUd28gZm9y
bXMgb2YgaW5qZWN0aW9ucyBhcmUgcG9zc2libGU6Ci0KLSAgICAgICogSW5qZWN0aW5nIG9uZSBm
dWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1lCi0gICAgICAqIEluamVjdGluZyBvbmUgZnVsbE5h
bWUgb24gYSB0eXBlCi0KLSAgICAgICAgRXhhbXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29u
dGFpbmVyLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgU3RvcmUpOwotICAgICAgICBjb250YWluZXIu
cmVnaXN0ZXIoJ3N0b3JlOnNlY29uZGFyeScsIE90aGVyU3RvcmUpOwotICAgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBVc2VyKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lz
dGVyKCdtb2RlbDpwb3N0JywgUG9zdCk7Ci0KLSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxs
TmFtZSBvbiBhbm90aGVyIHR5cGUKLSAgICAgICAgY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb24o
J21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLQotICAgICAgICAvLyBpbmplY3Rpbmcg
b25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVsbE5hbWUKLSAgICAgICAgY29udGFpbmVyLmZhY3Rv
cnlJbmplY3Rpb24oJ21vZGVsOnBvc3QnLCAnc2Vjb25kYXJ5U3RvcmUnLCAnc3RvcmU6c2Vjb25k
YXJ5Jyk7Ci0KLSAgICAgICAgdmFyIFVzZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3Rv
cnkoJ21vZGVsOnVzZXInKTsKLSAgICAgICAgdmFyIFBvc3RGYWN0b3J5ID0gY29udGFpbmVyLmxv
b2t1cEZhY3RvcnkoJ21vZGVsOnBvc3QnKTsKLSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVy
Lmxvb2t1cCgnc3RvcmU6bWFpbicpOwotCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlIGluc3Rh
bmNlb2YgU3RvcmU7IC8vPT4gdHJ1ZQotICAgICAgICBVc2VyRmFjdG9yeS5zZWNvbmRhcnlTdG9y
ZSBpbnN0YW5jZW9mIE90aGVyU3RvcmU7IC8vPT4gZmFsc2UKLQotICAgICAgICBQb3N0RmFjdG9y
eS5zdG9yZSBpbnN0YW5jZW9mIFN0b3JlOyAvLz0+IHRydWUKLSAgICAgICAgUG9zdEZhY3Rvcnku
c2Vjb25kYXJ5U3RvcmUgaW5zdGFuY2VvZiBPdGhlclN0b3JlOyAvLz0+IHRydWUKLQotICAgICAg
ICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUgdGhlIHNhbWUgc291cmNlIGluc3RhbmNlCi0gICAg
ICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQb3N0RmFjdG9yeS5zdG9yZTsgLy89PiB0cnVlCi0g
ICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2QgZmFjdG9yeUluamVjdGlvbgotICAgICAgICBA
cGFyYW0ge1N0cmluZ30gZmFjdG9yeU5hbWUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3Bl
cnR5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBpbmplY3Rpb25OYW1lCi0gICAgICAqLwotICAg
ICAgZmFjdG9yeUluamVjdGlvbjogZnVuY3Rpb24oZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmpl
Y3Rpb25OYW1lKSB7Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVy
YXRpb24oJ2luamVjdGlvbicpOyB9Ci0KLSAgICAgICAgaWYgKGZhY3RvcnlOYW1lLmluZGV4T2Yo
JzonKSA9PT0gLTEpIHsKLSAgICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5VHlwZUluamVjdGlv
bihmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgYWRkSW5qZWN0aW9uKHRoaXMuZmFjdG9yeUluamVjdGlvbnMsIGZhY3RvcnlOYW1lLCBw
cm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAg
QSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGRlc3Ryb3lpbmcgdGhlIGNvbnRhaW5lciwgaXRzIGRl
c2NlbmRhbnQgY29udGFpbmVycyBhbmQgYWxsCi0gICAgICAgIHRoZWlyIG1hbmFnZWQgb2JqZWN0
cy4KLQotICAgICAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICAgICovCi0gICAgICBkZXN0cm95OiBm
dW5jdGlvbigpIHsKLQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5jaGlsZHJlbi5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7Ci0g
ICAgICAgIH0KLQotICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107Ci0KLSAgICAgICAgZWFjaERl
c3Ryb3lhYmxlKHRoaXMsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgICBpdGVtLmRlc3Ryb3ko
KTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7Ci0gICAg
ICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAg
ICAgIEBtZXRob2QgcmVzZXQKLSAgICAgICovCi0gICAgICByZXNldDogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlzLmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsK
LSAgICAgICAgICByZXNldENhY2hlKHRoaXMuY2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAg
ICAgIHJlc2V0Q2FjaGUodGhpcyk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGls
bGVnYWxDaGlsZE9wZXJhdGlvbihvcGVyYXRpb24pIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcihv
cGVyYXRpb24gKyAiIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5l
cnMiKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxO
YW1lKSB7Ci0gICAgICB2YXIgc2luZ2xldG9uID0gb3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUs
ICdzaW5nbGV0b24nKTsKLQotICAgICAgcmV0dXJuIHNpbmdsZXRvbiAhPT0gZmFsc2U7Ci0gICAg
fQotCi0gICAgZnVuY3Rpb24gYnVpbGRJbmplY3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucykg
ewotICAgICAgdmFyIGhhc2ggPSB7fTsKLQotICAgICAgaWYgKCFpbmplY3Rpb25zKSB7IHJldHVy
biBoYXNoOyB9Ci0KLSAgICAgIHZhciBpbmplY3Rpb24sIGxvb2t1cDsKLQotICAgICAgZm9yICh2
YXIgaT0wLCBsPWluamVjdGlvbnMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICBpbmplY3Rp
b24gPSBpbmplY3Rpb25zW2ldOwotICAgICAgICBsb29rdXAgPSBjb250YWluZXIubG9va3VwKGlu
amVjdGlvbi5mdWxsTmFtZSk7Ci0KLSAgICAgICAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7
Ci0gICAgICAgICAgaGFzaFtpbmplY3Rpb24ucHJvcGVydHldID0gbG9va3VwOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGluZyB0byBpbmplY3Qg
YW4gdW5rbm93biBpbmplY3Rpb246IGAnICsgaW5qZWN0aW9uLmZ1bGxOYW1lICsgJ2AnKTsKLSAg
ICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBmdW5j
dGlvbiBvcHRpb24oY29udGFpbmVyLCBmdWxsTmFtZSwgb3B0aW9uTmFtZSkgewotICAgICAgdmFy
IG9wdGlvbnMgPSBjb250YWluZXIuX29wdGlvbnMuZ2V0KGZ1bGxOYW1lKTsKLQotICAgICAgaWYg
KG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAg
IHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdOwotICAgICAgfQotCi0gICAgICB2YXIgdHlwZSA9
IGZ1bGxOYW1lLnNwbGl0KCI6IilbMF07Ci0gICAgICBvcHRpb25zID0gY29udGFpbmVyLl90eXBl
T3B0aW9ucy5nZXQodHlwZSk7Ci0KLSAgICAgIGlmIChvcHRpb25zKSB7Ci0gICAgICAgIHJldHVy
biBvcHRpb25zW29wdGlvbk5hbWVdOwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZh
Y3RvcnlGb3IoY29udGFpbmVyLCBmdWxsTmFtZSkgewotICAgICAgdmFyIG5hbWUgPSBjb250YWlu
ZXIubm9ybWFsaXplKGZ1bGxOYW1lKTsKLSAgICAgIHZhciBmYWN0b3J5ID0gY29udGFpbmVyLnJl
c29sdmUobmFtZSk7Ci0gICAgICB2YXIgaW5qZWN0ZWRGYWN0b3J5OwotICAgICAgdmFyIGNhY2hl
ID0gY29udGFpbmVyLmZhY3RvcnlDYWNoZTsKLSAgICAgIHZhciB0eXBlID0gZnVsbE5hbWUuc3Bs
aXQoIjoiKVswXTsKLQotICAgICAgaWYgKGZhY3RvcnkgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47
IH0KLQotICAgICAgaWYgKGNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIGNh
Y2hlLmdldChmdWxsTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZmFjdG9yeSB8fCB0eXBl
b2YgZmFjdG9yeS5leHRlbmQgIT09ICdmdW5jdGlvbicgfHwgKCFFbWJlci5NT0RFTF9GQUNUT1JZ
X0lOSkVDVElPTlMgJiYgdHlwZSA9PT0gJ21vZGVsJykpIHsKLSAgICAgICAgLy8gVE9ETzogdGhp
bmsgYWJvdXQgYSAnc2FmZScgbWVyZ2Ugc3R5bGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIGZvciBu
b3cganVzdCBmYWxsYmFjayB0byBjcmVhdGUgdGltZSBpbmplY3Rpb24KLSAgICAgICAgcmV0dXJu
IGZhY3Rvcnk7Ci0gICAgICB9IGVsc2UgewotCi0gICAgICAgIHZhciBpbmplY3Rpb25zICAgICAg
ICA9IGluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSk7Ci0gICAgICAgIHZhciBmYWN0
b3J5SW5qZWN0aW9ucyA9IGZhY3RvcnlJbmplY3Rpb25zRm9yKGNvbnRhaW5lciwgZnVsbE5hbWUp
OwotCi0gICAgICAgIGZhY3RvcnlJbmplY3Rpb25zLl90b1N0cmluZyA9IGNvbnRhaW5lci5tYWtl
VG9TdHJpbmcoZmFjdG9yeSwgZnVsbE5hbWUpOwotCi0gICAgICAgIGluamVjdGVkRmFjdG9yeSA9
IGZhY3RvcnkuZXh0ZW5kKGluamVjdGlvbnMpOwotICAgICAgICBpbmplY3RlZEZhY3RvcnkucmVv
cGVuQ2xhc3MoZmFjdG9yeUluamVjdGlvbnMpOwotCi0gICAgICAgIGNhY2hlLnNldChmdWxsTmFt
ZSwgaW5qZWN0ZWRGYWN0b3J5KTsKLQotICAgICAgICByZXR1cm4gaW5qZWN0ZWRGYWN0b3J5Owot
ICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGluamVjdGlvbnNGb3IoY29udGFpbmVyICxm
dWxsTmFtZSkgewotICAgICAgdmFyIHNwbGl0TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0g
ICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0sCi0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLQot
ICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci50eXBlSW5qZWN0
aW9ucy5nZXQodHlwZSkgfHwgW10pOwotICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29u
Y2F0KGNvbnRhaW5lci5pbmplY3Rpb25zW2Z1bGxOYW1lXSB8fCBbXSk7Ci0KLSAgICAgIGluamVj
dGlvbnMgPSBidWlsZEluamVjdGlvbnMoY29udGFpbmVyLCBpbmplY3Rpb25zKTsKLSAgICAgIGlu
amVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5ID0gZnVsbE5hbWU7Ci0gICAgICBpbmplY3Rpb25z
LmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQotICAgICAgcmV0dXJuIGluamVjdGlvbnM7Ci0gICAg
fQotCi0gICAgZnVuY3Rpb24gZmFjdG9yeUluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFt
ZSkgewotICAgICAgdmFyIHNwbGl0TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0gICAgICAg
IHR5cGUgPSBzcGxpdE5hbWVbMF0sCi0gICAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0gW107Ci0K
LSAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVjdGlvbnMuY29uY2F0KGNvbnRh
aW5lci5mYWN0b3J5VHlwZUluamVjdGlvbnMuZ2V0KHR5cGUpIHx8IFtdKTsKLSAgICAgIGZhY3Rv
cnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci5mYWN0b3J5
SW5qZWN0aW9uc1tmdWxsTmFtZV0gfHwgW10pOwotCi0gICAgICBmYWN0b3J5SW5qZWN0aW9ucyA9
IGJ1aWxkSW5qZWN0aW9ucyhjb250YWluZXIsIGZhY3RvcnlJbmplY3Rpb25zKTsKLSAgICAgIGZh
Y3RvcnlJbmplY3Rpb25zLl9kZWJ1Z0NvbnRhaW5lcktleSA9IGZ1bGxOYW1lOwotCi0gICAgICBy
ZXR1cm4gZmFjdG9yeUluamVjdGlvbnM7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gaW5zdGFudGlh
dGUoY29udGFpbmVyLCBmdWxsTmFtZSkgewotICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3J5Rm9y
KGNvbnRhaW5lciwgZnVsbE5hbWUpOwotCi0gICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwgZnVs
bE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBmYWxzZSkgewotICAgICAgICByZXR1cm4gZmFjdG9y
eTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKHR5cGVvZiBm
YWN0b3J5LmV4dGVuZCA9PT0gJ2Z1bmN0aW9uJykgewotICAgICAgICAgIC8vIGFzc3VtZSB0aGUg
ZmFjdG9yeSB3YXMgZXh0ZW5kYWJsZSBhbmQgaXMgYWxyZWFkeSBpbmplY3RlZAotICAgICAgICAg
IHJldHVybiBmYWN0b3J5LmNyZWF0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8v
IGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0ZW5kYWJsZQotICAgICAgICAgIC8vIHRvIGNyZWF0
ZSB0aW1lIGluamVjdGlvbnMKLSAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG5ldydpbmcgZm9y
IGluc3RhbnRpYXRpb24gYW5kIG1lcmdlIGluamVjdGlvbnMgZm9yIHB1cmUgSlMgRnVuY3Rpb25z
Ci0gICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKGluamVjdGlvbnNGb3IoY29udGFpbmVy
LCBmdWxsTmFtZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24g
ZWFjaERlc3Ryb3lhYmxlKGNvbnRhaW5lciwgY2FsbGJhY2spIHsKLSAgICAgIGNvbnRhaW5lci5j
YWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgICAgICBpZiAob3B0aW9u
KGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9Ci0g
ICAgICAgIGNhbGxiYWNrKHZhbHVlKTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9u
IHJlc2V0Q2FjaGUoY29udGFpbmVyKSB7Ci0gICAgICBjb250YWluZXIuY2FjaGUuZWFjaExvY2Fs
KGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICAgICAgaWYgKG9wdGlvbihjb250YWluZXIsIGtl
eSwgJ2luc3RhbnRpYXRlJykgPT09IGZhbHNlKSB7IHJldHVybjsgfQotICAgICAgICB2YWx1ZS5k
ZXN0cm95KCk7Ci0gICAgICB9KTsKLSAgICAgIGNvbnRhaW5lci5jYWNoZS5kaWN0ID0ge307Ci0g
ICAgfQotCi0gICAgZnVuY3Rpb24gYWRkVHlwZUluamVjdGlvbihydWxlcywgdHlwZSwgcHJvcGVy
dHksIGZ1bGxOYW1lKSB7Ci0gICAgICB2YXIgaW5qZWN0aW9ucyA9IHJ1bGVzLmdldCh0eXBlKTsK
LQotICAgICAgaWYgKCFpbmplY3Rpb25zKSB7Ci0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLSAg
ICAgICAgcnVsZXMuc2V0KHR5cGUsIGluamVjdGlvbnMpOwotICAgICAgfQotCi0gICAgICBpbmpl
Y3Rpb25zLnB1c2goewotICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksCi0gICAgICAgIGZ1bGxO
YW1lOiBmdWxsTmFtZQotICAgICAgfSk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYWRkSW5qZWN0
aW9uKHJ1bGVzLCBmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpIHsKLSAgICAg
IHZhciBpbmplY3Rpb25zID0gcnVsZXNbZmFjdG9yeU5hbWVdID0gcnVsZXNbZmFjdG9yeU5hbWVd
IHx8IFtdOwotICAgICAgaW5qZWN0aW9ucy5wdXNoKHsgcHJvcGVydHk6IHByb3BlcnR5LCBmdWxs
TmFtZTogaW5qZWN0aW9uTmFtZSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQ29udGFpbmVyOwot
fSk7Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBFTlYgKi8KLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgaW5kZXhPZiA9
IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOwotCi0vKioKLSBUaGlzIHdpbGwgY29tcGFy
ZSB0d28gamF2YXNjcmlwdCB2YWx1ZXMgb2YgcG9zc2libHkgZGlmZmVyZW50IHR5cGVzLgotIEl0
IHdpbGwgdGVsbCB5b3Ugd2hpY2ggb25lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgYnkgcmV0
dXJuaW5nOgotCi0gIC0gLTEgaWYgdGhlIGZpcnN0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25k
LAotICAtIDAgaWYgYm90aCBhcmUgZXF1YWwsCi0gIC0gMSBpZiB0aGUgZmlyc3QgaXMgZ3JlYXRl
ciB0aGFuIHRoZSBzZWNvbmQuCi0KLSBUaGUgb3JkZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBg
RW1iZXIuT1JERVJfREVGSU5JVElPTmAsIGlmIHR5cGVzIGFyZSBkaWZmZXJlbnQuCi0gSW4gY2Fz
ZSB0aGV5IGhhdmUgdGhlIHNhbWUgdHlwZSBhbiBhcHByb3ByaWF0ZSBjb21wYXJpc29uIGZvciB0
aGlzIHR5cGUgaXMgbWFkZS4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmNvbXBhcmUoJ2hl
bGxvJywgJ2hlbGxvJyk7ICAvLyAwCi0gIEVtYmVyLmNvbXBhcmUoJ2FiYycsICdkZmcnKTsgICAg
ICAvLyAtMQotICBFbWJlci5jb21wYXJlKDIsIDEpOyAgICAgICAgICAgICAgLy8gMQotICBgYGAK
LQotIEBtZXRob2QgY29tcGFyZQotIEBmb3IgRW1iZXIKLSBAcGFyYW0ge09iamVjdH0gdiBGaXJz
dCB2YWx1ZSB0byBjb21wYXJlCi0gQHBhcmFtIHtPYmplY3R9IHcgU2Vjb25kIHZhbHVlIHRvIGNv
bXBhcmUKLSBAcmV0dXJuIHtOdW1iZXJ9IC0xIGlmIHYgPCB3LCAwIGlmIHYgPSB3IGFuZCAxIGlm
IHYgPiB3LgotKi8KLUVtYmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKHYsIHcpIHsKLSAg
aWYgKHYgPT09IHcpIHsgcmV0dXJuIDA7IH0KLQotICB2YXIgdHlwZTEgPSBFbWJlci50eXBlT2Yo
dik7Ci0gIHZhciB0eXBlMiA9IEVtYmVyLnR5cGVPZih3KTsKLQotICB2YXIgQ29tcGFyYWJsZSA9
IEVtYmVyLkNvbXBhcmFibGU7Ci0gIGlmIChDb21wYXJhYmxlKSB7Ci0gICAgaWYgKHR5cGUxPT09
J2luc3RhbmNlJyAmJiBDb21wYXJhYmxlLmRldGVjdCh2LmNvbnN0cnVjdG9yKSkgewotICAgICAg
cmV0dXJuIHYuY29uc3RydWN0b3IuY29tcGFyZSh2LCB3KTsKLSAgICB9Ci0KLSAgICBpZiAodHlw
ZTIgPT09ICdpbnN0YW5jZScgJiYgQ29tcGFyYWJsZS5kZXRlY3Qody5jb25zdHJ1Y3RvcikpIHsK
LSAgICAgIHJldHVybiAxLXcuY29uc3RydWN0b3IuY29tcGFyZSh3LCB2KTsKLSAgICB9Ci0gIH0K
LQotICAvLyBJZiB3ZSBoYXZlbid0IHlldCBnZW5lcmF0ZWQgYSByZXZlcnNlLW1hcHBpbmcgb2Yg
RW1iZXIuT1JERVJfREVGSU5JVElPTiwKLSAgLy8gZG8gc28gbm93LgotICB2YXIgbWFwcGluZyA9
IEVtYmVyLk9SREVSX0RFRklOSVRJT05fTUFQUElORzsKLSAgaWYgKCFtYXBwaW5nKSB7Ci0gICAg
dmFyIG9yZGVyID0gRW1iZXIuT1JERVJfREVGSU5JVElPTjsKLSAgICBtYXBwaW5nID0gRW1iZXIu
T1JERVJfREVGSU5JVElPTl9NQVBQSU5HID0ge307Ci0gICAgdmFyIGlkeCwgbGVuOwotICAgIGZv
ciAoaWR4ID0gMCwgbGVuID0gb3JkZXIubGVuZ3RoOyBpZHggPCBsZW47ICArK2lkeCkgewotICAg
ICAgbWFwcGluZ1tvcmRlcltpZHhdXSA9IGlkeDsKLSAgICB9Ci0KLSAgICAvLyBXZSBubyBsb25n
ZXIgbmVlZCBFbWJlci5PUkRFUl9ERUZJTklUSU9OLgotICAgIGRlbGV0ZSBFbWJlci5PUkRFUl9E
RUZJTklUSU9OOwotICB9Ci0KLSAgdmFyIHR5cGUxSW5kZXggPSBtYXBwaW5nW3R5cGUxXTsKLSAg
dmFyIHR5cGUySW5kZXggPSBtYXBwaW5nW3R5cGUyXTsKLQotICBpZiAodHlwZTFJbmRleCA8IHR5
cGUySW5kZXgpIHsgcmV0dXJuIC0xOyB9Ci0gIGlmICh0eXBlMUluZGV4ID4gdHlwZTJJbmRleCkg
eyByZXR1cm4gMTsgfQotCi0gIC8vIHR5cGVzIGFyZSBlcXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hl
Y2sgdmFsdWVzIG5vdwotICBzd2l0Y2ggKHR5cGUxKSB7Ci0gICAgY2FzZSAnYm9vbGVhbic6Ci0g
ICAgY2FzZSAnbnVtYmVyJzoKLSAgICAgIGlmICh2IDwgdykgeyByZXR1cm4gLTE7IH0KLSAgICAg
IGlmICh2ID4gdykgeyByZXR1cm4gMTsgfQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICdz
dHJpbmcnOgotICAgICAgdmFyIGNvbXAgPSB2LmxvY2FsZUNvbXBhcmUodyk7Ci0gICAgICBpZiAo
Y29tcCA8IDApIHsgcmV0dXJuIC0xOyB9Ci0gICAgICBpZiAoY29tcCA+IDApIHsgcmV0dXJuIDE7
IH0KLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnYXJyYXknOgotICAgICAgdmFyIHZMZW4g
PSB2Lmxlbmd0aDsKLSAgICAgIHZhciB3TGVuID0gdy5sZW5ndGg7Ci0gICAgICB2YXIgbCA9IE1h
dGgubWluKHZMZW4sIHdMZW4pOwotICAgICAgdmFyIHIgPSAwOwotICAgICAgdmFyIGkgPSAwOwot
ICAgICAgd2hpbGUgKHIgPT09IDAgJiYgaSA8IGwpIHsKLSAgICAgICAgciA9IGNvbXBhcmUodltp
XSx3W2ldKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgICAgaWYgKHIgIT09IDApIHsgcmV0
dXJuIHI7IH0KLQotICAgICAgLy8gYWxsIGVsZW1lbnRzIGFyZSBlcXVhbCBub3cKLSAgICAgIC8v
IHNob3J0ZXIgYXJyYXkgc2hvdWxkIGJlIG9yZGVyZWQgZmlyc3QKLSAgICAgIGlmICh2TGVuIDwg
d0xlbikgeyByZXR1cm4gLTE7IH0KLSAgICAgIGlmICh2TGVuID4gd0xlbikgeyByZXR1cm4gMTsg
fQotICAgICAgLy8gYXJyYXlzIGFyZSBlcXVhbCBub3cKLSAgICAgIHJldHVybiAwOwotCi0gICAg
Y2FzZSAnaW5zdGFuY2UnOgotICAgICAgaWYgKEVtYmVyLkNvbXBhcmFibGUgJiYgRW1iZXIuQ29t
cGFyYWJsZS5kZXRlY3QodikpIHsKLSAgICAgICAgcmV0dXJuIHYuY29tcGFyZSh2LCB3KTsKLSAg
ICAgIH0KLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnZGF0ZSc6Ci0gICAgICB2YXIgdk51
bSA9IHYuZ2V0VGltZSgpOwotICAgICAgdmFyIHdOdW0gPSB3LmdldFRpbWUoKTsKLSAgICAgIGlm
ICh2TnVtIDwgd051bSkgeyByZXR1cm4gLTE7IH0KLSAgICAgIGlmICh2TnVtID4gd051bSkgeyBy
ZXR1cm4gMTsgfQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJu
IDA7Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIF9jb3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7
Ci0gIHZhciByZXQsIGxvYywga2V5OwotCi0gIC8vIHByaW1pdGl2ZSBkYXRhIHR5cGVzIGFyZSBp
bW11dGFibGUsIGp1c3QgcmV0dXJuIHRoZW0uCi0gIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9i
aiB8fCBvYmo9PT1udWxsKSByZXR1cm4gb2JqOwotCi0gIC8vIGF2b2lkIGN5Y2xpY2FsIGxvb3Bz
Ci0gIGlmIChkZWVwICYmIChsb2M9aW5kZXhPZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGll
c1tsb2NdOwotCi0gIEVtYmVyLmFzc2VydCgnQ2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0
aGF0IGRvZXMgbm90IGltcGxlbWVudCBFbWJlci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2Yg
RW1iZXIuT2JqZWN0KSB8fCAoRW1iZXIuQ29weWFibGUgJiYgRW1iZXIuQ29weWFibGUuZGV0ZWN0
KG9iaikpKTsKLQotICAvLyBJTVBPUlRBTlQ6IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVj
dCBhIG5hdGl2ZSBhcnJheSBvbmx5LiBBbnkgb3RoZXIKLSAgLy8gb2JqZWN0IHdpbGwgbmVlZCB0
byBpbXBsZW1lbnQgQ29weWFibGUuCi0gIGlmIChFbWJlci50eXBlT2Yob2JqKSA9PT0gJ2FycmF5
JykgewotICAgIHJldCA9IG9iai5zbGljZSgpOwotICAgIGlmIChkZWVwKSB7Ci0gICAgICBsb2Mg
PSByZXQubGVuZ3RoOwotICAgICAgd2hpbGUoLS1sb2M+PTApIHJldFtsb2NdID0gX2NvcHkocmV0
W2xvY10sIGRlZXAsIHNlZW4sIGNvcGllcyk7Ci0gICAgfQotICB9IGVsc2UgaWYgKEVtYmVyLkNv
cHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSB7Ci0gICAgcmV0ID0gb2JqLmNv
cHkoZGVlcCwgc2VlbiwgY29waWVzKTsKLSAgfSBlbHNlIHsKLSAgICByZXQgPSB7fTsKLSAgICBm
b3Ioa2V5IGluIG9iaikgewotICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgY29u
dGludWU7Ci0KLSAgICAgIC8vIFByZXZlbnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBu
b24tZW51bWVyYWJpbGl0eSBmcm9tCi0gICAgICAvLyBjb3B5aW5nIGludGVybmFsIEVtYmVyIHBy
b3BlcnRpZXMKLSAgICAgIGlmIChrZXkuc3Vic3RyaW5nKDAsMikgPT09ICdfXycpIGNvbnRpbnVl
OwotCi0gICAgICByZXRba2V5XSA9IGRlZXAgPyBfY29weShvYmpba2V5XSwgZGVlcCwgc2Vlbiwg
Y29waWVzKSA6IG9ialtrZXldOwotICAgIH0KLSAgfQotCi0gIGlmIChkZWVwKSB7Ci0gICAgc2Vl
bi5wdXNoKG9iaik7Ci0gICAgY29waWVzLnB1c2gocmV0KTsKLSAgfQotCi0gIHJldHVybiByZXQ7
Ci19Ci0KLS8qKgotICBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHBhc3NlZCBvYmplY3QuIFRoaXMg
ZnVuY3Rpb24gY2FuIHRha2UganVzdCBhYm91dAotICBhbnkgdHlwZSBvZiBvYmplY3QgYW5kIGNy
ZWF0ZSBhIGNsb25lIG9mIGl0LCBpbmNsdWRpbmcgcHJpbWl0aXZlIHZhbHVlcwotICAod2hpY2gg
YXJlIG5vdCBhY3R1YWxseSBjbG9uZWQgYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUpLgotCi0g
IElmIHRoZSBwYXNzZWQgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBjbG9uZSgpYCBtZXRob2QsIHRo
ZW4gdGhpcyBmdW5jdGlvbgotICB3aWxsIHNpbXBseSBjYWxsIHRoYXQgbWV0aG9kIGFuZCByZXR1
cm4gdGhlIHJlc3VsdC4KLQotICBAbWV0aG9kIGNvcHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0g
e09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmUKLSAgQHBhcmFtIHtCb29sZWFufSBkZWVw
IElmIHRydWUsIGEgZGVlcCBjb3B5IG9mIHRoZSBvYmplY3QgaXMgbWFkZQotICBAcmV0dXJuIHtP
YmplY3R9IFRoZSBjbG9uZWQgb2JqZWN0Ci0qLwotRW1iZXIuY29weSA9IGZ1bmN0aW9uKG9iaiwg
ZGVlcCkgewotICAvLyBmYXN0IHBhdGhzCi0gIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8
fCBvYmo9PT1udWxsKSByZXR1cm4gb2JqOyAvLyBjYW4ndCBjb3B5IHByaW1pdGl2ZXMKLSAgaWYg
KEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSByZXR1cm4gb2Jq
LmNvcHkoZGVlcCk7Ci0gIHJldHVybiBfY29weShvYmosIGRlZXAsIGRlZXAgPyBbXSA6IG51bGws
IGRlZXAgPyBbXSA6IG51bGwpOwotfTsKLQotLyoqCi0gIENvbnZlbmllbmNlIG1ldGhvZCB0byBp
bnNwZWN0IGFuIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCi0gIGNvbnZlcnQg
dGhlIG9iamVjdCBpbnRvIGEgdXNlZnVsIHN0cmluZyBkZXNjcmlwdGlvbi4KLQotICBJdCBpcyBh
IHByZXR0eSBzaW1wbGUgaW1wbGVtZW50YXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBtb3Jl
IHJvYnVzdCwKLSAgdXNlIHNvbWV0aGluZyBsaWtlIEpTRHVtcDogaHR0cHM6Ly9naXRodWIuY29t
L05WL2pzRHVtcAotCi0gIEBtZXRob2QgaW5zcGVjdAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7
T2JqZWN0fSBvYmogVGhlIG9iamVjdCB5b3Ugd2FudCB0byBpbnNwZWN0LgotICBAcmV0dXJuIHtT
dHJpbmd9IEEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAotKi8KLUVtYmVyLmluc3BlY3QgPSBm
dW5jdGlvbihvYmopIHsKLSAgdmFyIHR5cGUgPSBFbWJlci50eXBlT2Yob2JqKTsKLSAgaWYgKHR5
cGUgPT09ICdhcnJheScpIHsKLSAgICByZXR1cm4gJ1snICsgb2JqICsgJ10nOwotICB9Ci0gIGlm
ICh0eXBlICE9PSAnb2JqZWN0JykgewotICAgIHJldHVybiBvYmogKyAnJzsKLSAgfQotCi0gIHZh
ciB2LCByZXQgPSBbXTsKLSAgZm9yKHZhciBrZXkgaW4gb2JqKSB7Ci0gICAgaWYgKG9iai5oYXNP
d25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICB2ID0gb2JqW2tleV07Ci0gICAgICBpZiAodiA9PT0g
J3RvU3RyaW5nJykgeyBjb250aW51ZTsgfSAvLyBpZ25vcmUgdXNlbGVzcyBpdGVtcwotICAgICAg
aWYgKEVtYmVyLnR5cGVPZih2KSA9PT0gJ2Z1bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkgeyAu
Li4gfSI7IH0KLSAgICAgIHJldC5wdXNoKGtleSArICI6ICIgKyB2KTsKLSAgICB9Ci0gIH0KLSAg
cmV0dXJuICJ7IiArIHJldC5qb2luKCIsICIpICsgIn0iOwotfTsKLQotLyoqCi0gIENvbXBhcmVz
IHR3byBvYmplY3RzLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGV5IGFyZSBsb2dpY2FsbHkgZXF1YWwu
IFRoaXMgaXMKLSAgYSBkZWVwZXIgY29tcGFyaXNvbiB0aGFuIGEgc2ltcGxlIHRyaXBsZSBlcXVh
bC4gRm9yIHNldHMgaXQgd2lsbCBjb21wYXJlIHRoZQotICBpbnRlcm5hbCBvYmplY3RzLiBGb3Ig
YW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYGlzRXF1YWwoKWAgaXQgd2lsbAotICBy
ZXNwZWN0IHRoYXQgbWV0aG9kLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuaXNFcXVhbCgn
aGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRydWUKLSAgRW1iZXIuaXNFcXVhbCgxLCAyKTsgICAgICAg
ICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlzRXF1YWwoWzQsMl0sIFs0LDJdKTsgICAgICAvLyBm
YWxzZQotICBgYGAKLQotICBAbWV0aG9kIGlzRXF1YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0g
e09iamVjdH0gYSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQotICBAcGFyYW0ge09iamVjdH0gYiBz
ZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKLSAgQHJldHVybiB7Qm9vbGVhbn0KLSovCi1FbWJlci5p
c0VxdWFsID0gZnVuY3Rpb24oYSwgYikgewotICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9m
IGEuaXNFcXVhbCkgcmV0dXJuIGEuaXNFcXVhbChiKTsKLSAgcmV0dXJuIGEgPT09IGI7Ci19Owot
Ci0vLyBVc2VkIGJ5IEVtYmVyLmNvbXBhcmUKLUVtYmVyLk9SREVSX0RFRklOSVRJT04gPSBFbWJl
ci5FTlYuT1JERVJfREVGSU5JVElPTiB8fCBbCi0gICd1bmRlZmluZWQnLAotICAnbnVsbCcsCi0g
ICdib29sZWFuJywKLSAgJ251bWJlcicsCi0gICdzdHJpbmcnLAotICAnYXJyYXknLAotICAnb2Jq
ZWN0JywKLSAgJ2luc3RhbmNlJywKLSAgJ2Z1bmN0aW9uJywKLSAgJ2NsYXNzJywKLSAgJ2RhdGUn
Ci1dOwotCi0vKioKLSAgUmV0dXJucyBhbGwgb2YgdGhlIGtleXMgZGVmaW5lZCBvbiBhbiBvYmpl
Y3Qgb3IgaGFzaC4gVGhpcyBpcyB1c2VmdWwKLSAgd2hlbiBpbnNwZWN0aW5nIG9iamVjdHMgZm9y
IGRlYnVnZ2luZy4gT24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LCB0aGlzCi0gIHVzZXMgdGhl
IG5hdGl2ZSBgT2JqZWN0LmtleXNgIGltcGxlbWVudGF0aW9uLgotCi0gIEBtZXRob2Qga2V5cwot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmoKLSAgQHJldHVybiB7QXJyYXl9IEFy
cmF5IGNvbnRhaW5pbmcga2V5cyBvZiBvYmoKLSovCi1FbWJlci5rZXlzID0gT2JqZWN0LmtleXM7
Ci0KLWlmICghRW1iZXIua2V5cyB8fCBFbWJlci5jcmVhdGUuaXNTaW11bGF0ZWQpIHsKLSAgdmFy
IHByb3RvdHlwZVByb3BlcnRpZXMgPSBbCi0gICAgJ2NvbnN0cnVjdG9yJywKLSAgICAnaGFzT3du
UHJvcGVydHknLAotICAgICdpc1Byb3RvdHlwZU9mJywKLSAgICAncHJvcGVydHlJc0VudW1lcmFi
bGUnLAotICAgICd2YWx1ZU9mJywKLSAgICAndG9Mb2NhbGVTdHJpbmcnLAotICAgICd0b1N0cmlu
ZycKLSAgXSwKLSAgcHVzaFByb3BlcnR5TmFtZSA9IGZ1bmN0aW9uKG9iaiwgYXJyYXksIGtleSkg
ewotICAgIC8vIFByZXZlbnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVy
YWJpbGl0eSBmcm9tCi0gICAgLy8gY29weWluZyBpbnRlcm5hbCBFbWJlciBwcm9wZXJ0aWVzCi0g
ICAgaWYgKGtleS5zdWJzdHJpbmcoMCwyKSA9PT0gJ19fJykgcmV0dXJuOwotICAgIGlmIChrZXkg
PT09ICdfc3VwZXInKSByZXR1cm47Ci0gICAgaWYgKGluZGV4T2YoYXJyYXksIGtleSkgPj0gMCkg
cmV0dXJuOwotICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybjsKLQotICAg
IGFycmF5LnB1c2goa2V5KTsKLSAgfTsKLQotICBFbWJlci5rZXlzID0gZnVuY3Rpb24ob2JqKSB7
Ci0gICAgdmFyIHJldCA9IFtdLCBrZXk7Ci0gICAgZm9yIChrZXkgaW4gb2JqKSB7Ci0gICAgICBw
dXNoUHJvcGVydHlOYW1lKG9iaiwgcmV0LCBrZXkpOwotICAgIH0KLQotICAgIC8vIElFOCBkb2Vz
bid0IGVudW1lcmF0ZSBwcm9wZXJ0eSB0aGF0IG5hbWVkIHRoZSBzYW1lIGFzIHByb3RvdHlwZSBw
cm9wZXJ0aWVzLgotICAgIGZvciAodmFyIGkgPSAwLCBsID0gcHJvdG90eXBlUHJvcGVydGllcy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIGtleSA9IHByb3RvdHlwZVByb3BlcnRpZXNbaV07
Ci0KLSAgICAgIHB1c2hQcm9wZXJ0eU5hbWUob2JqLCByZXQsIGtleSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJldDsKLSAgfTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
QG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgU1RSSU5H
X0RBU0hFUklaRV9SRUdFWFAgPSAoL1sgX10vZyk7Ci12YXIgU1RSSU5HX0RBU0hFUklaRV9DQUNI
RSA9IHt9OwotdmFyIFNUUklOR19ERUNBTUVMSVpFX1JFR0VYUCA9ICgvKFthLXpcZF0pKFtBLVpd
KS9nKTsKLXZhciBTVFJJTkdfQ0FNRUxJWkVfUkVHRVhQID0gKC8oXC18X3xcLnxccykrKC4pPy9n
KTsKLXZhciBTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMSA9ICgvKFthLXpcZF0pKFtBLVpdKykv
Zyk7Ci12YXIgU1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzIgPSAoL1wtfFxzKy9nKTsKLQotLyoq
Ci0gIERlZmluZXMgdGhlIGhhc2ggb2YgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50
IGxhbmd1YWdlLiBVc2VkIGJ5Ci0gIHRoZSBgRW1iZXIuU3RyaW5nLmxvYygpYCBoZWxwZXIuIFRv
IGxvY2FsaXplLCBhZGQgc3RyaW5nIHZhbHVlcyB0byB0aGlzCi0gIGhhc2guCi0KLSAgQHByb3Bl
cnR5IFNUUklOR1MKLSAgQGZvciBFbWJlcgotICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuU1RSSU5H
UyA9IHt9OwotCi0vKioKLSAgRGVmaW5lcyBzdHJpbmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5n
IHN0cmluZyBmb3JtYXR0aW5nIGFuZCBsb2NhbGl6YXRpb24uCi0gIFVubGVzcyBgRW1iZXIuRVhU
RU5EX1BST1RPVFlQRVMuU3RyaW5nYCBpcyBgZmFsc2VgIHRoZXNlIG1ldGhvZHMgd2lsbCBhbHNv
IGJlCi0gIGFkZGVkIHRvIHRoZSBgU3RyaW5nLnByb3RvdHlwZWAgYXMgd2VsbC4KLQotICBAY2xh
c3MgU3RyaW5nCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlN0cmlu
ZyA9IHsKLQotICAvKioKLSAgICBBcHBseSBmb3JtYXR0aW5nIG9wdGlvbnMgdG8gdGhlIHN0cmlu
Zy4gVGhpcyB3aWxsIGxvb2sgZm9yIG9jY3VycmVuY2VzCi0gICAgb2YgIiVAIiBpbiB5b3VyIHN0
cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggdGhlIGFyZ3VtZW50cyB5b3UgcGFzcyBpbnRv
Ci0gICAgdGhpcyBtZXRob2QuIElmIHlvdSB3YW50IHRvIGNvbnRyb2wgdGhlIHNwZWNpZmljIG9y
ZGVyIG9mIHJlcGxhY2VtZW50LAotICAgIHlvdSBjYW4gYWRkIGEgbnVtYmVyIGFmdGVyIHRoZSBr
ZXkgYXMgd2VsbCB0byBpbmRpY2F0ZSB3aGljaCBhcmd1bWVudAotICAgIHlvdSB3YW50IHRvIGlu
c2VydC4KLQotICAgIE9yZGVyZWQgaW5zZXJ0aW9ucyBhcmUgbW9zdCB1c2VmdWwgd2hlbiBidWls
ZGluZyBsb2Mgc3RyaW5ncyB3aGVyZSB2YWx1ZXMKLSAgICB5b3UgbmVlZCB0byBpbnNlcnQgbWF5
IGFwcGVhciBpbiBkaWZmZXJlbnQgb3JkZXJzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICJI
ZWxsbyAlQCAlQCIuZm10KCdKb2huJywgJ0RvZScpOyAgICAgLy8gIkhlbGxvIEpvaG4gRG9lIgot
ICAgICJIZWxsbyAlQDIsICVAMSIuZm10KCdKb2huJywgJ0RvZScpOyAgLy8gIkhlbGxvIERvZSwg
Sm9obiIKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZm10Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHN0
ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAotICAgIEBwYXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJy
YXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBvbGF0ZSBpbnRvIHN0cmluZy4KLSAgICBAcmV0dXJu
IHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcKLSAgKi8KLSAgZm10OiBmdW5jdGlvbihzdHIsIGZv
cm1hdHMpIHsKLSAgICAvLyBmaXJzdCwgcmVwbGFjZSBhbnkgT1JERVJFRCByZXBsYWNlbWVudHMu
Ci0gICAgdmFyIGlkeCAgPSAwOyAvLyB0aGUgY3VycmVudCBpbmRleCBmb3Igbm9uLW51bWVyaWNh
bCByZXBsYWNlbWVudHMKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVAKFswLTldKyk/L2csIGZ1
bmN0aW9uKHMsIGFyZ0luZGV4KSB7Ci0gICAgICBhcmdJbmRleCA9IChhcmdJbmRleCkgPyBwYXJz
ZUludChhcmdJbmRleCwgMTApIC0gMSA6IGlkeCsrOwotICAgICAgcyA9IGZvcm1hdHNbYXJnSW5k
ZXhdOwotICAgICAgcmV0dXJuIChzID09PSBudWxsKSA/ICcobnVsbCknIDogKHMgPT09IHVuZGVm
aW5lZCkgPyAnJyA6IEVtYmVyLmluc3BlY3Qocyk7Ci0gICAgfSkgOwotICB9LAotCi0gIC8qKgot
ICAgIEZvcm1hdHMgdGhlIHBhc3NlZCBzdHJpbmcsIGJ1dCBmaXJzdCBsb29rcyB1cCB0aGUgc3Ry
aW5nIGluIHRoZSBsb2NhbGl6ZWQKLSAgICBzdHJpbmdzIGhhc2guIFRoaXMgaXMgYSBjb252ZW5p
ZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBTZWUKLSAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBm
b3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmb3JtYXR0aW5nLgotCi0gICAgTm90ZSB0aGF0IGl0IGlz
IHRyYWRpdGlvbmFsIGJ1dCBub3QgcmVxdWlyZWQgdG8gcHJlZml4IGxvY2FsaXplZCBzdHJpbmcK
LSAgICBrZXlzIHdpdGggYW4gdW5kZXJzY29yZSBvciBvdGhlciBjaGFyYWN0ZXIgc28geW91IGNh
biBlYXNpbHkgaWRlbnRpZnkKLSAgICBsb2NhbGl6ZWQgc3RyaW5ncy4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBFbWJlci5TVFJJTkdTID0gewotICAgICAgJ19IZWxsbyBXb3JsZCc6ICdCb25q
b3VyIGxlIG1vbmRlJywKLSAgICAgICdfSGVsbG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcKLSAg
ICB9OwotCi0gICAgRW1iZXIuU3RyaW5nLmxvYygiX0hlbGxvIFdvcmxkIik7ICAvLyAnQm9uam91
ciBsZSBtb25kZSc7Ci0gICAgRW1iZXIuU3RyaW5nLmxvYygiX0hlbGxvICVAICVAIiwgWyJKb2hu
IiwgIlNtaXRoIl0pOyAgLy8gIkJvbmpvdXIgSm9obiBTbWl0aCI7Ci0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIGxvYwotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQK
LSAgICBAcGFyYW0ge0FycmF5fSBmb3JtYXRzIE9wdGlvbmFsIGFycmF5IG9mIHBhcmFtZXRlcnMg
dG8gaW50ZXJwb2xhdGUgaW50byBzdHJpbmcuCi0gICAgQHJldHVybiB7U3RyaW5nfSBmb3JtYXR0
ZWQgc3RyaW5nCi0gICovCi0gIGxvYzogZnVuY3Rpb24oc3RyLCBmb3JtYXRzKSB7Ci0gICAgc3Ry
ID0gRW1iZXIuU1RSSU5HU1tzdHJdIHx8IHN0cjsKLSAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmZt
dChzdHIsIGZvcm1hdHMpIDsKLSAgfSwKLQotICAvKioKLSAgICBTcGxpdHMgYSBzdHJpbmcgaW50
byBzZXBhcmF0ZSB1bml0cyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKLSAg
ICBlbXB0eSBzdHJpbmdzIGluIHRoZSBwcm9jZXNzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0
aG9kIGZvciBzcGxpdCB0aGF0Ci0gICAgaXMgbW9zdGx5IHVzZWZ1bCB3aGVuIGFwcGxpZWQgdG8g
dGhlIGBTdHJpbmcucHJvdG90eXBlYC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5T
dHJpbmcudygiYWxwaGEgYmV0YSBnYW1tYSIpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAg
ICBjb25zb2xlLmxvZyhrZXkpOwotICAgIH0pOwotCi0gICAgLy8gPiBhbHBoYQotICAgIC8vID4g
YmV0YQotICAgIC8vID4gZ2FtbWEKLSAgICBgYGAKLQotICAgIEBtZXRob2QgdwotICAgIEBwYXJh
bSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdAotICAgIEByZXR1cm4ge1N0cmluZ30g
c3BsaXQgc3RyaW5nCi0gICovCi0gIHc6IGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnNwbGl0
KC9ccysvKTsgfSwKLQotICAvKioKLSAgICBDb252ZXJ0cyBhIGNhbWVsaXplZCBzdHJpbmcgaW50
byBhbGwgbG93ZXIgY2FzZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgJ2lubmVySFRNTCcuZGVjYW1lbGl6ZSgpOyAgICAgICAgICAgLy8gJ2lubmVy
X2h0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy5kZWNhbWVsaXplKCk7ICAgICAgICAvLyAnYWN0aW9u
X25hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1lJy5kZWNhbWVsaXplKCk7ICAgICAvLyAnY3NzLWNs
YXNzLW5hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5kZWNhbWVsaXplKCk7ICAvLyAnbXkg
ZmF2b3JpdGUgaXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRlY2FtZWxpemUKLSAgICBA
cGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZGVjYW1lbGl6ZS4KLSAgICBAcmV0dXJu
IHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBzdHJpbmcuCi0gICovCi0gIGRlY2FtZWxpemU6IGZ1
bmN0aW9uKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfREVDQU1FTElaRV9S
RUdFWFAsICckMV8kMicpLnRvTG93ZXJDYXNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVwbGFj
ZXMgdW5kZXJzY29yZXMsIHNwYWNlcywgb3IgY2FtZWxDYXNlIHdpdGggZGFzaGVzLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmRhc2hlcml6ZSgpOyAgICAgICAgICAvLyAn
aW5uZXItaHRtbCcKLSAgICAnYWN0aW9uX25hbWUnLmRhc2hlcml6ZSgpOyAgICAgICAgLy8gJ2Fj
dGlvbi1uYW1lJwotICAgICdjc3MtY2xhc3MtbmFtZScuZGFzaGVyaXplKCk7ICAgICAvLyAnY3Nz
LWNsYXNzLW5hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5kYXNoZXJpemUoKTsgIC8vICdt
eS1mYXZvcml0ZS1pdGVtcycKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGFzaGVyaXplCi0gICAg
QHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGRhc2hlcml6ZS4KLSAgICBAcmV0dXJu
IHtTdHJpbmd9IHRoZSBkYXNoZXJpemVkIHN0cmluZy4KLSAgKi8KLSAgZGFzaGVyaXplOiBmdW5j
dGlvbihzdHIpIHsKLSAgICB2YXIgY2FjaGUgPSBTVFJJTkdfREFTSEVSSVpFX0NBQ0hFLAotICAg
ICAgICBoaXQgICA9IGNhY2hlLmhhc093blByb3BlcnR5KHN0ciksCi0gICAgICAgIHJldDsKLQot
ICAgIGlmIChoaXQpIHsKLSAgICAgIHJldHVybiBjYWNoZVtzdHJdOwotICAgIH0gZWxzZSB7Ci0g
ICAgICByZXQgPSBFbWJlci5TdHJpbmcuZGVjYW1lbGl6ZShzdHIpLnJlcGxhY2UoU1RSSU5HX0RB
U0hFUklaRV9SRUdFWFAsJy0nKTsKLSAgICAgIGNhY2hlW3N0cl0gPSByZXQ7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBsb3dlckNhbWVs
Q2FzZSBmb3JtIG9mIGEgc3RyaW5nLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhU
TUwnLmNhbWVsaXplKCk7ICAgICAgICAgIC8vICdpbm5lckhUTUwnCi0gICAgJ2FjdGlvbl9uYW1l
Jy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbk5hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1l
Jy5jYW1lbGl6ZSgpOyAgICAgLy8gJ2Nzc0NsYXNzTmFtZScKLSAgICAnbXkgZmF2b3JpdGUgaXRl
bXMnLmNhbWVsaXplKCk7ICAvLyAnbXlGYXZvcml0ZUl0ZW1zJwotICAgICdNeSBGYXZvcml0ZSBJ
dGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZhdm9yaXRlSXRlbXMnCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIGNhbWVsaXplCi0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNh
bWVsaXplLgotICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIGNhbWVsaXplZCBzdHJpbmcuCi0gICov
Ci0gIGNhbWVsaXplOiBmdW5jdGlvbihzdHIpIHsKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RS
SU5HX0NBTUVMSVpFX1JFR0VYUCwgZnVuY3Rpb24obWF0Y2gsIHNlcGFyYXRvciwgY2hyKSB7Ci0g
ICAgICByZXR1cm4gY2hyID8gY2hyLnRvVXBwZXJDYXNlKCkgOiAnJzsKLSAgICB9KS5yZXBsYWNl
KC9eKFtBLVpdKS8sIGZ1bmN0aW9uKG1hdGNoLCBzZXBhcmF0b3IsIGNocikgewotICAgICAgcmV0
dXJuIG1hdGNoLnRvTG93ZXJDYXNlKCk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0
dXJucyB0aGUgVXBwZXJDYW1lbENhc2UgZm9ybSBvZiBhIHN0cmluZy4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICAnaW5uZXJIVE1MJy5jbGFzc2lmeSgpOyAgICAgICAgICAvLyAnSW5uZXJIVE1M
JwotICAgICdhY3Rpb25fbmFtZScuY2xhc3NpZnkoKTsgICAgICAgIC8vICdBY3Rpb25OYW1lJwot
ICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3NpZnkoKTsgICAgIC8vICdDc3NDbGFzc05hbWUnCi0g
ICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jbGFzc2lmeSgpOyAgLy8gJ015RmF2b3JpdGVJdGVtcycK
LSAgICBgYGAKLQotICAgIEBtZXRob2QgY2xhc3NpZnkKLSAgICBAcGFyYW0ge1N0cmluZ30gc3Ry
IHRoZSBzdHJpbmcgdG8gY2xhc3NpZnkKLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lm
aWVkIHN0cmluZwotICAqLwotICBjbGFzc2lmeTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgdmFyIHBh
cnRzID0gc3RyLnNwbGl0KCIuIiksCi0gICAgICAgIG91dCA9IFtdOwotCi0gICAgZm9yICh2YXIg
aT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIHZhciBjYW1lbGl6ZWQgPSBF
bWJlci5TdHJpbmcuY2FtZWxpemUocGFydHNbaV0pOwotICAgICAgb3V0LnB1c2goY2FtZWxpemVk
LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY2FtZWxpemVkLnN1YnN0cigxKSk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIG91dC5qb2luKCIuIik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTW9yZSBnZW5l
cmFsIHRoYW4gZGVjYW1lbGl6ZS4gUmV0dXJucyB0aGUgbG93ZXJcX2Nhc2VcX2FuZFxfdW5kZXJz
Y29yZWQKLSAgICBmb3JtIG9mIGEgc3RyaW5nLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdp
bm5lckhUTUwnLnVuZGVyc2NvcmUoKTsgICAgICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAgJ2Fj
dGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAgJ2Nz
cy1jbGFzcy1uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAvLyAnY3NzX2NsYXNzX25hbWUnCi0gICAg
J215IGZhdm9yaXRlIGl0ZW1zJy51bmRlcnNjb3JlKCk7ICAvLyAnbXlfZmF2b3JpdGVfaXRlbXMn
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVuZGVyc2NvcmUKLSAgICBAcGFyYW0ge1N0cmluZ30g
c3RyIFRoZSBzdHJpbmcgdG8gdW5kZXJzY29yZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1
bmRlcnNjb3JlZCBzdHJpbmcuCi0gICovCi0gIHVuZGVyc2NvcmU6IGZ1bmN0aW9uKHN0cikgewot
ICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMSwgJyQxXyQy
JykuCi0gICAgICByZXBsYWNlKFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yLCAnXycpLnRvTG93
ZXJDYXNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQgZm9y
bSBvZiBhIHN0cmluZwotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmNhcGl0
YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhUTUwnCi0gICAgJ2FjdGlvbl9uYW1lJy5jYXBpdGFs
aXplKCkgICAgICAgLy8gJ0FjdGlvbl9uYW1lJwotICAgICdjc3MtY2xhc3MtbmFtZScuY2FwaXRh
bGl6ZSgpICAgIC8vICdDc3MtY2xhc3MtbmFtZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNh
cGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUgaXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9k
IGNhcGl0YWxpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FwaXRh
bGl6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjYXBpdGFsaXplZCBzdHJpbmcuCi0gICov
Ci0gIGNhcGl0YWxpemU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBzdHIuY2hhckF0KDAp
LnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyKDEpOwotICB9Ci19OwotCi0KLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCi0qLwotCi0KLQotdmFyIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgdyAgID0g
RW1iZXIuU3RyaW5nLncsCi0gICAgbG9jID0gRW1iZXIuU3RyaW5nLmxvYywKLSAgICBjYW1lbGl6
ZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSwKLSAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5n
LmRlY2FtZWxpemUsCi0gICAgZGFzaGVyaXplID0gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZSwKLSAg
ICB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUsCi0gICAgY2FwaXRhbGl6ZSA9
IEVtYmVyLlN0cmluZy5jYXBpdGFsaXplLAotICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNs
YXNzaWZ5OwotCi0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpIHsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0
cmluZy5mbXRdKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcuaHRtbCNtZXRob2RfZm10KS4KLQot
ICAgIEBtZXRob2QgZm10Ci0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlw
ZS5mbXQgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gZm10KHRoaXMsIGFyZ3VtZW50cyk7Ci0g
IH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcud10oL2FwaS9jbGFzc2VzL0VtYmVy
LlN0cmluZy5odG1sI21ldGhvZF93KS4KLQotICAgIEBtZXRob2QgdwotICAgIEBmb3IgU3RyaW5n
Ci0gICovCi0gIFN0cmluZy5wcm90b3R5cGUudyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB3
KHRoaXMpOwotICB9OwotCi0gIC8qKgotICAgIFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9j
bGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9sb2MpLgotCi0gICAgQG1ldGhvZCBsb2MK
LSAgICBAZm9yIFN0cmluZwotICAqLwotICBTdHJpbmcucHJvdG90eXBlLmxvYyA9IGZ1bmN0aW9u
KCkgewotICAgIHJldHVybiBsb2ModGhpcywgYXJndW1lbnRzKTsKLSAgfTsKLQotICAvKioKLSAg
ICBTZWUgW0VtYmVyLlN0cmluZy5jYW1lbGl6ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5o
dG1sI21ldGhvZF9jYW1lbGl6ZSkuCi0KLSAgICBAbWV0aG9kIGNhbWVsaXplCi0gICAgQGZvciBT
dHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5jYW1lbGl6ZSA9IGZ1bmN0aW9uKCkgewot
ICAgIHJldHVybiBjYW1lbGl6ZSh0aGlzKTsKLSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVy
LlN0cmluZy5kZWNhbWVsaXplXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9k
X2RlY2FtZWxpemUpLgotCi0gICAgQG1ldGhvZCBkZWNhbWVsaXplCi0gICAgQGZvciBTdHJpbmcK
LSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5kZWNhbWVsaXplID0gZnVuY3Rpb24oKSB7Ci0gICAg
cmV0dXJuIGRlY2FtZWxpemUodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5T
dHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rh
c2hlcml6ZSkuCi0KLSAgICBAbWV0aG9kIGRhc2hlcml6ZQotICAgIEBmb3IgU3RyaW5nCi0gICov
Ci0gIFN0cmluZy5wcm90b3R5cGUuZGFzaGVyaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IGRhc2hlcml6ZSh0aGlzKTsKLSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy51
bmRlcnNjb3JlXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX3VuZGVyc2Nv
cmUpLgotCi0gICAgQG1ldGhvZCB1bmRlcnNjb3JlCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAg
U3RyaW5nLnByb3RvdHlwZS51bmRlcnNjb3JlID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHVu
ZGVyc2NvcmUodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuY2xh
c3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcuaHRtbCNtZXRob2RfY2xhc3NpZnkpLgot
Ci0gICAgQG1ldGhvZCBjbGFzc2lmeQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5w
cm90b3R5cGUuY2xhc3NpZnkgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gY2xhc3NpZnkodGhp
cyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYXBpdGFsaXplKS4KLQotICAgIEBt
ZXRob2QgY2FwaXRhbGl6ZQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5
cGUuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMp
OwotICB9OwotCi0gIAotfQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBt
b2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgc2xpY2UgPSBBcnJheS5wcm90b3R5
cGUuc2xpY2UsCi0gICAgZ2V0UHJvcGVydGllcyA9IEVtYmVyLmdldFByb3BlcnRpZXM7Ci0KLS8q
KgotICAjIyBPdmVydmlldwotCi0gIFRoaXMgbWl4aW4gcHJvdmlkZXMgcHJvcGVydGllcyBhbmQg
cHJvcGVydHkgb2JzZXJ2aW5nIGZ1bmN0aW9uYWxpdHksIGNvcmUKLSAgZmVhdHVyZXMgb2YgdGhl
IEVtYmVyIG9iamVjdCBtb2RlbC4KLQotICBQcm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMgYWxsb3cg
b25lIG9iamVjdCB0byBvYnNlcnZlIGNoYW5nZXMgdG8gYQotICBwcm9wZXJ0eSBvbiBhbm90aGVy
IG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFsIHdheXMgdGhhdAotICBtb2Rl
bHMsIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgaW4g
YW4gRW1iZXIKLSAgYXBwbGljYXRpb24uCi0KLSAgQW55IG9iamVjdCB0aGF0IGhhcyB0aGlzIG1p
eGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4gb2JzZXJ2ZXIKLSAgb3BlcmF0aW9ucy4gVGhhdCBp
bmNsdWRlcyBgRW1iZXIuT2JqZWN0YCBhbmQgbW9zdCBvYmplY3RzIHlvdSB3aWxsCi0gIGludGVy
YWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIgRW1iZXIgYXBwbGljYXRpb24uCi0KLSAgTm90ZSB0
aGF0IHlvdSB3aWxsIG5vdCBnZW5lcmFsbHkgYXBwbHkgdGhpcyBtaXhpbiB0byBjbGFzc2VzIHlv
dXJzZWxmLAotICBidXQgeW91IHdpbGwgdXNlIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlz
IG1vZHVsZSBmcmVxdWVudGx5LCBzbyBpdAotICBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBo
b3cgdG8gdXNlIGl0LgotCi0gICMjIFVzaW5nIGBnZXQoKWAgYW5kIGBzZXQoKWAKLQotICBCZWNh
dXNlIG9mIEVtYmVyJ3Mgc3VwcG9ydCBmb3IgYmluZGluZ3MgYW5kIG9ic2VydmVycywgeW91IHdp
bGwgYWx3YXlzCi0gIGFjY2VzcyBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCBhbmQg
c2V0IHByb3BlcnRpZXMgdXNpbmcgdGhlCi0gIHNldCBtZXRob2QuIFRoaXMgYWxsb3dzIHRoZSBv
YnNlcnZpbmcgb2JqZWN0cyB0byBiZSBub3RpZmllZCBhbmQKLSAgY29tcHV0ZWQgcHJvcGVydGll
cyB0byBiZSBoYW5kbGVkIHByb3Blcmx5LgotCi0gIE1vcmUgZG9jdW1lbnRhdGlvbiBhYm91dCBg
Z2V0YCBhbmQgYHNldGAgYXJlIGJlbG93LgotCi0gICMjIE9ic2VydmluZyBQcm9wZXJ0eSBDaGFu
Z2VzCi0KLSAgWW91IHR5cGljYWxseSBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5
IGFkZGluZyB0aGUgYG9ic2VydmVzYAotICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2Qg
ZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCi0gIEZvciBleGFtcGxlOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNl
cnZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVl
IiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfS5vYnNlcnZlcygndmFsdWUnKQotICB9KTsKLSAgYGBg
Ci0KLSAgQWx0aG91Z2ggdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gd2F5IHRvIGFkZCBhbiBvYnNl
cnZlciwgdGhpcyBjYXBhYmlsaXR5Ci0gIGlzIGFjdHVhbGx5IGJ1aWx0IGludG8gdGhlIGBFbWJl
ci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0d28gbWV0aG9kcwotICBkZWZpbmVkIGluIHRoaXMg
bWl4aW46IGBhZGRPYnNlcnZlcmAgYW5kIGByZW1vdmVPYnNlcnZlcmAuIFlvdSBjYW4gdXNlCi0g
IHRoZXNlIHR3byBtZXRob2RzIHRvIGFkZCBhbmQgcmVtb3ZlIG9ic2VydmVycyB5b3Vyc2VsZiBp
ZiB5b3UgbmVlZCB0bwotICBkbyBzbyBhdCBydW50aW1lLgotCi0gIFRvIGFkZCBhbiBvYnNlcnZl
ciBmb3IgYSBwcm9wZXJ0eSwgY2FsbDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIG9iamVjdC5hZGRP
YnNlcnZlcigncHJvcGVydHlLZXknLCB0YXJnZXRPYmplY3QsIHRhcmdldEFjdGlvbikKLSAgYGBg
Ci0KLSAgVGhpcyB3aWxsIGNhbGwgdGhlIGB0YXJnZXRBY3Rpb25gIG1ldGhvZCBvbiB0aGUgYHRh
cmdldE9iamVjdGAgd2hlbmV2ZXIKLSAgdGhlIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNo
YW5nZXMuCi0KLSAgTm90ZSB0aGF0IGlmIGBwcm9wZXJ0eUtleWAgaXMgYSBjb21wdXRlZCBwcm9w
ZXJ0eSwgdGhlIG9ic2VydmVyIHdpbGwgYmUKLSAgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBwcm9w
ZXJ0eSBkZXBlbmRlbmNpZXMgYXJlIGNoYW5nZWQsIGV2ZW4gaWYgdGhlCi0gIHJlc3VsdGluZyB2
YWx1ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgdW5jaGFuZ2VkLiBUaGlzIGlzIG5lY2Vz
c2FyeQotICBiZWNhdXNlIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIG5vdCBjb21wdXRlZCB1bnRp
bCBgZ2V0YCBpcyBjYWxsZWQuCi0KLSAgQGNsYXNzIE9ic2VydmFibGUKLSAgQG5hbWVzcGFjZSBF
bWJlcgotKi8KLUVtYmVyLk9ic2VydmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotCi0gIC8q
KgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3Qu
Ci0KLSAgICBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtr
ZXlOYW1lXWAgb3IgYG9iamVjdC5rZXlOYW1lYCwKLSAgICBob3dldmVyIGl0IHN1cHBvcnRzIGJv
dGggY29tcHV0ZWQgcHJvcGVydGllcyBhbmQgdGhlIHVua25vd25Qcm9wZXJ0eQotICAgIGhhbmRs
ZXIuCi0KLSAgICBCZWNhdXNlIGBnZXRgIHVuaWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5n
IGFsbCB0aGVzZSBraW5kcwotICAgIG9mIHByb3BlcnRpZXMsIGl0IGNhbiBtYWtlIG1hbnkgcmVm
YWN0b3JpbmdzIGVhc2llciwgc3VjaCBhcyByZXBsYWNpbmcgYQotICAgIHNpbXBsZSBwcm9wZXJ0
eSB3aXRoIGEgY29tcHV0ZWQgcHJvcGVydHksIG9yIHZpY2UgdmVyc2EuCi0KLSAgICAjIyMgQ29t
cHV0ZWQgUHJvcGVydGllcwotCi0gICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgbWV0aG9kcyBk
ZWZpbmVkIHdpdGggdGhlIGBwcm9wZXJ0eWAgbW9kaWZpZXIKLSAgICBkZWNsYXJlZCBhdCB0aGUg
ZW5kLCBzdWNoIGFzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bGxOYW1lOiBmdW5jdGlv
bigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdl
dCgnbGFzdE5hbWUnKTsKLSAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQot
ICAgIGBgYAotCi0gICAgV2hlbiB5b3UgY2FsbCBgZ2V0YCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5
LCB0aGUgZnVuY3Rpb24gd2lsbCBiZQotICAgIGNhbGxlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3
aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uCi0gICAgaXRzZWxmLgotCi0g
ICAgIyMjIFVua25vd24gUHJvcGVydGllcwotCi0gICAgTGlrZXdpc2UsIGlmIHlvdSB0cnkgdG8g
Y2FsbCBgZ2V0YCBvbiBhIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzCi0gICAgYHVuZGVmaW5lZGAs
IHRoZSBgdW5rbm93blByb3BlcnR5KClgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgb2Jq
ZWN0LgotICAgIElmIHRoaXMgbWV0aG9kIHJldHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4gYHVu
ZGVmaW5lZGAsIGl0IHdpbGwgYmUgcmV0dXJuZWQKLSAgICBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5
b3UgdG8gaW1wbGVtZW50ICJ2aXJ0dWFsIiBwcm9wZXJ0aWVzIHRoYXQgYXJlCi0gICAgbm90IGRl
ZmluZWQgdXBmcm9udC4KLQotICAgIEBtZXRob2QgZ2V0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtl
eU5hbWUgVGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUg
cHJvcGVydHkgdmFsdWUgb3IgdW5kZWZpbmVkLgotICAqLwotICBnZXQ6IGZ1bmN0aW9uKGtleU5h
bWUpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAg
IFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYGdldFByb3BlcnRpZXNg
Ci0gICAgd2l0aCBhIGxpc3Qgb2Ygc3RyaW5ncyBvciBhbiBhcnJheToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICByZWNvcmQuZ2V0UHJvcGVydGllcygnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywg
J3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlw
Q29kZTogJzEwMDExJyB9Ci0gICAgYGBgCi0KLSAgICBpcyBlcXVpdmFsZW50IHRvOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHJlY29yZC5nZXRQcm9wZXJ0aWVzKFsnZmlyc3ROYW1lJywgJ2xh
c3ROYW1lJywgJ3ppcENvZGUnXSk7ICAvLyB7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTog
J0RvZScsIHppcENvZGU6ICcxMDAxMScgfQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZXRQcm9w
ZXJ0aWVzCi0gICAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQK
LSAgICBAcmV0dXJuIHtIYXNofQotICAqLwotICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHsK
LSAgICByZXR1cm4gZ2V0UHJvcGVydGllcy5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KHNsaWNl
LmNhbGwoYXJndW1lbnRzKSkpOwotICB9LAotCi0gIC8qKgotICAgIFNldHMgdGhlIHByb3ZpZGVk
IGtleSBvciBwYXRoIHRvIHRoZSB2YWx1ZS4KLQotICAgIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxs
eSB2ZXJ5IHNpbWlsYXIgdG8gY2FsbGluZyBgb2JqZWN0W2tleV0gPSB2YWx1ZWAgb3IKLSAgICBg
b2JqZWN0LmtleSA9IHZhbHVlYCwgZXhjZXB0IHRoYXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBmb3Ig
Y29tcHV0ZWQKLSAgICBwcm9wZXJ0aWVzLCB0aGUgYHNldFVua25vd25Qcm9wZXJ0eSgpYCBtZXRo
b2QgYW5kIHByb3BlcnR5IG9ic2VydmVycy4KLQotICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVz
Ci0KLSAgICBJZiB5b3UgdHJ5IHRvIHNldCBhIHZhbHVlIG9uIGEga2V5IHRoYXQgaGFzIGEgY29t
cHV0ZWQgcHJvcGVydHkgaGFuZGxlcgotICAgIGRlZmluZWQgKHNlZSB0aGUgYGdldCgpYCBtZXRo
b2QgZm9yIGFuIGV4YW1wbGUpLCB0aGVuIGBzZXQoKWAgd2lsbCBjYWxsCi0gICAgdGhhdCBtZXRo
b2QsIHBhc3NpbmcgYm90aCB0aGUgdmFsdWUgYW5kIGtleSBpbnN0ZWFkIG9mIHNpbXBseSBjaGFu
Z2luZwotICAgIHRoZSB2YWx1ZSBpdHNlbGYuIFRoaXMgaXMgdXNlZnVsIGZvciB0aG9zZSB0aW1l
cyB3aGVuIHlvdSBuZWVkIHRvCi0gICAgaW1wbGVtZW50IGEgcHJvcGVydHkgdGhhdCBpcyBjb21w
b3NlZCBvZiBvbmUgb3IgbW9yZSBtZW1iZXIKLSAgICBwcm9wZXJ0aWVzLgotCi0gICAgIyMjIFVu
a25vd24gUHJvcGVydGllcwotCi0gICAgSWYgeW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtl
eSB0aGF0IGlzIHVuZGVmaW5lZCBpbiB0aGUgdGFyZ2V0Ci0gICAgb2JqZWN0LCB0aGVuIHRoZSBg
c2V0VW5rbm93blByb3BlcnR5KClgIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZC4gVGhp
cwotICAgIGdpdmVzIHlvdSBhbiBvcHBvcnR1bml0eSB0byBpbXBsZW1lbnQgY29tcGxleCAidmly
dHVhbCIgcHJvcGVydGllcyB0aGF0Ci0gICAgYXJlIG5vdCBwcmVkZWZpbmVkIG9uIHRoZSBvYmpl
Y3QuIElmIGBzZXRVbmtub3duUHJvcGVydHkoKWAgcmV0dXJucwotICAgIHVuZGVmaW5lZCwgdGhl
biBgc2V0KClgIHdpbGwgc2ltcGx5IHNldCB0aGUgdmFsdWUgb24gdGhlIG9iamVjdC4KLQotICAg
ICMjIyBQcm9wZXJ0eSBPYnNlcnZlcnMKLQotICAgIEluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRo
ZSBwcm9wZXJ0eSwgYHNldCgpYCB3aWxsIGFsc28gcmVnaXN0ZXIgYSBwcm9wZXJ0eQotICAgIGNo
YW5nZSB3aXRoIHRoZSBvYmplY3QuIFVubGVzcyB5b3UgaGF2ZSBwbGFjZWQgdGhpcyBjYWxsIGlu
c2lkZSBvZiBhCi0gICAgYGJlZ2luUHJvcGVydHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlD
aGFuZ2VzKCksYCBhbnkgImxvY2FsIiBvYnNlcnZlcnMKLSAgICAoaS5lLiBvYnNlcnZlciBtZXRo
b2RzIGRlY2xhcmVkIG9uIHRoZSBzYW1lIG9iamVjdCksIHdpbGwgYmUgY2FsbGVkCi0gICAgaW1t
ZWRpYXRlbHkuIEFueSAicmVtb3RlIiBvYnNlcnZlcnMgKGkuZS4gb2JzZXJ2ZXIgbWV0aG9kcyBk
ZWNsYXJlZCBvbgotICAgIGFub3RoZXIgb2JqZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVl
IGFuZCBjYWxsZWQgYXQgYSBsYXRlciB0aW1lIGluIGEKLSAgICBjb2FsZXNjZWQgbWFubmVyLgot
Ci0gICAgIyMjIENoYWluaW5nCi0KLSAgICBJbiBhZGRpdGlvbiB0byBwcm9wZXJ0eSBjaGFuZ2Vz
LCBgc2V0KClgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvYmplY3QKLSAgICBpdHNlbGYgc28g
eW91IGNhbiBkbyBjaGFpbmluZyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
cmVjb3JkLnNldCgnZmlyc3ROYW1lJywgJ0NoYXJsZXMnKS5zZXQoJ2xhc3ROYW1lJywgJ0pvbGxl
eScpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXQKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5
TmFtZSBUaGUgcHJvcGVydHkgdG8gc2V0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2
YWx1ZSB0byBzZXQgb3IgYG51bGxgLgotICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9Ci0g
ICovCi0gIHNldDogZnVuY3Rpb24oa2V5TmFtZSwgdmFsdWUpIHsKLSAgICBzZXQodGhpcywga2V5
TmFtZSwgdmFsdWUpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0KLSAgLyoqCi0gICAgU2V0
cyBhIGxpc3Qgb2YgcHJvcGVydGllcyBhdCBvbmNlLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQg
aW5zaWRlCi0gICAgYSBzaW5nbGUgYGJlZ2luUHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3Bl
cnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gICAgb2JzZXJ2ZXJzIHdpbGwgYmUgYnVmZmVyZWQuCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLnNldFByb3BlcnRpZXMoeyBmaXJzdE5hbWU6
ICdDaGFybGVzJywgbGFzdE5hbWU6ICdKb2xsZXknIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBzZXRQcm9wZXJ0aWVzCi0gICAgQHBhcmFtIHtIYXNofSBoYXNoIHRoZSBoYXNoIG9mIGtleXMg
YW5kIHZhbHVlcyB0byBzZXQKLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwot
ICBzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgcmV0dXJuIEVtYmVyLnNldFBy
b3BlcnRpZXModGhpcywgaGFzaCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQmVnaW5zIGEgZ3JvdXBp
bmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KLQotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRv
IGdyb3VwIHByb3BlcnR5IGNoYW5nZXMgc28gdGhhdCBub3RpZmljYXRpb25zCi0gICAgd2lsbCBu
b3QgYmUgc2VudCB1bnRpbCB0aGUgY2hhbmdlcyBhcmUgZmluaXNoZWQuIElmIHlvdSBwbGFuIHRv
IG1ha2UgYQotICAgIGxhcmdlIG51bWJlciBvZiBjaGFuZ2VzIHRvIGFuIG9iamVjdCBhdCBvbmUg
dGltZSwgeW91IHNob3VsZCBjYWxsIHRoaXMKLSAgICBtZXRob2QgYXQgdGhlIGJlZ2lubmluZyBv
ZiB0aGUgY2hhbmdlcyB0byBiZWdpbiBkZWZlcnJpbmcgY2hhbmdlCi0gICAgbm90aWZpY2F0aW9u
cy4gV2hlbiB5b3UgYXJlIGRvbmUgbWFraW5nIGNoYW5nZXMsIGNhbGwKLSAgICBgZW5kUHJvcGVy
dHlDaGFuZ2VzKClgIHRvIGRlbGl2ZXIgdGhlIGRlZmVycmVkIGNoYW5nZSBub3RpZmljYXRpb25z
IGFuZCBlbmQKLSAgICBkZWZlcnJpbmcuCi0KLSAgICBAbWV0aG9kIGJlZ2luUHJvcGVydHlDaGFu
Z2VzCi0gICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgYmVnaW5Qcm9wZXJ0
eUNoYW5nZXM6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRW5kcyBhIGdyb3VwaW5nIG9m
IHByb3BlcnR5IGNoYW5nZXMuCi0KLSAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBncm91
cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQgbm90aWZpY2F0aW9ucwotICAgIHdpbGwgbm90IGJl
IHNlbnQgdW50aWwgdGhlIGNoYW5nZXMgYXJlIGZpbmlzaGVkLiBJZiB5b3UgcGxhbiB0byBtYWtl
IGEKLSAgICBsYXJnZSBudW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUs
IHlvdSBzaG91bGQgY2FsbAotICAgIGBiZWdpblByb3BlcnR5Q2hhbmdlcygpYCBhdCB0aGUgYmVn
aW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGRlZmVyIGNoYW5nZQotICAgIG5vdGlmaWNhdGlvbnMu
IFdoZW4geW91IGFyZSBkb25lIG1ha2luZyBjaGFuZ2VzLCBjYWxsIHRoaXMgbWV0aG9kIHRvCi0g
ICAgZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZCBkZWZl
cnJpbmcuCi0KLSAgICBAbWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcwotICAgIEByZXR1cm4ge0Vt
YmVyLk9ic2VydmFibGV9Ci0gICovCi0gIGVuZFByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24oKSB7
Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgTm90aWZ5IHRoZSBvYnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5
IGlzIGFib3V0IHRvIGNoYW5nZS4KLQotICAgIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2Ug
YSB2YWx1ZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHdpdGhvdXQKLSAgICBhY3R1YWxseSBjYWxs
aW5nIGBnZXQoKWAgb3IgYHNldCgpYCBvbiBpdC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSB0
aGlzCi0gICAgbWV0aG9kIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGlu
ZyB0aGVzZSB0d28gbWV0aG9kcwotICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZl
cnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5Ci0gICAgY2hhbmdlZCB2YWx1ZS4K
LQotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdl
YCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAotICAgIGFzIGEgcGFpci4gSWYgeW91IGRvIG5vdCwg
aXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBvdXQgb2YKLSAgICBvcmRlciBh
bmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQgbW9yZSBvZnRlbiB0aGFuIHlv
dSB3b3VsZAotICAgIGxpa2UuCi0KLSAgICBAbWV0aG9kIHByb3BlcnR5V2lsbENoYW5nZQotICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0
byBjaGFuZ2UuCi0gICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgcHJvcGVy
dHlXaWxsQ2hhbmdlOiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxs
Q2hhbmdlKHRoaXMsIGtleU5hbWUpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgot
ICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lzdGVtIHRoYXQgYSBwcm9wZXJ0eSBoYXMganVzdCBj
aGFuZ2VkLgotCi0gICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBhIHZhbHVlIGRpcmVj
dGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAotICAgIGFjdHVhbGx5IGNhbGxpbmcgYGdldCgpYCBv
ciBgc2V0KClgIG9uIGl0LiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdXNlIHRoaXMKLSAgICBtZXRo
b2QgYW5kIGBwcm9wZXJ0eVdpbGxDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28g
bWV0aG9kcwotICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUg
cHJvcGVydHkgaGFzIHBvdGVudGlhbGx5Ci0gICAgY2hhbmdlZCB2YWx1ZS4KLQotICAgIE5vdGUg
dGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3Bl
cnR5RGlkQ2hhbmdlYAotICAgIGFzIGEgcGFpci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0
aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBvdXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90
aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQgbW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAg
IGxpa2UuCi0KLSAgICBAbWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdlCi0gICAgQHBhcmFtIHtTdHJp
bmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0aGF0IGhhcyBqdXN0IGNoYW5nZWQuCi0gICAg
QHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgcHJvcGVydHlEaWRDaGFuZ2U6IGZ1
bmN0aW9uKGtleU5hbWUpIHsKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlO
YW1lKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBDb252ZW5pZW5jZSBt
ZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdl
YCBpbgotICAgIHN1Y2Nlc3Npb24uCi0KLSAgICBAbWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdl
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0byBiZSBub3Rp
ZmllZCBhYm91dC4KLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwotICBub3Rp
ZnlQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24oa2V5TmFtZSkgewotICAgIHRoaXMucHJvcGVydHlX
aWxsQ2hhbmdlKGtleU5hbWUpOwotICAgIHRoaXMucHJvcGVydHlEaWRDaGFuZ2Uoa2V5TmFtZSk7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgYWRkQmVmb3JlT2JzZXJ2ZXI6IGZ1bmN0aW9u
KGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcih0aGlz
LCBrZXksIHRhcmdldCwgbWV0aG9kKTsKLSAgfSwKLQotICAvKioKLSAgICBBZGRzIGFuIG9ic2Vy
dmVyIG9uIGEgcHJvcGVydHkuCi0KLSAgICBUaGlzIGlzIHRoZSBjb3JlIG1ldGhvZCB1c2VkIHRv
IHJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHByb3BlcnR5LgotCi0gICAgT25jZSB5b3UgY2Fs
bCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhlIGtleSdzIHZhbHVlIGlzIHNldCwgeW91ciBvYnNl
cnZlcgotICAgIHdpbGwgYmUgbm90aWZpZWQuIE5vdGUgdGhhdCB0aGUgb2JzZXJ2ZXJzIGFyZSB0
cmlnZ2VyZWQgYW55IHRpbWUgdGhlCi0gICAgdmFsdWUgaXMgc2V0LCByZWdhcmRsZXNzIG9mIHdo
ZXRoZXIgaXQgaGFzIGFjdHVhbGx5IGNoYW5nZWQuIFlvdXIKLSAgICBvYnNlcnZlciBzaG91bGQg
YmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQuCi0KLSAgICBZb3UgY2FuIGFsc28gcGFzcyBhbiBv
cHRpb25hbCBjb250ZXh0IHBhcmFtZXRlciB0byB0aGlzIG1ldGhvZC4gVGhlCi0gICAgY29udGV4
dCB3aWxsIGJlIHBhc3NlZCB0byB5b3VyIG9ic2VydmVyIG1ldGhvZCB3aGVuZXZlciBpdCBpcyB0
cmlnZ2VyZWQuCi0gICAgTm90ZSB0aGF0IGlmIHlvdSBhZGQgdGhlIHNhbWUgdGFyZ2V0L21ldGhv
ZCBwYWlyIG9uIGEga2V5IG11bHRpcGxlIHRpbWVzCi0gICAgd2l0aCBkaWZmZXJlbnQgY29udGV4
dCBwYXJhbWV0ZXJzLCB5b3VyIG9ic2VydmVyIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZQotICAg
IHdpdGggdGhlIGxhc3QgY29udGV4dCB5b3UgcGFzc2VkLgotCi0gICAgIyMjIE9ic2VydmVyIE1l
dGhvZHMKLQotICAgIE9ic2VydmVyIG1ldGhvZHMgeW91IHBhc3Mgc2hvdWxkIGdlbmVyYWxseSBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIGlmCi0gICAgeW91IGRvIG5vdCBwYXNzIGEgYGNv
bnRleHRgIHBhcmFtZXRlcjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmb29EaWRDaGFuZ2U6
IGZ1bmN0aW9uKHNlbmRlciwga2V5LCB2YWx1ZSwgcmV2KSB7IH07Ci0gICAgYGBgCi0KLSAgICBU
aGUgc2VuZGVyIGlzIHRoZSBvYmplY3QgdGhhdCBjaGFuZ2VkLiBUaGUga2V5IGlzIHRoZSBwcm9w
ZXJ0eSB0aGF0Ci0gICAgY2hhbmdlcy4gVGhlIHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSBy
ZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUgcmV2Ci0gICAgaXMgdGhlIGxhc3QgcHJvcGVydHkgcmV2
aXNpb24gb2YgdGhlIG9iamVjdCB3aGVuIGl0IGNoYW5nZWQsIHdoaWNoIHlvdSBjYW4KLSAgICB1
c2UgdG8gZGV0ZWN0IGlmIHRoZSBrZXkgdmFsdWUgaGFzIHJlYWxseSBjaGFuZ2VkIG9yIG5vdC4K
LQotICAgIElmIHlvdSBwYXNzIGEgYGNvbnRleHRgIHBhcmFtZXRlciwgdGhlIGNvbnRleHQgd2ls
bCBiZSBwYXNzZWQgYmVmb3JlIHRoZQotICAgIHJldmlzaW9uIGxpa2Ugc286Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgZm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUs
IGNvbnRleHQsIHJldikgeyB9OwotICAgIGBgYAotCi0gICAgVXN1YWxseSB5b3Ugd2lsbCBub3Qg
bmVlZCB0aGUgdmFsdWUsIGNvbnRleHQgb3IgcmV2aXNpb24gcGFyYW1ldGVycyBhdAotICAgIHRo
ZSBlbmQuIEluIHRoaXMgY2FzZSwgaXQgaXMgY29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhv
ZHMgdGhhdCB0YWtlCi0gICAgb25seSBhIHNlbmRlciBhbmQga2V5IHZhbHVlIGFzIHBhcmFtZXRl
cnMgb3IsIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbgotICAgIGFueSBvZiB0aGVzZSB2YWx1
ZXMsIHRvIHdyaXRlIGFuIG9ic2VydmVyIHRoYXQgaGFzIG5vIHBhcmFtZXRlcnMgYXQgYWxsLgot
Ci0gICAgQG1ldGhvZCBhZGRPYnNlcnZlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtl
eSB0byBvYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmpl
Y3QgdG8gaW52b2tlCi0gICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0
aG9kIHRvIGludm9rZS4KLSAgICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHNlbGYKLSAgKi8KLSAg
YWRkT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5h
ZGRPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdldCwgbWV0aG9kKTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZW1vdmUgYW4gb2JzZXJ2ZXIgeW91IGhhdmUgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIHRo
aXMgb2JqZWN0LiBQYXNzCi0gICAgdGhlIHNhbWUga2V5LCB0YXJnZXQsIGFuZCBtZXRob2QgeW91
IHBhc3NlZCB0byBgYWRkT2JzZXJ2ZXIoKWAgYW5kIHlvdXIKLSAgICB0YXJnZXQgd2lsbCBubyBs
b25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zLgotCi0gICAgQG1ldGhvZCByZW1vdmVPYnNlcnZl
cgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgotICAgIEBwYXJh
bSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCi0gICAgQHBhcmFt
IHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBAcmV0
dXJuIHtFbWJlci5PYnNlcnZhYmxlfSByZWNlaXZlcgotICAqLwotICByZW1vdmVPYnNlcnZlcjog
ZnVuY3Rpb24oa2V5LCB0YXJnZXQsIG1ldGhvZCkgewotICAgIEVtYmVyLnJlbW92ZU9ic2VydmVy
KHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2QpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMg
YHRydWVgIGlmIHRoZSBvYmplY3QgY3VycmVudGx5IGhhcyBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBm
b3IgYQotICAgIHBhcnRpY3VsYXIga2V5LiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBwb3Rl
bnRpYWxseSBkZWZlciBwZXJmb3JtaW5nCi0gICAgYW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBz
b21lb25lIGJlZ2lucyBvYnNlcnZpbmcgYSBwYXJ0aWN1bGFyIHByb3BlcnR5Ci0gICAgb24gdGhl
IG9iamVjdC4KLQotICAgIEBtZXRob2QgaGFzT2JzZXJ2ZXJGb3IKLSAgICBAcGFyYW0ge1N0cmlu
Z30ga2V5IEtleSB0byBjaGVjawotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhc09i
c2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsKLSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJz
KHRoaXMsIGtleSsnOmNoYW5nZScpOwotICB9LAotCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUg
dmFsdWUgb2YgYSBwcm9wZXJ0eSwgb3IgYSBkZWZhdWx0IHZhbHVlIGluIHRoZSBjYXNlIHRoYXQg
dGhlCi0gICAgcHJvcGVydHkgcmV0dXJucyBgdW5kZWZpbmVkYC4KLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBwZXJzb24uZ2V0V2l0aERlZmF1bHQoJ2xhc3ROYW1lJywgJ0RvZScpOwotICAgIGBg
YAotCi0gICAgQG1ldGhvZCBnZXRXaXRoRGVmYXVsdAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlO
YW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgdmFs
dWUgaXMgdW5kZWZpbmVkCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUg
b3IgdGhlIGRlZmF1bHRWYWx1ZS4KLSAgKi8KLSAgZ2V0V2l0aERlZmF1bHQ6IGZ1bmN0aW9uKGtl
eU5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBFbWJlci5nZXRXaXRoRGVmYXVsdCh0
aGlzLCBrZXlOYW1lLCBkZWZhdWx0VmFsdWUpOwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUg
dmFsdWUgb2YgYSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCB2YWx1ZSBwbHVzIHNvbWUgYW1vdW50
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHBlcnNvbi5pbmNyZW1lbnRQcm9wZXJ0eSgnYWdl
Jyk7Ci0gICAgdGVhbS5pbmNyZW1lbnRQcm9wZXJ0eSgnc2NvcmUnLCAyKTsKLSAgICBgYGAKLQot
ICAgIEBtZXRob2QgaW5jcmVtZW50UHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFt
ZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gaW5jcmVtZW50Ci0gICAgQHBhcmFtIHtOdW1i
ZXJ9IGluY3JlbWVudCBUaGUgYW1vdW50IHRvIGluY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQot
ICAgIEByZXR1cm4ge051bWJlcn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQotICAqLwotICBpbmNy
ZW1lbnRQcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSwgaW5jcmVtZW50KSB7Ci0gICAgaWYgKEVt
YmVyLmlzTm9uZShpbmNyZW1lbnQpKSB7IGluY3JlbWVudCA9IDE7IH0KLSAgICBFbWJlci5hc3Nl
cnQoIk11c3QgcGFzcyBhIG51bWVyaWMgdmFsdWUgdG8gaW5jcmVtZW50UHJvcGVydHkiLCAoIWlz
TmFOKHBhcnNlRmxvYXQoaW5jcmVtZW50KSkgJiYgaXNGaW5pdGUoaW5jcmVtZW50KSkpOwotICAg
IHNldCh0aGlzLCBrZXlOYW1lLCAoZ2V0KHRoaXMsIGtleU5hbWUpIHx8IDApICsgaW5jcmVtZW50
KTsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFNl
dCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCB2YWx1ZSBtaW51cyBzb21l
IGFtb3VudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBwbGF5ZXIuZGVjcmVtZW50UHJvcGVy
dHkoJ2xpdmVzJyk7Ci0gICAgb3JjLmRlY3JlbWVudFByb3BlcnR5KCdoZWFsdGgnLCA1KTsKLSAg
ICBgYGAKLQotICAgIEBtZXRob2QgZGVjcmVtZW50UHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmlu
Z30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGVjcmVtZW50Ci0gICAgQHBh
cmFtIHtOdW1iZXJ9IGRlY3JlbWVudCBUaGUgYW1vdW50IHRvIGRlY3JlbWVudCBieS4gRGVmYXVs
dHMgdG8gMQotICAgIEByZXR1cm4ge051bWJlcn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQotICAq
LwotICBkZWNyZW1lbnRQcm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSwgZGVjcmVtZW50KSB7Ci0g
ICAgaWYgKEVtYmVyLmlzTm9uZShkZWNyZW1lbnQpKSB7IGRlY3JlbWVudCA9IDE7IH0KLSAgICBF
bWJlci5hc3NlcnQoIk11c3QgcGFzcyBhIG51bWVyaWMgdmFsdWUgdG8gZGVjcmVtZW50UHJvcGVy
dHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoZGVjcmVtZW50KSkgJiYgaXNGaW5pdGUoZGVjcmVtZW50
KSkpOwotICAgIHNldCh0aGlzLCBrZXlOYW1lLCAoZ2V0KHRoaXMsIGtleU5hbWUpIHx8IDApIC0g
ZGVjcmVtZW50KTsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8q
KgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBib29sZWFuIHByb3BlcnR5IHRvIHRoZSBvcHBvc2l0
ZSBvZiBpdCdzCi0gICAgY3VycmVudCB2YWx1ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBz
dGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2FycERyaXZlRW5nYWdlZCcpOwotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCB0b2dnbGVQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRo
ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB0b2dnbGUKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRo
ZSBuZXcgcHJvcGVydHkgdmFsdWUKLSAgKi8KLSAgdG9nZ2xlUHJvcGVydHk6IGZ1bmN0aW9uKGtl
eU5hbWUpIHsKLSAgICBzZXQodGhpcywga2V5TmFtZSwgIWdldCh0aGlzLCBrZXlOYW1lKSk7Ci0g
ICAgcmV0dXJuIGdldCh0aGlzLCBrZXlOYW1lKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5z
IHRoZSBjYWNoZWQgdmFsdWUgb2YgYSBjb21wdXRlZCBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLgot
ICAgIFRoaXMgYWxsb3dzIHlvdSB0byBpbnNwZWN0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHBy
b3BlcnR5Ci0gICAgd2l0aG91dCBhY2NpZGVudGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50
ZW5kZWQgdG8gYmUKLSAgICBnZW5lcmF0ZWQgbGF6aWx5LgotCi0gICAgQG1ldGhvZCBjYWNoZUZv
cgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUg
Y2FjaGVkIHZhbHVlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSwgaWYgYW55Ci0gICovCi0gIGNh
Y2hlRm9yOiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmNhY2hlRm9yKHRo
aXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8vIGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9z
ZXMKLSAgb2JzZXJ2ZXJzRm9yS2V5OiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgcmV0dXJuIEVt
YmVyLm9ic2VydmVyc0Zvcih0aGlzLCBrZXlOYW1lKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVy
LXJ1bnRpbWUKLSovCi0KLQotLy8gTk9URTogdGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIGJlIGlu
Y2x1ZGVkIGRpcmVjdGx5LiBJbnN0ZWFkIHVzZSBgRW1iZXIuT2JqZWN0YC4KLS8vIFdlIG9ubHkg
ZGVmaW5lIHRoaXMgc2VwYXJhdGVseSBzbyB0aGF0IGBFbWJlci5TZXRgIGNhbiBkZXBlbmQgb24g
aXQuCi0KLQotdmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIG9fY3Jl
YXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG9fZGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9y
bS5kZWZpbmVQcm9wZXJ0eSwKLSAgICBHVUlEX0tFWSA9IEVtYmVyLkdVSURfS0VZLAotICAgIGd1
aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAgIGdlbmVyYXRlR3VpZCA9IEVtYmVyLmdlbmVyYXRl
R3VpZCwKLSAgICBtZXRhID0gRW1iZXIubWV0YSwKLSAgICByZXdhdGNoID0gRW1iZXIucmV3YXRj
aCwKLSAgICBmaW5pc2hDaGFpbnMgPSBFbWJlci5maW5pc2hDaGFpbnMsCi0gICAgc2VuZEV2ZW50
ID0gRW1iZXIuc2VuZEV2ZW50LAotICAgIGRlc3Ryb3kgPSBFbWJlci5kZXN0cm95LAotICAgIHNj
aGVkdWxlID0gRW1iZXIucnVuLnNjaGVkdWxlLAotICAgIE1peGluID0gRW1iZXIuTWl4aW4sCi0g
ICAgYXBwbHlNaXhpbiA9IE1peGluLl9hcHBseSwKLSAgICBmaW5pc2hQYXJ0aWFsID0gTWl4aW4u
ZmluaXNoUGFydGlhbCwKLSAgICByZW9wZW4gPSBNaXhpbi5wcm90b3R5cGUucmVvcGVuLAotICAg
IE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUiwKLSAgICBpbmRl
eE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLXZhciB1bmRlZmluZWREZXNj
cmlwdG9yID0gewotICBjb25maWd1cmFibGU6IHRydWUsCi0gIHdyaXRhYmxlOiB0cnVlLAotICBl
bnVtZXJhYmxlOiBmYWxzZSwKLSAgdmFsdWU6IHVuZGVmaW5lZAotfTsKLQotZnVuY3Rpb24gbWFr
ZUN0b3IoKSB7Ci0KLSAgLy8gTm90ZTogYXZvaWQgYWNjZXNzaW5nIGFueSBwcm9wZXJ0aWVzIG9u
IHRoZSBvYmplY3Qgc2luY2UgaXQgbWFrZXMgdGhlCi0gIC8vIG1ldGhvZCBhIGxvdCBmYXN0ZXIu
IFRoaXMgaXMgZ2x1ZSBjb2RlIHNvIHdlIHdhbnQgaXQgdG8gYmUgYXMgZmFzdCBhcwotICAvLyBw
b3NzaWJsZS4KLQotICB2YXIgd2FzQXBwbGllZCA9IGZhbHNlLCBpbml0TWl4aW5zLCBpbml0UHJv
cGVydGllczsKLQotICB2YXIgQ2xhc3MgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXdhc0FwcGxp
ZWQpIHsKLSAgICAgIENsYXNzLnByb3RvKCk7IC8vIHByZXBhcmUgcHJvdG90eXBlLi4uCi0gICAg
fQotICAgIG9fZGVmaW5lUHJvcGVydHkodGhpcywgR1VJRF9LRVksIHVuZGVmaW5lZERlc2NyaXB0
b3IpOwotICAgIG9fZGVmaW5lUHJvcGVydHkodGhpcywgJ19zdXBlcicsIHVuZGVmaW5lZERlc2Ny
aXB0b3IpOwotICAgIHZhciBtID0gbWV0YSh0aGlzKSwgcHJvdG8gPSBtLnByb3RvOwotICAgIG0u
cHJvdG8gPSB0aGlzOwotICAgIGlmIChpbml0TWl4aW5zKSB7Ci0gICAgICAvLyBjYXB0dXJlIGxv
Y2FsbHkgc28gd2UgY2FuIGNsZWFyIHRoZSBjbG9zZWQgb3ZlciB2YXJpYWJsZQotICAgICAgdmFy
IG1peGlucyA9IGluaXRNaXhpbnM7Ci0gICAgICBpbml0TWl4aW5zID0gbnVsbDsKLSAgICAgIHRo
aXMucmVvcGVuLmFwcGx5KHRoaXMsIG1peGlucyk7Ci0gICAgfQotICAgIGlmIChpbml0UHJvcGVy
dGllcykgewotICAgICAgLy8gY2FwdHVyZSBsb2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUgY2xv
c2VkIG92ZXIgdmFyaWFibGUKLSAgICAgIHZhciBwcm9wcyA9IGluaXRQcm9wZXJ0aWVzOwotICAg
ICAgaW5pdFByb3BlcnRpZXMgPSBudWxsOwotCi0gICAgICB2YXIgY29uY2F0ZW5hdGVkUHJvcGVy
dGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllczsKLQotICAgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgdmFyIHByb3BlcnRp
ZXMgPSBwcm9wc1tpXTsKLQotICAgICAgICBFbWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVh
dGUgbm8gbG9uZ2VyIHN1cHBvcnRzIG1peGluZyBpbiBvdGhlciBkZWZpbml0aW9ucywgdXNlIGNy
ZWF0ZVdpdGhNaXhpbnMgaW5zdGVhZC4iLCAhKHByb3BlcnRpZXMgaW5zdGFuY2VvZiBFbWJlci5N
aXhpbikpOwotCi0gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPT0gJ29iamVjdCcgJiYg
cHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKCJFbWJlci5PYmplY3QuY3JlYXRlIG9ubHkgYWNjZXB0cyBvYmplY3RzLiIpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAg
dmFyIGtleU5hbWVzID0gRW1iZXIua2V5cyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICBmb3IgKHZh
ciBqID0gMCwgbGwgPSBrZXlOYW1lcy5sZW5ndGg7IGogPCBsbDsgaisrKSB7Ci0gICAgICAgICAg
dmFyIGtleU5hbWUgPSBrZXlOYW1lc1tqXTsKLSAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFz
T3duUHJvcGVydHkoa2V5TmFtZSkpIHsgY29udGludWU7IH0KLQotICAgICAgICAgIHZhciB2YWx1
ZSA9IHByb3BlcnRpZXNba2V5TmFtZV0sCi0gICAgICAgICAgICAgIElTX0JJTkRJTkcgPSBFbWJl
ci5JU19CSU5ESU5HOwotCi0gICAgICAgICAgaWYgKElTX0JJTkRJTkcudGVzdChrZXlOYW1lKSkg
ewotICAgICAgICAgICAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsKLSAgICAgICAgICAgIGlm
ICghYmluZGluZ3MpIHsKLSAgICAgICAgICAgICAgYmluZGluZ3MgPSBtLmJpbmRpbmdzID0ge307
Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7
Ci0gICAgICAgICAgICAgIGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGlu
Z3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGluZ3Nba2V5TmFtZV0gPSB2YWx1
ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB2YXIgZGVzYyA9IG0uZGVzY3Nba2V5TmFtZV07
Ci0KLSAgICAgICAgICBFbWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2Vy
IHN1cHBvcnRzIGRlZmluaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMuIiwgISh2YWx1ZSBpbnN0YW5j
ZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkpKTsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoIkVt
YmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIGRlZmluaW5nIG1ldGhvZHMgdGhh
dCBjYWxsIF9zdXBlci4iLCAhKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS50
b1N0cmluZygpLmluZGV4T2YoJy5fc3VwZXInKSAhPT0gLTEpKTsKLSAgICAgICAgICBFbWJlci5h
c3NlcnQoImBhY3Rpb25zYCBtdXN0IGJlIHByb3ZpZGVkIGF0IGV4dGVuZCB0aW1lLCBub3QgYXQg
Y3JlYXRlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAidGltZSwgd2hlbiBFbWJlci5BY3Rp
b25IYW5kbGVyIGlzIHVzZWQgKGkuZS4gdmlld3MsICIgKwotICAgICAgICAgICAgICAgICAgICAg
ICAiY29udHJvbGxlcnMgJiByb3V0ZXMpLiIsICEoKGtleU5hbWUgPT09ICdhY3Rpb25zJykgJiYg
RW1iZXIuQWN0aW9uSGFuZGxlci5kZXRlY3QodGhpcykpKTsKLQotICAgICAgICAgIGlmIChjb25j
YXRlbmF0ZWRQcm9wZXJ0aWVzICYmIGluZGV4T2YoY29uY2F0ZW5hdGVkUHJvcGVydGllcywga2V5
TmFtZSkgPj0gMCkgewotICAgICAgICAgICAgdmFyIGJhc2VWYWx1ZSA9IHRoaXNba2V5TmFtZV07
Ci0KLSAgICAgICAgICAgIGlmIChiYXNlVmFsdWUpIHsKLSAgICAgICAgICAgICAgaWYgKCdmdW5j
dGlvbicgPT09IHR5cGVvZiBiYXNlVmFsdWUuY29uY2F0KSB7Ci0gICAgICAgICAgICAgICAgdmFs
dWUgPSBiYXNlVmFsdWUuY29uY2F0KHZhbHVlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICB2YWx1ZSA9IEVtYmVyLm1ha2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2
YWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgIHZhbHVlID0gRW1iZXIubWFrZUFycmF5KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICB9Ci0KLSAgICAgICAgICBpZiAoZGVzYykgewotICAgICAgICAgICAgZGVzYy5zZXQodGhp
cywga2V5TmFtZSwgdmFsdWUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAo
dHlwZW9mIHRoaXMuc2V0VW5rbm93blByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmICEoa2V5TmFt
ZSBpbiB0aGlzKSkgewotICAgICAgICAgICAgICB0aGlzLnNldFVua25vd25Qcm9wZXJ0eShrZXlO
YW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsK
LSAgICAgICAgICAgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkodGhpcywga2V5TmFtZSwgbnVsbCwg
dmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkgc2V0dGVyCi0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICB0aGlzW2tleU5hbWVdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmlzaFBhcnRpYWwodGhp
cywgbSk7Ci0gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgbS5wcm90
byA9IHByb3RvOwotICAgIGZpbmlzaENoYWlucyh0aGlzKTsKLSAgICBzZW5kRXZlbnQodGhpcywg
ImluaXQiKTsKLSAgfTsKLQotICBDbGFzcy50b1N0cmluZyA9IE1peGluLnByb3RvdHlwZS50b1N0
cmluZzsKLSAgQ2xhc3Mud2lsbFJlb3BlbiA9IGZ1bmN0aW9uKCkgewotICAgIGlmICh3YXNBcHBs
aWVkKSB7Ci0gICAgICBDbGFzcy5Qcm90b3R5cGVNaXhpbiA9IE1peGluLmNyZWF0ZShDbGFzcy5Q
cm90b3R5cGVNaXhpbik7Ci0gICAgfQotCi0gICAgd2FzQXBwbGllZCA9IGZhbHNlOwotICB9Owot
ICBDbGFzcy5faW5pdE1peGlucyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdE1peGlucyA9IGFyZ3M7
IH07Ci0gIENsYXNzLl9pbml0UHJvcGVydGllcyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdFByb3Bl
cnRpZXMgPSBhcmdzOyB9OwotCi0gIENsYXNzLnByb3RvID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IHN1cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNsYXNzOwotICAgIGlmIChzdXBlcmNsYXNzKSB7IHN1
cGVyY2xhc3MucHJvdG8oKTsgfQotCi0gICAgaWYgKCF3YXNBcHBsaWVkKSB7Ci0gICAgICB3YXNB
cHBsaWVkID0gdHJ1ZTsKLSAgICAgIENsYXNzLlByb3RvdHlwZU1peGluLmFwcGx5UGFydGlhbChD
bGFzcy5wcm90b3R5cGUpOwotICAgICAgcmV3YXRjaChDbGFzcy5wcm90b3R5cGUpOwotICAgIH0K
LQotICAgIHJldHVybiB0aGlzLnByb3RvdHlwZTsKLSAgfTsKLQotICByZXR1cm4gQ2xhc3M7Ci0K
LX0KLQotLyoqCi0gIEBjbGFzcyBDb3JlT2JqZWN0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi12
YXIgQ29yZU9iamVjdCA9IG1ha2VDdG9yKCk7Ci1Db3JlT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rp
b24oKSB7IHJldHVybiAiRW1iZXIuQ29yZU9iamVjdCI7IH07Ci0KLUNvcmVPYmplY3QuUHJvdG90
eXBlTWl4aW4gPSBNaXhpbi5jcmVhdGUoewotICByZW9wZW46IGZ1bmN0aW9uKCkgewotICAgIGFw
cGx5TWl4aW4odGhpcywgYXJndW1lbnRzLCB0cnVlKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwK
LQotICAvKioKLSAgICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVkIHdoZW4gb2JqZWN0cyBh
cmUgaW5zdGFudGlhdGVkLiBCeSBkZWZhdWx0LAotICAgIGRvZXMgbm90aGluZyB1bmxlc3MgaXQg
aXMgb3ZlcnJpZGRlbiBkdXJpbmcgY2xhc3MgZGVmaW5pdGlvbi4KLQotICAgIEV4YW1wbGU6Ci0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewotICAgICAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGFsZXJ0KCdOYW1lIGlzICcgKyB0
aGlzLmdldCgnbmFtZScpKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHZhciBzdGV2ZSA9IEFw
cC5QZXJzb24uY3JlYXRlKHsKLSAgICAgIG5hbWU6ICJTdGV2ZSIKLSAgICB9KTsKLQotICAgIC8v
IGFsZXJ0cyAnTmFtZSBpcyBTdGV2ZScuCi0gICAgYGBgCi0KLSAgICBOT1RFOiBJZiB5b3UgZG8g
b3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1ld29yayBjbGFzcyBsaWtlIGBFbWJlci5WaWV3YCBv
cgotICAgIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgLCBiZSBzdXJlIHRvIGNhbGwgYHRoaXMuX3N1
cGVyKClgIGluIHlvdXIKLSAgICBgaW5pdGAgZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1i
ZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvCi0gICAgZG8gaW1wb3J0YW50IHNldHVw
IHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFuZ2UgYmVoYXZpb3IgaW4geW91cgotICAgIGFwcGxp
Y2F0aW9uLgotCi0gICAgQG1ldGhvZCBpbml0Ci0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkge30s
Ci0KLSAgLyoqCi0gICAgRGVmaW5lcyB0aGUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29uY2F0
ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MKLSAgICAoaW5zdGVhZCBvZiBvdmVycmlkZGVuKS4K
LQotICAgIEJ5IGRlZmF1bHQsIHdoZW4geW91IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3Bl
cnR5IGRlZmluZWQgaW4KLSAgICB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIGEgcHJvcGVydHkgd2l0
aCB0aGUgc2FtZSBuYW1lIHRoYXQgaXMgZGVmaW5lZAotICAgIGluIHRoZSBzdXBlcmNsYXNzLiBI
b3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVmZXJhYmxlCi0gICAg
dG8gYnVpbGQgdXAgYSBwcm9wZXJ0eSdzIHZhbHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFz
cycgcHJvcGVydHkKLSAgICB2YWx1ZSB3aXRoIHRoZSBzdWJjbGFzcycgdmFsdWUuIEFuIGV4YW1w
bGUgb2YgdGhpcyBpbiB1c2Ugd2l0aGluIEVtYmVyCi0gICAgaXMgdGhlIGBjbGFzc05hbWVzYCBw
cm9wZXJ0eSBvZiBgRW1iZXIuVmlld2AuCi0KLSAgICBIZXJlIGlzIHNvbWUgc2FtcGxlIGNvZGUg
c2hvd2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29uY2F0ZW5hdGVkCi0gICAgcHJvcGVy
dHkgYW5kIGEgbm9ybWFsIG9uZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmFyVmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0
eTogWydiYXInXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnYmFyJ10KLSAgICB9KTsKLQotICAgIEFw
cC5Gb29CYXJWaWV3ID0gQXBwLkJhclZpZXcuZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRl
bmF0ZWRQcm9wZXJ0eTogWydmb28nXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCi0gICAg
fSk7Ci0KLSAgICB2YXIgZm9vQmFyVmlldyA9IEFwcC5Gb29CYXJWaWV3LmNyZWF0ZSgpOwotICAg
IGZvb0JhclZpZXcuZ2V0KCdzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydmb28n
XQotICAgIGZvb0JhclZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdi
YXInLCAnZm9vJ10KLSAgICBgYGAKLQotICAgIFRoaXMgYmVoYXZpb3IgZXh0ZW5kcyB0byBvYmpl
Y3QgY3JlYXRpb24gYXMgd2VsbC4gQ29udGludWluZyB0aGUKLSAgICBhYm92ZSBleGFtcGxlOgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRl
KHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydiYXonXSwKLSAgICAgIGNs
YXNzTmFtZXM6IFsnYmF6J10KLSAgICB9KQotICAgIHZpZXcuZ2V0KCdzb21lTm9uQ29uY2F0ZW5h
dGVkUHJvcGVydHknKTsgLy8gWydiYXonXQotICAgIHZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7IC8v
IFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJywgJ2JheiddCi0gICAgYGBgCi0gICAgQWRkaW5n
IGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgaXMgbm90IGFuIGFycmF5IHdpbGwganVzdCBhZGQgaXQg
aW4gdGhlIGFycmF5OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciB2aWV3ID0gQXBwLkZv
b0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIGNsYXNzTmFtZXM6ICdiYXonCi0gICAgfSkKLSAgICB2
aWV3LmdldCgnY2xhc3NOYW1lcycpOyAvLyBbJ2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbycsICdi
YXonXQotICAgIGBgYAotCi0gICAgVXNpbmcgdGhlIGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBw
cm9wZXJ0eSwgd2UgY2FuIHRlbGwgdG8gRW1iZXIgdGhhdCBtaXgKLSAgICB0aGUgY29udGVudCBv
ZiB0aGUgcHJvcGVydGllcy4KLQotICAgIEluIGBFbWJlci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJp
bmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0aWVzCi0gICAgYXJlIGFsc28g
Y29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlvbiB0byBgY2xhc3NOYW1lc2AuCi0KLSAgICBUaGlzIGZl
YXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3UgdG8gdXNlIHRocm91Z2hvdXQgdGhlIEVtYmVyIG9i
amVjdCBtb2RlbCwKLSAgICBhbHRob3VnaCB0eXBpY2FsIGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtl
bHkgdG8gdXNlIGl0IGluZnJlcXVlbnRseS4gU2luY2UKLSAgICBpdCBjaGFuZ2VzIGV4cGVjdGF0
aW9ucyBhYm91dCBiZWhhdmlvciBvZiBwcm9wZXJ0aWVzLCB5b3Ugc2hvdWxkIHByb3Blcmx5Ci0g
ICAgZG9jdW1lbnQgaXRzIHVzYWdlIGluIGVhY2ggaW5kaXZpZHVhbCBjb25jYXRlbmF0ZWQgcHJv
cGVydHkgKHRvIG5vdAotICAgIG1pc2xlYWQgeW91ciB1c2VycyB0byB0aGluayB0aGV5IGNhbiBv
dmVycmlkZSB0aGUgcHJvcGVydHkgaW4gYSBzdWJjbGFzcykuCi0KLSAgICBAcHJvcGVydHkgY29u
Y2F0ZW5hdGVkUHJvcGVydGllcwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgbnVsbAot
ICAqLwotICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBudWxsLAotCi0gIC8qKgotICAgIERlc3Ry
b3llZCBvYmplY3QgcHJvcGVydHkgZmxhZy4KLQotICAgIGlmIHRoaXMgcHJvcGVydHkgaXMgYHRy
dWVgIHRoZSBvYnNlcnZlcnMgYW5kIGJpbmRpbmdzIHdlcmUgYWxyZWFkeQotICAgIHJlbW92ZWQg
YnkgdGhlIGVmZmVjdCBvZiBjYWxsaW5nIHRoZSBgZGVzdHJveSgpYCBtZXRob2QuCi0KLSAgICBA
cHJvcGVydHkgaXNEZXN0cm95ZWQKLSAgICBAZGVmYXVsdCBmYWxzZQotICAqLwotICBpc0Rlc3Ry
b3llZDogZmFsc2UsCi0KLSAgLyoqCi0gICAgRGVzdHJ1Y3Rpb24gc2NoZWR1bGVkIGZsYWcuIFRo
ZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotCi0gICAgVGhlIG9iamVjdCBz
dGF5cyBpbnRhY3QgdW50aWwgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AgYXQgd2hpY2ggcG9pbnQK
LSAgICB0aGUgYGlzRGVzdHJveWVkYCBmbGFnIGlzIHNldC4KLQotICAgIEBwcm9wZXJ0eSBpc0Rl
c3Ryb3lpbmcKLSAgICBAZGVmYXVsdCBmYWxzZQotICAqLwotICBpc0Rlc3Ryb3lpbmc6IGZhbHNl
LAotCi0gIC8qKgotICAgIERlc3Ryb3lzIGFuIG9iamVjdCBieSBzZXR0aW5nIHRoZSBgaXNEZXN0
cm95ZWRgIGZsYWcgYW5kIHJlbW92aW5nIGl0cwotICAgIG1ldGFkYXRhLCB3aGljaCBlZmZlY3Rp
dmVseSBkZXN0cm95cyBvYnNlcnZlcnMgYW5kIGJpbmRpbmdzLgotCi0gICAgSWYgeW91IHRyeSB0
byBzZXQgYSBwcm9wZXJ0eSBvbiBhIGRlc3Ryb3llZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiB3aWxs
IGJlCi0gICAgcmFpc2VkLgotCi0gICAgTm90ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxl
ZCBmb3IgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AgYW5kIGRvZXMgbm90Ci0gICAgaGFwcGVuIGlt
bWVkaWF0ZWx5LiAgSXQgd2lsbCBzZXQgYW4gaXNEZXN0cm95aW5nIGZsYWcgaW1tZWRpYXRlbHku
Ci0KLSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHJlY2Vp
dmVyCi0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJv
eWluZykgeyByZXR1cm47IH0KLSAgICB0aGlzLmlzRGVzdHJveWluZyA9IHRydWU7Ci0KLSAgICBz
Y2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMud2lsbERlc3Ryb3kpOwotICAgIHNjaGVkdWxl
KCdkZXN0cm95JywgdGhpcywgdGhpcy5fc2NoZWR1bGVkRGVzdHJveSk7Ci0gICAgcmV0dXJuIHRo
aXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT3ZlcnJpZGUgdG8gaW1wbGVtZW50IHRlYXJkb3duLgot
Ci0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAgKi8KLSAgd2lsbERlc3Ryb3k6IEVtYmVyLkss
Ci0KLSAgLyoqCi0gICAgSW52b2tlZCBieSB0aGUgcnVuIGxvb3AgdG8gYWN0dWFsbHkgZGVzdHJv
eSB0aGUgb2JqZWN0LiBUaGlzIGlzCi0gICAgc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYnkgdGhl
IGBkZXN0cm95YCBtZXRob2QuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX3NjaGVkdWxl
ZERlc3Ryb3kKLSAgKi8KLSAgX3NjaGVkdWxlZERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIGlm
ICh0aGlzLmlzRGVzdHJveWVkKSB7IHJldHVybjsgfQotICAgIGRlc3Ryb3kodGhpcyk7Ci0gICAg
dGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7Ci0gIH0sCi0KLSAgYmluZDogZnVuY3Rpb24odG8sIGZy
b20pIHsKLSAgICBpZiAoIShmcm9tIGluc3RhbmNlb2YgRW1iZXIuQmluZGluZykpIHsgZnJvbSA9
IEVtYmVyLkJpbmRpbmcuZnJvbShmcm9tKTsgfQotICAgIGZyb20udG8odG8pLmNvbm5lY3QodGhp
cyk7Ci0gICAgcmV0dXJuIGZyb207Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIHN0cmlu
ZyByZXByZXNlbnRhdGlvbiB3aGljaCBhdHRlbXB0cyB0byBwcm92aWRlIG1vcmUgaW5mb3JtYXRp
b24KLSAgICB0aGFuIEphdmFzY3JpcHQncyBgdG9TdHJpbmdgIHR5cGljYWxseSBkb2VzLCBpbiBh
IGdlbmVyaWMgd2F5IGZvciBhbGwgRW1iZXIKLSAgICBvYmplY3RzLgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5QZXJzb24gPSBFbS5PYmplY3QuZXh0ZW5kKCkKLSAgICBwZXJzb24gPSBB
cHAuUGVyc29uLmNyZWF0ZSgpCi0gICAgcGVyc29uLnRvU3RyaW5nKCkgLy89PiAiPEFwcC5QZXJz
b246ZW1iZXIxMDI0PiIKLSAgICBgYGAKLQotICAgIElmIHRoZSBvYmplY3QncyBjbGFzcyBpcyBu
b3QgZGVmaW5lZCBvbiBhbiBFbWJlciBuYW1lc3BhY2UsIGl0IHdpbGwKLSAgICBpbmRpY2F0ZSBp
dCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdpc3RlcmVkIHN1cGVyY2xhc3M6Ci0KLSAgIGBgYGph
dmFzY3JpcHQKLSAgICBTdHVkZW50ID0gQXBwLlBlcnNvbi5leHRlbmQoKQotICAgIHN0dWRlbnQg
PSBTdHVkZW50LmNyZWF0ZSgpCi0gICAgc3R1ZGVudC50b1N0cmluZygpIC8vPT4gIjwoc3ViY2xh
c3Mgb2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1PiIKLSAgICBgYGAKLQotICAgIElmIHRoZSBtZXRo
b2QgYHRvU3RyaW5nRXh0ZW5zaW9uYCBpcyBkZWZpbmVkLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwg
YmUKLSAgICBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5leHRlbmQoewotICAgICAgdG9TdHJpbmdFeHRlbnNp
b246IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2Z1bGxOYW1lJyk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gICAgdGVhY2hlciA9IEFwcC5UZWFjaGVyLmNyZWF0ZSgpCi0gICAg
dGVhY2hlci50b1N0cmluZygpOyAvLz0+ICI8QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxl
PiIKLSAgICBgYGAKLQotICAgIEBtZXRob2QgdG9TdHJpbmcKLSAgICBAcmV0dXJuIHtTdHJpbmd9
IHN0cmluZyByZXByZXNlbnRhdGlvbgotICAqLwotICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJp
bmcoKSB7Ci0gICAgdmFyIGhhc1RvU3RyaW5nRXh0ZW5zaW9uID0gdHlwZW9mIHRoaXMudG9TdHJp
bmdFeHRlbnNpb24gPT09ICdmdW5jdGlvbicsCi0gICAgICAgIGV4dGVuc2lvbiA9IGhhc1RvU3Ry
aW5nRXh0ZW5zaW9uID8gIjoiICsgdGhpcy50b1N0cmluZ0V4dGVuc2lvbigpIDogJyc7Ci0gICAg
dmFyIHJldCA9ICc8Jyt0aGlzLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkrJzonK2d1aWRGb3IodGhp
cykrZXh0ZW5zaW9uKyc+JzsKLSAgICB0aGlzLnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7
Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfSk7Ci0KLUNvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4u
b3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmplY3Q7Ci0KLWZ1bmN0aW9uIG1ha2VUb1N0cmluZyhy
ZXQpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmV0OyB9OwotfQotCi1pZiAoRW1i
ZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBlTWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJy
aWRlUHJvdG90eXBlTWl4aW4oQ29yZU9iamVjdC5Qcm90b3R5cGVNaXhpbik7Ci19Ci0KLUNvcmVP
YmplY3QuX19zdXBlcl9fID0gbnVsbDsKLQotdmFyIENsYXNzTWl4aW4gPSBNaXhpbi5jcmVhdGUo
ewotCi0gIENsYXNzTWl4aW46IEVtYmVyLnJlcXVpcmVkKCksCi0KLSAgUHJvdG90eXBlTWl4aW46
IEVtYmVyLnJlcXVpcmVkKCksCi0KLSAgaXNDbGFzczogdHJ1ZSwKLQotICBpc01ldGhvZDogZmFs
c2UsCi0KLSAgLyoqCi0gICAgQ3JlYXRlcyBhIG5ldyBzdWJjbGFzcy4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBzYXk6
IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgICAgIGFsZXJ0KHRoaW5nKTsKLSAgICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGRlZmluZXMgYSBuZXcgc3ViY2xhc3Mgb2YgRW1iZXIu
T2JqZWN0OiBgQXBwLlBlcnNvbmAuIEl0IGNvbnRhaW5zIG9uZSBtZXRob2Q6IGBzYXkoKWAuCi0K
LSAgICBZb3UgY2FuIGFsc28gY3JlYXRlIGEgc3ViY2xhc3MgZnJvbSBhbnkgZXhpc3RpbmcgY2xh
c3MgYnkgY2FsbGluZyBpdHMgYGV4dGVuZCgpYCAgbWV0aG9kLiBGb3IgZXhhbXBsZSwgeW91IG1p
Z2h0IHdhbnQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgRW1iZXIncyBidWlsdC1pbiBgRW1iZXIu
Vmlld2AgY2xhc3M6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvblZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0YWdOYW1lOiAnbGknLAotICAgICAgY2xhc3NOYW1l
QmluZGluZ3M6IFsnaXNBZG1pbmlzdHJhdG9yJ10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFdo
ZW4gZGVmaW5pbmcgYSBzdWJjbGFzcywgeW91IGNhbiBvdmVycmlkZSBtZXRob2RzIGJ1dCBzdGls
bCBhY2Nlc3MgdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgcGFyZW50IGNsYXNzIGJ5IGNhbGxp
bmcgdGhlIHNwZWNpYWwgYF9zdXBlcigpYCBtZXRob2Q6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgc2F5OiBmdW5jdGlv
bih0aGluZykgewotICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7Ci0gICAgICAg
IGFsZXJ0KG5hbWUgKyAnIHNheXM6ICcgKyB0aGluZyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAg
ICBBcHAuU29sZGllciA9IEFwcC5QZXJzb24uZXh0ZW5kKHsKLSAgICAgIHNheTogZnVuY3Rpb24o
dGhpbmcpIHsKLSAgICAgICAgdGhpcy5fc3VwZXIodGhpbmcgKyAiLCBzaXIhIik7Ci0gICAgICB9
LAotICAgICAgbWFyY2g6IGZ1bmN0aW9uKG51bWJlck9mSG91cnMpIHsKLSAgICAgICAgYWxlcnQo
dGhpcy5nZXQoJ25hbWUnKSArICcgbWFyY2hlcyBmb3IgJyArIG51bWJlck9mSG91cnMgKyAnIGhv
dXJzLicpCi0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB2YXIgeWVodWRhID0gQXBwLlNvbGRpZXIu
Y3JlYXRlKHsKLSAgICAgIG5hbWU6ICJZZWh1ZGEgS2F0eiIKLSAgICB9KTsKLQotICAgIHllaHVk
YS5zYXkoIlllcyIpOyAgLy8gYWxlcnRzICJZZWh1ZGEgS2F0eiBzYXlzOiBZZXMsIHNpciEiCi0g
ICAgYGBgCi0KLSAgICBUaGUgYGNyZWF0ZSgpYCBvbiBsaW5lICMxNyBjcmVhdGVzIGFuICppbnN0
YW5jZSogb2YgdGhlIGBBcHAuU29sZGllcmAgY2xhc3MuIFRoZSBgZXh0ZW5kKClgIG9uIGxpbmUg
IzggY3JlYXRlcyBhICpzdWJjbGFzcyogb2YgYEFwcC5QZXJzb25gLiBBbnkgaW5zdGFuY2Ugb2Yg
dGhlIGBBcHAuUGVyc29uYCBjbGFzcyB3aWxsICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRo
b2QuCi0KLSAgICBZb3UgY2FuIGFsc28gcGFzcyBgRW1iZXIuTWl4aW5gIGNsYXNzZXMgdG8gYWRk
IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0aGUgc3ViY2xhc3MuCi0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgc2F5OiBm
dW5jdGlvbih0aGluZykgewotICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBzYXlz
OiAnICsgdGhpbmcpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQXBwLlNpbmdpbmdNaXhpbiA9
IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAgICBzaW5nOiBmdW5jdGlvbih0aGluZyl7Ci0gICAg
ICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykgKyAnIHNpbmdzOiBsYSBsYSBsYSAnICsgdGhpbmcp
OwotICAgICAgfQotICAgIH0pOwotCi0gICAgQXBwLkJyb2Fkd2F5U3RhciA9IEFwcC5QZXJzb24u
ZXh0ZW5kKEFwcC5TaW5naW5nTWl4aW4sIHsKLSAgICAgIGRhbmNlOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgZGFuY2VzOiB0YXAgdGFwIHRhcCB0YXAg
Jyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgYEFwcC5Ccm9hZHdheVN0
YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1ldGhvZHM6IGBzYXkoKWAsIGBzaW5nKClgLCBhbmQg
YGRhbmNlKClgLgotCi0gICAgQG1ldGhvZCBleHRlbmQKLSAgICBAc3RhdGljCi0KLSAgICBAcGFy
YW0ge0VtYmVyLk1peGlufSBbbWl4aW5zXSogT25lIG9yIG1vcmUgRW1iZXIuTWl4aW4gY2xhc3Nl
cwotICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzXSogT2JqZWN0IGNvbnRhaW5pbmcgdmFs
dWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBjbGFzcwotICAqLwotICBleHRlbmQ6IGZ1bmN0aW9u
KCkgewotICAgIHZhciBDbGFzcyA9IG1ha2VDdG9yKCksIHByb3RvOwotICAgIENsYXNzLkNsYXNz
TWl4aW4gPSBNaXhpbi5jcmVhdGUodGhpcy5DbGFzc01peGluKTsKLSAgICBDbGFzcy5Qcm90b3R5
cGVNaXhpbiA9IE1peGluLmNyZWF0ZSh0aGlzLlByb3RvdHlwZU1peGluKTsKLQotICAgIENsYXNz
LkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENsYXNzOwotICAgIENsYXNzLlByb3RvdHlw
ZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBDbGFzczsKLQotICAgIHJlb3Blbi5hcHBseShDbGFz
cy5Qcm90b3R5cGVNaXhpbiwgYXJndW1lbnRzKTsKLQotICAgIENsYXNzLnN1cGVyY2xhc3MgPSB0
aGlzOwotICAgIENsYXNzLl9fc3VwZXJfXyAgPSB0aGlzLnByb3RvdHlwZTsKLQotICAgIHByb3Rv
ID0gQ2xhc3MucHJvdG90eXBlID0gb19jcmVhdGUodGhpcy5wcm90b3R5cGUpOwotICAgIHByb3Rv
LmNvbnN0cnVjdG9yID0gQ2xhc3M7Ci0gICAgZ2VuZXJhdGVHdWlkKHByb3RvKTsKLSAgICBtZXRh
KHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0aGlzIHdpbGwgZGlzYWJsZSBvYnNlcnZlcnMgb24g
cHJvdG90eXBlCi0KLSAgICBDbGFzcy5DbGFzc01peGluLmFwcGx5KENsYXNzKTsKLSAgICByZXR1
cm4gQ2xhc3M7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRXF1aXZhbGVudCB0byBkb2luZyBgZXh0ZW5k
KGFyZ3VtZW50cykuY3JlYXRlKClgLgotICAgIElmIHBvc3NpYmxlIHVzZSB0aGUgbm9ybWFsIGBj
cmVhdGVgIG1ldGhvZCBpbnN0ZWFkLgotCi0gICAgQG1ldGhvZCBjcmVhdGVXaXRoTWl4aW5zCi0g
ICAgQHN0YXRpYwotICAgIEBwYXJhbSBbYXJndW1lbnRzXSoKLSAgKi8KLSAgY3JlYXRlV2l0aE1p
eGluczogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVudHMu
bGVuZ3RoPjApIHsgdGhpcy5faW5pdE1peGlucyhhcmd1bWVudHMpOyB9Ci0gICAgcmV0dXJuIG5l
dyBDKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNz
LiBBY2NlcHRzIGVpdGhlciBubyBhcmd1bWVudHMsIG9yIGFuIG9iamVjdAotICAgIGNvbnRhaW5p
bmcgdmFsdWVzIHRvIGluaXRpYWxpemUgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBvYmplY3Qgd2l0
aC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4
dGVuZCh7Ci0gICAgICBoZWxsb1dvcmxkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgYWxlcnQoIkhp
LCBteSBuYW1lIGlzICIgKyB0aGlzLmdldCgnbmFtZScpKTsKLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIHZhciB0b20gPSBBcHAuUGVyc29uLmNyZWF0ZSh7Ci0gICAgICBuYW1lOiAnVG9tIERhbGUn
Ci0gICAgfSk7Ci0KLSAgICB0b20uaGVsbG9Xb3JsZCgpOyAvLyBhbGVydHMgIkhpLCBteSBuYW1l
IGlzIFRvbSBEYWxlIi4KLSAgICBgYGAKLQotICAgIGBjcmVhdGVgIHdpbGwgY2FsbCB0aGUgYGlu
aXRgIGZ1bmN0aW9uIGlmIGRlZmluZWQgZHVyaW5nCi0gICAgYEVtYmVyLkFueU9iamVjdC5leHRl
bmRgCi0KLSAgICBJZiBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBgY3JlYXRlYCwgaXQgd2ls
bCBub3Qgc2V0IHZhbHVlcyB0byB0aGUgbmV3Ci0gICAgaW5zdGFuY2UgZHVyaW5nIGluaXRpYWxp
emF0aW9uOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBub05hbWUgPSBBcHAuUGVyc29u
LmNyZWF0ZSgpOwotICAgIG5vTmFtZS5oZWxsb1dvcmxkKCk7IC8vIGFsZXJ0cyB1bmRlZmluZWQK
LSAgICBgYGAKLQotICAgIE5PVEU6IEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgY2Fubm90
IGRlY2xhcmUgbWV0aG9kcyBvciBjb21wdXRlZAotICAgIHByb3BlcnRpZXMgZHVyaW5nIGBjcmVh
dGVgLiBZb3Ugc2hvdWxkIGluc3RlYWQgZGVjbGFyZSBtZXRob2RzIGFuZCBjb21wdXRlZAotICAg
IHByb3BlcnRpZXMgd2hlbiB1c2luZyBgZXh0ZW5kYCBvciB1c2UgdGhlIGBjcmVhdGVXaXRoTWl4
aW5zYCBzaG9ydGhhbmQuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZQotICAgIEBzdGF0aWMKLSAgICBA
cGFyYW0gW2FyZ3VtZW50c10qCi0gICovCi0gIGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdFByb3Bl
cnRpZXMoYXJndW1lbnRzKTsgfQotICAgIHJldHVybiBuZXcgQygpOwotICB9LAotCi0gIC8qKgot
ICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3IncyBwcm90b3R5cGUgd2l0aCBhZGRpdGlvbmFsCi0g
ICAgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25zOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15
T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0Jwot
ICAgIH0pOwotCi0gICAgbyA9IE15T2JqZWN0LmNyZWF0ZSgpOwotICAgIG8uZ2V0KCduYW1lJyk7
IC8vICdhbiBvYmplY3QnCi0KLSAgICBNeU9iamVjdC5yZW9wZW4oewotICAgICAgc2F5OiBmdW5j
dGlvbihtc2cpewotICAgICAgICBjb25zb2xlLmxvZyhtc2cpOwotICAgICAgfQotICAgIH0pCi0K
LSAgICBvMiA9IE15T2JqZWN0LmNyZWF0ZSgpOwotICAgIG8yLnNheSgiaGVsbG8iKTsgLy8gbG9n
cyAiaGVsbG8iCi0KLSAgICBvLnNheSgiZ29vZGJ5ZSIpOyAvLyBsb2dzICJnb29kYnllIgotICAg
IGBgYAotCi0gICAgVG8gYWRkIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0byB0aGUgY29uc3Ry
dWN0b3IgaXRzZWxmLAotICAgIHNlZSBgcmVvcGVuQ2xhc3NgCi0KLSAgICBAbWV0aG9kIHJlb3Bl
bgotICAqLwotICByZW9wZW46IGZ1bmN0aW9uKCkgewotICAgIHRoaXMud2lsbFJlb3BlbigpOwot
ICAgIHJlb3Blbi5hcHBseSh0aGlzLlByb3RvdHlwZU1peGluLCBhcmd1bWVudHMpOwotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3IncyBv
d24gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25zOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15
T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0Jwot
ICAgIH0pOwotCi0gICAgTXlPYmplY3QucmVvcGVuQ2xhc3MoewotICAgICAgY2FuQnVpbGQ6IGZh
bHNlCi0gICAgfSk7Ci0KLSAgICBNeU9iamVjdC5jYW5CdWlsZDsgLy8gZmFsc2UKLSAgICBvID0g
TXlPYmplY3QuY3JlYXRlKCk7Ci0gICAgYGBgCi0KLSAgICBJbiBvdGhlciB3b3JkcywgdGhpcyBj
cmVhdGVzIHN0YXRpYyBwcm9wZXJ0aWVzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcy4gVGhl
c2UgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjbGFzcwotICAgIGFuZCBub3Qgb24gYW55IGlu
c3RhbmNlIG9mIHRoYXQgY2xhc3MuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNv
biA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgbmFtZSA6ICIiLAotICAgICAgc2F5SGVs
bG8gOiBmdW5jdGlvbigpewotICAgICAgICBhbGVydCgiSGVsbG8uIE15IG5hbWUgaXMgIiArIHRo
aXMuZ2V0KCduYW1lJykpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQXBwLlBlcnNvbi5yZW9w
ZW5DbGFzcyh7Ci0gICAgICBzcGVjaWVzIDogIkhvbW8gc2FwaWVucyIsCi0gICAgICBjcmVhdGVQ
ZXJzb246IGZ1bmN0aW9uKG5ld1BlcnNvbnNOYW1lKXsKLSAgICAgICAgcmV0dXJuIEFwcC5QZXJz
b24uY3JlYXRlKHsKLSAgICAgICAgICBuYW1lOm5ld1BlcnNvbnNOYW1lCi0gICAgICAgIH0pOwot
ICAgICAgfQotICAgIH0pOwotCi0gICAgdmFyIHRvbSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKLSAg
ICAgIG5hbWUgOiAiVG9tIERhbGUiCi0gICAgfSk7Ci0gICAgdmFyIHllaHVkYSA9IEFwcC5QZXJz
b24uY3JlYXRlUGVyc29uKCJZZWh1ZGEgS2F0eiIpOwotCi0gICAgdG9tLnNheUhlbGxvKCk7IC8v
ICJIZWxsby4gTXkgbmFtZSBpcyBUb20gRGFsZSIKLSAgICB5ZWh1ZGEuc2F5SGVsbG8oKTsgLy8g
IkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBLYXR6IgotICAgIGFsZXJ0KEFwcC5QZXJzb24uc3Bl
Y2llcyk7IC8vICJIb21vIHNhcGllbnMiCi0gICAgYGBgCi0KLSAgICBOb3RlIHRoYXQgYHNwZWNp
ZXNgIGFuZCBgY3JlYXRlUGVyc29uYCBhcmUgKm5vdCogdmFsaWQgb24gdGhlIGB0b21gIGFuZCBg
eWVodWRhYAotICAgIHZhcmlhYmxlcy4gVGhleSBhcmUgb25seSB2YWxpZCBvbiBgQXBwLlBlcnNv
bmAuCi0KLSAgICBUbyBhZGQgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRvIGluc3RhbmNlcyBv
ZgotICAgIGEgY29uc3RydWN0b3IgYnkgZXh0ZW5kaW5nIHRoZSBjb25zdHJ1Y3RvcidzIHByb3Rv
dHlwZQotICAgIHNlZSBgcmVvcGVuYAotCi0gICAgQG1ldGhvZCByZW9wZW5DbGFzcwotICAqLwot
ICByZW9wZW5DbGFzczogZnVuY3Rpb24oKSB7Ci0gICAgcmVvcGVuLmFwcGx5KHRoaXMuQ2xhc3NN
aXhpbiwgYXJndW1lbnRzKTsKLSAgICBhcHBseU1peGluKHRoaXMsIGFyZ3VtZW50cywgZmFsc2Up
OwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIGRldGVjdDogZnVuY3Rpb24ob2JqKSB7Ci0g
ICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
d2hpbGUob2JqKSB7Ci0gICAgICBpZiAob2JqPT09dGhpcykgeyByZXR1cm4gdHJ1ZTsgfQotICAg
ICAgb2JqID0gb2JqLnN1cGVyY2xhc3M7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwK
LQotICBkZXRlY3RJbnN0YW5jZTogZnVuY3Rpb24ob2JqKSB7Ci0gICAgcmV0dXJuIG9iaiBpbnN0
YW5jZW9mIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSW4gc29tZSBjYXNlcywgeW91IG1heSB3
YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aCBhZGRpdGlvbmFsCi0gICAg
bWV0YWRhdGEgYWJvdXQgaG93IHRoZXkgZnVuY3Rpb24gb3Igd2hhdCB2YWx1ZXMgdGhleSBvcGVy
YXRlIG9uLiBGb3IKLSAgICBleGFtcGxlLCBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5
IGNsb3NlIG92ZXIgdmFyaWFibGVzIHRoYXQgYXJlIHRoZW4KLSAgICBubyBsb25nZXIgYXZhaWxh
YmxlIGZvciBpbnRyb3NwZWN0aW9uLgotCi0gICAgWW91IGNhbiBwYXNzIGEgaGFzaCBvZiB0aGVz
ZSB2YWx1ZXMgdG8gYSBjb21wdXRlZCBwcm9wZXJ0eSBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgcGVyc29uOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBwZXJzb25JZCA9IHRo
aXMuZ2V0KCdwZXJzb25JZCcpOwotICAgICAgcmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsgaWQ6
IHBlcnNvbklkIH0pOwotICAgIH0ucHJvcGVydHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNvbiB9
KQotICAgIGBgYAotCi0gICAgT25jZSB5b3UndmUgZG9uZSB0aGlzLCB5b3UgY2FuIHJldHJpZXZl
IHRoZSB2YWx1ZXMgc2F2ZWQgdG8gdGhlIGNvbXB1dGVkCi0gICAgcHJvcGVydHkgZnJvbSB5b3Vy
IGNsYXNzIGxpa2UgdGhpczoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBNeUNsYXNzLm1ldGFG
b3JQcm9wZXJ0eSgncGVyc29uJyk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIHdpbGwgcmV0dXJuIHRo
ZSBvcmlnaW5hbCBoYXNoIHRoYXQgd2FzIHBhc3NlZCB0byBgbWV0YSgpYC4KLQotICAgIEBtZXRo
b2QgbWV0YUZvclByb3BlcnR5Ci0gICAgQHBhcmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1l
Ci0gICovCi0gIG1ldGFGb3JQcm9wZXJ0eTogZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIGRlc2Mg
PSBtZXRhKHRoaXMucHJvdG8oKSwgZmFsc2UpLmRlc2NzW2tleV07Ci0KLSAgICBFbWJlci5hc3Nl
cnQoIm1ldGFGb3JQcm9wZXJ0eSgpIGNvdWxkIG5vdCBmaW5kIGEgY29tcHV0ZWQgcHJvcGVydHkg
d2l0aCBrZXkgJyIra2V5KyInLiIsICEhZGVzYyAmJiBkZXNjIGluc3RhbmNlb2YgRW1iZXIuQ29t
cHV0ZWRQcm9wZXJ0eSk7Ci0gICAgcmV0dXJuIGRlc2MuX21ldGEgfHwge307Ci0gIH0sCi0KLSAg
LyoqCi0gICAgSXRlcmF0ZSBvdmVyIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkgZm9yIHRoZSBjbGFz
cywgcGFzc2luZyBpdHMgbmFtZQotICAgIGFuZCBhbnkgYXNzb2NpYXRlZCBtZXRhZGF0YSAoc2Vl
IGBtZXRhRm9yUHJvcGVydHlgKSB0byB0aGUgY2FsbGJhY2suCi0KLSAgICBAbWV0aG9kIGVhY2hD
b21wdXRlZFByb3BlcnR5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcGFy
YW0ge09iamVjdH0gYmluZGluZwotICAqLwotICBlYWNoQ29tcHV0ZWRQcm9wZXJ0eTogZnVuY3Rp
b24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB2YXIgcHJvdG8gPSB0aGlzLnByb3RvKCksCi0g
ICAgICAgIGRlc2NzID0gbWV0YShwcm90bykuZGVzY3MsCi0gICAgICAgIGVtcHR5ID0ge30sCi0g
ICAgICAgIHByb3BlcnR5OwotCi0gICAgZm9yICh2YXIgbmFtZSBpbiBkZXNjcykgewotICAgICAg
cHJvcGVydHkgPSBkZXNjc1tuYW1lXTsKLQotICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2Yg
RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkgewotICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcg
fHwgdGhpcywgbmFtZSwgcHJvcGVydHkuX21ldGEgfHwgZW1wdHkpOwotICAgICAgfQotICAgIH0K
LSAgfQotCi19KTsKLQotQ2xhc3NNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsK
LQotaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlkZUNsYXNzTWl4aW4pIHsKLSAgRW1iZXIuY29uZmln
Lm92ZXJyaWRlQ2xhc3NNaXhpbihDbGFzc01peGluKTsKLX0KLQotQ29yZU9iamVjdC5DbGFzc01p
eGluID0gQ2xhc3NNaXhpbjsKLUNsYXNzTWl4aW4uYXBwbHkoQ29yZU9iamVjdCk7Ci0KLUVtYmVy
LkNvcmVPYmplY3QgPSBDb3JlT2JqZWN0OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLS8qKgot
ICBgRW1iZXIuT2JqZWN0YCBpcyB0aGUgbWFpbiBiYXNlIGNsYXNzIGZvciBhbGwgRW1iZXIgb2Jq
ZWN0cy4gSXQgaXMgYSBzdWJjbGFzcwotICBvZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0aCB0aGUg
YEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFwcGxpZWQuIEZvciBkZXRhaWxzLAotICBzZWUgdGhl
IGRvY3VtZW50YXRpb24gZm9yIGVhY2ggb2YgdGhlc2UuCi0KLSAgQGNsYXNzIE9iamVjdAotICBA
bmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNvcmVPYmplY3QKLSAgQHVzZXMgRW1i
ZXIuT2JzZXJ2YWJsZQotKi8KLUVtYmVyLk9iamVjdCA9IEVtYmVyLkNvcmVPYmplY3QuZXh0ZW5k
KEVtYmVyLk9ic2VydmFibGUpOwotRW1iZXIuT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7
IHJldHVybiAiRW1iZXIuT2JqZWN0IjsgfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIg
Z2V0ID0gRW1iZXIuZ2V0LCBpbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsK
LQotLyoqCi0gIEEgTmFtZXNwYWNlIGlzIGFuIG9iamVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFp
biBvdGhlciBvYmplY3RzIG9yIG1ldGhvZHMKLSAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBm
cmFtZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFjZSBhbnl0aW1lIHlvdSB3YW50Ci0gIHRvIGRlZmlu
ZSBvbmUgb2YgdGhlc2UgbmV3IGNvbnRhaW5lcnMuCi0KLSAgIyBFeGFtcGxlIFVzYWdlCi0KLSAg
YGBgamF2YXNjcmlwdAotICBNeUZyYW1ld29yayA9IEVtYmVyLk5hbWVzcGFjZS5jcmVhdGUoewot
ICAgIFZFUlNJT046ICcxLjAuMCcKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBOYW1lc3BhY2UK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi12YXIgTmFt
ZXNwYWNlID0gRW1iZXIuTmFtZXNwYWNlID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gIGlzTmFt
ZXNwYWNlOiB0cnVlLAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLk5hbWVzcGFj
ZS5OQU1FU1BBQ0VTLnB1c2godGhpcyk7Ci0gICAgRW1iZXIuTmFtZXNwYWNlLlBST0NFU1NFRCA9
IGZhbHNlOwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZSA9
IGdldCh0aGlzLCAnbmFtZScpOwotICAgIGlmIChuYW1lKSB7IHJldHVybiBuYW1lOyB9Ci0KLSAg
ICBmaW5kTmFtZXNwYWNlcygpOwotICAgIHJldHVybiB0aGlzW0VtYmVyLkdVSURfS0VZKydfbmFt
ZSddOwotICB9LAotCi0gIG5hbWVDbGFzc2VzOiBmdW5jdGlvbigpIHsKLSAgICBwcm9jZXNzTmFt
ZXNwYWNlKFt0aGlzLnRvU3RyaW5nKCldLCB0aGlzLCB7fSk7Ci0gIH0sCi0KLSAgZGVzdHJveTog
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBFbWJlci5OYW1lc3BhY2UuTkFNRVNQ
QUNFUzsKLSAgICBFbWJlci5sb29rdXBbdGhpcy50b1N0cmluZygpXSA9IHVuZGVmaW5lZDsKLSAg
ICBuYW1lc3BhY2VzLnNwbGljZShpbmRleE9mLmNhbGwobmFtZXNwYWNlcywgdGhpcyksIDEpOwot
ICAgIHRoaXMuX3N1cGVyKCk7Ci0gIH0KLX0pOwotCi1OYW1lc3BhY2UucmVvcGVuQ2xhc3Moewot
ICBOQU1FU1BBQ0VTOiBbRW1iZXJdLAotICBOQU1FU1BBQ0VTX0JZX0lEOiB7fSwKLSAgUFJPQ0VT
U0VEOiBmYWxzZSwKLSAgcHJvY2Vzc0FsbDogcHJvY2Vzc0FsbE5hbWVzcGFjZXMsCi0gIGJ5TmFt
ZTogZnVuY3Rpb24obmFtZSkgewotICAgIGlmICghRW1iZXIuQk9PVEVEKSB7Ci0gICAgICBwcm9j
ZXNzQWxsTmFtZXNwYWNlcygpOwotICAgIH0KLQotICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lE
W25hbWVdOwotICB9Ci19KTsKLQotdmFyIE5BTUVTUEFDRVNfQllfSUQgPSBOYW1lc3BhY2UuTkFN
RVNQQUNFU19CWV9JRDsKLQotdmFyIGhhc093blByb3AgPSAoe30pLmhhc093blByb3BlcnR5LAot
ICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yOwotCi1mdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNl
KHBhdGhzLCByb290LCBzZWVuKSB7Ci0gIHZhciBpZHggPSBwYXRocy5sZW5ndGg7Ci0KLSAgTkFN
RVNQQUNFU19CWV9JRFtwYXRocy5qb2luKCcuJyldID0gcm9vdDsKLQotICAvLyBMb29wIG92ZXIg
YWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1lc3BhY2UsIGxvb2tpbmcgZm9yIGNsYXNzZXMKLSAg
Zm9yKHZhciBrZXkgaW4gcm9vdCkgewotICAgIGlmICghaGFzT3duUHJvcC5jYWxsKHJvb3QsIGtl
eSkpIHsgY29udGludWU7IH0KLSAgICB2YXIgb2JqID0gcm9vdFtrZXldOwotCi0gICAgLy8gSWYg
d2UgYXJlIHByb2Nlc3NpbmcgdGhlIGBFbWJlcmAgbmFtZXNwYWNlLCBmb3IgZXhhbXBsZSwgdGhl
Ci0gICAgLy8gYHBhdGhzYCB3aWxsIHN0YXJ0IHdpdGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJh
dGlvbiB0aHJvdWdoCi0gICAgLy8gdGhlIGxvb3Agd2lsbCB1cGRhdGUgdGhlICoqc2Vjb25kKiog
ZWxlbWVudCBvZiB0aGlzIGxpc3Qgd2l0aAotICAgIC8vIHRoZSBrZXksIHNvIHByb2Nlc3Npbmcg
YEVtYmVyLlZpZXdgIHdpbGwgbWFrZSB0aGUgQXJyYXkKLSAgICAvLyBgWydFbWJlcicsICdWaWV3
J11gLgotICAgIHBhdGhzW2lkeF0gPSBrZXk7Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGZvdW5kIGFu
IHVucHJvY2Vzc2VkIGNsYXNzCi0gICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNz
VG9TdHJpbmcpIHsKLSAgICAgIC8vIFJlcGxhY2UgdGhlIGNsYXNzJyBgdG9TdHJpbmdgIHdpdGgg
dGhlIGRvdC1zZXBhcmF0ZWQgcGF0aAotICAgICAgLy8gYW5kIHNldCBpdHMgYE5BTUVfS0VZYAot
ICAgICAgb2JqLnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHBhdGhzLmpvaW4oJy4nKSk7Ci0gICAg
ICBvYmpbTkFNRV9LRVldID0gcGF0aHMuam9pbignLicpOwotCi0gICAgLy8gU3VwcG9ydCBuZXN0
ZWQgbmFtZXNwYWNlcwotICAgIH0gZWxzZSBpZiAob2JqICYmIG9iai5pc05hbWVzcGFjZSkgewot
ICAgICAgLy8gU2tpcCBhbGlhc2VkIG5hbWVzcGFjZXMKLSAgICAgIGlmIChzZWVuW2d1aWRGb3Io
b2JqKV0pIHsgY29udGludWU7IH0KLSAgICAgIHNlZW5bZ3VpZEZvcihvYmopXSA9IHRydWU7Ci0K
LSAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxkIG5hbWVzcGFjZQotICAgICAgcHJvY2Vzc05hbWVz
cGFjZShwYXRocywgb2JqLCBzZWVuKTsKLSAgICB9Ci0gIH0KLQotICBwYXRocy5sZW5ndGggPSBp
ZHg7IC8vIGN1dCBvdXQgbGFzdCBpdGVtCi19Ci0KLWZ1bmN0aW9uIGZpbmROYW1lc3BhY2VzKCkg
ewotICB2YXIgTmFtZXNwYWNlID0gRW1iZXIuTmFtZXNwYWNlLCBsb29rdXAgPSBFbWJlci5sb29r
dXAsIG9iaiwgaXNOYW1lc3BhY2U7Ci0KLSAgaWYgKE5hbWVzcGFjZS5QUk9DRVNTRUQpIHsgcmV0
dXJuOyB9Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBsb29rdXApIHsKLSAgICAvLyBUaGVzZSBkb24n
dCByYWlzZSBleGNlcHRpb25zIGJ1dCBjYW4gY2F1c2Ugd2FybmluZ3MKLSAgICBpZiAocHJvcCA9
PT0gInBhcmVudCIgfHwgcHJvcCA9PT0gInRvcCIgfHwgcHJvcCA9PT0gImZyYW1lRWxlbWVudCIg
fHwgcHJvcCA9PT0gIndlYmtpdFN0b3JhZ2VJbmZvIikgeyBjb250aW51ZTsgfQotCi0gICAgLy8g
IGdldCh3aW5kb3cuZ2xvYmFsU3RvcmFnZSwgJ2lzTmFtZXNwYWNlJykgd291bGQgdHJ5IHRvIHJl
YWQgdGhlIHN0b3JhZ2UgZm9yIGRvbWFpbiBpc05hbWVzcGFjZSBhbmQgY2F1c2UgZXhjZXB0aW9u
IGluIEZpcmVmb3guCi0gICAgLy8gZ2xvYmFsU3RvcmFnZSBpcyBhIHN0b3JhZ2Ugb2Jzb2xldGVk
IGJ5IHRoZSBXaGF0V0cgc3RvcmFnZSBzcGVjaWZpY2F0aW9uLiBTZWUgaHR0cHM6Ly9kZXZlbG9w
ZXIubW96aWxsYS5vcmcvZW4vRE9NL1N0b3JhZ2UjZ2xvYmFsU3RvcmFnZQotICAgIGlmIChwcm9w
ID09PSAiZ2xvYmFsU3RvcmFnZSIgJiYgbG9va3VwLlN0b3JhZ2VMaXN0ICYmIGxvb2t1cC5nbG9i
YWxTdG9yYWdlIGluc3RhbmNlb2YgbG9va3VwLlN0b3JhZ2VMaXN0KSB7IGNvbnRpbnVlOyB9Ci0g
ICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZSB2ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHdp
bmRvdy5oYXNPd25Qcm9wZXJ0eQotICAgIGlmIChsb29rdXAuaGFzT3duUHJvcGVydHkgJiYgIWxv
b2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZTsgfQotCi0gICAgLy8gQXQgdGlt
ZXMgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyBjZXJ0YWluIHByb3BlcnRpZXMgZm9yIHNl
Y3VyaXR5IHJlYXNvbnMuCi0gICAgLy8gVGhlcmUgYXJlIGFsc28gdGltZXMgd2hlcmUgZXZlbiBp
ZiB3ZSBjYW4gYWNjZXNzIHRoZW0sIHdlIGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlaXIg
cHJvcGVydGllcy4KLSAgICB0cnkgewotICAgICAgb2JqID0gRW1iZXIubG9va3VwW3Byb3BdOwot
ICAgICAgaXNOYW1lc3BhY2UgPSBvYmogJiYgb2JqLmlzTmFtZXNwYWNlOwotICAgIH0gY2F0Y2gg
KGUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChpc05hbWVzcGFjZSkgewot
ICAgICAgRW1iZXIuZGVwcmVjYXRlKCJOYW1lc3BhY2VzIHNob3VsZCBub3QgYmVnaW4gd2l0aCBs
b3dlcmNhc2UuIiwgL15bQS1aXS8udGVzdChwcm9wKSk7Ci0gICAgICBvYmpbTkFNRV9LRVldID0g
cHJvcDsKLSAgICB9Ci0gIH0KLX0KLQotdmFyIE5BTUVfS0VZID0gRW1iZXIuTkFNRV9LRVkgPSBF
bWJlci5HVUlEX0tFWSArICdfbmFtZSc7Ci0KLWZ1bmN0aW9uIHN1cGVyQ2xhc3NTdHJpbmcobWl4
aW4pIHsKLSAgdmFyIHN1cGVyY2xhc3MgPSBtaXhpbi5zdXBlcmNsYXNzOwotICBpZiAoc3VwZXJj
bGFzcykgewotICAgIGlmIChzdXBlcmNsYXNzW05BTUVfS0VZXSkgeyByZXR1cm4gc3VwZXJjbGFz
c1tOQU1FX0tFWV07IH0KLSAgICBlbHNlIHsgcmV0dXJuIHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJj
bGFzcyk7IH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotZnVuY3Rpb24gY2xh
c3NUb1N0cmluZygpIHsKLSAgaWYgKCFFbWJlci5CT09URUQgJiYgIXRoaXNbTkFNRV9LRVldKSB7
Ci0gICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKLSAgfQotCi0gIHZhciByZXQ7Ci0KLSAgaWYg
KHRoaXNbTkFNRV9LRVldKSB7Ci0gICAgcmV0ID0gdGhpc1tOQU1FX0tFWV07Ci0gIH0gZWxzZSBp
ZiAodGhpcy5fdG9TdHJpbmcpIHsKLSAgICByZXQgPSB0aGlzLl90b1N0cmluZzsgCi0gIH0gZWxz
ZSB7Ci0gICAgdmFyIHN0ciA9IHN1cGVyQ2xhc3NTdHJpbmcodGhpcyk7Ci0gICAgaWYgKHN0cikg
ewotICAgICAgcmV0ID0gIihzdWJjbGFzcyBvZiAiICsgc3RyICsgIikiOwotICAgIH0gZWxzZSB7
Ci0gICAgICByZXQgPSAiKHVua25vd24gbWl4aW4pIjsKLSAgICB9Ci0gICAgdGhpcy50b1N0cmlu
ZyA9IG1ha2VUb1N0cmluZyhyZXQpOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVuY3Rp
b24gcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKSB7Ci0gIHZhciB1bnByb2Nlc3NlZE5hbWVzcGFjZXMg
PSAhTmFtZXNwYWNlLlBST0NFU1NFRCwKLSAgICAgIHVucHJvY2Vzc2VkTWl4aW5zID0gRW1iZXIu
YW55VW5wcm9jZXNzZWRNaXhpbnM7Ci0KLSAgaWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcykgewot
ICAgIGZpbmROYW1lc3BhY2VzKCk7Ci0gICAgTmFtZXNwYWNlLlBST0NFU1NFRCA9IHRydWU7Ci0g
IH0KLQotICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzIHx8IHVucHJvY2Vzc2VkTWl4aW5zKSB7
Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1lc3BhY2UuTkFNRVNQQUNFUywgbmFtZXNwYWNlOwot
ICAgIGZvciAodmFyIGk9MCwgbD1uYW1lc3BhY2VzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
IG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbaV07Ci0gICAgICBwcm9jZXNzTmFtZXNwYWNlKFtuYW1l
c3BhY2UudG9TdHJpbmcoKV0sIG5hbWVzcGFjZSwge30pOwotICAgIH0KLQotICAgIEVtYmVyLmFu
eVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7Ci0gIH0KLX0KLQotZnVuY3Rpb24gbWFrZVRvU3Ry
aW5nKHJldCkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiByZXQ7IH07Ci19Ci0KLUVt
YmVyLk1peGluLnByb3RvdHlwZS50b1N0cmluZyA9IGNsYXNzVG9TdHJpbmc7Ci0KLX0pKCk7Ci0K
LQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
cnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQs
Ci0gICAgZm10ID0gRW1iZXIuU3RyaW5nLmZtdCwKLSAgICBhZGRCZWZvcmVPYnNlcnZlciA9IEVt
YmVyLmFkZEJlZm9yZU9ic2VydmVyLAotICAgIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2
ZXIsCi0gICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZl
ciwKLSAgICByZW1vdmVPYnNlcnZlciA9IEVtYmVyLnJlbW92ZU9ic2VydmVyLAotICAgIHByb3Bl
cnR5V2lsbENoYW5nZSA9IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSwKLSAgICBwcm9wZXJ0eURp
ZENoYW5nZSA9IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlLAotICAgIG1ldGEgPSBFbWJlci5tZXRh
LAotICAgIGRlZmluZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVydHk7Ci0KLWZ1bmN0aW9u
IGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UoY29udGVudCwgY29udGVudEtleSkgewotICB2YXIg
a2V5ID0gY29udGVudEtleS5zbGljZSg4KTsgLy8gcmVtb3ZlICJjb250ZW50LiIKLSAgaWYgKGtl
eSBpbiB0aGlzKSB7IHJldHVybjsgfSAgLy8gaWYgc2hhZG93ZWQgaW4gcHJveHkKLSAgcHJvcGVy
dHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7Ci19Ci0KLWZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eURp
ZENoYW5nZShjb250ZW50LCBjb250ZW50S2V5KSB7Ci0gIHZhciBrZXkgPSBjb250ZW50S2V5LnNs
aWNlKDgpOyAvLyByZW1vdmUgImNvbnRlbnQuIgotICBpZiAoa2V5IGluIHRoaXMpIHsgcmV0dXJu
OyB9IC8vIGlmIHNoYWRvd2VkIGluIHByb3h5Ci0gIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtl
eSk7Ci19Ci0KLS8qKgotICBgRW1iZXIuT2JqZWN0UHJveHlgIGZvcndhcmRzIGFsbCBwcm9wZXJ0
aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94eSBpdHNlbGYKLSAgdG8gYSBwcm94aWVkIGBjb250
ZW50YCBvYmplY3QuCi0KLSAgYGBgamF2YXNjcmlwdAotICBvYmplY3QgPSBFbWJlci5PYmplY3Qu
Y3JlYXRlKHsKLSAgICBuYW1lOiAnRm9vJwotICB9KTsKLQotICBwcm94eSA9IEVtYmVyLk9iamVj
dFByb3h5LmNyZWF0ZSh7Ci0gICAgY29udGVudDogb2JqZWN0Ci0gIH0pOwotCi0gIC8vIEFjY2Vz
cyBhbmQgY2hhbmdlIGV4aXN0aW5nIHByb3BlcnRpZXMKLSAgcHJveHkuZ2V0KCduYW1lJykgICAg
ICAgICAgLy8gJ0ZvbycKLSAgcHJveHkuc2V0KCduYW1lJywgJ0JhcicpOwotICBvYmplY3QuZ2V0
KCduYW1lJykgICAgICAgICAvLyAnQmFyJwotCi0gIC8vIENyZWF0ZSBuZXcgJ2Rlc2NyaXB0aW9u
JyBwcm9wZXJ0eSBvbiBgb2JqZWN0YAotICBwcm94eS5zZXQoJ2Rlc2NyaXB0aW9uJywgJ0ZvbyBp
cyBhIHdoaXpib28gYmF6Jyk7Ci0gIG9iamVjdC5nZXQoJ2Rlc2NyaXB0aW9uJykgIC8vICdGb28g
aXMgYSB3aGl6Ym9vIGJheicKLSAgYGBgCi0KLSAgV2hpbGUgYGNvbnRlbnRgIGlzIHVuc2V0LCBz
ZXR0aW5nIGEgcHJvcGVydHkgdG8gYmUgZGVsZWdhdGVkIHdpbGwgdGhyb3cgYW4KLSAgRXJyb3Iu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBwcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7
Ci0gICAgY29udGVudDogbnVsbCwKLSAgICBmbGFnOiBudWxsCi0gIH0pOwotICBwcm94eS5zZXQo
J2ZsYWcnLCB0cnVlKTsKLSAgcHJveHkuZ2V0KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQotICBw
cm94eS5nZXQoJ2ZvbycpOyAgICAgICAgICAvLyB1bmRlZmluZWQKLSAgcHJveHkuc2V0KCdmb28n
LCAnZGF0YScpOyAgLy8gdGhyb3dzIEVycm9yCi0gIGBgYAotCi0gIERlbGVnYXRlZCBwcm9wZXJ0
aWVzIGNhbiBiZSBib3VuZCB0byBhbmQgd2lsbCBjaGFuZ2Ugd2hlbiBjb250ZW50IGlzIHVwZGF0
ZWQuCi0KLSAgQ29tcHV0ZWQgcHJvcGVydGllcyBvbiB0aGUgcHJveHkgaXRzZWxmIGNhbiBkZXBl
bmQgb24gZGVsZWdhdGVkIHByb3BlcnRpZXMuCi0KLSAgYGBgamF2YXNjcmlwdAotICBQcm94eVdp
dGhDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKHsKLSAgICBmdWxs
TmFtZTogZnVuY3Rpb24gKCkgewotICAgICAgdmFyIGZpcnN0TmFtZSA9IHRoaXMuZ2V0KCdmaXJz
dE5hbWUnKSwKLSAgICAgICAgICBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwotICAg
ICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFtZSkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1l
ICsgJyAnICsgbGFzdE5hbWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlyc3ROYW1lIHx8IGxh
c3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwot
Ci0gIHByb3h5ID0gUHJveHlXaXRoQ29tcHV0ZWRQcm9wZXJ0eS5jcmVhdGUoKTsKLQotICBwcm94
eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyB1bmRlZmluZWQKLSAgcHJveHkuc2V0KCdjb250ZW50Jywg
ewotICAgIGZpcnN0TmFtZTogJ1RvbScsIGxhc3ROYW1lOiAnRGFsZScKLSAgfSk7IC8vIHRyaWdn
ZXJzIHByb3BlcnR5IGNoYW5nZSBmb3IgZnVsbE5hbWUgb24gcHJveHkKLQotICBwcm94eS5nZXQo
J2Z1bGxOYW1lJyk7ICAvLyAnVG9tIERhbGUnCi0gIGBgYAotCi0gIEBjbGFzcyBPYmplY3RQcm94
eQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVy
Lk9iamVjdFByb3h5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gIC8qKgotICAgIFRoZSBvYmpl
Y3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZC4KLQotICAgIEBwcm9wZXJ0eSBj
b250ZW50Ci0gICAgQHR5cGUgRW1iZXIuT2JqZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwot
ICBjb250ZW50OiBudWxsLAotICBfY29udGVudERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2Nv
bnRlbnQnLCBmdW5jdGlvbigpIHsKLSAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBPYmplY3RQ
cm94eSdzIGNvbnRlbnQgdG8gaXRzZWxmIiwgdGhpcy5nZXQoJ2NvbnRlbnQnKSAhPT0gdGhpcyk7
Ci0gIH0pLAotCi0gIGlzVHJ1dGh5OiBFbWJlci5jb21wdXRlZC5ib29sKCdjb250ZW50JyksCi0K
LSAgX2RlYnVnQ29udGFpbmVyS2V5OiBudWxsLAotCi0gIHdpbGxXYXRjaFByb3BlcnR5OiBmdW5j
dGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNvbnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAg
IGFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0
eVdpbGxDaGFuZ2UpOwotICAgIGFkZE9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNv
bnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7Ci0gIH0sCi0KLSAgZGlkVW53YXRjaFByb3BlcnR5OiBm
dW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNvbnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5Owot
ICAgIHJlbW92ZUJlZm9yZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQ
cm9wZXJ0eVdpbGxDaGFuZ2UpOwotICAgIHJlbW92ZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXks
IG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7Ci0gIH0sCi0KLSAgdW5rbm93blByb3Bl
cnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRl
bnQnKTsKLSAgICBpZiAoY29udGVudCkgewotICAgICAgcmV0dXJuIGdldChjb250ZW50LCBrZXkp
OwotICAgIH0KLSAgfSwKLQotICBzZXRVbmtub3duUHJvcGVydHk6IGZ1bmN0aW9uIChrZXksIHZh
bHVlKSB7Ci0gICAgdmFyIG0gPSBtZXRhKHRoaXMpOwotICAgIGlmIChtLnByb3RvID09PSB0aGlz
KSB7Ci0gICAgICAvLyBpZiBtYXJrZWQgYXMgcHJvdG90eXBlIHRoZW4ganVzdCBkZWZpbmVQcm9w
ZXJ0eQotICAgICAgLy8gcmF0aGVyIHRoYW4gZGVsZWdhdGUKLSAgICAgIGRlZmluZVByb3BlcnR5
KHRoaXMsIGtleSwgbnVsbCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQot
ICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0
KGZtdCgiQ2Fubm90IGRlbGVnYXRlIHNldCgnJUAnLCAlQCkgdG8gdGhlICdjb250ZW50JyBwcm9w
ZXJ0eSBvZiBvYmplY3QgcHJveHkgJUA6IGl0cyAnY29udGVudCcgaXMgdW5kZWZpbmVkLiIsIFtr
ZXksIHZhbHVlLCB0aGlzXSksIGNvbnRlbnQpOwotICAgIHJldHVybiBzZXQoY29udGVudCwga2V5
LCB2YWx1ZSk7Ci0gIH0KLQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8g
SEVMUEVSUwotLy8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFy
IGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Ci12YXIgYV9pbmRleE9mID0gRW1iZXIu
RW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLXZhciBjb250ZXh0cyA9IFtdOwotCi1mdW5jdGlv
biBwb3BDdHgoKSB7Ci0gIHJldHVybiBjb250ZXh0cy5sZW5ndGg9PT0wID8ge30gOiBjb250ZXh0
cy5wb3AoKTsKLX0KLQotZnVuY3Rpb24gcHVzaEN0eChjdHgpIHsKLSAgY29udGV4dHMucHVzaChj
dHgpOwotICByZXR1cm4gbnVsbDsKLX0KLQotZnVuY3Rpb24gaXRlcihrZXksIHZhbHVlKSB7Ci0g
IHZhciB2YWx1ZVByb3ZpZGVkID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMjsKLQotICBmdW5jdGlv
biBpKGl0ZW0pIHsKLSAgICB2YXIgY3VyID0gZ2V0KGl0ZW0sIGtleSk7Ci0gICAgcmV0dXJuIHZh
bHVlUHJvdmlkZWQgPyB2YWx1ZT09PWN1ciA6ICEhY3VyOwotICB9Ci0gIHJldHVybiBpIDsKLX0K
LQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgY29tbW9uIGludGVyZmFjZSBpbXBsZW1l
bnRlZCBieSBlbnVtZXJhYmxlIG9iamVjdHMKLSAgaW4gRW1iZXIuIE1vc3Qgb2YgdGhlc2UgbWV0
aG9kcyBmb2xsb3cgdGhlIHN0YW5kYXJkIEFycmF5IGl0ZXJhdGlvbgotICBBUEkgZGVmaW5lZCB1
cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGZlYXR1cmVz
IHRoYXQKLSAgY2Fubm90IGJlIGVtdWxhdGVkIGluIG9sZGVyIHZlcnNpb25zIG9mIEphdmFTY3Jp
cHQpLgotCi0gIFRoaXMgbWl4aW4gaXMgYXBwbGllZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBBcnJh
eSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlvdQotICBjYW4gdXNlIGFueSBvZiB0aGVzZSBtZXRo
b2RzIG9uIHNpbXBsZSBhcnJheXMuIElmIEFycmF5IGFscmVhZHkgaW1wbGVtZW50cwotICBvbmUg
b2YgdGhlc2UgbWV0aG9kcywgdGhlIG1peGluIHdpbGwgbm90IG92ZXJyaWRlIHRoZW0uCi0KLSAg
IyMgV3JpdGluZyBZb3VyIE93biBFbnVtZXJhYmxlCi0KLSAgVG8gbWFrZSB5b3VyIG93biBjdXN0
b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5lZWQgdHdvIGl0ZW1zOgotCi0gIDEuIFlvdSBtdXN0
IGhhdmUgYSBsZW5ndGggcHJvcGVydHkuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGNoYW5nZSB3aGVu
ZXZlcgotICAgICB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3Qg
Y2hhbmdlcy4gSWYgeW91IHVzaW5nIHRoaXMKLSAgICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBz
dWJjbGFzcywgeW91IHNob3VsZCBiZSBzdXJlIHRvIGNoYW5nZSB0aGUgbGVuZ3RoCi0gICAgIHBy
b3BlcnR5IHVzaW5nIGBzZXQoKS5gCi0KLSAgMi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2Jq
ZWN0KCkuYCBTZWUgZG9jdW1lbnRhdGlvbi4KLQotICBPbmNlIHlvdSBoYXZlIHRoZXNlIHR3byBt
ZXRob2RzIGltcGxlbWVudCwgYXBwbHkgdGhlIGBFbWJlci5FbnVtZXJhYmxlYCBtaXhpbgotICB0
byB5b3VyIGNsYXNzIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGVudW1lcmF0ZSB0aGUgY29udGVu
dHMgb2YgeW91ciBvYmplY3QKLSAgbGlrZSBhbnkgb3RoZXIgY29sbGVjdGlvbi4KLQotICAjIyBV
c2luZyBFbWJlciBFbnVtZXJhdGlvbiB3aXRoIE90aGVyIExpYnJhcmllcwotCi0gIE1hbnkgb3Ro
ZXIgbGlicmFyaWVzIHByb3ZpZGUgc29tZSBraW5kIG9mIGl0ZXJhdG9yIG9yIGVudW1lcmF0aW9u
IGxpa2UKLSAgZmFjaWxpdHkuIFRoaXMgaXMgb2Z0ZW4gd2hlcmUgdGhlIG1vc3QgY29tbW9uIEFQ
SSBjb25mbGljdHMgb2NjdXIuCi0gIEVtYmVyJ3MgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGFzIGZy
aWVuZGx5IGFzIHBvc3NpYmxlIHdpdGggb3RoZXIKLSAgbGlicmFyaWVzIGJ5IGltcGxlbWVudGlu
ZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkgY29ycmVzcG9uZCB0byB0aGUKLSAgSmF2YVNjcmlw
dCAxLjggQVBJLgotCi0gIEBjbGFzcyBFbnVtZXJhYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAg
QHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVyLkVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVh
dGUoewotCi0gIC8qKgotICAgIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xh
c3MgZW51bWVyYWJsZS4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbCByZXBlYXRlZGx5
IGR1cmluZyBlbnVtZXJhdGlvbi4gVGhlIGluZGV4IHZhbHVlCi0gICAgd2lsbCBhbHdheXMgYmVn
aW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9ub3RvbmljYWxseS4gWW91IGRvbid0IGhhdmUgdG8K
LSAgICByZWx5IG9uIHRoZSBpbmRleCB2YWx1ZSB0byBkZXRlcm1pbmUgd2hhdCBvYmplY3QgdG8g
cmV0dXJuLCBidXQgeW91IHNob3VsZAotICAgIGFsd2F5cyBjaGVjayB0aGUgdmFsdWUgYW5kIHN0
YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB3aGVuIHlvdSBzZWUgdGhlCi0gICAgcmVxdWVzdGVkIGlu
ZGV4IGlzIDAuCi0KLSAgICBUaGUgYHByZXZpb3VzT2JqZWN0YCBpcyB0aGUgb2JqZWN0IHRoYXQg
d2FzIHJldHVybmVkIGZyb20gdGhlIGxhc3QgY2FsbAotICAgIHRvIGBuZXh0T2JqZWN0YCBmb3Ig
dGhlIGN1cnJlbnQgaXRlcmF0aW9uLiBUaGlzIGlzIGEgdXNlZnVsIHdheSB0bwotICAgIG1hbmFn
ZSBpdGVyYXRpb24gaWYgeW91IGFyZSB0cmFjaW5nIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxl
LgotCi0gICAgRmluYWxseSB0aGUgY29udGV4dCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMgY29udGFp
biBhIGhhc2ggeW91IGNhbiB1c2UgYXMKLSAgICBhICJzY3JhdGNocGFkIiB0byBtYWludGFpbiBh
bnkgb3RoZXIgc3RhdGUgeW91IG5lZWQgaW4gb3JkZXIgdG8gaXRlcmF0ZQotICAgIHByb3Blcmx5
LiBUaGUgY29udGV4dCBvYmplY3QgaXMgcmV1c2VkIGFuZCBpcyBub3QgcmVzZXQgYmV0d2Vlbgot
ICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJlIHlvdSBzZXR1cCB0aGUgY29udGV4dCB3aXRoIGEg
ZnJlc2ggc3RhdGUgd2hlbmV2ZXIKLSAgICB0aGUgaW5kZXggcGFyYW1ldGVyIGlzIDAuCi0KLSAg
ICBHZW5lcmFsbHkgaXRlcmF0b3JzIHdpbGwgY29udGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAg
dW50aWwgdGhlIGluZGV4Ci0gICAgcmVhY2hlcyB0aGUgeW91ciBjdXJyZW50IGxlbmd0aC0xLiBJ
ZiB5b3UgcnVuIG91dCBvZiBkYXRhIGJlZm9yZSB0aGlzCi0gICAgdGltZSBmb3Igc29tZSByZWFz
b24sIHlvdSBzaG91bGQgc2ltcGx5IHJldHVybiB1bmRlZmluZWQuCi0KLSAgICBUaGUgZGVmYXVs
dCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaW1wbHkgbG9va3MgdXAgdGhlIGluZGV4
LgotICAgIFRoaXMgd29ya3MgZ3JlYXQgb24gYW55IEFycmF5LWxpa2Ugb2JqZWN0cy4KLQotICAg
IEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBwYXJhbSB7TnVtYmVyfSBpbmRleCB0aGUgY3VycmVu
dCBpbmRleCBvZiB0aGUgaXRlcmF0aW9uCi0gICAgQHBhcmFtIHtPYmplY3R9IHByZXZpb3VzT2Jq
ZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIHRvCi0gICAgICBgbmV4dE9i
amVjdGAuCi0gICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgYSBjb250ZXh0IG9iamVjdCB5b3Ug
Y2FuIHVzZSB0byBtYWludGFpbiBzdGF0ZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXh0
IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uIG9yIHVuZGVmaW5lZAotICAqLwotICBuZXh0T2JqZWN0
OiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCi0KLSAgLyoqCi0gICAgSGVscGVyIG1ldGhvZCBy
ZXR1cm5zIHRoZSBmaXJzdCBvYmplY3QgZnJvbSBhIGNvbGxlY3Rpb24uIFRoaXMgaXMgdXN1YWxs
eQotICAgIHVzZWQgYnkgYmluZGluZ3MgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsg
dG8gZXh0cmFjdCBhIHNpbmdsZQotICAgIG9iamVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250YWlu
cyBvbmx5IG9uZSBpdGVtLgotCi0gICAgSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3Ug
c2hvdWxkIGltcGxlbWVudCBpdCBzbyB0aGF0IGl0IHdpbGwKLSAgICBhbHdheXMgcmV0dXJuIHRo
ZSBzYW1lIHZhbHVlIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQot
ICAgIGNvbnRhaW5zIG9ubHkgb25lIG9iamVjdCwgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBy
ZXR1cm4gdGhhdCBvYmplY3QuCi0gICAgSWYgeW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlz
IG1ldGhvZCBzaG91bGQgcmV0dXJuIGB1bmRlZmluZWRgLgotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJjIl07Ci0gICAgYXJyLmdldCgnZmlyc3RPYmplY3Qn
KTsgIC8vICJhIgotCi0gICAgdmFyIGFyciA9IFtdOwotICAgIGFyci5nZXQoJ2ZpcnN0T2JqZWN0
Jyk7ICAvLyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBmaXJzdE9iamVjdAot
ICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG9iamVjdCBvciB1bmRlZmluZWQKLSAgKi8KLSAgZmly
c3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywg
J2xlbmd0aCcpPT09MCkgcmV0dXJuIHVuZGVmaW5lZCA7Ci0KLSAgICAvLyBoYW5kbGUgZ2VuZXJp
YyBlbnVtZXJhYmxlcwotICAgIHZhciBjb250ZXh0ID0gcG9wQ3R4KCksIHJldDsKLSAgICByZXQg
PSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwgY29udGV4dCk7Ci0gICAgcHVzaEN0eChjb250ZXh0
KTsKLSAgICByZXR1cm4gcmV0IDsKLSAgfSkucHJvcGVydHkoJ1tdJyksCi0KLSAgLyoqCi0gICAg
SGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBsYXN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4g
SWYgeW91ciBlbnVtZXJhYmxlCi0gICAgY29udGFpbnMgb25seSBvbmUgb2JqZWN0LCB0aGlzIG1l
dGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0aGF0IG9iamVjdC4KLSAgICBJZiB5b3VyIGVudW1l
cmFibGUgaXMgZW1wdHksIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYHVuZGVmaW5lZGAuCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAgICBh
cnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAiYyIKLQotICAgIHZhciBhcnIgPSBbXTsKLSAgICBh
cnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBwcm9w
ZXJ0eSBsYXN0T2JqZWN0Ci0gICAgQHJldHVybiB7T2JqZWN0fSB0aGUgbGFzdCBvYmplY3Qgb3Ig
dW5kZWZpbmVkCi0gICovCi0gIGxhc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkg
ewotICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIGlmIChsZW49PT0wKSBy
ZXR1cm4gdW5kZWZpbmVkIDsKLSAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgpLCBpZHg9MCwgY3Vy
LCBsYXN0ID0gbnVsbDsKLSAgICBkbyB7Ci0gICAgICBsYXN0ID0gY3VyOwotICAgICAgY3VyID0g
dGhpcy5uZXh0T2JqZWN0KGlkeCsrLCBsYXN0LCBjb250ZXh0KTsKLSAgICB9IHdoaWxlIChjdXIg
IT09IHVuZGVmaW5lZCk7Ci0gICAgcHVzaEN0eChjb250ZXh0KTsKLSAgICByZXR1cm4gbGFzdDsK
LSAgfSkucHJvcGVydHkoJ1tdJyksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhl
IHBhc3NlZCBvYmplY3QgY2FuIGJlIGZvdW5kIGluIHRoZSByZWNlaXZlci4gVGhlCi0gICAgZGVm
YXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnVtZXJhYmxlIHVudGlsIHRo
ZSBvYmplY3QKLSAgICBpcyBmb3VuZC4gWW91IG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgd2l0
aCBhIG1vcmUgZWZmaWNpZW50IHZlcnNpb24uCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFy
IGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAgICBhcnIuY29udGFpbnMoImEiKTsgLy8gdHJ1ZQot
ICAgIGFyci5jb250YWlucygieiIpOyAvLyBmYWxzZQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBj
b250YWlucwotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9y
LgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBvYmplY3QgaXMgZm91bmQgaW4gZW51
bWVyYWJsZS4KLSAgKi8KLSAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0
aGlzLmZpbmQoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gaXRlbT09PW9iajsgfSkgIT09IHVuZGVm
aW5lZDsKLSAgfSwKLQotICAvKioKLSAgICBJdGVyYXRlcyB0aHJvdWdoIHRoZSBlbnVtZXJhYmxl
LCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24gb24gZWFjaAotICAgIGl0ZW0uIFRoaXMgbWV0
aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBgZm9yRWFjaCgpYCBtZXRob2QgZGVmaW5lZCBpbgotICAg
IEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBz
aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBh
cmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGlu
ZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50
IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5k
ZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJs
ZSBvYmplY3QgaXRzZWxmLgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJh
Y2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0
IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5
Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVu
dCBvYmplY3QuCi0KLSAgICBAbWV0aG9kIGZvckVhY2gKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBj
YWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFy
Z2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2Vp
dmVyCi0gICovCi0gIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICBp
ZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkg
OwotICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpLCBsYXN0ID0gbnVsbCwgY29udGV4
dCA9IHBvcEN0eCgpOwotCi0gICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB0YXJnZXQgPSBu
dWxsOwotCi0gICAgZm9yKHZhciBpZHg9MDtpZHg8bGVuO2lkeCsrKSB7Ci0gICAgICB2YXIgbmV4
dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQpIDsKLSAgICAgIGNhbGxiYWNr
LmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpOwotICAgICAgbGFzdCA9IG5leHQgOwotICAg
IH0KLSAgICBsYXN0ID0gbnVsbCA7Ci0gICAgY29udGV4dCA9IHB1c2hDdHgoY29udGV4dCk7Ci0g
ICAgcmV0dXJuIHRoaXMgOwotICB9LAotCi0gIC8qKgotICAgIEFsaWFzIGZvciBgbWFwQnlgCi0K
LSAgICBAbWV0aG9kIGdldEVhY2gKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IG5hbWUgb2YgdGhl
IHByb3BlcnR5Ci0gICAgQHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0gICovCi0g
IGdldEVhY2g6IGZ1bmN0aW9uKGtleSkgewotICAgIHJldHVybiB0aGlzLm1hcEJ5KGtleSk7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUgdmFsdWUgb24gdGhlIG5hbWVkIHByb3BlcnR5IGZv
ciBlYWNoIG1lbWJlci4gVGhpcyBpcyBtb3JlCi0gICAgZWZmaWNpZW50IHRoYW4gdXNpbmcgb3Ro
ZXIgbWV0aG9kcyBkZWZpbmVkIG9uIHRoaXMgaGVscGVyLiBJZiB0aGUgb2JqZWN0Ci0gICAgaW1w
bGVtZW50cyBFbWJlci5PYnNlcnZhYmxlLCB0aGUgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIHRvIGBz
ZXQoKSxgIG90aGVyd2lzZQotICAgIGl0IHdpbGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2Jq
ZWN0cyBhcmUgc2tpcHBlZC4KLQotICAgIEBtZXRob2Qgc2V0RWFjaAotICAgIEBwYXJhbSB7U3Ry
aW5nfSBrZXkgVGhlIGtleSB0byBzZXQKLSAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIG9i
amVjdCB0byBzZXQKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIHNldEVh
Y2g6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0
aW9uKGl0ZW0pIHsKLSAgICAgIHNldChpdGVtLCBrZXksIHZhbHVlKTsKLSAgICB9KTsKLSAgfSwK
LQotICAvKioKLSAgICBNYXBzIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHRv
IGFub3RoZXIgdmFsdWUsIHJldHVybmluZwotICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBj
b3JyZXNwb25kcyB0byBgbWFwKClgIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCi0KLSAgICBU
aGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcg
c2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBg
YAotCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgot
ICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAg
IC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCi0KLSAgICBJ
dCBzaG91bGQgcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRk
aXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0
Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBU
aGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNj
ZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KLQotICAgIEBtZXRob2QgbWFwCi0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0g
e09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7
QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0gICovCi0gIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ss
IHRhcmdldCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1
bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdl
dCwgeCwgaWR4LGkpOwotICAgIH0pOwotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgot
ICAgIFNpbWlsYXIgdG8gbWFwLCB0aGlzIHNwZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhl
IHZhbHVlIG9mIHRoZSBuYW1lZAotICAgIHByb3BlcnR5IG9uIGFsbCBpdGVtcyBpbiB0aGUgZW51
bWVyYXRpb24uCi0KLSAgICBAbWV0aG9kIG1hcEJ5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSBu
YW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFycmF5
LgotICAqLwotICBtYXBCeTogZnVuY3Rpb24oa2V5KSB7Ci0gICAgcmV0dXJuIHRoaXMubWFwKGZ1
bmN0aW9uKG5leHQpIHsKLSAgICAgIHJldHVybiBnZXQobmV4dCwga2V5KTsKLSAgICB9KTsKLSAg
fSwKLQotICAvKioKLSAgICBTaW1pbGFyIHRvIG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlv
biByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKLSAgICBwcm9wZXJ0eSBvbiBhbGwgaXRl
bXMgaW4gdGhlIGVudW1lcmF0aW9uLgotCi0gICAgQG1ldGhvZCBtYXBQcm9wZXJ0eQotICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICBAcmV0dXJuIHtBcnJh
eX0gVGhlIG1hcHBlZCBhcnJheS4KLSAgICBAZGVwcmVjYXRlZCBVc2UgYG1hcEJ5YCBpbnN0ZWFk
Ci0gICovCi0KLSAgbWFwUHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdtYXBCeScpLAotCi0g
IC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBl
bnVtZXJhdGlvbiB0aGF0IHRoZSBwYXNzZWQKLSAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9y
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgZmlsdGVyKClgIGRlZmluZWQgaW4KLSAgICBK
YXZhU2NyaXB0IDEuNi4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hv
dWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJl
IG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihpdGVtLCBpbmRl
eCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBp
dGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4
IGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUg
b2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNs
dWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCi0gICAgb3RoZXJ3aXNlLgotCi0g
ICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNz
IGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlz
YCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0
ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBAbWV0
aG9kIGZpbHRlcgotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0
byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQotICAgIEByZXR1cm4ge0FycmF5fSBBIGZpbHRlcmVkIGFycmF5LgotICAqLwotICBm
aWx0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICB2YXIgcmV0ID0gRW1iZXIu
QSgpOwotICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih4LCBpZHgsIGkpIHsKLSAgICAgIGlmIChj
YWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LCBpKSkgcmV0LnB1c2goeCk7Ci0gICAgfSk7Ci0g
ICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhbiBhcnJheSB3aXRo
IGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHdoZXJlIHRoZSBwYXNzZWQKLSAg
ICBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZvci4gVGhpcyBtZXRob2QgaXMgdGhlIGludmVyc2Ug
b2YgZmlsdGVyKCkuCi0KLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3Vs
ZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBv
cHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgs
IGVudW1lcmFibGUpOwotICAgIGBgYAotCi0gICAgLSAqaXRlbSogaXMgdGhlIGN1cnJlbnQgaXRl
bSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gKmluZGV4KiBpcyB0aGUgY3VycmVudCBpbmRleCBp
biB0aGUgaXRlcmF0aW9uCi0gICAgLSAqZW51bWVyYWJsZSogaXMgdGhlIGVudW1lcmFibGUgb2Jq
ZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGEgZmFsc2V5IHZhbHVlIHRv
IGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRk
aXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0
Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgInRoaXMiIG9uIHRoZSBjb250ZXh0LiBU
aGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNj
ZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KLQotICAgIEBtZXRob2QgcmVqZWN0Ci0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFy
YW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVy
biB7QXJyYXl9IEEgcmVqZWN0ZWQgYXJyYXkuCi0gICAqLwotICByZWplY3Q6IGZ1bmN0aW9uKGNh
bGxiYWNrLCB0YXJnZXQpIHsKLSAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gIShjYWxsYmFjay5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cykpOwotICAgIH0p
OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBpdGVt
cyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRpb25h
bCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAgICB0
aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQot
ICAgIEBtZXRob2QgZmlsdGVyQnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0
eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8g
dGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0FycmF5fSBmaWx0ZXJlZCBhcnJheQotICAqLwot
ICBmaWx0ZXJCeTogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHJldHVybiB0aGlzLmZpbHRl
cihpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVy
bnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBpdGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5
LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUg
dGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5
IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQotICAgIEBtZXRob2QgZmlsdGVyUHJvcGVydHkK
LSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFt
IHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEBy
ZXR1cm4ge0FycmF5fSBmaWx0ZXJlZCBhcnJheQotICAgIEBkZXByZWNhdGVkIFVzZSBgZmlsdGVy
QnlgIGluc3RlYWQKLSAgKi8KLSAgZmlsdGVyUHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdm
aWx0ZXJCeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMg
dGhhdCBkbyBub3QgaGF2ZSB0cnV0aHkgdmFsdWVzIGZvcgotICAgIGtleS4gIFlvdSBjYW4gcGFz
cyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3Ro
ZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0
byBmYWxzZS4KLQotICAgIEBtZXRob2QgcmVqZWN0QnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5
IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9u
YWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBh
cnJheQotICAqLwotICByZWplY3RCeTogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBl
eGFjdFZhbHVlID0gZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gZ2V0KGl0ZW0sIGtleSkgPT09IHZh
bHVlOyB9LAotICAgICAgICBoYXNWYWx1ZSA9IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuICEhZ2V0
KGl0ZW0sIGtleSk7IH0sCi0gICAgICAgIHVzZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAyID8g
ZXhhY3RWYWx1ZSA6IGhhc1ZhbHVlKTsKLQotICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOwot
ICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBk
byBub3QgaGF2ZSB0cnV0aHkgdmFsdWVzIGZvcgotICAgIGtleS4gIFlvdSBjYW4gcGFzcyBhbiBv
cHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3RoZXJ3aXNl
Ci0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxz
ZS4KLQotICAgIEBtZXRob2QgcmVqZWN0UHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5
IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9u
YWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBh
cnJheQotICAgIEBkZXByZWNhdGVkIFVzZSBgcmVqZWN0QnlgIGluc3RlYWQKLSAgKi8KLSAgcmVq
ZWN0UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZWplY3RCeScpLAotCi0gIC8qKgotICAg
IFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGZvciB3aGljaCB0aGUgY2FsbGJh
Y2sgcmV0dXJucyB0cnVlLgotICAgIFRoaXMgbWV0aG9kIHdvcmtzIHNpbWlsYXIgdG8gdGhlIGBm
aWx0ZXIoKWAgbWV0aG9kIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYKLSAgICBleGNlcHQgdGhh
dCBpdCB3aWxsIHN0b3Agd29ya2luZyBvbiB0aGUgYXJyYXkgb25jZSBhIG1hdGNoIGlzIGZvdW5k
LgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUg
Zm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxl
KTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0
ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJh
dGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxm
LgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0g
aW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAgICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQg
aW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwg
dGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250
ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rp
b24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KLQotICAgIEBtZXRob2QgZmluZAotICAg
IEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAg
QHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEBy
ZXR1cm4ge09iamVjdH0gRm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYC4KLSAgKi8KLSAgZmluZDog
ZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewotICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xl
bmd0aCcpIDsKLSAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHRhcmdldCA9IG51bGw7Ci0K
LSAgICB2YXIgbGFzdCA9IG51bGwsIG5leHQsIGZvdW5kID0gZmFsc2UsIHJldCA7Ci0gICAgdmFy
IGNvbnRleHQgPSBwb3BDdHgoKTsKLSAgICBmb3IodmFyIGlkeD0wO2lkeDxsZW4gJiYgIWZvdW5k
O2lkeCsrKSB7Ci0gICAgICBuZXh0ID0gdGhpcy5uZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29udGV4
dCkgOwotICAgICAgaWYgKGZvdW5kID0gY2FsbGJhY2suY2FsbCh0YXJnZXQsIG5leHQsIGlkeCwg
dGhpcykpIHJldCA9IG5leHQgOwotICAgICAgbGFzdCA9IG5leHQgOwotICAgIH0KLSAgICBuZXh0
ID0gbGFzdCA9IG51bGwgOwotICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQpOwotICAgIHJl
dHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gd2l0
aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBwYXNzZWQgdmFsdWUuIFlvdQotICAgIGNhbiBwYXNz
IGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVy
d2lzZQotICAgIHRoaXMgd2lsbCBtYXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8g
YHRydWVgLgotCi0gICAgVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBtb3JlIGdlbmVy
aWMgYGZpbmQoKWAgbWV0aG9kLgotCi0gICAgQG1ldGhvZCBmaW5kQnkKLSAgICBAcGFyYW0ge1N0
cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1
ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge09iamVjdH0g
Zm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYAotICAqLwotICBmaW5kQnk6IGZ1bmN0aW9uKGtleSwg
dmFsdWUpIHsKLSAgICByZXR1cm4gdGhpcy5maW5kKGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRz
KSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgZmlyc3QgaXRlbSB3aXRoIGEgcHJv
cGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2YWx1ZS4gWW91Ci0gICAgY2FuIHBhc3MgYW4gb3B0
aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCi0g
ICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAu
Ci0KLSAgICBUaGlzIG1ldGhvZCB3b3JrcyBtdWNoIGxpa2UgdGhlIG1vcmUgZ2VuZXJpYyBgZmlu
ZCgpYCBtZXRob2QuCi0KLSAgICBAbWV0aG9kIGZpbmRQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVl
XSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7T2JqZWN0fSBm
b3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgCi0gICAgQGRlcHJlY2F0ZWQgVXNlIGBmaW5kQnlgIGlu
c3RlYWQKLSAgKi8KLSAgZmluZFByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnZmluZEJ5Jyks
Ci0KLSAgLyoqCi0gICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1
cm5zIHRydWUgZm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29y
cmVzcG9uZHMgd2l0aCB0aGUgYGV2ZXJ5KClgIG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4KLQot
ICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxv
d2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0g
ICAgYGBgCi0KLSAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRp
b24uCi0gICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24u
Ci0gICAgLSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQot
ICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCBvciBgZmFsc2VgLgotCi0gICAgTm90ZSB0
aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlv
bmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUg
Y29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1
bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBFeGFtcGxlIFVzYWdl
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGlmIChwZW9wbGUuZXZlcnkoaXNFbmdpbmVlcikp
IHsgUGF5Y2hlY2tzLmFkZEJpZ0JvbnVzKCk7IH0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXZl
cnkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UK
LSAgICBAcmV0dXJuIHtCb29sZWFufQotICAqLwotICBldmVyeTogZnVuY3Rpb24oY2FsbGJhY2ss
IHRhcmdldCkgewotICAgIHJldHVybiAhdGhpcy5maW5kKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewot
ICAgICAgcmV0dXJuICFjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LCBpKTsKLSAgICB9KTsK
LSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGV2ZXJ5QnkKLSAgICBAcGFyYW0ge1N0cmluZ30g
a2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0
aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEBkZXByZWNhdGVkIFVzZSBgaXNFdmVy
eWAgaW5zdGVhZAotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGV2ZXJ5Qnk6IEVtYmVy
LmFsaWFzTWV0aG9kKCdpc0V2ZXJ5JyksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBldmVyeVByb3Bl
cnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBw
YXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAg
ICBAZGVwcmVjYXRlZCBVc2UgYGlzRXZlcnlgIGluc3RlYWQKLSAgICBAcmV0dXJuIHtCb29sZWFu
fQotICAqLwotICBldmVyeVByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnaXNFdmVyeScpLAot
Ci0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2
ZXMgdG8gYHRydWVgIGZvciBhbGwgaXRlbXMgaW4KLSAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBt
ZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgotCi0g
ICAgQG1ldGhvZCBpc0V2ZXJ5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkg
dG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRl
c3QgYWdhaW5zdC4KLSAgICBAcmV0dXJuIHtCb29sZWFufQotICAqLwotICBpc0V2ZXJ5OiBmdW5j
dGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUg
cGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCi0gICAgZW51
bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEph
dmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91
bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUg
b3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4
LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0
ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXgg
aW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBv
YmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1
ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAgICBvdGhlcndpc2UuCi0KLSAg
ICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3Mg
YW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNg
IG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRl
cmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KLQotICAgIFVzYWdl
IEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgaWYgKHBlb3BsZS5hbnkoaXNNYW5h
Z2VyKSkgeyBQYXljaGVja3MuYWRkQmlnZ2VyQm9udXMoKTsgfQotICAgIGBgYAotCi0gICAgQG1l
dGhvZCBhbnkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0
byB1c2UKLSAgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlv
biByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0ZW0KLSAgKi8KLSAgYW55OiBmdW5jdGlvbihjYWxs
YmFjaywgdGFyZ2V0KSB7Ci0gICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGZ1bmN0aW9uKHgsIGlk
eCwgaSkgewotICAgICAgcmV0dXJuICEhY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7
Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlwZW9mIGZvdW5kICE9PSAndW5kZWZpbmVkJzsKLSAg
fSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJl
dHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29y
cmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgotCi0g
ICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93
aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAg
ICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlv
bi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4K
LSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0g
ICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhl
IHJlc3VsdHMsIGBmYWxzZWAKLSAgICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRk
aXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0
Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBU
aGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNj
ZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KLQotICAgIFVzYWdlIEV4YW1wbGU6Ci0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgaWYgKHBlb3BsZS5zb21lKGlzTWFuYWdlcikpIHsgUGF5Y2hlY2tz
LmFkZEJpZ2dlckJvbnVzKCk7IH0KLSAgICBgYGAKLQotICAgIEBtZXRob2Qgc29tZQotICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1
cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVg
IGZvciBhbnkgaXRlbQotICAgIEBkZXByZWNhdGVkIFVzZSBgYW55YCBpbnN0ZWFkCi0gICovCi0g
IHNvbWU6IEVtYmVyLmFsaWFzTWV0aG9kKCdhbnknKSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0
cnVlYCBpZiB0aGUgcGFzc2VkIHByb3BlcnR5IHJlc29sdmVzIHRvIGB0cnVlYCBmb3IgYW55IGl0
ZW0gaW4KLSAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9m
YXN0ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgotCi0gICAgQG1ldGhvZCBpc0FueQotICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmlu
Z30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7
Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9y
IGFueSBpdGVtCi0gICovCi0gIGlzQW55OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0
dXJuIHRoaXMuYW55KGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCBhbnlCeQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5
IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0
ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQg
ZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGFueSBpdGVtCi0gICAgQGRlcHJlY2F0ZWQgVXNl
IGBpc0FueWAgaW5zdGVhZAotICAqLwotICBhbnlCeTogRW1iZXIuYWxpYXNNZXRob2QoJ2lzQW55
JyksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBzb21lUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmlu
Z30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0g
b3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0
cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQot
ICAgIEBkZXByZWNhdGVkIFVzZSBgaXNBbnlgIGluc3RlYWQKLSAgKi8KLSAgc29tZVByb3BlcnR5
OiBFbWJlci5hbGlhc01ldGhvZCgnaXNBbnknKSwKLQotICAvKioKLSAgICBUaGlzIHdpbGwgY29t
YmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9yIGludG8gYSBzaW5nbGUgdmFsdWUuIEl0
Ci0gICAgaXMgYSB1c2VmdWwgd2F5IHRvIGNvbGxlY3QgYSBzdW1tYXJ5IHZhbHVlIGZyb20gYW4g
ZW51bWVyYXRpb24uIFRoaXMKLSAgICBjb3JyZXNwb25kcyB0byB0aGUgYHJlZHVjZSgpYCBtZXRo
b2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEuOC4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAg
IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5j
dGlvbihwcmV2aW91c1ZhbHVlLCBpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0K
LSAgICAtIGBwcmV2aW91c1ZhbHVlYCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3Qg
Y2FsbCB0byB0aGUgaXRlcmF0b3IuCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBp
biB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0
aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVj
dCBpdHNlbGYuCi0KLSAgICBSZXR1cm4gdGhlIG5ldyBjdW11bGF0aXZlIHZhbHVlLgotCi0gICAg
SW4gYWRkaXRpb24gdG8gdGhlIGNhbGxiYWNrIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFs
VmFsdWVgLiBBbiBlcnJvcgotICAgIHdpbGwgYmUgcmFpc2VkIGlmIHlvdSBkbyBub3QgcGFzcyBh
biBpbml0aWFsIHZhbHVlIGFuZCB0aGUgZW51bWVyYXRvciBpcwotICAgIGVtcHR5LgotCi0gICAg
Tm90ZSB0aGF0IHVubGlrZSB0aGUgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3Qg
YWxsb3cgeW91IHRvCi0gICAgcGFzcyBhIHRhcmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9y
IHRoZSBjYWxsYmFjay4gSXQncyBwYXJ0IG9mIHRoZQotICAgIHNwZWMuIFNvcnJ5LgotCi0gICAg
QG1ldGhvZCByZWR1Y2UKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJh
Y2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsVmFsdWUgSW5pdGlhbCB2
YWx1ZSBmb3IgdGhlIHJlZHVjZQotICAgIEBwYXJhbSB7U3RyaW5nfSByZWR1Y2VyUHJvcGVydHkg
aW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1
ZS4KLSAgKi8KLSAgcmVkdWNlOiBmdW5jdGlvbihjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCByZWR1
Y2VyUHJvcGVydHkpIHsKLSAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7
IHRocm93IG5ldyBUeXBlRXJyb3IoKTsgfQotCi0gICAgdmFyIHJldCA9IGluaXRpYWxWYWx1ZTsK
LQotICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpKSB7Ci0gICAgICByZXQgPSBjYWxs
YmFjay5jYWxsKG51bGwsIHJldCwgaXRlbSwgaSwgdGhpcywgcmVkdWNlclByb3BlcnR5KTsKLSAg
ICB9LCB0aGlzKTsKLQotICAgIHJldHVybiByZXQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSW52b2tl
cyB0aGUgbmFtZWQgbWV0aG9kIG9uIGV2ZXJ5IG9iamVjdCBpbiB0aGUgcmVjZWl2ZXIgdGhhdAot
ICAgIGltcGxlbWVudHMgaXQuIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbXBsZW1l
bnRhdGlvbiBpbgotICAgIFByb3RvdHlwZSAxLjYuCi0KLSAgICBAbWV0aG9kIGludm9rZQotICAg
IEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICBA
cGFyYW0ge09iamVjdC4uLn0gYXJncyBvcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBhcyB3ZWxs
LgotICAgIEByZXR1cm4ge0FycmF5fSByZXR1cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZva2Uu
Ci0gICovCi0gIGludm9rZTogZnVuY3Rpb24obWV0aG9kTmFtZSkgewotICAgIHZhciBhcmdzLCBy
ZXQgPSBFbWJlci5BKCk7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg+MSkgYXJncyA9IGFfc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlk
eCkgewotICAgICAgdmFyIG1ldGhvZCA9IHggJiYgeFttZXRob2ROYW1lXTsKLSAgICAgIGlmICgn
ZnVuY3Rpb24nID09PSB0eXBlb2YgbWV0aG9kKSB7Ci0gICAgICAgIHJldFtpZHhdID0gYXJncyA/
IG1ldGhvZC5hcHBseSh4LCBhcmdzKSA6IG1ldGhvZC5jYWxsKHgpOwotICAgICAgfQotICAgIH0s
IHRoaXMpOwotCi0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAvKioKLSAgICBTaW1wbHkgY29u
dmVydHMgdGhlIGVudW1lcmFibGUgaW50byBhIGdlbnVpbmUgYXJyYXkuIFRoZSBvcmRlciBpcyBu
b3QKLSAgICBndWFyYW50ZWVkLiBDb3JyZXNwb25kcyB0byB0aGUgbWV0aG9kIGltcGxlbWVudGVk
IGJ5IFByb3RvdHlwZS4KLQotICAgIEBtZXRob2QgdG9BcnJheQotICAgIEByZXR1cm4ge0FycmF5
fSB0aGUgZW51bWVyYWJsZSBhcyBhbiBhcnJheS4KLSAgKi8KLSAgdG9BcnJheTogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHJldCA9IEVtYmVyLkEoKTsKLSAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24o
bywgaWR4KSB7IHJldFtpZHhdID0gbzsgfSk7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIGFycmF5IHdpdGggYWxsIG51bGwgYW5kIHVu
ZGVmaW5lZCBlbGVtZW50cyByZW1vdmVkLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBh
cnIgPSBbImEiLCBudWxsLCAiYyIsIHVuZGVmaW5lZF07Ci0gICAgYXJyLmNvbXBhY3QoKTsgIC8v
IFsiYSIsICJjIl0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgY29tcGFjdAotICAgIEByZXR1cm4g
e0FycmF5fSB0aGUgYXJyYXkgd2l0aG91dCBudWxsIGFuZCB1bmRlZmluZWQgZWxlbWVudHMuCi0g
ICovCi0gIGNvbXBhY3Q6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5j
dGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUgIT0gbnVsbDsgfSk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgZXhjbHVkZXMgdGhlIHBhc3NlZCB2YWx1
ZS4gVGhlIGRlZmF1bHQKLSAgICBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJlZ2Fy
ZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUgdW5sZXNzCi0gICAgdGhlIHJlY2VpdmVyIGRvZXMg
bm90IGNvbnRhaW4gdGhlIHZhbHVlLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIg
PSBbImEiLCAiYiIsICJhIiwgImMiXTsKLSAgICBhcnIud2l0aG91dCgiYSIpOyAgLy8gWyJiIiwg
ImMiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCB3aXRob3V0Ci0gICAgQHBhcmFtIHtPYmplY3R9
IHZhbHVlCi0gICAgQHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KLSAgKi8KLSAgd2l0aG91dDog
ZnVuY3Rpb24odmFsdWUpIHsKLSAgICBpZiAoIXRoaXMuY29udGFpbnModmFsdWUpKSByZXR1cm4g
dGhpczsgLy8gbm90aGluZyB0byBkbwotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhp
cy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKLSAgICAgIGlmIChrICE9PSB2YWx1ZSkgcmV0W3JldC5s
ZW5ndGhdID0gazsKLSAgICB9KSA7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB1bmlxdWUgdmFs
dWVzLiBUaGUgZGVmYXVsdAotICAgIGltcGxlbWVudGF0aW9uIHJldHVybnMgYW4gYXJyYXkgcmVn
YXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlwZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgYXJyID0gWyJhIiwgImEiLCAiYiIsICJiIl07Ci0gICAgYXJyLnVuaXEoKTsgIC8vIFsiYSIs
ICJiIl0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgdW5pcQotICAgIEByZXR1cm4ge0VtYmVyLkVu
dW1lcmFibGV9Ci0gICovCi0gIHVuaXE6IGZ1bmN0aW9uKCkgewotICAgIHZhciByZXQgPSBFbWJl
ci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKLSAgICAgIGlmIChhX2luZGV4
T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsKLSAgICB9KTsKLSAgICByZXR1cm4gcmV0OwotICB9
LAotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVydHkgd2lsbCB0cmlnZ2VyIGFueXRpbWUgdGhlIGVu
dW1lcmFibGUncyBjb250ZW50IGNoYW5nZXMuCi0gICAgWW91IGNhbiBvYnNlcnZlIHRoaXMgcHJv
cGVydHkgdG8gYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgZW51bWVyYWJsZXMKLSAgICBj
b250ZW50LgotCi0gICAgRm9yIHBsYWluIGVudW1lcmFibGVzLCB0aGlzIHByb3BlcnR5IGlzIHJl
YWQgb25seS4gYEVtYmVyLkFycmF5YCBvdmVycmlkZXMKLSAgICB0aGlzIG1ldGhvZC4KLQotICAg
IEBwcm9wZXJ0eSBbXQotICAgIEB0eXBlIEVtYmVyLkFycmF5Ci0gICAgQHJldHVybiB0aGlzCi0g
ICovCi0gICdbXSc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSksCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBFTlVNRVJBQkxFIE9CU0VSVkVSUwot
ICAvLwotCi0gIC8qKgotICAgIFJlZ2lzdGVycyBhbiBlbnVtZXJhYmxlIG9ic2VydmVyLiBNdXN0
IGltcGxlbWVudCBgRW1iZXIuRW51bWVyYWJsZU9ic2VydmVyYAotICAgIG1peGluLgotCi0gICAg
QG1ldGhvZCBhZGRFbnVtZXJhYmxlT2JzZXJ2ZXIKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0
Ci0gICAgQHBhcmFtIHtIYXNofSBbb3B0c10KLSAgICBAcmV0dXJuIHRoaXMKLSAgKi8KLSAgYWRk
RW51bWVyYWJsZU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsKLSAgICB2YXIgd2ls
bENoYW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2VudW1lcmFibGVXaWxsQ2hh
bmdlJywKLSAgICAgICAgZGlkQ2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAn
ZW51bWVyYWJsZURpZENoYW5nZSc7Ci0KLSAgICB2YXIgaGFzT2JzZXJ2ZXJzID0gZ2V0KHRoaXMs
ICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7Ci0gICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVy
LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAg
IEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdp
bGxDaGFuZ2UpOwotICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpjaGFu
Z2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0gICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVyLnBy
b3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7Ci0gICAgcmV0
dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhIHJlZ2lzdGVyZWQgZW51bWVy
YWJsZSBvYnNlcnZlci4KLQotICAgIEBtZXRob2QgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAotICAgIEBwYXJhbSB7SGFzaH0gW29wdHNdCi0gICAg
QHJldHVybiB0aGlzCi0gICovCi0gIHJlbW92ZUVudW1lcmFibGVPYnNlcnZlcjogZnVuY3Rpb24o
dGFyZ2V0LCBvcHRzKSB7Ci0gICAgdmFyIHdpbGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxD
aGFuZ2UpIHx8ICdlbnVtZXJhYmxlV2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAo
b3B0cyAmJiBvcHRzLmRpZENoYW5nZSkgfHwgJ2VudW1lcmFibGVEaWRDaGFuZ2UnOwotCi0gICAg
dmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwot
ICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFz
RW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdA
ZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLnJlbW92
ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7
Ci0gICAgaWYgKGhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hh
c0VudW1lcmFibGVPYnNlcnZlcnMnKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioK
LSAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2
ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAgICBvbiB0aGUgYXJyYXkuCi0KLSAgICBAcHJvcGVydHkg
aGFzRW51bWVyYWJsZU9ic2VydmVycwotICAgIEB0eXBlIEJvb2xlYW4KLSAgKi8KLSAgaGFzRW51
bWVyYWJsZU9ic2VydmVyczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdlJykgfHwgRW1iZXIu
aGFzTGlzdGVuZXJzKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnKTsKLSAgfSksCi0KLQotICAv
KioKLSAgICBJbnZva2UgdGhpcyBtZXRob2QganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHlv
dXIgZW51bWVyYWJsZSB3aWxsCi0gICAgY2hhbmdlLiBZb3UgY2FuIGVpdGhlciBvbWl0IHRoZSBw
YXJhbWV0ZXJzIGNvbXBsZXRlbHkgb3IgcGFzcyB0aGUgb2JqZWN0cwotICAgIHRvIGJlIHJlbW92
ZWQgb3IgYWRkZWQgaWYgYXZhaWxhYmxlIG9yIGp1c3QgYSBjb3VudC4KLQotICAgIEBtZXRob2Qg
ZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxl
fE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0bwotICAgICAg
YmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0gICAgQHBh
cmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gYWRkaW5nIEFuIGVudW1lcmFibGUgb2YgdGhl
IG9iamVjdHMgdG8gYmUKLSAgICAgIGFkZGVkIG9yIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUg
YWRkZWQuCi0gICAgQGNoYWluYWJsZQotICAqLwotICBlbnVtZXJhYmxlQ29udGVudFdpbGxDaGFu
Z2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBhZGRpbmcpIHsKLQotICAgIHZhciByZW1vdmVDbnQsIGFk
ZENudCwgaGFzRGVsdGE7Ci0KLSAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiByZW1vdmluZykg
cmVtb3ZlQ250ID0gcmVtb3Zpbmc7Ci0gICAgZWxzZSBpZiAocmVtb3ZpbmcpIHJlbW92ZUNudCA9
IGdldChyZW1vdmluZywgJ2xlbmd0aCcpOwotICAgIGVsc2UgcmVtb3ZlQ250ID0gcmVtb3Zpbmcg
PSAtMTsKLQotICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRk
aW5nOwotICAgIGVsc2UgaWYgKGFkZGluZykgYWRkQ250ID0gZ2V0KGFkZGluZywnbGVuZ3RoJyk7
Ci0gICAgZWxzZSBhZGRDbnQgPSBhZGRpbmcgPSAtMTsKLQotICAgIGhhc0RlbHRhID0gYWRkQ250
PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9PTA7Ci0KLSAgICBpZiAocmVt
b3ZpbmcgPT09IC0xKSByZW1vdmluZyA9IG51bGw7Ci0gICAgaWYgKGFkZGluZyAgID09PSAtMSkg
YWRkaW5nICAgPSBudWxsOwotCi0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdb
XScpOwotICAgIGlmIChoYXNEZWx0YSkgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICds
ZW5ndGgnKTsKLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BlbnVtZXJhYmxlOmJlZm9yZScs
IFt0aGlzLCByZW1vdmluZywgYWRkaW5nXSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQot
ICAvKioKLSAgICBJbnZva2UgdGhpcyBtZXRob2Qgd2hlbiB0aGUgY29udGVudHMgb2YgeW91ciBl
bnVtZXJhYmxlIGhhcyBjaGFuZ2VkLgotICAgIFRoaXMgd2lsbCBub3RpZnkgYW55IG9ic2VydmVy
cyB3YXRjaGluZyBmb3IgY29udGVudCBjaGFuZ2VzLiBJZiB5b3VyIGFyZQotICAgIGltcGxlbWVu
dGluZyBhbiBvcmRlcmVkIGVudW1lcmFibGUgKHN1Y2ggYXMgYW4gYXJyYXkpLCBhbHNvIHBhc3Mg
dGhlCi0gICAgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgd2hlcmUgdGhlIGNvbnRlbnQgY2hhbmdlZCBz
byB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvCi0gICAgbm90aWZ5IHJhbmdlIG9ic2VydmVycy4KLQot
ICAgIEBtZXRob2QgZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UKLSAgICBAcGFyYW0ge051bWJl
cn0gW3N0YXJ0XSBvcHRpb25hbCBzdGFydCBvZmZzZXQgZm9yIHRoZSBjb250ZW50IGNoYW5nZS4K
LSAgICAgIEZvciB1bm9yZGVyZWQgZW51bWVyYWJsZXMsIHlvdSBzaG91bGQgYWx3YXlzIHBhc3Mg
LTEuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51
bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0bwotICAgICAgYmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVy
IG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51
bWJlcn0gYWRkaW5nICBBbiBlbnVtZXJhYmxlIG9mIHRoZSBvYmplY3RzIHRvCi0gICAgICBiZSBh
ZGRlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGFkZGVkLgotICAgIEBjaGFpbmFibGUK
LSAgKi8KLSAgZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBh
ZGRpbmcpIHsKLSAgICB2YXIgcmVtb3ZlQ250LCBhZGRDbnQsIGhhc0RlbHRhOwotCi0gICAgaWYg
KCdudW1iZXInID09PSB0eXBlb2YgcmVtb3ZpbmcpIHJlbW92ZUNudCA9IHJlbW92aW5nOwotICAg
IGVsc2UgaWYgKHJlbW92aW5nKSByZW1vdmVDbnQgPSBnZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsK
LSAgICBlbHNlIHJlbW92ZUNudCA9IHJlbW92aW5nID0gLTE7Ci0KLSAgICBpZiAoJ251bWJlcicg
PT09IHR5cGVvZiBhZGRpbmcpIGFkZENudCA9IGFkZGluZzsKLSAgICBlbHNlIGlmIChhZGRpbmcp
IGFkZENudCA9IGdldChhZGRpbmcsICdsZW5ndGgnKTsKLSAgICBlbHNlIGFkZENudCA9IGFkZGlu
ZyA9IC0xOwotCi0gICAgaGFzRGVsdGEgPSBhZGRDbnQ8MCB8fCByZW1vdmVDbnQ8MCB8fCBhZGRD
bnQtcmVtb3ZlQ250IT09MDsKLQotICAgIGlmIChyZW1vdmluZyA9PT0gLTEpIHJlbW92aW5nID0g
bnVsbDsKLSAgICBpZiAoYWRkaW5nICAgPT09IC0xKSBhZGRpbmcgICA9IG51bGw7Ci0KLSAgICBF
bWJlci5zZW5kRXZlbnQodGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScsIFt0aGlzLCByZW1vdmlu
ZywgYWRkaW5nXSk7Ci0gICAgaWYgKGhhc0RlbHRhKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0
aGlzLCAnbGVuZ3RoJyk7Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ1tdJyk7
Ci0KLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ29udmVydHMgdGhlIGVu
dW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQgc29ydHMgYnkgdGhlIGtleXMKLSAgICBzcGVjaWZp
ZWQgaW4gdGhlIGFyZ3VtZW50LgotCi0gICAgWW91IG1heSBwcm92aWRlIG11bHRpcGxlIGFyZ3Vt
ZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHByb3BlcnRpZXMuCi0KLSAgICBAbWV0aG9kIHNvcnRC
eQotICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lKHMpIHRvIHNvcnQgb24KLSAgICBA
cmV0dXJuIHtBcnJheX0gVGhlIHNvcnRlZCBhcnJheS4KLSAgICAqLwotICBzb3J0Qnk6IGZ1bmN0
aW9uKCkgewotICAgIHZhciBzb3J0S2V5cyA9IGFyZ3VtZW50czsKLSAgICByZXR1cm4gdGhpcy50
b0FycmF5KCkuc29ydChmdW5jdGlvbihhLCBiKXsKLSAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBz
b3J0S2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICB2YXIga2V5ID0gc29ydEtleXNbaV0sCi0g
ICAgICAgIHByb3BBID0gZ2V0KGEsIGtleSksCi0gICAgICAgIHByb3BCID0gZ2V0KGIsIGtleSk7
Ci0gICAgICAgIC8vIHJldHVybiAxIG9yIC0xIGVsc2UgY29udGludWUgdG8gdGhlIG5leHQgc29y
dEtleQotICAgICAgICB2YXIgY29tcGFyZVZhbHVlID0gRW1iZXIuY29tcGFyZShwcm9wQSwgcHJv
cEIpOwotICAgICAgICBpZiAoY29tcGFyZVZhbHVlKSB7IHJldHVybiBjb21wYXJlVmFsdWU7IH0K
LSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0pOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCi0qLwotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCi0vLyBIRUxQRVJTCi0vLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsIGlzTm9uZSA9IEVtYmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51
bWVyYWJsZVV0aWxzLm1hcCwgY2FjaGVGb3IgPSBFbWJlci5jYWNoZUZvcjsKLQotLy8gLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8g
QVJSQVkKLS8vCi0vKioKLSAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBPYnNlcnZlci1mcmllbmRs
eSBBcnJheS1saWtlIGJlaGF2aW9yLiBUaGlzIG1peGluIGlzCi0gIHBpY2tlZCB1cCBieSB0aGUg
QXJyYXkgY2xhc3MgYXMgd2VsbCBhcyBvdGhlciBjb250cm9sbGVycywgZXRjLiB0aGF0IHdhbnQg
dG8KLSAgYXBwZWFyIHRvIGJlIGFycmF5cy4KLQotICBVbmxpa2UgYEVtYmVyLkVudW1lcmFibGUs
YCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9kcyBzcGVjaWZpY2FsbHkgZm9yCi0gIGNvbGxlY3Rp
b25zIHRoYXQgcHJvdmlkZSBpbmRleC1vcmRlcmVkIGFjY2VzcyB0byB0aGVpciBjb250ZW50cy4g
V2hlbiB5b3UKLSAgYXJlIGRlc2lnbmluZyBjb2RlIHRoYXQgbmVlZHMgdG8gYWNjZXB0IGFueSBr
aW5kIG9mIEFycmF5LWxpa2Ugb2JqZWN0LCB5b3UKLSAgc2hvdWxkIHVzZSB0aGVzZSBtZXRob2Rz
IGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZlcyBiZWNhdXNlIHRoZXNlIHdpbGwKLSAgcHJvcGVy
bHkgbm90aWZ5IG9ic2VydmVycyBvZiBjaGFuZ2VzIHRvIHRoZSBhcnJheS4KLQotICBBbHRob3Vn
aCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2llbnQsIHRoZXkgZG8gYWRkIGEgbGF5ZXIgb2YgaW5k
aXJlY3Rpb24gdG8KLSAgeW91ciBhcHBsaWNhdGlvbiBzbyBpdCBpcyBhIGdvb2QgaWRlYSB0byB1
c2UgdGhlbSBvbmx5IHdoZW4geW91IG5lZWQgdGhlCi0gIGZsZXhpYmlsaXR5IG9mIHVzaW5nIGJv
dGggdHJ1ZSBKYXZhU2NyaXB0IGFycmF5cyBhbmQgInZpcnR1YWwiIGFycmF5cyBzdWNoCi0gIGFz
IGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9ucy4KLQotICBZb3UgY2FuIHVzZSB0aGUgbWV0aG9k
cyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRvIGFjY2VzcyBhbmQgbW9kaWZ5IGFycmF5Ci0gIGNv
bnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5IHdheS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdo
ZW5ldmVyIHRoZQotICBtZW1iZXJzaGlwIG9mIGFuIGFycmF5IGNoYW5nZXMgYnkgY2hhbmdpbmcg
dGhlIHN5bnRheCBvZiB0aGUgcHJvcGVydHkgdG8KLSAgYC5vYnNlcnZlcygnKm15UHJvcGVydHku
W10nKWAuCi0KLSAgVG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgIGluIHlvdXIgb3duIGNsYXNzLCB5
b3UgbXVzdCBvdmVycmlkZSB0d28KLSAgcHJpbWl0aXZlcyB0byB1c2UgaXQ6IGByZXBsYWNlKClg
IGFuZCBgb2JqZWN0QXQoKWAuCi0KLSAgTm90ZSB0aGF0IHRoZSBFbWJlci5BcnJheSBtaXhpbiBh
bHNvIGluY29ycG9yYXRlcyB0aGUgYEVtYmVyLkVudW1lcmFibGVgCi0gIG1peGluLiBBbGwgYEVt
YmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJlIGFsc28gZW51bWVyYWJsZS4KLQotICBAY2xhc3Mg
QXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0gIEBz
aW5jZSBFbWJlciAwLjkuMAotKi8KLUVtYmVyLkFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVt
YmVyLkVudW1lcmFibGUsIHsKLQotICAvKioKLSAgICBZb3VyIGFycmF5IG11c3Qgc3VwcG9ydCB0
aGUgYGxlbmd0aGAgcHJvcGVydHkuIFlvdXIgcmVwbGFjZSBtZXRob2RzIHNob3VsZAotICAgIHNl
dCB0aGlzIHByb3BlcnR5IHdoZW5ldmVyIGl0IGNoYW5nZXMuCi0KLSAgICBAcHJvcGVydHkge051
bWJlcn0gbGVuZ3RoCi0gICovCi0gIGxlbmd0aDogRW1iZXIucmVxdWlyZWQoKSwKLQotICAvKioK
LSAgICBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGBpbmRleGAuIElmIHRoZSBnaXZl
biBgaW5kZXhgIGlzIG5lZ2F0aXZlCi0gICAgb3IgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRo
ZSBhcnJheSBsZW5ndGgsIHJldHVybnMgYHVuZGVmaW5lZGAuCi0KLSAgICBUaGlzIGlzIG9uZSBv
ZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJy
YXlgLgotICAgIElmIHlvdXIgb2JqZWN0IHN1cHBvcnRzIHJldHJpZXZpbmcgdGhlIHZhbHVlIG9m
IGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgpYAotICAgIChpLmUuIGBteUFycmF5LmdldCgwKWAp
LCB0aGVuIHlvdSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICB5b3Vy
c2VsZi4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycs
ICdkJ107Ci0gICAgYXJyLm9iamVjdEF0KDApOyAgIC8vICJhIgotICAgIGFyci5vYmplY3RBdCgz
KTsgICAvLyAiZCIKLSAgICBhcnIub2JqZWN0QXQoLTEpOyAgLy8gdW5kZWZpbmVkCi0gICAgYXJy
Lm9iamVjdEF0KDQpOyAgIC8vIHVuZGVmaW5lZAotICAgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1
bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBtZXRob2Qgb2JqZWN0QXQKLSAgICBAcGFyYW0ge051
bWJlcn0gaWR4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4uCi0gICAgQHJldHVybiB7
Kn0gaXRlbSBhdCBpbmRleCBvciB1bmRlZmluZWQKLSAgKi8KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9u
KGlkeCkgewotICAgIGlmICgoaWR4IDwgMCkgfHwgKGlkeD49Z2V0KHRoaXMsICdsZW5ndGgnKSkp
IHJldHVybiB1bmRlZmluZWQgOwotICAgIHJldHVybiBnZXQodGhpcywgaWR4KTsKLSAgfSwKLQot
ICAvKioKLSAgICBUaGlzIHJldHVybnMgdGhlIG9iamVjdHMgYXQgdGhlIHNwZWNpZmllZCBpbmRl
eGVzLCB1c2luZyBgb2JqZWN0QXRgLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIg
PcKgWydhJywgJ2InLCAnYycsICdkJ107Ci0gICAgYXJyLm9iamVjdHNBdChbMCwgMSwgMl0pOyAg
Ly8gWyJhIiwgImIiLCAiYyJdCi0gICAgYXJyLm9iamVjdHNBdChbMiwgMywgNF0pOyAgLy8gWyJj
IiwgImQiLCB1bmRlZmluZWRdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIG9iamVjdHNBdAotICAg
IEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgQW4gYXJyYXkgb2YgaW5kZXhlcyBvZiBpdGVtcyB0byBy
ZXR1cm4uCi0gICAgQHJldHVybiB7QXJyYXl9Ci0gICAqLwotICBvYmplY3RzQXQ6IGZ1bmN0aW9u
KGluZGV4ZXMpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgcmV0dXJuIG1hcChpbmRleGVz
LCBmdW5jdGlvbihpZHgpIHsgcmV0dXJuIHNlbGYub2JqZWN0QXQoaWR4KTsgfSk7Ci0gIH0sCi0K
LSAgLy8gb3ZlcnJpZGVzIEVtYmVyLkVudW1lcmFibGUgdmVyc2lvbgotICBuZXh0T2JqZWN0OiBm
dW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4gdGhpcy5vYmplY3RBdChpZHgpOwotICB9LAotCi0g
IC8qKgotICAgIFRoaXMgaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWFsIGFycmF5IGNvbnRl
bnQgcHJvcGVydHkuIElmIHlvdSBnZXQKLSAgICB0aGlzIHByb3BlcnR5LCBpdCB3aWxsIHJldHVy
biB0aGlzLiBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgaXQgYSBuZXcKLSAgICBhcnJheSwgaXQg
d2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGNvbnRlbnQuCi0KLSAgICBUaGlzIHByb3BlcnR5IG92
ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxl
YC4KLQotICAgIEBwcm9wZXJ0eSBbXQotICAgIEByZXR1cm4gdGhpcwotICAqLwotICAnW10nOiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1
bmRlZmluZWQpIHRoaXMucmVwbGFjZSgwLCBnZXQodGhpcywgJ2xlbmd0aCcpLCB2YWx1ZSkgOwot
ICAgIHJldHVybiB0aGlzIDsKLSAgfSksCi0KLSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLm9iamVjdEF0KDApOwotICB9KSwKLQotICBs
YXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5v
YmplY3RBdChnZXQodGhpcywgJ2xlbmd0aCcpLTEpOwotICB9KSwKLQotICAvLyBvcHRpbWl6ZWQg
dmVyc2lvbiBmcm9tIEVudW1lcmFibGUKLSAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewotICAg
IHJldHVybiB0aGlzLmluZGV4T2Yob2JqKSA+PSAwOwotICB9LAotCi0gIC8vIEFkZCBhbnkgZXh0
cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0aGF0IGFyZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWlu
IEFycmF5LgotICAvKioKLSAgICBSZXR1cm5zIGEgbmV3IGFycmF5IHRoYXQgaXMgYSBzbGljZSBv
ZiB0aGUgcmVjZWl2ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAgICB1c2VzIHRoZSBvYnNlcnZh
YmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG9iamVjdHMgZm9yIHRoZSBuZXcKLSAg
ICBzbGljZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgYXJyID0gWydyZWQnLCAnZ3Jl
ZW4nLCAnYmx1ZSddOwotICAgIGFyci5zbGljZSgwKTsgICAgICAgLy8gWydyZWQnLCAnZ3JlZW4n
LCAnYmx1ZSddCi0gICAgYXJyLnNsaWNlKDAsIDIpOyAgICAvLyBbJ3JlZCcsICdncmVlbiddCi0g
ICAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBbJ2dyZWVuJywgJ2JsdWUnXQotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCBzbGljZQotICAgIEBwYXJhbSB7SW50ZWdlcn0gYmVnaW5JbmRleCAoT3B0aW9u
YWwpIGluZGV4IHRvIGJlZ2luIHNsaWNpbmcgZnJvbS4KLSAgICBAcGFyYW0ge0ludGVnZXJ9IGVu
ZEluZGV4IChPcHRpb25hbCkgaW5kZXggdG8gZW5kIHRoZSBzbGljZSBhdC4KLSAgICBAcmV0dXJu
IHtBcnJheX0gTmV3IGFycmF5IHdpdGggc3BlY2lmaWVkIHNsaWNlCi0gICovCi0gIHNsaWNlOiBm
dW5jdGlvbihiZWdpbkluZGV4LCBlbmRJbmRleCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7
Ci0gICAgdmFyIGxlbmd0aCA9IGdldCh0aGlzLCAnbGVuZ3RoJykgOwotICAgIGlmIChpc05vbmUo
YmVnaW5JbmRleCkpIGJlZ2luSW5kZXggPSAwIDsKLSAgICBpZiAoaXNOb25lKGVuZEluZGV4KSB8
fCAoZW5kSW5kZXggPiBsZW5ndGgpKSBlbmRJbmRleCA9IGxlbmd0aCA7Ci0KLSAgICBpZiAoYmVn
aW5JbmRleCA8IDApIGJlZ2luSW5kZXggPSBsZW5ndGggKyBiZWdpbkluZGV4OwotICAgIGlmIChl
bmRJbmRleCA8IDApIGVuZEluZGV4ID0gbGVuZ3RoICsgZW5kSW5kZXg7Ci0KLSAgICB3aGlsZShi
ZWdpbkluZGV4IDwgZW5kSW5kZXgpIHsKLSAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHRoaXMub2Jq
ZWN0QXQoYmVnaW5JbmRleCsrKSA7Ci0gICAgfQotICAgIHJldHVybiByZXQgOwotICB9LAotCi0g
IC8qKgotICAgIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QncyBmaXJzdCBv
Y2N1cnJlbmNlLgotICAgIElmIG5vIGBzdGFydEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHN0
YXJ0aW5nIGxvY2F0aW9uIHRvCi0gICAgc2VhcmNoIGlzIDAuIElmIGl0J3MgbmVnYXRpdmUsIHdp
bGwgY291bnQgYmFja3dhcmQgZnJvbQotICAgIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5z
IC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBh
cnIgPSBbImEiLCAiYiIsICJjIiwgImQiLCAiYSJdOwotICAgIGFyci5pbmRleE9mKCJhIik7ICAg
ICAgIC8vICAwCi0gICAgYXJyLmluZGV4T2YoInoiKTsgICAgICAgLy8gLTEKLSAgICBhcnIuaW5k
ZXhPZigiYSIsIDIpOyAgICAvLyAgNAotICAgIGFyci5pbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0
Ci0gICAgYXJyLmluZGV4T2YoImIiLCAzKTsgICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIs
IDEwMCk7ICAvLyAtMQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBpbmRleE9mCi0gICAgQHBhcmFt
IHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yCi0gICAgQHBhcmFtIHtOdW1i
ZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0
IDAKLSAgICBAcmV0dXJuIHtOdW1iZXJ9IGluZGV4IG9yIC0xIGlmIG5vdCBmb3VuZAotICAqLwot
ICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4g
PSBnZXQodGhpcywgJ2xlbmd0aCcpOwotCi0gICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkg
c3RhcnRBdCA9IDA7Ci0gICAgaWYgKHN0YXJ0QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKLQotICAg
IGZvcihpZHg9c3RhcnRBdDtpZHg8bGVuO2lkeCsrKSB7Ci0gICAgICBpZiAodGhpcy5vYmplY3RB
dChpZHgpID09PSBvYmplY3QpIHJldHVybiBpZHggOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCdz
IGxhc3Qgb2NjdXJyZW5jZS4KLSAgICBJZiBubyBgc3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2ZW4s
IHRoZSBzZWFyY2ggc3RhcnRzIGZyb20KLSAgICB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgaXQncyBu
ZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNrd2FyZAotICAgIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJy
YXkuIFJldHVybnMgLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiLCAiZCIsICJhIl07Ci0gICAgYXJyLmxhc3RJ
bmRleE9mKCJhIik7ICAgICAgIC8vICA0Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJ6Iik7ICAgICAg
IC8vIC0xCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgMik7ICAgIC8vICAwCi0gICAgYXJyLmxh
c3RJbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJiIiwgMyk7
ICAgIC8vICAxCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgMTAwKTsgIC8vICA0Ci0gICAgYGBg
Ci0KLSAgICBAbWV0aG9kIGxhc3RJbmRleE9mCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0
aGUgaXRlbSB0byBzZWFyY2ggZm9yCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9u
YWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKLSAgICBAcmV0dXJuIHtO
dW1iZXJ9IGluZGV4IG9yIC0xIGlmIG5vdCBmb3VuZAotICAqLwotICBsYXN0SW5kZXhPZjogZnVu
Y3Rpb24ob2JqZWN0LCBzdGFydEF0KSB7Ci0gICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICds
ZW5ndGgnKTsKLQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQgfHwgc3RhcnRBdCA+PSBs
ZW4pIHN0YXJ0QXQgPSBsZW4tMTsKLSAgICBpZiAoc3RhcnRBdCA8IDApIHN0YXJ0QXQgKz0gbGVu
OwotCi0gICAgZm9yKGlkeD1zdGFydEF0O2lkeD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXMu
b2JqZWN0QXQoaWR4KSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJu
IC0xOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gQVJSQVkgT0JTRVJWRVJTCi0gIC8vCi0KLSAgLyoq
Ci0gICAgQWRkcyBhbiBhcnJheSBvYnNlcnZlciB0byB0aGUgcmVjZWl2aW5nIGFycmF5LiBUaGUg
YXJyYXkgb2JzZXJ2ZXIgb2JqZWN0Ci0gICAgbm9ybWFsbHkgbXVzdCBpbXBsZW1lbnQgdHdvIG1l
dGhvZHM6Ci0KLSAgICAqIGBhcnJheVdpbGxDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1v
dmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBq
dXN0IGJlZm9yZSB0aGUgYXJyYXkgaXMgbW9kaWZpZWQuCi0gICAgKiBgYXJyYXlEaWRDaGFuZ2Uo
b2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9k
IHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBpcyBtb2RpZmllZC4K
LQotICAgIEJvdGggY2FsbGJhY2tzIHdpbGwgYmUgcGFzc2VkIHRoZSBvYnNlcnZlZCBvYmplY3Qs
IHN0YXJ0aW5nIGluZGV4IG9mIHRoZQotICAgIGNoYW5nZSBhcyB3ZWxsIGEgYSBjb3VudCBvZiB0
aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNlCi0gICAgdGhlc2Ug
Y2FsbGJhY2tzIHRvIG9wdGlvbmFsbHkgaW5zcGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFu
Z2UsIGNsZWFyCi0gICAgY2FjaGVzLCBvciBkbyBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNz
YXJ5LgotCi0gICAgSW4gYWRkaXRpb24gdG8gcGFzc2luZyBhIHRhcmdldCwgeW91IGNhbiBhbHNv
IGluY2x1ZGUgYW4gb3B0aW9ucyBoYXNoCi0gICAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3ZlcnJp
ZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiB0aGUKLSAgICB0YXJn
ZXQuCi0KLSAgICBAbWV0aG9kIGFkZEFycmF5T2JzZXJ2ZXIKLSAgICBAcGFyYW0ge09iamVjdH0g
dGFyZ2V0IFRoZSBvYnNlcnZlciBvYmplY3QuCi0gICAgQHBhcmFtIHtIYXNofSBvcHRzIE9wdGlv
bmFsIGhhc2ggb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZwotICAgICAgYHdpbGxD
aGFuZ2VgIGFuZCBgZGlkQ2hhbmdlYCBvcHRpb24uCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9
IHJlY2VpdmVyCi0gICovCi0gIGFkZEFycmF5T2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0
cykgewotICAgIHZhciB3aWxsQ2hhbmdlID0gKG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAn
YXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlk
Q2hhbmdlKSB8fCAnYXJyYXlEaWRDaGFuZ2UnOwotCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdl
dCh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKLSAgICBpZiAoIWhhc09ic2VydmVycykgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVt
YmVyLmFkZExpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdl
KTsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwg
ZGlkQ2hhbmdlKTsKLSAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFu
Z2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgUmVtb3ZlcyBhbiBhcnJheSBvYnNlcnZlciBmcm9tIHRoZSBvYmplY3QgaWYg
dGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKLSAgICByZWdpc3RlcmVkLiBDYWxsaW5nIHRoaXMgbWV0
aG9kIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgb2JqZWN0IHdpbGwKLSAgICBoYXZlIG5v
IGVmZmVjdC4KLQotICAgIEBtZXRob2QgcmVtb3ZlQXJyYXlPYnNlcnZlcgotICAgIEBwYXJhbSB7
T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBvYnNlcnZpbmcgdGhlIGFycmF5LgotICAgIEBwYXJh
bSB7SGFzaH0gb3B0cyBPcHRpb25hbCBoYXNoIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNs
dWRpbmcKLSAgICAgIGB3aWxsQ2hhbmdlYCBhbmQgYGRpZENoYW5nZWAgb3B0aW9uLgotICAgIEBy
ZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgotICAqLwotICByZW1vdmVBcnJheU9ic2VydmVy
OiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsKLSAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYm
IG9wdHMud2lsbENoYW5nZSkgfHwgJ2FycmF5V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5n
ZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5nZSkgfHwgJ2FycmF5RGlkQ2hhbmdlJzsKLQotICAg
IHZhciBoYXNPYnNlcnZlcnMgPSBnZXQodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7Ci0gICAg
aWYgKGhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJh
eU9ic2VydmVycycpOwotICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVm
b3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKLSAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlz
LCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKLSAgICBpZiAoaGFzT2JzZXJ2
ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsK
LSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBCZWNvbWVzIHRydWUgd2hlbmV2
ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAg
ICBvbiB0aGUgYXJyYXkuCi0KLSAgICBAcHJvcGVydHkgQm9vbGVhbgotICAqLwotICBoYXNBcnJh
eU9ic2VydmVyczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVy
Lmhhc0xpc3RlbmVycyh0aGlzLCAnQGFycmF5OmNoYW5nZScpIHx8IEVtYmVyLmhhc0xpc3RlbmVy
cyh0aGlzLCAnQGFycmF5OmJlZm9yZScpOwotICB9KSwKLQotICAvKioKLSAgICBJZiB5b3UgYXJl
IGltcGxlbWVudGluZyBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBgRW1iZXIuQXJyYXlgLCBjYWxs
IHRoaXMKLSAgICBtZXRob2QganVzdCBiZWZvcmUgdGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0
byBub3RpZnkgYW55IG9ic2VydmVycyBhbmQKLSAgICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHBy
b3BlcnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3
ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMgdG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBh
cnJheUNvbnRlbnRXaWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4IFRoZSBz
dGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgICBAcGFyYW0g
e051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHJlbW92
ZWQuIElmIHlvdQotICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwCi0gICAgQHBhcmFtIHtOdW1i
ZXJ9IGFkZEFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBhZGRlZC4gSWYgeW91
Ci0gICAgICBwYXNzIGBudWxsYCBhc3N1bWVzIDAuCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9
IHJlY2VpdmVyCi0gICovCi0gIGFycmF5Q29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHN0YXJ0
SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgewotCi0gICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2Vk
IGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMKLSAgICBpZiAoc3RhcnRJZHg9PT11bmRlZmluZWQp
IHsKLSAgICAgIHN0YXJ0SWR4ID0gMDsKLSAgICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOwot
ICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocmVtb3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFt
dD0tMTsKLSAgICAgIGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5lZCkgYWRkQW10PS0xOwotICAg
IH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgQGVhY2ggcHJveHkgaXMgc2V0IHVwIGlmIGFueW9u
ZSBpcyBvYnNlcnZpbmcgQGVhY2gKLSAgICBpZiAoRW1iZXIuaXNXYXRjaGluZyh0aGlzLCAnQGVh
Y2gnKSkgeyBnZXQodGhpcywgJ0BlYWNoJyk7IH0KLQotICAgIEVtYmVyLnNlbmRFdmVudCh0aGlz
LCAnQGFycmF5OmJlZm9yZScsIFt0aGlzLCBzdGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXRdKTsK
LQotICAgIHZhciByZW1vdmluZywgbGltOwotICAgIGlmIChzdGFydElkeD49MCAmJiByZW1vdmVB
bXQ+PTAgJiYgZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJykpIHsKLSAgICAgIHJl
bW92aW5nID0gW107Ci0gICAgICBsaW0gPSBzdGFydElkeCtyZW1vdmVBbXQ7Ci0gICAgICBmb3Io
dmFyIGlkeD1zdGFydElkeDtpZHg8bGltO2lkeCsrKSByZW1vdmluZy5wdXNoKHRoaXMub2JqZWN0
QXQoaWR4KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlbW92aW5nID0gcmVtb3ZlQW10OwotICAg
IH0KLQotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlKHJlbW92aW5nLCBhZGRB
bXQpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYgeW91IGFyZSBp
bXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0
aGlzCi0gICAgbWV0aG9kIGp1c3QgYWZ0ZXIgdGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0byBu
b3RpZnkgYW55IG9ic2VydmVycyBhbmQKLSAgICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3Bl
cnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3ZWxs
IGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMgdG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBhcnJh
eUNvbnRlbnREaWRDaGFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0
aW5nIGluZGV4IGluIHRoZSBhcnJheSB0aGF0IGRpZCBjaGFuZ2UuCi0gICAgQHBhcmFtIHtOdW1i
ZXJ9IHJlbW92ZUFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLiBJZiB5
b3UKLSAgICAgIHBhc3MgYG51bGxgIGFzc3VtZXMgMAotICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRB
bXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQuIElmIHlvdQotICAgICAgcGFz
cyBgbnVsbGAgYXNzdW1lcyAwLgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgot
ICAqLwotICBhcnJheUNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVB
bXQsIGFkZEFtdCkgewotCi0gICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVy
eXRoaW5nIGNoYW5nZXMKLSAgICBpZiAoc3RhcnRJZHg9PT11bmRlZmluZWQpIHsKLSAgICAgIHN0
YXJ0SWR4ID0gMDsKLSAgICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOwotICAgIH0gZWxzZSB7
Ci0gICAgICBpZiAocmVtb3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKLSAgICAg
IGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5lZCkgYWRkQW10PS0xOwotICAgIH0KLQotICAgIHZh
ciBhZGRpbmcsIGxpbTsKLSAgICBpZiAoc3RhcnRJZHg+PTAgJiYgYWRkQW10Pj0wICYmIGdldCh0
aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpKSB7Ci0gICAgICBhZGRpbmcgPSBbXTsKLSAg
ICAgIGxpbSA9IHN0YXJ0SWR4K2FkZEFtdDsKLSAgICAgIGZvcih2YXIgaWR4PXN0YXJ0SWR4O2lk
eDxsaW07aWR4KyspIGFkZGluZy5wdXNoKHRoaXMub2JqZWN0QXQoaWR4KSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIGFkZGluZyA9IGFkZEFtdDsKLSAgICB9Ci0KLSAgICB0aGlzLmVudW1lcmFibGVD
b250ZW50RGlkQ2hhbmdlKHJlbW92ZUFtdCwgYWRkaW5nKTsKLSAgICBFbWJlci5zZW5kRXZlbnQo
dGhpcywgJ0BhcnJheTpjaGFuZ2UnLCBbdGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10
XSk7Ci0KLSAgICB2YXIgbGVuZ3RoICAgICAgPSBnZXQodGhpcywgJ2xlbmd0aCcpLAotICAgICAg
ICBjYWNoZWRGaXJzdCA9IGNhY2hlRm9yKHRoaXMsICdmaXJzdE9iamVjdCcpLAotICAgICAgICBj
YWNoZWRMYXN0ICA9IGNhY2hlRm9yKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0gICAgaWYgKHRoaXMu
b2JqZWN0QXQoMCkgIT09IGNhY2hlZEZpcnN0KSB7Ci0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxD
aGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7Ci0gICAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5n
ZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKLSAgICB9Ci0gICAgaWYgKHRoaXMub2JqZWN0QXQobGVu
Z3RoLTEpICE9PSBjYWNoZWRMYXN0KSB7Ci0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uo
dGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMs
ICdsYXN0T2JqZWN0Jyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotICAvLyBFTlVNRVJBVEVEIFBST1BFUlRJRVMKLSAgLy8KLQotICAvKioKLSAgICBSZXR1cm5z
IGEgc3BlY2lhbCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGluZGl2aWR1YWwg
cHJvcGVydGllcwotICAgIG9uIHRoZSBhcnJheS4gSnVzdCBnZXQgYW4gZXF1aXZhbGVudCBwcm9w
ZXJ0eSBvbiB0aGlzIG9iamVjdCBhbmQgaXQgd2lsbAotICAgIHJldHVybiBhbiBlbnVtZXJhYmxl
IHRoYXQgbWFwcyBhdXRvbWF0aWNhbGx5IHRvIHRoZSBuYW1lZCBrZXkgb24gdGhlCi0gICAgbWVt
YmVyIG9iamVjdHMuCi0KLSAgICBJZiB5b3UgbWVyZWx5IHdhbnQgdG8gd2F0Y2ggZm9yIGFueSBp
dGVtcyBiZWluZyBhZGRlZCBvciByZW1vdmVkIHRvIHRoZSBhcnJheSwKLSAgICB1c2UgdGhlIGBb
XWAgcHJvcGVydHkgaW5zdGVhZCBvZiBgQGVhY2hgLgotCi0gICAgQHByb3BlcnR5IEBlYWNoCi0g
ICovCi0gICdAZWFjaCc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhp
cy5fX2VhY2gpIHRoaXMuX19lYWNoID0gbmV3IEVtYmVyLkVhY2hQcm94eSh0aGlzKTsKLSAgICBy
ZXR1cm4gdGhpcy5fX2VhY2g7Ci0gIH0pCi0KLX0pIDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlv
bigpIHsKLXZhciBlX2dldCA9IEVtYmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAg
Z3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAg
cHJvcGVydHlXaWxsQ2hhbmdlID0gRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlLAotICAgIHByb3Bl
cnR5RGlkQ2hhbmdlID0gRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UsCi0gICAgYWRkQmVmb3JlT2Jz
ZXJ2ZXIgPSBFbWJlci5hZGRCZWZvcmVPYnNlcnZlciwKLSAgICByZW1vdmVCZWZvcmVPYnNlcnZl
ciA9IEVtYmVyLnJlbW92ZUJlZm9yZU9ic2VydmVyLAotICAgIGFkZE9ic2VydmVyID0gRW1iZXIu
YWRkT2JzZXJ2ZXIsCi0gICAgcmVtb3ZlT2JzZXJ2ZXIgPSBFbWJlci5yZW1vdmVPYnNlcnZlciwK
LSAgICBDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSwKLSAgICBhX3Ns
aWNlID0gW10uc2xpY2UsCi0gICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCi0gICAgZm9yRWFj
aCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIC8vIEhlcmUgd2UgZXhwbGlj
aXRseSBkb24ndCBhbGxvdyBgQGVhY2guZm9vYDsgaXQgd291bGQgcmVxdWlyZSBzb21lIHNwZWNp
YWwKLSAgICAvLyB0ZXN0aW5nLCBidXQgdGhlcmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkg
aXQgc2hvdWxkIGJlIGRpc2FsbG93ZWQuCi0gICAgZWFjaFByb3BlcnR5UGF0dGVybiA9IC9eKC4q
KVwuQGVhY2hcLiguKikvLAotICAgIGRvdWJsZUVhY2hQcm9wZXJ0eVBhdHRlcm4gPSAvKC4qXC5A
ZWFjaCl7Mix9LywKLSAgICBhcnJheUJyYWNrZXRQYXR0ZXJuID0gL1wuXFtcXSQvOwotCi0KLWZ1
bmN0aW9uIGdldChvYmosIGtleSkgewotICBpZiAoa2V5ID09PSAnQHRoaXMnKSB7Ci0gICAgcmV0
dXJuIG9iajsKLSAgfQotCi0gIHJldHVybiBlX2dldChvYmosIGtleSk7Ci19Ci0KLS8qCi0gIFRy
YWNrcyBjaGFuZ2VzIHRvIGRlcGVuZGVudCBhcnJheXMsIGFzIHdlbGwgYXMgdG8gcHJvcGVydGll
cyBvZiBpdGVtcyBpbgotICBkZXBlbmRlbnQgYXJyYXlzLgotCi0gIEBjbGFzcyBEZXBlbmRlbnRB
cnJheXNPYnNlcnZlcgotKi8KLWZ1bmN0aW9uIERlcGVuZGVudEFycmF5c09ic2VydmVyKGNhbGxi
YWNrcywgY3AsIGluc3RhbmNlTWV0YSwgY29udGV4dCwgcHJvcGVydHlOYW1lLCBzdWdhck1ldGEp
IHsKLSAgLy8gdXNlciBzcGVjaWZpZWQgY2FsbGJhY2tzIGZvciBgYWRkZWRJdGVtYCBhbmQgYHJl
bW92ZWRJdGVtYAotICB0aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrczsKLQotICAvLyB0aGUgY29t
cHV0ZWQgcHJvcGVydHk6IHJlbWVtYmVyIHRoZXNlIGFyZSBzaGFyZWQgYWNyb3NzIGluc3RhbmNl
cwotICB0aGlzLmNwID0gY3A7Ci0KLSAgLy8gdGhlIFJlZHVjZUNvbXB1dGVkUHJvcGVydHlJbnN0
YW5jZU1ldGEgdGhpcyBEZXBlbmRlbnRBcnJheXNPYnNlcnZlciBpcwotICAvLyBhc3NvY2lhdGVk
IHdpdGgKLSAgdGhpcy5pbnN0YW5jZU1ldGEgPSBpbnN0YW5jZU1ldGE7Ci0KLSAgLy8gQSBtYXAg
b2YgYXJyYXkgZ3VpZHMgdG8gZGVwZW5kZW50S2V5cywgZm9yIHRoZSBnaXZlbiBjb250ZXh0LiAg
V2UgdHJhY2sKLSAgLy8gdGhpcyBiZWNhdXNlIHdlIHdhbnQgdG8gc2V0IHVwIHRoZSBjb21wdXRl
ZCBwcm9wZXJ0eSBwb3RlbnRpYWxseSBiZWZvcmUgdGhlCi0gIC8vIGRlcGVuZGVudCBhcnJheSBl
dmVuIGV4aXN0cywgYnV0IHdoZW4gdGhlIGFycmF5IG9ic2VydmVyIGZpcmVzLCB3ZSBsYWNrCi0g
IC8vIGVub3VnaCBjb250ZXh0IHRvIGtub3cgd2hhdCB0byB1cGRhdGU6IHdlIGNhbiByZWNvdmVy
IHRoYXQgY29udGV4dCBieQotICAvLyBnZXR0aW5nIHRoZSBkZXBlbmRlbnRLZXkuCi0gIHRoaXMu
ZGVwZW5kZW50S2V5c0J5R3VpZCA9IHt9OwotCi0gIC8vIGEgbWFwIG9mIGRlcGVuZGVudCBhcnJh
eSBndWlkcyAtPiBFbWJlci5UcmFja2VkQXJyYXkgaW5zdGFuY2VzLiAgV2UgdXNlCi0gIC8vIHRo
aXMgdG8gbGF6aWx5IHJlY29tcHV0ZSBpbmRleGVzIGZvciBpdGVtIHByb3BlcnR5IG9ic2VydmVy
cy4KLSAgdGhpcy50cmFja2VkQXJyYXlzQnlHdWlkID0ge307Ci0KLSAgLy8gV2Ugc3VzcGVuZCBv
YnNlcnZlcnMgdG8gaWdub3JlIHJlcGxhY2VtZW50cyBmcm9tIGByZXNldGAgd2hlbiB0b3RhbGx5
Ci0gIC8vIHJlY29tcHV0aW5nLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcHJvcGVybHkgc3Vz
cGVuZCB0aGUgb2JzZXJ2ZXJzCi0gIC8vIGJlY2F1c2Ugd2Ugb25seSBoYXZlIHRoZSBrZXk7IGlu
c3RlYWQgd2UgbWFrZSB0aGUgb2JzZXJ2ZXJzIG5vLW9wcwotICB0aGlzLnN1c3BlbmRlZCA9IGZh
bHNlOwotCi0gIC8vIFRoaXMgaXMgdXNlZCB0byBjb2FsZXNjZSBpdGVtIGNoYW5nZXMgZnJvbSBw
cm9wZXJ0eSBvYnNlcnZlcnMuCi0gIHRoaXMuY2hhbmdlZEl0ZW1zID0ge307Ci19Ci0KLWZ1bmN0
aW9uIEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29udGV4dCAoZGVwZW5kZW50QXJyYXksIGluZGV4LCB0
cmFja2VkQXJyYXkpIHsKLSAgRW1iZXIuYXNzZXJ0KCJJbnRlcm5hbCBlcnJvcjogdHJhY2tlZEFy
cmF5IGlzIG51bGwgb3IgdW5kZWZpbmVkIiwgdHJhY2tlZEFycmF5KTsKLQotICB0aGlzLmRlcGVu
ZGVudEFycmF5ID0gZGVwZW5kZW50QXJyYXk7Ci0gIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgdGhp
cy5pdGVtID0gZGVwZW5kZW50QXJyYXkub2JqZWN0QXQoaW5kZXgpOwotICB0aGlzLnRyYWNrZWRB
cnJheSA9IHRyYWNrZWRBcnJheTsKLSAgdGhpcy5iZWZvcmVPYnNlcnZlciA9IG51bGw7Ci0gIHRo
aXMub2JzZXJ2ZXIgPSBudWxsOwotCi0gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7Ci19Ci0KLURl
cGVuZGVudEFycmF5c09ic2VydmVyLnByb3RvdHlwZSA9IHsKLSAgc2V0VmFsdWU6IGZ1bmN0aW9u
IChuZXdWYWx1ZSkgewotICAgIHRoaXMuaW5zdGFuY2VNZXRhLnNldFZhbHVlKG5ld1ZhbHVlLCB0
cnVlKTsKLSAgfSwKLSAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhpcy5p
bnN0YW5jZU1ldGEuZ2V0VmFsdWUoKTsKLSAgfSwKLQotICBzZXR1cE9ic2VydmVyczogZnVuY3Rp
b24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpIHsKLSAgICBFbWJlci5hc3NlcnQoImRl
cGVuZGVudCBhcnJheSBtdXN0IGJlIGFuIGBFbWJlci5BcnJheWAiLCBFbWJlci5BcnJheS5kZXRl
Y3QoZGVwZW5kZW50QXJyYXkpKTsKLQotICAgIHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtndWlk
Rm9yKGRlcGVuZGVudEFycmF5KV0gPSBkZXBlbmRlbnRLZXk7Ci0KLSAgICBkZXBlbmRlbnRBcnJh
eS5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRB
cnJheVdpbGxDaGFuZ2UnLAotICAgICAgZGlkQ2hhbmdlOiAnZGVwZW5kZW50QXJyYXlEaWRDaGFu
Z2UnCi0gICAgfSk7Ci0KLSAgICBpZiAodGhpcy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRl
bnRLZXldKSB7Ci0gICAgICB0aGlzLnNldHVwUHJvcGVydHlPYnNlcnZlcnMoZGVwZW5kZW50S2V5
LCB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEtleV0pOwotICAgIH0KLSAgfSwK
LQotICB0ZWFyZG93bk9ic2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRl
bnRLZXkpIHsKLSAgICB2YXIgaXRlbVByb3BlcnR5S2V5cyA9IHRoaXMuY3AuX2l0ZW1Qcm9wZXJ0
eUtleXNbZGVwZW5kZW50S2V5XSB8fCBbXTsKLQotICAgIGRlbGV0ZSB0aGlzLmRlcGVuZGVudEtl
eXNCeUd1aWRbZ3VpZEZvcihkZXBlbmRlbnRBcnJheSldOwotCi0gICAgdGhpcy50ZWFyZG93blBy
b3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgaXRlbVByb3BlcnR5S2V5cyk7Ci0KLSAgICBk
ZXBlbmRlbnRBcnJheS5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgIHdpbGxDaGFu
Z2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFuZ2UnLAotICAgICAgZGlkQ2hhbmdlOiAnZGVwZW5k
ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0gIH0sCi0KLSAgc3VzcGVuZEFycmF5T2JzZXJ2
ZXJzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB2YXIgb2xkU3VzcGVuZGVk
ID0gdGhpcy5zdXNwZW5kZWQ7Ci0gICAgdGhpcy5zdXNwZW5kZWQgPSB0cnVlOwotICAgIGNhbGxi
YWNrLmNhbGwoYmluZGluZyk7Ci0gICAgdGhpcy5zdXNwZW5kZWQgPSBvbGRTdXNwZW5kZWQ7Ci0g
IH0sCi0KLSAgc2V0dXBQcm9wZXJ0eU9ic2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwg
aXRlbVByb3BlcnR5S2V5cykgewotICAgIHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlzLmlu
c3RhbmNlTWV0YS5jb250ZXh0LCBkZXBlbmRlbnRLZXkpLAotICAgICAgICBsZW5ndGggPSBnZXQo
ZGVwZW5kZW50QXJyYXksICdsZW5ndGgnKSwKLSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5l
dyBBcnJheShsZW5ndGgpOwotCi0gICAgdGhpcy5yZXNldFRyYW5zZm9ybWF0aW9ucyhkZXBlbmRl
bnRLZXksIG9ic2VydmVyQ29udGV4dHMpOwotCi0gICAgZm9yRWFjaChkZXBlbmRlbnRBcnJheSwg
ZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7Ci0gICAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0gdGhp
cy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVyQ29udGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRo
aXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsKLSAgICAgIG9ic2VydmVyQ29u
dGV4dHNbaW5kZXhdID0gb2JzZXJ2ZXJDb250ZXh0OwotCi0gICAgICBmb3JFYWNoKGl0ZW1Qcm9w
ZXJ0eUtleXMsIGZ1bmN0aW9uIChwcm9wZXJ0eUtleSkgewotICAgICAgICBhZGRCZWZvcmVPYnNl
cnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2Vy
dmVyKTsKLSAgICAgICAgYWRkT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2Vy
dmVyQ29udGV4dC5vYnNlcnZlcik7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9LCB0aGlzKTsKLSAg
fSwKLQotICB0ZWFyZG93blByb3BlcnR5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAoZGVwZW5kZW50S2V5
LCBpdGVtUHJvcGVydHlLZXlzKSB7Ci0gICAgdmFyIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIgPSB0
aGlzLAotICAgICAgICB0cmFja2VkQXJyYXkgPSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVw
ZW5kZW50S2V5XSwKLSAgICAgICAgYmVmb3JlT2JzZXJ2ZXIsCi0gICAgICAgIG9ic2VydmVyLAot
ICAgICAgICBpdGVtOwotCi0gICAgaWYgKCF0cmFja2VkQXJyYXkpIHsgcmV0dXJuOyB9Ci0KLSAg
ICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dHMsIG9mZnNldCwg
b3BlcmF0aW9uKSB7Ci0gICAgICBpZiAob3BlcmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXku
REVMRVRFKSB7IHJldHVybjsgfQotCi0gICAgICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1
bmN0aW9uIChvYnNlcnZlckNvbnRleHQpIHsKLSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0LmRlc3Ry
b3llZCA9IHRydWU7Ci0gICAgICAgIGJlZm9yZU9ic2VydmVyID0gb2JzZXJ2ZXJDb250ZXh0LmJl
Zm9yZU9ic2VydmVyOwotICAgICAgICBvYnNlcnZlciA9IG9ic2VydmVyQ29udGV4dC5vYnNlcnZl
cjsKLSAgICAgICAgaXRlbSA9IG9ic2VydmVyQ29udGV4dC5pdGVtOwotCi0gICAgICAgIGZvckVh
Y2goaXRlbVByb3BlcnR5S2V5cywgZnVuY3Rpb24gKHByb3BlcnR5S2V5KSB7Ci0gICAgICAgICAg
cmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIGRlcGVuZGVudEFycmF5T2Jz
ZXJ2ZXIsIGJlZm9yZU9ic2VydmVyKTsKLSAgICAgICAgICByZW1vdmVPYnNlcnZlcihpdGVtLCBw
cm9wZXJ0eUtleSwgZGVwZW5kZW50QXJyYXlPYnNlcnZlciwgb2JzZXJ2ZXIpOwotICAgICAgICB9
KTsKLSAgICAgIH0pOwotICAgIH0pOwotICB9LAotCi0gIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXJD
b250ZXh0OiBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsK
LSAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0gbmV3IEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29udGV4
dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRyYWNrZWRBcnJheSk7Ci0KLSAgICB0aGlzLmNyZWF0
ZVByb3BlcnR5T2JzZXJ2ZXIob2JzZXJ2ZXJDb250ZXh0KTsKLQotICAgIHJldHVybiBvYnNlcnZl
ckNvbnRleHQ7Ci0gIH0sCi0KLSAgY3JlYXRlUHJvcGVydHlPYnNlcnZlcjogZnVuY3Rpb24gKG9i
c2VydmVyQ29udGV4dCkgewotICAgIHZhciBkZXBlbmRlbnRBcnJheU9ic2VydmVyID0gdGhpczsK
LQotICAgIG9ic2VydmVyQ29udGV4dC5iZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYmosIGtl
eU5hbWUpIHsKLSAgICAgIHJldHVybiBkZXBlbmRlbnRBcnJheU9ic2VydmVyLml0ZW1Qcm9wZXJ0
eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBvYnNlcnZlckNvbnRleHQuZGVwZW5kZW50QXJyYXks
IG9ic2VydmVyQ29udGV4dCk7Ci0gICAgfTsKLSAgICBvYnNlcnZlckNvbnRleHQub2JzZXJ2ZXIg
PSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7Ci0gICAgICByZXR1cm4gZGVwZW5kZW50QXJyYXlP
YnNlcnZlci5pdGVtUHJvcGVydHlEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lLCBvYnNlcnZlckNvbnRl
eHQuZGVwZW5kZW50QXJyYXksIG9ic2VydmVyQ29udGV4dCk7Ci0gICAgfTsKLSAgfSwKLQotICBy
ZXNldFRyYW5zZm9ybWF0aW9uczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgb2JzZXJ2ZXJDb250
ZXh0cykgewotICAgIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldID0gbmV3
IEVtYmVyLlRyYWNrZWRBcnJheShvYnNlcnZlckNvbnRleHRzKTsKLSAgfSwKLQotICB0cmFja0Fk
ZDogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaW5kZXgsIG5ld0l0ZW1zKSB7Ci0gICAgdmFyIHRy
YWNrZWRBcnJheSA9IHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldOwotICAg
IGlmICh0cmFja2VkQXJyYXkpIHsKLSAgICAgIHRyYWNrZWRBcnJheS5hZGRJdGVtcyhpbmRleCwg
bmV3SXRlbXMpOwotICAgIH0KLSAgfSwKLQotICB0cmFja1JlbW92ZTogZnVuY3Rpb24gKGRlcGVu
ZGVudEtleSwgaW5kZXgsIHJlbW92ZWRDb3VudCkgewotICAgIHZhciB0cmFja2VkQXJyYXkgPSB0
aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5XTsKLQotICAgIGlmICh0cmFja2Vk
QXJyYXkpIHsKLSAgICAgIHJldHVybiB0cmFja2VkQXJyYXkucmVtb3ZlSXRlbXMoaW5kZXgsIHJl
bW92ZWRDb3VudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFtdOwotICB9LAotCi0gIHVwZGF0ZUlu
ZGV4ZXM6IGZ1bmN0aW9uICh0cmFja2VkQXJyYXksIGFycmF5KSB7Ci0gICAgdmFyIGxlbmd0aCA9
IGdldChhcnJheSwgJ2xlbmd0aCcpOwotICAgIC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzdG9wIHVw
ZGF0aW5nIG9uY2Ugd2UgaGl0IHRoZSBvYmplY3Qgd2hvc2Ugb2JzZXJ2ZXIKLSAgICAvLyBmaXJl
ZDsgaWUgcGFydGlhbGx5IGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbnMKLSAgICB0cmFja2VkQXJy
YXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7
Ci0gICAgICAvLyB3ZSBkb24ndCBldmVuIGhhdmUgb2JzZXJ2ZXIgY29udGV4dHMgZm9yIHJlbW92
ZWQgaXRlbXMsIGV2ZW4gaWYgd2UgZGlkLAotICAgICAgLy8gdGhleSBubyBsb25nZXIgaGF2ZSBh
bnkgaW5kZXggaW4gdGhlIGFycmF5Ci0gICAgICBpZiAob3BlcmF0aW9uID09PSBFbWJlci5UcmFj
a2VkQXJyYXkuREVMRVRFKSB7IHJldHVybjsgfQotICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gRW1i
ZXIuVHJhY2tlZEFycmF5LlJFVEFJTiAmJiBvYnNlcnZlckNvbnRleHRzLmxlbmd0aCA9PT0gbGVu
Z3RoICYmIG9mZnNldCA9PT0gMCkgewotICAgICAgICAvLyBJZiB3ZSB1cGRhdGUgbWFueSBpdGVt
cyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGFycmF5IGVhY2ggdGltZTogd2UKLSAgICAgICAg
Ly8gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5kZXhlcyBhdCBtb3N0IG9uY2UgcGVyIHJ1biBs
b29wLgotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGZvckVhY2gob2JzZXJ2ZXJD
b250ZXh0cywgZnVuY3Rpb24gKGNvbnRleHQsIGluZGV4KSB7Ci0gICAgICAgIGNvbnRleHQuaW5k
ZXggPSBpbmRleCArIG9mZnNldDsKLSAgICAgIH0pOwotICAgIH0pOwotICB9LAotCi0gIGRlcGVu
ZGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBpbmRleCwgcmVt
b3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7IHJldHVy
bjsgfQotCi0gICAgdmFyIHJlbW92ZWRJdGVtID0gdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0s
Ci0gICAgICAgIGNoYW5nZU1ldGEsCi0gICAgICAgIGd1aWQgPSBndWlkRm9yKGRlcGVuZGVudEFy
cmF5KSwKLSAgICAgICAgZGVwZW5kZW50S2V5ID0gdGhpcy5kZXBlbmRlbnRLZXlzQnlHdWlkW2d1
aWRdLAotICAgICAgICBpdGVtUHJvcGVydHlLZXlzID0gdGhpcy5jcC5faXRlbVByb3BlcnR5S2V5
c1tkZXBlbmRlbnRLZXldIHx8IFtdLAotICAgICAgICBsZW5ndGggPSBnZXQoZGVwZW5kZW50QXJy
YXksICdsZW5ndGgnKSwKLSAgICAgICAgbm9ybWFsaXplZEluZGV4ID0gbm9ybWFsaXplSW5kZXgo
aW5kZXgsIGxlbmd0aCwgMCksCi0gICAgICAgIG5vcm1hbGl6ZWRSZW1vdmVDb3VudCA9IG5vcm1h
bGl6ZVJlbW92ZUNvdW50KG5vcm1hbGl6ZWRJbmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpLAot
ICAgICAgICBpdGVtLAotICAgICAgICBpdGVtSW5kZXgsCi0gICAgICAgIHNsaWNlSW5kZXgsCi0g
ICAgICAgIG9ic2VydmVyQ29udGV4dHM7Ci0KLSAgICBvYnNlcnZlckNvbnRleHRzID0gdGhpcy50
cmFja1JlbW92ZShkZXBlbmRlbnRLZXksIG5vcm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZFJlbW92
ZUNvdW50KTsKLQotICAgIGZ1bmN0aW9uIHJlbW92ZU9ic2VydmVycyhwcm9wZXJ0eUtleSkgewot
ICAgICAgb2JzZXJ2ZXJDb250ZXh0c1tzbGljZUluZGV4XS5kZXN0cm95ZWQgPSB0cnVlOwotICAg
ICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVy
Q29udGV4dHNbc2xpY2VJbmRleF0uYmVmb3JlT2JzZXJ2ZXIpOwotICAgICAgcmVtb3ZlT2JzZXJ2
ZXIoaXRlbSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0u
b2JzZXJ2ZXIpOwotICAgIH0KLQotICAgIGZvciAoc2xpY2VJbmRleCA9IG5vcm1hbGl6ZWRSZW1v
dmVDb3VudCAtIDE7IHNsaWNlSW5kZXggPj0gMDsgLS1zbGljZUluZGV4KSB7Ci0gICAgICBpdGVt
SW5kZXggPSBub3JtYWxpemVkSW5kZXggKyBzbGljZUluZGV4OwotICAgICAgaWYgKGl0ZW1JbmRl
eCA+PSBsZW5ndGgpIHsgYnJlYWs7IH0KLQotICAgICAgaXRlbSA9IGRlcGVuZGVudEFycmF5Lm9i
amVjdEF0KGl0ZW1JbmRleCk7Ci0KLSAgICAgIGZvckVhY2goaXRlbVByb3BlcnR5S2V5cywgcmVt
b3ZlT2JzZXJ2ZXJzLCB0aGlzKTsKLQotICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1l
dGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGl0ZW1JbmRleCwgdGhpcy5pbnN0YW5jZU1ldGEucHJv
cGVydHlOYW1lLCB0aGlzLmNwKTsKLSAgICAgIHRoaXMuc2V0VmFsdWUoIHJlbW92ZWRJdGVtLmNh
bGwoCi0gICAgICAgIHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwg
aXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRhKSk7Ci0gICAgfQot
ICB9LAotCi0gIGRlcGVuZGVudEFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbiAoZGVwZW5kZW50QXJy
YXksIGluZGV4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpIHsKLSAgICBpZiAodGhpcy5zdXNw
ZW5kZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgYWRkZWRJdGVtID0gdGhpcy5jYWxsYmFja3Mu
YWRkZWRJdGVtLAotICAgICAgICBndWlkID0gZ3VpZEZvcihkZXBlbmRlbnRBcnJheSksCi0gICAg
ICAgIGRlcGVuZGVudEtleSA9IHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtndWlkXSwKLSAgICAg
ICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBBcnJheShhZGRlZENvdW50KSwKLSAgICAgICAgaXRl
bVByb3BlcnR5S2V5cyA9IHRoaXMuY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSwK
LSAgICAgICAgbGVuZ3RoID0gZ2V0KGRlcGVuZGVudEFycmF5LCAnbGVuZ3RoJyksCi0gICAgICAg
IG5vcm1hbGl6ZWRJbmRleCA9IG5vcm1hbGl6ZUluZGV4KGluZGV4LCBsZW5ndGgsIGFkZGVkQ291
bnQpLAotICAgICAgICBjaGFuZ2VNZXRhLAotICAgICAgICBvYnNlcnZlckNvbnRleHQ7Ci0KLSAg
ICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LnNsaWNlKG5vcm1hbGl6ZWRJbmRleCwgbm9ybWFsaXpl
ZEluZGV4ICsgYWRkZWRDb3VudCksIGZ1bmN0aW9uIChpdGVtLCBzbGljZUluZGV4KSB7Ci0gICAg
ICBpZiAoaXRlbVByb3BlcnR5S2V5cykgewotICAgICAgICBvYnNlcnZlckNvbnRleHQgPQotICAg
ICAgICAgIG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0gPQotICAgICAgICAgIHRoaXMuY3Jl
YXRlUHJvcGVydHlPYnNlcnZlckNvbnRleHQoZGVwZW5kZW50QXJyYXksIG5vcm1hbGl6ZWRJbmRl
eCArIHNsaWNlSW5kZXgsIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsK
LSAgICAgICAgZm9yRWFjaChpdGVtUHJvcGVydHlLZXlzLCBmdW5jdGlvbiAocHJvcGVydHlLZXkp
IHsKLSAgICAgICAgICBhZGRCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywg
b2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyKTsKLSAgICAgICAgICBhZGRPYnNlcnZlcihp
dGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0Lm9ic2VydmVyKTsKLSAgICAg
ICAgfSwgdGhpcyk7Ci0gICAgICB9Ci0KLSAgICAgIGNoYW5nZU1ldGEgPSBjcmVhdGVDaGFuZ2VN
ZXRhKGRlcGVuZGVudEFycmF5LCBpdGVtLCBub3JtYWxpemVkSW5kZXggKyBzbGljZUluZGV4LCB0
aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUsIHRoaXMuY3ApOwotICAgICAgdGhpcy5zZXRW
YWx1ZSggYWRkZWRJdGVtLmNhbGwoCi0gICAgICAgIHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQs
IHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3Vn
YXJNZXRhKSk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB0aGlzLnRyYWNrQWRkKGRlcGVuZGVudEtl
eSwgbm9ybWFsaXplZEluZGV4LCBvYnNlcnZlckNvbnRleHRzKTsKLSAgfSwKLQotICBpdGVtUHJv
cGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAob2JqLCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJD
b250ZXh0KSB7Ci0gICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaik7Ci0KLSAgICBpZiAoIXRoaXMu
Y2hhbmdlZEl0ZW1zW2d1aWRdKSB7Ci0gICAgICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXSA9IHsK
LSAgICAgICAgYXJyYXk6ICAgICAgICAgICAgYXJyYXksCi0gICAgICAgIG9ic2VydmVyQ29udGV4
dDogIG9ic2VydmVyQ29udGV4dCwKLSAgICAgICAgb2JqOiAgICAgICAgICAgICAgb2JqLAotICAg
ICAgICBwcmV2aW91c1ZhbHVlczogICB7fQotICAgICAgfTsKLSAgICB9Ci0KLSAgICB0aGlzLmNo
YW5nZWRJdGVtc1tndWlkXS5wcmV2aW91c1ZhbHVlc1trZXlOYW1lXSA9IGdldChvYmosIGtleU5h
bWUpOwotICB9LAotCi0gIGl0ZW1Qcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24ob2JqLCBrZXlO
YW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgdGhpcy5mbHVzaENoYW5nZXMoKTsK
LSAgfSwKLQotICBmbHVzaENoYW5nZXM6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjaGFuZ2VkSXRl
bXMgPSB0aGlzLmNoYW5nZWRJdGVtcywga2V5LCBjLCBjaGFuZ2VNZXRhOwotCi0gICAgZm9yIChr
ZXkgaW4gY2hhbmdlZEl0ZW1zKSB7Ci0gICAgICBjID0gY2hhbmdlZEl0ZW1zW2tleV07Ci0gICAg
ICBpZiAoYy5vYnNlcnZlckNvbnRleHQuZGVzdHJveWVkKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAg
IHRoaXMudXBkYXRlSW5kZXhlcyhjLm9ic2VydmVyQ29udGV4dC50cmFja2VkQXJyYXksIGMub2Jz
ZXJ2ZXJDb250ZXh0LmRlcGVuZGVudEFycmF5KTsKLQotICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0
ZUNoYW5nZU1ldGEoYy5hcnJheSwgYy5vYmosIGMub2JzZXJ2ZXJDb250ZXh0LmluZGV4LCB0aGlz
Lmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUsIHRoaXMuY3AsIGMucHJldmlvdXNWYWx1ZXMpOwot
ICAgICAgdGhpcy5zZXRWYWx1ZSgKLSAgICAgICAgdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0u
Y2FsbCh0aGlzLmluc3RhbmNlTWV0YS5jb250ZXh0LCB0aGlzLmdldFZhbHVlKCksIGMub2JqLCBj
aGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0YS5zdWdhck1ldGEpKTsKLSAgICAgIHRoaXMuc2V0
VmFsdWUoCi0gICAgICAgIHRoaXMuY2FsbGJhY2tzLmFkZGVkSXRlbS5jYWxsKHRoaXMuaW5zdGFu
Y2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgYy5vYmosIGNoYW5nZU1ldGEsIHRoaXMu
aW5zdGFuY2VNZXRhLnN1Z2FyTWV0YSkpOwotICAgIH0KLSAgICB0aGlzLmNoYW5nZWRJdGVtcyA9
IHt9OwotICB9Ci19OwotCi1mdW5jdGlvbiBub3JtYWxpemVJbmRleChpbmRleCwgbGVuZ3RoLCBu
ZXdJdGVtc09mZnNldCkgewotICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgcmV0dXJuIE1hdGgubWF4
KDAsIGxlbmd0aCArIGluZGV4KTsKLSAgfSBlbHNlIGlmIChpbmRleCA8IGxlbmd0aCkgewotICAg
IHJldHVybiBpbmRleDsKLSAgfSBlbHNlIC8qIGluZGV4ID4gbGVuZ3RoICovIHsKLSAgICByZXR1
cm4gTWF0aC5taW4obGVuZ3RoIC0gbmV3SXRlbXNPZmZzZXQsIGluZGV4KTsKLSAgfQotfQotCi1m
dW5jdGlvbiBub3JtYWxpemVSZW1vdmVDb3VudChpbmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQp
IHsKLSAgcmV0dXJuIE1hdGgubWluKHJlbW92ZWRDb3VudCwgbGVuZ3RoIC0gaW5kZXgpOwotfQot
Ci1mdW5jdGlvbiBjcmVhdGVDaGFuZ2VNZXRhKGRlcGVuZGVudEFycmF5LCBpdGVtLCBpbmRleCwg
cHJvcGVydHlOYW1lLCBwcm9wZXJ0eSwgcHJldmlvdXNWYWx1ZXMpIHsKLSAgdmFyIG1ldGEgPSB7
Ci0gICAgYXJyYXlDaGFuZ2VkOiBkZXBlbmRlbnRBcnJheSwKLSAgICBpbmRleDogaW5kZXgsCi0g
ICAgaXRlbTogaXRlbSwKLSAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSwKLSAgICBwcm9w
ZXJ0eTogcHJvcGVydHkKLSAgfTsKLQotICBpZiAocHJldmlvdXNWYWx1ZXMpIHsKLSAgICAvLyBw
cmV2aW91cyB2YWx1ZXMgb25seSBhdmFpbGFibGUgZm9yIGl0ZW0gcHJvcGVydHkgY2hhbmdlcwot
ICAgIG1ldGEucHJldmlvdXNWYWx1ZXMgPSBwcmV2aW91c1ZhbHVlczsKLSAgfQotCi0gIHJldHVy
biBtZXRhOwotfQotCi1mdW5jdGlvbiBhZGRJdGVtcyAoZGVwZW5kZW50QXJyYXksIGNhbGxiYWNr
cywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSkgewotICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LCBm
dW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKLSAgICBtZXRhLnNldFZhbHVlKCBjYWxsYmFja3MuYWRk
ZWRJdGVtLmNhbGwoCi0gICAgICB0aGlzLCBtZXRhLmdldFZhbHVlKCksIGl0ZW0sIGNyZWF0ZUNo
YW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGluZGV4LCBwcm9wZXJ0eU5hbWUsIGNwKSwg
bWV0YS5zdWdhck1ldGEpKTsKLSAgfSwgdGhpcyk7Ci19Ci0KLWZ1bmN0aW9uIHJlc2V0KGNwLCBw
cm9wZXJ0eU5hbWUpIHsKLSAgdmFyIGNhbGxiYWNrcyA9IGNwLl9jYWxsYmFja3MoKSwKLSAgICAg
IG1ldGE7Ci0KLSAgaWYgKGNwLl9oYXNJbnN0YW5jZU1ldGEodGhpcywgcHJvcGVydHlOYW1lKSkg
ewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gICAg
bWV0YS5zZXRWYWx1ZShjcC5yZXNldFZhbHVlKG1ldGEuZ2V0VmFsdWUoKSkpOwotICB9IGVsc2Ug
ewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gIH0K
LQotICBpZiAoY3Aub3B0aW9ucy5pbml0aWFsaXplKSB7Ci0gICAgY3Aub3B0aW9ucy5pbml0aWFs
aXplLmNhbGwodGhpcywgbWV0YS5nZXRWYWx1ZSgpLCB7IHByb3BlcnR5OiBjcCwgcHJvcGVydHlO
YW1lOiBwcm9wZXJ0eU5hbWUgfSwgbWV0YS5zdWdhck1ldGEpOwotICB9Ci19Ci0KLWZ1bmN0aW9u
IHBhcnRpYWxseVJlY29tcHV0ZUZvcihvYmosIGRlcGVuZGVudEtleSkgewotICBpZiAoYXJyYXlC
cmFja2V0UGF0dGVybi50ZXN0KGRlcGVuZGVudEtleSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0g
IH0KLQotICB2YXIgdmFsdWUgPSBnZXQob2JqLCBkZXBlbmRlbnRLZXkpOwotICByZXR1cm4gRW1i
ZXIuQXJyYXkuZGV0ZWN0KHZhbHVlKTsKLX0KLQotZnVuY3Rpb24gUmVkdWNlQ29tcHV0ZWRQcm9w
ZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBwcm9wZXJ0eU5hbWUsIGluaXRpYWxWYWx1ZSkgewot
ICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5
TmFtZTsKLSAgdGhpcy5jYWNoZSA9IG1ldGFGb3IoY29udGV4dCkuY2FjaGU7Ci0KLSAgdGhpcy5k
ZXBlbmRlbnRBcnJheXMgPSB7fTsKLSAgdGhpcy5zdWdhck1ldGEgPSB7fTsKLQotICB0aGlzLmlu
aXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKLX0KLQotUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUlu
c3RhbmNlTWV0YS5wcm90b3R5cGUgPSB7Ci0gIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7Ci0gICAg
aWYgKHRoaXMucHJvcGVydHlOYW1lIGluIHRoaXMuY2FjaGUpIHsKLSAgICAgIHJldHVybiB0aGlz
LmNhY2hlW3RoaXMucHJvcGVydHlOYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRo
aXMuaW5pdGlhbFZhbHVlOwotICAgIH0KLSAgfSwKLQotICBzZXRWYWx1ZTogZnVuY3Rpb24obmV3
VmFsdWUsIHRyaWdnZXJPYnNlcnZlcnMpIHsKLSAgICAvLyBUaGlzIGxldHMgc3VnYXJzIGZvcmNl
IGEgcmVjb21wdXRhdGlvbiwgaGFuZHkgZm9yIHZlcnkgc2ltcGxlCi0gICAgLy8gaW1wbGVtZW50
YXRpb25zIG9mIGVnIG1heC4KLSAgICBpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgewotICAg
ICAgdmFyIGZpcmVPYnNlcnZlcnMgPSB0cmlnZ2VyT2JzZXJ2ZXJzICYmIChuZXdWYWx1ZSAhPT0g
dGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV0pOwotCi0gICAgICBpZiAoZmlyZU9ic2VydmVy
cykgewotICAgICAgICBwcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcy5jb250ZXh0LCB0aGlzLnByb3Bl
cnR5TmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVd
ID0gbmV3VmFsdWU7Ci0KLSAgICAgIGlmIChmaXJlT2JzZXJ2ZXJzKSB7Ci0gICAgICAgIHByb3Bl
cnR5RGlkQ2hhbmdlKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wZXJ0eU5hbWUpOwotICAgICAgfQot
ICAgIH0gZWxzZSB7Ci0gICAgICBkZWxldGUgdGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV07
Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aG9zZSBkZXBl
bmRlbnQga2V5cyBhcmUgYXJyYXlzIGFuZCB3aGljaCBpcyB1cGRhdGVkIHdpdGgKLSAgIm9uZSBh
dCBhIHRpbWUiIHNlbWFudGljcy4KLQotICBAY2xhc3MgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eQot
ICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkKLSAg
QGNvbnN0cnVjdG9yCi0qLwotZnVuY3Rpb24gUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eShvcHRpb25z
KSB7Ci0gIHZhciBjcCA9IHRoaXM7Ci0KLSAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgdGhp
cy5faW5zdGFuY2VNZXRhcyA9IHt9OwotCi0gIHRoaXMuX2RlcGVuZGVudEtleXMgPSBudWxsOwot
ICAvLyBBIG1hcCBvZiBkZXBlbmRlbnRLZXkgLT4gW2l0ZW1Qcm9wZXJ0eSwgLi4uXSB0aGF0IHRy
YWNrcyB3aGF0IHByb3BlcnRpZXMgb2YKLSAgLy8gaXRlbXMgaW4gdGhlIGFycmF5IHdlIG11c3Qg
dHJhY2sgdG8gdXBkYXRlIHRoaXMgcHJvcGVydHkuCi0gIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXMg
PSB7fTsKLSAgdGhpcy5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzID0ge307Ci0KLSAgdGhpcy5y
ZWFkT25seSgpOwotICB0aGlzLmNhY2hlYWJsZSgpOwotCi0gIHRoaXMucmVjb21wdXRlT25jZSA9
IGZ1bmN0aW9uKHByb3BlcnR5TmFtZSkgewotICAgIC8vIFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8g
ZG8gaXMgY29hbGVzY2UgYnkgPGNwLCBwcm9wZXJ0eU5hbWU+LgotICAgIC8vIFdlIG5lZWQgYSBm
b3JtIG9mIGBzY2hlZHVsZU9uY2VgIHRoYXQgYWNjZXB0cyBhbiBhcmJpdHJhcnkgdG9rZW4gdG8K
LSAgICAvLyBjb2FsZXNjZSBieSwgaW4gYWRkaXRpb24gdG8gdGhlIHRhcmdldCBhbmQgbWV0aG9k
LgotICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMsIHJlY29tcHV0ZSwgcHJvcGVydHlOYW1lKTsKLSAg
fTsKLSAgdmFyIHJlY29tcHV0ZSA9IGZ1bmN0aW9uKHByb3BlcnR5TmFtZSkgewotICAgIHZhciBk
ZXBlbmRlbnRLZXlzID0gY3AuX2RlcGVuZGVudEtleXMsCi0gICAgICAgIG1ldGEgPSBjcC5faW5z
dGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSksCi0gICAgICAgIGNhbGxiYWNrcyA9IGNwLl9j
YWxsYmFja3MoKTsKLQotICAgIHJlc2V0LmNhbGwodGhpcywgY3AsIHByb3BlcnR5TmFtZSk7Ci0K
LSAgICBtZXRhLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnN1c3BlbmRBcnJheU9ic2VydmVycyhm
dW5jdGlvbiAoKSB7Ci0gICAgICBmb3JFYWNoKGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAo
ZGVwZW5kZW50S2V5KSB7Ci0gICAgICAgIGlmICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMs
IGRlcGVuZGVudEtleSkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgdmFyIGRlcGVuZGVudEFycmF5
ID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSksCi0gICAgICAgICAgICBwcmV2aW91c0RlcGVuZGVu
dEFycmF5ID0gbWV0YS5kZXBlbmRlbnRBcnJheXNbZGVwZW5kZW50S2V5XTsKLQotICAgICAgICBp
ZiAoZGVwZW5kZW50QXJyYXkgPT09IHByZXZpb3VzRGVwZW5kZW50QXJyYXkpIHsKLSAgICAgICAg
ICAvLyBUaGUgYXJyYXkgbWF5IGJlIHRoZSBzYW1lLCBidXQgb3VyIGl0ZW0gcHJvcGVydHkga2V5
cyBtYXkgaGF2ZQotICAgICAgICAgIC8vIGNoYW5nZWQsIHNvIHdlIHNldCB0aGVtIHVwIGFnYWlu
LiAgV2UgY2FuJ3QgZWFzaWx5IHRlbGwgaWYgdGhleSd2ZQotICAgICAgICAgIC8vIGNoYW5nZWQ6
IHRoZSBhcnJheSBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0LCBidXQgd2l0aCBkaWZmZXJlbnQKLSAg
ICAgICAgICAvLyBjb250ZW50cy4KLSAgICAgICAgICBpZiAoY3AuX3ByZXZpb3VzSXRlbVByb3Bl
cnR5S2V5c1tkZXBlbmRlbnRLZXldKSB7Ci0gICAgICAgICAgICBkZWxldGUgY3AuX3ByZXZpb3Vz
SXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldOwotICAgICAgICAgICAgbWV0YS5kZXBlbmRl
bnRBcnJheXNPYnNlcnZlci5zZXR1cFByb3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgY3Au
X2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSk7Ci0gICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIG1ldGEuZGVwZW5kZW50QXJyYXlzW2RlcGVuZGVudEtleV0gPSBk
ZXBlbmRlbnRBcnJheTsKLQotICAgICAgICAgIGlmIChwcmV2aW91c0RlcGVuZGVudEFycmF5KSB7
Ci0gICAgICAgICAgICBtZXRhLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnRlYXJkb3duT2JzZXJ2
ZXJzKHByZXZpb3VzRGVwZW5kZW50QXJyYXksIGRlcGVuZGVudEtleSk7Ci0gICAgICAgICAgfQot
Ci0gICAgICAgICAgaWYgKGRlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgICAgICBtZXRhLmRlcGVu
ZGVudEFycmF5c09ic2VydmVyLnNldHVwT2JzZXJ2ZXJzKGRlcGVuZGVudEFycmF5LCBkZXBlbmRl
bnRLZXkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSwg
dGhpcyk7Ci0KLSAgICBmb3JFYWNoKGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbihkZXBlbmRl
bnRLZXkpIHsKLSAgICAgIGlmICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVu
dEtleSkpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlz
LCBkZXBlbmRlbnRLZXkpOwotICAgICAgaWYgKGRlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgIGFk
ZEl0ZW1zLmNhbGwodGhpcywgZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5
TmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAgfSwgdGhpcyk7Ci0gIH07Ci0KLSAgdGhpcy5mdW5j
ID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkgewotICAgIEVtYmVyLmFzc2VydCgiQ29tcHV0ZWQg
cmVkdWNlIHZhbHVlcyByZXF1aXJlIGF0IGxlYXN0IG9uZSBkZXBlbmRlbnQga2V5IiwgY3AuX2Rl
cGVuZGVudEtleXMpOwotCi0gICAgcmVjb21wdXRlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsK
LQotICAgIHJldHVybiBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkuZ2V0VmFs
dWUoKTsKLSAgfTsKLX0KLQotRW1iZXIuUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eSA9IFJlZHVjZUNv
bXB1dGVkUHJvcGVydHk7Ci1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9fY3Jl
YXRlKENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlKTsKLQotZnVuY3Rpb24gZGVmYXVsdENhbGxi
YWNrKGNvbXB1dGVkVmFsdWUpIHsKLSAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7Ci19Ci0KLVJlZHVj
ZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9jYWxsYmFja3MgPSBmdW5jdGlvbiAoKSB7Ci0g
IGlmICghdGhpcy5jYWxsYmFja3MpIHsKLSAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsK
LSAgICB0aGlzLmNhbGxiYWNrcyA9IHsKLSAgICAgIHJlbW92ZWRJdGVtOiBvcHRpb25zLnJlbW92
ZWRJdGVtIHx8IGRlZmF1bHRDYWxsYmFjaywKLSAgICAgIGFkZGVkSXRlbTogb3B0aW9ucy5hZGRl
ZEl0ZW0gfHwgZGVmYXVsdENhbGxiYWNrCi0gICAgfTsKLSAgfQotICByZXR1cm4gdGhpcy5jYWxs
YmFja3M7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5faGFzSW5zdGFu
Y2VNZXRhID0gZnVuY3Rpb24gKGNvbnRleHQsIHByb3BlcnR5TmFtZSkgewotICB2YXIgZ3VpZCA9
IGd1aWRGb3IoY29udGV4dCksCi0gICAgICBrZXkgPSBndWlkICsgJzonICsgcHJvcGVydHlOYW1l
OwotCi0gIHJldHVybiAhIXRoaXMuX2luc3RhbmNlTWV0YXNba2V5XTsKLX07Ci0KLVJlZHVjZUNv
bXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9pbnN0YW5jZU1ldGEgPSBmdW5jdGlvbiAoY29udGV4
dCwgcHJvcGVydHlOYW1lKSB7Ci0gIHZhciBndWlkID0gZ3VpZEZvcihjb250ZXh0KSwKLSAgICAg
IGtleSA9IGd1aWQgKyAnOicgKyBwcm9wZXJ0eU5hbWUsCi0gICAgICBtZXRhID0gdGhpcy5faW5z
dGFuY2VNZXRhc1trZXldOwotCi0gIGlmICghbWV0YSkgewotICAgIG1ldGEgPSB0aGlzLl9pbnN0
YW5jZU1ldGFzW2tleV0gPSBuZXcgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShj
b250ZXh0LCBwcm9wZXJ0eU5hbWUsIHRoaXMuaW5pdGlhbFZhbHVlKCkpOwotICAgIG1ldGEuZGVw
ZW5kZW50QXJyYXlzT2JzZXJ2ZXIgPSBuZXcgRGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIodGhpcy5f
Y2FsbGJhY2tzKCksIHRoaXMsIG1ldGEsIGNvbnRleHQsIHByb3BlcnR5TmFtZSwgbWV0YS5zdWdh
ck1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIG1ldGE7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3Bl
cnR5LnByb3RvdHlwZS5pbml0aWFsVmFsdWUgPSBmdW5jdGlvbiAoKSB7Ci0gIGlmICh0eXBlb2Yg
dGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewotICAgIHJldHVybiB0
aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIHRo
aXMub3B0aW9ucy5pbml0aWFsVmFsdWU7Ci0gIH0KLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVy
dHkucHJvdG90eXBlLnJlc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHsKLSAgcmV0dXJuIHRo
aXMuaW5pdGlhbFZhbHVlKCk7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlw
ZS5pdGVtUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXlLZXksIGl0ZW1Qcm9w
ZXJ0eUtleSkgewotICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XSA9
IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldIHx8IFtdOwotICB0aGlz
Ll9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XS5wdXNoKGl0ZW1Qcm9wZXJ0eUtl
eSk7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5jbGVhckl0ZW1Qcm9w
ZXJ0eUtleXMgPSBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXlLZXkpIHsKLSAgaWYgKHRoaXMuX2l0
ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldKSB7Ci0gICAgdGhpcy5fcHJldmlvdXNJ
dGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtl
eXNbZGVwZW5kZW50QXJyYXlLZXldOwotICAgIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5k
ZW50QXJyYXlLZXldID0gW107Ci0gIH0KLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJv
dG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24gKCkgewotICB2YXIgY3AgPSB0aGlzLAotICAgICAg
YXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpLAotICAgICAgcHJvcGVydHlBcmdzID0gbmV3
IEVtYmVyLlNldCgpLAotICAgICAgbWF0Y2gsCi0gICAgICBkZXBlbmRlbnRBcnJheUtleSwKLSAg
ICAgIGl0ZW1Qcm9wZXJ0eUtleTsKLQotICBmb3JFYWNoKGFfc2xpY2UuY2FsbChhcmd1bWVudHMp
LCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0gICAgaWYgKGRvdWJsZUVhY2hQcm9wZXJ0eVBh
dHRlcm4udGVzdChkZXBlbmRlbnRLZXkpKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3Io
Ik5lc3RlZCBAZWFjaCBwcm9wZXJ0aWVzIG5vdCBzdXBwb3J0ZWQ6ICIgKyBkZXBlbmRlbnRLZXkp
OwotICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBlYWNoUHJvcGVydHlQYXR0ZXJuLmV4ZWMoZGVwZW5k
ZW50S2V5KSkgewotICAgICAgZGVwZW5kZW50QXJyYXlLZXkgPSBtYXRjaFsxXTsKLQotICAgICAg
Ci0gICAgICAgIGl0ZW1Qcm9wZXJ0eUtleSA9IG1hdGNoWzJdOwotICAgICAgICBjcC5pdGVtUHJv
cGVydHlLZXkoZGVwZW5kZW50QXJyYXlLZXksIGl0ZW1Qcm9wZXJ0eUtleSk7Ci0gICAgICAKLSAg
ICAgIHByb3BlcnR5QXJncy5hZGQoZGVwZW5kZW50QXJyYXlLZXkpOwotICAgIH0gZWxzZSB7Ci0g
ICAgICBwcm9wZXJ0eUFyZ3MuYWRkKGRlcGVuZGVudEtleSk7Ci0gICAgfQotICB9KTsKLQotICBy
ZXR1cm4gQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUucHJvcGVydHkuYXBwbHkodGhpcywgcHJv
cGVydHlBcmdzLnRvQXJyYXkoKSk7Ci0KLX07Ci0KLS8qKgotICBDcmVhdGVzIGEgY29tcHV0ZWQg
cHJvcGVydHkgd2hpY2ggb3BlcmF0ZXMgb24gZGVwZW5kZW50IGFycmF5cyBhbmQKLSAgaXMgdXBk
YXRlZCB3aXRoICJvbmUgYXQgYSB0aW1lIiBzZW1hbnRpY3MuIFdoZW4gaXRlbXMgYXJlIGFkZGVk
IG9yCi0gIHJlbW92ZWQgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5KHMpIGEgcmVkdWNlIGNvbXB1
dGVkIG9ubHkgb3BlcmF0ZXMKLSAgb24gdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRp
bmcgdGhlIGVudGlyZSBhcnJheS4KLQotICBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBhcmd1
bWVudHMgdGhlIGZpcnN0IGFyZ3VtZW50cyBhcmUKLSAgY29uc2lkZXJlZCB0byBiZSBkZXBlbmRl
bnQgcHJvcGVydHkga2V5cy4gVGhlIGxhc3QgYXJndW1lbnQgaXMKLSAgcmVxdWlyZWQgdG8gYmUg
YW4gb3B0aW9ucyBvYmplY3QuIFRoZSBvcHRpb25zIG9iamVjdCBjYW4gaGF2ZSB0aGUKLSAgZm9s
bG93aW5nIGZvdXIgcHJvcGVydGllczoKLQotICBgaW5pdGlhbFZhbHVlYCAtIEEgdmFsdWUgb3Ig
ZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGluaXRpYWwKLSAgdmFsdWUgZm9yIHRo
ZSBjb21wdXRlZC4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHRoZSByZXN1bHQgb2Yg
Y2FsbGluZwotICB0aGUgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVl
LiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkLgotCi0gIGBpbml0aWFsaXplYCAtIEFuIG9wdGlv
bmFsIGluaXRpYWxpemUgZnVuY3Rpb24uIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAotICB0
byBzZXQgdXAgc3RhdGUgb24gdGhlIGluc3RhbmNlTWV0YSBvYmplY3QuCi0KLSAgYHJlbW92ZWRJ
dGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMg
cmVtb3ZlZAotICBmcm9tIHRoZSBhcnJheS4KLQotICBgYWRkZWRJdGVtYCAtIEEgZnVuY3Rpb24g
dGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgYWRkZWQgdG8KLSAgdGhlIGFy
cmF5LgotCi0KLSAgVGhlIGBpbml0aWFsaXplYCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBz
aWduYXR1cmU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICAgZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSwg
Y2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQotICBgYGAKLQotICBgaW5pdGlhbFZhbHVlYCAtIFRo
ZSB2YWx1ZSBvZiB0aGUgYGluaXRpYWxWYWx1ZWAgcHJvcGVydHkgZnJvbSB0aGUKLSAgb3B0aW9u
cyBvYmplY3QuCi0KLSAgYGNoYW5nZU1ldGFgIC0gQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIG1l
dGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gIGNvbXB1dGVkLiBJdCBjb250YWlucyB0aGUgZm9s
bG93aW5nIHByb3BlcnRpZXM6Ci0KLSAgICAgLSBgcHJvcGVydHlgIHRoZSBjb21wdXRlZCBwcm9w
ZXJ0eQotICAgICAtIGBwcm9wZXJ0eU5hbWVgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0
aGUgb2JqZWN0Ci0KLSAgYGluc3RhbmNlTWV0YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNl
ZCB0byBzdG9yZSBtZXRhCi0gIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91
ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQotICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRo
aXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCi0gIGVsZW1lbnQgaXMgZm91
bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4KLQotCi0gIFRoZSBgcmVtb3ZlZEl0ZW1gIGFuZCBg
YWRkZWRJdGVtYCBmdW5jdGlvbnMgYm90aCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgZnVuY3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNo
YW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKLSAgYGBgCi0KLSAgYGFjY3VtdWxhdGVkVmFsdWVgIC0g
VGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGxhc3QgdGltZQotICBgcmVtb3ZlZEl0ZW1gIG9y
IGBhZGRlZEl0ZW1gIHdhcyBjYWxsZWQgb3IgYGluaXRpYWxWYWx1ZWAuCi0KLSAgYGl0ZW1gIC0g
dGhlIGVsZW1lbnQgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheQotCi0gIGBjaGFuZ2VN
ZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRo
ZQotICBjaGFuZ2UuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLQotICAg
IC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQgcHJvcGVydHkKLSAgICAtIGBwcm9wZXJ0eU5hbWVg
IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0Ci0gICAgLSBgaW5kZXhgIHRo
ZSBpbmRleCBvZiB0aGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCi0gICAgLSBgaXRlbWAgdGhlIGFk
ZGVkIG9yIHJlbW92ZWQgaXRlbTogdGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICAgICB0
aGUgc2Vjb25kIGFyZwotICAgIC0gYGFycmF5Q2hhbmdlZGAgdGhlIGFycmF5IHRoYXQgdHJpZ2dl
cmVkIHRoZSBjaGFuZ2UuIENhbiBiZQotICAgICAgdXNlZnVsIHdoZW4gZGVwZW5kaW5nIG9uIG11
bHRpcGxlIGFycmF5cy4KLQotICBGb3IgcHJvcGVydHkgY2hhbmdlcyB0cmlnZ2VyZWQgb24gYW4g
aXRlbSBwcm9wZXJ0eSBjaGFuZ2UgKHdoZW4KLSAgZGVwS2V5IGlzIHNvbWV0aGluZyBsaWtlIGBz
b21lQXJyYXkuQGVhY2guc29tZVByb3BlcnR5YCksCi0gIGBjaGFuZ2VNZXRhYCB3aWxsIGFsc28g
Y29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnR5OgotCi0gICAgLSBgcHJldmlvdXNWYWx1ZXNg
IGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgb24K
LSAgICB0aGUgaXRlbSwgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIGl0ZW0ncyBwcmV2aW91cyB2
YWx1ZXMuCi0KLSAgYHByZXZpb3VzVmFsdWVzYCBpcyBpbXBvcnRhbnQgRW1iZXIgY29hbGVzY2Vz
IGl0ZW0gcHJvcGVydHkgY2hhbmdlcyB2aWEKLSAgRW1iZXIucnVuLm9uY2UuIFRoaXMgbWVhbnMg
dGhhdCBieSB0aGUgdGltZSByZW1vdmVkSXRlbSBnZXRzIGNhbGxlZCwgaXRlbSBoYXMKLSAgdGhl
IG5ldyB2YWx1ZXMsIGJ1dCB5b3UgbWF5IG5lZWQgdGhlIHByZXZpb3VzIHZhbHVlIChlZyBmb3Ig
c29ydGluZyAmCi0gIGZpbHRlcmluZykuCi0KLSAgYGluc3RhbmNlTWV0YWAgLSBBbiBvYmplY3Qg
dGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCi0gIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Ig
Y2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQotICB1bmlxdWUgY29tcHV0
ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCi0g
IGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4KLQotICBUaGUgYHJlbW92
ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIGFjY3Vt
dWxhdGVkCi0gIHZhbHVlLiBJdCBpcyBhY2NlcHRhYmxlIHRvIG5vdCByZXR1cm4gYW55dGhpbmcg
KGllIHJldHVybiB1bmRlZmluZWQpCi0gIHRvIGludmFsaWRhdGUgdGhlIGNvbXB1dGF0aW9uLiBU
aGlzIGlzIGdlbmVyYWxseSBub3QgYSBnb29kIGlkZWEgZm9yCi0gIGFycmF5Q29tcHV0ZWQgYnV0
IGl0J3MgdXNlZCBpbiBlZyBtYXggYW5kIG1pbi4KLQotICBOb3RlIHRoYXQgb2JzZXJ2ZXJzIHdp
bGwgYmUgZmlyZWQgaWYgZWl0aGVyIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZQot
ICB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuICBXaGVuIHJldHVybmlu
ZyBhbiBvYmplY3QgdGhhdAotICBtdXRhdGVzIGluIHJlc3BvbnNlIHRvIGFycmF5IGNoYW5nZXMs
IGZvciBleGFtcGxlIGFuIGFycmF5IHRoYXQgbWFwcwotICBldmVyeXRoaW5nIGZyb20gc29tZSBv
dGhlciBhcnJheSAoc2VlIGBFbWJlci5jb21wdXRlZC5tYXBgKSwgaXQgaXMgdXN1YWxseQotICBp
bXBvcnRhbnQgdGhhdCB0aGUgKnNhbWUqIGFycmF5IGJlIHJldHVybmVkIHRvIGF2b2lkIGFjY2lk
ZW50YWxseSB0cmlnZ2VyaW5nIG9ic2VydmVycy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNj
cmlwdAotICBFbWJlci5jb21wdXRlZC5tYXggPSBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0g
ICAgcmV0dXJuIEVtYmVyLnJlZHVjZUNvbXB1dGVkLmNhbGwobnVsbCwgZGVwZW5kZW50S2V5LCB7
Ci0gICAgICBpbml0aWFsVmFsdWU6IC1JbmZpbml0eSwKLQotICAgICAgYWRkZWRJdGVtOiBmdW5j
dGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7
Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsKLSAgICAg
IH0sCi0KLSAgICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRl
bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIGlmIChpdGVtIDwgYWNjdW11
bGF0ZWRWYWx1ZSkgewotICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZFZhbHVlOwotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH07Ci0gIGBgYAotCi0gIERlcGVuZGVudCBrZXlzIG1h
eSByZWZlciB0byBgQHRoaXNgIHRvIG9ic2VydmUgY2hhbmdlcyB0byB0aGUgb2JqZWN0IGl0c2Vs
ZiwKLSAgd2hpY2ggbXVzdCBiZSBhcnJheS1saWtlLCByYXRoZXIgdGhhbiBhIHByb3BlcnR5IG9m
IHRoZSBvYmplY3QuICBUaGlzIGlzCi0gIG1vc3RseSB1c2VmdWwgZm9yIGFycmF5IHByb3hpZXMs
IHRvIGVuc3VyZSBvYmplY3RzIGFyZSByZXRyaWV2ZWQgdmlhCi0gIGBvYmplY3RBdENvbnRlbnRg
LiAgVGhpcyBpcyBob3cgeW91IGNvdWxkIHNvcnQgaXRlbXMgYnkgcHJvcGVydGllcyBkZWZpbmVk
IG9uIGFuIGl0ZW0gY29udHJvbGxlci4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBBcHAuUGVvcGxlQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewot
ICAgIGl0ZW1Db250cm9sbGVyOiAncGVyc29uJywKLQotICAgIHNvcnRlZFBlb3BsZTogRW1iZXIu
Y29tcHV0ZWQuc29ydCgnQHRoaXMuQGVhY2gucmV2ZXJzZWROYW1lJywgZnVuY3Rpb24ocGVyc29u
QSwgcGVyc29uQikgewotICAgICAgLy8gYHJldmVyc2VkTmFtZWAgaXNuJ3QgZGVmaW5lZCBvbiBQ
ZXJzb24sIGJ1dCB3ZSBoYXZlIGFjY2VzcyB0byBpdCB2aWEKLSAgICAgIC8vIHRoZSBpdGVtIGNv
bnRyb2xsZXIgQXBwLlBlcnNvbkNvbnRyb2xsZXIuICBJZiB3ZSdkIHVzZWQKLSAgICAgIC8vIGBj
b250ZW50LkBlYWNoLnJldmVyc2VkTmFtZWAgYWJvdmUsIHdlIHdvdWxkIGJlIGdldHRpbmcgdGhl
IG9iamVjdHMKLSAgICAgIC8vIGRpcmVjdGx5IGFuZCBub3QgaGF2ZSBhY2Nlc3MgdG8gYHJldmVy
c2VkTmFtZWAuCi0gICAgICAvLwotICAgICAgdmFyIHJldmVyc2VkTmFtZUEgPSBnZXQocGVyc29u
QSwgJ3JldmVyc2VkTmFtZScpLAotICAgICAgICAgIHJldmVyc2VkTmFtZUIgPSBnZXQocGVyc29u
QiwgJ3JldmVyc2VkTmFtZScpOwotCi0gICAgICByZXR1cm4gRW1iZXIuY29tcGFyZShyZXZlcnNl
ZE5hbWVBLCByZXZlcnNlZE5hbWVCKTsKLSAgICB9KQotICB9KTsKLQotICBBcHAuUGVyc29uQ29u
dHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICByZXZlcnNlZE5h
bWU6IGZ1bmN0aW9uICgpIHsKLSAgICAgIHJldHVybiByZXZlcnNlKGdldCh0aGlzLCAnbmFtZScp
KTsKLSAgICB9LnByb3BlcnR5KCduYW1lJykKLSAgfSkKLSAgYGBgCi0KLSAgRGVwZW5kZW50IGtl
eXMgd2hvc2UgdmFsdWVzIGFyZSBub3QgYXJyYXlzIGFyZSB0cmVhdGVkIGFzIHJlZ3VsYXIKLSAg
ZGVwZW5kZW5jaWVzOiB3aGVuIHRoZXkgY2hhbmdlLCB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMg
Y29tcGxldGVseQotICByZWNhbGN1bGF0ZWQuICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhh
dmUgZGVwZW5kZW50IGFycmF5cyB3aXRoIHNpbWlsYXIKLSAgc2VtYW50aWNzLiAgRGVwZW5kZW50
IGtleXMgd2hpY2ggZW5kIGluIGAuW11gIGRvIG5vdCB1c2UgIm9uZSBhdCBhIHRpbWUiCi0gIHNl
bWFudGljcy4gIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gc3VjaCBhIGRl
cGVuZGVuY3ksIHRoZQotICBjb21wdXRlZCBwcm9wZXJ0eSBpcyBjb21wbGV0ZWx5IHJlY29tcHV0
ZWQuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgLy8gV2hlbiBgc3RyaW5nYCBpcyBjaGFuZ2VkLCBgY29tcHV0ZWRgIGlzIGNvbXBs
ZXRlbHkgcmVjb21wdXRlZC4KLSAgICBzdHJpbmc6ICdhIHN0cmluZycsCi0KLSAgICAvLyBXaGVu
IGFuIGl0ZW0gaXMgYWRkZWQgdG8gYGFycmF5YCwgYGFkZGVkSXRlbWAgaXMgY2FsbGVkLgotICAg
IGFycmF5OiBbXSwKLQotICAgIC8vIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCB0byBgYW5vdGhlckFy
cmF5YCwgYGNvbXB1dGVkYCBpcyBjb21wbGV0ZWx5Ci0gICAgLy8gcmVjb21wdXRlZC4KLSAgICBh
bm90aGVyQXJyYXk6IFtdLAotCi0gICAgY29tcHV0ZWQ6IEVtYmVyLnJlZHVjZUNvbXB1dGVkKCdz
dHJpbmcnLCAnYXJyYXknLCAnYW5vdGhlckFycmF5LltdJywgewotICAgICAgYWRkZWRJdGVtOiBh
ZGRlZEl0ZW1DYWxsYmFjaywKLSAgICAgIHJlbW92ZWRJdGVtOiByZW1vdmVkSXRlbUNhbGxiYWNr
Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRob2QgcmVkdWNlQ29tcHV0ZWQKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gW2RlcGVuZGVudEtleXMqXQotICBAcGFyYW0ge09i
amVjdH0gb3B0aW9ucwotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fQotKi8KLUVt
YmVyLnJlZHVjZUNvbXB1dGVkID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKLSAgdmFyIGFyZ3M7Ci0K
LSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgYXJncyA9IGFfc2xpY2UuY2FsbChh
cmd1bWVudHMsIDAsIC0xKTsKLSAgICBvcHRpb25zID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywg
LTEpWzBdOwotICB9Ci0KLSAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAib2JqZWN0IikgewotICAg
IHRocm93IG5ldyBFbWJlci5FcnJvcigiUmVkdWNlIENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVk
IHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7Ci0gIH0KLQotICBpZiAoISgnaW5pdGlhbFZhbHVl
JyBpbiBvcHRpb25zKSkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiUmVkdWNlIENvbXB1
dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYW4gaW5pdGlhbCB2YWx1ZSIpOwotICB9Ci0K
LSAgdmFyIGNwID0gbmV3IFJlZHVjZUNvbXB1dGVkUHJvcGVydHkob3B0aW9ucyk7Ci0KLSAgaWYg
KGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5hcHBseShjcCwgYXJncyk7Ci0gIH0KLQotICByZXR1
cm4gY3A7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIFJlZHVjZUNvbXB1
dGVkUHJvcGVydHkgPSBFbWJlci5SZWR1Y2VDb21wdXRlZFByb3BlcnR5LAotICAgIGFfc2xpY2Ug
PSBbXS5zbGljZSwKLSAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKLSAgICBmb3JFYWNoID0g
RW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci0KLWZ1bmN0aW9uIEFycmF5Q29tcHV0ZWRQ
cm9wZXJ0eSgpIHsKLSAgdmFyIGNwID0gdGhpczsKLQotICBSZWR1Y2VDb21wdXRlZFByb3BlcnR5
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0KLSAgdGhpcy5mdW5jID0gKGZ1bmN0aW9uKHJlZHVj
ZUZ1bmMpIHsKLSAgICByZXR1cm4gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkgewotICAgICAgaWYg
KCFjcC5faGFzSW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgLy8g
V2hlbiB3ZSByZWNvbXB1dGUgYW4gYXJyYXkgY29tcHV0ZWQgcHJvcGVydHksIHdlIG5lZWQgYWxy
ZWFkeQotICAgICAgICAvLyByZXRyaWV2ZWQgYXJyYXlzIHRvIGJlIHVwZGF0ZWQ7IHdlIGNhbid0
IHNpbXBseSBlbXB0eSB0aGUgY2FjaGUgYW5kCi0gICAgICAgIC8vIGhvcGUgdGhlIGFycmF5IGlz
IHJlLXJldHJpZXZlZC4KLSAgICAgICAgZm9yRWFjaChjcC5fZGVwZW5kZW50S2V5cywgZnVuY3Rp
b24oZGVwZW5kZW50S2V5KSB7Ci0gICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgZGVw
ZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNwLnJlY29tcHV0ZU9uY2UuY2Fs
bCh0aGlzLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgIH0pOwotICAgICAgICB9LCB0aGlzKTsK
LSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlZHVjZUZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKLSAgICB9OwotICB9KSh0aGlzLmZ1bmMpOwotCi0gIHJldHVybiB0aGlzOwotfQotRW1iZXIu
QXJyYXlDb21wdXRlZFByb3BlcnR5ID0gQXJyYXlDb21wdXRlZFByb3BlcnR5OwotQXJyYXlDb21w
dXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9fY3JlYXRlKFJlZHVjZUNvbXB1dGVkUHJvcGVydHku
cHJvdG90eXBlKTsKLUFycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUuaW5pdGlhbFZhbHVl
ID0gZnVuY3Rpb24gKCkgewotICByZXR1cm4gRW1iZXIuQSgpOwotfTsKLUFycmF5Q29tcHV0ZWRQ
cm9wZXJ0eS5wcm90b3R5cGUucmVzZXRWYWx1ZSA9IGZ1bmN0aW9uIChhcnJheSkgewotICBhcnJh
eS5jbGVhcigpOwotICByZXR1cm4gYXJyYXk7Ci19OwotCi0vLyBUaGlzIGlzIGEgc3RvcGdhcCB0
byBrZWVwIHRoZSByZWZlcmVuY2UgY291bnRzIGNvcnJlY3Qgd2l0aCBsYXp5IENQcy4KLUFycmF5
Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUuZGlkQ2hhbmdlID0gZnVuY3Rpb24gKG9iaiwga2V5
TmFtZSkgewotICByZXR1cm47Ci19OwotCi0vKioKLSAgQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3Bl
cnR5IHdoaWNoIG9wZXJhdGVzIG9uIGRlcGVuZGVudCBhcnJheXMgYW5kCi0gIGlzIHVwZGF0ZWQg
d2l0aCAib25lIGF0IGEgdGltZSIgc2VtYW50aWNzLiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCBvcgot
ICByZW1vdmVkIGZyb20gdGhlIGRlcGVuZGVudCBhcnJheShzKSBhbiBhcnJheSBjb21wdXRlZCBv
bmx5IG9wZXJhdGVzCi0gIG9uIHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nIHRo
ZSBlbnRpcmUgYXJyYXkuIFRoaXMgc2hvdWxkCi0gIHJldHVybiBhbiBhcnJheSwgaWYgeW91J2Qg
bGlrZSB0byB1c2UgIm9uZSBhdCBhIHRpbWUiIHNlbWFudGljcyBhbmQKLSAgY29tcHV0ZSBzb21l
IHZhbHVlIG90aGVyIHRoZW4gYW4gYXJyYXkgbG9vayBhdAotICBgRW1iZXIucmVkdWNlQ29tcHV0
ZWRgLgotCi0gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50cyB0aGUgZmlyc3Qg
YXJndW1lbnRzIGFyZQotICBjb25zaWRlcmVkIHRvIGJlIGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlz
LiBUaGUgbGFzdCBhcmd1bWVudCBpcwotICByZXF1aXJlZCB0byBiZSBhbiBvcHRpb25zIG9iamVj
dC4gVGhlIG9wdGlvbnMgb2JqZWN0IGNhbiBoYXZlIHRoZQotICBmb2xsb3dpbmcgdGhyZWUgcHJv
cGVydGllcy4KLQotICBgaW5pdGlhbGl6ZWAgLSBBbiBvcHRpb25hbCBpbml0aWFsaXplIGZ1bmN0
aW9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHVzZWQKLSAgdG8gc2V0IHVwIHN0YXRlIG9uIHRo
ZSBpbnN0YW5jZU1ldGEgb2JqZWN0LgotCi0gIGByZW1vdmVkSXRlbWAgLSBBIGZ1bmN0aW9uIHRo
YXQgaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBlbGVtZW50IGlzCi0gIHJlbW92ZWQgZnJvbSB0aGUg
YXJyYXkuCi0KLSAgYGFkZGVkSXRlbWAgLSBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGVhY2gg
dGltZSBhbiBlbGVtZW50IGlzCi0gIGFkZGVkIHRvIHRoZSBhcnJheS4KLQotCi0gIFRoZSBgaW5p
dGlhbGl6ZWAgZnVuY3Rpb24gaGFzIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgotCi0gIGBgYGph
dmFzY3JpcHQKLSAgIGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQot
ICBgYGAKLQotICBgYXJyYXlgIC0gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGFycmF5Q29tcHV0
ZWQsIGFuIGVtcHR5IGFycmF5LgotCi0gIGBjaGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBj
b250YWlucyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICBjb21wdXRlZC4gSXQgY29udGFp
bnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotCi0gICAgIC0gYHByb3BlcnR5YCB0aGUgY29t
cHV0ZWQgcHJvcGVydHkKLSAgICAgLSBgcHJvcGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUgcHJv
cGVydHkgb24gdGhlIG9iamVjdAotCi0gIGBpbnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQg
Y2FuIGJlIHVzZWQgdG8gc3RvcmUgbWV0YQotICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1
bGF0aW5nIHlvdXIgY29tcHV0ZWQuIEZvciBleGFtcGxlIGEKLSAgdW5pcXVlIGNvbXB1dGVkIG1p
Z2h0IHVzZSB0aGlzIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnaXZlbgotICBlbGVt
ZW50IGlzIGZvdW5kIGluIHRoZSBkZXBlbmRlbnQgYXJyYXkuCi0KLQotICBUaGUgYHJlbW92ZWRJ
dGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rpb25zIGJvdGggaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVl
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpCi0gIGBgYAotCi0gIGBhY2N1bXVsYXRl
ZFZhbHVlYCAtIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IHRpbWUKLSAgYHJlbW92
ZWRJdGVtYCBvciBgYWRkZWRJdGVtYCB3YXMgY2FsbGVkIG9yIGFuIGVtcHR5IGFycmF5LgotCi0g
IGBpdGVtYCAtIHRoZSBlbGVtZW50IGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkKLQot
ICBgY2hhbmdlTWV0YWAgLSBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlv
biBhYm91dCB0aGUKLSAgY2hhbmdlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRp
ZXM6Ci0KLSAgICAtIGBwcm9wZXJ0eWAgdGhlIGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgLSBgcHJv
cGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdAotICAgIC0g
YGluZGV4YCB0aGUgaW5kZXggb2YgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbQotICAgIC0gYGl0
ZW1gIHRoZSBhZGRlZCBvciByZW1vdmVkIGl0ZW06IHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBh
cwotICAgICAgdGhlIHNlY29uZCBhcmcKLSAgICAtIGBhcnJheUNoYW5nZWRgIHRoZSBhcnJheSB0
aGF0IHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBDYW4gYmUKLSAgICAgIHVzZWZ1bCB3aGVuIGRlcGVu
ZGluZyBvbiBtdWx0aXBsZSBhcnJheXMuCi0KLSAgRm9yIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dl
cmVkIG9uIGFuIGl0ZW0gcHJvcGVydHkgY2hhbmdlICh3aGVuCi0gIGRlcEtleSBpcyBzb21ldGhp
bmcgbGlrZSBgc29tZUFycmF5LkBlYWNoLnNvbWVQcm9wZXJ0eWApLAotICBgY2hhbmdlTWV0YWAg
d2lsbCBhbHNvIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0eToKLQotICAgIC0gYHByZXZp
b3VzVmFsdWVzYCBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCBj
aGFuZ2VkIG9uCi0gICAgdGhlIGl0ZW0sIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBpdGVtJ3Mg
cHJldmlvdXMgdmFsdWVzLgotCi0gIGBwcmV2aW91c1ZhbHVlc2AgaXMgaW1wb3J0YW50IEVtYmVy
IGNvYWxlc2NlcyBpdGVtIHByb3BlcnR5IGNoYW5nZXMgdmlhCi0gIEVtYmVyLnJ1bi5vbmNlLiBU
aGlzIG1lYW5zIHRoYXQgYnkgdGhlIHRpbWUgcmVtb3ZlZEl0ZW0gZ2V0cyBjYWxsZWQsIGl0ZW0g
aGFzCi0gIHRoZSBuZXcgdmFsdWVzLCBidXQgeW91IG1heSBuZWVkIHRoZSBwcmV2aW91cyB2YWx1
ZSAoZWcgZm9yIHNvcnRpbmcgJgotICBmaWx0ZXJpbmcpLgotCi0gIGBpbnN0YW5jZU1ldGFgIC0g
QW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgbWV0YQotICBpbmZvcm1hdGlvbiBu
ZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQuIEZvciBleGFtcGxlIGEKLSAgdW5p
cXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlzIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgdGltZXMg
YSBnaXZlbgotICBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBkZXBlbmRlbnQgYXJyYXkuCi0KLSAg
VGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRlZEl0ZW1gIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJu
IHRoZSBhY2N1bXVsYXRlZAotICB2YWx1ZS4gSXQgaXMgYWNjZXB0YWJsZSB0byBub3QgcmV0dXJu
IGFueXRoaW5nIChpZSByZXR1cm4gdW5kZWZpbmVkKQotICB0byBpbnZhbGlkYXRlIHRoZSBjb21w
dXRhdGlvbi4gVGhpcyBpcyBnZW5lcmFsbHkgbm90IGEgZ29vZCBpZGVhIGZvcgotICBhcnJheUNv
bXB1dGVkIGJ1dCBpdCdzIHVzZWQgaW4gZWcgbWF4IGFuZCBtaW4uCi0KLSAgRXhhbXBsZQotCi0g
IGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuY29tcHV0ZWQubWFwID0gZnVuY3Rpb24oZGVwZW5kZW50
S2V5LCBjYWxsYmFjaykgewotICAgIHZhciBvcHRpb25zID0gewotICAgICAgYWRkZWRJdGVtOiBm
dW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAg
IHZhciBtYXBwZWQgPSBjYWxsYmFjayhpdGVtKTsKLSAgICAgICAgYXJyYXkuaW5zZXJ0QXQoY2hh
bmdlTWV0YS5pbmRleCwgbWFwcGVkKTsKLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgICAgfSwK
LSAgICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5z
dGFuY2VNZXRhKSB7Ci0gICAgICAgIGFycmF5LnJlbW92ZUF0KGNoYW5nZU1ldGEuaW5kZXgsIDEp
OwotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiBF
bWJlci5hcnJheUNvbXB1dGVkKGRlcGVuZGVudEtleSwgb3B0aW9ucyk7Ci0gIH07Ci0gIGBgYAot
Ci0gIEBtZXRob2QgYXJyYXlDb21wdXRlZAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5n
fSBbZGVwZW5kZW50S2V5cypdCi0gIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9Ci0qLwotRW1iZXIuYXJyYXlDb21wdXRlZCA9IGZ1bmN0
aW9uIChvcHRpb25zKSB7Ci0gIHZhciBhcmdzOwotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID4g
MSkgewotICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0gICAgb3B0
aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIC0xKVswXTsKLSAgfQotCi0gIGlmICh0eXBl
b2Ygb3B0aW9ucyAhPT0gIm9iamVjdCIpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkFy
cmF5IENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7
Ci0gIH0KLQotICB2YXIgY3AgPSBuZXcgQXJyYXlDb21wdXRlZFByb3BlcnR5KG9wdGlvbnMpOwot
Ci0gIGlmIChhcmdzKSB7Ci0gICAgY3AucHJvcGVydHkuYXBwbHkoY3AsIGFyZ3MpOwotICB9Ci0K
LSAgcmV0dXJuIGNwOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LAotICAgIHNldCA9IEVtYmVyLnNldCwKLSAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZv
ciwKLSAgICBtZXJnZSA9IEVtYmVyLm1lcmdlLAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAg
ICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCi0gICAgbWFwID0gRW1i
ZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwKLSAgICBTZWFyY2hQcm94eTsKLQotLyoqCi0gIEEgY29t
cHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxjdWxhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZQot
ICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2lsbCByZXR1cm4gYC1JbmZpbml0eWAgd2hlbiB0aGUg
ZGVwZW5kZW50Ci0gIGFycmF5IGlzIGVtcHR5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBl
cnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGNoaWxkQWdlczogRW1iZXIuY29tcHV0
ZWQubWFwQnkoJ2NoaWxkcmVuJywgJ2FnZScpLAotICAgIG1heENoaWxkQWdlOiBFbWJlci5jb21w
dXRlZC5tYXgoJ2NoaWxkQWdlcycpCi0gIH0pOwotCi0gIHZhciBsb3JkQnlyb24gPSBBcHAuUGVy
c29uLmNyZWF0ZSh7Y2hpbGRyZW46IFtdfSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdl
Jyk7IC8vIC1JbmZpbml0eQotICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3Qo
ewotICAgIG5hbWU6ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFnZTogNwotICB9KTsKLSAgbG9yZEJ5
cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gNwotICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicp
LnB1c2hPYmplY3RzKFt7Ci0gICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAotICAgIGFnZTogNQot
ICB9LCB7Ci0gICAgbmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAotICAgIGFnZTogOAot
ICB9XSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIDgKLSAgYGBgCi0KLSAg
QG1ldGhvZCBjb21wdXRlZC5tYXgKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRo
ZSBsYXJnZXN0IHZhbHVlIGluIHRoZSBkZXBlbmRlbnRLZXkncyBhcnJheQotKi8KLUVtYmVyLmNv
bXB1dGVkLm1heCA9IGZ1bmN0aW9uIChkZXBlbmRlbnRLZXkpIHsKLSAgcmV0dXJuIEVtYmVyLnJl
ZHVjZUNvbXB1dGVkLmNhbGwobnVsbCwgZGVwZW5kZW50S2V5LCB7Ci0gICAgaW5pdGlhbFZhbHVl
OiAtSW5maW5pdHksCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVl
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHJldHVybiBNYXRoLm1h
eChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsKLSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1
bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEp
IHsKLSAgICAgIGlmIChpdGVtIDwgYWNjdW11bGF0ZWRWYWx1ZSkgewotICAgICAgICByZXR1cm4g
YWNjdW11bGF0ZWRWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotfTsKLQotLyoqCi0gIEEg
Y29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRo
ZQotICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2lsbCByZXR1cm4gYEluZmluaXR5YCB3aGVuIHRo
ZSBkZXBlbmRlbnQKLSAgYXJyYXkgaXMgZW1wdHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
UGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21w
dXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJyksCi0gICAgbWluQ2hpbGRBZ2U6IEVtYmVyLmNv
bXB1dGVkLm1pbignY2hpbGRBZ2VzJykKLSAgfSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFwcC5Q
ZXJzb24uY3JlYXRlKHtjaGlsZHJlbjogW119KTsKLSAgbG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRB
Z2UnKTsgLy8gSW5maW5pdHkKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0
KHsKLSAgICBuYW1lOiAnQXVndXN0YSBBZGEgQnlyb24nLCBhZ2U6IDcKLSAgfSk7Ci0gIGxvcmRC
eXJvbi5nZXQoJ21pbkNoaWxkQWdlJyk7IC8vIDcKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4n
KS5wdXNoT2JqZWN0cyhbewotICAgIG5hbWU6ICdBbGxlZ3JhIEJ5cm9uJywKLSAgICBhZ2U6IDUK
LSAgfSwgewotICAgIG5hbWU6ICdFbGl6YWJldGggTWVkb3JhIExlaWdoJywKLSAgICBhZ2U6IDgK
LSAgfV0pOwotICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScpOyAvLyA1Ci0gIGBgYAotCi0g
IEBtZXRob2QgY29tcHV0ZWQubWluCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRl
cGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyB0
aGUgc21hbGxlc3QgdmFsdWUgaW4gdGhlIGRlcGVuZGVudEtleSdzIGFycmF5Ci0qLwotRW1iZXIu
Y29tcHV0ZWQubWluID0gZnVuY3Rpb24gKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIu
cmVkdWNlQ29tcHV0ZWQuY2FsbChudWxsLCBkZXBlbmRlbnRLZXksIHsKLSAgICBpbml0aWFsVmFs
dWU6IEluZmluaXR5LAotCi0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1
ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICByZXR1cm4gTWF0aC5t
aW4oYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSk7Ci0gICAgfSwKLQotICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICBpZiAoaXRlbSA+IGFjY3VtdWxhdGVkVmFsdWUpIHsKLSAgICAgICAgcmV0dXJu
IGFjY3VtdWxhdGVkVmFsdWU7Ci0gICAgICB9Ci0gICAgfQotICB9KTsKLX07Ci0KLS8qKgotICBS
ZXR1cm5zIGFuIGFycmF5IG1hcHBlZCB2aWEgdGhlIGNhbGxiYWNrCi0KLSAgVGhlIGNhbGxiYWNr
IG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4K
LSAgYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIGZ1bmN0aW9uKGl0ZW0pOwotICBgYGAKLQotICBFeGFtcGxlCi0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGV4
Y2l0aW5nQ2hvcmVzOiBFbWJlci5jb21wdXRlZC5tYXAoJ2Nob3JlcycsIGZ1bmN0aW9uKGNob3Jl
KSB7Ci0gICAgICByZXR1cm4gY2hvcmUudG9VcHBlckNhc2UoKSArICchJzsKLSAgICB9KQotICB9
KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7Ci0gICAgY2hvcmVzOiBb
J2NsZWFuJywgJ3dyaXRlIG1vcmUgdW5pdCB0ZXN0cyddCi0gIH0pOwotICBoYW1zdGVyLmdldCgn
ZXhjaXRpbmdDaG9yZXMnKTsgLy8gWydDTEVBTiEnLCAnV1JJVEUgTU9SRSBVTklUIFRFU1RTISdd
Ci0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubWFwCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBA
cmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBwZWQgdmlhIHRoZSBj
YWxsYmFjawotKi8KLUVtYmVyLmNvbXB1dGVkLm1hcCA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwg
Y2FsbGJhY2spIHsKLSAgdmFyIG9wdGlvbnMgPSB7Ci0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihh
cnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgbWFwcGVk
ID0gY2FsbGJhY2suY2FsbCh0aGlzLCBpdGVtKTsKLSAgICAgIGFycmF5Lmluc2VydEF0KGNoYW5n
ZU1ldGEuaW5kZXgsIG1hcHBlZCk7Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfSwKLSAgICBy
ZW1vdmVkSXRlbTogZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0
YSkgewotICAgICAgYXJyYXkucmVtb3ZlQXQoY2hhbmdlTWV0YS5pbmRleCwgMSk7Ci0gICAgICBy
ZXR1cm4gYXJyYXk7Ci0gICAgfQotICB9OwotCi0gIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVk
KGRlcGVuZGVudEtleSwgb3B0aW9ucyk7Ci19OwotCi0vKioKLSAgUmV0dXJucyBhbiBhcnJheSBt
YXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVy
c29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRl
ZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJykKLSAgfSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFw
cC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjogW119KTsKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRB
Z2VzJyk7IC8vIFtdCi0gIGxvcmRCeXJvbi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7bmFt
ZTogJ0F1Z3VzdGEgQWRhIEJ5cm9uJywgYWdlOiA3fSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ2NoaWxk
QWdlcycpOyAvLyBbN10KLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhb
ewotICAgIG5hbWU6ICdBbGxlZ3JhIEJ5cm9uJywKLSAgICBhZ2U6IDUKLSAgfSwgewotICAgIG5h
bWU6ICdFbGl6YWJldGggTWVkb3JhIExlaWdoJywKLSAgICBhZ2U6IDgKLSAgfV0pOwotICBsb3Jk
Qnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsgLy8gWzcsIDUsIDhdCi0gIGBgYAotCi0gIEBtZXRob2Qg
Y29tcHV0ZWQubWFwQnkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50
S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtleQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkKLSovCi1F
bWJlci5jb21wdXRlZC5tYXBCeSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXkp
IHsKLSAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gZ2V0KGl0ZW0sIHBy
b3BlcnR5S2V5KTsgfTsKLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkLm1hcChkZXBlbmRlbnRLZXkg
KyAnLkBlYWNoLicgKyBwcm9wZXJ0eUtleSwgY2FsbGJhY2spOwotfTsKLQotLyoqCi0gIEBtZXRo
b2QgY29tcHV0ZWQubWFwUHJvcGVydHkKLSAgQGZvciBFbWJlcgotICBAZGVwcmVjYXRlZCBVc2Ug
YEVtYmVyLmNvbXB1dGVkLm1hcEJ5YCBpbnN0ZWFkCi0gIEBwYXJhbSBkZXBlbmRlbnRLZXkKLSAg
QHBhcmFtIHByb3BlcnR5S2V5Ci0qLwotRW1iZXIuY29tcHV0ZWQubWFwUHJvcGVydHkgPSBFbWJl
ci5jb21wdXRlZC5tYXBCeTsKLQotLyoqCi0gIEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBjYWxs
YmFjay4KLQotICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRo
ZSBmb2xsb3dpbmcgc2lnbmF0dXJlLgotICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0
aGUgaXRlcmF0aW9uLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgZnVuY3Rpb24oaXRlbSk7Ci0gIGBg
YAotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KHsKLSAgICByZW1haW5pbmdDaG9yZXM6IEVtYmVyLmNvbXB1dGVkLmZpbHRlcignY2hvcmVzJywg
ZnVuY3Rpb24oY2hvcmUpIHsKLSAgICAgIHJldHVybiAhY2hvcmUuZG9uZTsKLSAgICB9KQotICB9
KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7Y2hvcmVzOiBbCi0gICAg
e25hbWU6ICdjb29rJywgZG9uZTogdHJ1ZX0sCi0gICAge25hbWU6ICdjbGVhbicsIGRvbmU6IHRy
dWV9LAotICAgIHtuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2V9Ci0g
IF19KTsKLSAgaGFtc3Rlci5nZXQoJ3JlbWFpbmluZ0Nob3JlcycpOyAvLyBbe25hbWU6ICd3cml0
ZSBtb3JlIHVuaXQgdGVzdHMnLCBkb25lOiBmYWxzZX1dCi0gIGBgYAotCi0gIEBtZXRob2QgY29t
cHV0ZWQuZmlsdGVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtl
eQotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBAcmV0dXJuIHtFbWJlci5Db21wdXRl
ZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0ZXIg
PSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIGNhbGxiYWNrKSB7Ci0gIHZhciBvcHRpb25zID0gewot
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICBpbnN0YW5jZU1ldGEuZmlsdGVyZWRBcnJheUluZGV4ZXMgPSBuZXcgRW1iZXIu
U3ViQXJyYXkoKTsKLSAgICB9LAotCi0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRl
bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgbWF0Y2ggPSAhIWNhbGxi
YWNrLmNhbGwodGhpcywgaXRlbSksCi0gICAgICAgICAgZmlsdGVySW5kZXggPSBpbnN0YW5jZU1l
dGEuZmlsdGVyZWRBcnJheUluZGV4ZXMuYWRkSXRlbShjaGFuZ2VNZXRhLmluZGV4LCBtYXRjaCk7
Ci0KLSAgICAgIGlmIChtYXRjaCkgewotICAgICAgICBhcnJheS5pbnNlcnRBdChmaWx0ZXJJbmRl
eCwgaXRlbSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9LAotCi0gICAg
cmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1l
dGEpIHsKLSAgICAgIHZhciBmaWx0ZXJJbmRleCA9IGluc3RhbmNlTWV0YS5maWx0ZXJlZEFycmF5
SW5kZXhlcy5yZW1vdmVJdGVtKGNoYW5nZU1ldGEuaW5kZXgpOwotCi0gICAgICBpZiAoZmlsdGVy
SW5kZXggPiAtMSkgewotICAgICAgICBhcnJheS5yZW1vdmVBdChmaWx0ZXJJbmRleCk7Ci0gICAg
ICB9Ci0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0gIH07Ci0KLSAgcmV0dXJuIEVtYmVy
LmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50S2V5LCBvcHRpb25zKTsKLX07Ci0KLS8qKgotICBGaWx0
ZXJzIHRoZSBhcnJheSBieSB0aGUgcHJvcGVydHkgYW5kIHZhbHVlCi0KLSAgYGBgamF2YXNjcmlw
dAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHJlbWFpbmluZ0No
b3JlczogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ2Nob3JlcycsICdkb25lJywgZmFsc2UpCi0g
IH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHtjaG9yZXM6IFsKLSAg
ICB7bmFtZTogJ2Nvb2snLCBkb25lOiB0cnVlfSwKLSAgICB7bmFtZTogJ2NsZWFuJywgZG9uZTog
dHJ1ZX0sCi0gICAge25hbWU6ICd3cml0ZSBtb3JlIHVuaXQgdGVzdHMnLCBkb25lOiBmYWxzZX0K
LSAgXX0pOwotICBoYW1zdGVyLmdldCgncmVtYWluaW5nQ2hvcmVzJyk7IC8vIFt7bmFtZTogJ3dy
aXRlIG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6IGZhbHNlfV0KLSAgYGBgCi0KLSAgQG1ldGhvZCBj
b21wdXRlZC5maWx0ZXJCeQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl
bnRLZXkKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSB2
YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJy
YXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0ZXJCeSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwg
cHJvcGVydHlLZXksIHZhbHVlKSB7Ci0gIHZhciBjYWxsYmFjazsKLQotICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMikgewotICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oaXRlbSkgewotICAgICAg
cmV0dXJuIGdldChpdGVtLCBwcm9wZXJ0eUtleSk7Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBj
YWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiBnZXQoaXRlbSwgcHJvcGVy
dHlLZXkpID09PSB2YWx1ZTsKLSAgICB9OwotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVk
LmZpbHRlcihkZXBlbmRlbnRLZXkgKyAnLkBlYWNoLicgKyBwcm9wZXJ0eUtleSwgY2FsbGJhY2sp
OwotfTsKLQotLyoqCi0gIEBtZXRob2QgY29tcHV0ZWQuZmlsdGVyUHJvcGVydHkKLSAgQGZvciBF
bWJlcgotICBAcGFyYW0gZGVwZW5kZW50S2V5Ci0gIEBwYXJhbSBwcm9wZXJ0eUtleQotICBAcGFy
YW0gdmFsdWUKLSAgQGRlcHJlY2F0ZWQgVXNlIGBFbWJlci5jb21wdXRlZC5maWx0ZXJCeWAgaW5z
dGVhZAotKi8KLUVtYmVyLmNvbXB1dGVkLmZpbHRlclByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQu
ZmlsdGVyQnk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBu
ZXcgYXJyYXkgd2l0aCBhbGwgdGhlIHVuaXF1ZQotICBlbGVtZW50cyBmcm9tIG9uZSBvciBtb3Jl
IGRlcGVuZGVudCBhcnJheXMuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
LkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICB1bmlxdWVGcnVpdHM6IEVtYmVy
LmNvbXB1dGVkLnVuaXEoJ2ZydWl0cycpCi0gIH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBwLkhh
bXN0ZXIuY3JlYXRlKHtmcnVpdHM6IFsKLSAgICAnYmFuYW5hJywKLSAgICAnZ3JhcGUnLAotICAg
ICdrYWxlJywKLSAgICAnYmFuYW5hJwotICBdfSk7Ci0gIGhhbXN0ZXIuZ2V0KCd1bmlxdWVGcnVp
dHMnKTsgLy8gWydiYW5hbmEnLCAnZ3JhcGUnLCAna2FsZSddCi0gIGBgYAotCi0gIEBtZXRob2Qg
Y29tcHV0ZWQudW5pcQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtl
eSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJy
YXkgd2l0aCBhbGwgdGhlCi0gIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJy
YXkKLSovCi1FbWJlci5jb21wdXRlZC51bmlxID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzID0g
YV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3MucHVzaCh7Ci0gICAgaW5pdGlhbGl6ZTog
ZnVuY3Rpb24oYXJyYXksIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewotICAgICAgaW5zdGFu
Y2VNZXRhLml0ZW1Db3VudHMgPSB7fTsKLSAgICB9LAotCi0gICAgYWRkZWRJdGVtOiBmdW5jdGlv
bihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgZ3Vp
ZCA9IGd1aWRGb3IoaXRlbSk7Ci0KLSAgICAgIGlmICghaW5zdGFuY2VNZXRhLml0ZW1Db3VudHNb
Z3VpZF0pIHsKLSAgICAgICAgaW5zdGFuY2VNZXRhLml0ZW1Db3VudHNbZ3VpZF0gPSAxOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgKytpbnN0YW5jZU1ldGEuaXRlbUNvdW50c1tndWlkXTsKLSAg
ICAgIH0KLSAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgXywgaW5zdGFu
Y2VNZXRhKSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3IoaXRlbSksCi0gICAgICAgICAgaXRl
bUNvdW50cyA9IGluc3RhbmNlTWV0YS5pdGVtQ291bnRzOwotCi0gICAgICBpZiAoLS1pdGVtQ291
bnRzW2d1aWRdID09PSAwKSB7Ci0gICAgICAgIGFycmF5LnJlbW92ZU9iamVjdChpdGVtKTsKLSAg
ICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0gIH0pOwotICByZXR1cm4gRW1iZXIu
YXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBhcmdzKTsKLX07Ci0KLS8qKgotICBBbGlhcyBmb3Ig
W0VtYmVyLmNvbXB1dGVkLnVuaXFdKC9hcGkvI21ldGhvZF9jb21wdXRlZF91bmlxKS4KLQotICBA
bWV0aG9kIGNvbXB1dGVkLnVuaW9uCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHBy
b3BlcnR5S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBh
IG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKLSAgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVu
ZGVudCBhcnJheQotKi8KLUVtYmVyLmNvbXB1dGVkLnVuaW9uID0gRW1iZXIuY29tcHV0ZWQudW5p
cTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyBhIG5ldyBhcnJh
eSB3aXRoIGFsbCB0aGUgZHVwbGljYXRlZAotICBlbGVtZW50cyBmcm9tIHR3byBvciBtb3JlIGRl
cGVuZGVueSBhcnJheXMuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIG9i
aiA9IEVtYmVyLk9iamVjdC5jcmVhdGVXaXRoTWl4aW5zKHsKLSAgICBhZGFGcmllbmRzOiBbJ0No
YXJsZXMgQmFiYmFnZScsICdKb2huIEhvYmhvdXNlJywgJ1dpbGxpYW0gS2luZycsICdNYXJ5IFNv
bWVydmlsbGUnXSwKLSAgICBjaGFybGVzRnJpZW5kczogWydXaWxsaWFtIEtpbmcnLCAnTWFyeSBT
b21lcnZpbGxlJywgJ0FkYSBMb3ZlbGFjZScsICdHZW9yZ2UgUGVhY29jayddLAotICAgIGZyaWVu
ZHNJbkNvbW1vbjogRW1iZXIuY29tcHV0ZWQuaW50ZXJzZWN0KCdhZGFGcmllbmRzJywgJ2NoYXJs
ZXNGcmllbmRzJykKLSAgfSk7Ci0KLSAgb2JqLmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsn
V2lsbGlhbSBLaW5nJywgJ01hcnkgU29tZXJ2aWxsZSddCi0gIGBgYAotCi0gIEBtZXRob2QgY29t
cHV0ZWQuaW50ZXJzZWN0Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5
S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBh
cnJheSB3aXRoIGFsbCB0aGUKLSAgZHVwbGljYXRlZCBlbGVtZW50cyBmcm9tIHRoZSBkZXBlbmRl
bnQgYXJyYXlzCi0qLwotRW1iZXIuY29tcHV0ZWQuaW50ZXJzZWN0ID0gZnVuY3Rpb24gKCkgewot
ICB2YXIgZ2V0RGVwZW5kZW50S2V5R3VpZHMgPSBmdW5jdGlvbiAoY2hhbmdlTWV0YSkgewotICAg
IHJldHVybiBtYXAoY2hhbmdlTWV0YS5wcm9wZXJ0eS5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24g
KGRlcGVuZGVudEtleSkgewotICAgICAgcmV0dXJuIGd1aWRGb3IoZGVwZW5kZW50S2V5KTsKLSAg
ICB9KTsKLSAgfTsKLQotICB2YXIgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICBh
cmdzLnB1c2goewotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwg
aW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0YW5jZU1ldGEuaXRlbUNvdW50cyA9IHt9OwotICAg
IH0sCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBp
bnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBpdGVtR3VpZCA9IGd1aWRGb3IoaXRlbSksCi0gICAg
ICAgICAgZGVwZW5kZW50R3VpZHMgPSBnZXREZXBlbmRlbnRLZXlHdWlkcyhjaGFuZ2VNZXRhKSwK
LSAgICAgICAgICBkZXBlbmRlbnRHdWlkID0gZ3VpZEZvcihjaGFuZ2VNZXRhLmFycmF5Q2hhbmdl
ZCksCi0gICAgICAgICAgbnVtYmVyT2ZEZXBlbmRlbnRBcnJheXMgPSBjaGFuZ2VNZXRhLnByb3Bl
cnR5Ll9kZXBlbmRlbnRLZXlzLmxlbmd0aCwKLSAgICAgICAgICBpdGVtQ291bnRzID0gaW5zdGFu
Y2VNZXRhLml0ZW1Db3VudHM7Ci0KLSAgICAgIGlmICghaXRlbUNvdW50c1tpdGVtR3VpZF0pIHsg
aXRlbUNvdW50c1tpdGVtR3VpZF0gPSB7fTsgfQotICAgICAgaWYgKGl0ZW1Db3VudHNbaXRlbUd1
aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3VpZF1b
ZGVwZW5kZW50R3VpZF0gPSAwOyB9Ci0KLSAgICAgIGlmICgrK2l0ZW1Db3VudHNbaXRlbUd1aWRd
W2RlcGVuZGVudEd1aWRdID09PSAxICYmCi0gICAgICAgICAgbnVtYmVyT2ZEZXBlbmRlbnRBcnJh
eXMgPT09IEVtYmVyLmtleXMoaXRlbUNvdW50c1tpdGVtR3VpZF0pLmxlbmd0aCkgewotCi0gICAg
ICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0
YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgaXRlbUd1aWQgPSBndWlkRm9yKGl0ZW0pLAot
ICAgICAgICAgIGRlcGVuZGVudEd1aWRzID0gZ2V0RGVwZW5kZW50S2V5R3VpZHMoY2hhbmdlTWV0
YSksCi0gICAgICAgICAgZGVwZW5kZW50R3VpZCA9IGd1aWRGb3IoY2hhbmdlTWV0YS5hcnJheUNo
YW5nZWQpLAotICAgICAgICAgIG51bWJlck9mRGVwZW5kZW50QXJyYXlzID0gY2hhbmdlTWV0YS5w
cm9wZXJ0eS5fZGVwZW5kZW50S2V5cy5sZW5ndGgsCi0gICAgICAgICAgbnVtYmVyT2ZBcnJheXNJ
dGVtQXBwZWFyc0luLAotICAgICAgICAgIGl0ZW1Db3VudHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNv
dW50czsKLQotICAgICAgaWYgKGl0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09
PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9
Ci0gICAgICBpZiAoLS1pdGVtQ291bnRzW2l0ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9PT0gMCkg
ewotICAgICAgICBkZWxldGUgaXRlbUNvdW50c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF07Ci0g
ICAgICAgIG51bWJlck9mQXJyYXlzSXRlbUFwcGVhcnNJbiA9IEVtYmVyLmtleXMoaXRlbUNvdW50
c1tpdGVtR3VpZF0pLmxlbmd0aDsKLQotICAgICAgICBpZiAobnVtYmVyT2ZBcnJheXNJdGVtQXBw
ZWFyc0luID09PSAwKSB7Ci0gICAgICAgICAgZGVsZXRlIGl0ZW1Db3VudHNbaXRlbUd1aWRdOwot
ICAgICAgICB9Ci0gICAgICAgIGFycmF5LnJlbW92ZU9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAg
ICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0gIH0pOwotICByZXR1cm4gRW1iZXIuYXJyYXlDb21w
dXRlZC5hcHBseShudWxsLCBhcmdzKTsKLX07Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5
IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlCi0gIHByb3BlcnRpZXMgZnJv
bSB0aGUgZmlyc3QgZGVwZW5kZW50IGFycmF5IHRoYXQgYXJlIG5vdCBpbiB0aGUgc2Vjb25kCi0g
IGRlcGVuZGVudCBhcnJheS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGxpa2VzOiBbJ2JhbmFuYScsICdn
cmFwZScsICdrYWxlJ10sCi0gICAgd2FudHM6IEVtYmVyLmNvbXB1dGVkLnNldERpZmYoJ2xpa2Vz
JywgJ2ZydWl0cycpCi0gIH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRl
KHtmcnVpdHM6IFsKLSAgICAnZ3JhcGUnLAotICAgICdrYWxlJywKLSAgXX0pOwotICBoYW1zdGVy
LmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEnXQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVk
LnNldERpZmYKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gc2V0QVByb3BlcnR5Ci0g
IEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVydHkKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlCi0gIGl0ZW1zIGZyb20g
dGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZAotICBk
ZXBlbmRlbnQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC5zZXREaWZmID0gZnVuY3Rpb24gKHNl
dEFQcm9wZXJ0eSwgc2V0QlByb3BlcnR5KSB7Ci0gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAy
KSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkg
dHdvIGRlcGVuZGVudCBhcnJheXMuIik7Ci0gIH0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0
ZWQuY2FsbChudWxsLCBzZXRBUHJvcGVydHksIHNldEJQcm9wZXJ0eSwgewotICAgIGFkZGVkSXRl
bTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAg
ICAgIHZhciBzZXRBID0gZ2V0KHRoaXMsIHNldEFQcm9wZXJ0eSksCi0gICAgICAgICAgc2V0QiA9
IGdldCh0aGlzLCBzZXRCUHJvcGVydHkpOwotCi0gICAgICBpZiAoY2hhbmdlTWV0YS5hcnJheUNo
YW5nZWQgPT09IHNldEEpIHsKLSAgICAgICAgaWYgKCFzZXRCLmNvbnRhaW5zKGl0ZW0pKSB7Ci0g
ICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KGl0ZW0pOwotICAgICAgICB9Ci0gICAgICB9IGVsc2Ug
ewotICAgICAgICBhcnJheS5yZW1vdmVPYmplY3QoaXRlbSk7Ci0gICAgICB9Ci0gICAgICByZXR1
cm4gYXJyYXk7Ci0gICAgfSwKLQotICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0
ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewotICAgICAgdmFyIHNldEEgPSBnZXQodGhp
cywgc2V0QVByb3BlcnR5KSwKLSAgICAgICAgICBzZXRCID0gZ2V0KHRoaXMsIHNldEJQcm9wZXJ0
eSk7Ci0KLSAgICAgIGlmIChjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCA9PT0gc2V0QikgewotICAg
ICAgICBpZiAoc2V0QS5jb250YWlucyhpdGVtKSkgewotICAgICAgICAgIGFycmF5LmFkZE9iamVj
dChpdGVtKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJyYXkucmVtb3Zl
T2JqZWN0KGl0ZW0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgfSk7
Ci19OwotCi1mdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIGxvdywgaGlnaCkgewot
ICB2YXIgbWlkLCBtaWRJdGVtLCByZXMsIGd1aWRNaWQsIGd1aWRJdGVtOwotCi0gIGlmIChhcmd1
bWVudHMubGVuZ3RoIDwgNCkgeyBoaWdoID0gZ2V0KGFycmF5LCAnbGVuZ3RoJyk7IH0KLSAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7IGxvdyA9IDA7IH0KLQotICBpZiAobG93ID09PSBoaWdo
KSB7Ci0gICAgcmV0dXJuIGxvdzsKLSAgfQotCi0gIG1pZCA9IGxvdyArIE1hdGguZmxvb3IoKGhp
Z2ggLSBsb3cpIC8gMik7Ci0gIG1pZEl0ZW0gPSBhcnJheS5vYmplY3RBdChtaWQpOwotCi0gIGd1
aWRNaWQgPSBfZ3VpZEZvcihtaWRJdGVtKTsKLSAgZ3VpZEl0ZW0gPSBfZ3VpZEZvcihpdGVtKTsK
LQotICBpZiAoZ3VpZE1pZCA9PT0gZ3VpZEl0ZW0pIHsKLSAgICByZXR1cm4gbWlkOwotICB9Ci0K
LSAgcmVzID0gdGhpcy5vcmRlcihtaWRJdGVtLCBpdGVtKTsKLSAgaWYgKHJlcyA9PT0gMCkgewot
ICAgIHJlcyA9IGd1aWRNaWQgPCBndWlkSXRlbSA/IC0xIDogMTsKLSAgfQotCi0KLSAgaWYgKHJl
cyA8IDApIHsKLSAgICByZXR1cm4gdGhpcy5iaW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIG1pZCsx
LCBoaWdoKTsKLSAgfSBlbHNlIGlmIChyZXMgPiAwKSB7Ci0gICAgcmV0dXJuIHRoaXMuYmluYXJ5
U2VhcmNoKGFycmF5LCBpdGVtLCBsb3csIG1pZCk7Ci0gIH0KLQotICByZXR1cm4gbWlkOwotCi0g
IGZ1bmN0aW9uIF9ndWlkRm9yKGl0ZW0pIHsKLSAgICBpZiAoU2VhcmNoUHJveHkuZGV0ZWN0SW5z
dGFuY2UoaXRlbSkpIHsKLSAgICAgIHJldHVybiBndWlkRm9yKGdldChpdGVtLCAnY29udGVudCcp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGd1aWRGb3IoaXRlbSk7Ci0gIH0KLX0KLQotCi1TZWFyY2hQ
cm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmV4dGVuZCgpOwotCi0vKioKLSAgQSBjb21wdXRlZCBw
cm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQotICBwcm9wZXJ0
aWVzIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSBzb3J0ZWQgYmFzZWQgb24gYSBwcm9w
ZXJ0eQotICBvciBzb3J0IGZ1bmN0aW9uLgotCi0gIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHBy
b3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6Ci0KLSAgYGBgamF2YXNj
cmlwdAotICBmdW5jdGlvbihpdGVtQSwgaXRlbUIpOwotICBgYGAKLQotICAtIGBpdGVtQWAgdGhl
IGZpcnN0IGl0ZW0gdG8gY29tcGFyZS4KLSAgLSBgaXRlbUJgIHRoZSBzZWNvbmQgaXRlbSB0byBj
b21wYXJlLgotCi0gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBgLTFgIHdoZW4gYGl0ZW1B
YCBzaG91bGQgY29tZSBiZWZvcmUKLSAgYGl0ZW1CYC4gSXQgc2hvdWxkIHJldHVybiBgMWAgd2hl
biBgaXRlbUFgIHNob3VsZCBjb21lIGFmdGVyCi0gIGBpdGVtQmAuIElmIHRoZSBgaXRlbUFgIGFu
ZCBgaXRlbUJgIGFyZSBlcXVhbCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYDBgLgotCi0g
IEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBUb0RvTGlzdCA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotICAgIHRvZG9zU29ydGluZzogWyduYW1lJ10sCi0gICAgc29ydGVkVG9kb3M6
IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9zJywgJ3RvZG9zU29ydGluZycpLAotICAgIHByaW9y
aXR5VG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9zJywgZnVuY3Rpb24oYSwgYil7Ci0g
ICAgICBpZiAoYS5wcmlvcml0eSA+IGIucHJpb3JpdHkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0g
ICAgICB9IGVsc2UgaWYgKGEucHJpb3JpdHkgPCBiLnByaW9yaXR5KSB7Ci0gICAgICAgIHJldHVy
biAtMTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0pLAotICB9KTsKLSAgdmFyIHRv
ZG9MaXN0ID0gVG9Eb0xpc3QuY3JlYXRlKHt0b2RvczogWwotICAgIHtuYW1lOiAnVW5pdCBUZXN0
JywgcHJpb3JpdHk6IDJ9LAotICAgIHtuYW1lOiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5OiAz
fSwKLSAgICB7bmFtZTogJ1JlbGVhc2UnLCBwcmlvcml0eTogMX0KLSAgXX0pOwotCi0gIHRvZG9M
aXN0LmdldCgnc29ydGVkVG9kb3MnKTsgLy8gW3tuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3Jp
dHk6M30sIHtuYW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MX0sIHtuYW1lOidVbml0IFRlc3QnLCBw
cmlvcml0eToyfV0KLSAgdG9kb0xpc3QuZ2V0KCdwcmlvcml0eVRvZG9zJyk7IC8vIFt7bmFtZTon
UmVsZWFzZScsIHByaW9yaXR5OjF9LCB7bmFtZTonVW5pdCBUZXN0JywgcHJpb3JpdHk6Mn0sIHtu
YW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3JpdHk6M31dCi0gIGBgYAotCi0gIEBtZXRob2QgY29t
cHV0ZWQuc29ydAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkK
LSAgQHBhcmFtIHtTdHJpbmcgb3IgRnVuY3Rpb259IHNvcnREZWZpbml0aW9uIGEgZGVwZW5kZW50
IGtleSB0byBhbgotICBhcnJheSBvZiBzb3J0IHByb3BlcnRpZXMgb3IgYSBmdW5jdGlvbiB0byB1
c2Ugd2hlbiBzb3J0aW5nCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1
dGVzIGEgbmV3IHNvcnRlZCBhcnJheSBiYXNlZAotICBvbiB0aGUgc29ydCBwcm9wZXJ0eSBhcnJh
eSBvciBjYWxsYmFjayBmdW5jdGlvbgotKi8KLUVtYmVyLmNvbXB1dGVkLnNvcnQgPSBmdW5jdGlv
biAoaXRlbXNLZXksIHNvcnREZWZpbml0aW9uKSB7Ci0gIEVtYmVyLmFzc2VydCgiRW1iZXIuY29t
cHV0ZWQuc29ydCByZXF1aXJlcyB0d28gYXJndW1lbnRzOiBhbiBhcnJheSBrZXkgdG8gc29ydCBh
bmQgZWl0aGVyIGEgc29ydCBwcm9wZXJ0aWVzIGtleSBvciBzb3J0IGZ1bmN0aW9uIiwgYXJndW1l
bnRzLmxlbmd0aCA9PT0gMik7Ci0KLSAgdmFyIGluaXRGbiwgc29ydFByb3BlcnRpZXNLZXk7Ci0K
LSAgaWYgKHR5cGVvZiBzb3J0RGVmaW5pdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewotICAgIGluaXRG
biA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBp
bnN0YW5jZU1ldGEub3JkZXIgPSBzb3J0RGVmaW5pdGlvbjsKLSAgICAgIGluc3RhbmNlTWV0YS5i
aW5hcnlTZWFyY2ggPSBiaW5hcnlTZWFyY2g7Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBzb3J0
UHJvcGVydGllc0tleSA9IHNvcnREZWZpbml0aW9uOwotICAgIGluaXRGbiA9IGZ1bmN0aW9uIChh
cnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBmdW5jdGlvbiBzZXR1cFNv
cnRQcm9wZXJ0aWVzKCkgewotICAgICAgICB2YXIgc29ydFByb3BlcnR5RGVmaW5pdGlvbnMgPSBn
ZXQodGhpcywgc29ydFByb3BlcnRpZXNLZXkpLAotICAgICAgICAgICAgc29ydFByb3BlcnR5LAot
ICAgICAgICAgICAgc29ydFByb3BlcnRpZXMgPSBpbnN0YW5jZU1ldGEuc29ydFByb3BlcnRpZXMg
PSBbXSwKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eUFzY2VuZGluZyA9IGluc3RhbmNlTWV0YS5z
b3J0UHJvcGVydHlBc2NlbmRpbmcgPSB7fSwKLSAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAg
IGFzYzsKLQotICAgICAgICBFbWJlci5hc3NlcnQoIkNhbm5vdCBzb3J0OiAnIiArIHNvcnRQcm9w
ZXJ0aWVzS2V5ICsgIicgaXMgbm90IGFuIGFycmF5LiIsIEVtYmVyLmlzQXJyYXkoc29ydFByb3Bl
cnR5RGVmaW5pdGlvbnMpKTsKLQotICAgICAgICBjaGFuZ2VNZXRhLnByb3BlcnR5LmNsZWFySXRl
bVByb3BlcnR5S2V5cyhpdGVtc0tleSk7Ci0KLSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydHlE
ZWZpbml0aW9ucywgZnVuY3Rpb24gKHNvcnRQcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAg
ICBpZiAoKGlkeCA9IHNvcnRQcm9wZXJ0eURlZmluaXRpb24uaW5kZXhPZignOicpKSAhPT0gLTEp
IHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eSA9IHNvcnRQcm9wZXJ0eURlZmluaXRpb24uc3Vi
c3RyaW5nKDAsIGlkeCk7Ci0gICAgICAgICAgICBhc2MgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9u
LnN1YnN0cmluZyhpZHgrMSkudG9Mb3dlckNhc2UoKSAhPT0gJ2Rlc2MnOwotICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBzb3J0UHJvcGVydHkgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9u
OwotICAgICAgICAgICAgYXNjID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzb3J0
UHJvcGVydGllcy5wdXNoKHNvcnRQcm9wZXJ0eSk7Ci0gICAgICAgICAgc29ydFByb3BlcnR5QXNj
ZW5kaW5nW3NvcnRQcm9wZXJ0eV0gPSBhc2M7Ci0gICAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0
eS5pdGVtUHJvcGVydHlLZXkoaXRlbXNLZXksIHNvcnRQcm9wZXJ0eSk7Ci0gICAgICAgIH0pOwot
Ci0gICAgICAgIHNvcnRQcm9wZXJ0eURlZmluaXRpb25zLmFkZE9ic2VydmVyKCdAZWFjaCcsIHRo
aXMsIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9u
IHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSgpIHsKLSAgICAgICAgRW1iZXIucnVuLm9uY2UodGhp
cywgdXBkYXRlU29ydFByb3BlcnRpZXMsIGNoYW5nZU1ldGEucHJvcGVydHlOYW1lKTsKLSAgICAg
IH0KLQotICAgICAgZnVuY3Rpb24gdXBkYXRlU29ydFByb3BlcnRpZXMocHJvcGVydHlOYW1lKSB7
Ci0gICAgICAgIHNldHVwU29ydFByb3BlcnRpZXMuY2FsbCh0aGlzKTsKLSAgICAgICAgY2hhbmdl
TWV0YS5wcm9wZXJ0eS5yZWNvbXB1dGVPbmNlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKLSAg
ICAgIH0KLQotICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgc29ydFByb3BlcnRpZXNLZXks
IHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7Ci0KLSAgICAgIHNldHVwU29ydFByb3BlcnRpZXMu
Y2FsbCh0aGlzKTsKLQotCi0gICAgICBpbnN0YW5jZU1ldGEub3JkZXIgPSBmdW5jdGlvbiAoaXRl
bUEsIGl0ZW1CKSB7Ci0gICAgICAgIHZhciBzb3J0UHJvcGVydHksIHJlc3VsdCwgYXNjOwotICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc29ydFByb3BlcnRpZXMubGVuZ3RoOyArK2kp
IHsKLSAgICAgICAgICBzb3J0UHJvcGVydHkgPSB0aGlzLnNvcnRQcm9wZXJ0aWVzW2ldOwotICAg
ICAgICAgIHJlc3VsdCA9IEVtYmVyLmNvbXBhcmUoZ2V0KGl0ZW1BLCBzb3J0UHJvcGVydHkpLCBn
ZXQoaXRlbUIsIHNvcnRQcm9wZXJ0eSkpOwotCi0gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkg
ewotICAgICAgICAgICAgYXNjID0gdGhpcy5zb3J0UHJvcGVydHlBc2NlbmRpbmdbc29ydFByb3Bl
cnR5XTsKLSAgICAgICAgICAgIHJldHVybiBhc2MgPyByZXN1bHQgOiAoLTEgKiByZXN1bHQpOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfTsKLQot
ICAgICAgaW5zdGFuY2VNZXRhLmJpbmFyeVNlYXJjaCA9IGJpbmFyeVNlYXJjaDsKLSAgICB9Owot
ICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQuY2FsbChudWxsLCBpdGVtc0tleSwg
ewotICAgIGluaXRpYWxpemU6IGluaXRGbiwKLQotICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFy
cmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBpbmRleCA9
IGluc3RhbmNlTWV0YS5iaW5hcnlTZWFyY2goYXJyYXksIGl0ZW0pOwotICAgICAgYXJyYXkuaW5z
ZXJ0QXQoaW5kZXgsIGl0ZW0pOwotICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0sCi0KLSAgICBy
ZW1vdmVkSXRlbTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1l
dGEpIHsKLSAgICAgIHZhciBwcm94eVByb3BlcnRpZXMsIGluZGV4LCBzZWFyY2hJdGVtOwotCi0g
ICAgICBpZiAoY2hhbmdlTWV0YS5wcmV2aW91c1ZhbHVlcykgewotICAgICAgICBwcm94eVByb3Bl
cnRpZXMgPSBtZXJnZSh7IGNvbnRlbnQ6IGl0ZW0gfSwgY2hhbmdlTWV0YS5wcmV2aW91c1ZhbHVl
cyk7Ci0KLSAgICAgICAgc2VhcmNoSXRlbSA9IFNlYXJjaFByb3h5LmNyZWF0ZShwcm94eVByb3Bl
cnRpZXMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VhcmNoSXRlbSA9IGl0ZW07Ci0gICAg
ICB9Ci0KLSAgICAgIGluZGV4ID0gaW5zdGFuY2VNZXRhLmJpbmFyeVNlYXJjaChhcnJheSwgc2Vh
cmNoSXRlbSk7Ci0gICAgICBhcnJheS5yZW1vdmVBdChpbmRleCk7Ci0gICAgICByZXR1cm4gYXJy
YXk7Ci0gICAgfQotICB9KTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJl
ci5SU1ZQID0gcmVxdWlyZU1vZHVsZSgncnN2cCcpOwotCi1FbWJlci5SU1ZQLm9uZXJyb3JEZWZh
dWx0ID0gZnVuY3Rpb24oZXJyb3IpIHsKLSAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsK
LSAgICBpZiAoRW1iZXIudGVzdGluZykgewotICAgICAgaWYgKEVtYmVyLlRlc3QgJiYgRW1iZXIu
VGVzdC5hZGFwdGVyKSB7Ci0gICAgICAgIEVtYmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb24oZXJy
b3IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgZXJyb3I7Ci0gICAgICB9Ci0gICAg
fSBlbHNlIHsKLSAgICAgIEVtYmVyLkxvZ2dlci5lcnJvcihlcnJvci5zdGFjayk7Ci0gICAgICBF
bWJlci5hc3NlcnQoZXJyb3IsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLX07Ci0KLUVtYmVyLlJTVlAu
b24oJ2Vycm9yJywgRW1iZXIuUlNWUC5vbmVycm9yRGVmYXVsdCk7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGlt
ZQotKi8KLQotdmFyIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Ci0KLQotaWYgKEVt
YmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT
LkZ1bmN0aW9uKSB7Ci0KLSAgLyoqCi0gICAgVGhlIGBwcm9wZXJ0eWAgZXh0ZW5zaW9uIG9mIEph
dmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1i
ZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlv
bmAgaXMKLSAgICBgdHJ1ZWAsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgotCi0gICAgQ29tcHV0ZWQg
cHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJlYXQgYSBmdW5jdGlvbiBsaWtlIGEgcHJvcGVydHk6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgTXlBcHAuUHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6ICcnLAotICAgICAgbGFzdE5hbWU6ICAnJywKLQot
ICAgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2Zp
cnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgICAgLy8gQ2Fs
bCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVuY3Rpb24gYXMgYSBwcm9wZXJ0eQotICAgICAgfS5w
cm9wZXJ0eSgpCi0gICAgfSk7Ci0KLSAgICB2YXIgcHJlc2lkZW50ID0gTXlBcHAuUHJlc2lkZW50
LmNyZWF0ZSh7Ci0gICAgICBmaXJzdE5hbWU6ICJCYXJhY2siLAotICAgICAgbGFzdE5hbWU6ICJP
YmFtYSIKLSAgICB9KTsKLQotICAgIHByZXNpZGVudC5nZXQoJ2Z1bGxOYW1lJyk7ICAgIC8vICJC
YXJhY2sgT2JhbWEiCi0gICAgYGBgCi0KLSAgICBUcmVhdGluZyBhIGZ1bmN0aW9uIGxpa2UgYSBw
cm9wZXJ0eSBpcyB1c2VmdWwgYmVjYXVzZSB0aGV5IGNhbiB3b3JrIHdpdGgKLSAgICBiaW5kaW5n
cywganVzdCBsaWtlIGFueSBvdGhlciBwcm9wZXJ0eS4KLQotICAgIE1hbnkgY29tcHV0ZWQgcHJv
cGVydGllcyBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBwcm9wZXJ0aWVzLiBGb3IKLSAgICBl
eGFtcGxlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGBmdWxsTmFtZWAgcHJvcGVydHkgZGVw
ZW5kcyBvbgotICAgIGBmaXJzdE5hbWVgIGFuZCBgbGFzdE5hbWVgIHRvIGRldGVybWluZSBpdHMg
dmFsdWUuIFlvdSBjYW4gdGVsbCBFbWJlcgotICAgIGFib3V0IHRoZXNlIGRlcGVuZGVuY2llcyBs
aWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgTXlBcHAuUHJlc2lkZW50ID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6ICcnLAotICAgICAgbGFzdE5hbWU6
ICAnJywKLQotICAgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhp
cy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAg
ICAgLy8gVGVsbCBFbWJlci5qcyB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBv
biBmaXJzdE5hbWUKLSAgICAgICAgLy8gYW5kIGxhc3ROYW1lCi0gICAgICB9LnByb3BlcnR5KCdm
aXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAgIH0pOwotICAgIGBgYAotCi0gICAgTWFrZSBzdXJl
IHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2llcyBzbyBFbWJlciBrbm93cyB3aGVuIHRvIHVwZGF0
ZQotICAgIGJpbmRpbmdzIHRoYXQgY29ubmVjdCB0byBhIGNvbXB1dGVkIHByb3BlcnR5LiBDaGFu
Z2luZyBhIGRlcGVuZGVuY3kKLSAgICB3aWxsIG5vdCBpbW1lZGlhdGVseSB0cmlnZ2VyIGFuIHVw
ZGF0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHksIGJ1dAotICAgIHdpbGwgaW5zdGVhZCBjbGVh
ciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1cGRhdGVkIHdoZW4gdGhlIG5leHQgYGdldGAKLSAg
ICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5LgotCi0gICAgU2VlIFtFbWJlci5Db21wdXRlZFBy
b3BlcnR5XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eS5odG1sKSwgW0VtYmVy
LmNvbXB1dGVkXSgvYXBpLyNtZXRob2RfY29tcHV0ZWQpLgotCi0gICAgQG1ldGhvZCBwcm9wZXJ0
eQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8KLSAgRnVuY3Rpb24ucHJvdG90eXBlLnByb3BlcnR5
ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldCA9IEVtYmVyLmNvbXB1dGVkKHRoaXMpOwotICAg
IC8vIENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnByb3BlcnR5IGV4cGFuZHMgcHJvcGVydGll
czsgbm8gbmVlZCBmb3IgdXMgdG8KLSAgICAvLyBkbyBzbyBoZXJlLgotICAgIHJldHVybiByZXQu
cHJvcGVydHkuYXBwbHkocmV0LCBhcmd1bWVudHMpOwotICB9OwotCi0gIC8qKgotICAgIFRoZSBg
b2JzZXJ2ZXNgIGV4dGVuc2lvbiBvZiBKYXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlz
IGF2YWlsYWJsZQotICAgIHdoZW4gYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvciBgRW1iZXIu
RVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb25gIGlzCi0gICAgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRl
ZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9ic2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkg
YWRkaW5nIHRoZSBgb2JzZXJ2ZXNgCi0gICAgY2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9k
IGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgotICAgIEZvciBleGFtcGxl
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAg
dmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVy
IHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKLSAgICAgIH0ub2JzZXJ2ZXMoJ3ZhbHVlJykK
LSAgICB9KTsKLSAgICBgYGAKLQotICAgIEluIHRoZSBmdXR1cmUgdGhpcyBtZXRob2QgbWF5IGJl
Y29tZSBhc3luY2hyb25vdXMuIElmIHlvdSB3YW50IHRvIGVuc3VyZQotICAgIHN5bmNocm9ub3Vz
IGJlaGF2aW9yLCB1c2UgYG9ic2VydmVzSW1tZWRpYXRlbHlgLgotCi0gICAgU2VlIGBFbWJlci5v
YnNlcnZlcmAuCi0KLSAgICBAbWV0aG9kIG9ic2VydmVzCi0gICAgQGZvciBGdW5jdGlvbgotICAq
LwotICBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXMgPSBmdW5jdGlvbigpIHsKLSAgICAKLSAg
ICAgIHRoaXMuX19lbWJlcl9vYnNlcnZlc19fID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0g
ICAgCi0KLSAgICByZXR1cm4gdGhpczsKLSAgfTsKLQotICAvKioKLSAgICBUaGUgYG9ic2VydmVz
SW1tZWRpYXRlbHlgIGV4dGVuc2lvbiBvZiBKYXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBl
IGlzCi0gICAgYXZhaWxhYmxlIHdoZW4gYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvcgotICAg
IGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMgdHJ1ZSwgd2hpY2ggaXMgdGhl
IGRlZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9ic2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkg
YnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNJbW1lZGlhdGVseWAKLSAgICBjYWxsIHRvIHRoZSBlbmQg
b2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCi0g
ICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuT2JqZWN0LmV4
dGVuZCh7Ci0gICAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gRXhl
Y3V0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcwotICAg
ICAgfS5vYnNlcnZlc0ltbWVkaWF0ZWx5KCd2YWx1ZScpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBJbiB0aGUgZnV0dXJlLCBgb2JzZXJ2ZXNgIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0
aGlzIGV2ZW50LAotICAgIGBvYnNlcnZlc0ltbWVkaWF0ZWx5YCB3aWxsIG1haW50YWluIHRoZSBz
eW5jaHJvbm91cyBiZWhhdmlvci4KLQotICAgIFNlZSBgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXJg
LgotCi0gICAgQG1ldGhvZCBvYnNlcnZlc0ltbWVkaWF0ZWx5Ci0gICAgQGZvciBGdW5jdGlvbgot
ICAqLwotICBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNJbW1lZGlhdGVseSA9IGZ1bmN0aW9u
KCkgewotICAgIGZvciAodmFyIGk9MCwgbD1hcmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKLSAgICAgIEVtYmVyLmFzc2VydCgiSW1tZWRp
YXRlIG9ic2VydmVycyBtdXN0IG9ic2VydmUgaW50ZXJuYWwgcHJvcGVydGllcyBvbmx5LCBub3Qg
cHJvcGVydGllcyBvbiBvdGhlciBvYmplY3RzLiIsIGFyZy5pbmRleE9mKCcuJykgPT09IC0xKTsK
LSAgICB9Ci0KLSAgICAvLyBvYnNlcnZlcyBoYW5kbGVzIHByb3BlcnR5IGV4cGFuc2lvbgotICAg
IHJldHVybiB0aGlzLm9ic2VydmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07Ci0KLSAg
LyoqCi0gICAgVGhlIGBvYnNlcnZlc0JlZm9yZWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBG
dW5jdGlvbiBwcm90b3R5cGUgaXMKLSAgICBhdmFpbGFibGUgd2hlbiBgRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVNgIG9yCi0gICAgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcyB0
cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLQotICAgIFlvdSBjYW4gZ2V0IG5vdGlmaWVkIHdo
ZW4gYSBwcm9wZXJ0eSBjaGFuZ2UgaXMgYWJvdXQgdG8gaGFwcGVuIGJ5Ci0gICAgYnkgYWRkaW5n
IHRoZSBgb2JzZXJ2ZXNCZWZvcmVgIGNhbGwgdG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZAotICAg
IGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLiBGb3IgZXhhbXBsZToKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICAgIHZhbHVl
T2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgewotICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUg
InZhbHVlIiBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UKLSAgICAgIH0ub2JzZXJ2ZXNCZWZv
cmUoJ3ZhbHVlJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFNlZSBgRW1iZXIuYmVmb3JlT2Jz
ZXJ2ZXJgLgotCi0gICAgQG1ldGhvZCBvYnNlcnZlc0JlZm9yZQotICAgIEBmb3IgRnVuY3Rpb24K
LSAgKi8KLSAgRnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzQmVmb3JlID0gZnVuY3Rpb24oKSB7
Ci0gICAgCi0gICAgICB0aGlzLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyA9IGFfc2xpY2UuY2Fs
bChhcmd1bWVudHMpOwotICAgIAotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH07Ci0KLSAgLyoqCi0g
ICAgVGhlIGBvbmAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUg
aXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMKLSAgICB0cnVlLCB3aGljaCBpcyB0aGUg
ZGVmYXVsdC4KLQotICAgIFlvdSBjYW4gbGlzdGVuIGZvciBldmVudHMgc2ltcGx5IGJ5IGFkZGlu
ZyB0aGUgYG9uYCBjYWxsIHRvIHRoZSBlbmQgb2YKLSAgICB5b3VyIG1ldGhvZCBkZWNsYXJhdGlv
bnMgaW4gY2xhc3NlcyBvciBtaXhpbnMgdGhhdCB5b3Ugd3JpdGUuIEZvciBleGFtcGxlOgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAgICBkb1NvbWV0
aGluZ1dpdGhFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2
ZXIgdGhlICJkaWRJbnNlcnRFbGVtZW50IiBldmVudCBmaXJlcwotICAgICAgfS5vbignZGlkSW5z
ZXJ0RWxlbWVudCcpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBTZWUgYEVtYmVyLm9uYC4KLQot
ICAgIEBtZXRob2Qgb24KLSAgICBAZm9yIEZ1bmN0aW9uCi0gICovCi0gIEZ1bmN0aW9uLnByb3Rv
dHlwZS5vbiA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBldmVudHMgPSBhX3NsaWNlLmNhbGwoYXJn
dW1lbnRzKTsKLSAgICB0aGlzLl9fZW1iZXJfbGlzdGVuc19fID0gZXZlbnRzOwotICAgIHJldHVy
biB0aGlzOwotICB9OwotfQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQotKi8KLQotCi0vKioKLSAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhv
ZHMgZm9yIGNvbXBhcmluZyBvYmplY3RzLiBBZGQgdGhpcyBtaXhpbiB0bwotICBhbnkgY2xhc3Mg
eW91IGNyZWF0ZSB0aGF0IGNhbiBjb21wYXJlIGl0cyBpbnN0YW5jZXMuCi0KLSAgWW91IHNob3Vs
ZCBpbXBsZW1lbnQgdGhlIGBjb21wYXJlKClgIG1ldGhvZC4KLQotICBAY2xhc3MgQ29tcGFyYWJs
ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5Db21w
YXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLQotICAvKioKLSAgICBPdmVycmlkZSB0byBy
ZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgdHdvIHBhcmFtZXRlcnMu
IFRoZQotICAgIGNvbXBhcmUgbWV0aG9kIHNob3VsZCByZXR1cm46Ci0KLSAgICAtIGAtMWAgaWYg
YGEgPCBiYAotICAgIC0gYDBgIGlmIGBhID09IGJgCi0gICAgLSBgMWAgaWYgYGEgPiBiYAotCi0g
ICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9uLgotCi0gICAgQG1l
dGhvZCBjb21wYXJlCi0gICAgQHBhcmFtIGEge09iamVjdH0gdGhlIGZpcnN0IG9iamVjdCB0byBj
b21wYXJlCi0gICAgQHBhcmFtIGIge09iamVjdH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFy
ZQotICAgIEByZXR1cm4ge0ludGVnZXJ9IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KLSAg
Ki8KLSAgY29tcGFyZTogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pCi0KLX0pOwotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQotKi8KLQotCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKLQotLyoqCi0gIEltcGxlbWVudHMgc29tZSBzdGFuZGFyZCBtZXRob2RzIGZvciBjb3B5aW5n
IGFuIG9iamVjdC4gQWRkIHRoaXMgbWl4aW4gdG8KLSAgYW55IG9iamVjdCB5b3UgY3JlYXRlIHRo
YXQgY2FuIGNyZWF0ZSBhIGNvcHkgb2YgaXRzZWxmLiBUaGlzIG1peGluIGlzCi0gIGFkZGVkIGF1
dG9tYXRpY2FsbHkgdG8gdGhlIGJ1aWx0LWluIGFycmF5LgotCi0gIFlvdSBzaG91bGQgZ2VuZXJh
bGx5IGltcGxlbWVudCB0aGUgYGNvcHkoKWAgbWV0aG9kIHRvIHJldHVybiBhIGNvcHkgb2YgdGhl
Ci0gIHJlY2VpdmVyLgotCi0gIE5vdGUgdGhhdCBgZnJvemVuQ29weSgpYCB3aWxsIG9ubHkgd29y
ayBpZiB5b3UgYWxzbyBpbXBsZW1lbnQKLSAgYEVtYmVyLkZyZWV6YWJsZWAuCi0KLSAgQGNsYXNz
IENvcHlhYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVt
YmVyLkNvcHlhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLQotICAvKioKLSAgICBPdmVycmlk
ZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNlaXZlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlv
biByYWlzZXMKLSAgICBhbiBleGNlcHRpb24uCi0KLSAgICBAbWV0aG9kIGNvcHkKLSAgICBAcGFy
YW0ge0Jvb2xlYW59IGRlZXAgaWYgYHRydWVgLCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IHNo
b3VsZCBiZSBtYWRlCi0gICAgQHJldHVybiB7T2JqZWN0fSBjb3B5IG9mIHJlY2VpdmVyCi0gICov
Ci0gIGNvcHk6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBJZiB0aGUg
b2JqZWN0IGltcGxlbWVudHMgYEVtYmVyLkZyZWV6YWJsZWAsIHRoZW4gdGhpcyB3aWxsIHJldHVy
biBhIG5ldwotICAgIGNvcHkgaWYgdGhlIG9iamVjdCBpcyBub3QgZnJvemVuIGFuZCB0aGUgcmVj
ZWl2ZXIgaWYgdGhlIG9iamVjdCBpcyBmcm96ZW4uCi0KLSAgICBSYWlzZXMgYW4gZXhjZXB0aW9u
IGlmIHlvdSB0cnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbiBhIG9iamVjdCB0aGF0IGRvZXMKLSAg
ICBub3Qgc3VwcG9ydCBmcmVlemluZy4KLQotICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgbWV0aG9k
IHdoZW5ldmVyIHlvdSB3YW50IGEgY29weSBvZiBhIGZyZWV6YWJsZSBvYmplY3QKLSAgICBzaW5j
ZSBhIGZyZWV6YWJsZSBvYmplY3QgY2FuIHNpbXBseSByZXR1cm4gaXRzZWxmIHdpdGhvdXQgYWN0
dWFsbHkKLSAgICBjb25zdW1pbmcgbW9yZSBtZW1vcnkuCi0KLSAgICBAbWV0aG9kIGZyb3plbkNv
cHkKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNvcHkgb2YgcmVjZWl2ZXIgb3IgcmVjZWl2ZXIKLSAg
Ki8KLSAgZnJvemVuQ29weTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKEVtYmVyLkZyZWV6YWJsZSAm
JiBFbWJlci5GcmVlemFibGUuZGV0ZWN0KHRoaXMpKSB7Ci0gICAgICByZXR1cm4gZ2V0KHRoaXMs
ICdpc0Zyb3plbicpID8gdGhpcyA6IHRoaXMuY29weSgpLmZyZWV6ZSgpOwotICAgIH0gZWxzZSB7
Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuU3RyaW5nLmZtdCgiJUAgZG9lcyBu
b3Qgc3VwcG9ydCBmcmVlemluZyIsIFt0aGlzXSkpOwotICAgIH0KLSAgfQotfSk7Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQotKi8KLQotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Ci0KLS8qKgotICBUaGUgYEVtYmVyLkZyZWV6YWJsZWAgbWl4aW4gaW1wbGVtZW50cyBzb21lIGJh
c2ljIG1ldGhvZHMgZm9yIG1hcmtpbmcgYW4KLSAgb2JqZWN0IGFzIGZyb3plbi4gT25jZSBhbiBv
YmplY3QgaXMgZnJvemVuIGl0IHNob3VsZCBiZSByZWFkIG9ubHkuIE5vIGNoYW5nZXMKLSAgbWF5
IGJlIG1hZGUgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBvYmplY3QuCi0KLSAgIyMgRW5mb3Jj
ZW1lbnQKLQotICBUbyBmdWxseSBzdXBwb3J0IGZyZWV6aW5nIGluIHlvdXIgc3ViY2xhc3MsIHlv
dSBtdXN0IGluY2x1ZGUgdGhpcyBtaXhpbiBhbmQKLSAgb3ZlcnJpZGUgYW55IG1ldGhvZCB0aGF0
IG1pZ2h0IGFsdGVyIGFueSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IHRvIGluc3RlYWQKLSAgcmFp
c2UgYW4gZXhjZXB0aW9uLiBZb3UgY2FuIGNoZWNrIHRoZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkg
Y2hlY2tpbmcgdGhlCi0gIGBpc0Zyb3plbmAgcHJvcGVydHkuCi0KLSAgQWx0aG91Z2ggZnV0dXJl
IHZlcnNpb25zIG9mIEphdmFTY3JpcHQgbWF5IHN1cHBvcnQgbGFuZ3VhZ2UtbGV2ZWwgZnJlZXpp
bmcKLSAgb2JqZWN0IG9iamVjdHMsIHRoYXQgaXMgbm90IHRoZSBjYXNlIHRvZGF5LiBFdmVuIGlm
IGFuIG9iamVjdCBpcyBmcmVlemFibGUsCi0gIGl0IGlzIHN0aWxsIHRlY2huaWNhbGx5IHBvc3Np
YmxlIHRvIG1vZGlmeSB0aGUgb2JqZWN0LCBldmVuIHRob3VnaCBpdCBjb3VsZAotICBicmVhayBv
dGhlciBwYXJ0cyBvZiB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgZG8gbm90IGV4cGVjdCBhIGZyb3pl
biBvYmplY3QgdG8KLSAgY2hhbmdlLiBJdCBpcywgdGhlcmVmb3JlLCB2ZXJ5IGltcG9ydGFudCB0
aGF0IHlvdSBhbHdheXMgcmVzcGVjdCB0aGUKLSAgYGlzRnJvemVuYCBwcm9wZXJ0eSBvbiBhbGwg
ZnJlZXphYmxlIG9iamVjdHMuCi0KLSAgIyMgRXhhbXBsZSBVc2FnZQotCi0gIFRoZSBleGFtcGxl
IGJlbG93IHNob3dzIGEgc2ltcGxlIG9iamVjdCB0aGF0IGltcGxlbWVudCB0aGUgYEVtYmVyLkZy
ZWV6YWJsZWAKLSAgcHJvdG9jb2wuCi0KLSAgYGBgamF2YXNjcmlwdAotICBDb250YWN0ID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZChFbWJlci5GcmVlemFibGUsIHsKLSAgICBmaXJzdE5hbWU6IG51bGws
Ci0gICAgbGFzdE5hbWU6IG51bGwsCi0KLSAgICAvLyBzd2FwcyB0aGUgbmFtZXMKLSAgICBzd2Fw
TmFtZXM6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMuZ2V0KCdpc0Zyb3plbicpKSB0aHJv
dyBFbWJlci5GUk9aRU5fRVJST1I7Ci0gICAgICB2YXIgdG1wID0gdGhpcy5nZXQoJ2ZpcnN0TmFt
ZScpOwotICAgICAgdGhpcy5zZXQoJ2ZpcnN0TmFtZScsIHRoaXMuZ2V0KCdsYXN0TmFtZScpKTsK
LSAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScsIHRtcCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAg
ICB9Ci0KLSAgfSk7Ci0KLSAgYyA9IENvbnRhY3QuY3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIs
IGxhc3ROYW1lOiAiRG9lIiB9KTsKLSAgYy5zd2FwTmFtZXMoKTsgIC8vIHJldHVybnMgYwotICBj
LmZyZWV6ZSgpOwotICBjLnN3YXBOYW1lcygpOyAgLy8gRVhDRVBUSU9OCi0gIGBgYAotCi0gICMj
IENvcHlpbmcKLQotICBVc3VhbGx5IHRoZSBgRW1iZXIuRnJlZXphYmxlYCBwcm90b2NvbCBpcyBp
bXBsZW1lbnRlZCBpbiBjb29wZXJhdGlvbiB3aXRoIHRoZQotICBgRW1iZXIuQ29weWFibGVgIHBy
b3RvY29sLCB3aGljaCBkZWZpbmVzIGEgYGZyb3plbkNvcHkoKWAgbWV0aG9kIHRoYXQgd2lsbAot
ICByZXR1cm4gYSBmcm96ZW4gb2JqZWN0LCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhpcyBt
ZXRob2QgYXMgd2VsbC4KLQotICBAY2xhc3MgRnJlZXphYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIK
LSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVyLkZyZWV6YWJsZSA9IEVtYmVyLk1peGluLmNy
ZWF0ZSh7Ci0KLSAgLyoqCi0gICAgU2V0IHRvIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgZnJv
emVuLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBkZXRlY3QKLSAgICB3aGV0aGVyIHlvdXIgb2JqZWN0
IGlzIGZyb3plbiBvciBub3QuCi0KLSAgICBAcHJvcGVydHkgaXNGcm96ZW4KLSAgICBAdHlwZSBC
b29sZWFuCi0gICovCi0gIGlzRnJvemVuOiBmYWxzZSwKLQotICAvKioKLSAgICBGcmVlemVzIHRo
ZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIHRoZSBvYmplY3Qgc2hv
dWxkCi0gICAgbm8gbG9uZ2VyIGFsbG93IGFueSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZC4KLQot
ICAgIEBtZXRob2QgZnJlZXplCi0gICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAqLwot
ICBmcmVlemU6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHJl
dHVybiB0aGlzOwotICAgIHNldCh0aGlzLCAnaXNGcm96ZW4nLCB0cnVlKTsKLSAgICByZXR1cm4g
dGhpczsKLSAgfQotCi19KTsKLQotRW1iZXIuRlJPWkVOX0VSUk9SID0gIkZyb3plbiBvYmplY3Qg
Y2Fubm90IGJlIG1vZGlmaWVkLiI7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGZvckVh
Y2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKLQotLyoqCi0gIFRoaXMgbWl4aW4g
ZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlpbmcgZ2VuZXJpYyBlbnVtZXJhYmxlcy4gVGhlc2Ug
bWV0aG9kcwotICBjYW4gYmUgYXBwbGllZCB0byBhbiBvYmplY3QgcmVnYXJkbGVzcyBvZiB3aGV0
aGVyIGl0IGlzIG9yZGVyZWQgb3IKLSAgdW5vcmRlcmVkLgotCi0gIE5vdGUgdGhhdCBhbiBFbnVt
ZXJhYmxlIGNhbiBjaGFuZ2UgZXZlbiBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhp
bi4KLSAgRm9yIGV4YW1wbGUsIGEgTWFwcGVkRW51bWVyYWJsZSBjYW5ub3QgYmUgZGlyZWN0bHkg
bW9kaWZpZWQgYnV0IGlmIGl0cwotICB1bmRlcmx5aW5nIGVudW1lcmFibGUgY2hhbmdlcywgaXQg
d2lsbCBjaGFuZ2UgYWxzby4KLQotICAjIyBBZGRpbmcgT2JqZWN0cwotCi0gIFRvIGFkZCBhbiBv
YmplY3QgdG8gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBgYWRkT2JqZWN0KClgIG1ldGhvZC4gVGhp
cwotICBtZXRob2Qgd2lsbCBvbmx5IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJhYmxlIGlm
IHRoZSBvYmplY3QgaXMgbm90Ci0gIGFscmVhZHkgcHJlc2VudCBhbmQgaXMgb2YgYSB0eXBlIHN1
cHBvcnRlZCBieSB0aGUgZW51bWVyYWJsZS4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHNldC5hZGRP
YmplY3QoY29udGFjdCk7Ci0gIGBgYAotCi0gICMjIFJlbW92aW5nIE9iamVjdHMKLQotICBUbyBy
ZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0
KClgIG1ldGhvZC4gVGhpcwotICB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBvYmplY3QgaWYgaXQgaXMg
cHJlc2VudCBpbiB0aGUgZW51bWVyYWJsZSwgb3RoZXJ3aXNlCi0gIHRoaXMgbWV0aG9kIGhhcyBu
byBlZmZlY3QuCi0KLSAgYGBgamF2YXNjcmlwdAotICBzZXQucmVtb3ZlT2JqZWN0KGNvbnRhY3Qp
OwotICBgYGAKLQotICAjIyBJbXBsZW1lbnRpbmcgSW4gWW91ciBPd24gQ29kZQotCi0gIElmIHlv
dSBhcmUgaW1wbGVtZW50aW5nIGFuIG9iamVjdCBhbmQgd2FudCB0byBzdXBwb3J0IHRoaXMgQVBJ
LCBqdXN0IGluY2x1ZGUKLSAgdGhpcyBtaXhpbiBpbiB5b3VyIGNsYXNzIGFuZCBpbXBsZW1lbnQg
dGhlIHJlcXVpcmVkIG1ldGhvZHMuIEluIHlvdXIgdW5pdAotICB0ZXN0cywgYmUgc3VyZSB0byBh
cHBseSB0aGUgRW1iZXIuTXV0YWJsZUVudW1lcmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KLQot
ICBAY2xhc3MgTXV0YWJsZUVudW1lcmFibGUKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBF
bWJlci5FbnVtZXJhYmxlCi0qLwotRW1iZXIuTXV0YWJsZUVudW1lcmFibGUgPSBFbWJlci5NaXhp
bi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwgewotCi0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18g
WW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAg
ICBBdHRlbXB0cyB0byBhZGQgdGhlIHBhc3NlZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRo
ZSBvYmplY3QgaXMgbm90Ci0gICAgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJ
ZiB0aGUgb2JqZWN0IGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCi0gICAgaGFzIG5vIGVmZmVjdC4K
LQotICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5
IHRoZSByZWNlaXZlciwKLSAgICB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNl
cHRpb24uCi0KLSAgICBAbWV0aG9kIGFkZE9iamVjdAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmpl
Y3QgVGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGVudW1lcmFibGUuCi0gICAgQHJldHVybiB7T2Jq
ZWN0fSB0aGUgcGFzc2VkIG9iamVjdAotICAqLwotICBhZGRPYmplY3Q6IEVtYmVyLnJlcXVpcmVk
KEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBBZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQg
ZW51bWVyYWJsZSB0byB0aGUgcmVjZWl2ZXIuCi0KLSAgICBAbWV0aG9kIGFkZE9iamVjdHMKLSAg
ICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgot
ICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2ZXIKLSAgKi8KLSAgYWRkT2JqZWN0czogZnVuY3Rp
b24ob2JqZWN0cykgewotICAgIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICAg
IGZvckVhY2gob2JqZWN0cywgZnVuY3Rpb24ob2JqKSB7IHRoaXMuYWRkT2JqZWN0KG9iaik7IH0s
IHRoaXMpOwotICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKLSAgICByZXR1cm4g
dGhpczsKLSAgfSwKLQotICAvKioKLSAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVu
dCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgotCi0gICAgQXR0ZW1wdHMgdG8gcmVt
b3ZlIHRoZSBwYXNzZWQgb2JqZWN0IGZyb20gdGhlIHJlY2VpdmVyIGNvbGxlY3Rpb24gaWYgdGhl
Ci0gICAgb2JqZWN0IGlzIHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3Qg
aXMgbm90IHByZXNlbnQsCi0gICAgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KLQotICAgIElm
IHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNl
aXZlciwKLSAgICB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0K
LSAgICBAbWV0aG9kIHJlbW92ZU9iamVjdAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhl
IG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGUgZW51bWVyYWJsZS4KLSAgICBAcmV0dXJuIHtPYmpl
Y3R9IHRoZSBwYXNzZWQgb2JqZWN0Ci0gICovCi0gIHJlbW92ZU9iamVjdDogRW1iZXIucmVxdWly
ZWQoRnVuY3Rpb24pLAotCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUg
cGFzc2VkIGVudW1lcmFibGUgZnJvbSB0aGUgcmVjZWl2ZXIuCi0KLSAgICBAbWV0aG9kIHJlbW92
ZU9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVj
dHMgdG8gcmVtb3ZlCi0gICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAqLwotICByZW1v
dmVPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNo
YW5nZXModGhpcyk7Ci0gICAgZm9yRWFjaChvYmplY3RzLCBmdW5jdGlvbihvYmopIHsgdGhpcy5y
ZW1vdmVPYmplY3Qob2JqKTsgfSwgdGhpcyk7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2Vz
KHRoaXMpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUK
LSovCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8vCi0KLXZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9O
ID0gIkluZGV4IG91dCBvZiByYW5nZSIgOwotdmFyIEVNUFRZID0gW107Ci0KLS8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEhF
TFBFUlMKLS8vCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoq
Ci0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlpbmcgYXJyYXktbGlrZSBv
YmplY3RzLiBUaGVzZSBtZXRob2RzCi0gIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gYSBjb2xsZWN0
aW9uIHRoYXQga2VlcHMgaXRzIGl0ZW1zIGluIGFuIG9yZGVyZWQgc2V0LgotCi0gIE5vdGUgdGhh
dCBhbiBBcnJheSBjYW4gY2hhbmdlIGV2ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMg
bWl4aW4uCi0gIEZvciBleGFtcGxlLCBvbmUgbWlnaHQgaW1wbGVtZW50IGEgU3BhcnNlQXJyYXkg
dGhhdCBjYW5ub3QgYmUgZGlyZWN0bHkKLSAgbW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWlu
ZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCi0KLSAgQGNsYXNzIE11
dGFibGVBcnJheQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEB1c2VzIEVtYmVyLkFycmF5Ci0gIEB1
c2VzIEVtYmVyLk11dGFibGVFbnVtZXJhYmxlCi0qLwotRW1iZXIuTXV0YWJsZUFycmF5ID0gRW1i
ZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFycmF5LCBFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwgewot
Ci0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9k
IHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZl
cyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIFlvdSBz
aG91bGQgcmVwbGFjZSBhbXQgb2JqZWN0cyBzdGFydGVkIGF0IGlkeCB3aXRoIHRoZSBvYmplY3Rz
IGluIHRoZQotICAgIHBhc3NlZCBhcnJheS4gWW91IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51
bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAKLQotICAgIEBtZXRob2QgcmVwbGFjZQotICAgIEBw
YXJhbSB7TnVtYmVyfSBpZHggU3RhcnRpbmcgaW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2Uu
IElmCi0gICAgICBpZHggPj0gbGVuZ3RoLCB0aGVuIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBh
cnJheS4KLSAgICBAcGFyYW0ge051bWJlcn0gYW10IE51bWJlciBvZiBlbGVtZW50cyB0aGF0IHNo
b3VsZCBiZSByZW1vdmVkIGZyb20KLSAgICAgIHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCou
Ci0gICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgb2Jq
ZWN0cyB0aGF0IHNob3VsZCBiZQotICAgICAgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlk
eCoKLSAgKi8KLSAgcmVwbGFjZTogRW1iZXIucmVxdWlyZWQoKSwKLQotICAvKioKLSAgICBSZW1v
dmUgYWxsIGVsZW1lbnRzIGZyb20gc2VsZi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91Ci0gICAgd2Fu
dCB0byByZXVzZSBhbiBleGlzdGluZyBhcnJheSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBp
dC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4i
LCAiYmx1ZSJdOwotICAgIGNvbG9yLmxlbmd0aCgpOyAgIC8vICAzCi0gICAgY29sb3JzLmNsZWFy
KCk7ICAgLy8gIFtdCi0gICAgY29sb3JzLmxlbmd0aCgpOyAgLy8gIDAKLSAgICBgYGAKLQotICAg
IEBtZXRob2QgY2xlYXIKLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gQW4gZW1wdHkgQXJyYXku
Ci0gICovCi0gIGNsZWFyOiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAn
bGVuZ3RoJyk7Ci0gICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7Ci0gICAgdGhpcy5yZXBs
YWNlKDAsIGxlbiwgRU1QVFkpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAg
IFRoaXMgd2lsbCB1c2UgdGhlIHByaW1pdGl2ZSBgcmVwbGFjZSgpYCBtZXRob2QgdG8gaW5zZXJ0
IGFuIG9iamVjdCBhdCB0aGUKLSAgICBzcGVjaWZpZWQgaW5kZXguCi0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xv
cnMuaW5zZXJ0QXQoMiwgInllbGxvdyIpOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAieWVsbG93Iiwg
ImJsdWUiXQotICAgIGNvbG9ycy5pbnNlcnRBdCg1LCAib3JhbmdlIik7ICAvLyBFcnJvcjogSW5k
ZXggb3V0IG9mIHJhbmdlCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGluc2VydEF0Ci0gICAgQHBh
cmFtIHtOdW1iZXJ9IGlkeCBpbmRleCBvZiBpbnNlcnQgdGhlIG9iamVjdCBhdC4KLSAgICBAcGFy
YW0ge09iamVjdH0gb2JqZWN0IG9iamVjdCB0byBpbnNlcnQKLSAgICBAcmV0dXJuIHRoaXMKLSAg
Ki8KLSAgaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdl
dCh0aGlzLCAnbGVuZ3RoJykpIHRocm93IG5ldyBFbWJlci5FcnJvcihPVVRfT0ZfUkFOR0VfRVhD
RVBUSU9OKSA7Ci0gICAgdGhpcy5yZXBsYWNlKGlkeCwgMCwgW29iamVjdF0pIDsKLSAgICByZXR1
cm4gdGhpcyA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlIGFuIG9iamVjdCBhdCB0aGUgc3Bl
Y2lmaWVkIGluZGV4IHVzaW5nIHRoZSBgcmVwbGFjZSgpYCBwcmltaXRpdmUKLSAgICBtZXRob2Qu
IFlvdSBjYW4gcGFzcyBlaXRoZXIgYSBzaW5nbGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVu
Z3RoLgotCi0gICAgSWYgeW91IHBhc3MgYSBzdGFydCBhbmQgbGVuZ3RoIHRoYXQgaXMgYmV5b25k
IHRoZQotICAgIGxlbmd0aCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGBPVVRfT0ZfUkFOR0Vf
RVhDRVBUSU9OYC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQi
LCAiZ3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ciLCAib3JhbmdlIl07Ci0gICAgY29sb3JzLnJlbW92
ZUF0KDApOyAgICAgLy8gWyJncmVlbiIsICJibHVlIiwgInllbGxvdyIsICJvcmFuZ2UiXQotICAg
IGNvbG9ycy5yZW1vdmVBdCgyLCAyKTsgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgY29sb3Jz
LnJlbW92ZUF0KDQsIDIpOyAgLy8gRXJyb3I6IEluZGV4IG91dCBvZiByYW5nZQotICAgIGBgYAot
Ci0gICAgQG1ldGhvZCByZW1vdmVBdAotICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBpbmRleCwg
c3RhcnQgb2YgcmFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gbGVuIGxlbmd0aCBvZiBwYXNzaW5n
IHJhbmdlCi0gICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAqLwotICByZW1vdmVBdDog
ZnVuY3Rpb24oc3RhcnQsIGxlbikgewotICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHN0YXJ0
KSB7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5n
dGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENF
UFRJT04pOwotICAgICAgfQotCi0gICAgICAvLyBmYXN0IGNhc2UKLSAgICAgIGlmIChsZW4gPT09
IHVuZGVmaW5lZCkgbGVuID0gMTsKLSAgICAgIHRoaXMucmVwbGFjZShzdGFydCwgbGVuLCBFTVBU
WSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMgOwotICB9LAotCi0gIC8qKgotICAgIFB1c2gg
dGhlIG9iamVjdCBvbnRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHB1
c2goKWAgYnV0IGl0Ci0gICAgaXMgS1ZPLWNvbXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iXTsKLSAgICBjb2xvcnMucHVzaE9iamVj
dCgiYmxhY2siKTsgICAgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsYWNrIl0KLSAgICBjb2xvcnMu
cHVzaE9iamVjdChbInllbGxvdyJdKTsgIC8vIFsicmVkIiwgImdyZWVuIiwgWyJ5ZWxsb3ciXV0K
LSAgICBgYGAKLQotICAgIEBtZXRob2QgcHVzaE9iamVjdAotICAgIEBwYXJhbSB7Kn0gb2JqIG9i
amVjdCB0byBwdXNoCi0gICAgQHJldHVybiBUaGUgc2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCi0g
ICovCi0gIHB1c2hPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIHRoaXMuaW5zZXJ0QXQoZ2V0
KHRoaXMsICdsZW5ndGgnKSwgb2JqKSA7Ci0gICAgcmV0dXJuIG9iajsKLSAgfSwKLQotICAvKioK
LSAgICBBZGQgdGhlIG9iamVjdHMgaW4gdGhlIHBhc3NlZCBudW1lcmFibGUgdG8gdGhlIGVuZCBv
ZiB0aGUgYXJyYXkuIERlZmVycwotICAgIG5vdGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5n
ZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRkZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
dmFyIGNvbG9ycyA9IFsicmVkIl07Ci0gICAgY29sb3JzLnB1c2hPYmplY3RzKFsieWVsbG93Iiwg
Im9yYW5nZSJdKTsgIC8vIFsicmVkIiwgInllbGxvdyIsICJvcmFuZ2UiXQotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCBwdXNoT2JqZWN0cwotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2Jq
ZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2
ZXIKLSAgKi8KLSAgcHVzaE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBpZiAoIShF
bWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmplY3RzKSB8fCBFbWJlci5pc0FycmF5KG9iamVjdHMp
KSkgewotICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiTXVzdCBwYXNzIEVtYmVyLkVudW1lcmFi
bGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1c2hPYmplY3RzIik7Ci0gICAgfQotICAgIHRoaXMu
cmVwbGFjZShnZXQodGhpcywgJ2xlbmd0aCcpLCAwLCBvYmplY3RzKTsKLSAgICByZXR1cm4gdGhp
czsKLSAgfSwKLQotICAvKioKLSAgICBQb3Agb2JqZWN0IGZyb20gYXJyYXkgb3IgbmlsIGlmIG5v
bmUgYXJlIGxlZnQuIFdvcmtzIGp1c3QgbGlrZSBgcG9wKClgIGJ1dAotICAgIGl0IGlzIEtWTy1j
b21wbGlhbnQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwg
ImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvcnMucG9wT2JqZWN0KCk7ICAgLy8gImJsdWUiCi0g
ICAgY29uc29sZS5sb2coY29sb3JzKTsgIC8vIFsicmVkIiwgImdyZWVuIl0KLSAgICBgYGAKLQot
ICAgIEBtZXRob2QgcG9wT2JqZWN0Ci0gICAgQHJldHVybiBvYmplY3QKLSAgKi8KLSAgcG9wT2Jq
ZWN0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7Ci0g
ICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIG51bGwgOwotCi0gICAgdmFyIHJldCA9IHRoaXMub2Jq
ZWN0QXQobGVuLTEpIDsKLSAgICB0aGlzLnJlbW92ZUF0KGxlbi0xLCAxKSA7Ci0gICAgcmV0dXJu
IHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2hpZnQgYW4gb2JqZWN0IGZyb20gc3RhcnQgb2Yg
YXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxlZnQuIFdvcmtzIGp1c3QKLSAgICBsaWtlIGBzaGlm
dCgpYCBidXQgaXQgaXMgS1ZPLWNvbXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdOwotICAgIGNvbG9ycy5zaGlmdE9i
amVjdCgpOyAgLy8gInJlZCIKLSAgICBjb25zb2xlLmxvZyhjb2xvcnMpOyAgIC8vIFsiZ3JlZW4i
LCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNoaWZ0T2JqZWN0Ci0gICAgQHJldHVy
biBvYmplY3QKLSAgKi8KLSAgc2hpZnRPYmplY3Q6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQo
dGhpcywgJ2xlbmd0aCcpID09PSAwKSByZXR1cm4gbnVsbCA7Ci0gICAgdmFyIHJldCA9IHRoaXMu
b2JqZWN0QXQoMCkgOwotICAgIHRoaXMucmVtb3ZlQXQoMCkgOwotICAgIHJldHVybiByZXQgOwot
ICB9LAotCi0gIC8qKgotICAgIFVuc2hpZnQgYW4gb2JqZWN0IHRvIHN0YXJ0IG9mIGFycmF5LiBX
b3JrcyBqdXN0IGxpa2UgYHVuc2hpZnQoKWAgYnV0IGl0IGlzCi0gICAgS1ZPLWNvbXBsaWFudC4K
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiXTsKLSAgICBjb2xv
cnMudW5zaGlmdE9iamVjdCgieWVsbG93Iik7ICAgIC8vIFsieWVsbG93IiwgInJlZCJdCi0gICAg
Y29sb3JzLnVuc2hpZnRPYmplY3QoWyJibGFjayJdKTsgICAvLyBbWyJibGFjayJdLCAieWVsbG93
IiwgInJlZCJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVuc2hpZnRPYmplY3QKLSAgICBAcGFy
YW0geyp9IG9iaiBvYmplY3QgdG8gdW5zaGlmdAotICAgIEByZXR1cm4gVGhlIHNhbWUgb2JqIHBh
c3NlZCBhcyBwYXJhbQotICAqLwotICB1bnNoaWZ0T2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAg
ICB0aGlzLmluc2VydEF0KDAsIG9iaikgOwotICAgIHJldHVybiBvYmogOwotICB9LAotCi0gIC8q
KgotICAgIEFkZHMgdGhlIG5hbWVkIG9iamVjdHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJy
YXkuIERlZmVycyBub3RpZnlpbmcKLSAgICBvYnNlcnZlcnMgdW50aWwgYWxsIG9iamVjdHMgaGF2
ZSBiZWVuIGFkZGVkLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJl
ZCJdOwotICAgIGNvbG9ycy51bnNoaWZ0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8v
IFsiYmxhY2siLCAid2hpdGUiLCAicmVkIl0KLSAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoInll
bGxvdyIpOyAvLyBUeXBlIEVycm9yOiAndW5kZWZpbmVkJyBpcyBub3QgYSBmdW5jdGlvbgotICAg
IGBgYAotCi0gICAgQG1ldGhvZCB1bnNoaWZ0T2JqZWN0cwotICAgIEBwYXJhbSB7RW1iZXIuRW51
bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKLSAgICBAcmV0dXJuIHtFbWJlci5B
cnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMp
IHsKLSAgICB0aGlzLnJlcGxhY2UoMCwgMCwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgUmV2ZXJzZSBvYmplY3RzIGluIHRoZSBhcnJheS4gV29ya3MganVz
dCBsaWtlIGByZXZlcnNlKClgIGJ1dCBpdCBpcwotICAgIEtWTy1jb21wbGlhbnQuCi0KLSAgICBA
bWV0aG9kIHJldmVyc2VPYmplY3RzCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVy
Ci0gICAqLwotICByZXZlcnNlT2JqZWN0czogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxlbiA9IGdl
dCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7Ci0gICAg
dmFyIG9iamVjdHMgPSB0aGlzLnRvQXJyYXkoKS5yZXZlcnNlKCk7Ci0gICAgdGhpcy5yZXBsYWNl
KDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
UmVwbGFjZSBhbGwgdGhlIHRoZSByZWNlaXZlcidzIGNvbnRlbnQgd2l0aCBjb250ZW50IG9mIHRo
ZSBhcmd1bWVudC4KLSAgICBJZiBhcmd1bWVudCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3
aWxsIGJlIGNsZWFyZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsi
cmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvcnMuc2V0T2JqZWN0cyhbImJsYWNrIiwg
IndoaXRlIl0pOyAgLy8gWyJibGFjayIsICJ3aGl0ZSJdCi0gICAgY29sb3JzLnNldE9iamVjdHMo
W10pOyAgICAgICAgICAgICAgICAgIC8vIFtdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNldE9i
amVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkFycmF5fSBvYmplY3RzIGFycmF5IHdob3NlIGNvbnRl
bnQgd2lsbCBiZSB1c2VkIGZvciByZXBsYWNpbmcKLSAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhl
IHJlY2VpdmVyCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyIHdpdGggdGhlIG5l
dyBjb250ZW50Ci0gICAqLwotICBzZXRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAg
aWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5jbGVhcigpOwotCi0gICAgdmFy
IGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2Jq
ZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBJTVBMRU1FTlQg
RW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAgLy8KLQotICByZW1vdmVPYmplY3Q6IGZ1bmN0aW9u
KG9iaikgewotICAgIHZhciBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcpIHx8IDA7Ci0gICAgd2hp
bGUoLS1sb2MgPj0gMCkgewotICAgICAgdmFyIGN1ck9iamVjdCA9IHRoaXMub2JqZWN0QXQobG9j
KSA7Ci0gICAgICBpZiAoY3VyT2JqZWN0ID09PSBvYmopIHRoaXMucmVtb3ZlQXQobG9jKSA7Ci0g
ICAgfQotICAgIHJldHVybiB0aGlzIDsKLSAgfSwKLQotICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9i
aikgewotICAgIGlmICghdGhpcy5jb250YWlucyhvYmopKSB0aGlzLnB1c2hPYmplY3Qob2JqKTsK
LSAgICByZXR1cm4gdGhpcyA7Ci0gIH0KLQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLWBFbWJlci5UYXJn
ZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGluIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xh
c3MKLXRvIGFkZCBhIGB0cmlnZ2VyQWN0aW9uYCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mgc2ltaWxh
ciB0byB0aGUgSGFuZGxlYmFycwotYHt7YWN0aW9ufX1gIGhlbHBlci4gSW4gbm9ybWFsIEVtYmVy
IHVzYWdlLCB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciBpcwotdXN1YWxseSB0aGUgYmVzdCBjaG9p
Y2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRlbiB1c2VmdWwgd2hlbiB5b3UgYXJlCi1kb2luZyBt
b3JlIGNvbXBsZXggZXZlbnQgaGFuZGxpbmcgaW4gVmlldyBvYmplY3RzLgotCi1TZWUgYWxzbyBg
RW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBvcnRgLCB3aGljaCBoYXMKLXZpZXctYXdhcmUgZGVm
YXVsdHMgZm9yIHRhcmdldCBhbmQgYWN0aW9uQ29udGV4dC4KLQotQGNsYXNzIFRhcmdldEFjdGlv
blN1cHBvcnQKLUBuYW1lc3BhY2UgRW1iZXIKLUBleHRlbmRzIEVtYmVyLk1peGluCi0qLwotRW1i
ZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIHRhcmdldDog
bnVsbCwKLSAgYWN0aW9uOiBudWxsLAotICBhY3Rpb25Db250ZXh0OiBudWxsLAotCi0gIHRhcmdl
dE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRhcmdldCA9IGdl
dCh0aGlzLCAndGFyZ2V0Jyk7Ci0KLSAgICBpZiAoRW1iZXIudHlwZU9mKHRhcmdldCkgPT09ICJz
dHJpbmciKSB7Ci0gICAgICB2YXIgdmFsdWUgPSBnZXQodGhpcywgdGFyZ2V0KTsKLSAgICAgIGlm
ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gZ2V0KEVtYmVyLmxvb2t1cCwgdGFyZ2V0
KTsgfQotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGFy
Z2V0OwotICAgIH0KLSAgfSkucHJvcGVydHkoJ3RhcmdldCcpLAotCi0gIGFjdGlvbkNvbnRleHRP
YmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBhY3Rpb25Db250ZXh0
ID0gZ2V0KHRoaXMsICdhY3Rpb25Db250ZXh0Jyk7Ci0KLSAgICBpZiAoRW1iZXIudHlwZU9mKGFj
dGlvbkNvbnRleHQpID09PSAic3RyaW5nIikgewotICAgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMs
IGFjdGlvbkNvbnRleHQpOwotICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUg
PSBnZXQoRW1iZXIubG9va3VwLCBhY3Rpb25Db250ZXh0KTsgfQotICAgICAgcmV0dXJuIHZhbHVl
OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYWN0aW9uQ29udGV4dDsKLSAgICB9Ci0gIH0p
LnByb3BlcnR5KCdhY3Rpb25Db250ZXh0JyksCi0KLSAgLyoqCi0gIFNlbmQgYW4gImFjdGlvbiIg
d2l0aCBhbiAiYWN0aW9uQ29udGV4dCIgdG8gYSAidGFyZ2V0Ii4gVGhlIGFjdGlvbiwgYWN0aW9u
Q29udGV4dAotICBhbmQgdGFyZ2V0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gcHJvcGVydGllcyBv
ZiB0aGUgb2JqZWN0LiBGb3IgZXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5TYXZl
QnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQs
IHsKLSAgICB0YXJnZXQ6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250cm9sbGVyJyksCi0gICAg
YWN0aW9uOiAnc2F2ZScsCi0gICAgYWN0aW9uQ29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMo
J2NvbnRleHQnKSwKLSAgICBjbGljazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJB
Y3Rpb24oKTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJl
bnQgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50
IGNvbnRyb2xsZXIKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBUaGUgYHRhcmdldGAsIGBhY3Rp
b25gLCBhbmQgYGFjdGlvbkNvbnRleHRgIGNhbiBiZSBwcm92aWRlZCBhcyBwcm9wZXJ0aWVzIG9m
Ci0gIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1bWVudCB0byBgdHJpZ2dlckFjdGlvbmAgYXMgd2Vs
bC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgICBjbGljazogZnVuY3Rpb24o
KSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAgICBhY3Rpb246ICdzYXZlJywK
LSAgICAgICAgdGFyZ2V0OiB0aGlzLmdldCgnY29udHJvbGxlcicpLAotICAgICAgICBhY3Rpb25D
b250ZXh0OiB0aGlzLmdldCgnY29udGV4dCcpLAotICAgICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2
ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgICAgICAvLyB0
byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIGBh
Y3Rpb25Db250ZXh0YCBkZWZhdWx0cyB0byB0aGUgb2JqZWN0IHlvdSBtaXhpbmcgYFRhcmdldEFj
dGlvblN1cHBvcnRgIGludG8uCi0gIEJ1dCBgdGFyZ2V0YCBhbmQgYGFjdGlvbmAgbXVzdCBiZSBz
cGVjaWZpZWQgZWl0aGVyIGFzIHByb3BlcnRpZXMgb3Igd2l0aCB0aGUgYXJndW1lbnQKLSAgdG8g
YHRyaWdnZXJBY3Rpb25gLCBvciBhIGNvbWJpbmF0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
QXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9u
U3VwcG9ydCwgewotICAgIHRhcmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXIn
KSwKLSAgICBjbGljazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oewot
ICAgICAgICBhY3Rpb246ICdzYXZlJwotICAgICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0
aW9uLCBhbG9uZyB3aXRoIGEgcmVmZXJlbmNlIHRvIGB0aGlzYCwKLSAgICAgICAgICAvLyB0byB0
aGUgY3VycmVudCBjb250cm9sbGVyCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCB0
cmlnZ2VyQWN0aW9uCi0gIEBwYXJhbSBvcHRzIHtIYXNofSAob3B0aW9uYWwsIHdpdGggdGhlIG9w
dGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQgYW5kL29yIGFjdGlvbkNvbnRleHQpCi0gIEByZXR1
cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFjdGlvbiB3YXMgc2VudCBzdWNjZXNzZnVsbHkgYW5k
IGRpZCBub3QgcmV0dXJuIGZhbHNlCi0gICovCi0gIHRyaWdnZXJBY3Rpb246IGZ1bmN0aW9uKG9w
dHMpIHsKLSAgICBvcHRzID0gb3B0cyB8fCB7fTsKLSAgICB2YXIgYWN0aW9uID0gb3B0cy5hY3Rp
b24gfHwgZ2V0KHRoaXMsICdhY3Rpb24nKSwKLSAgICAgICAgdGFyZ2V0ID0gb3B0cy50YXJnZXQg
fHwgZ2V0KHRoaXMsICd0YXJnZXRPYmplY3QnKSwKLSAgICAgICAgYWN0aW9uQ29udGV4dCA9IG9w
dHMuYWN0aW9uQ29udGV4dDsKLQotICAgIGZ1bmN0aW9uIGFyZ3Mob3B0aW9ucywgYWN0aW9uTmFt
ZSkgewotICAgICAgdmFyIHJldCA9IFtdOwotICAgICAgaWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1
c2goYWN0aW9uTmFtZSk7IH0KLQotICAgICAgcmV0dXJuIHJldC5jb25jYXQob3B0aW9ucyk7Ci0g
ICAgfQotCi0gICAgaWYgKHR5cGVvZiBhY3Rpb25Db250ZXh0ID09PSAndW5kZWZpbmVkJykgewot
ICAgICAgYWN0aW9uQ29udGV4dCA9IGdldCh0aGlzLCAnYWN0aW9uQ29udGV4dE9iamVjdCcpIHx8
IHRoaXM7Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldCAmJiBhY3Rpb24pIHsKLSAgICAgIHZhciBy
ZXQ7Ci0KLSAgICAgIGlmICh0YXJnZXQuc2VuZCkgewotICAgICAgICByZXQgPSB0YXJnZXQuc2Vu
ZC5hcHBseSh0YXJnZXQsIGFyZ3MoYWN0aW9uQ29udGV4dCwgYWN0aW9uKSk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSBhY3Rpb24gJyIgKyBhY3Rpb24gKyAiJyBk
aWQgbm90IGV4aXN0IG9uICIgKyB0YXJnZXQsIHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9PT0gJ2Z1
bmN0aW9uJyk7Ci0gICAgICAgIHJldCA9IHRhcmdldFthY3Rpb25dLmFwcGx5KHRhcmdldCwgYXJn
cyhhY3Rpb25Db250ZXh0KSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXQgIT09IGZhbHNlKSBy
ZXQgPSB0cnVlOwotCi0gICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioK
LSAgVGhpcyBtaXhpbiBhbGxvd3MgZm9yIEVtYmVyIG9iamVjdHMgdG8gc3Vic2NyaWJlIHRvIGFu
ZCBlbWl0IGV2ZW50cy4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5QZXJzb24gPSBFbWJlci5P
YmplY3QuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLSAgICBncmVldDogZnVuY3Rpb24oKSB7Ci0g
ICAgICAvLyAuLi4KLSAgICAgIHRoaXMudHJpZ2dlcignZ3JlZXQnKTsKLSAgICB9Ci0gIH0pOwot
Ci0gIHZhciBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpOwotCi0gIHBlcnNvbi5vbignZ3Jl
ZXQnLCBmdW5jdGlvbigpIHsKLSAgICBjb25zb2xlLmxvZygnT3VyIHBlcnNvbiBoYXMgZ3JlZXRl
ZCcpOwotICB9KTsKLQotICBwZXJzb24uZ3JlZXQoKTsKLQotICAvLyBvdXRwdXRzOiAnT3VyIHBl
cnNvbiBoYXMgZ3JlZXRlZCcKLSAgYGBgCi0KLSAgWW91IGNhbiBhbHNvIGNoYWluIG11bHRpcGxl
IGV2ZW50IHN1YnNjcmlwdGlvbnM6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBwZXJzb24ub24oJ2dy
ZWV0JywgZnVuY3Rpb24oKSB7Ci0gICAgY29uc29sZS5sb2coJ091ciBwZXJzb24gaGFzIGdyZWV0
ZWQnKTsKLSAgfSkub25lKCdncmVldCcsIGZ1bmN0aW9uKCkgewotICAgIGNvbnNvbGUubG9nKCdP
ZmZlciBvbmUtdGltZSBzcGVjaWFsJyk7Ci0gIH0pLm9mZignZXZlbnQnLCB0aGlzLCBmb3JnZXRU
aGlzKTsKLSAgYGBgCi0KLSAgQGNsYXNzIEV2ZW50ZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICov
Ci1FbWJlci5FdmVudGVkID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLQotICAvKioKLSAgIFN1YnNj
cmliZXMgdG8gYSBuYW1lZCBldmVudCB3aXRoIGdpdmVuIGZ1bmN0aW9uLgotCi0gICBgYGBqYXZh
c2NyaXB0Ci0gICBwZXJzb24ub24oJ2RpZExvYWQnLCBmdW5jdGlvbigpIHsKLSAgICAgLy8gZmly
ZWQgb25jZSB0aGUgcGVyc29uIGhhcyBsb2FkZWQKLSAgIH0pOwotICAgYGBgCi0KLSAgIEFuIG9w
dGlvbmFsIHRhcmdldCBjYW4gYmUgcGFzc2VkIGluIGFzIHRoZSAybmQgYXJndW1lbnQgdGhhdCB3
aWxsCi0gICBiZSBzZXQgYXMgdGhlICJ0aGlzIiBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlzIGEg
Z29vZCB3YXkgdG8gZ2l2ZSB5b3VyCi0gICBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0
cmlnZ2VyaW5nIHRoZSBldmVudC4gV2hlbiB0aGUgdGFyZ2V0Ci0gICBwYXJhbWV0ZXIgaXMgdXNl
ZCB0aGUgY2FsbGJhY2sgYmVjb21lcyB0aGUgdGhpcmQgYXJndW1lbnQuCi0KLSAgIEBtZXRob2Qg
b24KLSAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAidGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNr
Ci0gICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAg
IEByZXR1cm4gdGhpcwotICAqLwotICBvbjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2Qp
IHsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7Ci0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU3Vic2NyaWJlcyBhIGZ1bmN0aW9u
IHRvIGEgbmFtZWQgZXZlbnQgYW5kIHRoZW4gY2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uCi0gICAg
YWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4gSXQgaXMgZ29vZCB0
byB1c2UgYGBvbmVgYCB3aGVuCi0gICAgeW91IG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgdGlt
ZSBhbiBldmVudCBoYXMgdGFrZW4gcGxhY2UuCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFu
IG9wdGlvbmFsIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwgYmVjb21lIHRoZSAidGhpcyIKLSAgICB2
YWx1ZSBmb3IgdGhlIGNhbGxiYWNrLiBJZiB0aGlzIGFyZ3VtZW50IGlzIHBhc3NlZCB0aGVuIHRo
ZSAzcmQgYXJndW1lbnQKLSAgICBiZWNvbWVzIHRoZSBmdW5jdGlvbi4KLQotICAgIEBtZXRob2Qg
b25lCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50Ci0gICAg
QHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAidGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxi
YWNrCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBjYWxsYmFjayB0byBleGVjdXRl
Ci0gICAgQHJldHVybiB0aGlzCi0gICovCi0gIG9uZTogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBt
ZXRob2QpIHsKLSAgICBpZiAoIW1ldGhvZCkgewotICAgICAgbWV0aG9kID0gdGFyZ2V0OwotICAg
ICAgdGFyZ2V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCBu
YW1lLCB0YXJnZXQsIG1ldGhvZCwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVHJpZ2dlcnMgYSBuYW1lZCBldmVudCBmb3IgdGhlIG9iamVjdC4gQW55IGFkZGl0
aW9uYWwgYXJndW1lbnRzCi0gICAgd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUg
ZnVuY3Rpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gdGhlCi0gICAgZXZlbnQuCi0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uLm9uKCdkaWRFYXQnLCBmdW5jdGlvbihmb29kKSB7Ci0g
ICAgICBjb25zb2xlLmxvZygncGVyc29uIGF0ZSBzb21lICcgKyBmb29kKTsKLSAgICB9KTsKLQot
ICAgIHBlcnNvbi50cmlnZ2VyKCdkaWRFYXQnLCAnYnJvY2NvbGknKTsKLQotICAgIC8vIG91dHB1
dHM6IHBlcnNvbiBhdGUgc29tZSBicm9jY29saQotICAgIGBgYAotICAgIEBtZXRob2QgdHJpZ2dl
cgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBw
YXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIG9uCi0gICov
Ci0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLCBpLCBsOwot
ICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAg
ICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKLSAgICB9Ci0gICAgRW1iZXIuc2VuZEV2ZW50KHRo
aXMsIG5hbWUsIGFyZ3MpOwotICB9LAotCi0gIC8qKgotICAgIENhbmNlbHMgc3Vic2NyaXB0aW9u
IGZvciBnaXZlbiBuYW1lLCB0YXJnZXQsIGFuZCBtZXRob2QuCi0KLSAgICBAbWV0aG9kIG9mZgot
ICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJh
bSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgc3Vic2NyaXB0aW9uCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBmdW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0aW9uCi0g
ICAgQHJldHVybiB0aGlzCi0gICovCi0gIG9mZjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRo
b2QpIHsKLSAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhv
ZCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2hlY2tzIHRvIHNlZSBp
ZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRpb25zIGZvciBuYW1lZCBldmVudC4KLQotICAgIEBt
ZXRob2QgaGFzCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50
Ci0gICAgQHJldHVybiB7Qm9vbGVhbn0gZG9lcyB0aGUgb2JqZWN0IGhhdmUgYSBzdWJzY3JpcHRp
b24gZm9yIGV2ZW50Ci0gICAqLwotICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICByZXR1cm4g
RW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIG5hbWUpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLXZhciBSU1ZQID0gcmVxdWlyZU1vZHVsZSgicnN2cCIpOwotCi1SU1ZQ
LmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlvbihjYWxsYmFjaywgcHJvbWlzZSkgewotICBFbWJl
ci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBwcm9taXNlLCBjYWxsYmFjaywgcHJvbWlzZSk7Ci19
KTsKLQotUlNWUC5Qcm9taXNlLnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24oY2FsbGJhY2ssIGxh
YmVsKXsKLSAgRW1iZXIuZGVwcmVjYXRlKCdSU1ZQLlByb21pc2UuZmFpbCBoYXMgYmVlbiByZW5h
bWVkIGFzIFJTVlAuUHJvbWlzZS5jYXRjaCcpOwotICByZXR1cm4gdGhpc1snY2F0Y2gnXShjYWxs
YmFjaywgbGFiZWwpOwotfTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVy
LXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgotICBAY2xhc3MgRGVm
ZXJyZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICovCi1FbWJlci5EZWZlcnJlZE1peGluID0gRW1i
ZXIuTWl4aW4uY3JlYXRlKHsKLSAgLyoqCi0gICAgQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3
aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCi0KLSAgICBA
bWV0aG9kIHRoZW4KLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIGEgY2FsbGJhY2sgZnVu
Y3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZG9uZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlamVj
dCAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBmYWlsZWQKLSAgKi8KLSAg
dGhlbjogZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0LCBsYWJlbCkgewotICAgIHZhciBkZWZlcnJl
ZCwgcHJvbWlzZSwgZW50aXR5OwotCi0gICAgZW50aXR5ID0gdGhpczsKLSAgICBkZWZlcnJlZCA9
IGdldCh0aGlzLCAnX2RlZmVycmVkJyk7Ci0gICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7
Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxsbWVudEhhbmRsZXIoZnVsZmlsbG1lbnQpIHsKLSAgICAg
IGlmIChmdWxmaWxsbWVudCA9PT0gcHJvbWlzZSkgewotICAgICAgICByZXR1cm4gcmVzb2x2ZShl
bnRpdHkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmUoZnVsZmlsbG1l
bnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwcm9taXNlLnRoZW4ocmVzb2x2ZSAm
JiBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdCwgbGFiZWwpOwotICB9LAotCi0gIC8qKgotICAg
IFJlc29sdmUgYSBEZWZlcnJlZCBvYmplY3QgYW5kIGNhbGwgYW55IGBkb25lQ2FsbGJhY2tzYCB3
aXRoIHRoZSBnaXZlbiBhcmdzLgotCi0gICAgQG1ldGhvZCByZXNvbHZlCi0gICovCi0gIHJlc29s
dmU6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgdmFyIGRlZmVycmVkLCBwcm9taXNlOwotCi0gICAg
ZGVmZXJyZWQgPSBnZXQodGhpcywgJ19kZWZlcnJlZCcpOwotICAgIHByb21pc2UgPSBkZWZlcnJl
ZC5wcm9taXNlOwotCi0gICAgaWYgKHZhbHVlID09PSB0aGlzKSB7Ci0gICAgICBkZWZlcnJlZC5y
ZXNvbHZlKHByb21pc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZWZlcnJlZC5yZXNvbHZlKHZh
bHVlKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVqZWN0IGEgRGVmZXJyZWQgb2JqZWN0
IGFuZCBjYWxsIGFueSBgZmFpbENhbGxiYWNrc2Agd2l0aCB0aGUgZ2l2ZW4gYXJncy4KLQotICAg
IEBtZXRob2QgcmVqZWN0Ci0gICovCi0gIHJlamVjdDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBn
ZXQodGhpcywgJ19kZWZlcnJlZCcpLnJlamVjdCh2YWx1ZSk7Ci0gIH0sCi0KLSAgX2RlZmVycmVk
OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gUlNWUC5kZWZlcignRW1i
ZXI6IERlZmVycmVkTWl4aW4gLSAnICsgdGhpcyk7Ci0gIH0pCi19KTsKLQotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1
bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHR5cGVPZiA9IEVtYmVyLnR5cGVPZjsK
LQotLyoqCi0gIFRoZSBgRW1iZXIuQWN0aW9uSGFuZGxlcmAgbWl4aW4gaW1wbGVtZW50cyBzdXBw
b3J0IGZvciBtb3ZpbmcgYW4gYGFjdGlvbnNgCi0gIHByb3BlcnR5IHRvIGFuIGBfYWN0aW9uc2Ag
cHJvcGVydHkgYXQgZXh0ZW5kIHRpbWUsIGFuZCBhZGRpbmcgYF9hY3Rpb25zYAotICB0byB0aGUg
b2JqZWN0J3MgbWVyZ2VkUHJvcGVydGllcyBsaXN0LgotCi0gIGBFbWJlci5BY3Rpb25IYW5kbGVy
YCBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1iZXIgaW4gIGBFbWJlci5WaWV3YCwKLSAgYEVtYmVy
LkNvbnRyb2xsZXJgLCBhbmQgYEVtYmVyLlJvdXRlYC4KLQotICBAY2xhc3MgQWN0aW9uSGFuZGxl
cgotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwotRW1iZXIuQWN0aW9uSGFuZGxlciA9IEVtYmVyLk1p
eGluLmNyZWF0ZSh7Ci0gIG1lcmdlZFByb3BlcnRpZXM6IFsnX2FjdGlvbnMnXSwKLQotICAvKioK
LSAgICBUaGUgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMsIGtleWVkIGJ5IG5hbWUsIGF2YWlsYWJs
ZSBvbiB0aGlzCi0gICAgYEFjdGlvbkhhbmRsZXJgIGFzIGFjdGlvbiB0YXJnZXRzLgotCi0gICAg
VGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9u
fX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBs
aWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2Fu
IGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24KLSAg
ICB2aWEgYEFjdGlvbkhhbmRsZXIjc2VuZGAuCi0KLSAgICBUaGUgYGFjdGlvbnNgIGhhc2ggd2ls
bCBpbmhlcml0IGFjdGlvbiBoYW5kbGVycyBmcm9tCi0gICAgdGhlIGBhY3Rpb25zYCBoYXNoIGRl
ZmluZWQgb24gZXh0ZW5kZWQgcGFyZW50IGNsYXNzZXMKLSAgICBvciBtaXhpbnMgcmF0aGVyIHRo
YW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgaGFzaCwgZS5nLjoKLQotICAgIGBgYGpzCi0gICAg
QXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAgICAgYWN0aW9u
czogewotICAgICAgICBkaXNwbGF5QmFubmVyOiBmdW5jdGlvbihtc2cpIHsKLSAgICAgICAgICAv
LyAuLi4KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgQXBwLldlbGNvbWVSb3V0
ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZChBcHAuQ2FuRGlzcGxheUJhbm5lciwgewotICAgICAgYWN0
aW9uczogewotICAgICAgICBwbGF5TXVzaWM6IGZ1bmN0aW9uKCkgewotICAgICAgICAgIC8vIC4u
LgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBgV2VsY29tZVJvdXRlYCwg
d2hlbiBhY3RpdmUsIHdpbGwgYmUgYWJsZSB0byByZXNwb25kCi0gICAgLy8gdG8gYm90aCBhY3Rp
b25zLCBzaW5jZSB0aGUgYWN0aW9ucyBoYXNoIGlzIG1lcmdlZCByYXRoZXIKLSAgICAvLyB0aGVu
IHJlcGxhY2VkIHdoZW4gZXh0ZW5kaW5nIG1peGlucyAvIHBhcmVudCBjbGFzc2VzLgotICAgIHRo
aXMuc2VuZCgnZGlzcGxheUJhbm5lcicpOwotICAgIHRoaXMuc2VuZCgncGxheU11c2ljJyk7Ci0g
ICAgYGBgCi0KLSAgICBXaXRoaW4gYSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvciBDb21wb25l
bnQncyBhY3Rpb24gaGFuZGxlciwKLSAgICB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0
IGlzIHRoZSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvcgotICAgIENvbXBvbmVudCBvYmplY3Q6
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Tb25nUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewot
ICAgICAgYWN0aW9uczogewotICAgICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgdGhpcy5jb250cm9sbGVyRm9yKCJzb25nIik7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9u
VG8oIm90aGVyLnJvdXRlIik7Ci0gICAgICAgICAgLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2FsbCBgdGhpcy5f
c3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KLSAgICBhY3Rpb24gaGFuZGxlciBpZiBpdCBvdmVycmlk
ZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBwYXJlbnQKLSAgICBjbGFzcyBvciBtaXhpbjoKLQot
ICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyByb3V0ZXM6Ci0KLSAgICBgYGBqcwot
ICAgIEFwcC5EZWJ1Z1JvdXRlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICBjb25zb2xlLmRlYnVnKCJ0cm9sb2xvIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsK
LQotICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRl
YnVnUm91dGUsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0
aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91dGVJ
bmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVidWdSb3V0ZQotICAgICAgICAgIHRoaXMuX3N1
cGVyKCk7Ci0KLSAgICAgICAgICAvLyBzaG93IGFkZGl0aW9uYWwgYW5ub3lhbmNlCi0gICAgICAg
ICAgd2luZG93LmFsZXJ0KC4uLik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBg
YGAKLQotICAgICMjIEJ1YmJsaW5nCi0KLSAgICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBz
dG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVyIGRlZmluZWQKLSAgICBvbiB0aGUgYGFjdGlvbnNg
IGhhc2ggaGFuZGxlcyBpdC4gVG8gY29udGludWUgYnViYmxpbmcgdGhlIGFjdGlvbiwKLSAgICB5
b3UgbXVzdCByZXR1cm4gYHRydWVgIGZyb20gdGhlIGhhbmRsZXI6Ci0KLSAgICBgYGBqcwotICAg
IEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgiYWxidW0i
LCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yb3V0ZSgic29uZyIpOwotICAgICAgfSk7Ci0g
ICAgfSk7Ci0KLSAgICBBcHAuQWxidW1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAg
ICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAg
IH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgLy8gLi4uCi0KLSAgICAgICAgICBpZiAoYWN0aW9uU2hvdWxk
QWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRSb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAcHJvcGVydHkgYWN0aW9ucwotICAgIEB0eXBlIEhhc2gKLSAgICBAZGVmYXVsdCBudWxsCi0g
ICovCi0KLSAgLyoqCi0gICAgTW92ZXMgYGFjdGlvbnNgIHRvIGBfYWN0aW9uc2AgYXQgZXh0ZW5k
IHRpbWUuIE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseQotICAgIG1vZGlmaWVzIHRoZSBtaXhpbiB0
aGVtc2VsdmVzLCB3aGljaCBpcyB0ZWNobmljYWxseSBkdWJpb3VzIGJ1dAotICAgIGlzIHByYWN0
aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1
cmUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgd2lsbE1lcmdlTWl4aW4KLSAgKi8KLSAg
d2lsbE1lcmdlTWl4aW46IGZ1bmN0aW9uKHByb3BzKSB7Ci0gICAgdmFyIGhhc2hOYW1lOwotCi0g
ICAgaWYgKCFwcm9wcy5fYWN0aW9ucykgewotICAgICAgaWYgKHR5cGVPZihwcm9wcy5hY3Rpb25z
KSA9PT0gJ29iamVjdCcpIHsKLSAgICAgICAgaGFzaE5hbWUgPSAnYWN0aW9ucyc7Ci0gICAgICB9
IGVsc2UgaWYgKHR5cGVPZihwcm9wcy5ldmVudHMpID09PSAnb2JqZWN0JykgewotICAgICAgICBF
bWJlci5kZXByZWNhdGUoJ0FjdGlvbiBoYW5kbGVycyBjb250YWluZWQgaW4gYW4gYGV2ZW50c2Ag
b2JqZWN0IGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHB1dHRpbmcgdGhlbSBpbiBhbiBgYWN0
aW9uc2Agb2JqZWN0JywgZmFsc2UpOwotICAgICAgICBoYXNoTmFtZSA9ICdldmVudHMnOwotICAg
ICAgfQotCi0gICAgICBpZiAoaGFzaE5hbWUpIHsKLSAgICAgICAgcHJvcHMuX2FjdGlvbnMgPSBF
bWJlci5tZXJnZShwcm9wcy5fYWN0aW9ucyB8fCB7fSwgcHJvcHNbaGFzaE5hbWVdKTsKLSAgICAg
IH0KLQotICAgICAgZGVsZXRlIHByb3BzW2hhc2hOYW1lXTsKLSAgICB9Ci0gIH0sCi0KLSAgc2Vu
ZDogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChh
cmd1bWVudHMsIDEpLCB0YXJnZXQ7Ci0KLSAgICBpZiAodGhpcy5fYWN0aW9ucyAmJiB0aGlzLl9h
Y3Rpb25zW2FjdGlvbk5hbWVdKSB7Ci0gICAgICBpZiAodGhpcy5fYWN0aW9uc1thY3Rpb25OYW1l
XS5hcHBseSh0aGlzLCBhcmdzKSA9PT0gdHJ1ZSkgewotICAgICAgICAvLyBoYW5kbGVyIHJldHVy
bmVkIHRydWUsIHNvIHRoaXMgYWN0aW9uIHdpbGwgYnViYmxlCi0gICAgICB9IGVsc2UgewotICAg
ICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0aGlzLmRlcHJlY2F0ZWRTZW5k
ICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5kbGVzICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5k
bGVzKGFjdGlvbk5hbWUpKSB7Ci0gICAgICBpZiAodGhpcy5kZXByZWNhdGVkU2VuZC5hcHBseSh0
aGlzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpID09PSB0cnVlKSB7Ci0gICAgICAgIC8vIGhh
bmRsZXIgcmV0dXJuIHRydWUsIHNvIHRoaXMgYWN0aW9uIHdpbGwgYnViYmxlCi0gICAgICB9IGVs
c2UgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldCA9
IGdldCh0aGlzLCAndGFyZ2V0JykpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiVGhlIGB0YXJnZXRg
IGZvciAiICsgdGhpcyArICIgKCIgKyB0YXJnZXQgKyAiKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRg
IG1ldGhvZCIsIHR5cGVvZiB0YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICB0YXJn
ZXQuc2VuZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7Ci0gICAgfQotICB9Ci0KLX0pOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0gRW1i
ZXIuZ2V0LAotICAgIHJlc29sdmUgPSBFbWJlci5SU1ZQLnJlc29sdmUsCi0gICAgcmV0aHJvdyA9
IEVtYmVyLlJTVlAucmV0aHJvdywKLSAgICBub3QgPSBFbWJlci5jb21wdXRlZC5ub3QsCi0gICAg
b3IgPSBFbWJlci5jb21wdXRlZC5vcjsKLQotLyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0gKi8KLQotZnVuY3Rpb24gb2JzZXJ2ZVByb21pc2UocHJveHks
IHByb21pc2UpIHsKLSAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgc2V0KHBy
b3h5LCAnaXNGdWxmaWxsZWQnLCB0cnVlKTsKLSAgICBzZXQocHJveHksICdjb250ZW50JywgdmFs
dWUpOwotICB9LCBmdW5jdGlvbihyZWFzb24pIHsKLSAgICBzZXQocHJveHksICdpc1JlamVjdGVk
JywgdHJ1ZSk7Ci0gICAgc2V0KHByb3h5LCAncmVhc29uJywgcmVhc29uKTsKLSAgICAvLyBkb24n
dCByZS10aHJvdywgYXMgd2UgYXJlIG1lcmVseSBvYnNlcnZpbmcKLSAgfSwgIkVtYmVyOiBQcm9t
aXNlUHJveHkiKTsKLX0KLQotLyoqCi0gIEEgbG93IGxldmVsIG1peGluIG1ha2luZyBPYmplY3RQ
cm94eSwgT2JqZWN0Q29udHJvbGxlciBvciBBcnJheUNvbnRyb2xsZXIncyBwcm9taXNlIGF3YXJl
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIE9iamVjdFByb21pc2VDb250cm9sbGVyID0gRW1i
ZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4pOwotCi0g
IHZhciBjb250cm9sbGVyID0gT2JqZWN0UHJvbWlzZUNvbnRyb2xsZXIuY3JlYXRlKHsKLSAgICBw
cm9taXNlOiAkLmdldEpTT04oJy9zb21lL3JlbW90ZS9kYXRhLmpzb24nKQotICB9KTsKLQotICBj
b250cm9sbGVyLnRoZW4oZnVuY3Rpb24oanNvbil7Ci0gICAgIC8vIHRoZSBqc29uCi0gIH0sIGZ1
bmN0aW9uKHJlYXNvbikgewotICAgICAvLyB0aGUgcmVhc29uIHdoeSB5b3UgaGF2ZSBubyBqc29u
Ci0gIH0pOwotICBgYGAKLQotICB0aGUgY29udHJvbGxlciBoYXMgYmluZGFibGUgYXR0cmlidXRl
cyB3aGljaAotICB0cmFjayB0aGUgcHJvbWlzZXMgbGlmZSBjeWNsZQotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgY29udHJvbGxlci5nZXQoJ2lzUGVuZGluZycpICAgLy89PiB0cnVlCi0gIGNvbnRyb2xs
ZXIuZ2V0KCdpc1NldHRsZWQnKSAgLy89PiBmYWxzZQotICBjb250cm9sbGVyLmdldCgnaXNSZWpl
Y3RlZCcpICAvLz0+IGZhbHNlCi0gIGNvbnRyb2xsZXIuZ2V0KCdpc0Z1bGZpbGxlZCcpIC8vPT4g
ZmFsc2UKLSAgYGBgCi0KLSAgV2hlbiB0aGUgdGhlICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0
aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKLSAgd2l0aCBqc29uLCB0aGUgbGlmZSBjeWNsZSBhdHRy
aWJ1dGVzIHdpbGwgdXBkYXRlIGFjY29yZGluZ2x5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgY29u
dHJvbGxlci5nZXQoJ2lzUGVuZGluZycpICAgLy89PiBmYWxzZQotICBjb250cm9sbGVyLmdldCgn
aXNTZXR0bGVkJykgICAvLz0+IHRydWUKLSAgY29udHJvbGxlci5nZXQoJ2lzUmVqZWN0ZWQnKSAg
Ly89PiBmYWxzZQotICBjb250cm9sbGVyLmdldCgnaXNGdWxmaWxsZWQnKSAvLz0+IHRydWUKLSAg
YGBgCi0KLSAgQXMgdGhlIGNvbnRyb2xsZXIgaXMgYW4gT2JqZWN0Q29udHJvbGxlciwgYW5kIHRo
ZSBqc29uIG5vdyBpdHMgY29udGVudCwKLSAgYWxsIHRoZSBqc29uIHByb3BlcnRpZXMgd2lsbCBi
ZSBhdmFpbGFibGUgZGlyZWN0bHkgZnJvbSB0aGUgY29udHJvbGxlci4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIC8vIEFzc3VtaW5nIHRoZSBmb2xsb3dpbmcganNvbjoKLSAgewotICAgIGZpcnN0TmFt
ZTogJ1N0ZWZhbicsCi0gICAgbGFzdE5hbWU6ICdQZW5uZXInCi0gIH0KLQotICAvLyBib3RoIHBy
b3BlcnRpZXMgd2lsbCBhY2Nlc3NpYmxlIG9uIHRoZSBjb250cm9sbGVyCi0gIGNvbnRyb2xsZXIu
Z2V0KCdmaXJzdE5hbWUnKSAvLz0+ICdTdGVmYW4nCi0gIGNvbnRyb2xsZXIuZ2V0KCdsYXN0TmFt
ZScpICAvLz0+ICdQZW5uZXInCi0gIGBgYAotCi0gIElmIHRoZSBjb250cm9sbGVyIGlzIGJhY2tp
bmcgYSB0ZW1wbGF0ZSwgdGhlIGF0dHJpYnV0ZXMgYXJlCi0gIGJpbmRhYmxlIGZyb20gd2l0aGlu
IHRoYXQgdGVtcGxhdGUKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2lmIGlzUGVuZGluZ319Ci0g
ICAgbG9hZGluZy4uLgotICB7e2Vsc2V9fQotICAgIGZpcnN0TmFtZToge3tmaXJzdE5hbWV9fQot
ICAgIGxhc3ROYW1lOiB7e2xhc3ROYW1lfX0KLSAge3svaWZ9fQotICBgYGAKLSAgQGNsYXNzIEVt
YmVyLlByb21pc2VQcm94eU1peGluCi0qLwotRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4gPSBFbWJl
ci5NaXhpbi5jcmVhdGUoewotICAvKioKLSAgICBJZiB0aGUgcHJveGllZCBwcm9taXNlIGlzIHJl
amVjdGVkIHRoaXMgd2lsbCBjb250YWluIHRoZSByZWFzb24KLSAgICBwcm92aWRlZC4KLQotICAg
IEBwcm9wZXJ0eSByZWFzb24KLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHJlYXNvbjogICAg
bnVsbCwKLQotICAvKioKLSAgICBPbmNlIHRoZSBwcm94aWVkIHByb21pc2UgaGFzIHNldHRsZWQg
dGhpcyB3aWxsIGJlY29tZSBgZmFsc2VgLgotCi0gICAgQHByb3BlcnR5IGlzUGVuZGluZwotICAg
IEBkZWZhdWx0IHRydWUKLSAgKi8KLSAgaXNQZW5kaW5nOiAgbm90KCdpc1NldHRsZWQnKS5yZWFk
T25seSgpLAotCi0gIC8qKgotICAgIE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxl
ZCB0aGlzIHdpbGwgYmVjb21lIGB0cnVlYC4KLQotICAgIEBwcm9wZXJ0eSBpc1NldHRsZWQKLSAg
ICBAZGVmYXVsdCBmYWxzZQotICAqLwotICBpc1NldHRsZWQ6ICBvcignaXNSZWplY3RlZCcsICdp
c0Z1bGZpbGxlZCcpLnJlYWRPbmx5KCksCi0KLSAgLyoqCi0gICAgV2lsbCBiZWNvbWUgYHRydWVg
IGlmIHRoZSBwcm94aWVkIHByb21pc2UgaXMgcmVqZWN0ZWQuCi0KLSAgICBAcHJvcGVydHkgaXNS
ZWplY3RlZAotICAgIEBkZWZhdWx0IGZhbHNlCi0gICovCi0gIGlzUmVqZWN0ZWQ6ICBmYWxzZSwK
LQotICAvKioKLSAgICBXaWxsIGJlY29tZSBgdHJ1ZWAgaWYgdGhlIHByb3hpZWQgcHJvbWlzZSBp
cyBmdWxmaWxsZWQuCi0KLSAgICBAcHJvcGVydHkgaXNGdWxsZmlsbGVkCi0gICAgQGRlZmF1bHQg
ZmFsc2UKLSAgKi8KLSAgaXNGdWxmaWxsZWQ6IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBwcm9t
aXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVlIGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmpl
Y3QuCi0KLSAgICBUaGlzIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIHVwb24gY3JlYXRpb24s
IGFuZCBzaG91bGQgbm90IGJlCi0gICAgY2hhbmdlZCBvbmNlIGNyZWF0ZWQuCi0KLSAgICBFeGFt
cGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0
ZW5kKEVtYmVyLlByb21pc2VQcm94eU1peGluKS5jcmVhdGUoewotICAgICAgcHJvbWlzZTogPHRo
ZW5hYmxlPgotICAgIH0pOwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IHByb21pc2UKLSAgKi8K
LSAgcHJvbWlzZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCBwcm9taXNlKSB7Ci0gICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgIHByb21pc2UgPSByZXNvbHZlKHBy
b21pc2UpOwotICAgICAgb2JzZXJ2ZVByb21pc2UodGhpcywgcHJvbWlzZSk7Ci0gICAgICByZXR1
cm4gcHJvbWlzZS50aGVuKCk7IC8vIGZvcmsgdGhlIHByb21pc2UuCi0gICAgfSBlbHNlIHsKLSAg
ICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiUHJvbWlzZVByb3h5J3MgcHJvbWlzZSBtdXN0IGJl
IHNldCIpOwotICAgIH0KLSAgfSksCi0KLSAgLyoqCi0gICAgQW4gYWxpYXMgdG8gdGhlIHByb3hp
ZWQgcHJvbWlzZSdzIGB0aGVuYC4KLQotICAgIFNlZSBSU1ZQLlByb21pc2UudGhlbi4KLQotICAg
IEBtZXRob2QgdGhlbgotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgQHJldHVy
biB7UlNWUC5Qcm9taXNlfQotICAqLwotICB0aGVuOiBwcm9taXNlQWxpYXMoJ3RoZW4nKSwKLQot
ICAvKioKLSAgICBBbiBhbGlhcyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KLQot
ICAgIFNlZSBSU1ZQLlByb21pc2UuY2F0Y2guCi0KLSAgICBAbWV0aG9kIGNhdGNoCi0gICAgQHBh
cmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Ci0gICov
Ci0gICdjYXRjaCc6IHByb21pc2VBbGlhcygnY2F0Y2gnKSwKLQotICAvKioKLSAgICBBbiBhbGlh
cyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3MgYGZpbmFsbHlgLgotCi0gICAgU2VlIFJTVlAuUHJv
bWlzZS5maW5hbGx5LgotCi0gICAgQG1ldGhvZCBmaW5hbGx5Ci0gICAgQHBhcmFtIHtGdW5jdGlv
bn0gY2FsbGJhY2sKLSAgICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Ci0gICovCi0gICdmaW5hbGx5
JzogcHJvbWlzZUFsaWFzKCdmaW5hbGx5JykKLQotfSk7Ci0KLWZ1bmN0aW9uIHByb21pc2VBbGlh
cyhuYW1lKSB7Ci0gIHJldHVybiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFyIHByb21pc2UgPSBnZXQo
dGhpcywgJ3Byb21pc2UnKTsKLSAgICByZXR1cm4gcHJvbWlzZVtuYW1lXS5hcHBseShwcm9taXNl
LCBhcmd1bWVudHMpOwotICB9OwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBmb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCi0gICAgUkVUQUlOID0gJ3InLAot
ICAgIElOU0VSVCA9ICdpJywKLSAgICBERUxFVEUgPSAnZCc7Ci0KLS8qKgotICBBbiBgRW1iZXIu
VHJhY2tlZEFycmF5YCB0cmFja3MgYXJyYXkgb3BlcmF0aW9ucy4gIEl0J3MgdXNlZnVsIHdoZW4g
eW91IHdhbnQgdG8KLSAgbGF6aWx5IGNvbXB1dGUgdGhlIGluZGV4ZXMgb2YgaXRlbXMgaW4gYW4g
YXJyYXkgYWZ0ZXIgdGhleSd2ZSBiZWVuIHNoaWZ0ZWQgYnkKLSAgc3Vic2VxdWVudCBvcGVyYXRp
b25zLgotCi0gIEBjbGFzcyBUcmFja2VkQXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAcGFy
YW0ge2FycmF5fSBbaXRlbXM9W11dIFRoZSBhcnJheSB0byBiZSB0cmFja2VkLiAgVGhpcyBpcyB1
c2VkIGp1c3QgdG8gZ2V0Ci0gIHRoZSBpbml0aWFsIGl0ZW1zIGZvciB0aGUgc3RhcnRpbmcgc3Rh
dGUgb2YgcmV0YWluOm4uCi0qLwotRW1iZXIuVHJhY2tlZEFycmF5ID0gZnVuY3Rpb24gKGl0ZW1z
KSB7Ci0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgeyBpdGVtcyA9IFtdOyB9Ci0KLSAgdmFy
IGxlbmd0aCA9IGdldChpdGVtcywgJ2xlbmd0aCcpOwotCi0gIGlmIChsZW5ndGgpIHsKLSAgICB0
aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJheU9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCwgaXRl
bXMpXTsKLSAgfSBlbHNlIHsKLSAgICB0aGlzLl9vcGVyYXRpb25zID0gW107Ci0gIH0KLX07Ci0K
LUVtYmVyLlRyYWNrZWRBcnJheS5SRVRBSU4gPSBSRVRBSU47Ci1FbWJlci5UcmFja2VkQXJyYXku
SU5TRVJUID0gSU5TRVJUOwotRW1iZXIuVHJhY2tlZEFycmF5LkRFTEVURSA9IERFTEVURTsKLQot
RW1iZXIuVHJhY2tlZEFycmF5LnByb3RvdHlwZSA9IHsKLQotICAvKioKLSAgICBUcmFjayB0aGF0
IGBuZXdJdGVtc2Agd2VyZSBhZGRlZCB0byB0aGUgdHJhY2tlZCBhcnJheSBhdCBgaW5kZXhgLgot
Ci0gICAgQG1ldGhvZCBhZGRJdGVtcwotICAgIEBwYXJhbSBpbmRleAotICAgIEBwYXJhbSBuZXdJ
dGVtcwotICAqLwotICBhZGRJdGVtczogZnVuY3Rpb24gKGluZGV4LCBuZXdJdGVtcykgewotICAg
IHZhciBjb3VudCA9IGdldChuZXdJdGVtcywgJ2xlbmd0aCcpOwotICAgIGlmIChjb3VudCA8IDEp
IHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRpb24o
aW5kZXgpLAotICAgICAgICBhcnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAgICAg
ICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1hdGNoLmluZGV4LAotICAgICAgICBhcnJheU9wZXJh
dGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5nZVN0YXJ0LAotICAgICAgICBjb21wb3NlSW5kZXgs
Ci0gICAgICAgIHNwbGl0SW5kZXgsCi0gICAgICAgIHNwbGl0SXRlbXMsCi0gICAgICAgIHNwbGl0
QXJyYXlPcGVyYXRpb24sCi0gICAgICAgIG5ld0FycmF5T3BlcmF0aW9uOwotCi0gICAgbmV3QXJy
YXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24oSU5TRVJULCBjb3VudCwgbmV3SXRlbXMp
OwotCi0gICAgaWYgKGFycmF5T3BlcmF0aW9uKSB7Ci0gICAgICBpZiAoIW1hdGNoLnNwbGl0KSB7
Ci0gICAgICAgIC8vIGluc2VydCBsZWZ0IG9mIGFycmF5T3BlcmF0aW9uCi0gICAgICAgIHRoaXMu
X29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0
aW9uKTsKLSAgICAgICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVyYXRpb25JbmRleDsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuX3NwbGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4
IC0gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7Ci0gICAgICAg
IGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXggKyAxOwotICAgICAgfQotICAgIH0g
ZWxzZSB7Ci0gICAgICAvLyBpbnNlcnQgYXQgZW5kCi0gICAgICB0aGlzLl9vcGVyYXRpb25zLnB1
c2gobmV3QXJyYXlPcGVyYXRpb24pOwotICAgICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVyYXRp
b25JbmRleDsKLSAgICB9Ci0KLSAgICB0aGlzLl9jb21wb3NlSW5zZXJ0KGNvbXBvc2VJbmRleCk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgVHJhY2sgdGhhdCBgY291bnRgIGl0ZW1zIHdlcmUgcmVtb3Zl
ZCBhdCBgaW5kZXhgLgotCi0gICAgQG1ldGhvZCByZW1vdmVJdGVtcwotICAgIEBwYXJhbSBpbmRl
eAotICAgIEBwYXJhbSBjb3VudAotICAqLwotICByZW1vdmVJdGVtczogZnVuY3Rpb24gKGluZGV4
LCBjb3VudCkgewotICAgIGlmIChjb3VudCA8IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0
Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRpb24oaW5kZXgpLAotICAgICAgICBhcnJheU9wZXJh
dGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAgICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1h
dGNoLmluZGV4LAotICAgICAgICBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5n
ZVN0YXJ0LAotICAgICAgICBuZXdBcnJheU9wZXJhdGlvbiwKLSAgICAgICAgY29tcG9zZUluZGV4
OwotCi0gICAgbmV3QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24oREVMRVRFLCBj
b3VudCk7Ci0gICAgaWYgKCFtYXRjaC5zcGxpdCkgewotICAgICAgLy8gaW5zZXJ0IGxlZnQgb2Yg
YXJyYXlPcGVyYXRpb24KLSAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0
aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0aW9uKTsKLSAgICAgIGNvbXBvc2VJbmRleCA9IGFy
cmF5T3BlcmF0aW9uSW5kZXg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX3NwbGl0KGFycmF5
T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0LCBuZXdBcnJh
eU9wZXJhdGlvbik7Ci0gICAgICBjb21wb3NlSW5kZXggPSBhcnJheU9wZXJhdGlvbkluZGV4ICsg
MTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fY29tcG9zZURlbGV0ZShjb21wb3NlSW5kZXgp
OwotICB9LAotCi0gIC8qKgotICAgIEFwcGx5IGFsbCBvcGVyYXRpb25zLCByZWR1Y2luZyB0aGVt
IHRvIHJldGFpbjpuLCBmb3IgYG5gLCB0aGUgbnVtYmVyIG9mCi0gICAgaXRlbXMgaW4gdGhlIGFy
cmF5LgotCi0gICAgYGNhbGxiYWNrYCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBvcGVyYXRpb24g
YW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgotCi0gICAgKiB7YXJy
YXl9IGl0ZW1zIFRoZSBpdGVtcyBmb3IgdGhlIGdpdmVuIG9wZXJhdGlvbgotICAgICoge251bWJl
cn0gb2Zmc2V0IFRoZSBjb21wdXRlZCBvZmZzZXQgb2YgdGhlIGl0ZW1zLCBpZSB0aGUgaW5kZXgg
aW4gdGhlCi0gICAgYXJyYXkgb2YgdGhlIGZpcnN0IGl0ZW0gZm9yIHRoaXMgb3BlcmF0aW9uLgot
ICAgICoge3N0cmluZ30gb3BlcmF0aW9uIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUg
b2YKLSAgICBgRW1iZXIuVHJhY2tlZEFycmF5LntSRVRBSU4sIERFTEVURSwgSU5TRVJUfWAKLQot
ICAgIEBtZXRob2QgYXBwbHkKLSAgICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjawotICAqLwot
ICBhcHBseTogZnVuY3Rpb24gKGNhbGxiYWNrKSB7Ci0gICAgdmFyIGl0ZW1zID0gW10sCi0gICAg
ICAgIG9mZnNldCA9IDA7Ci0KLSAgICBmb3JFYWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0aW9u
IChhcnJheU9wZXJhdGlvbikgewotICAgICAgY2FsbGJhY2soYXJyYXlPcGVyYXRpb24uaXRlbXMs
IG9mZnNldCwgYXJyYXlPcGVyYXRpb24udHlwZSk7Ci0KLSAgICAgIGlmIChhcnJheU9wZXJhdGlv
bi50eXBlICE9PSBERUxFVEUpIHsKLSAgICAgICAgb2Zmc2V0ICs9IGFycmF5T3BlcmF0aW9uLmNv
dW50OwotICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdChhcnJheU9wZXJhdGlvbi5pdGVtcyk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJheU9w
ZXJhdGlvbihSRVRBSU4sIGl0ZW1zLmxlbmd0aCwgaXRlbXMpXTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZXR1cm4gYW4gYEFycmF5T3BlcmF0aW9uTWF0Y2hgIGZvciB0aGUgb3BlcmF0aW9uIHRoYXQg
Y29udGFpbnMgdGhlIGl0ZW0gYXQgYGluZGV4YC4KLQotICAgIEBtZXRob2QgX2ZpbmRBcnJheU9w
ZXJhdGlvbgotCi0gICAgQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRl
bSB3aG9zZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICBzaG91bGQgYmUgcmV0dXJuZWQuCi0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgX2ZpbmRBcnJheU9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4
KSB7Ci0gICAgdmFyIGFycmF5T3BlcmF0aW9uSW5kZXgsCi0gICAgICAgIGxlbiwKLSAgICAgICAg
c3BsaXQgPSBmYWxzZSwKLSAgICAgICAgYXJyYXlPcGVyYXRpb24sCi0gICAgICAgIGFycmF5T3Bl
cmF0aW9uUmFuZ2VTdGFydCwKLSAgICAgICAgYXJyYXlPcGVyYXRpb25SYW5nZUVuZDsKLQotICAg
IC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzZWFyY2ggdGhlc2UgZmFzdGVyIGlmIHdlIGtlcHQgYSBi
YWxhbmNlZCB0cmVlLgotICAgIC8vIGZpbmQgbGVmdG1vc3QgYXJyYXlPcGVyYXRpb24gdG8gdGhl
IHJpZ2h0IG9mIGBpbmRleGAKLSAgICBmb3IgKGFycmF5T3BlcmF0aW9uSW5kZXggPSBhcnJheU9w
ZXJhdGlvblJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgYXJy
YXlPcGVyYXRpb25JbmRleCA8IGxlbjsgKythcnJheU9wZXJhdGlvbkluZGV4KSB7Ci0gICAgICBh
cnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbYXJyYXlPcGVyYXRpb25JbmRleF07Ci0K
LSAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50eXBlID09PSBERUxFVEUpIHsgY29udGludWU7IH0K
LQotICAgICAgYXJyYXlPcGVyYXRpb25SYW5nZUVuZCA9IGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFy
dCArIGFycmF5T3BlcmF0aW9uLmNvdW50IC0gMTsKLQotICAgICAgaWYgKGluZGV4ID09PSBhcnJh
eU9wZXJhdGlvblJhbmdlU3RhcnQpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYg
KGluZGV4ID4gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0ICYmIGluZGV4IDw9IGFycmF5T3BlcmF0
aW9uUmFuZ2VFbmQpIHsKLSAgICAgICAgc3BsaXQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCA9IGFycmF5T3Bl
cmF0aW9uUmFuZ2VFbmQgKyAxOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuZXcgQXJy
YXlPcGVyYXRpb25NYXRjaChhcnJheU9wZXJhdGlvbiwgYXJyYXlPcGVyYXRpb25JbmRleCwgc3Bs
aXQsIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCk7Ci0gIH0sCi0KLSAgX3NwbGl0OiBmdW5jdGlv
biAoYXJyYXlPcGVyYXRpb25JbmRleCwgc3BsaXRJbmRleCwgbmV3QXJyYXlPcGVyYXRpb24pIHsK
LSAgICB2YXIgYXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2FycmF5T3BlcmF0aW9u
SW5kZXhdLAotICAgICAgICBzcGxpdEl0ZW1zID0gYXJyYXlPcGVyYXRpb24uaXRlbXMuc2xpY2Uo
c3BsaXRJbmRleCksCi0gICAgICAgIHNwbGl0QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVy
YXRpb24oYXJyYXlPcGVyYXRpb24udHlwZSwgc3BsaXRJdGVtcy5sZW5ndGgsIHNwbGl0SXRlbXMp
OwotCi0gICAgLy8gdHJ1bmNhdGUgTEhTCi0gICAgYXJyYXlPcGVyYXRpb24uY291bnQgPSBzcGxp
dEluZGV4OwotICAgIGFycmF5T3BlcmF0aW9uLml0ZW1zID0gYXJyYXlPcGVyYXRpb24uaXRlbXMu
c2xpY2UoMCwgc3BsaXRJbmRleCk7Ci0KLSAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShhcnJh
eU9wZXJhdGlvbkluZGV4ICsgMSwgMCwgbmV3QXJyYXlPcGVyYXRpb24sIHNwbGl0QXJyYXlPcGVy
YXRpb24pOwotICB9LAotCi0gIC8vIHNlZSBTdWJBcnJheSBmb3IgYSBiZXR0ZXIgaW1wbGVtZW50
YXRpb24uCi0gIF9jb21wb3NlSW5zZXJ0OiBmdW5jdGlvbiAoaW5kZXgpIHsKLSAgICB2YXIgbmV3
QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4XSwKLSAgICAgICAgbGVmdEFy
cmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleC0xXSwgLy8gbWF5IGJlIHVuZGVm
aW5lZAotICAgICAgICByaWdodEFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRl
eCsxXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAotICAgICAgICBsZWZ0T3AgPSBsZWZ0QXJyYXlPcGVy
YXRpb24gJiYgbGVmdEFycmF5T3BlcmF0aW9uLnR5cGUsCi0gICAgICAgIHJpZ2h0T3AgPSByaWdo
dEFycmF5T3BlcmF0aW9uICYmIHJpZ2h0QXJyYXlPcGVyYXRpb24udHlwZTsKLQotICAgIGlmIChs
ZWZ0T3AgPT09IElOU0VSVCkgewotICAgICAgICAvLyBtZXJnZSBsZWZ0Ci0gICAgICAgIGxlZnRB
cnJheU9wZXJhdGlvbi5jb3VudCArPSBuZXdBcnJheU9wZXJhdGlvbi5jb3VudDsKLSAgICAgICAg
bGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zID0gbGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zLmNvbmNh
dChuZXdBcnJheU9wZXJhdGlvbi5pdGVtcyk7Ci0KLSAgICAgIGlmIChyaWdodE9wID09PSBJTlNF
UlQpIHsKLSAgICAgICAgLy8gYWxzbyBtZXJnZSByaWdodCAod2UgaGF2ZSBzcGxpdCBhbiBpbnNl
cnQgd2l0aCBhbiBpbnNlcnQpCi0gICAgICAgIGxlZnRBcnJheU9wZXJhdGlvbi5jb3VudCArPSBy
aWdodEFycmF5T3BlcmF0aW9uLmNvdW50OwotICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24uaXRl
bXMgPSBsZWZ0QXJyYXlPcGVyYXRpb24uaXRlbXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRpb24u
aXRlbXMpOwotICAgICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRleCwgMik7Ci0gICAg
ICB9IGVsc2UgewotICAgICAgICAvLyBvbmx5IG1lcmdlIGxlZnQKLSAgICAgICAgdGhpcy5fb3Bl
cmF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocmlnaHRP
cCA9PT0gSU5TRVJUKSB7Ci0gICAgICAvLyBtZXJnZSByaWdodAotICAgICAgbmV3QXJyYXlPcGVy
YXRpb24uY291bnQgKz0gcmlnaHRBcnJheU9wZXJhdGlvbi5jb3VudDsKLSAgICAgIG5ld0FycmF5
T3BlcmF0aW9uLml0ZW1zID0gbmV3QXJyYXlPcGVyYXRpb24uaXRlbXMuY29uY2F0KHJpZ2h0QXJy
YXlPcGVyYXRpb24uaXRlbXMpOwotICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgg
KyAxLCAxKTsKLSAgICB9Ci0gIH0sCi0KLSAgX2NvbXBvc2VEZWxldGU6IGZ1bmN0aW9uIChpbmRl
eCkgewotICAgIHZhciBhcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXhdLAot
ICAgICAgICBkZWxldGVzVG9HbyA9IGFycmF5T3BlcmF0aW9uLmNvdW50LAotICAgICAgICBsZWZ0
QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4LTFdLCAvLyBtYXkgYmUgdW5k
ZWZpbmVkCi0gICAgICAgIGxlZnRPcCA9IGxlZnRBcnJheU9wZXJhdGlvbiAmJiBsZWZ0QXJyYXlP
cGVyYXRpb24udHlwZSwKLSAgICAgICAgbmV4dEFycmF5T3BlcmF0aW9uLAotICAgICAgICBuZXh0
T3AsCi0gICAgICAgIG5leHRDb3VudCwKLSAgICAgICAgcmVtb3ZlTmV3QW5kTmV4dE9wID0gZmFs
c2UsCi0gICAgICAgIHJlbW92ZWRJdGVtcyA9IFtdOwotCi0gICAgaWYgKGxlZnRPcCA9PT0gREVM
RVRFKSB7Ci0gICAgICBhcnJheU9wZXJhdGlvbiA9IGxlZnRBcnJheU9wZXJhdGlvbjsKLSAgICAg
IGluZGV4IC09IDE7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgZGVsZXRl
c1RvR28gPiAwOyArK2kpIHsKLSAgICAgIG5leHRBcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJh
dGlvbnNbaV07Ci0gICAgICBuZXh0T3AgPSBuZXh0QXJyYXlPcGVyYXRpb24udHlwZTsKLSAgICAg
IG5leHRDb3VudCA9IG5leHRBcnJheU9wZXJhdGlvbi5jb3VudDsKLQotICAgICAgaWYgKG5leHRP
cCA9PT0gREVMRVRFKSB7Ci0gICAgICAgIGFycmF5T3BlcmF0aW9uLmNvdW50ICs9IG5leHRDb3Vu
dDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChuZXh0Q291bnQgPiBk
ZWxldGVzVG9HbykgewotICAgICAgICAvLyBkOjIge3IsaX06NSAgd2UgcmVkdWNlIHRoZSByZXRh
aW4gb3IgaW5zZXJ0LCBidXQgaXQgc3RheXMKLSAgICAgICAgcmVtb3ZlZEl0ZW1zID0gcmVtb3Zl
ZEl0ZW1zLmNvbmNhdChuZXh0QXJyYXlPcGVyYXRpb24uaXRlbXMuc3BsaWNlKDAsIGRlbGV0ZXNU
b0dvKSk7Ci0gICAgICAgIG5leHRBcnJheU9wZXJhdGlvbi5jb3VudCAtPSBkZWxldGVzVG9HbzsK
LQotICAgICAgICAvLyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSB0cnVuY2F0ZSB0aGUgbGFzdCBhcnJh
eU9wZXJhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0bwotICAgICAgICAvLyByZW1vdmUgaXQ7IGFsc28g
dGhlIGRlbGV0ZXNUb0dvIHJlZHVjdGlvbiBpcyBub3QgdGhlIGVudGlyZXR5IG9mCi0gICAgICAg
IC8vIG5leHRDb3VudAotICAgICAgICBpIC09IDE7Ci0gICAgICAgIG5leHRDb3VudCA9IGRlbGV0
ZXNUb0dvOwotCi0gICAgICAgIGRlbGV0ZXNUb0dvID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGlmIChuZXh0Q291bnQgPT09IGRlbGV0ZXNUb0dvKSB7Ci0gICAgICAgICAgLy8gSGFuZGxl
IGVkZ2UgY2FzZSBvZiBkOjIgaToyIGluIHdoaWNoIGNhc2UgYm90aCBvcGVyYXRpb25zIGdvIGF3
YXkKLSAgICAgICAgICAvLyBkdXJpbmcgY29tcG9zaXRpb24uCi0gICAgICAgICAgcmVtb3ZlTmV3
QW5kTmV4dE9wID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVkSXRlbXMgPSByZW1v
dmVkSXRlbXMuY29uY2F0KG5leHRBcnJheU9wZXJhdGlvbi5pdGVtcyk7Ci0gICAgICAgIGRlbGV0
ZXNUb0dvIC09IG5leHRDb3VudDsKLSAgICAgIH0KLQotICAgICAgaWYgKG5leHRPcCA9PT0gSU5T
RVJUKSB7Ci0gICAgICAgIC8vIGQ6MiBpOjMgd2lsbCByZXN1bHQgaW4gZGVsZXRlIGdvaW5nIGF3
YXkKLSAgICAgICAgYXJyYXlPcGVyYXRpb24uY291bnQgLT0gbmV4dENvdW50OwotICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChhcnJheU9wZXJhdGlvbi5jb3VudCA+IDApIHsKLSAgICAgIC8vIGNv
bXBvc2Ugb3VyIG5ldyBkZWxldGUgd2l0aCBwb3NzaWJseSBzZXZlcmFsIG9wZXJhdGlvbnMgdG8g
dGhlIHJpZ2h0IG9mCi0gICAgICAvLyBkaXNwYXJhdGUgdHlwZXMKLSAgICAgIHRoaXMuX29wZXJh
dGlvbnMuc3BsaWNlKGluZGV4KzEsIGktMS1pbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8v
IFRoZSBkZWxldGUgb3BlcmF0aW9uIGNhbiBnbyBhd2F5OyBpdCBoYXMgbWVyZWx5IHJlZHVjZWQg
c29tZSBvdGhlcgotICAgICAgLy8gb3BlcmF0aW9uLCBhcyBpbiBkOjMgaTo0OyBpdCBtYXkgYWxz
byBoYXZlIGVsaW1pbmF0ZWQgdGhhdCBvcGVyYXRpb24sCi0gICAgICAvLyBhcyBpbiBkOjMgaToz
LgotICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIHJlbW92ZU5ld0FuZE5leHRP
cCA/IDIgOiAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVtb3ZlZEl0ZW1zOwotICB9LAotCi0g
IHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFyIHN0ciA9ICIiOwotICAgIGZvckVhY2go
dGhpcy5fb3BlcmF0aW9ucywgZnVuY3Rpb24gKG9wZXJhdGlvbikgewotICAgICAgc3RyICs9ICIg
IiArIG9wZXJhdGlvbi50eXBlICsgIjoiICsgb3BlcmF0aW9uLmNvdW50OwotICAgIH0pOwotICAg
IHJldHVybiBzdHIuc3Vic3RyaW5nKDEpOwotICB9Ci19OwotCi0vKioKLSAgSW50ZXJuYWwgZGF0
YSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFuIGFycmF5IG9wZXJhdGlvbi4KLQotICBAbWV0aG9k
IEFycmF5T3BlcmF0aW9uCi0gIEBwcml2YXRlCi0gIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0
eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUgb2YKLSAgYEVtYmVyLlRyYWNrZWRBcnJheS57UkVU
QUlOLCBJTlNFUlQsIERFTEVURX1gCi0gIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVy
IG9mIGl0ZW1zIGluIHRoaXMgb3BlcmF0aW9uLgotICBAcGFyYW0ge2FycmF5fSBpdGVtcyBUaGUg
aXRlbXMgb2YgdGhlIG9wZXJhdGlvbiwgaWYgaW5jbHVkZWQuICBSRVRBSU4gYW5kCi0gIElOU0VS
VCBpbmNsdWRlIHRoZWlyIGl0ZW1zLCBERUxFVEUgZG9lcyBub3QuCi0qLwotZnVuY3Rpb24gQXJy
YXlPcGVyYXRpb24gKG9wZXJhdGlvbiwgY291bnQsIGl0ZW1zKSB7Ci0gIHRoaXMudHlwZSA9IG9w
ZXJhdGlvbjsgLy8gUkVUQUlOIHwgSU5TRVJUIHwgREVMRVRFCi0gIHRoaXMuY291bnQgPSBjb3Vu
dDsKLSAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotfQotCi0vKioKLSAgSW50ZXJuYWwgZGF0YSBzdHJ1
Y3R1cmUgdXNlZCB0byBpbmNsdWRlIGluZm9ybWF0aW9uIHdoZW4gbG9va2luZyB1cCBvcGVyYXRp
b25zCi0gIGJ5IGl0ZW0gaW5kZXguCi0KLSAgQG1ldGhvZCBBcnJheU9wZXJhdGlvbk1hdGNoCi0g
IEBwcml2YXRlCi0gIEBwYXJhbSB7QXJyYXlPcGVyYXRpb259IG9wZXJhdGlvbgotICBAcGFyYW0g
e251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIGBvcGVyYXRpb25gIGluIHRoZSBhcnJheSBvZiBv
cGVyYXRpb25zLgotICBAcGFyYW0ge2Jvb2xlYW59IHNwbGl0IFdoZXRoZXIgb3Igbm90IHRoZSBp
dGVtIGluZGV4IHNlYXJjaGVkIGZvciB3b3VsZAotICByZXF1aXJlIGEgc3BsaXQgZm9yIGEgbmV3
IG9wZXJhdGlvbiB0eXBlLgotICBAcGFyYW0ge251bWJlcn0gcmFuZ2VTdGFydCBUaGUgaW5kZXgg
b2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG9wZXJhdGlvbiwKLSAgd2l0aCByZXNwZWN0IHRvIHRo
ZSB0cmFja2VkIGFycmF5LiAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IGl0ZW0gY2FuIGJlIGNvbXB1
dGVkCi0gIGZyb20gYHJhbmdlU3RhcnRgIGFuZCBgb3BlcmF0aW9uLmNvdW50YC4KLSovCi1mdW5j
dGlvbiBBcnJheU9wZXJhdGlvbk1hdGNoKG9wZXJhdGlvbiwgaW5kZXgsIHNwbGl0LCByYW5nZVN0
YXJ0KSB7Ci0gIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICB0aGlzLmluZGV4ID0gaW5k
ZXg7Ci0gIHRoaXMuc3BsaXQgPSBzcGxpdDsKLSAgdGhpcy5yYW5nZVN0YXJ0ID0gcmFuZ2VTdGFy
dDsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQs
Ci0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIFJFVEFJ
TiA9ICdyJywKLSAgICBGSUxURVIgPSAnZic7Ci0KLWZ1bmN0aW9uIE9wZXJhdGlvbiAodHlwZSwg
Y291bnQpIHsKLSAgdGhpcy50eXBlID0gdHlwZTsKLSAgdGhpcy5jb3VudCA9IGNvdW50OwotfQot
Ci0vKioKLSAgQW4gYEVtYmVyLlN1YkFycmF5YCB0cmFja3MgYW4gYXJyYXkgaW4gYSB3YXkgc2lt
aWxhciB0bywgYnV0IG1vcmUgc3BlY2lhbGl6ZWQKLSAgdGhhbiwgYEVtYmVyLlRyYWNrZWRBcnJh
eWAuICBJdCBpcyB1c2VmdWwgZm9yIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGluZGV4ZXMgb2YKLSAg
aXRlbXMgd2l0aGluIGEgZmlsdGVyZWQgYXJyYXkuCi0KLSAgQGNsYXNzIFN1YkFycmF5Ci0gIEBu
YW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5TdWJBcnJheSA9IGZ1bmN0aW9uIChsZW5ndGgpIHsK
LSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7IGxlbmd0aCA9IDA7IH0KLQotICBpZiAobGVu
Z3RoID4gMCkgewotICAgIHRoaXMuX29wZXJhdGlvbnMgPSBbbmV3IE9wZXJhdGlvbihSRVRBSU4s
IGxlbmd0aCldOwotICB9IGVsc2UgewotICAgIHRoaXMuX29wZXJhdGlvbnMgPSBbXTsKLSAgfQot
fTsKLQotRW1iZXIuU3ViQXJyYXkucHJvdG90eXBlID0gewotICAvKioKLSAgICBUcmFjayB0aGF0
IGFuIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSB0cmFja2VkIGFycmF5LgotCi0gICAgQG1ldGhvZCBh
ZGRJdGVtCi0KLSAgICBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVt
IGluIHRoZSB0cmFja2VkIGFycmF5LgotICAgIEBwYXJhbSB7Ym9vbGVhbn0gbWF0Y2ggYHRydWVg
IGlmZiB0aGUgaXRlbSBpcyBpbmNsdWRlZCBpbiB0aGUgc3ViYXJyYXkuCi0KLSAgICBAcmV0dXJu
IHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgc3ViYXJyYXkuCi0gICovCi0g
IGFkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBtYXRjaCkgewotICAgIHZhciByZXR1cm5WYWx1ZSA9
IC0xLAotICAgICAgICBpdGVtVHlwZSA9IG1hdGNoID8gUkVUQUlOIDogRklMVEVSLAotICAgICAg
ICBzZWxmID0gdGhpczsKLQotICAgIHRoaXMuX2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9u
KG9wZXJhdGlvbiwgb3BlcmF0aW9uSW5kZXgsIHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBzZWVuSW5T
dWJBcnJheSkgewotICAgICAgdmFyIG5ld09wZXJhdGlvbiwgc3BsaXRPcGVyYXRpb247Ci0KLSAg
ICAgIGlmIChpdGVtVHlwZSA9PT0gb3BlcmF0aW9uLnR5cGUpIHsKLSAgICAgICAgKytvcGVyYXRp
b24uY291bnQ7Ci0gICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSByYW5nZVN0YXJ0KSB7Ci0gICAg
ICAgIC8vIGluc2VydCB0byB0aGUgbGVmdCBvZiBgb3BlcmF0aW9uYAotICAgICAgICBzZWxmLl9v
cGVyYXRpb25zLnNwbGljZShvcGVyYXRpb25JbmRleCwgMCwgbmV3IE9wZXJhdGlvbihpdGVtVHlw
ZSwgMSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3T3BlcmF0aW9uID0gbmV3IE9wZXJh
dGlvbihpdGVtVHlwZSwgMSk7Ci0gICAgICAgIHNwbGl0T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlv
bihvcGVyYXRpb24udHlwZSwgcmFuZ2VFbmQgLSBpbmRleCArIDEpOwotICAgICAgICBvcGVyYXRp
b24uY291bnQgPSBpbmRleCAtIHJhbmdlU3RhcnQ7Ci0KLSAgICAgICAgc2VsZi5fb3BlcmF0aW9u
cy5zcGxpY2Uob3BlcmF0aW9uSW5kZXggKyAxLCAwLCBuZXdPcGVyYXRpb24sIHNwbGl0T3BlcmF0
aW9uKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgIGlmIChvcGVyYXRp
b24udHlwZSA9PT0gUkVUQUlOKSB7Ci0gICAgICAgICAgcmV0dXJuVmFsdWUgPSBzZWVuSW5TdWJB
cnJheSArIChpbmRleCAtIHJhbmdlU3RhcnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAg
ICAgc2VsZi5fY29tcG9zZUF0KG9wZXJhdGlvbkluZGV4KTsKLSAgICB9LCBmdW5jdGlvbihzZWVu
SW5TdWJBcnJheSkgewotICAgICAgc2VsZi5fb3BlcmF0aW9ucy5wdXNoKG5ldyBPcGVyYXRpb24o
aXRlbVR5cGUsIDEpKTsKLQotICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgIHJldHVyblZhbHVl
ID0gc2VlbkluU3ViQXJyYXk7Ci0gICAgICB9Ci0KLSAgICAgIHNlbGYuX2NvbXBvc2VBdChzZWxm
Ll9vcGVyYXRpb25zLmxlbmd0aC0xKTsKLSAgICB9KTsKLQotICAgIHJldHVybiByZXR1cm5WYWx1
ZTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFjayB0aGF0IGFuIGl0ZW0gd2FzIHJlbW92ZWQgZnJv
bSB0aGUgdHJhY2tlZCBhcnJheS4KLQotICAgIEBtZXRob2QgcmVtb3ZlSXRlbQotCi0gICAgQHBh
cmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgdHJhY2tlZCBh
cnJheS4KLQotICAgIEByZXR1cm4ge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRo
ZSBzdWJhcnJheSwgb3IgYC0xYCBpZiB0aGUgaXRlbQotICAgIHdhcyBub3QgaW4gdGhlIHN1YmFy
cmF5LgotICAqLwotICByZW1vdmVJdGVtOiBmdW5jdGlvbihpbmRleCkgewotICAgIHZhciByZXR1
cm5WYWx1ZSA9IC0xLAotICAgICAgICBzZWxmID0gdGhpczsKLQotICAgIHRoaXMuX2ZpbmRPcGVy
YXRpb24oaW5kZXgsIGZ1bmN0aW9uIChvcGVyYXRpb24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0
YXJ0LCByYW5nZUVuZCwgc2VlbkluU3ViQXJyYXkpIHsKLSAgICAgIGlmIChvcGVyYXRpb24udHlw
ZSA9PT0gUkVUQUlOKSB7Ci0gICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXkgKyAo
aW5kZXggLSByYW5nZVN0YXJ0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wZXJhdGlvbi5jb3Vu
dCA+IDEpIHsKLSAgICAgICAgLS1vcGVyYXRpb24uY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAg
ICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGljZShvcGVyYXRpb25JbmRleCwgMSk7Ci0gICAgICAg
IHNlbGYuX2NvbXBvc2VBdChvcGVyYXRpb25JbmRleCk7Ci0gICAgICB9Ci0gICAgfSwgZnVuY3Rp
b24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNhbid0IHJlbW92ZSBhbiBpdGVt
IHRoYXQgaGFzIG5ldmVyIGJlZW4gYWRkZWQuIik7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcmV0
dXJuVmFsdWU7Ci0gIH0sCi0KLQotICBfZmluZE9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4LCBm
b3VuZENhbGxiYWNrLCBub3RGb3VuZENhbGxiYWNrKSB7Ci0gICAgdmFyIG9wZXJhdGlvbkluZGV4
LAotICAgICAgICBsZW4sCi0gICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgcmFuZ2VTdGFydCwK
LSAgICAgICAgcmFuZ2VFbmQsCi0gICAgICAgIHNlZW5JblN1YkFycmF5ID0gMDsKLQotICAgIC8v
IE9QVElNSVpFOiBjaGFuZ2UgdG8gYmFsYW5jZWQgdHJlZQotICAgIC8vIGZpbmQgbGVmdG1vc3Qg
b3BlcmF0aW9uIHRvIHRoZSByaWdodCBvZiBgaW5kZXhgCi0gICAgZm9yIChvcGVyYXRpb25JbmRl
eCA9IHJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgb3BlcmF0
aW9uSW5kZXggPCBsZW47IHJhbmdlU3RhcnQgPSByYW5nZUVuZCArIDEsICsrb3BlcmF0aW9uSW5k
ZXgpIHsKLSAgICAgIG9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbb3BlcmF0aW9uSW5kZXhd
OwotICAgICAgcmFuZ2VFbmQgPSByYW5nZVN0YXJ0ICsgb3BlcmF0aW9uLmNvdW50IC0gMTsKLQot
ICAgICAgaWYgKGluZGV4ID49IHJhbmdlU3RhcnQgJiYgaW5kZXggPD0gcmFuZ2VFbmQpIHsKLSAg
ICAgICAgZm91bmRDYWxsYmFjayhvcGVyYXRpb24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0
LCByYW5nZUVuZCwgc2VlbkluU3ViQXJyYXkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVs
c2UgaWYgKG9wZXJhdGlvbi50eXBlID09PSBSRVRBSU4pIHsKLSAgICAgICAgc2VlbkluU3ViQXJy
YXkgKz0gb3BlcmF0aW9uLmNvdW50OwotICAgICAgfQotICAgIH0KLQotICAgIG5vdEZvdW5kQ2Fs
bGJhY2soc2VlbkluU3ViQXJyYXkpOwotICB9LAotCi0gIF9jb21wb3NlQXQ6IGZ1bmN0aW9uKGlu
ZGV4KSB7Ci0gICAgdmFyIG9wID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleF0sCi0gICAgICAgIG90
aGVyT3A7Ci0KLSAgICBpZiAoIW9wKSB7Ci0gICAgICAvLyBDb21wb3Npbmcgb3V0IG9mIGJvdW5k
cyBpcyBhIG5vLW9wLCBhcyB3aGVuIHJlbW92aW5nIHRoZSBsYXN0IG9wZXJhdGlvbgotICAgICAg
Ly8gaW4gdGhlIGxpc3QuCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGluZGV4ID4g
MCkgewotICAgICAgb3RoZXJPcCA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXgtMV07Ci0gICAgICBp
ZiAob3RoZXJPcC50eXBlID09PSBvcC50eXBlKSB7Ci0gICAgICAgIG9wLmNvdW50ICs9IG90aGVy
T3AuY291bnQ7Ci0gICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGluZGV4LTEsIDEpOwot
ICAgICAgICAtLWluZGV4OwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpbmRleCA8IHRoaXMu
X29wZXJhdGlvbnMubGVuZ3RoLTEpIHsKLSAgICAgIG90aGVyT3AgPSB0aGlzLl9vcGVyYXRpb25z
W2luZGV4KzFdOwotICAgICAgaWYgKG90aGVyT3AudHlwZSA9PT0gb3AudHlwZSkgewotICAgICAg
ICBvcC5jb3VudCArPSBvdGhlck9wLmNvdW50OwotICAgICAgICB0aGlzLl9vcGVyYXRpb25zLnNw
bGljZShpbmRleCsxLCAxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgdG9TdHJpbmc6IGZ1
bmN0aW9uICgpIHsKLSAgICB2YXIgc3RyID0gIiI7Ci0gICAgZm9yRWFjaCh0aGlzLl9vcGVyYXRp
b25zLCBmdW5jdGlvbiAob3BlcmF0aW9uKSB7Ci0gICAgICBzdHIgKz0gIiAiICsgb3BlcmF0aW9u
LnR5cGUgKyAiOiIgKyBvcGVyYXRpb24uY291bnQ7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHN0ci5z
dWJzdHJpbmcoMSk7Ci0gIH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJl
ci5Db250YWluZXIgPSByZXF1aXJlTW9kdWxlKCdjb250YWluZXInKTsKLUVtYmVyLkNvbnRhaW5l
ci5zZXQgPSBFbWJlci5zZXQ7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5B
cHBsaWNhdGlvbiA9IEVtYmVyLk5hbWVzcGFjZS5leHRlbmQoKTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1l
Ci0qLwotCi12YXIgT1VUX09GX1JBTkdFX0VYQ0VQVElPTiA9ICJJbmRleCBvdXQgb2YgcmFuZ2Ui
OwotdmFyIEVNUFRZID0gW107Ci0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKLQotLyoqCi0gIEFuIEFycmF5UHJveHkgd3JhcHMgYW55IG90aGVyIG9iamVjdCB0aGF0IGlt
cGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQvb3IKLSAgYEVtYmVyLk11dGFibGVBcnJheSxgIGZv
cndhcmRpbmcgYWxsIHJlcXVlc3RzLiBUaGlzIG1ha2VzIGl0IHZlcnkgdXNlZnVsIGZvcgotICBh
IG51bWJlciBvZiBiaW5kaW5nIHVzZSBjYXNlcyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBh
YmxlIHRvIHN3YXAKLSAgb3V0IHRoZSB1bmRlcmx5aW5nIGFycmF5IGlzIHVzZWZ1bC4KLQotICBB
IHNpbXBsZSBleGFtcGxlIG9mIHVzYWdlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHBldHMg
PSBbJ2RvZycsICdjYXQnLCAnZmlzaCddOwotICB2YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNy
ZWF0ZSh7IGNvbnRlbnQ6IEVtYmVyLkEocGV0cykgfSk7Ci0KLSAgYXAuZ2V0KCdmaXJzdE9iamVj
dCcpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdkb2cnCi0gIGFwLnNldCgnY29udGVudCcs
IFsnYW1vZWJhJywgJ3BhcmFtZWNpdW0nXSk7Ci0gIGFwLmdldCgnZmlyc3RPYmplY3QnKTsgICAg
ICAgICAgICAgICAgICAgICAgICAvLyAnYW1vZWJhJwotICBgYGAKLQotICBUaGlzIGNsYXNzIGNh
biBhbHNvIGJlIHVzZWZ1bCBhcyBhIGxheWVyIHRvIHRyYW5zZm9ybSB0aGUgY29udGVudHMgb2YK
LSAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFjY2Vzc2VkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IG92
ZXJyaWRpbmcKLSAgYG9iamVjdEF0Q29udGVudGA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIg
cGV0cyA9IFsnZG9nJywgJ2NhdCcsICdmaXNoJ107Ci0gIHZhciBhcCA9IEVtYmVyLkFycmF5UHJv
eHkuY3JlYXRlKHsKLSAgICAgIGNvbnRlbnQ6IEVtYmVyLkEocGV0cyksCi0gICAgICBvYmplY3RB
dENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewotICAgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29u
dGVudCcpLm9iamVjdEF0KGlkeCkudG9VcHBlckNhc2UoKTsKLSAgICAgIH0KLSAgfSk7Ci0KLSAg
YXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyAuICdET0cnCi0gIGBgYAotCi0gIEBjbGFzcyBBcnJh
eVByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1
c2VzIEVtYmVyLk11dGFibGVBcnJheQotKi8KLUVtYmVyLkFycmF5UHJveHkgPSBFbWJlci5PYmpl
Y3QuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJheSwgewotCi0gIC8qKgotICAgIFRoZSBjb250ZW50
IGFycmF5LiBNdXN0IGJlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBh
bmQvb3IKLSAgICBgRW1iZXIuTXV0YWJsZUFycmF5LmAKLQotICAgIEBwcm9wZXJ0eSBjb250ZW50
Ci0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAgKi8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioK
LSAgIFRoZSBhcnJheSB0aGF0IHRoZSBwcm94eSBwcmV0ZW5kcyB0byBiZS4gSW4gdGhlIGRlZmF1
bHQgYEFycmF5UHJveHlgCi0gICBpbXBsZW1lbnRhdGlvbiwgdGhpcyBhbmQgYGNvbnRlbnRgIGFy
ZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBgQXJyYXlQcm94eWAKLSAgIGNhbiBvdmVycmlkZSB0
aGlzIHByb3BlcnR5IHRvIHByb3ZpZGUgdGhpbmdzIGxpa2Ugc29ydGluZyBhbmQgZmlsdGVyaW5n
LgotCi0gICBAcHJvcGVydHkgYXJyYW5nZWRDb250ZW50Ci0gICovCi0gIGFycmFuZ2VkQ29udGVu
dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKSwKLQotICAvKioKLSAgICBTaG91bGQg
YWN0dWFsbHkgcmV0cmlldmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20g
dGhlCi0gICAgY29udGVudC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFz
c2VzIHRvIHRyYW5zZm9ybSB0aGUKLSAgICBjb250ZW50IGl0ZW0gdG8gc29tZXRoaW5nIG5ldy4K
LQotICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24t
YG51bGxgLgotCi0gICAgQG1ldGhvZCBvYmplY3RBdENvbnRlbnQKLSAgICBAcGFyYW0ge051bWJl
cn0gaWR4IFRoZSBpbmRleCB0byByZXRyaWV2ZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSB2
YWx1ZSBvciB1bmRlZmluZWQgaWYgbm9uZSBmb3VuZAotICAqLwotICBvYmplY3RBdENvbnRlbnQ6
IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcp
Lm9iamVjdEF0KGlkeCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2hvdWxkIGFjdHVhbGx5IHJlcGxh
Y2UgdGhlIHNwZWNpZmllZCBvYmplY3RzIG9uIHRoZSBjb250ZW50IGFycmF5LgotICAgIFlvdSBj
YW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB0cmFuc2Zvcm0gdGhlIGNv
bnRlbnQgaXRlbQotICAgIGludG8gc29tZXRoaW5nIG5ldy4KLQotICAgIFRoaXMgbWV0aG9kIHdp
bGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgotCi0gICAgQG1ldGhv
ZCByZXBsYWNlQ29udGVudAotICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIHN0YXJ0aW5nIGlu
ZGV4Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92
ZSBmcm9tIHRoZSBjb250ZW50LgotICAgIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgT3B0aW9uYWwg
YXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnQgb3IgbnVsbCBpZiBubwotICAgICAgb2JqZWN0cy4K
LSAgICBAcmV0dXJuIHt2b2lkfQotICAqLwotICByZXBsYWNlQ29udGVudDogZnVuY3Rpb24oaWR4
LCBhbXQsIG9iamVjdHMpIHsKLSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5yZXBsYWNlKGlkeCwg
YW10LCBvYmplY3RzKTsKLSAgfSwKLQotICAvKioKLSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRl
bnQgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlLiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCB0
aGUKLSAgICBlbnRpcmUgYXJyYXkgY29udGVudCB3aWxsIGNoYW5nZS4KLQotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBfY29udGVudFdpbGxDaGFuZ2UKLSAgKi8KLSAgX2NvbnRlbnRXaWxsQ2hh
bmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY29udGVudCcsIGZ1bmN0aW9uKCkgewotICAgIHRo
aXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9KSwKLQotICBfdGVhcmRvd25Db250ZW50OiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpOwotCi0gICAg
aWYgKGNvbnRlbnQpIHsKLSAgICAgIGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7
Ci0gICAgICAgIHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAg
ZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9
LAotCi0gIGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6IEVtYmVyLkssCi0gIGNvbnRlbnRBcnJheURp
ZENoYW5nZTogRW1iZXIuSywKLQotICAvKioKLSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQg
cHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCi0gICAgZW50aXJl
IGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
X2NvbnRlbnREaWRDaGFuZ2UKLSAgKi8KLSAgX2NvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2Vy
dmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywg
J2NvbnRlbnQnKTsKLQotICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IEFycmF5UHJveHkncyBj
b250ZW50IHRvIGl0c2VsZiIsIGNvbnRlbnQgIT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBD
b250ZW50KCk7Ci0gIH0pLAotCi0gIF9zZXR1cENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAoY29udGVudCkgewot
ICAgICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgICAgd2lsbENoYW5n
ZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFuZ2UnLAotICAgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50
QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9KTsKLSAgICB9Ci0gIH0sCi0KLSAgX2FycmFuZ2VkQ29u
dGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBm
dW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdl
ZENvbnRlbnQnKSwKLSAgICAgICAgbGVuID0gYXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2Vk
Q29udGVudCwgJ2xlbmd0aCcpIDogMDsKLQotICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlX
aWxsQ2hhbmdlKHRoaXMsIDAsIGxlbiwgdW5kZWZpbmVkKTsKLSAgICB0aGlzLmFycmFuZ2VkQ29u
dGVudFdpbGxDaGFuZ2UodGhpcyk7Ci0KLSAgICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVu
dChhcnJhbmdlZENvbnRlbnQpOwotICB9KSwKLQotICBfYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdl
OiBFbWJlci5vYnNlcnZlcignYXJyYW5nZWRDb250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JyksCi0gICAgICAg
IGxlbiA9IGFycmFuZ2VkQ29udGVudCA/IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6
IDA7Ci0KLSAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBBcnJheVByb3h5J3MgY29udGVudCB0
byBpdHNlbGYiLCBhcnJhbmdlZENvbnRlbnQgIT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBB
cnJhbmdlZENvbnRlbnQoKTsKLQotICAgIHRoaXMuYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRo
aXMpOwotICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2UodGhpcywgMCwgdW5k
ZWZpbmVkLCBsZW4pOwotICB9KSwKLQotICBfc2V0dXBBcnJhbmdlZENvbnRlbnQ6IGZ1bmN0aW9u
KCkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVu
dCcpOwotCi0gICAgaWYgKGFycmFuZ2VkQ29udGVudCkgewotICAgICAgYXJyYW5nZWRDb250ZW50
LmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgewotICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRD
b250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlOiAnYXJyYW5nZWRDb250
ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9KTsKLSAgICB9Ci0gIH0sCi0KLSAgX3RlYXJkb3du
QXJyYW5nZWRDb250ZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0g
Z2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLQotICAgIGlmIChhcnJhbmdlZENvbnRlbnQp
IHsKLSAgICAgIGFycmFuZ2VkQ29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAg
ICAgICAgd2lsbENoYW5nZTogJ2FycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAg
ICAgIGRpZENoYW5nZTogJ2FycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJwotICAgICAgfSk7
Ci0gICAgfQotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLkssCi0g
IGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogRW1iZXIuSywKLQotICBvYmplY3RBdDogZnVuY3Rp
b24oaWR4KSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAnY29udGVudCcpICYmIHRoaXMub2JqZWN0
QXRDb250ZW50KGlkeCk7Ci0gIH0sCi0KLSAgbGVuZ3RoOiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRl
bnQnKTsKLSAgICByZXR1cm4gYXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwg
J2xlbmd0aCcpIDogMDsKLSAgICAvLyBObyBkZXBlbmRlbmNpZXMgc2luY2UgRW51bWVyYWJsZSBu
b3RpZmllcyBsZW5ndGggb2YgY2hhbmdlCi0gIH0pLAotCi0gIF9yZXBsYWNlOiBmdW5jdGlvbihp
ZHgsIGFtdCwgb2JqZWN0cykgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50
Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCdUaGUgY29udGVudCBwcm9wZXJ0eSBvZiAnKyB0aGlzLmNv
bnN0cnVjdG9yICsgJyBzaG91bGQgYmUgc2V0IGJlZm9yZSBtb2RpZnlpbmcgaXQnLCBjb250ZW50
KTsKLSAgICBpZiAoY29udGVudCkgdGhpcy5yZXBsYWNlQ29udGVudChpZHgsIGFtdCwgb2JqZWN0
cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgcmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0g
ICAgaWYgKGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVu
dCcpKSB7Ci0gICAgICB0aGlzLl9yZXBsYWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiVXNpbmcgcmVwbGFjZSBvbiBh
biBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLiIpOwotICAgIH0KLSAgfSwKLQot
ICBfaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdldCh0
aGlzLCAnY29udGVudC5sZW5ndGgnKSkgdGhyb3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5H
RV9FWENFUFRJT04pOwotICAgIHRoaXMuX3JlcGxhY2UoaWR4LCAwLCBbb2JqZWN0XSk7Ci0gICAg
cmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7
Ci0gICAgaWYgKGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JykgPT09IGdldCh0aGlzLCAnY29u
dGVudCcpKSB7Ci0gICAgICByZXR1cm4gdGhpcy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwotICAg
IH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIlVzaW5nIGluc2VydEF0IG9u
IGFuIGFycmFuZ2VkIEFycmF5UHJveHkgaXMgbm90IGFsbG93ZWQuIik7Ci0gICAgfQotICB9LAot
Ci0gIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFydCwgbGVuKSB7Ci0gICAgaWYgKCdudW1iZXInID09
PSB0eXBlb2Ygc3RhcnQpIHsKLSAgICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50
JyksCi0gICAgICAgICAgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRl
bnQnKSwKLSAgICAgICAgICBpbmRpY2VzID0gW10sIGk7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAw
KSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgICAgfQotCi0gICAgICBp
ZiAobGVuID09PSB1bmRlZmluZWQpIGxlbiA9IDE7Ci0KLSAgICAgIC8vIEdldCBhIGxpc3Qgb2Yg
aW5kaWNlcyBpbiBvcmlnaW5hbCBjb250ZW50IHRvIHJlbW92ZQotICAgICAgZm9yIChpPXN0YXJ0
OyBpPHN0YXJ0K2xlbjsgaSsrKSB7Ci0gICAgICAgIC8vIFVzZSBhcnJhbmdlZENvbnRlbnQgaGVy
ZSBzbyB3ZSBhdm9pZCBjb25mdXNpb24gd2l0aCBvYmplY3RzIHRyYW5zZm9ybWVkIGJ5IG9iamVj
dEF0Q29udGVudAotICAgICAgICBpbmRpY2VzLnB1c2goY29udGVudC5pbmRleE9mKGFycmFuZ2Vk
Q29udGVudC5vYmplY3RBdChpKSkpOwotICAgICAgfQotCi0gICAgICAvLyBSZXBsYWNlIGluIHJl
dmVyc2Ugb3JkZXIgc2luY2UgaW5kaWNlcyB3aWxsIGNoYW5nZQotICAgICAgaW5kaWNlcy5zb3J0
KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYiAtIGE7IH0pOwotCi0gICAgICBFbWJlci5iZWdpblBy
b3BlcnR5Q2hhbmdlcygpOwotICAgICAgZm9yIChpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKykg
ewotICAgICAgICB0aGlzLl9yZXBsYWNlKGluZGljZXNbaV0sIDEsIEVNUFRZKTsKLSAgICAgIH0K
LSAgICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpOwotICAgIH0KLQotICAgIHJldHVybiB0
aGlzIDsKLSAgfSwKLQotICBwdXNoT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLl9p
bnNlcnRBdChnZXQodGhpcywgJ2NvbnRlbnQubGVuZ3RoJyksIG9iaikgOwotICAgIHJldHVybiBv
YmogOwotICB9LAotCi0gIHB1c2hPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgaWYg
KCEoRW1iZXIuRW51bWVyYWJsZS5kZXRlY3Qob2JqZWN0cykgfHwgRW1iZXIuaXNBcnJheShvYmpl
Y3RzKSkpIHsKLSAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk11c3QgcGFzcyBFbWJlci5FbnVt
ZXJhYmxlIHRvIEVtYmVyLk11dGFibGVBcnJheSNwdXNoT2JqZWN0cyIpOwotICAgIH0KLSAgICB0
aGlzLl9yZXBsYWNlKGdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOwotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIHNldE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBp
ZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmNsZWFyKCk7Ci0KLSAgICB2YXIg
bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICB0aGlzLl9yZXBsYWNlKDAsIGxlbiwgb2Jq
ZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgdW5zaGlmdE9iamVjdDogZnVuY3Rp
b24ob2JqKSB7Ci0gICAgdGhpcy5faW5zZXJ0QXQoMCwgb2JqKSA7Ci0gICAgcmV0dXJuIG9iaiA7
Ci0gIH0sCi0KLSAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICB0aGlz
Ll9yZXBsYWNlKDAsIDAsIG9iamVjdHMpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHNs
aWNlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyID0gdGhpcy50b0FycmF5KCk7Ci0gICAgcmV0
dXJuIGFyci5zbGljZS5hcHBseShhcnIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgYXJyYW5nZWRD
b250ZW50QXJyYXlXaWxsQ2hhbmdlOiBmdW5jdGlvbihpdGVtLCBpZHgsIHJlbW92ZWRDbnQsIGFk
ZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdlKGlkeCwgcmVtb3ZlZENu
dCwgYWRkZWRDbnQpOwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlOiBm
dW5jdGlvbihpdGVtLCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJh
eUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCk7Ci0gIH0sCi0KLSAg
aW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9zZXR1cENv
bnRlbnQoKTsKLSAgICB0aGlzLl9zZXR1cEFycmFuZ2VkQ29udGVudCgpOwotICB9LAotCi0gIHdp
bGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVu
dCgpOwotICAgIHRoaXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCi0qLwotCi0KLXZhciBzZXQgPSBFbWJlci5zZXQsIGdldCA9IEVtYmVyLmdldCwgZ3Vp
ZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5mb3JFYWNoLAotICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwot
Ci12YXIgRWFjaEFycmF5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5BcnJheSwgewotCi0g
IGluaXQ6IGZ1bmN0aW9uKGNvbnRlbnQsIGtleU5hbWUsIG93bmVyKSB7Ci0gICAgdGhpcy5fc3Vw
ZXIoKTsKLSAgICB0aGlzLl9rZXlOYW1lID0ga2V5TmFtZTsKLSAgICB0aGlzLl9vd25lciAgID0g
b3duZXI7Ci0gICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7Ci0gIH0sCi0KLSAgb2JqZWN0QXQ6
IGZ1bmN0aW9uKGlkeCkgewotICAgIHZhciBpdGVtID0gdGhpcy5fY29udGVudC5vYmplY3RBdChp
ZHgpOwotICAgIHJldHVybiBpdGVtICYmIGdldChpdGVtLCB0aGlzLl9rZXlOYW1lKTsKLSAgfSwK
LQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50
ID0gdGhpcy5fY29udGVudDsKLSAgICByZXR1cm4gY29udGVudCA/IGdldChjb250ZW50LCAnbGVu
Z3RoJykgOiAwOwotICB9KQotCi19KTsKLQotdmFyIElTX09CU0VSVkVSID0gL14uKzooYmVmb3Jl
fGNoYW5nZSkkLzsKLQotZnVuY3Rpb24gYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQs
IGtleU5hbWUsIHByb3h5LCBpZHgsIGxvYykgewotICB2YXIgb2JqZWN0cyA9IHByb3h5Ll9vYmpl
Y3RzLCBndWlkOwotICBpZiAoIW9iamVjdHMpIG9iamVjdHMgPSBwcm94eS5fb2JqZWN0cyA9IHt9
OwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsKLSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2JqZWN0
QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewotICAgICAgRW1iZXIuYXNzZXJ0KCdXaGVuIHVzaW5n
IEBlYWNoIHRvIG9ic2VydmUgdGhlIGFycmF5ICcgKyBjb250ZW50ICsgJywgdGhlIGFycmF5IG11
c3QgcmV0dXJuIGFuIG9iamVjdCcsIEVtYmVyLnR5cGVPZihpdGVtKSA9PT0gJ2luc3RhbmNlJyB8
fCBFbWJlci50eXBlT2YoaXRlbSkgPT09ICdvYmplY3QnKTsKLSAgICAgIEVtYmVyLmFkZEJlZm9y
ZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleVdpbGxDaGFuZ2UnKTsK
LSAgICAgIEVtYmVyLmFkZE9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtl
eURpZENoYW5nZScpOwotCi0gICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbmRleCBlYWNoIGl0
ZW0gd2FzIGZvdW5kIGF0IHNvIHdlIGNhbiBtYXAKLSAgICAgIC8vIGl0IGJhY2sgd2hlbiB0aGUg
b2JqIGNoYW5nZXMuCi0gICAgICBndWlkID0gZ3VpZEZvcihpdGVtKTsKLSAgICAgIGlmICghb2Jq
ZWN0c1tndWlkXSkgb2JqZWN0c1tndWlkXSA9IFtdOwotICAgICAgb2JqZWN0c1tndWlkXS5wdXNo
KGxvYyk7Ci0gICAgfQotICB9Ci19Ci0KLWZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVu
dEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKLSAgdmFyIG9iamVjdHMg
PSBwcm94eS5fb2JqZWN0czsKLSAgaWYgKCFvYmplY3RzKSBvYmplY3RzID0gcHJveHkuX29iamVj
dHMgPSB7fTsKLSAgdmFyIGluZGljaWVzLCBndWlkOwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsK
LSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2JqZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewot
ICAgICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdj
b250ZW50S2V5V2lsbENoYW5nZScpOwotICAgICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIoaXRlbSwg
a2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5RGlkQ2hhbmdlJyk7Ci0KLSAgICAgIGd1aWQgPSBn
dWlkRm9yKGl0ZW0pOwotICAgICAgaW5kaWNpZXMgPSBvYmplY3RzW2d1aWRdOwotICAgICAgaW5k
aWNpZXNbaW5kZXhPZi5jYWxsKGluZGljaWVzLCBsb2MpXSA9IG51bGw7Ci0gICAgfQotICB9Ci19
Ci0KLS8qKgotICBUaGlzIGlzIHRoZSBvYmplY3QgaW5zdGFuY2UgcmV0dXJuZWQgd2hlbiB5b3Ug
Z2V0IHRoZSBgQGVhY2hgIHByb3BlcnR5IG9uIGFuCi0gIGFycmF5LiBJdCB1c2VzIHRoZSB1bmtu
b3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZQotICBFYWNoQXJyYXkg
aW5zdGFuY2VzIGZvciBwcm9wZXJ0eSBuYW1lcy4KLQotICBAcHJpdmF0ZQotICBAY2xhc3MgRWFj
aFByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwot
RW1iZXIuRWFjaFByb3h5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0KLSAgaW5pdDogZnVuY3Rp
b24oY29udGVudCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5fY29udGVudCA9IGNv
bnRlbnQ7Ci0gICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMpOwotCi0gICAgLy8gaW4g
Y2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2JzZXJ2aW5nIHNvbWUga2V5cyBtYWtlIHN1cmUgdGhl
eSBhcmUKLSAgICAvLyBhZGRlZAotICAgIGZvckVhY2goRW1iZXIud2F0Y2hlZEV2ZW50cyh0aGlz
KSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0gICAgICB0aGlzLmRpZEFkZExpc3RlbmVyKGV2ZW50
TmFtZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IGNhbiBkaXJlY3Rs
eSBhY2Nlc3MgbWFwcGVkIHByb3BlcnRpZXMgYnkgc2ltcGx5IHJlcXVlc3RpbmcgdGhlbS4KLSAg
ICBUaGUgYHVua25vd25Qcm9wZXJ0eWAgaGFuZGxlciB3aWxsIGdlbmVyYXRlIGFuIEVhY2hBcnJh
eSBvZiBlYWNoIGl0ZW0uCi0KLSAgICBAbWV0aG9kIHVua25vd25Qcm9wZXJ0eQotICAgIEBwYXJh
bSBrZXlOYW1lIHtTdHJpbmd9Ci0gICAgQHBhcmFtIHZhbHVlIHsqfQotICAqLwotICB1bmtub3du
UHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUsIHZhbHVlKSB7Ci0gICAgdmFyIHJldDsKLSAgICBy
ZXQgPSBuZXcgRWFjaEFycmF5KHRoaXMuX2NvbnRlbnQsIGtleU5hbWUsIHRoaXMpOwotICAgIEVt
YmVyLmRlZmluZVByb3BlcnR5KHRoaXMsIGtleU5hbWUsIG51bGwsIHJldCk7Ci0gICAgdGhpcy5i
ZWdpbk9ic2VydmluZ0NvbnRlbnRLZXkoa2V5TmFtZSk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSwK
LQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0gIC8vIEFSUkFZIENIQU5HRVMKLSAgLy8gSW52b2tlcyB3aGVuZXZlciB0aGUg
Y29udGVudCBhcnJheSBpdHNlbGYgY2hhbmdlcy4KLQotICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0
aW9uKGNvbnRlbnQsIGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKLSAgICB2YXIga2V5cyA9
IHRoaXMuX2tleXMsIGtleSwgbGltOwotCi0gICAgbGltID0gcmVtb3ZlZENudD4wID8gaWR4K3Jl
bW92ZWRDbnQgOiAtMTsKLSAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKLQot
ICAgIGZvcihrZXkgaW4ga2V5cykgewotICAgICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtl
eSkpIHsgY29udGludWU7IH0KLQotICAgICAgaWYgKGxpbT4wKSB7IHJlbW92ZU9ic2VydmVyRm9y
Q29udGVudEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsgfQotCi0gICAgICBFbWJl
ci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywga2V5KTsKLSAgICB9Ci0KLSAgICBFbWJlci5wcm9w
ZXJ0eVdpbGxDaGFuZ2UodGhpcy5fY29udGVudCwgJ0BlYWNoJyk7Ci0gICAgRW1iZXIuZW5kUHJv
cGVydHlDaGFuZ2VzKHRoaXMpOwotICB9LAotCi0gIGFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihj
b250ZW50LCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlz
Ll9rZXlzLCBsaW07Ci0KLSAgICBsaW0gPSBhZGRlZENudD4wID8gaWR4K2FkZGVkQ250IDogLTE7
Ci0gICAgRW1iZXIuY2hhbmdlUHJvcGVydGllcyhmdW5jdGlvbigpIHsKLSAgICAgIGZvcih2YXIg
a2V5IGluIGtleXMpIHsKLSAgICAgICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsg
Y29udGludWU7IH0KLQotICAgICAgICBpZiAobGltPjApIHsgYWRkT2JzZXJ2ZXJGb3JDb250ZW50
S2V5KGNvbnRlbnQsIGtleSwgdGhpcywgaWR4LCBsaW0pOyB9Ci0KLSAgICAgICAgRW1iZXIucHJv
cGVydHlEaWRDaGFuZ2UodGhpcywga2V5KTsKLSAgICAgIH0KLQotICAgICAgRW1iZXIucHJvcGVy
dHlEaWRDaGFuZ2UodGhpcy5fY29udGVudCwgJ0BlYWNoJyk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyBMSVNURU4gRk9SIE5FVyBPQlNFUlZFUlMgQU5EIE9USEVSIEVWRU5U
IExJU1RFTkVSUwotICAvLyBTdGFydCBtb25pdG9yaW5nIGtleXMgYmFzZWQgb24gd2hvIGlzIGxp
c3RlbmluZy4uLgotCi0gIGRpZEFkZExpc3RlbmVyOiBmdW5jdGlvbihldmVudE5hbWUpIHsKLSAg
ICBpZiAoSVNfT0JTRVJWRVIudGVzdChldmVudE5hbWUpKSB7Ci0gICAgICB0aGlzLmJlZ2luT2Jz
ZXJ2aW5nQ29udGVudEtleShldmVudE5hbWUuc2xpY2UoMCwgLTcpKTsKLSAgICB9Ci0gIH0sCi0K
LSAgZGlkUmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIGlmIChJU19P
QlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsKLSAgICAgIHRoaXMuc3RvcE9ic2VydmluZ0NvbnRl
bnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03KSk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAg
Ly8gQ09OVEVOVCBLRVkgT0JTRVJWSU5HCi0gIC8vIEFjdHVhbCB3YXRjaCBrZXlzIG9uIHRoZSBz
b3VyY2UgY29udGVudC4KLQotICBiZWdpbk9ic2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtl
eU5hbWUpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7Ci0gICAgaWYgKCFrZXlzKSBrZXlz
ID0gdGhpcy5fa2V5cyA9IHt9OwotICAgIGlmICgha2V5c1trZXlOYW1lXSkgewotICAgICAga2V5
c1trZXlOYW1lXSA9IDE7Ci0gICAgICB2YXIgY29udGVudCA9IHRoaXMuX2NvbnRlbnQsCi0gICAg
ICAgICAgbGVuID0gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKTsKLSAgICAgIGFkZE9ic2VydmVyRm9y
Q29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCB0aGlzLCAwLCBsZW4pOwotICAgIH0gZWxzZSB7
Ci0gICAgICBrZXlzW2tleU5hbWVdKys7Ci0gICAgfQotICB9LAotCi0gIHN0b3BPYnNlcnZpbmdD
b250ZW50S2V5OiBmdW5jdGlvbihrZXlOYW1lKSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlz
OwotICAgIGlmIChrZXlzICYmIChrZXlzW2tleU5hbWVdPjApICYmICgtLWtleXNba2V5TmFtZV08
PTApKSB7Ci0gICAgICB2YXIgY29udGVudCA9IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVu
ICAgICA9IGdldChjb250ZW50LCAnbGVuZ3RoJyk7Ci0gICAgICByZW1vdmVPYnNlcnZlckZvckNv
bnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgdGhpcywgMCwgbGVuKTsKLSAgICB9Ci0gIH0sCi0K
LSAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAgIEVt
YmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKLSAgfSwKLQotICBjb250ZW50
S2V5RGlkQ2hhbmdlOiBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgICBFbWJlci5wcm9wZXJ0
eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKLSAgfQotCi19KTsKLQotCi0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVu
dGltZQotKi8KLQotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIHJlcGxh
Y2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuX3JlcGxhY2U7Ci0KLS8vIEFkZCBFbWJlci5BcnJh
eSB0byBBcnJheS5wcm90b3R5cGUuIFJlbW92ZSBtZXRob2RzIHdpdGggbmF0aXZlCi0vLyBpbXBs
ZW1lbnRhdGlvbnMgYW5kIHN1cHBseSBzb21lIG1vcmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGdl
bmVyaWMgbWV0aG9kcwotLy8gYmVjYXVzZSB0aGV5IGFyZSBzbyBjb21tb24uCi12YXIgTmF0aXZl
QXJyYXkgPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNl
cnZhYmxlLCBFbWJlci5Db3B5YWJsZSwgewotCi0gIC8vIGJlY2F1c2UgbGVuZ3RoIGlzIGEgYnVp
bHQtaW4gcHJvcGVydHkgd2UgbmVlZCB0byBrbm93IHRvIGp1c3QgZ2V0IHRoZQotICAvLyBvcmln
aW5hbCBwcm9wZXJ0eS4KLSAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKLSAgICBpZiAoa2V5PT09J2xl
bmd0aCcpIHJldHVybiB0aGlzLmxlbmd0aDsKLSAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlw
ZW9mIGtleSkgcmV0dXJuIHRoaXNba2V5XTsKLSAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlcihr
ZXkpOwotICB9LAotCi0gIG9iamVjdEF0OiBmdW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4gdGhp
c1tpZHhdOwotICB9LAotCi0gIC8vIHByaW1pdGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KLSAgcmVw
bGFjZTogZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKLQotICAgIGlmICh0aGlzLmlzRnJv
emVuKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7Ci0KLSAgICAvLyBpZiB3ZSByZXBsYWNlZCBl
eGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcywgdGhlbiBwYXNzIG9ubHkgdGhlCi0gICAg
Ly8gcmVwbGFjZWQgcmFuZ2UuIE90aGVyd2lzZSwgcGFzcyB0aGUgZnVsbCByZW1haW5pbmcgYXJy
YXkgbGVuZ3RoCi0gICAgLy8gc2luY2UgZXZlcnl0aGluZyBoYXMgc2hpZnRlZAotICAgIHZhciBs
ZW4gPSBvYmplY3RzID8gZ2V0KG9iamVjdHMsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJh
eUNvbnRlbnRXaWxsQ2hhbmdlKGlkeCwgYW10LCBsZW4pOwotCi0gICAgaWYgKGxlbiA9PT0gMCkg
ewotICAgICAgdGhpcy5zcGxpY2UoaWR4LCBhbXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXBs
YWNlKHRoaXMsIGlkeCwgYW10LCBvYmplY3RzKTsKLSAgICB9Ci0KLSAgICB0aGlzLmFycmF5Q29u
dGVudERpZENoYW5nZShpZHgsIGFtdCwgbGVuKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQot
ICAvLyBJZiB5b3UgYXNrIGZvciBhbiB1bmtub3duIHByb3BlcnR5LCB0aGVuIHRyeSB0byBjb2xs
ZWN0IHRoZSB2YWx1ZQotICAvLyBmcm9tIG1lbWJlciBpdGVtcy4KLSAgdW5rbm93blByb3BlcnR5
OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIHJldDsvLyA9IHRoaXMucmVkdWNlZFBy
b3BlcnR5KGtleSwgdmFsdWUpIDsKLSAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQpICYmIHJl
dCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICByZXQgPSB0aGlzW2tleV0gPSB2YWx1ZTsKLSAgICB9
Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLy8gSWYgYnJvd3NlciBkaWQgbm90IGltcGxl
bWVudCBpbmRleE9mIG5hdGl2ZWx5LCB0aGVuIG92ZXJyaWRlIHdpdGgKLSAgLy8gc3BlY2lhbGl6
ZWQgdmVyc2lvbgotICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2
YXIgaWR4LCBsZW4gPSB0aGlzLmxlbmd0aDsKLQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmlu
ZWQpIHN0YXJ0QXQgPSAwOwotICAgIGVsc2Ugc3RhcnRBdCA9IChzdGFydEF0IDwgMCkgPyBNYXRo
LmNlaWwoc3RhcnRBdCkgOiBNYXRoLmZsb29yKHN0YXJ0QXQpOwotICAgIGlmIChzdGFydEF0IDwg
MCkgc3RhcnRBdCArPSBsZW47Ci0KLSAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4PGxlbjtpZHgrKykg
ewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0g
ICAgcmV0dXJuIC0xOwotICB9LAotCi0gIGxhc3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0
YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4gPSB0aGlzLmxlbmd0aDsKLQotICAgIGlmIChzdGFy
dEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSBsZW4tMTsKLSAgICBlbHNlIHN0YXJ0QXQgPSAo
c3RhcnRBdCA8IDApID8gTWF0aC5jZWlsKHN0YXJ0QXQpIDogTWF0aC5mbG9vcihzdGFydEF0KTsK
LSAgICBpZiAoc3RhcnRBdCA8IDApIHN0YXJ0QXQgKz0gbGVuOwotCi0gICAgZm9yKGlkeD1zdGFy
dEF0O2lkeD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1
cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIGNvcHk6IGZ1bmN0aW9u
KGRlZXApIHsKLSAgICBpZiAoZGVlcCkgewotICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9u
KGl0ZW0pIHsgcmV0dXJuIEVtYmVyLmNvcHkoaXRlbSwgdHJ1ZSk7IH0pOwotICAgIH0KLQotICAg
IHJldHVybiB0aGlzLnNsaWNlKCk7Ci0gIH0KLX0pOwotCi0vLyBSZW1vdmUgYW55IG1ldGhvZHMg
aW1wbGVtZW50ZWQgbmF0aXZlbHkgc28gd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhlbQotdmFyIGlnbm9y
ZSA9IFsnbGVuZ3RoJ107Ci1FbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaChOYXRpdmVBcnJh
eS5rZXlzKCksIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgaWYgKEFycmF5LnByb3RvdHlwZVtt
ZXRob2ROYW1lXSkgaWdub3JlLnB1c2gobWV0aG9kTmFtZSk7Ci19KTsKLQotaWYgKGlnbm9yZS5s
ZW5ndGg+MCkgewotICBOYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHkoTmF0
aXZlQXJyYXksIGlnbm9yZSk7Ci19Ci0KLS8qKgotICBUaGUgTmF0aXZlQXJyYXkgbWl4aW4gY29u
dGFpbnMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIHRvIHRvIG1ha2UgdGhlIG5hdGl2ZQotICBBcnJh
eSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJheSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQgQVBJ
cy4gVW5sZXNzIHlvdQotICBoYXZlIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVy
LkVYVEVORF9QUk9UT1RZUEVTLkFycmF5YCBzZXQgdG8KLSAgZmFsc2UsIHRoaXMgd2lsbCBiZSBh
cHBsaWVkIGF1dG9tYXRpY2FsbHkuIE90aGVyd2lzZSB5b3UgY2FuIGFwcGx5IHRoZSBtaXhpbgot
ICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlYC4KLQot
ICBAY2xhc3MgTmF0aXZlQXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5N
dXRhYmxlQXJyYXkKLSAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQotICBAdXNlcyBFbWJlci5Db3B5
YWJsZQotKi8KLUVtYmVyLk5hdGl2ZUFycmF5ID0gTmF0aXZlQXJyYXk7Ci0KLS8qKgotICBDcmVh
dGVzIGFuIGBFbWJlci5OYXRpdmVBcnJheWAgZnJvbSBhbiBBcnJheSBsaWtlIG9iamVjdC4KLSAg
RG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBvYmplY3QuIEVtYmVyLkEgaXMgbm90IG5lZWRl
ZCBpZgotICBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIGlzIGB0cnVlYCAodGhlIGRlZmF1bHQg
dmFsdWUpLiBIb3dldmVyLAotICBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgRW1iZXIu
QSB3aGVuIGNyZWF0aW5nIGFkZG9ucyBmb3IKLSAgZW1iZXIgb3Igd2hlbiB5b3UgY2FuIG5vdCBn
dWFyYW50ZWUgdGhhdCBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgCi0gIHdpbGwgYmUgYHRydWVg
LgotCi0gIEV4YW1wbGUKLQotICBgYGBqcwotICB2YXIgUGFnaW5hdGlvbiA9IEVtYmVyLkNvbGxl
Y3Rpb25WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ3VsJywKLSAgICBjbGFzc05hbWVzOiBb
J3BhZ2luYXRpb24nXSwKLSAgICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX3N1cGVy
KCk7Ci0gICAgICBpZiAoIXRoaXMuZ2V0KCdjb250ZW50JykpIHsKLSAgICAgICAgdGhpcy5zZXQo
J2NvbnRlbnQnLCBFbWJlci5BKFtdKSk7Ci0gICAgICB9Ci0gICAgfQotICB9KTsKLSAgYGBgCi0K
LSAgQG1ldGhvZCBBCi0gIEBmb3IgRW1iZXIKLSAgQHJldHVybiB7RW1iZXIuTmF0aXZlQXJyYXl9
Ci0qLwotRW1iZXIuQSA9IGZ1bmN0aW9uKGFycikgewotICBpZiAoYXJyID09PSB1bmRlZmluZWQp
IHsgYXJyID0gW107IH0KLSAgcmV0dXJuIEVtYmVyLkFycmF5LmRldGVjdChhcnIpID8gYXJyIDog
RW1iZXIuTmF0aXZlQXJyYXkuYXBwbHkoYXJyKTsKLX07Ci0KLS8qKgotICBBY3RpdmF0ZXMgdGhl
IG1peGluIG9uIHRoZSBBcnJheS5wcm90b3R5cGUgaWYgbm90IGFscmVhZHkgYXBwbGllZC4gQ2Fs
bGluZwotICB0aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBpcyBzYWZlLiBUaGlzIHdpbGwgYmUg
Y2FsbGVkIHdoZW4gZW1iZXIgaXMgbG9hZGVkCi0gIHVubGVzcyB5b3UgaGF2ZSBgRW1iZXIuRVhU
RU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheWAKLSAgc2V0
IHRvIGBmYWxzZWAuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGpzCi0gIGlmIChFbWJlci5FWFRFTkRf
UFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewot
ICAgIEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlKCk7Ci0gIH0KLSAgYGBgCi0KLSAgQG1ldGhv
ZCBhY3RpdmF0ZQotICBAZm9yIEVtYmVyLk5hdGl2ZUFycmF5Ci0gIEBzdGF0aWMKLSAgQHJldHVy
biB7dm9pZH0KLSovCi1FbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkgewot
ICBOYXRpdmVBcnJheS5hcHBseShBcnJheS5wcm90b3R5cGUpOwotCi0gIEVtYmVyLkEgPSBmdW5j
dGlvbihhcnIpIHsgcmV0dXJuIGFyciB8fCBbXTsgfTsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRf
UFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewot
ICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSgpOwotfQotCi0KLX0pKCk7Ci0KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQot
Ki8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBndWlkRm9yID0gRW1i
ZXIuZ3VpZEZvciwgaXNOb25lID0gRW1iZXIuaXNOb25lLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10
OwotCi0vKioKLSAgQW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KLQotICBBIFNl
dCB3b3JrcyBhIGJpdCBsaWtlIGFuIGFycmF5IGV4Y2VwdCB0aGF0IGl0cyBpdGVtcyBhcmUgbm90
IG9yZGVyZWQuIFlvdQotICBjYW4gY3JlYXRlIGEgc2V0IHRvIGVmZmljaWVudGx5IHRlc3QgZm9y
IG1lbWJlcnNoaXAgZm9yIGFuIG9iamVjdC4gWW91IGNhbgotICBhbHNvIGl0ZXJhdGUgdGhyb3Vn
aCBhIHNldCBqdXN0IGxpa2UgYW4gYXJyYXksIGV2ZW4gYWNjZXNzaW5nIG9iamVjdHMgYnkKLSAg
aW5kZXgsIGhvd2V2ZXIgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGFzIHRvIHRoZWlyIG9yZGVyLgot
Ci0gIEFsbCBTZXRzIGFyZSBvYnNlcnZhYmxlIHZpYSB0aGUgRW51bWVyYWJsZSBPYnNlcnZlciBB
UEkgLSB3aGljaCB3b3JrcwotICBvbiBhbnkgZW51bWVyYWJsZSBvYmplY3QgaW5jbHVkaW5nIGJv
dGggU2V0cyBhbmQgQXJyYXlzLgotCi0gICMjIENyZWF0aW5nIGEgU2V0Ci0KLSAgWW91IGNhbiBj
cmVhdGUgYSBzZXQgbGlrZSB5b3Ugd291bGQgbW9zdCBvYmplY3RzIHVzaW5nCi0gIGBuZXcgRW1i
ZXIuU2V0KClgLiBNb3N0IG5ldyBzZXRzIHlvdSBjcmVhdGUgd2lsbCBiZSBlbXB0eSwgYnV0IHlv
dSBjYW4KLSAgYWxzbyBpbml0aWFsaXplIHRoZSBzZXQgd2l0aCBzb21lIGNvbnRlbnQgYnkgcGFz
c2luZyBhbiBhcnJheSBvciBvdGhlcgotICBlbnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gdGhlIGNv
bnN0cnVjdG9yLgotCi0gIEZpbmFsbHksIHlvdSBjYW4gcGFzcyBpbiBhbiBleGlzdGluZyBzZXQg
YW5kIHRoZSBzZXQgd2lsbCBiZSBjb3BpZWQuIFlvdQotICBjYW4gYWxzbyBjcmVhdGUgYSBjb3B5
IG9mIGEgc2V0IGJ5IGNhbGxpbmcgYEVtYmVyLlNldCNjb3B5KClgLgotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgLy8gY3JlYXRlcyBhIG5ldyBlbXB0eSBzZXQKLSAgdmFyIGZvdW5kTmFtZXMgPSBuZXcg
RW1iZXIuU2V0KCk7Ci0KLSAgLy8gY3JlYXRlcyBhIHNldCB3aXRoIGZvdXIgbmFtZXMgaW4gaXQu
Ci0gIHZhciBuYW1lcyA9IG5ldyBFbWJlci5TZXQoWyJDaGFybGVzIiwgIlRvbSIsICJKdWFuIiwg
IkFsZXgiXSk7IC8vIDpQCi0KLSAgLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhlIG5hbWVzIHNldC4K
LSAgdmFyIG5hbWVzQ29weSA9IG5ldyBFbWJlci5TZXQobmFtZXMpOwotCi0gIC8vIHNhbWUgYXMg
YWJvdmUuCi0gIHZhciBhbm90aGVyTmFtZXNDb3B5ID0gbmFtZXMuY29weSgpOwotICBgYGAKLQot
ICAjIyBBZGRpbmcvUmVtb3ZpbmcgT2JqZWN0cwotCi0gIFlvdSBnZW5lcmFsbHkgYWRkIG9yIHJl
bW92ZSBvYmplY3RzIGZyb20gYSBzZXQgdXNpbmcgYGFkZCgpYCBvcgotICBgcmVtb3ZlKClgLiBZ
b3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBvYmplY3QgaW5jbHVkaW5nIHByaW1pdGl2ZXMgc3VjaCBh
cwotICBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuCi0KLSAgVW5saWtlIGFycmF5cywg
b2JqZWN0cyBjYW4gb25seSBleGlzdCBvbmUgdGltZSBpbiBhIHNldC4gSWYgeW91IGNhbGwgYGFk
ZCgpYAotICBvbiBhIHNldCB3aXRoIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhl
IG9iamVjdCB3aWxsIG9ubHkgYmUgYWRkZWQKLSAgb25jZS4gTGlrZXdpc2UsIGNhbGxpbmcgYHJl
bW92ZSgpYCB3aXRoIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcyB3aWxsCi0gIHJlbW92
ZSB0aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGFuZCBoYXZlIG5vIGVmZmVjdCBvbiBmdXR1cmUg
Y2FsbHMgdW50aWwKLSAgeW91IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBzZXQgYWdhaW4uCi0KLSAg
Tk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3ZlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhIHNl
dC4gQW55IGF0dGVtcHQgdG8gZG8KLSAgc28gd2lsbCBiZSBpZ25vcmVkLgotCi0gIEluIGFkZGl0
aW9uIHRvIGFkZC9yZW1vdmUgeW91IGNhbiBhbHNvIGNhbGwgYHB1c2goKWAvYHBvcCgpYC4gUHVz
aCBiZWhhdmVzCi0gIGp1c3QgbGlrZSBgYWRkKClgIGJ1dCBgcG9wKClgLCB1bmxpa2UgYHJlbW92
ZSgpYCB3aWxsIHBpY2sgYW4gYXJiaXRyYXJ5Ci0gIG9iamVjdCwgcmVtb3ZlIGl0IGFuZCByZXR1
cm4gaXQuIFRoaXMgaXMgYSBnb29kIHdheSB0byB1c2UgYSBzZXQgYXMgYSBqb2IKLSAgcXVldWUg
d2hlbiB5b3UgZG9uJ3QgY2FyZSB3aGljaCBvcmRlciB0aGUgam9icyBhcmUgZXhlY3V0ZWQgaW4u
Ci0KLSAgIyMgVGVzdGluZyBmb3IgYW4gT2JqZWN0Ci0KLSAgVG8gdGVzdCBmb3IgYW4gb2JqZWN0
J3MgcHJlc2VuY2UgaW4gYSBzZXQgeW91IHNpbXBseSBjYWxsCi0gIGBFbWJlci5TZXQjY29udGFp
bnMoKWAuCi0KLSAgIyMgT2JzZXJ2aW5nIGNoYW5nZXMKLQotICBXaGVuIHVzaW5nIGBFbWJlci5T
ZXRgLCB5b3UgY2FuIG9ic2VydmUgdGhlIGAiW10iYCBwcm9wZXJ0eSB0byBiZQotICBhbGVydGVk
IHdoZW5ldmVyIHRoZSBjb250ZW50IGNoYW5nZXMuIFlvdSBjYW4gYWxzbyBhZGQgYW4gZW51bWVy
YWJsZQotICBvYnNlcnZlciB0byB0aGUgc2V0IHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpZmljIG9i
amVjdHMgdGhhdCBhcmUgYWRkZWQgYW5kCi0gIHJlbW92ZWQgZnJvbSB0aGUgc2V0LiBTZWUgW0Vt
YmVyLkVudW1lcmFibGVdKC9hcGkvY2xhc3Nlcy9FbWJlci5FbnVtZXJhYmxlLmh0bWwpCi0gIGZv
ciBtb3JlIGluZm9ybWF0aW9uIG9uIGVudW1lcmFibGVzLgotCi0gIFRoaXMgaXMgb2Z0ZW4gdW5o
ZWxwZnVsLiBJZiB5b3UgYXJlIGZpbHRlcmluZyBzZXRzIG9mIG9iamVjdHMsIGZvciBpbnN0YW5j
ZSwKLSAgaXQgaXMgdmVyeSBpbmVmZmljaWVudCB0byByZS1maWx0ZXIgYWxsIG9mIHRoZSBpdGVt
cyBlYWNoIHRpbWUgdGhlIHNldAotICBjaGFuZ2VzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91
IGNvdWxkIGp1c3QgYWRqdXN0IHRoZSBmaWx0ZXJlZCBzZXQgYmFzZWQKLSAgb24gd2hhdCB3YXMg
Y2hhbmdlZCBvbiB0aGUgb3JpZ2luYWwgc2V0LiBUaGUgc2FtZSBpc3N1ZSBhcHBsaWVzIHRvIG1l
cmdpbmcKLSAgc2V0cywgYXMgd2VsbC4KLQotICAjIyBPdGhlciBNZXRob2RzCi0KLSAgYEVtYmVy
LlNldGAgcHJpbWFyeSBpbXBsZW1lbnRzIG90aGVyIG1peGluIEFQSXMuIEZvciBhIGNvbXBsZXRl
IHJlZmVyZW5jZQotICBvbiB0aGUgbWV0aG9kcyB5b3Ugd2lsbCB1c2Ugd2l0aCBgRW1iZXIuU2V0
YCwgcGxlYXNlIGNvbnN1bHQgdGhlc2UgbWl4aW5zLgotICBUaGUgbW9zdCB1c2VmdWwgb25lcyB3
aWxsIGJlIGBFbWJlci5FbnVtZXJhYmxlYCBhbmQKLSAgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxl
YCB3aGljaCBpbXBsZW1lbnQgbW9zdCBvZiB0aGUgY29tbW9uIGl0ZXJhdG9yCi0gIG1ldGhvZHMg
eW91IGFyZSB1c2VkIHRvIG9uIEFycmF5LgotCi0gIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNl
IHRoZSBgRW1iZXIuQ29weWFibGVgIGFuZCBgRW1iZXIuRnJlZXphYmxlYAotICBBUElzIG9uIGBF
bWJlci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBzZXQgaXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIg
YmUKLSAgbW9kaWZpZWQuIFRoZSBiZW5lZml0IG9mIHRoaXMgaXMgdGhhdCB3aGVuIHlvdSBjYWxs
IGBmcm96ZW5Db3B5KClgIG9uIGl0LAotICBFbWJlciB3aWxsIGF2b2lkIG1ha2luZyBjb3BpZXMg
b2YgdGhlIHNldC4gVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlCi0gIGNvZGUgdGhhdCBjYW4ga25v
dyB3aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1bmRlcmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKLSAg
d2lsbCBub3QgYmUgbW9kaWZpZWQuCi0KLSAgQGNsYXNzIFNldAotICBAbmFtZXNwYWNlIEVtYmVy
Ci0gIEBleHRlbmRzIEVtYmVyLkNvcmVPYmplY3QKLSAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1l
cmFibGUKLSAgQHVzZXMgRW1iZXIuQ29weWFibGUKLSAgQHVzZXMgRW1iZXIuRnJlZXphYmxlCi0g
IEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5TZXQgPSBFbWJlci5Db3JlT2JqZWN0LmV4dGVu
ZChFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwgRW1iZXIuQ29weWFibGUsIEVtYmVyLkZyZWV6YWJs
ZSwKLSAgewotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gSU1QTEVNRU5UIEVOVU1FUkFCTEUgQVBJUwotICAvLwot
Ci0gIC8qKgotICAgIFRoaXMgcHJvcGVydHkgd2lsbCBjaGFuZ2UgYXMgdGhlIG51bWJlciBvZiBv
YmplY3RzIGluIHRoZSBzZXQgY2hhbmdlcy4KLQotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBA
dHlwZSBudW1iZXIKLSAgICBAZGVmYXVsdCAwCi0gICovCi0gIGxlbmd0aDogMCwKLQotICAvKioK
LSAgICBDbGVhcnMgdGhlIHNldC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmV1c2Ug
YW4gZXhpc3Rpbmcgc2V0Ci0gICAgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAi
Z3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xvcnMubGVuZ3RoOyAgLy8gMwotICAgIGNvbG9ycy5j
bGVhcigpOwotICAgIGNvbG9ycy5sZW5ndGg7ICAvLyAwCi0gICAgYGBgCi0KLSAgICBAbWV0aG9k
IGNsZWFyCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBBbiBlbXB0eSBTZXQKLSAgKi8KLSAgY2xl
YXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRnJvemVuKSB7IHRocm93IG5ldyBFbWJl
ci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1IpOyB9Ci0KLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMs
ICdsZW5ndGgnKTsKLSAgICBpZiAobGVuID09PSAwKSB7IHJldHVybiB0aGlzOyB9Ci0KLSAgICB2
YXIgZ3VpZDsKLQotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlKGxlbiwgMCk7
Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOwotICAg
IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOwotCi0gICAgZm9y
ICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGd1aWQgPSBndWlkRm9yKHRoaXNbaV0p
OwotICAgICAgZGVsZXRlIHRoaXNbZ3VpZF07Ci0gICAgICBkZWxldGUgdGhpc1tpXTsKLSAgICB9
Ci0KLSAgICBzZXQodGhpcywgJ2xlbmd0aCcsIDApOwotCi0gICAgRW1iZXIucHJvcGVydHlEaWRD
aGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo
dGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdl
KGxlbiwgMCk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5z
IHRydWUgaWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYWxzbyBhbiBlbnVtZXJhYmxlIHRoYXQgY29u
dGFpbnMgdGhlCi0gICAgc2FtZSBvYmplY3RzIGFzIHRoZSByZWNlaXZlci4KLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdLAotICAg
ICAgICBzYW1lX2NvbG9ycyA9IG5ldyBFbWJlci5TZXQoY29sb3JzKTsKLQotICAgIHNhbWVfY29s
b3JzLmlzRXF1YWwoY29sb3JzKTsgICAgICAgICAgICAgICAvLyB0cnVlCi0gICAgc2FtZV9jb2xv
cnMuaXNFcXVhbChbInB1cnBsZSIsICJicm93biJdKTsgIC8vIGZhbHNlCi0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIGlzRXF1YWwKLSAgICBAcGFyYW0ge0VtYmVyLlNldH0gb2JqIHRoZSBvdGhlciBv
YmplY3QuCi0gICAgQHJldHVybiB7Qm9vbGVhbn0KLSAgKi8KLSAgaXNFcXVhbDogZnVuY3Rpb24o
b2JqKSB7Ci0gICAgLy8gZmFpbCBmYXN0Ci0gICAgaWYgKCFFbWJlci5FbnVtZXJhYmxlLmRldGVj
dChvYmopKSByZXR1cm4gZmFsc2U7Ci0KLSAgICB2YXIgbG9jID0gZ2V0KHRoaXMsICdsZW5ndGgn
KTsKLSAgICBpZiAoZ2V0KG9iaiwgJ2xlbmd0aCcpICE9PSBsb2MpIHJldHVybiBmYWxzZTsKLQot
ICAgIHdoaWxlKC0tbG9jID49IDApIHsKLSAgICAgIGlmICghb2JqLmNvbnRhaW5zKHRoaXNbbG9j
XSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQotICAv
KioKLSAgICBBZGRzIGFuIG9iamVjdCB0byB0aGUgc2V0LiBPbmx5IG5vbi1gbnVsbGAgb2JqZWN0
cyBjYW4gYmUgYWRkZWQgdG8gYSBzZXQKLSAgICBhbmQgdGhvc2UgY2FuIG9ubHkgYmUgYWRkZWQg
b25jZS4gSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBzZXQgb3IKLSAgICB0aGUgcGFz
c2VkIHZhbHVlIGlzIG51bGwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQotICAg
IFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3Qo
KWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQo
KTsKLSAgICBjb2xvcnMuYWRkKCJibHVlIik7ICAgICAvLyBbImJsdWUiXQotICAgIGNvbG9ycy5h
ZGQoImJsdWUiKTsgICAgIC8vIFsiYmx1ZSJdCi0gICAgY29sb3JzLmFkZCgicmVkIik7ICAgICAg
Ly8gWyJibHVlIiwgInJlZCJdCi0gICAgY29sb3JzLmFkZChudWxsKTsgICAgICAgLy8gWyJibHVl
IiwgInJlZCJdCi0gICAgY29sb3JzLmFkZCh1bmRlZmluZWQpOyAgLy8gWyJibHVlIiwgInJlZCJd
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFkZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl
IG9iamVjdCB0byBhZGQuCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4K
LSAgKi8KLSAgYWRkOiBFbWJlci5hbGlhc01ldGhvZCgnYWRkT2JqZWN0JyksCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlcyB0aGUgb2JqZWN0IGZyb20gdGhlIHNldCBpZiBpdCBpcyBmb3VuZC4gSWYgeW91
IHBhc3MgYSBgbnVsbGAgdmFsdWUKLSAgICBvciBhbiBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG5v
dCBpbiB0aGUgc2V0LCB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8KLSAgICBlZmZlY3QuIFRoaXMg
aXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5yZW1vdmVPYmplY3QoKWAu
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJy
ZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xvcnMucmVtb3ZlKCJyZWQiKTsgICAgIC8v
IFsiYmx1ZSIsICJncmVlbiJdCi0gICAgY29sb3JzLnJlbW92ZSgicHVycGxlIik7ICAvLyBbImJs
dWUiLCAiZ3JlZW4iXQotICAgIGNvbG9ycy5yZW1vdmUobnVsbCk7ICAgICAgLy8gWyJibHVlIiwg
ImdyZWVuIl0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJlbW92ZQotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhl
IHNldCBpdHNlbGYuCi0gICovCi0gIHJlbW92ZTogRW1iZXIuYWxpYXNNZXRob2QoJ3JlbW92ZU9i
amVjdCcpLAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBz
ZXQgYW5kIHJldHVybnMgaXQsIG9yIGBudWxsYCBpZiBpdCdzIGVtcHR5LgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBuZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJd
KTsKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAiYmx1ZSIKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAi
Z3JlZW4iCi0gICAgY29sb3JzLnBvcCgpOyAgLy8gbnVsbAotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBwb3AKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZW1vdmVkIG9iamVjdCBmcm9tIHRoZSBz
ZXQgb3IgbnVsbC4KLSAgKi8KLSAgcG9wOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMs
ICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsK
LSAgICB2YXIgb2JqID0gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51
bGw7Ci0gICAgdGhpcy5yZW1vdmUob2JqKTsKLSAgICByZXR1cm4gb2JqOwotICB9LAotCi0gIC8q
KgotICAgIEluc2VydHMgdGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQu
IEl0IHJldHVybnMKLSAgICB0aGUgc2V0IGl0c2VsZi4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMg
Zm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMucHVz
aCgicmVkIik7ICAgLy8gWyJyZWQiXQotICAgIGNvbG9ycy5wdXNoKCJncmVlbiIpOyAvLyBbInJl
ZCIsICJncmVlbiJdCi0gICAgY29sb3JzLnB1c2goImJsdWUiKTsgIC8vIFsicmVkIiwgImdyZWVu
IiwgImJsdWUiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBwdXNoCi0gICAgQHJldHVybiB7RW1i
ZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KLSAgKi8KLSAgcHVzaDogRW1iZXIuYWxpYXNNZXRob2Qo
J2FkZE9iamVjdCcpLAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9t
IHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9yIGBudWxsYCBpZiBpdCdzIGVtcHR5LgotCi0gICAg
VGhpcyBpcyBhbiBhbGlhcyBmb3IgYEVtYmVyLlNldC5wb3AoKWAuCi0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJncmVlbiIsICJibHVlIl0pOwot
ICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gImJsdWUiCi0gICAgY29sb3JzLnNoaWZ0KCk7ICAvLyAi
Z3JlZW4iCi0gICAgY29sb3JzLnNoaWZ0KCk7ICAvLyBudWxsCi0gICAgYGBgCi0KLSAgICBAbWV0
aG9kIHNoaWZ0Ci0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3QgZnJvbSB0
aGUgc2V0IG9yIG51bGwuCi0gICovCi0gIHNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncG9wJyks
Ci0KLSAgLyoqCi0gICAgSW5zZXJ0cyB0aGUgZ2l2ZW4gb2JqZWN0IG9uIHRvIHRoZSBlbmQgb2Yg
dGhlIHNldC4gSXQgcmV0dXJucwotICAgIHRoZSBzZXQgaXRzZWxmLgotCi0gICAgVGhpcyBpcyBh
biBhbGlhcyBvZiBgRW1iZXIuU2V0LnB1c2goKWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldCgpOwotICAgIGNvbG9ycy51bnNoaWZ0KCJyZWQiKTsg
ICAgLy8gWyJyZWQiXQotICAgIGNvbG9ycy51bnNoaWZ0KCJncmVlbiIpOyAgLy8gWyJyZWQiLCAi
Z3JlZW4iXQotICAgIGNvbG9ycy51bnNoaWZ0KCJibHVlIik7ICAgLy8gWyJyZWQiLCAiZ3JlZW4i
LCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVuc2hpZnQKLSAgICBAcmV0dXJuIHtF
bWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgotICAqLwotICB1bnNoaWZ0OiBFbWJlci5hbGlhc01l
dGhvZCgncHVzaCcpLAotCi0gIC8qKgotICAgIEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3Nl
ZCBlbnVtZXJhYmxlIHRvIHRoZSBzZXQuCi0KLSAgICBUaGlzIGlzIGFuIGFsaWFzIG9mIGBFbWJl
ci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3RzKClgCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMuYWRkRWFjaChbInJl
ZCIsICJncmVlbiIsICJibHVlIl0pOyAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCi0gICAg
YGBgCi0KLSAgICBAbWV0aG9kIGFkZEVhY2gKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9
IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhl
IHNldCBpdHNlbGYuCi0gICovCi0gIGFkZEVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmpl
Y3RzJyksCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVu
dW1lcmFibGUgdG8gdGhlIHNldC4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11
dGFibGVFbnVtZXJhYmxlLnJlbW92ZU9iamVjdHMoKWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOwot
ICAgIGNvbG9ycy5yZW1vdmVFYWNoKFsicmVkIiwgImJsdWUiXSk7ICAvLyAgWyJncmVlbiJdCi0g
ICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbW92ZUVhY2gKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1l
cmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gcmVtb3ZlLgotICAgIEByZXR1cm4ge0VtYmVy
LlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICovCi0gIHJlbW92ZUVhY2g6IEVtYmVyLmFsaWFzTWV0
aG9kKCdyZW1vdmVPYmplY3RzJyksCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBQUklWQVRFIEVOVU1FUkFCTEUg
U1VQUE9SVAotICAvLwotCi0gIGluaXQ6IGZ1bmN0aW9uKGl0ZW1zKSB7Ci0gICAgdGhpcy5fc3Vw
ZXIoKTsKLSAgICBpZiAoaXRlbXMpIHRoaXMuYWRkT2JqZWN0cyhpdGVtcyk7Ci0gIH0sCi0KLSAg
Ly8gaW1wbGVtZW50IEVtYmVyLkVudW1lcmFibGUKLSAgbmV4dE9iamVjdDogZnVuY3Rpb24oaWR4
KSB7Ci0gICAgcmV0dXJuIHRoaXNbaWR4XTsKLSAgfSwKLQotICAvLyBtb3JlIG9wdGltaXplZCB2
ZXJzaW9uCi0gIGZpcnN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICBy
ZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhpc1swXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0KLSAg
Ly8gbW9yZSBvcHRpbWl6ZWQgdmVyc2lvbgotICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0
aC0xXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0KLSAgLy8gaW1wbGVtZW50cyBFbWJlci5NdXRhYmxl
RW51bWVyYWJsZQotICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIGlmIChnZXQodGhp
cywgJ2lzRnJvemVuJykpIHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1Ip
OwotICAgIGlmIChpc05vbmUob2JqKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQot
ICAgIHZhciBndWlkID0gZ3VpZEZvcihvYmopLAotICAgICAgICBpZHggID0gdGhpc1tndWlkXSwK
LSAgICAgICAgbGVuICA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGFkZGVkIDsKLQot
ICAgIGlmIChpZHg+PTAgJiYgaWR4PGxlbiAmJiAodGhpc1tpZHhdID09PSBvYmopKSByZXR1cm4g
dGhpczsgLy8gYWRkZWQKLQotICAgIGFkZGVkID0gW29ial07Ci0KLSAgICB0aGlzLmVudW1lcmFi
bGVDb250ZW50V2lsbENoYW5nZShudWxsLCBhZGRlZCk7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxs
Q2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0KLSAgICBsZW4gPSBnZXQodGhpcywgJ2xlbmd0
aCcpOwotICAgIHRoaXNbZ3VpZF0gPSBsZW47Ci0gICAgdGhpc1tsZW5dID0gb2JqOwotICAgIHNl
dCh0aGlzLCAnbGVuZ3RoJywgbGVuKzEpOwotCi0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo
dGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdl
KG51bGwsIGFkZGVkKTsKLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8vIGltcGxlbWVu
dHMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAgcmVtb3ZlT2JqZWN0OiBmdW5jdGlvbihvYmop
IHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRW1iZXIuRXJyb3Io
RW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICBpZiAoaXNOb25lKG9iaikpIHJldHVybiB0aGlzOyAv
LyBub3RoaW5nIHRvIGRvCi0KLSAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAgICAgICAg
aWR4ICA9IHRoaXNbZ3VpZF0sCi0gICAgICAgIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0g
ICAgICAgIGlzRmlyc3QgPSBpZHggPT09IDAsCi0gICAgICAgIGlzTGFzdCA9IGlkeCA9PT0gbGVu
LTEsCi0gICAgICAgIGxhc3QsIHJlbW92ZWQ7Ci0KLQotICAgIGlmIChpZHg+PTAgJiYgaWR4PGxl
biAmJiAodGhpc1tpZHhdID09PSBvYmopKSB7Ci0gICAgICByZW1vdmVkID0gW29ial07Ci0KLSAg
ICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdlKHJlbW92ZWQsIG51bGwpOwotICAg
ICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdmaXJzdE9i
amVjdCcpOyB9Ci0gICAgICBpZiAoaXNMYXN0KSAgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uo
dGhpcywgJ2xhc3RPYmplY3QnKTsgfQotCi0gICAgICAvLyBzd2FwIGl0ZW1zIC0gYmFzaWNhbGx5
IG1vdmUgdGhlIGl0ZW0gdG8gdGhlIGVuZCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAotICAgICAgaWYg
KGlkeCA8IGxlbi0xKSB7Ci0gICAgICAgIGxhc3QgPSB0aGlzW2xlbi0xXTsKLSAgICAgICAgdGhp
c1tpZHhdID0gbGFzdDsKLSAgICAgICAgdGhpc1tndWlkRm9yKGxhc3QpXSA9IGlkeDsKLSAgICAg
IH0KLQotICAgICAgZGVsZXRlIHRoaXNbZ3VpZF07Ci0gICAgICBkZWxldGUgdGhpc1tsZW4tMV07
Ci0gICAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGxlbi0xKTsKLQotICAgICAgaWYgKGlzRmlyc3Qp
IHsgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7IH0KLSAgICAg
IGlmIChpc0xhc3QpICB7IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0
Jyk7IH0KLSAgICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlZCwgbnVs
bCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLy8gb3B0aW1pemVkIHZl
cnNpb24KLSAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0aGlzW2d1aWRG
b3Iob2JqKV0+PTA7Ci0gIH0sCi0KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0
aGlzLmNvbnN0cnVjdG9yLCByZXQgPSBuZXcgQygpLCBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcp
OwotICAgIHNldChyZXQsICdsZW5ndGgnLCBsb2MpOwotICAgIHdoaWxlKC0tbG9jPj0wKSB7Ci0g
ICAgICByZXRbbG9jXSA9IHRoaXNbbG9jXTsKLSAgICAgIHJldFtndWlkRm9yKHRoaXNbbG9jXSld
ID0gbG9jOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGgsIGlkeCwgYXJyYXkgPSBbXTsKLSAg
ICBmb3IoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewotICAgICAgYXJyYXlbaWR4XSA9IHRo
aXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJuIGZtdCgiRW1iZXIuU2V0PCVAPiIsIFthcnJheS5q
b2luKCcsJyldKTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZh
ciBEZWZlcnJlZE1peGluID0gRW1iZXIuRGVmZXJyZWRNaXhpbiwgLy8gbWl4aW5zL2RlZmVycmVk
Ci0gICAgZ2V0ID0gRW1iZXIuZ2V0OwotCi12YXIgRGVmZXJyZWQgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKERlZmVycmVkTWl4aW4pOwotCi1EZWZlcnJlZC5yZW9wZW5DbGFzcyh7Ci0gIHByb21pc2U6
IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgdmFyIGRlZmVycmVkID0gRGVmZXJy
ZWQuY3JlYXRlKCk7Ci0gICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBkZWZlcnJlZCk7Ci0gICAg
cmV0dXJuIGRlZmVycmVkOwotICB9Ci19KTsKLQotRW1iZXIuRGVmZXJyZWQgPSBEZWZlcnJlZDsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBmb3JFYWNoID0gRW1iZXIuQXJyYXlQ
b2x5ZmlsbHMuZm9yRWFjaDsKLQotLyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCi0qLwotCi12YXIgbG9hZEhvb2tzID0gRW1iZXIuRU5WLkVNQkVSX0xPQURf
SE9PS1MgfHwge307Ci12YXIgbG9hZGVkID0ge307Ci0KLS8qKgotICBEZXRlY3RzIHdoZW4gYSBz
cGVjaWZpYyBwYWNrYWdlIG9mIEVtYmVyIChlLmcuICdFbWJlci5IYW5kbGViYXJzJykKLSAgaGFz
IGZ1bGx5IGxvYWRlZCBhbmQgaXMgYXZhaWxhYmxlIGZvciBleHRlbnNpb24uCi0KLSAgVGhlIHBy
b3ZpZGVkIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5hbWVgIHBhc3NlZAot
ICByZXNvbHZlZCBmcm9tIGEgc3RyaW5nIGludG8gdGhlIG9iamVjdDoKLQotICBgYGAgamF2YXNj
cmlwdAotICBFbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnIGZ1bmN0aW9uKGhiYXJzKXsK
LSAgICBoYmFycy5yZWdpc3RlckhlbHBlciguLi4pOwotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhv
ZCBvbkxvYWQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1lIG9mIGhv
b2sKLSAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0gY2FsbGJhY2sgdG8gYmUgY2FsbGVkCi0q
LwotRW1iZXIub25Mb2FkID0gZnVuY3Rpb24obmFtZSwgY2FsbGJhY2spIHsKLSAgdmFyIG9iamVj
dDsKLQotICBsb2FkSG9va3NbbmFtZV0gPSBsb2FkSG9va3NbbmFtZV0gfHwgRW1iZXIuQSgpOwot
ICBsb2FkSG9va3NbbmFtZV0ucHVzaE9iamVjdChjYWxsYmFjayk7Ci0KLSAgaWYgKG9iamVjdCA9
IGxvYWRlZFtuYW1lXSkgewotICAgIGNhbGxiYWNrKG9iamVjdCk7Ci0gIH0KLX07Ci0KLS8qKgot
ICBDYWxsZWQgd2hlbiBhbiBFbWJlci5qcyBwYWNrYWdlIChlLmcgRW1iZXIuSGFuZGxlYmFycykg
aGFzIGZpbmlzaGVkCi0gIGxvYWRpbmcuIFRyaWdnZXJzIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJl
ZCBmb3IgdGhpcyBldmVudC4KLQotICBAbWV0aG9kIHJ1bkxvYWRIb29rcwotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5hbWUgb2YgaG9vawotICBAcGFyYW0gb2JqZWN0IHtP
YmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNhbGxiYWNrcwotKi8KLUVtYmVyLnJ1bkxvYWRIb29r
cyA9IGZ1bmN0aW9uKG5hbWUsIG9iamVjdCkgewotICBsb2FkZWRbbmFtZV0gPSBvYmplY3Q7Ci0K
LSAgaWYgKGxvYWRIb29rc1tuYW1lXSkgewotICAgIGZvckVhY2guY2FsbChsb2FkSG9va3NbbmFt
ZV0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgICBjYWxsYmFjayhvYmplY3QpOwotICAgIH0p
OwotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVtYmVyLmdldDsKLQotLyoqCi1AbW9kdWxlIGVtYmVy
Ci1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLS8qKgotICBgRW1iZXIuQ29udHJvbGxl
ck1peGluYCBwcm92aWRlcyBhIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgYWxsIGNsYXNzZXMgdGhh
dAotICBjb21wb3NlIEVtYmVyJ3MgY29udHJvbGxlciBsYXllcjogYEVtYmVyLkNvbnRyb2xsZXJg
LAotICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwgYW5kIGBFbWJlci5PYmplY3RDb250cm9sbGVy
YC4KLQotICBAY2xhc3MgQ29udHJvbGxlck1peGluCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHVz
ZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgotKi8KLUVtYmVyLkNvbnRyb2xsZXJNaXhpbiA9IEVtYmVy
Lk1peGluLmNyZWF0ZShFbWJlci5BY3Rpb25IYW5kbGVyLCB7Ci0gIC8qIGR1Y2t0eXBlIGFzIGEg
Y29udHJvbGxlciAqLwotICBpc0NvbnRyb2xsZXI6IHRydWUsCi0KLSAgLyoqCi0gICAgVGhlIG9i
amVjdCB0byB3aGljaCBhY3Rpb25zIGZyb20gdGhlIHZpZXcgc2hvdWxkIGJlIHNlbnQuCi0KLSAg
ICBGb3IgZXhhbXBsZSwgd2hlbiBhIEhhbmRsZWJhcnMgdGVtcGxhdGUgdXNlcyB0aGUgYHt7YWN0
aW9ufX1gIGhlbHBlciwKLSAgICBpdCB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUgYWN0aW9uIHRv
IHRoZSB2aWV3J3MgY29udHJvbGxlcidzIGB0YXJnZXRgLgotCi0gICAgQnkgZGVmYXVsdCwgYSBj
b250cm9sbGVyJ3MgYHRhcmdldGAgaXMgc2V0IHRvIHRoZSByb3V0ZXIgYWZ0ZXIgaXQgaXMKLSAg
ICBpbnN0YW50aWF0ZWQgYnkgYEVtYmVyLkFwcGxpY2F0aW9uI2luaXRpYWxpemVgLgotCi0gICAg
QHByb3BlcnR5IHRhcmdldAotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgdGFyZ2V0OiBudWxs
LAotCi0gIGNvbnRhaW5lcjogbnVsbCwKLQotICBwYXJlbnRDb250cm9sbGVyOiBudWxsLAotCi0g
IHN0b3JlOiBudWxsLAotCi0gIG1vZGVsOiBFbWJlci5jb21wdXRlZC5hbGlhcygnY29udGVudCcp
LAotCi0gIGRlcHJlY2F0ZWRTZW5kSGFuZGxlczogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAg
IHJldHVybiAhIXRoaXNbYWN0aW9uTmFtZV07Ci0gIH0sCi0KLSAgZGVwcmVjYXRlZFNlbmQ6IGZ1
bmN0aW9uKGFjdGlvbk5hbWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1l
bnRzLCAxKTsKLSAgICBFbWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAi
ICsgYWN0aW9uTmFtZSArICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0aW9uIiwgdHlwZW9mIHRoaXNb
YWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicpOwotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQWN0aW9u
IGhhbmRsZXJzIGltcGxlbWVudGVkIGRpcmVjdGx5IG9uIGNvbnRyb2xsZXJzIGFyZSBkZXByZWNh
dGVkIGluIGZhdm9yIG9mIGFjdGlvbiBoYW5kbGVycyBvbiBhbiBgYWN0aW9uc2Agb2JqZWN0ICgn
ICsgYWN0aW9uTmFtZSArICcgb24gJyArIHRoaXMgKyAnKScsIGZhbHNlKTsKLSAgICB0aGlzW2Fj
dGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpOwotICAgIHJldHVybjsKLSAgfQotfSk7Ci0KLS8q
KgotICBAY2xhc3MgQ29udHJvbGxlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVt
YmVyLk9iamVjdAotICBAdXNlcyBFbWJlci5Db250cm9sbGVyTWl4aW4KLSovCi1FbWJlci5Db250
cm9sbGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4pOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwotCi0vKioKLSAgYEVt
YmVyLlNvcnRhYmxlTWl4aW5gIHByb3ZpZGVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhcnJh
eSBwcm94aWVzCi0gIHRvIHNwZWNpZnkgYSBzb3J0IG9yZGVyIGFuZCBtYWludGFpbiB0aGlzIHNv
cnRpbmcgd2hlbiBvYmplY3RzIGFyZSBhZGRlZCwKLSAgcmVtb3ZlZCwgb3IgdXBkYXRlZCB3aXRo
b3V0IGNoYW5naW5nIHRoZSBpbXBsaWNpdCBvcmRlciBvZiB0aGVpciB1bmRlcmx5aW5nCi0gIGNv
bnRlbnQgYXJyYXk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBzb25ncyA9IFsKLSAgICB7dHJhY2tO
dW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGksIE9iLUxhLURhJ30sCi0gICAge3RyYWNrTnVtYmVy
OiAyLCB0aXRsZTogJ0JhY2sgaW4gdGhlIFUuUy5TLlIuJ30sCi0gICAge3RyYWNrTnVtYmVyOiAz
LCB0aXRsZTogJ0dsYXNzIE9uaW9uJ30sCi0gIF07Ci0KLSAgc29uZ3NDb250cm9sbGVyID0gRW1i
ZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSh7Ci0gICAgY29udGVudDogc29uZ3MsCi0gICAgc29y
dFByb3BlcnRpZXM6IFsndHJhY2tOdW1iZXInXSwKLSAgICBzb3J0QXNjZW5kaW5nOiB0cnVlCi0g
IH0pOwotCi0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tO
dW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUgVS5TLlMuUi4nfQotCi0gIHNvbmdzQ29udHJv
bGxlci5hZGRPYmplY3Qoe3RyYWNrTnVtYmVyOiAxLCB0aXRsZTogJ0RlYXIgUHJ1ZGVuY2UnfSk7
Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6
IDEsIHRpdGxlOiAnRGVhciBQcnVkZW5jZSd9Ci0gIGBgYAotCi0gIElmIHlvdSBhZGQgb3IgcmVt
b3ZlIHRoZSBwcm9wZXJ0aWVzIHRvIHNvcnQgYnkgb3IgY2hhbmdlIHRoZSBzb3J0IGRpcmVjdGlv
biB0aGUgY29udGVudAotICBzb3J0IG9yZGVyIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVk
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgc29uZ3NDb250cm9sbGVyLnNldCgnc29ydFByb3BlcnRp
ZXMnLCBbJ3RpdGxlJ10pOwotICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAv
LyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUgVS5TLlMuUi4nfQotCi0gIHNv
bmdzQ29udHJvbGxlci50b2dnbGVQcm9wZXJ0eSgnc29ydEFzY2VuZGluZycpOwotICBzb25nc0Nv
bnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAn
T2ItTGEtRGksIE9iLUxhLURhJ30KLSAgYGBgCi0KLSAgU29ydGFibGVNaXhpbiB3b3JrcyBieSBz
b3J0aW5nIHRoZSBhcnJhbmdlZENvbnRlbnQgYXJyYXksIHdoaWNoIGlzIHRoZSBhcnJheSB0aGF0
Ci0gIGFycmF5UHJveHkgZGlzcGxheXMuIER1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB1bmRlcmx5
aW5nICdjb250ZW50JyBhcnJheSBpcyBub3QgY2hhbmdlZCwgdGhhdAotICBhcnJheSB3aWxsIG5v
dCBkaXNwbGF5IHRoZSBzb3J0ZWQgbGlzdDoKLQotICAgYGBgamF2YXNjcmlwdAotICBzb25nc0Nv
bnRyb2xsZXIuZ2V0KCdjb250ZW50JykuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyBSZXR1cm5zIHRo
ZSB1bnNvcnRlZCBvcmlnaW5hbCBjb250ZW50Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0
T2JqZWN0Jyk7IC8vIFJldHVybnMgdGhlIHNvcnRlZCBjb250ZW50LgotICBgYGAgCi0gIAotICBB
bHRob3VnaCB0aGUgc29ydGVkIGNvbnRlbnQgY2FuIGFsc28gYmUgYWNjZXNzZWQgdGhyb3VnaCB0
aGUgYXJyYW5nZWRDb250ZW50IHByb3BlcnR5LAotICBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0
aGUgcHJveGllZCBjbGFzcyBhbmQgbm90IHRoZSBhcnJhbmdlZENvbnRlbnQgYXJyYXkgZGlyZWN0
bHkuCi0KLSAgQGNsYXNzIFNvcnRhYmxlTWl4aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNl
cyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQotKi8KLUVtYmVyLlNvcnRhYmxlTWl4aW4gPSBFbWJl
ci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJsZUVudW1lcmFibGUsIHsKLQotICAvKioKLSAgICBT
cGVjaWZpZXMgd2hpY2ggcHJvcGVydGllcyBkaWN0YXRlIHRoZSBhcnJhbmdlZENvbnRlbnQncyBz
b3J0IG9yZGVyLgotCi0gICAgV2hlbiBzcGVjaWZ5aW5nIG11bHRpcGxlIHByb3BlcnRpZXMgdGhl
IHNvcnRpbmcgd2lsbCB1c2UgcHJvcGVydGllcwotICAgIGZyb20gdGhlIGBzb3J0UHJvcGVydGll
c2AgYXJyYXkgcHJpb3JpdGl6ZWQgZnJvbSBmaXJzdCB0byBsYXN0LgotCi0gICAgQHByb3BlcnR5
IHtBcnJheX0gc29ydFByb3BlcnRpZXMKLSAgKi8KLSAgc29ydFByb3BlcnRpZXM6IG51bGwsCi0K
LSAgLyoqCi0gICAgU3BlY2lmaWVzIHRoZSBhcnJhbmdlZENvbnRlbnQncyBzb3J0IGRpcmVjdGlv
bgotCi0gICAgQHByb3BlcnR5IHtCb29sZWFufSBzb3J0QXNjZW5kaW5nCi0gICovCi0gIHNvcnRB
c2NlbmRpbmc6IHRydWUsCi0KLSAgLyoqCi0gICAgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFy
ZSB0d28gdmFsdWVzLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgaWYgeW91Ci0gICAgd2FudCB0byBk
byBjdXN0b20gY29tcGFyaXNvbnMuIEZ1bmN0aW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIGV4cGVj
dGVkIGJ5Ci0gICAgQXJyYXkjc29ydCwgaS5lLgotICAgICAgcmV0dXJuIDAgaWYgdGhlIHR3byBw
YXJhbWV0ZXJzIGFyZSBlcXVhbCwKLSAgICAgIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRo
ZSBmaXJzdCBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZSBzZWNvbmQgb3IKLSAgICAgIHJl
dHVybiBhIHBvc2l0aXZlIHZhbHVlIG90aGVyd2lzZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBmdW5jdGlvbih4LHkpIHsgLy8gVGhlc2UgYXJlIGFzc3VtZWQgdG8gYmUgaW50ZWdlcnMKLSAg
ICAgIGlmICh4ID09PSB5KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIHJldHVybiB4IDwgeSA/
IC0xIDogMTsKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgc29ydEZ1bmN0aW9uCi0g
ICAgQHR5cGUge0Z1bmN0aW9ufQotICAgIEBkZWZhdWx0IEVtYmVyLmNvbXBhcmUKLSAgKi8KLSAg
c29ydEZ1bmN0aW9uOiBFbWJlci5jb21wYXJlLAotCi0gIG9yZGVyQnk6IGZ1bmN0aW9uKGl0ZW0x
LCBpdGVtMikgewotICAgIHZhciByZXN1bHQgPSAwLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9
IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMnKSwKLSAgICAgICAgc29ydEFzY2VuZGluZyA9IGdl
dCh0aGlzLCAnc29ydEFzY2VuZGluZycpLAotICAgICAgICBzb3J0RnVuY3Rpb24gPSBnZXQodGhp
cywgJ3NvcnRGdW5jdGlvbicpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJ5b3UgbmVlZCB0byBkZWZp
bmUgYHNvcnRQcm9wZXJ0aWVzYCIsICEhc29ydFByb3BlcnRpZXMpOwotCi0gICAgZm9yRWFjaChz
b3J0UHJvcGVydGllcywgZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7Ci0gICAgICBpZiAocmVzdWx0
ID09PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IHNvcnRGdW5jdGlvbihnZXQoaXRlbTEsIHByb3Bl
cnR5TmFtZSksIGdldChpdGVtMiwgcHJvcGVydHlOYW1lKSk7Ci0gICAgICAgIGlmICgocmVzdWx0
ICE9PSAwKSAmJiAhc29ydEFzY2VuZGluZykgewotICAgICAgICAgIHJlc3VsdCA9ICgtMSkgKiBy
ZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiByZXN1bHQ7
Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQo
dGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3Nv
cnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAoY29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewot
ICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2go
c29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVy
LnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29y
dFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAgICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuX3N1cGVyKCk7Ci0gIH0sCi0KLSAgaXNTb3J0ZWQ6
IEVtYmVyLmNvbXB1dGVkLmJvb2woJ3NvcnRQcm9wZXJ0aWVzJyksCi0KLSAgLyoqCi0gICAgT3Zl
cnJpZGVzIHRoZSBkZWZhdWx0IGFycmFuZ2VkQ29udGVudCBmcm9tIGFycmF5UHJveHkgaW4gb3Jk
ZXIgdG8gc29ydCBieSBzb3J0RnVuY3Rpb24uCi0gICAgQWxzbyBzZXRzIHVwIG9ic2VydmVycyBm
b3IgZWFjaCBzb3J0UHJvcGVydHkgb24gZWFjaCBpdGVtIGluIHRoZSBjb250ZW50IEFycmF5Lgot
ICAgIAotICAgIEBwcm9wZXJ0eSBhcnJhbmdlZENvbnRlbnQKLSAgKi8KLQotICBhcnJhbmdlZENv
bnRlbnQ6IEVtYmVyLmNvbXB1dGVkKCdjb250ZW50JywgJ3NvcnRQcm9wZXJ0aWVzLkBlYWNoJywg
ZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50JyksCi0gICAgICAgIGlzU29ydGVkID0gZ2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAg
ICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMnKSwKLSAgICAgICAg
c2VsZiA9IHRoaXM7Ci0KLSAgICBpZiAoY29udGVudCAmJiBpc1NvcnRlZCkgewotICAgICAgY29u
dGVudCA9IGNvbnRlbnQuc2xpY2UoKTsKLSAgICAgIGNvbnRlbnQuc29ydChmdW5jdGlvbihpdGVt
MSwgaXRlbTIpIHsKLSAgICAgICAgcmV0dXJuIHNlbGYub3JkZXJCeShpdGVtMSwgaXRlbTIpOwot
ICAgICAgfSk7Ci0gICAgICBmb3JFYWNoKGNvbnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAg
ICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAg
ICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRlbSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVu
dEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2UnKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9
LCB0aGlzKTsKLSAgICAgIHJldHVybiBFbWJlci5BKGNvbnRlbnQpOwotICAgIH0KLQotICAgIHJl
dHVybiBjb250ZW50OwotICB9KSwKLQotICBfY29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9y
ZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQo
dGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3Nv
cnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAoY29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewot
ICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2go
c29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNvcnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVy
LnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQcm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29y
dFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAgICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7
Ci0gICAgfQotCi0gICAgdGhpcy5fc3VwZXIoKTsKLSAgfSksCi0KLSAgc29ydEFzY2VuZGluZ1dp
bGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdzb3J0QXNjZW5kaW5nJywgZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5fbGFzdFNvcnRBc2NlbmRpbmcgPSBnZXQodGhpcywgJ3NvcnRBc2NlbmRp
bmcnKTsKLSAgfSksCi0KLSAgc29ydEFzY2VuZGluZ0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIo
J3NvcnRBc2NlbmRpbmcnLCBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdzb3J0QXNj
ZW5kaW5nJykgIT09IHRoaXMuX2xhc3RTb3J0QXNjZW5kaW5nKSB7Ci0gICAgICB2YXIgYXJyYW5n
ZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLSAgICAgIGFycmFuZ2Vk
Q29udGVudC5yZXZlcnNlT2JqZWN0cygpOwotICAgIH0KLSAgfSksCi0KLSAgY29udGVudEFycmF5
V2lsbENoYW5nZTogZnVuY3Rpb24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50
KSB7Ci0gICAgdmFyIGlzU29ydGVkID0gZ2V0KHRoaXMsICdpc1NvcnRlZCcpOwotCi0gICAgaWYg
KGlzU29ydGVkKSB7Ci0gICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJh
bmdlZENvbnRlbnQnKTsKLSAgICAgIHZhciByZW1vdmVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlk
eCwgaWR4K3JlbW92ZWRDb3VudCk7Ci0gICAgICB2YXIgc29ydFByb3BlcnRpZXMgPSBnZXQodGhp
cywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICAgIGZvckVhY2gocmVtb3ZlZE9iamVjdHMsIGZ1
bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92ZU9iamVjdChpdGVt
KTsKLQotICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVy
dHkpIHsKLSAgICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHks
IHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwotICAgICAgICB9LCB0
aGlzKTsKLSAgICAgIH0sIHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLl9zdXBlcihh
cnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpOwotICB9LAotCi0gIGNvbnRlbnRB
cnJheURpZENoYW5nZTogZnVuY3Rpb24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENv
dW50KSB7Ci0gICAgdmFyIGlzU29ydGVkID0gZ2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAg
ICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMnKTsKLQotICAgIGlm
IChpc1NvcnRlZCkgewotICAgICAgdmFyIGFkZGVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlkeCwg
aWR4K2FkZGVkQ291bnQpOwotCi0gICAgICBmb3JFYWNoKGFkZGVkT2JqZWN0cywgZnVuY3Rpb24o
aXRlbSkgewotICAgICAgICB0aGlzLmluc2VydEl0ZW1Tb3J0ZWQoaXRlbSk7Ci0KLSAgICAgICAg
Zm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAgICAg
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRlbSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0
ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2UnKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9LCB0
aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3Zl
ZENvdW50LCBhZGRlZENvdW50KTsKLSAgfSwKLQotICBpbnNlcnRJdGVtU29ydGVkOiBmdW5jdGlv
bihpdGVtKSB7Ci0gICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRD
b250ZW50Jyk7Ci0gICAgdmFyIGxlbmd0aCA9IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgn
KTsKLQotICAgIHZhciBpZHggPSB0aGlzLl9iaW5hcnlTZWFyY2goaXRlbSwgMCwgbGVuZ3RoKTsK
LSAgICBhcnJhbmdlZENvbnRlbnQuaW5zZXJ0QXQoaWR4LCBpdGVtKTsKLSAgfSwKLQotICBjb250
ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24oaXRlbSkgewotICAgIHZhciBh
cnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpLAotICAgICAgICBv
bGRJbmRleCA9IGFycmFuZ2VkQ29udGVudC5pbmRleE9mKGl0ZW0pLAotICAgICAgICBsZWZ0SXRl
bSA9IGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChvbGRJbmRleCAtIDEpLAotICAgICAgICByaWdo
dEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQob2xkSW5kZXggKyAxKSwKLSAgICAgICAg
bGVmdFJlc3VsdCA9IGxlZnRJdGVtICYmIHRoaXMub3JkZXJCeShpdGVtLCBsZWZ0SXRlbSksCi0g
ICAgICAgIHJpZ2h0UmVzdWx0ID0gcmlnaHRJdGVtICYmIHRoaXMub3JkZXJCeShpdGVtLCByaWdo
dEl0ZW0pOwotCi0gICAgaWYgKGxlZnRSZXN1bHQgPCAwIHx8IHJpZ2h0UmVzdWx0ID4gMCkgewot
ICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92ZU9iamVjdChpdGVtKTsKLSAgICAgIHRoaXMuaW5z
ZXJ0SXRlbVNvcnRlZChpdGVtKTsKLSAgICB9Ci0gIH0sCi0KLSAgX2JpbmFyeVNlYXJjaDogZnVu
Y3Rpb24oaXRlbSwgbG93LCBoaWdoKSB7Ci0gICAgdmFyIG1pZCwgbWlkSXRlbSwgcmVzLCBhcnJh
bmdlZENvbnRlbnQ7Ci0KLSAgICBpZiAobG93ID09PSBoaWdoKSB7Ci0gICAgICByZXR1cm4gbG93
OwotICAgIH0KLQotICAgIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250
ZW50Jyk7Ci0KLSAgICBtaWQgPSBsb3cgKyBNYXRoLmZsb29yKChoaWdoIC0gbG93KSAvIDIpOwot
ICAgIG1pZEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQobWlkKTsKLQotICAgIHJlcyA9
IHRoaXMub3JkZXJCeShtaWRJdGVtLCBpdGVtKTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAg
ICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNoKGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgICB9IGVs
c2UgaWYgKHJlcyA+IDApIHsKLSAgICAgIHJldHVybiB0aGlzLl9iaW5hcnlTZWFyY2goaXRlbSwg
bG93LCBtaWQpOwotICAgIH0KLQotICAgIHJldHVybiBtaWQ7Ci0gIH0KLX0pOwotCi19KSgpOwot
Ci0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVy
LXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9y
RWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIHJlcGxhY2UgPSBFbWJl
ci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZTsKLQotLyoqCi0gIGBFbWJlci5BcnJheUNvbnRyb2xs
ZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gcHVibGlzaCBhIGNvbGxlY3Rpb24gb2YKLSAg
b2JqZWN0cyBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IGJpbmQgdG8gdGhlIGNvbGxlY3Rpb24gZnJv
bSBhIEhhbmRsZWJhcnMKLSAgYCNlYWNoYCBoZWxwZXIsIGFuIGBFbWJlci5Db2xsZWN0aW9uVmll
d2AsIG9yIG90aGVyIGNvbnRyb2xsZXJzLgotCi0gIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYW4g
YEFycmF5Q29udHJvbGxlcmAgaXMgdGhhdCB5b3Ugb25seSBoYXZlIHRvIHNldCB1cAotICB5b3Vy
IHZpZXcgYmluZGluZ3Mgb25jZTsgdG8gY2hhbmdlIHdoYXQncyBkaXNwbGF5ZWQsIHNpbXBseSBz
d2FwIG91dCB0aGUKLSAgYGNvbnRlbnRgIHByb3BlcnR5IG9uIHRoZSBjb250cm9sbGVyLgotCi0g
IEZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSB3YW50ZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgaXRl
bXMgZmV0Y2hlZCB2aWEgYW4gWEhSCi0gIHJlcXVlc3QuIENyZWF0ZSBhbiBgRW1iZXIuQXJyYXlD
b250cm9sbGVyYCBhbmQgc2V0IGl0cyBgY29udGVudGAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNj
cmlwdAotICBNeUFwcC5saXN0Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVh
dGUoKTsKLQotICAkLmdldCgncGVvcGxlLmpzb24nLCBmdW5jdGlvbihkYXRhKSB7Ci0gICAgTXlB
cHAubGlzdENvbnRyb2xsZXIuc2V0KCdjb250ZW50JywgZGF0YSk7Ci0gIH0pOwotICBgYGAKLQot
ICBUaGVuLCBjcmVhdGUgYSB2aWV3IHRoYXQgYmluZHMgdG8geW91ciBuZXcgY29udHJvbGxlcjoK
LQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2VhY2ggTXlBcHAubGlzdENvbnRyb2xsZXJ9fQotICAg
IHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19Ci0gIHt7L2VhY2h9fQotICBgYGAKLQotICBBbHRo
b3VnaCB5b3UgYXJlIGJpbmRpbmcgdG8gdGhlIGNvbnRyb2xsZXIsIHRoZSBiZWhhdmlvciBvZiB0
aGlzIGNvbnRyb2xsZXIKLSAgaXMgdG8gcGFzcyB0aHJvdWdoIGFueSBtZXRob2RzIG9yIHByb3Bl
cnRpZXMgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXkuIFRoaXMKLSAgY2FwYWJpbGl0eSBjb21lcyBm
cm9tIGBFbWJlci5BcnJheVByb3h5YCwgd2hpY2ggdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tLgot
Ci0gIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBkaXNwbGF5IGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0
aGluIHRoZSBib2R5IG9mIGFuCi0gIGAjZWFjaGAgaGVscGVyIHRoYXQgZGVwZW5kIG9uIHRoZSB1
bmRlcmx5aW5nIGl0ZW1zIGluIGBjb250ZW50YCwgYnV0IGFyZSBub3QKLSAgcHJlc2VudCBvbiB0
aG9zZSBpdGVtcy4gICBUbyBkbyB0aGlzLCBzZXQgYGl0ZW1Db250cm9sbGVyYCB0byB0aGUgbmFt
ZSBvZiBhCi0gIGNvbnRyb2xsZXIgKHByb2JhYmx5IGFuIGBPYmplY3RDb250cm9sbGVyYCkgdGhh
dCB3aWxsIHdyYXAgZWFjaCBpbmRpdmlkdWFsIGl0ZW0uCi0KLSAgRm9yIGV4YW1wbGU6Ci0KLSAg
YGBgaGFuZGxlYmFycwotICAgIHt7I2VhY2ggcG9zdCBpbiBjb250cm9sbGVyfX0KLSAgICAgIDxs
aT57e3RpdGxlfX0gKHt7dGl0bGVMZW5ndGh9fSBjaGFyYWN0ZXJzKTwvbGk+Ci0gICAge3svZWFj
aH19Ci0gIGBgYAotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBvc3RzQ29udHJvbGxlciA9IEVt
YmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGl0ZW1Db250cm9sbGVyOiAncG9zdCcK
LSAgfSk7Ci0KLSAgQXBwLlBvc3RDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5l
eHRlbmQoewotICAgIC8vIHRoZSBgdGl0bGVgIHByb3BlcnR5IHdpbGwgYmUgcHJveGllZCB0byB0
aGUgdW5kZXJseWluZyBwb3N0LgotCi0gICAgdGl0bGVMZW5ndGg6IGZ1bmN0aW9uKCkgewotICAg
ICAgcmV0dXJuIHRoaXMuZ2V0KCd0aXRsZScpLmxlbmd0aDsKLSAgICB9LnByb3BlcnR5KCd0aXRs
ZScpCi0gIH0pOwotICBgYGAKLQotICBJbiBzb21lIGNhc2VzIGl0IGlzIGhlbHBmdWwgdG8gcmV0
dXJuIGEgZGlmZmVyZW50IGBpdGVtQ29udHJvbGxlcmAgZGVwZW5kaW5nCi0gIG9uIHRoZSBwYXJ0
aWN1bGFyIGl0ZW0uICBTdWJjbGFzc2VzIGNhbiBkbyB0aGlzIGJ5IG92ZXJyaWRpbmcKLSAgYGxv
b2t1cEl0ZW1Db250cm9sbGVyYC4KLQotICBGb3IgZXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEFwcC5NeUFycmF5Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQo
ewotICAgIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5jdGlvbiggb2JqZWN0ICkgewotICAgICAg
aWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcpKSB7Ci0gICAgICAgIHJldHVybiAic3BlY2lhbCI7
IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xsZXIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJl
dHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxhckNvbnRyb2xsZXIKLSAgICAgIH0KLSAg
ICB9Ci0gIH0pOwotICBgYGAKLQotICBUaGUgaXRlbUNvbnRyb2xsZXIgaW5zdGFuY2VzIHdpbGwg
aGF2ZSBhIGBwYXJlbnRDb250cm9sbGVyYCBwcm9wZXJ0eSBzZXQgdG8KLSAgZWl0aGVyIHRoZSB0
aGUgYHBhcmVudENvbnRyb2xsZXJgIHByb3BlcnR5IG9mIHRoZSBgQXJyYXlDb250cm9sbGVyYAot
ICBvciB0byB0aGUgYEFycmF5Q29udHJvbGxlcmAgaW5zdGFuY2UgaXRzZWxmLgotCi0gIEBjbGFz
cyBBcnJheUNvbnRyb2xsZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5B
cnJheVByb3h5Ci0gIEB1c2VzIEVtYmVyLlNvcnRhYmxlTWl4aW4KLSAgQHVzZXMgRW1iZXIuQ29u
dHJvbGxlck1peGluCi0qLwotCi1FbWJlci5BcnJheUNvbnRyb2xsZXIgPSBFbWJlci5BcnJheVBy
b3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4sCi0gIEVtYmVyLlNvcnRhYmxlTWl4aW4s
IHsKLQotICAvKioKLSAgICBUaGUgY29udHJvbGxlciB1c2VkIHRvIHdyYXAgaXRlbXMsIGlmIGFu
eS4KLQotICAgIEBwcm9wZXJ0eSBpdGVtQ29udHJvbGxlcgotICAgIEB0eXBlIFN0cmluZwotICAg
IEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgaXRlbUNvbnRyb2xsZXI6IG51bGwsCi0KLSAgLyoqCi0g
ICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGVyIHRvIHdyYXAgaXRlbXMsIG9yIGBu
dWxsYCBpZiBpdGVtcyBzaG91bGQKLSAgICBiZSByZXR1cm5lZCBkaXJlY3RseS4gIFRoZSBkZWZh
dWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZQotICAgIGBpdGVtQ29udHJvbGxl
cmAgcHJvcGVydHksIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBy
ZXR1cm4KLSAgICBkaWZmZXJlbnQgY29udHJvbGxlcnMgZm9yIGRpZmZlcmVudCBvYmplY3RzLgot
Ci0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLk15QXJyYXlD
b250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgICBsb29rdXBJ
dGVtQ29udHJvbGxlcjogZnVuY3Rpb24oIG9iamVjdCApIHsKLSAgICAgICAgaWYgKG9iamVjdC5n
ZXQoJ2lzU3BlY2lhbCcpKSB7Ci0gICAgICAgICAgcmV0dXJuICJzcGVjaWFsIjsgLy8gdXNlIEFw
cC5TcGVjaWFsQ29udHJvbGxlcgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAi
cmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxhckNvbnRyb2xsZXIKLSAgICAgICAgfQotICAgICAg
fQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBsb29rdXBJdGVtQ29udHJvbGxlcgot
ICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKLSAgICBAcmV0dXJuIHtTdHJpbmd9Ci0gICovCi0g
IGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5jdGlvbihvYmplY3QpIHsKLSAgICByZXR1cm4gZ2V0
KHRoaXMsICdpdGVtQ29udHJvbGxlcicpOwotICB9LAotCi0gIG9iamVjdEF0Q29udGVudDogZnVu
Y3Rpb24oaWR4KSB7Ci0gICAgdmFyIGxlbmd0aCA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAg
ICAgIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAg
ICAgb2JqZWN0ID0gYXJyYW5nZWRDb250ZW50ICYmIGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChp
ZHgpOwotCi0gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGxlbmd0aCkgewotICAgICAgdmFyIGNv
bnRyb2xsZXJDbGFzcyA9IHRoaXMubG9va3VwSXRlbUNvbnRyb2xsZXIob2JqZWN0KTsKLSAgICAg
IGlmIChjb250cm9sbGVyQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlckF0
KGlkeCwgb2JqZWN0LCBjb250cm9sbGVyQ2xhc3MpOwotICAgICAgfQotICAgIH0KLQotICAgIC8v
IFdoZW4gYGNvbnRyb2xsZXJDbGFzc2AgaXMgZmFsc3ksIHdlIGhhdmUgbm90IG9wdGVkIGluIHRv
IHVzaW5nIGl0ZW0KLSAgICAvLyBjb250cm9sbGVycywgc28gcmV0dXJuIHRoZSBvYmplY3QgZGly
ZWN0bHkuCi0KLSAgICAvLyBXaGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHdlIHdhbnQg
dG8gcmV0dXJuIHRoZSAib3V0IG9mIHJhbmdlIgotICAgIC8vIHZhbHVlLCB3aGF0ZXZlciB0aGF0
IG1pZ2h0IGJlLiAgUmF0aGVyIHRoYW4gbWFrZSBhc3N1bXB0aW9ucwotICAgIC8vIChlLmcuIGd1
ZXNzaW5nIGBudWxsYCBvciBgdW5kZWZpbmVkYCkgd2UgZGVmZXIgdGhpcyB0byBgYXJyYW5nZWRD
b250ZW50YC4KLSAgICByZXR1cm4gb2JqZWN0OwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERp
ZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9yZXNl
dFN1YkNvbnRyb2xsZXJzKCk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5j
dGlvbihpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xsZXJz
ID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxlcnMnKSwKLSAgICAgICAgc3ViQ29udHJvbGxlcnNU
b1JlbW92ZSA9IHN1YkNvbnRyb2xsZXJzLnNsaWNlKGlkeCwgaWR4K3JlbW92ZWRDbnQpOwotCi0g
ICAgZm9yRWFjaChzdWJDb250cm9sbGVyc1RvUmVtb3ZlLCBmdW5jdGlvbihzdWJDb250cm9sbGVy
KSB7Ci0gICAgICBpZiAoc3ViQ29udHJvbGxlcikgeyBzdWJDb250cm9sbGVyLmRlc3Ryb3koKTsg
fQotICAgIH0pOwotCi0gICAgcmVwbGFjZShzdWJDb250cm9sbGVycywgaWR4LCByZW1vdmVkQ250
LCBuZXcgQXJyYXkoYWRkZWRDbnQpKTsKLQotICAgIC8vIFRoZSBzaGFkb3cgYXJyYXkgb2Ygc3Vi
Y29udHJvbGxlcnMgbXVzdCBiZSB1cGRhdGVkIGJlZm9yZSB3ZSB0cmlnZ2VyCi0gICAgLy8gb2Jz
ZXJ2ZXJzLCBvdGhlcndpc2Ugb2JzZXJ2ZXJzIHdpbGwgZ2V0IHRoZSB3cm9uZyBzdWJjb250YWlu
ZXIgd2hlbgotICAgIC8vIGNhbGxpbmcgYG9iamVjdEF0YAotICAgIHRoaXMuX3N1cGVyKGlkeCwg
cmVtb3ZlZENudCwgYWRkZWRDbnQpOwotICB9LAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlzLnNldCgnX3N1YkNvbnRyb2xsZXJzJywgRW1iZXIu
QSgpKTsKLSAgfSwKLQotICBjb250ZW50OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0g
ICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSksCi0KLSAgY29udHJvbGxlckF0OiBmdW5jdGlvbihp
ZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNzKSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IGdldCh0
aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAgIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdf
c3ViQ29udHJvbGxlcnMnKSwKLSAgICAgICAgc3ViQ29udHJvbGxlciA9IHN1YkNvbnRyb2xsZXJz
W2lkeF0sCi0gICAgICAgIGZhY3RvcnksIGZ1bGxOYW1lOwotCi0gICAgaWYgKHN1YkNvbnRyb2xs
ZXIpIHsgcmV0dXJuIHN1YkNvbnRyb2xsZXI7IH0KLQotICAgIGZ1bGxOYW1lID0gImNvbnRyb2xs
ZXI6IiArIGNvbnRyb2xsZXJDbGFzczsKLQotICAgIGlmICghY29udGFpbmVyLmhhcyhmdWxsTmFt
ZSkpIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcignQ291bGQgbm90IHJlc29sdmUgaXRl
bUNvbnRyb2xsZXI6ICInICsgY29udHJvbGxlckNsYXNzICsgJyInKTsKLSAgICB9Ci0KLSAgICBz
dWJDb250cm9sbGVyID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUpLmNyZWF0ZSh7
Ci0gICAgICB0YXJnZXQ6IHRoaXMsCi0gICAgICBwYXJlbnRDb250cm9sbGVyOiBnZXQodGhpcywg
J3BhcmVudENvbnRyb2xsZXInKSB8fCB0aGlzLAotICAgICAgY29udGVudDogb2JqZWN0Ci0gICAg
fSk7Ci0KLSAgICBzdWJDb250cm9sbGVyc1tpZHhdID0gc3ViQ29udHJvbGxlcjsKLQotICAgIHJl
dHVybiBzdWJDb250cm9sbGVyOwotICB9LAotCi0gIF9zdWJDb250cm9sbGVyczogbnVsbCwKLQot
ICBfcmVzZXRTdWJDb250cm9sbGVyczogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xs
ZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxlcnMnKTsKLSAgICBpZiAoc3ViQ29udHJvbGxl
cnMpIHsKLSAgICAgIGZvckVhY2goc3ViQ29udHJvbGxlcnMsIGZ1bmN0aW9uKHN1YkNvbnRyb2xs
ZXIpIHsKLSAgICAgICAgaWYgKHN1YkNvbnRyb2xsZXIpIHsgc3ViQ29udHJvbGxlci5kZXN0cm95
KCk7IH0KLSAgICAgIH0pOwotICAgIH0KLQotICAgIHRoaXMuc2V0KCdfc3ViQ29udHJvbGxlcnMn
LCBFbWJlci5BKCkpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioKLSAg
YEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGlzIHBhcnQgb2YgRW1iZXIncyBDb250cm9sbGVyIGxh
eWVyLiBJdCBpcyBpbnRlbmRlZAotICB0byB3cmFwIGEgc2luZ2xlIG9iamVjdCwgcHJveHlpbmcg
dW5oYW5kbGVkIGF0dGVtcHRzIHRvIGBnZXRgIGFuZCBgc2V0YCB0byB0aGUgdW5kZXJseWluZwot
ICBjb250ZW50IG9iamVjdCwgYW5kIHRvIGZvcndhcmQgdW5oYW5kbGVkIGFjdGlvbiBhdHRlbXB0
cyB0byBpdHMgYHRhcmdldGAuCi0KLSAgYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGRlcml2ZXMg
dGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gaXRzIHN1cGVyY2xhc3MKLSAgYEVtYmVyLk9iamVjdFBy
b3h5YCBhbmQgdGhlIGBFbWJlci5Db250cm9sbGVyTWl4aW5gIG1peGluLgotCi0gIEBjbGFzcyBP
YmplY3RDb250cm9sbGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2Jq
ZWN0UHJveHkKLSAgQHVzZXMgRW1iZXIuQ29udHJvbGxlck1peGluCi0qKi8KLUVtYmVyLk9iamVj
dENvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoRW1iZXIuQ29udHJvbGxlck1p
eGluKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotRW1iZXIgUnVudGltZQotCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXJ1bnRpbWUKLUByZXF1aXJlcyBlbWJlci1tZXRhbAotKi8KLQotfSkoKTsKLQotKGZ1
bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0q
LwotCi12YXIgalF1ZXJ5ID0gdGhpcy5qUXVlcnkgfHwgKEVtYmVyLmltcG9ydHMgJiYgRW1iZXIu
aW1wb3J0cy5qUXVlcnkpOwotaWYgKCFqUXVlcnkgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5j
dGlvbicpIHsKLSAgalF1ZXJ5ID0gcmVxdWlyZSgnanF1ZXJ5Jyk7Ci19Ci0KLUVtYmVyLmFzc2Vy
dCgiRW1iZXIgVmlld3MgcmVxdWlyZSBqUXVlcnkgYmV0d2VlbiAxLjcgYW5kIDIuMSIsIGpRdWVy
eSAmJiAoalF1ZXJ5KCkuanF1ZXJ5Lm1hdGNoKC9eKCgxXC4oN3w4fDl8MTB8MTEpKXwoMlwuKDB8
MSkpKShcLlxkKyk/KHByZXxyY1xkPyk/LykgfHwgRW1iZXIuRU5WLkZPUkNFX0pRVUVSWSkpOwot
Ci0vKioKLSAgQWxpYXMgZm9yIGpRdWVyeQotCi0gIEBtZXRob2QgJAotICBAZm9yIEVtYmVyCi0q
LwotRW1iZXIuJCA9IGpRdWVyeTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
QG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLWlmIChFbWJlci4kKSB7
Ci0gIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsv
bXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cwotICB2YXIgZHJhZ0V2ZW50cyA9IEVtYmVyLlN0
cmluZy53KCdkcmFnc3RhcnQgZHJhZyBkcmFnZW50ZXIgZHJhZ2xlYXZlIGRyYWdvdmVyIGRyb3Ag
ZHJhZ2VuZCcpOwotCi0gIC8vIENvcGllcyB0aGUgYGRhdGFUcmFuc2ZlcmAgcHJvcGVydHkgZnJv
bSBhIGJyb3dzZXIgZXZlbnQgb2JqZWN0IG9udG8gdGhlCi0gIC8vIGpRdWVyeSBldmVudCBvYmpl
Y3QgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnRzCi0gIEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JF
YWNoKGRyYWdFdmVudHMsIGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIEVtYmVyLiQuZXZlbnQu
Zml4SG9va3NbZXZlbnROYW1lXSA9IHsgcHJvcHM6IFsnZGF0YVRyYW5zZmVyJ10gfTsKLSAgfSk7
Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBz
dWJtb2R1bGUgZW1iZXItdmlld3MKLSovCi0KLS8qIEJFR0lOIE1FVEFNT1JQSCBIRUxQRVJTICov
Ci0KLS8vIEludGVybmV0IEV4cGxvcmVyIHByaW9yIHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGlu
ZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1lbnQKLS8vIGlzIGEgInplcm8tc2NvcGUiIGVs
ZW1lbnQuIFRoaXMgcHJvYmxlbSBjYW4gYmUgd29ya2VkIGFyb3VuZCBieSBtYWtpbmcKLS8vIHRo
ZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0ZXh0IG5vZGUuIFdlLCBsaWtlIE1vZGVybml6ciwg
dXNlICZzaHk7Ci0KLXZhciBuZWVkc1NoeSA9IHRoaXMuZG9jdW1lbnQgJiYgKGZ1bmN0aW9uKCkg
ewotICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gIHRlc3RF
bC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4iOwotICB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhU
TUwgPSAiPHNjcmlwdD48L3NjcmlwdD4iOwotICByZXR1cm4gdGVzdEVsLmZpcnN0Q2hpbGQuaW5u
ZXJIVE1MID09PSAnJzsKLX0pKCk7Ci0KLS8vIElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlr
ZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcKLS8vIGEgc2NyaXB0IHRhZyB0byBhcHBl
YXIgYWZ0ZXIgaXQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4KLS8vIGFjY2lkZW50YWxseSByZW1v
dmUgd2hpdGVzcGFjZSB3aGVuIHVwZGF0aW5nIGEgbW9ycGguCi12YXIgbW92ZXNXaGl0ZXNwYWNl
ID0gdGhpcy5kb2N1bWVudCAmJiAoZnVuY3Rpb24oKSB7Ci0gIHZhciB0ZXN0RWwgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAgdGVzdEVsLmlubmVySFRNTCA9ICJUZXN0OiA8c2Ny
aXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRlcic+PC9zY3JpcHQ+VmFsdWUiOwotICByZXR1cm4g
dGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYmCi0gICAgICAgICAg
dGVzdEVsLmNoaWxkTm9kZXNbMl0ubm9kZVZhbHVlID09PSAnIFZhbHVlJzsKLX0pKCk7Ci0KLS8v
IFVzZSB0aGlzIHRvIGZpbmQgY2hpbGRyZW4gYnkgSUQgaW5zdGVhZCBvZiB1c2luZyBqUXVlcnkK
LXZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rpb24oZWxlbWVudCwgaWQpIHsKLSAgaWYgKGVsZW1l
bnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBpZCkgeyByZXR1cm4gZWxlbWVudDsgfQotCi0gIHZh
ciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLCBpZHgsIG5vZGUsIGZvdW5kOwotICBm
b3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgewotICAgIG5vZGUgPSBlbGVtZW50LmNoaWxkTm9k
ZXNbaWR4XTsKLSAgICBmb3VuZCA9IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgZmluZENoaWxkQnlJ
ZChub2RlLCBpZCk7Ci0gICAgaWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZDsgfQotICB9Ci19Owot
Ci12YXIgc2V0SW5uZXJIVE1MV2l0aG91dEZpeCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsK
LSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAgaHRtbCA9ICcmc2h5OycgKyBodG1sOwotICB9Ci0KLSAg
dmFyIG1hdGNoZXMgPSBbXTsKLSAgaWYgKG1vdmVzV2hpdGVzcGFjZSkgewotICAgIC8vIFJpZ2h0
IG5vdyB3ZSBvbmx5IGNoZWNrIGZvciBzY3JpcHQgdGFncyB3aXRoIGlkcyB3aXRoIHRoZQotICAg
IC8vIGdvYWwgb2YgdGFyZ2V0aW5nIG1vcnBocy4KLSAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8o
XHMrKSg8c2NyaXB0IGlkPScoW14nXSspJykvZywgZnVuY3Rpb24obWF0Y2gsIHNwYWNlcywgdGFn
LCBpZCkgewotICAgICAgbWF0Y2hlcy5wdXNoKFtpZCwgc3BhY2VzXSk7Ci0gICAgICByZXR1cm4g
dGFnOwotICAgIH0pOwotICB9Ci0KLSAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1sOwotCi0gIC8v
IElmIHdlIGhhdmUgdG8gZG8gYW55IHdoaXRlc3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cK
LSAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkgewotICAgIHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0
aCwgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICB2YXIgc2Ny
aXB0ID0gZmluZENoaWxkQnlJZChlbGVtZW50LCBtYXRjaGVzW2lkeF1bMF0pLAotICAgICAgICAg
IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwotICAgICAg
c2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHNjcmlwdCk7Ci0gICAgfQotICB9
Ci0KLSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAgdmFyIHNoeUVsZW1lbnQgPSBlbGVtZW50LmZpcnN0
Q2hpbGQ7Ci0gICAgd2hpbGUgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1l
bnQubm9kZU5hbWUpIHsKLSAgICAgIHNoeUVsZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7
Ci0gICAgfQotICAgIGlmIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQu
bm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKLSAgICAgIHNoeUVsZW1lbnQubm9k
ZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFsdWUuc2xpY2UoMSk7Ci0gICAgfQotICB9Ci19Owot
Ci0vKiBFTkQgTUVUQU1PUlBIIEhFTFBFUlMgKi8KLQotCi12YXIgaW5uZXJIVE1MVGFncyA9IHt9
OwotdmFyIGNhblNldElubmVySFRNTCA9IGZ1bmN0aW9uKHRhZ05hbWUpIHsKLSAgaWYgKGlubmVy
SFRNTFRhZ3NbdGFnTmFtZV0gIT09IHVuZGVmaW5lZCkgewotICAgIHJldHVybiBpbm5lckhUTUxU
YWdzW3RhZ05hbWVdOwotICB9Ci0KLSAgdmFyIGNhblNldCA9IHRydWU7Ci0KLSAgLy8gSUUgOCBh
bmQgZWFybGllciBkb24ndCBhbGxvdyB1cyB0byBkbyBpbm5lckhUTUwgb24gc2VsZWN0Ci0gIGlm
ICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWxlY3QnKSB7Ci0gICAgdmFyIGVsID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7Ci0gICAgc2V0SW5uZXJIVE1MV2l0aG91dEZp
eChlbCwgJzxvcHRpb24gdmFsdWU9InRlc3QiPlRlc3Q8L29wdGlvbj4nKTsKLSAgICBjYW5TZXQg
PSBlbC5vcHRpb25zLmxlbmd0aCA9PT0gMTsKLSAgfQotCi0gIGlubmVySFRNTFRhZ3NbdGFnTmFt
ZV0gPSBjYW5TZXQ7Ci0KLSAgcmV0dXJuIGNhblNldDsKLX07Ci0KLXZhciBzZXRJbm5lckhUTUwg
PSBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7Ci0gIHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdO
YW1lOwotCi0gIGlmIChjYW5TZXRJbm5lckhUTUwodGFnTmFtZSkpIHsKLSAgICBzZXRJbm5lckhU
TUxXaXRob3V0Rml4KGVsZW1lbnQsIGh0bWwpOwotICB9IGVsc2UgewotICAgIC8vIEZpcmVmb3gg
dmVyc2lvbnMgPCAxMSBkbyBub3QgaGF2ZSBzdXBwb3J0IGZvciBlbGVtZW50Lm91dGVySFRNTC4K
LSAgICB2YXIgb3V0ZXJIVE1MID0gZWxlbWVudC5vdXRlckhUTUwgfHwgbmV3IFhNTFNlcmlhbGl6
ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhlbGVtZW50KTsKLSAgICBFbWJlci5hc3NlcnQoIkNhbid0
IHNldCBpbm5lckhUTUwgb24gIitlbGVtZW50LnRhZ05hbWUrIiBpbiB0aGlzIGJyb3dzZXIiLCBv
dXRlckhUTUwpOwotCi0gICAgdmFyIHN0YXJ0VGFnID0gb3V0ZXJIVE1MLm1hdGNoKG5ldyBSZWdF
eHAoIjwiK3RhZ05hbWUrIihbXj5dKik+IiwgJ2knKSlbMF0sCi0gICAgICAgIGVuZFRhZyA9ICc8
LycrdGFnTmFtZSsnPic7Ci0KLSAgICB2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2RpdicpOwotICAgIHNldElubmVySFRNTFdpdGhvdXRGaXgod3JhcHBlciwgc3RhcnRUYWcg
KyBodG1sICsgZW5kVGFnKTsKLSAgICBlbGVtZW50ID0gd3JhcHBlci5maXJzdENoaWxkOwotICAg
IHdoaWxlIChlbGVtZW50LnRhZ05hbWUgIT09IHRhZ05hbWUpIHsKLSAgICAgIGVsZW1lbnQgPSBl
bGVtZW50Lm5leHRTaWJsaW5nOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBlbGVtZW50OwotfTsK
LQotZnVuY3Rpb24gaXNTaW1wbGVDbGljayhldmVudCkgewotICB2YXIgbW9kaWZpZXIgPSBldmVu
dC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJs
S2V5LAotICAgICAgc2Vjb25kYXJ5Q2xpY2sgPSBldmVudC53aGljaCA+IDE7IC8vIElFOSBtYXkg
cmV0dXJuIHVuZGVmaW5lZAotCi0gIHJldHVybiAhbW9kaWZpZXIgJiYgIXNlY29uZGFyeUNsaWNr
OwotfQotCi1FbWJlci5WaWV3VXRpbHMgPSB7Ci0gIHNldElubmVySFRNTDogc2V0SW5uZXJIVE1M
LAotICBpc1NpbXBsZUNsaWNrOiBpc1NpbXBsZUNsaWNrCi19OwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLXZhciBDbGFzc1Nl
dCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnNlZW4gPSB7fTsKLSAgdGhpcy5saXN0ID0gW107Ci19
OwotCi1DbGFzc1NldC5wcm90b3R5cGUgPSB7Ci0gIGFkZDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0g
ICAgaWYgKHN0cmluZyBpbiB0aGlzLnNlZW4pIHsgcmV0dXJuOyB9Ci0gICAgdGhpcy5zZWVuW3N0
cmluZ10gPSB0cnVlOwotCi0gICAgdGhpcy5saXN0LnB1c2goc3RyaW5nKTsKLSAgfSwKLQotICB0
b0RPTTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMubGlzdC5qb2luKCIgIik7Ci0gIH0K
LX07Ci0KLXZhciBCQURfVEFHX05BTUVfVEVTVF9SRUdFWFAgPSAvW15hLXpBLVowLTlcLV0vOwot
dmFyIEJBRF9UQUdfTkFNRV9SRVBMQUNFX1JFR0VYUCA9IC9bXmEtekEtWjAtOVwtXS9nOwotCi1m
dW5jdGlvbiBzdHJpcFRhZ05hbWUodGFnTmFtZSkgewotICBpZiAoIXRhZ05hbWUpIHsKLSAgICBy
ZXR1cm4gdGFnTmFtZTsKLSAgfQotCi0gIGlmICghQkFEX1RBR19OQU1FX1RFU1RfUkVHRVhQLnRl
c3QodGFnTmFtZSkpIHsKLSAgICByZXR1cm4gdGFnTmFtZTsKLSAgfQotCi0gIHJldHVybiB0YWdO
YW1lLnJlcGxhY2UoQkFEX1RBR19OQU1FX1JFUExBQ0VfUkVHRVhQLCAnJyk7Ci19Ci0KLXZhciBC
QURfQ0hBUlNfUkVHRVhQID0gLyYoPyFcdys7KXxbPD4iJ2BdL2c7Ci12YXIgUE9TU0lCTEVfQ0hB
UlNfUkVHRVhQID0gL1smPD4iJ2BdLzsKLQotZnVuY3Rpb24gZXNjYXBlQXR0cmlidXRlKHZhbHVl
KSB7Ci0gIC8vIFN0b2xlbiBzaGFtZWxlc3NseSBmcm9tIEhhbmRsZWJhcnMKLQotICB2YXIgZXNj
YXBlID0gewotICAgICI8IjogIiZsdDsiLAotICAgICI+IjogIiZndDsiLAotICAgICciJzogIiZx
dW90OyIsCi0gICAgIiciOiAiJiN4Mjc7IiwKLSAgICAiYCI6ICImI3g2MDsiCi0gIH07Ci0KLSAg
dmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihjaHIpIHsKLSAgICByZXR1cm4gZXNjYXBlW2Nocl0g
fHwgIiZhbXA7IjsKLSAgfTsKLQotICB2YXIgc3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLQot
ICBpZighUE9TU0lCTEVfQ0hBUlNfUkVHRVhQLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5n
OyB9Ci0gIHJldHVybiBzdHJpbmcucmVwbGFjZShCQURfQ0hBUlNfUkVHRVhQLCBlc2NhcGVDaGFy
KTsKLX0KLQotLy8gSUUgNi83IGhhdmUgYnVncyBhcm9uZCBzZXR0aW5nIG5hbWVzIG9uIGlucHV0
cyBkdXJpbmcgY3JlYXRpb24uCi0vLyBGcm9tIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4t
dXMvbGlicmFyeS9pZS9tczUzNjM4OSh2PXZzLjg1KS5hc3B4OgotLy8gIlRvIGluY2x1ZGUgdGhl
IE5BTUUgYXR0cmlidXRlIGF0IHJ1biB0aW1lIG9uIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBj
cmVhdGVFbGVtZW50IG1ldGhvZCwgdXNlIHRoZSBlVGFnLiIKLXZhciBjYW5TZXROYW1lT25JbnB1
dHMgPSAoZnVuY3Rpb24oKSB7Ci0gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKSwKLSAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKLQotICBl
bC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnZm9vJyk7Ci0gIGRpdi5hcHBlbmRDaGlsZChlbCk7Ci0K
LSAgcmV0dXJuICEhZGl2LmlubmVySFRNTC5tYXRjaCgnZm9vJyk7Ci19KSgpOwotCi0vKioKLSAg
YEVtYmVyLlJlbmRlckJ1ZmZlcmAgZ2F0aGVycyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGEg
dmlldyBhbmQgZ2VuZXJhdGVzIHRoZQotICBmaW5hbCByZXByZXNlbnRhdGlvbi4gYEVtYmVyLlJl
bmRlckJ1ZmZlcmAgd2lsbCBnZW5lcmF0ZSBIVE1MIHdoaWNoIGNhbiBiZSBwdXNoZWQKLSAgdG8g
dGhlIERPTS4KLQotICAgYGBgamF2YXNjcmlwdAotICAgdmFyIGJ1ZmZlciA9IEVtYmVyLlJlbmRl
ckJ1ZmZlcignZGl2Jyk7Ci0gIGBgYAotCi0gIEBjbGFzcyBSZW5kZXJCdWZmZXIKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAY29uc3RydWN0b3IKLSAgQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgdGFn
IG5hbWUgKHN1Y2ggYXMgJ2Rpdicgb3IgJ3AnKSB1c2VkIGZvciB0aGUgYnVmZmVyCi0qLwotRW1i
ZXIuUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24odGFnTmFtZSkgewotICByZXR1cm4gbmV3IEVtYmVy
Ll9SZW5kZXJCdWZmZXIodGFnTmFtZSk7Ci19OwotCi1FbWJlci5fUmVuZGVyQnVmZmVyID0gZnVu
Y3Rpb24odGFnTmFtZSkgewotICB0aGlzLnRhZ05hbWVzID0gW3RhZ05hbWUgfHwgbnVsbF07Ci0g
IHRoaXMuYnVmZmVyID0gIiI7Ci19OwotCi1FbWJlci5fUmVuZGVyQnVmZmVyLnByb3RvdHlwZSA9
IHsKLQotICAvLyBUaGUgcm9vdCB2aWV3J3MgZWxlbWVudAotICBfZWxlbWVudDogbnVsbCwKLQot
ICBfaGFzRWxlbWVudDogdHJ1ZSwKLQotICAvKioKLSAgICBBbiBpbnRlcm5hbCBzZXQgdXNlZCB0
byBkZS1kdXBlIGNsYXNzIG5hbWVzIHdoZW4gYGFkZENsYXNzKClgIGlzCi0gICAgdXNlZC4gQWZ0
ZXIgZWFjaCBjYWxsIHRvIGBhZGRDbGFzcygpYCwgdGhlIGBjbGFzc2VzYCBwcm9wZXJ0eQotICAg
IHdpbGwgYmUgdXBkYXRlZC4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IGVsZW1lbnRD
bGFzc2VzCi0gICAgQHR5cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBbXQotICAqLwotICBlbGVtZW50
Q2xhc3NlczogbnVsbCwKLQotICAvKioKLSAgICBBcnJheSBvZiBjbGFzcyBuYW1lcyB3aGljaCB3
aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZS4KLQotICAgIFlvdSBjYW4gdXNl
IGBzZXRDbGFzc2VzKClgIHRvIHNldCB0aGlzIHByb3BlcnR5IGRpcmVjdGx5LiBJZiB5b3UKLSAg
ICB1c2UgYGFkZENsYXNzKClgLCBpdCB3aWxsIGJlIG1haW50YWluZWQgZm9yIHlvdS4KLQotICAg
IEBwcm9wZXJ0eSBjbGFzc2VzCi0gICAgQHR5cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBbXQotICAq
LwotICBjbGFzc2VzOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBpZCBpbiBvZiB0aGUgZWxlbWVu
dCwgdG8gYmUgYXBwbGllZCBpbiB0aGUgaWQgYXR0cmlidXRlLgotCi0gICAgWW91IHNob3VsZCBu
b3Qgc2V0IHRoaXMgcHJvcGVydHkgeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAg
ICB0aGUgYGlkKClgIG1ldGhvZCBvZiBgRW1iZXIuUmVuZGVyQnVmZmVyYC4KLQotICAgIEBwcm9w
ZXJ0eSBlbGVtZW50SWQKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCi0gICov
Ci0gIGVsZW1lbnRJZDogbnVsbCwKLQotICAvKioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5h
bWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgd2hvc2UgdmFsdWUgd2lsbCBiZQotICAgIGFwcGxpZWQg
dG8gdGhhdCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEK
LSAgICBgZGF0YS12aWV3PSJGb28uYmFyImAgcHJvcGVydHkgdG8gYW4gZWxlbWVudCwgeW91IHdv
dWxkIHNldCB0aGUKLSAgICBlbGVtZW50QXR0cmlidXRlcyBoYXNoIHRvIGB7J2RhdGEtdmlldyc6
J0Zvby5iYXInfWAuCi0KLSAgICBZb3Ugc2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91
cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAgICB0aGUgYGF0dHIoKWAgbWV0aG9kIG9m
IGBFbWJlci5SZW5kZXJCdWZmZXJgLgotCi0gICAgQHByb3BlcnR5IGVsZW1lbnRBdHRyaWJ1dGVz
Ci0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRBdHRyaWJ1
dGVzOiBudWxsLAotCi0gIC8qKgotICAgIEEgaGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUg
cHJvcGVydGllcyBhbmQgd2hvc2UgdmFsdWUgd2lsbCBiZQotICAgIGFwcGxpZWQgdG8gdGhhdCBw
cm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYXBwbHkgYQotICAgIGBjaGVj
a2VkPXRydWVgIHByb3BlcnR5IHRvIGFuIGVsZW1lbnQsIHlvdSB3b3VsZCBzZXQgdGhlCi0gICAg
ZWxlbWVudFByb3BlcnRpZXMgaGFzaCB0byBgeydjaGVja2VkJzp0cnVlfWAuCi0KLSAgICBZb3Ug
c2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3Vs
ZCB1c2UKLSAgICB0aGUgYHByb3AoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgot
Ci0gICAgQHByb3BlcnR5IGVsZW1lbnRQcm9wZXJ0aWVzCi0gICAgQHR5cGUgSGFzaAotICAgIEBk
ZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRQcm9wZXJ0aWVzOiBudWxsLAotCi0gIC8qKgotICAg
IFRoZSB0YWduYW1lIG9mIHRoZSBlbGVtZW50IGFuIGluc3RhbmNlIG9mIGBFbWJlci5SZW5kZXJC
dWZmZXJgIHJlcHJlc2VudHMuCi0KLSAgICBVc3VhbGx5LCB0aGlzIGdldHMgc2V0IGFzIHRoZSBm
aXJzdCBwYXJhbWV0ZXIgdG8gYEVtYmVyLlJlbmRlckJ1ZmZlcmAuIEZvcgotICAgIGV4YW1wbGUs
IGlmIHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEgYHBgIHRhZywgdGhlbiB5b3Ugd291bGQgY2FsbAot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlJlbmRlckJ1ZmZlcigncCcpCi0gICAgYGBg
Ci0KLSAgICBAcHJvcGVydHkgZWxlbWVudFRhZwotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZh
dWx0IG51bGwKLSAgKi8KLSAgZWxlbWVudFRhZzogbnVsbCwKLQotICAvKioKLSAgICBBIGhhc2gg
a2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhbmQgd2hvc2UgdmFsdWUg
d2lsbAotICAgIGJlIGFwcGxpZWQgdG8gdGhhdCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCBpZiB5
b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAgICBgYmFja2dyb3VuZC1jb2xvcjpibGFjaztgIHN0eWxl
IHRvIGFuIGVsZW1lbnQsIHlvdSB3b3VsZCBzZXQgdGhlCi0gICAgZWxlbWVudFN0eWxlIGhhc2gg
dG8gYHsnYmFja2dyb3VuZC1jb2xvcic6J2JsYWNrJ31gLgotCi0gICAgWW91IHNob3VsZCBub3Qg
bWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCi0gICAg
dGhlIGBzdHlsZSgpYCBtZXRob2Qgb2YgYEVtYmVyLlJlbmRlckJ1ZmZlcmAuCi0KLSAgICBAcHJv
cGVydHkgZWxlbWVudFN0eWxlCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICov
Ci0gIGVsZW1lbnRTdHlsZTogbnVsbCwKLQotICAvKioKLSAgICBOZXN0ZWQgYFJlbmRlckJ1ZmZl
cnNgIHdpbGwgc2V0IHRoaXMgdG8gdGhlaXIgcGFyZW50IGBSZW5kZXJCdWZmZXJgCi0gICAgaW5z
dGFuY2UuCi0KLSAgICBAcHJvcGVydHkgcGFyZW50QnVmZmVyCi0gICAgQHR5cGUgRW1iZXIuX1Jl
bmRlckJ1ZmZlcgotICAqLwotICBwYXJlbnRCdWZmZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgQWRk
cyBhIHN0cmluZyBvZiBIVE1MIHRvIHRoZSBgUmVuZGVyQnVmZmVyYC4KLQotICAgIEBtZXRob2Qg
cHVzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgSFRNTCB0byBwdXNoIGludG8gdGhlIGJ1
ZmZlcgotICAgIEBjaGFpbmFibGUKLSAgKi8KLSAgcHVzaDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0g
ICAgdGhpcy5idWZmZXIgKz0gc3RyaW5nOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8q
KgotICAgIEFkZHMgYSBjbGFzcyB0byB0aGUgYnVmZmVyLCB3aGljaCB3aWxsIGJlIHJlbmRlcmVk
IHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUuCi0KLSAgICBAbWV0aG9kIGFkZENsYXNzCi0gICAgQHBh
cmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGFkZCB0byB0aGUgYnVmZmVyCi0g
ICAgQGNoYWluYWJsZQotICAqLwotICBhZGRDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKSB7Ci0g
ICAgLy8gbGF6aWx5IGNyZWF0ZSBlbGVtZW50Q2xhc3NlcwotICAgIHRoaXMuZWxlbWVudENsYXNz
ZXMgPSAodGhpcy5lbGVtZW50Q2xhc3NlcyB8fCBuZXcgQ2xhc3NTZXQoKSk7Ci0gICAgdGhpcy5l
bGVtZW50Q2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLSAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmVs
ZW1lbnRDbGFzc2VzLmxpc3Q7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBzZXRDbGFz
c2VzOiBmdW5jdGlvbihjbGFzc05hbWVzKSB7Ci0gICAgdGhpcy5jbGFzc2VzID0gY2xhc3NOYW1l
czsKLSAgfSwKLQotICAvKioKLSAgICBTZXRzIHRoZSBlbGVtZW50SUQgdG8gYmUgdXNlZCBmb3Ig
dGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9kIGlkCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0g
ICAgQGNoYWluYWJsZQotICAqLwotICBpZDogZnVuY3Rpb24oaWQpIHsKLSAgICB0aGlzLmVsZW1l
bnRJZCA9IGlkOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8vIGR1Y2sgdHlwZSBhdHRy
aWJ1dGUgZnVuY3Rpb25hbGl0eSBsaWtlIGpRdWVyeSBzbyBhIHJlbmRlciBidWZmZXIKLSAgLy8g
Y2FuIGJlIHVzZWQgbGlrZSBhIGpRdWVyeSBvYmplY3QgaW4gYXR0cmlidXRlIGJpbmRpbmcgc2Nl
bmFyaW9zLgotCi0gIC8qKgotICAgIEFkZHMgYW4gYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVu
ZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9kIGF0dHIKLSAgICBAcGFyYW0ge1N0
cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9
IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIGF0dHJpYnV0ZQotICAgIEBjaGFpbmFibGUK
LSAgICBAcmV0dXJuIHtFbWJlci5SZW5kZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBjdXJy
ZW50IGF0dHJpYnV0ZSB2YWx1ZQotICAqLwotICBhdHRyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkg
ewotICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlcyA9ICh0aGlzLmVs
ZW1lbnRBdHRyaWJ1dGVzIHx8IHt9KTsKLQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAx
KSB7Ci0gICAgICByZXR1cm4gYXR0cmlidXRlc1tuYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAg
YXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9
LAotCi0gIC8qKgotICAgIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRy
aWJ1dGVzIHRvIHJlbmRlci4KLQotICAgIEBtZXRob2QgcmVtb3ZlQXR0cgotICAgIEBwYXJhbSB7
U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICBAY2hhaW5hYmxlCi0g
ICovCi0gIHJlbW92ZUF0dHI6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgYXR0cmlidXRlcyA9
IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHJpYnV0ZXMpIHsgZGVsZXRlIGF0
dHJpYnV0ZXNbbmFtZV07IH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAg
IEFkZHMgYW4gcHJvcGVydHkgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4K
LQotICAgIEBtZXRob2QgcHJvcAotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9m
IHRoZSBwcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRk
IHRvIHRoZSBwcm9wZXJ0eQotICAgIEBjaGFpbmFibGUKLSAgICBAcmV0dXJuIHtFbWJlci5SZW5k
ZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlCi0gICov
Ci0gIHByb3A6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7Ci0gICAgdmFyIHByb3BlcnRpZXMgPSB0
aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gKHRoaXMuZWxlbWVudFByb3BlcnRpZXMgfHwge30pOwot
Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0
aWVzW25hbWVdOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcm9wZXJ0aWVzW25hbWVdID0gdmFsdWU7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlIGFu
IHByb3BlcnR5IGZyb20gdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0byByZW5kZXIuCi0KLSAgICBA
bWV0aG9kIHJlbW92ZVByb3AKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0
aGUgcHJvcGVydHkKLSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHJlbW92ZVByb3A6IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXM7Ci0g
ICAgaWYgKHByb3BlcnRpZXMpIHsgZGVsZXRlIHByb3BlcnRpZXNbbmFtZV07IH0KLQotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYSBzdHlsZSB0byB0aGUgc3R5bGUg
YXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAgICBA
bWV0aG9kIHN0eWxlCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgc3R5bGUK
LSAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUKLSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHN0eWxl
OiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICAgIHRoaXMuZWxlbWVudFN0eWxlID0gKHRoaXMu
ZWxlbWVudFN0eWxlIHx8IHt9KTsKLQotICAgIHRoaXMuZWxlbWVudFN0eWxlW25hbWVdID0gdmFs
dWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgYmVnaW46IGZ1bmN0aW9uKHRhZ05hbWUp
IHsKLSAgICB0aGlzLnRhZ05hbWVzLnB1c2godGFnTmFtZSB8fCBudWxsKTsKLSAgICByZXR1cm4g
dGhpczsKLSAgfSwKLQotICBwdXNoT3BlbmluZ1RhZzogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRh
Z05hbWUgPSB0aGlzLmN1cnJlbnRUYWdOYW1lKCk7Ci0gICAgaWYgKCF0YWdOYW1lKSB7IHJldHVy
bjsgfQotCi0gICAgaWYgKHRoaXMuX2hhc0VsZW1lbnQgJiYgIXRoaXMuX2VsZW1lbnQgJiYgdGhp
cy5idWZmZXIubGVuZ3RoID09PSAwKSB7Ci0gICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5nZW5l
cmF0ZUVsZW1lbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YXIgYnVmZmVyID0g
dGhpcy5idWZmZXIsCi0gICAgICAgIGlkID0gdGhpcy5lbGVtZW50SWQsCi0gICAgICAgIGNsYXNz
ZXMgPSB0aGlzLmNsYXNzZXMsCi0gICAgICAgIGF0dHJzID0gdGhpcy5lbGVtZW50QXR0cmlidXRl
cywKLSAgICAgICAgcHJvcHMgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLAotICAgICAgICBzdHls
ZSA9IHRoaXMuZWxlbWVudFN0eWxlLAotICAgICAgICBhdHRyLCBwcm9wOwotCi0gICAgYnVmZmVy
ICs9ICc8JyArIHN0cmlwVGFnTmFtZSh0YWdOYW1lKTsKLQotICAgIGlmIChpZCkgewotICAgICAg
YnVmZmVyICs9ICcgaWQ9IicgKyBlc2NhcGVBdHRyaWJ1dGUoaWQpICsgJyInOwotICAgICAgdGhp
cy5lbGVtZW50SWQgPSBudWxsOwotICAgIH0KLSAgICBpZiAoY2xhc3NlcykgewotICAgICAgYnVm
ZmVyICs9ICcgY2xhc3M9IicgKyBlc2NhcGVBdHRyaWJ1dGUoY2xhc3Nlcy5qb2luKCcgJykpICsg
JyInOwotICAgICAgdGhpcy5jbGFzc2VzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUp
IHsKLSAgICAgIGJ1ZmZlciArPSAnIHN0eWxlPSInOwotCi0gICAgICBmb3IgKHByb3AgaW4gc3R5
bGUpIHsKLSAgICAgICAgaWYgKHN0eWxlLmhhc093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAg
ICAgYnVmZmVyICs9IHByb3AgKyAnOicgKyBlc2NhcGVBdHRyaWJ1dGUoc3R5bGVbcHJvcF0pICsg
JzsnOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlciArPSAnIic7Ci0KLSAgICAg
IHRoaXMuZWxlbWVudFN0eWxlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoYXR0cnMpIHsKLSAg
ICAgIGZvciAoYXR0ciBpbiBhdHRycykgewotICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVy
dHkoYXR0cikpIHsKLSAgICAgICAgICBidWZmZXIgKz0gJyAnICsgYXR0ciArICc9IicgKyBlc2Nh
cGVBdHRyaWJ1dGUoYXR0cnNbYXR0cl0pICsgJyInOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAg
ICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChwcm9w
cykgewotICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcy5oYXNP
d25Qcm9wZXJ0eShwcm9wKSkgewotICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BdOwot
ICAgICAgICAgIGlmICh2YWx1ZSB8fCB0eXBlb2YodmFsdWUpID09PSAnbnVtYmVyJykgewotICAg
ICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7Ci0gICAgICAgICAgICAgIGJ1ZmZlciArPSAn
ICcgKyBwcm9wICsgJz0iJyArIHByb3AgKyAnIic7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICBidWZmZXIgKz0gJyAnICsgcHJvcCArICc9IicgKyBlc2NhcGVBdHRyaWJ1dGUo
cHJvcHNbcHJvcF0pICsgJyInOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgfQotCi0gICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKLSAgICB9
Ci0KLSAgICBidWZmZXIgKz0gJz4nOwotICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICB9LAot
Ci0gIHB1c2hDbG9zaW5nVGFnOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMu
dGFnTmFtZXMucG9wKCk7Ci0gICAgaWYgKHRhZ05hbWUpIHsgdGhpcy5idWZmZXIgKz0gJzwvJyAr
IHN0cmlwVGFnTmFtZSh0YWdOYW1lKSArICc+JzsgfQotICB9LAotCi0gIGN1cnJlbnRUYWdOYW1l
OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy50YWdOYW1lc1t0aGlzLnRhZ05hbWVzLmxl
bmd0aC0xXTsKLSAgfSwKLQotICBnZW5lcmF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciB0YWdOYW1lID0gdGhpcy50YWdOYW1lcy5wb3AoKSwgLy8gcG9wIHNpbmNlIHdlIGRvbid0IG5l
ZWQgdG8gY2xvc2UKLSAgICAgICAgaWQgPSB0aGlzLmVsZW1lbnRJZCwKLSAgICAgICAgY2xhc3Nl
cyA9IHRoaXMuY2xhc3NlcywKLSAgICAgICAgYXR0cnMgPSB0aGlzLmVsZW1lbnRBdHRyaWJ1dGVz
LAotICAgICAgICBwcm9wcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXMsCi0gICAgICAgIHN0eWxl
ID0gdGhpcy5lbGVtZW50U3R5bGUsCi0gICAgICAgIHN0eWxlQnVmZmVyID0gJycsIGF0dHIsIHBy
b3AsIHRhZ1N0cmluZzsKLQotICAgIGlmIChhdHRycyAmJiBhdHRycy5uYW1lICYmICFjYW5TZXRO
YW1lT25JbnB1dHMpIHsKLSAgICAgIC8vIElFIGFsbG93cyBwYXNzaW5nIGEgdGFnIHRvIGNyZWF0
ZUVsZW1lbnQuIFNlZSBub3RlIG9uIGBjYW5TZXROYW1lT25JbnB1dHNgIGFib3ZlIGFzIHdlbGwu
Ci0gICAgICB0YWdTdHJpbmcgPSAnPCcrc3RyaXBUYWdOYW1lKHRhZ05hbWUpKycgbmFtZT0iJytl
c2NhcGVBdHRyaWJ1dGUoYXR0cnMubmFtZSkrJyI+JzsKLSAgICB9IGVsc2UgewotICAgICAgdGFn
U3RyaW5nID0gdGFnTmFtZTsKLSAgICB9Ci0KLSAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQodGFnU3RyaW5nKSwKLSAgICAgICAgJGVsZW1lbnQgPSBFbWJlci4kKGVsZW1l
bnQpOwotCi0gICAgaWYgKGlkKSB7Ci0gICAgICAkZWxlbWVudC5hdHRyKCdpZCcsIGlkKTsKLSAg
ICAgIHRoaXMuZWxlbWVudElkID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKGNsYXNzZXMpIHsKLSAg
ICAgICRlbGVtZW50LmF0dHIoJ2NsYXNzJywgY2xhc3Nlcy5qb2luKCcgJykpOwotICAgICAgdGhp
cy5jbGFzc2VzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUpIHsKLSAgICAgIGZvciAo
cHJvcCBpbiBzdHlsZSkgewotICAgICAgICBpZiAoc3R5bGUuaGFzT3duUHJvcGVydHkocHJvcCkp
IHsKLSAgICAgICAgICBzdHlsZUJ1ZmZlciArPSAocHJvcCArICc6JyArIHN0eWxlW3Byb3BdICsg
JzsnKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAkZWxlbWVudC5hdHRyKCdzdHlsZScs
IHN0eWxlQnVmZmVyKTsKLQotICAgICAgdGhpcy5lbGVtZW50U3R5bGUgPSBudWxsOwotICAgIH0K
LQotICAgIGlmIChhdHRycykgewotICAgICAgZm9yIChhdHRyIGluIGF0dHJzKSB7Ci0gICAgICAg
IGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkgewotICAgICAgICAgICRlbGVtZW50LmF0
dHIoYXR0ciwgYXR0cnNbYXR0cl0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMu
ZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChwcm9wcykgewotICAg
ICAgZm9yIChwcm9wIGluIHByb3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0
eShwcm9wKSkgewotICAgICAgICAgICRlbGVtZW50LnByb3AocHJvcCwgcHJvcHNbcHJvcF0pOwot
ICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBudWxs
OwotICAgIH0KLQotICAgIHJldHVybiBlbGVtZW50OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRo
b2QgZWxlbWVudAotICAgIEByZXR1cm4ge0RPTUVsZW1lbnR9IFRoZSBlbGVtZW50IGNvcnJlc3Bv
bmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBIVE1MCi0gICAgICBvZiB0aGlzIGJ1ZmZlcgotICAqLwot
ICBlbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaHRtbCA9IHRoaXMuaW5uZXJTdHJpbmco
KTsKLQotICAgIGlmIChodG1sKSB7Ci0gICAgICB0aGlzLl9lbGVtZW50ID0gRW1iZXIuVmlld1V0
aWxzLnNldElubmVySFRNTCh0aGlzLl9lbGVtZW50LCBodG1sKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdGhpcy5fZWxlbWVudDsKLSAgfSwKLQotICAvKioKLSAgICBHZW5lcmF0ZXMgdGhlIEhUTUwg
Y29udGVudCBmb3IgdGhpcyBidWZmZXIuCi0KLSAgICBAbWV0aG9kIHN0cmluZwotICAgIEByZXR1
cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBIVE1MCi0gICovCi0gIHN0cmluZzogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKHRoaXMuX2hhc0VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudCkgewotICAgICAg
Ly8gRmlyZWZveCB2ZXJzaW9ucyA8IDExIGRvIG5vdCBoYXZlIHN1cHBvcnQgZm9yIGVsZW1lbnQu
b3V0ZXJIVE1MLgotICAgICAgdmFyIHRoaXNFbGVtZW50ID0gdGhpcy5lbGVtZW50KCksIG91dGVy
SFRNTCA9IHRoaXNFbGVtZW50Lm91dGVySFRNTDsKLSAgICAgIGlmICh0eXBlb2Ygb3V0ZXJIVE1M
ID09PSAndW5kZWZpbmVkJykgewotICAgICAgICByZXR1cm4gRW1iZXIuJCgnPGRpdi8+JykuYXBw
ZW5kKHRoaXNFbGVtZW50KS5odG1sKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb3V0ZXJIVE1M
OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGhpcy5pbm5lclN0cmluZygpOwotICAgIH0K
LSAgfSwKLQotICBpbm5lclN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuYnVm
ZmVyOwotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1i
ZXIuRXZlbnREaXNwYXRjaGVyYCBoYW5kbGVzIGRlbGVnYXRpbmcgYnJvd3NlciBldmVudHMgdG8g
dGhlaXIKLSAgY29ycmVzcG9uZGluZyBgRW1iZXIuVmlld3MuYCBGb3IgZXhhbXBsZSwgd2hlbiB5
b3UgY2xpY2sgb24gYSB2aWV3LAotICBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBlbnN1cmVzIHRo
YXQgdGhhdCB2aWV3J3MgYG1vdXNlRG93bmAgbWV0aG9kIGdldHMKLSAgY2FsbGVkLgotCi0gIEBj
bGFzcyBFdmVudERpc3BhdGNoZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAcHJpdmF0ZQotICBA
ZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5FdmVudERpc3BhdGNoZXIgPSBFbWJlci5P
YmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAgICBUaGUgc2V0IG9mIGV2ZW50cyBuYW1lcyAoYW5k
IGFzc29jaWF0ZWQgaGFuZGxlciBmdW5jdGlvbiBuYW1lcykgdG8gYmUgc2V0dXAKLSAgICBhbmQg
ZGlzcGF0Y2hlZCBieSB0aGUgYEV2ZW50RGlzcGF0Y2hlcmAuIEN1c3RvbSBldmVudHMgY2FuIGFk
ZGVkIHRvIHRoaXMgbGlzdCBhdCBzZXR1cAotICAgIHRpbWUsIGdlbmVyYWxseSB2aWEgdGhlIGBF
bWJlci5BcHBsaWNhdGlvbi5jdXN0b21FdmVudHNgIGhhc2guIE9ubHkgb3ZlcnJpZGUgdGhpcwot
ICAgIGRlZmF1bHQgc2V0IHRvIHByZXZlbnQgdGhlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIGxpc3Rl
bmluZyBvbiBzb21lIGV2ZW50cyBhbGwgdG9nZXRoZXIuCi0KLSAgICBUaGlzIHNldCB3aWxsIGJl
IG1vZGlmaWVkIGJ5IGBzZXR1cGAgdG8gYWxzbyBpbmNsdWRlIGFueSBldmVudHMgYWRkZWQgYXQg
dGhhdCB0aW1lLgotCi0gICAgQHByb3BlcnR5IGV2ZW50cwotICAgIEB0eXBlIE9iamVjdAotICAq
LwotICBldmVudHM6IHsKLSAgICB0b3VjaHN0YXJ0ICA6ICd0b3VjaFN0YXJ0JywKLSAgICB0b3Vj
aG1vdmUgICA6ICd0b3VjaE1vdmUnLAotICAgIHRvdWNoZW5kICAgIDogJ3RvdWNoRW5kJywKLSAg
ICB0b3VjaGNhbmNlbCA6ICd0b3VjaENhbmNlbCcsCi0gICAga2V5ZG93biAgICAgOiAna2V5RG93
bicsCi0gICAga2V5dXAgICAgICAgOiAna2V5VXAnLAotICAgIGtleXByZXNzICAgIDogJ2tleVBy
ZXNzJywKLSAgICBtb3VzZWRvd24gICA6ICdtb3VzZURvd24nLAotICAgIG1vdXNldXAgICAgIDog
J21vdXNlVXAnLAotICAgIGNvbnRleHRtZW51IDogJ2NvbnRleHRNZW51JywKLSAgICBjbGljayAg
ICAgICA6ICdjbGljaycsCi0gICAgZGJsY2xpY2sgICAgOiAnZG91YmxlQ2xpY2snLAotICAgIG1v
dXNlbW92ZSAgIDogJ21vdXNlTW92ZScsCi0gICAgZm9jdXNpbiAgICAgOiAnZm9jdXNJbicsCi0g
ICAgZm9jdXNvdXQgICAgOiAnZm9jdXNPdXQnLAotICAgIG1vdXNlZW50ZXIgIDogJ21vdXNlRW50
ZXInLAotICAgIG1vdXNlbGVhdmUgIDogJ21vdXNlTGVhdmUnLAotICAgIHN1Ym1pdCAgICAgIDog
J3N1Ym1pdCcsCi0gICAgaW5wdXQgICAgICAgOiAnaW5wdXQnLAotICAgIGNoYW5nZSAgICAgIDog
J2NoYW5nZScsCi0gICAgZHJhZ3N0YXJ0ICAgOiAnZHJhZ1N0YXJ0JywKLSAgICBkcmFnICAgICAg
ICA6ICdkcmFnJywKLSAgICBkcmFnZW50ZXIgICA6ICdkcmFnRW50ZXInLAotICAgIGRyYWdsZWF2
ZSAgIDogJ2RyYWdMZWF2ZScsCi0gICAgZHJhZ292ZXIgICAgOiAnZHJhZ092ZXInLAotICAgIGRy
b3AgICAgICAgIDogJ2Ryb3AnLAotICAgIGRyYWdlbmQgICAgIDogJ2RyYWdFbmQnCi0gIH0sCi0K
LSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJz
IHNob3VsZCBiZSBhdHRhY2hlZC4gRXZlbnQKLSAgICBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hl
ZCB0byB0aGUgZG9jdW1lbnQgdW5sZXNzIHRoaXMgaXMgb3ZlcnJpZGRlbi4KLQotICAgIENhbiBi
ZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgotCi0gICAg
VGhlIGRlZmF1bHQgYm9keSBpcyBhIHN0cmluZyBzaW5jZSB0aGlzIG1heSBiZSBldmFsdWF0ZWQg
YmVmb3JlIGRvY3VtZW50LmJvZHkKLSAgICBleGlzdHMgaW4gdGhlIERPTS4KLQotICAgIEBwcml2
YXRlCi0gICAgQHByb3BlcnR5IHJvb3RFbGVtZW50Ci0gICAgQHR5cGUgRE9NRWxlbWVudAotICAg
IEBkZWZhdWx0ICdib2R5JwotICAqLwotICByb290RWxlbWVudDogJ2JvZHknLAotCi0gIC8qKgot
ICAgIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBzdGFuZGFyZCBicm93c2VyIGV2ZW50cy4K
LQotICAgIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgc2VuZHMgYSBgRE9N
Q29udGVudFJlYWR5YCBldmVudC4gQnkKLSAgICBkZWZhdWx0LCBpdCB3aWxsIHNldCB1cCBhbGwg
b2YgdGhlIGxpc3RlbmVycyBvbiB0aGUgZG9jdW1lbnQgYm9keS4gSWYgeW91Ci0gICAgd291bGQg
bGlrZSB0byByZWdpc3RlciB0aGUgbGlzdGVuZXJzIG9uIGEgZGlmZmVyZW50IGVsZW1lbnQsIHNl
dCB0aGUgZXZlbnQKLSAgICBkaXNwYXRjaGVyJ3MgYHJvb3RgIHByb3BlcnR5LgotCi0gICAgQHBy
aXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0gICAgQHBhcmFtIGFkZGVkRXZlbnRzIHtIYXNofQot
ICAqLwotICBzZXR1cDogZnVuY3Rpb24oYWRkZWRFdmVudHMsIHJvb3RFbGVtZW50KSB7Ci0gICAg
dmFyIGV2ZW50LCBldmVudHMgPSBnZXQodGhpcywgJ2V2ZW50cycpOwotCi0gICAgRW1iZXIuJC5l
eHRlbmQoZXZlbnRzLCBhZGRlZEV2ZW50cyB8fCB7fSk7Ci0KLQotICAgIGlmICghRW1iZXIuaXNO
b25lKHJvb3RFbGVtZW50KSkgewotICAgICAgc2V0KHRoaXMsICdyb290RWxlbWVudCcsIHJvb3RF
bGVtZW50KTsKLSAgICB9Ci0KLSAgICByb290RWxlbWVudCA9IEVtYmVyLiQoZ2V0KHRoaXMsICdy
b290RWxlbWVudCcpKTsKLQotICAgIEVtYmVyLmFzc2VydChmbXQoJ1lvdSBjYW5ub3QgdXNlIHRo
ZSBzYW1lIHJvb3QgZWxlbWVudCAoJUApIG11bHRpcGxlIHRpbWVzIGluIGFuIEVtYmVyLkFwcGxp
Y2F0aW9uJywgW3Jvb3RFbGVtZW50LnNlbGVjdG9yIHx8IHJvb3RFbGVtZW50WzBdLnRhZ05hbWVd
KSwgIXJvb3RFbGVtZW50LmlzKCcuZW1iZXItYXBwbGljYXRpb24nKSk7Ci0gICAgRW1iZXIuYXNz
ZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcgRW1iZXIuQXBwbGljYXRpb24gdXNpbmcgYSByb290
IGVsZW1lbnQgdGhhdCBpcyBhIGRlc2NlbmRlbnQgb2YgYW4gZXhpc3RpbmcgRW1iZXIuQXBwbGlj
YXRpb24nLCAhcm9vdEVsZW1lbnQuY2xvc2VzdCgnLmVtYmVyLWFwcGxpY2F0aW9uJykubGVuZ3Ro
KTsKLSAgICBFbWJlci5hc3NlcnQoJ1lvdSBjYW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNh
dGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlzIGFuIGFuY2VzdG9yIG9mIGFuIGV4aXN0
aW5nIEVtYmVyLkFwcGxpY2F0aW9uJywgIXJvb3RFbGVtZW50LmZpbmQoJy5lbWJlci1hcHBsaWNh
dGlvbicpLmxlbmd0aCk7Ci0KLSAgICByb290RWxlbWVudC5hZGRDbGFzcygnZW1iZXItYXBwbGlj
YXRpb24nKTsKLQotICAgIEVtYmVyLmFzc2VydCgnVW5hYmxlIHRvIGFkZCAiZW1iZXItYXBwbGlj
YXRpb24iIGNsYXNzIHRvIHJvb3RFbGVtZW50LiBNYWtlIHN1cmUgeW91IHNldCByb290RWxlbWVu
dCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50IGluIHRoZSBib2R5LicsIHJvb3RFbGVtZW50Lmlz
KCcuZW1iZXItYXBwbGljYXRpb24nKSk7Ci0KLSAgICBmb3IgKGV2ZW50IGluIGV2ZW50cykgewot
ICAgICAgaWYgKGV2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudCkpIHsKLSAgICAgICAgdGhpcy5z
ZXR1cEhhbmRsZXIocm9vdEVsZW1lbnQsIGV2ZW50LCBldmVudHNbZXZlbnRdKTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIG9u
IHRoZSBkb2N1bWVudC4gSWYgdGhlIGdpdmVuIGV2ZW50IGlzCi0gICAgdHJpZ2dlcmVkLCB0aGUg
cHJvdmlkZWQgZXZlbnQgaGFuZGxlciB3aWxsIGJlIHRyaWdnZXJlZCBvbiB0aGUgdGFyZ2V0IHZp
ZXcuCi0KLSAgICBJZiB0aGUgdGFyZ2V0IHZpZXcgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBldmVu
dCBoYW5kbGVyLCBvciBpZiB0aGUgaGFuZGxlcgotICAgIHJldHVybnMgYGZhbHNlYCwgdGhlIHBh
cmVudCB2aWV3IHdpbGwgYmUgY2FsbGVkLiBUaGUgZXZlbnQgd2lsbCBjb250aW51ZSB0bwotICAg
IGJ1YmJsZSB0byBlYWNoIHN1Y2Nlc3NpdmUgcGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0
aGUgdG9wLgotCi0gICAgRm9yIGV4YW1wbGUsIHRvIGhhdmUgdGhlIGBtb3VzZURvd25gIG1ldGhv
ZCBjYWxsZWQgb24gdGhlIHRhcmdldCB2aWV3IHdoZW4KLSAgICBhIGBtb3VzZWRvd25gIGV2ZW50
IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dzZXIsIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgc2V0dXBIYW5kbGVyKCdtb3VzZWRvd24nLCAnbW91c2VEb3duJyk7
Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0dXBIYW5kbGVyCi0gICAg
QHBhcmFtIHtFbGVtZW50fSByb290RWxlbWVudAotICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudCB0
aGUgYnJvd3Nlci1vcmlnaW5hdGVkIGV2ZW50IHRvIGxpc3RlbiB0bwotICAgIEBwYXJhbSB7U3Ry
aW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB2aWV3
Ci0gICovCi0gIHNldHVwSGFuZGxlcjogZnVuY3Rpb24ocm9vdEVsZW1lbnQsIGV2ZW50LCBldmVu
dE5hbWUpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXM7Ci0KLSAgICByb290RWxlbWVudC5vbihldmVu
dCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcnLCBmdW5jdGlvbihldnQsIHRyaWdnZXJpbmdNYW5h
Z2VyKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhhbmRsZVZp
ZXdFdmVudCgpIHsKLSAgICAgICAgdmFyIHZpZXcgPSBFbWJlci5WaWV3LnZpZXdzW3RoaXMuaWRd
LAotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZSwgbWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAg
bWFuYWdlciA9IHNlbGYuX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyKHZpZXcsZXZlbnROYW1lKTsK
LQotICAgICAgICBpZiAobWFuYWdlciAmJiBtYW5hZ2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikg
ewotICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2Rpc3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBl
dmVudE5hbWUsIHZpZXcpOwotICAgICAgICB9IGVsc2UgaWYgKHZpZXcpIHsKLSAgICAgICAgICBy
ZXN1bHQgPSBzZWxmLl9idWJibGVFdmVudCh2aWV3LGV2dCxldmVudE5hbWUpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9KTsKLQotICAgIHJv
b3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJlcicsICdbZGF0YS1lbWJlci1hY3Rpb25dJywgZnVu
Y3Rpb24oZXZ0KSB7Ci0gICAgICByZXR1cm4gRW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhh
bmRsZUFjdGlvbkV2ZW50KCkgewotICAgICAgICB2YXIgYWN0aW9uSWQgPSBFbWJlci4kKGV2dC5j
dXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWVtYmVyLWFjdGlvbicpLAotICAgICAgICAgICAgYWN0
aW9uICAgPSBFbWJlci5IYW5kbGViYXJzLkFjdGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1th
Y3Rpb25JZF07Ci0KLSAgICAgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgYWN0aW9uIGhlcmUg
c2luY2UgaW4gc29tZSBjYXNlcywgalF1ZXJ5IHdpbGwgdHJpZ2dlcgotICAgICAgICAvLyBhbiBl
dmVudCBvbiBgcmVtb3ZlQ2hpbGRgIChpLmUuIGZvY3Vzb3V0KSBhZnRlciB3ZSd2ZSBhbHJlYWR5
IHRvcm4gZG93biB0aGUKLSAgICAgICAgLy8gYWN0aW9uIGhhbmRsZXJzIGZvciB0aGUgdmlldy4K
LSAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rpb24uZXZlbnROYW1lID09PSBldmVudE5hbWUpIHsK
LSAgICAgICAgICByZXR1cm4gYWN0aW9uLmhhbmRsZXIoZXZ0KTsKLSAgICAgICAgfQotICAgICAg
fSwgdGhpcyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyOiBm
dW5jdGlvbih2aWV3LCBldmVudE5hbWUpIHsKLSAgICB2YXIgbWFuYWdlciA9IG51bGw7Ci0KLSAg
ICB3aGlsZSAodmlldykgewotICAgICAgbWFuYWdlciA9IGdldCh2aWV3LCAnZXZlbnRNYW5hZ2Vy
Jyk7Ci0gICAgICBpZiAobWFuYWdlciAmJiBtYW5hZ2VyW2V2ZW50TmFtZV0pIHsgYnJlYWs7IH0K
LQotICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOwotICAgIH0KLQotICAgIHJl
dHVybiBtYW5hZ2VyOwotICB9LAotCi0gIF9kaXNwYXRjaEV2ZW50OiBmdW5jdGlvbihvYmplY3Qs
IGV2dCwgZXZlbnROYW1lLCB2aWV3KSB7Ci0gICAgdmFyIHJlc3VsdCA9IHRydWU7Ci0KLSAgICB2
YXIgaGFuZGxlciA9IG9iamVjdFtldmVudE5hbWVdOwotICAgIGlmIChFbWJlci50eXBlT2YoaGFu
ZGxlcikgPT09ICdmdW5jdGlvbicpIHsKLSAgICAgIHJlc3VsdCA9IEVtYmVyLnJ1bihmdW5jdGlv
bigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2FsbChvYmplY3QsIGV2dCwgdmlldyk7Ci0g
ICAgICB9KTsKLSAgICAgIC8vIERvIG5vdCBwcmV2ZW50RGVmYXVsdCBpbiBldmVudE1hbmFnZXJz
LgotICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAg
IHJlc3VsdCA9IHRoaXMuX2J1YmJsZUV2ZW50KHZpZXcsIGV2dCwgZXZlbnROYW1lKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9LAotCi0gIF9idWJibGVFdmVudDogZnVuY3Rpb24o
dmlldywgZXZ0LCBldmVudE5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIucnVuKGZ1bmN0aW9uIGJ1
YmJsZUV2ZW50KCkgewotICAgICAgcmV0dXJuIHZpZXcuaGFuZGxlRXZlbnQoZXZlbnROYW1lLCBl
dnQpOwotICAgIH0pOwotICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBy
b290RWxlbWVudCA9IGdldCh0aGlzLCAncm9vdEVsZW1lbnQnKTsKLSAgICBFbWJlci4kKHJvb3RF
bGVtZW50KS5vZmYoJy5lbWJlcicsICcqKicpLnJlbW92ZUNsYXNzKCdlbWJlci1hcHBsaWNhdGlv
bicpOwotICAgIHJldHVybiB0aGlzLl9zdXBlcigpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3
cwotKi8KLQotLy8gQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGZvciByZW5kZXJpbmcgdmlld3MgdGhh
dCBoYXBwZW5zCi0vLyBhZnRlciBiaW5kaW5ncyBoYXZlIHN5bmNlZCwgYW5kIGEgcXVldWUgZm9y
IHNjaGVkdWxpbmcgYWN0aW9ucwotLy8gdGhhdCB0aGF0IHNob3VsZCBvY2N1ciBhZnRlciB2aWV3
IHJlbmRlcmluZy4KLXZhciBxdWV1ZXMgPSBFbWJlci5ydW4ucXVldWVzLAotICAgIGluZGV4T2Yg
PSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotcXVldWVzLnNwbGljZShpbmRleE9mLmNh
bGwocXVldWVzLCAnYWN0aW9ucycpKzEsIDAsICdyZW5kZXInLCAnYWZ0ZXJSZW5kZXInKTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotCi0vLyBPcmlnaW5hbCBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBpbiBy
dW50aW1lL2xpYi9jb250cm9sbGVycy9jb250cm9sbGVyLmpzCi0vLyBOT1RFOiBJdCBtYXkgYmUg
cG9zc2libGUgd2l0aCBZVUlEb2MgdG8gY29tYmluZSBkb2NzIGluIHR3byBsb2NhdGlvbnMKLQot
LyoqCi1BZGRpdGlvbmFsIG1ldGhvZHMgZm9yIHRoZSBDb250cm9sbGVyTWl4aW4KLQotQGNsYXNz
IENvbnRyb2xsZXJNaXhpbgotQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLkNvbnRyb2xsZXJN
aXhpbi5yZW9wZW4oewotICB0YXJnZXQ6IG51bGwsCi0gIG5hbWVzcGFjZTogbnVsbCwKLSAgdmll
dzogbnVsbCwKLSAgY29udGFpbmVyOiBudWxsLAotICBfY2hpbGRDb250YWluZXJzOiBudWxsLAot
Ci0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0KHRoaXMs
ICdfY2hpbGRDb250YWluZXJzJywge30pOwotICB9LAotCi0gIF9tb2RlbERpZENoYW5nZTogRW1i
ZXIub2JzZXJ2ZXIoJ21vZGVsJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRhaW5lcnMgPSBn
ZXQodGhpcywgJ19jaGlsZENvbnRhaW5lcnMnKTsKLQotICAgIGZvciAodmFyIHByb3AgaW4gY29u
dGFpbmVycykgewotICAgICAgaWYgKCFjb250YWluZXJzLmhhc093blByb3BlcnR5KHByb3ApKSB7
IGNvbnRpbnVlOyB9Ci0gICAgICBjb250YWluZXJzW3Byb3BdLmRlc3Ryb3koKTsKLSAgICB9Ci0K
LSAgICBzZXQodGhpcywgJ19jaGlsZENvbnRhaW5lcnMnLCB7fSk7Ci0gIH0pCi19KTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZh
ciBzdGF0ZXMgPSB7fTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZ3Vp
ZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIgYV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0
aWxzLmZvckVhY2g7Ci12YXIgYV9hZGRPYmplY3QgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuYWRk
T2JqZWN0OwotdmFyIG1ldGEgPSBFbWJlci5tZXRhOwotCi12YXIgY2hpbGRWaWV3c1Byb3BlcnR5
ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gIHZhciBjaGlsZFZpZXdzID0gdGhpcy5f
Y2hpbGRWaWV3cywgcmV0ID0gRW1iZXIuQSgpLCB2aWV3ID0gdGhpczsKLQotICBhX2ZvckVhY2go
Y2hpbGRWaWV3cywgZnVuY3Rpb24odmlldykgewotICAgIHZhciBjdXJyZW50Q2hpbGRWaWV3czsK
LSAgICBpZiAodmlldy5pc1ZpcnR1YWwpIHsKLSAgICAgIGlmIChjdXJyZW50Q2hpbGRWaWV3cyA9
IGdldCh2aWV3LCAnY2hpbGRWaWV3cycpKSB7Ci0gICAgICAgIHJldC5wdXNoT2JqZWN0cyhjdXJy
ZW50Q2hpbGRWaWV3cyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldC5wdXNoKHZp
ZXcpOwotICAgIH0KLSAgfSk7Ci0KLSAgcmV0LnJlcGxhY2UgPSBmdW5jdGlvbiAoaWR4LCByZW1v
dmVkQ291bnQsIGFkZGVkVmlld3MpIHsKLSAgICBpZiAodmlldyBpbnN0YW5jZW9mIEVtYmVyLkNv
bnRhaW5lclZpZXcpIHsKLSAgICAgIEVtYmVyLmRlcHJlY2F0ZSgiTWFuaXB1bGF0aW5nIGFuIEVt
YmVyLkNvbnRhaW5lclZpZXcgdGhyb3VnaCBpdHMgY2hpbGRWaWV3cyBwcm9wZXJ0eSBpcyBkZXBy
ZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBDb250YWluZXJWaWV3IGluc3RhbmNlIGl0c2VsZiBhcyBh
biBFbWJlci5NdXRhYmxlQXJyYXkuIik7Ci0gICAgICByZXR1cm4gdmlldy5yZXBsYWNlKGlkeCwg
cmVtb3ZlZENvdW50LCBhZGRlZFZpZXdzKTsKLSAgICB9Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKCJjaGlsZFZpZXdzIGlzIGltbXV0YWJsZSIpOwotICB9OwotCi0gIHJldHVybiByZXQ7Ci19
KTsKLQotRW1iZXIud2FybigiVGhlIFZJRVdfUFJFU0VSVkVTX0NPTlRFWFQgZmxhZyBoYXMgYmVl
biByZW1vdmVkIGFuZCB0aGUgZnVuY3Rpb25hbGl0eSBjYW4gbm8gbG9uZ2VyIGJlIGRpc2FibGVk
LiIsIEVtYmVyLkVOVi5WSUVXX1BSRVNFUlZFU19DT05URVhUICE9PSBmYWxzZSk7Ci0KLS8qKgot
ICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVtcGxhdGVzLiBUaGlzIHdpbGwgYXV0b21hdGljYWxs
eSBiZSBwb3B1bGF0ZWQKLSAgYnkgdGhlIGJ1aWxkIHRvb2xzIHNvIHRoYXQgeW91IGNhbiBzdG9y
ZSB5b3VyIEhhbmRsZWJhcnMgdGVtcGxhdGVzIGluCi0gIHNlcGFyYXRlIGZpbGVzIHRoYXQgZ2V0
IGxvYWRlZCBpbnRvIEphdmFTY3JpcHQgYXQgYnVpbGR0aW1lLgotCi0gIEBwcm9wZXJ0eSBURU1Q
TEFURVMKLSAgQGZvciBFbWJlcgotICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuVEVNUExBVEVTID0g
e307Ci0KLS8qKgotICBgRW1iZXIuQ29yZVZpZXdgIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQg
ZXhpc3RzIHRvIGdpdmUgdmlldy1saWtlIGJlaGF2aW9yCi0gIHRvIGJvdGggRW1iZXIncyBtYWlu
IHZpZXcgY2xhc3MgYEVtYmVyLlZpZXdgIGFuZCBvdGhlciBjbGFzc2VzIGxpa2UKLSAgYEVtYmVy
Ll9TaW1wbGVNZXRhbW9ycGhWaWV3YCB0aGF0IGRvbid0IG5lZWQgdGhlIGZ1bGx5IGZ1bmN0aW9u
YWx0aXkgb2YKLSAgYEVtYmVyLlZpZXdgLgotCi0gIFVubGVzcyB5b3UgaGF2ZSBzcGVjaWZpYyBu
ZWVkcyBmb3IgYENvcmVWaWV3YCwgeW91IHdpbGwgdXNlIGBFbWJlci5WaWV3YAotICBpbiB5b3Vy
IGFwcGxpY2F0aW9ucy4KLQotICBAY2xhc3MgQ29yZVZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSAgQHVzZXMgRW1iZXIuRXZlbnRlZAotICBAdXNlcyBF
bWJlci5BY3Rpb25IYW5kbGVyCi0qLwotCi1FbWJlci5Db3JlVmlldyA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoRW1iZXIuRXZlbnRlZCwgRW1iZXIuQWN0aW9uSGFuZGxlciwgewotICBpc1ZpZXc6IHRy
dWUsCi0KLSAgc3RhdGVzOiBzdGF0ZXMsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fc3VwZXIoKTsKLSAgICB0aGlzLnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgSWYgdGhlIHZpZXcgaXMgY3VycmVudGx5IGluc2VydGVkIGludG8gdGhlIERP
TSBvZiBhIHBhcmVudCB2aWV3LCB0aGlzCi0gICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUg
cGFyZW50IG9mIHRoZSB2aWV3LgotCi0gICAgQHByb3BlcnR5IHBhcmVudFZpZXcKLSAgICBAdHlw
ZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBwYXJlbnRWaWV3OiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50Vmll
dzsKLQotICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmlzVmlydHVhbCkgewotICAgICAgcmV0dXJu
IGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBw
YXJlbnQ7Ci0gICAgfQotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKLQotICBzdGF0ZTog
bnVsbCwKLQotICBfcGFyZW50VmlldzogbnVsbCwKLQotICAvLyByZXR1cm4gdGhlIGN1cnJlbnQg
dmlldywgbm90IGluY2x1ZGluZyB2aXJ0dWFsIHZpZXdzCi0gIGNvbmNyZXRlVmlldzogRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmlzVmlydHVhbCkgeyByZXR1cm4g
dGhpczsgfQotICAgIGVsc2UgeyByZXR1cm4gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7IH0KLSAg
fSkucHJvcGVydHkoJ3BhcmVudFZpZXcnKSwKLQotICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmll
dycsCi0KLSAgaW5zdHJ1bWVudERldGFpbHM6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICBoYXNoLm9i
amVjdCA9IHRoaXMudG9TdHJpbmcoKTsKLSAgfSwKLQotICAvKioKLSAgICBJbnZva2VkIGJ5IHRo
ZSB2aWV3IHN5c3RlbSB3aGVuIHRoaXMgdmlldyBuZWVkcyB0byBwcm9kdWNlIGFuIEhUTUwKLSAg
ICByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBuZXcgcmVuZGVyIGJ1
ZmZlciwgaWYgbmVlZGVkLAotICAgIHRoZW4gYXBwbHkgYW55IGRlZmF1bHQgYXR0cmlidXRlcywg
c3VjaCBhcyBjbGFzcyBuYW1lcyBhbmQgdmlzaWJpbGl0eS4KLSAgICBGaW5hbGx5LCB0aGUgYHJl
bmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yCi0gICAg
ZG9pbmcgdGhlIGJ1bGsgb2YgdGhlIHJlbmRlcmluZy4KLQotICAgIFlvdSBzaG91bGQgbm90IG5l
ZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IGluc3RlYWQsIGltcGxlbWVudCB0aGUKLSAgICBg
dGVtcGxhdGVgIHByb3BlcnR5LCBvciBpZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wsIG92ZXJyaWRl
IHRoZSBgcmVuZGVyYAotICAgIG1ldGhvZC4KLQotICAgIEBtZXRob2QgcmVuZGVyVG9CdWZmZXIK
LSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyIHRoZSByZW5kZXIgYnVmZmVy
LiBJZiBubyBidWZmZXIgaXMKLSAgICAgIHBhc3NlZCwgYSBkZWZhdWx0IGJ1ZmZlciwgdXNpbmcg
dGhlIGN1cnJlbnQgdmlldydzIGB0YWdOYW1lYCwgd2lsbAotICAgICAgYmUgdXNlZC4KLSAgICBA
cHJpdmF0ZQotICAqLwotICByZW5kZXJUb0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBi
dWZmZXJPcGVyYXRpb24pIHsKLSAgICB2YXIgbmFtZSA9ICdyZW5kZXIuJyArIHRoaXMuaW5zdHJ1
bWVudE5hbWUsCi0gICAgICAgIGRldGFpbHMgPSB7fTsKLQotICAgIHRoaXMuaW5zdHJ1bWVudERl
dGFpbHMoZGV0YWlscyk7Ci0KLSAgICByZXR1cm4gRW1iZXIuaW5zdHJ1bWVudChuYW1lLCBkZXRh
aWxzLCBmdW5jdGlvbiBpbnN0cnVtZW50UmVuZGVyVG9CdWZmZXIoKSB7Ci0gICAgICByZXR1cm4g
dGhpcy5fcmVuZGVyVG9CdWZmZXIocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pOwotICAg
IH0sIHRoaXMpOwotICB9LAotCi0gIF9yZW5kZXJUb0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVm
ZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKLSAgICAvLyBJZiB0aGlzIGlzIHRoZSB0b3AtbW9zdCB2
aWV3LCBzdGFydCBhIG5ldyBidWZmZXIuIE90aGVyd2lzZSwKLSAgICAvLyBjcmVhdGUgYSBuZXcg
YnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCB1c2luZyB0aGUKLSAgICAvLyBwcm92aWRl
ZCBidWZmZXIgb3BlcmF0aW9uIChmb3IgZXhhbXBsZSwgYGluc2VydEFmdGVyYCB3aWxsCi0gICAg
Ly8gaW5zZXJ0IGEgbmV3IGJ1ZmZlciBhZnRlciB0aGUgInBhcmVudCBidWZmZXIiKS4KLSAgICB2
YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZTsKLQotICAgIGlmICh0YWdOYW1lID09PSBudWxsIHx8
IHRhZ05hbWUgPT09IHVuZGVmaW5lZCkgewotICAgICAgdGFnTmFtZSA9ICdkaXYnOwotICAgIH0K
LQotICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciA9IHBhcmVudEJ1ZmZlciAmJiBwYXJlbnRC
dWZmZXIuYmVnaW4odGFnTmFtZSkgfHwgRW1iZXIuUmVuZGVyQnVmZmVyKHRhZ05hbWUpOwotICAg
IHRoaXMudHJhbnNpdGlvblRvKCdpbkJ1ZmZlcicsIGZhbHNlKTsKLQotICAgIHRoaXMuYmVmb3Jl
UmVuZGVyKGJ1ZmZlcik7Ci0gICAgdGhpcy5yZW5kZXIoYnVmZmVyKTsKLSAgICB0aGlzLmFmdGVy
UmVuZGVyKGJ1ZmZlcik7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotICB9LAotCi0gIC8qKgotICAg
IE92ZXJyaWRlIHRoZSBkZWZhdWx0IGV2ZW50IGZpcmluZyBmcm9tIGBFbWJlci5FdmVudGVkYCB0
bwotICAgIGFsc28gY2FsbCBtZXRob2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0KLSAgICBAbWV0
aG9kIHRyaWdnZXIKLSAgICBAcGFyYW0gbmFtZSB7U3RyaW5nfQotICAgIEBwcml2YXRlCi0gICov
Ci0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOwotICAgIHZhciBtZXRob2QgPSB0aGlzW25hbWVdOwotICAgIGlmIChtZXRo
b2QpIHsKLSAgICAgIHZhciBhcmdzID0gW10sIGksIGw7Ci0gICAgICBmb3IgKGkgPSAxLCBsID0g
YXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgICBhcmdzLnB1c2goYXJndW1l
bnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJncyk7
Ci0gICAgfQotICB9LAotCi0gIGRlcHJlY2F0ZWRTZW5kSGFuZGxlczogZnVuY3Rpb24oYWN0aW9u
TmFtZSkgewotICAgIHJldHVybiAhIXRoaXNbYWN0aW9uTmFtZV07Ci0gIH0sCi0KLSAgZGVwcmVj
YXRlZFNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5hbWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNl
LmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBFbWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMg
dGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSArICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0aW9uIiwg
dHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicpOwotICAgIEVtYmVyLmRlcHJl
Y2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGltcGxlbWVudGVkIGRpcmVjdGx5IG9uIHZpZXdzIGFyZSBk
ZXByZWNhdGVkIGluIGZhdm9yIG9mIGFjdGlvbiBoYW5kbGVycyBvbiBhbiBgYWN0aW9uc2Agb2Jq
ZWN0ICgnICsgYWN0aW9uTmFtZSArICcgb24gJyArIHRoaXMgKyAnKScsIGZhbHNlKTsKLSAgICB0
aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpOwotICAgIHJldHVybjsKLSAgfSwKLQot
ICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIudHlwZU9mKHRoaXNbbmFt
ZV0pID09PSAnZnVuY3Rpb24nIHx8IHRoaXMuX3N1cGVyKG5hbWUpOwotICB9LAotCi0gIGRlc3Ry
b3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3OwotCi0g
ICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJldHVybjsgfQotCi0gICAgLy8gZGVzdHJveSB0aGUg
ZWxlbWVudCAtLSB0aGlzIHdpbGwgYXZvaWQgZWFjaCBjaGlsZCB2aWV3IGRlc3Ryb3lpbmcKLSAg
ICAvLyB0aGUgZWxlbWVudCBvdmVyIGFuZCBvdmVyIGFnYWluLi4uCi0gICAgaWYgKCF0aGlzLnJl
bW92ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQoKTsgfQotCi0gICAgLy8gcmVtb3Zl
IGZyb20gcGFyZW50IGlmIGZvdW5kLiBEb24ndCBjYWxsIHJlbW92ZUZyb21QYXJlbnQsCi0gICAg
Ly8gYXMgcmVtb3ZlRnJvbVBhcmVudCB3aWxsIHRyeSB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJv
bQotICAgIC8vIHRoZSBET00gYWdhaW4uCi0gICAgaWYgKHBhcmVudCkgeyBwYXJlbnQucmVtb3Zl
Q2hpbGQodGhpcyk7IH0KLQotICAgIHRoaXMudHJhbnNpdGlvblRvKCdkZXN0cm95aW5nJywgZmFs
c2UpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgY2xlYXJSZW5kZXJlZENoaWxkcmVu
OiBFbWJlci5LLAotICB0cmlnZ2VyUmVjdXJzaXZlbHk6IEVtYmVyLkssCi0gIGludm9rZVJlY3Vy
c2l2ZWx5OiBFbWJlci5LLAotICB0cmFuc2l0aW9uVG86IEVtYmVyLkssCi0gIGRlc3Ryb3lFbGVt
ZW50OiBFbWJlci5LCi19KTsKLQotdmFyIFZpZXdDb2xsZWN0aW9uID0gRW1iZXIuX1ZpZXdDb2xs
ZWN0aW9uID0gZnVuY3Rpb24oaW5pdGlhbFZpZXdzKSB7Ci0gIHZhciB2aWV3cyA9IHRoaXMudmll
d3MgPSBpbml0aWFsVmlld3MgfHwgW107Ci0gIHRoaXMubGVuZ3RoID0gdmlld3MubGVuZ3RoOwot
fTsKLQotVmlld0NvbGxlY3Rpb24ucHJvdG90eXBlID0gewotICBsZW5ndGg6IDAsCi0KLSAgdHJp
Z2dlcjogZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0gICAgdmFyIHZpZXdzID0gdGhpcy52aWV3cywg
dmlldzsKLSAgICBmb3IgKHZhciBpID0gMCwgbCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykg
ewotICAgICAgdmlldyA9IHZpZXdzW2ldOwotICAgICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3
LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAgIH0KLSAgfSwKLQotICB0cmlnZ2VyUmVjdXJzaXZl
bHk6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0g
ICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAg
IHZpZXdzW2ldLnRyaWdnZXJSZWN1cnNpdmVseShldmVudE5hbWUpOwotICAgIH0KLSAgfSwKLQot
ICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rpb24oZm4pIHsKLSAgICB2YXIgdmlld3MgPSB0aGlz
LnZpZXdzLCB2aWV3OwotCi0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKLSAgICAgIHZpZXcgPSB2aWV3c1tpXTsKLSAgICAgIGZuKHZpZXcpOwotICAg
IH0KLSAgfSwKLQotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0YXRlLCBjaGlsZHJlbikgewot
ICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3
cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIHZpZXdzW2ldLnRyYW5zaXRpb25UbyhzdGF0
ZSwgY2hpbGRyZW4pOwotICAgIH0KLSAgfSwKLQotICBwdXNoOiBmdW5jdGlvbigpIHsKLSAgICB0
aGlzLmxlbmd0aCArPSBhcmd1bWVudHMubGVuZ3RoOwotICAgIHZhciB2aWV3cyA9IHRoaXMudmll
d3M7Ci0gICAgcmV0dXJuIHZpZXdzLnB1c2guYXBwbHkodmlld3MsIGFyZ3VtZW50cyk7Ci0gIH0s
Ci0KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVybiB0aGlzLnZpZXdzW2lk
eF07Ci0gIH0sCi0KLSAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICB2YXIgdmll
d3MgPSB0aGlzLnZpZXdzOwotICAgIHJldHVybiBhX2ZvckVhY2godmlld3MsIGNhbGxiYWNrKTsK
LSAgfSwKLQotICBjbGVhcjogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sZW5ndGggPSAwOwotICAg
IHRoaXMudmlld3MubGVuZ3RoID0gMDsKLSAgfQotfTsKLQotdmFyIEVNUFRZX0FSUkFZID0gW107
Ci0KLS8qKgotICBgRW1iZXIuVmlld2AgaXMgdGhlIGNsYXNzIGluIEVtYmVyIHJlc3BvbnNpYmxl
IGZvciBlbmNhcHN1bGF0aW5nIHRlbXBsYXRlcyBvZgotICBIVE1MIGNvbnRlbnQsIGNvbWJpbmlu
ZyB0ZW1wbGF0ZXMgd2l0aCBkYXRhIHRvIHJlbmRlciBhcyBzZWN0aW9ucyBvZiBhIHBhZ2Uncwot
ICBET00sIGFuZCByZWdpc3RlcmluZyBhbmQgcmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBl
dmVudHMuCi0KLSAgIyMgSFRNTCBUYWcKLQotICBUaGUgZGVmYXVsdCBIVE1MIHRhZyBuYW1lIHVz
ZWQgZm9yIGEgdmlldydzIERPTSByZXByZXNlbnRhdGlvbiBpcyBgZGl2YC4gVGhpcwotICBjYW4g
YmUgY3VzdG9taXplZCBieSBzZXR0aW5nIHRoZSBgdGFnTmFtZWAgcHJvcGVydHkuIFRoZSBmb2xs
b3dpbmcgdmlldwotICBjbGFzczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIFBhcmFncmFwaFZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2VtJwotICB9KTsKLSAgYGBgCi0K
LSAgV291bGQgcmVzdWx0IGluIGluc3RhbmNlcyB3aXRoIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQot
ICBgYGBodG1sCi0gIDxlbSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+PC9lbT4KLSAg
YGBgCi0KLSAgIyMgSFRNTCBgY2xhc3NgIEF0dHJpYnV0ZQotCi0gIFRoZSBIVE1MIGBjbGFzc2Ag
YXR0cmlidXRlIG9mIGEgdmlldydzIHRhZyBjYW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhCi0gIGBj
bGFzc05hbWVzYCBwcm9wZXJ0eSB0aGF0IGlzIHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNs
YXNzTmFtZXM6IFsnbXktY2xhc3MnLCAnbXktb3RoZXItY2xhc3MnXQotICB9KTsKLSAgYGBgCi0K
LSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0
aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll
dyBteS1jbGFzcyBteS1vdGhlci1jbGFzcyI+PC9kaXY+Ci0gIGBgYAotCi0gIGBjbGFzc2AgYXR0
cmlidXRlIHZhbHVlcyBjYW4gYWxzbyBiZSBzZXQgYnkgcHJvdmlkaW5nIGEgYGNsYXNzTmFtZUJp
bmRpbmdzYAotICBwcm9wZXJ0eSBzZXQgdG8gYW4gYXJyYXkgb2YgcHJvcGVydGllcyBuYW1lcyBm
b3IgdGhlIHZpZXcuIFRoZSByZXR1cm4gdmFsdWUKLSAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxs
IGJlIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHZhbHVlIGZvciB0aGUgdmlldydzIGBjbGFzc2AKLSAg
YXR0cmlidXRlLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBjb21wdXRlZCBwcm9wZXJ0aWVzOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ3Byb3BlcnR5QScsICdwcm9wZXJ0eUInXSwKLSAgICBwcm9wZXJ0
eUE6ICdmcm9tLWEnLAotICAgIHByb3BlcnR5QjogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoc29t
ZUxvZ2ljKSB7IHJldHVybiAnZnJvbS1iJzsgfQotICAgIH0ucHJvcGVydHkoKQotICB9KTsKLSAg
YGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJl
c2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1i
ZXItdmlldyBmcm9tLWEgZnJvbS1iIj48L2Rpdj4KLSAgYGBgCi0KLSAgSWYgdGhlIHZhbHVlIG9m
IGEgY2xhc3MgbmFtZSBiaW5kaW5nIHJldHVybnMgYSBib29sZWFuIHRoZSBwcm9wZXJ0eSBuYW1l
Ci0gIGl0c2VsZiB3aWxsIGJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5
IGlzIHRydWUuIFRoZSBjbGFzcyBuYW1lCi0gIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZSB2YWx1
ZSBpcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2hvdmVyZWQn
XSwKLSAgICBob3ZlcmVkOiB0cnVlCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2
aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRt
bAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGhvdmVyZWQiPjwvZGl2Pgot
ICBgYGAKLQotICBXaGVuIHVzaW5nIGJvb2xlYW4gY2xhc3MgbmFtZSBiaW5kaW5ncyB5b3UgY2Fu
IHN1cHBseSBhIHN0cmluZyB2YWx1ZSBvdGhlcgotICB0aGFuIHRoZSBwcm9wZXJ0eSBuYW1lIGZv
ciB1c2UgYXMgdGhlIGBjbGFzc2AgSFRNTCBhdHRyaWJ1dGUgYnkgYXBwZW5kaW5nIHRoZQotICBw
cmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIgY2hhcmFjdGVyIHdoZW4gZGVmaW5pbmcgdGhlIGJp
bmRpbmc6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
Ci0gICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnYXdlc29tZTpzby12ZXJ5LWNvb2wnXSwKLSAgICBh
d2Vzb21lOiB0cnVlCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3Rh
bmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2
IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+Ci0gIGBg
YAotCi0gIEJvb2xlYW4gdmFsdWUgY2xhc3MgbmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBu
YW1lcyBhcmUgaW4gYQotICBjYW1lbENhc2Utc3R5bGUgZm9ybWF0IHdpbGwgYmUgY29udmVydGVk
IHRvIGEgZGFzaGVyaXplZCBmb3JtYXQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNVcmdlbnQnXSwK
LSAgICBpc1VyZ2VudDogdHJ1ZQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwK
LSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBpcy11cmdlbnQiPjwvZGl2Pgot
ICBgYGAKLQotICBDbGFzcyBuYW1lIGJpbmRpbmdzIGNhbiBhbHNvIHJlZmVyIHRvIG9iamVjdCB2
YWx1ZXMgdGhhdCBhcmUgZm91bmQgYnkKLSAgdHJhdmVyc2luZyBhIHBhdGggcmVsYXRpdmUgdG8g
dGhlIHZpZXcgaXRzZWxmOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmll
dy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ21lc3NhZ2VzLmVtcHR5J10KLSAg
ICBtZXNzYWdlczogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICBlbXB0eTogdHJ1ZQotICAg
IH0pCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3IGVtcHR5Ij48L2Rpdj4KLSAgYGBgCi0KLSAgSWYgeW91IHdh
bnQgdG8gYWRkIGEgY2xhc3MgbmFtZSBmb3IgYSBwcm9wZXJ0eSB3aGljaCBldmFsdWF0ZXMgdG8g
dHJ1ZSBhbmQKLSAgYW5kIGEgZGlmZmVyZW50IGNsYXNzIG5hbWUgaWYgaXQgZXZhbHVhdGVzIHRv
IGZhbHNlLCB5b3UgY2FuIHBhc3MgYSBiaW5kaW5nCi0gIGxpa2UgdGhpczoKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIC8vIEFwcGxpZXMgJ2VuYWJsZWQnIGNsYXNzIHdoZW4gaXNFbmFibGVkIGlzIHRy
dWUgYW5kICdkaXNhYmxlZCcgd2hlbiBpc0VuYWJsZWQgaXMgZmFsc2UKLSAgRW1iZXIuVmlldy5l
eHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzRW5hYmxlZDplbmFibGVkOmRpc2Fi
bGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0
IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBg
YGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZW5hYmxlZCI+PC9k
aXY+Ci0gIGBgYAotCi0gIFdoZW4gaXNFbmFibGVkIGlzIGBmYWxzZWAsIHRoZSByZXN1bHRpbmcg
SFRNTCByZXByZW5zZW50YXRpb24gbG9va3MgbGlrZQotICB0aGlzOgotCi0gIGBgYGh0bWwKLSAg
PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+Ci0gIGBg
YAotCi0gIFRoaXMgc3ludGF4IG9mZmVycyB0aGUgY29udmVuaWVuY2UgdG8gYWRkIGEgY2xhc3Mg
aWYgYSBwcm9wZXJ0eSBpcyBgZmFsc2VgOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgLy8gQXBwbGll
cyBubyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBpcyB0cnVlIGFuZCBjbGFzcyAnZGlzYWJsZWQnIHdo
ZW4gaXNFbmFibGVkIGlzIGZhbHNlCi0gIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFzc05h
bWVCaW5kaW5nczogWydpc0VuYWJsZWQ6OmRpc2FibGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUK
LSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIg
Y2xhc3M9ImVtYmVyLXZpZXciPjwvZGl2PgotICBgYGAKLQotICBXaGVuIHRoZSBgaXNFbmFibGVk
YCBwcm9wZXJ0eSBvbiB0aGUgdmlldyBpcyBzZXQgdG8gYGZhbHNlYCwgaXQgd2lsbCByZXN1bHQK
LSAgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0g
IGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+
PC9kaXY+Ci0gIGBgYAotCi0gIFVwZGF0ZXMgdG8gdGhlIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5h
bWUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBhdXRvbWF0aWMKLSAgdXBkYXRlIG9mIHRoZSAgSFRN
TCBgY2xhc3NgIGF0dHJpYnV0ZSBpbiB0aGUgdmlldydzIHJlbmRlcmVkIEhUTUwKLSAgcmVwcmVz
ZW50YXRpb24uIElmIHRoZSB2YWx1ZSBiZWNvbWVzIGBmYWxzZWAgb3IgYHVuZGVmaW5lZGAgdGhl
IGNsYXNzIG5hbWUKLSAgd2lsbCBiZSByZW1vdmVkLgotCi0gIEJvdGggYGNsYXNzTmFtZXNgIGFu
ZCBgY2xhc3NOYW1lQmluZGluZ3NgIGFyZSBjb25jYXRlbmF0ZWQgcHJvcGVydGllcy4gU2VlCi0g
IFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nlcy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRh
dGlvbiBmb3IgbW9yZQotICBpbmZvcm1hdGlvbiBhYm91dCBjb25jYXRlbmF0ZWQgcHJvcGVydGll
cy4KLQotICAjIyBIVE1MIEF0dHJpYnV0ZXMKLQotICBUaGUgSFRNTCBhdHRyaWJ1dGUgc2VjdGlv
biBvZiBhIHZpZXcncyB0YWcgY2FuIGJlIHNldCBieSBwcm92aWRpbmcgYW4KLSAgYGF0dHJpYnV0
ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb24g
dGhlIHZpZXcuCi0gIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJl
IHVzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSB2aWV3J3MKLSAgSFRNTCBhc3NvY2lhdGVkIGF0dHJp
YnV0ZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFuY2hvclZpZXcgPSBFbWJlci5WaWV3LmV4dGVu
ZCh7Ci0gICAgdGFnTmFtZTogJ2EnLAotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2hyZWYnXSwK
LSAgICBocmVmOiAnaHR0cDovL2dvb2dsZS5jb20nCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJl
c3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0K
LSAgYGBgaHRtbAotICA8YSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0
cDovL2dvb2dsZS5jb20iPjwvYT4KLSAgYGBgCi0KLSAgSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBh
biBgYXR0cmlidXRlQmluZGluZ3NgIG1vbml0b3JlZCBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4KLSAg
dGhlIHByb3BlcnR5IHdpbGwgZm9sbG93IEhUTUwncyBwYXR0ZXJuIG9mIHJlcGVhdGluZyB0aGUg
YXR0cmlidXRlJ3MgbmFtZSBhcwotICBpdHMgdmFsdWU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBN
eVRleHRJbnB1dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0YWdOYW1lOiAnaW5wdXQnLAot
ICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2Rpc2FibGVkJ10sCi0gICAgZGlzYWJsZWQ6IHRydWUK
LSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxpbnB1dCBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPgotICBgYGAKLQotICBg
YXR0cmlidXRlQmluZGluZ3NgIGNhbiByZWZlciB0byBjb21wdXRlZCBwcm9wZXJ0aWVzOgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgTXlUZXh0SW5wdXQgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
dGFnTmFtZTogJ2lucHV0JywKLSAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydkaXNhYmxlZCddLAot
ICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsKLSAgICAgIGlmIChzb21lTG9naWMpIHsKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICB9Ci0gICAgfS5wcm9wZXJ0eSgpCi0gIH0pOwotICBgYGAKLQotICBVcGRhdGVzIHRvIHRo
ZSB0aGUgcHJvcGVydHkgb2YgYW4gYXR0cmlidXRlIGJpbmRpbmcgd2lsbCByZXN1bHQgaW4gYXV0
b21hdGljCi0gIHVwZGF0ZSBvZiB0aGUgIEhUTUwgYXR0cmlidXRlIGluIHRoZSB2aWV3J3MgcmVu
ZGVyZWQgSFRNTCByZXByZXNlbnRhdGlvbi4KLQotICBgYXR0cmlidXRlQmluZGluZ3NgIGlzIGEg
Y29uY2F0ZW5hdGVkIHByb3BlcnR5LiBTZWUgW0VtYmVyLk9iamVjdF0oL2FwaS9jbGFzc2VzL0Vt
YmVyLk9iamVjdC5odG1sKQotICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFi
b3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzLgotCi0gICMjIFRlbXBsYXRlcwotCi0gIFRoZSBI
VE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJlbmRlcmVkIHJlcHJlc2VudGF0aW9uIGFyZSBkZXRl
cm1pbmVkIGJ5IGl0cwotICB0ZW1wbGF0ZS4gVGVtcGxhdGVzIGNhbiBiZSBhbnkgZnVuY3Rpb24g
dGhhdCBhY2NlcHRzIGFuIG9wdGlvbmFsIGNvbnRleHQKLSAgcGFyYW1ldGVyIGFuZCByZXR1cm5z
IGEgc3RyaW5nIG9mIEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIHdpdGhpbiB0aGUKLSAgdmll
dydzIHRhZy4gTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEg
Y29tcGlsZWQKLSAgYEVtYmVyLkhhbmRsZWJhcnNgIHRlbXBsYXRlLgotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhh
bmRsZWJhcnMuY29tcGlsZSgnSSBhbSB0aGUgdGVtcGxhdGUnKQotICB9KTsKLSAgYGBgCi0KLSAg
V2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9u
IG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+
SSBhbSB0aGUgdGVtcGxhdGU8L2Rpdj4KLSAgYGBgCi0KLSAgV2l0aGluIGFuIEVtYmVyIGFwcGxp
Y2F0aW9uIGlzIG1vcmUgY29tbW9uIHRvIGRlZmluZSBhIEhhbmRsZWJhcnMgdGVtcGxhdGVzIGFz
Ci0gIHBhcnQgb2YgYSBwYWdlOgotCi0gIGBgYGh0bWwKLSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gt
aGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdzb21lLXRlbXBsYXRlJz4KLSAgICBIZWxs
bwotICA8L3NjcmlwdD4KLSAgYGBgCi0KLSAgQW5kIGFzc29jaWF0ZSBpdCBieSBuYW1lIHVzaW5n
IGEgdmlldydzIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
QVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGVOYW1lOiAnc29tZS10ZW1w
bGF0ZScKLSAgfSk7Ci0gIGBgYAotCi0gIElmIHlvdSBoYXZlIG5lc3RlZCByZXNvdXJjZXMsIHlv
dXIgSGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxsIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGh0bWwK
LSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gtaGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdw
b3N0cy9uZXcnPgotICAgIDxoMT5OZXcgUG9zdDwvaDE+Ci0gIDwvc2NyaXB0PgotICBgYGAKLQot
ICBBbmQgYHRlbXBsYXRlTmFtZWAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBVmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZU5hbWU6ICdwb3N0cy9uZXcnCi0g
IH0pOwotICBgYGAKLQotICBVc2luZyBhIHZhbHVlIGZvciBgdGVtcGxhdGVOYW1lYCB0aGF0IGRv
ZXMgbm90IGhhdmUgYSBIYW5kbGViYXJzIHRlbXBsYXRlCi0gIHdpdGggYSBtYXRjaGluZyBgZGF0
YS10ZW1wbGF0ZS1uYW1lYCBhdHRyaWJ1dGUgd2lsbCB0aHJvdyBhbiBlcnJvci4KLQotICBGb3Ig
dmlld3MgY2xhc3NlcyB0aGF0IG1heSBoYXZlIGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5n
LiBhcyB0aGUgYmxvY2sKLSAgcG9ydGlvbiBvZiBhIGB7e3ZpZXd9fWAgSGFuZGxlYmFycyBoZWxw
ZXIgY2FsbCBpbiBhbm90aGVyIHRlbXBsYXRlIG9yIGluCi0gIGEgc3ViY2xhc3MpLCB5b3UgY2Fu
IHByb3ZpZGUgYSBgZGVmYXVsdFRlbXBsYXRlYCBwcm9wZXJ0eSBzZXQgdG8gY29tcGlsZWQKLSAg
dGVtcGxhdGUgZnVuY3Rpb24uIElmIGEgdGVtcGxhdGUgaXMgbm90IGxhdGVyIHByb3ZpZGVkIGZv
ciB0aGUgdmlldyBpbnN0YW5jZQotICB0aGUgYGRlZmF1bHRUZW1wbGF0ZWAgdmFsdWUgd2lsbCBi
ZSB1c2VkOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
Ci0gICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kgd2FzIHRo
ZSBkZWZhdWx0JyksCi0gICAgdGVtcGxhdGU6IG51bGwsCi0gICAgdGVtcGxhdGVOYW1lOiBudWxs
Ci0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCBhbiBIVE1M
IHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFz
cz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIGRlZmF1bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYSBg
dGVtcGxhdGVgIG9yIGB0ZW1wbGF0ZU5hbWVgIGlzIHByb3ZpZGVkIGl0IHdpbGwgdGFrZSBwcmVj
ZWRlbmNlIG92ZXIKLSAgYGRlZmF1bHRUZW1wbGF0ZWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBB
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhh
bmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhlIGRlZmF1bHQnKQotICB9KTsKLQotICBhVmlldyA9
IEFWaWV3LmNyZWF0ZSh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgn
SSB3YXMgdGhlIHRlbXBsYXRlLCBub3QgZGVmYXVsdCcpCi0gIH0pOwotICBgYGAKLQotICBXaWxs
IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgcmVwcmVzZW50YXRpb24gd2hlbiByZW5kZXJl
ZDoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkkg
d2FzIHRoZSB0ZW1wbGF0ZSwgbm90IGRlZmF1bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgIyMgVmlldyBD
b250ZXh0Ci0KLSAgVGhlIGRlZmF1bHQgY29udGV4dCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUg
aXMgdGhlIHZpZXcncyBjb250cm9sbGVyOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGls
ZSgnSGVsbG8ge3tleGNpdGVkR3JlZXRpbmd9fScpCi0gIH0pOwotCi0gIGFDb250cm9sbGVyID0g
RW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1lOiAnQmFycnknLAotICAgIGV4Y2l0
ZWRHcmVldGluZzogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gdGhpcy5nZXQoImNvbnRlbnQu
Zmlyc3ROYW1lIikgKyAiISEhIgotICAgIH0ucHJvcGVydHkoKQotICB9KTsKLQotICBhVmlldyA9
IEFWaWV3LmNyZWF0ZSh7Ci0gICAgY29udHJvbGxlcjogYUNvbnRyb2xsZXIsCi0gIH0pOwotICBg
YGAKLQotICBXaWxsIHJlc3VsdCBpbiBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBg
YGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SGVsbG8gQmFycnkh
ISE8L2Rpdj4KLSAgYGBgCi0KLSAgQSBjb250ZXh0IGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgc3Vw
cGxpZWQgdGhyb3VnaCB0aGUgdmlldydzIGBjb250ZXh0YAotICBwcm9wZXJ0eS4gSWYgdGhlIHZp
ZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5vciBgY29udHJvbGxlcmAgcHJvcGVydGllcywgdGhl
Ci0gIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQgd2lsbCBiZSB1c2VkLgotCi0gICMjIExheW91dHMK
LQotICBWaWV3cyBjYW4gaGF2ZSBhIHNlY29uZGFyeSB0ZW1wbGF0ZSB0aGF0IHdyYXBzIHRoZWly
IG1haW4gdGVtcGxhdGUuIExpa2UKLSAgcHJpbWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJl
IGFueSBmdW5jdGlvbiB0aGF0ICBhY2NlcHRzIGFuIG9wdGlvbmFsCi0gIGNvbnRleHQgcGFyYW1l
dGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9mIEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIGlu
c2lkZQotICB2aWV3J3MgdGFnLiBWaWV3cyB3aG9zZSBIVE1MIGVsZW1lbnQgaXMgc2VsZiBjbG9z
aW5nIChlLmcuIGA8aW5wdXQgLz5gKQotICBjYW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBw
cm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCi0KLSAgTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgYSBs
YXlvdXQgd2lsbCBiZSBhIGNvbXBpbGVkIGBFbWJlci5IYW5kbGViYXJzYAotICB0ZW1wbGF0ZS4K
LQotICBBIHZpZXcncyBsYXlvdXQgY2FuIGJlIHNldCBkaXJlY3RseSB3aXRoIHRoZSBgbGF5b3V0
YCBwcm9wZXJ0eSBvciByZWZlcmVuY2UKLSAgYW4gZXhpc3RpbmcgSGFuZGxlYmFycyB0ZW1wbGF0
ZSBieSBuYW1lIHdpdGggdGhlIGBsYXlvdXROYW1lYCBwcm9wZXJ0eS4KLQotICBBIHRlbXBsYXRl
IHVzZWQgYXMgYSBsYXlvdXQgbXVzdCBjb250YWluIGEgc2luZ2xlIHVzZSBvZiB0aGUgSGFuZGxl
YmFycwotICBge3t5aWVsZH19YCBoZWxwZXIuIFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydz
IHJlbmRlcmVkIGB0ZW1wbGF0ZWAgd2lsbCBiZQotICBpbnNlcnRlZCBhdCB0aGlzIGxvY2F0aW9u
OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXdXaXRoTGF5b3V0ID0gRW1iZXIuVmlldy5leHRl
bmQoewotICAgIGxheW91dDogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCI8ZGl2IGNsYXNzPSdt
eS1kZWNvcmF0aXZlLWNsYXNzJz57e3lpZWxkfX08L2Rpdj4iKQotICAgIHRlbXBsYXRlOiBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoIkkgZ290IHdyYXBwZWQiKSwKLSAgfSk7Ci0gIGBgYAotCi0g
IFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlv
biBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXci
PgotICAgIDxkaXYgY2xhc3M9Im15LWRlY29yYXRpdmUtY2xhc3MiPgotICAgICAgSSBnb3Qgd3Jh
cHBlZAotICAgIDwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgU2VlIFtFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMueWllbGRdKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMu
aHRtbCNtZXRob2RfeWllbGQpCi0gIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICMjIFJlc3Bv
bmRpbmcgdG8gQnJvd3NlciBFdmVudHMKLQotICBWaWV3cyBjYW4gcmVzcG9uZCB0byB1c2VyLWlu
aXRpYXRlZCBldmVudHMgaW4gb25lIG9mIHRocmVlIHdheXM6IG1ldGhvZAotICBpbXBsZW1lbnRh
dGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5hZ2VyLCBhbmQgdGhyb3VnaCBge3thY3Rpb259fWAg
aGVscGVyIHVzZQotICBpbiB0aGVpciB0ZW1wbGF0ZSBvciBsYXlvdXQuCi0KLSAgIyMjIE1ldGhv
ZCBJbXBsZW1lbnRhdGlvbgotCi0gIFZpZXdzIGNhbiByZXNwb25kIHRvIHVzZXItaW5pdGlhdGVk
IGV2ZW50cyBieSBpbXBsZW1lbnRpbmcgYSBtZXRob2QgdGhhdAotICBtYXRjaGVzIHRoZSBldmVu
dCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUKLSAg
YXJndW1lbnQgdG8gdGhpcyBtZXRob2QuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgIC8v
IHdpbGwgYmUgY2FsbGVkIHdoZW4gd2hlbiBhbiBpbnN0YW5jZSdzCi0gICAgICAvLyByZW5kZXJl
ZCBlbGVtZW50IGlzIGNsaWNrZWQKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICAjIyMgRXZlbnQg
TWFuYWdlcnMKLQotICBWaWV3cyBjYW4gZGVmaW5lIGFuIG9iamVjdCBhcyB0aGVpciBgZXZlbnRN
YW5hZ2VyYCBwcm9wZXJ0eS4gVGhpcyBvYmplY3QgY2FuCi0gIHRoZW4gaW1wbGVtZW50IG1ldGhv
ZHMgdGhhdCBtYXRjaCB0aGUgZGVzaXJlZCBldmVudCBuYW1lcy4gTWF0Y2hpbmcgZXZlbnRzCi0g
IHRoYXQgb2NjdXIgb24gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MIG9yIHRoZSByZW5kZXJlZCBI
VE1MIG9mIGFueSBvZiBpdHMgRE9NCi0gIGRlc2NlbmRhbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG1l
dGhvZC4gQSBgalF1ZXJ5LkV2ZW50YCBvYmplY3Qgd2lsbCBiZSBwYXNzZWQKLSAgYXMgdGhlIGZp
cnN0IGFyZ3VtZW50IHRvIHRoZSBtZXRob2QgYW5kIGFuICBgRW1iZXIuVmlld2Agb2JqZWN0IGFz
IHRoZQotICBzZWNvbmQuIFRoZSBgRW1iZXIuVmlld2Agd2lsbCBiZSB0aGUgdmlldyB3aG9zZSBy
ZW5kZXJlZCBIVE1MIHdhcyBpbnRlcmFjdGVkCi0gIHdpdGguIFRoaXMgbWF5IGJlIHRoZSB2aWV3
IHdpdGggdGhlIGBldmVudE1hbmFnZXJgIHByb3BlcnR5IG9yIG9uZSBvZiBpdHMKLSAgZGVzY2Vu
ZGVudCB2aWV3cy4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoewotICAgIGV2ZW50TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICBkb3Vi
bGVDbGljazogZnVuY3Rpb24oZXZlbnQsIHZpZXcpIHsKLSAgICAgICAgLy8gd2lsbCBiZSBjYWxs
ZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNlJ3MKLSAgICAgICAgLy8gcmVuZGVyZWQgZWxlbWVudCBv
ciBhbnkgcmVuZGVyaW5nCi0gICAgICAgIC8vIG9mIHRoaXMgdmlld3MncyBkZXNjZW5kZW50Ci0g
ICAgICAgIC8vIGVsZW1lbnRzIGlzIGNsaWNrZWQKLSAgICAgIH0KLSAgICB9KQotICB9KTsKLSAg
YGBgCi0KLSAgQW4gZXZlbnQgZGVmaW5lZCBmb3IgYW4gZXZlbnQgbWFuYWdlciB0YWtlcyBwcmVj
ZWRlbmNlIG92ZXIgZXZlbnRzIG9mIHRoZQotICBzYW1lIG5hbWUgaGFuZGxlZCB0aHJvdWdoIG1l
dGhvZHMgb24gdGhlIHZpZXcuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZp
ZXcuZXh0ZW5kKHsKLSAgICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCkgewotICAgICAgLy8g
d2lsbCBuZXZlciB0cmlnZ2VyLgotICAgIH0sCi0gICAgZXZlbnRNYW5hZ2VyOiBFbWJlci5PYmpl
Y3QuY3JlYXRlKHsKLSAgICAgIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKGV2ZW50LCB2aWV3KSB7Ci0g
ICAgICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBBVmlldyNtb3VzZUVudGVyCi0gICAgICB9
Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIFNpbWlsYXJseSBhIHZpZXcncyBldmVudCBtYW5h
Z2VyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIGZvciBldmVudHMgb2YgYW55IHZpZXdzCi0gIHJlbmRl
cmVkIGFzIGEgZGVzY2VuZGVudC4gQSBtZXRob2QgbmFtZSB0aGF0IG1hdGNoZXMgYW4gZXZlbnQg
bmFtZSB3aWxsIG5vdAotICBiZSBjYWxsZWQgaWYgdGhlIHZpZXcgaW5zdGFuY2Ugd2FzIHJlbmRl
cmVkIGluc2lkZSB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZgotICBhIHZpZXcgdGhhdCBoYXMg
YW4gYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgZGVmaW5lZCB0aGF0IGhhbmRsZXMgZXZlbnRzIG9m
IHRoZQotICBuYW1lLiBFdmVudHMgbm90IGhhbmRsZWQgYnkgdGhlIGV2ZW50IG1hbmFnZXIgd2ls
bCBzdGlsbCB0cmlnZ2VyIG1ldGhvZCBjYWxscwotICBvbiB0aGUgZGVzY2VuZGVudC4KLQotICBg
YGBqYXZhc2NyaXB0Ci0gIE91dGVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJvdXRlciB7eyN2aWV3IElubmVyVmlld319
aW5uZXJ7ey92aWV3fX0gb3V0ZXIiKSwKLSAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5j
cmVhdGUoewotICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQsIHZpZXcpIHsKLSAgICAg
ICAgLy8gdmlldyBtaWdodCBiZSBpbnN0YW5jZSBvZiBlaXRoZXIKLSAgICAgICAgLy8gT3V0ZXJW
aWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcgb24KLSAgICAgICAgLy8gd2hlcmUgb24gdGhlIHBh
Z2UgdGhlIHVzZXIgaW50ZXJhY3Rpb24gb2NjdXJlZAotICAgICAgfQotICAgIH0pCi0gIH0pOwot
Ci0gIElubmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGljazogZnVuY3Rpb24o
ZXZlbnQpIHsKLSAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQotICAg
ICAgLy8gYW4gT3V0ZXJWaWV3IGJlY2F1c2UgT3V0ZXJWaWV3J3MKLSAgICAgIC8vIGV2ZW50TWFu
YWdlciBkb2Vzbid0IGhhbmRsZSBjbGljayBldmVudHMKLSAgICB9LAotICAgIG1vdXNlRW50ZXI6
IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICAvLyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpZiByZW5k
ZXJlZCBpbnNpZGUKLSAgICAgIC8vIGFuIE91dGVyVmlldy4KLSAgICB9Ci0gIH0pOwotICBgYGAK
LQotICAjIyMgSGFuZGxlYmFycyBge3thY3Rpb259fWAgSGVscGVyCi0KLSAgU2VlIFtIYW5kbGVi
YXJzLmhlbHBlcnMuYWN0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
Lmh0bWwjbWV0aG9kX2FjdGlvbikuCi0KLSAgIyMjIEV2ZW50IE5hbWVzCi0KLSAgQWxsIG9mIHRo
ZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVzIGRlc2NyaWJlZCBhYm92ZSByZXNwb25kIHRvIHRo
ZSBzYW1lIHNldAotICBvZiBldmVudHMuIFRoZSBuYW1lcyBvZiB0aGUgYnVpbHQtaW4gZXZlbnRz
IGFyZSBsaXN0ZWQgYmVsb3cuIChUaGUgaGFzaCBvZgotICBidWlsdC1pbiBldmVudHMgZXhpc3Rz
IGluIGBFbWJlci5FdmVudERpc3BhdGNoZXJgLikgQWRkaXRpb25hbCwgY3VzdG9tIGV2ZW50cwot
ICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2luZyBgRW1iZXIuQXBwbGljYXRpb24uY3VzdG9tRXZl
bnRzYC4KLQotICBUb3VjaCBldmVudHM6Ci0KLSAgKiBgdG91Y2hTdGFydGAKLSAgKiBgdG91Y2hN
b3ZlYAotICAqIGB0b3VjaEVuZGAKLSAgKiBgdG91Y2hDYW5jZWxgCi0KLSAgS2V5Ym9hcmQgZXZl
bnRzCi0KLSAgKiBga2V5RG93bmAKLSAgKiBga2V5VXBgCi0gICogYGtleVByZXNzYAotCi0gIE1v
dXNlIGV2ZW50cwotCi0gICogYG1vdXNlRG93bmAKLSAgKiBgbW91c2VVcGAKLSAgKiBgY29udGV4
dE1lbnVgCi0gICogYGNsaWNrYAotICAqIGBkb3VibGVDbGlja2AKLSAgKiBgbW91c2VNb3ZlYAot
ICAqIGBmb2N1c0luYAotICAqIGBmb2N1c091dGAKLSAgKiBgbW91c2VFbnRlcmAKLSAgKiBgbW91
c2VMZWF2ZWAKLQotICBGb3JtIGV2ZW50czoKLQotICAqIGBzdWJtaXRgCi0gICogYGNoYW5nZWAK
LSAgKiBgZm9jdXNJbmAKLSAgKiBgZm9jdXNPdXRgCi0gICogYGlucHV0YAotCi0gIEhUTUw1IGRy
YWcgYW5kIGRyb3AgZXZlbnRzOgotCi0gICogYGRyYWdTdGFydGAKLSAgKiBgZHJhZ2AKLSAgKiBg
ZHJhZ0VudGVyYAotICAqIGBkcmFnTGVhdmVgCi0gICogYGRyb3BgCi0gICogYGRyYWdFbmRgCi0K
LSAgIyMgSGFuZGxlYmFycyBge3t2aWV3fX1gIEhlbHBlcgotCi0gIE90aGVyIGBFbWJlci5WaWV3
YCBpbnN0YW5jZXMgY2FuIGJlIGluY2x1ZGVkIGFzIHBhcnQgb2YgYSB2aWV3J3MgdGVtcGxhdGUg
YnkKLSAgdXNpbmcgdGhlIGB7e3ZpZXd9fWAgSGFuZGxlYmFycyBoZWxwZXIuIFNlZSBbRW1iZXIu
SGFuZGxlYmFycy5oZWxwZXJzLnZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhl
bHBlcnMuaHRtbCNtZXRob2RfdmlldykKLSAgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0K
LSAgQGNsYXNzIFZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3Jl
VmlldwotKi8KLUVtYmVyLlZpZXcgPSBFbWJlci5Db3JlVmlldy5leHRlbmQoewotCi0gIGNvbmNh
dGVuYXRlZFByb3BlcnRpZXM6IFsnY2xhc3NOYW1lcycsICdjbGFzc05hbWVCaW5kaW5ncycsICdh
dHRyaWJ1dGVCaW5kaW5ncyddLAotCi0gIC8qKgotICAgIEBwcm9wZXJ0eSBpc1ZpZXcKLSAgICBA
dHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgdHJ1ZQotICAgIEBzdGF0aWMKLSAgKi8KLSAgaXNW
aWV3OiB0cnVlLAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gVEVNUExBVEUgU1VQUE9SVAotICAvLwotCi0gIC8q
KgotICAgIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUg
aXMgcHJvdmlkZWQuCi0KLSAgICBCeSBkZWZhdWx0IGBFbWJlci5WaWV3YCB3aWxsIGxvb2t1cCBh
IHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGluCi0gICAgYEVtYmVyLlRFTVBMQVRFU2AgKGEgc2hh
cmVkIGdsb2JhbCBvYmplY3QpLgotCi0gICAgQHByb3BlcnR5IHRlbXBsYXRlTmFtZQotICAgIEB0
eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgdGVtcGxhdGVOYW1lOiBudWxs
LAotCi0gIC8qKgotICAgIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgdG8gbG9va3VwIGlmIG5vIGxh
eW91dCBpcyBwcm92aWRlZC4KLQotICAgIEJ5IGRlZmF1bHQgYEVtYmVyLlZpZXdgIHdpbGwgbG9v
a3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgaW4KLSAgICBgRW1iZXIuVEVNUExBVEVTYCAo
YSBzaGFyZWQgZ2xvYmFsIG9iamVjdCkuCi0KLSAgICBAcHJvcGVydHkgbGF5b3V0TmFtZQotICAg
IEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgbGF5b3V0TmFtZTogbnVs
bCwKLQotICAvKioKLSAgICBUaGUgdGVtcGxhdGUgdXNlZCB0byByZW5kZXIgdGhlIHZpZXcuIFRo
aXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdAotICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29u
dGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0Ci0gICAgd2ls
bCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00gcmVsYXRpdmUgdG8gaXRzIHBhcmVudCB2aWV3Lgot
Ci0gICAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3Bl
cnR5IGluc3RlYWQgb2Ygc2V0dGluZwotICAgIHRoZSB0ZW1wbGF0ZSB5b3Vyc2VsZi4KLQotICAg
IEBwcm9wZXJ0eSB0ZW1wbGF0ZQotICAgIEB0eXBlIEZ1bmN0aW9uCi0gICovCi0gIHRlbXBsYXRl
OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9
PSB1bmRlZmluZWQpIHsgcmV0dXJuIHZhbHVlOyB9Ci0KLSAgICB2YXIgdGVtcGxhdGVOYW1lID0g
Z2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwKLSAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBs
YXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0ZW1wbGF0ZScpOwotCi0gICAgRW1iZXIuYXNzZXJ0
KCJZb3Ugc3BlY2lmaWVkIHRoZSB0ZW1wbGF0ZU5hbWUgIiArIHRlbXBsYXRlTmFtZSArICIgZm9y
ICIgKyB0aGlzICsgIiwgYnV0IGl0IGRpZCBub3QgZXhpc3QuIiwgIXRlbXBsYXRlTmFtZSB8fCB0
ZW1wbGF0ZSk7Ci0KLSAgICByZXR1cm4gdGVtcGxhdGUgfHwgZ2V0KHRoaXMsICdkZWZhdWx0VGVt
cGxhdGUnKTsKLSAgfSkucHJvcGVydHkoJ3RlbXBsYXRlTmFtZScpLAotCi0gIC8qKgotICAgIFRo
ZSBjb250cm9sbGVyIG1hbmFnaW5nIHRoaXMgdmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQs
IGl0IHdpbGwgYmUKLSAgICBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHRoZSB0ZW1wbGF0ZS4K
LQotICAgIEBwcm9wZXJ0eSBjb250cm9sbGVyCi0gICAgQHR5cGUgT2JqZWN0Ci0gICovCi0gIGNv
bnRyb2xsZXI6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkgewotICAgIHZhciBwYXJlbnRW
aWV3ID0gZ2V0KHRoaXMsICdfcGFyZW50VmlldycpOwotICAgIHJldHVybiBwYXJlbnRWaWV3ID8g
Z2V0KHBhcmVudFZpZXcsICdjb250cm9sbGVyJykgOiBudWxsOwotICB9KS5wcm9wZXJ0eSgnX3Bh
cmVudFZpZXcnKSwKLQotICAvKioKLSAgICBBIHZpZXcgbWF5IGNvbnRhaW4gYSBsYXlvdXQuIEEg
bGF5b3V0IGlzIGEgcmVndWxhciB0ZW1wbGF0ZSBidXQKLSAgICBzdXBlcnNlZGVzIHRoZSBgdGVt
cGxhdGVgIHByb3BlcnR5IGR1cmluZyByZW5kZXJpbmcuIEl0IGlzIHRoZQotICAgIHJlc3BvbnNp
YmlsaXR5IG9mIHRoZSBsYXlvdXQgdGVtcGxhdGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAK
LSAgICBwcm9wZXJ0eSBmcm9tIHRoZSB2aWV3IChvciBhbHRlcm5hdGl2ZWx5LCBjYWxsIGBIYW5k
bGViYXJzLmhlbHBlcnMueWllbGRgLAotICAgIGB7e3lpZWxkfX1gKSB0byByZW5kZXIgaXQgaW4g
dGhlIGNvcnJlY3QgbG9jYXRpb24uCi0KLSAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgYSB2aWV3IHRo
YXQgaGFzIGEgc2hhcmVkIHdyYXBwZXIsIGJ1dCB3aGljaCBkZWxlZ2F0ZXMKLSAgICB0aGUgcmVu
ZGVyaW5nIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgd3JhcHBlciB0byB0aGUgYHRlbXBsYXRlYCBw
cm9wZXJ0eQotICAgIG9uIGEgc3ViY2xhc3MuCi0KLSAgICBAcHJvcGVydHkgbGF5b3V0Ci0gICAg
QHR5cGUgRnVuY3Rpb24KLSAgKi8KLSAgbGF5b3V0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXkpIHsKLSAgICB2YXIgbGF5b3V0TmFtZSA9IGdldCh0aGlzLCAnbGF5b3V0TmFtZScpLAotICAg
ICAgICBsYXlvdXQgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZShsYXlvdXROYW1lLCAnbGF5b3V0Jyk7
Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgdGhlIGxheW91dE5hbWUgIiArIGxh
eW91dE5hbWUgKyAiIGZvciAiICsgdGhpcyArICIsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LiIsICFs
YXlvdXROYW1lIHx8IGxheW91dCk7Ci0KLSAgICByZXR1cm4gbGF5b3V0IHx8IGdldCh0aGlzLCAn
ZGVmYXVsdExheW91dCcpOwotICB9KS5wcm9wZXJ0eSgnbGF5b3V0TmFtZScpLAotCi0gIF95aWVs
ZDogZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgIHZhciB0ZW1wbGF0ZSA9IGdldCh0
aGlzLCAndGVtcGxhdGUnKTsKLSAgICBpZiAodGVtcGxhdGUpIHsgdGVtcGxhdGUoY29udGV4dCwg
b3B0aW9ucyk7IH0KLSAgfSwKLQotICB0ZW1wbGF0ZUZvck5hbWU6IGZ1bmN0aW9uKG5hbWUsIHR5
cGUpIHsKLSAgICBpZiAoIW5hbWUpIHsgcmV0dXJuOyB9Ci0gICAgRW1iZXIuYXNzZXJ0KCJ0ZW1w
bGF0ZU5hbWVzIGFyZSBub3QgYWxsb3dlZCB0byBjb250YWluIHBlcmlvZHM6ICIrbmFtZSwgbmFt
ZS5pbmRleE9mKCcuJykgPT09IC0xKTsKLQotICAgIC8vIHRoZSBkZWZhdWx0Q29udGFpbmVyIGlz
IGRlcHJlY2F0ZWQKLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgfHwgKEVtYmVy
LkNvbnRhaW5lciAmJiBFbWJlci5Db250YWluZXIuZGVmYXVsdENvbnRhaW5lcik7Ci0gICAgcmV0
dXJuIGNvbnRhaW5lciAmJiBjb250YWluZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQg
YWNjZXNzIHByb3BlcnRpZXMuCi0KLSAgICBUaGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0
aGUgdGVtcGxhdGUgZnVuY3Rpb24gZWFjaCB0aW1lIHRoZSByZW5kZXIKLSAgICBtZXRob2QgaXMg
Y2FsbGVkLCBidXQgaXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRl
IHdoYXQKLSAgICB0byBkbyB3aXRoIGl0LgotCi0gICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJl
IHRoZSB2aWV3J3MgY29udHJvbGxlci4KLQotICAgIEBwcm9wZXJ0eSBjb250ZXh0Ci0gICAgQHR5
cGUgT2JqZWN0Ci0gICovCi0gIGNvbnRleHQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwg
dmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgc2V0KHRo
aXMsICdfY29udGV4dCcsIHZhbHVlKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IGVsc2Ug
ewotICAgICAgcmV0dXJuIGdldCh0aGlzLCAnX2NvbnRleHQnKTsKLSAgICB9Ci0gIH0pLnZvbGF0
aWxlKCksCi0KLSAgLyoqCi0gICAgUHJpdmF0ZSBjb3B5IG9mIHRoZSB2aWV3J3MgdGVtcGxhdGUg
Y29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRpcmVjdGx5Ci0gICAgYnkgSGFuZGxlYmFycyB3aXRo
b3V0IHRyaWdnZXJpbmcgdGhlIG9ic2VydmVyIHRoYXQgY2F1c2VzIHRoZSB2aWV3Ci0gICAgdG8g
YmUgcmUtcmVuZGVyZWQuCi0KLSAgICBUaGUgY29udGV4dCBvZiBhIHZpZXcgaXMgbG9va2VkIHVw
IGFzIGZvbGxvd3M6Ci0KLSAgICAxLiBTdXBwbGllZCBjb250ZXh0ICh1c3VhbGx5IGJ5IEhhbmRs
ZWJhcnMpCi0gICAgMi4gU3BlY2lmaWVkIGNvbnRyb2xsZXIKLSAgICAzLiBgcGFyZW50Vmlld2An
cyBjb250ZXh0IChmb3IgYSBjaGlsZCBvZiBhIENvbnRhaW5lclZpZXcpCi0KLSAgICBUaGUgY29k
ZSBpbiBIYW5kbGViYXJzIHRoYXQgb3ZlcnJpZGVzIHRoZSBgX2NvbnRleHRgIHByb3BlcnR5IGZp
cnN0Ci0gICAgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIHRoZSB2aWV3IGhhcyBhIHNwZWNpZmllZCBj
b250cm9sbGVyLiBUaGlzIGlzCi0gICAgc29tZXRoaW5nIG9mIGEgaGFjayBhbmQgc2hvdWxkIGJl
IHJldmlzaXRlZC4KLQotICAgIEBwcm9wZXJ0eSBfY29udGV4dAotICAgIEBwcml2YXRlCi0gICov
Ci0gIF9jb250ZXh0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgcGFy
ZW50VmlldywgY29udHJvbGxlcjsKLQotICAgIGlmIChjb250cm9sbGVyID0gZ2V0KHRoaXMsICdj
b250cm9sbGVyJykpIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgIH0KLQotICAgIHBh
cmVudFZpZXcgPSB0aGlzLl9wYXJlbnRWaWV3OwotICAgIGlmIChwYXJlbnRWaWV3KSB7Ci0gICAg
ICByZXR1cm4gZ2V0KHBhcmVudFZpZXcsICdfY29udGV4dCcpOwotICAgIH0KLQotICAgIHJldHVy
biBudWxsOwotICB9KSwKLQotICAvKioKLSAgICBJZiBhIHZhbHVlIHRoYXQgYWZmZWN0cyB0ZW1w
bGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhlIHZpZXcgc2hvdWxkIGJlCi0gICAgcmUtcmVuZGVy
ZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVlLgotCi0gICAgQG1ldGhvZCBfY29udGV4dERpZENo
YW5nZQotICAgIEBwcml2YXRlCi0gICovCi0gIF9jb250ZXh0RGlkQ2hhbmdlOiBFbWJlci5vYnNl
cnZlcignY29udGV4dCcsIGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVyZW5kZXIoKTsKLSAgfSks
Ci0KLSAgLyoqCi0gICAgSWYgYGZhbHNlYCwgdGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVuIGlu
IERPTS4KLQotICAgIEBwcm9wZXJ0eSBpc1Zpc2libGUKLSAgICBAdHlwZSBCb29sZWFuCi0gICAg
QGRlZmF1bHQgbnVsbAotICAqLwotICBpc1Zpc2libGU6IHRydWUsCi0KLSAgLyoqCi0gICAgQXJy
YXkgb2YgY2hpbGQgdmlld3MuIFlvdSBzaG91bGQgbmV2ZXIgZWRpdCB0aGlzIGFycmF5IGRpcmVj
dGx5LgotICAgIEluc3RlYWQsIHVzZSBgYXBwZW5kQ2hpbGRgIGFuZCBgcmVtb3ZlRnJvbVBhcmVu
dGAuCi0KLSAgICBAcHJvcGVydHkgY2hpbGRWaWV3cwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRl
ZmF1bHQgW10KLSAgICBAcHJpdmF0ZQotICAqLwotICBjaGlsZFZpZXdzOiBjaGlsZFZpZXdzUHJv
cGVydHksCi0KLSAgX2NoaWxkVmlld3M6IEVNUFRZX0FSUkFZLAotCi0gIC8vIFdoZW4gaXQncyBh
IHZpcnR1YWwgdmlldywgd2UgbmVlZCB0byBub3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZWlyCi0g
IC8vIGNoaWxkVmlld3Mgd2lsbCBjaGFuZ2UuCi0gIF9jaGlsZFZpZXdzV2lsbENoYW5nZTogRW1i
ZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NoaWxkVmlld3MnLCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhp
cy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRW
aWV3Jyk7Ci0gICAgICBpZiAocGFyZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uo
cGFyZW50VmlldywgJ2NoaWxkVmlld3MnKTsgfQotICAgIH0KLSAgfSksCi0KLSAgLy8gV2hlbiBp
dCdzIGEgdmlydHVhbCB2aWV3LCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhl
aXIKLSAgLy8gY2hpbGRWaWV3cyBkaWQgY2hhbmdlLgotICBfY2hpbGRWaWV3c0RpZENoYW5nZTog
RW1iZXIub2JzZXJ2ZXIoJ2NoaWxkVmlld3MnLCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5p
c1ZpcnR1YWwpIHsKLSAgICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3
Jyk7Ci0gICAgICBpZiAocGFyZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShwYXJl
bnRWaWV3LCAnY2hpbGRWaWV3cycpOyB9Ci0gICAgfQotICB9KSwKLQotICAvKioKLSAgICBSZXR1
cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlk
ZWQKLSAgICBjbGFzcy4KLQotICAgIEBwcm9wZXJ0eSBuZWFyZXN0SW5zdGFuY2VPZgotICAgIEBw
YXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcg
aXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIuVmlldwotICAgIEBkZXByZWNhdGVkCi0gICovCi0g
IG5lYXJlc3RJbnN0YW5jZU9mOiBmdW5jdGlvbihrbGFzcykgewotICAgIEVtYmVyLmRlcHJlY2F0
ZSgibmVhcmVzdEluc3RhbmNlT2YgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZy
b20gZnV0dXJlIHJlbGVhc2VzLiBVc2UgbmVhcmVzdE9mVHlwZS4iKTsKLSAgICB2YXIgdmlldyA9
IGdldCh0aGlzLCAncGFyZW50VmlldycpOwotCi0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlm
ICh2aWV3IGluc3RhbmNlb2Yga2xhc3MpIHsgcmV0dXJuIHZpZXc7IH0KLSAgICAgIHZpZXcgPSBn
ZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJu
IHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVk
Ci0gICAgY2xhc3Mgb3IgbWl4aW4uCi0KLSAgICBAcHJvcGVydHkgbmVhcmVzdE9mVHlwZQotICAg
IEBwYXJhbSB7Q2xhc3MsTWl4aW59IGtsYXNzIFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVt
YmVyLlZpZXcgaXRzZWxmKSwKLSAgICAgICAgICAgb3IgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTWl4
aW4uCi0gICAgQHJldHVybiBFbWJlci5WaWV3Ci0gICovCi0gIG5lYXJlc3RPZlR5cGU6IGZ1bmN0
aW9uKGtsYXNzKSB7Ci0gICAgdmFyIHZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAg
ICAgICAgaXNPZlR5cGUgPSBrbGFzcyBpbnN0YW5jZW9mIEVtYmVyLk1peGluID8KLSAgICAgICAg
ICAgICAgICAgICBmdW5jdGlvbih2aWV3KSB7IHJldHVybiBrbGFzcy5kZXRlY3Qodmlldyk7IH0g
OgotICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHZpZXcpIHsgcmV0dXJuIGtsYXNzLmRldGVj
dCh2aWV3LmNvbnN0cnVjdG9yKTsgfTsKLQotICAgIHdoaWxlICh2aWV3KSB7Ci0gICAgICBpZiAo
aXNPZlR5cGUodmlldykpIHsgcmV0dXJuIHZpZXc7IH0KLSAgICAgIHZpZXcgPSBnZXQodmlldywg
J3BhcmVudFZpZXcnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuZWFy
ZXN0IGFuY2VzdG9yIHRoYXQgaGFzIGEgZ2l2ZW4gcHJvcGVydHkuCi0KLSAgICBAZnVuY3Rpb24g
bmVhcmVzdFdpdGhQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBBIHByb3Bl
cnR5IG5hbWUKLSAgICBAcmV0dXJuIEVtYmVyLlZpZXcKLSAgKi8KLSAgbmVhcmVzdFdpdGhQcm9w
ZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsKLSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFy
ZW50VmlldycpOwotCi0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlmIChwcm9wZXJ0eSBpbiB2
aWV3KSB7IHJldHVybiB2aWV3OyB9Ci0gICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3
Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3Rv
ciB3aG9zZSBwYXJlbnQgaXMgYW4gaW5zdGFuY2Ugb2YKLSAgICBga2xhc3NgLgotCi0gICAgQG1l
dGhvZCBuZWFyZXN0Q2hpbGRPZgotICAgIEBwYXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNzIG9m
IEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIuVmll
dwotICAqLwotICBuZWFyZXN0Q2hpbGRPZjogZnVuY3Rpb24oa2xhc3MpIHsKLSAgICB2YXIgdmll
dyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwotCi0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAg
IGlmIChnZXQodmlldywgJ3BhcmVudFZpZXcnKSBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2
aWV3OyB9Ci0gICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9
LAotCi0gIC8qKgotICAgIFdoZW4gdGhlIHBhcmVudCB2aWV3IGNoYW5nZXMsIHJlY3Vyc2l2ZWx5
IGludmFsaWRhdGUgYGNvbnRyb2xsZXJgCi0KLSAgICBAbWV0aG9kIF9wYXJlbnRWaWV3RGlkQ2hh
bmdlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX3BhcmVudFZpZXdEaWRDaGFuZ2U6IEVtYmVyLm9i
c2VydmVyKCdfcGFyZW50VmlldycsIGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJv
eWluZykgeyByZXR1cm47IH0KLQotICAgIHRoaXMudHJpZ2dlcigncGFyZW50Vmlld0RpZENoYW5n
ZScpOwotCi0gICAgaWYgKGdldCh0aGlzLCAncGFyZW50Vmlldy5jb250cm9sbGVyJykgJiYgIWdl
dCh0aGlzLCAnY29udHJvbGxlcicpKSB7Ci0gICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdl
KCdjb250cm9sbGVyJyk7Ci0gICAgfQotICB9KSwKLQotICBfY29udHJvbGxlckRpZENoYW5nZTog
RW1iZXIub2JzZXJ2ZXIoJ2NvbnRyb2xsZXInLCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5p
c0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICB0aGlzLnJlcmVuZGVyKCk7Ci0KLSAgICB0
aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAgdmlldy5wcm9wZXJ0
eURpZENoYW5nZSgnY29udHJvbGxlcicpOwotICAgIH0pOwotICB9KSwKLQotICBjbG9uZUtleXdv
cmRzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGVtcGxhdGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1w
bGF0ZURhdGEnKTsKLQotICAgIHZhciBrZXl3b3JkcyA9IHRlbXBsYXRlRGF0YSA/IEVtYmVyLmNv
cHkodGVtcGxhdGVEYXRhLmtleXdvcmRzKSA6IHt9OwotICAgIHNldChrZXl3b3JkcywgJ3ZpZXcn
LCBnZXQodGhpcywgJ2NvbmNyZXRlVmlldycpKTsKLSAgICBzZXQoa2V5d29yZHMsICdfdmlldycs
IHRoaXMpOwotICAgIHNldChrZXl3b3JkcywgJ2NvbnRyb2xsZXInLCBnZXQodGhpcywgJ2NvbnRy
b2xsZXInKSk7Ci0KLSAgICByZXR1cm4ga2V5d29yZHM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2Fs
bGVkIG9uIHlvdXIgdmlldyB3aGVuIGl0IHNob3VsZCBwdXNoIHN0cmluZ3Mgb2YgSFRNTCBpbnRv
IGEKLSAgICBgRW1iZXIuUmVuZGVyQnVmZmVyYC4gTW9zdCB1c2VycyB3aWxsIHdhbnQgdG8gb3Zl
cnJpZGUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBvciBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0aWVzIGlu
c3RlYWQgb2YgdGhpcyBtZXRob2QuCi0KLSAgICBCeSBkZWZhdWx0LCBgRW1iZXIuVmlld2Agd2ls
bCBsb29rIGZvciBhIGZ1bmN0aW9uIGluIHRoZSBgdGVtcGxhdGVgCi0gICAgcHJvcGVydHkgYW5k
IGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBvZiBgY29udGV4dGAuIFRoZSB2YWx1ZSBvZgotICAg
IGBjb250ZXh0YCB3aWxsIGJlIHRoZSB2aWV3J3MgY29udHJvbGxlciB1bmxlc3MgeW91IG92ZXJy
aWRlIGl0LgotCi0gICAgQG1ldGhvZCByZW5kZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1
ZmZlcn0gYnVmZmVyIFRoZSByZW5kZXIgYnVmZmVyCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24o
YnVmZmVyKSB7Ci0gICAgLy8gSWYgdGhpcyB2aWV3IGhhcyBhIGxheW91dCwgaXQgaXMgdGhlIHJl
c3BvbnNpYmlsaXR5IG9mIHRoZQotICAgIC8vIHRoZSBsYXlvdXQgdG8gcmVuZGVyIHRoZSB2aWV3
J3MgdGVtcGxhdGUuIE90aGVyd2lzZSwgcmVuZGVyIHRoZSB0ZW1wbGF0ZQotICAgIC8vIGRpcmVj
dGx5LgotICAgIHZhciB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAnbGF5b3V0JykgfHwgZ2V0KHRoaXMs
ICd0ZW1wbGF0ZScpOwotCi0gICAgaWYgKHRlbXBsYXRlKSB7Ci0gICAgICB2YXIgY29udGV4dCA9
IGdldCh0aGlzLCAnY29udGV4dCcpOwotICAgICAgdmFyIGtleXdvcmRzID0gdGhpcy5jbG9uZUtl
eXdvcmRzKCk7Ci0gICAgICB2YXIgb3V0cHV0OwotCi0gICAgICB2YXIgZGF0YSA9IHsKLSAgICAg
ICAgdmlldzogdGhpcywKLSAgICAgICAgYnVmZmVyOiBidWZmZXIsCi0gICAgICAgIGlzUmVuZGVy
RGF0YTogdHJ1ZSwKLSAgICAgICAga2V5d29yZHM6IGtleXdvcmRzLAotICAgICAgICBpbnNpZGVH
cm91cDogZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEuaW5zaWRlR3JvdXAnKQotICAgICAgfTsKLQot
ICAgICAgLy8gSW52b2tlIHRoZSB0ZW1wbGF0ZSB3aXRoIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSBj
b250ZXh0LCB3aGljaAotICAgICAgLy8gaXMgdGhlIHZpZXcncyBjb250cm9sbGVyIGJ5IGRlZmF1
bHQuIEEgaGFzaCBvZiBkYXRhIGlzIGFsc28gcGFzc2VkIHRoYXQgcHJvdmlkZXMKLSAgICAgIC8v
IHRoZSB0ZW1wbGF0ZSB3aXRoIGFjY2VzcyB0byB0aGUgdmlldyBhbmQgcmVuZGVyIGJ1ZmZlci4K
LQotICAgICAgRW1iZXIuYXNzZXJ0KCd0ZW1wbGF0ZSBtdXN0IGJlIGEgZnVuY3Rpb24uIERpZCB5
b3UgbWVhbiB0byBjYWxsIEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiLi4uIikgb3Igc3BlY2lm
eSB0ZW1wbGF0ZU5hbWUgaW5zdGVhZD8nLCB0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicp
OwotICAgICAgLy8gVGhlIHRlbXBsYXRlIHNob3VsZCB3cml0ZSBkaXJlY3RseSB0byB0aGUgcmVu
ZGVyIGJ1ZmZlciBpbnN0ZWFkCi0gICAgICAvLyBvZiByZXR1cm5pbmcgYSBzdHJpbmcuCi0gICAg
ICBvdXRwdXQgPSB0ZW1wbGF0ZShjb250ZXh0LCB7IGRhdGE6IGRhdGEgfSk7Ci0KLSAgICAgIC8v
IElmIHRoZSB0ZW1wbGF0ZSByZXR1cm5lZCBhIHN0cmluZyBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8g
dGhlIGJ1ZmZlciwKLSAgICAgIC8vIHB1c2ggdGhlIHN0cmluZyBvbnRvIHRoZSBidWZmZXIuCi0g
ICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmluZWQpIHsgYnVmZmVyLnB1c2gob3V0cHV0KTsgfQot
ICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBSZW5kZXJzIHRoZSB2aWV3IGFnYWluLiBUaGlzIHdp
bGwgd29yayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCi0gICAgdmlldyBpcyBhbHJlYWR5IGlu
IHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmlldyBpcyBpbiB0aGUgRE9NLCB0aGUKLSAgICByZW5k
ZXJpbmcgcHJvY2VzcyB3aWxsIGJlIGRlZmVycmVkIHRvIGdpdmUgYmluZGluZ3MgYSBjaGFuY2UK
LSAgICB0byBzeW5jaHJvbml6ZS4KLQotICAgIElmIGNoaWxkcmVuIHdlcmUgYWRkZWQgZHVyaW5n
IHRoZSByZW5kZXJpbmcgcHJvY2VzcyB1c2luZyBgYXBwZW5kQ2hpbGRgLAotICAgIGByZXJlbmRl
cmAgd2lsbCByZW1vdmUgdGhlbSwgYmVjYXVzZSB0aGV5IHdpbGwgYmUgYWRkZWQgYWdhaW4KLSAg
ICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJlbmRlcmAuCi0KLSAgICBJbiBnZW5lcmFsLCBpZiB0
aGUgZGlzcGxheSBvZiB5b3VyIHZpZXcgY2hhbmdlcywgeW91IHNob3VsZCBtb2RpZnkKLSAgICB0
aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5zdGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIGByZXJl
bmRlcmAsIHdoaWNoIGNhbgotICAgIGJlIHNsb3cuCi0KLSAgICBAbWV0aG9kIHJlcmVuZGVyCi0g
ICovCi0gIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50U3Rh
dGUucmVyZW5kZXIodGhpcyk7Ci0gIH0sCi0KLSAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgbGVuZ3RoQmVmb3JlID0gdGhpcy5sZW5ndGhCZWZvcmVSZW5kZXIs
Ci0gICAgICAgIGxlbmd0aEFmdGVyICA9IHRoaXMubGVuZ3RoQWZ0ZXJSZW5kZXI7Ci0KLSAgICAv
LyBJZiB0aGVyZSB3ZXJlIGNoaWxkIHZpZXdzIGNyZWF0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwg
dG8gcmVuZGVyKCksCi0gICAgLy8gcmVtb3ZlIHRoZW0gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhh
dCB0aGV5IHdpbGwgYmUgcmUtY3JlYXRlZCB3aGVuCi0gICAgLy8gd2UgcmUtcmVuZGVyLgotCi0g
ICAgLy8gVklFVy1UT0RPOiBVbml0IHRlc3QgdGhpcyBwYXRoLgotICAgIHZhciBjaGlsZFZpZXdz
ID0gdGhpcy5fY2hpbGRWaWV3czsKLSAgICBmb3IgKHZhciBpPWxlbmd0aEFmdGVyLTE7IGk+PWxl
bmd0aEJlZm9yZTsgaS0tKSB7Ci0gICAgICBpZiAoY2hpbGRWaWV3c1tpXSkgeyBjaGlsZFZpZXdz
W2ldLmRlc3Ryb3koKTsgfQotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBJdGVyYXRlcyBvdmVy
IHRoZSB2aWV3J3MgYGNsYXNzTmFtZUJpbmRpbmdzYCBhcnJheSwgaW5zZXJ0cyB0aGUgdmFsdWUK
LSAgICBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGludG8gdGhlIGBjbGFzc05hbWVzYCBhcnJh
eSwgdGhlbiBjcmVhdGVzIGFuCi0gICAgb2JzZXJ2ZXIgdG8gdXBkYXRlIHRoZSB2aWV3J3MgZWxl
bWVudCBpZiB0aGUgYm91bmQgcHJvcGVydHkgZXZlciBjaGFuZ2VzCi0gICAgaW4gdGhlIGZ1dHVy
ZS4KLQotICAgIEBtZXRob2QgX2FwcGx5Q2xhc3NOYW1lQmluZGluZ3MKLSAgICBAcHJpdmF0ZQot
ICAqLwotICBfYXBwbHlDbGFzc05hbWVCaW5kaW5nczogZnVuY3Rpb24oY2xhc3NCaW5kaW5ncykg
ewotICAgIHZhciBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLAotICAgIGVsZW0sIG5ld0Ns
YXNzLCBkYXNoZXJpemVkQ2xhc3M7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBj
b25maWd1cmVkIGJpbmRpbmdzLiBUaGVzZSB3aWxsIGJlIGVpdGhlcgotICAgIC8vIHByb3BlcnR5
IG5hbWVzICgnaXNVcmdlbnQnKSBvciBwcm9wZXJ0eSBwYXRocyByZWxhdGl2ZSB0byB0aGUgdmll
dwotICAgIC8vICgnY29udGVudC5pc1VyZ2VudCcpCi0gICAgYV9mb3JFYWNoKGNsYXNzQmluZGlu
Z3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLQotICAgICAgLy8gVmFyaWFibGUgaW4gd2hpY2ggdGhl
IG9sZCBjbGFzcyB2YWx1ZSBpcyBzYXZlZC4gVGhlIG9ic2VydmVyIGZ1bmN0aW9uCi0gICAgICAv
LyBjbG9zZXMgb3ZlciB0aGlzIHZhcmlhYmxlLCBzbyBpdCBrbm93cyB3aGljaCBzdHJpbmcgdG8g
cmVtb3ZlIHdoZW4KLSAgICAgIC8vIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLgotICAgICAgdmFyIG9s
ZENsYXNzOwotICAgICAgLy8gRXh0cmFjdCBqdXN0IHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gYmlu
ZGluZ3MgbGlrZSAnZm9vOmJhcicKLSAgICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5f
cGFyc2VQcm9wZXJ0eVBhdGgoYmluZGluZyk7Ci0KLSAgICAgIC8vIFNldCB1cCBhbiBvYnNlcnZl
ciBvbiB0aGUgY29udGV4dC4gSWYgdGhlIHByb3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUKLSAg
ICAgIC8vIGNsYXNzIG5hbWUuCi0gICAgICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAg
ICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAgICBu
ZXdDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkoYmluZGluZyk7Ci0gICAgICAg
IGVsZW0gPSB0aGlzLiQoKTsKLQotICAgICAgICAvLyBJZiB3ZSBoYWQgcHJldmlvdXNseSBhZGRl
ZCBhIGNsYXNzIHRvIHRoZSBlbGVtZW50LCByZW1vdmUgaXQuCi0gICAgICAgIGlmIChvbGRDbGFz
cykgewotICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3Mob2xkQ2xhc3MpOwotICAgICAgICAgIC8v
IEFsc28gcmVtb3ZlIGZyb20gY2xhc3NOYW1lcyBzbyB0aGF0IGlmIHRoZSB2aWV3IGdldHMgcmVy
ZW5kZXJlZCwKLSAgICAgICAgICAvLyB0aGUgY2xhc3MgZG9lc24ndCBnZXQgYWRkZWQgYmFjayB0
byB0aGUgRE9NLgotICAgICAgICAgIGNsYXNzTmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIG5lY2Vzc2FyeSwgYWRkIGEgbmV3IGNsYXNzLiBN
YWtlIHN1cmUgd2Uga2VlcCB0cmFjayBvZiBpdCBzbwotICAgICAgICAvLyBpdCBjYW4gYmUgcmVt
b3ZlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICBpZiAobmV3Q2xhc3MpIHsKLSAgICAgICAgICBl
bGVtLmFkZENsYXNzKG5ld0NsYXNzKTsKLSAgICAgICAgICBvbGRDbGFzcyA9IG5ld0NsYXNzOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG9sZENsYXNzID0gbnVsbDsKLSAgICAgICAgfQot
ICAgICAgfTsKLQotICAgICAgLy8gR2V0IHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgcHJvcGVydHkg
YXQgaXRzIGN1cnJlbnQgdmFsdWUKLSAgICAgIGRhc2hlcml6ZWRDbGFzcyA9IHRoaXMuX2NsYXNz
U3RyaW5nRm9yUHJvcGVydHkoYmluZGluZyk7Ci0KLSAgICAgIGlmIChkYXNoZXJpemVkQ2xhc3Mp
IHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgaXQgZ2V0cyBpbnRvIHRoZSBjbGFzc05hbWVzIGFy
cmF5Ci0gICAgICAgIC8vIHNvIGl0IGlzIGRpc3BsYXllZCB3aGVuIHdlIHJlbmRlci4KLSAgICAg
ICAgYV9hZGRPYmplY3QoY2xhc3NOYW1lcywgZGFzaGVyaXplZENsYXNzKTsKLQotICAgICAgICAv
LyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBuYW1lIHNvIHdlIGNhbiByZW1vdmUgaXQK
LSAgICAgICAgLy8gaWYgdGhlIG9ic2VydmVyIGZpcmVzLiBSZW1lbWJlciB0aGF0IHRoaXMgdmFy
aWFibGUgaGFzCi0gICAgICAgIC8vIGJlZW4gY2xvc2VkIG92ZXIgYnkgdGhlIG9ic2VydmVyLgot
ICAgICAgICBvbGRDbGFzcyA9IGRhc2hlcml6ZWRDbGFzczsKLSAgICAgIH0KLQotICAgICAgdGhp
cy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHBhcnNlZFBhdGgucGF0aCwgb2JzZXJ2ZXIpOwotICAg
ICAgLy8gUmVtb3ZlIGNsYXNzTmFtZSBzbyB3aGVuIHRoZSB2aWV3IGlzIHJlcmVuZGVyZWQsCi0g
ICAgICAvLyB0aGUgY2xhc3NOYW1lIGlzIGFkZGVkIGJhc2VkIG9uIGJpbmRpbmcgcmVldmFsdWF0
aW9uCi0gICAgICB0aGlzLm9uZSgnd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIGlmIChvbGRDbGFzcykgewotICAgICAgICAgIGNsYXNzTmFtZXMucmVtb3ZlT2JqZWN0KG9s
ZENsYXNzKTsKLSAgICAgICAgICBvbGRDbGFzcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0p
OwotCi0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZXMgdGhyb3VnaCB0
aGUgdmlldydzIGF0dHJpYnV0ZSBiaW5kaW5ncywgc2V0cyB1cCBvYnNlcnZlcnMgZm9yIGVhY2gs
Ci0gICAgdGhlbiBhcHBsaWVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIHRv
IHRoZSBwYXNzZWQgcmVuZGVyIGJ1ZmZlci4KLQotICAgIEBtZXRob2QgX2FwcGx5QXR0cmlidXRl
QmluZGluZ3MKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyCi0gICAgQHBy
aXZhdGUKLSAgKi8KLSAgX2FwcGx5QXR0cmlidXRlQmluZGluZ3M6IGZ1bmN0aW9uKGJ1ZmZlciwg
YXR0cmlidXRlQmluZGluZ3MpIHsKLSAgICB2YXIgYXR0cmlidXRlVmFsdWUsIGVsZW07Ci0KLSAg
ICBhX2ZvckVhY2goYXR0cmlidXRlQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLSAgICAg
IHZhciBzcGxpdCA9IGJpbmRpbmcuc3BsaXQoJzonKSwKLSAgICAgICAgICBwcm9wZXJ0eSA9IHNw
bGl0WzBdLAotICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBzcGxpdFsxXSB8fCBwcm9wZXJ0eTsK
LQotICAgICAgLy8gQ3JlYXRlIGFuIG9ic2VydmVyIHRvIGFkZC9yZW1vdmUvY2hhbmdlIHRoZSBh
dHRyaWJ1dGUgaWYgdGhlCi0gICAgICAvLyBKYXZhU2NyaXB0IHByb3BlcnR5IGNoYW5nZXMuCi0g
ICAgICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgZWxlbSA9IHRoaXMuJCgp
OwotCi0gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gZ2V0KHRoaXMsIHByb3BlcnR5KTsKLQotICAg
ICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoZWxlbSwgYXR0cmlidXRlTmFt
ZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgfTsKLQotICAgICAgdGhpcy5yZWdpc3Rlck9ic2Vy
dmVyKHRoaXMsIHByb3BlcnR5LCBvYnNlcnZlcik7Ci0KLSAgICAgIC8vIERldGVybWluZSB0aGUg
Y3VycmVudCB2YWx1ZSBhbmQgYWRkIGl0IHRvIHRoZSByZW5kZXIgYnVmZmVyCi0gICAgICAvLyBp
ZiBuZWNlc3NhcnkuCi0gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGdldCh0aGlzLCBwcm9wZXJ0eSk7
Ci0gICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmlidXRlQmluZGluZ3MoYnVmZmVyLCBhdHRyaWJ1
dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgR2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLCByZXR1cm5zIGEgZGFzaGVyaXplZCB2ZXJzaW9uIG9m
IHRoYXQKLSAgICBwcm9wZXJ0eSBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBldmFsdWF0ZXMgdG8gYSBu
b24tZmFsc3kgdmFsdWUuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZpZXcgaGFzIHByb3Bl
cnR5IGBpc1VyZ2VudGAgdGhhdCBldmFsdWF0ZXMgdG8gdHJ1ZSwKLSAgICBwYXNzaW5nIGBpc1Vy
Z2VudGAgdG8gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYCJpcy11cmdlbnQiYC4KLQotICAgIEBt
ZXRob2QgX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkKLSAgICBAcGFyYW0gcHJvcGVydHkKLSAgICBA
cHJpdmF0ZQotICAqLwotICBfY2xhc3NTdHJpbmdGb3JQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVy
dHkpIHsKLSAgICB2YXIgcGFyc2VkUGF0aCA9IEVtYmVyLlZpZXcuX3BhcnNlUHJvcGVydHlQYXRo
KHByb3BlcnR5KTsKLSAgICB2YXIgcGF0aCA9IHBhcnNlZFBhdGgucGF0aDsKLQotICAgIHZhciB2
YWwgPSBnZXQodGhpcywgcGF0aCk7Ci0gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIEVtYmVy
LmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAgICAgdmFsID0gZ2V0KEVtYmVyLmxvb2t1cCwgcGF0
aCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVtYmVyLlZpZXcuX2NsYXNzU3RyaW5nRm9yVmFsdWUo
cGF0aCwgdmFsLCBwYXJzZWRQYXRoLmNsYXNzTmFtZSwgcGFyc2VkUGF0aC5mYWxzeUNsYXNzTmFt
ZSk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBFTEVNRU5UIFNVUFBPUlQKLSAgLy8KLQotICAvKioK
LSAgICBSZXR1cm5zIHRoZSBjdXJyZW50IERPTSBlbGVtZW50IGZvciB0aGUgdmlldy4KLQotICAg
IEBwcm9wZXJ0eSBlbGVtZW50Ci0gICAgQHR5cGUgRE9NRWxlbWVudAotICAqLwotICBlbGVtZW50
OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9
PSB1bmRlZmluZWQpIHsKLSAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5zZXRFbGVtZW50
KHRoaXMsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0
YXRlLmdldEVsZW1lbnQodGhpcyk7Ci0gICAgfQotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcn
KSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3Mg
ZWxlbWVudC4gSWYgeW91IHBhc3MgaW4gYSBzZWxlY3RvcgotICAgIHN0cmluZywgdGhpcyBtZXRo
b2Qgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2JqZWN0LCB1c2luZyB0aGUgY3VycmVudCBlbGVtZW50
Ci0gICAgYXMgaXRzIGJ1ZmZlci4KLQotICAgIEZvciBleGFtcGxlLCBjYWxsaW5nIGB2aWV3LiQo
J2xpJylgIHdpbGwgcmV0dXJuIGEgalF1ZXJ5IG9iamVjdCBjb250YWluaW5nCi0gICAgYWxsIG9m
IHRoZSBgbGlgIGVsZW1lbnRzIGluc2lkZSB0aGUgRE9NIGVsZW1lbnQgb2YgdGhpcyB2aWV3Lgot
Ci0gICAgQG1ldGhvZCAkCi0gICAgQHBhcmFtIHtTdHJpbmd9IFtzZWxlY3Rvcl0gYSBqUXVlcnkt
Y29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmcKLSAgICBAcmV0dXJuIHtqUXVlcnl9IHRoZSBqUXVl
cnkgb2JqZWN0IGZvciB0aGUgRE9NIG5vZGUKLSAgKi8KLSAgJDogZnVuY3Rpb24oc2VsKSB7Ci0g
ICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLiQodGhpcywgc2VsKTsKLSAgfSwKLQotICBtdXRh
dGVDaGlsZFZpZXdzOiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgIHZhciBjaGlsZFZpZXdzID0g
dGhpcy5fY2hpbGRWaWV3cywKLSAgICAgICAgaWR4ID0gY2hpbGRWaWV3cy5sZW5ndGgsCi0gICAg
ICAgIHZpZXc7Ci0KLSAgICB3aGlsZSgtLWlkeCA+PSAwKSB7Ci0gICAgICB2aWV3ID0gY2hpbGRW
aWV3c1tpZHhdOwotICAgICAgY2FsbGJhY2sodGhpcywgdmlldywgaWR4KTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBmb3JFYWNoQ2hpbGRWaWV3OiBmdW5jdGlvbihjYWxs
YmFjaykgewotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKLQotICAgIGlm
ICghY2hpbGRWaWV3cykgeyByZXR1cm4gdGhpczsgfQotCi0gICAgdmFyIGxlbiA9IGNoaWxkVmll
d3MubGVuZ3RoLAotICAgICAgICB2aWV3LCBpZHg7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8
IGxlbjsgaWR4KyspIHsKLSAgICAgIHZpZXcgPSBjaGlsZFZpZXdzW2lkeF07Ci0gICAgICBjYWxs
YmFjayh2aWV3KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAg
ICBBcHBlbmRzIHRoZSB2aWV3J3MgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVt
ZW50LgotCi0gICAgSWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0
aW9uIHlldCwgYGNyZWF0ZUVsZW1lbnQoKWAKLSAgICB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNh
bGx5LgotCi0gICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3
IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCi0gICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRl
ZCB0byB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlz
aGVkIHN5bmNocm9uaXppbmcuCi0KLSAgICBUaGlzIGlzIG5vdCB0eXBpY2FsbHkgYSBmdW5jdGlv
biB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBkaXJlY3RseSB3aGVuCi0gICAgYnVpbGRpbmcg
eW91ciBhcHBsaWNhdGlvbi4gWW91IG1pZ2h0IGNvbnNpZGVyIHVzaW5nIGBFbWJlci5Db250YWlu
ZXJWaWV3YAotICAgIGluc3RlYWQuIElmIHlvdSBkbyBuZWVkIHRvIHVzZSBgYXBwZW5kVG9gLCBi
ZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBlbGVtZW50Ci0gICAgeW91IGFyZSBwcm92aWRpbmcgaXMg
YXNzb2NpYXRlZCB3aXRoIGFuIGBFbWJlci5BcHBsaWNhdGlvbmAgYW5kIGRvZXMgbm90Ci0gICAg
aGF2ZSBhbiBhbmNlc3RvciBlbGVtZW50IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVtYmVy
IHZpZXcuCi0KLSAgICBAbWV0aG9kIGFwcGVuZFRvCi0gICAgQHBhcmFtIHtTdHJpbmd8RE9NRWxl
bWVudHxqUXVlcnl9IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkg
b2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgYXBwZW5k
VG86IGZ1bmN0aW9uKHRhcmdldCkgewotICAgIC8vIFNjaGVkdWxlIHRoZSBET00gZWxlbWVudCB0
byBiZSBjcmVhdGVkIGFuZCBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4KLSAgICAvLyBlbGVtZW50IGFm
dGVyIGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkLgotICAgIHRoaXMuX2luc2VydEVsZW1lbnRM
YXRlcihmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGFwcGVu
ZCB0byAoIiArIHRhcmdldCArICIpIGJ1dCB0aGF0IGlzbid0IGluIHRoZSBET00iLCBFbWJlci4k
KHRhcmdldCkubGVuZ3RoID4gMCk7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgYXBw
ZW5kIHRvIGFuIGV4aXN0aW5nIEVtYmVyLlZpZXcuIENvbnNpZGVyIHVzaW5nIEVtYmVyLkNvbnRh
aW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIuJCh0YXJnZXQpLmlzKCcuZW1iZXItdmlldycpICYm
ICFFbWJlci4kKHRhcmdldCkucGFyZW50cygpLmlzKCcuZW1iZXItdmlldycpKTsKLSAgICAgIHRo
aXMuJCgpLmFwcGVuZFRvKHRhcmdldCk7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAg
fSwKLQotICAvKioKLSAgICBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBh
cmVudCBlbGVtZW50IHdpdGggdGhpcyB2aWV3J3MKLSAgICBlbGVtZW50LiBJZiB0aGUgdmlldyBk
b2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVzZW50YXRpb24geWV0LAotICAgIGBjcmVhdGVFbGVt
ZW50KClgIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuCi0KLSAgICBOb3RlIHRoYXQgdGhp
cyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00K
LSAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVu
dGlsIGFsbCBiaW5kaW5ncyBoYXZlCi0gICAgZmluaXNoZWQgc3luY2hyb25pemluZwotCi0gICAg
QG1ldGhvZCByZXBsYWNlSW4KLSAgICBAcGFyYW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0g
dGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0
Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZWQKLSAgKi8KLSAgcmVwbGFjZUluOiBm
dW5jdGlvbih0YXJnZXQpIHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byByZXBsYWNl
IGluICgiICsgdGFyZ2V0ICsgIikgYnV0IHRoYXQgaXNuJ3QgaW4gdGhlIERPTSIsIEVtYmVyLiQo
dGFyZ2V0KS5sZW5ndGggPiAwKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVwbGFj
ZSBhbiBleGlzdGluZyBFbWJlci5WaWV3LiBDb25zaWRlciB1c2luZyBFbWJlci5Db250YWluZXJW
aWV3IGluc3RlYWQuIiwgIUVtYmVyLiQodGFyZ2V0KS5pcygnLmVtYmVyLXZpZXcnKSAmJiAhRW1i
ZXIuJCh0YXJnZXQpLnBhcmVudHMoKS5pcygnLmVtYmVyLXZpZXcnKSk7Ci0KLSAgICB0aGlzLl9p
bnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJlci4kKHRhcmdldCkuZW1w
dHkoKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVuZFRvKHRhcmdldCk7Ci0gICAgfSk7Ci0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBTY2hlZHVsZXMgYSBET00gb3BlcmF0aW9u
IHRvIG9jY3VyIGR1cmluZyB0aGUgbmV4dCByZW5kZXIgcGhhc2UuIFRoaXMKLSAgICBlbnN1cmVz
IHRoYXQgYWxsIGJpbmRpbmdzIGhhdmUgZmluaXNoZWQgc3luY2hyb25pemluZyBiZWZvcmUgdGhl
IHZpZXcgaXMKLSAgICByZW5kZXJlZC4KLQotICAgIFRvIHVzZSwgcGFzcyBhIGZ1bmN0aW9uIHRo
YXQgcGVyZm9ybXMgYSBET00gb3BlcmF0aW9uLgotCi0gICAgQmVmb3JlIHlvdXIgZnVuY3Rpb24g
aXMgY2FsbGVkLCB0aGlzIHZpZXcgYW5kIGFsbCBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUKLSAg
ICB0aGUgYHdpbGxJbnNlcnRFbGVtZW50YCBldmVudC4gQWZ0ZXIgeW91ciBmdW5jdGlvbiBpcyBp
bnZva2VkLCB0aGlzIHZpZXcKLSAgICBhbmQgYWxsIG9mIGl0cyBjaGlsZCB2aWV3cyB3aWxsIHJl
Y2VpdmUgdGhlIGBkaWRJbnNlcnRFbGVtZW50YCBldmVudC4KLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmNy
ZWF0ZUVsZW1lbnQoKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVuZFRvKCdib2R5Jyk7Ci0gICAgfSk7
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9pbnNlcnRFbGVtZW50TGF0ZXIKLSAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIHRoZSBlbGVtZW50IGludG8g
dGhlIERPTQotICAgIEBwcml2YXRlCi0gICovCi0gIF9pbnNlcnRFbGVtZW50TGF0ZXI6IGZ1bmN0
aW9uKGZuKSB7Ci0gICAgdGhpcy5fc2NoZWR1bGVkSW5zZXJ0ID0gRW1iZXIucnVuLnNjaGVkdWxl
T25jZSgncmVuZGVyJywgdGhpcywgJ19pbnNlcnRFbGVtZW50JywgZm4pOwotICB9LAotCi0gIF9p
bnNlcnRFbGVtZW50OiBmdW5jdGlvbiAoZm4pIHsKLSAgICB0aGlzLl9zY2hlZHVsZWRJbnNlcnQg
PSBudWxsOwotICAgIHRoaXMuY3VycmVudFN0YXRlLmluc2VydEVsZW1lbnQodGhpcywgZm4pOwot
ICB9LAotCi0gIC8qKgotICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBkb2N1
bWVudCBib2R5LiBJZiB0aGUgdmlldyBkb2VzCi0gICAgbm90IGhhdmUgYW4gSFRNTCByZXByZXNl
bnRhdGlvbiB5ZXQsIGBjcmVhdGVFbGVtZW50KClgIHdpbGwgYmUgY2FsbGVkCi0gICAgYXV0b21h
dGljYWxseS4KLQotICAgIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyB0aGUgYHJvb3RFbGVtZW50
YCBwcm9wZXJ0eSwgeW91IG11c3QgYXBwZW5kCi0gICAgdGhlIHZpZXcgd2l0aGluIHRoYXQgZWxl
bWVudC4gUmVuZGVyaW5nIHZpZXdzIG91dHNpZGUgb2YgdGhlIGByb290RWxlbWVudGAKLSAgICBp
cyBub3Qgc3VwcG9ydGVkLgotCi0gICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1
bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCi0gICAgZWxlbWVudCB3aWxsIG5v
dCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1lbnQgYm9keSB1bnRpbCBhbGwgYmluZGluZ3MgaGF2
ZQotICAgIGZpbmlzaGVkIHN5bmNocm9uaXppbmcuCi0KLSAgICBAbWV0aG9kIGFwcGVuZAotICAg
IEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIGFwcGVuZDogZnVuY3Rpb24o
KSB7Ci0gICAgcmV0dXJuIHRoaXMuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmVtb3ZlcyB0aGUgdmlldydzIGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB0byB3
aGljaCBpdCBpcyBhdHRhY2hlZC4KLQotICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgQHJldHVybiB7
RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKLSAgICAv
LyBXaGF0IHdlIHNob3VsZCByZWFsbHkgZG8gaGVyZSBpcyB3YWl0IHVudGlsIHRoZSBlbmQgb2Yg
dGhlIHJ1biBsb29wCi0gICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVu
IHJlLWFwcGVuZGVkIHRvIGEgZGlmZmVyZW50Ci0gICAgLy8gZWxlbWVudC4KLSAgICAvLyBJbiB0
aGUgaW50ZXJpbSwgd2Ugd2lsbCBqdXN0IHJlLXJlbmRlciBpZiB0aGF0IGhhcHBlbnMuIEl0IGlz
IG1vcmUKLSAgICAvLyBpbXBvcnRhbnQgdGhhbiBlbGVtZW50cyBnZXQgZ2FyYmFnZSBjb2xsZWN0
ZWQuCi0gICAgaWYgKCF0aGlzLnJlbW92ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQo
KTsgfQotICAgIHRoaXMuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAg
aWYgKHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKSB7IHZpZXcuY2xlYXJSZW5kZXJlZENoaWxk
cmVuKCk7IH0KLSAgICB9KTsKLSAgfSwKLQotICBlbGVtZW50SWQ6IG51bGwsCi0KLSAgLyoqCi0g
ICAgQXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50
LiBUaGUgZGVmYXVsdAotICAgIGltcGxlbWVudGF0aW9uIGxvb2tzIGZvciBhbiBlbGVtZW50IHdp
dGggYW4gSUQgb2YgYGVsZW1lbnRJZGAgKG9yIHRoZQotICAgIHZpZXcncyBndWlkIGlmIGBlbGVt
ZW50SWRgIGlzIG51bGwpLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgcHJv
dmlkZSB5b3VyIG93biBmb3JtIG9mIGxvb2t1cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRv
IGRpc2NvdmVyIHlvdXIKLSAgICBlbGVtZW50IHVzaW5nIGEgQ1NTIGNsYXNzIG5hbWUgaW5zdGVh
ZCBvZiBhbiBJRC4KLQotICAgIEBtZXRob2QgZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQKLSAg
ICBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudEVsZW1lbnQgVGhlIHBhcmVudCdzIERPTSBlbGVt
ZW50Ci0gICAgQHJldHVybiB7RE9NRWxlbWVudH0gVGhlIGRpc2NvdmVyZWQgZWxlbWVudAotICAq
LwotICBmaW5kRWxlbWVudEluUGFyZW50RWxlbWVudDogZnVuY3Rpb24ocGFyZW50RWxlbSkgewot
ICAgIHZhciBpZCA9ICIjIiArIHRoaXMuZWxlbWVudElkOwotICAgIHJldHVybiBFbWJlci4kKGlk
KVswXSB8fCBFbWJlci4kKGlkLCBwYXJlbnRFbGVtKVswXTsKLSAgfSwKLQotICAvKioKLSAgICBD
cmVhdGVzIGEgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2aWV3IGFuZCBhbGwgb2YgaXRzCi0g
ICAgY2hpbGQgdmlld3MgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyB0aGUgYHJlbmRlcigpYCBtZXRo
b2QuCi0KLSAgICBBZnRlciB0aGUgZWxlbWVudCBoYXMgYmVlbiBjcmVhdGVkLCBgZGlkSW5zZXJ0
RWxlbWVudGAgd2lsbAotICAgIGJlIGNhbGxlZCBvbiB0aGlzIHZpZXcgYW5kIGFsbCBvZiBpdHMg
Y2hpbGQgdmlld3MuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZUVsZW1lbnQKLSAgICBAcmV0dXJuIHtF
bWJlci5WaWV3fSByZWNlaXZlcgotICAqLwotICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsK
LSAgICBpZiAoZ2V0KHRoaXMsICdlbGVtZW50JykpIHsgcmV0dXJuIHRoaXM7IH0KLQotICAgIHZh
ciBidWZmZXIgPSB0aGlzLnJlbmRlclRvQnVmZmVyKCk7Ci0gICAgc2V0KHRoaXMsICdlbGVtZW50
JywgYnVmZmVyLmVsZW1lbnQoKSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioK
LSAgICBDYWxsZWQgd2hlbiBhIHZpZXcgaXMgZ29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50
byB0aGUgRE9NLgotCi0gICAgQGV2ZW50IHdpbGxJbnNlcnRFbGVtZW50Ci0gICovCi0gIHdpbGxJ
bnNlcnRFbGVtZW50OiBFbWJlci5LLAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVt
ZW50IG9mIHRoZSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTQotICAgIG9yIGFm
dGVyIHRoZSB2aWV3IHdhcyByZS1yZW5kZXJlZC4gT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBk
byBhbnkKLSAgICBzZXQgdXAgdGhhdCByZXF1aXJlcyBhbiBlbGVtZW50IGluIHRoZSBkb2N1bWVu
dCBib2R5LgotCi0gICAgQGV2ZW50IGRpZEluc2VydEVsZW1lbnQKLSAgKi8KLSAgZGlkSW5zZXJ0
RWxlbWVudDogRW1iZXIuSywKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBh
Ym91dCB0byByZXJlbmRlciwgYnV0IGJlZm9yZSBhbnl0aGluZyBoYXMKLSAgICBiZWVuIHRvcm4g
ZG93bi4gVGhpcyBpcyBhIGdvb2Qgb3Bwb3J0dW5pdHkgdG8gdGVhciBkb3duIGFueSBtYW51YWwK
LSAgICBvYnNlcnZlcnMgeW91IGhhdmUgaW5zdGFsbGVkIGJhc2VkIG9uIHRoZSBET00gc3RhdGUK
LQotICAgIEBldmVudCB3aWxsQ2xlYXJSZW5kZXIKLSAgKi8KLSAgd2lsbENsZWFyUmVuZGVyOiBF
bWJlci5LLAotCi0gIC8qKgotICAgIFJ1biB0aGlzIGNhbGxiYWNrIG9uIHRoZSBjdXJyZW50IHZp
ZXcgKHVubGVzcyBpbmNsdWRlU2VsZiBpcyBmYWxzZSkgYW5kIHJlY3Vyc2l2ZWx5IG9uIGNoaWxk
IHZpZXdzLgotCi0gICAgQG1ldGhvZCBpbnZva2VSZWN1cnNpdmVseQotICAgIEBwYXJhbSBmbiB7
RnVuY3Rpb259Ci0gICAgQHBhcmFtIGluY2x1ZGVTZWxmIHtCb29sZWFufSBJbmNsdWRlcyBpdHNl
bGYgaWYgdHJ1ZS4KLSAgICBAcHJpdmF0ZQotICAqLwotICBpbnZva2VSZWN1cnNpdmVseTogZnVu
Y3Rpb24oZm4sIGluY2x1ZGVTZWxmKSB7Ci0gICAgdmFyIGNoaWxkVmlld3MgPSAoaW5jbHVkZVNl
bGYgPT09IGZhbHNlKSA/IHRoaXMuX2NoaWxkVmlld3MgOiBbdGhpc107Ci0gICAgdmFyIGN1cnJl
bnRWaWV3cywgdmlldywgY3VycmVudENoaWxkVmlld3M7Ci0KLSAgICB3aGlsZSAoY2hpbGRWaWV3
cy5sZW5ndGgpIHsKLSAgICAgIGN1cnJlbnRWaWV3cyA9IGNoaWxkVmlld3Muc2xpY2UoKTsKLSAg
ICAgIGNoaWxkVmlld3MgPSBbXTsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRWaWV3
cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHZpZXcgPSBjdXJyZW50Vmlld3NbaV07Ci0g
ICAgICAgIGN1cnJlbnRDaGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cyA/IHZpZXcuX2NoaWxk
Vmlld3Muc2xpY2UoMCkgOiBudWxsOwotICAgICAgICBmbih2aWV3KTsKLSAgICAgICAgaWYgKGN1
cnJlbnRDaGlsZFZpZXdzKSB7Ci0gICAgICAgICAgY2hpbGRWaWV3cy5wdXNoLmFwcGx5KGNoaWxk
Vmlld3MsIGN1cnJlbnRDaGlsZFZpZXdzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAg
fSwKLQotICB0cmlnZ2VyUmVjdXJzaXZlbHk6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIHZh
ciBjaGlsZFZpZXdzID0gW3RoaXNdLCBjdXJyZW50Vmlld3MsIHZpZXcsIGN1cnJlbnRDaGlsZFZp
ZXdzOwotCi0gICAgd2hpbGUgKGNoaWxkVmlld3MubGVuZ3RoKSB7Ci0gICAgICBjdXJyZW50Vmll
d3MgPSBjaGlsZFZpZXdzLnNsaWNlKCk7Ci0gICAgICBjaGlsZFZpZXdzID0gW107Ci0KLSAgICAg
IGZvciAodmFyIGk9MCwgbD1jdXJyZW50Vmlld3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAg
ICB2aWV3ID0gY3VycmVudFZpZXdzW2ldOwotICAgICAgICBjdXJyZW50Q2hpbGRWaWV3cyA9IHZp
ZXcuX2NoaWxkVmlld3MgPyB2aWV3Ll9jaGlsZFZpZXdzLnNsaWNlKDApIDogbnVsbDsKLSAgICAg
ICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAgICAg
ICBpZiAoY3VycmVudENoaWxkVmlld3MpIHsKLSAgICAgICAgICBjaGlsZFZpZXdzLnB1c2guYXBw
bHkoY2hpbGRWaWV3cywgY3VycmVudENoaWxkVmlld3MpOwotICAgICAgICB9Ci0KLSAgICAgIH0K
LSAgICB9Ci0gIH0sCi0KLSAgdmlld0hpZXJhcmNoeUNvbGxlY3Rpb246IGZ1bmN0aW9uKCkgewot
ICAgIHZhciBjdXJyZW50Vmlldywgdmlld0NvbGxlY3Rpb24gPSBuZXcgVmlld0NvbGxlY3Rpb24o
W3RoaXNdKTsKLQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld0NvbGxlY3Rpb24ubGVuZ3Ro
OyBpKyspIHsKLSAgICAgIGN1cnJlbnRWaWV3ID0gdmlld0NvbGxlY3Rpb24ub2JqZWN0QXQoaSk7
Ci0gICAgICBpZiAoY3VycmVudFZpZXcuX2NoaWxkVmlld3MpIHsKLSAgICAgICAgdmlld0NvbGxl
Y3Rpb24ucHVzaC5hcHBseSh2aWV3Q29sbGVjdGlvbiwgY3VycmVudFZpZXcuX2NoaWxkVmlld3Mp
OwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQot
ICAvKioKLSAgICBEZXN0cm95cyBhbnkgZXhpc3RpbmcgZWxlbWVudCBhbG9uZyB3aXRoIHRoZSBl
bGVtZW50IGZvciBhbnkgY2hpbGQgdmlld3MKLSAgICBhcyB3ZWxsLiBJZiB0aGUgdmlldyBkb2Vz
IG5vdCBjdXJyZW50bHkgaGF2ZSBhIGVsZW1lbnQsIHRoZW4gdGhpcyBtZXRob2QKLSAgICB3aWxs
IGRvIG5vdGhpbmcuCi0KLSAgICBJZiB5b3UgaW1wbGVtZW50IGB3aWxsRGVzdHJveUVsZW1lbnQo
KWAgb24geW91ciB2aWV3LCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKLSAgICBiZSBpbnZva2VkIG9u
IHlvdXIgdmlldyBiZWZvcmUgeW91ciBlbGVtZW50IGlzIGRlc3Ryb3llZCB0byBnaXZlIHlvdSBh
Ci0gICAgY2hhbmNlIHRvIGNsZWFuIHVwIGFueSBldmVudCBoYW5kbGVycywgZXRjLgotCi0gICAg
SWYgeW91IHdyaXRlIGEgYHdpbGxEZXN0cm95RWxlbWVudCgpYCBoYW5kbGVyLCB5b3UgY2FuIGFz
c3VtZSB0aGF0IHlvdXIKLSAgICBgZGlkSW5zZXJ0RWxlbWVudCgpYCBoYW5kbGVyIHdhcyBjYWxs
ZWQgZWFybGllciBmb3IgdGhlIHNhbWUgZWxlbWVudC4KLQotICAgIFlvdSBzaG91bGQgbm90IGNh
bGwgb3Igb3ZlcnJpZGUgdGhpcyBtZXRob2QgeW91cnNlbGYsIGJ1dCB5b3UgbWF5Ci0gICAgd2Fu
dCB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGNhbGxiYWNrcy4KLQotICAgIEBtZXRob2QgZGVzdHJv
eUVsZW1lbnQKLSAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgotICAqLwotICBkZXN0
cm95RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmRl
c3Ryb3lFbGVtZW50KHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBl
bGVtZW50IG9mIHRoZSB2aWV3IGlzIGdvaW5nIHRvIGJlIGRlc3Ryb3llZC4gT3ZlcnJpZGUKLSAg
ICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0ZWFyZG93biB0aGF0IHJlcXVpcmVzIGFuIGVsZW1l
bnQsIGxpa2UgcmVtb3ZpbmcKLSAgICBldmVudCBsaXN0ZW5lcnMuCi0KLSAgICBAZXZlbnQgd2ls
bERlc3Ryb3lFbGVtZW50Ci0gICovCi0gIHdpbGxEZXN0cm95RWxlbWVudDogRW1iZXIuSywKLQot
ICAvKioKLSAgICBUcmlnZ2VycyB0aGUgYHdpbGxEZXN0cm95RWxlbWVudGAgZXZlbnQgKHdoaWNo
IGludm9rZXMgdGhlCi0gICAgYHdpbGxEZXN0cm95RWxlbWVudCgpYCBtZXRob2QgaWYgaXQgZXhp
c3RzKSBvbiB0aGlzIHZpZXcgYW5kIGFsbCBjaGlsZAotICAgIHZpZXdzLgotCi0gICAgQmVmb3Jl
IHRyaWdnZXJpbmcgYHdpbGxEZXN0cm95RWxlbWVudGAsIGl0IGZpcnN0IHRyaWdnZXJzIHRoZQot
ICAgIGB3aWxsQ2xlYXJSZW5kZXJgIGV2ZW50IHJlY3Vyc2l2ZWx5LgotCi0gICAgQG1ldGhvZCBf
bm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgX25vdGlmeVdp
bGxEZXN0cm95RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9uID0g
dGhpcy52aWV3SGllcmFyY2h5Q29sbGVjdGlvbigpOwotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdn
ZXIoJ3dpbGxDbGVhclJlbmRlcicpOwotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxE
ZXN0cm95RWxlbWVudCcpOwotICAgIHJldHVybiB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQotICAv
KioKLSAgICBJZiB0aGlzIHZpZXcncyBlbGVtZW50IGNoYW5nZXMsIHdlIG5lZWQgdG8gaW52YWxp
ZGF0ZSB0aGUgY2FjaGVzIG9mIG91cgotICAgIGNoaWxkIHZpZXdzIHNvIHRoYXQgd2UgZG8gbm90
IHJldGFpbiByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50cyB0aGF0IGFyZQotICAgIG5vIGxvbmdl
ciBuZWVkZWQuCi0KLSAgICBAbWV0aG9kIF9lbGVtZW50RGlkQ2hhbmdlCi0gICAgQHByaXZhdGUK
LSAgKi8KLSAgX2VsZW1lbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdlbGVtZW50JywgZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAg
ICAgIGRlbGV0ZSBtZXRhKHZpZXcpLmNhY2hlLmVsZW1lbnQ7Ci0gICAgfSk7Ci0gIH0pLAotCi0g
IC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBwYXJlbnRWaWV3IHByb3BlcnR5IGhhcyBjaGFuZ2Vk
LgotCi0gICAgQGV2ZW50IHBhcmVudFZpZXdEaWRDaGFuZ2UKLSAgKi8KLSAgcGFyZW50Vmlld0Rp
ZENoYW5nZTogRW1iZXIuSywKLQotICBpbnN0cnVtZW50TmFtZTogJ3ZpZXcnLAotCi0gIGluc3Ry
dW1lbnREZXRhaWxzOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgaGFzaC50ZW1wbGF0ZSA9IGdldCh0
aGlzLCAndGVtcGxhdGVOYW1lJyk7Ci0gICAgdGhpcy5fc3VwZXIoaGFzaCk7Ci0gIH0sCi0KLSAg
X3JlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikg
ewotICAgIHRoaXMubGVuZ3RoQmVmb3JlUmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7
Ci0gICAgdmFyIGJ1ZmZlciA9IHRoaXMuX3N1cGVyKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0
aW9uKTsKLSAgICB0aGlzLmxlbmd0aEFmdGVyUmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5n
dGg7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZOZWVk
ZWQ6IGZ1bmN0aW9uIChidWZmZXIpIHsKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVu
ZGVyVG9CdWZmZXJJZk5lZWRlZCh0aGlzLCBidWZmZXIpOwotICB9LAotCi0gIGJlZm9yZVJlbmRl
cjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgdGhpcy5hcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcihi
dWZmZXIpOwotICAgIGJ1ZmZlci5wdXNoT3BlbmluZ1RhZygpOwotICB9LAotCi0gIGFmdGVyUmVu
ZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICBidWZmZXIucHVzaENsb3NpbmdUYWcoKTsKLSAg
fSwKLQotICBhcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAg
Ly8gQ3JlYXRlcyBvYnNlcnZlcnMgZm9yIGFsbCByZWdpc3RlcmVkIGNsYXNzIG5hbWUgYW5kIGF0
dHJpYnV0ZSBiaW5kaW5ncywKLSAgICAvLyB0aGVuIGFkZHMgdGhlbSB0byB0aGUgZWxlbWVudC4K
LSAgICB2YXIgY2xhc3NOYW1lQmluZGluZ3MgPSBnZXQodGhpcywgJ2NsYXNzTmFtZUJpbmRpbmdz
Jyk7Ci0gICAgaWYgKGNsYXNzTmFtZUJpbmRpbmdzLmxlbmd0aCkgewotICAgICAgdGhpcy5fYXBw
bHlDbGFzc05hbWVCaW5kaW5ncyhjbGFzc05hbWVCaW5kaW5ncyk7Ci0gICAgfQotCi0gICAgLy8g
UGFzcyB0aGUgcmVuZGVyIGJ1ZmZlciBzbyB0aGUgbWV0aG9kIGNhbiBhcHBseSBhdHRyaWJ1dGVz
IGRpcmVjdGx5LgotICAgIC8vIFRoaXMgaXNuJ3QgbmVlZGVkIGZvciBjbGFzcyBuYW1lIGJpbmRp
bmdzIGJlY2F1c2UgdGhleSB1c2UgdGhlCi0gICAgLy8gZXhpc3RpbmcgY2xhc3NOYW1lcyBpbmZy
YXN0cnVjdHVyZS4KLSAgICB2YXIgYXR0cmlidXRlQmluZGluZ3MgPSBnZXQodGhpcywgJ2F0dHJp
YnV0ZUJpbmRpbmdzJyk7Ci0gICAgaWYgKGF0dHJpYnV0ZUJpbmRpbmdzLmxlbmd0aCkgewotICAg
ICAgdGhpcy5fYXBwbHlBdHRyaWJ1dGVCaW5kaW5ncyhidWZmZXIsIGF0dHJpYnV0ZUJpbmRpbmdz
KTsKLSAgICB9Ci0KLSAgICBidWZmZXIuc2V0Q2xhc3Nlcyh0aGlzLmNsYXNzTmFtZXMpOwotICAg
IGJ1ZmZlci5pZCh0aGlzLmVsZW1lbnRJZCk7Ci0KLSAgICB2YXIgcm9sZSA9IGdldCh0aGlzLCAn
YXJpYVJvbGUnKTsKLSAgICBpZiAocm9sZSkgewotICAgICAgYnVmZmVyLmF0dHIoJ3JvbGUnLCBy
b2xlKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0KHRoaXMsICdpc1Zpc2libGUnKSA9PT0gZmFsc2Up
IHsKLSAgICAgIGJ1ZmZlci5zdHlsZSgnZGlzcGxheScsICdub25lJyk7Ci0gICAgfQotICB9LAot
Ci0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLSAgLy8gU1RBTkRBUkQgUkVOREVSIFBST1BFUlRJRVMKLSAgLy8KLQotICAvKioK
LSAgICBUYWcgbmFtZSBmb3IgdGhlIHZpZXcncyBvdXRlciBlbGVtZW50LiBUaGUgdGFnIG5hbWUg
aXMgb25seSB1c2VkIHdoZW4gYW4KLSAgICBlbGVtZW50IGlzIGZpcnN0IGNyZWF0ZWQuIElmIHlv
dSBjaGFuZ2UgdGhlIGB0YWdOYW1lYCBmb3IgYW4gZWxlbWVudCwgeW91Ci0gICAgbXVzdCBkZXN0
cm95IGFuZCByZWNyZWF0ZSB0aGUgdmlldyBlbGVtZW50LgotCi0gICAgQnkgZGVmYXVsdCwgdGhl
IHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBgPGRpdj5gIHRhZyBmb3Igdmlld3MuCi0KLSAgICBA
cHJvcGVydHkgdGFnTmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAg
Ki8KLQotICAvLyBXZSBsZWF2ZSB0aGlzIG51bGwgYnkgZGVmYXVsdCBzbyB3ZSBjYW4gdGVsbCB0
aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gIC8vIHRoZSBkZWZhdWx0IGNhc2UgYW5kIGEgdXNlci1z
cGVjaWZpZWQgdGFnLgotICB0YWdOYW1lOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBXQUktQVJJ
QSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5IHRoaXMgdmlldy4gRm9yIGV4YW1w
bGUsIGEKLSAgICBidXR0b24gbWF5IGhhdmUgYSByb2xlIG9mIHR5cGUgJ2J1dHRvbicsIG9yIGEg
cGFuZSBtYXkgaGF2ZSBhIHJvbGUgb2YKLSAgICB0eXBlICdhbGVydGRpYWxvZycuIFRoaXMgcHJv
cGVydHkgaXMgdXNlZCBieSBhc3Npc3RpdmUgc29mdHdhcmUgdG8gaGVscAotICAgIHZpc3VhbGx5
IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUgcmljaCB3ZWIgYXBwbGljYXRpb25zLgotCi0gICAg
VGhlIGZ1bGwgbGlzdCBvZiB2YWxpZCBXQUktQVJJQSByb2xlcyBpcyBhdmFpbGFibGUgYXQ6Ci0g
ICAgW2h0dHA6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhL3JvbGVzI3JvbGVzX2NhdGVnb3JpemF0
aW9uXShodHRwOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRlZ29yaXph
dGlvbikKLQotICAgIEBwcm9wZXJ0eSBhcmlhUm9sZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBk
ZWZhdWx0IG51bGwKLSAgKi8KLSAgYXJpYVJvbGU6IG51bGwsCi0KLSAgLyoqCi0gICAgU3RhbmRh
cmQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5IHRvIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVudC4g
VGhpcwotICAgIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkgaW5oZXJpdHMgYW55IGNsYXNzIG5hbWVz
IGRlZmluZWQgYnkgdGhlIHZpZXcncwotICAgIHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgotCi0gICAg
QHByb3BlcnR5IGNsYXNzTmFtZXMKLSAgICBAdHlwZSBBcnJheQotICAgIEBkZWZhdWx0IFsnZW1i
ZXItdmlldyddCi0gICovCi0gIGNsYXNzTmFtZXM6IFsnZW1iZXItdmlldyddLAotCi0gIC8qKgot
ICAgIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGNsYXNzIG5h
bWVzLiBJZiB0aGUgcHJvcGVydHkKLSAgICBpcyBhIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVlIG9m
IHRoYXQgc3RyaW5nIHdpbGwgYmUgYXBwbGllZCBhcyBhIGNsYXNzCi0gICAgbmFtZS4KLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICAvLyBBcHBsaWVzIHRoZSAnaGlnaCcgY2xhc3MgdG8gdGhlIHZp
ZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRp
bmdzOiBbJ3ByaW9yaXR5J10KLSAgICAgIHByaW9yaXR5OiAnaGlnaCcKLSAgICB9KTsKLSAgICBg
YGAKLQotICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUg
bmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCi0gICAgYWRkZWQgYXMgYSBkYXNoZXJpemVkIGNsYXNz
IG5hbWUuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgJ2lzLXVyZ2Vu
dCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAg
ICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50J10KLSAgICAgIGlzVXJnZW50OiB0cnVl
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBJZiB5b3Ugd291bGQgcHJlZmVyIHRvIHVzZSBhIGN1
c3RvbSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkYXNoZXJpemVkCi0gICAgcHJvcGVydHkgbmFtZSwg
eW91IGNhbiBwYXNzIGEgYmluZGluZyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgLy8gQXBwbGllcyB0aGUgJ3VyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAg
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50
OnVyZ2VudCddCi0gICAgICBpc1VyZ2VudDogdHJ1ZQotICAgIH0pOwotICAgIGBgYAotCi0gICAg
VGhpcyBsaXN0IG9mIHByb3BlcnRpZXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHZpZXcncyBzdXBl
cmNsYXNzZXMgYXMgd2VsbC4KLQotICAgIEBwcm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAg
IEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgW10KLSAgKi8KLSAgY2xhc3NOYW1lQmluZGluZ3M6
IEVNUFRZX0FSUkFZLAotCi0gIC8qKgotICAgIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSB2
aWV3IHRvIGFwcGx5IGFzIGF0dHJpYnV0ZXMuIElmIHRoZSBwcm9wZXJ0eSBpcwotICAgIGEgc3Ry
aW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhhdCBzdHJpbmcgd2lsbCBiZSBhcHBsaWVkIGFzIHRo
ZSBhdHRyaWJ1dGUuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgdHlw
ZSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQKLSAgICAvLyB3aXRoIHRoZSB2YWx1ZSAiYnV0dG9u
IiwgbGlrZSA8ZGl2IHR5cGU9ImJ1dHRvbiI+Ci0gICAgRW1iZXIuVmlldy5leHRlbmQoewotICAg
ICAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZSddLAotICAgICAgdHlwZTogJ2J1dHRvbicKLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYSBC
b29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCi0gICAgYWRkZWQgYXMgYW4gYXR0
cmlidXRlLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIC8vIFJlbmRlcnMgc29tZXRoaW5nIGxp
a2UgPGRpdiBlbmFibGVkPSJlbmFibGVkIj4KLSAgICBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
ICBhdHRyaWJ1dGVCaW5kaW5nczogWydlbmFibGVkJ10sCi0gICAgICBlbmFibGVkOiB0cnVlCi0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgYXR0cmlidXRlQmluZGluZ3MKLSAgKi8K
LSAgYXR0cmlidXRlQmluZGluZ3M6IEVNUFRZX0FSUkFZLAotCi0gIC8vIC4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gQ09SRSBESVNQ
TEFZIE1FVEhPRFMKLSAgLy8KLQotICAvKioKLSAgICBTZXR1cCBhIHZpZXcsIGJ1dCBkbyBub3Qg
ZmluaXNoIHdha2luZyBpdCB1cC4KLQotICAgICogY29uZmlndXJlIGBjaGlsZFZpZXdzYAotICAg
ICogcmVnaXN0ZXIgdGhlIHZpZXcgd2l0aCB0aGUgZ2xvYmFsIHZpZXdzIGhhc2gsIHdoaWNoIGlz
IHVzZWQgZm9yIGV2ZW50Ci0gICAgICBkaXNwYXRjaAotCi0gICAgQG1ldGhvZCBpbml0Ci0gICAg
QHByaXZhdGUKLSAgKi8KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lbGVtZW50SWQg
PSB0aGlzLmVsZW1lbnRJZCB8fCBndWlkRm9yKHRoaXMpOwotCi0gICAgdGhpcy5fc3VwZXIoKTsK
LQotICAgIC8vIHNldHVwIGNoaWxkIHZpZXdzLiBiZSBzdXJlIHRvIGNsb25lIHRoZSBjaGlsZCB2
aWV3cyBhcnJheSBmaXJzdAotICAgIHRoaXMuX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdz
LnNsaWNlKCk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZv
ciAnY2xhc3NOYW1lQmluZGluZ3MnIiwgRW1iZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lQmluZGlu
Z3MpID09PSAnYXJyYXknKTsKLSAgICB0aGlzLmNsYXNzTmFtZUJpbmRpbmdzID0gRW1iZXIuQSh0
aGlzLmNsYXNzTmFtZUJpbmRpbmdzLnNsaWNlKCkpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJPbmx5
IGFycmF5cyBhcmUgYWxsb3dlZCBmb3IgJ2NsYXNzTmFtZXMnIiwgRW1iZXIudHlwZU9mKHRoaXMu
Y2xhc3NOYW1lcykgPT09ICdhcnJheScpOwotICAgIHRoaXMuY2xhc3NOYW1lcyA9IEVtYmVyLkEo
dGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOwotICB9LAotCi0gIGFwcGVuZENoaWxkOiBmdW5jdGlv
bih2aWV3LCBvcHRpb25zKSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmFwcGVuZENo
aWxkKHRoaXMsIHZpZXcsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhl
IGNoaWxkIHZpZXcgZnJvbSB0aGUgcGFyZW50IHZpZXcuCi0KLSAgICBAbWV0aG9kIHJlbW92ZUNo
aWxkCi0gICAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3Ci0gICAgQHJldHVybiB7RW1iZXIuVmll
d30gcmVjZWl2ZXIKLSAgKi8KLSAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAv
LyBJZiB3ZSdyZSBkZXN0cm95aW5nLCB0aGUgZW50aXJlIHN1YnRyZWUgd2lsbCBiZQotICAgIC8v
IGZyZWVkLCBhbmQgdGhlIERPTSB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseSwKLSAgICAvLyBz
byBubyBuZWVkIHRvIG1lc3Mgd2l0aCBjaGlsZFZpZXdzLgotICAgIGlmICh0aGlzLmlzRGVzdHJv
eWluZykgeyByZXR1cm47IH0KLQotICAgIC8vIHVwZGF0ZSBwYXJlbnQgbm9kZQotICAgIHNldCh2
aWV3LCAnX3BhcmVudFZpZXcnLCBudWxsKTsKLQotICAgIC8vIHJlbW92ZSB2aWV3IGZyb20gY2hp
bGRWaWV3cyBhcnJheS4KLSAgICB2YXIgY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3M7Ci0K
LSAgICBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVtb3ZlT2JqZWN0KGNoaWxkVmlld3MsIHZpZXcp
OwotCi0gICAgdGhpcy5wcm9wZXJ0eURpZENoYW5nZSgnY2hpbGRWaWV3cycpOyAvLyBIVUg/ISB3
aGF0IGhhcHBlbmVkIHRvIHdpbGwgY2hhbmdlPwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSB0aGUgYHBhcmVudFZpZXdgLgot
Ci0gICAgQG1ldGhvZCByZW1vdmVBbGxDaGlsZHJlbgotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9
IHJlY2VpdmVyCi0gICovCi0gIHJlbW92ZUFsbENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICBy
ZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsK
LSAgICAgIHBhcmVudFZpZXcucmVtb3ZlQ2hpbGQodmlldyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAg
ZGVzdHJveUFsbENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5tdXRhdGVD
aGlsZFZpZXdzKGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsKLSAgICAgIHZpZXcuZGVzdHJv
eSgpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBp
dHMgYHBhcmVudFZpZXdgLCBpZiBvbmUgaXMgZm91bmQuIE90aGVyd2lzZQotICAgIGRvZXMgbm90
aGluZy4KLQotICAgIEBtZXRob2QgcmVtb3ZlRnJvbVBhcmVudAotICAgIEByZXR1cm4ge0VtYmVy
LlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJlbW92ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uKCkgewot
ICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3OwotCi0gICAgLy8gUmVtb3ZlIERPTSBl
bGVtZW50IGZyb20gcGFyZW50Ci0gICAgdGhpcy5yZW1vdmUoKTsKLQotICAgIGlmIChwYXJlbnQp
IHsgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOyB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgWW91IG11c3QgY2FsbCBgZGVzdHJveWAgb24gYSB2aWV3IHRvIGRlc3Ryb3kg
dGhlIHZpZXcgKGFuZCBhbGwgb2YgaXRzCi0gICAgY2hpbGQgdmlld3MpLiBUaGlzIHdpbGwgcmVt
b3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVudCBub2RlLCB0aGVuIG1ha2UKLSAgICBzdXJlIHRo
YXQgdGhlIERPTSBlbGVtZW50IG1hbmFnZWQgYnkgdGhlIHZpZXcgY2FuIGJlIHJlbGVhc2VkIGJ5
IHRoZQotICAgIG1lbW9yeSBtYW5hZ2VyLgotCi0gICAgQG1ldGhvZCBkZXN0cm95Ci0gICovCi0g
IGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRW
aWV3cywKLSAgICAgICAgLy8gZ2V0IHBhcmVudFZpZXcgYmVmb3JlIGNhbGxpbmcgc3VwZXIgYmVj
YXVzZSBpdCdsbCBiZSBkZXN0cm95ZWQKLSAgICAgICAgbm9uVmlydHVhbFBhcmVudFZpZXcgPSBn
ZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAgICAgICAgdmlld05hbWUgPSB0aGlzLnZpZXdOYW1l
LAotICAgICAgICBjaGlsZExlbiwgaTsKLQotICAgIGlmICghdGhpcy5fc3VwZXIoKSkgeyByZXR1
cm47IH0KLQotICAgIGNoaWxkTGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgZm9yIChpPWNo
aWxkTGVuLTE7IGk+PTA7IGktLSkgewotICAgICAgY2hpbGRWaWV3c1tpXS5yZW1vdmVkRnJvbURP
TSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gcmVtb3ZlIGZyb20gbm9uLXZpcnR1YWwgcGFyZW50
IHZpZXcgaWYgdmlld05hbWUgd2FzIHNwZWNpZmllZAotICAgIGlmICh2aWV3TmFtZSAmJiBub25W
aXJ0dWFsUGFyZW50VmlldykgewotICAgICAgbm9uVmlydHVhbFBhcmVudFZpZXcuc2V0KHZpZXdO
YW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBjaGlsZExlbiA9IGNoaWxkVmlld3MubGVuZ3RoOwot
ICAgIGZvciAoaT1jaGlsZExlbi0xOyBpPj0wOyBpLS0pIHsKLSAgICAgIGNoaWxkVmlld3NbaV0u
ZGVzdHJveSgpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAg
IEluc3RhbnRpYXRlcyBhIHZpZXcgdG8gYmUgYWRkZWQgdG8gdGhlIGNoaWxkVmlld3MgYXJyYXkg
ZHVyaW5nIHZpZXcKLSAgICBpbml0aWFsaXphdGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBj
YWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IHVubGVzcwotICAgIHlvdSBhcmUgb3ZlcnJpZGluZyBg
Y3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKLSAgICBhdXRv
bWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBzZXR0aW5ncyBvbiB0aGUgbmV3IHZpZXcg
aW5zdGFuY2UgdG8KLSAgICBhY3QgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50LgotCi0gICAgQG1l
dGhvZCBjcmVhdGVDaGlsZFZpZXcKLSAgICBAcGFyYW0ge0NsYXNzfFN0cmluZ30gdmlld0NsYXNz
Ci0gICAgQHBhcmFtIHtIYXNofSBbYXR0cnNdIEF0dHJpYnV0ZXMgdG8gYWRkCi0gICAgQHJldHVy
biB7RW1iZXIuVmlld30gbmV3IGluc3RhbmNlCi0gICovCi0gIGNyZWF0ZUNoaWxkVmlldzogZnVu
Y3Rpb24odmlldywgYXR0cnMpIHsKLSAgICBpZiAoIXZpZXcpIHsKLSAgICAgIHRocm93IG5ldyBU
eXBlRXJyb3IoImNyZWF0ZUNoaWxkVmlld3MgZmlyc3QgYXJndW1lbnQgbXVzdCBleGlzdCIpOwot
ICAgIH0KLQotICAgIGlmICh2aWV3LmlzVmlldyAmJiB2aWV3Ll9wYXJlbnRWaWV3ID09PSB0aGlz
ICYmIHZpZXcuY29udGFpbmVyID09PSB0aGlzLmNvbnRhaW5lcikgewotICAgICAgcmV0dXJuIHZp
ZXc7Ci0gICAgfQotCi0gICAgYXR0cnMgPSBhdHRycyB8fCB7fTsKLSAgICBhdHRycy5fcGFyZW50
VmlldyA9IHRoaXM7Ci0KLSAgICBpZiAoRW1iZXIuQ29yZVZpZXcuZGV0ZWN0KHZpZXcpKSB7Ci0g
ICAgICBhdHRycy50ZW1wbGF0ZURhdGEgPSBhdHRycy50ZW1wbGF0ZURhdGEgfHwgZ2V0KHRoaXMs
ICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgICAgYXR0cnMuY29udGFpbmVyID0gdGhpcy5jb250YWlu
ZXI7Ci0gICAgICB2aWV3ID0gdmlldy5jcmVhdGUoYXR0cnMpOwotCi0gICAgICAvLyBkb24ndCBz
ZXQgdGhlIHByb3BlcnR5IG9uIGEgdmlydHVhbCB2aWV3LCBhcyB0aGV5IGFyZSBpbnZpc2libGUg
dG8KLSAgICAgIC8vIGNvbnN1bWVycyBvZiB0aGUgdmlldyBBUEkKLSAgICAgIGlmICh2aWV3LnZp
ZXdOYW1lKSB7Ci0gICAgICAgIHNldChnZXQodGhpcywgJ2NvbmNyZXRlVmlldycpLCB2aWV3LnZp
ZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBl
b2YgdmlldykgewotICAgICAgdmFyIGZ1bGxOYW1lID0gJ3ZpZXc6JyArIHZpZXc7Ci0gICAgICB2
YXIgVmlldyA9IHRoaXMuY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUpOwotCi0gICAg
ICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIHZpZXc6ICciICsgZnVsbE5hbWUgKyAiJyIs
ICEhVmlldyk7Ci0KLSAgICAgIGF0dHJzLnRlbXBsYXRlRGF0YSA9IGdldCh0aGlzLCAndGVtcGxh
dGVEYXRhJyk7Ci0gICAgICB2aWV3ID0gVmlldy5jcmVhdGUoYXR0cnMpOwotICAgIH0gZWxzZSB7
Ci0gICAgICBFbWJlci5hc3NlcnQoJ1lvdSBtdXN0IHBhc3MgaW5zdGFuY2Ugb3Igc3ViY2xhc3Mg
b2YgVmlldycsIHZpZXcuaXNWaWV3KTsKLSAgICAgIGF0dHJzLmNvbnRhaW5lciA9IHRoaXMuY29u
dGFpbmVyOwotCi0gICAgICBpZiAoIWdldCh2aWV3LCAndGVtcGxhdGVEYXRhJykpIHsKLSAgICAg
ICAgYXR0cnMudGVtcGxhdGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLSAgICAg
IH0KLQotICAgICAgRW1iZXIuc2V0UHJvcGVydGllcyh2aWV3LCBhdHRycyk7Ci0KLSAgICB9Ci0K
LSAgICByZXR1cm4gdmlldzsKLSAgfSwKLQotICBiZWNhbWVWaXNpYmxlOiBFbWJlci5LLAotICBi
ZWNhbWVIaWRkZW46IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgV2hlbiB0aGUgdmlldydzIGBpc1Zp
c2libGVgIHByb3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUgdmlzaWJpbGl0eQotICAgIGVsZW1l
bnQgb2YgdGhlIGFjdHVhbCBET00gZWxlbWVudC4KLQotICAgIEBtZXRob2QgX2lzVmlzaWJsZURp
ZENoYW5nZQotICAgIEBwcml2YXRlCi0gICovCi0gIF9pc1Zpc2libGVEaWRDaGFuZ2U6IEVtYmVy
Lm9ic2VydmVyKCdpc1Zpc2libGUnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgJGVsID0gdGhpcy4k
KCk7Ci0gICAgaWYgKCEkZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgaXNWaXNpYmxlID0gZ2V0
KHRoaXMsICdpc1Zpc2libGUnKTsKLQotICAgICRlbC50b2dnbGUoaXNWaXNpYmxlKTsKLQotICAg
IGlmICh0aGlzLl9pc0FuY2VzdG9ySGlkZGVuKCkpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAoaXNW
aXNpYmxlKSB7Ci0gICAgICB0aGlzLl9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIHRoaXMuX25vdGlmeUJlY2FtZUhpZGRlbigpOwotICAgIH0KLSAgfSksCi0KLSAg
X25vdGlmeUJlY2FtZVZpc2libGU6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMudHJpZ2dlcignYmVj
YW1lVmlzaWJsZScpOwotCi0gICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcp
IHsKLSAgICAgIHZhciBpc1Zpc2libGUgPSBnZXQodmlldywgJ2lzVmlzaWJsZScpOwotCi0gICAg
ICBpZiAoaXNWaXNpYmxlIHx8IGlzVmlzaWJsZSA9PT0gbnVsbCkgewotICAgICAgICB2aWV3Ll9u
b3RpZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgX25vdGlm
eUJlY2FtZUhpZGRlbjogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVIaWRk
ZW4nKTsKLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAg
dmFyIGlzVmlzaWJsZSA9IGdldCh2aWV3LCAnaXNWaXNpYmxlJyk7Ci0KLSAgICAgIGlmIChpc1Zp
c2libGUgfHwgaXNWaXNpYmxlID09PSBudWxsKSB7Ci0gICAgICAgIHZpZXcuX25vdGlmeUJlY2Ft
ZUhpZGRlbigpOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIF9pc0FuY2VzdG9ySGlkZGVu
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFyZW50ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7
Ci0KLSAgICB3aGlsZSAocGFyZW50KSB7Ci0gICAgICBpZiAoZ2V0KHBhcmVudCwgJ2lzVmlzaWJs
ZScpID09PSBmYWxzZSkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgICBwYXJlbnQgPSBnZXQocGFy
ZW50LCAncGFyZW50VmlldycpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLQot
ICBjbGVhckJ1ZmZlcjogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5pbnZva2VSZWN1cnNpdmVseShm
dW5jdGlvbih2aWV3KSB7Ci0gICAgICB2aWV3LmJ1ZmZlciA9IG51bGw7Ci0gICAgfSk7Ci0gIH0s
Ci0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihzdGF0ZSwgY2hpbGRyZW4pIHsKLSAgICB2YXIg
cHJpb3JTdGF0ZSA9IHRoaXMuY3VycmVudFN0YXRlLAotICAgICAgICBjdXJyZW50U3RhdGUgPSB0
aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGVzW3N0YXRlXTsKLSAgICB0aGlzLnN0YXRlID0g
c3RhdGU7Ci0KLSAgICBpZiAocHJpb3JTdGF0ZSAmJiBwcmlvclN0YXRlLmV4aXQpIHsgcHJpb3JT
dGF0ZS5leGl0KHRoaXMpOyB9Ci0gICAgaWYgKGN1cnJlbnRTdGF0ZS5lbnRlcikgeyBjdXJyZW50
U3RhdGUuZW50ZXIodGhpcyk7IH0KLSAgICBpZiAoc3RhdGUgPT09ICdpbkRPTScpIHsgZGVsZXRl
IEVtYmVyLm1ldGEodGhpcykuY2FjaGUuZWxlbWVudDsgfQotCi0gICAgaWYgKGNoaWxkcmVuICE9
PSBmYWxzZSkgewotICAgICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsK
LSAgICAgICAgdmlldy50cmFuc2l0aW9uVG8oc3RhdGUpOwotICAgICAgfSk7Ci0gICAgfQotICB9
LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLSAgLy8gRVZFTlQgSEFORExJTkcKLSAgLy8KLQotICAvKioKLSAgICBIYW5kbGUg
ZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAKLQotICAgIEBtZXRob2QgaGFuZGxl
RXZlbnQKLSAgICBAcGFyYW0gZXZlbnROYW1lIHtTdHJpbmd9Ci0gICAgQHBhcmFtIGV2dCB7RXZl
bnR9Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFt
ZSwgZXZ0KSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMs
IGV2ZW50TmFtZSwgZXZ0KTsKLSAgfSwKLQotICByZWdpc3Rlck9ic2VydmVyOiBmdW5jdGlvbihy
b290LCBwYXRoLCB0YXJnZXQsIG9ic2VydmVyKSB7Ci0gICAgaWYgKCFvYnNlcnZlciAmJiAnZnVu
Y3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgICBvYnNlcnZlciA9IHRhcmdldDsKLSAg
ICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgaWYgKCFyb290IHx8IHR5cGVvZiByb290
ICE9PSAnb2JqZWN0JykgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhciB2aWV3ID0g
dGhpcywKLSAgICAgICAgc3RhdGVDaGVja2VkT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAg
ICAgICB2aWV3LmN1cnJlbnRTdGF0ZS5pbnZva2VPYnNlcnZlcih0aGlzLCBvYnNlcnZlcik7Ci0g
ICAgICAgIH0sCi0gICAgICAgIHNjaGVkdWxlZE9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgc3RhdGVDaGVja2Vk
T2JzZXJ2ZXIpOwotICAgICAgICB9OwotCi0gICAgRW1iZXIuYWRkT2JzZXJ2ZXIocm9vdCwgcGF0
aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZlcik7Ci0KLSAgICB0aGlzLm9uZSgnd2lsbENsZWFy
UmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihyb290LCBw
YXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2VydmVyKTsKLSAgICB9KTsKLSAgfQotCi19KTsKLQot
LyoKLSAgRGVzY3JpYmUgaG93IHRoZSBzcGVjaWZpZWQgYWN0aW9ucyBzaG91bGQgYmVoYXZlIGlu
IHRoZSB2YXJpb3VzCi0gIHN0YXRlcyB0aGF0IGEgdmlldyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxl
IHN0YXRlczoKLQotICAqIHByZVJlbmRlcjogd2hlbiBhIHZpZXcgaXMgZmlyc3QgaW5zdGFudGlh
dGVkLCBhbmQgYWZ0ZXIgaXRzCi0gICAgZWxlbWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0
aGUgcHJlUmVuZGVyIHN0YXRlCi0gICogaW5CdWZmZXI6IG9uY2UgYSB2aWV3IGhhcyBiZWVuIHJl
bmRlcmVkLCBidXQgYmVmb3JlIGl0IGhhcwotICAgIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9N
LCBpdCBpcyBpbiB0aGUgaW5CdWZmZXIgc3RhdGUKLSAgKiBpbkRPTTogb25jZSBhIHZpZXcgaGFz
IGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NIGl0IGlzIGluCi0gICAgdGhlIGluRE9NIHN0YXRl
LiBBIHZpZXcgc3BlbmRzIHRoZSB2YXN0IG1ham9yaXR5IG9mIGl0cwotICAgIGV4aXN0ZW5jZSBp
biB0aGlzIHN0YXRlLgotICAqIGRlc3Ryb3llZDogb25jZSBhIHZpZXcgaGFzIGJlZW4gZGVzdHJv
eWVkICh1c2luZyB0aGUgZGVzdHJveQotICAgIG1ldGhvZCksIGl0IGlzIGluIHRoaXMgc3RhdGUu
IE5vIGZ1cnRoZXIgYWN0aW9ucyBjYW4gYmUgaW52b2tlZAotICAgIG9uIGEgZGVzdHJveWVkIHZp
ZXcuCi0qLwotCi0gIC8vIGluIHRoZSBkZXN0cm95ZWQgc3RhdGUsIGV2ZXJ5dGhpbmcgaXMgaWxs
ZWdhbAotCi0gIC8vIGJlZm9yZSByZW5kZXJpbmcgaGFzIGJlZ3VuLCBhbGwgbGVnYWwgbWFuaXB1
bGF0aW9ucyBhcmUgbm9vcHMuCi0KLSAgLy8gaW5zaWRlIHRoZSBidWZmZXIsIGxlZ2FsIG1hbmlw
dWxhdGlvbnMgYXJlIGRvbmUgb24gdGhlIGJ1ZmZlcgotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFz
IGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBsZWdhbCBtYW5pcHVsYXRpb25zCi0gIC8vIGFy
ZSBkb25lIG9uIHRoZSBET00gZWxlbWVudC4KLQotZnVuY3Rpb24gbm90aWZ5TXV0YXRpb25MaXN0
ZW5lcnMoKSB7Ci0gIEVtYmVyLnJ1bi5vbmNlKEVtYmVyLlZpZXcsICdub3RpZnlNdXRhdGlvbkxp
c3RlbmVycycpOwotfQotCi12YXIgRE9NTWFuYWdlciA9IHsKLSAgcHJlcGVuZDogZnVuY3Rpb24o
dmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLnByZXBlbmQoaHRtbCk7Ci0gICAgbm90aWZ5TXV0
YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICBhZnRlcjogZnVuY3Rpb24odmlldywgaHRtbCkg
ewotICAgIHZpZXcuJCgpLmFmdGVyKGh0bWwpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJz
KCk7Ci0gIH0sCi0KLSAgaHRtbDogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgp
Lmh0bWwoaHRtbCk7Ci0gICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICBy
ZXBsYWNlOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgdmFyIGVsZW1lbnQgPSBnZXQodmlldywgJ2Vs
ZW1lbnQnKTsKLQotICAgIHNldCh2aWV3LCAnZWxlbWVudCcsIG51bGwpOwotCi0gICAgdmlldy5f
aW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9uKCkgewotICAgICAgRW1iZXIuJChlbGVtZW50KS5y
ZXBsYWNlV2l0aChnZXQodmlldywgJ2VsZW1lbnQnKSk7Ci0gICAgICBub3RpZnlNdXRhdGlvbkxp
c3RlbmVycygpOwotICAgIH0pOwotICB9LAotCi0gIHJlbW92ZTogZnVuY3Rpb24odmlldykgewot
ICAgIHZpZXcuJCgpLnJlbW92ZSgpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0g
IH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LiQoKS5lbXB0eSgpOwot
ICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0KLX07Ci0KLUVtYmVyLlZpZXcucmVv
cGVuKHsKLSAgZG9tTWFuYWdlcjogRE9NTWFuYWdlcgotfSk7Ci0KLUVtYmVyLlZpZXcucmVvcGVu
Q2xhc3MoewotCi0gIC8qKgotICAgIFBhcnNlIGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3
aGljaCBob2xkcyB0aGUgcGFyc2VkIHByb3BlcnRpZXMuCi0KLSAgICBGb3IgZXhhbXBsZSBhIHBh
dGggbGlrZSAiY29udGVudC5pc0VuYWJsZWQ6ZW5hYmxlZDpkaXNhYmxlZCIgd2lsbCByZXR1cm4g
dGhlCi0gICAgZm9sbG93aW5nIG9iamVjdDoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB7Ci0g
ICAgICBwYXRoOiAiY29udGVudC5pc0VuYWJsZWQiLAotICAgICAgY2xhc3NOYW1lOiAiZW5hYmxl
ZCIsCi0gICAgICBmYWxzeUNsYXNzTmFtZTogImRpc2FibGVkIiwKLSAgICAgIGNsYXNzTmFtZXM6
ICI6ZW5hYmxlZDpkaXNhYmxlZCIKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9wYXJz
ZVByb3BlcnR5UGF0aAotICAgIEBzdGF0aWMKLSAgICBAcHJpdmF0ZQotICAqLwotICBfcGFyc2VQ
cm9wZXJ0eVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3BsaXQgPSBwYXRoLnNwbGl0
KCc6JyksCi0gICAgICAgIHByb3BlcnR5UGF0aCA9IHNwbGl0WzBdLAotICAgICAgICBjbGFzc05h
bWVzID0gIiIsCi0gICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgZmFsc3lDbGFzc05hbWU7Ci0K
LSAgICAvLyBjaGVjayBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBhcyBwcm9wOmNsYXNzIG9y
IHByb3A6dHJ1ZUNsYXNzOmZhbHNlQ2xhc3MKLSAgICBpZiAoc3BsaXQubGVuZ3RoID4gMSkgewot
ICAgICAgY2xhc3NOYW1lID0gc3BsaXRbMV07Ci0gICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAz
KSB7IGZhbHN5Q2xhc3NOYW1lID0gc3BsaXRbMl07IH0KLQotICAgICAgY2xhc3NOYW1lcyA9ICc6
JyArIGNsYXNzTmFtZTsKLSAgICAgIGlmIChmYWxzeUNsYXNzTmFtZSkgeyBjbGFzc05hbWVzICs9
ICI6IiArIGZhbHN5Q2xhc3NOYW1lOyB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHsKLSAgICAgIHBh
dGg6IHByb3BlcnR5UGF0aCwKLSAgICAgIGNsYXNzTmFtZXM6IGNsYXNzTmFtZXMsCi0gICAgICBj
bGFzc05hbWU6IChjbGFzc05hbWUgPT09ICcnKSA/IHVuZGVmaW5lZCA6IGNsYXNzTmFtZSwKLSAg
ICAgIGZhbHN5Q2xhc3NOYW1lOiBmYWxzeUNsYXNzTmFtZQotICAgIH07Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgR2V0IHRoZSBjbGFzcyBuYW1lIGZvciBhIGdpdmVuIHZhbHVlLCBiYXNlZCBvbiB0aGUg
cGF0aCwgb3B0aW9uYWwKLSAgICBgY2xhc3NOYW1lYCBhbmQgb3B0aW9uYWwgYGZhbHN5Q2xhc3NO
YW1lYC4KLQotICAgIC0gaWYgYSBgY2xhc3NOYW1lYCBvciBgZmFsc3lDbGFzc05hbWVgIGhhcyBi
ZWVuIHNwZWNpZmllZDoKLSAgICAgIC0gaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgYGNsYXNz
TmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAotICAgICAgICBgY2xhc3NOYW1lYCBpcyByZXR1cm5l
ZAotICAgICAgLSBpZiB0aGUgdmFsdWUgaXMgZmFsc3kgYW5kIGBmYWxzeUNsYXNzTmFtZWAgaGFz
IGJlZW4gc3BlY2lmaWVkLAotICAgICAgICBgZmFsc3lDbGFzc05hbWVgIGlzIHJldHVybmVkCi0g
ICAgICAtIG90aGVyd2lzZSBgbnVsbGAgaXMgcmV0dXJuZWQKLSAgICAtIGlmIHRoZSB2YWx1ZSBp
cyBgdHJ1ZWAsIHRoZSBkYXNoZXJpemVkIGxhc3QgcGFydCBvZiB0aGUgc3VwcGxpZWQgcGF0aAot
ICAgICAgaXMgcmV0dXJuZWQKLSAgICAtIGlmIHRoZSB2YWx1ZSBpcyBub3QgYGZhbHNlYCwgYHVu
ZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZhbHVlYAotICAgICAgaXMgcmV0dXJuZWQKLSAgICAt
IGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVzIGFwcGx5LCBgbnVsbGAgaXMgcmV0dXJuZWQKLQot
ICAgIEBtZXRob2QgX2NsYXNzU3RyaW5nRm9yVmFsdWUKLSAgICBAcGFyYW0gcGF0aAotICAgIEBw
YXJhbSB2YWwKLSAgICBAcGFyYW0gY2xhc3NOYW1lCi0gICAgQHBhcmFtIGZhbHN5Q2xhc3NOYW1l
Ci0gICAgQHN0YXRpYwotICAgIEBwcml2YXRlCi0gICovCi0gIF9jbGFzc1N0cmluZ0ZvclZhbHVl
OiBmdW5jdGlvbihwYXRoLCB2YWwsIGNsYXNzTmFtZSwgZmFsc3lDbGFzc05hbWUpIHsKLSAgICAv
LyBXaGVuIHVzaW5nIHRoZSBjb2xvbiBzeW50YXgsIGV2YWx1YXRlIHRoZSB0cnV0aGluZXNzIG9y
IGZhbHNpbmVzcwotICAgIC8vIG9mIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhc3NO
YW1lIHRvIHJldHVybgotICAgIGlmIChjbGFzc05hbWUgfHwgZmFsc3lDbGFzc05hbWUpIHsKLSAg
ICAgIGlmIChjbGFzc05hbWUgJiYgISF2YWwpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsK
LQotICAgICAgfSBlbHNlIGlmIChmYWxzeUNsYXNzTmFtZSAmJiAhdmFsKSB7Ci0gICAgICAgIHJl
dHVybiBmYWxzeUNsYXNzTmFtZTsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51
bGw7Ci0gICAgICB9Ci0KLSAgICAvLyBJZiB2YWx1ZSBpcyBhIEJvb2xlYW4gYW5kIHRydWUsIHJl
dHVybiB0aGUgZGFzaGVyaXplZCBwcm9wZXJ0eQotICAgIC8vIG5hbWUuCi0gICAgfSBlbHNlIGlm
ICh2YWwgPT09IHRydWUpIHsKLSAgICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0eSBwYXRoIHRvIGJl
IHN1aXRhYmxlIGZvciB1c2UKLSAgICAgIC8vIGFzIGEgY2xhc3MgbmFtZS4gRm9yIGV4YXBsZSwg
Y29udGVudC5mb28uYmFyQmF6Ci0gICAgICAvLyBiZWNvbWVzIGJhci1iYXouCi0gICAgICB2YXIg
cGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7Ci0gICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmRhc2hl
cml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pOwotCi0gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5v
dCBmYWxzZSwgdW5kZWZpbmVkLCBvciBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAvLyB2
YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgfSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZh
bCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gdmFsOwotCi0gICAgLy8gTm90aGluZyB0byBkaXNw
bGF5LiBSZXR1cm4gbnVsbCBzbyB0aGF0IHRoZSBvbGQgY2xhc3MgaXMgcmVtb3ZlZAotICAgIC8v
IGJ1dCBubyBuZXcgY2xhc3MgaXMgYWRkZWQuCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBu
dWxsOwotICAgIH0KLSAgfQotfSk7Ci0KLXZhciBtdXRhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRl
bmQoRW1iZXIuRXZlbnRlZCkuY3JlYXRlKCk7Ci0KLUVtYmVyLlZpZXcuYWRkTXV0YXRpb25MaXN0
ZW5lciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gIG11dGF0aW9uLm9uKCdjaGFuZ2UnLCBjYWxs
YmFjayk7Ci19OwotCi1FbWJlci5WaWV3LnJlbW92ZU11dGF0aW9uTGlzdGVuZXIgPSBmdW5jdGlv
bihjYWxsYmFjaykgewotICBtdXRhdGlvbi5vZmYoJ2NoYW5nZScsIGNhbGxiYWNrKTsKLX07Ci0K
LUVtYmVyLlZpZXcubm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHsKLSAgbXV0
YXRpb24udHJpZ2dlcignY2hhbmdlJyk7Ci19OwotCi0vKioKLSAgR2xvYmFsIHZpZXdzIGhhc2gK
LQotICBAcHJvcGVydHkgdmlld3MKLSAgQHN0YXRpYwotICBAdHlwZSBIYXNoCi0qLwotRW1iZXIu
Vmlldy52aWV3cyA9IHt9OwotCi0vLyBJZiBzb21lb25lIG92ZXJyaWRlcyB0aGUgY2hpbGQgdmll
d3MgY29tcHV0ZWQgcHJvcGVydHkgd2hlbgotLy8gZGVmaW5pbmcgdGhlaXIgY2xhc3MsIHdlIHdh
bnQgdG8gYmUgYWJsZSB0byBwcm9jZXNzIHRoZSB1c2VyJ3MKLS8vIHN1cHBsaWVkIGNoaWxkVmll
d3MgYW5kIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgY29tcHV0ZWQgcHJvcGVydHkKLS8vIGF0
IHZpZXcgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhpcyBoYXBwZW5zIGluIEVtYmVyLkNvbnRhaW5l
clZpZXcncyBpbml0Ci0vLyBtZXRob2QuCi1FbWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSA9
IGNoaWxkVmlld3NQcm9wZXJ0eTsKLQotRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdz
ID0gZnVuY3Rpb24oZWxlbSwgbmFtZSwgdmFsdWUpIHsKLSAgdmFyIHR5cGUgPSBFbWJlci50eXBl
T2YodmFsdWUpOwotCi0gIC8vIGlmIHRoaXMgY2hhbmdlcywgYWxzbyBjaGFuZ2UgdGhlIGxvZ2lj
IGluIGVtYmVyLWhhbmRsZWJhcnMvbGliL2hlbHBlcnMvYmluZGluZy5qcwotICBpZiAobmFtZSAh
PT0gJ3ZhbHVlJyAmJiAodHlwZSA9PT0gJ3N0cmluZycgfHwgKHR5cGUgPT09ICdudW1iZXInICYm
ICFpc05hTih2YWx1ZSkpKSkgewotICAgIGlmICh2YWx1ZSAhPT0gZWxlbS5hdHRyKG5hbWUpKSB7
Ci0gICAgICBlbGVtLmF0dHIobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgfSBlbHNlIGlmIChuYW1l
ID09PSAndmFsdWUnIHx8IHR5cGUgPT09ICdib29sZWFuJykgewotICAgIC8vIFdlIGNhbid0IHNl
dCBwcm9wZXJ0aWVzIHRvIHVuZGVmaW5lZCBvciBudWxsCi0gICAgaWYgKEVtYmVyLmlzTm9uZSh2
YWx1ZSkpIHsgdmFsdWUgPSAnJzsgfQotCi0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgZWxlbS5y
ZW1vdmVBdHRyKG5hbWUpOwotICAgIH0KLQotICAgIGlmICh2YWx1ZSAhPT0gZWxlbS5wcm9wKG5h
bWUpKSB7Ci0gICAgICAvLyB2YWx1ZSBhbmQgYm9vbGVhbnMgc2hvdWxkIGFsd2F5cyBiZSBwcm9w
ZXJ0aWVzCi0gICAgICBlbGVtLnByb3AobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgfSBlbHNlIGlm
ICghdmFsdWUpIHsKLSAgICBlbGVtLnJlbW92ZUF0dHIobmFtZSk7Ci0gIH0KLX07Ci0KLUVtYmVy
LlZpZXcuc3RhdGVzID0gc3RhdGVzOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0g
RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLUVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0
ID0gewotICAvLyBhcHBlbmRDaGlsZCBpcyBvbmx5IGxlZ2FsIHdoaWxlIHJlbmRlcmluZyB0aGUg
YnVmZmVyLgotICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgIllvdSBjYW4n
dCB1c2UgYXBwZW5kQ2hpbGQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MiOwotICB9
LAotCi0gICQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0sCi0KLSAg
Z2V0RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLy8g
SGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCi0gIGhhbmRsZUV2ZW50
OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsgLy8gY29udGludWUgZXZlbnQgcHJvcGFn
YXRpb24KLSAgfSwKLQotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmlldykgewotICAgIHNl
dCh2aWV3LCAnZWxlbWVudCcsIG51bGwpOwotICAgIGlmICh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQp
IHsKLSAgICAgIEVtYmVyLnJ1bi5jYW5jZWwodmlldy5fc2NoZWR1bGVkSW5zZXJ0KTsKLSAgICAg
IHZpZXcuX3NjaGVkdWxlZEluc2VydCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiB2aWV3Owot
ICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHsKLSAgICByZXR1
cm4gZmFsc2U7Ci0gIH0sCi0KLSAgcmVyZW5kZXI6IEVtYmVyLkssCi0gIGludm9rZU9ic2VydmVy
OiBFbWJlci5LCi19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgcHJlUmVuZGVyID0gRW1i
ZXIuVmlldy5zdGF0ZXMucHJlUmVuZGVyID0gRW1iZXIuY3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVz
Ll9kZWZhdWx0KTsKLQotRW1iZXIubWVyZ2UocHJlUmVuZGVyLCB7Ci0gIC8vIGEgdmlldyBsZWF2
ZXMgdGhlIHByZVJlbmRlciBzdGF0ZSBvbmNlIGl0cyBlbGVtZW50IGhhcyBiZWVuCi0gIC8vIGNy
ZWF0ZWQgKGNyZWF0ZUVsZW1lbnQpLgotICBpbnNlcnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBm
bikgewotICAgIHZpZXcuY3JlYXRlRWxlbWVudCgpOwotICAgIHZhciB2aWV3Q29sbGVjdGlvbiA9
IHZpZXcudmlld0hpZXJhcmNoeUNvbGxlY3Rpb24oKTsKLQotICAgIHZpZXdDb2xsZWN0aW9uLnRy
aWdnZXIoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Ci0KLSAgICBmbi5jYWxsKHZpZXcpOwotCi0gICAg
Ly8gV2UgdHJhbnNpdGlvbiB0byBgaW5ET01gIGlmIHRoZSBlbGVtZW50IGV4aXN0cyBpbiB0aGUg
RE9NCi0gICAgdmFyIGVsZW1lbnQgPSB2aWV3LmdldCgnZWxlbWVudCcpOwotICAgIHdoaWxlIChl
bGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSB7Ci0gICAgICBpZiAoZWxlbWVudCA9PT0gZG9j
dW1lbnQpIHsKLSAgICAgICAgdmlld0NvbGxlY3Rpb24udHJhbnNpdGlvblRvKCdpbkRPTScsIGZh
bHNlKTsKLSAgICAgICAgdmlld0NvbGxlY3Rpb24udHJpZ2dlcignZGlkSW5zZXJ0RWxlbWVudCcp
OwotICAgICAgfQotICAgIH0KLQotICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1
bmN0aW9uKHZpZXcsIGJ1ZmZlcikgewotICAgIHZpZXcucmVuZGVyVG9CdWZmZXIoYnVmZmVyKTsK
LSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQotICBlbXB0eTogRW1iZXIuSywKLQotICBzZXRFbGVt
ZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgewot
ICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ2hhc0VsZW1lbnQnKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHZhbHVlOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVy
LmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIgaW5CdWZmZXIgPSBFbWJlci5WaWV3LnN0YXRl
cy5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7Ci0K
LUVtYmVyLm1lcmdlKGluQnVmZmVyLCB7Ci0gICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewotICAg
IC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZWxlbWVudCB5ZXQsIHNvbWVvbmUgY2FsbGluZyB0aGlz
LiQoKSBpcwotICAgIC8vIHRyeWluZyB0byB1cGRhdGUgYW4gZWxlbWVudCB0aGF0IGlzbid0IGlu
IHRoZSBET00uIEluc3RlYWQsCi0gICAgLy8gcmVyZW5kZXIgdGhlIHZpZXcgdG8gYWxsb3cgdGhl
IHJlbmRlciBtZXRob2QgdG8gcmVmbGVjdCB0aGUKLSAgICAvLyBjaGFuZ2VzLgotICAgIHZpZXcu
cmVyZW5kZXIoKTsKLSAgICByZXR1cm4gRW1iZXIuJCgpOwotICB9LAotCi0gIC8vIHdoZW4gYSB2
aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVyLCByZXJlbmRlcmluZyBpdCBzaW1wbHkKLSAgLy8g
cmVwbGFjZXMgdGhlIGV4aXN0aW5nIGJ1ZmZlciB3aXRoIGEgbmV3IG9uZQotICByZXJlbmRlcjog
ZnVuY3Rpb24odmlldykgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiU29tZXRoaW5nIHlv
dSBkaWQgY2F1c2VkIGEgdmlldyB0byByZS1yZW5kZXIgYWZ0ZXIgaXQgcmVuZGVyZWQgYnV0IGJl
Zm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLiIpOwotICB9LAotCi0gIC8vIHdoZW4g
YSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVyLCBhcHBlbmRpbmcgYSBjaGlsZAotICAvLyB2
aWV3IHdpbGwgcmVuZGVyIHRoYXQgdmlldyBhbmQgYXBwZW5kIHRoZSByZXN1bHRpbmcKLSAgLy8g
YnVmZmVyIGludG8gaXRzIGJ1ZmZlci4KLSAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKHZpZXcsIGNo
aWxkVmlldywgb3B0aW9ucykgewotICAgIHZhciBidWZmZXIgPSB2aWV3LmJ1ZmZlciwgX2NoaWxk
Vmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzOwotCi0gICAgY2hpbGRWaWV3ID0gdmlldy5jcmVhdGVD
aGlsZFZpZXcoY2hpbGRWaWV3LCBvcHRpb25zKTsKLSAgICBpZiAoIV9jaGlsZFZpZXdzLmxlbmd0
aCkgeyBfY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MgPSBfY2hpbGRWaWV3cy5zbGljZSgp
OyB9Ci0gICAgX2NoaWxkVmlld3MucHVzaChjaGlsZFZpZXcpOwotCi0gICAgY2hpbGRWaWV3LnJl
bmRlclRvQnVmZmVyKGJ1ZmZlcik7Ci0KLSAgICB2aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdjaGls
ZFZpZXdzJyk7Ci0KLSAgICByZXR1cm4gY2hpbGRWaWV3OwotICB9LAotCi0gIC8vIHdoZW4gYSB2
aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVyLCBkZXN0cm95aW5nIHRoZQotICAvLyBlbGVtZW50
IHdpbGwgc2ltcGx5IGRlc3Ryb3kgdGhlIGJ1ZmZlciBhbmQgcHV0IHRoZQotICAvLyBzdGF0ZSBi
YWNrIGludG8gdGhlIHByZVJlbmRlciBzdGF0ZS4KLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9u
KHZpZXcpIHsKLSAgICB2aWV3LmNsZWFyQnVmZmVyKCk7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9u
ID0gdmlldy5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50KCk7Ci0gICAgdmlld0NvbGxlY3Rpb24u
dHJhbnNpdGlvblRvKCdwcmVSZW5kZXInLCBmYWxzZSk7Ci0KLSAgICByZXR1cm4gdmlldzsKLSAg
fSwKLQotICBlbXB0eTogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJFbXB0eWluZyBh
IHZpZXcgaW4gdGhlIGluQnVmZmVyIHN0YXRlIGlzIG5vdCBhbGxvd2VkIGFuZCAiICsKLSAgICAg
ICAgICAgICAgICAgInNob3VsZCBub3QgaGFwcGVuIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2Vz
LiBNb3N0IGxpa2VseSAiICsKLSAgICAgICAgICAgICAgICAgInRoZXJlIGlzIGEgYnVnIGluIHlv
dXIgYXBwbGljYXRpb24uIFRoaXMgbWF5IGJlIGR1ZSB0byAiICsKLSAgICAgICAgICAgICAgICAg
ImV4Y2Vzc2l2ZSBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4iKTsKLSAgfSwKLQotICBy
ZW5kZXJUb0J1ZmZlcklmTmVlZGVkOiBmdW5jdGlvbiAodmlldywgYnVmZmVyKSB7Ci0gICAgcmV0
dXJuIGZhbHNlOwotICB9LAotCi0gIC8vIEl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJl
bmRlcmVkIHZpZXcgdG8gYmUgc2NoZWR1bGVkIGZvcgotICAvLyBpbnNlcnRpb24uCi0gIGluc2Vy
dEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVs
ZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIjsKLSAgfSwKLQotICBzZXRFbGVt
ZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewot
ICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICB2aWV3LmNsZWFyQnVmZmVyKCk7Ci0gICAgICB2aWV3LnRyYW5zaXRpb25UbygnaGFzRWxlbWVu
dCcpOwotICAgIH0KLQotICAgIHJldHVybiB2YWx1ZTsKLSAgfSwKLQotICBpbnZva2VPYnNlcnZl
cjogZnVuY3Rpb24odGFyZ2V0LCBvYnNlcnZlcikgewotICAgIG9ic2VydmVyLmNhbGwodGFyZ2V0
KTsKLSAgfQotfSk7Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIgaGFzRWxlbWVudCA9IEVtYmVyLlZpZXcuc3RhdGVz
Lmhhc0VsZW1lbnQgPSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOwot
Ci1FbWJlci5tZXJnZShoYXNFbGVtZW50LCB7Ci0gICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewot
ICAgIHZhciBlbGVtID0gZ2V0KHZpZXcsICdlbGVtZW50Jyk7Ci0gICAgcmV0dXJuIHNlbCA/IEVt
YmVyLiQoc2VsLCBlbGVtKSA6IEVtYmVyLiQoZWxlbSk7Ci0gIH0sCi0KLSAgZ2V0RWxlbWVudDog
ZnVuY3Rpb24odmlldykgewotICAgIHZhciBwYXJlbnQgPSBnZXQodmlldywgJ3BhcmVudFZpZXcn
KTsKLSAgICBpZiAocGFyZW50KSB7IHBhcmVudCA9IGdldChwYXJlbnQsICdlbGVtZW50Jyk7IH0K
LSAgICBpZiAocGFyZW50KSB7IHJldHVybiB2aWV3LmZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50
KHBhcmVudCk7IH0KLSAgICByZXR1cm4gRW1iZXIuJCgiIyIgKyBnZXQodmlldywgJ2VsZW1lbnRJ
ZCcpKVswXTsKLSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkgewot
ICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3ByZVJl
bmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyAiWW91IGNhbm5vdCBzZXQgYW4gZWxl
bWVudCB0byBhIG5vbi1udWxsIHZhbHVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0
aGUgRE9NLiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbHVlOwotICB9LAotCi0gIC8vIG9uY2Ug
dGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCByZXJlbmRlcmluZyBpcwot
ICAvLyBkZWZlcnJlZCB0byBhbGxvdyBiaW5kaW5ncyB0byBzeW5jaHJvbml6ZS4KLSAgcmVyZW5k
ZXI6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbENs
ZWFyUmVuZGVyJyk7Ci0KLSAgICB2aWV3LmNsZWFyUmVuZGVyZWRDaGlsZHJlbigpOwotCi0gICAg
dmlldy5kb21NYW5hZ2VyLnJlcGxhY2Uodmlldyk7Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0K
LSAgLy8gb25jZSB0aGUgdmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00sIGRlc3Ryb3lpbmcgaXQg
cmVtb3ZlcyBpdAotICAvLyBmcm9tIHRoZSBET00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0
cyBpdCBiYWNrIGludG8gdGhlCi0gIC8vIHByZVJlbmRlciBzdGF0ZSBpZiBpbkRPTS4KLQotICBk
ZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcuX25vdGlmeVdpbGxEZXN0
cm95RWxlbWVudCgpOwotICAgIHZpZXcuZG9tTWFuYWdlci5yZW1vdmUodmlldyk7Ci0gICAgc2V0
KHZpZXcsICdlbGVtZW50JywgbnVsbCk7Ci0gICAgaWYgKHZpZXcuX3NjaGVkdWxlZEluc2VydCkg
ewotICAgICAgRW1iZXIucnVuLmNhbmNlbCh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpOwotICAgICAg
dmlldy5fc2NoZWR1bGVkSW5zZXJ0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHZpZXc7Ci0g
IH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2YXIgX2NoaWxkVmlld3MgPSB2
aWV3Ll9jaGlsZFZpZXdzLCBsZW4sIGlkeDsKLSAgICBpZiAoX2NoaWxkVmlld3MpIHsKLSAgICAg
IGxlbiA9IF9jaGlsZFZpZXdzLmxlbmd0aDsKLSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVu
OyBpZHgrKykgewotICAgICAgICBfY2hpbGRWaWV3c1tpZHhdLl9ub3RpZnlXaWxsRGVzdHJveUVs
ZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmlldy5kb21NYW5hZ2VyLmVtcHR5KHZpZXcp
OwotICB9LAotCi0gIC8vIEhhbmRsZSBldmVudHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVy
YAotICBoYW5kbGVFdmVudDogZnVuY3Rpb24odmlldywgZXZlbnROYW1lLCBldnQpIHsKLSAgICBp
ZiAodmlldy5oYXMoZXZlbnROYW1lKSkgewotICAgICAgLy8gSGFuZGxlciBzaG91bGQgYmUgYWJs
ZSB0byByZS1kaXNwYXRjaCBldmVudHMsIHNvIHdlIGRvbid0Ci0gICAgICAvLyBwcmV2ZW50RGVm
YXVsdCBvciBzdG9wUHJvcGFnYXRpb24uCi0gICAgICByZXR1cm4gdmlldy50cmlnZ2VyKGV2ZW50
TmFtZSwgZXZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRydWU7IC8vIGNvbnRpbnVl
IGV2ZW50IHByb3BhZ2F0aW9uCi0gICAgfQotICB9LAotCi0gIGludm9rZU9ic2VydmVyOiBmdW5j
dGlvbih0YXJnZXQsIG9ic2VydmVyKSB7Ci0gICAgb2JzZXJ2ZXIuY2FsbCh0YXJnZXQpOwotICB9
Ci19KTsKLQotdmFyIGluRE9NID0gRW1iZXIuVmlldy5zdGF0ZXMuaW5ET00gPSBFbWJlci5jcmVh
dGUoaGFzRWxlbWVudCk7Ci0KLUVtYmVyLm1lcmdlKGluRE9NLCB7Ci0gIGVudGVyOiBmdW5jdGlv
bih2aWV3KSB7Ci0gICAgLy8gUmVnaXN0ZXIgdGhlIHZpZXcgZm9yIGV2ZW50IGhhbmRsaW5nLiBU
aGlzIGhhc2ggaXMgdXNlZCBieQotICAgIC8vIEVtYmVyLkV2ZW50RGlzcGF0Y2hlciB0byBkaXNw
YXRjaCBpbmNvbWluZyBldmVudHMuCi0gICAgaWYgKCF2aWV3LmlzVmlydHVhbCkgewotICAgICAg
RW1iZXIuYXNzZXJ0KCJBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYSB2aWV3IHdpdGggYW4gaWQgYWxy
ZWFkeSBpbiB1c2U6ICIrdmlldy5lbGVtZW50SWQsICFFbWJlci5WaWV3LnZpZXdzW3ZpZXcuZWxl
bWVudElkXSk7Ci0gICAgICBFbWJlci5WaWV3LnZpZXdzW3ZpZXcuZWxlbWVudElkXSA9IHZpZXc7
Ci0gICAgfQotCi0gICAgdmlldy5hZGRCZWZvcmVPYnNlcnZlcignZWxlbWVudElkJywgZnVuY3Rp
b24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNoYW5naW5nIGEgdmlldydzIGVs
ZW1lbnRJZCBhZnRlciBjcmVhdGlvbiBpcyBub3QgYWxsb3dlZCIpOwotICAgIH0pOwotICB9LAot
Ci0gIGV4aXQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBpZiAoIXRoaXMuaXNWaXJ0dWFsKSBkZWxl
dGUgRW1iZXIuVmlldy52aWV3c1t2aWV3LmVsZW1lbnRJZF07Ci0gIH0sCi0KLSAgaW5zZXJ0RWxl
bWVudDogZnVuY3Rpb24odmlldywgZm4pIHsKLSAgICB0aHJvdyAiWW91IGNhbid0IGluc2VydCBh
biBlbGVtZW50IGludG8gdGhlIERPTSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQiOwot
ICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJl
cgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGRlc3Ryb3lpbmdFcnJvciA9ICJZ
b3UgY2FuJ3QgY2FsbCAlQCBvbiBhIHZpZXcgYmVpbmcgZGVzdHJveWVkIiwgZm10ID0gRW1iZXIu
U3RyaW5nLmZtdDsKLQotdmFyIGRlc3Ryb3lpbmcgPSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95
aW5nID0gRW1iZXIuY3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKLQotRW1iZXIu
bWVyZ2UoZGVzdHJveWluZywgewotICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhy
b3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWydhcHBlbmRDaGlsZCddKTsKLSAgfSwKLSAgcmVyZW5k
ZXI6IGZ1bmN0aW9uKCkgewotICAgIHRocm93IGZtdChkZXN0cm95aW5nRXJyb3IsIFsncmVyZW5k
ZXInXSk7Ci0gIH0sCi0gIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBm
bXQoZGVzdHJveWluZ0Vycm9yLCBbJ2Rlc3Ryb3lFbGVtZW50J10pOwotICB9LAotICBlbXB0eTog
ZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWydlbXB0eSddKTsK
LSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJv
eWluZ0Vycm9yLCBbInNldCgnZWxlbWVudCcsIC4uLikiXSk7Ci0gIH0sCi0KLSAgcmVuZGVyVG9C
dWZmZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0g
IC8vIFNpbmNlIGVsZW1lbnQgaW5zZXJ0aW9uIGlzIHNjaGVkdWxlZCwgZG9uJ3QgZG8gYW55dGhp
bmcgaWYKLSAgLy8gdGhlIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkIGJldHdlZW4gc2NoZWR1bGlu
ZyBhbmQgZXhlY3V0aW9uCi0gIGluc2VydEVsZW1lbnQ6IEVtYmVyLksKLX0pOwotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5WaWV3LmNsb25lU3RhdGVzID0gZnVuY3Rpb24o
ZnJvbSkgewotICB2YXIgaW50byA9IHt9OwotCi0gIGludG8uX2RlZmF1bHQgPSB7fTsKLSAgaW50
by5wcmVSZW5kZXIgPSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7Ci0gIGludG8uZGVzdHJv
eWluZyA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsKLSAgaW50by5pbkJ1ZmZlciA9IEVt
YmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsKLSAgaW50by5oYXNFbGVtZW50ID0gRW1iZXIuY3Jl
YXRlKGludG8uX2RlZmF1bHQpOwotICBpbnRvLmluRE9NID0gRW1iZXIuY3JlYXRlKGludG8uaGFz
RWxlbWVudCk7Ci0KLSAgZm9yICh2YXIgc3RhdGVOYW1lIGluIGZyb20pIHsKLSAgICBpZiAoIWZy
b20uaGFzT3duUHJvcGVydHkoc3RhdGVOYW1lKSkgeyBjb250aW51ZTsgfQotICAgIEVtYmVyLm1l
cmdlKGludG9bc3RhdGVOYW1lXSwgZnJvbVtzdGF0ZU5hbWVdKTsKLSAgfQotCi0gIHJldHVybiBp
bnRvOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBzdGF0ZXMgPSBFbWJl
ci5WaWV3LmNsb25lU3RhdGVzKEVtYmVyLlZpZXcuc3RhdGVzKTsKLQotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JF
YWNoOwotdmFyIFZpZXdDb2xsZWN0aW9uID0gRW1iZXIuX1ZpZXdDb2xsZWN0aW9uOwotCi0vKioK
LSAgQSBgQ29udGFpbmVyVmlld2AgaXMgYW4gYEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRoYXQgaW1w
bGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5YAotICBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFu
YWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgIyMgU2V0dGluZyBJbml0aWFsIENoaWxk
IFZpZXdzCi0KLSAgVGhlIGluaXRpYWwgYXJyYXkgb2YgY2hpbGQgdmlld3MgY2FuIGJlIHNldCBp
biBvbmUgb2YgdHdvIHdheXMuIFlvdSBjYW4KLSAgcHJvdmlkZSBhIGBjaGlsZFZpZXdzYCBwcm9w
ZXJ0eSBhdCBjcmVhdGlvbiB0aW1lIHRoYXQgY29udGFpbnMgaW5zdGFuY2Ugb2YKLSAgYEVtYmVy
LlZpZXdgOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5l
clZpZXcuY3JlYXRlKHsKLSAgICBjaGlsZFZpZXdzOiBbRW1iZXIuVmlldy5jcmVhdGUoKSwgRW1i
ZXIuVmlldy5jcmVhdGUoKV0KLSAgfSk7Ci0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBwcm92aWRl
IGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB3aG9zZSB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZgot
ICBgRW1iZXIuVmlld2A6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1iZXIu
Q29udGFpbmVyVmlldy5jcmVhdGUoewotICAgIGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcn
LCAnY1ZpZXcnXSwKLSAgICBhVmlldzogRW1iZXIuVmlldy5jcmVhdGUoKSwKLSAgICBiVmlldzog
RW1iZXIuVmlldy5jcmVhdGUoKSwKLSAgICBjVmlldzogRW1iZXIuVmlldy5jcmVhdGUoKQotICB9
KTsKLSAgYGBgCi0KLSAgVGhlIHR3byBzdHJhdGVnaWVzIGNhbiBiZSBjb21iaW5lZDoKLQotICBg
YGBqYXZhc2NyaXB0Ci0gIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7
Ci0gICAgY2hpbGRWaWV3czogWydhVmlldycsIEVtYmVyLlZpZXcuY3JlYXRlKCldLAotICAgIGFW
aWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCi0gIH0pOwotICBgYGAKLQotICBFYWNoIGNoaWxkIHZp
ZXcncyByZW5kZXJpbmcgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIncyByZW5k
ZXJlZAotICBIVE1MIGluIHRoZSBzYW1lIG9yZGVyIGFzIGl0cyBwb3NpdGlvbiBpbiB0aGUgYGNo
aWxkVmlld3NgIHByb3BlcnR5LgotCi0gICMjIEFkZGluZyBhbmQgUmVtb3ZpbmcgQ2hpbGQgVmll
d3MKLQotICBUaGUgY29udGFpbmVyIHZpZXcgaW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5
YCBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFuYWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3MuCi0K
LSAgVG8gcmVtb3ZlIGEgdmlldywgcGFzcyB0aGF0IHZpZXcgaW50byBhIGByZW1vdmVPYmplY3Rg
IGNhbGwgb24gdGhlIGNvbnRhaW5lciB2aWV3LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5g
IHRoZSBmb2xsb3dpbmcgY29kZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lciA9IEVt
YmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKLSAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWlu
ZXInXSwKLSAgICBjaGlsZFZpZXdzOiBbJ2FWaWV3JywgJ2JWaWV3J10sCi0gICAgYVZpZXc6IEVt
YmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBp
bGUoIkEiKQotICAgIH0pLAotICAgIGJWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0
ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJCIikKLSAgICB9KQotICB9KTsKLQot
ICBhQ29udGFpbmVyLmFwcGVuZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhl
IEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5l
ciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9
ImVtYmVyLXZpZXciPkI8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gIFJlbW92aW5nIGEgdmll
dwotCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRh
aW5lci5hVmlldywgYUNvbnRhaW5lci5iVmlld10KLSAgYUNvbnRhaW5lci5yZW1vdmVPYmplY3Qo
YUNvbnRhaW5lci5nZXQoJ2JWaWV3JykpOwotICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFth
Q29udGFpbmVyLmFWaWV3XQotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5n
IEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5l
ciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgotICA8L2Rpdj4KLSAgYGBg
Ci0KLSAgU2ltaWxhcmx5LCBhZGRpbmcgYSBjaGlsZCB2aWV3IGlzIGFjY29tcGxpc2hlZCBieSBh
ZGRpbmcgYEVtYmVyLlZpZXdgIGluc3RhbmNlcyB0byB0aGUKLSAgY29udGFpbmVyIHZpZXcuCi0K
LSAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgdGhlIGZvbGxvd2luZyBjb2RlCi0KLSAgYGBgamF2
YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewotICAg
IGNsYXNzTmFtZXM6IFsndGhlLWNvbnRhaW5lciddLAotICAgIGNoaWxkVmlld3M6IFsnYVZpZXcn
LCAnYlZpZXcnXSwKLSAgICBhVmlldzogRW1iZXIuVmlldy5jcmVhdGUoewotICAgICAgdGVtcGxh
dGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQSIpCi0gICAgfSksCi0gICAgYlZpZXc6IEVt
YmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBp
bGUoIkIiKQotICAgIH0pCi0gIH0pOwotCi0gIGFDb250YWluZXIuYXBwZW5kVG8oJ2JvZHknKTsK
LSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUgSFRNTAotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFz
cz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVyIj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3
Ij5BPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QjwvZGl2PgotICA8L2Rpdj4K
LSAgYGBgCi0KLSAgQWRkaW5nIGEgdmlldwotCi0gIGBgYGphdmFzY3JpcHQKLSAgQW5vdGhlclZp
ZXdDbGFzcyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxl
YmFycy5jb21waWxlKCJBbm90aGVyIHZpZXciKQotICB9KTsKLQotICBhQ29udGFpbmVyLnRvQXJy
YXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3LCBhQ29udGFpbmVyLmJWaWV3XQotICBhQ29udGFp
bmVyLnB1c2hPYmplY3QoQW5vdGhlclZpZXdDbGFzcy5jcmVhdGUoKSk7Ci0gIGFDb250YWluZXIu
dG9BcnJheSgpOyAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRhaW5lci5iVmlldywgPEFub3Ro
ZXJWaWV3Q2xhc3MgaW5zdGFuY2U+XQotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9s
bG93aW5nIEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNv
bnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2PgotICAgIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5B
bm90aGVyIHZpZXc8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gICMjIFRlbXBsYXRlcyBhbmQg
TGF5b3V0Ci0KLSAgQSBgdGVtcGxhdGVgLCBgdGVtcGxhdGVOYW1lYCwgYGRlZmF1bHRUZW1wbGF0
ZWAsIGBsYXlvdXRgLCBgbGF5b3V0TmFtZWAgb3IKLSAgYGRlZmF1bHRMYXlvdXRgIHByb3BlcnR5
IG9uIGEgY29udGFpbmVyIHZpZXcgd2lsbCBub3QgcmVzdWx0IGluIHRoZSB0ZW1wbGF0ZQotICBv
ciBsYXlvdXQgYmVpbmcgcmVuZGVyZWQuIFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgYEVtYmVyLkNv
bnRhaW5lclZpZXdgJ3MgRE9NCi0gIHJlcHJlc2VudGF0aW9uIHdpbGwgb25seSBiZSB0aGUgcmVu
ZGVyZWQgSFRNTCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgQGNsYXNzIENvbnRhaW5lclZpZXcK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ29u
dGFpbmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJheSwgewotICBz
dGF0ZXM6IHN0YXRlcywKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigp
OwotCi0gICAgdmFyIGNoaWxkVmlld3MgPSBnZXQodGhpcywgJ2NoaWxkVmlld3MnKTsKLQotICAg
IC8vIHJlZGVmaW5lIHZpZXcncyBjaGlsZFZpZXdzIHByb3BlcnR5IHRoYXQgd2FzIG9ibGl0ZXJh
dGVkCi0gICAgRW1iZXIuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NoaWxkVmlld3MnLCBFbWJlci5W
aWV3LmNoaWxkVmlld3NQcm9wZXJ0eSk7Ci0KLSAgICB2YXIgX2NoaWxkVmlld3MgPSB0aGlzLl9j
aGlsZFZpZXdzOwotCi0gICAgZm9yRWFjaChjaGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3TmFtZSwg
aWR4KSB7Ci0gICAgICB2YXIgdmlldzsKLQotICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Yg
dmlld05hbWUpIHsKLSAgICAgICAgdmlldyA9IGdldCh0aGlzLCB2aWV3TmFtZSk7Ci0gICAgICAg
IHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3KTsKLSAgICAgICAgc2V0KHRoaXMsIHZp
ZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0
ZUNoaWxkVmlldyh2aWV3TmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIF9jaGlsZFZpZXdzW2lkeF0g
PSB2aWV3OwotICAgIH0sIHRoaXMpOwotCi0gICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMs
ICdjdXJyZW50VmlldycpOwotICAgIGlmIChjdXJyZW50VmlldykgewotICAgICAgaWYgKCFfY2hp
bGRWaWV3cy5sZW5ndGgpIHsgX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzID0gdGhpcy5f
Y2hpbGRWaWV3cy5zbGljZSgpOyB9Ci0gICAgICBfY2hpbGRWaWV3cy5wdXNoKHRoaXMuY3JlYXRl
Q2hpbGRWaWV3KGN1cnJlbnRWaWV3KSk7Ci0gICAgfQotICB9LAotCi0gIHJlcGxhY2U6IGZ1bmN0
aW9uKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZFZpZXdzKSB7Ci0gICAgdmFyIGFkZGVkQ291bnQg
PSBhZGRlZFZpZXdzID8gZ2V0KGFkZGVkVmlld3MsICdsZW5ndGgnKSA6IDA7Ci0gICAgdmFyIHNl
bGYgPSB0aGlzOwotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbid0IGFkZCBhIGNoaWxkIHRvIGEg
Y29udGFpbmVyIHRoYXQgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIGFub3RoZXIgdmlldyIsIEVtYmVy
LkEoYWRkZWRWaWV3cykuZXZlcnkoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gIWdldChpdGVtLCAn
X3BhcmVudFZpZXcnKSB8fCBnZXQoaXRlbSwgJ19wYXJlbnRWaWV3JykgPT09IHNlbGY7IH0pKTsK
LQotICAgIHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDb3VudCwgYWRk
ZWRDb3VudCk7Ci0gICAgdGhpcy5jaGlsZFZpZXdzV2lsbENoYW5nZSh0aGlzLl9jaGlsZFZpZXdz
LCBpZHgsIHJlbW92ZWRDb3VudCk7Ci0KLSAgICBpZiAoYWRkZWRDb3VudCA9PT0gMCkgewotICAg
ICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2UoaWR4LCByZW1vdmVkQ291bnQpIDsKLSAgICB9IGVs
c2UgewotICAgICAgdmFyIGFyZ3MgPSBbaWR4LCByZW1vdmVkQ291bnRdLmNvbmNhdChhZGRlZFZp
ZXdzKTsKLSAgICAgIGlmIChhZGRlZFZpZXdzLmxlbmd0aCAmJiAhdGhpcy5fY2hpbGRWaWV3cy5s
ZW5ndGgpIHsgdGhpcy5fY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsgfQot
ICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2UuYXBwbHkodGhpcy5fY2hpbGRWaWV3cywgYXJn
cyk7Ci0gICAgfQotCi0gICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1vdmVk
Q291bnQsIGFkZGVkQ291bnQpOwotICAgIHRoaXMuY2hpbGRWaWV3c0RpZENoYW5nZSh0aGlzLl9j
aGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Ci0KLSAgICByZXR1cm4g
dGhpczsKLSAgfSwKLQotICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRo
aXMuX2NoaWxkVmlld3NbaWR4XTsKLSAgfSwKLQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gIH0pLnZv
bGF0aWxlKCksCi0KLSAgLyoqCi0gICAgSW5zdHJ1Y3RzIGVhY2ggY2hpbGQgdmlldyB0byByZW5k
ZXIgdG8gdGhlIHBhc3NlZCByZW5kZXIgYnVmZmVyLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIHJlbmRlcgotICAgIEBwYXJhbSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIGJ1
ZmZlciB0byByZW5kZXIgdG8KLSAgKi8KLSAgcmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAg
ICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAgdmlldy5yZW5k
ZXJUb0J1ZmZlcihidWZmZXIpOwotICAgIH0pOwotICB9LAotCi0gIGluc3RydW1lbnROYW1lOiAn
Y29udGFpbmVyJywKLQotICAvKioKLSAgICBXaGVuIGEgY2hpbGQgdmlldyBpcyByZW1vdmVkLCBk
ZXN0cm95IGl0cyBlbGVtZW50IHNvIHRoYXQKLSAgICBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERP
TS4KLQotICAgIFRoZSBhcnJheSBvYnNlcnZlciB0aGF0IHRyaWdnZXJzIHRoaXMgYWN0aW9uIGlz
IHNldCB1cCBpbiB0aGUKLSAgICBgcmVuZGVyVG9CdWZmZXJgIG1ldGhvZC4KLQotICAgIEBwcml2
YXRlCi0gICAgQG1ldGhvZCBjaGlsZFZpZXdzV2lsbENoYW5nZQotICAgIEBwYXJhbSB7RW1iZXIu
QXJyYXl9IHZpZXdzIHRoZSBjaGlsZCB2aWV3cyBhcnJheSBiZWZvcmUgbXV0YXRpb24KLSAgICBA
cGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgot
ICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVt
b3ZlZAotICAqKi8KLSAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFy
dCwgcmVtb3ZlZCkgewotICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKCdjaGlsZFZpZXdzJyk7
Ci0KLSAgICBpZiAocmVtb3ZlZCA+IDApIHsKLSAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3
cy5zbGljZShzdGFydCwgc3RhcnQrcmVtb3ZlZCk7Ci0gICAgICAvLyB0cmFuc2l0aW9uIHRvIHBy
ZVJlbmRlciBiZWZvcmUgY2xlYXJpbmcgcGFyZW50VmlldwotICAgICAgdGhpcy5jdXJyZW50U3Rh
dGUuY2hpbGRWaWV3c1dpbGxDaGFuZ2UodGhpcywgdmlld3MsIHN0YXJ0LCByZW1vdmVkKTsKLSAg
ICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNoYW5nZWRWaWV3cywgbnVsbCwgbnVsbCk7Ci0gICAg
fQotICB9LAotCi0gIHJlbW92ZUNoaWxkOiBmdW5jdGlvbihjaGlsZCkgewotICAgIHRoaXMucmVt
b3ZlT2JqZWN0KGNoaWxkKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBX
aGVuIGEgY2hpbGQgdmlldyBpcyBhZGRlZCwgbWFrZSBzdXJlIHRoZSBET00gZ2V0cyB1cGRhdGVk
IGFwcHJvcHJpYXRlbHkuCi0KLSAgICBJZiB0aGUgdmlldyBoYXMgYWxyZWFkeSByZW5kZXJlZCBh
biBlbGVtZW50LCB3ZSB0ZWxsIHRoZSBjaGlsZCB2aWV3IHRvCi0gICAgY3JlYXRlIGFuIGVsZW1l
bnQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBET00uIElmIHRoZSBlbmNsb3NpbmcgY29udGFpbmVy
Ci0gICAgdmlldyBoYXMgYWxyZWFkeSB3cml0dGVuIHRvIGEgYnVmZmVyLCBidXQgbm90IHlldCBj
b252ZXJ0ZWQgdGhhdCBidWZmZXIKLSAgICBpbnRvIGFuIGVsZW1lbnQsIHdlIGluc2VydCB0aGUg
c3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGlsZCBpbnRvIHRoZQotICAgIGFwcHJvcHJp
YXRlIHBsYWNlIGluIHRoZSBidWZmZXIuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgY2hp
bGRWaWV3c0RpZENoYW5nZQotICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBhcnJh
eSBvZiBjaGlsZCB2aWV3cyBhZnRlIHRoZSBtdXRhdGlvbiBoYXMgb2NjdXJyZWQKLSAgICBAcGFy
YW0ge051bWJlcn0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAg
IEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3Zl
ZAotICAgIEBwYXJhbSB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNoaWxkIHZpZXdzIGFkZGVkCi0g
ICovCi0gIGNoaWxkVmlld3NEaWRDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3Zl
ZCwgYWRkZWQpIHsKLSAgICBpZiAoYWRkZWQgPiAwKSB7Ci0gICAgICB2YXIgY2hhbmdlZFZpZXdz
ID0gdmlld3Muc2xpY2Uoc3RhcnQsIHN0YXJ0K2FkZGVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6
ZVZpZXdzKGNoYW5nZWRWaWV3cywgdGhpcywgZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKSk7Ci0g
ICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5jaGlsZFZpZXdzRGlkQ2hhbmdlKHRoaXMsIHZpZXdzLCBz
dGFydCwgYWRkZWQpOwotICAgIH0KLSAgICB0aGlzLnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZp
ZXdzJyk7Ci0gIH0sCi0KLSAgaW5pdGlhbGl6ZVZpZXdzOiBmdW5jdGlvbih2aWV3cywgcGFyZW50
VmlldywgdGVtcGxhdGVEYXRhKSB7Ci0gICAgZm9yRWFjaCh2aWV3cywgZnVuY3Rpb24odmlldykg
ewotICAgICAgc2V0KHZpZXcsICdfcGFyZW50VmlldycsIHBhcmVudFZpZXcpOwotCi0gICAgICBp
ZiAoIXZpZXcuY29udGFpbmVyICYmIHBhcmVudFZpZXcpIHsKLSAgICAgICAgc2V0KHZpZXcsICdj
b250YWluZXInLCBwYXJlbnRWaWV3LmNvbnRhaW5lcik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgh
Z2V0KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkgewotICAgICAgICBzZXQodmlldywgJ3RlbXBsYXRl
RGF0YScsIHRlbXBsYXRlRGF0YSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgY3VycmVu
dFZpZXc6IG51bGwsCi0KLSAgX2N1cnJlbnRWaWV3V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2Jz
ZXJ2ZXIoJ2N1cnJlbnRWaWV3JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGN1cnJlbnRWaWV3ID0g
Z2V0KHRoaXMsICdjdXJyZW50VmlldycpOwotICAgIGlmIChjdXJyZW50VmlldykgewotICAgICAg
Y3VycmVudFZpZXcuZGVzdHJveSgpOwotICAgIH0KLSAgfSksCi0KLSAgX2N1cnJlbnRWaWV3RGlk
Q2hhbmdlOiBFbWJlci5vYnNlcnZlcignY3VycmVudFZpZXcnLCBmdW5jdGlvbigpIHsKLSAgICB2
YXIgY3VycmVudFZpZXcgPSBnZXQodGhpcywgJ2N1cnJlbnRWaWV3Jyk7Ci0gICAgaWYgKGN1cnJl
bnRWaWV3KSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBzZXQgYSBjdXJyZW50
IHZpZXcgdGhhdCBhbHJlYWR5IGhhcyBhIHBhcmVudC4gTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZl
IG11bHRpcGxlIG91dGxldHMgaW4gdGhlIHNhbWUgdmlldy4iLCAhZ2V0KGN1cnJlbnRWaWV3LCAn
X3BhcmVudFZpZXcnKSk7Ci0gICAgICB0aGlzLnB1c2hPYmplY3QoY3VycmVudFZpZXcpOwotICAg
IH0KLSAgfSksCi0KLSAgX2Vuc3VyZUNoaWxkcmVuQXJlSW5ET006IGZ1bmN0aW9uICgpIHsKLSAg
ICB0aGlzLmN1cnJlbnRTdGF0ZS5lbnN1cmVDaGlsZHJlbkFyZUluRE9NKHRoaXMpOwotICB9Ci19
KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLl9kZWZhdWx0LCB7Ci0gIGNoaWxkVmlld3NXaWxsQ2hh
bmdlOiBFbWJlci5LLAotICBjaGlsZFZpZXdzRGlkQ2hhbmdlOiBFbWJlci5LLAotICBlbnN1cmVD
aGlsZHJlbkFyZUluRE9NOiBFbWJlci5LCi19KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmluQnVm
ZmVyLCB7Ci0gIGNoaWxkVmlld3NEaWRDaGFuZ2U6IGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXdz
LCBzdGFydCwgYWRkZWQpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1lvdSBjYW5ub3Qg
bW9kaWZ5IGNoaWxkIHZpZXdzIHdoaWxlIGluIHRoZSBpbkJ1ZmZlciBzdGF0ZScpOwotICB9Ci19
KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmhhc0VsZW1lbnQsIHsKLSAgY2hpbGRWaWV3c1dpbGxD
aGFuZ2U6IGZ1bmN0aW9uKHZpZXcsIHZpZXdzLCBzdGFydCwgcmVtb3ZlZCkgewotICAgIGZvciAo
dmFyIGk9c3RhcnQ7IGk8c3RhcnQrcmVtb3ZlZDsgaSsrKSB7Ci0gICAgICB2aWV3c1tpXS5yZW1v
dmUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgY2hpbGRWaWV3c0RpZENoYW5nZTogZnVuY3Rpb24odmll
dywgdmlld3MsIHN0YXJ0LCBhZGRlZCkgewotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3Jl
bmRlcicsIHZpZXcsICdfZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTScpOwotICB9LAotCi0gIGVuc3Vy
ZUNoaWxkcmVuQXJlSW5ET006IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2YXIgY2hpbGRWaWV3cyA9
IHZpZXcuX2NoaWxkVmlld3MsIGksIGxlbiwgY2hpbGRWaWV3LCBwcmV2aW91cywgYnVmZmVyLCB2
aWV3Q29sbGVjdGlvbiA9IG5ldyBWaWV3Q29sbGVjdGlvbigpOwotCi0gICAgZm9yIChpID0gMCwg
bGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewotICAgICAgY2hpbGRWaWV3
ID0gY2hpbGRWaWV3c1tpXTsKLQotICAgICAgaWYgKCFidWZmZXIpIHsgYnVmZmVyID0gRW1iZXIu
UmVuZGVyQnVmZmVyKCk7IGJ1ZmZlci5faGFzRWxlbWVudCA9IGZhbHNlOyB9Ci0KLSAgICAgIGlm
IChjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXJJZk5lZWRlZChidWZmZXIpKSB7Ci0gICAgICAgIHZp
ZXdDb2xsZWN0aW9uLnB1c2goY2hpbGRWaWV3KTsKLSAgICAgIH0gZWxzZSBpZiAodmlld0NvbGxl
Y3Rpb24ubGVuZ3RoKSB7Ci0gICAgICAgIGluc2VydFZpZXdDb2xsZWN0aW9uKHZpZXcsIHZpZXdD
b2xsZWN0aW9uLCBwcmV2aW91cywgYnVmZmVyKTsKLSAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAg
ICAgICAgcHJldmlvdXMgPSBjaGlsZFZpZXc7Ci0gICAgICAgIHZpZXdDb2xsZWN0aW9uLmNsZWFy
KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmV2aW91cyA9IGNoaWxkVmlldzsKLSAgICAg
IH0KLSAgICB9Ci0KLSAgICBpZiAodmlld0NvbGxlY3Rpb24ubGVuZ3RoKSB7Ci0gICAgICBpbnNl
cnRWaWV3Q29sbGVjdGlvbih2aWV3LCB2aWV3Q29sbGVjdGlvbiwgcHJldmlvdXMsIGJ1ZmZlcik7
Ci0gICAgfQotICB9Ci19KTsKLQotZnVuY3Rpb24gaW5zZXJ0Vmlld0NvbGxlY3Rpb24odmlldywg
dmlld0NvbGxlY3Rpb24sIHByZXZpb3VzLCBidWZmZXIpIHsKLSAgdmlld0NvbGxlY3Rpb24udHJp
Z2dlclJlY3Vyc2l2ZWx5KCd3aWxsSW5zZXJ0RWxlbWVudCcpOwotCi0gIGlmIChwcmV2aW91cykg
ewotICAgIHByZXZpb3VzLmRvbU1hbmFnZXIuYWZ0ZXIocHJldmlvdXMsIGJ1ZmZlci5zdHJpbmco
KSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmlldy5kb21NYW5hZ2VyLnByZXBlbmQodmlldywgYnVmZmVy
LnN0cmluZygpKTsKLSAgfQotCi0gIHZpZXdDb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24odikg
ewotICAgIHYudHJhbnNpdGlvblRvKCdpbkRPTScpOwotICAgIHYucHJvcGVydHlEaWRDaGFuZ2Uo
J2VsZW1lbnQnKTsKLSAgICB2LnRyaWdnZXJSZWN1cnNpdmVseSgnZGlkSW5zZXJ0RWxlbWVudCcp
OwotICB9KTsKLX0KLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1i
ZXIuQ29sbGVjdGlvblZpZXdgIGlzIGFuIGBFbWJlci5WaWV3YCBkZXNjZW5kZW50IHJlc3BvbnNp
YmxlIGZvciBtYW5hZ2luZwotICBhIGNvbGxlY3Rpb24gKGFuIGFycmF5IG9yIGFycmF5LWxpa2Ug
b2JqZWN0KSBieSBtYWludGFpbmluZyBhIGNoaWxkIHZpZXcgb2JqZWN0Ci0gIGFuZCBhc3NvY2lh
dGVkIERPTSByZXByZXNlbnRhdGlvbiBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheSBhbmQgZW5z
dXJpbmcKLSAgdGhhdCBjaGlsZCB2aWV3cyBhbmQgdGhlaXIgYXNzb2NpYXRlZCByZW5kZXJlZCBI
VE1MIGFyZSB1cGRhdGVkIHdoZW4gaXRlbXMgaW4KLSAgdGhlIGFycmF5IGFyZSBhZGRlZCwgcmVt
b3ZlZCwgb3IgcmVwbGFjZWQuCi0KLSAgIyMgU2V0dGluZyBjb250ZW50Ci0KLSAgVGhlIG1hbmFn
ZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGlzIHJlZmVyZW5jZWQgYXMgdGhlIGBFbWJlci5Db2xs
ZWN0aW9uVmlld2AKLSAgaW5zdGFuY2UncyBgY29udGVudGAgcHJvcGVydHkuCi0KLSAgYGBgamF2
YXNjcmlwdAotICBzb21lSXRlbXNWaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsK
LSAgICBjb250ZW50OiBbJ0EnLCAnQicsJ0MnXQotICB9KQotICBgYGAKLQotICBUaGUgdmlldyBm
b3IgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIHdpbGwgaGF2ZSBpdHMgYGNvbnRlbnRgIHBy
b3BlcnR5IHNldAotICB0byB0aGUgaXRlbS4KLQotICAjIyBTcGVjaWZ5aW5nIGl0ZW1WaWV3Q2xh
c3MKLQotICBCeSBkZWZhdWx0IHRoZSB2aWV3IGNsYXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG1h
bmFnZWQgY29sbGVjdGlvbiB3aWxsIGJlIGFuCi0gIGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YC4g
WW91IGNhbiBzdXBwbHkgYSBkaWZmZXJlbnQgY2xhc3MgYnkgc2V0dGluZyB0aGUKLSAgYENvbGxl
Y3Rpb25WaWV3YCdzIGBpdGVtVmlld0NsYXNzYCBwcm9wZXJ0eS4KLQotICBHaXZlbiBhbiBlbXB0
eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBjb2RlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
c29tZUl0ZW1zVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NO
YW1lczogWydhLWNvbGxlY3Rpb24nXSwKLSAgICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAg
IGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBsZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAg
IH0pCi0gIH0pOwotCi0gIHNvbWVJdGVtc1ZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0K
LSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZQotCi0gIGBgYGh0
bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyBhLWNvbGxlY3Rpb24iPgotICAgIDxkaXYgY2xh
c3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEE8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJl
ci12aWV3Ij50aGUgbGV0dGVyOiBCPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+
dGhlIGxldHRlcjogQzwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgIyMgQXV0b21hdGljIG1h
dGNoaW5nIG9mIHBhcmVudC9jaGlsZCB0YWdOYW1lcwotCi0gIFNldHRpbmcgdGhlIGB0YWdOYW1l
YCBwcm9wZXJ0eSBvZiBhIGBDb2xsZWN0aW9uVmlld2AgdG8gYW55IG9mCi0gICJ1bCIsICJvbCIs
ICJ0YWJsZSIsICJ0aGVhZCIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0ciIsIG9yICJzZWxlY3QiIHdp
bGwgcmVzdWx0Ci0gIGluIHRoZSBpdGVtIHZpZXdzIHJlY2VpdmluZyBhbiBhcHByb3ByaWF0ZWx5
IG1hdGNoZWQgYHRhZ05hbWVgIHByb3BlcnR5LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5g
IGFuZCB0aGUgZm9sbG93aW5nIGNvZGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBhblVuZG9yZGVy
ZWRMaXN0VmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgdGFnTmFtZTog
J3VsJywKLSAgICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBp
bGUoInRoZSBsZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAgIH0pCi0gIH0pOwotCi0gIGFu
VW5kb3JkZXJlZExpc3RWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmUKLQotICBgYGBodG1sCi0gIDx1bCBj
bGFzcz0iZW1iZXItdmlldyBhLWNvbGxlY3Rpb24iPgotICAgIDxsaSBjbGFzcz0iZW1iZXItdmll
dyI+dGhlIGxldHRlcjogQTwvbGk+Ci0gICAgPGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0
dGVyOiBCPC9saT4KLSAgICA8bGkgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEM8L2xp
PgotICA8L3VsPgotICBgYGAKLQotICBBZGRpdGlvbmFsIGB0YWdOYW1lYCBwYWlycyBjYW4gYmUg
cHJvdmlkZWQgYnkgYWRkaW5nIHRvCi0gIGBFbWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJf
TUFQIGAKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5F
Ul9NQVBbJ2FydGljbGUnXSA9ICdzZWN0aW9uJwotICBgYGAKLQotICAjIyBQcm9ncmFtbWF0aWMg
Y3JlYXRpb24gb2YgY2hpbGQgdmlld3MKLQotICBGb3IgY2FzZXMgd2hlcmUgYWRkaXRpb25hbCBj
dXN0b21pemF0aW9uIGJleW9uZCB0aGUgdXNlIG9mIGEgc2luZ2xlCi0gIGBpdGVtVmlld0NsYXNz
YCBvciBgdGFnTmFtZWAgbWF0Y2hpbmcgaXMgcmVxdWlyZWQgQ29sbGVjdGlvblZpZXcncwotICBg
Y3JlYXRlQ2hpbGRWaWV3YCBtZXRob2QgY2FuIGJlIG92ZXJpZGRlbjoKLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEN1c3RvbUNvbGxlY3Rpb25WaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5k
KHsKLSAgICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXdDbGFzcywgYXR0cnMpIHsKLSAg
ICAgIGlmIChhdHRycy5jb250ZW50LmtpbmQgPT0gJ2FsYnVtJykgewotICAgICAgICB2aWV3Q2xh
c3MgPSBBcHAuQWxidW1WaWV3OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmlld0NsYXNzID0g
QXBwLlNvbmdWaWV3OwotICAgICAgfQotICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZpZXdDbGFz
cywgYXR0cnMpOwotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gICMjIEVtcHR5IFZpZXcKLQotICBZ
b3UgY2FuIHByb3ZpZGUgYW4gYEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRvIHRoZSBgRW1iZXIuQ29s
bGVjdGlvblZpZXdgCi0gIGluc3RhbmNlIGFzIGl0cyBgZW1wdHlWaWV3YCBwcm9wZXJ0eS4gSWYg
dGhlIGBjb250ZW50YCBwcm9wZXJ0eSBvZiBhCi0gIGBDb2xsZWN0aW9uVmlld2AgaXMgc2V0IHRv
IGBudWxsYCBvciBhbiBlbXB0eSBhcnJheSwgYW4gaW5zdGFuY2Ugb2YgdGhpcyB2aWV3Ci0gIHdp
bGwgYmUgdGhlIGBDb2xsZWN0aW9uVmlld2BzIG9ubHkgY2hpbGQuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBhTGlzdFdpdGhOb3RoaW5nID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsKLSAg
ICBjbGFzc05hbWVzOiBbJ25vdGhpbmcnXQotICAgIGNvbnRlbnQ6IG51bGwsCi0gICAgZW1wdHlW
aWV3OiBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFy
cy5jb21waWxlKCJUaGUgY29sbGVjdGlvbiBpcyBlbXB0eSIpCi0gICAgfSkKLSAgfSk7Ci0KLSAg
YUxpc3RXaXRoTm90aGluZy5hcHBlbmRUbygnYm9keScpOwotICBgYGAKLQotICBXaWxsIHJlc3Vs
dCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlCi0KLSAgYGBgaHRtbAotICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3IG5vdGhpbmciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgot
ICAgICAgVGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkKLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBg
YAotCi0gICMjIEFkZGluZyBhbmQgUmVtb3ZpbmcgaXRlbXMKLQotICBUaGUgYGNoaWxkVmlld3Ng
IHByb3BlcnR5IG9mIGEgYENvbGxlY3Rpb25WaWV3YCBzaG91bGQgbm90IGJlIGRpcmVjdGx5Ci0g
IG1hbmlwdWxhdGVkLiBJbnN0ZWFkLCBhZGQsIHJlbW92ZSwgcmVwbGFjZSBpdGVtcyBmcm9tIGl0
cyBgY29udGVudGAgcHJvcGVydHkuCi0gIFRoaXMgd2lsbCB0cmlnZ2VyIGFwcHJvcHJpYXRlIGNo
YW5nZXMgdG8gaXRzIHJlbmRlcmVkIEhUTUwuCi0KLQotICBAY2xhc3MgQ29sbGVjdGlvblZpZXcK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db250YWluZXJWaWV3Ci0gIEBz
aW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5Db2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbnRhaW5l
clZpZXcuZXh0ZW5kKHsKLQotICAvKioKLSAgICBBIGxpc3Qgb2YgaXRlbXMgdG8gYmUgZGlzcGxh
eWVkIGJ5IHRoZSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgLgotCi0gICAgQHByb3BlcnR5IGNvbnRl
bnQKLSAgICBAdHlwZSBFbWJlci5BcnJheQotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgY29u
dGVudDogbnVsbCwKLQotICAvKioKLSAgICBUaGlzIHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0IHdo
YXQga2luZCBvZiBlbXB0eSB2aWV3IGNsYXNzIHRoaXMKLSAgICBjb2xsZWN0aW9uIHdvdWxkIGxp
a2UgaWYgaXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkIGZyb20gYW5vdGhlcgotICAgIHN5c3RlbSAo
bGlrZSBIYW5kbGViYXJzKQotCi0gICAgQHByaXZhdGUKLSAgICBAcHJvcGVydHkgZW1wdHlWaWV3
Q2xhc3MKLSAgKi8KLSAgZW1wdHlWaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCi0KLSAgLyoqCi0gICAg
QW4gb3B0aW9uYWwgdmlldyB0byBkaXNwbGF5IGlmIGNvbnRlbnQgaXMgc2V0IHRvIGFuIGVtcHR5
IGFycmF5LgotCi0gICAgQHByb3BlcnR5IGVtcHR5VmlldwotICAgIEB0eXBlIEVtYmVyLlZpZXcK
LSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGVtcHR5VmlldzogbnVsbCwKLQotICAvKioKLSAg
ICBAcHJvcGVydHkgaXRlbVZpZXdDbGFzcwotICAgIEB0eXBlIEVtYmVyLlZpZXcKLSAgICBAZGVm
YXVsdCBFbWJlci5WaWV3Ci0gICovCi0gIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCi0KLSAg
LyoqCi0gICAgU2V0dXAgYSBDb2xsZWN0aW9uVmlldwotCi0gICAgQG1ldGhvZCBpbml0Ci0gICov
Ci0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciByZXQgPSB0aGlzLl9zdXBlcigpOwotICAg
IHRoaXMuX2NvbnRlbnREaWRDaGFuZ2UoKTsKLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIC8q
KgotICAgIEludm9rZWQgd2hlbiB0aGUgY29udGVudCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFu
Z2UuIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IHRoZQotICAgIGVudGlyZSBhcnJheSBjb250ZW50
IHdpbGwgY2hhbmdlLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIF9jb250ZW50V2lsbENo
YW5nZQotICAqLwotICBfY29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdj
b250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmdldCgnY29udGVu
dCcpOwotCi0gICAgaWYgKGNvbnRlbnQpIHsgY29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRo
aXMpOyB9Ci0gICAgdmFyIGxlbiA9IGNvbnRlbnQgPyBnZXQoY29udGVudCwgJ2xlbmd0aCcpIDog
MDsKLSAgICB0aGlzLmFycmF5V2lsbENoYW5nZShjb250ZW50LCAwLCBsZW4pOwotICB9KSwKLQot
ICAvKioKLSAgICBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdl
ZCwgYW5kIGlmIHNvLAotICAgIHVwZGF0ZSB0aGUgY2hpbGRyZW4gZGlyZWN0bHkuIFRoaXMgaXMg
YWx3YXlzIHNjaGVkdWxlZAotICAgIGFzeW5jaHJvbm91c2x5LCB0byBhbGxvdyB0aGUgZWxlbWVu
dCB0byBiZSBjcmVhdGVkIGJlZm9yZQotICAgIGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkIGFu
ZCB2aWNlIHZlcnNhLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIF9jb250ZW50RGlkQ2hh
bmdlCi0gICovCi0gIF9jb250ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGVudCcs
IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0K
LSAgICBpZiAoY29udGVudCkgewotICAgICAgdGhpcy5fYXNzZXJ0QXJyYXlMaWtlKGNvbnRlbnQp
OwotICAgICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMpOwotICAgIH0KLQotICAgIHZh
ciBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5h
cnJheURpZENoYW5nZShjb250ZW50LCAwLCBudWxsLCBsZW4pOwotICB9KSwKLQotICAvKioKLSAg
ICBFbnN1cmUgdGhhdCB0aGUgY29udGVudCBpbXBsZW1lbnRzIEVtYmVyLkFycmF5Ci0KLSAgICBA
cHJpdmF0ZQotICAgIEBtZXRob2QgX2Fzc2VydEFycmF5TGlrZQotICAqLwotICBfYXNzZXJ0QXJy
YXlMaWtlOiBmdW5jdGlvbihjb250ZW50KSB7Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiYW4gRW1i
ZXIuQ29sbGVjdGlvblZpZXcncyBjb250ZW50IG11c3QgaW1wbGVtZW50IEVtYmVyLkFycmF5LiBZ
b3UgcGFzc2VkICVAIiwgW2NvbnRlbnRdKSwgRW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsK
LSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIHRoZSBjb250ZW50IGFuZCBjb250ZW50IG9ic2Vy
dmVycy4KLQotICAgIEBtZXRob2QgZGVzdHJveQotICAqLwotICBkZXN0cm95OiBmdW5jdGlvbigp
IHsKLSAgICBpZiAoIXRoaXMuX3N1cGVyKCkpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVu
dCA9IGdldCh0aGlzLCAnY29udGVudCcpOwotICAgIGlmIChjb250ZW50KSB7IGNvbnRlbnQucmVt
b3ZlQXJyYXlPYnNlcnZlcih0aGlzKTsgfQotCi0gICAgaWYgKHRoaXMuX2NyZWF0ZWRFbXB0eVZp
ZXcpIHsKLSAgICAgIHRoaXMuX2NyZWF0ZWRFbXB0eVZpZXcuZGVzdHJveSgpOwotICAgIH0KLQot
ICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIGEgbXV0YXRp
b24gdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBhcnJheSB3aWxsIG9jY3VyLgotCi0gICAgVGhp
cyBtZXRob2Qgd2lsbCByZW1vdmUgYW55IHZpZXdzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUg
dW5kZXJseWluZwotICAgIGNvbnRlbnQgYXJyYXkuCi0KLSAgICBJbnZva2VzIHdoZW5ldmVyIHRo
ZSBjb250ZW50IGFycmF5IGl0c2VsZiB3aWxsIGNoYW5nZS4KLQotICAgIEBtZXRob2QgYXJyYXlX
aWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtBcnJheX0gY29udGVudCB0aGUgbWFuYWdlZCBjb2xsZWN0
aW9uIG9mIG9iamVjdHMKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdo
aWNoIHRoZSBjaGFuZ2VzIHdpbGwgb2NjdXJyCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQg
bnVtYmVyIG9mIG9iamVjdCB0byBiZSByZW1vdmVkIGZyb20gY29udGVudAotICAqLwotICBhcnJh
eVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQsIHN0YXJ0LCByZW1vdmVkQ291bnQpIHsKLSAg
ICAvLyBJZiB0aGUgY29udGVudHMgd2VyZSBlbXB0eSBiZWZvcmUgYW5kIHRoaXMgdGVtcGxhdGUg
Y29sbGVjdGlvbiBoYXMgYW4KLSAgICAvLyBlbXB0eSB2aWV3IHJlbW92ZSBpdCBub3cuCi0gICAg
dmFyIGVtcHR5VmlldyA9IGdldCh0aGlzLCAnZW1wdHlWaWV3Jyk7Ci0gICAgaWYgKGVtcHR5Vmll
dyAmJiBlbXB0eVZpZXcgaW5zdGFuY2VvZiBFbWJlci5WaWV3KSB7Ci0gICAgICBlbXB0eVZpZXcu
cmVtb3ZlRnJvbVBhcmVudCgpOwotICAgIH0KLQotICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZCB2
aWV3cyB0aGF0IGNvcnJlc3BvbmQgd2l0aCB0aGUgcmVtb3ZlZCBpdGVtcy4KLSAgICAvLyBOb3Rl
IHRoYXQgd2UgbG9vcCBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5IHRvIHRoZSBiZWdpbm5pbmcg
YmVjYXVzZQotICAgIC8vIHdlIGFyZSBtdXRhdGluZyBpdCBhcyB3ZSBnby4KLSAgICB2YXIgY2hp
bGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3MsIGNoaWxkVmlldywgaWR4LCBsZW47Ci0KLSAgICBs
ZW4gPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKLQotICAgIHZhciByZW1vdmluZ0FsbCA9IHJl
bW92ZWRDb3VudCA9PT0gbGVuOwotCi0gICAgaWYgKHJlbW92aW5nQWxsKSB7Ci0gICAgICB0aGlz
LmN1cnJlbnRTdGF0ZS5lbXB0eSh0aGlzKTsKLSAgICAgIHRoaXMuaW52b2tlUmVjdXJzaXZlbHko
ZnVuY3Rpb24odmlldykgewotICAgICAgICB2aWV3LnJlbW92ZWRGcm9tRE9NID0gdHJ1ZTsKLSAg
ICAgIH0sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBmb3IgKGlkeCA9IHN0YXJ0ICsgcmVtb3ZlZENv
dW50IC0gMTsgaWR4ID49IHN0YXJ0OyBpZHgtLSkgewotICAgICAgY2hpbGRWaWV3ID0gY2hpbGRW
aWV3c1tpZHhdOwotICAgICAgY2hpbGRWaWV3LmRlc3Ryb3koKTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQ2FsbGVkIHdoZW4gYSBtdXRhdGlvbiB0byB0aGUgdW5kZXJseWluZyBjb250ZW50
IGFycmF5IG9jY3Vycy4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGF5IHRoYXQgbXV0YXRp
b24gYWdhaW5zdCB0aGUgdmlld3MgdGhhdCBjb21wb3NlIHRoZQotICAgIGBFbWJlci5Db2xsZWN0
aW9uVmlld2AsIGVuc3VyaW5nIHRoYXQgdGhlIHZpZXcgcmVmbGVjdHMgdGhlIG1vZGVsLgotCi0g
ICAgVGhpcyBhcnJheSBvYnNlcnZlciBpcyBhZGRlZCBpbiBgY29udGVudERpZENoYW5nZWAuCi0K
LSAgICBAbWV0aG9kIGFycmF5RGlkQ2hhbmdlCi0gICAgQHBhcmFtIHtBcnJheX0gY29udGVudCB0
aGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICBAcGFyYW0ge051bWJlcn0gc3Rh
cnQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjaGFuZ2VzIG9jY3VycmVkCi0gICAgQHBhcmFtIHtO
dW1iZXJ9IHJlbW92ZWQgbnVtYmVyIG9mIG9iamVjdCByZW1vdmVkIGZyb20gY29udGVudAotICAg
IEBwYXJhbSB7TnVtYmVyfSBhZGRlZCBudW1iZXIgb2Ygb2JqZWN0IGFkZGVkIHRvIGNvbnRlbnQK
LSAgKi8KLSAgYXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQsIHN0YXJ0LCByZW1vdmVk
LCBhZGRlZCkgewotICAgIHZhciBhZGRlZFZpZXdzID0gW10sIHZpZXcsIGl0ZW0sIGlkeCwgbGVu
LCBpdGVtVmlld0NsYXNzLAotICAgICAgZW1wdHlWaWV3OwotCi0gICAgbGVuID0gY29udGVudCA/
IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAwOwotCi0gICAgaWYgKGxlbikgewotICAgICAgaXRl
bVZpZXdDbGFzcyA9IGdldCh0aGlzLCAnaXRlbVZpZXdDbGFzcycpOwotCi0gICAgICBpZiAoJ3N0
cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0NsYXNzKSB7Ci0gICAgICAgIGl0ZW1WaWV3Q2xhc3Mg
PSBnZXQoaXRlbVZpZXdDbGFzcykgfHwgaXRlbVZpZXdDbGFzczsKLSAgICAgIH0KLQotICAgICAg
RW1iZXIuYXNzZXJ0KGZtdCgiaXRlbVZpZXdDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRW1i
ZXIuVmlldywgbm90ICVAIiwgW2l0ZW1WaWV3Q2xhc3NdKSwgJ3N0cmluZycgPT09IHR5cGVvZiBp
dGVtVmlld0NsYXNzIHx8IEVtYmVyLlZpZXcuZGV0ZWN0KGl0ZW1WaWV3Q2xhc3MpKTsKLQotICAg
ICAgZm9yIChpZHggPSBzdGFydDsgaWR4IDwgc3RhcnQrYWRkZWQ7IGlkeCsrKSB7Ci0gICAgICAg
IGl0ZW0gPSBjb250ZW50Lm9iamVjdEF0KGlkeCk7Ci0KLSAgICAgICAgdmlldyA9IHRoaXMuY3Jl
YXRlQ2hpbGRWaWV3KGl0ZW1WaWV3Q2xhc3MsIHsKLSAgICAgICAgICBjb250ZW50OiBpdGVtLAot
ICAgICAgICAgIGNvbnRlbnRJbmRleDogaWR4Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZGVk
Vmlld3MucHVzaCh2aWV3KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZW1wdHlWaWV3
ID0gZ2V0KHRoaXMsICdlbXB0eVZpZXcnKTsKLQotICAgICAgaWYgKCFlbXB0eVZpZXcpIHsgcmV0
dXJuOyB9Ci0KLSAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGVtcHR5VmlldykgewotICAg
ICAgICBlbXB0eVZpZXcgPSBnZXQoZW1wdHlWaWV3KSB8fCBlbXB0eVZpZXc7Ci0gICAgICB9Ci0K
LSAgICAgIGVtcHR5VmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGVtcHR5Vmlldyk7Ci0gICAg
ICBhZGRlZFZpZXdzLnB1c2goZW1wdHlWaWV3KTsKLSAgICAgIHNldCh0aGlzLCAnZW1wdHlWaWV3
JywgZW1wdHlWaWV3KTsKLQotICAgICAgaWYgKEVtYmVyLkNvcmVWaWV3LmRldGVjdChlbXB0eVZp
ZXcpKSB7Ci0gICAgICAgIHRoaXMuX2NyZWF0ZWRFbXB0eVZpZXcgPSBlbXB0eVZpZXc7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgdGhpcy5yZXBsYWNlKHN0YXJ0LCAwLCBhZGRlZFZpZXdzKTsKLSAg
fSwKLQotICAvKioKLSAgICBJbnN0YW50aWF0ZXMgYSB2aWV3IHRvIGJlIGFkZGVkIHRvIHRoZSBj
aGlsZFZpZXdzIGFycmF5IGR1cmluZyB2aWV3Ci0gICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5l
cmFsbHkgd2lsbCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSB1bmxlc3MKLSAgICB5b3Ug
YXJlIG92ZXJyaWRpbmcgYGNyZWF0ZUNoaWxkVmlld3MoKWAuIE5vdGUgdGhhdCB0aGlzIG1ldGhv
ZCB3aWxsCi0gICAgYXV0b21hdGljYWxseSBjb25maWd1cmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3Mg
b24gdGhlIG5ldyB2aWV3IGluc3RhbmNlIHRvCi0gICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBh
cmVudC4KLQotICAgIFRoZSB0YWcgbmFtZSBmb3IgdGhlIHZpZXcgd2lsbCBiZSBzZXQgdG8gdGhl
IHRhZ05hbWUgb2YgdGhlIHZpZXdDbGFzcwotICAgIHBhc3NlZCBpbi4KLQotICAgIEBtZXRob2Qg
Y3JlYXRlQ2hpbGRWaWV3Ci0gICAgQHBhcmFtIHtDbGFzc30gdmlld0NsYXNzCi0gICAgQHBhcmFt
IHtIYXNofSBbYXR0cnNdIEF0dHJpYnV0ZXMgdG8gYWRkCi0gICAgQHJldHVybiB7RW1iZXIuVmll
d30gbmV3IGluc3RhbmNlCi0gICovCi0gIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24odmlldywg
YXR0cnMpIHsKLSAgICB2aWV3ID0gdGhpcy5fc3VwZXIodmlldywgYXR0cnMpOwotCi0gICAgdmFy
IGl0ZW1UYWdOYW1lID0gZ2V0KHZpZXcsICd0YWdOYW1lJyk7Ci0KLSAgICBpZiAoaXRlbVRhZ05h
bWUgPT09IG51bGwgfHwgaXRlbVRhZ05hbWUgPT09IHVuZGVmaW5lZCkgewotICAgICAgaXRlbVRh
Z05hbWUgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQW2dldCh0aGlzLCAndGFn
TmFtZScpXTsKLSAgICAgIHNldCh2aWV3LCAndGFnTmFtZScsIGl0ZW1UYWdOYW1lKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfQotfSk7Ci0KLS8qKgotICBBIG1hcCBvZiBwYXJlbnQg
dGFncyB0byB0aGVpciBkZWZhdWx0IGNoaWxkIHRhZ3MuIFlvdSBjYW4gYWRkCi0gIGFkZGl0aW9u
YWwgcGFyZW50IHRhZ3MgaWYgeW91IHdhbnQgY29sbGVjdGlvbiB2aWV3cyB0aGF0IHVzZQotICBh
IHBhcnRpY3VsYXIgcGFyZW50IHRhZyB0byBkZWZhdWx0IHRvIGEgY2hpbGQgdGFnLgotCi0gIEBw
cm9wZXJ0eSBDT05UQUlORVJfTUFQCi0gIEB0eXBlIEhhc2gKLSAgQHN0YXRpYwotICBAZmluYWwK
LSovCi1FbWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQID0gewotICB1bDogJ2xpJywK
LSAgb2w6ICdsaScsCi0gIHRhYmxlOiAndHInLAotICB0aGVhZDogJ3RyJywKLSAgdGJvZHk6ICd0
cicsCi0gIHRmb290OiAndHInLAotICB0cjogJ3RkJywKLSAgc2VsZWN0OiAnb3B0aW9uJwotfTsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9
IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIuaXNOb25lLAotICAgIGFfc2xpY2UgPSBBcnJheS5w
cm90b3R5cGUuc2xpY2U7Ci0KLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVy
LXZpZXdzCi0qLwotCi0vKioKLSAgQW4gYEVtYmVyLkNvbXBvbmVudGAgaXMgYSB2aWV3IHRoYXQg
aXMgY29tcGxldGVseQotICBpc29sYXRlZC4gUHJvcGVydHkgYWNjZXNzIGluIGl0cyB0ZW1wbGF0
ZXMgZ28KLSAgdG8gdGhlIHZpZXcgb2JqZWN0IGFuZCBhY3Rpb25zIGFyZSB0YXJnZXRlZCBhdAot
ICB0aGUgdmlldyBvYmplY3QuIFRoZXJlIGlzIG5vIGFjY2VzcyB0byB0aGUKLSAgc3Vycm91bmRp
bmcgY29udGV4dCBvciBvdXRlciBjb250cm9sbGVyOyBhbGwKLSAgY29udGV4dHVhbCBpbmZvcm1h
dGlvbiBtdXN0IGJlIHBhc3NlZCBpbi4KLQotICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFu
IGBFbWJlci5Db21wb25lbnRgIGlzIHZpYQotICBhIHRlbXBsYXRlLiBJZiB5b3UgbmFtZSBhIHRl
bXBsYXRlCi0gIGBjb21wb25lbnRzL215LWZvb2AsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlCi0g
IGB7e215LWZvb319YCBpbiBvdGhlciB0ZW1wbGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQotICBhbiBp
bnN0YW5jZSBvZiB0aGUgaXNvbGF0ZWQgY29tcG9uZW50LgotCi0gIGBgYGh0bWwKLSAge3thcHAt
cHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9fQotICBgYGAKLQotICBgYGBodG1sCi0gIDwhLS0g
YXBwLXByb2ZpbGUgdGVtcGxhdGUgLS0+Ci0gIDxoMT57e3BlcnNvbi50aXRsZX19PC9oMT4KLSAg
PGltZyB7e2JpbmQtYXR0ciBzcmM9cGVyc29uLmF2YXRhcn19PgotICA8cCBjbGFzcz0nc2lnbmF0
dXJlJz57e3BlcnNvbi5zaWduYXR1cmV9fTwvcD4KLSAgYGBgCi0KLSAgWW91IGNhbiB1c2UgYHlp
ZWxkYCBpbnNpZGUgYSB0ZW1wbGF0ZSB0bwotICBpbmNsdWRlIHRoZSAqKmNvbnRlbnRzKiogb2Yg
YW55IGJsb2NrIGF0dGFjaGVkIHRvCi0gIHRoZSBjb21wb25lbnQuIFRoZSBibG9jayB3aWxsIGJl
IGV4ZWN1dGVkIGluIHRoZQotICBjb250ZXh0IG9mIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IG9y
IG91dGVyIGNvbnRyb2xsZXI6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNhcHAtcHJvZmlsZSBw
ZXJzb249Y3VycmVudFVzZXJ9fQotICAgIDxwPkFkbWluIG1vZGU8L3A+Ci0gICAge3shIEV4ZWN1
dGVkIGluIHRoZSBjb250cm9sbGVycyBjb250ZXh0LiB9fQotICB7ey9hcHAtcHJvZmlsZX19Ci0g
IGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4K
LSAgPGgxPnt7cGVyc29uLnRpdGxlfX08L2gxPgotICB7eyEgRXhlY3V0ZWQgaW4gdGhlIGNvbXBv
bmVudHMgY29udGV4dC4gfX0KLSAge3t5aWVsZH19IHt7ISBibG9jayBjb250ZW50cyB9fQotICBg
YGAKLQotICBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhlIGNvbXBvbmVudCwgaW4gb3JkZXIg
dG8KLSAgaGFuZGxlIGV2ZW50cyBvciBhY3Rpb25zLCB5b3UgaW1wbGVtZW50IGEgc3ViY2xhc3MK
LSAgb2YgYEVtYmVyLkNvbXBvbmVudGAgbmFtZWQgYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlCi0gIGNv
bXBvbmVudC4gTm90ZSB0aGF0IGBDb21wb25lbnRgIG5lZWRzIHRvIGJlIGFwcGVuZGVkIHRvIHRo
ZSBuYW1lIG9mCi0gIHlvdXIgc3ViY2xhc3MgbGlrZSBgQXBwUHJvZmlsZUNvbXBvbmVudGAuCi0K
LSAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBpbXBsZW1lbnQgdGhlIGFjdGlvbgotICBgaGVsbG9g
IGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21wb25lbnQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBB
cHAuQXBwUHJvZmlsZUNvbXBvbmVudCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoewotICAgIGFj
dGlvbnM6IHsKLSAgICAgIGhlbGxvOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGNvbnNvbGUu
bG9nKCJIZWxsbyIsIG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIEFu
ZCB0aGVuIHVzZSBpdCBpbiB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGU6Ci0KLSAgYGBgaHRtbAot
ICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRlIC0tPgotCi0gIDxoMT57e3BlcnNvbi50aXRsZX19
PC9oMT4KLSAge3t5aWVsZH19IDwhLS0gYmxvY2sgY29udGVudHMgLS0+Ci0KLSAgPGJ1dHRvbiB7
e2FjdGlvbiAnaGVsbG8nIHBlcnNvbi5uYW1lfX0+Ci0gICAgU2F5IEhlbGxvIHRvIHt7cGVyc29u
Lm5hbWV9fQotICA8L2J1dHRvbj4KLSAgYGBgCi0KLSAgQ29tcG9uZW50cyBtdXN0IGhhdmUgYSBg
LWAgaW4gdGhlaXIgbmFtZSB0byBhdm9pZAotICBjb25mbGljdHMgd2l0aCBidWlsdC1pbiBjb250
cm9scyB0aGF0IHdyYXAgSFRNTAotICBlbGVtZW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGgg
dGhlIHNhbWUKLSAgcmVxdWlyZW1lbnQgaW4gd2ViIGNvbXBvbmVudHMuCi0KLSAgQGNsYXNzIENv
bXBvbmVudAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSovCi1F
bWJlci5Db21wb25lbnQgPSBFbWJlci5WaWV3LmV4dGVuZChFbWJlci5UYXJnZXRBY3Rpb25TdXBw
b3J0LCB7Ci0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0
KHRoaXMsICdjb250ZXh0JywgdGhpcyk7Ci0gICAgc2V0KHRoaXMsICdjb250cm9sbGVyJywgdGhp
cyk7Ci0gIH0sCi0KLSAgZGVmYXVsdExheW91dDogZnVuY3Rpb24ob3B0aW9ucyl7Ci0gICAgb3B0
aW9ucy5kYXRhID0ge3ZpZXc6IG9wdGlvbnMuX2NvbnRleHR9OwotICAgIEVtYmVyLkhhbmRsZWJh
cnMuaGVscGVyc1sneWllbGQnXS5hcHBseSh0aGlzLCBbb3B0aW9uc10pOwotICB9LAotCi0gIC8v
IGR1cmluZyByZW5kZXIsIGlzb2xhdGUga2V5d29yZHMKLSAgY2xvbmVLZXl3b3JkczogZnVuY3Rp
b24oKSB7Ci0gICAgcmV0dXJuIHsKLSAgICAgIHZpZXc6IHRoaXMsCi0gICAgICBjb250cm9sbGVy
OiB0aGlzCi0gICAgfTsKLSAgfSwKLQotICBfeWllbGQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlv
bnMpIHsKLSAgICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3LAotICAgICAgICBwYXJlbnRW
aWV3ID0gdGhpcy5fcGFyZW50VmlldywKLSAgICAgICAgdGVtcGxhdGUgPSBnZXQodGhpcywgJ3Rl
bXBsYXRlJyk7Ci0KLSAgICBpZiAodGVtcGxhdGUpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiQSBD
b21wb25lbnQgbXVzdCBoYXZlIGEgcGFyZW50IHZpZXcgaW4gb3JkZXIgdG8geWllbGQuIiwgcGFy
ZW50Vmlldyk7Ci0KLSAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoRW1iZXIuVmlldywgewotICAgICAg
ICBpc1ZpcnR1YWw6IHRydWUsCi0gICAgICAgIHRhZ05hbWU6ICcnLAotICAgICAgICBfY29udGV4
dFZpZXc6IHBhcmVudFZpZXcsCi0gICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSwKLSAgICAgICAg
Y29udGV4dDogZ2V0KHBhcmVudFZpZXcsICdjb250ZXh0JyksCi0gICAgICAgIGNvbnRyb2xsZXI6
IGdldChwYXJlbnRWaWV3LCAnY29udHJvbGxlcicpLAotICAgICAgICB0ZW1wbGF0ZURhdGE6IHsg
a2V5d29yZHM6IHBhcmVudFZpZXcuY2xvbmVLZXl3b3JkcygpIH0KLSAgICAgIH0pOwotICAgIH0K
LSAgfSwKLQotICAvKioKLSAgICBJZiB0aGUgY29tcG9uZW50IGlzIGN1cnJlbnRseSBpbnNlcnRl
ZCBpbnRvIHRoZSBET00gb2YgYSBwYXJlbnQgdmlldywgdGhpcwotICAgIHByb3BlcnR5IHdpbGwg
cG9pbnQgdG8gdGhlIGNvbnRyb2xsZXIgb2YgdGhlIHBhcmVudCB2aWV3LgotCi0gICAgQHByb3Bl
cnR5IHRhcmdldE9iamVjdAotICAgIEB0eXBlIEVtYmVyLkNvbnRyb2xsZXIKLSAgICBAZGVmYXVs
dCBudWxsCi0gICovCi0gIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5
KSB7Ci0gICAgdmFyIHBhcmVudFZpZXcgPSBnZXQodGhpcywgJ19wYXJlbnRWaWV3Jyk7Ci0gICAg
cmV0dXJuIHBhcmVudFZpZXcgPyBnZXQocGFyZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7
Ci0gIH0pLnByb3BlcnR5KCdfcGFyZW50VmlldycpLAotCi0gIC8qKgotICAgIFRyaWdnZXJzIGEg
bmFtZWQgYWN0aW9uIG9uIHRoZSBjb250cm9sbGVyIGNvbnRleHQgd2hlcmUgdGhlIGNvbXBvbmVu
dCBpcyB1c2VkIGlmCi0gICAgdGhpcyBjb250cm9sbGVyIGhhcyByZWdpc3RlcmVkIGZvciBub3Rp
ZmljYXRpb25zIG9mIHRoZSBhY3Rpb24uCi0KLSAgICBGb3IgZXhhbXBsZSBhIGNvbXBvbmVudCBm
b3IgcGxheWluZyBvciBwYXVzaW5nIG11c2ljIG1heSB0cmFuc2xhdGUgY2xpY2sgZXZlbnRzCi0g
ICAgaW50byBhY3Rpb24gbm90aWZpY2F0aW9ucyBvZiAicGxheSIgb3IgInN0b3AiIGRlcGVuZGlu
ZyBvbiBzb21lIGludGVybmFsIHN0YXRlCi0gICAgb2YgdGhlIGNvbXBvbmVudDoKLQotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5QbGF5QnV0dG9uQ29tcG9uZW50ID0gRW1iZXIuQ29tcG9u
ZW50LmV4dGVuZCh7Ci0gICAgICBjbGljazogZnVuY3Rpb24oKXsKLSAgICAgICAgaWYgKHRoaXMu
Z2V0KCdpc1BsYXlpbmcnKSkgewotICAgICAgICAgIHRoaXMudHJpZ2dlckFjdGlvbigncGxheScp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMudHJpZ2dlckFjdGlvbignc3RvcCcp
OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBXaGVuIHVzZWQg
aW5zaWRlIGEgdGVtcGxhdGUgdGhlc2UgY29tcG9uZW50IGFjdGlvbnMgYXJlIGNvbmZpZ3VyZWQg
dG8KLSAgICB0cmlnZ2VyIGFjdGlvbnMgaW4gdGhlIG91dGVyIGFwcGxpY2F0aW9uIGNvbnRleHQ6
Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3shIGFwcGxpY2F0aW9uLmhicyB9fQotICAgIHt7
cGxheS1idXR0b24gcGxheT0ibXVzaWNTdGFydGVkIiBzdG9wPSJtdXNpY1N0b3BwZWQifX0KLSAg
ICBgYGAKLQotICAgIFdoZW4gdGhlIGNvbXBvbmVudCByZWNlaXZlcyBhIGJyb3dzZXIgYGNsaWNr
YCBldmVudCBpdCB0cmFuc2xhdGUgdGhpcwotICAgIGludGVyYWN0aW9uIGludG8gYXBwbGljYXRp
b24tc3BlY2lmaWMgc2VtYW50aWNzICgicGxheSIgb3IgInN0b3AiKSBhbmQKLSAgICB0cmlnZ2Vy
cyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBuYW1lIG9uIHRoZSBjb250cm9sbGVyIGZvciB0aGUgdGVt
cGxhdGUKLSAgICB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVzZWQ6IAotCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgbXVzaWNTdGFydGVkOiBmdW5jdGlv
bigpewotICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlja2Vk
Ci0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNpYyBzdGFydGVkIHBsYXlpbmcKLSAgICAgICAgfSwK
LSAgICAgICAgbXVzaWNTdG9wcGVkOiBmdW5jdGlvbigpewotICAgICAgICAgIC8vIGNhbGxlZCB3
aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlja2VkCi0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNp
YyBzdG9wcGVkIHBsYXlpbmcKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgSWYgbm8gYWN0aW9uIG5hbWUgaXMgcGFzc2VkIHRvIGBzZW5kQWN0aW9uYCBhIGRlZmF1
bHQgbmFtZSBvZiAiYWN0aW9uIgotICAgIGlzIGFzc3VtZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgQXBwLk5leHRCdXR0b25Db21wb25lbnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsK
LSAgICAgIGNsaWNrOiBmdW5jdGlvbigpewotICAgICAgICB0aGlzLnNlbmRBY3Rpb24oKTsKLSAg
ICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICB7eyEgYXBw
bGljYXRpb24uaGJzIH19Ci0gICAge3tuZXh0LWJ1dHRvbiBhY3Rpb249InBsYXlOZXh0U29uZ0lu
QWxidW0ifX0KLSAgICBgYGAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgICAgYWN0aW9uczog
ewotICAgICAgICBwbGF5TmV4dFNvbmdJbkFsYnVtOiBmdW5jdGlvbigpewotICAgICAgICAgIC4u
LgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNl
bmRBY3Rpb24KLSAgICBAcGFyYW0gW2FjdGlvbl0ge1N0cmluZ30gdGhlIGFjdGlvbiB0byB0cmln
Z2VyCi0gICAgQHBhcmFtIFtjb250ZXh0XSB7Kn0gYSBjb250ZXh0IHRvIHNlbmQgd2l0aCB0aGUg
YWN0aW9uCi0gICovCi0gIHNlbmRBY3Rpb246IGZ1bmN0aW9uKGFjdGlvbikgewotICAgIHZhciBh
Y3Rpb25OYW1lLAotICAgICAgICBjb250ZXh0cyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEp
OwotCi0gICAgLy8gU2VuZCB0aGUgZGVmYXVsdCBhY3Rpb24KLSAgICBpZiAoYWN0aW9uID09PSB1
bmRlZmluZWQpIHsKLSAgICAgIGFjdGlvbk5hbWUgPSBnZXQodGhpcywgJ2FjdGlvbicpOwotICAg
ICAgRW1iZXIuYXNzZXJ0KCJUaGUgZGVmYXVsdCBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUg
Y29tcG9uZW50ICIgKyB0aGlzLnRvU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICIsIGJ1
dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rpb25OYW1lICsgIikgd2FzIG5vdCBhIHN0cmluZy4i
LAotICAgICAgICAgICAgICAgICAgIGlzTm9uZShhY3Rpb25OYW1lKSB8fCB0eXBlb2YgYWN0aW9u
TmFtZSA9PT0gJ3N0cmluZycpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhY3Rpb25OYW1lID0gZ2V0
KHRoaXMsIGFjdGlvbik7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRoZSAiICsgYWN0aW9uICsgIiBh
Y3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUgY29tcG9uZW50ICIgKwotICAgICAgICAgICAgICAg
ICAgIHRoaXMudG9TdHJpbmcoKSArICIsIGJ1dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rpb25O
YW1lICsKLSAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IGEgc3RyaW5nLiIsCi0gICAgICAg
ICAgICAgICAgICAgaXNOb25lKGFjdGlvbk5hbWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAn
c3RyaW5nJyk7Ci0gICAgfQotCi0gICAgLy8gSWYgbm8gYWN0aW9uIG5hbWUgZm9yIHRoYXQgYWN0
aW9uIGNvdWxkIGJlIGZvdW5kLCBqdXN0IGFib3J0LgotICAgIGlmIChhY3Rpb25OYW1lID09PSB1
bmRlZmluZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAg
YWN0aW9uOiBhY3Rpb25OYW1lLAotICAgICAgYWN0aW9uQ29udGV4dDogY29udGV4dHMKLSAgICB9
KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLWBFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydGAgaXMg
YSBtaXhpbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhCi12aWV3IGNsYXNzIHRvIGFkZCBhIGB0
cmlnZ2VyQWN0aW9uYCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mgc2ltaWxhciB0bwotdGhlIEhhbmRs
ZWJhcnMgYHt7YWN0aW9ufX1gIGhlbHBlci4gSXQgcHJvdmlkZXMgaW50ZWxsaWdlbnQgZGVmYXVs
dHMKLWZvciB0aGUgYWN0aW9uJ3MgdGFyZ2V0OiB0aGUgdmlldydzIGNvbnRyb2xsZXI7IGFuZCB0
aGUgY29udGV4dCB0aGF0IGlzCi1zZW50IHdpdGggdGhlIGFjdGlvbjogdGhlIHZpZXcncyBjb250
ZXh0LgotCi1Ob3RlOiBJbiBub3JtYWwgRW1iZXIgdXNhZ2UsIHRoZSBge3thY3Rpb259fWAgaGVs
cGVyIGlzIHVzdWFsbHkgdGhlIGJlc3QKLWNob2ljZS4gVGhpcyBtaXhpbiBpcyBtb3N0IG9mdGVu
IHVzZWZ1bCB3aGVuIHlvdSBhcmUgZG9pbmcgbW9yZSBjb21wbGV4Ci1ldmVudCBoYW5kbGluZyBp
biBjdXN0b20gVmlldyBzdWJjbGFzc2VzLgotCi1Gb3IgZXhhbXBsZToKLQotYGBgamF2YXNjcmlw
dAotQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuVmlld1Rhcmdl
dEFjdGlvblN1cHBvcnQsIHsKLSAgYWN0aW9uOiAnc2F2ZScsCi0gIGNsaWNrOiBmdW5jdGlvbigp
IHsKLSAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24s
IGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0gIH0KLX0pOwotYGBgCi0KLVRoZSBgYWN0
aW9uYCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJvcGVydGllcyBvZiBhbiBvcHRpb25hbCBvYmplY3Qg
YXJndW1lbnQKLXRvIGB0cmlnZ2VyQWN0aW9uYCBhcyB3ZWxsLgotCi1gYGBqYXZhc2NyaXB0Ci1B
cHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0
aW9uU3VwcG9ydCwgewotICBjbGljazogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy50cmlnZ2VyQWN0
aW9uKHsKLSAgICAgIGFjdGlvbjogJ3NhdmUnCi0gICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAg
YWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgICAgLy8gdG8gdGhl
IGN1cnJlbnQgY29udHJvbGxlcgotICB9Ci19KTsKLWBgYAotCi1AY2xhc3MgVmlld1RhcmdldEFj
dGlvblN1cHBvcnQKLUBuYW1lc3BhY2UgRW1iZXIKLUBleHRlbmRzIEVtYmVyLlRhcmdldEFjdGlv
blN1cHBvcnQKLSovCi1FbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCA9IEVtYmVyLk1peGlu
LmNyZWF0ZShFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7Ci0gIC8qKgotICBAcHJvcGVydHkg
dGFyZ2V0Ci0gICovCi0gIHRhcmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXIn
KSwKLSAgLyoqCi0gIEBwcm9wZXJ0eSBhY3Rpb25Db250ZXh0Ci0gICovCi0gIGFjdGlvbkNvbnRl
eHQ6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250ZXh0JykKLX0pOwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBW
aWV3cwotCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi1AcmVxdWlyZXMg
ZW1iZXItcnVudGltZQotQG1haW4gZW1iZXItdmlld3MKLSovCi0KLX0pKCk7Ci0KLShmdW5jdGlv
bigpIHsKLWRlZmluZSgibWV0YW1vcnBoIiwKLSAgW10sCi0gIGZ1bmN0aW9uKCkgewotICAgICJ1
c2Ugc3RyaWN0IjsKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFByb2plY3Q6ICAg
bWV0YW1vcnBoCi0gICAgLy8gQ29weXJpZ2h0OiDCqTIwMTQgVGlsZGUsIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgdmFyIEsgPSBmdW5j
dGlvbigpIHt9LAotICAgICAgICBndWlkID0gMCwKLSAgICAgICAgZGlzYWJsZVJhbmdlID0gKGZ1
bmN0aW9uKCl7Ci0gICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgTWV0YW1vcnBo
RU5WKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWV0YW1vcnBoRU5WLkRJU0FCTEVfUkFOR0VfQVBJ
OwotICAgICAgICAgIH0gZWxzZSBpZiAoJ3VuZGVmaW5lZCcgIT09IEVOVikgewotICAgICAgICAg
ICAgcmV0dXJuIEVOVi5ESVNBQkxFX1JBTkdFX0FQSTsKLSAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSkoKSwKLQotICAg
ICAgICAvLyBGZWF0dXJlLWRldGVjdCB0aGUgVzNDIHJhbmdlIEFQSSwgdGhlIGV4dGVuZGVkIGNo
ZWNrIGlzIGZvciBJRTkgd2hpY2ggb25seSBwYXJ0aWFsbHkgc3VwcG9ydHMgcmFuZ2VzCi0gICAg
ICAgIHN1cHBvcnRzUmFuZ2UgPSAoIWRpc2FibGVSYW5nZSkgJiYgZG9jdW1lbnQgJiYgKCdjcmVh
dGVSYW5nZScgaW4gZG9jdW1lbnQpICYmICh0eXBlb2YgUmFuZ2UgIT09ICd1bmRlZmluZWQnKSAm
JiBSYW5nZS5wcm90b3R5cGUuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50LAotCi0gICAgICAgIC8v
IEludGVybmV0IEV4cGxvcmVyIHByaW9yIHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5l
ckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgICAgLy8gaXMgYSAiemVyby1zY29wZSIg
ZWxlbWVudC4gVGhpcyBwcm9ibGVtIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGJ5IG1ha2luZwotICAg
ICAgICAvLyB0aGUgZmlyc3Qgbm9kZSBhbiBpbnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBN
b2Rlcm5penIsIHVzZSAmc2h5OwotICAgICAgICBuZWVkc1NoeSA9IGRvY3VtZW50ICYmIChmdW5j
dGlvbigpIHsKLSAgICAgICAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2Jyk7Ci0gICAgICAgICAgdGVzdEVsLmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7Ci0gICAg
ICAgICAgdGVzdEVsLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID0gIjxzY3JpcHQ+PC9zY3JpcHQ+IjsK
LSAgICAgICAgICByZXR1cm4gdGVzdEVsLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKLSAg
ICAgICAgfSkoKSwKLQotCi0gICAgICAgIC8vIElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlr
ZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcKLSAgICAgICAgLy8gYSBzY3JpcHQgdGFn
IHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbgotICAgICAgICAvLyBh
Y2NpZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3BhY2Ugd2hlbiB1cGRhdGluZyBhIG1vcnBoLgotICAg
ICAgICBtb3Zlc1doaXRlc3BhY2UgPSBkb2N1bWVudCAmJiAoZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgICAgICAg
IHRlc3RFbC5pbm5lckhUTUwgPSAiVGVzdDogPHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xk
ZXInPjwvc2NyaXB0PlZhbHVlIjsKLSAgICAgICAgICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNb
MF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYmCi0gICAgICAgICAgICAgICAgICB0ZXN0RWwuY2hp
bGROb2Rlc1syXS5ub2RlVmFsdWUgPT09ICcgVmFsdWUnOwotICAgICAgICB9KSgpOwotCi0gICAg
Ly8gQ29uc3RydWN0b3IgdGhhdCBzdXBwb3J0cyBlaXRoZXIgTWV0YW1vcnBoKCdmb28nKSBvciBu
ZXcKLSAgICAvLyBNZXRhbW9ycGgoJ2ZvbycpOwotICAgIC8vCi0gICAgLy8gVGFrZXMgYSBzdHJp
bmcgb2YgSFRNTCBhcyB0aGUgYXJndW1lbnQuCi0KLSAgICB2YXIgTWV0YW1vcnBoID0gZnVuY3Rp
b24oaHRtbCkgewotICAgICAgdmFyIHNlbGY7Ci0KLSAgICAgIGlmICh0aGlzIGluc3RhbmNlb2Yg
TWV0YW1vcnBoKSB7Ci0gICAgICAgIHNlbGYgPSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgc2VsZiA9IG5ldyBLKCk7Ci0gICAgICB9Ci0KLSAgICAgIHNlbGYuaW5uZXJIVE1MID0gaHRt
bDsKLSAgICAgIHZhciBteUd1aWQgPSAnbWV0YW1vcnBoLScrKGd1aWQrKyk7Ci0gICAgICBzZWxm
LnN0YXJ0ID0gbXlHdWlkICsgJy1zdGFydCc7Ci0gICAgICBzZWxmLmVuZCA9IG15R3VpZCArICct
ZW5kJzsKLQotICAgICAgcmV0dXJuIHNlbGY7Ci0gICAgfTsKLQotICAgIEsucHJvdG90eXBlID0g
TWV0YW1vcnBoLnByb3RvdHlwZTsKLQotICAgIHZhciByYW5nZUZvciwgaHRtbEZ1bmMsIHJlbW92
ZUZ1bmMsIG91dGVySFRNTEZ1bmMsIGFwcGVuZFRvRnVuYywgYWZ0ZXJGdW5jLCBwcmVwZW5kRnVu
Yywgc3RhcnRUYWdGdW5jLCBlbmRUYWdGdW5jOwotCi0gICAgb3V0ZXJIVE1MRnVuYyA9IGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUYWcoKSArIHRoaXMuaW5uZXJIVE1MICsg
dGhpcy5lbmRUYWcoKTsKLSAgICB9OwotCi0gICAgc3RhcnRUYWdGdW5jID0gZnVuY3Rpb24oKSB7
Ci0gICAgICAvKgotICAgICAgICogV2UgcmVwbGFjZSBjaGV2cm9uIGJ5IGl0cyBoZXggY29kZSBp
biBvcmRlciB0byBwcmV2ZW50IGVzY2FwaW5nIHByb2JsZW1zLgotICAgICAgICogQ2hlY2sgdGhp
cyB0aHJlYWQgZm9yIG1vcmUgZXhwbGFpbmF0aW9uOgotICAgICAgICogaHR0cDovL3N0YWNrb3Zl
cmZsb3cuY29tL3F1ZXN0aW9ucy84MjMxMDQ4L3doeS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1n
ZW5lcmF0aW5nLWh0bWwtZnJvbS1qYXZhc2NyaXB0Ci0gICAgICAgKi8KLSAgICAgIHJldHVybiAi
PHNjcmlwdCBpZD0nIiArIHRoaXMuc3RhcnQgKyAiJyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXIn
Plx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQotICAgIGVuZFRhZ0Z1bmMgPSBmdW5jdGlvbigpIHsK
LSAgICAgIC8qCi0gICAgICAgKiBXZSByZXBsYWNlIGNoZXZyb24gYnkgaXRzIGhleCBjb2RlIGlu
IG9yZGVyIHRvIHByZXZlbnQgZXNjYXBpbmcgcHJvYmxlbXMuCi0gICAgICAgKiBDaGVjayB0aGlz
IHRocmVhZCBmb3IgbW9yZSBleHBsYWluYXRpb246Ci0gICAgICAgKiBodHRwOi8vc3RhY2tvdmVy
Zmxvdy5jb20vcXVlc3Rpb25zLzgyMzEwNDgvd2h5LXVzZS14M2MtaW5zdGVhZC1vZi13aGVuLWdl
bmVyYXRpbmctaHRtbC1mcm9tLWphdmFzY3JpcHQKLSAgICAgICAqLwotICAgICAgcmV0dXJuICI8
c2NyaXB0IGlkPSciICsgdGhpcy5lbmQgKyAiJyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4
M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQotICAgIC8vIElmIHdlIGhhdmUgdGhlIFczQyByYW5nZSBB
UEksIHRoaXMgcHJvY2VzcyBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0IGZvcndhcmQuCi0gICAgaWYg
KHN1cHBvcnRzUmFuZ2UpIHsKLQotICAgICAgLy8gR2V0IGEgcmFuZ2UgZm9yIHRoZSBjdXJyZW50
IG1vcnBoLiBPcHRpb25hbGx5IGluY2x1ZGUgdGhlIHN0YXJ0aW5nIGFuZAotICAgICAgLy8gZW5k
aW5nIHBsYWNlaG9sZGVycy4KLSAgICAgIHJhbmdlRm9yID0gZnVuY3Rpb24obW9ycGgsIG91dGVy
VG9vKSB7Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAg
ICAgIHZhciBiZWZvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb3JwaC5zdGFydCk7Ci0g
ICAgICAgIHZhciBhZnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vcnBoLmVuZCk7Ci0K
LSAgICAgICAgaWYgKG91dGVyVG9vKSB7Ci0gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUo
YmVmb3JlKTsKLSAgICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihhZnRlcik7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihiZWZvcmUpOwotICAgICAgICAg
IHJhbmdlLnNldEVuZEJlZm9yZShhZnRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4g
cmFuZ2U7Ci0gICAgICB9OwotCi0gICAgICBodG1sRnVuYyA9IGZ1bmN0aW9uKGh0bWwsIG91dGVy
VG9vKSB7Ci0gICAgICAgIC8vIGdldCBhIHJhbmdlIGZvciB0aGUgY3VycmVudCBtZXRhbW9ycGgg
b2JqZWN0Ci0gICAgICAgIHZhciByYW5nZSA9IHJhbmdlRm9yKHRoaXMsIG91dGVyVG9vKTsKLQot
ICAgICAgICAvLyBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSwgd2hpY2ggd2lsbCBi
ZSB0aGUKLSAgICAgICAgLy8gbm9kZXMgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBw
bGFjZWhvbGRlci4KLSAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQotICAgICAgICAv
LyBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIHRoZSBIVE1MCi0gICAgICAgIHZh
ciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTsKLQotICAg
ICAgICAvLyBpbnNlcnQgdGhlIGZyYWdtZW50IGludG8gdGhlIHJhbmdlCi0gICAgICAgIHJhbmdl
Lmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAgICAgfTsKLQotICAgICAgLyoqCi0gICAgICAqIEBw
dWJsaWMKLSAgICAgICoKLSAgICAgICogUmVtb3ZlIHRoaXMgb2JqZWN0IChpbmNsdWRpbmcgc3Rh
cnRpbmcgYW5kIGVuZGluZwotICAgICAgKiBwbGFjZWhvbGRlcnMpLgotICAgICAgKgotICAgICAg
KiBAbWV0aG9kIHJlbW92ZQotICAgICAgKi8KLSAgICAgIHJlbW92ZUZ1bmMgPSBmdW5jdGlvbigp
IHsKLSAgICAgICAgLy8gZ2V0IGEgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IG1ldGFtb3JwaCBvYmpl
Y3QgaW5jbHVkaW5nCi0gICAgICAgIC8vIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9s
ZGVycy4KLSAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VGb3IodGhpcywgdHJ1ZSk7Ci0KLSAgICAg
ICAgLy8gZGVsZXRlIHRoZSBlbnRpcmUgcmFuZ2UuCi0gICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRl
bnRzKCk7Ci0gICAgICB9OwotCi0gICAgICBhcHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihub2RlKSB7
Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHJh
bmdlLnNldFN0YXJ0KG5vZGUpOwotICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7Ci0gICAg
ICAgIHZhciBmcmFnID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRoaXMub3V0ZXJI
VE1MKCkpOwotICAgICAgICBub2RlLmFwcGVuZENoaWxkKGZyYWcpOwotICAgICAgfTsKLQotICAg
ICAgYWZ0ZXJGdW5jID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1
bWVudC5jcmVhdGVSYW5nZSgpOwotICAgICAgICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCh0aGlzLmVuZCk7Ci0KLSAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihhZnRlcik7
Ci0gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGFmdGVyKTsKLQotICAgICAgICB2YXIgZnJhZ21l
bnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7Ci0gICAgICAgIHJhbmdl
Lmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAgICAgfTsKLQotICAgICAgcHJlcGVuZEZ1bmMgPSBm
dW5jdGlvbihodG1sKSB7Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdl
KCk7Ci0gICAgICAgIHZhciBzdGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3Rh
cnQpOwotCi0gICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoc3RhcnQpOwotICAgICAgICByYW5n
ZS5zZXRFbmRBZnRlcihzdGFydCk7Ci0KLSAgICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3Jl
YXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOwotICAgICAgICByYW5nZS5pbnNlcnROb2RlKGZy
YWdtZW50KTsKLSAgICAgIH07Ci0KLSAgICB9IGVsc2UgewotICAgICAgLyoKLSAgICAgICAqIFRo
aXMgY29kZSBpcyBtb3N0bHkgdGFrZW4gZnJvbSBqUXVlcnksIHdpdGggb25lIGV4Y2VwdGlvbi4g
SW4galF1ZXJ5J3MgY2FzZSwgd2UKLSAgICAgICAqIGhhdmUgc29tZSBIVE1MIGFuZCB3ZSBuZWVk
IHRvIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgaXQgaW50byBzb21lIG5vZGVzLgotICAgICAg
ICoKLSAgICAgICAqIEluIHRoaXMgY2FzZSwgalF1ZXJ5IG5lZWRzIHRvIHNjYW4gdGhlIEhUTUwg
bG9va2luZyBmb3IgYW4gb3BlbmluZyB0YWcgYW5kIHVzZQotICAgICAgICogdGhhdCBhcyB0aGUg
a2V5IGZvciB0aGUgd3JhcCBtYXAuIEluIG91ciBjYXNlLCB3ZSBrbm93IHRoZSBwYXJlbnQgbm9k
ZSwgYW5kCi0gICAgICAgKiBjYW4gdXNlIGl0cyB0eXBlIGFzIHRoZSBrZXkgZm9yIHRoZSB3cmFw
IG1hcC4KLSAgICAgICAqKi8KLSAgICAgIHZhciB3cmFwTWFwID0gewotICAgICAgICBzZWxlY3Q6
IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAotICAg
ICAgICBmaWVsZHNldDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKLSAgICAg
ICAgdGFibGU6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCi0gICAgICAgIHRib2R5OiBb
IDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdLAotICAgICAgICB0cjog
WyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKLSAg
ICAgICAgY29sZ3JvdXA6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+Iiwg
IjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCi0gICAgICAgIG1hcDogWyAxLCAiPG1hcD4iLCAiPC9t
YXA+IiBdLAotICAgICAgICBfZGVmYXVsdDogWyAwLCAiIiwgIiIgXQotICAgICAgfTsKLQotICAg
ICAgdmFyIGZpbmRDaGlsZEJ5SWQgPSBmdW5jdGlvbihlbGVtZW50LCBpZCkgewotICAgICAgICBp
ZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJykgPT09IGlkKSB7IHJldHVybiBlbGVtZW50OyB9
Ci0KLSAgICAgICAgdmFyIGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgsIGlkeCwgbm9k
ZSwgZm91bmQ7Ci0gICAgICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICAg
ICAgbm9kZSA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpZHhdOwotICAgICAgICAgIGZvdW5kID0gbm9k
ZS5ub2RlVHlwZSA9PT0gMSAmJiBmaW5kQ2hpbGRCeUlkKG5vZGUsIGlkKTsKLSAgICAgICAgICBp
ZiAoZm91bmQpIHsgcmV0dXJuIGZvdW5kOyB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAg
IHZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7Ci0gICAgICAgIHZh
ciBtYXRjaGVzID0gW107Ci0gICAgICAgIGlmIChtb3Zlc1doaXRlc3BhY2UpIHsKLSAgICAgICAg
ICAvLyBSaWdodCBub3cgd2Ugb25seSBjaGVjayBmb3Igc2NyaXB0IHRhZ3Mgd2l0aCBpZHMgd2l0
aCB0aGUKLSAgICAgICAgICAvLyBnb2FsIG9mIHRhcmdldGluZyBtb3JwaHMuCi0gICAgICAgICAg
aHRtbCA9IGh0bWwucmVwbGFjZSgvKFxzKykoPHNjcmlwdCBpZD0nKFteJ10rKScpL2csIGZ1bmN0
aW9uKG1hdGNoLCBzcGFjZXMsIHRhZywgaWQpIHsKLSAgICAgICAgICAgIG1hdGNoZXMucHVzaChb
aWQsIHNwYWNlc10pOwotICAgICAgICAgICAgcmV0dXJuIHRhZzsKLSAgICAgICAgICB9KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKLQotICAgICAgICAv
LyBJZiB3ZSBoYXZlIHRvIGRvIGFueSB3aGl0ZXNwYWNlIGFkanVzdG1lbnRzIGRvIHRoZW0gbm93
Ci0gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICB2YXIgbGVuID0g
bWF0Y2hlcy5sZW5ndGgsIGlkeDsKLSAgICAgICAgICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgr
KykgewotICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGZpbmRDaGlsZEJ5SWQoZWxlbWVudCwgbWF0
Y2hlc1tpZHhdWzBdKSwKLSAgICAgICAgICAgICAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4
dE5vZGUobWF0Y2hlc1tpZHhdWzFdKTsKLSAgICAgICAgICAgIHNjcmlwdC5wYXJlbnROb2RlLmlu
c2VydEJlZm9yZShub2RlLCBzY3JpcHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
fTsKLQotICAgICAgLyoKLSAgICAgICAqIEdpdmVuIGEgcGFyZW50IG5vZGUgYW5kIHNvbWUgSFRN
TCwgZ2VuZXJhdGUgYSBzZXQgb2Ygbm9kZXMuIFJldHVybiB0aGUgZmlyc3QKLSAgICAgICAqIG5v
ZGUsIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdGhlIHJlc3QgdXNpbmcgbmV4dFNp
YmxpbmcuCi0gICAgICAgKgotICAgICAgICogV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgaW5u
ZXJIVE1MIGluIElFIGRvZXMgbm90IHJlYWxseSBwYXJzZSB0aGUgbm9kZXMuCi0gICAgICAgKi8K
LSAgICAgIHZhciBmaXJzdE5vZGVGb3IgPSBmdW5jdGlvbihwYXJlbnROb2RlLCBodG1sKSB7Ci0g
ICAgICAgIHZhciBhcnIgPSB3cmFwTWFwW3BhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgp
XSB8fCB3cmFwTWFwLl9kZWZhdWx0OwotICAgICAgICB2YXIgZGVwdGggPSBhcnJbMF0sIHN0YXJ0
ID0gYXJyWzFdLCBlbmQgPSBhcnJbMl07Ci0KLSAgICAgICAgaWYgKG5lZWRzU2h5KSB7IGh0bWwg
PSAnJnNoeTsnK2h0bWw7IH0KLQotICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoJ2RpdicpOwotCi0gICAgICAgIHNldElubmVySFRNTChlbGVtZW50LCBzdGFydCAr
IGh0bWwgKyBlbmQpOwotCi0gICAgICAgIGZvciAodmFyIGk9MDsgaTw9ZGVwdGg7IGkrKykgewot
ICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBMb29rIGZvciAmc2h5OyB0byByZW1vdmUgaXQuCi0gICAgICAgIGlmIChuZWVkc1No
eSkgewotICAgICAgICAgIHZhciBzaHlFbGVtZW50ID0gZWxlbWVudDsKLQotICAgICAgICAgIC8v
IFNvbWV0aW1lcyB3ZSBnZXQgbmFtZWxlc3MgZWxlbWVudHMgd2l0aCB0aGUgc2h5IGluc2lkZQot
ICAgICAgICAgIHdoaWxlIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAxICYmICFzaHlFbGVtZW50
Lm5vZGVOYW1lKSB7Ci0gICAgICAgICAgICBzaHlFbGVtZW50ID0gc2h5RWxlbWVudC5maXJzdENo
aWxkOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyB0aGUg
YWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgotICAgICAgICAgIGlmIChzaHlFbGVtZW50Lm5vZGVU
eXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIp
IHsKLSAgICAgICAgICAgIHNoeUVsZW1lbnQubm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFs
dWUuc2xpY2UoMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVs
ZW1lbnQ7Ci0gICAgICB9OwotCi0gICAgICAvKgotICAgICAgICogSW4gc29tZSBjYXNlcywgSW50
ZXJuZXQgRXhwbG9yZXIgY2FuIGNyZWF0ZSBhbiBhbm9ueW1vdXMgbm9kZSBpbgotICAgICAgICog
dGhlIGhpZXJhcmNoeSB3aXRoIG5vIHRhZ05hbWUuIFlvdSBjYW4gY3JlYXRlIHRoaXMgc2NlbmFy
aW8gdmlhOgotICAgICAgICoKLSAgICAgICAqICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT4mc2h5PHNj
cmlwdD48L3NjcmlwdD48dHI+PHRkPmhpPC90ZD48L3RyPjwvdGFibGU+IjsKLSAgICAgICAqICAg
ICBkaXYuZmlyc3RDaGlsZC5maXJzdENoaWxkLnRhZ05hbWUgLy89PiAiIgotICAgICAgICoKLSAg
ICAgICAqIElmIG91ciBzY3JpcHQgbWFya2VycyBhcmUgaW5zaWRlIHN1Y2ggYSBub2RlLCB3ZSBu
ZWVkIHRvIGZpbmQgdGhhdAotICAgICAgICogbm9kZSBhbmQgdXNlICppdCogYXMgdGhlIG1hcmtl
ci4KLSAgICAgICAqLwotICAgICAgdmFyIHJlYWxOb2RlID0gZnVuY3Rpb24oc3RhcnQpIHsKLSAg
ICAgICAgd2hpbGUgKHN0YXJ0LnBhcmVudE5vZGUudGFnTmFtZSA9PT0gIiIpIHsKLSAgICAgICAg
ICBzdGFydCA9IHN0YXJ0LnBhcmVudE5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4g
c3RhcnQ7Ci0gICAgICB9OwotCi0gICAgICAvKgotICAgICAgICogV2hlbiBhdXRvbWF0aWNhbGx5
IGFkZGluZyBhIHRib2R5LCBJbnRlcm5ldCBFeHBsb3JlciBpbnNlcnRzIHRoZQotICAgICAgICog
dGJvZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCA8dHI+LiBPdGhlciBicm93c2VycyBj
cmVhdGUgaXQKLSAgICAgICAqIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSwgbm8gbWF0dGVyIHdoYXQu
Ci0gICAgICAgKgotICAgICAgICogVGhpcyBtZWFucyB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgot
ICAgICAgICoKLSAgICAgICAqICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYi
KTsKLSAgICAgICAqICAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48c2NyaXB0IGlkPSdmaXJz
dCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90cj48c2NyaXB0IGlkPSdsYXN0Jz48L3Njcmlw
dD48L3RhYmxlPgotICAgICAgICoKLSAgICAgICAqIEdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIERP
TSBpbiBJRToKLSAgICAgICAqCi0gICAgICAgKiAgICAgKyBkaXYKLSAgICAgICAqICAgICAgICsg
dGFibGUKLSAgICAgICAqICAgICAgICAgLSBzY3JpcHQgaWQ9J2ZpcnN0JwotICAgICAgICogICAg
ICAgICArIHRib2R5Ci0gICAgICAgKiAgICAgICAgICAgKyB0cgotICAgICAgICogICAgICAgICAg
ICAgKyB0ZAotICAgICAgICogICAgICAgICAgICAgICAtICJoaSIKLSAgICAgICAqICAgICAgICAg
ICAtIHNjcmlwdCBpZD0nbGFzdCcKLSAgICAgICAqCi0gICAgICAgKiBXaGljaCBtZWFucyB0aGF0
IHRoZSB0d28gc2NyaXB0IHRhZ3MsIGV2ZW4gdGhvdWdoIHRoZXkgd2VyZQotICAgICAgICogaW5z
ZXJ0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIGhpZXJhcmNoeSBpbiB0aGUgb3JpZ2luYWwK
LSAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRpZmZlcmVudCBwYXJlbnRzLgotICAgICAgICoKLSAg
ICAgICAqIFRoaXMgY29kZSByZXBhcmVudHMgdGhlIGZpcnN0IHNjcmlwdCB0YWcgYnkgbWFraW5n
IGl0IHRoZSB0Ym9keSdzCi0gICAgICAgKiBmaXJzdCBjaGlsZC4KLSAgICAgICAqCi0gICAgICAg
Ki8KLSAgICAgIHZhciBmaXhQYXJlbnRhZ2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7Ci0gICAg
ICAgIGlmIChzdGFydC5wYXJlbnROb2RlICE9PSBlbmQucGFyZW50Tm9kZSkgewotICAgICAgICAg
IGVuZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdGFydCwgZW5kLnBhcmVudE5vZGUuZmlyc3RD
aGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24o
aHRtbCwgb3V0ZXJUb28pIHsKLSAgICAgICAgLy8gZ2V0IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUu
IHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KLSAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUo
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCkpOwotICAgICAgICB2YXIgZW5kID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOwotICAgICAgICB2YXIgcGFyZW50Tm9k
ZSA9IGVuZC5wYXJlbnROb2RlOwotICAgICAgICB2YXIgbm9kZSwgbmV4dFNpYmxpbmcsIGxhc3Q7
Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbm9kZXMgc2hh
cmUgdGhlIHNhbWUKLSAgICAgICAgLy8gcGFyZW50LiBJZiBub3QsIGZpeCBpdC4KLSAgICAgICAg
Zml4UGFyZW50YWdlKHN0YXJ0LCBlbmQpOwotCi0gICAgICAgIC8vIHJlbW92ZSBhbGwgb2YgdGhl
IG5vZGVzIGFmdGVyIHRoZSBzdGFydGluZyBwbGFjZWhvbGRlciBhbmQKLSAgICAgICAgLy8gYmVm
b3JlIHRoZSBlbmRpbmcgcGxhY2Vob2xkZXIuCi0gICAgICAgIG5vZGUgPSBzdGFydC5uZXh0U2li
bGluZzsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5v
ZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAgbGFzdCA9IG5vZGUgPT09IGVuZDsKLQotICAgICAg
ICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSwgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0
IGFzIHdlbGwsCi0gICAgICAgICAgLy8gc2V0IHRoZSBgZW5kYCBub2RlIHRvIHRoZSBuZXh0IHNp
YmxpbmcuIFRoaXMgaXMgYmVjYXVzZQotICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUg
ZnVuY3Rpb24sIHdlIGluc2VydCB0aGUgbmV3IG5vZGVzCi0gICAgICAgICAgLy8gYmVmb3JlIHRo
ZSBlbmQgKG5vdGUgdGhhdCBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbCkgaXMKLSAgICAgICAgICAv
LyB0aGUgc2FtZSBhcyBhcHBlbmRDaGlsZChub2RlKSkuCi0gICAgICAgICAgLy8KLSAgICAgICAg
ICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byByZW1vdmUgaXQsIGp1c3QgYnJlYWsuCi0gICAgICAg
ICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgIGlmIChvdXRlclRvbykgeyBlbmQgPSBub2RlLm5l
eHRTaWJsaW5nOyB9IGVsc2UgeyBicmVhazsgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIG5v
ZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKLQotICAgICAgICAgIC8vIGlmIHRoaXMg
aXMgdGhlIGxhc3Qgbm9kZSBhbmQgd2UgZGlkbid0IGJyZWFrIGJlZm9yZQotICAgICAgICAgIC8v
IChiZWNhdXNlIHdlIHdhbnRlZCB0byByZW1vdmUgdGhlIG91dGVyIG5vZGVzKSwgYnJlYWsKLSAg
ICAgICAgICAvLyBub3cuCi0gICAgICAgICAgaWYgKGxhc3QpIHsgYnJlYWs7IH0KLQotICAgICAg
ICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUg
Zmlyc3Qgbm9kZSBmb3IgdGhlIEhUTUwgc3RyaW5nLCBldmVuIGluIGNhc2VzIGxpa2UKLSAgICAg
ICAgLy8gdGFibGVzIGFuZCBsaXN0cyB3aGVyZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYg
d291bGQKLSAgICAgICAgLy8gc3dhbGxvdyBzb21lIG9mIHRoZSBjb250ZW50LgotICAgICAgICBu
b2RlID0gZmlyc3ROb2RlRm9yKHN0YXJ0LnBhcmVudE5vZGUsIGh0bWwpOwotCi0gICAgICAgIGlm
IChvdXRlclRvbykgewotICAgICAgICAgIHN0YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3Rh
cnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29weSB0aGUgbm9kZXMgZm9yIHRoZSBIVE1M
IGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcKLSAgICAgICAgLy8gcGxhY2Vob2xkZXIu
Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5l
eHRTaWJsaW5nOwotICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVuZCk7
Ci0gICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nOwotICAgICAgICB9Ci0gICAgICB9OwotCi0g
ICAgICAvLyByZW1vdmUgdGhlIG5vZGVzIGluIHRoZSBET00gcmVwcmVzZW50aW5nIHRoaXMgbWV0
YW1vcnBoLgotICAgICAgLy8KLSAgICAgIC8vIHRoaXMgaW5jbHVkZXMgdGhlIHN0YXJ0aW5nIGFu
ZCBlbmRpbmcgcGxhY2Vob2xkZXJzLgotICAgICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgewot
ICAgICAgICB2YXIgc3RhcnQgPSByZWFsTm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlz
LnN0YXJ0KSk7Ci0gICAgICAgIHZhciBlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlz
LmVuZCk7Ci0KLSAgICAgICAgdGhpcy5odG1sKCcnKTsKLSAgICAgICAgc3RhcnQucGFyZW50Tm9k
ZS5yZW1vdmVDaGlsZChzdGFydCk7Ci0gICAgICAgIGVuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxk
KGVuZCk7Ci0gICAgICB9OwotCi0gICAgICBhcHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihwYXJlbnRO
b2RlKSB7Ci0gICAgICAgIHZhciBub2RlID0gZmlyc3ROb2RlRm9yKHBhcmVudE5vZGUsIHRoaXMu
b3V0ZXJIVE1MKCkpOwotICAgICAgICB2YXIgbmV4dFNpYmxpbmc7Ci0KLSAgICAgICAgd2hpbGUg
KG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAg
ICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKLSAgICAgICAgICBub2RlID0gbmV4
dFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIGFmdGVyRnVuYyA9IGZ1bmN0
aW9uKGh0bWwpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSBy
ZWFsTm9kZSBmb3IgZGV0YWlscy4KLSAgICAgICAgdmFyIGVuZCA9IGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKHRoaXMuZW5kKTsKLSAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IGVuZC5uZXh0U2li
bGluZzsKLSAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBlbmQucGFyZW50Tm9kZTsKLSAgICAgICAg
dmFyIG5leHRTaWJsaW5nOwotICAgICAgICB2YXIgbm9kZTsKLQotICAgICAgICAvLyBnZXQgdGhl
IGZpcnN0IG5vZGUgZm9yIHRoZSBIVE1MIHN0cmluZywgZXZlbiBpbiBjYXNlcyBsaWtlCi0gICAg
ICAgIC8vIHRhYmxlcyBhbmQgbGlzdHMgd2hlcmUgYSBzaW1wbGUgaW5uZXJIVE1MIG9uIGEgZGl2
IHdvdWxkCi0gICAgICAgIC8vIHN3YWxsb3cgc29tZSBvZiB0aGUgY29udGVudC4KLSAgICAgICAg
bm9kZSA9IGZpcnN0Tm9kZUZvcihwYXJlbnROb2RlLCBodG1sKTsKLQotICAgICAgICAvLyBjb3B5
IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZwot
ICAgICAgICAvLyBwbGFjZWhvbGRlci4KLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAg
ICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAgcGFyZW50Tm9kZS5p
bnNlcnRCZWZvcmUobm9kZSwgaW5zZXJ0QmVmb3JlKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNp
Ymxpbmc7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIHByZXBlbmRGdW5jID0gZnVuY3Rp
b24oaHRtbCkgewotICAgICAgICB2YXIgc3RhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0
aGlzLnN0YXJ0KTsKLSAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBzdGFydC5wYXJlbnROb2RlOwot
ICAgICAgICB2YXIgbmV4dFNpYmxpbmc7Ci0gICAgICAgIHZhciBub2RlOwotCi0gICAgICAgIG5v
ZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwgaHRtbCk7Ci0gICAgICAgIHZhciBpbnNlcnRC
ZWZvcmUgPSBzdGFydC5uZXh0U2libGluZzsKLQotICAgICAgICB3aGlsZSAobm9kZSkgewotICAg
ICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5uZXh0U2libGluZzsKLSAgICAgICAgICBwYXJlbnRO
b2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNlcnRCZWZvcmUpOwotICAgICAgICAgIG5vZGUgPSBu
ZXh0U2libGluZzsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0KLSAgICBNZXRhbW9ycGgu
cHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbihodG1sKSB7Ci0gICAgICB0aGlzLmNoZWNrUmVtb3Zl
ZCgpOwotICAgICAgaWYgKGh0bWwgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdGhpcy5pbm5lckhU
TUw7IH0KLQotICAgICAgaHRtbEZ1bmMuY2FsbCh0aGlzLCBodG1sKTsKLQotICAgICAgdGhpcy5p
bm5lckhUTUwgPSBodG1sOwotICAgIH07Ci0KLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLnJlcGxh
Y2VXaXRoID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKLSAg
ICAgIGh0bWxGdW5jLmNhbGwodGhpcywgaHRtbCwgdHJ1ZSk7Ci0gICAgfTsKLQotICAgIE1ldGFt
b3JwaC5wcm90b3R5cGUucmVtb3ZlID0gcmVtb3ZlRnVuYzsKLSAgICBNZXRhbW9ycGgucHJvdG90
eXBlLm91dGVySFRNTCA9IG91dGVySFRNTEZ1bmM7Ci0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5h
cHBlbmRUbyA9IGFwcGVuZFRvRnVuYzsKLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmFmdGVyID0g
YWZ0ZXJGdW5jOwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUucHJlcGVuZCA9IHByZXBlbmRGdW5j
OwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuc3RhcnRUYWcgPSBzdGFydFRhZ0Z1bmM7Ci0gICAg
TWV0YW1vcnBoLnByb3RvdHlwZS5lbmRUYWcgPSBlbmRUYWdGdW5jOwotCi0gICAgTWV0YW1vcnBo
LnByb3RvdHlwZS5pc1JlbW92ZWQgPSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBiZWZvcmUgPSBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0YXJ0KTsKLSAgICAgIHZhciBhZnRlciA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKLQotICAgICAgcmV0dXJuICFiZWZvcmUg
fHwgIWFmdGVyOwotICAgIH07Ci0KLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmNoZWNrUmVtb3Zl
ZCA9IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMuaXNSZW1vdmVkKCkpIHsKLSAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb25zIG9uIGEgTWV0YW1vcnBo
IHRoYXQgaXMgbm90IGluIHRoZSBET00uIik7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVy
biBNZXRhbW9ycGg7Ci0gIH0pOwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycy1jb21waWxlcgotKi8KLQotLy8g
RWxpbWluYXRlIGRlcGVuZGVuY3kgb24gYW55IEVtYmVyIHRvIHNpbXBsaWZ5IHByZWNvbXBpbGF0
aW9uIHdvcmtmbG93Ci12YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlv
bihwYXJlbnQpIHsKLSAgZnVuY3Rpb24gRigpIHt9Ci0gIEYucHJvdG90eXBlID0gcGFyZW50Owot
ICByZXR1cm4gbmV3IEYoKTsKLX07Ci0KLXZhciBIYW5kbGViYXJzID0gKEVtYmVyLmltcG9ydHMg
JiYgRW1iZXIuaW1wb3J0cy5IYW5kbGViYXJzKSB8fCAodGhpcyAmJiB0aGlzLkhhbmRsZWJhcnMp
OwotaWYgKCFIYW5kbGViYXJzICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7Ci0g
IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7Ci19Ci0KLUVtYmVyLmFzc2VydCgi
RW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBIYW5kbGViYXJzIHZlcnNpb24gMS4wIG9yIDEuMS4g
SW5jbHVkZSAiICsKLSAgICAgICAgICAgICAiYSBTQ1JJUFQgdGFnIGluIHRoZSBIVE1MIEhFQUQg
bGlua2luZyB0byB0aGUgSGFuZGxlYmFycyBmaWxlICIgKwotICAgICAgICAgICAgICJiZWZvcmUg
eW91IGxpbmsgdG8gRW1iZXIuIiwgSGFuZGxlYmFycyk7Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIg
SGFuZGxlYmFycyByZXF1aXJlcyBIYW5kbGViYXJzIHZlcnNpb24gMS4wIG9yIDEuMSwgIiArCi0g
ICAgICAgICAgICAgIkNPTVBJTEVSX1JFVklTSU9OIGV4cGVjdGVkOiA0LCBnb3Q6ICIgKyAgSGFu
ZGxlYmFycy5DT01QSUxFUl9SRVZJU0lPTiArCi0gICAgICAgICAgICAgIiAtIFBsZWFzZSBub3Rl
OiBCdWlsZHMgb2YgbWFzdGVyIG1heSBoYXZlIG90aGVyIENPTVBJTEVSX1JFVklTSU9OIHZhbHVl
cy4iLAotICAgICAgICAgICAgIEhhbmRsZWJhcnMuQ09NUElMRVJfUkVWSVNJT04gPT09IDQpOwot
Ci0vKioKLSAgUHJlcGFyZXMgdGhlIEhhbmRsZWJhcnMgdGVtcGxhdGluZyBsaWJyYXJ5IGZvciB1
c2UgaW5zaWRlIEVtYmVyJ3MgdmlldwotICBzeXN0ZW0uCi0KLSAgVGhlIGBFbWJlci5IYW5kbGVi
YXJzYCBvYmplY3QgaXMgdGhlIHN0YW5kYXJkIEhhbmRsZWJhcnMgbGlicmFyeSwgZXh0ZW5kZWQg
dG8KLSAgdXNlIEVtYmVyJ3MgYGdldCgpYCBtZXRob2QgaW5zdGVhZCBvZiBkaXJlY3QgcHJvcGVy
dHkgYWNjZXNzLCB3aGljaCBhbGxvd3MKLSAgY29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSB1c2Vk
IGluc2lkZSB0ZW1wbGF0ZXMuCi0KLSAgVG8gY3JlYXRlIGFuIGBFbWJlci5IYW5kbGViYXJzYCB0
ZW1wbGF0ZSwgY2FsbCBgRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKClgLgotICBUaGlzIHdpbGwg
cmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBgRW1iZXIuVmlld2AgZm9yIHJl
bmRlcmluZy4KLQotICBAY2xhc3MgSGFuZGxlYmFycwotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwot
RW1iZXIuSGFuZGxlYmFycyA9IG9iamVjdENyZWF0ZShIYW5kbGViYXJzKTsKLQotLyoqCi0gIFJl
Z2lzdGVyIGEgYm91bmQgaGVscGVyIG9yIGN1c3RvbSB2aWV3IGhlbHBlci4KLQotICAjIyBTaW1w
bGUgYm91bmQgaGVscGVyIGV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRs
ZWJhcnMuaGVscGVyKCdjYXBpdGFsaXplJywgZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4g
dmFsdWUudG9VcHBlckNhc2UoKTsKLSAgfSk7Ci0gIGBgYAotCi0gIFRoZSBhYm92ZSBib3VuZCBo
ZWxwZXIgY2FuIGJlIHVzZWQgaW5zaWRlIG9mIHRlbXBsYXRlcyBhcyBmb2xsb3dzOgotCi0gIGBg
YGhhbmRsZWJhcnMKLSAge3tjYXBpdGFsaXplIG5hbWV9fQotICBgYGAKLQotICBJbiB0aGlzIGNh
c2UsIHdoZW4gdGhlIGBuYW1lYCBwcm9wZXJ0eSBvZiB0aGUgdGVtcGxhdGUncyBjb250ZXh0IGNo
YW5nZXMsCi0gIHRoZSByZW5kZXJlZCB2YWx1ZSBvZiB0aGUgaGVscGVyIHdpbGwgdXBkYXRlIHRv
IHJlZmxlY3QgdGhpcyBjaGFuZ2UuCi0KLSAgRm9yIG1vcmUgZXhhbXBsZXMgb2YgYm91bmQgaGVs
cGVycywgc2VlIGRvY3VtZW50YXRpb24gZm9yCi0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVy
Qm91bmRIZWxwZXJgLgotCi0gICMjIEN1c3RvbSB2aWV3IGhlbHBlciBleGFtcGxlCi0KLSAgQXNz
dW1pbmcgYSB2aWV3IHN1YmNsYXNzIG5hbWVkIGBBcHAuQ2FsZW5kYXJWaWV3YCB3ZXJlIGRlZmlu
ZWQsIGEgaGVscGVyCi0gIGZvciByZW5kZXJpbmcgaW5zdGFuY2VzIG9mIHRoaXMgdmlldyBjb3Vs
ZCBiZSByZWdpc3RlcmVkIGFzIGZvbGxvd3M6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcignY2FsZW5kYXInLCBBcHAuQ2FsZW5kYXJWaWV3KToKLSAgYGBgCi0K
LSAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVz
IGFzIGZvbGxvd3M6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e2NhbGVuZGFyfX0KLSAgYGBgCi0K
LSAgV2hpY2ggaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG86Ci0KLSAgYGBgaGFuZGxlYmFy
cwotICB7e3ZpZXcgQXBwLkNhbGVuZGFyVmlld319Ci0gIGBgYAotCi0gIE9wdGlvbnMgaW4gdGhl
IGhlbHBlciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdmlldyBpbiBleGFjdGx5IHRoZSBzYW1lCi0g
IG1hbm5lciBhcyB3aXRoIHRoZSBgdmlld2AgaGVscGVyLgotCi0gIEBtZXRob2QgaGVscGVyCi0g
IEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge1N0cmluZ30gbmFtZQotICBAcGFyYW0g
e0Z1bmN0aW9ufEVtYmVyLlZpZXd9IGZ1bmN0aW9uIG9yIHZpZXcgY2xhc3MgY29uc3RydWN0b3IK
LSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleXMqCi0qLwotRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSB0cmll
ZCB0byByZWdpc3RlciBhIGNvbXBvbmVudCBuYW1lZCAnIiArIG5hbWUgKyAiJywgYnV0IGNvbXBv
bmVudCBuYW1lcyBtdXN0IGluY2x1ZGUgYSAnLSciLCAhRW1iZXIuQ29tcG9uZW50LmRldGVjdCh2
YWx1ZSkgfHwgbmFtZS5tYXRjaCgvLS8pKTsKLQotICBpZiAoRW1iZXIuVmlldy5kZXRlY3QodmFs
dWUpKSB7Ci0gICAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcihuYW1lLCBFbWJlci5I
YW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKHZhbHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIu
SGFuZGxlYmFycy5yZWdpc3RlckJvdW5kSGVscGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Ci0g
IH0KLX07Ci0KLS8qKgotICBSZXR1cm5zIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0
aGUgcHJvdmlkZWQgVmlld0NsYXNzLgotCi0gIFVzZWQgaW50ZXJuYWxseSBieSBFbWJlci5IYW5k
bGViYXJzLmhlbHBlciBhbmQgb3RoZXIgbWV0aG9kcwotICBpbnZvbHZpbmcgaGVscGVyL2NvbXBv
bmVudCByZWdpc3RyYXRpb24uCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoZWxwZXIKLSAgQGZv
ciBFbWJlci5IYW5kbGViYXJzCi0gIEBwYXJhbSB7RnVuY3Rpb259IFZpZXdDbGFzcyB2aWV3IGNs
YXNzIGNvbnN0cnVjdG9yCi0qLwotRW1iZXIuSGFuZGxlYmFycy5tYWtlVmlld0hlbHBlciA9IGZ1
bmN0aW9uKFZpZXdDbGFzcykgewotICByZXR1cm4gZnVuY3Rpb24ob3B0aW9ucykgewotICAgIEVt
YmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IHBhc3MgYXR0cmlidXRlcyAoc3VjaCBhcyBuYW1lPXZh
bHVlKSBub3QgYmFyZSB2YWx1ZXMgdG8gYSBoZWxwZXIgZm9yIGEgVmlldyBmb3VuZCBpbiAnIiAr
IFZpZXdDbGFzcy50b1N0cmluZygpICsgIiciLCBhcmd1bWVudHMubGVuZ3RoIDwgMik7Ci0gICAg
cmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywgVmlld0NsYXNz
LCBvcHRpb25zKTsKLSAgfTsKLX07Ci0KLS8qKgotQGNsYXNzIGhlbHBlcnMKLUBuYW1lc3BhY2Ug
RW1iZXIuSGFuZGxlYmFycwotKi8KLUVtYmVyLkhhbmRsZWJhcnMuaGVscGVycyA9IG9iamVjdENy
ZWF0ZShIYW5kbGViYXJzLmhlbHBlcnMpOwotCi0vKioKLSAgT3ZlcnJpZGUgdGhlIHRoZSBvcGNv
ZGUgY29tcGlsZXIgYW5kIEphdmFTY3JpcHQgY29tcGlsZXIgZm9yIEhhbmRsZWJhcnMuCi0KLSAg
QGNsYXNzIENvbXBpbGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwotICBAcHJpdmF0
ZQotICBAY29uc3RydWN0b3IKLSovCi1FbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyID0gZnVuY3Rp
b24oKSB7fTsKLQotLy8gSGFuZGxlYmFycy5Db21waWxlciBkb2Vzbid0IGV4aXN0IGluIHJ1bnRp
bWUtb25seQotaWYgKEhhbmRsZWJhcnMuQ29tcGlsZXIpIHsKLSAgRW1iZXIuSGFuZGxlYmFycy5D
b21waWxlci5wcm90b3R5cGUgPSBvYmplY3RDcmVhdGUoSGFuZGxlYmFycy5Db21waWxlci5wcm90
b3R5cGUpOwotfQotCi1FbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxl
ciA9IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXI7Ci0KLS8qKgotICBAY2xhc3MgSmF2YVNjcmlw
dENvbXBpbGVyCi0gIEBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBA
Y29uc3RydWN0b3IKLSovCi1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1
bmN0aW9uKCkge307Ci0KLS8vIEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyIGRvZXNuJ3Qg
ZXhpc3QgaW4gcnVudGltZS1vbmx5Ci1pZiAoSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIp
IHsKLSAgRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gb2Jq
ZWN0Q3JlYXRlKEhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSk7Ci0gIEVt
YmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlciA9IEVt
YmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyOwotfQotCi0KLUVtYmVyLkhhbmRsZWJh
cnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5uYW1lc3BhY2UgPSAiRW1iZXIuSGFuZGxl
YmFycyI7Ci0KLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5p
bml0aWFsaXplQnVmZmVyID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiAiJyciOwotfTsKLQotLyoq
Ci0gIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1ZmZlciBmb3IgRW1iZXIgSGFuZGxlYmFycy4gQnkg
ZGVmYXVsdCwgSGFuZGxlYmFycwotICBjcmVhdGVzIGFuIGVtcHR5IFN0cmluZyBhdCB0aGUgYmVn
aW5uaW5nIG9mIGVhY2ggaW52b2NhdGlvbiBhbmQgYXBwZW5kcyB0bwotICBpdC4gRW1iZXIncyBI
YW5kbGViYXJzIG92ZXJyaWRlcyB0aGlzIHRvIGFwcGVuZCB0byBhIHNpbmdsZSBzaGFyZWQgYnVm
ZmVyLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgYXBwZW5kVG9CdWZmZXIKLSAgQHBhcmFtIHN0
cmluZyB7U3RyaW5nfQotKi8KLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnBy
b3RvdHlwZS5hcHBlbmRUb0J1ZmZlciA9IGZ1bmN0aW9uKHN0cmluZykgewotICByZXR1cm4gImRh
dGEuYnVmZmVyLnB1c2goIitzdHJpbmcrIik7IjsKLX07Ci0KLS8vIEhhY2tzIGFoZWFkOgotLy8g
SGFuZGxlYmFycyBwcmVzZW50bHkgaGFzIGEgYnVnIHdoZXJlIHRoZSBgYmxvY2tIZWxwZXJNaXNz
aW5nYCBob29rCi0vLyBkb2Vzbid0IGdldCBwYXNzZWQgdGhlIG5hbWUgb2YgdGhlIG1pc3Npbmcg
aGVscGVyIG5hbWUsIGJ1dCByYXRoZXIKLS8vIGdldHMgcGFzc2VkIHRoZSB2YWx1ZSBvZiB0aGF0
IG1pc3NpbmcgaGVscGVyIGV2YWx1YXRlZCBvbiB0aGUgY3VycmVudAotLy8gY29udGV4dCwgd2hp
Y2ggaXMgbW9zdCBsaWtlbHkgYHVuZGVmaW5lZGAgYW5kIHRvdGFsbHkgdXNlbGVzcy4KLS8vCi0v
LyBTbyB3ZSBhbHRlciB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24gdG8gcGFzcyB0aGUg
bmFtZSBvZiB0aGUgaGVscGVyCi0vLyBpbnN0ZWFkLCBhcyBleHBlY3RlZC4KLS8vCi0vLyBUaGlz
IGNhbiBnbyBhd2F5IG9uY2UgdGhlIGZvbGxvd2luZyBpcyBjbG9zZWQ6Ci0vLyBodHRwczovL2dp
dGh1Yi5jb20vd3ljYXRzL2hhbmRsZWJhcnMuanMvaXNzdWVzLzYzNAotCi12YXIgRE9UX0xPT0tV
UF9SRUdFWCA9IC9oZWxwZXJzXC4oLio/KVwpLywKLSAgICBCUkFDS0VUX1NUUklOR19MT09LVVBf
UkVHRVggPSAvaGVscGVyc1xbJyguKj8pJy8sCi0gICAgSU5WT0NBVElPTl9TUExJVFRJTkdfUkVH
RVggPSAvKC4qYmxvY2tIZWxwZXJNaXNzaW5nXC5jYWxsXCguKikoc3RhY2tbMC05XSspKCwuKikv
OwotCi1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5zdHJpbmdpZnlMYXN0Qmxv
Y2tIZWxwZXJNaXNzaW5nSW52b2NhdGlvbiA9IGZ1bmN0aW9uKHNvdXJjZSkgewotICB2YXIgaGVs
cGVySW52b2NhdGlvbiA9IHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0sCi0gICAgICBoZWxwZXJO
YW1lID0gKERPVF9MT09LVVBfUkVHRVguZXhlYyhoZWxwZXJJbnZvY2F0aW9uKSB8fCBCUkFDS0VU
X1NUUklOR19MT09LVVBfUkVHRVguZXhlYyhoZWxwZXJJbnZvY2F0aW9uKSlbMV0sCi0gICAgICBt
YXRjaGVzID0gSU5WT0NBVElPTl9TUExJVFRJTkdfUkVHRVguZXhlYyhoZWxwZXJJbnZvY2F0aW9u
KTsKLQotICBzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdID0gbWF0Y2hlc1sxXSArICInIiArIGhl
bHBlck5hbWUgKyAiJyIgKyBtYXRjaGVzWzNdOwotfQotdmFyIHN0cmluZ2lmeUJsb2NrSGVscGVy
TWlzc2luZyA9IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnN0cmluZ2lmeUxh
c3RCbG9ja0hlbHBlck1pc3NpbmdJbnZvY2F0aW9uOwotCi12YXIgb3JpZ2luYWxCbG9ja1ZhbHVl
ID0gRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlLmJsb2NrVmFs
dWU7Ci1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuYmxvY2tW
YWx1ZSA9IGZ1bmN0aW9uKCkgewotICBvcmlnaW5hbEJsb2NrVmFsdWUuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKLSAgc3RyaW5naWZ5QmxvY2tIZWxwZXJNaXNzaW5nKHRoaXMuc291cmNlKTsKLX07
Ci0KLXZhciBvcmlnaW5hbEFtYmlndW91c0Jsb2NrVmFsdWUgPSBFbWJlci5IYW5kbGViYXJzLkph
dmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuYW1iaWd1b3VzQmxvY2tWYWx1ZTsKLUVtYmVyLkhh
bmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5hbWJpZ3VvdXNCbG9ja1ZhbHVl
ID0gZnVuY3Rpb24oKSB7Ci0gIG9yaWdpbmFsQW1iaWd1b3VzQmxvY2tWYWx1ZS5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOwotICBzdHJpbmdpZnlCbG9ja0hlbHBlck1pc3NpbmcodGhpcy5zb3VyY2Up
OwotfTsKLQotdmFyIHByZWZpeCA9ICJlbWJlciIgKyAoK25ldyBEYXRlKCkpLCBpbmNyID0gMTsK
LQotLyoqCi0gIFJld3JpdGUgc2ltcGxlIG11c3RhY2hlcyBmcm9tIGB7e2Zvb319YCB0byBge3ti
aW5kICJmb28ifX1gLiBUaGlzIG1lYW5zIHRoYXQKLSAgYWxsIHNpbXBsZSBtdXN0YWNoZXMgaW4g
RW1iZXIncyBIYW5kbGViYXJzIHdpbGwgYWxzbyBzZXQgdXAgYW4gb2JzZXJ2ZXIgdG8KLSAga2Vl
cCB0aGUgRE9NIHVwIHRvIGRhdGUgd2hlbiB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBjaGFuZ2Vz
LgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgbXVzdGFjaGUKLSAgQGZvciBFbWJlci5IYW5kbGVi
YXJzLkNvbXBpbGVyCi0gIEBwYXJhbSBtdXN0YWNoZQotKi8KLUVtYmVyLkhhbmRsZWJhcnMuQ29t
cGlsZXIucHJvdG90eXBlLm11c3RhY2hlID0gZnVuY3Rpb24obXVzdGFjaGUpIHsKLSAgaWYgKG11
c3RhY2hlLmlzSGVscGVyICYmIG11c3RhY2hlLmlkLnN0cmluZyA9PT0gJ2NvbnRyb2wnKSB7Ci0g
ICAgbXVzdGFjaGUuaGFzaCA9IG11c3RhY2hlLmhhc2ggfHwgbmV3IEhhbmRsZWJhcnMuQVNULkhh
c2hOb2RlKFtdKTsKLSAgICBtdXN0YWNoZS5oYXNoLnBhaXJzLnB1c2goWyJjb250cm9sSUQiLCBu
ZXcgSGFuZGxlYmFycy5BU1QuU3RyaW5nTm9kZShwcmVmaXggKyBpbmNyKyspXSk7Ci0gIH0gZWxz
ZSBpZiAobXVzdGFjaGUucGFyYW1zLmxlbmd0aCB8fCBtdXN0YWNoZS5oYXNoKSB7Ci0gICAgLy8g
bm8gY2hhbmdlcyByZXF1aXJlZAotICB9IGVsc2UgewotICAgIHZhciBpZCA9IG5ldyBIYW5kbGVi
YXJzLkFTVC5JZE5vZGUoW3sgcGFydDogJ190cmlhZ2VNdXN0YWNoZScgfV0pOwotCi0gICAgLy8g
VXBkYXRlIHRoZSBtdXN0YWNoZSBub2RlIHRvIGluY2x1ZGUgYSBoYXNoIHZhbHVlIGluZGljYXRp
bmcgd2hldGhlciB0aGUgb3JpZ2luYWwgbm9kZQotICAgIC8vIHdhcyBlc2NhcGVkLiBUaGlzIHdp
bGwgYWxsb3cgdXMgdG8gcHJvcGVybHkgZXNjYXBlIHZhbHVlcyB3aGVuIHRoZSB1bmRlcmx5aW5n
IHZhbHVlCi0gICAgLy8gY2hhbmdlcyBhbmQgd2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIHZhbHVl
LgotICAgIGlmICghbXVzdGFjaGUuZXNjYXBlZCkgewotICAgICAgbXVzdGFjaGUuaGFzaCA9IG11
c3RhY2hlLmhhc2ggfHwgbmV3IEhhbmRsZWJhcnMuQVNULkhhc2hOb2RlKFtdKTsKLSAgICAgIG11
c3RhY2hlLmhhc2gucGFpcnMucHVzaChbInVuZXNjYXBlZCIsIG5ldyBIYW5kbGViYXJzLkFTVC5T
dHJpbmdOb2RlKCJ0cnVlIildKTsKLSAgICB9Ci0gICAgbXVzdGFjaGUgPSBuZXcgSGFuZGxlYmFy
cy5BU1QuTXVzdGFjaGVOb2RlKFtpZF0uY29uY2F0KFttdXN0YWNoZS5pZF0pLCBtdXN0YWNoZS5o
YXNoLCAhbXVzdGFjaGUuZXNjYXBlZCk7Ci0gIH0KLQotICByZXR1cm4gSGFuZGxlYmFycy5Db21w
aWxlci5wcm90b3R5cGUubXVzdGFjaGUuY2FsbCh0aGlzLCBtdXN0YWNoZSk7Ci19OwotCi0vKioK
LSAgVXNlZCBmb3IgcHJlY29tcGlsYXRpb24gb2YgRW1iZXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMu
IFRoaXMgd2lsbCBub3QgYmUgdXNlZAotICBkdXJpbmcgbm9ybWFsIGFwcCBleGVjdXRpb24uCi0K
LSAgQG1ldGhvZCBwcmVjb21waWxlCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAc3RhdGlj
Ci0gIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBsYXRlIHRvIHByZWNvbXBpbGUKLSov
Ci1FbWJlci5IYW5kbGViYXJzLnByZWNvbXBpbGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKLSAgdmFy
IGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKLQotICB2YXIgb3B0aW9ucyA9IHsKLSAg
ICBrbm93bkhlbHBlcnM6IHsKLSAgICAgIGFjdGlvbjogdHJ1ZSwKLSAgICAgIHVuYm91bmQ6IHRy
dWUsCi0gICAgICAnYmluZC1hdHRyJzogdHJ1ZSwKLSAgICAgIHRlbXBsYXRlOiB0cnVlLAotICAg
ICAgdmlldzogdHJ1ZSwKLSAgICAgIF90cmlhZ2VNdXN0YWNoZTogdHJ1ZQotICAgIH0sCi0gICAg
ZGF0YTogdHJ1ZSwKLSAgICBzdHJpbmdQYXJhbXM6IHRydWUKLSAgfTsKLQotICB2YXIgZW52aXJv
bm1lbnQgPSBuZXcgRW1iZXIuSGFuZGxlYmFycy5Db21waWxlcigpLmNvbXBpbGUoYXN0LCBvcHRp
b25zKTsKLSAgcmV0dXJuIG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigp
LmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7Ci19OwotCi0v
LyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgZm9yIEhhbmRsZWJhcnMgcnVudGltZS1vbmx5Ci1pZiAo
SGFuZGxlYmFycy5jb21waWxlKSB7Ci0gIC8qKgotICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgRW1i
ZXIgSGFuZGxlYmFycy4gVGhpcyByZXBsYWNlcyB0aGUgZGVmYXVsdAotICAgIGBIYW5kbGViYXJz
LmNvbXBpbGVgIGFuZCB0dXJucyBvbiB0ZW1wbGF0ZS1sb2NhbCBkYXRhIGFuZCBTdHJpbmcKLSAg
ICBwYXJhbWV0ZXJzLgotCi0gICAgQG1ldGhvZCBjb21waWxlCi0gICAgQGZvciBFbWJlci5IYW5k
bGViYXJzCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBs
YXRlIHRvIGNvbXBpbGUKLSAgICBAcmV0dXJuIHtGdW5jdGlvbn0KLSAgKi8KLSAgRW1iZXIuSGFu
ZGxlYmFycy5jb21waWxlID0gZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgdmFyIGFzdCA9IEhhbmRs
ZWJhcnMucGFyc2Uoc3RyaW5nKTsKLSAgICB2YXIgb3B0aW9ucyA9IHsgZGF0YTogdHJ1ZSwgc3Ry
aW5nUGFyYW1zOiB0cnVlIH07Ci0gICAgdmFyIGVudmlyb25tZW50ID0gbmV3IEVtYmVyLkhhbmRs
ZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7Ci0gICAgdmFyIHRlbXBsYXRl
U3BlYyA9IG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUo
ZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7Ci0KLSAgICB2YXIgdGVtcGxh
dGUgPSBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKHRlbXBsYXRlU3BlYyk7Ci0gICAgdGVtcGxh
dGUuaXNNZXRob2QgPSBmYWxzZTsgLy9NYWtlIHN1cmUgd2UgZG9uJ3Qgd3JhcCB0ZW1wbGF0ZXMg
d2l0aCAuX3N1cGVyCi0KLSAgICByZXR1cm4gdGVtcGxhdGU7Ci0gIH07Ci19Ci0KLQotfSkoKTsK
LQotKGZ1bmN0aW9uKCkgewotdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAotICAg
IG9yaWdpbmFsVGVtcGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlOwotCi0vKioKLSAg
SWYgYSBwYXRoIHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQga2V5d29yZCwgcmV0dXJucyB0aGUgcm9v
dAotICB0aGF0IHNob3VsZCBiZSB1c2VkLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qgbm9ybWFs
aXplUGF0aAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSByb290IHtPYmplY3R9Ci0gIEBwYXJhbSBw
YXRoIHtTdHJpbmd9Ci0gIEBwYXJhbSBkYXRhIHtIYXNofQotKi8KLXZhciBub3JtYWxpemVQYXRo
ID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwg
ZGF0YSkgewotICB2YXIga2V5d29yZHMgPSAoZGF0YSAmJiBkYXRhLmtleXdvcmRzKSB8fCB7fSwK
LSAgICAgIGtleXdvcmQsIGlzS2V5d29yZDsKLQotICAvLyBHZXQgdGhlIGZpcnN0IHNlZ21lbnQg
b2YgdGhlIHBhdGguIEZvciBleGFtcGxlLCBpZiB0aGUKLSAgLy8gcGF0aCBpcyAiZm9vLmJhci5i
YXoiLCByZXR1cm5zICJmb28iLgotICBrZXl3b3JkID0gcGF0aC5zcGxpdCgnLicsIDEpWzBdOwot
Ci0gIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBmaXJzdCBwYXRoIGlzIGEga2V5d29yZCB0aGF0IGhh
cyBiZWVuCi0gIC8vIHBhc3NlZCBhbG9uZyBpbiB0aGUgdmlldydzIGRhdGEgaGFzaC4gSWYgc28s
IHdlIHdpbGwgdHJlYXQKLSAgLy8gdGhhdCBvYmplY3QgYXMgdGhlIG5ldyByb290LgotICBpZiAo
a2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHsKLSAgICAvLyBMb29rIHVwIHRoZSB2
YWx1ZSBpbiB0aGUgdGVtcGxhdGUncyBkYXRhIGhhc2guCi0gICAgcm9vdCA9IGtleXdvcmRzW2tl
eXdvcmRdOwotICAgIGlzS2V5d29yZCA9IHRydWU7Ci0KLSAgICAvLyBIYW5kbGUgY2FzZXMgd2hl
cmUgdGhlIGVudGlyZSBwYXRoIGlzIHRoZSByZXNlcnZlZAotICAgIC8vIHdvcmQuIEluIHRoYXQg
Y2FzZSwgcmV0dXJuIHRoZSBvYmplY3QgaXRzZWxmLgotICAgIGlmIChwYXRoID09PSBrZXl3b3Jk
KSB7Ci0gICAgICBwYXRoID0gJyc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFN0cmlwIHRoZSBr
ZXl3b3JkIGZyb20gdGhlIHBhdGggYW5kIGxvb2sgdXAKLSAgICAgIC8vIHRoZSByZW1haW5kZXIg
ZnJvbSB0aGUgbmV3bHkgZm91bmQgcm9vdC4KLSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihrZXl3
b3JkLmxlbmd0aCsxKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4geyByb290OiByb290LCBwYXRo
OiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29yZCB9OwotfTsKLQotCi0vKioKLSAgTG9va3VwIGJv
dGggb24gcm9vdCBhbmQgb24gd2luZG93LiBJZiB0aGUgcGF0aCBzdGFydHMgd2l0aAotICBhIGtl
eXdvcmQsIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUK
LSAgdGVtcGxhdGUncyBkYXRhIGhhc2ggYW5kIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcGF0aC4KLQot
ICBAbWV0aG9kIGdldAotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKLSAgQHBhcmFtIHtPYmplY3R9
IHJvb3QgVGhlIG9iamVjdCB0byBsb29rIHVwIHRoZSBwcm9wZXJ0eSBvbgotICBAcGFyYW0ge1N0
cmluZ30gcGF0aCBUaGUgcGF0aCB0byBiZSBsb29rZWR1cAotICBAcGFyYW0ge09iamVjdH0gb3B0
aW9ucyBUaGUgdGVtcGxhdGUncyBvcHRpb24gaGFzaAotKi8KLXZhciBoYW5kbGViYXJzR2V0ID0g
RW1iZXIuSGFuZGxlYmFycy5nZXQgPSBmdW5jdGlvbihyb290LCBwYXRoLCBvcHRpb25zKSB7Ci0g
IHZhciBkYXRhID0gb3B0aW9ucyAmJiBvcHRpb25zLmRhdGEsCi0gICAgICBub3JtYWxpemVkUGF0
aCA9IG5vcm1hbGl6ZVBhdGgocm9vdCwgcGF0aCwgZGF0YSksCi0gICAgICB2YWx1ZTsKLQotICAK
LSAgICByb290ID0gbm9ybWFsaXplZFBhdGgucm9vdDsKLSAgICBwYXRoID0gbm9ybWFsaXplZFBh
dGgucGF0aDsKLQotICAgIHZhbHVlID0gRW1iZXIuZ2V0KHJvb3QsIHBhdGgpOwotCi0gICAgaWYg
KHZhbHVlID09PSB1bmRlZmluZWQgJiYgcm9vdCAhPT0gRW1iZXIubG9va3VwICYmIEVtYmVyLmlz
R2xvYmFsUGF0aChwYXRoKSkgewotICAgICAgdmFsdWUgPSBFbWJlci5nZXQoRW1iZXIubG9va3Vw
LCBwYXRoKTsKLSAgICB9Ci0gIAotCi0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLUVtYmVyLkhhbmRs
ZWJhcnMucmVzb2x2ZVBhcmFtcyA9IGZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucykg
ewotICB2YXIgcmVzb2x2ZWRQYXJhbXMgPSBbXSwgdHlwZXMgPSBvcHRpb25zLnR5cGVzLCBwYXJh
bSwgdHlwZTsKLQotICBmb3IgKHZhciBpPTAsIGw9cGFyYW1zLmxlbmd0aDsgaTxsOyBpKyspIHsK
LSAgICBwYXJhbSA9IHBhcmFtc1tpXTsKLSAgICB0eXBlID0gdHlwZXNbaV07Ci0KLSAgICBpZiAo
dHlwZSA9PT0gJ0lEJykgewotICAgICAgcmVzb2x2ZWRQYXJhbXMucHVzaChoYW5kbGViYXJzR2V0
KGNvbnRleHQsIHBhcmFtLCBvcHRpb25zKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc29sdmVk
UGFyYW1zLnB1c2gocGFyYW0pOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXNvbHZlZFBhcmFt
czsKLX07Ci0KLUVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhhc2ggPSBmdW5jdGlvbihjb250ZXh0
LCBoYXNoLCBvcHRpb25zKSB7Ci0gIHZhciByZXNvbHZlZEhhc2ggPSB7fSwgdHlwZXMgPSBvcHRp
b25zLmhhc2hUeXBlcywgdHlwZTsKLQotICBmb3IgKHZhciBrZXkgaW4gaGFzaCkgewotICAgIGlm
ICghaGFzaC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICB0eXBlID0g
dHlwZXNba2V5XTsKLQotICAgIGlmICh0eXBlID09PSAnSUQnKSB7Ci0gICAgICByZXNvbHZlZEhh
c2hba2V5XSA9IGhhbmRsZWJhcnNHZXQoY29udGV4dCwgaGFzaFtrZXldLCBvcHRpb25zKTsKLSAg
ICB9IGVsc2UgewotICAgICAgcmVzb2x2ZWRIYXNoW2tleV0gPSBoYXNoW2tleV07Ci0gICAgfQot
ICB9Ci0KLSAgcmV0dXJuIHJlc29sdmVkSGFzaDsKLX07Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBo
ZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdpbGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdp
dGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQg
b2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgKLSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0K
LSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVz
c2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJhY2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBo
YXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3Ig
RW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJh
bSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hl
bHBlck1pc3NpbmcnLCBmdW5jdGlvbihwYXRoKSB7Ci0gIHZhciBlcnJvciwgdmlldyA9ICIiOwot
Ci0gIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKLQotICB2
YXIgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKG9wdGlvbnMuZGF0YS52
aWV3LmNvbnRhaW5lciwgcGF0aCk7Ci0KLSAgaWYgKGhlbHBlcikgewotICAgIHJldHVybiBoZWxw
ZXIuYXBwbHkodGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKLSAgfQotCi0gIGVycm9y
ID0gIiVAIEhhbmRsZWJhcnMgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHByb3BlcnR5ICclQCcgb24g
b2JqZWN0ICVALiI7Ci0gIGlmIChvcHRpb25zLmRhdGEpIHsKLSAgICB2aWV3ID0gb3B0aW9ucy5k
YXRhLnZpZXc7Ci0gIH0KLSAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKEVtYmVyLlN0cmluZy5mbXQo
ZXJyb3IsIFt2aWV3LCBwYXRoLCB0aGlzXSkpOwotfSk7Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBo
ZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdpbGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdp
dGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQg
b2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgKLSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0K
LSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVz
c2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJhY2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBo
YXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3Ig
RW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJh
bSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2Js
b2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKHBhdGgpIHsKLQotICB2YXIgb3B0aW9ucyA9IGFy
Z3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07Ci0KLSAgRW1iZXIuYXNzZXJ0KCJgYmxvY2tI
ZWxwZXJNaXNzaW5nYCB3YXMgaW52b2tlZCB3aXRob3V0IGEgaGVscGVyIG5hbWUsIHdoaWNoICIg
KwotICAgICAgICAgICAgICAgImlzIG1vc3QgbGlrZWx5IGR1ZSB0byBhIG1pc21hdGNoIGJldHdl
ZW4gdGhlIHZlcnNpb24gb2YgIiArCi0gICAgICAgICAgICAgICAiRW1iZXIuanMgeW91J3JlIHJ1
bm5pbmcgbm93IGFuZCB0aGUgb25lIHVzZWQgdG8gcHJlY29tcGlsZSB5b3VyICIgKwotICAgICAg
ICAgICAgICAgInRlbXBsYXRlcy4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBvZiAiICsK
LSAgICAgICAgICAgICAgICJgZW1iZXItaGFuZGxlYmFycy1jb21waWxlcmAgeW91J3JlIHVzaW5n
IGlzIHVwIHRvIGRhdGUuIiwgcGF0aCk7Ci0KLSAgdmFyIGhlbHBlciA9IEVtYmVyLkhhbmRsZWJh
cnMucmVzb2x2ZUhlbHBlcihvcHRpb25zLmRhdGEudmlldy5jb250YWluZXIsIHBhdGgpOwotCi0g
IGlmIChoZWxwZXIpIHsKLSAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVy
cy5oZWxwZXJNaXNzaW5nLmNhbGwodGhpcywgcGF0aCk7Ci0gIH0KLQotICByZXR1cm4gSGFuZGxl
YmFycy5oZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwot
fSk7Ci0KLS8qKgotICBSZWdpc3RlciBhIGJvdW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBo
ZWxwZXJzIGJlaGF2ZSBzaW1pbGFybHkgdG8gcmVndWxhcgotICBoYW5kbGViYXJzIGhlbHBlcnMs
IHdpdGggdGhlIGFkZGVkIGFiaWxpdHkgdG8gcmUtcmVuZGVyIHdoZW4gdGhlIHVuZGVybHlpbmcg
ZGF0YQotICBjaGFuZ2VzLgotCi0gICMjIFNpbXBsZSBleGFtcGxlCi0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemUnLCBm
dW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotICB9KTsK
LSAgYGBgCi0KLSAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2Yg
dGVtcGxhdGVzIGFzIGZvbGxvd3M6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e2NhcGl0YWxpemUg
bmFtZX19Ci0gIGBgYAotCi0gIEluIHRoaXMgY2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5
IG9mIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQgY2hhbmdlcywKLSAgdGhlIHJlbmRlcmVkIHZhbHVl
IG9mIHRoZSBoZWxwZXIgd2lsbCB1cGRhdGUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KLQotICAj
IyBFeGFtcGxlIHdpdGggb3B0aW9ucwotCi0gIExpa2Ugbm9ybWFsIGhhbmRsZWJhcnMgaGVscGVy
cywgYm91bmQgaGVscGVycyBoYXZlIGFjY2VzcyB0byB0aGUgb3B0aW9ucwotICBwYXNzZWQgaW50
byB0aGUgaGVscGVyIGNhbGwuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJz
LnJlZ2lzdGVyQm91bmRIZWxwZXIoJ3JlcGVhdCcsIGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7
Ci0gICAgdmFyIGNvdW50ID0gb3B0aW9ucy5oYXNoLmNvdW50OwotICAgIHZhciBhID0gW107Ci0g
ICAgd2hpbGUoYS5sZW5ndGggPCBjb3VudCkgewotICAgICAgICBhLnB1c2godmFsdWUpOwotICAg
IH0KLSAgICByZXR1cm4gYS5qb2luKCcnKTsKLSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgaGVscGVy
IGNvdWxkIGJlIHVzZWQgaW4gYSB0ZW1wbGF0ZSBhcyBmb2xsb3dzOgotCi0gIGBgYGhhbmRsZWJh
cnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudD0zfX0KLSAgYGBgCi0KLSAgIyMgRXhhbXBsZSB3aXRo
IGJvdW5kIG9wdGlvbnMKLQotICBCb3VuZCBoYXNoIG9wdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVk
LiBFeGFtcGxlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudEJpbmRp
bmc9Im51bVJlcGVhdHMifX0KLSAgYGBgCi0KLSAgSW4gdGhpcyBleGFtcGxlLCBjb3VudCB3aWxs
IGJlIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZgotICB0aGUgYG51bVJlcGVhdHNgIHByb3BlcnR5IG9u
IHRoZSBjb250ZXh0LiBJZiB0aGF0IHByb3BlcnR5Ci0gIGNoYW5nZXMsIHRoZSBoZWxwZXIgd2ls
bCBiZSByZS1yZW5kZXJlZC4KLQotICAjIyBFeGFtcGxlIHdpdGggZXh0cmEgZGVwZW5kZW5jaWVz
Ci0KLSAgVGhlIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIG1ldGhvZCB0
YWtlcyBhIHZhcmlhYmxlIGxlbmd0aAotICB0aGlyZCBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVz
IGV4dHJhIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFzc2VkIGluIHZhbHVlLgotICBUaGlzIGFsbG93
cyB0aGUgaGFuZGxlYmFycyBoZWxwZXIgdG8gdXBkYXRlIHdoZW4gdGhlc2UgZGVwZW5kZW5jaWVz
IGNoYW5nZS4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJC
b3VuZEhlbHBlcignY2FwaXRhbGl6ZU5hbWUnLCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVy
biB2YWx1ZS5nZXQoJ25hbWUnKS50b1VwcGVyQ2FzZSgpOwotICB9LCAnbmFtZScpOwotICBgYGAK
LQotICAjIyBFeGFtcGxlIHdpdGggbXVsdGlwbGUgYm91bmQgcHJvcGVydGllcwotCi0gIGBFbWJl
ci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIHN1cHBvcnRzIGJpbmRpbmcgdG8KLSAg
bXVsdGlwbGUgcHJvcGVydGllcywgZS5nLjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhh
bmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlcignY29uY2F0ZW5hdGUnLCBmdW5jdGlvbigpIHsK
LSAgICB2YXIgdmFsdWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAw
LCAtMSk7Ci0gICAgcmV0dXJuIHZhbHVlcy5qb2luKCd8fCcpOwotICB9KTsKLSAgYGBgCi0KLSAg
V2hpY2ggYWxsb3dzIGZvciB0ZW1wbGF0ZSBzeW50YXggc3VjaCBhcyBge3tjb25jYXRlbmF0ZSBw
cm9wMSBwcm9wMn19YCBvcgotICBge3tjb25jYXRlbmF0ZSBwcm9wMSBwcm9wMiBwcm9wM319YC4g
SWYgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZSwKLSAgdGhlIGhlbHByIHdpbGwgcmUtcmVu
ZGVyLiAgTm90ZSB0aGF0IGRlcGVuZGVuY3kga2V5cyBjYW5ub3QgYmUKLSAgdXNpbmcgaW4gY29u
anVuY3Rpb24gd2l0aCBtdWx0aS1wcm9wZXJ0eSBoZWxwZXJzLCBzaW5jZSBpdCBpcyBhbWJpZ3Vv
dXMKLSAgd2hpY2ggcHJvcGVydHkgdGhlIGRlcGVuZGVudCBrZXlzIHdvdWxkIGJlbG9uZyB0by4K
LQotICAjIyBVc2Ugd2l0aCB1bmJvdW5kIGhlbHBlcgotCi0gIFRoZSBge3t1bmJvdW5kfX1gIGhl
bHBlciBjYW4gYmUgdXNlZCB3aXRoIGJvdW5kIGhlbHBlciBpbnZvY2F0aW9ucwotICB0byByZW5k
ZXIgdGhlbSBpbiB0aGVpciB1bmJvdW5kIGZvcm0sIGUuZy4KLQotICBgYGBoYW5kbGViYXJzCi0g
IHt7dW5ib3VuZCBjYXBpdGFsaXplIG5hbWV9fQotICBgYGAKLQotICBJbiB0aGlzIGV4YW1wbGUs
IGlmIHRoZSBuYW1lIHByb3BlcnR5IGNoYW5nZXMsIHRoZSBoZWxwZXIKLSAgd2lsbCBub3QgcmUt
cmVuZGVyLgotCi0gICMjIFVzZSB3aXRoIGJsb2NrcyBub3Qgc3VwcG9ydGVkCi0KLSAgQm91bmQg
aGVscGVycyBkbyBub3Qgc3VwcG9ydCB1c2Ugd2l0aCBIYW5kbGViYXJzIGJsb2NrcyBvcgotICB0
aGUgYWRkaXRpb24gb2YgY2hpbGQgdmlld3Mgb2YgYW55IGtpbmQuCi0KLSAgQG1ldGhvZCByZWdp
c3RlckJvdW5kSGVscGVyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge1N0cmlu
Z30gbmFtZQotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdGlvbgotICBAcGFyYW0ge1N0cmluZ30g
ZGVwZW5kZW50S2V5cyoKLSovCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIg
PSBmdW5jdGlvbihuYW1lLCBmbikgewotICB2YXIgYm91bmRIZWxwZXJBcmdzID0gc2xpY2UuY2Fs
bChhcmd1bWVudHMsIDEpLAotICAgICAgYm91bmRGbiA9IEVtYmVyLkhhbmRsZWJhcnMubWFrZUJv
dW5kSGVscGVyLmFwcGx5KHRoaXMsIGJvdW5kSGVscGVyQXJncyk7Ci0gIEVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJIZWxwZXIobmFtZSwgYm91bmRGbik7Ci19OwotCi0vKioKLSAgQSAobW9zdGx5
KSBwcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBgcmVnaXN0ZXJCb3VuZEhlbHBlcmAuIFRha2Vz
IHRoZQotICBwcm92aWRlZCBIYW5kbGViYXJzIGhlbHBlciBmdW5jdGlvbiBmbiBhbmQgcmV0dXJu
cyBpdCBpbiB3cmFwcGVkCi0gIGJvdW5kIGhlbHBlciBmb3JtLgotCi0gIFRoZSBtYWluIHVzZSBj
YXNlIGZvciB1c2luZyB0aGlzIG91dHNpZGUgb2YgYHJlZ2lzdGVyQm91bmRIZWxwZXJgCi0gIGlz
IGZvciByZWdpc3RlcmluZyBoZWxwZXJzIG9uIHRoZSBjb250YWluZXI6Ci0KLSAgYGBganMKLSAg
dmFyIGJvdW5kSGVscGVyRm4gPSBFbWJlci5IYW5kbGViYXJzLm1ha2VCb3VuZEhlbHBlcihmdW5j
dGlvbih3b3JkKSB7Ci0gICAgcmV0dXJuIHdvcmQudG9VcHBlckNhc2UoKTsKLSAgfSk7Ci0KLSAg
Y29udGFpbmVyLnJlZ2lzdGVyKCdoZWxwZXI6bXktYm91bmQtaGVscGVyJywgYm91bmRIZWxwZXJG
bik7Ci0gIGBgYAotCi0gIEluIHRoZSBhYm92ZSBleGFtcGxlLCBpZiB0aGUgaGVscGVyIGZ1bmN0
aW9uIGhhZG4ndCBiZWVuIHdyYXBwZWQgaW4KLSAgYG1ha2VCb3VuZEhlbHBlcmAsIHRoZSByZWdp
c3RlcmVkIGhlbHBlciB3b3VsZCBiZSB1bmJvdW5kLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qg
bWFrZUJvdW5kSGVscGVyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge0Z1bmN0
aW9ufSBmdW5jdGlvbgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5cyoKLSovCi1FbWJl
ci5IYW5kbGViYXJzLm1ha2VCb3VuZEhlbHBlciA9IGZ1bmN0aW9uKGZuKSB7Ci0gIHZhciBkZXBl
bmRlbnRLZXlzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0gIGZ1bmN0aW9uIGhlbHBl
cigpIHsKLSAgICB2YXIgcHJvcGVydGllcyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSks
Ci0gICAgICBudW1Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5sZW5ndGgsCi0gICAgICBvcHRpb25z
ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSwKLSAgICAgIG5vcm1hbGl6ZWRQcm9w
ZXJ0aWVzID0gW10sCi0gICAgICBkYXRhID0gb3B0aW9ucy5kYXRhLAotICAgICAgdHlwZXMgPSBk
YXRhLmlzVW5ib3VuZCA/IHNsaWNlLmNhbGwob3B0aW9ucy50eXBlcywgMSkgOiBvcHRpb25zLnR5
cGVzLAotICAgICAgaGFzaCA9IG9wdGlvbnMuaGFzaCwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcs
Ci0gICAgICBjb250ZXh0cyA9IG9wdGlvbnMuY29udGV4dHMsCi0gICAgICBjdXJyZW50Q29udGV4
dCA9IChjb250ZXh0cyAmJiBjb250ZXh0cy5sZW5ndGgpID8gY29udGV4dHNbMF0gOiB0aGlzLAot
ICAgICAgcHJlZml4UGF0aEZvckRlcGVuZGVudEtleXMgPSAnJywKLSAgICAgIGxvYywgbGVuLCBo
YXNoT3B0aW9uLAotICAgICAgYm91bmRPcHRpb24sIHByb3BlcnR5LAotICAgICAgbm9ybWFsaXpl
ZFZhbHVlID0gRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVk
VmFsdWU7Ci0KLSAgICBFbWJlci5hc3NlcnQoInJlZ2lzdGVyQm91bmRIZWxwZXItZ2VuZXJhdGVk
IGhlbHBlcnMgZG8gbm90IHN1cHBvcnQgdXNlIHdpdGggSGFuZGxlYmFycyBibG9ja3MuIiwgIW9w
dGlvbnMuZm4pOwotCi0gICAgLy8gRGV0ZWN0IGJvdW5kIG9wdGlvbnMgKGUuZy4gY291bnRCaW5k
aW5nPSJvdGhlckNvdW50IikKLSAgICB2YXIgYm91bmRPcHRpb25zID0gaGFzaC5ib3VuZE9wdGlv
bnMgPSB7fTsKLSAgICBmb3IgKGhhc2hPcHRpb24gaW4gaGFzaCkgewotICAgICAgaWYgKEVtYmVy
LklTX0JJTkRJTkcudGVzdChoYXNoT3B0aW9uKSkgewotICAgICAgICAvLyBMb3Agb2ZmICdCaW5k
aW5nJyBzdWZmaXguCi0gICAgICAgIGJvdW5kT3B0aW9uc1toYXNoT3B0aW9uLnNsaWNlKDAsIC03
KV0gPSBoYXNoW2hhc2hPcHRpb25dOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEV4cG9zZSBw
cm9wZXJ0eSBuYW1lcyBvbiBkYXRhLnByb3BlcnRpZXMgb2JqZWN0LgotICAgIHZhciB3YXRjaGVk
UHJvcGVydGllcyA9IFtdOwotICAgIGRhdGEucHJvcGVydGllcyA9IFtdOwotICAgIGZvciAobG9j
ID0gMDsgbG9jIDwgbnVtUHJvcGVydGllczsgKytsb2MpIHsKLSAgICAgIGRhdGEucHJvcGVydGll
cy5wdXNoKHByb3BlcnRpZXNbbG9jXSk7Ci0gICAgICBpZiAodHlwZXNbbG9jXSA9PT0gJ0lEJykg
ewotICAgICAgICB2YXIgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRDb250
ZXh0LCBwcm9wZXJ0aWVzW2xvY10sIGRhdGEpOwotICAgICAgICBub3JtYWxpemVkUHJvcGVydGll
cy5wdXNoKG5vcm1hbGl6ZWRQcm9wKTsKLSAgICAgICAgd2F0Y2hlZFByb3BlcnRpZXMucHVzaChu
b3JtYWxpemVkUHJvcCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZihkYXRhLmlzVW5ib3Vu
ZCkgewotICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLnB1c2goe3BhdGg6IHByb3BlcnRp
ZXNbbG9jXX0pOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgbm9ybWFsaXplZFByb3BlcnRp
ZXMucHVzaChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEhhbmRs
ZSBjYXNlIHdoZW4gaGVscGVyIGludm9jYXRpb24gaXMgcHJlY2VkZWQgYnkgYHVuYm91bmRgLCBl
LmcuCi0gICAgLy8ge3t1bmJvdW5kIG15SGVscGVyIGZvb319Ci0gICAgaWYgKGRhdGEuaXNVbmJv
dW5kKSB7Ci0gICAgICByZXR1cm4gZXZhbHVhdGVVbmJvdW5kSGVscGVyKHRoaXMsIGZuLCBub3Jt
YWxpemVkUHJvcGVydGllcywgb3B0aW9ucyk7Ci0gICAgfQotCi0gICAgdmFyIGJpbmRWaWV3ID0g
bmV3IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJzVmlldyhudWxsLCBudWxsLCAhb3B0aW9ucy5oYXNo
LnVuZXNjYXBlZCwgb3B0aW9ucy5kYXRhKTsKLQotICAgIC8vIE92ZXJyaWRlIFNpbXBsZUhhbmRs
ZWJhcnNWaWV3J3MgbWV0aG9kIGZvciBnZW5lcmF0aW5nIHRoZSB2aWV3J3MgY29udGVudC4KLSAg
ICBiaW5kVmlldy5ub3JtYWxpemVkVmFsdWUgPSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBhcmdz
ID0gW10sIGJvdW5kT3B0aW9uOwotCi0gICAgICAvLyBDb3B5IG92ZXIgYm91bmQgaGFzaCBvcHRp
b25zLgotICAgICAgZm9yIChib3VuZE9wdGlvbiBpbiBib3VuZE9wdGlvbnMpIHsKLSAgICAgICAg
aWYgKCFib3VuZE9wdGlvbnMuaGFzT3duUHJvcGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRpbnVl
OyB9Ci0gICAgICAgIHByb3BlcnR5ID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgYm91
bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgZGF0YSk7Ci0gICAgICAgIGJpbmRWaWV3LnBhdGggPSBw
cm9wZXJ0eS5wYXRoOwotICAgICAgICBiaW5kVmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7
Ci0gICAgICAgIGhhc2hbYm91bmRPcHRpb25dID0gbm9ybWFsaXplZFZhbHVlLmNhbGwoYmluZFZp
ZXcpOwotICAgICAgfQotCi0gICAgICBmb3IgKGxvYyA9IDA7IGxvYyA8IG51bVByb3BlcnRpZXM7
ICsrbG9jKSB7Ci0gICAgICAgIHByb3BlcnR5ID0gbm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsK
LSAgICAgICAgaWYgKHByb3BlcnR5KSB7Ci0gICAgICAgICAgYmluZFZpZXcucGF0aCA9IHByb3Bl
cnR5LnBhdGg7Ci0gICAgICAgICAgYmluZFZpZXcucGF0aFJvb3QgPSBwcm9wZXJ0eS5yb290Owot
ICAgICAgICAgIGFyZ3MucHVzaChub3JtYWxpemVkVmFsdWUuY2FsbChiaW5kVmlldykpOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIGFyZ3MucHVzaChwcm9wZXJ0aWVzW2xvY10pOwotICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgICBhcmdzLnB1c2gob3B0aW9ucyk7Ci0KLSAgICAgIC8vIFJ1
biB0aGUgc3VwcGxpZWQgaGVscGVyIGZ1bmN0aW9uLgotICAgICAgcmV0dXJuIGZuLmFwcGx5KGN1
cnJlbnRDb250ZXh0LCBhcmdzKTsKLSAgICB9OwotCi0gICAgdmlldy5hcHBlbmRDaGlsZChiaW5k
Vmlldyk7Ci0KLSAgICAvLyBBc3NlbWJsZSBsaXN0IG9mIHdhdGNoZWQgcHJvcGVydGllcyB0aGF0
J2xsIHJlLXJlbmRlciB0aGlzIGhlbHBlci4KLSAgICBmb3IgKGJvdW5kT3B0aW9uIGluIGJvdW5k
T3B0aW9ucykgewotICAgICAgaWYgKGJvdW5kT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShib3VuZE9w
dGlvbikpIHsKLSAgICAgICAgd2F0Y2hlZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVQYXRoKGN1
cnJlbnRDb250ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRPcHRpb25dLCBkYXRhKSk7Ci0gICAgICB9
Ci0gICAgfQotCi0gICAgLy8gT2JzZXJ2ZSBlYWNoIHByb3BlcnR5LgotICAgIGZvciAobG9jID0g
MCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7Ci0g
ICAgICBwcm9wZXJ0eSA9IHdhdGNoZWRQcm9wZXJ0aWVzW2xvY107Ci0gICAgICB2aWV3LnJlZ2lz
dGVyT2JzZXJ2ZXIocHJvcGVydHkucm9vdCwgcHJvcGVydHkucGF0aCwgYmluZFZpZXcsIGJpbmRW
aWV3LnJlcmVuZGVyKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZXNbMF0gIT09ICdJRCcgfHwgbm9y
bWFsaXplZFByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgLy8gQWRkIGRlcGVuZGVudCBrZXkgb2JzZXJ2ZXJzIHRvIHRoZSBmaXJzdCBwYXJhbQot
ICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplZFByb3BlcnRpZXNbMF0sCi0gICAgICAgIHBh
dGhSb290ID0gbm9ybWFsaXplZC5yb290LAotICAgICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRo
OwotCi0gICAgaWYoIUVtYmVyLmlzRW1wdHkocGF0aCkpIHsKLSAgICAgIHByZWZpeFBhdGhGb3JE
ZXBlbmRlbnRLZXlzID0gcGF0aCArICcuJzsKLSAgICB9Ci0gICAgZm9yICh2YXIgaT0wLCBsPWRl
cGVuZGVudEtleXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2Vy
dmVyKHBhdGhSb290LCBwcmVmaXhQYXRoRm9yRGVwZW5kZW50S2V5cyArIGRlcGVuZGVudEtleXNb
aV0sIGJpbmRWaWV3LCBiaW5kVmlldy5yZXJlbmRlcik7Ci0gICAgfQotICB9Ci0KLSAgaGVscGVy
Ll9yYXdGdW5jdGlvbiA9IGZuOwotICByZXR1cm4gaGVscGVyOwotfTsKLQotLyoqCi0gIFJlbmRl
cnMgdGhlIHVuYm91bmQgZm9ybSBvZiBhbiBvdGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9u
LgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgZXZhbHVhdGVVbmJvdW5kSGVscGVyCi0gIEBwYXJh
bSB7RnVuY3Rpb259IGZuCi0gIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0Ci0gIEBwYXJhbSB7QXJy
YXl9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzCi0gIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zCi0qLwot
ZnVuY3Rpb24gZXZhbHVhdGVVbmJvdW5kSGVscGVyKGNvbnRleHQsIGZuLCBub3JtYWxpemVkUHJv
cGVydGllcywgb3B0aW9ucykgewotICB2YXIgYXJncyA9IFtdLAotICAgaGFzaCA9IG9wdGlvbnMu
aGFzaCwKLSAgIGJvdW5kT3B0aW9ucyA9IGhhc2guYm91bmRPcHRpb25zLAotICAgdHlwZXMgPSBz
bGljZS5jYWxsKG9wdGlvbnMudHlwZXMsIDEpLAotICAgbG9jLAotICAgbGVuLAotICAgcHJvcGVy
dHksCi0gICBwcm9wZXJ0eVR5cGUsCi0gICBib3VuZE9wdGlvbjsKLQotICBmb3IgKGJvdW5kT3B0
aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAgIGlmICghYm91bmRPcHRpb25zLmhhc093blByb3Bl
cnR5KGJvdW5kT3B0aW9uKSkgeyBjb250aW51ZTsgfQotICAgIGhhc2hbYm91bmRPcHRpb25dID0g
RW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwg
b3B0aW9ucyk7Ci0gIH0KLQotICBmb3IobG9jID0gMCwgbGVuID0gbm9ybWFsaXplZFByb3BlcnRp
ZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7Ci0gICAgcHJvcGVydHkgPSBub3JtYWxpemVk
UHJvcGVydGllc1tsb2NdOwotICAgIHByb3BlcnR5VHlwZSA9IHR5cGVzW2xvY107Ci0gICAgaWYo
cHJvcGVydHlUeXBlID09PSAiSUQiKSB7Ci0gICAgICBhcmdzLnB1c2goRW1iZXIuSGFuZGxlYmFy
cy5nZXQocHJvcGVydHkucm9vdCwgcHJvcGVydHkucGF0aCwgb3B0aW9ucykpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICBhcmdzLnB1c2gocHJvcGVydHkucGF0aCk7Ci0gICAgfQotICB9Ci0gIGFyZ3Mu
cHVzaChvcHRpb25zKTsKLSAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwotfQotCi0v
KioKLSAgT3ZlcnJpZGVzIEhhbmRsZWJhcnMudGVtcGxhdGUgc28gdGhhdCB3ZSBjYW4gZGlzdGlu
Z3Vpc2gKLSAgdXNlci1jcmVhdGVkLCB0b3AtbGV2ZWwgdGVtcGxhdGVzIGZyb20gaW5uZXIgY29u
dGV4dHMuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVtYmVyLkhh
bmRsZWJhcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHNwZWMKLSovCi1FbWJlci5IYW5kbGViYXJzLnRl
bXBsYXRlID0gZnVuY3Rpb24oc3BlYykgewotICB2YXIgdCA9IG9yaWdpbmFsVGVtcGxhdGUoc3Bl
Yyk7Ci0gIHQuaXNUb3AgPSB0cnVlOwotICByZXR1cm4gdDsKLX07Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0vKioKLSAgTWFyayBhIHN0cmluZyBhcyBzYWZlIGZvciB1bmVzY2FwZWQg
b3V0cHV0IHdpdGggSGFuZGxlYmFycy4gSWYgeW91Ci0gIHJldHVybiBIVE1MIGZyb20gYSBIYW5k
bGViYXJzIGhlbHBlciwgdXNlIHRoaXMgZnVuY3Rpb24gdG8KLSAgZW5zdXJlIEhhbmRsZWJhcnMg
ZG9lcyBub3QgZXNjYXBlIHRoZSBIVE1MLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuU3Ry
aW5nLmh0bWxTYWZlKCc8ZGl2PnNvbWVTdHJpbmc8L2Rpdj4nKQotICBgYGAKLQotICBAbWV0aG9k
IGh0bWxTYWZlCi0gIEBmb3IgRW1iZXIuU3RyaW5nCi0gIEBzdGF0aWMKLSAgQHJldHVybiB7SGFu
ZGxlYmFycy5TYWZlU3RyaW5nfSBhIHN0cmluZyB0aGF0IHdpbGwgbm90IGJlIGh0bWwgZXNjYXBl
ZCBieSBIYW5kbGViYXJzCi0qLwotRW1iZXIuU3RyaW5nLmh0bWxTYWZlID0gZnVuY3Rpb24oc3Ry
KSB7Ci0gIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHN0cik7Ci19OwotCi12YXIg
aHRtbFNhZmUgPSBFbWJlci5TdHJpbmcuaHRtbFNhZmU7Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJP
VE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpIHsKLQot
ICAvKioKLSAgICBNYXJrIGEgc3RyaW5nIGFzIGJlaW5nIHNhZmUgZm9yIHVuZXNjYXBlZCBvdXRw
dXQgd2l0aCBIYW5kbGViYXJzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICc8ZGl2PnNvbWVT
dHJpbmc8L2Rpdj4nLmh0bWxTYWZlKCkKLSAgICBgYGAKLQotICAgIFNlZSBbRW1iZXIuU3RyaW5n
Lmh0bWxTYWZlXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2h0bWxTYWZl
KS4KLQotICAgIEBtZXRob2QgaHRtbFNhZmUKLSAgICBAZm9yIFN0cmluZwotICAgIEByZXR1cm4g
e0hhbmRsZWJhcnMuU2FmZVN0cmluZ30gYSBzdHJpbmcgdGhhdCB3aWxsIG5vdCBiZSBodG1sIGVz
Y2FwZWQgYnkgSGFuZGxlYmFycwotICAqLwotICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0g
ZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGh0bWxTYWZlKHRoaXMpOwotICB9OwotfQotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlUGF0aHMgPSBm
dW5jdGlvbihvcHRpb25zKSB7Ci0gIHZhciByZXQgPSBbXSwKLSAgICAgIGNvbnRleHRzID0gb3B0
aW9ucy5jb250ZXh0cywKLSAgICAgIHJvb3RzID0gb3B0aW9ucy5yb290cywKLSAgICAgIGRhdGEg
PSBvcHRpb25zLmRhdGE7Ci0KLSAgZm9yICh2YXIgaT0wLCBsPWNvbnRleHRzLmxlbmd0aDsgaTxs
OyBpKyspIHsKLSAgICByZXQucHVzaCggRW1iZXIuSGFuZGxlYmFycy5nZXQocm9vdHNbaV0sIGNv
bnRleHRzW2ldLCB7IGRhdGE6IGRhdGEgfSkgKTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypqc2hpbnQgbmV3Y2FwOmZhbHNlKi8KLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIg
c2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7Ci12YXIgTWV0YW1vcnBoID0gcmVxdWly
ZU1vZHVsZSgnbWV0YW1vcnBoJyk7Ci0KLWZ1bmN0aW9uIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJz
KCkgewotICBFbWJlci5ydW4ub25jZShFbWJlci5WaWV3LCAnbm90aWZ5TXV0YXRpb25MaXN0ZW5l
cnMnKTsKLX0KLQotLy8gRE9NTWFuYWdlciBzaG91bGQganVzdCBhYnN0cmFjdCBkb20gbWFuaXB1
bGF0aW9uIGJldHdlZW4ganF1ZXJ5IGFuZCBtZXRhbW9ycGgKLXZhciBET01NYW5hZ2VyID0gewot
ICByZW1vdmU6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3Lm1vcnBoLnJlbW92ZSgpOwotICAg
IG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0sCi0KLSAgcHJlcGVuZDogZnVuY3Rpb24o
dmlldywgaHRtbCkgewotICAgIHZpZXcubW9ycGgucHJlcGVuZChodG1sKTsKLSAgICBub3RpZnlN
dXRhdGlvbkxpc3RlbmVycygpOwotICB9LAotCi0gIGFmdGVyOiBmdW5jdGlvbih2aWV3LCBodG1s
KSB7Ci0gICAgdmlldy5tb3JwaC5hZnRlcihodG1sKTsKLSAgICBub3RpZnlNdXRhdGlvbkxpc3Rl
bmVycygpOwotICB9LAotCi0gIGh0bWw6IGZ1bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3
Lm1vcnBoLmh0bWwoaHRtbCk7Ci0gICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwK
LQotICAvLyBUaGlzIGlzIG1lc3NlZCB1cC4KLSAgcmVwbGFjZTogZnVuY3Rpb24odmlldykgewot
ICAgIHZhciBtb3JwaCA9IHZpZXcubW9ycGg7Ci0KLSAgICB2aWV3LnRyYW5zaXRpb25UbygncHJl
UmVuZGVyJyk7Ci0KLSAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ3JlbmRlcicsIHRoaXMsIGZ1bmN0
aW9uIHJlbmRlck1ldGFtb3JwaFZpZXcoKSB7Ci0gICAgICBpZiAodmlldy5pc0Rlc3Ryb3lpbmcp
IHsgcmV0dXJuOyB9Ci0KLSAgICAgIHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7Ci0gICAg
ICB2YXIgYnVmZmVyID0gdmlldy5yZW5kZXJUb0J1ZmZlcigpOwotCi0gICAgICB2aWV3Lmludm9r
ZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgICAgdmlldy5wcm9wZXJ0eVdpbGxD
aGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICAgIH0pOwotICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZl
bHkoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Ci0KLSAgICAgIG1vcnBoLnJlcGxhY2VXaXRoKGJ1ZmZl
ci5zdHJpbmcoKSk7Ci0gICAgICB2aWV3LnRyYW5zaXRpb25UbygnaW5ET00nKTsKLQotICAgICAg
dmlldy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7Ci0gICAgICAgIHZpZXcucHJv
cGVydHlEaWRDaGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICAgIH0pOwotICAgICAgdmlldy50cmlnZ2Vy
UmVjdXJzaXZlbHkoJ2RpZEluc2VydEVsZW1lbnQnKTsKLQotICAgICAgbm90aWZ5TXV0YXRpb25M
aXN0ZW5lcnMoKTsKLSAgICB9KTsKLSAgfSwKLQotICBlbXB0eTogZnVuY3Rpb24odmlldykgewot
ICAgIHZpZXcubW9ycGguaHRtbCgiIik7Ci0gICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsK
LSAgfQotfTsKLQotLy8gVGhlIGBtb3JwaGAgYW5kIGBvdXRlckhUTUxgIHByb3BlcnRpZXMgYXJl
IGludGVybmFsIG9ubHkKLS8vIGFuZCBub3Qgb2JzZXJ2YWJsZS4KLQotLyoqCi0gIEBjbGFzcyBf
TWV0YW1vcnBoCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUKLSovCi1FbWJlci5fTWV0
YW1vcnBoID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgaXNWaXJ0dWFsOiB0cnVlLAotICB0YWdO
YW1lOiAnJywKLQotICBpbnN0cnVtZW50TmFtZTogJ21ldGFtb3JwaCcsCi0KLSAgaW5pdDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLm1vcnBoID0gTWV0YW1vcnBo
KCk7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCdTdXBwbHlpbmcgYSB0YWdOYW1lIHRvIE1ldGFtb3Jw
aCB2aWV3cyBpcyB1bnJlbGlhYmxlIGFuZCBpcyBkZXByZWNhdGVkLiBZb3UgbWF5IGJlIHNldHRp
bmcgdGhlIHRhZ05hbWUgb24gYSBIYW5kbGViYXJzIGhlbHBlciB0aGF0IGNyZWF0ZXMgYSBNZXRh
bW9ycGguJywgIXRoaXMudGFnTmFtZSk7Ci0gIH0sCi0KLSAgYmVmb3JlUmVuZGVyOiBmdW5jdGlv
bihidWZmZXIpIHsKLSAgICBidWZmZXIucHVzaCh0aGlzLm1vcnBoLnN0YXJ0VGFnKCkpOwotICAg
IGJ1ZmZlci5wdXNoT3BlbmluZ1RhZygpOwotICB9LAotCi0gIGFmdGVyUmVuZGVyOiBmdW5jdGlv
bihidWZmZXIpIHsKLSAgICBidWZmZXIucHVzaENsb3NpbmdUYWcoKTsKLSAgICBidWZmZXIucHVz
aCh0aGlzLm1vcnBoLmVuZFRhZygpKTsKLSAgfSwKLQotICBjcmVhdGVFbGVtZW50OiBmdW5jdGlv
bigpIHsKLSAgICB2YXIgYnVmZmVyID0gdGhpcy5yZW5kZXJUb0J1ZmZlcigpOwotICAgIHRoaXMu
b3V0ZXJIVE1MID0gYnVmZmVyLnN0cmluZygpOwotICAgIHRoaXMuY2xlYXJCdWZmZXIoKTsKLSAg
fSwKLQotICBkb21NYW5hZ2VyOiBET01NYW5hZ2VyCi19KTsKLQotLyoqCi0gIEBjbGFzcyBfTWV0
YW1vcnBoVmlldwotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAg
QHVzZXMgRW1iZXIuX01ldGFtb3JwaAotICBAcHJpdmF0ZQotKi8KLUVtYmVyLl9NZXRhbW9ycGhW
aWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuX01ldGFtb3JwaCk7Ci0KLS8qKgotICBAY2xh
c3MgX1NpbXBsZU1ldGFtb3JwaFZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
bWJlci5Db3JlVmlldwotICBAdXNlcyBFbWJlci5fTWV0YW1vcnBoCi0gIEBwcml2YXRlCi0qLwot
RW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXcgPSBFbWJlci5Db3JlVmlldy5leHRlbmQoRW1iZXIu
X01ldGFtb3JwaCk7Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBI
YW5kbGViYXJzICovCi0vKmpzaGludCBuZXdjYXA6ZmFsc2UqLwotLyoqCi1AbW9kdWxlIGVtYmVy
Ci1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0Owot
dmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVNb2R1bGUoJ21ldGFtb3JwaCcpOwotZnVuY3Rpb24gU2lt
cGxlSGFuZGxlYmFyc1ZpZXcocGF0aCwgcGF0aFJvb3QsIGlzRXNjYXBlZCwgdGVtcGxhdGVEYXRh
KSB7Ci0gIHRoaXMucGF0aCA9IHBhdGg7Ci0gIHRoaXMucGF0aFJvb3QgPSBwYXRoUm9vdDsKLSAg
dGhpcy5pc0VzY2FwZWQgPSBpc0VzY2FwZWQ7Ci0gIHRoaXMudGVtcGxhdGVEYXRhID0gdGVtcGxh
dGVEYXRhOwotCi0gIHRoaXMubW9ycGggPSBNZXRhbW9ycGgoKTsKLSAgdGhpcy5zdGF0ZSA9ICdw
cmVSZW5kZXInOwotICB0aGlzLnVwZGF0ZUlkID0gbnVsbDsKLSAgdGhpcy5fcGFyZW50VmlldyA9
IG51bGw7Ci0gIHRoaXMuYnVmZmVyID0gbnVsbDsKLX0KLQotRW1iZXIuX1NpbXBsZUhhbmRsZWJh
cnNWaWV3ID0gU2ltcGxlSGFuZGxlYmFyc1ZpZXc7Ci0KLVNpbXBsZUhhbmRsZWJhcnNWaWV3LnBy
b3RvdHlwZSA9IHsKLSAgaXNWaXJ0dWFsOiB0cnVlLAotICBpc1ZpZXc6IHRydWUsCi0KLSAgZGVz
dHJveTogZnVuY3Rpb24gKCkgewotICAgIGlmICh0aGlzLnVwZGF0ZUlkKSB7Ci0gICAgICBFbWJl
ci5ydW4uY2FuY2VsKHRoaXMudXBkYXRlSWQpOwotICAgICAgdGhpcy51cGRhdGVJZCA9IG51bGw7
Ci0gICAgfQotICAgIGlmICh0aGlzLl9wYXJlbnRWaWV3KSB7Ci0gICAgICB0aGlzLl9wYXJlbnRW
aWV3LnJlbW92ZUNoaWxkKHRoaXMpOwotICAgIH0KLSAgICB0aGlzLm1vcnBoID0gbnVsbDsKLSAg
ICB0aGlzLnN0YXRlID0gJ2Rlc3Ryb3llZCc7Ci0gIH0sCi0KLSAgcHJvcGVydHlXaWxsQ2hhbmdl
OiBFbWJlci5LLAotCi0gIHByb3BlcnR5RGlkQ2hhbmdlOiBFbWJlci5LLAotCi0gIG5vcm1hbGl6
ZWRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHBhdGggPSB0aGlzLnBhdGgsCi0gICAgICAg
IHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwKLSAgICAgICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7
Ci0KLSAgICAvLyBVc2UgdGhlIHBhdGhSb290IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBw
cm92aWRlZC4gVGhpcwotICAgIC8vIGhhcHBlbnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGlj
aCBnZXRzIG5vcm1hbGl6ZWQgaW50bwotICAgIC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVu
dCBIYW5kbGViYXJzIGNvbnRleHQgYW5kIGEgcGF0aAotICAgIC8vIG9mIGAnJ2AuCi0gICAgaWYg
KHBhdGggPT09ICcnKSB7Ci0gICAgICByZXN1bHQgPSBwYXRoUm9vdDsKLSAgICB9IGVsc2Ugewot
ICAgICAgdGVtcGxhdGVEYXRhID0gdGhpcy50ZW1wbGF0ZURhdGE7Ci0gICAgICByZXN1bHQgPSBo
YW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9LAotCi0gIHJlbmRlclRvQnVmZmVyOiBmdW5j
dGlvbihidWZmZXIpIHsKLSAgICB2YXIgc3RyaW5nID0gJyc7Ci0KLSAgICBzdHJpbmcgKz0gdGhp
cy5tb3JwaC5zdGFydFRhZygpOwotICAgIHN0cmluZyArPSB0aGlzLnJlbmRlcigpOwotICAgIHN0
cmluZyArPSB0aGlzLm1vcnBoLmVuZFRhZygpOwotCi0gICAgYnVmZmVyLnB1c2goc3RyaW5nKTsK
LSAgfSwKLQotICByZW5kZXI6IGZ1bmN0aW9uKCkgewotICAgIC8vIElmIG5vdCBpbnZva2VkIHZp
YSBhIHRyaXBsZS1tdXN0YWNoZSAoe3t7Zm9vfX19KSwgZXNjYXBlCi0gICAgLy8gdGhlIGNvbnRl
bnQgb2YgdGhlIHRlbXBsYXRlLgotICAgIHZhciBlc2NhcGUgPSB0aGlzLmlzRXNjYXBlZDsKLSAg
ICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxpemVkVmFsdWUoKTsKLQotICAgIGlmIChyZXN1bHQg
PT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKLSAgICAgIHJlc3VsdCA9ICIiOwot
ICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcp
KSB7Ci0gICAgICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAoZXNj
YXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQp
OyB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSwKLQotICByZXJlbmRlcjogZnVuY3Rpb24oKSB7
Ci0gICAgc3dpdGNoKHRoaXMuc3RhdGUpIHsKLSAgICAgIGNhc2UgJ3ByZVJlbmRlcic6Ci0gICAg
ICBjYXNlICdkZXN0cm95ZWQnOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2luQnVmZmVy
JzoKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCB0cmll
ZCB0byByZXBsYWNlIGFuIHt7ZXhwcmVzc2lvbn19IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50
byB0aGUgRE9NLiIpOwotICAgICAgY2FzZSAnaGFzRWxlbWVudCc6Ci0gICAgICBjYXNlICdpbkRP
TSc6Ci0gICAgICAgIHRoaXMudXBkYXRlSWQgPSBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5k
ZXInLCB0aGlzLCAndXBkYXRlJyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIHVwZGF0ZTogZnVuY3Rpb24gKCkgewotICAgIHRoaXMudXBkYXRl
SWQgPSBudWxsOwotICAgIHRoaXMubW9ycGguaHRtbCh0aGlzLnJlbmRlcigpKTsKLSAgfSwKLQot
ICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0YXRlKSB7Ci0gICAgdGhpcy5zdGF0ZSA9IHN0YXRl
OwotICB9Ci19OwotCi12YXIgc3RhdGVzID0gRW1iZXIuVmlldy5jbG9uZVN0YXRlcyhFbWJlci5W
aWV3LnN0YXRlcyksIG1lcmdlID0gRW1iZXIubWVyZ2U7Ci0KLW1lcmdlKHN0YXRlcy5fZGVmYXVs
dCwgewotICByZXJlbmRlcklmTmVlZGVkOiBFbWJlci5LCi19KTsKLQotbWVyZ2Uoc3RhdGVzLmlu
RE9NLCB7Ci0gIHJlcmVuZGVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBpZiAodmll
dy5ub3JtYWxpemVkVmFsdWUoKSAhPT0gdmlldy5fbGFzdE5vcm1hbGl6ZWRWYWx1ZSkgewotICAg
ICAgdmlldy5yZXJlbmRlcigpOwotICAgIH0KLSAgfQotfSk7Ci0KLS8qKgotICBgRW1iZXIuX0hh
bmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJpdmF0ZSB2aWV3IGNyZWF0ZWQgYnkgdGhlIEhhbmRs
ZWJhcnMKLSAgYHt7YmluZH19YCBoZWxwZXJzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9m
IGJvdW5kIHByb3BlcnRpZXMuCi0KLSAgRXZlcnkgdGltZSBhIHByb3BlcnR5IGlzIGJvdW5kIHVz
aW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFub255bW91cyBzdWJjbGFzcwotICBvZiBgRW1iZXIu
X0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3Vi
LXRlbXBsYXRlCi0gIGFuZCBjb250ZXh0IHNldCB1cC4gV2hlbiB0aGUgYXNzb2NpYXRlZCBwcm9w
ZXJ0eSBjaGFuZ2VzLCBqdXN0IHRoZSB0ZW1wbGF0ZQotICBmb3IgdGhpcyB2aWV3IHdpbGwgcmUt
cmVuZGVyLgotCi0gIEBjbGFzcyBfSGFuZGxlYmFyc0JvdW5kVmlldwotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBleHRlbmRzIEVtYmVyLl9NZXRhbW9ycGhWaWV3Ci0gIEBwcml2YXRlCi0qLwotRW1i
ZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgPSBFbWJlci5fTWV0YW1vcnBoVmlldy5leHRlbmQoewot
ICBpbnN0cnVtZW50TmFtZTogJ2JvdW5kSGFuZGxlYmFycycsCi0gIHN0YXRlczogc3RhdGVzLAot
Ci0gIC8qKgotICAgIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgYGRpc3Bs
YXlUZW1wbGF0ZWAgb3IKLSAgICBgaW52ZXJzZVRlbXBsYXRlYCBzaG91bGQgYmUgcmVuZGVyZWQu
IFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCB0YWtlcwotICAgIGEgdmFsdWUgYW5kIHJl
dHVybnMgYSBCb29sZWFuLgotCi0gICAgQHByb3BlcnR5IHNob3VsZERpc3BsYXlGdW5jCi0gICAg
QHR5cGUgRnVuY3Rpb24KLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHNob3VsZERpc3BsYXlG
dW5jOiBudWxsLAotCi0gIC8qKgotICAgIFdoZXRoZXIgdGhlIHRlbXBsYXRlIHJlbmRlcmVkIGJ5
IHRoaXMgdmlldyBnZXRzIHBhc3NlZCB0aGUgY29udGV4dCBvYmplY3QKLSAgICBvZiBpdHMgcGFy
ZW50IHRlbXBsYXRlLCBvciBnZXRzIHBhc3NlZCB0aGUgdmFsdWUgb2YgcmV0cmlldmluZyBgcGF0
aGAKLSAgICBmcm9tIHRoZSBgcGF0aFJvb3RgLgotCi0gICAgRm9yIGV4YW1wbGUsIHRoaXMgaXMg
dHJ1ZSB3aGVuIHVzaW5nIHRoZSBge3sjaWZ9fWAgaGVscGVyLCBiZWNhdXNlIHRoZQotICAgIHRl
bXBsYXRlIGluc2lkZSB0aGUgaGVscGVyIHNob3VsZCBsb29rIHVwIHByb3BlcnRpZXMgcmVsYXRp
dmUgdG8gdGhlIHNhbWUKLSAgICBvYmplY3QgYXMgb3V0c2lkZSB0aGUgYmxvY2suIFRoaXMgd291
bGQgYmUgYGZhbHNlYCB3aGVuIHVzZWQgd2l0aCBge3sjd2l0aAotICAgIGZvb319YCBiZWNhdXNl
IHRoZSB0ZW1wbGF0ZSBzaG91bGQgcmVjZWl2ZSB0aGUgb2JqZWN0IGZvdW5kIGJ5IGV2YWx1YXRp
bmcKLSAgICBgZm9vYC4KLQotICAgIEBwcm9wZXJ0eSBwcmVzZXJ2ZUNvbnRleHQKLSAgICBAdHlw
ZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgcHJlc2VydmVDb250ZXh0OiBm
YWxzZSwKLQotICAvKioKLSAgICBJZiBgcHJlc2VydmVDb250ZXh0YCBpcyB0cnVlLCB0aGlzIGlz
IHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICB0byByZW5kZXIgdGhlIHRlbXBsYXRl
LgotCi0gICAgQHByb3BlcnR5IHByZXZpb3VzQ29udGV4dAotICAgIEB0eXBlIE9iamVjdAotICAq
LwotICBwcmV2aW91c0NvbnRleHQ6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIHRlbXBsYXRlIHRv
IHJlbmRlciB3aGVuIGBzaG91bGREaXNwbGF5RnVuY2AgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQot
ICAgIEBwcm9wZXJ0eSBkaXNwbGF5VGVtcGxhdGUKLSAgICBAdHlwZSBGdW5jdGlvbgotICAgIEBk
ZWZhdWx0IG51bGwKLSAgKi8KLSAgZGlzcGxheVRlbXBsYXRlOiBudWxsLAotCi0gIC8qKgotICAg
IFRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgd2hlbiBgc2hvdWxkRGlzcGxheUZ1bmNgIGV2YWx1YXRl
cyB0byBgZmFsc2VgLgotCi0gICAgQHByb3BlcnR5IGludmVyc2VUZW1wbGF0ZQotICAgIEB0eXBl
IEZ1bmN0aW9uCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBpbnZlcnNlVGVtcGxhdGU6IG51
bGwsCi0KLQotICAvKioKLSAgICBUaGUgcGF0aCB0byBsb29rIHVwIG9uIGBwYXRoUm9vdGAgdGhh
dCBpcyBwYXNzZWQgdG8KLSAgICBgc2hvdWxkRGlzcGxheUZ1bmNgIHRvIGRldGVybWluZSB3aGlj
aCB0ZW1wbGF0ZSB0byByZW5kZXIuCi0KLSAgICBJbiBhZGRpdGlvbiwgaWYgYHByZXNlcnZlQ29u
dGV4dGAgaXMgYGZhbHNlLGAgdGhlIG9iamVjdCBhdCB0aGlzIHBhdGggd2lsbAotICAgIGJlIHBh
c3NlZCB0byB0aGUgdGVtcGxhdGUgd2hlbiByZW5kZXJpbmcuCi0KLSAgICBAcHJvcGVydHkgcGF0
aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgcGF0aDogbnVs
bCwKLQotICAvKioKLSAgICBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGBwYXRoYCB3aWxsIGJl
IGxvb2tlZCB1cC4gU29tZXRpbWVzIHRoaXMgaXMgdGhlCi0gICAgc2FtZSBhcyB0aGUgYHByZXZp
b3VzQ29udGV4dGAsIGJ1dCBpbiBjYXNlcyB3aGVyZSB0aGlzIHZpZXcgaGFzIGJlZW4KLSAgICBn
ZW5lcmF0ZWQgZm9yIHBhdGhzIHRoYXQgc3RhcnQgd2l0aCBhIGtleXdvcmQgc3VjaCBhcyBgdmll
d2Agb3IKLSAgICBgY29udHJvbGxlcmAsIHRoZSBwYXRoIHJvb3Qgd2lsbCBiZSB0aGF0IHJlc29s
dmVkIG9iamVjdC4KLQotICAgIEBwcm9wZXJ0eSBwYXRoUm9vdAotICAgIEB0eXBlIE9iamVjdAot
ICAqLwotICBwYXRoUm9vdDogbnVsbCwKLQotICBub3JtYWxpemVkVmFsdWU6IGZ1bmN0aW9uKCkg
ewotICAgIHZhciBwYXRoID0gZ2V0KHRoaXMsICdwYXRoJyksCi0gICAgICAgIHBhdGhSb290ICA9
IGdldCh0aGlzLCAncGF0aFJvb3QnKSwKLSAgICAgICAgdmFsdWVOb3JtYWxpemVyID0gZ2V0KHRo
aXMsICd2YWx1ZU5vcm1hbGl6ZXJGdW5jJyksCi0gICAgICAgIHJlc3VsdCwgdGVtcGxhdGVEYXRh
OwotCi0gICAgLy8gVXNlIHRoZSBwYXRoUm9vdCBhcyB0aGUgcmVzdWx0IGlmIG5vIHBhdGggaXMg
cHJvdmlkZWQuIFRoaXMKLSAgICAvLyBoYXBwZW5zIGlmIHRoZSBwYXRoIGlzIGB0aGlzYCwgd2hp
Y2ggZ2V0cyBub3JtYWxpemVkIGludG8KLSAgICAvLyBhIGBwYXRoUm9vdGAgb2YgdGhlIGN1cnJl
bnQgSGFuZGxlYmFycyBjb250ZXh0IGFuZCBhIHBhdGgKLSAgICAvLyBvZiBgJydgLgotICAgIGlm
IChwYXRoID09PSAnJykgewotICAgICAgcmVzdWx0ID0gcGF0aFJvb3Q7Ci0gICAgfSBlbHNlIHsK
LSAgICAgIHRlbXBsYXRlRGF0YSA9IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7Ci0gICAgICBy
ZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0
YSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3JtYWxp
emVyKHJlc3VsdCkgOiByZXN1bHQ7Ci0gIH0sCi0KLSAgcmVyZW5kZXJJZk5lZWRlZDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5jdXJyZW50U3RhdGUucmVyZW5kZXJJZk5lZWRlZCh0aGlzKTsKLSAg
fSwKLQotICAvKioKLSAgICBEZXRlcm1pbmVzIHdoaWNoIHRlbXBsYXRlIHRvIGludm9rZSwgc2V0
cyB1cCB0aGUgY29ycmVjdCBzdGF0ZSBiYXNlZCBvbgotICAgIHRoYXQgbG9naWMsIHRoZW4gaW52
b2tlcyB0aGUgZGVmYXVsdCBgRW1iZXIuVmlld2AgYHJlbmRlcmAgaW1wbGVtZW50YXRpb24uCi0K
LSAgICBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0IGxvb2sgdXAgdGhlIGBwYXRoYCBrZXkgb24gYHBh
dGhSb290YCwKLSAgICB0aGVuIHBhc3MgdGhhdCB2YWx1ZSB0byB0aGUgYHNob3VsZERpc3BsYXlG
dW5jYCBmdW5jdGlvbi4gSWYgdGhhdCByZXR1cm5zCi0gICAgYHRydWUsYCB0aGUgYGRpc3BsYXlU
ZW1wbGF0ZWAgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0byBET00uIE90aGVyd2lzZSwKLSAg
ICBgaW52ZXJzZVRlbXBsYXRlYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIHJlbmRlcmVkLgotCi0g
ICAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgYEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3YCByZXBy
ZXNlbnRlZCB0aGUgYHt7I3dpdGgKLSAgICBmb299fWAgaGVscGVyLCBpdCB3b3VsZCBsb29rIHVw
IHRoZSBgZm9vYCBwcm9wZXJ0eSBvZiBpdHMgY29udGV4dCwgYW5kCi0gICAgYHNob3VsZERpc3Bs
YXlGdW5jYCB3b3VsZCBhbHdheXMgcmV0dXJuIHRydWUuIFRoZSBvYmplY3QgZm91bmQgYnkgbG9v
a2luZwotICAgIHVwIGBmb29gIHdvdWxkIGJlIHBhc3NlZCB0byBgZGlzcGxheVRlbXBsYXRlYC4K
LQotICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFtIHtFbWJlci5SZW5kZXJCdWZmZXJ9IGJ1
ZmZlcgotICAqLwotICByZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgewotICAgIC8vIElmIG5vdCBp
bnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNoZSAoe3t7Zm9vfX19KSwgZXNjYXBlCi0gICAgLy8g
dGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLgotICAgIHZhciBlc2NhcGUgPSBnZXQodGhpcywg
J2lzRXNjYXBlZCcpOwotCi0gICAgdmFyIHNob3VsZERpc3BsYXkgPSBnZXQodGhpcywgJ3Nob3Vs
ZERpc3BsYXlGdW5jJyksCi0gICAgICAgIHByZXNlcnZlQ29udGV4dCA9IGdldCh0aGlzLCAncHJl
c2VydmVDb250ZXh0JyksCi0gICAgICAgIGNvbnRleHQgPSBnZXQodGhpcywgJ3ByZXZpb3VzQ29u
dGV4dCcpOwotCi0gICAgdmFyIGludmVyc2VUZW1wbGF0ZSA9IGdldCh0aGlzLCAnaW52ZXJzZVRl
bXBsYXRlJyksCi0gICAgICAgIGRpc3BsYXlUZW1wbGF0ZSA9IGdldCh0aGlzLCAnZGlzcGxheVRl
bXBsYXRlJyk7Ci0KLSAgICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxpemVkVmFsdWUoKTsKLSAg
ICB0aGlzLl9sYXN0Tm9ybWFsaXplZFZhbHVlID0gcmVzdWx0OwotCi0gICAgLy8gRmlyc3QsIHRl
c3QgdGhlIGNvbmRpdGlvbmFsIHRvIHNlZSBpZiB3ZSBzaG91bGQKLSAgICAvLyByZW5kZXIgdGhl
IHRlbXBsYXRlIG9yIG5vdC4KLSAgICBpZiAoc2hvdWxkRGlzcGxheShyZXN1bHQpKSB7Ci0gICAg
ICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZGlzcGxheVRlbXBsYXRlKTsKLQotICAgICAgLy8gSWYg
d2UgYXJlIHByZXNlcnZpbmcgdGhlIGNvbnRleHQgKGZvciBleGFtcGxlLCBpZiB0aGlzCi0gICAg
ICAvLyBpcyBhbiAjaWYgYmxvY2ssIGNhbGwgdGhlIHRlbXBsYXRlIHdpdGggdGhlIHNhbWUgb2Jq
ZWN0LgotICAgICAgaWYgKHByZXNlcnZlQ29udGV4dCkgewotICAgICAgICBzZXQodGhpcywgJ19j
b250ZXh0JywgY29udGV4dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgLy8gT3RoZXJ3aXNlLCBk
ZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGJsb2NrIGJpbmQgb3Igbm90LgotICAgICAgLy8gSWYgc28s
IHBhc3MgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHRlbXBsYXRlCi0gICAgICAgIGlmIChk
aXNwbGF5VGVtcGxhdGUpIHsKLSAgICAgICAgICBzZXQodGhpcywgJ19jb250ZXh0JywgcmVzdWx0
KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBiaW5kIGJsb2Nr
LCBqdXN0IHB1c2ggdGhlIHJlc3VsdCBvZiB0aGUKLSAgICAgICAgLy8gZXhwcmVzc2lvbiB0byB0
aGUgcmVuZGVyIGNvbnRleHQgYW5kIHJldHVybi4KLSAgICAgICAgICBpZiAocmVzdWx0ID09PSBu
dWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAiIjsK
LSAgICAgICAgICB9IGVsc2UgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgSGFuZGxlYmFycy5TYWZl
U3RyaW5nKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nKHJlc3VsdCk7Ci0gICAgICAg
ICAgfQotCi0gICAgICAgICAgaWYgKGVzY2FwZSkgeyByZXN1bHQgPSBIYW5kbGViYXJzLlV0aWxz
LmVzY2FwZUV4cHJlc3Npb24ocmVzdWx0KTsgfQotICAgICAgICAgIGJ1ZmZlci5wdXNoKHJlc3Vs
dCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlm
IChpbnZlcnNlVGVtcGxhdGUpIHsKLSAgICAgIHNldCh0aGlzLCAndGVtcGxhdGUnLCBpbnZlcnNl
VGVtcGxhdGUpOwotCi0gICAgICBpZiAocHJlc2VydmVDb250ZXh0KSB7Ci0gICAgICAgIHNldCh0
aGlzLCAnX2NvbnRleHQnLCBjb250ZXh0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldCh0
aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBz
ZXQodGhpcywgJ3RlbXBsYXRlJywgZnVuY3Rpb24oKSB7IHJldHVybiAnJzsgfSk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHRoaXMuX3N1cGVyKGJ1ZmZlcik7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhh
bmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10
ID0gRW1iZXIuU3RyaW5nLmZtdDsKLXZhciBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFy
cy5nZXQsIG5vcm1hbGl6ZVBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGg7Ci12
YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Ci12YXIgb19jcmVhdGUg
PSBFbWJlci5jcmVhdGU7Ci0KLXZhciBFbWJlckhhbmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJz
LCBoZWxwZXJzID0gRW1iZXJIYW5kbGViYXJzLmhlbHBlcnM7Ci0KLWZ1bmN0aW9uIGV4aXN0cyh2
YWx1ZSkgewotICByZXR1cm4gIUVtYmVyLmlzTm9uZSh2YWx1ZSk7Ci19Ci0KLWZ1bmN0aW9uIHNh
bml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSB7
Ci0gIHZhciByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwg
b3B0aW9ucyk7Ci0gIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQp
IHsKLSAgICByZXN1bHQgPSAiIjsKLSAgfSBlbHNlIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEhh
bmRsZWJhcnMuU2FmZVN0cmluZykpIHsKLSAgICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAg
fQotICBpZiAoIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQpewotICAgIHJlc3VsdCA9IEhhbmRsZWJh
cnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotLy8gQmluZHMgYSBwcm9wZXJ0eSBpbnRvIHRoZSBET00uIFRoaXMgd2lsbCBjcmVh
dGUgYSBob29rIGluIERPTSB0aGF0IHRoZQotLy8gS1ZPIHN5c3RlbSB3aWxsIGxvb2sgZm9yIGFu
ZCB1cGRhdGUgaWYgdGhlIHByb3BlcnR5IGNoYW5nZXMuCi1mdW5jdGlvbiBiaW5kKHByb3BlcnR5
LCBvcHRpb25zLCBwcmVzZXJ2ZUNvbnRleHQsIHNob3VsZERpc3BsYXksIHZhbHVlTm9ybWFsaXpl
ciwgY2hpbGRQcm9wZXJ0aWVzKSB7Ci0gIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhLAotICAgICAg
Zm4gPSBvcHRpb25zLmZuLAotICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKLSAgICAg
IHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXMsCi0gICAgICBu
b3JtYWxpemVkLCBvYnNlcnZlciwgaTsKLQotICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChj
dXJyZW50Q29udGV4dCwgcHJvcGVydHksIGRhdGEpOwotCi0gIC8vIFNldCB1cCBvYnNlcnZlcnMg
Zm9yIG9ic2VydmFibGUgb2JqZWN0cwotICBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiB0aGlzKSB7
Ci0gICAgaWYgKGRhdGEuaW5zaWRlR3JvdXApIHsKLSAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24o
KSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRlcicpOwotICAgICAgfTsK
LQotICAgICAgdmFyIHRlbXBsYXRlLCBjb250ZXh0LCByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN1
cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7Ci0KLSAgICAgIHJlc3VsdCA9IHZhbHVl
Tm9ybWFsaXplciA/IHZhbHVlTm9ybWFsaXplcihyZXN1bHQpIDogcmVzdWx0OwotCi0gICAgICBj
b250ZXh0ID0gcHJlc2VydmVDb250ZXh0ID8gY3VycmVudENvbnRleHQgOiByZXN1bHQ7Ci0gICAg
ICBpZiAoc2hvdWxkRGlzcGxheShyZXN1bHQpKSB7Ci0gICAgICAgIHRlbXBsYXRlID0gZm47Ci0g
ICAgICB9IGVsc2UgaWYgKGludmVyc2UpIHsKLSAgICAgICAgdGVtcGxhdGUgPSBpbnZlcnNlOwot
ICAgICAgfQotCi0gICAgICB0ZW1wbGF0ZShjb250ZXh0LCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9
KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gQ3JlYXRlIHRoZSB2aWV3IHRoYXQgd2lsbCB3cmFw
IHRoZSBvdXRwdXQgb2YgdGhpcyB0ZW1wbGF0ZS9wcm9wZXJ0eQotICAgICAgLy8gYW5kIGFkZCBp
dCB0byB0aGUgbmVhcmVzdCB2aWV3J3MgY2hpbGRWaWV3cyBhcnJheS4KLSAgICAgIC8vIFNlZSB0
aGUgZG9jdW1lbnRhdGlvbiBvZiBFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlldyBmb3IgbW9yZS4K
LSAgICAgIHZhciBiaW5kVmlldyA9IHZpZXcuY3JlYXRlQ2hpbGRWaWV3KEVtYmVyLl9IYW5kbGVi
YXJzQm91bmRWaWV3LCB7Ci0gICAgICAgIHByZXNlcnZlQ29udGV4dDogcHJlc2VydmVDb250ZXh0
LAotICAgICAgICBzaG91bGREaXNwbGF5RnVuYzogc2hvdWxkRGlzcGxheSwKLSAgICAgICAgdmFs
dWVOb3JtYWxpemVyRnVuYzogdmFsdWVOb3JtYWxpemVyLAotICAgICAgICBkaXNwbGF5VGVtcGxh
dGU6IGZuLAotICAgICAgICBpbnZlcnNlVGVtcGxhdGU6IGludmVyc2UsCi0gICAgICAgIHBhdGg6
IHByb3BlcnR5LAotICAgICAgICBwYXRoUm9vdDogY3VycmVudENvbnRleHQsCi0gICAgICAgIHBy
ZXZpb3VzQ29udGV4dDogY3VycmVudENvbnRleHQsCi0gICAgICAgIGlzRXNjYXBlZDogIW9wdGlv
bnMuaGFzaC51bmVzY2FwZWQsCi0gICAgICAgIHRlbXBsYXRlRGF0YTogb3B0aW9ucy5kYXRhCi0g
ICAgICB9KTsKLQotICAgICAgdmlldy5hcHBlbmRDaGlsZChiaW5kVmlldyk7Ci0KLSAgICAgIG9i
c2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3Jl
bmRlcicsIGJpbmRWaWV3LCAncmVyZW5kZXJJZk5lZWRlZCcpOwotICAgICAgfTsKLSAgICB9Ci0K
LSAgICAvLyBPYnNlcnZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgb24gdGhlIGNvbnRleHQgYW5kCi0g
ICAgLy8gdGVsbHMgdGhlIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3IHRvIHJlLXJlbmRlci4g
SWYgcHJvcGVydHkKLSAgICAvLyBpcyBhbiBlbXB0eSBzdHJpbmcsIHdlIGFyZSBwcmludGluZyB0
aGUgY3VycmVudCBjb250ZXh0Ci0gICAgLy8gb2JqZWN0ICh7e3RoaXN9fSkgc28gdXBkYXRpbmcg
aXQgaXMgbm90IG91ciByZXNwb25zaWJpbGl0eS4KLSAgICBpZiAobm9ybWFsaXplZC5wYXRoICE9
PSAnJykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9y
bWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0gICAgICBpZiAoY2hpbGRQcm9wZXJ0aWVzKSB7Ci0g
ICAgICAgIGZvciAoaT0wOyBpPGNoaWxkUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAg
ICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0
aCsnLicrY2hpbGRQcm9wZXJ0aWVzW2ldLCBvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwg
c28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAotICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAgICBk
YXRhLmJ1ZmZlci5wdXNoKGhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBv
cHRpb25zKSk7Ci0gIH0KLX0KLQotRW1iZXJIYW5kbGViYXJzLmJpbmQgPSBiaW5kOwotCi1mdW5j
dGlvbiBzaW1wbGVCaW5kKGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucykgewotICB2
YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBu
b3JtYWxpemVkLCBvYnNlcnZlciwgcGF0aFJvb3QsIG91dHB1dDsKLQotICBub3JtYWxpemVkID0g
bm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIGRhdGEpOwotICBwYXRoUm9v
dCA9IG5vcm1hbGl6ZWQucm9vdDsKLQotICAvLyBTZXQgdXAgb2JzZXJ2ZXJzIGZvciBvYnNlcnZh
YmxlIG9iamVjdHMKLSAgaWYgKHBhdGhSb290ICYmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHBhdGhS
b290KSkgewotICAgIGlmIChkYXRhLmluc2lkZUdyb3VwKSB7Ci0gICAgICBvYnNlcnZlciA9IGZ1
bmN0aW9uKCkgewotICAgICAgICBFbWJlci5ydW4ub25jZSh2aWV3LCAncmVyZW5kZXInKTsKLSAg
ICAgIH07Ci0KLSAgICAgIG91dHB1dCA9IHNhbml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVudENv
bnRleHQsIHByb3BlcnR5LCBvcHRpb25zKTsKLQotICAgICAgZGF0YS5idWZmZXIucHVzaChvdXRw
dXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXIgYmluZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBs
ZUhhbmRsZWJhcnNWaWV3KAotICAgICAgICBwcm9wZXJ0eSwgY3VycmVudENvbnRleHQsICFvcHRp
b25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25zLmRhdGEKLSAgICAgICk7Ci0KLSAgICAgIGJpbmRW
aWV3Ll9wYXJlbnRWaWV3ID0gdmlldzsKLSAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcp
OwotCi0gICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgICBFbWJlci5ydW4uc2No
ZWR1bGVPbmNlKCdyZW5kZXInLCBiaW5kVmlldywgJ3JlcmVuZGVyJyk7Ci0gICAgICB9OwotICAg
IH0KLQotICAgIC8vIE9ic2VydmVzIHRoZSBnaXZlbiBwcm9wZXJ0eSBvbiB0aGUgY29udGV4dCBh
bmQKLSAgICAvLyB0ZWxscyB0aGUgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgdG8gcmUtcmVu
ZGVyLiBJZiBwcm9wZXJ0eQotICAgIC8vIGlzIGFuIGVtcHR5IHN0cmluZywgd2UgYXJlIHByaW50
aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAvLyBvYmplY3QgKHt7dGhpc319KSBzbyB1cGRh
dGluZyBpdCBpcyBub3Qgb3VyIHJlc3BvbnNpYmlsaXR5LgotICAgIGlmIChub3JtYWxpemVkLnBh
dGggIT09ICcnKSB7Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290
LCBub3JtYWxpemVkLnBhdGgsIG9ic2VydmVyKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8g
VGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAot
ICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAgICBvdXRwdXQgPSBzYW5pdGl6ZWRIYW5kbGViYXJz
R2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7Ci0KLSAgICBkYXRhLmJ1ZmZl
ci5wdXNoKG91dHB1dCk7Ci0gIH0KLX0KLQotLyoqCi0gICdfdHJpYWdlTXVzdGFjaGUnIGlzIHVz
ZWQgaW50ZXJuYWxseSBzZWxlY3QgYmV0d2VlbiBhIGJpbmRpbmcsIGhlbHBlciwgb3IgY29tcG9u
ZW50IGZvcgotICB0aGUgZ2l2ZW4gY29udGV4dC4gVW50aWwgdGhpcyBwb2ludCwgaXQgd291bGQg
YmUgaGFyZCB0byBkZXRlcm1pbmUgaWYgdGhlCi0gIG11c3RhY2hlIGlzIGEgcHJvcGVydHkgcmVm
ZXJlbmNlIG9yIGEgcmVndWxhciBoZWxwZXIgcmVmZXJlbmNlLiBUaGlzIHRyaWFnZQotICBoZWxw
ZXIgcmVzb2x2ZXMgdGhhdC4KLQotICBUaGlzIHdvdWxkIG5vdCBiZSB0eXBpY2FsbHkgaW52b2tl
ZCBieSBkaXJlY3RseS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIF90cmlhZ2VNdXN0YWNoZQot
ICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVy
dHkgUHJvcGVydHkvaGVscGVySUQgdG8gdHJpYWdlCi0gIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25z
IGhhc2ggb2YgdGVtcGxhdGUvcmVuZGVyaW5nIG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBI
VE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignX3RyaWFnZU11
c3RhY2hlJywgZnVuY3Rpb24ocHJvcGVydHksIG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZ
b3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgX3RyaWFnZU11c3Rh
Y2hlIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPD0gMik7Ci0KLSAgaWYgKGhlbHBlcnNbcHJv
cGVydHldKSB7Ci0gICAgcmV0dXJuIGhlbHBlcnNbcHJvcGVydHldLmNhbGwodGhpcywgb3B0aW9u
cyk7Ci0gIH0KLQotICB2YXIgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVy
KG9wdGlvbnMuZGF0YS52aWV3LmNvbnRhaW5lciwgcHJvcGVydHkpOwotICBpZiAoaGVscGVyKSB7
Ci0gICAgcmV0dXJuIGhlbHBlci5jYWxsKHRoaXMsIG9wdGlvbnMpOwotICB9Ci0KLSAgcmV0dXJu
IGhlbHBlcnMuYmluZC5jYWxsKHRoaXMsIHByb3BlcnR5LCBvcHRpb25zKTsKLX0pOwotCi1FbWJl
ci5IYW5kbGViYXJzLnJlc29sdmVIZWxwZXIgPSBmdW5jdGlvbihjb250YWluZXIsIG5hbWUpIHsK
LQotICBpZiAoIWNvbnRhaW5lciB8fCBuYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHsKLSAgICBy
ZXR1cm47Ci0gIH0KLQotICB2YXIgaGVscGVyID0gY29udGFpbmVyLmxvb2t1cCgnaGVscGVyOicg
KyBuYW1lKTsKLSAgaWYgKCFoZWxwZXIpIHsKLSAgICB2YXIgY29tcG9uZW50TG9va3VwID0gY29u
dGFpbmVyLmxvb2t1cCgnY29tcG9uZW50LWxvb2t1cDptYWluJyk7Ci0gICAgRW1iZXIuYXNzZXJ0
KCJDb3VsZCBub3QgZmluZCAnY29tcG9uZW50LWxvb2t1cDptYWluJyBvbiB0aGUgcHJvdmlkZWQg
Y29udGFpbmVyLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yIHBlcmZvcm1pbmcgY29tcG9uZW50IGxv
b2t1cHMiLCBjb21wb25lbnRMb29rdXApOwotCi0gICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVu
dExvb2t1cC5sb29rdXBGYWN0b3J5KG5hbWUsIGNvbnRhaW5lcik7Ci0gICAgaWYgKENvbXBvbmVu
dCkgewotICAgICAgaGVscGVyID0gRW1iZXJIYW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKENvbXBv
bmVudCk7Ci0gICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2hlbHBlcjonICsgbmFtZSwgaGVscGVy
KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGhlbHBlcjsKLX07Ci0KLS8qKgotICBgYmluZGAgY2Fu
IGJlIHVzZWQgdG8gZGlzcGxheSBhIHZhbHVlLCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0
Ci0gIGNoYW5nZXMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHByaW50IHRoZSBgdGl0
bGVgIHByb3BlcnR5IG9mCi0gIGBjb250ZW50YDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7Ymlu
ZCAiY29udGVudC50aXRsZSJ9fQotICBgYGAKLQotICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBgdGl0
bGVgIHByb3BlcnR5IGFzIGEgc3RyaW5nLCB0aGVuIGNyZWF0ZSBhIG5ldyBvYnNlcnZlcgotICBh
dCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIGl0IGNoYW5nZXMsIGl0IHdpbGwgdXBkYXRlIHRoZSB2
YWx1ZSBpbiBET00uIE5vdGUKLSAgdGhhdCBpZiB5b3UgbmVlZCB0byBzdXBwb3J0IElFNyBhbmQg
SUU4IHlvdSBtdXN0IG1vZGlmeSB0aGUgbW9kZWwgb2JqZWN0cwotICBwcm9wZXJ0aWVzIHVzaW5n
IGBFbWJlci5nZXQoKWAgYW5kIGBFbWJlci5zZXQoKWAgZm9yIHRoaXMgdG8gd29yayBhcyBpdAot
ICByZWxpZXMgb24gRW1iZXIncyBLVk8gc3lzdGVtLiBGb3IgYWxsIG90aGVyIGJyb3dzZXJzIHRo
aXMgd2lsbCBiZSBoYW5kbGVkIGZvcgotICB5b3UgYXV0b21hdGljYWxseS4KLQotICBAcHJpdmF0
ZQotICBAbWV0aG9kIGJpbmQKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBh
cmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGJpbmQKLSAgQHBhcmFtIHtGdW5jdGlv
bn0gZm4gQ29udGV4dCB0byBwcm92aWRlIGZvciByZW5kZXJpbmcKLSAgQHJldHVybiB7U3RyaW5n
fSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmluZCcs
IGZ1bmN0aW9uIGJpbmRIZWxwZXIocHJvcGVydHksIG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0
KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgYmluZCBoZWxw
ZXIiLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIpOwotCi0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMu
Y29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1sw
XSA6IHRoaXM7Ci0KLSAgaWYgKCFvcHRpb25zLmZuKSB7Ci0gICAgcmV0dXJuIHNpbXBsZUJpbmQo
Y29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpOwotICB9Ci0KLSAgcmV0dXJuIGJpbmQuY2FsbChj
b250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucywgZmFsc2UsIGV4aXN0cyk7Ci19KTsKLQotLyoqCi0g
IFVzZSB0aGUgYGJvdW5kSWZgIGhlbHBlciB0byBjcmVhdGUgYSBjb25kaXRpb25hbCB0aGF0IHJl
LWV2YWx1YXRlcwotICB3aGVuZXZlciB0aGUgdHJ1dGhpbmVzcyBvZiB0aGUgYm91bmQgdmFsdWUg
Y2hhbmdlcy4KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2JvdW5kSWYgImNvbnRlbnQuc2hvdWxk
RGlzcGxheVRpdGxlIn19Ci0gICAge3tjb250ZW50LnRpdGxlfX0KLSAge3svYm91bmRJZn19Ci0g
IGBgYAotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgYm91bmRJZgotICBAZm9yIEVtYmVyLkhhbmRs
ZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gYmlu
ZAotICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmlu
ZwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJl
Z2lzdGVySGVscGVyKCdib3VuZElmJywgZnVuY3Rpb24gYm91bmRJZkhlbHBlcihwcm9wZXJ0eSwg
Zm4pIHsKLSAgdmFyIGNvbnRleHQgPSAoZm4uY29udGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3Ro
KSA/IGZuLmNvbnRleHRzWzBdIDogdGhpczsKLSAgdmFyIGZ1bmMgPSBmdW5jdGlvbihyZXN1bHQp
IHsKLSAgICB2YXIgdHJ1dGh5ID0gcmVzdWx0ICYmIGdldChyZXN1bHQsICdpc1RydXRoeScpOwot
ICAgIGlmICh0eXBlb2YgdHJ1dGh5ID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIHRydXRoeTsgfQot
Ci0gICAgaWYgKEVtYmVyLmlzQXJyYXkocmVzdWx0KSkgewotICAgICAgcmV0dXJuIGdldChyZXN1
bHQsICdsZW5ndGgnKSAhPT0gMDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICEhcmVzdWx0
OwotICAgIH0KLSAgfTsKLQotICByZXR1cm4gYmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBm
biwgdHJ1ZSwgZnVuYywgZnVuYywgWydpc1RydXRoeScsICdsZW5ndGgnXSk7Ci19KTsKLQotLyoq
Ci0gIFVzZSB0aGUgYHt7d2l0aH19YCBoZWxwZXIgd2hlbiB5b3Ugd2FudCB0byBzY29wZSBjb250
ZXh0LiBUYWtlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBhbiBleGFtcGxlOgotCi0gIGBgYGhhbmRs
ZWJhcnMKLSAgPGg1Pnt7dXNlci5uYW1lfX08L2g1PgotCi0gIDxkaXYgY2xhc3M9InJvbGUiPgot
ICAgIDxoNj57e3VzZXIucm9sZS5sYWJlbH19PC9oNj4KLSAgICA8c3BhbiBjbGFzcz0icm9sZS1p
ZCI+e3t1c2VyLnJvbGUuaWR9fTwvc3Bhbj4KLQotICAgIDxwIGNsYXNzPSJyb2xlLWRlc2MiPnt7
dXNlci5yb2xlLmRlc2NyaXB0aW9ufX08L3A+Ci0gIDwvZGl2PgotICBgYGAKLQotICBge3t3aXRo
fX1gIGNhbiBiZSBvdXIgYmVzdCBmcmllbmQgaW4gdGhlc2UgY2FzZXMsIAotICBpbnN0ZWFkIG9m
IHdyaXRpbmcgYHVzZXIucm9sZS4qYCBvdmVyIGFuZCBvdmVyLCB3ZSB1c2UgYHt7I3dpdGggdXNl
ci5yb2xlfX1gLgotICBOb3cgdGhlIGNvbnRleHQgd2l0aGluIHRoZSBge3sjd2l0aH19IC4uIHt7
L3dpdGh9fWAgYmxvY2sgaXMgYHVzZXIucm9sZWAgc28geW91IGNhbiBkbyB0aGUgZm9sbG93aW5n
OgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGg1Pnt7dXNlci5uYW1lfX08L2g1PgotCi0gIDxkaXYg
Y2xhc3M9InJvbGUiPgotICAgIHt7I3dpdGggdXNlci5yb2xlfX0KLSAgICAgIDxoNj57e2xhYmVs
fX08L2g2PgotICAgICAgPHNwYW4gY2xhc3M9InJvbGUtaWQiPnt7aWR9fTwvc3Bhbj4KLQotICAg
ICAgPHAgY2xhc3M9InJvbGUtZGVzYyI+e3tkZXNjcmlwdGlvbn19PC9wPgotICAgIHt7L3dpdGh9
fQotICA8L2Rpdj4KLSAgYGBgCi0KLSAgIyMjIGBhc2Agb3BlcmF0b3IKLQotICBUaGlzIG9wZXJh
dG9yIGFsaWFzZXMgdGhlIHNjb3BlIHRvIGEgbmV3IG5hbWUuIEl0J3MgaGVscGZ1bCBmb3Igc2Vt
YW50aWMgY2xhcml0eSBhbmQgdG8gcmV0YWluIAotICBkZWZhdWx0IHNjb3BlIG9yIHRvIHJlZmVy
ZW5jZSBmcm9tIGFub3RoZXIgYHt7d2l0aH19YCBibG9jay4KLQotICBgYGBoYW5kbGViYXJzCi0g
IC8vIHBvc3RzIG1pZ2h0IG5vdCBiZQotICB7eyN3aXRoIHVzZXIucG9zdHMgYXMgYmxvZ1Bvc3Rz
fX0KLSAgICA8ZGl2IGNsYXNzPSJub3RpY2UiPgotICAgICAgVGhlcmUgYXJlIHt7YmxvZ1Bvc3Rz
Lmxlbmd0aH19IGJsb2cgcG9zdHMgd3JpdHRlbiBieSB7e3VzZXIubmFtZX19LgotICAgIDwvZGl2
PgotCi0gICAge3sjZWFjaCBwb3N0IGluIGJsb2dQb3N0c319Ci0gICAgICA8bGk+e3twb3N0LnRp
dGxlfX08L2xpPgotICAgIHt7L2VhY2h9fQotICB7ey93aXRofX0KLSAgYGBgCi0KLSAgV2l0aG91
dCB0aGUgYGFzYCBvcGVyYXRvciwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byByZWZlcmVuY2Ug
YHVzZXIubmFtZWAgaW4gdGhlIGV4YW1wbGUgYWJvdmUuCi0KLSAgQG1ldGhvZCB3aXRoCi0gIEBm
b3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNvbnRleHQK
LSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0gIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcK
LSovCi1FbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiB3aXRo
SGVscGVyKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQp
IHsKLSAgICB2YXIga2V5d29yZE5hbWUsIHBhdGgsIHJvb3RQYXRoLCBub3JtYWxpemVkLCBjb250
ZXh0UGF0aDsKLQotICAgIEVtYmVyLmFzc2VydCgiSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBh
cmd1bWVudCB0byB0aGUgd2l0aCBoZWxwZXIsIGl0IG11c3QgYmUgaW4gdGhlIGZvcm0gI3dpdGgg
Zm9vIGFzIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0gImFzIik7Ci0gICAgb3B0aW9ucyA9IGFyZ3Vt
ZW50c1szXTsKLSAgICBrZXl3b3JkTmFtZSA9IGFyZ3VtZW50c1syXTsKLSAgICBwYXRoID0gYXJn
dW1lbnRzWzBdOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8g
dGhlIHdpdGggaGVscGVyIiwgb3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJz
LlZNLm5vb3ApOwotCi0gICAgdmFyIGxvY2FsaXplZE9wdGlvbnMgPSBvX2NyZWF0ZShvcHRpb25z
KTsKLSAgICBsb2NhbGl6ZWRPcHRpb25zLmRhdGEgPSBvX2NyZWF0ZShvcHRpb25zLmRhdGEpOwot
ICAgIGxvY2FsaXplZE9wdGlvbnMuZGF0YS5rZXl3b3JkcyA9IG9fY3JlYXRlKG9wdGlvbnMuZGF0
YS5rZXl3b3JkcyB8fCB7fSk7Ci0KLSAgICBpZiAoRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7
Ci0gICAgICBjb250ZXh0UGF0aCA9IHBhdGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5vcm1hbGl6
ZWQgPSBub3JtYWxpemVQYXRoKHRoaXMsIHBhdGgsIG9wdGlvbnMuZGF0YSk7Ci0gICAgICBwYXRo
ID0gbm9ybWFsaXplZC5wYXRoOwotICAgICAgcm9vdFBhdGggPSBub3JtYWxpemVkLnJvb3Q7Ci0K
LSAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IHlvdSBjYW5u
b3QgYmluZCBzZXBhcmF0ZSBvYmplY3RzCi0gICAgICAvLyB0b2dldGhlci4gV2hlbiB3ZSBpbXBs
ZW1lbnQgdGhhdCBmdW5jdGlvbmFsaXR5LCB3ZSBzaG91bGQgdXNlIGl0IGhlcmUuCi0gICAgICB2
YXIgY29udGV4dEtleSA9IEVtYmVyLiQuZXhwYW5kbyArIEVtYmVyLmd1aWRGb3Iocm9vdFBhdGgp
OwotICAgICAgbG9jYWxpemVkT3B0aW9ucy5kYXRhLmtleXdvcmRzW2NvbnRleHRLZXldID0gcm9v
dFBhdGg7Ci0gICAgICAvLyBpZiB0aGUgcGF0aCBpcyAnJyAoInRoaXMiKSwganVzdCBiaW5kIGRp
cmVjdGx5IHRvIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgIGNvbnRleHRQYXRoID0gcGF0aCA/
IGNvbnRleHRLZXkgKyAnLicgKyBwYXRoIDogY29udGV4dEtleTsKLSAgICB9Ci0KLSAgICBFbWJl
ci5iaW5kKGxvY2FsaXplZE9wdGlvbnMuZGF0YS5rZXl3b3Jkcywga2V5d29yZE5hbWUsIGNvbnRl
eHRQYXRoKTsKLQotICAgIHJldHVybiBiaW5kLmNhbGwodGhpcywgcGF0aCwgbG9jYWxpemVkT3B0
aW9ucywgdHJ1ZSwgZXhpc3RzKTsKLSAgfSBlbHNlIHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBt
dXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1lbnQgdG8gdGhlIHdpdGggaGVscGVyIiwgYXJndW1l
bnRzLmxlbmd0aCA9PT0gMik7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxv
Y2sgdG8gdGhlIHdpdGggaGVscGVyIiwgb3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5k
bGViYXJzLlZNLm5vb3ApOwotICAgIHJldHVybiBoZWxwZXJzLmJpbmQuY2FsbChvcHRpb25zLmNv
bnRleHRzWzBdLCBjb250ZXh0LCBvcHRpb25zKTsKLSAgfQotfSk7Ci0KLQotLyoqCi0gIFNlZSBb
Ym91bmRJZl0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhv
ZF9ib3VuZElmKQotCi0gIEBtZXRob2QgaWYKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBl
cnMKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMK
LSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiBpZkhlbHBlcihjb250ZXh0LCBvcHRpb25zKSB7Ci0g
IEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUg
aWYgaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gIEVtYmVyLmFzc2VydCgiWW91
IG11c3QgcGFzcyBhIGJsb2NrIHRvIHRoZSBpZiBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlv
bnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJ
Zi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0sIGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8q
KgotICBAbWV0aG9kIHVubGVzcwotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBA
cGFyYW0ge0Z1bmN0aW9ufSBjb250ZXh0Ci0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0
dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVs
cGVyKCd1bmxlc3MnLCBmdW5jdGlvbiB1bmxlc3NIZWxwZXIoY29udGV4dCwgb3B0aW9ucykgewot
ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1lbnQgdG8gdGhl
IHVubGVzcyBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKLSAgRW1iZXIuYXNzZXJ0
KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBvcHRpb25zLmZu
ICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7Ci0KLSAgdmFyIGZuID0gb3B0
aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZTsKLQotICBvcHRpb25zLmZuID0gaW52
ZXJzZTsKLSAgb3B0aW9ucy5pbnZlcnNlID0gZm47Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJ
Zi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0sIGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8q
KgotICBgYmluZC1hdHRyYCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIGJpbmRpbmcgYmV0d2VlbiBE
T00gZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAotICBFbWJlciBvYmplY3RzLiBGb3IgZXhhbXBsZToK
LQotICBgYGBoYW5kbGViYXJzCi0gIDxpbWcge3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVybCIgYWx0
PSJpbWFnZVRpdGxlIn19PgotICBgYGAKLQotICBUaGUgYWJvdmUgaGFuZGxlYmFycyB0ZW1wbGF0
ZSB3aWxsIGZpbGwgdGhlIGA8aW1nPmAncyBgc3JjYCBhdHRyaWJ1dGUgd2lsbAotICB0aGUgdmFs
dWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgd2l0aCBgImltYWdlVXJsImAgYW5kIGl0cyBg
YWx0YAotICBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5j
ZWQgd2l0aCBgImltYWdlVGl0bGUiYC4KLQotICBJZiB0aGUgcmVuZGVyaW5nIGNvbnRleHQgb2Yg
dGhpcyB0ZW1wbGF0ZSBpcyB0aGUgZm9sbG93aW5nIG9iamVjdDoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIHsKLSAgICBpbWFnZVVybDogJ2h0dHA6Ly9sb2xjYXRzLmluZm8vaGF6LWEtZnVubnknLAot
ICAgIGltYWdlVGl0bGU6ICdBIGh1bW9yb3VzIGltYWdlIG9mIGEgY2F0JwotICB9Ci0gIGBgYAot
Ci0gIFRoZSByZXN1bHRpbmcgSFRNTCBvdXRwdXQgd2lsbCBiZToKLQotICBgYGBodG1sCi0gIDxp
bWcgc3JjPSJodHRwOi8vbG9sY2F0cy5pbmZvL2hhei1hLWZ1bm55IiBhbHQ9IkEgaHVtb3JvdXMg
aW1hZ2Ugb2YgYSBjYXQiPgotICBgYGAKLQotICBgYmluZC1hdHRyYCBjYW5ub3QgcmVkZWNsYXJl
IGV4aXN0aW5nIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB1c2Ugb2YgYHNyY2AKLSAgaW4g
dGhlIGZvbGxvd2luZyBgYmluZC1hdHRyYCBleGFtcGxlIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhl
IGhhcmQgY29kZWQgdmFsdWUKLSAgb2YgYHNyYz0iL2ZhaWx3aGFsZS5naWYiYCB3aWxsIHRha2Ug
cHJlY2VkZW5jZToKLQotICBgYGBoYW5kbGViYXJzCi0gIDxpbWcgc3JjPSIvZmFpbHdoYWxlLmdp
ZiIge3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVybCIgYWx0PSJpbWFnZVRpdGxlIn19PgotICBgYGAK
LQotICAjIyMgYGJpbmQtYXR0cmAgYW5kIHRoZSBgY2xhc3NgIGF0dHJpYnV0ZQotCi0gIGBiaW5k
LWF0dHJgIHN1cHBvcnRzIGEgc3BlY2lhbCBzeW50YXggZm9yIGhhbmRsaW5nIGEgbnVtYmVyIG9m
IGNhc2VzIHVuaXF1ZQotICB0byB0aGUgYGNsYXNzYCBET00gZWxlbWVudCBhdHRyaWJ1dGUuIFRo
ZSBgY2xhc3NgIGF0dHJpYnV0ZSBjb21iaW5lcwotICBtdWx0aXBsZSBkaXNjcmV0ZSB2YWx1ZXMg
aW50byBhIHNpbmdsZSBhdHRyaWJ1dGUgYXMgYSBzcGFjZS1kZWxpbWl0ZWQKLSAgbGlzdCBvZiBz
dHJpbmdzLiBFYWNoIHN0cmluZyBjYW4gYmU6Ci0KLSAgKiBhIHN0cmluZyByZXR1cm4gdmFsdWUg
b2YgYW4gb2JqZWN0J3MgcHJvcGVydHkuCi0gICogYSBib29sZWFuIHJldHVybiB2YWx1ZSBvZiBh
biBvYmplY3QncyBwcm9wZXJ0eQotICAqIGEgaGFyZC1jb2RlZCB2YWx1ZQotCi0gIEEgc3RyaW5n
IHJldHVybiB2YWx1ZSB3b3JrcyBpZGVudGljYWxseSB0byBvdGhlciB1c2VzIG9mIGBiaW5kLWF0
dHJgLiBUaGUKLSAgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aWxsIGJlY29tZSB0aGUg
dmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gRm9yCi0gIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdmll
dyBhbmQgdGVtcGxhdGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICAgIEFWaWV3ID0gRW1iZXIuVmll
dy5leHRlbmQoewotICAgICAgc29tZVByb3BlcnR5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0
dXJuICJhVmFsdWUiOwotICAgICAgfS5wcm9wZXJ0eSgpCi0gICAgfSkKLSAgYGBgCi0KLSAgYGBg
aGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSJ2aWV3LnNvbWVQcm9wZXJ0eX19
PgotICBgYGAKLQotICBSZXN1bHQgaW4gdGhlIGZvbGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0K
LSAgYGBgaHRtbAotICA8aW1nIGNsYXNzPSJhVmFsdWUiPgotICBgYGAKLQotICBBIGJvb2xlYW4g
cmV0dXJuIHZhbHVlIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIGNsYXNzIG5hbWUgaWYgdGhlIHBy
b3BlcnR5Ci0gIHJldHVybnMgYHRydWVgIGFuZCByZW1vdmUgdGhlIGNsYXNzIG5hbWUgaWYgdGhl
IHByb3BlcnR5IHJldHVybnMgYGZhbHNlYC4KLQotICBBIGNsYXNzIG5hbWUgaXMgcHJvdmlkZWQg
dmlhIHRoZSBzeW50YXgKLSAgYHNvbWVQcm9wZXJ0eU5hbWU6Y2xhc3MtbmFtZS1pZi10cnVlYC4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHNv
bWVCb29sOiB0cnVlCi0gIH0pCi0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGltZyB7e2Jp
bmQtYXR0ciBjbGFzcz0idmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRydWUifX0+Ci0gIGBg
YAotCi0gIFJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJlbmRlcmVkIG91dHB1dDoKLQotICBgYGBo
dG1sCi0gIDxpbWcgY2xhc3M9ImNsYXNzLW5hbWUtaWYtdHJ1ZSI+Ci0gIGBgYAotCi0gIEFuIGFk
ZGl0aW9uYWwgc2VjdGlvbiBvZiB0aGUgYmluZGluZyBjYW4gYmUgcHJvdmlkZWQgaWYgeW91IHdh
bnQgdG8KLSAgcmVwbGFjZSB0aGUgZXhpc3RpbmcgY2xhc3MgaW5zdGVhZCBvZiByZW1vdmluZyBp
dCB3aGVuIHRoZSBib29sZWFuCi0gIHZhbHVlIGNoYW5nZXM6Ci0KLSAgYGBgaGFuZGxlYmFycwot
ICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSJ2aWV3LnNvbWVCb29sOmNsYXNzLW5hbWUtaWYtdHJ1
ZTpjbGFzcy1uYW1lLWlmLWZhbHNlIn19PgotICBgYGAKLQotICBBIGhhcmQtY29kZWQgdmFsdWUg
Y2FuIGJlIHVzZWQgYnkgcHJlcGVuZGluZyBgOmAgdG8gdGhlIGRlc2lyZWQKLSAgY2xhc3MgbmFt
ZTogYDpjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseWAuCi0KLSAgYGBgaGFuZGxlYmFycwotICA8
aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6Y2xhc3MtbmFtZS10by1hbHdheXMtYXBwbHkifX0+Ci0g
IGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0KLSAg
YGBgaHRtbAotICA8aW1nIGNsYXNzPSJjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseSI+Ci0gIGBg
YAotCi0gIEFsbCB0aHJlZSBzdHJhdGVnaWVzIC0gc3RyaW5nIHJldHVybiB2YWx1ZSwgYm9vbGVh
biByZXR1cm4gdmFsdWUsIGFuZAotICBoYXJkLWNvZGVkIHZhbHVlIOKAkyBjYW4gYmUgY29tYmlu
ZWQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb246Ci0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7
YmluZC1hdHRyIGNsYXNzPSI6Y2xhc3MtbmFtZS10by1hbHdheXMtYXBwbHkgdmlldy5zb21lQm9v
bDpjbGFzcy1uYW1lLWlmLXRydWUgdmlldy5zb21lUHJvcGVydHkifX0+Ci0gIGBgYAotCi0gIEBt
ZXRob2QgYmluZC1hdHRyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJh
bSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1i
ZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdiaW5kLWF0dHInLCBmdW5jdGlvbiBiaW5kQXR0
ckhlbHBlcihvcHRpb25zKSB7Ci0KLSAgdmFyIGF0dHJzID0gb3B0aW9ucy5oYXNoOwotCi0gIEVt
YmVyLmFzc2VydCgiWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgaGFzaCBhcmd1bWVudCB0
byBiaW5kLWF0dHIiLCAhIUVtYmVyLmtleXMoYXR0cnMpLmxlbmd0aCk7Ci0KLSAgdmFyIHZpZXcg
PSBvcHRpb25zLmRhdGEudmlldzsKLSAgdmFyIHJldCA9IFtdOwotICB2YXIgY3R4ID0gdGhpczsK
LQotICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBlbGVtZW50LiBUaGlzIHdpbGwg
YmUgYWRkZWQgYXMgYQotICAvLyBkYXRhIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVudCBzbyBpdCBj
YW4gYmUgbG9va2VkIHVwIHdoZW4KLSAgLy8gdGhlIGJvdW5kIHByb3BlcnR5IGNoYW5nZXMuCi0g
IHZhciBkYXRhSWQgPSArK0VtYmVyLnV1aWQ7Ci0KLSAgLy8gSGFuZGxlIGNsYXNzZXMgZGlmZmVy
ZW50bHksIGFzIHdlIGNhbiBiaW5kIG11bHRpcGxlIGNsYXNzZXMKLSAgdmFyIGNsYXNzQmluZGlu
Z3MgPSBhdHRyc1snY2xhc3MnXTsKLSAgaWYgKGNsYXNzQmluZGluZ3MgIT0gbnVsbCkgewotICAg
IHZhciBjbGFzc1Jlc3VsdHMgPSBFbWJlckhhbmRsZWJhcnMuYmluZENsYXNzZXModGhpcywgY2xh
c3NCaW5kaW5ncywgdmlldywgZGF0YUlkLCBvcHRpb25zKTsKLQotICAgIHJldC5wdXNoKCdjbGFz
cz0iJyArIEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihjbGFzc1Jlc3VsdHMuam9p
bignICcpKSArICciJyk7Ci0gICAgZGVsZXRlIGF0dHJzWydjbGFzcyddOwotICB9Ci0KLSAgdmFy
IGF0dHJLZXlzID0gRW1iZXIua2V5cyhhdHRycyk7Ci0KLSAgLy8gRm9yIGVhY2ggYXR0cmlidXRl
IHBhc3NlZCwgY3JlYXRlIGFuIG9ic2VydmVyIGFuZCBlbWl0IHRoZQotICAvLyBjdXJyZW50IHZh
bHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBhbiBhdHRyaWJ1dGUuCi0gIGZvckVhY2guY2FsbChhdHRy
S2V5cywgZnVuY3Rpb24oYXR0cikgewotICAgIHZhciBwYXRoID0gYXR0cnNbYXR0cl0sCi0gICAg
ICAgIG5vcm1hbGl6ZWQ7Ci0KLSAgICBFbWJlci5hc3NlcnQoZm10KCJZb3UgbXVzdCBwcm92aWRl
IGFuIGV4cHJlc3Npb24gYXMgdGhlIHZhbHVlIG9mIGJvdW5kIGF0dHJpYnV0ZS4gWW91IHNwZWNp
ZmllZDogJUA9JUAiLCBbYXR0ciwgcGF0aF0pLCB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpOwot
Ci0gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgoY3R4LCBwYXRoLCBvcHRpb25zLmRhdGEp
OwotCi0gICAgdmFyIHZhbHVlID0gKHBhdGggPT09ICd0aGlzJykgPyBub3JtYWxpemVkLnJvb3Qg
OiBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwgb3B0aW9ucyksCi0gICAgICAgIHR5cGUgPSBFbWJl
ci50eXBlT2YodmFsdWUpOwotCi0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiQXR0cmlidXRlcyBtdXN0
IGJlIG51bWJlcnMsIHN0cmluZ3Mgb3IgYm9vbGVhbnMsIG5vdCAlQCIsIFt2YWx1ZV0pLCB2YWx1
ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09ICdudW1iZXInIHx8
IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdib29sZWFuJyk7Ci0KLSAgICB2YXIgb2Jz
ZXJ2ZXIsIGludm9rZXI7Ci0KLSAgICBvYnNlcnZlciA9IGZ1bmN0aW9uIG9ic2VydmVyKCkgewot
ICAgICAgdmFyIHJlc3VsdCA9IGhhbmRsZWJhcnNHZXQoY3R4LCBwYXRoLCBvcHRpb25zKTsKLQot
ICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiQXR0cmlidXRlcyBtdXN0IGJlIG51bWJlcnMsIHN0cmlu
Z3Mgb3IgYm9vbGVhbnMsIG5vdCAlQCIsIFtyZXN1bHRdKSwKLSAgICAgICAgICAgICAgICAgICBy
ZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHJlc3VsdCA9
PT0gJ251bWJlcicgfHwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdz
dHJpbmcnIHx8IHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyk7Ci0KLSAgICAgIHZhciBlbGVt
ID0gdmlldy4kKCJbZGF0YS1iaW5kYXR0ci0iICsgZGF0YUlkICsgIj0nIiArIGRhdGFJZCArICIn
XSIpOwotCi0gICAgICAvLyBJZiB3ZSBhcmVuJ3QgYWJsZSB0byBmaW5kIHRoZSBlbGVtZW50LCBp
dCBtZWFucyB0aGUgZWxlbWVudAotICAgICAgLy8gdG8gd2hpY2ggd2Ugd2VyZSBib3VuZCBoYXMg
YmVlbiByZW1vdmVkIGZyb20gdGhlIHZpZXcuCi0gICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGNh
biBhc3N1bWUgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHJlLXJlbmRlcmVkCi0gICAgICAvLyBhbmQg
d2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgb2JzZXJ2ZXIuCi0gICAgICBpZiAoIWVsZW0gfHwgZWxl
bS5sZW5ndGggPT09IDApIHsKLSAgICAgICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIobm9ybWFsaXpl
ZC5yb290LCBub3JtYWxpemVkLnBhdGgsIGludm9rZXIpOwotICAgICAgICByZXR1cm47Ci0gICAg
ICB9Ci0KLSAgICAgIEVtYmVyLlZpZXcuYXBwbHlBdHRyaWJ1dGVCaW5kaW5ncyhlbGVtLCBhdHRy
LCByZXN1bHQpOwotICAgIH07Ci0KLSAgICAvLyBBZGQgYW4gb2JzZXJ2ZXIgdG8gdGhlIHZpZXcg
Zm9yIHdoZW4gdGhlIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgLy8gV2hlbiB0aGUgb2JzZXJ2ZXIg
ZmlyZXMsIGZpbmQgdGhlIGVsZW1lbnQgdXNpbmcgdGhlCi0gICAgLy8gdW5pcXVlIGRhdGEgaWQg
YW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRvIHRoZSBuZXcgdmFsdWUuCi0gICAgLy8gTm90ZTog
ZG9uJ3QgYWRkIG9ic2VydmVyIHdoZW4gcGF0aCBpcyAndGhpcycgb3IgcGF0aAotICAgIC8vIGlz
IHdob2xlIGtleXdvcmQgZS5nLiB7eyNlYWNoIHggaW4gbGlzdH19IC4uLiB7e2JpbmQtYXR0ciBh
dHRyPSJ4In19Ci0gICAgaWYgKHBhdGggIT09ICd0aGlzJyAmJiAhKG5vcm1hbGl6ZWQuaXNLZXl3
b3JkICYmIG5vcm1hbGl6ZWQucGF0aCA9PT0gJycgKSkgewotICAgICAgdmlldy5yZWdpc3Rlck9i
c2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0gICAg
fQotCi0gICAgLy8gaWYgdGhpcyBjaGFuZ2VzLCBhbHNvIGNoYW5nZSB0aGUgbG9naWMgaW4gZW1i
ZXItdmlld3MvbGliL3ZpZXdzL3ZpZXcuanMKLSAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8
ICh0eXBlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpKSkpIHsKLSAgICAgIHJldC5wdXNo
KGF0dHIgKyAnPSInICsgSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHZhbHVlKSAr
ICciJyk7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHsKLSAg
ICAgIC8vIFRoZSBkZXZlbG9wZXIgY29udHJvbHMgdGhlIGF0dHIgbmFtZSwgc28gaXQgc2hvdWxk
IGFsd2F5cyBiZSBzYWZlCi0gICAgICByZXQucHVzaChhdHRyICsgJz0iJyArIGF0dHIgKyAnIicp
OwotICAgIH0KLSAgfSwgdGhpcyk7Ci0KLSAgLy8gQWRkIHRoZSB1bmlxdWUgaWRlbnRpZmllcgot
ICAvLyBOT1RFOiBXZSB1c2UgYWxsIGxvd2VyLWNhc2Ugc2luY2UgRmlyZWZveCBoYXMgcHJvYmxl
bXMgd2l0aCBtaXhlZCBjYXNlIGluIFNWRwotICByZXQucHVzaCgnZGF0YS1iaW5kYXR0ci0nICsg
ZGF0YUlkICsgJz0iJyArIGRhdGFJZCArICciJyk7Ci0gIHJldHVybiBuZXcgRW1iZXJIYW5kbGVi
YXJzLlNhZmVTdHJpbmcocmV0LmpvaW4oJyAnKSk7Ci19KTsKLQotLyoqCi0gIFNlZSBgYmluZC1h
dHRyYAotCi0gIEBtZXRob2QgYmluZEF0dHIKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBl
cnMKLSAgQGRlcHJlY2F0ZWQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4dAotICBAcGFyYW0g
e0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVy
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmluZEF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhl
bHBlcigpIHsKLSAgRW1iZXIud2FybigiVGhlICdiaW5kQXR0cicgdmlldyBoZWxwZXIgaXMgZGVw
cmVjYXRlZCBpbiBmYXZvciBvZiAnYmluZC1hdHRyJyIpOwotICByZXR1cm4gRW1iZXJIYW5kbGVi
YXJzLmhlbHBlcnNbJ2JpbmQtYXR0ciddLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci19KTsKLQot
LyoqCi0gIEhlbHBlciB0aGF0LCBnaXZlbiBhIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgb2YgcHJv
cGVydHkgcGF0aHMgYW5kIGEgY29udGV4dCwKLSAgcmV0dXJucyBhbiBhcnJheSBvZiBjbGFzcyBu
YW1lcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHNvIGhhcyB0aGUgc2lkZQotICBlZmZlY3Qgb2Yg
c2V0dGluZyB1cCBvYnNlcnZlcnMgYXQgdGhvc2UgcHJvcGVydHkgcGF0aHMsIHN1Y2ggdGhhdCBp
ZiB0aGV5Ci0gIGNoYW5nZSwgdGhlIGNvcnJlY3QgY2xhc3MgbmFtZSB3aWxsIGJlIHJlYXBwbGll
ZCB0byB0aGUgRE9NIGVsZW1lbnQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIHRoZSBz
dHJpbmcgImZvb0JhciIsIGl0IHdpbGwgZmlyc3QgbG9vayB1cCB0aGUKLSAgImZvb0JhciIgdmFs
dWUgb2YgdGhlIGNvbnRleHQuIElmIHRoYXQgdmFsdWUgaXMgdHJ1ZSwgaXQgd2lsbCBhZGQgdGhl
Ci0gICJmb28tYmFyIiBjbGFzcyB0byB0aGUgY3VycmVudCBlbGVtZW50IChpLmUuLCB0aGUgZGFz
aGVyaXplZCBmb3JtIG9mCi0gICJmb29CYXIiKS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBp
dCB3aWxsIGFkZCB0aGF0IHN0cmluZyBhcyB0aGUgY2xhc3MuCi0gIE90aGVyd2lzZSwgaXQgd2ls
bCBub3QgYWRkIGFueSBuZXcgY2xhc3MgbmFtZS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGJp
bmRDbGFzc2VzCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge0VtYmVyLk9iamVj
dH0gY29udGV4dCBUaGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGxvb2t1cCBwcm9wZXJ0aWVzCi0g
IEBwYXJhbSB7U3RyaW5nfSBjbGFzc0JpbmRpbmdzIEEgc3RyaW5nLCBzcGFjZS1zZXBhcmF0ZWQs
IG9mIGNsYXNzIGJpbmRpbmdzCi0gICAgdG8gdXNlCi0gIEBwYXJhbSB7RW1iZXIuVmlld30gdmll
dyBUaGUgdmlldyBpbiB3aGljaCBvYnNlcnZlcnMgc2hvdWxkIGxvb2sgZm9yIHRoZQotICAgIGVs
ZW1lbnQgdG8gdXBkYXRlCi0gIEBwYXJhbSB7U3J0aW5nfSBiaW5kQXR0cklkIE9wdGlvbmFsIGJp
bmRBdHRyIGlkIHVzZWQgdG8gbG9va3VwIGVsZW1lbnRzCi0gIEByZXR1cm4ge0FycmF5fSBBbiBh
cnJheSBvZiBjbGFzcyBuYW1lcyB0byBhZGQKLSovCi1FbWJlckhhbmRsZWJhcnMuYmluZENsYXNz
ZXMgPSBmdW5jdGlvbihjb250ZXh0LCBjbGFzc0JpbmRpbmdzLCB2aWV3LCBiaW5kQXR0cklkLCBv
cHRpb25zKSB7Ci0gIHZhciByZXQgPSBbXSwgbmV3Q2xhc3MsIHZhbHVlLCBlbGVtOwotCi0gIC8v
IEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIGNvbnRleHQg
YW5kCi0gIC8vIGRldGVybWluZSB3aGljaCBjbGFzcyBzdHJpbmcgdG8gcmV0dXJuLCBiYXNlZCBv
biB3aGV0aGVyIGl0IGlzCi0gIC8vIGEgQm9vbGVhbiBvciBub3QuCi0gIHZhciBjbGFzc1N0cmlu
Z0ZvclBhdGggPSBmdW5jdGlvbihyb290LCBwYXJzZWRQYXRoLCBvcHRpb25zKSB7Ci0gICAgdmFy
IHZhbCwKLSAgICAgICAgcGF0aCA9IHBhcnNlZFBhdGgucGF0aDsKLQotICAgIGlmIChwYXRoID09
PSAndGhpcycpIHsKLSAgICAgIHZhbCA9IHJvb3Q7Ci0gICAgfSBlbHNlIGlmIChwYXRoID09PSAn
JykgewotICAgICAgdmFsID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgdmFsID0gaGFuZGxl
YmFyc0dldChyb290LCBwYXRoLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRW1iZXIu
Vmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXRoLCB2YWwsIHBhcnNlZFBhdGguY2xhc3NOYW1l
LCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKLSAgfTsKLQotICAvLyBGb3IgZWFjaCBwcm9w
ZXJ0eSBwYXNzZWQsIGxvb3AgdGhyb3VnaCBhbmQgc2V0dXAKLSAgLy8gYW4gb2JzZXJ2ZXIuCi0g
IGZvckVhY2guY2FsbChjbGFzc0JpbmRpbmdzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGJpbmRpbmcp
IHsKLQotICAgIC8vIFZhcmlhYmxlIGluIHdoaWNoIHRoZSBvbGQgY2xhc3MgdmFsdWUgaXMgc2F2
ZWQuIFRoZSBvYnNlcnZlciBmdW5jdGlvbgotICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFi
bGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmluZyB0byByZW1vdmUgd2hlbgotICAgIC8vIHRoZSBw
cm9wZXJ0eSBjaGFuZ2VzLgotICAgIHZhciBvbGRDbGFzczsKLQotICAgIHZhciBvYnNlcnZlciwg
aW52b2tlcjsKLQotICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0
eVBhdGgoYmluZGluZyksCi0gICAgICAgIHBhdGggPSBwYXJzZWRQYXRoLnBhdGgsCi0gICAgICAg
IHBhdGhSb290ID0gY29udGV4dCwKLSAgICAgICAgbm9ybWFsaXplZDsKLQotICAgIGlmIChwYXRo
ICE9PSAnJyAmJiBwYXRoICE9PSAndGhpcycpIHsKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxp
emVQYXRoKGNvbnRleHQsIHBhdGgsIG9wdGlvbnMuZGF0YSk7Ci0KLSAgICAgIHBhdGhSb290ID0g
bm9ybWFsaXplZC5yb290OwotICAgICAgcGF0aCA9IG5vcm1hbGl6ZWQucGF0aDsKLSAgICB9Ci0K
LSAgICAvLyBTZXQgdXAgYW4gb2JzZXJ2ZXIgb24gdGhlIGNvbnRleHQuIElmIHRoZSBwcm9wZXJ0
eSBjaGFuZ2VzLCB0b2dnbGUgdGhlCi0gICAgLy8gY2xhc3MgbmFtZS4KLSAgICBvYnNlcnZlciA9
IGZ1bmN0aW9uKCkgewotICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9w
ZXJ0eQotICAgICAgbmV3Q2xhc3MgPSBjbGFzc1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFyc2Vk
UGF0aCwgb3B0aW9ucyk7Ci0gICAgICBlbGVtID0gYmluZEF0dHJJZCA/IHZpZXcuJCgiW2RhdGEt
YmluZGF0dHItIiArIGJpbmRBdHRySWQgKyAiPSciICsgYmluZEF0dHJJZCArICInXSIpIDogdmll
dy4kKCk7Ci0KLSAgICAgIC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwg
YSBwYXJlbnQgdGVtcGxhdGUgaGFzIGJlZW4KLSAgICAgIC8vIHJlLXJlbmRlcmVkIGFuZCB3ZSd2
ZSBiZWVuIG51a2VkLiBSZW1vdmUgdGhlIG9ic2VydmVyLgotICAgICAgaWYgKCFlbGVtIHx8IGVs
ZW0ubGVuZ3RoID09PSAwKSB7Ci0gICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHBhdGhSb290
LCBwYXRoLCBpbnZva2VyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBw
cmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8gdGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KLSAgICAg
ICAgaWYgKG9sZENsYXNzKSB7Ci0gICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBuZWNlc3NhcnksIGFkZCBhIG5ldyBjbGFzcy4g
TWFrZSBzdXJlIHdlIGtlZXAgdHJhY2sgb2YgaXQgc28KLSAgICAgICAgLy8gaXQgY2FuIGJlIHJl
bW92ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgaWYgKG5ld0NsYXNzKSB7Ci0gICAgICAgICAg
ZWxlbS5hZGRDbGFzcyhuZXdDbGFzcyk7Ci0gICAgICAgICAgb2xkQ2xhc3MgPSBuZXdDbGFzczsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvbGRDbGFzcyA9IG51bGw7Ci0gICAgICAgIH0K
LSAgICAgIH0KLSAgICB9OwotCi0gICAgaWYgKHBhdGggIT09ICcnICYmIHBhdGggIT09ICd0aGlz
JykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBvYnNlcnZl
cik7Ci0gICAgfQotCi0gICAgLy8gV2UndmUgYWxyZWFkeSBzZXR1cCB0aGUgb2JzZXJ2ZXI7IG5v
dyB3ZSBqdXN0IG5lZWQgdG8gZmlndXJlIG91dCB0aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9y
IHJpZ2h0IG5vdyBvbiB0aGUgZmlyc3QgcGFzcyB0aHJvdWdoLgotICAgIHZhbHVlID0gY2xhc3NT
dHJpbmdGb3JQYXRoKGNvbnRleHQsIHBhcnNlZFBhdGgsIG9wdGlvbnMpOwotCi0gICAgaWYgKHZh
bHVlKSB7Ci0gICAgICByZXQucHVzaCh2YWx1ZSk7Ci0KLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBz
YXZlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHJlbW92ZWQgaWYgdGhlCi0g
ICAgICAvLyBvYnNlcnZlciBmaXJlcy4KLSAgICAgIG9sZENsYXNzID0gdmFsdWU7Ci0gICAgfQot
ICB9KTsKLQotICByZXR1cm4gcmV0OwotfTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KLQotLy8gVE9ETzogRG9uJ3QgcmVxdWlyZSB0aGUg
ZW50aXJlIG1vZHVsZQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRs
ZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBF
bWJlckhhbmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJzOwotdmFyIExPV0VSQ0FTRV9BX1ogPSAv
XlthLXpdLzsKLXZhciBWSUVXX1BSRUZJWCA9IC9edmlld1wuLzsKLQotZnVuY3Rpb24gbWFrZUJp
bmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25zKSB7Ci0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNo
LAotICAgICAgaGFzaFR5cGUgPSBvcHRpb25zLmhhc2hUeXBlczsKLQotICBmb3IgKHZhciBwcm9w
IGluIGhhc2gpIHsKLSAgICBpZiAoaGFzaFR5cGVbcHJvcF0gPT09ICdJRCcpIHsKLQotICAgICAg
dmFyIHZhbHVlID0gaGFzaFtwcm9wXTsKLQotICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVz
dChwcm9wKSkgewotICAgICAgICBFbWJlci53YXJuKCJZb3UncmUgYXR0ZW1wdGluZyB0byByZW5k
ZXIgYSB2aWV3IGJ5IHBhc3NpbmcgIiArIHByb3AgKyAiPSIgKyB2YWx1ZSArICIgdG8gYSB2aWV3
IGhlbHBlciwgYnV0IHRoaXMgc3ludGF4IGlzIGFtYmlndW91cy4gWW91IHNob3VsZCBlaXRoZXIg
c3Vycm91bmQgIiArIHZhbHVlICsgIiBpbiBxdW90ZXMgb3IgcmVtb3ZlIGBCaW5kaW5nYCBmcm9t
ICIgKyBwcm9wICsgIi4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhc2hbcHJvcCArICdC
aW5kaW5nJ10gPSB2YWx1ZTsKLSAgICAgICAgaGFzaFR5cGVbcHJvcCArICdCaW5kaW5nJ10gPSAn
U1RSSU5HJzsKLSAgICAgICAgZGVsZXRlIGhhc2hbcHJvcF07Ci0gICAgICAgIGRlbGV0ZSBoYXNo
VHlwZVtwcm9wXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzaC5oYXNPd25Qcm9w
ZXJ0eSgnaWRCaW5kaW5nJykpIHsKLSAgICAvLyBpZCBjYW4ndCBiZSBib3VuZCwgc28ganVzdCBw
ZXJmb3JtIG9uZS10aW1lIGxvb2t1cC4KLSAgICBoYXNoLmlkID0gRW1iZXJIYW5kbGViYXJzLmdl
dCh0aGlzQ29udGV4dCwgaGFzaC5pZEJpbmRpbmcsIG9wdGlvbnMpOwotICAgIGhhc2hUeXBlLmlk
ID0gJ1NUUklORyc7Ci0gICAgZGVsZXRlIGhhc2guaWRCaW5kaW5nOwotICAgIGRlbGV0ZSBoYXNo
VHlwZS5pZEJpbmRpbmc7Ci0gIH0KLX0KLQotRW1iZXJIYW5kbGViYXJzLlZpZXdIZWxwZXIgPSBF
bWJlci5PYmplY3QuY3JlYXRlKHsKLQotICBwcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zOiBmdW5j
dGlvbihvcHRpb25zKSB7Ci0gICAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsIGRhdGEgPSBvcHRp
b25zLmRhdGE7Ci0gICAgdmFyIGV4dGVuc2lvbnMgPSB7fSwKLSAgICAgICAgY2xhc3NlcyA9IGhh
c2hbJ2NsYXNzJ10sCi0gICAgICAgIGR1cCA9IGZhbHNlOwotCi0gICAgaWYgKGhhc2guaWQpIHsK
LSAgICAgIGV4dGVuc2lvbnMuZWxlbWVudElkID0gaGFzaC5pZDsKLSAgICAgIGR1cCA9IHRydWU7
Ci0gICAgfQotCi0gICAgaWYgKGhhc2gudGFnKSB7Ci0gICAgICBleHRlbnNpb25zLnRhZ05hbWUg
PSBoYXNoLnRhZzsKLSAgICAgIGR1cCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzZXMp
IHsKLSAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7Ci0gICAgICBleHRlbnNpb25z
LmNsYXNzTmFtZXMgPSBjbGFzc2VzOwotICAgICAgZHVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAoaGFzaC5jbGFzc0JpbmRpbmcpIHsKLSAgICAgIGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGlu
Z3MgPSBoYXNoLmNsYXNzQmluZGluZy5zcGxpdCgnICcpOwotICAgICAgZHVwID0gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBpZiAoaGFzaC5jbGFzc05hbWVCaW5kaW5ncykgewotICAgICAgaWYgKGV4dGVu
c2lvbnMuY2xhc3NOYW1lQmluZGluZ3MgPT09IHVuZGVmaW5lZCkgZXh0ZW5zaW9ucy5jbGFzc05h
bWVCaW5kaW5ncyA9IFtdOwotICAgICAgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGV4
dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MuY29uY2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Mu
c3BsaXQoJyAnKSk7Ci0gICAgICBkdXAgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNoLmF0
dHJpYnV0ZUJpbmRpbmdzKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIlNldHRpbmcgJ2F0dHJpYnV0
ZUJpbmRpbmdzJyB2aWEgSGFuZGxlYmFycyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHN1YmNsYXNz
IEVtYmVyLlZpZXcgYW5kIHNldCBpdCB0aGVyZSBpbnN0ZWFkLiIpOwotICAgICAgZXh0ZW5zaW9u
cy5hdHRyaWJ1dGVCaW5kaW5ncyA9IG51bGw7Ci0gICAgICBkdXAgPSB0cnVlOwotICAgIH0KLQot
ICAgIGlmIChkdXApIHsKLSAgICAgIGhhc2ggPSBFbWJlci4kLmV4dGVuZCh7fSwgaGFzaCk7Ci0g
ICAgICBkZWxldGUgaGFzaC5pZDsKLSAgICAgIGRlbGV0ZSBoYXNoLnRhZzsKLSAgICAgIGRlbGV0
ZSBoYXNoWydjbGFzcyddOwotICAgICAgZGVsZXRlIGhhc2guY2xhc3NCaW5kaW5nOwotICAgIH0K
LQotICAgIC8vIFNldCB0aGUgcHJvcGVyIGNvbnRleHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQg
dG8gdGhlIGhlbHBlci4gVGhpcyBhcHBsaWVzIHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdz
Ci0gICAgLy8gYXMgd2VsbCBhcyBjbGFzcyBuYW1lIGJpbmRpbmdzLiBJZiB0aGUgYmluZGluZ3Mg
YXJlIGxvY2FsLCBtYWtlIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dAotICAg
IC8vIGluc3RlYWQgb2YgdGhlIHZpZXcuCi0gICAgdmFyIHBhdGg7Ci0KLSAgICAvLyBFdmFsdWF0
ZSB0aGUgY29udGV4dCBvZiByZWd1bGFyIGF0dHJpYnV0ZSBiaW5kaW5nczoKLSAgICBmb3IgKHZh
ciBwcm9wIGluIGhhc2gpIHsKLSAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkg
eyBjb250aW51ZTsgfQotCi0gICAgICAvLyBUZXN0IGlmIHRoZSBwcm9wZXJ0eSBlbmRzIGluICJC
aW5kaW5nIgotICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChwcm9wKSAmJiB0eXBlb2Yg
aGFzaFtwcm9wXSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVh
bGl6ZUJpbmRpbmdQYXRoKGhhc2hbcHJvcF0sIGRhdGEpOwotICAgICAgICBpZiAocGF0aCkgeyBo
YXNoW3Byb3BdID0gcGF0aDsgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEV2YWx1YXRlIHRo
ZSBjb250ZXh0IG9mIGNsYXNzIG5hbWUgYmluZGluZ3M6Ci0gICAgaWYgKGV4dGVuc2lvbnMuY2xh
c3NOYW1lQmluZGluZ3MpIHsKLSAgICAgIGZvciAodmFyIGIgaW4gZXh0ZW5zaW9ucy5jbGFzc05h
bWVCaW5kaW5ncykgewotICAgICAgICB2YXIgZnVsbCA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmlu
ZGluZ3NbYl07Ci0gICAgICAgIGlmICh0eXBlb2YgZnVsbCA9PT0gJ3N0cmluZycpIHsKLSAgICAg
ICAgICAvLyBDb250ZXh0dWFsaXplIHRoZSBwYXRoIG9mIGNsYXNzTmFtZUJpbmRpbmcgc28gdGhp
czoKLSAgICAgICAgICAvLwotICAgICAgICAgIC8vICAgICBjbGFzc05hbWVCaW5kaW5nPSJpc0dy
ZWVuOmdyZWVuIgotICAgICAgICAgIC8vCi0gICAgICAgICAgLy8gaXMgY29udmVydGVkIHRvIHRo
aXM6Ci0gICAgICAgICAgLy8KLSAgICAgICAgICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0iX3Bh
cmVudFZpZXcuY29udGV4dC5pc0dyZWVuOmdyZWVuIgotICAgICAgICAgIHZhciBwYXJzZWRQYXRo
ID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoZnVsbCk7Ci0gICAgICAgICAgcGF0aCA9
IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKHBhcnNlZFBhdGgucGF0aCwgZGF0YSk7Ci0g
ICAgICAgICAgaWYgKHBhdGgpIHsgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXSA9IHBh
dGggKyBwYXJzZWRQYXRoLmNsYXNzTmFtZXM7IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiBFbWJlci4kLmV4dGVuZChoYXNoLCBleHRlbnNpb25zKTsKLSAgfSwKLQot
ICAvLyBUcmFuc2Zvcm0gYmluZGluZ3MgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IHRvIGEgY29u
dGV4dCB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgd2l0aGluIHRoZSB2aWV3LgotICAvLyBSZXR1cm5z
IG51bGwgaWYgdGhlIHBhdGggc2hvdWxkbid0IGJlIGNoYW5nZWQuCi0gIC8vCi0gIC8vIFRPRE86
IGNvbnNpZGVyIHRoZSBhZGRpdGlvbiBvZiBhIHByZWZpeCB0aGF0IHdvdWxkIGFsbG93IHRoaXMg
bWV0aG9kIHRvIHJldHVybiBgcGF0aGAuCi0gIGNvbnRleHR1YWxpemVCaW5kaW5nUGF0aDogZnVu
Y3Rpb24ocGF0aCwgZGF0YSkgewotICAgIHZhciBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFy
cy5ub3JtYWxpemVQYXRoKG51bGwsIHBhdGgsIGRhdGEpOwotICAgIGlmIChub3JtYWxpemVkLmlz
S2V5d29yZCkgewotICAgICAgcmV0dXJuICd0ZW1wbGF0ZURhdGEua2V5d29yZHMuJyArIHBhdGg7
Ci0gICAgfSBlbHNlIGlmIChFbWJlci5pc0dsb2JhbFBhdGgocGF0aCkpIHsKLSAgICAgIHJldHVy
biBudWxsOwotICAgIH0gZWxzZSBpZiAocGF0aCA9PT0gJ3RoaXMnIHx8IHBhdGggPT09ICcnKSB7
Ci0gICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRleHQnOwotICAgIH0gZWxzZSB7Ci0gICAg
ICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRleHQuJyArIHBhdGg7Ci0gICAgfQotICB9LAotCi0g
IGhlbHBlcjogZnVuY3Rpb24odGhpc0NvbnRleHQsIHBhdGgsIG9wdGlvbnMpIHsKLSAgICB2YXIg
ZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAgICAgICAgZm4gPSBvcHRpb25zLmZuLAotICAgICAgICBu
ZXdWaWV3OwotCi0gICAgbWFrZUJpbmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25zKTsKLQotICAg
IGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHBhdGgpIHsKLQotICAgICAgLy8gVE9ETzogdGhpcyBp
cyBhIGxhbWUgY29uZGl0aW9uYWwsIHRoaXMgc2hvdWxkIGxpa2VseSBjaGFuZ2UKLSAgICAgIC8v
IGJ1dCBzb21ldGhpbmcgYWxvbmcgdGhlc2UgbGluZXMgd2lsbCBsaWtlbHkgbmVlZCB0byBiZSBh
ZGRlZAotICAgICAgLy8gYXMgZGVwcmVjYXRpb24gd2FybmluZ3MKLSAgICAgIC8vCi0gICAgICBp
ZiAob3B0aW9ucy50eXBlc1swXSA9PT0gJ1NUUklORycgJiYgTE9XRVJDQVNFX0FfWi50ZXN0KHBh
dGgpICYmICFWSUVXX1BSRUZJWC50ZXN0KHBhdGgpKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgi
VmlldyByZXF1aXJlcyBhIGNvbnRhaW5lciIsICEhZGF0YS52aWV3LmNvbnRhaW5lcik7Ci0gICAg
ICAgIG5ld1ZpZXcgPSBkYXRhLnZpZXcuY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ3ZpZXc6JyAr
IHBhdGgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3VmlldyA9IEVtYmVySGFuZGxlYmFy
cy5nZXQodGhpc0NvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwotICAgICAgfQotCi0gICAgICBFbWJl
ci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIHZpZXcgYXQgcGF0aCAnIiArIHBhdGggKyAiJyIsICEh
bmV3Vmlldyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5ld1ZpZXcgPSBwYXRoOwotICAgIH0KLQot
ICAgIEVtYmVyLmFzc2VydChFbWJlci5TdHJpbmcuZm10KCdZb3UgbXVzdCBwYXNzIGEgdmlldyB0
byB0aGUgI3ZpZXcgaGVscGVyLCBub3QgJUAgKCVAKScsIFtwYXRoLCBuZXdWaWV3XSksIEVtYmVy
LlZpZXcuZGV0ZWN0KG5ld1ZpZXcpIHx8IEVtYmVyLlZpZXcuZGV0ZWN0SW5zdGFuY2UobmV3Vmll
dykpOwotCi0gICAgdmFyIHZpZXdPcHRpb25zID0gdGhpcy5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRp
b25zKG9wdGlvbnMsIHRoaXNDb250ZXh0KTsKLSAgICB2YXIgY3VycmVudFZpZXcgPSBkYXRhLnZp
ZXc7Ci0gICAgdmlld09wdGlvbnMudGVtcGxhdGVEYXRhID0gZGF0YTsKLSAgICB2YXIgbmV3Vmll
d1Byb3RvID0gbmV3Vmlldy5wcm90byA/IG5ld1ZpZXcucHJvdG8oKSA6IG5ld1ZpZXc7Ci0KLSAg
ICBpZiAoZm4pIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwcm92aWRlIGEgdGVt
cGxhdGUgYmxvY2sgaWYgeW91IGFsc28gc3BlY2lmaWVkIGEgdGVtcGxhdGVOYW1lIiwgIWdldCh2
aWV3T3B0aW9ucywgJ3RlbXBsYXRlTmFtZScpICYmICFnZXQobmV3Vmlld1Byb3RvLCAndGVtcGxh
dGVOYW1lJykpOwotICAgICAgdmlld09wdGlvbnMudGVtcGxhdGUgPSBmbjsKLSAgICB9Ci0KLSAg
ICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBfY29udGV4dGAgY29tcHV0ZWQgcHJv
cGVydHkgaWYgdGhlcmUgaXMKLSAgICAvLyBubyBzcGVjaWZpZWQgY29udHJvbGxlci4gU2VlIFZp
ZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgaWYgKCFuZXdWaWV3UHJvdG8u
Y29udHJvbGxlciAmJiAhbmV3Vmlld1Byb3RvLmNvbnRyb2xsZXJCaW5kaW5nICYmICF2aWV3T3B0
aW9ucy5jb250cm9sbGVyICYmICF2aWV3T3B0aW9ucy5jb250cm9sbGVyQmluZGluZykgewotICAg
ICAgdmlld09wdGlvbnMuX2NvbnRleHQgPSB0aGlzQ29udGV4dDsKLSAgICB9Ci0KLSAgICBjdXJy
ZW50Vmlldy5hcHBlbmRDaGlsZChuZXdWaWV3LCB2aWV3T3B0aW9ucyk7Ci0gIH0KLX0pOwotCi0v
KioKLSAgYHt7dmlld319YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YCBp
bnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMKLSAgb3B0aW9ucyB0byB0aGUgYEVtYmVyLlZpZXdg
J3MgYGNyZWF0ZWAgbWV0aG9kIGFuZCB1c2luZyB0aGUgc3VwcGxpZWQgYmxvY2sgYXMKLSAgdGhl
IHZpZXcncyBvd24gdGVtcGxhdGUuCi0KLSAgQW4gZW1wdHkgYDxib2R5PmAgYW5kIHRoZSBmb2xs
b3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFuZGxlYmFycwotICBBIHNwYW46Ci0gIHt7I3ZpZXcg
dGFnTmFtZT0ic3BhbiJ9fQotICAgIGhlbGxvLgotICB7ey92aWV3fX0KLSAgYGBgCi0KLSAgV2ls
bCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8Ym9keT4KLSAgICA8
IS0tIE5vdGU6IHRoZSBoYW5kbGViYXJzIHRlbXBsYXRlIHNjcmlwdAotICAgICAgICAgYWxzbyBy
ZXN1bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIuVmlldwotICAgICAgICAgd2hpY2ggaXMgdGhlIG91
dGVyIDxkaXY+IGhlcmUgLS0+Ci0KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAg
IEEgc3BhbjoKLSAgICAgIDxzcGFuIGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAg
ICAgICAgSGVsbG8uCi0gICAgICA8L3NwYW4+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLSAgYGBg
Ci0KLSAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0aW5nCi0KLSAgVGhlIGBwYXJlbnRWaWV3YCBwcm9w
ZXJ0eSBvZiB0aGUgbmV3IGBFbWJlci5WaWV3YCBpbnN0YW5jZSBjcmVhdGVkIHRocm91Z2gKLSAg
YHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0aGUgYEVtYmVyLlZpZXdgIGluc3RhbmNlIG9mIHRo
ZSB0ZW1wbGF0ZSB3aGVyZQotICBge3t2aWV3fX1gIHdhcyBjYWxsZWQuCi0KLSAgYGBgamF2YXNj
cmlwdAotICBhVmlldyA9IEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIu
SGFuZGxlYmFycy5jb21waWxlKCJ7eyN2aWV3fX0gbXkgcGFyZW50OiB7e3BhcmVudFZpZXcuZWxl
bWVudElkfX0ge3svdmlld319IikKLSAgfSk7Ci0KLSAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsK
LSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAot
ICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICA8ZGl2IGlkPSJlbWJl
cjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgIG15IHBhcmVudDogZW1iZXIxCi0gICAgPC9k
aXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMgU2V0dGluZyBDU1MgaWQgYW5kIGNsYXNzIGF0
dHJpYnV0ZXMKLQotICBUaGUgSFRNTCBgaWRgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBg
e3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQgd2l0aAotICB0aGUgYGlkYCBvcHRpb24uIFRo
aXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFzc2VkIHRvIGBFbWJlci5WaWV3LmNyZWF0ZWAuCi0K
LSAgYGBgaGFuZGxlYmFycwotICB7eyN2aWV3IHRhZ05hbWU9InNwYW4iIGlkPSJhLWN1c3RvbS1p
ZCJ9fQotICAgIGhlbGxvLgotICB7ey92aWV3fX0KLSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUg
Zm9sbG93aW5nIEhUTUwgc3RydWN0dXJlOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1i
ZXItdmlldyI+Ci0gICAgPHNwYW4gaWQ9ImEtY3VzdG9tLWlkIiBjbGFzcz0iZW1iZXItdmlldyI+
Ci0gICAgICBoZWxsby4KLSAgICA8L3NwYW4+Ci0gIDwvZGl2PgotICBgYGAKLQotICBUaGUgSFRN
TCBgY2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0
aW5nIGVsZW1lbnQKLSAgd2l0aCB0aGUgYGNsYXNzYCBvciBgY2xhc3NOYW1lQmluZGluZ3NgIG9w
dGlvbnMuIFRoZSBgY2xhc3NgIG9wdGlvbiB3aWxsCi0gIGRpcmVjdGx5IHNldCB0aGUgQ1NTIGBj
bGFzc2AgYXR0cmlidXRlIGFuZCB3aWxsIG5vdCBiZSBwYXNzZWQgdG8KLSAgYEVtYmVyLlZpZXcu
Y3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdzYCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRlYCBh
bmQgdXNlCi0gIGBFbWJlci5WaWV3YCdzIGNsYXNzIG5hbWUgYmluZGluZyBmdW5jdGlvbmFsaXR5
OgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjdmlldyB0YWdOYW1lPSJzcGFuIiBjbGFzcz0iYS1j
dXN0b20tY2xhc3MifX0KLSAgICBoZWxsby4KLSAge3svdmlld319Ci0gIGBgYAotCi0gIFJlc3Vs
dHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToKLQotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxzcGFuIGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12
aWV3IGEtY3VzdG9tLWNsYXNzIj4KLSAgICAgIGhlbGxvLgotICAgIDwvc3Bhbj4KLSAgPC9kaXY+
Ci0gIGBgYAotCi0gICMjIyBTdXBwbHlpbmcgYSBkaWZmZXJlbnQgdmlldyBjbGFzcwotCi0gIGB7
e3ZpZXd9fWAgY2FuIHRha2UgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBz
dXBwbGllZCBvcHRpb25zIHRvCi0gIHNwZWNpZnkgYSBwYXRoIHRvIGEgY3VzdG9tIHZpZXcgY2xh
c3MuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyN2aWV3ICJNeUFwcC5DdXN0b21WaWV3In19Ci0g
ICAgaGVsbG8uCi0gIHt7L3ZpZXd9fQotICBgYGAKLQotICBUaGUgZmlyc3QgYXJndW1lbnQgY2Fu
IGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoIGFjY2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAotICBj
b250ZXh0LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5j
cmVhdGUoe30pOwotICBNeUFwcC5PdXRlclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
aW5uZXJWaWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZXM6IFsn
YS1jdXN0b20tdmlldy1jbGFzcy1hcy1wcm9wZXJ0eSddCi0gICAgfSksCi0gICAgdGVtcGxhdGU6
IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgne3sjdmlldyAidmlldy5pbm5lclZpZXdDbGFzcyJ9
fSBoaSB7ey92aWV3fX0nKQotICB9KTsKLQotICBNeUFwcC5PdXRlclZpZXcuY3JlYXRlKCkuYXBw
ZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBI
VE1MOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+
Ci0gICAgPGRpdiBpZD0iZW1iZXIyIiBjbGFzcz0iZW1iZXItdmlldyBhLWN1c3RvbS12aWV3LWNs
YXNzLWFzLXByb3BlcnR5Ij4KLSAgICAgIGhpCi0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAK
LQotICAjIyMgQmxvY2tsZXNzIHVzZQotCi0gIElmIHlvdSBzdXBwbHkgYSBjdXN0b20gYEVtYmVy
LlZpZXdgIHN1YmNsYXNzIHRoYXQgc3BlY2lmaWVzIGl0cyBvd24gdGVtcGxhdGUKLSAgb3IgcHJv
dmlkZSBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlvbiB0byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2Vk
IHdpdGhvdXQKLSAgc3VwcGx5aW5nIGEgYmxvY2suIEF0dGVtcHRzIHRvIHVzZSBib3RoIGEgYHRl
bXBsYXRlTmFtZWAgb3B0aW9uIGFuZCBzdXBwbHkgYQotICBibG9jayB3aWxsIHRocm93IGFuIGVy
cm9yLgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t2aWV3ICJNeUFwcC5WaWV3V2l0aEFUZW1wbGF0
ZURlZmluZWQifX0KLSAgYGBgCi0KLSAgIyMjIGB2aWV3TmFtZWAgcHJvcGVydHkKLQotICBZb3Ug
Y2FuIHN1cHBseSBhIGB2aWV3TmFtZWAgb3B0aW9uIHRvIGB7e3ZpZXd9fWAuIFRoZSBgRW1iZXIu
Vmlld2AgaW5zdGFuY2UKLSAgd2lsbCBiZSByZWZlcmVuY2VkIGFzIGEgcHJvcGVydHkgb2YgaXRz
IHBhcmVudCB2aWV3IGJ5IHRoaXMgbmFtZS4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIGFWaWV3ID0g
RW1iZXIuVmlldy5jcmVhdGUoewotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBp
bGUoJ3t7I3ZpZXcgdmlld05hbWU9ImFDaGlsZEJ5TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQotICB9
KTsKLQotICBhVmlldy5hcHBlbmRUbygnYm9keScpOwotICBhVmlldy5nZXQoJ2FDaGlsZEJ5TmFt
ZScpIC8vIHRoZSBpbnN0YW5jZSBvZiBFbWJlci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3fX0gaGVs
cGVyCi0gIGBgYAotCi0gIEBtZXRob2QgdmlldwotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVs
cGVycwotICBAcGFyYW0ge1N0cmluZ30gcGF0aAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAg
QHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3Rl
ckhlbHBlcigndmlldycsIGZ1bmN0aW9uIHZpZXdIZWxwZXIocGF0aCwgb3B0aW9ucykgewotICBF
bWJlci5hc3NlcnQoIlRoZSB2aWV3IGhlbHBlciBvbmx5IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50
IiwgYXJndW1lbnRzLmxlbmd0aCA8PSAyKTsKLQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVk
LCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAm
JiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0
aCA9ICJFbWJlci5WaWV3IjsKLSAgfQotCi0gIHJldHVybiBFbWJlckhhbmRsZWJhcnMuVmlld0hl
bHBlci5oZWxwZXIodGhpcywgcGF0aCwgb3B0aW9ucyk7Ci19KTsKLQotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotLy8gVE9ETzogRG9uJ3QgcmVxdWlyZSBhbGwgb2YgdGhpcyBtb2R1bGUK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12
YXIgZ2V0ID0gRW1iZXIuZ2V0LCBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQs
IGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBge3tjb2xsZWN0aW9ufX1gIGlzIGEg
YEVtYmVyLkhhbmRsZWJhcnNgIGhlbHBlciBmb3IgYWRkaW5nIGluc3RhbmNlcyBvZgotICBgRW1i
ZXIuQ29sbGVjdGlvblZpZXdgIHRvIGEgdGVtcGxhdGUuIFNlZSBbRW1iZXIuQ29sbGVjdGlvblZp
ZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5Db2xsZWN0aW9uVmlldy5odG1sKQotICAgZm9yIGFkZGl0
aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEgYENvbGxlY3Rpb25WaWV3YCBmdW5jdGlvbnMuCi0K
LSAgYHt7Y29sbGVjdGlvbn19YCdzIHByaW1hcnkgdXNlIGlzIGFzIGEgYmxvY2sgaGVscGVyIHdp
dGggYSBgY29udGVudEJpbmRpbmdgCi0gIG9wdGlvbiBwb2ludGluZyB0b3dhcmRzIGFuIGBFbWJl
ci5BcnJheWAtY29tcGF0aWJsZSBvYmplY3QuIEFuIGBFbWJlci5WaWV3YAotICBpbnN0YW5jZSB3
aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaXRlbSBpbiBpdHMgYGNvbnRlbnRgIHByb3BlcnR5LiBF
YWNoIHZpZXcKLSAgd2lsbCBoYXZlIGl0cyBvd24gYGNvbnRlbnRgIHByb3BlcnR5IHNldCB0byB0
aGUgYXBwcm9wcmlhdGUgaXRlbSBpbiB0aGUKLSAgY29sbGVjdGlvbi4KLQotICBUaGUgcHJvdmlk
ZWQgYmxvY2sgd2lsbCBiZSBhcHBsaWVkIGFzIHRoZSB0ZW1wbGF0ZSBmb3IgZWFjaCBpdGVtJ3Mg
dmlldy4KLQotICBHaXZlbiBhbiBlbXB0eSBgPGJvZHk+YCB0aGUgZm9sbG93aW5nIHRlbXBsYXRl
OgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjY29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBw
Lml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNvbnRlbnQubmFtZX19Ci0gIHt7L2NvbGxlY3Rpb259
fQotICBgYGAKLQotICBBbmQgdGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbiBjb2RlCi0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKQotICBBcHAuaXRl
bXMgPSBbCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgRW1i
ZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01hcnknfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0
ZSh7bmFtZTogJ1NhcmEnfSkKLSAgXQotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgSFRN
TCBzdHJ1Y3R1cmUgYmVsb3cKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXci
PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkhpIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3Ij5IaSBNYXJ5PC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmll
dyI+SGkgU2FyYTwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgIyMjIEJsb2NrbGVzcyBVc2UK
LQotICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFzc2Agb3B0aW9uIHRoYXQgaGFzIGl0
cyBvd24gYHRlbXBsYXRlYCB5b3UgY2FuCi0gIG9taXQgdGhlIGJsb2NrLgotCi0gIFRoZSBmb2xs
b3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e2NvbGxlY3Rpb24gY29udGVu
dEJpbmRpbmc9IkFwcC5pdGVtcyIgaXRlbVZpZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXcifX0KLSAg
YGBgCi0KLSAgQW5kIGFwcGxpY2F0aW9uIGNvZGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcCA9
IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwotICBBcHAuaXRlbXMgPSBbCi0gICAgRW1iZXIu
T2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7
bmFtZTogJ01hcnknfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkK
LSAgXTsKLQotICBBcHAuQW5JdGVtVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1w
bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJHcmVldGluZ3Mge3t2aWV3LmNvbnRlbnQu
bmFtZX19IikKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVj
dHVyZSBiZWxvdwotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAg
PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNs
YXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgTWFyeTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVt
YmVyLXZpZXciPkdyZWV0aW5ncyBTYXJhPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMg
U3BlY2lmeWluZyBhIENvbGxlY3Rpb25WaWV3IHN1YmNsYXNzCi0KLSAgQnkgZGVmYXVsdCB0aGUg
YHt7Y29sbGVjdGlvbn19YCBoZWxwZXIgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgYEVt
YmVyLkNvbGxlY3Rpb25WaWV3YC4gWW91IGNhbiBzdXBwbHkgYSBgRW1iZXIuQ29sbGVjdGlvblZp
ZXdgIHN1YmNsYXNzIHRvCi0gIHRoZSBoZWxwZXIgYnkgcGFzc2luZyBpdCBhcyB0aGUgZmlyc3Qg
YXJndW1lbnQ6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNjb2xsZWN0aW9uIEFwcC5NeUN1c3Rv
bUNvbGxlY3Rpb25DbGFzcyBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2
aWV3LmNvbnRlbnQubmFtZX19Ci0gIHt7L2NvbGxlY3Rpb259fQotICBgYGAKLQotICAjIyMgRm9y
d2FyZGVkIGBpdGVtLipgLW5hbWVkIE9wdGlvbnMKLQotICBBcyB3aXRoIHRoZSBge3t2aWV3fX1g
LCBoZWxwZXIgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGB7e2NvbGxlY3Rpb259fWAgd2lsbCBiZQot
ICBzZXQgb24gdGhlIHJlc3VsdGluZyBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIGFzIHByb3BlcnRp
ZXMuIEFkZGl0aW9uYWxseSwKLSAgb3B0aW9ucyBwcmVmaXhlZCB3aXRoIGBpdGVtYCB3aWxsIGJl
IGFwcGxpZWQgdG8gdGhlIHZpZXdzIHJlbmRlcmVkIGZvciBlYWNoCi0gIGl0ZW0gKG5vdGUgdGhl
IGNhbWVsY2FzaW5nKToKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2NvbGxlY3Rpb24gY29udGVu
dEJpbmRpbmc9IkFwcC5pdGVtcyIKLSAgICAgICAgICAgICAgICBpdGVtVGFnTmFtZT0icCIKLSAg
ICAgICAgICAgICAgICBpdGVtQ2xhc3NOYW1lcz0iZ3JlZXRpbmcifX0KLSAgICBIb3dkeSB7e3Zp
ZXcuY29udGVudC5uYW1lfX0KLSAge3svY29sbGVjdGlvbn19Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBzdHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8ZGl2
IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICA8cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+
SG93ZHkgRGF2ZTwvcD4KLSAgICA8cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkg
TWFyeTwvcD4KLSAgICA8cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgU2FyYTwv
cD4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEBtZXRob2QgY29sbGVjdGlvbgotICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcGF0aAotICBAcGFyYW0ge0hh
c2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotICBAZGVwcmVjYXRl
ZCBVc2UgYHt7ZWFjaH19YCBoZWxwZXIgaW5zdGVhZC4KLSovCi1FbWJlci5IYW5kbGViYXJzLnJl
Z2lzdGVySGVscGVyKCdjb2xsZWN0aW9uJywgZnVuY3Rpb24gY29sbGVjdGlvbkhlbHBlcihwYXRo
LCBvcHRpb25zKSB7Ci0gIEVtYmVyLmRlcHJlY2F0ZSgiVXNpbmcgdGhlIHt7Y29sbGVjdGlvbn19
IGhlbHBlciB3aXRob3V0IHNwZWNpZnlpbmcgYSBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFz
IHRoZSB7e2VhY2h9fSBoZWxwZXIgbm93IHN1cHBvcnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHku
IiwgcGF0aCAhPT0gJ2NvbGxlY3Rpb24nKTsKLQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVk
LCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAm
JiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0
aCA9IHVuZGVmaW5lZDsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRo
YW4gb25lIGFyZ3VtZW50IHRvIHRoZSBjb2xsZWN0aW9uIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5n
dGggPT09IDEpOwotICB9IGVsc2UgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNz
IG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJndW1l
bnRzLmxlbmd0aCA9PT0gMik7Ci0gIH0KLQotICB2YXIgZm4gPSBvcHRpb25zLmZuOwotICB2YXIg
ZGF0YSA9IG9wdGlvbnMuZGF0YTsKLSAgdmFyIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0g
IHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7Ci0KLSAgLy8gSWYgcGFzc2VkIGEgcGF0aCBz
dHJpbmcsIGNvbnZlcnQgdGhhdCBpbnRvIGFuIG9iamVjdC4KLSAgLy8gT3RoZXJ3aXNlLCBqdXN0
IGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNzLgotICB2YXIgY29sbGVjdGlvbkNsYXNzOwot
ICBjb2xsZWN0aW9uQ2xhc3MgPSBwYXRoID8gaGFuZGxlYmFyc0dldCh0aGlzLCBwYXRoLCBvcHRp
b25zKSA6IEVtYmVyLkNvbGxlY3Rpb25WaWV3OwotICBFbWJlci5hc3NlcnQoZm10KCIlQCAjY29s
bGVjdGlvbjogQ291bGQgbm90IGZpbmQgY29sbGVjdGlvbiBjbGFzcyAlQCIsIFtkYXRhLnZpZXcs
IHBhdGhdKSwgISFjb2xsZWN0aW9uQ2xhc3MpOwotCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNo
LCBpdGVtSGFzaCA9IHt9LCBtYXRjaDsKLQotICAvLyBFeHRyYWN0IGl0ZW0gdmlldyBjbGFzcyBp
ZiBwcm92aWRlZCBlbHNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNzCi0gIHZhciBjb2xs
ZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlvbkNsYXNzLnByb3RvKCksCi0gICAgICBpdGVtVmll
d0NsYXNzOwotCi0gIGlmIChoYXNoLml0ZW1WaWV3KSB7Ci0gICAgdmFyIGNvbnRyb2xsZXIgPSBk
YXRhLmtleXdvcmRzLmNvbnRyb2xsZXI7Ci0gICAgRW1iZXIuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVk
IGFuIGl0ZW1WaWV3LCBidXQgdGhlIGN1cnJlbnQgY29udGV4dCBoYXMgbm8gJyArCi0gICAgICAg
ICAgICAgICAgICdjb250YWluZXIgdG8gbG9vayB0aGUgaXRlbVZpZXcgdXAgaW4uIFRoaXMgcHJv
YmFibHkgbWVhbnMgJyArCi0gICAgICAgICAgICAgICAgICd0aGF0IHlvdSBjcmVhdGVkIGEgdmll
dyBtYW51YWxseSwgaW5zdGVhZCBvZiB0aHJvdWdoIHRoZSAnICsKLSAgICAgICAgICAgICAgICAg
J2NvbnRhaW5lci4gSW5zdGVhZCwgdXNlIGNvbnRhaW5lci5sb29rdXAoInZpZXc6dmlld05hbWUi
KSwgJyArCi0gICAgICAgICAgICAgICAgICd3aGljaCB3aWxsIHByb3Blcmx5IGluc3RhbnRpYXRl
IHlvdXIgdmlldy4nLAotICAgICAgICAgICAgICAgICBjb250cm9sbGVyICYmIGNvbnRyb2xsZXIu
Y29udGFpbmVyKTsKLSAgICB2YXIgY29udGFpbmVyID0gY29udHJvbGxlci5jb250YWluZXI7Ci0g
ICAgaXRlbVZpZXdDbGFzcyA9IGNvbnRhaW5lci5yZXNvbHZlKCd2aWV3OicgKyBoYXNoLml0ZW1W
aWV3KTsKLSAgICBFbWJlci5hc3NlcnQoJ1lvdSBzcGVjaWZpZWQgdGhlIGl0ZW1WaWV3ICcgKyBo
YXNoLml0ZW1WaWV3ICsgIiwgYnV0IGl0IHdhcyAiICsKLSAgICAgICAgICAgICAgICAgIm5vdCBm
b3VuZCBhdCAiICsgY29udGFpbmVyLmRlc2NyaWJlKCJ2aWV3OiIgKyBoYXNoLml0ZW1WaWV3KSAr
Ci0gICAgICAgICAgICAgICAgICIgKGFuZCBpdCB3YXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGNv
bnRhaW5lcikiLCAhIWl0ZW1WaWV3Q2xhc3MpOwotICB9IGVsc2UgaWYgKGhhc2guaXRlbVZpZXdD
bGFzcykgewotICAgIGl0ZW1WaWV3Q2xhc3MgPSBoYW5kbGViYXJzR2V0KGNvbGxlY3Rpb25Qcm90
b3R5cGUsIGhhc2guaXRlbVZpZXdDbGFzcywgb3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgaXRl
bVZpZXdDbGFzcyA9IGNvbGxlY3Rpb25Qcm90b3R5cGUuaXRlbVZpZXdDbGFzczsKLSAgfQotCi0g
IEVtYmVyLmFzc2VydChmbXQoIiVAICNjb2xsZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVtVmll
d0NsYXNzICVAIiwgW2RhdGEudmlldywgaXRlbVZpZXdDbGFzc10pLCAhIWl0ZW1WaWV3Q2xhc3Mp
OwotCi0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3Q2xhc3M7Ci0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3
OwotCi0gIC8vIEdvIHRocm91Z2ggb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHt7Y29sbGVjdGlvbn19
IGhlbHBlciBhbmQgZXh0cmFjdCBvcHRpb25zCi0gIC8vIHRoYXQgY29uZmlndXJlIGl0ZW0gdmll
d3MgaW5zdGVhZCBvZiB0aGUgY29sbGVjdGlvbiBpdHNlbGYuCi0gIGZvciAodmFyIHByb3AgaW4g
aGFzaCkgewotICAgIGlmIChoYXNoLmhhc093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICBtYXRj
aCA9IHByb3AubWF0Y2goL15pdGVtKC4pKC4qKSQvKTsKLQotICAgICAgaWYgKG1hdGNoICYmIHBy
b3AgIT09ICdpdGVtQ29udHJvbGxlcicpIHsKLSAgICAgICAgLy8gQ29udmVydCBpdGVtU2hvdWxk
Rm9vIC0+IHNob3VsZEZvbwotICAgICAgICBpdGVtSGFzaFttYXRjaFsxXS50b0xvd2VyQ2FzZSgp
ICsgbWF0Y2hbMl1dID0gaGFzaFtwcm9wXTsKLSAgICAgICAgLy8gRGVsZXRlIGZyb20gaGFzaCBh
cyB0aGlzIHdpbGwgZW5kIHVwIGdldHRpbmcgcGFzc2VkIHRvIHRoZQotICAgICAgICAvLyB7e3Zp
ZXd9fSBoZWxwZXIgbWV0aG9kLgotICAgICAgICBkZWxldGUgaGFzaFtwcm9wXTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0KLQotICBpZiAoZm4pIHsKLSAgICBpdGVtSGFzaC50ZW1wbGF0ZSA9IGZuOwot
ICAgIGRlbGV0ZSBvcHRpb25zLmZuOwotICB9Ci0KLSAgdmFyIGVtcHR5Vmlld0NsYXNzOwotICBp
ZiAoaW52ZXJzZSAmJiBpbnZlcnNlICE9PSBFbWJlci5IYW5kbGViYXJzLlZNLm5vb3ApIHsKLSAg
ICBlbXB0eVZpZXdDbGFzcyA9IGdldChjb2xsZWN0aW9uUHJvdG90eXBlLCAnZW1wdHlWaWV3Q2xh
c3MnKTsKLSAgICBlbXB0eVZpZXdDbGFzcyA9IGVtcHR5Vmlld0NsYXNzLmV4dGVuZCh7Ci0gICAg
ICAgICAgdGVtcGxhdGU6IGludmVyc2UsCi0gICAgICAgICAgdGFnTmFtZTogaXRlbUhhc2gudGFn
TmFtZQotICAgIH0pOwotICB9IGVsc2UgaWYgKGhhc2guZW1wdHlWaWV3Q2xhc3MpIHsKLSAgICBl
bXB0eVZpZXdDbGFzcyA9IGhhbmRsZWJhcnNHZXQodGhpcywgaGFzaC5lbXB0eVZpZXdDbGFzcywg
b3B0aW9ucyk7Ci0gIH0KLSAgaWYgKGVtcHR5Vmlld0NsYXNzKSB7IGhhc2guZW1wdHlWaWV3ID0g
ZW1wdHlWaWV3Q2xhc3M7IH0KLQotICBpZiAoIWhhc2gua2V5d29yZCkgewotICAgIGl0ZW1IYXNo
Ll9jb250ZXh0ID0gRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQnKTsKLSAgfQotCi0gIHZh
ciB2aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRsZWJhcnMuVmlld0hlbHBlci5wcm9wZXJ0aWVzRnJv
bUhUTUxPcHRpb25zKHsgZGF0YTogZGF0YSwgaGFzaDogaXRlbUhhc2ggfSwgdGhpcyk7Ci0gIGhh
c2guaXRlbVZpZXdDbGFzcyA9IGl0ZW1WaWV3Q2xhc3MuZXh0ZW5kKHZpZXdPcHRpb25zKTsKLQot
ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBjb2xsZWN0
aW9uQ2xhc3MsIG9wdGlvbnMpOwotfSk7Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qZ2xvYmFscyBIYW5kbGViYXJzICovCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGVi
YXJzLmdldDsKLQotLyoqCi0gIGB1bmJvdW5kYCBhbGxvd3MgeW91IHRvIG91dHB1dCBhIHByb3Bl
cnR5IHdpdGhvdXQgYmluZGluZy4gKkltcG9ydGFudDoqIFRoZQotICBvdXRwdXQgd2lsbCBub3Qg
YmUgdXBkYXRlZCBpZiB0aGUgcHJvcGVydHkgY2hhbmdlcy4gVXNlIHdpdGggY2F1dGlvbi4KLQot
ICBgYGBoYW5kbGViYXJzCi0gIDxkaXY+e3t1bmJvdW5kIHNvbWVQcm9wZXJ0eVRoYXREb2VzbnRD
aGFuZ2V9fTwvZGl2PgotICBgYGAKLQotICBgdW5ib3VuZGAgY2FuIGFsc28gYmUgdXNlZCBpbiBj
b25qdW5jdGlvbiB3aXRoIGEgYm91bmQgaGVscGVyIHRvCi0gIHJlbmRlciBpdCBpbiBpdHMgdW5i
b3VuZCBmb3JtOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGRpdj57e3VuYm91bmQgaGVscGVyTmFt
ZSBzb21lUHJvcGVydHlUaGF0RG9lc250Q2hhbmdlfX08L2Rpdj4KLSAgYGBgCi0KLSAgQG1ldGhv
ZCB1bmJvdW5kCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3Ry
aW5nfSBwcm9wZXJ0eQotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXIu
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndW5ib3VuZCcsIGZ1bmN0aW9uIHVuYm91bmRIZWxw
ZXIocHJvcGVydHksIGZuKSB7Ci0gIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5s
ZW5ndGggLSAxXSwgaGVscGVyLCBjb250ZXh0LCBvdXQ7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPiAyKSB7Ci0gICAgLy8gVW5ib3VuZCBoZWxwZXIgY2FsbC4KLSAgICBvcHRpb25zLmRhdGEu
aXNVbmJvdW5kID0gdHJ1ZTsKLSAgICBoZWxwZXIgPSBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnNb
YXJndW1lbnRzWzBdXSB8fCBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaGVscGVyTWlzc2luZzsK
LSAgICBvdXQgPSBoZWxwZXIuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKSk7Ci0gICAgZGVsZXRlIG9wdGlvbnMuZGF0YS5pc1VuYm91bmQ7Ci0gICAg
cmV0dXJuIG91dDsKLSAgfQotCi0gIGNvbnRleHQgPSAoZm4uY29udGV4dHMgJiYgZm4uY29udGV4
dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBdIDogdGhpczsKLSAgcmV0dXJuIGhhbmRsZWJhcnNH
ZXQoY29udGV4dCwgcHJvcGVydHksIGZuKTsKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLypqc2hpbnQgZGVidWc6dHJ1ZSovCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1
bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgaGFuZGxlYmFy
c0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0LCBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxl
YmFycy5ub3JtYWxpemVQYXRoOwotCi0vKioKLSAgYGxvZ2AgYWxsb3dzIHlvdSB0byBvdXRwdXQg
dGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nCi0gIGNvbnRl
eHQuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e2xvZyBteVZhcmlhYmxlfX0KLSAgYGBgCi0KLSAg
QG1ldGhvZCBsb2cKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtT
dHJpbmd9IHByb3BlcnR5Ci0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbG9n
JywgZnVuY3Rpb24gbG9nSGVscGVyKHByb3BlcnR5LCBvcHRpb25zKSB7Ci0gIHZhciBjb250ZXh0
ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9u
cy5jb250ZXh0c1swXSA6IHRoaXMsCi0gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChj
b250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucy5kYXRhKSwKLSAgICAgIHBhdGhSb290ID0gbm9ybWFs
aXplZC5yb290LAotICAgICAgcGF0aCA9IG5vcm1hbGl6ZWQucGF0aCwKLSAgICAgIHZhbHVlID0g
KHBhdGggPT09ICd0aGlzJykgPyBwYXRoUm9vdCA6IGhhbmRsZWJhcnNHZXQocGF0aFJvb3QsIHBh
dGgsIG9wdGlvbnMpOwotICBFbWJlci5Mb2dnZXIubG9nKHZhbHVlKTsKLX0pOwotCi0vKioKLSAg
RXhlY3V0ZSB0aGUgYGRlYnVnZ2VyYCBzdGF0ZW1lbnQgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4K
LQotICBgYGBoYW5kbGViYXJzCi0gIHt7ZGVidWdnZXJ9fQotICBgYGAKLQotICBCZWZvcmUgaW52
b2tpbmcgdGhlIGBkZWJ1Z2dlcmAgc3RhdGVtZW50LCB0aGVyZQotICBhcmUgYSBmZXcgaGVscGZ1
bCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUKLSAgYm9keSBvZiB0aGlzIGhlbHBlciB0aGF0IHlv
dSBjYW4gaW5zcGVjdCB3aGlsZQotICBkZWJ1Z2dpbmcgdGhhdCBkZXNjcmliZSBob3cgYW5kIHdo
ZXJlIHRoaXMKLSAgaGVscGVyIHdhcyBpbnZva2VkOgotCi0gIC0gdGVtcGxhdGVDb250ZXh0OiB0
aGlzIGlzIG1vc3QgbGlrZWx5IGEgY29udHJvbGxlcgotICAgIGZyb20gd2hpY2ggdGhpcyB0ZW1w
bGF0ZSBsb29rcyB1cCAvIGRpc3BsYXlzIHByb3BlcnRpZXMKLSAgLSB0eXBlT2ZUZW1wbGF0ZUNv
bnRleHQ6IGEgc3RyaW5nIGRlc2NyaXB0aW9uIG9mCi0gICAgd2hhdCB0aGUgdGVtcGxhdGVDb250
ZXh0IGlzCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB3b25kZXJpbmcgd2h5IGEgdmFsdWUg
YHt7Zm9vfX1gCi0gIGlzbid0IHJlbmRlcmluZyBhcyBleHBlY3RlZCB3aXRoaW4gYSB0ZW1wbGF0
ZSwgeW91Ci0gIGNvdWxkIHBsYWNlIGEgYHt7ZGVidWdnZXJ9fWAgc3RhdGVtZW50LCBhbmQgd2hl
bgotICB0aGUgYGRlYnVnZ2VyO2AgYnJlYWtwb2ludCBpcyBoaXQsIHlvdSBjYW4gaW5zcGVjdAot
ICBgdGVtcGxhdGVDb250ZXh0YCwgZGV0ZXJtaW5lIGlmIGl0J3MgdGhlIG9iamVjdCB5b3UKLSAg
ZXhwZWN0LCBhbmQvb3IgZXZhbHVhdGUgZXhwcmVzc2lvbnMgaW4gdGhlIGNvbnNvbGUKLSAgdG8g
cGVyZm9ybSBwcm9wZXJ0eSBsb29rdXBzIG9uIHRoZSBgdGVtcGxhdGVDb250ZXh0YDoKLQotICBg
YGAKLSAgICA+IHRlbXBsYXRlQ29udGV4dC5nZXQoJ2ZvbycpIC8vIC0+ICI8dmFsdWUgb2Yge3tm
b299fT4iCi0gIGBgYAotCi0gIEBtZXRob2QgZGVidWdnZXIKLSAgQGZvciBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0qLwotRW1iZXIuSGFuZGxl
YmFycy5yZWdpc3RlckhlbHBlcignZGVidWdnZXInLCBmdW5jdGlvbiBkZWJ1Z2dlckhlbHBlcihv
cHRpb25zKSB7Ci0KLSAgLy8gVGhlc2UgYXJlIGhlbHBmdWwgdmFsdWVzIHlvdSBjYW4gaW5zcGVj
dCB3aGlsZSBkZWJ1Z2dpbmcuCi0gIHZhciB0ZW1wbGF0ZUNvbnRleHQgPSB0aGlzOwotICB2YXIg
dHlwZU9mVGVtcGxhdGVDb250ZXh0ID0gRW1iZXIuaW5zcGVjdCh0ZW1wbGF0ZUNvbnRleHQpOwot
Ci0gIGRlYnVnZ2VyOwotfSk7Ci0KLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIuSGFuZGxlYmFycy5FYWNo
VmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoLCB7Ci0g
IGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBpdGVtQ29udHJvbGxlciA9IGdldCh0aGlzLCAn
aXRlbUNvbnRyb2xsZXInKTsKLSAgICB2YXIgYmluZGluZzsKLQotICAgIGlmIChpdGVtQ29udHJv
bGxlcikgewotICAgICAgdmFyIGNvbnRyb2xsZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXIuY29u
dGFpbmVyJykubG9va3VwRmFjdG9yeSgnY29udHJvbGxlcjphcnJheScpLmNyZWF0ZSh7Ci0gICAg
ICAgIHBhcmVudENvbnRyb2xsZXI6IGdldCh0aGlzLCAnY29udHJvbGxlcicpLAotICAgICAgICBp
dGVtQ29udHJvbGxlcjogaXRlbUNvbnRyb2xsZXIsCi0gICAgICAgIHRhcmdldDogZ2V0KHRoaXMs
ICdjb250cm9sbGVyJyksCi0gICAgICAgIF9lYWNoVmlldzogdGhpcwotICAgICAgfSk7Ci0KLSAg
ICAgIHRoaXMuZGlzYWJsZUNvbnRlbnRPYnNlcnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNl
dCh0aGlzLCAnY29udGVudCcsIGNvbnRyb2xsZXIpOwotICAgICAgICBiaW5kaW5nID0gbmV3IEVt
YmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnX2VhY2hWaWV3LmRhdGFTb3VyY2UnKS5vbmVXYXkoKTsK
LSAgICAgICAgYmluZGluZy5jb25uZWN0KGNvbnRyb2xsZXIpOwotICAgICAgfSk7Ci0KLSAgICAg
IHNldCh0aGlzLCAnX2FycmF5Q29udHJvbGxlcicsIGNvbnRyb2xsZXIpOwotICAgIH0gZWxzZSB7
Ci0gICAgICB0aGlzLmRpc2FibGVDb250ZW50T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewotICAgICAg
ICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnZGF0YVNvdXJjZScpLm9u
ZVdheSgpOwotICAgICAgICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7Ci0gICAgICB9KTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoKTsKLSAgfSwKLQotICBfYXNzZXJ0QXJyYXlMaWtl
OiBmdW5jdGlvbihjb250ZW50KSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgdmFsdWUgdGhhdCAj
ZWFjaCBsb29wcyBvdmVyIG11c3QgYmUgYW4gQXJyYXkuIFlvdSBwYXNzZWQgIiArIGNvbnRlbnQu
Y29uc3RydWN0b3IgKyAiLCBidXQgaXQgc2hvdWxkIGhhdmUgYmVlbiBhbiBBcnJheUNvbnRyb2xs
ZXIiLCAhRW1iZXIuQ29udHJvbGxlck1peGluLmRldGVjdChjb250ZW50KSB8fCAoY29udGVudCAm
JiBjb250ZW50LmlzR2VuZXJhdGVkKSB8fCBjb250ZW50IGluc3RhbmNlb2YgRW1iZXIuQXJyYXlD
b250cm9sbGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIlRoZSB2YWx1ZSB0aGF0ICNlYWNoIGxvb3Bz
IG92ZXIgbXVzdCBiZSBhbiBBcnJheS4gWW91IHBhc3NlZCAiICsgKChFbWJlci5Db250cm9sbGVy
TWl4aW4uZGV0ZWN0KGNvbnRlbnQpICYmIGNvbnRlbnQuZ2V0KCdtb2RlbCcpICE9PSB1bmRlZmlu
ZWQpID8gKCIiICsgY29udGVudC5nZXQoJ21vZGVsJykgKyAiICh3cmFwcGVkIGluICIgKyBjb250
ZW50ICsgIikiKSA6ICgiIiArIGNvbnRlbnQpKSwgRW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQp
KTsKLSAgfSwKLQotICBkaXNhYmxlQ29udGVudE9ic2VydmVyczogZnVuY3Rpb24oY2FsbGJhY2sp
IHsKLSAgICBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGws
ICdfY29udGVudFdpbGxDaGFuZ2UnKTsKLSAgICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLCAn
Y29udGVudCcsIG51bGwsICdfY29udGVudERpZENoYW5nZScpOwotCi0gICAgY2FsbGJhY2suY2Fs
bCh0aGlzKTsKLQotICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMsICdjb250ZW50Jywg
bnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScpOwotICAgIEVtYmVyLmFkZE9ic2VydmVyKHRoaXMs
ICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50RGlkQ2hhbmdlJyk7Ci0gIH0sCi0KLSAgaXRlbVZp
ZXdDbGFzczogRW1iZXIuX01ldGFtb3JwaFZpZXcsCi0gIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5f
TWV0YW1vcnBoVmlldywKLQotICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJz
KSB7Ci0gICAgdmlldyA9IHRoaXMuX3N1cGVyKHZpZXcsIGF0dHJzKTsKLQotICAgIC8vIEF0IHRo
ZSBtb21lbnQsIGlmIGEgY29udGFpbmVyIHZpZXcgc3ViY2xhc3Mgd2FudHMKLSAgICAvLyB0byBp
bnNlcnQga2V5d29yZHMsIGl0IGlzIHJlc3BvbnNpYmxlIGZvciBjbG9uaW5nCi0gICAgLy8gdGhl
IGtleXdvcmRzIGhhc2guIFRoaXMgd2lsbCBiZSBmaXhlZCBtb21lbnRhcmlseS4KLSAgICB2YXIg
a2V5d29yZCA9IGdldCh0aGlzLCAna2V5d29yZCcpOwotICAgIHZhciBjb250ZW50ID0gZ2V0KHZp
ZXcsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAoa2V5d29yZCkgewotICAgICAgdmFyIGRhdGEgPSBn
ZXQodmlldywgJ3RlbXBsYXRlRGF0YScpOwotCi0gICAgICBkYXRhID0gRW1iZXIuY29weShkYXRh
KTsKLSAgICAgIGRhdGEua2V5d29yZHMgPSB2aWV3LmNsb25lS2V5d29yZHMoKTsKLSAgICAgIHNl
dCh2aWV3LCAndGVtcGxhdGVEYXRhJywgZGF0YSk7Ci0KLSAgICAgIC8vIEluIHRoaXMgY2FzZSwg
d2UgZG8gbm90IGJpbmQsIGJlY2F1c2UgdGhlIGBjb250ZW50YCBvZgotICAgICAgLy8gYSAjZWFj
aCBpdGVtIGNhbm5vdCBjaGFuZ2UuCi0gICAgICBkYXRhLmtleXdvcmRzW2tleXdvcmRdID0gY29u
dGVudDsKLSAgICB9Ci0KLSAgICAvLyBJZiB7eyNlYWNofX0gaXMgbG9vcGluZyBvdmVyIGFuIGFy
cmF5IG9mIGNvbnRyb2xsZXJzLAotICAgIC8vIHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVp
ciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCi0gICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNvbnRlbnQs
ICdpc0NvbnRyb2xsZXInKSkgewotICAgICAgc2V0KHZpZXcsICdjb250cm9sbGVyJywgY29udGVu
dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rp
b24oKSB7Ci0gICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIGFy
cmF5Q29udHJvbGxlciA9IGdldCh0aGlzLCAnX2FycmF5Q29udHJvbGxlcicpOwotCi0gICAgaWYg
KGFycmF5Q29udHJvbGxlcikgewotICAgICAgYXJyYXlDb250cm9sbGVyLmRlc3Ryb3koKTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotfSk7Ci0KLXZhciBHcm91cGVkRWFjaCA9IEVt
YmVyLkhhbmRsZWJhcnMuR3JvdXBlZEVhY2ggPSBmdW5jdGlvbihjb250ZXh0LCBwYXRoLCBvcHRp
b25zKSB7Ci0gIHZhciBzZWxmID0gdGhpcywKLSAgICAgIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5k
bGViYXJzLm5vcm1hbGl6ZVBhdGgoY29udGV4dCwgcGF0aCwgb3B0aW9ucy5kYXRhKTsKLQotICB0
aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICB0aGlzLnBhdGggPSBwYXRoOwotICB0aGlzLm9wdGlv
bnMgPSBvcHRpb25zOwotICB0aGlzLnRlbXBsYXRlID0gb3B0aW9ucy5mbjsKLSAgdGhpcy5jb250
YWluaW5nVmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OwotICB0aGlzLm5vcm1hbGl6ZWRSb290ID0g
bm9ybWFsaXplZC5yb290OwotICB0aGlzLm5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZC5wYXRo
OwotICB0aGlzLmNvbnRlbnQgPSB0aGlzLmxvb2t1cENvbnRlbnQoKTsKLQotICB0aGlzLmFkZENv
bnRlbnRPYnNlcnZlcnMoKTsKLSAgdGhpcy5hZGRBcnJheU9ic2VydmVycygpOwotCi0gIHRoaXMu
Y29udGFpbmluZ1ZpZXcub24oJ3dpbGxDbGVhclJlbmRlcicsIGZ1bmN0aW9uKCkgewotICAgIHNl
bGYuZGVzdHJveSgpOwotICB9KTsKLX07Ci0KLUdyb3VwZWRFYWNoLnByb3RvdHlwZSA9IHsKLSAg
Y29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNl
cnZlcnMoKTsKLSAgfSwKLQotICBjb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICB0
aGlzLmNvbnRlbnQgPSB0aGlzLmxvb2t1cENvbnRlbnQoKTsKLSAgICB0aGlzLmFkZEFycmF5T2Jz
ZXJ2ZXJzKCk7Ci0gICAgdGhpcy5yZXJlbmRlckNvbnRhaW5pbmdWaWV3KCk7Ci0gIH0sCi0KLSAg
Y29udGVudEFycmF5V2lsbENoYW5nZTogRW1iZXIuSywKLQotICBjb250ZW50QXJyYXlEaWRDaGFu
Z2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVyZW5kZXJDb250YWluaW5nVmlldygpOwotICB9
LAotCi0gIGxvb2t1cENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBFbWJlci5IYW5k
bGViYXJzLmdldCh0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlz
Lm9wdGlvbnMpOwotICB9LAotCi0gIGFkZEFycmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAg
ICBpZiAoIXRoaXMuY29udGVudCkgeyByZXR1cm47IH0KLQotICAgIHRoaXMuY29udGVudC5hZGRB
cnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgIHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxs
Q2hhbmdlJywKLSAgICAgIGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURpZENoYW5nZScKLSAgICB9
KTsKLSAgfSwKLQotICByZW1vdmVBcnJheU9ic2VydmVyczogZnVuY3Rpb24oKSB7Ci0gICAgaWYg
KCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9Ci0KLSAgICB0aGlzLmNvbnRlbnQucmVtb3ZlQXJy
YXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENo
YW5nZScsCi0gICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7
Ci0gIH0sCi0KLSAgYWRkQ29udGVudE9ic2VydmVyczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIu
YWRkQmVmb3JlT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0
aCwgdGhpcywgdGhpcy5jb250ZW50V2lsbENoYW5nZSk7Ci0gICAgRW1iZXIuYWRkT2JzZXJ2ZXIo
dGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250
ZW50RGlkQ2hhbmdlKTsKLSAgfSwKLQotICByZW1vdmVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlv
bigpIHsKLSAgICBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290
LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLmNvbnRlbnRXaWxsQ2hhbmdlKTsKLSAgICBFbWJl
ci5yZW1vdmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRo
LCB0aGlzLmNvbnRlbnREaWRDaGFuZ2UpOwotICB9LAotCi0gIHJlbmRlcjogZnVuY3Rpb24oKSB7
Ci0gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9
IHRoaXMuY29udGVudCwKLSAgICAgICAgY29udGVudExlbmd0aCA9IGdldChjb250ZW50LCAnbGVu
Z3RoJyksCi0gICAgICAgIGRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YSwKLSAgICAgICAgdGVtcGxh
dGUgPSB0aGlzLnRlbXBsYXRlOwotCi0gICAgZGF0YS5pbnNpZGVFYWNoID0gdHJ1ZTsKLSAgICBm
b3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnRMZW5ndGg7IGkrKykgewotICAgICAgdGVtcGxhdGUo
Y29udGVudC5vYmplY3RBdChpKSwgeyBkYXRhOiBkYXRhIH0pOwotICAgIH0KLSAgfSwKLQotICBy
ZXJlbmRlckNvbnRhaW5pbmdWaWV3OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXM7
Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgZnVuY3Rpb24oKSB7
Ci0gICAgICAvLyBJdCdzIHBvc3NpYmxlIGl0J3MgYmVlbiBkZXN0cm95ZWQgYWZ0ZXIgd2UgZW5x
dWV1ZWQgYSByZS1yZW5kZXIgY2FsbC4KLSAgICAgIGlmICghc2VsZi5kZXN0cm95ZWQpIHsKLSAg
ICAgICAgc2VsZi5jb250YWluaW5nVmlldy5yZXJlbmRlcigpOwotICAgICAgfQotICAgIH0pOwot
ICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVtb3ZlQ29udGVudE9i
c2VydmVycygpOwotICAgIGlmICh0aGlzLmNvbnRlbnQpIHsKLSAgICAgIHRoaXMucmVtb3ZlQXJy
YXlPYnNlcnZlcnMoKTsKLSAgICB9Ci0gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOwotICB9Ci19
OwotCi0vKioKLSAgVGhlIGB7eyNlYWNofX1gIGhlbHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGlu
IGEgY29sbGVjdGlvbiwgcmVuZGVyaW5nIGl0cwotICBibG9jayBvbmNlIGZvciBlYWNoIGl0ZW0u
IEl0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBIYW5kbGViYXJzIGB7eyNlYWNofX1gCi0g
IGhlbHBlcjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIERldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1
ZGEnfSx7bmFtZTogJ1RvbSd9LCB7bmFtZTogJ1BhdWwnfV07Ci0gIGBgYAotCi0gIGBgYGhhbmRs
ZWJhcnMKLSAge3sjZWFjaCBEZXZlbG9wZXJzfX0KLSAgICB7e25hbWV9fQotICB7ey9lYWNofX0K
LSAgYGBgCi0KLSAgYHt7ZWFjaH19YCBzdXBwb3J0cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0
aCBlbGVtZW50IG5hbWluZzoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2VhY2ggcGVyc29uIGlu
IERldmVsb3BlcnN9fQotICAgIHt7cGVyc29uLm5hbWV9fQotICB7ey9lYWNofX0KLSAgYGBgCi0K
LSAgV2hlbiBsb29waW5nIG92ZXIgb2JqZWN0cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMs
IGB7e3RoaXN9fWAgY2FuIGJlIHVzZWQKLSAgdG8gcmVuZGVyIHRoZSBvYmplY3Q6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICBEZXZlbG9wZXJOYW1lcyA9IFsnWWVodWRhJywgJ1RvbScsICdQYXVsJ10K
LSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNlYWNoIERldmVsb3Blck5hbWVzfX0KLSAg
ICB7e3RoaXN9fQotICB7ey9lYWNofX0KLSAgYGBgCi0gICMjIyB7e2Vsc2V9fSBjb25kaXRpb24K
LSAgYHt7I2VhY2h9fWAgY2FuIGhhdmUgYSBtYXRjaGluZyBge3tlbHNlfX1gLiBUaGUgY29udGVu
dHMgb2YgdGhpcyBibG9jayB3aWxsIHJlbmRlcgotICBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0
eS4KLQotICBgYGAKLSAge3sjZWFjaCBwZXJzb24gaW4gRGV2ZWxvcGVyc319Ci0gICAge3twZXJz
b24ubmFtZX19Ci0gIHt7ZWxzZX19Ci0gICAgPHA+U29ycnksIG5vYm9keSBpcyBhdmFpbGFibGUg
Zm9yIHRoaXMgdGFzay48L3A+Ci0gIHt7L2VhY2h9fQotICBgYGAKLSAgIyMjIFNwZWNpZnlpbmcg
YSBWaWV3IGNsYXNzIGZvciBpdGVtcwotICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFz
c2Agb3B0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIHZpZXcgY2xhc3MKLSAgd2l0aCBpdHMgb3duIGB0
ZW1wbGF0ZWAgeW91IGNhbiBvbWl0IHRoZSBibG9jay4KLQotICBUaGUgZm9sbG93aW5nIHRlbXBs
YXRlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjdmlldyBBcHAuTXlWaWV3IH19Ci0gICAge3tl
YWNoIHZpZXcuaXRlbXMgaXRlbVZpZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXcifX0KLSAge3svdmll
d319Ci0gIGBgYAotCi0gIEFuZCBhcHBsaWNhdGlvbiBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoewotICAgIE15VmlldzogRW1iZXIuVmll
dy5leHRlbmQoewotICAgICAgaXRlbXM6IFsKLSAgICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7
bmFtZTogJ0RhdmUnfSksCi0gICAgICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdNYXJ5
J30pLAotICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQotICAgICAg
XQotICAgIH0pCi0gIH0pOwotCi0gIEFwcC5Bbkl0ZW1WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo
ewotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkdyZWV0aW5ncyB7e25h
bWV9fSIpCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1
cmUgYmVsb3cKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxk
aXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBEYXZlPC9kaXY+Ci0gICAgPGRpdiBjbGFz
cz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIE1hcnk8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJl
ci12aWV3Ij5HcmVldGluZ3MgU2FyYTwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYW4g
YGl0ZW1WaWV3Q2xhc3NgIGlzIGRlZmluZWQgb24gdGhlIGhlbHBlciwgYW5kIHRoZXJlZm9yZSB0
aGUgaGVscGVyIGlzIG5vdAotICBiZWluZyB1c2VkIGFzIGEgYmxvY2ssIGFuIGBlbXB0eVZpZXdD
bGFzc2AgY2FuIGFsc28gYmUgcHJvdmlkZWQgb3B0aW9uYWxseS4KLSAgVGhlIGBlbXB0eVZpZXdD
bGFzc2Agd2lsbCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgdGhlIGB7e2Vsc2V9fWAgY29uZGl0aW9u
Ci0gIGRlc2NyaWJlZCBhYm92ZS4gVGhhdCBpcywgdGhlIGBlbXB0eVZpZXdDbGFzc2Agd2lsbCBy
ZW5kZXIgaWYgdGhlIGNvbGxlY3Rpb24KLSAgaXMgZW1wdHkuCi0KLSAgIyMjIFJlcHJlc2VudGlu
ZyBlYWNoIGl0ZW0gd2l0aCBhIENvbnRyb2xsZXIuCi0gIEJ5IGRlZmF1bHQgdGhlIGNvbnRyb2xs
ZXIgbG9va3VwIHdpdGhpbiBhbiBge3sjZWFjaH19YCBibG9jayB3aWxsIGJlCi0gIHRoZSBjb250
cm9sbGVyIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZSB0aGUgYHt7I2VhY2h9fWAgd2FzIHVzZWQuIElm
IGVhY2gKLSAgaXRlbSBuZWVkcyB0byBiZSBwcmVzZW50ZWQgYnkgYSBjdXN0b20gY29udHJvbGxl
ciB5b3UgY2FuIHByb3ZpZGUgYQotICBgaXRlbUNvbnRyb2xsZXJgIG9wdGlvbiB3aGljaCByZWZl
cmVuY2VzIGEgY29udHJvbGxlciBieSBsb29rdXAgbmFtZS4KLSAgRWFjaCBpdGVtIGluIHRoZSBs
b29wIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIKLSAg
YW5kIHRoZSBpdGVtIGl0c2VsZiB3aWxsIGJlIHNldCB0byB0aGUgYGNvbnRlbnRgIHByb3BlcnR5
IG9mIHRoYXQgY29udHJvbGxlci4KLQotICBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBw
cm9wZXJ0aWVzIG9mIG1vZGVsIG9iamVjdHMgbmVlZCB0cmFuc2Zvcm1hdGlvbgotICBvciBzeW50
aGVzaXMgZm9yIGRpc3BsYXk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuRGV2ZWxvcGVyQ29u
dHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBpc0F2YWlsYWJs
ZUZvckhpcmU6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuICF0aGlzLmdldCgnY29udGVudC5p
c0VtcGxveWVkJykgJiYgdGhpcy5nZXQoJ2NvbnRlbnQuaXNTZWVraW5nV29yaycpOwotICAgIH0u
cHJvcGVydHkoJ2lzRW1wbG95ZWQnLCAnaXNTZWVraW5nV29yaycpCi0gIH0pCi0gIGBgYAotCi0g
IGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBwZXJzb24gaW4gZGV2ZWxvcGVycyBpdGVtQ29udHJv
bGxlcj0iZGV2ZWxvcGVyIn19Ci0gICAge3twZXJzb24ubmFtZX19IHt7I2lmIHBlcnNvbi5pc0F2
YWlsYWJsZUZvckhpcmV9fUhpcmUgbWUhe3svaWZ9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAg
RWFjaCBpdGVtQ29udHJvbGxlciB3aWxsIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJl
bnQgY29udHJvbGxlciBhcwotICBhIGBwYXJlbnRDb250cm9sbGVyYCBwcm9wZXJ0eS4KLQotICAj
IyMgKEV4cGVyaW1lbnRhbCkgR3JvdXBlZCBFYWNoCi0KLSAgV2hlbiB1c2VkIGluIGNvbmp1bmN0
aW9uIHdpdGggdGhlIGV4cGVyaW1lbnRhbCBbZ3JvdXAgaGVscGVyXShodHRwczovL2dpdGh1Yi5j
b20vZW1iZXJqcy9ncm91cC1oZWxwZXIpLAotICB5b3UgY2FuIGluZm9ybSBIYW5kbGViYXJzIHRv
IHJlLXJlbmRlciBhbiBlbnRpcmUgZ3JvdXAgb2YgaXRlbXMgaW5zdGVhZCBvZgotICByZS1yZW5k
ZXJpbmcgdGhlbSBvbmUgYXQgYSB0aW1lIChpbiB0aGUgZXZlbnQgdGhhdCB0aGV5IGFyZSBjaGFu
Z2VkIGVuIG1hc3NlCi0gIG9yIGFuIGl0ZW0gaXMgYWRkZWQvcmVtb3ZlZCkuCi0KLSAgYGBgaGFu
ZGxlYmFycwotICB7eyNncm91cH19Ci0gICAge3sjZWFjaCBwZW9wbGV9fQotICAgICAge3tmaXJz
dE5hbWV9fSB7e2xhc3ROYW1lfX0KLSAgICB7ey9lYWNofX0KLSAge3svZ3JvdXB9fQotICBgYGAK
LQotICBUaGlzIGNhbiBiZSBmYXN0ZXIgdGhhbiB0aGUgbm9ybWFsIHdheSB0aGF0IEhhbmRsZWJh
cnMgcmUtcmVuZGVycyBpdGVtcwotICBpbiBzb21lIGNhc2VzLgotCi0gIElmIGZvciBzb21lIHJl
YXNvbiB5b3UgaGF2ZSBhIGdyb3VwIHdpdGggbW9yZSB0aGFuIG9uZSBgI2VhY2hgLCB5b3UgY2Fu
IG1ha2UKLSAgb25lIG9mIHRoZSBjb2xsZWN0aW9ucyBiZSB1cGRhdGVkIGluIG5vcm1hbCAobm9u
LWdyb3VwZWQpIGZhc2hpb24gYnkgc2V0dGluZwotICB0aGUgb3B0aW9uIGBncm91cGVkUm93cz10
cnVlYCAoY291bnRlci1pbnR1aXRpdmUsIEkga25vdykuCi0KLSAgRm9yIGV4YW1wbGUsCi0KLSAg
YGBgaGFuZGxlYmFycwotICB7e2RlYWxlcnNoaXBOYW1lfX0KLQotICB7eyNncm91cH19Ci0gICAg
e3sjZWFjaCBkZWFsZXJzfX0KLSAgICAgIHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19Ci0gICAg
e3svZWFjaH19Ci0KLSAgICB7eyNlYWNoIGNhciBpbiBjYXJzIGdyb3VwZWRSb3dzPXRydWV9fQot
ICAgICAge3tjYXIubWFrZX19IHt7Y2FyLm1vZGVsfX0ge3tjYXIuY29sb3J9fQotICAgIHt7L2Vh
Y2h9fQotICB7ey9ncm91cH19Ci0gIGBgYAotICBBbnkgY2hhbmdlIHRvIGBkZWFsZXJzaGlwTmFt
ZWAgb3IgdGhlIGBkZWFsZXJzYCBjb2xsZWN0aW9uIHdpbGwgY2F1c2UgdGhlCi0gIGVudGlyZSBn
cm91cCB0byBiZSByZS1yZW5kZXJlZC4gSG93ZXZlciwgY2hhbmdlcyB0byB0aGUgYGNhcnNgIGNv
bGxlY3Rpb24KLSAgd2lsbCBiZSByZS1yZW5kZXJlZCBpbmRpdmlkdWFsbHkgKGFzIG5vcm1hbCku
Ci0KLSAgTm90ZSB0aGF0IGBncm91cGAgYmVoYXZpb3IgaXMgYWxzbyBkaXNhYmxlZCBieSBzcGVj
aWZ5aW5nIGFuIGBpdGVtVmlld0NsYXNzYC4KLQotICBAbWV0aG9kIGVhY2gKLSAgQGZvciBFbWJl
ci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIFtuYW1lXSB7U3RyaW5nfSBuYW1lIGZvciBp
dGVtICh1c2VkIHdpdGggYGluYCkKLSAgQHBhcmFtIFtwYXRoXSB7U3RyaW5nfSBwYXRoCi0gIEBw
YXJhbSBbb3B0aW9uc10ge09iamVjdH0gSGFuZGxlYmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0
aW9ucwotICBAcGFyYW0gW29wdGlvbnMuaXRlbVZpZXdDbGFzc10ge1N0cmluZ30gYSBwYXRoIHRv
IGEgdmlldyBjbGFzcyB1c2VkIGZvciBlYWNoIGl0ZW0KLSAgQHBhcmFtIFtvcHRpb25zLml0ZW1D
b250cm9sbGVyXSB7U3RyaW5nfSBuYW1lIG9mIGEgY29udHJvbGxlciB0byBiZSBjcmVhdGVkIGZv
ciBlYWNoIGl0ZW0KLSAgQHBhcmFtIFtvcHRpb25zLmdyb3VwZWRSb3dzXSB7Ym9vbGVhbn0gZW5h
YmxlIG5vcm1hbCBpdGVtLWJ5LWl0ZW0gcmVuZGVyaW5nIHdoZW4gaW5zaWRlIGEgYCNncm91cGAg
aGVscGVyCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0
aW9uIGVhY2hIZWxwZXIocGF0aCwgb3B0aW9ucykgewotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9
PT0gNCkgewotICAgIEVtYmVyLmFzc2VydCgiSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1
bWVudCB0byB0aGUgZWFjaCBoZWxwZXIsIGl0IG11c3QgYmUgaW4gdGhlIGZvcm0gI2VhY2ggZm9v
IGluIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0gImluIik7Ci0KLSAgICB2YXIga2V5d29yZE5hbWUg
PSBhcmd1bWVudHNbMF07Ci0KLSAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOwotICAgIHBhdGgg
PSBhcmd1bWVudHNbMl07Ci0gICAgaWYgKHBhdGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0K
LQotICAgIG9wdGlvbnMuaGFzaC5rZXl3b3JkID0ga2V5d29yZE5hbWU7Ci0gIH0KLQotICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewotICAgIG9wdGlvbnMgPSBwYXRoOwotICAgIHBhdGgg
PSAndGhpcyc7Ci0gIH0KLQotICBvcHRpb25zLmhhc2guZGF0YVNvdXJjZUJpbmRpbmcgPSBwYXRo
OwotICAvLyBTZXQgdXAgZW1wdHlWaWV3IGFzIGEgbWV0YW1vcnBoIHdpdGggbm8gdGFnCi0gIC8v
b3B0aW9ucy5oYXNoLmVtcHR5Vmlld0NsYXNzID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7Ci0KLSAg
aWYgKG9wdGlvbnMuZGF0YS5pbnNpZGVHcm91cCAmJiAhb3B0aW9ucy5oYXNoLmdyb3VwZWRSb3dz
ICYmICFvcHRpb25zLmhhc2guaXRlbVZpZXdDbGFzcykgewotICAgIG5ldyBFbWJlci5IYW5kbGVi
YXJzLkdyb3VwZWRFYWNoKHRoaXMsIHBhdGgsIG9wdGlvbnMpLnJlbmRlcigpOwotICB9IGVsc2Ug
ewotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuY29sbGVjdGlvbi5jYWxsKHRo
aXMsICdFbWJlci5IYW5kbGViYXJzLkVhY2hWaWV3Jywgb3B0aW9ucyk7Ci0gIH0KLX0pOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLS8qKgotICBgdGVtcGxhdGVgIGFsbG93cyB5b3UgdG8g
cmVuZGVyIGEgdGVtcGxhdGUgZnJvbSBpbnNpZGUgYW5vdGhlciB0ZW1wbGF0ZS4KLSAgVGhpcyBh
bGxvd3MgeW91IHRvIHJlLXVzZSB0aGUgc2FtZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBwbGFjZXMu
IEZvciBleGFtcGxlOgotCi0gIGBgYGh0bWwKLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxl
YmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJsb2dnZWRfaW5fdXNlciI+Ci0gICAge3sjd2l0aCBs
b2dnZWRJblVzZXJ9fQotICAgICAgTGFzdCBMb2dpbjoge3tsYXN0TG9naW59fQotICAgICAgVXNl
ciBJbmZvOiB7e3RlbXBsYXRlICJ1c2VyX2luZm8ifX0KLSAgICB7ey93aXRofX0KLSAgPC9zY3Jp
cHQ+Ci0gIGBgYAotCi0gIGBgYGh0bWwKLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFy
cyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ1c2VyX2luZm8iPgotICAgIE5hbWU6IDxlbT57e25hbWV9
fTwvZW0+Ci0gICAgS2FybWE6IDxlbT57e2thcm1hfX08L2VtPgotICA8L3NjcmlwdD4KLSAgYGBg
Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNpZiBpc1VzZXJ9fQotICAgIHt7dGVtcGxhdGUgInVz
ZXJfaW5mbyJ9fQotICB7e2Vsc2V9fQotICAgIHt7dGVtcGxhdGUgInVubG9nZ2VkX3VzZXJfaW5m
byJ9fQotICB7ey9pZn19Ci0gIGBgYAotCi0gIFRoaXMgaGVscGVyIGxvb2tzIGZvciB0ZW1wbGF0
ZXMgaW4gdGhlIGdsb2JhbCBgRW1iZXIuVEVNUExBVEVTYCBoYXNoLiBJZiB5b3UKLSAgYWRkIGA8
c2NyaXB0PmAgdGFncyB0byB5b3VyIHBhZ2Ugd2l0aCB0aGUgYGRhdGEtdGVtcGxhdGUtbmFtZWAg
YXR0cmlidXRlIHNldCwKLSAgdGhleSB3aWxsIGJlIGNvbXBpbGVkIGFuZCBwbGFjZWQgaW4gdGhp
cyBoYXNoIGF1dG9tYXRpY2FsbHkuCi0KLSAgWW91IGNhbiBhbHNvIG1hbnVhbGx5IHJlZ2lzdGVy
IHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0byB0aGUgaGFzaDoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLlRFTVBMQVRFU1sibXlfY29vbF90ZW1wbGF0ZSJdID0gRW1iZXIuSGFuZGxlYmFy
cy5jb21waWxlKCc8Yj57e3VzZXJ9fTwvYj4nKTsKLSAgYGBgCi0KLSAgQGRlcHJlY2F0ZWQKLSAg
QG1ldGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFy
YW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSovCi0KLUVt
YmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3RlbXBsYXRlJywgZnVuY3Rpb24obmFtZSwg
b3B0aW9ucykgewotICBFbWJlci5kZXByZWNhdGUoIlRoZSBgdGVtcGxhdGVgIGhlbHBlciBoYXMg
YmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBgcGFydGlhbGAgaGVscGVyLiBQbGVhc2Ug
dXNlIGBwYXJ0aWFsYCBpbnN0ZWFkLCB3aGljaCB3aWxsIHdvcmsgdGhlIHNhbWUgd2F5LiIpOwot
ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnBhcnRpYWwuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLS8qKgotICBUaGUgYHBh
cnRpYWxgIGhlbHBlciByZW5kZXJzIGFub3RoZXIgdGVtcGxhdGUgd2l0aG91dAotICBjaGFuZ2lu
ZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7Zm9vfX0KLSAg
e3twYXJ0aWFsICJuYXYifX0KLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGV4YW1wbGUgdGVtcGxhdGUg
d2lsbCByZW5kZXIgYSB0ZW1wbGF0ZSBuYW1lZAotICAiX25hdiIsIHdoaWNoIGhhcyB0aGUgc2Ft
ZSBjb250ZXh0IGFzIHRoZSBwYXJlbnQgdGVtcGxhdGUKLSAgaXQncyByZW5kZXJlZCBpbnRvLCBz
byBpZiB0aGUgIl9uYXYiIHRlbXBsYXRlIGFsc28gcmVmZXJlbmNlZAotICBge3tmb299fWAsIGl0
IHdvdWxkIHByaW50IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBge3tmb299fWAKLSAgaW4gdGhlIGFi
b3ZlIGV4YW1wbGUuCi0KLSAgSWYgYSAiX25hdiIgdGVtcGxhdGUgaXNuJ3QgZm91bmQsIHRoZSBg
cGFydGlhbGAgaGVscGVyIHdpbGwKLSAgZmFsbCBiYWNrIHRvIGEgdGVtcGxhdGUgbmFtZWQgIm5h
diIuCi0KLSAgIyMgQm91bmQgdGVtcGxhdGUgbmFtZXMKLQotICBUaGUgcGFyYW1ldGVyIHN1cHBs
aWVkIHRvIGBwYXJ0aWFsYCBjYW4gYWxzbyBiZSBhIHBhdGgKLSAgdG8gYSBwcm9wZXJ0eSBjb250
YWluaW5nIGEgdGVtcGxhdGUgbmFtZSwgZS5nLjoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7cGFy
dGlhbCBzb21lVGVtcGxhdGVOYW1lfX0KLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGV4YW1wbGUgd2ls
bCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBgc29tZVRlbXBsYXRlTmFtZWAKLSAgb24gdGhlIHRlbXBs
YXRlIGNvbnRleHQgKGUuZy4gYSBjb250cm9sbGVyKSBhbmQgdXNlIHRoYXQKLSAgdmFsdWUgYXMg
dGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIHJlbmRlci4gSWYgdGhlIHJlc29sdmVkCi0gIHZh
bHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwgYmUgcmVuZGVyZWQuIElmIGBzb21lVGVtcGxhdGVO
YW1lYAotICBjaGFuZ2VzLCB0aGUgcGFydGlhbCB3aWxsIGJlIHJlLXJlbmRlcmVkIHVzaW5nIHRo
ZSBuZXcgdGVtcGxhdGUKLSAgbmFtZS4KLQotICAjIyBTZXR0aW5nIHRoZSBwYXJ0aWFsJ3MgY29u
dGV4dCB3aXRoIGB3aXRoYAotCi0gIFRoZSBgcGFydGlhbGAgaGVscGVyIGNhbiBiZSB1c2VkIGlu
IGNvbmp1bmN0aW9uIHdpdGggdGhlIGB3aXRoYAotICBoZWxwZXIgdG8gc2V0IGEgY29udGV4dCB0
aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgcGFydGlhbDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7
I3dpdGggY3VycmVudFVzZXJ9fQotICAgIHt7cGFydGlhbCAidXNlcl9pbmZvIn19Ci0gIHt7L3dp
dGh9fQotICBgYGAKLQotICBAbWV0aG9kIHBhcnRpYWwKLSAgQGZvciBFbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHBhcnRpYWxOYW1lIHRoZSBuYW1lIG9mIHRoZSB0
ZW1wbGF0ZSB0byByZW5kZXIgbWludXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZQotKi8KLQotRW1i
ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigncGFydGlhbCcsIGZ1bmN0aW9uIHBhcnRpYWxI
ZWxwZXIobmFtZSwgb3B0aW9ucykgewotCi0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4
dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRo
aXM7Ci0KLSAgaWYgKG9wdGlvbnMudHlwZXNbMF0gPT09ICJJRCIpIHsKLSAgICAvLyBIZWxwZXIg
d2FzIHBhc3NlZCBhIHByb3BlcnR5IHBhdGg7IHdlIG5lZWQgdG8KLSAgICAvLyBjcmVhdGUgYSBi
aW5kaW5nIHRoYXQgd2lsbCByZS1yZW5kZXIgd2hlbmV2ZXIKLSAgICAvLyB0aGlzIHByb3BlcnR5
IGNoYW5nZXMuCi0gICAgb3B0aW9ucy5mbiA9IGZ1bmN0aW9uKGNvbnRleHQsIGZuT3B0aW9ucykg
ewotICAgICAgdmFyIHBhcnRpYWxOYW1lID0gRW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwg
bmFtZSwgZm5PcHRpb25zKTsKLSAgICAgIHJlbmRlclBhcnRpYWwoY29udGV4dCwgcGFydGlhbE5h
bWUsIGZuT3B0aW9ucyk7Ci0gICAgfTsKLQotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmJp
bmQuY2FsbChjb250ZXh0LCBuYW1lLCBvcHRpb25zLCB0cnVlLCBleGlzdHMpOwotICB9IGVsc2Ug
ewotICAgIC8vIFJlbmRlciB0aGUgcGFydGlhbCByaWdodCBpbnRvIHBhcmVudCB0ZW1wbGF0ZS4K
LSAgICByZW5kZXJQYXJ0aWFsKGNvbnRleHQsIG5hbWUsIG9wdGlvbnMpOwotICB9Ci19KTsKLQot
ZnVuY3Rpb24gZXhpc3RzKHZhbHVlKSB7Ci0gIHJldHVybiAhRW1iZXIuaXNOb25lKHZhbHVlKTsK
LX0KLQotZnVuY3Rpb24gcmVuZGVyUGFydGlhbChjb250ZXh0LCBuYW1lLCBvcHRpb25zKSB7Ci0g
IHZhciBuYW1lUGFydHMgPSBuYW1lLnNwbGl0KCIvIiksCi0gICAgICBsYXN0UGFydCA9IG5hbWVQ
YXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV07Ci0KLSAgbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5n
dGggLSAxXSA9ICJfIiArIGxhc3RQYXJ0OwotCi0gIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZp
ZXcsCi0gICAgICB1bmRlcnNjb3JlZE5hbWUgPSBuYW1lUGFydHMuam9pbigiLyIpLAotICAgICAg
dGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlRm9yTmFtZSh1bmRlcnNjb3JlZE5hbWUpLAotICAgICAg
ZGVwcmVjYXRlZFRlbXBsYXRlID0gIXRlbXBsYXRlICYmIHZpZXcudGVtcGxhdGVGb3JOYW1lKG5h
bWUpOwotCi0gIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUg
JyIrbmFtZSsiJy4iLCB0ZW1wbGF0ZSB8fCBkZXByZWNhdGVkVGVtcGxhdGUpOwotCi0gIHRlbXBs
YXRlID0gdGVtcGxhdGUgfHwgZGVwcmVjYXRlZFRlbXBsYXRlOwotCi0gIHRlbXBsYXRlKGNvbnRl
eHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0pOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSov
Ci0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIGB7e3lp
ZWxkfX1gIGRlbm90ZXMgYW4gYXJlYSBvZiBhIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSByZW5kZXJl
ZCBpbnNpZGUKLSAgb2YgYW5vdGhlciB0ZW1wbGF0ZS4gSXQgaGFzIHR3byBtYWluIHVzZXM6Ci0K
LSAgIyMjIFVzZSB3aXRoIGBsYXlvdXRgCi0gIFdoZW4gdXNlZCBpbiBhIEhhbmRsZWJhcnMgdGVt
cGxhdGUgdGhhdCBpcyBhc3NpZ25lZCB0byBhbiBgRW1iZXIuVmlld2AKLSAgaW5zdGFuY2UncyBg
bGF5b3V0YCBwcm9wZXJ0eSBFbWJlciB3aWxsIHJlbmRlciB0aGUgbGF5b3V0IHRlbXBsYXRlIGZp
cnN0LAotICBpbnNlcnRpbmcgdGhlIHZpZXcncyBvd24gcmVuZGVyZWQgb3V0cHV0IGF0IHRoZSBg
e3t5aWVsZH19YCBsb2NhdGlvbi4KLQotICBBbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxv
d2luZyBhcHBsaWNhdGlvbiBjb2RlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJl
ci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwK
LSAgICBsYXlvdXQ6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPGRpdiBjbGFzcz0id3JhcHBl
ciI+e3t5aWVsZH19PC9kaXY+JyksCi0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29t
cGlsZSgnPHNwYW4+SSBhbSB3cmFwcGVkPC9zcGFuPicpCi0gIH0pOwotCi0gIGFWaWV3ID0gQVZp
ZXcuY3JlYXRlKCk7Ci0gIGFWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwg
cmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8Ym9k
eT4KLSAgICA8ZGl2IGNsYXNzPSdlbWJlci12aWV3IGEtdmlldy13aXRoLWxheW91dCc+Ci0gICAg
ICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KLSAgICAgICAgPHNwYW4+SSBhbSB3cmFwcGVkPC9zcGFu
PgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLSAgYGBgCi0KLSAgVGhlIGB5
aWVsZGAgaGVscGVyIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYSB0ZW1wbGF0ZSBhc3NpZ25l
ZCB0byBhbgotICBgRW1iZXIuVmlld2AncyBgbGF5b3V0YCBwcm9wZXJ0eSBhbmQgd2lsbCB0aHJv
dyBhbiBlcnJvciBpZiBhdHRlbXB0ZWQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBCVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFzc05hbWVzOiBbJ2Etdmlldy13aXRoLWxheW91dCdd
LAotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7eWllbGR9fScpCi0g
IH0pOwotCi0gIGJWaWV3ID0gQlZpZXcuY3JlYXRlKCk7Ci0gIGJWaWV3LmFwcGVuZFRvKCdib2R5
Jyk7Ci0KLSAgLy8gdGhyb3dzCi0gIC8vIFVuY2F1Z2h0IEVycm9yOiBhc3NlcnRpb24gZmFpbGVk
OgotICAvLyBZb3UgY2FsbGVkIHlpZWxkIGluIGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGEgbGF5
b3V0Ci0gIGBgYAotCi0gICMjIyBVc2Ugd2l0aCBFbWJlci5Db21wb25lbnQKLSAgV2hlbiBkZXNp
Z25pbmcgY29tcG9uZW50cyBge3t5aWVsZH19YCBpcyB1c2VkIHRvIGRlbm90ZSB3aGVyZSwgaW5z
aWRlIHRoZSBjb21wb25lbnQncwotICB0ZW1wbGF0ZSwgYW4gb3B0aW9uYWwgYmxvY2sgcGFzc2Vk
IHRvIHRoZSBjb21wb25lbnQgc2hvdWxkIHJlbmRlcjoKLQotICBgYGBoYW5kbGViYXJzCi0gIDwh
LS0gYXBwbGljYXRpb24uaGJzIC0tPgotICB7eyNsYWJlbGVkLXRleHRmaWVsZCB2YWx1ZT1zb21l
UHJvcGVydHl9fQotICAgIEZpcnN0IG5hbWU6Ci0gIHt7L2xhYmVsZWQtdGV4dGZpZWxkfX0KLSAg
YGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICA8IS0tIGNvbXBvbmVudHMvbGFiZWxlZC10ZXh0Zmll
bGQuaGJzIC0tPgotICA8bGFiZWw+Ci0gICAge3t5aWVsZH19IHt7aW5wdXQgdmFsdWU9dmFsdWV9
fQotICA8L2xhYmVsPgotICBgYGAKLQotICBSZXN1bHQ6Ci0KLSAgYGBgaHRtbAotICA8bGFiZWw+
Ci0gICAgRmlyc3QgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIC8+Ci0gIDxsYWJlbD4KLSAgYGBg
Ci0KLSAgQG1ldGhvZCB5aWVsZAotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBA
cGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8K
LUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3lpZWxkJywgZnVuY3Rpb24geWllbGRI
ZWxwZXIob3B0aW9ucykgewotICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0gIHdo
aWxlICh2aWV3ICYmICFnZXQodmlldywgJ2xheW91dCcpKSB7Ci0gICAgaWYgKHZpZXcuX2NvbnRl
eHRWaWV3KSB7Ci0gICAgICB2aWV3ID0gdmlldy5fY29udGV4dFZpZXc7Ci0gICAgfSBlbHNlIHsK
LSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICB9Ci0gIH0KLQotICBF
bWJlci5hc3NlcnQoIllvdSBjYWxsZWQgeWllbGQgaW4gYSB0ZW1wbGF0ZSB0aGF0IHdhcyBub3Qg
YSBsYXlvdXQiLCAhIXZpZXcpOwotCi0gIHZpZXcuX3lpZWxkKHRoaXMsIG9wdGlvbnMpOwotfSk7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJt
b2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotLyoqCi0gIGBsb2NgIGxvb2tzIHVwIHRoZSBz
dHJpbmcgaW4gdGhlIGxvY2FsaXplZCBzdHJpbmdzIGhhc2guCi0gIFRoaXMgaXMgYSBjb252ZW5p
ZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBGb3IgZXhhbXBsZToKLQotICBgYGBodG1sCi0gIDxz
Y3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxhdGUtbmFtZT0iaG9tZSI+
Ci0gICAge3tsb2MgIndlbGNvbWUifX0KLSAgPC9zY3JpcHQ+Ci0gIGBgYAotCi0gIFRha2Ugbm90
ZSB0aGF0IGAid2VsY29tZSJgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gb2JqZWN0Ci0gIHJlZmVy
ZW5jZS4KLQotICBAbWV0aG9kIGxvYwotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwot
ICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZm9ybWF0Ci0qLwotCi1FbWJlci5I
YW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdsb2MnLCBmdW5jdGlvbiBsb2NIZWxwZXIoc3RyKSB7
Ci0gIHJldHVybiBFbWJlci5TdHJpbmcubG9jKHN0cik7Ci19KTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5k
bGViYXJzCi0qLwotCi12YXIgc2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8q
KgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0
aGUgYHt7aW5wdXR9fWAKLSAgaGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2YgYGNoZWNrYm94
YC4KLQotICBTZWUgW2hhbmRsZWJhcnMuaGVscGVycy5pbnB1dF0oL2FwaS9jbGFzc2VzL0VtYmVy
LkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF9pbnB1dCkgIGZvciB1c2FnZSBkZXRhaWxz
LgotCi0gICMjIERpcmVjdCBtYW5pcHVsYXRpb24gb2YgYGNoZWNrZWRgCi0KLSAgVGhlIGBjaGVj
a2VkYCBhdHRyaWJ1dGUgb2YgYW4gYEVtYmVyLkNoZWNrYm94YCBvYmplY3Qgc2hvdWxkIGFsd2F5
cyBiZSBzZXQKLSAgdGhyb3VnaCB0aGUgRW1iZXIgb2JqZWN0IG9yIGJ5IGludGVyYWN0aW5nIHdp
dGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKLSAgcmVwcmVzZW50YXRpb24gdmlhIHRoZSBtb3VzZSwg
a2V5Ym9hcmQsIG9yIHRvdWNoLiBVcGRhdGluZyB0aGUgdmFsdWUgb2YgdGhlCi0gIGNoZWNrYm94
IHZpYSBqUXVlcnkgd2lsbCByZXN1bHQgaW4gdGhlIGNoZWNrZWQgdmFsdWUgb2YgdGhlIG9iamVj
dCBhbmQgaXRzCi0gIGVsZW1lbnQgbG9zaW5nIHN5bmNocm9uaXphdGlvbi4KLQotICAjIyBMYXlv
dXQgYW5kIExheW91dE5hbWUgcHJvcGVydGllcwotCi0gIEJlY2F1c2UgSFRNTCBgaW5wdXRgIGVs
ZW1lbnRzIGFyZSBzZWxmIGNsb3NpbmcgYGxheW91dGAgYW5kIGBsYXlvdXROYW1lYAotICBwcm9w
ZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2Vz
L0VtYmVyLlZpZXcuaHRtbCkncwotICBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlv
bi4KLQotICBAY2xhc3MgQ2hlY2tib3gKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
bWJlci5WaWV3Ci0qLwotRW1iZXIuQ2hlY2tib3ggPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gIGNs
YXNzTmFtZXM6IFsnZW1iZXItY2hlY2tib3gnXSwKLQotICB0YWdOYW1lOiAnaW5wdXQnLAotCi0g
IGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5cGUnLCAnY2hlY2tlZCcsICdpbmRldGVybWluYXRlJywg
J2Rpc2FibGVkJywgJ3RhYmluZGV4JywgJ25hbWUnXSwKLQotICB0eXBlOiAiY2hlY2tib3giLAot
ICBjaGVja2VkOiBmYWxzZSwKLSAgZGlzYWJsZWQ6IGZhbHNlLAotICBpbmRldGVybWluYXRlOiBm
YWxzZSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRo
aXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX3VwZGF0ZUVsZW1lbnRWYWx1ZSk7Ci0gIH0sCi0K
LSAgZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAg
ICB0aGlzLmdldCgnZWxlbWVudCcpLmluZGV0ZXJtaW5hdGUgPSAhIXRoaXMuZ2V0KCdpbmRldGVy
bWluYXRlJyk7Ci0gIH0sCi0KLSAgX3VwZGF0ZUVsZW1lbnRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0g
ICAgc2V0KHRoaXMsICdjaGVja2VkJywgdGhpcy4kKCkucHJvcCgnY2hlY2tlZCcpKTsKLSAgfQot
fSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBz
dWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0
ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgU2hhcmVkIG1peGluIHVzZWQgYnkgYEVtYmVyLlRleHRG
aWVsZGAgYW5kIGBFbWJlci5UZXh0QXJlYWAuCi0KLSAgQGNsYXNzIFRleHRTdXBwb3J0Ci0gIEBu
YW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUKLSovCi1FbWJlci5UZXh0U3VwcG9ydCA9IEVtYmVy
Lk1peGluLmNyZWF0ZSh7Ci0gIHZhbHVlOiAiIiwKLQotICBhdHRyaWJ1dGVCaW5kaW5nczogWydw
bGFjZWhvbGRlcicsICdkaXNhYmxlZCcsICdtYXhsZW5ndGgnLCAndGFiaW5kZXgnLCAncmVhZG9u
bHknXSwKLSAgcGxhY2Vob2xkZXI6IG51bGwsCi0gIGRpc2FibGVkOiBmYWxzZSwKLSAgbWF4bGVu
Z3RoOiBudWxsLAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0g
ICAgdGhpcy5vbigiZm9jdXNPdXQiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2Up
OwotICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5n
ZSk7Ci0gICAgdGhpcy5vbigicGFzdGUiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFu
Z2UpOwotICAgIHRoaXMub24oImN1dCIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5n
ZSk7Ci0gICAgdGhpcy5vbigiaW5wdXQiLCB0aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFu
Z2UpOwotICAgIHRoaXMub24oImtleVVwIiwgdGhpcywgdGhpcy5pbnRlcnByZXRLZXlFdmVudHMp
OwotICB9LAotCi0gIC8qKgotICAgIFRoZSBhY3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2Vy
IHByZXNzZXMgdGhlIHJldHVybiBrZXkuCi0KLSAgICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGB7
e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBmaXJlZCB3aGVuCi0gICAgdGhlIHVzZXIgcHJlc3Nl
cyB0aGUgcmV0dXJuIGtleSB3aGVuIGVkaXRpbmcgYSB0ZXh0IGZpZWxkLCBhbmQgc2VuZHMKLSAg
ICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBjb250ZXh0LgotCi0gICAgQHByb3BlcnR5
IGFjdGlvbgotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgYWN0
aW9uOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBldmVudCB0aGF0IHNob3VsZCBzZW5kIHRoZSBh
Y3Rpb24uCi0KLSAgICBPcHRpb25zIGFyZToKLQotICAgICogYGVudGVyYDogdGhlIHVzZXIgcHJl
c3NlZCBlbnRlcgotICAgICogYGtleVByZXNzYDogdGhlIHVzZXIgcHJlc3NlZCBhIGtleQotCi0g
ICAgQHByb3BlcnR5IG9uRXZlbnQKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBlbnRl
cgotICAqLwotICBvbkV2ZW50OiAnZW50ZXInLAotCi0gIC8qKgotICAgIFdoZXRoZXIgdGhleSBg
a2V5VXBgIGV2ZW50IHRoYXQgdHJpZ2dlcnMgYW4gYGFjdGlvbmAgdG8gYmUgc2VudCBjb250aW51
ZXMKLSAgICBwcm9wYWdhdGluZyB0byBvdGhlciB2aWV3cy4KLQotICAgIEJ5IGRlZmF1bHQsIHdo
ZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSBvbiB0aGVpciBrZXlib2FyZCBhbmQK
LSAgICB0aGUgdGV4dCBmaWVsZCBoYXMgYW4gYGFjdGlvbmAgc2V0LCB0aGUgYWN0aW9uIHdpbGwg
YmUgc2VudCB0byB0aGUgdmlldydzCi0gICAgY29udHJvbGxlciBhbmQgdGhlIGtleSBldmVudCB3
aWxsIHN0b3AgcHJvcGFnYXRpbmcuCi0KLSAgICBJZiB5b3Ugd291bGQgbGlrZSBwYXJlbnQgdmll
d3MgdG8gcmVjZWl2ZSB0aGUgYGtleVVwYCBldmVudCBldmVuIGFmdGVyIGFuCi0gICAgYWN0aW9u
IGhhcyBiZWVuIGRpc3BhdGNoZWQsIHNldCBgYnViYmxlc2AgdG8gdHJ1ZS4KLQotICAgIEBwcm9w
ZXJ0eSBidWJibGVzCi0gICAgQHR5cGUgQm9vbGVhbgotICAgIEBkZWZhdWx0IGZhbHNlCi0gICov
Ci0gIGJ1YmJsZXM6IGZhbHNlLAotCi0gIGludGVycHJldEtleUV2ZW50czogZnVuY3Rpb24oZXZl
bnQpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuVGV4dFN1cHBvcnQuS0VZX0VWRU5UUzsKLSAgICB2
YXIgbWV0aG9kID0gbWFwW2V2ZW50LmtleUNvZGVdOwotCi0gICAgdGhpcy5fZWxlbWVudFZhbHVl
RGlkQ2hhbmdlKCk7Ci0gICAgaWYgKG1ldGhvZCkgeyByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50
KTsgfQotICB9LAotCi0gIF9lbGVtZW50VmFsdWVEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAg
IHNldCh0aGlzLCAndmFsdWUnLCB0aGlzLiQoKS52YWwoKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
VGhlIGFjdGlvbiB0byBiZSBzZW50IHdoZW4gdGhlIHVzZXIgaW5zZXJ0cyBhIG5ldyBsaW5lLgot
Ci0gICAgQ2FsbGVkIGJ5IHRoZSBgRW1iZXIuVGV4dFN1cHBvcnRgIG1peGluIG9uIGtleVVwIGlm
IGtleWNvZGUgbWF0Y2hlcyAxMy4KLSAgICBVc2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGVu
dGVyYCBhY3Rpb24gdG8gdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBAbWV0aG9kIGluc2VydE5ld2xp
bmUKLSAgICBAcGFyYW0ge0V2ZW50fSBldmVudAotICAqLwotICBpbnNlcnROZXdsaW5lOiBmdW5j
dGlvbihldmVudCkgewotICAgIHNlbmRBY3Rpb24oJ2VudGVyJywgdGhpcywgZXZlbnQpOwotICAg
IHNlbmRBY3Rpb24oJ2luc2VydC1uZXdsaW5lJywgdGhpcywgZXZlbnQpOwotICB9LAotCi0gIC8q
KgotICAgIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhpdHMgZXNjYXBlLgotCi0gICAgQ2FsbGVkIGJ5
IHRoZSBgRW1iZXIuVGV4dFN1cHBvcnRgIG1peGluIG9uIGtleVVwIGlmIGtleWNvZGUgbWF0Y2hl
cyAyNy4KLSAgICBVc2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGVzY2FwZS1wcmVzc2AgYWN0
aW9uIHRvIHRoZSBjb250cm9sbGVyLgotCi0gICAgQG1ldGhvZCBjYW5jZWwKLSAgICBAcGFyYW0g
e0V2ZW50fSBldmVudAotICAqLwotICBjYW5jZWw6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2Vu
ZEFjdGlvbignZXNjYXBlLXByZXNzJywgdGhpcywgZXZlbnQpOwotICB9LAotCi0gIC8qKgotICAg
IENhbGxlZCB3aGVuIHRoZSB0ZXh0IGFyZWEgaXMgZm9jdXNlZC4KLQotICAgIEBtZXRob2QgZm9j
dXNJbgotICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50Ci0gICovCi0gIGZvY3VzSW46IGZ1bmN0aW9u
KGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbignZm9jdXMtaW4nLCB0aGlzLCBldmVudCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4gdGhlIHRleHQgYXJlYSBpcyBibHVycmVkLgotCi0g
ICAgQG1ldGhvZCBmb2N1c091dAotICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50Ci0gICovCi0gIGZv
Y3VzT3V0OiBmdW5jdGlvbihldmVudCkgewotICAgIHNlbmRBY3Rpb24oJ2ZvY3VzLW91dCcsIHRo
aXMsIGV2ZW50KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGUgYWN0aW9uIHRvIGJlIHNlbnQgd2hl
biB0aGUgdXNlciBwcmVzc2VzIGEga2V5LiBFbmFibGVkIGJ5IHNldHRpbmcKLSAgICB0aGUgYG9u
RXZlbnRgIHByb3BlcnR5IHRvIGBrZXlQcmVzc2AuCi0KLSAgICBVc2VzIHNlbmRBY3Rpb24gdG8g
c2VuZCB0aGUgYGtleVByZXNzYCBhY3Rpb24gdG8gdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBAbWV0
aG9kIGtleVByZXNzCi0gICAgQHBhcmFtIHtFdmVudH0gZXZlbnQKLSAgKi8KLSAga2V5UHJlc3M6
IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbigna2V5LXByZXNzJywgdGhpcywgZXZl
bnQpOwotICB9Ci0KLX0pOwotCi1FbWJlci5UZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0gewotICAx
MzogJ2luc2VydE5ld2xpbmUnLAotICAyNzogJ2NhbmNlbCcKLX07Ci0KLS8vIEluIHByaW5jaXBs
ZSwgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgdGhlIGxlZ2FjeQotLy8gc2VjdGlv
bkFjdGlvbiBzZW1hbnRpY3MgZm9yIFRleHRGaWVsZCBhcmUgZGlmZmVyZW50IGZyb20KLS8vIHRo
ZSBjb21wb25lbnQgc2VtYW50aWNzIHNvIHRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlbS4KLWZ1
bmN0aW9uIHNlbmRBY3Rpb24oZXZlbnROYW1lLCB2aWV3LCBldmVudCkgewotICB2YXIgYWN0aW9u
ID0gZ2V0KHZpZXcsIGV2ZW50TmFtZSksCi0gICAgICBvbiA9IGdldCh2aWV3LCAnb25FdmVudCcp
LAotICAgICAgdmFsdWUgPSBnZXQodmlldywgJ3ZhbHVlJyk7Ci0KLSAgLy8gYmFjay1jb21wYXQg
c3VwcG9ydCBmb3Iga2V5UHJlc3MgYXMgYW4gZXZlbnQgbmFtZSBldmVuIHRob3VnaAotICAvLyBp
dCdzIGFsc28gYSBtZXRob2QgbmFtZSB0aGF0IGNvbnN1bWVzIHRoZSBldmVudCAoYW5kIHRoZXJl
Zm9yZQotICAvLyBpbmNvbXBhdGlibGUgd2l0aCBzZW5kQWN0aW9uIHNlbWFudGljcykuCi0gIGlm
IChvbiA9PT0gZXZlbnROYW1lIHx8IChvbiA9PT0gJ2tleVByZXNzJyAmJiBldmVudE5hbWUgPT09
ICdrZXktcHJlc3MnKSkgewotICAgIHZpZXcuc2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOwot
ICB9Ci0KLSAgdmlldy5zZW5kQWN0aW9uKGV2ZW50TmFtZSwgdmFsdWUpOwotCi0gIGlmIChhY3Rp
b24gfHwgb24gPT09IGV2ZW50TmFtZSkgewotICAgIGlmKCFnZXQodmlldywgJ2J1YmJsZXMnKSkg
ewotICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgfQotICB9Ci19Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotCi0vKioKLQotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1
dHMgd2hlbiB0aGUgYHt7aW5wdXR9fWAKLSAgaGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2Yg
YHRleHRgLgotCi0gIFNlZSBbSGFuZGxlYmFycy5oZWxwZXJzLmlucHV0XSgvYXBpL2NsYXNzZXMv
RW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRl
dGFpbHMuCi0KLSAgIyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMKLQotICBCZWNh
dXNlIEhUTUwgYGlucHV0YCBlbGVtZW50cyBhcmUgc2VsZiBjbG9zaW5nIGBsYXlvdXRgIGFuZCBg
bGF5b3V0TmFtZWAKLSAgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUgW0VtYmVy
LlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwpJ3MKLSAgbGF5b3V0IHNlY3Rpb24g
Zm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgQGNsYXNzIFRleHRGaWVsZAotICBAbmFtZXNwYWNl
IEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAotICBAdXNlcyBFbWJlci5UZXh0U3Vw
cG9ydAotKi8KLUVtYmVyLlRleHRGaWVsZCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIu
VGV4dFN1cHBvcnQsIHsKLQotICBjbGFzc05hbWVzOiBbJ2VtYmVyLXRleHQtZmllbGQnXSwKLSAg
dGFnTmFtZTogImlucHV0IiwKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlwZScsICd2YWx1ZScs
ICdzaXplJywgJ3BhdHRlcm4nLCAnbmFtZSddLAotCi0gIC8qKgotICAgIFRoZSBgdmFsdWVgIGF0
dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4gQXMgdGhlIHVzZXIgaW5wdXRzIHRleHQsIHRo
aXMKLSAgICBwcm9wZXJ0eSBpcyB1cGRhdGVkIGxpdmUuCi0KLSAgICBAcHJvcGVydHkgdmFsdWUK
LSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCAiIgotICAqLwotICB2YWx1ZTogIiIsCi0K
LSAgLyoqCi0gICAgVGhlIGB0eXBlYCBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCi0K
LSAgICBAcHJvcGVydHkgdHlwZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICJ0ZXh0
IgotICAqLwotICB0eXBlOiAidGV4dCIsCi0KLSAgLyoqCi0gICAgVGhlIGBzaXplYCBvZiB0aGUg
dGV4dCBmaWVsZCBpbiBjaGFyYWN0ZXJzLgotCi0gICAgQHByb3BlcnR5IHNpemUKLSAgICBAdHlw
ZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHNpemU6IG51bGwsCi0KLSAgLyoq
Ci0gICAgVGhlIGBwYXR0ZXJuYCB0aGUgcGF0dGVybiBhdHRyaWJ1dGUgb2YgaW5wdXQgZWxlbWVu
dC4KLQotICAgIEBwcm9wZXJ0eSBwYXR0ZXJuCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1
bHQgbnVsbAotICAqLwotICBwYXR0ZXJuOiBudWxsCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMK
LSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoKLSAgQGNs
YXNzIEJ1dHRvbgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAg
QHVzZXMgRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydAotICBAZGVwcmVjYXRlZAotKi8KLUVtYmVy
LkJ1dHRvbiA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsK
LSAgY2xhc3NOYW1lczogWydlbWJlci1idXR0b24nXSwKLSAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
aXNBY3RpdmUnXSwKLQotICB0YWdOYW1lOiAnYnV0dG9uJywKLQotICBwcm9wYWdhdGVFdmVudHM6
IGZhbHNlLAotCi0gIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5cGUnLCAnZGlzYWJsZWQnLCAnaHJl
ZicsICd0YWJpbmRleCddLAotCi0gIC8qCi0gICAgQHByaXZhdGUKLQotICAgIE92ZXJyaWRlcyBg
VGFyZ2V0QWN0aW9uU3VwcG9ydGAncyBgdGFyZ2V0T2JqZWN0YCBjb21wdXRlZAotICAgIHByb3Bl
cnR5IHRvIHVzZSBIYW5kbGViYXJzLXNwZWNpZmljIHBhdGggcmVzb2x1dGlvbi4KLQotICAgIEBw
cm9wZXJ0eSB0YXJnZXRPYmplY3QKLSAgKi8KLSAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpIHsKLSAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAg
ICAgICAgcm9vdCA9IGdldCh0aGlzLCAnY29udGV4dCcpLAotICAgICAgICBkYXRhID0gZ2V0KHRo
aXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5n
JykgeyByZXR1cm4gdGFyZ2V0OyB9Ci0KLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXQo
cm9vdCwgdGFyZ2V0LCB7IGRhdGE6IGRhdGEgfSk7Ci0gIH0pLnByb3BlcnR5KCd0YXJnZXQnKSwK
LQotICAvLyBEZWZhdWx0cyB0byAnYnV0dG9uJyBpZiB0YWdOYW1lIGlzICdpbnB1dCcgb3IgJ2J1
dHRvbicKLSAgdHlwZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHRh
Z05hbWUgPSB0aGlzLnRhZ05hbWU7Ci0gICAgaWYgKHRhZ05hbWUgPT09ICdpbnB1dCcgfHwgdGFn
TmFtZSA9PT0gJ2J1dHRvbicpIHsgcmV0dXJuICdidXR0b24nOyB9Ci0gIH0pLAotCi0gIGRpc2Fi
bGVkOiBmYWxzZSwKLQotICAvLyBBbGxvdyAnYScgdGFncyB0byBhY3QgbGlrZSBidXR0b25zCi0g
IGhyZWY6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnRhZ05h
bWUgPT09ICdhJyA/ICcjJyA6IG51bGw7Ci0gIH0pLAotCi0gIG1vdXNlRG93bjogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKCFnZXQodGhpcywgJ2Rpc2FibGVkJykpIHsKLSAgICAgIHNldCh0aGlzLCAn
aXNBY3RpdmUnLCB0cnVlKTsKLSAgICAgIHRoaXMuX21vdXNlRG93biA9IHRydWU7Ci0gICAgICB0
aGlzLl9tb3VzZUVudGVyZWQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZ2V0KHRoaXMsICdw
cm9wYWdhdGVFdmVudHMnKTsKLSAgfSwKLQotICBtb3VzZUxlYXZlOiBmdW5jdGlvbigpIHsKLSAg
ICBpZiAodGhpcy5fbW91c2VEb3duKSB7Ci0gICAgICBzZXQodGhpcywgJ2lzQWN0aXZlJywgZmFs
c2UpOwotICAgICAgdGhpcy5fbW91c2VFbnRlcmVkID0gZmFsc2U7Ci0gICAgfQotICB9LAotCi0g
IG1vdXNlRW50ZXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLl9tb3VzZURvd24pIHsKLSAg
ICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCB0cnVlKTsKLSAgICAgIHRoaXMuX21vdXNlRW50ZXJl
ZCA9IHRydWU7Ci0gICAgfQotICB9LAotCi0gIG1vdXNlVXA6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0g
ICAgaWYgKGdldCh0aGlzLCAnaXNBY3RpdmUnKSkgewotICAgICAgLy8gQWN0dWFsbHkgaW52b2tl
IHRoZSBidXR0b24ncyB0YXJnZXQgYW5kIGFjdGlvbi4KLSAgICAgIC8vIFRoaXMgbWV0aG9kIGNv
bWVzIGZyb20gdGhlIEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQgbWl4aW4uCi0gICAgICB0aGlz
LnRyaWdnZXJBY3Rpb24oKTsKLSAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCBmYWxzZSk7Ci0g
ICAgfQotCi0gICAgdGhpcy5fbW91c2VEb3duID0gZmFsc2U7Ci0gICAgdGhpcy5fbW91c2VFbnRl
cmVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvcGFnYXRlRXZlbnRzJyk7Ci0g
IH0sCi0KLSAga2V5RG93bjogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAvLyBIYW5kbGUgc3BhY2Ug
b3IgZW50ZXIKLSAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9
PT0gMzIpIHsKLSAgICAgIHRoaXMubW91c2VEb3duKCk7Ci0gICAgfQotICB9LAotCi0gIGtleVVw
OiBmdW5jdGlvbihldmVudCkgewotICAgIC8vIEhhbmRsZSBzcGFjZSBvciBlbnRlcgotICAgIGlm
IChldmVudC5rZXlDb2RlID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAzMikgewotICAgICAg
dGhpcy5tb3VzZVVwKCk7Ci0gICAgfQotICB9LAotCi0gIC8vIFRPRE86IEhhbmRsZSBwcm9wZXIg
dG91Y2ggYmVoYXZpb3IuIEluY2x1ZGluZyBzaG91bGQgbWFrZSBpbmFjdGl2ZSB3aGVuCi0gIC8v
IGZpbmdlciBtb3ZlcyBtb3JlIHRoYW4gMjB4IG91dHNpZGUgb2YgdGhlIGVkZ2Ugb2YgdGhlIGJ1
dHRvbiAodnMgbW91c2UKLSAgLy8gd2hpY2ggZ29lcyBpbmFjdGl2ZSBhcyBzb29uIGFzIG1vdXNl
IGdvZXMgb3V0IG9mIGVkZ2VzLikKLQotICB0b3VjaFN0YXJ0OiBmdW5jdGlvbih0b3VjaCkgewot
ICAgIHJldHVybiB0aGlzLm1vdXNlRG93bih0b3VjaCk7Ci0gIH0sCi0KLSAgdG91Y2hFbmQ6IGZ1
bmN0aW9uKHRvdWNoKSB7Ci0gICAgcmV0dXJuIHRoaXMubW91c2VVcCh0b3VjaCk7Ci0gIH0sCi0K
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5CdXR0b24g
aXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBD
b25zaWRlciB1c2luZyB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlci4iKTsKLSAgICB0aGlzLl9zdXBl
cigpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNl
ZCB0byBjcmVhdGUgdGV4dGFyZWEgZWxlbWVudCB3aGVuIHRoZSBge3t0ZXh0YXJlYX19YAotICBo
ZWxwZXIgaXMgdXNlZC4KLQotICBTZWUgW2hhbmRsZWJhcnMuaGVscGVycy50ZXh0YXJlYV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF90ZXh0YXJlYSkg
IGZvciB1c2FnZSBkZXRhaWxzLgotCi0gICMjIExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0
aWVzCi0KLSAgQmVjYXVzZSBIVE1MIGB0ZXh0YXJlYWAgZWxlbWVudHMgZG8gbm90IGNvbnRhaW4g
aW5uZXIgSFRNTCB0aGUgYGxheW91dGAgYW5kCi0gIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdp
bGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZp
ZXcuaHRtbCkncwotICBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBA
Y2xhc3MgVGV4dEFyZWEKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db21w
b25lbnQKLSAgQHVzZXMgRW1iZXIuVGV4dFN1cHBvcnQKLSovCi1FbWJlci5UZXh0QXJlYSA9IEVt
YmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIuVGV4dFN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczog
WydlbWJlci10ZXh0LWFyZWEnXSwKLQotICB0YWdOYW1lOiAidGV4dGFyZWEiLAotICBhdHRyaWJ1
dGVCaW5kaW5nczogWydyb3dzJywgJ2NvbHMnLCAnbmFtZSddLAotICByb3dzOiBudWxsLAotICBj
b2xzOiBudWxsLAotCi0gIF91cGRhdGVFbGVtZW50VmFsdWU6IEVtYmVyLm9ic2VydmVyKCd2YWx1
ZScsIGZ1bmN0aW9uKCkgewotICAgIC8vIFdlIGRvIHRoaXMgY2hlY2sgc28gY3Vyc29yIHBvc2l0
aW9uIGRvZXNuJ3QgZ2V0IGFmZmVjdGVkIGluIElFCi0gICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMs
ICd2YWx1ZScpLAotICAgICAgICAkZWwgPSB0aGlzLiQoKTsKLSAgICBpZiAoJGVsICYmIHZhbHVl
ICE9PSAkZWwudmFsKCkpIHsKLSAgICAgICRlbC52YWwodmFsdWUpOwotICAgIH0KLSAgfSksCi0K
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLm9uKCJk
aWRJbnNlcnRFbGVtZW50IiwgdGhpcywgdGhpcy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKLSAgfQot
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qanNoaW50IGVxZXFlcTpmYWxz
ZSAqLwotCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwot
Ki8KLQotdmFyIHNldCA9IEVtYmVyLnNldCwKLSAgICBnZXQgPSBFbWJlci5nZXQsCi0gICAgaW5k
ZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mLAotICAgIGluZGV4ZXNPZiA9IEVt
YmVyLkVudW1lcmFibGVVdGlscy5pbmRleGVzT2YsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5mb3JFYWNoLAotICAgIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
cmVwbGFjZSwKLSAgICBpc0FycmF5ID0gRW1iZXIuaXNBcnJheSwKLSAgICBwcmVjb21waWxlVGVt
cGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGU7Ci0KLUVtYmVyLlNlbGVjdE9wdGlvbiA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgdGFnTmFtZTogJ29wdGlvbicsCi0gIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ3ZhbHVlJywgJ3NlbGVjdGVkJ10sCi0KLSAgZGVmYXVsdFRlbXBsYXRlOiBmdW5j
dGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgb3B0aW9ucyA9IHsgZGF0YTogb3B0aW9ucy5k
YXRhLCBoYXNoOiB7fSB9OwotICAgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5iaW5kLmNhbGwo
Y29udGV4dCwgInZpZXcubGFiZWwiLCBvcHRpb25zKTsKLSAgfSwKLQotICBpbml0OiBmdW5jdGlv
bigpIHsKLSAgICB0aGlzLmxhYmVsUGF0aERpZENoYW5nZSgpOwotICAgIHRoaXMudmFsdWVQYXRo
RGlkQ2hhbmdlKCk7Ci0KLSAgICB0aGlzLl9zdXBlcigpOwotICB9LAotCi0gIHNlbGVjdGVkOiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAn
Y29udGVudCcpLAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3BhcmVudFZpZXcuc2Vs
ZWN0aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlzLCAncGFyZW50Vmlldy5tdWx0aXBsZScpKSB7Ci0g
ICAgICByZXR1cm4gc2VsZWN0aW9uICYmIGluZGV4T2Yoc2VsZWN0aW9uLCBjb250ZW50LnZhbHVl
T2YoKSkgPiAtMTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gUHJpbWl0aXZlcyBnZXQgcGFzc2Vk
IHRocm91Z2ggYmluZGluZ3MgYXMgb2JqZWN0cy4uLiBzaW5jZQotICAgICAgLy8gYG5ldyBOdW1i
ZXIoNCkgIT09IDRgLCB3ZSB1c2UgYD09YCBiZWxvdwotICAgICAgcmV0dXJuIGNvbnRlbnQgPT0g
c2VsZWN0aW9uOwotICAgIH0KLSAgfSkucHJvcGVydHkoJ2NvbnRlbnQnLCAncGFyZW50Vmlldy5z
ZWxlY3Rpb24nKSwKLQotICBsYWJlbFBhdGhEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdwYXJl
bnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBsYWJlbFBhdGgg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0aW9uTGFiZWxQYXRoJyk7Ci0KLSAgICBpZiAoIWxh
YmVsUGF0aCkgeyByZXR1cm47IH0KLQotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICds
YWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlz
LCBsYWJlbFBhdGgpOwotICAgIH0pLnByb3BlcnR5KGxhYmVsUGF0aCkpOwotICB9KSwKLQotICB2
YWx1ZVBhdGhEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdwYXJlbnRWaWV3Lm9wdGlvblZhbHVl
UGF0aCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ3BhcmVu
dFZpZXcub3B0aW9uVmFsdWVQYXRoJyk7Ci0KLSAgICBpZiAoIXZhbHVlUGF0aCkgeyByZXR1cm47
IH0KLQotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCB2YWx1ZVBhdGgpOwotICAg
IH0pLnByb3BlcnR5KHZhbHVlUGF0aCkpOwotICB9KQotfSk7Ci0KLUVtYmVyLlNlbGVjdE9wdGdy
b3VwID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHsKLSAgdGFnTmFtZTogJ29wdGdyb3Vw
JywKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsnbGFiZWwnXSwKLQotICBzZWxlY3Rpb25CaW5kaW5n
OiAncGFyZW50Vmlldy5zZWxlY3Rpb24nLAotICBtdWx0aXBsZUJpbmRpbmc6ICdwYXJlbnRWaWV3
Lm11bHRpcGxlJywKLSAgb3B0aW9uTGFiZWxQYXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9u
TGFiZWxQYXRoJywKLSAgb3B0aW9uVmFsdWVQYXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9u
VmFsdWVQYXRoJywKLQotICBpdGVtVmlld0NsYXNzQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9u
VmlldycKLX0pOwotCi0vKioKLSAgVGhlIGBFbWJlci5TZWxlY3RgIHZpZXcgY2xhc3MgcmVuZGVy
cyBhCi0gIFtzZWxlY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxl
bWVudC9zZWxlY3QpIEhUTUwgZWxlbWVudCwKLSAgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hvb3Nl
IGZyb20gYSBsaXN0IG9mIG9wdGlvbnMuCi0KLSAgVGhlIHRleHQgYW5kIGB2YWx1ZWAgcHJvcGVy
dHkgb2YgZWFjaCBgPG9wdGlvbj5gIGVsZW1lbnQgd2l0aGluIHRoZQotICBgPHNlbGVjdD5gIGVs
ZW1lbnQgYXJlIHBvcHVsYXRlZCBmcm9tIHRoZSBvYmplY3RzIGluIHRoZSBgRWxlbWVudC5TZWxl
Y3RgJ3MKLSAgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGUgdW5kZXJseWluZyBkYXRhIG9iamVjdCBv
ZiB0aGUgc2VsZWN0ZWQgYDxvcHRpb24+YCBpcwotICBzdG9yZWQgaW4gdGhlIGBFbGVtZW50LlNl
bGVjdGAncyBgdmFsdWVgIHByb3BlcnR5LgotCi0gICMjIFRoZSBDb250ZW50IFByb3BlcnR5IChh
cnJheSBvZiBzdHJpbmdzKQotCi0gIFRoZSBzaW1wbGVzdCB2ZXJzaW9uIG9mIGFuIGBFbWJlci5T
ZWxlY3RgIHRha2VzIGFuIGFycmF5IG9mIHN0cmluZ3MgYXMgaXRzCi0gIGBjb250ZW50YCBwcm9w
ZXJ0eS4gVGhlIHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYm90aCB0aGUgYHZhbHVlYCBwcm9wZXJ0
eSBhbmQKLSAgdGhlIGlubmVyIHRleHQgb2YgZWFjaCBgPG9wdGlvbj5gIGVsZW1lbnQgaW5zaWRl
IHRoZSByZW5kZXJlZCBgPHNlbGVjdD5gLgotCi0gIEV4YW1wbGU6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQo
ewotICAgIG5hbWVzOiBbIlllaHVkYSIsICJUb20iXQotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFu
ZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2VsZWN0IGNvbnRlbnQ9bmFtZXN9fQotICBgYGAKLQot
ICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHNl
bGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlll
aHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Ci0gIDwv
c2VsZWN0PgotICBgYGAKLQotICBZb3UgY2FuIGNvbnRyb2wgd2hpY2ggYDxvcHRpb24+YCBpcyBz
ZWxlY3RlZCB0aHJvdWdoIHRoZSBgRW1iZXIuU2VsZWN0YCdzCi0gIGB2YWx1ZWAgcHJvcGVydHk6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIu
Q29udHJvbGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkTmFtZTogJ1RvbScsCi0gICAgbmFtZXM6
IFsiWWVodWRhIiwgIlRvbSJdCi0gIH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7
dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9bmFtZXMKLSAgICAgICAgIHZhbHVl
PXNlbGVjdGVkTmFtZQotICB9fQotICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MIHdpdGggdGhlIGA8b3B0aW9uPmAgZm9yICdUb20nIHNlbGVjdGVkOgotCi0gIGBg
YGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVl
PSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlRvbSIgc2VsZWN0
ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEEgdXNl
ciBpbnRlcmFjdGluZyB3aXRoIHRoZSByZW5kZXJlZCBgPHNlbGVjdD5gIHRvIGNob29zZSAiWWVo
dWRhIiB3b3VsZAotICB1cGRhdGUgdGhlIHZhbHVlIG9mIGBzZWxlY3RlZE5hbWVgIHRvICJZZWh1
ZGEiLgotCi0gICMjIFRoZSBDb250ZW50IFByb3BlcnR5IChhcnJheSBvZiBPYmplY3RzKQotCi0g
IEFuIGBFbWJlci5TZWxlY3RgIGNhbiBhbHNvIHRha2UgYW4gYXJyYXkgb2YgSmF2YVNjcmlwdCBv
ciBFbWJlciBvYmplY3RzIGFzCi0gIGl0cyBgY29udGVudGAgcHJvcGVydHkuCi0KLSAgV2hlbiB1
c2luZyBvYmplY3RzIHlvdSBuZWVkIHRvIHRlbGwgdGhlIGBFbWJlci5TZWxlY3RgIHdoaWNoIHBy
b3BlcnR5IHNob3VsZAotICBiZSBhY2Nlc3NlZCBvbiBlYWNoIG9iamVjdCB0byBzdXBwbHkgdGhl
IGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBgPG9wdGlvbj5gCi0gIGFuZCB3aGljaCBwcm9wZXJ0
eSBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkgdGhlIGVsZW1lbnQgdGV4dC4KLQotICBUaGUgYG9w
dGlvblZhbHVlUGF0aGAgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCBvbiBlYWNo
IG9iamVjdCB0bwotICB0aGUgZGVzaXJlZCBwcm9wZXJ0eSBmb3IgdGhlIGB2YWx1ZWAgYXR0cmli
dXRlLiBUaGUgYG9wdGlvbkxhYmVsUGF0aGAKLSAgc3BlY2lmaWVzIHRoZSBwYXRoIG9uIGVhY2gg
b2JqZWN0IHRvIHRoZSBkZXNpcmVkIHByb3BlcnR5IGZvciB0aGUKLSAgZWxlbWVudCdzIHRleHQu
IEJvdGggcGF0aHMgbXVzdCByZWZlcmVuY2UgZWFjaCBvYmplY3QgaXRzZWxmIGFzIGBjb250ZW50
YDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJl
ci5Db250cm9sbGVyLmV4dGVuZCh7Ci0gICAgcHJvZ3JhbW1lcnM6IFsKLSAgICAgIHtmaXJzdE5h
bWU6ICJZZWh1ZGEiLCBpZDogMX0sCi0gICAgICB7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9
Ci0gICAgXQotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIu
U2VsZWN0Ci0gICAgICAgICBjb250ZW50PXByb2dyYW1tZXJzCi0gICAgICAgICBvcHRpb25WYWx1
ZVBhdGg9ImNvbnRlbnQuaWQiCi0gICAgICAgICBvcHRpb25MYWJlbFBhdGg9ImNvbnRlbnQuZmly
c3ROYW1lIn19Ci0gIGBgYAotCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6
Ci0KLSAgYGBgaHRtbAotICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgotICAgIDxvcHRp
b24gdmFsdWU9IjEiPlllaHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwv
b3B0aW9uPgotICA8L3NlbGVjdD4KLSAgYGBgCi0KLSAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9m
IHRoZSBzZWxlY3RlZCBgPG9wdGlvbj5gIHdpdGhpbiBhbiBgRW1iZXIuU2VsZWN0YAotICBjYW4g
YmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBvbiBhbm90aGVyIG9iamVjdDoKLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVu
ZCh7Ci0gICAgcHJvZ3JhbW1lcnM6IFsKLSAgICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDog
MX0sCi0gICAgICB7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9Ci0gICAgXSwKLSAgICBjdXJy
ZW50UHJvZ3JhbW1lcjogewotICAgICAgaWQ6IDIKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBg
YGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJv
Z3JhbW1lcnMKLSAgICAgICAgIG9wdGlvblZhbHVlUGF0aD0iY29udGVudC5pZCIKLSAgICAgICAg
IG9wdGlvbkxhYmVsUGF0aD0iY29udGVudC5maXJzdE5hbWUiCi0gICAgICAgICB2YWx1ZT1jdXJy
ZW50UHJvZ3JhbW1lci5pZH19Ci0gIGBgYAotCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93
aW5nIEhUTUwgd2l0aCBhIHNlbGVjdGVkIG9wdGlvbjoKLQotICBgYGBodG1sCi0gIDxzZWxlY3Qg
Y2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRp
b24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlv
bj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVk
IGVsZW1lbnQgYnkgc2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxs
IHVwZGF0ZSB0aGUgYGlkYCBvZiBgY3VycmVudFByb2dyYW1tZXJgCi0gIHRvIG1hdGNoIHRoZSBg
dmFsdWVgIHByb3BlcnR5IG9mIHRoZSBuZXdseSBzZWxlY3RlZCBgPG9wdGlvbj5gLgotCi0gIEFs
dGVybmF0aXZlbHksIHlvdSBjYW4gY29udHJvbCBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgdW5kZXJs
eWluZyBvYmplY3RzCi0gIHVzZWQgdG8gcmVuZGVyIGVhY2ggb2JqZWN0IGJ5IGJpbmRpbmcgdGhl
IGBzZWxlY3Rpb25gIG9wdGlvbi4gV2hlbiB0aGUgc2VsZWN0ZWQKLSAgYDxvcHRpb24+YCBpcyBj
aGFuZ2VkLCB0aGUgcHJvcGVydHkgcGF0aCBwcm92aWRlZCB0byBgc2VsZWN0aW9uYAotICB3aWxs
IGJlIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvbnRlbnQgb2JqZWN0IG9mIHRoZSByZW5kZXJlZCBg
PG9wdGlvbj5gCi0gIGVsZW1lbnQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkUGVy
c29uOiBudWxsLAotICAgIHByb2dyYW1tZXJzOiBbCi0gICAgICB7Zmlyc3ROYW1lOiAiWWVodWRh
IiwgaWQ6IDF9LAotICAgICAge2ZpcnN0TmFtZTogIlRvbSIsICAgIGlkOiAyfQotICAgIF0KLSAg
fSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t2aWV3IEVtYmVyLlNlbGVjdAotICAg
ICAgICAgY29udGVudD1wcm9ncmFtbWVycwotICAgICAgICAgb3B0aW9uVmFsdWVQYXRoPSJjb250
ZW50LmlkIgotICAgICAgICAgb3B0aW9uTGFiZWxQYXRoPSJjb250ZW50LmZpcnN0TmFtZSIKLSAg
ICAgICAgIHNlbGVjdGlvbj1zZWxlY3RlZFBlcnNvbn19Ci0gIGBgYAotCi0gIFdvdWxkIHJlc3Vs
dCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0aCBhIHNlbGVjdGVkIG9wdGlvbjoKLQotICBgYGBo
dG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0i
MSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9InNlbGVj
dGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEludGVyYWN0aW5nIHdp
dGggdGhlIHJlbmRlcmVkIGVsZW1lbnQgYnkgc2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KLSAg
KCdZZWh1ZGEnKSB3aWxsIHVwZGF0ZSB0aGUgYHNlbGVjdGVkUGVyc29uYCB0byBtYXRjaCB0aGUg
b2JqZWN0IG9mCi0gIHRoZSBuZXdseSBzZWxlY3RlZCBgPG9wdGlvbj5gLiBJbiB0aGlzIGNhc2Ug
aXQgaXMgdGhlIGZpcnN0IG9iamVjdAotICBpbiB0aGUgYHByb2dyYW1tZXJzYAotCi0gICMjIFN1
cHBseWluZyBhIFByb21wdAotCi0gIEEgYG51bGxgIHZhbHVlIGZvciB0aGUgYEVtYmVyLlNlbGVj
dGAncyBgdmFsdWVgIG9yIGBzZWxlY3Rpb25gIHByb3BlcnR5Ci0gIHJlc3VsdHMgaW4gdGhlcmUg
YmVpbmcgbm8gYDxvcHRpb24+YCB3aXRoIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGU6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxl
ci5leHRlbmQoewotICAgIHNlbGVjdGVkUHJvZ3JhbW1lcjogbnVsbCwKLSAgICBwcm9ncmFtbWVy
czogWwotICAgICAgIlllaHVkYSIsCi0gICAgICAiVG9tIgotICAgIF0KLSAgfSk7Ci0gIGBgYAot
Ci0gIGBgYCBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRl
bnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIHZhbHVlPXNlbGVjdGVkUHJvZ3JhbW1lcgotICB9fQot
ICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0
bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZ
ZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRp
b24+Ci0gIDwvc2VsZWN0PgotICBgYGAKLQotICBBbHRob3VnaCBgc2VsZWN0ZWRQcm9ncmFtbWVy
YCBpcyBgbnVsbGAgYW5kIG5vIGA8b3B0aW9uPmAKLSAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1
dGUgdGhlIHJlbmRlcmVkIEhUTUwgd2lsbCBkaXNwbGF5IHRoZQotICBmaXJzdCBpdGVtIGFzIHRo
b3VnaCBpdCB3ZXJlIHNlbGVjdGVkLiBZb3UgY2FuIHN1cHBseSBhIHN0cmluZwotICB2YWx1ZSBm
b3IgdGhlIGBFbWJlci5TZWxlY3RgIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rp
b24KLSAgd2l0aCB0aGUgYHByb21wdGAgb3B0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
LkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBz
ZWxlY3RlZFByb2dyYW1tZXI6IG51bGwsCi0gICAgcHJvZ3JhbW1lcnM6IFsKLSAgICAgICJZZWh1
ZGEiLAotICAgICAgIlRvbSIKLSAgICBdCi0gIH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJz
Ci0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAg
ICAgICAgIHZhbHVlPXNlbGVjdGVkUHJvZ3JhbW1lcgotICAgICAgICAgcHJvbXB0PSJQbGVhc2Ug
c2VsZWN0IGEgbmFtZSIKLSAgfX0KLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xs
b3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+
Ci0gICAgPG9wdGlvbj5QbGVhc2Ugc2VsZWN0IGEgbmFtZTwvb3B0aW9uPgotICAgIDxvcHRpb24g
dmFsdWU9IlllaHVkYSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iVG9tIj5U
b208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEBjbGFzcyBTZWxlY3QKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuU2VsZWN0ID0g
RW1iZXIuVmlldy5leHRlbmQoewotICB0YWdOYW1lOiAnc2VsZWN0JywKLSAgY2xhc3NOYW1lczog
WydlbWJlci1zZWxlY3QnXSwKLSAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLnRl
bXBsYXRlKGZ1bmN0aW9uIGFub255bW91cyhIYW5kbGViYXJzLGRlcHRoMCxoZWxwZXJzLHBhcnRp
YWxzLGRhdGEpIHsKLXRoaXMuY29tcGlsZXJJbmZvID0gWzQsJz49IDEuMC4wJ107Ci1oZWxwZXJz
ID0gdGhpcy5tZXJnZShoZWxwZXJzLCBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMpOyBkYXRhID0g
ZGF0YSB8fCB7fTsKLSAgdmFyIGJ1ZmZlciA9ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFzaENv
bnRleHRzLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbiwgc2VsZj10aGlz
OwotCi1mdW5jdGlvbiBwcm9ncmFtMShkZXB0aDAsZGF0YSkgewotICAKLSAgdmFyIGJ1ZmZlciA9
ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFzaENvbnRleHRzOwotICBkYXRhLmJ1ZmZlci5wdXNo
KCI8b3B0aW9uIHZhbHVlPVwiXCI+Iik7Ci0gIGhhc2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4
dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVycy5fdHJpYWdlTXVzdGFjaGUuY2FsbChkZXB0aDAs
ICJ2aWV3LnByb21wdCIsIHtoYXNoOnt9LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxo
YXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7
Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEp
OyB9Ci0gIGRhdGEuYnVmZmVyLnB1c2goIjwvb3B0aW9uPiIpOwotICByZXR1cm4gYnVmZmVyOwot
ICB9Ci0KLWZ1bmN0aW9uIHByb2dyYW0zKGRlcHRoMCxkYXRhKSB7Ci0gIAotICB2YXIgc3RhY2sx
LCBoYXNoVHlwZXMsIGhhc2hDb250ZXh0czsKLSAgaGFzaFR5cGVzID0ge307Ci0gIGhhc2hDb250
ZXh0cyA9IHt9OwotICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAsICJ2aWV3Lmdy
b3VwZWRDb250ZW50Iiwge2hhc2g6e30saW52ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFt
KDQsIHByb2dyYW00LCBkYXRhKSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENv
bnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOwotICBp
ZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQot
ICBlbHNlIHsgZGF0YS5idWZmZXIucHVzaCgnJyk7IH0KLSAgfQotZnVuY3Rpb24gcHJvZ3JhbTQo
ZGVwdGgwLGRhdGEpIHsKLSAgCi0gIHZhciBoYXNoQ29udGV4dHMsIGhhc2hUeXBlczsKLSAgaGFz
aENvbnRleHRzID0geydjb250ZW50JzogZGVwdGgwLCdsYWJlbCc6IGRlcHRoMH07Ci0gIGhhc2hU
eXBlcyA9IHsnY29udGVudCc6ICJJRCIsJ2xhYmVsJzogIklEIn07Ci0gIGRhdGEuYnVmZmVyLnB1
c2goZXNjYXBlRXhwcmVzc2lvbihoZWxwZXJzLnZpZXcuY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3Vw
VmlldyIsIHtoYXNoOnsKLSAgICAnY29udGVudCc6ICgiY29udGVudCIpLAotICAgICdsYWJlbCc6
ICgibGFiZWwiKQotICB9LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4
dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSkpKTsKLSAgfQot
Ci1mdW5jdGlvbiBwcm9ncmFtNihkZXB0aDAsZGF0YSkgewotICAKLSAgdmFyIHN0YWNrMSwgaGFz
aFR5cGVzLCBoYXNoQ29udGV4dHM7Ci0gIGhhc2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMg
PSB7fTsKLSAgc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwLCAidmlldy5jb250ZW50
Iiwge2hhc2g6e30saW52ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFtKDcsIHByb2dyYW03
LCBkYXRhKSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hD
b250ZXh0cyxoYXNoVHlwZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwg
c3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQotICBlbHNlIHsgZGF0
YS5idWZmZXIucHVzaCgnJyk7IH0KLSAgfQotZnVuY3Rpb24gcHJvZ3JhbTcoZGVwdGgwLGRhdGEp
IHsKLSAgCi0gIHZhciBoYXNoQ29udGV4dHMsIGhhc2hUeXBlczsKLSAgaGFzaENvbnRleHRzID0g
eydjb250ZW50JzogZGVwdGgwfTsKLSAgaGFzaFR5cGVzID0geydjb250ZW50JzogIklEIn07Ci0g
IGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhwcmVzc2lvbihoZWxwZXJzLnZpZXcuY2FsbChkZXB0
aDAsICJ2aWV3Lm9wdGlvblZpZXciLCB7aGFzaDp7Ci0gICAgJ2NvbnRlbnQnOiAoIiIpCi0gIH0s
Y29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMs
aGFzaFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRhdGF9KSkpOwotICB9Ci0KLSAgaGFzaFR5cGVzID0g
e307Ci0gIGhhc2hDb250ZXh0cyA9IHt9OwotICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwo
ZGVwdGgwLCAidmlldy5wcm9tcHQiLCB7aGFzaDp7fSxpbnZlcnNlOnNlbGYubm9vcCxmbjpzZWxm
LnByb2dyYW0oMSwgcHJvZ3JhbTEsIGRhdGEpLGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQi
XSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRh
fSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFj
azEpOyB9Ci0gIGhhc2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sx
ID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgInZpZXcub3B0aW9uR3JvdXBQYXRoIiwge2hh
c2g6e30saW52ZXJzZTpzZWxmLnByb2dyYW0oNiwgcHJvZ3JhbTYsIGRhdGEpLGZuOnNlbGYucHJv
Z3JhbSgzLCBwcm9ncmFtMywgZGF0YSksY29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhh
c2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFzaFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRhdGF9KTsK
LSAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0gMCkgeyBkYXRhLmJ1ZmZlci5wdXNoKHN0YWNrMSk7
IH0KLSAgcmV0dXJuIGJ1ZmZlcjsKLSAgCi19KSwKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsnbXVs
dGlwbGUnLCAnZGlzYWJsZWQnLCAndGFiaW5kZXgnLCAnbmFtZSddLAotCi0gIC8qKgotICAgIFRo
ZSBgbXVsdGlwbGVgIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQuIEluZGljYXRlcyB3
aGV0aGVyIG11bHRpcGxlCi0gICAgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuCi0KLSAgICBAcHJv
cGVydHkgbXVsdGlwbGUKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAg
Ki8KLSAgbXVsdGlwbGU6IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBgZGlzYWJsZWRgIGF0dHJp
YnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQuIEluZGljYXRlcyB3aGV0aGVyCi0gICAgdGhlIGVs
ZW1lbnQgaXMgZGlzYWJsZWQgZnJvbSBpbnRlcmFjdGlvbnMuCi0KLSAgICBAcHJvcGVydHkgZGlz
YWJsZWQKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgZGlz
YWJsZWQ6IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBsaXN0IG9mIG9wdGlvbnMuCi0KLSAgICBJ
ZiBgb3B0aW9uTGFiZWxQYXRoYCBhbmQgYG9wdGlvblZhbHVlUGF0aGAgYXJlIG5vdCBvdmVycmlk
ZGVuLCB0aGlzIHNob3VsZAotICAgIGJlIGEgbGlzdCBvZiBzdHJpbmdzLCB3aGljaCB3aWxsIHNl
cnZlIHNpbXVsdGFuZW91c2x5IGFzIGxhYmVscyBhbmQgdmFsdWVzLgotCi0gICAgT3RoZXJ3aXNl
LCB0aGlzIHNob3VsZCBiZSBhIGxpc3Qgb2Ygb2JqZWN0cy4gRm9yIGluc3RhbmNlOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlNlbGVjdC5jcmVhdGUoewotICAgICAgY29udGVudDog
RW1iZXIuQShbCi0gICAgICAgICAgeyBpZDogMSwgZmlyc3ROYW1lOiAnWWVodWRhJyB9LAotICAg
ICAgICAgIHsgaWQ6IDIsIGZpcnN0TmFtZTogJ1RvbScgfQotICAgICAgICBdKSwKLSAgICAgIG9w
dGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQuZmlyc3ROYW1lJywKLSAgICAgIG9wdGlvblZhbHVlUGF0
aDogJ2NvbnRlbnQuaWQnCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgY29udGVu
dAotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBu
dWxsLAotCi0gIC8qKgotICAgIFdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2VgLCB0aGUgZWxlbWVu
dCBvZiBgY29udGVudGAgdGhhdCBpcyBjdXJyZW50bHkKLSAgICBzZWxlY3RlZCwgaWYgYW55Lgot
Ci0gICAgV2hlbiBgbXVsdGlwbGVgIGlzIGB0cnVlYCwgYW4gYXJyYXkgb2Ygc3VjaCBlbGVtZW50
cy4KLQotICAgIEBwcm9wZXJ0eSBzZWxlY3Rpb24KLSAgICBAdHlwZSBPYmplY3Qgb3IgQXJyYXkK
LSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHNlbGVjdGlvbjogbnVsbCwKLQotICAvKioKLSAg
ICBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgKHdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2VgKSwg
dmFsdWUgY2FuIGJlIHVzZWQgdG8KLSAgICBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgdmFs
dWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkgaXQncyB2YWx1ZS4KLQotICAgIEl0IGlzIG5vdCBj
dXJyZW50bHkgc3VwcG9ydGVkIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLgotCi0gICAgQHBy
b3BlcnR5IHZhbHVlCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwot
ICB2YWx1ZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIGlmIChh
cmd1bWVudHMubGVuZ3RoID09PSAyKSB7IHJldHVybiB2YWx1ZTsgfQotICAgIHZhciB2YWx1ZVBh
dGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/Lywg
JycpOwotICAgIHJldHVybiB2YWx1ZVBhdGggPyBnZXQodGhpcywgJ3NlbGVjdGlvbi4nICsgdmFs
dWVQYXRoKSA6IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0gIH0pLnByb3BlcnR5KCdzZWxlY3Rp
b24nKSwKLQotICAvKioKLSAgICBJZiBnaXZlbiwgYSB0b3AtbW9zdCBkdW1teSBvcHRpb24gd2ls
bCBiZSByZW5kZXJlZCB0byBzZXJ2ZSBhcyBhIHVzZXIKLSAgICBwcm9tcHQuCi0KLSAgICBAcHJv
cGVydHkgcHJvbXB0Ci0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwot
ICBwcm9tcHQ6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIHBhdGggb2YgdGhlIG9wdGlvbiBsYWJl
bHMuIFNlZSBbY29udGVudF0oL2FwaS9jbGFzc2VzL0VtYmVyLlNlbGVjdC5odG1sI3Byb3BlcnR5
X2NvbnRlbnQpLgotCi0gICAgQHByb3BlcnR5IG9wdGlvbkxhYmVsUGF0aAotICAgIEB0eXBlIFN0
cmluZwotICAgIEBkZWZhdWx0ICdjb250ZW50JwotICAqLwotICBvcHRpb25MYWJlbFBhdGg6ICdj
b250ZW50JywKLQotICAvKioKLSAgICBUaGUgcGF0aCBvZiB0aGUgb3B0aW9uIHZhbHVlcy4gU2Vl
IFtjb250ZW50XSgvYXBpL2NsYXNzZXMvRW1iZXIuU2VsZWN0Lmh0bWwjcHJvcGVydHlfY29udGVu
dCkuCi0KLSAgICBAcHJvcGVydHkgb3B0aW9uVmFsdWVQYXRoCi0gICAgQHR5cGUgU3RyaW5nCi0g
ICAgQGRlZmF1bHQgJ2NvbnRlbnQnCi0gICovCi0gIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQn
LAotCi0gIC8qKgotICAgIFRoZSBwYXRoIG9mIHRoZSBvcHRpb24gZ3JvdXAuCi0gICAgV2hlbiB0
aGlzIHByb3BlcnR5IGlzIHVzZWQsIGBjb250ZW50YCBzaG91bGQgYmUgc29ydGVkIGJ5IGBvcHRp
b25Hcm91cFBhdGhgLgotCi0gICAgQHByb3BlcnR5IG9wdGlvbkdyb3VwUGF0aAotICAgIEB0eXBl
IFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgb3B0aW9uR3JvdXBQYXRoOiBudWxs
LAotCi0gIC8qKgotICAgIFRoZSB2aWV3IGNsYXNzIGZvciBvcHRncm91cC4KLQotICAgIEBwcm9w
ZXJ0eSBncm91cFZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIu
U2VsZWN0T3B0Z3JvdXAKLSAgKi8KLSAgZ3JvdXBWaWV3OiBFbWJlci5TZWxlY3RPcHRncm91cCwK
LQotICBncm91cGVkQ29udGVudDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IGdyb3VwUGF0aCA9IGdldCh0aGlzLCAnb3B0aW9uR3JvdXBQYXRoJyk7Ci0gICAgdmFyIGdyb3Vw
ZWRDb250ZW50ID0gRW1iZXIuQSgpOwotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50JykgfHwgW107Ci0KLSAgICBmb3JFYWNoKGNvbnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAg
ICAgIHZhciBsYWJlbCA9IGdldChpdGVtLCBncm91cFBhdGgpOwotCi0gICAgICBpZiAoZ2V0KGdy
b3VwZWRDb250ZW50LCAnbGFzdE9iamVjdC5sYWJlbCcpICE9PSBsYWJlbCkgewotICAgICAgICBn
cm91cGVkQ29udGVudC5wdXNoT2JqZWN0KHsKLSAgICAgICAgICBsYWJlbDogbGFiZWwsCi0gICAg
ICAgICAgY29udGVudDogRW1iZXIuQSgpCi0gICAgICAgIH0pOwotICAgICAgfQotCi0gICAgICBn
ZXQoZ3JvdXBlZENvbnRlbnQsICdsYXN0T2JqZWN0LmNvbnRlbnQnKS5wdXNoKGl0ZW0pOwotICAg
IH0pOwotCi0gICAgcmV0dXJuIGdyb3VwZWRDb250ZW50OwotICB9KS5wcm9wZXJ0eSgnb3B0aW9u
R3JvdXBQYXRoJywgJ2NvbnRlbnQuQGVhY2gnKSwKLQotICAvKioKLSAgICBUaGUgdmlldyBjbGFz
cyBmb3Igb3B0aW9uLgotCi0gICAgQHByb3BlcnR5IG9wdGlvblZpZXcKLSAgICBAdHlwZSBFbWJl
ci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIuU2VsZWN0T3B0aW9uCi0gICovCi0gIG9wdGlvblZp
ZXc6IEVtYmVyLlNlbGVjdE9wdGlvbiwKLQotICBfY2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICBp
ZiAoZ2V0KHRoaXMsICdtdWx0aXBsZScpKSB7Ci0gICAgICB0aGlzLl9jaGFuZ2VNdWx0aXBsZSgp
OwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLl9jaGFuZ2VTaW5nbGUoKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgc2VsZWN0aW9uRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignc2VsZWN0aW9uLkBlYWNo
JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9u
Jyk7Ci0gICAgaWYgKGdldCh0aGlzLCAnbXVsdGlwbGUnKSkgewotICAgICAgaWYgKCFpc0FycmF5
KHNlbGVjdGlvbikpIHsKLSAgICAgICAgc2V0KHRoaXMsICdzZWxlY3Rpb24nLCBFbWJlci5BKFtz
ZWxlY3Rpb25dKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHRoaXMuX3NlbGVj
dGlvbkRpZENoYW5nZU11bHRpcGxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX3NlbGVj
dGlvbkRpZENoYW5nZVNpbmdsZSgpOwotICAgIH0KLSAgfSksCi0KLSAgdmFsdWVEaWRDaGFuZ2U6
IEVtYmVyLm9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0g
Z2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScp
LAotICAgICAgICB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxh
Y2UoL15jb250ZW50XC4/LywgJycpLAotICAgICAgICBzZWxlY3RlZFZhbHVlID0gKHZhbHVlUGF0
aCA/IGdldCh0aGlzLCAnc2VsZWN0aW9uLicgKyB2YWx1ZVBhdGgpIDogZ2V0KHRoaXMsICdzZWxl
Y3Rpb24nKSksCi0gICAgICAgIHNlbGVjdGlvbjsKLQotICAgIGlmICh2YWx1ZSAhPT0gc2VsZWN0
ZWRWYWx1ZSkgewotICAgICAgc2VsZWN0aW9uID0gY29udGVudCA/IGNvbnRlbnQuZmluZChmdW5j
dGlvbihvYmopIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID09PSAodmFsdWVQYXRoID8gZ2V0KG9i
aiwgdmFsdWVQYXRoKSA6IG9iaik7Ci0gICAgICB9KSA6IG51bGw7Ci0KLSAgICAgIHRoaXMuc2V0
KCdzZWxlY3Rpb24nLCBzZWxlY3Rpb24pOwotICAgIH0KLSAgfSksCi0KLQotICBfdHJpZ2dlckNo
YW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0
aW9uJyk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpOwotCi0gICAgaWYgKCFF
bWJlci5pc05vbmUoc2VsZWN0aW9uKSkgeyB0aGlzLnNlbGVjdGlvbkRpZENoYW5nZSgpOyB9Ci0g
ICAgaWYgKCFFbWJlci5pc05vbmUodmFsdWUpKSB7IHRoaXMudmFsdWVEaWRDaGFuZ2UoKTsgfQot
Ci0gICAgdGhpcy5fY2hhbmdlKCk7Ci0gIH0sCi0KLSAgX2NoYW5nZVNpbmdsZTogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHNlbGVjdGVkSW5kZXggPSB0aGlzLiQoKVswXS5zZWxlY3RlZEluZGV4LAot
ICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHByb21wdCA9
IGdldCh0aGlzLCAncHJvbXB0Jyk7Ci0KLSAgICBpZiAoIWNvbnRlbnQgfHwgIWdldChjb250ZW50
LCAnbGVuZ3RoJykpIHsgcmV0dXJuOyB9Ci0gICAgaWYgKHByb21wdCAmJiBzZWxlY3RlZEluZGV4
ID09PSAwKSB7IHNldCh0aGlzLCAnc2VsZWN0aW9uJywgbnVsbCk7IHJldHVybjsgfQotCi0gICAg
aWYgKHByb21wdCkgeyBzZWxlY3RlZEluZGV4IC09IDE7IH0KLSAgICBzZXQodGhpcywgJ3NlbGVj
dGlvbicsIGNvbnRlbnQub2JqZWN0QXQoc2VsZWN0ZWRJbmRleCkpOwotICB9LAotCi0KLSAgX2No
YW5nZU11bHRpcGxlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJCgnb3B0
aW9uOnNlbGVjdGVkJyksCi0gICAgICAgIHByb21wdCA9IGdldCh0aGlzLCAncHJvbXB0JyksCi0g
ICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAotICAgICAgICBjb250ZW50ID0gZ2V0KHRo
aXMsICdjb250ZW50JyksCi0gICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9u
Jyk7Ci0KLSAgICBpZiAoIWNvbnRlbnQpIHsgcmV0dXJuOyB9Ci0gICAgaWYgKG9wdGlvbnMpIHsK
LSAgICAgIHZhciBzZWxlY3RlZEluZGV4ZXMgPSBvcHRpb25zLm1hcChmdW5jdGlvbigpIHsKLSAg
ICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBvZmZzZXQ7Ci0gICAgICB9KS50b0FycmF5KCk7Ci0g
ICAgICB2YXIgbmV3U2VsZWN0aW9uID0gY29udGVudC5vYmplY3RzQXQoc2VsZWN0ZWRJbmRleGVz
KTsKLQotICAgICAgaWYgKGlzQXJyYXkoc2VsZWN0aW9uKSkgewotICAgICAgICByZXBsYWNlKHNl
bGVjdGlvbiwgMCwgZ2V0KHNlbGVjdGlvbiwgJ2xlbmd0aCcpLCBuZXdTZWxlY3Rpb24pOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgc2V0KHRoaXMsICdzZWxlY3Rpb24nLCBuZXdTZWxlY3Rpb24p
OwotICAgICAgfQotICAgIH0KLSAgfSwKLQotICBfc2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlOiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWxlbWVudCcpOwotICAgIGlmICgh
ZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcp
LAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3NlbGVjdGlvbicpLAotICAgICAgICBz
ZWxlY3Rpb25JbmRleCA9IGNvbnRlbnQgPyBpbmRleE9mKGNvbnRlbnQsIHNlbGVjdGlvbikgOiAt
MSwKLSAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdwcm9tcHQnKTsKLQotICAgIGlmIChwcm9t
cHQpIHsgc2VsZWN0aW9uSW5kZXggKz0gMTsgfQotICAgIGlmIChlbCkgeyBlbC5zZWxlY3RlZElu
ZGV4ID0gc2VsZWN0aW9uSW5kZXg7IH0KLSAgfSwKLQotICBfc2VsZWN0aW9uRGlkQ2hhbmdlTXVs
dGlwbGU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50
JyksCi0gICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyksCi0gICAgICAg
IHNlbGVjdGVkSW5kZXhlcyA9IGNvbnRlbnQgPyBpbmRleGVzT2YoY29udGVudCwgc2VsZWN0aW9u
KSA6IFstMV0sCi0gICAgICAgIHByb21wdCA9IGdldCh0aGlzLCAncHJvbXB0JyksCi0gICAgICAg
IG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAotICAgICAgICBvcHRpb25zID0gdGhpcy4kKCdvcHRp
b24nKSwKLSAgICAgICAgYWRqdXN0ZWQ7Ci0KLSAgICBpZiAob3B0aW9ucykgewotICAgICAgb3B0
aW9ucy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICBhZGp1c3RlZCA9IHRoaXMuaW5kZXggPiAt
MSA/IHRoaXMuaW5kZXggLSBvZmZzZXQgOiAtMTsKLSAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGlu
ZGV4T2Yoc2VsZWN0ZWRJbmRleGVzLCBhZGp1c3RlZCkgPiAtMTsKLSAgICAgIH0pOwotICAgIH0K
LSAgfSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRo
aXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0aGlzLCB0aGlzLl90cmlnZ2VyQ2hhbmdlKTsKLSAg
ICB0aGlzLm9uKCJjaGFuZ2UiLCB0aGlzLCB0aGlzLl9jaGFuZ2UpOwotICB9Ci19KTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1oYW5kbGViYXJzLWNvbXBpbGVyCi0qLwotCi0vKioKLQotICBUaGUgYHt7aW5wdXR9fWAg
aGVscGVyIGluc2VydHMgYW4gSFRNTCBgPGlucHV0PmAgdGFnIGludG8gdGhlIHRlbXBsYXRlLAot
ICB3aXRoIGEgYHR5cGVgIHZhbHVlIG9mIGVpdGhlciBgdGV4dGAgb3IgYGNoZWNrYm94YC4gSWYg
bm8gYHR5cGVgIGlzIHByb3ZpZGVkLAotICBgdGV4dGAgd2lsbCBiZSB0aGUgZGVmYXVsdCB2YWx1
ZSBhcHBsaWVkLiBUaGUgYXR0cmlidXRlcyBvZiBge3tpbnB1dH19YAotICBtYXRjaCB0aG9zZSBv
ZiB0aGUgbmF0aXZlIEhUTUwgdGFnIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgZm9yIHRoZXNlIHR3
byB0eXBlcy4KLQotICAjIyBVc2UgYXMgdGV4dCBmaWVsZAotICBBbiBge3tpbnB1dH19YCB3aXRo
IG5vIGB0eXBlYCBvciBhIGB0eXBlYCBvZiBgdGV4dGAgd2lsbCByZW5kZXIgYW4gSFRNTCB0ZXh0
IGlucHV0LgotICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0
aGUgaGVscGVyOgotCi0qIGB2YWx1ZWAKLSogYHNpemVgCi0qIGBuYW1lYAotKiBgcGF0dGVybmAK
LSogYHBsYWNlaG9sZGVyYAotKiBgZGlzYWJsZWRgCi0qIGBtYXhsZW5ndGhgCi0qIGB0YWJpbmRl
eGAKLQotCi0gIFdoZW4gc2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhlc2UgdmFsdWVzIHdpbGwg
YmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAotICBlbGVtZW50LiBXaGVuIGxlZnQgdW5x
dW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCi0g
IHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBj
b250cm9sbGVyIGluc3RhbmNlKS4KLQotICAjIyBVbmJvdW5kOgotCi0gIGBgYGhhbmRsZWJhcnMK
LSAge3tpbnB1dCB2YWx1ZT0iaHR0cDovL3d3dy5mYWNlYm9vay5jb20ifX0KLSAgYGBgCi0KLQot
ICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iaHR0cDovL3d3dy5mYWNlYm9v
ay5jb20iLz4KLSAgYGBgCi0KLSAgIyMgQm91bmQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIGZp
cnN0TmFtZTogIlN0YW5sZXkiLAotICAgIGVudHJ5Tm90QWxsb3dlZDogdHJ1ZQotICB9KTsKLSAg
YGBgCi0KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Zmly
c3ROYW1lIGRpc2FibGVkPWVudHJ5Tm90QWxsb3dlZCBzaXplPSI1MCJ9fQotICBgYGAKLQotCi0g
IGBgYGh0bWwKLSAgPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSJTdGFubGV5IiBkaXNhYmxlZD0i
ZGlzYWJsZWQiIHNpemU9IjUwIi8+Ci0gIGBgYAotCi0gICMjIEV4dGVuc2lvbgotCi0gIEludGVy
bmFsbHksIGB7e2lucHV0IHR5cGU9InRleHQifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVt
YmVyLlRleHRGaWVsZGAsIHBhc3NpbmcKLSAgYXJndW1lbnRzIGZyb20gdGhlIGhlbHBlciB0byBg
RW1iZXIuVGV4dEZpZWxkYCdzIGBjcmVhdGVgIG1ldGhvZC4gWW91IGNhbiBleHRlbmQgdGhlCi0g
IGNhcGFibGlsdGllcyBvZiB0ZXh0IGlucHV0cyBpbiB5b3VyIGFwcGxpY2F0aW9ucyBieSByZW9w
ZW5pbmcgdGhpcyBjbGFzcy4gRm9yIGV4YW1wbGUsCi0gIGlmIHlvdSBhcmUgZGVwbG95aW5nIHRv
IGJyb3dzZXJzIHdoZXJlIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBpcyB1c2VkLCB5b3UKLSAg
Y2FuIGFkZCB0aGlzIHRvIHRoZSBgVGV4dEZpZWxkYCdzIGBhdHRyaWJ1dGVCaW5kaW5nc2AgcHJv
cGVydHk6Ci0KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLlRleHRGaWVsZC5yZW9wZW4oewot
ICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3JlcXVpcmVkJ10KLSAgfSk7Ci0gIGBgYAotCi0gIEtl
ZXAgaW4gbWluZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRleHRGaWVsZGAgc3ViY2xhc3NlcyB0aGF0
IGBFbWJlci5UZXh0RmllbGRgCi0gIGl0c2VsZiBleHRlbmRzIGBFbWJlci5Db21wb25lbnRgLCBt
ZWFuaW5nIHRoYXQgaXQgZG9lcyBOT1QgaW5oZXJpdAotICB0aGUgYGNvbnRyb2xsZXJgIG9mIHRo
ZSBwYXJlbnQgdmlldy4KLQotICBTZWUgbW9yZSBhYm91dCBbRW1iZXIgY29tcG9uZW50c10oYXBp
L2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpCi0KLQotICAjIyBVc2UgYXMgY2hlY2tib3gK
LQotICBBbiBge3tpbnB1dH19YCB3aXRoIGEgYHR5cGVgIG9mIGBjaGVja2JveGAgd2lsbCByZW5k
ZXIgYW4gSFRNTCBjaGVja2JveCBpbnB1dC4KLSAgVGhlIGZvbGxvd2luZyBIVE1MIGF0dHJpYnV0
ZXMgY2FuIGJlIHNldCB2aWEgdGhlIGhlbHBlcjoKLQotKiBgY2hlY2tlZGAKLSogYGRpc2FibGVk
YAotKiBgdGFiaW5kZXhgCi0qIGBpbmRldGVybWluYXRlYAotKiBgbmFtZWAKLQotCi0gIFdoZW4g
c2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZGlyZWN0bHkgYXBw
bGllZCB0byB0aGUgSFRNTAotICBlbGVtZW50LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZh
bHVlcyB3aWxsIGJlIGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCi0gIHRlbXBsYXRlJ3MgY3Vy
cmVudCByZW5kZXJpbmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3Rh
bmNlKS4KLQotICAjIyBVbmJvdW5kOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tpbnB1dCB0eXBl
PSJjaGVja2JveCIgbmFtZT0iaXNBZG1pbiJ9fQotICBgYGAKLQotICBgYGBodG1sCi0gIDxpbnB1
dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNBZG1pbiIgLz4KLSAgYGBgCi0KLSAgIyMgQm91bmQ6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIu
Q29udHJvbGxlci5leHRlbmQoewotICAgIGlzQWRtaW46IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0K
LSAgYGBgaGFuZGxlYmFycwotICB7e2lucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPWlzQWRt
aW4gfX0KLSAgYGBgCi0KLQotICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hl
Y2tlZD0iY2hlY2tlZCIgLz4KLSAgYGBgCi0KLSAgIyMgRXh0ZW5zaW9uCi0KLSAgSW50ZXJuYWxs
eSwgYHt7aW5wdXQgdHlwZT0iY2hlY2tib3gifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVt
YmVyLkNoZWNrYm94YCwgcGFzc2luZwotICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBF
bWJlci5DaGVja2JveGAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4gZXh0ZW5kIHRoZQotICBj
YXBhYmxpbHRpZXMgb2YgY2hlY2tib3ggaW5wdXRzIGluIHlvdXIgYXBwbGljYXRpb25zIGJ5IHJl
b3BlbmluZyB0aGlzIGNsYXNzLiBGb3IgZXhhbXBsZSwKLSAgaWYgeW91IHdhbnRlZCB0byBhZGQg
YSBjc3MgY2xhc3MgdG8gYWxsIGNoZWNrYm94ZXMgaW4geW91ciBhcHBsaWNhdGlvbjoKLQotCi0g
IGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuQ2hlY2tib3gucmVvcGVuKHsKLSAgICBjbGFzc05hbWVz
OiBbJ215LWFwcC1jaGVja2JveCddCi0gIH0pOwotICBgYGAKLQotCi0gIEBtZXRob2QgaW5wdXQK
LSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25z
Ci0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaW5wdXQnLCBmdW5jdGlvbihv
cHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgnWW91IGNhbiBvbmx5IHBhc3MgYXR0cmlidXRlcyB0
byB0aGUgYGlucHV0YCBoZWxwZXIsIG5vdCBhcmd1bWVudHMnLCBhcmd1bWVudHMubGVuZ3RoIDwg
Mik7Ci0KLSAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsCi0gICAgICB0eXBlcyA9IG9wdGlvbnMu
aGFzaFR5cGVzLAotICAgICAgaW5wdXRUeXBlID0gaGFzaC50eXBlLAotICAgICAgb25FdmVudCA9
IGhhc2gub247Ci0KLSAgZGVsZXRlIGhhc2gudHlwZTsKLSAgZGVsZXRlIGhhc2gub247Ci0KLSAg
aWYgKGlucHV0VHlwZSA9PT0gJ2NoZWNrYm94JykgewotICAgIHJldHVybiBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIEVtYmVyLkNoZWNrYm94LCBvcHRpb25zKTsKLSAg
fSBlbHNlIHsKLSAgICBpZiAoaW5wdXRUeXBlKSB7IGhhc2gudHlwZSA9IGlucHV0VHlwZTsgfQot
ICAgIGhhc2gub25FdmVudCA9IG9uRXZlbnQgfHwgJ2VudGVyJzsKLSAgICByZXR1cm4gRW1iZXIu
SGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBFbWJlci5UZXh0RmllbGQsIG9wdGlv
bnMpOwotICB9Ci19KTsKLQotLyoqCi0gIGB7e3RleHRhcmVhfX1gIGluc2VydHMgYSBuZXcgaW5z
dGFuY2Ugb2YgYDx0ZXh0YXJlYT5gIHRhZyBpbnRvIHRoZSB0ZW1wbGF0ZS4KLSAgVGhlIGF0dHJp
YnV0ZXMgb2YgYHt7dGV4dGFyZWF9fWAgbWF0Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRh
Z3MgYXMKLSAgY2xvc2VseSBhcyBwb3NzaWJsZS4KLQotICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0
cmlidXRlcyBjYW4gYmUgc2V0OgotCi0gICAgKiBgdmFsdWVgCi0gICAgKiBgbmFtZWAKLSAgICAq
IGByb3dzYAotICAgICogYGNvbHNgCi0gICAgKiBgcGxhY2Vob2xkZXJgCi0gICAgKiBgZGlzYWJs
ZWRgCi0gICAgKiBgbWF4bGVuZ3RoYAotICAgICogYHRhYmluZGV4YAotCi0gIFdoZW4gc2V0IHRv
IGEgcXVvdGVkIHN0cmluZywgdGhlc2UgdmFsdWUgd2lsbCBiZSBkaXJlY3RseSBhcHBsaWVkIHRv
IHRoZSBIVE1MCi0gIGVsZW1lbnQuIFdoZW4gbGVmdCB1bnF1b3RlZCwgdGhlc2UgdmFsdWVzIHdp
bGwgYmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBvbiB0aGUKLSAgdGVtcGxhdGUncyBjdXJyZW50IHJl
bmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGljYWxseSBhIGNvbnRyb2xsZXIgaW5zdGFuY2UpLgot
Ci0gIFVuYm91bmQ6Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e3RleHRhcmVhIHZhbHVlPSJMb3Rz
IG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1QgYm91bmQifX0KLSAgYGBgCi0KLSAgV291bGQgcmVz
dWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDx0ZXh0YXJlYSBjbGFz
cz0iZW1iZXItdGV4dC1hcmVhIj4KLSAgICBMb3RzIG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1Qg
Ym91bmQKLSAgPC90ZXh0YXJlYT4KLSAgYGBgCi0KLSAgQm91bmQ6Ci0KLSAgSW4gdGhlIGZvbGxv
d2luZyBleGFtcGxlLCB0aGUgYHdyaXR0ZW5Xb3Jkc2AgcHJvcGVydHkgb24gYEFwcC5BcHBsaWNh
dGlvbkNvbnRyb2xsZXJgCi0gIHdpbGwgYmUgdXBkYXRlZCBsaXZlIGFzIHRoZSB1c2VyIHR5cGVz
ICdMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCcgaW50bwotICB0aGUgdGV4dCBhcmVhIG9mIHRo
ZWlyIGJyb3dzZXIncyB3aW5kb3cuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHdyaXR0ZW5Xb3Jk
czogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kIgotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFu
ZGxlYmFycwotICB7e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jkc319Ci0gIGBgYAotCi0gICBX
b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHRleHRh
cmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJv
dW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBgYAotCi0gIElmIHlvdSB3YW50ZWQgYSBvbmUgd2F5IGJp
bmRpbmcgYmV0d2VlbiB0aGUgdGV4dCBhcmVhIGFuZCBhIGRpdiB0YWcKLSAgc29tZXdoZXJlIGVs
c2Ugb24geW91ciBzY3JlZW4sIHlvdSBjb3VsZCB1c2UgYEVtYmVyLmNvbXB1dGVkLm9uZVdheWA6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIu
Q29udHJvbGxlci5leHRlbmQoewotICAgIHdyaXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0
IElTIGJvdW5kIiwKLSAgICBvdXRwdXRXcml0dGVuV29yZHM6IEVtYmVyLmNvbXB1dGVkLm9uZVdh
eSgid3JpdHRlbldvcmRzIikKLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t0
ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQotCi0gIDxkaXY+Ci0gICAge3tvdXRwdXRXcml0
dGVuV29yZHN9fQotICA8L2Rpdj4KLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xs
b3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1h
cmVhIj4KLSAgICBMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZAotICA8L3RleHRhcmVhPgotCi0g
IDwtLSB0aGUgZm9sbG93aW5nIGRpdiB3aWxsIGJlIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGFzIHlv
dSB0eXBlIC0tPgotCi0gIDxkaXY+Ci0gICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQKLSAg
PC9kaXY+Ci0gIGBgYAotCi0gIEZpbmFsbHksIHRoaXMgZXhhbXBsZSByZWFsbHkgc2hvd3MgdGhl
IHBvd2VyIGFuZCBlYXNlIG9mIEVtYmVyIHdoZW4gdHdvCi0gIHByb3BlcnRpZXMgYXJlIGJvdW5k
IHRvIGVhY2hvdGhlciB2aWEgYEVtYmVyLmNvbXB1dGVkLmFsaWFzYC4gVHlwZSBpbnRvCi0gIGVp
dGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5J2xsIGJvdGggc3RheSBpbiBzeW5jLiBOb3RlIHRo
YXQKLSAgYEVtYmVyLmNvbXB1dGVkLmFsaWFzYCBjb3N0cyBtb3JlIGluIHRlcm1zIG9mIHBlcmZv
cm1hbmNlLCBzbyBvbmx5IHVzZSBpdCB3aGVuCi0gIHlvdXIgcmVhbGx5IGJpbmRpbmcgaW4gYm90
aCBkaXJlY3Rpb25zOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQ29udHJv
bGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICB3cml0dGVuV29yZHM6ICJMb3Rz
IG9mIHRleHQgdGhhdCBJUyBib3VuZCIsCi0gICAgdHdvV2F5V3JpdHRlbldvcmRzOiBFbWJlci5j
b21wdXRlZC5hbGlhcygid3JpdHRlbldvcmRzIikKLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRs
ZWJhcnMKLSAge3t0ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQotICB7e3RleHRhcmVhIHZh
bHVlPXR3b1dheVdyaXR0ZW5Xb3Jkc319Ci0gIGBgYAotCi0gIGBgYGh0bWwKLSAgPHRleHRhcmVh
IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0
aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0KLSAgPC0tIGJvdGggdXBkYXRlZCBpbiByZWFs
IHRpbWUgLS0+Ci0KLSAgPHRleHRhcmVhIGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci10ZXh0LWFy
ZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBg
YAotCi0gICMjIEV4dGVuc2lvbgotCi0gIEludGVybmFsbHksIGB7e3RleHRhcmVhfX1gIGNyZWF0
ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRleHRBcmVhYCwgcGFzc2luZwotICBhcmd1bWVudHMg
ZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5UZXh0QXJlYWAncyBgY3JlYXRlYCBtZXRob2QuIFlv
dSBjYW4KLSAgZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGV4dCBhcmVhcyBpbiB5b3VyIGFw
cGxpY2F0aW9uIGJ5IHJlb3BlbmluZyB0aGlzCi0gIGNsYXNzLiBGb3IgZXhhbXBsZSwgaWYgeW91
IGFyZSBkZXBsb3lpbmcgdG8gYnJvd3NlcnMgd2hlcmUgdGhlIGByZXF1aXJlZGAKLSAgYXR0cmli
dXRlIGlzIHVzZWQsIHlvdSBjYW4gZ2xvYmFsbHkgYWRkIHN1cHBvcnQgZm9yIHRoZSBgcmVxdWly
ZWRgIGF0dHJpYnV0ZQotICBvbiBhbGwgYHt7dGV4dGFyZWF9fWBzJyBpbiB5b3VyIGFwcCBieSBy
ZW9wZW5pbmcgYEVtYmVyLlRleHRBcmVhYCBvcgotICBgRW1iZXIuVGV4dFN1cHBvcnRgIGFuZCBh
ZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1dGVCaW5kaW5nc2AgY29uY2F0ZW5hdGVkCi0gIHByb3Bl
cnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuVGV4dEFyZWEucmVvcGVuKHsKLSAgICBh
dHRyaWJ1dGVCaW5kaW5nczogWydyZXF1aXJlZCddCi0gIH0pOwotICBgYGAKLQotICBLZWVwIGlu
IG1pbmQgd2hlbiB3cml0aW5nIGBFbWJlci5UZXh0QXJlYWAgc3ViY2xhc3NlcyB0aGF0IGBFbWJl
ci5UZXh0QXJlYWAKLSAgaXRzZWxmIGV4dGVuZHMgYEVtYmVyLkNvbXBvbmVudGAsIG1lYW5pbmcg
dGhhdCBpdCBkb2VzIE5PVCBpbmhlcml0Ci0gIHRoZSBgY29udHJvbGxlcmAgb2YgdGhlIHBhcmVu
dCB2aWV3LgotCi0gIFNlZSBtb3JlIGFib3V0IFtFbWJlciBjb21wb25lbnRzXShhcGkvY2xhc3Nl
cy9FbWJlci5Db21wb25lbnQuaHRtbCkKLQotICBAbWV0aG9kIHRleHRhcmVhCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3RleHRhcmVhJywgZnVuY3Rpb24ob3B0aW9ucykg
ewotICBFbWJlci5hc3NlcnQoJ1lvdSBjYW4gb25seSBwYXNzIGF0dHJpYnV0ZXMgdG8gdGhlIGB0
ZXh0YXJlYWAgaGVscGVyLCBub3QgYXJndW1lbnRzJywgYXJndW1lbnRzLmxlbmd0aCA8IDIpOwot
Ci0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLAotICAgICAgdHlwZXMgPSBvcHRpb25zLmhhc2hU
eXBlczsKLQotICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlz
LCBFbWJlci5UZXh0QXJlYSwgb3B0aW9ucyk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlv
bigpIHsKLUVtYmVyLkNvbXBvbmVudExvb2t1cCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBs
b29rdXBGYWN0b3J5OiBmdW5jdGlvbihuYW1lLCBjb250YWluZXIpIHsKLQotICAgIGNvbnRhaW5l
ciA9IGNvbnRhaW5lciB8fCB0aGlzLmNvbnRhaW5lcjsKLQotICAgIHZhciBmdWxsTmFtZSA9ICdj
b21wb25lbnQ6JyArIG5hbWUsCi0gICAgICAgIHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6
Y29tcG9uZW50cy8nICsgbmFtZSwKLSAgICAgICAgdGVtcGxhdGVSZWdpc3RlcmVkID0gY29udGFp
bmVyICYmIGNvbnRhaW5lci5oYXModGVtcGxhdGVGdWxsTmFtZSk7Ci0KLSAgICBpZiAodGVtcGxh
dGVSZWdpc3RlcmVkKSB7Ci0gICAgICBjb250YWluZXIuaW5qZWN0aW9uKGZ1bGxOYW1lLCAnbGF5
b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7Ci0gICAgfQotCi0gICAgdmFyIENvbXBvbmVudCA9IGNv
bnRhaW5lci5sb29rdXBGYWN0b3J5KGZ1bGxOYW1lKTsKLQotICAgIC8vIE9ubHkgdHJlYXQgYXMg
YSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBjb21wb25lbnQKLSAgICAvLyBvciBhIHRlbXBsYXRl
IGhhcyBiZWVuIHJlZ2lzdGVyZWQuCi0gICAgaWYgKHRlbXBsYXRlUmVnaXN0ZXJlZCB8fCBDb21w
b25lbnQpIHsKLSAgICAgIGlmICghQ29tcG9uZW50KSB7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdp
c3RlcihmdWxsTmFtZSwgRW1iZXIuQ29tcG9uZW50KTsKLSAgICAgICAgQ29tcG9uZW50ID0gY29u
dGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIENv
bXBvbmVudDsKLSAgICB9Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1oYW5kbGViYXJzCi0qLwotCi0vKioKLSAgRmluZCB0ZW1wbGF0ZXMgc3RvcmVkIGluIHRo
ZSBoZWFkIHRhZyBhcyBzY3JpcHQgdGFncyBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQotICB0byBg
RW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9iYWwgYEVtYmVyLlRFTVBMQVRFU2Agb2JqZWN0LiBU
aGlzIHdpbGwgYmUgcnVuCi0gIGFzIGFzIGpRdWVyeSBET00tcmVhZHkgY2FsbGJhY2suCi0KLSAg
U2NyaXB0IHRhZ3Mgd2l0aCBgdGV4dC94LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKLSAg
d2l0aCBFbWJlcidzIEhhbmRsZWJhcnMgYW5kIGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmll
dydzIHRlbXBsYXRlLgotICBUaG9zZSB3aXRoIHR5cGUgYHRleHQveC1yYXctaGFuZGxlYmFyc2Ag
d2lsbCBiZSBjb21waWxlZCB3aXRoIHJlZ3VsYXIKLSAgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRh
YmxlIGZvciB1c2UgaW4gdmlld3MnIGNvbXB1dGVkIHByb3BlcnRpZXMuCi0KLSAgQHByaXZhdGUK
LSAgQG1ldGhvZCBib290c3RyYXAKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gIEBzdGF0aWMK
LSAgQHBhcmFtIGN0eAotKi8KLUVtYmVyLkhhbmRsZWJhcnMuYm9vdHN0cmFwID0gZnVuY3Rpb24o
Y3R4KSB7Ci0gIHZhciBzZWxlY3RvcnMgPSAnc2NyaXB0W3R5cGU9InRleHQveC1oYW5kbGViYXJz
Il0sIHNjcmlwdFt0eXBlPSJ0ZXh0L3gtcmF3LWhhbmRsZWJhcnMiXSc7Ci0KLSAgRW1iZXIuJChz
ZWxlY3RvcnMsIGN0eCkKLSAgICAuZWFjaChmdW5jdGlvbigpIHsKLSAgICAvLyBHZXQgYSByZWZl
cmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcKLSAgICB2YXIgc2NyaXB0ID0gRW1iZXIuJCh0aGlzKTsK
LQotICAgIHZhciBjb21waWxlID0gKHNjcmlwdC5hdHRyKCd0eXBlJykgPT09ICd0ZXh0L3gtcmF3
LWhhbmRsZWJhcnMnKSA/Ci0gICAgICAgICAgICAgICAgICBFbWJlci4kLnByb3h5KEhhbmRsZWJh
cnMuY29tcGlsZSwgSGFuZGxlYmFycykgOgotICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94
eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUsIEVtYmVyLkhhbmRsZWJhcnMpLAotICAgICAgLy8g
R2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQsIHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBsYXRl
TmFtZSBwcm9wZXJ0eS4KLSAgICAgIC8vIEZpcnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUtbmFt
ZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNrIHRvIGl0cwotICAgICAgLy8gaWQgaWYgbm8gbmFt
ZSBpcyBmb3VuZC4KLSAgICAgIHRlbXBsYXRlTmFtZSA9IHNjcmlwdC5hdHRyKCdkYXRhLXRlbXBs
YXRlLW5hbWUnKSB8fCBzY3JpcHQuYXR0cignaWQnKSB8fCAnYXBwbGljYXRpb24nLAotICAgICAg
dGVtcGxhdGUgPSBjb21waWxlKHNjcmlwdC5odG1sKCkpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGVt
cGxhdGUgb2Ygc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0gICAgaWYgKEVtYmVyLlRFTVBMQVRF
U1t0ZW1wbGF0ZU5hbWVdICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5F
cnJvcignVGVtcGxhdGUgbmFtZWQgIicgKyB0ZW1wbGF0ZU5hbWUgICsgJyIgYWxyZWFkeSBleGlz
dHMuJyk7Ci0gICAgfQotCi0gICAgLy8gRm9yIHRlbXBsYXRlcyB3aGljaCBoYXZlIGEgbmFtZSwg
d2Ugc2F2ZSB0aGVtIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gdGhlIERPTQotICAgIEVtYmVy
LlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdID0gdGVtcGxhdGU7Ci0KLSAgICAvLyBSZW1vdmUgc2Ny
aXB0IHRhZyBmcm9tIERPTQotICAgIHNjcmlwdC5yZW1vdmUoKTsKLSAgfSk7Ci19OwotCi1mdW5j
dGlvbiBib290c3RyYXAoKSB7Ci0gIEVtYmVyLkhhbmRsZWJhcnMuYm9vdHN0cmFwKCBFbWJlci4k
KGRvY3VtZW50KSApOwotfQotCi1mdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudExvb2t1cChjb250
YWluZXIpIHsKLSAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb21wb25lbnQtbG9va3VwOm1haW4nLCBF
bWJlci5Db21wb25lbnRMb29rdXApOwotfQotCi0vKgotICBXZSB0aWUgdGhpcyB0byBhcHBsaWNh
dGlvbi5sb2FkIHRvIGVuc3VyZSB0aGF0IHdlJ3ZlIGF0IGxlYXN0Ci0gIGF0dGVtcHRlZCB0byBi
b290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGxvYWRlZC4KLQot
ICBXZSBhbHNvIHRpZSB0aGlzIHRvIGRvY3VtZW50IHJlYWR5IHNpbmNlIHdlJ3JlIGd1YXJhbnRl
ZWQgdGhhdCBhbGwKLSAgdGhlIGlubGluZSB0ZW1wbGF0ZXMgYXJlIHByZXNlbnQgYXQgdGhpcyBw
b2ludC4KLQotICBUaGVyZSdzIG5vIGhhcm0gdG8gcnVubmluZyB0aGlzIHR3aWNlLCBzaW5jZSB3
ZSByZW1vdmUgdGhlIHRlbXBsYXRlcwotICBmcm9tIHRoZSBET00gYWZ0ZXIgcHJvY2Vzc2luZy4K
LSovCi0KLUVtYmVyLm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNh
dGlvbikgewotICBBcHBsaWNhdGlvbi5pbml0aWFsaXplcih7Ci0gICAgbmFtZTogJ2RvbVRlbXBs
YXRlcycsCi0gICAgaW5pdGlhbGl6ZTogYm9vdHN0cmFwCi0gIH0pOwotCi0gIEFwcGxpY2F0aW9u
LmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAncmVnaXN0ZXJDb21wb25lbnRMb29rdXAnLAotICAg
IGFmdGVyOiAnZG9tVGVtcGxhdGVzJywKLSAgICBpbml0aWFsaXplOiByZWdpc3RlckNvbXBvbmVu
dExvb2t1cAotICB9KTsKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1F
bWJlciBIYW5kbGViYXJzCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxl
YmFycwotQHJlcXVpcmVzIGVtYmVyLXZpZXdzCi0qLwotCi1FbWJlci5ydW5Mb2FkSG9va3MoJ0Vt
YmVyLkhhbmRsZWJhcnMnLCBFbWJlci5IYW5kbGViYXJzKTsKLQotfSkoKTsKLQotKGZ1bmN0aW9u
KCkgewotZGVmaW5lKCJyb3V0ZS1yZWNvZ25pemVyIiwKLSAgW10sCi0gIGZ1bmN0aW9uKCkgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgc3BlY2lhbHMgPSBbCi0gICAgICAnLycsICcuJywg
JyonLCAnKycsICc/JywgJ3wnLAotICAgICAgJygnLCAnKScsICdbJywgJ10nLCAneycsICd9Jywg
J1xcJwotICAgIF07Ci0KLSAgICB2YXIgZXNjYXBlUmVnZXggPSBuZXcgUmVnRXhwKCcoXFwnICsg
c3BlY2lhbHMuam9pbignfFxcJykgKyAnKScsICdnJyk7Ci0KLSAgICAvLyBBIFNlZ21lbnQgcmVw
cmVzZW50cyBhIHNlZ21lbnQgaW4gdGhlIG9yaWdpbmFsIHJvdXRlIGRlc2NyaXB0aW9uLgotICAg
IC8vIEVhY2ggU2VnbWVudCB0eXBlIHByb3ZpZGVzIGFuIGBlYWNoQ2hhcmAgYW5kIGByZWdleGAg
bWV0aG9kLgotICAgIC8vCi0gICAgLy8gVGhlIGBlYWNoQ2hhcmAgbWV0aG9kIGludm9rZXMgdGhl
IGNhbGxiYWNrIHdpdGggb25lIG9yIG1vcmUgY2hhcmFjdGVyCi0gICAgLy8gc3BlY2lmaWNhdGlv
bnMuIEEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY29uc3VtZXMgb25lIG9yIG1vcmUgaW5wdXQK
LSAgICAvLyBjaGFyYWN0ZXJzLgotICAgIC8vCi0gICAgLy8gVGhlIGByZWdleGAgbWV0aG9kIHJl
dHVybnMgYSByZWdleCBmcmFnbWVudCBmb3IgdGhlIHNlZ21lbnQuIElmIHRoZQotICAgIC8vIHNl
Z21lbnQgaXMgYSBkeW5hbWljIG9mIHN0YXIgc2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFs
c28gaW5jbHVkZXMKLSAgICAvLyBhIGNhcHR1cmUuCi0gICAgLy8KLSAgICAvLyBBIGNoYXJhY3Rl
ciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgotICAgIC8vCi0gICAgLy8gKiBgdmFsaWRDaGFyc2A6
IGEgU3RyaW5nIHdpdGggYSBsaXN0IG9mIGFsbCB2YWxpZCBjaGFyYWN0ZXJzLCBvcgotICAgIC8v
ICogYGludmFsaWRDaGFyc2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0IG9mIGFsbCBpbnZhbGlkIGNo
YXJhY3RlcnMKLSAgICAvLyAqIGByZXBlYXRgOiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgc3BlY2lm
aWNhdGlvbiBjYW4gcmVwZWF0Ci0KLSAgICBmdW5jdGlvbiBTdGF0aWNTZWdtZW50KHN0cmluZykg
eyB0aGlzLnN0cmluZyA9IHN0cmluZzsgfQotICAgIFN0YXRpY1NlZ21lbnQucHJvdG90eXBlID0g
ewotICAgICAgZWFjaENoYXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgICAgIHZhciBzdHJp
bmcgPSB0aGlzLnN0cmluZywgY2hhcjsKLQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9c3RyaW5n
Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBjaGFyID0gc3RyaW5nLmNoYXJBdChpKTsK
LSAgICAgICAgICBjYWxsYmFjayh7IHZhbGlkQ2hhcnM6IGNoYXIgfSk7Ci0gICAgICAgIH0KLSAg
ICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
c3RyaW5nLnJlcGxhY2UoZXNjYXBlUmVnZXgsICdcXCQxJyk7Ci0gICAgICB9LAotCi0gICAgICBn
ZW5lcmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0cmluZzsKLSAgICAg
IH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24gRHluYW1pY1NlZ21lbnQobmFtZSkgeyB0aGlzLm5h
bWUgPSBuYW1lOyB9Ci0gICAgRHluYW1pY1NlZ21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFj
aENoYXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgICAgIGNhbGxiYWNrKHsgaW52YWxpZENo
YXJzOiAiLyIsIHJlcGVhdDogdHJ1ZSB9KTsKLSAgICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIoW14vXSspIjsKLSAgICAgIH0sCi0KLSAgICAgIGdl
bmVyYXRlOiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5h
bWVdOwotICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7
IHRoaXMubmFtZSA9IG5hbWU7IH0KLSAgICBTdGFyU2VnbWVudC5wcm90b3R5cGUgPSB7Ci0gICAg
ICBlYWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2soeyBpbnZh
bGlkQ2hhcnM6ICIiLCByZXBlYXQ6IHRydWUgfSk7Ci0gICAgICB9LAotCi0gICAgICByZWdleDog
ZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiAiKC4rKSI7Ci0gICAgICB9LAotCi0gICAgICBn
ZW5lcmF0ZTogZnVuY3Rpb24ocGFyYW1zKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbXNbdGhpcy5u
YW1lXTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24gRXBzaWxvblNlZ21lbnQoKSB7
fQotICAgIEVwc2lsb25TZWdtZW50LnByb3RvdHlwZSA9IHsKLSAgICAgIGVhY2hDaGFyOiBmdW5j
dGlvbigpIHt9LAotICAgICAgcmVnZXg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIiI7IH0sCi0gICAg
ICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7IHJldHVybiAiIjsgfQotICAgIH07Ci0KLSAgICBmdW5j
dGlvbiBwYXJzZShyb3V0ZSwgbmFtZXMsIHR5cGVzKSB7Ci0gICAgICAvLyBub3JtYWxpemUgcm91
dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSAiLyIuIFJlY29nbml0aW9uIHdpbGwKLSAgICAgIC8v
IGFsc28gbm9ybWFsaXplLgotICAgICAgaWYgKHJvdXRlLmNoYXJBdCgwKSA9PT0gIi8iKSB7IHJv
dXRlID0gcm91dGUuc3Vic3RyKDEpOyB9Ci0KLSAgICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNw
bGl0KCIvIiksIHJlc3VsdHMgPSBbXTsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPXNlZ21lbnRz
Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXSwg
bWF0Y2g7Ci0KLSAgICAgICAgaWYgKG1hdGNoID0gc2VnbWVudC5tYXRjaCgvXjooW15cL10rKSQv
KSkgewotICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRHluYW1pY1NlZ21lbnQobWF0Y2hbMV0p
KTsKLSAgICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFdKTsKLSAgICAgICAgICB0eXBlcy5keW5h
bWljcysrOwotICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gc2VnbWVudC5tYXRjaCgvXlwqKFte
XC9dKykkLykpIHsKLSAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNo
WzFdKSk7Ci0gICAgICAgICAgbmFtZXMucHVzaChtYXRjaFsxXSk7Ci0gICAgICAgICAgdHlwZXMu
c3RhcnMrKzsKLSAgICAgICAgfSBlbHNlIGlmKHNlZ21lbnQgPT09ICIiKSB7Ci0gICAgICAgICAg
cmVzdWx0cy5wdXNoKG5ldyBFcHNpbG9uU2VnbWVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICByZXN1bHRzLnB1c2gobmV3IFN0YXRpY1NlZ21lbnQoc2VnbWVudCkpOwotICAgICAg
ICAgIHR5cGVzLnN0YXRpY3MrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4g
cmVzdWx0czsKLSAgICB9Ci0KLSAgICAvLyBBIFN0YXRlIGhhcyBhIGNoYXJhY3RlciBzcGVjaWZp
Y2F0aW9uIGFuZCAoYGNoYXJTcGVjYCkgYW5kIGEgbGlzdCBvZiBwb3NzaWJsZQotICAgIC8vIHN1
YnNlcXVlbnQgc3RhdGVzIChgbmV4dFN0YXRlc2ApLgotICAgIC8vCi0gICAgLy8gSWYgYSBTdGF0
ZSBpcyBhbiBhY2NlcHRpbmcgc3RhdGUsIGl0IHdpbGwgYWxzbyBoYXZlIHNldmVyYWwgYWRkaXRp
b25hbAotICAgIC8vIHByb3BlcnRpZXM6Ci0gICAgLy8KLSAgICAvLyAqIGByZWdleGA6IEEgcmVn
dWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCB0byBleHRyYWN0IHBhcmFtZXRlcnMgZnJvbSBw
YXRocwotICAgIC8vICAgdGhhdCByZWFjaGVkIHRoaXMgYWNjZXB0aW5nIHN0YXRlLgotICAgIC8v
ICogYGhhbmRsZXJzYDogSW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnZlcnQgdGhlIGxpc3Qgb2Yg
Y2FwdHVyZXMgaW50byBjYWxscwotICAgIC8vICAgdG8gcmVnaXN0ZXJlZCBoYW5kbGVycyB3aXRo
IHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwotICAgIC8vICogYHR5cGVzYDogSG93IG1hbnkgc3Rh
dGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVudHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0bwotICAg
IC8vICAgZGVjaWRlIHdoaWNoIHJvdXRlIHRvIHVzZSBpZiBtdWx0aXBsZSByZWdpc3RlcmVkIHJv
dXRlcyBtYXRjaCBhIHBhdGguCi0gICAgLy8KLSAgICAvLyBDdXJyZW50bHksIFN0YXRlIGlzIGlt
cGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBuZXh0U3RhdGVzYCBhbmQKLSAgICAv
LyBjb21wYXJpbmcgYSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhZ2FpbnN0IGEgY2hhcmFjdGVy
LiBBIG1vcmUgZWZmaWNpZW50Ci0gICAgLy8gaW1wbGVtZW50YXRpb24gd291bGQgdXNlIGEgaGFz
aCBvZiBrZXlzIHBvaW50aW5nIGF0IG9uZSBvciBtb3JlIG5leHQgc3RhdGVzLgotCi0gICAgZnVu
Y3Rpb24gU3RhdGUoY2hhclNwZWMpIHsKLSAgICAgIHRoaXMuY2hhclNwZWMgPSBjaGFyU3BlYzsK
LSAgICAgIHRoaXMubmV4dFN0YXRlcyA9IFtdOwotICAgIH0KLQotICAgIFN0YXRlLnByb3RvdHlw
ZSA9IHsKLSAgICAgIGdldDogZnVuY3Rpb24oY2hhclNwZWMpIHsKLSAgICAgICAgdmFyIG5leHRT
dGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXM7Ci0KLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRT
dGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIHZhciBjaGlsZCA9IG5leHRTdGF0
ZXNbaV07Ci0KLSAgICAgICAgICB2YXIgaXNFcXVhbCA9IGNoaWxkLmNoYXJTcGVjLnZhbGlkQ2hh
cnMgPT09IGNoYXJTcGVjLnZhbGlkQ2hhcnM7Ci0gICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwg
JiYgY2hpbGQuY2hhclNwZWMuaW52YWxpZENoYXJzID09PSBjaGFyU3BlYy5pbnZhbGlkQ2hhcnM7
Ci0KLSAgICAgICAgICBpZiAoaXNFcXVhbCkgeyByZXR1cm4gY2hpbGQ7IH0KLSAgICAgICAgfQot
ICAgICAgfSwKLQotICAgICAgcHV0OiBmdW5jdGlvbihjaGFyU3BlYykgewotICAgICAgICB2YXIg
c3RhdGU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFscmVh
ZHkgZXhpc3RzIGluIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gc3RhdGUsIGp1
c3QgcmV0dXJuIHRoYXQgc3RhdGUuCi0gICAgICAgIGlmIChzdGF0ZSA9IHRoaXMuZ2V0KGNoYXJT
cGVjKSkgeyByZXR1cm4gc3RhdGU7IH0KLQotICAgICAgICAvLyBNYWtlIGEgbmV3IHN0YXRlIGZv
ciB0aGUgY2hhcmFjdGVyIHNwZWMKLSAgICAgICAgc3RhdGUgPSBuZXcgU3RhdGUoY2hhclNwZWMp
OwotCi0gICAgICAgIC8vIEluc2VydCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hpbGQgb2YgdGhlIGN1
cnJlbnQgc3RhdGUKLSAgICAgICAgdGhpcy5uZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotCi0gICAg
ICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gcmVwZWF0cywgaW5zZXJ0IHRo
ZSBuZXcgc3RhdGUgYXMgYSBjaGlsZAotICAgICAgICAvLyBvZiBpdHNlbGYuIE5vdGUgdGhhdCB0
aGlzIHdpbGwgbm90IHRyaWdnZXIgYW4gaW5maW5pdGUgbG9vcCBiZWNhdXNlIGVhY2gKLSAgICAg
ICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVjb2duaXRpb24gY29uc3VtZXMgYSBjaGFyYWN0ZXIu
Ci0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsKLSAgICAgICAgICBzdGF0ZS5uZXh0U3Rh
dGVzLnB1c2goc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXcg
c3RhdGUKLSAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgICAgfSwKLQotICAgICAgLy8gRmluZCBh
IGxpc3Qgb2YgY2hpbGQgc3RhdGVzIG1hdGNoaW5nIHRoZSBuZXh0IGNoYXJhY3RlcgotICAgICAg
bWF0Y2g6IGZ1bmN0aW9uKGNoYXIpIHsKLSAgICAgICAgLy8gREVCVUcgIlByb2Nlc3NpbmcgYCIg
KyBjaGFyICsgImA6IgotICAgICAgICB2YXIgbmV4dFN0YXRlcyA9IHRoaXMubmV4dFN0YXRlcywK
LSAgICAgICAgICAgIGNoaWxkLCBjaGFyU3BlYywgY2hhcnM7Ci0KLSAgICAgICAgLy8gREVCVUcg
IiAgIiArIGRlYnVnU3RhdGUodGhpcykKLSAgICAgICAgdmFyIHJldHVybmVkID0gW107Ci0KLSAg
ICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRTdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAg
ICAgICAgIGNoaWxkID0gbmV4dFN0YXRlc1tpXTsKLQotICAgICAgICAgIGNoYXJTcGVjID0gY2hp
bGQuY2hhclNwZWM7Ci0KLSAgICAgICAgICBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZh
bGlkQ2hhcnMpICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4
T2YoY2hhcikgIT09IC0xKSB7IHJldHVybmVkLnB1c2goY2hpbGQpOyB9Ci0gICAgICAgICAgfSBl
bHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hhclNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3VuZGVm
aW5lZCcpIHsKLSAgICAgICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoYXIpID09PSAtMSkgeyBy
ZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IHJldHVybiByZXR1cm5lZDsKLSAgICAgIH0KLQotICAgICAgLyoqIElGIERFQlVHCi0gICAgICAs
IGRlYnVnOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGNoYXJTcGVjID0gdGhpcy5jaGFyU3Bl
YywKLSAgICAgICAgICAgIGRlYnVnID0gIlsiLAotICAgICAgICAgICAgY2hhcnMgPSBjaGFyU3Bl
Yy52YWxpZENoYXJzIHx8IGNoYXJTcGVjLmludmFsaWRDaGFyczsKLQotICAgICAgICBpZiAoY2hh
clNwZWMuaW52YWxpZENoYXJzKSB7IGRlYnVnICs9ICJeIjsgfQotICAgICAgICBkZWJ1ZyArPSBj
aGFyczsKLSAgICAgICAgZGVidWcgKz0gIl0iOwotCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBl
YXQpIHsgZGVidWcgKz0gIisiOyB9Ci0KLSAgICAgICAgcmV0dXJuIGRlYnVnOwotICAgICAgfQot
ICAgICAgRU5EIElGICoqLwotICAgIH07Ci0KLSAgICAvKiogSUYgREVCVUcKLSAgICBmdW5jdGlv
biBkZWJ1Zyhsb2cpIHsKLSAgICAgIGNvbnNvbGUubG9nKGxvZyk7Ci0gICAgfQotCi0gICAgZnVu
Y3Rpb24gZGVidWdTdGF0ZShzdGF0ZSkgewotICAgICAgcmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMu
bWFwKGZ1bmN0aW9uKG4pIHsKLSAgICAgICAgaWYgKG4ubmV4dFN0YXRlcy5sZW5ndGggPT09IDAp
IHsgcmV0dXJuICIoICIgKyBuLmRlYnVnKCkgKyAiIFthY2NlcHRpbmddICkiOyB9Ci0gICAgICAg
IHJldHVybiAiKCAiICsgbi5kZWJ1ZygpICsgIiA8dGhlbj4gIiArIG4ubmV4dFN0YXRlcy5tYXAo
ZnVuY3Rpb24ocykgeyByZXR1cm4gcy5kZWJ1ZygpIH0pLmpvaW4oIiBvciAiKSArICIgKSI7Ci0g
ICAgICB9KS5qb2luKCIsICIpCi0gICAgfQotICAgIEVORCBJRiAqKi8KLQotICAgIC8vIFRoaXMg
aXMgYSBzb21ld2hhdCBuYWl2ZSBzdHJhdGVneSwgYnV0IHNob3VsZCB3b3JrIGluIGEgbG90IG9m
IGNhc2VzCi0gICAgLy8gQSBiZXR0ZXIgc3RyYXRlZ3kgd291bGQgcHJvcGVybHkgcmVzb2x2ZSAv
cG9zdHMvOmlkL25ldyBhbmQgL3Bvc3RzL2VkaXQvOmlkCi0gICAgZnVuY3Rpb24gc29ydFNvbHV0
aW9ucyhzdGF0ZXMpIHsKLSAgICAgIHJldHVybiBzdGF0ZXMuc29ydChmdW5jdGlvbihhLCBiKSB7
Ci0gICAgICAgIGlmIChhLnR5cGVzLnN0YXJzICE9PSBiLnR5cGVzLnN0YXJzKSB7IHJldHVybiBh
LnR5cGVzLnN0YXJzIC0gYi50eXBlcy5zdGFyczsgfQotICAgICAgICBpZiAoYS50eXBlcy5keW5h
bWljcyAhPT0gYi50eXBlcy5keW5hbWljcykgeyByZXR1cm4gYS50eXBlcy5keW5hbWljcyAtIGIu
dHlwZXMuZHluYW1pY3M7IH0KLSAgICAgICAgaWYgKGEudHlwZXMuc3RhdGljcyAhPT0gYi50eXBl
cy5zdGF0aWNzKSB7IHJldHVybiBiLnR5cGVzLnN0YXRpY3MgLSBhLnR5cGVzLnN0YXRpY3M7IH0K
LQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJl
Y29nbml6ZUNoYXIoc3RhdGVzLCBjaGFyKSB7Ci0gICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOwot
Ci0gICAgICBmb3IgKHZhciBpPTAsIGw9c3RhdGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOwotCi0gICAgICAgIG5leHRTdGF0ZXMgPSBuZXh0U3Rh
dGVzLmNvbmNhdChzdGF0ZS5tYXRjaChjaGFyKSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBu
ZXh0U3RhdGVzOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZpbmRIYW5kbGVyKHN0YXRlLCBwYXRo
LCBxdWVyeVBhcmFtcykgewotICAgICAgdmFyIGhhbmRsZXJzID0gc3RhdGUuaGFuZGxlcnMsIHJl
Z2V4ID0gc3RhdGUucmVnZXg7Ci0gICAgICB2YXIgY2FwdHVyZXMgPSBwYXRoLm1hdGNoKHJlZ2V4
KSwgY3VycmVudENhcHR1cmUgPSAxOwotICAgICAgdmFyIHJlc3VsdCA9IFtdOwotCi0gICAgICBm
b3IgKHZhciBpPTAsIGw9aGFuZGxlcnMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIg
aGFuZGxlciA9IGhhbmRsZXJzW2ldLCBuYW1lcyA9IGhhbmRsZXIubmFtZXMsIHBhcmFtcyA9IHt9
LAotICAgICAgICAgIHdhdGNoZWRRdWVyeVBhcmFtcyA9IGhhbmRsZXIucXVlcnlQYXJhbXMgfHwg
W10sCi0gICAgICAgICAgYWN0aXZlUXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAgICBqLCBtOwot
Ci0gICAgICAgIGZvciAoaj0wLCBtPW5hbWVzLmxlbmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAg
ICBwYXJhbXNbbmFtZXNbal1dID0gY2FwdHVyZXNbY3VycmVudENhcHR1cmUrK107Ci0gICAgICAg
IH0KLSAgICAgICAgZm9yIChqPTAsIG09d2F0Y2hlZFF1ZXJ5UGFyYW1zLmxlbmd0aDsgaiA8IG07
IGorKykgewotICAgICAgICAgIHZhciBrZXkgPSB3YXRjaGVkUXVlcnlQYXJhbXNbal07Ci0gICAg
ICAgICAgaWYocXVlcnlQYXJhbXNba2V5XSl7Ci0gICAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFt
c1trZXldID0gcXVlcnlQYXJhbXNba2V5XTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgdmFyIGN1cnJlbnRSZXN1bHQgPSB7IGhhbmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFyYW1z
OiBwYXJhbXMsIGlzRHluYW1pYzogISFuYW1lcy5sZW5ndGggfTsKLSAgICAgICAgaWYod2F0Y2hl
ZFF1ZXJ5UGFyYW1zICYmIHdhdGNoZWRRdWVyeVBhcmFtcy5sZW5ndGggPiAwKSB7Ci0gICAgICAg
ICAgY3VycmVudFJlc3VsdC5xdWVyeVBhcmFtcyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAgICAg
ICB9Ci0gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRSZXN1bHQpOwotICAgICAgfQotCi0gICAg
ICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVu
dFN0YXRlLCBzZWdtZW50KSB7Ci0gICAgICBzZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIp
IHsKLSAgICAgICAgdmFyIHN0YXRlOwotCi0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRT
dGF0ZS5wdXQoY2hhcik7Ci0gICAgICB9KTsKLQotICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTsK
LSAgICB9Ci0KLSAgICAvLyBUaGUgbWFpbiBpbnRlcmZhY2UKLQotICAgIHZhciBSb3V0ZVJlY29n
bml6ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucm9vdFN0YXRlID0gbmV3IFN0YXRlKCk7
Ci0gICAgICB0aGlzLm5hbWVzID0ge307Ci0gICAgfTsKLQotCi0gICAgUm91dGVSZWNvZ25pemVy
LnByb3RvdHlwZSA9IHsKLSAgICAgIGFkZDogZnVuY3Rpb24ocm91dGVzLCBvcHRpb25zKSB7Ci0g
ICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSB0aGlzLnJvb3RTdGF0ZSwgcmVnZXggPSAiXiIsCi0g
ICAgICAgICAgICB0eXBlcyA9IHsgc3RhdGljczogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0s
Ci0gICAgICAgICAgICBoYW5kbGVycyA9IFtdLCBhbGxTZWdtZW50cyA9IFtdLCBuYW1lOwotCi0g
ICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9cm91
dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICB2YXIgcm91dGUgPSByb3V0ZXNbaV0s
IG5hbWVzID0gW107Ci0KLSAgICAgICAgICB2YXIgc2VnbWVudHMgPSBwYXJzZShyb3V0ZS5wYXRo
LCBuYW1lcywgdHlwZXMpOwotCi0gICAgICAgICAgYWxsU2VnbWVudHMgPSBhbGxTZWdtZW50cy5j
b25jYXQoc2VnbWVudHMpOwotCi0gICAgICAgICAgZm9yICh2YXIgaj0wLCBtPXNlZ21lbnRzLmxl
bmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07
Ci0KLSAgICAgICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgRXBzaWxvblNlZ21lbnQpIHsg
Y29udGludWU7IH0KLQotICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwotCi0gICAgICAgICAg
ICAvLyBBZGQgYSAiLyIgZm9yIHRoZSBuZXcgc2VnbWVudAotICAgICAgICAgICAgY3VycmVudFN0
YXRlID0gY3VycmVudFN0YXRlLnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsKLSAgICAgICAgICAg
IHJlZ2V4ICs9ICIvIjsKLQotICAgICAgICAgICAgLy8gQWRkIGEgcmVwcmVzZW50YXRpb24gb2Yg
dGhlIHNlZ21lbnQgdG8gdGhlIE5GQSBhbmQgcmVnZXgKLSAgICAgICAgICAgIGN1cnJlbnRTdGF0
ZSA9IGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KTsKLSAgICAgICAgICAgIHJlZ2V4
ICs9IHNlZ21lbnQucmVnZXgoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB2YXIgaGFuZGxl
ciA9IHsgaGFuZGxlcjogcm91dGUuaGFuZGxlciwgbmFtZXM6IG5hbWVzIH07Ci0gICAgICAgICAg
aWYocm91dGUucXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICAgIGhhbmRsZXIucXVlcnlQYXJhbXMg
PSByb3V0ZS5xdWVyeVBhcmFtczsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaGFuZGxlcnMucHVz
aChoYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0VtcHR5KSB7Ci0gICAgICAg
ICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsK
LSAgICAgICAgICByZWdleCArPSAiLyI7Ci0gICAgICAgIH0KLQotICAgICAgICBjdXJyZW50U3Rh
dGUuaGFuZGxlcnMgPSBoYW5kbGVyczsKLSAgICAgICAgY3VycmVudFN0YXRlLnJlZ2V4ID0gbmV3
IFJlZ0V4cChyZWdleCArICIkIik7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZS50eXBlcyA9IHR5cGVz
OwotCi0gICAgICAgIGlmIChuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLmFzKSB7Ci0gICAgICAg
ICAgdGhpcy5uYW1lc1tuYW1lXSA9IHsKLSAgICAgICAgICAgIHNlZ21lbnRzOiBhbGxTZWdtZW50
cywKLSAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycwotICAgICAgICAgIH07Ci0gICAgICAg
IH0KLSAgICAgIH0sCi0KLSAgICAgIGhhbmRsZXJzRm9yOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAg
ICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0sIHJlc3VsdCA9IFtdOwotICAgICAgICBp
ZiAoIXJvdXRlKSB7IHRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMgbm8gcm91dGUgbmFtZWQgIiAr
IG5hbWUpOyB9Ci0KLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPXJvdXRlLmhhbmRsZXJzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICByZXN1bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSwKLQotICAgICAg
aGFzUm91dGU6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICEhdGhpcy5uYW1lc1tu
YW1lXTsKLSAgICAgIH0sCi0KLSAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMp
IHsKLSAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5uYW1lc1tuYW1lXSwgb3V0cHV0ID0gIiI7Ci0g
ICAgICAgIGlmICghcm91dGUpIHsgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBu
YW1lZCAiICsgbmFtZSk7IH0KLQotICAgICAgICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zZWdtZW50
czsKLQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykg
ewotICAgICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbaV07Ci0KLSAgICAgICAgICBpZiAo
c2VnbWVudCBpbnN0YW5jZW9mIEVwc2lsb25TZWdtZW50KSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAg
ICAgICBvdXRwdXQgKz0gIi8iOwotICAgICAgICAgIG91dHB1dCArPSBzZWdtZW50LmdlbmVyYXRl
KHBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0cHV0LmNoYXJBdCgwKSAhPT0g
Jy8nKSB7IG91dHB1dCA9ICcvJyArIG91dHB1dDsgfQotCi0gICAgICAgIGlmIChwYXJhbXMgJiYg
cGFyYW1zLnF1ZXJ5UGFyYW1zKSB7Ci0gICAgICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJhdGVR
dWVyeVN0cmluZyhwYXJhbXMucXVlcnlQYXJhbXMsIHJvdXRlLmhhbmRsZXJzKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZVF1
ZXJ5U3RyaW5nOiBmdW5jdGlvbihwYXJhbXMsIGhhbmRsZXJzKSB7Ci0gICAgICAgIHZhciBwYWly
cyA9IFtdLCBhbGxvd2VkUGFyYW1zID0gW107Ci0gICAgICAgIGZvcih2YXIgaT0wOyBpIDwgaGFu
ZGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICB2YXIgY3VycmVudFBhcmFtTGlzdCA9IGhh
bmRsZXJzW2ldLnF1ZXJ5UGFyYW1zOwotICAgICAgICAgIGlmKGN1cnJlbnRQYXJhbUxpc3QpIHsK
LSAgICAgICAgICAgIGFsbG93ZWRQYXJhbXMucHVzaC5hcHBseShhbGxvd2VkUGFyYW1zLCBjdXJy
ZW50UGFyYW1MaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKHZhciBr
ZXkgaW4gcGFyYW1zKSB7Ci0gICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkp
KSB7Ci0gICAgICAgICAgICBpZihhbGxvd2VkUGFyYW1zLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsK
LSAgICAgICAgICAgICAgdGhyb3cgJ1F1ZXJ5IHBhcmFtICInICsga2V5ICsgJyIgaXMgbm90IHNw
ZWNpZmllZCBhcyBhIHZhbGlkIHBhcmFtIGZvciB0aGlzIHJvdXRlJzsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtc1trZXldOwotICAgICAgICAgICAgdmFyIHBh
aXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9PSB0
cnVlKSB7Ci0gICAgICAgICAgICAgIHBhaXIgKz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZh
bHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhaXJzLnB1c2gocGFpcik7Ci0gICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhaXJzLmxlbmd0aCA9PT0gMCkgeyBy
ZXR1cm4gJyc7IH0KLQotICAgICAgICByZXR1cm4gIj8iICsgcGFpcnMuam9pbigiJiIpOwotICAg
ICAgfSwKLQotICAgICAgcGFyc2VRdWVyeVN0cmluZzogZnVuY3Rpb24ocXVlcnlTdHJpbmcpIHsK
LSAgICAgICAgdmFyIHBhaXJzID0gcXVlcnlTdHJpbmcuc3BsaXQoIiYiKSwgcXVlcnlQYXJhbXMg
PSB7fTsKLSAgICAgICAgZm9yKHZhciBpPTA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewotICAg
ICAgICAgIHZhciBwYWlyICAgICAgPSBwYWlyc1tpXS5zcGxpdCgnPScpLAotICAgICAgICAgICAg
ICBrZXkgICAgICAgPSBkZWNvZGVVUklDb21wb25lbnQocGFpclswXSksCi0gICAgICAgICAgICAg
IHZhbHVlICAgICA9IHBhaXJbMV0gPyBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSkgOiB0cnVl
OwotICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm4gcXVlcnlQYXJhbXM7Ci0gICAgICB9LAotCi0gICAgICByZWNvZ25pemU6IGZ1bmN0
aW9uKHBhdGgpIHsKLSAgICAgICAgdmFyIHN0YXRlcyA9IFsgdGhpcy5yb290U3RhdGUgXSwKLSAg
ICAgICAgICAgIHBhdGhMZW4sIGksIGwsIHF1ZXJ5U3RhcnQsIHF1ZXJ5UGFyYW1zID0ge307Ci0K
LSAgICAgICAgcXVlcnlTdGFydCA9IHBhdGguaW5kZXhPZignPycpOwotICAgICAgICBpZiAocXVl
cnlTdGFydCAhPT0gLTEpIHsKLSAgICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBwYXRoLnN1YnN0
cihxdWVyeVN0YXJ0ICsgMSwgcGF0aC5sZW5ndGgpOwotICAgICAgICAgIHBhdGggPSBwYXRoLnN1
YnN0cigwLCBxdWVyeVN0YXJ0KTsKLSAgICAgICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VR
dWVyeVN0cmluZyhxdWVyeVN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBERUJVRyBH
Uk9VUCBwYXRoCi0KLSAgICAgICAgaWYgKHBhdGguY2hhckF0KDApICE9PSAiLyIpIHsgcGF0aCA9
ICIvIiArIHBhdGg7IH0KLQotICAgICAgICBwYXRoTGVuID0gcGF0aC5sZW5ndGg7Ci0gICAgICAg
IGlmIChwYXRoTGVuID4gMSAmJiBwYXRoLmNoYXJBdChwYXRoTGVuIC0gMSkgPT09ICIvIikgewot
ICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBwYXRoTGVuIC0gMSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBmb3IgKGk9MCwgbD1wYXRoLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAg
ICBzdGF0ZXMgPSByZWNvZ25pemVDaGFyKHN0YXRlcywgcGF0aC5jaGFyQXQoaSkpOwotICAgICAg
ICAgIGlmICghc3RhdGVzLmxlbmd0aCkgeyBicmVhazsgfQotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gRU5EIERFQlVHIEdST1VQCi0KLSAgICAgICAgdmFyIHNvbHV0aW9ucyA9IFtdOwotICAgICAg
ICBmb3IgKGk9MCwgbD1zdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIGlmIChz
dGF0ZXNbaV0uaGFuZGxlcnMpIHsgc29sdXRpb25zLnB1c2goc3RhdGVzW2ldKTsgfQotICAgICAg
ICB9Ci0KLSAgICAgICAgc3RhdGVzID0gc29ydFNvbHV0aW9ucyhzb2x1dGlvbnMpOwotCi0gICAg
ICAgIHZhciBzdGF0ZSA9IHNvbHV0aW9uc1swXTsKLQotICAgICAgICBpZiAoc3RhdGUgJiYgc3Rh
dGUuaGFuZGxlcnMpIHsKLSAgICAgICAgICByZXR1cm4gZmluZEhhbmRsZXIoc3RhdGUsIHBhdGgs
IHF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlv
biBUYXJnZXQocGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKLSAgICAgIHRoaXMucGF0aCA9IHBh
dGg7Ci0gICAgICB0aGlzLm1hdGNoZXIgPSBtYXRjaGVyOwotICAgICAgdGhpcy5kZWxlZ2F0ZSA9
IGRlbGVnYXRlOwotICAgIH0KLQotICAgIFRhcmdldC5wcm90b3R5cGUgPSB7Ci0gICAgICB0bzog
ZnVuY3Rpb24odGFyZ2V0LCBjYWxsYmFjaykgewotICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aGlz
LmRlbGVnYXRlOwotCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS53aWxsQWRkUm91
dGUpIHsKLSAgICAgICAgICB0YXJnZXQgPSBkZWxlZ2F0ZS53aWxsQWRkUm91dGUodGhpcy5tYXRj
aGVyLnRhcmdldCwgdGFyZ2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWF0Y2hlci5h
ZGQodGhpcy5wYXRoLCB0YXJnZXQpOwotCi0gICAgICAgIGlmIChjYWxsYmFjaykgewotICAgICAg
ICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVz
dCBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYHRvYCIpOyB9Ci0g
ICAgICAgICAgdGhpcy5tYXRjaGVyLmFkZENoaWxkKHRoaXMucGF0aCwgdGFyZ2V0LCBjYWxsYmFj
aywgdGhpcy5kZWxlZ2F0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAg
ICB9LAotCi0gICAgICB3aXRoUXVlcnlQYXJhbXM6IGZ1bmN0aW9uKCkgewotICAgICAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoInlvdSBtdXN0IHByb3Zp
ZGUgYXJndW1lbnRzIHRvIHRoZSB3aXRoUXVlcnlQYXJhbXMgbWV0aG9kIik7IH0KLSAgICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBp
ZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gInN0cmluZyIpIHsKLSAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigneW91IHNob3VsZCBjYWxsIHdpdGhRdWVyeVBhcmFtcyB3aXRoIGEgbGlzdCBv
ZiBzdHJpbmdzLCBlLmcuIHdpdGhRdWVyeVBhcmFtcygiZm9vIiwgImJhciIpJyk7Ci0gICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IFtdLnNsaWNlLmNhbGwo
YXJndW1lbnRzKTsKLSAgICAgICAgdGhpcy5tYXRjaGVyLmFkZFF1ZXJ5UGFyYW1zKHRoaXMucGF0
aCwgcXVlcnlQYXJhbXMpOwotICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBNYXRjaGVy
KHRhcmdldCkgewotICAgICAgdGhpcy5yb3V0ZXMgPSB7fTsKLSAgICAgIHRoaXMuY2hpbGRyZW4g
PSB7fTsKLSAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSB7fTsKLSAgICAgIHRoaXMudGFyZ2V0ID0g
dGFyZ2V0OwotICAgIH0KLQotICAgIE1hdGNoZXIucHJvdG90eXBlID0gewotICAgICAgYWRkOiBm
dW5jdGlvbihwYXRoLCBoYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMucm91dGVzW3BhdGhdID0gaGFu
ZGxlcjsKLSAgICAgIH0sCi0KLSAgICAgIGFkZFF1ZXJ5UGFyYW1zOiBmdW5jdGlvbihwYXRoLCBw
YXJhbXMpIHsKLSAgICAgICAgdGhpcy5xdWVyeVBhcmFtc1twYXRoXSA9IHBhcmFtczsKLSAgICAg
IH0sCi0KLSAgICAgIGFkZENoaWxkOiBmdW5jdGlvbihwYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCBk
ZWxlZ2F0ZSkgewotICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7Ci0g
ICAgICAgIHRoaXMuY2hpbGRyZW5bcGF0aF0gPSBtYXRjaGVyOwotCi0gICAgICAgIHZhciBtYXRj
aCA9IGdlbmVyYXRlTWF0Y2gocGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpOwotCi0gICAgICAgIGlm
IChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5jb250ZXh0RW50ZXJlZCkgewotICAgICAgICAgIGRlbGVn
YXRlLmNvbnRleHRFbnRlcmVkKHRhcmdldCwgbWF0Y2gpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Y2FsbGJhY2sobWF0Y2gpOwotICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBnZW5lcmF0
ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKLSAgICAgIHJldHVybiBm
dW5jdGlvbihwYXRoLCBuZXN0ZWRDYWxsYmFjaykgewotICAgICAgICB2YXIgZnVsbFBhdGggPSBz
dGFydGluZ1BhdGggKyBwYXRoOwotCi0gICAgICAgIGlmIChuZXN0ZWRDYWxsYmFjaykgewotICAg
ICAgICAgIG5lc3RlZENhbGxiYWNrKGdlbmVyYXRlTWF0Y2goZnVsbFBhdGgsIG1hdGNoZXIsIGRl
bGVnYXRlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQo
c3RhcnRpbmdQYXRoICsgcGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAg
ICB9OwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIGhh
bmRsZXIsIHF1ZXJ5UGFyYW1zKSB7Ci0gICAgICB2YXIgbGVuID0gMDsKLSAgICAgIGZvciAodmFy
IGk9MCwgbD1yb3V0ZUFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgbGVuICs9IHJv
dXRlQXJyYXlbaV0ucGF0aC5sZW5ndGg7Ci0gICAgICB9Ci0KLSAgICAgIHBhdGggPSBwYXRoLnN1
YnN0cihsZW4pOwotICAgICAgdmFyIHJvdXRlID0geyBwYXRoOiBwYXRoLCBoYW5kbGVyOiBoYW5k
bGVyIH07Ci0gICAgICBpZihxdWVyeVBhcmFtcykgeyByb3V0ZS5xdWVyeVBhcmFtcyA9IHF1ZXJ5
UGFyYW1zOyB9Ci0gICAgICByb3V0ZUFycmF5LnB1c2gocm91dGUpOwotICAgIH0KLQotICAgIGZ1
bmN0aW9uIGVhY2hSb3V0ZShiYXNlUm91dGUsIG1hdGNoZXIsIGNhbGxiYWNrLCBiaW5kaW5nKSB7
Ci0gICAgICB2YXIgcm91dGVzID0gbWF0Y2hlci5yb3V0ZXM7Ci0gICAgICB2YXIgcXVlcnlQYXJh
bXMgPSBtYXRjaGVyLnF1ZXJ5UGFyYW1zOwotCi0gICAgICBmb3IgKHZhciBwYXRoIGluIHJvdXRl
cykgewotICAgICAgICBpZiAocm91dGVzLmhhc093blByb3BlcnR5KHBhdGgpKSB7Ci0gICAgICAg
ICAgdmFyIHJvdXRlQXJyYXkgPSBiYXNlUm91dGUuc2xpY2UoKTsKLSAgICAgICAgICBhZGRSb3V0
ZShyb3V0ZUFycmF5LCBwYXRoLCByb3V0ZXNbcGF0aF0sIHF1ZXJ5UGFyYW1zW3BhdGhdKTsKLQot
ICAgICAgICAgIGlmIChtYXRjaGVyLmNoaWxkcmVuW3BhdGhdKSB7Ci0gICAgICAgICAgICBlYWNo
Um91dGUocm91dGVBcnJheSwgbWF0Y2hlci5jaGlsZHJlbltwYXRoXSwgY2FsbGJhY2ssIGJpbmRp
bmcpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRp
bmcsIHJvdXRlQXJyYXkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0K
LQotICAgIFJvdXRlUmVjb2duaXplci5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oY2FsbGJhY2ss
IGFkZFJvdXRlQ2FsbGJhY2spIHsKLSAgICAgIHZhciBtYXRjaGVyID0gbmV3IE1hdGNoZXIoKTsK
LQotICAgICAgY2FsbGJhY2soZ2VuZXJhdGVNYXRjaCgiIiwgbWF0Y2hlciwgdGhpcy5kZWxlZ2F0
ZSkpOwotCi0gICAgICBlYWNoUm91dGUoW10sIG1hdGNoZXIsIGZ1bmN0aW9uKHJvdXRlKSB7Ci0g
ICAgICAgIGlmIChhZGRSb3V0ZUNhbGxiYWNrKSB7IGFkZFJvdXRlQ2FsbGJhY2sodGhpcywgcm91
dGUpOyB9Ci0gICAgICAgIGVsc2UgeyB0aGlzLmFkZChyb3V0ZSk7IH0KLSAgICAgIH0sIHRoaXMp
OwotICAgIH07Ci0gICAgcmV0dXJuIFJvdXRlUmVjb2duaXplcjsKLSAgfSk7Ci0KLX0pKCk7Ci0K
LQotCi0oZnVuY3Rpb24oKSB7Ci1kZWZpbmUoInJvdXRlciIsCi0gIFsicm91dGUtcmVjb2duaXpl
ciIsInJzdnAiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBl
bmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAg
ICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMgZmlsZSByZWZlcmVuY2VzIHNldmVyYWwgaW50ZXJu
YWwgc3RydWN0dXJlczoKLQotICAgICAgIyMgYFJlY29nbml6ZWRIYW5kbGVyYAotCi0gICAgICAq
IGB7U3RyaW5nfSBoYW5kbGVyYDogQSBoYW5kbGVyIG5hbWUKLSAgICAgICogYHtPYmplY3R9IHBh
cmFtc2A6IEEgaGFzaCBvZiByZWNvZ25pemVkIHBhcmFtZXRlcnMKLQotICAgICAgIyMgYEhhbmRs
ZXJJbmZvYAotCi0gICAgICAqIGB7Qm9vbGVhbn0gaXNEeW5hbWljYDogd2hldGhlciBhIGhhbmRs
ZXIgaGFzIGFueSBkeW5hbWljIHNlZ21lbnRzCi0gICAgICAqIGB7U3RyaW5nfSBuYW1lYDogdGhl
IG5hbWUgb2YgYSBoYW5kbGVyCi0gICAgICAqIGB7T2JqZWN0fSBoYW5kbGVyYDogYSBoYW5kbGVy
IG9iamVjdAotICAgICAgKiBge09iamVjdH0gY29udGV4dGA6IHRoZSBhY3RpdmUgY29udGV4dCBm
b3IgdGhlIGhhbmRsZXIKLSAgICAqLwotCi0gICAgdmFyIFJvdXRlUmVjb2duaXplciA9IF9fZGVw
ZW5kZW5jeTFfXzsKLSAgICB2YXIgUlNWUCA9IF9fZGVwZW5kZW5jeTJfXzsKLQotICAgIHZhciBz
bGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKLQotCi0KLSAgICAvKioKLSAgICAgIEBwcml2
YXRlCi0KLSAgICAgIEEgVHJhbnNpdGlvbiBpcyBhIHRoZW5uYWJsZSAoYSBwcm9taXNlLWxpa2Ug
b2JqZWN0KSB0aGF0IHJlcHJlc2VudHMKLSAgICAgIGFuIGF0dGVtcHQgdG8gdHJhbnNpdGlvbiB0
byBhbm90aGVyIHJvdXRlLiBJdCBjYW4gYmUgYWJvcnRlZCwgZWl0aGVyCi0gICAgICBleHBsaWNp
dGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVtcHRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxl
IGEKLSAgICAgIHByZXZpb3VzIG9uZSBpcyBzdGlsbCB1bmRlcndheS4gQW4gYWJvcnRlZCB0cmFu
c2l0aW9uIGNhbiBhbHNvCi0gICAgICBiZSBgcmV0cnkoKWBkIGxhdGVyLgotICAgICAqLwotCi0g
ICAgZnVuY3Rpb24gVHJhbnNpdGlvbihyb3V0ZXIsIHByb21pc2UpIHsKLSAgICAgIHRoaXMucm91
dGVyID0gcm91dGVyOwotICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHRoaXMu
ZGF0YSA9IHt9OwotICAgICAgdGhpcy5yZXNvbHZlZE1vZGVscyA9IHt9OwotICAgICAgdGhpcy5w
cm92aWRlZE1vZGVscyA9IHt9OwotICAgICAgdGhpcy5wcm92aWRlZE1vZGVsc0FycmF5ID0gW107
Ci0gICAgICB0aGlzLnNlcXVlbmNlID0gKytUcmFuc2l0aW9uLmN1cnJlbnRTZXF1ZW5jZTsKLSAg
ICAgIHRoaXMucGFyYW1zID0ge307Ci0gICAgfQotCi0gICAgVHJhbnNpdGlvbi5jdXJyZW50U2Vx
dWVuY2UgPSAwOwotCi0gICAgVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7Ci0gICAgICB0YXJnZXRO
YW1lOiBudWxsLAotICAgICAgdXJsTWV0aG9kOiAndXBkYXRlJywKLSAgICAgIHByb3ZpZGVkTW9k
ZWxzOiBudWxsLAotICAgICAgcmVzb2x2ZWRNb2RlbHM6IG51bGwsCi0gICAgICBwYXJhbXM6IG51
bGwsCi0gICAgICBwaXZvdEhhbmRsZXI6IG51bGwsCi0gICAgICByZXNvbHZlSW5kZXg6IDAsCi0g
ICAgICBoYW5kbGVySW5mb3M6IG51bGwsCi0KLSAgICAgIGlzQWN0aXZlOiB0cnVlLAotCi0gICAg
ICAvKioKLSAgICAgICAgVGhlIFRyYW5zaXRpb24ncyBpbnRlcm5hbCBwcm9taXNlLiBDYWxsaW5n
IGAudGhlbmAgb24gdGhpcyBwcm9wZXJ0eQotICAgICAgICBpcyB0aGF0IHNhbWUgYXMgY2FsbGlu
ZyBgLnRoZW5gIG9uIHRoZSBUcmFuc2l0aW9uIG9iamVjdCBpdHNlbGYsIGJ1dAotICAgICAgICB0
aGlzIHByb3BlcnR5IGlzIGV4cG9zZWQgZm9yIHdoZW4geW91IHdhbnQgdG8gcGFzcyBhcm91bmQg
YQotICAgICAgICBUcmFuc2l0aW9uJ3MgcHJvbWlzZSwgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBv
YmplY3QgaXRzZWxmLCBzaW5jZQotICAgICAgICBUcmFuc2l0aW9uIG9iamVjdCBjYW4gYmUgZXh0
ZXJuYWxseSBgYWJvcnRgZWQsIHdoaWxlIHRoZSBwcm9taXNlCi0gICAgICAgIGNhbm5vdC4KLSAg
ICAgICAqLwotICAgICAgcHJvbWlzZTogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEN1c3Rv
bSBzdGF0ZSBjYW4gYmUgc3RvcmVkIG9uIGEgVHJhbnNpdGlvbidzIGBkYXRhYCBvYmplY3QuCi0g
ICAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVjb3JhdGluZyBhIFRyYW5zaXRpb24gd2l0
aGluIGFuIGVhcmxpZXIKLSAgICAgICAgaG9vayBhbmQgc2hhcmVkIHdpdGggYSBsYXRlciBob29r
LiBQcm9wZXJ0aWVzIHNldCBvbiBgZGF0YWAgd2lsbAotICAgICAgICBiZSBjb3BpZWQgdG8gbmV3
IHRyYW5zaXRpb25zIGdlbmVyYXRlZCBieSBjYWxsaW5nIGByZXRyeWAgb24gdGhpcwotICAgICAg
ICB0cmFuc2l0aW9uLgotICAgICAgICovCi0gICAgICBkYXRhOiBudWxsLAotCi0gICAgICAvKioK
LSAgICAgICAgQSBzdGFuZGFyZCBwcm9taXNlIGhvb2sgdGhhdCByZXNvbHZlcyBpZiB0aGUgdHJh
bnNpdGlvbgotICAgICAgICBzdWNjZWVkcyBhbmQgcmVqZWN0cyBpZiBpdCBmYWlscy9yZWRpcmVj
dHMvYWJvcnRzLgotCi0gICAgICAgIEZvcndhcmRzIHRvIHRoZSBpbnRlcm5hbCBgcHJvbWlzZWAg
cHJvcGVydHkgd2hpY2ggeW91IGNhbgotICAgICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5
b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKLSAgICAgICAgYnV0IG5vdCB0aGUg
VHJhbnNpdGlvbiBpdHNlbGYuCi0KLSAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2Vzcwot
ICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmYWlsdXJlCi0gICAgICAgKi8KLSAgICAgIHRoZW46
IGZ1bmN0aW9uKHN1Y2Nlc3MsIGZhaWx1cmUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlz
ZS50aGVuKHN1Y2Nlc3MsIGZhaWx1cmUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAg
IEFib3J0cyB0aGUgVHJhbnNpdGlvbi4gTm90ZSB5b3UgY2FuIGFsc28gaW1wbGljaXRseSBhYm9y
dCBhIHRyYW5zaXRpb24KLSAgICAgICAgYnkgaW5pdGlhdGluZyBhbm90aGVyIHRyYW5zaXRpb24g
d2hpbGUgYSBwcmV2aW91cyBvbmUgaXMgdW5kZXJ3YXkuCi0gICAgICAgKi8KLSAgICAgIGFib3J0
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYgKHRoaXMuaXNBYm9ydGVkKSB7IHJldHVybiB0aGlz
OyB9Ci0gICAgICAgIGxvZyh0aGlzLnJvdXRlciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJnZXRO
YW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJvcnRlZCIpOwotICAgICAgICB0aGlzLmlzQWJvcnRl
ZCA9IHRydWU7Ci0gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5y
b3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAg
ICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIFJldHJpZXMgYSBwcmV2aW91c2x5LWFib3J0ZWQg
dHJhbnNpdGlvbiAobWFraW5nIHN1cmUgdG8gYWJvcnQgdGhlCi0gICAgICAgIHRyYW5zaXRpb24g
aWYgaXQncyBzdGlsbCBhY3RpdmUpLiBSZXR1cm5zIGEgbmV3IHRyYW5zaXRpb24gdGhhdAotICAg
ICAgICByZXByZXNlbnRzIHRoZSBuZXcgYXR0ZW1wdCB0byB0cmFuc2l0aW9uLgotICAgICAgICov
Ci0gICAgICByZXRyeTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMuYWJvcnQoKTsKLSAgICAg
ICAgdmFyIHJlY29nSGFuZGxlcnMgPSB0aGlzLnJvdXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9y
KHRoaXMudGFyZ2V0TmFtZSksCi0gICAgICAgICAgICBoYW5kbGVySW5mb3MgID0gZ2VuZXJhdGVI
YW5kbGVySW5mb3NXaXRoUXVlcnlQYXJhbXModGhpcy5yb3V0ZXIsIHJlY29nSGFuZGxlcnMsIHRo
aXMucXVlcnlQYXJhbXMpLAotICAgICAgICAgICAgbmV3VHJhbnNpdGlvbiA9IHBlcmZvcm1UcmFu
c2l0aW9uKHRoaXMucm91dGVyLCBoYW5kbGVySW5mb3MsIHRoaXMucHJvdmlkZWRNb2RlbHNBcnJh
eSwgdGhpcy5wYXJhbXMsIHRoaXMucXVlcnlQYXJhbXMsIHRoaXMuZGF0YSk7Ci0KLSAgICAgICAg
cmV0dXJuIG5ld1RyYW5zaXRpb247Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgU2V0
cyB0aGUgVVJMLWNoYW5naW5nIG1ldGhvZCB0byBiZSBlbXBsb3llZCBhdCB0aGUgZW5kIG9mIGEK
LSAgICAgICAgc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uLiBCeSBkZWZhdWx0LCBhIG5ldyBUcmFuc2l0
aW9uIHdpbGwganVzdAotICAgICAgICB1c2UgYHVwZGF0ZVVSTGAsIGJ1dCBwYXNzaW5nICdyZXBs
YWNlJyB0byB0aGlzIG1ldGhvZCB3aWxsCi0gICAgICAgIGNhdXNlIHRoZSBVUkwgdG8gdXBkYXRl
IHVzaW5nICdyZXBsYWNlV2l0aCcgaW5zdGVhZC4gT21pdHRpbmcKLSAgICAgICAgYSBwYXJhbWV0
ZXIgd2lsbCBkaXNhYmxlIHRoZSBVUkwgY2hhbmdlLCBhbGxvd2luZyBmb3IgdHJhbnNpdGlvbnMK
LSAgICAgICAgdGhhdCBkb24ndCB1cGRhdGUgdGhlIFVSTCBhdCBjb21wbGV0aW9uICh0aGlzIGlz
IGFsc28gdXNlZCBmb3IKLSAgICAgICAgaGFuZGxlVVJMLCBzaW5jZSB0aGUgVVJMIGhhcyBhbHJl
YWR5IGNoYW5nZWQgYmVmb3JlIHRoZQotICAgICAgICB0cmFuc2l0aW9uIHRvb2sgcGxhY2UpLgot
Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgdGhlIHR5cGUgb2YgVVJMLWNoYW5naW5n
IG1ldGhvZCB0byB1c2UKLSAgICAgICAgICBhdCB0aGUgZW5kIG9mIGEgdHJhbnNpdGlvbi4gQWNj
ZXB0ZWQgdmFsdWVzIGFyZSAncmVwbGFjZScsCi0gICAgICAgICAgZmFsc3kgdmFsdWVzLCBvciBh
bnkgb3RoZXIgbm9uLWZhbHN5IHZhbHVlICh3aGljaCBpcwotICAgICAgICAgIGludGVycHJldGVk
IGFzIGFuIHVwZGF0ZVVSTCB0cmFuc2l0aW9uKS4KLQotICAgICAgICBAcmV0dXJuIHtUcmFuc2l0
aW9ufSB0aGlzIHRyYW5zaXRpb24KLSAgICAgICAqLwotICAgICAgbWV0aG9kOiBmdW5jdGlvbiht
ZXRob2QpIHsKLSAgICAgICAgdGhpcy51cmxNZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIHJldHVy
biB0aGlzOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEZpcmVzIGFuIGV2ZW50IG9u
IHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb2x2ZWQvcmVzb2x2aW5nCi0gICAgICAgIGhhbmRsZXJz
IHdpdGhpbiB0aGlzIHRyYW5zaXRpb24uIFVzZWZ1bCBmb3IgZmlyaW5nIGV2ZW50cwotICAgICAg
ICBvbiByb3V0ZSBoaWVyYXJjaGllcyB0aGF0IGhhdmVuJ3QgZnVsbHkgYmVlbiBlbnRlcmVkIHll
dC4KLQotICAgICAgICBAcGFyYW0ge0Jvb2xlYW59IGlnbm9yZUZhaWx1cmUgdGhlIG5hbWUgb2Yg
dGhlIGV2ZW50IHRvIGZpcmUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUg
b2YgdGhlIGV2ZW50IHRvIGZpcmUKLSAgICAgICAqLwotICAgICAgdHJpZ2dlcjogZnVuY3Rpb24o
aWdub3JlRmFpbHVyZSkgewotICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRz
KTsKLSAgICAgICAgaWYgKHR5cGVvZiBpZ25vcmVGYWlsdXJlID09PSAnYm9vbGVhbicpIHsKLSAg
ICAgICAgICBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhy
b3cgZXJyb3JzIG9uIHVuaGFuZGxlZCB0cmlnZ2VyIGV2ZW50cyBieSBkZWZhdWx0Ci0gICAgICAg
ICAgaWdub3JlRmFpbHVyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHRyaWdnZXIodGhp
cy5yb3V0ZXIsIHRoaXMuaGFuZGxlckluZm9zLnNsaWNlKDAsIHRoaXMucmVzb2x2ZUluZGV4ICsg
MSksIGlnbm9yZUZhaWx1cmUsIGFyZ3MpOwotICAgICAgfSwKLQotICAgICAgdG9TdHJpbmc6IGZ1
bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gIlRyYW5zaXRpb24gKHNlcXVlbmNlICIgKyB0aGlz
LnNlcXVlbmNlICsgIikiOwotICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBSb3V0ZXIo
KSB7Ci0gICAgICB0aGlzLnJlY29nbml6ZXIgPSBuZXcgUm91dGVSZWNvZ25pemVyKCk7Ci0gICAg
fQotCi0gICAgLy8gVE9ETzogc2VwYXJhdGUgaW50byBtb2R1bGU/Ci0gICAgUm91dGVyLlRyYW5z
aXRpb24gPSBUcmFuc2l0aW9uOwotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IFJvdXRl
cjsKLQotCi0gICAgLyoqCi0gICAgICBQcm9taXNlIHJlamVjdCByZWFzb25zIHBhc3NlZCB0byBw
cm9taXNlIHJlamVjdGlvbgotICAgICAgaGFuZGxlcnMgZm9yIGZhaWxlZCB0cmFuc2l0aW9ucy4K
LSAgICAgKi8KLSAgICBSb3V0ZXIuVW5yZWNvZ25pemVkVVJMRXJyb3IgPSBmdW5jdGlvbihtZXNz
YWdlKSB7Ci0gICAgICB0aGlzLm1lc3NhZ2UgPSAobWVzc2FnZSB8fCAiVW5yZWNvZ25pemVkVVJM
RXJyb3IiKTsKLSAgICAgIHRoaXMubmFtZSA9ICJVbnJlY29nbml6ZWRVUkxFcnJvciI7Ci0gICAg
fTsKLQotICAgIFJvdXRlci5UcmFuc2l0aW9uQWJvcnRlZCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsK
LSAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNzYWdlIHx8ICJUcmFuc2l0aW9uQWJvcnRlZCIpOwot
ICAgICAgdGhpcy5uYW1lID0gIlRyYW5zaXRpb25BYm9ydGVkIjsKLSAgICB9OwotCi0gICAgZnVu
Y3Rpb24gZXJyb3JUcmFuc2l0aW9uKHJvdXRlciwgcmVhc29uKSB7Ci0gICAgICByZXR1cm4gbmV3
IFRyYW5zaXRpb24ocm91dGVyLCBSU1ZQLnJlamVjdChyZWFzb24pKTsKLSAgICB9Ci0KLQotICAg
IFJvdXRlci5wcm90b3R5cGUgPSB7Ci0gICAgICAvKioKLSAgICAgICAgVGhlIG1haW4gZW50cnkg
cG9pbnQgaW50byB0aGUgcm91dGVyLiBUaGUgQVBJIGlzIGVzc2VudGlhbGx5Ci0gICAgICAgIHRo
ZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2QgaW4gYHJvdXRlLXJlY29nbml6ZXJgLgotCi0gICAg
ICAgIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBTdHJpbmcgaGFuZGxlciBhdCB0aGUgbGFzdCBg
LnRvKClgCi0gICAgICAgIGNhbGwgYW5kIHVzZXMgaXQgYXMgdGhlIG5hbWUgb2YgdGhlIHdob2xl
IHJvdXRlLgotCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgICAqLwot
ICAgICAgbWFwOiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgICAgICB0aGlzLnJlY29nbml6ZXIu
ZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOwotCi0gICAgICAgIHRoaXMucmVjb2duaXplci5tYXAo
Y2FsbGJhY2ssIGZ1bmN0aW9uKHJlY29nbml6ZXIsIHJvdXRlKSB7Ci0gICAgICAgICAgdmFyIGxh
c3RIYW5kbGVyID0gcm91dGVbcm91dGUubGVuZ3RoIC0gMV0uaGFuZGxlcjsKLSAgICAgICAgICB2
YXIgYXJncyA9IFtyb3V0ZSwgeyBhczogbGFzdEhhbmRsZXIgfV07Ci0gICAgICAgICAgcmVjb2du
aXplci5hZGQuYXBwbHkocmVjb2duaXplciwgYXJncyk7Ci0gICAgICAgIH0pOwotICAgICAgfSwK
LQotICAgICAgaGFzUm91dGU6IGZ1bmN0aW9uKHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiB0aGlz
LnJlY29nbml6ZXIuaGFzUm91dGUocm91dGUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAg
ICAgIENsZWFycyB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IHJvdXRlIGhhbmRsZXJzIGFuZCB0cmln
Z2VycyBleGl0Ci0gICAgICAgIG9uIGVhY2ggb2YgdGhlbSBzdGFydGluZyBhdCB0aGUgbGVhZiBh
bmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoCi0gICAgICAgIGl0cyBhbmNlc3RvcnMuCi0gICAgICAq
LwotICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewotICAgICAgICBlYWNoSGFuZGxlcih0aGlzLmN1
cnJlbnRIYW5kbGVySW5mb3MgfHwgW10sIGZ1bmN0aW9uKGhhbmRsZXJJbmZvKSB7Ci0gICAgICAg
ICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotICAgICAgICAgIGlmIChoYW5k
bGVyLmV4aXQpIHsKLSAgICAgICAgICAgIGhhbmRsZXIuZXhpdCgpOwotICAgICAgICAgIH0KLSAg
ICAgICAgfSk7Ci0gICAgICAgIHRoaXMuY3VycmVudEhhbmRsZXJJbmZvcyA9IG51bGw7Ci0gICAg
ICAgIHRoaXMudGFyZ2V0SGFuZGxlckluZm9zID0gbnVsbDsKLSAgICAgIH0sCi0KLSAgICAgIGFj
dGl2ZVRyYW5zaXRpb246IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICB2YXIgaGFuZGxlciA9
IGhhbmRsZXJJbmZvLmhhbmRsZXI7Ci0gICAgICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgaGFuZGxp
bmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1YWxseQotICAgICAgICB2aWEgdGhlIGJhY2sgYW5k
IGZvcndhcmQgYnV0dG9uKS4KLQotICAgICAgICBSZXR1cm5zIGFuIEFycmF5IG9mIGhhbmRsZXJz
IGFuZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkCi0gICAgICAgIHdpdGggdGhvc2UgcGFyYW1l
dGVycy4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJsIGEgVVJMIHRvIHByb2Nlc3MKLQot
ICAgICAgICBAcmV0dXJuIHtBcnJheX0gYW4gQXJyYXkgb2YgYFtoYW5kbGVyLCBwYXJhbWV0ZXJd
YCB0dXBsZXMKLSAgICAgICovCi0gICAgICBoYW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgewotICAg
ICAgICAvLyBQZXJmb3JtIGEgVVJMLWJhc2VkIHRyYW5zaXRpb24sIGJ1dCBkb24ndCBjaGFuZ2UK
LSAgICAgICAgLy8gdGhlIFVSTCBhZnRlcndhcmQsIHNpbmNlIGl0IGFscmVhZHkgaGFwcGVuZWQu
Ci0gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICBpZiAo
dXJsLmNoYXJBdCgwKSAhPT0gJy8nKSB7IGFyZ3NbMF0gPSAnLycgKyB1cmw7IH0KLSAgICAgICAg
cmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBhcmdzKS5tZXRob2QobnVsbCk7Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgSG9vayBwb2ludCBmb3IgdXBkYXRpbmcgdGhlIFVSTC4KLQot
ICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJsIGEgVVJMIHRvIHVwZGF0ZSB0bwotICAgICAgKi8K
LSAgICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigi
dXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0g
ICAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGkuZS4gd2l0
aCByZXBsYWNlU3RhdGUKLQotICAgICAgICBCeSBkZWZhdWx0IHRoaXMgYmVoYXZlcyB0aGUgc2Ft
ZSBhcyBgdXBkYXRlVVJMYAotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8g
dXBkYXRlIHRvCi0gICAgICAqLwotICAgICAgcmVwbGFjZVVSTDogZnVuY3Rpb24odXJsKSB7Ci0g
ICAgICAgIHRoaXMudXBkYXRlVVJMKHVybCk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAg
ICAgVHJhbnNpdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgbmFtZWQgcm91dGUuCi0KLSAgICAgICAg
SWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBleGl0IGNhbGxiYWNrIG9uIGFueSBoYW5kbGVycwot
ICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHRhcmdldCByb3V0
ZS4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUK
LSAgICAgICovCi0gICAgICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAg
cmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMpOwotICAgICAgfSwKLQotICAgICAg
aW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGRvVHJh
bnNpdGlvbih0aGlzLCBhcmd1bWVudHMsIHRydWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0g
ICAgICAgIElkZW50aWNhbCB0byBgdHJhbnNpdGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVu
dCBVUkwgd2lsbCBiZSByZXBsYWNlZAotICAgICAgICBpZiBwb3NzaWJsZS4KLQotICAgICAgICBU
aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3Rh
dGVgLgotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0
ZQotICAgICAgKi8KLSAgICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAg
IHJldHVybiBkb1RyYW5zaXRpb24odGhpcywgYXJndW1lbnRzKS5tZXRob2QoJ3JlcGxhY2UnKTsK
LSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBAcHJpdmF0ZQotCi0gICAgICAgIFRoaXMg
bWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1lIGFuZCBhIGxpc3Qgb2YgY29udGV4dHMgYW5kIHJl
dHVybnMKLSAgICAgICAgYSBzZXJpYWxpemVkIHBhcmFtZXRlciBoYXNoIHN1aXRhYmxlIHRvIHBh
c3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJhdGUoKWAuCi0KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9
IGhhbmRsZXJOYW1lCi0gICAgICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gY29udGV4dHMKLSAg
ICAgICAgQHJldHVybiB7T2JqZWN0fSBhIHNlcmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2gKLSAgICAg
ICovCi0KLSAgICAgIHBhcmFtc0ZvckhhbmRsZXI6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lLCBjb250
ZXh0cykgewotICAgICAgICB2YXIgcGFydGl0aW9uZWRBcmdzID0gZXh0cmFjdFF1ZXJ5UGFyYW1z
KHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgICAgIHJldHVybiBwYXJhbXNGb3JIYW5k
bGVyKHRoaXMsIGhhbmRsZXJOYW1lLCBwYXJ0aXRpb25lZEFyZ3NbMF0sIHBhcnRpdGlvbmVkQXJn
c1sxXSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMg
YSBoYW5kbGVyIG5hbWUgYW5kIHJldHVybnMgYSBsaXN0IG9mIHF1ZXJ5IHBhcmFtcwotICAgICAg
ICB0aGF0IGFyZSB2YWxpZCB0byBwYXNzIHRvIHRoZSBoYW5kbGVyIG9yIGl0cyBwYXJlbnRzCi0K
LSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICAgIEByZXR1cm4ge0Fy
cmF5W1N0cmluZ119IGEgbGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzCi0gICAgICAqLwotICAgICAg
cXVlcnlQYXJhbXNGb3JIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlck5hbWUpIHsKLSAgICAgICAg
cmV0dXJuIHF1ZXJ5UGFyYW1zRm9ySGFuZGxlcih0aGlzLCBoYW5kbGVyTmFtZSk7Ci0gICAgICB9
LAotCi0gICAgICAvKioKLSAgICAgICAgVGFrZSBhIG5hbWVkIHJvdXRlIGFuZCBjb250ZXh0IG9i
amVjdHMgYW5kIGdlbmVyYXRlIGEKLSAgICAgICAgVVJMLgotCi0gICAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZSB0byBnZW5lcmF0ZQotICAgICAgICAgIGEg
VVJMIGZvcgotICAgICAgICBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0cyBhIGxpc3Qgb2Ygb2Jq
ZWN0cyB0byBzZXJpYWxpemUKLQotICAgICAgICBAcmV0dXJuIHtTdHJpbmd9IGEgVVJMCi0gICAg
ICAqLwotICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lKSB7Ci0gICAgICAgIHZh
ciBwYXJ0aXRpb25lZEFyZ3MgPSBleHRyYWN0UXVlcnlQYXJhbXMoc2xpY2UuY2FsbChhcmd1bWVu
dHMsIDEpKSwKLSAgICAgICAgICBzdXBwbGllZFBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1swXSwK
LSAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1sxXTsKLQotICAgICAgICB2
YXIgcGFyYW1zID0gcGFyYW1zRm9ySGFuZGxlcih0aGlzLCBoYW5kbGVyTmFtZSwgc3VwcGxpZWRQ
YXJhbXMsIHF1ZXJ5UGFyYW1zKSwKLSAgICAgICAgICB2YWxpZFF1ZXJ5UGFyYW1zID0gcXVlcnlQ
YXJhbXNGb3JIYW5kbGVyKHRoaXMsIGhhbmRsZXJOYW1lKTsKLQotICAgICAgICB2YXIgbWlzc2lu
Z1BhcmFtcyA9IFtdOwotCi0gICAgICAgIGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgewot
ICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF+dmFsaWRR
dWVyeVBhcmFtcy5pbmRleE9mKGtleSkpIHsKLSAgICAgICAgICAgIG1pc3NpbmdQYXJhbXMucHVz
aChrZXkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaXNzaW5nUGFy
YW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICB2YXIgZXJyID0gJ1lvdSBzdXBwbGllZCB0aGUg
cGFyYW1zICc7Ci0gICAgICAgICAgZXJyICs9IG1pc3NpbmdQYXJhbXMubWFwKGZ1bmN0aW9uKHBh
cmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gJyInICsgcGFyYW0gKyAiPSIgKyBxdWVyeVBhcmFt
c1twYXJhbV0gKyAnIic7Ci0gICAgICAgICAgfSkuam9pbignIGFuZCAnKTsKLQotICAgICAgICAg
IGVyciArPSAnIHdoaWNoIGFyZSBub3QgdmFsaWQgZm9yIHRoZSAiJyArIGhhbmRsZXJOYW1lICsg
JyIgaGFuZGxlciBvciBpdHMgcGFyZW50cyc7Ci0KLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Io
ZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnJlY29nbml6ZXIuZ2VuZXJh
dGUoaGFuZGxlck5hbWUsIHBhcmFtcyk7Ci0gICAgICB9LAotCi0gICAgICBpc0FjdGl2ZTogZnVu
Y3Rpb24oaGFuZGxlck5hbWUpIHsKLSAgICAgICAgdmFyIHBhcnRpdGlvbmVkQXJncyAgID0gZXh0
cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSksCi0gICAgICAgICAgICBj
b250ZXh0cyAgICAgICAgICA9IHBhcnRpdGlvbmVkQXJnc1swXSwKLSAgICAgICAgICAgIHF1ZXJ5
UGFyYW1zICAgICAgID0gcGFydGl0aW9uZWRBcmdzWzFdLAotICAgICAgICAgICAgYWN0aXZlUXVl
cnlQYXJhbXMgID0ge30sCi0gICAgICAgICAgICBlZmZlY3RpdmVRdWVyeVBhcmFtcyA9IHt9Owot
Ci0gICAgICAgIHZhciB0YXJnZXRIYW5kbGVySW5mb3MgPSB0aGlzLnRhcmdldEhhbmRsZXJJbmZv
cywKLSAgICAgICAgICAgIGZvdW5kID0gZmFsc2UsIG5hbWVzLCBvYmplY3QsIGhhbmRsZXJJbmZv
LCBoYW5kbGVyT2JqOwotCi0gICAgICAgIGlmICghdGFyZ2V0SGFuZGxlckluZm9zKSB7IHJldHVy
biBmYWxzZTsgfQotCi0gICAgICAgIHZhciByZWNvZ0hhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVy
LmhhbmRsZXJzRm9yKHRhcmdldEhhbmRsZXJJbmZvc1t0YXJnZXRIYW5kbGVySW5mb3MubGVuZ3Ro
IC0gMV0ubmFtZSk7Ci0gICAgICAgIGZvciAodmFyIGk9dGFyZ2V0SGFuZGxlckluZm9zLmxlbmd0
aC0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAgICBoYW5kbGVySW5mbyA9IHRhcmdldEhhbmRsZXJJ
bmZvc1tpXTsKLSAgICAgICAgICBpZiAoaGFuZGxlckluZm8ubmFtZSA9PT0gaGFuZGxlck5hbWUp
IHsgZm91bmQgPSB0cnVlOyB9Ci0KLSAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAg
IHZhciByZWNvZ0hhbmRsZXIgPSByZWNvZ0hhbmRsZXJzW2ldOwotCi0gICAgICAgICAgICBtZXJn
ZShhY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAg
ICAgaWYgKHF1ZXJ5UGFyYW1zICE9PSBmYWxzZSkgewotICAgICAgICAgICAgICBtZXJnZShlZmZl
Y3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAgICAg
ICBtZXJnZVNvbWVLZXlzKGVmZmVjdGl2ZVF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcywgcmVjb2dI
YW5kbGVyLnF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhh
bmRsZXJJbmZvLmlzRHluYW1pYyAmJiBjb250ZXh0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAg
ICAgIG9iamVjdCA9IGNvbnRleHRzLnBvcCgpOwotCi0gICAgICAgICAgICAgIGlmIChpc1BhcmFt
KG9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHJlY29nSGFuZGxlci5uYW1l
c1swXTsKLSAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudFBhcmFtcyB8fCAiIiArIG9i
amVjdCAhPT0gdGhpcy5jdXJyZW50UGFyYW1zW25hbWVdKSB7IHJldHVybiBmYWxzZTsgfQotICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJJbmZvLmNvbnRleHQgIT09IG9iamVjdCkgewot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIGNvbnRleHRz
Lmxlbmd0aCA9PT0gMCAmJiBmb3VuZCAmJiBxdWVyeVBhcmFtc0VxdWFsKGFjdGl2ZVF1ZXJ5UGFy
YW1zLCBlZmZlY3RpdmVRdWVyeVBhcmFtcyk7Ci0gICAgICB9LAotCi0gICAgICB0cmlnZ2VyOiBm
dW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMp
OwotICAgICAgICB0cmlnZ2VyKHRoaXMsIHRoaXMuY3VycmVudEhhbmRsZXJJbmZvcywgZmFsc2Us
IGFyZ3MpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEhvb2sgcG9pbnQgZm9yIGxv
Z2dpbmcgdHJhbnNpdGlvbiBzdGF0dXMgdXBkYXRlcy4KLQotICAgICAgICBAcGFyYW0ge1N0cmlu
Z30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBsb2cuCi0gICAgICAqLwotICAgICAgbG9nOiBudWxs
Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgVXNlZCBpbnRlcm5h
bGx5IGZvciBib3RoIFVSTCBhbmQgbmFtZWQgdHJhbnNpdGlvbiB0byBkZXRlcm1pbmUKLSAgICAg
IGEgc2hhcmVkIHBpdm90IHBhcmVudCByb3V0ZSBhbmQgb3RoZXIgZGF0YSBuZWNlc3NhcnkgdG8g
cGVyZm9ybQotICAgICAgYSB0cmFuc2l0aW9uLgotICAgICAqLwotICAgIGZ1bmN0aW9uIGdldE1h
dGNoUG9pbnQocm91dGVyLCBoYW5kbGVycywgb2JqZWN0cywgaW5wdXRQYXJhbXMsIHF1ZXJ5UGFy
YW1zKSB7Ci0KLSAgICAgIHZhciBtYXRjaFBvaW50ID0gaGFuZGxlcnMubGVuZ3RoLAotICAgICAg
ICAgIHByb3ZpZGVkTW9kZWxzID0ge30sIGksCi0gICAgICAgICAgY3VycmVudEhhbmRsZXJJbmZv
cyA9IHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zIHx8IFtdLAotICAgICAgICAgIHBhcmFtcyA9
IHt9LAotICAgICAgICAgIG9sZFBhcmFtcyA9IHJvdXRlci5jdXJyZW50UGFyYW1zIHx8IHt9LAot
ICAgICAgICAgIGFjdGl2ZVRyYW5zaXRpb24gPSByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiwKLSAg
ICAgICAgICBoYW5kbGVyUGFyYW1zID0ge30sCi0gICAgICAgICAgb2JqOwotCi0gICAgICBvYmpl
Y3RzID0gc2xpY2UuY2FsbChvYmplY3RzKTsKLSAgICAgIG1lcmdlKHBhcmFtcywgaW5wdXRQYXJh
bXMpOwotCi0gICAgICBmb3IgKGkgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkg
ewotICAgICAgICB2YXIgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldLAotICAgICAgICAgICAgaGFu
ZGxlck5hbWUgPSBoYW5kbGVyT2JqLmhhbmRsZXIsCi0gICAgICAgICAgICBvbGRIYW5kbGVySW5m
byA9IGN1cnJlbnRIYW5kbGVySW5mb3NbaV0sCi0gICAgICAgICAgICBoYXNDaGFuZ2VkID0gZmFs
c2U7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgaGFuZGxlciBuYW1lcyBoYXZlIGNoYW5nZWQuCi0g
ICAgICAgIGlmICghb2xkSGFuZGxlckluZm8gfHwgb2xkSGFuZGxlckluZm8ubmFtZSAhPT0gaGFu
ZGxlck9iai5oYW5kbGVyKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9Ci0KLSAgICAgICAgaWYgKGhh
bmRsZXJPYmouaXNEeW5hbWljKSB7Ci0gICAgICAgICAgLy8gVVJMIHRyYW5zaXRpb24uCi0KLSAg
ICAgICAgICBpZiAob2JqID0gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFt
ZSwgYWN0aXZlVHJhbnNpdGlvbiwgdHJ1ZSwgcGFyYW1zKSkgewotICAgICAgICAgICAgaGFzQ2hh
bmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBwcm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0gPSBv
Ymo7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxl
ck5hbWVdID0ge307Ci0gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGhhbmRsZXJPYmoucGFy
YW1zKSB7Ci0gICAgICAgICAgICAgIGlmICghaGFuZGxlck9iai5wYXJhbXMuaGFzT3duUHJvcGVy
dHkocHJvcCkpIHsgY29udGludWU7IH0KLSAgICAgICAgICAgICAgdmFyIG5ld1BhcmFtID0gaGFu
ZGxlck9iai5wYXJhbXNbcHJvcF07Ci0gICAgICAgICAgICAgIGlmIChvbGRQYXJhbXNbcHJvcF0g
IT09IG5ld1BhcmFtKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9Ci0gICAgICAgICAgICAgIGhhbmRs
ZXJQYXJhbXNbaGFuZGxlck5hbWVdW3Byb3BdID0gcGFyYW1zW3Byb3BdID0gbmV3UGFyYW07Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJPYmou
aGFzT3duUHJvcGVydHkoJ25hbWVzJykpIHsKLSAgICAgICAgICAvLyBOYW1lZCB0cmFuc2l0aW9u
LgotCi0gICAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9
Ci0KLSAgICAgICAgICBpZiAob2JqID0gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5k
bGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwgaGFuZGxlck9iai5uYW1lc1swXSwgcGFyYW1zKSkg
ewotICAgICAgICAgICAgcHJvdmlkZWRNb2RlbHNbaGFuZGxlck5hbWVdID0gb2JqOwotICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YXIgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOwot
ICAgICAgICAgICAgaGFuZGxlclBhcmFtc1toYW5kbGVyTmFtZV0gPSB7fTsKLSAgICAgICAgICAg
IGZvciAodmFyIGogPSAwLCBsZW4gPSBuYW1lcy5sZW5ndGg7IGogPCBsZW47ICsraikgewotICAg
ICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2pdOwotICAgICAgICAgICAgICBoYW5kbGVyUGFy
YW1zW2hhbmRsZXJOYW1lXVtuYW1lXSA9IHBhcmFtc1tuYW1lXSA9IHBhcmFtc1tuYW1lXSB8fCBv
bGRQYXJhbXNbbmFtZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gb2xkIGhhbmRsZXIsIHNlZSBpZiBxdWVyeSBwYXJh
bXMgYXJlIHRoZSBzYW1lLiBJZiB0aGVyZSBpc24ndCBhbiBvbGQgaGFuZGxlciwKLSAgICAgICAg
Ly8gaGFzQ2hhbmdlZCB3aWxsIGFscmVhZHkgYmUgdHJ1ZSBoZXJlCi0gICAgICAgIGlmKG9sZEhh
bmRsZXJJbmZvICYmICFxdWVyeVBhcmFtc0VxdWFsKG9sZEhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1z
LCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKSkgewotICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRy
dWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzQ2hhbmdlZCkgeyBtYXRjaFBvaW50ID0g
aTsgfQotICAgICAgfQotCi0gICAgICBpZiAob2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAg
IHRocm93IG5ldyBFcnJvcigiTW9yZSBjb250ZXh0IG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiB0
aGVyZSBhcmUgZHluYW1pYyBzZWdtZW50cyBmb3IgdGhlIHJvdXRlOiAiICsgaGFuZGxlcnNbaGFu
ZGxlcnMubGVuZ3RoIC0gMV0uaGFuZGxlcik7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBwaXZvdEhh
bmRsZXJJbmZvID0gY3VycmVudEhhbmRsZXJJbmZvc1ttYXRjaFBvaW50IC0gMV0sCi0gICAgICAg
ICAgcGl2b3RIYW5kbGVyID0gcGl2b3RIYW5kbGVySW5mbyAmJiBwaXZvdEhhbmRsZXJJbmZvLmhh
bmRsZXI7Ci0KLSAgICAgIHJldHVybiB7IG1hdGNoUG9pbnQ6IG1hdGNoUG9pbnQsIHByb3ZpZGVk
TW9kZWxzOiBwcm92aWRlZE1vZGVscywgcGFyYW1zOiBwYXJhbXMsIGhhbmRsZXJQYXJhbXM6IGhh
bmRsZXJQYXJhbXMsIHBpdm90SGFuZGxlcjogcGl2b3RIYW5kbGVyIH07Ci0gICAgfQotCi0gICAg
ZnVuY3Rpb24gZ2V0TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZl
VHJhbnNpdGlvbiwgcGFyYW1OYW1lLCBwYXJhbXMpIHsKLQotICAgICAgaWYgKG9iamVjdHMubGVu
Z3RoICYmIHBhcmFtTmFtZSkgewotCi0gICAgICAgIHZhciBvYmplY3QgPSBvYmplY3RzLnBvcCgp
OwotCi0gICAgICAgIC8vIElmIHByb3ZpZGVkIG9iamVjdCBpcyBzdHJpbmcgb3IgbnVtYmVyLCB0
cmVhdCBhcyBwYXJhbS4KLSAgICAgICAgaWYgKGlzUGFyYW0ob2JqZWN0KSkgewotICAgICAgICAg
IHBhcmFtc1twYXJhbU5hbWVdID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChh
Y3RpdmVUcmFuc2l0aW9uKSB7Ci0gICAgICAgIC8vIFVzZSBtb2RlbCBmcm9tIHByZXZpb3VzIHRy
YW5zaXRpb24gYXR0ZW1wdCwgcHJlZmVyYWJseSB0aGUgcmVzb2x2ZWQgb25lLgotICAgICAgICBy
ZXR1cm4gYWN0aXZlVHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVsc1toYW5kbGVyTmFtZV0gfHwKLSAg
ICAgICAgICAgICAgIChwYXJhbU5hbWUgJiYgYWN0aXZlVHJhbnNpdGlvbi5wcm92aWRlZE1vZGVs
c1toYW5kbGVyTmFtZV0pOwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGlzUGFyYW0o
b2JqZWN0KSB7Ci0gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QgPT09ICJzdHJpbmciIHx8IG9i
amVjdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2Ygb2JqZWN0ID09PSAibnVtYmVyIiB8fCBv
YmplY3QgaW5zdGFuY2VvZiBOdW1iZXIpOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgIEBw
cml2YXRlCi0KLSAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1lIGFuZCByZXR1
cm5zIGEgbGlzdCBvZiBxdWVyeSBwYXJhbXMKLSAgICAgIHRoYXQgYXJlIHZhbGlkIHRvIHBhc3Mg
dG8gdGhlIGhhbmRsZXIgb3IgaXRzIHBhcmVudHMKLQotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJv
dXRlcgotICAgICAgQHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICBAcmV0dXJuIHtB
cnJheVtTdHJpbmddfSBhIGxpc3Qgb2YgcXVlcnkgcGFyYW1ldGVycwotICAgICovCi0gICAgZnVu
Y3Rpb24gcXVlcnlQYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxlck5hbWUpIHsKLSAgICAg
IHZhciBoYW5kbGVycyA9IHJvdXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1l
KSwKLSAgICAgICAgcXVlcnlQYXJhbXMgPSBbXTsKLQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICBxdWVyeVBhcmFtcy5wdXNoLmFwcGx5
KHF1ZXJ5UGFyYW1zLCBoYW5kbGVyc1tpXS5xdWVyeVBhcmFtcyB8fCBbXSk7Ci0gICAgICB9Ci0K
LSAgICAgIHJldHVybiBxdWVyeVBhcmFtczsKLSAgICB9Ci0gICAgLyoqCi0gICAgICBAcHJpdmF0
ZQotCi0gICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIGhhbmRsZXIgbmFtZSBhbmQgYSBsaXN0IG9m
IGNvbnRleHRzIGFuZCByZXR1cm5zCi0gICAgICBhIHNlcmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2gg
c3VpdGFibGUgdG8gcGFzcyB0byBgcmVjb2duaXplci5nZW5lcmF0ZSgpYC4KLQotICAgICAgQHBh
cmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAgQHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0g
ICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IG9iamVjdHMKLSAgICAgIEByZXR1cm4ge09iamVj
dH0gYSBzZXJpYWxpemVkIHBhcmFtZXRlciBoYXNoCi0gICAgKi8KLSAgICBmdW5jdGlvbiBwYXJh
bXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxlck5hbWUsIG9iamVjdHMsIHF1ZXJ5UGFyYW1zKSB7
Ci0KLSAgICAgIHZhciBoYW5kbGVycyA9IHJvdXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhh
bmRsZXJOYW1lKSwKLSAgICAgICAgICBwYXJhbXMgPSB7fSwKLSAgICAgICAgICBoYW5kbGVySW5m
b3MgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJz
LCBxdWVyeVBhcmFtcyksCi0gICAgICAgICAgbWF0Y2hQb2ludCA9IGdldE1hdGNoUG9pbnQocm91
dGVyLCBoYW5kbGVySW5mb3MsIG9iamVjdHMpLm1hdGNoUG9pbnQsCi0gICAgICAgICAgbWVyZ2Vk
UXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAgICBvYmplY3QsIGhhbmRsZXJPYmosIGhhbmRsZXIs
IG5hbWVzLCBpOwotCi0gICAgICBwYXJhbXMucXVlcnlQYXJhbXMgPSB7fTsKLQotICAgICAgZm9y
IChpPTA7IGk8aGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaGFuZGxlck9iaiA9IGhh
bmRsZXJzW2ldOwotICAgICAgICBoYW5kbGVyID0gcm91dGVyLmdldEhhbmRsZXIoaGFuZGxlck9i
ai5oYW5kbGVyKTsKLSAgICAgICAgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOwotCi0gICAgICAg
IC8vIElmIGl0J3MgYSBkeW5hbWljIHNlZ21lbnQKLSAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCkg
ewotICAgICAgICAgIC8vIElmIHdlIGhhdmUgb2JqZWN0cywgdXNlIHRoZW0KLSAgICAgICAgICBp
ZiAoaSA+PSBtYXRjaFBvaW50KSB7Ci0gICAgICAgICAgICBvYmplY3QgPSBvYmplY3RzLnNoaWZ0
KCk7Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSBleGlzdGluZyBjb250ZXh0Ci0gICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iamVjdCA9IGhhbmRsZXIuY29udGV4dDsKLSAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAvLyBTZXJpYWxpemUgdG8gZ2VuZXJhdGUgcGFyYW1zCi0gICAg
ICAgICAgbWVyZ2UocGFyYW1zLCBzZXJpYWxpemUoaGFuZGxlciwgb2JqZWN0LCBuYW1lcykpOwot
ICAgICAgICB9Ci0gICAgICAgIGlmIChxdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAgICAgICAg
ICBtZXJnZVNvbWVLZXlzKHBhcmFtcy5xdWVyeVBhcmFtcywgcm91dGVyLmN1cnJlbnRRdWVyeVBh
cmFtcywgaGFuZGxlck9iai5xdWVyeVBhcmFtcyk7Ci0gICAgICAgICAgbWVyZ2VTb21lS2V5cyhw
YXJhbXMucXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKTsK
LSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocXVlcnlQYXJhbXNFcXVhbChwYXJhbXMu
cXVlcnlQYXJhbXMsIHt9KSkgeyBkZWxldGUgcGFyYW1zLnF1ZXJ5UGFyYW1zOyB9Ci0gICAgICBy
ZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIG1lcmdlKGhhc2gsIG90aGVyKSB7
Ci0gICAgICBmb3IgKHZhciBwcm9wIGluIG90aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlci5oYXNP
d25Qcm9wZXJ0eShwcm9wKSkgeyBoYXNoW3Byb3BdID0gb3RoZXJbcHJvcF07IH0KLSAgICAgIH0K
LSAgICB9Ci0KLSAgICBmdW5jdGlvbiBtZXJnZVNvbWVLZXlzKGhhc2gsIG90aGVyLCBrZXlzKSB7
Ci0gICAgICBpZiAoIW90aGVyIHx8ICFrZXlzKSB7IHJldHVybjsgfQotICAgICAgZm9yKHZhciBp
ID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdmFyIGtleSA9IGtleXNbaV0s
IHZhbHVlOwotICAgICAgICBpZihvdGhlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAg
ICAgdmFsdWUgPSBvdGhlcltrZXldOwotICAgICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZh
bHVlID09PSBmYWxzZSB8fCB0eXBlb2YgdmFsdWUgPT09ICJ1bmRlZmluZWQiKSB7Ci0gICAgICAg
ICAgICBkZWxldGUgaGFzaFtrZXldOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBo
YXNoW2tleV0gPSBvdGhlcltrZXldOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQot
ICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLSAgICAqLwotCi0gICAgZnVuY3Rpb24g
Z2VuZXJhdGVIYW5kbGVySW5mb3NXaXRoUXVlcnlQYXJhbXMocm91dGVyLCBoYW5kbGVycywgcXVl
cnlQYXJhbXMpIHsKLSAgICAgIHZhciBoYW5kbGVySW5mb3MgPSBbXTsKLQotICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICB2YXIgaGFuZGxl
ciA9IGhhbmRsZXJzW2ldLAotICAgICAgICAgIGhhbmRsZXJJbmZvID0geyBoYW5kbGVyOiBoYW5k
bGVyLmhhbmRsZXIsIG5hbWVzOiBoYW5kbGVyLm5hbWVzLCBjb250ZXh0OiBoYW5kbGVyLmNvbnRl
eHQsIGlzRHluYW1pYzogaGFuZGxlci5pc0R5bmFtaWMgfSwKLSAgICAgICAgICBhY3RpdmVRdWVy
eVBhcmFtcyA9IHt9OwotCi0gICAgICAgIGlmIChxdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAg
ICAgICAgICBtZXJnZVNvbWVLZXlzKGFjdGl2ZVF1ZXJ5UGFyYW1zLCByb3V0ZXIuY3VycmVudFF1
ZXJ5UGFyYW1zLCBoYW5kbGVyLnF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlz
KGFjdGl2ZVF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcywgaGFuZGxlci5xdWVyeVBhcmFtcyk7Ci0g
ICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlci5xdWVyeVBhcmFtcyAmJiBoYW5kbGVyLnF1
ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICBoYW5kbGVySW5mby5xdWVyeVBhcmFt
cyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlckluZm9z
LnB1c2goaGFuZGxlckluZm8pOwotICAgICAgfQotCi0gICAgICByZXR1cm4gaGFuZGxlckluZm9z
OwotICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLSAgICAqLwotICAgIGZ1bmN0aW9u
IGNyZWF0ZVF1ZXJ5UGFyYW1UcmFuc2l0aW9uKHJvdXRlciwgcXVlcnlQYXJhbXMsIGlzSW50ZXJt
ZWRpYXRlKSB7Ci0gICAgICB2YXIgY3VycmVudEhhbmRsZXJzID0gcm91dGVyLmN1cnJlbnRIYW5k
bGVySW5mb3MsCi0gICAgICAgICAgY3VycmVudEhhbmRsZXIgPSBjdXJyZW50SGFuZGxlcnNbY3Vy
cmVudEhhbmRsZXJzLmxlbmd0aCAtIDFdLAotICAgICAgICAgIG5hbWUgPSBjdXJyZW50SGFuZGxl
ci5uYW1lOwotCi0gICAgICBsb2cocm91dGVyLCAiQXR0ZW1wdGluZyBxdWVyeSBwYXJhbSB0cmFu
c2l0aW9uIik7Ci0KLSAgICAgIHJldHVybiBjcmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBb
bmFtZSwgcXVlcnlQYXJhbXNdLCBpc0ludGVybWVkaWF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0g
ICAgICBAcHJpdmF0ZQotICAgICovCi0gICAgZnVuY3Rpb24gY3JlYXRlTmFtZWRUcmFuc2l0aW9u
KHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlhdGUpIHsKLSAgICAgIHZhciBwYXJ0aXRpb25lZEFy
Z3MgICAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKGFyZ3MpLAotICAgICAgICBwdXJlQXJncyAgICAg
ICAgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3NbMF0sCi0gICAgICAgIHF1ZXJ5UGFyYW1zICAgICAg
ICAgICA9IHBhcnRpdGlvbmVkQXJnc1sxXSwKLSAgICAgICAgaGFuZGxlcnMgICAgICAgICAgICAg
ID0gcm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IocHVyZUFyZ3NbMF0pLAotICAgICAgICBo
YW5kbGVySW5mb3MgICAgICAgICAgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVyeVBhcmFt
cyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBhcmFtcyk7Ci0KLQotICAgICAgbG9nKHJvdXRlciwg
IkF0dGVtcHRpbmcgdHJhbnNpdGlvbiB0byAiICsgcHVyZUFyZ3NbMF0pOwotCi0gICAgICByZXR1
cm4gcGVyZm9ybVRyYW5zaXRpb24ocm91dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGhhbmRsZXJJbmZvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZS5j
YWxsKHB1cmVBcmdzLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXIu
Y3VycmVudFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFt
cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlzSW50ZXJtZWRpYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAg
IEBwcml2YXRlCi0gICAgKi8KLSAgICBmdW5jdGlvbiBjcmVhdGVVUkxUcmFuc2l0aW9uKHJvdXRl
ciwgdXJsLCBpc0ludGVybWVkaWF0ZSkgewotICAgICAgdmFyIHJlc3VsdHMgPSByb3V0ZXIucmVj
b2duaXplci5yZWNvZ25pemUodXJsKSwKLSAgICAgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0g
cm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsCi0gICAgICAgICAgcXVlcnlQYXJhbXMgPSB7fSwK
LSAgICAgICAgICBpLCBsZW47Ci0KLSAgICAgIGxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0
cmFuc2l0aW9uIHRvICIgKyB1cmwpOwotCi0gICAgICBpZiAocmVzdWx0cykgewotICAgICAgICAv
LyBNYWtlIHN1cmUgdGhpcyByb3V0ZSBpcyBhY3R1YWxseSBhY2Nlc3NpYmxlIGJ5IFVSTC4KLSAg
ICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewot
Ci0gICAgICAgICAgaWYgKHJvdXRlci5nZXRIYW5kbGVyKHJlc3VsdHNbaV0uaGFuZGxlcikuaW5h
Y2Nlc3NpYmxlQnlVUkwpIHsKLSAgICAgICAgICAgIHJlc3VsdHMgPSBudWxsOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgh
cmVzdWx0cykgewotICAgICAgICByZXR1cm4gZXJyb3JUcmFuc2l0aW9uKHJvdXRlciwgbmV3IFJv
dXRlci5VbnJlY29nbml6ZWRVUkxFcnJvcih1cmwpKTsKLSAgICAgIH0KLQotICAgICAgZm9yKGkg
PSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIG1lcmdl
KHF1ZXJ5UGFyYW1zLCByZXN1bHRzW2ldLnF1ZXJ5UGFyYW1zKTsKLSAgICAgIH0KLQotICAgICAg
cmV0dXJuIHBlcmZvcm1UcmFuc2l0aW9uKHJvdXRlciwgcmVzdWx0cywgW10sIHt9LCBxdWVyeVBh
cmFtcywgbnVsbCwgaXNJbnRlcm1lZGlhdGUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICBA
cHJpdmF0ZQotCi0gICAgICBUYWtlcyBhbiBBcnJheSBvZiBgSGFuZGxlckluZm9gcywgZmlndXJl
cyBvdXQgd2hpY2ggb25lcyBhcmUKLSAgICAgIGV4aXRpbmcsIGVudGVyaW5nLCBvciBjaGFuZ2lu
ZyBjb250ZXh0cywgYW5kIGNhbGxzIHRoZQotICAgICAgcHJvcGVyIGhhbmRsZXIgaG9va3MuCi0K
LSAgICAgIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRyZWUgb2YgaGFuZGxl
cnMuIEVhY2ggaGFuZGxlciBpcwotICAgICAgZm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0
IGhhbmRsZXMuCi0KLSAgICAgIGBgYAotICAgICAgfH5pbmRleCAoIi8iKQotICAgICAgfCB8fnBv
c3RzICgiL3Bvc3RzIikKLSAgICAgIHwgfCB8LXNob3dQb3N0ICgiLzppZCIpCi0gICAgICB8IHwg
fC1uZXdQb3N0ICgiL25ldyIpCi0gICAgICB8IHwgfC1lZGl0UG9zdCAoIi9lZGl0IikKLSAgICAg
IHwgfH5hYm91dCAoIi9hYm91dC86aWQiKQotICAgICAgYGBgCi0KLSAgICAgIENvbnNpZGVyIHRo
ZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6Ci0KLSAgICAgIDEuIEEgVVJMIHRyYW5zaXRpb24gdG8g
YC9wb3N0cy8xYC4KLSAgICAgICAgIDEuIFRyaWdnZXJzIHRoZSBgKm1vZGVsYCBjYWxsYmFja3Mg
b24gdGhlCi0gICAgICAgICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQgYHNob3dQb3N0YCBoYW5k
bGVycwotICAgICAgICAgMi4gVHJpZ2dlcnMgdGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gdGhlIHNh
bWUKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIHRoZSBzYW1l
Ci0gICAgICAyLiBBIGRpcmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAotICAgICAgICAgMS4g
VHJpZ2dlcnMgdGhlIGBleGl0YCBjYWxsYmFjayBvbiBgc2hvd1Bvc3RgCi0gICAgICAgICAyLiBU
cmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgbmV3UG9zdGAKLSAgICAgICAgIDMuIFRy
aWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAotICAgICAgMy4gQSBkaXJl
Y3QgdHJhbnNpdGlvbiB0byBgYWJvdXRgIHdpdGggYSBzcGVjaWZpZWQKLSAgICAgICAgIGNvbnRl
eHQgb2JqZWN0Ci0gICAgICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBu
ZXdQb3N0YAotICAgICAgICAgICAgYW5kIGBwb3N0c2AKLSAgICAgICAgIDIuIFRyaWdnZXJzIHRo
ZSBgc2VyaWFsaXplYCBjYWxsYmFjayBvbiBgYWJvdXRgCi0gICAgICAgICAzLiBUcmlnZ2VycyB0
aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgYWJvdXRgCi0gICAgICAgICA0LiBUcmlnZ2VycyB0aGUg
YHNldHVwYCBjYWxsYmFjayBvbiBgYWJvdXRgCi0KLSAgICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0g
dHJhbnNpdGlvbgotICAgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IGhhbmRsZXJJbmZv
cwotICAgICovCi0gICAgZnVuY3Rpb24gc2V0dXBDb250ZXh0cyh0cmFuc2l0aW9uLCBoYW5kbGVy
SW5mb3MpIHsKLSAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKLSAgICAgICAg
ICBwYXJ0aXRpb24gPSBwYXJ0aXRpb25IYW5kbGVycyhyb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZv
cyB8fCBbXSwgaGFuZGxlckluZm9zKTsKLQotICAgICAgcm91dGVyLnRhcmdldEhhbmRsZXJJbmZv
cyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAgZWFjaEhhbmRsZXIocGFydGl0aW9uLmV4aXRlZCwg
ZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5m
by5oYW5kbGVyOwotICAgICAgICBkZWxldGUgaGFuZGxlci5jb250ZXh0OwotICAgICAgICBpZiAo
aGFuZGxlci5leGl0KSB7IGhhbmRsZXIuZXhpdCgpOyB9Ci0gICAgICB9KTsKLQotICAgICAgdmFy
IGN1cnJlbnRIYW5kbGVySW5mb3MgPSBwYXJ0aXRpb24udW5jaGFuZ2VkLnNsaWNlKCk7Ci0gICAg
ICByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyA9IGN1cnJlbnRIYW5kbGVySW5mb3M7Ci0KLSAg
ICAgIGVhY2hIYW5kbGVyKHBhcnRpdGlvbi51cGRhdGVkQ29udGV4dCwgZnVuY3Rpb24oaGFuZGxl
ckluZm8pIHsKLSAgICAgICAgaGFuZGxlckVudGVyZWRPclVwZGF0ZWQodHJhbnNpdGlvbiwgY3Vy
cmVudEhhbmRsZXJJbmZvcywgaGFuZGxlckluZm8sIGZhbHNlKTsKLSAgICAgIH0pOwotCi0gICAg
ICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZW50ZXJlZCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsK
LSAgICAgICAgaGFuZGxlckVudGVyZWRPclVwZGF0ZWQodHJhbnNpdGlvbiwgY3VycmVudEhhbmRs
ZXJJbmZvcywgaGFuZGxlckluZm8sIHRydWUpOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoq
Ci0gICAgICBAcHJpdmF0ZQotCi0gICAgICBIZWxwZXIgbWV0aG9kIHVzZWQgYnkgc2V0dXBDb250
ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVkaXJlY3RzCi0gICAgICB0aGF0IG1heSBoYXBwZW4g
aW4gZW50ZXIvc2V0dXAuCi0gICAgKi8KLSAgICBmdW5jdGlvbiBoYW5kbGVyRW50ZXJlZE9yVXBk
YXRlZCh0cmFuc2l0aW9uLCBjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVySW5mbywgZW50ZXIp
IHsKLSAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlciwKLSAgICAgICAgICBj
b250ZXh0ID0gaGFuZGxlckluZm8uY29udGV4dDsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgaWYg
KGVudGVyICYmIGhhbmRsZXIuZW50ZXIpIHsgaGFuZGxlci5lbnRlcigpOyB9Ci0gICAgICAgIGNo
ZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0KLSAgICAgICAgc2V0Q29udGV4dChoYW5kbGVyLCBjb250
ZXh0KTsKLSAgICAgICAgc2V0UXVlcnlQYXJhbXMoaGFuZGxlciwgaGFuZGxlckluZm8ucXVlcnlQ
YXJhbXMpOwotCi0gICAgICAgIGlmIChoYW5kbGVyLnNldHVwKSB7IGhhbmRsZXIuc2V0dXAoY29u
dGV4dCwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOyB9Ci0gICAgICAgIGNoZWNrQWJvcnQodHJh
bnNpdGlvbik7Ci0gICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9m
IFJvdXRlci5UcmFuc2l0aW9uQWJvcnRlZCkpIHsKLSAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBg
ZXJyb3JgIGV2ZW50IHN0YXJ0aW5nIGZyb20gdGhpcyBmYWlsZWQgaGFuZGxlci4KLSAgICAgICAg
ICB0cmFuc2l0aW9uLnRyaWdnZXIodHJ1ZSwgJ2Vycm9yJywgZSwgdHJhbnNpdGlvbiwgaGFuZGxl
cik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGVycm9yIHNvIHRoYXQg
dGhlIHRyYW5zaXRpb24gcHJvbWlzZSB3aWxsIHJlamVjdC4KLSAgICAgICAgdGhyb3cgZTsKLSAg
ICAgIH0KLQotICAgICAgY3VycmVudEhhbmRsZXJJbmZvcy5wdXNoKGhhbmRsZXJJbmZvKTsKLSAg
ICB9Ci0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgSXRlcmF0ZXMgb3ZlciBh
biBhcnJheSBvZiBgSGFuZGxlckluZm9gcywgcGFzc2luZyB0aGUgaGFuZGxlcgotICAgICAgYW5k
IGNvbnRleHQgaW50byB0aGUgY2FsbGJhY2suCi0KLSAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxl
ckluZm9dfSBoYW5kbGVySW5mb3MKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb24oT2JqZWN0LCBPYmpl
Y3QpfSBjYWxsYmFjawotICAgICovCi0gICAgZnVuY3Rpb24gZWFjaEhhbmRsZXIoaGFuZGxlcklu
Zm9zLCBjYWxsYmFjaykgewotICAgICAgZm9yICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZvcy5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNhbGxiYWNrKGhhbmRsZXJJbmZvc1tpXSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBkZXRlcm1pbmVz
IGlmIHR3byBxdWVyeXBhcmFtIG9iamVjdHMgYXJlIHRoZSBzYW1lIG9yIG5vdAotICAgICoqLwot
ICAgIGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zRXF1YWwoYSwgYikgewotICAgICAgYSA9IGEgfHwge307
Ci0gICAgICBiID0gYiB8fCB7fTsKLSAgICAgIHZhciBjaGVja2VkS2V5cyA9IFtdLCBrZXk7Ci0g
ICAgICBmb3Ioa2V5IGluIGEpIHsKLSAgICAgICAgaWYgKCFhLmhhc093blByb3BlcnR5KGtleSkp
IHsgY29udGludWU7IH0KLSAgICAgICAgaWYoYltrZXldICE9PSBhW2tleV0pIHsgcmV0dXJuIGZh
bHNlOyB9Ci0gICAgICAgIGNoZWNrZWRLZXlzLnB1c2goa2V5KTsKLSAgICAgIH0KLSAgICAgIGZv
cihrZXkgaW4gYikgewotICAgICAgICBpZiAoIWIuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250
aW51ZTsgfQotICAgICAgICBpZiAofmNoZWNrZWRLZXlzLmluZGV4T2Yoa2V5KSkgeyBjb250aW51
ZTsgfQotICAgICAgICAvLyBiIGhhcyBhIGtleSBub3QgaW4gYQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAg
IEBwcml2YXRlCi0KLSAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNpdGlv
bmluZyBmcm9tIG9uZSBVUkwgdG8KLSAgICAgIGFub3RoZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGhh
bmRsZXJzIGFyZSBubyBsb25nZXIgYWN0aXZlLAotICAgICAgd2hpY2ggaGFuZGxlcnMgYXJlIG5l
d2x5IGFjdGl2ZSwgYW5kIHdoaWNoIGhhbmRsZXJzIHJlbWFpbgotICAgICAgYWN0aXZlIGJ1dCBo
YXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4KLQotICAgICAgVGFrZSBhIGxpc3Qgb2Ygb2xkIGhh
bmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5kIHBhcnRpdGlvbgotICAgICAgdGhlbSBpbnRvIGZv
dXIgYnVja2V0czoKLQotICAgICAgKiB1bmNoYW5nZWQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUg
aW4gYm90aCB0aGUgb2xkIGFuZAotICAgICAgICBuZXcgVVJMLCBhbmQgaXRzIGNvbnRleHQgcmVt
YWlucyB0aGUgc2FtZQotICAgICAgKiB1cGRhdGVkIGNvbnRleHQ6IHRoZSBoYW5kbGVyIHdhcyBh
Y3RpdmUgaW4gYm90aCB0aGUKLSAgICAgICAgb2xkIGFuZCBuZXcgVVJMLCBidXQgaXRzIGNvbnRl
eHQgY2hhbmdlZC4gVGhlIGhhbmRsZXIncwotICAgICAgICBgc2V0dXBgIG1ldGhvZCwgaWYgYW55
LCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcKLSAgICAgICAgY29udGV4dC4KLSAgICAgICog
ZXhpdGVkOiB0aGUgaGFuZGxlciB3YXMgYWN0aXZlIGluIHRoZSBvbGQgVVJMLCBidXQgaXMKLSAg
ICAgICAgbm8gbG9uZ2VyIGFjdGl2ZS4KLSAgICAgICogZW50ZXJlZDogdGhlIGhhbmRsZXIgd2Fz
IG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dAotICAgICAgICBpcyBub3cgYWN0aXZlLgot
Ci0gICAgICBUaGUgUGFydGl0aW9uZWRIYW5kbGVycyBzdHJ1Y3R1cmUgaGFzIGZvdXIgZmllbGRz
OgotCi0gICAgICAqIGB1cGRhdGVkQ29udGV4dGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9i
amVjdHMgdGhhdAotICAgICAgICByZXByZXNlbnQgaGFuZGxlcnMgdGhhdCByZW1haW4gYWN0aXZl
IGJ1dCBoYXZlIGEgY2hhbmdlZAotICAgICAgICBjb250ZXh0Ci0gICAgICAqIGBlbnRlcmVkYDog
YSBsaXN0IG9mIGBIYW5kbGVySW5mb2Agb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAgICBo
YW5kbGVycyB0aGF0IGFyZSBuZXdseSBhY3RpdmUKLSAgICAgICogYGV4aXRlZGA6IGEgbGlzdCBv
ZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCBhcmUgbm8KLSAgICAgICAgbG9uZ2VyIGFjdGl2
ZS4KLSAgICAgICogYHVuY2hhbmdlZGA6IGEgbGlzdCBvZiBgSGFuZGVySW5mb2Agb2JqZWN0cyB0
aGF0IHJlbWFpbiBhY3RpdmUuCi0KLSAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBv
bGRIYW5kbGVycyBhIGxpc3Qgb2YgdGhlIGhhbmRsZXIKLSAgICAgICAgaW5mb3JtYXRpb24gZm9y
IHRoZSBwcmV2aW91cyBVUkwgKG9yIGBbXWAgaWYgdGhpcyBpcyB0aGUKLSAgICAgICAgZmlyc3Qg
aGFuZGxlZCB0cmFuc2l0aW9uKQotICAgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG5l
d0hhbmRsZXJzIGEgbGlzdCBvZiB0aGUgaGFuZGxlcgotICAgICAgICBpbmZvcm1hdGlvbiBmb3Ig
dGhlIG5ldyBVUkwKLQotICAgICAgQHJldHVybiB7UGFydGl0aW9ufQotICAgICovCi0gICAgZnVu
Y3Rpb24gcGFydGl0aW9uSGFuZGxlcnMob2xkSGFuZGxlcnMsIG5ld0hhbmRsZXJzKSB7Ci0gICAg
ICB2YXIgaGFuZGxlcnMgPSB7Ci0gICAgICAgICAgICB1cGRhdGVkQ29udGV4dDogW10sCi0gICAg
ICAgICAgICBleGl0ZWQ6IFtdLAotICAgICAgICAgICAgZW50ZXJlZDogW10sCi0gICAgICAgICAg
ICB1bmNoYW5nZWQ6IFtdCi0gICAgICAgICAgfTsKLQotICAgICAgdmFyIGhhbmRsZXJDaGFuZ2Vk
LCBjb250ZXh0Q2hhbmdlZCwgcXVlcnlQYXJhbXNDaGFuZ2VkLCBpLCBsOwotCi0gICAgICBmb3Ig
KGk9MCwgbD1uZXdIYW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHZhciBvbGRI
YW5kbGVyID0gb2xkSGFuZGxlcnNbaV0sIG5ld0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsKLQot
ICAgICAgICBpZiAoIW9sZEhhbmRsZXIgfHwgb2xkSGFuZGxlci5oYW5kbGVyICE9PSBuZXdIYW5k
bGVyLmhhbmRsZXIpIHsKLSAgICAgICAgICBoYW5kbGVyQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAg
IH0gZWxzZSBpZiAoIXF1ZXJ5UGFyYW1zRXF1YWwob2xkSGFuZGxlci5xdWVyeVBhcmFtcywgbmV3
SGFuZGxlci5xdWVyeVBhcmFtcykpIHsKLSAgICAgICAgICBxdWVyeVBhcmFtc0NoYW5nZWQgPSB0
cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFuZ2VkKSB7Ci0gICAgICAg
ICAgaGFuZGxlcnMuZW50ZXJlZC5wdXNoKG5ld0hhbmRsZXIpOwotICAgICAgICAgIGlmIChvbGRI
YW5kbGVyKSB7IGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhhbmRsZXIpOyB9Ci0gICAgICAg
IH0gZWxzZSBpZiAoY29udGV4dENoYW5nZWQgfHwgb2xkSGFuZGxlci5jb250ZXh0ICE9PSBuZXdI
YW5kbGVyLmNvbnRleHQgfHwgcXVlcnlQYXJhbXNDaGFuZ2VkKSB7Ci0gICAgICAgICAgY29udGV4
dENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgIGhhbmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2go
bmV3SGFuZGxlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaGFuZGxlcnMudW5jaGFu
Z2VkLnB1c2gob2xkSGFuZGxlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChp
PW5ld0hhbmRsZXJzLmxlbmd0aCwgbD1vbGRIYW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICAgIGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhhbmRsZXJzW2ldKTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHRyaWdnZXIo
cm91dGVyLCBoYW5kbGVySW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFyZ3MpIHsKLSAgICAgIGlmIChy
b3V0ZXIudHJpZ2dlckV2ZW50KSB7Ci0gICAgICAgIHJvdXRlci50cmlnZ2VyRXZlbnQoaGFuZGxl
ckluZm9zLCBpZ25vcmVGYWlsdXJlLCBhcmdzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQot
Ci0gICAgICB2YXIgbmFtZSA9IGFyZ3Muc2hpZnQoKTsKLQotICAgICAgaWYgKCFoYW5kbGVySW5m
b3MpIHsKLSAgICAgICAgaWYgKGlnbm9yZUZhaWx1cmUpIHsgcmV0dXJuOyB9Ci0gICAgICAgIHRo
cm93IG5ldyBFcnJvcigiQ291bGQgbm90IHRyaWdnZXIgZXZlbnQgJyIgKyBuYW1lICsgIicuIFRo
ZXJlIGFyZSBubyBhY3RpdmUgaGFuZGxlcnMiKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGV2ZW50
V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0gICAgICBmb3IgKHZhciBpPWhhbmRsZXJJbmZvcy5sZW5n
dGgtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZv
c1tpXSwKLSAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAg
ICAgIGlmIChoYW5kbGVyLmV2ZW50cyAmJiBoYW5kbGVyLmV2ZW50c1tuYW1lXSkgewotICAgICAg
ICAgIGlmIChoYW5kbGVyLmV2ZW50c1tuYW1lXS5hcHBseShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1
ZSkgewotICAgICAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
fQotCi0gICAgICBpZiAoIWV2ZW50V2FzSGFuZGxlZCAmJiAhaWdub3JlRmFpbHVyZSkgewotICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdGhpbmcgaGFuZGxlZCB0aGUgZXZlbnQgJyIgKyBuYW1l
ICsgIicuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2V0Q29udGV4dChoYW5k
bGVyLCBjb250ZXh0KSB7Ci0gICAgICBoYW5kbGVyLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAg
aWYgKGhhbmRsZXIuY29udGV4dERpZENoYW5nZSkgeyBoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2Uo
KTsgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIHNldFF1ZXJ5UGFyYW1zKGhhbmRsZXIsIHF1ZXJ5
UGFyYW1zKSB7Ci0gICAgICBoYW5kbGVyLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Ci0gICAg
ICBpZiAoaGFuZGxlci5xdWVyeVBhcmFtc0RpZENoYW5nZSkgeyBoYW5kbGVyLnF1ZXJ5UGFyYW1z
RGlkQ2hhbmdlKCk7IH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAg
ICAgRXh0cmFjdHMgcXVlcnkgcGFyYW1zIGZyb20gdGhlIGVuZCBvZiBhbiBhcnJheQotICAgICoq
LwotCi0gICAgZnVuY3Rpb24gZXh0cmFjdFF1ZXJ5UGFyYW1zKGFycmF5KSB7Ci0gICAgICB2YXIg
bGVuID0gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCksIGhlYWQsIHF1ZXJ5UGFyYW1zOwotCi0gICAg
ICBpZihsZW4gJiYgbGVuID4gMCAmJiBhcnJheVtsZW4gLSAxXSAmJiBhcnJheVtsZW4gLSAxXS5o
YXNPd25Qcm9wZXJ0eSgncXVlcnlQYXJhbXMnKSkgewotICAgICAgICBxdWVyeVBhcmFtcyA9IGFy
cmF5W2xlbiAtIDFdLnF1ZXJ5UGFyYW1zOwotICAgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJh
eSwgMCwgbGVuIC0gMSk7Ci0gICAgICAgIHJldHVybiBbaGVhZCwgcXVlcnlQYXJhbXNdOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFthcnJheSwgbnVsbF07Ci0gICAgICB9Ci0gICAg
fQotCi0gICAgZnVuY3Rpb24gcGVyZm9ybUludGVybWVkaWF0ZVRyYW5zaXRpb24ocm91dGVyLCBy
ZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVzdWx0cykgewotCi0gICAgICB2YXIgaGFuZGxlcklu
Zm9zID0gZ2VuZXJhdGVIYW5kbGVySW5mb3Mocm91dGVyLCByZWNvZ0hhbmRsZXJzKTsKLSAgICAg
IGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlckluZm9zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAg
IHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKLSAgICAgICAgaGFuZGxlckluZm8u
Y29udGV4dCA9IG1hdGNoUG9pbnRSZXN1bHRzLnByb3ZpZGVkTW9kZWxzW2hhbmRsZXJJbmZvLm5h
bWVdOwotICAgICAgfQotCi0gICAgICB2YXIgc3R1YmJlZFRyYW5zaXRpb24gPSB7Ci0gICAgICAg
IHJvdXRlcjogcm91dGVyLAotICAgICAgICBpc0Fib3J0ZWQ6IGZhbHNlCi0gICAgICB9OwotCi0g
ICAgICBzZXR1cENvbnRleHRzKHN0dWJiZWRUcmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpOwotICAg
IH0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgQ3JlYXRlcywgYmVnaW5zLCBh
bmQgcmV0dXJucyBhIFRyYW5zaXRpb24uCi0gICAgICovCi0gICAgZnVuY3Rpb24gcGVyZm9ybVRy
YW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBwcm92aWRlZE1vZGVsc0FycmF5LCBwYXJh
bXMsIHF1ZXJ5UGFyYW1zLCBkYXRhLCBpc0ludGVybWVkaWF0ZSkgewotCi0gICAgICB2YXIgbWF0
Y2hQb2ludFJlc3VsdHMgPSBnZXRNYXRjaFBvaW50KHJvdXRlciwgcmVjb2dIYW5kbGVycywgcHJv
dmlkZWRNb2RlbHNBcnJheSwgcGFyYW1zLCBxdWVyeVBhcmFtcyksCi0gICAgICAgICAgdGFyZ2V0
TmFtZSA9IHJlY29nSGFuZGxlcnNbcmVjb2dIYW5kbGVycy5sZW5ndGggLSAxXS5oYW5kbGVyLAot
ICAgICAgICAgIHdhc1RyYW5zaXRpb25pbmcgPSBmYWxzZSwKLSAgICAgICAgICBjdXJyZW50SGFu
ZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3M7Ci0KLSAgICAgIGlmIChpc0lu
dGVybWVkaWF0ZSkgewotICAgICAgICByZXR1cm4gcGVyZm9ybUludGVybWVkaWF0ZVRyYW5zaXRp
b24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVzdWx0cyk7Ci0gICAgICB9Ci0K
LSAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHRyYW5zaXRpb24gdW5kZXJ3YXku
Ci0gICAgICBpZiAocm91dGVyLmFjdGl2ZVRyYW5zaXRpb24pIHsKLSAgICAgICAgaWYgKHRyYW5z
aXRpb25zSWRlbnRpY2FsKHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uLCB0YXJnZXROYW1lLCBwcm92
aWRlZE1vZGVsc0FycmF5LCBxdWVyeVBhcmFtcykpIHsKLSAgICAgICAgICByZXR1cm4gcm91dGVy
LmFjdGl2ZVRyYW5zaXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGVyLmFjdGl2ZVRyYW5z
aXRpb24uYWJvcnQoKTsKLSAgICAgICAgd2FzVHJhbnNpdGlvbmluZyA9IHRydWU7Ci0gICAgICB9
Ci0KLSAgICAgIHZhciBkZWZlcnJlZCA9IFJTVlAuZGVmZXIoKSwKLSAgICAgICAgICB0cmFuc2l0
aW9uID0gbmV3IFRyYW5zaXRpb24ocm91dGVyLCBkZWZlcnJlZC5wcm9taXNlKTsKLQotICAgICAg
dHJhbnNpdGlvbi50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKLSAgICAgIHRyYW5zaXRpb24ucHJv
dmlkZWRNb2RlbHMgPSBtYXRjaFBvaW50UmVzdWx0cy5wcm92aWRlZE1vZGVsczsKLSAgICAgIHRy
YW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheSA9IHByb3ZpZGVkTW9kZWxzQXJyYXk7Ci0gICAg
ICB0cmFuc2l0aW9uLnBhcmFtcyA9IG1hdGNoUG9pbnRSZXN1bHRzLnBhcmFtczsKLSAgICAgIHRy
YW5zaXRpb24uZGF0YSA9IGRhdGEgfHwge307Ci0gICAgICB0cmFuc2l0aW9uLnF1ZXJ5UGFyYW1z
ID0gcXVlcnlQYXJhbXM7Ci0gICAgICB0cmFuc2l0aW9uLnBpdm90SGFuZGxlciA9IG1hdGNoUG9p
bnRSZXN1bHRzLnBpdm90SGFuZGxlcjsKLSAgICAgIHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uID0g
dHJhbnNpdGlvbjsKLQotICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IGdlbmVyYXRlSGFuZGxlcklu
Zm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycyk7Ci0gICAgICB0cmFuc2l0aW9uLmhhbmRsZXJJbmZv
cyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAgLy8gRmlyZSAnd2lsbFRyYW5zaXRpb24nIGV2ZW50
IG9uIGN1cnJlbnQgaGFuZGxlcnMsIGJ1dCBkb24ndCBmaXJlIGl0Ci0gICAgICAvLyBpZiBhIHRy
YW5zaXRpb24gd2FzIGFscmVhZHkgdW5kZXJ3YXkuCi0gICAgICBpZiAoIXdhc1RyYW5zaXRpb25p
bmcpIHsKLSAgICAgICAgdHJpZ2dlcihyb3V0ZXIsIGN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUs
IFsnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0aW9uXSk7Ci0gICAgICB9Ci0KLSAgICAgIGxvZyhy
b3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJCZWdpbm5pbmcgdmFsaWRhdGlvbiBmb3IgdHJh
bnNpdGlvbiB0byAiICsgdHJhbnNpdGlvbi50YXJnZXROYW1lKTsKLSAgICAgIHZhbGlkYXRlRW50
cnkodHJhbnNpdGlvbiwgbWF0Y2hQb2ludFJlc3VsdHMubWF0Y2hQb2ludCwgbWF0Y2hQb2ludFJl
c3VsdHMuaGFuZGxlclBhcmFtcykKLSAgICAgICAgICAgICAgICAgICAudGhlbih0cmFuc2l0aW9u
U3VjY2VzcywgdHJhbnNpdGlvbkZhaWx1cmUpOwotCi0gICAgICByZXR1cm4gdHJhbnNpdGlvbjsK
LQotICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvblN1Y2Nlc3MoKSB7Ci0gICAgICAgIGNoZWNrQWJv
cnQodHJhbnNpdGlvbik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmaW5hbGl6ZVRyYW5z
aXRpb24odHJhbnNpdGlvbiwgaGFuZGxlckluZm9zKTsKLQotICAgICAgICAgIC8vIGN1cnJlbnRI
YW5kbGVySW5mb3Mgd2FzIHVwZGF0ZWQgaW4gZmluYWxpemVUcmFuc2l0aW9uCi0gICAgICAgICAg
dHJpZ2dlcihyb3V0ZXIsIHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zLCB0cnVlLCBbJ2RpZFRy
YW5zaXRpb24nXSk7Ci0KLSAgICAgICAgICBpZiAocm91dGVyLmRpZFRyYW5zaXRpb24pIHsKLSAg
ICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uKGhhbmRsZXJJbmZvcyk7Ci0gICAgICAgICAg
fQotCi0gICAgICAgICAgbG9nKHJvdXRlciwgdHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlRSQU5TSVRJ
T04gQ09NUExFVEUuIik7Ci0KLSAgICAgICAgICAvLyBSZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhh
bmRsZXIuCi0gICAgICAgICAgdHJhbnNpdGlvbi5pc0FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAg
IGRlZmVycmVkLnJlc29sdmUoaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5o
YW5kbGVyKTsKLSAgICAgICAgfSBjYXRjaChlKSB7Ci0gICAgICAgICAgZGVmZXJyZWQucmVqZWN0
KGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG9uJ3QgbnVsbGlmeSBpZiBhbm90aGVyIHRy
YW5zaXRpb24gaXMgdW5kZXJ3YXkgKG1lYW5pbmcKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgdHJh
bnNpdGlvbiBpbml0aWF0ZWQgd2l0aCBlbnRlci9zZXR1cCkuCi0gICAgICAgIGlmICghdHJhbnNp
dGlvbi5pc0Fib3J0ZWQpIHsKLSAgICAgICAgICByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51
bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvbkZhaWx1
cmUocmVhc29uKSB7Ci0gICAgICAgIGRlZmVycmVkLnJlamVjdChyZWFzb24pOwotICAgICAgfQot
ICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgQWNjZXB0cyBoYW5kbGVy
cyBpbiBSZWNvZ25pemVyIGZvcm1hdCwgZWl0aGVyIHJldHVybmVkIGZyb20KLSAgICAgIHJlY29n
bml6ZSgpIG9yIGhhbmRsZXJzRm9yKCksIGFuZCByZXR1cm5zIHVuaWZpZWQKLSAgICAgIGBIYW5k
bGVySW5mb2BzLgotICAgICAqLwotICAgIGZ1bmN0aW9uIGdlbmVyYXRlSGFuZGxlckluZm9zKHJv
dXRlciwgcmVjb2dIYW5kbGVycykgewotICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IFtdOwotICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlY29nSGFuZGxlcnMubGVuZ3RoOyBpIDwgbGVuOyAr
K2kpIHsKLSAgICAgICAgdmFyIGhhbmRsZXJPYmogPSByZWNvZ0hhbmRsZXJzW2ldLAotICAgICAg
ICAgICAgaXNEeW5hbWljID0gaGFuZGxlck9iai5pc0R5bmFtaWMgfHwgKGhhbmRsZXJPYmoubmFt
ZXMgJiYgaGFuZGxlck9iai5uYW1lcy5sZW5ndGgpOwotCi0gICAgICAgIHZhciBoYW5kbGVySW5m
byA9IHsKLSAgICAgICAgICBpc0R5bmFtaWM6ICEhaXNEeW5hbWljLAotICAgICAgICAgIG5hbWU6
IGhhbmRsZXJPYmouaGFuZGxlciwKLSAgICAgICAgICBoYW5kbGVyOiByb3V0ZXIuZ2V0SGFuZGxl
cihoYW5kbGVyT2JqLmhhbmRsZXIpCi0gICAgICAgIH07Ci0gICAgICAgIGlmKGhhbmRsZXJPYmou
cXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICBoYW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGhhbmRs
ZXJPYmoucXVlcnlQYXJhbXM7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlckluZm9zLnB1c2go
aGFuZGxlckluZm8pOwotICAgICAgfQotICAgICAgcmV0dXJuIGhhbmRsZXJJbmZvczsKLSAgICB9
Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0gICAgICovCi0gICAgZnVuY3Rpb24gdHJhbnNp
dGlvbnNJZGVudGljYWwob2xkVHJhbnNpdGlvbiwgdGFyZ2V0TmFtZSwgcHJvdmlkZWRNb2RlbHNB
cnJheSwgcXVlcnlQYXJhbXMpIHsKLQotICAgICAgaWYgKG9sZFRyYW5zaXRpb24udGFyZ2V0TmFt
ZSAhPT0gdGFyZ2V0TmFtZSkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgdmFyIG9sZE1vZGVs
cyA9IG9sZFRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheTsKLSAgICAgIGlmIChvbGRNb2Rl
bHMubGVuZ3RoICE9PSBwcm92aWRlZE1vZGVsc0FycmF5Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7
IH0KLQotICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9sZE1vZGVscy5sZW5ndGg7IGkgPCBs
ZW47ICsraSkgewotICAgICAgICBpZiAob2xkTW9kZWxzW2ldICE9PSBwcm92aWRlZE1vZGVsc0Fy
cmF5W2ldKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgfQotCi0gICAgICBpZighcXVlcnlQYXJh
bXNFcXVhbChvbGRUcmFuc2l0aW9uLnF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcykpIHsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0K
LSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFVwZGF0ZXMgdGhlIFVSTCAoaWYgbmVj
ZXNzYXJ5KSBhbmQgY2FsbHMgYHNldHVwQ29udGV4dHNgCi0gICAgICB0byB1cGRhdGUgdGhlIHJv
dXRlcidzIGFycmF5IG9mIGBjdXJyZW50SGFuZGxlckluZm9zYC4KLSAgICAgKi8KLSAgICBmdW5j
dGlvbiBmaW5hbGl6ZVRyYW5zaXRpb24odHJhbnNpdGlvbiwgaGFuZGxlckluZm9zKSB7Ci0KLSAg
ICAgIGxvZyh0cmFuc2l0aW9uLnJvdXRlciwgdHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlZhbGlkYXRp
b24gc3VjY2VlZGVkLCBmaW5hbGl6aW5nIHRyYW5zaXRpb247Iik7Ci0KLSAgICAgIHZhciByb3V0
ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKLSAgICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVl
bmNlLAotICAgICAgICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5s
ZW5ndGggLSAxXS5uYW1lLAotICAgICAgICAgIHVybE1ldGhvZCA9IHRyYW5zaXRpb24udXJsTWV0
aG9kLAotICAgICAgICAgIGk7Ci0KLSAgICAgIC8vIENvbGxlY3QgcGFyYW1zIGZvciBVUkwuCi0g
ICAgICB2YXIgb2JqZWN0cyA9IFtdLCBwcm92aWRlZE1vZGVscyA9IHRyYW5zaXRpb24ucHJvdmlk
ZWRNb2RlbHNBcnJheS5zbGljZSgpOwotICAgICAgZm9yIChpID0gaGFuZGxlckluZm9zLmxlbmd0
aCAtIDE7IGk+PTA7IC0taSkgewotICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5m
b3NbaV07Ci0gICAgICAgIGlmIChoYW5kbGVySW5mby5pc0R5bmFtaWMpIHsKLSAgICAgICAgICB2
YXIgcHJvdmlkZWRNb2RlbCA9IHByb3ZpZGVkTW9kZWxzLnBvcCgpOwotICAgICAgICAgIG9iamVj
dHMudW5zaGlmdChpc1BhcmFtKHByb3ZpZGVkTW9kZWwpID8gcHJvdmlkZWRNb2RlbC50b1N0cmlu
ZygpIDogaGFuZGxlckluZm8uY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFu
ZGxlckluZm8uaGFuZGxlci5pbmFjY2Vzc2libGVCeVVSTCkgewotICAgICAgICAgIHVybE1ldGhv
ZCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdmFyIG5ld1F1ZXJ5UGFyYW1z
ID0ge307Ci0gICAgICBmb3IgKGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaT49MDsgLS1p
KSB7Ci0gICAgICAgIG1lcmdlKG5ld1F1ZXJ5UGFyYW1zLCBoYW5kbGVySW5mb3NbaV0ucXVlcnlQ
YXJhbXMpOwotICAgICAgfQotICAgICAgcm91dGVyLmN1cnJlbnRRdWVyeVBhcmFtcyA9IG5ld1F1
ZXJ5UGFyYW1zOwotCi0KLSAgICAgIHZhciBwYXJhbXMgPSBwYXJhbXNGb3JIYW5kbGVyKHJvdXRl
ciwgaGFuZGxlck5hbWUsIG9iamVjdHMsIHRyYW5zaXRpb24ucXVlcnlQYXJhbXMpOwotCi0gICAg
ICByb3V0ZXIuY3VycmVudFBhcmFtcyA9IHBhcmFtczsKLQotICAgICAgaWYgKHVybE1ldGhvZCkg
ewotICAgICAgICB2YXIgdXJsID0gcm91dGVyLnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxlck5h
bWUsIHBhcmFtcyk7Ci0KLSAgICAgICAgaWYgKHVybE1ldGhvZCA9PT0gJ3JlcGxhY2UnKSB7Ci0g
ICAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwodXJsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAvLyBBc3N1bWUgZXZlcnl0aGluZyBlbHNlIGlzIGp1c3QgYSBVUkwgdXBkYXRlIGZvciBu
b3cuCi0gICAgICAgICAgcm91dGVyLnVwZGF0ZVVSTCh1cmwpOwotICAgICAgICB9Ci0gICAgICB9
Ci0KLSAgICAgIHNldHVwQ29udGV4dHModHJhbnNpdGlvbiwgaGFuZGxlckluZm9zKTsKLSAgICB9
Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIEludGVybmFsIGZ1bmN0aW9uIHVz
ZWQgdG8gY29uc3RydWN0IHRoZSBjaGFpbiBvZiBwcm9taXNlcyB1c2VkCi0gICAgICB0byB2YWxp
ZGF0ZSBhIHRyYW5zaXRpb24uIFdyYXBzIGNhbGxzIHRvIGBiZWZvcmVNb2RlbGAsIGBtb2RlbGAs
Ci0gICAgICBhbmQgYGFmdGVyTW9kZWxgIGluIHByb21pc2VzLCBhbmQgY2hlY2tzIGZvciByZWRp
cmVjdHMvYWJvcnRzCi0gICAgICBiZXR3ZWVuIGVhY2guCi0gICAgICovCi0gICAgZnVuY3Rpb24g
dmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9uLCBtYXRjaFBvaW50LCBoYW5kbGVyUGFyYW1zKSB7Ci0K
LSAgICAgIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9uLmhhbmRsZXJJbmZvcywKLSAgICAg
ICAgICBpbmRleCA9IHRyYW5zaXRpb24ucmVzb2x2ZUluZGV4OwotCi0gICAgICBpZiAoaW5kZXgg
PT09IGhhbmRsZXJJbmZvcy5sZW5ndGgpIHsKLSAgICAgICAgLy8gTm8gbW9yZSBjb250ZXh0cyB0
byByZXNvbHZlLgotICAgICAgICByZXR1cm4gUlNWUC5yZXNvbHZlKHRyYW5zaXRpb24ucmVzb2x2
ZWRNb2RlbHMpOwotICAgICAgfQotCi0gICAgICB2YXIgcm91dGVyID0gdHJhbnNpdGlvbi5yb3V0
ZXIsCi0gICAgICAgICAgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaW5kZXhdLAotICAgICAg
ICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyLAotICAgICAgICAgIGhhbmRsZXJOYW1l
ID0gaGFuZGxlckluZm8ubmFtZSwKLSAgICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNl
OwotCi0gICAgICBpZiAoaW5kZXggPCBtYXRjaFBvaW50KSB7Ci0gICAgICAgIGxvZyhyb3V0ZXIs
IHNlcSwgaGFuZGxlck5hbWUgKyAiOiB1c2luZyBjb250ZXh0IGZyb20gYWxyZWFkeS1hY3RpdmUg
aGFuZGxlciIpOwotCi0gICAgICAgIC8vIFdlJ3JlIGJlZm9yZSB0aGUgbWF0Y2ggcG9pbnQsIHNv
IGRvbid0IHJ1biBhbnkgaG9va3MsCi0gICAgICAgIC8vIGp1c3QgdXNlIHRoZSBhbHJlYWR5IHJl
c29sdmVkIGNvbnRleHQgZnJvbSB0aGUgaGFuZGxlci4KLSAgICAgICAgdHJhbnNpdGlvbi5yZXNv
bHZlZE1vZGVsc1toYW5kbGVySW5mby5uYW1lXSA9Ci0gICAgICAgICAgdHJhbnNpdGlvbi5wcm92
aWRlZE1vZGVsc1toYW5kbGVySW5mby5uYW1lXSB8fAotICAgICAgICAgIGhhbmRsZXJJbmZvLmhh
bmRsZXIuY29udGV4dDsKLSAgICAgICAgcmV0dXJuIHByb2NlZWQoKTsKLSAgICAgIH0KLQotICAg
ICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICd3aWxsUmVzb2x2ZU1vZGVsJywgdHJhbnNpdGlv
biwgaGFuZGxlcik7Ci0KLSAgICAgIHJldHVybiBSU1ZQLnJlc29sdmUoKS50aGVuKGhhbmRsZUFi
b3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYmVmb3JlTW9kZWwpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAudGhlbihoYW5kbGVBYm9ydCkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC50aGVuKG1vZGVsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRo
ZW4oaGFuZGxlQWJvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihhZnRlck1v
ZGVsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCBoYW5kbGVFcnJvcikKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC50aGVuKHByb2NlZWQpOwotCi0gICAgICBmdW5jdGlvbiBoYW5k
bGVBYm9ydChyZXN1bHQpIHsKLSAgICAgICAgaWYgKHRyYW5zaXRpb24uaXNBYm9ydGVkKSB7Ci0g
ICAgICAgICAgbG9nKHRyYW5zaXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiZGV0
ZWN0ZWQgYWJvcnQuIik7Ci0gICAgICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KG5ldyBSb3V0ZXIu
VHJhbnNpdGlvbkFib3J0ZWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgICAgfQotCi0gICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihyZWFzb24pIHsKLSAgICAg
ICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFJvdXRlci5UcmFuc2l0aW9uQWJvcnRlZCB8fCB0cmFu
c2l0aW9uLmlzQWJvcnRlZCkgewotICAgICAgICAgIC8vIGlmIHRoZSB0cmFuc2l0aW9uIHdhcyBh
Ym9ydGVkIGFuZCAqbm8gYWRkaXRpb25hbCogZXJyb3Igd2FzIHRocm93biwKLSAgICAgICAgICAv
LyByZWplY3Qgd2l0aCB0aGUgUm91dGVyLlRyYW5zaXRpb25BYm9ydGVkIGluc3RhbmNlCi0gICAg
ICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KHJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBvdGhlcndpc2UsIHdlJ3JlIGhlcmUgYmVjYXVzZSBvZiBhIGRpZmZlcmVudCBlcnJvcgotICAg
ICAgICB0cmFuc2l0aW9uLmFib3J0KCk7Ci0KLSAgICAgICAgbG9nKHJvdXRlciwgc2VxLCBoYW5k
bGVyTmFtZSArICI6IGhhbmRsaW5nIGVycm9yOiAiICsgcmVhc29uKTsKLQotICAgICAgICAvLyBB
biBlcnJvciB3YXMgdGhyb3duIC8gcHJvbWlzZSByZWplY3RlZCwgc28gZmlyZSBhbgotICAgICAg
ICAvLyBgZXJyb3JgIGV2ZW50IGZyb20gdGhpcyBoYW5kbGVyIGluZm8gdXAgdG8gcm9vdC4KLSAg
ICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICdlcnJvcicsIHJlYXNvbiwgdHJhbnNpdGlv
biwgaGFuZGxlckluZm8uaGFuZGxlcik7Ci0KLSAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBvcmln
aW5hbCBlcnJvci4KLSAgICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KHJlYXNvbik7Ci0gICAgICB9
Ci0KLSAgICAgIGZ1bmN0aW9uIGJlZm9yZU1vZGVsKCkgewotCi0gICAgICAgIGxvZyhyb3V0ZXIs
IHNlcSwgaGFuZGxlck5hbWUgKyAiOiBjYWxsaW5nIGJlZm9yZU1vZGVsIGhvb2siKTsKLQotICAg
ICAgICB2YXIgYXJnczsKLQotICAgICAgICBpZiAoaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpIHsK
LSAgICAgICAgICBhcmdzID0gW2hhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zLCB0cmFuc2l0aW9uXTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcmdzID0gW3RyYW5zaXRpb25dOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdmFyIHAgPSBoYW5kbGVyLmJlZm9yZU1vZGVsICYmIGhhbmRsZXIuYmVm
b3JlTW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7Ci0gICAgICAgIHJldHVybiAocCBpbnN0YW5j
ZW9mIFRyYW5zaXRpb24pID8gbnVsbCA6IHA7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIG1v
ZGVsKCkgewotICAgICAgICBsb2cocm91dGVyLCBzZXEsIGhhbmRsZXJOYW1lICsgIjogcmVzb2x2
aW5nIG1vZGVsIik7Ci0gICAgICAgIHZhciBwID0gZ2V0TW9kZWwoaGFuZGxlckluZm8sIHRyYW5z
aXRpb24sIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5hbWVdLCBpbmRleCA+PSBtYXRjaFBvaW50KTsK
LSAgICAgICAgcmV0dXJuIChwIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgPyBudWxsIDogcDsKLSAg
ICAgIH0KLQotICAgICAgZnVuY3Rpb24gYWZ0ZXJNb2RlbChjb250ZXh0KSB7Ci0KLSAgICAgICAg
bG9nKHJvdXRlciwgc2VxLCBoYW5kbGVyTmFtZSArICI6IGNhbGxpbmcgYWZ0ZXJNb2RlbCBob29r
Iik7Ci0KLSAgICAgICAgLy8gUGFzcyB0aGUgY29udGV4dCBhbmQgcmVzb2x2ZWQgcGFyZW50IGNv
bnRleHRzIHRvIGFmdGVyTW9kZWwsIGJ1dCB3ZSBkb24ndAotICAgICAgICAvLyB3YW50IHRvIHVz
ZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBgYWZ0ZXJNb2RlbGAgaW4gYW55IHdheSwgYnV0IHJh
dGhlcgotICAgICAgICAvLyBhbHdheXMgcmVzb2x2ZSB3aXRoIHRoZSBvcmlnaW5hbCBgY29udGV4
dGAgb2JqZWN0LgotCi0gICAgICAgIHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbaGFuZGxlcklu
Zm8ubmFtZV0gPSBjb250ZXh0OwotCi0gICAgICAgIHZhciBhcmdzOwotCi0gICAgICAgIGlmICho
YW5kbGVySW5mby5xdWVyeVBhcmFtcykgewotICAgICAgICAgIGFyZ3MgPSBbY29udGV4dCwgaGFu
ZGxlckluZm8ucXVlcnlQYXJhbXMsIHRyYW5zaXRpb25dOwotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgIGFyZ3MgPSBbY29udGV4dCwgdHJhbnNpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAg
ICB2YXIgcCA9IGhhbmRsZXIuYWZ0ZXJNb2RlbCAmJiBoYW5kbGVyLmFmdGVyTW9kZWwuYXBwbHko
aGFuZGxlciwgYXJncyk7Ci0gICAgICAgIHJldHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRpb24p
ID8gbnVsbCA6IHA7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIHByb2NlZWQoKSB7Ci0gICAg
ICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiB2YWxpZGF0aW9uIHN1Y2NlZWRl
ZCwgcHJvY2VlZGluZyIpOwotCi0gICAgICAgIGhhbmRsZXJJbmZvLmNvbnRleHQgPSB0cmFuc2l0
aW9uLnJlc29sdmVkTW9kZWxzW2hhbmRsZXJJbmZvLm5hbWVdOwotICAgICAgICB0cmFuc2l0aW9u
LnJlc29sdmVJbmRleCsrOwotICAgICAgICByZXR1cm4gdmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9u
LCBtYXRjaFBvaW50LCBoYW5kbGVyUGFyYW1zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioK
LSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRocm93cyBhIFRyYW5zaXRpb25BYm9ydGVkIGlmIHRo
ZSBwcm92aWRlZCB0cmFuc2l0aW9uIGhhcyBiZWVuIGFib3J0ZWQuCi0gICAgICovCi0gICAgZnVu
Y3Rpb24gY2hlY2tBYm9ydCh0cmFuc2l0aW9uKSB7Ci0gICAgICBpZiAodHJhbnNpdGlvbi5pc0Fi
b3J0ZWQpIHsKLSAgICAgICAgbG9nKHRyYW5zaXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVl
bmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7Ci0gICAgICAgIHRocm93IG5ldyBSb3V0ZXIuVHJhbnNp
dGlvbkFib3J0ZWQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRl
Ci0KLSAgICAgIEVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgZm9yIHdoZXRoZXIgdG8gY2FsbCBgbW9k
ZWxgIG9uIGEgcm91dGUsCi0gICAgICBvciB1c2Ugb25lIG9mIHRoZSBtb2RlbHMgcHJvdmlkZWQg
dG8gYHRyYW5zaXRpb25Ub2AuCi0gICAgICovCi0gICAgZnVuY3Rpb24gZ2V0TW9kZWwoaGFuZGxl
ckluZm8sIHRyYW5zaXRpb24sIGhhbmRsZXJQYXJhbXMsIG5lZWRzVXBkYXRlKSB7Ci0gICAgICB2
YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXIsCi0gICAgICAgICAgaGFuZGxlck5hbWUg
PSBoYW5kbGVySW5mby5uYW1lLCBhcmdzOwotCi0gICAgICBpZiAoIW5lZWRzVXBkYXRlICYmIGhh
bmRsZXIuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSkgewotICAgICAgICByZXR1cm4gaGFuZGxl
ci5jb250ZXh0OwotICAgICAgfQotCi0gICAgICBpZiAodHJhbnNpdGlvbi5wcm92aWRlZE1vZGVs
cy5oYXNPd25Qcm9wZXJ0eShoYW5kbGVyTmFtZSkpIHsKLSAgICAgICAgdmFyIHByb3ZpZGVkTW9k
ZWwgPSB0cmFuc2l0aW9uLnByb3ZpZGVkTW9kZWxzW2hhbmRsZXJOYW1lXTsKLSAgICAgICAgcmV0
dXJuIHR5cGVvZiBwcm92aWRlZE1vZGVsID09PSAnZnVuY3Rpb24nID8gcHJvdmlkZWRNb2RlbCgp
IDogcHJvdmlkZWRNb2RlbDsKLSAgICAgIH0KLQotICAgICAgaWYgKGhhbmRsZXJJbmZvLnF1ZXJ5
UGFyYW1zKSB7Ci0gICAgICAgIGFyZ3MgPSBbaGFuZGxlclBhcmFtcyB8fCB7fSwgaGFuZGxlcklu
Zm8ucXVlcnlQYXJhbXMsIHRyYW5zaXRpb25dOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJn
cyA9IFtoYW5kbGVyUGFyYW1zIHx8IHt9LCB0cmFuc2l0aW9uLCBoYW5kbGVySW5mby5xdWVyeVBh
cmFtc107Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBoYW5kbGVyLm1vZGVsICYmIGhhbmRsZXIu
bW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJp
dmF0ZQotICAgICAqLwotICAgIGZ1bmN0aW9uIGxvZyhyb3V0ZXIsIHNlcXVlbmNlLCBtc2cpIHsK
LQotICAgICAgaWYgKCFyb3V0ZXIubG9nKSB7IHJldHVybjsgfQotCi0gICAgICBpZiAoYXJndW1l
bnRzLmxlbmd0aCA9PT0gMykgewotICAgICAgICByb3V0ZXIubG9nKCJUcmFuc2l0aW9uICMiICsg
c2VxdWVuY2UgKyAiOiAiICsgbXNnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZyA9IHNl
cXVlbmNlOwotICAgICAgICByb3V0ZXIubG9nKG1zZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAg
LyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBCZWdpbnMgYW5kIHJldHVybnMgYSBUcmFuc2l0
aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZAotICAgICAgYXJndW1lbnRzLiBBY2NlcHRzIGFyZ3Vt
ZW50cyBpbiB0aGUgZm9ybSBvZiBib3RoIFVSTAotICAgICAgdHJhbnNpdGlvbnMgYW5kIG5hbWVk
IHRyYW5zaXRpb25zLgotCi0gICAgICBAcGFyYW0ge1JvdXRlcn0gcm91dGVyCi0gICAgICBAcGFy
YW0ge0FycmF5W09iamVjdF19IGFyZ3MgYXJndW1lbnRzIHBhc3NlZCB0byB0cmFuc2l0aW9uVG8s
Ci0gICAgICAgIHJlcGxhY2VXaXRoLCBvciBoYW5kbGVVUkwKLSAgICAqLwotICAgIGZ1bmN0aW9u
IGRvVHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3MsIGlzSW50ZXJtZWRpYXRlKSB7Ci0gICAgICAvLyBO
b3JtYWxpemUgYmxhbmsgdHJhbnNpdGlvbnMgdG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCi0gICAg
ICB2YXIgbmFtZSA9IGFyZ3NbMF0gfHwgJy8nOwotCi0gICAgICBpZihhcmdzLmxlbmd0aCA9PT0g
MSAmJiBhcmdzWzBdLmhhc093blByb3BlcnR5KCdxdWVyeVBhcmFtcycpKSB7Ci0gICAgICAgIHJl
dHVybiBjcmVhdGVRdWVyeVBhcmFtVHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3NbMF0sIGlzSW50ZXJt
ZWRpYXRlKTsKLSAgICAgIH0gZWxzZSBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgewotICAg
ICAgICByZXR1cm4gY3JlYXRlVVJMVHJhbnNpdGlvbihyb3V0ZXIsIG5hbWUsIGlzSW50ZXJtZWRp
YXRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVOYW1lZFRyYW5zaXRp
b24ocm91dGVyLCBzbGljZS5jYWxsKGFyZ3MpLCBpc0ludGVybWVkaWF0ZSk7Ci0gICAgICB9Ci0g
ICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBTZXJpYWxpemVzIGEgaGFu
ZGxlciB1c2luZyBpdHMgY3VzdG9tIGBzZXJpYWxpemVgIG1ldGhvZCBvcgotICAgICAgYnkgYSBk
ZWZhdWx0IHRoYXQgbG9va3MgdXAgdGhlIGV4cGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbQotICAg
ICAgdGhlIGR5bmFtaWMgc2VnbWVudC4KLQotICAgICAgQHBhcmFtIHtPYmplY3R9IGhhbmRsZXIg
YSByb3V0ZXIgaGFuZGxlcgotICAgICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCB0
byBiZSBzZXJpYWxpemVkIGZvciB0aGlzIGhhbmRsZXIKLSAgICAgIEBwYXJhbSB7QXJyYXlbT2Jq
ZWN0XX0gbmFtZXMgdGhlIG5hbWVzIGFycmF5IGF0dGFjaGVkIHRvIGFuCi0gICAgICAgIGhhbmRs
ZXIgb2JqZWN0IHJldHVybmVkIGZyb20gcm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IoKQot
ICAgICovCi0gICAgZnVuY3Rpb24gc2VyaWFsaXplKGhhbmRsZXIsIG1vZGVsLCBuYW1lcykgewot
Ci0gICAgICB2YXIgb2JqZWN0ID0ge307Ci0gICAgICBpZiAoaXNQYXJhbShtb2RlbCkpIHsKLSAg
ICAgICAgb2JqZWN0W25hbWVzWzBdXSA9IG1vZGVsOwotICAgICAgICByZXR1cm4gb2JqZWN0Owot
ICAgICAgfQotCi0gICAgICAvLyBVc2UgY3VzdG9tIHNlcmlhbGl6ZSBpZiBpdCBleGlzdHMuCi0g
ICAgICBpZiAoaGFuZGxlci5zZXJpYWxpemUpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2Vy
aWFsaXplKG1vZGVsLCBuYW1lcyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChuYW1lcy5sZW5ndGgg
IT09IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIHZhciBuYW1lID0gbmFtZXNbMF07Ci0KLSAgICAg
IGlmICgvX2lkJC8udGVzdChuYW1lKSkgewotICAgICAgICBvYmplY3RbbmFtZV0gPSBtb2RlbC5p
ZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG9iamVjdFtuYW1lXSA9IG1vZGVsOwotICAgICAg
fQotICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0gIH0pOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcK
LSovCi0KLWZ1bmN0aW9uIERTTChuYW1lKSB7Ci0gIHRoaXMucGFyZW50ID0gbmFtZTsKLSAgdGhp
cy5tYXRjaGVzID0gW107Ci19Ci0KLURTTC5wcm90b3R5cGUgPSB7Ci0gIHJlc291cmNlOiBmdW5j
dGlvbihuYW1lLCBvcHRpb25zLCBjYWxsYmFjaykgewotICAgIGlmIChhcmd1bWVudHMubGVuZ3Ro
ID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7Ci0gICAgICBjYWxsYmFj
ayA9IG9wdGlvbnM7Ci0gICAgICBvcHRpb25zID0ge307Ci0gICAgfQotCi0gICAgaWYgKGFyZ3Vt
ZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIG9wdGlvbnMgPSB7fTsKLSAgICB9Ci0KLSAgICBp
ZiAodHlwZW9mIG9wdGlvbnMucGF0aCAhPT0gJ3N0cmluZycpIHsKLSAgICAgIG9wdGlvbnMucGF0
aCA9ICIvIiArIG5hbWU7Ci0gICAgfQotCi0gICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICB2YXIg
ZHNsID0gbmV3IERTTChuYW1lKTsKLSAgICAgIHJvdXRlKGRzbCwgJ2xvYWRpbmcnKTsKLSAgICAg
IHJvdXRlKGRzbCwgJ2Vycm9yJywgeyBwYXRoOiAiL191bnVzZWRfZHVtbXlfZXJyb3JfcGF0aF9y
b3V0ZV8iICsgbmFtZSArICIvOmVycm9yIiB9KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsK
LSAgICAgIHRoaXMucHVzaChvcHRpb25zLnBhdGgsIG5hbWUsIGRzbC5nZW5lcmF0ZSgpLCBvcHRp
b25zLnF1ZXJ5UGFyYW1zKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5wdXNoKG9wdGlvbnMu
cGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9ucy5xdWVyeVBhcmFtcyk7Ci0gICAgfQotCi0KLSAgICAg
IH0sCi0KLSAgcHVzaDogZnVuY3Rpb24odXJsLCBuYW1lLCBjYWxsYmFjaywgcXVlcnlQYXJhbXMp
IHsKLSAgICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7Ci0gICAgaWYgKHVybCA9PT0gIiIg
fHwgdXJsID09PSAiLyIgfHwgcGFydHNbcGFydHMubGVuZ3RoLTFdID09PSAiaW5kZXgiKSB7IHRo
aXMuZXhwbGljaXRJbmRleCA9IHRydWU7IH0KLQotICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmws
IG5hbWUsIGNhbGxiYWNrLCBxdWVyeVBhcmFtc10pOwotICB9LAotCi0gIHJvdXRlOiBmdW5jdGlv
bihuYW1lLCBvcHRpb25zKSB7Ci0gICAgcm91dGUodGhpcywgbmFtZSwgb3B0aW9ucyk7Ci0gICAg
ICB9LAotCi0gIGdlbmVyYXRlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgZHNsTWF0Y2hlcyA9IHRo
aXMubWF0Y2hlczsKLQotICAgIGlmICghdGhpcy5leHBsaWNpdEluZGV4KSB7Ci0gICAgICB0aGlz
LnJvdXRlKCJpbmRleCIsIHsgcGF0aDogIi8iIH0pOwotICAgIH0KLQotICAgIHJldHVybiBmdW5j
dGlvbihtYXRjaCkgewotICAgICAgZm9yICh2YXIgaT0wLCBsPWRzbE1hdGNoZXMubGVuZ3RoOyBp
PGw7IGkrKykgewotICAgICAgICB2YXIgZHNsTWF0Y2ggPSBkc2xNYXRjaGVzW2ldOwotICAgICAg
ICB2YXIgbWF0Y2hPYmogPSBtYXRjaChkc2xNYXRjaFswXSkudG8oZHNsTWF0Y2hbMV0sIGRzbE1h
dGNoWzJdKTsKLSAgICAgICAgICAgICAgfQotICAgIH07Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIHJv
dXRlKGRzbCwgbmFtZSwgb3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBg
dGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nKTsK
LQotICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICBpZiAodHlwZW9mIG9wdGlvbnMucGF0
aCAhPT0gJ3N0cmluZycpIHsKLSAgICBvcHRpb25zLnBhdGggPSAiLyIgKyBuYW1lOwotICB9Ci0K
LSAgaWYgKGRzbC5wYXJlbnQgJiYgZHNsLnBhcmVudCAhPT0gJ2FwcGxpY2F0aW9uJykgewotICAg
IG5hbWUgPSBkc2wucGFyZW50ICsgIi4iICsgbmFtZTsKLSAgfQotCi0gIGRzbC5wdXNoKG9wdGlv
bnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9ucy5xdWVyeVBhcmFtcyk7Ci19Ci0KLURTTC5tYXAg
PSBmdW5jdGlvbihjYWxsYmFjaykgewotICB2YXIgZHNsID0gbmV3IERTTCgpOwotICBjYWxsYmFj
ay5jYWxsKGRzbCk7Ci0gIHJldHVybiBkc2w7Ci19OwotCi1FbWJlci5Sb3V0ZXJEU0wgPSBEU0w7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0OwotCi0v
KioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotKi8KLQotLyoqCi0K
LSAgRmluZHMgYSBjb250cm9sbGVyIGluc3RhbmNlLgotCi0gIEBmb3IgRW1iZXIKLSAgQG1ldGhv
ZCBjb250cm9sbGVyRm9yCi0gIEBwcml2YXRlCi0qLwotRW1iZXIuY29udHJvbGxlckZvciA9IGZ1
bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlvbnMpIHsKLSAgcmV0
dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lLCBsb29r
dXBPcHRpb25zKTsKLX07Ci0KLS8qKgotICBHZW5lcmF0ZXMgYSBjb250cm9sbGVyIGZhY3RvcnkK
LQotICBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRyb2xsZXIgZmFjdG9yeSBpcyBkZXJp
dmVkCi0gIGZyb20gdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IGFuIGFy
cmF5IGNvbnRyb2xsZXIKLSAgaXMgZ2VuZXJhdGVkLCBpZiBhbiBvYmplY3QsIGFuIG9iamVjdCBj
b250cm9sbGVyIG90aGVyd2lzZSwgYSBiYXNpYwotICBjb250cm9sbGVyIGlzIGdlbmVyYXRlZC4K
LQotICBZb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIGdlbmVyYXRlZCBjb250cm9sbGVycyBieSBkZWZp
bmluZwotICBgQXBwLk9iamVjdENvbnRyb2xsZXJgIG9yIGBBcHAuQXJyYXlDb250cm9sbGVyYC4K
LQotICBAZm9yIEVtYmVyCi0gIEBtZXRob2QgZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeQotICBA
cHJpdmF0ZQotKi8KLUVtYmVyLmdlbmVyYXRlQ29udHJvbGxlckZhY3RvcnkgPSBmdW5jdGlvbihj
b250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KSB7Ci0gIHZhciBGYWN0b3J5LCBmdWxs
TmFtZSwgaW5zdGFuY2UsIG5hbWUsIGZhY3RvcnlOYW1lLCBjb250cm9sbGVyVHlwZTsKLQotICBp
ZiAoY29udGV4dCAmJiBFbWJlci5pc0FycmF5KGNvbnRleHQpKSB7Ci0gICAgY29udHJvbGxlclR5
cGUgPSAnYXJyYXknOwotICB9IGVsc2UgaWYgKGNvbnRleHQpIHsKLSAgICBjb250cm9sbGVyVHlw
ZSA9ICdvYmplY3QnOwotICB9IGVsc2UgewotICAgIGNvbnRyb2xsZXJUeXBlID0gJ2Jhc2ljJzsK
LSAgfQotCi0gIGZhY3RvcnlOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJUeXBlOwot
Ci0gIEZhY3RvcnkgPSBjb250YWluZXIubG9va3VwRmFjdG9yeShmYWN0b3J5TmFtZSkuZXh0ZW5k
KHsKLSAgICBpc0dlbmVyYXRlZDogdHJ1ZSwKLSAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gIihnZW5lcmF0ZWQgIiArIGNvbnRyb2xsZXJOYW1lICsgIiBjb250cm9sbGVy
KSI7Ci0gICAgfQotICB9KTsKLQotICBmdWxsTmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9s
bGVyTmFtZTsKLQotICBjb250YWluZXIucmVnaXN0ZXIoZnVsbE5hbWUsICBGYWN0b3J5KTsKLQot
ICByZXR1cm4gRmFjdG9yeTsKLX07Ci0KLS8qKgotICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRl
cyBhIGNvbnRyb2xsZXIuCi0KLSAgVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVy
IGZhY3RvcnkgaXMgZGVyaXZlZAotICBmcm9tIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBp
cyBhbiBhcnJheSBhbiBhcnJheSBjb250cm9sbGVyCi0gIGlzIGdlbmVyYXRlZCwgaWYgYW4gb2Jq
ZWN0LCBhbiBvYmplY3QgY29udHJvbGxlciBvdGhlcndpc2UsIGEgYmFzaWMKLSAgY29udHJvbGxl
ciBpcyBnZW5lcmF0ZWQuCi0KLSAgQGZvciBFbWJlcgotICBAbWV0aG9kIGdlbmVyYXRlQ29udHJv
bGxlcgotICBAcHJpdmF0ZQotKi8KLUVtYmVyLmdlbmVyYXRlQ29udHJvbGxlciA9IGZ1bmN0aW9u
KGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpIHsKLSAgRW1iZXIuZ2VuZXJhdGVD
b250cm9sbGVyRmFjdG9yeShjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KTsKLSAg
dmFyIGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOwotICB2YXIgaW5z
dGFuY2UgPSBjb250YWluZXIubG9va3VwKGZ1bGxOYW1lKTsKLQotICBpZiAoZ2V0KGluc3RhbmNl
LCAnbmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7Ci0gICAgRW1iZXIuTG9nZ2Vy
LmluZm8oImdlbmVyYXRlZCAtPiAiICsgZnVsbE5hbWUsIHsgZnVsbE5hbWU6IGZ1bGxOYW1lIH0p
OwotICB9Ci0KLSAgcmV0dXJuIGluc3RhbmNlOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlv
bigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwot
Ci12YXIgUm91dGVyID0gcmVxdWlyZU1vZHVsZSgicm91dGVyIilbJ2RlZmF1bHQnXTsKLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBkZWZpbmVQcm9wZXJ0eSA9IEVt
YmVyLmRlZmluZVByb3BlcnR5OwotdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwot
Ci12YXIgRGVmYXVsdFZpZXcgPSBFbWJlci5fTWV0YW1vcnBoVmlldzsKLS8qKgotICBUaGUgYEVt
YmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0aGUgYXBwbGljYXRpb24gc3RhdGUgYW5kIFVSTHMu
IFJlZmVyIHRvCi0gIHRoZSBbcm91dGluZyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRl
cy9yb3V0aW5nLykgZm9yIGRvY3VtZW50YXRpb24uCi0KLSAgQGNsYXNzIFJvdXRlcgotICBAbmFt
ZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLlJvdXRlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgewotICAvKioKLSAgICBUaGUgYGxv
Y2F0aW9uYCBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIFVSTCdzIHRoYXQgeW91cgot
ICAgIGFwcGxpY2F0aW9uIHdpbGwgdXNlLgotCi0gICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbiB0
eXBlcyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZToKLQotICAgICogYGhhc2hgCi0gICAgKiBgaGlz
dG9yeWAKLSAgICAqIGBub25lYAotCi0gICAgQHByb3BlcnR5IGxvY2F0aW9uCi0gICAgQGRlZmF1
bHQgJ2hhc2gnCi0gICAgQHNlZSB7RW1iZXIuTG9jYXRpb259Ci0gICovCi0gIGxvY2F0aW9uOiAn
aGFzaCcsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yb3V0ZXIgPSB0aGlzLmNv
bnN0cnVjdG9yLnJvdXRlciB8fCB0aGlzLmNvbnN0cnVjdG9yLm1hcChFbWJlci5LKTsKLSAgICB0
aGlzLl9hY3RpdmVWaWV3cyA9IHt9OwotICAgIHRoaXMuX3NldHVwTG9jYXRpb24oKTsKLQotICAg
IGlmIChnZXQodGhpcywgJ25hbWVzcGFjZS5MT0dfVFJBTlNJVElPTlNfSU5URVJOQUwnKSkgewot
ICAgICAgdGhpcy5yb3V0ZXIubG9nID0gRW1iZXIuTG9nZ2VyLmRlYnVnOwotICAgIH0KLSAgfSwK
LQotICAvKioKLSAgICBSZXByZXNlbnRzIHRoZSBjdXJyZW50IFVSTC4KLQotICAgIEBtZXRob2Qg
dXJsCi0gICAgQHJldHVybnMge1N0cmluZ30gVGhlIGN1cnJlbnQgVVJMLgotICAqLwotICB1cmw6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0
aW9uJykuZ2V0VVJMKCk7Ci0gIH0pLAotCi0gIC8qKgotICAgIEluaXRpYWxpemVzIHRoZSBjdXJy
ZW50IHJvdXRlciBpbnN0YW5jZSBhbmQgc2V0cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCi0gICAg
ZXZlbnQgbGlzdGVuZXJzIHVzZWQgYnkgdGhlIGluc3RhbmNlcyBgbG9jYXRpb25gIGltcGxlbWVu
dGF0aW9uLgotCi0gICAgQG1ldGhvZCBzdGFydFJvdXRpbmcKLSAgICBAcHJpdmF0ZQotICAqLwot
ICBzdGFydFJvdXRpbmc6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucm91dGVyID0gdGhpcy5yb3V0
ZXIgfHwgdGhpcy5jb25zdHJ1Y3Rvci5tYXAoRW1iZXIuSyk7Ci0KLSAgICB2YXIgcm91dGVyID0g
dGhpcy5yb3V0ZXIsCi0gICAgICAgIGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAot
ICAgICAgICBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKLSAgICAgICAgc2VsZiA9IHRoaXM7
Ci0KLSAgICB0aGlzLl9zZXR1cFJvdXRlcihyb3V0ZXIsIGxvY2F0aW9uKTsKLQotICAgIGNvbnRh
aW5lci5yZWdpc3RlcigndmlldzpkZWZhdWx0JywgRGVmYXVsdFZpZXcpOwotICAgIGNvbnRhaW5l
ci5yZWdpc3Rlcigndmlldzp0b3BsZXZlbCcsIEVtYmVyLlZpZXcuZXh0ZW5kKCkpOwotCi0gICAg
bG9jYXRpb24ub25VcGRhdGVVUkwoZnVuY3Rpb24odXJsKSB7Ci0gICAgICBzZWxmLmhhbmRsZVVS
TCh1cmwpOwotICAgIH0pOwotCi0gICAgdGhpcy5oYW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkp
OwotICB9LAotCi0gIC8qKgotICAgIEhhbmRsZXMgdXBkYXRpbmcgdGhlIHBhdGhzIGFuZCBub3Rp
ZnlpbmcgYW55IGxpc3RlbmVycyBvZiB0aGUgVVJMCi0gICAgY2hhbmdlLgotCi0gICAgVHJpZ2dl
cnMgdGhlIHJvdXRlciBsZXZlbCBgZGlkVHJhbnNpdGlvbmAgaG9vay4KLQotICAgIEBtZXRob2Qg
ZGlkVHJhbnNpdGlvbgotICAgIEBwcml2YXRlCi0gICovCi0gIGRpZFRyYW5zaXRpb246IGZ1bmN0
aW9uKGluZm9zKSB7Ci0gICAgdXBkYXRlUGF0aHModGhpcyk7Ci0KLSAgICB0aGlzLl9jYW5jZWxM
b2FkaW5nRXZlbnQoKTsKLQotICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3VybCcpOwot
Ci0gICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1bmxvb3Agc28gdXJsIHdpbGwgYmUgYWNjdXJhdGUu
IFNlZW1zCi0gICAgLy8gbGVzcyBzdXJwcmlzaW5nIHRoYW4gZGlkVHJhbnNpdGlvbiBiZWluZyBv
dXQgb2Ygc3luYy4KLSAgICBFbWJlci5ydW4ub25jZSh0aGlzLCB0aGlzLnRyaWdnZXIsICdkaWRU
cmFuc2l0aW9uJyk7Ci0KLSAgICBpZiAoZ2V0KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJ
VElPTlMpIHsKLSAgICAgIEVtYmVyLkxvZ2dlci5sb2coIlRyYW5zaXRpb25lZCBpbnRvICciICsg
RW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgIiciKTsKLSAgICB9Ci0gIH0sCi0KLSAg
aGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICByZXR1cm4gdGhpcy5fZG9UcmFuc2l0aW9u
KCdoYW5kbGVVUkwnLCBbdXJsXSk7Ci0gIH0sCi0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gdGhpcy5fZG9UcmFuc2l0aW9uKCd0cmFuc2l0aW9uVG8nLCBhcmd1bWVu
dHMpOwotICB9LAotCi0gIGludGVybWVkaWF0ZVRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7Ci0g
ICAgdGhpcy5yb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHRoaXMucm91dGVy
LCBhcmd1bWVudHMpOwotCi0gICAgdXBkYXRlUGF0aHModGhpcyk7Ci0KLSAgICB2YXIgaW5mb3Mg
PSB0aGlzLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zOwotICAgIGlmIChnZXQodGhpcywgJ25h
bWVzcGFjZScpLkxPR19UUkFOU0lUSU9OUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmxvZygiSW50
ZXJtZWRpYXRlLXRyYW5zaXRpb25lZCBpbnRvICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgo
aW5mb3MpICsgIiciKTsKLSAgICB9Ci0gIH0sCi0KLSAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiB0aGlzLl9kb1RyYW5zaXRpb24oJ3JlcGxhY2VXaXRoJywgYXJndW1lbnRz
KTsKLSAgfSwKLQotICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHVybCA9IHRoaXMu
cm91dGVyLmdlbmVyYXRlLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOwotICAgIHJldHVy
biB0aGlzLmxvY2F0aW9uLmZvcm1hdFVSTCh1cmwpOwotICB9LAotCi0gIC8qKgotICAgIERldGVy
bWluZXMgaWYgdGhlIHN1cHBsaWVkIHJvdXRlIGlzIGN1cnJlbnRseSBhY3RpdmUuCi0KLSAgICBA
bWV0aG9kIGlzQWN0aXZlCi0gICAgQHBhcmFtIHJvdXRlTmFtZQotICAgIEByZXR1cm5zIHtCb29s
ZWFufQotICAgIEBwcml2YXRlCi0gICovCi0gIGlzQWN0aXZlOiBmdW5jdGlvbihyb3V0ZU5hbWUp
IHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7Ci0gICAgcmV0dXJuIHJvdXRlci5pc0Fj
dGl2ZS5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgc2VuZDogZnVuY3Rpb24o
bmFtZSwgY29udGV4dCkgewotICAgIHRoaXMucm91dGVyLnRyaWdnZXIuYXBwbHkodGhpcy5yb3V0
ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRG9lcyB0aGlzIHJvdXRlciBpbnN0
YW5jZSBoYXZlIHRoZSBnaXZlbiByb3V0ZS4KLQotICAgIEBtZXRob2QgaGFzUm91dGUKLSAgICBA
cmV0dXJucyB7Qm9vbGVhbn0KLSAgICBAcHJpdmF0ZQotICAqLwotICBoYXNSb3V0ZTogZnVuY3Rp
b24ocm91dGUpIHsKLSAgICByZXR1cm4gdGhpcy5yb3V0ZXIuaGFzUm91dGUocm91dGUpOwotICB9
LAotCi0gIC8qKgotICAgIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIHJvdXRlciBieSBjbGVhcmlu
ZyB0aGUgY3VycmVudCByb3V0ZQotICAgIGhhbmRsZXJzIGFuZCBkZWFjdGl2YXRpbmcgdGhlbS4K
LQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCByZXNldAotICAgKi8KLSAgcmVzZXQ6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMucm91dGVyLnJlc2V0KCk7Ci0gIH0sCi0KLSAgd2lsbERlc3Ryb3k6
IGZ1bmN0aW9uKCl7Ci0gICAgdmFyIGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpOwot
ICAgIGxvY2F0aW9uLmRlc3Ryb3koKTsKLQotICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7Ci0gIH0sCi0KLSAgX2xvb2t1cEFjdGl2ZVZpZXc6IGZ1bmN0aW9uKHRlbXBsYXRl
TmFtZSkgewotICAgIHZhciBhY3RpdmUgPSB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVd
OwotICAgIHJldHVybiBhY3RpdmUgJiYgYWN0aXZlWzBdOwotICB9LAotCi0gIF9jb25uZWN0QWN0
aXZlVmlldzogZnVuY3Rpb24odGVtcGxhdGVOYW1lLCB2aWV3KSB7Ci0gICAgdmFyIGV4aXN0aW5n
ID0gdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxhdGVOYW1lXTsKLQotICAgIGlmIChleGlzdGluZykg
ewotICAgICAgZXhpc3RpbmdbMF0ub2ZmKCd3aWxsRGVzdHJveUVsZW1lbnQnLCB0aGlzLCBleGlz
dGluZ1sxXSk7Ci0gICAgfQotCi0gICAgdmFyIGRpc2Nvbm5lY3QgPSBmdW5jdGlvbigpIHsKLSAg
ICAgIGRlbGV0ZSB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdOwotICAgIH07Ci0KLSAg
ICB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdID0gW3ZpZXcsIGRpc2Nvbm5lY3RdOwot
ICAgIHZpZXcub25lKCd3aWxsRGVzdHJveUVsZW1lbnQnLCB0aGlzLCBkaXNjb25uZWN0KTsKLSAg
fSwKLQotICBfc2V0dXBMb2NhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxvY2F0aW9uID0g
Z2V0KHRoaXMsICdsb2NhdGlvbicpLAotICAgICAgICByb290VVJMID0gZ2V0KHRoaXMsICdyb290
VVJMJyksCi0gICAgICAgIG9wdGlvbnMgPSB7fTsKLQotICAgIGlmICh0eXBlb2Ygcm9vdFVSTCA9
PT0gJ3N0cmluZycpIHsKLSAgICAgIG9wdGlvbnMucm9vdFVSTCA9IHJvb3RVUkw7Ci0gICAgfQot
Ci0gICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgbG9jYXRpb24pIHsKLSAgICAgIG9wdGlvbnMu
aW1wbGVtZW50YXRpb24gPSBsb2NhdGlvbjsKLSAgICAgIGxvY2F0aW9uID0gc2V0KHRoaXMsICds
b2NhdGlvbicsIEVtYmVyLkxvY2F0aW9uLmNyZWF0ZShvcHRpb25zKSk7Ci0gICAgfQotCi0gICAg
Ly8gZW5zdXJlIHRoYXQgaW5pdFN0YXRlIGlzIGNhbGxlZCBBRlRFUiB0aGUgcm9vdFVSTCBpcyBz
ZXQgb24KLSAgICAvLyB0aGUgbG9jYXRpb24gaW5zdGFuY2UKLSAgICBpZiAodHlwZW9mIGxvY2F0
aW9uLmluaXRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykgeyBsb2NhdGlvbi5pbml0U3RhdGUoKTsgfQot
ICB9LAotCi0gIF9nZXRIYW5kbGVyRnVuY3Rpb246IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWVu
ID0ge30sIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLAotICAgICAgICBEZWZhdWx0Um91dGUg
PSBjb250YWluZXIubG9va3VwRmFjdG9yeSgncm91dGU6YmFzaWMnKSwKLSAgICAgICAgc2VsZiA9
IHRoaXM7Ci0KLSAgICByZXR1cm4gZnVuY3Rpb24obmFtZSkgewotICAgICAgdmFyIHJvdXRlTmFt
ZSA9ICdyb3V0ZTonICsgbmFtZSwKLSAgICAgICAgICBoYW5kbGVyID0gY29udGFpbmVyLmxvb2t1
cChyb3V0ZU5hbWUpOwotCi0gICAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1cm4gaGFuZGxlcjsg
fQotCi0gICAgICBzZWVuW25hbWVdID0gdHJ1ZTsKLQotICAgICAgaWYgKCFoYW5kbGVyKSB7Ci0g
ICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihyb3V0ZU5hbWUsIERlZmF1bHRSb3V0ZS5leHRlbmQo
KSk7Ci0gICAgICAgIGhhbmRsZXIgPSBjb250YWluZXIubG9va3VwKHJvdXRlTmFtZSk7Ci0KLSAg
ICAgICAgaWYgKGdldChzZWxmLCAnbmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7
Ci0gICAgICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oImdlbmVyYXRlZCAtPiAiICsgcm91dGVOYW1l
LCB7IGZ1bGxOYW1lOiByb3V0ZU5hbWUgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAg
aGFuZGxlci5yb3V0ZU5hbWUgPSBuYW1lOwotICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfTsK
LSAgfSwKLQotICBfc2V0dXBSb3V0ZXI6IGZ1bmN0aW9uKHJvdXRlciwgbG9jYXRpb24pIHsKLSAg
ICB2YXIgbGFzdFVSTCwgZW1iZXJSb3V0ZXIgPSB0aGlzOwotCi0gICAgcm91dGVyLmdldEhhbmRs
ZXIgPSB0aGlzLl9nZXRIYW5kbGVyRnVuY3Rpb24oKTsKLQotICAgIHZhciBkb1VwZGF0ZVVSTCA9
IGZ1bmN0aW9uKCkgewotICAgICAgbG9jYXRpb24uc2V0VVJMKGxhc3RVUkwpOwotICAgIH07Ci0K
LSAgICByb3V0ZXIudXBkYXRlVVJMID0gZnVuY3Rpb24ocGF0aCkgewotICAgICAgbGFzdFVSTCA9
IHBhdGg7Ci0gICAgICBFbWJlci5ydW4ub25jZShkb1VwZGF0ZVVSTCk7Ci0gICAgfTsKLQotICAg
IGlmIChsb2NhdGlvbi5yZXBsYWNlVVJMKSB7Ci0gICAgICB2YXIgZG9SZXBsYWNlVVJMID0gZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIGxvY2F0aW9uLnJlcGxhY2VVUkwobGFzdFVSTCk7Ci0gICAgICB9
OwotCi0gICAgICByb3V0ZXIucmVwbGFjZVVSTCA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAgICAg
bGFzdFVSTCA9IHBhdGg7Ci0gICAgICAgIEVtYmVyLnJ1bi5vbmNlKGRvUmVwbGFjZVVSTCk7Ci0g
ICAgICB9OwotICAgIH0KLQotICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24oaW5m
b3MpIHsKLSAgICAgIGVtYmVyUm91dGVyLmRpZFRyYW5zaXRpb24oaW5mb3MpOwotICAgIH07Ci0g
IH0sCi0KLSAgX2RvVHJhbnNpdGlvbjogZnVuY3Rpb24obWV0aG9kLCBhcmdzKSB7Ci0gICAgLy8g
Tm9ybWFsaXplIGJsYW5rIHJvdXRlIHRvIHJvb3QgVVJMLgotICAgIGFyZ3MgPSBzbGljZS5jYWxs
KGFyZ3MpOwotICAgIGFyZ3NbMF0gPSBhcmdzWzBdIHx8ICcvJzsKLQotICAgIHZhciBwYXNzZWRO
YW1lID0gYXJnc1swXSwgbmFtZSwgc2VsZiA9IHRoaXMsCi0gICAgICBpc1F1ZXJ5UGFyYW1zT25s
eSA9IGZhbHNlOwotCi0gICAgCi0gICAgaWYgKCFpc1F1ZXJ5UGFyYW1zT25seSAmJiBwYXNzZWRO
YW1lLmNoYXJBdCgwKSA9PT0gJy8nKSB7Ci0gICAgICBuYW1lID0gcGFzc2VkTmFtZTsKLSAgICB9
IGVsc2UgaWYgKCFpc1F1ZXJ5UGFyYW1zT25seSkgewotICAgICAgaWYgKCF0aGlzLnJvdXRlci5o
YXNSb3V0ZShwYXNzZWROYW1lKSkgewotICAgICAgICBuYW1lID0gYXJnc1swXSA9IHBhc3NlZE5h
bWUgKyAnLmluZGV4JzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5hbWUgPSBwYXNzZWROYW1l
OwotICAgICAgfQotCi0gICAgICBFbWJlci5hc3NlcnQoIlRoZSByb3V0ZSAiICsgcGFzc2VkTmFt
ZSArICIgd2FzIG5vdCBmb3VuZCIsIHRoaXMucm91dGVyLmhhc1JvdXRlKG5hbWUpKTsKLSAgICB9
Ci0KLSAgICB2YXIgdHJhbnNpdGlvblByb21pc2UgPSB0aGlzLnJvdXRlclttZXRob2RdLmFwcGx5
KHRoaXMucm91dGVyLCBhcmdzKTsKLQotICAgIHRyYW5zaXRpb25Qcm9taXNlLnRoZW4obnVsbCwg
ZnVuY3Rpb24oZXJyb3IpIHsKLSAgICAgIGlmIChlcnJvci5uYW1lID09PSAiVW5yZWNvZ25pemVk
VVJMRXJyb3IiKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiVGhlIFVSTCAnIiArIGVycm9yLm1l
c3NhZ2UgKyAiJyBkaWQgbm90IG1hdGNoIGFueSByb3V0ZXMgaW4geW91ciBhcHBsaWNhdGlvbiIp
OwotICAgICAgfQotICAgIH0sICdFbWJlcjogQ2hlY2sgZm9yIFJvdXRlciB1bnJlY29nbml6ZWQg
VVJMIGVycm9yJyk7Ci0KLSAgICAvLyBXZSB3YW50IHRvIHJldHVybiB0aGUgY29uZmlndXJhYmxl
IHByb21pc2Ugb2JqZWN0Ci0gICAgLy8gc28gdGhhdCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24g
Y2FuIHVzZSBgLm1ldGhvZCgpYCBvbiBpdCwKLSAgICAvLyB3aGljaCBvYnZpb3VzbHkgZG9lc24n
dCBleGlzdCBmb3Igbm9ybWFsIFJTVlAgcHJvbWlzZXMuCi0gICAgcmV0dXJuIHRyYW5zaXRpb25Q
cm9taXNlOwotICB9LAotCi0gIF9zY2hlZHVsZUxvYWRpbmdFdmVudDogZnVuY3Rpb24odHJhbnNp
dGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKLSAg
ICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9IEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JvdXRl
clRyYW5zaXRpb25zJywgdGhpcywgJ19maXJlTG9hZGluZ0V2ZW50JywgdHJhbnNpdGlvbiwgb3Jp
Z2luUm91dGUpOwotICB9LAotCi0gIF9maXJlTG9hZGluZ0V2ZW50OiBmdW5jdGlvbih0cmFuc2l0
aW9uLCBvcmlnaW5Sb3V0ZSkgewotICAgIGlmICghdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlv
bikgewotICAgICAgLy8gRG9uJ3QgZmlyZSBhbiBldmVudCBpZiB3ZSd2ZSBzaW5jZSBtb3ZlZCBv
biBmcm9tCi0gICAgICAvLyB0aGUgdHJhbnNpdGlvbiB0aGF0IHB1dCB1cyBpbiBhIGxvYWRpbmcg
c3RhdGUuCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRy
dWUsICdsb2FkaW5nJywgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAotCi0gIF9jYW5j
ZWxMb2FkaW5nRXZlbnQ6IGZ1bmN0aW9uICgpIHsKLSAgICBpZiAodGhpcy5fbG9hZGluZ1N0YXRl
VGltZXIpIHsKLSAgICAgIEVtYmVyLnJ1bi5jYW5jZWwodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIp
OwotICAgIH0KLSAgICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9IG51bGw7Ci0gIH0KLX0pOwot
Ci0vKioKLSAgSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgcm9vdC13YXJkLCBzdGFydGlu
ZwotICBmcm9tIChidXQgbm90IGluY2x1ZGluZykgdGhlIHByb3ZpZGVkIGBvcmlnaW5Sb3V0ZWAu
Ci0KLSAgUmV0dXJucyB0cnVlIGlmIHRoZSBsYXN0IGNhbGxiYWNrIGZpcmVkIHJlcXVlc3RlZAot
ICB0byBidWJibGUgdXB3YXJkLgotCi0gIEBwcml2YXRlCi0gKi8KLWZ1bmN0aW9uIGZvckVhY2hS
b3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBjYWxsYmFjaykgewotICB2YXIgaGFu
ZGxlckluZm9zID0gdHJhbnNpdGlvbi5oYW5kbGVySW5mb3MsCi0gICAgICBvcmlnaW5Sb3V0ZUZv
dW5kID0gZmFsc2U7Ci0KLSAgZm9yICh2YXIgaSA9IGhhbmRsZXJJbmZvcy5sZW5ndGggLSAxOyBp
ID49IDA7IC0taSkgewotICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAg
ICAgICAgcm91dGUgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAgaWYgKCFvcmlnaW5Sb3V0
ZUZvdW5kKSB7Ci0gICAgICBpZiAob3JpZ2luUm91dGUgPT09IHJvdXRlKSB7Ci0gICAgICAgIG9y
aWdpblJvdXRlRm91bmQgPSB0cnVlOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQot
Ci0gICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBoYW5kbGVySW5mb3NbaSArIDFdLmhhbmRsZXIpICE9
PSB0cnVlKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVl
OwotfQotCi0vLyBUaGVzZSBnZXQgaW52b2tlZCB3aGVuIGFuIGFjdGlvbiBidWJibGVzIGFib3Zl
IEFwcGxpY2F0aW9uUm91dGUKLS8vIGFuZCBhcmUgbm90IG1lYW50IHRvIGJlIG92ZXJyaWRhYmxl
LgotdmFyIGRlZmF1bHRBY3Rpb25IYW5kbGVycyA9IHsKLQotICB3aWxsUmVzb2x2ZU1vZGVsOiBm
dW5jdGlvbih0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgewotICAgIG9yaWdpblJvdXRlLnJvdXRl
ci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAot
Ci0gIGVycm9yOiBmdW5jdGlvbihlcnJvciwgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAg
ICAvLyBBdHRlbXB0IHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igc3Vic3RhdGUgdG8gZW50
ZXIuCi0gICAgdmFyIHJvdXRlciA9IG9yaWdpblJvdXRlLnJvdXRlcjsKLQotICAgIHZhciB0cnlU
b3BMZXZlbCA9IGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBmdW5j
dGlvbihyb3V0ZSwgY2hpbGRSb3V0ZSkgewotICAgICAgdmFyIGNoaWxkRXJyb3JSb3V0ZU5hbWUg
PSBmaW5kQ2hpbGRSb3V0ZU5hbWUocm91dGUsIGNoaWxkUm91dGUsICdlcnJvcicpOwotICAgICAg
aWYgKGNoaWxkRXJyb3JSb3V0ZU5hbWUpIHsKLSAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRy
YW5zaXRpb25UbyhjaGlsZEVycm9yUm91dGVOYW1lLCBlcnJvcik7Ci0gICAgICAgIHJldHVybjsK
LSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExl
dmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVsIGVycm9yIHN0YXRlIHRvIGVudGVy
LgotICAgICAgaWYgKHJvdXRlSGFzQmVlbkRlZmluZWQob3JpZ2luUm91dGUucm91dGVyLCAnYXBw
bGljYXRpb25fZXJyb3InKSkgewotICAgICAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlv
blRvKCdhcHBsaWNhdGlvbl9lcnJvcicsIGVycm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAg
fQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBEb24ndCBmaXJlIGFuIGFzc2VydGlvbiBpZiB3ZSBm
b3VuZCBhbiBlcnJvciBzdWJzdGF0ZS4KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFbWJl
ci5Mb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIGxvYWRpbmcgcm91dGU6ICcgKyBlcnJvci5zdGFj
ayk7Ci0gIH0sCi0KLSAgbG9hZGluZzogZnVuY3Rpb24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUp
IHsKLSAgICAvLyBBdHRlbXB0IHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgbG9hZGluZyBzdWJzdGF0
ZSB0byBlbnRlci4KLSAgICB2YXIgcm91dGVyID0gb3JpZ2luUm91dGUucm91dGVyOwotCi0gICAg
dmFyIHRyeVRvcExldmVsID0gZm9yRWFjaFJvdXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRp
b24sIGZ1bmN0aW9uKHJvdXRlLCBjaGlsZFJvdXRlKSB7Ci0gICAgICB2YXIgY2hpbGRMb2FkaW5n
Um91dGVOYW1lID0gZmluZENoaWxkUm91dGVOYW1lKHJvdXRlLCBjaGlsZFJvdXRlLCAnbG9hZGlu
ZycpOwotCi0gICAgICBpZiAoY2hpbGRMb2FkaW5nUm91dGVOYW1lKSB7Ci0gICAgICAgIHJvdXRl
ci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8oY2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBEb24ndCBidWJibGUgYWJvdmUgcGl2b3Qg
cm91dGUuCi0gICAgICBpZiAodHJhbnNpdGlvbi5waXZvdEhhbmRsZXIgIT09IHJvdXRlKSB7Ci0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExl
dmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVsIGxvYWRpbmcgc3RhdGUgdG8gZW50
ZXIuCi0gICAgICBpZiAocm91dGVIYXNCZWVuRGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0ZXIsICdh
cHBsaWNhdGlvbl9sb2FkaW5nJykpIHsKLSAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5z
aXRpb25UbygnYXBwbGljYXRpb25fbG9hZGluZycpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9
Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlvbiBmaW5kQ2hpbGRSb3V0ZU5hbWUocGFyZW50Um91
dGUsIG9yaWdpbmF0aW5nQ2hpbGRSb3V0ZSwgbmFtZSkgewotICB2YXIgcm91dGVyID0gcGFyZW50
Um91dGUucm91dGVyLAotICAgICAgY2hpbGROYW1lLAotICAgICAgdGFyZ2V0Q2hpbGRSb3V0ZU5h
bWUgPSBvcmlnaW5hdGluZ0NoaWxkUm91dGUucm91dGVOYW1lLnNwbGl0KCcuJykucG9wKCksCi0g
ICAgICBuYW1lc3BhY2UgPSBwYXJlbnRSb3V0ZS5yb3V0ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicg
PyAnJyA6IHBhcmVudFJvdXRlLnJvdXRlTmFtZSArICcuJzsKLQotICAKLSAgLy8gU2Vjb25kLCB0
cnkgZ2VuZXJhbCBsb2FkaW5nIHN0YXRlLCBlLmcuICdsb2FkaW5nJwotICBjaGlsZE5hbWUgPSBu
YW1lc3BhY2UgKyBuYW1lOwotICBpZiAocm91dGVIYXNCZWVuRGVmaW5lZChyb3V0ZXIsIGNoaWxk
TmFtZSkpIHsKLSAgICByZXR1cm4gY2hpbGROYW1lOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHJvdXRl
SGFzQmVlbkRlZmluZWQocm91dGVyLCBuYW1lKSB7Ci0gIHZhciBjb250YWluZXIgPSByb3V0ZXIu
Y29udGFpbmVyOwotICByZXR1cm4gcm91dGVyLmhhc1JvdXRlKG5hbWUpICYmCi0gICAgICAgICAo
Y29udGFpbmVyLmhhcygndGVtcGxhdGU6JyArIG5hbWUpIHx8IGNvbnRhaW5lci5oYXMoJ3JvdXRl
OicgKyBuYW1lKSk7Ci19Ci0KLWZ1bmN0aW9uIHRyaWdnZXJFdmVudChoYW5kbGVySW5mb3MsIGln
bm9yZUZhaWx1cmUsIGFyZ3MpIHsKLSAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7Ci0KLSAgaWYg
KCFoYW5kbGVySW5mb3MpIHsKLSAgICBpZiAoaWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KLSAg
ICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNhbid0IHRyaWdnZXIgYWN0aW9uICciICsgbmFtZSAr
ICInIGJlY2F1c2UgeW91ciBhcHAgaGFzbid0IGZpbmlzaGVkIHRyYW5zaXRpb25pbmcgaW50byBp
dHMgZmlyc3Qgcm91dGUuIFRvIHRyaWdnZXIgYW4gYWN0aW9uIG9uIGRlc3RpbmF0aW9uIHJvdXRl
cyBkdXJpbmcgYSB0cmFuc2l0aW9uLCB5b3UgY2FuIGNhbGwgYC5zZW5kKClgIG9uIHRoZSBgVHJh
bnNpdGlvbmAgb2JqZWN0IHBhc3NlZCB0byB0aGUgYG1vZGVsL2JlZm9yZU1vZGVsL2FmdGVyTW9k
ZWxgIGhvb2tzLiIpOwotICB9Ci0KLSAgdmFyIGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0g
IGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAg
ICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV0sCi0gICAgICAgIGhhbmRsZXIgPSBo
YW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAgaWYgKGhhbmRsZXIuX2FjdGlvbnMgJiYgaGFuZGxl
ci5fYWN0aW9uc1tuYW1lXSkgewotICAgICAgaWYgKGhhbmRsZXIuX2FjdGlvbnNbbmFtZV0uYXBw
bHkoaGFuZGxlciwgYXJncykgPT09IHRydWUpIHsKLSAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0g
dHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0g
IH0KLQotICBpZiAoZGVmYXVsdEFjdGlvbkhhbmRsZXJzW25hbWVdKSB7Ci0gICAgZGVmYXVsdEFj
dGlvbkhhbmRsZXJzW25hbWVdLmFwcGx5KG51bGwsIGFyZ3MpOwotICAgIHJldHVybjsKLSAgfQot
Ci0gIGlmICghZXZlbnRXYXNIYW5kbGVkICYmICFpZ25vcmVGYWlsdXJlKSB7Ci0gICAgdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCJOb3RoaW5nIGhhbmRsZWQgdGhlIGFjdGlvbiAnIiArIG5hbWUgKyAi
Jy4gSWYgeW91IGRpZCBoYW5kbGUgdGhlIGFjdGlvbiwgdGhpcyBlcnJvciBjYW4gYmUgY2F1c2Vk
IGJ5IHJldHVybmluZyB0cnVlIGZyb20gYW4gYWN0aW9uIGhhbmRsZXIgaW4gYSBjb250cm9sbGVy
LCBjYXVzaW5nIHRoZSBhY3Rpb24gdG8gYnViYmxlLiIpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHVw
ZGF0ZVBhdGhzKHJvdXRlcikgewotICB2YXIgYXBwQ29udHJvbGxlciA9IHJvdXRlci5jb250YWlu
ZXIubG9va3VwKCdjb250cm9sbGVyOmFwcGxpY2F0aW9uJyk7Ci0KLSAgaWYgKCFhcHBDb250cm9s
bGVyKSB7Ci0gICAgLy8gYXBwQ29udHJvbGxlciBtaWdodCBub3QgZXhpc3Qgd2hlbiB0b3AtbGV2
ZWwgbG9hZGluZy9lcnJvcgotICAgIC8vIHN1YnN0YXRlcyBoYXZlIGJlZW4gZW50ZXJlZCBzaW5j
ZSBBcHBsaWNhdGlvblJvdXRlIGhhc24ndAotICAgIC8vIGFjdHVhbGx5IGJlZW4gZW50ZXJlZCBh
dCB0aGF0IHBvaW50LgotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBpbmZvcyA9IHJvdXRlci5y
b3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcywKLSAgICAgIHBhdGggPSBFbWJlci5Sb3V0ZXIuX3Jv
dXRlUGF0aChpbmZvcyk7Ci0KLSAgaWYgKCEoJ2N1cnJlbnRQYXRoJyBpbiBhcHBDb250cm9sbGVy
KSkgewotICAgIGRlZmluZVByb3BlcnR5KGFwcENvbnRyb2xsZXIsICdjdXJyZW50UGF0aCcpOwot
ICB9Ci0KLSAgc2V0KGFwcENvbnRyb2xsZXIsICdjdXJyZW50UGF0aCcsIHBhdGgpOwotCi0gIGlm
ICghKCdjdXJyZW50Um91dGVOYW1lJyBpbiBhcHBDb250cm9sbGVyKSkgewotICAgIGRlZmluZVBy
b3BlcnR5KGFwcENvbnRyb2xsZXIsICdjdXJyZW50Um91dGVOYW1lJyk7Ci0gIH0KLQotICBzZXQo
YXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0ZU5hbWUnLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAx
XS5uYW1lKTsKLX0KLQotRW1iZXIuUm91dGVyLnJlb3BlbkNsYXNzKHsKLSAgcm91dGVyOiBudWxs
LAotICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMucm91
dGVyOwotICAgIGlmICghcm91dGVyKSB7Ci0gICAgICByb3V0ZXIgPSBuZXcgUm91dGVyKCk7Ci0g
ICAgICByb3V0ZXIuY2FsbGJhY2tzID0gW107Ci0gICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0g
dHJpZ2dlckV2ZW50OwotICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7IHJvdXRlcjogcm91dGVyIH0p
OwotICAgIH0KLQotICAgIHZhciBkc2wgPSBFbWJlci5Sb3V0ZXJEU0wubWFwKGZ1bmN0aW9uKCkg
ewotICAgICAgdGhpcy5yZXNvdXJjZSgnYXBwbGljYXRpb24nLCB7IHBhdGg6ICIvIiB9LCBmdW5j
dGlvbigpIHsKLSAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcm91dGVyLmNhbGxiYWNrcy5sZW5n
dGg7IGkrKykgewotICAgICAgICAgIHJvdXRlci5jYWxsYmFja3NbaV0uY2FsbCh0aGlzKTsKLSAg
ICAgICAgfQotICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMpOwotICAgICAgfSk7Ci0gICAgfSk7
Ci0KLSAgICByb3V0ZXIuY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwotICAgIHJvdXRlci5tYXAo
ZHNsLmdlbmVyYXRlKCkpOwotICAgIHJldHVybiByb3V0ZXI7Ci0gIH0sCi0KLSAgX3JvdXRlUGF0
aDogZnVuY3Rpb24oaGFuZGxlckluZm9zKSB7Ci0gICAgdmFyIHBhdGggPSBbXTsKLQotICAgIC8v
IFdlIGhhdmUgdG8gaGFuZGxlIGNvYWxlc2NpbmcgcmVzb3VyY2UgbmFtZXMgdGhhdAotICAgIC8v
IGFyZSBwcmVmaXhlZCB3aXRoIHRoZWlyIHBhcmVudCdzIG5hbWVzLCBlLmcuCi0gICAgLy8gWydm
b28nLCAnZm9vLmJhci5iYXonXSA9PiAnZm9vLmJhci5iYXonLCBub3QgJ2Zvby5mb28uYmFyLmJh
eicKLQotICAgIGZ1bmN0aW9uIGludGVyc2VjdGlvbk1hdGNoZXMoYTEsIGEyKSB7Ci0gICAgICBm
b3IgKHZhciBpID0gMCwgbGVuID0gYTEubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAg
aWYgKGExW2ldICE9PSBhMltpXSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
fQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaT0x
LCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICB2YXIgbmFtZSA9IGhh
bmRsZXJJbmZvc1tpXS5uYW1lLAotICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoIi4i
KSwKLSAgICAgICAgICBvbGROYW1lUGFydHMgPSBzbGljZS5jYWxsKHBhdGgpOwotCi0gICAgICB3
aGlsZSAob2xkTmFtZVBhcnRzLmxlbmd0aCkgewotICAgICAgICBpZiAoaW50ZXJzZWN0aW9uTWF0
Y2hlcyhvbGROYW1lUGFydHMsIG5hbWVQYXJ0cykpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAg
ICAgfQotICAgICAgICBvbGROYW1lUGFydHMuc2hpZnQoKTsKLSAgICAgIH0KLQotICAgICAgcGF0
aC5wdXNoLmFwcGx5KHBhdGgsIG5hbWVQYXJ0cy5zbGljZShvbGROYW1lUGFydHMubGVuZ3RoKSk7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhdGguam9pbigiLiIpOwotICB9Ci19KTsKLQotUm91dGVy
LlRyYW5zaXRpb24ucHJvdG90eXBlLnNlbmQgPSBSb3V0ZXIuVHJhbnNpdGlvbi5wcm90b3R5cGUu
dHJpZ2dlcjsKLQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0LAotICAgIGdldFByb3BlcnRpZXMgPSBFbWJlci5nZXRQcm9wZXJ0
aWVzLAotICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNsYXNzaWZ5LAotICAgIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQsCi0gICAgYV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZv
ckVhY2gsCi0gICAgYV9yZXBsYWNlID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2U7Ci0K
LQotLyoqCi0gIFRoZSBgRW1iZXIuUm91dGVgIGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGluZGl2
aWR1YWwgcm91dGVzLiBSZWZlciB0bwotICB0aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6Ly9lbWJl
cmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZvciBkb2N1bWVudGF0aW9uLgotCi0gIEBjbGFzcyBS
b3V0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotICBAdXNl
cyBFbWJlci5BY3Rpb25IYW5kbGVyCi0qLwotRW1iZXIuUm91dGUgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKEVtYmVyLkFjdGlvbkhhbmRsZXIsIHsKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAg
QG1ldGhvZCBleGl0Ci0gICovCi0gIGV4aXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGVhY3Rp
dmF0ZSgpOwotICAgIHRoaXMudGVhcmRvd25WaWV3cygpOwotICB9LAotCi0gIC8qKgotICAgIEBw
cml2YXRlCi0KLSAgICBAbWV0aG9kIGVudGVyCi0gICovCi0gIGVudGVyOiBmdW5jdGlvbigpIHsK
LSAgICB0aGlzLmFjdGl2YXRlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGNvbGxlY3Rpb24g
b2YgZnVuY3Rpb25zLCBrZXllZCBieSBuYW1lLCBhdmFpbGFibGUgb24gdGhpcyByb3V0ZSBhcwot
ICAgIGFjdGlvbiB0YXJnZXRzLgotCi0gICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52b2tl
ZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20gd2l0
aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMgdGhp
cyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVyIHBh
cnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdmlhIGBSb3V0ZSNzZW5kYAotICAgIG9yIGBDb250cm9s
bGVyI3NlbmRgLgotCi0gICAgVGhlIGBhY3Rpb25zYCBoYXNoIHdpbGwgaW5oZXJpdCBhY3Rpb24g
aGFuZGxlcnMgZnJvbQotICAgIHRoZSBgYWN0aW9uc2AgaGFzaCBkZWZpbmVkIG9uIGV4dGVuZGVk
IFJvdXRlIHBhcmVudCBjbGFzc2VzCi0gICAgb3IgbWl4aW5zIHJhdGhlciB0aGFuIGp1c3QgcmVw
bGFjZSB0aGUgZW50aXJlIGhhc2gsIGUuZy46Ci0KLSAgICBgYGBqcwotICAgIEFwcC5DYW5EaXNw
bGF5QmFubmVyID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAg
ICAgZGlzcGxheUJhbm5lcjogZnVuY3Rpb24obXNnKSB7Ci0gICAgICAgICAgLy8gLi4uCi0gICAg
ICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5S
b3V0ZS5leHRlbmQoQXBwLkNhbkRpc3BsYXlCYW5uZXIsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAg
ICAgICAgcGxheU11c2ljOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAvLyAuLi4KLSAgICAgICAg
fQotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gYFdlbGNvbWVSb3V0ZWAsIHdoZW4gYWN0aXZl
LCB3aWxsIGJlIGFibGUgdG8gcmVzcG9uZAotICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2Ug
dGhlIGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQgcmF0aGVyCi0gICAgLy8gdGhlbiByZXBsYWNlZCB3
aGVuIGV4dGVuZGluZyBtaXhpbnMgLyBwYXJlbnQgY2xhc3Nlcy4KLSAgICB0aGlzLnNlbmQoJ2Rp
c3BsYXlCYW5uZXInKTsKLSAgICB0aGlzLnNlbmQoJ3BsYXlNdXNpYycpOwotICAgIGBgYAotCi0g
ICAgV2l0aGluIGEgcm91dGUncyBhY3Rpb24gaGFuZGxlciwgdGhlIHZhbHVlIG9mIHRoZSBgdGhp
c2AgY29udGV4dAotICAgIGlzIHRoZSBSb3V0ZSBvYmplY3Q6Ci0KLSAgICBgYGBqcwotICAgIEFw
cC5Tb25nUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAg
ICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9y
KCJzb25nIik7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oIm90aGVyLnJvdXRlIik7Ci0g
ICAgICAgICAgLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4g
YW4KLSAgICBhY3Rpb24gaGFuZGxlciBpZiBpdCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQg
b24gYSBwYXJlbnQKLSAgICBjbGFzcyBvciBtaXhpbjoKLQotICAgIFRha2UgZm9yIGV4YW1wbGUg
dGhlIGZvbGxvd2luZyByb3V0ZXM6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5EZWJ1Z1JvdXRlID0g
RW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0
ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICBjb25zb2xlLmRlYnVnKCJ0cm9s
b2xvIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5Bbm5veWluZ0Rl
YnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVnUm91dGUsIHsKLSAgICAgIGFj
dGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBp
biBBcHAuRGVidWdSb3V0ZQotICAgICAgICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICAgICAgICAv
LyBzaG93IGFkZGl0aW9uYWwgYW5ub3lhbmNlCi0gICAgICAgICAgd2luZG93LmFsZXJ0KC4uLik7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgICMjIEJ1YmJsaW5n
Ci0KLSAgICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBo
YW5kbGVyIGRlZmluZWQKLSAgICBvbiB0aGUgYGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8g
Y29udGludWUgYnViYmxpbmcgdGhlIGFjdGlvbiwKLSAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVg
IGZyb20gdGhlIGhhbmRsZXI6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0
aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKLSAgICAg
ICAgdGhpcy5yb3V0ZSgic29uZyIpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuQWxi
dW1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAg
IHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsK
LQotICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBh
Y3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
Ly8gLi4uCi0KLSAgICAgICAgICBpZiAoYWN0aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJl
bnRSb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICAjIyBCdWlsdC1pbiBhY3Rpb25z
Ci0KLSAgICBUaGVyZSBhcmUgYSBmZXcgYnVpbHQtaW4gYWN0aW9ucyBwZXJ0YWluaW5nIHRvIHRy
YW5zaXRpb25zIHRoYXQgeW91Ci0gICAgY2FuIHVzZSB0byBjdXN0b21pemUgdHJhbnNpdGlvbiBi
ZWhhdmlvcjogYHdpbGxUcmFuc2l0aW9uYCBhbmQKLSAgICBgZXJyb3JgLgotCi0gICAgIyMjIGB3
aWxsVHJhbnNpdGlvbmAKLQotICAgIFRoZSBgd2lsbFRyYW5zaXRpb25gIGFjdGlvbiBpcyBmaXJl
ZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFueQotICAgIGF0dGVtcHRlZCB0cmFuc2l0aW9uIHdpdGgg
YSBgVHJhbnNpdGlvbmAgb2JqZWN0IGFzIHRoZSBzb2xlCi0gICAgYXJndW1lbnQuIFRoaXMgYWN0
aW9uIGNhbiBiZSB1c2VkIGZvciBhYm9ydGluZywgcmVkaXJlY3RpbmcsCi0gICAgb3IgZGVjb3Jh
dGluZyB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIHJvdXRlcy4KLQot
ICAgIEEgZ29vZCBleGFtcGxlIGlzIHByZXZlbnRpbmcgbmF2aWdhdGlvbiB3aGVuIGEgZm9ybSBp
cwotICAgIGhhbGYtZmlsbGVkIG91dDoKLQotICAgIGBgYGpzCi0gICAgQXBwLkNvbnRhY3RGb3Jt
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICB3
aWxsVHJhbnNpdGlvbjogZnVuY3Rpb24odHJhbnNpdGlvbikgewotICAgICAgICAgIGlmICh0aGlz
LmNvbnRyb2xsZXIuZ2V0KCd1c2VySGFzRW50ZXJlZERhdGEnKSkgewotICAgICAgICAgICAgdGhp
cy5jb250cm9sbGVyLmRpc3BsYXlOYXZpZ2F0aW9uQ29uZmlybSgpOwotICAgICAgICAgICAgdHJh
bnNpdGlvbi5hYm9ydCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgWW91IGNhbiBhbHNvIHJlZGlyZWN0IGVsc2V3aGVyZSBieSBjYWxs
aW5nCi0gICAgYHRoaXMudHJhbnNpdGlvblRvKCdlbHNld2hlcmUnKWAgZnJvbSB3aXRoaW4gYHdp
bGxUcmFuc2l0aW9uYC4KLSAgICBOb3RlIHRoYXQgYHdpbGxUcmFuc2l0aW9uYCB3aWxsIG5vdCBi
ZSBmaXJlZCBmb3IgdGhlCi0gICAgcmVkaXJlY3RpbmcgYHRyYW5zaXRpb25Ub2AsIHNpbmNlIGB3
aWxsVHJhbnNpdGlvbmAgZG9lc24ndAotICAgIGZpcmUgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEg
dHJhbnNpdGlvbiB1bmRlcndheS4gSWYgeW91IHdhbnQKLSAgICBzdWJzZXF1ZW50IGB3aWxsVHJh
bnNpdGlvbmAgYWN0aW9ucyB0byBmaXJlIGZvciB0aGUgcmVkaXJlY3RpbmcKLSAgICB0cmFuc2l0
aW9uLCB5b3UgbXVzdCBmaXJzdCBleHBsaWNpdGx5IGNhbGwKLSAgICBgdHJhbnNpdGlvbi5hYm9y
dCgpYC4KLQotICAgICMjIyBgZXJyb3JgCi0KLSAgICBXaGVuIGF0dGVtcHRpbmcgdG8gdHJhbnNp
dGlvbiBpbnRvIGEgcm91dGUsIGFueSBvZiB0aGUgaG9va3MKLSAgICBtYXkgcmV0dXJuIGEgcHJv
bWlzZSB0aGF0IHJlamVjdHMsIGF0IHdoaWNoIHBvaW50IGFuIGBlcnJvcmAKLSAgICBhY3Rpb24g
d2lsbCBiZSBmaXJlZCBvbiB0aGUgcGFydGlhbGx5LWVudGVyZWQgcm91dGVzLCBhbGxvd2luZwot
ICAgIGZvciBwZXItcm91dGUgZXJyb3IgaGFuZGxpbmcgbG9naWMsIG9yIHNoYXJlZCBlcnJvciBo
YW5kbGluZwotICAgIGxvZ2ljIGRlZmluZWQgb24gYSBwYXJlbnQgcm91dGUuCi0KLSAgICBIZXJl
IGlzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3IgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZAot
ICAgIGZvciByZWplY3RlZCBwcm9taXNlcyBmcm9tIHRoZSB2YXJpb3VzIGhvb2tzIG9uIHRoZSBy
b3V0ZSwKLSAgICBhcyB3ZWxsIGFzIGFueSB1bmhhbmRsZWQgZXJyb3JzIGZyb20gY2hpbGQgcm91
dGVzOgotCi0gICAgYGBganMKLSAgICBBcHAuQWRtaW5Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7Ci0gICAgICBiZWZvcmVNb2RlbDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBFbWJl
ci5SU1ZQLnJlamVjdCgiYmFkIHRoaW5ncyEiKTsKLSAgICAgIH0sCi0KLSAgICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yLCB0cmFuc2l0aW9uKSB7Ci0gICAgICAg
ICAgLy8gQXNzdW1pbmcgd2UgZ290IGhlcmUgZHVlIHRvIHRoZSBlcnJvciBpbiBgYmVmb3JlTW9k
ZWxgLAotICAgICAgICAgIC8vIHdlIGNhbiBleHBlY3QgdGhhdCBlcnJvciA9PT0gImJhZCB0aGlu
Z3MhIiwKLSAgICAgICAgICAvLyBidXQgYSBwcm9taXNlIG1vZGVsIHJlamVjdGluZyB3b3VsZCBh
bHNvCi0gICAgICAgICAgLy8gY2FsbCB0aGlzIGhvb2ssIGFzIHdvdWxkIGFueSBlcnJvcnMgZW5j
b3VudGVyZWQKLSAgICAgICAgICAvLyBpbiBgYWZ0ZXJNb2RlbGAuCi0KLSAgICAgICAgICAvLyBU
aGUgYGVycm9yYCBob29rIGlzIGFsc28gcHJvdmlkZWQgdGhlIGZhaWxlZAotICAgICAgICAgIC8v
IGB0cmFuc2l0aW9uYCwgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQgbGF0ZXIKLSAgICAgICAgICAv
LyBgLnJldHJ5KClgZCBpZiBkZXNpcmVkLgotCi0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J2xvZ2luJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIGBl
cnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJsZSB1cCBhbGwgdGhlIHdheSB0byBgQXBwbGljYXRpb25S
b3V0ZWAKLSAgICB3aWxsIGZpcmUgYSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgdGhhdCBsb2dzIHRo
ZSBlcnJvci4gWW91IGNhbgotICAgIHNwZWNpZnkgeW91ciBvd24gZ2xvYmFsIGRlZmF1bHQgZXJy
b3IgaGFuZGxlciBieSBvdmVycmlkaW5nIHRoZQotICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBw
bGljYXRpb25Sb3V0ZWA6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0g
RW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZXJyb3I6IGZ1
bmN0aW9uKGVycm9yLCB0cmFuc2l0aW9uKSB7Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9y
KCdiYW5uZXInKS5kaXNwbGF5RXJyb3IoZXJyb3IubWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBhY3Rpb25zCi0gICAgQHR5cGUg
SGFzaAotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgX2FjdGlvbnM6IHsKLSAgICBmaW5hbGl6
ZVF1ZXJ5UGFyYW1DaGFuZ2U6IGZ1bmN0aW9uKHBhcmFtcywgZmluYWxQYXJhbXMpIHsKLSAgICAg
ICAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQGRlcHJlY2F0ZWQKLQotICAgIFBsZWFzZSB1c2Ug
YGFjdGlvbnNgIGluc3RlYWQuCi0gICAgQG1ldGhvZCBldmVudHMKLSAgKi8KLSAgZXZlbnRzOiBu
dWxsLAotCi0gIG1lcmdlZFByb3BlcnRpZXM6IFsnZXZlbnRzJ10sCi0KLSAgLyoqCi0gICAgVGhp
cyBob29rIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMg
cm91dGUuIEl0IGlzCi0gICAgbm90IGV4ZWN1dGVkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgcm91
dGUgY2hhbmdlcy4KLQotICAgIEBtZXRob2QgZGVhY3RpdmF0ZQotICAqLwotICBkZWFjdGl2YXRl
OiBFbWJlci5LLAotCi0gIC8qKgotICAgIFRoaXMgaG9vayBpcyBleGVjdXRlZCB3aGVuIHRoZSBy
b3V0ZXIgZW50ZXJzIHRoZSByb3V0ZS4gSXQgaXMgbm90IGV4ZWN1dGVkCi0gICAgd2hlbiB0aGUg
bW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgotCi0gICAgQG1ldGhvZCBhY3RpdmF0ZQotICAq
LwotICBhY3RpdmF0ZTogRW1iZXIuSywKLQotICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5v
dGhlciByb3V0ZS4gT3B0aW9uYWxseSBzdXBwbHkgbW9kZWwocykgZm9yIHRoZQotICAgIHJvdXRl
IGluIHF1ZXN0aW9uLiBJZiBtdWx0aXBsZSBtb2RlbHMgYXJlIHN1cHBsaWVkIHRoZXkgd2lsbCBi
ZSBhcHBsaWVkCi0gICAgbGFzdCB0byBmaXJzdCByZWN1cnNpdmVseSB1cCB0aGUgcmVzb3VyY2Ug
dHJlZSAoc2VlIE11bHRpcGxlIE1vZGVscyBFeGFtcGxlCi0gICAgYmVsb3cpLiBUaGUgbW9kZWwo
cykgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0aGUgYXBwcm9wcmlhdGUK
LSAgICByb3V0ZSdzIGBzZXJpYWxpemVgIGhvb2suIFNlZSBhbHNvICdyZXBsYWNlV2l0aCcuCi0K
LSAgICBTaW1wbGUgVHJhbnNpdGlvbiBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
QXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOwot
ICAgICAgdGhpcy5yb3V0ZSgic2VjcmV0Iik7Ci0gICAgICB0aGlzLnJvdXRlKCJmb3VyT2hGb3Vy
IiwgeyBwYXRoOiAiKjoifSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVy
LlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIG1vdmVUb1NlY3JldDog
ZnVuY3Rpb24oY29udGV4dCl7Ci0gICAgICAgICAgaWYgKGF1dGhvcml6ZWQoKSl7Ci0gICAgICAg
ICAgICB0aGlzLnRyYW5zaXRpb25Ubygnc2VjcmV0JywgY29udGV4dCk7Ci0gICAgICAgICAgfQot
ICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2ZvdXJPaEZvdXInKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICBUcmFuc2l0aW9uIHRvIGEgbmVzdGVkIHJv
dXRlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewot
ICAgICB0aGlzLnJlc291cmNlKCdhcnRpY2xlcycsIHsgcGF0aDogJy9hcnRpY2xlcycgfSwgZnVu
Y3Rpb24oKSB7Ci0gICAgICAgdGhpcy5yb3V0ZSgnbmV3Jyk7Ci0gICAgIH0pOwotICAgfSk7Ci0K
LSAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgYWN0aW9uczog
ewotICAgICAgIHRyYW5zaXRpb25Ub05ld0FydGljbGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAg
dGhpcy50cmFuc2l0aW9uVG8oJ2FydGljbGVzLm5ldycpOwotICAgICAgIH0KLSAgICAgfQotICAg
fSk7Ci0gICBgYGAKLQotICAgIE11bHRpcGxlIE1vZGVscyBFeGFtcGxlCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRl
KCJpbmRleCIpOwotICAgICAgdGhpcy5yZXNvdXJjZSgnYnJlYWtmYXN0Jywge3BhdGg6JzpicmVh
a2Zhc3RJZCd9LCBmdW5jdGlvbigpewotICAgICAgICB0aGlzLnJlc291cmNlKCdjZXJlYWwnLCB7
cGF0aDogJzpjZXJlYWxJZCd9KTsKLSAgICAgIH0pOwotICAgIH0pOwotCi0gICAgQXBwLkluZGV4
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBt
b3ZlVG9DaG9jb2xhdGVDZXJlYWw6IGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgdmFyIGNlcmVhbCA9
IHsgY2VyZWFsSWQ6ICJDaG9jb2xhdGVZdW1taW5lc3MifSwKLSAgICAgICAgICAgICAgYnJlYWtm
YXN0ID0ge2JyZWFrZmFzdElkOiAiQ2VyZWFsQW5kTWlsayJ9OwotCi0gICAgICAgICAgdGhpcy50
cmFuc2l0aW9uVG8oJ2NlcmVhbCcsIGJyZWFrZmFzdCwgY2VyZWFsKTsKLSAgICAgICAgfQotICAg
ICAgfQotICAgIH0pOwotCi0gICAgQG1ldGhvZCB0cmFuc2l0aW9uVG8KLSAgICBAcGFyYW0ge1N0
cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0g
bW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0
byB0aGUgcm91dGUuCi0gICovCi0gIHRyYW5zaXRpb25UbzogZnVuY3Rpb24obmFtZSwgY29udGV4
dCkgewotICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKLSAgICByZXR1cm4gcm91dGVyLnRy
YW5zaXRpb25Uby5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
UGVyZm9ybSBhIHN5bmNocm9ub3VzIHRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdpdGgg
b3V0IGF0dGVtcHRpbmcKLSAgICB0byByZXNvbHZlIHByb21pc2VzLCB1cGRhdGUgdGhlIFVSTCwg
b3IgYWJvcnQgYW55IGN1cnJlbnRseSBhY3RpdmUKLSAgICBhc3luY2hyb25vdXMgdHJhbnNpdGlv
bnMgKGkuZS4gcmVndWxhciB0cmFuc2l0aW9ucyBjYXVzZWQgYnkKLSAgICBgdHJhbnNpdGlvblRv
YCBvciBVUkwgY2hhbmdlcykuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyBoYW5keSBmb3IgcGVyZm9y
bWluZyBpbnRlcm1lZGlhdGUgdHJhbnNpdGlvbnMgb24gdGhlCi0gICAgd2F5IHRvIGEgZmluYWwg
ZGVzdGluYXRpb24gcm91dGUsIGFuZCBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSB0aGUKLSAgICBk
ZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRs
ZXJzLgotCi0gICAgQG1ldGhvZCBpbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8KLSAgICBAcGFyYW0g
e1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVj
dH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAg
ICB0byB0aGUgcm91dGUuCi0gICAqLwotICBpbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG86IGZ1bmN0
aW9uKCkgewotICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKLSAgICByb3V0ZXIuaW50ZXJt
ZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJndW1lbnRzKTsKLSAgfSwKLQotICAv
KioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhl
IGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KLSAgICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3Vy
cmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IG9uZS4KLSAgICBCZXNp
ZGUgdGhhdCwgaXQgaXMgaWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9gIGluIGFsbCBvdGhlciBy
ZXNwZWN0cy4gU2VlCi0gICAgJ3RyYW5zaXRpb25UbycgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRp
b24gcmVnYXJkaW5nIG11bHRpcGxlIG1vZGVscy4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucm91
dGUoImluZGV4Iik7Ci0gICAgICB0aGlzLnJvdXRlKCJzZWNyZXQiKTsKLSAgICB9KTsKLQotICAg
IEFwcC5TZWNyZXRSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhZnRlck1vZGVs
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYgKCFhdXRob3JpemVkKCkpewotICAgICAgICAgIHRo
aXMucmVwbGFjZVdpdGgoJ2luZGV4Jyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAg
ICBgYGAKLQotICAgIEBtZXRob2QgcmVwbGFjZVdpdGgKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRo
ZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91
dGUuCi0gICovCi0gIHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcm91dGVyID0g
dGhpcy5yb3V0ZXI7Ci0gICAgcmV0dXJuIHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIs
IGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2VuZHMgYW4gYWN0aW9uIHRvIHRoZSBy
b3V0ZXIsIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXQgdG8gdGhlIGN1cnJlbnRseQotICAgIGFjdGl2
ZSByb3V0ZSBoaWVyYXJjaHkgcGVyIHRoZSBidWJibGluZyBydWxlcyBleHBsYWluZWQgdW5kZXIg
YGFjdGlvbnNgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5S
b3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yb3V0ZSgiaW5kZXgiKTsKLSAgICB9
KTsKLQotICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAg
ICAgIGFjdGlvbnM6IHsKLSAgICAgICAgdHJhY2s6IGZ1bmN0aW9uKGFyZykgewotICAgICAgICAg
IGNvbnNvbGUubG9nKGFyZywgJ3dhcyBjbGlja2VkJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAg
ICB9KTsKLQotICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAg
IGFjdGlvbnM6IHsKLSAgICAgICAgdHJhY2tJZkRlYnVnOiBmdW5jdGlvbihhcmcpIHsKLSAgICAg
ICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBzZW5kCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFj
dGlvbiB0byB0cmlnZ2VyCi0gICAgQHBhcmFtIHsuLi4qfSBhcmdzCi0gICovCi0gIHNlbmQ6IGZ1
bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLnJvdXRlci5zZW5kLmFwcGx5KHRoaXMucm91dGVy
LCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkg
cG9pbnQgZm9yIHJvdXRlci5qcwotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0g
ICovCi0gIHNldHVwOiBmdW5jdGlvbihjb250ZXh0LCBxdWVyeVBhcmFtcykgewotICAgIHZhciBj
b250cm9sbGVyTmFtZSA9IHRoaXMuY29udHJvbGxlck5hbWUgfHwgdGhpcy5yb3V0ZU5hbWUsCi0g
ICAgICAgIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXJGb3IoY29udHJvbGxlck5hbWUsIHRy
dWUpOwotICAgIGlmICghY29udHJvbGxlcikgewotICAgICAgY29udHJvbGxlciA9ICB0aGlzLmdl
bmVyYXRlQ29udHJvbGxlcihjb250cm9sbGVyTmFtZSwgY29udGV4dCk7Ci0gICAgfQotCi0gICAg
Ly8gQXNzaWduIHRoZSByb3V0ZSdzIGNvbnRyb2xsZXIgc28gdGhhdCBpdCBjYW4gbW9yZSBlYXNp
bHkgYmUKLSAgICAvLyByZWZlcmVuY2VkIGluIGFjdGlvbiBoYW5kbGVycwotICAgIHRoaXMuY29u
dHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0KLSAgICB2YXIgYXJncyA9IFtjb250cm9sbGVyLCBjb250
ZXh0XTsKLQotICAgIAotICAgIGlmICh0aGlzLnNldHVwQ29udHJvbGxlcnMpIHsKLSAgICAgIEVt
YmVyLmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUuc2V0dXBDb250cm9sbGVycyBpcyBkZXByZWNhdGVk
LiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnNldHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBtb2Rl
bCkgaW5zdGVhZC4iKTsKLSAgICAgIHRoaXMuc2V0dXBDb250cm9sbGVycyhjb250cm9sbGVyLCBj
b250ZXh0KTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5zZXR1cENvbnRyb2xsZXIuYXBwbHko
dGhpcywgYXJncyk7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMucmVuZGVyVGVtcGxhdGVzKSB7Ci0g
ICAgICBFbWJlci5kZXByZWNhdGUoIkVtYmVyLlJvdXRlLnJlbmRlclRlbXBsYXRlcyBpcyBkZXBy
ZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnJlbmRlclRlbXBsYXRlKGNvbnRyb2xsZXIs
IG1vZGVsKSBpbnN0ZWFkLiIpOwotICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0ZXMoY29udGV4dCk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMucmVuZGVyVGVtcGxhdGUuYXBwbHkodGhpcywgYXJn
cyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0
byBvcHRpb25hbGx5IHJlZGlyZWN0IHRvIGFub3RoZXIgcm91dGUuCi0KLSAgICBJZiB5b3UgY2Fs
bCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20gaW5zaWRlIG9mIHRoaXMgaG9vaywgdGhpcyByb3V0
ZQotICAgIHdpbGwgbm90IGJlIGVudGVyZWQgaW4gZmF2b3Igb2YgdGhlIG90aGVyIGhvb2suCi0K
LSAgICBOb3RlIHRoYXQgdGhpcyBob29rIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1l
bnRhdGlvbiBvZgotICAgIGBhZnRlck1vZGVsYCwgc28gaWYgeW91IG92ZXJyaWRlIGBhZnRlck1v
ZGVsYCwgeW91IG11c3QgZWl0aGVyCi0gICAgZXhwbGljaXRseSBjYWxsIGByZWRpcmVjdGAgb3Ig
anVzdCBwdXQgeW91ciByZWRpcmVjdGluZwotICAgIGB0aGlzLnRyYW5zaXRpb25UbygpYCBjYWxs
IHdpdGhpbiBgYWZ0ZXJNb2RlbGAuCi0KLSAgICBAbWV0aG9kIHJlZGlyZWN0Ci0gICAgQHBhcmFt
IHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZQotICAqLwotICByZWRpcmVj
dDogRW1iZXIuSywKLQotICAvKioKLSAgICBUaGlzIGhvb2sgaXMgdGhlIGZpcnN0IG9mIHRoZSBy
b3V0ZSBlbnRyeSB2YWxpZGF0aW9uIGhvb2tzCi0gICAgY2FsbGVkIHdoZW4gYW4gYXR0ZW1wdCBp
cyBtYWRlIHRvIHRyYW5zaXRpb24gaW50byBhIHJvdXRlCi0gICAgb3Igb25lIG9mIGl0cyBjaGls
ZHJlbi4gSXQgaXMgY2FsbGVkIGJlZm9yZSBgbW9kZWxgIGFuZAotICAgIGBhZnRlck1vZGVsYCwg
YW5kIGlzIGFwcHJvcHJpYXRlIGZvciBjYXNlcyB3aGVuOgotCi0gICAgMSkgQSBkZWNpc2lvbiBj
YW4gYmUgbWFkZSB0byByZWRpcmVjdCBlbHNld2hlcmUgd2l0aG91dAotICAgICAgIG5lZWRpbmcg
dG8gcmVzb2x2ZSB0aGUgbW9kZWwgZmlyc3QuCi0gICAgMikgQW55IGFzeW5jIG9wZXJhdGlvbnMg
bmVlZCB0byBvY2N1ciBmaXJzdCBiZWZvcmUgdGhlCi0gICAgICAgbW9kZWwgaXMgYXR0ZW1wdGVk
IHRvIGJlIHJlc29sdmVkLgotCi0gICAgVGhpcyBob29rIGlzIHByb3ZpZGVkIHRoZSBjdXJyZW50
IGB0cmFuc2l0aW9uYCBhdHRlbXB0Ci0gICAgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSB1
c2VkIHRvIGAuYWJvcnQoKWAgdGhlIHRyYW5zaXRpb24sCi0gICAgc2F2ZSBpdCBmb3IgYSBsYXRl
ciBgLnJldHJ5KClgLCBvciByZXRyaWV2ZSB2YWx1ZXMgc2V0Ci0gICAgb24gaXQgZnJvbSBhIHBy
ZXZpb3VzIGhvb2suIFlvdSBjYW4gYWxzbyBqdXN0IGNhbGwKLSAgICBgdGhpcy50cmFuc2l0aW9u
VG9gIHRvIGFub3RoZXIgcm91dGUgdG8gaW1wbGljaXRseQotICAgIGFib3J0IHRoZSBgdHJhbnNp
dGlvbmAuCi0KLSAgICBZb3UgY2FuIHJldHVybiBhIHByb21pc2UgZnJvbSB0aGlzIGhvb2sgdG8g
cGF1c2UgdGhlCi0gICAgdHJhbnNpdGlvbiB1bnRpbCB0aGUgcHJvbWlzZSByZXNvbHZlcyAob3Ig
cmVqZWN0cykuIFRoaXMgY291bGQKLSAgICBiZSB1c2VmdWwsIGZvciBpbnN0YW5jZSwgZm9yIHJl
dHJpZXZpbmcgYXN5bmMgY29kZSBmcm9tCi0gICAgdGhlIHNlcnZlciB0aGF0IGlzIHJlcXVpcmVk
IHRvIGVudGVyIGEgcm91dGUuCi0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJl
ci5Sb3V0ZS5leHRlbmQoewotICAgICAgYmVmb3JlTW9kZWw6IGZ1bmN0aW9uKHRyYW5zaXRpb24p
IHsKLSAgICAgICAgaWYgKCFBcHAuUG9zdCkgewotICAgICAgICAgIHJldHVybiBFbWJlci4kLmdl
dFNjcmlwdCgnL21vZGVscy9wb3N0LmpzJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIElmIGBBcHAuUG9zdGAgZG9lc24ndCBleGlzdCBpbiB0aGUgYWJvdmUg
ZXhhbXBsZSwKLSAgICBgYmVmb3JlTW9kZWxgIHdpbGwgdXNlIGpRdWVyeSdzIGBnZXRTY3JpcHRg
LCB3aGljaAotICAgIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNl
cnZlciBoYXMKLSAgICBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGFuZCBleGVjdXRlZCB0aGUgY29k
ZSBmcm9tIHRoZQotICAgIHNlcnZlci4gTm90ZSB0aGF0IGlmIGFuIGVycm9yIHdlcmUgdG8gb2Nj
dXIsIGl0IHdvdWxkCi0gICAgYmUgcGFzc2VkIHRvIHRoZSBgZXJyb3JgIGhvb2sgb24gYEVtYmVy
LlJvdXRlYCwgYnV0Ci0gICAgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhbmRsZSBlcnJvcnMgc3Bl
Y2lmaWMgdG8KLSAgICBgYmVmb3JlTW9kZWxgIHJpZ2h0IGZyb20gd2l0aGluIHRoZSBob29rICh0
byBkaXN0aW5ndWlzaAotICAgIGZyb20gdGhlIHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlv
ciBvZiB0aGUgYGVycm9yYAotICAgIGhvb2spOgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGJlZm9yZU1vZGVsOiBmdW5jdGlvbih0
cmFuc2l0aW9uKSB7Ci0gICAgICAgIGlmICghQXBwLlBvc3QpIHsKLSAgICAgICAgICB2YXIgc2Vs
ZiA9IHRoaXM7Ci0gICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0U2NyaXB0KCdwb3N0LmpzJyku
dGhlbihudWxsLCBmdW5jdGlvbihlKSB7Ci0gICAgICAgICAgICBzZWxmLnRyYW5zaXRpb25Ubygn
aGVscCcpOwotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHRyYW5zaXRpb25U
byB3aWxsIGltcGxpY2l0bHkKLSAgICAgICAgICAgIC8vIGhhbHQgdGhlIHRyYW5zaXRpb24uIElm
IHlvdSB3ZXJlIHRvIHJldHVybgotICAgICAgICAgICAgLy8gbm90aGluZyBmcm9tIHRoaXMgcHJv
bWlzZSByZWplY3QgaGFuZGxlciwKLSAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBwcm9taXNl
IHNlbWFudGljcywgdGhhdCB3b3VsZAotICAgICAgICAgICAgLy8gY29udmVydCB0aGUgcmVqZWN0
IGludG8gYSByZXNvbHZlIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gd291bGQg
Y29udGludWUuIFRvIHByb3BhZ2F0ZSB0aGUKLSAgICAgICAgICAgIC8vIGVycm9yIHNvIHRoYXQg
aXQnZCBiZSBoYW5kbGVkIGJ5IHRoZSBgZXJyb3JgCi0gICAgICAgICAgICAvLyBob29rLCB5b3Ug
d291bGQgaGF2ZSB0byBlaXRoZXIKLSAgICAgICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVj
dChlKTsKLSAgICAgICAgICAgIC8vIG9yCi0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAg
IH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9k
IGJlZm9yZU1vZGVsCi0gICAgQHBhcmFtIHtUcmFuc2l0aW9ufSB0cmFuc2l0aW9uCi0gICAgQHBh
cmFtIHtPYmplY3R9IHF1ZXJ5UGFyYW1zIHRoZSBhY3RpdmUgcXVlcnkgcGFyYW1zIGZvciB0aGlz
IHJvdXRlCi0gICAgQHJldHVybiB7UHJvbWlzZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20g
dGhpcyBob29rIGlzCi0gICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2Ug
dW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAgIHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1wcm9t
aXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAotICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4KLSAg
Ki8KLSAgYmVmb3JlTW9kZWw6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgVGhpcyBob29rIGlzIGNh
bGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9kZWwgaGFzIHJlc29sdmVkLgotICAgIEl0IGZvbGxv
d3MgaWRlbnRpY2FsIGFzeW5jL3Byb21pc2Ugc2VtYW50aWNzIHRvIGBiZWZvcmVNb2RlbGAKLSAg
ICBidXQgaXMgcHJvdmlkZWQgdGhlIHJvdXRlJ3MgcmVzb2x2ZWQgbW9kZWwgaW4gYWRkaXRpb24g
dG8KLSAgICB0aGUgYHRyYW5zaXRpb25gLCBhbmQgaXMgdGhlcmVmb3JlIHN1aXRlZCB0byBwZXJm
b3JtaW5nCi0gICAgbG9naWMgdGhhdCBjYW4gb25seSB0YWtlIHBsYWNlIGFmdGVyIHRoZSBtb2Rl
bCBoYXMgYWxyZWFkeQotICAgIHJlc29sdmVkLgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdHNS
b3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbihw
b3N0cywgdHJhbnNpdGlvbikgewotICAgICAgICBpZiAocG9zdHMubGVuZ3RoID09PSAxKSB7Ci0g
ICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ3Bvc3Quc2hvdycsIHBvc3RzWzBdKTsKLSAgICAg
ICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgUmVmZXIgdG8gZG9jdW1lbnRh
dGlvbiBmb3IgYGJlZm9yZU1vZGVsYCBmb3IgYSBkZXNjcmlwdGlvbgotICAgIG9mIHRyYW5zaXRp
b24tcGF1c2luZyBzZW1hbnRpY3Mgd2hlbiBhIHByb21pc2UgaXMgcmV0dXJuZWQKLSAgICBmcm9t
IHRoaXMgaG9vay4KLQotICAgIEBtZXRob2QgYWZ0ZXJNb2RlbAotICAgIEBwYXJhbSB7T2JqZWN0
fSByZXNvbHZlZE1vZGVsIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGBtb2RlbGAsCi0gICAgICBv
ciBpdHMgcmVzb2x2ZWQgdmFsdWUgaWYgaXQgd2FzIGEgcHJvbWlzZQotICAgIEBwYXJhbSB7VHJh
bnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUg
YWN0aXZlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhpcyBoYW5kbGVyCi0gICAgQHJldHVybiB7UHJvbWlz
ZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBob29rIGlzCi0gICAgICBhIHByb21p
c2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAg
IHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1wcm9taXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAot
ICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4KLSAgICovCi0gIGFmdGVyTW9kZWw6IGZ1bmN0aW9u
KHJlc29sdmVkTW9kZWwsIHRyYW5zaXRpb24sIHF1ZXJ5UGFyYW1zKSB7Ci0gICAgdGhpcy5yZWRp
cmVjdChyZXNvbHZlZE1vZGVsLCB0cmFuc2l0aW9uKTsKLSAgfSwKLQotCi0gIC8qKgotICAgIENh
bGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNoYW5nZWQgYnkgcm91dGVyLmpzLgotCi0gICAgQHBy
aXZhdGUKLSAgICBAbWV0aG9kIGNvbnRleHREaWRDaGFuZ2UKLSAgKi8KLSAgY29udGV4dERpZENo
YW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jdXJyZW50TW9kZWwgPSB0aGlzLmNvbnRleHQ7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBob29rIHlvdSBjYW4gaW1wbGVtZW50IHRvIGNvbnZlcnQg
dGhlIFVSTCBpbnRvIHRoZSBtb2RlbCBmb3IKLSAgICB0aGlzIHJvdXRlLgotCi0gICAgYGBganMK
LSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ3Bv
c3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IFRoZSBtb2RlbCBmb3IgdGhlIGBwb3N0YCByb3V0ZSBpcyBgQXBwLlBvc3QuZmluZChwYXJhbXMu
cG9zdF9pZClgLgotCi0gICAgQnkgZGVmYXVsdCwgaWYgeW91ciByb3V0ZSBoYXMgYSBkeW5hbWlj
IHNlZ21lbnQgZW5kaW5nIGluIGBfaWRgOgotCi0gICAgKiBUaGUgbW9kZWwgY2xhc3MgaXMgZGV0
ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChgcG9zdF9pZGAncwotICAgICAgY2xhc3MgaXMgYEFw
cC5Qb3N0YCkKLSAgICAqIFRoZSBmaW5kIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVsIGNs
YXNzIHdpdGggdGhlIHZhbHVlIG9mCi0gICAgICB0aGUgZHluYW1pYyBzZWdtZW50LgotCi0gICAg
Tm90ZSB0aGF0IGZvciByb3V0ZXMgd2l0aCBkeW5hbWljIHNlZ21lbnRzLCB0aGlzIGhvb2sgaXMg
b25seQotICAgIGV4ZWN1dGVkIHdoZW4gZW50ZXJlZCB2aWEgdGhlIFVSTC4gSWYgdGhlIHJvdXRl
IGlzIGVudGVyZWQKLSAgICB0aHJvdWdoIGEgdHJhbnNpdGlvbiAoZS5nLiB3aGVuIHVzaW5nIHRo
ZSBgbGluay10b2AgSGFuZGxlYmFycwotICAgIGhlbHBlciksIHRoZW4gYSBtb2RlbCBjb250ZXh0
IGlzIGFscmVhZHkgcHJvdmlkZWQgYW5kIHRoaXMgaG9vawotICAgIGlzIG5vdCBjYWxsZWQuIFJv
dXRlcyB3aXRob3V0IGR5bmFtaWMgc2VnbWVudHMgd2lsbCBhbHdheXMKLSAgICBleGVjdXRlIHRo
ZSBtb2RlbCBob29rLgotCi0gICAgVGhpcyBob29rIGZvbGxvd3MgdGhlIGFzeW5jaHJvbm91cy9w
cm9taXNlIHNlbWFudGljcwotICAgIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ig
YGJlZm9yZU1vZGVsYC4gSW4gcGFydGljdWxhciwKLSAgICBpZiBhIHByb21pc2UgcmV0dXJuZWQg
ZnJvbSBgbW9kZWxgIGZhaWxzLCB0aGUgZXJyb3Igd2lsbCBiZQotICAgIGhhbmRsZWQgYnkgdGhl
IGBlcnJvcmAgaG9vayBvbiBgRW1iZXIuUm91dGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBg
anMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIG1vZGVs
OiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAgICAgcmV0dXJuIEFwcC5Qb3N0LmZpbmQocGFyYW1z
LnBvc3RfaWQpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBtb2Rl
bAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZy
b20gdGhlIFVSTAotICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBwYXJh
bSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUgcXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCi0g
ICAgQHJldHVybiB7T2JqZWN0fFByb21pc2V9IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4gSWYK
LSAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5lZCwgdGhlIHRyYW5zaXRpb24gd2lsbCBwYXVzZSB1
bnRpbAotICAgICAgdGhlIHByb21pc2UgcmVzb2x2ZXMsIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUg
b2YgdGhlIHByb21pc2UKLSAgICAgIHdpbGwgYmUgdXNlZCBhcyB0aGUgbW9kZWwgZm9yIHRoaXMg
cm91dGUuCi0gICovCi0gIG1vZGVsOiBmdW5jdGlvbihwYXJhbXMsIHRyYW5zaXRpb24pIHsKLSAg
ICB2YXIgbWF0Y2gsIG5hbWUsIHNhd1BhcmFtcywgdmFsdWU7Ci0KLSAgICBmb3IgKHZhciBwcm9w
IGluIHBhcmFtcykgewotICAgICAgaWYgKG1hdGNoID0gcHJvcC5tYXRjaCgvXiguKilfaWQkLykp
IHsKLSAgICAgICAgbmFtZSA9IG1hdGNoWzFdOwotICAgICAgICB2YWx1ZSA9IHBhcmFtc1twcm9w
XTsKLSAgICAgIH0KLSAgICAgIHNhd1BhcmFtcyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFu
YW1lICYmIHNhd1BhcmFtcykgeyByZXR1cm4gcGFyYW1zOyB9Ci0gICAgZWxzZSBpZiAoIW5hbWUp
IHsgcmV0dXJuOyB9Ci0KLSAgICByZXR1cm4gdGhpcy5maW5kTW9kZWwobmFtZSwgdmFsdWUpOwot
ICB9LAotCi0gIC8qKgotCi0gICAgQG1ldGhvZCBmaW5kTW9kZWwKLSAgICBAcGFyYW0ge1N0cmlu
Z30gdHlwZSB0aGUgbW9kZWwgdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFs
dWUgcGFzc2VkIHRvIGZpbmQKLSAgKi8KLSAgZmluZE1vZGVsOiBmdW5jdGlvbigpewotICAgIHZh
ciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKLSAgICByZXR1cm4gc3RvcmUuZmluZC5hcHBs
eShzdG9yZSwgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBTdG9yZSBwcm9wZXJ0eSBw
cm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVyc2lzdGVuY2UgbGlicmFyaWVzIHRvIGluamVjdCB0
aGVtc2VsdmVzLgotCi0gICAgQnkgZGVmYXVsdCwgdGhpcyBzdG9yZSBwcm9wZXJ0eSBwcm92aWRl
cyB0aGUgZXhhY3Qgc2FtZSBmdW5jdGlvbmFsaXR5IHByZXZpb3VzbHkKLSAgICBpbiB0aGUgbW9k
ZWwgaG9vay4KLQotICAgIEN1cnJlbnRseSwgdGhlIHJlcXVpcmVkIGludGVyZmFjZSBpczoKLQot
ICAgIGBzdG9yZS5maW5kKG1vZGVsTmFtZSwgZmluZEFyZ3VtZW50cylgCi0KLSAgICBAbWV0aG9k
IHN0b3JlCi0gICAgQHBhcmFtIHtPYmplY3R9IHN0b3JlCi0gICovCi0gIHN0b3JlOiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbigpewotICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsK
LSAgICB2YXIgcm91dGVOYW1lID0gdGhpcy5yb3V0ZU5hbWU7Ci0gICAgdmFyIG5hbWVzcGFjZSA9
IGdldCh0aGlzLCAncm91dGVyLm5hbWVzcGFjZScpOwotCi0gICAgcmV0dXJuIHsKLSAgICAgIGZp
bmQ6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7Ci0gICAgICAgIHZhciBtb2RlbENsYXNzID0gY29u
dGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOicgKyBuYW1lKTsKLQotICAgICAgICBFbWJlci5h
c3NlcnQoIllvdSB1c2VkIHRoZSBkeW5hbWljIHNlZ21lbnQgIiArIG5hbWUgKyAiX2lkIGluIHlv
dXIgcm91dGUgIiArCi0gICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWUgKyAiLCBidXQgIiAr
IG5hbWVzcGFjZSArICIuIiArIGNsYXNzaWZ5KG5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAg
ICIgZGlkIG5vdCBleGlzdCBhbmQgeW91IGRpZCBub3Qgb3ZlcnJpZGUgeW91ciByb3V0ZSdzIGBt
b2RlbGAgIiArCi0gICAgICAgICAgICAgICAgICAgICAiaG9vay4iLCBtb2RlbENsYXNzKTsKLQot
ICAgICAgICByZXR1cm4gbW9kZWxDbGFzcy5maW5kKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Owot
ICB9KSwKLQotICAvKioKLSAgICBBIGhvb2sgeW91IGNhbiBpbXBsZW1lbnQgdG8gY29udmVydCB0
aGUgcm91dGUncyBtb2RlbCBpbnRvIHBhcmFtZXRlcnMKLSAgICBmb3IgdGhlIFVSTC4KLQotICAg
IGBgYGpzCi0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJlc291
cmNlKCdwb3N0Jywge3BhdGg6ICcvcG9zdHMvOnBvc3RfaWQnfSk7Ci0gICAgfSk7Ci0KLSAgICBB
cHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIG1vZGVsOiBmdW5jdGlv
bihwYXJhbXMpIHsKLSAgICAgICAgLy8gdGhlIHNlcnZlciByZXR1cm5zIGB7IGlkOiAxMiB9YAot
ICAgICAgICByZXR1cm4galF1ZXJ5LmdldEpTT04oIi9wb3N0cy8iICsgcGFyYW1zLnBvc3RfaWQp
OwotICAgICAgfSwKLQotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2RlbCkgewotICAgICAg
ICAvLyB0aGlzIHdpbGwgbWFrZSB0aGUgVVJMIGAvcG9zdHMvMTJgCi0gICAgICAgIHJldHVybiB7
IHBvc3RfaWQ6IG1vZGVsLmlkIH07Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBU
aGUgZGVmYXVsdCBgc2VyaWFsaXplYCBtZXRob2Qgd2lsbCBpbnNlcnQgdGhlIG1vZGVsJ3MgYGlk
YCBpbnRvIHRoZQotICAgIHJvdXRlJ3MgZHluYW1pYyBzZWdtZW50IChpbiB0aGlzIGNhc2UsIGA6
cG9zdF9pZGApIGlmIHRoZSBzZWdtZW50IGNvbnRhaW5zICdfaWQnLgotICAgIElmIHRoZSByb3V0
ZSBoYXMgbXVsdGlwbGUgZHluYW1pYyBzZWdtZW50cyBvciBkb2VzIG5vdCBjb250YWluICdfaWQn
LCBgc2VyaWFsaXplYAotICAgIHdpbGwgcmV0dXJuIGBFbWJlci5nZXRQcm9wZXJ0aWVzKG1vZGVs
LCBwYXJhbXMpYAotCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYHRyYW5zaXRpb25U
b2AgaXMgY2FsbGVkIHdpdGggYSBjb250ZXh0Ci0gICAgaW4gb3JkZXIgdG8gcG9wdWxhdGUgdGhl
IFVSTC4KLQotICAgIEBtZXRob2Qgc2VyaWFsaXplCi0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVs
IHRoZSByb3V0ZSdzIG1vZGVsCi0gICAgQHBhcmFtIHtBcnJheX0gcGFyYW1zIGFuIEFycmF5IG9m
IHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1cnJlbnQKLSAgICAgIHJvdXRlIChpbiB0aGUgZXhh
bXBsZSwgYFsncG9zdF9pZCddYC4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBzZXJpYWxpemVk
IHBhcmFtZXRlcnMKLSAgKi8KLSAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2RlbCwgcGFyYW1zKSB7
Ci0gICAgaWYgKHBhcmFtcy5sZW5ndGggPCAxKSB7IHJldHVybjsgfQotICAgIGlmICghbW9kZWwp
IHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbmFtZSA9IHBhcmFtc1swXSwgb2JqZWN0ID0ge307Ci0K
LSAgICBpZiAoL19pZCQvLnRlc3QobmFtZSkgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMSkgewotICAg
ICAgb2JqZWN0W25hbWVdID0gZ2V0KG1vZGVsLCAiaWQiKTsKLSAgICB9IGVsc2UgewotICAgICAg
b2JqZWN0ID0gZ2V0UHJvcGVydGllcyhtb2RlbCwgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gb2JqZWN0OwotICB9LAotCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBzZXR1
cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUuCi0KLSAgICBUaGlzIG1ldGhv
ZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUgYW5k
IHRoZQotICAgIG1vZGVsIHN1cHBsaWVkIGJ5IHRoZSBgbW9kZWxgIGhvb2suCi0KLSAgICBCeSBk
ZWZhdWx0LCB0aGUgYHNldHVwQ29udHJvbGxlcmAgaG9vayBzZXRzIHRoZSBgY29udGVudGAgcHJv
cGVydHkgb2YKLSAgICB0aGUgY29udHJvbGxlciB0byB0aGUgYG1vZGVsYC4KLQotICAgIFRoaXMg
bWVhbnMgdGhhdCB5b3VyIHRlbXBsYXRlIHdpbGwgZ2V0IGEgcHJveHkgZm9yIHRoZSBtb2RlbCBh
cyBpdHMKLSAgICBjb250ZXh0LCBhbmQgeW91IGNhbiBhY3QgYXMgdGhvdWdoIHRoZSBtb2RlbCBp
dHNlbGYgd2FzIHRoZSBjb250ZXh0LgotCi0gICAgVGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2ls
bCBiZSBvbmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIG5hbWUKLSAgICBvZiB0aGlzIHJvdXRlLgot
Ci0gICAgSWYgbm8gZXhwbGljaXQgY29udHJvbGxlciBpcyBkZWZpbmVkLCBFbWJlciB3aWxsIGF1
dG9tYXRpY2FsbHkgY3JlYXRlCi0gICAgYW4gYXBwcm9wcmlhdGUgY29udHJvbGxlciBmb3IgdGhl
IG1vZGVsLgotCi0gICAgKiBpZiB0aGUgbW9kZWwgaXMgYW4gYEVtYmVyLkFycmF5YCAoaW5jbHVk
aW5nIHJlY29yZCBhcnJheXMgZnJvbSBFbWJlcgotICAgICAgRGF0YSksIHRoZSBjb250cm9sbGVy
IGlzIGFuIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgLgotICAgICogb3RoZXJ3aXNlLCB0aGUgY29u
dHJvbGxlciBpcyBhbiBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAuCi0KLSAgICBBcyBhbiBleGFt
cGxlLCBjb25zaWRlciB0aGUgcm91dGVyOgotCi0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1h
cChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0
cy86cG9zdF9pZCd9KTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEZvciB0aGUgYHBvc3RgIHJv
dXRlLCBhIGNvbnRyb2xsZXIgbmFtZWQgYEFwcC5Qb3N0Q29udHJvbGxlcmAgd291bGQKLSAgICBi
ZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBhbiBgRW1iZXIu
T2JqZWN0Q29udHJvbGxlcmAKLSAgICBpbnN0YW5jZSB3b3VsZCBiZSB1c2VkLgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5k
KHsKLSAgICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rpb24oY29udHJvbGxlciwgbW9kZWwpIHsK
LSAgICAgICAgY29udHJvbGxlci5zZXQoJ21vZGVsJywgbW9kZWwpOwotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXR1cENvbnRyb2xsZXIKLSAgICBAcGFyYW0ge0Nv
bnRyb2xsZXJ9IGNvbnRyb2xsZXIgaW5zdGFuY2UKLSAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwK
LSAgKi8KLSAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBjb250ZXh0KSB7
Ci0gICAgaWYgKGNvbnRyb2xsZXIgJiYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkpIHsKLSAgICAg
IHNldChjb250cm9sbGVyLCAnbW9kZWwnLCBjb250ZXh0KTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgUmV0dXJucyB0aGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIG9yIG5h
bWUuCi0KLSAgICBUaGUgY29udHJvbGxlciBpbnN0YW5jZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVu
IGNyZWF0ZWQsIGVpdGhlciB0aHJvdWdoIGVudGVyaW5nIHRoZQotICAgIGFzc29jaWF0ZWQgcm91
dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJvbGxlcmAuCi0KLSAgICBgYGBqcwotICAgIEFwcC5Q
b3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgc2V0dXBDb250cm9sbGVyOiBm
dW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7Ci0gICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xs
ZXIsIHBvc3QpOwotICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ3Bvc3RzJykuc2V0KCdjdXJy
ZW50UG9zdCcsIHBvc3QpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBjb250cm9sbGVyRm9yCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhl
IHJvdXRlIG9yIGNvbnRyb2xsZXIKLSAgICBAcmV0dXJuIHtFbWJlci5Db250cm9sbGVyfQotICAq
LwotICBjb250cm9sbGVyRm9yOiBmdW5jdGlvbihuYW1lLCBfc2tpcEFzc2VydCkgewotICAgIHZh
ciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKLSAgICAgICAgcm91dGUgPSBjb250YWluZXIu
bG9va3VwKCdyb3V0ZTonK25hbWUpLAotICAgICAgICBjb250cm9sbGVyOwotCi0gICAgaWYgKHJv
dXRlICYmIHJvdXRlLmNvbnRyb2xsZXJOYW1lKSB7Ci0gICAgICBuYW1lID0gcm91dGUuY29udHJv
bGxlck5hbWU7Ci0gICAgfQotCi0gICAgY29udHJvbGxlciA9IGNvbnRhaW5lci5sb29rdXAoJ2Nv
bnRyb2xsZXI6JyArIG5hbWUpOwotCi0gICAgLy8gTk9URTogV2UncmUgc3BlY2lmaWNhbGx5IGNo
ZWNraW5nIHRoYXQgc2tpcEFzc2VydCBpcyB0cnVlLCBiZWNhdXNlIGFjY29yZGluZwotICAgIC8v
ICAgdG8gdGhlIG9sZCBBUEkgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIG1vZGVsLiBXZSBkbyBu
b3Qgd2FudCBwZW9wbGUgd2hvCi0gICAgLy8gICBwYXNzZWQgYSBtb2RlbCB0byBza2lwIHRoZSBh
c3NlcnRpb24uCi0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgY29udHJvbGxlciBuYW1lZCAnIituYW1l
KyInIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlICIgKwotICAgICAgICAgICAgICAgICAi
dGhhdCB0aGlzIHJvdXRlIGV4aXN0cyBhbmQgaGFzIGFscmVhZHkgYmVlbiBlbnRlcmVkIGF0IGxl
YXN0ICIgKwotICAgICAgICAgICAgICAgICAib25jZS4gSWYgeW91IGFyZSBhY2Nlc3NpbmcgYSBj
b250cm9sbGVyIG5vdCBhc3NvY2lhdGVkIHdpdGggYSAiICsKLSAgICAgICAgICAgICAgICAgInJv
dXRlLCBtYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgY2xhc3MgaXMgZXhwbGljaXRseSBkZWZpbmVk
LiIsCi0gICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgfHwgX3NraXBBc3NlcnQgPT09IHRydWUp
OwotCi0gICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2VuZXJhdGVz
IGEgY29udHJvbGxlciBmb3IgYSByb3V0ZS4KLQotICAgIElmIHRoZSBvcHRpb25hbCBtb2RlbCBp
cyBwYXNzZWQgdGhlbiB0aGUgY29udHJvbGxlciB0eXBlIGlzIGRldGVybWluZWQgYXV0b21hdGlj
YWxseSwKLSAgICBlLmcuLCBhbiBBcnJheUNvbnRyb2xsZXIgZm9yIGFycmF5cy4KLQotICAgIEV4
YW1wbGUKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7Ci0gICAgICBzZXR1cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIHBvc3QpIHsK
LSAgICAgICAgdGhpcy5fc3VwZXIoY29udHJvbGxlciwgcG9zdCk7Ci0gICAgICAgIHRoaXMuZ2Vu
ZXJhdGVDb250cm9sbGVyKCdwb3N0cycsIHBvc3QpOwotICAgICAgfQotICAgIH0pOwotICAgIGBg
YAotCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUNvbnRyb2xsZXIKLSAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBtb2Rl
bCB0aGUgbW9kZWwgdG8gaW5mZXIgdGhlIHR5cGUgb2YgdGhlIGNvbnRyb2xsZXIgKG9wdGlvbmFs
KQotICAqLwotICBnZW5lcmF0ZUNvbnRyb2xsZXI6IGZ1bmN0aW9uKG5hbWUsIG1vZGVsKSB7Ci0g
ICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwotCi0gICAgbW9kZWwgPSBtb2RlbCB8
fCB0aGlzLm1vZGVsRm9yKG5hbWUpOwotCi0gICAgcmV0dXJuIEVtYmVyLmdlbmVyYXRlQ29udHJv
bGxlcihjb250YWluZXIsIG5hbWUsIG1vZGVsKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5z
IHRoZSBtb2RlbCBvZiBhIHBhcmVudCAob3IgYW55IGFuY2VzdG9yKSByb3V0ZQotICAgIGluIGEg
cm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEgdHJhbnNpdGlvbiwgYWxsIHJvdXRlcwotICAgIG11
c3QgcmVzb2x2ZSBhIG1vZGVsIG9iamVjdCwgYW5kIGlmIGEgcm91dGUKLSAgICBuZWVkcyBhY2Nl
c3MgdG8gYSBwYXJlbnQgcm91dGUncyBtb2RlbCBpbiBvcmRlciB0bwotICAgIHJlc29sdmUgYSBt
b2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9kZWwgZnJvbSBhIHBhcmVudCksCi0gICAgaXQgY2Fu
IGNhbGwgYHRoaXMubW9kZWxGb3IodGhlTmFtZU9mUGFyZW50Um91dGUpYCB0bwotICAgIHJldHJp
ZXZlIGl0LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChm
dW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0
Lzpwb3N0X2lkJyB9LCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHRoaXMucmVzb3VyY2UoJ2Nv
bW1lbnRzJyk7Ci0gICAgICAgIH0pOwotICAgIH0pOwotCi0gICAgQXBwLkNvbW1lbnRzUm91dGUg
PSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgICAgIHRoaXMuc2V0KCdwb3N0JywgdGhpcy5tb2RlbEZvcigncG9zdCcpKTsKLSAg
ICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQotICAgIEByZXR1cm4ge09i
amVjdH0gdGhlIG1vZGVsIG9iamVjdAotICAqLwotICBtb2RlbEZvcjogZnVuY3Rpb24obmFtZSkg
ewotCi0gICAgdmFyIHJvdXRlID0gdGhpcy5jb250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFt
ZSksCi0gICAgICAgIHRyYW5zaXRpb24gPSB0aGlzLnJvdXRlci5yb3V0ZXIuYWN0aXZlVHJhbnNp
dGlvbjsKLQotICAgIC8vIElmIHdlIGFyZSBtaWQtdHJhbnNpdGlvbiwgd2Ugd2FudCB0byB0cnkg
YW5kIGxvb2sgdXAKLSAgICAvLyByZXNvbHZlZCBwYXJlbnQgY29udGV4dHMgb24gdGhlIGN1cnJl
bnQgdHJhbnNpdGlvbkV2ZW50LgotICAgIGlmICh0cmFuc2l0aW9uKSB7Ci0gICAgICB2YXIgbW9k
ZWxMb29rdXBOYW1lID0gKHJvdXRlICYmIHJvdXRlLnJvdXRlTmFtZSkgfHwgbmFtZTsKLSAgICAg
IGlmICh0cmFuc2l0aW9uLnJlc29sdmVkTW9kZWxzLmhhc093blByb3BlcnR5KG1vZGVsTG9va3Vw
TmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxM
b29rdXBOYW1lXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcm91dGUgJiYgcm91dGUu
Y3VycmVudE1vZGVsOwotICB9LAotCi0gIC8qKgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBy
ZW5kZXIgdGhlIHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCByb3V0ZS4KLQotICAgIFRoaXMgbWV0
aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb250cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZSBh
bmQgdGhlCi0gICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9vay4gQnkgZGVmYXVs
dCwgaXQgcmVuZGVycyB0aGUgcm91dGUncwotICAgIHRlbXBsYXRlLCBjb25maWd1cmVkIHdpdGgg
dGhlIGNvbnRyb2xsZXIgZm9yIHRoZSByb3V0ZS4KLQotICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBv
dmVycmlkZGVuIHRvIHNldCB1cCBhbmQgcmVuZGVyIGFkZGl0aW9uYWwgb3IKLSAgICBhbHRlcm5h
dGl2ZSB0ZW1wbGF0ZXMuCi0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVy
LCBtb2RlbCkgewotICAgICAgICB2YXIgZmF2Q29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlckZv
cignZmF2b3JpdGVQb3N0Jyk7Ci0KLSAgICAgICAgLy8gUmVuZGVyIHRoZSBgZmF2b3JpdGVQb3N0
YCB0ZW1wbGF0ZSBpbnRvCi0gICAgICAgIC8vIHRoZSBvdXRsZXQgYHBvc3RzYCwgYW5kIGRpc3Bs
YXkgdGhlIGBmYXZvcml0ZVBvc3RgCi0gICAgICAgIC8vIGNvbnRyb2xsZXIuCi0gICAgICAgIHRo
aXMucmVuZGVyKCdmYXZvcml0ZVBvc3QnLCB7Ci0gICAgICAgICAgb3V0bGV0OiAncG9zdHMnLAot
ICAgICAgICAgIGNvbnRyb2xsZXI6IGZhdkNvbnRyb2xsZXIKLSAgICAgICAgfSk7Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbmRlclRlbXBsYXRlCi0gICAgQHBh
cmFtIHtPYmplY3R9IGNvbnRyb2xsZXIgdGhlIHJvdXRlJ3MgY29udHJvbGxlcgotICAgIEBwYXJh
bSB7T2JqZWN0fSBtb2RlbCB0aGUgcm91dGUncyBtb2RlbAotICAqLwotICByZW5kZXJUZW1wbGF0
ZTogZnVuY3Rpb24oY29udHJvbGxlciwgbW9kZWwpIHsKLSAgICB0aGlzLnJlbmRlcigpOwotICB9
LAotCi0gIC8qKgotICAgIFJlbmRlcnMgYSB0ZW1wbGF0ZSBpbnRvIGFuIG91dGxldC4KLQotICAg
IFRoaXMgbWV0aG9kIGhhcyBhIG51bWJlciBvZiBkZWZhdWx0cywgYmFzZWQgb24gdGhlIG5hbWUg
b2YgdGhlCi0gICAgcm91dGUgc3BlY2lmaWVkIGluIHRoZSByb3V0ZXIuCi0KLSAgICBGb3IgZXhh
bXBsZToKLQotICAgIGBgYGpzCi0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAg
ICB0aGlzLnJvdXRlKCdpbmRleCcpOwotICAgICAgdGhpcy5yZXNvdXJjZSgncG9zdCcsIHtwYXRo
OiAnL3Bvc3RzLzpwb3N0X2lkJ30pOwotICAgIH0pOwotCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFw
cC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAg
ICAgICB0aGlzLnJlbmRlcigpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhl
IG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBhcyBkZWZpbmVkIGJ5IHRoZSByb3V0ZXIsIGlzIGBw
b3N0YC4KLQotICAgIEJ5IGRlZmF1bHQsIHJlbmRlciB3aWxsOgotCi0gICAgKiByZW5kZXIgdGhl
IGBwb3N0YCB0ZW1wbGF0ZQotICAgICogd2l0aCB0aGUgYHBvc3RgIHZpZXcgKGBQb3N0Vmlld2Ap
IGZvciBldmVudCBoYW5kbGluZywgaWYgb25lIGV4aXN0cwotICAgICogYW5kIHRoZSBgcG9zdGAg
Y29udHJvbGxlciAoYFBvc3RDb250cm9sbGVyYCksIGlmIG9uZSBleGlzdHMKLSAgICAqIGludG8g
dGhlIGBtYWluYCBvdXRsZXQgb2YgdGhlIGBhcHBsaWNhdGlvbmAgdGVtcGxhdGUKLQotICAgIFlv
dSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvcjoKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RS
b3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9u
KCkgewotICAgICAgICB0aGlzLnJlbmRlcignbXlQb3N0JywgeyAgIC8vIHRoZSB0ZW1wbGF0ZSB0
byByZW5kZXIKLSAgICAgICAgICBpbnRvOiAnaW5kZXgnLCAgICAgICAgICAvLyB0aGUgdGVtcGxh
dGUgdG8gcmVuZGVyIGludG8KLSAgICAgICAgICBvdXRsZXQ6ICdkZXRhaWwnLCAgICAgICAvLyB0
aGUgbmFtZSBvZiB0aGUgb3V0bGV0IGluIHRoYXQgdGVtcGxhdGUKLSAgICAgICAgICBjb250cm9s
bGVyOiAnYmxvZ1Bvc3QnICAvLyB0aGUgY29udHJvbGxlciB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0
ZQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFJlbWVtYmVy
IHRoYXQgdGhlIGNvbnRyb2xsZXIncyBgY29udGVudGAgd2lsbCBiZSB0aGUgcm91dGUncyBtb2Rl
bC4gSW4KLSAgICB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IG1vZGVsIHdpbGwgYmUgYEFwcC5Qb3N0
LmZpbmQocGFyYW1zLnBvc3RfaWQpYC4KLQotICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIHJlbmRlcgotICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zCi0gICovCi0gIHJlbmRlcjogZnVuY3Rp
b24obmFtZSwgb3B0aW9ucykgewotICAgIEVtYmVyLmFzc2VydCgiVGhlIG5hbWUgaW4gdGhlIGdp
dmVuIGFyZ3VtZW50cyBpcyB1bmRlZmluZWQiLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/ICFFbWJl
ci5pc05vbmUoYXJndW1lbnRzWzBdKSA6IHRydWUpOwotCi0gICAgdmFyIG5hbWVQYXNzZWQgPSAh
IW5hbWU7Ci0KLSAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnICYmICFvcHRpb25zKSB7
Ci0gICAgICBvcHRpb25zID0gbmFtZTsKLSAgICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAg
ICB9Ci0KLSAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgIHZhciB0ZW1wbGF0ZU5h
bWU7Ci0KLSAgICBpZiAobmFtZSkgewotICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXC8vZywg
Jy4nKTsKLSAgICAgIHRlbXBsYXRlTmFtZSA9IG5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5h
bWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAgICAgIHRlbXBsYXRlTmFtZSA9IHRoaXMudGVtcGxhdGVO
YW1lIHx8IG5hbWU7Ci0gICAgfQotCi0gICAgdmFyIHZpZXdOYW1lID0gb3B0aW9ucy52aWV3IHx8
IHRoaXMudmlld05hbWUgfHwgbmFtZTsKLQotICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRh
aW5lciwKLSAgICAgICAgdmlldyA9IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyArIHZpZXdOYW1l
KSwKLSAgICAgICAgdGVtcGxhdGUgPSB2aWV3ID8gdmlldy5nZXQoJ3RlbXBsYXRlJykgOiBudWxs
OwotCi0gICAgaWYgKCF0ZW1wbGF0ZSkgewotICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9v
a3VwKCd0ZW1wbGF0ZTonICsgdGVtcGxhdGVOYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIXZpZXcg
JiYgIXRlbXBsYXRlKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIFwiIiAr
IG5hbWUgKyAiXCIgdGVtcGxhdGUgb3Igdmlldy4iLCAhbmFtZVBhc3NlZCk7Ci0gICAgICBpZiAo
Z2V0KHRoaXMucm91dGVyLCAnbmFtZXNwYWNlLkxPR19WSUVXX0xPT0tVUFMnKSkgewotICAgICAg
ICBFbWJlci5Mb2dnZXIuaW5mbygiQ291bGQgbm90IGZpbmQgXCIiICsgbmFtZSArICJcIiB0ZW1w
bGF0ZSBvciB2aWV3LiBOb3RoaW5nIHdpbGwgYmUgcmVuZGVyZWQiLCB7IGZ1bGxOYW1lOiAndGVt
cGxhdGU6JyArIG5hbWUgfSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
b3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnModGhpcywgbmFtZSwgdGVtcGxhdGUsIG9wdGlvbnMp
OwotICAgIHZpZXcgPSBzZXR1cFZpZXcodmlldywgY29udGFpbmVyLCBvcHRpb25zKTsKLQotICAg
IGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21haW4nKSB7IHRoaXMubGFzdFJlbmRlcmVkVGVtcGxh
dGUgPSBuYW1lOyB9Ci0KLSAgICBhcHBlbmRWaWV3KHRoaXMsIHZpZXcsIG9wdGlvbnMpOwotICB9
LAotCi0gIC8qKgotICAgIERpc2Nvbm5lY3RzIGEgdmlldyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVk
IGludG8gYW4gb3V0bGV0LgotCi0gICAgWW91IG1heSBwYXNzIGFueSBvciBhbGwgb2YgdGhlIGZv
bGxvd2luZyBvcHRpb25zIHRvIGBkaXNjb25uZWN0T3V0bGV0YDoKLQotICAgICogYG91dGxldGA6
IHRoZSBuYW1lIG9mIHRoZSBvdXRsZXQgdG8gY2xlYXIgKGRlZmF1bHQ6ICdtYWluJykKLSAgICAq
IGBwYXJlbnRWaWV3YDogdGhlIG5hbWUgb2YgdGhlIHZpZXcgY29udGFpbmluZyB0aGUgb3V0bGV0
IHRvIGNsZWFyCi0gICAgICAgKGRlZmF1bHQ6IHRoZSB2aWV3IHJlbmRlcmVkIGJ5IHRoZSBwYXJl
bnQgcm91dGUpCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBganMKLSAgICBBcHAuQXBwbGljYXRp
b25Sb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBz
aG93TW9kYWw6IGZ1bmN0aW9uKGV2dCkgewotICAgICAgICAgIHRoaXMucmVuZGVyKGV2dC5tb2Rh
bE5hbWUsIHsKLSAgICAgICAgICAgIG91dGxldDogJ21vZGFsJywKLSAgICAgICAgICAgIGludG86
ICdhcHBsaWNhdGlvbicKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSwKLSAgICAgICAgaGlkZU1v
ZGFsOiBmdW5jdGlvbihldnQpIHsKLSAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdXRsZXQoewot
ICAgICAgICAgICAgb3V0bGV0OiAnbW9kYWwnLAotICAgICAgICAgICAgcGFyZW50VmlldzogJ2Fw
cGxpY2F0aW9uJwotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nvbm5lY3RPdXRsZXQKLSAgICBAcGFyYW0ge09iamVj
dH0gb3B0aW9ucyB0aGUgb3B0aW9ucwotICAqLwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlv
bihvcHRpb25zKSB7Ci0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gICAgb3B0aW9ucy5w
YXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRWaWV3ID8gb3B0aW9ucy5wYXJlbnRWaWV3LnJlcGxh
Y2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1wbGF0ZSh0aGlzKTsKLSAgICBvcHRpb25zLm91dGxl
dCA9IG9wdGlvbnMub3V0bGV0IHx8ICdtYWluJzsKLQotICAgIHZhciBwYXJlbnRWaWV3ID0gdGhp
cy5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcob3B0aW9ucy5wYXJlbnRWaWV3KTsKLSAgICBwYXJl
bnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3B0aW9ucy5vdXRsZXQpOwotICB9LAotCi0gIHdpbGxE
ZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnRlYXJkb3duVmlld3MoKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQG1ldGhvZCB0ZWFyZG93blZpZXdzCi0gICovCi0g
IHRlYXJkb3duVmlld3M6IGZ1bmN0aW9uKCkgewotICAgIC8vIFRlYXIgZG93biB0aGUgdG9wIGxl
dmVsIHZpZXcKLSAgICBpZiAodGhpcy50ZWFyZG93blRvcExldmVsVmlldykgeyB0aGlzLnRlYXJk
b3duVG9wTGV2ZWxWaWV3KCk7IH0KLQotICAgIC8vIFRlYXIgZG93biBhbnkgb3V0bGV0cyByZW5k
ZXJlZCB3aXRoICdpbnRvJwotICAgIHZhciB0ZWFyZG93bk91dGxldFZpZXdzID0gdGhpcy50ZWFy
ZG93bk91dGxldFZpZXdzIHx8IFtdOwotICAgIGFfZm9yRWFjaCh0ZWFyZG93bk91dGxldFZpZXdz
LCBmdW5jdGlvbih0ZWFyZG93bk91dGxldFZpZXcpIHsKLSAgICAgIHRlYXJkb3duT3V0bGV0Vmll
dygpOwotICAgIH0pOwotCi0gICAgZGVsZXRlIHRoaXMudGVhcmRvd25Ub3BMZXZlbFZpZXc7Ci0g
ICAgZGVsZXRlIHRoaXMudGVhcmRvd25PdXRsZXRWaWV3czsKLSAgICBkZWxldGUgdGhpcy5sYXN0
UmVuZGVyZWRUZW1wbGF0ZTsKLSAgfQotfSk7Ci0KLWZ1bmN0aW9uIHBhcmVudFJvdXRlKHJvdXRl
KSB7Ci0gIHZhciBoYW5kbGVySW5mb3MgPSByb3V0ZS5yb3V0ZXIucm91dGVyLnRhcmdldEhhbmRs
ZXJJbmZvczsKLQotICBpZiAoIWhhbmRsZXJJbmZvcykgeyByZXR1cm47IH0KLQotICB2YXIgcGFy
ZW50LCBjdXJyZW50OwotCi0gIGZvciAodmFyIGk9MCwgbD1oYW5kbGVySW5mb3MubGVuZ3RoOyBp
PGw7IGkrKykgewotICAgIGN1cnJlbnQgPSBoYW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKLSAgICBp
ZiAoY3VycmVudCA9PT0gcm91dGUpIHsgcmV0dXJuIHBhcmVudDsgfQotICAgIHBhcmVudCA9IGN1
cnJlbnQ7Ci0gIH0KLX0KLQotZnVuY3Rpb24gcGFyZW50VGVtcGxhdGUocm91dGUpIHsKLSAgdmFy
IHBhcmVudCA9IHBhcmVudFJvdXRlKHJvdXRlKSwgdGVtcGxhdGU7Ci0KLSAgaWYgKCFwYXJlbnQp
IHsgcmV0dXJuOyB9Ci0KLSAgaWYgKHRlbXBsYXRlID0gcGFyZW50Lmxhc3RSZW5kZXJlZFRlbXBs
YXRlKSB7Ci0gICAgcmV0dXJuIHRlbXBsYXRlOwotICB9IGVsc2UgewotICAgIHJldHVybiBwYXJl
bnRUZW1wbGF0ZShwYXJlbnQpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnMo
cm91dGUsIG5hbWUsIHRlbXBsYXRlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25zIHx8
IHt9OwotICBvcHRpb25zLmludG8gPSBvcHRpb25zLmludG8gPyBvcHRpb25zLmludG8ucmVwbGFj
ZSgvXC8vZywgJy4nKSA6IHBhcmVudFRlbXBsYXRlKHJvdXRlKTsKLSAgb3B0aW9ucy5vdXRsZXQg
PSBvcHRpb25zLm91dGxldCB8fCAnbWFpbic7Ci0gIG9wdGlvbnMubmFtZSA9IG5hbWU7Ci0gIG9w
dGlvbnMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgb3B0aW9ucy5MT0dfVklFV19MT09LVVBTID0g
Z2V0KHJvdXRlLnJvdXRlciwgJ25hbWVzcGFjZS5MT0dfVklFV19MT09LVVBTJyk7Ci0KLSAgRW1i
ZXIuYXNzZXJ0KCJBbiBvdXRsZXQgKCIrb3B0aW9ucy5vdXRsZXQrIikgd2FzIHNwZWNpZmllZCBi
dXQgd2FzIG5vdCBmb3VuZC4iLCBvcHRpb25zLm91dGxldCA9PT0gJ21haW4nIHx8IG9wdGlvbnMu
aW50byk7Ci0KLSAgdmFyIGNvbnRyb2xsZXIgPSBvcHRpb25zLmNvbnRyb2xsZXIsIG5hbWVkQ29u
dHJvbGxlcjsKLQotICBpZiAob3B0aW9ucy5jb250cm9sbGVyKSB7Ci0gICAgY29udHJvbGxlciA9
IG9wdGlvbnMuY29udHJvbGxlcjsKLSAgfSBlbHNlIGlmIChuYW1lZENvbnRyb2xsZXIgPSByb3V0
ZS5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBuYW1lKSkgewotICAgIGNvbnRyb2xs
ZXIgPSBuYW1lZENvbnRyb2xsZXI7Ci0gIH0gZWxzZSB7Ci0gICAgY29udHJvbGxlciA9IHJvdXRl
LmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJvdXRlTmFtZTsKLSAgfQotCi0gIGlmICh0eXBlb2Yg
Y29udHJvbGxlciA9PT0gJ3N0cmluZycpIHsKLSAgICBjb250cm9sbGVyID0gcm91dGUuY29udGFp
bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlcik7Ci0gIH0KLQotICBvcHRpb25z
LmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotCi0gIHJldHVybiBvcHRpb25zOwotfQotCi1mdW5j
dGlvbiBzZXR1cFZpZXcodmlldywgY29udGFpbmVyLCBvcHRpb25zKSB7Ci0gIGlmICh2aWV3KSB7
Ci0gICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdfTE9PS1VQUykgewotICAgICAgRW1iZXIuTG9nZ2Vy
LmluZm8oIlJlbmRlcmluZyAiICsgb3B0aW9ucy5uYW1lICsgIiB3aXRoICIgKyB2aWV3LCB7IGZ1
bGxOYW1lOiAndmlldzonICsgb3B0aW9ucy5uYW1lIH0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAg
ICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25zLmludG8gPyAndmlldzpkZWZhdWx0JyA6ICd2aWV3
OnRvcGxldmVsJzsKLSAgICB2aWV3ID0gY29udGFpbmVyLmxvb2t1cChkZWZhdWx0Vmlldyk7Ci0g
ICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdfTE9PS1VQUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmlu
Zm8oIlJlbmRlcmluZyAiICsgb3B0aW9ucy5uYW1lICsgIiB3aXRoIGRlZmF1bHQgdmlldyAiICsg
dmlldywgeyBmdWxsTmFtZTogJ3ZpZXc6JyArIG9wdGlvbnMubmFtZSB9KTsKLSAgICB9Ci0gIH0K
LQotICBpZiAoIWdldCh2aWV3LCAndGVtcGxhdGVOYW1lJykpIHsKLSAgICBzZXQodmlldywgJ3Rl
bXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7Ci0KLSAgICBzZXQodmlldywgJ19kZWJ1Z1RlbXBs
YXRlTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0gIH0KLQotICBzZXQodmlldywgJ3JlbmRlcmVkTmFt
ZScsIG9wdGlvbnMubmFtZSk7Ci0gIHNldCh2aWV3LCAnY29udHJvbGxlcicsIG9wdGlvbnMuY29u
dHJvbGxlcik7Ci0KLSAgcmV0dXJuIHZpZXc7Ci19Ci0KLWZ1bmN0aW9uIGFwcGVuZFZpZXcocm91
dGUsIHZpZXcsIG9wdGlvbnMpIHsKLSAgaWYgKG9wdGlvbnMuaW50bykgewotICAgIHZhciBwYXJl
bnRWaWV3ID0gcm91dGUucm91dGVyLl9sb29rdXBBY3RpdmVWaWV3KG9wdGlvbnMuaW50byk7Ci0g
ICAgdmFyIHRlYXJkb3duT3V0bGV0VmlldyA9IGdlbmVyYXRlT3V0bGV0VGVhcmRvd24ocGFyZW50
Vmlldywgb3B0aW9ucy5vdXRsZXQpOwotICAgIGlmICghcm91dGUudGVhcmRvd25PdXRsZXRWaWV3
cykgeyByb3V0ZS50ZWFyZG93bk91dGxldFZpZXdzID0gW107IH0KLSAgICBhX3JlcGxhY2Uocm91
dGUudGVhcmRvd25PdXRsZXRWaWV3cywgMCwgMCwgW3RlYXJkb3duT3V0bGV0Vmlld10pOwotICAg
IHBhcmVudFZpZXcuY29ubmVjdE91dGxldChvcHRpb25zLm91dGxldCwgdmlldyk7Ci0gIH0gZWxz
ZSB7Ci0gICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0KHJvdXRlLCAncm91dGVyLm5hbWVzcGFjZS5y
b290RWxlbWVudCcpOwotICAgIC8vIHRlYXIgZG93biB2aWV3IGlmIG9uZSBpcyBhbHJlYWR5IHJl
bmRlcmVkCi0gICAgaWYgKHJvdXRlLnRlYXJkb3duVG9wTGV2ZWxWaWV3KSB7Ci0gICAgICByb3V0
ZS50ZWFyZG93blRvcExldmVsVmlldygpOwotICAgIH0KLSAgICByb3V0ZS5yb3V0ZXIuX2Nvbm5l
Y3RBY3RpdmVWaWV3KG9wdGlvbnMubmFtZSwgdmlldyk7Ci0gICAgcm91dGUudGVhcmRvd25Ub3BM
ZXZlbFZpZXcgPSBnZW5lcmF0ZVRvcExldmVsVGVhcmRvd24odmlldyk7Ci0gICAgdmlldy5hcHBl
bmRUbyhyb290RWxlbWVudCk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gZ2VuZXJhdGVUb3BMZXZlbFRl
YXJkb3duKHZpZXcpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyB2aWV3LmRlc3Ryb3koKTsgfTsK
LX0KLQotZnVuY3Rpb24gZ2VuZXJhdGVPdXRsZXRUZWFyZG93bihwYXJlbnRWaWV3LCBvdXRsZXQp
IHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBwYXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3V0
bGV0KTsgfTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLUVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9u
KCkgewotICB2YXIgaGFuZGxlYmFyc1Jlc29sdmUgPSBFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQ
YXJhbXMsCi0gICAgICBtYXAgPSBFbWJlci5BcnJheVBvbHlmaWxscy5tYXAsCi0gICAgICBnZXQg
PSBFbWJlci5nZXQsCi0gICAgICBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQ7
Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtcyhjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsK
LSAgICByZXR1cm4gbWFwLmNhbGwocmVzb2x2ZVBhdGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9u
cyksIGZ1bmN0aW9uKHBhdGgsIGkpIHsKLSAgICAgIGlmIChudWxsID09PSBwYXRoKSB7Ci0gICAg
ICAgIC8vIFBhcmFtIHdhcyBzdHJpbmcvbnVtYmVyLCBub3QgYSBwYXRoLCBzbyBqdXN0IHJldHVy
biByYXcgc3RyaW5nL251bWJlci4KLSAgICAgICAgcmV0dXJuIHBhcmFtc1tpXTsKLSAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGViYXJzR2V0KGNvbnRleHQsIHBhdGgsIG9wdGlv
bnMpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhdGhzKGNv
bnRleHQsIHBhcmFtcywgb3B0aW9ucykgewotICAgIHZhciByZXNvbHZlZCA9IGhhbmRsZWJhcnNS
ZXNvbHZlKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucyksCi0gICAgICAgIHR5cGVzID0gb3B0aW9u
cy50eXBlczsKLQotICAgIHJldHVybiBtYXAuY2FsbChyZXNvbHZlZCwgZnVuY3Rpb24ob2JqZWN0
LCBpKSB7Ci0gICAgICBpZiAodHlwZXNbaV0gPT09ICdJRCcpIHsKLSAgICAgICAgcmV0dXJuIHVu
d3JhcChvYmplY3QsIHBhcmFtc1tpXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4g
bnVsbDsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGZ1bmN0aW9uIHVud3JhcChvYmplY3QsIHBh
dGgpIHsKLSAgICAgIGlmIChwYXRoID09PSAnY29udHJvbGxlcicpIHsgcmV0dXJuIHBhdGg7IH0K
LQotICAgICAgaWYgKEVtYmVyLkNvbnRyb2xsZXJNaXhpbi5kZXRlY3Qob2JqZWN0KSkgewotICAg
ICAgICByZXR1cm4gdW53cmFwKGdldChvYmplY3QsICdtb2RlbCcpLCBwYXRoID8gcGF0aCArICcu
bW9kZWwnIDogJ21vZGVsJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcGF0aDsK
LSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcyA9IHJl
c29sdmVQYXJhbXM7Ci0gIEVtYmVyLlJvdXRlci5yZXNvbHZlUGF0aHMgPSByZXNvbHZlUGF0aHM7
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg
PSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVy
LkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7Ci0KLSAgdmFyIHJlc29sdmVQYXJh
bXMgPSBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcywKLSAgICAgIHJlc29sdmVQYXRocyAgPSBF
bWJlci5Sb3V0ZXIucmVzb2x2ZVBhdGhzLAotICAgICAgaXNTaW1wbGVDbGljayA9IEVtYmVyLlZp
ZXdVdGlscy5pc1NpbXBsZUNsaWNrOwotCi0gIGZ1bmN0aW9uIGZ1bGxSb3V0ZU5hbWUocm91dGVy
LCBuYW1lKSB7Ci0gICAgdmFyIG5hbWVXaXRoSW5kZXg7Ci0gICAgaWYgKCFyb3V0ZXIuaGFzUm91
dGUobmFtZSkpIHsKLSAgICAgIG5hbWVXaXRoSW5kZXggPSBuYW1lICsgJy5pbmRleCc7Ci0gICAg
ICBFbWJlci5hc3NlcnQoZm10KCJUaGUgYXR0ZW1wdCB0byBsaW5rLXRvIHJvdXRlICclQCcgZmFp
bGVkIChhbHNvIHRyaWVkICclQCcpLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBy
b3V0ZXIgZGlkIG5vdCBmaW5kICclQCcgaW4gaXRzIHBvc3NpYmxlIHJvdXRlczogJyVAJyIsCi0g
ICAgICAgICAgICAgICAgICAgICAgIFtuYW1lLCBuYW1lV2l0aEluZGV4LCBuYW1lLCBFbWJlci5r
ZXlzKHJvdXRlci5yb3V0ZXIucmVjb2duaXplci5uYW1lcykuam9pbigiJywgJyIpXSksCi0gICAg
ICAgICAgICAgICAgICAgICAgIHJvdXRlci5oYXNSb3V0ZShuYW1lV2l0aEluZGV4KSk7Ci0gICAg
ICBuYW1lID0gbmFtZVdpdGhJbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQot
Ci0gIGZ1bmN0aW9uIGdldFJlc29sdmVkUGF0aHMob3B0aW9ucykgewotCi0gICAgdmFyIHR5cGVz
ID0gb3B0aW9ucy5vcHRpb25zLnR5cGVzLAotICAgICAgICBkYXRhID0gb3B0aW9ucy5vcHRpb25z
LmRhdGE7Ci0KLSAgICByZXR1cm4gcmVzb2x2ZVBhdGhzKG9wdGlvbnMuY29udGV4dCwgb3B0aW9u
cy5wYXJhbXMsIHsgdHlwZXM6IHR5cGVzLCBkYXRhOiBkYXRhIH0pOwotICB9Ci0KLSAgLyoqCi0g
ICAgYEVtYmVyLkxpbmtWaWV3YCByZW5kZXJzIGFuIGVsZW1lbnQgd2hvc2UgYGNsaWNrYCBldmVu
dCB0cmlnZ2VycyBhCi0gICAgdHJhbnNpdGlvbiBvZiB0aGUgYXBwbGljYXRpb24ncyBpbnN0YW5j
ZSBvZiBgRW1iZXIuUm91dGVyYCB0bwotICAgIGEgc3VwcGxpZWQgcm91dGUgYnkgbmFtZS4KLQot
ICAgIEluc3RhbmNlcyBvZiBgTGlua1ZpZXdgIHdpbGwgbW9zdCBsaWtlbHkgYmUgY3JlYXRlZCB0
aHJvdWdoCi0gICAgdGhlIGBsaW5rLXRvYCBIYW5kbGViYXJzIGhlbHBlciwgYnV0IHByb3BlcnRp
ZXMgb2YgdGhpcyBjbGFzcwotICAgIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBhcHBs
aWNhdGlvbi13aWRlIGJlaGF2aW9yLgotCi0gICAgQGNsYXNzIExpbmtWaWV3Ci0gICAgQG5hbWVz
cGFjZSBFbWJlcgotICAgIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgICBAc2VlIHtIYW5kbGViYXJz
LmhlbHBlcnMubGluay10b30KLSAgKiovCi0gIHZhciBMaW5rVmlldyA9IEVtYmVyLkxpbmtWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHRhZ05hbWU6ICdhJywKLSAgICBjdXJyZW50V2hl
bjogbnVsbCwKLQotICAgIC8qKgotICAgICAgU2V0cyB0aGUgYHRpdGxlYCBhdHRyaWJ1dGUgb2Yg
dGhlIGBMaW5rVmlld2AncyBIVE1MIGVsZW1lbnQuCi0KLSAgICAgIEBwcm9wZXJ0eSB0aXRsZQot
ICAgICAgQGRlZmF1bHQgbnVsbAotICAgICoqLwotICAgIHRpdGxlOiBudWxsLAotCi0gICAgLyoq
Ci0gICAgICBTZXRzIHRoZSBgcmVsYCBhdHRyaWJ1dGUgb2YgdGhlIGBMaW5rVmlld2AncyBIVE1M
IGVsZW1lbnQuCi0KLSAgICAgIEBwcm9wZXJ0eSByZWwKLSAgICAgIEBkZWZhdWx0IG51bGwKLSAg
ICAqKi8KLSAgICByZWw6IG51bGwsCi0KLSAgICAvKioKLSAgICAgIFRoZSBDU1MgY2xhc3MgdG8g
YXBwbHkgdG8gYExpbmtWaWV3YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGFjdGl2ZWAKLSAgICAgIHBy
b3BlcnR5IGlzIGB0cnVlYC4KLQotICAgICAgQHByb3BlcnR5IGFjdGl2ZUNsYXNzCi0gICAgICBA
dHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGFjdGl2ZQotICAgICoqLwotICAgIGFjdGl2ZUNs
YXNzOiAnYWN0aXZlJywKLQotICAgIC8qKgotICAgICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0
byBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVuIGl0cyBgbG9hZGluZ2AKLSAgICAgIHByb3BlcnR5
IGlzIGB0cnVlYC4KLQotICAgICAgQHByb3BlcnR5IGxvYWRpbmdDbGFzcwotICAgICAgQHR5cGUg
U3RyaW5nCi0gICAgICBAZGVmYXVsdCBsb2FkaW5nCi0gICAgKiovCi0gICAgbG9hZGluZ0NsYXNz
OiAnbG9hZGluZycsCi0KLSAgICAvKioKLSAgICAgIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8g
YSBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVuIGl0cyBgZGlzYWJsZWRgCi0gICAgICBwcm9wZXJ0
eSBpcyBgdHJ1ZWAuCi0KLSAgICAgIEBwcm9wZXJ0eSBkaXNhYmxlZENsYXNzCi0gICAgICBAdHlw
ZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGRpc2FibGVkCi0gICAgKiovCi0gICAgZGlzYWJsZWRD
bGFzczogJ2Rpc2FibGVkJywKLSAgICBfaXNEaXNhYmxlZDogZmFsc2UsCi0KLSAgICAvKioKLSAg
ICAgIERldGVybWluZXMgd2hldGhlciB0aGUgYExpbmtWaWV3YCB3aWxsIHRyaWdnZXIgcm91dGlu
ZyB2aWEKLSAgICAgIHRoZSBgcmVwbGFjZVdpdGhgIHJvdXRpbmcgc3RyYXRlZ3kuCi0KLSAgICAg
IEBwcm9wZXJ0eSByZXBsYWNlCi0gICAgICBAdHlwZSBCb29sZWFuCi0gICAgICBAZGVmYXVsdCBm
YWxzZQotICAgICoqLwotICAgIHJlcGxhY2U6IGZhbHNlLAotCi0gICAgLyoqCi0gICAgICBCeSBk
ZWZhdWx0IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciB3aWxsIGJpbmQgdG8gdGhlIGBocmVmYCBh
bmQKLSAgICAgIGB0aXRsZWAgYXR0cmlidXRlcy4gSXQncyBkaXNjb3VyYWdlIHRoYXQgeW91IG92
ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAotICAgICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0
aGUgYXJyYXkgaWYgbmVlZGVkLgotCi0gICAgICBAcHJvcGVydHkgYXR0cmlidXRlQmluZGluZ3MK
LSAgICAgIEB0eXBlIEFycmF5IHwgU3RyaW5nCi0gICAgICBAZGVmYXVsdCBbJ2hyZWYnLCAndGl0
bGUnLCAncmVsJ10KLSAgICAgKiovCi0gICAgYXR0cmlidXRlQmluZGluZ3M6IFsnaHJlZicsICd0
aXRsZScsICdyZWwnXSwKLQotICAgIC8qKgotICAgICAgQnkgZGVmYXVsdCB0aGUgYHt7bGluay10
b319YCBoZWxwZXIgd2lsbCBiaW5kIHRvIHRoZSBgYWN0aXZlYCwgYGxvYWRpbmdgLCBhbmQKLSAg
ICAgIGBkaXNhYmxlZGAgY2xhc3Nlcy4gSXQgaXMgZGlzY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhl
c2UgZGlyZWN0bHkuCi0KLSAgICAgIEBwcm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAgICAg
QHR5cGUgQXJyYXkKLSAgICAgIEBkZWZhdWx0IFsnYWN0aXZlJywgJ2xvYWRpbmcnLCAnZGlzYWJs
ZWQnXQotICAgICAqKi8KLSAgICBjbGFzc05hbWVCaW5kaW5nczogWydhY3RpdmUnLCAnbG9hZGlu
ZycsICdkaXNhYmxlZCddLAotCi0gICAgLyoqCi0gICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5r
LXRvfX1gIGhlbHBlciByZXNwb25kcyB0byB0aGUgYGNsaWNrYCBldmVudC4gWW91Ci0gICAgICBj
YW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWxseSBieSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8geW91
ciBjdXN0b20KLSAgICAgIGV2ZW50IG5hbWUuCi0KLSAgICAgIFRoaXMgaXMgcGFydGljdWxhcmx5
IHVzZWZ1bCBvbiBtb2JpbGUgd2hlbiBvbmUgd2FudHMgdG8gYXZvaWQgdGhlIDMwMG1zCi0gICAg
ICBjbGljayBkZWxheSB1c2luZyBzb21lIHNvcnQgb2YgY3VzdG9tIGB0YXBgIGV2ZW50LgotCi0g
ICAgICBAcHJvcGVydHkgZXZlbnROYW1lCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZh
dWx0IGNsaWNrCi0gICAgKi8KLSAgICBldmVudE5hbWU6ICdjbGljaycsCi0KLSAgICAvLyB0aGlz
IGlzIGRvYydlZCBoZXJlIHNvIGl0IHNob3dzIHVwIGluIHRoZSBldmVudHMKLSAgICAvLyBzZWN0
aW9uIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiwgd2hpY2ggaXMgd2hlcmUKLSAgICAvLyBwZW9w
bGUgd2lsbCBsaWtlbHkgZ28gbG9va2luZyBmb3IgaXQuCi0gICAgLyoqCi0gICAgICBUcmlnZ2Vy
cyB0aGUgYExpbmtWaWV3YCdzIHJvdXRpbmcgYmVoYXZpb3IuIElmCi0gICAgICBgZXZlbnROYW1l
YCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBgY2xpY2tgCi0gICAgICB0aGUgcm91
dGluZyBiZWhhdmlvciB3aWxsIHRyaWdnZXIgb24gdGhhdCBjdXN0b20gZXZlbnQKLSAgICAgIGlu
c3RlYWQuCi0KLSAgICAgIEBldmVudCBjbGljawotICAgICoqLwotCi0gICAgLyoqCi0gICAgICBB
biBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVkIHdoZW4gTGlua1ZpZXcgb2JqZWN0cyBhcmUgaW5z
dGFudGlhdGVkLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
ICBBcHAuTXlMaW5rVmlldyA9IEVtYmVyLkxpbmtWaWV3LmV4dGVuZCh7Ci0gICAgICAgIGluaXQ6
IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgICAgICAgRW1iZXIu
TG9nZ2VyLmxvZygnRXZlbnQgaXMgJyArIHRoaXMuZ2V0KCdldmVudE5hbWUnKSk7Ci0gICAgICAg
IH0KLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIE5PVEU6IElmIHlvdSBkbyBvdmVycmlk
ZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVtYmVyLlZpZXdgIG9yCi0gICAg
ICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwgYmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlcigp
YCBpbiB5b3VyCi0gICAgICBgaW5pdGAgZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIg
bWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvCi0gICAgICBkbyBpbXBvcnRhbnQgc2V0dXAg
d29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCi0gICAgICBhcHBs
aWNhdGlvbi4KLQotICAgICAgQG1ldGhvZCBpbml0Ci0gICAgKi8KLSAgICBpbml0OiBmdW5jdGlv
bigpIHsKLSAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0KLSAgICAg
IC8vIE1hcCBkZXNpcmVkIGV2ZW50IG5hbWUgdG8gaW52b2tlIGZ1bmN0aW9uCi0gICAgICB2YXIg
ZXZlbnROYW1lID0gZ2V0KHRoaXMsICdldmVudE5hbWUnKSwgaTsKLSAgICAgIHRoaXMub24oZXZl
bnROYW1lLCB0aGlzLCB0aGlzLl9pbnZva2UpOwotCi0gICAgICAgICAgfSwKLQotICAgIC8qKgot
ICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmlu
ZyBgaW5pdGAgdGhhdCBmaXJlCi0gICAgICB3aGVuZXZlciB0aGUgcGFyYW1zIGNoYW5nZQotCi0g
ICAgICBAcHJpdmF0ZQotICAgICAgQG1ldGhvZCBfcGFyYW1zQ2hhbmdlZAotICAgICAqLwotICAg
IF9wYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlD
aGFuZ2UoJ3Jlc29sdmVkUGFyYW1zJyk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICBUaGlzIGlz
IGNhbGxlZCB0byBzZXR1cCBvYnNlcnZlcnMgdGhhdCB3aWxsIHRyaWdnZXIgYSByZXJlbmRlci4K
LQotICAgICBAcHJpdmF0ZQotICAgICBAbWV0aG9kIF9zZXR1cFBhdGhPYnNlcnZlcnMKLSAgICAq
Ki8KLSAgICBfc2V0dXBQYXRoT2JzZXJ2ZXJzOiBmdW5jdGlvbigpewotICAgICAgdmFyIGhlbHBl
clBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnMsCi0gICAgICAgICAgbGlua1RleHRQYXRoICAg
ICA9IGhlbHBlclBhcmFtZXRlcnMub3B0aW9ucy5saW5rVGV4dFBhdGgsCi0gICAgICAgICAgcGF0
aHMgPSBnZXRSZXNvbHZlZFBhdGhzKGhlbHBlclBhcmFtZXRlcnMpLAotICAgICAgICAgIGxlbmd0
aCA9IHBhdGhzLmxlbmd0aCwKLSAgICAgICAgICBwYXRoLCBpLCBub3JtYWxpemVkUGF0aDsKLQot
ICAgICAgaWYgKGxpbmtUZXh0UGF0aCkgewotICAgICAgICBub3JtYWxpemVkUGF0aCA9IEVtYmVy
LkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aChoZWxwZXJQYXJhbWV0ZXJzLmNvbnRleHQsIGxpbmtU
ZXh0UGF0aCwgaGVscGVyUGFyYW1ldGVycy5vcHRpb25zLmRhdGEpOwotICAgICAgICB0aGlzLnJl
Z2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZFBhdGgucm9vdCwgbm9ybWFsaXplZFBhdGgucGF0aCwg
dGhpcywgdGhpcy5yZXJlbmRlcik7Ci0gICAgICB9Ci0KLSAgICAgIGZvcihpPTA7IGkgPCBsZW5n
dGg7IGkrKykgewotICAgICAgICBwYXRoID0gcGF0aHNbaV07Ci0gICAgICAgIGlmIChudWxsID09
PSBwYXRoKSB7Ci0gICAgICAgICAgLy8gQSBsaXRlcmFsIHZhbHVlIHdhcyBwcm92aWRlZCwgbm90
IGEgcGF0aCwgc28gbm90aGluZyB0byBvYnNlcnZlLgotICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Ci0KLSAgICAgICAgbm9ybWFsaXplZFBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1h
bGl6ZVBhdGgoaGVscGVyUGFyYW1ldGVycy5jb250ZXh0LCBwYXRoLCBoZWxwZXJQYXJhbWV0ZXJz
Lm9wdGlvbnMuZGF0YSk7Ci0gICAgICAgIHRoaXMucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVk
UGF0aC5yb290LCBub3JtYWxpemVkUGF0aC5wYXRoLCB0aGlzLCB0aGlzLl9wYXJhbXNDaGFuZ2Vk
KTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKCl7Ci0gICAg
ICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgICAgdGhpcy5fc2V0dXBQ
YXRoT2JzZXJ2ZXJzKCk7Ci0gICAgfSwKLQotICAgIC8qKgotICAgICAgVGhpcyBtZXRob2QgaXMg
aW52b2tlZCBieSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJlCi0g
ICAgICB3aGVuZXZlciB0aGUgcXVlcnkgcGFyYW1zIGNoYW5nZQotICAgICAgQHByaXZhdGUKLSAg
ICAgKi8KLSAgICBfcXVlcnlQYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbiAob2JqZWN0LCBwYXRoKSB7
Ci0gICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdxdWVyeVBhcmFtcycpOwotICAgIH0s
Ci0KLQotICAgIC8qKgotICAgICAgRXZlbiB0aG91Z2ggdGhpcyBpc24ndCBhIHZpcnR1YWwgdmll
dywgd2Ugd2FudCB0byB0cmVhdCBpdCBhcyBpZiBpdCBpcwotICAgICAgc28gdGhhdCB5b3UgY2Fu
IGFjY2VzcyB0aGUgcGFyZW50IHdpdGgge3t2aWV3LnByb3B9fQotCi0gICAgICBAcHJpdmF0ZQot
ICAgICAgQG1ldGhvZCBjb25jcmV0ZVZpZXcKLSAgICAqKi8KLSAgICBjb25jcmV0ZVZpZXc6IEVt
YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCAncGFyZW50
VmlldycpOwotICAgIH0pLnByb3BlcnR5KCdwYXJlbnRWaWV3JyksCi0KLSAgICAvKioKLQotICAg
ICAgQWNjZXNzZWQgYXMgYSBjbGFzc25hbWUgYmluZGluZyB0byBhcHBseSB0aGUgYExpbmtWaWV3
YCdzIGBkaXNhYmxlZENsYXNzYAotICAgICAgQ1NTIGBjbGFzc2AgdG8gdGhlIGVsZW1lbnQgd2hl
biB0aGUgbGluayBpcyBkaXNhYmxlZC4KLQotICAgICAgV2hlbiBgdHJ1ZWAgaW50ZXJhY3Rpb25z
IHdpdGggdGhlIGVsZW1lbnQgd2lsbCBub3QgdHJpZ2dlciByb3V0ZSBjaGFuZ2VzLgotICAgICAg
QHByb3BlcnR5IGRpc2FibGVkCi0gICAgKi8KLSAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24gY29tcHV0ZUxpbmtWaWV3RGlzYWJsZWQoa2V5LCB2YWx1ZSkgewotICAgICAgaWYg
KHZhbHVlICE9PSB1bmRlZmluZWQpIHsgdGhpcy5zZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUpOyB9
Ci0KLSAgICAgIHJldHVybiB2YWx1ZSA/IGdldCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFs
c2U7Ci0gICAgfSksCi0KLSAgICAvKioKLSAgICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJp
bmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rVmlld2AncyBgYWN0aXZlQ2xhc3NgCi0gICAgICBDU1Mg
YGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVuIHRoZSBsaW5rIGlzIGFjdGl2ZS4KLQotICAgICAg
QSBgTGlua1ZpZXdgIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4gaXRzIGBjdXJyZW50V2hlbmAg
cHJvcGVydHkgaXMgYHRydWVgCi0gICAgICBvciB0aGUgYXBwbGljYXRpb24ncyBjdXJyZW50IHJv
dXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtWaWV3YCB3b3VsZCB0cmlnZ2VyCi0gICAgICB0cmFu
c2l0aW9ucyBpbnRvLgotCi0gICAgICBAcHJvcGVydHkgYWN0aXZlCi0gICAgKiovCi0gICAgYWN0
aXZlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiBjb21wdXRlTGlua1ZpZXdBY3RpdmUoKSB7Ci0g
ICAgICBpZiAoZ2V0KHRoaXMsICdsb2FkaW5nJykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAg
IHZhciByb3V0ZXIgPSBnZXQodGhpcywgJ3JvdXRlcicpLAotICAgICAgICAgIHJvdXRlQXJncyA9
IGdldCh0aGlzLCAncm91dGVBcmdzJyksCi0gICAgICAgICAgY29udGV4dHMgPSByb3V0ZUFyZ3Mu
c2xpY2UoMSksCi0gICAgICAgICAgcmVzb2x2ZWRQYXJhbXMgPSBnZXQodGhpcywgJ3Jlc29sdmVk
UGFyYW1zJyksCi0gICAgICAgICAgY3VycmVudFdoZW4gPSB0aGlzLmN1cnJlbnRXaGVuIHx8IHJl
c29sdmVkUGFyYW1zWzBdLAotICAgICAgICAgIGN1cnJlbnRXaXRoSW5kZXggPSBjdXJyZW50V2hl
biArICcuaW5kZXgnLAotICAgICAgICAgIGlzQWN0aXZlID0gcm91dGVyLmlzQWN0aXZlLmFwcGx5
KHJvdXRlciwgW2N1cnJlbnRXaGVuXS5jb25jYXQoY29udGV4dHMpKSB8fAotICAgICAgICAgICAg
ICAgICAgICAgcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwgW2N1cnJlbnRXaXRoSW5kZXhd
LmNvbmNhdChjb250ZXh0cykpOwotCi0gICAgICBpZiAoaXNBY3RpdmUpIHsgcmV0dXJuIGdldCh0
aGlzLCAnYWN0aXZlQ2xhc3MnKTsgfQotICAgIH0pLnByb3BlcnR5KCdyZXNvbHZlZFBhcmFtcycs
ICdyb3V0ZUFyZ3MnLCAncm91dGVyLnVybCcpLAotCi0gICAgLyoqCi0gICAgICBBY2Nlc3NlZCBh
cyBhIGNsYXNzbmFtZSBiaW5kaW5nIHRvIGFwcGx5IHRoZSBgTGlua1ZpZXdgJ3MgYGxvYWRpbmdD
bGFzc2AKLSAgICAgIENTUyBgY2xhc3NgIHRvIHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMg
bG9hZGluZy4KLQotICAgICAgQSBgTGlua1ZpZXdgIGlzIGNvbnNpZGVyZWQgbG9hZGluZyB3aGVu
IGl0IGhhcyBhdCBsZWFzdCBvbmUKLSAgICAgIHBhcmFtZXRlciB3aG9zZSB2YWx1ZSBpcyBjdXJy
ZW50bHkgbnVsbCBvciB1bmRlZmluZWQuIER1cmluZwotICAgICAgdGhpcyB0aW1lLCBjbGlja2lu
ZyB0aGUgbGluayB3aWxsIHBlcmZvcm0gbm8gdHJhbnNpdGlvbiBhbmQKLSAgICAgIGVtaXQgYSB3
YXJuaW5nIHRoYXQgdGhlIGxpbmsgaXMgc3RpbGwgaW4gYSBsb2FkaW5nIHN0YXRlLgotCi0gICAg
ICBAcHJvcGVydHkgbG9hZGluZwotICAgICoqLwotICAgIGxvYWRpbmc6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld0xvYWRpbmcoKSB7Ci0gICAgICBpZiAoIWdldCh0aGlz
LCAncm91dGVBcmdzJykpIHsgcmV0dXJuIGdldCh0aGlzLCAnbG9hZGluZ0NsYXNzJyk7IH0KLSAg
ICB9KS5wcm9wZXJ0eSgncm91dGVBcmdzJyksCi0KLSAgICAvKioKLSAgICAgIFJldHVybnMgdGhl
IGFwcGxpY2F0aW9uJ3MgbWFpbiByb3V0ZXIgZnJvbSB0aGUgY29udGFpbmVyLgotCi0gICAgICBA
cHJpdmF0ZQotICAgICAgQHByb3BlcnR5IHJvdXRlcgotICAgICoqLwotICAgIHJvdXRlcjogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gZ2V0KHRoaXMsICdjb250cm9s
bGVyJykuY29udGFpbmVyLmxvb2t1cCgncm91dGVyOm1haW4nKTsKLSAgICB9KSwKLQotICAgIC8q
KgotICAgICAgRXZlbnQgaGFuZGxlciB0aGF0IGludm9rZXMgdGhlIGxpbmssIGFjdGl2YXRpbmcg
dGhlIGFzc29jaWF0ZWQgcm91dGUuCi0KLSAgICAgIEBwcml2YXRlCi0gICAgICBAbWV0aG9kIF9p
bnZva2UKLSAgICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50Ci0gICAgKi8KLSAgICBfaW52b2tlOiBm
dW5jdGlvbihldmVudCkgewotICAgICAgaWYgKCFpc1NpbXBsZUNsaWNrKGV2ZW50KSkgeyByZXR1
cm4gdHJ1ZTsgfQotCi0gICAgICBpZiAodGhpcy5wcmV2ZW50RGVmYXVsdCAhPT0gZmFsc2UpIHsg
ZXZlbnQucHJldmVudERlZmF1bHQoKTsgfQotICAgICAgaWYgKHRoaXMuYnViYmxlcyA9PT0gZmFs
c2UpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAn
X2lzRGlzYWJsZWQnKSkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAn
bG9hZGluZycpKSB7Ci0gICAgICAgIEVtYmVyLkxvZ2dlci53YXJuKCJUaGlzIGxpbmstdG8gaXMg
aW4gYW4gaW5hY3RpdmUgbG9hZGluZyBzdGF0ZSBiZWNhdXNlIGF0IGxlYXN0IG9uZSBvZiBpdHMg
cGFyYW1ldGVycyBwcmVzZW50bHkgaGFzIGEgbnVsbC91bmRlZmluZWQgdmFsdWUsIG9yIHRoZSBw
cm92aWRlZCByb3V0ZSBuYW1lIGlzIGludmFsaWQuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgIH0KLQotICAgICAgdmFyIHJvdXRlciA9IGdldCh0aGlzLCAncm91dGVyJyksCi0gICAg
ICAgICAgcm91dGVBcmdzID0gZ2V0KHRoaXMsICdyb3V0ZUFyZ3MnKTsKLQotICAgICAgaWYgKGdl
dCh0aGlzLCAncmVwbGFjZScpKSB7Ci0gICAgICAgIHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShy
b3V0ZXIsIHJvdXRlQXJncyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByb3V0ZXIudHJhbnNp
dGlvblRvLmFwcGx5KHJvdXRlciwgcm91dGVBcmdzKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAg
LyoqCi0gICAgICBDb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHJlc29sdmVkIHBh
cmFtZXRlcnMuCi0KLSAgICAgIEBwcml2YXRlCi0gICAgICBAcHJvcGVydHkKLSAgICAgIEByZXR1
cm4ge0FycmF5fQotICAgICAqLwotICAgIHJlc29sdmVkUGFyYW1zOiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKLSAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzLAotICAg
ICAgICAgIG9wdGlvbnMgPSBwYXJhbWV0ZXJzLm9wdGlvbnMsCi0gICAgICAgICAgdHlwZXMgPSBv
cHRpb25zLnR5cGVzLAotICAgICAgICAgIGRhdGEgPSBvcHRpb25zLmRhdGE7Ci0KLSAgICAgIAot
ICAgICAgLy8gT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gaWYgcXVlcnkgcGFyYW1zIG5vdCBlbmFi
bGVkCi0gICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtcyhwYXJhbWV0ZXJzLmNvbnRleHQsIHBhcmFt
ZXRlcnMucGFyYW1zLCB7IHR5cGVzOiB0eXBlcywgZGF0YTogZGF0YSB9KTsKLSAgICB9KS5wcm9w
ZXJ0eSgpLAotCi0gICAgLyoqCi0gICAgICBDb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMg
dGhlIGN1cnJlbnQgcm91dGUgbmFtZSBhbmQKLSAgICAgIGFueSBkeW5hbWljIHNlZ21lbnRzLgot
Ci0gICAgICBAcHJpdmF0ZQotICAgICAgQHByb3BlcnR5Ci0gICAgICBAcmV0dXJuIHtBcnJheX0g
QW4gYXJyYXkgd2l0aCB0aGUgcm91dGUgbmFtZSBhbmQgYW55IGR5bmFtaWMgc2VnbWVudHMKLSAg
ICAgKi8KLSAgICByb3V0ZUFyZ3M6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5r
Vmlld1JvdXRlQXJncygpIHsKLSAgICAgIHZhciByZXNvbHZlZFBhcmFtcyA9IGdldCh0aGlzLCAn
cmVzb2x2ZWRQYXJhbXMnKS5zbGljZSgwKSwKLSAgICAgICAgICByb3V0ZXIgPSBnZXQodGhpcywg
J3JvdXRlcicpLAotICAgICAgICAgIG5hbWVkUm91dGUgPSByZXNvbHZlZFBhcmFtc1swXTsKLQot
ICAgICAgaWYgKCFuYW1lZFJvdXRlKSB7IHJldHVybjsgfQotCi0gICAgICBuYW1lZFJvdXRlID0g
ZnVsbFJvdXRlTmFtZShyb3V0ZXIsIG5hbWVkUm91dGUpOwotICAgICAgcmVzb2x2ZWRQYXJhbXNb
MF0gPSBuYW1lZFJvdXRlOwotCi0gICAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmVzb2x2ZWRQ
YXJhbXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgdmFyIHBhcmFtID0gcmVzb2x2
ZWRQYXJhbXNbaV07Ci0gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyYW0g
PT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgLy8gSWYgY29udGV4dHMgYXJlbid0IHByZXNl
bnQsIGNvbnNpZGVyIHRoZSBsaW5rVmlldyB1bmxvYWRlZC4KLSAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgCi0gICAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbXM7
Ci0gICAgfSkucHJvcGVydHkoJ3Jlc29sdmVkUGFyYW1zJywgJ3F1ZXJ5UGFyYW1zJywgJ3JvdXRl
ci51cmwnKSwKLQotCi0gICAgX3BvdGVudGlhbFF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgbmFtZWRSb3V0ZSA9IGdldCh0aGlzLCAncmVzb2x2ZWRQ
YXJhbXMnKVswXTsKLSAgICAgIGlmICghbmFtZWRSb3V0ZSkgeyByZXR1cm4gbnVsbDsgfQotICAg
ICAgdmFyIHJvdXRlciAgICAgICAgICA9IGdldCh0aGlzLCAncm91dGVyJyk7Ci0KLSAgICAgIG5h
bWVkUm91dGUgPSBmdWxsUm91dGVOYW1lKHJvdXRlciwgbmFtZWRSb3V0ZSk7Ci0KLSAgICAgIHJl
dHVybiByb3V0ZXIucm91dGVyLnF1ZXJ5UGFyYW1zRm9ySGFuZGxlcihuYW1lZFJvdXRlKTsKLSAg
ICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJhbXMnKSwKLQotICAgIHF1ZXJ5UGFyYW1zOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgc2VsZiAgICAgICAgICAgICAgPSB0
aGlzLAotICAgICAgICBxdWVyeVBhcmFtcyAgICAgICAgID0gbnVsbCwKLSAgICAgICAgYWxsb3dl
ZFF1ZXJ5UGFyYW1zICA9IGdldCh0aGlzLCAnX3BvdGVudGlhbFF1ZXJ5UGFyYW1zJyk7Ci0KLSAg
ICAgIGlmICghYWxsb3dlZFF1ZXJ5UGFyYW1zKSB7IHJldHVybiBudWxsOyB9Ci0gICAgICBhbGxv
d2VkUXVlcnlQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHsKLSAgICAgICAgdmFyIHZh
bHVlID0gZ2V0KHNlbGYsIHBhcmFtKTsKLSAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3Vu
ZGVmaW5lZCcpIHsKLSAgICAgICAgICBxdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9Owot
ICAgICAgICAgIHF1ZXJ5UGFyYW1zW3BhcmFtXSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9
KTsKLQotCi0gICAgICByZXR1cm4gcXVlcnlQYXJhbXM7Ci0gICAgfSkucHJvcGVydHkoJ19wb3Rl
bnRpYWxRdWVyeVBhcmFtcy5bXScpLAotCi0gICAgLyoqCi0gICAgICBTZXRzIHRoZSBlbGVtZW50
J3MgYGhyZWZgIGF0dHJpYnV0ZSB0byB0aGUgdXJsIGZvcgotICAgICAgdGhlIGBMaW5rVmlld2An
cyB0YXJnZXRlZCByb3V0ZS4KLQotICAgICAgSWYgdGhlIGBMaW5rVmlld2AncyBgdGFnTmFtZWAg
aXMgY2hhbmdlZCB0byBhIHZhbHVlIG90aGVyCi0gICAgICB0aGFuIGBhYCwgdGhpcyBwcm9wZXJ0
eSB3aWxsIGJlIGlnbm9yZWQuCi0KLSAgICAgIEBwcm9wZXJ0eSBocmVmCi0gICAgKiovCi0gICAg
aHJlZjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gY29tcHV0ZUxpbmtWaWV3SHJlZigpIHsKLSAg
ICAgIGlmIChnZXQodGhpcywgJ3RhZ05hbWUnKSAhPT0gJ2EnKSB7IHJldHVybjsgfQotCi0gICAg
ICB2YXIgcm91dGVyID0gZ2V0KHRoaXMsICdyb3V0ZXInKSwKLSAgICAgICAgICByb3V0ZUFyZ3Mg
PSBnZXQodGhpcywgJ3JvdXRlQXJncycpOwotCi0gICAgICByZXR1cm4gcm91dGVBcmdzID8gcm91
dGVyLmdlbmVyYXRlLmFwcGx5KHJvdXRlciwgcm91dGVBcmdzKSA6IGdldCh0aGlzLCAnbG9hZGlu
Z0hyZWYnKTsKLSAgICB9KS5wcm9wZXJ0eSgncm91dGVBcmdzJyksCi0KLSAgICAvKioKLSAgICAg
IFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8gdXNlIHdoaWxlIGEgbGluay10byBpcyBsb2FkaW5n
LgotICAgICAgT25seSBhcHBsaWVzIHdoZW4gdGFnTmFtZSBpcyAnYScKLQotICAgICAgQHByb3Bl
cnR5IGxvYWRpbmdIcmVmCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0ICMKLSAg
ICAqLwotICAgIGxvYWRpbmdIcmVmOiAnIycKLSAgfSk7Ci0KLSAgTGlua1ZpZXcudG9TdHJpbmcg
PSBmdW5jdGlvbigpIHsgcmV0dXJuICJMaW5rVmlldyI7IH07Ci0KLSAgLyoqCi0gICAgVGhlIGB7
e2xpbmstdG99fWAgaGVscGVyIHJlbmRlcnMgYSBsaW5rIHRvIHRoZSBzdXBwbGllZAotICAgIGBy
b3V0ZU5hbWVgIHBhc3NpbmcgYW4gb3B0aW9uYWxseSBzdXBwbGllZCBtb2RlbCB0byB0aGUKLSAg
ICByb3V0ZSBhcyBpdHMgYG1vZGVsYCBjb250ZXh0IG9mIHRoZSByb3V0ZS4gVGhlIGJsb2NrCi0g
ICAgZm9yIGB7e2xpbmstdG99fWAgYmVjb21lcyB0aGUgaW5uZXJIVE1MIG9mIHRoZSByZW5kZXJl
ZAotICAgIGVsZW1lbnQ6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhv
dG9HYWxsZXJ5J319Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIHt7L2xpbmstdG99
fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3RvcyI+
Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIDwvYT4KLSAgICBgYGAKLQotICAgICMj
IyBTdXBwbHlpbmcgYSB0YWdOYW1lCi0gICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIHJlbmRl
cnMgYW4gYDxhPmAgZWxlbWVudC4gVGhpcyBjYW4KLSAgICBiZSBvdmVycmlkZGVuIGZvciBhIHNp
bmdsZSB1c2Ugb2YgYHt7bGluay10b319YCBieSBzdXBwbHlpbmcKLSAgICBhIGB0YWdOYW1lYCBv
cHRpb246Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5
JyB0YWdOYW1lPSJsaSJ9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5r
LXRvfX0KLSAgICBgYGAKLQotICAgIGBgYGh0bWwKLSAgICA8bGk+Ci0gICAgICBHcmVhdCBIYW1z
dGVyIFBob3RvcwotICAgIDwvbGk+Ci0gICAgYGBgCi0KLSAgICBUbyBvdmVycmlkZSB0aGlzIG9w
dGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIHNlZQotICAgICJPdmVycmlkaW5nIEFw
cGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgotCi0gICAgIyMjIERpc2FibGluZyB0aGUgYGxpbmst
dG9gIGhlbHBlcgotICAgIEJ5IGRlZmF1bHQgYHt7bGluay10b319YCBpcyBlbmFibGVkLgotICAg
IGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2FibGVkYCBoZWxwZXIgcHJvcGVydHkgd2lsbCBkaXNh
YmxlIHRoZSBgbGluay10b2AgaGVscGVyLgotCi0gICAgc3RhdGljIHVzZTogdGhlIGBkaXNhYmxl
ZGAgb3B0aW9uOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2Fs
bGVyeScgZGlzYWJsZWQ9dHJ1ZX19Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIHt7
L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgZHluYW1pYyB1c2U6IHRoZSBgZGlzYWJsZWRXaGVu
YCBvcHRpb246Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxs
ZXJ5JyBkaXNhYmxlZFdoZW49Y29udHJvbGxlci5zb21lUHJvcGVydHl9fQotICAgICAgR3JlYXQg
SGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAKLQotICAgIGFueSBwYXNz
ZWQgdmFsdWUgdG8gYGRpc2FibGVkYCB3aWxsIGRpc2FibGUgaXQgZXhjZXB0IGB1bmRlZmluZWRg
LgotICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkgYHRydWVgIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBo
ZWxwZXIgeW91IGNhbgotICAgIG92ZXJyaWRlIHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBFbWJl
ci5MaW5rVmlld2AuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuTGlua1ZpZXcucmVv
cGVuKHsKLSAgICAgIGRpc2FibGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVl
KSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgdGhpcy5z
ZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUgPT09IHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IGdldCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7
Ci0gICAgICB9KQotICAgIH0pOwotICAgIGBgYAotCi0gICAgc2VlICJPdmVycmlkaW5nIEFwcGxp
Y2F0aW9uLXdpZGUgRGVmYXVsdHMiIGZvciBtb3JlLgotCi0gICAgIyMjIEhhbmRsaW5nIGBocmVm
YAotICAgIGB7e2xpbmstdG99fWAgd2lsbCB1c2UgeW91ciBhcHBsaWNhdGlvbidzIFJvdXRlciB0
bwotICAgIGZpbGwgdGhlIGVsZW1lbnQncyBgaHJlZmAgcHJvcGVydHkgd2l0aCBhIHVybCB0aGF0
Ci0gICAgbWF0Y2hlcyB0aGUgcGF0aCB0byB0aGUgc3VwcGxpZWQgYHJvdXRlTmFtZWAgZm9yIHlv
dXIKLSAgICByb3V0ZXJzJ3MgY29uZmlndXJlZCBgTG9jYXRpb25gIHNjaGVtZSwgd2hpY2ggZGVm
YXVsdHMKLSAgICB0byBFbWJlci5IYXNoTG9jYXRpb24uCi0KLSAgICAjIyMgSGFuZGxpbmcgY3Vy
cmVudCByb3V0ZQotICAgIGB7e2xpbmstdG99fWAgd2lsbCBhcHBseSBhIENTUyBjbGFzcyBuYW1l
IG9mICdhY3RpdmUnCi0gICAgd2hlbiB0aGUgYXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIG1h
dGNoZXMKLSAgICB0aGUgc3VwcGxpZWQgcm91dGVOYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFw
cGxpY2F0aW9uJ3MKLSAgICBjdXJyZW50IHJvdXRlIGlzICdwaG90b0dhbGxlcnkucmVjZW50JyB0
aGUgZm9sbG93aW5nCi0gICAgdXNlIG9mIGB7e2xpbmstdG99fWA6Ci0KLSAgICBgYGBoYW5kbGVi
YXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LnJlY2VudCd9fQotICAgICAgR3JlYXQg
SGFtc3RlciBQaG90b3MgZnJvbSB0aGUgbGFzdCB3ZWVrCi0gICAge3svbGluay10b319Ci0gICAg
YGBgCi0KLSAgICB3aWxsIHJlc3VsdCBpbgotCi0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9o
YW1zdGVyLXBob3Rvcy90aGlzLXdlZWsiIGNsYXNzPSJhY3RpdmUiPgotICAgICAgR3JlYXQgSGFt
c3RlciBQaG90b3MKLSAgICA8L2E+Ci0gICAgYGBgCi0KLSAgICBUaGUgQ1NTIGNsYXNzIG5hbWUg
dXNlZCBmb3IgYWN0aXZlIGNsYXNzZXMgY2FuIGJlIGN1c3RvbWl6ZWQKLSAgICBmb3IgYSBzaW5n
bGUgdXNlIG9mIGB7e2xpbmstdG99fWAgYnkgcGFzc2luZyBhbiBgYWN0aXZlQ2xhc3NgCi0gICAg
b3B0aW9uOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVy
eS5yZWNlbnQnIGFjdGl2ZUNsYXNzPSJjdXJyZW50LXVybCJ9fQotICAgICAgR3JlYXQgSGFtc3Rl
ciBQaG90b3MgZnJvbSB0aGUgbGFzdCB3ZWVrCi0gICAge3svbGluay10b319Ci0gICAgYGBgCi0K
LSAgICBgYGBodG1sCi0gICAgPGEgaHJlZj0iL2hhbXN0ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xh
c3M9ImN1cnJlbnQtdXJsIj4KLSAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCi0gICAgPC9hPgot
ICAgIGBgYAotCi0gICAgVG8gb3ZlcnJpZGUgdGhpcyBvcHRpb24gZm9yIHlvdXIgZW50aXJlIGFw
cGxpY2F0aW9uLCBzZWUKLSAgICAiT3ZlcnJpZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRz
Ii4KLQotICAgICMjIyBTdXBwbHlpbmcgYSBtb2RlbAotICAgIEFuIG9wdGlvbmFsIG1vZGVsIGFy
Z3VtZW50IGNhbiBiZSB1c2VkIGZvciByb3V0ZXMgd2hvc2UKLSAgICBwYXRocyBjb250YWluIGR5
bmFtaWMgc2VnbWVudHMuIFRoaXMgYXJndW1lbnQgd2lsbCBiZWNvbWUKLSAgICB0aGUgbW9kZWwg
Y29udGV4dCBvZiB0aGUgbGlua2VkIHJvdXRlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxs
ZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBh
UGhvdG99fQotICAgICAge3thUGhvdG8udGl0bGV9fQotICAgIHt7L2xpbmstdG99fQotICAgIGBg
YAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80MiI+Ci0gICAg
ICBUb21zdGVyCi0gICAgPC9hPgotICAgIGBgYAotCi0gICAgIyMjIFN1cHBseWluZyBtdWx0aXBs
ZSBtb2RlbHMKLSAgICBGb3IgZGVlcC1saW5raW5nIHRvIHJvdXRlIHBhdGhzIHRoYXQgY29udGFp
biBtdWx0aXBsZQotICAgIGR5bmFtaWMgc2VnbWVudHMsIG11bHRpcGxlIG1vZGVsIGFyZ3VtZW50
cyBjYW4gYmUgdXNlZC4KLSAgICBBcyB0aGUgcm91dGVyIHRyYW5zaXRpb25zIHRocm91Z2ggdGhl
IHJvdXRlIHBhdGgsIGVhY2gKLSAgICBzdXBwbGllZCBtb2RlbCBhcmd1bWVudCB3aWxsIGJlY29t
ZSB0aGUgY29udGV4dCBmb3IgdGhlCi0gICAgcm91dGUgd2l0aCB0aGUgZHluYW1pYyBzZWdtZW50
czoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsK
LSAgICAgIHRoaXMucmVzb3VyY2UoInBob3RvR2FsbGVyeSIsIHtwYXRoOiAiaGFtc3Rlci1waG90
b3MvOnBob3RvX2lkIn0sIGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJvdXRlKCJjb21tZW50
Iiwge3BhdGg6ICJjb21tZW50cy86Y29tbWVudF9pZCJ9KTsKLSAgICAgIH0pOwotICAgIH0pOwot
ICAgIGBgYAotICAgIFRoaXMgYXJndW1lbnQgd2lsbCBiZWNvbWUgdGhlIG1vZGVsIGNvbnRleHQg
b2YgdGhlIGxpbmtlZCByb3V0ZToKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICB7eyNsaW5rLXRv
ICdwaG90b0dhbGxlcnkuY29tbWVudCcgYVBob3RvIGNvbW1lbnR9fQotICAgICAge3tjb21tZW50
LmJvZHl9fQotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxh
IGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9jb21tZW50LzcxOCI+Ci0gICAgICBBKysrIHdvdWxk
IHNudWdnbGUgYWdhaW4uCi0gICAgPC9hPgotICAgIGBgYAotCi0gICAgIyMjIFN1cHBseWluZyBh
biBleHBsaWNpdCBkeW5hbWljIHNlZ21lbnQgdmFsdWUKLSAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBh
IG1vZGVsIG9iamVjdCBhdmFpbGFibGUgdG8gcGFzcyB0byBge3tsaW5rLXRvfX1gLAotICAgIGFu
IG9wdGlvbmFsIHN0cmluZyBvciBpbnRlZ2VyIGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgZm9yIHJv
dXRlcyB3aG9zZQotICAgIHBhdGhzIGNvbnRhaW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1
bWVudCB3aWxsIGJlY29tZSB0aGUgdmFsdWUKLSAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50Ogot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAg
ICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxsZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86
cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAg
e3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBhUGhvdG9JZH19Ci0gICAgICB7e2FQaG90by50aXRs
ZX19Ci0gICAge3svbGluay10b319Ci0gICAgYGBgCi0KLSAgICBgYGBodG1sCi0gICAgPGEgaHJl
Zj0iL2hhbXN0ZXItcGhvdG9zLzQyIj4KLSAgICAgIFRvbXN0ZXIKLSAgICA8L2E+Ci0gICAgYGBg
Ci0KLSAgICBXaGVuIHRyYW5zaXRpb25pbmcgaW50byB0aGUgbGlua2VkIHJvdXRlLCB0aGUgYG1v
ZGVsYCBob29rIHdpbGwKLSAgICBiZSB0cmlnZ2VyZWQgd2l0aCBwYXJhbWV0ZXJzIGluY2x1ZGlu
ZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVyLgotCi0gICAgIyMjIEFsbG93aW5nIERlZmF1bHQgQWN0
aW9uCi0KLSAgIEJ5IGRlZmF1bHQgdGhlIGB7e2xpbmstdG99fWAgaGVscGVyIHByZXZlbnRzIHRo
ZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uCi0gICBieSBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdCgp
YCBhcyB0aGlzIHNvcnQgb2YgYWN0aW9uIGJ1YmJsaW5nIGlzIG5vcm1hbGx5Ci0gICBoYW5kbGVk
IGludGVybmFsbHkgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHRha2UgdGhlIGJyb3dzZXIgdG8gYSBu
ZXcgVVJMIChmb3IKLSAgIGV4YW1wbGUpLgotCi0gICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0
aGlzIGJlaGF2aW9yIHNwZWNpZnkgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBpbgotICAgeW91ciB0
ZW1wbGF0ZToKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxl
cnknIGFQaG90b0lkIHByZXZlbnREZWZhdWx0PWZhbHNlfX0KLSAgICAgIHt7YVBob3RvSWQudGl0
bGV9fQotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgIyMjIE92ZXJyaWRpbmcgYXR0
cmlidXRlcwotICAgIFlvdSBjYW4gb3ZlcnJpZGUgYW55IGdpdmVuIHByb3BlcnR5IG9mIHRoZSBF
bWJlci5MaW5rVmlldwotICAgIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBge3tsaW5rLXRvfX1g
IGhlbHBlciBieSBwYXNzaW5nCi0gICAga2V5L3ZhbHVlIHBhaXJzLCBsaWtlIHNvOgotCi0gICAg
YGBgaGFuZGxlYmFycwotICAgIHt7I2xpbmstdG8gIGFQaG90byB0YWdOYW1lPSdsaScgdGl0bGU9
J0ZvbGxvd2luZyB0aGlzIGxpbmsgd2lsbCBjaGFuZ2UgeW91ciBsaWZlJyBjbGFzc05hbWVzPSdw
aWMgc3dlZXQnfX0KLSAgICAgIFVoLW1hemluZyEKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAK
LQotICAgIFNlZSBbRW1iZXIuTGlua1ZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5MaW5rVmlldy5o
dG1sKSBmb3IgYQotICAgIGNvbXBsZXRlIGxpc3Qgb2Ygb3ZlcnJpZGVhYmxlIHByb3BlcnRpZXMu
IEJlIHN1cmUgdG8gYWxzbwotICAgIGNoZWNrIG91dCBpbmhlcml0ZWQgcHJvcGVydGllcyBvZiBg
TGlua1ZpZXdgLgotCi0gICAgIyMjIE92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0
cwotICAgIGBge3tsaW5rLXRvfX1gYCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIEVtYmVyLkxpbmtW
aWV3Ci0gICAgZm9yIHJlbmRlcmluZy4gVG8gb3ZlcnJpZGUgb3B0aW9ucyBmb3IgeW91ciBlbnRp
cmUKLSAgICBhcHBsaWNhdGlvbiwgcmVvcGVuIEVtYmVyLkxpbmtWaWV3IGFuZCBzdXBwbHkgdGhl
Ci0gICAgZGVzaXJlZCB2YWx1ZXM6Ci0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEVtYmVyLkxp
bmtWaWV3LnJlb3Blbih7Ci0gICAgICBhY3RpdmVDbGFzczogImlzLWFjdGl2ZSIsCi0gICAgICB0
YWdOYW1lOiAnbGknCi0gICAgfSkKLSAgICBgYGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUg
dG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgaW4KLSAgICB0aGlzIG1hbm5lcjoKLQotICAg
IGBgYCBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuTGlua1ZpZXcucmVvcGVuKHsKLSAgICAgIGV2ZW50
TmFtZTogJ2N1c3RvbUV2ZW50TmFtZScKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
bGluay10bwotICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQHBhcmFtIHtT
dHJpbmd9IHJvdXRlTmFtZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0qCi0gICAgQHBh
cmFtIFtvcHRpb25zXSB7T2JqZWN0fSBIYW5kbGViYXJzIGtleS92YWx1ZSBwYWlycyBvZiBvcHRp
b25zLCB5b3UgY2FuIG92ZXJyaWRlIGFueSBwcm9wZXJ0eSBvZiBFbWJlci5MaW5rVmlldwotICAg
IEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKLSAgICBAc2VlIHtFbWJlci5MaW5rVmlld30K
LSAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbGluay10bycsIGZ1bmN0
aW9uIGxpbmtUb0hlbHBlcihuYW1lKSB7Ci0gICAgdmFyIG9wdGlvbnMgPSBbXS5zbGljZS5jYWxs
KGFyZ3VtZW50cywgLTEpWzBdLAotICAgICAgICBwYXJhbXMgPSBbXS5zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMCwgLTEpLAotICAgICAgICBoYXNoID0gb3B0aW9ucy5oYXNoOwotCi0gICAgaGFzaC5k
aXNhYmxlZEJpbmRpbmcgPSBoYXNoLmRpc2FibGVkV2hlbjsKLQotICAgIGlmICghb3B0aW9ucy5m
bikgewotICAgICAgdmFyIGxpbmtUaXRsZSA9IHBhcmFtcy5zaGlmdCgpOwotICAgICAgdmFyIGxp
bmtUeXBlID0gb3B0aW9ucy50eXBlcy5zaGlmdCgpOwotICAgICAgdmFyIGNvbnRleHQgPSB0aGlz
OwotICAgICAgaWYgKGxpbmtUeXBlID09PSAnSUQnKSB7Ci0gICAgICAgIG9wdGlvbnMubGlua1Rl
eHRQYXRoID0gbGlua1RpdGxlOwotICAgICAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7Ci0g
ICAgICAgICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KGNvbnRleHQsIGxpbmtUaXRsZSwg
b3B0aW9ucyk7Ci0gICAgICAgIH07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvcHRpb25zLmZu
ID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgcmV0dXJuIGxpbmtUaXRsZTsKLSAgICAgICAgfTsK
LSAgICAgIH0KLSAgICB9Ci0KLSAgICBoYXNoLnBhcmFtZXRlcnMgPSB7Ci0gICAgICBjb250ZXh0
OiB0aGlzLAotICAgICAgb3B0aW9uczogb3B0aW9ucywKLSAgICAgIHBhcmFtczogcGFyYW1zCi0g
ICAgfTsKLQotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRo
aXMsIExpbmtWaWV3LCBvcHRpb25zKTsKLSAgfSk7Ci0KLSAgLyoqCi0gICAgU2VlIFtsaW5rLXRv
XSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2xpbmst
dG8pCi0KLSAgICBAbWV0aG9kIGxpbmtUbwotICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxw
ZXJzCi0gICAgQGRlcHJlY2F0ZWQKLSAgICBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lCi0gICAg
QHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoKLSAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3Ry
aW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2xpbmtUbycsIGZ1
bmN0aW9uIGxpbmtUb0hlbHBlcigpIHsKLSAgICBFbWJlci53YXJuKCJUaGUgJ2xpbmtUbycgdmll
dyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnbGluay10byciKTsKLSAgICByZXR1
cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzWydsaW5rLXRvJ10uYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKLSAgfSk7Ci19KTsKLQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotKi8KLQotdmFyIGdldCA9
IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGVi
YXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgewotICAvKioKLSAgQG1vZHVsZSBlbWJlcgotICBA
c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSAgKi8KLQotICBIYW5kbGViYXJzLk91dGxldFZpZXcg
PSBFbWJlci5Db250YWluZXJWaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoKTsKLQotICAvKioK
LSAgICBUaGUgYG91dGxldGAgaGVscGVyIGlzIGEgcGxhY2Vob2xkZXIgdGhhdCB0aGUgcm91dGVy
IHdpbGwgZmlsbCBpbiB3aXRoCi0gICAgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGJhc2VkIG9u
IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotICAgIGBgYCBoYW5kbGVi
YXJzCi0gICAge3tvdXRsZXR9fQotICAgIGBgYAotCi0gICAgQnkgZGVmYXVsdCwgYSB0ZW1wbGF0
ZSBiYXNlZCBvbiBFbWJlcidzIG5hbWluZyBjb252ZW50aW9ucyB3aWxsIGJlIHJlbmRlcmVkCi0g
ICAgaW50byB0aGUgYG91dGxldGAgKGUuZy4gYEFwcC5Qb3N0c1JvdXRlYCB3aWxsIHJlbmRlciB0
aGUgYHBvc3RzYCB0ZW1wbGF0ZSkuCi0KLSAgICBZb3UgY2FuIHJlbmRlciBhIGRpZmZlcmVudCB0
ZW1wbGF0ZSBieSB1c2luZyB0aGUgYHJlbmRlcigpYCBtZXRob2QgaW4gdGhlCi0gICAgcm91dGUn
cyBgcmVuZGVyVGVtcGxhdGVgIGhvb2suIFRoZSBmb2xsb3dpbmcgd2lsbCByZW5kZXIgdGhlIGBm
YXZvcml0ZVBvc3RgCi0gICAgdGVtcGxhdGUgaW50byB0aGUgYG91dGxldGAuCi0KLSAgICBgYGAg
amF2YXNjcmlwdAotICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAg
ICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ2Zh
dm9yaXRlUG9zdCcpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgWW91IGNhbiBj
cmVhdGUgY3VzdG9tIG5hbWVkIG91dGxldHMgZm9yIG1vcmUgY29udHJvbC4KLQotICAgIGBgYCBo
YW5kbGViYXJzCi0gICAge3tvdXRsZXQgJ2Zhdm9yaXRlUG9zdCd9fQotICAgIHt7b3V0bGV0ICdw
b3N0cyd9fQotICAgIGBgYAotCi0gICAgVGhlbiB5b3UgY2FuIGRlZmluZSB3aGF0IHRlbXBsYXRl
IGlzIHJlbmRlcmVkIGludG8gZWFjaCBvdXRsZXQgaW4geW91cgotICAgIHJvdXRlLgotCi0KLSAg
ICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5k
KHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZW5k
ZXIoJ2Zhdm9yaXRlUG9zdCcsIHsgb3V0bGV0OiAnZmF2b3JpdGVQb3N0JyB9KTsKLSAgICAgICAg
dGhpcy5yZW5kZXIoJ3Bvc3RzJywgeyBvdXRsZXQ6ICdwb3N0cycgfSk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBZb3UgY2FuIHNwZWNpZnkgdGhlIHZpZXcgdGhhdCB0aGUgb3V0
bGV0IHVzZXMgdG8gY29udGFpbiBhbmQgbWFuYWdlIHRoZQotICAgIHRlbXBsYXRlcyByZW5kZXJl
ZCBpbnRvIGl0LgotCi0gICAgYGBgIGhhbmRsZWJhcnMKLSAgICB7e291dGxldCB2aWV3PSdzZWN0
aW9uQ29udGFpbmVyJ319Ci0gICAgYGBgCi0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5T
ZWN0aW9uQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQoewotICAgICAgdGFn
TmFtZTogJ3NlY3Rpb24nLAotICAgICAgY2xhc3NOYW1lczogWydzcGVjaWFsJ10KLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIEBtZXRob2Qgb3V0bGV0Ci0gICAgQGZvciBFbWJlci5IYW5kbGViYXJz
LmhlbHBlcnMKLSAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgdGhlIHByb3BlcnR5IG9uIHRo
ZSBjb250cm9sbGVyCi0gICAgICB0aGF0IGhvbGRzIHRoZSB2aWV3IGZvciB0aGlzIG91dGxldAot
ICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKLSAgKi8KLSAgSGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignb3V0bGV0JywgZnVuY3Rpb24gb3V0bGV0SGVscGVyKHByb3BlcnR5LCBvcHRp
b25zKSB7Ci0gICAKLSAgICB2YXIgb3V0bGV0U291cmNlLAotICAgICAgICBjb250YWluZXIsCi0g
ICAgICAgIHZpZXdOYW1lLAotICAgICAgICB2aWV3Q2xhc3MsCi0gICAgICAgIHZpZXdGdWxsTmFt
ZTsKLQotICAgIGlmIChwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5kYXRhICYmIHByb3BlcnR5LmRhdGEu
aXNSZW5kZXJEYXRhKSB7Ci0gICAgICBvcHRpb25zID0gcHJvcGVydHk7Ci0gICAgICBwcm9wZXJ0
eSA9ICdtYWluJzsKLSAgICB9Ci0KLSAgICBjb250YWluZXIgPSBvcHRpb25zLmRhdGEudmlldy5j
b250YWluZXI7Ci0KLSAgICBvdXRsZXRTb3VyY2UgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgICB3
aGlsZSAoIW91dGxldFNvdXJjZS5nZXQoJ3RlbXBsYXRlLmlzVG9wJykpIHsKLSAgICAgIG91dGxl
dFNvdXJjZSA9IG91dGxldFNvdXJjZS5nZXQoJ19wYXJlbnRWaWV3Jyk7Ci0gICAgfQotCi0gICAg
Ly8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCi0gICAgdmlld05hbWUgPSBvcHRpb25zLmhh
c2gudmlldzsKLQotICAgIGlmICh2aWV3TmFtZSkgewotICAgICAgdmlld0Z1bGxOYW1lID0gJ3Zp
ZXc6JyArIHZpZXdOYW1lOwotICAgICAgRW1iZXIuYXNzZXJ0KCJVc2luZyBhIHF1b3RlbGVzcyB2
aWV3IHBhcmFtZXRlciB3aXRoIHt7b3V0bGV0fX0gaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVw
ZGF0ZSB0byBxdW90ZWQgdXNhZ2UgJ3t7b3V0bGV0IFwiIiArIHZpZXdOYW1lICsgIlwifX0uIiwg
b3B0aW9ucy5oYXNoVHlwZXMudmlldyAhPT0gJ0lEJyk7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRo
ZSB2aWV3IG5hbWUgeW91IHN1cHBsaWVkICciICsgdmlld05hbWUgKyAiJyBkaWQgbm90IHJlc29s
dmUgdG8gYSB2aWV3LiIsIGNvbnRhaW5lci5oYXModmlld0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0g
ICAgdmlld0NsYXNzID0gdmlld05hbWUgPyBjb250YWluZXIubG9va3VwRmFjdG9yeSh2aWV3RnVs
bE5hbWUpIDogb3B0aW9ucy5oYXNoLnZpZXdDbGFzcyB8fCBIYW5kbGViYXJzLk91dGxldFZpZXc7
Ci0KLSAgICBvcHRpb25zLmRhdGEudmlldy5zZXQoJ291dGxldFNvdXJjZScsIG91dGxldFNvdXJj
ZSk7Ci0gICAgb3B0aW9ucy5oYXNoLmN1cnJlbnRWaWV3QmluZGluZyA9ICdfdmlldy5vdXRsZXRT
b3VyY2UuX291dGxldHMuJyArIHByb3BlcnR5OwotCi0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVs
cGVycy52aWV3LmNhbGwodGhpcywgdmlld0NsYXNzLCBvcHRpb25zKTsKLSAgfSk7Ci19KTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5z
ZXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJz
KSB7Ci0KLSAgLyoqCi0gICAgQ2FsbGluZyBgYHt7cmVuZGVyfX1gYCBmcm9tIHdpdGhpbiBhIHRl
bXBsYXRlIHdpbGwgaW5zZXJ0IGFub3RoZXIKLSAgICB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhl
IHByb3ZpZGVkIG5hbWUuIFRoZSBpbnNlcnRlZCB0ZW1wbGF0ZSB3aWxsCi0gICAgYWNjZXNzIGl0
cyBwcm9wZXJ0aWVzIG9uIGl0cyBvd24gY29udHJvbGxlciAocmF0aGVyIHRoYW4gdGhlIGNvbnRy
b2xsZXIKLSAgICBvZiB0aGUgcGFyZW50IHRlbXBsYXRlKS4KLQotICAgIElmIGEgdmlldyBjbGFz
cyB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUg
dXNlZC4KLQotICAgIE5vdGU6IEEgZ2l2ZW4gY29udHJvbGxlciBtYXkgb25seSBiZSB1c2VkICpv
bmNlKiBpbiB5b3VyIGFwcCBpbiB0aGlzIG1hbm5lci4KLSAgICBBIHNpbmdsZXRvbiBpbnN0YW5j
ZSBvZiB0aGUgY29udHJvbGxlciB3aWxsIGJlIGNyZWF0ZWQgZm9yIHlvdS4KLQotICAgIEV4YW1w
bGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLk5hdmlnYXRpb25Db250cm9sbGVyID0g
RW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgICAgd2hvOiAid29ybGQiCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAgPCEtLSBuYXZpZ2F0aW9uLmhicyAtLT4K
LSAgICBIZWxsbywge3t3aG99fS4KLSAgICBgYGAKLQotICAgIGBgYGhhbmRlbGJhcnMKLSAgICA8
IS0tIGFwcGxpY2F0aW9uLmhicyAtLT4KLSAgICA8aDE+TXkgZ3JlYXQgYXBwPC9oMT4KLSAgICB7
e3JlbmRlciBuYXZpZ2F0aW9ufX0KLSAgICBgYGAKLQotICAgIGBgYGh0bWwKLSAgICA8aDE+TXkg
Z3JlYXQgYXBwPC9oMT4KLSAgICA8ZGl2IGNsYXNzPSdlbWJlci12aWV3Jz4KLSAgICAgIEhlbGxv
LCB3b3JsZC4KLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIE9wdGlvbmFsbHkgeW91IG1heSBw
cm92aWRlIGEgc2Vjb25kIGFyZ3VtZW50OiBhIHByb3BlcnR5IHBhdGgKLSAgICB0aGF0IHdpbGwg
YmUgYm91bmQgdG8gdGhlIGBtb2RlbGAgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xsZXIuCi0KLSAg
ICBJZiBhIGBtb2RlbGAgcHJvcGVydHkgcGF0aCBpcyBzcGVjaWZpZWQsIHRoZW4gYSBuZXcgaW5z
dGFuY2Ugb2YgdGhlCi0gICAgY29udHJvbGxlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7e3JlbmRl
cn19YCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcwotICAgIHdpdGggdGhlIHNhbWUgbmFtZS4K
LQotICAgRm9yIGV4YW1wbGUgaWYgeW91IGhhZCB0aGlzIGBhdXRob3JgIHRlbXBsYXRlLgotCi0g
ICBgYGBoYW5kbGViYXJzCi08ZGl2IGNsYXNzPSJhdXRob3IiPgotICBXcml0dGVuIGJ5IHt7Zmly
c3ROYW1lfX0ge3tsYXN0TmFtZX19LgotICBUb3RhbCBQb3N0czoge3twb3N0Q291bnR9fQotPC9k
aXY+Ci0gIGBgYAotCi0gIFlvdSBjb3VsZCByZW5kZXIgaXQgaW5zaWRlIHRoZSBgcG9zdGAgdGVt
cGxhdGUgdXNpbmcgdGhlIGByZW5kZXJgIGhlbHBlci4KLQotICBgYGBoYW5kbGViYXJzCi08ZGl2
IGNsYXNzPSJwb3N0Ij4KLSAgPGgxPnt7dGl0bGV9fTwvaDE+Ci0gIDxkaXY+e3tib2R5fX08L2Rp
dj4KLSAge3tyZW5kZXIgImF1dGhvciIgYXV0aG9yfX0KLTwvZGl2PgotICAgYGBgCi0KLSAgICBA
bWV0aG9kIHJlbmRlcgotICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQHBh
cmFtIHtTdHJpbmd9IG5hbWUKLSAgICBAcGFyYW0ge09iamVjdD99IGNvbnRleHRTdHJpbmcKLSAg
ICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5n
Ci0gICovCi0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3JlbmRlcicsIGZ1bmN0
aW9uIHJlbmRlckhlbHBlcihuYW1lLCBjb250ZXh0U3RyaW5nLCBvcHRpb25zKSB7Ci0gICAgdmFy
IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBw
YXNzIGEgdGVtcGxhdGUgdG8gcmVuZGVyIiwgbGVuZ3RoID49IDIpOwotICAgIHZhciBjb250ZXh0
UHJvdmlkZWQgPSBsZW5ndGggPT09IDMsCi0gICAgICAgIGNvbnRhaW5lciwgcm91dGVyLCBjb250
cm9sbGVyLCB2aWV3LCBjb250ZXh0LCBsb29rdXBPcHRpb25zOwotCi0gICAgY29udGFpbmVyID0g
KG9wdGlvbnMgfHwgY29udGV4dFN0cmluZykuZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyLmNvbnRh
aW5lcjsKLSAgICByb3V0ZXIgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotCi0g
ICAgaWYgKGxlbmd0aCA9PT0gMikgewotICAgICAgLy8gdXNlIHRoZSBzaW5nbGV0b24gY29udHJv
bGxlcgotICAgICAgb3B0aW9ucyA9IGNvbnRleHRTdHJpbmc7Ci0gICAgICBjb250ZXh0U3RyaW5n
ID0gdW5kZWZpbmVkOwotICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgdXNlIHRoZSB7
e3JlbmRlcn19IGhlbHBlciBvbmNlIHdpdGhvdXQgYSBtb2RlbCBvYmplY3QgYXMgaXRzIHNlY29u
ZCBhcmd1bWVudCwgYXMgaW4ge3tyZW5kZXIgXCJwb3N0XCIgcG9zdH19LiIsICFyb3V0ZXIgfHwg
IXJvdXRlci5fbG9va3VwQWN0aXZlVmlldyhuYW1lKSk7Ci0gICAgfSBlbHNlIGlmIChsZW5ndGgg
PT09IDMpIHsKLSAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb250cm9sbGVyCi0gICAgICBjb250ZXh0
ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQob3B0aW9ucy5jb250ZXh0c1sxXSwgY29udGV4dFN0cmlu
Zywgb3B0aW9ucyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IEVtYmVyLkVycm9yKCJZb3Ug
bXVzdCBwYXNzIGEgdGVtcGxhdGVOYW1lIHRvIHJlbmRlciIpOwotICAgIH0KLQotICAgIC8vICMg
bGVnYWN5IG5hbWVzcGFjZQotICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1wvL2csICcuJyk7Ci0g
ICAgLy8gXCBsZWdhY3kgc2xhc2ggYXMgbmFtZXNwYWNlIHN1cHBvcnQKLQotCi0gICAgdmlldyA9
IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyArIG5hbWUpIHx8IGNvbnRhaW5lci5sb29rdXAoJ3Zp
ZXc6ZGVmYXVsdCcpOwotCi0gICAgLy8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCi0gICAg
dmFyIGNvbnRyb2xsZXJOYW1lID0gb3B0aW9ucy5oYXNoLmNvbnRyb2xsZXIgfHwgbmFtZTsKLSAg
ICB2YXIgY29udHJvbGxlckZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1l
OwotCi0gICAgaWYgKG9wdGlvbnMuaGFzaC5jb250cm9sbGVyKSB7Ci0gICAgICBFbWJlci5hc3Nl
cnQoIlRoZSBjb250cm9sbGVyIG5hbWUgeW91IHN1cHBsaWVkICciICsgY29udHJvbGxlck5hbWUg
KyAiJyBkaWQgbm90IHJlc29sdmUgdG8gYSBjb250cm9sbGVyLiIsIGNvbnRhaW5lci5oYXMoY29u
dHJvbGxlckZ1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgdmFyIHBhcmVudENvbnRyb2xsZXIgPSBv
cHRpb25zLmRhdGEua2V5d29yZHMuY29udHJvbGxlcjsKLQotICAgIC8vIGNob29zZSBuYW1lCi0g
ICAgaWYgKGxlbmd0aCA+IDIpIHsKLSAgICAgIHZhciBmYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1
cEZhY3RvcnkoY29udHJvbGxlckZ1bGxOYW1lKSB8fAotICAgICAgICAgICAgICAgICAgICBFbWJl
ci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNv
bnRleHQpOwotCi0gICAgICBjb250cm9sbGVyID0gZmFjdG9yeS5jcmVhdGUoewotICAgICAgICBt
b2RlbDogY29udGV4dCwKLSAgICAgICAgcGFyZW50Q29udHJvbGxlcjogcGFyZW50Q29udHJvbGxl
ciwKLSAgICAgICAgdGFyZ2V0OiBwYXJlbnRDb250cm9sbGVyCi0gICAgICB9KTsKLQotICAgIH0g
ZWxzZSB7Ci0gICAgICBjb250cm9sbGVyID0gY29udGFpbmVyLmxvb2t1cChjb250cm9sbGVyRnVs
bE5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyKGNv
bnRhaW5lciwgY29udHJvbGxlck5hbWUpOwotCi0gICAgICBjb250cm9sbGVyLnNldFByb3BlcnRp
ZXMoewotICAgICAgICB0YXJnZXQ6IHBhcmVudENvbnRyb2xsZXIsCi0gICAgICAgIHBhcmVudENv
bnRyb2xsZXI6IHBhcmVudENvbnRyb2xsZXIKLSAgICAgIH0pOwotICAgIH0KLQotICAgIHZhciBy
b290ID0gb3B0aW9ucy5jb250ZXh0c1sxXTsKLQotICAgIGlmIChyb290KSB7Ci0gICAgICB2aWV3
LnJlZ2lzdGVyT2JzZXJ2ZXIocm9vdCwgY29udGV4dFN0cmluZywgZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIGNvbnRyb2xsZXIuc2V0KCdtb2RlbCcsIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHJvb3QsIGNv
bnRleHRTdHJpbmcsIG9wdGlvbnMpKTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIG9wdGlvbnMu
aGFzaC52aWV3TmFtZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZShuYW1lKTsKLQotICAgIHZhciB0
ZW1wbGF0ZU5hbWUgPSAndGVtcGxhdGU6JyArIG5hbWU7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ug
dXNlZCBge3tyZW5kZXIgJyIgKyBuYW1lICsgIid9fWAsIGJ1dCAnIiArIG5hbWUgKyAiJyBjYW4g
bm90IGJlIGZvdW5kIGFzIGVpdGhlciBhIHRlbXBsYXRlIG9yIGEgdmlldy4iLCBjb250YWluZXIu
aGFzKCJ2aWV3OiIgKyBuYW1lKSB8fCBjb250YWluZXIuaGFzKHRlbXBsYXRlTmFtZSkpOwotICAg
IG9wdGlvbnMuaGFzaC50ZW1wbGF0ZSA9IGNvbnRhaW5lci5sb29rdXAodGVtcGxhdGVOYW1lKTsK
LQotICAgIG9wdGlvbnMuaGFzaC5jb250cm9sbGVyID0gY29udHJvbGxlcjsKLQotICAgIGlmIChy
b3V0ZXIgJiYgIWNvbnRleHQpIHsKLSAgICAgIHJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcobmFt
ZSwgdmlldyk7Ci0gICAgfQotCi0gICAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs
bCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0q
LwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykg
ewotCi0gIHZhciByZXNvbHZlUGFyYW1zID0gRW1iZXIuUm91dGVyLnJlc29sdmVQYXJhbXMsCi0g
ICAgICBpc1NpbXBsZUNsaWNrID0gRW1iZXIuVmlld1V0aWxzLmlzU2ltcGxlQ2xpY2s7Ci0KLSAg
dmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVyLkhhbmRsZWJhcnMsCi0gICAgICBoYW5kbGViYXJz
R2V0ID0gRW1iZXJIYW5kbGViYXJzLmdldCwKLSAgICAgIFNhZmVTdHJpbmcgPSBFbWJlckhhbmRs
ZWJhcnMuU2FmZVN0cmluZywKLSAgICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5m
b3JFYWNoLAotICAgICAgZ2V0ID0gRW1iZXIuZ2V0LAotICAgICAgYV9zbGljZSA9IEFycmF5LnBy
b3RvdHlwZS5zbGljZTsKLQotICBmdW5jdGlvbiBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsK
LSAgICB2YXIgcmV0ID0gW107Ci0gICAgaWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9u
TmFtZSk7IH0KLQotICAgIHZhciB0eXBlcyA9IG9wdGlvbnMub3B0aW9ucy50eXBlcy5zbGljZSgx
KSwKLSAgICAgICAgZGF0YSA9IG9wdGlvbnMub3B0aW9ucy5kYXRhOwotCi0gICAgcmV0dXJuIHJl
dC5jb25jYXQocmVzb2x2ZVBhcmFtcyhvcHRpb25zLmNvbnRleHQsIG9wdGlvbnMucGFyYW1zLCB7
IHR5cGVzOiB0eXBlcywgZGF0YTogZGF0YSB9KSk7Ci0gIH0KLQotICB2YXIgQWN0aW9uSGVscGVy
ID0gRW1iZXJIYW5kbGViYXJzLkFjdGlvbkhlbHBlciA9IHsKLSAgICByZWdpc3RlcmVkQWN0aW9u
czoge30KLSAgfTsKLQotICB2YXIga2V5cyA9IFsiYWx0IiwgInNoaWZ0IiwgIm1ldGEiLCAiY3Ry
bCJdOwotCi0gIHZhciBQT0lOVEVSX0VWRU5UX1RZUEVfUkVHRVggPSAvXmNsaWNrfG1vdXNlfHRv
dWNoLzsKLQotICB2YXIgaXNBbGxvd2VkRXZlbnQgPSBmdW5jdGlvbihldmVudCwgYWxsb3dlZEtl
eXMpIHsKLSAgICBpZiAodHlwZW9mIGFsbG93ZWRLZXlzID09PSAidW5kZWZpbmVkIikgewotICAg
ICAgaWYgKFBPSU5URVJfRVZFTlRfVFlQRV9SRUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7Ci0gICAg
ICAgIHJldHVybiBpc1NpbXBsZUNsaWNrKGV2ZW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAg
IGFsbG93ZWRLZXlzID0gJyc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGFsbG93ZWRLZXlz
LmluZGV4T2YoImFueSIpID49IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAg
IHZhciBhbGxvd2VkID0gdHJ1ZTsKLQotICAgIGZvckVhY2guY2FsbChrZXlzLCBmdW5jdGlvbihr
ZXkpIHsKLSAgICAgIGlmIChldmVudFtrZXkgKyAiS2V5Il0gJiYgYWxsb3dlZEtleXMuaW5kZXhP
ZihrZXkpID09PSAtMSkgewotICAgICAgICBhbGxvd2VkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAg
fSk7Ci0KLSAgICByZXR1cm4gYWxsb3dlZDsKLSAgfTsKLQotICBBY3Rpb25IZWxwZXIucmVnaXN0
ZXJBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25OYW1lLCBvcHRpb25zLCBhbGxvd2VkS2V5cykgewot
ICAgIHZhciBhY3Rpb25JZCA9ICgrK0VtYmVyLnV1aWQpLnRvU3RyaW5nKCk7Ci0KLSAgICBBY3Rp
b25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnNbYWN0aW9uSWRdID0gewotICAgICAgZXZlbnROYW1l
OiBvcHRpb25zLmV2ZW50TmFtZSwKLSAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZVJlZ2lz
dGVyZWRBY3Rpb24oZXZlbnQpIHsKLSAgICAgICAgaWYgKCFpc0FsbG93ZWRFdmVudChldmVudCwg
YWxsb3dlZEtleXMpKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMucHJl
dmVudERlZmF1bHQgIT09IGZhbHNlKSB7Ci0gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQo
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcHRpb25zLmJ1YmJsZXMgPT09IGZhbHNlKSB7
Ci0gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQ7Ci0KLSAgICAgICAgaWYgKHRhcmdldC50YXJn
ZXQpIHsKLSAgICAgICAgICB0YXJnZXQgPSBoYW5kbGViYXJzR2V0KHRhcmdldC5yb290LCB0YXJn
ZXQudGFyZ2V0LCB0YXJnZXQub3B0aW9ucyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
dGFyZ2V0ID0gdGFyZ2V0LnJvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBFbWJlci5ydW4oZnVu
Y3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigpIHsKLSAgICAgICAgICBpZiAodGFyZ2V0LnNlbmQp
IHsKLSAgICAgICAgICAgIHRhcmdldC5zZW5kLmFwcGx5KHRhcmdldCwgYXJncyhvcHRpb25zLnBh
cmFtZXRlcnMsIGFjdGlvbk5hbWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
RW1iZXIuYXNzZXJ0KCJUaGUgYWN0aW9uICciICsgYWN0aW9uTmFtZSArICInIGRpZCBub3QgZXhp
c3Qgb24gIiArIHRhcmdldCwgdHlwZW9mIHRhcmdldFthY3Rpb25OYW1lXSA9PT0gJ2Z1bmN0aW9u
Jyk7Ci0gICAgICAgICAgICB0YXJnZXRbYWN0aW9uTmFtZV0uYXBwbHkodGFyZ2V0LCBhcmdzKG9w
dGlvbnMucGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0g
ICAgfTsKLQotICAgIG9wdGlvbnMudmlldy5vbignd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24o
KSB7Ci0gICAgICBkZWxldGUgQWN0aW9uSGVscGVyLnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklk
XTsKLSAgICB9KTsKLQotICAgIHJldHVybiBhY3Rpb25JZDsKLSAgfTsKLQotICAvKioKLSAgICBU
aGUgYHt7YWN0aW9ufX1gIGhlbHBlciByZWdpc3RlcnMgYW4gSFRNTCBlbGVtZW50IHdpdGhpbiBh
IHRlbXBsYXRlIGZvciBET00KLSAgICBldmVudCBoYW5kbGluZyBhbmQgZm9yd2FyZHMgdGhhdCBp
bnRlcmFjdGlvbiB0byB0aGUgdGVtcGxhdGVzJ3MgY29udHJvbGxlcgotICAgIG9yIHN1cHBsaWVk
IGB0YXJnZXRgIG9wdGlvbiAoc2VlICdTcGVjaWZ5aW5nIGEgVGFyZ2V0JykuCi0KLSAgICBJZiB0
aGUgY29udHJvbGxlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGV2ZW50LCB0aGUgZXZlbnQgaXMg
c2VudAotICAgIHRvIHRoZSBjdXJyZW50IHJvdXRlLCBhbmQgaXQgYnViYmxlcyB1cCB0aGUgcm91
dGUgaGllcmFyY2h5IGZyb20gdGhlcmUuCi0KLSAgICBVc2VyIGludGVyYWN0aW9uIHdpdGggdGhh
dCBlbGVtZW50IHdpbGwgaW52b2tlIHRoZSBzdXBwbGllZCBhY3Rpb24gbmFtZSBvbgotICAgIHRo
ZSBhcHByb3ByaWF0ZSB0YXJnZXQuCi0KLSAgICBHaXZlbiB0aGUgZm9sbG93aW5nIGFwcGxpY2F0
aW9uIEhhbmRsZWJhcnMgdGVtcGxhdGUgb24gdGhlIHBhZ2UKLQotICAgIGBgYGhhbmRsZWJhcnMK
LSAgICA8ZGl2IHt7YWN0aW9uICdhbkFjdGlvbk5hbWUnfX0+Ci0gICAgICBjbGljayBtZQotICAg
IDwvZGl2PgotICAgIGBgYAotCi0gICAgQW5kIGFwcGxpY2F0aW9uIGNvZGUKLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxl
ci5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBhbkFjdGlvbk5hbWU6IGZ1bmN0
aW9uKCkgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBXaWxs
IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJlbmRlcmVkIEhUTUwKLQotICAgIGBgYGh0bWwKLSAg
ICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgIDxkaXYgZGF0YS1lbWJlci1hY3Rpb249
IjEiPgotICAgICAgICBjbGljayBtZQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgYGBg
Ci0KLSAgICBDbGlja2luZyAiY2xpY2sgbWUiIHdpbGwgdHJpZ2dlciB0aGUgYGFuQWN0aW9uTmFt
ZWAgYWN0aW9uIG9mIHRoZQotICAgIGBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyYC4gSW4gdGhp
cyBjYXNlLCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQuCi0KLSAgICBJ
ZiB5b3UgcHJvdmlkZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGhlbHBlcjoKLQotICAg
IGBgYGhhbmRsZWJhcnMKLSAgICA8YnV0dG9uIHt7YWN0aW9uICdlZGl0JyBwb3N0fX0+RWRpdDwv
YnV0dG9uPgotICAgIGBgYAotCi0gICAgVGhvc2UgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCBh
bG9uZyBhcyBhcmd1bWVudHMgdG8gdGhlIEphdmFTY3JpcHQKLSAgICBmdW5jdGlvbiBpbXBsZW1l
bnRpbmcgdGhlIGFjdGlvbi4KLQotICAgICMjIyBFdmVudCBQcm9wYWdhdGlvbgotCi0gICAgRXZl
bnRzIHRyaWdnZXJlZCB0aHJvdWdoIHRoZSBhY3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxs
eSBoYXZlCi0gICAgYC5wcmV2ZW50RGVmYXVsdCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5v
dCBuZWVkIHRvIGRvIHNvIGluIHlvdXIgZXZlbnQKLSAgICBoYW5kbGVycy4gSWYgeW91IG5lZWQg
dG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRpb24gKHRvIGhhbmRsZSBmaWxlIGlucHV0cyBmb3IKLSAg
ICBleGFtcGxlKSB5b3UgY2FuIHN1cHBseSB0aGUgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBvcHRp
b24gdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXI6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAg
PGRpdiB7e2FjdGlvbiAic2F5SGVsbG8iIHByZXZlbnREZWZhdWx0PWZhbHNlfX0+Ci0gICAgICA8
aW5wdXQgdHlwZT0iZmlsZSIgLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4KLSAg
ICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIFRvIGRpc2FibGUgYnViYmxpbmcsIHBhc3MgYGJ1YmJs
ZXM9ZmFsc2VgIHRvIHRoZSBoZWxwZXI6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGJ1dHRv
biB7e2FjdGlvbiAnZWRpdCcgcG9zdCBidWJibGVzPWZhbHNlfX0+RWRpdDwvYnV0dG9uPgotICAg
IGBgYAotCi0gICAgSWYgeW91IG5lZWQgdGhlIGRlZmF1bHQgaGFuZGxlciB0byB0cmlnZ2VyIHlv
dSBzaG91bGQgZWl0aGVyIHJlZ2lzdGVyIHlvdXIKLSAgICBvd24gZXZlbnQgaGFuZGxlciwgb3Ig
dXNlIGV2ZW50IG1ldGhvZHMgb24geW91ciB2aWV3IGNsYXNzLiBTZWUgW0VtYmVyLlZpZXddKC9h
cGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwpCi0gICAgJ1Jlc3BvbmRpbmcgdG8gQnJvd3NlciBF
dmVudHMnIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgIyMjIFNwZWNpZnlpbmcgRE9NIGV2
ZW50IHR5cGUKLQotICAgIEJ5IGRlZmF1bHQgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgcmVnaXN0
ZXJzIGZvciBET00gYGNsaWNrYCBldmVudHMuIFlvdSBjYW4KLSAgICBzdXBwbHkgYW4gYG9uYCBv
cHRpb24gdG8gdGhlIGhlbHBlciB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IERPTSBldmVudCBuYW1l
OgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIg
b249ImRvdWJsZUNsaWNrIn19PgotICAgICAgY2xpY2sgbWUKLSAgICA8L2Rpdj4KLSAgICBgYGAK
LQotICAgIFNlZSBgRW1iZXIuVmlld2AgJ1Jlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMnIGZv
ciBhIGxpc3Qgb2YKLSAgICBhY2NlcHRhYmxlIERPTSBldmVudCBuYW1lcy4KLQotICAgIE5PVEU6
IEJlY2F1c2UgYHt7YWN0aW9ufX1gIGRlcGVuZHMgb24gRW1iZXIncyBldmVudCBkaXNwYXRjaCBz
eXN0ZW0gaXQgd2lsbAotICAgIG9ubHkgZnVuY3Rpb24gaWYgYW4gYEVtYmVyLkV2ZW50RGlzcGF0
Y2hlcmAgaW5zdGFuY2UgaXMgYXZhaWxhYmxlLiBBbgotICAgIGBFbWJlci5FdmVudERpc3BhdGNo
ZXJgIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZCB3aGVuIGEgbmV3IGBFbWJlci5BcHBsaWNhdGlv
bmAKLSAgICBpcyBjcmVhdGVkLiBIYXZpbmcgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkFwcGxpY2F0
aW9uYCB3aWxsIHNhdGlzZnkgdGhpcwotICAgIHJlcXVpcmVtZW50LgotCi0gICAgIyMjIFNwZWNp
Znlpbmcgd2hpdGVsaXN0ZWQgbW9kaWZpZXIga2V5cwotCi0gICAgQnkgZGVmYXVsdCB0aGUgYHt7
YWN0aW9ufX1gIGhlbHBlciB3aWxsIGlnbm9yZSBjbGljayBldmVudCB3aXRoIHByZXNzZWQgbW9k
aWZpZXIKLSAgICBrZXlzLiBZb3UgY2FuIHN1cHBseSBhbiBgYWxsb3dlZEtleXNgIG9wdGlvbiB0
byBzcGVjaWZ5IHdoaWNoIGtleXMgc2hvdWxkIG5vdCBiZSBpZ25vcmVkLgotCi0gICAgYGBgaGFu
ZGxlYmFycwotICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgYWxsb3dlZEtleXM9ImFs
dCJ9fT4KLSAgICAgIGNsaWNrIG1lCi0gICAgPC9kaXY+Ci0gICAgYGBgCi0KLSAgICBUaGlzIHdh
eSB0aGUgYHt7YWN0aW9ufX1gIHdpbGwgZmlyZSB3aGVuIGNsaWNraW5nIHdpdGggdGhlIGFsdCBr
ZXkgcHJlc3NlZCBkb3duLgotCi0gICAgQWx0ZXJuYXRpdmVseSwgc3VwcGx5ICJhbnkiIHRvIHRo
ZSBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBhY2NlcHQgYW55IGNvbWJpbmF0aW9uIG9mIG1vZGlm
aWVyIGtleXMuCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rp
b25OYW1lIiBhbGxvd2VkS2V5cz0iYW55In19PgotICAgICAgY2xpY2sgbWUgd2l0aCBhbnkga2V5
IHByZXNzZWQKLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgICMjIyBTcGVjaWZ5aW5nIGEgVGFy
Z2V0Ci0KLSAgICBUaGVyZSBhcmUgc2V2ZXJhbCBwb3NzaWJsZSB0YXJnZXQgb2JqZWN0cyBmb3Ig
YHt7YWN0aW9ufX1gIGhlbHBlcnM6Ci0KLSAgICBJbiBhIHR5cGljYWwgRW1iZXIgYXBwbGljYXRp
b24sIHdoZXJlIHZpZXdzIGFyZSBtYW5hZ2VkIHRocm91Z2ggdXNlIG9mIHRoZQotICAgIGB7e291
dGxldH19YCBoZWxwZXIsIGFjdGlvbnMgd2lsbCBidWJibGUgdG8gdGhlIGN1cnJlbnQgY29udHJv
bGxlciwgdGhlbgotICAgIHRvIHRoZSBjdXJyZW50IHJvdXRlLCBhbmQgdGhlbiB1cCB0aGUgcm91
dGUgaGllcmFyY2h5LgotCi0gICAgQWx0ZXJuYXRpdmVseSwgYSBgdGFyZ2V0YCBvcHRpb24gY2Fu
IGJlIHByb3ZpZGVkIHRvIHRoZSBoZWxwZXIgdG8gY2hhbmdlCi0gICAgd2hpY2ggb2JqZWN0IHdp
bGwgcmVjZWl2ZSB0aGUgbWV0aG9kIGNhbGwuIFRoaXMgb3B0aW9uIG11c3QgYmUgYSBwYXRoCi0g
ICAgdG8gYW4gb2JqZWN0LCBhY2Nlc3NpYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQ6Ci0KLSAg
ICBgYGBoYW5kbGViYXJzCi0gICAge3shIHRoZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSB9fQotICAg
IDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgdGFyZ2V0PXZpZXd9fT4KLSAgICAgIGNsaWNr
IG1lCi0gICAgPC9kaXY+Ci0gICAgYGBgCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFw
cGxpY2F0aW9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAg
ICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlvbigpe30KLSAgICAgIH0KLSAgICB9KTsKLQotICAg
IGBgYAotCi0gICAgIyMjIEFkZGl0aW9uYWwgUGFyYW1ldGVycwotCi0gICAgWW91IG1heSBzcGVj
aWZ5IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlci4gVGhl
c2UKLSAgICBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgYWxvbmcgYXMgdGhlIGFyZ3VtZW50cyB0byB0
aGUgSmF2YVNjcmlwdCBmdW5jdGlvbgotICAgIGltcGxlbWVudGluZyB0aGUgYWN0aW9uLgotCi0g
ICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2VhY2ggcGVyc29uIGluIHBlb3BsZX19Ci0gICAgICA8
ZGl2IHt7YWN0aW9uICJlZGl0IiBwZXJzb259fT4KLSAgICAgICAgY2xpY2sgbWUKLSAgICAgIDwv
ZGl2PgotICAgIHt7L2VhY2h9fQotICAgIGBgYAotCi0gICAgQ2xpY2tpbmcgImNsaWNrIG1lIiB3
aWxsIHRyaWdnZXIgdGhlIGBlZGl0YCBtZXRob2Qgb24gdGhlIGN1cnJlbnQgY29udHJvbGxlcgot
ICAgIHdpdGggdGhlIHZhbHVlIG9mIGBwZXJzb25gIGFzIGEgcGFyYW1ldGVyLgotCi0gICAgQG1l
dGhvZCBhY3Rpb24KLSAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICAgIEBwYXJh
bSB7U3RyaW5nfSBhY3Rpb25OYW1lCi0gICAgQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoKLSAg
ICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgKi8KLSAgRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVy
SGVscGVyKCdhY3Rpb24nLCBmdW5jdGlvbiBhY3Rpb25IZWxwZXIoYWN0aW9uTmFtZSkgewotICAg
IHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSwKLSAgICAgICAg
Y29udGV4dHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxLCAtMSk7Ci0KLSAgICB2YXIgaGFz
aCA9IG9wdGlvbnMuaGFzaCwKLSAgICAgICAgY29udHJvbGxlcjsKLQotICAgIC8vIGNyZWF0ZSBh
IGhhc2ggdG8gcGFzcyBhbG9uZyB0byByZWdpc3RlckFjdGlvbgotICAgIHZhciBhY3Rpb24gPSB7
Ci0gICAgICBldmVudE5hbWU6IGhhc2gub24gfHwgImNsaWNrIgotICAgIH07Ci0KLSAgICBhY3Rp
b24ucGFyYW1ldGVycyA9IHsKLSAgICAgIGNvbnRleHQ6IHRoaXMsCi0gICAgICBvcHRpb25zOiBv
cHRpb25zLAotICAgICAgcGFyYW1zOiBjb250ZXh0cwotICAgIH07Ci0KLSAgICBhY3Rpb24udmll
dyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0gICAgdmFyIHJvb3QsIHRhcmdldDsKLQotICAgIGlm
IChoYXNoLnRhcmdldCkgewotICAgICAgcm9vdCA9IHRoaXM7Ci0gICAgICB0YXJnZXQgPSBoYXNo
LnRhcmdldDsKLSAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIgPSBvcHRpb25zLmRhdGEua2V5d29y
ZHMuY29udHJvbGxlcikgewotICAgICAgcm9vdCA9IGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAg
YWN0aW9uLnRhcmdldCA9IHsgcm9vdDogcm9vdCwgdGFyZ2V0OiB0YXJnZXQsIG9wdGlvbnM6IG9w
dGlvbnMgfTsKLSAgICBhY3Rpb24uYnViYmxlcyA9IGhhc2guYnViYmxlczsKLSAgICBhY3Rpb24u
cHJldmVudERlZmF1bHQgPSBoYXNoLnByZXZlbnREZWZhdWx0OwotCi0gICAgdmFyIGFjdGlvbklk
ID0gQWN0aW9uSGVscGVyLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbk5hbWUsIGFjdGlvbiwgaGFzaC5h
bGxvd2VkS2V5cyk7Ci0gICAgcmV0dXJuIG5ldyBTYWZlU3RyaW5nKCdkYXRhLWVtYmVyLWFjdGlv
bj0iJyArIGFjdGlvbklkICsgJyInKTsKLSAgfSk7Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7Ci0gIC8q
KgotICAgIFRyYW5zaXRpb24gdGhlIGFwcGxpY2F0aW9uIGludG8gYW5vdGhlciByb3V0ZS4gVGhl
IHJvdXRlIG1heQotICAgIGJlIGVpdGhlciBhIHNpbmdsZSByb3V0ZSBvciByb3V0ZSBwYXRoOgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdi
bG9nUG9zdHMnKTsKLSAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3Rz
LnJlY2VudEVudHJpZXMnKTsKLSAgICBgYGAKLQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9k
ZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVzdGlvbi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBzZXJp
YWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAgIHRo
ZSByb3V0ZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBhQ29udHJvbGxlci50cmFuc2l0aW9u
VG9Sb3V0ZSgnYmxvZ1Bvc3QnLCBhUG9zdCk7Ci0gICAgYGBgCi0KLSAgICBNdWx0aXBsZSBtb2Rl
bHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkgdXAgdGhlCi0gICAg
cmVzb3VyY2UgdHJlZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlzLnJlc291cmNlKCdi
bG9nUG9zdCcsIHtwYXRoOic6YmxvZ1Bvc3RJZCd9LCBmdW5jdGlvbigpewotICAgICAgdGhpcy5y
ZXNvdXJjZSgnYmxvZ0NvbW1lbnQnLCB7cGF0aDogJzpibG9nQ29tbWVudElkJ30pOwotICAgIH0p
OwotCi0gICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJ2Jsb2dDb21tZW50JywgYVBv
c3QsIGFDb21tZW50KTsKLSAgICBgYGAKLQotICAgIFNlZSBhbHNvICdyZXBsYWNlUm91dGUnLgot
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0gICAgQHBh
cmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgdG8gYmUgdXNlZCB3aGlsZSB0cmFu
c2l0aW9uaW5nCi0gICAgdG8gdGhlIHJvdXRlLgotICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1p
eGluCi0gICAgQG1ldGhvZCB0cmFuc2l0aW9uVG9Sb3V0ZQotICAqLwotICB0cmFuc2l0aW9uVG9S
b3V0ZTogZnVuY3Rpb24oKSB7Ci0gICAgLy8gdGFyZ2V0IG1heSBiZSBlaXRoZXIgYW5vdGhlciBj
b250cm9sbGVyIG9yIGEgcm91dGVyCi0gICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0
JyksCi0gICAgICAgIG1ldGhvZCA9IHRhcmdldC50cmFuc2l0aW9uVG9Sb3V0ZSB8fCB0YXJnZXQu
dHJhbnNpdGlvblRvOwotICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMp
OwotICB9LAotCi0gIC8qKgotICAgIEBkZXByZWNhdGVkCi0gICAgQGZvciBFbWJlci5Db250cm9s
bGVyTWl4aW4KLSAgICBAbWV0aG9kIHRyYW5zaXRpb25UbwotICAqLwotICB0cmFuc2l0aW9uVG86
IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgidHJhbnNpdGlvblRvIGlzIGRlcHJl
Y2F0ZWQuIFBsZWFzZSB1c2UgdHJhbnNpdGlvblRvUm91dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMu
dHJhbnNpdGlvblRvUm91dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioK
LSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1
cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KLSAgICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVu
dCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IG9uZS4gCi0gICAgQmVzaWRl
IHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBgdHJhbnNpdGlvblRvUm91dGVgIGluIGFsbCBvdGhl
ciByZXNwZWN0cy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNl
Um91dGUoJ2Jsb2dQb3N0cycpOwotICAgIGFDb250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ1Bv
c3RzLnJlY2VudEVudHJpZXMnKTsKLSAgICBgYGAKLQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEg
bW9kZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVzdGlvbi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBz
ZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAg
IHRoZSByb3V0ZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNl
Um91dGUoJ2Jsb2dQb3N0JywgYVBvc3QpOwotICAgIGBgYAotCi0gICAgTXVsdGlwbGUgbW9kZWxz
IHdpbGwgYmUgYXBwbGllZCBsYXN0IHRvIGZpcnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQotICAgIHJl
c291cmNlIHRyZWUuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdGhpcy5yZXNvdXJjZSgnYmxv
Z1Bvc3QnLCB7cGF0aDonOmJsb2dQb3N0SWQnfSwgZnVuY3Rpb24oKXsKLSAgICAgIHRoaXMucmVz
b3VyY2UoJ2Jsb2dDb21tZW50Jywge3BhdGg6ICc6YmxvZ0NvbW1lbnRJZCd9KTsKLSAgICB9KTsK
LQotICAgIGFDb250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ0NvbW1lbnQnLCBhUG9zdCwgYUNv
bW1lbnQpOwotICAgIGBgYAotCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2Yg
dGhlIHJvdXRlCi0gICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgdG8g
YmUgdXNlZCB3aGlsZSB0cmFuc2l0aW9uaW5nCi0gICAgdG8gdGhlIHJvdXRlLgotICAgIEBmb3Ig
RW1iZXIuQ29udHJvbGxlck1peGluCi0gICAgQG1ldGhvZCByZXBsYWNlUm91dGUKLSAgKi8KLSAg
cmVwbGFjZVJvdXRlOiBmdW5jdGlvbigpIHsKLSAgICAvLyB0YXJnZXQgbWF5IGJlIGVpdGhlciBh
bm90aGVyIGNvbnRyb2xsZXIgb3IgYSByb3V0ZXIKLSAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMs
ICd0YXJnZXQnKSwKLSAgICAgICAgbWV0aG9kID0gdGFyZ2V0LnJlcGxhY2VSb3V0ZSB8fCB0YXJn
ZXQucmVwbGFjZVdpdGg7Ci0gICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50
cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQGRlcHJlY2F0ZWQKLSAgICBAZm9yIEVtYmVyLkNvbnRy
b2xsZXJNaXhpbgotICAgIEBtZXRob2QgcmVwbGFjZVdpdGgKLSAgKi8KLSAgcmVwbGFjZVdpdGg6
IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgicmVwbGFjZVdpdGggaXMgZGVwcmVj
YXRlZC4gUGxlYXNlIHVzZSByZXBsYWNlUm91dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFj
ZVJvdXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRp
bmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIu
Vmlldy5yZW9wZW4oewotCi0gIC8qKgotICAgIFNldHMgdGhlIHByaXZhdGUgYF9vdXRsZXRzYCBv
YmplY3Qgb24gdGhlIHZpZXcuCi0KLSAgICBAbWV0aG9kIGluaXQKLSAgICovCi0gIGluaXQ6IGZ1
bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAnX291dGxldHMnLCB7fSk7Ci0gICAgdGhpcy5fc3Vw
ZXIoKTsKLSAgfSwKLQotICAvKioKLSAgICBNYW51YWxseSBmaWxsIGFueSBvZiBhIHZpZXcncyBg
e3tvdXRsZXR9fWAgYXJlYXMgd2l0aCB0aGUKLSAgICBzdXBwbGllZCB2aWV3LgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBNeVZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdDaGlsZCB2
aWV3OiB7e291dGxldCAibWFpbiJ9fSAnKQotICAgIH0pOwotICAgIHZhciBteVZpZXcgPSBNeVZp
ZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0gICAgLy8gVGhlIGh0
bWwgZm9yIG15VmlldyBub3cgbG9va3MgbGlrZToKLSAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIg
Y2xhc3M9ImVtYmVyLXZpZXciPkNoaWxkIHZpZXc6IDwvZGl2PgotCi0gICAgdmFyIEZvb1ZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCc8aDE+Rm9vPC9oMT4gJykKLSAgICB9KTsKLSAgICB2YXIgZm9vVmlldyA9IEZvb1Zp
ZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmNvbm5lY3RPdXRsZXQoJ21haW4nLCBmb29WaWV3KTsK
LSAgICAvLyBUaGUgaHRtbCBmb3IgbXlWaWV3IG5vdyBsb29rcyBsaWtlOgotICAgIC8vIDxkaXYg
aWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxk
aXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1iZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2Pgot
ICAgIC8vIDwvZGl2PgotICAgIGBgYAotICAgIEBtZXRob2QgY29ubmVjdE91dGxldAotICAgIEBw
YXJhbSAge1N0cmluZ30gb3V0bGV0TmFtZSBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgb3V0bGV0Ci0g
ICAgQHBhcmFtICB7T2JqZWN0fSB2aWV3ICAgICAgIEFuIEVtYmVyLlZpZXcKLSAgICovCi0gIGNv
bm5lY3RPdXRsZXQ6IGZ1bmN0aW9uKG91dGxldE5hbWUsIHZpZXcpIHsKLSAgICBpZiAodGhpcy5f
cGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7Ci0gICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0Rpc2Nv
bm5lY3Rpb25zW291dGxldE5hbWVdOwotICAgIH0KLQotICAgIGlmICh0aGlzLl9oYXNFcXVpdmFs
ZW50VmlldyhvdXRsZXROYW1lLCB2aWV3KSkgewotICAgICAgdmlldy5kZXN0cm95KCk7Ci0gICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFyIG91dGxldHMgPSBnZXQodGhpcywgJ19vdXRsZXRz
JyksCi0gICAgICAgIGNvbnRhaW5lciA9IGdldCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAg
IHJvdXRlciA9IGNvbnRhaW5lciAmJiBjb250YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpLAot
ICAgICAgICByZW5kZXJlZE5hbWUgPSBnZXQodmlldywgJ3JlbmRlcmVkTmFtZScpOwotCi0gICAg
c2V0KG91dGxldHMsIG91dGxldE5hbWUsIHZpZXcpOwotCi0gICAgaWYgKHJvdXRlciAmJiByZW5k
ZXJlZE5hbWUpIHsKLSAgICAgIHJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcocmVuZGVyZWROYW1l
LCB2aWV3KTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgRGV0ZXJtaW5lcyBpZiB0aGUgdmll
dyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYnkgY2hlY2tpbmcgaWYKLSAgICB0aGUgdmlldyBo
YXMgdGhlIHNhbWUgY29uc3RydWN0b3IsIHRlbXBsYXRlLCBhbmQgY29udGV4dCBhcyB0aGUKLSAg
ICB2aWV3IGluIHRoZSBgX291dGxldHNgIG9iamVjdC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1l
dGhvZCBfaGFzRXF1aXZhbGVudFZpZXcKLSAgICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUg
VGhlIG5hbWUgb2YgdGhlIG91dGxldCB3ZSBhcmUgY2hlY2tpbmcKLSAgICBAcGFyYW0gIHtPYmpl
Y3R9IHZpZXcgICAgICAgQW4gRW1iZXIuVmlldwotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAq
LwotICBfaGFzRXF1aXZhbGVudFZpZXc6IGZ1bmN0aW9uKG91dGxldE5hbWUsIHZpZXcpIHsKLSAg
ICB2YXIgZXhpc3RpbmdWaWV3ID0gZ2V0KHRoaXMsICdfb3V0bGV0cy4nK291dGxldE5hbWUpOwot
ICAgIHJldHVybiBleGlzdGluZ1ZpZXcgJiYKLSAgICAgIGV4aXN0aW5nVmlldy5jb25zdHJ1Y3Rv
ciA9PT0gdmlldy5jb25zdHJ1Y3RvciAmJgotICAgICAgZXhpc3RpbmdWaWV3LmdldCgndGVtcGxh
dGUnKSA9PT0gdmlldy5nZXQoJ3RlbXBsYXRlJykgJiYKLSAgICAgIGV4aXN0aW5nVmlldy5nZXQo
J2NvbnRleHQnKSA9PT0gdmlldy5nZXQoJ2NvbnRleHQnKTsKLSAgfSwKLQotICAvKioKLSAgICBS
ZW1vdmVzIGFuIG91dGxldCBmcm9tIHRoZSB2aWV3LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBg
amF2YXNjcmlwdAotICAgIHZhciBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0
ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCdDaGlsZCB2aWV3OiB7e291dGxldCAi
bWFpbiJ9fSAnKQotICAgIH0pOwotICAgIHZhciBteVZpZXcgPSBNeVZpZXcuY3JlYXRlKCk7Ci0g
ICAgbXlWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0gICAgLy8gbXlWaWV3J3MgaHRtbDoKLSAgICAv
LyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVyLXZpZXciPkNoaWxkIHZpZXc6IDwvZGl2
PgotCi0gICAgdmFyIEZvb1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0
ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8aDE+Rm9vPC9oMT4gJykKLSAgICB9KTsKLSAg
ICB2YXIgZm9vVmlldyA9IEZvb1ZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmNvbm5lY3RPdXRs
ZXQoJ21haW4nLCBmb29WaWV3KTsKLSAgICAvLyBteVZpZXcncyBodG1sOgotICAgIC8vIDxkaXYg
aWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxk
aXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1iZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2Pgot
ICAgIC8vIDwvZGl2PgotCi0gICAgbXlWaWV3LmRpc2Nvbm5lY3RPdXRsZXQoJ21haW4nKTsKLSAg
ICAvLyBteVZpZXcncyBodG1sOgotICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1i
ZXItdmlldyI+Q2hpbGQgdmlldzogPC9kaXY+Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nv
bm5lY3RPdXRsZXQKLSAgICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUgVGhlIG5hbWUgb2Yg
dGhlIG91dGxldCB0byBiZSByZW1vdmVkCi0gICAqLwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5j
dGlvbihvdXRsZXROYW1lKSB7Ci0gICAgaWYgKCF0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMp
IHsKLSAgICAgIHRoaXMuX3BlbmRpbmdEaXNjb25uZWN0aW9ucyA9IHt9OwotICAgIH0KLSAgICB0
aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnNbb3V0bGV0TmFtZV0gPSB0cnVlOwotICAgIEVtYmVy
LnJ1bi5vbmNlKHRoaXMsICdfZmluaXNoRGlzY29ubmVjdGlvbnMnKTsKLSAgfSwKLQotICAvKioK
LSAgICBHZXRzIGFuIG91dGxldCB0aGF0IGlzIHBlbmRpbmcgZGlzY29ubmVjdGlvbiBhbmQgdGhl
bgotICAgIG51bGxpZnlzIHRoZSBvYmplY3Qgb24gdGhlIGBfb3V0bGV0YCBvYmplY3QuCi0KLSAg
ICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2ZpbmlzaERpc2Nvbm5lY3Rpb25zCi0gICAqLwotICBf
ZmluaXNoRGlzY29ubmVjdGlvbnM6IGZ1bmN0aW9uKCkgewotICAgIHZhciBvdXRsZXRzID0gZ2V0
KHRoaXMsICdfb3V0bGV0cycpOwotICAgIHZhciBwZW5kaW5nRGlzY29ubmVjdGlvbnMgPSB0aGlz
Ll9wZW5kaW5nRGlzY29ubmVjdGlvbnM7Ci0gICAgdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25z
ID0gbnVsbDsKLQotICAgIGZvciAodmFyIG91dGxldE5hbWUgaW4gcGVuZGluZ0Rpc2Nvbm5lY3Rp
b25zKSB7Ci0gICAgICBzZXQob3V0bGV0cywgb3V0bGV0TmFtZSwgbnVsbCk7Ci0gICAgfQotICB9
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotLy8gQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGFm
dGVyIHRoZSAnYWN0aW9ucycgcXVldWUgKHdoZXJlIFJTVlAgcHJvbWlzZXMKLS8vIHJlc29sdmUp
LCB3aGljaCBpcyB1c2VkIGluIHJvdXRlciB0cmFuc2l0aW9ucyB0byBwcmV2ZW50IHVubmVjZXNz
YXJ5Ci0vLyBsb2FkaW5nIHN0YXRlIGVudHJ5IGlmIGFsbCBjb250ZXh0IHByb21pc2VzIHJlc29s
dmUgb24gdGhlIAotLy8gJ2FjdGlvbnMnIHF1ZXVlIGZpcnN0LgotCi12YXIgcXVldWVzID0gRW1i
ZXIucnVuLnF1ZXVlcywKLSAgICBpbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhP
ZjsKLXF1ZXVlcy5zcGxpY2UoaW5kZXhPZi5jYWxsKHF1ZXVlcywgJ2FjdGlvbnMnKSArIDEsIDAs
ICdyb3V0ZXJUcmFuc2l0aW9ucycpOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoq
Ci1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQg
PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEVtYmVyLkxvY2F0aW9uIHJl
dHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YKLSAgdGhl
IGBsb2NhdGlvbmAgQVBJLgotCi0gICMjIEltcGxlbWVudGF0aW9ucwotCi0gIFlvdSBjYW4gcGFz
cyBhbiBpbXBsZW1lbnRhdGlvbiBuYW1lIChgaGFzaGAsIGBoaXN0b3J5YCwgYG5vbmVgKSB0byBm
b3JjZSBhCi0gIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBpbiB5b3VyIGFw
cGxpY2F0aW9uLgotCi0gICMjIyBIYXNoTG9jYXRpb24KLQotICBVc2luZyBgSGFzaExvY2F0aW9u
YCByZXN1bHRzIGluIFVSTHMgd2l0aCBhIGAjYCAoaGFzaCBzaWduKSBzZXBhcmF0aW5nIHRoZQot
ICBzZXJ2ZXIgc2lkZSBVUkwgcG9ydGlvbiBvZiB0aGUgVVJMIGZyb20gdGhlIHBvcnRpb24gdGhh
dCBpcyB1c2VkIGJ5IEVtYmVyLgotICBUaGlzIHJlbGllcyB1cG9uIHRoZSBgaGFzaGNoYW5nZWAg
ZXZlbnQgZXhpc3RpbmcgaW4gdGhlIGJyb3dzZXIuCi0KLSAgRXhhbXBsZToKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVzb3VyY2Uo
J3Bvc3RzJywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCduZXcnKTsKLSAgICB9KTsK
LSAgfSk7Ci0KLSAgQXBwLlJvdXRlci5yZW9wZW4oewotICAgIGxvY2F0aW9uOiAnaGFzaCcKLSAg
fSk7Ci0gIGBgYAotCi0gIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAv
Iy9wb3N0cy9uZXdgLgotCi0gICMjIyBIaXN0b3J5TG9jYXRpb24KLQotICBVc2luZyBgSGlzdG9y
eUxvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgdGhhdCBhcmUgaW5kaXN0aW5ndWlzaGFibGUgZnJv
bSBhCi0gIHN0YW5kYXJkIFVSTC4gVGhpcyByZWxpZXMgdXBvbiB0aGUgYnJvd3NlcidzIGBoaXN0
b3J5YCBBUEkuCi0KLSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Sb3V0ZXIu
bWFwKGZ1bmN0aW9uKCkgewotICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnJvdXRlKCduZXcnKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgQXBwLlJvdXRl
ci5yZW9wZW4oewotICAgIGxvY2F0aW9uOiAnaGlzdG9yeScKLSAgfSk7Ci0gIGBgYAotCi0gIFRo
aXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvcG9zdHMvbmV3YC4KLQotICAj
IyMgTm9uZUxvY2F0aW9uCi0KLSAgVXNpbmcgYE5vbmVMb2NhdGlvbmAgY2F1c2VzIEVtYmVyIHRv
IG5vdCBzdG9yZSB0aGUgYXBwbGljYXRpb25zIFVSTCBzdGF0ZQotICBpbiB0aGUgYWN0dWFsIFVS
TC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgYW5kIGlzIG9u
ZQotICBvZiB0aGUgY2hhbmdlcyBtYWRlIHdoZW4gY2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGlu
ZygpYC4KLQotICAjIyBMb2NhdGlvbiBBUEkKLQotICBFYWNoIGxvY2F0aW9uIGltcGxlbWVudGF0
aW9uIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0KLSAgKiBpbXBsZW1lbnRh
dGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGltcGxl
bWVudGF0aW9uLgotICAqIGdldFVSTDogcmV0dXJucyB0aGUgY3VycmVudCBVUkwuCi0gICogc2V0
VVJMKHBhdGgpOiBzZXRzIHRoZSBjdXJyZW50IFVSTC4KLSAgKiByZXBsYWNlVVJMKHBhdGgpOiBy
ZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0aW9uYWwpLgotICAqIG9uVXBkYXRlVVJMKGNhbGxi
YWNrKTogdHJpZ2dlcnMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIFVSTCBjaGFuZ2VzLgotICAqIGZv
cm1hdFVSTCh1cmwpOiBmb3JtYXRzIGB1cmxgIHRvIGJlIHBsYWNlZCBpbnRvIGBocmVmYCBhdHRy
aWJ1dGUuCi0KLSAgQ2FsbGluZyBzZXRVUkwgb3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2Vy
IG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4KLQotICBAY2xhc3MgTG9jYXRpb24KLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAc3RhdGljCi0qLwotRW1iZXIuTG9jYXRpb24gPSB7Ci0gIC8qKgotICAgVGhp
cyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHRoZSBjb250YWluZXIgdG8gbG9va3Vw
IHRoZSBsb2NhdGlvbgotICAgaW1wbGVtZW50YXRpb24gYXMgZGVzaXJlZC4KLQotICAgRm9yIGV4
YW1wbGU6Ci0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIC8vIEdpdmVuIGEgbG9jYXRpb24gcmVnaXN0
ZXJlZCBhcyBmb2xsb3dzOgotICAgY29udGFpbmVyLnJlZ2lzdGVyKCdsb2NhdGlvbjpoaXN0b3J5
LXRlc3QnLCBIaXN0b3J5VGVzdExvY2F0aW9uKTsKLQotICAgLy8gWW91IGNvdWxkIGNyZWF0ZSBh
IG5ldyBpbnN0YW5jZSB2aWE6Ci0gICBjb250YWluZXIubG9va3VwKCdsb2NhdGlvbjpoaXN0b3J5
LXRlc3QnKTsKLSAgIGBgYAotCi0gICAgQG1ldGhvZCBjcmVhdGUKLSAgICBAcGFyYW0ge09iamVj
dH0gb3B0aW9ucwotICAgIEByZXR1cm4ge09iamVjdH0gYW4gaW5zdGFuY2Ugb2YgYW4gaW1wbGVt
ZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAgQVBJCi0gICAgQGRlcHJlY2F0ZWQgVXNlIHRoZSBj
b250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdQot
ICAgIG5lZWQuCi0gICovCi0gIGNyZWF0ZTogZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZhciBp
bXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbXBsZW1lbnRhdGlvbjsKLSAgICBF
bWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9uLmNyZWF0ZTogeW91IG11c3Qgc3BlY2lmeSBhICdp
bXBsZW1lbnRhdGlvbicgb3B0aW9uIiwgISFpbXBsZW1lbnRhdGlvbik7Ci0KLSAgICB2YXIgaW1w
bGVtZW50YXRpb25DbGFzcyA9IHRoaXMuaW1wbGVtZW50YXRpb25zW2ltcGxlbWVudGF0aW9uXTsK
LSAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9uLmNyZWF0ZTogIiArIGltcGxlbWVudGF0
aW9uICsgIiBpcyBub3QgYSB2YWxpZCBpbXBsZW1lbnRhdGlvbiIsICEhaW1wbGVtZW50YXRpb25D
bGFzcyk7Ci0KLSAgICByZXR1cm4gaW1wbGVtZW50YXRpb25DbGFzcy5jcmVhdGUuYXBwbHkoaW1w
bGVtZW50YXRpb25DbGFzcywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgIFRoaXMgaXMg
ZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2luZyB0aGUgY29udGFpbmVyIHRvIHJlZ2lzdGVyIHRo
ZQotICAgbG9jYXRpb24gaW1wbGVtZW50YXRpb24gYXMgZGVzaXJlZC4KLQotICAgRXhhbXBsZToK
LQotICAgYGBgamF2YXNjcmlwdAotICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5h
bWU6ICJoaXN0b3J5LXRlc3QtbG9jYXRpb24iLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24o
Y29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2xv
Y2F0aW9uOmhpc3RvcnktdGVzdCcsIEhpc3RvcnlUZXN0TG9jYXRpb24pOwotICAgIH0KLSAgIH0p
OwotICAgYGBgCi0KLSAgIEBtZXRob2QgcmVnaXN0ZXJJbXBsZW1lbnRhdGlvbgotICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUKLSAgIEBwYXJhbSB7T2JqZWN0fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUg
YGxvY2F0aW9uYCBBUEkKLSAgIEBkZXByZWNhdGVkIFJlZ2lzdGVyIHlvdXIgY3VzdG9tIGxvY2F0
aW9uIGltcGxlbWVudGF0aW9uIHdpdGggdGhlCi0gICBjb250YWluZXIgZGlyZWN0bHkuCi0gICov
Ci0gIHJlZ2lzdGVySW1wbGVtZW50YXRpb246IGZ1bmN0aW9uKG5hbWUsIGltcGxlbWVudGF0aW9u
KSB7Ci0gICAgdGhpcy5pbXBsZW1lbnRhdGlvbnNbbmFtZV0gPSBpbXBsZW1lbnRhdGlvbjsKLSAg
fSwKLQotICBpbXBsZW1lbnRhdGlvbnM6IHt9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0K
LXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEVtYmVyLk5v
bmVMb2NhdGlvbiBkb2VzIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBicm93c2VyLiBJdCBpcyB1c2Vm
dWwgZm9yCi0gIHRlc3RpbmcsIG9yIHdoZW4geW91IG5lZWQgdG8gbWFuYWdlIHN0YXRlIHdpdGgg
eW91ciBSb3V0ZXIsIGJ1dCB0ZW1wb3JhcmlseQotICBkb24ndCB3YW50IGl0IHRvIG11Y2sgd2l0
aCB0aGUgVVJMIChmb3IgZXhhbXBsZSB3aGVuIHlvdSBlbWJlZCB5b3VyCi0gIGFwcGxpY2F0aW9u
IGluIGEgbGFyZ2VyIHBhZ2UpLgotCi0gIEBjbGFzcyBOb25lTG9jYXRpb24KLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5Ob25lTG9jYXRpb24g
PSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgcGF0aDogJycsCi0KLSAgLyoqCi0gICAgUmV0dXJu
cyB0aGUgY3VycmVudCBwYXRoLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVSTAot
ICAgIEByZXR1cm4ge1N0cmluZ30gcGF0aAotICAqLwotICBnZXRVUkw6IGZ1bmN0aW9uKCkgewot
ICAgIHJldHVybiBnZXQodGhpcywgJ3BhdGgnKTsKLSAgfSwKLQotICAvKioKLSAgICBTZXQgdGhl
IHBhdGggYW5kIHJlbWVtYmVycyB3aGF0IHdhcyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCi0gICAg
dG8gY2hhbmdlIHRoZSBwYXRoIHdpbGwgbm90IGludm9rZSB0aGUgYHVwZGF0ZVVSTGAgY2FsbGJh
Y2suCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgg
e1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBmdW5jdGlvbihwYXRoKSB7Ci0gICAgc2V0KHRoaXMs
ICdwYXRoJywgcGF0aCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0
byBiZSBpbnZva2VkIHdoZW4gdGhlIHBhdGggY2hhbmdlcy4gVGhlc2UKLSAgICBjYWxsYmFja3Mg
d2lsbCBleGVjdXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgYmFjayBvciBmb3J3YXJkCi0g
ICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBzZXRVUkxgIGlzIGludm9rZWQuCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2Qgb25VcGRhdGVVUkwKLSAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0
aW9ufQotICAqLwotICBvblVwZGF0ZVVSTDogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICB0aGlz
LnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUg
cGF0aCBhbmQgY2FsbHMgdGhlIGB1cGRhdGVVUkxgIGNhbGxiYWNrLgotCi0gICAgQHByaXZhdGUK
LSAgICBAbWV0aG9kIGhhbmRsZVVSTAotICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259Ci0g
ICovCi0gIGhhbmRsZVVSTDogZnVuY3Rpb24odXJsKSB7Ci0gICAgc2V0KHRoaXMsICdwYXRoJywg
dXJsKTsKLSAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
R2l2ZW4gYSBVUkwsIGZvcm1hdHMgaXQgdG8gYmUgcGxhY2VkIGludG8gdGhlIHBhZ2UgYXMgcGFy
dAotICAgIG9mIGFuIGVsZW1lbnQncyBgaHJlZmAgYXR0cmlidXRlLgotCi0gICAgVGhpcyBpcyB1
c2VkLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2luZyB0aGUge3thY3Rpb259fSBoZWxwZXIKLSAgICB0
byBnZW5lcmF0ZSBhIFVSTCBiYXNlZCBvbiBhbiBldmVudC4KLQotICAgIEBwcml2YXRlCi0gICAg
QG1ldGhvZCBmb3JtYXRVUkwKLSAgICBAcGFyYW0gdXJsIHtTdHJpbmd9Ci0gICAgQHJldHVybiB7
U3RyaW5nfSB1cmwKLSAgKi8KLSAgZm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICAvLyBU
aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBvdmVybHkgbWVhbmluZ2Z1bCwgYnV0IHdlIGRvIG5vdCB3
YW50IHRvIHRocm93Ci0gICAgLy8gZXJyb3JzIHdoZW4gdGVzdCBjb2RlIHJlbmRlcnMgdGVtcGxh
dGVzIGNvbnRhaW5pbmcge3thY3Rpb24gaHJlZj10cnVlfX0KLSAgICAvLyBoZWxwZXJzLgotICAg
IHJldHVybiB1cmw7Ci0gIH0KLX0pOwotCi1FbWJlci5Mb2NhdGlvbi5yZWdpc3RlckltcGxlbWVu
dGF0aW9uKCdub25lJywgRW1iZXIuTm9uZUxvY2F0aW9uKTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBgRW1i
ZXIuSGFzaExvY2F0aW9uYCBpbXBsZW1lbnRzIHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJy
b3dzZXIncwotICBoYXNoLiBBdCBwcmVzZW50LCBpdCByZWxpZXMgb24gYSBgaGFzaGNoYW5nZWAg
ZXZlbnQgZXhpc3RpbmcgaW4gdGhlCi0gIGJyb3dzZXIuCi0KLSAgQGNsYXNzIEhhc2hMb2NhdGlv
bgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVy
Lkhhc2hMb2NhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotCi0gIGluaXQ6IGZ1bmN0aW9u
KCkgewotICAgIHNldCh0aGlzLCAnbG9jYXRpb24nLCBnZXQodGhpcywgJ2xvY2F0aW9uJykgfHwg
d2luZG93LmxvY2F0aW9uKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50
IGBsb2NhdGlvbi5oYXNoYCwgbWludXMgdGhlICcjJyBhdCB0aGUgZnJvbnQuCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2QgZ2V0VVJMCi0gICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2l0aG91dCBmZWF0dXJlIGZsYWcgZW5h
YmxlZAotICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0aW9uJykuaGFzaC5zdWJzdHIoMSk7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgU2V0IHRoZSBgbG9jYXRpb24uaGFzaGAgYW5kIHJlbWVtYmVycyB3
aGF0IHdhcyBzZXQuIFRoaXMgcHJldmVudHMKLSAgICBgb25VcGRhdGVVUkxgIGNhbGxiYWNrcyBm
cm9tIHRyaWdnZXJpbmcgd2hlbiB0aGUgaGFzaCB3YXMgc2V0IGJ5Ci0gICAgYEhhc2hMb2NhdGlv
bmAuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgg
e1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBmdW5jdGlvbihwYXRoKSB7Ci0gICAgZ2V0KHRoaXMs
ICdsb2NhdGlvbicpLmhhc2ggPSBwYXRoOwotICAgIHNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBh
dGgpOwotICB9LAotCi0gIC8qKgotICAgIFVzZXMgbG9jYXRpb24ucmVwbGFjZSB0byB1cGRhdGUg
dGhlIHVybCB3aXRob3V0IGEgcGFnZSByZWxvYWQKLSAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlv
bi4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCByZXBsYWNlVVJMCi0gICAgQHBhcmFtIHBh
dGgge1N0cmluZ30KLSAgKi8KLSAgcmVwbGFjZVVSTDogZnVuY3Rpb24ocGF0aCkgewotICAgIGdl
dCh0aGlzLCAnbG9jYXRpb24nKS5yZXBsYWNlKCcjJyArIHBhdGgpOwotICB9LAotCi0gIC8qKgot
ICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBoYXNoIGNoYW5n
ZXMuIFRoZXNlCi0gICAgY2FsbGJhY2tzIHdpbGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNz
ZXMgdGhlIGJhY2sgb3IgZm9yd2FyZAotICAgIGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJM
YCBpcyBpbnZva2VkLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIG9uVXBkYXRlVVJMCi0g
ICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0KLSAgKi8KLSAgb25VcGRhdGVVUkw6IGZ1bmN0
aW9uKGNhbGxiYWNrKSB7Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIHZhciBndWlkID0gRW1i
ZXIuZ3VpZEZvcih0aGlzKTsKLQotICAgIEVtYmVyLiQod2luZG93KS5vbignaGFzaGNoYW5nZS5l
bWJlci1sb2NhdGlvbi0nK2d1aWQsIGZ1bmN0aW9uKCkgewotICAgICAgRW1iZXIucnVuKGZ1bmN0
aW9uKCkgewotICAgICAgICB2YXIgcGF0aCA9IGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpOwotICAg
ICAgICBpZiAoZ2V0KHNlbGYsICdsYXN0U2V0VVJMJykgPT09IHBhdGgpIHsgcmV0dXJuOyB9Ci0K
LSAgICAgICAgc2V0KHNlbGYsICdsYXN0U2V0VVJMJywgbnVsbCk7Ci0KLSAgICAgICAgY2FsbGJh
Y2socGF0aCk7Ci0gICAgICB9KTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBHaXZlbiBh
IFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0Ci0gICAg
b2YgYW4gZWxlbWVudCdzIGBocmVmYCBhdHRyaWJ1dGUuCi0KLSAgICBUaGlzIGlzIHVzZWQsIGZv
ciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7e2FjdGlvbn19IGhlbHBlcgotICAgIHRvIGdlbmVy
YXRlIGEgVVJMIGJhc2VkIG9uIGFuIGV2ZW50LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9k
IGZvcm1hdFVSTAotICAgIEBwYXJhbSB1cmwge1N0cmluZ30KLSAgKi8KLSAgZm9ybWF0VVJMOiBm
dW5jdGlvbih1cmwpIHsKLSAgICByZXR1cm4gJyMnK3VybDsKLSAgfSwKLQotICAvKioKLSAgICBD
bGVhbnMgdXAgdGhlIEhhc2hMb2NhdGlvbiBldmVudCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAqLwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5ndWlkRm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3
aW5kb3cpLm9mZignaGFzaGNoYW5nZS5lbWJlci1sb2NhdGlvbi0nK2d1aWQpOwotICB9Ci19KTsK
LQotRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJbXBsZW1lbnRhdGlvbignaGFzaCcsIEVtYmVyLkhh
c2hMb2NhdGlvbik7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIHBvcHN0YXRlRmlyZWQgPSBmYWxzZTsKLXZhciBzdXBw
b3J0c0hpc3RvcnlTdGF0ZSA9IHdpbmRvdy5oaXN0b3J5ICYmICdzdGF0ZScgaW4gd2luZG93Lmhp
c3Rvcnk7Ci0KLS8qKgotICBFbWJlci5IaXN0b3J5TG9jYXRpb24gaW1wbGVtZW50cyB0aGUgbG9j
YXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MKLSAgaGlzdG9yeS5wdXNoU3RhdGUgQVBJLgot
Ci0gIEBjbGFzcyBIaXN0b3J5TG9jYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5k
cyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5IaXN0b3J5TG9jYXRpb24gPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKHsKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICBzZXQodGhpcywgJ2xvY2F0aW9u
JywgZ2V0KHRoaXMsICdsb2NhdGlvbicpIHx8IHdpbmRvdy5sb2NhdGlvbik7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVXNlZCB0byBzZXQgc3RhdGUgb24gZmlyc3QgY2FsbCB0byBzZXRVUkwKLQotICAg
IEBwcml2YXRlCi0gICAgQG1ldGhvZCBpbml0U3RhdGUKLSAgKi8KLSAgaW5pdFN0YXRlOiBmdW5j
dGlvbigpIHsKLSAgICBzZXQodGhpcywgJ2hpc3RvcnknLCBnZXQodGhpcywgJ2hpc3RvcnknKSB8
fCB3aW5kb3cuaGlzdG9yeSk7Ci0gICAgdGhpcy5yZXBsYWNlU3RhdGUodGhpcy5mb3JtYXRVUkwo
dGhpcy5nZXRVUkwoKSkpOwotICB9LAotCi0gIC8qKgotICAgIFdpbGwgYmUgcHJlLXBlbmRlZCB0
byBwYXRoIHVwb24gc3RhdGUgY2hhbmdlCi0KLSAgICBAcHJvcGVydHkgcm9vdFVSTAotICAgIEBk
ZWZhdWx0ICcvJwotICAqLwotICByb290VVJMOiAnLycsCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0
aGUgY3VycmVudCBgbG9jYXRpb24ucGF0aG5hbWVgIHdpdGhvdXQgYHJvb3RVUkxgLgotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVSTAotICAgIEByZXR1cm4gdXJsIHtTdHJpbmd9Ci0g
ICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJvb3RVUkwgPSBnZXQodGhpcywg
J3Jvb3RVUkwnKSwKLSAgICAgICAgbG9jYXRpb24gPSBnZXQodGhpcywgJ2xvY2F0aW9uJyksCi0g
ICAgICAgIHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKLQotICAgIHJvb3RVUkwgPSByb290VVJM
LnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB2YXIgdXJsID0gcGF0aC5yZXBsYWNlKHJvb3RVUkws
ICcnKTsKLQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXNlcyBg
aGlzdG9yeS5wdXNoU3RhdGVgIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9h
ZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBzZXRVUkwKLSAgICBAcGFyYW0gcGF0aCB7
U3RyaW5nfQotICAqLwotICBzZXRVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUg
PSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0g
ICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGggIT09IHBhdGgpIHsKLSAgICAgIHRoaXMucHVzaFN0
YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBVc2VzIGBoaXN0b3J5LnJlcGxh
Y2VTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1cmwgd2l0aG91dCBhIHBhZ2UgcmVsb2FkCi0gICAgb3Ig
aGlzdG9yeSBtb2RpZmljYXRpb24uCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgcmVwbGFj
ZVVSTAotICAgIEBwYXJhbSBwYXRoIHtTdHJpbmd9Ci0gICovCi0gIHJlcGxhY2VVUkw6IGZ1bmN0
aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0aCA9
IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0gICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGggIT09
IHBhdGgpIHsKLSAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgIEdldCB0aGUgY3VycmVudCBgaGlzdG9yeS5zdGF0ZWAKLSAgIFBvbHlmaWxsIGNo
ZWNrcyBmb3IgbmF0aXZlIGJyb3dzZXIgc3VwcG9ydCBhbmQgZmFsbHMgYmFjayB0byByZXRyaWV2
aW5nCi0gICBmcm9tIGEgcHJpdmF0ZSBfaGlzdG9yeVN0YXRlIHZhcmlhYmxlCi0KLSAgIEBwcml2
YXRlCi0gICBAbWV0aG9kIGdldFN0YXRlCi0gICBAcmV0dXJuIHN0YXRlIHtPYmplY3R9Ci0gICov
Ci0gIGdldFN0YXRlOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gc3VwcG9ydHNIaXN0b3J5U3Rh
dGUgPyBnZXQodGhpcywgJ2hpc3RvcnknKS5zdGF0ZSA6IHRoaXMuX2hpc3RvcnlTdGF0ZTsKLSAg
fSwKLQotICAvKioKLSAgIFB1c2hlcyBhIG5ldyBzdGF0ZS4KLQotICAgQHByaXZhdGUKLSAgIEBt
ZXRob2QgcHVzaFN0YXRlCi0gICBAcGFyYW0gcGF0aCB7U3RyaW5nfQotICAqLwotICBwdXNoU3Rh
dGU6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUgPSB7IHBhdGg6IHBhdGggfTsKLQot
ICAgIGdldCh0aGlzLCAnaGlzdG9yeScpLnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgcGF0aCk7Ci0K
LSAgICAvLyBzdG9yZSBzdGF0ZSBpZiBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBgaGlzdG9yeS5z
dGF0ZWAKLSAgICBpZiAoIXN1cHBvcnRzSGlzdG9yeVN0YXRlKSB7Ci0gICAgICB0aGlzLl9oaXN0
b3J5U3RhdGUgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICAvLyB1c2VkIGZvciB3ZWJraXQgd29ya2Fy
b3VuZAotICAgIHRoaXMuX3ByZXZpb3VzVVJMID0gdGhpcy5nZXRVUkwoKTsKLSAgfSwKLQotICAv
KioKLSAgIFJlcGxhY2VzIHRoZSBjdXJyZW50IHN0YXRlLgotCi0gICBAcHJpdmF0ZQotICAgQG1l
dGhvZCByZXBsYWNlU3RhdGUKLSAgIEBwYXJhbSBwYXRoIHtTdHJpbmd9Ci0gICovCi0gIHJlcGxh
Y2VTdGF0ZTogZnVuY3Rpb24ocGF0aCkgewotICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9
OwotCi0gICAgZ2V0KHRoaXMsICdoaXN0b3J5JykucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCBw
YXRoKTsKLQotICAgIC8vIHN0b3JlIHN0YXRlIGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGBo
aXN0b3J5LnN0YXRlYAotICAgIGlmICghc3VwcG9ydHNIaXN0b3J5U3RhdGUpIHsKLSAgICAgIHRo
aXMuX2hpc3RvcnlTdGF0ZSA9IHN0YXRlOwotICAgIH0KLQotICAgIC8vIHVzZWQgZm9yIHdlYmtp
dCB3b3JrYXJvdW5kCi0gICAgdGhpcy5fcHJldmlvdXNVUkwgPSB0aGlzLmdldFVSTCgpOwotICB9
LAotCi0gIC8qKgotICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuZXZl
ciB0aGUgYnJvd3NlcgotICAgIGhpc3RvcnkgY2hhbmdlcywgaW5jbHVkaW5nIHVzaW5nIGZvcndh
cmQgYW5kIGJhY2sgYnV0dG9ucy4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBvblVwZGF0
ZVVSTAotICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259Ci0gICovCi0gIG9uVXBkYXRlVVJM
OiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlz
KSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICBFbWJlci4kKHdpbmRvdykub24oJ3BvcHN0
YXRlLmVtYmVyLWxvY2F0aW9uLScrZ3VpZCwgZnVuY3Rpb24oZSkgewotICAgICAgLy8gSWdub3Jl
IGluaXRpYWwgcGFnZSBsb2FkIHBvcHN0YXRlIGV2ZW50IGluIENocm9tZQotICAgICAgaWYgKCFw
b3BzdGF0ZUZpcmVkKSB7Ci0gICAgICAgIHBvcHN0YXRlRmlyZWQgPSB0cnVlOwotICAgICAgICBp
ZiAoc2VsZi5nZXRVUkwoKSA9PT0gc2VsZi5fcHJldmlvdXNVUkwpIHsgcmV0dXJuOyB9Ci0gICAg
ICB9Ci0gICAgICBjYWxsYmFjayhzZWxmLmdldFVSTCgpKTsKLSAgICB9KTsKLSAgfSwKLQotICAv
KioKLSAgICBVc2VkIHdoZW4gdXNpbmcgYHt7YWN0aW9ufX1gIGhlbHBlci4gIFRoZSB1cmwgaXMg
YWx3YXlzIGFwcGVuZGVkIHRvIHRoZSByb290VVJMLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIGZvcm1hdFVSTAotICAgIEBwYXJhbSB1cmwge1N0cmluZ30KLSAgICBAcmV0dXJuIGZvcm1h
dHRlZCB1cmwge1N0cmluZ30KLSAgKi8KLSAgZm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAg
ICB2YXIgcm9vdFVSTCA9IGdldCh0aGlzLCAncm9vdFVSTCcpOwotCi0gICAgaWYgKHVybCAhPT0g
JycpIHsKLSAgICAgIHJvb3RVUkwgPSByb290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gcm9vdFVSTCArIHVybDsKLSAgfSwKLQotICAvKioKLSAgICBDbGVhbnMg
dXAgdGhlIEhpc3RvcnlMb2NhdGlvbiBldmVudCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRlCi0g
ICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAqLwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5ndWlkRm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3aW5k
b3cpLm9mZigncG9wc3RhdGUuZW1iZXItbG9jYXRpb24tJytndWlkKTsKLSAgfQotfSk7Ci0KLUVt
YmVyLkxvY2F0aW9uLnJlZ2lzdGVySW1wbGVtZW50YXRpb24oJ2hpc3RvcnknLCBFbWJlci5IaXN0
b3J5TG9jYXRpb24pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBSb3V0aW5nCi0KLUBtb2R1bGUgZW1iZXIKLUBz
dWJtb2R1bGUgZW1iZXItcm91dGluZwotQHJlcXVpcmVzIGVtYmVyLXZpZXdzCi0qLwotCi19KSgp
OwotCi0oZnVuY3Rpb24oKSB7Ci1mdW5jdGlvbiB2aXNpdCh2ZXJ0ZXgsIGZuLCB2aXNpdGVkLCBw
YXRoKSB7Ci0gIHZhciBuYW1lID0gdmVydGV4Lm5hbWUsCi0gICAgdmVydGljZXMgPSB2ZXJ0ZXgu
aW5jb21pbmcsCi0gICAgbmFtZXMgPSB2ZXJ0ZXguaW5jb21pbmdOYW1lcywKLSAgICBsZW4gPSBu
YW1lcy5sZW5ndGgsCi0gICAgaTsKLSAgaWYgKCF2aXNpdGVkKSB7Ci0gICAgdmlzaXRlZCA9IHt9
OwotICB9Ci0gIGlmICghcGF0aCkgewotICAgIHBhdGggPSBbXTsKLSAgfQotICBpZiAodmlzaXRl
ZC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewotICAgIHJldHVybjsKLSAgfQotICBwYXRoLnB1c2go
bmFtZSk7Ci0gIHZpc2l0ZWRbbmFtZV0gPSB0cnVlOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBp
KyspIHsKLSAgICB2aXNpdCh2ZXJ0aWNlc1tuYW1lc1tpXV0sIGZuLCB2aXNpdGVkLCBwYXRoKTsK
LSAgfQotICBmbih2ZXJ0ZXgsIHBhdGgpOwotICBwYXRoLnBvcCgpOwotfQotCi1mdW5jdGlvbiBE
QUcoKSB7Ci0gIHRoaXMubmFtZXMgPSBbXTsKLSAgdGhpcy52ZXJ0aWNlcyA9IHt9OwotfQotCi1E
QUcucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgaWYgKCFuYW1lKSB7IHJldHVy
bjsgfQotICBpZiAodGhpcy52ZXJ0aWNlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewotICAgIHJl
dHVybiB0aGlzLnZlcnRpY2VzW25hbWVdOwotICB9Ci0gIHZhciB2ZXJ0ZXggPSB7Ci0gICAgbmFt
ZTogbmFtZSwgaW5jb21pbmc6IHt9LCBpbmNvbWluZ05hbWVzOiBbXSwgaGFzT3V0Z29pbmc6IGZh
bHNlLCB2YWx1ZTogbnVsbAotICB9OwotICB0aGlzLnZlcnRpY2VzW25hbWVdID0gdmVydGV4Owot
ICB0aGlzLm5hbWVzLnB1c2gobmFtZSk7Ci0gIHJldHVybiB2ZXJ0ZXg7Ci19OwotCi1EQUcucHJv
dG90eXBlLm1hcCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7Ci0gIHRoaXMuYWRkKG5hbWUpLnZh
bHVlID0gdmFsdWU7Ci19OwotCi1EQUcucHJvdG90eXBlLmFkZEVkZ2UgPSBmdW5jdGlvbihmcm9t
TmFtZSwgdG9OYW1lKSB7Ci0gIGlmICghZnJvbU5hbWUgfHwgIXRvTmFtZSB8fCBmcm9tTmFtZSA9
PT0gdG9OYW1lKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhciBmcm9tID0gdGhpcy5hZGQoZnJv
bU5hbWUpLCB0byA9IHRoaXMuYWRkKHRvTmFtZSk7Ci0gIGlmICh0by5pbmNvbWluZy5oYXNPd25Q
cm9wZXJ0eShmcm9tTmFtZSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgZnVuY3Rpb24gY2hlY2tD
eWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKLSAgICBpZiAodmVydGV4Lm5hbWUgPT09IHRvTmFtZSkgewot
ICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJjeWNsZSBkZXRlY3RlZDogIiArIHRvTmFtZSAr
ICIgPC0gIiArIHBhdGguam9pbigiIDwtICIpKTsKLSAgICB9Ci0gIH0KLSAgdmlzaXQoZnJvbSwg
Y2hlY2tDeWNsZSk7Ci0gIGZyb20uaGFzT3V0Z29pbmcgPSB0cnVlOwotICB0by5pbmNvbWluZ1tm
cm9tTmFtZV0gPSBmcm9tOwotICB0by5pbmNvbWluZ05hbWVzLnB1c2goZnJvbU5hbWUpOwotfTsK
LQotREFHLnByb3RvdHlwZS50b3Bzb3J0ID0gZnVuY3Rpb24oZm4pIHsKLSAgdmFyIHZpc2l0ZWQg
PSB7fSwKLSAgICB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXMsCi0gICAgbmFtZXMgPSB0aGlzLm5h
bWVzLAotICAgIGxlbiA9IG5hbWVzLmxlbmd0aCwKLSAgICBpLCB2ZXJ0ZXg7Ci0gIGZvciAoaSA9
IDA7IGkgPCBsZW47IGkrKykgewotICAgIHZlcnRleCA9IHZlcnRpY2VzW25hbWVzW2ldXTsKLSAg
ICBpZiAoIXZlcnRleC5oYXNPdXRnb2luZykgewotICAgICAgdmlzaXQodmVydGV4LCBmbiwgdmlz
aXRlZCk7Ci0gICAgfQotICB9Ci19OwotCi1EQUcucHJvdG90eXBlLmFkZEVkZ2VzID0gZnVuY3Rp
b24obmFtZSwgdmFsdWUsIGJlZm9yZSwgYWZ0ZXIpIHsKLSAgdmFyIGk7Ci0gIHRoaXMubWFwKG5h
bWUsIHZhbHVlKTsKLSAgaWYgKGJlZm9yZSkgewotICAgIGlmICh0eXBlb2YgYmVmb3JlID09PSAn
c3RyaW5nJykgewotICAgICAgdGhpcy5hZGRFZGdlKG5hbWUsIGJlZm9yZSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZWZvcmUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAg
dGhpcy5hZGRFZGdlKG5hbWUsIGJlZm9yZVtpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlm
IChhZnRlcikgewotICAgIGlmICh0eXBlb2YgYWZ0ZXIgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB0
aGlzLmFkZEVkZ2UoYWZ0ZXIsIG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGkgPSAw
OyBpIDwgYWZ0ZXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdGhpcy5hZGRFZGdlKGFmdGVyW2ld
LCBuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX07Ci0KLUVtYmVyLkRBRyA9IERBRzsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBjbGFz
c2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lmeSwKLSAgICBjYXBpdGFsaXplID0gRW1iZXIuU3Ry
aW5nLmNhcGl0YWxpemUsCi0gICAgZGVjYW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXpl
OwotCi0vKioKLSAgVGhlIERlZmF1bHRSZXNvbHZlciBkZWZpbmVzIHRoZSBkZWZhdWx0IGxvb2t1
cCBydWxlcyB0byByZXNvbHZlCi0gIGNvbnRhaW5lciBsb29rdXBzIGJlZm9yZSBjb25zdWx0aW5n
IHRoZSBjb250YWluZXIgZm9yIHJlZ2lzdGVyZWQKLSAgaXRlbXM6Ci0KLSogdGVtcGxhdGVzIGFy
ZSBsb29rZWQgdXAgb24gYEVtYmVyLlRFTVBMQVRFU2AKLSogb3RoZXIgbmFtZXMgYXJlIGxvb2tl
ZCB1cCBvbiB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgY29udmVydGluZwotICB0aGUgbmFtZS4gRm9y
IGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3RgIGxvb2tzIHVwCi0gIGBBcHAuUG9zdENvbnRyb2xs
ZXJgIGJ5IGRlZmF1bHQuCi0qIHRoZXJlIGFyZSBzb21lIG51YW5jZXMgKHNlZSBleGFtcGxlcyBi
ZWxvdykKLQotICAjIyMgSG93IFJlc29sdmluZyBXb3JrcwotCi0gIFRoZSBjb250YWluZXIgY2Fs
bHMgdGhpcyBvYmplY3QncyBgcmVzb2x2ZWAgbWV0aG9kIHdpdGggdGhlCi0gIGBmdWxsTmFtZWAg
YXJndW1lbnQuCi0KLSAgSXQgZmlyc3QgcGFyc2VzIHRoZSBmdWxsTmFtZSBpbnRvIGFuIG9iamVj
dCB1c2luZyBgcGFyc2VOYW1lYC4KLQotICBUaGVuIGl0IGNoZWNrcyBmb3IgdGhlIHByZXNlbmNl
IG9mIGEgdHlwZS1zcGVjaWZpYyBpbnN0YW5jZQotICBtZXRob2Qgb2YgdGhlIGZvcm0gYHJlc29s
dmVbVHlwZV1gIGFuZCBjYWxscyBpdCBpZiBpdCBleGlzdHMuCi0gIEZvciBleGFtcGxlIGlmIGl0
IHdhcyByZXNvbHZpbmcgJ3RlbXBsYXRlOnBvc3QnLCBpdCB3b3VsZCBjYWxsCi0gIHRoZSBgcmVz
b2x2ZVRlbXBsYXRlYCBtZXRob2QuCi0KLSAgSXRzIGxhc3QgcmVzb3J0IGlzIHRvIGNhbGwgdGhl
IGByZXNvbHZlT3RoZXJgIG1ldGhvZC4KLQotICBUaGUgbWV0aG9kcyBvZiB0aGlzIG9iamVjdCBh
cmUgZGVzaWduZWQgdG8gYmUgZWFzeSB0byBvdmVycmlkZQotICBpbiBhIHN1YmNsYXNzLiBGb3Ig
ZXhhbXBsZSwgeW91IGNvdWxkIGVuaGFuY2UgaG93IGEgdGVtcGxhdGUKLSAgaXMgcmVzb2x2ZWQg
bGlrZSBzbzoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNy
ZWF0ZSh7Ci0gICAgUmVzb2x2ZXI6IEVtYmVyLkRlZmF1bHRSZXNvbHZlci5leHRlbmQoewotICAg
ICAgcmVzb2x2ZVRlbXBsYXRlOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7Ci0gICAgICAgIHZhciBy
ZXNvbHZlZFRlbXBsYXRlID0gdGhpcy5fc3VwZXIocGFyc2VkTmFtZSk7Ci0gICAgICAgIGlmIChy
ZXNvbHZlZFRlbXBsYXRlKSB7IHJldHVybiByZXNvbHZlZFRlbXBsYXRlOyB9Ci0gICAgICAgIHJl
dHVybiBFbWJlci5URU1QTEFURVNbJ25vdF9mb3VuZCddOwotICAgICAgfQotICAgIH0pCi0gIH0p
OwotICBgYGAKLQotICBTb21lIGV4YW1wbGVzIG9mIGhvdyBuYW1lcyBhcmUgcmVzb2x2ZWQ6Ci0K
LSAgYGBgCi0gICd0ZW1wbGF0ZTpwb3N0JyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdCddCi0g
ICd0ZW1wbGF0ZTpwb3N0cy9ieWxpbmUnIC8vPT4gRW1iZXIuVEVNUExBVEVTWydwb3N0cy9ieWxp
bmUnXQotICAndGVtcGxhdGU6cG9zdHMuYnlsaW5lJyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9z
dHMvYnlsaW5lJ10KLSAgJ3RlbXBsYXRlOmJsb2dQb3N0JyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sn
YmxvZ1Bvc3QnXQotICAgICAgICAgICAgICAgICAgICAgIC8vICAgT1IKLSAgICAgICAgICAgICAg
ICAgICAgICAvLyAgIEVtYmVyLlRFTVBMQVRFU1snYmxvZ19wb3N0J10KLSAgJ2NvbnRyb2xsZXI6
cG9zdCcgLy89PiBBcHAuUG9zdENvbnRyb2xsZXIKLSAgJ2NvbnRyb2xsZXI6cG9zdHMuaW5kZXgn
IC8vPT4gQXBwLlBvc3RzSW5kZXhDb250cm9sbGVyCi0gICdjb250cm9sbGVyOmJsb2cvcG9zdCcg
Ly89PiBCbG9nLlBvc3RDb250cm9sbGVyCi0gICdjb250cm9sbGVyOmJhc2ljJyAvLz0+IEVtYmVy
LkNvbnRyb2xsZXIKLSAgJ3JvdXRlOnBvc3QnIC8vPT4gQXBwLlBvc3RSb3V0ZQotICAncm91dGU6
cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3RzSW5kZXhSb3V0ZQotICAncm91dGU6YmxvZy9wb3N0
JyAvLz0+IEJsb2cuUG9zdFJvdXRlCi0gICdyb3V0ZTpiYXNpYycgLy89PiBFbWJlci5Sb3V0ZQot
ICAndmlldzpwb3N0JyAvLz0+IEFwcC5Qb3N0VmlldwotICAndmlldzpwb3N0cy5pbmRleCcgLy89
PiBBcHAuUG9zdHNJbmRleFZpZXcKLSAgJ3ZpZXc6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdFZp
ZXcKLSAgJ3ZpZXc6YmFzaWMnIC8vPT4gRW1iZXIuVmlldwotICAnZm9vOnBvc3QnIC8vPT4gQXBw
LlBvc3RGb28KLSAgJ21vZGVsOnBvc3QnIC8vPT4gQXBwLlBvc3QKLSAgYGBgCi0KLSAgQGNsYXNz
IERlZmF1bHRSZXNvbHZlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9i
amVjdAotKi8KLUVtYmVyLkRlZmF1bHRSZXNvbHZlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewot
ICAvKioKLSAgICBUaGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpbnN0YW5jZSB3
aGVuIGl0IGlzCi0gICAgY3JlYXRlZC4KLQotICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKLSAgKi8K
LSAgbmFtZXNwYWNlOiBudWxsLAotCi0gIG5vcm1hbGl6ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsK
LSAgICB2YXIgc3BsaXQgPSBmdWxsTmFtZS5zcGxpdCgnOicsIDIpLAotICAgICAgICB0eXBlID0g
c3BsaXRbMF0sCi0gICAgICAgIG5hbWUgPSBzcGxpdFsxXTsKLQotICAgIEVtYmVyLmFzc2VydCgi
VHJpZWQgdG8gbm9ybWFsaXplIGEgY29udGFpbmVyIG5hbWUgd2l0aG91dCBhIGNvbG9uICg6KSBp
biAiICsKLSAgICAgICAgICAgICAgICAgIml0LiBZb3UgcHJvYmFibHkgdHJpZWQgdG8gbG9va3Vw
IGEgbmFtZSB0aGF0IGRpZCBub3QgY29udGFpbiAiICsKLSAgICAgICAgICAgICAgICAgImEgdHlw
ZSwgYSBjb2xvbiwgYW5kIGEgbmFtZS4gQSBwcm9wZXIgbG9va3VwIG5hbWUgd291bGQgYmUgIiAr
Ci0gICAgICAgICAgICAgICAgICJgdmlldzpwb3N0YC4iLCBzcGxpdC5sZW5ndGggPT09IDIpOwot
Ci0gICAgaWYgKHR5cGUgIT09ICd0ZW1wbGF0ZScpIHsKLSAgICAgIHZhciByZXN1bHQgPSBuYW1l
OwotCi0gICAgICBpZiAocmVzdWx0LmluZGV4T2YoJy4nKSA+IC0xKSB7Ci0gICAgICAgIHJlc3Vs
dCA9IHJlc3VsdC5yZXBsYWNlKC9cLiguKS9nLCBmdW5jdGlvbihtKSB7IHJldHVybiBtLmNoYXJB
dCgxKS50b1VwcGVyQ2FzZSgpOyB9KTsKLSAgICAgIH0KLQotICAgICAgaWYgKG5hbWUuaW5kZXhP
ZignXycpID4gLTEpIHsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL18oLikvZywg
ZnVuY3Rpb24obSkgeyByZXR1cm4gbS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsgfSk7Ci0gICAg
ICB9Ci0KLSAgICAgIHJldHVybiB0eXBlICsgJzonICsgcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0g
ICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgfQotICB9LAotCi0KLSAgLyoqCi0gICAgVGhpcyBt
ZXRob2QgaXMgY2FsbGVkIHZpYSB0aGUgY29udGFpbmVyJ3MgcmVzb2x2ZXIgbWV0aG9kLgotICAg
IEl0IHBhcnNlcyB0aGUgcHJvdmlkZWQgYGZ1bGxOYW1lYCBhbmQgdGhlbiBsb29rcyB1cCBhbmQK
LSAgICByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBvciBjbGFzcy4KLQotICAgIEBt
ZXRob2QgcmVzb2x2ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0
cmluZwotICAgIEByZXR1cm4ge09iamVjdH0gdGhlIHJlc29sdmVkIGZhY3RvcnkKLSAgKi8KLSAg
cmVzb2x2ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMu
cGFyc2VOYW1lKGZ1bGxOYW1lKSwKLSAgICAgICAgdHlwZVNwZWNpZmljUmVzb2x2ZU1ldGhvZCA9
IHRoaXNbcGFyc2VkTmFtZS5yZXNvbHZlTWV0aG9kTmFtZV07Ci0KLSAgICBpZiAoIXBhcnNlZE5h
bWUubmFtZSB8fCAhcGFyc2VkTmFtZS50eXBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVHlwZUVycm9y
KCJJbnZhbGlkIGZ1bGxOYW1lOiBgIiArIGZ1bGxOYW1lICsgImAsIG11c3QgYmUgb2YgdGhlIGZv
cm0gYHR5cGU6bmFtZWAgIik7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVTcGVjaWZpY1Jlc29sdmVN
ZXRob2QpIHsKLSAgICAgIHZhciByZXNvbHZlZCA9IHR5cGVTcGVjaWZpY1Jlc29sdmVNZXRob2Qu
Y2FsbCh0aGlzLCBwYXJzZWROYW1lKTsKLSAgICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gcmVz
b2x2ZWQ7IH0KLSAgICB9Ci0gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUp
OwotICB9LAotICAvKioKLSAgICBDb252ZXJ0IHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgZm9ybSAi
dHlwZTpuYW1lIiB0bwotICAgIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkIGFz
cGVjdHMgb2YgdGhlIG5hbWUKLSAgICBicm9rZW4gb3V0LgotCi0gICAgQHByb3RlY3RlZAotICAg
IEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2Qg
cGFyc2VOYW1lCi0gICovCi0gIHBhcnNlTmFtZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2
YXIgbmFtZVBhcnRzID0gZnVsbE5hbWUuc3BsaXQoIjoiKSwKLSAgICAgICAgdHlwZSA9IG5hbWVQ
YXJ0c1swXSwgZnVsbE5hbWVXaXRob3V0VHlwZSA9IG5hbWVQYXJ0c1sxXSwKLSAgICAgICAgbmFt
ZSA9IGZ1bGxOYW1lV2l0aG91dFR5cGUsCi0gICAgICAgIG5hbWVzcGFjZSA9IGdldCh0aGlzLCAn
bmFtZXNwYWNlJyksCi0gICAgICAgIHJvb3QgPSBuYW1lc3BhY2U7Ci0KLSAgICBpZiAodHlwZSAh
PT0gJ3RlbXBsYXRlJyAmJiBuYW1lLmluZGV4T2YoJy8nKSAhPT0gLTEpIHsKLSAgICAgIHZhciBw
YXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKLSAgICAgIG5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGgg
LSAxXTsKLSAgICAgIHZhciBuYW1lc3BhY2VOYW1lID0gY2FwaXRhbGl6ZShwYXJ0cy5zbGljZSgw
LCAtMSkuam9pbignLicpKTsKLSAgICAgIHJvb3QgPSBFbWJlci5OYW1lc3BhY2UuYnlOYW1lKG5h
bWVzcGFjZU5hbWUpOwotCi0gICAgICBFbWJlci5hc3NlcnQoJ1lvdSBhcmUgbG9va2luZyBmb3Ig
YSAnICsgbmFtZSArICcgJyArIHR5cGUgKyAnIGluIHRoZSAnICsgbmFtZXNwYWNlTmFtZSArICcg
bmFtZXNwYWNlLCBidXQgdGhlIG5hbWVzcGFjZSBjb3VsZCBub3QgYmUgZm91bmQnLCByb290KTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gewotICAgICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAotICAgICAg
dHlwZTogdHlwZSwKLSAgICAgIGZ1bGxOYW1lV2l0aG91dFR5cGU6IGZ1bGxOYW1lV2l0aG91dFR5
cGUsCi0gICAgICBuYW1lOiBuYW1lLAotICAgICAgcm9vdDogcm9vdCwKLSAgICAgIHJlc29sdmVN
ZXRob2ROYW1lOiAicmVzb2x2ZSIgKyBjbGFzc2lmeSh0eXBlKQotICAgIH07Ci0gIH0sCi0gIC8q
KgotICAgIExvb2sgdXAgdGhlIHRlbXBsYXRlIGluIEVtYmVyLlRFTVBMQVRFUwotCi0gICAgQHBy
b3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVj
dCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0
aG9kIHJlc29sdmVUZW1wbGF0ZQotICAqLwotICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uKHBh
cnNlZE5hbWUpIHsKLSAgICB2YXIgdGVtcGxhdGVOYW1lID0gcGFyc2VkTmFtZS5mdWxsTmFtZVdp
dGhvdXRUeXBlLnJlcGxhY2UoL1wuL2csICcvJyk7Ci0KLSAgICBpZiAoRW1iZXIuVEVNUExBVEVT
W3RlbXBsYXRlTmFtZV0pIHsKLSAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVO
YW1lXTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZU5hbWUgPSBkZWNhbWVsaXplKHRlbXBsYXRlTmFt
ZSk7Ci0gICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdKSB7Ci0gICAgICByZXR1
cm4gRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFtZV07Ci0gICAgfQotICB9LAotICAvKioKLSAg
ICBHaXZlbiBhIHBhcnNlTmFtZSBvYmplY3QgKG91dHB1dCBmcm9tIGBwYXJzZU5hbWVgKSwgYXBw
bHkKLSAgICB0aGUgY29udmVudGlvbnMgZXhwZWN0ZWQgYnkgYEVtYmVyLlJvdXRlcmAKLQotICAg
IEBwcm90ZWN0ZWQKLSAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBv
YmplY3Qgd2l0aCB0aGUgcGFyc2VkCi0gICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCi0gICAg
QG1ldGhvZCB1c2VSb3V0ZXJOYW1pbmcKLSAgKi8KLSAgdXNlUm91dGVyTmFtaW5nOiBmdW5jdGlv
bihwYXJzZWROYW1lKSB7Ci0gICAgcGFyc2VkTmFtZS5uYW1lID0gcGFyc2VkTmFtZS5uYW1lLnJl
cGxhY2UoL1wuL2csICdfJyk7Ci0gICAgaWYgKHBhcnNlZE5hbWUubmFtZSA9PT0gJ2Jhc2ljJykg
ewotICAgICAgcGFyc2VkTmFtZS5uYW1lID0gJyc7Ci0gICAgfQotICB9LAotICAvKioKLSAgICBM
b29rdXAgdGhlIGNvbnRyb2xsZXIgdXNpbmcgYHJlc29sdmVPdGhlcmAKLQotICAgIEBwcm90ZWN0
ZWQKLSAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0
aCB0aGUgcGFyc2VkCi0gICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCi0gICAgQG1ldGhvZCBy
ZXNvbHZlQ29udHJvbGxlcgotICAqLwotICByZXNvbHZlQ29udHJvbGxlcjogZnVuY3Rpb24ocGFy
c2VkTmFtZSkgewotICAgIHRoaXMudXNlUm91dGVyTmFtaW5nKHBhcnNlZE5hbWUpOwotICAgIHJl
dHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJzZWROYW1lKTsKLSAgfSwKLSAgLyoqCi0gICAgTG9v
a3VwIHRoZSByb3V0ZSB1c2luZyBgcmVzb2x2ZU90aGVyYAotCi0gICAgQHByb3RlY3RlZAotICAg
IEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBw
YXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVS
b3V0ZQotICAqLwotICByZXNvbHZlUm91dGU6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICB0
aGlzLnVzZVJvdXRlck5hbWluZyhwYXJzZWROYW1lKTsKLSAgICByZXR1cm4gdGhpcy5yZXNvbHZl
T3RoZXIocGFyc2VkTmFtZSk7Ci0gIH0sCi0gIC8qKgotICAgIExvb2t1cCB0aGUgdmlldyB1c2lu
ZyBgcmVzb2x2ZU90aGVyYAotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBw
YXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxO
YW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVWaWV3Ci0gICovCi0gIHJlc29s
dmVWaWV3OiBmdW5jdGlvbihwYXJzZWROYW1lKSB7Ci0gICAgdGhpcy51c2VSb3V0ZXJOYW1pbmco
cGFyc2VkTmFtZSk7Ci0gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOwot
ICB9LAotCi0gIHJlc29sdmVIZWxwZXI6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICByZXR1
cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2VkTmFtZSkgfHwgRW1iZXIuSGFuZGxlYmFycy5oZWxw
ZXJzW3BhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZV07Ci0gIH0sCi0KLSAgLyoqCi0gICAg
TG9va3VwIHRoZSBtb2RlbCBvbiB0aGUgQXBwbGljYXRpb24gbmFtZXNwYWNlCi0KLSAgICBAcHJv
dGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0
IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRo
b2QgcmVzb2x2ZU1vZGVsCi0gICovCi0gIHJlc29sdmVNb2RlbDogZnVuY3Rpb24ocGFyc2VkTmFt
ZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc2lmeShwYXJzZWROYW1lLm5hbWUpLAotICAg
ICAgICBmYWN0b3J5ID0gZ2V0KHBhcnNlZE5hbWUucm9vdCwgY2xhc3NOYW1lKTsKLQotICAgICBp
ZiAoZmFjdG9yeSkgeyByZXR1cm4gZmFjdG9yeTsgfQotICB9LAotICAvKioKLSAgICBMb29rIHVw
IHRoZSBzcGVjaWZpZWQgb2JqZWN0IChmcm9tIHBhcnNlZE5hbWUpIG9uIHRoZSBhcHByb3ByaWF0
ZQotICAgIG5hbWVzcGFjZSAodXN1YWxseSBvbiB0aGUgQXBwbGljYXRpb24pCi0KLSAgICBAcHJv
dGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0
IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRo
b2QgcmVzb2x2ZU90aGVyCi0gICovCi0gIHJlc29sdmVPdGhlcjogZnVuY3Rpb24ocGFyc2VkTmFt
ZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc2lmeShwYXJzZWROYW1lLm5hbWUpICsgY2xh
c3NpZnkocGFyc2VkTmFtZS50eXBlKSwKLSAgICAgICAgZmFjdG9yeSA9IGdldChwYXJzZWROYW1l
LnJvb3QsIGNsYXNzTmFtZSk7Ci0gICAgaWYgKGZhY3RvcnkpIHsgcmV0dXJuIGZhY3Rvcnk7IH0K
LSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24g
Zm9yIGEgZnVsbE5hbWUuIFVzZWQgYnkgdGhlCi0gICAgQXBwbGljYXRpb24gbmFtZXNwYWNlIGlu
IGFzc2VydGlvbnMgdG8gZGVzY3JpYmUgdGhlCi0gICAgcHJlY2lzZSBuYW1lIG9mIHRoZSBjbGFz
cyB0aGF0IEVtYmVyIGlzIGxvb2tpbmcgZm9yLCByYXRoZXIgdGhhbgotICAgIGNvbnRhaW5lciBr
ZXlzLgotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0aGUg
bG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgbG9va3VwRGVzY3JpcHRpb24KLSAgKi8KLSAgbG9v
a3VwRGVzY3JpcHRpb246IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgdmFyIHBhcnNlZE5hbWUg
PSB0aGlzLnBhcnNlTmFtZShmdWxsTmFtZSk7Ci0KLSAgICBpZiAocGFyc2VkTmFtZS50eXBlID09
PSAndGVtcGxhdGUnKSB7Ci0gICAgICByZXR1cm4gInRlbXBsYXRlIGF0ICIgKyBwYXJzZWROYW1l
LmZ1bGxOYW1lV2l0aG91dFR5cGUucmVwbGFjZSgvXC4vZywgJy8nKTsKLSAgICB9Ci0KLSAgICB2
YXIgZGVzY3JpcHRpb24gPSBwYXJzZWROYW1lLnJvb3QgKyAiLiIgKyBjbGFzc2lmeShwYXJzZWRO
YW1lLm5hbWUpOwotICAgIGlmIChwYXJzZWROYW1lLnR5cGUgIT09ICdtb2RlbCcpIHsgZGVzY3Jp
cHRpb24gKz0gY2xhc3NpZnkocGFyc2VkTmFtZS50eXBlKTsgfQotCi0gICAgcmV0dXJuIGRlc2Ny
aXB0aW9uOwotICB9LAotCi0gIG1ha2VUb1N0cmluZzogZnVuY3Rpb24oZmFjdG9yeSwgZnVsbE5h
bWUpIHsKLSAgICByZXR1cm4gZmFjdG9yeS50b1N0cmluZygpOwotICB9Ci19KTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci1hcHBsaWNhdGlvbgotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotCi1mdW5jdGlvbiBEZXByZWNhdGVkQ29udGFpbmVyKGNvbnRhaW5lcikgewotICB0aGlzLl9j
b250YWluZXIgPSBjb250YWluZXI7Ci19Ci0KLURlcHJlY2F0ZWRDb250YWluZXIuZGVwcmVjYXRl
ID0gZnVuY3Rpb24obWV0aG9kKSB7Ci0gIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29u
dGFpbmVyID0gdGhpcy5fY29udGFpbmVyOwotCi0gICAgRW1iZXIuZGVwcmVjYXRlKCdVc2luZyB0
aGUgZGVmYXVsdENvbnRhaW5lciBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBbZGVmYXVsdENvbnRh
aW5lciMnICsgbWV0aG9kICsgJ10gc2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQScsIGZhbHNlKTsK
LSAgICByZXR1cm4gY29udGFpbmVyW21ldGhvZF0uYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMp
OwotICB9OwotfTsKLQotRGVwcmVjYXRlZENvbnRhaW5lci5wcm90b3R5cGUgPSB7Ci0gIF9jb250
YWluZXI6IG51bGwsCi0gIGxvb2t1cDogRGVwcmVjYXRlZENvbnRhaW5lci5kZXByZWNhdGUoJ2xv
b2t1cCcpLAotICByZXNvbHZlOiBEZXByZWNhdGVkQ29udGFpbmVyLmRlcHJlY2F0ZSgncmVzb2x2
ZScpLAotICByZWdpc3RlcjogRGVwcmVjYXRlZENvbnRhaW5lci5kZXByZWNhdGUoJ3JlZ2lzdGVy
JykKLX07Ci0KLS8qKgotICBBbiBpbnN0YW5jZSBvZiBgRW1iZXIuQXBwbGljYXRpb25gIGlzIHRo
ZSBzdGFydGluZyBwb2ludCBmb3IgZXZlcnkgRW1iZXIKLSAgYXBwbGljYXRpb24uIEl0IGhlbHBz
IHRvIGluc3RhbnRpYXRlLCBpbml0aWFsaXplIGFuZCBjb29yZGluYXRlIHRoZSBtYW55Ci0gIG9i
amVjdHMgdGhhdCBtYWtlIHVwIHlvdXIgYXBwLgotCi0gIEVhY2ggRW1iZXIgYXBwIGhhcyBvbmUg
YW5kIG9ubHkgb25lIGBFbWJlci5BcHBsaWNhdGlvbmAgb2JqZWN0LiBJbiBmYWN0LCB0aGUKLSAg
dmVyeSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxkIGRvIGluIHlvdXIgYXBwbGljYXRpb24gaXMgY3Jl
YXRlIHRoZSBpbnN0YW5jZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHdpbmRvdy5BcHAgPSBFbWJl
ci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAgYGBgCi0KLSAgVHlwaWNhbGx5LCB0aGUgYXBwbGlj
YXRpb24gb2JqZWN0IGlzIHRoZSBvbmx5IGdsb2JhbCB2YXJpYWJsZS4gQWxsIG90aGVyCi0gIGNs
YXNzZXMgaW4geW91ciBhcHAgc2hvdWxkIGJlIHByb3BlcnRpZXMgb24gdGhlIGBFbWJlci5BcHBs
aWNhdGlvbmAgaW5zdGFuY2UsCi0gIHdoaWNoIGhpZ2hsaWdodHMgaXRzIGZpcnN0IHJvbGU6IGEg
Z2xvYmFsIG5hbWVzcGFjZS4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIHZpZXcg
Y2xhc3MsIGl0IG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
Lk15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKCk7Ci0gIGBgYAotCi0gIEJ5IGRlZmF1bHQsIGNh
bGxpbmcgYEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpYCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5p
dGlhbGl6ZQotICB5b3VyIGFwcGxpY2F0aW9uIGJ5IGNhbGxpbmcgdGhlIGBFbWJlci5BcHBsaWNh
dGlvbi5pbml0aWFsaXplKClgIG1ldGhvZC4gSWYKLSAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlh
bGl6YXRpb24sIHlvdSBjYW4gY2FsbCB5b3VyIGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAotICBt
ZXRob2QuIFdoZW4geW91IGFyZSByZWFkeSBmb3IgeW91ciBhcHAgdG8gYmUgaW5pdGlhbGl6ZWQs
IGNhbGwgaXRzCi0gIGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhvZC4KLQotICBZb3UgY2FuIGRl
ZmluZSBhIGByZWFkeWAgbWV0aG9kIG9uIHRoZSBgRW1iZXIuQXBwbGljYXRpb25gIGluc3RhbmNl
LCB3aGljaAotICB3aWxsIGJlIHJ1biBieSBFbWJlciB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBp
bml0aWFsaXplZC4KLQotICBCZWNhdXNlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5oZXJpdHMgZnJv
bSBgRW1iZXIuTmFtZXNwYWNlYCwgYW55IGNsYXNzZXMKLSAgeW91IGNyZWF0ZSB3aWxsIGhhdmUg
dXNlZnVsIHN0cmluZyByZXByZXNlbnRhdGlvbnMgd2hlbiBjYWxsaW5nIGB0b1N0cmluZygpYC4K
LSAgU2VlIHRoZSBgRW1iZXIuTmFtZXNwYWNlYCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9y
bWF0aW9uLgotCi0gIFdoaWxlIHlvdSBjYW4gdGhpbmsgb2YgeW91ciBgRW1iZXIuQXBwbGljYXRp
b25gIGFzIGEgY29udGFpbmVyIHRoYXQgaG9sZHMgdGhlCi0gIG90aGVyIGNsYXNzZXMgaW4geW91
ciBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgcmVzcG9uc2liaWxpdGllcwot
ICBnb2luZyBvbiB1bmRlci10aGUtaG9vZCB0aGF0IHlvdSBtYXkgd2FudCB0byB1bmRlcnN0YW5k
LgotCi0gICMjIyBFdmVudCBEZWxlZ2F0aW9uCi0KLSAgRW1iZXIgdXNlcyBhIHRlY2huaXF1ZSBj
YWxsZWQgX2V2ZW50IGRlbGVnYXRpb25fLiBUaGlzIGFsbG93cyB0aGUgZnJhbWV3b3JrCi0gIHRv
IHNldCB1cCBhIGdsb2JhbCwgc2hhcmVkIGV2ZW50IGxpc3RlbmVyIGluc3RlYWQgb2YgcmVxdWly
aW5nIGVhY2ggdmlldyB0bwotICBkbyBpdCBtYW51YWxseS4gRm9yIGV4YW1wbGUsIGluc3RlYWQg
b2YgZWFjaCB2aWV3IHJlZ2lzdGVyaW5nIGl0cyBvd24KLSAgYG1vdXNlZG93bmAgbGlzdGVuZXIg
b24gaXRzIGFzc29jaWF0ZWQgZWxlbWVudCwgRW1iZXIgc2V0cyB1cCBhIGBtb3VzZWRvd25gCi0g
IGxpc3RlbmVyIG9uIHRoZSBgYm9keWAuCi0KLSAgSWYgYSBgbW91c2Vkb3duYCBldmVudCBvY2N1
cnMsIEVtYmVyIHdpbGwgbG9vayBhdCB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBhbmQKLSAgc3Rh
cnQgd2Fsa2luZyB1cCB0aGUgRE9NIG5vZGUgdHJlZSwgZmluZGluZyBjb3JyZXNwb25kaW5nIHZp
ZXdzIGFuZCBpbnZva2luZwotICB0aGVpciBgbW91c2VEb3duYCBtZXRob2QgYXMgaXQgZ29lcy4K
LQotICBgRW1iZXIuQXBwbGljYXRpb25gIGhhcyBhIG51bWJlciBvZiBkZWZhdWx0IGV2ZW50cyB0
aGF0IGl0IGxpc3RlbnMgZm9yLCBhcwotICB3ZWxsIGFzIGEgbWFwcGluZyBmcm9tIGxvd2VyY2Fz
ZSBldmVudHMgdG8gY2FtZWwtY2FzZWQgdmlldyBtZXRob2QgbmFtZXMuIEZvcgotICBleGFtcGxl
LCB0aGUgYGtleXByZXNzYCBldmVudCBjYXVzZXMgdGhlIGBrZXlQcmVzc2AgbWV0aG9kIG9uIHRo
ZSB2aWV3IHRvIGJlCi0gIGNhbGxlZCwgdGhlIGBkYmxjbGlja2AgZXZlbnQgY2F1c2VzIGBkb3Vi
bGVDbGlja2AgdG8gYmUgY2FsbGVkLCBhbmQgc28gb24uCi0KLSAgSWYgdGhlcmUgaXMgYSBidWJi
bGluZyBicm93c2VyIGV2ZW50IHRoYXQgRW1iZXIgZG9lcyBub3QgbGlzdGVuIGZvciBieQotICBk
ZWZhdWx0LCB5b3UgY2FuIHNwZWNpZnkgY3VzdG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9u
ZGluZyB2aWV3IG1ldGhvZAotICBuYW1lcyBieSBzZXR0aW5nIHRoZSBhcHBsaWNhdGlvbidzIGBj
dXN0b21FdmVudHNgIHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwID0gRW1iZXIu
QXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBjdXN0b21FdmVudHM6IHsKLSAgICAgIC8vIGFkZCBz
dXBwb3J0IGZvciB0aGUgcGFzdGUgZXZlbnQKLSAgICAgIHBhc3RlOiAicGFzdGUiCi0gICAgfQot
ICB9KTsKLSAgYGBgCi0KLSAgQnkgZGVmYXVsdCwgdGhlIGFwcGxpY2F0aW9uIHNldHMgdXAgdGhl
c2UgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBkb2N1bWVudAotICBib2R5LiBIb3dldmVyLCBpbiBj
YXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGluZyBhbiBFbWJlciBhcHBsaWNhdGlvbiBpbnNpZGUK
LSAgYW4gZXhpc3RpbmcgcGFnZSwgeW91IG1heSB3YW50IGl0IHRvIHNldCB1cCB0aGUgbGlzdGVu
ZXJzIG9uIGFuIGVsZW1lbnQKLSAgaW5zaWRlIHRoZSBib2R5LgotCi0gIEZvciBleGFtcGxlLCBp
ZiBvbmx5IGV2ZW50cyBpbnNpZGUgYSBET00gZWxlbWVudCB3aXRoIHRoZSBJRCBvZiBgZW1iZXIt
YXBwYAotICBzaG91bGQgYmUgZGVsZWdhdGVkLCBzZXQgeW91ciBhcHBsaWNhdGlvbidzIGByb290
RWxlbWVudGAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB3aW5kb3cuQXBwID0gRW1i
ZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCi0g
IH0pOwotICBgYGAKLQotICBUaGUgYHJvb3RFbGVtZW50YCBjYW4gYmUgZWl0aGVyIGEgRE9NIGVs
ZW1lbnQgb3IgYSBqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvcgotICBzdHJpbmcuIE5vdGUgdGhh
dCAqdmlld3MgYXBwZW5kZWQgdG8gdGhlIERPTSBvdXRzaWRlIHRoZSByb290IGVsZW1lbnQgd2ls
bAotICBub3QgcmVjZWl2ZSBldmVudHMuKiBJZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVs
ZW1lbnQsIG1ha2Ugc3VyZSB5b3Ugb25seQotICBhcHBlbmQgdmlld3MgaW5zaWRlIGl0IQotCi0g
IFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFkdmFudGFnZXMgb2YgZXZlbnQgZGVsZWdhdGlvbiBh
bmQgdGhlIEVtYmVyIHZpZXcKLSAgbGF5ZXIsIGFuZCBhIGxpc3Qgb2YgdGhlIGV2ZW50IGxpc3Rl
bmVycyB0aGF0IGFyZSBzZXR1cCBieSBkZWZhdWx0LCB2aXNpdCB0aGUKLSAgW0VtYmVyIFZpZXcg
TGF5ZXIgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvdW5kZXJzdGFuZGluZy1lbWJl
ci90aGUtdmlldy1sYXllci8jdG9jX2V2ZW50LWRlbGVnYXRpb24pLgotCi0gICMjIyBJbml0aWFs
aXplcnMKLQotICBMaWJyYXJpZXMgb24gdG9wIG9mIEVtYmVyIGNhbiByZWdpc3RlciBhZGRpdGlv
bmFsIGluaXRpYWxpemVycywgbGlrZSBzbzoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkFw
cGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAic3RvcmUiLAotCi0gICAgaW5pdGlh
bGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRpb24uU3RvcmUpOwotICAgIH0KLSAgfSk7
Ci0gIGBgYAotCi0gICMjIyBSb3V0aW5nCi0KLSAgSW4gYWRkaXRpb24gdG8gY3JlYXRpbmcgeW91
ciBhcHBsaWNhdGlvbidzIHJvdXRlciwgYEVtYmVyLkFwcGxpY2F0aW9uYCBpcwotICBhbHNvIHJl
c3BvbnNpYmxlIGZvciB0ZWxsaW5nIHRoZSByb3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5nLiBU
cmFuc2l0aW9ucwotICBiZXR3ZWVuIHJvdXRlcyBjYW4gYmUgbG9nZ2VkIHdpdGggdGhlIGBMT0df
VFJBTlNJVElPTlNgIGZsYWcsIGFuZCBtb3JlCi0gIGRldGFpbGVkIGludHJhLXRyYW5zaXRpb24g
bG9nZ2luZyBjYW4gYmUgbG9nZ2VkIHdpdGgKLSAgdGhlIGBMT0dfVFJBTlNJVElPTlNfSU5URVJO
QUxgIGZsYWc6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGlj
YXRpb24uY3JlYXRlKHsKLSAgICBMT0dfVFJBTlNJVElPTlM6IHRydWUsIC8vIGJhc2ljIGxvZ2dp
bmcgb2Ygc3VjY2Vzc2Z1bCB0cmFuc2l0aW9ucwotICAgIExPR19UUkFOU0lUSU9OU19JTlRFUk5B
TDogdHJ1ZSAvLyBkZXRhaWxlZCBsb2dnaW5nIG9mIGFsbCByb3V0aW5nIHN0ZXBzCi0gIH0pOwot
ICBgYGAKLQotICBCeSBkZWZhdWx0LCB0aGUgcm91dGVyIHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRy
YW5zbGF0ZSB0aGUgY3VycmVudCBVUkwgaW50bwotICBhcHBsaWNhdGlvbiBzdGF0ZSBvbmNlIHRo
ZSBicm93c2VyIGVtaXRzIHRoZSBgRE9NQ29udGVudFJlYWR5YCBldmVudC4gSWYgeW91Ci0gIG5l
ZWQgdG8gZGVmZXIgcm91dGluZywgeW91IGNhbiBjYWxsIHRoZSBhcHBsaWNhdGlvbidzIGBkZWZl
clJlYWRpbmVzcygpYAotICBtZXRob2QuIE9uY2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhl
IGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhvZC4KLQotICBJZiB0aGVyZSBpcyBhbnkgc2V0dXAg
cmVxdWlyZWQgYmVmb3JlIHJvdXRpbmcgYmVnaW5zLCB5b3UgY2FuIGltcGxlbWVudCBhCi0gIGBy
ZWFkeSgpYCBtZXRob2Qgb24geW91ciBhcHAgdGhhdCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRl
bHkgYmVmb3JlIHJvdXRpbmcKLSAgYmVnaW5zLgotICBgYGAKLQotICBAY2xhc3MgQXBwbGljYXRp
b24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKLSovCi0K
LXZhciBBcHBsaWNhdGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4
dGVuZChFbWJlci5EZWZlcnJlZE1peGluLCB7Ci0KLSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVs
ZW1lbnQgb2YgdGhlIEFwcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4KLSAg
ICBlbGVtZW50IG9yIGEKLSAgICBbalF1ZXJ5LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nXSho
dHRwOi8vYXBpLmpxdWVyeS5jb20vY2F0ZWdvcnkvc2VsZWN0b3JzLykuCi0KLSAgICBUaGlzIGlz
IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIEFwcGxpY2F0aW9uJ3MsCi0g
ICAgYGV2ZW50RGlzcGF0Y2hlcmAsIHdoaWNoIHNldHMgdXAgdGhlIGxpc3RlbmVycyBmb3IgZXZl
bnQgZGVsZWdhdGlvbi4gRXZlcnkKLSAgICB2aWV3IGluIHlvdXIgYXBwbGljYXRpb24gc2hvdWxk
IGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgeW91IHNwZWNpZnkgaGVyZS4KLQotICAgIEBwcm9w
ZXJ0eSByb290RWxlbWVudAotICAgIEB0eXBlIERPTUVsZW1lbnQKLSAgICBAZGVmYXVsdCAnYm9k
eScKLSAgKi8KLSAgcm9vdEVsZW1lbnQ6ICdib2R5JywKLQotICAvKioKLSAgICBUaGUgYEVtYmVy
LkV2ZW50RGlzcGF0Y2hlcmAgcmVzcG9uc2libGUgZm9yIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRo
aXMKLSAgICBhcHBsaWNhdGlvbidzIHZpZXdzLgotCi0gICAgVGhlIGV2ZW50IGRpc3BhdGNoZXIg
aXMgY3JlYXRlZCBieSB0aGUgYXBwbGljYXRpb24gYXQgaW5pdGlhbGl6YXRpb24gdGltZQotICAg
IGFuZCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgRE9NIGVsZW1lbnQgZGVzY3JpYmVk
IGJ5IHRoZQotICAgIGFwcGxpY2F0aW9uJ3MgYHJvb3RFbGVtZW50YCBwcm9wZXJ0eS4KLQotICAg
IFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgZm9yIG1v
cmUgaW5mb3JtYXRpb24uCi0KLSAgICBAcHJvcGVydHkgZXZlbnREaXNwYXRjaGVyCi0gICAgQHR5
cGUgRW1iZXIuRXZlbnREaXNwYXRjaGVyCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBldmVu
dERpc3BhdGNoZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIERPTSBldmVudHMgZm9yIHdoaWNo
IHRoZSBldmVudCBkaXNwYXRjaGVyIHNob3VsZCBsaXN0ZW4uCi0KLSAgICBCeSBkZWZhdWx0LCB0
aGUgYXBwbGljYXRpb24ncyBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBsaXN0ZW5zCi0gICAgZm9y
IGEgc2V0IG9mIHN0YW5kYXJkIERPTSBldmVudHMsIHN1Y2ggYXMgYG1vdXNlZG93bmAgYW5kCi0g
ICAgYGtleXVwYCwgYW5kIGRlbGVnYXRlcyB0aGVtIHRvIHlvdXIgYXBwbGljYXRpb24ncyBgRW1i
ZXIuVmlld2AKLSAgICBpbnN0YW5jZXMuCi0KLSAgICBJZiB5b3Ugd291bGQgbGlrZSBhZGRpdGlv
bmFsIGJ1YmJsaW5nIGV2ZW50cyB0byBiZSBkZWxlZ2F0ZWQgdG8geW91cgotICAgIHZpZXdzLCBz
ZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gJ3MgYGN1c3RvbUV2ZW50c2AgcHJvcGVydHkKLSAg
ICB0byBhIGhhc2ggY29udGFpbmluZyB0aGUgRE9NIGV2ZW50IG5hbWUgYXMgdGhlIGtleSBhbmQg
dGhlCi0gICAgY29ycmVzcG9uZGluZyB2aWV3IG1ldGhvZCBuYW1lIGFzIHRoZSB2YWx1ZS4gRm9y
IGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwID0gRW1iZXIuQXBwbGljYXRp
b24uY3JlYXRlKHsKLSAgICAgIGN1c3RvbUV2ZW50czogewotICAgICAgICAvLyBhZGQgc3VwcG9y
dCBmb3IgdGhlIHBhc3RlIGV2ZW50Ci0gICAgICAgIHBhc3RlOiAicGFzdGUiCi0gICAgICB9Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgY3VzdG9tRXZlbnRzCi0gICAgQHR5cGUg
T2JqZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjdXN0b21FdmVudHM6IG51bGwsCi0K
LSAgLy8gU3RhcnQgb2ZmIHRoZSBudW1iZXIgb2YgZGVmZXJyYWxzIGF0IDEuIFRoaXMgd2lsbCBi
ZQotICAvLyBkZWNyZW1lbnRlZCBieSB0aGUgQXBwbGljYXRpb24ncyBvd24gYGluaXRpYWxpemVg
IG1ldGhvZC4KLSAgX3JlYWRpbmVzc0RlZmVycmFsczogMSwKLQotICBpbml0OiBmdW5jdGlvbigp
IHsKLSAgICBpZiAoIXRoaXMuJCkgeyB0aGlzLiQgPSBFbWJlci4kOyB9Ci0gICAgdGhpcy5fX2Nv
bnRhaW5lcl9fID0gdGhpcy5idWlsZENvbnRhaW5lcigpOwotCi0gICAgdGhpcy5Sb3V0ZXIgPSB0
aGlzLmRlZmF1bHRSb3V0ZXIoKTsKLQotICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlzLnNj
aGVkdWxlSW5pdGlhbGl6ZSgpOwotCi0gICAgRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxp
YnJhcnkoJ0hhbmRsZWJhcnMnLCBFbWJlci5IYW5kbGViYXJzLlZFUlNJT04pOwotICAgIEVtYmVy
LmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdqUXVlcnknLCBFbWJlci4kKCkuanF1ZXJ5
KTsKLQotICAgIGlmICggRW1iZXIuTE9HX1ZFUlNJT04gKSB7Ci0gICAgICBFbWJlci5MT0dfVkVS
U0lPTiA9IGZhbHNlOyAvLyB3ZSBvbmx5IG5lZWQgdG8gc2VlIHRoaXMgb25jZSBwZXIgQXBwbGlj
YXRpb24jaW5pdAotICAgICAgdmFyIG1heE5hbWVMZW5ndGggPSBNYXRoLm1heC5hcHBseSh0aGlz
LCBFbWJlci5BKEVtYmVyLmxpYnJhcmllcykubWFwQnkoIm5hbWUubGVuZ3RoIikpOwotCi0gICAg
ICBFbWJlci5kZWJ1ZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOwotICAgICAg
RW1iZXIubGlicmFyaWVzLmVhY2goZnVuY3Rpb24obmFtZSwgdmVyc2lvbikgewotICAgICAgICB2
YXIgc3BhY2VzID0gbmV3IEFycmF5KG1heE5hbWVMZW5ndGggLSBuYW1lLmxlbmd0aCArIDEpLmpv
aW4oIiAiKTsKLSAgICAgICAgRW1iZXIuZGVidWcoW25hbWUsIHNwYWNlcywgJyA6ICcsIHZlcnNp
b25dLmpvaW4oIiIpKTsKLSAgICAgIH0pOwotICAgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQnVpbGQg
dGhlIGNvbnRhaW5lciBmb3IgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24uCi0KLSAgICBBbHNvIHJl
Z2lzdGVyIGEgZGVmYXVsdCBhcHBsaWNhdGlvbiB2aWV3IGluIGNhc2UgdGhlIGFwcGxpY2F0aW9u
Ci0gICAgaXRzZWxmIGRvZXMgbm90LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGJ1aWxk
Q29udGFpbmVyCi0gICAgQHJldHVybiB7RW1iZXIuQ29udGFpbmVyfSB0aGUgY29uZmlndXJlZCBj
b250YWluZXIKLSAgKi8KLSAgYnVpbGRDb250YWluZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciBj
b250YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX18gPSBBcHBsaWNhdGlvbi5idWlsZENvbnRhaW5l
cih0aGlzKTsKLQotICAgIHJldHVybiBjb250YWluZXI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYg
dGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3B0ZWQgb3V0IG9mIHJvdXRpbmcgYW5kIGhhcyBub3Qg
ZXhwbGljaXRseQotICAgIGRlZmluZWQgYSByb3V0ZXIsIHN1cHBseSBhIGRlZmF1bHQgcm91dGVy
IGZvciB0aGUgYXBwbGljYXRpb24gYXV0aG9yCi0gICAgdG8gY29uZmlndXJlLgotCi0gICAgVGhp
cyBhbGxvd3MgYXBwbGljYXRpb24gZGV2ZWxvcGVycyB0byBkbzoKLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0KLSAgICBBcHAu
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJyk7Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZGVmYXVsdFJvdXRl
cgotICAgIEByZXR1cm4ge0VtYmVyLlJvdXRlcn0gdGhlIGRlZmF1bHQgcm91dGVyCi0gICovCi0K
LSAgZGVmYXVsdFJvdXRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuUm91dGVyID09PSBm
YWxzZSkgeyByZXR1cm47IH0KLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9f
OwotCi0gICAgaWYgKHRoaXMuUm91dGVyKSB7Ci0gICAgICBjb250YWluZXIudW5yZWdpc3Rlcign
cm91dGVyOm1haW4nKTsKLSAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCB0
aGlzLlJvdXRlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXBGYWN0b3J5
KCdyb3V0ZXI6bWFpbicpOwotICB9LAotCi0gIC8qKgotICAgIEF1dG9tYXRpY2FsbHkgaW5pdGlh
bGl6ZSB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUgRE9NIGhhcwotICAgIGJlY29tZSByZWFkeS4K
LQotICAgIFRoZSBpbml0aWFsaXphdGlvbiBpdHNlbGYgaXMgc2NoZWR1bGVkIG9uIHRoZSBhY3Rp
b25zIHF1ZXVlCi0gICAgd2hpY2ggZW5zdXJlcyB0aGF0IGFwcGxpY2F0aW9uIGxvYWRpbmcgZmlu
aXNoZXMgYmVmb3JlCi0gICAgYm9vdGluZy4KLQotICAgIElmIHlvdSBhcmUgYXN5bmNocm9ub3Vz
bHkgbG9hZGluZyBjb2RlLCB5b3Ugc2hvdWxkIGNhbGwKLSAgICBgZGVmZXJSZWFkaW5lc3MoKWAg
dG8gZGVmZXIgYm9vdGluZywgYW5kIHRoZW4gY2FsbAotICAgIGBhZHZhbmNlUmVhZGluZXNzKClg
IG9uY2UgYWxsIG9mIHlvdXIgY29kZSBoYXMgZmluaXNoZWQKLSAgICBsb2FkaW5nLgotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIHNjaGVkdWxlSW5pdGlhbGl6ZQotICAqLwotICBzY2hlZHVs
ZUluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWxmID0gdGhpczsKLQotICAgIGlm
ICghdGhpcy4kIHx8IHRoaXMuJC5pc1JlYWR5KSB7Ci0gICAgICBFbWJlci5ydW4uc2NoZWR1bGUo
J2FjdGlvbnMnLCBzZWxmLCAnX2luaXRpYWxpemUnKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhp
cy4kKCkucmVhZHkoZnVuY3Rpb24gcnVuSW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgRW1iZXIucnVu
KHNlbGYsICdfaW5pdGlhbGl6ZScpOwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIFVzZSB0aGlzIHRvIGRlZmVyIHJlYWRpbmVzcyB1bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0
cnVlLgotCi0gICAgRXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAgPSBFbWJl
ci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAgICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsKLQotICAg
IGpRdWVyeS5nZXRKU09OKCIvYXV0aC10b2tlbiIsIGZ1bmN0aW9uKHRva2VuKSB7Ci0gICAgICBB
cHAudG9rZW4gPSB0b2tlbjsKLSAgICAgIEFwcC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAgfSk7
Ci0gICAgYGBgCi0KLSAgICBUaGlzIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMg
c2V0dXAgbG9naWMgYW5kIGRlZmVyCi0gICAgYm9vdGluZyB5b3VyIGFwcGxpY2F0aW9uIHVudGls
IHRoZSBzZXR1cCBoYXMgZmluaXNoZWQuCi0KLSAgICBIb3dldmVyLCBpZiB0aGUgc2V0dXAgcmVx
dWlyZXMgYSBsb2FkaW5nIFVJLCBpdCBtaWdodCBiZSBiZXR0ZXIKLSAgICB0byB1c2UgdGhlIHJv
dXRlciBmb3IgdGhpcyBwdXJwb3NlLgotCi0gICAgQG1ldGhvZCBkZWZlclJlYWRpbmVzcwotICAq
LwotICBkZWZlclJlYWRpbmVzczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ug
bXVzdCBjYWxsIGRlZmVyUmVhZGluZXNzIG9uIGFuIGluc3RhbmNlIG9mIEVtYmVyLkFwcGxpY2F0
aW9uIiwgdGhpcyBpbnN0YW5jZW9mIEVtYmVyLkFwcGxpY2F0aW9uKTsKLSAgICBFbWJlci5hc3Nl
cnQoIllvdSBjYW5ub3QgZGVmZXIgcmVhZGluZXNzIHNpbmNlIHRoZSBgcmVhZHkoKWAgaG9vayBo
YXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4iLCB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKTsK
LSAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMrKzsKLSAgfSwKLQotICAvKioKLSAgICBDYWxs
IGBhZHZhbmNlUmVhZGluZXNzYCBhZnRlciBhbnkgYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGhh
cyBjb21wbGV0ZWQuCi0gICAgRWFjaCBjYWxsIHRvIGBkZWZlclJlYWRpbmVzc2AgbXVzdCBiZSBt
YXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5jZVJlYWRpbmVzc2AKLSAgICBvciB0aGUgYXBwbGlj
YXRpb24gd2lsbCBuZXZlciBiZWNvbWUgcmVhZHkgYW5kIHJvdXRpbmcgd2lsbCBub3QgYmVnaW4u
Ci0KLSAgICBAbWV0aG9kIGFkdmFuY2VSZWFkaW5lc3MKLSAgICBAc2VlIHtFbWJlci5BcHBsaWNh
dGlvbiNkZWZlclJlYWRpbmVzc30KLSAgKi8KLSAgYWR2YW5jZVJlYWRpbmVzczogZnVuY3Rpb24o
KSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBjYWxsIGFkdmFuY2VSZWFkaW5lc3Mgb24g
YW4gaW5zdGFuY2Ugb2YgRW1iZXIuQXBwbGljYXRpb24iLCB0aGlzIGluc3RhbmNlb2YgRW1iZXIu
QXBwbGljYXRpb24pOwotICAgIHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscy0tOwotCi0gICAgaWYg
KHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9PT0gMCkgewotICAgICAgRW1iZXIucnVuLm9uY2Uo
dGhpcywgdGhpcy5kaWRCZWNvbWVSZWFkeSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIHJl
Z2lzdGVycyBhIGZhY3RvcnkgZm9yIGxhdGVyIGluamVjdGlvbgotCi0gICAgRXhhbXBsZToKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsK
LQotICAgIEFwcC5QZXJzb24gID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7fSk7Ci0gICAgQXBwLk9y
YW5nZSAgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHt9KTsKLSAgICBBcHAuRW1haWwgICA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoe30pOwotICAgIEFwcC5zZXNzaW9uID0gRW1iZXIuT2JqZWN0LmNyZWF0
ZSh7fSk7Ci0KLSAgICBBcHAucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBBcHAuUGVyc29uLCB7c2lu
Z2xldG9uOiBmYWxzZSB9KTsKLSAgICBBcHAucmVnaXN0ZXIoJ2ZydWl0OmZhdm9yaXRlJywgQXBw
Lk9yYW5nZSk7Ci0gICAgQXBwLnJlZ2lzdGVyKCdjb21tdW5pY2F0aW9uOm1haW4nLCBBcHAuRW1h
aWwsIHtzaW5nbGV0b246IGZhbHNlfSk7Ci0gICAgQXBwLnJlZ2lzdGVyKCdzZXNzaW9uJywgQXBw
LnNlc3Npb24sIHtpbnN0YW50aWF0ZTogZmFsc2V9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
cmVnaXN0ZXIKLSAgICBAcGFyYW0gIGZ1bGxOYW1lIHtTdHJpbmd9IHR5cGU6bmFtZSAoZS5nLiwg
J21vZGVsOnVzZXInKQotICAgIEBwYXJhbSAgZmFjdG9yeSB7RnVuY3Rpb259IChlLmcuLCBBcHAu
UGVyc29uKQotICAgIEBwYXJhbSAgb3B0aW9ucyB7U3RyaW5nfSAob3B0aW9uYWwpCi0gICoqLwot
ICByZWdpc3RlcjogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX19jb250
YWluZXJfXzsKLSAgICBjb250YWluZXIucmVnaXN0ZXIuYXBwbHkoY29udGFpbmVyLCBhcmd1bWVu
dHMpOwotICB9LAotICAvKioKLSAgICBkZWZpbmVzIGFuIGluamVjdGlvbiBvciB0eXBlSW5qZWN0
aW9uCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5pbmplY3Qo
PGZ1bGxfbmFtZSBvciB0eXBlPiwgPHByb3BlcnR5IG5hbWU+LCA8ZnVsbF9uYW1lPikKLSAgICBB
cHAuaW5qZWN0KCdtb2RlbDp1c2VyJywgJ2VtYWlsJywgJ21vZGVsOmVtYWlsJykKLSAgICBBcHAu
aW5qZWN0KCdtb2RlbCcsICdzb3VyY2UnLCAnc291cmNlOm1haW4nKQotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBpbmplY3QKLSAgICBAcGFyYW0gIGZhY3RvcnlOYW1lT3JUeXBlIHtTdHJpbmd9Ci0g
ICAgQHBhcmFtICBwcm9wZXJ0eSB7U3RyaW5nfQotICAgIEBwYXJhbSAgaW5qZWN0aW9uTmFtZSB7
U3RyaW5nfQotICAqKi8KLSAgaW5qZWN0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVy
ID0gdGhpcy5fX2NvbnRhaW5lcl9fOwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24uYXBwbHkoY29u
dGFpbmVyLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxpbmcgaW5pdGlhbGl6
ZSBtYW51YWxseSBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgUGxlYXNlIHNlZSBFbWJlci5BcHBs
aWNhdGlvbiNhZHZhbmNlUmVhZGluZXNzIGFuZAotICAgIEVtYmVyLkFwcGxpY2F0aW9uI2RlZmVy
UmVhZGluZXNzLgotCi0gICAgQHByaXZhdGUKLSAgICBAZGVwcmVjYXRlZAotICAgIEBtZXRob2Qg
aW5pdGlhbGl6ZQotICAgKiovCi0gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVy
LmRlcHJlY2F0ZSgnQ2FsbGluZyBpbml0aWFsaXplIG1hbnVhbGx5IGlzIG5vdCBzdXBwb3J0ZWQu
IFBsZWFzZSBzZWUgRW1iZXIuQXBwbGljYXRpb24jYWR2YW5jZVJlYWRpbmVzcyBhbmQgRW1iZXIu
QXBwbGljYXRpb24jZGVmZXJSZWFkaW5lc3MnKTsKLSAgfSwKLSAgLyoqCi0gICAgSW5pdGlhbGl6
ZSB0aGUgYXBwbGljYXRpb24uIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgotCi0gICAgUnVu
IGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRpb24gbG9hZCBob29rLiBUaGVz
ZSBob29rcyBtYXkKLSAgICBjaG9vc2UgdG8gZGVmZXIgcmVhZGluZXNzLiBGb3IgZXhhbXBsZSwg
YW4gYXV0aGVudGljYXRpb24gaG9vayBtaWdodCB3YW50Ci0gICAgdG8gZGVmZXIgcmVhZGluZXNz
IHVudGlsIHRoZSBhdXRoIHRva2VuIGhhcyBiZWVuIHJldHJpZXZlZC4KLQotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBfaW5pdGlhbGl6ZQotICAqLwotICBfaW5pdGlhbGl6ZTogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBBdCB0
aGlzIHBvaW50LCB0aGUgQXBwLlJvdXRlciBtdXN0IGFscmVhZHkgYmUgYXNzaWduZWQKLSAgICBp
ZiAodGhpcy5Sb3V0ZXIpIHsKLSAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVy
X187Ci0gICAgICBjb250YWluZXIudW5yZWdpc3Rlcigncm91dGVyOm1haW4nKTsKLSAgICAgIGNv
bnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCB0aGlzLlJvdXRlcik7Ci0gICAgfQotCi0g
ICAgdGhpcy5ydW5Jbml0aWFsaXplcnMoKTsKLSAgICBFbWJlci5ydW5Mb2FkSG9va3MoJ2FwcGxp
Y2F0aW9uJywgdGhpcyk7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50LCBhbnkgaW5pdGlhbGl6ZXJz
IG9yIGxvYWQgaG9va3MgdGhhdCB3b3VsZCBoYXZlIHdhbnRlZAotICAgIC8vIHRvIGRlZmVyIHJl
YWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBnZW5lcmFsLCBhZHZhbmNpbmcgcmVhZGluZXNzIGhlcmUK
LSAgICAvLyB3aWxsIHByb2NlZWQgdG8gZGlkQmVjb21lUmVhZHkuCi0gICAgdGhpcy5hZHZhbmNl
UmVhZGluZXNzKCk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXNl
dCB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgb25seSBpbiB0ZXN0cy4g
SXQgY2xlYW5zIHVwCi0gICAgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6
Ci0KLSAgICAxLiBEZWFjdGl2YXRlIGV4aXN0aW5nIHJvdXRlcwotICAgIDIuIERlc3Ryb3kgYWxs
IG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lcgotICAgIDMuIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlv
biBjb250YWluZXIKLSAgICA0LiBSZS1yb3V0ZSB0byB0aGUgZXhpc3RpbmcgdXJsCi0KLSAgICBU
eXBpY2FsIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBwOwotCi0g
ICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24u
Y3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAgICBtb2R1bGUoImFjY2VwdGFuY2UgdGVzdCIsIHsKLSAg
ICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgQXBwLnJlc2V0KCk7Ci0gICAgICB9Ci0g
ICAgfSk7Ci0KLSAgICB0ZXN0KCJmaXJzdCB0ZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBB
cHAgaXMgZnJlc2hseSByZXNldAotICAgIH0pOwotCi0gICAgdGVzdCgiZmlyc3QgdGVzdCIsIGZ1
bmN0aW9uKCkgewotICAgICAgLy8gQXBwIGlzIGFnYWluIGZyZXNobHkgcmVzZXQKLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIEFkdmFuY2VkIEV4YW1wbGU6Ci0KLSAgICBPY2Nhc2lvbmFsbHkgeW91
IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tIGluaXRpYWxpemluZyBkdXJpbmcKLSAg
ICBzZXR1cC4gVGhpcyBjb3VsZCBlbmFibGUgZXh0cmEgY29uZmlndXJhdGlvbiwgb3IgZW5hYmxl
IGFzc2VydGluZyBwcmlvcgotICAgIHRvIHRoZSBhcHAgYmVjb21pbmcgcmVhZHkuCi0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBwOwotCi0gICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkg
ewotICAgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAg
ICBtb2R1bGUoImFjY2VwdGFuY2UgdGVzdCIsIHsKLSAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgICAgIEFwcC5yZXNldCgpOwot
ICAgICAgICAgIEFwcC5kZWZlclJlYWRpbmVzcygpOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAg
ICB9KTsKLQotICAgIHRlc3QoImZpcnN0IHRlc3QiLCBmdW5jdGlvbigpIHsKLSAgICAgIG9rKHRy
dWUsICdzb21ldGhpbmcgYmVmb3JlIGFwcCBpcyBpbml0aWFsaXplZCcpOwotCi0gICAgICBFbWJl
ci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgICAgIEFwcC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAg
ICB9KTsKLSAgICAgIG9rKHRydWUsICdzb21ldGhpbmcgYWZ0ZXIgYXBwIGlzIGluaXRpYWxpemVk
Jyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlc2V0Ci0gICoqLwotICByZXNl
dDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzID0gMTsKLQotICAg
IGZ1bmN0aW9uIGhhbmRsZVJlc2V0KCkgewotICAgICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250
YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJyk7Ci0gICAgICByb3V0ZXIucmVzZXQoKTsKLQot
ICAgICAgRW1iZXIucnVuKHRoaXMuX19jb250YWluZXJfXywgJ2Rlc3Ryb3knKTsKLQotICAgICAg
dGhpcy5idWlsZENvbnRhaW5lcigpOwotCi0gICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlv
bnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpOwotICAg
ICAgfSk7Ci0gICAgfQotCi0gICAgRW1iZXIucnVuLmpvaW4odGhpcywgaGFuZGxlUmVzZXQpOwot
ICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBydW5Jbml0aWFsaXplcnMK
LSAgKi8KLSAgcnVuSW5pdGlhbGl6ZXJzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgaW5pdGlhbGl6
ZXJzID0gZ2V0KHRoaXMuY29uc3RydWN0b3IsICdpbml0aWFsaXplcnMnKSwKLSAgICAgICAgY29u
dGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fLAotICAgICAgICBncmFwaCA9IG5ldyBFbWJlci5E
QUcoKSwKLSAgICAgICAgbmFtZXNwYWNlID0gdGhpcywKLSAgICAgICAgbmFtZSwgaW5pdGlhbGl6
ZXI7Ci0KLSAgICBmb3IgKG5hbWUgaW4gaW5pdGlhbGl6ZXJzKSB7Ci0gICAgICBpbml0aWFsaXpl
ciA9IGluaXRpYWxpemVyc1tuYW1lXTsKLSAgICAgIGdyYXBoLmFkZEVkZ2VzKGluaXRpYWxpemVy
Lm5hbWUsIGluaXRpYWxpemVyLmluaXRpYWxpemUsIGluaXRpYWxpemVyLmJlZm9yZSwgaW5pdGlh
bGl6ZXIuYWZ0ZXIpOwotICAgIH0KLQotICAgIGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRl
eCkgewotICAgICAgdmFyIGluaXRpYWxpemVyID0gdmVydGV4LnZhbHVlOwotICAgICAgRW1iZXIu
YXNzZXJ0KCJObyBhcHBsaWNhdGlvbiBpbml0aWFsaXplciBuYW1lZCAnIit2ZXJ0ZXgubmFtZSsi
JyIsIGluaXRpYWxpemVyKTsKLSAgICAgIGluaXRpYWxpemVyKGNvbnRhaW5lciwgbmFtZXNwYWNl
KTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZGlk
QmVjb21lUmVhZHkKLSAgKi8KLSAgZGlkQmVjb21lUmVhZHk6IGZ1bmN0aW9uKCkgewotICAgIHRo
aXMuc2V0dXBFdmVudERpc3BhdGNoZXIoKTsKLSAgICB0aGlzLnJlYWR5KCk7IC8vIHVzZXIgaG9v
awotICAgIHRoaXMuc3RhcnRSb3V0aW5nKCk7Ci0KLSAgICBpZiAoIUVtYmVyLnRlc3RpbmcpIHsK
LSAgICAgIC8vIEVhZ2VybHkgbmFtZSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBhbHJlYWR5IGxvYWRl
ZAotICAgICAgRW1iZXIuTmFtZXNwYWNlLnByb2Nlc3NBbGwoKTsKLSAgICAgIEVtYmVyLkJPT1RF
RCA9IHRydWU7Ci0gICAgfQotCi0gICAgdGhpcy5yZXNvbHZlKHRoaXMpOwotICB9LAotCi0gIC8q
KgotICAgIFNldHVwIHVwIHRoZSBldmVudCBkaXNwYXRjaGVyIHRvIHJlY2VpdmUgZXZlbnRzIG9u
IHRoZQotICAgIGFwcGxpY2F0aW9uJ3MgYHJvb3RFbGVtZW50YCB3aXRoIGFueSByZWdpc3RlcmVk
Ci0gICAgYGN1c3RvbUV2ZW50c2AuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0dXBF
dmVudERpc3BhdGNoZXIKLSAgKi8KLSAgc2V0dXBFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkg
ewotICAgIHZhciBjdXN0b21FdmVudHMgPSBnZXQodGhpcywgJ2N1c3RvbUV2ZW50cycpLAotICAg
ICAgICByb290RWxlbWVudCA9IGdldCh0aGlzLCAncm9vdEVsZW1lbnQnKSwKLSAgICAgICAgZGlz
cGF0Y2hlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFp
bicpOwotCi0gICAgc2V0KHRoaXMsICdldmVudERpc3BhdGNoZXInLCBkaXNwYXRjaGVyKTsKLSAg
ICBkaXNwYXRjaGVyLnNldHVwKGN1c3RvbUV2ZW50cywgcm9vdEVsZW1lbnQpOwotICB9LAotCi0g
IC8qKgotICAgIHRyaWdnZXIgYSBuZXcgY2FsbCB0byBgcm91dGVgIHdoZW5ldmVyIHRoZSBVUkwg
Y2hhbmdlcy4KLSAgICBJZiB0aGUgYXBwbGljYXRpb24gaGFzIGEgcm91dGVyLCB1c2UgaXQgdG8g
cm91dGUgdG8gdGhlIGN1cnJlbnQgVVJMLCBhbmQKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhv
ZCBzdGFydFJvdXRpbmcKLSAgICBAcHJvcGVydHkgcm91dGVyIHtFbWJlci5Sb3V0ZXJ9Ci0gICov
Ci0gIHN0YXJ0Um91dGluZzogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMuX19j
b250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJyk7Ci0gICAgaWYgKCFyb3V0ZXIpIHsgcmV0
dXJuOyB9Ci0KLSAgICByb3V0ZXIuc3RhcnRSb3V0aW5nKCk7Ci0gIH0sCi0KLSAgaGFuZGxlVVJM
OiBmdW5jdGlvbih1cmwpIHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5fX2NvbnRhaW5lcl9fLmxv
b2t1cCgncm91dGVyOm1haW4nKTsKLQotICAgIHJvdXRlci5oYW5kbGVVUkwodXJsKTsKLSAgfSwK
LQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0aGUgQXBwbGljYXRpb24gaGFzIGJlY29tZSByZWFk
eS4KLSAgICBUaGUgY2FsbCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIERPTSBoYXMgYmVjb21l
IHJlYWR5LgotCi0gICAgQGV2ZW50IHJlYWR5Ci0gICovCi0gIHJlYWR5OiBFbWJlci5LLAotCi0g
IC8qKgotICAgIEBkZXByZWNhdGVkIFVzZSAnUmVzb2x2ZXInIGluc3RlYWQKLSAgICBTZXQgdGhp
cyB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBjbGFzcyB0byBgRW1iZXIuRGVmYXVsdFJlc29sdmVy
YAotCi0KLSAgICBAcHJvcGVydHkgcmVzb2x2ZXIKLSAgKi8KLSAgcmVzb2x2ZXI6IG51bGwsCi0K
LSAgLyoqCi0gICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGUgY2xhc3MgdG8gYEVt
YmVyLkRlZmF1bHRSZXNvbHZlcmAKLQotICAgIEBwcm9wZXJ0eSByZXNvbHZlcgotICAqLwotICBS
ZXNvbHZlcjogbnVsbCwKLQotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIu
Qk9PVEVEID0gZmFsc2U7Ci0KLSAgICB0aGlzLl9fY29udGFpbmVyX18uZGVzdHJveSgpOwotICB9
LAotCi0gIGluaXRpYWxpemVyOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdGhpcy5jb25zdHJ1
Y3Rvci5pbml0aWFsaXplcihvcHRpb25zKTsKLSAgfQotfSk7Ci0KLUVtYmVyLkFwcGxpY2F0aW9u
LnJlb3BlbkNsYXNzKHsKLSAgaW5pdGlhbGl6ZXJzOiB7fSwKLSAgaW5pdGlhbGl6ZXI6IGZ1bmN0
aW9uKGluaXRpYWxpemVyKSB7Ci0gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5pdGlhbGl6
ZXIgYmVpbmcgYWRkZWQgdG8gYSBzdWJjbGFzcywgd2UgYXJlIGdvaW5nIHRvIHJlb3BlbiB0aGUg
Y2xhc3MKLSAgICAvLyB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIG5ldyBgaW5pdGlhbGl6ZXJzYCBv
YmplY3QsIHdoaWNoIGV4dGVuZHMgZnJvbSB0aGUgcGFyZW50IGNsYXNzJyB1c2luZwotICAgIC8v
IHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuIFdpdGhvdXQgdGhpcywgYXR0ZW1wdGluZyB0byBhZGQg
aW5pdGlhbGl6ZXJzIHRvIHRoZSBzdWJjbGFzcyB3b3VsZAotICAgIC8vIHBvbGx1dGUgdGhlIHBh
cmVudCBjbGFzcyBhcyB3ZWxsIGFzIG90aGVyIHN1YmNsYXNzZXMuCi0gICAgaWYgKHRoaXMuc3Vw
ZXJjbGFzcy5pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN1cGVyY2xhc3MuaW5p
dGlhbGl6ZXJzID09PSB0aGlzLmluaXRpYWxpemVycykgewotICAgICAgdGhpcy5yZW9wZW5DbGFz
cyh7Ci0gICAgICAgIGluaXRpYWxpemVyczogRW1iZXIuY3JlYXRlKHRoaXMuaW5pdGlhbGl6ZXJz
KQotICAgICAgfSk7Ci0gICAgfQotCi0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgaW5pdGlhbGl6ZXIg
JyIgKyBpbml0aWFsaXplci5uYW1lICsgIicgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIiwg
IXRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxpemVyLm5hbWVdKTsKLSAgICBFbWJlci5hc3NlcnQo
IkFuIGluaXRpYWxpemVyIGNhbm5vdCBiZSByZWdpc3RlcmVkIHdpdGggYm90aCBhIGJlZm9yZSBh
bmQgYW4gYWZ0ZXIiLCAhKGluaXRpYWxpemVyLmJlZm9yZSAmJiBpbml0aWFsaXplci5hZnRlcikp
OwotICAgIEVtYmVyLmFzc2VydCgiQW4gaW5pdGlhbGl6ZXIgY2Fubm90IGJlIHJlZ2lzdGVyZWQg
d2l0aG91dCBhbiBpbml0aWFsaXplIGZ1bmN0aW9uIiwgRW1iZXIuY2FuSW52b2tlKGluaXRpYWxp
emVyLCAnaW5pdGlhbGl6ZScpKTsKLQotICAgIHRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxpemVy
Lm5hbWVdID0gaW5pdGlhbGl6ZXI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBjcmVhdGVzIGEg
Y29udGFpbmVyIHdpdGggdGhlIGRlZmF1bHQgRW1iZXIgbmFtaW5nIGNvbnZlbnRpb25zLgotCi0g
ICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSBjb250YWluZXI6Ci0KLSAgICAqIHJlZ2lzdGVyZWQg
dmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGV5IGFyZSBsb29rZWQgdXAgKHRoZXkgYXJl
Ci0gICAgICBub3Qgc2luZ2xldG9ucykKLSAgICAqIHJlZ2lzdGVyZWQgdGVtcGxhdGVzIGFyZSBu
b3QgZmFjdG9yaWVzOyB0aGUgcmVnaXN0ZXJlZCB2YWx1ZSBpcwotICAgICAgcmV0dXJuZWQgZGly
ZWN0bHkuCi0gICAgKiB0aGUgcm91dGVyIHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBpdHMg
YG5hbWVzcGFjZWAgcHJvcGVydHkKLSAgICAqIGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSBy
b3V0ZXIgYXMgdGhlaXIgYHRhcmdldGAgYW5kIGBjb250cm9sbGVyc2AKLSAgICAgIHByb3BlcnRp
ZXMKLSAgICAqIGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVp
ciBgbmFtZXNwYWNlYCBwcm9wZXJ0eQotICAgICogdGhlIGFwcGxpY2F0aW9uIHZpZXcgcmVjZWl2
ZXMgdGhlIGFwcGxpY2F0aW9uIGNvbnRyb2xsZXIgYXMgaXRzCi0gICAgICBgY29udHJvbGxlcmAg
cHJvcGVydHkKLSAgICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNh
dGlvbiB0ZW1wbGF0ZSBhcyBpdHMKLSAgICAgIGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5Ci0K
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgYnVpbGRDb250YWluZXIKLSAgICBAc3RhdGljCi0g
ICAgQHBhcmFtIHtFbWJlci5BcHBsaWNhdGlvbn0gbmFtZXNwYWNlIHRoZSBhcHBsaWNhdGlvbiB0
byBidWlsZCB0aGUKLSAgICAgIGNvbnRhaW5lciBmb3IuCi0gICAgQHJldHVybiB7RW1iZXIuQ29u
dGFpbmVyfSB0aGUgYnVpbHQgY29udGFpbmVyCi0gICovCi0gIGJ1aWxkQ29udGFpbmVyOiBmdW5j
dGlvbihuYW1lc3BhY2UpIHsKLSAgICB2YXIgY29udGFpbmVyID0gbmV3IEVtYmVyLkNvbnRhaW5l
cigpOwotCi0gICAgRW1iZXIuQ29udGFpbmVyLmRlZmF1bHRDb250YWluZXIgPSBuZXcgRGVwcmVj
YXRlZENvbnRhaW5lcihjb250YWluZXIpOwotCi0gICAgY29udGFpbmVyLnNldCA9IEVtYmVyLnNl
dDsKLSAgICBjb250YWluZXIucmVzb2x2ZXIgID0gcmVzb2x2ZXJGb3IobmFtZXNwYWNlKTsKLSAg
ICBjb250YWluZXIubm9ybWFsaXplID0gY29udGFpbmVyLnJlc29sdmVyLm5vcm1hbGl6ZTsKLSAg
ICBjb250YWluZXIuZGVzY3JpYmUgID0gY29udGFpbmVyLnJlc29sdmVyLmRlc2NyaWJlOwotICAg
IGNvbnRhaW5lci5tYWtlVG9TdHJpbmcgPSBjb250YWluZXIucmVzb2x2ZXIubWFrZVRvU3RyaW5n
OwotCi0gICAgY29udGFpbmVyLm9wdGlvbnNGb3JUeXBlKCdjb21wb25lbnQnLCB7IHNpbmdsZXRv
bjogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVyLm9wdGlvbnNGb3JUeXBlKCd2aWV3JywgeyBzaW5n
bGV0b246IGZhbHNlIH0pOwotICAgIGNvbnRhaW5lci5vcHRpb25zRm9yVHlwZSgndGVtcGxhdGUn
LCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKLSAgICBjb250YWluZXIub3B0aW9uc0ZvclR5cGUo
J2hlbHBlcicsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOwotCi0gICAgY29udGFpbmVyLnJlZ2lz
dGVyKCdhcHBsaWNhdGlvbjptYWluJywgbmFtZXNwYWNlLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9
KTsKLQotICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjpiYXNpYycsIEVtYmVyLkNv
bnRyb2xsZXIsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3Rl
cignY29udHJvbGxlcjpvYmplY3QnLCBFbWJlci5PYmplY3RDb250cm9sbGVyLCB7IGluc3RhbnRp
YXRlOiBmYWxzZSB9KTsKLSAgICBjb250YWluZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6YXJyYXkn
LCBFbWJlci5BcnJheUNvbnRyb2xsZXIsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOwotICAgIGNv
bnRhaW5lci5yZWdpc3Rlcigncm91dGU6YmFzaWMnLCBFbWJlci5Sb3V0ZSwgeyBpbnN0YW50aWF0
ZTogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1h
aW4nLCBFbWJlci5FdmVudERpc3BhdGNoZXIpOwotCi0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdy
b3V0ZXI6bWFpbicsICBFbWJlci5Sb3V0ZXIpOwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ3Jv
dXRlcjptYWluJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlvbjptYWluJyk7Ci0KLSAgICBjb250
YWluZXIuaW5qZWN0aW9uKCdjb250cm9sbGVyJywgJ3RhcmdldCcsICdyb3V0ZXI6bWFpbicpOwot
ICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxp
Y2F0aW9uOm1haW4nKTsKLQotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ3JvdXRlJywgJ3JvdXRl
cicsICdyb3V0ZXI6bWFpbicpOwotCi0gICAgcmV0dXJuIGNvbnRhaW5lcjsKLSAgfQotfSk7Ci0K
LS8qKgotICBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgbG9va3VwIHJ1bGVzIGZv
ciBjb250YWluZXIgbG9va3VwczoKLQotICAqIHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBF
bWJlci5URU1QTEFURVNgCi0gICogb3RoZXIgbmFtZXMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgYXBw
bGljYXRpb24gYWZ0ZXIgY2xhc3NpZnlpbmcgdGhlIG5hbWUuCi0gICAgRm9yIGV4YW1wbGUsIGBj
b250cm9sbGVyOnBvc3RgIGxvb2tzIHVwIGBBcHAuUG9zdENvbnRyb2xsZXJgIGJ5IGRlZmF1bHQu
Ci0gICogaWYgdGhlIGRlZmF1bHQgbG9va3VwIGZhaWxzLCBsb29rIGZvciByZWdpc3RlcmVkIGNs
YXNzZXMgb24gdGhlIGNvbnRhaW5lcgotCi0gIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0
byByZWdpc3RlciBkZWZhdWx0IGluamVjdGlvbnMgaW4gdGhlIGNvbnRhaW5lcgotICB0aGF0IGNv
dWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG5vcm1hbCBuYW1pbmcgY29udmVudGlvbi4KLQotICBA
cHJpdmF0ZQotICBAbWV0aG9kIHJlc29sdmVyRm9yCi0gIEBwYXJhbSB7RW1iZXIuTmFtZXNwYWNl
fSBuYW1lc3BhY2UgdGhlIG5hbWVzcGFjZSB0byBsb29rIGZvciBjbGFzc2VzCi0gIEByZXR1cm4g
eyp9IHRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgYSBnaXZlbiBsb29rdXAKLSovCi1mdW5jdGlvbiBy
ZXNvbHZlckZvcihuYW1lc3BhY2UpIHsKLSAgaWYgKG5hbWVzcGFjZS5nZXQoJ3Jlc29sdmVyJykp
IHsKLSAgICBFbWJlci5kZXByZWNhdGUoJ0FwcGxpY2F0aW9uLnJlc29sdmVyIGlzIGRlcHJlY2F0
ZWQgaW4gZmF2b3Igb2YgQXBwbGljYXRpb24uUmVzb2x2ZXInLCBmYWxzZSk7Ci0gIH0KLQotICB2
YXIgUmVzb2x2ZXJDbGFzcyA9IG5hbWVzcGFjZS5nZXQoJ3Jlc29sdmVyJykgfHwgbmFtZXNwYWNl
LmdldCgnUmVzb2x2ZXInKSB8fCBFbWJlci5EZWZhdWx0UmVzb2x2ZXI7Ci0gIHZhciByZXNvbHZl
ciA9IFJlc29sdmVyQ2xhc3MuY3JlYXRlKHsKLSAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZQotICB9
KTsKLQotICBmdW5jdGlvbiByZXNvbHZlKGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJlc29sdmVy
LnJlc29sdmUoZnVsbE5hbWUpOwotICB9Ci0KLSAgcmVzb2x2ZS5kZXNjcmliZSA9IGZ1bmN0aW9u
KGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJlc29sdmVyLmxvb2t1cERlc2NyaXB0aW9uKGZ1bGxO
YW1lKTsKLSAgfTsKLQotICByZXNvbHZlLm1ha2VUb1N0cmluZyA9IGZ1bmN0aW9uKGZhY3Rvcnks
IGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJlc29sdmVyLm1ha2VUb1N0cmluZyhmYWN0b3J5LCBm
dWxsTmFtZSk7Ci0gIH07Ci0KLSAgcmVzb2x2ZS5ub3JtYWxpemUgPSBmdW5jdGlvbihmdWxsTmFt
ZSkgewotICAgIGlmIChyZXNvbHZlci5ub3JtYWxpemUpIHsKLSAgICAgIHJldHVybiByZXNvbHZl
ci5ub3JtYWxpemUoZnVsbE5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5kZXByZWNh
dGUoJ1RoZSBSZXNvbHZlciBzaG91bGQgbm93IHByb3ZpZGUgYSBcJ25vcm1hbGl6ZVwnIGZ1bmN0
aW9uJywgZmFsc2UpOwotICAgICAgcmV0dXJuIGZ1bGxOYW1lOwotICAgIH0KLSAgfTsKLQotICBy
ZXR1cm4gcmVzb2x2ZTsKLX0KLQotRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlv
bicsIEVtYmVyLkFwcGxpY2F0aW9uKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1i
ZXIuc2V0OwotCi1mdW5jdGlvbiB2ZXJpZnlOZWVkc0RlcGVuZGVuY2llcyhjb250cm9sbGVyLCBj
b250YWluZXIsIG5lZWRzKSB7Ci0gIHZhciBkZXBlbmRlbmN5LCBpLCBsLCBtaXNzaW5nID0gW107
Ci0KLSAgZm9yIChpPTAsIGw9bmVlZHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGRlcGVuZGVu
Y3kgPSBuZWVkc1tpXTsKLQotICAgIEVtYmVyLmFzc2VydChFbWJlci5pbnNwZWN0KGNvbnRyb2xs
ZXIpICsgIiNuZWVkcyBtdXN0IG5vdCBzcGVjaWZ5IGRlcGVuZGVuY2llcyB3aXRoIHBlcmlvZHMg
aW4gdGhlaXIgbmFtZXMgKCIgKyBkZXBlbmRlbmN5ICsgIikiLCBkZXBlbmRlbmN5LmluZGV4T2Yo
Jy4nKSA9PT0gLTEpOwotCi0gICAgaWYgKGRlcGVuZGVuY3kuaW5kZXhPZignOicpID09PSAtMSkg
ewotICAgICAgZGVwZW5kZW5jeSA9ICJjb250cm9sbGVyOiIgKyBkZXBlbmRlbmN5OwotICAgIH0K
LQotICAgIC8vIFN0cnVjdHVyZSBhc3NlcnQgdG8gc3RpbGwgZG8gdmVyaWZpY2F0aW9uIGJ1dCBu
b3Qgc3RyaW5nIGNvbmNhdCBpbiBwcm9kdWN0aW9uCi0gICAgaWYgKCFjb250YWluZXIuaGFzKGRl
cGVuZGVuY3kpKSB7Ci0gICAgICBtaXNzaW5nLnB1c2goZGVwZW5kZW5jeSk7Ci0gICAgfQotICB9
Ci0gIGlmIChtaXNzaW5nLmxlbmd0aCkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJl
ci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiBuZWVkcyBbICIgKyBtaXNzaW5nLmpvaW4oJywgJykg
KyAiIF0gYnV0ICIgKyAobWlzc2luZy5sZW5ndGggPiAxID8gJ3RoZXknIDogJ2l0JykgKyAiIGNv
dWxkIG5vdCBiZSBmb3VuZCIpOwotICB9Ci19Ci0KLXZhciBkZWZhdWx0Q29udHJvbGxlcnNDb21w
dXRlZFByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gIHZhciBjb250cm9s
bGVyID0gdGhpczsKLQotICByZXR1cm4gewotICAgIG5lZWRzOiBnZXQoY29udHJvbGxlciwgJ25l
ZWRzJyksCi0gICAgY29udGFpbmVyOiBnZXQoY29udHJvbGxlciwgJ2NvbnRhaW5lcicpLAotICAg
IHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24oY29udHJvbGxlck5hbWUpIHsKLSAgICAgIHZhciBu
ZWVkcyA9IHRoaXMubmVlZHMsCi0gICAgICAgIGRlcGVuZGVuY3ksIGksIGw7Ci0gICAgICBmb3Ig
KGk9MCwgbD1uZWVkcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGRlcGVuZGVuY3kgPSBu
ZWVkc1tpXTsKLSAgICAgICAgaWYgKGRlcGVuZGVuY3kgPT09IGNvbnRyb2xsZXJOYW1lKSB7Ci0g
ICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29u
dHJvbGxlck5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHZhciBlcnJvck1lc3Nh
Z2UgPSBFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgJyNuZWVkcyBkb2VzIG5vdCBpbmNsdWRl
IGAnICsgY29udHJvbGxlck5hbWUgKyAnYC4gVG8gYWNjZXNzIHRoZSAnICsgY29udHJvbGxlck5h
bWUgKyAnIGNvbnRyb2xsZXIgZnJvbSAnICsgRW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICcs
ICcgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgJyBzaG91bGQgaGF2ZSBhIGBuZWVkc2Ag
cHJvcGVydHkgdGhhdCBpcyBhbiBhcnJheSBvZiB0aGUgY29udHJvbGxlcnMgaXQgaGFzIGFjY2Vz
cyB0by4nOwotICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yTWVzc2FnZSk7Ci0g
ICAgfSwKLSAgICBzZXRVbmtub3duUHJvcGVydHk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0g
ICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBjYW5ub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBg
Y29udHJvbGxlcnMuIiArIGtleSArICJgIG9mICIgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIp
KTsKLSAgICB9Ci0gIH07Ci19KTsKLQotLyoqCi0gIEBjbGFzcyBDb250cm9sbGVyTWl4aW4KLSAg
QG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLkNvbnRyb2xsZXJNaXhpbi5yZW9wZW4oewotICBj
b25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBbJ25lZWRzJ10sCi0KLSAgLyoqCi0gICAgQW4gYXJyYXkg
b2Ygb3RoZXIgY29udHJvbGxlciBvYmplY3RzIGF2YWlsYWJsZSBpbnNpZGUKLSAgICBpbnN0YW5j
ZXMgb2YgdGhpcyBjb250cm9sbGVyIHZpYSB0aGUgYGNvbnRyb2xsZXJzYAotICAgIHByb3BlcnR5
OgotCi0gICAgRm9yIGV4YW1wbGUsIHdoZW4geW91IGRlZmluZSBhIGNvbnRyb2xsZXI6Ci0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkNvbW1lbnRzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5
Q29udHJvbGxlci5leHRlbmQoewotICAgICAgbmVlZHM6IFsncG9zdCddCi0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBUaGUgYXBwbGljYXRpb24ncyBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlc2Ugb3Ro
ZXIKLSAgICBjb250cm9sbGVycyBhcmUgYWNjZXNzaWJsZSBieSBuYW1lIHRocm91Z2ggdGhlCi0g
ICAgYGNvbnRyb2xsZXJzYCBwcm9wZXJ0eToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlz
LmdldCgnY29udHJvbGxlcnMucG9zdCcpOyAvLyBpbnN0YW5jZSBvZiBBcHAuUG9zdENvbnRyb2xs
ZXIKLSAgICBgYGAKLQotICAgIEdpdmVuIHRoYXQgeW91IGhhdmUgYSBuZXN0ZWQgY29udHJvbGxl
ciAobmVzdGVkIHJlc291cmNlKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVu
dHNOZXdDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIH0p
OwotICAgIGBgYAotCi0gICAgV2hlbiB5b3UgZGVmaW5lIGEgY29udHJvbGxlciB0aGF0IHJlcXVp
cmVzIGFjY2VzcyB0byBhIG5lc3RlZCBvbmU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBw
LkluZGV4Q29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAg
IG5lZWRzOiBbJ2NvbW1lbnRzTmV3J10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFlvdSB3aWxs
IGJlIGFibGUgdG8gZ2V0IGFjY2VzcyB0byBpdDoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0
aGlzLmdldCgnY29udHJvbGxlcnMuY29tbWVudHNOZXcnKTsgLy8gaW5zdGFuY2Ugb2YgQXBwLkNv
bW1lbnRzTmV3Q29udHJvbGxlcgotICAgIGBgYAotCi0gICAgVGhpcyBpcyBvbmx5IGF2YWlsYWJs
ZSBmb3Igc2luZ2xldG9uIGNvbnRyb2xsZXJzLgotCi0gICAgQHByb3BlcnR5IHtBcnJheX0gbmVl
ZHMKLSAgICBAZGVmYXVsdCBbXQotICAqLwotICBuZWVkczogW10sCi0KLSAgaW5pdDogZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIG5lZWRzID0gZ2V0KHRoaXMsICduZWVkcycpLAotICAgIGxlbmd0aCA9
IGdldChuZWVkcywgJ2xlbmd0aCcpOwotCi0gICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgIEVt
YmVyLmFzc2VydCgnIGAnICsgRW1iZXIuaW5zcGVjdCh0aGlzKSArICcgc3BlY2lmaWVzIGBuZWVk
c2AsIGJ1dCBkb2VzICcgKwotICAgICAgICAgICAgICAgICAgICJub3QgaGF2ZSBhIGNvbnRhaW5l
ci4gUGxlYXNlIGVuc3VyZSB0aGlzIGNvbnRyb2xsZXIgd2FzICIgKwotICAgICAgICAgICAgICAg
ICAgICJpbnN0YW50aWF0ZWQgd2l0aCBhIGNvbnRhaW5lci4iLAotICAgICAgICAgICAgICAgICAg
IHRoaXMuY29udGFpbmVyIHx8IEVtYmVyLm1ldGEodGhpcywgZmFsc2UpLmRlc2NzLmNvbnRyb2xs
ZXJzICE9PSBkZWZhdWx0Q29udHJvbGxlcnNDb21wdXRlZFByb3BlcnR5KTsKLQotICAgICAgaWYg
KHRoaXMuY29udGFpbmVyKSB7Ci0gICAgICAgIHZlcmlmeU5lZWRzRGVwZW5kZW5jaWVzKHRoaXMs
IHRoaXMuY29udGFpbmVyLCBuZWVkcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIG5lZWRzIHRo
ZW4gaW5pdGlhbGl6ZSBjb250cm9sbGVycyBwcm94eQotICAgICAgZ2V0KHRoaXMsICdjb250cm9s
bGVycycpOwotICAgIH0KLQotICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBjb250cm9sbGVyRm9yCi0gICAgQHNlZSB7RW1i
ZXIuUm91dGUjY29udHJvbGxlckZvcn0KLSAgICBAZGVwcmVjYXRlZCBVc2UgYG5lZWRzYCBpbnN0
ZWFkCi0gICovCi0gIGNvbnRyb2xsZXJGb3I6IGZ1bmN0aW9uKGNvbnRyb2xsZXJOYW1lKSB7Ci0g
ICAgRW1iZXIuZGVwcmVjYXRlKCJDb250cm9sbGVyI2NvbnRyb2xsZXJGb3IgaXMgZGVwcmVjYXRl
ZCwgcGxlYXNlIHVzZSBDb250cm9sbGVyI25lZWRzIGluc3RlYWQiKTsKLSAgICByZXR1cm4gRW1i
ZXIuY29udHJvbGxlckZvcihnZXQodGhpcywgJ2NvbnRhaW5lcicpLCBjb250cm9sbGVyTmFtZSk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgU3RvcmVzIHRoZSBpbnN0YW5jZXMgb2Ygb3RoZXIgY29udHJv
bGxlcnMgYXZhaWxhYmxlIGZyb20gd2l0aGluCi0gICAgdGhpcyBjb250cm9sbGVyLiBBbnkgY29u
dHJvbGxlciBsaXN0ZWQgYnkgbmFtZSBpbiB0aGUgYG5lZWRzYAotICAgIHByb3BlcnR5IHdpbGwg
YmUgYWNjZXNzaWJsZSBieSBuYW1lIHRocm91Z2ggdGhpcyBwcm9wZXJ0eS4KLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudHNDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9s
bGVyLmV4dGVuZCh7Ci0gICAgICBuZWVkczogWydwb3N0J10sCi0gICAgICBwb3N0VGl0bGU6IGZ1
bmN0aW9uKCl7Ci0gICAgICAgIHZhciBjdXJyZW50UG9zdCA9IHRoaXMuZ2V0KCdjb250cm9sbGVy
cy5wb3N0Jyk7IC8vIGluc3RhbmNlIG9mIEFwcC5Qb3N0Q29udHJvbGxlcgotICAgICAgICByZXR1
cm4gY3VycmVudFBvc3QuZ2V0KCd0aXRsZScpOwotICAgICAgfS5wcm9wZXJ0eSgnY29udHJvbGxl
cnMucG9zdC50aXRsZScpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAc2VlIHtFbWJlci5Db250
cm9sbGVyTWl4aW4jbmVlZHN9Ci0gICAgQHByb3BlcnR5IHtPYmplY3R9IGNvbnRyb2xsZXJzCi0g
ICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250cm9sbGVyczogZGVmYXVsdENvbnRyb2xsZXJz
Q29tcHV0ZWRQcm9wZXJ0eQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIEFwcGxpY2F0aW9uCi0KLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItYXBwbGljYXRpb24KLUByZXF1aXJlcyBlbWJlci12
aWV3cywgZW1iZXItcm91dGluZwotKi8KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWV4dGVuc2lvbi1zdXBwb3J0Ci0qLwotLyoq
Ci0gIFRoZSBgRGF0YUFkYXB0ZXJgIGhlbHBzIGEgZGF0YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5Ci0g
IGludGVyZmFjZSB3aXRoIHRvb2xzIHRoYXQgZGVidWcgRW1iZXIgc3VjaAotICBhcyB0aGUgW0Vt
YmVyIEV4dGVuc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vZW1iZXItZXh0ZW5zaW9u
KQotICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94LgotCi0gIFRoaXMgY2xhc3Mgd2lsbCBiZSBleHRl
bmRlZCBieSBhIHBlcnNpc3RlbmNlIGxpYnJhcnkKLSAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21l
IG9mIHRoZSBtZXRob2RzIHdpdGgKLSAgbGlicmFyeS1zcGVjaWZpYyBjb2RlLgotCi0gIFRoZSBt
ZXRob2RzIGxpa2VseSB0byBiZSBvdmVycmlkZGVuIGFyZToKLQotICAqIGBnZXRGaWx0ZXJzYAot
ICAqIGBkZXRlY3RgCi0gICogYGNvbHVtbnNGb3JUeXBlYAotICAqIGBnZXRSZWNvcmRzYAotICAq
IGBnZXRSZWNvcmRDb2x1bW5WYWx1ZXNgCi0gICogYGdldFJlY29yZEtleXdvcmRzYAotICAqIGBn
ZXRSZWNvcmRGaWx0ZXJWYWx1ZXNgCi0gICogYGdldFJlY29yZENvbG9yYAotICAqIGBvYnNlcnZl
UmVjb3JkYAotCi0gIFRoZSBhZGFwdGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3RlcmVkCi0gIGlu
IHRoZSBhcHBsaWNhdGlvbidzIGNvbnRhaW5lciBhcyBgZGF0YUFkYXB0ZXI6bWFpbmAKLQotICBF
eGFtcGxlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewot
ICAgIG5hbWU6ICJkYXRhQWRhcHRlciIsCi0KLSAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250
YWluZXIsIGFwcGxpY2F0aW9uKSB7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YUFk
YXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVyKTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBA
Y2xhc3MgRGF0YUFkYXB0ZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5P
YmplY3QKLSovCi1FbWJlci5EYXRhQWRhcHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBp
bml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMucmVsZWFzZU1l
dGhvZHMgPSBFbWJlci5BKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGNvbnRhaW5lciBvZiB0
aGUgYXBwbGljYXRpb24gYmVpbmcgZGVidWdnZWQuCi0gICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGJl
IGluamVjdGVkCi0gICAgb24gY3JlYXRpb24uCi0KLSAgICBAcHJvcGVydHkgY29udGFpbmVyCi0g
ICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250YWluZXI6IG51bGwsCi0KLSAgLyoqCi0gICAg
TnVtYmVyIG9mIGF0dHJpYnV0ZXMgdG8gc2VuZAotICAgIGFzIGNvbHVtbnMuIChFbm91Z2ggdG8g
bWFrZSB0aGUgcmVjb3JkCi0gICAgaWRlbnRpZmlhYmxlKS4KLQotICAgIEBwcml2YXRlCi0gICAg
QHByb3BlcnR5IGF0dHJpYnV0ZUxpbWl0Ci0gICAgQGRlZmF1bHQgMwotICAqLwotICBhdHRyaWJ1
dGVMaW1pdDogMywKLQotICAvKioKLSAgICBTdG9yZXMgYWxsIG1ldGhvZHMgdGhhdCBjbGVhciBv
YnNlcnZlcnMuCi0gICAgVGhlc2UgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbiBkZXN0cnVjdGlv
bi4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IHJlbGVhc2VNZXRob2RzCi0gICovCi0g
IHJlbGVhc2VNZXRob2RzOiBFbWJlci5BKCksCi0KLSAgLyoqCi0gICAgU3BlY2lmaWVzIGhvdyBy
ZWNvcmRzIGNhbiBiZSBmaWx0ZXJlZC4KLSAgICBSZWNvcmRzIHJldHVybmVkIHdpbGwgbmVlZCB0
byBoYXZlIGEgYGZpbHRlclZhbHVlc2AKLSAgICBwcm9wZXJ0eSB3aXRoIGEga2V5IGZvciBldmVy
eSBuYW1lIGluIHRoZSByZXR1cm5lZCBhcnJheS4KLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9k
IGdldEZpbHRlcnMKLSAgICBAcmV0dXJuIHtBcnJheX0gTGlzdCBvZiBvYmplY3RzIGRlZmluaW5n
IGZpbHRlcnMuCi0gICAgIFRoZSBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmFtZWAgYW5kIGBkZXNj
YCBwcm9wZXJ0eS4KLSAgKi8KLSAgZ2V0RmlsdGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IEVtYmVyLkEoKTsKLSAgfSwKLQotICAvKioKLSAgICBGZXRjaCB0aGUgbW9kZWwgdHlwZXMgYW5k
IG9ic2VydmUgdGhlbSBmb3IgY2hhbmdlcy4KLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIHdh
dGNoTW9kZWxUeXBlcwotCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gdHlwZXNBZGRlZCBDYWxsYmFj
ayB0byBjYWxsIHRvIGFkZCB0eXBlcy4KLSAgICBUYWtlcyBhbiBhcnJheSBvZiBvYmplY3RzIGNv
bnRhaW5pbmcgd3JhcHBlZCB0eXBlcyAocmV0dXJuZWQgZnJvbSBgd3JhcE1vZGVsVHlwZWApLgot
Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gdHlwZXNVcGRhdGVkIENhbGxiYWNrIHRvIGNhbGwgd2hl
biBhIHR5cGUgaGFzIGNoYW5nZWQuCi0gICAgVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250
YWluaW5nIHdyYXBwZWQgdHlwZXMuCi0KLSAgICBAcmV0dXJuIHtGdW5jdGlvbn0gTWV0aG9kIHRv
IGNhbGwgdG8gcmVtb3ZlIGFsbCBvYnNlcnZlcnMKLSAgKi8KLSAgd2F0Y2hNb2RlbFR5cGVzOiBm
dW5jdGlvbih0eXBlc0FkZGVkLCB0eXBlc1VwZGF0ZWQpIHsKLSAgICB2YXIgbW9kZWxUeXBlcyA9
IHRoaXMuZ2V0TW9kZWxUeXBlcygpLAotICAgICAgICBzZWxmID0gdGhpcywgdHlwZXNUb1NlbmQs
IHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgpOwotCi0gICAgdHlwZXNUb1NlbmQgPSBtb2RlbFR5
cGVzLm1hcChmdW5jdGlvbih0eXBlKSB7Ci0gICAgICB2YXIgd3JhcHBlZCA9IHNlbGYud3JhcE1v
ZGVsVHlwZSh0eXBlKTsKLSAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goc2VsZi5vYnNlcnZlTW9k
ZWxUeXBlKHR5cGUsIHR5cGVzVXBkYXRlZCkpOwotICAgICAgcmV0dXJuIHdyYXBwZWQ7Ci0gICAg
fSk7Ci0KLSAgICB0eXBlc0FkZGVkKHR5cGVzVG9TZW5kKTsKLQotICAgIHZhciByZWxlYXNlID0g
ZnVuY3Rpb24oKSB7Ci0gICAgICByZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7
IGZuKCk7IH0pOwotICAgICAgc2VsZi5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFz
ZSk7Ci0gICAgfTsKLSAgICB0aGlzLnJlbGVhc2VNZXRob2RzLnB1c2hPYmplY3QocmVsZWFzZSk7
Ci0gICAgcmV0dXJuIHJlbGVhc2U7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRmV0Y2ggdGhlIHJlY29y
ZHMgb2YgYSBnaXZlbiB0eXBlIGFuZCBvYnNlcnZlIHRoZW0gZm9yIGNoYW5nZXMuCi0KLSAgICBA
cHVibGljCi0gICAgQG1ldGhvZCB3YXRjaFJlY29yZHMKLQotICAgIEBwYXJhbSB7RnVuY3Rpb259
IHJlY29yZHNBZGRlZCBDYWxsYmFjayB0byBjYWxsIHRvIGFkZCByZWNvcmRzLgotICAgIFRha2Vz
IGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCi0gICAgVGhl
IG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0gICAgICBjb2x1
bW5WYWx1ZXM6IHtPYmplY3R9IGtleSBhbmQgdmFsdWUgb2YgYSB0YWJsZSBjZWxsCi0gICAgICBv
YmplY3Q6IHtPYmplY3R9IHRoZSBhY3R1YWwgcmVjb3JkIG9iamVjdAotCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gcmVjb3Jkc1VwZGF0ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhh
cyBjaGFuZ2VkLgotICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFw
cGVkIHJlY29yZHMuCi0KLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSByZWNvcmRzUmVtb3ZlZCBDYWxs
YmFjayB0byBjYWxsIHdoZW4gYSByZWNvcmQgaGFzIHJlbW92ZWQuCi0gICAgVGFrZXMgdGhlIGZv
bGxvd2luZyBwYXJhbWV0ZXJzOgotICAgICAgaW5kZXg6IHRoZSBhcnJheSBpbmRleCB3aGVyZSB0
aGUgcmVjb3JkcyB3ZXJlIHJlbW92ZWQKLSAgICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIHJlY29y
ZHMgcmVtb3ZlZAotCi0gICAgQHJldHVybiB7RnVuY3Rpb259IE1ldGhvZCB0byBjYWxsIHRvIHJl
bW92ZSBhbGwgb2JzZXJ2ZXJzCi0gICovCi0gIHdhdGNoUmVjb3JkczogZnVuY3Rpb24odHlwZSwg
cmVjb3Jkc0FkZGVkLCByZWNvcmRzVXBkYXRlZCwgcmVjb3Jkc1JlbW92ZWQpIHsKLSAgICB2YXIg
c2VsZiA9IHRoaXMsIHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgpLCByZWNvcmRzID0gdGhpcy5n
ZXRSZWNvcmRzKHR5cGUpLCByZWxlYXNlOwotCi0gICAgdmFyIHJlY29yZFVwZGF0ZWQgPSBmdW5j
dGlvbih1cGRhdGVkUmVjb3JkKSB7Ci0gICAgICByZWNvcmRzVXBkYXRlZChbdXBkYXRlZFJlY29y
ZF0pOwotICAgIH07Ci0KLSAgICB2YXIgcmVjb3Jkc1RvU2VuZCA9IHJlY29yZHMubWFwKGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNv
cmQocmVjb3JkLCByZWNvcmRVcGRhdGVkKSk7Ci0gICAgICByZXR1cm4gc2VsZi53cmFwUmVjb3Jk
KHJlY29yZCk7Ci0gICAgfSk7Ci0KLQotICAgIHZhciBjb250ZW50RGlkQ2hhbmdlID0gZnVuY3Rp
b24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgICBmb3IgKHZh
ciBpID0gaWR4OyBpIDwgaWR4ICsgYWRkZWRDb3VudDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNv
cmQgPSBhcnJheS5vYmplY3RBdChpKTsKLSAgICAgICAgdmFyIHdyYXBwZWQgPSBzZWxmLndyYXBS
ZWNvcmQocmVjb3JkKTsKLSAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVS
ZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVkKSk7Ci0gICAgICAgIHJlY29yZHNBZGRlZChbd3Jh
cHBlZF0pOwotICAgICAgfQotCi0gICAgICBpZiAocmVtb3ZlZENvdW50KSB7Ci0gICAgICAgIHJl
Y29yZHNSZW1vdmVkKGlkeCwgcmVtb3ZlZENvdW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAg
dmFyIG9ic2VydmVyID0geyBkaWRDaGFuZ2U6IGNvbnRlbnREaWRDaGFuZ2UsIHdpbGxDaGFuZ2U6
IEVtYmVyLksgfTsKLSAgICByZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIoc2VsZiwgb2JzZXJ2ZXIp
OwotCi0gICAgcmVsZWFzZSA9IGZ1bmN0aW9uKCkgewotICAgICAgcmVsZWFzZU1ldGhvZHMuZm9y
RWFjaChmdW5jdGlvbihmbikgeyBmbigpOyB9KTsKLSAgICAgIHJlY29yZHMucmVtb3ZlQXJyYXlP
YnNlcnZlcihzZWxmLCBvYnNlcnZlcik7Ci0gICAgICBzZWxmLnJlbGVhc2VNZXRob2RzLnJlbW92
ZU9iamVjdChyZWxlYXNlKTsKLSAgICB9OwotCi0gICAgcmVjb3Jkc0FkZGVkKHJlY29yZHNUb1Nl
bmQpOwotCi0gICAgdGhpcy5yZWxlYXNlTWV0aG9kcy5wdXNoT2JqZWN0KHJlbGVhc2UpOwotICAg
IHJldHVybiByZWxlYXNlOwotICB9LAotCi0gIC8qKgotICAgIENsZWFyIGFsbCBvYnNlcnZlcnMg
YmVmb3JlIGRlc3RydWN0aW9uCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgd2lsbERlc3Ryb3k6IGZ1
bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5yZWxlYXNlTWV0aG9kcy5m
b3JFYWNoKGZ1bmN0aW9uKGZuKSB7Ci0gICAgICBmbigpOwotICAgIH0pOwotICB9LAotCi0gIC8q
KgotICAgIERldGVjdCB3aGV0aGVyIGEgY2xhc3MgaXMgYSBtb2RlbC4KLQotICAgIFRlc3QgdGhh
dCBhZ2FpbnN0IHRoZSBtb2RlbCBjbGFzcwotICAgIG9mIHlvdXIgcGVyc2lzdGVuY2UgbGlicmFy
eQotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGRldGVjdAotICAgIEBwYXJhbSB7Q2xhc3N9
IGtsYXNzIFRoZSBjbGFzcyB0byB0ZXN0Ci0gICAgQHJldHVybiBib29sZWFuIFdoZXRoZXIgdGhl
IGNsYXNzIGlzIGEgbW9kZWwgY2xhc3Mgb3Igbm90Ci0gICovCi0gIGRldGVjdDogZnVuY3Rpb24o
a2xhc3MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBj
b2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5cGUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRo
b2QgY29sdW1uc0ZvclR5cGUKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBl
Ci0gICAgQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGNvbHVtbnMgb2YgdGhlIGZvbGxvd2lu
ZyBmb3JtYXQ6Ci0gICAgIG5hbWU6IHtTdHJpbmd9IG5hbWUgb2YgdGhlIGNvbHVtbgotICAgICBk
ZXNjOiB7U3RyaW5nfSBIdW1hbml6ZWQgZGVzY3JpcHRpb24gKHdoYXQgd291bGQgc2hvdyBpbiBh
IHRhYmxlIGNvbHVtbiBuYW1lKQotICAqLwotICBjb2x1bW5zRm9yVHlwZTogZnVuY3Rpb24odHlw
ZSkgewotICAgIHJldHVybiBFbWJlci5BKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBvYnNl
cnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNzLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9k
IG9ic2VydmVNb2RlbFR5cGUKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBl
IGNsYXNzCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gdHlwZXNVcGRhdGVkIENhbGxlZCB3aGVuIGEg
dHlwZSBpcyBtb2RpZmllZC4KLSAgICBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRv
IGNhbGwgdG8gcmVtb3ZlIG9ic2VydmVycwotICAqLwotCi0gIG9ic2VydmVNb2RlbFR5cGU6IGZ1
bmN0aW9uKHR5cGUsIHR5cGVzVXBkYXRlZCkgewotICAgIHZhciBzZWxmID0gdGhpcywgcmVjb3Jk
cyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKTsKLQotICAgIHZhciBvbkNoYW5nZSA9IGZ1bmN0aW9u
KCkgewotICAgICAgdHlwZXNVcGRhdGVkKFtzZWxmLndyYXBNb2RlbFR5cGUodHlwZSldKTsKLSAg
ICB9OwotICAgIHZhciBvYnNlcnZlciA9IHsKLSAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCB0aGlzLCBvbkNoYW5n
ZSk7Ci0gICAgICB9LAotICAgICAgd2lsbENoYW5nZTogRW1iZXIuSwotICAgIH07Ci0KLSAgICBy
ZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgb2JzZXJ2ZXIpOwotCi0gICAgdmFyIHJlbGVh
c2UgPSBmdW5jdGlvbigpIHsKLSAgICAgIHJlY29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxm
LCBvYnNlcnZlcik7Ci0gICAgfTsKLQotICAgIHJldHVybiByZWxlYXNlOwotICB9LAotCi0KLSAg
LyoqCi0gICAgV3JhcHMgYSBnaXZlbiBtb2RlbCB0eXBlIGFuZCBvYnNlcnZlcyBjaGFuZ2VzIHRv
IGl0LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHdyYXBNb2RlbFR5cGUKLSAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlIEEgbW9kZWwgY2xhc3MKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBl
c1VwZGF0ZWQgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB0eXBlIGNoYW5nZXMKLSAgICBAcmV0
dXJuIHtPYmplY3R9IGNvbnRhaW5zIHRoZSB3cmFwcGVkIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiB0
byByZW1vdmUgb2JzZXJ2ZXJzCi0gICAgRm9ybWF0OgotICAgICAgdHlwZToge09iamVjdH0gdGhl
IHdyYXBwZWQgdHlwZQotICAgICAgICBUaGUgd3JhcHBlZCB0eXBlIGhhcyB0aGUgZm9sbG93aW5n
IGZvcm1hdDoKLSAgICAgICAgICBuYW1lOiB7U3RyaW5nfSBuYW1lIG9mIHRoZSB0eXBlCi0gICAg
ICAgICAgY291bnQ6IHtJbnRlZ2VyfSBudW1iZXIgb2YgcmVjb3JkcyBhdmFpbGFibGUKLSAgICAg
ICAgICBjb2x1bW5zOiB7Q29sdW1uc30gYXJyYXkgb2YgY29sdW1ucyB0byBkZXNjcmliZSB0aGUg
cmVjb3JkCi0gICAgICAgICAgb2JqZWN0OiB7Q2xhc3N9IHRoZSBhY3R1YWwgTW9kZWwgdHlwZSBj
bGFzcwotICAgICAgcmVsZWFzZToge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdG8gcmVtb3ZlIG9i
c2VydmVycwotICAqLwotICB3cmFwTW9kZWxUeXBlOiBmdW5jdGlvbih0eXBlLCB0eXBlc1VwZGF0
ZWQpIHsKLSAgICB2YXIgcmVsZWFzZSwgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKSwK
LSAgICAgICAgdHlwZVRvU2VuZCwgc2VsZiA9IHRoaXM7Ci0KLSAgICB0eXBlVG9TZW5kID0gewot
ICAgICAgbmFtZTogdHlwZS50b1N0cmluZygpLAotICAgICAgY291bnQ6IEVtYmVyLmdldChyZWNv
cmRzLCAnbGVuZ3RoJyksCi0gICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnNGb3JUeXBlKHR5cGUp
LAotICAgICAgb2JqZWN0OiB0eXBlCi0gICAgfTsKLQotCi0gICAgcmV0dXJuIHR5cGVUb1NlbmQ7
Ci0gIH0sCi0KLQotICAvKioKLSAgICBGZXRjaGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUg
YXBwbGljYXRpb24uCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcwot
ICAgIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiBtb2RlbCB0eXBlcwotICAqLwotCi0gLy8gVE9E
TzogVXNlIHRoZSByZXNvbHZlciBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlciBuYW1lc3BhY2VzLgot
ICBnZXRNb2RlbFR5cGVzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZXNwYWNlcyA9IEVtYmVy
LkEoRW1iZXIuTmFtZXNwYWNlLk5BTUVTUEFDRVMpLCB0eXBlcyA9IEVtYmVyLkEoKSwgc2VsZiA9
IHRoaXM7Ci0KLSAgICBuYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rpb24obmFtZXNwYWNlKSB7Ci0g
ICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNwYWNlKSB7Ci0gICAgICAgIGlmICghbmFtZXNwYWNl
Lmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgICAgdmFyIGtsYXNzID0g
bmFtZXNwYWNlW2tleV07Ci0gICAgICAgIGlmIChzZWxmLmRldGVjdChrbGFzcykpIHsKLSAgICAg
ICAgICB0eXBlcy5wdXNoKGtsYXNzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAg
IHJldHVybiB0eXBlczsKLSAgfSwKLQotICAvKioKLSAgICBGZXRjaGVzIGFsbCBsb2FkZWQgcmVj
b3JkcyBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFJl
Y29yZHMKLSAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgcmVjb3Jkcy4KLSAgICAgVGhp
cyBhcnJheSB3aWxsIGJlIG9ic2VydmVkIGZvciBjaGFuZ2VzLAotICAgICBzbyBpdCBzaG91bGQg
dXBkYXRlIHdoZW4gbmV3IHJlY29yZHMgYXJlIGFkZGVkL3JlbW92ZWQuCi0gICovCi0gIGdldFJl
Y29yZHM6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICByZXR1cm4gRW1iZXIuQSgpOwotICB9LAotCi0g
IC8qKgotICAgIFdyYXBzIGEgcmVjb3JkIGFuZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KLQot
ICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3cmFwUmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9
IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNlLgotICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHdy
YXBwZWQgcmVjb3JkLiBGb3JtYXQ6Ci0gICAgY29sdW1uVmFsdWVzOiB7QXJyYXl9Ci0gICAgc2Vh
cmNoS2V5d29yZHM6IHtBcnJheX0KLSAgKi8KLSAgd3JhcFJlY29yZDogZnVuY3Rpb24ocmVjb3Jk
KSB7Ci0gICAgdmFyIHJlY29yZFRvU2VuZCA9IHsgb2JqZWN0OiByZWNvcmQgfSwgY29sdW1uVmFs
dWVzID0ge30sIHNlbGYgPSB0aGlzOwotCi0gICAgcmVjb3JkVG9TZW5kLmNvbHVtblZhbHVlcyA9
IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKHJlY29yZCk7Ci0gICAgcmVjb3JkVG9TZW5kLnNl
YXJjaEtleXdvcmRzID0gdGhpcy5nZXRSZWNvcmRLZXl3b3JkcyhyZWNvcmQpOwotICAgIHJlY29y
ZFRvU2VuZC5maWx0ZXJWYWx1ZXMgPSB0aGlzLmdldFJlY29yZEZpbHRlclZhbHVlcyhyZWNvcmQp
OwotICAgIHJlY29yZFRvU2VuZC5jb2xvciA9IHRoaXMuZ2V0UmVjb3JkQ29sb3IocmVjb3JkKTsK
LQotICAgIHJldHVybiByZWNvcmRUb1NlbmQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0cyB0aGUg
dmFsdWVzIGZvciBlYWNoIGNvbHVtbi4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRS
ZWNvcmRDb2x1bW5WYWx1ZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9IEtleXMgc2hvdWxkIG1hdGNo
IGNvbHVtbiBuYW1lcyBkZWZpbmVkCi0gICAgYnkgdGhlIG1vZGVsIHR5cGUuCi0gICovCi0gIGdl
dFJlY29yZENvbHVtblZhbHVlczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIHt9Owot
ICB9LAotCi0gIC8qKgotICAgIFJldHVybnMga2V5d29yZHMgdG8gbWF0Y2ggd2hlbiBzZWFyY2hp
bmcgcmVjb3Jkcy4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRLZXl3b3Jk
cwotICAgIEByZXR1cm4ge0FycmF5fSBSZWxldmFudCBrZXl3b3JkcyBmb3Igc2VhcmNoLgotICAq
LwotICBnZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIEVt
YmVyLkEoKTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgZmlsdGVy
cyBkZWZpbmVkIGJ5IGBnZXRGaWx0ZXJzYC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBn
ZXRSZWNvcmRGaWx0ZXJWYWx1ZXMKLSAgICBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNv
cmQgaW5zdGFuY2UKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBmaWx0ZXIgdmFsdWVzCi0gICov
Ci0gIGdldFJlY29yZEZpbHRlclZhbHVlczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJu
IHt9OwotICB9LAotCi0gIC8qKgotICAgIEVhY2ggcmVjb3JkIGNhbiBoYXZlIGEgY29sb3IgdGhh
dCByZXByZXNlbnRzIGl0cyBzdGF0ZS4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRS
ZWNvcmRDb2xvcgotICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5j
ZQotICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlY29yZCdzIGNvbG9yCi0gICAgICBQb3NzaWJs
ZSBvcHRpb25zOiBibGFjaywgcmVkLCBibHVlLCBncmVlbgotICAqLwotICBnZXRSZWNvcmRDb2xv
cjogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50IHByb3BlcnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFw
cGVkIHJlY29yZAotICAgIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzLgotCi0gICAgQHByaXZhdGUKLSAg
ICBAbWV0aG9kIG9ic2VydmVyUmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUg
cmVjb3JkIGluc3RhbmNlCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVjb3JkVXBkYXRlZCBUaGUg
Y2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGlzIHVwZGF0ZWQuCi0gICAgQHJldHVybiB7
RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzLgot
ICAqLwotICBvYnNlcnZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlY29yZFVwZGF0ZWQpIHsK
LSAgICByZXR1cm4gZnVuY3Rpb24oKXt9OwotICB9Ci0KLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIEV4dGVuc2lvbiBTdXBwb3J0Ci0KLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItZXh0ZW5zaW9uLXN1cHBvcnQKLUByZXF1aXJlcyBlbWJlci1h
cHBsaWNhdGlvbgotKi8KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUg
ZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci10ZXN0aW5nCi0gKi8KLXZhciBzbGljZSA9IFtdLnNs
aWNlLAotICAgIGhlbHBlcnMgPSB7fSwKLSAgICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tzID0gW107
Ci0KLS8qKgotICBUaGlzIGlzIGEgY29udGFpbmVyIGZvciBhbiBhc3NvcnRtZW50IG9mIHRlc3Rp
bmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5OgotCi0gICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0ZXN0
IGFkYXB0ZXIgKGZvciB5b3VyIGZyYW1ld29yayBvZiBjaG9pY2UpLgotICAqIFJlZ2lzdGVyL1Vu
cmVnaXN0ZXIgYWRkaXRpb25hbCB0ZXN0IGhlbHBlcnMuCi0gICogU2V0dXAgY2FsbGJhY2tzIHRv
IGJlIGZpcmVkIHdoZW4gdGhlIHRlc3QgaGVscGVycyBhcmUgaW5qZWN0ZWQgaW50bwotICAgIHlv
dXIgYXBwbGljYXRpb24uCi0KLSAgQGNsYXNzIFRlc3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8K
LUVtYmVyLlRlc3QgPSB7Ci0KLSAgLyoqCi0gICAgYHJlZ2lzdGVySGVscGVyYCBpcyB1c2VkIHRv
IHJlZ2lzdGVyIGEgdGVzdCBoZWxwZXIgdGhhdCB3aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBg
QXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxsZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhv
ZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwot
ICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICBFbWJlci5UZXN0LnJlZ2lzdGVySGVscGVyKCdib290JywgZnVuY3Rpb24o
YXBwKSB7Ci0gICAgICBFbWJlci5ydW4oYXBwLCBhcHAuYWR2YW5jZVJlYWRpbmVzcyk7Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGhlbHBlciBjYW4gbGF0ZXIgYmUgY2FsbGVkIHdpdGhv
dXQgYXJndW1lbnRzIGJlY2F1c2UgaXQgd2lsbCBiZQotICAgIGNhbGxlZCB3aXRoIGBhcHBgIGFz
IHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwID0gRW1i
ZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0gICAgQXBwLmluamVjdFRlc3RIZWxwZXJzKCk7Ci0g
ICAgYm9vdCgpOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2QgcmVnaXN0ZXJI
ZWxwZXIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1l
dGhvZCB0byBhZGQuCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyTWV0aG9kCi0gICAgQHBh
cmFtIG9wdGlvbnMge09iamVjdH0KLSAgKi8KLSAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5h
bWUsIGhlbHBlck1ldGhvZCkgewotICAgIGhlbHBlcnNbbmFtZV0gPSB7Ci0gICAgICBtZXRob2Q6
IGhlbHBlck1ldGhvZCwKLSAgICAgIG1ldGE6IHsgd2FpdDogZmFsc2UgfQotICAgIH07Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgYHJlZ2lzdGVyQXN5bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0ZXIg
YW4gYXN5bmMgdGVzdCBoZWxwZXIgdGhhdCB3aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBgQXBw
LmluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxsZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhvZCB3
aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwotICAg
IHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBFbWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNIZWxwZXIoJ2Jvb3QnLCBmdW5jdGlv
bihhcHApIHsKLSAgICAgIEVtYmVyLnJ1bihhcHAsIGFwcC5hZHZhbmNlUmVhZGluZXNzKTsKLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIFRoZSBhZHZhbnRhZ2Ugb2YgYW4gYXN5bmMgaGVscGVyIGlz
IHRoYXQgaXQgd2lsbCBub3QgcnVuCi0gICAgdW50aWwgdGhlIGxhc3QgYXN5bmMgaGVscGVyIGhh
cyBjb21wbGV0ZWQuICBBbGwgYXN5bmMgaGVscGVycwotICAgIGFmdGVyIGl0IHdpbGwgd2FpdCBm
b3IgaXQgY29tcGxldGUgYmVmb3JlIHJ1bm5pbmcuCi0KLQotICAgIEZvciBleGFtcGxlOgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJBc3luY0hlbHBlcignZGVs
ZXRlUG9zdCcsIGZ1bmN0aW9uKGFwcCwgcG9zdElkKSB7Ci0gICAgICBjbGljaygnLmRlbGV0ZS0n
ICsgcG9zdElkKTsKLSAgICB9KTsKLQotICAgIC8vIC4uLiBpbiB5b3VyIHRlc3QKLSAgICB2aXNp
dCgnL3Bvc3QvMicpOwotICAgIGRlbGV0ZVBvc3QoMik7Ci0gICAgdmlzaXQoJy9wb3N0LzMnKTsK
LSAgICBkZWxldGVQb3N0KDMpOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2Qg
cmVnaXN0ZXJBc3luY0hlbHBlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9m
IHRoZSBoZWxwZXIgbWV0aG9kIHRvIGFkZC4KLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJN
ZXRob2QKLSAgKi8KLSAgcmVnaXN0ZXJBc3luY0hlbHBlcjogZnVuY3Rpb24obmFtZSwgaGVscGVy
TWV0aG9kKSB7Ci0gICAgaGVscGVyc1tuYW1lXSA9IHsKLSAgICAgIG1ldGhvZDogaGVscGVyTWV0
aG9kLAotICAgICAgbWV0YTogeyB3YWl0OiB0cnVlIH0KLSAgICB9OwotICB9LAotCi0gIC8qKgot
ICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRkZWQgaGVscGVyIG1ldGhvZC4KLQotICAgIEV4YW1w
bGU6Ci0KLSAgICBgYGAKLSAgICBFbWJlci5UZXN0LnVucmVnaXN0ZXJIZWxwZXIoJ3dhaXQnKTsK
LSAgICBgYGAKLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIHVucmVnaXN0ZXJIZWxwZXIKLSAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgaGVscGVyIHRvIHJlbW92ZS4KLSAgKi8KLSAgdW5y
ZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSkgewotICAgIGRlbGV0ZSBoZWxwZXJzW25hbWVd
OwotICAgIGRlbGV0ZSBFbWJlci5UZXN0LlByb21pc2UucHJvdG90eXBlW25hbWVdOwotICB9LAot
Ci0gIC8qKgotICAgIFVzZWQgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW5l
dmVyIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgCi0gICAgaXMgY2FsbGVkLgotCi0gICAgVGhlIGNh
bGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBhcyBhbiBhcmd1bWVu
dC4KLQotICAgIEV4YW1wbGU6Ci0gICAgYGBgCi0gICAgRW1iZXIuVGVzdC5vbkluamVjdEhlbHBl
cnMoZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rp
b24oKSB7Ci0gICAgICAgIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cysrOwotICAgICAgfSk7Ci0K
LSAgICAgIEVtYmVyLiQoZG9jdW1lbnQpLmFqYXhTdG9wKGZ1bmN0aW9uKCkgewotICAgICAgICBU
ZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMtLTsKLSAgICAgIH0pOwotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQHB1YmxpYwotICAgIEBtZXRob2Qgb25JbmplY3RIZWxwZXJzCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KLSAgKi8KLSAgb25J
bmplY3RIZWxwZXJzOiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgIGluamVjdEhlbHBlcnNDYWxs
YmFja3MucHVzaChjYWxsYmFjayk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyByZXR1cm5zIGEg
dGhlbmFibGUgdGFpbG9yZWQgZm9yIHRlc3RpbmcuICBJdCBjYXRjaGVzIGZhaWxlZAotICAgIGBv
blN1Y2Nlc3NgIGNhbGxiYWNrcyBhbmQgaW52b2tlcyB0aGUgYEVtYmVyLlRlc3QuYWRhcHRlci5l
eGNlcHRpb25gCi0gICAgY2FsbGJhY2sgaW4gdGhlIGxhc3QgY2hhaW5lZCB0aGVuLgotCi0gICAg
VGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3VjaCBhcyBg
d2FpdGAuCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCBwcm9taXNlCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gcmVzb2x2ZXIgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlz
ZS4KLSAgKi8KLSAgcHJvbWlzZTogZnVuY3Rpb24ocmVzb2x2ZXIpIHsKLSAgICByZXR1cm4gbmV3
IEVtYmVyLlRlc3QuUHJvbWlzZShyZXNvbHZlcik7Ci0gIH0sCi0KLSAgLyoqCi0gICBVc2VkIHRv
IGFsbG93IGVtYmVyLXRlc3RpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBhIHNwZWNpZmljIHRlc3Rp
bmcKLSAgIGZyYW1ld29yay4KLQotICAgWW91IGNhbiBtYW51YWxseSBzZXQgaXQgYmVmb3JlIGNh
bGxpbmcgYEFwcC5zZXR1cEZvclRlc3RpbmcoKWAuCi0KLSAgIEV4YW1wbGU6Ci0KLSAgIGBgYAot
ICAgRW1iZXIuVGVzdC5hZGFwdGVyID0gTXlDdXN0b21BZGFwdGVyLmNyZWF0ZSgpCi0gICBgYGAK
LQotICAgSWYgeW91IGRvIG5vdCBzZXQgaXQsIGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRv
IGBFbWJlci5UZXN0LlFVbml0QWRhcHRlcmAuCi0KLSAgIEBwdWJsaWMKLSAgIEBwcm9wZXJ0eSBh
ZGFwdGVyCi0gICBAdHlwZSB7Q2xhc3N9IFRoZSBhZGFwdGVyIHRvIGJlIHVzZWQuCi0gICBAZGVm
YXVsdCBFbWJlci5UZXN0LlFVbml0QWRhcHRlcgotICAqLwotICBhZGFwdGVyOiBudWxsLAotCi0g
IC8qKgotICAgIFJlcGxhY2VtZW50IGZvciBgRW1iZXIuUlNWUC5yZXNvbHZlYAotICAgIFRoZSBv
bmx5IGRpZmZlcmVuY2UgaXMgdGhpcyB1c2VzCi0gICAgYW5kIGluc3RhbmNlIG9mIGBFbWJlci5U
ZXN0LlByb21pc2VgCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCByZXNvbHZlCi0gICAgQHBh
cmFtIHtNaXhlZH0gVGhlIHZhbHVlIHRvIHJlc29sdmUKLSAgKi8KLSAgcmVzb2x2ZTogZnVuY3Rp
b24odmFsKSB7Ci0gICAgcmV0dXJuIEVtYmVyLlRlc3QucHJvbWlzZShmdW5jdGlvbihyZXNvbHZl
KSB7Ci0gICAgICByZXR1cm4gcmVzb2x2ZSh2YWwpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgot
ICAgICBUaGlzIGFsbG93cyBlbWJlci10ZXN0aW5nIHRvIHBsYXkgbmljZWx5IHdpdGggb3RoZXIg
YXN5bmNocm9ub3VzCi0gICAgIGV2ZW50cywgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlz
IHdhaXRpbmcgZm9yIGEgQ1NTMwotICAgICB0cmFuc2l0aW9uIG9yIGFuIEluZGV4REIgdHJhbnNh
Y3Rpb24uCi0KLSAgICAgRm9yIGV4YW1wbGU6Ci0gICAgIGBgYGphdmFzY3JpcHQKLSAgICAgRW1i
ZXIuVGVzdC5yZWdpc3RlcldhaXRlcihmdW5jdGlvbigpIHsKLSAgICAgcmV0dXJuIG15UGVuZGlu
Z1RyYW5zYWN0aW9ucygpID09IDA7Ci0gICAgIH0pOwotICAgICBgYGAKLSAgICAgVGhlIGBjb250
ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYHRoaXNg
Ci0gICAgIHdpdGggd2hpY2ggeW91ciBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQuCi0KLSAgICAg
Rm9yIGV4YW1wbGU6Ci0gICAgIGBgYGphdmFzY3JpcHQKLSAgICAgRW1iZXIuVGVzdC5yZWdpc3Rl
cldhaXRlcihNeURCLCBNeURCLmhhc1BlbmRpbmdUcmFuc2FjdGlvbnMpOwotICAgICBgYGAKLSAg
ICAgQHB1YmxpYwotICAgICBAbWV0aG9kIHJlZ2lzdGVyV2FpdGVyCi0gICAgIEBwYXJhbSB7T2Jq
ZWN0fSBjb250ZXh0IChvcHRpb25hbCkKLSAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sK
LSAgKi8KLSAgcmVnaXN0ZXJXYWl0ZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrKSB7Ci0g
ICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIGNhbGxiYWNrID0gY29udGV4
dDsKLSAgICAgIGNvbnRleHQgPSBudWxsOwotICAgIH0KLSAgICBpZiAoIXRoaXMud2FpdGVycykg
ewotICAgICAgdGhpcy53YWl0ZXJzID0gRW1iZXIuQSgpOwotICAgIH0KLSAgICB0aGlzLndhaXRl
cnMucHVzaChbY29udGV4dCwgY2FsbGJhY2tdKTsKLSAgfSwKLSAgLyoqCi0gICAgIGB1bnJlZ2lz
dGVyV2FpdGVyYCBpcyB1c2VkIHRvIHVucmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdhcwotICAg
ICByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVyV2FpdGVyYC4KLQotICAgICBAcHVibGljCi0gICAg
IEBtZXRob2QgdW5yZWdpc3RlcldhaXRlcgotICAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCAo
b3B0aW9uYWwpCi0gICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0gICovCi0gIHVucmVn
aXN0ZXJXYWl0ZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrKSB7Ci0gICAgdmFyIHBhaXI7
Ci0gICAgaWYgKCF0aGlzLndhaXRlcnMpIHsgcmV0dXJuOyB9Ci0gICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggPT09IDEpIHsKLSAgICAgIGNhbGxiYWNrID0gY29udGV4dDsKLSAgICAgIGNvbnRleHQg
PSBudWxsOwotICAgIH0KLSAgICBwYWlyID0gW2NvbnRleHQsIGNhbGxiYWNrXTsKLSAgICB0aGlz
LndhaXRlcnMgPSBFbWJlci5BKHRoaXMud2FpdGVycy5maWx0ZXIoZnVuY3Rpb24oZWx0KSB7Ci0g
ICAgICByZXR1cm4gRW1iZXIuY29tcGFyZShlbHQsIHBhaXIpIT09MDsKLSAgICB9KSk7Ci0gIH0K
LX07Ci0KLWZ1bmN0aW9uIGhlbHBlcihhcHAsIG5hbWUpIHsKLSAgdmFyIGZuID0gaGVscGVyc1tu
YW1lXS5tZXRob2QsCi0gICAgICBtZXRhID0gaGVscGVyc1tuYW1lXS5tZXRhOwotCi0gIHJldHVy
biBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwKLSAg
ICAgICAgbGFzdFByb21pc2UgPSBFbWJlci5UZXN0Lmxhc3RQcm9taXNlOwotCi0gICAgYXJncy51
bnNoaWZ0KGFwcCk7Ci0KLSAgICAvLyBzb21lIGhlbHBlcnMgYXJlIG5vdCBhc3luYyBhbmQKLSAg
ICAvLyBuZWVkIHRvIHJldHVybiBhIHZhbHVlIGltbWVkaWF0ZWx5LgotICAgIC8vIGV4YW1wbGU6
IGBmaW5kYAotICAgIGlmICghbWV0YS53YWl0KSB7Ci0gICAgICByZXR1cm4gZm4uYXBwbHkoYXBw
LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWxhc3RQcm9taXNlKSB7Ci0gICAgICAvLyBJdCdz
IHRoZSBmaXJzdCBhc3luYyBoZWxwZXIgaW4gY3VycmVudCBjb250ZXh0Ci0gICAgICBsYXN0UHJv
bWlzZSA9IGZuLmFwcGx5KGFwcCwgYXJncyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHdhaXQg
Zm9yIGxhc3QgaGVscGVyJ3MgcHJvbWlzZSB0byByZXNvbHZlCi0gICAgICAvLyBhbmQgdGhlbiBl
eGVjdXRlCi0gICAgICBydW4oZnVuY3Rpb24oKSB7Ci0gICAgICAgIGxhc3RQcm9taXNlID0gRW1i
ZXIuVGVzdC5yZXNvbHZlKGxhc3RQcm9taXNlKS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgICAg
IHJldHVybiBmbi5hcHBseShhcHAsIGFyZ3MpOwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAg
IH0KLQotICAgIHJldHVybiBsYXN0UHJvbWlzZTsKLSAgfTsKLX0KLQotZnVuY3Rpb24gcnVuKGZu
KSB7Ci0gIGlmICghRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wKSB7Ci0gICAgRW1iZXIucnVuKGZu
KTsKLSAgfSBlbHNlIHsKLSAgICBmbigpOwotICB9Ci19Ci0KLUVtYmVyLkFwcGxpY2F0aW9uLnJl
b3Blbih7Ci0gIC8qKgotICAgVGhpcyBwcm9wZXJ0eSBjb250YWlucyB0aGUgdGVzdGluZyBoZWxw
ZXJzIGZvciB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4gVGhlc2UKLSAgIGFyZSBjcmVhdGVkIG9u
Y2UgeW91IGNhbGwgYGluamVjdFRlc3RIZWxwZXJzYCBvbiB5b3VyIGBFbWJlci5BcHBsaWNhdGlv
bmAKLSAgIGluc3RhbmNlLiBUaGUgaW5jbHVkZWQgaGVscGVycyBhcmUgYWxzbyBhdmFpbGFibGUg
b24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQotICAgZGVmYXVsdCwgYnV0IGNhbiBiZSB1c2VkIGZy
b20gdGhpcyBvYmplY3Qgb24gdGhlIGluZGl2aWR1YWwgYXBwbGljYXRpb24gYWxzby4KLQotICAg
IEBwcm9wZXJ0eSB0ZXN0SGVscGVycwotICAgIEB0eXBlIHtPYmplY3R9Ci0gICAgQGRlZmF1bHQg
e30KLSAgKi8KLSAgdGVzdEhlbHBlcnM6IHt9LAotCi0gIC8qKgotICAgVGhpcyBwcm9wZXJ0eSB3
aWxsIGNvbnRhaW4gdGhlIG9yaWdpbmFsIG1ldGhvZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQKLSAg
IG9uIHRoZSBgaGVscGVyQ29udGFpbmVyYCBiZWZvcmUgYGluamVjdFRlc3RIZWxwZXJzYCBpcyBj
YWxsZWQuCi0KLSAgIFdoZW4gYHJlbW92ZVRlc3RIZWxwZXJzYCBpcyBjYWxsZWQsIHRoZXNlIG1l
dGhvZHMgYXJlIHJlc3RvcmVkIHRvIHRoZQotICAgYGhlbHBlckNvbnRhaW5lcmAuCi0KLSAgICBA
cHJvcGVydHkgb3JpZ2luYWxNZXRob2RzCi0gICAgQHR5cGUge09iamVjdH0KLSAgICBAZGVmYXVs
dCB7fQotICAgIEBwcml2YXRlCi0gICovCi0gIG9yaWdpbmFsTWV0aG9kczoge30sCi0KLQotICAv
KioKLSAgVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBhcHBsaWNh
dGlvbiBpcyBjdXJyZW50bHkgaW4KLSAgdGVzdGluZyBtb2RlLiBUaGlzIGlzIHNldCB3aGVuIGBz
ZXR1cEZvclRlc3RpbmdgIGlzIGNhbGxlZCBvbiB0aGUgY3VycmVudAotICBhcHBsaWNhdGlvbi4K
LQotICBAcHJvcGVydHkgdGVzdGluZwotICBAdHlwZSB7Qm9vbGVhbn0KLSAgQGRlZmF1bHQgZmFs
c2UKLSAgKi8KLSAgdGVzdGluZzogZmFsc2UsCi0KLSAgLyoqCi0gICBUaGlzIGhvb2sgZGVmZXJz
IHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCBzbyB0aGF0IHlvdSBjYW4gc3RhcnQK
LSAgIHRoZSBhcHAgd2hlbiB5b3VyIHRlc3RzIGFyZSByZWFkeSB0byBydW4uIEl0IGFsc28gc2V0
cyB0aGUgcm91dGVyJ3MKLSAgIGxvY2F0aW9uIHRvICdub25lJywgc28gdGhhdCB0aGUgd2luZG93
J3MgbG9jYXRpb24gd2lsbCBub3QgYmUgbW9kaWZpZWQKLSAgIChwcmV2ZW50aW5nIGJvdGggYWNj
aWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJldHdlZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQot
ICAgd2l0aCB5b3VyIHRlc3RpbmcgZnJhbWV3b3JrKS4KLQotICAgRXhhbXBsZToKLQotICBgYGAK
LSAgQXBwLnNldHVwRm9yVGVzdGluZygpOwotICBgYGAKLQotICAgIEBtZXRob2Qgc2V0dXBGb3JU
ZXN0aW5nCi0gICovCi0gIHNldHVwRm9yVGVzdGluZzogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIu
dGVzdGluZyA9IHRydWU7Ci0KLSAgICB0aGlzLnRlc3RpbmcgPSB0cnVlOwotCi0gICAgdGhpcy5S
b3V0ZXIucmVvcGVuKHsKLSAgICAgIGxvY2F0aW9uOiAnbm9uZScKLSAgICB9KTsKLQotICAgIC8v
IGlmIGFkYXB0ZXIgaXMgbm90IG1hbnVhbGx5IHNldCBkZWZhdWx0IHRvIFFVbml0Ci0gICAgaWYg
KCFFbWJlci5UZXN0LmFkYXB0ZXIpIHsKLSAgICAgICBFbWJlci5UZXN0LmFkYXB0ZXIgPSBFbWJl
ci5UZXN0LlFVbml0QWRhcHRlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICAgIH0sCi0KLSAgLyoq
Ci0gICAgVGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRhaW5lciB0byBpbmplY3QgdGhlIHRl
c3QgaGVscGVycyBpbnRvLiBCeQotICAgIGRlZmF1bHQgdGhlIGhlbHBlcnMgYXJlIGluamVjdGVk
IGludG8gYHdpbmRvd2AuCi0KLSAgICBAcHJvcGVydHkgaGVscGVyQ29udGFpbmVyCi0gICBAdHlw
ZSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRlc3QgaGVscGVycy4KLSAgIEBk
ZWZhdWx0IHdpbmRvdwotICAqLwotICBoZWxwZXJDb250YWluZXI6IHdpbmRvdywKLQotICAvKioK
LSAgICBUaGlzIGluamVjdHMgdGhlIHRlc3QgaGVscGVycyBpbnRvIHRoZSBgaGVscGVyQ29udGFp
bmVyYCBvYmplY3QuIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZAotICAgIGl0IHdpbGwgYmUgdXNl
ZCBhcyB0aGUgaGVscGVyQ29udGFpbmVyLiBJZiBgaGVscGVyQ29udGFpbmVyYCBpcyBub3Qgc2V0
IGl0IHdpbGwgZGVmYXVsdAotICAgIHRvIGB3aW5kb3dgLiBJZiBhIGZ1bmN0aW9uIG9mIHRoZSBz
YW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGl0IHdpbGwgYmUgY2FjaGVkCi0gICAg
KHNvIHRoYXQgaXQgY2FuIGJlIHJlc2V0IGlmIHRoZSBoZWxwZXIgaXMgcmVtb3ZlZCB3aXRoIGB1
bnJlZ2lzdGVySGVscGVyYCBvcgotICAgIGByZW1vdmVUZXN0SGVscGVyc2ApLgotCi0gICBBbnkg
Y2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBgb25JbmplY3RIZWxwZXJzYCB3aWxsIGJlIGNhbGxl
ZCBvbmNlIHRoZQotICAgaGVscGVycyBoYXZlIGJlZW4gaW5qZWN0ZWQuCi0KLSAgRXhhbXBsZToK
LSAgYGBgCi0gIEFwcC5pbmplY3RUZXN0SGVscGVycygpOwotICBgYGAKLQotICAgIEBtZXRob2Qg
aW5qZWN0VGVzdEhlbHBlcnMKLSAgKi8KLSAgaW5qZWN0VGVzdEhlbHBlcnM6IGZ1bmN0aW9uKGhl
bHBlckNvbnRhaW5lcikgewotICAgIGlmIChoZWxwZXJDb250YWluZXIpIHsgdGhpcy5oZWxwZXJD
b250YWluZXIgPSBoZWxwZXJDb250YWluZXI7IH0KLQotICAgIHRoaXMudGVzdEhlbHBlcnMgPSB7
fTsKLSAgICBmb3IgKHZhciBuYW1lIGluIGhlbHBlcnMpIHsKLSAgICAgIHRoaXMub3JpZ2luYWxN
ZXRob2RzW25hbWVdID0gdGhpcy5oZWxwZXJDb250YWluZXJbbmFtZV07Ci0gICAgICB0aGlzLnRl
c3RIZWxwZXJzW25hbWVdID0gdGhpcy5oZWxwZXJDb250YWluZXJbbmFtZV0gPSBoZWxwZXIodGhp
cywgbmFtZSk7Ci0gICAgICBwcm90b1dyYXAoRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZSwg
bmFtZSwgaGVscGVyKHRoaXMsIG5hbWUpLCBoZWxwZXJzW25hbWVdLm1ldGEud2FpdCk7Ci0gICAg
fQotCi0gICAgZm9yKHZhciBpID0gMCwgbCA9IGluamVjdEhlbHBlcnNDYWxsYmFja3MubGVuZ3Ro
OyBpIDwgbDsgaSsrKSB7Ci0gICAgICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tzW2ldKHRoaXMpOwot
ICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIHJlbW92ZXMgYWxsIGhlbHBlcnMgdGhhdCBo
YXZlIGJlZW4gcmVnaXN0ZXJlZCwgYW5kIHJlc2V0cyBhbmQgZnVuY3Rpb25zCi0gICAgdGhhdCB3
ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBlcnMuCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBg
amF2YXNjcmlwdAotICAgIEFwcC5yZW1vdmVUZXN0SGVscGVycygpOwotICAgIGBgYAotCi0gICAg
QHB1YmxpYwotICAgIEBtZXRob2QgcmVtb3ZlVGVzdEhlbHBlcnMKLSAgKi8KLSAgcmVtb3ZlVGVz
dEhlbHBlcnM6IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIG5hbWUgaW4gaGVscGVycykgewot
ICAgICAgdGhpcy5oZWxwZXJDb250YWluZXJbbmFtZV0gPSB0aGlzLm9yaWdpbmFsTWV0aG9kc1tu
YW1lXTsKLSAgICAgIGRlbGV0ZSB0aGlzLnRlc3RIZWxwZXJzW25hbWVdOwotICAgICAgZGVsZXRl
IHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVdOwotICAgIH0KLSAgfQotfSk7Ci0KLS8vIFRoaXMg
bWV0aG9kIGlzIG5vIGxvbmdlciBuZWVkZWQKLS8vIEJ1dCBzdGlsbCBoZXJlIGZvciBiYWNrd2Fy
ZHMgY29tcGF0aWJpbGl0eQotLy8gb2YgaGVscGVyIGNoYWluaW5nCi1mdW5jdGlvbiBwcm90b1dy
YXAocHJvdG8sIG5hbWUsIGNhbGxiYWNrLCBpc0FzeW5jKSB7Ci0gIHByb3RvW25hbWVdID0gZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7Ci0gICAgaWYgKGlzQXN5bmMpIHsK
LSAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxi
YWNrLmFwcGx5KHRoaXMsIGFyZ3MpOwotICAgICAgfSk7Ci0gICAgfQotICB9OwotfQotCi1FbWJl
ci5UZXN0LlByb21pc2UgPSBmdW5jdGlvbigpIHsKLSAgRW1iZXIuUlNWUC5Qcm9taXNlLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIEVtYmVyLlRlc3QubGFzdFByb21pc2UgPSB0aGlzOwotfTsK
LQotRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShFbWJlci5SU1ZQ
LlByb21pc2UucHJvdG90eXBlKTsKLUVtYmVyLlRlc3QuUHJvbWlzZS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBFbWJlci5UZXN0LlByb21pc2U7Ci0KLS8vIFBhdGNoIGB0aGVuYCB0byBpc29sYXRl
IGFzeW5jIG1ldGhvZHMKLS8vIHNwZWNpZmljYWxseSBgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAK
LXZhciBvcmlnaW5hbFRoZW4gPSBFbWJlci5SU1ZQLlByb21pc2UucHJvdG90eXBlLnRoZW47Ci1F
bWJlci5UZXN0LlByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvblN1Y2Nlc3MsIG9u
RmFpbHVyZSkgewotICByZXR1cm4gb3JpZ2luYWxUaGVuLmNhbGwodGhpcywgZnVuY3Rpb24odmFs
KSB7Ci0gICAgcmV0dXJuIGlzb2xhdGUob25TdWNjZXNzLCB2YWwpOwotICB9LCBvbkZhaWx1cmUp
OwotfTsKLQotLy8gVGhpcyBtZXRob2QgaXNvbGF0ZXMgbmVzdGVkIGFzeW5jIG1ldGhvZHMKLS8v
IHNvIHRoYXQgdGhleSBkb24ndCBjb25mbGljdCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCi0v
LwotLy8gMS4gU2V0IGBFbWJlci5UZXN0Lmxhc3RQcm9taXNlYCB0byBudWxsCi0vLyAyLiBJbnZv
a2UgbWV0aG9kCi0vLyAzLiBSZXR1cm4gdGhlIGxhc3QgcHJvbWlzZSBjcmVhdGVkIGR1cmluZyBt
ZXRob2QKLS8vIDQuIFJlc3RvcmUgYEVtYmVyLlRlc3QubGFzdFByb21pc2VgIHRvIG9yaWdpbmFs
IHZhbHVlCi1mdW5jdGlvbiBpc29sYXRlKGZuLCB2YWwpIHsKLSAgdmFyIHZhbHVlLCBsYXN0UHJv
bWlzZTsKLQotICAvLyBSZXNldCBsYXN0UHJvbWlzZSBmb3IgbmVzdGVkIGhlbHBlcnMKLSAgRW1i
ZXIuVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7Ci0KLSAgdmFsdWUgPSBmbi5jYWxsKG51bGwsIHZh
bCk7Ci0KLSAgbGFzdFByb21pc2UgPSBFbWJlci5UZXN0Lmxhc3RQcm9taXNlOwotCi0gIC8vIElm
IHRoZSBtZXRob2QgcmV0dXJuZWQgYSBwcm9taXNlCi0gIC8vIHJldHVybiB0aGF0IHByb21pc2Uu
IElmIG5vdCwKLSAgLy8gcmV0dXJuIHRoZSBsYXN0IGFzeW5jIGhlbHBlcidzIHByb21pc2UKLSAg
aWYgKCh2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBFbWJlci5UZXN0LlByb21pc2UpKSB8fCAh
bGFzdFByb21pc2UpIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgcnVuKGZ1
bmN0aW9uKCkgewotICAgICAgbGFzdFByb21pc2UgPSBFbWJlci5UZXN0LnJlc29sdmUobGFzdFBy
b21pc2UpLnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0p
OwotICAgIH0pOwotICAgIHJldHVybiBsYXN0UHJvbWlzZTsKLSAgfQotfQotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotRW1iZXIub25Mb2FkKCdFbWJlci5BcHBsaWNhdGlvbicsIGZ1bmN0
aW9uKEFwcGxpY2F0aW9uKSB7Ci0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1l
OiAnZGVmZXJSZWFkaW5lc3MgaW4gYHRlc3RpbmdgIG1vZGUnLAotCi0gICAgaW5pdGlhbGl6ZTog
ZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbil7Ci0gICAgICBpZiAoYXBwbGljYXRpb24u
dGVzdGluZykgewotICAgICAgICBhcHBsaWNhdGlvbi5kZWZlclJlYWRpbmVzcygpOwotICAgICAg
fQotICAgIH0KLSAgfSk7Ci0KLSAgfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0v
KioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKLSAqLwotCi12
YXIgJCA9IEVtYmVyLiQ7Ci0KLS8qKgotICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3gg
YW5kIHRyaWdnZXJzIHRoZSBjbGljayBldmVudCB0byBmaXJlIHRoZQotICBwYXNzZWQgaW4gaGFu
ZGxlci4gSXQgaXMgdXNlZCB0byBjb3JyZWN0IGZvciBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucwot
ICBvZiBqUXVlcnkgKGUuZyAxLjguMykuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCB0ZXN0Q2hl
Y2tib3hDbGljawotKi8KLWZ1bmN0aW9uIHRlc3RDaGVja2JveENsaWNrKGhhbmRsZXIpIHsKLSAg
JCgnPGlucHV0IHR5cGU9ImNoZWNrYm94Ij4nKQotICAgIC5jc3MoeyBwb3NpdGlvbjogJ2Fic29s
dXRlJywgbGVmdDogJy0xMDAwcHgnLCB0b3A6ICctMTAwMHB4JyB9KQotICAgIC5hcHBlbmRUbygn
Ym9keScpCi0gICAgLm9uKCdjbGljaycsIGhhbmRsZXIpCi0gICAgLnRyaWdnZXIoJ2NsaWNrJykK
LSAgICAucmVtb3ZlKCk7Ci19Ci0KLSQoZnVuY3Rpb24oKSB7Ci0gIC8qCi0gICAgRGV0ZXJtaW5l
IHdoZXRoZXIgYSBjaGVja2JveCBjaGVja2VkIHVzaW5nIGpRdWVyeSdzICJjbGljayIgbWV0aG9k
IHdpbGwgaGF2ZQotICAgIHRoZSBjb3JyZWN0IHZhbHVlIGZvciBpdHMgY2hlY2tlZCBwcm9wZXJ0
eS4KLQotICAgIElmIHdlIGRldGVybWluZSB0aGF0IHRoZSBjdXJyZW50IGpRdWVyeSB2ZXJzaW9u
IGV4aGliaXRzIHRoaXMgYmVoYXZpb3IsCi0gICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkg
YXMgaW4gdGhlIGNvbW1pdCBmb3IgdGhlIGFjdHVhbCBmaXg6Ci0gICAgaHR0cHM6Ly9naXRodWIu
Y29tL2pxdWVyeS9qcXVlcnkvY29tbWl0LzFmYjJmOTIuCi0gICovCi0gIHRlc3RDaGVja2JveENs
aWNrKGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5jaGVja2VkICYmICEkLmV2ZW50LnNwZWNp
YWwuY2xpY2spIHsKLSAgICAgICQuZXZlbnQuc3BlY2lhbC5jbGljayA9IHsKLSAgICAgICAgLy8g
Rm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUg
cmlnaHQKLSAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgaWYgKCQubm9k
ZU5hbWUoIHRoaXMsICJpbnB1dCIgKSAmJiB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgJiYgdGhp
cy5jbGljaykgewotICAgICAgICAgICAgdGhpcy5jbGljaygpOwotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0gIH0pOwot
Ci0gIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgcGF0Y2ggdG9vayBlZmZlY3Qgb3Ig
YmxvdyB1cC4KLSAgdGVzdENoZWNrYm94Q2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIud2Fy
bigiY2xpY2tlZCBjaGVja2JveGVzIHNob3VsZCBiZSBjaGVja2VkISB0aGUgalF1ZXJ5IHBhdGNo
IGRpZG4ndCB3b3JrIiwgdGhpcy5jaGVja2VkKTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLS8qKgotIEBtb2R1bGUgZW1iZXIKLSBAc3VibW9kdWxlIGVtYmVyLXRl
c3RpbmcKLSovCi0KLXZhciBUZXN0ID0gRW1iZXIuVGVzdDsKLQotLyoqCi0gIFRoZSBwcmltYXJ5
IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBjcmVhdGUgaG9va3MgdGhhdCBjYW4gYmUgaW1w
bGVtZW50ZWQKLSAgYnkgYW4gYWRhcHRlciBmb3IgdmFyaW91cyB0ZXN0IGZyYW1ld29ya3MuCi0K
LSAgQGNsYXNzIEFkYXB0ZXIKLSAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Ci0qLwotVGVzdC5BZGFw
dGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gIC8qKgotICAgIFRoaXMgY2FsbGJhY2sgd2ls
bCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5bmMgb3BlcmF0aW9uIGlzIGFib3V0IHRvIHN0YXJ0
LgotCi0gICAgT3ZlcnJpZGUgdGhpcyB0byBjYWxsIHlvdXIgZnJhbWV3b3JrJ3MgbWV0aG9kcyB0
aGF0IGhhbmRsZSBhc3luYwotICAgIG9wZXJhdGlvbnMuCi0KLSAgICBAcHVibGljCi0gICAgQG1l
dGhvZCBhc3luY1N0YXJ0Ci0gICovCi0gIGFzeW5jU3RhcnQ6IEVtYmVyLkssCi0KLSAgLyoqCi0g
ICAgVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhbiBhc3luYyBvcGVyYXRp
b24gaGFzIGNvbXBsZXRlZC4KLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIGFzeW5jRW5kCi0g
ICovCi0gIGFzeW5jRW5kOiBFbWJlci5LLAotCi0gIC8qKgotICAgIE92ZXJyaWRlIHRoaXMgbWV0
aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1ld29yaydzIGZhbHNlIGFzc2VydGlvbi4KLSAgICBU
aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBleGNlcHRpb24gb2NjdXJzIGNhdXNp
bmcgdGhlIHRlc3RpbmcKLSAgICBwcm9taXNlIHRvIGZhaWwuCi0KLSAgICBRVW5pdCBleGFtcGxl
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikg
ewotICAgICAgICBvayhmYWxzZSwgZXJyb3IpOwotICAgICAgfTsKLSAgICBgYGAKLQotICAgIEBw
dWJsaWMKLSAgICBAbWV0aG9kIGV4Y2VwdGlvbgotICAgIEBwYXJhbSB7U3RyaW5nfSBlcnJvciBU
aGUgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4KLSAgKi8KLSAgZXhjZXB0aW9uOiBmdW5jdGlvbihl
cnJvcikgewotICAgIHRocm93IGVycm9yOwotICB9Ci19KTsKLQotLyoqCi0gIFRoaXMgY2xhc3Mg
aW1wbGVtZW50cyB0aGUgbWV0aG9kcyBkZWZpbmVkIGJ5IEVtYmVyLlRlc3QuQWRhcHRlciBmb3Ig
dGhlCi0gIFFVbml0IHRlc3RpbmcgZnJhbWV3b3JrLgotCi0gIEBjbGFzcyBRVW5pdEFkYXB0ZXIK
LSAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Ci0gIEBleHRlbmRzIEVtYmVyLlRlc3QuQWRhcHRlcgot
Ki8KLVRlc3QuUVVuaXRBZGFwdGVyID0gVGVzdC5BZGFwdGVyLmV4dGVuZCh7Ci0gIGFzeW5jU3Rh
cnQ6IGZ1bmN0aW9uKCkgewotICAgIHN0b3AoKTsKLSAgfSwKLSAgYXN5bmNFbmQ6IGZ1bmN0aW9u
KCkgewotICAgIHN0YXJ0KCk7Ci0gIH0sCi0gIGV4Y2VwdGlvbjogZnVuY3Rpb24oZXJyb3IpIHsK
LSAgICBvayhmYWxzZSwgRW1iZXIuaW5zcGVjdChlcnJvcikpOwotICB9Ci19KTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotKiBAbW9kdWxlIGVtYmVyCi0qIEBzdWJtb2R1bGUg
ZW1iZXItdGVzdGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBUZXN0ID0gRW1i
ZXIuVGVzdCwKLSAgICBoZWxwZXIgPSBUZXN0LnJlZ2lzdGVySGVscGVyLAotICAgIGFzeW5jSGVs
cGVyID0gVGVzdC5yZWdpc3RlckFzeW5jSGVscGVyLAotICAgIGNvdW50QXN5bmMgPSAwOwotCi1U
ZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSAwOwotCi1UZXN0Lm9uSW5qZWN0SGVscGVycyhmdW5j
dGlvbigpIHsKLSAgRW1iZXIuJChkb2N1bWVudCkuYWpheFN0YXJ0KGZ1bmN0aW9uKCkgewotICAg
IFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cysrOwotICB9KTsKLQotICBFbWJlci4kKGRvY3VtZW50
KS5hamF4U3RvcChmdW5jdGlvbigpIHsKLSAgICBFbWJlci5hc3NlcnQoIkFuIGFqYXhTdG9wIGV2
ZW50IHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBudW1iZXIgb2YgcGVuZGluZyBBSkFYICIgKwotICAg
ICAgICAgICAgICAgICAicmVxdWVzdHMgdG8gYmUgbmVnYXRpdmUgaGFzIGJlZW4gdHJpZ2dlcmVk
LiBUaGlzIGlzIG1vc3QgbGlrZWx5ICIgKwotICAgICAgICAgICAgICAgICAiY2F1c2VkIGJ5IEFK
QVggZXZlbnRzIHRoYXQgd2VyZSBzdGFydGVkIGJlZm9yZSBjYWxsaW5nICIgKwotICAgICAgICAg
ICAgICAgICAiYGluamVjdFRlc3RIZWxwZXJzKClgLiIsIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0
cyAhPT0gMCk7Ci0gICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzLS07Ci0gIH0pOwotfSk7Ci0K
LWZ1bmN0aW9uIGN1cnJlbnRSb3V0ZU5hbWUoYXBwKXsKLSAgdmFyIGFwcENvbnRyb2xsZXIgPSBh
cHAuX19jb250YWluZXJfXy5sb29rdXAoJ2NvbnRyb2xsZXI6YXBwbGljYXRpb24nKTsKLQotICBy
ZXR1cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdjdXJyZW50Um91dGVOYW1lJyk7Ci19Ci0KLWZ1bmN0
aW9uIGN1cnJlbnRQYXRoKGFwcCl7Ci0gIHZhciBhcHBDb250cm9sbGVyID0gYXBwLl9fY29udGFp
bmVyX18ubG9va3VwKCdjb250cm9sbGVyOmFwcGxpY2F0aW9uJyk7Ci0KLSAgcmV0dXJuIGdldChh
cHBDb250cm9sbGVyLCAnY3VycmVudFBhdGgnKTsKLX0KLQotZnVuY3Rpb24gY3VycmVudFVSTChh
cHApewotICB2YXIgcm91dGVyID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6bWFp
bicpOwotCi0gIHJldHVybiBnZXQocm91dGVyLCAnbG9jYXRpb24nKS5nZXRVUkwoKTsKLX0KLQot
ZnVuY3Rpb24gdmlzaXQoYXBwLCB1cmwpIHsKLSAgRW1iZXIucnVuKGFwcCwgJ2FkdmFuY2VSZWFk
aW5lc3MnKTsKLQotICBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJykubG9j
YXRpb24uc2V0VVJMKHVybCk7Ci0gIEVtYmVyLnJ1bihhcHAsIGFwcC5oYW5kbGVVUkwsIHVybCk7
Ci0gIHJldHVybiB3YWl0KGFwcCk7Ci19Ci0KLWZ1bmN0aW9uIGNsaWNrKGFwcCwgc2VsZWN0b3Is
IGNvbnRleHQpIHsKLSAgdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNv
bnRleHQpOwotICBFbWJlci5ydW4oJGVsLCAnbW91c2Vkb3duJyk7Ci0KLSAgaWYgKCRlbC5pcygn
OmlucHV0JykpIHsKLSAgICB2YXIgdHlwZSA9ICRlbC5wcm9wKCd0eXBlJyk7Ci0gICAgaWYgKHR5
cGUgIT09ICdjaGVja2JveCcgJiYgdHlwZSAhPT0gJ3JhZGlvJyAmJiB0eXBlICE9PSAnaGlkZGVu
JykgewotICAgICAgRW1iZXIucnVuKCRlbCwgZnVuY3Rpb24oKXsKLSAgICAgICAgLy8gRmlyZWZv
eCBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBgZm9jdXNpbmAgZXZlbnQgaWYgdGhlIHdpbmRvdwotICAg
ICAgICAvLyBkb2VzIG5vdCBoYXZlIGZvY3VzLiBJZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBoYXZl
IGZvY3VzIGp1c3QKLSAgICAgICAgLy8gdXNlIHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgot
ICAgICAgICBpZiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpIHsK
LSAgICAgICAgICB0aGlzLmZvY3VzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhp
cy50cmlnZ2VyKCdmb2N1c2luJyk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQot
Ci0gIEVtYmVyLnJ1bigkZWwsICdtb3VzZXVwJyk7Ci0gIEVtYmVyLnJ1bigkZWwsICdjbGljaycp
OwotCi0gIHJldHVybiB3YWl0KGFwcCk7Ci19Ci0KLWZ1bmN0aW9uIHRyaWdnZXJFdmVudChhcHAs
IHNlbGVjdG9yLCBjb250ZXh0LCBldmVudCl7Ci0gIGlmICh0eXBlb2YgbWV0aG9kID09PSAndW5k
ZWZpbmVkJykgewotICAgIGV2ZW50ID0gY29udGV4dDsKLSAgICBjb250ZXh0ID0gbnVsbDsKLSAg
fQotCi0gIHZhciAkZWwgPSBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsK
LQotICBFbWJlci5ydW4oJGVsLCAndHJpZ2dlcicsIGV2ZW50KTsKLQotICByZXR1cm4gd2FpdChh
cHApOwotfQotCi1mdW5jdGlvbiBrZXlFdmVudChhcHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0eXBl
LCBrZXlDb2RlKSB7Ci0gIHZhciAkZWw7Ci0gIGlmICh0eXBlb2Yga2V5Q29kZSA9PT0gJ3VuZGVm
aW5lZCcpIHsKLSAgICBrZXlDb2RlID0gdHlwZTsKLSAgICB0eXBlID0gY29udGV4dDsKLSAgICBj
b250ZXh0ID0gbnVsbDsKLSAgfQotICAkZWwgPSBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9y
LCBjb250ZXh0KTsKLSAgdmFyIGV2ZW50ID0gRW1iZXIuJC5FdmVudCh0eXBlLCB7IGtleUNvZGU6
IGtleUNvZGUgfSk7Ci0gIEVtYmVyLnJ1bigkZWwsICd0cmlnZ2VyJywgZXZlbnQpOwotICByZXR1
cm4gd2FpdChhcHApOwotfQotCi1mdW5jdGlvbiBmaWxsSW4oYXBwLCBzZWxlY3RvciwgY29udGV4
dCwgdGV4dCkgewotICB2YXIgJGVsOwotICBpZiAodHlwZW9mIHRleHQgPT09ICd1bmRlZmluZWQn
KSB7Ci0gICAgdGV4dCA9IGNvbnRleHQ7Ci0gICAgY29udGV4dCA9IG51bGw7Ci0gIH0KLSAgJGVs
ID0gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3RvciwgY29udGV4dCk7Ci0gIEVtYmVyLnJ1bihm
dW5jdGlvbigpIHsKLSAgICAkZWwudmFsKHRleHQpLmNoYW5nZSgpOwotICB9KTsKLSAgcmV0dXJu
IHdhaXQoYXBwKTsKLX0KLQotZnVuY3Rpb24gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3Rvciwg
Y29udGV4dCkgewotICB2YXIgJGVsID0gZmluZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLSAg
aWYgKCRlbC5sZW5ndGggPT09IDApIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVsZW1l
bnQgIiArIHNlbGVjdG9yICsgIiBub3QgZm91bmQuIik7Ci0gIH0KLSAgcmV0dXJuICRlbDsKLX0K
LQotZnVuY3Rpb24gZmluZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7Ci0gIHZhciAkZWw7Ci0g
IGNvbnRleHQgPSBjb250ZXh0IHx8IGdldChhcHAsICdyb290RWxlbWVudCcpOwotICAkZWwgPSBh
cHAuJChzZWxlY3RvciwgY29udGV4dCk7Ci0KLSAgcmV0dXJuICRlbDsKLX0KLQotZnVuY3Rpb24g
YW5kVGhlbihhcHAsIGNhbGxiYWNrKSB7Ci0gIHJldHVybiB3YWl0KGFwcCwgY2FsbGJhY2soYXBw
KSk7Ci19Ci0KLWZ1bmN0aW9uIHdhaXQoYXBwLCB2YWx1ZSkgewotICByZXR1cm4gVGVzdC5wcm9t
aXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKLSAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhc3lu
YyBwcm9taXNlLCBraWNrIG9mZiB0aGUgYXN5bmMgdGVzdAotICAgIGlmICgrK2NvdW50QXN5bmMg
PT09IDEpIHsKLSAgICAgIFRlc3QuYWRhcHRlci5hc3luY1N0YXJ0KCk7Ci0gICAgfQotCi0gICAg
Ly8gRXZlcnkgMTBtcywgcG9sbCBmb3IgdGhlIGFzeW5jIHRoaW5nIHRvIGhhdmUgZmluaXNoZWQK
LSAgICB2YXIgd2F0Y2hlciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewotICAgICAgLy8gMS4g
SWYgdGhlIHJvdXRlciBpcyBsb2FkaW5nLCBrZWVwIHBvbGxpbmcKLSAgICAgIHZhciByb3V0ZXJJ
c0xvYWRpbmcgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJykucm91dGVy
LmlzTG9hZGluZzsKLSAgICAgIGlmIChyb3V0ZXJJc0xvYWRpbmcpIHsgcmV0dXJuOyB9Ci0KLSAg
ICAgIC8vIDIuIElmIHRoZXJlIGFyZSBwZW5kaW5nIEFqYXggcmVxdWVzdHMsIGtlZXAgcG9sbGlu
ZwotICAgICAgaWYgKFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cykgeyByZXR1cm47IH0KLQotICAg
ICAgLy8gMy4gSWYgdGhlcmUgYXJlIHNjaGVkdWxlZCB0aW1lcnMgb3Igd2UgYXJlIGluc2lkZSBv
ZiBhIHJ1biBsb29wLCBrZWVwIHBvbGxpbmcKLSAgICAgIGlmIChFbWJlci5ydW4uaGFzU2NoZWR1
bGVkVGltZXJzKCkgfHwgRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wKSB7IHJldHVybjsgfQotICAg
ICAgaWYgKFRlc3Qud2FpdGVycyAmJiBUZXN0LndhaXRlcnMuYW55KGZ1bmN0aW9uKHdhaXRlcikg
ewotICAgICAgICB2YXIgY29udGV4dCA9IHdhaXRlclswXTsKLSAgICAgICAgdmFyIGNhbGxiYWNr
ID0gd2FpdGVyWzFdOwotICAgICAgICByZXR1cm4gIWNhbGxiYWNrLmNhbGwoY29udGV4dCk7Ci0g
ICAgICB9KSkgeyByZXR1cm47IH0KLSAgICAgIC8vIFN0b3AgcG9sbGluZwotICAgICAgY2xlYXJJ
bnRlcnZhbCh3YXRjaGVyKTsKLQotICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBhc3luYyBw
cm9taXNlLCBlbmQgdGhlIGFzeW5jIHRlc3QKLSAgICAgIGlmICgtLWNvdW50QXN5bmMgPT09IDAp
IHsKLSAgICAgICAgVGVzdC5hZGFwdGVyLmFzeW5jRW5kKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8v
IFN5bmNocm9ub3VzbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZQotICAgICAgRW1iZXIucnVuKG51bGws
IHJlc29sdmUsIHZhbHVlKTsKLSAgICB9LCAxMCk7Ci0gIH0pOwotCi19Ci0KLQotLyoqCi0qIExv
YWRzIGEgcm91dGUsIHNldHMgdXAgYW55IGNvbnRyb2xsZXJzLCBhbmQgcmVuZGVycyBhbnkgdGVt
cGxhdGVzIGFzc29jaWF0ZWQKLSogd2l0aCB0aGUgcm91dGUgYXMgdGhvdWdoIGEgcmVhbCB1c2Vy
IGhhZCB0cmlnZ2VyZWQgdGhlIHJvdXRlIGNoYW5nZSB3aGlsZQotKiB1c2luZyB5b3VyIGFwcC4K
LSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2YXNjcmlwdAotKiB2aXNpdCgncG9zdHMvaW5kZXgn
KS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBg
YAotKgotKiBAbWV0aG9kIHZpc2l0Ci0qIEBwYXJhbSB7U3RyaW5nfSB1cmwgdGhlIG5hbWUgb2Yg
dGhlIHJvdXRlCi0qIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hlbHBlcigndmlz
aXQnLCB2aXNpdCk7Ci0KLS8qKgotKiBDbGlja3MgYW4gZWxlbWVudCBhbmQgdHJpZ2dlcnMgYW55
IGFjdGlvbnMgdHJpZ2dlcmVkIGJ5IHRoZSBlbGVtZW50J3MgYGNsaWNrYAotKiBldmVudC4KLSoK
LSogRXhhbXBsZToKLSoKLSogYGBgamF2YXNjcmlwdAotKiBjbGljaygnLnNvbWUtalF1ZXJ5LXNl
bGVjdG9yJykudGhlbihmdW5jdGlvbigpIHsKLSogIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7
Ci0qIGBgYAotKgotKiBAbWV0aG9kIGNsaWNrCi0qIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBq
UXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCi0qIEByZXR1cm4g
e1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hlbHBlcignY2xpY2snLCBjbGljayk7Ci0KLS8qKgot
KiBTaW11bGF0ZXMgYSBrZXkgZXZlbnQsIGUuZy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBga2V5
dXBgIHdpdGggdGhlIGRlc2lyZWQga2V5Q29kZQotKgotKiBFeGFtcGxlOgotKgotKiBgYGBqYXZh
c2NyaXB0Ci0qIGtleUV2ZW50KCcuc29tZS1qUXVlcnktc2VsZWN0b3InLCAna2V5cHJlc3MnLCAx
MykudGhlbihmdW5jdGlvbigpIHsKLSogIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBg
YAotKgotKiBAbWV0aG9kIGtleUV2ZW50Ci0qIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVl
cnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCi0qIEBwYXJhbSB7U3Ry
aW5nfSB0aGUgdHlwZSBvZiBrZXkgZXZlbnQsIGUuZy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBg
a2V5dXBgCi0qIEBwYXJhbSB7TnVtYmVyfSB0aGUga2V5Q29kZSBvZiB0aGUgc2ltdWxhdGVkIGtl
eSBldmVudAotKiBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Ci0qLwotYXN5bmNIZWxwZXIoJ2tleUV2
ZW50Jywga2V5RXZlbnQpOwotCi0vKioKLSogRmlsbHMgaW4gYW4gaW5wdXQgZWxlbWVudCB3aXRo
IHNvbWUgdGV4dC4KLSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2YXNjcmlwdAotKiBmaWxsSW4o
JyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20nKS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8vIGFz
c2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGZpbGxJbgotKiBAcGFy
YW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5IHNlbGVjdG9yIGZpbmRpbmcgYW4gaW5wdXQgZWxl
bWVudCBvbiB0aGUgRE9NCi0qIHRvIGZpbGwgdGV4dCB3aXRoCi0qIEBwYXJhbSB7U3RyaW5nfSB0
ZXh0IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRoZSBpbnB1dCBlbGVtZW50Ci0qIEByZXR1cm4ge1JT
VlAuUHJvbWlzZX0KLSovCi1hc3luY0hlbHBlcignZmlsbEluJywgZmlsbEluKTsKLQotLyoqCi0q
IEZpbmRzIGFuIGVsZW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFwcCdzIGNvbnRhaW5lciBl
bGVtZW50LiBBIHNpbXBsZSBhbGlhcwotKiBmb3IgYGFwcC4kKHNlbGVjdG9yKWAuCi0qCi0qIEV4
YW1wbGU6Ci0qCi0qIGBgYGphdmFzY3JpcHQKLSogdmFyICRlbCA9IGZpbmQoJy5teS1zZWxlY3Rv
cik7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGZpbmQKLSogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9y
IGpRdWVyeSBzdHJpbmcgc2VsZWN0b3IgZm9yIGVsZW1lbnQgbG9va3VwCi0qIEByZXR1cm4ge09i
amVjdH0galF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5
Ci0qLwotaGVscGVyKCdmaW5kJywgZmluZCk7Ci0KLS8qKgotKiBMaWtlIGBmaW5kYCwgYnV0IHRo
cm93cyBhbiBlcnJvciBpZiB0aGUgZWxlbWVudCBzZWxlY3RvciByZXR1cm5zIG5vIHJlc3VsdHMu
Ci0qCi0qIEV4YW1wbGU6Ci0qCi0qIGBgYGphdmFzY3JpcHQKLSogdmFyICRlbCA9IGZpbmRXaXRo
QXNzZXJ0KCcuZG9lc250LWV4aXN0Jyk7IC8vIHRocm93cyBlcnJvcgotKiBgYGAKLSoKLSogQG1l
dGhvZCBmaW5kV2l0aEFzc2VydAotKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5IHNl
bGVjdG9yIHN0cmluZyBmb3IgZmluZGluZyBhbiBlbGVtZW50IHdpdGhpbgotKiB0aGUgRE9NCi0q
IEByZXR1cm4ge09iamVjdH0galF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdHMg
b2YgdGhlIHF1ZXJ5Ci0qIEB0aHJvd3Mge0Vycm9yfSB0aHJvd3MgZXJyb3IgaWYgalF1ZXJ5IG9i
amVjdCByZXR1cm5lZCBoYXMgYSBsZW5ndGggb2YgMAotKi8KLWhlbHBlcignZmluZFdpdGhBc3Nl
cnQnLCBmaW5kV2l0aEFzc2VydCk7Ci0KLS8qKgotICBDYXVzZXMgdGhlIHJ1biBsb29wIHRvIHBy
b2Nlc3MgYW55IHBlbmRpbmcgZXZlbnRzLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLSAg
YW55IGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBvdGhlciBoZWxwZXJzIChvciB5b3VyIGFzc2VydGlv
bnMpIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0KLSAgVGhpcyBpcyBtb3N0IG9mdGVuIHVzZWQgYXMg
dGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGhlbHBlciBmdW5jdGlvbnMgKHNlZSAnY2xpY2snLAot
ICAnZmlsbEluJywndmlzaXQnLGV0YykuCi0KLSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLlRlc3QucmVnaXN0ZXJBc3luY0hlbHBlcignbG9naW5Vc2VyJywgZnVuY3Rpb24o
YXBwLCB1c2VybmFtZSwgcGFzc3dvcmQpIHsKLSAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUn
KQotICAgIC5maWxsSW4oJyN1c2VybmFtZScsIHVzZXJuYW1lKQotICAgIC5maWxsSW4oJyNwYXNz
d29yZCcsIHVzZXJuYW1lKQotICAgIC5jbGljaygnLnN1Ym1pdCcpCi0KLSAgICByZXR1cm4gd2Fp
dCgpOwotICB9KTsKLQotICBAbWV0aG9kIHdhaXQKLSAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRo
ZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KLSAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQotKi8KLWFz
eW5jSGVscGVyKCd3YWl0Jywgd2FpdCk7Ci1hc3luY0hlbHBlcignYW5kVGhlbicsIGFuZFRoZW4p
OwotCi0KLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEVtYmVyIFRlc3Rp
bmcKLQotICBAbW9kdWxlIGVtYmVyCi0gIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZwotICBAcmVx
dWlyZXMgZW1iZXItYXBwbGljYXRpb24KLSovCi0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8q
KgotRW1iZXIKLQotQG1vZHVsZSBlbWJlcgotKi8KLQotZnVuY3Rpb24gdGhyb3dXaXRoTWVzc2Fn
ZShtc2cpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJv
cihtc2cpOwotICB9OwotfQotCi1mdW5jdGlvbiBnZW5lcmF0ZVJlbW92ZWRDbGFzcyhjbGFzc05h
bWUpIHsKLSAgdmFyIG1zZyA9ICIgaGFzIGJlZW4gbW92ZWQgaW50byBhIHBsdWdpbjogaHR0cHM6
Ly9naXRodWIuY29tL2VtYmVyanMvZW1iZXItc3RhdGVzIjsKLQotICByZXR1cm4gewotICAgIGV4
dGVuZDogdGhyb3dXaXRoTWVzc2FnZShjbGFzc05hbWUgKyBtc2cpLAotICAgIGNyZWF0ZTogdGhy
b3dXaXRoTWVzc2FnZShjbGFzc05hbWUgKyBtc2cpCi0gIH07Ci19Ci0KLUVtYmVyLlN0YXRlTWFu
YWdlciA9IGdlbmVyYXRlUmVtb3ZlZENsYXNzKCJFbWJlci5TdGF0ZU1hbmFnZXIiKTsKLQotLyoq
Ci0gIFRoaXMgd2FzIGV4cG9ydGVkIHRvIGVtYmVyLXN0YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAg
cmVsZWFzZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAg
Ci0gIEBjbGFzcyBTdGF0ZU1hbmFnZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLQotRW1iZXIu
U3RhdGUgPSBnZW5lcmF0ZVJlbW92ZWRDbGFzcygiRW1iZXIuU3RhdGUiKTsKLQotLyoqCi0gIFRo
aXMgd2FzIGV4cG9ydGVkIHRvIGVtYmVyLXN0YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAgcmVsZWFz
ZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAgCi0gIEBj
bGFzcyBTdGF0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwotCi19KSgpOwotCi0KLX0pKCk7CmRp
ZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFy
cy9oYW5kbGViYXJzLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hh
bmRsZWJhcnMvaGFuZGxlYmFycy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Zh
MjUxMDMzYjRjZGYzNTMwYjM4ZTdjZjhkZDg4OTEwNzRkMjIzNi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2Nv
bXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjc0
NiArMCwwIEBACi0vKiEKLQotIGhhbmRsZWJhcnMgdjEuMy4wCi0KLUNvcHlyaWdodCAoQykgMjAx
MSBieSBZZWh1ZGEgS2F0egotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m
IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJl
IGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8g
ZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo
b3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBw
dWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRo
ZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlz
Ci1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
OgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj
ZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9u
cyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX
SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJ
TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK
LUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFC
TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElO
IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwK
LU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Ig
T1RIRVIgREVBTElOR1MgSU4KLVRIRSBTT0ZUV0FSRS4KLQotQGxpY2Vuc2UKLSovCi0vKiBleHBv
cnRlZCBIYW5kbGViYXJzICovCi12YXIgSGFuZGxlYmFycyA9IChmdW5jdGlvbigpIHsKLS8vIGhh
bmRsZWJhcnMvc2FmZS1zdHJpbmcuanMKLXZhciBfX21vZHVsZTRfXyA9IChmdW5jdGlvbigpIHsK
LSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIC8vIEJ1aWxkIG91dCBvdXIg
YmFzaWMgU2FmZVN0cmluZyB0eXBlCi0gIGZ1bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7Ci0g
ICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0gIH0KLQotICBTYWZlU3RyaW5nLnByb3RvdHlwZS50
b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiAiIiArIHRoaXMuc3RyaW5nOwotICB9
OwotCi0gIF9fZXhwb3J0c19fID0gU2FmZVN0cmluZzsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwot
fSkoKTsKLQotLy8gaGFuZGxlYmFycy91dGlscy5qcwotdmFyIF9fbW9kdWxlM19fID0gKGZ1bmN0
aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAidXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNf
XyA9IHt9OwotICAvKmpzaGludCAtVzAwNCAqLwotICB2YXIgU2FmZVN0cmluZyA9IF9fZGVwZW5k
ZW5jeTFfXzsKLQotICB2YXIgZXNjYXBlID0gewotICAgICImIjogIiZhbXA7IiwKLSAgICAiPCI6
ICImbHQ7IiwKLSAgICAiPiI6ICImZ3Q7IiwKLSAgICAnIic6ICImcXVvdDsiLAotICAgICInIjog
IiYjeDI3OyIsCi0gICAgImAiOiAiJiN4NjA7IgotICB9OwotCi0gIHZhciBiYWRDaGFycyA9IC9b
Jjw+IidgXS9nOwotICB2YXIgcG9zc2libGUgPSAvWyY8PiInYF0vOwotCi0gIGZ1bmN0aW9uIGVz
Y2FwZUNoYXIoY2hyKSB7Ci0gICAgcmV0dXJuIGVzY2FwZVtjaHJdIHx8ICImYW1wOyI7Ci0gIH0K
LQotICBmdW5jdGlvbiBleHRlbmQob2JqLCB2YWx1ZSkgewotICAgIGZvcih2YXIga2V5IGluIHZh
bHVlKSB7Ci0gICAgICBpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFs
dWUsIGtleSkpIHsKLSAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVtrZXldOwotICAgICAgfQotICAg
IH0KLSAgfQotCi0gIF9fZXhwb3J0c19fLmV4dGVuZCA9IGV4dGVuZDt2YXIgdG9TdHJpbmcgPSBP
YmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwotICBfX2V4cG9ydHNfXy50b1N0cmluZyA9IHRvU3Ry
aW5nOwotICAvLyBTb3VyY2VkIGZyb20gbG9kYXNoCi0gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9i
ZXN0aWVqcy9sb2Rhc2gvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKLSAgdmFyIGlzRnVuY3Rpb24g
PSBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlv
bic7Ci0gIH07Ci0gIC8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5k
IFNhZmFyaQotICBpZiAoaXNGdW5jdGlvbigveC8pKSB7Ci0gICAgaXNGdW5jdGlvbiA9IGZ1bmN0
aW9uKHZhbHVlKSB7Ci0gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYm
IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwotICAgIH07Ci0g
IH0KLSAgdmFyIGlzRnVuY3Rpb247Ci0gIF9fZXhwb3J0c19fLmlzRnVuY3Rpb24gPSBpc0Z1bmN0
aW9uOwotICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24odmFsdWUpIHsK
LSAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJp
bmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTsKLSAgfTsKLSAgX19l
eHBvcnRzX18uaXNBcnJheSA9IGlzQXJyYXk7Ci0KLSAgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lv
bihzdHJpbmcpIHsKLSAgICAvLyBkb24ndCBlc2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkn
cmUgYWxyZWFkeSBzYWZlCi0gICAgaWYgKHN0cmluZyBpbnN0YW5jZW9mIFNhZmVTdHJpbmcpIHsK
LSAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJpbmcg
JiYgc3RyaW5nICE9PSAwKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLy8gRm9y
Y2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5k
IHJlZ2FyZGxlc3MgYW5kCi0gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5z
cGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmCi0gICAgLy8gYW4g
b2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuCi0gICAgc3Ry
aW5nID0gIiIgKyBzdHJpbmc7Ci0KLSAgICBpZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJl
dHVybiBzdHJpbmc7IH0KLSAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoYmFkQ2hhcnMsIGVzY2Fw
ZUNoYXIpOwotICB9Ci0KLSAgX19leHBvcnRzX18uZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4
cHJlc3Npb247ZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewotICAgIGlmICghdmFsdWUgJiYgdmFs
dWUgIT09IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2
YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIF9fZXhwb3J0c19f
LmlzRW1wdHkgPSBpc0VtcHR5OwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTRf
Xyk7Ci0KLS8vIGhhbmRsZWJhcnMvZXhjZXB0aW9uLmpzCi12YXIgX19tb2R1bGU1X18gPSAoZnVu
Y3Rpb24oKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fOwotCi0gIHZhciBl
cnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21l
c3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTsKLQotICBmdW5jdGlvbiBFeGNlcHRp
b24obWVzc2FnZSwgbm9kZSkgewotICAgIHZhciBsaW5lOwotICAgIGlmIChub2RlICYmIG5vZGUu
Zmlyc3RMaW5lKSB7Ci0gICAgICBsaW5lID0gbm9kZS5maXJzdExpbmU7Ci0KLSAgICAgIG1lc3Nh
Z2UgKz0gJyAtICcgKyBsaW5lICsgJzonICsgbm9kZS5maXJzdENvbHVtbjsKLSAgICB9Ci0KLSAg
ICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2Fn
ZSk7Ci0KLSAgICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4g
Q2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay4KLSAg
ICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsKLSAg
ICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dOwotICAgIH0K
LQotICAgIGlmIChsaW5lKSB7Ci0gICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lOwotICAgICAg
dGhpcy5jb2x1bW4gPSBub2RlLmZpcnN0Q29sdW1uOwotICAgIH0KLSAgfQotCi0gIEV4Y2VwdGlv
bi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKLQotICBfX2V4cG9ydHNfXyA9IEV4Y2VwdGlvbjsK
LSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoKTsKLQotLy8gaGFuZGxlYmFycy9iYXNlLmpzCi12
YXIgX19tb2R1bGUyX18gPSAoZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3ky
X18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX18gPSB7fTsKLSAgdmFyIFV0
aWxzID0gX19kZXBlbmRlbmN5MV9fOwotICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5Ml9f
OwotCi0gIHZhciBWRVJTSU9OID0gIjEuMy4wIjsKLSAgX19leHBvcnRzX18uVkVSU0lPTiA9IFZF
UlNJT047dmFyIENPTVBJTEVSX1JFVklTSU9OID0gNDsKLSAgX19leHBvcnRzX18uQ09NUElMRVJf
UkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lPTjsKLSAgdmFyIFJFVklTSU9OX0NIQU5HRVMgPSB7
Ci0gICAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQg
ZG9lc24ndCByZXBvcnQgaXQKLSAgICAyOiAnPT0gMS4wLjAtcmMuMycsCi0gICAgMzogJz09IDEu
MC4wLXJjLjQnLAotICAgIDQ6ICc+PSAxLjAuMCcKLSAgfTsKLSAgX19leHBvcnRzX18uUkVWSVNJ
T05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7Ci0gIHZhciBpc0FycmF5ID0gVXRpbHMuaXNB
cnJheSwKLSAgICAgIGlzRnVuY3Rpb24gPSBVdGlscy5pc0Z1bmN0aW9uLAotICAgICAgdG9TdHJp
bmcgPSBVdGlscy50b1N0cmluZywKLSAgICAgIG9iamVjdFR5cGUgPSAnW29iamVjdCBPYmplY3Rd
JzsKLQotICBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMp
IHsKLSAgICB0aGlzLmhlbHBlcnMgPSBoZWxwZXJzIHx8IHt9OwotICAgIHRoaXMucGFydGlhbHMg
PSBwYXJ0aWFscyB8fCB7fTsKLQotICAgIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7Ci0g
IH0KLQotICBfX2V4cG9ydHNfXy5IYW5kbGViYXJzRW52aXJvbm1lbnQgPSBIYW5kbGViYXJzRW52
aXJvbm1lbnQ7SGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHsKLSAgICBjb25zdHJ1
Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50LAotCi0gICAgbG9nZ2VyOiBsb2dnZXIsCi0gICAg
bG9nOiBsb2csCi0KLSAgICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4sIGludmVy
c2UpIHsKLSAgICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7Ci0g
ICAgICAgIGlmIChpbnZlcnNlIHx8IGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qg
c3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9Ci0gICAgICAgIFV0aWxzLmV4dGVu
ZCh0aGlzLmhlbHBlcnMsIG5hbWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGludmVy
c2UpIHsgZm4ubm90ID0gaW52ZXJzZTsgfQotICAgICAgICB0aGlzLmhlbHBlcnNbbmFtZV0gPSBm
bjsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1l
LCBzdHIpIHsKLSAgICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7
Ci0gICAgICAgIFV0aWxzLmV4dGVuZCh0aGlzLnBhcnRpYWxzLCAgbmFtZSk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICB0aGlzLnBhcnRpYWxzW25hbWVdID0gc3RyOwotICAgICAgfQotICAgIH0K
LSAgfTsKLQotICBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7Ci0g
ICAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihhcmcp
IHsKLSAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgICAgcmV0dXJuIHVu
ZGVmaW5lZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk1p
c3NpbmcgaGVscGVyOiAnIiArIGFyZyArICInIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBp
bnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxvY2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24oY29u
dGV4dCwgb3B0aW9ucykgewotICAgICAgdmFyIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UgfHwg
ZnVuY3Rpb24oKSB7fSwgZm4gPSBvcHRpb25zLmZuOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihj
b250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmKGNv
bnRleHQgPT09IHRydWUpIHsKLSAgICAgICAgcmV0dXJuIGZuKHRoaXMpOwotICAgICAgfSBlbHNl
IGlmKGNvbnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICByZXR1
cm4gaW52ZXJzZSh0aGlzKTsKLSAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkgewot
ICAgICAgICBpZihjb250ZXh0Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICByZXR1cm4gaW5zdGFu
Y2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2Ugewot
ICAgICAgICByZXR1cm4gZm4oY29udGV4dCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpbnN0
YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsK
LSAgICAgIHZhciBmbiA9IG9wdGlvbnMuZm4sIGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0g
ICAgICB2YXIgaSA9IDAsIHJldCA9ICIiLCBkYXRhOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihj
b250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmIChv
cHRpb25zLmRhdGEpIHsKLSAgICAgICAgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7
Ci0gICAgICB9Ci0KLSAgICAgIGlmKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmpl
Y3QnKSB7Ci0gICAgICAgIGlmIChpc0FycmF5KGNvbnRleHQpKSB7Ci0gICAgICAgICAgZm9yKHZh
ciBqID0gY29udGV4dC5sZW5ndGg7IGk8ajsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YSkg
ewotICAgICAgICAgICAgICBkYXRhLmluZGV4ID0gaTsKLSAgICAgICAgICAgICAgZGF0YS5maXJz
dCA9IChpID09PSAwKTsKLSAgICAgICAgICAgICAgZGF0YS5sYXN0ICA9IChpID09PSAoY29udGV4
dC5sZW5ndGgtMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gcmV0ICsgZm4o
Y29udGV4dFtpXSwgeyBkYXRhOiBkYXRhIH0pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICBmb3IodmFyIGtleSBpbiBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZihj
b250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAgICAgICAgICAgaWYoZGF0YSkgeyAK
LSAgICAgICAgICAgICAgICBkYXRhLmtleSA9IGtleTsgCi0gICAgICAgICAgICAgICAgZGF0YS5p
bmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgZGF0YS5maXJzdCA9IChpID09PSAwKTsKLSAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICByZXQgPSByZXQgKyBmbihjb250ZXh0W2tleV0sIHtk
YXRhOiBkYXRhfSk7Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoaSA9PT0gMCl7Ci0gICAgICAgIHJl
dCA9IGludmVyc2UodGhpcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfSk7
Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25h
bCwgb3B0aW9ucykgewotICAgICAgaWYgKGlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7IGNvbmRp
dGlvbmFsID0gY29uZGl0aW9uYWwuY2FsbCh0aGlzKTsgfQotCi0gICAgICAvLyBEZWZhdWx0IGJl
aGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1
dGh5IGFuZCBub3QgZW1wdHkuCi0gICAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5
IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2Vk
IG9uIHRoZQotICAgICAgLy8gYmVoYXZpb3Igb2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBk
ZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBieSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2
ZS4KLSAgICAgIGlmICgoIW9wdGlvbnMuaGFzaC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwp
IHx8IFV0aWxzLmlzRW1wdHkoY29uZGl0aW9uYWwpKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25z
LmludmVyc2UodGhpcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5m
bih0aGlzKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVy
KCd1bmxlc3MnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykgewotICAgICAgcmV0dXJu
IGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRp
b25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pOwot
ICAgIH0pOwotCi0gICAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihj
b250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250
ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmICghVXRpbHMuaXNFbXB0eShj
b250ZXh0KSkgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7Ci0gICAgfSk7Ci0KLSAgICBpbnN0
YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewot
ICAgICAgdmFyIGxldmVsID0gb3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBu
dWxsID8gcGFyc2VJbnQob3B0aW9ucy5kYXRhLmxldmVsLCAxMCkgOiAxOwotICAgICAgaW5zdGFu
Y2UubG9nKGxldmVsLCBjb250ZXh0KTsKLSAgICB9KTsKLSAgfQotCi0gIHZhciBsb2dnZXIgPSB7
Ci0gICAgbWV0aG9kTWFwOiB7IDA6ICdkZWJ1ZycsIDE6ICdpbmZvJywgMjogJ3dhcm4nLCAzOiAn
ZXJyb3InIH0sCi0KLSAgICAvLyBTdGF0ZSBlbnVtCi0gICAgREVCVUc6IDAsCi0gICAgSU5GTzog
MSwKLSAgICBXQVJOOiAyLAotICAgIEVSUk9SOiAzLAotICAgIGxldmVsOiAzLAotCi0gICAgLy8g
Y2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQKLSAgICBsb2c6IGZ1bmN0
aW9uKGxldmVsLCBvYmopIHsKLSAgICAgIGlmIChsb2dnZXIubGV2ZWwgPD0gbGV2ZWwpIHsKLSAg
ICAgICAgdmFyIG1ldGhvZCA9IGxvZ2dlci5tZXRob2RNYXBbbGV2ZWxdOwotICAgICAgICBpZiAo
dHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGVbbWV0aG9kXSkgewotICAg
ICAgICAgIGNvbnNvbGVbbWV0aG9kXS5jYWxsKGNvbnNvbGUsIG9iaik7Ci0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9Ci0gIH07Ci0gIF9fZXhwb3J0c19fLmxvZ2dlciA9IGxvZ2dlcjsKLSAgZnVu
Y3Rpb24gbG9nKGxldmVsLCBvYmopIHsgbG9nZ2VyLmxvZyhsZXZlbCwgb2JqKTsgfQotCi0gIF9f
ZXhwb3J0c19fLmxvZyA9IGxvZzt2YXIgY3JlYXRlRnJhbWUgPSBmdW5jdGlvbihvYmplY3QpIHsK
LSAgICB2YXIgb2JqID0ge307Ci0gICAgVXRpbHMuZXh0ZW5kKG9iaiwgb2JqZWN0KTsKLSAgICBy
ZXR1cm4gb2JqOwotICB9OwotICBfX2V4cG9ydHNfXy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1l
OwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTNfXywgX19tb2R1bGU1X18pOwot
Ci0vLyBoYW5kbGViYXJzL3J1bnRpbWUuanMKLXZhciBfX21vZHVsZTZfXyA9IChmdW5jdGlvbihf
X2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fKSB7Ci0gICJ1
c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fID0ge307Ci0gIHZhciBVdGlscyA9IF9fZGVw
ZW5kZW5jeTFfXzsKLSAgdmFyIEV4Y2VwdGlvbiA9IF9fZGVwZW5kZW5jeTJfXzsKLSAgdmFyIENP
TVBJTEVSX1JFVklTSU9OID0gX19kZXBlbmRlbmN5M19fLkNPTVBJTEVSX1JFVklTSU9OOwotICB2
YXIgUkVWSVNJT05fQ0hBTkdFUyA9IF9fZGVwZW5kZW5jeTNfXy5SRVZJU0lPTl9DSEFOR0VTOwot
Ci0gIGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7Ci0gICAgdmFyIGNvbXBp
bGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsCi0gICAg
ICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OOwotCi0gICAgaWYgKGNvbXBp
bGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZpc2lvbikgewotICAgICAgaWYgKGNvbXBpbGVyUmV2
aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsKLSAgICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9
IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSwKLSAgICAgICAgICAgIGNvbXBpbGVy
VmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dOwotICAgICAgICB0
aHJvdyBuZXcgRXhjZXB0aW9uKCJUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRl
ciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAiKwotICAg
ICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVy
c2lvbiAoIitydW50aW1lVmVyc2lvbnMrIikgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBh
biBvbGRlciB2ZXJzaW9uICgiK2NvbXBpbGVyVmVyc2lvbnMrIikuIik7Ci0gICAgICB9IGVsc2Ug
ewotICAgICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVu
dGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXQKLSAgICAgICAgdGhyb3cg
bmV3IEV4Y2VwdGlvbigiVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJz
aW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAg
ICAgICAiUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2Nv
bXBpbGVySW5mb1sxXSsiKS4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNf
Xy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZpc2lvbjsvLyBUT0RPOiBSZW1vdmUgdGhpcyBsaW5l
IGFuZCBicmVhayB1cCBjb21waWxlUGFydGlhbAotCi0gIGZ1bmN0aW9uIHRlbXBsYXRlKHRlbXBs
YXRlU3BlYywgZW52KSB7Ci0gICAgaWYgKCFlbnYpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRp
b24oIk5vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZSIpOwotICAgIH0KLQotICAgIC8v
IE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZl
cmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93Ci0gICAgLy8gZm9yIGV4dGVy
bmFsIHVzZXJzIHRvIG92ZXJyaWRlIHRoZXNlIGFzIHBzZXVkby1zdXBwb3J0ZWQgQVBJcy4KLSAg
ICB2YXIgaW52b2tlUGFydGlhbFdyYXBwZXIgPSBmdW5jdGlvbihwYXJ0aWFsLCBuYW1lLCBjb250
ZXh0LCBoZWxwZXJzLCBwYXJ0aWFscywgZGF0YSkgewotICAgICAgdmFyIHJlc3VsdCA9IGVudi5W
TS5pbnZva2VQYXJ0aWFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgICBpZiAocmVzdWx0
ICE9IG51bGwpIHsgcmV0dXJuIHJlc3VsdDsgfQotCi0gICAgICBpZiAoZW52LmNvbXBpbGUpIHsK
LSAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGhlbHBlcnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0
aWFscywgZGF0YTogZGF0YSB9OwotICAgICAgICBwYXJ0aWFsc1tuYW1lXSA9IGVudi5jb21waWxl
KHBhcnRpYWwsIHsgZGF0YTogZGF0YSAhPT0gdW5kZWZpbmVkIH0sIGVudik7Ci0gICAgICAgIHJl
dHVybiBwYXJ0aWFsc1tuYW1lXShjb250ZXh0LCBvcHRpb25zKTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1lICsgIiBjb3Vs
ZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlIik7Ci0g
ICAgICB9Ci0gICAgfTsKLQotICAgIC8vIEp1c3QgYWRkIHdhdGVyCi0gICAgdmFyIGNvbnRhaW5l
ciA9IHsKLSAgICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCi0g
ICAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0aWFsV3JhcHBlciwKLSAgICAgIHByb2dyYW1z
OiBbXSwKLSAgICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGZuLCBkYXRhKSB7Ci0gICAgICAgIHZh
ciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV07Ci0gICAgICAgIGlmKGRhdGEpIHsK
LSAgICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHByb2dyYW0oaSwgZm4sIGRhdGEpOwotICAgICAg
ICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikgewotICAgICAgICAgIHByb2dyYW1XcmFwcGVy
ID0gdGhpcy5wcm9ncmFtc1tpXSA9IHByb2dyYW0oaSwgZm4pOwotICAgICAgICB9Ci0gICAgICAg
IHJldHVybiBwcm9ncmFtV3JhcHBlcjsKLSAgICAgIH0sCi0gICAgICBtZXJnZTogZnVuY3Rpb24o
cGFyYW0sIGNvbW1vbikgewotICAgICAgICB2YXIgcmV0ID0gcGFyYW0gfHwgY29tbW9uOwotCi0g
ICAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7Ci0gICAg
ICAgICAgcmV0ID0ge307Ci0gICAgICAgICAgVXRpbHMuZXh0ZW5kKHJldCwgY29tbW9uKTsKLSAg
ICAgICAgICBVdGlscy5leHRlbmQocmV0LCBwYXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIHJldDsKLSAgICAgIH0sCi0gICAgICBwcm9ncmFtV2l0aERlcHRoOiBlbnYuVk0ucHJvZ3Jh
bVdpdGhEZXB0aCwKLSAgICAgIG5vb3A6IGVudi5WTS5ub29wLAotICAgICAgY29tcGlsZXJJbmZv
OiBudWxsCi0gICAgfTsKLQotICAgIHJldHVybiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7
Ci0gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgICAgIHZhciBuYW1lc3BhY2UgPSBv
cHRpb25zLnBhcnRpYWwgPyBvcHRpb25zIDogZW52LAotICAgICAgICAgIGhlbHBlcnMsCi0gICAg
ICAgICAgcGFydGlhbHM7Ci0KLSAgICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAg
IGhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7Ci0gICAgICAgIHBhcnRpYWxzID0gb3B0aW9ucy5w
YXJ0aWFsczsKLSAgICAgIH0KLSAgICAgIHZhciByZXN1bHQgPSB0ZW1wbGF0ZVNwZWMuY2FsbCgK
LSAgICAgICAgICAgIGNvbnRhaW5lciwKLSAgICAgICAgICAgIG5hbWVzcGFjZSwgY29udGV4dCwK
LSAgICAgICAgICAgIGhlbHBlcnMsCi0gICAgICAgICAgICBwYXJ0aWFscywKLSAgICAgICAgICAg
IG9wdGlvbnMuZGF0YSk7Ci0KLSAgICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAg
IGVudi5WTS5jaGVja1JldmlzaW9uKGNvbnRhaW5lci5jb21waWxlckluZm8pOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH07Ci0gIH0KLQotICBfX2V4cG9ydHNfXy50ZW1w
bGF0ZSA9IHRlbXBsYXRlO2Z1bmN0aW9uIHByb2dyYW1XaXRoRGVwdGgoaSwgZm4sIGRhdGEgLyos
ICRkZXB0aCAqLykgewotICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
YXJndW1lbnRzLCAzKTsKLQotICAgIHZhciBwcm9nID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9u
cykgewotICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICAgIHJldHVybiBmbi5h
cHBseSh0aGlzLCBbY29udGV4dCwgb3B0aW9ucy5kYXRhIHx8IGRhdGFdLmNvbmNhdChhcmdzKSk7
Ci0gICAgfTsKLSAgICBwcm9nLnByb2dyYW0gPSBpOwotICAgIHByb2cuZGVwdGggPSBhcmdzLmxl
bmd0aDsKLSAgICByZXR1cm4gcHJvZzsKLSAgfQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW1XaXRo
RGVwdGggPSBwcm9ncmFtV2l0aERlcHRoO2Z1bmN0aW9uIHByb2dyYW0oaSwgZm4sIGRhdGEpIHsK
LSAgICB2YXIgcHJvZyA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIG9wdGlv
bnMgPSBvcHRpb25zIHx8IHt9OwotCi0gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucy5k
YXRhIHx8IGRhdGEpOwotICAgIH07Ci0gICAgcHJvZy5wcm9ncmFtID0gaTsKLSAgICBwcm9nLmRl
cHRoID0gMDsKLSAgICByZXR1cm4gcHJvZzsKLSAgfQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW0g
PSBwcm9ncmFtO2Z1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgbmFtZSwgY29udGV4dCwg
aGVscGVycywgcGFydGlhbHMsIGRhdGEpIHsKLSAgICB2YXIgb3B0aW9ucyA9IHsgcGFydGlhbDog
dHJ1ZSwgaGVscGVyczogaGVscGVycywgcGFydGlhbHM6IHBhcnRpYWxzLCBkYXRhOiBkYXRhIH07
Ci0KLSAgICBpZihwYXJ0aWFsID09PSB1bmRlZmluZWQpIHsKLSAgICAgIHRocm93IG5ldyBFeGNl
cHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1lICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsKLSAg
ICB9IGVsc2UgaWYocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7Ci0gICAgICByZXR1cm4g
cGFydGlhbChjb250ZXh0LCBvcHRpb25zKTsKLSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5p
bnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDtmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gIiI7
IH0KLQotICBfX2V4cG9ydHNfXy5ub29wID0gbm9vcDsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwot
fSkoX19tb2R1bGUzX18sIF9fbW9kdWxlNV9fLCBfX21vZHVsZTJfXyk7Ci0KLS8vIGhhbmRsZWJh
cnMucnVudGltZS5qcwotdmFyIF9fbW9kdWxlMV9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFf
XywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19k
ZXBlbmRlbmN5NV9fKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fOwotICAv
Kmdsb2JhbHMgSGFuZGxlYmFyczogdHJ1ZSAqLwotICB2YXIgYmFzZSA9IF9fZGVwZW5kZW5jeTFf
XzsKLQotICAvLyBFYWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBO
byBuZWVkIHRvIHNldHVwIGhlcmUuCi0gIC8vIChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJl
IGNvZGUgYmV0d2VlbiBjb21tb25qcyBhbmQgYnJvd3NlIGVudnMpCi0gIHZhciBTYWZlU3RyaW5n
ID0gX19kZXBlbmRlbmN5Ml9fOwotICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5M19fOwot
ICB2YXIgVXRpbHMgPSBfX2RlcGVuZGVuY3k0X187Ci0gIHZhciBydW50aW1lID0gX19kZXBlbmRl
bmN5NV9fOwotCi0gIC8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1v
ZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQotICB2
YXIgY3JlYXRlID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGhiID0gbmV3IGJhc2UuSGFuZGxlYmFy
c0Vudmlyb25tZW50KCk7Ci0KLSAgICBVdGlscy5leHRlbmQoaGIsIGJhc2UpOwotICAgIGhiLlNh
ZmVTdHJpbmcgPSBTYWZlU3RyaW5nOwotICAgIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjsKLSAg
ICBoYi5VdGlscyA9IFV0aWxzOwotCi0gICAgaGIuVk0gPSBydW50aW1lOwotICAgIGhiLnRlbXBs
YXRlID0gZnVuY3Rpb24oc3BlYykgewotICAgICAgcmV0dXJuIHJ1bnRpbWUudGVtcGxhdGUoc3Bl
YywgaGIpOwotICAgIH07Ci0KLSAgICByZXR1cm4gaGI7Ci0gIH07Ci0KLSAgdmFyIEhhbmRsZWJh
cnMgPSBjcmVhdGUoKTsKLSAgSGFuZGxlYmFycy5jcmVhdGUgPSBjcmVhdGU7Ci0KLSAgX19leHBv
cnRzX18gPSBIYW5kbGViYXJzOwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTJf
XywgX19tb2R1bGU0X18sIF9fbW9kdWxlNV9fLCBfX21vZHVsZTNfXywgX19tb2R1bGU2X18pOwot
Ci0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2FzdC5qcwotdmFyIF9fbW9kdWxlN19fID0gKGZ1bmN0
aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAidXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNf
XzsKLSAgdmFyIEV4Y2VwdGlvbiA9IF9fZGVwZW5kZW5jeTFfXzsKLQotICBmdW5jdGlvbiBMb2Nh
dGlvbkluZm8obG9jSW5mbyl7Ci0gICAgbG9jSW5mbyA9IGxvY0luZm8gfHwge307Ci0gICAgdGhp
cy5maXJzdExpbmUgICA9IGxvY0luZm8uZmlyc3RfbGluZTsKLSAgICB0aGlzLmZpcnN0Q29sdW1u
ID0gbG9jSW5mby5maXJzdF9jb2x1bW47Ci0gICAgdGhpcy5sYXN0Q29sdW1uICA9IGxvY0luZm8u
bGFzdF9jb2x1bW47Ci0gICAgdGhpcy5sYXN0TGluZSAgICA9IGxvY0luZm8ubGFzdF9saW5lOwot
ICB9Ci0KLSAgdmFyIEFTVCA9IHsKLSAgICBQcm9ncmFtTm9kZTogZnVuY3Rpb24oc3RhdGVtZW50
cywgaW52ZXJzZVN0cmlwLCBpbnZlcnNlLCBsb2NJbmZvKSB7Ci0gICAgICB2YXIgaW52ZXJzZUxv
Y2F0aW9uSW5mbywgZmlyc3RJbnZlcnNlTm9kZTsKLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3Ro
ID09PSAzKSB7Ci0gICAgICAgIGxvY0luZm8gPSBpbnZlcnNlOwotICAgICAgICBpbnZlcnNlID0g
bnVsbDsKLSAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAg
ICBsb2NJbmZvID0gaW52ZXJzZVN0cmlwOwotICAgICAgICBpbnZlcnNlU3RyaXAgPSBudWxsOwot
ICAgICAgfQotCi0gICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAg
IHRoaXMudHlwZSA9ICJwcm9ncmFtIjsKLSAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVu
dHM7Ci0gICAgICB0aGlzLnN0cmlwID0ge307Ci0KLSAgICAgIGlmKGludmVyc2UpIHsKLSAgICAg
ICAgZmlyc3RJbnZlcnNlTm9kZSA9IGludmVyc2VbMF07Ci0gICAgICAgIGlmIChmaXJzdEludmVy
c2VOb2RlKSB7Ci0gICAgICAgICAgaW52ZXJzZUxvY2F0aW9uSW5mbyA9IHsKLSAgICAgICAgICAg
IGZpcnN0X2xpbmU6IGZpcnN0SW52ZXJzZU5vZGUuZmlyc3RMaW5lLAotICAgICAgICAgICAgbGFz
dF9saW5lOiBmaXJzdEludmVyc2VOb2RlLmxhc3RMaW5lLAotICAgICAgICAgICAgbGFzdF9jb2x1
bW46IGZpcnN0SW52ZXJzZU5vZGUubGFzdENvbHVtbiwKLSAgICAgICAgICAgIGZpcnN0X2NvbHVt
bjogZmlyc3RJbnZlcnNlTm9kZS5maXJzdENvbHVtbgotICAgICAgICAgIH07Ci0gICAgICAgICAg
dGhpcy5pbnZlcnNlID0gbmV3IEFTVC5Qcm9ncmFtTm9kZShpbnZlcnNlLCBpbnZlcnNlU3RyaXAs
IGludmVyc2VMb2NhdGlvbkluZm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMu
aW52ZXJzZSA9IG5ldyBBU1QuUHJvZ3JhbU5vZGUoaW52ZXJzZSwgaW52ZXJzZVN0cmlwKTsKLSAg
ICAgICAgfQotICAgICAgICB0aGlzLnN0cmlwLnJpZ2h0ID0gaW52ZXJzZVN0cmlwLmxlZnQ7Ci0g
ICAgICB9IGVsc2UgaWYgKGludmVyc2VTdHJpcCkgewotICAgICAgICB0aGlzLnN0cmlwLmxlZnQg
PSBpbnZlcnNlU3RyaXAucmlnaHQ7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIE11c3RhY2hlTm9k
ZTogZnVuY3Rpb24ocmF3UGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewotICAg
ICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAi
bXVzdGFjaGUiOwotICAgICAgdGhpcy5zdHJpcCA9IHN0cmlwOwotCi0gICAgICAvLyBPcGVuIG1h
eSBiZSBhIHN0cmluZyBwYXJzZWQgZnJvbSB0aGUgcGFyc2VyIG9yIGEgcGFzc2VkIGJvb2xlYW4g
ZmxhZwotICAgICAgaWYgKG9wZW4gIT0gbnVsbCAmJiBvcGVuLmNoYXJBdCkgewotICAgICAgICAv
LyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTAKLSAgICAgICAgdmFyIGVzY2Fw
ZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKTsKLSAgICAgICAgdGhpcy5l
c2NhcGVkID0gZXNjYXBlRmxhZyAhPT0gJ3snICYmIGVzY2FwZUZsYWcgIT09ICcmJzsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuZXNjYXBlZCA9ICEhb3BlbjsKLSAgICAgIH0KLQotICAg
ICAgaWYgKHJhd1BhcmFtcyBpbnN0YW5jZW9mIEFTVC5TZXhwck5vZGUpIHsKLSAgICAgICAgdGhp
cy5zZXhwciA9IHJhd1BhcmFtczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFN1cHBvcnQg
b2xkIEFTVCBBUEkKLSAgICAgICAgdGhpcy5zZXhwciA9IG5ldyBBU1QuU2V4cHJOb2RlKHJhd1Bh
cmFtcywgaGFzaCk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuc2V4cHIuaXNSb290ID0gdHJ1ZTsK
LQotICAgICAgLy8gU3VwcG9ydCBvbGQgQVNUIEFQSSB0aGF0IHN0b3JlZCB0aGlzIGluZm8gaW4g
TXVzdGFjaGVOb2RlCi0gICAgICB0aGlzLmlkID0gdGhpcy5zZXhwci5pZDsKLSAgICAgIHRoaXMu
cGFyYW1zID0gdGhpcy5zZXhwci5wYXJhbXM7Ci0gICAgICB0aGlzLmhhc2ggPSB0aGlzLnNleHBy
Lmhhc2g7Ci0gICAgICB0aGlzLmVsaWdpYmxlSGVscGVyID0gdGhpcy5zZXhwci5lbGlnaWJsZUhl
bHBlcjsKLSAgICAgIHRoaXMuaXNIZWxwZXIgPSB0aGlzLnNleHByLmlzSGVscGVyOwotICAgIH0s
Ci0KLSAgICBTZXhwck5vZGU6IGZ1bmN0aW9uKHJhd1BhcmFtcywgaGFzaCwgbG9jSW5mbykgewot
ICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0KLSAgICAgIHRoaXMudHlw
ZSA9ICJzZXhwciI7Ci0gICAgICB0aGlzLmhhc2ggPSBoYXNoOwotCi0gICAgICB2YXIgaWQgPSB0
aGlzLmlkID0gcmF3UGFyYW1zWzBdOwotICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyYW1zID0g
cmF3UGFyYW1zLnNsaWNlKDEpOwotCi0gICAgICAvLyBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxl
IGhlbHBlciBpZjoKLSAgICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwg
bm90IGB0aGlzYCBvciBgLi5gKQotICAgICAgdmFyIGVsaWdpYmxlSGVscGVyID0gdGhpcy5lbGln
aWJsZUhlbHBlciA9IGlkLmlzU2ltcGxlOwotCi0gICAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmlu
aXRlbHkgYSBoZWxwZXIgaWY6Ci0gICAgICAvLyAqIGl0IGlzIGFuIGVsaWdpYmxlIGhlbHBlciwg
YW5kCi0gICAgICAvLyAqIGl0IGhhcyBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG9yIGhhc2ggc2Vn
bWVudAotICAgICAgdGhpcy5pc0hlbHBlciA9IGVsaWdpYmxlSGVscGVyICYmIChwYXJhbXMubGVu
Z3RoIHx8IGhhc2gpOwotCi0gICAgICAvLyBpZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhl
bHBlciBidXQgbm90IGEgZGVmaW5pdGUKLSAgICAgIC8vIGhlbHBlciwgaXQgaXMgYW1iaWd1b3Vz
LCBhbmQgd2lsbCBiZSByZXNvbHZlZCBpbiBhIGxhdGVyCi0gICAgICAvLyBwYXNzIG9yIGF0IHJ1
bnRpbWUuCi0gICAgfSwKLQotICAgIFBhcnRpYWxOb2RlOiBmdW5jdGlvbihwYXJ0aWFsTmFtZSwg
Y29udGV4dCwgc3RyaXAsIGxvY0luZm8pIHsKLSAgICAgIExvY2F0aW9uSW5mby5jYWxsKHRoaXMs
IGxvY0luZm8pOwotICAgICAgdGhpcy50eXBlICAgICAgICAgPSAicGFydGlhbCI7Ci0gICAgICB0
aGlzLnBhcnRpYWxOYW1lICA9IHBhcnRpYWxOYW1lOwotICAgICAgdGhpcy5jb250ZXh0ICAgICAg
PSBjb250ZXh0OwotICAgICAgdGhpcy5zdHJpcCA9IHN0cmlwOwotICAgIH0sCi0KLSAgICBCbG9j
a05vZGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBwcm9ncmFtLCBpbnZlcnNlLCBjbG9zZSwgbG9jSW5m
bykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0KLSAgICAgIGlm
KG11c3RhY2hlLnNleHByLmlkLm9yaWdpbmFsICE9PSBjbG9zZS5wYXRoLm9yaWdpbmFsKSB7Ci0g
ICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24obXVzdGFjaGUuc2V4cHIuaWQub3JpZ2luYWwgKyAi
IGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLnBhdGgub3JpZ2luYWwsIHRoaXMpOwotICAgICAgfQot
Ci0gICAgICB0aGlzLnR5cGUgPSAnYmxvY2snOwotICAgICAgdGhpcy5tdXN0YWNoZSA9IG11c3Rh
Y2hlOwotICAgICAgdGhpcy5wcm9ncmFtICA9IHByb2dyYW07Ci0gICAgICB0aGlzLmludmVyc2Ug
ID0gaW52ZXJzZTsKLQotICAgICAgdGhpcy5zdHJpcCA9IHsKLSAgICAgICAgbGVmdDogbXVzdGFj
aGUuc3RyaXAubGVmdCwKLSAgICAgICAgcmlnaHQ6IGNsb3NlLnN0cmlwLnJpZ2h0Ci0gICAgICB9
OwotCi0gICAgICAocHJvZ3JhbSB8fCBpbnZlcnNlKS5zdHJpcC5sZWZ0ID0gbXVzdGFjaGUuc3Ry
aXAucmlnaHQ7Ci0gICAgICAoaW52ZXJzZSB8fCBwcm9ncmFtKS5zdHJpcC5yaWdodCA9IGNsb3Nl
LnN0cmlwLmxlZnQ7Ci0KLSAgICAgIGlmIChpbnZlcnNlICYmICFwcm9ncmFtKSB7Ci0gICAgICAg
IHRoaXMuaXNJbnZlcnNlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgQ29udGVudE5v
ZGU6IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwo
dGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiY29udGVudCI7Ci0gICAgICB0aGlz
LnN0cmluZyA9IHN0cmluZzsKLSAgICB9LAotCi0gICAgSGFzaE5vZGU6IGZ1bmN0aW9uKHBhaXJz
LCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAg
ICAgIHRoaXMudHlwZSA9ICJoYXNoIjsKLSAgICAgIHRoaXMucGFpcnMgPSBwYWlyczsKLSAgICB9
LAotCi0gICAgSWROb2RlOiBmdW5jdGlvbihwYXJ0cywgbG9jSW5mbykgewotICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiSUQiOwotCi0g
ICAgICB2YXIgb3JpZ2luYWwgPSAiIiwKLSAgICAgICAgICBkaWcgPSBbXSwKLSAgICAgICAgICBk
ZXB0aCA9IDA7Ci0KLSAgICAgIGZvcih2YXIgaT0wLGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykg
ewotICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldLnBhcnQ7Ci0gICAgICAgIG9yaWdpbmFsICs9
IChwYXJ0c1tpXS5zZXBhcmF0b3IgfHwgJycpICsgcGFydDsKLQotICAgICAgICBpZiAocGFydCA9
PT0gIi4uIiB8fCBwYXJ0ID09PSAiLiIgfHwgcGFydCA9PT0gInRoaXMiKSB7Ci0gICAgICAgICAg
aWYgKGRpZy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJ
bnZhbGlkIHBhdGg6ICIgKyBvcmlnaW5hbCwgdGhpcyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChw
YXJ0ID09PSAiLi4iKSB7Ci0gICAgICAgICAgICBkZXB0aCsrOwotICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICB0aGlzLmlzU2NvcGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgZGlnLnB1c2gocGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0K
LQotICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOwotICAgICAgdGhpcy5wYXJ0cyAgICA9
IGRpZzsKLSAgICAgIHRoaXMuc3RyaW5nICAgPSBkaWcuam9pbignLicpOwotICAgICAgdGhpcy5k
ZXB0aCAgICA9IGRlcHRoOwotCi0gICAgICAvLyBhbiBJRCBpcyBzaW1wbGUgaWYgaXQgb25seSBo
YXMgb25lIHBhcnQsIGFuZCB0aGF0IHBhcnQgaXMgbm90Ci0gICAgICAvLyBgLi5gIG9yIGB0aGlz
YC4KLSAgICAgIHRoaXMuaXNTaW1wbGUgPSBwYXJ0cy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNT
Y29wZWQgJiYgZGVwdGggPT09IDA7Ci0KLSAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gdGhp
cy5zdHJpbmc7Ci0gICAgfSwKLQotICAgIFBhcnRpYWxOYW1lTm9kZTogZnVuY3Rpb24obmFtZSwg
bG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAg
ICB0aGlzLnR5cGUgPSAiUEFSVElBTF9OQU1FIjsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWUub3Jp
Z2luYWw7Ci0gICAgfSwKLQotICAgIERhdGFOb2RlOiBmdW5jdGlvbihpZCwgbG9jSW5mbykgewot
ICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUg
PSAiREFUQSI7Ci0gICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfSwKLQotICAgIFN0cmluZ05vZGU6
IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhp
cywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiU1RSSU5HIjsKLSAgICAgIHRoaXMub3Jp
Z2luYWwgPQotICAgICAgICB0aGlzLnN0cmluZyA9Ci0gICAgICAgIHRoaXMuc3RyaW5nTW9kZVZh
bHVlID0gc3RyaW5nOwotICAgIH0sCi0KLSAgICBJbnRlZ2VyTm9kZTogZnVuY3Rpb24oaW50ZWdl
ciwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0g
ICAgICB0aGlzLnR5cGUgPSAiSU5URUdFUiI7Ci0gICAgICB0aGlzLm9yaWdpbmFsID0KLSAgICAg
ICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsKLSAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0g
TnVtYmVyKGludGVnZXIpOwotICAgIH0sCi0KLSAgICBCb29sZWFuTm9kZTogZnVuY3Rpb24oYm9v
bCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0g
ICAgICB0aGlzLnR5cGUgPSAiQk9PTEVBTiI7Ci0gICAgICB0aGlzLmJvb2wgPSBib29sOwotICAg
ICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBib29sID09PSAidHJ1ZSI7Ci0gICAgfSwKLQotICAg
IENvbW1lbnROb2RlOiBmdW5jdGlvbihjb21tZW50LCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlv
bkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAgIHRoaXMudHlwZSA9ICJjb21tZW50IjsK
LSAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gICAgfQotICB9OwotCi0gIC8vIE11c3Qg
YmUgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHJhdGhlciB0aGFuIHRoZSByb290IG9mIHRoZSBtb2R1
bGUgYXMgdGhlIGppc29uIGxleGVyCi0gIC8vIG1vc3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3Bl
cmF0ZSBwcm9wZXJseS4KLSAgX19leHBvcnRzX18gPSBBU1Q7Ci0gIHJldHVybiBfX2V4cG9ydHNf
XzsKLX0pKF9fbW9kdWxlNV9fKTsKLQotLy8gaGFuZGxlYmFycy9jb21waWxlci9wYXJzZXIuanMK
LXZhciBfX21vZHVsZTlfXyA9IChmdW5jdGlvbigpIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIg
X19leHBvcnRzX187Ci0gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KLSAgLyogSmlzb24gZ2Vu
ZXJhdGVkIHBhcnNlciAqLwotICB2YXIgaGFuZGxlYmFycyA9IChmdW5jdGlvbigpewotICB2YXIg
cGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0cmFjZSgpIHsgfSwKLSAgeXk6IHt9LAotICBzeW1i
b2xzXzogeyJlcnJvciI6Miwicm9vdCI6Mywic3RhdGVtZW50cyI6NCwiRU9GIjo1LCJwcm9ncmFt
Ijo2LCJzaW1wbGVJbnZlcnNlIjo3LCJzdGF0ZW1lbnQiOjgsIm9wZW5JbnZlcnNlIjo5LCJjbG9z
ZUJsb2NrIjoxMCwib3BlbkJsb2NrIjoxMSwibXVzdGFjaGUiOjEyLCJwYXJ0aWFsIjoxMywiQ09O
VEVOVCI6MTQsIkNPTU1FTlQiOjE1LCJPUEVOX0JMT0NLIjoxNiwic2V4cHIiOjE3LCJDTE9TRSI6
MTgsIk9QRU5fSU5WRVJTRSI6MTksIk9QRU5fRU5EQkxPQ0siOjIwLCJwYXRoIjoyMSwiT1BFTiI6
MjIsIk9QRU5fVU5FU0NBUEVEIjoyMywiQ0xPU0VfVU5FU0NBUEVEIjoyNCwiT1BFTl9QQVJUSUFM
IjoyNSwicGFydGlhbE5hbWUiOjI2LCJwYXJ0aWFsX29wdGlvbjAiOjI3LCJzZXhwcl9yZXBldGl0
aW9uMCI6MjgsInNleHByX29wdGlvbjAiOjI5LCJkYXRhTmFtZSI6MzAsInBhcmFtIjozMSwiU1RS
SU5HIjozMiwiSU5URUdFUiI6MzMsIkJPT0xFQU4iOjM0LCJPUEVOX1NFWFBSIjozNSwiQ0xPU0Vf
U0VYUFIiOjM2LCJoYXNoIjozNywiaGFzaF9yZXBldGl0aW9uX3BsdXMwIjozOCwiaGFzaFNlZ21l
bnQiOjM5LCJJRCI6NDAsIkVRVUFMUyI6NDEsIkRBVEEiOjQyLCJwYXRoU2VnbWVudHMiOjQzLCJT
RVAiOjQ0LCIkYWNjZXB0IjowLCIkZW5kIjoxfSwKLSAgdGVybWluYWxzXzogezI6ImVycm9yIiw1
OiJFT0YiLDE0OiJDT05URU5UIiwxNToiQ09NTUVOVCIsMTY6Ik9QRU5fQkxPQ0siLDE4OiJDTE9T
RSIsMTk6Ik9QRU5fSU5WRVJTRSIsMjA6Ik9QRU5fRU5EQkxPQ0siLDIyOiJPUEVOIiwyMzoiT1BF
Tl9VTkVTQ0FQRUQiLDI0OiJDTE9TRV9VTkVTQ0FQRUQiLDI1OiJPUEVOX1BBUlRJQUwiLDMyOiJT
VFJJTkciLDMzOiJJTlRFR0VSIiwzNDoiQk9PTEVBTiIsMzU6Ik9QRU5fU0VYUFIiLDM2OiJDTE9T
RV9TRVhQUiIsNDA6IklEIiw0MToiRVFVQUxTIiw0MjoiREFUQSIsNDQ6IlNFUCJ9LAotICBwcm9k
dWN0aW9uc186IFswLFszLDJdLFszLDFdLFs2LDJdLFs2LDNdLFs2LDJdLFs2LDFdLFs2LDFdLFs2
LDBdLFs0LDFdLFs0LDJdLFs4LDNdLFs4LDNdLFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFsxMSwz
XSxbOSwzXSxbMTAsM10sWzEyLDNdLFsxMiwzXSxbMTMsNF0sWzcsMl0sWzE3LDNdLFsxNywxXSxb
MzEsMV0sWzMxLDFdLFszMSwxXSxbMzEsMV0sWzMxLDFdLFszMSwzXSxbMzcsMV0sWzM5LDNdLFsy
NiwxXSxbMjYsMV0sWzI2LDFdLFszMCwyXSxbMjEsMV0sWzQzLDNdLFs0MywxXSxbMjcsMF0sWzI3
LDFdLFsyOCwwXSxbMjgsMl0sWzI5LDBdLFsyOSwxXSxbMzgsMV0sWzM4LDJdXSwKLSAgcGVyZm9y
bUFjdGlvbjogZnVuY3Rpb24gYW5vbnltb3VzKHl5dGV4dCx5eWxlbmcseXlsaW5lbm8seXkseXlz
dGF0ZSwkJCxfJCkgewotCi0gIHZhciAkMCA9ICQkLmxlbmd0aCAtIDE7Ci0gIHN3aXRjaCAoeXlz
dGF0ZSkgewotICBjYXNlIDE6IHJldHVybiBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMV0sIHRo
aXMuXyQpOyAKLSAgYnJlYWs7Ci0gIGNhc2UgMjogcmV0dXJuIG5ldyB5eS5Qcm9ncmFtTm9kZShb
XSwgdGhpcy5fJCk7IAotICBicmVhazsKLSAgY2FzZSAzOnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFt
Tm9kZShbXSwgJCRbJDAtMV0sICQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDQ6
dGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKCQkWyQwLTJdLCAkJFskMC0xXSwgJCRbJDBdLCB0
aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgNTp0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUo
JCRbJDAtMV0sICQkWyQwXSwgW10sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSA2OnRoaXMu
JCA9IG5ldyB5eS5Qcm9ncmFtTm9kZSgkJFskMF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2Fz
ZSA3OnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwot
ICBjYXNlIDg6dGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2RlKFtdLCB0aGlzLl8kKTsKLSAgYnJl
YWs7Ci0gIGNhc2UgOTp0aGlzLiQgPSBbJCRbJDBdXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTA6ICQk
WyQwLTFdLnB1c2goJCRbJDBdKTsgdGhpcy4kID0gJCRbJDAtMV07IAotICBicmVhazsKLSAgY2Fz
ZSAxMTp0aGlzLiQgPSBuZXcgeXkuQmxvY2tOb2RlKCQkWyQwLTJdLCAkJFskMC0xXS5pbnZlcnNl
LCAkJFskMC0xXSwgJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTI6dGhpcy4k
ID0gbmV3IHl5LkJsb2NrTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0sICQkWyQwLTFdLmludmVyc2Us
ICQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDEzOnRoaXMuJCA9ICQkWyQwXTsK
LSAgYnJlYWs7Ci0gIGNhc2UgMTQ6dGhpcy4kID0gJCRbJDBdOwotICBicmVhazsKLSAgY2FzZSAx
NTp0aGlzLiQgPSBuZXcgeXkuQ29udGVudE5vZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7
Ci0gIGNhc2UgMTY6dGhpcy4kID0gbmV3IHl5LkNvbW1lbnROb2RlKCQkWyQwXSwgdGhpcy5fJCk7
Ci0gIGJyZWFrOwotICBjYXNlIDE3OnRoaXMuJCA9IG5ldyB5eS5NdXN0YWNoZU5vZGUoJCRbJDAt
MV0sIG51bGwsICQkWyQwLTJdLCBzdHJpcEZsYWdzKCQkWyQwLTJdLCAkJFskMF0pLCB0aGlzLl8k
KTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTg6dGhpcy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgkJFsk
MC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlwRmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRoaXMu
XyQpOwotICBicmVhazsKLSAgY2FzZSAxOTp0aGlzLiQgPSB7cGF0aDogJCRbJDAtMV0sIHN0cmlw
OiBzdHJpcEZsYWdzKCQkWyQwLTJdLCAkJFskMF0pfTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjA6dGhp
cy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlw
RmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAyMTp0
aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2RlKCQkWyQwLTFdLCBudWxsLCAkJFskMC0yXSwgc3Ry
aXBGbGFncygkJFskMC0yXSwgJCRbJDBdKSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDIy
OnRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTm9kZSgkJFskMC0yXSwgJCRbJDAtMV0sIHN0cmlwRmxh
Z3MoJCRbJDAtM10sICQkWyQwXSksIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAyMzp0aGlz
LiQgPSBzdHJpcEZsYWdzKCQkWyQwLTFdLCAkJFskMF0pOwotICBicmVhazsKLSAgY2FzZSAyNDp0
aGlzLiQgPSBuZXcgeXkuU2V4cHJOb2RlKFskJFskMC0yXV0uY29uY2F0KCQkWyQwLTFdKSwgJCRb
JDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjU6dGhpcy4kID0gbmV3IHl5LlNleHBy
Tm9kZShbJCRbJDBdXSwgbnVsbCwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDI2OnRoaXMu
JCA9ICQkWyQwXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjc6dGhpcy4kID0gbmV3IHl5LlN0cmluZ05v
ZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjg6dGhpcy4kID0gbmV3IHl5
LkludGVnZXJOb2RlKCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDI5OnRoaXMu
JCA9IG5ldyB5eS5Cb29sZWFuTm9kZSgkJFskMF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2Fz
ZSAzMDp0aGlzLiQgPSAkJFskMF07Ci0gIGJyZWFrOwotICBjYXNlIDMxOiQkWyQwLTFdLmlzSGVs
cGVyID0gdHJ1ZTsgdGhpcy4kID0gJCRbJDAtMV07Ci0gIGJyZWFrOwotICBjYXNlIDMyOnRoaXMu
JCA9IG5ldyB5eS5IYXNoTm9kZSgkJFskMF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAz
Mzp0aGlzLiQgPSBbJCRbJDAtMl0sICQkWyQwXV07Ci0gIGJyZWFrOwotICBjYXNlIDM0OnRoaXMu
JCA9IG5ldyB5eS5QYXJ0aWFsTmFtZU5vZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0g
IGNhc2UgMzU6dGhpcy4kID0gbmV3IHl5LlBhcnRpYWxOYW1lTm9kZShuZXcgeXkuU3RyaW5nTm9k
ZSgkJFskMF0sIHRoaXMuXyQpLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMzY6dGhpcy4k
ID0gbmV3IHl5LlBhcnRpYWxOYW1lTm9kZShuZXcgeXkuSW50ZWdlck5vZGUoJCRbJDBdLCB0aGlz
Ll8kKSk7Ci0gIGJyZWFrOwotICBjYXNlIDM3OnRoaXMuJCA9IG5ldyB5eS5EYXRhTm9kZSgkJFsk
MF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAzODp0aGlzLiQgPSBuZXcgeXkuSWROb2Rl
KCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDM5OiAkJFskMC0yXS5wdXNoKHtw
YXJ0OiAkJFskMF0sIHNlcGFyYXRvcjogJCRbJDAtMV19KTsgdGhpcy4kID0gJCRbJDAtMl07IAot
ICBicmVhazsKLSAgY2FzZSA0MDp0aGlzLiQgPSBbe3BhcnQ6ICQkWyQwXX1dOwotICBicmVhazsK
LSAgY2FzZSA0Mzp0aGlzLiQgPSBbXTsKLSAgYnJlYWs7Ci0gIGNhc2UgNDQ6JCRbJDAtMV0ucHVz
aCgkJFskMF0pOwotICBicmVhazsKLSAgY2FzZSA0Nzp0aGlzLiQgPSBbJCRbJDBdXTsKLSAgYnJl
YWs7Ci0gIGNhc2UgNDg6JCRbJDAtMV0ucHVzaCgkJFskMF0pOwotICBicmVhazsKLSAgfQotICB9
LAotICB0YWJsZTogW3szOjEsNDoyLDU6WzEsM10sODo0LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpb
MSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5OlsxLDExXSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1
OlsxLDE1XX0sezE6WzNdfSx7NTpbMSwxNl0sODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEs
OV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpb
MSwxNV19LHsxOlsyLDJdfSx7NTpbMiw5XSwxNDpbMiw5XSwxNTpbMiw5XSwxNjpbMiw5XSwxOTpb
Miw5XSwyMDpbMiw5XSwyMjpbMiw5XSwyMzpbMiw5XSwyNTpbMiw5XX0sezQ6MjAsNjoxOCw3OjE5
LDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpb
MSwyMV0sMjA6WzIsOF0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHs0OjIwLDY6MjIs
NzoxOSw4OjQsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0s
MTk6WzEsMjFdLDIwOlsyLDhdLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NTpbMiwx
M10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxNjpbMiwxM10sMTk6WzIsMTNdLDIwOlsyLDEzXSwyMjpb
MiwxM10sMjM6WzIsMTNdLDI1OlsyLDEzXX0sezU6WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwxNF0s
MTY6WzIsMTRdLDE5OlsyLDE0XSwyMDpbMiwxNF0sMjI6WzIsMTRdLDIzOlsyLDE0XSwyNTpbMiwx
NF19LHs1OlsyLDE1XSwxNDpbMiwxNV0sMTU6WzIsMTVdLDE2OlsyLDE1XSwxOTpbMiwxNV0sMjA6
WzIsMTVdLDIyOlsyLDE1XSwyMzpbMiwxNV0sMjU6WzIsMTVdfSx7NTpbMiwxNl0sMTQ6WzIsMTZd
LDE1OlsyLDE2XSwxNjpbMiwxNl0sMTk6WzIsMTZdLDIwOlsyLDE2XSwyMjpbMiwxNl0sMjM6WzIs
MTZdLDI1OlsyLDE2XX0sezE3OjIzLDIxOjI0LDMwOjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6
MjZ9LHsxNzoyOSwyMToyNCwzMDoyNSw0MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTc6MzAs
MjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsxLDI3XSw0MzoyNn0sezE3OjMxLDIxOjI0LDMwOjI1
LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9LHsyMTozMywyNjozMiwzMjpbMSwzNF0sMzM6WzEs
MzVdLDQwOlsxLDI4XSw0MzoyNn0sezE6WzIsMV19LHs1OlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIs
MTBdLDE2OlsyLDEwXSwxOTpbMiwxMF0sMjA6WzIsMTBdLDIyOlsyLDEwXSwyMzpbMiwxMF0sMjU6
WzIsMTBdfSx7MTA6MzYsMjA6WzEsMzddfSx7NDozOCw4OjQsOTo1LDExOjYsMTI6NywxMzo4LDE0
OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0sMTk6WzEsMTFdLDIwOlsyLDddLDIyOlsxLDEzXSwy
MzpbMSwxNF0sMjU6WzEsMTVdfSx7NzozOSw4OjE3LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5
XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5OlsxLDIxXSwyMDpbMiw2XSwyMjpbMSwxM10sMjM6WzEs
MTRdLDI1OlsxLDE1XX0sezE3OjIzLDE4OlsxLDQwXSwyMToyNCwzMDoyNSw0MDpbMSwyOF0sNDI6
WzEsMjddLDQzOjI2fSx7MTA6NDEsMjA6WzEsMzddfSx7MTg6WzEsNDJdfSx7MTg6WzIsNDNdLDI0
OlsyLDQzXSwyODo0MywzMjpbMiw0M10sMzM6WzIsNDNdLDM0OlsyLDQzXSwzNTpbMiw0M10sMzY6
WzIsNDNdLDQwOlsyLDQzXSw0MjpbMiw0M119LHsxODpbMiwyNV0sMjQ6WzIsMjVdLDM2OlsyLDI1
XX0sezE4OlsyLDM4XSwyNDpbMiwzOF0sMzI6WzIsMzhdLDMzOlsyLDM4XSwzNDpbMiwzOF0sMzU6
WzIsMzhdLDM2OlsyLDM4XSw0MDpbMiwzOF0sNDI6WzIsMzhdLDQ0OlsxLDQ0XX0sezIxOjQ1LDQw
OlsxLDI4XSw0MzoyNn0sezE4OlsyLDQwXSwyNDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQwXSwz
NDpbMiw0MF0sMzU6WzIsNDBdLDM2OlsyLDQwXSw0MDpbMiw0MF0sNDI6WzIsNDBdLDQ0OlsyLDQw
XX0sezE4OlsxLDQ2XX0sezE4OlsxLDQ3XX0sezI0OlsxLDQ4XX0sezE4OlsyLDQxXSwyMTo1MCwy
Nzo0OSw0MDpbMSwyOF0sNDM6MjZ9LHsxODpbMiwzNF0sNDA6WzIsMzRdfSx7MTg6WzIsMzVdLDQw
OlsyLDM1XX0sezE4OlsyLDM2XSw0MDpbMiwzNl19LHs1OlsyLDExXSwxNDpbMiwxMV0sMTU6WzIs
MTFdLDE2OlsyLDExXSwxOTpbMiwxMV0sMjA6WzIsMTFdLDIyOlsyLDExXSwyMzpbMiwxMV0sMjU6
WzIsMTFdfSx7MjE6NTEsNDA6WzEsMjhdLDQzOjI2fSx7ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgs
MTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjA6WzIsM10sMjI6WzEsMTNd
LDIzOlsxLDE0XSwyNTpbMSwxNV19LHs0OjUyLDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEs
OV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjA6WzIsNV0sMjI6WzEsMTNdLDIzOlsx
LDE0XSwyNTpbMSwxNV19LHsxNDpbMiwyM10sMTU6WzIsMjNdLDE2OlsyLDIzXSwxOTpbMiwyM10s
MjA6WzIsMjNdLDIyOlsyLDIzXSwyMzpbMiwyM10sMjU6WzIsMjNdfSx7NTpbMiwxMl0sMTQ6WzIs
MTJdLDE1OlsyLDEyXSwxNjpbMiwxMl0sMTk6WzIsMTJdLDIwOlsyLDEyXSwyMjpbMiwxMl0sMjM6
WzIsMTJdLDI1OlsyLDEyXX0sezE0OlsyLDE4XSwxNTpbMiwxOF0sMTY6WzIsMThdLDE5OlsyLDE4
XSwyMDpbMiwxOF0sMjI6WzIsMThdLDIzOlsyLDE4XSwyNTpbMiwxOF19LHsxODpbMiw0NV0sMjE6
NTYsMjQ6WzIsNDVdLDI5OjUzLDMwOjYwLDMxOjU0LDMyOlsxLDU3XSwzMzpbMSw1OF0sMzQ6WzEs
NTldLDM1OlsxLDYxXSwzNjpbMiw0NV0sMzc6NTUsMzg6NjIsMzk6NjMsNDA6WzEsNjRdLDQyOlsx
LDI3XSw0MzoyNn0sezQwOlsxLDY1XX0sezE4OlsyLDM3XSwyNDpbMiwzN10sMzI6WzIsMzddLDMz
OlsyLDM3XSwzNDpbMiwzN10sMzU6WzIsMzddLDM2OlsyLDM3XSw0MDpbMiwzN10sNDI6WzIsMzdd
fSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxNjpbMiwxN10sMTk6WzIsMTddLDIwOlsyLDE3XSwyMjpb
MiwxN10sMjM6WzIsMTddLDI1OlsyLDE3XX0sezU6WzIsMjBdLDE0OlsyLDIwXSwxNTpbMiwyMF0s
MTY6WzIsMjBdLDE5OlsyLDIwXSwyMDpbMiwyMF0sMjI6WzIsMjBdLDIzOlsyLDIwXSwyNTpbMiwy
MF19LHs1OlsyLDIxXSwxNDpbMiwyMV0sMTU6WzIsMjFdLDE2OlsyLDIxXSwxOTpbMiwyMV0sMjA6
WzIsMjFdLDIyOlsyLDIxXSwyMzpbMiwyMV0sMjU6WzIsMjFdfSx7MTg6WzEsNjZdfSx7MTg6WzIs
NDJdfSx7MTg6WzEsNjddfSx7ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEs
MTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjA6WzIsNF0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpb
MSwxNV19LHsxODpbMiwyNF0sMjQ6WzIsMjRdLDM2OlsyLDI0XX0sezE4OlsyLDQ0XSwyNDpbMiw0
NF0sMzI6WzIsNDRdLDMzOlsyLDQ0XSwzNDpbMiw0NF0sMzU6WzIsNDRdLDM2OlsyLDQ0XSw0MDpb
Miw0NF0sNDI6WzIsNDRdfSx7MTg6WzIsNDZdLDI0OlsyLDQ2XSwzNjpbMiw0Nl19LHsxODpbMiwy
Nl0sMjQ6WzIsMjZdLDMyOlsyLDI2XSwzMzpbMiwyNl0sMzQ6WzIsMjZdLDM1OlsyLDI2XSwzNjpb
MiwyNl0sNDA6WzIsMjZdLDQyOlsyLDI2XX0sezE4OlsyLDI3XSwyNDpbMiwyN10sMzI6WzIsMjdd
LDMzOlsyLDI3XSwzNDpbMiwyN10sMzU6WzIsMjddLDM2OlsyLDI3XSw0MDpbMiwyN10sNDI6WzIs
MjddfSx7MTg6WzIsMjhdLDI0OlsyLDI4XSwzMjpbMiwyOF0sMzM6WzIsMjhdLDM0OlsyLDI4XSwz
NTpbMiwyOF0sMzY6WzIsMjhdLDQwOlsyLDI4XSw0MjpbMiwyOF19LHsxODpbMiwyOV0sMjQ6WzIs
MjldLDMyOlsyLDI5XSwzMzpbMiwyOV0sMzQ6WzIsMjldLDM1OlsyLDI5XSwzNjpbMiwyOV0sNDA6
WzIsMjldLDQyOlsyLDI5XX0sezE4OlsyLDMwXSwyNDpbMiwzMF0sMzI6WzIsMzBdLDMzOlsyLDMw
XSwzNDpbMiwzMF0sMzU6WzIsMzBdLDM2OlsyLDMwXSw0MDpbMiwzMF0sNDI6WzIsMzBdfSx7MTc6
NjgsMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsxLDI3XSw0MzoyNn0sezE4OlsyLDMyXSwyNDpb
MiwzMl0sMzY6WzIsMzJdLDM5OjY5LDQwOlsxLDcwXX0sezE4OlsyLDQ3XSwyNDpbMiw0N10sMzY6
WzIsNDddLDQwOlsyLDQ3XX0sezE4OlsyLDQwXSwyNDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQw
XSwzNDpbMiw0MF0sMzU6WzIsNDBdLDM2OlsyLDQwXSw0MDpbMiw0MF0sNDE6WzEsNzFdLDQyOlsy
LDQwXSw0NDpbMiw0MF19LHsxODpbMiwzOV0sMjQ6WzIsMzldLDMyOlsyLDM5XSwzMzpbMiwzOV0s
MzQ6WzIsMzldLDM1OlsyLDM5XSwzNjpbMiwzOV0sNDA6WzIsMzldLDQyOlsyLDM5XSw0NDpbMiwz
OV19LHs1OlsyLDIyXSwxNDpbMiwyMl0sMTU6WzIsMjJdLDE2OlsyLDIyXSwxOTpbMiwyMl0sMjA6
WzIsMjJdLDIyOlsyLDIyXSwyMzpbMiwyMl0sMjU6WzIsMjJdfSx7NTpbMiwxOV0sMTQ6WzIsMTld
LDE1OlsyLDE5XSwxNjpbMiwxOV0sMTk6WzIsMTldLDIwOlsyLDE5XSwyMjpbMiwxOV0sMjM6WzIs
MTldLDI1OlsyLDE5XX0sezM2OlsxLDcyXX0sezE4OlsyLDQ4XSwyNDpbMiw0OF0sMzY6WzIsNDhd
LDQwOlsyLDQ4XX0sezQxOlsxLDcxXX0sezIxOjU2LDMwOjYwLDMxOjczLDMyOlsxLDU3XSwzMzpb
MSw1OF0sMzQ6WzEsNTldLDM1OlsxLDYxXSw0MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTg6
WzIsMzFdLDI0OlsyLDMxXSwzMjpbMiwzMV0sMzM6WzIsMzFdLDM0OlsyLDMxXSwzNTpbMiwzMV0s
MzY6WzIsMzFdLDQwOlsyLDMxXSw0MjpbMiwzMV19LHsxODpbMiwzM10sMjQ6WzIsMzNdLDM2Olsy
LDMzXSw0MDpbMiwzM119XSwKLSAgZGVmYXVsdEFjdGlvbnM6IHszOlsyLDJdLDE2OlsyLDFdLDUw
OlsyLDQyXX0sCi0gIHBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7
Ci0gICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTsKLSAgfSwKLSAgcGFyc2U6IGZ1bmN0aW9uIHBh
cnNlKGlucHV0KSB7Ci0gICAgICB2YXIgc2VsZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB2c3RhY2sg
PSBbbnVsbF0sIGxzdGFjayA9IFtdLCB0YWJsZSA9IHRoaXMudGFibGUsIHl5dGV4dCA9ICIiLCB5
eWxpbmVubyA9IDAsIHl5bGVuZyA9IDAsIHJlY292ZXJpbmcgPSAwLCBURVJST1IgPSAyLCBFT0Yg
PSAxOwotICAgICAgdGhpcy5sZXhlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICB0aGlzLmxleGVy
Lnl5ID0gdGhpcy55eTsKLSAgICAgIHRoaXMueXkubGV4ZXIgPSB0aGlzLmxleGVyOwotICAgICAg
dGhpcy55eS5wYXJzZXIgPSB0aGlzOwotICAgICAgaWYgKHR5cGVvZiB0aGlzLmxleGVyLnl5bGxv
YyA9PSAidW5kZWZpbmVkIikKLSAgICAgICAgICB0aGlzLmxleGVyLnl5bGxvYyA9IHt9OwotICAg
ICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7Ci0gICAgICBsc3RhY2sucHVzaCh5eWxv
Yyk7Ci0gICAgICB2YXIgcmFuZ2VzID0gdGhpcy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4ZXIu
b3B0aW9ucy5yYW5nZXM7Ci0gICAgICBpZiAodHlwZW9mIHRoaXMueXkucGFyc2VFcnJvciA9PT0g
ImZ1bmN0aW9uIikKLSAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJy
b3I7Ci0gICAgICBmdW5jdGlvbiBwb3BTdGFjayhuKSB7Ci0gICAgICAgICAgc3RhY2subGVuZ3Ro
ID0gc3RhY2subGVuZ3RoIC0gMiAqIG47Ci0gICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFj
ay5sZW5ndGggLSBuOwotICAgICAgICAgIGxzdGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0g
bjsKLSAgICAgIH0KLSAgICAgIGZ1bmN0aW9uIGxleCgpIHsKLSAgICAgICAgICB2YXIgdG9rZW47
Ci0gICAgICAgICAgdG9rZW4gPSBzZWxmLmxleGVyLmxleCgpIHx8IDE7Ci0gICAgICAgICAgaWYg
KHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIpIHsKLSAgICAgICAgICAgICAgdG9rZW4gPSBzZWxm
LnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJu
IHRva2VuOwotICAgICAgfQotICAgICAgdmFyIHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRl
LCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30sIHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkOwot
ICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0
aCAtIDFdOwotICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgewotICAg
ICAgICAgICAgICBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb25zW3N0YXRlXTsKLSAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBz
eW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKLSAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IGxleCgp
OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAm
JiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHR5cGVv
ZiBhY3Rpb24gPT09ICJ1bmRlZmluZWQiIHx8ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0p
IHsKLSAgICAgICAgICAgICAgdmFyIGVyclN0ciA9ICIiOwotICAgICAgICAgICAgICBpZiAoIXJl
Y292ZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gW107Ci0gICAgICAgICAg
ICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3RhdGVdKQotICAgICAgICAgICAgICAgICAgICAgIGlm
ICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgZXhwZWN0ZWQucHVzaCgiJyIgKyB0aGlzLnRlcm1pbmFsc19bcF0gKyAiJyIpOwotICAgICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxleGVyLnNob3dQ
b3NpdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICJQYXJzZSBlcnJvciBv
biBsaW5lICIgKyAoeXlsaW5lbm8gKyAxKSArICI6XG4iICsgdGhpcy5sZXhlci5zaG93UG9zaXRp
b24oKSArICJcbkV4cGVjdGluZyAiICsgZXhwZWN0ZWQuam9pbigiLCAiKSArICIsIGdvdCAnIiAr
ICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgIiciOwotICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJy
b3Igb24gbGluZSAiICsgKHl5bGluZW5vICsgMSkgKyAiOiBVbmV4cGVjdGVkICIgKyAoc3ltYm9s
ID09IDE/ImVuZCBvZiBpbnB1dCI6IiciICsgKHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5
bWJvbCkgKyAiJyIpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgdGhp
cy5wYXJzZUVycm9yKGVyclN0ciwge3RleHQ6IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlz
LnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8s
IGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBlY3RlZH0pOwotICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgfQotICAgICAgICAgIGlmIChhY3Rpb25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rp
b24ubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcnNlIEVy
cm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiAiICsgc3RhdGUgKyAiLCB0
b2tlbjogIiArIHN5bWJvbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN3aXRjaCAoYWN0aW9u
WzBdKSB7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJv
bCk7Ci0gICAgICAgICAgICAgIHZzdGFjay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKLSAgICAg
ICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5sZXhlci55eWxsb2MpOwotICAgICAgICAgICAgICBz
dGFjay5wdXNoKGFjdGlvblsxXSk7Ci0gICAgICAgICAgICAgIHN5bWJvbCA9IG51bGw7Ci0gICAg
ICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1ib2wpIHsKLSAgICAgICAgICAgICAgICAgIHl5bGVu
ZyA9IHRoaXMubGV4ZXIueXlsZW5nOwotICAgICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5s
ZXhlci55eXRleHQ7Ci0gICAgICAgICAgICAgICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXls
aW5lbm87Ci0gICAgICAgICAgICAgICAgICB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwotICAg
ICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKQotICAgICAgICAgICAgICAgICAgICAg
IHJlY292ZXJpbmctLTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
IHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOwotICAgICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1i
b2wgPSBudWxsOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgbGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9u
WzFdXVsxXTsKLSAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0g
bGVuXTsKLSAgICAgICAgICAgICAgeXl2YWwuXyQgPSB7Zmlyc3RfbGluZTogbHN0YWNrW2xzdGFj
ay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3Rh
Y2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBmaXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVu
Z3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFj
ay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbn07Ci0gICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsK
LSAgICAgICAgICAgICAgICAgIHl5dmFsLl8kLnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3Ro
IC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2Vb
MV1dOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rp
b24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxlbmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25b
MV0sIHZzdGFjaywgbHN0YWNrKTsKLSAgICAgICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5k
ZWZpbmVkIikgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFj
ay5zbGljZSgwLCAtMSAqIGxlbiAqIDIpOwotICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0
YWNrLnNsaWNlKDAsIC0xICogbGVuKTsKLSAgICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFj
ay5zbGljZSgwLCAtMSAqIGxlbik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3Rh
Y2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTsKLSAgICAgICAgICAgICAg
dnN0YWNrLnB1c2goeXl2YWwuJCk7Ci0gICAgICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8k
KTsKLSAgICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAy
XV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dOwotICAgICAgICAgICAgICBzdGFjay5wdXNoKG5l
d1N0YXRlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzOgotICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgfQotICB9OwotCi0KLSAgZnVuY3Rpb24gc3RyaXBGbGFncyhvcGVuLCBjbG9zZSkg
ewotICAgIHJldHVybiB7Ci0gICAgICBsZWZ0OiBvcGVuLmNoYXJBdCgyKSA9PT0gJ34nLAotICAg
ICAgcmlnaHQ6IGNsb3NlLmNoYXJBdCgwKSA9PT0gJ34nIHx8IGNsb3NlLmNoYXJBdCgxKSA9PT0g
J34nCi0gICAgfTsKLSAgfQotCi0gIC8qIEppc29uIGdlbmVyYXRlZCBsZXhlciAqLwotICB2YXIg
bGV4ZXIgPSAoZnVuY3Rpb24oKXsKLSAgdmFyIGxleGVyID0gKHtFT0Y6MSwKLSAgcGFyc2VFcnJv
cjpmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwgaGFzaCkgewotICAgICAgICAgIGlmICh0aGlzLnl5
LnBhcnNlcikgewotICAgICAgICAgICAgICB0aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwg
aGFzaCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KHN0cik7Ci0gICAgICAgICAgfQotICAgICAgfSwKLSAgc2V0SW5wdXQ6ZnVuY3Rpb24gKGlucHV0
KSB7Ci0gICAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsKLSAgICAgICAgICB0aGlzLl9tb3Jl
ID0gdGhpcy5fbGVzcyA9IHRoaXMuZG9uZSA9IGZhbHNlOwotICAgICAgICAgIHRoaXMueXlsaW5l
bm8gPSB0aGlzLnl5bGVuZyA9IDA7Ci0gICAgICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNo
ZWQgPSB0aGlzLm1hdGNoID0gJyc7Ci0gICAgICAgICAgdGhpcy5jb25kaXRpb25TdGFjayA9IFsn
SU5JVElBTCddOwotICAgICAgICAgIHRoaXMueXlsbG9jID0ge2ZpcnN0X2xpbmU6MSxmaXJzdF9j
b2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2NvbHVtbjowfTsKLSAgICAgICAgICBpZiAodGhpcy5v
cHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2UgPSBbMCwwXTsKLSAgICAgICAgICB0aGlz
Lm9mZnNldCA9IDA7Ci0gICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9LAotICBpbnB1dDpm
dW5jdGlvbiAoKSB7Ci0gICAgICAgICAgdmFyIGNoID0gdGhpcy5faW5wdXRbMF07Ci0gICAgICAg
ICAgdGhpcy55eXRleHQgKz0gY2g7Ci0gICAgICAgICAgdGhpcy55eWxlbmcrKzsKLSAgICAgICAg
ICB0aGlzLm9mZnNldCsrOwotICAgICAgICAgIHRoaXMubWF0Y2ggKz0gY2g7Ci0gICAgICAgICAg
dGhpcy5tYXRjaGVkICs9IGNoOwotICAgICAgICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpc
clxuP3xcbikuKi9nKTsKLSAgICAgICAgICBpZiAobGluZXMpIHsKLSAgICAgICAgICAgICAgdGhp
cy55eWxpbmVubysrOwotICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKLSAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisr
OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55
eWxsb2MucmFuZ2VbMV0rKzsKLQotICAgICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQu
c2xpY2UoMSk7Ci0gICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgfSwKLSAgdW5wdXQ6ZnVuY3Rp
b24gKGNoKSB7Ci0gICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDsKLSAgICAgICAgICB2YXIg
bGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98XG4pL2cpOwotCi0gICAgICAgICAgdGhpcy5faW5w
dXQgPSBjaCArIHRoaXMuX2lucHV0OwotICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRl
eHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aC1sZW4tMSk7Ci0gICAgICAgICAgLy90aGlz
Lnl5bGVuZyAtPSBsZW47Ci0gICAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuOwotICAgICAgICAg
IHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKLSAgICAg
ICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRjaC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGgt
MSk7Ci0gICAgICAgICAgdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlz
Lm1hdGNoZWQubGVuZ3RoLTEpOwotCi0gICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aC0xKSB0aGlz
Lnl5bGluZW5vIC09IGxpbmVzLmxlbmd0aC0xOwotICAgICAgICAgIHZhciByID0gdGhpcy55eWxs
b2MucmFuZ2U7Ci0KLSAgICAgICAgICB0aGlzLnl5bGxvYyA9IHtmaXJzdF9saW5lOiB0aGlzLnl5
bGxvYy5maXJzdF9saW5lLAotICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEs
Ci0gICAgICAgICAgICBmaXJzdF9jb2x1bW46IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiwKLSAg
ICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/Ci0gICAgICAgICAgICAgICAgKGxpbmVzLmxl
bmd0aCA9PT0gb2xkTGluZXMubGVuZ3RoID8gdGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkg
KyBvbGRMaW5lc1tvbGRMaW5lcy5sZW5ndGggLSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVz
WzBdLmxlbmd0aDoKLSAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBs
ZW4KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykg
ewotICAgICAgICAgICAgICB0aGlzLnl5bGxvYy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55
eWxlbmcgLSBsZW5dOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAg
IH0sCi0gIG1vcmU6ZnVuY3Rpb24gKCkgewotICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwot
ICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSwKLSAgbGVzczpmdW5jdGlvbiAobikgewot
ICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShuKSk7Ci0gICAgICB9LAotICBw
YXN0SW5wdXQ6ZnVuY3Rpb24gKCkgewotICAgICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVk
LnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpOwotICAg
ICAgICAgIHJldHVybiAocGFzdC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSArIHBhc3Quc3Vic3Ry
KC0yMCkucmVwbGFjZSgvXG4vZywgIiIpOwotICAgICAgfSwKLSAgdXBjb21pbmdJbnB1dDpmdW5j
dGlvbiAoKSB7Ci0gICAgICAgICAgdmFyIG5leHQgPSB0aGlzLm1hdGNoOwotICAgICAgICAgIGlm
IChuZXh0Lmxlbmd0aCA8IDIwKSB7Ci0gICAgICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQu
c3Vic3RyKDAsIDIwLW5leHQubGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJu
IChuZXh0LnN1YnN0cigwLDIwKSsobmV4dC5sZW5ndGggPiAyMCA/ICcuLi4nOicnKSkucmVwbGFj
ZSgvXG4vZywgIiIpOwotICAgICAgfSwKLSAgc2hvd1Bvc2l0aW9uOmZ1bmN0aW9uICgpIHsKLSAg
ICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0SW5wdXQoKTsKLSAgICAgICAgICB2YXIgYyA9IG5l
dyBBcnJheShwcmUubGVuZ3RoICsgMSkuam9pbigiLSIpOwotICAgICAgICAgIHJldHVybiBwcmUg
KyB0aGlzLnVwY29taW5nSW5wdXQoKSArICJcbiIgKyBjKyJeIjsKLSAgICAgIH0sCi0gIG5leHQ6
ZnVuY3Rpb24gKCkgewotICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKLSAgICAgICAgICAgICAg
cmV0dXJuIHRoaXMuRU9GOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0
KSB0aGlzLmRvbmUgPSB0cnVlOwotCi0gICAgICAgICAgdmFyIHRva2VuLAotICAgICAgICAgICAg
ICBtYXRjaCwKLSAgICAgICAgICAgICAgdGVtcE1hdGNoLAotICAgICAgICAgICAgICBpbmRleCwK
LSAgICAgICAgICAgICAgY29sLAotICAgICAgICAgICAgICBsaW5lczsKLSAgICAgICAgICBpZiAo
IXRoaXMuX21vcmUpIHsKLSAgICAgICAgICAgICAgdGhpcy55eXRleHQgPSAnJzsKLSAgICAgICAg
ICAgICAgdGhpcy5tYXRjaCA9ICcnOwotICAgICAgICAgIH0KLSAgICAgICAgICB2YXIgcnVsZXMg
PSB0aGlzLl9jdXJyZW50UnVsZXMoKTsKLSAgICAgICAgICBmb3IgKHZhciBpPTA7aSA8IHJ1bGVz
Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1h
dGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTsKLSAgICAgICAgICAgICAgaWYgKHRlbXBNYXRjaCAm
JiAoIW1hdGNoIHx8IHRlbXBNYXRjaFswXS5sZW5ndGggPiBtYXRjaFswXS5sZW5ndGgpKSB7Ci0g
ICAgICAgICAgICAgICAgICBtYXRjaCA9IHRlbXBNYXRjaDsKLSAgICAgICAgICAgICAgICAgIGlu
ZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmZsZXgpIGJyZWFr
OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtYXRjaCkgewot
ICAgICAgICAgICAgICBsaW5lcyA9IG1hdGNoWzBdLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsK
LSAgICAgICAgICAgICAgaWYgKGxpbmVzKSB0aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDsK
LSAgICAgICAgICAgICAgdGhpcy55eWxsb2MgPSB7Zmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFz
dF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2xpbmU6IHRoaXMueXls
aW5lbm8rMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlz
Lnl5bGxvYy5sYXN0X2NvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9j
b2x1bW46IGxpbmVzID8gbGluZXNbbGluZXMubGVuZ3RoLTFdLmxlbmd0aC1saW5lc1tsaW5lcy5s
ZW5ndGgtMV0ubWF0Y2goL1xyP1xuPy8pWzBdLmxlbmd0aCA6IHRoaXMueXlsbG9jLmxhc3RfY29s
dW1uICsgbWF0Y2hbMF0ubGVuZ3RofTsKLSAgICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0
Y2hbMF07Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2ggKz0gbWF0Y2hbMF07Ci0gICAgICAgICAg
ICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwotICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRo
aXMueXl0ZXh0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMp
IHsKLSAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0
aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgdGhpcy5fbW9yZSA9IGZhbHNlOwotICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMu
X2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2hl
ZCArPSBtYXRjaFswXTsKLSAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24u
Y2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBydWxlc1tpbmRleF0sdGhpcy5jb25kaXRpb25TdGFj
a1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXSk7Ci0gICAgICAgICAgICAgIGlmICh0aGlz
LmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMuZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICBp
ZiAodG9rZW4pIHJldHVybiB0b2tlbjsKLSAgICAgICAgICAgICAgZWxzZSByZXR1cm47Ci0gICAg
ICAgICAgfQotICAgICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gIiIpIHsKLSAgICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJl
dHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnKyh0aGlzLnl5bGlu
ZW5vKzEpKycuIFVucmVjb2duaXplZCB0ZXh0LlxuJyt0aGlzLnNob3dQb3NpdGlvbigpLAotICAg
ICAgICAgICAgICAgICAgICAgIHt0ZXh0OiAiIiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXls
aW5lbm99KTsKLSAgICAgICAgICB9Ci0gICAgICB9LAotICBsZXg6ZnVuY3Rpb24gbGV4KCkgewot
ICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHR5cGVvZiByICE9
PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTsKLSAgICAgICAgICB9Ci0gICAg
ICB9LAotICBiZWdpbjpmdW5jdGlvbiBiZWdpbihjb25kaXRpb24pIHsKLSAgICAgICAgICB0aGlz
LmNvbmRpdGlvblN0YWNrLnB1c2goY29uZGl0aW9uKTsKLSAgICAgIH0sCi0gIHBvcFN0YXRlOmZ1
bmN0aW9uIHBvcFN0YXRlKCkgewotICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNr
LnBvcCgpOwotICAgICAgfSwKLSAgX2N1cnJlbnRSdWxlczpmdW5jdGlvbiBfY3VycmVudFJ1bGVz
KCkgewotICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFj
a1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXV0ucnVsZXM7Ci0gICAgICB9LAotICB0b3BT
dGF0ZTpmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tb
dGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMl07Ci0gICAgICB9LAotICBwdXNoU3RhdGU6ZnVu
Y3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7Ci0gICAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24p
OwotICAgICAgfX0pOwotICBsZXhlci5vcHRpb25zID0ge307Ci0gIGxleGVyLnBlcmZvcm1BY3Rp
b24gPSBmdW5jdGlvbiBhbm9ueW1vdXMoeXkseXlfLCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMs
WVlfU1RBUlQpIHsKLQotCi0gIGZ1bmN0aW9uIHN0cmlwKHN0YXJ0LCBlbmQpIHsKLSAgICByZXR1
cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKHN0YXJ0LCB5eV8ueXlsZW5nLWVuZCk7
Ci0gIH0KLQotCi0gIHZhciBZWVNUQVRFPVlZX1NUQVJUCi0gIHN3aXRjaCgkYXZvaWRpbmdfbmFt
ZV9jb2xsaXNpb25zKSB7Ci0gIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNlKC0yKSA9PT0gIlxcXFwiKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcCgwLDEpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoeXlfLnl5dGV4dC5zbGljZSgtMSkgPT09
ICJcXCIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAs
MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJl
bXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5dGV4dCkgcmV0dXJuIDE0OwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKLSAgYnJlYWs7Ci0gIGNhc2UgMTpyZXR1cm4gMTQ7Ci0g
IGJyZWFrOwotICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGhpcy5wb3BTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAxNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGJyZWFrOwot
ICBjYXNlIDM6c3RyaXAoMCw0KTsgdGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMTU7Ci0gIGJyZWFr
OwotICBjYXNlIDQ6cmV0dXJuIDM1OwotICBicmVhazsKLSAgY2FzZSA1OnJldHVybiAzNjsKLSAg
YnJlYWs7Ci0gIGNhc2UgNjpyZXR1cm4gMjU7Ci0gIGJyZWFrOwotICBjYXNlIDc6cmV0dXJuIDE2
OwotICBicmVhazsKLSAgY2FzZSA4OnJldHVybiAyMDsKLSAgYnJlYWs7Ci0gIGNhc2UgOTpyZXR1
cm4gMTk7Ci0gIGJyZWFrOwotICBjYXNlIDEwOnJldHVybiAxOTsKLSAgYnJlYWs7Ci0gIGNhc2Ug
MTE6cmV0dXJuIDIzOwotICBicmVhazsKLSAgY2FzZSAxMjpyZXR1cm4gMjI7Ci0gIGJyZWFrOwot
ICBjYXNlIDEzOnRoaXMucG9wU3RhdGUoKTsgdGhpcy5iZWdpbignY29tJyk7Ci0gIGJyZWFrOwot
ICBjYXNlIDE0OnN0cmlwKDMsNSk7IHRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDE1OwotICBicmVh
azsKLSAgY2FzZSAxNTpyZXR1cm4gMjI7Ci0gIGJyZWFrOwotICBjYXNlIDE2OnJldHVybiA0MTsK
LSAgYnJlYWs7Ci0gIGNhc2UgMTc6cmV0dXJuIDQwOwotICBicmVhazsKLSAgY2FzZSAxODpyZXR1
cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDE5OnJldHVybiA0NDsKLSAgYnJlYWs7Ci0gIGNhc2Ug
MjA6Ly8gaWdub3JlIHdoaXRlc3BhY2UKLSAgYnJlYWs7Ci0gIGNhc2UgMjE6dGhpcy5wb3BTdGF0
ZSgpOyByZXR1cm4gMjQ7Ci0gIGJyZWFrOwotICBjYXNlIDIyOnRoaXMucG9wU3RhdGUoKTsgcmV0
dXJuIDE4OwotICBicmVhazsKLSAgY2FzZSAyMzp5eV8ueXl0ZXh0ID0gc3RyaXAoMSwyKS5yZXBs
YWNlKC9cXCIvZywnIicpOyByZXR1cm4gMzI7Ci0gIGJyZWFrOwotICBjYXNlIDI0Onl5Xy55eXRl
eHQgPSBzdHJpcCgxLDIpLnJlcGxhY2UoL1xcJy9nLCInIik7IHJldHVybiAzMjsKLSAgYnJlYWs7
Ci0gIGNhc2UgMjU6cmV0dXJuIDQyOwotICBicmVhazsKLSAgY2FzZSAyNjpyZXR1cm4gMzQ7Ci0g
IGJyZWFrOwotICBjYXNlIDI3OnJldHVybiAzNDsKLSAgYnJlYWs7Ci0gIGNhc2UgMjg6cmV0dXJu
IDMzOwotICBicmVhazsKLSAgY2FzZSAyOTpyZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMw
Onl5Xy55eXRleHQgPSBzdHJpcCgxLDIpOyByZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMx
OnJldHVybiAnSU5WQUxJRCc7Ci0gIGJyZWFrOwotICBjYXNlIDMyOnJldHVybiA1OwotICBicmVh
azsKLSAgfQotICB9OwotICBsZXhlci5ydWxlcyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkp
LywvXig/OlteXHgwMF0rKS8sL14oPzpbXlx4MDBdezIsfT8oPz0oXHtce3xcXFx7XHt8XFxcXFx7
XHt8JCkpKS8sL14oPzpbXHNcU10qPy0tXH1cfSkvLC9eKD86XCgpLywvXig/OlwpKS8sL14oPzpc
e1x7KH4pPz4pLywvXig/Olx7XHsofik/IykvLC9eKD86XHtceyh+KT9cLykvLC9eKD86XHtceyh+
KT9cXikvLC9eKD86XHtceyh+KT9ccyplbHNlXGIpLywvXig/Olx7XHsofik/XHspLywvXig/Olx7
XHsofik/JikvLC9eKD86XHtceyEtLSkvLC9eKD86XHtceyFbXHNcU10qP1x9XH0pLywvXig/Olx7
XHsofik/KS8sL14oPzo9KS8sL14oPzpcLlwuKS8sL14oPzpcLig/PShbPX59XHNcLy4pXSkpKS8s
L14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14oPzpcfSh+KT9cfVx9KS8sL14oPzoofik/XH1cfSkv
LC9eKD86IihcXFsiXXxbXiJdKSoiKS8sL14oPzonKFxcWyddfFteJ10pKicpLywvXig/OkApLywv
Xig/OnRydWUoPz0oW359XHMpXSkpKS8sL14oPzpmYWxzZSg/PShbfn1ccyldKSkpLywvXig/Oi0/
WzAtOV0rKD89KFt+fVxzKV0pKSkvLC9eKD86KFteXHMhIiMlLSxcLlwvOy0+QFxbLVxeYFx7LX5d
Kyg/PShbPX59XHNcLy4pXSkpKSkvLC9eKD86XFtbXlxdXSpcXSkvLC9eKD86LikvLC9eKD86JCkv
XTsKLSAgbGV4ZXIuY29uZGl0aW9ucyA9IHsibXUiOnsicnVsZXMiOls0LDUsNiw3LDgsOSwxMCwx
MSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwz
MCwzMSwzMl0sImluY2x1c2l2ZSI6ZmFsc2V9LCJlbXUiOnsicnVsZXMiOlsyXSwiaW5jbHVzaXZl
IjpmYWxzZX0sImNvbSI6eyJydWxlcyI6WzNdLCJpbmNsdXNpdmUiOmZhbHNlfSwiSU5JVElBTCI6
eyJydWxlcyI6WzAsMSwzMl0sImluY2x1c2l2ZSI6dHJ1ZX19OwotICByZXR1cm4gbGV4ZXI7fSko
KQotICBwYXJzZXIubGV4ZXIgPSBsZXhlcjsKLSAgZnVuY3Rpb24gUGFyc2VyICgpIHsgdGhpcy55
eSA9IHt9OyB9UGFyc2VyLnByb3RvdHlwZSA9IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2Vy
OwotICByZXR1cm4gbmV3IFBhcnNlcjsKLSAgfSkoKTtfX2V4cG9ydHNfXyA9IGhhbmRsZWJhcnM7
Ci0gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovCi0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKCk7
Ci0KLS8vIGhhbmRsZWJhcnMvY29tcGlsZXIvYmFzZS5qcwotdmFyIF9fbW9kdWxlOF9fID0gKGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fKSB7Ci0gICJ1c2Ugc3RyaWN0
IjsKLSAgdmFyIF9fZXhwb3J0c19fID0ge307Ci0gIHZhciBwYXJzZXIgPSBfX2RlcGVuZGVuY3kx
X187Ci0gIHZhciBBU1QgPSBfX2RlcGVuZGVuY3kyX187Ci0KLSAgX19leHBvcnRzX18ucGFyc2Vy
ID0gcGFyc2VyOwotCi0gIGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7Ci0gICAgLy8gSnVzdCByZXR1
cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlIEFTVCB3YXMgcGFzc2VkIGluLgotICAgIGlmKGlucHV0
LmNvbnN0cnVjdG9yID09PSBBU1QuUHJvZ3JhbU5vZGUpIHsgcmV0dXJuIGlucHV0OyB9Ci0KLSAg
ICBwYXJzZXIueXkgPSBBU1Q7Ci0gICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbnB1dCk7Ci0gIH0K
LQotICBfX2V4cG9ydHNfXy5wYXJzZSA9IHBhcnNlOwotICByZXR1cm4gX19leHBvcnRzX187Ci19
KShfX21vZHVsZTlfXywgX19tb2R1bGU3X18pOwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2Nv
bXBpbGVyLmpzCi12YXIgX19tb2R1bGUxMF9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykg
ewotICAidXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNfXyA9IHt9OwotICB2YXIgRXhjZXB0
aW9uID0gX19kZXBlbmRlbmN5MV9fOwotCi0gIGZ1bmN0aW9uIENvbXBpbGVyKCkge30KLQotICBf
X2V4cG9ydHNfXy5Db21waWxlciA9IENvbXBpbGVyOy8vIHRoZSBmb3VuZEhlbHBlciByZWdpc3Rl
ciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBhCi0gIC8vIGZ1
bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG11c3RhY2hlIGNvbXBh
dGliaWxpdHksIHdoaWNoCi0gIC8vIHJlcXVpcmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4g
YmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxvY2tIZWxwZXJNaXNzaW5nLAotICAvLyBhbmQgdGhl
biBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJsb2Nr
SGVscGVyTWlzc2luZy4KLQotICBDb21waWxlci5wcm90b3R5cGUgPSB7Ci0gICAgY29tcGlsZXI6
IENvbXBpbGVyLAotCi0gICAgZGlzYXNzZW1ibGU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG9w
Y29kZXMgPSB0aGlzLm9wY29kZXMsIG9wY29kZSwgb3V0ID0gW10sIHBhcmFtcywgcGFyYW07Ci0K
LSAgICAgIGZvciAodmFyIGk9MCwgbD1vcGNvZGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKLQotICAgICAgICBpZiAob3Bjb2RlLm9wY29kZSA9PT0g
J0RFQ0xBUkUnKSB7Ci0gICAgICAgICAgb3V0LnB1c2goIkRFQ0xBUkUgIiArIG9wY29kZS5uYW1l
ICsgIj0iICsgb3Bjb2RlLnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwYXJh
bXMgPSBbXTsKLSAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8b3Bjb2RlLmFyZ3MubGVuZ3RoOyBq
KyspIHsKLSAgICAgICAgICAgIHBhcmFtID0gb3Bjb2RlLmFyZ3Nbal07Ci0gICAgICAgICAgICBp
ZiAodHlwZW9mIHBhcmFtID09PSAic3RyaW5nIikgewotICAgICAgICAgICAgICBwYXJhbSA9ICJc
IiIgKyBwYXJhbS5yZXBsYWNlKCJcbiIsICJcXG4iKSArICJcIiI7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91
dC5wdXNoKG9wY29kZS5vcGNvZGUgKyAiICIgKyBwYXJhbXMuam9pbigiICIpKTsKLSAgICAgICAg
fQotICAgICAgfQotCi0gICAgICByZXR1cm4gb3V0LmpvaW4oIlxuIik7Ci0gICAgfSwKLQotICAg
IGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHsKLSAgICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMu
bGVuZ3RoOwotICAgICAgaWYgKG90aGVyLm9wY29kZXMubGVuZ3RoICE9PSBsZW4pIHsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxl
bjsgaSsrKSB7Ci0gICAgICAgIHZhciBvcGNvZGUgPSB0aGlzLm9wY29kZXNbaV0sCi0gICAgICAg
ICAgICBvdGhlck9wY29kZSA9IG90aGVyLm9wY29kZXNbaV07Ci0gICAgICAgIGlmIChvcGNvZGUu
b3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNvZGUgfHwgb3Bjb2RlLmFyZ3MubGVuZ3RoICE9PSBv
dGhlck9wY29kZS5hcmdzLmxlbmd0aCkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wY29kZS5hcmdzLmxlbmd0aDsgaisr
KSB7Ci0gICAgICAgICAgaWYgKG9wY29kZS5hcmdzW2pdICE9PSBvdGhlck9wY29kZS5hcmdzW2pd
KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgICB9Ci0KLSAgICAgIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgaWYgKG90
aGVyLmNoaWxkcmVuLmxlbmd0aCAhPT0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBpZiAoIXRo
aXMuY2hpbGRyZW5baV0uZXF1YWxzKG90aGVyLmNoaWxkcmVuW2ldKSkgewotICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9LAotCi0gICAgZ3VpZDogMCwKLQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHByb2dyYW0sIG9w
dGlvbnMpIHsKLSAgICAgIHRoaXMub3Bjb2RlcyA9IFtdOwotICAgICAgdGhpcy5jaGlsZHJlbiA9
IFtdOwotICAgICAgdGhpcy5kZXB0aHMgPSB7bGlzdDogW119OwotICAgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKLQotICAgICAgLy8gVGhlc2UgY2hhbmdlcyB3aWxsIHByb3BhZ2F0ZSB0byB0
aGUgb3RoZXIgY29tcGlsZXIgY29tcG9uZW50cwotICAgICAgdmFyIGtub3duSGVscGVycyA9IHRo
aXMub3B0aW9ucy5rbm93bkhlbHBlcnM7Ci0gICAgICB0aGlzLm9wdGlvbnMua25vd25IZWxwZXJz
ID0gewotICAgICAgICAnaGVscGVyTWlzc2luZyc6IHRydWUsCi0gICAgICAgICdibG9ja0hlbHBl
ck1pc3NpbmcnOiB0cnVlLAotICAgICAgICAnZWFjaCc6IHRydWUsCi0gICAgICAgICdpZic6IHRy
dWUsCi0gICAgICAgICd1bmxlc3MnOiB0cnVlLAotICAgICAgICAnd2l0aCc6IHRydWUsCi0gICAg
ICAgICdsb2cnOiB0cnVlCi0gICAgICB9OwotICAgICAgaWYgKGtub3duSGVscGVycykgewotICAg
ICAgICBmb3IgKHZhciBuYW1lIGluIGtub3duSGVscGVycykgewotICAgICAgICAgIHRoaXMub3B0
aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0gPSBrbm93bkhlbHBlcnNbbmFtZV07Ci0gICAgICAgIH0K
LSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pOwotICAgIH0sCi0K
LSAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUpIHsKLSAgICAgIHZhciBzdHJpcCA9IG5vZGUuc3Ry
aXAgfHwge30sCi0gICAgICAgICAgcmV0OwotICAgICAgaWYgKHN0cmlwLmxlZnQpIHsKLSAgICAg
ICAgdGhpcy5vcGNvZGUoJ3N0cmlwJyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldCA9IHRoaXNbbm9k
ZS50eXBlXShub2RlKTsKLQotICAgICAgaWYgKHN0cmlwLnJpZ2h0KSB7Ci0gICAgICAgIHRoaXMu
b3Bjb2RlKCdzdHJpcCcpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmV0OwotICAgIH0sCi0K
LSAgICBwcm9ncmFtOiBmdW5jdGlvbihwcm9ncmFtKSB7Ci0gICAgICB2YXIgc3RhdGVtZW50cyA9
IHByb2dyYW0uc3RhdGVtZW50czsKLQotICAgICAgZm9yKHZhciBpPTAsIGw9c3RhdGVtZW50cy5s
ZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHRoaXMuYWNjZXB0KHN0YXRlbWVudHNbaV0pOwot
ICAgICAgfQotICAgICAgdGhpcy5pc1NpbXBsZSA9IGwgPT09IDE7Ci0KLSAgICAgIHRoaXMuZGVw
dGhzLmxpc3QgPSB0aGlzLmRlcHRocy5saXN0LnNvcnQoZnVuY3Rpb24oYSwgYikgewotICAgICAg
ICByZXR1cm4gYSAtIGI7Ci0gICAgICB9KTsKLQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwK
LQotICAgIGNvbXBpbGVQcm9ncmFtOiBmdW5jdGlvbihwcm9ncmFtKSB7Ci0gICAgICB2YXIgcmVz
dWx0ID0gbmV3IHRoaXMuY29tcGlsZXIoKS5jb21waWxlKHByb2dyYW0sIHRoaXMub3B0aW9ucyk7
Ci0gICAgICB2YXIgZ3VpZCA9IHRoaXMuZ3VpZCsrLCBkZXB0aDsKLQotICAgICAgdGhpcy51c2VQ
YXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8IHJlc3VsdC51c2VQYXJ0aWFsOwotCi0gICAgICB0
aGlzLmNoaWxkcmVuW2d1aWRdID0gcmVzdWx0OwotCi0gICAgICBmb3IodmFyIGk9MCwgbD1yZXN1
bHQuZGVwdGhzLmxpc3QubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICBkZXB0aCA9IHJlc3Vs
dC5kZXB0aHMubGlzdFtpXTsKLQotICAgICAgICBpZihkZXB0aCA8IDIpIHsgY29udGludWU7IH0K
LSAgICAgICAgZWxzZSB7IHRoaXMuYWRkRGVwdGgoZGVwdGggLSAxKTsgfQotICAgICAgfQotCi0g
ICAgICByZXR1cm4gZ3VpZDsKLSAgICB9LAotCi0gICAgYmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7
Ci0gICAgICB2YXIgbXVzdGFjaGUgPSBibG9jay5tdXN0YWNoZSwKLSAgICAgICAgICBwcm9ncmFt
ID0gYmxvY2sucHJvZ3JhbSwKLSAgICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKLQot
ICAgICAgaWYgKHByb2dyYW0pIHsKLSAgICAgICAgcHJvZ3JhbSA9IHRoaXMuY29tcGlsZVByb2dy
YW0ocHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnZlcnNlKSB7Ci0gICAgICAgIGlu
dmVyc2UgPSB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpOwotICAgICAgfQotCi0gICAgICB2
YXIgc2V4cHIgPSBtdXN0YWNoZS5zZXhwcjsKLSAgICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lm
eVNleHByKHNleHByKTsKLQotICAgICAgaWYgKHR5cGUgPT09ICJoZWxwZXIiKSB7Ci0gICAgICAg
IHRoaXMuaGVscGVyU2V4cHIoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpOwotICAgICAgfSBlbHNl
IGlmICh0eXBlID09PSAic2ltcGxlIikgewotICAgICAgICB0aGlzLnNpbXBsZVNleHByKHNleHBy
KTsKLQotICAgICAgICAvLyBub3cgdGhhdCB0aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVk
LCB3ZSBuZWVkIHRvCi0gICAgICAgIC8vIGV2YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tI
ZWxwZXJNaXNzaW5nYAotICAgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFt
KTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7Ci0gICAgICAg
IHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFs
dWUnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIs
IHByb2dyYW0sIGludmVyc2UpOwotCi0gICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVz
dGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQgdG8KLSAgICAgICAgLy8gZXZhbHVhdGUgaXQgYnkg
ZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgCi0gICAgICAgIHRoaXMub3Bjb2RlKCdwdXNo
UHJvZ3JhbScsIHByb2dyYW0pOwotICAgICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBp
bnZlcnNlKTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgICB0aGlz
Lm9wY29kZSgnYW1iaWd1b3VzQmxvY2tWYWx1ZScpOwotICAgICAgfQotCi0gICAgICB0aGlzLm9w
Y29kZSgnYXBwZW5kJyk7Ci0gICAgfSwKLQotICAgIGhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKLSAg
ICAgIHZhciBwYWlycyA9IGhhc2gucGFpcnMsIHBhaXIsIHZhbDsKLQotICAgICAgdGhpcy5vcGNv
ZGUoJ3B1c2hIYXNoJyk7Ci0KLSAgICAgIGZvcih2YXIgaT0wLCBsPXBhaXJzLmxlbmd0aDsgaTxs
OyBpKyspIHsKLSAgICAgICAgcGFpciA9IHBhaXJzW2ldOwotICAgICAgICB2YWwgID0gcGFpclsx
XTsKLQotICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICAg
IGlmKHZhbC5kZXB0aCkgewotICAgICAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwot
ICAgICAgICAgIH0KLSAgICAgICAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIHZhbC5kZXB0
aCB8fCAwKTsKLSAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsLnN0
cmluZ01vZGVWYWx1ZSwgdmFsLnR5cGUpOwotCi0gICAgICAgICAgaWYgKHZhbC50eXBlID09PSAn
c2V4cHInKSB7Ci0gICAgICAgICAgICAvLyBTdWJleHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFu
ZCBwYXNzZWQgaW4KLSAgICAgICAgICAgIC8vIGluIHN0cmluZyBwYXJhbXMgbW9kZS4KLSAgICAg
ICAgICAgIHRoaXMuc2V4cHIodmFsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgdGhpcy5hY2NlcHQodmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub3Bj
b2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyWzBdKTsKLSAgICAgIH0KLSAgICAgIHRoaXMub3Bjb2Rl
KCdwb3BIYXNoJyk7Ci0gICAgfSwKLQotICAgIHBhcnRpYWw6IGZ1bmN0aW9uKHBhcnRpYWwpIHsK
LSAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBhcnRpYWwucGFydGlhbE5hbWU7Ci0gICAgICB0aGlz
LnVzZVBhcnRpYWwgPSB0cnVlOwotCi0gICAgICBpZihwYXJ0aWFsLmNvbnRleHQpIHsKLSAgICAg
ICAgdGhpcy5JRChwYXJ0aWFsLmNvbnRleHQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhp
cy5vcGNvZGUoJ3B1c2gnLCAnZGVwdGgwJyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMub3Bjb2Rl
KCdpbnZva2VQYXJ0aWFsJywgcGFydGlhbE5hbWUubmFtZSk7Ci0gICAgICB0aGlzLm9wY29kZSgn
YXBwZW5kJyk7Ci0gICAgfSwKLQotICAgIGNvbnRlbnQ6IGZ1bmN0aW9uKGNvbnRlbnQpIHsKLSAg
ICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250ZW50JywgY29udGVudC5zdHJpbmcpOwotICAgIH0s
Ci0KLSAgICBtdXN0YWNoZTogZnVuY3Rpb24obXVzdGFjaGUpIHsKLSAgICAgIHRoaXMuc2V4cHIo
bXVzdGFjaGUuc2V4cHIpOwotCi0gICAgICBpZihtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9w
dGlvbnMubm9Fc2NhcGUpIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTsK
LSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTsKLSAgICAgIH0K
LSAgICB9LAotCi0gICAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBp
bnZlcnNlKSB7Ci0gICAgICB2YXIgaWQgPSBzZXhwci5pZCwKLSAgICAgICAgICBuYW1lID0gaWQu
cGFydHNbMF0sCi0gICAgICAgICAgaXNCbG9jayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNl
ICE9IG51bGw7Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgaWQuZGVwdGgpOwot
Ci0gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKLSAgICAgIHRoaXMu
b3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpOwotCi0gICAgICB0aGlzLm9wY29kZSgnaW52
b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7Ci0gICAgfSwKLQotICAgIHNpbXBsZVNleHBy
OiBmdW5jdGlvbihzZXhwcikgewotICAgICAgdmFyIGlkID0gc2V4cHIuaWQ7Ci0KLSAgICAgIGlm
IChpZC50eXBlID09PSAnREFUQScpIHsKLSAgICAgICAgdGhpcy5EQVRBKGlkKTsKLSAgICAgIH0g
ZWxzZSBpZiAoaWQucGFydHMubGVuZ3RoKSB7Ci0gICAgICAgIHRoaXMuSUQoaWQpOwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgLy8gU2ltcGxpZmllZCBJRCBmb3IgYHRoaXNgCi0gICAgICAgIHRo
aXMuYWRkRGVwdGgoaWQuZGVwdGgpOwotICAgICAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcs
IGlkLmRlcHRoKTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0gICAgICB9
Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdyZXNvbHZlUG9zc2libGVMYW1iZGEnKTsKLSAgICB9LAot
Ci0gICAgaGVscGVyU2V4cHI6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7Ci0g
ICAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJv
Z3JhbSwgaW52ZXJzZSksCi0gICAgICAgICAgbmFtZSA9IHNleHByLmlkLnBhcnRzWzBdOwotCi0g
ICAgICBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc1tuYW1lXSkgewotICAgICAgICB0aGlz
Lm9wY29kZSgnaW52b2tlS25vd25IZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKLSAgICAg
IH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc09ubHkpIHsKLSAgICAgICAgdGhy
b3cgbmV3IEV4Y2VwdGlvbigiWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNl
ZCB0aGUgdW5rbm93biBoZWxwZXIgIiArIG5hbWUsIHNleHByKTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VIZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lLCBz
ZXhwci5pc1Jvb3QpOwotICAgICAgfQotICAgIH0sCi0KLSAgICBzZXhwcjogZnVuY3Rpb24oc2V4
cHIpIHsKLSAgICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKHNleHByKTsKLQotICAg
ICAgaWYgKHR5cGUgPT09ICJzaW1wbGUiKSB7Ci0gICAgICAgIHRoaXMuc2ltcGxlU2V4cHIoc2V4
cHIpOwotICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiaGVscGVyIikgewotICAgICAgICB0aGlz
LmhlbHBlclNleHByKHNleHByKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuYW1iaWd1
b3VzU2V4cHIoc2V4cHIpOwotICAgICAgfQotICAgIH0sCi0KLSAgICBJRDogZnVuY3Rpb24oaWQp
IHsKLSAgICAgIHRoaXMuYWRkRGVwdGgoaWQuZGVwdGgpOwotICAgICAgdGhpcy5vcGNvZGUoJ2dl
dENvbnRleHQnLCBpZC5kZXB0aCk7Ci0KLSAgICAgIHZhciBuYW1lID0gaWQucGFydHNbMF07Ci0g
ICAgICBpZiAoIW5hbWUpIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0g
ICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgaWQu
cGFydHNbMF0pOwotICAgICAgfQotCi0gICAgICBmb3IodmFyIGk9MSwgbD1pZC5wYXJ0cy5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXAnLCBpZC5wYXJ0c1tp
XSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIERBVEE6IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAg
IHRoaXMub3B0aW9ucy5kYXRhID0gdHJ1ZTsKLSAgICAgIGlmIChkYXRhLmlkLmlzU2NvcGVkIHx8
IGRhdGEuaWQuZGVwdGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignU2NvcGVkIGRh
dGEgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZDogJyArIGRhdGEub3JpZ2luYWwsIGRhdGEp
OwotICAgICAgfQotCi0gICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScpOwotICAgICAgdmFy
IHBhcnRzID0gZGF0YS5pZC5wYXJ0czsKLSAgICAgIGZvcih2YXIgaT0wLCBsPXBhcnRzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cCcsIHBhcnRzW2ldKTsK
LSAgICAgIH0KLSAgICB9LAotCi0gICAgU1RSSU5HOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICAg
IHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5nJywgc3RyaW5nLnN0cmluZyk7Ci0gICAgfSwKLQotICAg
IElOVEVHRVI6IGZ1bmN0aW9uKGludGVnZXIpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0
ZXJhbCcsIGludGVnZXIuaW50ZWdlcik7Ci0gICAgfSwKLQotICAgIEJPT0xFQU46IGZ1bmN0aW9u
KGJvb2wpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsIGJvb2wuYm9vbCk7Ci0g
ICAgfSwKLQotICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKCkge30sCi0KLSAgICAvLyBIRUxQRVJTCi0g
ICAgb3Bjb2RlOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICB0aGlzLm9wY29kZXMucHVzaCh7IG9w
Y29kZTogbmFtZSwgYXJnczogW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpIH0pOwotICAgIH0s
Ci0KLSAgICBkZWNsYXJlOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICAgICAgdGhpcy5vcGNv
ZGVzLnB1c2goeyBvcGNvZGU6ICdERUNMQVJFJywgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0p
OwotICAgIH0sCi0KLSAgICBhZGREZXB0aDogZnVuY3Rpb24oZGVwdGgpIHsKLSAgICAgIGlmKGRl
cHRoID09PSAwKSB7IHJldHVybjsgfQotCi0gICAgICBpZighdGhpcy5kZXB0aHNbZGVwdGhdKSB7
Ci0gICAgICAgIHRoaXMuZGVwdGhzW2RlcHRoXSA9IHRydWU7Ci0gICAgICAgIHRoaXMuZGVwdGhz
Lmxpc3QucHVzaChkZXB0aCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIGNsYXNzaWZ5U2V4cHI6
IGZ1bmN0aW9uKHNleHByKSB7Ci0gICAgICB2YXIgaXNIZWxwZXIgICA9IHNleHByLmlzSGVscGVy
OwotICAgICAgdmFyIGlzRWxpZ2libGUgPSBzZXhwci5lbGlnaWJsZUhlbHBlcjsKLSAgICAgIHZh
ciBvcHRpb25zICAgID0gdGhpcy5vcHRpb25zOwotCi0gICAgICAvLyBpZiBhbWJpZ3VvdXMsIHdl
IGNhbiBwb3NzaWJseSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgbm93Ci0gICAgICBpZiAoaXNFbGln
aWJsZSAmJiAhaXNIZWxwZXIpIHsKLSAgICAgICAgdmFyIG5hbWUgPSBzZXhwci5pZC5wYXJ0c1sw
XTsKLQotICAgICAgICBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHsKLSAgICAgICAg
ICBpc0hlbHBlciA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBl
cnNPbmx5KSB7Ci0gICAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAg
ICB9Ci0KLSAgICAgIGlmIChpc0hlbHBlcikgeyByZXR1cm4gImhlbHBlciI7IH0KLSAgICAgIGVs
c2UgaWYgKGlzRWxpZ2libGUpIHsgcmV0dXJuICJhbWJpZ3VvdXMiOyB9Ci0gICAgICBlbHNlIHsg
cmV0dXJuICJzaW1wbGUiOyB9Ci0gICAgfSwKLQotICAgIHB1c2hQYXJhbXM6IGZ1bmN0aW9uKHBh
cmFtcykgewotICAgICAgdmFyIGkgPSBwYXJhbXMubGVuZ3RoLCBwYXJhbTsKLQotICAgICAgd2hp
bGUoaS0tKSB7Ci0gICAgICAgIHBhcmFtID0gcGFyYW1zW2ldOwotCi0gICAgICAgIGlmKHRoaXMu
b3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAgICAgICAgICBpZihwYXJhbS5kZXB0aCkgewotICAg
ICAgICAgICAgdGhpcy5hZGREZXB0aChwYXJhbS5kZXB0aCk7Ci0gICAgICAgICAgfQotCi0gICAg
ICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKLSAgICAg
ICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVl
LCBwYXJhbS50eXBlKTsKLQotICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSAnc2V4cHInKSB7
Ci0gICAgICAgICAgICAvLyBTdWJleHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQg
aW4KLSAgICAgICAgICAgIC8vIGluIHN0cmluZyBwYXJhbXMgbW9kZS4KLSAgICAgICAgICAgIHRo
aXMuc2V4cHIocGFyYW0pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICB0aGlzW3BhcmFtLnR5cGVdKHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0K
LSAgICBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtczogZnVuY3Rpb24oc2V4cHIsIHByb2dyYW0sIGlu
dmVyc2UpIHsKLSAgICAgIHZhciBwYXJhbXMgPSBzZXhwci5wYXJhbXM7Ci0gICAgICB0aGlzLnB1
c2hQYXJhbXMocGFyYW1zKTsKLQotICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJv
Z3JhbSk7Ci0gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKLQotICAg
ICAgaWYgKHNleHByLmhhc2gpIHsKLSAgICAgICAgdGhpcy5oYXNoKHNleHByLmhhc2gpOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLSAgfTsKLQotICBmdW5jdGlvbiBwcmVjb21w
aWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKLSAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAodHlw
ZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC5jb25zdHJ1Y3RvciAhPT0gZW52LkFTVC5Q
cm9ncmFtTm9kZSkpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIllvdSBtdXN0IHBhc3Mg
YSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5wcmVjb21waWxlLiBZb3Ug
cGFzc2VkICIgKyBpbnB1dCk7Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307
Ci0gICAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7Ci0gICAgICBvcHRpb25zLmRhdGEgPSB0
cnVlOwotICAgIH0KLQotICAgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQpOwotICAgIHZhciBl
bnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7Ci0g
ICAgcmV0dXJuIG5ldyBlbnYuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVu
dCwgb3B0aW9ucyk7Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5wcmVjb21waWxlID0gcHJlY29tcGls
ZTtmdW5jdGlvbiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsKLSAgICBpZiAoaW5wdXQg
PT0gbnVsbCB8fCAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC5jb25zdHJ1Y3Rv
ciAhPT0gZW52LkFTVC5Qcm9ncmFtTm9kZSkpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24o
IllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5j
b21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1dCk7Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG9w
dGlvbnMgfHwge307Ci0KLSAgICBpZiAoISgnZGF0YScgaW4gb3B0aW9ucykpIHsKLSAgICAgIG9w
dGlvbnMuZGF0YSA9IHRydWU7Ci0gICAgfQotCi0gICAgdmFyIGNvbXBpbGVkOwotCi0gICAgZnVu
Y3Rpb24gY29tcGlsZUlucHV0KCkgewotICAgICAgdmFyIGFzdCA9IGVudi5wYXJzZShpbnB1dCk7
Ci0gICAgICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3Qs
IG9wdGlvbnMpOwotICAgICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5ldyBlbnYuSmF2YVNjcmlwdENv
bXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTsK
LSAgICAgIHJldHVybiBlbnYudGVtcGxhdGUodGVtcGxhdGVTcGVjKTsKLSAgICB9Ci0KLSAgICAv
LyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVy
IHRoYXQgcG9pbnQuCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAg
ICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsK
LSAgICAgIH0KLSAgICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIG9wdGlv
bnMpOwotICAgIH07Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5jb21waWxlID0gY29tcGlsZTsKLSAg
cmV0dXJuIF9fZXhwb3J0c19fOwotfSkoX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzL2Nv
bXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIuanMKLXZhciBfX21vZHVsZTExX18gPSAoZnVuY3Rp
b24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18pIHsKLSAgInVzZSBzdHJpY3QiOwot
ICB2YXIgX19leHBvcnRzX187Ci0gIHZhciBDT01QSUxFUl9SRVZJU0lPTiA9IF9fZGVwZW5kZW5j
eTFfXy5DT01QSUxFUl9SRVZJU0lPTjsKLSAgdmFyIFJFVklTSU9OX0NIQU5HRVMgPSBfX2RlcGVu
ZGVuY3kxX18uUkVWSVNJT05fQ0hBTkdFUzsKLSAgdmFyIGxvZyA9IF9fZGVwZW5kZW5jeTFfXy5s
b2c7Ci0gIHZhciBFeGNlcHRpb24gPSBfX2RlcGVuZGVuY3kyX187Ci0KLSAgZnVuY3Rpb24gTGl0
ZXJhbCh2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIGZ1bmN0aW9u
IEphdmFTY3JpcHRDb21waWxlcigpIHt9Ci0KLSAgSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlw
ZSA9IHsKLSAgICAvLyBQVUJMSUMgQVBJOiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMg
aW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCi0gICAgLy8gYWx0ZXJuYXRpdmUgY29tcGlsZWQgZm9y
bXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZmZXJpbmcgc2VtYW50aWNzCi0gICAgbmFtZUxvb2t1
cDogZnVuY3Rpb24ocGFyZW50LCBuYW1lIC8qICwgdHlwZSovKSB7Ci0gICAgICB2YXIgd3JhcCwK
LSAgICAgICAgICByZXQ7Ci0gICAgICBpZiAocGFyZW50LmluZGV4T2YoJ2RlcHRoJykgPT09IDAp
IHsKLSAgICAgICAgd3JhcCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgvXlswLTldKyQv
LnRlc3QobmFtZSkpIHsKLSAgICAgICAgcmV0ID0gcGFyZW50ICsgIlsiICsgbmFtZSArICJdIjsK
LSAgICAgIH0gZWxzZSBpZiAoSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFy
aWFibGVOYW1lKG5hbWUpKSB7Ci0gICAgICAgIHJldCA9IHBhcmVudCArICIuIiArIG5hbWU7Ci0g
ICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgcmV0ID0gcGFyZW50ICsgIlsnIiArIG5hbWUg
KyAiJ10iOwotICAgICAgfQotCi0gICAgICBpZiAod3JhcCkgewotICAgICAgICByZXR1cm4gJygn
ICsgcGFyZW50ICsgJyAmJiAnICsgcmV0ICsgJyknOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAg
cmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgY29tcGlsZXJJbmZvOiBmdW5jdGlv
bigpIHsKLSAgICAgIHZhciByZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OLAotICAgICAgICAg
IHZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tyZXZpc2lvbl07Ci0gICAgICByZXR1cm4gInRo
aXMuY29tcGlsZXJJbmZvID0gWyIrcmV2aXNpb24rIiwnIit2ZXJzaW9ucysiJ107XG4iOwotICAg
IH0sCi0KLSAgICBhcHBlbmRUb0J1ZmZlcjogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgICBpZiAo
dGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkgewotICAgICAgICByZXR1cm4gInJldHVybiAiICsg
c3RyaW5nICsgIjsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHsKLSAgICAgICAg
ICBhcHBlbmRUb0J1ZmZlcjogdHJ1ZSwKLSAgICAgICAgICBjb250ZW50OiBzdHJpbmcsCi0gICAg
ICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gImJ1ZmZlciArPSAiICsgc3RyaW5n
ICsgIjsiOyB9Ci0gICAgICAgIH07Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIGluaXRpYWxpemVC
dWZmZXI6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMucXVvdGVkU3RyaW5nKCIiKTsK
LSAgICB9LAotCi0gICAgbmFtZXNwYWNlOiAiSGFuZGxlYmFycyIsCi0gICAgLy8gRU5EIFBVQkxJ
QyBBUEkKLQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250
ZXh0LCBhc09iamVjdCkgewotICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50Owot
ICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgICAgbG9nKCdkZWJ1Zycs
IHRoaXMuZW52aXJvbm1lbnQuZGlzYXNzZW1ibGUoKSArICJcblxuIik7Ci0KLSAgICAgIHRoaXMu
bmFtZSA9IHRoaXMuZW52aXJvbm1lbnQubmFtZTsKLSAgICAgIHRoaXMuaXNDaGlsZCA9ICEhY29u
dGV4dDsKLSAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQgfHwgewotICAgICAgICBwcm9ncmFt
czogW10sCi0gICAgICAgIGVudmlyb25tZW50czogW10sCi0gICAgICAgIGFsaWFzZXM6IHsgfQot
ICAgICAgfTsKLQotICAgICAgdGhpcy5wcmVhbWJsZSgpOwotCi0gICAgICB0aGlzLnN0YWNrU2xv
dCA9IDA7Ci0gICAgICB0aGlzLnN0YWNrVmFycyA9IFtdOwotICAgICAgdGhpcy5yZWdpc3RlcnMg
PSB7IGxpc3Q6IFtdIH07Ci0gICAgICB0aGlzLmhhc2hlcyA9IFtdOwotICAgICAgdGhpcy5jb21w
aWxlU3RhY2sgPSBbXTsKLSAgICAgIHRoaXMuaW5saW5lU3RhY2sgPSBbXTsKLQotICAgICAgdGhp
cy5jb21waWxlQ2hpbGRyZW4oZW52aXJvbm1lbnQsIG9wdGlvbnMpOwotCi0gICAgICB2YXIgb3Bj
b2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsIG9wY29kZTsKLQotICAgICAgdGhpcy5pID0gMDsK
LQotICAgICAgZm9yKHZhciBsPW9wY29kZXMubGVuZ3RoOyB0aGlzLmk8bDsgdGhpcy5pKyspIHsK
LSAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1t0aGlzLmldOwotCi0gICAgICAgIGlmKG9wY29kZS5v
cGNvZGUgPT09ICdERUNMQVJFJykgewotICAgICAgICAgIHRoaXNbb3Bjb2RlLm5hbWVdID0gb3Bj
b2RlLnZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXNbb3Bjb2RlLm9wY29k
ZV0uYXBwbHkodGhpcywgb3Bjb2RlLmFyZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVz
ZXQgdGhlIHN0cmlwTmV4dCBmbGFnIGlmIGl0IHdhcyBub3Qgc2V0IGJ5IHRoaXMgb3BlcmF0aW9u
LgotICAgICAgICBpZiAob3Bjb2RlLm9wY29kZSAhPT0gdGhpcy5zdHJpcE5leHQpIHsKLSAgICAg
ICAgICB0aGlzLnN0cmlwTmV4dCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAg
IC8vIEZsdXNoIGFueSB0cmFpbGluZyBjb250ZW50IHRoYXQgbWlnaHQgYmUgcGVuZGluZy4KLSAg
ICAgIHRoaXMucHVzaFNvdXJjZSgnJyk7Ci0KLSAgICAgIGlmICh0aGlzLnN0YWNrU2xvdCB8fCB0
aGlzLmlubGluZVN0YWNrLmxlbmd0aCB8fCB0aGlzLmNvbXBpbGVTdGFjay5sZW5ndGgpIHsKLSAg
ICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignQ29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50
IGxlZnQgb24gc3RhY2snKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVu
Y3Rpb25Db250ZXh0KGFzT2JqZWN0KTsKLSAgICB9LAotCi0gICAgcHJlYW1ibGU6IGZ1bmN0aW9u
KCkgewotICAgICAgdmFyIG91dCA9IFtdOwotCi0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkgewot
ICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5uYW1lc3BhY2U7Ci0KLSAgICAgICAgdmFyIGNv
cGllcyA9ICJoZWxwZXJzID0gdGhpcy5tZXJnZShoZWxwZXJzLCAiICsgbmFtZXNwYWNlICsgIi5o
ZWxwZXJzKTsiOwotICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7IGNv
cGllcyA9IGNvcGllcyArICIgcGFydGlhbHMgPSB0aGlzLm1lcmdlKHBhcnRpYWxzLCAiICsgbmFt
ZXNwYWNlICsgIi5wYXJ0aWFscyk7IjsgfQotICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEp
IHsgY29waWVzID0gY29waWVzICsgIiBkYXRhID0gZGF0YSB8fCB7fTsiOyB9Ci0gICAgICAgIG91
dC5wdXNoKGNvcGllcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQucHVzaCgnJyk7Ci0g
ICAgICB9Ci0KLSAgICAgIGlmICghdGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkgewotICAgICAg
ICBvdXQucHVzaCgiLCBidWZmZXIgPSAiICsgdGhpcy5pbml0aWFsaXplQnVmZmVyKCkpOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgb3V0LnB1c2goIiIpOwotICAgICAgfQotCi0gICAgICAvLyB0
cmFjayB0aGUgbGFzdCBjb250ZXh0IHB1c2hlZCBpbnRvIHBsYWNlIHRvIGFsbG93IHNraXBwaW5n
IHRoZQotICAgICAgLy8gZ2V0Q29udGV4dCBvcGNvZGUgd2hlbiBpdCB3b3VsZCBiZSBhIG5vb3AK
LSAgICAgIHRoaXMubGFzdENvbnRleHQgPSAwOwotICAgICAgdGhpcy5zb3VyY2UgPSBvdXQ7Ci0g
ICAgfSwKLQotICAgIGNyZWF0ZUZ1bmN0aW9uQ29udGV4dDogZnVuY3Rpb24oYXNPYmplY3QpIHsK
LSAgICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMu
bGlzdCk7Ci0KLSAgICAgIGlmKGxvY2Fscy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIHRoaXMuc291
cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAiLCAiICsgbG9jYWxzLmpvaW4oIiwgIik7Ci0gICAg
ICB9Ci0KLSAgICAgIC8vIEdlbmVyYXRlIG1pbmltaXplciBhbGlhcyBtYXBwaW5ncwotICAgICAg
aWYgKCF0aGlzLmlzQ2hpbGQpIHsKLSAgICAgICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5jb250
ZXh0LmFsaWFzZXMpIHsKLSAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LmFsaWFzZXMuaGFzT3du
UHJvcGVydHkoYWxpYXMpKSB7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZVsxXSA9IHRoaXMuc291
cmNlWzFdICsgJywgJyArIGFsaWFzICsgJz0nICsgdGhpcy5jb250ZXh0LmFsaWFzZXNbYWxpYXNd
OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAodGhpcy5zb3Vy
Y2VbMV0pIHsKLSAgICAgICAgdGhpcy5zb3VyY2VbMV0gPSAidmFyICIgKyB0aGlzLnNvdXJjZVsx
XS5zdWJzdHJpbmcoMikgKyAiOyI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE1lcmdlIGNoaWxkcmVu
Ci0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkgewotICAgICAgICB0aGlzLnNvdXJjZVsxXSArPSAn
XG4nICsgdGhpcy5jb250ZXh0LnByb2dyYW1zLmpvaW4oJ1xuJykgKyAnXG4nOwotICAgICAgfQot
Ci0gICAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKLSAgICAgICAgdGhpcy5w
dXNoU291cmNlKCJyZXR1cm4gYnVmZmVyOyIpOwotICAgICAgfQotCi0gICAgICB2YXIgcGFyYW1z
ID0gdGhpcy5pc0NoaWxkID8gWyJkZXB0aDAiLCAiZGF0YSJdIDogWyJIYW5kbGViYXJzIiwgImRl
cHRoMCIsICJoZWxwZXJzIiwgInBhcnRpYWxzIiwgImRhdGEiXTsKLQotICAgICAgZm9yKHZhciBp
PTAsIGw9dGhpcy5lbnZpcm9ubWVudC5kZXB0aHMubGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICAgIHBhcmFtcy5wdXNoKCJkZXB0aCIgKyB0aGlzLmVudmlyb25tZW50LmRlcHRocy5saXN0
W2ldKTsKLSAgICAgIH0KLQotICAgICAgLy8gUGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhl
IG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdoZW4gcG9zc2libGUKLSAgICAgIHZhciBzb3VyY2Ug
PSB0aGlzLm1lcmdlU291cmNlKCk7Ci0KLSAgICAgIGlmICghdGhpcy5pc0NoaWxkKSB7Ci0gICAg
ICAgIHNvdXJjZSA9IHRoaXMuY29tcGlsZXJJbmZvKCkrc291cmNlOwotICAgICAgfQotCi0gICAg
ICBpZiAoYXNPYmplY3QpIHsKLSAgICAgICAgcGFyYW1zLnB1c2goc291cmNlKTsKLQotICAgICAg
ICByZXR1cm4gRnVuY3Rpb24uYXBwbHkodGhpcywgcGFyYW1zKTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHZhciBmdW5jdGlvblNvdXJjZSA9ICdmdW5jdGlvbiAnICsgKHRoaXMubmFtZSB8fCAn
JykgKyAnKCcgKyBwYXJhbXMuam9pbignLCcpICsgJykge1xuICAnICsgc291cmNlICsgJ30nOwot
ICAgICAgICBsb2coJ2RlYnVnJywgZnVuY3Rpb25Tb3VyY2UgKyAiXG5cbiIpOwotICAgICAgICBy
ZXR1cm4gZnVuY3Rpb25Tb3VyY2U7Ci0gICAgICB9Ci0gICAgfSwKLSAgICBtZXJnZVNvdXJjZTog
ZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBXQVJOOiBXZSBhcmUgbm90IGhhbmRsaW5nIHRoZSBjYXNl
IHdoZXJlIGJ1ZmZlciBpcyBzdGlsbCBwb3B1bGF0ZWQgYXMgdGhlIHNvdXJjZSBzaG91bGQKLSAg
ICAgIC8vIG5vdCBoYXZlIGJ1ZmZlciBhcHBlbmQgb3BlcmF0aW9ucyBhcyB0aGVpciBmaW5hbCBh
Y3Rpb24uCi0gICAgICB2YXIgc291cmNlID0gJycsCi0gICAgICAgICAgYnVmZmVyOwotICAgICAg
Zm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7
Ci0gICAgICAgIHZhciBsaW5lID0gdGhpcy5zb3VyY2VbaV07Ci0gICAgICAgIGlmIChsaW5lLmFw
cGVuZFRvQnVmZmVyKSB7Ci0gICAgICAgICAgaWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgYnVm
ZmVyID0gYnVmZmVyICsgJ1xuICAgICsgJyArIGxpbmUuY29udGVudDsKLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgYnVmZmVyID0gbGluZS5jb250ZW50OwotICAgICAgICAgIH0KLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgICAgICBzb3Vy
Y2UgKz0gJ2J1ZmZlciArPSAnICsgYnVmZmVyICsgJztcbiAgJzsKLSAgICAgICAgICAgIGJ1ZmZl
ciA9IHVuZGVmaW5lZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc291cmNlICs9IGxpbmUgKyAn
XG4gICc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfSwK
LQotICAgIC8vIFtibG9ja1ZhbHVlXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTog
aGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJl
dHVybiB2YWx1ZSBvZiBibG9ja0hlbHBlck1pc3NpbmcKLSAgICAvLwotICAgIC8vIFRoZSBwdXJw
b3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRha2UgYSBibG9jayBvZiB0aGUgZm9ybQotICAgIC8v
IGB7eyNmb299fS4uLnt7L2Zvb319YCwgcmVzb2x2ZSB0aGUgdmFsdWUgb2YgYGZvb2AsIGFuZAot
ICAgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJs
eQotICAgIC8vIGludm9raW5nIGJsb2NrSGVscGVyTWlzc2luZy4KLSAgICBibG9ja1ZhbHVlOiBm
dW5jdGlvbigpIHsKLSAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLmJsb2NrSGVscGVyTWlzc2lu
ZyA9ICdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZyc7Ci0KLSAgICAgIHZhciBwYXJhbXMgPSBb
ImRlcHRoMCJdOwotICAgICAgdGhpcy5zZXR1cFBhcmFtcygwLCBwYXJhbXMpOwotCi0gICAgICB0
aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbihjdXJyZW50KSB7Ci0gICAgICAgIHBhcmFtcy5zcGxp
Y2UoMSwgMCwgY3VycmVudCk7Ci0gICAgICAgIHJldHVybiAiYmxvY2tIZWxwZXJNaXNzaW5nLmNh
bGwoIiArIHBhcmFtcy5qb2luKCIsICIpICsgIikiOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAg
IC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9y
ZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWUKLSAgICAvLyBDb21waWxlciB2YWx1ZSwg
YmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9mIGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKLSAg
ICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIG5vIGxhc3RIZWxwZXI6IHNhbWUgYXMgW2Jsb2NrVmFs
dWVdCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBsYXN0SGVscGVyOiB2YWx1ZQotICAgIGFt
YmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFz
ZXMuYmxvY2tIZWxwZXJNaXNzaW5nID0gJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJzsKLQot
ICAgICAgdmFyIHBhcmFtcyA9IFsiZGVwdGgwIl07Ci0gICAgICB0aGlzLnNldHVwUGFyYW1zKDAs
IHBhcmFtcyk7Ci0KLSAgICAgIHZhciBjdXJyZW50ID0gdGhpcy50b3BTdGFjaygpOwotICAgICAg
cGFyYW1zLnNwbGljZSgxLCAwLCBjdXJyZW50KTsKLQotICAgICAgdGhpcy5wdXNoU291cmNlKCJp
ZiAoISIgKyB0aGlzLmxhc3RIZWxwZXIgKyAiKSB7ICIgKyBjdXJyZW50ICsgIiA9IGJsb2NrSGVs
cGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMuam9pbigiLCAiKSArICIpOyB9Iik7Ci0gICAgfSwK
LQotICAgIC8vIFthcHBlbmRDb250ZW50XQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9y
ZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAvLwotICAgIC8vIEFwcGVu
ZHMgdGhlIHN0cmluZyB2YWx1ZSBvZiBgY29udGVudGAgdG8gdGhlIGN1cnJlbnQgYnVmZmVyCi0g
ICAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24oY29udGVudCkgewotICAgICAgaWYgKHRoaXMucGVu
ZGluZ0NvbnRlbnQpIHsKLSAgICAgICAgY29udGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQgKyBj
b250ZW50OwotICAgICAgfQotICAgICAgaWYgKHRoaXMuc3RyaXBOZXh0KSB7Ci0gICAgICAgIGNv
bnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15ccysvLCAnJyk7Ci0gICAgICB9Ci0KLSAgICAgIHRo
aXMucGVuZGluZ0NvbnRlbnQgPSBjb250ZW50OwotICAgIH0sCi0KLSAgICAvLyBbc3RyaXBdCi0g
ICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0
ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gUmVtb3ZlcyBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSBm
cm9tIHRoZSBwcmlvciBjb250ZW50IG5vZGUgYW5kIGZsYWdzCi0gICAgLy8gdGhlIG5leHQgb3Bl
cmF0aW9uIGZvciBzdHJpcHBpbmcgaWYgaXQgaXMgYSBjb250ZW50IG5vZGUuCi0gICAgc3RyaXA6
IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKLSAgICAgICAg
dGhpcy5wZW5kaW5nQ29udGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQucmVwbGFjZSgvXHMrJC8s
ICcnKTsKLSAgICAgIH0KLSAgICAgIHRoaXMuc3RyaXBOZXh0ID0gJ3N0cmlwJzsKLSAgICB9LAot
Ci0gICAgLy8gW2FwcGVuZF0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVl
LCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gQ29lcmNl
cyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZl
ci4KLSAgICAvLwotICAgIC8vIElmIGB2YWx1ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2Vy
Y2VkIGludG8gYSBzdHJpbmcgYW5kIGFwcGVuZGVkCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1w
dHkgc3RyaW5nIGlzIGFwcGVuZGVkCi0gICAgYXBwZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgIC8v
IEZvcmNlIGFueXRoaW5nIHRoYXQgaXMgaW5saW5lZCBvbnRvIHRoZSBzdGFjayBzbyB3ZSBkb24n
dCBoYXZlIGR1cGxpY2F0aW9uCi0gICAgICAvLyB3aGVuIHdlIGV4YW1pbmUgbG9jYWwKLSAgICAg
IHRoaXMuZmx1c2hJbmxpbmUoKTsKLSAgICAgIHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTsK
LSAgICAgIHRoaXMucHVzaFNvdXJjZSgiaWYoIiArIGxvY2FsICsgIiB8fCAiICsgbG9jYWwgKyAi
ID09PSAwKSB7ICIgKyB0aGlzLmFwcGVuZFRvQnVmZmVyKGxvY2FsKSArICIgfSIpOwotICAgICAg
aWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUpIHsKLSAgICAgICAgdGhpcy5wdXNoU291cmNl
KCJlbHNlIHsgIiArIHRoaXMuYXBwZW5kVG9CdWZmZXIoIicnIikgKyAiIH0iKTsKLSAgICAgIH0K
LSAgICB9LAotCi0gICAgLy8gW2FwcGVuZEVzY2FwZWRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFj
aywgYmVmb3JlOiB2YWx1ZSwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAv
LwotICAgIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgotICAg
IGFwcGVuZEVzY2FwZWQ6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMu
ZXNjYXBlRXhwcmVzc2lvbiA9ICd0aGlzLmVzY2FwZUV4cHJlc3Npb24nOwotCi0gICAgICB0aGlz
LnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1ZmZlcigiZXNjYXBlRXhwcmVzc2lvbigiICsgdGhp
cy5wb3BTdGFjaygpICsgIikiKSk7Ci0gICAgfSwKLQotICAgIC8vIFtnZXRDb250ZXh0XQotICAg
IC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVy
OiAuLi4KLSAgICAvLyBDb21waWxlciB2YWx1ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoCi0g
ICAgLy8KLSAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVy
IHZhbHVlIHRvIHRoZSBkZXB0aAotICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uKGRlcHRoKSB7Ci0g
ICAgICBpZih0aGlzLmxhc3RDb250ZXh0ICE9PSBkZXB0aCkgewotICAgICAgICB0aGlzLmxhc3RD
b250ZXh0ID0gZGVwdGg7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8vIFtsb29rdXBPbkNvbnRl
eHRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFj
aywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25hbWVdLCAuLi4KLSAgICAvLwotICAgIC8vIExvb2tz
IHVwIHRoZSB2YWx1ZSBvZiBgbmFtZWAgb24gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVz
Ci0gICAgLy8gaXQgb250byB0aGUgc3RhY2suCi0gICAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlv
bihuYW1lKSB7Ci0gICAgICB0aGlzLnB1c2godGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlz
Lmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4dCcpKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hD
b250ZXh0XQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24g
c3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoZXMg
dGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNvbnRleHQgb250byB0aGUgc3RhY2suCi0gICAgcHVz
aENvbnRleHQ6IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkZXB0
aCcgKyB0aGlzLmxhc3RDb250ZXh0KTsKLSAgICB9LAotCi0gICAgLy8gW3Jlc29sdmVQb3NzaWJs
ZUxhbWJkYV0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KLSAg
ICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc29sdmVkIHZhbHVlLCAuLi4KLSAgICAvLwotICAgIC8v
IElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRhLCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQot
ICAgIC8vIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGxhbWJkYQotICAgIHJlc29sdmVQb3NzaWJs
ZUxhbWJkYTogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlv
blR5cGUgPSAnImZ1bmN0aW9uIic7Ci0KLSAgICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9u
KGN1cnJlbnQpIHsKLSAgICAgICAgcmV0dXJuICJ0eXBlb2YgIiArIGN1cnJlbnQgKyAiID09PSBm
dW5jdGlvblR5cGUgPyAiICsgY3VycmVudCArICIuYXBwbHkoZGVwdGgwKSA6ICIgKyBjdXJyZW50
OwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIFtsb29rdXBdCi0gICAgLy8KLSAgICAvLyBP
biBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1
ZVtuYW1lXSwgLi4uCi0gICAgLy8KLSAgICAvLyBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgc3Rh
Y2sgd2l0aCB0aGUgcmVzdWx0IG9mIGxvb2tpbmcKLSAgICAvLyB1cCBgbmFtZWAgb24gYHZhbHVl
YAotICAgIGxvb2t1cDogZnVuY3Rpb24obmFtZSkgewotICAgICAgdGhpcy5yZXBsYWNlU3RhY2so
ZnVuY3Rpb24oY3VycmVudCkgewotICAgICAgICByZXR1cm4gY3VycmVudCArICIgPT0gbnVsbCB8
fCAiICsgY3VycmVudCArICIgPT09IGZhbHNlID8gIiArIGN1cnJlbnQgKyAiIDogIiArIHRoaXMu
bmFtZUxvb2t1cChjdXJyZW50LCBuYW1lLCAnY29udGV4dCcpOwotICAgICAgfSk7Ci0gICAgfSwK
LQotICAgIC8vIFtsb29rdXBEYXRhXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTog
Li4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiBkYXRhLCAuLi4KLSAgICAvLwotICAgIC8vIFB1
c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9yCi0gICAgbG9va3VwRGF0YTogZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTsKLSAgICB9LAotCi0gICAgLy8g
W3B1c2hTdHJpbmdQYXJhbV0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgot
ICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogc3RyaW5nLCBjdXJyZW50Q29udGV4dCwgLi4uCi0gICAg
Ly8KLSAgICAvLyBUaGlzIG9wY29kZSBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2Rl
LCB3aGljaAotICAgIC8vIHByb3ZpZGVzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIg
YWxvbmcgd2l0aCBpdHMKLSAgICAvLyBkZXB0aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1t
ZWRpYXRlbHkuCi0gICAgcHVzaFN0cmluZ1BhcmFtOiBmdW5jdGlvbihzdHJpbmcsIHR5cGUpIHsK
LSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCk7
Ci0KLSAgICAgIHRoaXMucHVzaFN0cmluZyh0eXBlKTsKLQotICAgICAgLy8gSWYgaXQncyBhIHN1
YmV4cHJlc3Npb24sIHRoZSBzdHJpbmcgcmVzdWx0Ci0gICAgICAvLyB3aWxsIGJlIHB1c2hlZCBh
ZnRlciB0aGlzIG9wY29kZS4KLSAgICAgIGlmICh0eXBlICE9PSAnc2V4cHInKSB7Ci0gICAgICAg
IGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykgewotICAgICAgICAgIHRoaXMucHVzaFN0
cmluZyhzdHJpbmcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMucHVzaFN0YWNr
TGl0ZXJhbChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIGVtcHR5
SGFzaDogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ3t9Jyk7Ci0K
LSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVz
aCgne30nKTsgLy8gaGFzaENvbnRleHRzCi0gICAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFz
aFR5cGVzCi0gICAgICB9Ci0gICAgfSwKLSAgICBwdXNoSGFzaDogZnVuY3Rpb24oKSB7Ci0gICAg
ICBpZiAodGhpcy5oYXNoKSB7Ci0gICAgICAgIHRoaXMuaGFzaGVzLnB1c2godGhpcy5oYXNoKTsK
LSAgICAgIH0KLSAgICAgIHRoaXMuaGFzaCA9IHt2YWx1ZXM6IFtdLCB0eXBlczogW10sIGNvbnRl
eHRzOiBbXX07Ci0gICAgfSwKLSAgICBwb3BIYXNoOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBo
YXNoID0gdGhpcy5oYXNoOwotICAgICAgdGhpcy5oYXNoID0gdGhpcy5oYXNoZXMucG9wKCk7Ci0K
LSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVz
aCgneycgKyBoYXNoLmNvbnRleHRzLmpvaW4oJywnKSArICd9Jyk7Ci0gICAgICAgIHRoaXMucHVz
aCgneycgKyBoYXNoLnR5cGVzLmpvaW4oJywnKSArICd9Jyk7Ci0gICAgICB9Ci0KLSAgICAgIHRo
aXMucHVzaCgne1xuICAgICcgKyBoYXNoLnZhbHVlcy5qb2luKCcsXG4gICAgJykgKyAnXG4gIH0n
KTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hTdHJpbmddCi0gICAgLy8KLSAgICAvLyBPbiBzdGFj
aywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJp
bmcpLCAuLi4KLSAgICAvLwotICAgIC8vIFB1c2ggYSBxdW90ZWQgdmVyc2lvbiBvZiBgc3RyaW5n
YCBvbnRvIHRoZSBzdGFjawotICAgIHB1c2hTdHJpbmc6IGZ1bmN0aW9uKHN0cmluZykgewotICAg
ICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwotICAg
IH0sCi0KLSAgICAvLyBbcHVzaF0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4u
LgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogZXhwciwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNo
IGFuIGV4cHJlc3Npb24gb250byB0aGUgc3RhY2sKLSAgICBwdXNoOiBmdW5jdGlvbihleHByKSB7
Ci0gICAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7Ci0gICAgICByZXR1cm4gZXhwcjsK
LSAgICB9LAotCi0gICAgLy8gW3B1c2hMaXRlcmFsXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ss
IGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZSwgLi4uCi0gICAgLy8K
LSAgICAvLyBQdXNoZXMgYSB2YWx1ZSBvbnRvIHRoZSBzdGFjay4gVGhpcyBvcGVyYXRpb24gcHJl
dmVudHMKLSAgICAvLyB0aGUgY29tcGlsZXIgZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJp
YWJsZSB0byBob2xkCi0gICAgLy8gaXQuCi0gICAgcHVzaExpdGVyYWw6IGZ1bmN0aW9uKHZhbHVl
KSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodmFsdWUpOwotICAgIH0sCi0KLSAgICAv
LyBbcHVzaFByb2dyYW1dCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAg
ICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHByb2dyYW0oZ3VpZCksIC4uLgotICAgIC8vCi0gICAgLy8g
UHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBvbnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwotICAg
IC8vIGEgY29tcGlsZS10aW1lIGd1aWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBydW50aW1lLWFj
Y2Vzc2libGUKLSAgICAvLyBleHByZXNzaW9uLgotICAgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbihn
dWlkKSB7Ci0gICAgICBpZiAoZ3VpZCAhPSBudWxsKSB7Ci0gICAgICAgIHRoaXMucHVzaFN0YWNr
TGl0ZXJhbCh0aGlzLnByb2dyYW1FeHByZXNzaW9uKGd1aWQpKTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChudWxsKTsKLSAgICAgIH0KLSAgICB9LAotCi0g
ICAgLy8gW2ludm9rZUhlbHBlcl0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhh
c2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFm
dGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KLSAgICAvLwotICAgIC8vIFBvcHMgb2Zm
IHRoZSBoZWxwZXIncyBwYXJhbWV0ZXJzLCBpbnZva2VzIHRoZSBoZWxwZXIsCi0gICAgLy8gYW5k
IHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLgotICAgIC8v
Ci0gICAgLy8gSWYgdGhlIGhlbHBlciBpcyBub3QgZm91bmQsIGBoZWxwZXJNaXNzaW5nYCBpcyBj
YWxsZWQuCi0gICAgaW52b2tlSGVscGVyOiBmdW5jdGlvbihwYXJhbVNpemUsIG5hbWUsIGlzUm9v
dCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuaGVscGVyTWlzc2luZyA9ICdoZWxwZXJz
LmhlbHBlck1pc3NpbmcnOwotICAgICAgdGhpcy51c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAg
ICAgIHZhciBoZWxwZXIgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFt
U2l6ZSwgbmFtZSwgdHJ1ZSk7Ci0gICAgICB2YXIgbm9uSGVscGVyID0gdGhpcy5uYW1lTG9va3Vw
KCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4dCcpOwotCi0gICAgICB2
YXIgbG9va3VwID0gJ2hlbHBlciA9ICcgKyBoZWxwZXIubmFtZSArICcgfHwgJyArIG5vbkhlbHBl
cjsKLSAgICAgIGlmIChoZWxwZXIucGFyYW1zSW5pdCkgewotICAgICAgICBsb29rdXAgKz0gJywn
ICsgaGVscGVyLnBhcmFtc0luaXQ7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMucHVzaCgKLSAgICAg
ICAgJygnCi0gICAgICAgICAgKyBsb29rdXAKLSAgICAgICAgICArICcsaGVscGVyICcKLSAgICAg
ICAgICAgICsgJz8gaGVscGVyLmNhbGwoJyArIGhlbHBlci5jYWxsUGFyYW1zICsgJykgJwotICAg
ICAgICAgICAgKyAnOiBoZWxwZXJNaXNzaW5nLmNhbGwoJyArIGhlbHBlci5oZWxwZXJNaXNzaW5n
UGFyYW1zICsgJykpJyk7Ci0KLSAgICAgIC8vIEFsd2F5cyBmbHVzaCBzdWJleHByZXNzaW9ucy4g
VGhpcyBpcyBib3RoIHRvIHByZXZlbnQgdGhlIGNvbXBvdW5kaW5nIHNpemUgaXNzdWUgdGhhdAot
ICAgICAgLy8gb2NjdXJzIHdoZW4gdGhlIGNvZGUgaGFzIHRvIGJlIGR1cGxpY2F0ZWQgZm9yIGlu
bGluaW5nIGFuZCBhbHNvIHRvIHByZXZlbnQgZXJyb3JzCi0gICAgICAvLyBkdWUgdG8gdGhlIGlu
Y29ycmVjdCBvcHRpb25zIG9iamVjdCBiZWluZyBwYXNzZWQgZHVlIHRvIHRoZSBzaGFyZWQgcmVn
aXN0ZXIuCi0gICAgICBpZiAoIWlzUm9vdCkgewotICAgICAgICB0aGlzLmZsdXNoSW5saW5lKCk7
Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8vIFtpbnZva2VLbm93bkhlbHBlcl0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4u
LiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRp
b24KLSAgICAvLwotICAgIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVy
IGlzIGtub3duIHRvIGV4aXN0LAotICAgIC8vIHNvIGEgYGhlbHBlck1pc3NpbmdgIGZhbGxiYWNr
IGlzIG5vdCByZXF1aXJlZC4KLSAgICBpbnZva2VLbm93bkhlbHBlcjogZnVuY3Rpb24ocGFyYW1T
aXplLCBuYW1lKSB7Ci0gICAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNp
emUsIG5hbWUpOwotICAgICAgdGhpcy5wdXNoKGhlbHBlci5uYW1lICsgIi5jYWxsKCIgKyBoZWxw
ZXIuY2FsbFBhcmFtcyArICIpIik7Ci0gICAgfSwKLQotICAgIC8vIFtpbnZva2VBbWJpZ3VvdXNd
Ci0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFt
LCBwYXJhbXMuLi4sIC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2Ft
YmlndWF0aW9uCi0gICAgLy8KLSAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gYW4g
ZXhwcmVzc2lvbiBsaWtlIGB7e2Zvb319YAotICAgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9u
J3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hldGhlciBpdAotICAgIC8vIGlzIGEgaGVscGVyIG9y
IGEgcGF0aC4KLSAgICAvLwotICAgIC8vIFRoaXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0
aGFuIHRoZSBvdGhlciBvcHRpb25zLAotICAgIC8vIGFuZCBjYW4gYmUgYXZvaWRlZCBieSBwYXNz
aW5nIHRoZSBga25vd25IZWxwZXJzYCBhbmQKLSAgICAvLyBga25vd25IZWxwZXJzT25seWAgZmxh
Z3MgYXQgY29tcGlsZS10aW1lLgotICAgIGludm9rZUFtYmlndW91czogZnVuY3Rpb24obmFtZSwg
aGVscGVyQ2FsbCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuZnVuY3Rpb25UeXBlID0g
JyJmdW5jdGlvbiInOwotICAgICAgdGhpcy51c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAgICAg
IHRoaXMuZW1wdHlIYXNoKCk7Ci0gICAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigw
LCBuYW1lLCBoZWxwZXJDYWxsKTsKLQotICAgICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RI
ZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0KLSAg
ICAgIHZhciBub25IZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2RlcHRoJyArIHRoaXMubGFzdENv
bnRleHQsIG5hbWUsICdjb250ZXh0Jyk7Ci0gICAgICB2YXIgbmV4dFN0YWNrID0gdGhpcy5uZXh0
U3RhY2soKTsKLQotICAgICAgaWYgKGhlbHBlci5wYXJhbXNJbml0KSB7Ci0gICAgICAgIHRoaXMu
cHVzaFNvdXJjZShoZWxwZXIucGFyYW1zSW5pdCk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnB1c2hT
b3VyY2UoJ2lmIChoZWxwZXIgPSAnICsgaGVscGVyTmFtZSArICcpIHsgJyArIG5leHRTdGFjayAr
ICcgPSBoZWxwZXIuY2FsbCgnICsgaGVscGVyLmNhbGxQYXJhbXMgKyAnKTsgfScpOwotICAgICAg
dGhpcy5wdXNoU291cmNlKCdlbHNlIHsgaGVscGVyID0gJyArIG5vbkhlbHBlciArICc7ICcgKyBu
ZXh0U3RhY2sgKyAnID0gdHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNh
bGwoJyArIGhlbHBlci5jYWxsUGFyYW1zICsgJykgOiBoZWxwZXI7IH0nKTsKLSAgICB9LAotCi0g
ICAgLy8gW2ludm9rZVBhcnRpYWxdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBj
b250ZXh0LCAuLi4KLSAgICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52
b2NhdGlvbgotICAgIC8vCi0gICAgLy8gVGhpcyBvcGVyYXRpb24gcG9wcyBvZmYgYSBjb250ZXh0
LCBpbnZva2VzIGEgcGFydGlhbCB3aXRoIHRoYXQgY29udGV4dCwKLSAgICAvLyBhbmQgcHVzaGVz
IHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay4KLSAgICBpbnZva2VQYXJ0aWFsOiBm
dW5jdGlvbihuYW1lKSB7Ci0gICAgICB2YXIgcGFyYW1zID0gW3RoaXMubmFtZUxvb2t1cCgncGFy
dGlhbHMnLCBuYW1lLCAncGFydGlhbCcpLCAiJyIgKyBuYW1lICsgIiciLCB0aGlzLnBvcFN0YWNr
KCksICJoZWxwZXJzIiwgInBhcnRpYWxzIl07Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0
YSkgewotICAgICAgICBwYXJhbXMucHVzaCgiZGF0YSIpOwotICAgICAgfQotCi0gICAgICB0aGlz
LmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOwotICAgICAgdGhpcy5wdXNoKCJzZWxmLmlu
dm9rZVBhcnRpYWwoIiArIHBhcmFtcy5qb2luKCIsICIpICsgIikiKTsKLSAgICB9LAotCi0gICAg
Ly8gW2Fzc2lnblRvSGFzaF0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVl
LCBoYXNoLCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGhhc2gsIC4uLgotICAgIC8vCi0g
ICAgLy8gUG9wcyBhIHZhbHVlIGFuZCBoYXNoIG9mZiB0aGUgc3RhY2ssIGFzc2lnbnMgYGhhc2hb
a2V5XSA9IHZhbHVlYAotICAgIC8vIGFuZCBwdXNoZXMgdGhlIGhhc2ggYmFjayBvbnRvIHRoZSBz
dGFjay4KLSAgICBhc3NpZ25Ub0hhc2g6IGZ1bmN0aW9uKGtleSkgewotICAgICAgdmFyIHZhbHVl
ID0gdGhpcy5wb3BTdGFjaygpLAotICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgdHlwZTsK
LQotICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAgICAgICAgdHlwZSA9
IHRoaXMucG9wU3RhY2soKTsKLSAgICAgICAgY29udGV4dCA9IHRoaXMucG9wU3RhY2soKTsKLSAg
ICAgIH0KLQotICAgICAgdmFyIGhhc2ggPSB0aGlzLmhhc2g7Ci0gICAgICBpZiAoY29udGV4dCkg
ewotICAgICAgICBoYXNoLmNvbnRleHRzLnB1c2goIiciICsga2V5ICsgIic6ICIgKyBjb250ZXh0
KTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlKSB7Ci0gICAgICAgIGhhc2gudHlwZXMucHVzaCgi
JyIgKyBrZXkgKyAiJzogIiArIHR5cGUpOwotICAgICAgfQotICAgICAgaGFzaC52YWx1ZXMucHVz
aCgiJyIgKyBrZXkgKyAiJzogKCIgKyB2YWx1ZSArICIpIik7Ci0gICAgfSwKLQotICAgIC8vIEhF
TFBFUlMKLQotICAgIGNvbXBpbGVyOiBKYXZhU2NyaXB0Q29tcGlsZXIsCi0KLSAgICBjb21waWxl
Q2hpbGRyZW46IGZ1bmN0aW9uKGVudmlyb25tZW50LCBvcHRpb25zKSB7Ci0gICAgICB2YXIgY2hp
bGRyZW4gPSBlbnZpcm9ubWVudC5jaGlsZHJlbiwgY2hpbGQsIGNvbXBpbGVyOwotCi0gICAgICBm
b3IodmFyIGk9MCwgbD1jaGlsZHJlbi5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNoaWxk
ID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGNvbXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKTsK
LQotICAgICAgICB2YXIgaW5kZXggPSB0aGlzLm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsK
LQotICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgIHRoaXMuY29udGV4dC5w
cm9ncmFtcy5wdXNoKCcnKTsgICAgIC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25m
bGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgotICAgICAgICAgIGluZGV4ID0gdGhpcy5jb250ZXh0
LnByb2dyYW1zLmxlbmd0aDsKLSAgICAgICAgICBjaGlsZC5pbmRleCA9IGluZGV4OwotICAgICAg
ICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDsKLSAgICAgICAgICB0aGlzLmNvbnRl
eHQucHJvZ3JhbXNbaW5kZXhdID0gY29tcGlsZXIuY29tcGlsZShjaGlsZCwgb3B0aW9ucywgdGhp
cy5jb250ZXh0KTsKLSAgICAgICAgICB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzW2luZGV4XSA9
IGNoaWxkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7
Ci0gICAgICAgICAgY2hpbGQubmFtZSA9ICdwcm9ncmFtJyArIGluZGV4OwotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfSwKLSAgICBtYXRjaEV4aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24oY2hpbGQp
IHsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRz
Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHZhciBlbnZpcm9ubWVudCA9IHRoaXMu
Y29udGV4dC5lbnZpcm9ubWVudHNbaV07Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZp
cm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0K
LSAgICAgIH0KLSAgICB9LAotCi0gICAgcHJvZ3JhbUV4cHJlc3Npb246IGZ1bmN0aW9uKGd1aWQp
IHsKLSAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7Ci0KLSAgICAgIGlm
KGd1aWQgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gInNlbGYubm9vcCI7Ci0gICAgICB9Ci0K
LSAgICAgIHZhciBjaGlsZCA9IHRoaXMuZW52aXJvbm1lbnQuY2hpbGRyZW5bZ3VpZF0sCi0gICAg
ICAgICAgZGVwdGhzID0gY2hpbGQuZGVwdGhzLmxpc3QsIGRlcHRoOwotCi0gICAgICB2YXIgcHJv
Z3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgY2hpbGQubmFtZSwgImRhdGEiXTsKLQotICAgICAg
Zm9yKHZhciBpPTAsIGwgPSBkZXB0aHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICBkZXB0
aCA9IGRlcHRoc1tpXTsKLQotICAgICAgICBpZihkZXB0aCA9PT0gMSkgeyBwcm9ncmFtUGFyYW1z
LnB1c2goImRlcHRoMCIpOyB9Ci0gICAgICAgIGVsc2UgeyBwcm9ncmFtUGFyYW1zLnB1c2goImRl
cHRoIiArIChkZXB0aCAtIDEpKTsgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gKGRlcHRocy5s
ZW5ndGggPT09IDAgPyAic2VsZi5wcm9ncmFtKCIgOiAic2VsZi5wcm9ncmFtV2l0aERlcHRoKCIp
ICsgcHJvZ3JhbVBhcmFtcy5qb2luKCIsICIpICsgIikiOwotICAgIH0sCi0KLSAgICByZWdpc3Rl
cjogZnVuY3Rpb24obmFtZSwgdmFsKSB7Ci0gICAgICB0aGlzLnVzZVJlZ2lzdGVyKG5hbWUpOwot
ICAgICAgdGhpcy5wdXNoU291cmNlKG5hbWUgKyAiID0gIiArIHZhbCArICI7Iik7Ci0gICAgfSwK
LQotICAgIHVzZVJlZ2lzdGVyOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICBpZighdGhpcy5yZWdp
c3RlcnNbbmFtZV0pIHsKLSAgICAgICAgdGhpcy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwotICAg
ICAgICB0aGlzLnJlZ2lzdGVycy5saXN0LnB1c2gobmFtZSk7Ci0gICAgICB9Ci0gICAgfSwKLQot
ICAgIHB1c2hTdGFja0xpdGVyYWw6IGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB0aGlz
LnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwotICAgIH0sCi0KLSAgICBwdXNoU291cmNlOiBmdW5j
dGlvbihzb3VyY2UpIHsKLSAgICAgIGlmICh0aGlzLnBlbmRpbmdDb250ZW50KSB7Ci0gICAgICAg
IHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnF1b3RlZFN0cmluZyh0
aGlzLnBlbmRpbmdDb250ZW50KSkpOwotICAgICAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gdW5k
ZWZpbmVkOwotICAgICAgfQotCi0gICAgICBpZiAoc291cmNlKSB7Ci0gICAgICAgIHRoaXMuc291
cmNlLnB1c2goc291cmNlKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgcHVzaFN0YWNrOiBmdW5j
dGlvbihpdGVtKSB7Ci0gICAgICB0aGlzLmZsdXNoSW5saW5lKCk7Ci0KLSAgICAgIHZhciBzdGFj
ayA9IHRoaXMuaW5jclN0YWNrKCk7Ci0gICAgICBpZiAoaXRlbSkgewotICAgICAgICB0aGlzLnB1
c2hTb3VyY2Uoc3RhY2sgKyAiID0gIiArIGl0ZW0gKyAiOyIpOwotICAgICAgfQotICAgICAgdGhp
cy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7Ci0gICAgICByZXR1cm4gc3RhY2s7Ci0gICAgfSwK
LQotICAgIHJlcGxhY2VTdGFjazogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICAgIHZhciBwcmVm
aXggPSAnJywKLSAgICAgICAgICBpbmxpbmUgPSB0aGlzLmlzSW5saW5lKCksCi0gICAgICAgICAg
c3RhY2ssCi0gICAgICAgICAgY3JlYXRlZFN0YWNrLAotICAgICAgICAgIHVzZWRMaXRlcmFsOwot
Ci0gICAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGlubGluZSB0aGVuIHdlIHdhbnQgdG8gbWVy
Z2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUKLSAgICAgIC8vIHJlcGxhY2VtZW50IHN0
YXRlbWVudCB2aWEgJywnCi0gICAgICBpZiAoaW5saW5lKSB7Ci0gICAgICAgIHZhciB0b3AgPSB0
aGlzLnBvcFN0YWNrKHRydWUpOwotCi0gICAgICAgIGlmICh0b3AgaW5zdGFuY2VvZiBMaXRlcmFs
KSB7Ci0gICAgICAgICAgLy8gTGl0ZXJhbHMgZG8gbm90IG5lZWQgdG8gYmUgaW5saW5lZAotICAg
ICAgICAgIHN0YWNrID0gdG9wLnZhbHVlOwotICAgICAgICAgIHVzZWRMaXRlcmFsID0gdHJ1ZTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50
IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUgaW5saW5lCi0gICAgICAgICAgY3JlYXRlZFN0YWNr
ID0gIXRoaXMuc3RhY2tTbG90OwotICAgICAgICAgIHZhciBuYW1lID0gIWNyZWF0ZWRTdGFjayA/
IHRoaXMudG9wU3RhY2tOYW1lKCkgOiB0aGlzLmluY3JTdGFjaygpOwotCi0gICAgICAgICAgcHJl
Zml4ID0gJygnICsgdGhpcy5wdXNoKG5hbWUpICsgJyA9ICcgKyB0b3AgKyAnKSwnOwotICAgICAg
ICAgIHN0YWNrID0gdGhpcy50b3BTdGFjaygpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2Ugewot
ICAgICAgICBzdGFjayA9IHRoaXMudG9wU3RhY2soKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGl0
ZW0gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0YWNrKTsKLQotICAgICAgaWYgKGlubGluZSkgewot
ICAgICAgICBpZiAoIXVzZWRMaXRlcmFsKSB7Ci0gICAgICAgICAgdGhpcy5wb3BTdGFjaygpOwot
ICAgICAgICB9Ci0gICAgICAgIGlmIChjcmVhdGVkU3RhY2spIHsKLSAgICAgICAgICB0aGlzLnN0
YWNrU2xvdC0tOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHVzaCgnKCcgKyBwcmVmaXggKyBp
dGVtICsgJyknKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFByZXZlbnQgbW9kaWZpY2F0
aW9uIG9mIHRoZSBjb250ZXh0IGRlcHRoIHZhcmlhYmxlLiBUaHJvdWdoIHJlcGxhY2VTdGFjawot
ICAgICAgICBpZiAoIS9ec3RhY2svLnRlc3Qoc3RhY2spKSB7Ci0gICAgICAgICAgc3RhY2sgPSB0
aGlzLm5leHRTdGFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wdXNoU291cmNlKHN0
YWNrICsgIiA9ICgiICsgcHJlZml4ICsgaXRlbSArICIpOyIpOwotICAgICAgfQotICAgICAgcmV0
dXJuIHN0YWNrOwotICAgIH0sCi0KLSAgICBuZXh0U3RhY2s6IGZ1bmN0aW9uKCkgewotICAgICAg
cmV0dXJuIHRoaXMucHVzaFN0YWNrKCk7Ci0gICAgfSwKLQotICAgIGluY3JTdGFjazogZnVuY3Rp
b24oKSB7Ci0gICAgICB0aGlzLnN0YWNrU2xvdCsrOwotICAgICAgaWYodGhpcy5zdGFja1Nsb3Qg
PiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsgdGhpcy5zdGFja1ZhcnMucHVzaCgic3RhY2siICsg
dGhpcy5zdGFja1Nsb3QpOyB9Ci0gICAgICByZXR1cm4gdGhpcy50b3BTdGFja05hbWUoKTsKLSAg
ICB9LAotICAgIHRvcFN0YWNrTmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gInN0YWNr
IiArIHRoaXMuc3RhY2tTbG90OwotICAgIH0sCi0gICAgZmx1c2hJbmxpbmU6IGZ1bmN0aW9uKCkg
ewotICAgICAgdmFyIGlubGluZVN0YWNrID0gdGhpcy5pbmxpbmVTdGFjazsKLSAgICAgIGlmIChp
bmxpbmVTdGFjay5sZW5ndGgpIHsKLSAgICAgICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdOwotICAg
ICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBp
KyspIHsKLSAgICAgICAgICB2YXIgZW50cnkgPSBpbmxpbmVTdGFja1tpXTsKLSAgICAgICAgICBp
ZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFsKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBpbGVT
dGFjay5wdXNoKGVudHJ5KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5w
dXNoU3RhY2soZW50cnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0s
Ci0gICAgaXNJbmxpbmU6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuaW5saW5lU3Rh
Y2subGVuZ3RoOwotICAgIH0sCi0KLSAgICBwb3BTdGFjazogZnVuY3Rpb24od3JhcHBlZCkgewot
ICAgICAgdmFyIGlubGluZSA9IHRoaXMuaXNJbmxpbmUoKSwKLSAgICAgICAgICBpdGVtID0gKGlu
bGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7Ci0KLSAg
ICAgIGlmICghd3JhcHBlZCAmJiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpKSB7Ci0gICAgICAg
IHJldHVybiBpdGVtLnZhbHVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFpbmxpbmUp
IHsKLSAgICAgICAgICBpZiAoIXRoaXMuc3RhY2tTbG90KSB7Ci0gICAgICAgICAgICB0aHJvdyBu
ZXcgRXhjZXB0aW9uKCdJbnZhbGlkIHN0YWNrIHBvcCcpOwotICAgICAgICAgIH0KLSAgICAgICAg
ICB0aGlzLnN0YWNrU2xvdC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAg
ICAgfQotICAgIH0sCi0KLSAgICB0b3BTdGFjazogZnVuY3Rpb24od3JhcHBlZCkgewotICAgICAg
dmFyIHN0YWNrID0gKHRoaXMuaXNJbmxpbmUoKSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNv
bXBpbGVTdGFjayksCi0gICAgICAgICAgaXRlbSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwot
Ci0gICAgICBpZiAoIXdyYXBwZWQgJiYgKGl0ZW0gaW5zdGFuY2VvZiBMaXRlcmFsKSkgewotICAg
ICAgICByZXR1cm4gaXRlbS52YWx1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBp
dGVtOwotICAgICAgfQotICAgIH0sCi0KLSAgICBxdW90ZWRTdHJpbmc6IGZ1bmN0aW9uKHN0cikg
ewotICAgICAgcmV0dXJuICciJyArIHN0cgotICAgICAgICAucmVwbGFjZSgvXFwvZywgJ1xcXFwn
KQotICAgICAgICAucmVwbGFjZSgvIi9nLCAnXFwiJykKLSAgICAgICAgLnJlcGxhY2UoL1xuL2cs
ICdcXG4nKQotICAgICAgICAucmVwbGFjZSgvXHIvZywgJ1xccicpCi0gICAgICAgIC5yZXBsYWNl
KC9cdTIwMjgvZywgJ1xcdTIwMjgnKSAgIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAotICAg
ICAgICAucmVwbGFjZSgvXHUyMDI5L2csICdcXHUyMDI5JykgKyAnIic7Ci0gICAgfSwKLQotICAg
IHNldHVwSGVscGVyOiBmdW5jdGlvbihwYXJhbVNpemUsIG5hbWUsIG1pc3NpbmdQYXJhbXMpIHsK
LSAgICAgIHZhciBwYXJhbXMgPSBbXSwKLSAgICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1
cFBhcmFtcyhwYXJhbVNpemUsIHBhcmFtcywgbWlzc2luZ1BhcmFtcyk7Ci0gICAgICB2YXIgZm91
bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0K
LSAgICAgIHJldHVybiB7Ci0gICAgICAgIHBhcmFtczogcGFyYW1zLAotICAgICAgICBwYXJhbXNJ
bml0OiBwYXJhbXNJbml0LAotICAgICAgICBuYW1lOiBmb3VuZEhlbHBlciwKLSAgICAgICAgY2Fs
bFBhcmFtczogWyJkZXB0aDAiXS5jb25jYXQocGFyYW1zKS5qb2luKCIsICIpLAotICAgICAgICBo
ZWxwZXJNaXNzaW5nUGFyYW1zOiBtaXNzaW5nUGFyYW1zICYmIFsiZGVwdGgwIiwgdGhpcy5xdW90
ZWRTdHJpbmcobmFtZSldLmNvbmNhdChwYXJhbXMpLmpvaW4oIiwgIikKLSAgICAgIH07Ci0gICAg
fSwKLQotICAgIHNldHVwT3B0aW9uczogZnVuY3Rpb24ocGFyYW1TaXplLCBwYXJhbXMpIHsKLSAg
ICAgIHZhciBvcHRpb25zID0gW10sIGNvbnRleHRzID0gW10sIHR5cGVzID0gW10sIHBhcmFtLCBp
bnZlcnNlLCBwcm9ncmFtOwotCi0gICAgICBvcHRpb25zLnB1c2goImhhc2g6IiArIHRoaXMucG9w
U3RhY2soKSk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7Ci0gICAg
ICAgIG9wdGlvbnMucHVzaCgiaGFzaFR5cGVzOiIgKyB0aGlzLnBvcFN0YWNrKCkpOwotICAgICAg
ICBvcHRpb25zLnB1c2goImhhc2hDb250ZXh0czoiICsgdGhpcy5wb3BTdGFjaygpKTsKLSAgICAg
IH0KLQotICAgICAgaW52ZXJzZSA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgIHByb2dyYW0gPSB0
aGlzLnBvcFN0YWNrKCk7Ci0KLSAgICAgIC8vIEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2Ug
aWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFsbG93cwotICAgICAgLy8gaGVscGVycyB0byBkbyBh
IGNoZWNrIGZvciBgaWYgKG9wdGlvbnMuZm4pYAotICAgICAgaWYgKHByb2dyYW0gfHwgaW52ZXJz
ZSkgewotICAgICAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgICB0aGlzLmNvbnRleHQuYWxp
YXNlcy5zZWxmID0gInRoaXMiOwotICAgICAgICAgIHByb2dyYW0gPSAic2VsZi5ub29wIjsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICghaW52ZXJzZSkgewotICAgICAgICAgIHRoaXMuY29udGV4
dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7Ci0gICAgICAgICAgaW52ZXJzZSA9ICJzZWxmLm5vb3Ai
OwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9ucy5wdXNoKCJpbnZlcnNlOiIgKyBpbnZlcnNl
KTsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJmbjoiICsgcHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAg
ICAgIGZvcih2YXIgaT0wOyBpPHBhcmFtU2l6ZTsgaSsrKSB7Ci0gICAgICAgIHBhcmFtID0gdGhp
cy5wb3BTdGFjaygpOwotICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7Ci0KLSAgICAgICAgaWYo
dGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5w
b3BTdGFjaygpKTsKLSAgICAgICAgICBjb250ZXh0cy5wdXNoKHRoaXMucG9wU3RhY2soKSk7Ci0g
ICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMp
IHsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJjb250ZXh0czpbIiArIGNvbnRleHRzLmpvaW4oIiwi
KSArICJdIik7Ci0gICAgICAgIG9wdGlvbnMucHVzaCgidHlwZXM6WyIgKyB0eXBlcy5qb2luKCIs
IikgKyAiXSIpOwotICAgICAgfQotCi0gICAgICBpZih0aGlzLm9wdGlvbnMuZGF0YSkgewotICAg
ICAgICBvcHRpb25zLnB1c2goImRhdGE6ZGF0YSIpOwotICAgICAgfQotCi0gICAgICByZXR1cm4g
b3B0aW9uczsKLSAgICB9LAotCi0gICAgLy8gdGhlIHBhcmFtcyBhbmQgY29udGV4dHMgYXJndW1l
bnRzIGFyZSBwYXNzZWQgaW4gYXJyYXlzCi0gICAgLy8gdG8gZmlsbCBpbgotICAgIHNldHVwUGFy
YW1zOiBmdW5jdGlvbihwYXJhbVNpemUsIHBhcmFtcywgdXNlUmVnaXN0ZXIpIHsKLSAgICAgIHZh
ciBvcHRpb25zID0gJ3snICsgdGhpcy5zZXR1cE9wdGlvbnMocGFyYW1TaXplLCBwYXJhbXMpLmpv
aW4oJywnKSArICd9JzsKLQotICAgICAgaWYgKHVzZVJlZ2lzdGVyKSB7Ci0gICAgICAgIHRoaXMu
dXNlUmVnaXN0ZXIoJ29wdGlvbnMnKTsKLSAgICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsK
LSAgICAgICAgcmV0dXJuICdvcHRpb25zPScgKyBvcHRpb25zOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgcGFyYW1zLnB1c2gob3B0aW9ucyk7Ci0gICAgICAgIHJldHVybiAnJzsKLSAgICAgIH0K
LSAgICB9Ci0gIH07Ci0KLSAgdmFyIHJlc2VydmVkV29yZHMgPSAoCi0gICAgImJyZWFrIGVsc2Ug
bmV3IHZhciIgKwotICAgICIgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lkIiArCi0gICAgIiBjYXRj
aCBmb3Igc3dpdGNoIHdoaWxlIiArCi0gICAgIiBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgi
ICsKLSAgICAiIGRlZmF1bHQgaWYgdGhyb3ciICsKLSAgICAiIGRlbGV0ZSBpbiB0cnkiICsKLSAg
ICAiIGRvIGluc3RhbmNlb2YgdHlwZW9mIiArCi0gICAgIiBhYnN0cmFjdCBlbnVtIGludCBzaG9y
dCIgKwotICAgICIgYm9vbGVhbiBleHBvcnQgaW50ZXJmYWNlIHN0YXRpYyIgKwotICAgICIgYnl0
ZSBleHRlbmRzIGxvbmcgc3VwZXIiICsKLSAgICAiIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9u
aXplZCIgKwotICAgICIgY2xhc3MgZmxvYXQgcGFja2FnZSB0aHJvd3MiICsKLSAgICAiIGNvbnN0
IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQiICsKLSAgICAiIGRlYnVnZ2VyIGltcGxlbWVudHMgcHJv
dGVjdGVkIHZvbGF0aWxlIiArCi0gICAgIiBkb3VibGUgaW1wb3J0IHB1YmxpYyBsZXQgeWllbGQi
Ci0gICkuc3BsaXQoIiAiKTsKLQotICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21w
aWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9OwotCi0gIGZvcih2YXIgaT0wLCBsPXJlc2VydmVkV29y
ZHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tp
XV0gPSB0cnVlOwotICB9Ci0KLSAgSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0
VmFyaWFibGVOYW1lID0gZnVuY3Rpb24obmFtZSkgewotICAgIGlmKCFKYXZhU2NyaXB0Q29tcGls
ZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYgL15bYS16QS1aXyRdWzAtOWEtekEtWl8kXSokLy50
ZXN0KG5hbWUpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNl
OwotICB9OwotCi0gIF9fZXhwb3J0c19fID0gSmF2YVNjcmlwdENvbXBpbGVyOwotICByZXR1cm4g
X19leHBvcnRzX187Ci19KShfX21vZHVsZTJfXywgX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGVi
YXJzLmpzCi12YXIgX19tb2R1bGUwX18gPSAoZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2Rl
cGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBfX2RlcGVuZGVu
Y3k1X18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIC8qZ2xvYmFs
cyBIYW5kbGViYXJzOiB0cnVlICovCi0gIHZhciBIYW5kbGViYXJzID0gX19kZXBlbmRlbmN5MV9f
OwotCi0gIC8vIENvbXBpbGVyIGltcG9ydHMKLSAgdmFyIEFTVCA9IF9fZGVwZW5kZW5jeTJfXzsK
LSAgdmFyIFBhcnNlciA9IF9fZGVwZW5kZW5jeTNfXy5wYXJzZXI7Ci0gIHZhciBwYXJzZSA9IF9f
ZGVwZW5kZW5jeTNfXy5wYXJzZTsKLSAgdmFyIENvbXBpbGVyID0gX19kZXBlbmRlbmN5NF9fLkNv
bXBpbGVyOwotICB2YXIgY29tcGlsZSA9IF9fZGVwZW5kZW5jeTRfXy5jb21waWxlOwotICB2YXIg
cHJlY29tcGlsZSA9IF9fZGVwZW5kZW5jeTRfXy5wcmVjb21waWxlOwotICB2YXIgSmF2YVNjcmlw
dENvbXBpbGVyID0gX19kZXBlbmRlbmN5NV9fOwotCi0gIHZhciBfY3JlYXRlID0gSGFuZGxlYmFy
cy5jcmVhdGU7Ci0gIHZhciBjcmVhdGUgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgaGIgPSBfY3Jl
YXRlKCk7Ci0KLSAgICBoYi5jb21waWxlID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHsKLSAg
ICAgIHJldHVybiBjb21waWxlKGlucHV0LCBvcHRpb25zLCBoYik7Ci0gICAgfTsKLSAgICBoYi5w
cmVjb21waWxlID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zKSB7Ci0gICAgICByZXR1cm4gcHJl
Y29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIpOwotICAgIH07Ci0KLSAgICBoYi5BU1QgPSBBU1Q7
Ci0gICAgaGIuQ29tcGlsZXIgPSBDb21waWxlcjsKLSAgICBoYi5KYXZhU2NyaXB0Q29tcGlsZXIg
PSBKYXZhU2NyaXB0Q29tcGlsZXI7Ci0gICAgaGIuUGFyc2VyID0gUGFyc2VyOwotICAgIGhiLnBh
cnNlID0gcGFyc2U7Ci0KLSAgICByZXR1cm4gaGI7Ci0gIH07Ci0KLSAgSGFuZGxlYmFycyA9IGNy
ZWF0ZSgpOwotICBIYW5kbGViYXJzLmNyZWF0ZSA9IGNyZWF0ZTsKLQotICBfX2V4cG9ydHNfXyA9
IEhhbmRsZWJhcnM7Ci0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKF9fbW9kdWxlMV9fLCBfX21v
ZHVsZTdfXywgX19tb2R1bGU4X18sIF9fbW9kdWxlMTBfXywgX19tb2R1bGUxMV9fKTsKLQotICBy
ZXR1cm4gX19tb2R1bGUwX187Ci19KSgpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9qcXVlcnkuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMGRkY2E4Y2E0MjU3ZGMzYjdlYzAwYmU0MjlkZTZhZTE1NmQzNjc5OS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2pxdWVyeS5qcworKysgL2Rldi9udWxsCkBAIC0x
LDkxMTEgKzAsMCBAQAotLyohCi0gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjEuMAot
ICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgotICogSW5jbHVkZXMgU2l6emxlLmpzCi0gKiBodHRw
Oi8vc2l6emxlanMuY29tLwotICoKLSAqIENvcHlyaWdodCAyMDA1LCAyMDE0IGpRdWVyeSBGb3Vu
ZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRo
ZSBNSVQgbGljZW5zZQotICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQotICoKLSAqIERhdGU6
IDIwMTQtMDEtMjNUMjE6MTBaCi0gKi8KLQotKGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7
Ci0KLSAgICBpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUu
ZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7Ci0gICAgICAgIC8vIEZvciBDb21tb25KUyBhbmQgQ29t
bW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgd2luZG93IGlzIHByZXNlbnQs
Ci0gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkKLSAgICAgICAg
Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBpbmhlcmVudGx5IHBvc3NlcyBhIHdpbmRv
dyB3aXRoIGEgZG9jdW1lbnQKLSAgICAgICAgLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBh
IGpRdWVyeS1tYWtpbmcgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cwotICAgICAgICAvLyBUaGlz
IGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIHdpbmRvdwot
ICAgICAgICAvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwot
ICAgICAgICAvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvCi0gICAgICAgIG1vZHVs
ZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID8KLSAgICAgICAgICAgIGZhY3RvcnkoIGdsb2Jh
bCwgdHJ1ZSApIDoKLSAgICAgICAgICAgIGZ1bmN0aW9uKCB3ICkgewotICAgICAgICAgICAgICAg
IGlmICggIXcuZG9jdW1lbnQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
ciggImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiICk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KCB3ICk7Ci0gICAgICAg
ICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhY3RvcnkoIGdsb2JhbCApOwotICAgIH0K
LQotLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXQKLX0odHlwZW9mIHdp
bmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBu
b0dsb2JhbCApIHsKLQotLy8gQ2FuJ3QgZG8gdGhpcyBiZWNhdXNlIHNldmVyYWwgYXBwcyBpbmNs
dWRpbmcgQVNQLk5FVCB0cmFjZQotLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNh
bGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCi0vLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggInVz
ZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KQotLy8gU3VwcG9ydDogRmlyZWZveCAxOCsK
LS8vCi0KLXZhciBhcnIgPSBbXTsKLQotdmFyIHNsaWNlID0gYXJyLnNsaWNlOwotCi12YXIgY29u
Y2F0ID0gYXJyLmNvbmNhdDsKLQotdmFyIHB1c2ggPSBhcnIucHVzaDsKLQotdmFyIGluZGV4T2Yg
PSBhcnIuaW5kZXhPZjsKLQotdmFyIGNsYXNzMnR5cGUgPSB7fTsKLQotdmFyIHRvU3RyaW5nID0g
Y2xhc3MydHlwZS50b1N0cmluZzsKLQotdmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJv
cGVydHk7Ci0KLXZhciB0cmltID0gIiIudHJpbTsKLQotdmFyIHN1cHBvcnQgPSB7fTsKLQotCi0K
LXZhcgotICAgIC8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdp
bmRvdyBhcmd1bWVudCAoc2FuZGJveCkKLSAgICBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwK
LQotICAgIHZlcnNpb24gPSAiMi4xLjAiLAotCi0gICAgLy8gRGVmaW5lIGEgbG9jYWwgY29weSBv
ZiBqUXVlcnkKLSAgICBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7Ci0g
ICAgICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29u
c3RydWN0b3IgJ2VuaGFuY2VkJwotICAgICAgICAvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNh
bGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKQotICAg
ICAgICByZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwotICAg
IH0sCi0KLSAgICAvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKLSAgICBy
bXNQcmVmaXggPSAvXi1tcy0vLAotICAgIHJkYXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwKLQot
ICAgIC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkK
LSAgICBmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewotICAgICAgICByZXR1
cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Ci0gICAgfTsKLQotalF1ZXJ5LmZuID0galF1ZXJ5LnBy
b3RvdHlwZSA9IHsKLSAgICAvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1
c2VkCi0gICAganF1ZXJ5OiB2ZXJzaW9uLAotCi0gICAgY29uc3RydWN0b3I6IGpRdWVyeSwKLQot
ICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKLSAgICBzZWxlY3RvcjogIiIsCi0K
LSAgICAvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKLSAgICBs
ZW5ndGg6IDAsCi0KLSAgICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNs
aWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAotCi0gICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBp
biB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgotICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hl
ZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5Ci0gICAgZ2V0OiBmdW5jdGlvbiggbnVtICkg
ewotICAgICAgICByZXR1cm4gbnVtICE9IG51bGwgPwotCi0gICAgICAgICAgICAvLyBSZXR1cm4g
YSAnY2xlYW4nIGFycmF5Ci0gICAgICAgICAgICAoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlz
Lmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBqdXN0
IHRoZSBvYmplY3QKLSAgICAgICAgICAgIHNsaWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAotCi0g
ICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFj
awotICAgIC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQotICAgIHB1
c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewotCi0gICAgICAgIC8vIEJ1aWxkIGEgbmV3IGpR
dWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0Ci0gICAgICAgIHZhciByZXQgPSBqUXVlcnkubWVyZ2Uo
IHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKLQotICAgICAgICAvLyBBZGQgdGhlIG9sZCBv
YmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQotICAgICAgICByZXQucHJldk9i
amVjdCA9IHRoaXM7Ci0gICAgICAgIHJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OwotCi0gICAg
ICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0Ci0gICAgICAgIHJldHVy
biByZXQ7Ci0gICAgfSwKLQotICAgIC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxl
bWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCi0gICAgLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1l
bnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywgYnV0IHRoaXMgaXMKLSAgICAvLyBvbmx5IHVzZWQg
aW50ZXJuYWxseS4pCi0gICAgZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewotICAg
ICAgICByZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7Ci0gICAgfSwK
LQotICAgIG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewotICAgICAgICByZXR1cm4gdGhpcy5w
dXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7Ci0gICAgICAg
ICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOwotICAgICAgICB9KSk7
Ci0gICAgfSwKLQotICAgIHNsaWNlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
cHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTsKLSAgICB9LAotCi0g
ICAgZmlyc3Q6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5lcSggMCApOwotICAg
IH0sCi0KLSAgICBsYXN0OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXEoIC0x
ICk7Ci0gICAgfSwKLQotICAgIGVxOiBmdW5jdGlvbiggaSApIHsKLSAgICAgICAgdmFyIGxlbiA9
IHRoaXMubGVuZ3RoLAotICAgICAgICAgICAgaiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTsK
LSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhp
c1tqXSBdIDogW10gKTsKLSAgICB9LAotCi0gICAgZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKG51bGwpOwotICAgIH0s
Ci0KLSAgICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgLy8gQmVoYXZlcyBsaWtlIGFu
IEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCi0gICAgcHVzaDogcHVz
aCwKLSAgICBzb3J0OiBhcnIuc29ydCwKLSAgICBzcGxpY2U6IGFyci5zcGxpY2UKLX07Ci0KLWpR
dWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9w
dGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLAotICAgICAgICB0YXJn
ZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCi0gICAgICAgIGkgPSAxLAotICAgICAgICBsZW5ndGgg
PSBhcmd1bWVudHMubGVuZ3RoLAotICAgICAgICBkZWVwID0gZmFsc2U7Ci0KLSAgICAvLyBIYW5k
bGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCi0gICAgaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9v
bGVhbiIgKSB7Ci0gICAgICAgIGRlZXAgPSB0YXJnZXQ7Ci0KLSAgICAgICAgLy8gc2tpcCB0aGUg
Ym9vbGVhbiBhbmQgdGhlIHRhcmdldAotICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8
fCB7fTsKLSAgICAgICAgaSsrOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFy
Z2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQotICAg
IGlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRh
cmdldCkgKSB7Ci0gICAgICAgIHRhcmdldCA9IHt9OwotICAgIH0KLQotICAgIC8vIGV4dGVuZCBq
UXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZAotICAgIGlmICggaSA9
PT0gbGVuZ3RoICkgewotICAgICAgICB0YXJnZXQgPSB0aGlzOwotICAgICAgICBpLS07Ci0gICAg
fQotCi0gICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgIC8vIE9ubHkgZGVh
bCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKLSAgICAgICAgaWYgKCAob3B0aW9ucyA9
IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewotICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBi
YXNlIG9iamVjdAotICAgICAgICAgICAgZm9yICggbmFtZSBpbiBvcHRpb25zICkgewotICAgICAg
ICAgICAgICAgIHNyYyA9IHRhcmdldFsgbmFtZSBdOwotICAgICAgICAgICAgICAgIGNvcHkgPSBv
cHRpb25zWyBuYW1lIF07Ci0KLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG5ldmVyLWVuZGlu
ZyBsb29wCi0gICAgICAgICAgICAgICAgaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
ICAgIC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5cwot
ICAgICAgICAgICAgICAgIGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmpl
Y3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICggY29weUlzQXJyYXkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xv
bmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwotCi0gICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAm
JiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVj
dHMsIGNsb25lIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBqUXVl
cnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApOwotCi0gICAgICAgICAgICAgICAgLy8gRG9u
J3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
IGNvcHkgIT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1l
IF0gPSBjb3B5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0Ci0gICAgcmV0dXJuIHRh
cmdldDsKLX07Ci0KLWpRdWVyeS5leHRlbmQoewotICAgIC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5
IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQotICAgIGV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9u
ICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAotCi0gICAgLy8gQXNzdW1l
IGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGUKLSAgICBpc1JlYWR5OiB0
cnVlLAotCi0gICAgZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7Ci0gICAgICAgIHRocm93IG5ldyBF
cnJvciggbXNnICk7Ci0gICAgfSwKLQotICAgIG5vb3A6IGZ1bmN0aW9uKCkge30sCi0KLSAgICAv
LyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9u
LgotICAgIC8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxp
a2UgYWxlcnQKLSAgICAvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJ
RSAoIzI5NjgpLgotICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIHJl
dHVybiBqUXVlcnkudHlwZShvYmopID09PSAiZnVuY3Rpb24iOwotICAgIH0sCi0KLSAgICBpc0Fy
cmF5OiBBcnJheS5pc0FycmF5LAotCi0gICAgaXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7Ci0g
ICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Ci0gICAgfSwK
LQotICAgIGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHsKLSAgICAgICAgLy8gcGFyc2VGbG9h
dCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXwiIikK
LSAgICAgICAgLy8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywg
cGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoIjB4Li4uIikKLSAgICAgICAgLy8gc3VidHJhY3Rp
b24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOCi0gICAgICAgIHJldHVybiBvYmogLSBwYXJzZUZs
b2F0KCBvYmogKSA+PSAwOwotICAgIH0sCi0KLSAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbigg
b2JqICkgewotICAgICAgICAvLyBOb3QgcGxhaW4gb2JqZWN0czoKLSAgICAgICAgLy8gLSBBbnkg
b2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVybmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3Qg
IltvYmplY3QgT2JqZWN0XSIKLSAgICAgICAgLy8gLSBET00gbm9kZXMKLSAgICAgICAgLy8gLSB3
aW5kb3cKLSAgICAgICAgaWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09ICJvYmplY3QiIHx8IG9i
ai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3VwcG9ydDogRmlyZWZveCA8MjAK
LSAgICAgICAgLy8gVGhlIHRyeS9jYXRjaCBzdXBwcmVzc2VzIGV4Y2VwdGlvbnMgdGhyb3duIHdo
ZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MKLSAgICAgICAgLy8gdGhlICJjb25zdHJ1Y3RvciIgcHJv
cGVydHkgb2YgY2VydGFpbiBob3N0IG9iamVjdHMsIGllLiB8d2luZG93LmxvY2F0aW9ufAotICAg
ICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04MTQ2
MjIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggb2JqLmNvbnN0cnVjdG9yICYmCi0g
ICAgICAgICAgICAgICAgICAgICFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlw
ZSwgImlzUHJvdG90eXBlT2YiICkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3Qg
cmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29uZmlkZW50IHRoYXQKLSAgICAgICAgLy8gfG9ianwg
aXMgYSBwbGFpbiBvYmplY3QsIGNyZWF0ZWQgYnkge30gb3IgY29uc3RydWN0ZWQgd2l0aCBuZXcg
T2JqZWN0Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0sCi0KLSAgICBpc0VtcHR5T2JqZWN0
OiBmdW5jdGlvbiggb2JqICkgewotICAgICAgICB2YXIgbmFtZTsKLSAgICAgICAgZm9yICggbmFt
ZSBpbiBvYmogKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQotICAgIHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7Ci0g
ICAgICAgIGlmICggb2JqID09IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqICsgIiI7
Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCA8IDQuMCwgaU9TIDwgNiAo
ZnVuY3Rpb25pc2ggUmVnRXhwKQotICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVj
dCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/Ci0gICAgICAgICAgICBjbGFzczJ0eXBl
WyB0b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IiA6Ci0gICAgICAgICAgICB0eXBlb2Yg
b2JqOwotICAgIH0sCi0KLSAgICAvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29u
dGV4dAotICAgIGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkgewotICAgICAgICB2YXIgc2Ny
aXB0LAotICAgICAgICAgICAgaW5kaXJlY3QgPSBldmFsOwotCi0gICAgICAgIGNvZGUgPSBqUXVl
cnkudHJpbSggY29kZSApOwotCi0gICAgICAgIGlmICggY29kZSApIHsKLSAgICAgICAgICAgIC8v
IElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uCi0gICAgICAg
ICAgICAvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYQot
ICAgICAgICAgICAgLy8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC4KLSAgICAgICAgICAg
IGlmICggY29kZS5pbmRleE9mKCJ1c2Ugc3RyaWN0IikgPT09IDEgKSB7Ci0gICAgICAgICAgICAg
ICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Ci0gICAgICAgICAg
ICAgICAgc2NyaXB0LnRleHQgPSBjb2RlOwotICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQu
YXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwot
ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYXZvaWQgdGhl
IERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRpb24KLSAgICAgICAgICAgIC8vIGFuZCByZW1vdmFs
IGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2JhbCBldmFsCi0gICAgICAgICAgICAgICAgaW5kaXJl
Y3QoIGNvZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBD
b252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1
bGVzCi0gICAgLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXgg
KCM5NTcyKQotICAgIGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHsKLSAgICAgICAgcmV0
dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBo
YSwgZmNhbWVsQ2FzZSApOwotICAgIH0sCi0KLSAgICBub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0s
IG5hbWUgKSB7Ci0gICAgICAgIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUu
dG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIH0sCi0KLSAgICAvLyBh
cmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0gICAgZWFjaDogZnVuY3Rpb24oIG9iaiwg
Y2FsbGJhY2ssIGFyZ3MgKSB7Ci0gICAgICAgIHZhciB2YWx1ZSwKLSAgICAgICAgICAgIGkgPSAw
LAotICAgICAgICAgICAgbGVuZ3RoID0gb2JqLmxlbmd0aCwKLSAgICAgICAgICAgIGlzQXJyYXkg
PSBpc0FycmF5bGlrZSggb2JqICk7Ci0KLSAgICAgICAgaWYgKCBhcmdzICkgewotICAgICAgICAg
ICAgaWYgKCBpc0FycmF5ICkgewotICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsg
aSsrICkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpb
IGkgXSwgYXJncyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNl
ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIGZvciAoIGkgaW4gb2JqICkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxi
YWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgg
dmFsdWUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9m
IGVhY2gKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICggaXNBcnJheSApIHsKLSAg
ICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAg
ICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQot
ICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpIGluIG9i
aiApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkg
XSwgaSwgb2JqWyBpIF0gKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBm
YWxzZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIG9iajsKLSAgICB9LAotCi0gICAgdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7
Ci0gICAgICAgIHJldHVybiB0ZXh0ID09IG51bGwgPyAiIiA6IHRyaW0uY2FsbCggdGV4dCApOwot
ICAgIH0sCi0KLSAgICAvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0gICAg
bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewotICAgICAgICB2YXIgcmV0ID0g
cmVzdWx0cyB8fCBbXTsKLQotICAgICAgICBpZiAoIGFyciAhPSBudWxsICkgewotICAgICAgICAg
ICAgaWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHsKLSAgICAgICAgICAgICAgICBq
UXVlcnkubWVyZ2UoIHJldCwKLSAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGFyciA9PT0gInN0
cmluZyIgPwotICAgICAgICAgICAgICAgICAgICBbIGFyciBdIDogYXJyCi0gICAgICAgICAgICAg
ICAgKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHVzaC5jYWxsKCBy
ZXQsIGFyciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJl
dDsKLSAgICB9LAotCi0gICAgaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKLSAg
ICAgICAgcmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwg
aSApOwotICAgIH0sCi0KLSAgICBtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7Ci0g
ICAgICAgIHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKLSAgICAgICAgICAgIGogPSAwLAotICAg
ICAgICAgICAgaSA9IGZpcnN0Lmxlbmd0aDsKLQotICAgICAgICBmb3IgKCA7IGogPCBsZW47IGor
KyApIHsKLSAgICAgICAgICAgIGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdOwotICAgICAgICB9
Ci0KLSAgICAgICAgZmlyc3QubGVuZ3RoID0gaTsKLQotICAgICAgICByZXR1cm4gZmlyc3Q7Ci0g
ICAgfSwKLQotICAgIGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHsK
LSAgICAgICAgdmFyIGNhbGxiYWNrSW52ZXJzZSwKLSAgICAgICAgICAgIG1hdGNoZXMgPSBbXSwK
LSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAot
ICAgICAgICAgICAgY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwotCi0gICAgICAgIC8vIEdvIHRo
cm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKLSAgICAgICAgLy8gdGhhdCBw
YXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KLSAgICAgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBp
KysgKSB7Ci0gICAgICAgICAgICBjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBp
IF0sIGkgKTsKLSAgICAgICAgICAgIGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4
cGVjdCApIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0s
Ci0KLSAgICAvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKLSAgICBtYXA6IGZ1bmN0
aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKLSAgICAgICAgdmFyIHZhbHVlLAotICAgICAg
ICAgICAgaSA9IDAsCi0gICAgICAgICAgICBsZW5ndGggPSBlbGVtcy5sZW5ndGgsCi0gICAgICAg
ICAgICBpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICksCi0gICAgICAgICAgICByZXQgPSBb
XTsKLQotICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBv
ZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwotICAgICAgICBpZiAoIGlzQXJyYXkgKSB7
Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAg
ICB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKLQotICAgICAgICAgICAg
ICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2go
IHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIC8v
IEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsCi0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBmb3IgKCBpIGluIGVsZW1zICkgewotICAgICAgICAgICAgICAgIHZhbHVlID0g
Y2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKCB2
YWx1ZSAhPSBudWxsICkgewotICAgICAgICAgICAgICAgICAgICByZXQucHVzaCggdmFsdWUgKTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCi0gICAgICAgIHJldHVybiBjb25jYXQuYXBwbHko
IFtdLCByZXQgKTsKLSAgICB9LAotCi0gICAgLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBv
YmplY3RzCi0gICAgZ3VpZDogMSwKLQotICAgIC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRl
eHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQotICAgIC8vIGFyZ3VtZW50cy4K
LSAgICBwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewotICAgICAgICB2YXIgdG1wLCBh
cmdzLCBwcm94eTsKLQotICAgICAgICBpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAic3RyaW5nIiAp
IHsKLSAgICAgICAgICAgIHRtcCA9IGZuWyBjb250ZXh0IF07Ci0gICAgICAgICAgICBjb250ZXh0
ID0gZm47Ci0gICAgICAgICAgICBmbiA9IHRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFF1
aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVj
Ci0gICAgICAgIC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJl
dHVybiB1bmRlZmluZWQuCi0gICAgICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkg
ewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IFNpbXVsYXRlZCBiaW5kCi0gICAgICAgIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIg
KTsKLSAgICAgICAgcHJveHkgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBmbi5h
cHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRz
ICkgKSApOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUg
aGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVt
b3ZlZAotICAgICAgICBwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1
aWQrKzsKLQotICAgICAgICByZXR1cm4gcHJveHk7Ci0gICAgfSwKLQotICAgIG5vdzogRGF0ZS5u
b3csCi0KLSAgICAvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhl
ciBwcm9qZWN0cyBhdHRhY2ggdGhlaXIKLSAgICAvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5l
ZWRzIHRvIGV4aXN0LgotICAgIHN1cHBvcnQ6IHN1cHBvcnQKLX0pOwotCi0vLyBQb3B1bGF0ZSB0
aGUgY2xhc3MydHlwZSBtYXAKLWpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVu
Y3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlv
bihpLCBuYW1lKSB7Ci0gICAgY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9
IG5hbWUudG9Mb3dlckNhc2UoKTsKLX0pOwotCi1mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkg
ewotICAgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoLAotICAgICAgICB0eXBlID0galF1ZXJ5LnR5
cGUoIG9iaiApOwotCi0gICAgaWYgKCB0eXBlID09PSAiZnVuY3Rpb24iIHx8IGpRdWVyeS5pc1dp
bmRvdyggb2JqICkgKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAo
IG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGggKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0KLQotICAgIHJldHVybiB0eXBlID09PSAiYXJyYXkiIHx8IGxlbmd0aCA9PT0gMCB8fAot
ICAgICAgICB0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVu
Z3RoIC0gMSApIGluIG9iajsKLX0KLXZhciBTaXp6bGUgPQotLyohCi0gKiBTaXp6bGUgQ1NTIFNl
bGVjdG9yIEVuZ2luZSB2MS4xMC4xNgotICogaHR0cDovL3NpenpsZWpzLmNvbS8KLSAqCi0gKiBD
b3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0
b3JzCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKLSAqIGh0dHA6Ly9qcXVlcnku
b3JnL2xpY2Vuc2UKLSAqCi0gKiBEYXRlOiAyMDE0LTAxLTEzCi0gKi8KLShmdW5jdGlvbiggd2lu
ZG93ICkgewotCi12YXIgaSwKLSAgICBzdXBwb3J0LAotICAgIEV4cHIsCi0gICAgZ2V0VGV4dCwK
LSAgICBpc1hNTCwKLSAgICBjb21waWxlLAotICAgIG91dGVybW9zdENvbnRleHQsCi0gICAgc29y
dElucHV0LAotICAgIGhhc0R1cGxpY2F0ZSwKLQotICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMK
LSAgICBzZXREb2N1bWVudCwKLSAgICBkb2N1bWVudCwKLSAgICBkb2NFbGVtLAotICAgIGRvY3Vt
ZW50SXNIVE1MLAotICAgIHJidWdneVFTQSwKLSAgICByYnVnZ3lNYXRjaGVzLAotICAgIG1hdGNo
ZXMsCi0gICAgY29udGFpbnMsCi0KLSAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCi0gICAg
ZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcgRGF0ZSgpKSwKLSAgICBwcmVmZXJyZWREb2MgPSB3
aW5kb3cuZG9jdW1lbnQsCi0gICAgZGlycnVucyA9IDAsCi0gICAgZG9uZSA9IDAsCi0gICAgY2xh
c3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0gICAgdG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCks
Ci0gICAgY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0gICAgc29ydE9yZGVyID0gZnVu
Y3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIGlmICggYSA9PT0gYiApIHsKLSAgICAgICAgICAgIGhh
c0R1cGxpY2F0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSwK
LQotICAgIC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHMKLSAgICBzdHJ1bmRlZmluZWQgPSB0
eXBlb2YgdW5kZWZpbmVkLAotICAgIE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsCi0KLSAgICAvLyBJ
bnN0YW5jZSBtZXRob2RzCi0gICAgaGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKLSAgICBh
cnIgPSBbXSwKLSAgICBwb3AgPSBhcnIucG9wLAotICAgIHB1c2hfbmF0aXZlID0gYXJyLnB1c2gs
Ci0gICAgcHVzaCA9IGFyci5wdXNoLAotICAgIHNsaWNlID0gYXJyLnNsaWNlLAotICAgIC8vIFVz
ZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBpZiB3ZSBjYW4ndCB1c2UgYSBuYXRpdmUgb25lCi0g
ICAgaW5kZXhPZiA9IGFyci5pbmRleE9mIHx8IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICB2
YXIgaSA9IDAsCi0gICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDsKLSAgICAgICAgZm9yICgg
OyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXNbaV0gPT09IGVsZW0gKSB7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIC0xOwotICAgIH0sCi0KLSAgICBib29sZWFucyA9ICJjaGVja2VkfHNlbGVj
dGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRk
ZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCi0K
LSAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zCi0KLSAgICAvLyBXaGl0ZXNwYWNlIGNoYXJhY3Rl
cnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2UKLSAgICB3
aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAotICAgIC8vIGh0dHA6Ly93d3cudzMu
b3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzCi0gICAgY2hhcmFjdGVyRW5jb2RpbmcgPSAi
KD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLAotCi0gICAgLy8gTG9vc2VseSBtb2Rl
bGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJhY3RlcnMKLSAgICAvLyBBbiB1bnF1b3RlZCB2YWx1
ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmllciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNl
bGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwotICAgIC8vIFByb3BlciBzeW50YXg6IGh0dHA6
Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgot
ICAgIGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3IyIgKSwK
LQotICAgIC8vIEFjY2VwdGFibGUgb3BlcmF0b3JzIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVj
dG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwotICAgIGF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRl
c3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsKLSAg
ICAgICAgIiooPzooWypeJHwhfl0/PSkiICsgd2hpdGVzcGFjZSArICIqKD86KFsnXCJdKSgoPzpc
XFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlkZW50aWZpZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFj
ZSArICIqXFxdIiwKLQotICAgIC8vIFByZWZlciBhcmd1bWVudHMgcXVvdGVkLAotICAgIC8vICAg
dGhlbiBub3QgY29udGFpbmluZyBwc2V1ZG9zL2JyYWNrZXRzLAotICAgIC8vICAgdGhlbiBhdHRy
aWJ1dGUgc2VsZWN0b3JzL25vbi1wYXJlbnRoZXRpY2FsIGV4cHJlc3Npb25zLAotICAgIC8vICAg
dGhlbiBhbnl0aGluZyBlbHNlCi0gICAgLy8gVGhlc2UgcHJlZmVyZW5jZXMgYXJlIGhlcmUgdG8g
cmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzCi0gICAgLy8gICBuZWVkaW5nIHRva2VuaXpl
IGluIHRoZSBQU0VVRE8gcHJlRmlsdGVyCi0gICAgcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJF
bmNvZGluZyArICIpKD86XFwoKChbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/Olxc
XFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJpYnV0ZXMucmVwbGFjZSggMywgOCApICsgIikqKXwu
KilcXCl8KSIsCi0KLSAgICAvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0
ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGlu
ZyB0aGUgbGF0dGVyCi0gICAgcnRyaW0gPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsg
Iit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICks
Ci0KLSAgICByY29tbWEgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdo
aXRlc3BhY2UgKyAiKiIgKSwKLSAgICByY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3
aGl0ZXNwYWNlICsgIiooWz4rfl18IiArIHdoaXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsg
IioiICksCi0KLSAgICByYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggIj0iICsgd2hpdGVz
cGFjZSArICIqKFteXFxdJ1wiXSo/KSIgKyB3aGl0ZXNwYWNlICsgIipcXF0iLCAiZyIgKSwKLQot
ICAgIHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCi0gICAgcmlkZW50aWZpZXIgPSBu
ZXcgUmVnRXhwKCAiXiIgKyBpZGVudGlmaWVyICsgIiQiICksCi0KLSAgICBtYXRjaEV4cHIgPSB7
Ci0gICAgICAgICJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAi
KSIgKSwKLSAgICAgICAgIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGNoYXJhY3RlckVu
Y29kaW5nICsgIikiICksCi0gICAgICAgICJUQUciOiBuZXcgUmVnRXhwKCAiXigiICsgY2hhcmFj
dGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyoiICkgKyAiKSIgKSwKLSAgICAgICAgIkFUVFIi
OiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCi0gICAgICAgICJQU0VVRE8iOiBuZXcg
UmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCi0gICAgICAgICJDSElMRCI6IG5ldyBSZWdFeHAoICJe
Oihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsg
d2hpdGVzcGFjZSArCi0gICAgICAgICAgICAiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIg
KyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwotICAgICAgICAgICAg
IiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSArICIqXFwpfCkiLCAiaSIgKSwKLSAgICAgICAgImJv
b2wiOiBuZXcgUmVnRXhwKCAiXig/OiIgKyBib29sZWFucyArICIpJCIsICJpIiApLAotICAgICAg
ICAvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKLSAgICAgICAgLy8g
V2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YAotICAgICAgICAibmVlZHND
b250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqWz4rfl18OihldmVufG9k
ZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiICsKLSAgICAgICAgICAgIHdoaXRlc3Bh
Y2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCki
LCAiaSIgKQotICAgIH0sCi0KLSAgICByaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFy
ZWF8YnV0dG9uKSQvaSwKLSAgICByaGVhZGVyID0gL15oXGQkL2ksCi0KLSAgICBybmF0aXZlID0g
L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAotCi0gICAgLy8gRWFzaWx5LXBhcnNlYWJsZS9yZXRy
aWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzCi0gICAgcnF1aWNrRXhwciA9IC9e
KD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCi0KLSAgICByc2libGluZyA9IC9bK35d
LywKLSAgICByZXNjYXBlID0gLyd8XFwvZywKLQotICAgIC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93
d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKLSAgICBy
dW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxcXChbXFxkYS1mXXsxLDZ9IiArIHdoaXRlc3BhY2Ug
KyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwuKSIsICJpZyIgKSwKLSAgICBmdW5lc2NhcGUgPSBm
dW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7Ci0gICAgICAgIHZhciBo
aWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwotICAgICAgICAvLyBOYU4gbWVhbnMgbm9u
LWNvZGVwb2ludAotICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94Ci0gICAgICAgIC8vIFdvcmth
cm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKLSAgICAgICAg
cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgPwotICAgICAgICAgICAg
ZXNjYXBlZCA6Ci0gICAgICAgICAgICBoaWdoIDwgMCA/Ci0gICAgICAgICAgICAgICAgLy8gQk1Q
IGNvZGVwb2ludAotICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAw
eDEwMDAwICkgOgotICAgICAgICAgICAgICAgIC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9p
bnQgKHN1cnJvZ2F0ZSBwYWlyKQotICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUo
IGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApOwotICAgIH07Ci0K
LS8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApCi10cnkgewotICAgIHB1
c2guYXBwbHkoCi0gICAgICAgIChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGRO
b2RlcyApKSwKLSAgICAgICAgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMKLSAgICApOwotICAgIC8v
IFN1cHBvcnQ6IEFuZHJvaWQ8NC4wCi0gICAgLy8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVz
aC5hcHBseQotICAgIGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5
cGU7Ci19IGNhdGNoICggZSApIHsKLSAgICBwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/Ci0K
LSAgICAgICAgLy8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGUKLSAgICAgICAgZnVuY3Rpb24o
IHRhcmdldCwgZWxzICkgewotICAgICAgICAgICAgcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwg
c2xpY2UuY2FsbChlbHMpICk7Ci0gICAgICAgIH0gOgotCi0gICAgICAgIC8vIFN1cHBvcnQ6IElF
PDkKLSAgICAgICAgLy8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseQotICAgICAgICBmdW5jdGlv
biggdGFyZ2V0LCBlbHMgKSB7Ci0gICAgICAgICAgICB2YXIgaiA9IHRhcmdldC5sZW5ndGgsCi0g
ICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICAvLyBDYW4ndCB0cnVzdCBOb2RlTGlz
dC5sZW5ndGgKLSAgICAgICAgICAgIHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkg
e30KLSAgICAgICAgICAgIHRhcmdldC5sZW5ndGggPSBqIC0gMTsKLSAgICAgICAgfQotICAgIH07
Ci19Ci0KLWZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQg
KSB7Ci0gICAgdmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSwKLSAgICAgICAgLy8gUVNBIHZh
cnMKLSAgICAgICAgaSwgZ3JvdXBzLCBvbGQsIG5pZCwgbmV3Q29udGV4dCwgbmV3U2VsZWN0b3I7
Ci0KLSAgICBpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0
IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCgg
Y29udGV4dCApOwotICAgIH0KLQotICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Owot
ICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwotCi0gICAgaWYgKCAhc2VsZWN0b3IgfHwgdHlw
ZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0g
ICAgfQotCi0gICAgaWYgKCAobm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBu
b2RlVHlwZSAhPT0gOSApIHsKLSAgICAgICAgcmV0dXJuIFtdOwotICAgIH0KLQotICAgIGlmICgg
ZG9jdW1lbnRJc0hUTUwgJiYgIXNlZWQgKSB7Ci0KLSAgICAgICAgLy8gU2hvcnRjdXRzCi0gICAg
ICAgIGlmICggKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsKLSAgICAg
ICAgICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCi0gICAgICAgICAgICBpZiAoIChtID0g
bWF0Y2hbMV0pICkgewotICAgICAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7Ci0g
ICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFj
a2JlcnJ5IDQuNiByZXR1cm5zCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vZGVzIHRoYXQgYXJl
IG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2MykKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0
dXJuIGl0ZW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBuYW1lIGluc3RlYWQgb2Yg
SUQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5pZCA9PT0gbSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHRzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVu
dAotICAgICAgICAgICAgICAgICAgICBpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxl
bSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJgotICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09
PSBtICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenps
ZSgiVEFHIikKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewotICAgICAgICAg
ICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUo
IHNlbGVjdG9yICkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAg
ICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKLSAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBj
b250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7Ci0gICAgICAgICAgICAgICAgcHVzaC5h
cHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFFTQSBwYXRoCi0gICAgICAgIGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVn
Z3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHsKLSAgICAgICAgICAgIG5p
ZCA9IG9sZCA9IGV4cGFuZG87Ci0gICAgICAgICAgICBuZXdDb250ZXh0ID0gY29udGV4dDsKLSAg
ICAgICAgICAgIG5ld1NlbGVjdG9yID0gbm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7Ci0KLSAg
ICAgICAgICAgIC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmll
cwotICAgICAgICAgICAgLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBh
biBleHRyYSBJRCBvbiB0aGUgcm9vdAotICAgICAgICAgICAgLy8gYW5kIHdvcmtpbmcgdXAgZnJv
bSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCi0gICAg
ICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHMKLSAgICAgICAg
ICAgIGlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp
ICE9PSAib2JqZWN0IiApIHsKLSAgICAgICAgICAgICAgICBncm91cHMgPSB0b2tlbml6ZSggc2Vs
ZWN0b3IgKTsKLQotICAgICAgICAgICAgICAgIGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmli
dXRlKCJpZCIpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbmlkID0gb2xkLnJlcGxhY2UoIHJl
c2NhcGUsICJcXCQmIiApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOwotCi0gICAg
ICAgICAgICAgICAgaSA9IGdyb3Vwcy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBp
LS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3Io
IGdyb3Vwc1tpXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdDb250
ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5w
YXJlbnROb2RlICkgfHwgY29udGV4dDsKLSAgICAgICAgICAgICAgICBuZXdTZWxlY3RvciA9IGdy
b3Vwcy5qb2luKCIsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggbmV3U2Vs
ZWN0b3IgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcHVz
aC5hcHBseSggcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQucXVl
cnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKQotICAgICAgICAgICAgICAgICAgICApOwotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgICAgICB9IGNhdGNo
KHFzYUVycm9yKSB7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCAhb2xkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1v
dmVBdHRyaWJ1dGUoImlkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgb3RoZXJz
Ci0gICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29u
dGV4dCwgcmVzdWx0cywgc2VlZCApOwotfQotCi0vKioKLSAqIENyZWF0ZSBrZXktdmFsdWUgY2Fj
aGVzIG9mIGxpbWl0ZWQgc2l6ZQotICogQHJldHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0
KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0
aAotICogIHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYg
dGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpCi0gKiAgZGVsZXRpbmcg
dGhlIG9sZGVzdCBlbnRyeQotICovCi1mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKLSAgICB2YXIg
a2V5cyA9IFtdOwotCi0gICAgZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7Ci0gICAgICAg
IC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90
eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQotICAgICAgICBpZiAoIGtleXMucHVzaCgg
a2V5ICsgIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgewotICAgICAgICAgICAgLy8gT25seSBr
ZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzCi0gICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtl
eXMuc2hpZnQoKSBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIg
IiBdID0gdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gY2FjaGU7Ci19Ci0KLS8qKgotICogTWFy
ayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGUKLSAqIEBwYXJhbSB7RnVuY3Rp
b259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCi0gKi8KLWZ1bmN0aW9uIG1hcmtGdW5jdGlvbigg
Zm4gKSB7Ci0gICAgZm5bIGV4cGFuZG8gXSA9IHRydWU7Ci0gICAgcmV0dXJuIGZuOwotfQotCi0v
KioKLSAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50Ci0gKiBAcGFyYW0ge0Z1bmN0
aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1
bHQKLSAqLwotZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHsKLSAgICB2YXIgZGl2ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0KLSAgICB0cnkgewotICAgICAgICByZXR1cm4gISFmbigg
ZGl2ICk7Ci0gICAgfSBjYXRjaCAoZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBm
aW5hbGx5IHsKLSAgICAgICAgLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0Ci0g
ICAgICAgIGlmICggZGl2LnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICBkaXYucGFyZW50Tm9k
ZS5yZW1vdmVDaGlsZCggZGl2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBtZW1v
cnkgaW4gSUUKLSAgICAgICAgZGl2ID0gbnVsbDsKLSAgICB9Ci19Ci0KLS8qKgotICogQWRkcyB0
aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRycwotICogQHBhcmFt
IHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwotICogQHBh
cmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi0g
Ki8KLWZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Ci0gICAgdmFyIGFyciA9
IGF0dHJzLnNwbGl0KCJ8IiksCi0gICAgICAgIGkgPSBhdHRycy5sZW5ndGg7Ci0KLSAgICB3aGls
ZSAoIGktLSApIHsKLSAgICAgICAgRXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7
Ci0gICAgfQotfQotCi0vKioKLSAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGlu
Z3MKLSAqIEBwYXJhbSB7RWxlbWVudH0gYQotICogQHBhcmFtIHtFbGVtZW50fSBiCi0gKiBAcmV0
dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRl
ciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKLSAqLwotZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBi
ICkgewotICAgIHZhciBjdXIgPSBiICYmIGEsCi0gICAgICAgIGRpZmYgPSBjdXIgJiYgYS5ub2Rl
VHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmCi0gICAgICAgICAgICAoIH5iLnNvdXJj
ZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC0KLSAgICAgICAgICAgICggfmEuc291cmNlSW5kZXgg
fHwgTUFYX05FR0FUSVZFICk7Ci0KLSAgICAvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxh
YmxlIG9uIGJvdGggbm9kZXMKLSAgICBpZiAoIGRpZmYgKSB7Ci0gICAgICAgIHJldHVybiBkaWZm
OwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIGIgZm9sbG93cyBhCi0gICAgaWYgKCBjdXIgKSB7
Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7Ci0gICAgICAgICAg
ICBpZiAoIGN1ciA9PT0gYiApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYSA/IDEgOiAtMTsKLX0KLQot
LyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5
cGVzCi0gKiBAcGFyYW0ge1N0cmluZ30gdHlwZQotICovCi1mdW5jdGlvbiBjcmVhdGVJbnB1dFBz
ZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZh
ciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gbmFt
ZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7Ci0gICAgfTsKLX0KLQotLyoqCi0g
KiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKLSAqIEBw
YXJhbSB7U3RyaW5nfSB0eXBlCi0gKi8KLWZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlw
ZSApIHsKLSAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZhciBuYW1lID0g
ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gKG5hbWUgPT09ICJp
bnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKLSAgICB9
OwotfQotCi0vKioKLSAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3Ig
cG9zaXRpb25hbHMKLSAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gKi8KLWZ1bmN0aW9uIGNyZWF0
ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkgewotICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rp
b24oIGFyZ3VtZW50ICkgewotICAgICAgICBhcmd1bWVudCA9ICthcmd1bWVudDsKLSAgICAgICAg
cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKLSAgICAgICAg
ICAgIHZhciBqLAotICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5s
ZW5ndGgsIGFyZ3VtZW50ICksCi0gICAgICAgICAgICAgICAgaSA9IG1hdGNoSW5kZXhlcy5sZW5n
dGg7Ci0KLSAgICAgICAgICAgIC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZp
ZWQgaW5kZXhlcwotICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgc2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLS8qKgotICogQ2hlY2tz
IGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAotICogQHBhcmFtIHtFbGVt
ZW50fE9iamVjdD19IGNvbnRleHQKLSAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFu
fSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZQot
ICovCi1mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHsKLSAgICByZXR1cm4gY29udGV4
dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVk
ICYmIGNvbnRleHQ7Ci19Ci0KLS8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNl
Ci1zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTsKLQotLyoqCi0gKiBEZXRlY3RzIFhNTCBu
b2RlcwotICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9j
dW1lbnQKLSAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwg
WE1MIG5vZGUKLSAqLwotaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRv
ZXNuJ3QgeWV0IGV4aXN0Ci0gICAgLy8gKHN1Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0g
IzQ4MzMpCi0gICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1
bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7Ci0gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVu
dCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Ci19OwotCi0v
KioKLSAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUg
Y3VycmVudCBkb2N1bWVudAotICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxl
bWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKLSAqIEBy
ZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqLwotc2V0RG9j
dW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHsKLSAgICB2YXIg
aGFzQ29tcGFyZSwKLSAgICAgICAgZG9jID0gbm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBu
b2RlIDogcHJlZmVycmVkRG9jLAotICAgICAgICBwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7Ci0K
LSAgICAvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwg
cmV0dXJuCi0gICAgaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8
fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAg
IH0KLQotICAgIC8vIFNldCBvdXIgZG9jdW1lbnQKLSAgICBkb2N1bWVudCA9IGRvYzsKLSAgICBk
b2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLQotICAgIC8vIFN1cHBvcnQgdGVzdHMKLSAg
ICBkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRT44
Ci0gICAgLy8gSWYgaWZyYW1lIGRvY3VtZW50IGlzIGFzc2lnbmVkIHRvICJkb2N1bWVudCIgdmFy
aWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVlbiByZWxvYWRlZCwKLSAgICAvLyBJRSB3aWxsIHRo
cm93ICJwZXJtaXNzaW9uIGRlbmllZCIgZXJyb3Igd2hlbiBhY2Nlc3NpbmcgImRvY3VtZW50IiB2
YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzYKLSAgICAvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0
aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28gcGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkCi0gICAg
aWYgKCBwYXJlbnQgJiYgcGFyZW50ICE9PSBwYXJlbnQudG9wICkgewotICAgICAgICAvLyBJRTEx
IGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQsIHNvIGFsbCBtdXN0IHN1ZmZlcgotICAgICAgICBp
ZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkgewotICAgICAgICAgICAgcGFyZW50LmFkZEV2
ZW50TGlzdGVuZXIoICJ1bmxvYWQiLCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBzZXRE
b2N1bWVudCgpOwotICAgICAgICAgICAgfSwgZmFsc2UgKTsKLSAgICAgICAgfSBlbHNlIGlmICgg
cGFyZW50LmF0dGFjaEV2ZW50ICkgewotICAgICAgICAgICAgcGFyZW50LmF0dGFjaEV2ZW50KCAi
b251bmxvYWQiLCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBzZXREb2N1bWVudCgpOwot
ICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBdHRyaWJ1dGVzCi0g
ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgLy8gU3VwcG9ydDogSUU8OAotICAgIC8vIFZlcmlm
eSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJv
cGVydGllcyAoZXhjZXB0aW5nIElFOCBib29sZWFucykKLSAgICBzdXBwb3J0LmF0dHJpYnV0ZXMg
PSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICJpIjsK
LSAgICAgICAgcmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKTsKLSAgICB9KTsK
LQotICAgIC8qIGdldEVsZW1lbnQocylCeSoKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAv
LyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50
cwotICAgIHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRp
diApIHsKLSAgICAgICAgZGl2LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlQ29tbWVudCgiIikgKTsK
LSAgICAgICAgcmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Ci0g
ICAgfSk7Ci0KLSAgICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIGNhbiBiZSB0
cnVzdGVkCi0gICAgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0
KCBkb2MuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApICYmIGFzc2VydChmdW5jdGlvbiggZGl2ICkg
ewotICAgICAgICBkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xh
c3M9J2EgaSc+PC9kaXY+IjsKLQotICAgICAgICAvLyBTdXBwb3J0OiBTYWZhcmk8NAotICAgICAg
ICAvLyBDYXRjaCBjbGFzcyBvdmVyLWNhY2hpbmcKLSAgICAgICAgZGl2LmZpcnN0Q2hpbGQuY2xh
c3NOYW1lID0gImkiOwotICAgICAgICAvLyBTdXBwb3J0OiBPcGVyYTwxMAotICAgICAgICAvLyBD
YXRjaCBnRUJDTiBmYWlsdXJlIHRvIGZpbmQgbm9uLWxlYWRpbmcgY2xhc3NlcwotICAgICAgICBy
ZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImkiKS5sZW5ndGggPT09IDI7Ci0gICAg
fSk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTwxMAotICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRC
eUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZQotICAgIC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVu
dEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsCi0g
ICAgLy8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0Ci0gICAgc3Vw
cG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgICAgIGRvY0VsZW0u
YXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbzsKLSAgICAgICAgcmV0dXJuICFkb2MuZ2V0
RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0
aDsKLSAgICB9KTsKLQotICAgIC8vIElEIGZpbmQgYW5kIGZpbHRlcgotICAgIGlmICggc3VwcG9y
dC5nZXRCeUlkICkgewotICAgICAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNv
bnRleHQgKSB7Ci0gICAgICAgICAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlk
ICE9PSBzdHJ1bmRlZmluZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7Ci0gICAgICAgICAgICAgICAg
dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApOwotICAgICAgICAgICAgICAgIC8v
IENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCi0g
ICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVu
dCAjNjk2MwotICAgICAgICAgICAgICAgIHJldHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFttXSA6
IFtdOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBFeHByLmZpbHRlclsiSUQi
XSA9IGZ1bmN0aW9uKCBpZCApIHsKLSAgICAgICAgICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNl
KCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwotICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBl
bGVtICkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9
PT0gYXR0cklkOwotICAgICAgICAgICAgfTsKLSAgICAgICAgfTsKLSAgICB9IGVsc2UgewotICAg
ICAgICAvLyBTdXBwb3J0OiBJRTYvNwotICAgICAgICAvLyBnZXRFbGVtZW50QnlJZCBpcyBub3Qg
cmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0Ci0gICAgICAgIGRlbGV0ZSBFeHByLmZpbmRbIklE
Il07Ci0KLSAgICAgICAgRXhwci5maWx0ZXJbIklEIl0gPSAgZnVuY3Rpb24oIGlkICkgewotICAg
ICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7
Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAg
dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQg
JiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBu
b2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH07
Ci0gICAgfQotCi0gICAgLy8gVGFnCi0gICAgRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0
RWxlbWVudHNCeVRhZ05hbWUgPwotICAgICAgICBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewot
ICAgICAgICAgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0g
c3RydW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCB0YWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSA6Ci0gICAgICAg
IGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSwKLSAgICAg
ICAgICAgICAgICB0bXAgPSBbXSwKLSAgICAgICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAg
ICAgICByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7Ci0KLSAg
ICAgICAgICAgIC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHMKLSAgICAgICAgICAgIGlm
ICggdGFnID09PSAiKiIgKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3Vs
dHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0g
MSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5wdXNoKCBlbGVtICk7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1
cm4gdG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAg
ICAgIH07Ci0KLSAgICAvLyBDbGFzcwotICAgIEV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQu
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkg
ewotICAgICAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09
IHN0cnVuZGVmaW5lZCAmJiBkb2N1bWVudElzSFRNTCApIHsKLSAgICAgICAgICAgIHJldHVybiBj
b250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwotICAgICAgICB9Ci0g
ICAgfTsKLQotICAgIC8qIFFTQS9tYXRjaGVzU2VsZWN0b3IKLSAgICAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
Ci0KLSAgICAvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0Ci0KLSAgICAvLyBtYXRj
aGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAx
MS41KQotICAgIHJidWdneU1hdGNoZXMgPSBbXTsKLQotICAgIC8vIHFTYSg6Zm9jdXMpIHJlcG9y
dHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCi0gICAgLy8gV2UgYWxsb3cgdGhpcyBiZWNh
dXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yCi0gICAgLy8gd2hlbmV2
ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQotICAg
IC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUg
dG8gYXZvaWQgdGhlIElFIGVycm9yCi0gICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20v
dGlja2V0LzEzMzc4Ci0gICAgcmJ1Z2d5UVNBID0gW107Ci0KLSAgICBpZiAoIChzdXBwb3J0LnFz
YSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5U2VsZWN0b3JBbGwgKSkgKSB7Ci0gICAgICAgIC8v
IEJ1aWxkIFFTQSByZWdleAotICAgICAgICAvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20g
RGllZ28gUGVyaW5pCi0gICAgICAgIGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotICAgICAgICAg
ICAgLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQotICAgICAgICAg
ICAgLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5Ci0g
ICAgICAgICAgICAvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKLSAgICAg
ICAgICAgIC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCi0gICAgICAgICAg
ICAvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQotICAgICAgICAgICAgZGl2
LmlubmVySFRNTCA9ICI8c2VsZWN0IHQ9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48
L3NlbGVjdD4iOwotCi0gICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDEwLTEyCi0g
ICAgICAgICAgICAvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmlu
Z3MgZm9sbG93IF49IG9yICQ9IG9yICo9Ci0gICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVj
dG9yQWxsKCJbdF49JyddIikubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5w
dXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2UgKyAiKig/OicnfFwiXCIpIiApOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgKLSAgICAgICAgICAgIC8vIEJvb2xl
YW4gYXR0cmlidXRlcyBhbmQgInZhbHVlIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5Ci0gICAg
ICAgICAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCAp
IHsKLSAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsg
IiooPzp2YWx1ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBv
cHRpb24gZWxlbWVudHMKLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEv
UkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCi0gICAgICAgICAgICAvLyBJRTgg
dGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0cwotICAgICAgICAg
ICAgaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkgewotICAg
ICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCI6Y2hlY2tlZCIpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9KTsKLQotICAgICAgICBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAg
ICAgIC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwcwotICAgICAgICAgICAgLy8gVGhl
IHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRN
TCBhc3NpZ25tZW50Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudCgi
aW5wdXQiKTsKLSAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVu
IiApOwotICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSgg
Im5hbWUiLCAiRCIgKTsKLQotICAgICAgICAgICAgLy8gU3VwcG9ydDogSUU4Ci0gICAgICAgICAg
ICAvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGUKLSAgICAgICAg
ICAgIGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewotICAg
ICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAibmFtZSIgKyB3aGl0ZXNwYWNlICsgIipbKl4k
fCF+XT89IiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGRiAzLjUgLSA6ZW5h
YmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBz
dGlsbCBlbmFibGVkKQotICAgICAgICAgICAgLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3
aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKLSAgICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVj
dG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICByYnVnZ3lRU0Eu
cHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgLy8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlk
IHBzZXVkb3MKLSAgICAgICAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7Ci0gICAg
ICAgICAgICByYnVnZ3lRU0EucHVzaCgiLC4qOiIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAg
ICBpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMg
PSBkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAotICAgICAgICBkb2NFbGVtLm1vek1h
dGNoZXNTZWxlY3RvciB8fAotICAgICAgICBkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHwKLSAg
ICAgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7Ci0KLSAgICAgICAgYXNzZXJ0
KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBw
b3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3IKLSAgICAgICAgICAgIC8vIG9uIGEgZGlzY29u
bmVjdGVkIG5vZGUgKElFIDkpCi0gICAgICAgICAgICBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNo
ID0gbWF0Y2hlcy5jYWxsKCBkaXYsICJkaXYiICk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgc2hv
dWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIC8vIEdlY2tvIGRvZXMgbm90
IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKLSAgICAgICAgICAgIG1hdGNoZXMuY2FsbCgg
ZGl2LCAiW3MhPScnXTp4IiApOwotICAgICAgICAgICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0i
LCBwc2V1ZG9zICk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHJidWdneVFTQSA9IHJidWdn
eVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oInwiKSApOwotICAgIHJi
dWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lN
YXRjaGVzLmpvaW4oInwiKSApOwotCi0gICAgLyogQ29udGFpbnMKLSAgICAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCi0gICAgaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1l
bnRQb3NpdGlvbiApOwotCi0gICAgLy8gRWxlbWVudCBjb250YWlucyBhbm90aGVyCi0gICAgLy8g
UHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxlbWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAotICAg
IC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmCi0gICAgY29udGFp
bnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KLSAg
ICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgICAgICB2YXIgYWRvd24gPSBhLm5vZGVU
eXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLAotICAgICAgICAgICAgICAgIGJ1cCA9
IGIgJiYgYi5wYXJlbnROb2RlOwotICAgICAgICAgICAgcmV0dXJuIGEgPT09IGJ1cCB8fCAhISgg
YnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoCi0gICAgICAgICAgICAgICAgYWRvd24uY29u
dGFpbnMgPwotICAgICAgICAgICAgICAgICAgICBhZG93bi5jb250YWlucyggYnVwICkgOgotICAg
ICAgICAgICAgICAgICAgICBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURv
Y3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTYKLSAgICAgICAgICAgICkpOwotICAgICAgICB9IDoK
LSAgICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgICAgICBpZiAoIGIgKSB7Ci0gICAg
ICAgICAgICAgICAgd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggYiA9PT0gYSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9OwotCi0gICAgLyogU29y
dGluZwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIC8vIERvY3VtZW50IG9yZGVyIHNvcnRp
bmcKLSAgICBzb3J0T3JkZXIgPSBoYXNDb21wYXJlID8KLSAgICBmdW5jdGlvbiggYSwgYiApIHsK
LQotICAgICAgICAvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbAotICAgICAgICBpZiAoIGEg
PT09IGIgKSB7Ci0gICAgICAgICAgICBoYXNEdXBsaWNhdGUgPSB0cnVlOwotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVu
Y2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uCi0gICAgICAg
IHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCBjb21wYXJlICkgewotICAgICAgICAgICAgcmV0
dXJuIGNvbXBhcmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24g
aWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50Ci0gICAgICAgIGNvbXBh
cmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIg
KSA/Ci0gICAgICAgICAgICBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgotCi0gICAg
ICAgICAgICAvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWQKLSAgICAg
ICAgICAgIDE7Ci0KLSAgICAgICAgLy8gRGlzY29ubmVjdGVkIG5vZGVzCi0gICAgICAgIGlmICgg
Y29tcGFyZSAmIDEgfHwKLSAgICAgICAgICAgICghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5j
b21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHsKLQotICAgICAgICAg
ICAgLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJl
ZmVycmVkIGRvY3VtZW50Ci0gICAgICAgICAgICBpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9j
dW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkgewot
ICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
ICggYiA9PT0gZG9jIHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRh
aW5zKHByZWZlcnJlZERvYywgYikgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyCi0gICAg
ICAgICAgICByZXR1cm4gc29ydElucHV0ID8KLSAgICAgICAgICAgICAgICAoIGluZGV4T2YuY2Fs
bCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOgotICAg
ICAgICAgICAgICAgIDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29tcGFyZSAmIDQg
PyAtMSA6IDE7Ci0gICAgfSA6Ci0gICAgZnVuY3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIC8vIEV4
aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWwKLSAgICAgICAgaWYgKCBhID09PSBi
ICkgewotICAgICAgICAgICAgaGFzRHVwbGljYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAot
ICAgICAgICAgICAgYXVwID0gYS5wYXJlbnROb2RlLAotICAgICAgICAgICAgYnVwID0gYi5wYXJl
bnROb2RlLAotICAgICAgICAgICAgYXAgPSBbIGEgXSwKLSAgICAgICAgICAgIGJwID0gWyBiIF07
Ci0KLSAgICAgICAgLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBk
aXNjb25uZWN0ZWQKLSAgICAgICAgaWYgKCAhYXVwIHx8ICFidXAgKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gYSA9PT0gZG9jID8gLTEgOgotICAgICAgICAgICAgICAgIGIgPT09IGRvYyA/IDEgOgot
ICAgICAgICAgICAgICAgIGF1cCA/IC0xIDoKLSAgICAgICAgICAgICAgICBidXAgPyAxIDoKLSAg
ICAgICAgICAgICAgICBzb3J0SW5wdXQgPwotICAgICAgICAgICAgICAgICggaW5kZXhPZi5jYWxs
KCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBiICkgKSA6Ci0gICAg
ICAgICAgICAgICAgMDsKLQotICAgICAgICAvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3
ZSBjYW4gZG8gYSBxdWljayBjaGVjawotICAgICAgICB9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCAp
IHsKLSAgICAgICAgICAgIHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0
b3JzIGZvciBjb21wYXJpc29uCi0gICAgICAgIGN1ciA9IGE7Ci0gICAgICAgIHdoaWxlICggKGN1
ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAgICAgICAgICAgIGFwLnVuc2hpZnQoIGN1ciApOwot
ICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGI7Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5w
YXJlbnROb2RlKSApIHsKLSAgICAgICAgICAgIGJwLnVuc2hpZnQoIGN1ciApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFu
Y3kKLSAgICAgICAgd2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7Ci0gICAgICAgICAgICBpKys7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaSA/Ci0gICAgICAgICAgICAvLyBEbyBhIHNp
YmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3IKLSAgICAgICAg
ICAgIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOgotCi0gICAgICAgICAgICAvLyBPdGhl
cndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3QKLSAgICAgICAgICAgIGFwW2ld
ID09PSBwcmVmZXJyZWREb2MgPyAtMSA6Ci0gICAgICAgICAgICBicFtpXSA9PT0gcHJlZmVycmVk
RG9jID8gMSA6Ci0gICAgICAgICAgICAwOwotICAgIH07Ci0KLSAgICByZXR1cm4gZG9jOwotfTsK
LQotU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7Ci0gICAgcmV0
dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKLX07Ci0KLVNpenpsZS5t
YXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKLSAgICAvLyBTZXQgZG9j
dW1lbnQgdmFycyBpZiBuZWVkZWQKLSAgICBpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVs
ZW0gKSAhPT0gZG9jdW1lbnQgKSB7Ci0gICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7Ci0gICAg
fQotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVk
Ci0gICAgZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsK
LQotICAgIGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYK
LSAgICAgICAgKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkg
KSAmJgotICAgICAgICAoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciAp
ICkgKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhciByZXQgPSBtYXRjaGVzLmNh
bGwoIGVsZW0sIGV4cHIgKTsKLQotICAgICAgICAgICAgLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3Rv
ciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwotICAgICAgICAgICAgaWYgKCBy
ZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAv
LyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVu
dAotICAgICAgICAgICAgICAgICAgICAvLyBmcmFnbWVudCBpbiBJRSA5Ci0gICAgICAgICAgICAg
ICAgICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBj
YXRjaChlKSB7fQotICAgIH0KLQotICAgIHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBu
dWxsLCBbZWxlbV0gKS5sZW5ndGggPiAwOwotfTsKLQotU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rp
b24oIGNvbnRleHQsIGVsZW0gKSB7Ci0gICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVk
Ci0gICAgaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3Vt
ZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCggY29udGV4dCApOwotICAgIH0KLSAgICByZXR1
cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKLX07Ci0KLVNpenpsZS5hdHRyID0gZnVuY3Rp
b24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0g
ICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewot
ICAgICAgICBzZXREb2N1bWVudCggZWxlbSApOwotICAgIH0KLQotICAgIHZhciBmbiA9IEV4cHIu
YXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCi0gICAgICAgIC8vIERvbid0IGdldCBm
b29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KQotICAg
ICAgICB2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93
ZXJDYXNlKCkgKSA/Ci0gICAgICAgICAgICBmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1M
ICkgOgotICAgICAgICAgICAgdW5kZWZpbmVkOwotCi0gICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZp
bmVkID8KLSAgICAgICAgdmFsIDoKLSAgICAgICAgc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1
bWVudElzSFRNTCA/Ci0gICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKLSAg
ICAgICAgICAgICh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVj
aWZpZWQgPwotICAgICAgICAgICAgICAgIHZhbC52YWx1ZSA6Ci0gICAgICAgICAgICAgICAgbnVs
bDsKLX07Ci0KLVNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7Ci0gICAgdGhyb3cgbmV3
IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyAp
OwotfTsKLQotLyoqCi0gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVz
Ci0gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0cwotICovCi1TaXp6bGUudW5pcXVlU29ydCA9
IGZ1bmN0aW9uKCByZXN1bHRzICkgewotICAgIHZhciBlbGVtLAotICAgICAgICBkdXBsaWNhdGVz
ID0gW10sCi0gICAgICAgIGogPSAwLAotICAgICAgICBpID0gMDsKLQotICAgIC8vIFVubGVzcyB3
ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UK
LSAgICBoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzOwotICAgIHNvcnRJ
bnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApOwotICAgIHJl
c3VsdHMuc29ydCggc29ydE9yZGVyICk7Ci0KLSAgICBpZiAoIGhhc0R1cGxpY2F0ZSApIHsKLSAg
ICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICBpZiAo
IGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsKLSAgICAgICAgICAgICAgICBqID0gZHVwbGljYXRl
cy5wdXNoKCBpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCBq
LS0gKSB7Ci0gICAgICAgICAgICByZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRv
IHJlbGVhc2Ugb2JqZWN0cwotICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3Np
enpsZS9wdWxsLzIyNQotICAgIHNvcnRJbnB1dCA9IG51bGw7Ci0KLSAgICByZXR1cm4gcmVzdWx0
czsKLX07Ci0KLS8qKgotICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4
dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKLSAqIEBwYXJhbSB7QXJyYXl8RWxlbWVu
dH0gZWxlbQotICovCi1nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICB2YXIgbm9kZSwKLSAgICAgICAgcmV0ID0gIiIsCi0gICAgICAgIGkgPSAwLAotICAg
ICAgICBub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7Ci0KLSAgICBpZiAoICFub2RlVHlwZSApIHsK
LSAgICAgICAgLy8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJy
YXkKLSAgICAgICAgd2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7Ci0gICAgICAgICAgICAv
LyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwotICAgICAgICAgICAgcmV0ICs9IGdldFRl
eHQoIG5vZGUgKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8
IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKLSAgICAgICAgLy8gVXNlIHRl
eHRDb250ZW50IGZvciBlbGVtZW50cwotICAgICAgICAvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3Zl
ZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKQotICAgICAgICBp
ZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAg
IHJldHVybiBlbGVtLnRleHRDb250ZW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCi0gICAgICAgICAgICBmb3IgKCBlbGVtID0gZWxlbS5m
aXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHsKLSAgICAgICAgICAg
ICAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7Ci0gICAg
ICAgIHJldHVybiBlbGVtLm5vZGVWYWx1ZTsKLSAgICB9Ci0gICAgLy8gRG8gbm90IGluY2x1ZGUg
Y29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzCi0KLSAgICByZXR1cm4gcmV0
OwotfTsKLQotRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7Ci0KLSAgICAvLyBDYW4gYmUgYWRq
dXN0ZWQgYnkgdGhlIHVzZXIKLSAgICBjYWNoZUxlbmd0aDogNTAsCi0KLSAgICBjcmVhdGVQc2V1
ZG86IG1hcmtGdW5jdGlvbiwKLQotICAgIG1hdGNoOiBtYXRjaEV4cHIsCi0KLSAgICBhdHRySGFu
ZGxlOiB7fSwKLQotICAgIGZpbmQ6IHt9LAotCi0gICAgcmVsYXRpdmU6IHsKLSAgICAgICAgIj4i
OiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAotICAgICAgICAiICI6IHsgZGly
OiAicGFyZW50Tm9kZSIgfSwKLSAgICAgICAgIisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIs
IGZpcnN0OiB0cnVlIH0sCi0gICAgICAgICJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0K
LSAgICB9LAotCi0gICAgcHJlRmlsdGVyOiB7Ci0gICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG1h
dGNoICkgewotICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2Nh
cGUsIGZ1bmVzY2FwZSApOwotCi0gICAgICAgICAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0
byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAotICAgICAgICAgICAgbWF0Y2hb
M10gPSAoIG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBlLCBm
dW5lc2NhcGUgKTsKLQotICAgICAgICAgICAgaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKLSAg
ICAgICAgICAgICAgICBtYXRjaFszXSA9ICIgIiArIG1hdGNoWzNdICsgIiAiOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTsKLSAgICAgICAg
fSwKLQotICAgICAgICAiQ0hJTEQiOiBmdW5jdGlvbiggbWF0Y2ggKSB7Ci0gICAgICAgICAgICAv
KiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCi0gICAgICAgICAgICAgICAgMSB0eXBl
IChvbmx5fG50aHwuLi4pCi0gICAgICAgICAgICAgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQot
ICAgICAgICAgICAgICAgIDMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wu
Li4pCi0gICAgICAgICAgICAgICAgNCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWyst
XT9cZCpufCkKLSAgICAgICAgICAgICAgICA1IHNpZ24gb2YgeG4tY29tcG9uZW50Ci0gICAgICAg
ICAgICAgICAgNiB4IG9mIHhuLWNvbXBvbmVudAotICAgICAgICAgICAgICAgIDcgc2lnbiBvZiB5
LWNvbXBvbmVudAotICAgICAgICAgICAgICAgIDggeSBvZiB5LWNvbXBvbmVudAotICAgICAgICAg
ICAgKi8KLSAgICAgICAgICAgIG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKLQot
ICAgICAgICAgICAgaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKLSAg
ICAgICAgICAgICAgICAvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudAotICAgICAgICAgICAgICAg
IGlmICggIW1hdGNoWzNdICkgewotICAgICAgICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoIG1h
dGNoWzBdICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbnVtZXJp
YyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECi0gICAgICAgICAgICAg
ICAgLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQot
ICAgICAgICAgICAgICAgIG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRj
aFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSAiZXZlbiIgfHwgbWF0Y2hbM10gPT09ICJv
ZGQiICkgKTsKLSAgICAgICAgICAgICAgICBtYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRj
aFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwotCi0gICAgICAgICAgICAvLyBvdGhlciB0
eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzNd
ICkgewotICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwotICAgICAgICB9LAotCi0gICAgICAg
ICJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2ggKSB7Ci0gICAgICAgICAgICB2YXIgZXhjZXNzLAot
ICAgICAgICAgICAgICAgIHVucXVvdGVkID0gIW1hdGNoWzVdICYmIG1hdGNoWzJdOwotCi0gICAg
ICAgICAgICBpZiAoIG1hdGNoRXhwclsiQ0hJTEQiXS50ZXN0KCBtYXRjaFswXSApICkgewotICAg
ICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwotICAgICAgICAgICAgaWYgKCBtYXRjaFsz
XSAmJiBtYXRjaFs0XSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIG1hdGNoWzJd
ID0gbWF0Y2hbNF07Ci0KLSAgICAgICAgICAgIC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZy
b20gdW5xdW90ZWQgYXJndW1lbnRzCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAm
JiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiYKLSAgICAgICAgICAgICAgICAvLyBHZXQgZXhj
ZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQotICAgICAgICAgICAgICAgIChleGNlc3Mg
PSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKLSAgICAgICAgICAgICAgICAvLyBhZHZh
bmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXMKLSAgICAgICAgICAgICAgICAoZXhj
ZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAt
IHVucXVvdGVkLmxlbmd0aCkgKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBleGNlc3MgaXMgYSBu
ZWdhdGl2ZSBpbmRleAotICAgICAgICAgICAgICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2Uo
IDAsIGV4Y2VzcyApOwotICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2Uo
IDAsIGV4Y2VzcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXR1cm4gb25s
eSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBh
cmd1bWVudCkKLSAgICAgICAgICAgIHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApOwotICAgICAg
ICB9Ci0gICAgfSwKLQotICAgIGZpbHRlcjogewotCi0gICAgICAgICJUQUciOiBmdW5jdGlvbigg
bm9kZU5hbWVTZWxlY3RvciApIHsKLSAgICAgICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGVOYW1l
U2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwot
ICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/Ci0gICAgICAgICAg
ICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDoKLSAgICAgICAgICAgICAgICBmdW5j
dGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUg
JiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKLSAgICAgICAgICAg
ICAgICB9OwotICAgICAgICB9LAotCi0gICAgICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05h
bWUgKSB7Ci0gICAgICAgICAgICB2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSAr
ICIgIiBdOwotCi0gICAgICAgICAgICByZXR1cm4gcGF0dGVybiB8fAotICAgICAgICAgICAgICAg
IChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihefCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xhc3NO
YW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiICkpICYmCi0gICAgICAgICAgICAgICAgY2xh
c3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSAic3RyaW5n
IiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVu
ZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCAiIiApOwotICAgICAgICAg
ICAgICAgIH0pOwotICAgICAgICB9LAotCi0gICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG5hbWUs
IG9wZXJhdG9yLCBjaGVjayApIHsKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUg
KTsKLQotICAgICAgICAgICAgICAgIGlmICggcmVzdWx0ID09IG51bGwgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBvcGVyYXRvciA9PT0gIiE9IjsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgaWYgKCAhb3BlcmF0b3IgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdCAr
PSAiIjsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0
ID09PSBjaGVjayA6Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAiIT0iID8gcmVz
dWx0ICE9PSBjaGVjayA6Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAiXj0iID8g
Y2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgotICAgICAgICAgICAgICAg
ICAgICBvcGVyYXRvciA9PT0gIio9IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayAp
ID4gLTEgOgotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYm
IHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6Ci0gICAgICAgICAgICAg
ICAgICAgIG9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQgKyAiICIgKS5pbmRleE9m
KCBjaGVjayApID4gLTEgOgotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gInw9IiA/
IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkg
PT09IGNoZWNrICsgIi0iIDoKLSAgICAgICAgICAgICAgICAgICAgZmFsc2U7Ci0gICAgICAgICAg
ICB9OwotICAgICAgICB9LAotCi0gICAgICAgICJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0
LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7Ci0gICAgICAgICAgICB2YXIgc2ltcGxlID0gdHlw
ZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKLSAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHlw
ZS5zbGljZSggLTQgKSAhPT0gImxhc3QiLAotICAgICAgICAgICAgICAgIG9mVHlwZSA9IHdoYXQg
PT09ICJvZi10eXBlIjsKLQotICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3Qg
PT09IDAgPwotCi0gICAgICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQotICAg
ICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gISFlbGVtLnBhcmVudE5vZGU7Ci0gICAgICAgICAgICAgICAgfSA6Ci0KLSAgICAgICAgICAg
ICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgICAgICAg
ICB2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsCi0g
ICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNp
YmxpbmciIDogInByZXZpb3VzU2libGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJl
bnQgPSBlbGVtLnBhcmVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gb2ZU
eXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlOwotCi0gICAgICAgICAgICAgICAgICAgIGlm
ICggcGFyZW50ICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyA6KGZpcnN0fGxhc3R8
b25seSktKGNoaWxkfG9mLXR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNpbXBs
ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGRpciApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGVsZW07Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUu
dG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgZGlyZWN0
aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3Rh
cnQgJiYgIm5leHRTaWJsaW5nIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFy
ZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBw
YXJlbnRgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBgZWxlbWAgZnJvbSBhIHBy
ZXZpb3VzbHktY2FjaGVkIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJD
YWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBb
XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBjYWNoZVswXSA9PT0g
ZGlycnVucyAmJiBjYWNoZVsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0g
Y2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMl07Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07
Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChub2RlID0gKytub2RlSW5k
ZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fAotCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3Rh
cnQucG9wKCkpICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4g
Zm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYg
bm9kZSA9PT0gZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91
dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYg
YXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB1c2VDYWNoZSAm
JiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0
eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJydW5zICkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRpZmYgPSBjYWNoZVsxXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1s
IDpudGgtY2hpbGQoLi4uKSBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8t
b2YtdHlwZSguLi4pCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsg
YGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUg
KCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5w
b3AoKSkgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIG9mVHlw
ZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUg
PT09IDEgKSAmJiArK2RpZmYgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHVzZUNhY2hlICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVb
IGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG5vZGUgPT09IGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5z
dCBjeWNsZSBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC09IGxhc3Q7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmly
c3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIH0sCi0KLSAgICAgICAgIlBTRVVETyI6IGZ1bmN0
aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewotICAgICAgICAgICAgLy8gcHNldWRvLWNsYXNzIG5h
bWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9y
Zy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzCi0gICAgICAgICAgICAvLyBQcmlvcml0aXpl
IGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0
aCB1cHBlcmNhc2UgbGV0dGVycwotICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0
ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvcwotICAgICAgICAgICAgdmFyIGFyZ3MsCi0gICAgICAg
ICAgICAgICAgZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sg
cHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAotICAgICAgICAgICAgICAgICAgICBTaXp6bGUuZXJy
b3IoICJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIgKyBwc2V1ZG8gKTsKLQotICAgICAgICAgICAgLy8g
VGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAotICAgICAgICAg
ICAgLy8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24K
LSAgICAgICAgICAgIC8vIGp1c3QgYXMgU2l6emxlIGRvZXMKLSAgICAgICAgICAgIGlmICggZm5b
IGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm4oIGFyZ3VtZW50ICk7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBv
bGQgc2lnbmF0dXJlcwotICAgICAgICAgICAgaWYgKCBmbi5sZW5ndGggPiAxICkgewotICAgICAg
ICAgICAgICAgIGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8u
dG9Mb3dlckNhc2UoKSApID8KLSAgICAgICAgICAgICAgICAgICAgbWFya0Z1bmN0aW9uKGZ1bmN0
aW9uKCBzZWVkLCBtYXRjaGVzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50
ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG1hdGNoZWQubGVuZ3RoOwotICAg
ICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVkW2ldICk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1h
dGNoZWRbaV0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgfSkgOgotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApOwotICAgICAgICAgICAg
ICAgICAgICB9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZm47Ci0gICAg
ICAgIH0KLSAgICB9LAotCi0gICAgcHNldWRvczogewotICAgICAgICAvLyBQb3RlbnRpYWxseSBj
b21wbGV4IHBzZXVkb3MKLSAgICAgICAgIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7Ci0gICAgICAgICAgICAvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29t
cGlsZQotICAgICAgICAgICAgLy8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxp
bmcKLSAgICAgICAgICAgIC8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwotICAgICAgICAgICAgdmFy
IGlucHV0ID0gW10sCi0gICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtdLAotICAgICAgICAgICAg
ICAgIG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7
Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPwotICAgICAgICAgICAg
ICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkg
ewotICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAg
IHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGkgPSBzZWVkLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBN
YXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgCi0gICAgICAgICAgICAgICAgICAg
IHdoaWxlICggaS0tICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHVu
bWF0Y2hlZFtpXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFtpXSA9ICEo
bWF0Y2hlc1tpXSA9IGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAgICAgIGZ1bmN0
aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0WzBd
ID0gZWxlbTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwg
cmVzdWx0cyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXJlc3VsdHMucG9wKCk7Ci0g
ICAgICAgICAgICAgICAgfTsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImhhcyI6IG1hcmtGdW5j
dGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24o
IGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0g
KS5sZW5ndGggPiAwOwotICAgICAgICAgICAgfTsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImNv
bnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkgewotICAgICAgICAgICAgcmV0
dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHJldHVybiAoIGVsZW0udGV4
dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZigg
dGV4dCApID4gLTE7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9KSwKLQotICAgICAgICAvLyAi
V2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3Rvcgot
ICAgICAgICAvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1
ZQotICAgICAgICAvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAotICAgICAgICAv
LyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2Vk
IGJ5ICItIi4KLSAgICAgICAgLy8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVu
dCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuCi0gICAg
ICAgIC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1
YWdlIG5hbWUuIgotICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xh
bmctcHNldWRvCi0gICAgICAgICJsYW5nIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyAp
IHsKLSAgICAgICAgICAgIC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIK
LSAgICAgICAgICAgIGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7Ci0gICAg
ICAgICAgICAgICAgU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2Fw
ZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlv
biggZWxlbSApIHsKLSAgICAgICAgICAgICAgICB2YXIgZWxlbUxhbmc7Ci0gICAgICAgICAgICAg
ICAgZG8gewotICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNI
VE1MID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ubGFuZyA6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJp
YnV0ZSgibGFuZyIpKSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbUxhbmcgPSBl
bGVtTGFuZy50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVs
ZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyAiLSIgKSA9PT0gMDsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAoZWxlbSA9
IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0pLAotCi0gICAgICAg
IC8vIE1pc2NlbGxhbmVvdXMKLSAgICAgICAgInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9u
Lmhhc2g7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVs
ZW0uaWQ7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgInJvb3QiOiBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgICAgIHJldHVybiBlbGVtID09PSBkb2NFbGVtOwotICAgICAgICB9LAotCi0gICAg
ICAgICJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0g
PT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1
bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRh
YkluZGV4KTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBCb29sZWFuIHByb3BlcnRpZXMKLSAg
ICAgICAgImVuYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBl
bGVtLmRpc2FibGVkID09PSBmYWxzZTsKLSAgICAgICAgfSwKLQotICAgICAgICAiZGlzYWJsZWQi
OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09
PSB0cnVlOwotICAgICAgICB9LAotCi0gICAgICAgICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0g
KSB7Ci0gICAgICAgICAgICAvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGgg
Y2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHMKLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCi0gICAg
ICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAg
ICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSAiaW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8
fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYmICEhZWxlbS5zZWxlY3RlZCk7Ci0gICAgICAgIH0s
Ci0KLSAgICAgICAgInNlbGVjdGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAv
LyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0Ci0gICAg
ICAgICAgICAvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5Ci0gICAgICAgICAgICBp
ZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUu
c2VsZWN0ZWRJbmRleDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVsZW0u
c2VsZWN0ZWQgPT09IHRydWU7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQ29udGVudHMKLSAg
ICAgICAgImVtcHR5IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBodHRwOi8v
d3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkbwotICAgICAgICAgICAgLy8gOmVt
cHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsg
Y2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAotICAgICAgICAgICAgLy8gICBidXQgbm90IGJ5IG90
aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLikKLSAgICAg
ICAgICAgIC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5v
dCBhcHBlYXIgYXMgY2hpbGRyZW4KLSAgICAgICAgICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0
Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewotICAgICAgICAgICAgICAg
IGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfSwKLQotICAgICAgICAicGFyZW50IjogZnVuY3Rpb24oIGVsZW0g
KSB7Ci0gICAgICAgICAgICByZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwot
ICAgICAgICB9LAotCi0gICAgICAgIC8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKLSAgICAgICAgImhl
YWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIHJoZWFkZXIudGVz
dCggZWxlbS5ub2RlTmFtZSApOwotICAgICAgICB9LAotCi0gICAgICAgICJpbnB1dCI6IGZ1bmN0
aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2Rl
TmFtZSApOwotICAgICAgICB9LAotCi0gICAgICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICAgICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwot
ICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSAiYnV0
dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsKLSAgICAgICAgfSwKLQotICAgICAgICAidGV4dCI6
IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgdmFyIGF0dHI7Ci0gICAgICAgICAgICBy
ZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmCi0gICAgICAg
ICAgICAgICAgZWxlbS50eXBlID09PSAidGV4dCIgJiYKLQotICAgICAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFPDgKLSAgICAgICAgICAgICAgICAvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVl
cyAoZS5nLiwgInNlYXJjaCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gInRleHQiCi0gICAg
ICAgICAgICAgICAgKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwg
fHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKLSAgICAgICAgfSwKLQotICAgICAg
ICAvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCi0gICAgICAgICJmaXJzdCI6IGNyZWF0ZVBvc2l0
aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gWyAwIF07Ci0gICAg
ICAgIH0pLAotCi0gICAgICAgICJsYXN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlv
biggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Ci0gICAgICAgICAgICByZXR1cm4gWyBsZW5ndGgg
LSAxIF07Ci0gICAgICAgIH0pLAotCi0gICAgICAgICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1
ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKLSAgICAgICAg
ICAgIHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQg
XTsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRv
KGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLSAgICAgICAgICAgIHZhciBpID0g
MDsKLSAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewotICAgICAgICAg
ICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICByZXR1cm4gbWF0Y2hJbmRleGVzOwotICAgICAgICB9KSwKLQotICAgICAgICAib2RkIjogY3Jl
YXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Ci0g
ICAgICAgICAgICB2YXIgaSA9IDE7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkg
Kz0gMiApIHsKLSAgICAgICAgICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAgICAgICAgfSksCi0K
LSAgICAgICAgImx0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRl
eGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewotICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8
IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwotICAgICAgICAgICAgZm9yICggOyAt
LWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtYXRjaEluZGV4ZXM7Ci0gICAgICAgIH0p
LAotCi0gICAgICAgICJndCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNo
SW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKLSAgICAgICAgICAgIHZhciBpID0gYXJndW1l
bnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDsKLSAgICAgICAgICAgIGZvciAo
IDsgKytpIDwgbGVuZ3RoOyApIHsKLSAgICAgICAgICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCgg
aSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAg
ICAgICAgfSkKLSAgICB9Ci19OwotCi1FeHByLnBzZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9z
WyJlcSJdOwotCi0vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvcwotZm9yICggaSBpbiB7
IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUs
IGltYWdlOiB0cnVlIH0gKSB7Ci0gICAgRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBz
ZXVkbyggaSApOwotfQotZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSAp
IHsKLSAgICBFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwotfQot
Ci0vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKLWZ1bmN0aW9uIHNldEZp
bHRlcnMoKSB7fQotc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBz
ZXVkb3M7Ci1FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwotCi1mdW5jdGlvbiB0
b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKLSAgICB2YXIgbWF0Y2hlZCwgbWF0Y2gs
IHRva2VucywgdHlwZSwKLSAgICAgICAgc29GYXIsIGdyb3VwcywgcHJlRmlsdGVycywKLSAgICAg
ICAgY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKLQotICAgIGlmICggY2Fj
aGVkICkgewotICAgICAgICByZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCAp
OwotICAgIH0KLQotICAgIHNvRmFyID0gc2VsZWN0b3I7Ci0gICAgZ3JvdXBzID0gW107Ci0gICAg
cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyOwotCi0gICAgd2hpbGUgKCBzb0ZhciApIHsKLQot
ICAgICAgICAvLyBDb21tYSBhbmQgZmlyc3QgcnVuCi0gICAgICAgIGlmICggIW1hdGNoZWQgfHwg
KG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkgewotICAgICAgICAgICAgaWYgKCBtYXRj
aCApIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBh
cyB2YWxpZAotICAgICAgICAgICAgICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxl
bmd0aCApIHx8IHNvRmFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JvdXBzLnB1c2go
ICh0b2tlbnMgPSBbXSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hdGNoZWQgPSBmYWxzZTsK
LQotICAgICAgICAvLyBDb21iaW5hdG9ycwotICAgICAgICBpZiAoIChtYXRjaCA9IHJjb21iaW5h
dG9ycy5leGVjKCBzb0ZhciApKSApIHsKLSAgICAgICAgICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlm
dCgpOwotICAgICAgICAgICAgdG9rZW5zLnB1c2goewotICAgICAgICAgICAgICAgIHZhbHVlOiBt
YXRjaGVkLAotICAgICAgICAgICAgICAgIC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0
byBzcGFjZQotICAgICAgICAgICAgICAgIHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCAi
ICIgKQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBzb0ZhciA9IHNvRmFyLnNsaWNlKCBt
YXRjaGVkLmxlbmd0aCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsdGVycwotICAgICAg
ICBmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgewotICAgICAgICAgICAgaWYgKCAobWF0Y2gg
PSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUg
XSB8fAotICAgICAgICAgICAgICAgIChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2gg
KSkpICkgewotICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgICAg
ICAgICAgICAgIHRva2Vucy5wdXNoKHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNo
ZWQsCi0gICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAgICAg
IG1hdGNoZXM6IG1hdGNoCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgc29G
YXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICggIW1hdGNoZWQgKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlk
IGV4Y2VzcwotICAgIC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwotICAgIC8vIE90aGVyd2lzZSwg
dGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2VucwotICAgIHJldHVybiBwYXJzZU9ubHkgPwot
ICAgICAgICBzb0Zhci5sZW5ndGggOgotICAgICAgICBzb0ZhciA/Ci0gICAgICAgICAgICBTaXp6
bGUuZXJyb3IoIHNlbGVjdG9yICkgOgotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHRva2Vucwot
ICAgICAgICAgICAgdG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Ci19
Ci0KLWZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAg
ICAgIGxlbiA9IHRva2Vucy5sZW5ndGgsCi0gICAgICAgIHNlbGVjdG9yID0gIiI7Ci0gICAgZm9y
ICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgIHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdG9yOwotfQotCi1mdW5jdGlvbiBhZGRDb21iaW5h
dG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkgewotICAgIHZhciBkaXIgPSBjb21iaW5h
dG9yLmRpciwKLSAgICAgICAgY2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFy
ZW50Tm9kZSIsCi0gICAgICAgIGRvbmVOYW1lID0gZG9uZSsrOwotCi0gICAgcmV0dXJuIGNvbWJp
bmF0b3IuZmlyc3QgPwotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3Iv
cHJlY2VkaW5nIGVsZW1lbnQKLSAgICAgICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCAp
IHsKLSAgICAgICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwg
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gOgotCi0gICAg
ICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwotICAg
ICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgdmFyIG9s
ZENhY2hlLCBvdXRlckNhY2hlLAotICAgICAgICAgICAgICAgIG5ld0NhY2hlID0gWyBkaXJydW5z
LCBkb25lTmFtZSBdOwotCi0gICAgICAgICAgICAvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRh
dGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZwot
ICAgICAgICAgICAgaWYgKCB4bWwgKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAoZWxlbSA9
IGVsZW1bIGRpciBdKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBl
ID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICB3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50
cyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRv
IF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsgZGlyIF0pICYmCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgb2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBk
b25lTmFtZSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0byBu
ZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2Fj
aGVbIDIgXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdh
dGUgdG8gcHJldmlvdXMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRl
ckNhY2hlWyBkaXIgXSA9IG5ld0NhY2hlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVw
IGNoZWNraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobmV3Q2FjaGVbIDIg
XSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotfQotCi1mdW5jdGlvbiBl
bGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7Ci0gICAgcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+
IDEgPwotICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotICAgICAgICAg
ICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7Ci0gICAgICAgICAgICB3aGlsZSAoIGktLSApIHsK
LSAgICAgICAgICAgICAgICBpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSA6Ci0g
ICAgICAgIG1hdGNoZXJzWzBdOwotfQotCi1mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBt
YXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgewotICAgIHZhciBlbGVtLAotICAgICAgICBuZXdV
bm1hdGNoZWQgPSBbXSwKLSAgICAgICAgaSA9IDAsCi0gICAgICAgIGxlbiA9IHVubWF0Y2hlZC5s
ZW5ndGgsCi0gICAgICAgIG1hcHBlZCA9IG1hcCAhPSBudWxsOwotCi0gICAgZm9yICggOyBpIDwg
bGVuOyBpKysgKSB7Ci0gICAgICAgIGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotICAg
ICAgICAgICAgaWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7
Ci0gICAgICAgICAgICAgICAgbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAg
ICAgICBpZiAoIG1hcHBlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1c2goIGkgKTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICByZXR1cm4gbmV3VW5tYXRjaGVkOwotfQotCi1mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0
ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0
b3IgKSB7Ci0gICAgaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7
Ci0gICAgICAgIHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7Ci0gICAgfQot
ICAgIGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewotICAgICAg
ICBwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7Ci0g
ICAgfQotICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNv
bnRleHQsIHhtbCApIHsKLSAgICAgICAgdmFyIHRlbXAsIGksIGVsZW0sCi0gICAgICAgICAgICBw
cmVNYXAgPSBbXSwKLSAgICAgICAgICAgIHBvc3RNYXAgPSBbXSwKLSAgICAgICAgICAgIHByZWV4
aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCi0KLSAgICAgICAgICAgIC8vIEdldCBpbml0aWFsIGVs
ZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0Ci0gICAgICAgICAgICBlbGVtcyA9IHNlZWQgfHwg
bXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBj
b250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAotCi0gICAgICAgICAgICAvLyBQcmVmaWx0ZXIgdG8g
Z2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5j
aHJvbml6YXRpb24KLSAgICAgICAgICAgIG1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQg
fHwgIXNlbGVjdG9yICkgPwotICAgICAgICAgICAgICAgIGNvbmRlbnNlKCBlbGVtcywgcHJlTWFw
LCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDoKLSAgICAgICAgICAgICAgICBlbGVtcywKLQot
ICAgICAgICAgICAgbWF0Y2hlck91dCA9IG1hdGNoZXIgPwotICAgICAgICAgICAgICAgIC8vIElm
IHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0
RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgcG9zdEZpbmRl
ciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPwot
Ci0gICAgICAgICAgICAgICAgICAgIC8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5l
Y2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBbXSA6Ci0KLSAgICAgICAgICAgICAgICAgICAg
Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgICAg
IHJlc3VsdHMgOgotICAgICAgICAgICAgICAgIG1hdGNoZXJJbjsKLQotICAgICAgICAvLyBGaW5k
IHByaW1hcnkgbWF0Y2hlcwotICAgICAgICBpZiAoIG1hdGNoZXIgKSB7Ci0gICAgICAgICAgICBt
YXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gQXBwbHkgcG9zdEZpbHRlcgotICAgICAgICBpZiAoIHBvc3RGaWx0ZXIg
KSB7Ci0gICAgICAgICAgICB0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsK
LSAgICAgICAgICAgIHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKLQotICAg
ICAgICAgICAgLy8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNr
IHRvIG1hdGNoZXJJbgotICAgICAgICAgICAgaSA9IHRlbXAubGVuZ3RoOwotICAgICAgICAgICAg
d2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkg
ewotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNo
ZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBzZWVkICkgewotICAgICAgICAgICAgaWYg
KCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHBvc3RG
aW5kZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91
dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0
cwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gW107Ci0gICAgICAgICAgICAgICAgICAgIGkg
PSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2Ug
ZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0ZW1wLnB1c2goIChtYXRjaGVySW5baV0gPSBlbGVtKSApOwotICAgICAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RG
aW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTsKLSAgICAgICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBz
ZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZAotICAgICAgICAgICAgICAg
IGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmCi0gICAg
ICAgICAgICAgICAgICAgICAgICAodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNl
ZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsKLQotICAgICAgICAgICAgICAgICAgICAg
ICAgc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEFk
ZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWF0Y2hlck91dCA9IGNvbmRlbnNlKAotICAgICAg
ICAgICAgICAgIG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwotICAgICAgICAgICAgICAgICAgICBt
YXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgotICAg
ICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAg
aWYgKCBwb3N0RmluZGVyICkgewotICAgICAgICAgICAgICAgIHBvc3RGaW5kZXIoIG51bGwsIHJl
c3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9KTsKLX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRv
a2VucyApIHsKLSAgICB2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLAotICAgICAgICBsZW4g
PSB0b2tlbnMubGVuZ3RoLAotICAgICAgICBsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZl
WyB0b2tlbnNbMF0udHlwZSBdLAotICAgICAgICBpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1Jl
bGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwKLSAgICAgICAgaSA9IGxlYWRpbmdSZWxhdGl2
ZSA/IDEgOiAwLAotCi0gICAgICAgIC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVz
IHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCi0g
ICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKLSAgICAgICAgfSwgaW1w
bGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAotICAgICAgICBtYXRjaEFueUNvbnRleHQgPSBhZGRDb21i
aW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNh
bGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7Ci0gICAgICAgIH0sIGltcGxpY2l0UmVsYXRp
dmUsIHRydWUgKSwKLSAgICAgICAgbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0
LCB4bWwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1s
IHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKLSAgICAgICAgICAgICAg
ICAoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgPwotICAgICAgICAgICAgICAgICAg
ICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKLSAgICAgICAgICAgICAgICAg
ICAgbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwotICAgICAgICB9IF07
Ci0KLSAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgaWYgKCAobWF0Y2hlciA9
IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewotICAgICAgICAgICAgbWF0Y2hl
cnMgPSBbIGFkZENvbWJpbmF0b3IoZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIp
IF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXRjaGVyID0gRXhwci5maWx0ZXJb
IHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7Ci0KLSAg
ICAgICAgICAgIC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRj
aGVyCi0gICAgICAgICAgICBpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAg
ICAgICAvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9w
ZXIgaGFuZGxpbmcKLSAgICAgICAgICAgICAgICBqID0gKytpOwotICAgICAgICAgICAgICAgIGZv
ciAoIDsgaiA8IGxlbjsgaisrICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIEV4cHIucmVs
YXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICByZXR1cm4gc2V0TWF0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgaSA+IDEgJiYgZWxl
bWVudE1hdGNoZXIoIG1hdGNoZXJzICksCi0gICAgICAgICAgICAgICAgICAgIGkgPiAxICYmIHRv
U2VsZWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJlY2VkaW5nIHRv
a2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmluYXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1l
bGVtZW50IGAqYAotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnNsaWNlKCAwLCBpIC0g
MSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDog
IiIgfSkKLSAgICAgICAgICAgICAgICAgICAgKS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAotICAg
ICAgICAgICAgICAgICAgICBtYXRjaGVyLAotICAgICAgICAgICAgICAgICAgICBpIDwgaiAmJiBt
YXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKLSAgICAgICAgICAgICAg
ICAgICAgaiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGlj
ZSggaiApKSApLAotICAgICAgICAgICAgICAgICAgICBqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRv
a2VucyApCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1h
dGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBl
bGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKLX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91
cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewotICAgIHZhciBieVNl
dCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsCi0gICAgICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRN
YXRjaGVycy5sZW5ndGggPiAwLAotICAgICAgICBzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2Vl
ZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICB2YXIg
ZWxlbSwgaiwgbWF0Y2hlciwKLSAgICAgICAgICAgICAgICBtYXRjaGVkQ291bnQgPSAwLAotICAg
ICAgICAgICAgICAgIGkgPSAiMCIsCi0gICAgICAgICAgICAgICAgdW5tYXRjaGVkID0gc2VlZCAm
JiBbXSwKLSAgICAgICAgICAgICAgICBzZXRNYXRjaGVkID0gW10sCi0gICAgICAgICAgICAgICAg
Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCi0gICAgICAgICAgICAgICAgLy8gV2Ug
bXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4
dAotICAgICAgICAgICAgICAgIGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5k
WyJUQUciXSggIioiLCBvdXRlcm1vc3QgKSwKLSAgICAgICAgICAgICAgICAvLyBVc2UgaW50ZWdl
ciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgotICAgICAgICAgICAg
ICAgIGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAx
IDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLAotICAgICAgICAgICAgICAgIGxlbiA9IGVsZW1zLmxl
bmd0aDsKLQotICAgICAgICAgICAgaWYgKCBvdXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICAgICAg
b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgIT09IGRvY3VtZW50ICYmIGNvbnRleHQ7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRN
YXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzCi0gICAgICAgICAgICAvLyBLZWVwIGBpYCBhIHN0
cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAi
MDAiIGJlbG93Ci0gICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmkKLSAgICAgICAg
ICAgIC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJp
OiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKLSAgICAgICAgICAgIGZvciAoIDsg
aSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkgewotICAgICAgICAgICAgICAgICAgICBq
ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRj
aGVyc1tqKytdKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWF0Y2hlciggZWxl
bSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0
cy5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgaWYgKCBvdXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJy
dW5zID0gZGlycnVuc1VuaXF1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Ig
c2V0IGZpbHRlcnMKLSAgICAgICAgICAgICAgICBpZiAoIGJ5U2V0ICkgewotICAgICAgICAgICAg
ICAgICAgICAvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNo
ZXJzCi0gICAgICAgICAgICAgICAgICAgIGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDb3VudC0tOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZv
ciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICBpZiAo
IHNlZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWQucHVzaCggZWxlbSAp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVu
dHMKLSAgICAgICAgICAgIG1hdGNoZWRDb3VudCArPSBpOwotICAgICAgICAgICAgaWYgKCBieVNl
dCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAg
ICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2orK10pICkgewotICAg
ICAgICAgICAgICAgICAgICBtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQs
IHhtbCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggc2VlZCAp
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRv
IGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwotICAgICAgICAgICAgICAgICAgICBpZiAo
IG1hdGNoZWRDb3VudCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGkt
LSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEodW5tYXRjaGVkW2ldIHx8
IHNldE1hdGNoZWRbaV0pICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRN
YXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVl
cyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwotICAgICAgICAgICAgICAgICAgICBzZXRNYXRj
aGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICAvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzCi0gICAgICAgICAgICAgICAgcHVz
aC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOwotCi0gICAgICAgICAgICAgICAgLy8gU2Vl
ZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJz
IHN0aXB1bGF0ZSBzb3J0aW5nCi0gICAgICAgICAgICAgICAgaWYgKCBvdXRlcm1vc3QgJiYgIXNl
ZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICggbWF0
Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewotCi0gICAgICAgICAgICAg
ICAgICAgIFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2Yg
Z2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKLSAgICAgICAgICAgIGlmICggb3V0ZXJtb3N0ICkg
ewotICAgICAgICAgICAgICAgIGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOwotICAgICAgICAgICAg
ICAgIG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICByZXR1cm4gdW5tYXRjaGVkOwotICAgICAgICB9OwotCi0gICAgcmV0dXJuIGJ5
U2V0ID8KLSAgICAgICAgbWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6Ci0gICAgICAgIHN1
cGVyTWF0Y2hlcjsKLX0KLQotY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNl
bGVjdG9yLCBncm91cCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKLSAgICB2YXIgaSwKLSAg
ICAgICAgc2V0TWF0Y2hlcnMgPSBbXSwKLSAgICAgICAgZWxlbWVudE1hdGNoZXJzID0gW10sCi0g
ICAgICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07Ci0KLSAgICBp
ZiAoICFjYWNoZWQgKSB7Ci0gICAgICAgIC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJz
aXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAotICAg
ICAgICBpZiAoICFncm91cCApIHsKLSAgICAgICAgICAgIGdyb3VwID0gdG9rZW5pemUoIHNlbGVj
dG9yICk7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IGdyb3VwLmxlbmd0aDsKLSAgICAgICAgd2hp
bGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICBjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggZ3Jv
dXBbaV0gKTsKLSAgICAgICAgICAgIGlmICggY2FjaGVkWyBleHBhbmRvIF0gKSB7Ci0gICAgICAg
ICAgICAgICAgc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7Ci0gICAgICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgICAgIGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5j
dGlvbgotICAgICAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZy
b21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKLSAgICB9
Ci0gICAgcmV0dXJuIGNhY2hlZDsKLX07Ci0KLWZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNl
bGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGxl
biA9IGNvbnRleHRzLmxlbmd0aDsKLSAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAg
ICAgU2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTsKLSAgICB9Ci0gICAg
cmV0dXJuIHJlc3VsdHM7Ci19Ci0KLWZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQs
IHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQs
Ci0gICAgICAgIG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7Ci0KLSAgICBpZiAoICFzZWVk
ICkgewotICAgICAgICAvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBv
bmx5IG9uZSBncm91cAotICAgICAgICBpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHsKLQotICAg
ICAgICAgICAgLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJv
b3Qgc2VsZWN0b3IgaXMgYW4gSUQKLSAgICAgICAgICAgIHRva2VucyA9IG1hdGNoWzBdID0gbWF0
Y2hbMF0uc2xpY2UoIDAgKTsKLSAgICAgICAgICAgIGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYg
KHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSAiSUQiICYmCi0gICAgICAgICAgICAgICAgICAg
IHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNI
VE1MICYmCi0gICAgICAgICAgICAgICAgICAgIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBl
IF0gKSB7Ci0KLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gKCBFeHByLmZpbmRbIklEIl0oIHRv
a2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8
fCBbXSApWzBdOwotICAgICAgICAgICAgICAgIGlmICggIWNvbnRleHQgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5n
dGggKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmV0Y2ggYSBzZWVkIHNldCBm
b3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwotICAgICAgICAgICAgaSA9IG1hdGNoRXhwclsibmVl
ZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoOwotICAgICAg
ICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07
Ci0KLSAgICAgICAgICAgICAgICAvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCi0gICAg
ICAgICAgICAgICAgaWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkgewotICAgICAgICAgICAg
ICAgICAgICAvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcg
Y29tYmluYXRvcnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc2VlZCA9IGZpbmQoCi0gICAg
ICAgICAgICAgICAgICAgICAgICB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwg
ZnVuZXNjYXBlICksCi0gICAgICAgICAgICAgICAgICAgICAgICByc2libGluZy50ZXN0KCB0b2tl
bnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250
ZXh0Ci0gICAgICAgICAgICAgICAgICAgICkpICkgewotCi0gICAgICAgICAgICAgICAgICAgICAg
ICAvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4g
ZWFybHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5zcGxpY2UoIGksIDEgKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3Rv
ciggdG9rZW5zICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFzZWxlY3RvciApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5j
dGlvbgotICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3
ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKLSAgICBjb21waWxlKCBzZWxlY3RvciwgbWF0
Y2ggKSgKLSAgICAgICAgc2VlZCwKLSAgICAgICAgY29udGV4dCwKLSAgICAgICAgIWRvY3VtZW50
SXNIVE1MLAotICAgICAgICByZXN1bHRzLAotICAgICAgICByc2libGluZy50ZXN0KCBzZWxlY3Rv
ciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Ci0gICAg
KTsKLSAgICByZXR1cm4gcmVzdWx0czsKLX0KLQotLy8gT25lLXRpbWUgYXNzaWdubWVudHMKLQot
Ly8gU29ydCBzdGFiaWxpdHkKLXN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIiIp
LnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIiIpID09PSBleHBhbmRvOwotCi0vLyBTdXBwb3J0OiBD
aHJvbWU8MTQKLS8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNz
ZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24KLXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9
ICEhaGFzRHVwbGljYXRlOwotCi0vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9j
dW1lbnQKLXNldERvY3VtZW50KCk7Ci0KLS8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZh
cmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi0vLyBEZXRhY2hlZCBub2Rl
cyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcioKLXN1cHBvcnQuc29ydERldGFjaGVk
ID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkgewotICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0
IHJldHVybnMgNCAoZm9sbG93aW5nKQotICAgIHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApICYgMTsKLX0pOwotCi0vLyBT
dXBwb3J0OiBJRTw4Ci0vLyBQcmV2ZW50IGF0dHJpYnV0ZS9wcm9wZXJ0eSAiaW50ZXJwb2xhdGlv
biIKLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUy
OFZTLjg1JTI5LmFzcHgKLWlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkgewotICAgIGRpdi5p
bm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENoaWxk
LmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiIyIgOwotfSkgKSB7Ci0gICAgYWRkSGFuZGxlKCAi
dHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsK
LSAgICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRy
aWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKLSAg
ICAgICAgfQotICAgIH0pOwotfQotCi0vLyBTdXBwb3J0OiBJRTw5Ci0vLyBVc2UgZGVmYXVsdFZh
bHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZSgidmFsdWUiKQotaWYgKCAhc3VwcG9ydC5hdHRy
aWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICBkaXYuaW5uZXJIVE1MID0g
IjxpbnB1dC8+IjsKLSAgICBkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIi
ICk7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggInZhbHVlIiApID09
PSAiIjsKLX0pICkgewotICAgIGFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5h
bWUsIGlzWE1MICkgewotICAgICAgICBpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93
ZXJDYXNlKCkgPT09ICJpbnB1dCIgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbS5kZWZhdWx0
VmFsdWU7Ci0gICAgICAgIH0KLSAgICB9KTsKLX0KLQotLy8gU3VwcG9ydDogSUU8OQotLy8gVXNl
IGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2ggYm9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGll
cwotaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgcmV0dXJuIGRpdi5nZXRBdHRy
aWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKLX0pICkgewotICAgIGFkZEhhbmRsZSggYm9vbGVh
bnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLSAgICAgICAgdmFyIHZhbDsKLSAg
ICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbVsgbmFtZSBdID09
PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgKHZhbCA9
IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KLSAgICAg
ICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoKLSAgICAgICAgICAgICAgICBudWxsOwotICAgICAg
ICB9Ci0gICAgfSk7Ci19Ci0KLXJldHVybiBTaXp6bGU7Ci0KLX0pKCB3aW5kb3cgKTsKLQotCi0K
LWpRdWVyeS5maW5kID0gU2l6emxlOwotalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwot
alF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7Ci1qUXVlcnkudW5pcXVlID0g
U2l6emxlLnVuaXF1ZVNvcnQ7Ci1qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0OwotalF1ZXJ5
LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MOwotalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRh
aW5zOwotCi0KLQotdmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0Nv
bnRleHQ7Ci0KLXZhciByc2luZ2xlVGFnID0gKC9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8p
OwotCi0KLQotdmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC87Ci0KLS8vIEltcGxlbWVu
dCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90Ci1mdW5jdGlv
biB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHsKLSAgICBpZiAoIGpRdWVyeS5p
c0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5ncmVwKCBl
bGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7Ci0gICAgICAgICAgICAvKiBqc2hpbnQgLVcw
MTggKi8KLSAgICAgICAgICAgIHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVt
ICkgIT09IG5vdDsKLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICBpZiAoIHF1YWxpZmllci5u
b2RlVHlwZSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rp
b24oIGVsZW0gKSB7Ci0gICAgICAgICAgICByZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAh
PT0gbm90OwotICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIGlmICggdHlwZW9mIHF1YWxpZmll
ciA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAgIGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmll
ciApICkgewotICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxl
bWVudHMsIG5vdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZp
bHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApOwotICAgIH0KLQotICAgIHJldHVybiBqUXVlcnku
Z3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4gKCBpbmRl
eE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID49IDAgKSAhPT0gbm90OwotICAgIH0pOwotfQot
Ci1qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Ci0gICAgdmFy
IGVsZW0gPSBlbGVtc1sgMCBdOwotCi0gICAgaWYgKCBub3QgKSB7Ci0gICAgICAgIGV4cHIgPSAi
Om5vdCgiICsgZXhwciArICIpIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09
PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgPwotICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVz
U2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW10gOgotICAgICAgICBqUXVlcnku
ZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkg
ewotICAgICAgICAgICAgcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7Ci0gICAgICAgIH0pKTsK
LX07Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciAp
IHsKLSAgICAgICAgdmFyIGksCi0gICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aCwKLSAgICAg
ICAgICAgIHJldCA9IFtdLAotICAgICAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICAgICAgaWYg
KCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgcmV0dXJuIHRo
aXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkgewotICAg
ICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSkgKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICBqUXVlcnkuZmluZCgg
c2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZWVk
ZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZp
bmQoIHNlbGVjdG9yICkKLSAgICAgICAgcmV0ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEgPyBq
UXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApOwotICAgICAgICByZXQuc2VsZWN0b3IgPSB0aGlz
LnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArICIgIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7Ci0g
ICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwKLSAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3Rv
ciApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0
b3IgfHwgW10sIGZhbHNlKSApOwotICAgIH0sCi0gICAgbm90OiBmdW5jdGlvbiggc2VsZWN0b3Ig
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9y
IHx8IFtdLCB0cnVlKSApOwotICAgIH0sCi0gICAgaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsK
LSAgICAgICAgcmV0dXJuICEhd2lubm93KAotICAgICAgICAgICAgdGhpcywKLQotICAgICAgICAg
ICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1l
bWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldAotICAgICAgICAgICAgLy8gc28gJCgicDpmaXJz
dCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAi
LgotICAgICAgICAgICAgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiAmJiBybmVlZHNDb250
ZXh0LnRlc3QoIHNlbGVjdG9yICkgPwotICAgICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3Ig
KSA6Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgfHwgW10sCi0gICAgICAgICAgICBmYWxzZQot
ICAgICAgICApLmxlbmd0aDsKLSAgICB9Ci19KTsKLQotCi0vLyBJbml0aWFsaXplIGEgalF1ZXJ5
IG9iamVjdAotCi0KLS8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRv
Y3VtZW50KQotdmFyIHJvb3RqUXVlcnksCi0KLSAgICAvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sg
Zm9yIEhUTUwgc3RyaW5ncwotICAgIC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZv
aWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSkKLSAgICAvLyBTdHJpY3QgSFRNTCByZWNv
Z25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPCkKLSAgICBycXVpY2tFeHByID0gL14o
PzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLywKLQotICAgIGluaXQgPSBqUXVlcnku
Zm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKLSAgICAgICAgdmFyIG1h
dGNoLCBlbGVtOwotCi0gICAgICAgIC8vIEhBTkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZp
bmVkKSwgJChmYWxzZSkKLSAgICAgICAgaWYgKCAhc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBIVE1MIHN0cmluZ3MK
LSAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewotICAgICAgICAg
ICAgaWYgKCBzZWxlY3RvclswXSA9PT0gIjwiICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGgg
LSAxIF0gPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKLSAgICAgICAgICAgICAg
ICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBI
VE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVjawotICAgICAgICAgICAgICAgIG1hdGNoID0gWyBu
dWxsLCBzZWxlY3RvciwgbnVsbCBdOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgIG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlz
IHNwZWNpZmllZCBmb3IgI2lkCi0gICAgICAgICAgICBpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8
fCAhY29udGV4dCkgKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBIQU5ETEU6ICQoaHRtbCkgLT4g
JChhcnJheSkKLSAgICAgICAgICAgICAgICBpZiAoIG1hdGNoWzFdICkgewotICAgICAgICAgICAg
ICAgICAgICBjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0g
OiBjb250ZXh0OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3Ig
YmFjay1jb21wYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZXQgdGhl
IGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKLSAgICAgICAgICAg
ICAgICAgICAgalF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKAotICAgICAgICAg
ICAgICAgICAgICAgICAgbWF0Y2hbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0
ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6
IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgICAg
ICAgICApICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKGh0bWwsIHByb3Bz
KQotICAgICAgICAgICAgICAgICAgICBpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAm
JiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgZm9yICggbWF0Y2ggaW4gY29udGV4dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBv
c3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlv
biggdGhpc1sgbWF0Y2ggXSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7Ci0KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgICAg
ICAgICAgLy8gSEFORExFOiAkKCNpZCkKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7
Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVu
IEJsYWNrYmVycnkgNC42IHJldHVybnMKLSAgICAgICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhh
dCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MwotICAgICAgICAgICAgICAgICAg
ICBpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QK
LSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHRoaXNbMF0gPSBlbGVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7Ci0gICAgICAgICAgICAgICAg
ICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBIQU5ETEU6ICQoZXhw
ciwgJCguLi4pKQotICAgICAgICAgICAgfSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5q
cXVlcnkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5
ICkuZmluZCggc2VsZWN0b3IgKTsKLQotICAgICAgICAgICAgLy8gSEFORExFOiAkKGV4cHIsIGNv
bnRleHQpCi0gICAgICAgICAgICAvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNv
bnRleHQpLmZpbmQoZXhwcikKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwotICAg
ICAgICAgICAgfQotCi0gICAgICAgIC8vIEhBTkRMRTogJChET01FbGVtZW50KQotICAgICAgICB9
IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKLSAgICAgICAgICAgIHRoaXMuY29udGV4
dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKLSAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKLSAg
ICAgICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgIC8vIEhBTkRMRTogJChmdW5jdGlvbikK
LSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5Ci0gICAgICAgIH0gZWxzZSBp
ZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewotICAgICAgICAgICAgcmV0dXJu
IHR5cGVvZiByb290alF1ZXJ5LnJlYWR5ICE9PSAidW5kZWZpbmVkIiA/Ci0gICAgICAgICAgICAg
ICAgcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKSA6Ci0gICAgICAgICAgICAgICAgLy8gRXhl
Y3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudAotICAgICAgICAgICAgICAg
IHNlbGVjdG9yKCBqUXVlcnkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggc2VsZWN0b3Iu
c2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBz
ZWxlY3Rvci5zZWxlY3RvcjsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNv
bnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2Vs
ZWN0b3IsIHRoaXMgKTsKLSAgICB9OwotCi0vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBq
UXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCi1pbml0LnByb3RvdHlwZSA9
IGpRdWVyeS5mbjsKLQotLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZQotcm9vdGpRdWVy
eSA9IGpRdWVyeSggZG9jdW1lbnQgKTsKLQotCi12YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJl
bnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCi0gICAgLy8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHBy
b2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQKLSAgICBn
dWFyYW50ZWVkVW5pcXVlID0gewotICAgICAgICBjaGlsZHJlbjogdHJ1ZSwKLSAgICAgICAgY29u
dGVudHM6IHRydWUsCi0gICAgICAgIG5leHQ6IHRydWUsCi0gICAgICAgIHByZXY6IHRydWUKLSAg
ICB9OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVu
dGlsICkgewotICAgICAgICB2YXIgbWF0Y2hlZCA9IFtdLAotICAgICAgICAgICAgdHJ1bmNhdGUg
PSB1bnRpbCAhPT0gdW5kZWZpbmVkOwotCi0gICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBk
aXIgXSkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHsKLSAgICAgICAgICAgIGlmICggZWxlbS5u
b2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHRydW5jYXRlICYmIGpRdWVy
eSggZWxlbSApLmlzKCB1bnRpbCApICkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKCBlbGVtICk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoZWQ7Ci0gICAgfSwK
LQotICAgIHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewotICAgICAgICB2YXIgbWF0Y2hl
ZCA9IFtdOwotCi0gICAgICAgIGZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7Ci0gICAg
ICAgICAgICBpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHsKLSAgICAgICAg
ICAgICAgICBtYXRjaGVkLnB1c2goIG4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBtYXRjaGVkOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsK
LSAgICBoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7Ci0gICAgICAgIHZhciB0YXJnZXRzID0galF1
ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKLSAgICAgICAgICAgIGwgPSB0YXJnZXRzLmxlbmd0aDsKLQot
ICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIg
aSA9IDA7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbaV0gKSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9y
cywgY29udGV4dCApIHsKLSAgICAgICAgdmFyIGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAotICAg
ICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAotICAgICAgICAgICAgbWF0Y2hlZCA9IFtdLAotICAg
ICAgICAgICAgcG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Yg
c2VsZWN0b3JzICE9PSAic3RyaW5nIiA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCBzZWxlY3Rv
cnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgotICAgICAgICAgICAgICAgIDA7Ci0KLSAg
ICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkgewotICAgICAgICAgICAgZm9yICggY3VyID0gdGhp
c1tpXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzCi0gICAgICAg
ICAgICAgICAgaWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAocG9zID8KLSAgICAgICAgICAgICAg
ICAgICAgcG9zLmluZGV4KGN1cikgPiAtMSA6Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRG9u
J3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlCi0gICAgICAgICAgICAgICAgICAgIGN1ci5u
b2RlVHlwZSA9PT0gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmZpbmQubWF0
Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSkgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAg
bWF0Y2hlZC5wdXNoKCBjdXIgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRo
aXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVk
ICkgOiBtYXRjaGVkICk7Ci0gICAgfSwKLQotICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24g
b2YgYW4gZWxlbWVudCB3aXRoaW4KLSAgICAvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMK
LSAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0KLSAgICAgICAgLy8gTm8gYXJndW1lbnQs
IHJldHVybiBpbmRleCBpbiBwYXJlbnQKLSAgICAgICAgaWYgKCAhZWxlbSApIHsKLSAgICAgICAg
ICAgIHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5m
aXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlu
ZGV4IGluIHNlbGVjdG9yCi0gICAgICAgIGlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkg
ewotICAgICAgICAgICAgcmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNb
IDAgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0
aGUgZGVzaXJlZCBlbGVtZW50Ci0gICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsCi0K
LSAgICAgICAgICAgIC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0
IGVsZW1lbnQgaXMgdXNlZAotICAgICAgICAgICAgZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBl
bGVtCi0gICAgICAgICk7Ci0gICAgfSwKLQotICAgIGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBj
b250ZXh0ICkgewotICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soCi0gICAgICAgICAgICBq
UXVlcnkudW5pcXVlKAotICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwg
alF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApICkKLSAgICAgICAgICAgICkKLSAgICAgICAgKTsK
LSAgICB9LAotCi0gICAgYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotICAgICAgICBy
ZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwotICAgICAgICAgICAgdGhpcy5wcmV2
T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3RvcikKLSAgICAgICAgKTsKLSAg
ICB9Ci19KTsKLQotZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7Ci0gICAgd2hpbGUgKCAo
Y3VyID0gY3VyW2Rpcl0pICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9Ci0gICAgcmV0dXJuIGN1
cjsKLX0KLQotalF1ZXJ5LmVhY2goewotICAgIHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0g
ICAgICAgIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7Ci0gICAgICAgIHJldHVybiBwYXJl
bnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7Ci0gICAgfSwKLSAg
ICBwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5kaXIo
IGVsZW0sICJwYXJlbnROb2RlIiApOwotICAgIH0sCi0gICAgcGFyZW50c1VudGlsOiBmdW5jdGlv
biggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAi
cGFyZW50Tm9kZSIsIHVudGlsICk7Ci0gICAgfSwKLSAgICBuZXh0OiBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICAgICAgcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKLSAgICB9
LAotICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4gc2libGluZygg
ZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKLSAgICB9LAotICAgIG5leHRBbGw6IGZ1bmN0aW9u
KCBlbGVtICkgewotICAgICAgICByZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5n
IiApOwotICAgIH0sCi0gICAgcHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHJl
dHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwotICAgIH0sCi0gICAg
bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBq
UXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCApOwotICAgIH0sCi0gICAgcHJl
dlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVl
cnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiwgdW50aWwgKTsKLSAgICB9LAotICAgIHNp
YmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5n
KCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsKLSAgICB9LAot
ICAgIGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5z
aWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKLSAgICB9LAotICAgIGNvbnRlbnRzOiBmdW5jdGlv
biggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVy
eS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApOwotICAgIH0KLX0sIGZ1bmN0aW9uKCBuYW1l
LCBmbiApIHsKLSAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0
b3IgKSB7Ci0gICAgICAgIHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGls
ICk7Ci0KLSAgICAgICAgaWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSAiVW50aWwiICkgewotICAg
ICAgICAgICAgc2VsZWN0b3IgPSB1bnRpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggc2Vs
ZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIG1h
dGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUg
ZHVwbGljYXRlcwotICAgICAgICAgICAgaWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkg
ewotICAgICAgICAgICAgICAgIGpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYt
ZGVyaXZhdGl2ZXMKLSAgICAgICAgICAgIGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSAp
IHsKLSAgICAgICAgICAgICAgICBtYXRjaGVkLnJldmVyc2UoKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApOwotICAg
IH07Ci19KTsKLXZhciBybm90d2hpdGUgPSAoL1xTKy9nKTsKLQotCi0KLS8vIFN0cmluZyB0byBP
YmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUKLXZhciBvcHRpb25zQ2FjaGUgPSB7fTsKLQotLy8g
Q29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9u
ZXMgYW5kIHN0b3JlIGluIGNhY2hlCi1mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkg
ewotICAgIHZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9OwotICAgIGpR
dWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8s
IGZsYWcgKSB7Ci0gICAgICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKLSAgICB9KTsKLSAgICBy
ZXR1cm4gb2JqZWN0OwotfQotCi0vKgotICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0
aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0gKgotICogIG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxp
c3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3cKLSAqICAg
ICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBv
cHRpb24gb2JqZWN0Ci0gKgotICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3Qg
bGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKLSAqICJmaXJlZCIgbXVsdGlw
bGUgdGltZXMuCi0gKgotICogUG9zc2libGUgb3B0aW9uczoKLSAqCi0gKiAgb25jZTogICAgICAg
ICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2Ug
KGxpa2UgYSBEZWZlcnJlZCkKLSAqCi0gKiAgbWVtb3J5OiAgICAgICAgIHdpbGwga2VlcCB0cmFj
ayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKLSAq
ICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdh
eSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXplZCIKLSAqICAgICAgICAgICAgICAgICAgdmFsdWVz
IChsaWtlIGEgRGVmZXJyZWQpCi0gKgotICogIHVuaXF1ZTogICAgICAgICB3aWxsIGVuc3VyZSBh
IGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlz
dCkKLSAqCi0gKiAgc3RvcE9uRmFsc2U6ICAgIGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2Fs
bGJhY2sgcmV0dXJucyBmYWxzZQotICoKLSAqLwotalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9u
KCBvcHRpb25zICkgewotCi0gICAgLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1h
dHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZAotICAgIC8vICh3ZSBjaGVjayBpbiBj
YWNoZSBmaXJzdCkKLSAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8K
LSAgICAgICAgKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRp
b25zICkgKSA6Ci0gICAgICAgIGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7Ci0KLSAgICB2
YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQotICAgICAg
ICBtZW1vcnksCi0gICAgICAgIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZp
cmVkCi0gICAgICAgIGZpcmVkLAotICAgICAgICAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBj
dXJyZW50bHkgZmlyaW5nCi0gICAgICAgIGZpcmluZywKLSAgICAgICAgLy8gRmlyc3QgY2FsbGJh
Y2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCi0gICAgICAg
IGZpcmluZ1N0YXJ0LAotICAgICAgICAvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKLSAg
ICAgICAgZmlyaW5nTGVuZ3RoLAotICAgICAgICAvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5n
IGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKQotICAgICAgICBmaXJpbmdJ
bmRleCwKLSAgICAgICAgLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKLSAgICAgICAgbGlzdCA9IFtd
LAotICAgICAgICAvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCi0g
ICAgICAgIHN0YWNrID0gIW9wdGlvbnMub25jZSAmJiBbXSwKLSAgICAgICAgLy8gRmlyZSBjYWxs
YmFja3MKLSAgICAgICAgZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkgewotICAgICAgICAgICAgbWVt
b3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTsKLSAgICAgICAgICAgIGZpcmVkID0gdHJ1ZTsK
LSAgICAgICAgICAgIGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDsKLSAgICAgICAgICAg
IGZpcmluZ1N0YXJ0ID0gMDsKLSAgICAgICAgICAgIGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3Ro
OwotICAgICAgICAgICAgZmlyaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoIDsgbGlzdCAm
JiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsg
MSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcg
YWRkCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGZpcmluZyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCBs
aXN0ICkgewotICAgICAgICAgICAgICAgIGlmICggc3RhY2sgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmICggc3RhY2subGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSgg
c3RhY2suc2hpZnQoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIGlmICggbWVtb3J5ICkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gW107Ci0g
ICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxl
KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LAotICAgICAg
ICAvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdAotICAgICAgICBzZWxmID0gewotICAgICAgICAg
ICAgLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUg
bGlzdAotICAgICAgICAgICAgYWRkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IGxpc3QgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJy
ZW50IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsK
LSAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uIGFkZCggYXJncyApIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwg
IXNlbGYuaGFzKCBhcmcgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGxpc3QucHVzaCggYXJnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAm
JiB0eXBlICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gSW5zcGVjdCByZWN1cnNpdmVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
ZGQoIGFyZyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9KSggYXJndW1lbnRzICk7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhl
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZmlyaW5nIGJhdGNoPwotICAgICAgICAg
ICAgICAgICAgICBpZiAoIGZpcmluZyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmlu
Z0xlbmd0aCA9IGxpc3QubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIG1lbW9y
eSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNo
b3VsZCBjYWxsIHJpZ2h0IGF3YXkKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWVt
b3J5ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nU3RhcnQgPSBzdGFydDsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGZpcmUoIG1lbW9yeSApOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAg
ICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxp
c3QKLSAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KCBsaXN0ICkgewotICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBm
dW5jdGlvbiggXywgYXJnICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4Owot
ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXko
IGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbGlzdC5zcGxpY2UoIGluZGV4LCAxICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCBmaXJpbmcgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXgg
PD0gZmlyaW5nTGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmlyaW5nTGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZ0luZGV4LS07Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAg
ICAgIH0sCi0gICAgICAgICAgICAvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRo
ZSBsaXN0LgotICAgICAgICAgICAgLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3
aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCi0gICAgICAgICAgICBo
YXM6IGZ1bmN0aW9uKCBmbiApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm4gPyBqUXVlcnku
aW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKLSAg
ICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRo
ZSBsaXN0Ci0gICAgICAgICAgICBlbXB0eTogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAg
bGlzdCA9IFtdOwotICAgICAgICAgICAgICAgIGZpcmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gSGF2ZSB0
aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUKLSAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9u
KCkgewotICAgICAgICAgICAgICAgIGxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsK
LSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAg
ICAvLyBJcyBpdCBkaXNhYmxlZD8KLSAgICAgICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgICAgICAgICByZXR1cm4gIWxpc3Q7Ci0gICAgICAgICAgICB9LAotICAgICAgICAg
ICAgLy8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZQotICAgICAgICAgICAgbG9j
azogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgc3RhY2sgPSB1bmRlZmluZWQ7Ci0gICAg
ICAgICAgICAgICAgaWYgKCAhbWVtb3J5ICkgewotICAgICAgICAgICAgICAgICAgICBzZWxmLmRp
c2FibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7
Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gSXMgaXQgbG9ja2VkPwotICAgICAgICAg
ICAgbG9ja2VkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIXN0YWNrOwot
ICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRo
ZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMKLSAgICAgICAgICAgIGZpcmVXaXRoOiBmdW5j
dGlvbiggY29udGV4dCwgYXJncyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxpc3QgJiYgKCAh
ZmlyZWQgfHwgc3RhY2sgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3MgfHwg
W107Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBh
cmdzLnNsaWNlKCkgOiBhcmdzIF07Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZmlyaW5nICkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCggYXJncyApOwotICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSggYXJncyAp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIENhbGwgYWxs
IHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCi0gICAgICAgICAgICBmaXJl
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1
bWVudHMgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0g
ICAgICAgICAgICAvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4g
Y2FsbGVkIGF0IGxlYXN0IG9uY2UKLSAgICAgICAgICAgIGZpcmVkOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gISFmaXJlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsK
LQotICAgIHJldHVybiBzZWxmOwotfTsKLQotCi1qUXVlcnkuZXh0ZW5kKHsKLQotICAgIERlZmVy
cmVkOiBmdW5jdGlvbiggZnVuYyApIHsKLSAgICAgICAgdmFyIHR1cGxlcyA9IFsKLSAgICAgICAg
ICAgICAgICAvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3Rh
dGUKLSAgICAgICAgICAgICAgICBbICJyZXNvbHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tz
KCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQiIF0sCi0gICAgICAgICAgICAgICAgWyAicmVqZWN0
IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQiIF0s
Ci0gICAgICAgICAgICAgICAgWyAibm90aWZ5IiwgInByb2dyZXNzIiwgalF1ZXJ5LkNhbGxiYWNr
cygibWVtb3J5IikgXQotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIHN0YXRlID0gInBlbmRp
bmciLAotICAgICAgICAgICAgcHJvbWlzZSA9IHsKLSAgICAgICAgICAgICAgICBzdGF0ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgICAg
ICAgICB9LAotICAgICAgICAgICAgICAgIGFsd2F5czogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAgICB9LAotICAg
ICAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVz
cyAqLyApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGZucyA9IGFyZ3VtZW50czsKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlv
biggaSwgdHVwbGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0galF1
ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9y
d2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMg
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXR1cm5lZCAmJiBqUXVl
cnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuZWQucHJvbWlzZSgpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVm
ZXIubm90aWZ5ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZWZlclsgdHVwbGVbIDAgXSAr
ICJXaXRoIiBdKCB0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywg
Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
ICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbnMgPSBudWxsOwotICAg
ICAgICAgICAgICAgICAgICB9KS5wcm9taXNlKCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAg
ICAgICAgICAgICAvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCi0gICAgICAgICAg
ICAgICAgLy8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQg
dG8gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgIHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQo
IG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9LAotICAgICAgICAgICAgZGVmZXJyZWQgPSB7fTsKLQotICAgICAgICAvLyBLZWVwIHBpcGUg
Zm9yIGJhY2stY29tcGF0Ci0gICAgICAgIHByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKLQot
ICAgICAgICAvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzCi0gICAgICAgIGpRdWVyeS5lYWNo
KCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0g
dHVwbGVbIDIgXSwKLSAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07Ci0K
LSAgICAgICAgICAgIC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3Qu
YWRkCi0gICAgICAgICAgICBwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7Ci0KLSAgICAg
ICAgICAgIC8vIEhhbmRsZSBzdGF0ZQotICAgICAgICAgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsK
LSAgICAgICAgICAgICAgICBsaXN0LmFkZChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXQotICAgICAgICAgICAgICAgICAg
ICBzdGF0ZSA9IHN0YXRlU3RyaW5nOwotCi0gICAgICAgICAgICAgICAgLy8gWyByZWplY3RfbGlz
dCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9jawotICAgICAgICAg
ICAgICAgIH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0u
bG9jayApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZWZlcnJlZFsgcmVzb2x2
ZSB8IHJlamVjdCB8IG5vdGlmeSBdCi0gICAgICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gXSA9
IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGRlZmVycmVkWyB0dXBsZVswXSArICJXaXRo
IiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHByb21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBk
ZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7Ci0gICAgICAgIH0p
OwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZQotICAgICAgICBwcm9t
aXNlLnByb21pc2UoIGRlZmVycmVkICk7Ci0KLSAgICAgICAgLy8gQ2FsbCBnaXZlbiBmdW5jIGlm
IGFueQotICAgICAgICBpZiAoIGZ1bmMgKSB7Ci0gICAgICAgICAgICBmdW5jLmNhbGwoIGRlZmVy
cmVkLCBkZWZlcnJlZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsIGRvbmUhCi0gICAg
ICAgIHJldHVybiBkZWZlcnJlZDsKLSAgICB9LAotCi0gICAgLy8gRGVmZXJyZWQgaGVscGVyCi0g
ICAgd2hlbjogZnVuY3Rpb24oIHN1Ym9yZGluYXRlIC8qICwgLi4uLCBzdWJvcmRpbmF0ZU4gKi8g
KSB7Ci0gICAgICAgIHZhciBpID0gMCwKLSAgICAgICAgICAgIHJlc29sdmVWYWx1ZXMgPSBzbGlj
ZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAgICAgICAgIGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMu
bGVuZ3RoLAotCi0gICAgICAgICAgICAvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3Jk
aW5hdGVzCi0gICAgICAgICAgICByZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRp
bmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5n
dGggOiAwLAotCi0gICAgICAgICAgICAvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZl
VmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC4K
LSAgICAgICAgICAgIGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBq
UXVlcnkuRGVmZXJyZWQoKSwKLQotICAgICAgICAgICAgLy8gVXBkYXRlIGZ1bmN0aW9uIGZvciBi
b3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlcwotICAgICAgICAgICAgdXBkYXRlRnVuYyA9
IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkgewotICAgICAgICAgICAgICAgIHJldHVy
biBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRzWyBpIF0g
PSB0aGlzOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5n
dGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApOwotICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9
LAotCi0gICAgICAgICAgICBwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2
ZUNvbnRleHRzOwotCi0gICAgICAgIC8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3Jk
aW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWQKLSAgICAgICAgaWYgKCBsZW5ndGggPiAx
ICkgewotICAgICAgICAgICAgcHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwot
ICAgICAgICAgICAgcHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7Ci0gICAg
ICAgICAgICByZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwotICAgICAgICAg
ICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCByZXNv
bHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5w
cm9taXNlICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9t
aXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNv
bHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAu
ZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9ncmVz
cyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOwot
ICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tcmVtYWluaW5n
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IC8vIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXIK
LSAgICAgICAgaWYgKCAhcmVtYWluaW5nICkgewotICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2
ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApOwotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTsKLSAgICB9Ci19KTsKLQotCi0vLyBUaGUg
ZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHkKLXZhciByZWFkeUxpc3Q7Ci0KLWpRdWVyeS5mbi5y
ZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHsKLSAgICAvLyBBZGQgdGhlIGNhbGxiYWNrCi0gICAgalF1
ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19Owot
Ci1qUXVlcnkuZXh0ZW5kKHsKLSAgICAvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNl
dCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgotICAgIGlzUmVhZHk6IGZhbHNlLAotCi0gICAgLy8g
QSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQotICAg
IC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCi0gICAgcmVhZHlXYWl0OiAxLAot
Ci0gICAgLy8gSG9sZCAob3IgcmVsZWFzZSkgdGhlIHJlYWR5IGV2ZW50Ci0gICAgaG9sZFJlYWR5
OiBmdW5jdGlvbiggaG9sZCApIHsKLSAgICAgICAgaWYgKCBob2xkICkgewotICAgICAgICAgICAg
alF1ZXJ5LnJlYWR5V2FpdCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgalF1ZXJ5
LnJlYWR5KCB0cnVlICk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gSGFuZGxlIHdoZW4g
dGhlIERPTSBpcyByZWFkeQotICAgIHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHsKLQotICAgICAg
ICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJl
YWR5Ci0gICAgICAgIGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpR
dWVyeS5pc1JlYWR5ICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlzIHJlYWR5Ci0gICAgICAgIGpRdWVyeS5pc1Jl
YWR5ID0gdHJ1ZTsKLQotICAgICAgICAvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmly
ZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQotICAgICAgICBpZiAoIHdhaXQgIT09
IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRv
IGV4ZWN1dGUKLSAgICAgICAgcmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVl
cnkgXSApOwotCi0gICAgICAgIC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwotICAg
ICAgICBpZiAoIGpRdWVyeS5mbi50cmlnZ2VyICkgewotICAgICAgICAgICAgalF1ZXJ5KCBkb2N1
bWVudCApLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpOwotICAgICAgICB9Ci0gICAgfQot
fSk7Ci0KLS8qKgotICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBt
ZXRob2QKLSAqLwotZnVuY3Rpb24gY29tcGxldGVkKCkgewotICAgIGRvY3VtZW50LnJlbW92ZUV2
ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwotICAg
IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsK
LSAgICBqUXVlcnkucmVhZHkoKTsKLX0KLQotalF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlv
biggb2JqICkgewotICAgIGlmICggIXJlYWR5TGlzdCApIHsKLQotICAgICAgICByZWFkeUxpc3Qg
PSBqUXVlcnkuRGVmZXJyZWQoKTsKLQotICAgICAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRv
Y3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxy
ZWFkeSBvY2N1cnJlZC4KLSAgICAgICAgLy8gd2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0
ZSAiaW50ZXJhY3RpdmUiIGhlcmUsIGJ1dCBpdCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZQot
ICAgICAgICAvLyBkaXNjb3ZlcmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnku
Y29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1Ci0gICAgICAgIGlmICggZG9jdW1lbnQucmVhZHlT
dGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKLSAgICAgICAgICAgIC8vIEhhbmRsZSBpdCBhc3luY2hy
b25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQot
ICAgICAgICAgICAgc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7Ci0KLSAgICAgICAgfSBlbHNl
IHsKLQotICAgICAgICAgICAgLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawotICAgICAg
ICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBjb21w
bGV0ZWQsIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9u
bG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCi0gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRM
aXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTsKLX07Ci0KLS8vIEtpY2sgb2ZmIHRo
ZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdAotalF1ZXJ5LnJlYWR5
LnByb21pc2UoKTsKLQotCi0KLQotLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5k
IHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi0vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxs
eSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb24KLXZhciBhY2Nlc3MgPSBqUXVlcnkuYWNj
ZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdl
dCwgcmF3ICkgewotICAgIHZhciBpID0gMCwKLSAgICAgICAgbGVuID0gZWxlbXMubGVuZ3RoLAot
ICAgICAgICBidWxrID0ga2V5ID09IG51bGw7Ci0KLSAgICAvLyBTZXRzIG1hbnkgdmFsdWVzCi0g
ICAgaWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09ICJvYmplY3QiICkgewotICAgICAgICBjaGFp
bmFibGUgPSB0cnVlOwotICAgICAgICBmb3IgKCBpIGluIGtleSApIHsKLSAgICAgICAgICAgIGpR
dWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7
Ci0gICAgICAgIH0KLQotICAgIC8vIFNldHMgb25lIHZhbHVlCi0gICAgfSBlbHNlIGlmICggdmFs
dWUgIT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgY2hhaW5hYmxlID0gdHJ1ZTsKLQotICAgICAg
ICBpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIHJhdyA9
IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJ1bGsgKSB7Ci0gICAgICAgICAgICAv
LyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXQKLSAgICAgICAgICAg
IGlmICggcmF3ICkgewotICAgICAgICAgICAgICAgIGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwot
ICAgICAgICAgICAgICAgIGZuID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gLi4uZXhjZXB0IHdo
ZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICBidWxrID0gZm47Ci0gICAgICAgICAgICAgICAgZm4gPSBmdW5jdGlvbiggZWxl
bSwga2V5LCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bGsuY2FsbCgg
alF1ZXJ5KCBlbGVtICksIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZm4gKSB7Ci0gICAgICAgICAgICBmb3IgKCA7
IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgICAgICAgICBmbiggZWxlbXNbaV0sIGtleSwgcmF3
ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSAp
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hhaW5h
YmxlID8KLSAgICAgICAgZWxlbXMgOgotCi0gICAgICAgIC8vIEdldHMKLSAgICAgICAgYnVsayA/
Ci0gICAgICAgICAgICBmbi5jYWxsKCBlbGVtcyApIDoKLSAgICAgICAgICAgIGxlbiA/IGZuKCBl
bGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDsKLX07Ci0KLQotLyoqCi0gKiBEZXRlcm1pbmVzIHdo
ZXRoZXIgYW4gb2JqZWN0IGNhbiBoYXZlIGRhdGEKLSAqLwotalF1ZXJ5LmFjY2VwdERhdGEgPSBm
dW5jdGlvbiggb3duZXIgKSB7Ci0gICAgLy8gQWNjZXB0cyBvbmx5OgotICAgIC8vICAtIE5vZGUK
LSAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFCi0gICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5U
X05PREUKLSAgICAvLyAgLSBPYmplY3QKLSAgICAvLyAgICAtIEFueQotICAgIC8qIGpzaGludCAt
VzAxOCAqLwotICAgIHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlw
ZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTsKLX07Ci0KLQotZnVuY3Rpb24gRGF0YSgp
IHsKLSAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDwgNCwKLSAgICAvLyBPbGQgV2ViS2l0IGRvZXMg
bm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zL2ZyZWV6ZSBtZXRob2QsCi0gICAgLy8g
cmV0dXJuIG5ldyBlbXB0eSBvYmplY3QgaW5zdGVhZCB3aXRoIG5vIFtbc2V0XV0gYWNjZXNzb3IK
LSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMuY2FjaGUgPSB7fSwgMCwgewotICAgICAg
ICBnZXQ6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICB9Ci0g
ICAgfSk7Ci0KLSAgICB0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIE1hdGgucmFuZG9t
KCk7Ci19Ci0KLURhdGEudWlkID0gMTsKLURhdGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRh
OwotCi1EYXRhLnByb3RvdHlwZSA9IHsKLSAgICBrZXk6IGZ1bmN0aW9uKCBvd25lciApIHsKLSAg
ICAgICAgLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rl
cm4gYnJvd3NlcnMsCi0gICAgICAgIC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCi0g
ICAgICAgIC8vIEFsd2F5cyByZXR1cm4gdGhlIGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LgotICAg
ICAgICBpZiAoICFEYXRhLmFjY2VwdHMoIG93bmVyICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBkZXNjcmlwdG9yID0ge30sCi0gICAgICAgICAg
ICAvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5Ci0g
ICAgICAgICAgICB1bmxvY2sgPSBvd25lclsgdGhpcy5leHBhbmRvIF07Ci0KLSAgICAgICAgLy8g
SWYgbm90LCBjcmVhdGUgb25lCi0gICAgICAgIGlmICggIXVubG9jayApIHsKLSAgICAgICAgICAg
IHVubG9jayA9IERhdGEudWlkKys7Ci0KLSAgICAgICAgICAgIC8vIFNlY3VyZSBpdCBpbiBhIG5v
bi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUgcHJvcGVydHkKLSAgICAgICAgICAgIHRyeSB7Ci0g
ICAgICAgICAgICAgICAgZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxv
Y2sgfTsKLSAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRl
c2NyaXB0b3IgKTsKLQotICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCA8IDQKLSAgICAg
ICAgICAgIC8vIEZhbGxiYWNrIHRvIGEgbGVzcyBzZWN1cmUgZGVmaW5pdGlvbgotICAgICAgICAg
ICAgfSBjYXRjaCAoIGUgKSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvclsgdGhpcy5leHBh
bmRvIF0gPSB1bmxvY2s7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LmV4dGVuZCggb3duZXIsIGRl
c2NyaXB0b3IgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuc3Vy
ZSB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAgIGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkg
ewotICAgICAgICAgICAgdGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiB1bmxvY2s7Ci0gICAgfSwKLSAgICBzZXQ6IGZ1bmN0aW9uKCBvd25lciwg
ZGF0YSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBwcm9wLAotICAgICAgICAgICAgLy8gVGhlcmUg
bWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0aGlzIG5vZGUsCi0gICAgICAgICAgICAvLyBp
ZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyAib3duZXIiLCBjcmVhdGUgb25lIGlubGluZQot
ICAgICAgICAgICAgLy8gYW5kIHNldCB0aGUgdW5sb2NrIGFzIHRob3VnaCBhbiBvd25lciBlbnRy
eSBoYWQgYWx3YXlzIGV4aXN0ZWQKLSAgICAgICAgICAgIHVubG9jayA9IHRoaXMua2V5KCBvd25l
ciApLAotICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTsKLQotICAgICAg
ICAvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzCi0gICAgICAgIGlmICggdHlw
ZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgY2FjaGVbIGRhdGEgXSA9IHZh
bHVlOwotCi0gICAgICAgIC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdz
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBv
YmplY3QgYXJlIHNoYWxsb3cgY29waWVkCi0gICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0VtcHR5
T2JqZWN0KCBjYWNoZSApICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5leHRlbmQoIHRoaXMu
Y2FjaGVbIHVubG9jayBdLCBkYXRhICk7Ci0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHkg
dGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoIHByb3AgaW4gZGF0YSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgY2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlOwot
ICAgIH0sCi0gICAgZ2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKLSAgICAgICAgLy8gRWl0
aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgICAg
Ly8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsCi0g
ICAgICAgIC8vIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKLSAg
ICAgICAgLy8gZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUg
cHJvdmlkZWQuCi0gICAgICAgIHZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25l
ciApIF07Ci0KLSAgICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAg
IGNhY2hlIDogY2FjaGVbIGtleSBdOwotICAgIH0sCi0gICAgYWNjZXNzOiBmdW5jdGlvbiggb3du
ZXIsIGtleSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBzdG9yZWQ7Ci0gICAgICAgIC8vIEluIGNh
c2VzIHdoZXJlIGVpdGhlcjoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAxLiBObyBrZXkgd2Fz
IHNwZWNpZmllZAotICAgICAgICAvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBi
dXQgbm8gdmFsdWUgcHJvdmlkZWQKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGFrZSB0aGUgInJl
YWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQotICAgICAgICAv
LyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6Ci0gICAgICAgIC8v
Ci0gICAgICAgIC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKLSAgICAgICAgLy8gICAy
LiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleQotICAgICAgICAvLwotICAgICAgICBpZiAoIGtl
eSA9PT0gdW5kZWZpbmVkIHx8Ci0gICAgICAgICAgICAgICAgKChrZXkgJiYgdHlwZW9mIGtleSA9
PT0gInN0cmluZyIpICYmIHZhbHVlID09PSB1bmRlZmluZWQpICkgewotCi0gICAgICAgICAgICBz
dG9yZWQgPSB0aGlzLmdldCggb3duZXIsIGtleSApOwotCi0gICAgICAgICAgICByZXR1cm4gc3Rv
cmVkICE9PSB1bmRlZmluZWQgPwotICAgICAgICAgICAgICAgIHN0b3JlZCA6IHRoaXMuZ2V0KCBv
d25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBb
Kl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQot
ICAgICAgICAvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3Rz
KSB3aXRoIGVpdGhlcjoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAxLiBBbiBvYmplY3Qgb2Yg
cHJvcGVydGllcwotICAgICAgICAvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZQotICAgICAgICAvLwot
ICAgICAgICB0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKLQotICAgICAgICAvLyBTaW5j
ZSB0aGUgInNldCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzCi0gICAg
ICAgIC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0
YWtlblsqXQotICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5
OwotICAgIH0sCi0gICAgcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKLSAgICAgICAg
dmFyIGksIG5hbWUsIGNhbWVsLAotICAgICAgICAgICAgdW5sb2NrID0gdGhpcy5rZXkoIG93bmVy
ICksCi0gICAgICAgICAgICBjYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdOwotCi0gICAgICAg
IGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICB0aGlzLmNhY2hlWyB1bmxv
Y2sgXSA9IHt9OwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGFy
cmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5cwotICAgICAgICAgICAgaWYgKCBq
UXVlcnkuaXNBcnJheSgga2V5ICkgKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgIm5hbWUiIGlz
IGFuIGFycmF5IG9mIGtleXMuLi4KLSAgICAgICAgICAgICAgICAvLyBXaGVuIGRhdGEgaXMgaW5p
dGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCi0gICAgICAgICAg
ICAgICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuCi0gICAgICAgICAg
ICAgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFk
ZGVkLCByZW1vdmUKLSAgICAgICAgICAgICAgICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxD
YXNlIGtleS4gIzEyNzg2Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxp
emUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCi0gICAgICAgICAgICAgICAgbmFtZSA9IGtleS5j
b25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApOwotICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICBjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApOwotICAg
ICAgICAgICAgICAgIC8vIFRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1
bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKCBrZXkgaW4gY2FjaGUgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIG5hbWUgPSBbIGtleSwgY2FtZWwgXTsKLSAgICAgICAgICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3Rz
LCB1c2UgaXQuCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFy
cmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUg
PSBjYW1lbDsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgaW4gY2FjaGUgPwotICAg
ICAgICAgICAgICAgICAgICAgICAgWyBuYW1lIF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSAp
IHx8IFtdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBpID0gbmFtZS5sZW5ndGg7Ci0gICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAg
ICAgICAgICBkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfSwKLSAgICBoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7Ci0gICAgICAgIHJl
dHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoCi0gICAgICAgICAgICB0aGlzLmNhY2hlWyBvd25l
clsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fQotICAgICAgICApOwotICAgIH0sCi0gICAgZGlzY2Fy
ZDogZnVuY3Rpb24oIG93bmVyICkgewotICAgICAgICBpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8g
XSApIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRv
IF0gXTsKLSAgICAgICAgfQotICAgIH0KLX07Ci12YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTsK
LQotdmFyIGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7Ci0KLQotCi0vKgotICAgIEltcGxlbWVudGF0
aW9uIFN1bW1hcnkKLQotICAgIDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNv
bXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2gKLSAgICAyLiBJbXByb3ZlIHRoZSBtb2R1bGUn
cyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLSAgICAgICAgcGF0aHMg
dG8gYSBzaW5nbGUgbWVjaGFuaXNtLgotICAgIDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFu
aXNtIHRvIHN1cHBvcnQgInByaXZhdGUiIGFuZCAidXNlciIgZGF0YS4KLSAgICA0LiBfTmV2ZXJf
IGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9y
ZW1vdmVEYXRhKQotICAgIDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMg
b24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKQotICAgIDYuIFByb3ZpZGUg
YSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAx
NAotKi8KLXZhciByYnJhY2UgPSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAotICAg
IHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOwotCi1mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5
LCBkYXRhICkgewotICAgIHZhciBuYW1lOwotCi0gICAgLy8gSWYgbm90aGluZyB3YXMgZm91bmQg
aW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQotICAgIC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUg
ZGF0YS0qIGF0dHJpYnV0ZQotICAgIGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgIG5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJt
dWx0aURhc2gsICItJDEiICkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgZGF0YSA9IGVsZW0uZ2V0
QXR0cmlidXRlKCBuYW1lICk7Ci0KLSAgICAgICAgaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmlu
ZyIgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID09
PSAidHJ1ZSIgPyB0cnVlIDoKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9PT0gImZhbHNlIiA/
IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6Ci0g
ICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vz
bid0IGNoYW5nZSB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICtkYXRhICsgIiIgPT09
IGRhdGEgPyArZGF0YSA6Ci0gICAgICAgICAgICAgICAgICAgIHJicmFjZS50ZXN0KCBkYXRhICkg
PyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgotICAgICAgICAgICAgICAgICAgICBkYXRhOwot
ICAgICAgICAgICAgfSBjYXRjaCggZSApIHt9Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3
ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgotICAgICAgICAgICAgZGF0
YV91c2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBkYXRhID0gdW5kZWZpbmVkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkYXRh
OwotfQotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICBoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgcmV0dXJuIGRhdGFfdXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhh
c0RhdGEoIGVsZW0gKTsKLSAgICB9LAotCi0gICAgZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUs
IGRhdGEgKSB7Ci0gICAgICAgIHJldHVybiBkYXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBk
YXRhICk7Ci0gICAgfSwKLQotICAgIHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkg
ewotICAgICAgICBkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7Ci0gICAgfSwKLQotICAg
IC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2
ZSBiZWVuIHJlcGxhY2VkCi0gICAgLy8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1l
dGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgotICAgIF9kYXRhOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSwgZGF0YSApIHsKLSAgICAgICAgcmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0s
IG5hbWUsIGRhdGEgKTsKLSAgICB9LAotCi0gICAgX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVt
LCBuYW1lICkgewotICAgICAgICBkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7Ci0gICAg
fQotfSk7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZh
bHVlICkgewotICAgICAgICB2YXIgaSwgbmFtZSwgZGF0YSwKLSAgICAgICAgICAgIGVsZW0gPSB0
aGlzWyAwIF0sCi0gICAgICAgICAgICBhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzOwot
Ci0gICAgICAgIC8vIEdldHMgYWxsIHZhbHVlcwotICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZp
bmVkICkgewotICAgICAgICAgICAgaWYgKCB0aGlzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAg
ICBkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBl
bGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJz
IiApICkgewotICAgICAgICAgICAgICAgICAgICBpID0gYXR0cnMubGVuZ3RoOwotICAgICAgICAg
ICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUg
PSBhdHRyc1sgaSBdLm5hbWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbmFtZS5p
bmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgZGF0YV9wcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRh
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0cyBtdWx0aXBsZSB2YWx1ZXMKLSAgICAgICAg
aWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlz
LmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgZGF0YV91c2VyLnNldCggdGhpcywg
a2V5ICk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2Nl
c3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAgICAgICAgICAgIHZhciBkYXRhLAotICAg
ICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7Ci0KLSAgICAg
ICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMg
bm90IGVtcHR5Ci0gICAgICAgICAgICAvLyAoYW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBh
cHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZQotICAgICAgICAgICAgLy8gYHZhbHVlYCBwYXJh
bWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmplY3QKLSAgICAgICAg
ICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdo
aWNoIHdpbGwKLSAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0
IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuCi0gICAgICAgICAgICBpZiAoIGVsZW0gJiYg
dmFsdWUgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdl
dCBkYXRhIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGFz
LWlzCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGtleSApOwot
ICAgICAgICAgICAgICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg
ICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICAgICAg
Ly8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAotICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX3Vz
ZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApOwotICAgICAgICAgICAgICAgIGlmICggZGF0YSAhPT0g
dW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvICJkaXNjb3ZlciIgdGhl
IGRhdGEgaW4KLSAgICAgICAgICAgICAgICAvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCi0g
ICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVk
ICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlz
dC4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IC8vIFNldCB0aGUgZGF0YS4uLgotICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewot
ICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZl
cmVuY2Ugb2YgYW55Ci0gICAgICAgICAgICAgICAgLy8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJlZW4g
c3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5LgotICAgICAgICAgICAgICAgIHZhciBkYXRhID0g
ZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTsKLQotICAgICAgICAgICAgICAgIC8vIEZv
ciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG8KLSAgICAgICAgICAg
ICAgICAvLyBzdG9yZSBwcm9wZXJ0eSBuYW1lcyB3aXRoIGRhc2hlcyBpbiBhIGNhbWVsQ2FzZSBm
b3JtLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9w
ZXJ0aWVzLi4uKgotICAgICAgICAgICAgICAgIGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5
LCB2YWx1ZSApOwotCi0gICAgICAgICAgICAgICAgLy8gKi4uLiBJbiB0aGUgY2FzZSBvZiBwcm9w
ZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5XwotICAgICAgICAgICAgICAgIC8vIGhhdmUgZGFz
aGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUgYSBjb3B5IG9mIHRoYXQKLSAgICAgICAgICAgICAg
ICAvLyB1bmNoYW5nZWQgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgaWYgKCBrZXkuaW5kZXhP
ZigiLSIpICE9PSAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGRhdGFfdXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5n
dGggPiAxLCBudWxsLCB0cnVlICk7Ci0gICAgfSwKLQotICAgIHJlbW92ZURhdGE6IGZ1bmN0aW9u
KCBrZXkgKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICBkYXRhX3VzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTsKLSAgICAgICAgfSk7Ci0gICAgfQot
fSk7Ci0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBl
LCBkYXRhICkgewotICAgICAgICB2YXIgcXVldWU7Ci0KLSAgICAgICAgaWYgKCBlbGVtICkgewot
ICAgICAgICAgICAgdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwotICAgICAgICAg
ICAgcXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtLCB0eXBlICk7Ci0KLSAgICAgICAgICAgIC8v
IFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3Qg
YSBsb29rdXAKLSAgICAgICAgICAgIGlmICggZGF0YSApIHsKLSAgICAgICAgICAgICAgICBpZiAo
ICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSggZGF0YSApICkgewotICAgICAgICAgICAgICAgICAg
ICBxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXko
ZGF0YSkgKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBx
dWV1ZS5wdXNoKCBkYXRhICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgcmV0dXJuIHF1ZXVlIHx8IFtdOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGRl
cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewotICAgICAgICB0eXBlID0gdHlwZSB8fCAi
ZngiOwotCi0gICAgICAgIHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAot
ICAgICAgICAgICAgc3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsCi0gICAgICAgICAgICBmbiA9
IHF1ZXVlLnNoaWZ0KCksCi0gICAgICAgICAgICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcygg
ZWxlbSwgdHlwZSApLAotICAgICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uKCkgewotICAgICAgICAg
ICAgICAgIGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7Ci0gICAgICAgICAgICB9OwotCi0g
ICAgICAgIC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUg
cHJvZ3Jlc3Mgc2VudGluZWwKLSAgICAgICAgaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgewot
ICAgICAgICAgICAgZm4gPSBxdWV1ZS5zaGlmdCgpOwotICAgICAgICAgICAgc3RhcnRMZW5ndGgt
LTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZm4gKSB7Ci0KLSAgICAgICAgICAgIC8vIEFk
ZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcK
LSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKLSAgICAgICAgICAgIGlmICgg
dHlwZSA9PT0gImZ4IiApIHsKLSAgICAgICAgICAgICAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9n
cmVzcyIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2xlYXIgdXAgdGhlIGxh
c3QgcXVldWUgc3RvcCBmdW5jdGlvbgotICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Ci0g
ICAgICAgICAgICBmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7Ci0gICAgICAgICAgICBob29rcy5l
bXB0eS5maXJlKCk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gbm90IGludGVuZGVkIGZv
ciBwdWJsaWMgY29uc3VtcHRpb24gLSBnZW5lcmF0ZXMgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3Ig
cmV0dXJucyB0aGUgY3VycmVudCBvbmUKLSAgICBfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0s
IHR5cGUgKSB7Ci0gICAgICAgIHZhciBrZXkgPSB0eXBlICsgInF1ZXVlSG9va3MiOwotICAgICAg
ICByZXR1cm4gZGF0YV9wcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2Vzcygg
ZWxlbSwga2V5LCB7Ci0gICAgICAgICAgICBlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcygib25jZSBt
ZW1vcnkiKS5hZGQoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgZGF0YV9wcml2LnJlbW92
ZSggZWxlbSwgWyB0eXBlICsgInF1ZXVlIiwga2V5IF0gKTsKLSAgICAgICAgICAgIH0pCi0gICAg
ICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBxdWV1ZTogZnVu
Y3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0gICAgICAgIHZhciBzZXR0ZXIgPSAyOwotCi0gICAgICAg
IGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgZGF0YSA9IHR5
cGU7Ci0gICAgICAgICAgICB0eXBlID0gImZ4IjsKLSAgICAgICAgICAgIHNldHRlci0tOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkgewotICAg
ICAgICAgICAgcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwotICAgICAgICB9
Ci0KLSAgICAgICAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/Ci0gICAgICAgICAgICB0aGlz
IDoKLSAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2
YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKLQotICAgICAgICAg
ICAgICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCi0gICAgICAgICAgICAgICAg
alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAo
IHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKLSAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9KTsKLSAgICB9LAotICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBl
ICkgewotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAg
alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLSAgICAgICAgfSk7Ci0gICAgfSwKLSAgICBj
bGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucXVldWUo
IHR5cGUgfHwgImZ4IiwgW10gKTsKLSAgICB9LAotICAgIC8vIEdldCBhIHByb21pc2UgcmVzb2x2
ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKLSAgICAvLyBhcmUgZW1wdGllZCAoZngg
aXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKLSAgICBwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2Jq
ICkgewotICAgICAgICB2YXIgdG1wLAotICAgICAgICAgICAgY291bnQgPSAxLAotICAgICAgICAg
ICAgZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKLSAgICAgICAgICAgIGVsZW1lbnRzID0gdGhp
cywKLSAgICAgICAgICAgIGkgPSB0aGlzLmxlbmd0aCwKLSAgICAgICAgICAgIHJlc29sdmUgPSBm
dW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoICEoIC0tY291bnQgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0g
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIGlmICggdHlw
ZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgb2JqID0gdHlwZTsKLSAgICAg
ICAgICAgIHR5cGUgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKLQotICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgIHRtcCA9IGRh
dGFfcHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIgKTsKLSAgICAg
ICAgICAgIGlmICggdG1wICYmIHRtcC5lbXB0eSApIHsKLSAgICAgICAgICAgICAgICBjb3VudCsr
OwotICAgICAgICAgICAgICAgIHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICByZXNvbHZlKCk7Ci0gICAgICAgIHJldHVybiBkZWZlci5w
cm9taXNlKCBvYmogKTsKLSAgICB9Ci19KTsKLXZhciBwbnVtID0gKC9bKy1dPyg/OlxkKlwufClc
ZCsoPzpbZUVdWystXT9cZCt8KS8pLnNvdXJjZTsKLQotdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIs
ICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKLQotdmFyIGlzSGlkZGVuID0gZnVuY3Rpb24o
IGVsZW0sIGVsICkgewotICAgICAgICAvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBq
UXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwotICAgICAgICAvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQg
d2lsbCBiZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgICAgZWxlbSA9IGVsIHx8IGVsZW07Ci0gICAg
ICAgIHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFq
UXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwotICAgIH07Ci0KLXZh
ciByY2hlY2thYmxlVHlwZSA9ICgvXig/OmNoZWNrYm94fHJhZGlvKSQvaSk7Ci0KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFn
bWVudCgpLAotICAgICAgICBkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCggImRpdiIgKSApOwotCi0gICAgLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNo
ZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlCi0gICAgZGl2
LmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0ncmFkaW8nIGNoZWNrZWQ9J2NoZWNrZWQnIG5hbWU9
J3QnLz4iOwotCi0gICAgLy8gU3VwcG9ydDogU2FmYXJpIDUuMSwgaU9TIDUuMSwgQW5kcm9pZCA0
LngsIEFuZHJvaWQgMi4zCi0gICAgLy8gb2xkIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQg
c3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwotICAgIHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRp
di5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDsK
LQotICAgIC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUg
aXMgcHJvcGVybHkgY2xvbmVkCi0gICAgLy8gU3VwcG9ydDogSUU5LUlFMTErCi0gICAgZGl2Lmlu
bmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKLSAgICBzdXBwb3J0Lm5vQ2xvbmVD
aGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsK
LX0pKCk7Ci12YXIgc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZDsKLQotCi0KLXN1cHBv
cnQuZm9jdXNpbkJ1YmJsZXMgPSAib25mb2N1c2luIiBpbiB3aW5kb3c7Ci0KLQotdmFyCi0gICAg
cmtleUV2ZW50ID0gL15rZXkvLAotICAgIHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0
bWVudSl8Y2xpY2svLAotICAgIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNv
dXRibHVyKSQvLAotICAgIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsK
LQotZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZnVuY3Rp
b24gcmV0dXJuRmFsc2UoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzYWZl
QWN0aXZlRWxlbWVudCgpIHsKLSAgICB0cnkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0
aXZlRWxlbWVudDsKLSAgICB9IGNhdGNoICggZXJyICkgeyB9Ci19Ci0KLS8qCi0gKiBIZWxwZXIg
ZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBp
bnRlcmZhY2UuCi0gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9y
IG1hbnkgb2YgdGhlIGlkZWFzLgotICovCi1qUXVlcnkuZXZlbnQgPSB7Ci0KLSAgICBnbG9iYWw6
IHt9LAotCi0gICAgYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNl
bGVjdG9yICkgewotCi0gICAgICAgIHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCwK
LSAgICAgICAgICAgIGV2ZW50cywgdCwgaGFuZGxlT2JqLAotICAgICAgICAgICAgc3BlY2lhbCwg
aGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLAotICAgICAgICAgICAgZWxlbURh
dGEgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7Ci0KLSAgICAgICAgLy8gRG9uJ3QgYXR0YWNoIGV2
ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2Jq
ZWN0cykKLSAgICAgICAgaWYgKCAhZWxlbURhdGEgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1
c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXIKLSAgICAgICAgaWYgKCBoYW5kbGVyLmhh
bmRsZXIgKSB7Ci0gICAgICAgICAgICBoYW5kbGVPYmpJbiA9IGhhbmRsZXI7Ci0gICAgICAgICAg
ICBoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjsKLSAgICAgICAgICAgIHNlbGVjdG9yID0g
aGFuZGxlT2JqSW4uc2VsZWN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUg
dGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQg
bGF0ZXIKLSAgICAgICAgaWYgKCAhaGFuZGxlci5ndWlkICkgewotICAgICAgICAgICAgaGFuZGxl
ci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluaXQgdGhl
IGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0
aGUgZmlyc3QKLSAgICAgICAgaWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0g
ICAgICAgICAgICBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoICEoZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUpICkgewotICAgICAgICAg
ICAgZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKLSAgICAg
ICAgICAgICAgICAvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQu
dHJpZ2dlcigpIGFuZAotICAgICAgICAgICAgICAgIC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVk
IGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9m
IGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUu
dHlwZSA/Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSgg
ZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFj
ZQotICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwg
WyAiIiBdOwotICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAoIHQtLSAp
IHsKLSAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwg
W107Ci0gICAgICAgICAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07Ci0gICAgICAgICAgICBu
YW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwotCi0gICAg
ICAgICAgICAvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNl
LW9ubHkgaGFuZGxlcnMKLSAgICAgICAgICAgIGlmICggIXR5cGUgKSB7Ci0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIGV2ZW50IGNo
YW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNo
YW5nZWQgdHlwZQotICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0
eXBlIF0gfHwge307Ci0KLSAgICAgICAgICAgIC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVy
bWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQotICAgICAg
ICAgICAgdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwu
YmluZFR5cGUgKSB8fCB0eXBlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc3BlY2lhbCBiYXNl
ZCBvbiBuZXdseSByZXNldCB0eXBlCi0gICAgICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50
LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQotICAgICAgICAgICAgLy8gaGFuZGxlT2JqIGlzIHBh
c3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMKLSAgICAgICAgICAgIGhhbmRsZU9iaiA9IGpRdWVy
eS5leHRlbmQoewotICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAg
b3JpZ1R5cGU6IG9yaWdUeXBlLAotICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsCi0gICAgICAg
ICAgICAgICAgaGFuZGxlcjogaGFuZGxlciwKLSAgICAgICAgICAgICAgICBndWlkOiBoYW5kbGVy
Lmd1aWQsCi0gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLAotICAgICAgICAgICAg
ICAgIG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250
ZXh0LnRlc3QoIHNlbGVjdG9yICksCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3Bh
Y2VzLmpvaW4oIi4iKQotICAgICAgICAgICAgfSwgaGFuZGxlT2JqSW4gKTsKLQotICAgICAgICAg
ICAgLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKLSAg
ICAgICAgICAgIGlmICggIShoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdKSApIHsKLSAgICAgICAg
ICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107Ci0gICAgICAgICAgICAgICAg
aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBPbmx5IHVz
ZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMg
ZmFsc2UKLSAgICAgICAgICAgICAgICBpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0
dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2Ug
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVu
dEhhbmRsZSwgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKLSAg
ICAgICAgICAgICAgICBzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLQotICAg
ICAgICAgICAgICAgIGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGVs
ZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAotICAgICAgICAgICAgaWYg
KCBzZWxlY3RvciApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJz
LmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIg
YmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uCi0gICAgICAgICAgICBqUXVlcnkuZXZl
bnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9LAotCi0gICAgLy8g
RGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50Ci0gICAgcmVt
b3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBl
cyApIHsKLQotICAgICAgICB2YXIgaiwgb3JpZ0NvdW50LCB0bXAsCi0gICAgICAgICAgICBldmVu
dHMsIHQsIGhhbmRsZU9iaiwKLSAgICAgICAgICAgIHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBu
YW1lc3BhY2VzLCBvcmlnVHlwZSwKLSAgICAgICAgICAgIGVsZW1EYXRhID0gZGF0YV9wcml2Lmhh
c0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7Ci0KLSAgICAgICAgaWYgKCAh
ZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgewotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVz
cGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZAotICAgICAgICB0eXBlcyA9ICggdHlw
ZXMgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwotICAgICAgICB0ID0gdHlw
ZXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAoIHQtLSApIHsKLSAgICAgICAgICAgIHRtcCA9IHJ0
eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107Ci0gICAgICAgICAgICB0eXBlID0g
b3JpZ1R5cGUgPSB0bXBbMV07Ci0gICAgICAgICAgICBuYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwg
IiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwotCi0gICAgICAgICAgICAvLyBVbmJpbmQgYWxsIGV2
ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKLSAg
ICAgICAgICAgIGlmICggIXR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgZm9yICggdHlwZSBpbiBl
dmVudHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0s
IHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0g
ICAgICAgICAgICB0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3Bl
Y2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7Ci0gICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sg
dHlwZSBdIHx8IFtdOwotICAgICAgICAgICAgdG1wID0gdG1wWzJdICYmIG5ldyBSZWdFeHAoICIo
XnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICk7
Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKLSAgICAgICAgICAgIG9y
aWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7Ci0gICAgICAgICAgICB3aGlsZSAoIGotLSAp
IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdOwotCi0gICAgICAg
ICAgICAgICAgaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3Jp
Z1R5cGUgKSAmJgotICAgICAgICAgICAgICAgICAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3Vp
ZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgotICAgICAgICAgICAgICAgICAgICAoICF0bXAgfHwg
dG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCi0gICAgICAgICAgICAgICAgICAg
ICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0
b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGhhbmRsZXJzLnNwbGljZSggaiwgMSApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgg
aGFuZGxlT2JqLnNlbGVjdG9yICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMu
ZGVsZWdhdGVDb3VudC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIGlmICggc3BlY2lhbC5yZW1vdmUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGVj
aWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVt
b3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8g
bW9yZSBoYW5kbGVycyBleGlzdAotICAgICAgICAgICAgLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9y
IGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxl
cnMpCi0gICAgICAgICAgICBpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkgewot
ICAgICAgICAgICAgICAgIGlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93
bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxl
bURhdGEuaGFuZGxlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVs
ZXRlIGV2ZW50c1sgdHlwZSBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKLSAgICAgICAgaWYg
KCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7Ci0gICAgICAgICAgICBkZWxldGUg
ZWxlbURhdGEuaGFuZGxlOwotICAgICAgICAgICAgZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgImV2
ZW50cyIgKTsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICB0cmlnZ2VyOiBmdW5jdGlvbiggZXZl
bnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHsKLQotICAgICAgICB2YXIgaSwgY3VyLCB0
bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLAotICAgICAgICAgICAgZXZl
bnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCi0gICAgICAgICAgICB0eXBlID0gaGFzT3du
LmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCwKLSAgICAgICAgICAg
IG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5u
YW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOwotCi0gICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBl
bGVtIHx8IGRvY3VtZW50OwotCi0gICAgICAgIC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFu
ZCBjb21tZW50IG5vZGVzCi0gICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVt
Lm5vZGVUeXBlID09PSA4ICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBu
b3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93Ci0gICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCgg
dHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKLSAg
ICAgICAgICAgIC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNo
IGV2ZW50IHR5cGUgaW4gaGFuZGxlKCkKLSAgICAgICAgICAgIG5hbWVzcGFjZXMgPSB0eXBlLnNw
bGl0KCIuIik7Ci0gICAgICAgICAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwotICAgICAg
ICAgICAgbmFtZXNwYWNlcy5zb3J0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgb250eXBlID0gdHlw
ZS5pbmRleE9mKCI6IikgPCAwICYmICJvbiIgKyB0eXBlOwotCi0gICAgICAgIC8vIENhbGxlciBj
YW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVu
dCB0eXBlIHN0cmluZwotICAgICAgICBldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8K
LSAgICAgICAgICAgIGV2ZW50IDoKLSAgICAgICAgICAgIG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUs
IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgJiYgZXZlbnQgKTsKLQotICAgICAgICAvLyBUcmln
Z2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3
YXlzIHRydWUpCi0gICAgICAgIGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAz
OwotICAgICAgICBldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKLSAgICAg
ICAgZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlID8KLSAgICAgICAgICAgIG5l
dyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsg
IihcXC58JCkiICkgOgotICAgICAgICAgICAgbnVsbDsKLQotICAgICAgICAvLyBDbGVhbiB1cCB0
aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKLSAgICAgICAgZXZlbnQucmVzdWx0
ID0gdW5kZWZpbmVkOwotICAgICAgICBpZiAoICFldmVudC50YXJnZXQgKSB7Ci0gICAgICAgICAg
ICBldmVudC50YXJnZXQgPSBlbGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xvbmUgYW55
IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxl
ciBhcmcgbGlzdAotICAgICAgICBkYXRhID0gZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgIFsg
ZXZlbnQgXSA6Ci0gICAgICAgICAgICBqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0g
KTsKLQotICAgICAgICAvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhl
IGxpbmVzCi0gICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8
IHt9OwotICAgICAgICBpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNw
ZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERldGVybWluZSBldmVudCBwcm9w
YWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQotICAg
ICAgICAvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3Ig
YSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KQotICAgICAgICBpZiAoICFvbmx5SGFu
ZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkg
ewotCi0gICAgICAgICAgICBidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlw
ZTsKLSAgICAgICAgICAgIGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBl
ICkgKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0g
ICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1c2goIGN1ciApOwotICAgICAgICAgICAgICAgIHRt
cCA9IGN1cjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT25seSBhZGQgd2luZG93
IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBE
T00pCi0gICAgICAgICAgICBpZiAoIHRtcCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1
bWVudCkgKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0Vmll
dyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAotICAgICAg
ICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCAoY3VyID0gZXZlbnRQYXRoW2krK10pICYmICFldmVu
dC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgewotCi0gICAgICAgICAgICBldmVudC50eXBlID0g
aSA+IDEgPwotICAgICAgICAgICAgICAgIGJ1YmJsZVR5cGUgOgotICAgICAgICAgICAgICAgIHNw
ZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKLQotICAgICAgICAgICAgLy8galF1ZXJ5IGhhbmRsZXIK
LSAgICAgICAgICAgIGhhbmRsZSA9ICggZGF0YV9wcml2LmdldCggY3VyLCAiZXZlbnRzIiApIHx8
IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRhX3ByaXYuZ2V0KCBjdXIsICJoYW5kbGUiICk7Ci0g
ICAgICAgICAgICBpZiAoIGhhbmRsZSApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUuYXBwbHko
IGN1ciwgZGF0YSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOYXRpdmUgaGFu
ZGxlcgotICAgICAgICAgICAgaGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07Ci0gICAg
ICAgICAgICBpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEo
IGN1ciApICkgewotICAgICAgICAgICAgICAgIGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSgg
Y3VyLCBkYXRhICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNl
ICkgewotICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBldmVudC50eXBl
ID0gdHlwZTsKLQotICAgICAgICAvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFj
dGlvbiwgZG8gaXQgbm93Ci0gICAgICAgIGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNE
ZWZhdWx0UHJldmVudGVkKCkgKSB7Ci0KLSAgICAgICAgICAgIGlmICggKCFzcGVjaWFsLl9kZWZh
dWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09
PSBmYWxzZSkgJiYKLSAgICAgICAgICAgICAgICBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkg
ewotCi0gICAgICAgICAgICAgICAgLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0
YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgotICAgICAgICAgICAg
ICAgIC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBn
bG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MCkKLSAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAm
JiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdygg
ZWxlbSApICkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4g
b25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKLSAgICAgICAgICAgICAg
ICAgICAgdG1wID0gZWxlbVsgb250eXBlIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0
bXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJl
LXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBp
dCBhYm92ZQotICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlw
ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbVsgdHlwZSBdKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7Ci0KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCB0bXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUg
XSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBldmVudC5yZXN1bHQ7Ci0gICAg
fSwKLQotICAgIGRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0KLSAgICAgICAgLy8gTWFr
ZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0Ci0g
ICAgICAgIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTsKLQotICAgICAgICB2YXIg
aSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosCi0gICAgICAgICAgICBoYW5kbGVyUXVldWUg
PSBbXSwKLSAgICAgICAgICAgIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAg
ICAgICAgIGhhbmRsZXJzID0gKCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9
IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKLSAgICAgICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZl
bnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9OwotCi0gICAgICAgIC8vIFVzZSB0aGUgZml4
LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50
Ci0gICAgICAgIGFyZ3NbMF0gPSBldmVudDsKLSAgICAgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQg
PSB0aGlzOwotCi0gICAgICAgIC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBt
YXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWQKLSAgICAgICAgaWYgKCBzcGVj
aWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQg
KSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKLSAgICAgICAgaGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2
ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApOwotCi0gICAgICAgIC8v
IFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBi
ZW5lYXRoIHVzCi0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAoIChtYXRjaGVkID0gaGFu
ZGxlclF1ZXVlWyBpKysgXSkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7Ci0g
ICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOwotCi0gICAgICAg
ICAgICBqID0gMDsKLSAgICAgICAgICAgIHdoaWxlICggKGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFu
ZGxlcnNbIGorKyBdKSAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSAp
IHsKLQotICAgICAgICAgICAgICAgIC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBo
YXZlIG5vIG5hbWVzcGFjZSwgb3IKLSAgICAgICAgICAgICAgICAvLyAyKSBoYXZlIG5hbWVzcGFj
ZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGgg
Y2FuIGhhdmUgbm8gbmFtZXNwYWNlKS4KLSAgICAgICAgICAgICAgICBpZiAoICFldmVudC5uYW1l
c3BhY2VfcmUgfHwgZXZlbnQubmFtZXNwYWNlX3JlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2Ug
KSApIHsKLQotICAgICAgICAgICAgICAgICAgICBldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7
Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKLQotICAg
ICAgICAgICAgICAgICAgICByZXQgPSAoIChqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2Jq
Lm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8fCBoYW5kbGVPYmouaGFuZGxlciApCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKLQotICAg
ICAgICAgICAgICAgICAgICBpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCAoZXZlbnQucmVzdWx0ID0gcmV0KSA9PT0gZmFsc2UgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbGwgdGhlIHBvc3REaXNw
YXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUKLSAgICAgICAgaWYgKCBzcGVjaWFsLnBvc3RE
aXNwYXRjaCApIHsKLSAgICAgICAgICAgIHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMs
IGV2ZW50ICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXZlbnQucmVzdWx0OwotICAg
IH0sCi0KLSAgICBoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKLSAgICAg
ICAgdmFyIGksIG1hdGNoZXMsIHNlbCwgaGFuZGxlT2JqLAotICAgICAgICAgICAgaGFuZGxlclF1
ZXVlID0gW10sCi0gICAgICAgICAgICBkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVD
b3VudCwKLSAgICAgICAgICAgIGN1ciA9IGV2ZW50LnRhcmdldDsKLQotICAgICAgICAvLyBGaW5k
IGRlbGVnYXRlIGhhbmRsZXJzCi0gICAgICAgIC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3Rh
bmNlIHRyZWVzICgjMTMxODApCi0gICAgICAgIC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJs
aW5nIGluIEZpcmVmb3ggKCMzODYxKQotICAgICAgICBpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3Vy
Lm5vZGVUeXBlICYmICghZXZlbnQuYnV0dG9uIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkg
ewotCi0gICAgICAgICAgICBmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5v
ZGUgfHwgdGhpcyApIHsKLQotICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nlc3MgY2xpY2tz
IG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQotICAg
ICAgICAgICAgICAgIGlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09
ICJjbGljayIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBbXTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwotCi0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUg
cHJvcGVydGllcyAoIzEzMjAzKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsID0gaGFuZGxl
T2JqLnNlbGVjdG9yICsgIiAiOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNo
ZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgalF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPj0gMCA6
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMs
IG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXNbIHNlbCBdICkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCggaGFuZGxlT2JqICk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
aWYgKCBtYXRjaGVzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJR
dWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9KTsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMK
LSAgICAgICAgaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewotICAgICAg
ICAgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMu
c2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBo
YW5kbGVyUXVldWU7Ci0gICAgfSwKLQotICAgIC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMg
c2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50Ci0gICAgcHJvcHM6ICJhbHRLZXkgYnVi
YmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkg
cmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0
KCIgIiksCi0KLSAgICBmaXhIb29rczoge30sCi0KLSAgICBrZXlIb29rczogewotICAgICAgICBw
cm9wczogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksCi0gICAgICAgIGZp
bHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKLQotICAgICAgICAgICAgLy8gQWRk
IHdoaWNoIGZvciBrZXkgZXZlbnRzCi0gICAgICAgICAgICBpZiAoIGV2ZW50LndoaWNoID09IG51
bGwgKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAh
PSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgICAgIH0KLSAgICB9LAotCi0g
ICAgbW91c2VIb29rczogewotICAgICAgICBwcm9wczogImJ1dHRvbiBidXR0b25zIGNsaWVudFgg
Y2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxl
bWVudCIuc3BsaXQoIiAiKSwKLSAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdp
bmFsICkgewotICAgICAgICAgICAgdmFyIGV2ZW50RG9jLCBkb2MsIGJvZHksCi0gICAgICAgICAg
ICAgICAgYnV0dG9uID0gb3JpZ2luYWwuYnV0dG9uOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxh
dGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCi0gICAgICAgICAg
ICBpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkg
ewotICAgICAgICAgICAgICAgIGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQg
fHwgZG9jdW1lbnQ7Ci0gICAgICAgICAgICAgICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVt
ZW50OwotICAgICAgICAgICAgICAgIGJvZHkgPSBldmVudERvYy5ib2R5OwotCi0gICAgICAgICAg
ICAgICAgZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9s
bExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNs
aWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOwotICAgICAgICAgICAg
ICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxU
b3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGll
bnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0g
bWlkZGxlOyAzID09PSByaWdodAotICAgICAgICAgICAgLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBu
b3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKLSAgICAgICAgICAgIGlmICggIWV2ZW50LndoaWNo
ICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIGV2ZW50LndoaWNo
ID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAy
IDogMCApICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50Owot
ICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewotICAgICAg
ICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgewotICAgICAgICAgICAgcmV0dXJuIGV2
ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0
aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzCi0gICAgICAgIHZh
ciBpLCBwcm9wLCBjb3B5LAotICAgICAgICAgICAgdHlwZSA9IGV2ZW50LnR5cGUsCi0gICAgICAg
ICAgICBvcmlnaW5hbEV2ZW50ID0gZXZlbnQsCi0gICAgICAgICAgICBmaXhIb29rID0gdGhpcy5m
aXhIb29rc1sgdHlwZSBdOwotCi0gICAgICAgIGlmICggIWZpeEhvb2sgKSB7Ci0gICAgICAgICAg
ICB0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID0KLSAgICAgICAgICAgICAgICBybW91
c2VFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLm1vdXNlSG9va3MgOgotICAgICAgICAgICAgICAg
IHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDoKLSAgICAgICAgICAgICAg
ICB7fTsKLSAgICAgICAgfQotICAgICAgICBjb3B5ID0gZml4SG9vay5wcm9wcyA/IHRoaXMucHJv
cHMuY29uY2F0KCBmaXhIb29rLnByb3BzICkgOiB0aGlzLnByb3BzOwotCi0gICAgICAgIGV2ZW50
ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwotCi0gICAgICAgIGkgPSBjb3B5
Lmxlbmd0aDsKLSAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICBwcm9wID0gY29w
eVsgaSBdOwotICAgICAgICAgICAgZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3Ag
XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQp
ICgjMTMyNTUpCi0gICAgICAgIC8vIEFsbCBldmVudHMgc2hvdWxkIGhhdmUgYSB0YXJnZXQ7IENv
cmRvdmEgZGV2aWNlcmVhZHkgZG9lc24ndAotICAgICAgICBpZiAoICFldmVudC50YXJnZXQgKSB7
Ci0gICAgICAgICAgICBldmVudC50YXJnZXQgPSBkb2N1bWVudDsKLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjArLCBDaHJvbWUgPCAyOAotICAgICAgICAvLyBUYXJn
ZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQotICAgICAgICBpZiAo
IGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKLSAgICAgICAgICAgIGV2ZW50LnRhcmdl
dCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJu
IGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkg
OiBldmVudDsKLSAgICB9LAotCi0gICAgc3BlY2lhbDogewotICAgICAgICBsb2FkOiB7Ci0gICAg
ICAgICAgICAvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJs
aW5nIHRvIHdpbmRvdy5sb2FkCi0gICAgICAgICAgICBub0J1YmJsZTogdHJ1ZQotICAgICAgICB9
LAotICAgICAgICBmb2N1czogewotICAgICAgICAgICAgLy8gRmlyZSBuYXRpdmUgZXZlbnQgaWYg
cG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0Ci0gICAgICAgICAgICB0
cmlnZ2VyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHRoaXMgIT09IHNhZmVB
Y3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhp
cy5mb2N1cygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGRlbGVnYXRlVHlwZTogImZvY3Vz
aW4iCi0gICAgICAgIH0sCi0gICAgICAgIGJsdXI6IHsKLSAgICAgICAgICAgIHRyaWdnZXI6IGZ1
bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1l
bnQoKSAmJiB0aGlzLmJsdXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYmx1cigpOwot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfSwKLSAgICAgICAgICAgIGRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IgotICAgICAg
ICB9LAotICAgICAgICBjbGljazogewotICAgICAgICAgICAgLy8gRm9yIGNoZWNrYm94LCBmaXJl
IG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKLSAgICAgICAgICAg
IHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggdGhpcy50eXBlID09
PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5w
dXQiICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2soKTsKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0s
Ci0KLSAgICAgICAgICAgIC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBm
aXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rcwotICAgICAgICAgICAgX2RlZmF1bHQ6IGZ1bmN0
aW9uKCBldmVudCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBl
dmVudC50YXJnZXQsICJhIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAg
IGJlZm9yZXVubG9hZDogewotICAgICAgICAgICAgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZl
bnQgKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94IDIwKwotICAgICAg
ICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmll
bGQgaXMgbm90IHNldC4KLSAgICAgICAgICAgICAgICBpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5k
ZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnJldHVy
blZhbHVlID0gZXZlbnQucmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0sCi0KLSAgICBzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0s
IGV2ZW50LCBidWJibGUgKSB7Ci0gICAgICAgIC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50
IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZS4KLSAgICAgICAgLy8gRmFrZSBvcmlnaW5hbEV2
ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCi0gICAgICAg
IC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUg
b24gdGhlIGRvbm9yLgotICAgICAgICB2YXIgZSA9IGpRdWVyeS5leHRlbmQoCi0gICAgICAgICAg
ICBuZXcgalF1ZXJ5LkV2ZW50KCksCi0gICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgIHsK
LSAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLAotICAgICAgICAgICAgICAgIGlzU2ltdWxhdGVk
OiB0cnVlLAotICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHt9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICk7Ci0gICAgICAgIGlmICggYnViYmxlICkgewotICAgICAgICAgICAgalF1ZXJ5
LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIGpRdWVyeS5ldmVudC5kaXNwYXRjaC5jYWxsKCBlbGVtLCBlICk7Ci0gICAgICAgIH0K
LSAgICAgICAgaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewotICAgICAgICAgICAgZXZl
bnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgfQotICAgIH0KLX07Ci0KLWpRdWVyeS5yZW1v
dmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7Ci0gICAgaWYgKCBlbGVt
LnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7Ci0gICAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5l
ciggdHlwZSwgaGFuZGxlLCBmYWxzZSApOwotICAgIH0KLX07Ci0KLWpRdWVyeS5FdmVudCA9IGZ1
bmN0aW9uKCBzcmMsIHByb3BzICkgewotICAgIC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91
dCB0aGUgJ25ldycga2V5d29yZAotICAgIGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2
ZW50KSApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsK
LSAgICB9Ci0KLSAgICAvLyBFdmVudCBvYmplY3QKLSAgICBpZiAoIHNyYyAmJiBzcmMudHlwZSAp
IHsKLSAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwotICAgICAgICB0aGlzLnR5cGUg
PSBzcmMudHlwZTsKLQotICAgICAgICAvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50
IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAotICAgICAgICAvLyBieSBhIGhhbmRs
ZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KLSAgICAg
ICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fAotICAg
ICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IEFuZHJvaWQgPCA0LjAKLSAgICAgICAgICAgICAgICBz
cmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmCi0gICAgICAgICAgICAgICAgc3Jj
LmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5nZXRQcmV2ZW50RGVmYXVsdCgpID8KLSAgICAgICAg
ICAgIHJldHVyblRydWUgOgotICAgICAgICAgICAgcmV0dXJuRmFsc2U7Ci0KLSAgICAvLyBFdmVu
dCB0eXBlCi0gICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy50eXBlID0gc3JjOwotICAgIH0KLQot
ICAgIC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQg
b2JqZWN0Ci0gICAgaWYgKCBwcm9wcyApIHsKLSAgICAgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywg
cHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcg
ZXZlbnQgZG9lc24ndCBoYXZlIG9uZQotICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50
aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwotCi0gICAgLy8gTWFyayBpdCBhcyBmaXhlZAotICAg
IHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOwotfTsKLQotLy8galF1ZXJ5LkV2ZW50IGlz
IGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5n
dWFnZSBCaW5kaW5nCi0vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0z
LUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKLWpRdWVyeS5FdmVudC5w
cm90b3R5cGUgPSB7Ci0gICAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKLSAgICBp
c1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCi0gICAgaXNJbW1lZGlhdGVQcm9wYWdh
dGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAotCi0gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9u
KCkgewotICAgICAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKLQotICAgICAgICB0aGlz
LmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7Ci0KLSAgICAgICAgaWYgKCBlICYmIGUu
cHJldmVudERlZmF1bHQgKSB7Ci0gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7Ci0gICAg
ICAgIH0KLSAgICB9LAotICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAg
IHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwotCi0gICAgICAgIHRoaXMuaXNQcm9wYWdhdGlv
blN0b3BwZWQgPSByZXR1cm5UcnVlOwotCi0gICAgICAgIGlmICggZSAmJiBlLnN0b3BQcm9wYWdh
dGlvbiApIHsKLSAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7Ci0gICAgICAgIH0KLSAg
ICB9LAotICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAg
IHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwotICAgICAg
ICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwotICAgIH0KLX07Ci0KLS8vIENyZWF0ZSBtb3VzZWVu
dGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNr
cwotLy8gU3VwcG9ydDogQ2hyb21lIDE1KwotalF1ZXJ5LmVhY2goewotICAgIG1vdXNlZW50ZXI6
ICJtb3VzZW92ZXIiLAotICAgIG1vdXNlbGVhdmU6ICJtb3VzZW91dCIKLX0sIGZ1bmN0aW9uKCBv
cmlnLCBmaXggKSB7Ci0gICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKLSAgICAg
ICAgZGVsZWdhdGVUeXBlOiBmaXgsCi0gICAgICAgIGJpbmRUeXBlOiBmaXgsCi0KLSAgICAgICAg
aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0gICAgICAgICAgICB2YXIgcmV0LAotICAgICAg
ICAgICAgICAgIHRhcmdldCA9IHRoaXMsCi0gICAgICAgICAgICAgICAgcmVsYXRlZCA9IGV2ZW50
LnJlbGF0ZWRUYXJnZXQsCi0gICAgICAgICAgICAgICAgaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxl
T2JqOwotCi0gICAgICAgICAgICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRs
ZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCi0gICAgICAgICAgICAvLyBOQjog
Tm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdp
bmRvdwotICAgICAgICAgICAgaWYgKCAhcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYm
ICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApKSApIHsKLSAgICAgICAgICAgICAg
ICBldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlOwotICAgICAgICAgICAgICAgIHJldCA9
IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAg
ICAgICBldmVudC50eXBlID0gZml4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu
IHJldDsKLSAgICAgICAgfQotICAgIH07Ci19KTsKLQotLy8gQ3JlYXRlICJidWJibGluZyIgZm9j
dXMgYW5kIGJsdXIgZXZlbnRzCi0vLyBTdXBwb3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaQot
aWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKLSAgICBqUXVlcnkuZWFjaCh7IGZvY3Vz
OiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsK
LQotICAgICAgICAvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRv
Y3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAotICAgICAgICB2YXIg
aGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZXZl
bnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCAp
LCB0cnVlICk7Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIGpRdWVyeS5ldmVudC5zcGVjaWFs
WyBmaXggXSA9IHsKLSAgICAgICAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAg
ICAgICB2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsCi0gICAgICAgICAgICAg
ICAgICAgIGF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKTsKLQotICAgICAg
ICAgICAgICAgIGlmICggIWF0dGFjaGVzICkgewotICAgICAgICAgICAgICAgICAgICBkb2MuYWRk
RXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8
fCAwICkgKyAxICk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgdGVhcmRvd246IGZ1bmN0
aW9uKCkgewotICAgICAgICAgICAgICAgIHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwg
dGhpcywKLSAgICAgICAgICAgICAgICAgICAgYXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBk
b2MsIGZpeCApIC0gMTsKLQotICAgICAgICAgICAgICAgIGlmICggIWF0dGFjaGVzICkgewotICAg
ICAgICAgICAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwg
dHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICBkYXRhX3ByaXYucmVtb3ZlKCBkb2MsIGZpeCAp
OwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9w
cml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0pOwotfQotCi1qUXVlcnkuZm4uZXh0ZW5kKHsK
LQotICAgIG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5B
TCovIG9uZSApIHsKLSAgICAgICAgdmFyIG9yaWdGbiwgdHlwZTsKLQotICAgICAgICAvLyBUeXBl
cyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMKLSAgICAgICAgaWYgKCB0eXBlb2YgdHlw
ZXMgPT09ICJvYmplY3QiICkgewotICAgICAgICAgICAgLy8gKCB0eXBlcy1PYmplY3QsIHNlbGVj
dG9yLCBkYXRhICkKLSAgICAgICAgICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5n
IiApIHsKLSAgICAgICAgICAgICAgICAvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApCi0gICAgICAg
ICAgICAgICAgZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7Ci0gICAgICAgICAgICAgICAgc2VsZWN0
b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKCB0eXBlIGlu
IHR5cGVzICkgewotICAgICAgICAgICAgICAgIHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRh
LCB0eXBlc1sgdHlwZSBdLCBvbmUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVy
biB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0g
bnVsbCApIHsKLSAgICAgICAgICAgIC8vICggdHlwZXMsIGZuICkKLSAgICAgICAgICAgIGZuID0g
c2VsZWN0b3I7Ci0gICAgICAgICAgICBkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7Ci0gICAgICAgICAgICBpZiAoIHR5cGVvZiBz
ZWxlY3RvciA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICAgICAgLy8gKCB0eXBlcywgc2Vs
ZWN0b3IsIGZuICkKLSAgICAgICAgICAgICAgICBmbiA9IGRhdGE7Ci0gICAgICAgICAgICAgICAg
ZGF0YSA9IHVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
Ly8gKCB0eXBlcywgZGF0YSwgZm4gKQotICAgICAgICAgICAgICAgIGZuID0gZGF0YTsKLSAgICAg
ICAgICAgICAgICBkYXRhID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB1
bmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBmbiA9PT0g
ZmFsc2UgKSB7Ci0gICAgICAgICAgICBmbiA9IHJldHVybkZhbHNlOwotICAgICAgICB9IGVsc2Ug
aWYgKCAhZm4gKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICggb25lID09PSAxICkgewotICAgICAgICAgICAgb3JpZ0ZuID0gZm47Ci0gICAgICAg
ICAgICBmbiA9IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICAgICAgICAgICAgICAvLyBDYW4gdXNl
IGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm8KLSAgICAgICAgICAg
ICAgICBqUXVlcnkoKS5vZmYoIGV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdG
bi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAg
Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KLSAgICAg
ICAgICAgIGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1
aWQrKyApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkg
ewotICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBz
ZWxlY3RvciApOwotICAgICAgICB9KTsKLSAgICB9LAotICAgIG9uZTogZnVuY3Rpb24oIHR5cGVz
LCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywg
c2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Ci0gICAgfSwKLSAgICBvZmY6IGZ1bmN0aW9uKCB0eXBl
cywgc2VsZWN0b3IsIGZuICkgewotICAgICAgICB2YXIgaGFuZGxlT2JqLCB0eXBlOwotICAgICAg
ICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiAp
IHsKLSAgICAgICAgICAgIC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnQKLSAg
ICAgICAgICAgIGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajsKLSAgICAgICAgICAgIGpRdWVy
eSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCi0gICAgICAgICAgICAgICAgaGFuZGxlT2Jq
Lm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3Bh
Y2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUsCi0gICAgICAgICAgICAgICAgaGFuZGxlT2JqLnNlbGVj
dG9yLAotICAgICAgICAgICAgICAgIGhhbmRsZU9iai5oYW5kbGVyCi0gICAgICAgICAgICApOwot
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCB0eXBlb2Yg
dHlwZXMgPT09ICJvYmplY3QiICkgewotICAgICAgICAgICAgLy8gKCB0eXBlcy1vYmplY3QgWywg
c2VsZWN0b3JdICkKLSAgICAgICAgICAgIGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7Ci0gICAgICAg
ICAgICAgICAgdGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBp
ZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIg
KSB7Ci0gICAgICAgICAgICAvLyAoIHR5cGVzIFssIGZuXSApCi0gICAgICAgICAgICBmbiA9IHNl
bGVjdG9yOwotICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAg
ICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICBmbiA9IHJldHVybkZhbHNl
OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgICBqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7
Ci0gICAgICAgIH0pOwotICAgIH0sCi0KLSAgICB0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0
YSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7Ci0gICAgICAgIH0pOwot
ICAgIH0sCi0gICAgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewotICAg
ICAgICB2YXIgZWxlbSA9IHRoaXNbMF07Ci0gICAgICAgIGlmICggZWxlbSApIHsKLSAgICAgICAg
ICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSAp
OwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLQotdmFyCi0gICAgcnhodG1sVGFnID0gLzwoPyFh
cmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVte
Pl0qKVwvPi9naSwKLSAgICBydGFnTmFtZSA9IC88KFtcdzpdKykvLAotICAgIHJodG1sID0gLzx8
JiM/XHcrOy8sCi0gICAgcm5vSW5uZXJodG1sID0gLzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSwK
LSAgICAvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkCi0gICAgcmNoZWNrZWQgPSAvY2hl
Y2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKLSAgICByc2NyaXB0VHlwZSA9IC9eJHxc
Lyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwKLSAgICByc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVwv
KC4qKS8sCi0gICAgcmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1c
XXwtLSk+XHMqJC9nLAotCi0gICAgLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1
cHBvcnQgWEhUTUwgKCMxMzIwMCkKLSAgICB3cmFwTWFwID0gewotCi0gICAgICAgIC8vIFN1cHBv
cnQ6IElFIDkKLSAgICAgICAgb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBs
ZSc+IiwgIjwvc2VsZWN0PiIgXSwKLQotICAgICAgICB0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8
L3RhYmxlPiIgXSwKLSAgICAgICAgY29sOiBbIDIsICI8dGFibGU+PGNvbGdyb3VwPiIsICI8L2Nv
bGdyb3VwPjwvdGFibGU+IiBdLAotICAgICAgICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAi
PC90Ym9keT48L3RhYmxlPiIgXSwKLSAgICAgICAgdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRy
PiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCi0KLSAgICAgICAgX2RlZmF1bHQ6IFsgMCwg
IiIsICIiIF0KLSAgICB9OwotCi0vLyBTdXBwb3J0OiBJRSA5Ci13cmFwTWFwLm9wdGdyb3VwID0g
d3JhcE1hcC5vcHRpb247Ci0KLXdyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1h
cC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Ci13cmFwTWFwLnRo
ID0gd3JhcE1hcC50ZDsKLQotLy8gU3VwcG9ydDogMS54IGNvbXBhdGliaWxpdHkKLS8vIE1hbmlw
dWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keQotZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFy
Z2V0KCBlbGVtLCBjb250ZW50ICkgewotICAgIHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0s
ICJ0YWJsZSIgKSAmJgotICAgICAgICBqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUg
IT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgInRyIiApID8KLQotICAgICAg
ICBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8Ci0gICAgICAgICAgICBl
bGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHki
KSApIDoKLSAgICAgICAgZWxlbTsKLX0KLQotLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0
dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgotZnVu
Y3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHsKLSAgICBlbGVtLnR5cGUgPSAoZWxlbS5nZXRB
dHRyaWJ1dGUoInR5cGUiKSAhPT0gbnVsbCkgKyAiLyIgKyBlbGVtLnR5cGU7Ci0gICAgcmV0dXJu
IGVsZW07Ci19Ci1mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkgewotICAgIHZhciBtYXRj
aCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApOwotCi0gICAgaWYgKCBtYXRj
aCApIHsKLSAgICAgICAgZWxlbS50eXBlID0gbWF0Y2hbIDEgXTsKLSAgICB9IGVsc2UgewotICAg
ICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpOwotICAgIH0KLQotICAgIHJldHVybiBl
bGVtOwotfQotCi0vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0
ZWQKLWZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHsKLSAgICB2
YXIgaSA9IDAsCi0gICAgICAgIGwgPSBlbGVtcy5sZW5ndGg7Ci0KLSAgICBmb3IgKCA7IGkgPCBs
OyBpKysgKSB7Ci0gICAgICAgIGRhdGFfcHJpdi5zZXQoCi0gICAgICAgICAgICBlbGVtc1sgaSBd
LCAiZ2xvYmFsRXZhbCIsICFyZWZFbGVtZW50cyB8fCBkYXRhX3ByaXYuZ2V0KCByZWZFbGVtZW50
c1sgaSBdLCAiZ2xvYmFsRXZhbCIgKQotICAgICAgICApOwotICAgIH0KLX0KLQotZnVuY3Rpb24g
Y2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsKLSAgICB2YXIgaSwgbCwgdHlwZSwgcGRhdGFP
bGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50czsKLQotICAgIGlmICggZGVz
dC5ub2RlVHlwZSAhPT0gMSApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIDEu
IENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuCi0gICAgaWYgKCBkYXRh
X3ByaXYuaGFzRGF0YSggc3JjICkgKSB7Ci0gICAgICAgIHBkYXRhT2xkID0gZGF0YV9wcml2LmFj
Y2Vzcyggc3JjICk7Ci0gICAgICAgIHBkYXRhQ3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRh
dGFPbGQgKTsKLSAgICAgICAgZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwotCi0gICAgICAgIGlm
ICggZXZlbnRzICkgewotICAgICAgICAgICAgZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKLSAgICAg
ICAgICAgIHBkYXRhQ3VyLmV2ZW50cyA9IHt9OwotCi0gICAgICAgICAgICBmb3IgKCB0eXBlIGlu
IGV2ZW50cyApIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlw
ZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmV2
ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIDIuIENvcHkg
dXNlciBkYXRhCi0gICAgaWYgKCBkYXRhX3VzZXIuaGFzRGF0YSggc3JjICkgKSB7Ci0gICAgICAg
IHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vzcyggc3JjICk7Ci0gICAgICAgIHVkYXRhQ3VyID0g
alF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7Ci0KLSAgICAgICAgZGF0YV91c2VyLnNldCgg
ZGVzdCwgdWRhdGFDdXIgKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwg
dGFnICkgewotICAgIHZhciByZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29u
dGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8ICIqIiApIDoKLSAgICAgICAgICAgIGNv
bnRleHQucXVlcnlTZWxlY3RvckFsbCA/IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8
ICIqIiApIDoKLSAgICAgICAgICAgIFtdOwotCi0gICAgcmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVk
IHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUoIGNvbnRleHQsIHRhZyApID8KLSAgICAgICAgalF1
ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOgotICAgICAgICByZXQ7Ci19Ci0KLS8vIFN1
cHBvcnQ6IElFID49IDkKLWZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7Ci0gICAgdmFy
IG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCi0gICAgLy8gRmFpbHMg
dG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRp
byBidXR0b24uCi0gICAgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiByY2hlY2thYmxlVHlw
ZS50ZXN0KCBzcmMudHlwZSApICkgewotICAgICAgICBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tl
ZDsKLQotICAgIC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBk
ZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCi0gICAgfSBlbHNlIGlm
ICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7Ci0g
ICAgICAgIGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKLSAgICB9Ci19Ci0K
LWpRdWVyeS5leHRlbmQoewotICAgIGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50
cywgZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgIHZhciBpLCBsLCBzcmNFbGVtZW50cywg
ZGVzdEVsZW1lbnRzLAotICAgICAgICAgICAgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSAp
LAotICAgICAgICAgICAgaW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1l
bnQsIGVsZW0gKTsKLQotICAgICAgICAvLyBTdXBwb3J0OiBJRSA+PSA5Ci0gICAgICAgIC8vIEZp
eCBDbG9uaW5nIGlzc3VlcwotICAgICAgICBpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYm
ICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCi0gICAg
ICAgICAgICAgICAgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkgewotCi0gICAgICAgICAgICAv
LyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9q
c3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMgotICAgICAgICAgICAgZGVzdEVsZW1lbnRzID0g
Z2V0QWxsKCBjbG9uZSApOwotICAgICAgICAgICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0g
KTsKLQotICAgICAgICAgICAgZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkg
PCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgZml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0s
IGRlc3RFbGVtZW50c1sgaSBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCi0gICAg
ICAgIGlmICggZGF0YUFuZEV2ZW50cyApIHsKLSAgICAgICAgICAgIGlmICggZGVlcERhdGFBbmRF
dmVudHMgKSB7Ci0gICAgICAgICAgICAgICAgc3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBn
ZXRBbGwoIGVsZW0gKTsKLSAgICAgICAgICAgICAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVu
dHMgfHwgZ2V0QWxsKCBjbG9uZSApOwotCi0gICAgICAgICAgICAgICAgZm9yICggaSA9IDAsIGwg
PSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5Ci0gICAgICAg
IGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsICJzY3JpcHQiICk7Ci0gICAgICAgIGlmICgg
ZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7Ci0gICAgICAgICAgICBzZXRHbG9iYWxFdmFsKCBk
ZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKLSAgICAgICAgcmV0dXJu
IGNsb25lOwotICAgIH0sCi0KLSAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNv
bnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiApIHsKLSAgICAgICAgdmFyIGVsZW0sIHRtcCwgdGFn
LCB3cmFwLCBjb250YWlucywgaiwKLSAgICAgICAgICAgIGZyYWdtZW50ID0gY29udGV4dC5jcmVh
dGVEb2N1bWVudEZyYWdtZW50KCksCi0gICAgICAgICAgICBub2RlcyA9IFtdLAotICAgICAgICAg
ICAgaSA9IDAsCi0gICAgICAgICAgICBsID0gZWxlbXMubGVuZ3RoOwotCi0gICAgICAgIGZvciAo
IDsgaSA8IGw7IGkrKyApIHsKLSAgICAgICAgICAgIGVsZW0gPSBlbGVtc1sgaSBdOwotCi0gICAg
ICAgICAgICBpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKLQotICAgICAgICAgICAgICAgIC8v
IEFkZCBub2RlcyBkaXJlY3RseQotICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LnR5cGUoIGVs
ZW0gKSA9PT0gIm9iamVjdCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0
V2ViS2l0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeS5tZXJnZSBiZWNhdXNlIHB1c2gu
YXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1l
cmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApOwotCi0gICAgICAg
ICAgICAgICAgLy8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlCi0gICAgICAgICAg
ICAgICAgfSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAgfHwgZnJhZ21lbnQu
YXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCi0gICAg
ICAgICAgICAgICAgICAgIHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgIiIsICIi
IF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyYXAgPSB3cmFw
TWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwotICAgICAgICAgICAgICAgICAgICB0bXAu
aW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxlbS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8k
Mj4iICkgKyB3cmFwWyAyIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVzY2VuZCB0aHJv
dWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGog
PSB3cmFwWyAwIF07Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggai0tICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgdG1wID0gdG1wLmxhc3RDaGlsZDsKLSAgICAgICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAg
ICAgICAgICAgICAgIC8vIGpRdWVyeS5tZXJnZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXls
aWtlKSB0aHJvd3MKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1w
LmNoaWxkTm9kZXMgKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgdG9w
LWxldmVsIGNvbnRhaW5lcgotICAgICAgICAgICAgICAgICAgICB0bXAgPSBmcmFnbWVudC5maXJz
dENoaWxkOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZpeGVzICMxMjM0NgotICAgICAgICAg
ICAgICAgICAgICAvLyBTdXBwb3J0OiBXZWJraXQsIElFCi0gICAgICAgICAgICAgICAgICAgIHRt
cC50ZXh0Q29udGVudCA9ICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnQKLSAgICAg
ICAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAg
d2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysgXSkgKSB7Ci0KLSAgICAgICAgICAgIC8vICM0MDg3
IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0
aGlzIGlzCi0gICAgICAgICAgICAvLyB0aGF0IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZwot
ICAgICAgICAgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVj
dGlvbiApICE9PSAtMSApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJE
b2N1bWVudCwgZWxlbSApOwotCi0gICAgICAgICAgICAvLyBBcHBlbmQgdG8gZnJhZ21lbnQKLSAg
ICAgICAgICAgIHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNj
cmlwdCIgKTsKLQotICAgICAgICAgICAgLy8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlz
dG9yeQotICAgICAgICAgICAgaWYgKCBjb250YWlucyApIHsKLSAgICAgICAgICAgICAgICBzZXRH
bG9iYWxFdmFsKCB0bXAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FwdHVy
ZSBleGVjdXRhYmxlcwotICAgICAgICAgICAgaWYgKCBzY3JpcHRzICkgewotICAgICAgICAgICAg
ICAgIGogPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUg
fHwgIiIgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMucHVzaCggZWxlbSAp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZyYWdtZW50OwotICAgIH0sCi0KLSAgICBj
bGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHsKLSAgICAgICAgdmFyIGRhdGEsIGVsZW0sIGV2
ZW50cywgdHlwZSwga2V5LCBqLAotICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5z
cGVjaWFsLAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9yICggOyAoZWxlbSA9IGVs
ZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5
LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBlbGVtWyBkYXRh
X3ByaXYuZXhwYW5kbyBdOwotCi0gICAgICAgICAgICAgICAgaWYgKCBrZXkgJiYgKGRhdGEgPSBk
YXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0g
T2JqZWN0LmtleXMoIGRhdGEuZXZlbnRzIHx8IHt9ICk7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICggZXZlbnRzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAw
OyAodHlwZSA9IGV2ZW50c1tqXSkgIT09IHVuZGVmaW5lZDsgaisrICkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggc3BlY2lhbFsgdHlwZSBdICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7Ci0KLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQg
alF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnJlbW92
ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVg
IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtl
eSBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgLy8gRGlzY2FyZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhCi0g
ICAgICAgICAgICBkZWxldGUgZGF0YV91c2VyLmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5k
byBdIF07Ci0gICAgICAgIH0KLSAgICB9Ci19KTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAg
dGV4dDogZnVuY3Rpb24oIHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBm
dW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5l
ZCA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LnRleHQoIHRoaXMgKSA6Ci0gICAgICAgICAgICAg
ICAgdGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5v
ZGVUeXBlID09PSA5ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0Q29udGVu
dCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0g
ICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Ci0gICAgfSwKLQotICAg
IGFwcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1
bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBl
ID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7
Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywg
ZWxlbSApOwotICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgcHJlcGVuZDogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBl
bGVtICkgewotICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9k
ZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAg
dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOwotICAgICAgICAg
ICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0sCi0KLSAgICBiZWZvcmU6IGZ1bmN0aW9u
KCkgewotICAgICAgICByZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbigg
ZWxlbSApIHsKLSAgICAgICAgICAgIGlmICggdGhpcy5wYXJlbnROb2RlICkgewotICAgICAgICAg
ICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSwKLQotICAgIGFmdGVyOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0g
KSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAg
ICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0sCi0KLSAgICByZW1vdmU6IGZ1bmN0
aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Ci0gICAg
ICAgIHZhciBlbGVtLAotICAgICAgICAgICAgZWxlbXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0
ZXIoIHNlbGVjdG9yLCB0aGlzICkgOiB0aGlzLAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAg
ICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7Ci0gICAgICAgICAg
ICBpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotICAgICAgICAgICAg
ICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSApICk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmICggZWxlbS5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIGlm
ICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0g
KSApIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAi
c2NyaXB0IiApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsZW0ucGFy
ZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIGVtcHR5OiBmdW5jdGlvbigpIHsK
LSAgICAgICAgdmFyIGVsZW0sCi0gICAgICAgICAgICBpID0gMDsKLQotICAgICAgICBmb3IgKCA7
IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewotICAgICAgICAgICAgaWYgKCBlbGVt
Lm5vZGVUeXBlID09PSAxICkgewotCi0gICAgICAgICAgICAgICAgLy8gUHJldmVudCBtZW1vcnkg
bGVha3MKLSAgICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZh
bHNlICkgKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVz
Ci0gICAgICAgICAgICAgICAgZWxlbS50ZXh0Q29udGVudCA9ICIiOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIGNsb25lOiBm
dW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgIGRh
dGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVu
dHM7Ci0gICAgICAgIGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVs
bCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKLQotICAgICAgICByZXR1cm4g
dGhpcy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LmNsb25lKCB0
aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwotICAgICAgICB9KTsKLSAg
ICB9LAotCi0gICAgaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNj
ZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSA9IHRo
aXNbIDAgXSB8fCB7fSwKLSAgICAgICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAgICAgICBs
ID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAm
JiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmlu
bmVySFRNTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiB0
YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAotICAgICAgICAgICAgaWYgKCB0
eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAm
JgotICAgICAgICAgICAgICAgICF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwg
WyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewotCi0gICAgICAgICAgICAgICAg
dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7Ci0KLSAgICAg
ICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gdGhpc1sgaSBdIHx8IHt9OwotCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVu
dCBtZW1vcnkgbGVha3MKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlw
ZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRh
KCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bGVtLmlubmVySFRNTCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9IDA7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNl
IHRoZSBmYWxsYmFjayBtZXRob2QKLSAgICAgICAgICAgICAgICB9IGNhdGNoKCBlICkge30KLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBlbGVtICkgewotICAgICAgICAgICAgICAg
IHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0s
IG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Ci0gICAgfSwKLQotICAgIHJlcGxhY2VX
aXRoOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1sgMCBdOwotCi0g
ICAgICAgIC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVu
dCB3aXRoIHRoZSBuZXcgY29udGVudAotICAgICAgICB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMs
IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgYXJnID0gdGhpcy5wYXJlbnROb2RlOwot
Ci0gICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApOwotCi0gICAg
ICAgICAgICBpZiAoIGFyZyApIHsKLSAgICAgICAgICAgICAgICBhcmcucmVwbGFjZUNoaWxkKCBl
bGVtLCB0aGlzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZv
cmNlIHJlbW92YWwgaWYgdGhlcmUgd2FzIG5vIG5ldyBjb250ZW50IChlLmcuLCBmcm9tIGVtcHR5
IGFyZ3VtZW50cykKLSAgICAgICAgcmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9k
ZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7Ci0gICAgfSwKLQotICAgIGRldGFjaDogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgewotICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9y
LCB0cnVlICk7Ci0gICAgfSwKLQotICAgIGRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJh
Y2sgKSB7Ci0KLSAgICAgICAgLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwotICAgICAgICBh
cmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOwotCi0gICAgICAgIHZhciBmcmFnbWVudCwg
Zmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYywKLSAgICAgICAgICAgIGkgPSAw
LAotICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAotICAgICAgICAgICAgc2V0ID0gdGhpcywK
LSAgICAgICAgICAgIGlOb0Nsb25lID0gbCAtIDEsCi0gICAgICAgICAgICB2YWx1ZSA9IGFyZ3Nb
IDAgXSwKLSAgICAgICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUg
KTsKLQotICAgICAgICAvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFp
biBjaGVja2VkLCBpbiBXZWJLaXQKLSAgICAgICAgaWYgKCBpc0Z1bmN0aW9uIHx8Ci0gICAgICAg
ICAgICAgICAgKCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmCi0gICAgICAg
ICAgICAgICAgICAgICFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUg
KSApICkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7
Ci0gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4ICk7Ci0gICAgICAgICAg
ICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgewotICAgICAgICAgICAgICAgICAgICBhcmdzWyAwIF0g
PSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgc2VsZi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sgKTsKLSAg
ICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBsICkgewotICAgICAgICAg
ICAgZnJhZ21lbnQgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVy
RG9jdW1lbnQsIGZhbHNlLCB0aGlzICk7Ci0gICAgICAgICAgICBmaXJzdCA9IGZyYWdtZW50LmZp
cnN0Q2hpbGQ7Ci0KLSAgICAgICAgICAgIGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGgg
PT09IDEgKSB7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBmaXJzdDsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgaWYgKCBmaXJzdCApIHsKLSAgICAgICAgICAgICAgICBzY3JpcHRz
ID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlw
dCApOwotICAgICAgICAgICAgICAgIGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsKLQotICAg
ICAgICAgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0
ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwCi0gICAgICAgICAg
ICAgICAgLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMg
KCM4MDcwKS4KLSAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIG5vZGUgPSBmcmFnbWVudDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAo
IGkgIT09IGlOb0Nsb25lICkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGpRdWVy
eS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9u
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGhhc1NjcmlwdHMgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBqUXVlcnkubWVyZ2UgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlr
ZSkgdGhyb3dzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBzY3Jp
cHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNr
LmNhbGwoIHRoaXNbIGkgXSwgbm9kZSwgaSApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgICAgIGlmICggaGFzU2NyaXB0cyApIHsKLSAgICAgICAgICAgICAgICAgICAgZG9jID0g
c2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBSZWVuYWJsZSBzY3JpcHRzCi0gICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTsKLQotICAgICAgICAgICAgICAgICAgICAv
LyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9u
Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNjcmlwdHNbIGkgXTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkg
JiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF0YV9wcml2LmFjY2Vzcyggbm9kZSwg
Imdsb2JhbEV2YWwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKLQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZS5zcmMgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0
IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggalF1ZXJ5Ll9ldmFsVXJsICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIG5vZGUudGV4
dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCAiIiApICk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKHsKLSAgICBhcHBl
bmRUbzogImFwcGVuZCIsCi0gICAgcHJlcGVuZFRvOiAicHJlcGVuZCIsCi0gICAgaW5zZXJ0QmVm
b3JlOiAiYmVmb3JlIiwKLSAgICBpbnNlcnRBZnRlcjogImFmdGVyIiwKLSAgICByZXBsYWNlQWxs
OiAicmVwbGFjZVdpdGgiCi19LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7Ci0gICAgalF1
ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBlbGVt
cywKLSAgICAgICAgICAgIHJldCA9IFtdLAotICAgICAgICAgICAgaW5zZXJ0ID0galF1ZXJ5KCBz
ZWxlY3RvciApLAotICAgICAgICAgICAgbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAotICAgICAg
ICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKLSAgICAg
ICAgICAgIGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7Ci0g
ICAgICAgICAgICBqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7Ci0K
LSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAgICAgICAvLyAuZ2V0KCkg
YmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzCi0gICAgICAgICAgICBwdXNo
LmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4g
dGhpcy5wdXNoU3RhY2soIHJldCApOwotICAgIH07Ci19KTsKLQotCi12YXIgaWZyYW1lLAotICAg
IGVsZW1kaXNwbGF5ID0ge307Ci0KLS8qKgotICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5
IG9mIGEgZWxlbWVudAotICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVs
ZW1lbnQKLSAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0Ci0gKi8KLS8vIENh
bGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5Ci1mdW5jdGlvbiBhY3R1YWxEaXNw
bGF5KCBuYW1lLCBkb2MgKSB7Ci0gICAgdmFyIGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVt
ZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSwKLQotICAgICAgICAvLyBnZXREZWZh
dWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQg
ZWxlbWVudAotICAgICAgICBkaXNwbGF5ID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxl
ID8KLQotICAgICAgICAgICAgLy8gVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZp
eCAobW9yZSBsaWtlIG9wdG1pemF0aW9uKSB1bnRpbCBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFs
b25nLAotICAgICAgICAgICAgLy8gc2luY2UgaXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVjaWZpY2F0
aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBGRgotICAgICAgICAgICAgd2luZG93LmdldERlZmF1
bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsg
MCBdLCAiZGlzcGxheSIgKTsKLQotICAgIC8vIFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVk
IG9uIHRoZSBlbGVtZW50LAotICAgIC8vIHNvIHVzZSAiZGV0YWNoIiBtZXRob2QgYXMgZmFzdCB3
YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVudAotICAgIGVsZW0uZGV0YWNoKCk7Ci0KLSAgICBy
ZXR1cm4gZGlzcGxheTsKLX0KLQotLyoqCi0gKiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0
IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudAotICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1l
Ci0gKi8KLWZ1bmN0aW9uIGRlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHsKLSAgICB2YXIgZG9j
ID0gZG9jdW1lbnQsCi0gICAgICAgIGRpc3BsYXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsK
LQotICAgIGlmICggIWRpc3BsYXkgKSB7Ci0gICAgICAgIGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5
KCBub2RlTmFtZSwgZG9jICk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMs
IHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lCi0gICAgICAgIGlmICggZGlzcGxheSA9PT0gIm5v
bmUiIHx8ICFkaXNwbGF5ICkgewotCi0gICAgICAgICAgICAvLyBVc2UgdGhlIGFscmVhZHktY3Jl
YXRlZCBpZnJhbWUgaWYgcG9zc2libGUKLSAgICAgICAgICAgIGlmcmFtZSA9IChpZnJhbWUgfHwg
alF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIg
KSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTsKLQotICAgICAgICAgICAgLy8gQWx3
YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0
IGNob2tlIG9uIHJldXNlCi0gICAgICAgICAgICBkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9j
dW1lbnQ7Ci0KLSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFCi0gICAgICAgICAgICBkb2Mud3Jp
dGUoKTsKLSAgICAgICAgICAgIGRvYy5jbG9zZSgpOwotCi0gICAgICAgICAgICBkaXNwbGF5ID0g
YWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOwotICAgICAgICAgICAgaWZyYW1lLmRldGFj
aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBk
aXNwbGF5Ci0gICAgICAgIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gZGlzcGxheTsKLX0KLXZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7Ci0K
LXZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVd
KyQiLCAiaSIgKTsKLQotdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAg
ICByZXR1cm4gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUo
IGVsZW0sIG51bGwgKTsKLSAgICB9OwotCi0KLQotZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1l
LCBjb21wdXRlZCApIHsKLSAgICB2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAot
ICAgICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7Ci0KLSAgICBjb21wdXRlZCA9IGNvbXB1dGVkIHx8
IGdldFN0eWxlcyggZWxlbSApOwotCi0gICAgLy8gU3VwcG9ydDogSUU5Ci0gICAgLy8gZ2V0UHJv
cGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUg
IzEyNTM3Ci0gICAgaWYgKCBjb21wdXRlZCApIHsKLSAgICAgICAgcmV0ID0gY29tcHV0ZWQuZ2V0
UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07Ci0gICAgfQotCi0gICAg
aWYgKCBjb21wdXRlZCApIHsKLQotICAgICAgICBpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5j
b250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7Ci0gICAgICAgICAgICByZXQg
PSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1
cHBvcnQ6IGlPUyA8IDYKLSAgICAgICAgLy8gQSB0cmlidXRlIHRvIHRoZSAiYXdlc29tZSBoYWNr
IGJ5IERlYW4gRWR3YXJkcyIKLSAgICAgICAgLy8gaU9TIDwgNiAoYXQgbGVhc3QpIHJldHVybnMg
cGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRv
IGJlIHJlbGlhYmx5IHBpeGVscwotICAgICAgICAvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09N
IGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1
ZXMKLSAgICAgICAgaWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBu
YW1lICkgKSB7Ci0KLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMK
LSAgICAgICAgICAgIHdpZHRoID0gc3R5bGUud2lkdGg7Ci0gICAgICAgICAgICBtaW5XaWR0aCA9
IHN0eWxlLm1pbldpZHRoOwotICAgICAgICAgICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsK
LQotICAgICAgICAgICAgLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVk
IHZhbHVlIG91dAotICAgICAgICAgICAgc3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9
IHN0eWxlLndpZHRoID0gcmV0OwotICAgICAgICAgICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7Ci0K
LSAgICAgICAgICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKLSAgICAgICAgICAgIHN0
eWxlLndpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRo
OwotICAgICAgICAgICAgc3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/Ci0gICAgICAgIC8vIFN1cHBvcnQ6
IElFCi0gICAgICAgIC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuCi0g
ICAgICAgIHJldCArICIiIDoKLSAgICAgICAgcmV0OwotfQotCi0KLWZ1bmN0aW9uIGFkZEdldEhv
b2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHsKLSAgICAvLyBEZWZpbmUgdGhlIGhvb2ssIHdl
J2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLgotICAgIHJl
dHVybiB7Ci0gICAgICAgIGdldDogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoIGNvbmRp
dGlvbkZuKCkgKSB7Ci0gICAgICAgICAgICAgICAgLy8gSG9vayBub3QgbmVlZGVkIChvciBpdCdz
IG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksCi0gICAg
ICAgICAgICAgICAgLy8gcmVtb3ZlIGl0LgotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJl
IGFyZSBubyBvdGhlciBob29rcyBmb3IgbWFyZ2luUmlnaHQsIHJlbW92ZSB0aGUgd2hvbGUgb2Jq
ZWN0LgotICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmdldDsKLSAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEhvb2sgbmVlZGVkOyByZWRl
ZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLgot
Ci0gICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0ID0gaG9va0ZuKS5hcHBseSggdGhpcywgYXJn
dW1lbnRzICk7Ci0gICAgICAgIH0KLSAgICB9OwotfQotCi0KLShmdW5jdGlvbigpIHsKLSAgICB2
YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsCi0gICAgICAgIC8vIFN1
cHBvcnQ6IEZpcmVmb3gsIEFuZHJvaWQgMi4zIChQcmVmaXhlZCBib3gtc2l6aW5nIHZlcnNpb25z
KS4KLSAgICAgICAgZGl2UmVzZXQgPSAicGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3Bs
YXk6YmxvY2s7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIgKwotICAgICAgICAgICAg
Ii1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IiwKLSAg
ICAgICAgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKLSAgICAgICAgY29udGFp
bmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKLSAgICAgICAgZGl2ID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKTsKLQotICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5k
Q2xpcCA9ICJjb250ZW50LWJveCI7Ci0gICAgZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJh
Y2tncm91bmRDbGlwID0gIiI7Ci0gICAgc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5
bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250ZW50LWJveCI7Ci0KLSAgICBjb250YWluZXIuc3R5
bGUuY3NzVGV4dCA9ICJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRl
O3RvcDowO2xlZnQ6LTk5OTlweDsiICsKLSAgICAgICAgIm1hcmdpbi10b3A6MXB4IjsKLSAgICBj
b250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApOwotCi0gICAgLy8gRXhlY3V0aW5nIGJvdGggcGl4
ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5
b3V0Ci0gICAgLy8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUg
dGhlIHNlY29uZCBjb21wdXRhdGlvbi4KLSAgICBmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlv
bkFuZEJveFNpemluZ1JlbGlhYmxlKCkgewotICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94LCBB
bmRyb2lkIDIuMyAoUHJlZml4ZWQgYm94LXNpemluZyB2ZXJzaW9ucykuCi0gICAgICAgIGRpdi5z
dHlsZS5jc3NUZXh0ID0gIi13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNp
emluZzpib3JkZXItYm94OyIgKwotICAgICAgICAgICAgImJveC1zaXppbmc6Ym9yZGVyLWJveDtw
YWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6
MSU7IiArCi0gICAgICAgICAgICAicG9zaXRpb246YWJzb2x1dGU7dG9wOjElIjsKLSAgICAgICAg
ZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7Ci0KLSAgICAgICAgdmFyIGRpdlN0eWxl
ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApOwotICAgICAgICBwaXhlbFBv
c2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwotICAgICAgICBib3hTaXppbmdSZWxp
YWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSAiNHB4IjsKLQotICAgICAgICBkb2NFbGVtLnJl
bW92ZUNoaWxkKCBjb250YWluZXIgKTsKLSAgICB9Ci0KLSAgICAvLyBVc2Ugd2luZG93LmdldENv
bXB1dGVkU3R5bGUgYmVjYXVzZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBp
dC4KLSAgICBpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgewotICAgICAgICBqUXVlcnku
ZXh0ZW5kKHN1cHBvcnQsIHsKLSAgICAgICAgICAgIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkg
ewotICAgICAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UgYnV0
IHdlIHN0aWxsIGRvIG1lbW9pemluZwotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGNhbiB1
c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuCi0gICAgICAgICAgICAgICAg
Ly8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgdGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRo
b3VnaC4KLSAgICAgICAgICAgICAgICBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1Jl
bGlhYmxlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7Ci0gICAg
ICAgICAgICB9LAotICAgICAgICAgICAgYm94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkgewot
ICAgICAgICAgICAgICAgIGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgY29tcHV0ZVBpeGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJs
ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYm94U2l6aW5n
UmVsaWFibGVWYWw7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgcmVsaWFibGVNYXJnaW5S
aWdodDogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCAy
LjMKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBh
bmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5Ci0gICAgICAgICAgICAgICAgLy8gZ2V0cyBj
b21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMp
Ci0gICAgICAgICAgICAgICAgLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUg
cmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0Ci0gICAgICAgICAgICAgICAgLy8g
VGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXpp
bmcgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIHZhciByZXQsCi0gICAgICAgICAgICAgICAg
ICAgIG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgg
ImRpdiIgKSApOwotICAgICAgICAgICAgICAgIG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2
LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDsKLSAgICAgICAgICAgICAgICBtYXJnaW5EaXYuc3R5
bGUubWFyZ2luUmlnaHQgPSBtYXJnaW5EaXYuc3R5bGUud2lkdGggPSAiMCI7Ci0gICAgICAgICAg
ICAgICAgZGl2LnN0eWxlLndpZHRoID0gIjFweCI7Ci0gICAgICAgICAgICAgICAgZG9jRWxlbS5h
cHBlbmRDaGlsZCggY29udGFpbmVyICk7Ci0KLSAgICAgICAgICAgICAgICByZXQgPSAhcGFyc2VG
bG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJp
Z2h0ICk7Ci0KLSAgICAgICAgICAgICAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIg
KTsKLQotICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBkaXYgZm9yIG90aGVyIHN1cHBv
cnQgdGVzdHMuCi0gICAgICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICIiOwotCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQot
fSkoKTsKLQotCi0vLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHBy
b3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zLgotalF1ZXJ5LnN3YXAgPSBmdW5j
dGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Ci0gICAgdmFyIHJldCwgbmFt
ZSwKLSAgICAgICAgb2xkID0ge307Ci0KLSAgICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywg
YW5kIGluc2VydCB0aGUgbmV3IG9uZXMKLSAgICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0g
ICAgICAgIG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwotICAgICAgICBlbGVtLnN0
eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07Ci0gICAgfQotCi0gICAgcmV0ID0gY2FsbGJh
Y2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTsKLQotICAgIC8vIFJldmVydCB0aGUgb2xkIHZh
bHVlcwotICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKLSAgICAgICAgZWxlbS5zdHlsZVsg
bmFtZSBdID0gb2xkWyBuYW1lIF07Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX07Ci0KLQot
dmFyCi0gICAgLy8gc3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0
YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxlLWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKLSAg
ICAvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemls
bGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXkKLSAgICByZGlzcGxheXN3YXAgPSAvXihub25l
fHRhYmxlKD8hLWNbZWFdKS4rKS8sCi0gICAgcm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiAr
IHBudW0gKyAiKSguKikkIiwgImkiICksCi0gICAgcnJlbE51bSA9IG5ldyBSZWdFeHAoICJeKFsr
LV0pPSgiICsgcG51bSArICIpIiwgImkiICksCi0KLSAgICBjc3NTaG93ID0geyBwb3NpdGlvbjog
ImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKLSAg
ICBjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7Ci0gICAgICAgIGxldHRlclNwYWNpbmc6IDAsCi0gICAg
ICAgIGZvbnRXZWlnaHQ6IDQwMAotICAgIH0sCi0KLSAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtp
dCIsICJPIiwgIk1veiIsICJtcyIgXTsKLQotLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBl
ZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQotZnVuY3Rpb24gdmVu
ZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkgewotCi0gICAgLy8gc2hvcnRjdXQgZm9yIG5hbWVz
IHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWQKLSAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7
Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciB2ZW5kb3Ig
cHJlZml4ZWQgbmFtZXMKLSAgICB2YXIgY2FwTmFtZSA9IG5hbWVbMF0udG9VcHBlckNhc2UoKSAr
IG5hbWUuc2xpY2UoMSksCi0gICAgICAgIG9yaWdOYW1lID0gbmFtZSwKLSAgICAgICAgaSA9IGNz
c1ByZWZpeGVzLmxlbmd0aDsKLQotICAgIHdoaWxlICggaS0tICkgewotICAgICAgICBuYW1lID0g
Y3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7Ci0gICAgICAgIGlmICggbmFtZSBpbiBzdHlsZSAp
IHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0
dXJuIG9yaWdOYW1lOwotfQotCi1mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFs
dWUsIHN1YnRyYWN0ICkgewotICAgIHZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVl
ICk7Ci0gICAgcmV0dXJuIG1hdGNoZXMgPwotICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHVuZGVm
aW5lZCAic3VidHJhY3QiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3MKLSAgICAgICAg
TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNo
ZXNbIDIgXSB8fCAicHgiICkgOgotICAgICAgICB2YWx1ZTsKLX0KLQotZnVuY3Rpb24gYXVnbWVu
dFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkg
ewotICAgIHZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250
ZW50IiApID8KLSAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJl
bWVudCwgYXZvaWQgYXVnbWVudGF0aW9uCi0gICAgICAgIDQgOgotICAgICAgICAvLyBPdGhlcndp
c2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCi0gICAg
ICAgIG5hbWUgPT09ICJ3aWR0aCIgPyAxIDogMCwKLQotICAgICAgICB2YWwgPSAwOwotCi0gICAg
Zm9yICggOyBpIDwgNDsgaSArPSAyICkgewotICAgICAgICAvLyBib3RoIGJveCBtb2RlbHMgZXhj
bHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0Ci0gICAgICAgIGlmICggZXh0cmEg
PT09ICJtYXJnaW4iICkgewotICAgICAgICAgICAgdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4
dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCBpc0JvcmRlckJveCApIHsKLSAgICAgICAgICAgIC8vIGJvcmRlci1ib3ggaW5jbHVk
ZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudAotICAgICAgICAgICAg
aWYgKCBleHRyYSA9PT0gImNvbnRlbnQiICkgewotICAgICAgICAgICAgICAgIHZhbCAtPSBqUXVl
cnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlz
bid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyCi0gICAgICAgICAgICBpZiAo
IGV4dHJhICE9PSAibWFyZ2luIiApIHsKLSAgICAgICAgICAgICAgICB2YWwgLT0galF1ZXJ5LmNz
cyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxl
cyApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXQg
dGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKLSAgICAgICAg
ICAgIHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwg
dHJ1ZSwgc3R5bGVzICk7Ci0KLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlz
bid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXIKLSAgICAgICAgICAgIGlmICgg
ZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKLSAgICAgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNz
cyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxl
cyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsK
LX0KLQotZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7Ci0K
LSAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0
byB0aGUgYm9yZGVyLWJveCB2YWx1ZQotICAgIHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwK
LSAgICAgICAgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVt
Lm9mZnNldEhlaWdodCwKLSAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCi0gICAg
ICAgIGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBz
dHlsZXMgKSA9PT0gImJvcmRlci1ib3giOwotCi0gICAgLy8gc29tZSBub24taHRtbCBlbGVtZW50
cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5k
ZWZpbmVkCi0gICAgLy8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NjQ5Mjg1Ci0gICAgLy8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxh
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4Ci0gICAgaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0g
bnVsbCApIHsKLSAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRl
ZCBjc3MgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5
bGVzICk7Ci0gICAgICAgIGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAg
ICAgIHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENv
bXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uCi0gICAgICAg
IGlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBuZWVkIHRoZSBjaGVjayBmb3Igc3R5bGUgaW4gY2Fz
ZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1bnJlbGlhYmxlIHZhbHVlcwotICAgICAgICAvLyBm
b3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBl
bGVtLnN0eWxlCi0gICAgICAgIHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJgotICAg
ICAgICAgICAgKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0
eWxlWyBuYW1lIF0gKTsKLQotICAgICAgICAvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVw
YXJlIGZvciBleHRyYQotICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwOwotICAg
IH0KLQotICAgIC8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRy
YWN0IGlycmVsZXZhbnQgc3R5bGVzCi0gICAgcmV0dXJuICggdmFsICsKLSAgICAgICAgYXVnbWVu
dFdpZHRoT3JIZWlnaHQoCi0gICAgICAgICAgICBlbGVtLAotICAgICAgICAgICAgbmFtZSwKLSAg
ICAgICAgICAgIGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiAp
LAotICAgICAgICAgICAgdmFsdWVJc0JvcmRlckJveCwKLSAgICAgICAgICAgIHN0eWxlcwotICAg
ICAgICApCi0gICAgKSArICJweCI7Ci19Ci0KLWZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywg
c2hvdyApIHsKLSAgICB2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLAotICAgICAgICB2YWx1ZXMg
PSBbXSwKLSAgICAgICAgaW5kZXggPSAwLAotICAgICAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5n
dGg7Ci0KLSAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewotICAgICAgICBl
bGVtID0gZWxlbWVudHNbIGluZGV4IF07Ci0gICAgICAgIGlmICggIWVsZW0uc3R5bGUgKSB7Ci0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlc1sgaW5kZXgg
XSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sICJvbGRkaXNwbGF5IiApOwotICAgICAgICBkaXNwbGF5
ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwotICAgICAgICBpZiAoIHNob3cgKSB7Ci0gICAgICAgICAg
ICAvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlm
IGl0IGlzCi0gICAgICAgICAgICAvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Ig
bm90Ci0gICAgICAgICAgICBpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5v
bmUiICkgewotICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92
ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCi0gICAgICAgICAgICAvLyBpbiBhIHN0eWxlc2hl
ZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpcwotICAgICAgICAgICAg
Ly8gZm9yIHN1Y2ggYW4gZWxlbWVudAotICAgICAgICAgICAgaWYgKCBlbGVtLnN0eWxlLmRpc3Bs
YXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVz
WyBpbmRleCBdID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0
RGlzcGxheShlbGVtLm5vZGVOYW1lKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2Ug
ewotCi0gICAgICAgICAgICBpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7Ci0gICAgICAgICAgICAg
ICAgaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKLQotICAgICAgICAgICAgICAgIGlmICggZGlz
cGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKLSAgICAgICAgICAgICAg
ICAgICAgZGF0YV9wcml2LnNldCggZWxlbSwgIm9sZGRpc3BsYXkiLCBoaWRkZW4gPyBkaXNwbGF5
IDogalF1ZXJ5LmNzcyhlbGVtLCAiZGlzcGxheSIpICk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBkaXNwbGF5IG9m
IG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKLSAgICAvLyB0byBhdm9pZCB0
aGUgY29uc3RhbnQgcmVmbG93Ci0gICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsg
aW5kZXgrKyApIHsKLSAgICAgICAgZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOwotICAgICAgICBp
ZiAoICFlbGVtLnN0eWxlICkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVt
LnN0eWxlLmRpc3BsYXkgPT09ICIiICkgewotICAgICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5
ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCAiIiA6ICJub25lIjsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiBlbGVtZW50czsKLX0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgLy8g
QWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0Ci0g
ICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5Ci0g
ICAgY3NzSG9va3M6IHsKLSAgICAgICAgb3BhY2l0eTogewotICAgICAgICAgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjb21wdXRlZCAp
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIg
YmFjayBmcm9tIG9wYWNpdHkKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGN1ckNTUygg
ZWxlbSwgIm9wYWNpdHkiICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPT09ICIi
ID8gIjEiIDogcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0sCi0KLSAgICAvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNl
IHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXMKLSAgICBjc3NOdW1iZXI6IHsKLSAgICAgICAg
ImNvbHVtbkNvdW50IjogdHJ1ZSwKLSAgICAgICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKLSAgICAg
ICAgImZvbnRXZWlnaHQiOiB0cnVlLAotICAgICAgICAibGluZUhlaWdodCI6IHRydWUsCi0gICAg
ICAgICJvcGFjaXR5IjogdHJ1ZSwKLSAgICAgICAgIm9yZGVyIjogdHJ1ZSwKLSAgICAgICAgIm9y
cGhhbnMiOiB0cnVlLAotICAgICAgICAid2lkb3dzIjogdHJ1ZSwKLSAgICAgICAgInpJbmRleCI6
IHRydWUsCi0gICAgICAgICJ6b29tIjogdHJ1ZQotICAgIH0sCi0KLSAgICAvLyBBZGQgaW4gcHJv
cGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCi0gICAgLy8gc2V0dGlu
ZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQotICAgIGNzc1Byb3BzOiB7Ci0gICAgICAgIC8vIG5vcm1h
bGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKLSAgICAgICAgImZsb2F0IjogImNzc0Zsb2F0IgotICAg
IH0sCi0KLSAgICAvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9k
ZQotICAgIHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgewotICAg
ICAgICAvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKLSAgICAg
ICAgaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09
IDggfHwgIWVsZW0uc3R5bGUgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5h
bWUKLSAgICAgICAgdmFyIHJldCwgdHlwZSwgaG9va3MsCi0gICAgICAgICAgICBvcmlnTmFtZSA9
IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwKLSAgICAgICAgICAgIHN0eWxlID0gZWxlbS5zdHls
ZTsKLQotICAgICAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1
ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFt
ZSApICk7Ci0KLSAgICAgICAgLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgot
ICAgICAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgICAgIGhv
b2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFt
ZSBdOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQotICAgICAg
ICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZW9m
IHZhbHVlOwotCi0gICAgICAgICAgICAvLyBjb252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdz
ICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVtYmVycy4gIzczNDUKLSAgICAgICAgICAgIGlmICgg
dHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7Ci0g
ICAgICAgICAgICAgICAgdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxv
YXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOwotICAgICAgICAgICAgICAgIC8vIEZpeGVz
IGJ1ZyAjOTIzNwotICAgICAgICAgICAgICAgIHR5cGUgPSAibnVtYmVyIjsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBh
cmVuJ3Qgc2V0LiBTZWU6ICM3MTE2Ci0gICAgICAgICAgICBpZiAoIHZhbHVlID09IG51bGwgfHwg
dmFsdWUgIT09IHZhbHVlICkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcg
dG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCi0gICAgICAgICAgICBp
ZiAoIHR5cGUgPT09ICJudW1iZXIiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkg
ewotICAgICAgICAgICAgICAgIHZhbHVlICs9ICJweCI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIC8vIEZpeGVzICM4OTA4LCBpdCBjYW4gYmUgZG9uZSBtb3JlIGNvcnJlY3RseSBieSBz
cGVjaWZ5aW5nIHNldHRlcnMgaW4gY3NzSG9va3MsCi0gICAgICAgICAgICAvLyBidXQgaXQgd291
bGQgbWVhbiB0byBkZWZpbmUgZWlnaHQgKGZvciBldmVyeSBwcm9ibGVtYXRpYyBwcm9wZXJ0eSkg
aWRlbnRpY2FsIGZ1bmN0aW9ucwotICAgICAgICAgICAgaWYgKCAhc3VwcG9ydC5jbGVhckNsb25l
U3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09
IDAgKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRo
YXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAg
ICAgICBpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5z
ZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
ICAgIC8vIFN1cHBvcnQ6IENocm9tZSwgU2FmYXJpCi0gICAgICAgICAgICAgICAgLy8gU2V0dGlu
ZyBzdHlsZSB0byBibGFuayBzdHJpbmcgcmVxdWlyZWQgdG8gZGVsZXRlICJzdHlsZTogeCAhaW1w
b3J0YW50OyIKLSAgICAgICAgICAgICAgICBzdHlsZVsgbmFtZSBdID0gIiI7Ci0gICAgICAgICAg
ICAgICAgc3R5bGVbIG5hbWUgXSA9IHZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9u
LWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKLSAgICAgICAgICAgIGlmICggaG9va3MgJiYgImdl
dCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9
PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRo
ZSBzdHlsZSBvYmplY3QKLSAgICAgICAgICAgIHJldHVybiBzdHlsZVsgbmFtZSBdOwotICAgICAg
ICB9Ci0gICAgfSwKLQotICAgIGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHls
ZXMgKSB7Ci0gICAgICAgIHZhciB2YWwsIG51bSwgaG9va3MsCi0gICAgICAgICAgICBvcmlnTmFt
ZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhh
dCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKLSAgICAgICAgbmFtZSA9IGpRdWVy
eS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9
IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7Ci0KLSAgICAgICAgLy8g
Z2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgotICAgICAgICAvLyBmb2xsb3dlZCBi
eSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tz
WyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOwotCi0gICAgICAgIC8vIElm
IGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCi0g
ICAgICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7Ci0gICAgICAgICAgICB2YWwg
PSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1
c2UgdGhhdAotICAgICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vY29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQotICAgICAgICBpZiAoIHZhbCA9
PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7Ci0gICAgICAgICAg
ICB2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIFJldHVybiwgY29udmVydGluZyB0byBudW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVy
IHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKLSAgICAgICAgaWYgKCBleHRyYSA9
PT0gIiIgfHwgZXh0cmEgKSB7Ci0gICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsK
LSAgICAgICAgICAgIHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBqUXVlcnkuaXNOdW1lcmljKCBu
dW0gKSA/IG51bSB8fCAwIDogdmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0g
ICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24o
IGksIG5hbWUgKSB7Ci0gICAgalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7Ci0gICAgICAgIGdl
dDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKLSAgICAgICAgICAgIGlmICgg
Y29tcHV0ZWQgKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2
ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCi0gICAgICAgICAgICAg
ICAgLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQg
d291bGQgYmVuZWZpdCBmcm9tIHRoaXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5vZmZz
ZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgImRp
c3BsYXkiICkgKSA/Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NT
aG93LCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRXaWR0
aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOwotICAgICAgICAgICAgICAgICAgICB9KSA6
Ci0gICAgICAgICAgICAgICAgICAgIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJh
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgc2V0OiBmdW5jdGlvbigg
ZWxlbSwgdmFsdWUsIGV4dHJhICkgewotICAgICAgICAgICAgdmFyIHN0eWxlcyA9IGV4dHJhICYm
IGdldFN0eWxlcyggZWxlbSApOwotICAgICAgICAgICAgcmV0dXJuIHNldFBvc2l0aXZlTnVtYmVy
KCBlbGVtLCB2YWx1ZSwgZXh0cmEgPwotICAgICAgICAgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVp
Z2h0KAotICAgICAgICAgICAgICAgICAgICBlbGVtLAotICAgICAgICAgICAgICAgICAgICBuYW1l
LAotICAgICAgICAgICAgICAgICAgICBleHRyYSwKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5
LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3gi
LAotICAgICAgICAgICAgICAgICAgICBzdHlsZXMKLSAgICAgICAgICAgICAgICApIDogMAotICAg
ICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH07Ci19KTsKLQotLy8gU3VwcG9ydDogQW5kcm9p
ZCAyLjMKLWpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9y
dC5yZWxpYWJsZU1hcmdpblJpZ2h0LAotICAgIGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsK
LSAgICAgICAgaWYgKCBjb21wdXRlZCApIHsKLSAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMz
NDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdo
dAotICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVt
ZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCi0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnN3
YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LAotICAgICAgICAgICAgICAg
IGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmlnaHQiIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSk7
Ci0KLS8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRp
ZXMKLWpRdWVyeS5lYWNoKHsKLSAgICBtYXJnaW46ICIiLAotICAgIHBhZGRpbmc6ICIiLAotICAg
IGJvcmRlcjogIldpZHRoIgotfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewotICAgIGpR
dWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7Ci0gICAgICAgIGV4cGFuZDogZnVu
Y3Rpb24oIHZhbHVlICkgewotICAgICAgICAgICAgdmFyIGkgPSAwLAotICAgICAgICAgICAgICAg
IGV4cGFuZGVkID0ge30sCi0KLSAgICAgICAgICAgICAgICAvLyBhc3N1bWVzIGEgc2luZ2xlIG51
bWJlciBpZiBub3QgYSBzdHJpbmcKLSAgICAgICAgICAgICAgICBwYXJ0cyA9IHR5cGVvZiB2YWx1
ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdOwotCi0gICAgICAg
ICAgICBmb3IgKCA7IGkgPCA0OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgZXhwYW5kZWRbIHBy
ZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPQotICAgICAgICAgICAgICAgICAgICBw
YXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIHJldHVybiBleHBhbmRlZDsKLSAgICAgICAgfQotICAgIH07Ci0KLSAg
ICBpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgewotICAgICAgICBqUXVlcnkuY3NzSG9v
a3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwotICAgIH0KLX0p
OwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSAp
IHsKLSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZh
bHVlICkgewotICAgICAgICAgICAgdmFyIHN0eWxlcywgbGVuLAotICAgICAgICAgICAgICAgIG1h
cCA9IHt9LAotICAgICAgICAgICAgICAgIGkgPSAwOwotCi0gICAgICAgICAgICBpZiAoIGpRdWVy
eS5pc0FycmF5KCBuYW1lICkgKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVz
KCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgbGVuID0gbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAg
ICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgbWFw
WyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxl
cyApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBtYXA7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8K
LSAgICAgICAgICAgICAgICBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgotICAg
ICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKLSAgICAgICAgfSwgbmFtZSwg
dmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Ci0gICAgfSwKLSAgICBzaG93OiBmdW5jdGlv
bigpIHsKLSAgICAgICAgcmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7Ci0gICAgfSwKLSAg
ICBoaWRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNob3dIaWRlKCB0aGlzICk7Ci0g
ICAgfSwKLSAgICB0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHsKLSAgICAgICAgaWYgKCB0eXBl
b2Ygc3RhdGUgPT09ICJib29sZWFuIiApIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZSA/IHRo
aXMuc2hvdygpIDogdGhpcy5oaWRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhp
cy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgaWYgKCBpc0hpZGRlbiggdGhpcyApICkg
ewotICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLnNob3coKTsKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkuaGlkZSgpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19KTsKLQotCi1mdW5jdGlvbiBUd2VlbiggZWxlbSwg
b3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7Ci0gICAgcmV0dXJuIG5ldyBUd2Vlbi5wcm90
b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTsKLX0KLWpRdWVy
eS5Ud2VlbiA9IFR3ZWVuOwotCi1Ud2Vlbi5wcm90b3R5cGUgPSB7Ci0gICAgY29uc3RydWN0b3I6
IFR3ZWVuLAotICAgIGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVh
c2luZywgdW5pdCApIHsKLSAgICAgICAgdGhpcy5lbGVtID0gZWxlbTsKLSAgICAgICAgdGhpcy5w
cm9wID0gcHJvcDsKLSAgICAgICAgdGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgInN3aW5nIjsKLSAg
ICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMu
bm93ID0gdGhpcy5jdXIoKTsKLSAgICAgICAgdGhpcy5lbmQgPSBlbmQ7Ci0gICAgICAgIHRoaXMu
dW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsK
LSAgICB9LAotICAgIGN1cjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBob29rcyA9IFR3ZWVu
LnByb3BIb29rc1sgdGhpcy5wcm9wIF07Ci0KLSAgICAgICAgcmV0dXJuIGhvb2tzICYmIGhvb2tz
LmdldCA/Ci0gICAgICAgICAgICBob29rcy5nZXQoIHRoaXMgKSA6Ci0gICAgICAgICAgICBUd2Vl
bi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Ci0gICAgfSwKLSAgICBydW46IGZ1bmN0
aW9uKCBwZXJjZW50ICkgewotICAgICAgICB2YXIgZWFzZWQsCi0gICAgICAgICAgICBob29rcyA9
IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9wdGlv
bnMuZHVyYXRpb24gKSB7Ci0gICAgICAgICAgICB0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVh
c2luZ1sgdGhpcy5lYXNpbmcgXSgKLSAgICAgICAgICAgICAgICBwZXJjZW50LCB0aGlzLm9wdGlv
bnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24KLSAgICAg
ICAgICAgICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBvcyA9IGVhc2Vk
ID0gcGVyY2VudDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0
aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9w
dGlvbnMuc3RlcCApIHsKLSAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMu
ZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggaG9va3Mg
JiYgaG9va3Muc2V0ICkgewotICAgICAgICAgICAgaG9va3Muc2V0KCB0aGlzICk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlz
ICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfTsKLQotVHdlZW4u
cHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlOwotCi1Ud2Vlbi5wcm9w
SG9va3MgPSB7Ci0gICAgX2RlZmF1bHQ6IHsKLSAgICAgICAgZ2V0OiBmdW5jdGlvbiggdHdlZW4g
KSB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0OwotCi0gICAgICAgICAgICBpZiAoIHR3ZWVuLmVs
ZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKCF0d2Vlbi5lbGVt
LnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAvLyBwYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBw
YXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgIC8vIGF0dGVt
cHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFp
bHMKLSAgICAgICAgICAgIC8vIHNvLCBzaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBw
YXJzZWQgdG8gRmxvYXQuCi0gICAgICAgICAgICAvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzICJy
b3RhdGUoMXJhZCkiIGFyZSByZXR1cm5lZCBhcyBpcy4KLSAgICAgICAgICAgIHJlc3VsdCA9IGpR
dWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsICIiICk7Ci0gICAgICAgICAgICAvLyBF
bXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRv
IDAuCi0gICAgICAgICAgICByZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAg
OiByZXN1bHQ7Ci0gICAgICAgIH0sCi0gICAgICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgewot
ICAgICAgICAgICAgLy8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9v
ayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0cwotICAgICAgICAgICAgLy8gYXZhaWxh
YmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUKLSAgICAgICAgICAg
IGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKLSAgICAgICAgICAgICAgICBq
UXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApOwotICAgICAgICAgICAgfSBlbHNl
IGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQ
cm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnBy
b3AgXSApICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdl
ZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0vLyBTdXBwb3J0OiBJRTkKLS8v
IFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBu
b2RlcwotCi1Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9s
bExlZnQgPSB7Ci0gICAgc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7Ci0gICAgICAgIGlmICggdHdl
ZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAg
ICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7Ci0gICAgICAgIH0KLSAgICB9
Ci19OwotCi1qUXVlcnkuZWFzaW5nID0gewotICAgIGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7Ci0g
ICAgICAgIHJldHVybiBwOwotICAgIH0sCi0gICAgc3dpbmc6IGZ1bmN0aW9uKCBwICkgewotICAg
ICAgICByZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyOwotICAgIH0KLX07
Ci0KLWpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0OwotCi0vLyBCYWNrIENvbXBhdCA8
MS44IGV4dGVuc2lvbiBwb2ludAotalF1ZXJ5LmZ4LnN0ZXAgPSB7fTsKLQotCi0KLQotdmFyCi0g
ICAgZnhOb3csIHRpbWVySWQsCi0gICAgcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUp
JC8sCi0gICAgcmZ4bnVtID0gbmV3IFJlZ0V4cCggIl4oPzooWystXSk9fCkoIiArIHBudW0gKyAi
KShbYS16JV0qKSQiLCAiaSIgKSwKLSAgICBycnVuID0gL3F1ZXVlSG9va3MkLywKLSAgICBhbmlt
YXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sCi0gICAgdHdlZW5lcnMgPSB7
Ci0gICAgICAgICIqIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7Ci0gICAgICAgICAgICB2
YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLAotICAgICAgICAgICAg
ICAgIHRhcmdldCA9IHR3ZWVuLmN1cigpLAotICAgICAgICAgICAgICAgIHBhcnRzID0gcmZ4bnVt
LmV4ZWMoIHZhbHVlICksCi0gICAgICAgICAgICAgICAgdW5pdCA9IHBhcnRzICYmIHBhcnRzWyAz
IF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKSwKLQotICAgICAg
ICAgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBw
b3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCi0gICAgICAgICAgICAgICAgc3RhcnQgPSAoIGpRdWVy
eS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICt0YXJnZXQgKSAmJgotICAg
ICAgICAgICAgICAgICAgICByZnhudW0uZXhlYyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJv
cCApICksCi0gICAgICAgICAgICAgICAgc2NhbGUgPSAxLAotICAgICAgICAgICAgICAgIG1heEl0
ZXJhdGlvbnMgPSAyMDsKLQotICAgICAgICAgICAgaWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9
PSB1bml0ICkgewotICAgICAgICAgICAgICAgIC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpR
dWVyeS5jc3MKLSAgICAgICAgICAgICAgICB1bml0ID0gdW5pdCB8fCBzdGFydFsgMyBdOwotCi0g
ICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGll
cyBsYXRlciBvbgotICAgICAgICAgICAgICAgIHBhcnRzID0gcGFydHMgfHwgW107Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFy
dGluZyBwb2ludAotICAgICAgICAgICAgICAgIHN0YXJ0ID0gK3RhcmdldCB8fCAxOwotCi0gICAg
ICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmV2aW91cyBpdGVy
YXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKgotICAgICAg
ICAgICAgICAgICAgICAvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBk
b24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvdwotICAgICAgICAg
ICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8ICIuNSI7Ci0KLSAgICAgICAgICAgICAgICAgICAg
Ly8gQWRqdXN0IGFuZCBhcHBseQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC8g
c2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJv
cCwgc3RhcnQgKyB1bml0ICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc2NhbGUsIHRv
bGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKQotICAgICAgICAgICAgICAgIC8v
IEFuZCBicmVha2luZyB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwg
b3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoCi0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIHNj
YWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYg
LS1tYXhJdGVyYXRpb25zICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0
ZSB0d2VlbiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBpZiAoIHBhcnRzICkgewotICAgICAgICAg
ICAgICAgIHN0YXJ0ID0gdHdlZW4uc3RhcnQgPSArc3RhcnQgfHwgK3RhcmdldCB8fCAwOwotICAg
ICAgICAgICAgICAgIHR3ZWVuLnVuaXQgPSB1bml0OwotICAgICAgICAgICAgICAgIC8vIElmIGEg
Kz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlv
bgotICAgICAgICAgICAgICAgIHR3ZWVuLmVuZCA9IHBhcnRzWyAxIF0gPwotICAgICAgICAgICAg
ICAgICAgICBzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOgotICAgICAg
ICAgICAgICAgICAgICArcGFydHNbIDIgXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
cmV0dXJuIHR3ZWVuOwotICAgICAgICB9IF0KLSAgICB9OwotCi0vLyBBbmltYXRpb25zIGNyZWF0
ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5Ci1mdW5jdGlvbiBjcmVhdGVG
eE5vdygpIHsKLSAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICBmeE5vdyA9IHVu
ZGVmaW5lZDsKLSAgICB9KTsKLSAgICByZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwot
fQotCi0vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlv
bgotZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsKLSAgICB2YXIgd2hpY2gs
Ci0gICAgICAgIGkgPSAwLAotICAgICAgICBhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07Ci0KLSAg
ICAvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4
cGFuZCB2YWx1ZXMsCi0gICAgLy8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1
ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAotICAgIGluY2x1ZGVXaWR0aCA9IGlu
Y2x1ZGVXaWR0aCA/IDEgOiAwOwotICAgIGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRl
V2lkdGggKSB7Ci0gICAgICAgIHdoaWNoID0gY3NzRXhwYW5kWyBpIF07Ci0gICAgICAgIGF0dHJz
WyAibWFyZ2luIiArIHdoaWNoIF0gPSBhdHRyc1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7
Ci0gICAgfQotCi0gICAgaWYgKCBpbmNsdWRlV2lkdGggKSB7Ci0gICAgICAgIGF0dHJzLm9wYWNp
dHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJzOwotfQot
Ci1mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKLSAgICB2
YXIgdHdlZW4sCi0gICAgICAgIGNvbGxlY3Rpb24gPSAoIHR3ZWVuZXJzWyBwcm9wIF0gfHwgW10g
KS5jb25jYXQoIHR3ZWVuZXJzWyAiKiIgXSApLAotICAgICAgICBpbmRleCA9IDAsCi0gICAgICAg
IGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOwotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGg7
IGluZGV4KysgKSB7Ci0gICAgICAgIGlmICggKHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5j
YWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkpICkgewotCi0gICAgICAgICAgICAvLyB3ZSdy
ZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQotICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAg
ICAgICB9Ci0gICAgfQotfQotCi1mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9w
cywgb3B0cyApIHsKLSAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCi0gICAgdmFyIHBy
b3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwKLSAgICAg
ICAgYW5pbSA9IHRoaXMsCi0gICAgICAgIG9yaWcgPSB7fSwKLSAgICAgICAgc3R5bGUgPSBlbGVt
LnN0eWxlLAotICAgICAgICBoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVt
ICksCi0gICAgICAgIGRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsK
LQotICAgIC8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXMKLSAgICBpZiAoICFvcHRzLnF1
ZXVlICkgewotICAgICAgICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiAp
OwotICAgICAgICBpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7Ci0gICAgICAgICAgICBo
b29rcy51bnF1ZXVlZCA9IDA7Ci0gICAgICAgICAgICBvbGRmaXJlID0gaG9va3MuZW1wdHkuZmly
ZTsKLSAgICAgICAgICAgIGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoICFob29rcy51bnF1ZXVlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgb2xk
ZmlyZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAg
ICAgICAgaG9va3MudW5xdWV1ZWQrKzsKLQotICAgICAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigp
IHsKLSAgICAgICAgICAgIC8vIGRvaW5nIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0
ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCi0gICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyBjb21w
bGV0ZXMKLSAgICAgICAgICAgIGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAg
ICAgIGhvb2tzLnVucXVldWVkLS07Ci0gICAgICAgICAgICAgICAgaWYgKCAhalF1ZXJ5LnF1ZXVl
KCBlbGVtLCAiZngiICkubGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICBob29rcy5lbXB0
eS5maXJlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0p
OwotICAgIH0KLQotICAgIC8vIGhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzCi0gICAgaWYgKCBl
bGVtLm5vZGVUeXBlID09PSAxICYmICggImhlaWdodCIgaW4gcHJvcHMgfHwgIndpZHRoIiBpbiBw
cm9wcyApICkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQK
LSAgICAgICAgLy8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTkt
MTAgZG8gbm90Ci0gICAgICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4g
b3ZlcmZsb3dYIGFuZAotICAgICAgICAvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2
YWx1ZQotICAgICAgICBvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3Zl
cmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsKLQotICAgICAgICAvLyBTZXQgZGlzcGxheSBwcm9w
ZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAotICAgICAgICAvLyBhbmltYXRp
b25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1h
dGVkCi0gICAgICAgIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKLSAg
ICAgICAgLy8gR2V0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAibm9u
ZSIKLSAgICAgICAgaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7Ci0gICAgICAgICAgICBkaXNw
bGF5ID0gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoIGRpc3BsYXkgPT09ICJpbmxpbmUiICYmCi0gICAgICAgICAgICAgICAgalF1ZXJ5LmNz
cyggZWxlbSwgImZsb2F0IiApID09PSAibm9uZSIgKSB7Ci0KLSAgICAgICAgICAgIHN0eWxlLmRp
c3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggb3B0
cy5vdmVyZmxvdyApIHsKLSAgICAgICAgc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKLSAgICAg
ICAgYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyA9
IG9wdHMub3ZlcmZsb3dbIDAgXTsKLSAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93WCA9IG9wdHMu
b3ZlcmZsb3dbIDEgXTsKLSAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZs
b3dbIDIgXTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gc2hvdy9oaWRlIHBhc3MKLSAg
ICBmb3IgKCBwcm9wIGluIHByb3BzICkgewotICAgICAgICB2YWx1ZSA9IHByb3BzWyBwcm9wIF07
Ci0gICAgICAgIGlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIGRl
bGV0ZSBwcm9wc1sgcHJvcCBdOwotICAgICAgICAgICAgdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVl
ID09PSAidG9nZ2xlIjsKLSAgICAgICAgICAgIGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhp
ZGUiIDogInNob3ciICkgKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRh
U2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29p
bmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgot
ICAgICAgICAgICAgICAgIGlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRh
U2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGRl
biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5
bGUoIGVsZW0sIHByb3AgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggIWpRdWVyeS5p
c0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7Ci0gICAgICAgIGlmICggZGF0YVNob3cgKSB7Ci0gICAg
ICAgICAgICBpZiAoICJoaWRkZW4iIGluIGRhdGFTaG93ICkgewotICAgICAgICAgICAgICAgIGhp
ZGRlbiA9IGRhdGFTaG93LmhpZGRlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIGRhdGFTaG93ID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIs
IHt9ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xl
IC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgpIHRvICJyZXZlcnNlIgotICAgICAgICBpZiAoIHRv
Z2dsZSApIHsKLSAgICAgICAgICAgIGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47Ci0gICAgICAg
IH0KLSAgICAgICAgaWYgKCBoaWRkZW4gKSB7Ci0gICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5z
aG93KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbmltLmRvbmUoZnVuY3Rpb24o
KSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCBlbGVtICkuaGlkZSgpOwotICAgICAgICAgICAg
fSk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5pbS5kb25lKGZ1bmN0aW9uKCkgewotICAgICAgICAg
ICAgdmFyIHByb3A7Ci0KLSAgICAgICAgICAgIGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJmeHNo
b3ciICk7Ci0gICAgICAgICAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7Ci0gICAgICAgICAgICAg
ICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZvciAoIHByb3AgaW4gb3JpZyApIHsKLSAgICAgICAg
ICAgIHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBw
cm9wLCBhbmltICk7Ci0KLSAgICAgICAgICAgIGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkg
ewotICAgICAgICAgICAgICAgIGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKLSAgICAg
ICAgICAgICAgICBpZiAoIGhpZGRlbiApIHsKLSAgICAgICAgICAgICAgICAgICAgdHdlZW4uZW5k
ID0gdHdlZW4uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHR3ZWVuLnN0YXJ0ID0gcHJvcCA9
PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotZnVuY3Rpb24gcHJvcEZp
bHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7Ci0gICAgdmFyIGluZGV4LCBuYW1lLCBlYXNp
bmcsIHZhbHVlLCBob29rczsKLQotICAgIC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQg
ZXhwYW5kIGNzc0hvb2sgcGFzcwotICAgIGZvciAoIGluZGV4IGluIHByb3BzICkgewotICAgICAg
ICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKLSAgICAgICAgZWFzaW5nID0gc3Bl
Y2lhbEVhc2luZ1sgbmFtZSBdOwotICAgICAgICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwotICAg
ICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewotICAgICAgICAgICAgZWFzaW5n
ID0gdmFsdWVbIDEgXTsKLSAgICAgICAgICAgIHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1
ZVsgMCBdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKLSAg
ICAgICAgICAgIHByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9w
c1sgaW5kZXggXTsKLSAgICAgICAgfQotCi0gICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tz
WyBuYW1lIF07Ci0gICAgICAgIGlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7Ci0g
ICAgICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKLSAgICAgICAgICAgIGRl
bGV0ZSBwcm9wc1sgbmFtZSBdOwotCi0gICAgICAgICAgICAvLyBub3QgcXVpdGUgJC5leHRlbmQs
IHRoaXMgd29udCBvdmVyd3JpdGUga2V5cyBhbHJlYWR5IHByZXNlbnQuCi0gICAgICAgICAgICAv
LyBhbHNvIC0gcmV1c2luZyAnaW5kZXgnIGZyb20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBj
b3JyZWN0ICJuYW1lIgotICAgICAgICAgICAgZm9yICggaW5kZXggaW4gdmFsdWUgKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewotICAgICAgICAgICAgICAg
ICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdOwotICAgICAgICAgICAgICAgICAg
ICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdb
IG5hbWUgXSA9IGVhc2luZzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotZnVuY3Rpb24gQW5pbWF0
aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkgewotICAgIHZhciByZXN1bHQsCi0gICAg
ICAgIHN0b3BwZWQsCi0gICAgICAgIGluZGV4ID0gMCwKLSAgICAgICAgbGVuZ3RoID0gYW5pbWF0
aW9uUHJlZmlsdGVycy5sZW5ndGgsCi0gICAgICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVk
KCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIC8vIGRvbid0IG1hdGNoIGVsZW0g
aW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgotICAgICAgICAgICAgZGVsZXRlIHRpY2suZWxlbTsK
LSAgICAgICAgfSksCi0gICAgICAgIHRpY2sgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlm
ICggc3RvcHBlZCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygp
LAotICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3Rh
cnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSwKLSAgICAgICAgICAg
ICAgICAvLyBhcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgMSAtICggMC41
IHx8IDAgKSAoIzEyNDk3KQotICAgICAgICAgICAgICAgIHRlbXAgPSByZW1haW5pbmcgLyBhbmlt
YXRpb24uZHVyYXRpb24gfHwgMCwKLSAgICAgICAgICAgICAgICBwZXJjZW50ID0gMSAtIHRlbXAs
Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAwLAotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFu
aW1hdGlvbi50d2VlbnMubGVuZ3RoOwotCi0gICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVu
Z3RoIDsgaW5kZXgrKyApIHsKLSAgICAgICAgICAgICAgICBhbmltYXRpb24udHdlZW5zWyBpbmRl
eCBdLnJ1biggcGVyY2VudCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZlcnJl
ZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pOwot
Ci0gICAgICAgICAgICBpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gcmVtYWluaW5nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApOwotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAg
ICAgYW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7Ci0gICAgICAgICAgICBlbGVtOiBlbGVt
LAotICAgICAgICAgICAgcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCi0g
ICAgICAgICAgICBvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9
IH0sIG9wdGlvbnMgKSwKLSAgICAgICAgICAgIG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGll
cywKLSAgICAgICAgICAgIG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucywKLSAgICAgICAgICAgIHN0
YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKLSAgICAgICAgICAgIGR1cmF0aW9uOiBv
cHRpb25zLmR1cmF0aW9uLAotICAgICAgICAgICAgdHdlZW5zOiBbXSwKLSAgICAgICAgICAgIGNy
ZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewotICAgICAgICAgICAgICAgIHZhciB0
d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3Ag
XSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTsKLSAgICAgICAgICAgICAgICBhbmltYXRpb24u
dHdlZW5zLnB1c2goIHR3ZWVuICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAg
ICAgICAgICAgfSwKLSAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewotICAg
ICAgICAgICAgICAgIHZhciBpbmRleCA9IDAsCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdl
IGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucwotICAg
ICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnQKLSAgICAgICAg
ICAgICAgICAgICAgbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDog
MDsKLSAgICAgICAgICAgICAgICBpZiAoIHN0b3BwZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAg
IHJldHVybiB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wcGVk
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgr
KyApIHsKLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4o
IDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZXNvbHZlIHdo
ZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lCi0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNl
LCByZWplY3QKLSAgICAgICAgICAgICAgICBpZiAoIGdvdG9FbmQgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBd
ICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJy
ZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfSksCi0gICAgICAgIHByb3BzID0gYW5pbWF0aW9uLnByb3BzOwotCi0gICAgcHJvcEZp
bHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTsKLQotICAgIGZvciAo
IDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgewotICAgICAgICByZXN1bHQgPSBhbmltYXRp
b25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1h
dGlvbi5vcHRzICk7Ci0gICAgICAgIGlmICggcmVzdWx0ICkgewotICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGpRdWVyeS5tYXAoIHByb3BzLCBjcmVh
dGVUd2VlbiwgYW5pbWF0aW9uICk7Ci0KLSAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmlt
YXRpb24ub3B0cy5zdGFydCApICkgewotICAgICAgICBhbmltYXRpb24ub3B0cy5zdGFydC5jYWxs
KCBlbGVtLCBhbmltYXRpb24gKTsKLSAgICB9Ci0KLSAgICBqUXVlcnkuZngudGltZXIoCi0gICAg
ICAgIGpRdWVyeS5leHRlbmQoIHRpY2ssIHsKLSAgICAgICAgICAgIGVsZW06IGVsZW0sCi0gICAg
ICAgICAgICBhbmltOiBhbmltYXRpb24sCi0gICAgICAgICAgICBxdWV1ZTogYW5pbWF0aW9uLm9w
dHMucXVldWUKLSAgICAgICAgfSkKLSAgICApOwotCi0gICAgLy8gYXR0YWNoIGNhbGxiYWNrcyBm
cm9tIG9wdGlvbnMKLSAgICByZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0
cy5wcm9ncmVzcyApCi0gICAgICAgIC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRp
b24ub3B0cy5jb21wbGV0ZSApCi0gICAgICAgIC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkK
LSAgICAgICAgLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Ci19Ci0KLWpRdWVyeS5B
bmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHsKLQotICAgIHR3ZWVuZXI6IGZ1
bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rp
b24oIHByb3BzICkgKSB7Ci0gICAgICAgICAgICBjYWxsYmFjayA9IHByb3BzOwotICAgICAgICAg
ICAgcHJvcHMgPSBbICIqIiBdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcHMg
PSBwcm9wcy5zcGxpdCgiICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHByb3AsCi0gICAg
ICAgICAgICBpbmRleCA9IDAsCi0gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7Ci0K
LSAgICAgICAgZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7Ci0gICAgICAgICAg
ICBwcm9wID0gcHJvcHNbIGluZGV4IF07Ci0gICAgICAgICAgICB0d2VlbmVyc1sgcHJvcCBdID0g
dHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKLSAgICAgICAgICAgIHR3ZWVuZXJzWyBwcm9wIF0udW5z
aGlmdCggY2FsbGJhY2sgKTsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICBwcmVmaWx0ZXI6IGZ1
bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHsKLSAgICAgICAgaWYgKCBwcmVwZW5kICkgewot
ICAgICAgICAgICAgYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgYW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxs
YmFjayApOwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9u
KCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKLSAgICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNw
ZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewotICAgICAg
ICBjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAotICAgICAgICAgICAgalF1ZXJ5Lmlz
RnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCi0gICAgICAgIGR1cmF0aW9uOiBzcGVlZCwKLSAg
ICAgICAgZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlv
biggZWFzaW5nICkgJiYgZWFzaW5nCi0gICAgfTsKLQotICAgIG9wdC5kdXJhdGlvbiA9IGpRdWVy
eS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVy
YXRpb24gOgotICAgICAgICBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVy
eS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsK
LQotICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJm
eCIKLSAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsK
LSAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsKLSAgICB9Ci0KLSAgICAvLyBRdWV1ZWluZwotICAg
IG9wdC5vbGQgPSBvcHQuY29tcGxldGU7Ci0KLSAgICBvcHQuY29tcGxldGUgPSBmdW5jdGlvbigp
IHsKLSAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewotICAgICAg
ICAgICAgb3B0Lm9sZC5jYWxsKCB0aGlzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9w
dC5xdWV1ZSApIHsKLSAgICAgICAgICAgIGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUg
KTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICByZXR1cm4gb3B0OwotfTsKLQotalF1ZXJ5LmZu
LmV4dGVuZCh7Ci0gICAgZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxi
YWNrICkgewotCi0gICAgICAgIC8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0
aW5nIG9wYWNpdHkgdG8gMAotICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICku
Y3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkKLQotICAgICAgICAgICAgLy8gYW5pbWF0ZSB0byB0
aGUgdmFsdWUgc3BlY2lmaWVkCi0gICAgICAgICAgICAuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6
IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Ci0gICAgfSwKLSAgICBhbmltYXRlOiBm
dW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHZhciBl
bXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksCi0gICAgICAgICAgICBvcHRhbGwg
PSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksCi0gICAgICAgICAgICBk
b0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIC8vIE9wZXJhdGUgb24g
YSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0Ci0gICAg
ICAgICAgICAgICAgdmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9
LCBwcm9wICksIG9wdGFsbCApOwotCi0gICAgICAgICAgICAgICAgLy8gRW1wdHkgYW5pbWF0aW9u
cywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgaWYg
KCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiZmluaXNoIiApICkgewotICAgICAgICAg
ICAgICAgICAgICBhbmltLnN0b3AoIHRydWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9OwotICAgICAgICAgICAgZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247Ci0K
LSAgICAgICAgcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPwotICAgICAg
ICAgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKLSAgICAgICAgICAgIHRoaXMucXVldWUo
IG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTsKLSAgICB9LAotICAgIHN0b3A6IGZ1bmN0aW9u
KCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewotICAgICAgICB2YXIgc3RvcFF1ZXVlID0g
ZnVuY3Rpb24oIGhvb2tzICkgewotICAgICAgICAgICAgdmFyIHN0b3AgPSBob29rcy5zdG9wOwot
ICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Ci0gICAgICAgICAgICBzdG9wKCBnb3RvRW5k
ICk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIg
KSB7Ci0gICAgICAgICAgICBnb3RvRW5kID0gY2xlYXJRdWV1ZTsKLSAgICAgICAgICAgIGNsZWFy
UXVldWUgPSB0eXBlOwotICAgICAgICAgICAgdHlwZSA9IHVuZGVmaW5lZDsKLSAgICAgICAgfQot
ICAgICAgICBpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgICAgICAg
ICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Ci0gICAgICAgIH0KLQotICAgICAgICBy
ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgdmFyIGRlcXVldWUgPSB0
cnVlLAotICAgICAgICAgICAgICAgIGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVl
dWVIb29rcyIsCi0gICAgICAgICAgICAgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAgICAg
ICAgICAgICAgICBkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApOwotCi0gICAgICAgICAgICBp
ZiAoIGluZGV4ICkgewotICAgICAgICAgICAgICAgIGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRh
WyBpbmRleCBdLnN0b3AgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BRdWV1ZSggZGF0YVsg
aW5kZXggXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgZm9yICggaW5kZXggaW4gZGF0YSApIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGlu
ZGV4ICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4
IF0gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgZm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0t
OyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlz
ICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsK
LSAgICAgICAgICAgICAgICAgICAgdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCAp
OwotICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
ICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYg
dGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCi0gICAgICAgICAgICAvLyB0aW1lcnMgY3VycmVu
dGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1
ZQotICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQKLSAgICAgICAg
ICAgIGlmICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnku
ZGVxdWV1ZSggdGhpcywgdHlwZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9
LAotICAgIGZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7Ci0gICAgICAgIGlmICggdHlwZSAhPT0g
ZmFsc2UgKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZSB8fCAiZngiOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgaW5k
ZXgsCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSwKLSAgICAg
ICAgICAgICAgICBxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUiIF0sCi0gICAgICAgICAgICAg
ICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1ZXVlSG9va3MiIF0sCi0gICAgICAgICAgICAgICAg
dGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBxdWV1ZSA/
IHF1ZXVlLmxlbmd0aCA6IDA7Ci0KLSAgICAgICAgICAgIC8vIGVuYWJsZSBmaW5pc2hpbmcgZmxh
ZyBvbiBwcml2YXRlIGRhdGEKLSAgICAgICAgICAgIGRhdGEuZmluaXNoID0gdHJ1ZTsKLQotICAg
ICAgICAgICAgLy8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0Ci0gICAgICAgICAgICBqUXVlcnkucXVl
dWUoIHRoaXMsIHR5cGUsIFtdICk7Ci0KLSAgICAgICAgICAgIGlmICggaG9va3MgJiYgaG9va3Mu
c3RvcCApIHsKLSAgICAgICAgICAgICAgICBob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgYW55IGFjdGl2ZSBhbmlt
YXRpb25zLCBhbmQgZmluaXNoIHRoZW0KLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gdGltZXJz
Lmxlbmd0aDsgaW5kZXgtLTsgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCB0aW1lcnNbIGluZGV4
IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTsKLSAg
ICAgICAgICAgICAgICAgICAgdGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIGFueSBhbmlt
YXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCi0gICAgICAgICAgICBmb3Ig
KCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewotICAgICAgICAgICAgICAg
IGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkgewotICAgICAg
ICAgICAgICAgICAgICBxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdHVybiBvZmYgZmlu
aXNoaW5nIGZsYWcKLSAgICAgICAgICAgIGRlbGV0ZSBkYXRhLmZpbmlzaDsKLSAgICAgICAgfSk7
Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0s
IGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAgIHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBd
OwotICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxi
YWNrICkgewotICAgICAgICByZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09
ICJib29sZWFuIiA/Ci0gICAgICAgICAgICBjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkg
OgotICAgICAgICAgICAgdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwg
ZWFzaW5nLCBjYWxsYmFjayApOwotICAgIH07Ci19KTsKLQotLy8gR2VuZXJhdGUgc2hvcnRjdXRz
IGZvciBjdXN0b20gYW5pbWF0aW9ucwotalF1ZXJ5LmVhY2goewotICAgIHNsaWRlRG93bjogZ2Vu
RngoInNob3ciKSwKLSAgICBzbGlkZVVwOiBnZW5GeCgiaGlkZSIpLAotICAgIHNsaWRlVG9nZ2xl
OiBnZW5GeCgidG9nZ2xlIiksCi0gICAgZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAotICAg
IGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sCi0gICAgZmFkZVRvZ2dsZTogeyBvcGFjaXR5
OiAidG9nZ2xlIiB9Ci19LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7Ci0gICAgalF1ZXJ5LmZu
WyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Ci0gICAgICAg
IHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwot
ICAgIH07Ci19KTsKLQotalF1ZXJ5LnRpbWVycyA9IFtdOwotalF1ZXJ5LmZ4LnRpY2sgPSBmdW5j
dGlvbigpIHsKLSAgICB2YXIgdGltZXIsCi0gICAgICAgIGkgPSAwLAotICAgICAgICB0aW1lcnMg
PSBqUXVlcnkudGltZXJzOwotCi0gICAgZnhOb3cgPSBqUXVlcnkubm93KCk7Ci0KLSAgICBmb3Ig
KCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgIHRpbWVyID0gdGltZXJzWyBp
IF07Ci0gICAgICAgIC8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVt
b3ZlZAotICAgICAgICBpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHsK
LSAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGktLSwgMSApOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKLSAgICAgICAgalF1ZXJ5LmZ4LnN0b3AoKTsK
LSAgICB9Ci0gICAgZnhOb3cgPSB1bmRlZmluZWQ7Ci19OwotCi1qUXVlcnkuZngudGltZXIgPSBm
dW5jdGlvbiggdGltZXIgKSB7Ci0gICAgalF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApOwotICAg
IGlmICggdGltZXIoKSApIHsKLSAgICAgICAgalF1ZXJ5LmZ4LnN0YXJ0KCk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgalF1ZXJ5LnRpbWVycy5wb3AoKTsKLSAgICB9Ci19OwotCi1qUXVlcnkuZngu
aW50ZXJ2YWwgPSAxMzsKLQotalF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYg
KCAhdGltZXJJZCApIHsKLSAgICAgICAgdGltZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngu
dGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7Ci0gICAgfQotfTsKLQotalF1ZXJ5LmZ4LnN0b3Ag
PSBmdW5jdGlvbigpIHsKLSAgICBjbGVhckludGVydmFsKCB0aW1lcklkICk7Ci0gICAgdGltZXJJ
ZCA9IG51bGw7Ci19OwotCi1qUXVlcnkuZnguc3BlZWRzID0gewotICAgIHNsb3c6IDYwMCwKLSAg
ICBmYXN0OiAyMDAsCi0gICAgLy8gRGVmYXVsdCBzcGVlZAotICAgIF9kZWZhdWx0OiA0MDAKLX07
Ci0KLQotLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBw
ZXJtaXNzaW9uLgotLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcv
anF1ZXJ5LWRlbGF5LwotalF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7
Ci0gICAgdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1l
IDogdGltZTsKLSAgICB0eXBlID0gdHlwZSB8fCAiZngiOwotCi0gICAgcmV0dXJuIHRoaXMucXVl
dWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKLSAgICAgICAgdmFyIHRpbWVvdXQg
PSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7Ci0gICAgICAgIGhvb2tzLnN0b3AgPSBmdW5jdGlv
bigpIHsKLSAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGltZW91dCApOwotICAgICAgICB9Owot
ICAgIH0pOwotfTsKLQotCi0oZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCggImlucHV0IiApLAotICAgICAgICBzZWxlY3QgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCAic2VsZWN0IiApLAotICAgICAgICBvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQo
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJvcHRpb24iICkgKTsKLQotICAgIGlucHV0LnR5cGUg
PSAiY2hlY2tib3giOwotCi0gICAgLy8gU3VwcG9ydDogaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFu
ZHJvaWQgMi4zCi0gICAgLy8gQ2hlY2sgdGhlIGRlZmF1bHQgY2hlY2tib3gvcmFkaW8gdmFsdWUg
KCIiIG9uIG9sZCBXZWJLaXQ7ICJvbiIgZWxzZXdoZXJlKQotICAgIHN1cHBvcnQuY2hlY2tPbiA9
IGlucHV0LnZhbHVlICE9PSAiIjsKLQotICAgIC8vIE11c3QgYWNjZXNzIHRoZSBwYXJlbnQgdG8g
bWFrZSBhbiBvcHRpb24gc2VsZWN0IHByb3Blcmx5Ci0gICAgLy8gU3VwcG9ydDogSUU5LCBJRTEw
Ci0gICAgc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKLQotICAgIC8vIE1ha2Ug
c3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJr
ZWQgYXMgZGlzYWJsZWQKLSAgICAvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCi0g
ICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKLSAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9w
dC5kaXNhYmxlZDsKLQotICAgIC8vIENoZWNrIGlmIGFuIGlucHV0IG1haW50YWlucyBpdHMgdmFs
dWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpbwotICAgIC8vIFN1cHBvcnQ6IElFOSwgSUUxMAotICAg
IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwotICAgIGlucHV0LnZh
bHVlID0gInQiOwotICAgIGlucHV0LnR5cGUgPSAicmFkaW8iOwotICAgIHN1cHBvcnQucmFkaW9W
YWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7Ci19KSgpOwotCi0KLXZhciBub2RlSG9vaywgYm9v
bEhvb2ssCi0gICAgYXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7Ci0KLWpRdWVy
eS5mbi5leHRlbmQoewotICAgIGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICAg
ICAgcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVu
dHMubGVuZ3RoID4gMSApOwotICAgIH0sCi0KLSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFt
ZSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAg
IGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0p
OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICBhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFs
dWUgKSB7Ci0gICAgICAgIHZhciBob29rcywgcmV0LAotICAgICAgICAgICAgblR5cGUgPSBlbGVt
Lm5vZGVUeXBlOwotCi0gICAgICAgIC8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0
LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKLSAgICAgICAgaWYgKCAhZWxlbSB8fCBuVHlw
ZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRy
aWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0
cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnBy
b3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgYXR0
cmlidXRlcyBhcmUgbG93ZXJjYXNlCi0gICAgICAgIC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYg
b25lIGlzIGRlZmluZWQKLSAgICAgICAgaWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1M
RG9jKCBlbGVtICkgKSB7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwot
ICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwKLSAgICAgICAg
ICAgICAgICAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sg
OiBub2RlSG9vayApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZp
bmVkICkgewotCi0gICAgICAgICAgICBpZiAoIHZhbHVlID09PSBudWxsICkgewotICAgICAgICAg
ICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7Ci0KLSAgICAgICAgICAgIH0g
ZWxzZSBpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVs
ZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHJldDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbGVtLnNl
dEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwotICAgICAgICAgICAgICAgIHJldHVybiB2
YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0
IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkg
ewotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgcmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApOwotCi0gICAgICAgICAgICAv
LyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVu
ZGVmaW5lZAotICAgICAgICAgICAgcmV0dXJuIHJldCA9PSBudWxsID8KLSAgICAgICAgICAgICAg
ICB1bmRlZmluZWQgOgotICAgICAgICAgICAgICAgIHJldDsKLSAgICAgICAgfQotICAgIH0sCi0K
LSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBu
YW1lLCBwcm9wTmFtZSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgYXR0ck5hbWVz
ID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApOwotCi0gICAgICAgIGlmICggYXR0
ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIChu
YW1lID0gYXR0ck5hbWVzW2krK10pICkgewotICAgICAgICAgICAgICAgIHByb3BOYW1lID0galF1
ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gQm9vbGVh
biBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKQotICAgICAgICAgICAg
ICAgIGlmICggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlCi0gICAg
ICAgICAgICAgICAgICAgIGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGF0dHJIb29rczogewotICAgICAg
ICB0eXBlOiB7Ci0gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAg
ICAgICAgICAgICAgICBpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRp
byIgJiYKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQi
ICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRp
byBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKLSAgICAg
ICAgICAgICAgICAgICAgLy8gUmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMg
c2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICB2YXIg
dmFsID0gZWxlbS52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUo
ICJ0eXBlIiwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWwgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gdmFsOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19KTsKLQotLy8gSG9va3MgZm9yIGJv
b2xlYW4gYXR0cmlidXRlcwotYm9vbEhvb2sgPSB7Ci0gICAgc2V0OiBmdW5jdGlvbiggZWxlbSwg
dmFsdWUsIG5hbWUgKSB7Ci0gICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAg
ICAgICAgLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQotICAg
ICAgICAgICAgalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotfTsKLWpRdWVyeS5lYWNoKCBqUXVlcnku
ZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1x3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1l
ICkgewotICAgIHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQu
YXR0cjsKLQotICAgIGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBp
c1hNTCApIHsKLSAgICAgICAgdmFyIHJldCwgaGFuZGxlOwotICAgICAgICBpZiAoICFpc1hNTCAp
IHsKLSAgICAgICAgICAgIC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkg
cmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXIKLSAgICAgICAgICAgIGhhbmRs
ZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTsKLSAgICAgICAgICAgIGF0dHJIYW5kbGVbIG5hbWUgXSA9
IHJldDsKLSAgICAgICAgICAgIHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBu
dWxsID8KLSAgICAgICAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkgOgotICAgICAgICAgICAg
ICAgIG51bGw7Ci0gICAgICAgICAgICBhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9OwotfSk7Ci0KLQotCi0KLXZhciByZm9j
dXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTsKLQotalF1ZXJ5
LmZuLmV4dGVuZCh7Ci0gICAgcHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewotICAgICAg
ICByZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50
cy5sZW5ndGggPiAxICk7Ci0gICAgfSwKLQotICAgIHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1l
ICkgewotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAg
ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwotICAgICAgICB9
KTsKLSAgICB9Ci19KTsKLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgcHJvcEZpeDogewotICAgICAg
ICAiZm9yIjogImh0bWxGb3IiLAotICAgICAgICAiY2xhc3MiOiAiY2xhc3NOYW1lIgotICAgIH0s
Ci0KLSAgICBwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7Ci0gICAgICAgIHZh
ciByZXQsIGhvb2tzLCBub3R4bWwsCi0gICAgICAgICAgICBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7
Ci0KLSAgICAgICAgLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQg
YW5kIGF0dHJpYnV0ZSBub2RlcwotICAgICAgICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8
IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0KLSAgICAgICAgbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERv
YyggZWxlbSApOwotCi0gICAgICAgIGlmICggbm90eG1sICkgewotICAgICAgICAgICAgLy8gRml4
IG5hbWUgYW5kIGF0dGFjaCBob29rcwotICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4
WyBuYW1lIF0gfHwgbmFtZTsKLSAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sg
bmFtZSBdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkg
ewotICAgICAgICAgICAgcmV0dXJuIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBo
b29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgPwotICAgICAgICAg
ICAgICAgIHJldCA6Ci0gICAgICAgICAgICAgICAgKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApOwot
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaG9va3MgJiYgImdldCIgaW4g
aG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/Ci0gICAg
ICAgICAgICAgICAgcmV0IDoKLSAgICAgICAgICAgICAgICBlbGVtWyBuYW1lIF07Ci0gICAgICAg
IH0KLSAgICB9LAotCi0gICAgcHJvcEhvb2tzOiB7Ci0gICAgICAgIHRhYkluZGV4OiB7Ci0gICAg
ICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHJldHVybiBl
bGVtLmhhc0F0dHJpYnV0ZSggInRhYmluZGV4IiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5u
b2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0udGFiSW5k
ZXggOgotICAgICAgICAgICAgICAgICAgICAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLX0pOwotCi0vLyBTdXBwb3J0OiBJRTkrCi0vLyBTZWxlY3RlZG5lc3MgZm9yIGFuIG9w
dGlvbiBpbiBhbiBvcHRncm91cCBjYW4gYmUgaW5hY2N1cmF0ZQotaWYgKCAhc3VwcG9ydC5vcHRT
ZWxlY3RlZCApIHsKLSAgICBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0gewotICAgICAgICBn
ZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFy
ZW50Tm9kZTsKLSAgICAgICAgICAgIGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkg
ewotICAgICAgICAgICAgICAgIHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH07Ci19
Ci0KLWpRdWVyeS5lYWNoKFsKLSAgICAidGFiSW5kZXgiLAotICAgICJyZWFkT25seSIsCi0gICAg
Im1heExlbmd0aCIsCi0gICAgImNlbGxTcGFjaW5nIiwKLSAgICAiY2VsbFBhZGRpbmciLAotICAg
ICJyb3dTcGFuIiwKLSAgICAiY29sU3BhbiIsCi0gICAgInVzZU1hcCIsCi0gICAgImZyYW1lQm9y
ZGVyIiwKLSAgICAiY29udGVudEVkaXRhYmxlIgotXSwgZnVuY3Rpb24oKSB7Ci0gICAgalF1ZXJ5
LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpczsKLX0pOwotCi0KLQotCi12YXIg
cmNsYXNzID0gL1tcdFxyXG5cZl0vZzsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgYWRkQ2xh
c3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAgICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwg
Y2xhenosIGosIGZpbmFsVmFsdWUsCi0gICAgICAgICAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVl
ID09PSAic3RyaW5nIiAmJiB2YWx1ZSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAg
bGVuID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFs
dWUgKSApIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7Ci0g
ICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMs
IGosIHRoaXMuY2xhc3NOYW1lICkgKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCBwcm9jZWVkICkgewotICAgICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aW9uIGhl
cmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSByZW1vdmVDbGFzcykKLSAgICAg
ICAgICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtd
OwotCi0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgICAgICAg
ICBlbGVtID0gdGhpc1sgaSBdOwotICAgICAgICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUg
PT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICggIiAiICsg
ZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAgICAg
ICAgICAgICAgICAgIiAiCi0gICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlm
ICggY3VyICkgewotICAgICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAg
ICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VyICs9IGNsYXp6ICsgIiAiOwotICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAg
ICAgLy8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmlu
Zy4KLSAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0sCi0KLSAgICByZW1vdmVD
bGFzczogZnVuY3Rpb24oIHZhbHVlICkgewotICAgICAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3Vy
LCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwKLSAgICAgICAgICAgIHByb2NlZWQgPSBhcmd1bWVudHMu
bGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWUsCi0gICAg
ICAgICAgICBpID0gMCwKLSAgICAgICAgICAgIGxlbiA9IHRoaXMubGVuZ3RoOwotCi0gICAgICAg
IGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4g
dGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyAp
LnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7Ci0g
ICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHByb2NlZWQgKSB7Ci0gICAg
ICAgICAgICBjbGFzc2VzID0gKCB2YWx1ZSB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBb
XTsKLQotICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgZWxlbSA9IHRoaXNbIGkgXTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24g
aXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKQotICAgICAg
ICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/
Ci0gICAgICAgICAgICAgICAgICAgICggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBs
YWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAgICAgICAgICAgICAgICAgIiIKLSAgICAgICAgICAg
ICAgICApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjdXIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGogPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNb
aisrXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgKmFsbCogaW5zdGFu
Y2VzCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBj
bGF6eiArICIgIiApID49IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0g
Y3VyLnJlcGxhY2UoICIgIiArIGNsYXp6ICsgIiAiLCAiICIgKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8v
IG9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCi0g
ICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIg
KSA6ICIiOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0uY2xhc3NOYW1lICE9PSBmaW5h
bFZhbHVlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5jbGFzc05hbWUgPSBmaW5h
bFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAg
IHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkgewotICAgICAgICB2YXIg
dHlwZSA9IHR5cGVvZiB2YWx1ZTsKLQotICAgICAgICBpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0g
ImJvb2xlYW4iICYmIHR5cGUgPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgcmV0dXJuIHN0
YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFsdWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVl
ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSAp
ICkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKLSAgICAg
ICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBp
LCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwotICAgICAgICAgICAgfSk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAg
ICAgICAgICAgaWYgKCB0eXBlID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgICAgICAvLyB0
b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcwotICAgICAgICAgICAgICAgIHZhciBjbGFzc05h
bWUsCi0gICAgICAgICAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgICAgICAgICBzZWxm
ID0galF1ZXJ5KCB0aGlzICksCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMgPSB2YWx1
ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIChj
bGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAotICAgICAg
ICAgICAgICAgICAgICBpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7Ci0gICAgICAg
ICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZENs
YXNzKCBjbGFzc05hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKLSAgICAgICAgICAg
IH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIg
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAotICAgICAgICAgICAgICAgICAgICBk
YXRhX3ByaXYuc2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFz
IGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgImZhbHNlIiwKLSAgICAgICAgICAgICAg
ICAvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0
aGUgYWJvdmUgc2F2ZWQgaXQpLgotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBicmluZyBi
YWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksCi0gICAgICAg
ICAgICAgICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3
YXMgc3RvcmVkLgotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05h
bWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiX19jbGFz
c05hbWVfXyIgKSB8fCAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSwKLQot
ICAgIGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBjbGFzc05h
bWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAg
ICAgbCA9IHRoaXMubGVuZ3RoOwotICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAg
ICAgICAgICBpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKCIgIiArIHRoaXNbaV0uY2xh
c3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFzcywgIiAiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+
PSAwICkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0pOwotCi0KLQotCi12YXIg
cnJldHVybiA9IC9cci9nOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICB2YWw6IGZ1bmN0aW9u
KCB2YWx1ZSApIHsKLSAgICAgICAgdmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sCi0gICAgICAg
ICAgICBlbGVtID0gdGhpc1swXTsKLQotICAgICAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkg
ewotICAgICAgICAgICAgaWYgKCBlbGVtICkgewotICAgICAgICAgICAgICAgIGhvb2tzID0galF1
ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5h
bWUudG9Mb3dlckNhc2UoKSBdOwotCi0gICAgICAgICAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0
IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRl
ZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgcmV0ID0gZWxlbS52YWx1ZTsKLQotICAgICAgICAgICAg
ICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/Ci0gICAgICAgICAgICAgICAgICAg
IC8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKLSAgICAgICAgICAgICAgICAgICAg
cmV0LnJlcGxhY2UocnJldHVybiwgIiIpIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxl
IGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCi0gICAgICAgICAgICAg
ICAgICAgIHJldCA9PSBudWxsID8gIiIgOiByZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNG
dW5jdGlvbiggdmFsdWUgKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBp
ICkgewotICAgICAgICAgICAgdmFyIHZhbDsKLQotICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVU
eXBlICE9PSAxICkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgewotICAgICAgICAgICAgICAgIHZhbCA9IHZh
bHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICAvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJz
IHRvIHN0cmluZwotICAgICAgICAgICAgaWYgKCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAg
ICAgICB2YWwgPSAiIjsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0g
Im51bWJlciIgKSB7Ci0gICAgICAgICAgICAgICAgdmFsICs9ICIiOwotCi0gICAgICAgICAgICB9
IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFs
ID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwotICAgICAgICAgICAg
ICAgIH0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBob29rcyA9IGpRdWVyeS52YWxI
b29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93
ZXJDYXNlKCkgXTsKLQotICAgICAgICAgICAgLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBm
YWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKLSAgICAgICAgICAgIGlmICggIWhvb2tzIHx8ICEo
InNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVu
ZGVmaW5lZCApIHsKLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsOwotICAgICAgICAg
ICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19KTsKLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgdmFs
SG9va3M6IHsKLSAgICAgICAgc2VsZWN0OiB7Ci0gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBl
bGVtICkgewotICAgICAgICAgICAgICAgIHZhciB2YWx1ZSwgb3B0aW9uLAotICAgICAgICAgICAg
ICAgICAgICBvcHRpb25zID0gZWxlbS5vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmRl
eCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgb25lID0gZWxlbS50
eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5kZXggPCAwLAotICAgICAgICAgICAgICAgICAgICB2
YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCi0gICAgICAgICAgICAgICAgICAgIG1heCA9IG9uZSA/
IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBpID0gaW5k
ZXggPCAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heCA6Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBvbmUgPyBpbmRleCA6IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91
Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCi0gICAgICAgICAgICAgICAgZm9yICggOyBpIDwg
bWF4OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsK
LQotICAgICAgICAgICAgICAgICAgICAvLyBJRTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBh
ZnRlciBmb3JtIHJlc2V0ICgjMjU1MSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoIG9wdGlv
bi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNh
YmxlZCBvcHRncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc3VwcG9ydC5vcHRE
aXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCAiZGlzYWJs
ZWQiICkgPT09IG51bGwgKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIW9wdGlv
bi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnRO
b2RlLCAib3B0Z3JvdXAiICkgKSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0
IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAg
ICAgdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwotCi0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCBvbmUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAg
ICAgICAgICAgICAvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQotICAgICAgICAgICAg
ICAgICAgICAgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAg
ICAgICAgICAgfSwKLQotICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7
Ci0gICAgICAgICAgICAgICAgdmFyIG9wdGlvblNldCwgb3B0aW9uLAotICAgICAgICAgICAgICAg
ICAgICBvcHRpb25zID0gZWxlbS5vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMg
PSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAotICAgICAgICAgICAgICAgICAgICBpID0gb3B0
aW9ucy5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoIChvcHRpb24uc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KG9wdGlvbikudmFs
KCksIHZhbHVlcyApID49IDApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uU2V0
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgIC8vIGZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hl
biBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0Ci0gICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9u
U2V0ICkgewotICAgICAgICAgICAgICAgICAgICBlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0pOwotCi0vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMg
Z2V0dGVyL3NldHRlcgotalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0
aW9uKCkgewotICAgIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0gewotICAgICAgICBzZXQ6IGZ1
bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXko
IHZhbHVlICkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1
ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHsK
LSAgICAgICAgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7
Ci0gICAgICAgICAgICAvLyBTdXBwb3J0OiBXZWJraXQKLSAgICAgICAgICAgIC8vICIiIGlzIHJl
dHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAotICAgICAg
ICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6
IGVsZW0udmFsdWU7Ci0gICAgICAgIH07Ci0gICAgfQotfSk7Ci0KLQotCi0KLS8vIFJldHVybiBq
UXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KLQotCi1qUXVlcnkuZWFjaCggKCJi
bHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGlj
ayBkYmxjbGljayAiICsKLSAgICAibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3Zl
ciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCi0gICAgImNoYW5nZSBzZWxlY3Qg
c3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiKS5zcGxpdCgi
ICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKLQotICAgIC8vIEhhbmRsZSBldmVudCBiaW5kaW5n
Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7Ci0gICAgICAg
IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/Ci0gICAgICAgICAgICB0aGlzLm9uKCBuYW1l
LCBudWxsLCBkYXRhLCBmbiApIDoKLSAgICAgICAgICAgIHRoaXMudHJpZ2dlciggbmFtZSApOwot
ICAgIH07Ci19KTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgaG92ZXI6IGZ1bmN0aW9uKCBm
bk92ZXIsIGZuT3V0ICkgewotICAgICAgICByZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIg
KS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKLSAgICB9LAotCi0gICAgYmluZDogZnVu
Y3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub24oIHR5cGVz
LCBudWxsLCBkYXRhLCBmbiApOwotICAgIH0sCi0gICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMs
IGZuICkgewotICAgICAgICByZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOwotICAg
IH0sCi0KLSAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4g
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7
Ci0gICAgfSwKLSAgICB1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiAp
IHsKLSAgICAgICAgLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0g
KQotICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxl
Y3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCAiKioiLCBmbiApOwot
ICAgIH0KLX0pOwotCi0KLXZhciBub25jZSA9IGpRdWVyeS5ub3coKTsKLQotdmFyIHJxdWVyeSA9
ICgvXD8vKTsKLQotCi0KLS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCi0vLyBXb3JrYXJvdW5kIGZh
aWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dAotalF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0
aW9uKCBkYXRhICkgewotICAgIHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgIiIgKTsKLX07Ci0K
LQotLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwotalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rp
b24oIGRhdGEgKSB7Ci0gICAgdmFyIHhtbCwgdG1wOwotICAgIGlmICggIWRhdGEgfHwgdHlwZW9m
IGRhdGEgIT09ICJzdHJpbmciICkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAg
ICAvLyBTdXBwb3J0OiBJRTkKLSAgICB0cnkgewotICAgICAgICB0bXAgPSBuZXcgRE9NUGFyc2Vy
KCk7Ci0gICAgICAgIHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsICJ0ZXh0L3htbCIg
KTsKLSAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgeG1sID0gdW5kZWZpbmVkOwotICAgIH0K
LQotICAgIGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJv
ciIgKS5sZW5ndGggKSB7Ci0gICAgICAgIGpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsg
ZGF0YSApOwotICAgIH0KLSAgICByZXR1cm4geG1sOwotfTsKLQotCi12YXIKLSAgICAvLyBEb2N1
bWVudCBsb2NhdGlvbgotICAgIGFqYXhMb2NQYXJ0cywKLSAgICBhamF4TG9jYXRpb24sCi0KLSAg
ICByaGFzaCA9IC8jLiokLywKLSAgICBydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCi0gICAgcmhlYWRl
cnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL21nLAotICAgIC8vICM3NjUzLCAjODEyNSwg
IzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgotICAgIHJsb2NhbFByb3RvY29sID0gL14o
PzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8s
Ci0gICAgcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCi0gICAgcnByb3RvY29sID0gL15c
L1wvLywKLSAgICBydXJsID0gL14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwv
PyM6XSopKD86OihcZCspfCl8KS8sCi0KLSAgICAvKiBQcmVmaWx0ZXJzCi0gICAgICogMSkgVGhl
eSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29u
cC5qcyBmb3IgYW4gZXhhbXBsZSkKLSAgICAgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgotICAgICAq
ICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnQKLSAgICAgKiAgICAtIEFGVEVSIHBh
cmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlz
IHRydWUpCi0gICAgICogMykga2V5IGlzIHRoZSBkYXRhVHlwZQotICAgICAqIDQpIHRoZSBjYXRj
aGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCi0gICAgICogNSkgZXhlY3V0aW9uIHdpbGwgc3Rh
cnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIg
aWYgbmVlZGVkCi0gICAgICovCi0gICAgcHJlZmlsdGVycyA9IHt9LAotCi0gICAgLyogVHJhbnNw
b3J0cyBiaW5kaW5ncwotICAgICAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKLSAgICAgKiAyKSB0
aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAotICAgICAqIDMpIHNlbGVjdGlvbiB3
aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBu
ZWVkZWQKLSAgICAgKi8KLSAgICB0cmFuc3BvcnRzID0ge30sCi0KLSAgICAvLyBBdm9pZCBjb21t
ZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQg
ZXZhZGUgY29tcHJlc3Npb24KLSAgICBhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCIqIik7Ci0KLS8v
ICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCi0vLyBhIGZp
ZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQK
LXRyeSB7Ci0gICAgYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsKLX0gY2F0Y2goIGUgKSB7
Ci0gICAgLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKLSAgICAvLyBz
aW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgotICAgIGFqYXhM
b2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwotICAgIGFqYXhMb2NhdGlv
bi5ocmVmID0gIiI7Ci0gICAgYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Ci19Ci0K
LS8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0cwotYWpheExvY1BhcnRzID0gcnVybC5leGVj
KCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwotCi0vLyBCYXNlICJjb25zdHJ1
Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAot
ZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7Ci0KLSAg
ICAvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgot
ICAgIHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewotCi0gICAg
ICAgIGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7Ci0gICAg
ICAgICAgICBmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwotICAgICAgICAgICAgZGF0YVR5cGVF
eHByZXNzaW9uID0gIioiOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIGRhdGFUeXBlLAotICAg
ICAgICAgICAgaSA9IDAsCi0gICAgICAgICAgICBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Np
b24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107Ci0KLSAgICAgICAgaWYg
KCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkgewotICAgICAgICAgICAgLy8gRm9yIGVhY2gg
ZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgotICAgICAgICAgICAgd2hpbGUgKCAo
ZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkgKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlcGVu
ZCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAgICAgICBpZiAoIGRhdGFUeXBlWzBdID09PSAiKyIg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8
fCAiKiI7Ci0gICAgICAgICAgICAgICAgICAgIChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1
Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVuc2hpZnQoIGZ1bmMgKTsKLQotICAgICAgICAgICAg
ICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAoc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlw
ZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfTsKLX0KLQotLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZv
ciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzCi1mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09y
VHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkg
ewotCi0gICAgdmFyIGluc3BlY3RlZCA9IHt9LAotICAgICAgICBzZWVraW5nVHJhbnNwb3J0ID0g
KCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTsKLQotICAgIGZ1bmN0aW9uIGluc3BlY3QoIGRh
dGFUeXBlICkgewotICAgICAgICB2YXIgc2VsZWN0ZWQ7Ci0gICAgICAgIGluc3BlY3RlZFsgZGF0
YVR5cGUgXSA9IHRydWU7Ci0gICAgICAgIGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBl
IF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7Ci0gICAgICAgICAg
ICB2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywg
b3JpZ2luYWxPcHRpb25zLCBqcVhIUiApOwotICAgICAgICAgICAgaWYgKCB0eXBlb2YgZGF0YVR5
cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3Bl
Y3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMu
ZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKLSAgICAgICAgICAgICAg
ICBpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAh
aW5zcGVjdGVkWyAiKiIgXSAmJiBpbnNwZWN0KCAiKiIgKTsKLX0KLQotLy8gQSBzcGVjaWFsIGV4
dGVuZCBmb3IgYWpheCBvcHRpb25zCi0vLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3Qg
dG8gYmUgZGVlcCBleHRlbmRlZCkKLS8vIEZpeGVzICM5ODg3Ci1mdW5jdGlvbiBhamF4RXh0ZW5k
KCB0YXJnZXQsIHNyYyApIHsKLSAgICB2YXIga2V5LCBkZWVwLAotICAgICAgICBmbGF0T3B0aW9u
cyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Ci0KLSAgICBmb3IgKCBr
ZXkgaW4gc3JjICkgewotICAgICAgICBpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHsK
LSAgICAgICAgICAgICggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChk
ZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwotICAgICAgICB9Ci0gICAgfQotICAg
IGlmICggZGVlcCApIHsKLSAgICAgICAgalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVw
ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLX0KLQotLyogSGFuZGxlcyByZXNwb25z
ZXMgdG8gYW4gYWpheCByZXF1ZXN0OgotICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1l
ZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKLSAqIC0g
cmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQotICovCi1mdW5jdGlvbiBhamF4SGFu
ZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkgewotCi0gICAgdmFyIGN0LCB0eXBl
LCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLAotICAgICAgICBjb250ZW50cyA9IHMuY29u
dGVudHMsCi0gICAgICAgIGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwotCi0gICAgLy8gUmVtb3Zl
IGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3MKLSAgICB3
aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7Ci0gICAgICAgIGRhdGFUeXBlcy5zaGlm
dCgpOwotICAgICAgICBpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICBjdCA9
IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEg
a25vd24gY29udGVudC10eXBlCi0gICAgaWYgKCBjdCApIHsKLSAgICAgICAgZm9yICggdHlwZSBp
biBjb250ZW50cyApIHsKLSAgICAgICAgICAgIGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250
ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7Ci0gICAgICAgICAgICAgICAgZGF0YVR5cGVzLnVu
c2hpZnQoIHR5cGUgKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9u
c2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQotICAgIGlmICggZGF0YVR5cGVzWyAwIF0gaW4g
cmVzcG9uc2VzICkgewotICAgICAgICBmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwotICAgICAg
ICBmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKLSAgICAgICAgICAgIGlmICggIWRhdGFUeXBl
c1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewot
ICAgICAgICAgICAgICAgIGZpbmFsRGF0YVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsK
LSAgICAgICAgICAgICAgICBmaXJzdERhdGFUeXBlID0gdHlwZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgICAgICAvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmUKLSAgICAgICAgZmluYWxE
YXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAv
LyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCi0gICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0
aGUgbGlzdCBpZiBuZWVkZWQKLSAgICAvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJl
c3BvbnNlCi0gICAgaWYgKCBmaW5hbERhdGFUeXBlICkgewotICAgICAgICBpZiAoIGZpbmFsRGF0
YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewotICAgICAgICAgICAgZGF0YVR5cGVzLnVuc2hp
ZnQoIGZpbmFsRGF0YVR5cGUgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2Vz
WyBmaW5hbERhdGFUeXBlIF07Ci0gICAgfQotfQotCi0vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZl
biB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlCi0gKiBBbHNvIHNldHMgdGhl
IHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2UKLSAqLwotZnVuY3Rpb24g
YWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkgewotICAgIHZhciBj
b252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LAotICAgICAgICBjb252ZXJ0ZXJzID0ge30s
Ci0gICAgICAgIC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVl
ZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KLSAgICAgICAgZGF0YVR5cGVzID0gcy5kYXRh
VHlwZXMuc2xpY2UoKTsKLQotICAgIC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2Vy
Y2FzZWQga2V5cwotICAgIGlmICggZGF0YVR5cGVzWyAxIF0gKSB7Ci0gICAgICAgIGZvciAoIGNv
bnYgaW4gcy5jb252ZXJ0ZXJzICkgewotICAgICAgICAgICAgY29udmVydGVyc1sgY29udi50b0xv
d2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKLQotICAgIC8vIENvbnZlcnQgdG8gZWFj
aCBzZXF1ZW50aWFsIGRhdGFUeXBlCi0gICAgd2hpbGUgKCBjdXJyZW50ICkgewotCi0gICAgICAg
IGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewotICAgICAgICAgICAganFYSFJb
IHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZAotICAgICAgICBpZiAo
ICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7Ci0gICAgICAgICAgICByZXNw
b25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIHByZXYgPSBjdXJyZW50OwotICAgICAgICBjdXJyZW50ID0gZGF0YVR5cGVzLnNo
aWZ0KCk7Ci0KLSAgICAgICAgaWYgKCBjdXJyZW50ICkgewotCi0gICAgICAgIC8vIFRoZXJlJ3Mg
b25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8KLSAgICAgICAg
ICAgIGlmICggY3VycmVudCA9PT0gIioiICkgewotCi0gICAgICAgICAgICAgICAgY3VycmVudCA9
IHByZXY7Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlw
ZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkgewotCi0gICAgICAgICAg
ICAgICAgLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBjb252ID0g
Y29udmVydGVyc1sgcHJldiArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsg
Y3VycmVudCBdOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBh
aXIKLSAgICAgICAgICAgICAgICBpZiAoICFjb252ICkgewotICAgICAgICAgICAgICAgICAgICBm
b3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9
IGNvbnYyLnNwbGl0KCAiICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG1wWyAx
IF0gPT09IGN1cnJlbnQgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBw
cmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyc1sgIiogIiArIHRtcFsg
MCBdIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb252ICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0
ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJz
WyBjb252MiBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lz
ZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0
bXBbIDEgXSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYg
bm90IGFuIGVxdWl2YWxlbmNlKQotICAgICAgICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSAp
IHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRv
IGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtCi0gICAgICAgICAgICAgICAgICAgIGlmICgg
Y29udiAmJiBzWyAidGhyb3dzIiBdICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9u
c2UgPSBjb252KCByZXNwb25zZSApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNh
dGNoICggZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0ZTog
InBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYgPyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsg
cHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB7IHN0YXRlOiAic3VjY2VzcyIsIGRhdGE6IHJl
c3BvbnNlIH07Ci19Ci0KLWpRdWVyeS5leHRlbmQoewotCi0gICAgLy8gQ291bnRlciBmb3IgaG9s
ZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCi0gICAgYWN0aXZlOiAwLAotCi0gICAg
Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAotICAgIGxhc3RN
b2RpZmllZDoge30sCi0gICAgZXRhZzoge30sCi0KLSAgICBhamF4U2V0dGluZ3M6IHsKLSAgICAg
ICAgdXJsOiBhamF4TG9jYXRpb24sCi0gICAgICAgIHR5cGU6ICJHRVQiLAotICAgICAgICBpc0xv
Y2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAotICAgICAgICBn
bG9iYWw6IHRydWUsCi0gICAgICAgIHByb2Nlc3NEYXRhOiB0cnVlLAotICAgICAgICBhc3luYzog
dHJ1ZSwKLSAgICAgICAgY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVu
Y29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAotICAgICAgICAvKgotICAgICAgICB0aW1lb3V0OiAwLAot
ICAgICAgICBkYXRhOiBudWxsLAotICAgICAgICBkYXRhVHlwZTogbnVsbCwKLSAgICAgICAgdXNl
cm5hbWU6IG51bGwsCi0gICAgICAgIHBhc3N3b3JkOiBudWxsLAotICAgICAgICBjYWNoZTogbnVs
bCwKLSAgICAgICAgdGhyb3dzOiBmYWxzZSwKLSAgICAgICAgdHJhZGl0aW9uYWw6IGZhbHNlLAot
ICAgICAgICBoZWFkZXJzOiB7fSwKLSAgICAgICAgKi8KLQotICAgICAgICBhY2NlcHRzOiB7Ci0g
ICAgICAgICAgICAiKiI6IGFsbFR5cGVzLAotICAgICAgICAgICAgdGV4dDogInRleHQvcGxhaW4i
LAotICAgICAgICAgICAgaHRtbDogInRleHQvaHRtbCIsCi0gICAgICAgICAgICB4bWw6ICJhcHBs
aWNhdGlvbi94bWwsIHRleHQveG1sIiwKLSAgICAgICAgICAgIGpzb246ICJhcHBsaWNhdGlvbi9q
c29uLCB0ZXh0L2phdmFzY3JpcHQiCi0gICAgICAgIH0sCi0KLSAgICAgICAgY29udGVudHM6IHsK
LSAgICAgICAgICAgIHhtbDogL3htbC8sCi0gICAgICAgICAgICBodG1sOiAvaHRtbC8sCi0gICAg
ICAgICAgICBqc29uOiAvanNvbi8KLSAgICAgICAgfSwKLQotICAgICAgICByZXNwb25zZUZpZWxk
czogewotICAgICAgICAgICAgeG1sOiAicmVzcG9uc2VYTUwiLAotICAgICAgICAgICAgdGV4dDog
InJlc3BvbnNlVGV4dCIsCi0gICAgICAgICAgICBqc29uOiAicmVzcG9uc2VKU09OIgotICAgICAg
ICB9LAotCi0gICAgICAgIC8vIERhdGEgY29udmVydGVycwotICAgICAgICAvLyBLZXlzIHNlcGFy
YXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBh
IHNpbmdsZSBzcGFjZQotICAgICAgICBjb252ZXJ0ZXJzOiB7Ci0KLSAgICAgICAgICAgIC8vIENv
bnZlcnQgYW55dGhpbmcgdG8gdGV4dAotICAgICAgICAgICAgIiogdGV4dCI6IFN0cmluZywKLQot
ICAgICAgICAgICAgLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCi0g
ICAgICAgICAgICAidGV4dCBodG1sIjogdHJ1ZSwKLQotICAgICAgICAgICAgLy8gRXZhbHVhdGUg
dGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgotICAgICAgICAgICAgInRleHQganNvbiI6IGpRdWVy
eS5wYXJzZUpTT04sCi0KLSAgICAgICAgICAgIC8vIFBhcnNlIHRleHQgYXMgeG1sCi0gICAgICAg
ICAgICAidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VYTUwKLSAgICAgICAgfSwKLQotICAgICAgICAv
LyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgotICAgICAgICAv
LyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCi0gICAgICAgIC8v
IGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCi0gICAgICAgIC8vIGRl
ZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQotICAgICAgICBmbGF0T3B0aW9uczogewotICAg
ICAgICAgICAgdXJsOiB0cnVlLAotICAgICAgICAgICAgY29udGV4dDogdHJ1ZQotICAgICAgICB9
Ci0gICAgfSwKLQotICAgIC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0
IGludG8gdGFyZ2V0Ci0gICAgLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3Mg
ZmllbGRzLgotICAgIC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0
dGluZ3MuCi0gICAgYWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsKLSAg
ICAgICAgcmV0dXJuIHNldHRpbmdzID8KLQotICAgICAgICAgICAgLy8gQnVpbGRpbmcgYSBzZXR0
aW5ncyBvYmplY3QKLSAgICAgICAgICAgIGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwg
alF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKLQotICAgICAgICAgICAgLy8gRXh0
ZW5kaW5nIGFqYXhTZXR0aW5ncwotICAgICAgICAgICAgYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhT
ZXR0aW5ncywgdGFyZ2V0ICk7Ci0gICAgfSwKLQotICAgIGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJl
ZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAotICAgIGFqYXhUcmFuc3BvcnQ6IGFk
ZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAotCi0gICAgLy8gTWFpbiBt
ZXRob2QKLSAgICBhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgewotCi0gICAgICAgIC8v
IElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCi0gICAgICAg
IGlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIgKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0g
dXJsOwotICAgICAgICAgICAgdXJsID0gdW5kZWZpbmVkOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKLSAgICAgICAgb3B0aW9ucyA9IG9wdGlv
bnMgfHwge307Ci0KLSAgICAgICAgdmFyIHRyYW5zcG9ydCwKLSAgICAgICAgICAgIC8vIFVSTCB3
aXRob3V0IGFudGktY2FjaGUgcGFyYW0KLSAgICAgICAgICAgIGNhY2hlVVJMLAotICAgICAgICAg
ICAgLy8gUmVzcG9uc2UgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5n
LAotICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzLAotICAgICAgICAgICAgLy8gdGltZW91dCBo
YW5kbGUKLSAgICAgICAgICAgIHRpbWVvdXRUaW1lciwKLSAgICAgICAgICAgIC8vIENyb3NzLWRv
bWFpbiBkZXRlY3Rpb24gdmFycwotICAgICAgICAgICAgcGFydHMsCi0gICAgICAgICAgICAvLyBU
byBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWQKLSAgICAgICAgICAg
IGZpcmVHbG9iYWxzLAotICAgICAgICAgICAgLy8gTG9vcCB2YXJpYWJsZQotICAgICAgICAgICAg
aSwKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKLSAgICAg
ICAgICAgIHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLAotICAgICAgICAgICAg
Ly8gQ2FsbGJhY2tzIGNvbnRleHQKLSAgICAgICAgICAgIGNhbGxiYWNrQ29udGV4dCA9IHMuY29u
dGV4dCB8fCBzLAotICAgICAgICAgICAgLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBj
YWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgot
ICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tD
b250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/Ci0gICAgICAgICAg
ICAgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6Ci0gICAgICAgICAgICAgICAgalF1ZXJ5
LmV2ZW50LAotICAgICAgICAgICAgLy8gRGVmZXJyZWRzCi0gICAgICAgICAgICBkZWZlcnJlZCA9
IGpRdWVyeS5EZWZlcnJlZCgpLAotICAgICAgICAgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVy
eS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksCi0gICAgICAgICAgICAvLyBTdGF0dXMtZGVwZW5k
ZW50IGNhbGxiYWNrcwotICAgICAgICAgICAgc3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7
fSwKLSAgICAgICAgICAgIC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCi0g
ICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IHt9LAotICAgICAgICAgICAgcmVxdWVzdEhlYWRl
cnNOYW1lcyA9IHt9LAotICAgICAgICAgICAgLy8gVGhlIGpxWEhSIHN0YXRlCi0gICAgICAgICAg
ICBzdGF0ZSA9IDAsCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2UKLSAgICAg
ICAgICAgIHN0ckFib3J0ID0gImNhbmNlbGVkIiwKLSAgICAgICAgICAgIC8vIEZha2UgeGhyCi0g
ICAgICAgICAgICBqcVhIUiA9IHsKLSAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiAwLAotCi0g
ICAgICAgICAgICAgICAgLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAotICAg
ICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkgewotICAgICAg
ICAgICAgICAgICAgICB2YXIgbWF0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUg
PT09IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFyZXNwb25zZUhlYWRlcnMg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0ge307Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVj
KCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hb
IDIgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sg
a2V5LnRvTG93ZXJDYXNlKCkgXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDsKLSAgICAgICAgICAg
ICAgICB9LAotCi0gICAgICAgICAgICAgICAgLy8gUmF3IHN0cmluZwotICAgICAgICAgICAgICAg
IGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAg
IHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7Ci0gICAg
ICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgIC8vIENhY2hlcyB0aGUgaGVhZGVyCi0g
ICAgICAgICAgICAgICAgc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkg
ewotICAgICAgICAgICAgICAgICAgICB2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICggIXN0YXRlICkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05h
bWVzWyBsbmFtZSBdIHx8IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVh
ZGVyc1sgbmFtZSBdID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAg
ICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCi0gICAgICAgICAg
ICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggIXN0YXRlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcy5taW1lVHlw
ZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgIC8vIFN0YXR1
cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogZnVuY3Rp
b24oIG1hcCApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGU7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggbWFwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA8
IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggY29kZSBpbiBtYXAgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenktYWRkIHRoZSBuZXcgY2Fs
bGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXMKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0s
IG1hcFsgY29kZSBdIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBF
eGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAgLy8gQ2Fu
Y2VsIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNU
ZXh0ICkgewotICAgICAgICAgICAgICAgICAgICB2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8
fCBzdHJBYm9ydDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmFuc3BvcnQgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCAp
OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIEF0dGFjaCBkZWZlcnJlZHMKLSAgICAgICAgZGVm
ZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOwot
ICAgICAgICBqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTsKLSAgICAgICAganFYSFIuZXJyb3Ig
PSBqcVhIUi5mYWlsOwotCi0gICAgICAgIC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6
IGFuZCBzdHJpbmcgcHJvbW90aW9uKQotICAgICAgICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHBy
b3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdCkKLSAgICAgICAgLy8gSGFuZGxlIGZh
bHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGgg
b2xkIHNpZ25hdHVyZSkKLSAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIg
aWYgYXZhaWxhYmxlCi0gICAgICAgIHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9j
YXRpb24gKSArICIiICkucmVwbGFjZSggcmhhc2gsICIiICkKLSAgICAgICAgICAgIC5yZXBsYWNl
KCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgIi8vIiApOwotCi0gICAgICAgIC8vIEFs
aWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAotICAgICAgICBz
LnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50
eXBlOwotCi0gICAgICAgIC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKLSAgICAgICAgcy5kYXRh
VHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1h
dGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07Ci0KLSAgICAgICAgLy8gQSBjcm9zcy1kb21haW4g
cmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlz
bWF0Y2gKLSAgICAgICAgaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7Ci0gICAgICAgICAg
ICBwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApOwotICAgICAgICAgICAg
cy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgotICAgICAgICAgICAgICAgICggcGFydHNbIDEg
XSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAy
IF0gfHwKLSAgICAgICAgICAgICAgICAgICAgKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9
PT0gImh0dHA6IiA/ICI4MCIgOiAiNDQzIiApICkgIT09Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIg
PyAiODAiIDogIjQ0MyIgKSApICkKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKLSAgICAgICAgaWYgKCBz
LmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsK
LSAgICAgICAgICAgIHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFs
ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcHBseSBwcmVmaWx0ZXJzCi0gICAgICAgIGlu
c3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhI
UiApOwotCi0gICAgICAgIC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmls
dGVyLCBzdG9wIHRoZXJlCi0gICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7Ci0gICAgICAgICAg
ICByZXR1cm4ganFYSFI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9i
YWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwotICAgICAgICBmaXJlR2xvYmFscyA9IHMu
Z2xvYmFsOwotCi0gICAgICAgIC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKLSAg
ICAgICAgaWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7Ci0gICAg
ICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBVcHBlcmNhc2UgdGhlIHR5cGUKLSAgICAgICAgcy50eXBlID0gcy50eXBlLnRv
VXBwZXJDYXNlKCk7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRl
bnQKLSAgICAgICAgcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7Ci0K
LSAgICAgICAgLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElm
LU1vZGlmaWVkLVNpbmNlCi0gICAgICAgIC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBs
YXRlciBvbgotICAgICAgICBjYWNoZVVSTCA9IHMudXJsOwotCi0gICAgICAgIC8vIE1vcmUgb3B0
aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50Ci0gICAgICAgIGlmICgg
IXMuaGFzQ29udGVudCApIHsKLQotICAgICAgICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUs
IGFwcGVuZCBkYXRhIHRvIHVybAotICAgICAgICAgICAgaWYgKCBzLmRhdGEgKSB7Ci0gICAgICAg
ICAgICAgICAgY2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkg
PyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOwotICAgICAgICAgICAgICAgIC8vICM5NjgyOiByZW1v
dmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKLSAgICAg
ICAgICAgICAgICBkZWxldGUgcy5kYXRhOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAoIHMuY2Fj
aGUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hl
VVJMICkgPwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAn
XycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlVVJM
LnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgbm9uY2UrKyApIDoKLQotICAgICAgICAgICAgICAgICAg
ICAvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgIGNh
Y2hlVVJMICsgKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiAr
IG5vbmNlKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhl
IElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZN
b2RpZmllZCBtb2RlLgotICAgICAgICBpZiAoIHMuaWZNb2RpZmllZCApIHsKLSAgICAgICAgICAg
IGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKLSAgICAgICAgICAgICAg
ICBqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFz
dE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
IGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewotICAgICAgICAgICAgICAgIGpxWEhSLnNldFJl
cXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBo
ZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudAotICAgICAgICBpZiAoIHMuZGF0YSAmJiBzLmhh
c0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlw
ZSApIHsKLSAgICAgICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUi
LCBzLmNvbnRlbnRUeXBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIEFjY2Vw
dHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCi0gICAg
ICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoCi0gICAgICAgICAgICAiQWNjZXB0IiwKLSAgICAg
ICAgICAgIHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8K
LSAgICAgICAgICAgICAgICBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5
cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoK
LSAgICAgICAgICAgICAgICBzLmFjY2VwdHNbICIqIiBdCi0gICAgICAgICk7Ci0KLSAgICAgICAg
Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCi0gICAgICAgIGZvciAoIGkgaW4gcy5oZWFkZXJz
ICkgewotICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBp
IF0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0
eXBlcyBhbmQgZWFybHkgYWJvcnQKLSAgICAgICAgaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJl
Zm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBz
dGF0ZSA9PT0gMiApICkgewotICAgICAgICAgICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFk
eSBhbmQgcmV0dXJuCi0gICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTsKLSAgICAgICAg
fQotCi0gICAgICAgIC8vIGFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgotICAg
ICAgICBzdHJBYm9ydCA9ICJhYm9ydCI7Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mg
b24gZGVmZXJyZWRzCi0gICAgICAgIGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwg
Y29tcGxldGU6IDEgfSApIHsKLSAgICAgICAgICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRyYW5zcG9ydAotICAgICAgICB0cmFuc3BvcnQgPSBp
bnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFY
SFIgKTsKLQotICAgICAgICAvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKLSAgICAg
ICAgaWYgKCAhdHJhbnNwb3J0ICkgewotICAgICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3Bv
cnQiICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0g
MTsKLQotICAgICAgICAgICAgLy8gU2VuZCBnbG9iYWwgZXZlbnQKLSAgICAgICAgICAgIGlmICgg
ZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdn
ZXIoICJhamF4U2VuZCIsIFsganFYSFIsIHMgXSApOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgLy8gVGltZW91dAotICAgICAgICAgICAgaWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAg
KSB7Ci0gICAgICAgICAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigp
IHsKLSAgICAgICAgICAgICAgICAgICAganFYSFIuYWJvcnQoInRpbWVvdXQiKTsKLSAgICAgICAg
ICAgICAgICB9LCBzLnRpbWVvdXQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5
IHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0
LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7Ci0gICAgICAgICAgICB9IGNhdGNoICggZSAp
IHsKLSAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5v
dCBkb25lCi0gICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA8IDIgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGRvbmUoIC0xLCBlICk7Ci0gICAgICAgICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cg
b3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
dGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKLSAgICAgICAg
ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRl
cnMgKSB7Ci0gICAgICAgICAgICB2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9u
c2UsIG1vZGlmaWVkLAotICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNU
ZXh0OwotCi0gICAgICAgICAgICAvLyBDYWxsZWQgb25jZQotICAgICAgICAgICAgaWYgKCBzdGF0
ZSA9PT0gMiApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIFN0YXRlIGlzICJkb25lIiBub3cKLSAgICAgICAgICAgIHN0YXRlID0gMjsK
LQotICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKLSAgICAgICAgICAg
IGlmICggdGltZW91dFRpbWVyICkgewotICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGlt
ZW91dFRpbWVyICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERlcmVmZXJlbmNl
IHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uCi0gICAgICAgICAgICAvLyAo
bm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKQotICAgICAg
ICAgICAgdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwotCi0gICAgICAgICAgICAvLyBDYWNoZSByZXNw
b25zZSBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJz
IHx8ICIiOwotCi0gICAgICAgICAgICAvLyBTZXQgcmVhZHlTdGF0ZQotICAgICAgICAgICAganFY
SFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKLQotICAgICAgICAgICAgLy8gRGV0
ZXJtaW5lIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAy
MDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwotCi0gICAgICAgICAgICAvLyBH
ZXQgcmVzcG9uc2UgZGF0YQotICAgICAgICAgICAgaWYgKCByZXNwb25zZXMgKSB7Ci0gICAgICAg
ICAgICAgICAgcmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9u
c2VzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgbm8gbWF0dGVy
IHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldCkKLSAgICAg
ICAgICAgIHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNj
ZXNzICk7Ci0KLSAgICAgICAgICAgIC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWlu
aW5nCi0gICAgICAgICAgICBpZiAoIGlzU3VjY2VzcyApIHsKLQotICAgICAgICAgICAgICAgIC8v
IFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBp
ZiBpbiBpZk1vZGlmaWVkIG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKCBzLmlmTW9kaWZpZWQg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFk
ZXIoIkxhc3QtTW9kaWZpZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCAp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJM
IF0gPSBtb2RpZmllZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIik7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqUXVl
cnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgbm8gY29udGVudAotICAg
ICAgICAgICAgICAgIGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSAiSEVBRCIgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSAibm9jb250ZW50IjsKLQotICAgICAg
ICAgICAgICAgIC8vIGlmIG5vdCBtb2RpZmllZAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
IHN0YXR1cyA9PT0gMzA0ICkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIm5v
dG1vZGlmaWVkIjsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3Mg
Y29udmVydCBpdAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAg
IHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgc3VjY2Vz
cyA9IHJlc3BvbnNlLmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2Uu
ZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9ICFlcnJvcjsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGV4
dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0Ci0gICAgICAgICAgICAgICAgLy8gdGhlbiBub3Jt
YWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCi0gICAgICAgICAgICAg
ICAgZXJyb3IgPSBzdGF0dXNUZXh0OwotICAgICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFz
dGF0dXNUZXh0ICkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPCAwICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBm
YWtlIHhociBvYmplY3QKLSAgICAgICAgICAgIGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKLSAgICAg
ICAgICAgIGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4
dCApICsgIiI7Ci0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3MvRXJyb3IKLSAgICAgICAgICAgIGlm
ICggaXNTdWNjZXNzICkgewotICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBj
YWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApOwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxs
YmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKLSAgICAgICAg
ICAgIGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTsKLSAgICAgICAgICAgIHN0YXR1c0Nv
ZGUgPSB1bmRlZmluZWQ7Ci0KLSAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAg
ICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4
U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywg
aXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgLy8gQ29tcGxldGUKLSAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgo
IGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7Ci0KLSAgICAgICAgICAg
IGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0
LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbIGpxWEhSLCBzIF0gKTsKLSAgICAgICAgICAgICAg
ICAvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKLSAgICAgICAgICAgICAgICBpZiAo
ICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewotICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZl
bnQudHJpZ2dlcigiYWpheFN0b3AiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ganFYSFI7Ci0gICAgfSwKLQotICAgIGdldEpT
T046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewotICAgICAgICByZXR1cm4galF1
ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgImpzb24iICk7Ci0gICAgfSwKLQotICAgIGdl
dFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHJldHVybiBqUXVl
cnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Ci0gICAgfQotfSk7
Ci0KLWpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCAp
IHsKLSAgICBqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ss
IHR5cGUgKSB7Ci0gICAgICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdh
cyBvbWl0dGVkCi0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKLSAg
ICAgICAgICAgIHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrOwotICAgICAgICAgICAgY2FsbGJhY2sg
PSBkYXRhOwotICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBqUXVlcnkuYWpheCh7Ci0gICAgICAgICAgICB1cmw6IHVybCwKLSAgICAgICAg
ICAgIHR5cGU6IG1ldGhvZCwKLSAgICAgICAgICAgIGRhdGFUeXBlOiB0eXBlLAotICAgICAgICAg
ICAgZGF0YTogZGF0YSwKLSAgICAgICAgICAgIHN1Y2Nlc3M6IGNhbGxiYWNrCi0gICAgICAgIH0p
OwotICAgIH07Ci19KTsKLQotLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5k
bGluZyBjb21tb24gQUpBWCBldmVudHMKLWpRdWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWph
eFN0b3AiLCAiYWpheENvbXBsZXRlIiwgImFqYXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4
U2VuZCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7Ci0gICAgalF1ZXJ5LmZuWyB0eXBlIF0gPSBm
dW5jdGlvbiggZm4gKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApOwotICAg
IH07Ci19KTsKLQotCi1qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewotICAgIHJl
dHVybiBqUXVlcnkuYWpheCh7Ci0gICAgICAgIHVybDogdXJsLAotICAgICAgICB0eXBlOiAiR0VU
IiwKLSAgICAgICAgZGF0YVR5cGU6ICJzY3JpcHQiLAotICAgICAgICBhc3luYzogZmFsc2UsCi0g
ICAgICAgIGdsb2JhbDogZmFsc2UsCi0gICAgICAgICJ0aHJvd3MiOiB0cnVlCi0gICAgfSk7Ci19
OwotCi0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkg
ewotICAgICAgICB2YXIgd3JhcDsKLQotICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBo
dG1sICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewot
ICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBp
KSApOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHRoaXNbIDAg
XSApIHsKLQotICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBh
cm91bmQKLSAgICAgICAgICAgIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRv
Y3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApOwotCi0gICAgICAgICAgICBpZiAoIHRoaXNb
IDAgXS5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKCB0
aGlzWyAwIF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JhcC5tYXAoZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzOwotCi0gICAgICAgICAgICAg
ICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewotICAgICAgICAgICAgICAgICAg
ICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKLSAgICAgICAgICAgIH0pLmFwcGVuZCggdGhpcyAp
OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIHdyYXBJ
bm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7Ci0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24o
IGh0bWwgKSApIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7
Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwodGhp
cywgaSkgKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHZhciBzZWxmID0galF1ZXJ5KCB0aGlz
ICksCi0gICAgICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7Ci0KLSAgICAg
ICAgICAgIGlmICggY29udGVudHMubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRz
LndyYXBBbGwoIGh0bWwgKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBzZWxmLmFwcGVuZCggaHRtbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9
LAotCi0gICAgd3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7Ci0gICAgICAgIHZhciBpc0Z1bmN0aW9u
ID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNo
KGZ1bmN0aW9uKCBpICkgewotICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNG
dW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBpKSA6IGh0bWwgKTsKLSAgICAgICAgfSk7Ci0gICAg
fSwKLQotICAgIHVud3JhcDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVu
dCgpLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUo
IHRoaXMsICJib2R5IiApICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJlcGxh
Y2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkuZW5k
KCk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlv
biggZWxlbSApIHsKLSAgICAvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMgotICAgIC8vIE9wZXJh
IHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9u
IHNvbWUgZWxlbWVudHMKLSAgICByZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA8PSAwICYmIGVsZW0u
b2Zmc2V0SGVpZ2h0IDw9IDA7Ci19OwotalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVu
Y3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbigg
ZWxlbSApOwotfTsKLQotCi0KLQotdmFyIHIyMCA9IC8lMjAvZywKLSAgICByYnJhY2tldCA9IC9c
W1xdJC8sCi0gICAgckNSTEYgPSAvXHI/XG4vZywKLSAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/
OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksCi0gICAgcnN1Ym1pdHRhYmxlID0g
L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwotCi1mdW5jdGlvbiBidWlsZFBh
cmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7Ci0gICAgdmFyIG5hbWU7Ci0K
LSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsKLSAgICAgICAgLy8gU2VyaWFsaXpl
IGFycmF5IGl0ZW0uCi0gICAgICAgIGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkg
ewotICAgICAgICAgICAgaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXgg
KSApIHsKLSAgICAgICAgICAgICAgICAvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2Fs
YXIuCi0gICAgICAgICAgICAgICAgYWRkKCBwcmVmaXgsIHYgKTsKLQotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9i
amVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC4KLSAgICAgICAgICAgICAgICBidWlsZFBh
cmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSAr
ICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsK
LQotICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09
ICJvYmplY3QiICkgewotICAgICAgICAvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uCi0gICAgICAg
IGZvciAoIG5hbWUgaW4gb2JqICkgewotICAgICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCAr
ICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7Ci0gICAg
ICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4K
LSAgICAgICAgYWRkKCBwcmVmaXgsIG9iaiApOwotICAgIH0KLX0KLQotLy8gU2VyaWFsaXplIGFu
IGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKLS8vIGtleS92YWx1ZXMgaW50byBh
IHF1ZXJ5IHN0cmluZwotalF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkg
ewotICAgIHZhciBwcmVmaXgsCi0gICAgICAgIHMgPSBbXSwKLSAgICAgICAgYWRkID0gZnVuY3Rp
b24oIGtleSwgdmFsdWUgKSB7Ci0gICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9u
LCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKLSAgICAgICAgICAgIHZhbHVlID0galF1
ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIg
OiB2YWx1ZSApOwotICAgICAgICAgICAgc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVu
dCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7Ci0gICAgICAgIH07
Ci0KLSAgICAvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJl
aGF2aW9yLgotICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAg
dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3Mu
dHJhZGl0aW9uYWw7Ci0gICAgfQotCi0gICAgLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwg
YXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4KLSAgICBpZiAoIGpR
dWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3Qo
IGEgKSApICkgewotICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHMKLSAgICAg
ICAgalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgYWRkKCB0aGlzLm5h
bWUsIHRoaXMudmFsdWUgKTsKLSAgICAgICAgfSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAv
LyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Ig
b2xkZXIKLSAgICAgICAgLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJz
aXZlbHkuCi0gICAgICAgIGZvciAoIHByZWZpeCBpbiBhICkgewotICAgICAgICAgICAgYnVpbGRQ
YXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KLSAg
ICByZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwotfTsKLQotalF1ZXJ5
LmZuLmV4dGVuZCh7Ci0gICAgc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJu
IGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7Ci0gICAgfSwKLSAgICBzZXJp
YWxpemVBcnJheTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlv
bigpIHsKLSAgICAgICAgICAgIC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8g
ZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCi0gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBq
UXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRzIiApOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1l
bnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7Ci0gICAgICAgIH0pCi0g
ICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMu
dHlwZTsKLQotICAgICAgICAgICAgLy8gVXNlIC5pcyggIjpkaXNhYmxlZCIgKSBzbyB0aGF0IGZp
ZWxkc2V0W2Rpc2FibGVkXSB3b3JrcwotICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAmJiAh
alF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKLSAgICAgICAgICAgICAgICByc3Vi
bWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCgg
dHlwZSApICYmCi0gICAgICAgICAgICAgICAgKCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVU
eXBlLnRlc3QoIHR5cGUgKSApOwotICAgICAgICB9KQotICAgICAgICAubWFwKGZ1bmN0aW9uKCBp
LCBlbGVtICkgewotICAgICAgICAgICAgdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwot
Ci0gICAgICAgICAgICByZXR1cm4gdmFsID09IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwg
OgotICAgICAgICAgICAgICAgIGpRdWVyeS5pc0FycmF5KCB2YWwgKSA/Ci0gICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCBy
Q1JMRiwgIlxyXG4iICkgfTsKLSAgICAgICAgICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAg
ICAgICAgICB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxy
XG4iICkgfTsKLSAgICAgICAgfSkuZ2V0KCk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmFqYXhT
ZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHsKLSAgICB0cnkgewotICAgICAgICByZXR1cm4gbmV3
IFhNTEh0dHBSZXF1ZXN0KCk7Ci0gICAgfSBjYXRjaCggZSApIHt9Ci19OwotCi12YXIgeGhySWQg
PSAwLAotICAgIHhockNhbGxiYWNrcyA9IHt9LAotICAgIHhoclN1Y2Nlc3NTdGF0dXMgPSB7Ci0g
ICAgICAgIC8vIGZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1
bWUgMjAwCi0gICAgICAgIDA6IDIwMCwKLSAgICAgICAgLy8gU3VwcG9ydDogSUU5Ci0gICAgICAg
IC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIw
NAotICAgICAgICAxMjIzOiAyMDQKLSAgICB9LAotICAgIHhoclN1cHBvcnRlZCA9IGpRdWVyeS5h
amF4U2V0dGluZ3MueGhyKCk7Ci0KLS8vIFN1cHBvcnQ6IElFOQotLy8gT3BlbiByZXF1ZXN0cyBt
dXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24gdW5sb2FkICgjNTI4MCkKLWlmICggd2luZG93LkFj
dGl2ZVhPYmplY3QgKSB7Ci0gICAgalF1ZXJ5KCB3aW5kb3cgKS5vbiggInVubG9hZCIsIGZ1bmN0
aW9uKCkgewotICAgICAgICBmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKLSAgICAg
ICAgICAgIHhockNhbGxiYWNrc1sga2V5IF0oKTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi1z
dXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHho
clN1cHBvcnRlZCApOwotc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0
ZWQ7Ci0KLWpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgIHZh
ciBjYWxsYmFjazsKLQotICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9y
dGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3QKLSAgICBpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJT
dXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7Ci0gICAgICAgIHJldHVybiB7Ci0g
ICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7Ci0gICAgICAg
ICAgICAgICAgdmFyIGksCi0gICAgICAgICAgICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyKCks
Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gKyt4aHJJZDsKLQotICAgICAgICAgICAgICAgIHho
ci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlvbnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25z
LnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBcHBs
eSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkCi0gICAgICAgICAgICAgICAgaWYgKCBvcHRpb25z
LnhockZpZWxkcyApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaSBpbiBvcHRpb25zLnho
ckZpZWxkcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhoclsgaSBdID0gb3B0aW9ucy54
aHJGaWVsZHNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKLSAgICAg
ICAgICAgICAgICBpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1p
bWVUeXBlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gWC1SZXF1
ZXN0ZWQtV2l0aCBoZWFkZXIKLSAgICAgICAgICAgICAgICAvLyBGb3IgY3Jvc3MtZG9tYWluIHJl
cXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCi0gICAgICAg
ICAgICAgICAgLy8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQg
aXQgdG8gYmUgc3VyZS4KLSAgICAgICAgICAgICAgICAvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQg
b24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cCkKLSAgICAgICAg
ICAgICAgICAvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIg
aWYgYWxyZWFkeSBwcm92aWRlZC4KLSAgICAgICAgICAgICAgICBpZiAoICFvcHRpb25zLmNyb3Nz
RG9tYWluICYmICFoZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSA9ICJYTUxIdHRwUmVxdWVzdCI7Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2V0IGhlYWRlcnMKLSAgICAg
ICAgICAgICAgICBmb3IgKCBpIGluIGhlYWRlcnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHho
ci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKLSAgICAgICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgICAgICAvLyBDYWxsYmFjawotICAgICAgICAgICAgICAgIGNhbGxiYWNr
ID0gZnVuY3Rpb24oIHR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlv
bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHhockNhbGxiYWNrc1sgaWQgXTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9
IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJhYm9y
dCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBz
dGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHhoci5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4
aHIuc3RhdHVzVGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbXBsZXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhy
U3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFOQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gQWNjZXNzaW5nIGJpbmFyeS1kYXRhIHJlc3BvbnNlVGV4dCB0aHJv
d3MgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAo
IzExNDI2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHhoci5y
ZXNwb25zZVRleHQgPT09ICJzdHJpbmciID8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRleHQ6IHhoci5yZXNwb25zZVRleHQKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAg
ICAgfTsKLQotICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBldmVudHMKLSAgICAgICAgICAg
ICAgICB4aHIub25sb2FkID0gY2FsbGJhY2soKTsKLSAgICAgICAgICAgICAgICB4aHIub25lcnJv
ciA9IGNhbGxiYWNrKCJlcnJvciIpOwotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBh
Ym9ydCBjYWxsYmFjawotICAgICAgICAgICAgICAgIGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBp
ZCBdID0gY2FsbGJhY2soImFib3J0Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBzZW5kIHRo
ZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9u
IHdoaWNoIGlzIGFjdHVhbGx5Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBpbiBqUXVlcnku
YWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUpCi0gICAgICAgICAgICAgICAgeGhyLnNlbmQoIG9w
dGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwotICAgICAgICAgICAg
fSwKLQotICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlm
ICggY2FsbGJhY2sgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0pOwotCi0KLQot
Ci0vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZQotalF1ZXJ5LmFqYXhTZXR1cCh7Ci0gICAgYWNj
ZXB0czogewotICAgICAgICBzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2ph
dmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlw
dCIKLSAgICB9LAotICAgIGNvbnRlbnRzOiB7Ci0gICAgICAgIHNjcmlwdDogLyg/OmphdmF8ZWNt
YSlzY3JpcHQvCi0gICAgfSwKLSAgICBjb252ZXJ0ZXJzOiB7Ci0gICAgICAgICJ0ZXh0IHNjcmlw
dCI6IGZ1bmN0aW9uKCB0ZXh0ICkgewotICAgICAgICAgICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIHRl
eHQgKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0K
LS8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW4KLWpRdWVyeS5h
amF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7Ci0gICAgaWYgKCBzLmNhY2hl
ID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgIHMuY2FjaGUgPSBmYWxzZTsKLSAgICB9Ci0gICAg
aWYgKCBzLmNyb3NzRG9tYWluICkgewotICAgICAgICBzLnR5cGUgPSAiR0VUIjsKLSAgICB9Ci19
KTsKLQotLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0Ci1qUXVlcnkuYWpheFRyYW5z
cG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewotICAgIC8vIFRoaXMgdHJhbnNwb3J0IG9u
bHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKLSAgICBpZiAoIHMuY3Jvc3NEb21h
aW4gKSB7Ci0gICAgICAgIHZhciBzY3JpcHQsIGNhbGxiYWNrOwotICAgICAgICByZXR1cm4gewot
ICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewotICAgICAgICAgICAg
ICAgIHNjcmlwdCA9IGpRdWVyeSgiPHNjcmlwdD4iKS5wcm9wKHsKLSAgICAgICAgICAgICAgICAg
ICAgYXN5bmM6IHRydWUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ6IHMuc2NyaXB0Q2hh
cnNldCwKLSAgICAgICAgICAgICAgICAgICAgc3JjOiBzLnVybAotICAgICAgICAgICAgICAgIH0p
Lm9uKAotICAgICAgICAgICAgICAgICAgICAibG9hZCBlcnJvciIsCi0gICAgICAgICAgICAgICAg
ICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHNjcmlwdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbnVs
bDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXZ0ICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbXBsZXRlKCBldnQudHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwg
ZXZ0LnR5cGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5h
cHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBh
Ym9ydDogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjYWxsYmFjayApIHsKLSAg
ICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfSk7Ci0KLQotCi0KLXZhciBvbGRDYWxsYmFja3Mg
PSBbXSwKLSAgICByanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vOwotCi0vLyBEZWZhdWx0IGpz
b25wIHNldHRpbmdzCi1qUXVlcnkuYWpheFNldHVwKHsKLSAgICBqc29ucDogImNhbGxiYWNrIiwK
LSAgICBqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrID0g
b2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysg
KSApOwotICAgICAgICB0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNh
bGxiYWNrOwotICAgIH0KLX0pOwotCi0vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBp
bnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHMKLWpRdWVyeS5hamF4UHJlZmlsdGVy
KCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsK
LQotICAgIHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwK
LSAgICAgICAganNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBz
LnVybCApID8KLSAgICAgICAgICAgICJ1cmwiIDoKLSAgICAgICAgICAgIHR5cGVvZiBzLmRhdGEg
PT09ICJzdHJpbmciICYmICEoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNh
dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYg
ImRhdGEiCi0gICAgICAgICk7Ci0KLSAgICAvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRh
IHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAotICAgIGlmICgg
anNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKLQotICAgICAgICAv
LyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2Np
YXRlZCB3aXRoIGl0Ci0gICAgICAgIGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpR
dWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/Ci0gICAgICAgICAgICBzLmpzb25w
Q2FsbGJhY2soKSA6Ci0gICAgICAgICAgICBzLmpzb25wQ2FsbGJhY2s7Ci0KLSAgICAgICAgLy8g
SW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YQotICAgICAgICBpZiAoIGpzb25Q
cm9wICkgewotICAgICAgICAgICAgc1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFj
ZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHMu
anNvbnAgIT09IGZhbHNlICkgewotICAgICAgICAgICAgcy51cmwgKz0gKCBycXVlcnkudGVzdCgg
cy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29u
IGFmdGVyIHNjcmlwdCBleGVjdXRpb24KLSAgICAgICAgcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNv
biJdID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoICFyZXNwb25zZUNvbnRhaW5lciAp
IHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5v
dCBjYWxsZWQiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VD
b250YWluZXJbIDAgXTsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBmb3JjZSBqc29uIGRhdGFU
eXBlCi0gICAgICAgIHMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7Ci0KLSAgICAgICAgLy8gSW5z
dGFsbCBjYWxsYmFjawotICAgICAgICBvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1l
IF07Ci0gICAgICAgIHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgIHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwotICAgICAgICB9OwotCi0gICAg
ICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQotICAgICAg
ICBqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAvLyBSZXN0b3JlIHByZWV4
aXN0aW5nIHZhbHVlCi0gICAgICAgICAgICB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3Zlcndy
aXR0ZW47Ci0KLSAgICAgICAgICAgIC8vIFNhdmUgYmFjayBhcyBmcmVlCi0gICAgICAgICAgICBp
ZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0
aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAotICAg
ICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxs
YmFjazsKLQotICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1
dHVyZSB1c2UKLSAgICAgICAgICAgICAgICBvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1l
ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhbGwgaWYgaXQgd2FzIGEgZnVu
Y3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQotICAgICAgICAgICAgaWYgKCByZXNwb25zZUNv
bnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKLSAgICAgICAg
ICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICByZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5k
ZWZpbmVkOwotICAgICAgICB9KTsKLQotICAgICAgICAvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKLSAg
ICAgICAgcmV0dXJuICJzY3JpcHQiOwotICAgIH0KLX0pOwotCi0KLQotCi0vLyBkYXRhOiBzdHJp
bmcgb2YgaHRtbAotLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFn
bWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVu
dAotLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlw
dHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwotalF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9u
KCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHsKLSAgICBpZiAoICFkYXRhIHx8IHR5cGVv
ZiBkYXRhICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAg
IGlmICggdHlwZW9mIGNvbnRleHQgPT09ICJib29sZWFuIiApIHsKLSAgICAgICAga2VlcFNjcmlw
dHMgPSBjb250ZXh0OwotICAgICAgICBjb250ZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGNvbnRl
eHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwotCi0gICAgdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcu
ZXhlYyggZGF0YSApLAotICAgICAgICBzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwotCi0g
ICAgLy8gU2luZ2xlIHRhZwotICAgIGlmICggcGFyc2VkICkgewotICAgICAgICByZXR1cm4gWyBj
b250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07Ci0gICAgfQotCi0gICAgcGFyc2Vk
ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7Ci0K
LSAgICBpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7Ci0gICAgICAgIGpRdWVyeSgg
c2NyaXB0cyApLnJlbW92ZSgpOwotICAgIH0KLQotICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtd
LCBwYXJzZWQuY2hpbGROb2RlcyApOwotfTsKLQotCi0vLyBLZWVwIGEgY29weSBvZiB0aGUgb2xk
IGxvYWQgbWV0aG9kCi12YXIgX2xvYWQgPSBqUXVlcnkuZm4ubG9hZDsKLQotLyoqCi0gKiBMb2Fk
IGEgdXJsIGludG8gYSBwYWdlCi0gKi8KLWpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwg
cGFyYW1zLCBjYWxsYmFjayApIHsKLSAgICBpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYm
IF9sb2FkICkgewotICAgICAgICByZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyAp
OwotICAgIH0KLQotICAgIHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsCi0gICAgICAgIHNl
bGYgPSB0aGlzLAotICAgICAgICBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwotCi0gICAgaWYgKCBv
ZmYgPj0gMCApIHsKLSAgICAgICAgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiApOwotICAgICAg
ICB1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwotICAgIH0KLQotICAgIC8vIElmIGl0J3MgYSBm
dW5jdGlvbgotICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewotCi0gICAg
ICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCi0gICAgICAgIGNhbGxiYWNr
ID0gcGFyYW1zOwotICAgICAgICBwYXJhbXMgPSB1bmRlZmluZWQ7Ci0KLSAgICAvLyBPdGhlcndp
c2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCi0gICAgfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVv
ZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewotICAgICAgICB0eXBlID0gIlBPU1QiOwotICAgIH0K
LQotICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0
Ci0gICAgaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7Ci0gICAgICAgIGpRdWVyeS5hamF4KHsKLSAg
ICAgICAgICAgIHVybDogdXJsLAotCi0gICAgICAgICAgICAvLyBpZiAidHlwZSIgdmFyaWFibGUg
aXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQKLSAgICAgICAgICAg
IHR5cGU6IHR5cGUsCi0gICAgICAgICAgICBkYXRhVHlwZTogImh0bWwiLAotICAgICAgICAgICAg
ZGF0YTogcGFyYW1zCi0gICAgICAgIH0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsK
LQotICAgICAgICAgICAgLy8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxi
YWNrCi0gICAgICAgICAgICByZXNwb25zZSA9IGFyZ3VtZW50czsKLQotICAgICAgICAgICAgc2Vs
Zi5odG1sKCBzZWxlY3RvciA/Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdG9yIHdh
cyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKLSAg
ICAgICAgICAgICAgICAvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24g
RGVuaWVkJyBlcnJvcnMKLSAgICAgICAgICAgICAgICBqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBq
UXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgotCi0g
ICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKLSAgICAgICAg
ICAgICAgICByZXNwb25zZVRleHQgKTsKLQotICAgICAgICB9KS5jb21wbGV0ZSggY2FsbGJhY2sg
JiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7Ci0gICAgICAgICAgICBzZWxmLmVhY2goIGNh
bGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBd
ICk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotfTsKLQotCi0KLQot
alF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJl
dHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7Ci0gICAgICAg
IHJldHVybiBlbGVtID09PSBmbi5lbGVtOwotICAgIH0pLmxlbmd0aDsKLX07Ci0KLQotCi0KLXZh
ciBkb2NFbGVtID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBH
ZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVudAotICovCi1mdW5jdGlvbiBnZXRXaW5kb3coIGVs
ZW0gKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0u
bm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0VmlldzsKLX0KLQotalF1ZXJ5Lm9mZnNldCA9
IHsKLSAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgewotICAgICAg
ICB2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQs
IGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAotICAgICAgICAgICAgcG9zaXRpb24gPSBq
UXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICksCi0gICAgICAgICAgICBjdXJFbGVtID0galF1
ZXJ5KCBlbGVtICksCi0gICAgICAgICAgICBwcm9wcyA9IHt9OwotCi0gICAgICAgIC8vIFNldCBw
b3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVs
ZW0KLSAgICAgICAgaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7Ci0gICAgICAgICAgICBl
bGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKLSAgICAgICAgfQotCi0gICAgICAgIGN1
ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7Ci0gICAgICAgIGN1ckNTU1RvcCA9IGpRdWVyeS5j
c3MoIGVsZW0sICJ0b3AiICk7Ci0gICAgICAgIGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVt
LCAibGVmdCIgKTsKLSAgICAgICAgY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAi
YWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYKLSAgICAgICAgICAgICggY3Vy
Q1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoImF1dG8iKSA+IC0xOwotCi0gICAgICAgIC8v
IE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBs
ZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAotICAg
ICAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewotICAgICAgICAgICAgY3VyUG9zaXRpb24g
PSBjdXJFbGVtLnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBjdXJUb3AgPSBjdXJQb3NpdGlvbi50
b3A7Ci0gICAgICAgICAgICBjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKLQotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwg
MDsKLSAgICAgICAgICAgIGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSAp
IHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNl
dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewot
ICAgICAgICAgICAgcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSAr
IGN1clRvcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkg
ewotICAgICAgICAgICAgcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0Lmxl
ZnQgKSArIGN1ckxlZnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICJ1c2luZyIgaW4gb3B0
aW9ucyApIHsKLSAgICAgICAgICAgIG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsK
LQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3VyRWxlbS5jc3MoIHByb3BzICk7Ci0g
ICAgICAgIH0KLSAgICB9Ci19OwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBvZmZzZXQ6IGZ1
bmN0aW9uKCBvcHRpb25zICkgewotICAgICAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAg
ICB0aGlzIDoKLSAgICAgICAgICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBp
ICk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgZG9jRWxl
bSwgd2luLAotICAgICAgICAgICAgZWxlbSA9IHRoaXNbIDAgXSwKLSAgICAgICAgICAgIGJveCA9
IHsgdG9wOiAwLCBsZWZ0OiAwIH0sCi0gICAgICAgICAgICBkb2MgPSBlbGVtICYmIGVsZW0ub3du
ZXJEb2N1bWVudDsKLQotICAgICAgICBpZiAoICFkb2MgKSB7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLQotICAgICAgICBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLQot
ICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKLSAg
ICAgICAgaWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7Ci0gICAgICAg
ICAgICByZXR1cm4gYm94OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2
ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3IKLSAgICAgICAgLy8gQmxhY2tC
ZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKQotICAgICAgICBpZiAoIHR5cGVvZiBlbGVt
LmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3RydW5kZWZpbmVkICkgewotICAgICAgICAgICAg
Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLSAgICAgICAgfQotICAgICAgICB3
aW4gPSBnZXRXaW5kb3coIGRvYyApOwotICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgdG9w
OiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsCi0gICAgICAg
ICAgICBsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVm
dAotICAgICAgICB9OwotICAgIH0sCi0KLSAgICBwb3NpdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIGlmICggIXRoaXNbIDAgXSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
Ci0gICAgICAgIHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwKLSAgICAgICAgICAgIGVsZW0gPSB0
aGlzWyAwIF0sCi0gICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9
OwotCi0gICAgICAgIC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBh
cmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zm
c2V0IHBhcmVudAotICAgICAgICBpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9
PT0gImZpeGVkIiApIHsKLSAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGdldEJvdW5kaW5n
Q2xpZW50UmVjdCBpcyBhdmFpbGFibGUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZAot
ICAgICAgICAgICAgb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLQotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKLSAg
ICAgICAgICAgIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7Ci0KLSAgICAgICAg
ICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMKLSAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zm
c2V0KCk7Ci0gICAgICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsg
MCBdLCAiaHRtbCIgKSApIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQ
YXJlbnQub2Zmc2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBvZmZz
ZXRQYXJlbnQgYm9yZGVycwotICAgICAgICAgICAgcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnku
Y3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSApOwotICAgICAg
ICAgICAgcGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0s
ICJib3JkZXJMZWZ0V2lkdGgiLCB0cnVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJ0
cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zCi0gICAgICAgIHJldHVybiB7
Ci0gICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5
LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRydWUgKSwKLSAgICAgICAgICAgIGxlZnQ6IG9mZnNl
dC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVm
dCIsIHRydWUgKQotICAgICAgICB9OwotICAgIH0sCi0KLSAgICBvZmZzZXRQYXJlbnQ6IGZ1bmN0
aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
ICB2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKLQotICAg
ICAgICAgICAgd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZz
ZXRQYXJlbnQsICJodG1sIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9u
IiApID09PSAic3RhdGljIiApICkgewotICAgICAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IG9m
ZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJl
dHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0K
LS8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwotalF1ZXJ5LmVhY2go
IHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0s
IGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Ci0gICAgdmFyIHRvcCA9ICJwYWdlWU9mZnNldCIg
PT09IHByb3A7Ci0KLSAgICBqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsK
LSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFs
ICkgewotICAgICAgICAgICAgdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOwotCi0gICAgICAg
ICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIHJldHVybiB3
aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBpZiAoIHdpbiApIHsKLSAgICAgICAgICAgICAgICB3aW4uc2Nyb2xsVG8oCi0gICAg
ICAgICAgICAgICAgICAgICF0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVhPZmZzZXQsCi0gICAgICAg
ICAgICAgICAgICAgIHRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldAotICAgICAgICAgICAg
ICAgICk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbVsgbWV0
aG9kIF0gPSB2YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1
bWVudHMubGVuZ3RoLCBudWxsICk7Ci0gICAgfTsKLX0pOwotCi0vLyBBZGQgdGhlIHRvcC9sZWZ0
IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgotLy8gV2Via2l0IGJ1ZzogaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0Ci0vLyBnZXRDb21wdXRlZFN0
eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3Jp
Z2h0Ci0vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zm
c2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQotalF1ZXJ5LmVhY2goIFsgInRv
cCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKLSAgICBqUXVlcnkuY3NzSG9va3Nb
IHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLAotICAgICAgICBm
dW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0gICAgICAgICAgICBpZiAoIGNvbXB1dGVkICkg
ewotICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7Ci0gICAg
ICAgICAgICAgICAgLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8g
b2Zmc2V0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCAp
ID8KLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBd
ICsgInB4IiA6Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgKTsKLX0pOwotCi0KLS8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJX
aWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwot
alF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6ICJ3aWR0aCIgfSwgZnVuY3Rp
b24oIG5hbWUsIHR5cGUgKSB7Ci0gICAgalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiAr
IG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LCBmdW5jdGlvbiggZGVm
YXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKLSAgICAgICAgLy8gbWFyZ2luIGlzIG9ubHkgZm9yIG91
dGVySGVpZ2h0LCBvdXRlcldpZHRoCi0gICAgICAgIGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1
bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkgewotICAgICAgICAgICAgdmFyIGNoYWluYWJsZSA9IGFy
Z3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJv
b2xlYW4iICksCi0gICAgICAgICAgICAgICAgZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJn
aW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyAibWFyZ2luIiA6ICJib3JkZXIiICk7Ci0K
LSAgICAgICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2
YWx1ZSApIHsKLSAgICAgICAgICAgICAgICB2YXIgZG9jOwotCi0gICAgICAgICAgICAgICAgaWYg
KCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXMg
b2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUg
U2FmYXJpLCBidXQgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QgYSB3aG9sZSBs
b3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9u
OgotICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVy
eS9wdWxsLzc2NAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1
bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwotICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgIC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKLSAgICAgICAgICAg
ICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRv
YyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhl
ciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRb
V2lkdGgvSGVpZ2h0XSwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2hldmVyIGlzIGdyZWF0
ZXN0Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBu
YW1lIF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmJvZHlbICJvZmZzZXQiICsgbmFt
ZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBdLAotICAgICAgICAgICAgICAgICAgICAgICAgZG9j
WyAiY2xpZW50IiArIG5hbWUgXQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KLSAg
ICAgICAgICAgICAgICAgICAgLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwg
cmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdAotICAgICAgICAgICAgICAgICAg
ICBqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDoKLQotICAgICAgICAgICAgICAgICAg
ICAvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAg
ICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7Ci0gICAgICAgICAg
ICB9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVs
bCApOwotICAgICAgICB9OwotICAgIH0pOwotfSk7Ci0KLQotLy8gVGhlIG51bWJlciBvZiBlbGVt
ZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKLWpRdWVyeS5mbi5zaXpl
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMubGVuZ3RoOwotfTsKLQotalF1ZXJ5LmZu
LmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjazsKLQotCi0KLQotLy8gUmVnaXN0ZXIgYXMgYSBu
YW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90
aGVyCi0vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBj
b25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci0vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1v
ZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3QKLS8vIHdheSB0byBy
ZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1l
cyBhcmUKLS8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5
IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQotLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNy
ZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzCi0vLyB0byBj
YWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdv
cmsuCi1pZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsK
LSAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBq
UXVlcnk7Ci0gICAgfSk7Ci19Ci0KLQotCi0KLXZhcgotICAgIC8vIE1hcCBvdmVyIGpRdWVyeSBp
biBjYXNlIG9mIG92ZXJ3cml0ZQotICAgIF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAotCi0gICAg
Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKLSAgICBfJCA9IHdpbmRvdy4k
OwotCi1qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkgewotICAgIGlmICggd2lu
ZG93LiQgPT09IGpRdWVyeSApIHsKLSAgICAgICAgd2luZG93LiQgPSBfJDsKLSAgICB9Ci0KLSAg
ICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkgewotICAgICAgICB3aW5k
b3cualF1ZXJ5ID0gX2pRdWVyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4galF1ZXJ5OwotfTsKLQot
Ly8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbgotLy8gQU1EICgjNzEw
MiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykK
LS8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NikKLWlmICggdHlw
ZW9mIG5vR2xvYmFsID09PSBzdHJ1bmRlZmluZWQgKSB7Ci0gICAgd2luZG93LmpRdWVyeSA9IHdp
bmRvdy4kID0galF1ZXJ5OwotfQotCi0KLQotCi1yZXR1cm4galF1ZXJ5OwotCi19KSk7CmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21t
b24vYmFzZS5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212
Yy1jb21tb24vYmFzZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWJlZjgz
MTg5YzkxNWVlNzhlY2E4NDdmOTA4YzZkMDJkNThhNDAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25l
bnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAg
QEAKLWh0bWwsCi1ib2R5IHsKLSAgICBtYXJnaW46IDA7Ci0gICAgcGFkZGluZzogMDsKLX0KLQot
YnV0dG9uIHsKLSAgICBtYXJnaW46IDA7Ci0gICAgcGFkZGluZzogMDsKLSAgICBib3JkZXI6IDA7
Ci0gICAgYmFja2dyb3VuZDogbm9uZTsKLSAgICBmb250LXNpemU6IDEwMCU7Ci0gICAgdmVydGlj
YWwtYWxpZ246IGJhc2VsaW5lOwotICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwotICAgIGNvbG9y
OiBpbmhlcml0OwotICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKLSAgICAtbXMtYXBwZWFy
YW5jZTogbm9uZTsKLSAgICAtby1hcHBlYXJhbmNlOiBub25lOwotICAgIGFwcGVhcmFuY2U6IG5v
bmU7Ci19Ci0KLWJvZHkgewotICAgIGZvbnQ6IDE0cHggJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0
aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICBsaW5lLWhlaWdodDogMS40ZW07Ci0gICAgYmFj
a2dyb3VuZDogI2VhZWFlYSB1cmwoJ2JnLnBuZycpOwotICAgIGNvbG9yOiAjNGQ0ZDRkOwotICAg
IHdpZHRoOiA1NTBweDsKLSAgICBtYXJnaW46IDAgYXV0bzsKLSAgICAtd2Via2l0LWZvbnQtc21v
b3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNl
ZDsKLSAgICAtbXMtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwotICAgIC1vLWZvbnQtc21v
b3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Ci19
Ci0KLWJ1dHRvbiwKLWlucHV0W3R5cGU9ImNoZWNrYm94Il0gewotICBvdXRsaW5lOiBub25lOwot
fQotCi0jdG9kb2FwcCB7Ci0gICAgYmFja2dyb3VuZDogI2ZmZjsKLSAgICBiYWNrZ3JvdW5kOiBy
Z2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Ci0gICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKLSAg
ICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBi
b3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7Ci0gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6
IDJweDsKLSAgICBib3gtc2hhZG93OiAwIDJweCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCi0g
ICAgICAgICAgICAgICAgMCAyNXB4IDUwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTUpOwotfQotCi0j
dG9kb2FwcDpiZWZvcmUgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIGJvcmRlci1sZWZ0OiAxcHgg
c29saWQgI2Y1ZDZkNjsKLSAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjVkNmQ2OwotICAg
IHdpZHRoOiAycHg7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHRvcDogMDsKLSAgICBs
ZWZ0OiA0MHB4OwotICAgIGhlaWdodDogMTAwJTsKLX0KLQotI3RvZG9hcHAgaW5wdXQ6Oi13ZWJr
aXQtaW5wdXQtcGxhY2Vob2xkZXIgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotI3Rv
ZG9hcHAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsK
LSAgICBjb2xvcjogI2E5YTlhOTsKLX0KLQotI3RvZG9hcHAgaDEgewotICAgIHBvc2l0aW9uOiBh
YnNvbHV0ZTsKLSAgICB0b3A6IC0xMjBweDsKLSAgICB3aWR0aDogMTAwJTsKLSAgICBmb250LXNp
emU6IDcwcHg7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVy
OwotICAgIGNvbG9yOiAjYjNiM2IzOwotICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAu
Myk7Ci0gICAgdGV4dC1zaGFkb3c6IC0xcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gICAg
LXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwotICAgIC1tb3otdGV4
dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKLSAgICAtbXMtdGV4dC1yZW5kZXJpbmc6
IG9wdGltaXplTGVnaWJpbGl0eTsKLSAgICAtby10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdp
YmlsaXR5OwotICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Ci19Ci0KLSNo
ZWFkZXIgewotICAgIHBhZGRpbmctdG9wOiAxNXB4OwotICAgIGJvcmRlci1yYWRpdXM6IGluaGVy
aXQ7Ci19Ci0KLSNoZWFkZXI6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnJzsKLSAgICBwb3NpdGlv
bjogYWJzb2x1dGU7Ci0gICAgdG9wOiAwOwotICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6IDA7Ci0g
ICAgaGVpZ2h0OiAxNXB4OwotICAgIHotaW5kZXg6IDI7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4
IHNvbGlkICM2YzYxNWM7Ci0gICAgYmFja2dyb3VuZDogIzhkN2Q3NzsKLSAgICBiYWNrZ3JvdW5k
OiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJn
YmEoMTMyLCAxMTAsIDEwMCwgMC44KSksdG8ocmdiYSgxMDEsIDg0LCA3NiwgMC44KSkpOwotICAg
IGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwg
MTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2LCAwLjgpKTsKLSAgICBiYWNrZ3JvdW5kOiBsaW5l
YXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwgMTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwg
NzYsIDAuOCkpOwotICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDFweDsKLSAgICBib3JkZXIt
dG9wLXJpZ2h0LXJhZGl1czogMXB4OwotfQotCi0jbmV3LXRvZG8sCi0uZWRpdCB7Ci0gICAgcG9z
aXRpb246IHJlbGF0aXZlOwotICAgIG1hcmdpbjogMDsKLSAgICB3aWR0aDogMTAwJTsKLSAgICBm
b250LXNpemU6IDI0cHg7Ci0gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Ci0gICAgbGluZS1oZWln
aHQ6IDEuNGVtOwotICAgIGJvcmRlcjogMDsKLSAgICBvdXRsaW5lOiBub25lOwotICAgIGNvbG9y
OiBpbmhlcml0OwotICAgIHBhZGRpbmc6IDZweDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5
OwotICAgIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7
Ci0gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIC1tcy1ib3gtc2l6aW5nOiBi
b3JkZXItYm94OwotICAgIC1vLWJveC1zaXppbmc6IGJvcmRlci1ib3g7Ci0gICAgYm94LXNpemlu
ZzogYm9yZGVyLWJveDsKLSAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsK
LSAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbXMtZm9udC1zbW9v
dGhpbmc6IGFudGlhbGlhc2VkOwotICAgIC1vLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsK
LSAgICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Ci19Ci0KLSNuZXctdG9kbyB7Ci0gICAg
cGFkZGluZzogMTZweCAxNnB4IDE2cHggNjBweDsKLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgYmFj
a2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAyKTsKLSAgICB6LWluZGV4OiAyOwotICAgIGJveC1z
aGFkb3c6IG5vbmU7Ci19Ci0KLSNtYWluIHsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAg
ei1pbmRleDogMjsKLSAgICBib3JkZXItdG9wOiAxcHggZG90dGVkICNhZGFkYWQ7Ci19Ci0KLWxh
YmVsW2Zvcj0ndG9nZ2xlLWFsbCddIHsKLSAgICBkaXNwbGF5OiBub25lOwotfQotCi0jdG9nZ2xl
LWFsbCB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHRvcDogLTQycHg7Ci0gICAgbGVm
dDogLTRweDsKLSAgICB3aWR0aDogNDBweDsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAg
LyogTW9iaWxlIFNhZmFyaSAqLwotICAgIGJvcmRlcjogbm9uZTsKLX0KLQotI3RvZ2dsZS1hbGw6
YmVmb3JlIHsKLSAgICBjb250ZW50OiAnwrsnOwotICAgIGZvbnQtc2l6ZTogMjhweDsKLSAgICBj
b2xvcjogI2Q5ZDlkOTsKLSAgICBwYWRkaW5nOiAwIDI1cHggN3B4OwotfQotCi0jdG9nZ2xlLWFs
bDpjaGVja2VkOmJlZm9yZSB7Ci0gICAgY29sb3I6ICM3MzczNzM7Ci19Ci0KLSN0b2RvLWxpc3Qg
ewotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7
Ci19Ci0KLSN0b2RvLWxpc3QgbGkgewotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBmb250
LXNpemU6IDI0cHg7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjY2NjOwotfQotCi0j
dG9kby1saXN0IGxpOmxhc3QtY2hpbGQgewotICAgIGJvcmRlci1ib3R0b206IG5vbmU7Ci19Ci0K
LSN0b2RvLWxpc3QgbGkuZWRpdGluZyB7Ci0gICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKLSAgICBw
YWRkaW5nOiAwOwotfQotCi0jdG9kby1saXN0IGxpLmVkaXRpbmcgLmVkaXQgewotICAgIGRpc3Bs
YXk6IGJsb2NrOwotICAgIHdpZHRoOiA1MDZweDsKLSAgICBwYWRkaW5nOiAxM3B4IDE3cHggMTJw
eCAxN3B4OwotICAgIG1hcmdpbjogMCAwIDAgNDNweDsKLX0KLQotI3RvZG8tbGlzdCBsaS5lZGl0
aW5nIC52aWV3IHsKLSAgICBkaXNwbGF5OiBub25lOwotfQotCi0jdG9kby1saXN0IGxpIC50b2dn
bGUgewotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICB3aWR0aDogNDBweDsKLSAgICAvKiBh
dXRvLCBzaW5jZSBub24tV2ViS2l0IGJyb3dzZXJzIGRvZXNuJ3Qgc3VwcG9ydCBpbnB1dCBzdHls
aW5nICovCi0gICAgaGVpZ2h0OiBhdXRvOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0
b3A6IDA7Ci0gICAgYm90dG9tOiAwOwotICAgIG1hcmdpbjogYXV0byAwOwotICAgIC8qIE1vYmls
ZSBTYWZhcmkgKi8KLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBu
b25lOwotICAgIC1tcy1hcHBlYXJhbmNlOiBub25lOwotICAgIC1vLWFwcGVhcmFuY2U6IG5vbmU7
Ci0gICAgYXBwZWFyYW5jZTogbm9uZTsKLX0KLQotI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmFmdGVy
IHsKLSAgICBjb250ZW50OiAn4pyUJzsKLSAgICAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2
aXN1YWwgYWRqdXN0bWVudCAqLwotICAgIGxpbmUtaGVpZ2h0OiA0M3B4OwotICAgIGZvbnQtc2l6
ZTogMjBweDsKLSAgICBjb2xvcjogI2Q5ZDlkOTsKLSAgICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAg
I2JmYmZiZjsKLX0KLQotI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgewotICAg
IGNvbG9yOiAjODVhZGE3OwotICAgIHRleHQtc2hhZG93OiAwIDFweCAwICM2Njk5OTE7Ci0gICAg
Ym90dG9tOiAxcHg7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0jdG9kby1saXN0IGxp
IGxhYmVsIHsKLSAgICB3aGl0ZS1zcGFjZTogcHJlOwotICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdv
cmQ7Ci0gICAgcGFkZGluZzogMTVweCA2MHB4IDE1cHggMTVweDsKLSAgICBtYXJnaW4tbGVmdDog
NDVweDsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBsaW5lLWhlaWdodDogMS4yOwotICAgIC13
ZWJraXQtdHJhbnNpdGlvbjogY29sb3IgMC40czsKLSAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjRz
OwotfQotCi0jdG9kby1saXN0IGxpLmNvbXBsZXRlZCBsYWJlbCB7Ci0gICAgY29sb3I6ICNhOWE5
YTk7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLSN0b2RvLWxpc3Qg
bGkgLmRlc3Ryb3kgewotICAgIGRpc3BsYXk6IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRl
OwotICAgIHRvcDogMDsKLSAgICByaWdodDogMTBweDsKLSAgICBib3R0b206IDA7Ci0gICAgd2lk
dGg6IDQwcHg7Ci0gICAgaGVpZ2h0OiA0MHB4OwotICAgIG1hcmdpbjogYXV0byAwOwotICAgIGZv
bnQtc2l6ZTogMjJweDsKLSAgICBjb2xvcjogI2E4OGE4YTsKLSAgICAtd2Via2l0LXRyYW5zaXRp
b246IGFsbCAwLjJzOwotICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwotfQotCi0jdG9kby1saXN0
IGxpIC5kZXN0cm95OmhvdmVyIHsKLSAgICB0ZXh0LXNoYWRvdzogMCAwIDFweCAjMDAwLAotICAg
ICAgICAgICAgICAgICAwIDAgMTBweCByZ2JhKDE5OSwgMTA3LCAxMDcsIDAuOCk7Ci0gICAgLXdl
YmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7Ci0gICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4z
KTsKLSAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMyk7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgLmRlc3Ry
b3k6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfinJYnOwotfQotCi0jdG9kby1saXN0IGxpOmhvdmVy
IC5kZXN0cm95IHsKLSAgICBkaXNwbGF5OiBibG9jazsKLX0KLQotI3RvZG8tbGlzdCBsaSAuZWRp
dCB7Ci0gICAgZGlzcGxheTogbm9uZTsKLX0KLQotI3RvZG8tbGlzdCBsaS5lZGl0aW5nOmxhc3Qt
Y2hpbGQgewotICAgIG1hcmdpbi1ib3R0b206IC0xcHg7Ci19Ci0KLSNmb290ZXIgewotICAgIGNv
bG9yOiAjNzc3OwotICAgIHBhZGRpbmc6IDAgMTVweDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7
Ci0gICAgcmlnaHQ6IDA7Ci0gICAgYm90dG9tOiAtMzFweDsKLSAgICBsZWZ0OiAwOwotICAgIGhl
aWdodDogMjBweDsKLSAgICB6LWluZGV4OiAxOwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0K
LQotI2Zvb3RlcjpiZWZvcmUgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNv
bHV0ZTsKLSAgICByaWdodDogMDsKLSAgICBib3R0b206IDMxcHg7Ci0gICAgbGVmdDogMDsKLSAg
ICBoZWlnaHQ6IDUwcHg7Ci0gICAgei1pbmRleDogLTE7Ci0gICAgYm94LXNoYWRvdzogMCAxcHgg
MXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKLSAgICAgICAgICAgICAgICAwIDZweCAwIC0zcHggcmdi
YSgyNTUsIDI1NSwgMjU1LCAwLjgpLAotICAgICAgICAgICAgICAgIDAgN3B4IDFweCAtM3B4IHJn
YmEoMCwgMCwgMCwgMC4zKSwKLSAgICAgICAgICAgICAgICAwIDQzcHggMCAtNnB4IHJnYmEoMjU1
LCAyNTUsIDI1NSwgMC44KSwKLSAgICAgICAgICAgICAgICAwIDQ0cHggMnB4IC02cHggcmdiYSgw
LCAwLCAwLCAwLjIpOwotfQotCi0jdG9kby1jb3VudCB7Ci0gICAgZmxvYXQ6IGxlZnQ7Ci0gICAg
dGV4dC1hbGlnbjogbGVmdDsKLX0KLQotI2ZpbHRlcnMgewotICAgIG1hcmdpbjogMDsKLSAgICBw
YWRkaW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRl
OwotICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6IDA7Ci19Ci0KLSNmaWx0ZXJzIGxpIHsKLSAgICBk
aXNwbGF5OiBpbmxpbmU7Ci19Ci0KLSNmaWx0ZXJzIGxpIGEgewotICAgIGNvbG9yOiAjODM3NTZm
OwotICAgIG1hcmdpbjogMnB4OwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI2Zp
bHRlcnMgbGkgYS5zZWxlY3RlZCB7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLSNjbGVh
ci1jb21wbGV0ZWQgewotICAgIGZsb2F0OiByaWdodDsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7
Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAg
IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xKTsKLSAgICBmb250LXNpemU6IDExcHg7Ci0g
ICAgcGFkZGluZzogMCAxMHB4OwotICAgIGJvcmRlci1yYWRpdXM6IDNweDsKLSAgICBib3gtc2hh
ZG93OiAwIC0xcHggMCAwIHJnYmEoMCwgMCwgMCwgMC4yKTsKLX0KLQotI2NsZWFyLWNvbXBsZXRl
ZDpob3ZlciB7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE1KTsKLSAgICBib3gt
c2hhZG93OiAwIC0xcHggMCAwIHJnYmEoMCwgMCwgMCwgMC4zKTsKLX0KLQotI2luZm8gewotICAg
IG1hcmdpbjogNjVweCBhdXRvIDA7Ci0gICAgY29sb3I6ICNhNmE2YTY7Ci0gICAgZm9udC1zaXpl
OiAxMnB4OwotICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43
KTsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLSNpbmZvIGEgewotICAgIGNvbG9yOiBp
bmhlcml0OwotfQotCi0vKgotICAgIEhhY2sgdG8gcmVtb3ZlIGJhY2tncm91bmQgZnJvbSBNb2Jp
bGUgU2FmYXJpLgotICAgIENhbid0IHVzZSBpdCBnbG9iYWxseSBzaW5jZSBpdCBkZXN0cm95cyBj
aGVja2JveGVzIGluIEZpcmVmb3ggYW5kIE9wZXJhCi0qLwotCi1AbWVkaWEgc2NyZWVuIGFuZCAo
LXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApIHsKLSAgICAjdG9nZ2xlLWFsbCwKLSAg
ICAjdG9kby1saXN0IGxpIC50b2dnbGUgewotICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwotICAg
IH0KLQotICAgICN0b2RvLWxpc3QgbGkgLnRvZ2dsZSB7Ci0gICAgICAgIGhlaWdodDogNDBweDsK
LSAgICB9Ci0KLSAgICAjdG9nZ2xlLWFsbCB7Ci0gICAgICAgIHRvcDogLTU2cHg7Ci0gICAgICAg
IGxlZnQ6IC0xNXB4OwotICAgICAgICB3aWR0aDogNjVweDsKLSAgICAgICAgaGVpZ2h0OiA0MXB4
OwotICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKLSAgICAgICAgLW1z
LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKLSAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBk
ZWcpOwotICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgICAgIGFwcGVhcmFu
Y2U6IG5vbmU7Ci0gICAgfQotfQotCi0uaGlkZGVuIHsKLSAgICBkaXNwbGF5OiBub25lOwotfQot
Ci1ociB7Ci0gICAgbWFyZ2luOiAyMHB4IDA7Ci0gICAgYm9yZGVyOiAwOwotICAgIGJvcmRlci10
b3A6IDFweCBkYXNoZWQgI0M1QzVDNTsKLSAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNG
N0Y3Rjc7Ci19Ci0KLS5sZWFybiBhIHsKLSAgICBmb250LXdlaWdodDogbm9ybWFsOwotICAgIHRl
eHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogI2I4M2Y0NTsKLX0KLQotLmxlYXJuIGE6
aG92ZXIgewotICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotICAgIGNvbG9yOiAjNzg3
ZTdlOwotfQotCi0ubGVhcm4gaDMsCi0ubGVhcm4gaDQsCi0ubGVhcm4gaDUgewotICAgIG1hcmdp
bjogMTBweCAwOwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgbGluZS1oZWlnaHQ6IDEuMjsK
LSAgICBjb2xvcjogIzAwMDsKLX0KLQotLmxlYXJuIGgzIHsKLSAgICBmb250LXNpemU6IDI0cHg7
Ci19Ci0KLS5sZWFybiBoNCB7Ci0gICAgZm9udC1zaXplOiAxOHB4OwotfQotCi0ubGVhcm4gaDUg
ewotICAgIG1hcmdpbi1ib3R0b206IDA7Ci0gICAgZm9udC1zaXplOiAxNHB4OwotfQotCi0ubGVh
cm4gdWwgewotICAgIHBhZGRpbmc6IDA7Ci0gICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OwotfQot
Ci0ubGVhcm4gbGkgewotICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwotfQotCi0ubGVhcm4gcCB7Ci0g
ICAgZm9udC1zaXplOiAxNXB4OwotICAgIGZvbnQtd2VpZ2h0OiAzMDA7Ci0gICAgbGluZS1oZWln
aHQ6IDEuMzsKLSAgICBtYXJnaW4tdG9wOiAwOwotICAgIG1hcmdpbi1ib3R0b206IDA7Ci19Ci0K
LS5xdW90ZSB7Ci0gICAgYm9yZGVyOiBub25lOwotICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsK
LX0KLQotLnF1b3RlIHAgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnF1b3RlIHA6
YmVmb3JlIHsKLSAgICBjb250ZW50OiAn4oCcJzsKLSAgICBmb250LXNpemU6IDUwcHg7Ci0gICAg
b3BhY2l0eTogLjE1OwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0yMHB4Owot
ICAgIGxlZnQ6IDNweDsKLX0KLQotLnF1b3RlIHA6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfigJ0n
OwotICAgIGZvbnQtc2l6ZTogNTBweDsKLSAgICBvcGFjaXR5OiAuMTU7Ci0gICAgcG9zaXRpb246
IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQycHg7Ci0gICAgcmlnaHQ6IDNweDsKLX0KLQotLnF1
b3RlIGZvb3RlciB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQwcHg7
Ci0gICAgcmlnaHQ6IDA7Ci19Ci0KLS5xdW90ZSBmb290ZXIgaW1nIHsKLSAgICBib3JkZXItcmFk
aXVzOiAzcHg7Ci19Ci0KLS5xdW90ZSBmb290ZXIgYSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDVweDsK
LSAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0uc3BlZWNoLWJ1YmJsZSB7Ci0gICAg
cG9zaXRpb246IHJlbGF0aXZlOwotICAgIHBhZGRpbmc6IDEwcHg7Ci0gICAgYmFja2dyb3VuZDog
cmdiYSgwLCAwLCAwLCAuMDQpOwotICAgIGJvcmRlci1yYWRpdXM6IDVweDsKLX0KLQotLnNwZWVj
aC1idWJibGU6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0
ZTsKLSAgICB0b3A6IDEwMCU7Ci0gICAgcmlnaHQ6IDMwcHg7Ci0gICAgYm9yZGVyOiAxM3B4IHNv
bGlkIHRyYW5zcGFyZW50OwotICAgIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0
KTsKLX0KLQotLmxlYXJuLWJhciA+IC5sZWFybiB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwot
ICAgIHdpZHRoOiAyNzJweDsKLSAgICB0b3A6IDhweDsKLSAgICBsZWZ0OiAtMzAwcHg7Ci0gICAg
cGFkZGluZzogMTBweDsKLSAgICBib3JkZXItcmFkaXVzOiA1cHg7Ci0gICAgYmFja2dyb3VuZC1j
b2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAuNik7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uLXBy
b3BlcnR5OiBsZWZ0OwotICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGxlZnQ7Ci0gICAgLXdlYmtp
dC10cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKLSAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1
MDBtczsKLX0KLQotQG1lZGlhIChtaW4td2lkdGg6IDg5OXB4KSB7Ci0gICAgLmxlYXJuLWJhciB7
Ci0gICAgICAgIHdpZHRoOiBhdXRvOwotICAgICAgICBtYXJnaW46IDAgMCAwIDMwMHB4OwotICAg
IH0KLQotICAgIC5sZWFybi1iYXIgPiAubGVhcm4gewotICAgICAgICBsZWZ0OiA4cHg7Ci0gICAg
fQotCi0gICAgLmxlYXJuLWJhciAjdG9kb2FwcCB7Ci0gICAgICAgIHdpZHRoOiA1NTBweDsKLSAg
ICAgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQwcHggYXV0bzsKLSAgICB9Ci19CmRpZmYgLS1naXQg
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFz
ZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1v
bi9iYXNlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhlNWVhMDNhNjFhZDM2
Njc5YzE1ZWEwYWY2NDg5MTM3MWRiOWVhLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2Rv
bXZjLWNvbW1vbi9iYXNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLShmdW5j
dGlvbiAoKSB7Ci0gICAgJ3VzZSBzdHJpY3QnOwotCi0gICAgLy8gVW5kZXJzY29yZSdzIFRlbXBs
YXRlIE1vZHVsZQotICAgIC8vIENvdXJ0ZXN5IG9mIHVuZGVyc2NvcmVqcy5vcmcKLSAgICB2YXIg
XyA9IChmdW5jdGlvbiAoXykgewotICAgICAgICBfLmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVj
dCkgewotICAgICAgICAgICAgaWYgKCFvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4g
b2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh2YXIgYXJnc0luZGV4ID0g
MSwgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7
IGFyZ3NJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRz
W2FyZ3NJbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvciAodmFyIGtleSBpbiBpdGVyYWJsZSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKG9iamVjdFtrZXldID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxlW2tleV07Ci0gICAgICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8g
QnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJz
LCBjaGFuZ2UgdGhlCi0gICAgICAgIC8vIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1
c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4KLSAgICAgICAgXy50ZW1wbGF0ZVNldHRpbmdzID0g
ewotICAgICAgICAgICAgZXZhbHVhdGUgICAgOiAvPCUoW1xzXFNdKz8pJT4vZywKLSAgICAgICAg
ICAgIGludGVycG9sYXRlIDogLzwlPShbXHNcU10rPyklPi9nLAotICAgICAgICAgICAgZXNjYXBl
ICAgICAgOiAvPCUtKFtcc1xTXSs/KSU+L2cKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBXaGVu
IGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRpbmdzYCwgaWYgeW91IGRvbid0IHdhbnQgdG8gZGVm
aW5lIGFuCi0gICAgICAgIC8vIGludGVycG9sYXRpb24sIGV2YWx1YXRpb24gb3IgZXNjYXBpbmcg
cmVnZXgsIHdlIG5lZWQgb25lIHRoYXQgaXMKLSAgICAgICAgLy8gZ3VhcmFudGVlZCBub3QgdG8g
bWF0Y2guCi0gICAgICAgIHZhciBub01hdGNoID0gLyguKV4vOwotCi0gICAgICAgIC8vIENlcnRh
aW4gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVzY2FwZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBwdXQg
aW50byBhCi0gICAgICAgIC8vIHN0cmluZyBsaXRlcmFsLgotICAgICAgICB2YXIgZXNjYXBlcyA9
IHsKLSAgICAgICAgICAgICInIjogICAgICAiJyIsCi0gICAgICAgICAgICAnXFwnOiAgICAgJ1xc
JywKLSAgICAgICAgICAgICdccic6ICAgICAncicsCi0gICAgICAgICAgICAnXG4nOiAgICAgJ24n
LAotICAgICAgICAgICAgJ1x0JzogICAgICd0JywKLSAgICAgICAgICAgICdcdTIwMjgnOiAndTIw
MjgnLAotICAgICAgICAgICAgJ1x1MjAyOSc6ICd1MjAyOScKLSAgICAgICAgfTsKLQotICAgICAg
ICB2YXIgZXNjYXBlciA9IC9cXHwnfFxyfFxufFx0fFx1MjAyOHxcdTIwMjkvZzsKLQotICAgICAg
ICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydz
IGltcGxlbWVudGF0aW9uLgotICAgICAgICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxl
cyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsCi0gICAgICAgIC8v
IGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLgot
ICAgICAgICBfLnRlbXBsYXRlID0gZnVuY3Rpb24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKLSAg
ICAgICAgICAgIHZhciByZW5kZXI7Ci0gICAgICAgICAgICBzZXR0aW5ncyA9IF8uZGVmYXVsdHMo
e30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0dGluZ3MpOwotCi0gICAgICAgICAgICAvLyBDb21i
aW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlv
bi4KLSAgICAgICAgICAgIHZhciBtYXRjaGVyID0gbmV3IFJlZ0V4cChbCi0gICAgICAgICAgICAg
ICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01hdGNoKS5zb3VyY2UsCi0gICAgICAgICAgICAgICAg
KHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5vTWF0Y2gpLnNvdXJjZSwKLSAgICAgICAgICAgICAg
ICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlCi0gICAgICAgICAgICBdLmpv
aW4oJ3wnKSArICd8JCcsICdnJyk7Ci0KLSAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHRlbXBs
YXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5nIGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuCi0gICAg
ICAgICAgICB2YXIgaW5kZXggPSAwOwotICAgICAgICAgICAgdmFyIHNvdXJjZSA9ICJfX3ArPSci
OwotICAgICAgICAgICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2Nh
cGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgc291
cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgLnJl
cGxhY2UoZXNjYXBlciwgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICdcXCcgKyBlc2NhcGVzW21h
dGNoXTsgfSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXNjYXBlKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHNvdXJjZSArPSAiJytcbigoX190PSgiICsgZXNjYXBlICsgIikpPT1udWxsPycnOl8u
ZXNjYXBlKF9fdCkpK1xuJyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlm
IChpbnRlcnBvbGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgKz0gIicrXG4oKF9f
dD0oIiArIGludGVycG9sYXRlICsgIikpPT1udWxsPycnOl9fdCkrXG4nIjsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2YWx1YXRlKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFsdWF0ZSArICJcbl9fcCs9JyI7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOwot
ICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAg
ICAgc291cmNlICs9ICInO1xuIjsKLQotICAgICAgICAgICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBu
b3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS4KLSAgICAgICAg
ICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyAr
IHNvdXJjZSArICd9XG4nOwotCi0gICAgICAgICAgICBzb3VyY2UgPSAidmFyIF9fdCxfX3A9Jycs
X19qPUFycmF5LnByb3RvdHlwZS5qb2luLCIgKwotICAgICAgICAgICAgICAgICJwcmludD1mdW5j
dGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xuIiArCi0gICAgICAgICAgICAg
ICAgc291cmNlICsgInJldHVybiBfX3A7XG4iOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAg
ICAgICAgICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2Jq
JywgJ18nLCBzb3VyY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoZSkgewotICAgICAgICAgICAg
ICAgIGUuc291cmNlID0gc291cmNlOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkYXRhKSByZXR1cm4gcmVuZGVyKGRhdGEsIF8pOwot
ICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAg
ICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlzLCBkYXRhLCBfKTsKLSAgICAgICAgICAgIH07Ci0K
LSAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIHNvdXJjZSBhcyBh
IGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxhdGlvbi4KLSAgICAgICAgICAgIHRlbXBsYXRlLnNv
dXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRpbmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xu
JyArIHNvdXJjZSArICd9JzsKLQotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwotICAgICAg
ICB9OwotCi0gICAgICAgIHJldHVybiBfOwotICAgIH0pKHt9KTsKLQotICAgIGlmIChsb2NhdGlv
bi5ob3N0bmFtZSA9PT0gJ3RvZG9tdmMuY29tJykgewotICAgICAgICB3aW5kb3cuX2dhcSA9IFtb
J19zZXRBY2NvdW50JywnVUEtMzEwODEwNjItMSddLFsnX3RyYWNrUGFnZXZpZXcnXV07KGZ1bmN0
aW9uKGQsdCl7dmFyIGc9ZC5jcmVhdGVFbGVtZW50KHQpLHM9ZC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSh0KVswXTtnLnNyYz0nLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnO3MucGFyZW50
Tm9kZS5pbnNlcnRCZWZvcmUoZyxzKX0oZG9jdW1lbnQsJ3NjcmlwdCcpKTsKLSAgICB9Ci0KLSAg
ICBmdW5jdGlvbiByZWRpcmVjdCgpIHsKLSAgICAgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09
PSAndGFzdGVqcy5naXRodWIuaW8nKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gbG9j
YXRpb24uaHJlZi5yZXBsYWNlKCd0YXN0ZWpzLmdpdGh1Yi5pby90b2RvbXZjJywgJ3RvZG9tdmMu
Y29tJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsKLSAg
ICAgICAgdmFyIGJhc2U7Ci0KLSAgICAgICAgWy9sYWJzLywgL1x3Ki1leGFtcGxlcy9dLmZvckVh
Y2goZnVuY3Rpb24gKGhyZWYpIHsKLSAgICAgICAgICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhy
ZWYubWF0Y2goaHJlZik7Ci0KLSAgICAgICAgICAgIGlmICghYmFzZSAmJiBtYXRjaCkgewotICAg
ICAgICAgICAgICAgIGJhc2UgPSBsb2NhdGlvbi5ocmVmLmluZGV4T2YobWF0Y2gpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5zdWJz
dHIoMCwgYmFzZSk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZ2V0RmlsZShmaWxlLCBjYWxsYmFj
aykgewotICAgICAgICBpZiAoIWxvY2F0aW9uLmhvc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBj
b25zb2xlLmluZm8oJ01pc3MgdGhlIGluZm8gYmFyPyBSdW4gVG9kb01WQyBmcm9tIGEgc2VydmVy
IHRvIGF2b2lkIGEgY3Jvc3Mtb3JpZ2luIGVycm9yLicpOwotICAgICAgICB9Ci0KLSAgICAgICAg
dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwotCi0gICAgICAgIHhoci5vcGVuKCdHRVQn
LCBmaW5kUm9vdCgpICsgZmlsZSwgdHJ1ZSk7Ci0gICAgICAgIHhoci5zZW5kKCk7Ci0KLSAgICAg
ICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgIGlmICh4aHIuc3RhdHVz
ID09PSAyMDAgJiYgY2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIucmVz
cG9uc2VUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBmdW5j
dGlvbiBMZWFybihsZWFybkpTT04sIGNvbmZpZykgewotICAgICAgICBpZiAoISh0aGlzIGluc3Rh
bmNlb2YgTGVhcm4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExlYXJuKGxlYXJuSlNPTiwg
Y29uZmlnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciB0ZW1wbGF0ZSwgZnJhbWV3b3JrOwot
Ci0gICAgICAgIGlmICh0eXBlb2YgbGVhcm5KU09OICE9PSAnb2JqZWN0JykgewotICAgICAgICAg
ICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsZWFybkpTT04gPSBKU09OLnBhcnNlKGxlYXJuSlNP
Tik7Ci0gICAgICAgICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZykgewotICAgICAg
ICAgICAgdGVtcGxhdGUgPSBjb25maWcudGVtcGxhdGU7Ci0gICAgICAgICAgICBmcmFtZXdvcmsg
PSBjb25maWcuZnJhbWV3b3JrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF0ZW1wbGF0ZSAm
JiBsZWFybkpTT04udGVtcGxhdGVzKSB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNP
Ti50ZW1wbGF0ZXMudG9kb212YzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZnJhbWV3b3Jr
ICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZyYW1ld29ya10nKSkgewotICAgICAg
ICAgICAgZnJhbWV3b3JrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZnJhbWV3b3Jr
XScpLmdldEF0dHJpYnV0ZSgnZGF0YS1mcmFtZXdvcmsnKTsKLSAgICAgICAgfQotCi0KLSAgICAg
ICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNPTltmcmFtZXdvcmtdKSB7Ci0gICAgICAgICAgICB0
aGlzLmZyYW1ld29ya0pTT04gPSBsZWFybkpTT05bZnJhbWV3b3JrXTsKLSAgICAgICAgICAgIHRo
aXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLQotICAgICAgICAgICAgdGhpcy5hcHBlbmQoKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIExlYXJuLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAo
KSB7Ci0gICAgICAgIHZhciBhc2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FzaWRlJyk7
Ci0gICAgICAgIGFzaWRlLmlubmVySFRNTCA9IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhp
cy5mcmFtZXdvcmtKU09OKTsKLSAgICAgICAgYXNpZGUuY2xhc3NOYW1lID0gJ2xlYXJuJzsKLQot
ICAgICAgICAvLyBMb2NhbGl6ZSBkZW1vIGxpbmtzCi0gICAgICAgIHZhciBkZW1vTGlua3MgPSBh
c2lkZS5xdWVyeVNlbGVjdG9yQWxsKCcuZGVtby1saW5rJyk7Ci0gICAgICAgIEFycmF5LnByb3Rv
dHlwZS5mb3JFYWNoLmNhbGwoZGVtb0xpbmtzLCBmdW5jdGlvbiAoZGVtb0xpbmspIHsKLSAgICAg
ICAgICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGlu
ay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGRvY3VtZW50
LmJvZHkuY2xhc3NOYW1lID0gKGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBsZWFybi1iYXIn
KS50cmltKCk7Ci0gICAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRl
ckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsKLSAgICB9OwotCi0gICAgcmVkaXJlY3QoKTsKLSAg
ICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVhcm4pOwotfSkoKTsKZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcgYi9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5n
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmE3NjAwODI1ZWUxMWYyMTg0OWVkNDc1
NDk5YzdkMWVjYmNjODcwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
CkdJVCBiaW5hcnkgcGF0Y2gKbGl0ZXJhbCAwCkhjbVY/ZDAwMDAxCgpsaXRlcmFsIDIxMjYKemNt
Vi1VMihrQnhQKTxoOzNLfExrMDAwZTFOSkxUcTAwM2tGMDAza0gwe3tSMzRVQiFxMDAwMENQKXQt
cz8oWGpFCno+Kzl5YD1ISzdudD1+M3QwMDBPNU5rbDxaY3dUanUoUTR2fjdLV0VXI1ltP2xLX3Y7
VG18IUZjKUBOd0VubXRzaAp6eCFPfno4MUpUM3BGc20+bT0wNGhWYV9sWGxfYm09K007PWVJPCUk
ck8ydGFgc3VoKlNyI1BPdyo/YWRxIU8hQ1YKeiowJmIpcmtDQ0VWKTFuSXVpTEJudFVILU1KSTsm
cVlnenxkQE5obm5fYWJpMmdgcHU0TkFNVmlkM2hTJT9xdXp+CnpqbEpmKHg4Y2o8UEdjam4qSith
eyZINXAqbjUkNWUzPzxLQ2M/bzA2bUFzTlNiZ1BXTz9QeiNDem48IT17PntWUwp6VVZFUDFtc2c5
YF5PRlVoU081cnRYSGhSbHlVMmk+NiRCVD1nbEdge0psY3RHSHJ3UkltKTZCdXU2NWpMUW5eSDgK
enZsOWxacVVCQSslcXZNNVhDK3lZQG1mQShZQn5YUD1lfDY8eyUkXmVVOG5ySz92MmNjYkBKb201
Q0c+cktBTDdKCnpwbEhFSWF2VnB8MHAxJm0hR2BUaT88N2laO31ARzcjWil9S20lMiFGSG5RMCom
P1BMUilHIUhBYUhnVSNjfCRkegp6cGojMEhtZWFkSWU+YCMpPUpqa2J7Qj1GS25VM3BjLSZZQGpf
ajYoaDRZfitVcTxQVTM2Qzs1Yj1NXkZgPXAxZEkKems8Q1FPUE5hNz4hXko9TEh1bngxeGk0UVhL
LVl7Jk1vVDhreTZWYjljfFdobk93Rn5jPTN6T3k4YWdrdGxpUzYjCnpgIzhGYDlIKUQ9Ym1rOUI1
TW5XJl9yIylmJGMrOyRMU3ItQF5BbjhkaGN+SXF1dXY+ak9LN3B3N0xKOyZYMGkxQwp6R01zSGRQ
MU9zQG55JCRqIT5YQWlpJTdicDVrPmBweU5BIX5lcGIpKClwOXpSNFlsNno9VX17Q0lkaDF6KEZw
QW8KelFJVyE7MHpwQ3lDNCo3WUxrWkNPQGN1bDBSXyZ6Z2hzQThFayl6JTwhcC1idnNzcGxZWTJ9
UDshdjRDWWo5a21GCnpiMGJOX200VipmXllaTW9iMihqM3BLan43diNadGtzPUlvK3tzdSVXaXVr
ZEpIJGI/ZlpraUE9UFlfM09oREJrbwp6KExUUUhZJkZeXjJoRy1ZYCpaOTN2Yn5jPyooSmNoRGpU
ZkNzP3pSbSpgKk4qVi0kPT9RcXRoblNyKj9PUzNzaksKem88X1VeZnt+YWc2MHVsPmpOcEthOTJ7
QE5IK1NzdFglQH14QipKayFsfVBaMWNDbEluc359NV4hUm5jVWsqcm1BCnolU0lWZ3Q1OEVReExK
K09pRnE8eXU0ZU9EfDlMdDNkTnNlZnhPdXEpRCYkXyVqMERncUN5MWd6Y3x0VEQzKm1lZQp6ez0l
fDxgYH1fSHlwaE91ezspeGtSZytRbkhDQzNUZitrc3BxVjYqfFFLLVJjcUR9ND5La0J1d3F1eVpM
VXB8Z3IKelBVYlViRmJCclBkMXhPYF5DKnItaTNwOSpGIyhPQmghNFd5QGFDJiohfE98R1hjakRB
JlloRns7Y0Q3Km8oR1NeCnpAcFFTRTcpeF84MT1ReWplNipMUSNUWHUtNyhvO1M4dTN0cERBPFNn
Y0tjS09wbUE7PUhCWlNAT0ZUQF9YT3Z4cQp6Kk58M0tMeXRnekg2R1UmJlVvYzRaems0bHVtM1B7
OT9mcEk0K1FHUEordjZgMWxmUnEzTGNTKihNKldLK3xiJU8KemUkej4wX2RkaiVobUNzcGVYZGhZ
Un0taTlBPUNgRW9DaFVZdUh+XnghOSt8JihQZ2IqPkNrPD05anwpKkB4eWZUCnpwUCMrS3Q8fTM5
YnwzV2w0ZnhUKCtHP2FIPmdHXmRATUVhVU9KUmZ5NTVUdEZJN15ZKVZ1TVU9N1BwMHk1NWpTfgp6
K1RKKWlnTXlycWtYO3dVOGo2OGlJRHRxSlloU19EM19PZW0tQGc2bWVfUmZpUX11VF9LLUEtOXFH
JX1nazNFOWMKeiE4YEtnc01OWG0pYmVsb1BmTXFsKnwmJE0+MXFgaSFjWSlSRlluak5ZdSpnU3ZA
OFhlYlY3JX14WUw+NilHSlBKCnpKcEE3SzMxbGNKdUlGS1N3LXt4NEZYMEsyQXopflhnPGBzT3Uk
NHxePE1DN0AreGJ3eHNHZ1R2SklBTGpQezY4TAp6OEFZdVNHUzBHVWdrNldgdjRXO1J5KnVvRVRu
dWxQaXw1NzMlbHYqWnh3I3Y2eVVRXk1PZmNwVCNWOFJJRFYjI04KekQxYCtBZW1zT2gpd2JXREV4
VmNmcEt6KWp5Vj08fiZaWFBnNmN8WkRFN1U0Yms8RF4+LSheWEpYNFl6b2lOUnZMCnp5dVk3fjI2
dy1QXlp3JTZGfXNoQndWMiQwMmM4UnNTVXk2ZE05MmRpQ0F4aVgzSVVxc3E1aWc2PlVfIVZ5KnE1
JAp6am19MTZ0SnIrUVomVD9Ia2twZUl3VlgtcjFFST1AJVpsdDs2PHR3SDg2SUQ+ZyptaiZFIUEp
KSVnWEo9eDZ1I2wKemNLRVA+Yng0cnFWKmtgQkJyWiRNcWp0e1RzSGN4VUg+OylpQUt9QihLaWxh
JlZEJWI/Nm0mXjBXSzReJkVaTkFJCno4QU1Zc18lJEQlfE0rQCtjUXFMLWhpNHlHPmgqandkaWkh
VzF7fXA+Wmh3Rll0XzRTdTFralk5PGJBWmp6fjllawp6X0RpYXIrQWZKRlBfOUB5bVVvJEtXPjwt
NWAhJFZOT0kxeShFRFNINFdwQ2lqRV8+YWwhTnQ9XmVWRVIjdUoxPWIKejtCV0YySWd5RjVMZXhW
K3llYyRLaW47QWlAbXlvO0c+ekomanJkVyNlY1hoSVpwaDVPWXF3X1BFZmNGNTY8TzE5CnpMKThy
IUtNKClpZjBgQD9XNChKZGMpN1dvUEdeJj0kPHpVc00rSENXYWtDXjN0WnhrK1BqUUd9Qj5aNTxa
NlZ4dwp6QkBIclYkJmx+QFRhajcwcGNle2lTdVJMc1VjekRZXzVUbkRxOFB5X1Ezd2hgRDghNGpL
O3ZGZFJQK1EwPXpKeSoKenp1V2QlIWFpQER7fCpKPEk7T0QmaSVse0pwLTgqUHUzVkdMV2l5azZ2
I1htUXF3YC0rJWUkfENKdypAYDV6YjM8CnpFfXojO2tSaEwmcTVQREc2QG1tKiQ+WnVfWlpFI3Ez
TWMrTiYxT143aG9oOVFSN2ArTCRjQlA1cHFHPWZxQTB1aAp6VUJ1a2F4VEZtSCk8fFhidnAyYz1I
U2JOa3BYdzczYTVsdjdWJGpiOTIjeVoxNDFAJFg/Rn1KdDhnSVU3V202bTkKej9lXzs7enNubTZg
TFplUD5UPSQpS3I+Wj9rcipVbUZxUjd6eDBDNl5ibWNzY0AxQUd0d19yTkg+LVhtJGQqfFE8Cnpu
JjFMbjB1Nz1sJklMcz4lQ2tKcGBEaUc5RjE4eDROZStsZzwjaT9lN2pMJXg7NFpuUmtOXk14MDcq
cW9NNk48JApFZig+ME4hMmtkTgoKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvY3Jv
c3Nkb21haW4ueG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9jcm9zc2RvbWFpbi54bWwKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMGMxNmE3YTA3YjM3ZTVkNWY3ZTBlNTZjODI5ZjcyMDA2NzQ1ODQwMwotLS0gL2Rldi9u
dWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvY3Jvc3Nkb21haW4ueG1sCkBAIC0wLDAgKzEs
MTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGNyb3NzLWRvbWFpbi1wb2xp
Y3kgU1lTVEVNICJodHRwOi8vd3d3LmFkb2JlLmNvbS94bWwvZHRkcy9jcm9zcy1kb21haW4tcG9s
aWN5LmR0ZCI+Cis8Y3Jvc3MtZG9tYWluLXBvbGljeT4KKyAgPCEtLSBSZWFkIHRoaXM6IHd3dy5h
ZG9iZS5jb20vZGV2bmV0L2FydGljbGVzL2Nyb3NzZG9tYWluX3BvbGljeV9maWxlX3NwZWMuaHRt
bCAtLT4KKworICA8IS0tIE1vc3QgcmVzdHJpY3RpdmUgcG9saWN5OiAtLT4KKyAgPHNpdGUtY29u
dHJvbCBwZXJtaXR0ZWQtY3Jvc3MtZG9tYWluLXBvbGljaWVzPSJub25lIi8+CisKKyAgPCEtLSBM
ZWFzdCByZXN0cmljdGl2ZSBwb2xpY3k6IC0tPgorICA8IS0tCisgIDxzaXRlLWNvbnRyb2wgcGVy
bWl0dGVkLWNyb3NzLWRvbWFpbi1wb2xpY2llcz0iYWxsIi8+CisgIDxhbGxvdy1hY2Nlc3MtZnJv
bSBkb21haW49IioiIHRvLXBvcnRzPSIqIiBzZWN1cmU9ImZhbHNlIi8+CisgIDxhbGxvdy1odHRw
LXJlcXVlc3QtaGVhZGVycy1mcm9tIGRvbWFpbj0iKiIgaGVhZGVycz0iKiIgc2VjdXJlPSJmYWxz
ZSIvPgorICAtLT4KKzwvY3Jvc3MtZG9tYWluLXBvbGljeT4KZGlmZiAtLWdpdCBhL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvaW5kZXguaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbApp
bmRleCAxNTkwOTc0ZWY5NjEzYTI4Nzk1NzM5MGIxYWE4YTRkYTQ2Yzg5MDNhLi41ODMyZGY3YjBj
MmMyMjkwNzk0MWQyMGVhYzU2OTUwYzczY2E1ZmZkIDEwMDY0NAotLS0gYS9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2luZGV4Lmh0bWwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9pbmRleC5odG1sCkBA
IC0xLDc4ICsxLDI0IEBACi08IWRvY3R5cGUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIiBkYXRhLWZy
YW1ld29yaz0iZW1iZXJqcyI+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0
Zi04Ij4KLSAgICAgICAgPHRpdGxlPmVtYmVyLmpzIOKAoiBUb2RvTVZDPC90aXRsZT4KLSAgICAg
ICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMt
Y29tbW9uL2Jhc2UuY3NzIj4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxzY3Jp
cHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMiIGRhdGEtdGVtcGxhdGUtbmFtZT0idG9kb3MiPgot
ICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InRvZG9hcHAiPgotICAgICAgICAgICAgICAgIDxoZWFk
ZXIgaWQ9ImhlYWRlciI+Ci0gICAgICAgICAgICAgICAgICAgIDxoMT50b2RvczwvaDE+Ci0gICAg
ICAgICAgICAgICAgICAgIHt7aW5wdXQgaWQ9Im5ldy10b2RvIiB0eXBlPSJ0ZXh0IiB2YWx1ZT1u
ZXdUaXRsZSBhY3Rpb249ImNyZWF0ZVRvZG8iIHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJl
IGRvbmU/In19Ci0gICAgICAgICAgICAgICAgPC9oZWFkZXI+Ci0gICAgICAgICAgICAgICAge3sj
aWYgbGVuZ3RofX0KLSAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9Im1haW4iPgotICAg
ICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPSJ0b2RvLWxpc3QiPgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHt7I2VhY2ggZmlsdGVyZWRUb2RvcyBpdGVtQ29udHJvbGxlcj0idG9kbyJ9
fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkge3tiaW5kLWF0dHIgY2xhc3M9
ImlzQ29tcGxldGVkOmNvbXBsZXRlZCBpc0VkaXRpbmc6ZWRpdGluZyJ9fT4KLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHt7I2lmIGlzRWRpdGluZ319Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlZGl0LXRvZG8gY2xhc3M9ImVkaXQiIHZhbHVl
PWJ1ZmZlcmVkVGl0bGUgZm9jdXMtb3V0PSJkb25lRWRpdGluZyIgaW5zZXJ0LW5ld2xpbmU9ImRv
bmVFZGl0aW5nIiBlc2NhcGUtcHJlc3M9ImNhbmNlbEVkaXRpbmcifX0KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHt7ZWxzZX19Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAge3tpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9InRvZ2dsZSIgY2hl
Y2tlZD1pc0NvbXBsZXRlZH19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgPGxhYmVsIHt7YWN0aW9uICJlZGl0VG9kbyIgb249ImRvdWJsZUNsaWNrIn19Pnt7dGl0bGV9
fTwvbGFiZWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRv
biB7e2FjdGlvbiAicmVtb3ZlVG9kbyJ9fSBjbGFzcz0iZGVzdHJveSI+PC9idXR0b24+Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ey9pZn19Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7
L2VhY2h9fQotICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICAgICAgICAg
ICAgICAgIHt7aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtYWxsIiBjaGVja2VkPWFs
bEFyZURvbmV9fQotICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICAgICAg
ICAgICAgIDxmb290ZXIgaWQ9ImZvb3RlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3Bh
biBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57e3JlbWFpbmluZy5sZW5ndGh9fTwvc3Ryb25nPiB7
e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5nLmxlbmd0aH19IGxlZnQ8L3NwYW4+Ci0gICAgICAg
ICAgICAgICAgICAgICAgICA8dWwgaWQ9ImZpbHRlcnMiPgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sjbGluay10byAi
dG9kb3MuaW5kZXgiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFsbHt7L2xpbmstdG99fQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rv
cy5hY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFjdGl2ZXt7L2xpbmstdG99fQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rv
cy5jb21wbGV0ZWQiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUNvbXBsZXRlZHt7L2xpbmstdG99
fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAg
ICAgICA8L3VsPgotICAgICAgICAgICAgICAgICAgICAgICAge3sjaWYgY29tcGxldGVkLmxlbmd0
aH19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY2xlYXItY29tcGxl
dGVkIiB7e2FjdGlvbiAiY2xlYXJDb21wbGV0ZWQifX0+Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIENsZWFyIGNvbXBsZXRlZCAoe3tjb21wbGV0ZWQubGVuZ3RofX0pCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7
ey9pZn19Ci0gICAgICAgICAgICAgICAgICAgIDwvZm9vdGVyPgotICAgICAgICAgICAgICAgIHt7
L2lmfX0KLSAgICAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgICAgIDxmb290ZXIgaWQ9Imlu
Zm8iPgotICAgICAgICAgICAgICAgIDxwPkRvdWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4K
LSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCBieQotICAg
ICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS90b21kYWxlIj5Ub20g
RGFsZTwvYT4sCi0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29t
L2FkZHlvc21hbmkiPkFkZHkgT3NtYW5pPC9hPgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAg
ICAgICAgICAgICA8cD5QYXJ0IG9mIDxhIGhyZWY9Imh0dHA6Ly90b2RvbXZjLmNvbSI+VG9kb01W
QzwvYT48L3A+Ci0gICAgICAgICAgICA8L2Zvb3Rlcj4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAg
ICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMi
Pjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9qcXVlcnkv
anF1ZXJ5LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVu
dHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBz
cmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXIvZW1iZXIuanMiPjwvc2NyaXB0PgotICAgICAgICA8
c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9lbWJlci1kYXRhL2VtYmVyLWRhdGEuanMiPjwv
c2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2Nh
bHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3JhZ2VfYWRhcHRlci5qcyI+PC9zY3JpcHQ+Ci0gICAg
ICAgIDxzY3JpcHQgc3JjPSJqcy9hcHAuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNy
Yz0ianMvcm91dGVyLmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL21vZGVs
cy90b2RvLmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL2NvbnRyb2xsZXJz
L3RvZG9zX2NvbnRyb2xsZXIuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMv
Y29udHJvbGxlcnMvdG9kb19jb250cm9sbGVyLmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlw
dCBzcmM9ImpzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNj
cmlwdCBzcmM9ImpzL3ZpZXdzL3RvZG9zX3ZpZXcuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2Ny
aXB0IHNyYz0ianMvaGVscGVycy9wbHVyYWxpemUuanMiPjwvc2NyaXB0PgotICAgIDwvYm9keT4K
KzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0
Zi04Ij4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklF
PWVkZ2UiPgorICAgIDx0aXRsZT5Ub2RvbXZjPC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJkZXNj
cmlwdGlvbiIgY29udGVudD0iIj4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0i
d2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgorICAgIDxiYXNlIGhyZWY9Ii9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzIiAvPgorICAgIAorPG1ldGEgbmFtZT0idG9kb212Yy9jb25maWcv
ZW52aXJvbm1lbnQiIGNvbnRlbnQ9IiU3QiUyMm1vZHVsZVByZWZpeCUyMiUzQSUyMnRvZG9tdmMl
MjIlMkMlMjJlbnZpcm9ubWVudCUyMiUzQSUyMnByb2R1Y3Rpb24lMjIlMkMlMjJiYXNlVVJMJTIy
JTNBbnVsbCUyQyUyMmxvY2F0aW9uVHlwZSUyMiUzQSUyMmF1dG8lMjIlMkMlMjJFbWJlckVOViUy
MiUzQSU3QiUyMkZFQVRVUkVTJTIyJTNBJTdCJTdEJTdEJTJDJTIyQVBQJTIyJTNBJTdCJTIybmFt
ZSUyMiUzQSUyMnRvZG9tdmMlMjIlMkMlMjJ2ZXJzaW9uJTIyJTNBJTIyMC4wLjArNTBkNDZiNGMl
MjIlN0QlMkMlMjJleHBvcnRBcHBsaWNhdGlvbkdsb2JhbCUyMiUzQWZhbHNlJTdEIiAvPgorCisg
ICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3Nl
dHMvdmVuZG9yLTdiNWM5ODUyMDkxMGFmYTU4ZDc0ZTA1ZWM4NmNkODczLmNzcyI+CisgICAgPGxp
bmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9k
b212Yy1kNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZS5jc3MiPgorCisgIDwvaGVhZD4K
KyAgPGJvZHk+CisgICAgCisgICAgPHNjcmlwdCBzcmM9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fz
c2V0cy92ZW5kb3ItOTgzNmFjOGIwMTZmY2VhNmY4OWNjZjkyOTE3NzcyZjYuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy1m
ZGQyYzQ4Y2Y2NzU3NTNkZTRhNzljODU3MzQzZTIzZi5qcyI+PC9zY3JpcHQ+CisKKyAgICAKKyAg
PC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9hcHAu
anMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2FwcC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggYzYwZjgxZjU2NGRjZTI0NTczN2E4MmMyNTg2OTI3MGYxNjI1MWRjNS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2pzL2FwcC5qcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLypnbG9iYWwgRW1i
ZXIsIERTLCBUb2Rvczp0cnVlICovCi13aW5kb3cuVG9kb3MgPSBFbWJlci5BcHBsaWNhdGlvbi5j
cmVhdGUoKTsKLQotVG9kb3MuQXBwbGljYXRpb25BZGFwdGVyID0gRFMuTFNBZGFwdGVyLmV4dGVu
ZCh7Ci0gICAgbmFtZXNwYWNlOiAndG9kb3MtZW1iZXJqcycKLX0pOwpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2RvX2NvbnRyb2xsZXIuanMgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcwpkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmZTgxMDJlZGRlYWJhY2IwZjQ2NWFjM2I1YjUzMjcz
YzE0OWE1Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9fY29udHJvbGxlci5qcworKysg
L2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLwotJ3Vz
ZSBzdHJpY3QnOwotCi1Ub2Rvcy5Ub2RvQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xs
ZXIuZXh0ZW5kKHsKLSAgICBpc0VkaXRpbmc6IGZhbHNlLAotCi0gICAgLy8gV2UgdXNlIHRoZSBi
dWZmZXJlZFRpdGxlIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZgotICAgIC8vIHRoZSBt
b2RlbCdzIHRpdGxlIHNvIHRoYXQgd2UgY2FuIHJvbGwgaXQgYmFjayBsYXRlciBpbiB0aGUKLSAg
ICAvLyBgY2FuY2VsRWRpdGluZ2AgYWN0aW9uLgotICAgIGJ1ZmZlcmVkVGl0bGU6IEVtYmVyLmNv
bXB1dGVkLm9uZVdheSgndGl0bGUnKSwKLQotICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZWRpdFRv
ZG86IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcnLCB0cnVl
KTsKLSAgICAgICAgfSwKLQotICAgICAgICBkb25lRWRpdGluZzogZnVuY3Rpb24gKCkgewotICAg
ICAgICAgICAgdmFyIGJ1ZmZlcmVkVGl0bGUgPSB0aGlzLmdldCgnYnVmZmVyZWRUaXRsZScpLnRy
aW0oKTsKLQotICAgICAgICAgICAgaWYgKEVtYmVyLmlzRW1wdHkoYnVmZmVyZWRUaXRsZSkpIHsK
LSAgICAgICAgICAgICAgICAvLyBUaGUgYGRvbmVFZGl0aW5nYCBhY3Rpb24gZ2V0cyBzZW50IHR3
aWNlIHdoZW4gdGhlIHVzZXIgaGl0cwotICAgICAgICAgICAgICAgIC8vIGVudGVyIChvbmNlIHZp
YSAnaW5zZXJ0LW5ld2xpbmUnIGFuZCBvbmNlIHZpYSAnZm9jdXMtb3V0JykuCi0gICAgICAgICAg
ICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBXZSBkZWJvdW5jZSBvdXIgY2FsbCB0byAncmVt
b3ZlVG9kbycgc28gdGhhdCBpdCBvbmx5IGdldHMKLSAgICAgICAgICAgICAgICAvLyBtYWRlIG9u
Y2UuCi0gICAgICAgICAgICAgICAgRW1iZXIucnVuLmRlYm91bmNlKHRoaXMsICdyZW1vdmVUb2Rv
JywgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhciB0b2RvID0g
dGhpcy5nZXQoJ21vZGVsJyk7Ci0gICAgICAgICAgICAgICAgdG9kby5zZXQoJ3RpdGxlJywgYnVm
ZmVyZWRUaXRsZSk7Ci0gICAgICAgICAgICAgICAgdG9kby5zYXZlKCk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIFJlLXNldCBvdXIgbmV3bHkgZWRpdGVkIHRpdGxlIHRvIHBlcnNp
c3QgaXRzIHRyaW1tZWQgdmVyc2lvbgotICAgICAgICAgICAgdGhpcy5zZXQoJ2J1ZmZlcmVkVGl0
bGUnLCBidWZmZXJlZFRpdGxlKTsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcnLCBm
YWxzZSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgY2FuY2VsRWRpdGluZzogZnVuY3Rpb24gKCkg
ewotICAgICAgICAgICAgdGhpcy5zZXQoJ2J1ZmZlcmVkVGl0bGUnLCB0aGlzLmdldCgndGl0bGUn
KSk7Ci0gICAgICAgICAgICB0aGlzLnNldCgnaXNFZGl0aW5nJywgZmFsc2UpOwotICAgICAgICB9
LAotCi0gICAgICAgIHJlbW92ZVRvZG86IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgIHRoaXMu
cmVtb3ZlVG9kbygpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIHJlbW92ZVRvZG86IGZ1bmN0
aW9uICgpIHsKLSAgICAgICAgdmFyIHRvZG8gPSB0aGlzLmdldCgnbW9kZWwnKTsKLQotICAgICAg
ICB0b2RvLmRlbGV0ZVJlY29yZCgpOwotICAgICAgICB0b2RvLnNhdmUoKTsKLSAgICB9LAotCi0g
ICAgc2F2ZVdoZW5Db21wbGV0ZWQ6IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5nZXQoJ21v
ZGVsJykuc2F2ZSgpOwotICAgIH0ub2JzZXJ2ZXMoJ2lzQ29tcGxldGVkJykKLX0pOwpkaWZmIC0t
Z2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2Rvc19jb250cm9sbGVy
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250cm9sbGVycy90b2Rvc19jb250cm9sbGVy
LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhkZTRjMTQ2MDYwYzlhMzRkMTQ1
NTMxMTEzMzdhN2Q4ZjA0ZjVkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb3NfY29udHJv
bGxlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qZ2xvYmFsIFRvZG9zLCBF
bWJlciAqLwotJ3VzZSBzdHJpY3QnOwotCi1Ub2Rvcy5Ub2Rvc0NvbnRyb2xsZXIgPSBFbWJlci5B
cnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBhY3Rpb25zOiB7Ci0gICAgICAgIGNyZWF0ZVRv
ZG86IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgIHZhciB0aXRsZSwgdG9kbzsKLQotICAgICAg
ICAgICAgLy8gR2V0IHRoZSB0b2RvIHRpdGxlIHNldCBieSB0aGUgIk5ldyBUb2RvIiB0ZXh0IGZp
ZWxkCi0gICAgICAgICAgICB0aXRsZSA9IHRoaXMuZ2V0KCduZXdUaXRsZScpLnRyaW0oKTsKLSAg
ICAgICAgICAgIGlmICghdGl0bGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IFRvZG8gbW9kZWwKLSAgICAg
ICAgICAgIHRvZG8gPSB0aGlzLnN0b3JlLmNyZWF0ZVJlY29yZCgndG9kbycsIHsKLSAgICAgICAg
ICAgICAgICB0aXRsZTogdGl0bGUsCi0gICAgICAgICAgICAgICAgaXNDb21wbGV0ZWQ6IGZhbHNl
Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRvZG8uc2F2ZSgpOwotCi0gICAgICAgICAg
ICAvLyBDbGVhciB0aGUgIk5ldyBUb2RvIiB0ZXh0IGZpZWxkCi0gICAgICAgICAgICB0aGlzLnNl
dCgnbmV3VGl0bGUnLCAnJyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgY2xlYXJDb21wbGV0ZWQ6
IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSB0aGlzLmdldCgnY29t
cGxldGVkJyk7Ci0gICAgICAgICAgICBjb21wbGV0ZWQuaW52b2tlKCdkZWxldGVSZWNvcmQnKTsK
LSAgICAgICAgICAgIGNvbXBsZXRlZC5pbnZva2UoJ3NhdmUnKTsKLSAgICAgICAgfSwKLSAgICB9
LAotCi0gICAgLyogcHJvcGVydGllcyAqLwotCi0gICAgcmVtYWluaW5nOiBFbWJlci5jb21wdXRl
ZC5maWx0ZXJCeSgnY29udGVudCcsICdpc0NvbXBsZXRlZCcsIGZhbHNlKSwKLSAgICBjb21wbGV0
ZWQ6IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5KCdjb250ZW50JywgJ2lzQ29tcGxldGVkJywgdHJ1
ZSksCi0KLSAgICBhbGxBcmVEb25lOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewotICAgICAgICBp
ZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewotICAgICAgICAgICAgdGhpcy5zZXRFYWNoKCdpc0Nv
bXBsZXRlZCcsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmdldCgnbGVuZ3RoJyk7Ci0gICAg
ICAgICAgICB2YXIgY29tcGxldGVkTGVuZ3RoID0gdGhpcy5nZXQoJ2NvbXBsZXRlZC5sZW5ndGgn
KTsKLQotICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCA+IDAgJiYgbGVuZ3RoID09PSBjb21wbGV0
ZWRMZW5ndGg7Ci0gICAgICAgIH0KLSAgICB9LnByb3BlcnR5KCdsZW5ndGgnLCAnY29tcGxldGVk
Lmxlbmd0aCcpCi19KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvaGVscGVy
cy9wbHVyYWxpemUuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2hlbHBlcnMvcGx1cmFsaXpl
LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyNDRjOTUzODdkYmM2ZWE5ODNj
OTIxNzAwMmVmNzkwZjRiOTA3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvaGVscGVycy9wbHVyYWxpemUuanMKKysr
IC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLwotJ3Vz
ZSBzdHJpY3QnOwotCi1FbWJlci5IYW5kbGViYXJzLmhlbHBlcigncGx1cmFsaXplJywgZnVuY3Rp
b24gKHNpbmd1bGFyLCBjb3VudCkgewotICAgIC8qIEZyb20gRW1iZXItRGF0YSAqLwotICAgIHZh
ciBpbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5mbGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0
UnVsZXMpOwotCi0gICAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBpbmZsZWN0b3Iu
cGx1cmFsaXplKHNpbmd1bGFyKTsKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9qcy9tb2RlbHMvdG9kby5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3RvZG8u
anMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTEyMDJkMTAwZjdhZTNhYTVlZmI0
MTA0ZjZlZGYzN2FiNjVjZjAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9tb2RlbHMvdG9kby5qcworKysgL2Rldi9u
dWxsCkBAIC0xLDcgKzAsMCBAQAotLypnbG9iYWwgVG9kb3MsIERTICovCi0ndXNlIHN0cmljdCc7
Ci0KLVRvZG9zLlRvZG8gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHRpdGxlOiBEUy5hdHRyKCdz
dHJpbmcnKSwKLSAgICBpc0NvbXBsZXRlZDogRFMuYXR0cignYm9vbGVhbicpCi19KTsKZGlmZiAt
LWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvcm91dGVyLmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy9yb3V0ZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2Y2Mjli
MDQ1MTM5ZTExYzk0ZGEwOGJkNDJjYjIyY2EzNWU2MDAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9yb3V0ZXIuanMK
KysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKmdsb2JhbCBFbWJlciwgVG9kb3MgKi8K
LSd1c2Ugc3RyaWN0JzsKLQotVG9kb3MuUm91dGVyLm1hcChmdW5jdGlvbiAoKSB7Ci0gICAgdGhp
cy5yZXNvdXJjZSgndG9kb3MnLCB7IHBhdGg6ICcvJyB9LCBmdW5jdGlvbiAoKSB7Ci0gICAgICAg
IHRoaXMucm91dGUoJ2FjdGl2ZScpOwotICAgICAgICB0aGlzLnJvdXRlKCdjb21wbGV0ZWQnKTsK
LSAgICB9KTsKLX0pOwotCi1Ub2Rvcy5Ub2Rvc1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK
LSAgICBtb2RlbDogZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5maW5k
KCd0b2RvJyk7Ci0gICAgfQotfSk7Ci0KLVRvZG9zLlRvZG9zSW5kZXhSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7Ci0gICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAg
IHRoaXMuY29udHJvbGxlckZvcigndG9kb3MnKS5zZXQoJ2ZpbHRlcmVkVG9kb3MnLCB0aGlzLm1v
ZGVsRm9yKCd0b2RvcycpKTsKLSAgICB9Ci19KTsKLQotVG9kb3MuVG9kb3NBY3RpdmVSb3V0ZSA9
IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbiAoKSB7
Ci0gICAgICAgIHZhciB0b2RvcyA9IHRoaXMuc3RvcmUuZmlsdGVyKCd0b2RvJywgZnVuY3Rpb24g
KHRvZG8pIHsKLSAgICAgICAgICAgIHJldHVybiAhdG9kby5nZXQoJ2lzQ29tcGxldGVkJyk7Ci0g
ICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuY29udHJvbGxlckZvcigndG9kb3MnKS5zZXQoJ2Zp
bHRlcmVkVG9kb3MnLCB0b2Rvcyk7Ci0gICAgfQotfSk7Ci0KLVRvZG9zLlRvZG9zQ29tcGxldGVk
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rp
b24gKCkgewotICAgICAgICB2YXIgdG9kb3MgPSB0aGlzLnN0b3JlLmZpbHRlcigndG9kbycsIGZ1
bmN0aW9uICh0b2RvKSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9kby5nZXQoJ2lzQ29tcGxldGVk
Jyk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuY29udHJvbGxlckZvcigndG9kb3MnKS5z
ZXQoJ2ZpbHRlcmVkVG9kb3MnLCB0b2Rvcyk7Ci0gICAgfQotfSk7CmRpZmYgLS1naXQgYS9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzIGIvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9qcy92aWV3cy9lZGl0X3RvZG9fdmlldy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMjllZTMwODA2YTBjNDMzNmEyYTk4MTg5ZGJmMGE5MjgyMTFhZjVkMC4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2pzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAs
MCBAQAotLypnbG9iYWwgVG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLkVk
aXRUb2RvVmlldyA9IEVtYmVyLlRleHRGaWVsZC5leHRlbmQoewotICAgIGZvY3VzT25JbnNlcnQ6
IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgLy8gUmUtc2V0IGlucHV0IHZhbHVlIHRvIGdldCByaWQg
b2YgYSByZWR1bnRhbnQgdGV4dCBzZWxlY3Rpb24KLSAgICAgICAgdGhpcy4kKCkudmFsKHRoaXMu
JCgpLnZhbCgpKTsKLSAgICAgICAgdGhpcy4kKCkuZm9jdXMoKTsKLSAgICB9Lm9uKCdkaWRJbnNl
cnRFbGVtZW50JykKLX0pOwotCi1FbWJlci5IYW5kbGViYXJzLmhlbHBlcignZWRpdC10b2RvJywg
VG9kb3MuRWRpdFRvZG9WaWV3KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMv
dmlld3MvdG9kb3Nfdmlldy5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvdG9kb3Nf
dmlldy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhMGI3MWUxYmVmMmQ5MDAw
Y2I0Y2UwMTY3ZGY5NjNiNWIzZGI0NC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL3RvZG9zX3ZpZXcuanMK
KysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qZ2xvYmFsIFRvZG9zLCBFbWJlciAqLwot
J3VzZSBzdHJpY3QnOwotCi1Ub2Rvcy5Ub2Rvc1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0g
ICAgZm9jdXNJbnB1dDogZnVuY3Rpb24gKCkgewotICAgICAgICB0aGlzLiQoJyNuZXctdG9kbycp
LmZvY3VzKCk7Ci0gICAgfS5vbignZGlkSW5zZXJ0RWxlbWVudCcpCi19KTsKZGlmZiAtLWdpdCBh
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvcmVhZG1lLm1kIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFk
bWUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGJkMjRlZTcwOTBkNmY5ODRk
ZjU2N2ExNDY0Y2VjMzVmOWEwN2MuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQKKysrIC9kZXYvbnVsbApA
QCAtMSwzMiArMCwwIEBACi0jIEVtYmVyLmpzIFRvZG9NVkMgRXhhbXBsZQotCi0+IEEgZnJhbWV3
b3JrIGZvciBjcmVhdGluZyBhbWJpdGlvdXMgd2ViIGFwcGxpY2F0aW9ucy4KLQotPiBfW0VtYmVy
LmpzIC0gZW1iZXJqcy5jb21dKGh0dHA6Ly9lbWJlcmpzLmNvbSlfCi0KLQotIyMgTGVhcm5pbmcg
RW1iZXIuanMKLQotVGhlIFtFbWJlci5qcyB3ZWJzaXRlXShodHRwOi8vZW1iZXJqcy5jb20pIGlz
IGEgZ3JlYXQgcmVzb3VyY2UgZm9yIGdldHRpbmcgc3RhcnRlZC4KLQotSGVyZSBhcmUgc29tZSBs
aW5rcyB5b3UgbWF5IGZpbmQgaGVscGZ1bDoKLQotKiBbR3VpZGVzXShodHRwOi8vZW1iZXJqcy5j
b20vZ3VpZGVzKQotKiBbQVBJIFJlZmVyZW5jZV0oaHR0cDovL2VtYmVyanMuY29tL2FwaSkKLSog
W1NjcmVlbmNhc3QgLSBCdWlsZGluZyBhbiBBcHAgd2l0aCBFbWJlci5qc10oaHR0cHM6Ly93d3cu
eW91dHViZS5jb20vd2F0Y2g/dj1HYTk5aE1pN3dmWSkKLSogW0FwcGxpY2F0aW9ucyBidWlsdCB3
aXRoIEVtYmVyLmpzXShodHRwOi8vZW1iZXJqcy5jb20vZW1iZXItdXNlcnMpCi0qIFtCbG9nXSho
dHRwOi8vZW1iZXJqcy5jb20vYmxvZykKLQotQXJ0aWNsZXMgYW5kIGd1aWRlcyBmcm9tIHRoZSBj
b21tdW5pdHk6Ci0KLSogW0dldHRpbmcgSW50byBFbWJlci5qc10oaHR0cDovL25ldC50dXRzcGx1
cy5jb20vdHV0b3JpYWxzL2phdmFzY3JpcHQtYWpheC9nZXR0aW5nLWludG8tZW1iZXItanMpCi0q
IFtFbWJlcldhdGNoXShodHRwOi8vZW1iZXJ3YXRjaC5jb20pCi0qIFtDb2RlU2Nob29sIGNvdXJz
ZSBXYXJtaW5nIFVwIFdpdGggRW1iZXIuanNdKGh0dHBzOi8vd3d3LmNvZGVzY2hvb2wuY29tL2Nv
dXJzZXMvd2FybWluZy11cC13aXRoLWVtYmVyanMpCi0KLUdldCBoZWxwIGZyb20gb3RoZXIgRW1i
ZXIuanMgdXNlcnM6Ci0KLSogW0VtYmVyLmpzIG9uIFN0YWNrT3ZlcmZsb3ddKGh0dHA6Ly9zdGFj
a292ZXJmbG93LmNvbS9xdWVzdGlvbnMvdGFnZ2VkL2VtYmVyLmpzKQotKiBbRW1iZXIuanMgb24g
VHdpdHRlcl0oaHR0cDovL3R3aXR0ZXIuY29tL2VtYmVyanMpCi0qIFtFbWJlci5qcyBvbiBHb29n
bGUgK10oaHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vY29tbXVuaXRpZXMvMTA2Mzg3MDQ5NzkwMzg3
NDcxMjA1KQotCi1fSWYgeW91IGhhdmUgb3RoZXIgaGVscGZ1bCBsaW5rcyB0byBzaGFyZSwgb3Ig
ZmluZCBhbnkgb2YgdGhlIGxpbmtzIGFib3ZlIG5vIGxvbmdlciB3b3JrLCBwbGVhc2UgW2xldCB1
cyBrbm93XShodHRwczovL2dpdGh1Yi5jb20vdGFzdGVqcy90b2RvbXZjL2lzc3VlcykuXwpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yb2JvdHMudHh0IGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9yb2JvdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmY1OTE2NDUyZTVmZjZjOGI0M2Q2ZDdjNzNkMDAx
NTNkMzRhYzM1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JvYm90
cy50eHQKQEAgLTAsMCArMSwzIEBACisjIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZworVXNlci1h
Z2VudDogKgorRGlzYWxsb3c6CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS8uYm93ZXJyYyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5ib3dlcnJjCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjk1OWUxNjk2ZTdiMmM5NzAwMDVjMzVlYzhhMGY5NGFlYTVkZjM2YWMKLS0tIC9kZXYvbnVs
bAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uYm93ZXJyYwpAQCAtMCwwICsxLDQg
QEAKK3sKKyAgImRpcmVjdG9yeSI6ICJib3dlcl9jb21wb25lbnRzIiwKKyAgImFuYWx5dGljcyI6
IGZhbHNlCit9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uZWRpdG9y
Y29uZmlnIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmVkaXRvcmNvbmZpZwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi40N2M1NDM4NDAzY2E4NzVmMTcwZGIyYWEwN2QxYmZhMzY4OTQwNmUzCi0tLSAvZGV2L251
bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmVkaXRvcmNvbmZpZwpAQCAtMCww
ICsxLDM0IEBACisjIEVkaXRvckNvbmZpZyBoZWxwcyBkZXZlbG9wZXJzIGRlZmluZSBhbmQgbWFp
bnRhaW4gY29uc2lzdGVudAorIyBjb2Rpbmcgc3R5bGVzIGJldHdlZW4gZGlmZmVyZW50IGVkaXRv
cnMgYW5kIElERXMKKyMgZWRpdG9yY29uZmlnLm9yZworCityb290ID0gdHJ1ZQorCisKK1sqXQor
ZW5kX29mX2xpbmUgPSBsZgorY2hhcnNldCA9IHV0Zi04Cit0cmltX3RyYWlsaW5nX3doaXRlc3Bh
Y2UgPSB0cnVlCitpbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWUKK2luZGVudF9zdHlsZSA9IHNw
YWNlCitpbmRlbnRfc2l6ZSA9IDIKKworWyouanNdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5k
ZW50X3NpemUgPSAyCisKK1sqLmhic10KK2luc2VydF9maW5hbF9uZXdsaW5lID0gZmFsc2UKK2lu
ZGVudF9zdHlsZSA9IHNwYWNlCitpbmRlbnRfc2l6ZSA9IDIKKworWyouY3NzXQoraW5kZW50X3N0
eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCitbKi5odG1sXQoraW5kZW50X3N0eWxlID0g
c3BhY2UKK2luZGVudF9zaXplID0gMgorCitbKi57ZGlmZixtZH1dCit0cmltX3RyYWlsaW5nX3do
aXRlc3BhY2UgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
LmVtYmVyLWNsaSBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5lbWJlci1jbGkKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZWU2NGNmZWQyYTg5MDVkYzIzNTA2YWYxMDYwZWM4MGNmODg3NTgyZAotLS0gL2Rldi9u
dWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5lbWJlci1jbGkKQEAgLTAsMCAr
MSw5IEBACit7CisgIC8qKgorICAgIEVtYmVyIENMSSBzZW5kcyBhbmFseXRpY3MgaW5mb3JtYXRp
b24gYnkgZGVmYXVsdC4gVGhlIGRhdGEgaXMgY29tcGxldGVseQorICAgIGFub255bW91cywgYnV0
IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHlvdSBtaWdodCB3YW50IHRvIGRpc2FibGUgdGhpcyBiZWhh
dmlvci4KKworICAgIFNldHRpbmcgYGRpc2FibGVBbmFseXRpY3NgIHRvIHRydWUgd2lsbCBwcmV2
ZW50IGFueSBkYXRhIGZyb20gYmVpbmcgc2VudC4KKyAgKi8KKyAgImRpc2FibGVBbmFseXRpY3Mi
OiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmdpdGln
bm9yZSBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YmUwOWUwMzhiNzVlYzJhNzI1ODA4OTM2YThjNmIzMmM2YTJmNjMyYgotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxNyBA
QAorIyBTZWUgaHR0cDovL2hlbHAuZ2l0aHViLmNvbS9pZ25vcmUtZmlsZXMvIGZvciBtb3JlIGFi
b3V0IGlnbm9yaW5nIGZpbGVzLgorCisjIGNvbXBpbGVkIG91dHB1dAorIyAvZGlzdAorL3RtcAor
CisjIGRlcGVuZGVuY2llcworL25vZGVfbW9kdWxlcworL2Jvd2VyX2NvbXBvbmVudHMKKworIyBt
aXNjCisvLnNhc3MtY2FjaGUKKy9jb25uZWN0LmxvY2sKKy9jb3ZlcmFnZS8qCisvbGlicGVlcmNv
bm5lY3Rpb24ubG9nCitucG0tZGVidWcubG9nCit0ZXN0ZW0ubG9nCmRpZmYgLS1naXQgYS9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uanNoaW50cmMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS8uanNoaW50cmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDgwOTZlZmZhYWIzNzQ5OTRhZGNiMzU3OGU5ODg2
NzVhNGJlZmE4MgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
Ly5qc2hpbnRyYwpAQCAtMCwwICsxLDMyIEBACit7CisgICJwcmVkZWYiOiBbCisgICAgImRvY3Vt
ZW50IiwKKyAgICAid2luZG93IiwKKyAgICAiLVByb21pc2UiCisgIF0sCisgICJicm93c2VyIjog
dHJ1ZSwKKyAgImJvc3MiOiB0cnVlLAorICAiY3VybHkiOiB0cnVlLAorICAiZGVidWciOiBmYWxz
ZSwKKyAgImRldmVsIjogdHJ1ZSwKKyAgImVxZXFlcSI6IHRydWUsCisgICJldmlsIjogdHJ1ZSwK
KyAgImZvcmluIjogZmFsc2UsCisgICJpbW1lZCI6IGZhbHNlLAorICAibGF4YnJlYWsiOiBmYWxz
ZSwKKyAgIm5ld2NhcCI6IHRydWUsCisgICJub2FyZyI6IHRydWUsCisgICJub2VtcHR5IjogZmFs
c2UsCisgICJub25ldyI6IGZhbHNlLAorICAibm9tZW4iOiBmYWxzZSwKKyAgIm9uZXZhciI6IGZh
bHNlLAorICAicGx1c3BsdXMiOiBmYWxzZSwKKyAgInJlZ2V4cCI6IGZhbHNlLAorICAidW5kZWYi
OiB0cnVlLAorICAic3ViIjogdHJ1ZSwKKyAgInN0cmljdCI6IGZhbHNlLAorICAid2hpdGUiOiBm
YWxzZSwKKyAgImVxbnVsbCI6IHRydWUsCisgICJlc25leHQiOiB0cnVlLAorICAidW51c2VkIjog
dHJ1ZQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLnRyYXZpcy55
bWwgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8udHJhdmlzLnltbApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42
NDUzM2JlYTg5YmNjMGYwMDlhZjBjZDIzZmRlMGU0ZDA2Yjk0OTFhCi0tLSAvZGV2L251bGwKKysr
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwyMiBA
QAorLS0tCitsYW5ndWFnZTogbm9kZV9qcworbm9kZV9qczoKKyAgLSAiNCIKKworc3VkbzogZmFs
c2UKKworY2FjaGU6CisgIGRpcmVjdG9yaWVzOgorICAgIC0gbm9kZV9tb2R1bGVzCisKK2JlZm9y
ZV9pbnN0YWxsOgorICAtIG5wbSBjb25maWcgc2V0IHNwaW4gZmFsc2UKKyAgLSBucG0gaW5zdGFs
bCAtZyBib3dlcgorICAtIG5wbSBpbnN0YWxsIHBoYW50b21qcy1wcmVidWlsdAorCitpbnN0YWxs
OgorICAtIG5wbSBpbnN0YWxsCisgIC0gYm93ZXIgaW5zdGFsbAorCitzY3JpcHQ6CisgIC0gbnBt
IHRlc3QKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy53YXRjaG1hbmNv
bmZpZyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy53YXRjaG1hbmNvbmZpZwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5lNzgzNGUzZTRmMzljMWE3NDU5NDJkZmU5MDg5MTcwODU5M2UwZWE2Ci0tLSAvZGV2L251
bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLndhdGNobWFuY29uZmlnCkBAIC0w
LDAgKzEsMyBAQAoreworICAiaWdub3JlX2RpcnMiOiBbInRtcCIsICJkaXN0Il0KK30KZGlmZiAt
LWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL1JFQURNRS5tZCBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41YmQ4YTgzZGJlMTVjMzU4Nzg0
YjVlMTllODhlYWVmZmNjNmE0MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTUgQEAKKyMgRW1iZXIuanMgVG9kb01W
QyBFeGFtcGxlIHVzaW5nIEVtYmVyIENMSQorCis+IEEgZnJhbWV3b3JrIGZvciBjcmVhdGluZyBh
bWJpdGlvdXMgd2ViIGFwcGxpY2F0aW9ucy4KKworPiBfW0VtYmVyLmpzIC0gZW1iZXJqcy5jb21d
KGh0dHA6Ly9lbWJlcmpzLmNvbSlfCis+IF9bRW1iZXIgQ0xJIC0gZW1iZXItY2xpLmNvbV0oaHR0
cDovL2VtYmVyLWNsaS5jb20pXworCisjIyBOb3RlIGZvciBwZW9wbGUgdXBkYXRpbmcgdGhpcyBh
cHAuCisKK1RoZSBgaW5kZXguaHRtbGAgYW5kIHRoZSBgYXNzZXRzYCBmb2xkZXIgaW4gdGhlIHBh
cmVudCBmb2xkZXIgYXMgc2ltbGlua3MgaW50byB0aGUgaXRlbXMgd2l0aCB0aGUKK3NhbWUgbmFt
ZXMgaW5zaWRlIGBkaXN0YC4gVGhlIGBkaXN0YCBmb2xkZXIgaGFzIHRvIGJlIGNoZWNrZWQgaW4g
Z2l0IGFuZCBidWlsdCBmb3IgcHJvZHVjdGlvbi4KKworVG8gd29yayBvbiB0aGlzIGNvbW1lbnQg
YDxiYXNlIGhyZWY9Ii9leGFtcGxlcy9lbWJlci1jbGkvaW5kZXguaHRtbCIgLz5gIGluIHRoZSBg
YXBwL2luZGV4Lmh0bWxgCithbmQgdW5jb21tZW50ZWQgaXQgYmFjayBiZWZvcmUgZG9pbmcgdGhl
IHByb2R1Y3Rpb24gYnVpbGQuCisKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9hcHAuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvYXBwLmpzCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmYyNjBjNGM3MDZkMGFlMzc1Y2ZmYzY5NjlkZmU0MzRiNTlkMjk5YjUKLS0tIC9k
ZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvYXBwLmpzCkBAIC0w
LDAgKzEsMTggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQgUmVzb2x2ZXIg
ZnJvbSAnLi9yZXNvbHZlcic7CitpbXBvcnQgbG9hZEluaXRpYWxpemVycyBmcm9tICdlbWJlci1s
b2FkLWluaXRpYWxpemVycyc7CitpbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnL2Vudmlyb25t
ZW50JzsKKworbGV0IEFwcDsKKworRW1iZXIuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TID0gdHJ1
ZTsKKworQXBwID0gRW1iZXIuQXBwbGljYXRpb24uZXh0ZW5kKHsKKyAgICBtb2R1bGVQcmVmaXg6
IGNvbmZpZy5tb2R1bGVQcmVmaXgsCisgICAgcG9kTW9kdWxlUHJlZml4OiBjb25maWcucG9kTW9k
dWxlUHJlZml4LAorICAgIFJlc29sdmVyCit9KTsKKworbG9hZEluaXRpYWxpemVycyhBcHAsIGNv
bmZpZy5tb2R1bGVQcmVmaXgpOworCitleHBvcnQgZGVmYXVsdCBBcHA7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29tcG9uZW50cy8uZ2l0a2VlcCBiL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzLy5naXRrZWVwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmU2OWRlMjliYjJkMWQ2NDM0YjhiMjlhZTc3NWFkOGMyZTQ4YzUzOTEKZGlmZiAtLWdpdCBhL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3RvZG8taXRlbS5qcyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3RvZG8taXRlbS5qcwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4wZGU3ZmJmMTE2NWIyNjE0NTQxYTU2YTM5MGQxYzMzOGM0OThlMDkzCi0tLSAvZGV2
L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMvdG9k
by1pdGVtLmpzCkBAIC0wLDAgKzEsNDkgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisK
K2V4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoeworICAgIHJlcG86IEVtYmVy
LmluamVjdC5zZXJ2aWNlKCksCisgICAgdGFnTmFtZTogJ2xpJywKKyAgICBlZGl0aW5nOiBmYWxz
ZSwKKyAgICBjbGFzc05hbWVCaW5kaW5nczogWyd0b2RvLmNvbXBsZXRlZCcsICdlZGl0aW5nJ10s
CisKKyAgICBhY3Rpb25zOiB7CisgICAgICAgIHN0YXJ0RWRpdGluZygpIHsKKyAgICAgICAgICAg
IHRoaXMuZ2V0KCdvblN0YXJ0RWRpdCcpKCk7CisgICAgICAgICAgICB0aGlzLnNldCgnZWRpdGlu
ZycsIHRydWUpOworICAgICAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgnYWZ0ZXJSZW5k
ZXInLCB0aGlzLCAnZm9jdXNJbnB1dCcpOworICAgICAgICB9LAorCisgICAgICAgIGRvbmVFZGl0
aW5nKHRvZG9UaXRsZSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLmdldCgnZWRpdGluZycpKSB7
IHJldHVybjsgfQorICAgICAgICAgICAgaWYgKEVtYmVyLmlzQmxhbmsodG9kb1RpdGxlKSkgewor
ICAgICAgICAgICAgICAgIHRoaXMuc2VuZCgncmVtb3ZlVG9kbycpOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNldCgndG9kby50aXRsZScsIHRvZG9UaXRsZS50
cmltKCkpOworICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2UpOworICAg
ICAgICAgICAgICAgIHRoaXMuZ2V0KCdvbkVuZEVkaXQnKSgpOworICAgICAgICAgICAgfQorICAg
ICAgICB9LAorCisgICAgICAgIGhhbmRsZUtleWRvd24oZSkgeworICAgICAgICAgICAgaWYgKGUu
a2V5Q29kZSA9PT0gMTMpIHsKKyAgICAgICAgICAgICAgICBlLnRhcmdldC5ibHVyKCk7CisgICAg
ICAgICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKKyAgICAgICAgICAgICAgICB0
aGlzLnNldCgnZWRpdGluZycsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKwor
ICAgICAgICB0b2dnbGVDb21wbGV0ZWQoZSkgeworICAgICAgICAgICAgbGV0IHRvZG8gPSB0aGlz
LmdldCgndG9kbycpOworICAgICAgICAgICAgRW1iZXIuc2V0KHRvZG8sICdjb21wbGV0ZWQnLCBl
LnRhcmdldC5jaGVja2VkKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykucGVyc2lzdCgp
OworICAgICAgICB9LAorCisgICAgICAgIHJlbW92ZVRvZG8oKSB7CisgICAgICAgICAgICB0aGlz
LmdldCgncmVwbycpLmRlbGV0ZSh0aGlzLmdldCgndG9kbycpKTsKKyAgICAgICAgfQorICAgIH0s
CisKKyAgICBmb2N1c0lucHV0KCkgeworICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3Rv
cignaW5wdXQuZWRpdCcpLmZvY3VzKCk7CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29tcG9uZW50cy90b2RvLWxpc3QuanMgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29tcG9uZW50cy90b2RvLWxpc3QuanMKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uZDg0ZTBlM2ExZmUyOTdmZjVkOGFkYjE0MTYzMmNhZTk0MjY4ZDJhOQotLS0gL2Rldi9udWxs
CisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3RvZG8tbGlz
dC5qcwpAQCAtMCwwICsxLDI3IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworCitleHBv
cnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICByZXBvOiBFbWJlci5pbmpl
Y3Quc2VydmljZSgpLAorICAgIHRhZ05hbWU6ICdzZWN0aW9uJywKKyAgICBlbGVtZW50SWQ6ICdt
YWluJywKKyAgICBjYW5Ub2dnbGU6IHRydWUsCisgICAgYWxsQ29tcGxldGVkOiBFbWJlci5jb21w
dXRlZCgndG9kb3MuQGVhY2guY29tcGxldGVkJywgZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1
cm4gdGhpcy5nZXQoJ3RvZG9zJykuaXNFdmVyeSgnY29tcGxldGVkJyk7CisgICAgfSksCisKKyAg
ICBhY3Rpb25zOiB7CisgICAgICAgIGVuYWJsZVRvZ2dsZSgpIHsKKyAgICAgICAgICAgIHRoaXMu
c2V0KCdjYW5Ub2dnbGUnLCB0cnVlKTsKKyAgICAgICAgfSwKKworICAgICAgICBkaXNhYmxlVG9n
Z2xlKCkgeworICAgICAgICAgICAgdGhpcy5zZXQoJ2NhblRvZ2dsZScsIGZhbHNlKTsKKyAgICAg
ICAgfSwKKworICAgICAgICB0b2dnbGVBbGwoKSB7CisgICAgICAgICAgICBsZXQgYWxsQ29tcGxl
dGVkID0gdGhpcy5nZXQoJ2FsbENvbXBsZXRlZCcpOworICAgICAgICAgICAgdGhpcy5nZXQoJ3Rv
ZG9zJykuZm9yRWFjaCh0b2RvID0+IEVtYmVyLnNldCh0b2RvLCAnY29tcGxldGVkJywgIWFsbENv
bXBsZXRlZCkpOworICAgICAgICAgICAgdGhpcy5nZXQoJ3JlcG8nKS5wZXJzaXN0KCk7CisgICAg
ICAgIH0KKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L2FwcC9jb250cm9sbGVycy9hY3RpdmUuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9h
cHAvY29udHJvbGxlcnMvYWN0aXZlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRmMDNkNDA3OTAzODg5YTE0MTM3
NzFhMzFkZmMxNGJhNDg5MzViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS9hcHAvY29udHJvbGxlcnMvYWN0aXZlLmpzCkBAIC0wLDAgKzEsNSBAQAoraW1w
b3J0IEVtYmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxl
ci5leHRlbmQoeworICAgIHRvZG9zOiBFbWJlci5jb21wdXRlZC5maWx0ZXJCeSgnbW9kZWwnLCAn
Y29tcGxldGVkJywgZmFsc2UpCit9KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9jb250cm9sbGVycy9hcHBsaWNhdGlvbi5qcyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlL2FwcC9jb250cm9sbGVycy9hcHBsaWNhdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jODE0
ZTVmYTczY2Q5ZTgxYzYzNTdmZDcxMWU1ZTY4N2MwOWJjYWZmCi0tLSAvZGV2L251bGwKKysrIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpz
CkBAIC0wLDAgKzEsMjAgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisKK2V4cG9ydCBk
ZWZhdWx0IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICByZXBvOiBFbWJlci5pbmplY3Qu
c2VydmljZSgpLAorICAgIHJlbWFpbmluZzogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ21vZGVs
JywgJ2NvbXBsZXRlZCcsIGZhbHNlKSwKKyAgICBjb21wbGV0ZWQ6IEVtYmVyLmNvbXB1dGVkLmZp
bHRlckJ5KCdtb2RlbCcsICdjb21wbGV0ZWQnKSwKKyAgICBhY3Rpb25zOiB7CisgICAgICAgIGNy
ZWF0ZVRvZG8oZSkgeworICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgJiYgIUVtYmVy
LmlzQmxhbmsoZS50YXJnZXQudmFsdWUpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXQoJ3Jl
cG8nKS5hZGQoeyB0aXRsZTogZS50YXJnZXQudmFsdWUudHJpbSgpLCBjb21wbGV0ZWQ6IGZhbHNl
IH0pOworICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gJyc7CisgICAgICAgICAgICB9
CisgICAgICAgIH0sCisKKyAgICAgICAgY2xlYXJDb21wbGV0ZWQoKSB7CisgICAgICAgICAgICB0
aGlzLmdldCgnbW9kZWwnKS5yZW1vdmVPYmplY3RzKHRoaXMuZ2V0KCdjb21wbGV0ZWQnKSk7Cisg
ICAgICAgICAgICB0aGlzLmdldCgncmVwbycpLnBlcnNpc3QoKTsKKyAgICAgICAgfQorICAgIH0K
K30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xs
ZXJzL2NvbXBsZXRlZC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb250cm9s
bGVycy9jb21wbGV0ZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjM0ZDAwYWZlZjc4MDlhNzNkNDE5MTUxYjhm
MDJlYzVlMDU2N2Y1YgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9jb250cm9sbGVycy9jb21wbGV0ZWQuanMKQEAgLTAsMCArMSw1IEBACitpbXBvcnQg
RW1iZXIgZnJvbSAnZW1iZXInOworCitleHBvcnQgZGVmYXVsdCBFbWJlci5Db250cm9sbGVyLmV4
dGVuZCh7CisgICAgdG9kb3M6IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5KCdtb2RlbCcsICdjb21w
bGV0ZWQnLCB0cnVlKQorfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS9hcHAvaGVscGVycy9ndC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9oZWxw
ZXJzL2d0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYzNzA2OTVhMmY5NDU2NTlkOWY1ODQ3ZGIxMzc2NGVhZjY2
MTEwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
aGVscGVycy9ndC5qcwpAQCAtMCwwICsxLDcgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7
CisKK2V4cG9ydCBmdW5jdGlvbiBndChbbjEsIG4yXS8qLCBoYXNoKi8pIHsKKyAgICByZXR1cm4g
bjEgPiBuMjsKK30KKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuSGVscGVyLmhlbHBlcihndCk7CmRp
ZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaGVscGVycy9wbHVyYWxp
emUuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaGVscGVycy9wbHVyYWxpemUu
anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uYjFmMWEyYWNjOGY4NTYxNzgwZDBiOTVkZmY3M2NhOTYzM2I2ODlhNQot
LS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9oZWxwZXJz
L3BsdXJhbGl6ZS5qcwpAQCAtMCwwICsxLDggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7
CitpbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICdlbWJlci1pbmZsZWN0b3InOworCitleHBvcnQg
ZnVuY3Rpb24gcGx1cmFsaXplSGVscGVyKFtzaW5ndWxhciwgY291bnRdLyosIGhhc2gqLykgewor
ICAgIHJldHVybiBjb3VudCA9PT0gMSA/IHNpbmd1bGFyIDogcGx1cmFsaXplKHNpbmd1bGFyKTsK
K30KKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuSGVscGVyLmhlbHBlcihwbHVyYWxpemVIZWxwZXIp
OwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luZGV4Lmh0bWwg
Yi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5kZXguaHRtbApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40
MGIxMDA1NWQ0OTkyZGJhMjljY2Y3ZmIwNGUyMDMwYjM5YjQxNzlhCi0tLSAvZGV2L251bGwKKysr
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwy
NSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNl
dD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVu
dD0iSUU9ZWRnZSI+CisgICAgPHRpdGxlPlRvZG9tdmM8L3RpdGxlPgorICAgIDxtZXRhIG5hbWU9
ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250
ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CisgICAgPGJhc2UgaHJl
Zj0iL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzIiAvPgor
ICAgIHt7Y29udGVudC1mb3IgImhlYWQifX0KKworICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIg
aHJlZj0iYXNzZXRzL3ZlbmRvci5jc3MiPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJl
Zj0iYXNzZXRzL3RvZG9tdmMuY3NzIj4KKworICAgIHt7Y29udGVudC1mb3IgImhlYWQtZm9vdGVy
In19CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAge3tjb250ZW50LWZvciAiYm9keSJ9fQorCisg
ICAgPHNjcmlwdCBzcmM9ImFzc2V0cy92ZW5kb3IuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
c3JjPSJhc3NldHMvdG9kb212Yy5qcyI+PC9zY3JpcHQ+CisKKyAgICB7e2NvbnRlbnQtZm9yICJi
b2R5LWZvb3RlciJ9fQorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5zdGFuY2UtaW5pdGlhbGl6ZXJzL2dsb2JhbC5qcyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9pbnN0YW5jZS1pbml0aWFsaXplcnMvZ2xvYmFs
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjM0YzlhOWRhZGU3YjEwMzU5MWI1OGZkNmM0NjBhODg2Yzk3MmExMjQK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5zdGFu
Y2UtaW5pdGlhbGl6ZXJzL2dsb2JhbC5qcwpAQCAtMCwwICsxLDEwIEBACisvLyBhcHAvaW5zdGFu
Y2UtaW5pdGlhbGl6ZXJzL2dsb2JhbC5qcworCitleHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZShh
cHBsaWNhdGlvbikgeworICB3aW5kb3cuQXBwID0gYXBwbGljYXRpb247ICAvLyBvciB3aW5kb3cu
V2hhdGV2ZXIKK30KKworZXhwb3J0IGRlZmF1bHQgeworICBuYW1lOiAnZ2xvYmFsJywKKyAgaW5p
dGlhbGl6ZTogaW5pdGlhbGl6ZQorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvbW9kZWxzLy5naXRrZWVwIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL21vZGVscy8uZ2l0a2VlcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcmVzb2x2ZXIuanMgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9hcHAvcmVzb2x2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmZiNTYzZDZjMDQ4OGY0
MWJlYzQ1NGZlMWZhN2MyMjk5NzVhNThkZgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9yZXNvbHZlci5qcwpAQCAtMCwwICsxLDMgQEAKK2ltcG9ydCBS
ZXNvbHZlciBmcm9tICdlbWJlci1yZXNvbHZlcic7CisKK2V4cG9ydCBkZWZhdWx0IFJlc29sdmVy
OwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlci5qcyBi
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXIuanMKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNGM2
MGJmOTNmYzg3YjY3ZjYwMjNmZGM5NDM5NmM0MTQ3YjVhM2Q2YwotLS0gL2Rldi9udWxsCisrKyBi
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXIuanMKQEAgLTAsMCArMSwxMyBA
QAoraW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVyJzsKK2ltcG9ydCBjb25maWcgZnJvbSAnLi9jb25m
aWcvZW52aXJvbm1lbnQnOworCitjb25zdCBSb3V0ZXIgPSBFbWJlci5Sb3V0ZXIuZXh0ZW5kKHsK
KyAgICBsb2NhdGlvbjogY29uZmlnLmxvY2F0aW9uVHlwZQorfSk7CisKK1JvdXRlci5tYXAoZnVu
Y3Rpb24gKCkgeworICAgIHRoaXMucm91dGUoJ2FjdGl2ZScpOworICAgIHRoaXMucm91dGUoJ2Nv
bXBsZXRlZCcpOworfSk7CisKK2V4cG9ydCBkZWZhdWx0IFJvdXRlcjsKZGlmZiAtLWdpdCBhL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXMvLmdpdGtlZXAgYi9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzLy5naXRrZWVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU2OWRlMjli
YjJkMWQ2NDM0YjhiMjlhZTc3NWFkOGMyZTQ4YzUzOTEKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXMvYXBwbGljYXRpb24uanMgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjI5NmEz
NzViYTJhNjUwY2JhMTE5Njk3OTUxNzg0N2Y5ZWY2N2Y4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9uLmpzCkBAIC0w
LDAgKzEsOCBAQAoraW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQg
RW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICByZXBvOiBFbWJlci5pbmplY3Quc2VydmljZSgpLAor
ICAgIG1vZGVsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ3JlcG8nKS5maW5kQWxsKCk7
CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
c2VydmljZXMvcmVwby5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNl
cy9yZXBvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjAwMjg4OTM2N2RiODJiNmViZGQxNzExZTg5OWRjODgwNzk0
NzAzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
c2VydmljZXMvcmVwby5qcwpAQCAtMCwwICsxLDI2IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1i
ZXInOworCitleHBvcnQgZGVmYXVsdCBFbWJlci5TZXJ2aWNlLmV4dGVuZCh7CisgICAgbGFzdElk
OiAwLAorICAgIGRhdGE6IG51bGwsCisgICAgZmluZEFsbCgpIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMuZ2V0KCdkYXRhJykgfHwKKyAgICAgICAgICAgIHRoaXMuc2V0KCdkYXRhJywgSlNPTi5wYXJz
ZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvZG9zJykgfHwgJ1tdJykpOworICAgIH0s
CisKKyAgICBhZGQoYXR0cnMpIHsKKyAgICAgICAgbGV0IHRvZG8gPSBPYmplY3QuYXNzaWduKHsg
aWQ6IHRoaXMuaW5jcmVtZW50UHJvcGVydHkoJ2xhc3RJZCcpIH0sIGF0dHJzKTsKKyAgICAgICAg
dGhpcy5nZXQoJ2RhdGEnKS5wdXNoT2JqZWN0KHRvZG8pOworICAgICAgICB0aGlzLnBlcnNpc3Qo
KTsKKyAgICAgICAgcmV0dXJuIHRvZG87CisgICAgfSwKKworICAgIGRlbGV0ZSh0b2RvKSB7Cisg
ICAgICAgIHRoaXMuZ2V0KCdkYXRhJykucmVtb3ZlT2JqZWN0KHRvZG8pOworICAgICAgICB0aGlz
LnBlcnNpc3QoKTsKKyAgICB9LAorCisgICAgcGVyc2lzdCgpIHsKKyAgICAgICAgd2luZG93Lmxv
Y2FsU3RvcmFnZS5zZXRJdGVtKCd0b2RvcycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0KCdkYXRh
JykpKTsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L2FwcC9zdHlsZXMvYXBwLmNzcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zdHls
ZXMvYXBwLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0
OGM1MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2FjdGl2ZS5oYnMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVz
L2FjdGl2ZS5oYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGUyNDRmNDg3ZDIzODM0NDhhNDJhNTlkZjBiZjQyNTY0
ZTIxZjU3MwotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2Fw
cC90ZW1wbGF0ZXMvYWN0aXZlLmhicwpAQCAtMCwwICsxIEBACit7e3RvZG8tbGlzdCB0b2Rvcz10
b2Rvc319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi41MTliNjIwY2Q2MzAxOGY2NzNlYWE5YTdiOTA4ZDU4OThhOTIxNThmCi0tLSAvZGV2L251
bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hcHBsaWNh
dGlvbi5oYnMKQEAgLTAsMCArMSwyOSBAQAorPHNlY3Rpb24gaWQ9InRvZG9hcHAiPgorICA8aGVh
ZGVyIGlkPSJoZWFkZXIiPgorICAgIDxoMT50b2RvczwvaDE+CisgICAgPGlucHV0IHR5cGU9InRl
eHQiIGlkPSJuZXctdG9kbyIgb25rZXlkb3duPXt7YWN0aW9uICdjcmVhdGVUb2RvJ319IHBsYWNl
aG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/IiBhdXRvZm9jdXM+CisgIDwvaGVhZGVyPgor
ICAgIHt7b3V0bGV0fX0KKyAgICB7eyNpZiAoZ3QgbW9kZWwubGVuZ3RoIDApfX0KKyAgICAgIDxm
b290ZXIgaWQ9ImZvb3RlciI+CisgICAgICAgIDxzcGFuIGlkPSJ0b2RvLWNvdW50Ij48c3Ryb25n
Pnt7cmVtYWluaW5nLmxlbmd0aH19PC9zdHJvbmc+IHt7cGx1cmFsaXplICdpdGVtJyByZW1haW5p
bmcubGVuZ3RofX0gbGVmdDwvc3Bhbj4KKyAgICAgICAgPHVsIGlkPSJmaWx0ZXJzIj4KKyAgICAg
ICAgICA8bGk+e3sjbGluay10byAiaW5kZXgiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFsbHt7
L2xpbmstdG99fTwvbGk+CisgICAgICAgICAgPGxpPnt7I2xpbmstdG8gImFjdGl2ZSIgYWN0aXZl
Q2xhc3M9InNlbGVjdGVkIn19QWN0aXZle3svbGluay10b319PC9saT4KKyAgICAgICAgICA8bGk+
e3sjbGluay10byAiY29tcGxldGVkIiBhY3RpdmVDbGFzcz0ic2VsZWN0ZWQifX1Db21wbGV0ZWR7
ey9saW5rLXRvfX08L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB7eyNpZiBjb21wbGV0ZWQu
bGVuZ3RofX0KKyAgICAgICAgICA8YnV0dG9uIGlkPSJjbGVhci1jb21wbGV0ZWQiIG9uY2xpY2s9
e3thY3Rpb24gJ2NsZWFyQ29tcGxldGVkJ319PkNsZWFyIGNvbXBsZXRlZDwvYnV0dG9uPgorICAg
ICAgICB7ey9pZn19CisgICAgICA8L2Zvb3Rlcj4KKyAgICB7ey9pZn19Cis8L3NlY3Rpb24+Cis8
Zm9vdGVyIGlkPSJpbmZvIj4KKyAgPHA+RG91YmxlLWNsaWNrIHRvIGVkaXQgYSB0b2RvPC9wPgor
ICA8cD4KKyAgICBDcmVhdGVkIGJ5CisgICAgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vY2li
ZXJub3giPk1pZ3VlbCBDYW1iYTwvYT4sCisgICAgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20v
YWRkeW9zbWFuaSI+QWRkeSBPc21hbmk8L2E+CisgIDwvcD4KKyAgPHA+UGFydCBvZiA8YSBocmVm
PSJodHRwOi8vdG9kb212Yy5jb20iPlRvZG9NVkM8L2E+PC9wPgorPC9mb290ZXI+ClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvYXBwL3RlbXBsYXRlcy9jb21wbGV0ZWQuaGJzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvYXBwL3RlbXBsYXRlcy9jb21wbGV0ZWQuaGJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRlMjQ0ZjQ4N2QyMzgz
NDQ4YTQyYTU5ZGYwYmY0MjU2NGUyMWY1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBsZXRlZC5oYnMKQEAgLTAsMCArMSBA
QAore3t0b2RvLWxpc3QgdG9kb3M9dG9kb3N9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
ZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29t
cG9uZW50cy8uZ2l0a2VlcCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0
ZXMvY29tcG9uZW50cy8uZ2l0a2VlcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5
YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1pdGVtLmhicyBiL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWl0ZW0uaGJzCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmMwNjk3NWU4NjVlN2I5YTA0Mjc4NWU4YjM4OTc3ZjM0YWFkM2RiYzYKLS0tIC9kZXYv
bnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBv
bmVudHMvdG9kby1pdGVtLmhicwpAQCAtMCwwICsxLDYgQEAKKzxkaXYgY2xhc3M9InZpZXciPgor
ICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJ0b2dnbGUiIGNoZWNrZWQ9e3t0b2RvLmNv
bXBsZXRlZH19IG9uY2hhbmdlPXt7YWN0aW9uICd0b2dnbGVDb21wbGV0ZWQnfX0+CisgIDxsYWJl
bCBvbmRibGNsaWNrPXt7YWN0aW9uICdzdGFydEVkaXRpbmcnfX0+e3t0b2RvLnRpdGxlfX08L2xh
YmVsPgorICA8YnV0dG9uIG9uY2xpY2s9e3thY3Rpb24gJ3JlbW92ZVRvZG8nfX0gY2xhc3M9ImRl
c3Ryb3kiPjwvYnV0dG9uPgorPC9kaXY+Cis8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImVkaXQi
IHZhbHVlPXt7dG9kby50aXRsZX19IG9uYmx1cj17e2FjdGlvbiAnZG9uZUVkaXRpbmcnIHZhbHVl
PSd0YXJnZXQudmFsdWUnfX0gb25rZXlkb3duPXt7YWN0aW9uICdoYW5kbGVLZXlkb3duJ319IGF1
dG9mb2N1cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1saXN0Lmhi
cyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcG9uZW50cy90
b2RvLWxpc3QuaGJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjMwOWQwN2ExZjQxN2NmMWMxODg5MzBjNWNiZmIzM2E3
MDUxYzc4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9h
cHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1saXN0LmhicwpAQCAtMCwwICsxLDEwIEBACit7
eyNpZiB0b2Rvcy5sZW5ndGh9fQorICB7eyNpZiBjYW5Ub2dnbGV9fQorICAgIDxpbnB1dCB0eXBl
PSJjaGVja2JveCIgaWQ9InRvZ2dsZS1hbGwiIGNoZWNrZWQ9e3thbGxDb21wbGV0ZWR9fSBvbmNo
YW5nZT17e2FjdGlvbiAndG9nZ2xlQWxsJ319PgorICB7ey9pZn19CisgIDx1bCBpZD0idG9kby1s
aXN0IiBjbGFzcz0idG9kby1saXN0Ij4KKyAgICB7eyNlYWNoIHRvZG9zIGFzIHx0b2RvfH19Cisg
ICAgICB7e3RvZG8taXRlbSB0b2RvPXRvZG8gb25TdGFydEVkaXQ9KGFjdGlvbiAnZGlzYWJsZVRv
Z2dsZScpIG9uRW5kRWRpdD0oYWN0aW9uICdlbmFibGVUb2dnbGUnKX19CisgICAge3svZWFjaH19
CisgIDwvdWw+Cit7ey9pZn19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS9hcHAvdGVtcGxhdGVzL2luZGV4LmhicyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2Fw
cC90ZW1wbGF0ZXMvaW5kZXguaGJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdkNTU2NWMzNmFiMzdkZWE5YTFjNDE5
ZGRlYTc1M2JmMTk1OGNkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS9hcHAvdGVtcGxhdGVzL2luZGV4LmhicwpAQCAtMCwwICsxLDMgQEAKK3t7I2lmIG1v
ZGVsLmxlbmd0aH19CisgIHt7dG9kby1saXN0IHRvZG9zPW1vZGVsfX0KK3t7L2lmfX0KZGlmZiAt
LWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2Jvd2VyLmpzb24gYi9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9ib3dlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIyMGEwMDE0YTJkZjJjZWM3
YjY2NWI2M2IwMzRlM2I5NTg4OWUyODMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9ib3dlci5qc29uCkBAIC0wLDAgKzEsOSBAQAoreworICAibmFtZSI6ICJ0
b2RvbXZjIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiZW1iZXIiOiAifjIuNi4wIiwKKyAg
ICAiZW1iZXItY2xpLXNoaW1zIjogIjAuMS4xIiwKKyAgICAiZW1iZXItY2xpLXRlc3QtbG9hZGVy
IjogIjAuMi4yIiwKKyAgICAiZW1iZXItcXVuaXQtbm90aWZpY2F0aW9ucyI6ICIwLjEuMCIKKyAg
fQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29uZmlnL2Vudmly
b25tZW50LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29uZmlnL2Vudmlyb25tZW50
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjU5NzQ0YjNkZWM5ZWQ3YThmYzU0NDkwYTVlOWE0ZmNiNDE4YWQ1NmIK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9jb25maWcvZW52
aXJvbm1lbnQuanMKQEAgLTAsMCArMSw0NyBAQAorLyoganNoaW50IG5vZGU6IHRydWUgKi8KKwor
bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHsKKyAgICB2YXIgRU5WID0g
eworICAgICAgICBtb2R1bGVQcmVmaXg6ICd0b2RvbXZjJywKKyAgICAgICAgZW52aXJvbm1lbnQ6
IGVudmlyb25tZW50LAorICAgICAgICBiYXNlVVJMOiBudWxsLAorICAgICAgICBsb2NhdGlvblR5
cGU6ICdhdXRvJywKKyAgICAgICAgRW1iZXJFTlY6IHsKKyAgICAgICAgICAgIEZFQVRVUkVTOiB7
CisgICAgICAgICAgICAgICAgLy8gSGVyZSB5b3UgY2FuIGVuYWJsZSBleHBlcmltZW50YWwgZmVh
dHVyZXMgb24gYW4gZW1iZXIgY2FuYXJ5IGJ1aWxkCisgICAgICAgICAgICAgICAgLy8gZS5nLiAn
d2l0aC1jb250cm9sbGVyJzogdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAg
ICAgIEFQUDogeworICAgICAgICAgICAgLy8gSGVyZSB5b3UgY2FuIHBhc3MgZmxhZ3Mvb3B0aW9u
cyB0byB5b3VyIGFwcGxpY2F0aW9uIGluc3RhbmNlCisgICAgICAgICAgICAvLyB3aGVuIGl0IGlz
IGNyZWF0ZWQKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBpZiAoZW52aXJvbm1lbnQgPT09
ICdkZXZlbG9wbWVudCcpIHsKKyAgICAvLyAgRU5WLkFQUC5MT0dfUkVTT0xWRVIgPSB0cnVlOwor
ICAgIC8vICBFTlYuQVBQLkxPR19BQ1RJVkVfR0VORVJBVElPTiA9IHRydWU7CisgICAgLy8gIEVO
Vi5BUFAuTE9HX1RSQU5TSVRJT05TID0gdHJ1ZTsKKyAgICAvLyAgRU5WLkFQUC5MT0dfVFJBTlNJ
VElPTlNfSU5URVJOQUwgPSB0cnVlOworICAgIC8vICBFTlYuQVBQLkxPR19WSUVXX0xPT0tVUFMg
PSB0cnVlOworICAgIC8vIH0KKworICAgIGlmIChlbnZpcm9ubWVudCA9PT0gJ3Rlc3QnKSB7Cisg
ICAgICAgIC8vIFRlc3RlbSBwcmVmZXJzIHRoaXMuLi4KKyAgICAgICAgRU5WLmJhc2VVUkwgPSAn
Lyc7CisgICAgICAgIEVOVi5sb2NhdGlvblR5cGUgPSAnbm9uZSc7CisKKyAgICAgICAgLy8ga2Vl
cCB0ZXN0IGNvbnNvbGUgb3V0cHV0IHF1aWV0ZXIKKyAgICAgICAgRU5WLkFQUC5MT0dfQUNUSVZF
X0dFTkVSQVRJT04gPSBmYWxzZTsKKyAgICAgICAgRU5WLkFQUC5MT0dfVklFV19MT09LVVBTID0g
ZmFsc2U7CisKKyAgICAgICAgRU5WLkFQUC5yb290RWxlbWVudCA9ICcjZW1iZXItdGVzdGluZyc7
CisgICAgfQorCisgICAgLy8gaWYgKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbicpIHsKKwor
ICAgIC8vIH0KKworICAgIHJldHVybiBFTlY7Cit9OwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvZW1iZXItY2xpLWJ1aWxkLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVl
ZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9z
b3VyY2UvZW1iZXItY2xpLWJ1aWxkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmIxZGJmNTkxOGNiODEwOThjODMw
YmYzODViMWJjNWQ5NDRjZTA5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS9lbWJlci1jbGktYnVpbGQuanMKQEAgLTAsMCArMSwyNiBAQAorLypqc2hpbnQg
bm9kZTp0cnVlKi8KKy8qIGdsb2JhbCByZXF1aXJlLCBtb2R1bGUgKi8KK3ZhciBFbWJlckFwcCA9
IHJlcXVpcmUoJ2VtYmVyLWNsaS9saWIvYnJvY2NvbGkvZW1iZXItYXBwJyk7CisKK21vZHVsZS5l
eHBvcnRzID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7CisgICAgdmFyIGFwcCA9IG5ldyBFbWJlckFw
cChkZWZhdWx0cywgeworICAgICAgICAvLyBBZGQgb3B0aW9ucyBoZXJlCisgICAgfSk7CisKKyAg
ICBhcHAuaW1wb3J0KCd2ZW5kb3IvYmFzZS5jc3MnKTsKKyAgICBhcHAuaW1wb3J0KCd2ZW5kb3Iv
aW5kZXguY3NzJyk7CisgICAgLy8gVXNlIGBhcHAuaW1wb3J0YCB0byBhZGQgYWRkaXRpb25hbCBs
aWJyYXJpZXMgdG8gdGhlIGdlbmVyYXRlZAorICAgIC8vIG91dHB1dCBmaWxlcy4KKyAgICAvLwor
ICAgIC8vIElmIHlvdSBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgYXNzZXRzIGluIGRpZmZlcmVudAor
ICAgIC8vIGVudmlyb25tZW50cywgc3BlY2lmeSBhbiBvYmplY3QgYXMgdGhlIGZpcnN0IHBhcmFt
ZXRlci4gVGhhdAorICAgIC8vIG9iamVjdCdzIGtleXMgc2hvdWxkIGJlIHRoZSBlbnZpcm9ubWVu
dCBuYW1lIGFuZCB0aGUgdmFsdWVzCisgICAgLy8gc2hvdWxkIGJlIHRoZSBhc3NldCB0byB1c2Ug
aW4gdGhhdCBlbnZpcm9ubWVudC4KKyAgICAvLworICAgIC8vIElmIHRoZSBsaWJyYXJ5IHRoYXQg
eW91IGFyZSBpbmNsdWRpbmcgY29udGFpbnMgQU1EIG9yIEVTNgorICAgIC8vIG1vZHVsZXMgdGhh
dCB5b3Ugd291bGQgbGlrZSB0byBpbXBvcnQgaW50byB5b3VyIGFwcGxpY2F0aW9uCisgICAgLy8g
cGxlYXNlIHNwZWNpZnkgYW4gb2JqZWN0IHdpdGggdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBrZXlz
CisgICAgLy8gYWxvbmcgd2l0aCB0aGUgZXhwb3J0cyBvZiBlYWNoIG1vZHVsZSBhcyBpdHMgdmFs
dWUuCisKKyAgICByZXR1cm4gYXBwLnRvVHJlZSgpOworfTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3BhY2thZ2UuanNvbiBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41YmU2NTczMjBmMjFkNDYzN2I0ZGRhZjc5Nzc0
YjY5YjYzYWFkMDMxCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsNDIgQEAKK3sKKyAgIm5hbWUiOiAidG9kb212YyIs
CisgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgImRlc2NyaXB0aW9uIjogIlNtYWxsIGRlc2NyaXB0
aW9uIGZvciB0b2RvbXZjIGdvZXMgaGVyZSIsCisgICJwcml2YXRlIjogdHJ1ZSwKKyAgImRpcmVj
dG9yaWVzIjogeworICAgICJkb2MiOiAiZG9jIiwKKyAgICAidGVzdCI6ICJ0ZXN0cyIKKyAgfSwK
KyAgInNjcmlwdHMiOiB7CisgICAgImJ1aWxkIjogImVtYmVyIGJ1aWxkIiwKKyAgICAic3RhcnQi
OiAiZW1iZXIgc2VydmVyIiwKKyAgICAidGVzdCI6ICJlbWJlciB0ZXN0IgorICB9LAorICAicmVw
b3NpdG9yeSI6ICIiLAorICAiZW5naW5lcyI6IHsKKyAgICAibm9kZSI6ICI+PSAwLjEwLjAiCisg
IH0sCisgICJhdXRob3IiOiAiIiwKKyAgImxpY2Vuc2UiOiAiTUlUIiwKKyAgImRldkRlcGVuZGVu
Y2llcyI6IHsKKyAgICAiYnJvY2NvbGktYXNzZXQtcmV2IjogIl4yLjQuMiIsCisgICAgImVtYmVy
LWFqYXgiOiAiMC43LjEiLAorICAgICJlbWJlci1jbGkiOiAiMi41LjAiLAorICAgICJlbWJlci1j
bGktYXBwLXZlcnNpb24iOiAiXjEuMC4wIiwKKyAgICAiZW1iZXItY2xpLWJhYmVsIjogIl41LjEu
NiIsCisgICAgImVtYmVyLWNsaS1kZXBlbmRlbmN5LWNoZWNrZXIiOiAiXjEuMi4wIiwKKyAgICAi
ZW1iZXItY2xpLWh0bWxiYXJzIjogIl4xLjAuMyIsCisgICAgImVtYmVyLWNsaS1odG1sYmFycy1p
bmxpbmUtcHJlY29tcGlsZSI6ICJeMC4zLjEiLAorICAgICJlbWJlci1jbGktaW5qZWN0LWxpdmUt
cmVsb2FkIjogIl4xLjQuMCIsCisgICAgImVtYmVyLWNsaS1qc2hpbnQiOiAiXjEuMC4wIiwKKyAg
ICAiZW1iZXItY2xpLXF1bml0IjogIl4xLjQuMCIsCisgICAgImVtYmVyLWNsaS1yZWxlYXNlIjog
IjAuMi44IiwKKyAgICAiZW1iZXItY2xpLXNyaSI6ICJeMi4xLjAiLAorICAgICJlbWJlci1jbGkt
dWdsaWZ5IjogIl4xLjIuMCIsCisgICAgImVtYmVyLWV4cG9ydC1hcHBsaWNhdGlvbi1nbG9iYWwi
OiAiXjEuMC41IiwKKyAgICAiZW1iZXItaW5mbGVjdG9yIjogIjEuOS40IiwKKyAgICAiZW1iZXIt
bG9hZC1pbml0aWFsaXplcnMiOiAiXjAuNS4xIiwKKyAgICAiZW1iZXItcmVzb2x2ZXIiOiAiXjIu
MC4zIiwKKyAgICAibG9hZGVyLmpzIjogIl40LjAuMSIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL2Nyb3NzZG9tYWluLnhtbCBiL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3B1YmxpYy9jcm9zc2RvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGMx
NmE3YTA3YjM3ZTVkNWY3ZTBlNTZjODI5ZjcyMDA2NzQ1ODQwMwotLS0gL2Rldi9udWxsCisrKyBi
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3B1YmxpYy9jcm9zc2RvbWFpbi54bWwKQEAgLTAs
MCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgY3Jvc3MtZG9tYWlu
LXBvbGljeSBTWVNURU0gImh0dHA6Ly93d3cuYWRvYmUuY29tL3htbC9kdGRzL2Nyb3NzLWRvbWFp
bi1wb2xpY3kuZHRkIj4KKzxjcm9zcy1kb21haW4tcG9saWN5PgorICA8IS0tIFJlYWQgdGhpczog
d3d3LmFkb2JlLmNvbS9kZXZuZXQvYXJ0aWNsZXMvY3Jvc3Nkb21haW5fcG9saWN5X2ZpbGVfc3Bl
Yy5odG1sIC0tPgorCisgIDwhLS0gTW9zdCByZXN0cmljdGl2ZSBwb2xpY3k6IC0tPgorICA8c2l0
ZS1jb250cm9sIHBlcm1pdHRlZC1jcm9zcy1kb21haW4tcG9saWNpZXM9Im5vbmUiLz4KKworICA8
IS0tIExlYXN0IHJlc3RyaWN0aXZlIHBvbGljeTogLS0+CisgIDwhLS0KKyAgPHNpdGUtY29udHJv
bCBwZXJtaXR0ZWQtY3Jvc3MtZG9tYWluLXBvbGljaWVzPSJhbGwiLz4KKyAgPGFsbG93LWFjY2Vz
cy1mcm9tIGRvbWFpbj0iKiIgdG8tcG9ydHM9IioiIHNlY3VyZT0iZmFsc2UiLz4KKyAgPGFsbG93
LWh0dHAtcmVxdWVzdC1oZWFkZXJzLWZyb20gZG9tYWluPSIqIiBoZWFkZXJzPSIqIiBzZWN1cmU9
ImZhbHNlIi8+CisgIC0tPgorPC9jcm9zcy1kb21haW4tcG9saWN5PgpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL3JvYm90cy50eHQgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9wdWJsaWMvcm9ib3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mNTkxNjQ1MmU1ZmY2
YzhiNDNkNmQ3YzczZDAwMTUzZDM0YWMzNWRlCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL3JvYm90cy50eHQKQEAgLTAsMCArMSwzIEBACisjIGh0
dHA6Ly93d3cucm9ib3RzdHh0Lm9yZworVXNlci1hZ2VudDogKgorRGlzYWxsb3c6CmRpZmYgLS1n
aXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0ZW0uanMgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS90ZXN0ZW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGUxNDJlZTEwNGZlNmM2MWE2ZDJh
YjlhNzU1NDA1Mzc0ZDA4MjJiNQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlL3Rlc3RlbS5qcwpAQCAtMCwwICsxLDEzIEBACisvKmpzaGludCBub2RlOnRydWUq
LworbW9kdWxlLmV4cG9ydHMgPSB7CisgICAgZnJhbWV3b3JrOiAncXVuaXQnLAorICAgIHRlc3Rf
cGFnZTogJ3Rlc3RzL2luZGV4Lmh0bWw/aGlkZXBhc3NlZCcsCisgICAgZGlzYWJsZV93YXRjaGlu
ZzogdHJ1ZSwKKyAgICBsYXVuY2hfaW5fY2k6IFsKKyAgICAgICAgJ1BoYW50b21KUycKKyAgICBd
LAorICAgIGxhdW5jaF9pbl9kZXY6IFsKKyAgICAgICAgJ1BoYW50b21KUycsCisgICAgICAgICdD
aHJvbWUnCisgICAgXQorfTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3ZlbmRvci8uZ2l0a2VlcCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3ZlbmRvci8uZ2l0
a2VlcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1Mzkx
CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvYmFzZS5jc3Mg
Yi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvYmFzZS5jc3MKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NGQyNWQzYzg0YWM2YzZhZWYyNmI5NjgzYTJiYzEwYzYxZjk2MGM4ZgotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3ZlbmRvci9iYXNlLmNzcwpAQCAtMCwwICsx
LDE0MSBAQAoraHIgeworICAgIG1hcmdpbjogMjBweCAwOworICAgIGJvcmRlcjogMDsKKyAgICBi
b3JkZXItdG9wOiAxcHggZGFzaGVkICNjNWM1YzU7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRh
c2hlZCAjZjdmN2Y3OworfQorCisubGVhcm4gYSB7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsK
KyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgY29sb3I6ICNiODNmNDU7Cit9CisKKy5s
ZWFybiBhOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgICBjb2xv
cjogIzc4N2U3ZTsKK30KKworLmxlYXJuIGgzLAorLmxlYXJuIGg0LAorLmxlYXJuIGg1IHsKKyAg
ICBtYXJnaW46IDEwcHggMDsKKyAgICBmb250LXdlaWdodDogNTAwOworICAgIGxpbmUtaGVpZ2h0
OiAxLjI7CisgICAgY29sb3I6ICMwMDA7Cit9CisKKy5sZWFybiBoMyB7CisgICAgZm9udC1zaXpl
OiAyNHB4OworfQorCisubGVhcm4gaDQgeworICAgIGZvbnQtc2l6ZTogMThweDsKK30KKworLmxl
YXJuIGg1IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIGZvbnQtc2l6ZTogMTRweDsKK30K
KworLmxlYXJuIHVsIHsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMCAwIDMwcHggMjVw
eDsKK30KKworLmxlYXJuIGxpIHsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKK30KKworLmxlYXJu
IHAgeworICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICBmb250LXdlaWdodDogMzAwOworICAgIGxp
bmUtaGVpZ2h0OiAxLjM7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAw
OworfQorCisjaXNzdWUtY291bnQgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy5xdW90ZSB7
CisgICAgYm9yZGVyOiBub25lOworICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKK30KKworLnF1
b3RlIHAgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLnF1b3RlIHA6YmVmb3JlIHsK
KyAgICBjb250ZW50OiAn4oCcJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0eTog
LjE1OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0yMHB4OworICAgIGxlZnQ6
IDNweDsKK30KKworLnF1b3RlIHA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfigJ0nOworICAgIGZv
bnQtc2l6ZTogNTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29sdXRl
OworICAgIGJvdHRvbTogLTQycHg7CisgICAgcmlnaHQ6IDNweDsKK30KKworLnF1b3RlIGZvb3Rl
ciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJvdHRvbTogLTQwcHg7CisgICAgcmln
aHQ6IDA7Cit9CisKKy5xdW90ZSBmb290ZXIgaW1nIHsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7
Cit9CisKKy5xdW90ZSBmb290ZXIgYSB7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICB2ZXJ0
aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuc3BlZWNoLWJ1YmJsZSB7CisgICAgcG9zaXRpb246
IHJlbGF0aXZlOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAw
LCAwLCAuMDQpOworICAgIGJvcmRlci1yYWRpdXM6IDVweDsKK30KKworLnNwZWVjaC1idWJibGU6
YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0
b3A6IDEwMCU7CisgICAgcmlnaHQ6IDMwcHg7CisgICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRyYW5z
cGFyZW50OworICAgIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKK30KKwor
LmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHdpZHRo
OiAyNzJweDsKKyAgICB0b3A6IDhweDsKKyAgICBsZWZ0OiAtMzAwcHg7CisgICAgcGFkZGluZzog
MTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmdi
YSgyNTUsIDI1NSwgMjU1LCAuNik7CisgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogbGVmdDsKKyAg
ICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKK30KKworQG1lZGlhIChtaW4td2lkdGg6IDg5
OXB4KSB7CisgICAgLmxlYXJuLWJhciB7CisgICAgICAgIHdpZHRoOiBhdXRvOworICAgICAgICBw
YWRkaW5nLWxlZnQ6IDMwMHB4OworICAgIH0KKworICAgIC5sZWFybi1iYXIgPiAubGVhcm4gewor
ICAgICAgICBsZWZ0OiA4cHg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvdmVuZG9yL2luZGV4LmNzcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3ZlbmRvci9pbmRleC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTdlYTE4MDE2MTIxMjZmMWRiNjVjZTA1Njhm
MmEwMjM3M2I5M2I1NQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL3ZlbmRvci9pbmRleC5jc3MKQEAgLTAsMCArMSwzNzggQEAKK2h0bWwsCitib2R5IHsKKyAg
ICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworYnV0dG9uIHsKKyAgICBtYXJnaW46
IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBib3JkZXI6IDA7CisgICAgYmFja2dyb3VuZDogbm9u
ZTsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwor
ICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OworICAgIGZvbnQtd2VpZ2h0OiBpbmhlcml0OworICAg
IGNvbG9yOiBpbmhlcml0OworICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgICBhcHBl
YXJhbmNlOiBub25lOworICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwor
ICAgIC1tb3otZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIGZvbnQtc21vb3RoaW5n
OiBhbnRpYWxpYXNlZDsKK30KKworYm9keSB7CisgICAgZm9udDogMTRweCAnSGVsdmV0aWNhIE5l
dWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICAgIGxpbmUtaGVpZ2h0OiAxLjRl
bTsKKyAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OworICAgIGNvbG9yOiAjNGQ0ZDRkOworICAgIG1p
bi13aWR0aDogMjMwcHg7CisgICAgbWF4LXdpZHRoOiA1NTBweDsKKyAgICBtYXJnaW46IDAgYXV0
bzsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtbW96LWZv
bnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICBmb250LXNtb290aGluZzogYW50aWFsaWFz
ZWQ7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKK30KKworYnV0dG9uLAoraW5wdXRbdHlwZT0iY2hl
Y2tib3giXSB7CisgICAgb3V0bGluZTogbm9uZTsKK30KKworLmhpZGRlbiB7CisgICAgZGlzcGxh
eTogbm9uZTsKK30KKworI3RvZG9hcHAgeworICAgIGJhY2tncm91bmQ6ICNmZmY7CisgICAgbWFy
Z2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgYm94LXNo
YWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpLAorICAgICAgICAgICAgICAgIDAg
MjVweCA1MHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpOworfQorCisjdG9kb2FwcCBpbnB1dDo6LXdl
YmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGZv
bnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9CisKKyN0b2RvYXBwIGlucHV0
OjotbW96LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13
ZWlnaHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKworI3RvZG9hcHAgaW5wdXQ6Omlu
cHV0LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWln
aHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKworI3RvZG9hcHAgaDEgeworICAgIHBv
c2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0xNTVweDsKKyAgICB3aWR0aDogMTAwJTsKKyAg
ICBmb250LXNpemU6IDEwMHB4OworICAgIGZvbnQtd2VpZ2h0OiAxMDA7CisgICAgdGV4dC1hbGln
bjogY2VudGVyOworICAgIGNvbG9yOiByZ2JhKDE3NSwgNDcsIDQ3LCAwLjE1KTsKKyAgICAtd2Vi
a2l0LXRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CisgICAgLW1vei10ZXh0LXJl
bmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6
ZUxlZ2liaWxpdHk7Cit9CisKKyNuZXctdG9kbywKKy5lZGl0IHsKKyAgICBwb3NpdGlvbjogcmVs
YXRpdmU7CisgICAgbWFyZ2luOiAwOworICAgIHdpZHRoOiAxMDAlOworICAgIGZvbnQtc2l6ZTog
MjRweDsKKyAgICBmb250LWZhbWlseTogaW5oZXJpdDsKKyAgICBmb250LXdlaWdodDogaW5oZXJp
dDsKKyAgICBsaW5lLWhlaWdodDogMS40ZW07CisgICAgYm9yZGVyOiAwOworICAgIG91dGxpbmU6
IG5vbmU7CisgICAgY29sb3I6IGluaGVyaXQ7CisgICAgcGFkZGluZzogNnB4OworICAgIGJvcmRl
cjogMXB4IHNvbGlkICM5OTk7CisgICAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDVweCAwIHJn
YmEoMCwgMCwgMCwgMC4yKTsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIC13ZWJr
aXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIC1tb3otZm9udC1zbW9vdGhpbmc6
IGFudGlhbGlhc2VkOworICAgIGZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKK30KKworI25l
dy10b2RvIHsKKyAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCA2MHB4OworICAgIGJvcmRlcjog
bm9uZTsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDAzKTsKKyAgICBib3gtc2hh
ZG93OiBpbnNldCAwIC0ycHggMXB4IHJnYmEoMCwwLDAsMC4wMyk7Cit9CisKKyNtYWluIHsKKyAg
ICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgei1pbmRleDogMjsKKyAgICBib3JkZXItdG9wOiAx
cHggc29saWQgI2U2ZTZlNjsKK30KKworbGFiZWxbZm9yPSd0b2dnbGUtYWxsJ10geworICAgIGRp
c3BsYXk6IG5vbmU7Cit9CisKKyN0b2dnbGUtYWxsIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7
CisgICAgdG9wOiAtNTVweDsKKyAgICBsZWZ0OiAtMTJweDsKKyAgICB3aWR0aDogNjBweDsKKyAg
ICBoZWlnaHQ6IDM0cHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGJvcmRlcjogbm9u
ZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisjdG9nZ2xlLWFsbDpiZWZvcmUgeworICAgIGNv
bnRlbnQ6ICfina8nOworICAgIGZvbnQtc2l6ZTogMjJweDsKKyAgICBjb2xvcjogI2U2ZTZlNjsK
KyAgICBwYWRkaW5nOiAxMHB4IDI3cHggMTBweCAyN3B4OworfQorCisjdG9nZ2xlLWFsbDpjaGVj
a2VkOmJlZm9yZSB7CisgICAgY29sb3I6ICM3MzczNzM7Cit9CisKKyN0b2RvLWxpc3QgeworICAg
IG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisK
KyN0b2RvLWxpc3QgbGkgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBmb250LXNpemU6
IDI0cHg7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZGVkZWQ7Cit9CisKKyN0b2Rv
LWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKworI3Rv
ZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIHBhZGRp
bmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRpdCB7CisgICAgZGlzcGxheTog
YmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6IDEzcHggMTdweCAxMnB4IDE3
cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmcg
LnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLnRvZ2dsZSB7
CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0MHB4OworICAgIC8qIGF1dG8s
IHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBwb3J0IGlucHV0IHN0eWxpbmcg
Ki8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDog
MDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7CisgICAgYm9yZGVyOiBub25l
OyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAg
IGFwcGVhcmFuY2U6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLnRvZ2dsZTphZnRlciB7Cisg
ICAgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSJodHRw
Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIt
MTAgLTE4IDEwMCAxMzUiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIiBmaWxsPSJub25l
IiBzdHJva2U9IiNlZGVkZWQiIHN0cm9rZS13aWR0aD0iMyIvPjwvc3ZnPicpOworfQorCisjdG9k
by1saXN0IGxpIC50b2dnbGU6Y2hlY2tlZDphZnRlciB7CisgICAgY29udGVudDogdXJsKCdkYXRh
OmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2
ZyIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSItMTAgLTE4IDEwMCAxMzUiPjxjaXJj
bGUgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNiZGRhZDUiIHN0
cm9rZS13aWR0aD0iMyIvPjxwYXRoIGZpbGw9IiM1ZGMyYWYiIGQ9Ik03MiAyNUw0MiA3MSAyNyA1
NmwtNCA0IDIwIDIwIDM0LTUyeiIvPjwvc3ZnPicpOworfQorCisjdG9kby1saXN0IGxpIGxhYmVs
IHsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cisg
ICAgcGFkZGluZzogMTVweCA2MHB4IDE1cHggMTVweDsKKyAgICBtYXJnaW4tbGVmdDogNDVweDsK
KyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBsaW5lLWhlaWdodDogMS4yOworICAgIHRyYW5zaXRp
b246IGNvbG9yIDAuNHM7Cit9CisKKyN0b2RvLWxpc3QgbGkuY29tcGxldGVkIGxhYmVsIHsKKyAg
ICBjb2xvcjogI2Q5ZDlkOTsKKyAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKK30K
KworI3RvZG8tbGlzdCBsaSAuZGVzdHJveSB7CisgICAgZGlzcGxheTogbm9uZTsKKyAgICBwb3Np
dGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIHJpZ2h0OiAxMHB4OworICAgIGJvdHRv
bTogMDsKKyAgICB3aWR0aDogNDBweDsKKyAgICBoZWlnaHQ6IDQwcHg7CisgICAgbWFyZ2luOiBh
dXRvIDA7CisgICAgZm9udC1zaXplOiAzMHB4OworICAgIGNvbG9yOiAjY2M5YTlhOworICAgIG1h
cmdpbi1ib3R0b206IDExcHg7CisgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlLW91dDsK
K30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7CisgICAgY29sb3I6ICNhZjViNWU7
Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICfDlyc7
Cit9CisKKyN0b2RvLWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kgeworICAgIGRpc3BsYXk6IGJsb2Nr
OworfQorCisjdG9kby1saXN0IGxpIC5lZGl0IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisj
dG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZCB7CisgICAgbWFyZ2luLWJvdHRvbTogLTFw
eDsKK30KKworI2Zvb3RlciB7CisgICAgY29sb3I6ICM3Nzc7CisgICAgcGFkZGluZzogMTBweCAx
NXB4OworICAgIGhlaWdodDogMjBweDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgYm9y
ZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKKyNmb290ZXI6YmVmb3JlIHsKKyAgICBj
b250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAg
Ym90dG9tOiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiA1MHB4OworICAgIG92ZXJmbG93
OiBoaWRkZW47CisgICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwK
KyAgICAgICAgICAgICAgICAwIDhweCAwIC0zcHggI2Y2ZjZmNiwKKyAgICAgICAgICAgICAgICAw
IDlweCAxcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAgICAgICAgICAgICAgMCAxNnB4
IDAgLTZweCAjZjZmNmY2LAorICAgICAgICAgICAgICAgIDAgMTdweCAycHggLTZweCByZ2JhKDAs
IDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB0
ZXh0LWFsaWduOiBsZWZ0OworfQorCisjdG9kby1jb3VudCBzdHJvbmcgeworICAgIGZvbnQtd2Vp
Z2h0OiAzMDA7Cit9CisKKyNmaWx0ZXJzIHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzog
MDsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBy
aWdodDogMDsKKyAgICBsZWZ0OiAwOworfQorCisjZmlsdGVycyBsaSB7CisgICAgZGlzcGxheTog
aW5saW5lOworfQorCisjZmlsdGVycyBsaSBhIHsKKyAgICBjb2xvcjogaW5oZXJpdDsKKyAgICBt
YXJnaW46IDNweDsKKyAgICBwYWRkaW5nOiAzcHggN3B4OworICAgIHRleHQtZGVjb3JhdGlvbjog
bm9uZTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBib3JkZXItcmFk
aXVzOiAzcHg7Cit9CisKKyNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQsCisjZmlsdGVycyBsaSBhOmhv
dmVyIHsKKyAgICBib3JkZXItY29sb3I6IHJnYmEoMTc1LCA0NywgNDcsIDAuMSk7Cit9CisKKyNm
aWx0ZXJzIGxpIGEuc2VsZWN0ZWQgeworICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNzUsIDQ3LCA0
NywgMC4yKTsKK30KKworI2NsZWFyLWNvbXBsZXRlZCwKK2h0bWwgI2NsZWFyLWNvbXBsZXRlZDph
Y3RpdmUgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAg
bGluZS1oZWlnaHQ6IDIwcHg7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGN1cnNv
cjogcG9pbnRlcjsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjbGVhci1jb21wbGV0
ZWQ6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisjaW5mbyB7
CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjogI2JmYmZiZjsKKyAgICBmb250
LXNpemU6IDEwcHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1
LCAwLjUpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworI2luZm8gcCB7CisgICAgbGlu
ZS1oZWlnaHQ6IDE7Cit9CisKKyNpbmZvIGEgeworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHRl
eHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBmb250LXdlaWdodDogNDAwOworfQorCisjaW5mbyBh
OmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworLyoKKyAgICBI
YWNrIHRvIHJlbW92ZSBiYWNrZ3JvdW5kIGZyb20gTW9iaWxlIFNhZmFyaS4KKyAgICBDYW4ndCB1
c2UgaXQgZ2xvYmFsbHkgc2luY2UgaXQgZGVzdHJveXMgY2hlY2tib3hlcyBpbiBGaXJlZm94Cisq
LworQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzowKSB7
CisgICAgI3RvZ2dsZS1hbGwsCisgICAgI3RvZG8tbGlzdCBsaSAudG9nZ2xlIHsKKyAgICAgICAg
YmFja2dyb3VuZDogbm9uZTsKKyAgICB9CisKKyAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgewor
ICAgICAgICBoZWlnaHQ6IDQwcHg7CisgICAgfQorCisgICAgI3RvZ2dsZS1hbGwgeworICAgICAg
ICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAgICAgdHJhbnNmb3JtOiBy
b3RhdGUoOTBkZWcpOworICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgICAgICAg
IGFwcGVhcmFuY2U6IG5vbmU7CisgICAgfQorfQorCitAbWVkaWEgKG1heC13aWR0aDogNDMwcHgp
IHsKKyAgICAjZm9vdGVyIHsKKyAgICAgICAgaGVpZ2h0OiA1MHB4OworICAgIH0KKworICAgICNm
aWx0ZXJzIHsKKyAgICAgICAgYm90dG9tOiAxMHB4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0Lmh0
bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzFhZGQyZTkzNjY5ZThhYmU1ZDQ5
ZGNjMzA3NDdkODc4YTYyZjUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAt
MSw2MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+TmFj
dSBET00gQmVuY2ggLSBOb3QgQW5vdGhlciBDb21wbGV0ZWx5IFVucmVhbGlzdGljIERPTSBCZW5j
aG1hcms8L3RpdGxlPgotPHNjcmlwdCBzcmM9Ii4uLy4uL2JlbmNobWFyay5qcyI+PC9zY3JpcHQ+
Ci08c2NyaXB0PgotCi1CZW5jaG1hcmtSdW5uZXIuc3VpdGUoewotICAgIHRpdGxlOiAnU2ltcGxl
RW1iZXJKUycsCi0gICAgdXJsOiAnaW5kZXguaHRtbCcsCi0gICAgcHJlcGFyZTogZnVuY3Rpb24g
KGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgewotICAgICAgICBjb250ZW50V2luZG93
LlRvZG9zLlN0b3JlID0gY29udGVudFdpbmRvdy5EUy5TdG9yZS5leHRlbmQoewotICAgICAgICAg
ICAgcmV2aXNpb246IDEyLAotICAgICAgICAgICAgYWRhcHRlcjogJ1RvZG9zLkxTQWRhcHRlcics
Ci0gICAgICAgICAgICBjb21taXQ6IGZ1bmN0aW9uICgpIHsgfQotICAgICAgICB9KTsKLQotICAg
ICAgICB2YXIgcHJvbWlzZSA9IG5ldyBTaW1wbGVQcm9taXNlOwotCi0gICAgICAgIGZ1bmN0aW9u
IHJlc29sdmVJZlJlYWR5KCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnREb2N1bWVudC5xdWVy
eVNlbGVjdG9yKCcjbmV3LXRvZG8nKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS5y
ZXNvbHZlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmVJZlJlYWR5LCAxMCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZUlmUmVhZHkoKTsKLQotICAgICAgICByZXR1cm4gcHJv
bWlzZTsKLSAgICB9LAotICAgIHRlc3RTdGVwczogZnVuY3Rpb24gKGNvbnRlbnRXaW5kb3csIGNv
bnRlbnREb2N1bWVudCkgewotICAgICAgICBjb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3Rvcign
I25ldy10b2RvJykuZm9jdXMoKTsKLSAgICAgICAgdmFyIHZpZXdzID0gY29udGVudFdpbmRvdy5F
bWJlci5WaWV3LnZpZXdzOwotICAgICAgICB2YXIgZW1iZXJSdW4gPSBjb250ZW50V2luZG93LkVt
YmVyLnJ1bjsKLSAgICAgICAgdmFyIG51bWJlck9mSXRlbXNUb0FkZCA9IDEwMDsKLSAgICAgICAg
cmV0dXJuIFsKLSAgICAgICAgICAgIFsnQWRkaW5nJyArIG51bWJlck9mSXRlbXNUb0FkZCArICdJ
dGVtcycsIGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IG51bWJlck9mSXRlbXNUb0FkZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYmVyUnVu
KGZ1bmN0aW9uICgpIHsgdmlld3NbIm5ldy10b2RvIl0uc2V0KCd2YWx1ZScsICdTb21ldGhpbmcg
dG8gZG8nKTsgfSk7Ci0gICAgICAgICAgICAgICAgICAgIGVtYmVyUnVuKGZ1bmN0aW9uICgpIHsg
dmlld3NbIm5ldy10b2RvIl0uaW5zZXJ0TmV3bGluZShkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZl
bnQnKSk7IH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1dLAotICAgICAgICAg
ICAgWydDb21wbGV0aW5nQWxsSXRlbXMnLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICAgICAg
dmFyIGNoZWNrYm94ZXMgPSBjb250ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVtYmVy
LWNoZWNrYm94Jyk7Ci0gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja2Jv
eGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdmlld3Nb
Y2hlY2tib3hlc1tpXS5pZF07Ci0gICAgICAgICAgICAgICAgICAgIGVtYmVyUnVuKGZ1bmN0aW9u
ICgpIHsgdmlldy5zZXQoJ2NoZWNrZWQnLCB0cnVlKTsgfSk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfV0sCi0gICAgICAgICAgICBbJ0RlbGV0aW5nSXRlbXMnLCBmdW5jdGlvbiAo
KSB7Ci0gICAgICAgICAgICAgICAgdmFyIGRlbGV0ZUJ1dHRvbnMgPSBjb250ZW50RG9jdW1lbnQu
cXVlcnlTZWxlY3RvckFsbCgnLmRlc3Ryb3knKTsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IGRlbGV0ZUJ1dHRvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAg
IGVtYmVyUnVuKGZ1bmN0aW9uICgpIHsgZGVsZXRlQnV0dG9uc1tpXS5jbGljaygpOyB9KTsKLSAg
ICAgICAgICAgIH1dLAotICAgICAgICBdOwotICAgIH0KLX0pOwotCi08L3NjcmlwdD4KLTwvaGVh
ZD4KLTxib2R5PgotPC9ib2R5PgotPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>309870</attachid>
            <date>2017-05-11 22:44:33 -0700</date>
            <delta_ts>2017-05-11 22:47:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-171342-20170511224429.patch</filename>
            <type>text/plain</type>
            <size>4273555</size>
            <attacher name="Addy Osmani">addyo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE1ODA4CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCmluZGV4IGI5ZTE0YmUyOGRh
MmFmOTBlNjBmNGI5MTQ4OGI0NzE1ODQ0OGE2Y2IuLmVlYzY2N2E1YjBkYzNiMWI3MDIzMjFmMmQz
YWQ4ZjJhY2JhOTlhNzAgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOTMgQEAKKzIwMTctMDUt
MTEgIEFkZHkgT3NtYW5pICA8YWRkeW9zbWFuaUBnbWFpbC5jb20+CisKKyAgICAgICAgU3BlZWRv
bWV0ZXI6IFVwZGF0ZSB0aGUgRW1iZXIuanMgVG9kb01WQyB0byBhIG1vcmUgcmVjZW50IHZlcnNp
b24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MTM0
MgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0
ZSB0aGUgRW1iZXIgVG9kb01WQyBhcHAgaW4gU3BlZWRvbWV0ZXIgdG8gbGF0ZXN0CisKKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9hc3NldHMvdG9kb212Yy5jc3M6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90
b2RvbXZjLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmNzczogUmVuYW1l
ZCBmcm9tIFBlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1v
bi9iYXNlLmNzcy4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9ib3dlci5qc29uOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVu
dHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
X2NvbXBvbmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2FkYXB0
ZXIuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJl
ci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMv
aGFuZGxlYmFycy5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2px
dWVyeS9qcXVlcnkuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90
b2RvbXZjLWNvbW1vbi9iYXNlLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBv
bmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Nyb3Nz
ZG9tYWluLnhtbDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbDoKKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9qcy9hcHAuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb19j
b250cm9sbGVyLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9z
X2NvbnRyb2xsZXIuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvaGVscGVycy9wbHVyYWxp
emUuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3RvZG8uanM6IFJlbW92ZWQu
CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvanMvcm91dGVyLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3Zp
ZXdzL2VkaXRfdG9kb192aWV3LmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL3Rv
ZG9zX3ZpZXcuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvcmVhZG1lLm1kOiBSZW1vdmVkLgor
ICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3JvYm90cy50eHQ6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uYm93
ZXJyYzogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5lZGl0b3Jjb25maWc6IEFkZGVkLgor
ICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS8uZW1iZXItY2xpOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmdpdGlnbm9yZTogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYzogQWRk
ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy50cmF2aXMueW1sOiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvLndhdGNobWFuY29uZmlnOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVB
RE1FLm1kOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2FwcC5qczogQWRkZWQuCisg
ICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMvdG9kby1pdGVtLmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMvdG9kby1saXN0LmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FjdGl2ZS5qczogQWRkZWQuCisgICAgICAg
ICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hcHBsaWNhdGlvbi5qczogQWRkZWQuCisgICAg
ICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9jb21wbGV0ZWQuanM6IEFkZGVkLgorICAg
ICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvaGVscGVycy9ndC5qczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9oZWxwZXJzL3BsdXJhbGl6ZS5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9pbmRleC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luc3Rh
bmNlLWluaXRpYWxpemVycy9nbG9iYWwuanM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9h
cHAvbW9kZWxzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29s
dmVyLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlci5qczogQWRkZWQu
CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXMvLmdpdGtlZXA6IEFkZGVkLgorICAgICAg
ICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9uLmpzOiBBZGRlZC4KKyAgICAgICAg
KiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL21lbW9yeS5qczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9zZXJ2aWNlcy9yZXBvLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
YXBwL3N0eWxlcy9hcHAuY3NzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBs
YXRlcy9hY3RpdmUuaGJzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRl
cy9hcHBsaWNhdGlvbi5oYnM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBsZXRlZC5oYnM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBvbmVudHMvLmdpdGtlZXA6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
dGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1pdGVtLmhiczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWxpc3QuaGJzOiBBZGRlZC4KKyAg
ICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9pbmRleC5oYnM6IEFkZGVkLgorICAgICAg
ICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9ib3dlci5qc29uOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29u
ZmlnL2Vudmlyb25tZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvZW1iZXItY2xp
LWJ1aWxkLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcGFja2FnZS5qc29uOiBBZGRl
ZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL2Nyb3NzZG9tYWluLnhtbDogQWRkZWQuCisg
ICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3B1YmxpYy9yb2JvdHMudHh0OiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdGVtLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvLmpz
aGludHJjOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9kZXN0cm95
LWFwcC5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvbW9kdWxl
LWZvci1hY2NlcHRhbmNlLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVs
cGVycy9yZXNvbHZlci5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBl
cnMvc3RhcnQtYXBwLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaW5kZXgu
aHRtbDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2ludGVncmF0aW9uLy5naXRr
ZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvdGVzdC1oZWxwZXIuanM6IEFk
ZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy91bml0Ly5naXRrZWVwOiBBZGRlZC4KKyAg
ICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9yLy5naXRrZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVl
ZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9z
b3VyY2UvdmVuZG9yL2Jhc2UuY3NzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9y
L2luZGV4LmNzczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sOiBSZW1vdmVkLgorICAg
ICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3Rlc3RlbS5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdHMvaW5kZXguaHRt
bDogQWRkZWQuCisKIDIwMTctMDQtMjUgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFw
cGxlLmNvbT4KIAogICAgICAgICBBZGQgcGVyZm9ybWFuY2UgdGVzdCBmb3IgRm9udENhY2hlOjpz
eXN0ZW1GYWxsYmFja0ZvckNoYXJhY3RlcnMoKQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9hc3NldHMvdG9kb212Yy5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2Rv
bXZjLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1
MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmpzIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MTlhMDA0
YjBmY2ZkZjgyNzUzZDI0NTBiOGJmYzFiYWJhNjVlYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy5qcwpAQCAtMCwwICsxLDEyNjQgQEAKKyJ1
c2Ugc3RyaWN0IjsKKworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCisKKworLyoganNoaW50
IGlnbm9yZTplbmQgKi8KKworZGVmaW5lKCd0b2RvbXZjL2FwcCcsIFsnZXhwb3J0cycsICdlbWJl
cicsICd0b2RvbXZjL3Jlc29sdmVyJywgJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJywgJ3RvZG9t
dmMvY29uZmlnL2Vudmlyb25tZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIsIF90b2Rv
bXZjUmVzb2x2ZXIsIF9lbWJlckxvYWRJbml0aWFsaXplcnMsIF90b2RvbXZjQ29uZmlnRW52aXJv
bm1lbnQpIHsKKworICAgIHZhciBBcHAgPSB1bmRlZmluZWQ7CisKKyAgICBfZW1iZXJbJ2RlZmF1
bHQnXS5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMgPSB0cnVlOworCisgICAgQXBwID0gX2VtYmVy
WydkZWZhdWx0J10uQXBwbGljYXRpb24uZXh0ZW5kKHsKKyAgICAgICAgbW9kdWxlUHJlZml4OiBf
dG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10ubW9kdWxlUHJlZml4LAorICAgICAg
ICBwb2RNb2R1bGVQcmVmaXg6IF90b2RvbXZjQ29uZmlnRW52aXJvbm1lbnRbJ2RlZmF1bHQnXS5w
b2RNb2R1bGVQcmVmaXgsCisgICAgICAgIFJlc29sdmVyOiBfdG9kb212Y1Jlc29sdmVyWydkZWZh
dWx0J10KKyAgICB9KTsKKworICAgICgwLCBfZW1iZXJMb2FkSW5pdGlhbGl6ZXJzWydkZWZhdWx0
J10pKEFwcCwgX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLm1vZHVsZVByZWZp
eCk7CisKKyAgICBleHBvcnRzWydkZWZhdWx0J10gPSBBcHA7Cit9KTsKK2RlZmluZSgndG9kb212
Yy9jb21wb25lbnRzL2FwcC12ZXJzaW9uJywgWydleHBvcnRzJywgJ2VtYmVyLWNsaS1hcHAtdmVy
c2lvbi9jb21wb25lbnRzL2FwcC12ZXJzaW9uJywgJ3RvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJDbGlBcHBWZXJzaW9uQ29tcG9uZW50c0FwcFZl
cnNpb24sIF90b2RvbXZjQ29uZmlnRW52aXJvbm1lbnQpIHsKKworICB2YXIgbmFtZSA9IF90b2Rv
bXZjQ29uZmlnRW52aXJvbm1lbnRbJ2RlZmF1bHQnXS5BUFAubmFtZTsKKyAgdmFyIHZlcnNpb24g
PSBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uQVBQLnZlcnNpb247CisKKyAg
ZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyQ2xpQXBwVmVyc2lvbkNvbXBvbmVudHNBcHBWZXJz
aW9uWydkZWZhdWx0J10uZXh0ZW5kKHsKKyAgICB2ZXJzaW9uOiB2ZXJzaW9uLAorICAgIG5hbWU6
IG5hbWUKKyAgfSk7Cit9KTsKK2RlZmluZSgndG9kb212Yy9jb21wb25lbnRzL3RvZG8taXRlbScs
IFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICAg
ZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uQ29tcG9uZW50LmV4dGVuZCh7
CisgICAgICAgIHJlcG86IF9lbWJlclsnZGVmYXVsdCddLmluamVjdC5zZXJ2aWNlKCksCisgICAg
ICAgIHRhZ05hbWU6ICdsaScsCisgICAgICAgIGVkaXRpbmc6IGZhbHNlLAorICAgICAgICBjbGFz
c05hbWVCaW5kaW5nczogWyd0b2RvLmNvbXBsZXRlZCcsICdlZGl0aW5nJ10sCisKKyAgICAgICAg
YWN0aW9uczogeworICAgICAgICAgICAgc3RhcnRFZGl0aW5nOiBmdW5jdGlvbiBzdGFydEVkaXRp
bmcoKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXQoJ29uU3RhcnRFZGl0JykoKTsKKyAgICAg
ICAgICAgICAgICB0aGlzLnNldCgnZWRpdGluZycsIHRydWUpOworICAgICAgICAgICAgICAgIF9l
bWJlclsnZGVmYXVsdCddLnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgdGhpcywgJ2Zv
Y3VzSW5wdXQnKTsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGRvbmVFZGl0aW5nOiBm
dW5jdGlvbiBkb25lRWRpdGluZyh0b2RvVGl0bGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRo
aXMuZ2V0KCdlZGl0aW5nJykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX2VtYmVyWydkZWZhdWx0J10uaXNCbGFu
ayh0b2RvVGl0bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZCgncmVtb3ZlVG9k
bycpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMu
c2V0KCd0b2RvLnRpdGxlJywgdG9kb1RpdGxlLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAg
IHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmdl
dCgnb25FbmRFZGl0JykoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICBoYW5kbGVLZXlkb3duOiBmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGUpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgICAgICAgICAgICAg
ICBlLnRhcmdldC5ibHVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUg
PT09IDI3KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2Up
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHRvZ2ds
ZUNvbXBsZXRlZDogZnVuY3Rpb24gdG9nZ2xlQ29tcGxldGVkKGUpIHsKKyAgICAgICAgICAgICAg
ICB2YXIgdG9kbyA9IHRoaXMuZ2V0KCd0b2RvJyk7CisgICAgICAgICAgICAgICAgX2VtYmVyWydk
ZWZhdWx0J10uc2V0KHRvZG8sICdjb21wbGV0ZWQnLCBlLnRhcmdldC5jaGVja2VkKTsKKyAgICAg
ICAgICAgICAgICB0aGlzLmdldCgncmVwbycpLnBlcnNpc3QoKTsKKyAgICAgICAgICAgIH0sCisK
KyAgICAgICAgICAgIHJlbW92ZVRvZG86IGZ1bmN0aW9uIHJlbW92ZVRvZG8oKSB7CisgICAgICAg
ICAgICAgICAgdGhpcy5nZXQoJ3JlcG8nKVsnZGVsZXRlJ10odGhpcy5nZXQoJ3RvZG8nKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgZm9jdXNJbnB1dDogZnVuY3Rpb24g
Zm9jdXNJbnB1dCgpIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdp
bnB1dC5lZGl0JykuZm9jdXMoKTsKKyAgICAgICAgfQorICAgIH0pOworfSk7CitkZWZpbmUoJ3Rv
ZG9tdmMvY29tcG9uZW50cy90b2RvLWxpc3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlcikgeworICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclsn
ZGVmYXVsdCddLkNvbXBvbmVudC5leHRlbmQoeworICAgICAgICByZXBvOiBfZW1iZXJbJ2RlZmF1
bHQnXS5pbmplY3Quc2VydmljZSgpLAorICAgICAgICB0YWdOYW1lOiAnc2VjdGlvbicsCisgICAg
ICAgIGVsZW1lbnRJZDogJ21haW4nLAorICAgICAgICBjYW5Ub2dnbGU6IHRydWUsCisgICAgICAg
IGFsbENvbXBsZXRlZDogX2VtYmVyWydkZWZhdWx0J10uY29tcHV0ZWQoJ3RvZG9zLkBlYWNoLmNv
bXBsZXRlZCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldCgndG9k
b3MnKS5pc0V2ZXJ5KCdjb21wbGV0ZWQnKTsKKyAgICAgICAgfSksCisKKyAgICAgICAgYWN0aW9u
czogeworICAgICAgICAgICAgZW5hYmxlVG9nZ2xlOiBmdW5jdGlvbiBlbmFibGVUb2dnbGUoKSB7
CisgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2NhblRvZ2dsZScsIHRydWUpOworICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgZGlzYWJsZVRvZ2dsZTogZnVuY3Rpb24gZGlzYWJsZVRvZ2ds
ZSgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNldCgnY2FuVG9nZ2xlJywgZmFsc2UpOworICAg
ICAgICAgICAgfSwKKworICAgICAgICAgICAgdG9nZ2xlQWxsOiBmdW5jdGlvbiB0b2dnbGVBbGwo
KSB7CisgICAgICAgICAgICAgICAgdmFyIGFsbENvbXBsZXRlZCA9IHRoaXMuZ2V0KCdhbGxDb21w
bGV0ZWQnKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldCgndG9kb3MnKS5mb3JFYWNoKGZ1bmN0
aW9uICh0b2RvKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZW1iZXJbJ2RlZmF1bHQn
XS5zZXQodG9kbywgJ2NvbXBsZXRlZCcsICFhbGxDb21wbGV0ZWQpOworICAgICAgICAgICAgICAg
IH0pOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykucGVyc2lzdCgpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfSk7Cit9KTsKK2RlZmluZSgndG9kb212Yy9jb250cm9s
bGVycy9hY3RpdmUnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlcikgeworICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclsnZGVmYXVsdCddLkNvbnRy
b2xsZXIuZXh0ZW5kKHsKKyAgICAgICAgdG9kb3M6IF9lbWJlclsnZGVmYXVsdCddLmNvbXB1dGVk
LmZpbHRlckJ5KCdtb2RlbCcsICdjb21wbGV0ZWQnLCBmYWxzZSkKKyAgICB9KTsKK30pOworZGVm
aW5lKCd0b2RvbXZjL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uJywgWydleHBvcnRzJywgJ2VtYmVy
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgICBleHBvcnRzWydkZWZhdWx0J10g
PSBfZW1iZXJbJ2RlZmF1bHQnXS5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIHJlcG86IF9l
bWJlclsnZGVmYXVsdCddLmluamVjdC5zZXJ2aWNlKCksCisgICAgICAgIHJlbWFpbmluZzogX2Vt
YmVyWydkZWZhdWx0J10uY29tcHV0ZWQuZmlsdGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcsIGZh
bHNlKSwKKyAgICAgICAgY29tcGxldGVkOiBfZW1iZXJbJ2RlZmF1bHQnXS5jb21wdXRlZC5maWx0
ZXJCeSgnbW9kZWwnLCAnY29tcGxldGVkJyksCisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAg
ICAgIGNyZWF0ZVRvZG86IGZ1bmN0aW9uIGNyZWF0ZVRvZG8oZSkgeworICAgICAgICAgICAgICAg
IGlmIChlLmtleUNvZGUgPT09IDEzICYmICFfZW1iZXJbJ2RlZmF1bHQnXS5pc0JsYW5rKGUudGFy
Z2V0LnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmdldCgncmVwbycpLmFkZCh7
IHRpdGxlOiBlLnRhcmdldC52YWx1ZS50cmltKCksIGNvbXBsZXRlZDogZmFsc2UgfSk7CisgICAg
ICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgY2xlYXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGNs
ZWFyQ29tcGxldGVkKCkgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnJlbW92
ZU9iamVjdHModGhpcy5nZXQoJ2NvbXBsZXRlZCcpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdl
dCgncmVwbycpLnBlcnNpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOwor
fSk7CitkZWZpbmUoJ3RvZG9tdmMvY29udHJvbGxlcnMvY29tcGxldGVkJywgWydleHBvcnRzJywg
J2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgICBleHBvcnRzWydkZWZh
dWx0J10gPSBfZW1iZXJbJ2RlZmF1bHQnXS5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIHRv
ZG9zOiBfZW1iZXJbJ2RlZmF1bHQnXS5jb21wdXRlZC5maWx0ZXJCeSgnbW9kZWwnLCAnY29tcGxl
dGVkJywgdHJ1ZSkKKyAgICB9KTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvZ3QnLCBb
J2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlcikgeworICAgIHZh
ciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3Io
YXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2
YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRv
cl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fy
ci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0g
Y2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAo
IV9uICYmIF9pWydyZXR1cm4nXSkgX2lbJ3JldHVybiddKCk7IH0gZmluYWxseSB7IGlmIChfZCkg
dGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBp
ZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0
ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0g
ZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVy
ZSBub24taXRlcmFibGUgaW5zdGFuY2UnKTsgfSB9OyB9KSgpOworCisgICAgZXhwb3J0cy5ndCA9
IGd0OworCisgICAgZnVuY3Rpb24gZ3QoX3JlZiAvKiwgaGFzaCovKSB7CisgICAgICAgIHZhciBf
cmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpOworCisgICAgICAgIHZhciBuMSA9IF9yZWYy
WzBdOworICAgICAgICB2YXIgbjIgPSBfcmVmMlsxXTsKKworICAgICAgICByZXR1cm4gbjEgPiBu
MjsKKyAgICB9CisKKyAgICBleHBvcnRzWydkZWZhdWx0J10gPSBfZW1iZXJbJ2RlZmF1bHQnXS5I
ZWxwZXIuaGVscGVyKGd0KTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvcGx1cmFsaXpl
JywgWydleHBvcnRzJywgJ2VtYmVyJywgJ2VtYmVyLWluZmxlY3RvciddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyLCBfZW1iZXJJbmZsZWN0b3IpIHsKKyAgICB2YXIgX3NsaWNlZFRvQXJyYXkg
PSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkgeyB2YXIgX2Fy
ciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVk
OyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0g
KF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7
IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2Qg
PSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVsncmV0dXJu
J10pIF9pWydyZXR1cm4nXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0
dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXko
YXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3Qo
YXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcg
VHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGlu
c3RhbmNlJyk7IH0gfTsgfSkoKTsKKworICAgIGV4cG9ydHMucGx1cmFsaXplSGVscGVyID0gcGx1
cmFsaXplSGVscGVyOworCisgICAgZnVuY3Rpb24gcGx1cmFsaXplSGVscGVyKF9yZWYgLyosIGhh
c2gqLykgeworICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKTsKKwor
ICAgICAgICB2YXIgc2luZ3VsYXIgPSBfcmVmMlswXTsKKyAgICAgICAgdmFyIGNvdW50ID0gX3Jl
ZjJbMV07CisKKyAgICAgICAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiAoMCwgX2Vt
YmVySW5mbGVjdG9yLnBsdXJhbGl6ZSkoc2luZ3VsYXIpOworICAgIH0KKworICAgIGV4cG9ydHNb
J2RlZmF1bHQnXSA9IF9lbWJlclsnZGVmYXVsdCddLkhlbHBlci5oZWxwZXIocGx1cmFsaXplSGVs
cGVyKTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvc2luZ3VsYXJpemUnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItaW5mbGVjdG9yL2xpYi9oZWxwZXJzL3Npbmd1bGFyaXplJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJJbmZsZWN0b3JMaWJIZWxwZXJzU2luZ3VsYXJpemUpIHsKKyAgZXhw
b3J0c1snZGVmYXVsdCddID0gX2VtYmVySW5mbGVjdG9yTGliSGVscGVyc1Npbmd1bGFyaXplWydk
ZWZhdWx0J107Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvYXBwLXZlcnNpb24n
LCBbJ2V4cG9ydHMnLCAnZW1iZXItY2xpLWFwcC12ZXJzaW9uL2luaXRpYWxpemVyLWZhY3Rvcnkn
LCAndG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
ckNsaUFwcFZlcnNpb25Jbml0aWFsaXplckZhY3RvcnksIF90b2RvbXZjQ29uZmlnRW52aXJvbm1l
bnQpIHsKKyAgZXhwb3J0c1snZGVmYXVsdCddID0geworICAgIG5hbWU6ICdBcHAgVmVyc2lvbics
CisgICAgaW5pdGlhbGl6ZTogKDAsIF9lbWJlckNsaUFwcFZlcnNpb25Jbml0aWFsaXplckZhY3Rv
cnlbJ2RlZmF1bHQnXSkoX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLkFQUC5u
YW1lLCBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uQVBQLnZlcnNpb24pCisg
IH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvY29udGFpbmVyLWRlYnVnLWFk
YXB0ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXIvY29udGFpbmVyLWRlYnVnLWFkYXB0
ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJlc29sdmVyQ29udGFpbmVyRGVidWdBZGFw
dGVyKSB7CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHsKKyAgICBuYW1lOiAnY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXInLAorCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsK
KyAgICAgIHZhciBhcHAgPSBhcmd1bWVudHNbMV0gfHwgYXJndW1lbnRzWzBdOworCisgICAgICBh
cHAucmVnaXN0ZXIoJ2NvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyOm1haW4nLCBfZW1iZXJSZXNvbHZl
ckNvbnRhaW5lckRlYnVnQWRhcHRlclsnZGVmYXVsdCddKTsKKyAgICAgIGFwcC5pbmplY3QoJ2Nv
bnRhaW5lci1kZWJ1Zy1hZGFwdGVyOm1haW4nLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1h
aW4nKTsKKyAgICB9CisgIH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvZXhw
b3J0LWFwcGxpY2F0aW9uLWdsb2JhbCcsIFsnZXhwb3J0cycsICdlbWJlcicsICd0b2RvbXZjL2Nv
bmZpZy9lbnZpcm9ubWVudCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyLCBfdG9kb212Y0Nv
bmZpZ0Vudmlyb25tZW50KSB7CisgIGV4cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7CisK
KyAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKKyAgICB2YXIgYXBwbGljYXRpb24gPSBhcmd1bWVu
dHNbMV0gfHwgYXJndW1lbnRzWzBdOworICAgIGlmIChfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50
WydkZWZhdWx0J10uZXhwb3J0QXBwbGljYXRpb25HbG9iYWwgIT09IGZhbHNlKSB7CisgICAgICB2
YXIgdGhlR2xvYmFsOworICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7
CisgICAgICAgIHRoZUdsb2JhbCA9IHdpbmRvdzsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGds
b2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgdGhlR2xvYmFsID0gZ2xvYmFsOworICAg
ICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgdGhl
R2xvYmFsID0gc2VsZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5vIHJlYXNvbmFibGUg
Z2xvYmFsLCBqdXN0IGJhaWwKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIg
dmFsdWUgPSBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uZXhwb3J0QXBwbGlj
YXRpb25HbG9iYWw7CisgICAgICB2YXIgZ2xvYmFsTmFtZTsKKworICAgICAgaWYgKHR5cGVvZiB2
YWx1ZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgZ2xvYmFsTmFtZSA9IHZhbHVlOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgZ2xvYmFsTmFtZSA9IF9lbWJlclsnZGVmYXVsdCddLlN0cmluZy5j
bGFzc2lmeShfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10ubW9kdWxlUHJlZml4
KTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGVHbG9iYWxbZ2xvYmFsTmFtZV0pIHsKKyAgICAg
ICAgdGhlR2xvYmFsW2dsb2JhbE5hbWVdID0gYXBwbGljYXRpb247CisKKyAgICAgICAgYXBwbGlj
YXRpb24ucmVvcGVuKHsKKyAgICAgICAgICB3aWxsRGVzdHJveTogZnVuY3Rpb24gd2lsbERlc3Ry
b3koKSB7CisgICAgICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgICAgICAgICAgZGVsZXRlIHRoZUdsb2JhbFtnbG9iYWxOYW1lXTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9
IHsKKyAgICBuYW1lOiAnZXhwb3J0LWFwcGxpY2F0aW9uLWdsb2JhbCcsCisKKyAgICBpbml0aWFs
aXplOiBpbml0aWFsaXplCisgIH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbnN0YW5jZS1pbml0
aWFsaXplcnMvZ2xvYmFsJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4
cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7CisgIC8vIGFwcC9pbnN0YW5jZS1pbml0aWFs
aXplcnMvZ2xvYmFsLmpzCisKKyAgZnVuY3Rpb24gaW5pdGlhbGl6ZShhcHBsaWNhdGlvbikgewor
ICAgIHdpbmRvdy5BcHAgPSBhcHBsaWNhdGlvbjsgLy8gb3Igd2luZG93LldoYXRldmVyCisgIH0K
KworICBleHBvcnRzWydkZWZhdWx0J10gPSB7CisgICAgbmFtZTogJ2dsb2JhbCcsCisgICAgaW5p
dGlhbGl6ZTogaW5pdGlhbGl6ZQorICB9OworfSk7CitkZWZpbmUoJ3RvZG9tdmMvcmVzb2x2ZXIn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJlc29sdmVyKSB7CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclJlc29sdmVyWydkZWZh
dWx0J107Cit9KTsKK2RlZmluZSgndG9kb212Yy9yb3V0ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXIn
LCAndG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
ciwgX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudCkgeworCisgICAgdmFyIFJvdXRlciA9IF9lbWJl
clsnZGVmYXVsdCddLlJvdXRlci5leHRlbmQoeworICAgICAgICBsb2NhdGlvbjogX3RvZG9tdmND
b25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLmxvY2F0aW9uVHlwZQorICAgIH0pOworCisgICAg
Um91dGVyLm1hcChmdW5jdGlvbiAoKSB7CisgICAgICAgIHRoaXMucm91dGUoJ2FjdGl2ZScpOwor
ICAgICAgICB0aGlzLnJvdXRlKCdjb21wbGV0ZWQnKTsKKyAgICB9KTsKKworICAgIGV4cG9ydHNb
J2RlZmF1bHQnXSA9IFJvdXRlcjsKK30pOworZGVmaW5lKCd0b2RvbXZjL3JvdXRlcy9hcHBsaWNh
dGlvbicsIFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7
CisgICAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uUm91dGUuZXh0ZW5k
KHsKKyAgICAgICAgcmVwbzogX2VtYmVyWydkZWZhdWx0J10uaW5qZWN0LnNlcnZpY2UoKSwKKyAg
ICAgICAgbW9kZWw6IGZ1bmN0aW9uIG1vZGVsKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMu
Z2V0KCdyZXBvJykuZmluZEFsbCgpOworICAgICAgICB9CisgICAgfSk7Cit9KTsKK2RlZmluZSgn
dG9kb212Yy9zZXJ2aWNlcy9hamF4JywgWydleHBvcnRzJywgJ2VtYmVyLWFqYXgvc2VydmljZXMv
YWpheCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyQWpheFNlcnZpY2VzQWpheCkgeworICBP
YmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2RlZmF1bHQnLCB7CisgICAgZW51bWVyYWJs
ZTogdHJ1ZSwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJB
amF4U2VydmljZXNBamF4WydkZWZhdWx0J107CisgICAgfQorICB9KTsKK30pOworZGVmaW5lKCd0
b2RvbXZjL3NlcnZpY2VzL21lbW9yeScsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykg
eworICAoZnVuY3Rpb24gKHJvb3QpIHsKKyAgICB2YXIgbG9jYWxTdG9yYWdlTWVtb3J5ID0ge307
CisgICAgdmFyIGNhY2hlID0ge307CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2Ygc3RvcmVk
IGl0ZW1zLgorICAgICAqLworICAgIGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGggPSAwOworCisg
ICAgLyoqCisgICAgICogcmV0dXJucyBpdGVtIGZvciBwYXNzZWQga2V5LCBvciBudWxsCisgICAg
ICoKKyAgICAgKiBAcGFyYSB7U3RyaW5nfSBrZXkKKyAgICAgKiAgICAgICBuYW1lIG9mIGl0ZW0g
dG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9CisgICAgICovCisg
ICAgbG9jYWxTdG9yYWdlTWVtb3J5LmdldEl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgICBy
ZXR1cm4gY2FjaGVba2V5XSB8fCBudWxsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBzZXRz
IGl0ZW0gZm9yIGtleSB0byBwYXNzZWQgdmFsdWUsIGFzIFN0cmluZworICAgICAqCisgICAgICog
QHBhcmEge1N0cmluZ30ga2V5CisgICAgICogICAgICAgbmFtZSBvZiBpdGVtIHRvIGJlIHNldAor
ICAgICAqIEBwYXJhIHtTdHJpbmd9IHZhbHVlCisgICAgICogICAgICAgdmFsdWUsIHdpbGwgYWx3
YXlzIGJlIHR1cm5lZCBpbnRvIGEgU3RyaW5nCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0K
KyAgICAgKi8KKyAgICBsb2NhbFN0b3JhZ2VNZW1vcnkuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXks
IHZhbHVlKSB7CisgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykgeworICAg
ICAgICBsb2NhbFN0b3JhZ2VNZW1vcnkucmVtb3ZlSXRlbShrZXkpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgbG9j
YWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCsrOworICAgICAgICB9CisKKyAgICAgICAgY2FjaGVba2V5
XSA9ICcnICsgdmFsdWU7CisgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIHJlbW92
ZXMgaXRlbSBmb3IgcGFzc2VkIGtleQorICAgICAqCisgICAgICogQHBhcmEge1N0cmluZ30ga2V5
CisgICAgICogICAgICAgbmFtZSBvZiBpdGVtIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcmV0dXJu
cyB7dW5kZWZpbmVkfQorICAgICAqLworICAgIGxvY2FsU3RvcmFnZU1lbW9yeS5yZW1vdmVJdGVt
ID0gZnVuY3Rpb24gKGtleSkgeworICAgICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkp
IHsKKyAgICAgICAgZGVsZXRlIGNhY2hlW2tleV07CisgICAgICAgIGxvY2FsU3RvcmFnZU1lbW9y
eS5sZW5ndGgtLTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogcmV0dXJucyBu
YW1lIG9mIGtleSBhdCBwYXNzZWQgaW5kZXgKKyAgICAgKgorICAgICAqIEBwYXJhIHtOdW1iZXJ9
IGluZGV4CisgICAgICogICAgICAgUG9zaXRpb24gZm9yIGtleSB0byBiZSByZXR1cm5lZCAoc3Rh
cnRzIGF0IDApCisgICAgICogQHJldHVybnMge1N0cmluZ3xudWxsfQorICAgICAqLworICAgIGxv
Y2FsU3RvcmFnZU1lbW9yeS5rZXkgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICAgIHJldHVybiBP
YmplY3Qua2V5cyhjYWNoZSlbaW5kZXhdIHx8IG51bGw7CisgICAgfTsKKworICAgIC8qKgorICAg
ICAqIHJlbW92ZXMgYWxsIHN0b3JlZCBpdGVtcyBhbmQgc2V0cyBsZW5ndGggdG8gMAorICAgICAq
CisgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KKyAgICAgKi8KKyAgICBsb2NhbFN0b3JhZ2VN
ZW1vcnkuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgICBjYWNoZSA9IHt9OworICAgICAgbG9j
YWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCA9IDA7CisgICAgfTsKKworICAgIGlmICh0eXBlb2YgZXhw
b3J0cyA9PT0gJ29iamVjdCcpIHsKKyAgICAgIG1vZHVsZS5leHBvcnRzID0gbG9jYWxTdG9yYWdl
TWVtb3J5OworICAgIH0gZWxzZSB7CisgICAgICByb290LmxvY2FsU3RvcmFnZU1lbW9yeSA9IGxv
Y2FsU3RvcmFnZU1lbW9yeTsKKyAgICB9CisgIH0pKHRoaXMpOworfSk7CitkZWZpbmUoJ3RvZG9t
dmMvc2VydmljZXMvcmVwbycsIFsnZXhwb3J0cycsICdlbWJlcicsICd0b2RvbXZjL3NlcnZpY2Vz
L21lbW9yeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyLCBfdG9kb212Y1NlcnZpY2VzTWVt
b3J5KSB7CisgICAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uU2Vydmlj
ZS5leHRlbmQoeworICAgICAgICBsYXN0SWQ6IDAsCisgICAgICAgIGRhdGE6IG51bGwsCisgICAg
ICAgIGZpbmRBbGw6IGZ1bmN0aW9uIGZpbmRBbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhp
cy5nZXQoJ2RhdGEnKSB8fCB0aGlzLnNldCgnZGF0YScsIEpTT04ucGFyc2UoX3RvZG9tdmNTZXJ2
aWNlc01lbW9yeS5nZXRJdGVtKCd0b2RvcycpIHx8ICdbXScpKTsKKyAgICAgICAgfSwKKworICAg
ICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChhdHRycykgeworICAgICAgICAgICAgdmFyIHRvZG8gPSBP
YmplY3QuYXNzaWduKHsgaWQ6IHRoaXMuaW5jcmVtZW50UHJvcGVydHkoJ2xhc3RJZCcpIH0sIGF0
dHJzKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdkYXRhJykucHVzaE9iamVjdCh0b2RvKTsKKyAg
ICAgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgICAgICAgICAgcmV0dXJuIHRvZG87CisgICAg
ICAgIH0sCisKKyAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIF9kZWxldGUodG9kbykgeworICAg
ICAgICAgICAgdGhpcy5nZXQoJ2RhdGEnKS5yZW1vdmVPYmplY3QodG9kbyk7CisgICAgICAgICAg
ICB0aGlzLnBlcnNpc3QoKTsKKyAgICAgICAgfSwKKworICAgICAgICBwZXJzaXN0OiBmdW5jdGlv
biBwZXJzaXN0KCkgeworICAgICAgICAgICAgX3RvZG9tdmNTZXJ2aWNlc01lbW9yeS5zZXRJdGVt
KCd0b2RvcycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0KCdkYXRhJykpKTsKKyAgICAgICAgfQor
ICAgIH0pOworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVzL2FjdGl2ZSIsIFsiZXhwb3J0
cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICBleHBvcnRzWyJkZWZhdWx0Il0gPSBFbWJlci5I
VE1MQmFycy50ZW1wbGF0ZSgoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICBtZXRh
OiB7CisgICAgICAgICJmcmFnbWVudFJlYXNvbiI6IHsKKyAgICAgICAgICAibmFtZSI6ICJtaXNz
aW5nLXdyYXBwZXIiLAorICAgICAgICAgICJwcm9ibGVtcyI6IFsid3JvbmctdHlwZSJdCisgICAg
ICAgIH0sCisgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICJsb2Mi
OiB7CisgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0YXJ0IjogeworICAg
ICAgICAgICAgImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAKKyAgICAgICAgICB9
LAorICAgICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAg
ICAiY29sdW1uIjogMjUKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtb2R1bGVO
YW1lIjogInRvZG9tdmMvdGVtcGxhdGVzL2FjdGl2ZS5oYnMiCisgICAgICB9LAorICAgICAgaXNF
bXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwKKyAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxs
LAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rp
b24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1
bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7
CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgIHJldHVybiBlbDA7
CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJO
b2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICB2YXIgbW9y
cGhzID0gbmV3IEFycmF5KDEpOworICAgICAgICBtb3JwaHNbMF0gPSBkb20uY3JlYXRlTW9ycGhB
dChmcmFnbWVudCwgMCwgMCwgY29udGV4dHVhbEVsZW1lbnQpOworICAgICAgICBkb20uaW5zZXJ0
Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21l
bnQsIG51bGwpOworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRl
bWVudHM6IFtbImlubGluZSIsICJ0b2RvLWxpc3QiLCBbXSwgWyJ0b2RvcyIsIFsic3ViZXhwciIs
ICJAbXV0IiwgW1siZ2V0IiwgInRvZG9zIiwgWyJsb2MiLCBbbnVsbCwgWzEsIDE4XSwgWzEsIDIz
XV1dXV0sIFtdLCBbXV1dLCBbImxvYyIsIFtudWxsLCBbMSwgMF0sIFsxLCAyNV1dXV1dLAorICAg
ICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9OworICB9KSgpKTsKK30p
OworZGVmaW5lKCJ0b2RvbXZjL3RlbXBsYXRlcy9hcHBsaWNhdGlvbiIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICBleHBvcnRzWyJkZWZhdWx0Il0gPSBFbWJlci5IVE1MQmFy
cy50ZW1wbGF0ZSgoZnVuY3Rpb24gKCkgeworICAgIHZhciBjaGlsZDAgPSAoZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIGNoaWxkMCA9IChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiB7Cisg
ICAgICAgICAgbWV0YTogeworICAgICAgICAgICAgImZyYWdtZW50UmVhc29uIjogZmFsc2UsCisg
ICAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAgICAgICAgImxvYyI6
IHsKKyAgICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgICAgICJzdGFydCI6
IHsKKyAgICAgICAgICAgICAgICAibGluZSI6IDExLAorICAgICAgICAgICAgICAgICJjb2x1bW4i
OiAxNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAiZW5kIjogeworICAgICAgICAg
ICAgICAgICJsaW5lIjogMTEsCisgICAgICAgICAgICAgICAgImNvbHVtbiI6IDYwCisgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAibW9kdWxlTmFtZSI6ICJ0b2Rv
bXZjL3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMiCisgICAgICAgICAgfSwKKyAgICAgICAgICBp
c0VtcHR5OiBmYWxzZSwKKyAgICAgICAgICBhcml0eTogMCwKKyAgICAgICAgICBjYWNoZWRGcmFn
bWVudDogbnVsbCwKKyAgICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICAgICAgYnVp
bGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgICAgIHZh
ciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICAgICAgdmFyIGVs
MSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiQWxsIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hp
bGQoZWwwLCBlbDEpOworICAgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgICB9LAorICAg
ICAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoKSB7Cisg
ICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgICAgfSwKKyAgICAgICAgICBzdGF0ZW1lbnRz
OiBbXSwKKyAgICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICAgIHRlbXBsYXRlczogW10KKyAg
ICAgICAgfTsKKyAgICAgIH0pKCk7CisgICAgICB2YXIgY2hpbGQxID0gKGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7CisgICAgICAgICAgICAiZnJhZ21l
bnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIs
CisgICAgICAgICAgICAibG9jIjogeworICAgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAg
ICAgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAgICJsaW5lIjogMTIsCisgICAg
ICAgICAgICAgICAgImNvbHVtbiI6IDE0CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAg
ICJlbmQiOiB7CisgICAgICAgICAgICAgICAgImxpbmUiOiAxMiwKKyAgICAgICAgICAgICAgICAi
Y29sdW1uIjogNjQKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
ICJtb2R1bGVOYW1lIjogInRvZG9tdmMvdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyIKKyAgICAg
ICAgICB9LAorICAgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICAgIGFyaXR5OiAwLAor
ICAgICAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgICAgIGhhc1JlbmRlcmVkOiBm
YWxzZSwKKyAgICAgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRv
bSkgeworICAgICAgICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJBY3RpdmUiKTsKKyAg
ICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgICAgIH0sCisgICAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2RlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgICB9
LAorICAgICAgICAgIHN0YXRlbWVudHM6IFtdLAorICAgICAgICAgIGxvY2FsczogW10sCisgICAg
ICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAgICB9OworICAgICAgfSkoKTsKKyAgICAgIHZhciBj
aGlsZDIgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIG1ldGE6
IHsKKyAgICAgICAgICAgICJmcmFnbWVudFJlYXNvbiI6IGZhbHNlLAorICAgICAgICAgICAgInJl
dmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAg
ICAgICJzb3VyY2UiOiBudWxsLAorICAgICAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAg
ICAgICAgImxpbmUiOiAxMywKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogMTQKKyAgICAgICAg
ICAgICAgfSwKKyAgICAgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICAgICAibGluZSI6
IDEzLAorICAgICAgICAgICAgICAgICJjb2x1bW4iOiA3MAorICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMv
YXBwbGljYXRpb24uaGJzIgorICAgICAgICAgIH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2Us
CisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRl
VGV4dE5vZGUoIkNvbXBsZXRlZCIpOworICAgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwg
ZWwxKTsKKyAgICAgICAgICAgIHJldHVybiBlbDA7CisgICAgICAgICAgfSwKKyAgICAgICAgICBi
dWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJlbmRlck5vZGVzKCkgeworICAgICAgICAg
ICAgcmV0dXJuIFtdOworICAgICAgICAgIH0sCisgICAgICAgICAgc3RhdGVtZW50czogW10sCisg
ICAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgICB0ZW1wbGF0ZXM6IFtdCisgICAgICAgIH07
CisgICAgICB9KSgpOworICAgICAgdmFyIGNoaWxkMyA9IChmdW5jdGlvbiAoKSB7CisgICAgICAg
IHJldHVybiB7CisgICAgICAgICAgbWV0YTogeworICAgICAgICAgICAgImZyYWdtZW50UmVhc29u
IjogZmFsc2UsCisgICAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAg
ICAgICAgImxvYyI6IHsKKyAgICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAg
ICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgICAibGluZSI6IDE1LAorICAgICAgICAgICAg
ICAgICJjb2x1bW4iOiA4CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJlbmQiOiB7
CisgICAgICAgICAgICAgICAgImxpbmUiOiAxNywKKyAgICAgICAgICAgICAgICAiY29sdW1uIjog
OAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5h
bWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIgorICAgICAgICAgIH0sCisg
ICAgICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAg
Y2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAg
ICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAg
ICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
ICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAgICAgICAgICAiKTsKKyAgICAgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICB2YXIgZWwxID0gZG9t
LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOworICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShl
bDEsICJpZCIsICJjbGVhci1jb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIHZhciBlbDIgPSBkb20u
Y3JlYXRlVGV4dE5vZGUoIkNsZWFyIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgZG9tLmFwcGVu
ZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHJldHVybiBlbDA7
CisgICAgICAgICAgfSwKKyAgICAgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWls
ZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAg
ICAgICB2YXIgZWxlbWVudDAgPSBkb20uY2hpbGRBdChmcmFnbWVudCwgWzFdKTsKKyAgICAgICAg
ICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgICAgICBtb3JwaHNbMF0gPSBk
b20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQwLCAnb25jbGljaycpOworICAgICAgICAgICAgcmV0
dXJuIG1vcnBoczsKKyAgICAgICAgICB9LAorICAgICAgICAgIHN0YXRlbWVudHM6IFtbImF0dHJp
YnV0ZSIsICJvbmNsaWNrIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsiY2xlYXJDb21wbGV0ZWQi
XSwgW10sIFsibG9jIiwgW251bGwsIFsxNiwgNDddLCBbMTYsIDc0XV1dXV1dLAorICAgICAgICAg
IGxvY2FsczogW10sCisgICAgICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAgICB9OworICAgICAg
fSkoKTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1ldGE6IHsKKyAgICAgICAgICAiZnJhZ21l
bnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAor
ICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAg
ICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgImxpbmUiOiA3LAorICAgICAgICAgICAgICAi
Y29sdW1uIjogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJlbmQiOiB7CisgICAgICAg
ICAgICAgICJsaW5lIjogMTksCisgICAgICAgICAgICAgICJjb2x1bW4iOiA0CisgICAgICAgICAg
ICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAibW9kdWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBs
YXRlcy9hcHBsaWNhdGlvbi5oYnMiCisgICAgICAgIH0sCisgICAgICAgIGlzRW1wdHk6IGZhbHNl
LAorICAgICAgICBhcml0eTogMCwKKyAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAg
ICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24g
YnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3Vt
ZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCIg
ICAgICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICAg
IHZhciBlbDEgPSBkb20uY3JlYXRlRWxlbWVudCgiZm9vdGVyIik7CisgICAgICAgICAgZG9tLnNl
dEF0dHJpYnV0ZShlbDEsICJpZCIsICJmb290ZXIiKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9t
LmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxk
KGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4i
KTsKKyAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMiwgImlkIiwgInRvZG8tY291bnQiKTsK
KyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIpOworICAgICAg
ICAgIHZhciBlbDQgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgZG9tLmFwcGVu
ZENoaWxkKGVsMywgZWw0KTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOwor
ICAgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAiKTsKKyAgICAgICAgICBk
b20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRl
Q29tbWVudCgiIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAg
ICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCIgbGVmdCIpOworICAgICAgICAgIGRv
bS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwg
ZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAg
Iik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIg
ZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInVsIik7CisgICAgICAgICAgZG9tLnNldEF0dHJpYnV0
ZShlbDIsICJpZCIsICJmaWx0ZXJzIik7CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVU
ZXh0Tm9kZSgiXG4gICAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwg
ZWwzKTsKKyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxpIik7CisgICAg
ICAgICAgdmFyIGVsNCA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20uYXBw
ZW5kQ2hpbGQoZWwzLCBlbDQpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7
CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAgIik7
CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgICB2YXIgZWwz
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxpIik7CisgICAgICAgICAgdmFyIGVsNCA9IGRvbS5jcmVh
dGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQpOworICAg
ICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAgdmFyIGVsMyA9IGRv
bS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENo
aWxkKGVsMiwgZWwzKTsKKyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxp
Iik7CisgICAgICAgICAgdmFyIGVsNCA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAg
ICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDIsIGVsMyk7CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAg
ICAgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAg
ZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0
ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4
dE5vZGUoIiAgICAgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIgZWwxID0g
ZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAs
IGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVpbGRS
ZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250
ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBlbGVtZW50MSA9IGRvbS5jaGlsZEF0KGZy
YWdtZW50LCBbMV0pOworICAgICAgICAgIHZhciBlbGVtZW50MiA9IGRvbS5jaGlsZEF0KGVsZW1l
bnQxLCBbMV0pOworICAgICAgICAgIHZhciBlbGVtZW50MyA9IGRvbS5jaGlsZEF0KGVsZW1lbnQx
LCBbM10pOworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoNik7CisgICAgICAgICAg
bW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZG9tLmNoaWxkQXQoZWxlbWVudDIsIFswXSks
IDAsIDApOworICAgICAgICAgIG1vcnBoc1sxXSA9IGRvbS5jcmVhdGVNb3JwaEF0KGVsZW1lbnQy
LCAyLCAyKTsKKyAgICAgICAgICBtb3JwaHNbMl0gPSBkb20uY3JlYXRlTW9ycGhBdChkb20uY2hp
bGRBdChlbGVtZW50MywgWzFdKSwgMCwgMCk7CisgICAgICAgICAgbW9ycGhzWzNdID0gZG9tLmNy
ZWF0ZU1vcnBoQXQoZG9tLmNoaWxkQXQoZWxlbWVudDMsIFszXSksIDAsIDApOworICAgICAgICAg
IG1vcnBoc1s0XSA9IGRvbS5jcmVhdGVNb3JwaEF0KGRvbS5jaGlsZEF0KGVsZW1lbnQzLCBbNV0p
LCAwLCAwKTsKKyAgICAgICAgICBtb3JwaHNbNV0gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50
MSwgNSwgNSk7CisgICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwKKyAgICAgICAg
c3RhdGVtZW50czogW1siY29udGVudCIsICJyZW1haW5pbmcubGVuZ3RoIiwgWyJsb2MiLCBbbnVs
bCwgWzksIDM4XSwgWzksIDU4XV1dXSwgWyJpbmxpbmUiLCAicGx1cmFsaXplIiwgWyJpdGVtIiwg
WyJnZXQiLCAicmVtYWluaW5nLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFs5LCA4N10sIFs5LCAx
MDNdXV1dXSwgW10sIFsibG9jIiwgW251bGwsIFs5LCA2OF0sIFs5LCAxMDVdXV1dLCBbImJsb2Nr
IiwgImxpbmstdG8iLCBbImluZGV4Il0sIFsiYWN0aXZlQ2xhc3MiLCAic2VsZWN0ZWQiXSwgMCwg
bnVsbCwgWyJsb2MiLCBbbnVsbCwgWzExLCAxNF0sIFsxMSwgNzJdXV1dLCBbImJsb2NrIiwgImxp
bmstdG8iLCBbImFjdGl2ZSJdLCBbImFjdGl2ZUNsYXNzIiwgInNlbGVjdGVkIl0sIDEsIG51bGws
IFsibG9jIiwgW251bGwsIFsxMiwgMTRdLCBbMTIsIDc2XV1dXSwgWyJibG9jayIsICJsaW5rLXRv
IiwgWyJjb21wbGV0ZWQiXSwgWyJhY3RpdmVDbGFzcyIsICJzZWxlY3RlZCJdLCAyLCBudWxsLCBb
ImxvYyIsIFtudWxsLCBbMTMsIDE0XSwgWzEzLCA4Ml1dXV0sIFsiYmxvY2siLCAiaWYiLCBbWyJn
ZXQiLCAiY29tcGxldGVkLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFsxNSwgMTRdLCBbMTUsIDMw
XV1dXV0sIFtdLCAzLCBudWxsLCBbImxvYyIsIFtudWxsLCBbMTUsIDhdLCBbMTcsIDE1XV1dXV0s
CisgICAgICAgIGxvY2FsczogW10sCisgICAgICAgIHRlbXBsYXRlczogW2NoaWxkMCwgY2hpbGQx
LCBjaGlsZDIsIGNoaWxkM10KKyAgICAgIH07CisgICAgfSkoKTsKKyAgICByZXR1cm4geworICAg
ICAgbWV0YTogeworICAgICAgICAiZnJhZ21lbnRSZWFzb24iOiB7CisgICAgICAgICAgIm5hbWUi
OiAibWlzc2luZy13cmFwcGVyIiwKKyAgICAgICAgICAicHJvYmxlbXMiOiBbIm11bHRpcGxlLW5v
ZGVzIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAg
ICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAic3Rh
cnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAiY29sdW1uIjogMAor
ICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICJsaW5lIjogMjks
CisgICAgICAgICAgICAiY29sdW1uIjogOQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAg
ICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIgorICAg
ICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNo
ZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxk
RnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAg
PSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNy
ZWF0ZUVsZW1lbnQoInNlY3Rpb24iKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDEsICJp
ZCIsICJ0b2RvYXBwIik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxu
ICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVs
MiA9IGRvbS5jcmVhdGVFbGVtZW50KCJoZWFkZXIiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0
ZShlbDIsICJpZCIsICJoZWFkZXIiKTsKKyAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0
Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAg
ICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxlbWVudCgiaDEiKTsKKyAgICAgICAgdmFyIGVsNCA9
IGRvbS5jcmVhdGVUZXh0Tm9kZSgidG9kb3MiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVs
MywgZWw0KTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgdmFy
IGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRD
aGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxlbWVudCgiaW5w
dXQiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJ0eXBlIiwgInRleHQiKTsKKyAg
ICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJpZCIsICJuZXctdG9kbyIpOworICAgICAgICBk
b20uc2V0QXR0cmlidXRlKGVsMywgInBsYWNlaG9sZGVyIiwgIldoYXQgbmVlZHMgdG8gYmUgZG9u
ZT8iKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJhdXRvZm9jdXMiLCAiIik7Cisg
ICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20u
Y3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwz
KTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9
IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3Jl
YXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgIGRvbS5hcHBl
bmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7Cisg
ICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgIGRvbS5h
cHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlRWxlbWVu
dCgiZm9vdGVyIik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiaWQiLCAiaW5mbyIp
OworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgIik7CisgICAgICAg
IGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRl
RWxlbWVudCgicCIpOworICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCJEb3Vi
bGUtY2xpY2sgdG8gZWRpdCBhIHRvZG8iKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwg
ZWwzKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVs
MiA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQo
ZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInAiKTsKKyAg
ICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgQ3JlYXRlZCBieVxuICAg
ICIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICB2YXIgZWwz
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMs
ICJocmVmIiwgImh0dHA6Ly9naXRodWIuY29tL2NpYmVybm94Iik7CisgICAgICAgIHZhciBlbDQg
PSBkb20uY3JlYXRlVGV4dE5vZGUoIk1pZ3VlbCBDYW1iYSIpOworICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwzLCBlbDQpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAg
ICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCIsXG4gICAgIik7CisgICAgICAgIGRv
bS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxl
bWVudCgiYSIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMywgImhyZWYiLCAiaHR0cDov
L2dpdGh1Yi5jb20vYWRkeW9zbWFuaSIpOworICAgICAgICB2YXIgZWw0ID0gZG9tLmNyZWF0ZVRl
eHROb2RlKCJBZGR5IE9zbWFuaSIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQp
OworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICB2YXIgZWwzID0g
ZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIs
IGVsMyk7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBl
bDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxk
KGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVFbGVtZW50KCJwIik7Cisg
ICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlBhcnQgb2YgIik7CisgICAgICAg
IGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRl
RWxlbWVudCgiYSIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMywgImhyZWYiLCAiaHR0
cDovL3RvZG9tdmMuY29tIik7CisgICAgICAgIHZhciBlbDQgPSBkb20uY3JlYXRlVGV4dE5vZGUo
IlRvZG9NVkMiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMywgZWw0KTsKKyAgICAgICAg
ZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwg
ZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsKKyAgICAg
ICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVs
MCwgZWwxKTsKKyAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRl
ck5vZGVzOiBmdW5jdGlvbiBidWlsZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1
YWxFbGVtZW50KSB7CisgICAgICAgIHZhciBlbGVtZW50NCA9IGRvbS5jaGlsZEF0KGZyYWdtZW50
LCBbMF0pOworICAgICAgICB2YXIgZWxlbWVudDUgPSBkb20uY2hpbGRBdChlbGVtZW50NCwgWzEs
IDNdKTsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgzKTsKKyAgICAgICAgbW9ycGhz
WzBdID0gZG9tLmNyZWF0ZUF0dHJNb3JwaChlbGVtZW50NSwgJ29ua2V5ZG93bicpOworICAgICAg
ICBtb3JwaHNbMV0gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50NCwgMywgMyk7CisgICAgICAg
IG1vcnBoc1syXSA9IGRvbS5jcmVhdGVNb3JwaEF0KGVsZW1lbnQ0LCA1LCA1KTsKKyAgICAgICAg
cmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJhdHRyaWJ1dGUi
LCAib25rZXlkb3duIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsiY3JlYXRlVG9kbyJdLCBbXSwg
WyJsb2MiLCBbbnVsbCwgWzQsIDQ3XSwgWzQsIDcwXV1dXV0sIFsiY29udGVudCIsICJvdXRsZXQi
LCBbImxvYyIsIFtudWxsLCBbNiwgNF0sIFs2LCAxNF1dXV0sIFsiYmxvY2siLCAiaWYiLCBbWyJz
dWJleHByIiwgImd0IiwgW1siZ2V0IiwgIm1vZGVsLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFs3
LCAxNF0sIFs3LCAyNl1dXV0sIDBdLCBbXSwgWyJsb2MiLCBbbnVsbCwgWzcsIDEwXSwgWzcsIDI5
XV1dXV0sIFtdLCAwLCBudWxsLCBbImxvYyIsIFtudWxsLCBbNywgNF0sIFsxOSwgMTFdXV1dXSwK
KyAgICAgIGxvY2FsczogW10sCisgICAgICB0ZW1wbGF0ZXM6IFtjaGlsZDBdCisgICAgfTsKKyAg
fSkoKSk7Cit9KTsKK2RlZmluZSgidG9kb212Yy90ZW1wbGF0ZXMvY29tcGxldGVkIiwgWyJleHBv
cnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVy
LkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIG1l
dGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1lIjogIm1p
c3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAg
ICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxv
YyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAic3RhcnQiOiB7Cisg
ICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAg
IH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICJsaW5lIjogMSwKKyAgICAgICAg
ICAgICJjb2x1bW4iOiAyNQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVs
ZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcGxldGVkLmhicyIKKyAgICAgIH0sCisgICAg
ICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVkRnJhZ21lbnQ6
IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZyYWdtZW50OiBm
dW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0
ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVDb21tZW50
KCIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgcmV0dXJu
IGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJl
bmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAgIHZh
ciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgIG1vcnBoc1swXSA9IGRvbS5jcmVhdGVN
b3JwaEF0KGZyYWdtZW50LCAwLCAwLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgICAgIGRvbS5p
bnNlcnRCb3VuZGFyeShmcmFnbWVudCwgMCk7CisgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFyeShm
cmFnbWVudCwgbnVsbCk7CisgICAgICAgIHJldHVybiBtb3JwaHM7CisgICAgICB9LAorICAgICAg
c3RhdGVtZW50czogW1siaW5saW5lIiwgInRvZG8tbGlzdCIsIFtdLCBbInRvZG9zIiwgWyJzdWJl
eHByIiwgIkBtdXQiLCBbWyJnZXQiLCAidG9kb3MiLCBbImxvYyIsIFtudWxsLCBbMSwgMThdLCBb
MSwgMjNdXV1dXSwgW10sIFtdXV0sIFsibG9jIiwgW251bGwsIFsxLCAwXSwgWzEsIDI1XV1dXV0s
CisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXQorICAgIH07CisgIH0pKCkp
OworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1pdGVtIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9
IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAg
ICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1l
IjogIm1pc3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInByb2JsZW1zIjogWyJtdWx0aXBsZS1u
b2RlcyJdCisgICAgICAgIH0sCisgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisg
ICAgICAgICJsb2MiOiB7CisgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0
YXJ0IjogeworICAgICAgICAgICAgImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAK
KyAgICAgICAgICB9LAorICAgICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDYs
CisgICAgICAgICAgICAiY29sdW1uIjogMTUzCisgICAgICAgICAgfQorICAgICAgICB9LAorICAg
ICAgICAibW9kdWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8taXRl
bS5oYnMiCisgICAgICB9LAorICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwK
KyAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAor
ICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAg
ICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBl
bDEgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAiY2xhc3MiLCAidmlldyIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHRO
b2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAg
IHZhciBlbDIgPSBkb20uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgZG9tLnNldEF0
dHJpYnV0ZShlbDIsICJ0eXBlIiwgImNoZWNrYm94Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1
dGUoZWwyLCAiY2xhc3MiLCAidG9nZ2xlIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEs
IGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5j
cmVhdGVFbGVtZW50KCJsYWJlbCIpOworICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUNvbW1l
bnQoIiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHRO
b2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAg
IHZhciBlbDIgPSBkb20uY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CisgICAgICAgIGRvbS5zZXRB
dHRyaWJ1dGUoZWwyLCAiY2xhc3MiLCAiZGVzdHJveSIpOworICAgICAgICBkb20uYXBwZW5kQ2hp
bGQoZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIp
OworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJc
biIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIgZWwx
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAidHlwZSIsICJ0ZXh0Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiY2xh
c3MiLCAiZWRpdCIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMSwgImF1dG9mb2N1cyIs
ICIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgcmV0dXJu
IGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJl
bmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAgIHZh
ciBlbGVtZW50MCA9IGRvbS5jaGlsZEF0KGZyYWdtZW50LCBbMF0pOworICAgICAgICB2YXIgZWxl
bWVudDEgPSBkb20uY2hpbGRBdChlbGVtZW50MCwgWzFdKTsKKyAgICAgICAgaWYgKHRoaXMuY2Fj
aGVkRnJhZ21lbnQpIHsKKyAgICAgICAgICBkb20ucmVwYWlyQ2xvbmVkTm9kZShlbGVtZW50MSwg
W10sIHRydWUpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50MiA9IGRvbS5jaGlsZEF0
KGVsZW1lbnQwLCBbM10pOworICAgICAgICB2YXIgZWxlbWVudDMgPSBkb20uY2hpbGRBdChlbGVt
ZW50MCwgWzVdKTsKKyAgICAgICAgdmFyIGVsZW1lbnQ0ID0gZG9tLmNoaWxkQXQoZnJhZ21lbnQs
IFsyXSk7CisgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoOCk7CisgICAgICAgIG1vcnBo
c1swXSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDEsICdjaGVja2VkJyk7CisgICAgICAg
IG1vcnBoc1sxXSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDEsICdvbmNoYW5nZScpOwor
ICAgICAgICBtb3JwaHNbMl0gPSBkb20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQyLCAnb25kYmxj
bGljaycpOworICAgICAgICBtb3JwaHNbM10gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50Miwg
MCwgMCk7CisgICAgICAgIG1vcnBoc1s0XSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDMs
ICdvbmNsaWNrJyk7CisgICAgICAgIG1vcnBoc1s1XSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxl
bWVudDQsICd2YWx1ZScpOworICAgICAgICBtb3JwaHNbNl0gPSBkb20uY3JlYXRlQXR0ck1vcnBo
KGVsZW1lbnQ0LCAnb25ibHVyJyk7CisgICAgICAgIG1vcnBoc1s3XSA9IGRvbS5jcmVhdGVBdHRy
TW9ycGgoZWxlbWVudDQsICdvbmtleWRvd24nKTsKKyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAg
ICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJhdHRyaWJ1dGUiLCAiY2hlY2tlZCIsIFsiZ2V0
IiwgInRvZG8uY29tcGxldGVkIiwgWyJsb2MiLCBbbnVsbCwgWzIsIDUwXSwgWzIsIDY0XV1dXV0s
IFsiYXR0cmlidXRlIiwgIm9uY2hhbmdlIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsidG9nZ2xl
Q29tcGxldGVkIl0sIFtdLCBbImxvYyIsIFtudWxsLCBbMiwgNzZdLCBbMiwgMTA0XV1dXV0sIFsi
YXR0cmlidXRlIiwgIm9uZGJsY2xpY2siLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJzdGFydEVk
aXRpbmciXSwgW10sIFsibG9jIiwgW251bGwsIFszLCAyMF0sIFszLCA0NV1dXV1dLCBbImNvbnRl
bnQiLCAidG9kby50aXRsZSIsIFsibG9jIiwgW251bGwsIFszLCA0Nl0sIFszLCA2MF1dXV0sIFsi
YXR0cmlidXRlIiwgIm9uY2xpY2siLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJyZW1vdmVUb2Rv
Il0sIFtdLCBbImxvYyIsIFtudWxsLCBbNCwgMThdLCBbNCwgNDFdXV1dXSwgWyJhdHRyaWJ1dGUi
LCAidmFsdWUiLCBbImdldCIsICJ0b2RvLnRpdGxlIiwgWyJsb2MiLCBbbnVsbCwgWzYsIDQwXSwg
WzYsIDUwXV1dXV0sIFsiYXR0cmlidXRlIiwgIm9uYmx1ciIsIFsic3ViZXhwciIsICJhY3Rpb24i
LCBbImRvbmVFZGl0aW5nIl0sIFsidmFsdWUiLCAidGFyZ2V0LnZhbHVlIl0sIFsibG9jIiwgW251
bGwsIFs2LCA2MF0sIFs2LCAxMDVdXV1dXSwgWyJhdHRyaWJ1dGUiLCAib25rZXlkb3duIiwgWyJz
dWJleHByIiwgImFjdGlvbiIsIFsiaGFuZGxlS2V5ZG93biJdLCBbXSwgWyJsb2MiLCBbbnVsbCwg
WzYsIDExNl0sIFs2LCAxNDJdXV1dXV0sCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxh
dGVzOiBbXQorICAgIH07CisgIH0pKCkpOworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVz
L2NvbXBvbmVudHMvdG9kby1saXN0IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7
CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlv
biAoKSB7CisgICAgdmFyIGNoaWxkMCA9IChmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY2hpbGQw
ID0gKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7Cisg
ICAgICAgICAgICAiZnJhZ21lbnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lv
biI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICAgICAibG9jIjogeworICAgICAgICAgICAgICAi
c291cmNlIjogbnVsbCwKKyAgICAgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAg
ICJsaW5lIjogMiwKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogMgorICAgICAgICAgICAgICB9
LAorICAgICAgICAgICAgICAiZW5kIjogeworICAgICAgICAgICAgICAgICJsaW5lIjogNCwKKyAg
ICAgICAgICAgICAgICAiY29sdW1uIjogMgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50
cy90b2RvLWxpc3QuaGJzIgorICAgICAgICAgIH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2Us
CisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRl
VGV4dE5vZGUoIiAgICAiKTsKKyAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAg
ICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMSwgInR5cGUiLCAiY2hlY2tib3giKTsKKyAgICAg
ICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiaWQiLCAidG9nZ2xlLWFsbCIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBk
b20uY3JlYXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWww
LCBlbDEpOworICAgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgICB9LAorICAgICAgICAg
IGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFnbWVu
dCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50MCA9IGRvbS5j
aGlsZEF0KGZyYWdtZW50LCBbMV0pOworICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVkRnJhZ21l
bnQpIHsKKyAgICAgICAgICAgICAgZG9tLnJlcGFpckNsb25lZE5vZGUoZWxlbWVudDAsIFtdLCB0
cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXko
Mik7CisgICAgICAgICAgICBtb3JwaHNbMF0gPSBkb20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQw
LCAnY2hlY2tlZCcpOworICAgICAgICAgICAgbW9ycGhzWzFdID0gZG9tLmNyZWF0ZUF0dHJNb3Jw
aChlbGVtZW50MCwgJ29uY2hhbmdlJyk7CisgICAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAg
ICAgICAgIH0sCisgICAgICAgICAgc3RhdGVtZW50czogW1siYXR0cmlidXRlIiwgImNoZWNrZWQi
LCBbImdldCIsICJhbGxDb21wbGV0ZWQiLCBbImxvYyIsIFtudWxsLCBbMywgNTNdLCBbMywgNjVd
XV1dXSwgWyJhdHRyaWJ1dGUiLCAib25jaGFuZ2UiLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJ0
b2dnbGVBbGwiXSwgW10sIFsibG9jIiwgW251bGwsIFszLCA3N10sIFszLCA5OV1dXV1dXSwKKyAg
ICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICAgIHRlbXBsYXRlczogW10KKyAgICAgICAgfTsK
KyAgICAgIH0pKCk7CisgICAgICB2YXIgY2hpbGQxID0gKGZ1bmN0aW9uICgpIHsKKyAgICAgICAg
cmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7CisgICAgICAgICAgICAiZnJhZ21lbnRSZWFzb24i
OiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAg
ICAgICAibG9jIjogeworICAgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAg
ICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAgICJsaW5lIjogNiwKKyAgICAgICAgICAgICAg
ICAiY29sdW1uIjogNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAiZW5kIjogewor
ICAgICAgICAgICAgICAgICJsaW5lIjogOCwKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogNAor
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUi
OiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWxpc3QuaGJzIgorICAgICAgICAg
IH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICAgICAgYXJpdHk6IDEsCisgICAg
ICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNl
LAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7
CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAg
ICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAgICAgICIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBk
b20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBl
bDEpOworICAgICAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsKKyAg
ICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgICAgIH0sCisgICAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAg
ICAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAgICAgICAgIG1vcnBoc1sw
XSA9IGRvbS5jcmVhdGVNb3JwaEF0KGZyYWdtZW50LCAxLCAxLCBjb250ZXh0dWFsRWxlbWVudCk7
CisgICAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgICAgIH0sCisgICAgICAgICAgc3Rh
dGVtZW50czogW1siaW5saW5lIiwgInRvZG8taXRlbSIsIFtdLCBbInRvZG8iLCBbInN1YmV4cHIi
LCAiQG11dCIsIFtbImdldCIsICJ0b2RvIiwgWyJsb2MiLCBbbnVsbCwgWzcsIDIzXSwgWzcsIDI3
XV1dXV0sIFtdLCBbXV0sICJvblN0YXJ0RWRpdCIsIFsic3ViZXhwciIsICJhY3Rpb24iLCBbImRp
c2FibGVUb2dnbGUiXSwgW10sIFsibG9jIiwgW251bGwsIFs3LCA0MF0sIFs3LCA2NF1dXV0sICJv
bkVuZEVkaXQiLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJlbmFibGVUb2dnbGUiXSwgW10sIFsi
bG9jIiwgW251bGwsIFs3LCA3NV0sIFs3LCA5OF1dXV1dLCBbImxvYyIsIFtudWxsLCBbNywgNl0s
IFs3LCAxMDBdXV1dXSwKKyAgICAgICAgICBsb2NhbHM6IFsidG9kbyJdLAorICAgICAgICAgIHRl
bXBsYXRlczogW10KKyAgICAgICAgfTsKKyAgICAgIH0pKCk7CisgICAgICByZXR1cm4geworICAg
ICAgICBtZXRhOiB7CisgICAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICAg
Im5hbWUiOiAibWlzc2luZy13cmFwcGVyIiwKKyAgICAgICAgICAgICJwcm9ibGVtcyI6IFsid3Jv
bmctdHlwZSIsICJtdWx0aXBsZS1ub2RlcyJdCisgICAgICAgICAgfSwKKyAgICAgICAgICAicmV2
aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAgICAi
c291cmNlIjogbnVsbCwKKyAgICAgICAgICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgImxp
bmUiOiAxLAorICAgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAgICJsaW5lIjogMTAsCisgICAgICAgICAgICAg
ICJjb2x1bW4iOiAwCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAibW9k
dWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8tbGlzdC5oYnMiCisg
ICAgICAgIH0sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICBhcml0eTogMCwKKyAg
ICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwK
KyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAg
ICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
ICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRD
aGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgi
ICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICAgIHZh
ciBlbDEgPSBkb20uY3JlYXRlRWxlbWVudCgidWwiKTsKKyAgICAgICAgICBkb20uc2V0QXR0cmli
dXRlKGVsMSwgImlkIiwgInRvZG8tbGlzdCIpOworICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAiY2xhc3MiLCAidG9kby1saXN0Iik7CisgICAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVh
dGVUZXh0Tm9kZSgiXG4iKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwxLCBlbDIpOwor
ICAgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgZG9t
LmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRl
eHROb2RlKCIgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9t
LmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVs
MSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVpbGRSZW5k
ZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0
dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMik7CisgICAg
ICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRl
eHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBtb3JwaHNbMV0gPSBkb20uY3JlYXRlTW9ycGhBdChk
b20uY2hpbGRBdChmcmFnbWVudCwgWzJdKSwgMSwgMSk7CisgICAgICAgICAgZG9tLmluc2VydEJv
dW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgICB9
LAorICAgICAgICBzdGF0ZW1lbnRzOiBbWyJibG9jayIsICJpZiIsIFtbImdldCIsICJjYW5Ub2dn
bGUiLCBbImxvYyIsIFtudWxsLCBbMiwgOF0sIFsyLCAxN11dXV1dLCBbXSwgMCwgbnVsbCwgWyJs
b2MiLCBbbnVsbCwgWzIsIDJdLCBbNCwgOV1dXV0sIFsiYmxvY2siLCAiZWFjaCIsIFtbImdldCIs
ICJ0b2RvcyIsIFsibG9jIiwgW251bGwsIFs2LCAxMl0sIFs2LCAxN11dXV1dLCBbXSwgMSwgbnVs
bCwgWyJsb2MiLCBbbnVsbCwgWzYsIDRdLCBbOCwgMTNdXV1dXSwKKyAgICAgICAgbG9jYWxzOiBb
XSwKKyAgICAgICAgdGVtcGxhdGVzOiBbY2hpbGQwLCBjaGlsZDFdCisgICAgICB9OworICAgIH0p
KCk7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29u
IjogeworICAgICAgICAgICJuYW1lIjogIm1pc3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInBy
b2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjog
IkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVs
bCwKKyAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAg
ICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAg
ICAgICAgICJsaW5lIjogMTEsCisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0K
KyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29t
cG9uZW50cy90b2RvLWxpc3QuaGJzIgorICAgICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNlLAor
ICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1Jl
bmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21l
bnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgp
OworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwKKyAg
ICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFn
bWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJh
eSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAs
IDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdt
ZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCBudWxsKTsKKyAg
ICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJibG9j
ayIsICJpZiIsIFtbImdldCIsICJ0b2Rvcy5sZW5ndGgiLCBbImxvYyIsIFtudWxsLCBbMSwgNl0s
IFsxLCAxOF1dXV1dLCBbXSwgMCwgbnVsbCwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBbMTAsIDdd
XV1dXSwKKyAgICAgIGxvY2FsczogW10sCisgICAgICB0ZW1wbGF0ZXM6IFtjaGlsZDBdCisgICAg
fTsKKyAgfSkoKSk7Cit9KTsKK2RlZmluZSgidG9kb212Yy90ZW1wbGF0ZXMvaW5kZXgiLCBbImV4
cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgZXhwb3J0c1siZGVmYXVsdCJdID0gRW1i
ZXIuSFRNTEJhcnMudGVtcGxhdGUoKGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgY2hpbGQwID0gKGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1ldGE6IHsKKyAgICAgICAgICAi
ZnJhZ21lbnRSZWFzb24iOiB7CisgICAgICAgICAgICAibmFtZSI6ICJtaXNzaW5nLXdyYXBwZXIi
LAorICAgICAgICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgICB9LAor
ICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICAgImxvYyI6IHsK
KyAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAorICAgICAgICAgICAgInN0YXJ0IjogeworICAg
ICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAgICJjb2x1bW4iOiAwCisgICAgICAg
ICAgICB9LAorICAgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICAgImxpbmUiOiAzLAor
ICAgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisg
ICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvaW5kZXguaGJzIgorICAg
ICAgICB9LAorICAgICAgICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgICAgYXJpdHk6IDAsCisgICAg
ICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisg
ICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAg
ICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgICAg
dmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwwLCBlbDEpOworICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlQ29tbWVudCgi
Iik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGls
ZChlbDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAg
YnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50
LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXko
MSk7CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDEs
IDEsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAg
ICB9LAorICAgICAgICBzdGF0ZW1lbnRzOiBbWyJpbmxpbmUiLCAidG9kby1saXN0IiwgW10sIFsi
dG9kb3MiLCBbInN1YmV4cHIiLCAiQG11dCIsIFtbImdldCIsICJtb2RlbCIsIFsibG9jIiwgW251
bGwsIFsyLCAyMF0sIFsyLCAyNV1dXV1dLCBbXSwgW11dXSwgWyJsb2MiLCBbbnVsbCwgWzIsIDJd
LCBbMiwgMjddXV1dXSwKKyAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgdGVtcGxhdGVzOiBb
XQorICAgICAgfTsKKyAgICB9KSgpOworICAgIHJldHVybiB7CisgICAgICBtZXRhOiB7CisgICAg
ICAgICJmcmFnbWVudFJlYXNvbiI6IHsKKyAgICAgICAgICAibmFtZSI6ICJtaXNzaW5nLXdyYXBw
ZXIiLAorICAgICAgICAgICJwcm9ibGVtcyI6IFsid3JvbmctdHlwZSJdCisgICAgICAgIH0sCisg
ICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICJsb2MiOiB7CisgICAg
ICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAg
ImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAKKyAgICAgICAgICB9LAorICAgICAg
ICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDQsCisgICAgICAgICAgICAiY29sdW1u
IjogMAorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9k
b212Yy90ZW1wbGF0ZXMvaW5kZXguaGJzIgorICAgICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNl
LAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhh
c1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJh
Z21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVu
dCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICBk
b20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwK
KyAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBm
cmFnbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBB
cnJheSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQs
IDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZy
YWdtZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCBudWxsKTsK
KyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJi
bG9jayIsICJpZiIsIFtbImdldCIsICJtb2RlbC5sZW5ndGgiLCBbImxvYyIsIFtudWxsLCBbMSwg
Nl0sIFsxLCAxOF1dXV1dLCBbXSwgMCwgbnVsbCwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBbMywg
N11dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW2NoaWxkMF0KKyAg
ICB9OworICB9KSgpKTsKK30pOworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCisKKworLyog
anNoaW50IGlnbm9yZTplbmQgKi8KKworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCitkZWZp
bmUoJ3RvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50JywgWydlbWJlciddLCBmdW5jdGlvbihFbWJl
cikgeworICB2YXIgcHJlZml4ID0gJ3RvZG9tdmMnOworLyoganNoaW50IGlnbm9yZTpzdGFydCAq
LworCit0cnkgeworICB2YXIgbWV0YU5hbWUgPSBwcmVmaXggKyAnL2NvbmZpZy9lbnZpcm9ubWVu
dCc7CisgIHZhciByYXdDb25maWcgPSBFbWJlclsnZGVmYXVsdCddLiQoJ21ldGFbbmFtZT0iJyAr
IG1ldGFOYW1lICsgJyJdJykuYXR0cignY29udGVudCcpOworICB2YXIgY29uZmlnID0gSlNPTi5w
YXJzZSh1bmVzY2FwZShyYXdDb25maWcpKTsKKworICByZXR1cm4geyAnZGVmYXVsdCc6IGNvbmZp
ZyB9OworfQorY2F0Y2goZXJyKSB7CisgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlYWQg
Y29uZmlnIGZyb20gbWV0YSB0YWcgd2l0aCBuYW1lICInICsgbWV0YU5hbWUgKyAnIi4nKTsKK30K
KworLyoganNoaW50IGlnbm9yZTplbmQgKi8KKworfSk7CisKKy8qIGpzaGludCBpZ25vcmU6ZW5k
ICovCisKKy8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KKworaWYgKCFydW5uaW5nVGVzdHMpIHsK
KyAgcmVxdWlyZSgidG9kb212Yy9hcHAiKVsiZGVmYXVsdCJdLmNyZWF0ZSh7Im5hbWUiOiJ0b2Rv
bXZjIiwidmVyc2lvbiI6IjAuMC4wKzVkYmM1ZmI5In0pOworfQorCisvKiBqc2hpbnQgaWdub3Jl
OmVuZCAqLworLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9kb212Yy5tYXAKZGlmZiAtLWdpdCBhL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Fzc2V0cy92ZW5kb3IuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVlNDY0NWRhZDI4MTI0MzVhM2IyYzQ0OTY0
NGE2OGViMTI2NzIwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fz
c2V0cy92ZW5kb3IuY3NzCkBAIC0wLDAgKzEsNTIxIEBACitociB7CisgICAgbWFyZ2luOiAyMHB4
IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2M1YzVjNTsK
KyAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNmN2Y3Zjc7Cit9CisKKy5sZWFybiBhIHsK
KyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAg
ICBjb2xvcjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92ZXIgeworICAgIHRleHQtZGVjb3Jh
dGlvbjogdW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdlOworfQorCisubGVhcm4gaDMsCisu
bGVhcm4gaDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjogMTBweCAwOworICAgIGZvbnQtd2Vp
Z2h0OiA1MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICBjb2xvcjogIzAwMDsKK30KKwor
LmxlYXJuIGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9CisKKy5sZWFybiBoNCB7CisgICAg
Zm9udC1zaXplOiAxOHB4OworfQorCisubGVhcm4gaDUgeworICAgIG1hcmdpbi1ib3R0b206IDA7
CisgICAgZm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4gdWwgeworICAgIHBhZGRpbmc6IDA7
CisgICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisubGVhcm4gbGkgeworICAgIGxpbmUt
aGVpZ2h0OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAgZm9udC1zaXplOiAxNXB4OworICAg
IGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMzsKKyAgICBtYXJnaW4tdG9w
OiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKyNpc3N1ZS1jb3VudCB7CisgICAgZGlz
cGxheTogbm9uZTsKK30KKworLnF1b3RlIHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2lu
OiAyMHB4IDAgNjBweCAwOworfQorCisucXVvdGUgcCB7CisgICAgZm9udC1zdHlsZTogaXRhbGlj
OworfQorCisucXVvdGUgcDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfigJwnOworICAgIGZvbnQt
c2l6ZTogNTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29sdXRlOwor
ICAgIHRvcDogLTIwcHg7CisgICAgbGVmdDogM3B4OworfQorCisucXVvdGUgcDphZnRlciB7Cisg
ICAgY29udGVudDogJ+KAnSc7CisgICAgZm9udC1zaXplOiA1MHB4OworICAgIG9wYWNpdHk6IC4x
NTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgYm90dG9tOiAtNDJweDsKKyAgICByaWdo
dDogM3B4OworfQorCisucXVvdGUgZm9vdGVyIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cisg
ICAgYm90dG9tOiAtNDBweDsKKyAgICByaWdodDogMDsKK30KKworLnF1b3RlIGZvb3RlciBpbWcg
eworICAgIGJvcmRlci1yYWRpdXM6IDNweDsKK30KKworLnF1b3RlIGZvb3RlciBhIHsKKyAgICBt
YXJnaW4tbGVmdDogNXB4OworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5zcGVl
Y2gtYnViYmxlIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgcGFkZGluZzogMTBweDsK
KyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNCk7CisgICAgYm9yZGVyLXJhZGl1czog
NXB4OworfQorCisuc3BlZWNoLWJ1YmJsZTphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAg
cG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMTAwJTsKKyAgICByaWdodDogMzBweDsKKyAg
ICBib3JkZXI6IDEzcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLXRvcC1jb2xvcjog
cmdiYSgwLCAwLCAwLCAuMDQpOworfQorCisubGVhcm4tYmFyID4gLmxlYXJuIHsKKyAgICBwb3Np
dGlvbjogYWJzb2x1dGU7CisgICAgd2lkdGg6IDI3MnB4OworICAgIHRvcDogOHB4OworICAgIGxl
ZnQ6IC0zMDBweDsKKyAgICBwYWRkaW5nOiAxMHB4OworICAgIGJvcmRlci1yYWRpdXM6IDVweDsK
KyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC42KTsKKyAgICB0cmFu
c2l0aW9uLXByb3BlcnR5OiBsZWZ0OworICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDUwMG1zOwor
fQorCitAbWVkaWEgKG1pbi13aWR0aDogODk5cHgpIHsKKyAgICAubGVhcm4tYmFyIHsKKyAgICAg
ICAgd2lkdGg6IGF1dG87CisgICAgICAgIHBhZGRpbmctbGVmdDogMzAwcHg7CisgICAgfQorCisg
ICAgLmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgICAgIGxlZnQ6IDhweDsKKyAgICB9Cit9CisK
K2h0bWwsCitib2R5IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworYnV0
dG9uIHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBib3JkZXI6IDA7Cisg
ICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgdmVydGljYWwt
YWxpZ246IGJhc2VsaW5lOworICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OworICAgIGZvbnQtd2Vp
Z2h0OiBpbmhlcml0OworICAgIGNvbG9yOiBpbmhlcml0OworICAgIC13ZWJraXQtYXBwZWFyYW5j
ZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworICAgIC13ZWJraXQtZm9udC1zbW9vdGhp
bmc6IGFudGlhbGlhc2VkOworICAgIC1tb3otZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwor
ICAgIGZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKK30KKworYm9keSB7CisgICAgZm9udDog
MTRweCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICAg
IGxpbmUtaGVpZ2h0OiAxLjRlbTsKKyAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OworICAgIGNvbG9y
OiAjNGQ0ZDRkOworICAgIG1pbi13aWR0aDogMjMwcHg7CisgICAgbWF4LXdpZHRoOiA1NTBweDsK
KyAgICBtYXJnaW46IDAgYXV0bzsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxp
YXNlZDsKKyAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICBmb250LXNt
b290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKK30KKworYnV0dG9u
LAoraW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CisgICAgb3V0bGluZTogbm9uZTsKK30KKworLmhp
ZGRlbiB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworI3RvZG9hcHAgeworICAgIGJhY2tncm91
bmQ6ICNmZmY7CisgICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBwb3NpdGlvbjogcmVs
YXRpdmU7CisgICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpLAor
ICAgICAgICAgICAgICAgIDAgMjVweCA1MHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpOworfQorCisj
dG9kb2FwcCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHls
ZTogaXRhbGljOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9
CisKKyN0b2RvYXBwIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBp
dGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKwor
I3RvZG9hcHAgaW5wdXQ6OmlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBpdGFs
aWM7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKworI3Rv
ZG9hcHAgaDEgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0xNTVweDsKKyAg
ICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDEwMHB4OworICAgIGZvbnQtd2VpZ2h0OiAx
MDA7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiByZ2JhKDE3NSwgNDcsIDQ3
LCAwLjE1KTsKKyAgICAtd2Via2l0LXRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7
CisgICAgLW1vei10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQt
cmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Cit9CisKKyNuZXctdG9kbywKKy5lZGl0IHsK
KyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luOiAwOworICAgIHdpZHRoOiAxMDAl
OworICAgIGZvbnQtc2l6ZTogMjRweDsKKyAgICBmb250LWZhbWlseTogaW5oZXJpdDsKKyAgICBm
b250LXdlaWdodDogaW5oZXJpdDsKKyAgICBsaW5lLWhlaWdodDogMS40ZW07CisgICAgYm9yZGVy
OiAwOworICAgIG91dGxpbmU6IG5vbmU7CisgICAgY29sb3I6IGluaGVyaXQ7CisgICAgcGFkZGlu
ZzogNnB4OworICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CisgICAgYm94LXNoYWRvdzogaW5z
ZXQgMCAtMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTsKKyAgICBib3gtc2l6aW5nOiBib3Jk
ZXItYm94OworICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIC1t
b3otZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIGZvbnQtc21vb3RoaW5nOiBhbnRp
YWxpYXNlZDsKK30KKworI25ldy10b2RvIHsKKyAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCA2
MHB4OworICAgIGJvcmRlcjogbm9uZTsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAu
MDAzKTsKKyAgICBib3gtc2hhZG93OiBpbnNldCAwIC0ycHggMXB4IHJnYmEoMCwwLDAsMC4wMyk7
Cit9CisKKyNtYWluIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgei1pbmRleDogMjsK
KyAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNjsKK30KKworbGFiZWxbZm9yPSd0b2dn
bGUtYWxsJ10geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2dnbGUtYWxsIHsKKyAgICBw
b3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAtNTVweDsKKyAgICBsZWZ0OiAtMTJweDsKKyAg
ICB3aWR0aDogNjBweDsKKyAgICBoZWlnaHQ6IDM0cHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVy
OworICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisjdG9nZ2xlLWFs
bDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfina8nOworICAgIGZvbnQtc2l6ZTogMjJweDsKKyAg
ICBjb2xvcjogI2U2ZTZlNjsKKyAgICBwYWRkaW5nOiAxMHB4IDI3cHggMTBweCAyN3B4OworfQor
CisjdG9nZ2xlLWFsbDpjaGVja2VkOmJlZm9yZSB7CisgICAgY29sb3I6ICM3MzczNzM7Cit9CisK
KyN0b2RvLWxpc3QgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGxpc3Qt
c3R5bGU6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgeworICAgIHBvc2l0aW9uOiByZWxhdGl2
ZTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNl
ZGVkZWQ7Cit9CisKKyN0b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRv
bTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9t
OiBub25lOworICAgIHBhZGRpbmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRp
dCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6
IDEzcHggMTdweCAxMnB4IDE3cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9k
by1saXN0IGxpLmVkaXRpbmcgLnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2Rv
LWxpc3QgbGkgLnRvZ2dsZSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0
MHB4OworICAgIC8qIGF1dG8sIHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBw
b3J0IGlucHV0IHN0eWxpbmcgKi8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFi
c29sdXRlOworICAgIHRvcDogMDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7
CisgICAgYm9yZGVyOiBub25lOyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBl
YXJhbmNlOiBub25lOworICAgIGFwcGVhcmFuY2U6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkg
LnRvZ2dsZTphZnRlciB7CisgICAgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRm
OCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQwIiBoZWln
aHQ9IjQwIiB2aWV3Qm94PSItMTAgLTE4IDEwMCAxMzUiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAi
IHI9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlZGVkZWQiIHN0cm9rZS13aWR0aD0iMyIvPjwv
c3ZnPicpOworfQorCisjdG9kby1saXN0IGxpIC50b2dnbGU6Y2hlY2tlZDphZnRlciB7CisgICAg
Y29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSJodHRwOi8v
d3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSItMTAg
LTE4IDEwMCAxMzUiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIiBmaWxsPSJub25lIiBz
dHJva2U9IiNiZGRhZDUiIHN0cm9rZS13aWR0aD0iMyIvPjxwYXRoIGZpbGw9IiM1ZGMyYWYiIGQ9
Ik03MiAyNUw0MiA3MSAyNyA1NmwtNCA0IDIwIDIwIDM0LTUyeiIvPjwvc3ZnPicpOworfQorCisj
dG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgIHdvcmQtYnJl
YWs6IGJyZWFrLXdvcmQ7CisgICAgcGFkZGluZzogMTVweCA2MHB4IDE1cHggMTVweDsKKyAgICBt
YXJnaW4tbGVmdDogNDVweDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBsaW5lLWhlaWdodDog
MS4yOworICAgIHRyYW5zaXRpb246IGNvbG9yIDAuNHM7Cit9CisKKyN0b2RvLWxpc3QgbGkuY29t
cGxldGVkIGxhYmVsIHsKKyAgICBjb2xvcjogI2Q5ZDlkOTsKKyAgICB0ZXh0LWRlY29yYXRpb246
IGxpbmUtdGhyb3VnaDsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveSB7CisgICAgZGlzcGxh
eTogbm9uZTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIHJpZ2h0
OiAxMHB4OworICAgIGJvdHRvbTogMDsKKyAgICB3aWR0aDogNDBweDsKKyAgICBoZWlnaHQ6IDQw
cHg7CisgICAgbWFyZ2luOiBhdXRvIDA7CisgICAgZm9udC1zaXplOiAzMHB4OworICAgIGNvbG9y
OiAjY2M5YTlhOworICAgIG1hcmdpbi1ib3R0b206IDExcHg7CisgICAgdHJhbnNpdGlvbjogY29s
b3IgMC4ycyBlYXNlLW91dDsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7Cisg
ICAgY29sb3I6ICNhZjViNWU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXIgewor
ICAgIGNvbnRlbnQ6ICfDlyc7Cit9CisKKyN0b2RvLWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kgewor
ICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9kby1saXN0IGxpIC5lZGl0IHsKKyAgICBkaXNw
bGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZCB7CisgICAg
bWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zvb3RlciB7CisgICAgY29sb3I6ICM3Nzc7Cisg
ICAgcGFkZGluZzogMTBweCAxNXB4OworICAgIGhlaWdodDogMjBweDsKKyAgICB0ZXh0LWFsaWdu
OiBjZW50ZXI7CisgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKKyNmb290
ZXI6YmVmb3JlIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cisg
ICAgcmlnaHQ6IDA7CisgICAgYm90dG9tOiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiA1
MHB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJn
YmEoMCwgMCwgMCwgMC4yKSwKKyAgICAgICAgICAgICAgICAwIDhweCAwIC0zcHggI2Y2ZjZmNiwK
KyAgICAgICAgICAgICAgICAwIDlweCAxcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAg
ICAgICAgICAgICAgMCAxNnB4IDAgLTZweCAjZjZmNmY2LAorICAgICAgICAgICAgICAgIDAgMTdw
eCAycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAgICBm
bG9hdDogbGVmdDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjdG9kby1jb3VudCBzdHJv
bmcgeworICAgIGZvbnQtd2VpZ2h0OiAzMDA7Cit9CisKKyNmaWx0ZXJzIHsKKyAgICBtYXJnaW46
IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKKyAgICByaWdodDogMDsKKyAgICBsZWZ0OiAwOworfQorCisjZmlsdGVycyBs
aSB7CisgICAgZGlzcGxheTogaW5saW5lOworfQorCisjZmlsdGVycyBsaSBhIHsKKyAgICBjb2xv
cjogaW5oZXJpdDsKKyAgICBtYXJnaW46IDNweDsKKyAgICBwYWRkaW5nOiAzcHggN3B4OworICAg
IHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVu
dDsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKyNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQs
CisjZmlsdGVycyBsaSBhOmhvdmVyIHsKKyAgICBib3JkZXItY29sb3I6IHJnYmEoMTc1LCA0Nywg
NDcsIDAuMSk7Cit9CisKKyNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQgeworICAgIGJvcmRlci1jb2xv
cjogcmdiYSgxNzUsIDQ3LCA0NywgMC4yKTsKK30KKworI2NsZWFyLWNvbXBsZXRlZCwKK2h0bWwg
I2NsZWFyLWNvbXBsZXRlZDphY3RpdmUgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBwb3NpdGlv
bjogcmVsYXRpdmU7CisgICAgbGluZS1oZWlnaHQ6IDIwcHg7CisgICAgdGV4dC1kZWNvcmF0aW9u
OiBub25lOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9
CisKKyNjbGVhci1jb21wbGV0ZWQ6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJs
aW5lOworfQorCisjaW5mbyB7CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjog
I2JmYmZiZjsKKyAgICBmb250LXNpemU6IDEwcHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAg
cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKwor
I2luZm8gcCB7CisgICAgbGluZS1oZWlnaHQ6IDE7Cit9CisKKyNpbmZvIGEgeworICAgIGNvbG9y
OiBpbmhlcml0OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBmb250LXdlaWdodDog
NDAwOworfQorCisjaW5mbyBhOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGlu
ZTsKK30KKworLyoKKyAgICBIYWNrIHRvIHJlbW92ZSBiYWNrZ3JvdW5kIGZyb20gTW9iaWxlIFNh
ZmFyaS4KKyAgICBDYW4ndCB1c2UgaXQgZ2xvYmFsbHkgc2luY2UgaXQgZGVzdHJveXMgY2hlY2ti
b3hlcyBpbiBGaXJlZm94CisqLworQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmlj
ZS1waXhlbC1yYXRpbzowKSB7CisgICAgI3RvZ2dsZS1hbGwsCisgICAgI3RvZG8tbGlzdCBsaSAu
dG9nZ2xlIHsKKyAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICB9CisKKyAgICAjdG9kby1s
aXN0IGxpIC50b2dnbGUgeworICAgICAgICBoZWlnaHQ6IDQwcHg7CisgICAgfQorCisgICAgI3Rv
Z2dsZS1hbGwgeworICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAg
ICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOworICAgICAgICAtd2Via2l0LWFwcGVhcmFu
Y2U6IG5vbmU7CisgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CisgICAgfQorfQorCitAbWVkaWEg
KG1heC13aWR0aDogNDMwcHgpIHsKKyAgICAjZm9vdGVyIHsKKyAgICAgICAgaGVpZ2h0OiA1MHB4
OworICAgIH0KKworICAgICNmaWx0ZXJzIHsKKyAgICAgICAgYm90dG9tOiAxMHB4OworICAgIH0K
K30KKwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU0ZDcxMDE0
YTgxNzFlODllZTYwMDMwZjJjMTFhNjBiYTU2Nzc0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy92ZW5kb3IuanMKQEAgLTAsMCArMSw2NjEyMSBAQAorLyog
anNoaW50IGlnbm9yZTpzdGFydCAqLworCit3aW5kb3cuRW1iZXJFTlYgPSB7IkZFQVRVUkVTIjp7
fX07Cit2YXIgcnVubmluZ1Rlc3RzID0gZmFsc2U7CisKKworCisvKiBqc2hpbnQgaWdub3JlOmVu
ZCAqLworCis7dmFyIGxvYWRlciwgZGVmaW5lLCByZXF1aXJlTW9kdWxlLCByZXF1aXJlLCByZXF1
aXJlanM7CisKKyhmdW5jdGlvbiAoZ2xvYmFsKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIg
aGVpbWRhbGwgPSBnbG9iYWwuaGVpbWRhbGw7CisKKyAgZnVuY3Rpb24gZGljdCgpIHsKKyAgICB2
YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBvYmpbJ19fJ10gPSB1bmRlZmluZWQ7
CisgICAgZGVsZXRlIG9ialsnX18nXTsKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgLy8gU2F2
ZSBvZmYgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiB0aGVzZSBnbG9iYWxzLCBzbyB3ZSBjYW4gcmVz
dG9yZSB0aGVtIGlmIHNvbWVvbmUgYXNrcyB1cyB0bworICB2YXIgb2xkR2xvYmFscyA9IHsKKyAg
ICBsb2FkZXI6IGxvYWRlciwKKyAgICBkZWZpbmU6IGRlZmluZSwKKyAgICByZXF1aXJlTW9kdWxl
OiByZXF1aXJlTW9kdWxlLAorICAgIHJlcXVpcmU6IHJlcXVpcmUsCisgICAgcmVxdWlyZWpzOiBy
ZXF1aXJlanMKKyAgfTsKKworICByZXF1aXJlanMgPSByZXF1aXJlID0gcmVxdWlyZU1vZHVsZSA9
IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgdmFyIHBlbmRpbmcgPSBbXTsKKyAgICB2YXIgbW9kID0g
ZmluZE1vZHVsZShuYW1lLCAnKHJlcXVpcmUpJywgcGVuZGluZyk7CisKKyAgICBmb3IgKHZhciBp
ID0gcGVuZGluZy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgcGVuZGluZ1tpXS5l
eHBvcnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1vZC5tb2R1bGUuZXhwb3J0czsKKyAgfTsK
KworICBsb2FkZXIgPSB7CisgICAgbm9Db25mbGljdDogZnVuY3Rpb24gKGFsaWFzZXMpIHsKKyAg
ICAgIHZhciBvbGROYW1lLCBuZXdOYW1lOworCisgICAgICBmb3IgKG9sZE5hbWUgaW4gYWxpYXNl
cykgeworICAgICAgICBpZiAoYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShvbGROYW1lKSkgeworICAg
ICAgICAgIGlmIChvbGRHbG9iYWxzLmhhc093blByb3BlcnR5KG9sZE5hbWUpKSB7CisgICAgICAg
ICAgICBuZXdOYW1lID0gYWxpYXNlc1tvbGROYW1lXTsKKworICAgICAgICAgICAgZ2xvYmFsW25l
d05hbWVdID0gZ2xvYmFsW29sZE5hbWVdOworICAgICAgICAgICAgZ2xvYmFsW29sZE5hbWVdID0g
b2xkR2xvYmFsc1tvbGROYW1lXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9CisgIH07CisKKyAgdmFyIF9pc0FycmF5OworICBpZiAoIUFycmF5LmlzQXJyYXkpIHsKKyAg
ICBfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7CisgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlw
ZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nOworICAgIH07CisgIH0gZWxz
ZSB7CisgICAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5OworICB9CisKKyAgdmFyIHJlZ2lzdHJ5
ID0gZGljdCgpOworICB2YXIgc2VlbiA9IGRpY3QoKTsKKworICB2YXIgdXVpZCA9IDA7CisKKyAg
ZnVuY3Rpb24gdW5zdXBwb3J0ZWRNb2R1bGUobGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IEVycm9y
KCdhbiB1bnN1cHBvcnRlZCBtb2R1bGUgd2FzIGRlZmluZWQsIGV4cGVjdGVkIGBkZWZpbmUobmFt
ZSwgZGVwcywgbW9kdWxlKWAgaW5zdGVhZCBnb3Q6IGAnICsgbGVuZ3RoICsgJ2AgYXJndW1lbnRz
IHRvIGRlZmluZWAnKTsKKyAgfQorCisgIHZhciBkZWZhdWx0RGVwcyA9IFsncmVxdWlyZScsICdl
eHBvcnRzJywgJ21vZHVsZSddOworCisgIGZ1bmN0aW9uIE1vZHVsZShuYW1lLCBkZXBzLCBjYWxs
YmFjaywgYWxpYXMpIHsKKyAgICB0aGlzLmlkID0gdXVpZCsrOworICAgIHRoaXMubmFtZSA9IG5h
bWU7CisgICAgdGhpcy5kZXBzID0gIWRlcHMubGVuZ3RoICYmIGNhbGxiYWNrLmxlbmd0aCA/IGRl
ZmF1bHREZXBzIDogZGVwczsKKyAgICB0aGlzLm1vZHVsZSA9IHsgZXhwb3J0czoge30gfTsKKyAg
ICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgdGhpcy5oYXNFeHBvcnRzQXNEZXAgPSBm
YWxzZTsKKyAgICB0aGlzLmlzQWxpYXMgPSBhbGlhczsKKyAgICB0aGlzLnJlaWZpZWQgPSBuZXcg
QXJyYXkoZGVwcy5sZW5ndGgpOworCisgICAgLyoKKyAgICAgICBFYWNoIG1vZHVsZSBub3JtYWxs
eSBwYXNzZXMgdGhyb3VnaCB0aGVzZSBzdGF0ZXMsIGluIG9yZGVyOgorICAgICAgICAgbmV3ICAg
ICAgIDogaW5pdGlhbCBzdGF0ZQorICAgICAgICAgcGVuZGluZyAgIDogdGhpcyBtb2R1bGUgaXMg
c2NoZWR1bGVkIHRvIGJlIGV4ZWN1dGVkCisgICAgICAgICByZWlmeWluZyAgOiB0aGlzIG1vZHVs
ZSdzIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZXhlY3V0ZWQKKyAgICAgICAgIHJlaWZpZWQgICA6
IHRoaXMgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIGZpbmlzaGVkIGV4ZWN1dGluZyBzdWNjZXNzZnVs
bHkKKyAgICAgICAgIGVycm9yZWQgICA6IHRoaXMgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIGZhaWxl
ZCB0byBleGVjdXRlCisgICAgICAgICBmaW5hbGl6ZWQgOiB0aGlzIG1vZHVsZSBleGVjdXRlZCBz
dWNjZXNzZnVsbHkKKyAgICAgKi8KKyAgICB0aGlzLnN0YXRlID0gJ25ldyc7CisgIH0KKworICBN
b2R1bGUucHJvdG90eXBlLm1ha2VEZWZhdWx0RXhwb3J0ID0gZnVuY3Rpb24gKCkgeworICAgIHZh
ciBleHBvcnRzID0gdGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICBpZiAoZXhwb3J0cyAhPT0gbnVs
bCAmJiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBleHBvcnRzID09PSAn
ZnVuY3Rpb24nKSAmJiBleHBvcnRzWydkZWZhdWx0J10gPT09IHVuZGVmaW5lZCAmJiBPYmplY3Qu
aXNFeHRlbnNpYmxlKGV4cG9ydHMpKSB7CisgICAgICBleHBvcnRzWydkZWZhdWx0J10gPSBleHBv
cnRzOworICAgIH0KKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLmV4cG9ydHMgPSBmdW5jdGlv
biAoKSB7CisgICAgLy8gaWYgZmluYWxpemVkLCB0aGVyZSBpcyBubyB3b3JrIHRvIGRvLiBJZiBy
ZWlmeWluZywgdGhlcmUgaXMgYQorICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgc28gd2UgbXVz
dCByZXR1cm4gb3VyIChwYXJ0aWFsKSBleHBvcnRzLgorICAgIGlmICh0aGlzLnN0YXRlID09PSAn
ZmluYWxpemVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVpZnlpbmcnKSB7CisgICAgICByZXR1cm4g
dGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICB9CisKKyAgICBpZiAobG9hZGVyLndyYXBNb2R1bGVz
KSB7CisgICAgICB0aGlzLmNhbGxiYWNrID0gbG9hZGVyLndyYXBNb2R1bGVzKHRoaXMubmFtZSwg
dGhpcy5jYWxsYmFjayk7CisgICAgfQorCisgICAgdGhpcy5yZWlmeSgpOworCisgICAgdmFyIHJl
c3VsdCA9IHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcywgdGhpcy5yZWlmaWVkKTsKKyAgICB0aGlz
LnN0YXRlID0gJ2ZpbmFsaXplZCc7CisKKyAgICBpZiAoISh0aGlzLmhhc0V4cG9ydHNBc0RlcCAm
JiByZXN1bHQgPT09IHVuZGVmaW5lZCkpIHsKKyAgICAgIHRoaXMubW9kdWxlLmV4cG9ydHMgPSBy
ZXN1bHQ7CisgICAgfQorICAgIHRoaXMubWFrZURlZmF1bHRFeHBvcnQoKTsKKyAgICByZXR1cm4g
dGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLnVuc2VlID0g
ZnVuY3Rpb24gKCkgeworICAgIHRoaXMuc3RhdGUgPSAnbmV3JzsKKyAgICB0aGlzLm1vZHVsZSA9
IHsgZXhwb3J0czoge30gfTsKKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLnJlaWZ5ID0gZnVu
Y3Rpb24gKCkgeworICAgIGlmICh0aGlzLnN0YXRlID09PSAncmVpZmllZCcpIHsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgdGhpcy5zdGF0ZSA9ICdyZWlmeWluZyc7CisgICAgdHJ5IHsKKyAg
ICAgIHRoaXMucmVpZmllZCA9IHRoaXMuX3JlaWZ5KCk7CisgICAgICB0aGlzLnN0YXRlID0gJ3Jl
aWZpZWQnOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ3JlaWZ5
aW5nJykgeworICAgICAgICB0aGlzLnN0YXRlID0gJ2Vycm9yZWQnOworICAgICAgfQorICAgIH0K
KyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLl9yZWlmeSA9IGZ1bmN0aW9uICgpIHsKKyAgICB2
YXIgcmVpZmllZCA9IHRoaXMucmVpZmllZC5zbGljZSgpOworICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcmVpZmllZC5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIG1vZCA9IHJlaWZpZWRbaV07Cisg
ICAgICByZWlmaWVkW2ldID0gbW9kLmV4cG9ydHMgPyBtb2QuZXhwb3J0cyA6IG1vZC5tb2R1bGUu
ZXhwb3J0cygpOworICAgIH0KKyAgICByZXR1cm4gcmVpZmllZDsKKyAgfTsKKworICBNb2R1bGUu
cHJvdG90eXBlLmZpbmREZXBzID0gZnVuY3Rpb24gKHBlbmRpbmcpIHsKKyAgICBpZiAodGhpcy5z
dGF0ZSAhPT0gJ25ldycpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnN0YXRl
ID0gJ3BlbmRpbmcnOworCisgICAgdmFyIGRlcHMgPSB0aGlzLmRlcHM7CisKKyAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkZXAgPSBkZXBzW2ld
OworICAgICAgdmFyIGVudHJ5ID0gdGhpcy5yZWlmaWVkW2ldID0geyBleHBvcnRzOiB1bmRlZmlu
ZWQsIG1vZHVsZTogdW5kZWZpbmVkIH07CisgICAgICBpZiAoZGVwID09PSAnZXhwb3J0cycpIHsK
KyAgICAgICAgdGhpcy5oYXNFeHBvcnRzQXNEZXAgPSB0cnVlOworICAgICAgICBlbnRyeS5leHBv
cnRzID0gdGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICAgIH0gZWxzZSBpZiAoZGVwID09PSAncmVx
dWlyZScpIHsKKyAgICAgICAgZW50cnkuZXhwb3J0cyA9IHRoaXMubWFrZVJlcXVpcmUoKTsKKyAg
ICAgIH0gZWxzZSBpZiAoZGVwID09PSAnbW9kdWxlJykgeworICAgICAgICBlbnRyeS5leHBvcnRz
ID0gdGhpcy5tb2R1bGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS5tb2R1bGUgPSBm
aW5kTW9kdWxlKHJlc29sdmUoZGVwLCB0aGlzLm5hbWUpLCB0aGlzLm5hbWUsIHBlbmRpbmcpOwor
ICAgICAgfQorICAgIH0KKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLm1ha2VSZXF1aXJlID0g
ZnVuY3Rpb24gKCkgeworICAgIHZhciBuYW1lID0gdGhpcy5uYW1lOworICAgIHZhciByID0gZnVu
Y3Rpb24gKGRlcCkgeworICAgICAgcmV0dXJuIHJlcXVpcmUocmVzb2x2ZShkZXAsIG5hbWUpKTsK
KyAgICB9OworICAgIHJbJ2RlZmF1bHQnXSA9IHI7CisgICAgci5oYXMgPSBmdW5jdGlvbiAoZGVw
KSB7CisgICAgICByZXR1cm4gaGFzKHJlc29sdmUoZGVwLCBuYW1lKSk7CisgICAgfTsKKyAgICBy
ZXR1cm4gcjsKKyAgfTsKKworICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJh
Y2spIHsKKyAgICB2YXIgbW9kdWxlID0gcmVnaXN0cnlbbmFtZV07CisKKyAgICAvLyBJZiBhIG1v
ZHVsZSBmb3IgdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhbmQgaXMgaW4gYW55
IHN0YXRlCisgICAgLy8gb3RoZXIgdGhhbiBgbmV3YCAobWVhbmluZyBpdCBoYXMgYmVlbiBvciBp
cyBjdXJyZW50bHkgYmVpbmcgcmVxdWlyZWQpLAorICAgIC8vIHRoZW4gd2UgcmV0dXJuIGVhcmx5
IHRvIGF2b2lkIHJlZGVmaW5pdGlvbi4KKyAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5zdGF0ZSAh
PT0gJ25ldycpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA8IDIpIHsKKyAgICAgIHVuc3VwcG9ydGVkTW9kdWxlKGFyZ3VtZW50cy5sZW5ndGgpOwor
ICAgIH0KKworICAgIGlmICghX2lzQXJyYXkoZGVwcykpIHsKKyAgICAgIGNhbGxiYWNrID0gZGVw
czsKKyAgICAgIGRlcHMgPSBbXTsKKyAgICB9CisKKyAgICBpZiAoY2FsbGJhY2sgaW5zdGFuY2Vv
ZiBBbGlhcykgeworICAgICAgcmVnaXN0cnlbbmFtZV0gPSBuZXcgTW9kdWxlKGNhbGxiYWNrLm5h
bWUsIGRlcHMsIGNhbGxiYWNrLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVnaXN0cnlb
bmFtZV0gPSBuZXcgTW9kdWxlKG5hbWUsIGRlcHMsIGNhbGxiYWNrLCBmYWxzZSk7CisgICAgfQor
ICB9OworCisgIC8vIHdlIGRvbid0IHN1cHBvcnQgYWxsIG9mIEFNRAorICAvLyBkZWZpbmUuYW1k
ID0ge307CisKKyAgZnVuY3Rpb24gQWxpYXMocGF0aCkgeworICAgIHRoaXMubmFtZSA9IHBhdGg7
CisgIH0KKworICBkZWZpbmUuYWxpYXMgPSBmdW5jdGlvbiAocGF0aCwgdGFyZ2V0KSB7CisgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKKyAgICAgIHJldHVybiBkZWZpbmUodGFyZ2V0
LCBuZXcgQWxpYXMocGF0aCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQWxpYXMocGF0aCk7
CisgIH07CisKKyAgZnVuY3Rpb24gbWlzc2luZ01vZHVsZShuYW1lLCByZWZlcnJlcikgeworICAg
IHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgbW9kdWxlIGAnICsgbmFtZSArICdgIGlt
cG9ydGVkIGZyb20gYCcgKyByZWZlcnJlciArICdgJyk7CisgIH0KKworICBmdW5jdGlvbiBmaW5k
TW9kdWxlKG5hbWUsIHJlZmVycmVyLCBwZW5kaW5nKSB7CisgICAgdmFyIG1vZCA9IHJlZ2lzdHJ5
W25hbWVdIHx8IHJlZ2lzdHJ5W25hbWUgKyAnL2luZGV4J107CisKKyAgICB3aGlsZSAobW9kICYm
IG1vZC5pc0FsaWFzKSB7CisgICAgICBtb2QgPSByZWdpc3RyeVttb2QubmFtZV07CisgICAgfQor
CisgICAgaWYgKCFtb2QpIHsKKyAgICAgIG1pc3NpbmdNb2R1bGUobmFtZSwgcmVmZXJyZXIpOwor
ICAgIH0KKworICAgIGlmIChwZW5kaW5nICYmIG1vZC5zdGF0ZSAhPT0gJ3BlbmRpbmcnICYmIG1v
ZC5zdGF0ZSAhPT0gJ2ZpbmFsaXplZCcpIHsKKyAgICAgIG1vZC5maW5kRGVwcyhwZW5kaW5nKTsK
KyAgICAgIHBlbmRpbmcucHVzaChtb2QpOworICAgIH0KKyAgICByZXR1cm4gbW9kOworICB9CisK
KyAgZnVuY3Rpb24gcmVzb2x2ZShjaGlsZCwgbmFtZSkgeworICAgIGlmIChjaGlsZC5jaGFyQXQo
MCkgIT09ICcuJykgeworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKworICAgIHZhciBwYXJ0
cyA9IGNoaWxkLnNwbGl0KCcvJyk7CisgICAgdmFyIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8n
KTsKKyAgICB2YXIgcGFyZW50QmFzZSA9IG5hbWVQYXJ0cy5zbGljZSgwLCAtMSk7CisKKyAgICBm
b3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFy
IHBhcnQgPSBwYXJ0c1tpXTsKKworICAgICAgaWYgKHBhcnQgPT09ICcuLicpIHsKKyAgICAgICAg
aWYgKHBhcmVudEJhc2UubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCdDYW5ub3QgYWNjZXNzIHBhcmVudCBtb2R1bGUgb2Ygcm9vdCcpOworICAgICAgICB9CisgICAg
ICAgIHBhcmVudEJhc2UucG9wKCk7CisgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuJykgewor
ICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmVudEJhc2UucHVz
aChwYXJ0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGFyZW50QmFzZS5qb2luKCcv
Jyk7CisgIH0KKworICBmdW5jdGlvbiBoYXMobmFtZSkgeworICAgIHJldHVybiAhIShyZWdpc3Ry
eVtuYW1lXSB8fCByZWdpc3RyeVtuYW1lICsgJy9pbmRleCddKTsKKyAgfQorCisgIHJlcXVpcmVq
cy5lbnRyaWVzID0gcmVxdWlyZWpzLl9lYWtfc2VlbiA9IHJlZ2lzdHJ5OworICByZXF1aXJlanMu
aGFzID0gaGFzOworICByZXF1aXJlanMudW5zZWUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewor
ICAgIGZpbmRNb2R1bGUobW9kdWxlTmFtZSwgJyh1bnNlZSknLCBmYWxzZSkudW5zZWUoKTsKKyAg
fTsKKworICByZXF1aXJlanMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgcmVxdWlyZWpzLmVu
dHJpZXMgPSByZXF1aXJlanMuX2Vha19zZWVuID0gcmVnaXN0cnkgPSBkaWN0KCk7CisgICAgc2Vl
biA9IGRpY3QoKTsKKyAgfTsKKworICAvLyBUaGlzIGNvZGUgcHJpbWVzIHRoZSBKUyBlbmdpbmUg
Zm9yIGdvb2QgcGVyZm9ybWFuY2UgYnkgd2FybWluZyB0aGUKKyAgLy8gSklUIGNvbXBpbGVyIGZv
ciB0aGVzZSBmdW5jdGlvbnMuCisgIGRlZmluZSgnZm9vJywgZnVuY3Rpb24gKCkge30pOworICBk
ZWZpbmUoJ2Zvby9iYXInLCBbXSwgZnVuY3Rpb24gKCkge30pOworICBkZWZpbmUoJ2Zvby9hc2Rm
JywgWydtb2R1bGUnLCAnZXhwb3J0cycsICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChtb2R1bGUsIGV4
cG9ydHMsIHJlcXVpcmUpIHsKKyAgICBpZiAocmVxdWlyZS5oYXMoJ2Zvby9iYXInKSkgeworICAg
ICAgcmVxdWlyZSgnZm9vL2JhcicpOworICAgIH0KKyAgfSk7CisgIGRlZmluZSgnZm9vL2Jheics
IFtdLCBkZWZpbmUuYWxpYXMoJ2ZvbycpKTsKKyAgZGVmaW5lKCdmb28vcXV6JywgZGVmaW5lLmFs
aWFzKCdmb28nKSk7CisgIGRlZmluZS5hbGlhcygnZm9vJywgJ2Zvby9xdXgnKTsKKyAgZGVmaW5l
KCdmb28vYmFyJywgWydmb28nLCAnLi9xdXonLCAnLi9iYXonLCAnLi9hc2RmJywgJy4vYmFyJywg
Jy4uL2ZvbyddLCBmdW5jdGlvbiAoKSB7fSk7CisgIGRlZmluZSgnZm9vL21haW4nLCBbJ2Zvby9i
YXInXSwgZnVuY3Rpb24gKCkge30pOworCisgIHJlcXVpcmUoJ2Zvby9tYWluJyk7CisgIHJlcXVp
cmUudW5zZWUoJ2Zvby9iYXInKTsKKworICByZXF1aXJlanMuY2xlYXIoKTsKKworICBpZiAodHlw
ZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYm
IG1vZHVsZS5leHBvcnRzKSB7CisgICAgbW9kdWxlLmV4cG9ydHMgPSB7IHJlcXVpcmU6IHJlcXVp
cmUsIGRlZmluZTogZGVmaW5lIH07CisgIH0KK30pKHRoaXMpOworOy8qIQorICogalF1ZXJ5IEph
dmFTY3JpcHQgTGlicmFyeSB2Mi4yLjQKKyAqIGh0dHA6Ly9qcXVlcnkuY29tLworICoKKyAqIElu
Y2x1ZGVzIFNpenpsZS5qcworICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmln
aHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycworICogUmVsZWFzZWQg
dW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCisgKgor
ICogRGF0ZTogMjAxNi0wNS0yMFQxNzoyM1oKKyAqLworCisoZnVuY3Rpb24oIGdsb2JhbCwgZmFj
dG9yeSApIHsKKworICAgIGlmICggdHlwZW9mIG1vZHVsZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9m
IG1vZHVsZS5leHBvcnRzID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgLy8gRm9yIENvbW1vbkpT
IGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YAor
ICAgICAgICAvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5
LgorICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93
YCB3aXRoIGEgYGRvY3VtZW50YAorICAgICAgICAvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3Nl
IGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy4KKyAgICAgICAgLy8gVGhpcyBhY2NlbnR1YXRl
cyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KKyAgICAgICAg
Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZSgianF1ZXJ5Iikod2luZG93KTsKKyAgICAgICAg
Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby4KKyAgICAgICAgbW9kdWxlLmV4cG9y
dHMgPSBnbG9iYWwuZG9jdW1lbnQgPworICAgICAgICAgICAgZmFjdG9yeSggZ2xvYmFsLCB0cnVl
ICkgOgorICAgICAgICAgICAgZnVuY3Rpb24oIHcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAh
dy5kb2N1bWVudCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAialF1
ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIgKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoIHcgKTsKKyAgICAgICAgICAgIH07
CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmFjdG9yeSggZ2xvYmFsICk7CisgICAgfQorCisvLyBQ
YXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAorfSh0eXBlb2Ygd2luZG93ICE9
PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFs
ICkgeworCisvLyBTdXBwb3J0OiBGaXJlZm94IDE4KworLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1v
ZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZQorLy8gdGhlIHN0YWNrIHZp
YSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCisvLyB5b3UgdHJ5
IHRvIHRyYWNlIHRocm91Z2ggInVzZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KQorLy8i
dXNlIHN0cmljdCI7Cit2YXIgYXJyID0gW107CisKK3ZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1
bWVudDsKKwordmFyIHNsaWNlID0gYXJyLnNsaWNlOworCit2YXIgY29uY2F0ID0gYXJyLmNvbmNh
dDsKKwordmFyIHB1c2ggPSBhcnIucHVzaDsKKwordmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjsK
KwordmFyIGNsYXNzMnR5cGUgPSB7fTsKKwordmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0
cmluZzsKKwordmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7CisKK3ZhciBz
dXBwb3J0ID0ge307CisKKworCit2YXIKKyAgICB2ZXJzaW9uID0gIjIuMi40IiwKKworICAgIC8v
IERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CisgICAgalF1ZXJ5ID0gZnVuY3Rpb24oIHNl
bGVjdG9yLCBjb250ZXh0ICkgeworCisgICAgICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFj
dHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJworICAgICAgICAvLyBO
ZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJv
d24gaWYgbm90IGluY2x1ZGVkKQorICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBz
ZWxlY3RvciwgY29udGV4dCApOworICAgIH0sCisKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQu
MQorICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAorICAgIHJ0cmltID0gL15b
XHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAorCisgICAgLy8gTWF0Y2hlcyBkYXNo
ZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCisgICAgcm1zUHJlZml4ID0gL14tbXMtLywKKyAgICBy
ZGFzaEFscGhhID0gLy0oW1xkYS16XSkvZ2ksCisKKyAgICAvLyBVc2VkIGJ5IGpRdWVyeS5jYW1l
bENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCisgICAgZmNhbWVsQ2FzZSA9IGZ1bmN0aW9u
KCBhbGwsIGxldHRlciApIHsKKyAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOwor
ICAgIH07CisKK2pRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7CisKKyAgICAvLyBUaGUg
Y3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCisgICAganF1ZXJ5OiB2ZXJzaW9u
LAorCisgICAgY29uc3RydWN0b3I6IGpRdWVyeSwKKworICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1w
dHkgc2VsZWN0b3IKKyAgICBzZWxlY3RvcjogIiIsCisKKyAgICAvLyBUaGUgZGVmYXVsdCBsZW5n
dGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKKyAgICBsZW5ndGg6IDAsCisKKyAgICB0b0FycmF5
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTsKKyAgICB9
LAorCisgICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNl
dCBPUgorICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFu
IGFycmF5CisgICAgZ2V0OiBmdW5jdGlvbiggbnVtICkgeworICAgICAgICByZXR1cm4gbnVtICE9
IG51bGwgPworCisgICAgICAgICAgICAvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJv
bSB0aGUgc2V0CisgICAgICAgICAgICAoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0
aCBdIDogdGhpc1sgbnVtIF0gKSA6CisKKyAgICAgICAgICAgIC8vIFJldHVybiBhbGwgdGhlIGVs
ZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKKyAgICAgICAgICAgIHNsaWNlLmNhbGwoIHRoaXMgKTsK
KyAgICB9LAorCisgICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBv
bnRvIHRoZSBzdGFjaworICAgIC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQg
c2V0KQorICAgIHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgeworCisgICAgICAgIC8vIEJ1
aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CisgICAgICAgIHZhciByZXQgPSBq
UXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKKworICAgICAgICAvLyBB
ZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQorICAgICAg
ICByZXQucHJldk9iamVjdCA9IHRoaXM7CisgICAgICAgIHJldC5jb250ZXh0ID0gdGhpcy5jb250
ZXh0OworCisgICAgICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0Cisg
ICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBm
b3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisgICAgZWFjaDogZnVuY3Rpb24o
IGNhbGxiYWNrICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNr
ICk7CisgICAgfSwKKworICAgIG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgeworICAgICAgICBy
ZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsK
KyAgICAgICAgfSApICk7CisgICAgfSwKKworICAgIHNsaWNlOiBmdW5jdGlvbigpIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkg
KTsKKyAgICB9LAorCisgICAgZmlyc3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhp
cy5lcSggMCApOworICAgIH0sCisKKyAgICBsYXN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZXEoIC0xICk7CisgICAgfSwKKworICAgIGVxOiBmdW5jdGlvbiggaSApIHsKKyAg
ICAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgICAgICAgICAgaiA9ICtpICsgKCBpIDwg
MCA/IGxlbiA6IDAgKTsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYg
aiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOworICAgIH0sCisKKyAgICBlbmQ6IGZ1bmN0
aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0
b3IoKTsKKyAgICB9LAorCisgICAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgIC8vIEJl
aGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgor
ICAgIHB1c2g6IHB1c2gsCisgICAgc29ydDogYXJyLnNvcnQsCisgICAgc3BsaWNlOiBhcnIuc3Bs
aWNlCit9OworCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkg
eworICAgIHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwK
KyAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sCisgICAgICAgIGkgPSAxLAor
ICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgICAgICBkZWVwID0gZmFsc2U7
CisKKyAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCisgICAgaWYgKCB0eXBlb2Yg
dGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CisgICAgICAgIGRlZXAgPSB0YXJnZXQ7CisKKyAgICAg
ICAgLy8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAorICAgICAgICB0YXJnZXQgPSBh
cmd1bWVudHNbIGkgXSB8fCB7fTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIC8vIEhhbmRs
ZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4g
ZGVlcCBjb3B5KQorICAgIGlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVy
eS5pc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHsKKyAgICAgICAgdGFyZ2V0ID0ge307CisgICAgfQor
CisgICAgLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFz
c2VkCisgICAgaWYgKCBpID09PSBsZW5ndGggKSB7CisgICAgICAgIHRhcmdldCA9IHRoaXM7Cisg
ICAgICAgIGktLTsKKyAgICB9CisKKyAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwor
ICAgICAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisgICAg
ICAgIGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgeworCisgICAg
ICAgICAgICAvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CisgICAgICAgICAgICBmb3IgKCBuYW1l
IGluIG9wdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgc3JjID0gdGFyZ2V0WyBuYW1lIF07Cisg
ICAgICAgICAgICAgICAgY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKKworICAgICAgICAgICAgICAg
IC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKyAgICAgICAgICAgICAgICBpZiAoIHRhcmdl
dCA9PT0gY29weSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBs
YWluIG9iamVjdHMgb3IgYXJyYXlzCisgICAgICAgICAgICAgICAgaWYgKCBkZWVwICYmIGNvcHkg
JiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8CisgICAgICAgICAgICAgICAgICAg
ICggY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheSggY29weSApICkgKSApIHsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIGNvcHlJc0FycmF5ICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgY29weUlzQXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0g
c3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdOworCisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBq
UXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0
cywgY2xvbmUgdGhlbQorICAgICAgICAgICAgICAgICAgICB0YXJnZXRbIG5hbWUgXSA9IGpRdWVy
eS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKyAgICAgICAgICAgICAgICAvLyBEb24n
dCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgg
Y29weSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRbIG5hbWUg
XSA9IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKKyAgICByZXR1cm4gdGFy
Z2V0OworfTsKKworalF1ZXJ5LmV4dGVuZCggeworCisgICAgLy8gVW5pcXVlIGZvciBlYWNoIGNv
cHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCisgICAgZXhwYW5kbzogImpRdWVyeSIgKyAoIHZlcnNp
b24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCisKKyAgICAvLyBBc3N1
bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZQorICAgIGlzUmVhZHk6
IHRydWUsCisKKyAgICBlcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKKyAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCBtc2cgKTsKKyAgICB9LAorCisgICAgbm9vcDogZnVuY3Rpb24oKSB7fSwKKworICAg
IGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkudHlw
ZSggb2JqICkgPT09ICJmdW5jdGlvbiI7CisgICAgfSwKKworICAgIGlzQXJyYXk6IEFycmF5Lmlz
QXJyYXksCisKKyAgICBpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKKyAgICAgICAgcmV0dXJu
IG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdzsKKyAgICB9LAorCisgICAgaXNOdW1l
cmljOiBmdW5jdGlvbiggb2JqICkgeworCisgICAgICAgIC8vIHBhcnNlRmxvYXQgTmFOcyBudW1l
cmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8IiIpCisgICAgICAgIC8v
IC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJs
eSBoZXggbGl0ZXJhbHMgKCIweC4uLiIpCisgICAgICAgIC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBp
bmZpbml0aWVzIHRvIE5hTgorICAgICAgICAvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHBy
ZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMCkKKyAgICAgICAgdmFyIHJlYWxTdHJpbmdP
YmogPSBvYmogJiYgb2JqLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAhalF1ZXJ5LmlzQXJy
YXkoIG9iaiApICYmICggcmVhbFN0cmluZ09iaiAtIHBhcnNlRmxvYXQoIHJlYWxTdHJpbmdPYmog
KSArIDEgKSA+PSAwOworICAgIH0sCisKKyAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2Jq
ICkgeworICAgICAgICB2YXIga2V5OworCisgICAgICAgIC8vIE5vdCBwbGFpbiBvYmplY3RzOgor
ICAgICAgICAvLyAtIEFueSBvYmplY3Qgb3IgdmFsdWUgd2hvc2UgaW50ZXJuYWwgW1tDbGFzc11d
IHByb3BlcnR5IGlzIG5vdCAiW29iamVjdCBPYmplY3RdIgorICAgICAgICAvLyAtIERPTSBub2Rl
cworICAgICAgICAvLyAtIHdpbmRvdworICAgICAgICBpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAh
PT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3Qg
b3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CisgICAgICAgIGlmICggb2Jq
LmNvbnN0cnVjdG9yICYmCisgICAgICAgICAgICAgICAgIWhhc093bi5jYWxsKCBvYmosICJjb25z
dHJ1Y3RvciIgKSAmJgorICAgICAgICAgICAgICAgICFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVj
dG9yLnByb3RvdHlwZSB8fCB7fSwgImlzUHJvdG90eXBlT2YiICkgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBPd24gcHJvcGVydGllcyBhcmUg
ZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwKKyAgICAgICAgLy8gaWYgbGFzdCBv
bmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24KKyAgICAgICAgZm9yICgga2V5
IGluIG9iaiApIHt9CisKKyAgICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhhc093
bi5jYWxsKCBvYmosIGtleSApOworICAgIH0sCisKKyAgICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlv
biggb2JqICkgeworICAgICAgICB2YXIgbmFtZTsKKyAgICAgICAgZm9yICggbmFtZSBpbiBvYmog
KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgICAgIGlm
ICggb2JqID09IG51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqICsgIiI7CisgICAgICAg
IH0KKworICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNo
IFJlZ0V4cCkKKyAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJvYmplY3QiIHx8IHR5cGVv
ZiBvYmogPT09ICJmdW5jdGlvbiIgPworICAgICAgICAgICAgY2xhc3MydHlwZVsgdG9TdHJpbmcu
Y2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CisgICAgICAgICAgICB0eXBlb2Ygb2JqOworICAg
IH0sCisKKyAgICAvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAorICAg
IGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkgeworICAgICAgICB2YXIgc2NyaXB0LAorICAg
ICAgICAgICAgaW5kaXJlY3QgPSBldmFsOworCisgICAgICAgIGNvZGUgPSBqUXVlcnkudHJpbSgg
Y29kZSApOworCisgICAgICAgIGlmICggY29kZSApIHsKKworICAgICAgICAgICAgLy8gSWYgdGhl
IGNvZGUgaW5jbHVkZXMgYSB2YWxpZCwgcHJvbG9ndWUgcG9zaXRpb24KKyAgICAgICAgICAgIC8v
IHN0cmljdCBtb2RlIHByYWdtYSwgZXhlY3V0ZSBjb2RlIGJ5IGluamVjdGluZyBhCisgICAgICAg
ICAgICAvLyBzY3JpcHQgdGFnIGludG8gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgaWYgKCBj
b2RlLmluZGV4T2YoICJ1c2Ugc3RyaWN0IiApID09PSAxICkgeworICAgICAgICAgICAgICAgIHNj
cmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CisgICAgICAgICAgICAg
ICAgc2NyaXB0LnRleHQgPSBjb2RlOworICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBw
ZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYXZvaWQg
dGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRpb24KKyAgICAgICAgICAgICAgICAvLyBhbmQg
cmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbAorCisgICAgICAgICAgICAg
ICAgaW5kaXJlY3QoIGNvZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisK
KyAgICAvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQg
ZGF0YSBtb2R1bGVzCisgICAgLy8gU3VwcG9ydDogSUU5LTExKworICAgIC8vIE1pY3Jvc29mdCBm
b3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MikKKyAgICBjYW1lbENhc2U6
IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CisgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1z
UHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKyAgICB9
LAorCisgICAgbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworICAgICAgICByZXR1
cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUu
dG9Mb3dlckNhc2UoKTsKKyAgICB9LAorCisgICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJh
Y2sgKSB7CisgICAgICAgIHZhciBsZW5ndGgsIGkgPSAwOworCisgICAgICAgIGlmICggaXNBcnJh
eUxpa2UoIG9iaiApICkgeworICAgICAgICAgICAgbGVuZ3RoID0gb2JqLmxlbmd0aDsKKyAgICAg
ICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmICgg
Y2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkgeworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKCBpIGluIG9iaiApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09
PSBmYWxzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9
LAorCisgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjEKKyAgICB0cmltOiBmdW5jdGlvbiggdGV4
dCApIHsKKyAgICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/CisgICAgICAgICAgICAiIiA6Cisg
ICAgICAgICAgICAoIHRleHQgKyAiIiApLnJlcGxhY2UoIHJ0cmltLCAiIiApOworICAgIH0sCisK
KyAgICAvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAgbWFrZUFycmF5
OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgeworICAgICAgICB2YXIgcmV0ID0gcmVzdWx0cyB8
fCBbXTsKKworICAgICAgICBpZiAoIGFyciAhPSBudWxsICkgeworICAgICAgICAgICAgaWYgKCBp
c0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5t
ZXJnZSggcmV0LAorICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/
CisgICAgICAgICAgICAgICAgICAgIFsgYXJyIF0gOiBhcnIKKyAgICAgICAgICAgICAgICApOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXNoLmNhbGwoIHJldCwgYXJy
ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAg
IH0sCisKKyAgICBpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkgeworICAgICAgICBy
ZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cisg
ICAgfSwKKworICAgIG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKKyAgICAgICAg
dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLAorICAgICAgICAgICAgaiA9IDAsCisgICAgICAgICAg
ICBpID0gZmlyc3QubGVuZ3RoOworCisgICAgICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgewor
ICAgICAgICAgICAgZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisgICAgICAgIH0KKworICAg
ICAgICBmaXJzdC5sZW5ndGggPSBpOworCisgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICB9LAor
CisgICAgZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgeworICAgICAg
ICB2YXIgY2FsbGJhY2tJbnZlcnNlLAorICAgICAgICAgICAgbWF0Y2hlcyA9IFtdLAorICAgICAg
ICAgICAgaSA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBlbGVtcy5sZW5ndGgsCisgICAgICAg
ICAgICBjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7CisKKyAgICAgICAgLy8gR28gdGhyb3VnaCB0
aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworICAgICAgICAvLyB0aGF0IHBhc3MgdGhl
IHZhbGlkYXRvciBmdW5jdGlvbgorICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsK
KyAgICAgICAgICAgIGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSAp
OworICAgICAgICAgICAgaWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkg
eworICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfSwKKworICAg
IC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICAgIG1hcDogZnVuY3Rpb24oIGVs
ZW1zLCBjYWxsYmFjaywgYXJnICkgeworICAgICAgICB2YXIgbGVuZ3RoLCB2YWx1ZSwKKyAgICAg
ICAgICAgIGkgPSAwLAorICAgICAgICAgICAgcmV0ID0gW107CisKKyAgICAgICAgLy8gR28gdGhy
b3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5l
dyB2YWx1ZXMKKyAgICAgICAgaWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHsKKyAgICAgICAg
ICAgIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0
aDsgaSsrICkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0s
IGksIGFyZyApOworCisgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgeworICAg
ICAgICAgICAgICAgICAgICByZXQucHVzaCggdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9i
amVjdCwKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoIGkgaW4gZWxlbXMgKSB7
CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7
CisKKyAgICAgICAgICAgICAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHJldC5wdXNoKCB2YWx1ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKKyAg
ICAgICAgcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOworICAgIH0sCisKKyAgICAvLyBB
IGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKKyAgICBndWlkOiAxLAorCisgICAgLy8g
QmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlp
bmcgYW55CisgICAgLy8gYXJndW1lbnRzLgorICAgIHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRl
eHQgKSB7CisgICAgICAgIHZhciB0bXAsIGFyZ3MsIHByb3h5OworCisgICAgICAgIGlmICggdHlw
ZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgdG1wID0gZm5bIGNvbnRl
eHQgXTsKKyAgICAgICAgICAgIGNvbnRleHQgPSBmbjsKKyAgICAgICAgICAgIGZuID0gdG1wOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdl
dCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKKyAgICAgICAgLy8gdGhpcyB0aHJvd3MgYSBUeXBl
RXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KKyAgICAgICAgaWYgKCAh
alF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVk
OworICAgICAgICB9CisKKyAgICAgICAgLy8gU2ltdWxhdGVkIGJpbmQKKyAgICAgICAgYXJncyA9
IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApOworICAgICAgICBwcm94eSA9IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29u
Y2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisgICAgICAgIH07CisKKyAgICAgICAg
Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFs
IGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCisgICAgICAgIHByb3h5Lmd1aWQgPSBmbi5n
dWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCisgICAgICAgIHJldHVybiBwcm94eTsK
KyAgICB9LAorCisgICAgbm93OiBEYXRlLm5vdywKKworICAgIC8vIGpRdWVyeS5zdXBwb3J0IGlz
IG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpcgorICAgIC8v
IHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuCisgICAgc3VwcG9ydDogc3Vw
cG9ydAorfSApOworCisvLyBKU0hpbnQgd291bGQgZXJyb3Igb24gdGhpcyBjb2RlIGR1ZSB0byB0
aGUgU3ltYm9sIG5vdCBiZWluZyBkZWZpbmVkIGluIEVTNS4KKy8vIERlZmluaW5nIHRoaXMgZ2xv
YmFsIGluIC5qc2hpbnRyYyB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2Jh
bAorLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGp1c3Qg
ZGlzYWJsZSBKU0hpbnQgZm9yIHRoZXNlCisvLyB0aHJlZSBsaW5lcy4KKy8qIGpzaGludCBpZ25v
cmU6IHN0YXJ0ICovCitpZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CisgICAg
alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07Cit9
CisvKiBqc2hpbnQgaWdub3JlOiBlbmQgKi8KKworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUg
bWFwCitqUXVlcnkuZWFjaCggIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBE
YXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCggIiAiICksCitmdW5jdGlvbigg
aSwgbmFtZSApIHsKKyAgICBjbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0g
bmFtZS50b0xvd2VyQ2FzZSgpOworfSApOworCitmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkg
eworCisgICAgLy8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0
b3IpCisgICAgLy8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1
KQorICAgIC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwor
ICAgIC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUUKKyAgICB2YXIgbGVuZ3RoID0g
ISFvYmogJiYgImxlbmd0aCIgaW4gb2JqICYmIG9iai5sZW5ndGgsCisgICAgICAgIHR5cGUgPSBq
UXVlcnkudHlwZSggb2JqICk7CisKKyAgICBpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgalF1
ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0eXBlID09PSAiYXJyYXkiIHx8IGxlbmd0aCA9PT0gMCB8fAorICAgICAgICB0
eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSAp
IGluIG9iajsKK30KK3ZhciBTaXp6bGUgPQorLyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVu
Z2luZSB2Mi4yLjEKKyAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpR
dWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVy
IHRoZSBNSVQgbGljZW5zZQorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERh
dGU6IDIwMTUtMTAtMTcKKyAqLworKGZ1bmN0aW9uKCB3aW5kb3cgKSB7CisKK3ZhciBpLAorICAg
IHN1cHBvcnQsCisgICAgRXhwciwKKyAgICBnZXRUZXh0LAorICAgIGlzWE1MLAorICAgIHRva2Vu
aXplLAorICAgIGNvbXBpbGUsCisgICAgc2VsZWN0LAorICAgIG91dGVybW9zdENvbnRleHQsCisg
ICAgc29ydElucHV0LAorICAgIGhhc0R1cGxpY2F0ZSwKKworICAgIC8vIExvY2FsIGRvY3VtZW50
IHZhcnMKKyAgICBzZXREb2N1bWVudCwKKyAgICBkb2N1bWVudCwKKyAgICBkb2NFbGVtLAorICAg
IGRvY3VtZW50SXNIVE1MLAorICAgIHJidWdneVFTQSwKKyAgICByYnVnZ3lNYXRjaGVzLAorICAg
IG1hdGNoZXMsCisgICAgY29udGFpbnMsCisKKyAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRh
CisgICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgMSAqIG5ldyBEYXRlKCksCisgICAgcHJlZmVycmVk
RG9jID0gd2luZG93LmRvY3VtZW50LAorICAgIGRpcnJ1bnMgPSAwLAorICAgIGRvbmUgPSAwLAor
ICAgIGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHRva2VuQ2FjaGUgPSBjcmVhdGVD
YWNoZSgpLAorICAgIGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHNvcnRPcmRl
ciA9IGZ1bmN0aW9uKCBhLCBiICkgeworICAgICAgICBpZiAoIGEgPT09IGIgKSB7CisgICAgICAg
ICAgICBoYXNEdXBsaWNhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0sCisKKyAgICAvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzCisgICAgTUFYX05FR0FU
SVZFID0gMSA8PCAzMSwKKworICAgIC8vIEluc3RhbmNlIG1ldGhvZHMKKyAgICBoYXNPd24gPSAo
e30pLmhhc093blByb3BlcnR5LAorICAgIGFyciA9IFtdLAorICAgIHBvcCA9IGFyci5wb3AsCisg
ICAgcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKKyAgICBwdXNoID0gYXJyLnB1c2gsCisgICAgc2xp
Y2UgPSBhcnIuc2xpY2UsCisgICAgLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0
J3MgZmFzdGVyIHRoYW4gbmF0aXZlCisgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRl
eG9mLXZzLWZvci81CisgICAgaW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkgeworICAg
ICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICBsZW4gPSBsaXN0Lmxlbmd0aDsKKyAgICAgICAg
Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICBpZiAoIGxpc3RbaV0gPT09IGVs
ZW0gKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0sCisKKyAgICBib29sZWFucyA9ICJjaGVja2Vk
fHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxl
ZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3Bl
ZCIsCisKKyAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zCisKKyAgICAvLyBodHRwOi8vd3d3Lncz
Lm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZQorICAgIHdoaXRlc3BhY2UgPSAiW1xc
eDIwXFx0XFxyXFxuXFxmXSIsCisKKyAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9z
eW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXIKKyAgICBpZGVudGlmaWVyID0gIig/Olxc
XFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwKKworICAgIC8vIEF0dHJpYnV0ZSBzZWxlY3Rv
cnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwor
ICAgIGF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgaWRlbnRpZmllciAr
ICIpKD86IiArIHdoaXRlc3BhY2UgKworICAgICAgICAvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQor
ICAgICAgICAiKihbKl4kfCF+XT89KSIgKyB3aGl0ZXNwYWNlICsKKyAgICAgICAgLy8gIkF0dHJp
YnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5n
cyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF0iCisgICAgICAgICIqKD86JygoPzpcXFxcLnxbXlxc
XFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikp
fCkiICsgd2hpdGVzcGFjZSArCisgICAgICAgICIqXFxdIiwKKworICAgIHBzZXVkb3MgPSAiOigi
ICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKworICAgICAgICAvLyBUbyByZWR1Y2UgdGhlIG51
bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVm
ZXIgYXJndW1lbnRzOgorICAgICAgICAvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0
IG9yIGNhcHR1cmUgNSkKKyAgICAgICAgIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpc
XFxcLnxbXlxcXFxcIl0pKilcIil8IiArCisgICAgICAgIC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2
KQorICAgICAgICAiKCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJpYnV0ZXMgKyAiKSop
fCIgKworICAgICAgICAvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCisgICAgICAgICIu
KiIgKworICAgICAgICAiKVxcKXwpIiwKKworICAgIC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVk
IHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJh
Y3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXIKKyAgICByd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAo
IHdoaXRlc3BhY2UgKyAiKyIsICJnIiApLAorICAgIHJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsg
d2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSAr
ICIrJCIsICJnIiApLAorCisgICAgcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFj
ZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCisgICAgcmNvbWJpbmF0b3JzID0gbmV3IFJl
Z0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsg
d2hpdGVzcGFjZSArICIqIiApLAorCisgICAgcmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAo
ICI9IiArIHdoaXRlc3BhY2UgKyAiKihbXlxcXSdcIl0qPykiICsgd2hpdGVzcGFjZSArICIqXFxd
IiwgImciICksCisKKyAgICBycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAorICAgIHJp
ZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisgICAg
bWF0Y2hFeHByID0geworICAgICAgICAiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGlkZW50aWZp
ZXIgKyAiKSIgKSwKKyAgICAgICAgIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50
aWZpZXIgKyAiKSIgKSwKKyAgICAgICAgIlRBRyI6IG5ldyBSZWdFeHAoICJeKCIgKyBpZGVudGlm
aWVyICsgInxbKl0pIiApLAorICAgICAgICAiQVRUUiI6IG5ldyBSZWdFeHAoICJeIiArIGF0dHJp
YnV0ZXMgKSwKKyAgICAgICAgIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwK
KyAgICAgICAgIkNISUxEIjogbmV3IFJlZ0V4cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRo
LWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsKKyAgICAgICAgICAg
ICIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIiArIHdoaXRlc3BhY2UgKyAiKig/OihbKy1d
fCkiICsgd2hpdGVzcGFjZSArCisgICAgICAgICAgICAiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNl
ICsgIipcXCl8KSIsICJpIiApLAorICAgICAgICAiYm9vbCI6IG5ldyBSZWdFeHAoICJeKD86IiAr
IGJvb2xlYW5zICsgIikkIiwgImkiICksCisgICAgICAgIC8vIEZvciB1c2UgaW4gbGlicmFyaWVz
IGltcGxlbWVudGluZyAuaXMoKQorICAgICAgICAvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNo
aW5nIGluIGBzZWxlY3RgCisgICAgICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIg
KyB3aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0
KSg/OlxcKCIgKworICAgICAgICAgICAgd2hpdGVzcGFjZSArICIqKCg/Oi1cXGQpP1xcZCopIiAr
IHdoaXRlc3BhY2UgKyAiKlxcKXwpKD89W14tXXwkKSIsICJpIiApCisgICAgfSwKKworICAgIHJp
bnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAorICAgIHJoZWFk
ZXIgPSAvXmhcZCQvaSwKKworICAgIHJuYXRpdmUgPSAvXltee10rXHtccypcW25hdGl2ZSBcdy8s
CisKKyAgICAvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFT
UyBzZWxlY3RvcnMKKyAgICBycXVpY2tFeHByID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3
LV0rKSkkLywKKworICAgIHJzaWJsaW5nID0gL1srfl0vLAorICAgIHJlc2NhcGUgPSAvJ3xcXC9n
LAorCisgICAgLy8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0
YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVycworICAgIHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJc
XFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIp
fC4pIiwgImlnIiApLAorICAgIGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2Nh
cGVkV2hpdGVzcGFjZSApIHsKKyAgICAgICAgdmFyIGhpZ2ggPSAiMHgiICsgZXNjYXBlZCAtIDB4
MTAwMDA7CisgICAgICAgIC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CisgICAgICAgIC8vIFN1
cHBvcnQ6IEZpcmVmb3g8MjQKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJp
YyBpbnRlcnByZXRhdGlvbiBvZiArIjB4IgorICAgICAgICByZXR1cm4gaGlnaCAhPT0gaGlnaCB8
fCBlc2NhcGVkV2hpdGVzcGFjZSA/CisgICAgICAgICAgICBlc2NhcGVkIDoKKyAgICAgICAgICAg
IGhpZ2ggPCAwID8KKyAgICAgICAgICAgICAgICAvLyBCTVAgY29kZXBvaW50CisgICAgICAgICAg
ICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6CisgICAgICAgICAg
ICAgICAgLy8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpCisg
ICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwg
aGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7CisgICAgfSwKKworICAgIC8vIFVzZWQgZm9yIGlmcmFt
ZXMKKyAgICAvLyBTZWUgc2V0RG9jdW1lbnQoKQorICAgIC8vIFJlbW92aW5nIHRoZSBmdW5jdGlv
biB3cmFwcGVyIGNhdXNlcyBhICJQZXJtaXNzaW9uIERlbmllZCIKKyAgICAvLyBlcnJvciBpbiBJ
RQorICAgIHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgc2V0RG9jdW1lbnQo
KTsKKyAgICB9OworCisvLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKQor
dHJ5IHsKKyAgICBwdXNoLmFwcGx5KAorICAgICAgICAoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVy
cmVkRG9jLmNoaWxkTm9kZXMgKSksCisgICAgICAgIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzCisg
ICAgKTsKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMAorICAgIC8vIERldGVjdCBzaWxlbnRs
eSBmYWlsaW5nIHB1c2guYXBwbHkKKyAgICBhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxl
bmd0aCBdLm5vZGVUeXBlOworfSBjYXRjaCAoIGUgKSB7CisgICAgcHVzaCA9IHsgYXBwbHk6IGFy
ci5sZW5ndGggPworCisgICAgICAgIC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlCisgICAg
ICAgIGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKKyAgICAgICAgICAgIHB1c2hfbmF0aXZlLmFw
cGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoZWxzKSApOworICAgICAgICB9IDoKKworICAgICAgICAv
LyBTdXBwb3J0OiBJRTw5CisgICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHkKKyAg
ICAgICAgZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgeworICAgICAgICAgICAgdmFyIGogPSB0YXJn
ZXQubGVuZ3RoLAorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgLy8gQ2FuJ3Qg
dHJ1c3QgTm9kZUxpc3QubGVuZ3RoCisgICAgICAgICAgICB3aGlsZSAoICh0YXJnZXRbaisrXSA9
IGVsc1tpKytdKSApIHt9CisgICAgICAgICAgICB0YXJnZXQubGVuZ3RoID0gaiAtIDE7CisgICAg
ICAgIH0KKyAgICB9OworfQorCitmdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCBy
ZXN1bHRzLCBzZWVkICkgeworICAgIHZhciBtLCBpLCBlbGVtLCBuaWQsIG5pZHNlbGVjdCwgbWF0
Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsCisgICAgICAgIG5ld0NvbnRleHQgPSBjb250ZXh0ICYm
IGNvbnRleHQub3duZXJEb2N1bWVudCwKKworICAgICAgICAvLyBub2RlVHlwZSBkZWZhdWx0cyB0
byA5LCBzaW5jZSBjb250ZXh0IGRlZmF1bHRzIHRvIGRvY3VtZW50CisgICAgICAgIG5vZGVUeXBl
ID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5OworCisgICAgcmVzdWx0cyA9IHJlc3Vs
dHMgfHwgW107CisKKyAgICAvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQg
c2VsZWN0b3Igb3IgY29udGV4dAorICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5n
IiB8fCAhc2VsZWN0b3IgfHwKKyAgICAgICAgbm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09
IDkgJiYgbm9kZVR5cGUgIT09IDExICkgeworCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAg
IH0KKworICAgIC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQg
dG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHMKKyAgICBpZiAoICFzZWVkICkgeworCisgICAg
ICAgIGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBw
cmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgICAgICBzZXREb2N1bWVudCgg
Y29udGV4dCApOworICAgICAgICB9CisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3Vt
ZW50OworCisgICAgICAgIGlmICggZG9jdW1lbnRJc0hUTUwgKSB7CisKKyAgICAgICAgICAgIC8v
IElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSAiZ2V0
KkJ5KiIgRE9NIG1ldGhvZAorICAgICAgICAgICAgLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdt
ZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQorICAgICAgICAgICAg
aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3Rv
ciApKSApIHsKKworICAgICAgICAgICAgICAgIC8vIElEIHNlbGVjdG9yCisgICAgICAgICAgICAg
ICAgaWYgKCAobSA9IG1hdGNoWzFdKSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBEb2N1
bWVudCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gY29udGV4dC5nZXRFbGVtZW50
QnlJZCggbSApKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6
IElFLCBPcGVyYSwgV2Via2l0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzog
aWRlbnRpZnkgdmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVt
ZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLmlkID09PSBtICkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGNvbnRleHQKKyAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUUs
IE9wZXJhLCBXZWJraXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGlkZW50aWZ5
IHZlcnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVtZW50QnlJZCBjYW4g
bWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlk
KCBtICkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMoIGNvbnRleHQs
IGVsZW0gKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaWQgPT09IG0gKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8g
VHlwZSBzZWxlY3RvcgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewor
ICAgICAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHRzOworCisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgc2VsZWN0b3IKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlD
bGFzc05hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lICkgeworCisgICAgICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIGNv
bnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbAorICAgICAgICAg
ICAgaWYgKCBzdXBwb3J0LnFzYSAmJgorICAgICAgICAgICAgICAgICFjb21waWxlckNhY2hlWyBz
ZWxlY3RvciArICIgIiBdICYmCisgICAgICAgICAgICAgICAgKCFyYnVnZ3lRU0EgfHwgIXJidWdn
eVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHsKKworICAgICAgICAgICAgICAgIGlmICggbm9kZVR5
cGUgIT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQgPSBjb250ZXh0Owor
ICAgICAgICAgICAgICAgICAgICBuZXdTZWxlY3RvciA9IHNlbGVjdG9yOworCisgICAgICAgICAg
ICAgICAgLy8gcVNBIGxvb2tzIG91dHNpZGUgRWxlbWVudCBjb250ZXh0LCB3aGljaCBpcyBub3Qg
d2hhdCB3ZSB3YW50CisgICAgICAgICAgICAgICAgLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQg
Zm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0
OiBJRSA8PTgKKyAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50cworICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAh
PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgY29u
dGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgIlxcJCYiICk7Cisg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250
ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgKG5pZCA9IGV4cGFuZG8pICk7CisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3Ig
aW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVj
dG9yICk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBncm91cHMubGVuZ3RoOworICAgICAgICAg
ICAgICAgICAgICBuaWRzZWxlY3QgPSByaWRlbnRpZmllci50ZXN0KCBuaWQgKSA/ICIjIiArIG5p
ZCA6ICJbaWQ9JyIgKyBuaWQgKyAiJ10iOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGkt
LSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXSA9IG5pZHNlbGVjdCArICIg
IiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oICIsIiApOworCisgICAg
ICAgICAgICAgICAgICAgIC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9ycwor
ICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3Ig
KSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRleHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
aWYgKCBuZXdTZWxlY3RvciApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCisgICAg
ICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBxc2FFcnJvciApIHsKKyAgICAg
ICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgg
bmlkID09PSBleHBhbmRvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQu
cmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGwgb3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2Vs
ZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwor
fQorCisvKioKKyAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQorICog
QHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRh
dGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aAorICogIHByb3BlcnR5IG5hbWUgdGhl
IChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFu
IEV4cHIuY2FjaGVMZW5ndGgpCisgKiAgZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQorICovCitm
dW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKKyAgICB2YXIga2V5cyA9IFtdOworCisgICAgZnVuY3Rp
b24gY2FjaGUoIGtleSwgdmFsdWUgKSB7CisgICAgICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBh
dm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1
ZSAjMTU3KQorICAgICAgICBpZiAoIGtleXMucHVzaCgga2V5ICsgIiAiICkgPiBFeHByLmNhY2hl
TGVuZ3RoICkgeworICAgICAgICAgICAgLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRy
aWVzCisgICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOworICAgICAgICB9
CisgICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFsdWUpOworICAgIH0KKyAg
ICByZXR1cm4gY2FjaGU7Cit9CisKKy8qKgorICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFs
IHVzZSBieSBTaXp6bGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBt
YXJrCisgKi8KK2Z1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7CisgICAgZm5bIGV4cGFuZG8g
XSA9IHRydWU7CisgICAgcmV0dXJuIGZuOworfQorCisvKioKKyAqIFN1cHBvcnQgdGVzdGluZyB1
c2luZyBhbiBlbGVtZW50CisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0
ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHQKKyAqLworZnVuY3Rpb24gYXNzZXJ0
KCBmbiApIHsKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisK
KyAgICB0cnkgeworICAgICAgICByZXR1cm4gISFmbiggZGl2ICk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgLy8gUmVt
b3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CisgICAgICAgIGlmICggZGl2LnBhcmVudE5v
ZGUgKSB7CisgICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKyAgICAgICAgZGl2ID0g
bnVsbDsKKyAgICB9Cit9CisKKy8qKgorICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwg
b2YgdGhlIHNwZWNpZmllZCBhdHRycworICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2Vw
YXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcworICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBU
aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCisgKi8KK2Z1bmN0aW9uIGFkZEhhbmRsZSgg
YXR0cnMsIGhhbmRsZXIgKSB7CisgICAgdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCisgICAg
ICAgIGkgPSBhcnIubGVuZ3RoOworCisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgICAgIEV4cHIu
YXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyOworICAgIH0KK30KKworLyoqCisgKiBDaGVj
a3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzCisgKiBAcGFyYW0ge0VsZW1lbnR9IGEK
KyAqIEBwYXJhbSB7RWxlbWVudH0gYgorICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNz
IHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiCisg
Ki8KK2Z1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKKyAgICB2YXIgY3VyID0gYiAmJiBh
LAorICAgICAgICBkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9
PT0gMSAmJgorICAgICAgICAgICAgKCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKSAt
CisgICAgICAgICAgICAoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOworCisgICAg
Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCisgICAgaWYg
KCBkaWZmICkgeworICAgICAgICByZXR1cm4gZGlmZjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBp
ZiBiIGZvbGxvd3MgYQorICAgIGlmICggY3VyICkgeworICAgICAgICB3aGlsZSAoIChjdXIgPSBj
dXIubmV4dFNpYmxpbmcpICkgeworICAgICAgICAgICAgaWYgKCBjdXIgPT09IGIgKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIGEgPyAxIDogLTE7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9u
IHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcworICogQHBhcmFtIHtTdHJpbmd9IHR5
cGUKKyAqLworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CisgICAgcmV0dXJu
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBl
ID09PSB0eXBlOworICAgIH07Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVz
ZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zCisgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQorICovCitm
dW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2Uo
KTsKKyAgICAgICAgcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24i
KSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEg
ZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCisgKiBAcGFyYW0ge0Z1
bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsK
KyAgICByZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsKKyAgICAgICAg
YXJndW1lbnQgPSArYXJndW1lbnQ7CisgICAgICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rp
b24oIHNlZWQsIG1hdGNoZXMgKSB7CisgICAgICAgICAgICB2YXIgaiwKKyAgICAgICAgICAgICAg
ICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAorICAgICAg
ICAgICAgICAgIGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgICAgICAgICAvLyBNYXRj
aCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKKyAgICAgICAgICAgIHdo
aWxlICggaS0tICkgeworICAgICAgICAgICAgICAgIGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4
ZXNbaV0pIF0gKSB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRbal0gPSAhKG1hdGNoZXNbal0g
PSBzZWVkW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0p
OworICAgIH0pOworfQorCisvKioKKyAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEg
U2l6emxlIGNvbnRleHQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0CisgKiBA
cmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0
YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKKyAqLworZnVuY3Rpb24gdGVzdENvbnRleHQo
IGNvbnRleHQgKSB7CisgICAgcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxl
bWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cit9CisKKy8vIEV4cG9z
ZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCitzdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQg
PSB7fTsKKworLyoqCisgKiBEZXRlY3RzIFhNTCBub2RlcworICogQHBhcmFtIHtFbGVtZW50fE9i
amVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnQKKyAqIEByZXR1cm5zIHtCb29sZWFu
fSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKKyAqLworaXNYTUwgPSBTaXp6
bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAvLyBkb2N1bWVudEVsZW1lbnQgaXMg
dmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CisgICAgLy8gKHN1
Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpCisgICAgdmFyIGRvY3VtZW50RWxl
bWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1l
bnQ7CisgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFt
ZSAhPT0gIkhUTUwiIDogZmFsc2U7Cit9OworCisvKioKKyAqIFNldHMgZG9jdW1lbnQtcmVsYXRl
ZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudAorICogQHBhcmFt
IHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8g
dXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKKyAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl
IGN1cnJlbnQgZG9jdW1lbnQKKyAqLworc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQg
PSBmdW5jdGlvbiggbm9kZSApIHsKKyAgICB2YXIgaGFzQ29tcGFyZSwgcGFyZW50LAorICAgICAg
ICBkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7
CisKKyAgICAvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxl
Y3RlZAorICAgIGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwg
IWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7CisgICAgICAgIHJldHVybiBkb2N1bWVudDsKKyAgICB9
CisKKyAgICAvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlcworICAgIGRvY3VtZW50ID0gZG9jOwor
ICAgIGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisgICAgZG9jdW1lbnRJc0hU
TUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7CisKKyAgICAvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdl
CisgICAgLy8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyAi
cGVybWlzc2lvbiBkZW5pZWQiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNikKKyAgICBpZiAoIChwYXJl
bnQgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgJiYgcGFyZW50LnRvcCAhPT0gcGFyZW50ICkgewor
ICAgICAgICAvLyBTdXBwb3J0OiBJRSAxMQorICAgICAgICBpZiAoIHBhcmVudC5hZGRFdmVudExp
c3RlbmVyICkgeworICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoICJ1bmxvYWQi
LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSApOworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAx
MCBvbmx5CisgICAgICAgIH0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHsKKyAgICAg
ICAgICAgIHBhcmVudC5hdHRhY2hFdmVudCggIm9udW5sb2FkIiwgdW5sb2FkSGFuZGxlciApOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLyogQXR0cmlidXRlcworICAgIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8KKworICAgIC8vIFN1cHBvcnQ6IElFPDgKKyAgICAvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1
dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXMKKyAgICAvLyAo
ZXhjZXB0aW5nIElFOCBib29sZWFucykKKyAgICBzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQo
ZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICJpIjsKKyAgICAgICAg
cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKTsKKyAgICB9KTsKKworICAgIC8q
IGdldEVsZW1lbnQocylCeSoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvLyBDaGVjayBp
ZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cworICAgIHN1
cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAg
ICAgICAgZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOworICAg
ICAgICByZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsKKyAgICB9
KTsKKworICAgIC8vIFN1cHBvcnQ6IElFPDkKKyAgICBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsK
KworICAgIC8vIFN1cHBvcnQ6IElFPDEwCisgICAgLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQg
cmV0dXJucyBlbGVtZW50cyBieSBuYW1lCisgICAgLy8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJ
ZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcywKKyAgICAv
LyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3QKKyAgICBzdXBwb3J0
LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZG9jRWxlbS5hcHBl
bmRDaGlsZCggZGl2ICkuaWQgPSBleHBhbmRvOworICAgICAgICByZXR1cm4gIWRvY3VtZW50Lmdl
dEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyAp
Lmxlbmd0aDsKKyAgICB9KTsKKworICAgIC8vIElEIGZpbmQgYW5kIGZpbHRlcgorICAgIGlmICgg
c3VwcG9ydC5nZXRCeUlkICkgeworICAgICAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbigg
aWQsIGNvbnRleHQgKSB7CisgICAgICAgICAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1l
bnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKKyAgICAgICAgICAg
ICAgICB2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIG0gPyBbIG0gXSA6IFtdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAg
ICAgICBFeHByLmZpbHRlclsiSUQiXSA9IGZ1bmN0aW9uKCBpZCApIHsKKyAgICAgICAgICAgIHZh
ciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworICAgICAgICAg
ICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVt
LmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOworICAgICAgICAgICAgfTsKKyAgICAgICAg
fTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTdXBwb3J0OiBJRTYvNworICAgICAgICAvLyBn
ZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CisgICAgICAg
IGRlbGV0ZSBFeHByLmZpbmRbIklEIl07CisKKyAgICAgICAgRXhwci5maWx0ZXJbIklEIl0gPSAg
ZnVuY3Rpb24oIGlkICkgeworICAgICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1
bmVzY2FwZSwgZnVuZXNjYXBlICk7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVO
b2RlICE9PSAidW5kZWZpbmVkIiAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJp
YnV0ZU5vZGUoImlkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1
ZSA9PT0gYXR0cklkOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAv
LyBUYWcKKyAgICBFeHByLmZpbmRbIlRBRyJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSA/CisgICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisgICAgICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFn
ICk7CisKKyAgICAgICAgICAgIC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBn
RUJUTgorICAgICAgICAgICAgfSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0gOgorCisgICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7Cisg
ICAgICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgICAgICB0bXAgPSBbXSwKKyAgICAgICAg
ICAgICAgICBpID0gMCwKKyAgICAgICAgICAgICAgICAvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwg
YSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vCisg
ICAgICAgICAgICAgICAgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRh
ZyApOworCisgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCisgICAg
ICAgICAgICBpZiAoIHRhZyA9PT0gIioiICkgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGVs
ZW0gPSByZXN1bHRzW2krK10pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAucHVzaCggZWxlbSAp
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgcmV0dXJuIHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1
bHRzOworICAgICAgICB9OworCisgICAgLy8gQ2xhc3MKKyAgICBFeHByLmZpbmRbIkNMQVNTIl0g
PSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwg
Y29udGV4dCApIHsKKyAgICAgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKKyAgICAgICAgICAg
IHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOworICAg
ICAgICB9CisgICAgfTsKKworICAgIC8qIFFTQS9tYXRjaGVzU2VsZWN0b3IKKyAgICAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKKyAgICAvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0CisKKyAg
ICAvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElF
OS9PcGVyYSAxMS41KQorICAgIHJidWdneU1hdGNoZXMgPSBbXTsKKworICAgIC8vIHFTYSg6Zm9j
dXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCisgICAgLy8gV2UgYWxsb3cg
dGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yCisgICAg
Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlm
cmFtZQorICAgIC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwg
dGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCisgICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpx
dWVyeS5jb20vdGlja2V0LzEzMzc4CisgICAgcmJ1Z2d5UVNBID0gW107CisKKyAgICBpZiAoIChz
dXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSAp
IHsKKyAgICAgICAgLy8gQnVpbGQgUVNBIHJlZ2V4CisgICAgICAgIC8vIFJlZ2V4IHN0cmF0ZWd5
IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmkKKyAgICAgICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYg
KSB7CisgICAgICAgICAgICAvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJw
b3NlCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90
IGV4cGxpY2l0bHkKKyAgICAgICAgICAgIC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0
cmlidXRlLAorICAgICAgICAgICAgLy8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91
Z2gKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5Cisg
ICAgICAgICAgICBkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pbm5lckhUTUwgPSAiPGEgaWQ9
JyIgKyBleHBhbmRvICsgIic+PC9hPiIgKworICAgICAgICAgICAgICAgICI8c2VsZWN0IGlkPSci
ICsgZXhwYW5kbyArICItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+IiArCisgICAgICAgICAgICAg
ICAgIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKKworICAgICAgICAg
ICAgLy8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNgorICAgICAgICAgICAgLy8gTm90aGlu
ZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBv
ciAqPQorICAgICAgICAgICAgLy8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBp
biBPcGVyYSBidXQgInNhZmUiIGZvciBXaW5SVAorICAgICAgICAgICAgLy8gaHR0cDovL21zZG4u
bWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3Nl
Y3Rpb24KKyAgICAgICAgICAgIGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2Fw
dHVyZV49JyddIikubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAi
WypeJF09IiArIHdoaXRlc3BhY2UgKyAiKig/OicnfFwiXCIpIiApOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgKKyAgICAgICAgICAgIC8vIEJvb2xlYW4gYXR0
cmlidXRlcyBhbmQgInZhbHVlIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5CisgICAgICAgICAg
ICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKKyAg
ICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2
YWx1ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjAr
LCBQaGFudG9tSlM8MS45LjgrCisgICAgICAgICAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFs
bCggIltpZH49IiArIGV4cGFuZG8gKyAiLV0iICkubGVuZ3RoICkgeworICAgICAgICAgICAgICAg
IHJidWdneVFTQS5wdXNoKCJ+PSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBX
ZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVt
ZW50cworICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1z
ZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKyAgICAgICAgICAgIC8vIElFOCB0aHJvd3MgZXJy
b3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgICAgICAgICBpZiAoICFk
aXYucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CisgICAgICAgICAgICAg
ICAgcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrCisgICAgICAgICAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxCisgICAgICAgICAgICAvLyBJ
bi1wYWdlIGBzZWxlY3RvciNpZCBzaWJpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHMKKyAg
ICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCAiYSMiICsgZXhwYW5kbyArICIr
KiIgKS5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goIi4jLitbK35d
Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydChmdW5jdGlv
biggZGl2ICkgeworICAgICAgICAgICAgLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBz
CisgICAgICAgICAgICAvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmlj
dGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnQKKyAgICAgICAgICAgIHZhciBpbnB1dCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgICAgICAgICBpbnB1dC5zZXRB
dHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKKyAgICAgICAgICAgIGRpdi5hcHBlbmRDaGls
ZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgIkQiICk7CisKKyAgICAgICAgICAgIC8v
IFN1cHBvcnQ6IElFOAorICAgICAgICAgICAgLy8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9m
IG5hbWUgYXR0cmlidXRlCisgICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJb
bmFtZT1kXSIpLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIm5h
bWUiICsgd2hpdGVzcGFjZSArICIqWypeJHwhfl0/PSIgKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVu
dHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZCkKKyAgICAgICAgICAgIC8vIElF
OCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgICAg
ICAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggKSB7Cisg
ICAgICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRo
cm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisgICAgICAgICAgICBkaXYucXVlcnlT
ZWxlY3RvckFsbCgiKiw6eCIpOworICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsK
KyAgICAgICAgfSk7CisgICAgfQorCisgICAgaWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3Ig
PSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8CisgICAgICAgIGRv
Y0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8CisgICAgICAgIGRvY0VsZW0ubW96TWF0Y2hl
c1NlbGVjdG9yIHx8CisgICAgICAgIGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fAorICAgICAg
ICBkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHsKKworICAgICAgICBhc3NlcnQoZnVu
Y3Rpb24oIGRpdiApIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3Np
YmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgorICAgICAgICAgICAgLy8gb24gYSBkaXNjb25uZWN0
ZWQgbm9kZSAoSUUgOSkKKyAgICAgICAgICAgIHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBt
YXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKKworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQg
ZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gR2Vja28gZG9lcyBub3QgZXJy
b3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZAorICAgICAgICAgICAgbWF0Y2hlcy5jYWxsKCBkaXYs
ICJbcyE9JyddOngiICk7CisgICAgICAgICAgICByYnVnZ3lNYXRjaGVzLnB1c2goICIhPSIsIHBz
ZXVkb3MgKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNB
Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CisgICAgcmJ1Z2d5
TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNo
ZXMuam9pbigifCIpICk7CisKKyAgICAvKiBDb250YWlucworICAgIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
KyAgICBoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uICk7CisKKyAgICAvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXIKKyAgICAvLyBQdXJw
b3NlZnVsbHkgc2VsZi1leGNsdXNpdmUKKyAgICAvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5v
dCBjb250YWluIGl0c2VsZgorICAgIGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRl
c3QoIGRvY0VsZW0uY29udGFpbnMgKSA/CisgICAgICAgIGZ1bmN0aW9uKCBhLCBiICkgeworICAg
ICAgICAgICAgdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50
IDogYSwKKyAgICAgICAgICAgICAgICBidXAgPSBiICYmIGIucGFyZW50Tm9kZTsKKyAgICAgICAg
ICAgIHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYg
KAorICAgICAgICAgICAgICAgIGFkb3duLmNvbnRhaW5zID8KKyAgICAgICAgICAgICAgICAgICAg
YWRvd24uY29udGFpbnMoIGJ1cCApIDoKKyAgICAgICAgICAgICAgICAgICAgYS5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2Cisg
ICAgICAgICAgICApKTsKKyAgICAgICAgfSA6CisgICAgICAgIGZ1bmN0aW9uKCBhLCBiICkgewor
ICAgICAgICAgICAgaWYgKCBiICkgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGIgPSBiLnBh
cmVudE5vZGUpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGIgPT09IGEgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfTsKKworICAgIC8qIFNvcnRpbmcKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
KyAgICAvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisgICAgc29ydE9yZGVyID0gaGFzQ29tcGFy
ZSA/CisgICAgZnVuY3Rpb24oIGEsIGIgKSB7CisKKyAgICAgICAgLy8gRmxhZyBmb3IgZHVwbGlj
YXRlIHJlbW92YWwKKyAgICAgICAgaWYgKCBhID09PSBiICkgeworICAgICAgICAgICAgaGFzRHVw
bGljYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21w
YXJlRG9jdW1lbnRQb3NpdGlvbgorICAgICAgICB2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1
bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CisgICAgICAgIGlmICgg
Y29tcGFyZSApIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUg
c2FtZSBkb2N1bWVudAorICAgICAgICBjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSAp
ID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPworICAgICAgICAgICAgYS5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbiggYiApIDoKKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGtub3cg
dGhleSBhcmUgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAxOworCisgICAgICAgIC8vIERpc2Nv
bm5lY3RlZCBub2RlcworICAgICAgICBpZiAoIGNvbXBhcmUgJiAxIHx8CisgICAgICAgICAgICAo
IXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9
PT0gY29tcGFyZSkgKSB7CisKKyAgICAgICAgICAgIC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVu
dCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudAorICAgICAgICAgICAg
aWYgKCBhID09PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAm
JiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkgeworICAgICAgICAgICAgICAgIHJldHVybiAt
MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5v
d25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBi
KSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKKyAgICAgICAgICAgIHJldHVybiBzb3J0
SW5wdXQgPworICAgICAgICAgICAgICAgICggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRl
eE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKKyAgICAgICAgICAgICAgICAwOworICAgICAgICB9CisK
KyAgICAgICAgcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOworICAgIH0gOgorICAgIGZ1bmN0
aW9uKCBhLCBiICkgeworICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRl
bnRpY2FsCisgICAgICAgIGlmICggYSA9PT0gYiApIHsKKyAgICAgICAgICAgIGhhc0R1cGxpY2F0
ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZh
ciBjdXIsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGF1cCA9IGEucGFyZW50Tm9k
ZSwKKyAgICAgICAgICAgIGJ1cCA9IGIucGFyZW50Tm9kZSwKKyAgICAgICAgICAgIGFwID0gWyBh
IF0sCisgICAgICAgICAgICBicCA9IFsgYiBdOworCisgICAgICAgIC8vIFBhcmVudGxlc3Mgbm9k
ZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisgICAgICAgIGlmICggIWF1
cCB8fCAhYnVwICkgeworICAgICAgICAgICAgcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgor
ICAgICAgICAgICAgICAgIGIgPT09IGRvY3VtZW50ID8gMSA6CisgICAgICAgICAgICAgICAgYXVw
ID8gLTEgOgorICAgICAgICAgICAgICAgIGJ1cCA/IDEgOgorICAgICAgICAgICAgICAgIHNvcnRJ
bnB1dCA/CisgICAgICAgICAgICAgICAgKCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4
T2YoIHNvcnRJbnB1dCwgYiApICkgOgorICAgICAgICAgICAgICAgIDA7CisKKyAgICAgICAgLy8g
SWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKKyAgICAg
ICAgfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CisgICAgICAgICAgICByZXR1cm4gc2libGlu
Z0NoZWNrKCBhLCBiICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2Ugd2UgbmVl
ZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvbgorICAgICAgICBj
dXIgPSBhOworICAgICAgICB3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisgICAg
ICAgICAgICBhcC51bnNoaWZ0KCBjdXIgKTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBiOwor
ICAgICAgICB3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisgICAgICAgICAgICBi
cC51bnNoaWZ0KCBjdXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhbGsgZG93biB0aGUg
dHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CisgICAgICAgIHdoaWxlICggYXBbaV0gPT09
IGJwW2ldICkgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGkgPworICAgICAgICAgICAgLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZl
IGEgY29tbW9uIGFuY2VzdG9yCisgICAgICAgICAgICBzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtp
XSApIDoKKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBz
b3J0IGZpcnN0CisgICAgICAgICAgICBhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgorICAg
ICAgICAgICAgYnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOgorICAgICAgICAgICAgMDsKKyAg
ICB9OworCisgICAgcmV0dXJuIGRvY3VtZW50OworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5j
dGlvbiggZXhwciwgZWxlbWVudHMgKSB7CisgICAgcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwg
bnVsbCwgZWxlbWVudHMgKTsKK307CisKK1NpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlv
biggZWxlbSwgZXhwciApIHsKKyAgICAvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKKyAg
ICBpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7Cisg
ICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRo
YXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisgICAgZXhwciA9IGV4cHIucmVwbGFj
ZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKKworICAgIGlmICggc3VwcG9ydC5tYXRj
aGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKKyAgICAgICAgIWNvbXBpbGVyQ2FjaGVb
IGV4cHIgKyAiICIgXSAmJgorICAgICAgICAoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRj
aGVzLnRlc3QoIGV4cHIgKSApICYmCisgICAgICAgICggIXJidWdneVFTQSAgICAgfHwgIXJidWdn
eVFTQS50ZXN0KCBleHByICkgKSApIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFy
IHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOworCisgICAgICAgICAgICAvLyBJRSA5
J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzCisg
ICAgICAgICAgICBpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CisgICAg
ICAgICAgICAgICAgICAgIC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0
byBiZSBpbiBhIGRvY3VtZW50CisgICAgICAgICAgICAgICAgICAgIC8vIGZyYWdtZW50IGluIElF
IDkKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5v
ZGVUeXBlICE9PSAxMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAg
ICAgfQorICAgICAgICB9IGNhdGNoIChlKSB7fQorICAgIH0KKworICAgIHJldHVybiBTaXp6bGUo
IGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cit9OworCitTaXp6
bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKKyAgICAvLyBTZXQgZG9j
dW1lbnQgdmFycyBpZiBuZWVkZWQKKyAgICBpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8
IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgIHNldERvY3VtZW50KCBjb250ZXh0
ICk7CisgICAgfQorICAgIHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApOworfTsKKwor
U2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAvLyBTZXQgZG9jdW1l
bnQgdmFycyBpZiBuZWVkZWQKKyAgICBpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0g
KSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQor
CisgICAgdmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSwKKyAg
ICAgICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMg
KGpRdWVyeSAjMTM4MDcpCisgICAgICAgIHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0
dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID8KKyAgICAgICAgICAgIGZuKCBlbGVtLCBu
YW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6CisgICAgICAgICAgICB1bmRlZmluZWQ7CisKKyAgICBy
ZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPworICAgICAgICB2YWwgOgorICAgICAgICBzdXBwb3J0
LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID8KKyAgICAgICAgICAgIGVsZW0uZ2V0QXR0
cmlidXRlKCBuYW1lICkgOgorICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9k
ZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CisgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
KyAgICAgICAgICAgICAgICBudWxsOworfTsKKworU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1z
ZyApIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBl
eHByZXNzaW9uOiAiICsgbXNnICk7Cit9OworCisvKioKKyAqIERvY3VtZW50IHNvcnRpbmcgYW5k
IHJlbW92aW5nIGR1cGxpY2F0ZXMKKyAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCisgKi8K
K1NpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7CisgICAgdmFyIGVsZW0s
CisgICAgICAgIGR1cGxpY2F0ZXMgPSBbXSwKKyAgICAgICAgaiA9IDAsCisgICAgICAgIGkgPSAw
OworCisgICAgLy8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFz
c3VtZSB0aGVpciBwcmVzZW5jZQorICAgIGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1
cGxpY2F0ZXM7CisgICAgc29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRz
LnNsaWNlKCAwICk7CisgICAgcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKKworICAgIGlmICgg
aGFzRHVwbGljYXRlICkgeworICAgICAgICB3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSAp
IHsKKyAgICAgICAgICAgIGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgeworICAgICAgICAg
ICAgICAgIGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICB3aGlsZSAoIGotLSApIHsKKyAgICAgICAgICAgIHJlc3VsdHMuc3BsaWNlKCBk
dXBsaWNhdGVzWyBqIF0sIDEgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENsZWFyIGlu
cHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCisgICAgLy8gU2VlIGh0dHBzOi8v
Z2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1CisgICAgc29ydElucHV0ID0gbnVsbDsK
KworICAgIHJldHVybiByZXN1bHRzOworfTsKKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIGZv
ciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2RlcworICog
QHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCisgKi8KK2dldFRleHQgPSBTaXp6bGUuZ2V0VGV4
dCA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBub2RlLAorICAgICAgICByZXQgPSAiIiwK
KyAgICAgICAgaSA9IDAsCisgICAgICAgIG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAg
IGlmICggIW5vZGVUeXBlICkgeworICAgICAgICAvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBl
eHBlY3RlZCB0byBiZSBhbiBhcnJheQorICAgICAgICB3aGlsZSAoIChub2RlID0gZWxlbVtpKytd
KSApIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzCisgICAg
ICAgICAgICByZXQgKz0gZ2V0VGV4dCggbm9kZSApOworICAgICAgICB9CisgICAgfSBlbHNlIGlm
ICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkg
eworICAgICAgICAvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCisgICAgICAgIC8vIGlu
bmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVy
eSAjMTExNTMpCisgICAgICAgIGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09ICJzdHJp
bmciICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW4KKyAgICAgICAgICAg
IGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJs
aW5nICkgeworICAgICAgICAgICAgICAgIHJldCArPSBnZXRUZXh0KCBlbGVtICk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2Rl
VHlwZSA9PT0gNCApIHsKKyAgICAgICAgcmV0dXJuIGVsZW0ubm9kZVZhbHVlOworICAgIH0KKyAg
ICAvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9k
ZXMKKworICAgIHJldHVybiByZXQ7Cit9OworCitFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsK
KworICAgIC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcgorICAgIGNhY2hlTGVuZ3RoOiA1
MCwKKworICAgIGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLAorCisgICAgbWF0Y2g6IG1hdGNo
RXhwciwKKworICAgIGF0dHJIYW5kbGU6IHt9LAorCisgICAgZmluZDoge30sCisKKyAgICByZWxh
dGl2ZTogeworICAgICAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0s
CisgICAgICAgICIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAorICAgICAgICAiKyI6IHsgZGly
OiAicHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwKKyAgICAgICAgIn4iOiB7IGRpcjog
InByZXZpb3VzU2libGluZyIgfQorICAgIH0sCisKKyAgICBwcmVGaWx0ZXI6IHsKKyAgICAgICAg
IkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNo
WzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisKKyAgICAgICAgICAgIC8vIE1v
dmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVk
CisgICAgICAgICAgICBtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hb
NV0gfHwgIiIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCisgICAgICAgICAg
ICBpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworICAgICAgICAgICAgICAgIG1hdGNoWzNdID0g
IiAiICsgbWF0Y2hbM10gKyAiICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biBtYXRjaC5zbGljZSggMCwgNCApOworICAgICAgICB9LAorCisgICAgICAgICJDSElMRCI6IGZ1
bmN0aW9uKCBtYXRjaCApIHsKKyAgICAgICAgICAgIC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJb
IkNISUxEIl0KKyAgICAgICAgICAgICAgICAxIHR5cGUgKG9ubHl8bnRofC4uLikKKyAgICAgICAg
ICAgICAgICAyIHdoYXQgKGNoaWxkfG9mLXR5cGUpCisgICAgICAgICAgICAgICAgMyBhcmd1bWVu
dCAoZXZlbnxvZGR8XGQqfFxkKm4oWystXVxkKyk/fC4uLikKKyAgICAgICAgICAgICAgICA0IHhu
LWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQorICAgICAgICAgICAgICAg
IDUgc2lnbiBvZiB4bi1jb21wb25lbnQKKyAgICAgICAgICAgICAgICA2IHggb2YgeG4tY29tcG9u
ZW50CisgICAgICAgICAgICAgICAgNyBzaWduIG9mIHktY29tcG9uZW50CisgICAgICAgICAgICAg
ICAgOCB5IG9mIHktY29tcG9uZW50CisgICAgICAgICAgICAqLworICAgICAgICAgICAgbWF0Y2hb
MV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICBpZiAoIG1hdGNoWzFd
LnNsaWNlKCAwLCAzICkgPT09ICJudGgiICkgeworICAgICAgICAgICAgICAgIC8vIG50aC0qIHJl
cXVpcmVzIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCAhbWF0Y2hbM10gKSB7CisgICAg
ICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3Ig
RXhwci5maWx0ZXIuQ0hJTEQKKyAgICAgICAgICAgICAgICAvLyByZW1lbWJlciB0aGF0IGZhbHNl
L3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCisgICAgICAgICAgICAgICAgbWF0Y2hbNF0g
PSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hb
M10gPT09ICJldmVuIiB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKSApOworICAgICAgICAgICAgICAg
IG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09ICJv
ZGQiICk7CisKKyAgICAgICAgICAgIC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50cwor
ICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0Y2hbM10gKSB7CisgICAgICAgICAgICAgICAgU2l6
emxlLmVycm9yKCBtYXRjaFswXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1
cm4gbWF0Y2g7CisgICAgICAgIH0sCisKKyAgICAgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRj
aCApIHsKKyAgICAgICAgICAgIHZhciBleGNlc3MsCisgICAgICAgICAgICAgICAgdW5xdW90ZWQg
PSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07CisKKyAgICAgICAgICAgIGlmICggbWF0Y2hFeHByWyJD
SElMRCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRz
IGFzLWlzCisgICAgICAgICAgICBpZiAoIG1hdGNoWzNdICkgeworICAgICAgICAgICAgICAgIG1h
dGNoWzJdID0gbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgIiI7CisKKyAgICAgICAgICAgIC8vIFN0
cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCisgICAgICAgICAg
ICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAg
ICAgICAgICAgICAgICAvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQor
ICAgICAgICAgICAgICAgIChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYK
KyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVz
aXMKKyAgICAgICAgICAgICAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1
b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICAgICAgICAgIG1h
dGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOworICAgICAgICAgICAgICAgIG1h
dGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBm
aWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKKyAgICAgICAgICAgIHJldHVybiBtYXRj
aC5zbGljZSggMCwgMyApOworICAgICAgICB9CisgICAgfSwKKworICAgIGZpbHRlcjogeworCisg
ICAgICAgICJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHsKKyAgICAgICAgICAg
IHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5l
c2NhcGUgKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1lU2VsZWN0
b3IgPT09ICIqIiA/CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9
IDoKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09
PSBub2RlTmFtZTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9LAorCisgICAgICAgICJD
TEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CisgICAgICAgICAgICB2YXIgcGF0dGVybiA9
IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArICIgIiBdOworCisgICAgICAgICAgICByZXR1cm4gcGF0
dGVybiB8fAorICAgICAgICAgICAgICAgIChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihefCIgKyB3
aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiICkp
ICYmCisgICAgICAgICAgICAgICAgY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVs
ZW0uY2xhc3NOYW1lID09PSAic3RyaW5nIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxl
bS5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFz
cyIpIHx8ICIiICk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0sCisKKyAgICAgICAg
IkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkgeworICAgICAgICAgICAg
cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBT
aXp6bGUuYXR0ciggZWxlbSwgbmFtZSApOworCisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHQg
PT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yID09PSAiIT0i
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICFvcGVyYXRvciApIHsK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIiOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG9w
ZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAgICAg
b3BlcmF0b3IgPT09ICIhPSIgPyByZXN1bHQgIT09IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAg
ICAgb3BlcmF0b3IgPT09ICJePSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9
PT0gMCA6CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYg
cmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisgICAgICAgICAgICAgICAgICAgIG9wZXJh
dG9yID09PSAiJD0iID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09
IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiAr
IHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgIiAiICkgKyAiICIgKS5pbmRleE9mKCBjaGVj
ayApID4gLTEgOgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gInw9IiA/IHJlc3Vs
dCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNo
ZWNrICsgIi0iIDoKKyAgICAgICAgICAgICAgICAgICAgZmFsc2U7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9LAorCisgICAgICAgICJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1
bWVudCwgZmlyc3QsIGxhc3QgKSB7CisgICAgICAgICAgICB2YXIgc2ltcGxlID0gdHlwZS5zbGlj
ZSggMCwgMyApICE9PSAibnRoIiwKKyAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHlwZS5zbGlj
ZSggLTQgKSAhPT0gImxhc3QiLAorICAgICAgICAgICAgICAgIG9mVHlwZSA9IHdoYXQgPT09ICJv
Zi10eXBlIjsKKworICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAg
PworCisgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQorICAgICAgICAg
ICAgICAgIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFl
bGVtLnBhcmVudE5vZGU7CisgICAgICAgICAgICAgICAgfSA6CisKKyAgICAgICAgICAgICAgICBm
dW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgICAgICAgICB2YXIg
Y2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gIm5leHRT
aWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFy
ZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG9m
VHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICB1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGRpZmYgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmVudCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10
eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzaW1wbGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd2hpbGUgKCBkaXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUgPSBlbGVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3
aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCBvZlR5cGUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXZl
cnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBkaXIgPSB0eXBlID09PSAib25s
eSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IFsgZm9y
d2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOworCisgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUg
ZGF0YSBvbiBgcGFyZW50YAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBmb3J3YXJkICYm
IHVzZUNhY2hlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBgZWxl
bWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbm9kZSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRl
ckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGll
cyAoalF1ZXJ5IGdoLTE3MDkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ2Fj
aGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBk
aXJydW5zICYmIGNhY2hlWyAxIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9
IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5v
ZGUgJiYgbm9kZVsgZGlyIF0gfHwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgp
KSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGZvdW5kLCBj
YWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVhaworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09
IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDYWNo
ZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2
aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggdXNlQ2FjaGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbm9kZSA9IGVsZW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVuZCBhZ2FpbnN0IGNsb25l
ZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGVyQ2FjaGVbIG5vZGUudW5pcXVl
SUQgXSA9IHt9KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHVu
aXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IG5vZGVJbmRleDsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4bWwg
Om50aC1jaGlsZCguLi4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgOm50aC1s
YXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggZGlmZiA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVs
ZW1gIGZyb20gdGhlIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxl
ICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0
YXJ0LnBvcCgpKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCAoIG9mVHlwZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9k
ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDoKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVUeXBlID09PSAxICkgJiYKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2RpZmYgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNv
dW50ZXJlZCBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCB1c2VDYWNoZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0g
e30pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFIDw5IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3
MDkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNh
Y2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBd
ID0ge30pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu
aXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG5vZGUgPT09IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNp
emUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gbGFzdDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAm
JiBkaWZmIC8gZmlyc3QgPj0gMCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgfTsKKyAgICAgICAgfSwKKworICAgICAgICAiUFNFVURPIjogZnVuY3Rpb24oIHBzZXVk
bywgYXJndW1lbnQgKSB7CisgICAgICAgICAgICAvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNh
c2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVj
dG9ycy8jcHNldWRvLWNsYXNzZXMKKyAgICAgICAgICAgIC8vIFByaW9yaXRpemUgYnkgY2FzZSBz
ZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2Fz
ZSBsZXR0ZXJzCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJp
dHMgZnJvbSBwc2V1ZG9zCisgICAgICAgICAgICB2YXIgYXJncywKKyAgICAgICAgICAgICAgICBm
biA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9M
b3dlckNhc2UoKSBdIHx8CisgICAgICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggInVuc3Vw
cG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOworCisgICAgICAgICAgICAvLyBUaGUgdXNlciBt
YXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CisgICAgICAgICAgICAvLyBhcmd1
bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgorICAgICAgICAg
ICAgLy8ganVzdCBhcyBTaXp6bGUgZG9lcworICAgICAgICAgICAgaWYgKCBmblsgZXhwYW5kbyBd
ICkgeworICAgICAgICAgICAgICAgIHJldHVybiBmbiggYXJndW1lbnQgKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1
cmVzCisgICAgICAgICAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisgICAgICAgICAgICAgICAg
YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOworICAgICAgICAgICAgICAg
IHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2Fz
ZSgpICkgPworICAgICAgICAgICAgICAgICAgICBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQs
IG1hdGNoZXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWR4LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpID0gbWF0Y2hlZC5sZW5ndGg7CisgICAgICAgICAgICAg
ICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkgOgorICAgICAg
ICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApOworICAgICAgICAgICAgICAgICAgICB9OworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm47CisgICAgICAgIH0KKyAgICB9LAor
CisgICAgcHNldWRvczogeworICAgICAgICAvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3MK
KyAgICAgICAgIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAg
ICAgICAgICAvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQorICAgICAgICAg
ICAgLy8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICAgICAgICAg
IC8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycworICAgICAgICAgICAgdmFyIGlucHV0ID0gW10sCisg
ICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtdLAorICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBj
b21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CisKKyAgICAgICAgICAg
IHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPworICAgICAgICAgICAgICAgIG1hcmtGdW5jdGlv
bihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAg
ICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZCA9IG1h
dGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkg
PSBzZWVkLmxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCBlbGVtZW50cyB1
bm1hdGNoZWQgYnkgYG1hdGNoZXJgCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVs
ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfSkgOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0WzBdID0gZWxlbTsKKyAgICAg
ICAgICAgICAgICAgICAgbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApOworICAg
ICAgICAgICAgICAgICAgICAvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQor
ICAgICAgICAgICAgICAgICAgICBpbnB1dFswXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiAhcmVzdWx0cy5wb3AoKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9KSwK
KworICAgICAgICAiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAg
ICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9KSwKKworICAgICAgICAiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24o
IHRleHQgKSB7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1
bmVzY2FwZSApOworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAg
ICAgICAgICAgIHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwg
Z2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9KSwKKworICAgICAgICAvLyAiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2Vu
dGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvcgorICAgICAgICAvLyBpcyBiYXNlZCBzb2xlbHkgb24g
dGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQorICAgICAgICAvLyBiZWluZyBlcXVhbCB0byB0
aGUgaWRlbnRpZmllciBDLAorICAgICAgICAvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRp
ZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICItIi4KKyAgICAgICAgLy8gVGhlIG1hdGNo
aW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1l
ZCBjYXNlLWluc2Vuc2l0aXZlbHkuCisgICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBu
b3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgorICAgICAgICAvLyBodHRwOi8v
d3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvCisgICAgICAgICJsYW5nIjogbWFy
a0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHsKKyAgICAgICAgICAgIC8vIGxhbmcgdmFsdWUg
bXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKyAgICAgICAgICAgIGlmICggIXJpZGVudGlmaWVy
LnRlc3QobGFuZyB8fCAiIikgKSB7CisgICAgICAgICAgICAgICAgU2l6emxlLmVycm9yKCAidW5z
dXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxh
bmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsK
KyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICB2
YXIgZWxlbUxhbmc7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBp
ZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID8KKyAgICAgICAgICAgICAgICAgICAgICAg
IGVsZW0ubGFuZyA6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSgi
eG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgibGFuZyIpKSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOworICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmlu
ZGV4T2YoIGxhbmcgKyAiLSIgKSA9PT0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2Rl
VHlwZSA9PT0gMSApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IH07CisgICAgICAgIH0pLAorCisgICAgICAgIC8vIE1pc2NlbGxhbmVvdXMKKyAgICAgICAgInRh
cmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgdmFyIGhhc2ggPSB3aW5kb3cu
bG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7CisgICAgICAgICAgICByZXR1cm4gaGFz
aCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7CisgICAgICAgIH0sCisKKyAgICAgICAg
InJvb3QiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtID09PSBk
b2NFbGVtOworICAgICAgICB9LAorCisgICAgICAgICJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYg
KCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5
cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsKKyAgICAgICAgfSwKKworICAgICAg
ICAvLyBCb29sZWFuIHByb3BlcnRpZXMKKyAgICAgICAgImVuYWJsZWQiOiBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTsKKyAgICAg
ICAgfSwKKworICAgICAgICAiZGlzYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAg
ICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOworICAgICAgICB9LAorCisgICAgICAg
ICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAvLyBJbiBDU1MzLCA6
Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHMK
KyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0
b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5v
ZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSAi
aW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYmICEh
ZWxlbS5zZWxlY3RlZCk7CisgICAgICAgIH0sCisKKyAgICAgICAgInNlbGVjdGVkIjogZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgICAgICAgICAvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtl
cyBzZWxlY3RlZC1ieS1kZWZhdWx0CisgICAgICAgICAgICAvLyBvcHRpb25zIGluIFNhZmFyaSB3
b3JrIHByb3Blcmx5CisgICAgICAgICAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICAg
ICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CisgICAgICAgIH0s
CisKKyAgICAgICAgLy8gQ29udGVudHMKKyAgICAgICAgImVtcHR5IjogZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5
LXBzZXVkbworICAgICAgICAgICAgLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkg
b3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAorICAg
ICAgICAgICAgLy8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBp
bnN0cnVjdGlvbjogNzsgZXRjLikKKyAgICAgICAgICAgIC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBi
ZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW4KKyAgICAgICAg
ICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRT
aWJsaW5nICkgeworICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKworICAgICAg
ICAicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICByZXR1cm4gIUV4cHIu
cHNldWRvc1siZW1wdHkiXSggZWxlbSApOworICAgICAgICB9LAorCisgICAgICAgIC8vIEVsZW1l
bnQvaW5wdXQgdHlwZXMKKyAgICAgICAgImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAg
ICAgICAgICAgcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgICAgICB9
LAorCisgICAgICAgICJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgcmV0
dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgICAgICB9LAorCisgICAgICAg
ICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHZhciBuYW1lID0gZWxl
bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJp
bnB1dCIgJiYgZWxlbS50eXBlID09PSAiYnV0dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsKKyAg
ICAgICAgfSwKKworICAgICAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAg
ICAgdmFyIGF0dHI7CisgICAgICAgICAgICByZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz
ZSgpID09PSAiaW5wdXQiICYmCisgICAgICAgICAgICAgICAgZWxlbS50eXBlID09PSAidGV4dCIg
JiYKKworICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFPDgKKyAgICAgICAgICAgICAgICAv
LyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgInNlYXJjaCIpIGFwcGVhciB3aXRo
IGVsZW0udHlwZSA9PT0gInRleHQiCisgICAgICAgICAgICAgICAgKCAoYXR0ciA9IGVsZW0uZ2V0
QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4
dCIgKTsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCisg
ICAgICAgICJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgICByZXR1cm4gWyAwIF07CisgICAgICAgIH0pLAorCisgICAgICAgICJsYXN0IjogY3Jl
YXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Cisg
ICAgICAgICAgICByZXR1cm4gWyBsZW5ndGggLSAxIF07CisgICAgICAgIH0pLAorCisgICAgICAg
ICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVu
Z3RoLCBhcmd1bWVudCApIHsKKyAgICAgICAgICAgIHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFy
Z3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKKyAgICAgICAgfSksCisKKyAgICAgICAgImV2
ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0
aCApIHsKKyAgICAgICAgICAgIHZhciBpID0gMDsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxl
bmd0aDsgaSArPSAyICkgeworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOworICAgICAg
ICB9KSwKKworICAgICAgICAib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigg
bWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgICAgICAgICB2YXIgaSA9IDE7CisgICAgICAg
ICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKKyAgICAgICAgICAgICAgICBtYXRj
aEluZGV4ZXMucHVzaCggaSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1h
dGNoSW5kZXhlczsKKyAgICAgICAgfSksCisKKyAgICAgICAgImx0IjogY3JlYXRlUG9zaXRpb25h
bFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAg
ICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3Vt
ZW50OworICAgICAgICAgICAgZm9yICggOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICAgICAg
bWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biBtYXRjaEluZGV4ZXM7CisgICAgICAgIH0pLAorCisgICAgICAgICJndCI6IGNyZWF0ZVBvc2l0
aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsK
KyAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBh
cmd1bWVudDsKKyAgICAgICAgICAgIGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKKyAgICAgICAg
ICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKKyAgICAgICAgfSkKKyAgICB9Cit9OworCitFeHByLnBz
ZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJlcSJdOworCisvLyBBZGQgYnV0dG9uL2lucHV0
IHR5cGUgcHNldWRvcworZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwg
ZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7CisgICAgRXhwci5w
c2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOworfQorZm9yICggaSBpbiB7IHN1
Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHsKKyAgICBFeHByLnBzZXVkb3NbIGkgXSA9IGNy
ZWF0ZUJ1dHRvblBzZXVkbyggaSApOworfQorCisvLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3
IHNldEZpbHRlcnMKK2Z1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQorc2V0RmlsdGVycy5wcm90b3R5
cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7CitFeHByLnNldEZpbHRlcnMgPSBuZXcg
c2V0RmlsdGVycygpOworCit0b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBz
ZWxlY3RvciwgcGFyc2VPbmx5ICkgeworICAgIHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0
eXBlLAorICAgICAgICBzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLAorICAgICAgICBjYWNoZWQg
PSB0b2tlbkNhY2hlWyBzZWxlY3RvciArICIgIiBdOworCisgICAgaWYgKCBjYWNoZWQgKSB7Cisg
ICAgICAgIHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7CisgICAgfQor
CisgICAgc29GYXIgPSBzZWxlY3RvcjsKKyAgICBncm91cHMgPSBbXTsKKyAgICBwcmVGaWx0ZXJz
ID0gRXhwci5wcmVGaWx0ZXI7CisKKyAgICB3aGlsZSAoIHNvRmFyICkgeworCisgICAgICAgIC8v
IENvbW1hIGFuZCBmaXJzdCBydW4KKyAgICAgICAgaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSBy
Y29tbWEuZXhlYyggc29GYXIgKSkgKSB7CisgICAgICAgICAgICBpZiAoIG1hdGNoICkgeworICAg
ICAgICAgICAgICAgIC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkCisg
ICAgICAgICAgICAgICAgc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwg
c29GYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cHMucHVzaCggKHRva2VucyA9
IFtdKSApOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2hlZCA9IGZhbHNlOworCisgICAgICAg
IC8vIENvbWJpbmF0b3JzCisgICAgICAgIGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMo
IHNvRmFyICkpICkgeworICAgICAgICAgICAgbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CisgICAg
ICAgICAgICB0b2tlbnMucHVzaCh7CisgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoZWQsCisg
ICAgICAgICAgICAgICAgLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCisg
ICAgICAgICAgICAgICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVu
Z3RoICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWx0ZXJzCisgICAgICAgIGZvciAoIHR5
cGUgaW4gRXhwci5maWx0ZXIgKSB7CisgICAgICAgICAgICBpZiAoIChtYXRjaCA9IG1hdGNoRXhw
clsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8CisgICAg
ICAgICAgICAgICAgKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7Cisg
ICAgICAgICAgICAgICAgbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAg
dG9rZW5zLnB1c2goeworICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hlZCwKKyAgICAg
ICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlczog
bWF0Y2gKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBzb0ZhciA9IHNvRmFy
LnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCAhbWF0Y2hlZCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzCisg
ICAgLy8gaWYgd2UncmUganVzdCBwYXJzaW5nCisgICAgLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBl
cnJvciBvciByZXR1cm4gdG9rZW5zCisgICAgcmV0dXJuIHBhcnNlT25seSA/CisgICAgICAgIHNv
RmFyLmxlbmd0aCA6CisgICAgICAgIHNvRmFyID8KKyAgICAgICAgICAgIFNpenpsZS5lcnJvcigg
c2VsZWN0b3IgKSA6CisgICAgICAgICAgICAvLyBDYWNoZSB0aGUgdG9rZW5zCisgICAgICAgICAg
ICB0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK307CisKK2Z1bmN0
aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgICAgIGxlbiA9
IHRva2Vucy5sZW5ndGgsCisgICAgICAgIHNlbGVjdG9yID0gIiI7CisgICAgZm9yICggOyBpIDwg
bGVuOyBpKysgKSB7CisgICAgICAgIHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTsKKyAgICB9
CisgICAgcmV0dXJuIHNlbGVjdG9yOworfQorCitmdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRj
aGVyLCBjb21iaW5hdG9yLCBiYXNlICkgeworICAgIHZhciBkaXIgPSBjb21iaW5hdG9yLmRpciwK
KyAgICAgICAgY2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFyZW50Tm9kZSIs
CisgICAgICAgIGRvbmVOYW1lID0gZG9uZSsrOworCisgICAgcmV0dXJuIGNvbWJpbmF0b3IuZmly
c3QgPworICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5n
IGVsZW1lbnQKKyAgICAgICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKKyAgICAg
ICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CisgICAgICAgICAgICAgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gOgorCisgICAgICAgIC8vIENo
ZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cworICAgICAgICBmdW5j
dGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgdmFyIG9sZENhY2hlLCB1
bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwKKyAgICAgICAgICAgICAgICBuZXdDYWNoZSA9IFsgZGly
cnVucywgZG9uZU5hbWUgXTsKKworICAgICAgICAgICAgLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFy
eSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRv
ciBjYWNoaW5nCisgICAgICAgICAgICBpZiAoIHhtbCApIHsKKyAgICAgICAgICAgICAgICB3aGls
ZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGVs
ZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkg
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVj
a05vbkVsZW1lbnRzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDYWNoZSA9IGVs
ZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5CisgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51
bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGRpciBdKSAm
JgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMg
JiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0
byBwcmV2aW91cyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAo
bmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOworICAgICAgICAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBuZXdjYWNoZSBz
byByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5pcXVlQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFp
bCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkp
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH07Cit9CisKK2Z1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHsKKyAgICBy
ZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CisgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICB2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKKyAgICAg
ICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgIGlmICggIW1hdGNoZXJzW2ld
KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9IDoKKyAgICAgICAgbWF0Y2hlcnNbMF07Cit9CisKK2Z1bmN0aW9u
IG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKKyAgICB2
YXIgaSA9IDAsCisgICAgICAgIGxlbiA9IGNvbnRleHRzLmxlbmd0aDsKKyAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKKyAgICAgICAgU2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJl
c3VsdHMgKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK2Z1bmN0aW9uIGNvbmRl
bnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGVs
ZW0sCisgICAgICAgIG5ld1VubWF0Y2hlZCA9IFtdLAorICAgICAgICBpID0gMCwKKyAgICAgICAg
bGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKKyAgICAgICAgbWFwcGVkID0gbWFwICE9IG51bGw7CisK
KyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0
Y2hlZFtpXSkgKSB7CisgICAgICAgICAgICBpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBj
b250ZXh0LCB4bWwgKSApIHsKKyAgICAgICAgICAgICAgICBuZXdVbm1hdGNoZWQucHVzaCggZWxl
bSApOworICAgICAgICAgICAgICAgIGlmICggbWFwcGVkICkgeworICAgICAgICAgICAgICAgICAg
ICBtYXAucHVzaCggaSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdVbm1hdGNoZWQ7Cit9CisKK2Z1bmN0aW9uIHNl
dE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RG
aW5kZXIsIHBvc3RTZWxlY3RvciApIHsKKyAgICBpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0
ZXJbIGV4cGFuZG8gXSApIHsKKyAgICAgICAgcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RG
aWx0ZXIgKTsKKyAgICB9CisgICAgaWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBh
bmRvIF0gKSB7CisgICAgICAgIHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBw
b3N0U2VsZWN0b3IgKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworICAgICAgICB2YXIgdGVtcCwgaSwgZWxl
bSwKKyAgICAgICAgICAgIHByZU1hcCA9IFtdLAorICAgICAgICAgICAgcG9zdE1hcCA9IFtdLAor
ICAgICAgICAgICAgcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKKworICAgICAgICAgICAg
Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHQKKyAgICAgICAgICAg
IGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRl
eHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCisKKyAgICAgICAgICAg
IC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Ig
c2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbgorICAgICAgICAgICAgbWF0Y2hlckluID0gcHJl
RmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisgICAgICAgICAgICAgICAgY29uZGVu
c2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorICAgICAgICAg
ICAgICAgIGVsZW1zLAorCisgICAgICAgICAgICBtYXRjaGVyT3V0ID0gbWF0Y2hlciA/CisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQs
IG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cywKKyAgICAgICAg
ICAgICAgICBwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8
IHBvc3RGaWx0ZXIgKSA/CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uaW50ZXJtZWRpYXRl
IHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgIFtdIDoKKworICAg
ICAgICAgICAgICAgICAgICAvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHkKKyAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0cyA6CisgICAgICAgICAgICAgICAgbWF0Y2hlckluOwor
CisgICAgICAgIC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCisgICAgICAgIGlmICggbWF0Y2hlciAp
IHsKKyAgICAgICAgICAgIG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwg
eG1sICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSBwb3N0RmlsdGVyCisgICAgICAg
IGlmICggcG9zdEZpbHRlciApIHsKKyAgICAgICAgICAgIHRlbXAgPSBjb25kZW5zZSggbWF0Y2hl
ck91dCwgcG9zdE1hcCApOworICAgICAgICAgICAgcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRl
eHQsIHhtbCApOworCisgICAgICAgICAgICAvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5
IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluCisgICAgICAgICAgICBpID0gdGVtcC5sZW5n
dGg7CisgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChl
bGVtID0gdGVtcFtpXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJPdXRbIHBvc3RN
YXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHNlZWQgKSB7
CisgICAgICAgICAgICBpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkgeworICAgICAgICAg
ICAgICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRo
ZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBw
b3N0RmluZGVyIGNvbnRleHRzCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBbXTsKKyAgICAg
ICAgICAgICAgICAgICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGVsZW0gPSBt
YXRjaGVyT3V0W2ldKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3Jl
IG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgcG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHht
bCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1vdmUgbWF0Y2hl
ZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVk
CisgICAgICAgICAgICAgICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAg
IHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gbWF0Y2hl
ck91dFtpXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wID0gcG9zdEZpbmRlciA/
IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisg
ICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYg
ZGVmaW5lZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2hlck91dCA9IGNvbmRl
bnNlKAorICAgICAgICAgICAgICAgIG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPworICAgICAgICAg
ICAgICAgICAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVu
Z3RoICkgOgorICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0CisgICAgICAgICAgICApOwor
ICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyICkgeworICAgICAgICAgICAgICAgIHBvc3RGaW5k
ZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKK30KKworZnVuY3Rpb24gbWF0Y2hlckZy
b21Ub2tlbnMoIHRva2VucyApIHsKKyAgICB2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLAor
ICAgICAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAorICAgICAgICBsZWFkaW5nUmVsYXRpdmUgPSBF
eHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAorICAgICAgICBpbXBsaWNpdFJlbGF0aXZl
ID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwKKyAgICAgICAgaSA9IGxl
YWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAorCisgICAgICAgIC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0
Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBj
b250ZXh0KHMpCisgICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKKyAg
ICAgICAgfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAorICAgICAgICBtYXRjaEFueUNvbnRl
eHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVy
biBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xOworICAgICAgICB9LCBpbXBsaWNp
dFJlbGF0aXZlLCB0cnVlICksCisgICAgICAgIG1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwg
Y29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgdmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2
ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCisgICAg
ICAgICAgICAgICAgKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KKyAgICAgICAg
ICAgICAgICAgICAgbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CisgICAgICAg
ICAgICAgICAgICAgIG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTsKKyAg
ICAgICAgICAgIC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KQorICAg
ICAgICAgICAgY2hlY2tDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7Cisg
ICAgICAgIH0gXTsKKworICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBpZiAo
IChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7CisgICAgICAg
ICAgICBtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMg
KSwgbWF0Y2hlcikgXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hdGNoZXIgPSBF
eHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNo
ZXMgKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3Np
dGlvbmFsIG1hdGNoZXIKKyAgICAgICAgICAgIGlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgewor
ICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFu
eSkgZm9yIHByb3BlciBoYW5kbGluZworICAgICAgICAgICAgICAgIGogPSArK2k7CisgICAgICAg
ICAgICAgICAgZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
ICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIHJldHVybiBzZXRNYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICBp
ID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKKyAgICAgICAgICAgICAgICAgICAg
aSA+IDEgJiYgdG9TZWxlY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBw
cmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1w
bGljaXQgYW55LWVsZW1lbnQgYCpgCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuc2xp
Y2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSAi
ICIgPyAiKiIgOiAiIiB9KQorICAgICAgICAgICAgICAgICAgICApLnJlcGxhY2UoIHJ0cmltLCAi
JDEiICksCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAg
IGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLAorICAg
ICAgICAgICAgICAgICAgICBqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0g
dG9rZW5zLnNsaWNlKCBqICkpICksCisgICAgICAgICAgICAgICAgICAgIGogPCBsZW4gJiYgdG9T
ZWxlY3RvciggdG9rZW5zICkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgbWF0Y2hlcnMucHVzaCggbWF0Y2hlciApOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRj
aGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7Cisg
ICAgdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKKyAgICAgICAgYnlFbGVtZW50
ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsCisgICAgICAgIHN1cGVyTWF0Y2hlciA9IGZ1
bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgIHZhciBlbGVtLCBqLCBtYXRjaGVyLAorICAgICAgICAgICAgICAgIG1hdGNoZWRDb3Vu
dCA9IDAsCisgICAgICAgICAgICAgICAgaSA9ICIwIiwKKyAgICAgICAgICAgICAgICB1bm1hdGNo
ZWQgPSBzZWVkICYmIFtdLAorICAgICAgICAgICAgICAgIHNldE1hdGNoZWQgPSBbXSwKKyAgICAg
ICAgICAgICAgICBjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAgICAgICAg
ICAgICAvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVy
bW9zdCBjb250ZXh0CisgICAgICAgICAgICAgICAgZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAm
JiBFeHByLmZpbmRbIlRBRyJdKCAiKiIsIG91dGVybW9zdCApLAorICAgICAgICAgICAgICAgIC8v
IFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisg
ICAgICAgICAgICAgICAgZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAg
PT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCisgICAgICAgICAgICAgICAgbGVu
ID0gZWxlbXMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgICAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29u
dGV4dCB8fCBvdXRlcm1vc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBl
bGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzCisgICAg
ICAgICAgICAvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmkKKyAgICAgICAgICAgIC8vIFRvbGVyYXRl
IE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0
Y2hpbmcgZWxlbWVudHMgYnkgaWQKKyAgICAgICAgICAgIGZvciAoIDsgaSAhPT0gbGVuICYmIChl
bGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJ5
RWxlbWVudCAmJiBlbGVtICkgeworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3Vt
ZW50ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0RG9jdW1lbnQoIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHhtbCA9ICFkb2N1bWVudElzSFRNTDsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVu
dE1hdGNoZXJzW2orK10pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRjaGVy
KCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlc3VsdHMucHVzaCggZWxlbSApOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggb3V0ZXJtb3N0ICkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcmFjayB1bm1hdGNo
ZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzCisgICAgICAgICAgICAgICAgaWYgKCBieVNldCAp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFs
bCBwb3NzaWJsZSBtYXRjaGVycworICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gIW1h
dGNoZXIgJiYgZWxlbSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkQ291bnQt
LTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIExlbmd0
aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3QKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCBzZWVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXRj
aGVkLnB1c2goIGVsZW0gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYGlgIGlzIG5vdyB0aGUgY291bnQg
b2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50
YAorICAgICAgICAgICAgLy8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS4KKyAgICAgICAg
ICAgIG1hdGNoZWRDb3VudCArPSBpOworCisgICAgICAgICAgICAvLyBBcHBseSBzZXQgZmlsdGVy
cyB0byB1bm1hdGNoZWQgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgY2FuIGJl
IHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNo
ZWRDb3VudGAKKyAgICAgICAgICAgIC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZp
c2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQorICAg
ICAgICAgICAgLy8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC4KKyAgICAgICAgICAg
IC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nICIwIiBgaWAgYWxsb3dzIGBpYCB0
byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0CisgICAgICAgICAgICAvLyBjYXNlLCB3aGlj
aCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20g
YGlgIGJ1dCBpcyBhbHNvCisgICAgICAgICAgICAvLyBudW1lcmljYWxseSB6ZXJvLgorICAgICAg
ICAgICAgaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7CisgICAgICAgICAgICAg
ICAgaiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJz
W2orK10pICkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1h
dGNoZWQsIGNvbnRleHQsIHhtbCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmICggc2VlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVpbnRlZ3JhdGUgZWxl
bWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZworICAgICAgICAg
ICAgICAgICAgICBpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEo
dW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGluZGV4IHBs
YWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcworICAgICAgICAgICAg
ICAgICAgICBzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzCisgICAg
ICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOworCisgICAgICAg
ICAgICAgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNj
ZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCisgICAgICAgICAgICAgICAgaWYgKCBv
dXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCisgICAgICAgICAg
ICAgICAgICAgICggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewor
CisgICAgICAgICAgICAgICAgICAgIFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPdmVycmlkZSBt
YW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKKyAgICAgICAgICAgIGlm
ICggb3V0ZXJtb3N0ICkgeworICAgICAgICAgICAgICAgIGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVl
OworICAgICAgICAgICAgICAgIG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdW5tYXRjaGVkOworICAgICAgICB9Owor
CisgICAgcmV0dXJuIGJ5U2V0ID8KKyAgICAgICAgbWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIg
KSA6CisgICAgICAgIHN1cGVyTWF0Y2hlcjsKK30KKworY29tcGlsZSA9IFNpenpsZS5jb21waWxl
ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsK
KyAgICB2YXIgaSwKKyAgICAgICAgc2V0TWF0Y2hlcnMgPSBbXSwKKyAgICAgICAgZWxlbWVudE1h
dGNoZXJzID0gW10sCisgICAgICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsg
IiAiIF07CisKKyAgICBpZiAoICFjYWNoZWQgKSB7CisgICAgICAgIC8vIEdlbmVyYXRlIGEgZnVu
Y3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVh
Y2ggZWxlbWVudAorICAgICAgICBpZiAoICFtYXRjaCApIHsKKyAgICAgICAgICAgIG1hdGNoID0g
dG9rZW5pemUoIHNlbGVjdG9yICk7CisgICAgICAgIH0KKyAgICAgICAgaSA9IG1hdGNoLmxlbmd0
aDsKKyAgICAgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgICAgICAgICBjYWNoZWQgPSBtYXRjaGVy
RnJvbVRva2VucyggbWF0Y2hbaV0gKTsKKyAgICAgICAgICAgIGlmICggY2FjaGVkWyBleHBhbmRv
IF0gKSB7CisgICAgICAgICAgICAgICAgc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVsZW1lbnRNYXRjaGVycy5wdXNoKCBj
YWNoZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENhY2hlIHRo
ZSBjb21waWxlZCBmdW5jdGlvbgorICAgICAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxl
Y3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNo
ZXJzICkgKTsKKworICAgICAgICAvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb24KKyAg
ICAgICAgY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgfQorICAgIHJldHVybiBjYWNo
ZWQ7Cit9OworCisvKioKKyAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdv
cmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKKyAqICBzZWxlY3RvciBmdW5jdGlvbnMKKyAqIEBw
YXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBp
bGVkCisgKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQorICog
QHBhcmFtIHtFbGVtZW50fSBjb250ZXh0CisgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c10KKyAq
IEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0
CisgKi8KK3NlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRl
eHQsIHJlc3VsdHMsIHNlZWQgKSB7CisgICAgdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZp
bmQsCisgICAgICAgIGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICYm
IHNlbGVjdG9yLAorICAgICAgICBtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3Ig
PSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTsKKworICAgIHJlc3VsdHMgPSByZXN1
bHRzIHx8IFtdOworCisgICAgLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUg
aXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKKyAgICAvLyAodGhl
IGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpCisgICAgaWYgKCBtYXRjaC5s
ZW5ndGggPT09IDEgKSB7CisKKyAgICAgICAgLy8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRp
bmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSUQKKyAgICAgICAgdG9rZW5zID0gbWF0Y2hbMF0g
PSBtYXRjaFswXS5zbGljZSggMCApOworICAgICAgICBpZiAoIHRva2Vucy5sZW5ndGggPiAyICYm
ICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgorICAgICAgICAgICAgICAgIHN1
cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1M
ICYmCisgICAgICAgICAgICAgICAgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsK
KworICAgICAgICAgICAgY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVz
WzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsK
KyAgICAgICAgICAgIGlmICggIWNvbnRleHQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisKKyAgICAgICAgICAgIC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwg
dmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIGNvbXBpbGVkICkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnBhcmVu
dE5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iu
c2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZworICAgICAg
ICBpID0gbWF0Y2hFeHByWyJuZWVkc0NvbnRleHQiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRv
a2Vucy5sZW5ndGg7CisgICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgdG9rZW4g
PSB0b2tlbnNbaV07CisKKyAgICAgICAgICAgIC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0
b3IKKyAgICAgICAgICAgIGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBd
ICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKKyAgICAgICAgICAgICAgICAvLyBT
ZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMK
KyAgICAgICAgICAgICAgICBpZiAoIChzZWVkID0gZmluZCgKKyAgICAgICAgICAgICAgICAgICAg
dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAorICAgICAg
ICAgICAgICAgICAgICByc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250
ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CisgICAgICAgICAgICAgICAgKSkg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tl
bnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5CisgICAgICAgICAgICAgICAgICAgIHRva2Vu
cy5zcGxpY2UoIGksIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWVkLmxl
bmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAh
c2VsZWN0b3IgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRz
LCBzZWVkICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbXBp
bGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRl
ZAorICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBt
b2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKyAgICAoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNl
bGVjdG9yLCBtYXRjaCApICkoCisgICAgICAgIHNlZWQsCisgICAgICAgIGNvbnRleHQsCisgICAg
ICAgICFkb2N1bWVudElzSFRNTCwKKyAgICAgICAgcmVzdWx0cywKKyAgICAgICAgIWNvbnRleHQg
fHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJl
bnROb2RlICkgfHwgY29udGV4dAorICAgICk7CisgICAgcmV0dXJuIHJlc3VsdHM7Cit9OworCisv
LyBPbmUtdGltZSBhc3NpZ25tZW50cworCisvLyBTb3J0IHN0YWJpbGl0eQorc3VwcG9ydC5zb3J0
U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09
IGV4cGFuZG87CisKKy8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNSsKKy8vIEFsd2F5cyBhc3N1bWUg
ZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rp
b24KK3N1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlOworCisvLyBJbml0
aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKK3NldERvY3VtZW50KCk7CisKKy8v
IFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBp
biBDaHJvbWUgMjcpCisvLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFj
aCBvdGhlcioKK3N1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkg
eworICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKQorICAg
IHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJkaXYiKSApICYgMTsKK30pOworCisvLyBTdXBwb3J0OiBJRTw4CisvLyBQcmV2ZW50IGF0
dHJpYnV0ZS9wcm9wZXJ0eSAiaW50ZXJwb2xhdGlvbiIKKy8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHgKK2lmICggIWFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgeworICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9h
PiI7CisgICAgcmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAi
IyIgOworfSkgKSB7CisgICAgYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1
bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKKyAgICAgICAgaWYgKCAhaXNYTUwgKSB7Cisg
ICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCisvLyBT
dXBwb3J0OiBJRTw5CisvLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0
ZSgidmFsdWUiKQoraWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24o
IGRpdiApIHsKKyAgICBkaXYuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKKyAgICBkaXYuZmlyc3RD
aGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIiICk7CisgICAgcmV0dXJuIGRpdi5maXJzdENo
aWxkLmdldEF0dHJpYnV0ZSggInZhbHVlIiApID09PSAiIjsKK30pICkgeworICAgIGFkZEhhbmRs
ZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgeworICAgICAgICBpZiAo
ICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgKSB7Cisg
ICAgICAgICAgICByZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9KTsK
K30KKworLy8gU3VwcG9ydDogSUU8OQorLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2gg
Ym9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllcworaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBk
aXYgKSB7CisgICAgcmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsK
K30pICkgeworICAgIGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBp
c1hNTCApIHsKKyAgICAgICAgdmFyIHZhbDsKKyAgICAgICAgaWYgKCAhaXNYTUwgKSB7CisgICAg
ICAgICAgICByZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgp
IDoKKyAgICAgICAgICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFt
ZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KKyAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
KyAgICAgICAgICAgICAgICBudWxsOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3JldHVybiBT
aXp6bGU7CisKK30pKCB3aW5kb3cgKTsKKworCisKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1
ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOworalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5
LmV4cHIucHNldWRvczsKK2pRdWVyeS51bmlxdWVTb3J0ID0galF1ZXJ5LnVuaXF1ZSA9IFNpenps
ZS51bmlxdWVTb3J0OworalF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDsKK2pRdWVyeS5pc1hN
TERvYyA9IFNpenpsZS5pc1hNTDsKK2pRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsK
KworCisKK3ZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKKyAgICB2YXIg
bWF0Y2hlZCA9IFtdLAorICAgICAgICB0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CisK
KyAgICB3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0g
OSApIHsKKyAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAg
aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoZWQucHVzaCgg
ZWxlbSApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXRjaGVkOworfTsKKworCit2
YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHsKKyAgICB2YXIgbWF0Y2hlZCA9IFtd
OworCisgICAgZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHsKKyAgICAgICAgaWYgKCBu
Lm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CisgICAgICAgICAgICBtYXRjaGVkLnB1
c2goIG4gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXRjaGVkOworfTsKKwor
Cit2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKKwor
dmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbXHctXSspXHMqXC8/Pig/OjxcL1wxPnwpJC8gKTsKKwor
CisKK3ZhciByaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOworCisvLyBJbXBsZW1lbnQgdGhl
IGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdAorZnVuY3Rpb24gd2lu
bm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7CisgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggcXVhbGlmaWVyICkgKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVu
dHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworICAgICAgICAgICAgLyoganNoaW50IC1XMDE4ICov
CisgICAgICAgICAgICByZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9
PSBub3Q7CisgICAgICAgIH0gKTsKKworICAgIH0KKworICAgIGlmICggcXVhbGlmaWVyLm5vZGVU
eXBlICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbigg
ZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBu
b3Q7CisgICAgICAgIH0gKTsKKworICAgIH0KKworICAgIGlmICggdHlwZW9mIHF1YWxpZmllciA9
PT0gInN0cmluZyIgKSB7CisgICAgICAgIGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciAp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVu
dHMsIG5vdCApOworICAgICAgICB9CisKKyAgICAgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRl
ciggcXVhbGlmaWVyLCBlbGVtZW50cyApOworICAgIH0KKworICAgIHJldHVybiBqUXVlcnkuZ3Jl
cCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gKCBpbmRleE9m
LmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90OworICAgIH0gKTsKK30KKwor
alF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgeworICAgIHZhciBl
bGVtID0gZWxlbXNbIDAgXTsKKworICAgIGlmICggbm90ICkgeworICAgICAgICBleHByID0gIjpu
b3QoIiArIGV4cHIgKyAiKSI7CisgICAgfQorCisgICAgcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0g
MSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID8KKyAgICAgICAgalF1ZXJ5LmZpbmQubWF0Y2hlc1Nl
bGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDoKKyAgICAgICAgalF1ZXJ5LmZp
bmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICAgICAgICAgIHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworICAgICAgICB9ICkgKTsK
K307CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3Ig
KSB7CisgICAgICAgIHZhciBpLAorICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGgsCisgICAg
ICAgICAgICByZXQgPSBbXSwKKyAgICAgICAgICAgIHNlbGYgPSB0aGlzOworCisgICAgICAgIGlm
ICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICkgKTsKKyAgICAgICAgfQorCisgICAg
ICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICBqUXVlcnkuZmlu
ZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBO
ZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCAp
LmZpbmQoIHNlbGVjdG9yICkKKyAgICAgICAgcmV0ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEg
PyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApOworICAgICAgICByZXQuc2VsZWN0b3IgPSB0
aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArICIgIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7
CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNl
bGVjdG9yIHx8IFtdLCBmYWxzZSApICk7CisgICAgfSwKKyAgICBub3Q6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNl
bGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKKyAgICB9LAorICAgIGlzOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7CisgICAgICAgIHJldHVybiAhIXdpbm5vdygKKyAgICAgICAgICAgIHRoaXMsCisKKyAg
ICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBj
aGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKKyAgICAgICAgICAgIC8vIHNvICQo
InA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGgg
dHdvICJwIi4KKyAgICAgICAgICAgIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgJiYgcm5l
ZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8KKyAgICAgICAgICAgICAgICBqUXVlcnkoIHNl
bGVjdG9yICkgOgorICAgICAgICAgICAgICAgIHNlbGVjdG9yIHx8IFtdLAorICAgICAgICAgICAg
ZmFsc2UKKyAgICAgICAgKS5sZW5ndGg7CisgICAgfQorfSApOworCisKKy8vIEluaXRpYWxpemUg
YSBqUXVlcnkgb2JqZWN0CisKKworLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBq
UXVlcnkoZG9jdW1lbnQpCit2YXIgcm9vdGpRdWVyeSwKKworICAgIC8vIEEgc2ltcGxlIHdheSB0
byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCisgICAgLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFn
PiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQorICAgIC8vIFN0cmljdCBI
VE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQorICAgIHJxdWlja0V4
cHIgPSAvXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAorCisgICAgaW5pdCA9
IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkgewor
ICAgICAgICB2YXIgbWF0Y2gsIGVsZW07CisKKyAgICAgICAgLy8gSEFORExFOiAkKCIiKSwgJChu
dWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKQorICAgICAgICBpZiAoICFzZWxlY3RvciApIHsK
KyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWV0aG9k
IGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CisgICAgICAgIC8vIHNvIG1p
Z3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSkKKyAgICAgICAgcm9vdCA9IHJv
b3QgfHwgcm9vdGpRdWVyeTsKKworICAgICAgICAvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisgICAg
ICAgIGlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIGlm
ICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCisgICAgICAgICAgICAgICAgc2VsZWN0b3JbIHNl
bGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gIj4iICYmCisgICAgICAgICAgICAgICAgc2VsZWN0b3Iu
bGVuZ3RoID49IDMgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdz
IHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBj
aGVjaworICAgICAgICAgICAgICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOwor
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hdGNoID0gcnF1aWNrRXhw
ci5leGVjKCBzZWxlY3RvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXRj
aCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCisgICAg
ICAgICAgICBpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgeworCisg
ICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisgICAgICAgICAg
ICAgICAgaWYgKCBtYXRjaFsgMSBdICkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0g
Y29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7CisKKyAg
ICAgICAgICAgICAgICAgICAgLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJh
Y2stY29tcGF0CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBl
cnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50CisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTCgKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1hdGNoWyAxIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0
ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6
IGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgICAg
ICAgICApICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKGh0bWwsIHByb3Bz
KQorICAgICAgICAgICAgICAgICAgICBpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSAp
ICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBp
ZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzRnVu
Y3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlcworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICAgICAgICAgIC8vIEhBTkRMRTogJCgjaWQpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsg
MiBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjYK
KyAgICAgICAgICAgICAgICAgICAgLy8gZ0VCSUQgcmV0dXJucyBub2RlcyBubyBsb25nZXIgaW4g
dGhlIGRvY3VtZW50ICgjNjk2MykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtICYmIGVs
ZW0ucGFyZW50Tm9kZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IHRo
ZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNb
IDAgXSA9IGVsZW07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICB0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxl
Y3RvciA9IHNlbGVjdG9yOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCisg
ICAgICAgICAgICB9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gKCBjb250ZXh0IHx8IHJvb3QgKS5maW5kKCBzZWxlY3RvciAp
OworCisgICAgICAgICAgICAvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKKyAgICAgICAgICAg
IC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1
Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgLy8gSEFORExFOiAkKERPTUVsZW1lbnQpCisgICAgICAgIH0gZWxzZSBpZiAoIHNlbGVjdG9y
Lm5vZGVUeXBlICkgeworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpc1sgMCBdID0gc2Vs
ZWN0b3I7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDE7CisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICAvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisgICAgICAgIC8vIFNob3J0
Y3V0IGZvciBkb2N1bWVudCByZWFkeQorICAgICAgICB9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggc2VsZWN0b3IgKSApIHsKKyAgICAgICAgICAgIHJldHVybiByb290LnJlYWR5ICE9PSB1
bmRlZmluZWQgPworICAgICAgICAgICAgICAgIHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgorCisg
ICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJl
c2VudAorICAgICAgICAgICAgICAgIHNlbGVjdG9yKCBqUXVlcnkgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAg
ICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMu
Y29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
alF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAgICB9OworCisvLyBHaXZlIHRo
ZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0
aW9uCitpbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworLy8gSW5pdGlhbGl6ZSBjZW50cmFs
IHJlZmVyZW5jZQorcm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTsKKworCit2YXIgcnBh
cmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCisKKyAgICAvLyBN
ZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBm
cm9tIGEgdW5pcXVlIHNldAorICAgIGd1YXJhbnRlZWRVbmlxdWUgPSB7CisgICAgICAgIGNoaWxk
cmVuOiB0cnVlLAorICAgICAgICBjb250ZW50czogdHJ1ZSwKKyAgICAgICAgbmV4dDogdHJ1ZSwK
KyAgICAgICAgcHJldjogdHJ1ZQorICAgIH07CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBo
YXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CisgICAgICAgIHZhciB0YXJnZXRzID0galF1ZXJ5KCB0
YXJnZXQsIHRoaXMgKSwKKyAgICAgICAgICAgIGwgPSB0YXJnZXRzLmxlbmd0aDsKKworICAgICAg
ICByZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGkgPSAw
OworICAgICAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlm
ICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9ICk7CisgICAgfSwKKworICAgIGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMs
IGNvbnRleHQgKSB7CisgICAgICAgIHZhciBjdXIsCisgICAgICAgICAgICBpID0gMCwKKyAgICAg
ICAgICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAgICAgICAgICAgIG1hdGNoZWQgPSBbXSwKKyAgICAg
ICAgICAgIHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNl
bGVjdG9ycyAhPT0gInN0cmluZyIgPworICAgICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3Jz
LCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoKKyAgICAgICAgICAgICAgICAwOworCisgICAg
ICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKKyAgICAgICAgICAgIGZvciAoIGN1ciA9IHRoaXNb
IGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CisK
KyAgICAgICAgICAgICAgICAvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHMKKyAgICAg
ICAgICAgICAgICBpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmICggcG9zID8KKyAgICAgICAgICAg
ICAgICAgICAgcG9zLmluZGV4KCBjdXIgKSA+IC0xIDoKKworICAgICAgICAgICAgICAgICAgICAv
LyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKKyAgICAgICAgICAgICAgICAgICAg
Y3VyLm5vZGVUeXBlID09PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZmlu
ZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICBtYXRjaGVkLnB1c2goIGN1ciApOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVT
b3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7CisgICAgfSwKKworICAgIC8vIERldGVybWluZSB0
aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldAorICAgIGluZGV4OiBmdW5j
dGlvbiggZWxlbSApIHsKKworICAgICAgICAvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGlu
IHBhcmVudAorICAgICAgICBpZiAoICFlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuICggdGhp
c1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgp
Lmxlbmd0aCA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5kZXggaW4gc2VsZWN0b3IK
KyAgICAgICAgaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CisgICAgICAg
IH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1l
bnQKKyAgICAgICAgcmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcywKKworICAgICAgICAgICAgLy8g
SWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2Vk
CisgICAgICAgICAgICBlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW0KKyAgICAgICAgKTsK
KyAgICB9LAorCisgICAgYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisgICAg
ICAgIHJldHVybiB0aGlzLnB1c2hTdGFjaygKKyAgICAgICAgICAgIGpRdWVyeS51bmlxdWVTb3J0
KAorICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxl
Y3RvciwgY29udGV4dCApICkKKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9LAorCisg
ICAgYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgICAgICByZXR1cm4gdGhpcy5h
ZGQoIHNlbGVjdG9yID09IG51bGwgPworICAgICAgICAgICAgdGhpcy5wcmV2T2JqZWN0IDogdGhp
cy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQorICAgICAgICApOworICAgIH0KK30gKTsK
KworZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7CisgICAgd2hpbGUgKCAoIGN1ciA9IGN1
clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQorICAgIHJldHVybiBjdXI7Cit9
CisKK2pRdWVyeS5lYWNoKCB7CisgICAgcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAg
ICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKyAgICAgICAgcmV0dXJuIHBhcmVudCAm
JiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKKyAgICB9LAorICAgIHBh
cmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAicGFy
ZW50Tm9kZSIgKTsKKyAgICB9LAorICAgIHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGks
IHVudGlsICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGls
ICk7CisgICAgfSwKKyAgICBuZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJu
IHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXY6IGZ1bmN0
aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2li
bGluZyIgKTsKKyAgICB9LAorICAgIG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAg
ICByZXR1cm4gZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciICk7CisgICAgfSwKKyAgICBwcmV2QWxs
OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3Vz
U2libGluZyIgKTsKKyAgICB9LAorICAgIG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVu
dGlsICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCAp
OworICAgIH0sCisgICAgcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Cisg
ICAgICAgIHJldHVybiBkaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOworICAg
IH0sCisgICAgc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2li
bGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApOworICAg
IH0sCisgICAgY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2li
bGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApOworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICByZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5
Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CisgICAgfQorfSwgZnVuY3Rpb24oIG5hbWUs
IGZuICkgeworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3Rv
ciApIHsKKyAgICAgICAgdmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwg
KTsKKworICAgICAgICBpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CisgICAg
ICAgICAgICBzZWxlY3RvciA9IHVudGlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBzZWxl
Y3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgbWF0
Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoIHRoaXMubGVuZ3RoID4gMSApIHsKKworICAgICAgICAgICAgLy8gUmVtb3Zl
IGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSAp
IHsKKyAgICAgICAgICAgICAgICBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQg
cHJldi1kZXJpdmF0aXZlcworICAgICAgICAgICAgaWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFt
ZSApICkgeworICAgICAgICAgICAgICAgIG1hdGNoZWQucmV2ZXJzZSgpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7
CisgICAgfTsKK30gKTsKK3ZhciBybm90d2hpdGUgPSAoIC9cUysvZyApOworCisKKworLy8gQ29u
dmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMK
K2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7CisgICAgdmFyIG9iamVjdCA9IHt9
OworICAgIGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVu
Y3Rpb24oIF8sIGZsYWcgKSB7CisgICAgICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKKyAgICB9
ICk7CisgICAgcmV0dXJuIG9iamVjdDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGNhbGxiYWNrIGxp
c3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoKKyAqICBvcHRpb25zOiBhbiBv
cHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2Ug
aG93CisgKiAgICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFk
aXRpb25hbCBvcHRpb24gb2JqZWN0CisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qg
d2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJl
ZCIgbXVsdGlwbGUgdGltZXMuCisgKgorICogUG9zc2libGUgb3B0aW9uczoKKyAqCisgKiAgb25j
ZTogICAgICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZp
cmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKKyAqCisgKiAgbWVtb3J5OiAgICAgICAgIHdpbGwg
a2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sg
YWRkZWQKKyAqICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQg
cmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXplZCIKKyAqICAgICAgICAgICAgICAg
ICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICogIHVuaXF1ZTogICAgICAgICB3aWxs
IGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBp
biB0aGUgbGlzdCkKKyAqCisgKiAgc3RvcE9uRmFsc2U6ICAgIGludGVycnVwdCBjYWxsaW5ncyB3
aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQorICoKKyAqLworalF1ZXJ5LkNhbGxiYWNrcyA9
IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCisgICAgLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3Ry
aW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZAorICAgIC8vICh3ZSBj
aGVjayBpbiBjYWNoZSBmaXJzdCkKKyAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09ICJz
dHJpbmciID8KKyAgICAgICAgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDoKKyAgICAgICAgalF1
ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKKworICAgIHZhciAvLyBGbGFnIHRvIGtub3cgaWYg
bGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCisgICAgICAgIGZpcmluZywKKworICAgICAgICAvLyBM
YXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cworICAgICAgICBtZW1vcnks
CisKKyAgICAgICAgLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKKyAg
ICAgICAgZmlyZWQsCisKKyAgICAgICAgLy8gRmxhZyB0byBwcmV2ZW50IGZpcmluZworICAgICAg
ICBsb2NrZWQsCisKKyAgICAgICAgLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKKyAgICAgICAgbGlz
dCA9IFtdLAorCisgICAgICAgIC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRh
YmxlIGxpc3RzCisgICAgICAgIHF1ZXVlID0gW10sCisKKyAgICAgICAgLy8gSW5kZXggb2YgY3Vy
cmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQp
CisgICAgICAgIGZpcmluZ0luZGV4ID0gLTEsCisKKyAgICAgICAgLy8gRmlyZSBjYWxsYmFja3MK
KyAgICAgICAgZmlyZSA9IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAgICAvLyBFbmZvcmNlIHNp
bmdsZS1maXJpbmcKKyAgICAgICAgICAgIGxvY2tlZCA9IG9wdGlvbnMub25jZTsKKworICAgICAg
ICAgICAgLy8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsCisg
ICAgICAgICAgICAvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGlt
ZSBjaGFuZ2VzCisgICAgICAgICAgICBmaXJlZCA9IGZpcmluZyA9IHRydWU7CisgICAgICAgICAg
ICBmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHsKKyAgICAgICAgICAg
ICAgICBtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpOworICAgICAgICAgICAgICAgIHdoaWxlICggKytm
aXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFJ1
biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uCisgICAgICAgICAgICAg
ICAgICAgIGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9y
eVsgMSBdICkgPT09IGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0
b3BPbkZhbHNlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIGVuZCBh
bmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCisgICAgICAgICAgICAg
ICAgICAgICAgICBmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoOworICAgICAgICAgICAgICAgICAg
ICAgICAgbWVtb3J5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmdldCB0aGUgZGF0YSBp
ZiB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIGlmICggIW9wdGlvbnMubWVtb3J5ICkg
eworICAgICAgICAgICAgICAgIG1lbW9yeSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBmaXJpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2xlYW4gdXAgaWYgd2Un
cmUgZG9uZSBmaXJpbmcgZm9yIGdvb2QKKyAgICAgICAgICAgIGlmICggbG9ja2VkICkgeworCisg
ICAgICAgICAgICAgICAgLy8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3Ig
ZnV0dXJlIGFkZCBjYWxscworICAgICAgICAgICAgICAgIGlmICggbWVtb3J5ICkgeworICAgICAg
ICAgICAgICAgICAgICBsaXN0ID0gW107CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Us
IHRoaXMgb2JqZWN0IGlzIHNwZW50CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAgICAgbGlzdCA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSwKKworICAgICAgICAvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdAorICAgICAg
ICBzZWxmID0geworCisgICAgICAgICAgICAvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rp
b24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgIGlmICggbGlzdCApIHsKKworICAgICAgICAgICAgICAgICAgICAv
LyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVy
IGFkZGluZworICAgICAgICAgICAgICAgICAgICBpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKCBtZW1vcnkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICggZnVuY3Rpb24gYWRkKCBhcmdzICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBf
LCBhcmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggYXJnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW9w
dGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBsaXN0LnB1c2goIGFyZyApOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXJn
ICYmIGFyZy5sZW5ndGggJiYgalF1ZXJ5LnR5cGUoIGFyZyApICE9PSAic3RyaW5nIiApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCggYXJnICk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSApOworICAgICAgICAg
ICAgICAgICAgICB9ICkoIGFyZ3VtZW50cyApOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
bWVtb3J5ICYmICFmaXJpbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlKCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBSZW1vdmUgYSBj
YWxsYmFjayBmcm9tIHRoZSBsaXN0CisgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKCkgewor
ICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcg
KSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4g
LTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnNwbGljZSggaW5kZXgsIDEgKTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZpcmluZ0luZGV4LS07CisgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAv
LyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgorICAgICAgICAgICAg
Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhh
cyBjYWxsYmFja3MgYXR0YWNoZWQuCisgICAgICAgICAgICBoYXM6IGZ1bmN0aW9uKCBmbiApIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gZm4gPworICAgICAgICAgICAgICAgICAgICBqUXVlcnku
aW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDoKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5sZW5n
dGggPiAwOworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBjYWxs
YmFja3MgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgZW1wdHk6IGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgICAgIGlmICggbGlzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA9IFtd
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAg
ICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGQKKyAgICAg
ICAgICAgIC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9ucworICAgICAgICAg
ICAgLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCisgICAgICAgICAgICBkaXNhYmxl
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBsb2NrZWQgPSBxdWV1ZSA9IFtdOworICAg
ICAgICAgICAgICAgIGxpc3QgPSBtZW1vcnkgPSAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkaXNhYmxlZDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgICAgICAgcmV0dXJuICFsaXN0OworICAgICAgICAgICAgfSwKKworICAgICAg
ICAgICAgLy8gRGlzYWJsZSAuZmlyZQorICAgICAgICAgICAgLy8gQWxzbyBkaXNhYmxlIC5hZGQg
dW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdCkKKyAg
ICAgICAgICAgIC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKKyAgICAgICAgICAgIGxv
Y2s6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGxvY2tlZCA9IHF1ZXVlID0gW107Cisg
ICAgICAgICAgICAgICAgaWYgKCAhbWVtb3J5ICkgeworICAgICAgICAgICAgICAgICAgICBsaXN0
ID0gbWVtb3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGxvY2tlZDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgICAgICAgcmV0dXJuICEhbG9ja2VkOworICAgICAgICAgICAgfSwKKworICAg
ICAgICAgICAgLy8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5k
IGFyZ3VtZW50cworICAgICAgICAgICAgZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdz
ICkgeworICAgICAgICAgICAgICAgIGlmICggIWxvY2tlZCApIHsKKyAgICAgICAgICAgICAgICAg
ICAgYXJncyA9IGFyZ3MgfHwgW107CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbIGNvbnRl
eHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07CisgICAgICAgICAgICAgICAg
ICAgIHF1ZXVlLnB1c2goIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhZmlyaW5n
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSgpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAg
ICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRo
IHRoZSBnaXZlbiBhcmd1bWVudHMKKyAgICAgICAgICAgIGZpcmU6IGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgICAgIHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOworICAgICAgICAg
ICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gVG8g
a25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBv
bmNlCisgICAgICAgICAgICBmaXJlZDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0
dXJuICEhZmlyZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICByZXR1cm4gc2Vs
ZjsKK307CisKKworalF1ZXJ5LmV4dGVuZCggeworCisgICAgRGVmZXJyZWQ6IGZ1bmN0aW9uKCBm
dW5jICkgeworICAgICAgICB2YXIgdHVwbGVzID0gWworCisgICAgICAgICAgICAgICAgLy8gYWN0
aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlCisgICAgICAgICAg
ICAgICAgWyAicmVzb2x2ZSIsICJkb25lIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5
IiApLCAicmVzb2x2ZWQiIF0sCisgICAgICAgICAgICAgICAgWyAicmVqZWN0IiwgImZhaWwiLCBq
UXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksICJyZWplY3RlZCIgXSwKKyAgICAgICAg
ICAgICAgICBbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5
IiApIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBzdGF0ZSA9ICJwZW5kaW5nIiwKKyAg
ICAgICAgICAgIHByb21pc2UgPSB7CisgICAgICAgICAgICAgICAgc3RhdGU6IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAgICAgfSwK
KyAgICAgICAgICAgICAgICBhbHdheXM6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAg
ICBkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTsKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
ICAgICB0aGVuOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7
CisgICAgICAgICAgICAgICAgICAgIHZhciBmbnMgPSBhcmd1bWVudHM7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0
dXBsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBqUXVlcnkuaXNG
dW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRp
bmcgYWN0aW9ucyB0byBuZXdEZWZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVy
cmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5
LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybmVkLnByb21pc2UoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSAp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZhaWwoIG5ld0RlZmVy
LnJlamVjdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGVmZXJbIHR1cGxlWyAwIF0gKyAi
V2l0aCIgXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzID09
PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50cworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZucyA9IG51bGw7
CisgICAgICAgICAgICAgICAgICAgIH0gKS5wcm9taXNlKCk7CisgICAgICAgICAgICAgICAgfSwK
KworICAgICAgICAgICAgICAgIC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWQKKyAg
ICAgICAgICAgICAgICAvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBp
cyBhZGRlZCB0byB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgcHJvbWlzZTogZnVuY3Rpb24o
IG9iaiApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5
LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWZlcnJlZCA9IHt9OworCisgICAgICAgIC8vIEtl
ZXAgcGlwZSBmb3IgYmFjay1jb21wYXQKKyAgICAgICAgcHJvbWlzZS5waXBlID0gcHJvbWlzZS50
aGVuOworCisgICAgICAgIC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHMKKyAgICAgICAgalF1
ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworICAgICAgICAgICAgdmFy
IGxpc3QgPSB0dXBsZVsgMiBdLAorICAgICAgICAgICAgICAgIHN0YXRlU3RyaW5nID0gdHVwbGVb
IDMgXTsKKworICAgICAgICAgICAgLy8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBd
ID0gbGlzdC5hZGQKKyAgICAgICAgICAgIHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRk
OworCisgICAgICAgICAgICAvLyBIYW5kbGUgc3RhdGUKKyAgICAgICAgICAgIGlmICggc3RhdGVT
dHJpbmcgKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoIGZ1bmN0aW9uKCkgeworCisgICAg
ICAgICAgICAgICAgICAgIC8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0cmluZzsKKworICAgICAgICAgICAgICAgIC8v
IFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0Lmxv
Y2sKKyAgICAgICAgICAgICAgICB9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBs
ZXNbIDIgXVsgMiBdLmxvY2sgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVm
ZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQorICAgICAgICAgICAgZGVmZXJyZWRb
IHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGRlZmVycmVkWyB0
dXBsZVsgMCBdICsgIldpdGgiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gcHJvbWlzZSA6IHRoaXMs
IGFyZ3VtZW50cyApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAg
fTsKKyAgICAgICAgICAgIGRlZmVycmVkWyB0dXBsZVsgMCBdICsgIldpdGgiIF0gPSBsaXN0LmZp
cmVXaXRoOworICAgICAgICB9ICk7CisKKyAgICAgICAgLy8gTWFrZSB0aGUgZGVmZXJyZWQgYSBw
cm9taXNlCisgICAgICAgIHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTsKKworICAgICAgICAv
LyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55CisgICAgICAgIGlmICggZnVuYyApIHsKKyAgICAgICAg
ICAgIGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBBbGwgZG9uZSEKKyAgICAgICAgcmV0dXJuIGRlZmVycmVkOworICAgIH0sCisKKyAgICAv
LyBEZWZlcnJlZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAu
Li4sIHN1Ym9yZGluYXRlTiAqLyApIHsKKyAgICAgICAgdmFyIGkgPSAwLAorICAgICAgICAgICAg
cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgICAgICAgICAgbGVu
Z3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsCisKKyAgICAgICAgICAgIC8vIHRoZSBjb3VudCBv
ZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IGxlbmd0
aCAhPT0gMSB8fAorICAgICAgICAgICAgICAgICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVu
Y3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKKworICAgICAgICAg
ICAgLy8gdGhlIG1hc3RlciBEZWZlcnJlZC4KKyAgICAgICAgICAgIC8vIElmIHJlc29sdmVWYWx1
ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgorICAg
ICAgICAgICAgZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVy
eS5EZWZlcnJlZCgpLAorCisgICAgICAgICAgICAvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGgg
cmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzCisgICAgICAgICAgICB1cGRhdGVGdW5jID0gZnVu
Y3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dHNbIGkgXSA9IHRo
aXM7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+
IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CisgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0sCisK
KyAgICAgICAgICAgIHByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29u
dGV4dHM7CisKKyAgICAgICAgLy8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0
ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZAorICAgICAgICBpZiAoIGxlbmd0aCA+IDEgKSB7
CisgICAgICAgICAgICBwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CisgICAg
ICAgICAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKyAgICAgICAg
ICAgIHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CisgICAgICAgICAgICBm
b3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlc29sdmVW
YWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21p
c2UgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2Uo
KQorICAgICAgICAgICAgICAgICAgICAgICAgLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9n
cmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICkKKyAgICAgICAgICAgICAgICAgICAgICAg
IC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSAp
CisgICAgICAgICAgICAgICAgICAgICAgICAuZmFpbCggZGVmZXJyZWQucmVqZWN0ICk7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLS1yZW1haW5pbmc7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8g
SWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlcgorICAg
ICAgICBpZiAoICFyZW1haW5pbmcgKSB7CisgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0
aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOworICAgIH0KK30gKTsKKworCisvLyBUaGUgZGVm
ZXJyZWQgdXNlZCBvbiBET00gcmVhZHkKK3ZhciByZWFkeUxpc3Q7CisKK2pRdWVyeS5mbi5yZWFk
eSA9IGZ1bmN0aW9uKCBmbiApIHsKKworICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sKKyAgICBqUXVl
cnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7CisKKyAgICByZXR1cm4gdGhpczsKK307CisK
K2pRdWVyeS5leHRlbmQoIHsKKworICAgIC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8g
U2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCisgICAgaXNSZWFkeTogZmFsc2UsCisKKyAgICAv
LyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisg
ICAgLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEs
CisKKyAgICAvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKKyAgICBob2xkUmVh
ZHk6IGZ1bmN0aW9uKCBob2xkICkgeworICAgICAgICBpZiAoIGhvbGQgKSB7CisgICAgICAgICAg
ICBqUXVlcnkucmVhZHlXYWl0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqUXVl
cnkucmVhZHkoIHRydWUgKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvLyBIYW5kbGUgd2hl
biB0aGUgRE9NIGlzIHJlYWR5CisgICAgcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgeworCisgICAg
ICAgIC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkg
cmVhZHkKKyAgICAgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDog
alF1ZXJ5LmlzUmVhZHkgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICAvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKyAgICAgICAgalF1ZXJ5Lmlz
UmVhZHkgPSB0cnVlOworCisgICAgICAgIC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBm
aXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlCisgICAgICAgIGlmICggd2FpdCAh
PT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwg
dG8gZXhlY3V0ZQorICAgICAgICByZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpR
dWVyeSBdICk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisg
ICAgICAgIGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkgeworICAgICAgICAgICAgalF1
ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCAicmVhZHkiICk7CisgICAgICAgICAgICBq
UXVlcnkoIGRvY3VtZW50ICkub2ZmKCAicmVhZHkiICk7CisgICAgICAgIH0KKyAgICB9Cit9ICk7
CisKKy8qKgorICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRo
b2QKKyAqLworZnVuY3Rpb24gY29tcGxldGVkKCkgeworICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50
TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7CisgICAgd2luZG93LnJl
bW92ZUV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxldGVkICk7CisgICAgalF1ZXJ5LnJlYWR5
KCk7Cit9CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKKyAgICBp
ZiAoICFyZWFkeUxpc3QgKSB7CisKKyAgICAgICAgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVk
KCk7CisKKyAgICAgICAgLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBp
cyBjYWxsZWQKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkg
b2NjdXJyZWQuCisgICAgICAgIC8vIFN1cHBvcnQ6IElFOS0xMCBvbmx5CisgICAgICAgIC8vIE9s
ZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzICJpbnRlcmFjdGl2ZSIgdG9vIHNvb24KKyAgICAgICAg
aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8CisgICAgICAgICAgICAo
IGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICJsb2FkaW5nIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRF
bGVtZW50LmRvU2Nyb2xsICkgKSB7CisKKyAgICAgICAgICAgIC8vIEhhbmRsZSBpdCBhc3luY2hy
b25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQor
ICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOworCisgICAgICAg
IH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sK
KyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVk
IiwgY29tcGxldGVkICk7CisKKyAgICAgICAgICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9u
bG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCisgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRM
aXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApOworfTsKKworLy8gS2ljayBvZmYgdGhlIERPTSBy
ZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90CitqUXVlcnkucmVhZHkucHJvbWlz
ZSgpOworCisKKworCisvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZh
bHVlcyBvZiBhIGNvbGxlY3Rpb24KKy8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4
ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgordmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywg
Zm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9
IDAsCisgICAgICAgIGxlbiA9IGVsZW1zLmxlbmd0aCwKKyAgICAgICAgYnVsayA9IGtleSA9PSBu
dWxsOworCisgICAgLy8gU2V0cyBtYW55IHZhbHVlcworICAgIGlmICggalF1ZXJ5LnR5cGUoIGtl
eSApID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgY2hhaW5hYmxlID0gdHJ1ZTsKKyAgICAgICAg
Zm9yICggaSBpbiBrZXkgKSB7CisgICAgICAgICAgICBhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5
WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKKyAgICAgICAgfQorCisgICAgLy8gU2V0cyBv
bmUgdmFsdWUKKyAgICB9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworICAgICAg
ICBjaGFpbmFibGUgPSB0cnVlOworCisgICAgICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2
YWx1ZSApICkgeworICAgICAgICAgICAgcmF3ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICggYnVsayApIHsKKworICAgICAgICAgICAgLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2Fp
bnN0IHRoZSBlbnRpcmUgc2V0CisgICAgICAgICAgICBpZiAoIHJhdyApIHsKKyAgICAgICAgICAg
ICAgICBmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBmbiA9IG51bGw7
CisKKyAgICAgICAgICAgIC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1
ZXMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVsayA9IGZuOworICAg
ICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApOwor
ICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGZuICkgeworICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgZm4oCisgICAgICAgICAgICAgICAgICAgIGVsZW1zWyBpIF0sIGtleSwgcmF3ID8K
KyAgICAgICAgICAgICAgICAgICAgdmFsdWUgOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZS5j
YWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQorICAgICAgICAgICAg
ICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hh
aW5hYmxlID8KKyAgICAgICAgZWxlbXMgOgorCisgICAgICAgIC8vIEdldHMKKyAgICAgICAgYnVs
ayA/CisgICAgICAgICAgICBmbi5jYWxsKCBlbGVtcyApIDoKKyAgICAgICAgICAgIGxlbiA/IGZu
KCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0OworfTsKK3ZhciBhY2NlcHREYXRhID0gZnVu
Y3Rpb24oIG93bmVyICkgeworCisgICAgLy8gQWNjZXB0cyBvbmx5OgorICAgIC8vICAtIE5vZGUK
KyAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFCisgICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5U
X05PREUKKyAgICAvLyAgLSBPYmplY3QKKyAgICAvLyAgICAtIEFueQorICAgIC8qIGpzaGludCAt
VzAxOCAqLworICAgIHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlw
ZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTsKK307CisKKworCisKK2Z1bmN0aW9uIERh
dGEoKSB7CisgICAgdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwor
fQorCitEYXRhLnVpZCA9IDE7CisKK0RhdGEucHJvdG90eXBlID0geworCisgICAgcmVnaXN0ZXI6
IGZ1bmN0aW9uKCBvd25lciwgaW5pdGlhbCApIHsKKyAgICAgICAgdmFyIHZhbHVlID0gaW5pdGlh
bCB8fCB7fTsKKworICAgICAgICAvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3Ry
aW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyCisgICAgICAgIC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50
CisgICAgICAgIGlmICggb3duZXIubm9kZVR5cGUgKSB7CisgICAgICAgICAgICBvd25lclsgdGhp
cy5leHBhbmRvIF0gPSB2YWx1ZTsKKworICAgICAgICAvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGlu
IGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eQorICAgICAgICAvLyBjb25m
aWd1cmFiaWxpdHkgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQorICAg
ICAgICAvLyBkZWxldGVkIHdpdGggdGhlIGRlbGV0ZSBvcGVyYXRvcgorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRv
LCB7CisgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICAgICAgICAgIHdyaXRh
YmxlOiB0cnVlLAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICAgICAgICAg
ICAgfSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvd25lclsgdGhpcy5leHBhbmRvIF07
CisgICAgfSwKKyAgICBjYWNoZTogZnVuY3Rpb24oIG93bmVyICkgeworCisgICAgICAgIC8vIFdl
IGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJz
LAorICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LgorICAgICAgICAvLyBB
bHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC4KKyAgICAgICAgaWYgKCAhYWNjZXB0RGF0YSgg
b3duZXIgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZQorICAgICAg
ICB2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CisKKyAgICAgICAgLy8gSWYgbm90
LCBjcmVhdGUgb25lCisgICAgICAgIGlmICggIXZhbHVlICkgeworICAgICAgICAgICAgdmFsdWUg
PSB7fTsKKworICAgICAgICAgICAgLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVu
dCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCisgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxk
IG5vdCwgc2VlICM4MzM1LgorICAgICAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBv
YmplY3QuCisgICAgICAgICAgICBpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CisKKyAgICAg
ICAgICAgICAgICAvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVk
IG9yIGxvb3BlZCBvdmVyCisgICAgICAgICAgICAgICAgLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQK
KyAgICAgICAgICAgICAgICBpZiAoIG93bmVyLm5vZGVUeXBlICkgeworICAgICAgICAgICAgICAg
ICAgICBvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTsKKworICAgICAgICAgICAgICAgIC8v
IE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eQorICAgICAg
ICAgICAgICAgIC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3Bl
cnR5IHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3Zl
ZAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywgeworICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxl
OiB0cnVlCisgICAgICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSwKKyAg
ICBzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CisgICAgICAgIHZhciBwcm9w
LAorICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApOworCisgICAgICAgIC8v
IEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3MKKyAgICAgICAgaWYgKCB0eXBlb2Yg
ZGF0YSA9PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBjYWNoZVsgZGF0YSBdID0gdmFsdWU7
CisKKyAgICAgICAgLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKKyAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUt
Ynktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKKyAgICAgICAgICAgIGZvciAoIHByb3AgaW4gZGF0
YSApIHsKKyAgICAgICAgICAgICAgICBjYWNoZVsgcHJvcCBdID0gZGF0YVsgcHJvcCBdOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICB9LAorICAg
IGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CisgICAgICAgIHJldHVybiBrZXkgPT09IHVu
ZGVmaW5lZCA/CisgICAgICAgICAgICB0aGlzLmNhY2hlKCBvd25lciApIDoKKyAgICAgICAgICAg
IG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGtleSBdOwor
ICAgIH0sCisgICAgYWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7CisgICAg
ICAgIHZhciBzdG9yZWQ7CisKKyAgICAgICAgLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgorICAg
ICAgICAvLworICAgICAgICAvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkCisgICAgICAgIC8v
ICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAor
ICAgICAgICAvLworICAgICAgICAvLyBUYWtlIHRoZSAicmVhZCIgcGF0aCBhbmQgYWxsb3cgdGhl
IGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lCisgICAgICAgIC8vIHdoaWNoIHZhbHVlIHRvIHJldHVy
biwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAxLiBUaGUg
ZW50aXJlIGNhY2hlIG9iamVjdAorICAgICAgICAvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0
aGUga2V5CisgICAgICAgIC8vCisgICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwKKyAg
ICAgICAgICAgICAgICAoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFs
dWUgPT09IHVuZGVmaW5lZCApICkgeworCisgICAgICAgICAgICBzdG9yZWQgPSB0aGlzLmdldCgg
b3duZXIsIGtleSApOworCisgICAgICAgICAgICByZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQg
PworICAgICAgICAgICAgICAgIHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVs
Q2FzZSgga2V5ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gdGhlIGtleSBpcyBu
b3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlCisgICAgICAgIC8vIGFyZSBzcGVj
aWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgorICAg
ICAgICAvLworICAgICAgICAvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzCisgICAgICAg
IC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCisgICAgICAgIC8vCisgICAgICAgIHRoaXMuc2V0KCBv
d25lciwga2V5LCB2YWx1ZSApOworCisgICAgICAgIC8vIFNpbmNlIHRoZSAic2V0IiBwYXRoIGNh
biBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHMKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBl
eHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdCisgICAgICAgIHJl
dHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7CisgICAgfSwKKyAgICByZW1v
dmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkgeworICAgICAgICB2YXIgaSwgbmFtZSwgY2FtZWws
CisgICAgICAgICAgICBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKKworICAgICAgICBp
ZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgdGhp
cy5yZWdpc3Rlciggb3duZXIgKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAv
LyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5cworICAgICAg
ICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7CisKKyAgICAgICAgICAgICAgICAv
LyBJZiAibmFtZSIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLgorICAgICAgICAgICAgICAgIC8vIFdo
ZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhICgia2V5IiwgInZhbCIpIHNpZ25hdHVy
ZSwKKyAgICAgICAgICAgICAgICAvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2Fz
ZS4KKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93
XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZQorICAgICAgICAgICAgICAgIC8vIGJvdGggcGxhaW4g
a2V5IGFuZCBjYW1lbENhc2Uga2V5LiAjMTI3ODYKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdp
bGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC4KKyAgICAgICAgICAgICAg
ICBuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbWVsID0galF1ZXJ5LmNhbWVsQ2Fz
ZSgga2V5ICk7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBi
ZWZvcmUgYW55IG1hbmlwdWxhdGlvbgorICAgICAgICAgICAgICAgIGlmICgga2V5IGluIGNhY2hl
ICkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gWyBrZXksIGNhbWVsIF07CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGtleSB3aXRo
IHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuCisgICAgICAgICAgICAgICAgICAgIC8vIE90aGVy
d2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCisgICAgICAg
ICAgICAgICAgICAgIG5hbWUgPSBjYW1lbDsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5h
bWUgaW4gY2FjaGUgPworICAgICAgICAgICAgICAgICAgICAgICAgWyBuYW1lIF0gOiAoIG5hbWUu
bWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpID0gbmFtZS5sZW5ndGg7CisKKyAgICAgICAgICAgIHdoaWxl
ICggaS0tICkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVsgbmFtZVsgaSBdIF07Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZG8g
aWYgdGhlcmUncyBubyBtb3JlIGRhdGEKKyAgICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8
fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKKworICAgICAgICAgICAgLy8gU3Vw
cG9ydDogQ2hyb21lIDw9IDM1LTQ1KworICAgICAgICAgICAgLy8gV2Via2l0ICYgQmxpbmsgcGVy
Zm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8v
IGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWQKKyAgICAgICAgICAg
IC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0z
Nzg2MDcKKyAgICAgICAgICAgIGlmICggb3duZXIubm9kZVR5cGUgKSB7CisgICAgICAgICAgICAg
ICAgb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICBoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIg
KSB7CisgICAgICAgIHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKKyAgICAgICAg
cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNo
ZSApOworICAgIH0KK307Cit2YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpOworCit2YXIgZGF0YVVz
ZXIgPSBuZXcgRGF0YSgpOworCisKKworLy8gIEltcGxlbWVudGF0aW9uIFN1bW1hcnkKKy8vCisv
LyAgMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRo
IDEuOS54IGJyYW5jaAorLy8gIDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0
eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZQorLy8gICAgICBwYXRocyB0byBhIHNpbmdsZSBtZWNo
YW5pc20uCisvLyAgMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAi
cHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgorLy8gIDQuIF9OZXZlcl8gZXhwb3NlICJwcml2YXRl
IiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpCisvLyAg
NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMg
KGVnLiBleHBhbmRvIHByb3BlcnRpZXMpCisvLyAgNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9y
IGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0CisKK3ZhciByYnJhY2Ug
PSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAorICAgIHJtdWx0aURhc2ggPSAvW0Et
Wl0vZzsKKworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAgICB2YXIg
bmFtZTsKKworICAgIC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBm
ZXRjaCBhbnkKKyAgICAvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUKKyAg
ICBpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAg
ICAgICBuYW1lID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQmIiApLnRv
TG93ZXJDYXNlKCk7CisgICAgICAgIGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwor
CisgICAgICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAg
dHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSA9PT0gInRydWUiID8gdHJ1ZSA6Cisg
ICAgICAgICAgICAgICAgICAgIGRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisgICAgICAgICAg
ICAgICAgICAgIGRhdGEgPT09ICJudWxsIiA/IG51bGwgOgorCisgICAgICAgICAgICAgICAgICAg
IC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3Ry
aW5nCisgICAgICAgICAgICAgICAgICAgICtkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6Cisg
ICAgICAgICAgICAgICAgICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09O
KCBkYXRhICkgOgorICAgICAgICAgICAgICAgICAgICBkYXRhOworICAgICAgICAgICAgfSBjYXRj
aCAoIGUgKSB7fQorCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNv
IGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKKyAgICAgICAgICAgIGRhdGFVc2VyLnNldCggZWxlbSwg
a2V5LCBkYXRhICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gdW5kZWZp
bmVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkYXRhOworfQorCitqUXVlcnkuZXh0
ZW5kKCB7CisgICAgaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgIHJldHVybiBk
YXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApOworICAg
IH0sCisKKyAgICBkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKKyAgICAgICAg
cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOworICAgIH0sCisKKyAg
ICByZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAgICAgZGF0YVVzZXIu
cmVtb3ZlKCBlbGVtLCBuYW1lICk7CisgICAgfSwKKworICAgIC8vIFRPRE86IE5vdyB0aGF0IGFs
bCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkCisgICAg
Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRl
cHJlY2F0ZWQuCisgICAgX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAg
ICAgICByZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7CisgICAgfSwK
KworICAgIF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAgICAgZGF0
YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisgICAgfQorfSApOworCitqUXVlcnkuZm4uZXh0
ZW5kKCB7CisgICAgZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CisgICAgICAgIHZhciBp
LCBuYW1lLCBkYXRhLAorICAgICAgICAgICAgZWxlbSA9IHRoaXNbIDAgXSwKKyAgICAgICAgICAg
IGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7CisKKyAgICAgICAgLy8gR2V0cyBhbGwg
dmFsdWVzCisgICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICBp
ZiAoIHRoaXMubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhVXNlci5nZXQo
IGVsZW0gKTsKKworICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAh
ZGF0YVByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiApICkgeworICAgICAgICAgICAgICAg
ICAgICBpID0gYXR0cnMubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUUxMSsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0
KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhdHRyc1sgaSBdICkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5h
bWUuc2xpY2UoIDUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXR0
ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIGRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRy
dWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0cyBtdWx0aXBsZSB2YWx1ZXMK
KyAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGRhdGFVc2VyLnNl
dCggdGhpcywga2V5ICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIg
ZGF0YSwgY2FtZWxLZXk7CisKKyAgICAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmpl
Y3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CisgICAgICAgICAgICAvLyAoYW5kIHRo
ZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZQorICAg
ICAgICAgICAgLy8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5
IGpRdWVyeSBvYmplY3QKKyAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRg
IGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKKyAgICAgICAgICAgIC8vIHRocm93IGFu
IGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuCisg
ICAgICAgICAgICBpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAg
ICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKyAgICAgICAg
ICAgICAgICAvLyB3aXRoIHRoZSBrZXkgYXMtaXMKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0
YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKSB8fAorCisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0
byBmaW5kIGRhc2hlZCBrZXkgaWYgaXQgZXhpc3RzIChnaC0yNzc5KQorICAgICAgICAgICAgICAg
ICAgICAvLyBUaGlzIGlzIGZvciAyLjIueCBvbmx5CisgICAgICAgICAgICAgICAgICAgIGRhdGFV
c2VyLmdldCggZWxlbSwga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNh
c2UoKSApOworCisgICAgICAgICAgICAgICAgaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7CisKKyAgICAg
ICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCisgICAgICAg
ICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAorICAgICAgICAgICAgICAgIGRhdGEg
PSBkYXRhVXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7CisgICAgICAgICAgICAgICAgaWYgKCBk
YXRhICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gImRpc2Nv
dmVyIiB0aGUgZGF0YSBpbgorICAgICAgICAgICAgICAgIC8vIEhUTUw1IGN1c3RvbSBkYXRhLSog
YXR0cnMKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1
bmRlZmluZWQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vz
bid0IGV4aXN0LgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gU2V0IHRoZSBkYXRhLi4uCisgICAgICAgICAgICBjYW1lbEtleSA9IGpRdWVy
eS5jYW1lbENhc2UoIGtleSApOworICAgICAgICAgICAgdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsK
KworICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciBy
ZWZlcmVuY2Ugb2YgYW55CisgICAgICAgICAgICAgICAgLy8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJl
ZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5LgorICAgICAgICAgICAgICAgIHZhciBkYXRh
ID0gZGF0YVVzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApOworCisgICAgICAgICAgICAgICAgLy8g
Rm9yIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUgaW50ZXJvcCwgd2UgaGF2ZSB0bworICAgICAgICAg
ICAgICAgIC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNl
IGZvcm0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHBy
b3BlcnRpZXMuLi4qCisgICAgICAgICAgICAgICAgZGF0YVVzZXIuc2V0KCB0aGlzLCBjYW1lbEtl
eSwgdmFsdWUgKTsKKworICAgICAgICAgICAgICAgIC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJv
cGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV8KKyAgICAgICAgICAgICAgICAvLyBoYXZlIGRh
c2hlcywgd2UgbmVlZCB0byBhbHNvIHN0b3JlIGEgY29weSBvZiB0aGF0CisgICAgICAgICAgICAg
ICAgLy8gdW5jaGFuZ2VkIHByb3BlcnR5LgorICAgICAgICAgICAgICAgIGlmICgga2V5LmluZGV4
T2YoICItIiApID4gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAg
ICAgICBkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVu
Z3RoID4gMSwgbnVsbCwgdHJ1ZSApOworICAgIH0sCisKKyAgICByZW1vdmVEYXRhOiBmdW5jdGlv
bigga2V5ICkgeworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7CisgICAgICAgIH0gKTsKKyAgICB9
Cit9ICk7CisKKworalF1ZXJ5LmV4dGVuZCggeworICAgIHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwg
dHlwZSwgZGF0YSApIHsKKyAgICAgICAgdmFyIHF1ZXVlOworCisgICAgICAgIGlmICggZWxlbSAp
IHsKKyAgICAgICAgICAgIHR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsgInF1ZXVlIjsKKyAgICAg
ICAgICAgIHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7CisKKyAgICAgICAgICAg
IC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1
c3QgYSBsb29rdXAKKyAgICAgICAgICAgIGlmICggZGF0YSApIHsKKyAgICAgICAgICAgICAgICBp
ZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSggZGF0YSApICkgeworICAgICAgICAgICAgICAg
ICAgICBxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJh
eSggZGF0YSApICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgcXVldWUucHVzaCggZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHJldHVybiBxdWV1ZSB8fCBbXTsKKyAgICAgICAgfQorICAgIH0sCisKKyAg
ICBkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKyAgICAgICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKKworICAgICAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUg
KSwKKyAgICAgICAgICAgIHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAorICAgICAgICAgICAg
Zm4gPSBxdWV1ZS5zaGlmdCgpLAorICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9v
a3MoIGVsZW0sIHR5cGUgKSwKKyAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOworICAgICAgICAgICAgfTsK
KworICAgICAgICAvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUg
dGhlIHByb2dyZXNzIHNlbnRpbmVsCisgICAgICAgIGlmICggZm4gPT09ICJpbnByb2dyZXNzIiAp
IHsKKyAgICAgICAgICAgIGZuID0gcXVldWUuc2hpZnQoKTsKKyAgICAgICAgICAgIHN0YXJ0TGVu
Z3RoLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGZuICkgeworCisgICAgICAgICAgICAv
LyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJl
aW5nCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisgICAgICAgICAgICBp
ZiAoIHR5cGUgPT09ICJmeCIgKSB7CisgICAgICAgICAgICAgICAgcXVldWUudW5zaGlmdCggImlu
cHJvZ3Jlc3MiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENsZWFyIHVwIHRo
ZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KKyAgICAgICAgICAgIGRlbGV0ZSBob29rcy5zdG9w
OworICAgICAgICAgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgeworICAgICAgICAgICAgaG9v
a3MuZW1wdHkuZmlyZSgpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8vIE5vdCBwdWJsaWMg
LSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25l
CisgICAgX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgeworICAgICAgICB2YXIg
a2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKKyAgICAgICAgcmV0dXJuIGRhdGFQcml2LmdldCgg
ZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHsKKyAgICAgICAgICAg
IGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICkuYWRkKCBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1
ZSIsIGtleSBdICk7CisgICAgICAgICAgICB9ICkKKyAgICAgICAgfSApOworICAgIH0KK30gKTsK
KworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSAp
IHsKKyAgICAgICAgdmFyIHNldHRlciA9IDI7CisKKyAgICAgICAgaWYgKCB0eXBlb2YgdHlwZSAh
PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBkYXRhID0gdHlwZTsKKyAgICAgICAgICAgIHR5
cGUgPSAiZngiOworICAgICAgICAgICAgc2V0dGVyLS07CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7CisgICAgICAgICAgICByZXR1cm4galF1
ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVy
biBkYXRhID09PSB1bmRlZmluZWQgPworICAgICAgICAgICAgdGhpcyA6CisgICAgICAgICAgICB0
aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IGpRdWVy
eS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOworCisgICAgICAgICAgICAgICAgLy8gRW5zdXJl
IGEgaG9va3MgZm9yIHRoaXMgcXVldWUKKyAgICAgICAgICAgICAgICBqUXVlcnkuX3F1ZXVlSG9v
a3MoIHRoaXMsIHR5cGUgKTsKKworICAgICAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ4IiAm
JiBxdWV1ZVsgMCBdICE9PSAiaW5wcm9ncmVzcyIgKSB7CisgICAgICAgICAgICAgICAgICAgIGpR
dWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSApOworICAgIH0sCisgICAgZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAg
IHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgalF1ZXJ5LmRlcXVl
dWUoIHRoaXMsIHR5cGUgKTsKKyAgICAgICAgfSApOworICAgIH0sCisgICAgY2xlYXJRdWV1ZTog
ZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJm
eCIsIFtdICk7CisgICAgfSwKKworICAgIC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBx
dWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKKyAgICAvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5
cGUgYnkgZGVmYXVsdCkKKyAgICBwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkgeworICAg
ICAgICB2YXIgdG1wLAorICAgICAgICAgICAgY291bnQgPSAxLAorICAgICAgICAgICAgZGVmZXIg
PSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcywKKyAgICAg
ICAgICAgIGkgPSB0aGlzLmxlbmd0aCwKKyAgICAgICAgICAgIHJlc29sdmUgPSBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICBpZiAoICEoIC0tY291bnQgKSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIGlmICggdHlwZW9mIHR5cGUg
IT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgb2JqID0gdHlwZTsKKyAgICAgICAgICAgIHR5
cGUgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKyAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsK
KworICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgIHRtcCA9IGRhdGFQcml2Lmdl
dCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOworICAgICAgICAgICAgaWYg
KCB0bXAgJiYgdG1wLmVtcHR5ICkgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAg
ICAgICAgICAgdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIHJlc29sdmUoKTsKKyAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2UoIG9i
aiApOworICAgIH0KK30gKTsKK3ZhciBwbnVtID0gKCAvWystXT8oPzpcZCpcLnwpXGQrKD86W2VF
XVsrLV0/XGQrfCkvICkuc291cmNlOworCit2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86
KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CisKKwordmFyIGNzc0V4
cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKKwordmFyIGlzSGlk
ZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkgeworCisgICAgICAgIC8vIGlzSGlkZGVuIG1pZ2h0
IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247CisgICAgICAgIC8vIGluIHRo
YXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAorICAgICAgICBlbGVtID0g
ZWwgfHwgZWxlbTsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiAp
ID09PSAibm9uZSIgfHwKKyAgICAgICAgICAgICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJE
b2N1bWVudCwgZWxlbSApOworICAgIH07CisKKworCitmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0s
IHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgeworICAgIHZhciBhZGp1c3RlZCwKKyAgICAgICAg
c2NhbGUgPSAxLAorICAgICAgICBtYXhJdGVyYXRpb25zID0gMjAsCisgICAgICAgIGN1cnJlbnRW
YWx1ZSA9IHR3ZWVuID8KKyAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHdlZW4uY3Vy
KCk7IH0gOgorICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBqUXVlcnkuY3NzKCBlbGVt
LCBwcm9wLCAiIiApOyB9LAorICAgICAgICBpbml0aWFsID0gY3VycmVudFZhbHVlKCksCisgICAg
ICAgIHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NO
dW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAorCisgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVl
IGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCisg
ICAgICAgIGluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0
ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKKyAgICAgICAgICAgIHJjc3NOdW0uZXhlYyggalF1
ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7CisKKyAgICBpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5p
dGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgeworCisgICAgICAgIC8vIFRydXN0IHVuaXRzIHJl
cG9ydGVkIGJ5IGpRdWVyeS5jc3MKKyAgICAgICAgdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5p
dFsgMyBdOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3Bl
cnRpZXMgbGF0ZXIgb24KKyAgICAgICAgdmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107CisK
KyAgICAgICAgLy8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRp
bmcgcG9pbnQKKyAgICAgICAgaW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7CisKKyAgICAg
ICAgZG8geworCisgICAgICAgICAgICAvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91
dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi4KKyAgICAgICAgICAgIC8vIFVzZSBz
dHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMg
dW5jaGFuZ2VkIGJlbG93CisgICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8ICIuNSI7CisKKyAg
ICAgICAgICAgIC8vIEFkanVzdCBhbmQgYXBwbHkKKyAgICAgICAgICAgIGluaXRpYWxJblVuaXQg
PSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CisgICAgICAgICAgICBqUXVlcnkuc3R5bGUoIGVsZW0s
IHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7CisKKyAgICAgICAgLy8gVXBkYXRlIHNjYWxl
LCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkKKyAgICAgICAgLy8gQnJl
YWsgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3Zl
IGp1c3QgaGFkIGVub3VnaC4KKyAgICAgICAgfSB3aGlsZSAoCisgICAgICAgICAgICBzY2FsZSAh
PT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYm
IC0tbWF4SXRlcmF0aW9ucworICAgICAgICApOworICAgIH0KKworICAgIGlmICggdmFsdWVQYXJ0
cyApIHsKKyAgICAgICAgaW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFs
IHx8IDA7CisKKyAgICAgICAgLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3Bl
Y2lmaWVkCisgICAgICAgIGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID8KKyAgICAgICAgICAg
IGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIg
XSA6CisgICAgICAgICAgICArdmFsdWVQYXJ0c1sgMiBdOworICAgICAgICBpZiAoIHR3ZWVuICkg
eworICAgICAgICAgICAgdHdlZW4udW5pdCA9IHVuaXQ7CisgICAgICAgICAgICB0d2Vlbi5zdGFy
dCA9IGluaXRpYWxJblVuaXQ7CisgICAgICAgICAgICB0d2Vlbi5lbmQgPSBhZGp1c3RlZDsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRqdXN0ZWQ7Cit9Cit2YXIgcmNoZWNrYWJsZVR5
cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7CisKK3ZhciBydGFnTmFtZSA9ICggLzwo
W1x3Oi1dKykvICk7CisKK3ZhciByc2NyaXB0VHlwZSA9ICggL14kfFwvKD86amF2YXxlY21hKXNj
cmlwdC9pICk7CisKKworCisvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9y
dCBYSFRNTCAoIzEzMjAwKQordmFyIHdyYXBNYXAgPSB7CisKKyAgICAvLyBTdXBwb3J0OiBJRTkK
KyAgICBvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxl
Y3Q+IiBdLAorCisgICAgLy8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBl
bGVtZW50cyBpbiB0aGUKKyAgICAvLyBzYW1lIHdheSB0aGF0IHRhZyBzb3VwIHBhcnNlcnMgZG8u
IFNvIHdlIGNhbm5vdCBzaG9ydGVuCisgICAgLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9y
IG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgorICAgIHRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwv
dGFibGU+IiBdLAorICAgIGNvbDogWyAyLCAiPHRhYmxlPjxjb2xncm91cD4iLCAiPC9jb2xncm91
cD48L3RhYmxlPiIgXSwKKyAgICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48
L3RhYmxlPiIgXSwKKyAgICB0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90
Ym9keT48L3RhYmxlPiIgXSwKKworICAgIF9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCit9OworCisv
LyBTdXBwb3J0OiBJRTkKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKKword3Jh
cE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5j
YXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCisKK2Z1
bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgeworCisgICAgLy8gU3VwcG9ydDogSUU5LTEx
KworICAgIC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2Nh
dGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSkKKyAgICB2YXIgcmV0ID0gdHlwZW9mIGNvbnRl
eHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KKyAgICAgICAgICAgIGNv
bnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6CisgICAgICAgICAgICB0
eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiA/CisgICAgICAg
ICAgICAgICAgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgIioiICkgOgorICAgICAg
ICAgICAgW107CisKKyAgICByZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVy
eS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgPworICAgICAgICBqUXVlcnkubWVyZ2UoIFsgY29u
dGV4dCBdLCByZXQgKSA6CisgICAgICAgIHJldDsKK30KKworCisvLyBNYXJrIHNjcmlwdHMgYXMg
aGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKK2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVs
ZW1zLCByZWZFbGVtZW50cyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgICAgIGwgPSBlbGVtcy5s
ZW5ndGg7CisKKyAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisgICAgICAgIGRhdGFQcml2LnNl
dCgKKyAgICAgICAgICAgIGVsZW1zWyBpIF0sCisgICAgICAgICAgICAiZ2xvYmFsRXZhbCIsCisg
ICAgICAgICAgICAhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBd
LCAiZ2xvYmFsRXZhbCIgKQorICAgICAgICApOworICAgIH0KK30KKworCit2YXIgcmh0bWwgPSAv
PHwmIz9cdys7LzsKKworZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNj
cmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKKyAgICB2YXIgZWxlbSwgdG1wLCB0YWcsIHdy
YXAsIGNvbnRhaW5zLCBqLAorICAgICAgICBmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1l
bnRGcmFnbWVudCgpLAorICAgICAgICBub2RlcyA9IFtdLAorICAgICAgICBpID0gMCwKKyAgICAg
ICAgbCA9IGVsZW1zLmxlbmd0aDsKKworICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKKyAgICAg
ICAgZWxlbSA9IGVsZW1zWyBpIF07CisKKyAgICAgICAgaWYgKCBlbGVtIHx8IGVsZW0gPT09IDAg
KSB7CisKKyAgICAgICAgICAgIC8vIEFkZCBub2RlcyBkaXJlY3RseQorICAgICAgICAgICAgaWYg
KCBqUXVlcnkudHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKKworICAgICAgICAgICAgICAg
IC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MgorICAgICAgICAgICAgICAgIC8v
IHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKKyAgICAg
ICAgICAgICAgICBqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0g
OiBlbGVtICk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQg
bm9kZQorICAgICAgICAgICAgfSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKKyAg
ICAgICAgICAgICAgICBub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkg
KTsKKworICAgICAgICAgICAgLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBl
bmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CisKKyAgICAgICAgICAg
ICAgICAvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAg
ICAgICAgdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0u
dG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwg
d3JhcE1hcC5fZGVmYXVsdDsKKyAgICAgICAgICAgICAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsg
MSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTsKKworICAgICAg
ICAgICAgICAgIC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVu
dAorICAgICAgICAgICAgICAgIGogPSB3cmFwWyAwIF07CisgICAgICAgICAgICAgICAgd2hpbGUg
KCBqLS0gKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcC5sYXN0Q2hpbGQ7CisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjEs
IFBoYW50b21KUzwyCisgICAgICAgICAgICAgICAgLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2Up
IHRocm93cyBvbiBhbmNpZW50IFdlYktpdAorICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSgg
bm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CisKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0
aGUgdG9wLWxldmVsIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIHRtcCA9IGZyYWdtZW50LmZp
cnN0Q2hpbGQ7CisKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMg
YXJlIG9ycGhhbmVkICgjMTIzOTIpCisgICAgICAgICAgICAgICAgdG1wLnRleHRDb250ZW50ID0g
IiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZW1vdmUgd3Jh
cHBlciBmcm9tIGZyYWdtZW50CisgICAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKKworICAg
IGkgPSAwOworICAgIHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CisKKyAgICAg
ICAgLy8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRy
YWMtNDA4NykKKyAgICAgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0s
IHNlbGVjdGlvbiApID4gLTEgKSB7CisgICAgICAgICAgICBpZiAoIGlnbm9yZWQgKSB7CisgICAg
ICAgICAgICAgICAgaWdub3JlZC5wdXNoKCBlbGVtICk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRhaW5zID0galF1ZXJ5LmNv
bnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgICAgICAvLyBBcHBlbmQg
dG8gZnJhZ21lbnQKKyAgICAgICAgdG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCgg
ZWxlbSApLCAic2NyaXB0IiApOworCisgICAgICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0
aW9uIGhpc3RvcnkKKyAgICAgICAgaWYgKCBjb250YWlucyApIHsKKyAgICAgICAgICAgIHNldEds
b2JhbEV2YWwoIHRtcCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FwdHVyZSBleGVjdXRh
YmxlcworICAgICAgICBpZiAoIHNjcmlwdHMgKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAg
ICAgICAgIHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkgeworICAgICAgICAgICAgICAg
IGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CisgICAgICAgICAg
ICAgICAgICAgIHNjcmlwdHMucHVzaCggZWxlbSApOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmcmFnbWVudDsKK30KKwor
CisoIGZ1bmN0aW9uKCkgeworICAgIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3Vt
ZW50RnJhZ21lbnQoKSwKKyAgICAgICAgZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKSwKKyAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCAiaW5wdXQiICk7CisKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00
LjMsIFNhZmFyaTw9NS4xCisgICAgLy8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBz
ZXQgKCMxMTIxNykKKyAgICAvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCisgICAg
Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5
MDEpCisgICAgaW5wdXQuc2V0QXR0cmlidXRlKCAidHlwZSIsICJyYWRpbyIgKTsKKyAgICBpbnB1
dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CisgICAgaW5wdXQuc2V0QXR0
cmlidXRlKCAibmFtZSIsICJ0IiApOworCisgICAgZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwor
CisgICAgLy8gU3VwcG9ydDogU2FmYXJpPD01LjEsIEFuZHJvaWQ8NC4yCisgICAgLy8gT2xkZXIg
V2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRz
CisgICAgc3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9k
ZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOworCisgICAgLy8gU3VwcG9ydDogSUU8PTExKwor
ICAgIC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMg
cHJvcGVybHkgY2xvbmVkCisgICAgZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFy
ZWE+IjsKKyAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVl
ICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsKK30gKSgpOworCisKK3ZhcgorICAgIHJrZXlFdmVu
dCA9IC9ea2V5LywKKyAgICBybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0
bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKKyAgICBydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/
OlwuKC4rKXwpLzsKKworZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisv
LyBTdXBwb3J0OiBJRTkKKy8vIFNlZSAjMTMzOTMgZm9yIG1vcmUgaW5mbworZnVuY3Rpb24gc2Fm
ZUFjdGl2ZUVsZW1lbnQoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFj
dGl2ZUVsZW1lbnQ7CisgICAgfSBjYXRjaCAoIGVyciApIHsgfQorfQorCitmdW5jdGlvbiBvbigg
ZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkgeworICAgIHZhciBvcmlnRm4s
IHR5cGU7CisKKyAgICAvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMKKyAg
ICBpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgLy8gKCB0eXBl
cy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkKKyAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3Ig
IT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSAp
CisgICAgICAgICAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAgICAgICAgICAgIHNlbGVj
dG9yID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICAgIGZvciAoIHR5cGUgaW4gdHlwZXMg
KSB7CisgICAgICAgICAgICBvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0
eXBlIF0sIG9uZSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtOworICAgIH0KKwor
ICAgIGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CisKKyAgICAgICAgLy8gKCB0
eXBlcywgZm4gKQorICAgICAgICBmbiA9IHNlbGVjdG9yOworICAgICAgICBkYXRhID0gc2VsZWN0
b3IgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHsKKyAgICAgICAg
aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAvLyAo
IHR5cGVzLCBzZWxlY3RvciwgZm4gKQorICAgICAgICAgICAgZm4gPSBkYXRhOworICAgICAgICAg
ICAgZGF0YSA9IHVuZGVmaW5lZDsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8g
KCB0eXBlcywgZGF0YSwgZm4gKQorICAgICAgICAgICAgZm4gPSBkYXRhOworICAgICAgICAgICAg
ZGF0YSA9IHNlbGVjdG9yOworICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisgICAg
ICAgIH0KKyAgICB9CisgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgICAgIGZuID0gcmV0
dXJuRmFsc2U7CisgICAgfSBlbHNlIGlmICggIWZuICkgeworICAgICAgICByZXR1cm4gZWxlbTsK
KyAgICB9CisKKyAgICBpZiAoIG9uZSA9PT0gMSApIHsKKyAgICAgICAgb3JpZ0ZuID0gZm47Cisg
ICAgICAgIGZuID0gZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAgICAgICAgICAvLyBDYW4gdXNl
IGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm8KKyAgICAgICAgICAg
IGpRdWVyeSgpLm9mZiggZXZlbnQgKTsKKyAgICAgICAgICAgIHJldHVybiBvcmlnRm4uYXBwbHko
IHRoaXMsIGFyZ3VtZW50cyApOworICAgICAgICB9OworCisgICAgICAgIC8vIFVzZSBzYW1lIGd1
aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisgICAgICAgIGZuLmd1aWQgPSBv
cmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOworICAgIH0KKyAg
ICByZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgalF1ZXJ5LmV2ZW50LmFk
ZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOworICAgIH0gKTsKK30KKworLyoK
KyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0
aGUgcHVibGljIGludGVyZmFjZS4KKyAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQg
bGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuCisgKi8KK2pRdWVyeS5ldmVudCA9IHsKKwor
ICAgIGdsb2JhbDoge30sCisKKyAgICBhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxl
ciwgZGF0YSwgc2VsZWN0b3IgKSB7CisKKyAgICAgICAgdmFyIGhhbmRsZU9iakluLCBldmVudEhh
bmRsZSwgdG1wLAorICAgICAgICAgICAgZXZlbnRzLCB0LCBoYW5kbGVPYmosCisgICAgICAgICAg
ICBzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCisgICAgICAg
ICAgICBlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApOworCisgICAgICAgIC8vIERvbid0
IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93
IHBsYWluIG9iamVjdHMpCisgICAgICAgIGlmICggIWVsZW1EYXRhICkgeworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9i
amVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyCisgICAgICAgIGlmICgg
aGFuZGxlci5oYW5kbGVyICkgeworICAgICAgICAgICAgaGFuZGxlT2JqSW4gPSBoYW5kbGVyOwor
ICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CisgICAgICAgICAgICBz
ZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgLy8g
TWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQv
cmVtb3ZlIGl0IGxhdGVyCisgICAgICAgIGlmICggIWhhbmRsZXIuZ3VpZCApIHsKKyAgICAgICAg
ICAgIGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7CisgICAgICAgIH0KKworICAgICAgICAv
LyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlm
IHRoaXMgaXMgdGhlIGZpcnN0CisgICAgICAgIGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZl
bnRzICkgKSB7CisgICAgICAgICAgICBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkg
KSB7CisgICAgICAgICAgICBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9u
KCBlICkgeworCisgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9m
IGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKKyAgICAgICAgICAgICAgICAvLyB3aGVuIGFu
IGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmIGpRdWVyeS5ldmVudC50
cmlnZ2VyZWQgIT09IGUudHlwZSA/CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5k
aXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CisgICAgICAgICAg
ICB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBh
cmF0ZWQgYnkgYSBzcGFjZQorICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCgg
cm5vdHdoaXRlICkgfHwgWyAiIiBdOworICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOworICAgICAg
ICB3aGlsZSAoIHQtLSApIHsKKyAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMo
IHR5cGVzWyB0IF0gKSB8fCBbXTsKKyAgICAgICAgICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsg
MSBdOworICAgICAgICAgICAgbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCgg
Ii4iICkuc29ydCgpOworCisgICAgICAgICAgICAvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBu
byBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnMKKyAgICAgICAgICAgIGlmICggIXR5
cGUgKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVu
dCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZQorICAgICAgICAgICAgc3BlY2lhbCA9IGpR
dWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisKKyAgICAgICAgICAgIC8vIElmIHNl
bGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndp
c2UgZ2l2ZW4gdHlwZQorICAgICAgICAgICAgdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRl
bGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOworCisgICAgICAgICAgICAv
LyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlCisgICAgICAgICAgICBz
cGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAgICAgICAg
ICAgLy8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMKKyAgICAgICAg
ICAgIGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHsKKyAgICAgICAgICAgICAgICB0eXBlOiB0
eXBlLAorICAgICAgICAgICAgICAgIG9yaWdUeXBlOiBvcmlnVHlwZSwKKyAgICAgICAgICAgICAg
ICBkYXRhOiBkYXRhLAorICAgICAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsCisgICAgICAg
ICAgICAgICAgZ3VpZDogaGFuZGxlci5ndWlkLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBz
ZWxlY3RvciwKKyAgICAgICAgICAgICAgICBuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVy
eS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAorICAgICAgICAgICAg
ICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCAiLiIgKQorICAgICAgICAgICAgfSwgaGFu
ZGxlT2JqSW4gKTsKKworICAgICAgICAgICAgLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1
ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKKyAgICAgICAgICAgIGlmICggISggaGFuZGxlcnMgPSBldmVu
dHNbIHR5cGUgXSApICkgeworICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBl
IF0gPSBbXTsKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKKwor
ICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNp
YWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQorICAgICAgICAgICAgICAgIGlmICggIXNw
ZWNpYWwuc2V0dXAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbC5zZXR1cC5jYWxsKCBl
bGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKKworICAg
ICAgICAgICAgICAgICAgICBpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUg
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKKyAgICAgICAgICAgICAgICBz
cGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKworICAgICAgICAgICAgICAgIGlm
ICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRs
ZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVy
IGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAorICAgICAgICAgICAgaWYgKCBzZWxlY3RvciApIHsK
KyAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQr
KywgMCwgaGFuZGxlT2JqICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3Ig
ZXZlbnQgb3B0aW1pemF0aW9uCisgICAgICAgICAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBl
IF0gPSB0cnVlOworICAgICAgICB9CisKKyAgICB9LAorCisgICAgLy8gRGV0YWNoIGFuIGV2ZW50
IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CisgICAgcmVtb3ZlOiBmdW5jdGlvbigg
ZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHsKKworICAgICAg
ICB2YXIgaiwgb3JpZ0NvdW50LCB0bXAsCisgICAgICAgICAgICBldmVudHMsIHQsIGhhbmRsZU9i
aiwKKyAgICAgICAgICAgIHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmln
VHlwZSwKKyAgICAgICAgICAgIGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYm
IGRhdGFQcml2LmdldCggZWxlbSApOworCisgICAgICAgIGlmICggIWVsZW1EYXRhIHx8ICEoIGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsg
dHlwZSBtYXkgYmUgb21pdHRlZAorICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRj
aCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOworICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOworICAg
ICAgICB3aGlsZSAoIHQtLSApIHsKKyAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4
ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTsKKyAgICAgICAgICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRt
cFsgMSBdOworICAgICAgICAgICAgbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxp
dCggIi4iICkuc29ydCgpOworCisgICAgICAgICAgICAvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24g
dGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKKyAgICAgICAgICAg
IGlmICggIXR5cGUgKSB7CisgICAgICAgICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7
CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0
eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisgICAgICAgICAg
ICB0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5k
VHlwZSApIHx8IHR5cGU7CisgICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8
IFtdOworICAgICAgICAgICAgdG1wID0gdG1wWyAyIF0gJiYKKyAgICAgICAgICAgICAgICBuZXcg
UmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oICJcXC4oPzouKlxcLnwpIiApICsg
IihcXC58JCkiICk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKKyAg
ICAgICAgICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7CisgICAgICAgICAgICB3
aGlsZSAoIGotLSApIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBd
OworCisgICAgICAgICAgICAgICAgaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBo
YW5kbGVPYmoub3JpZ1R5cGUgKSAmJgorICAgICAgICAgICAgICAgICAgICAoICFoYW5kbGVyIHx8
IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgorICAgICAgICAgICAgICAgICAg
ICAoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCisgICAgICAg
ICAgICAgICAgICAgICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0
b3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRs
ZU9iai5zZWxlY3RvciApICkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2Uo
IGosIDEgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGhhbmRsZU9iai5zZWxlY3RvciAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHNwZWNpYWwucmVt
b3ZlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxl
bSwgaGFuZGxlT2JqICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhh
bmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QK
KyAgICAgICAgICAgIC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBk
dXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKQorICAgICAgICAgICAgaWYg
KCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICBpZiAo
ICFzcGVjaWFsLnRlYXJkb3duIHx8CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwudGVhcmRv
d24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkg
eworCisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwg
ZWxlbURhdGEuaGFuZGxlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ZGVsZXRlIGV2ZW50c1sgdHlwZSBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQK
KyAgICAgICAgaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CisgICAgICAg
ICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJoYW5kbGUgZXZlbnRzIiApOworICAgICAgICB9
CisgICAgfSwKKworICAgIGRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CisKKyAgICAgICAg
Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2Jq
ZWN0CisgICAgICAgIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTsKKworICAgICAg
ICB2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosCisgICAgICAgICAgICBoYW5kbGVy
UXVldWUgPSBbXSwKKyAgICAgICAgICAgIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwK
KyAgICAgICAgICAgIGhhbmRsZXJzID0gKCBkYXRhUHJpdi5nZXQoIHRoaXMsICJldmVudHMiICkg
fHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAorICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVy
eS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CisKKyAgICAgICAgLy8gVXNlIHRo
ZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUg
ZXZlbnQKKyAgICAgICAgYXJnc1sgMCBdID0gZXZlbnQ7CisgICAgICAgIGV2ZW50LmRlbGVnYXRl
VGFyZ2V0ID0gdGhpczsKKworICAgICAgICAvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZv
ciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkCisgICAgICAgIGlm
ICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMs
IGV2ZW50ICkgPT09IGZhbHNlICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgLy8gRGV0ZXJtaW5lIGhhbmRsZXJzCisgICAgICAgIGhhbmRsZXJRdWV1ZSA9IGpR
dWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTsKKworICAg
ICAgICAvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFn
YXRpb24gYmVuZWF0aCB1cworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKCAoIG1hdGNo
ZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVk
KCkgKSB7CisgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOwor
CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggKCBoYW5kbGVPYmogPSBt
YXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmCisgICAgICAgICAgICAgICAgIWV2ZW50LmlzSW1t
ZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUcmln
Z2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUg
bmFtZXNwYWNlKHMpCisgICAgICAgICAgICAgICAgLy8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhv
c2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuCisgICAg
ICAgICAgICAgICAgaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRl
c3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKKworICAgICAgICAgICAgICAgICAgICBldmVu
dC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEg
PSBoYW5kbGVPYmouZGF0YTsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSAoICggalF1ZXJ5
LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8Cisg
ICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVk
LmVsZW0sIGFyZ3MgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCAhPT0gdW5kZWZp
bmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJl
dCApID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9w
YWdhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQorICAg
ICAgICBpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkgeworICAgICAgICAgICAgc3BlY2lhbC5w
b3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIGhhbmRsZXJzOiBmdW5jdGlvbiggZXZl
bnQsIGhhbmRsZXJzICkgeworICAgICAgICB2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmos
CisgICAgICAgICAgICBoYW5kbGVyUXVldWUgPSBbXSwKKyAgICAgICAgICAgIGRlbGVnYXRlQ291
bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAorICAgICAgICAgICAgY3VyID0gZXZlbnQudGFy
Z2V0OworCisgICAgICAgIC8vIFN1cHBvcnQgKGF0IGxlYXN0KTogQ2hyb21lLCBJRTkKKyAgICAg
ICAgLy8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVycworICAgICAgICAvLyBCbGFjay1ob2xlIFNWRyA8
dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKQorICAgICAgICAvLworICAgICAgICAvLyBTdXBw
b3J0OiBGaXJlZm94PD00MisKKyAgICAgICAgLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgaW4gRkYg
YnV0IGRvbid0IGJsb2NrIElFIHJhZGlvIGV2ZW50cyAoIzM4NjEsIGdoLTIzNDMpCisgICAgICAg
IGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYKKyAgICAgICAgICAgICggZXZl
bnQudHlwZSAhPT0gImNsaWNrIiB8fCBpc05hTiggZXZlbnQuYnV0dG9uICkgfHwgZXZlbnQuYnV0
dG9uIDwgMSApICkgeworCisgICAgICAgICAgICBmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0g
Y3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKKworICAgICAgICAgICAgICAgIC8vIERvbid0IGNo
ZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KQorICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nl
c3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzEx
NzY0KQorICAgICAgICAgICAgICAgIGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICggY3VyLmRp
c2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgbWF0Y2hlcyA9IFtdOworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0g
MDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhh
bmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERv
bid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpCisg
ICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyAiICI7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWyBzZWwgXSA9IGhhbmRs
ZU9iai5uZWVkc0NvbnRleHQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVl
cnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0
aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggbWF0Y2hlc1sgc2VsIF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hl
cy5wdXNoKCBoYW5kbGVPYmogKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXMubGVuZ3RoICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3Vy
LCBoYW5kbGVyczogbWF0Y2hlcyB9ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhl
IHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzCisgICAgICAgIGlmICggZGVsZWdh
dGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHsKKyAgICAgICAgICAgIGhhbmRsZXJRdWV1ZS5w
dXNoKCB7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3Vu
dCApIH0gKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVyUXVldWU7CisgICAg
fSwKKworICAgIC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50
IGFuZCBNb3VzZUV2ZW50CisgICAgcHJvcHM6ICggImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUg
Y3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlICIgKworICAgICAgICAibWV0
YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIg
KS5zcGxpdCggIiAiICksCisKKyAgICBmaXhIb29rczoge30sCisKKyAgICBrZXlIb29rczogewor
ICAgICAgICBwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCAiICIgKSwK
KyAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgeworCisgICAgICAg
ICAgICAvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKyAgICAgICAgICAgIGlmICggZXZlbnQu
d2hpY2ggPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBldmVudC53aGljaCA9IG9yaWdpbmFs
LmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBldmVudDsKKyAgICAgICAgfQor
ICAgIH0sCisKKyAgICBtb3VzZUhvb2tzOiB7CisgICAgICAgIHByb3BzOiAoICJidXR0b24gYnV0
dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZICIgKworICAg
ICAgICAgICAgInNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiICkuc3BsaXQoICIgIiApLAorICAg
ICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CisgICAgICAgICAgICB2
YXIgZXZlbnREb2MsIGRvYywgYm9keSwKKyAgICAgICAgICAgICAgICBidXR0b24gPSBvcmlnaW5h
bC5idXR0b247CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3Npbmcg
YW5kIGNsaWVudFgvWSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICggZXZlbnQucGFnZVggPT0g
bnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgZXZl
bnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKyAgICAgICAg
ICAgICAgICBkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAg
Ym9keSA9IGV2ZW50RG9jLmJvZHk7CisKKyAgICAgICAgICAgICAgICBldmVudC5wYWdlWCA9IG9y
aWdpbmFsLmNsaWVudFggKworICAgICAgICAgICAgICAgICAgICAoIGRvYyAmJiBkb2Muc2Nyb2xs
TGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLQorICAgICAgICAgICAgICAg
ICAgICAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8
fCAwICk7CisgICAgICAgICAgICAgICAgZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsK
KyAgICAgICAgICAgICAgICAgICAgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBi
b2R5LnNjcm9sbFRvcCAgfHwgMCApIC0KKyAgICAgICAgICAgICAgICAgICAgKCBkb2MgJiYgZG9j
LmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAy
ID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CisgICAgICAgICAgICAvLyBOb3RlOiBidXR0b24gaXMg
bm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorICAgICAgICAgICAgaWYgKCAhZXZlbnQu
d2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQu
d2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYg
NCA/IDIgOiAwICkgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXZl
bnQ7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7Cisg
ICAgICAgIGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CisgICAgICAgICAgICByZXR1
cm4gZXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5
IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAgICAg
ICAgdmFyIGksIHByb3AsIGNvcHksCisgICAgICAgICAgICB0eXBlID0gZXZlbnQudHlwZSwKKyAg
ICAgICAgICAgIG9yaWdpbmFsRXZlbnQgPSBldmVudCwKKyAgICAgICAgICAgIGZpeEhvb2sgPSB0
aGlzLmZpeEhvb2tzWyB0eXBlIF07CisKKyAgICAgICAgaWYgKCAhZml4SG9vayApIHsKKyAgICAg
ICAgICAgIHRoaXMuZml4SG9va3NbIHR5cGUgXSA9IGZpeEhvb2sgPQorICAgICAgICAgICAgICAg
IHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6CisgICAgICAgICAg
ICAgICAgcmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOgorICAgICAgICAg
ICAgICAgIHt9OworICAgICAgICB9CisgICAgICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhp
cy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKyAgICAgICAg
ZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CisKKyAgICAgICAgaSA9
IGNvcHkubGVuZ3RoOworICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgIHByb3Ag
PSBjb3B5WyBpIF07CisgICAgICAgICAgICBldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsg
cHJvcCBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdl
YktpdCkgKCMxMzI1NSkKKyAgICAgICAgLy8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdl
dDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0CisgICAgICAgIGlmICggIWV2ZW50LnRhcmdl
dCApIHsKKyAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IGRvY3VtZW50OworICAgICAgICB9CisK
KyAgICAgICAgLy8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOAorICAgICAgICAvLyBU
YXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQorICAgICAgICBp
ZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKKyAgICAgICAgICAgIGV2ZW50LnRh
cmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50
ICkgOiBldmVudDsKKyAgICB9LAorCisgICAgc3BlY2lhbDogeworICAgICAgICBsb2FkOiB7CisK
KyAgICAgICAgICAgIC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20g
YnViYmxpbmcgdG8gd2luZG93LmxvYWQKKyAgICAgICAgICAgIG5vQnViYmxlOiB0cnVlCisgICAg
ICAgIH0sCisgICAgICAgIGZvY3VzOiB7CisKKyAgICAgICAgICAgIC8vIEZpcmUgbmF0aXZlIGV2
ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdAorICAgICAg
ICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCB0aGlzICE9
PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7CisgICAgICAgICAgICAgICAg
ICAgIHRoaXMuZm9jdXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6
ICJmb2N1c2luIgorICAgICAgICB9LAorICAgICAgICBibHVyOiB7CisgICAgICAgICAgICB0cmln
Z2VyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMgPT09IHNhZmVBY3Rp
dmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmJs
dXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIK
KyAgICAgICAgfSwKKyAgICAgICAgY2xpY2s6IHsKKworICAgICAgICAgICAgLy8gRm9yIGNoZWNr
Ym94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKKyAg
ICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICggdGhp
cy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0
aGlzLCAiaW5wdXQiICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2soKTsKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5
LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rcworICAgICAgICAgICAgX2RlZmF1
bHQ6IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4galF1ZXJ5Lm5v
ZGVOYW1lKCBldmVudC50YXJnZXQsICJhIiApOworICAgICAgICAgICAgfQorICAgICAgICB9LAor
CisgICAgICAgIGJlZm9yZXVubG9hZDogeworICAgICAgICAgICAgcG9zdERpc3BhdGNoOiBmdW5j
dGlvbiggZXZlbnQgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94IDIw
KworICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJu
VmFsdWUgZmllbGQgaXMgbm90IHNldC4KKyAgICAgICAgICAgICAgICBpZiAoIGV2ZW50LnJlc3Vs
dCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7CisgICAgICAgICAgICAg
ICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKwor
alF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKKwor
ICAgIC8vIFRoaXMgImlmIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHMKKyAgICBpZiAoIGVs
ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKKyAgICAgICAgZWxlbS5yZW1vdmVFdmVudExpc3Rl
bmVyKCB0eXBlLCBoYW5kbGUgKTsKKyAgICB9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlv
biggc3JjLCBwcm9wcyApIHsKKworICAgIC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0
aGUgJ25ldycga2V5d29yZAorICAgIGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVu
dCApICkgeworICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwor
ICAgIH0KKworICAgIC8vIEV2ZW50IG9iamVjdAorICAgIGlmICggc3JjICYmIHNyYy50eXBlICkg
eworICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisgICAgICAgIHRoaXMudHlwZSA9
IHNyYy50eXBlOworCisgICAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQg
bWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCisgICAgICAgIC8vIGJ5IGEgaGFuZGxl
ciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgorICAgICAg
ICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8CisgICAg
ICAgICAgICAgICAgc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJgorCisgICAg
ICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKKyAgICAgICAgICAgICAgICBzcmMu
cmV0dXJuVmFsdWUgPT09IGZhbHNlID8KKyAgICAgICAgICAgIHJldHVyblRydWUgOgorICAgICAg
ICAgICAgcmV0dXJuRmFsc2U7CisKKyAgICAvLyBFdmVudCB0eXBlCisgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy50eXBlID0gc3JjOworICAgIH0KKworICAgIC8vIFB1dCBleHBsaWNpdGx5IHBy
b3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CisgICAgaWYgKCBwcm9wcyAp
IHsKKyAgICAgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKKyAgICB9CisKKyAgICAv
LyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQor
ICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygp
OworCisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0g
PSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFz
IHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRwOi8v
d3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNj
cmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisgICAgY29uc3Ry
dWN0b3I6IGpRdWVyeS5FdmVudCwKKyAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNl
LAorICAgIGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKKyAgICBpc0ltbWVkaWF0
ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisgICAgaXNTaW11bGF0ZWQ6IGZhbHNl
LAorCisgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRo
aXMub3JpZ2luYWxFdmVudDsKKworICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJl
dHVyblRydWU7CisKKyAgICAgICAgaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgeworICAg
ICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9CisgICAgfSwKKyAgICBzdG9w
UHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxF
dmVudDsKKworICAgICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsK
KworICAgICAgICBpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CisgICAgICAgICAgICBl
LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgICB9CisgICAgfSwKKyAgICBzdG9wSW1tZWRpYXRl
UHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxF
dmVudDsKKworICAgICAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0
dXJuVHJ1ZTsKKworICAgICAgICBpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CisgICAg
ICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOworICAgICAgICB9CisKKyAgICAg
ICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9Cit9OworCisvLyBDcmVhdGUgbW91c2Vl
bnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVj
a3MKKy8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuCisvLyBEbyB0
aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9p
bnRlcm91dAorLy8KKy8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHkKKy8vIFNhZmFyaSBzZW5kcyBt
b3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgorLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9j
aHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OAorLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBv
ZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4K
K2pRdWVyeS5lYWNoKCB7CisgICAgbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCisgICAgbW91c2Vs
ZWF2ZTogIm1vdXNlb3V0IiwKKyAgICBwb2ludGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsCisgICAg
cG9pbnRlcmxlYXZlOiAicG9pbnRlcm91dCIKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7Cisg
ICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKKyAgICAgICAgZGVsZWdhdGVUeXBl
OiBmaXgsCisgICAgICAgIGJpbmRUeXBlOiBmaXgsCisKKyAgICAgICAgaGFuZGxlOiBmdW5jdGlv
biggZXZlbnQgKSB7CisgICAgICAgICAgICB2YXIgcmV0LAorICAgICAgICAgICAgICAgIHRhcmdl
dCA9IHRoaXMsCisgICAgICAgICAgICAgICAgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQs
CisgICAgICAgICAgICAgICAgaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOworCisgICAgICAg
ICAgICAvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQg
aXMgb3V0c2lkZSB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgLy8gTkI6IE5vIHJlbGF0ZWRUYXJn
ZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKKyAgICAgICAg
ICAgIGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250
YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHsKKyAgICAgICAgICAgICAgICBldmVudC50eXBl
ID0gaGFuZGxlT2JqLm9yaWdUeXBlOworICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZU9iai5o
YW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICAgICAgICAgICAgICBldmVudC50
eXBlID0gZml4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAg
ICAgfQorICAgIH07Cit9ICk7CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBvbjogZnVuY3Rp
b24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CisgICAgICAgIHJldHVybiBvbiggdGhp
cywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgb25lOiBmdW5jdGlv
biggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHsKKyAgICAgICAgcmV0dXJuIG9uKCB0aGlz
LCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7CisgICAgfSwKKyAgICBvZmY6IGZ1bmN0
aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgeworICAgICAgICB2YXIgaGFuZGxlT2JqLCB0eXBl
OworICAgICAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhh
bmRsZU9iaiApIHsKKworICAgICAgICAgICAgLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVy
eS5FdmVudAorICAgICAgICAgICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOworICAgICAg
ICAgICAgalF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZigKKyAgICAgICAgICAgICAg
ICBoYW5kbGVPYmoubmFtZXNwYWNlID8KKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlT2JqLm9y
aWdUeXBlICsgIi4iICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6CisgICAgICAgICAgICAgICAgICAg
IGhhbmRsZU9iai5vcmlnVHlwZSwKKyAgICAgICAgICAgICAgICBoYW5kbGVPYmouc2VsZWN0b3Is
CisgICAgICAgICAgICAgICAgaGFuZGxlT2JqLmhhbmRsZXIKKyAgICAgICAgICAgICk7CisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHR5cGVvZiB0eXBl
cyA9PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgICAgIC8vICggdHlwZXMtb2JqZWN0IFssIHNl
bGVjdG9yXSApCisgICAgICAgICAgICBmb3IgKCB0eXBlIGluIHR5cGVzICkgeworICAgICAgICAg
ICAgICAgIHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkg
eworCisgICAgICAgICAgICAvLyAoIHR5cGVzIFssIGZuXSApCisgICAgICAgICAgICBmbiA9IHNl
bGVjdG9yOworICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICBmbiA9IHJldHVybkZhbHNl
OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciAp
OworICAgICAgICB9ICk7CisgICAgfQorfSApOworCisKK3ZhcgorICAgIHJ4aHRtbFRhZyA9IC88
KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzot
XSspW14+XSopXC8+L2dpLAorCisgICAgLy8gU3VwcG9ydDogSUUgMTAtMTEsIEVkZ2UgMTAyNDAr
CisgICAgLy8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJl
IHNsb3dkb3ducy4KKyAgICAvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUv
ZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLworICAgIHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxz
dHlsZXw8bGluay9pLAorCisgICAgLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorICAg
IHJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisgICAgcnNj
cmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcLyguKikvLAorICAgIHJjbGVhblNjcmlwdCA9IC9eXHMq
PCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKKworLy8gTWFuaXB1bGF0aW5n
IHRhYmxlcyByZXF1aXJlcyBhIHRib2R5CitmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVs
ZW0sIGNvbnRlbnQgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRhYmxl
IiApICYmCisgICAgICAgIGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEg
PyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgPworCisgICAgICAgIGVsZW0u
Z2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKVsgMCBdIHx8CisgICAgICAgICAgICBlbGVt
LmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInRib2R5IiAp
ICkgOgorICAgICAgICBlbGVtOworfQorCisvLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0
cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uCitmdW5j
dGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgeworICAgIGVsZW0udHlwZSA9ICggZWxlbS5nZXRB
dHRyaWJ1dGUoICJ0eXBlIiApICE9PSBudWxsICkgKyAiLyIgKyBlbGVtLnR5cGU7CisgICAgcmV0
dXJuIGVsZW07Cit9CitmdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkgeworICAgIHZhciBt
YXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApOworCisgICAgaWYgKCBt
YXRjaCApIHsKKyAgICAgICAgZWxlbS50eXBlID0gbWF0Y2hbIDEgXTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSggInR5cGUiICk7CisgICAgfQorCisgICAgcmV0
dXJuIGVsZW07Cit9CisKK2Z1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7Cisg
ICAgdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3Vy
LCBldmVudHM7CisKKyAgICBpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5k
bGVycywgZXRjLgorICAgIGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7CisgICAgICAg
IHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTsKKyAgICAgICAgcGRhdGFDdXIgPSBk
YXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CisgICAgICAgIGV2ZW50cyA9IHBkYXRhT2xk
LmV2ZW50czsKKworICAgICAgICBpZiAoIGV2ZW50cyApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBw
ZGF0YUN1ci5oYW5kbGU7CisgICAgICAgICAgICBwZGF0YUN1ci5ldmVudHMgPSB7fTsKKworICAg
ICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7CisgICAgICAgICAgICAgICAgZm9yICgg
aSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBd
WyBpIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICAvLyAyLiBDb3B5IHVzZXIgZGF0YQorICAgIGlmICggZGF0YVVzZXIuaGFzRGF0
YSggc3JjICkgKSB7CisgICAgICAgIHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTsK
KyAgICAgICAgdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKKworICAg
ICAgICBkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7CisgICAgfQorfQorCisvLyBGaXgg
SUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKK2Z1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3Qg
KSB7CisgICAgdmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCisg
ICAgLy8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVj
a2JveCBvciByYWRpbyBidXR0b24uCisgICAgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiBy
Y2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgeworICAgICAgICBkZXN0LmNoZWNrZWQg
PSBzcmMuY2hlY2tlZDsKKworICAgIC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0
aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCisg
ICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0
YXJlYSIgKSB7CisgICAgICAgIGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsK
KyAgICB9Cit9CisKK2Z1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFj
aywgaWdub3JlZCApIHsKKworICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKKyAgICBh
cmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOworCisgICAgdmFyIGZyYWdtZW50LCBmaXJz
dCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLAorICAgICAgICBpID0gMCwKKyAgICAg
ICAgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAorICAgICAgICBpTm9DbG9uZSA9IGwgLSAxLAorICAg
ICAgICB2YWx1ZSA9IGFyZ3NbIDAgXSwKKyAgICAgICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1
bmN0aW9uKCB2YWx1ZSApOworCisgICAgLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0
aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CisgICAgaWYgKCBpc0Z1bmN0aW9uIHx8Cisg
ICAgICAgICAgICAoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYKKyAgICAg
ICAgICAgICAgICAhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkg
KSApIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkg
eworICAgICAgICAgICAgdmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApOworICAgICAg
ICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgICAgICAgICAgICAgIGFyZ3NbIDAgXSA9IHZh
bHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CisgICAg
ICAgIH0gKTsKKyAgICB9CisKKyAgICBpZiAoIGwgKSB7CisgICAgICAgIGZyYWdtZW50ID0gYnVp
bGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBj
b2xsZWN0aW9uLCBpZ25vcmVkICk7CisgICAgICAgIGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGls
ZDsKKworICAgICAgICBpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkgewor
ICAgICAgICAgICAgZnJhZ21lbnQgPSBmaXJzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJl
cXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVu
dHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjaworICAgICAgICBpZiAoIGZpcnN0IHx8IGlnbm9yZWQg
KSB7CisgICAgICAgICAgICBzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwg
InNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOworICAgICAgICAgICAgaGFzU2NyaXB0cyA9IHNj
cmlwdHMubGVuZ3RoOworCisgICAgICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50
IGZvciB0aGUgbGFzdCBpdGVtCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBi
ZWNhdXNlIGl0IGNhbiBlbmQgdXAKKyAgICAgICAgICAgIC8vIGJlaW5nIGVtcHRpZWQgaW5jb3Jy
ZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCisgICAgICAgICAgICBmb3IgKCA7
IGkgPCBsOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IGZyYWdtZW50OworCisgICAg
ICAgICAgICAgICAgaWYgKCBpICE9PSBpTm9DbG9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisgICAgICAgICAgICAg
ICAgICAgIC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVz
dG9yYXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBoYXNTY3JpcHRzICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDIK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJv
d3Mgb24gYW5jaWVudCBXZWJLaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJn
ZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCAic2NyaXB0IiApICk7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxs
KCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCBoYXNTY3JpcHRzICkgeworICAgICAgICAgICAgICAgIGRvYyA9IHNjcmlwdHNbIHNj
cmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CisKKyAgICAgICAgICAgICAgICAvLyBS
ZWVuYWJsZSBzY3JpcHRzCisgICAgICAgICAgICAgICAgalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVz
dG9yZVNjcmlwdCApOworCisgICAgICAgICAgICAgICAgLy8gRXZhbHVhdGUgZXhlY3V0YWJsZSBz
Y3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvbgorICAgICAgICAgICAgICAgIGZvciAo
IGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBub2Rl
ID0gc2NyaXB0c1sgaSBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJzY3JpcHRUeXBlLnRl
c3QoIG5vZGUudHlwZSB8fCAiIiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZGF0YVBy
aXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgorICAgICAgICAgICAgICAgICAgICAg
ICAgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCBub2RlLnNyYyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBw
cmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuX2V2YWxVcmwg
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5fZXZhbFVybCggbm9k
ZS5zcmMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5nbG9i
YWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIiIgKSApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IGNvbGxlY3Rpb247Cit9CisKK2Z1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBE
YXRhICkgeworICAgIHZhciBub2RlLAorICAgICAgICBub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5
LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sCisgICAgICAgIGkgPSAwOworCisgICAg
Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgeworICAgICAgICBp
ZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAgalF1
ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICggbm9kZS5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgaWYgKCBrZWVwRGF0YSAmJiBqUXVl
cnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkgeworICAgICAgICAgICAg
ICAgIHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSApOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZWxlbTsKK30KKworalF1ZXJ5LmV4dGVuZCgg
eworICAgIGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICByZXR1cm4g
aHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7
CisgICAgICAgIHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAorICAgICAgICAg
ICAgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAorICAgICAgICAgICAgaW5QYWdlID0g
alF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgICAgICAv
LyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKKyAgICAgICAgaWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hl
Y2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAm
JgorICAgICAgICAgICAgICAgICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKKworICAgICAg
ICAgICAgLy8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBo
dHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKKyAgICAgICAgICAgIGRlc3RFbGVt
ZW50cyA9IGdldEFsbCggY2xvbmUgKTsKKyAgICAgICAgICAgIHNyY0VsZW1lbnRzID0gZ2V0QWxs
KCBlbGVtICk7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgICAgIGZpeElucHV0KCBzcmNFbGVtZW50
c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9u
ZQorICAgICAgICBpZiAoIGRhdGFBbmRFdmVudHMgKSB7CisgICAgICAgICAgICBpZiAoIGRlZXBE
YXRhQW5kRXZlbnRzICkgeworICAgICAgICAgICAgICAgIHNyY0VsZW1lbnRzID0gc3JjRWxlbWVu
dHMgfHwgZ2V0QWxsKCBlbGVtICk7CisgICAgICAgICAgICAgICAgZGVzdEVsZW1lbnRzID0gZGVz
dEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTsKKworICAgICAgICAgICAgICAgIGZvciAoIGkg
PSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAg
ICAgICAgICBjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBp
IF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgLy8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeQor
ICAgICAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOworICAgICAg
ICBpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgc2V0R2xvYmFs
RXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSAp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisgICAgICAg
IHJldHVybiBjbG9uZTsKKyAgICB9LAorCisgICAgY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMg
KSB7CisgICAgICAgIHZhciBkYXRhLCBlbGVtLCB0eXBlLAorICAgICAgICAgICAgc3BlY2lhbCA9
IGpRdWVyeS5ldmVudC5zcGVjaWFsLAorICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgZm9y
ICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkgeworICAgICAg
ICAgICAgaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAo
IGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCBkYXRhLmV2ZW50cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHR5
cGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBz
cGVjaWFsWyB0eXBlIF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mg
b3ZlcmhlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRh
dGEuaGFuZGxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1KworICAgICAgICAgICAgICAgICAgICAvLyBB
c3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmUK
KyAgICAgICAgICAgICAgICAgICAgZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVk
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGVsZW1bIGRhdGFVc2Vy
LmV4cGFuZG8gXSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBDaHJvbWUg
PD0gMzUtNDUrCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVh
ZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZQorICAgICAgICAgICAgICAgICAgICBl
bGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSApOworCitqUXVlcnkuZm4uZXh0ZW5k
KCB7CisKKyAgICAvLyBLZWVwIGRvbU1hbmlwIGV4cG9zZWQgdW50aWwgMy4wIChnaC0yMjI1KQor
ICAgIGRvbU1hbmlwOiBkb21NYW5pcCwKKworICAgIGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9y
ICkgeworICAgICAgICByZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOworICAg
IH0sCisKKyAgICByZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICAgICAgcmV0dXJu
IHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTsKKyAgICB9LAorCisgICAgdGV4dDogZnVuY3Rpb24o
IHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUg
KSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisgICAgICAgICAg
ICAgICAgalF1ZXJ5LnRleHQoIHRoaXMgKSA6CisgICAgICAgICAgICAgICAgdGhpcy5lbXB0eSgp
LmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXMubm9kZVR5
cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgfSwgbnVs
bCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKyAgICB9LAorCisgICAgYXBwZW5kOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0
aW9uKCBlbGVtICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRo
aXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisgICAgICAgICAg
ICAgICAgdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOworICAg
ICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApOworICAgICAgICAgICAgfQor
ICAgICAgICB9ICk7CisgICAgfSwKKworICAgIHByZXBlbmQ6IGZ1bmN0aW9uKCkgeworICAgICAg
ICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgICAgICAgICBpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0g
MTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKyAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0
ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CisgICAgICAgICAgICAgICAgdGFy
Z2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSApOworICAgIH0sCisKKyAgICBiZWZvcmU6IGZ1bmN0aW9uKCkgeworICAg
ICAgICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7
CisgICAgICAgICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAgICAgICB0
aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgYWZ0ZXI6IGZ1bmN0aW9uKCkgeworICAgICAg
ICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgICAgICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAgICAgICB0aGlz
LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgZW1wdHk6IGZ1bmN0aW9uKCkg
eworICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgIGZvciAo
IDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgeworICAgICAgICAgICAgaWYg
KCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCisgICAgICAgICAgICAgICAgLy8gUHJldmVudCBt
ZW1vcnkgbGVha3MKKyAgICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVs
ZW0sIGZhbHNlICkgKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5n
IG5vZGVzCisgICAgICAgICAgICAgICAgZWxlbS50ZXh0Q29udGVudCA9ICIiOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7CisgICAg
ICAgIGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFB
bmRFdmVudHM7CisgICAgICAgIGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMg
PT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKKworICAgICAgICBy
ZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5j
bG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTsKKyAgICAgICAg
fSApOworICAgIH0sCisKKyAgICBodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgIHJl
dHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBl
bGVtID0gdGhpc1sgMCBdIHx8IHt9LAorICAgICAgICAgICAgICAgIGkgPSAwLAorICAgICAgICAg
ICAgICAgIGwgPSB0aGlzLmxlbmd0aDsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5k
ZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJu
IGVsZW0uaW5uZXJIVE1MOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZWUgaWYg
d2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCisgICAgICAgICAg
ICBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2
YWx1ZSApICYmCisgICAgICAgICAgICAgICAgIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFs
dWUgKSB8fCBbICIiLCAiIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7CisKKyAgICAgICAg
ICAgICAgICB2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApOworCisgICAgICAg
ICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQg
bWVtb3J5IGxlYWtzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUg
PT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmNsZWFuRGF0YSgg
Z2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxl
bS5pbm5lckhUTUwgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSAwOworCisgICAgICAg
ICAgICAgICAgLy8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0
aGUgZmFsbGJhY2sgbWV0aG9kCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7fQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW0gKSB7CisgICAgICAgICAgICAgICAg
dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwg
bnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKyAgICB9LAorCisgICAgcmVwbGFjZVdp
dGg6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaWdub3JlZCA9IFtdOworCisgICAgICAgIC8v
IE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxl
bWVudCB3aXRoIHRoZSBuZXcgY29udGVudAorICAgICAgICByZXR1cm4gZG9tTWFuaXAoIHRoaXMs
IGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICB2YXIgcGFyZW50ID0g
dGhpcy5wYXJlbnROb2RlOworCisgICAgICAgICAgICBpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlz
LCBpZ25vcmVkICkgPCAwICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdl
dEFsbCggdGhpcyApICk7CisgICAgICAgICAgICAgICAgaWYgKCBwYXJlbnQgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgY2FsbGJhY2sgaW52
b2NhdGlvbgorICAgICAgICB9LCBpZ25vcmVkICk7CisgICAgfQorfSApOworCitqUXVlcnkuZWFj
aCggeworICAgIGFwcGVuZFRvOiAiYXBwZW5kIiwKKyAgICBwcmVwZW5kVG86ICJwcmVwZW5kIiwK
KyAgICBpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorICAgIGluc2VydEFmdGVyOiAiYWZ0ZXIiLAor
ICAgIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5h
bCApIHsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAg
ICAgICAgdmFyIGVsZW1zLAorICAgICAgICAgICAgcmV0ID0gW10sCisgICAgICAgICAgICBpbnNl
cnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisgICAgICAgICAgICBsYXN0ID0gaW5zZXJ0Lmxlbmd0
aCAtIDEsCisgICAgICAgICAgICBpID0gMDsKKworICAgICAgICBmb3IgKCA7IGkgPD0gbGFzdDsg
aSsrICkgeworICAgICAgICAgICAgZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xv
bmUoIHRydWUgKTsKKyAgICAgICAgICAgIGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwg
XSggZWxlbXMgKTsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKKyAgICAgICAg
ICAgIC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKyAg
ICAgICAgICAgIHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisgICAgfTsKK30gKTsKKworCit2
YXIgaWZyYW1lLAorICAgIGVsZW1kaXNwbGF5ID0geworCisgICAgICAgIC8vIFN1cHBvcnQ6IEZp
cmVmb3gKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBwcmUtZGVmaW5lIHRoZXNlIHZhbHVlcyBmb3Ig
RkYgKCMxMDIyNykKKyAgICAgICAgSFRNTDogImJsb2NrIiwKKyAgICAgICAgQk9EWTogImJsb2Nr
IgorICAgIH07CisKKy8qKgorICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxl
bWVudAorICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnQKKyAq
IEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0CisgKi8KKworLy8gQ2FsbGVkIG9u
bHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXkKK2Z1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5h
bWUsIGRvYyApIHsKKyAgICB2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5h
bWUgKSApLmFwcGVuZFRvKCBkb2MuYm9keSApLAorCisgICAgICAgIGRpc3BsYXkgPSBqUXVlcnku
Y3NzKCBlbGVtWyAwIF0sICJkaXNwbGF5IiApOworCisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkg
ZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsCisgICAgLy8gc28gdXNlICJkZXRhY2giIG1ldGhv
ZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50CisgICAgZWxlbS5kZXRhY2go
KTsKKworICAgIHJldHVybiBkaXNwbGF5OworfQorCisvKioKKyAqIFRyeSB0byBkZXRlcm1pbmUg
dGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50CisgKiBAcGFyYW0ge1N0cmlu
Z30gbm9kZU5hbWUKKyAqLworZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgewor
ICAgIHZhciBkb2MgPSBkb2N1bWVudCwKKyAgICAgICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBu
b2RlTmFtZSBdOworCisgICAgaWYgKCAhZGlzcGxheSApIHsKKyAgICAgICAgZGlzcGxheSA9IGFj
dHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKKworICAgICAgICAvLyBJZiB0aGUgc2ltcGxl
IHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWUKKyAgICAgICAgaWYgKCBkaXNw
bGF5ID09PSAibm9uZSIgfHwgIWRpc3BsYXkgKSB7CisKKyAgICAgICAgICAgIC8vIFVzZSB0aGUg
YWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZQorICAgICAgICAgICAgaWZyYW1lID0g
KCBpZnJhbWUgfHwgalF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhl
aWdodD0nMCcvPiIgKSApCisgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRF
bGVtZW50ICk7CisKKyAgICAgICAgICAgIC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxl
dG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorICAgICAgICAg
ICAgZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50OworCisgICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRQorICAgICAgICAgICAgZG9jLndyaXRlKCk7CisgICAgICAgICAgICBkb2MuY2xv
c2UoKTsKKworICAgICAgICAgICAgZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBk
b2MgKTsKKyAgICAgICAgICAgIGlmcmFtZS5kZXRhY2goKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQorICAgICAgICBlbGVtZGlzcGxh
eVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BsYXk7Cit9
Cit2YXIgcm1hcmdpbiA9ICggL15tYXJnaW4vICk7CisKK3ZhciBybnVtbm9ucHggPSBuZXcgUmVn
RXhwKCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKTsKKwordmFyIGdldFN0
eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgeworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFPD0xMSss
IEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApCisgICAgICAgIC8vIElFIHRocm93cyBvbiBl
bGVtZW50cyBjcmVhdGVkIGluIHBvcHVwcworICAgICAgICAvLyBGRiBtZWFud2hpbGUgdGhyb3dz
IG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUi
CisgICAgICAgIHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OworCisg
ICAgICAgIGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkgeworICAgICAgICAgICAgdmlldyA9
IHdpbmRvdzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5
bGUoIGVsZW0gKTsKKyAgICB9OworCit2YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25z
LCBjYWxsYmFjaywgYXJncyApIHsKKyAgICB2YXIgcmV0LCBuYW1lLAorICAgICAgICBvbGQgPSB7
fTsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcg
b25lcworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICAgICAgb2xkWyBuYW1lIF0g
PSBlbGVtLnN0eWxlWyBuYW1lIF07CisgICAgICAgIGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlv
bnNbIG5hbWUgXTsKKyAgICB9CisKKyAgICByZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJn
cyB8fCBbXSApOworCisgICAgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCisgICAgZm9yICggbmFt
ZSBpbiBvcHRpb25zICkgeworICAgICAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUg
XTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfTsKKworCit2YXIgZG9jdW1lbnRFbGVtZW50
ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisKKworKCBmdW5jdGlvbigpIHsKKyAgICB2
YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHBpeGVsTWFyZ2luUmln
aHRWYWwsIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCwKKyAgICAgICAgY29udGFpbmVyID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKKyAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCggImRpdiIgKTsKKworICAgIC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24t
YnJvd3NlcikgZW52aXJvbm1lbnRzCisgICAgaWYgKCAhZGl2LnN0eWxlICkgeworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU5LTExKworICAgIC8vIFN0eWxlIG9m
IGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKKyAg
ICBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiY29udGVudC1ib3giOworICAgIGRpdi5jbG9u
ZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiOworICAgIHN1cHBvcnQuY2xl
YXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3gi
OworCisgICAgY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAiYm9yZGVyOjA7d2lkdGg6OHB4O2hl
aWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDsiICsKKyAgICAgICAgInBhZGRpbmc6MDttYXJnaW4t
dG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZSI7CisgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKCBk
aXYgKTsKKworICAgIC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdS
ZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dAorICAgIC8vIHNvIHRoZXkncmUg
ZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24u
CisgICAgZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7CisgICAgICAgIGRpdi5zdHlsZS5j
c3NUZXh0ID0KKworICAgICAgICAgICAgLy8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAy
LjMKKyAgICAgICAgICAgIC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZworICAgICAgICAgICAg
Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94
O2JveC1zaXppbmc6Ym9yZGVyLWJveDsiICsKKyAgICAgICAgICAgICJwb3NpdGlvbjpyZWxhdGl2
ZTtkaXNwbGF5OmJsb2NrOyIgKworICAgICAgICAgICAgIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7
cGFkZGluZzoxcHg7IiArCisgICAgICAgICAgICAidG9wOjElO3dpZHRoOjUwJSI7CisgICAgICAg
IGRpdi5pbm5lckhUTUwgPSAiIjsKKyAgICAgICAgZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxk
KCBjb250YWluZXIgKTsKKworICAgICAgICB2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0
ZWRTdHlsZSggZGl2ICk7CisgICAgICAgIHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3Ag
IT09ICIxJSI7CisgICAgICAgIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCA9IGRpdlN0eWxlLm1hcmdp
bkxlZnQgPT09ICIycHgiOworICAgICAgICBib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxl
LndpZHRoID09PSAiNHB4IjsKKworICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQu
MyBvbmx5CisgICAgICAgIC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2Ug
dmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndAorICAgICAgICBkaXYuc3R5bGUubWFy
Z2luUmlnaHQgPSAiNTAlIjsKKyAgICAgICAgcGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxl
Lm1hcmdpblJpZ2h0ID09PSAiNHB4IjsKKworICAgICAgICBkb2N1bWVudEVsZW1lbnQucmVtb3Zl
Q2hpbGQoIGNvbnRhaW5lciApOworICAgIH0KKworICAgIGpRdWVyeS5leHRlbmQoIHN1cHBvcnQs
IHsKKyAgICAgICAgcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8v
IFRoaXMgdGVzdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UgYnV0IHdlIHN0aWxsIGRvIG1lbW9pemlu
ZworICAgICAgICAgICAgLy8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUg
cHJlLWNvbXB1dGluZy4KKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRl
c3Qgd2FzIGFscmVhZHkgcGVyZm9ybWVkLCB0aG91Z2guCisgICAgICAgICAgICBjb21wdXRlU3R5
bGVUZXN0cygpOworICAgICAgICAgICAgcmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7CisgICAgICAg
IH0sCisgICAgICAgIGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
IGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBj
b21wdXRlU3R5bGVUZXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJv
eFNpemluZ1JlbGlhYmxlVmFsOworICAgICAgICB9LAorICAgICAgICBwaXhlbE1hcmdpblJpZ2h0
OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCA0LjAtNC4z
CisgICAgICAgICAgICAvLyBXZSdyZSBjaGVja2luZyBmb3IgYm94U2l6aW5nUmVsaWFibGVWYWwg
aGVyZSBpbnN0ZWFkIG9mIHBpeGVsTWFyZ2luUmlnaHRWYWwKKyAgICAgICAgICAgIC8vIHNpbmNl
IHRoYXQgY29tcHJlc3NlcyBiZXR0ZXIgYW5kIHRoZXkncmUgY29tcHV0ZWQgdG9nZXRoZXIgYW55
d2F5LgorICAgICAgICAgICAgaWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkgewor
ICAgICAgICAgICAgICAgIGNvbXB1dGVTdHlsZVRlc3RzKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICByZXR1cm4gcGl4ZWxNYXJnaW5SaWdodFZhbDsKKyAgICAgICAgfSwKKyAgICAgICAg
cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgLy8gU3VwcG9y
dDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzcK
KyAgICAgICAgICAgIGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKKyAgICAg
ICAgICAgICAgICBjb21wdXRlU3R5bGVUZXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKKyAgICAgICAgfSwKKyAgICAgICAgcmVs
aWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIFN1cHBvcnQ6
IEFuZHJvaWQgMi4zCisgICAgICAgICAgICAvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3
aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5CisgICAgICAgICAgICAvLyBnZXRz
IGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuICgjMzMz
MykKKyAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJl
dHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAorICAgICAgICAgICAgLy8gVGhpcyBz
dXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMg
bmVlZGVkLgorICAgICAgICAgICAgdmFyIHJldCwKKyAgICAgICAgICAgICAgICBtYXJnaW5EaXYg
PSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKTsKKwor
ICAgICAgICAgICAgLy8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJv
cmRlcjsgcGFkZGluZworICAgICAgICAgICAgbWFyZ2luRGl2LnN0eWxlLmNzc1RleHQgPSBkaXYu
c3R5bGUuY3NzVGV4dCA9CisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDIu
MworICAgICAgICAgICAgICAgIC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZworICAgICAgICAg
ICAgICAgICItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50
LWJveDsiICsKKyAgICAgICAgICAgICAgICAiZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6
MDtwYWRkaW5nOjAiOworICAgICAgICAgICAgbWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0g
bWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOworICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRo
ID0gIjFweCI7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRh
aW5lciApOworCisgICAgICAgICAgICByZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1
dGVkU3R5bGUoIG1hcmdpbkRpdiApLm1hcmdpblJpZ2h0ICk7CisKKyAgICAgICAgICAgIGRvY3Vt
ZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CisgICAgICAgICAgICBkaXYucmVt
b3ZlQ2hpbGQoIG1hcmdpbkRpdiApOworCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAg
ICB9CisgICAgfSApOworfSApKCk7CisKKworZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBj
b21wdXRlZCApIHsKKyAgICB2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAorICAg
ICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKyAgICBjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdl
dFN0eWxlcyggZWxlbSApOworICAgIHJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWQuZ2V0UHJvcGVy
dHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQ7CisKKyAgICAv
LyBTdXBwb3J0OiBPcGVyYSAxMi4xeCBvbmx5CisgICAgLy8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2
ZW4gd2l0aG91dCBjb21wdXRlZAorICAgIC8vIGNvbXB1dGVkIGlzIHVuZGVmaW5lZCBmb3IgZWxl
bXMgb24gZG9jdW1lbnQgZnJhZ21lbnRzCisgICAgaWYgKCAoIHJldCA9PT0gIiIgfHwgcmV0ID09
PSB1bmRlZmluZWQgKSAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVs
ZW0gKSApIHsKKyAgICAgICAgcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogSUU5CisgICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5
IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNykKKyAgICBpZiAoIGNvbXB1dGVkICkg
eworCisgICAgICAgIC8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVk
d2FyZHMiCisgICAgICAgIC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9y
IHNvbWUgdmFsdWVzLAorICAgICAgICAvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkg
cGl4ZWxzLgorICAgICAgICAvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6
CisgICAgICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1
ZXMKKyAgICAgICAgaWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4
LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgeworCisgICAgICAgICAgICAv
LyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgICAgICB3aWR0aCA9IHN0eWxl
LndpZHRoOworICAgICAgICAgICAgbWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsKKyAgICAgICAg
ICAgIG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CisKKyAgICAgICAgICAgIC8vIFB1dCBpbiB0
aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAgICAgICAgICAgIHN0
eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKKyAgICAg
ICAgICAgIHJldCA9IGNvbXB1dGVkLndpZHRoOworCisgICAgICAgICAgICAvLyBSZXZlcnQgdGhl
IGNoYW5nZWQgdmFsdWVzCisgICAgICAgICAgICBzdHlsZS53aWR0aCA9IHdpZHRoOworICAgICAg
ICAgICAgc3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDsKKyAgICAgICAgICAgIHN0eWxlLm1heFdp
ZHRoID0gbWF4V2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0ICE9PSB1
bmRlZmluZWQgPworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFOS0xMSsKKyAgICAgICAgLy8gSUUg
cmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgcmV0ICsgIiIgOgor
ICAgICAgICByZXQ7Cit9CisKKworZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25Gbiwg
aG9va0ZuICkgeworCisgICAgLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUg
Zmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KKyAgICByZXR1cm4geworICAgICAgICBn
ZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCBjb25kaXRpb25GbigpICkgeworCisg
ICAgICAgICAgICAgICAgLy8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0
byB1c2UgaXQgZHVlCisgICAgICAgICAgICAgICAgLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwg
cmVtb3ZlIGl0LgorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmdldDsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhvb2sgbmVlZGVk
OyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFn
YWluLgorICAgICAgICAgICAgcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhp
cywgYXJndW1lbnRzICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisKK3ZhcgorCisgICAgLy8g
U3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZQorICAgIC8v
IGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgorICAgIC8v
IFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5v
cmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAgIHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFi
bGUoPyEtY1tlYV0pLispLywKKworICAgIGNzc1Nob3cgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUi
LCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheTogImJsb2NrIiB9LAorICAgIGNzc05vcm1h
bFRyYW5zZm9ybSA9IHsKKyAgICAgICAgbGV0dGVyU3BhY2luZzogIjAiLAorICAgICAgICBmb250
V2VpZ2h0OiAiNDAwIgorICAgIH0sCisKKyAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJP
IiwgIk1veiIsICJtcyIgXSwKKyAgICBlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggImRpdiIgKS5zdHlsZTsKKworLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBh
IHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQorZnVuY3Rpb24gdmVuZG9yUHJv
cE5hbWUoIG5hbWUgKSB7CisKKyAgICAvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90
IHZlbmRvciBwcmVmaXhlZAorICAgIGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkgeworICAgICAg
ICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVk
IG5hbWVzCisgICAgdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUu
c2xpY2UoIDEgKSwKKyAgICAgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKKworICAgIHdoaWxl
ICggaS0tICkgeworICAgICAgICBuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7Cisg
ICAgICAgIGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkgeworICAgICAgICAgICAgcmV0dXJuIG5h
bWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Z1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBl
bGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7CisKKyAgICAvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFs
dWVzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgLy8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50Cisg
ICAgdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CisgICAgcmV0dXJuIG1hdGNo
ZXMgPworCisgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUu
Zy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcworICAgICAgICBNYXRoLm1heCggMCwgbWF0Y2hl
c1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8ICJweCIgKSA6
CisgICAgICAgIHZhbHVlOworfQorCitmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxl
bSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7CisgICAgdmFyIGkgPSBleHRy
YSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPworCisgICAgICAg
IC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21l
bnRhdGlvbgorICAgICAgICA0IDoKKworICAgICAgICAvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBm
b3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCisgICAgICAgIG5hbWUgPT09ICJ3
aWR0aCIgPyAxIDogMCwKKworICAgICAgICB2YWwgPSAwOworCisgICAgZm9yICggOyBpIDwgNDsg
aSArPSAyICkgeworCisgICAgICAgIC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwg
c28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICAgICAgaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIg
KSB7CisgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBh
bmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzQm9y
ZGVyQm94ICkgeworCisgICAgICAgICAgICAvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcs
IHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQKKyAgICAgICAgICAgIGlmICggZXh0cmEg
PT09ICJjb250ZW50IiApIHsKKyAgICAgICAgICAgICAgICB2YWwgLT0galF1ZXJ5LmNzcyggZWxl
bSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIg
bm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgorICAgICAgICAgICAgaWYgKCBleHRyYSAhPT0g
Im1hcmdpbiIgKSB7CisgICAgICAgICAgICAgICAgdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJi
b3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2lu
dCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKKyAgICAgICAgICAgIHZhbCAr
PSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5
bGVzICk7CisKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRl
bnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXIKKyAgICAgICAgICAgIGlmICggZXh0cmEgIT09
ICJwYWRkaW5nIiApIHsKKyAgICAgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwg
ImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbDsKK30KKworZnVu
Y3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7CisKKyAgICAvLyBT
dGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9y
ZGVyLWJveCB2YWx1ZQorICAgIHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKKyAgICAgICAg
dmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhl
aWdodCwKKyAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCisgICAgICAgIGlzQm9y
ZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9
PT0gImJvcmRlci1ib3giOworCisgICAgLy8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4g
dW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkCisg
ICAgLy8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NjQ5Mjg1CisgICAgLy8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDkxNjY4CisgICAgaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHsK
KworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBp
ZiBuZWNlc3NhcnkKKyAgICAgICAgdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsK
KyAgICAgICAgaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgeworICAgICAgICAgICAgdmFs
ID0gZWxlbS5zdHlsZVsgbmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcHV0ZWQg
dW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi4KKyAgICAgICAgaWYgKCBy
bnVtbm9ucHgudGVzdCggdmFsICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNo
IHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKKyAgICAgICAgLy8gZm9yIGdldENvbXB1dGVkU3R5
bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQorICAgICAg
ICB2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiYKKyAgICAgICAgICAgICggc3VwcG9y
dC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7CisK
KyAgICAgICAgLy8gTm9ybWFsaXplICIiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmEKKyAg
ICAgICAgdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKKyAgICB9CisKKyAgICAvLyBVc2Ug
dGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0
eWxlcworICAgIHJldHVybiAoIHZhbCArCisgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KAor
ICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBleHRyYSB8
fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKKyAgICAgICAgICAgIHZh
bHVlSXNCb3JkZXJCb3gsCisgICAgICAgICAgICBzdHlsZXMKKyAgICAgICAgKQorICAgICkgKyAi
cHgiOworfQorCitmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7CisgICAgdmFy
IGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKKyAgICAgICAgdmFsdWVzID0gW10sCisgICAgICAgIGlu
ZGV4ID0gMCwKKyAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCisgICAgZm9yICgg
OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgZWxlbSA9IGVsZW1lbnRzWyBp
bmRleCBdOworICAgICAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQo
IGVsZW0sICJvbGRkaXNwbGF5IiApOworICAgICAgICBkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNw
bGF5OworICAgICAgICBpZiAoIHNob3cgKSB7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBp
bmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKKyAgICAgICAg
ICAgIC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKKyAgICAgICAgICAg
IGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSAibm9uZSIgKSB7CisgICAgICAg
ICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRp
c3BsYXk6IG5vbmUKKyAgICAgICAgICAgIC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0
aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzCisgICAgICAgICAgICAvLyBmb3Igc3VjaCBhbiBl
bGVtZW50CisgICAgICAgICAgICBpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNI
aWRkZW4oIGVsZW0gKSApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbIGluZGV4IF0gPSBkYXRh
UHJpdi5hY2Nlc3MoCisgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAgICAg
ICAgICJvbGRkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXkoIGVs
ZW0ubm9kZU5hbWUgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApOworCisgICAg
ICAgICAgICBpZiAoIGRpc3BsYXkgIT09ICJub25lIiB8fCAhaGlkZGVuICkgeworICAgICAgICAg
ICAgICAgIGRhdGFQcml2LnNldCgKKyAgICAgICAgICAgICAgICAgICAgZWxlbSwKKyAgICAgICAg
ICAgICAgICAgICAgIm9sZGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPyBk
aXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkKKyAgICAgICAgICAgICAgICAp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBkaXNw
bGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKyAgICAvLyB0byBh
dm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxl
bmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOworICAg
ICAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8
fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgeworICAgICAgICAgICAgZWxlbS5zdHlsZS5k
aXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCAiIiA6ICJub25lIjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBlbGVtZW50czsKK30KKworalF1ZXJ5LmV4dGVuZCggewor
CisgICAgLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBk
ZWZhdWx0CisgICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHBy
b3BlcnR5CisgICAgY3NzSG9va3M6IHsKKyAgICAgICAgb3BhY2l0eTogeworICAgICAgICAgICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBj
b21wdXRlZCApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGdl
dCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQorICAgICAgICAgICAgICAgICAgICB2YXIgcmV0
ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfSwKKworICAgIC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkICJw
eCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllcworICAgIGNzc051bWJlcjog
eworICAgICAgICAiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAorICAgICAgICAiY29s
dW1uQ291bnQiOiB0cnVlLAorICAgICAgICAiZmlsbE9wYWNpdHkiOiB0cnVlLAorICAgICAgICAi
ZmxleEdyb3ciOiB0cnVlLAorICAgICAgICAiZmxleFNocmluayI6IHRydWUsCisgICAgICAgICJm
b250V2VpZ2h0IjogdHJ1ZSwKKyAgICAgICAgImxpbmVIZWlnaHQiOiB0cnVlLAorICAgICAgICAi
b3BhY2l0eSI6IHRydWUsCisgICAgICAgICJvcmRlciI6IHRydWUsCisgICAgICAgICJvcnBoYW5z
IjogdHJ1ZSwKKyAgICAgICAgIndpZG93cyI6IHRydWUsCisgICAgICAgICJ6SW5kZXgiOiB0cnVl
LAorICAgICAgICAiem9vbSI6IHRydWUKKyAgICB9LAorCisgICAgLy8gQWRkIGluIHByb3BlcnRp
ZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQorICAgIC8vIHNldHRpbmcgb3Ig
Z2V0dGluZyB0aGUgdmFsdWUKKyAgICBjc3NQcm9wczogeworICAgICAgICAiZmxvYXQiOiAiY3Nz
RmxvYXQiCisgICAgfSwKKworICAgIC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBv
biBhIERPTSBOb2RlCisgICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0
cmEgKSB7CisKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50
IG5vZGVzCisgICAgICAgIGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVt
Lm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRo
IHRoZSByaWdodCBuYW1lCisgICAgICAgIHZhciByZXQsIHR5cGUsIGhvb2tzLAorICAgICAgICAg
ICAgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCisgICAgICAgICAgICBzdHls
ZSA9IGVsZW0uc3R5bGU7CisKKyAgICAgICAgbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05h
bWUgXSB8fAorICAgICAgICAgICAgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5k
b3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApOworCisgICAgICAgIC8vIEdldHMg
aG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uCisg
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tz
WyBvcmlnTmFtZSBdOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1
ZQorICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICB0eXBl
ID0gdHlwZW9mIHZhbHVlOworCisgICAgICAgICAgICAvLyBDb252ZXJ0ICIrPSIgb3IgIi09IiB0
byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSkKKyAgICAgICAgICAgIGlmICggdHlwZSA9PT0gInN0
cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsK
KyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7CisK
KyAgICAgICAgICAgICAgICAvLyBGaXhlcyBidWcgIzkyMzcKKyAgICAgICAgICAgICAgICB0eXBl
ID0gIm51bWJlciI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0
aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpCisgICAgICAgICAgICBp
ZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgeworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSBudW1iZXIgd2Fz
IHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRp
ZXMpCisgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJudW1iZXIiICkgeworICAgICAgICAgICAg
ICAgIHZhbHVlICs9IHJldCAmJiByZXRbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIG9yaWdO
YW1lIF0gPyAiIiA6ICJweCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3Vw
cG9ydDogSUU5LTExKworICAgICAgICAgICAgLy8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBv
cmlnaW5hbCBjbG9uZSdzIHZhbHVlcworICAgICAgICAgICAgaWYgKCAhc3VwcG9ydC5jbGVhckNs
b25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkg
PT09IDAgKSB7CisgICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNl
IHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAg
ICAgICAgICBpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8CisgICAgICAgICAg
ICAgICAgKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5k
ZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9IHZhbHVlOworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIElmIGEgaG9v
ayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAg
ICAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJgorICAgICAgICAgICAgICAg
ICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQg
KSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9i
amVjdAorICAgICAgICAgICAgcmV0dXJuIHN0eWxlWyBuYW1lIF07CisgICAgICAgIH0KKyAgICB9
LAorCisgICAgY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKKyAg
ICAgICAgdmFyIHZhbCwgbnVtLCBob29rcywKKyAgICAgICAgICAgIG9yaWdOYW1lID0galF1ZXJ5
LmNhbWVsQ2FzZSggbmFtZSApOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdv
cmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorICAgICAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3Bz
WyBvcmlnTmFtZSBdIHx8CisgICAgICAgICAgICAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUg
XSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7CisKKyAgICAgICAg
Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZQorICAg
ICAgICBob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sg
b3JpZ05hbWUgXTsKKworICAgICAgICAvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUg
Y29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAgICAgICBpZiAoIGhvb2tzICYmICJnZXQiIGlu
IGhvb2tzICkgeworICAgICAgICAgICAgdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRy
YSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQg
dGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKKyAgICAgICAgaWYgKCB2YWwgPT09
IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgIHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5
bGVzICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1
dGVkIHZhbHVlCisgICAgICAgIGlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05v
cm1hbFRyYW5zZm9ybSApIHsKKyAgICAgICAgICAgIHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsg
bmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBv
ciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisgICAgICAg
IGlmICggZXh0cmEgPT09ICIiIHx8IGV4dHJhICkgeworICAgICAgICAgICAgbnVtID0gcGFyc2VG
bG9hdCggdmFsICk7CisgICAgICAgICAgICByZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5p
dGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZh
bDsKKyAgICB9Cit9ICk7CisKK2pRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1
bmN0aW9uKCBpLCBuYW1lICkgeworICAgIGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0geworICAg
ICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisgICAgICAgICAg
ICBpZiAoIGNvbXB1dGVkICkgeworCisgICAgICAgICAgICAgICAgLy8gQ2VydGFpbiBlbGVtZW50
cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCisgICAg
ICAgICAgICAgICAgLy8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0
aGF0IHdvdWxkIGJlbmVmaXQKKyAgICAgICAgICAgICAgICByZXR1cm4gcmRpc3BsYXlzd2FwLnRl
c3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKKyAgICAgICAgICAgICAgICAg
ICAgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBzd2Fw
KCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0gKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaWR0aE9y
SGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAgICAgICAgICAgfQorICAgICAgICB9LAor
CisgICAgICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHsKKyAgICAgICAg
ICAgIHZhciBtYXRjaGVzLAorICAgICAgICAgICAgICAgIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0
eWxlcyggZWxlbSApLAorICAgICAgICAgICAgICAgIHN1YnRyYWN0ID0gZXh0cmEgJiYgYXVnbWVu
dFdpZHRoT3JIZWlnaHQoCisgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAg
ICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhLAorICAgICAgICAgICAgICAg
ICAgICBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAi
Ym9yZGVyLWJveCIsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlcworICAgICAgICAgICAgICAg
ICk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1l
bnQgaXMgbmVlZGVkCisgICAgICAgICAgICBpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJj
c3NOdW0uZXhlYyggdmFsdWUgKSApICYmCisgICAgICAgICAgICAgICAgKCBtYXRjaGVzWyAzIF0g
fHwgInB4IiApICE9PSAicHgiICkgeworCisgICAgICAgICAgICAgICAgZWxlbS5zdHlsZVsgbmFt
ZSBdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBu
YW1lICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzZXRQb3NpdGl2ZU51
bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CisgICAgICAgIH0KKyAgICB9OworfSApOwor
CitqUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxp
YWJsZU1hcmdpbkxlZnQsCisgICAgZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgICAg
ICBpZiAoIGNvbXB1dGVkICkgeworICAgICAgICAgICAgcmV0dXJuICggcGFyc2VGbG9hdCggY3Vy
Q1NTKCBlbGVtLCAibWFyZ2luTGVmdCIgKSApIHx8CisgICAgICAgICAgICAgICAgZWxlbS5nZXRC
b3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KKyAgICAgICAgICAgICAgICAgICAgc3dhcCggZWxl
bSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKKyAgICAgICAgICAg
ICAgICAgICAgfSApCisgICAgICAgICAgICAgICAgKSArICJweCI7CisgICAgICAgIH0KKyAgICB9
CispOworCisvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMworalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJp
Z2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsCisgICAgZnVu
Y3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgICAgICBpZiAoIGNvbXB1dGVkICkgeworICAg
ICAgICAgICAgcmV0dXJuIHN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9
LAorICAgICAgICAgICAgICAgIGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmlnaHQiIF0gKTsKKyAg
ICAgICAgfQorICAgIH0KKyk7CisKKy8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUg
dG8gZXhwYW5kIHByb3BlcnRpZXMKK2pRdWVyeS5lYWNoKCB7CisgICAgbWFyZ2luOiAiIiwKKyAg
ICBwYWRkaW5nOiAiIiwKKyAgICBib3JkZXI6ICJXaWR0aCIKK30sIGZ1bmN0aW9uKCBwcmVmaXgs
IHN1ZmZpeCApIHsKKyAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0gewor
ICAgICAgICBleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBpID0g
MCwKKyAgICAgICAgICAgICAgICBleHBhbmRlZCA9IHt9LAorCisgICAgICAgICAgICAgICAgLy8g
QXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nCisgICAgICAgICAgICAgICAg
cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciID8gdmFsdWUuc3BsaXQoICIgIiApIDog
WyB2YWx1ZSBdOworCisgICAgICAgICAgICBmb3IgKCA7IGkgPCA0OyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPQor
ICAgICAgICAgICAgICAgICAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRz
WyAwIF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBleHBhbmRlZDsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICBpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgewor
ICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0
aXZlTnVtYmVyOworICAgIH0KK30gKTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGNzczog
ZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBm
dW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIgc3R5bGVzLCBs
ZW4sCisgICAgICAgICAgICAgICAgbWFwID0ge30sCisgICAgICAgICAgICAgICAgaSA9IDA7CisK
KyAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsKKyAgICAgICAgICAg
ICAgICBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBu
YW1lLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgewor
ICAgICAgICAgICAgICAgICAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwg
bmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJu
IHZhbHVlICE9PSB1bmRlZmluZWQgPworICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggZWxl
bSwgbmFtZSwgdmFsdWUgKSA6CisgICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgbmFt
ZSApOworICAgICAgICB9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKyAg
ICB9LAorICAgIHNob3c6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gc2hvd0hpZGUoIHRo
aXMsIHRydWUgKTsKKyAgICB9LAorICAgIGhpZGU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1
cm4gc2hvd0hpZGUoIHRoaXMgKTsKKyAgICB9LAorICAgIHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRl
ICkgeworICAgICAgICBpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gImJvb2xlYW4iICkgeworICAgICAg
ICAgICAgcmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
aWYgKCBpc0hpZGRlbiggdGhpcyApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyAp
LnNob3coKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0
aGlzICkuaGlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfQorfSApOwor
CisKK2Z1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsK
KyAgICByZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9w
LCBlbmQsIGVhc2luZyApOworfQoralF1ZXJ5LlR3ZWVuID0gVHdlZW47CisKK1R3ZWVuLnByb3Rv
dHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogVHdlZW4sCisgICAgaW5pdDogZnVuY3Rpb24oIGVs
ZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgeworICAgICAgICB0aGlzLmVs
ZW0gPSBlbGVtOworICAgICAgICB0aGlzLnByb3AgPSBwcm9wOworICAgICAgICB0aGlzLmVhc2lu
ZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OworICAgICAgICB0aGlzLm9wdGlv
bnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigp
OworICAgICAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICAgICAgdGhpcy51bml0ID0gdW5pdCB8fCAo
IGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOworICAgIH0sCisgICAgY3Vy
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlz
LnByb3AgXTsKKworICAgICAgICByZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KKyAgICAgICAg
ICAgIGhvb2tzLmdldCggdGhpcyApIDoKKyAgICAgICAgICAgIFR3ZWVuLnByb3BIb29rcy5fZGVm
YXVsdC5nZXQoIHRoaXMgKTsKKyAgICB9LAorICAgIHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7
CisgICAgICAgIHZhciBlYXNlZCwKKyAgICAgICAgICAgIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tz
WyB0aGlzLnByb3AgXTsKKworICAgICAgICBpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsK
KyAgICAgICAgICAgIHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2lu
ZyBdKAorICAgICAgICAgICAgICAgIHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBl
cmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbgorICAgICAgICAgICAgKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50OworICAg
ICAgICB9CisgICAgICAgIHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVh
c2VkICsgdGhpcy5zdGFydDsKKworICAgICAgICBpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgewor
ICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywg
dGhpcyApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7
CisgICAgICAgICAgICBob29rcy5zZXQoIHRoaXMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9OworCitUd2Vlbi5wcm90b3R5cGUuaW5pdC5w
cm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVuLnByb3BIb29rcyA9IHsKKyAgICBf
ZGVmYXVsdDogeworICAgICAgICBnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKyAgICAgICAgICAg
IHZhciByZXN1bHQ7CisKKyAgICAgICAgICAgIC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVt
ZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsCisgICAgICAgICAgICAv
LyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3Rz
LgorICAgICAgICAgICAgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CisgICAgICAg
ICAgICAgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5z
dHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR3
ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
UGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBh
dXRvbWF0aWNhbGx5CisgICAgICAgICAgICAvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFs
bGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgorICAgICAgICAgICAgLy8gU2lt
cGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0OworICAgICAgICAg
ICAgLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQg
YXMtaXMuCisgICAgICAgICAgICByZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vl
bi5wcm9wLCAiIiApOworCisgICAgICAgICAgICAvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRl
ZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAuCisgICAgICAgICAgICByZXR1cm4g
IXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CisgICAgICAgIH0sCisg
ICAgICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgeworCisgICAgICAgICAgICAvLyBVc2Ugc3Rl
cCBob29rIGZvciBiYWNrIGNvbXBhdC4KKyAgICAgICAgICAgIC8vIFVzZSBjc3NIb29rIGlmIGl0
cyB0aGVyZS4KKyAgICAgICAgICAgIC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2Ug
cGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCisgICAgICAgICAgICBpZiAoIGpRdWVy
eS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LmZ4LnN0
ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR3ZWVu
LmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKKyAgICAgICAgICAgICAgICAoIHR3ZWVuLmVsZW0uc3R5
bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fAorICAgICAgICAg
ICAgICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgeworICAgICAgICAg
ICAgICAgIGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsg
dHdlZW4udW5pdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0d2Vl
bi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9Cit9OworCisvLyBTdXBwb3J0OiBJRTkKKy8vIFBhbmljIGJhc2VkIGFwcHJvYWNo
IHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2RlcworVHdlZW4ucHJvcEhvb2tz
LnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0geworICAgIHNldDogZnVu
Y3Rpb24oIHR3ZWVuICkgeworICAgICAgICBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdl
ZW4uZWxlbS5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJv
cCBdID0gdHdlZW4ubm93OworICAgICAgICB9CisgICAgfQorfTsKKworalF1ZXJ5LmVhc2luZyA9
IHsKKyAgICBsaW5lYXI6IGZ1bmN0aW9uKCBwICkgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9
LAorICAgIHN3aW5nOiBmdW5jdGlvbiggcCApIHsKKyAgICAgICAgcmV0dXJuIDAuNSAtIE1hdGgu
Y29zKCBwICogTWF0aC5QSSApIC8gMjsKKyAgICB9LAorICAgIF9kZWZhdWx0OiAic3dpbmciCit9
OworCitqUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsKKworLy8gQmFjayBDb21wYXQg
PDEuOCBleHRlbnNpb24gcG9pbnQKK2pRdWVyeS5meC5zdGVwID0ge307CisKKworCisKK3Zhcgor
ICAgIGZ4Tm93LCB0aW1lcklkLAorICAgIHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRl
KSQvLAorICAgIHJydW4gPSAvcXVldWVIb29rcyQvOworCisvLyBBbmltYXRpb25zIGNyZWF0ZWQg
c3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5CitmdW5jdGlvbiBjcmVhdGVGeE5v
dygpIHsKKyAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CisgICAgICAgIGZ4Tm93
ID0gdW5kZWZpbmVkOworICAgIH0gKTsKKyAgICByZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3co
KSApOworfQorCisvLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFu
aW1hdGlvbgorZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsKKyAgICB2YXIg
d2hpY2gsCisgICAgICAgIGkgPSAwLAorICAgICAgICBhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07
CisKKyAgICAvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxs
IGNzc0V4cGFuZCB2YWx1ZXMsCisgICAgLy8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBz
a2lwIG92ZXIgTGVmdCBhbmQgUmlnaHQKKyAgICBpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGgg
PyAxIDogMDsKKyAgICBmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkgewor
ICAgICAgICB3aGljaCA9IGNzc0V4cGFuZFsgaSBdOworICAgICAgICBhdHRyc1sgIm1hcmdpbiIg
KyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworICAgIH0KKwor
ICAgIGlmICggaW5jbHVkZVdpZHRoICkgeworICAgICAgICBhdHRycy5vcGFjaXR5ID0gYXR0cnMu
d2lkdGggPSB0eXBlOworICAgIH0KKworICAgIHJldHVybiBhdHRyczsKK30KKworZnVuY3Rpb24g
Y3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7CisgICAgdmFyIHR3ZWVuLAor
ICAgICAgICBjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSAp
LmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAorICAgICAgICBpbmRleCA9IDAs
CisgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOworICAgIGZvciAoIDsgaW5kZXgg
PCBsZW5ndGg7IGluZGV4KysgKSB7CisgICAgICAgIGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25b
IGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7CisKKyAgICAgICAg
ICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CisgICAgICAgICAgICByZXR1cm4g
dHdlZW47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Z1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIo
IGVsZW0sIHByb3BzLCBvcHRzICkgeworICAgIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi8K
KyAgICB2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLCBkaXNw
bGF5LCBjaGVja0Rpc3BsYXksCisgICAgICAgIGFuaW0gPSB0aGlzLAorICAgICAgICBvcmlnID0g
e30sCisgICAgICAgIHN0eWxlID0gZWxlbS5zdHlsZSwKKyAgICAgICAgaGlkZGVuID0gZWxlbS5u
b2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLAorICAgICAgICBkYXRhU2hvdyA9IGRhdGFQcml2
LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKKworICAgIC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJv
bWlzZXMKKyAgICBpZiAoICFvcHRzLnF1ZXVlICkgeworICAgICAgICBob29rcyA9IGpRdWVyeS5f
cXVldWVIb29rcyggZWxlbSwgImZ4IiApOworICAgICAgICBpZiAoIGhvb2tzLnVucXVldWVkID09
IG51bGwgKSB7CisgICAgICAgICAgICBob29rcy51bnF1ZXVlZCA9IDA7CisgICAgICAgICAgICBv
bGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKKyAgICAgICAgICAgIGhvb2tzLmVtcHR5LmZpcmUg
PSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoICFob29rcy51bnF1ZXVlZCApIHsK
KyAgICAgICAgICAgICAgICAgICAgb2xkZmlyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgaG9va3MudW5xdWV1ZWQrKzsKKworICAgICAg
ICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUg
Y29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCisgICAgICAg
ICAgICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaG9va3MudW5x
dWV1ZWQtLTsKKyAgICAgICAgICAgICAgICBpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIg
KS5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgIGhvb2tzLmVtcHR5LmZpcmUoKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0gKTsKKyAgICB9CisK
KyAgICAvLyBIZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzcworICAgIGlmICggZWxlbS5ub2RlVHlw
ZSA9PT0gMSAmJiAoICJoZWlnaHQiIGluIHByb3BzIHx8ICJ3aWR0aCIgaW4gcHJvcHMgKSApIHsK
KworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKKyAgICAgICAg
Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90
CisgICAgICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dY
IGFuZAorICAgICAgICAvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQorICAg
ICAgICBvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBz
dHlsZS5vdmVyZmxvd1kgXTsKKworICAgICAgICAvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBp
bmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAorICAgICAgICAvLyBhbmltYXRpb25zIG9uIGlu
bGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkCisgICAg
ICAgIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKKworICAgICAgICAv
LyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAibm9uZSIKKyAg
ICAgICAgY2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gIm5vbmUiID8KKyAgICAgICAgICAgIGRh
dGFQcml2LmdldCggZWxlbSwgIm9sZGRpc3BsYXkiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0u
bm9kZU5hbWUgKSA6IGRpc3BsYXk7CisKKyAgICAgICAgaWYgKCBjaGVja0Rpc3BsYXkgPT09ICJp
bmxpbmUiICYmIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgeworICAg
ICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOworICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKCBvcHRzLm92ZXJmbG93ICkgeworICAgICAgICBzdHlsZS5vdmVyZmxvdyA9
ICJoaWRkZW4iOworICAgICAgICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKyAgICAgICAgICAgIHN0eWxl
Lm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKKyAgICAgICAgICAgIHN0eWxlLm92ZXJm
bG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKKyAgICAgICAgfSApOworICAgIH0KKworICAgIC8v
IHNob3cvaGlkZSBwYXNzCisgICAgZm9yICggcHJvcCBpbiBwcm9wcyApIHsKKyAgICAgICAgdmFs
dWUgPSBwcm9wc1sgcHJvcCBdOworICAgICAgICBpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkg
KSB7CisgICAgICAgICAgICBkZWxldGUgcHJvcHNbIHByb3AgXTsKKyAgICAgICAgICAgIHRvZ2ds
ZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2dsZSI7CisgICAgICAgICAgICBpZiAoIHZhbHVl
ID09PSAoIGhpZGRlbiA/ICJoaWRlIiA6ICJzaG93IiApICkgeworCisgICAgICAgICAgICAgICAg
Ly8gSWYgdGhlcmUgaXMgZGF0YVNob3cgbGVmdCBvdmVyIGZyb20gYSBzdG9wcGVkIGhpZGUgb3Ig
c2hvdworICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRo
IHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgorICAgICAgICAgICAgICAgIGlm
ICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1
bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3JpZ1sgcHJvcCBdID0gZGF0
YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsK
KworICAgICAgICAvLyBBbnkgbm9uLWZ4IHZhbHVlIHN0b3BzIHVzIGZyb20gcmVzdG9yaW5nIHRo
ZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBk
aXNwbGF5ID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhalF1ZXJ5
LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKKyAgICAgICAgaWYgKCBkYXRhU2hvdyApIHsKKyAg
ICAgICAgICAgIGlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7CisgICAgICAgICAgICAgICAg
aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sICJmeHNob3ci
LCB7fSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2ds
ZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byAicmV2ZXJzZSIKKyAgICAgICAgaWYgKCB0
b2dnbGUgKSB7CisgICAgICAgICAgICBkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuOworICAgICAg
ICB9CisgICAgICAgIGlmICggaGlkZGVuICkgeworICAgICAgICAgICAgalF1ZXJ5KCBlbGVtICku
c2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5pbS5kb25lKCBmdW5jdGlv
bigpIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5oaWRlKCk7CisgICAgICAgICAg
ICB9ICk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIHZhciBwcm9wOworCisgICAgICAgICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJm
eHNob3ciICk7CisgICAgICAgICAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAgICAgICAg
ICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSApOworICAgICAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAg
ICAgICAgICB0d2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDog
MCwgcHJvcCwgYW5pbSApOworCisgICAgICAgICAgICBpZiAoICEoIHByb3AgaW4gZGF0YVNob3cg
KSApIHsKKyAgICAgICAgICAgICAgICBkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7Cisg
ICAgICAgICAgICAgICAgaWYgKCBoaWRkZW4gKSB7CisgICAgICAgICAgICAgICAgICAgIHR3ZWVu
LmVuZCA9IHR3ZWVuLnN0YXJ0OworICAgICAgICAgICAgICAgICAgICB0d2Vlbi5zdGFydCA9IHBy
b3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIgPyAxIDogMDsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgYSBu
b29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2
YWx1ZQorICAgIH0gZWxzZSBpZiAoICggZGlzcGxheSA9PT0gIm5vbmUiID8gZGVmYXVsdERpc3Bs
YXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkgKSA9PT0gImlubGluZSIgKSB7CisgICAgICAg
IHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5OworICAgIH0KK30KKworZnVuY3Rpb24gcHJvcEZpbHRl
ciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7CisgICAgdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcs
IHZhbHVlLCBob29rczsKKworICAgIC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhw
YW5kIGNzc0hvb2sgcGFzcworICAgIGZvciAoIGluZGV4IGluIHByb3BzICkgeworICAgICAgICBu
YW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKKyAgICAgICAgZWFzaW5nID0gc3BlY2lh
bEVhc2luZ1sgbmFtZSBdOworICAgICAgICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOworICAgICAg
ICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworICAgICAgICAgICAgZWFzaW5nID0g
dmFsdWVbIDEgXTsKKyAgICAgICAgICAgIHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsg
MCBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICAg
ICAgICAgIHByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sg
aW5kZXggXTsKKyAgICAgICAgfQorCisgICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBu
YW1lIF07CisgICAgICAgIGlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CisgICAg
ICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKKyAgICAgICAgICAgIGRlbGV0
ZSBwcm9wc1sgbmFtZSBdOworCisgICAgICAgICAgICAvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRo
aXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCisgICAgICAgICAgICAvLyBSZXVzaW5n
ICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgorICAgICAgICAgICAg
Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBp
biBwcm9wcyApICkgeworICAgICAgICAgICAgICAgICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVl
WyBpbmRleCBdOworICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0g
ZWFzaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICAgICAg
fQorICAgIH0KK30KKworZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRp
b25zICkgeworICAgIHZhciByZXN1bHQsCisgICAgICAgIHN0b3BwZWQsCisgICAgICAgIGluZGV4
ID0gMCwKKyAgICAgICAgbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAorICAg
ICAgICBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7CisK
KyAgICAgICAgICAgIC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3Rv
cgorICAgICAgICAgICAgZGVsZXRlIHRpY2suZWxlbTsKKyAgICAgICAgfSApLAorICAgICAgICB0
aWNrID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoIHN0b3BwZWQgKSB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGN1
cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKKyAgICAgICAgICAgICAgICByZW1h
aW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJh
dGlvbiAtIGN1cnJlbnRUaW1lICksCisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRy
b2lkIDIuMworICAgICAgICAgICAgICAgIC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93
IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKKyAgICAgICAgICAgICAgICB0
ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsCisgICAgICAgICAgICAg
ICAgcGVyY2VudCA9IDEgLSB0ZW1wLAorICAgICAgICAgICAgICAgIGluZGV4ID0gMCwKKyAgICAg
ICAgICAgICAgICBsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDsKKworICAgICAgICAg
ICAgZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgICAgICAgICAg
YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBl
cmNlbnQsIHJlbWFpbmluZyBdICk7CisKKyAgICAgICAgICAgIGlmICggcGVyY2VudCA8IDEgJiYg
bGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBb
IGFuaW1hdGlvbiBdICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgfQorICAgICAgICB9LAorICAgICAgICBhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7
CisgICAgICAgICAgICBlbGVtOiBlbGVtLAorICAgICAgICAgICAgcHJvcHM6IGpRdWVyeS5leHRl
bmQoIHt9LCBwcm9wZXJ0aWVzICksCisgICAgICAgICAgICBvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0
cnVlLCB7CisgICAgICAgICAgICAgICAgc3BlY2lhbEVhc2luZzoge30sCisgICAgICAgICAgICAg
ICAgZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CisgICAgICAgICAgICB9LCBvcHRpb25z
ICksCisgICAgICAgICAgICBvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCisgICAgICAg
ICAgICBvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCisgICAgICAgICAgICBzdGFydFRpbWU6IGZ4
Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJh
dGlvbiwKKyAgICAgICAgICAgIHR3ZWVuczogW10sCisgICAgICAgICAgICBjcmVhdGVUd2Vlbjog
ZnVuY3Rpb24oIHByb3AsIGVuZCApIHsKKyAgICAgICAgICAgICAgICB2YXIgdHdlZW4gPSBqUXVl
cnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsCisgICAgICAgICAgICAg
ICAgICAgICAgICBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0
aW9uLm9wdHMuZWFzaW5nICk7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnR3ZWVucy5wdXNo
KCB0d2VlbiApOworICAgICAgICAgICAgICAgIHJldHVybiB0d2VlbjsKKyAgICAgICAgICAgIH0s
CisgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKKyAgICAgICAgICAgICAg
ICB2YXIgaW5kZXggPSAwLAorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBnb2lu
ZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucworICAgICAgICAgICAg
ICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnQKKyAgICAgICAgICAgICAgICAg
ICAgbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKKyAgICAg
ICAgICAgICAgICBpZiAoIHN0b3BwZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKKyAg
ICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTsKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHdoZW4gd2UgcGxh
eWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdAorICAgICAgICAgICAgICAgIGlm
ICggZ290b0VuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0aCgg
ZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJl
ZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOworICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdFdpdGgo
IGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gKSwKKyAg
ICAgICAgcHJvcHMgPSBhbmltYXRpb24ucHJvcHM7CisKKyAgICBwcm9wRmlsdGVyKCBwcm9wcywg
YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOworCisgICAgZm9yICggOyBpbmRleCA8IGxl
bmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgIHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJz
WyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7
CisgICAgICAgIGlmICggcmVzdWx0ICkgeworICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggcmVzdWx0LnN0b3AgKSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuX3F1ZXVlSG9v
a3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQorICAgICAg
ICAgICAgICAgICAgICBqUXVlcnkucHJveHkoIHJlc3VsdC5zdG9wLCByZXN1bHQgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApOworCisgICAg
aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKKyAgICAg
ICAgYW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7CisgICAgfQor
CisgICAgalF1ZXJ5LmZ4LnRpbWVyKAorICAgICAgICBqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7Cisg
ICAgICAgICAgICBlbGVtOiBlbGVtLAorICAgICAgICAgICAgYW5pbTogYW5pbWF0aW9uLAorICAg
ICAgICAgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisgICAgICAgIH0gKQorICAgICk7
CisKKyAgICAvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9ucworICAgIHJldHVybiBhbmlt
YXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKKyAgICAgICAgLmRvbmUo
IGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKyAgICAgICAg
LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKQorICAgICAgICAuYWx3YXlzKCBhbmltYXRpb24u
b3B0cy5hbHdheXMgKTsKK30KKworalF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFu
aW1hdGlvbiwgeworICAgIHR3ZWVuZXJzOiB7CisgICAgICAgICIqIjogWyBmdW5jdGlvbiggcHJv
cCwgdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBw
cm9wLCB2YWx1ZSApOworICAgICAgICAgICAgYWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCBy
Y3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7CisgICAgICAgICAgICByZXR1cm4gdHdlZW47
CisgICAgICAgIH0gXQorICAgIH0sCisKKyAgICB0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNh
bGxiYWNrICkgeworICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkgewor
ICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICAgICAgICAgIHByb3BzID0gWyAiKiIg
XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BzID0gcHJvcHMubWF0Y2goIHJu
b3R3aGl0ZSApOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHByb3AsCisgICAgICAgICAgICBp
bmRleCA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisKKyAgICAgICAg
Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgICAgICBwcm9wID0g
cHJvcHNbIGluZGV4IF07CisgICAgICAgICAgICBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9
IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOworICAgICAgICAgICAgQW5pbWF0aW9u
LnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKKyAgICAgICAgfQorICAgIH0s
CisKKyAgICBwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKKworICAgIHByZWZpbHRl
cjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkgeworICAgICAgICBpZiAoIHByZXBlbmQg
KSB7CisgICAgICAgICAgICBBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayAp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQW5pbWF0aW9uLnByZWZpbHRlcnMucHVz
aCggY2FsbGJhY2sgKTsKKyAgICAgICAgfQorICAgIH0KK30gKTsKKworalF1ZXJ5LnNwZWVkID0g
ZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgeworICAgIHZhciBvcHQgPSBzcGVlZCAmJiB0
eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7
CisgICAgICAgIGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CisgICAgICAgICAgICBq
UXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKyAgICAgICAgZHVyYXRpb246IHNw
ZWVkLAorICAgICAgICBlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5p
c0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcKKyAgICB9OworCisgICAgb3B0LmR1cmF0aW9u
ID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/
CisgICAgICAgIG9wdC5kdXJhdGlvbiA6IG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRz
ID8KKyAgICAgICAgICAgIGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5
LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworICAgIC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVl
L3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9w
dC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKyAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsKKyAgICB9CisK
KyAgICAvLyBRdWV1ZWluZworICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisKKyAgICBvcHQu
Y29tcGxldGUgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
b3B0Lm9sZCApICkgeworICAgICAgICAgICAgb3B0Lm9sZC5jYWxsKCB0aGlzICk7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIG9wdC5xdWV1ZSApIHsKKyAgICAgICAgICAgIGpRdWVyeS5kZXF1
ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4g
b3B0OworfTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGZhZGVUbzogZnVuY3Rpb24oIHNw
ZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsKKworICAgICAgICAvLyBTaG93IGFueSBoaWRk
ZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKKyAgICAgICAgcmV0dXJuIHRo
aXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCisKKyAgICAg
ICAgICAgIC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAorICAgICAgICAgICAgLmVu
ZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsK
KyAgICB9LAorICAgIGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxs
YmFjayApIHsKKyAgICAgICAgdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3Ag
KSwKKyAgICAgICAgICAgIG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2Fs
bGJhY2sgKSwKKyAgICAgICAgICAgIGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7CisKKyAgICAg
ICAgICAgICAgICAvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBl
YXNpbmcgd29uJ3QgYmUgbG9zdAorICAgICAgICAgICAgICAgIHZhciBhbmltID0gQW5pbWF0aW9u
KCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTsKKworICAgICAgICAg
ICAgICAgIC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlh
dGVseQorICAgICAgICAgICAgICAgIGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCAi
ZmluaXNoIiApICkgeworICAgICAgICAgICAgICAgICAgICBhbmltLnN0b3AoIHRydWUgKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZG9BbmltYXRpb24u
ZmluaXNoID0gZG9BbmltYXRpb247CisKKyAgICAgICAgcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5x
dWV1ZSA9PT0gZmFsc2UgPworICAgICAgICAgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoK
KyAgICAgICAgICAgIHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTsKKyAg
ICB9LAorICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewor
ICAgICAgICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgeworICAgICAgICAgICAg
dmFyIHN0b3AgPSBob29rcy5zdG9wOworICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Cisg
ICAgICAgICAgICBzdG9wKCBnb3RvRW5kICk7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKCB0
eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBnb3RvRW5kID0gY2xlYXJR
dWV1ZTsKKyAgICAgICAgICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgICAgICAgICAgdHlwZSA9
IHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAh
PT0gZmFsc2UgKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHZhciBkZXF1ZXVlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBpbmRleCA9IHR5
cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAorICAgICAgICAgICAgICAgIHRpbWVy
cyA9IGpRdWVyeS50aW1lcnMsCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFQcml2LmdldCgg
dGhpcyApOworCisgICAgICAgICAgICBpZiAoIGluZGV4ICkgeworICAgICAgICAgICAgICAgIGlm
ICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICggaW5kZXggaW4gZGF0YSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4
IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICggaW5kZXgg
PSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRpbWVy
c1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmCisgICAgICAgICAgICAgICAgICAgICggdHlwZSA9
PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgeworCisgICAgICAg
ICAgICAgICAgICAgIHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTsKKyAgICAg
ICAgICAgICAgICAgICAgZGVxdWV1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aW1l
cnMuc3BsaWNlKCBpbmRleCwgMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0
IHN0ZXAgd2Fzbid0IGZvcmNlZC4KKyAgICAgICAgICAgIC8vIFRpbWVycyBjdXJyZW50bHkgd2ls
bCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKKyAgICAgICAgICAgIC8vIHdp
bGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC4KKyAgICAgICAgICAgIGlm
ICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1
ZSggdGhpcywgdHlwZSApOworICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfSwKKyAg
ICBmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAgICBpZiAoIHR5cGUgIT09IGZhbHNl
ICkgeworICAgICAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBpbmRleCwK
KyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksCisgICAgICAgICAg
ICAgICAgcXVldWUgPSBkYXRhWyB0eXBlICsgInF1ZXVlIiBdLAorICAgICAgICAgICAgICAgIGhv
b2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAorICAgICAgICAgICAgICAgIHRpbWVy
cyA9IGpRdWVyeS50aW1lcnMsCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcXVldWUgPyBxdWV1
ZS5sZW5ndGggOiAwOworCisgICAgICAgICAgICAvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24g
cHJpdmF0ZSBkYXRhCisgICAgICAgICAgICBkYXRhLmZpbmlzaCA9IHRydWU7CisKKyAgICAgICAg
ICAgIC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdAorICAgICAgICAgICAgalF1ZXJ5LnF1ZXVlKCB0
aGlzLCB0eXBlLCBbXSApOworCisgICAgICAgICAgICBpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3Ag
KSB7CisgICAgICAgICAgICAgICAgaG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9u
cywgYW5kIGZpbmlzaCB0aGVtCisgICAgICAgICAgICBmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5n
dGg7IGluZGV4LS07ICkgeworICAgICAgICAgICAgICAgIGlmICggdGltZXJzWyBpbmRleCBdLmVs
ZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgeworICAgICAg
ICAgICAgICAgICAgICB0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7CisgICAgICAg
ICAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9u
cyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbQorICAgICAgICAgICAgZm9yICggaW5k
ZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAo
IHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKKyAgICAgICAgICAg
ICAgICAgICAgcXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFR1cm4gb2ZmIGZpbmlzaGlu
ZyBmbGFnCisgICAgICAgICAgICBkZWxldGUgZGF0YS5maW5pc2g7CisgICAgICAgIH0gKTsKKyAg
ICB9Cit9ICk7CisKK2pRdWVyeS5lYWNoKCBbICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBm
dW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsK
KyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFj
ayApIHsKKyAgICAgICAgcmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSAi
Ym9vbGVhbiIgPworICAgICAgICAgICAgY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoK
KyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVh
c2luZywgY2FsbGJhY2sgKTsKKyAgICB9OworfSApOworCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMg
Zm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCggeworICAgIHNsaWRlRG93bjogZ2Vu
RngoICJzaG93IiApLAorICAgIHNsaWRlVXA6IGdlbkZ4KCAiaGlkZSIgKSwKKyAgICBzbGlkZVRv
Z2dsZTogZ2VuRngoICJ0b2dnbGUiICksCisgICAgZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9
LAorICAgIGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sCisgICAgZmFkZVRvZ2dsZTogeyBv
cGFjaXR5OiAidG9nZ2xlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7CisgICAgalF1
ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Cisg
ICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFj
ayApOworICAgIH07Cit9ICk7CisKK2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meC50aWNr
ID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHRpbWVyLAorICAgICAgICBpID0gMCwKKyAgICAgICAg
dGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworICAgIGZ4Tm93ID0galF1ZXJ5Lm5vdygpOworCisg
ICAgZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICB0aW1lciA9IHRp
bWVyc1sgaSBdOworCisgICAgICAgIC8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5
IGJlZW4gcmVtb3ZlZAorICAgICAgICBpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0
aW1lciApIHsKKyAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGktLSwgMSApOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKyAgICAgICAgalF1ZXJ5LmZ4
LnN0b3AoKTsKKyAgICB9CisgICAgZnhOb3cgPSB1bmRlZmluZWQ7Cit9OworCitqUXVlcnkuZngu
dGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7CisgICAgalF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1l
ciApOworICAgIGlmICggdGltZXIoKSApIHsKKyAgICAgICAgalF1ZXJ5LmZ4LnN0YXJ0KCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgalF1ZXJ5LnRpbWVycy5wb3AoKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKK2pRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewor
ICAgIGlmICggIXRpbWVySWQgKSB7CisgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2
YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIHdpbmRvdy5jbGVhckludGVydmFsKCB0
aW1lcklkICk7CisKKyAgICB0aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMg
PSB7CisgICAgc2xvdzogNjAwLAorICAgIGZhc3Q6IDIwMCwKKworICAgIC8vIERlZmF1bHQgc3Bl
ZWQKKyAgICBfZGVmYXVsdDogNDAwCit9OworCisKKy8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2lu
IGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKy8vIGh0dHA6Ly93ZWIuYXJjaGl2
ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBo
cC8yMDA5LzA3L2pxdWVyeS1kZWxheS8KK2pRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1l
LCB0eXBlICkgeworICAgIHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1l
IF0gfHwgdGltZSA6IHRpbWU7CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHJldHVy
biB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7CisgICAgICAgIHZh
ciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsKKyAgICAgICAgaG9v
a3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCgg
dGltZW91dCApOworICAgICAgICB9OworICAgIH0gKTsKK307CisKKworKCBmdW5jdGlvbigpIHsK
KyAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisgICAg
ICAgIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCisgICAgICAg
IG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggIm9wdGlv
biIgKSApOworCisgICAgaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CisKKyAgICAvLyBTdXBwb3J0
OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yKworICAgIC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hl
Y2tib3ggc2hvdWxkIGJlICJvbiIKKyAgICBzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAh
PT0gIiI7CisKKyAgICAvLyBTdXBwb3J0OiBJRTw9MTErCisgICAgLy8gTXVzdCBhY2Nlc3Mgc2Vs
ZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3QKKyAgICBzdXBwb3J0Lm9w
dFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkOworCisgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw9Mi4z
CisgICAgLy8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkg
bWFya2VkIGFzIGRpc2FibGVkCisgICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICBzdXBw
b3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworICAgIC8vIFN1cHBvcnQ6IElFPD0x
MSsKKyAgICAvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRp
bworICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOworICAgIGlu
cHV0LnZhbHVlID0gInQiOworICAgIGlucHV0LnR5cGUgPSAicmFkaW8iOworICAgIHN1cHBvcnQu
cmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7Cit9ICkoKTsKKworCit2YXIgYm9vbEhv
b2ssCisgICAgYXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7CisKK2pRdWVyeS5m
bi5leHRlbmQoIHsKKyAgICBhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAg
IHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRz
Lmxlbmd0aCA+IDEgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUg
KSB7CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTsKKyAgICAgICAgfSApOworICAgIH0KK30g
KTsKKworalF1ZXJ5LmV4dGVuZCggeworICAgIGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2
YWx1ZSApIHsKKyAgICAgICAgdmFyIHJldCwgaG9va3MsCisgICAgICAgICAgICBuVHlwZSA9IGVs
ZW0ubm9kZVR5cGU7CisKKyAgICAgICAgLy8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRl
eHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcworICAgICAgICBpZiAoIG5UeXBlID09PSAz
IHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMg
YXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUg
PT09ICJ1bmRlZmluZWQiICkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVt
LCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMg
YXJlIGxvd2VyY2FzZQorICAgICAgICAvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBk
ZWZpbmVkCisgICAgICAgIGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxl
bSApICkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAg
ICAgIGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8CisgICAgICAgICAgICAgICAg
KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZp
bmVkICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7
CisgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBudWxsICkgeworICAgICAgICAgICAgICAgIGpR
dWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tz
ICYmCisgICAgICAgICAgICAgICAgKCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1l
ICkgKSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSAr
ICIiICk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBu
YW1lICkgKSAhPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0K
KworICAgICAgICByZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7CisKKyAgICAg
ICAgLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0
byB1bmRlZmluZWQKKyAgICAgICAgcmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0
OworICAgIH0sCisKKyAgICBhdHRySG9va3M6IHsKKyAgICAgICAgdHlwZTogeworICAgICAgICAg
ICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAh
c3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAicmFkaW8iICYmCisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgeworICAgICAgICAgICAg
ICAgICAgICB2YXIgdmFsID0gZWxlbS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5z
ZXRBdHRyaWJ1dGUoICJ0eXBlIiwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2
YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gdmFsOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorCisgICAgcmVt
b3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgICAgICB2YXIgbmFtZSwgcHJv
cE5hbWUsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGF0dHJOYW1lcyA9IHZhbHVl
ICYmIHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKTsKKworICAgICAgICBpZiAoIGF0dHJOYW1lcyAm
JiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAgd2hpbGUgKCAoIG5hbWUgPSBh
dHRyTmFtZXNbIGkrKyBdICkgKSB7CisgICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBqUXVlcnku
cHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKyAgICAgICAgICAgICAgICAvLyBCb29sZWFuIGF0
dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgICAgICAgICAgICAg
aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZQorICAgICAg
ICAgICAgICAgICAgICBlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30gKTsKKworLy8gSG9va3MgZm9yIGJvb2xlYW4g
YXR0cmlidXRlcworYm9vbEhvb2sgPSB7CisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUs
IG5hbWUgKSB7CisgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworCisgICAgICAgICAg
ICAvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlCisgICAgICAg
ICAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9OworalF1ZXJ5LmVhY2goIGpRdWVyeS5leHBy
Lm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7
CisgICAgdmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRy
OworCisgICAgYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1M
ICkgeworICAgICAgICB2YXIgcmV0LCBoYW5kbGU7CisgICAgICAgIGlmICggIWlzWE1MICkgewor
CisgICAgICAgICAgICAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJl
bW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCisgICAgICAgICAgICBoYW5kbGUg
PSBhdHRySGFuZGxlWyBuYW1lIF07CisgICAgICAgICAgICBhdHRySGFuZGxlWyBuYW1lIF0gPSBy
ZXQ7CisgICAgICAgICAgICByZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVs
bCA/CisgICAgICAgICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpIDoKKyAgICAgICAgICAgICAg
ICBudWxsOworICAgICAgICAgICAgYXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKK30gKTsKKworCisKKwordmFyIHJmb2N1
c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAorICAgIHJjbGlj
a2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBwcm9w
OiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMs
IGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKyAgICB9
LAorCisgICAgcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7CisgICAgICAgIHJldHVybiB0
aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZGVsZXRlIHRoaXNbIGpRdWVyeS5w
cm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOworICAgICAgICB9ICk7CisgICAgfQorfSApOworCitq
UXVlcnkuZXh0ZW5kKCB7CisgICAgcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkg
eworICAgICAgICB2YXIgcmV0LCBob29rcywKKyAgICAgICAgICAgIG5UeXBlID0gZWxlbS5ub2Rl
VHlwZTsKKworICAgICAgICAvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29t
bWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCisgICAgICAgIGlmICggblR5cGUgPT09IDMgfHwgblR5
cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0g
KSApIHsKKworICAgICAgICAgICAgLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcworICAgICAg
ICAgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKyAgICAgICAgICAg
IGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgaWYgKCBob29rcyAmJiAi
c2V0IiBpbiBob29rcyAmJgorICAgICAgICAgICAgICAgICggcmV0ID0gaG9va3Muc2V0KCBlbGVt
LCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKCBlbGVtWyBuYW1l
IF0gPSB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBp
biBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7
CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVs
ZW1bIG5hbWUgXTsKKyAgICB9LAorCisgICAgcHJvcEhvb2tzOiB7CisgICAgICAgIHRhYkluZGV4
OiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCisgICAgICAgICAgICAg
ICAgLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCisgICAgICAgICAg
ICAgICAgLy8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0
CisgICAgICAgICAgICAgICAgLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAx
LzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2
YXNjcmlwdC8KKyAgICAgICAgICAgICAgICAvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2
YWwoIzEyMDcyKQorICAgICAgICAgICAgICAgIHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0
dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0YWJpbmRl
eCA/CisgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6CisgICAg
ICAgICAgICAgICAgICAgIHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CisgICAg
ICAgICAgICAgICAgICAgICAgICByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBl
bGVtLmhyZWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKwor
ICAgIHByb3BGaXg6IHsKKyAgICAgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAgICAgImNsYXNz
IjogImNsYXNzTmFtZSIKKyAgICB9Cit9ICk7CisKKy8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQor
Ly8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5CisvLyBmb3JjZXMgdGhlIGJy
b3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCisvLyBvbiB0aGUgb3B0aW9uCisvLyBU
aGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZAorLy8gd2hlbiBp
biBhbiBvcHRncm91cAoraWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKKyAgICBqUXVlcnku
cHJvcEhvb2tzLnNlbGVjdGVkID0geworICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKyAgICAgICAgICAgIGlm
ICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgICAgIHBhcmVu
dC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisgICAgICAgICAgICBp
ZiAoIHBhcmVudCApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuc2VsZWN0ZWRJbmRleDsKKwor
ICAgICAgICAgICAgICAgIGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KKworalF1ZXJ5LmVhY2goIFsK
KyAgICAidGFiSW5kZXgiLAorICAgICJyZWFkT25seSIsCisgICAgIm1heExlbmd0aCIsCisgICAg
ImNlbGxTcGFjaW5nIiwKKyAgICAiY2VsbFBhZGRpbmciLAorICAgICJyb3dTcGFuIiwKKyAgICAi
Y29sU3BhbiIsCisgICAgInVzZU1hcCIsCisgICAgImZyYW1lQm9yZGVyIiwKKyAgICAiY29udGVu
dEVkaXRhYmxlIgorXSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnByb3BGaXhbIHRoaXMudG9M
b3dlckNhc2UoKSBdID0gdGhpczsKK30gKTsKKworCisKKwordmFyIHJjbGFzcyA9IC9bXHRcclxu
XGZdL2c7CisKK2Z1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgeworICAgIHJldHVybiBlbGVtLmdl
dEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggImNsYXNzIiApIHx8ICIiOworfQorCitq
UXVlcnkuZm4uZXh0ZW5kKCB7CisgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAg
ICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZh
bHVlLAorICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlv
biggdmFsdWUgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBq
ICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxs
KCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKKyAgICAgICAgICAgIH0gKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSAp
IHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107
CisKKyAgICAgICAgICAgIHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKKyAgICAg
ICAgICAgICAgICBjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CisgICAgICAgICAgICAgICAg
Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAoICIgIiAr
IGN1clZhbHVlICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKTsKKworICAgICAgICAgICAg
ICAgIGlmICggY3VyICkgeworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAg
ICAgICAgICAgd2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAw
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciArPSBjbGF6eiArICIgIjsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgIC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRl
ZCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBqUXVlcnkudHJp
bSggY3VyICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFs
dWUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSggImNsYXNz
IiwgZmluYWxWYWx1ZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAg
fSwKKworICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgIHZhciBj
bGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwKKyAgICAg
ICAgICAgIGkgPSAwOworCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkg
KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywg
aiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgeworICAgICAgICAgICAgcmV0dXJuIHRo
aXMuYXR0ciggImNsYXNzIiwgIiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdHlwZW9m
IHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSApIHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSB2
YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107CisKKyAgICAgICAgICAgIHdoaWxlICggKCBl
bGVtID0gdGhpc1sgaSsrIF0gKSApIHsKKyAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IGdldENs
YXNzKCBlbGVtICk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVy
ZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKQorICAgICAgICAgICAg
ICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgKCAi
ICIgKyBjdXJWYWx1ZSArICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICk7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGN1ciApIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAg
ICAgICAgICAgICAgIHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkg
PiAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXIucmVwbGFjZSgg
IiAiICsgY2xhenogKyAiICIsICIgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhc3NpZ24g
aWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy4KKyAgICAgICAgICAgICAg
ICAgICAgZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgdG9nZ2xlQ2xhc3M6IGZ1bmN0
aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CisgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVl
OworCisgICAgICAgIGlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgdHlwZSA9
PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENs
YXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnko
IHRoaXMgKS50b2dnbGVDbGFzcygKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuY2FsbCggdGhp
cywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSwKKyAgICAgICAgICAgICAgICAgICAg
c3RhdGVWYWwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSApOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2
YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzOworCisgICAgICAgICAgICBpZiAoIHR5
cGUgPT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAgICAgLy8gVG9nZ2xlIGluZGl2aWR1
YWwgY2xhc3MgbmFtZXMKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBz
ZWxmID0galF1ZXJ5KCB0aGlzICk7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IHZhbHVl
Lm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKKworICAgICAgICAgICAgICAgIHdoaWxlICggKCBj
bGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkgeworCisgICAgICAgICAgICAgICAgICAg
IC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAorICAg
ICAgICAgICAgICAgICAgICBpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CisgICAg
ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFk
ZENsYXNzKCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gImJvb2xlYW4i
ICkgeworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7CisgICAg
ICAgICAgICAgICAgaWYgKCBjbGFzc05hbWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8g
U3RvcmUgY2xhc3NOYW1lIGlmIHNldAorICAgICAgICAgICAgICAgICAgICBkYXRhUHJpdi5zZXQo
IHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBp
ZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHJlbW92ZSB0
aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQp
LgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBw
cmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksCisgICAgICAgICAgICAgICAgLy8gZmFsbGlu
ZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgorICAgICAg
ICAgICAgICAgIGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgICAg
IHRoaXMuc2V0QXR0cmlidXRlKCAiY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xh
c3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiIiA6
CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHJpdi5nZXQoIHRoaXMsICJfX2NsYXNzTmFt
ZV9fIiApIHx8ICIiCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfSwKKworICAgIGhhc0NsYXNzOiBmdW5j
dGlvbiggc2VsZWN0b3IgKSB7CisgICAgICAgIHZhciBjbGFzc05hbWUsIGVsZW0sCisgICAgICAg
ICAgICBpID0gMDsKKworICAgICAgICBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIjsK
KyAgICAgICAgd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgeworICAgICAgICAgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCisgICAgICAgICAgICAgICAgKCAiICIgKyBnZXRD
bGFzcyggZWxlbSApICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKQorICAgICAgICAgICAg
ICAgICAgICAuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMQorICAgICAgICAgICAgKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfSApOworCisKKworCit2YXIgcnJldHVybiA9IC9c
ci9nLAorICAgIHJzcGFjZXMgPSAvW1x4MjBcdFxyXG5cZl0rL2c7CisKK2pRdWVyeS5mbi5leHRl
bmQoIHsKKyAgICB2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgdmFyIGhvb2tzLCBy
ZXQsIGlzRnVuY3Rpb24sCisgICAgICAgICAgICBlbGVtID0gdGhpc1sgMCBdOworCisgICAgICAg
IGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CisgICAgICAgICAgICBpZiAoIGVsZW0gKSB7Cisg
ICAgICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8Cisg
ICAgICAgICAgICAgICAgICAgIGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpIF07CisKKyAgICAgICAgICAgICAgICBpZiAoIGhvb2tzICYmCisgICAgICAgICAgICAg
ICAgICAgICJnZXQiIGluIGhvb2tzICYmCisgICAgICAgICAgICAgICAgICAgICggcmV0ID0gaG9v
a3MuZ2V0KCBlbGVtLCAidmFsdWUiICkgKSAhPT0gdW5kZWZpbmVkCisgICAgICAgICAgICAgICAg
KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgcmV0ID0gZWxlbS52YWx1ZTsKKworICAgICAgICAgICAgICAgIHJl
dHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/CisKKyAgICAgICAgICAgICAgICAgICAgLy8g
SGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworICAgICAgICAgICAgICAgICAgICByZXQu
cmVwbGFjZSggcnJldHVybiwgIiIgKSA6CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxl
IGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCisgICAgICAgICAgICAg
ICAgICAgIHJldCA9PSBudWxsID8gIiIgOiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNG
dW5jdGlvbiggdmFsdWUgKTsKKworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigg
aSApIHsKKyAgICAgICAgICAgIHZhciB2YWw7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5ub2Rl
VHlwZSAhPT0gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICggaXNGdW5jdGlvbiApIHsKKyAgICAgICAgICAgICAgICB2YWwgPSB2
YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVy
cyB0byBzdHJpbmcKKyAgICAgICAgICAgIGlmICggdmFsID09IG51bGwgKSB7CisgICAgICAgICAg
ICAgICAgdmFsID0gIiI7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09
ICJudW1iZXIiICkgeworICAgICAgICAgICAgICAgIHZhbCArPSAiIjsKKworICAgICAgICAgICAg
fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgeworICAgICAgICAgICAgICAgIHZh
bCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkgeworICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKyAgICAgICAgICAg
ICAgICB9ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnZh
bEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9M
b3dlckNhc2UoKSBdOworCisgICAgICAgICAgICAvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQs
IGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZworICAgICAgICAgICAgaWYgKCAhaG9va3MgfHwg
ISggInNldCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgInZhbHVlIiApID09
PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSApOworICAgIH0KK30gKTsKKworalF1ZXJ5LmV4dGVuZCggewor
ICAgIHZhbEhvb2tzOiB7CisgICAgICAgIG9wdGlvbjogeworICAgICAgICAgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSApIHsKKworICAgICAgICAgICAgICAgIHZhciB2YWwgPSBqUXVlcnkuZmluZC5h
dHRyKCBlbGVtLCAidmFsdWUiICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxs
ID8KKyAgICAgICAgICAgICAgICAgICAgdmFsIDoKKworICAgICAgICAgICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRTEwLTExKworICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb24udGV4dCB0aHJv
d3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCisgICAgICAgICAgICAgICAgICAgIC8vIFN0
cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBz
Oi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlCisg
ICAgICAgICAgICAgICAgICAgIGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICkucmVw
bGFjZSggcnNwYWNlcywgIiAiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAg
IHNlbGVjdDogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAg
ICAgICAgICB2YXIgdmFsdWUsIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9
IGVsZW0ub3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBlbGVtLnNlbGVjdGVk
SW5kZXgsCisgICAgICAgICAgICAgICAgICAgIG9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1v
bmUiIHx8IGluZGV4IDwgMCwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gb25lID8gbnVs
bCA6IFtdLAorICAgICAgICAgICAgICAgICAgICBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRp
b25zLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaSA9IGluZGV4IDwgMCA/CisgICAgICAg
ICAgICAgICAgICAgICAgICBtYXggOgorICAgICAgICAgICAgICAgICAgICAgICAgb25lID8gaW5k
ZXggOiAwOworCisgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0
ZWQgb3B0aW9ucworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IG1heDsgaSsrICkgeworICAg
ICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25zWyBpIF07CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAo
IzI1NTEpCisgICAgICAgICAgICAgICAgICAgIGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9
PT0gaW5kZXggKSAmJgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmV0
dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc3VwcG9ydC5vcHREaXNhYmxlZCA/CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0
QXR0cmlidXRlKCAiZGlzYWJsZWQiICkgPT09IG51bGwgKSAmJgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAi
b3B0Z3JvdXAiICkgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBz
cGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgdmFs
dWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBvbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisgICAg
ICAgICAgICAgICAgdmFyIG9wdGlvblNldCwgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICBv
cHRpb25zID0gZWxlbS5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBqUXVl
cnkubWFrZUFycmF5KCB2YWx1ZSApLAorICAgICAgICAgICAgICAgICAgICBpID0gb3B0aW9ucy5s
ZW5ndGg7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIG9w
dGlvbi5zZWxlY3RlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuaW5BcnJheSgg
alF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xCisgICAg
ICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uU2V0ID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBu
b24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CisgICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9uU2V0
ICkgeworICAgICAgICAgICAgICAgICAgICBlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KK30gKTsKKworLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdl
dHRlci9zZXR0ZXIKK2pRdWVyeS5lYWNoKCBbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rp
b24oKSB7CisgICAgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CisgICAgICAgIHNldDogZnVu
Y3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgg
dmFsdWUgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVl
cnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7
CisgICAgICAgIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09IG51
bGwgPyAib24iIDogZWxlbS52YWx1ZTsKKyAgICAgICAgfTsKKyAgICB9Cit9ICk7CisKKworCisK
Ky8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KKworCit2YXIg
cmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87CisKK2pRdWVy
eS5leHRlbmQoIGpRdWVyeS5ldmVudCwgeworCisgICAgdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50
LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CisKKyAgICAgICAgdmFyIGksIGN1ciwgdG1w
LCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwKKyAgICAgICAgICAgIGV2ZW50
UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLAorICAgICAgICAgICAgdHlwZSA9IGhhc093bi5j
YWxsKCBldmVudCwgInR5cGUiICkgPyBldmVudC50eXBlIDogZXZlbnQsCisgICAgICAgICAgICBu
YW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFt
ZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOworCisgICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBl
bGVtIHx8IGRvY3VtZW50OworCisgICAgICAgIC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFu
ZCBjb21tZW50IG5vZGVzCisgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVt
Lm5vZGVUeXBlID09PSA4ICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBu
b3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93CisgICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCgg
dHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewor
CisgICAgICAgICAgICAvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBt
YXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisgICAgICAgICAgICBuYW1lc3BhY2VzID0gdHlw
ZS5zcGxpdCggIi4iICk7CisgICAgICAgICAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwor
ICAgICAgICAgICAgbmFtZXNwYWNlcy5zb3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgb250eXBl
ID0gdHlwZS5pbmRleE9mKCAiOiIgKSA8IDAgJiYgIm9uIiArIHR5cGU7CisKKyAgICAgICAgLy8g
Q2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0
IGFuIGV2ZW50IHR5cGUgc3RyaW5nCisgICAgICAgIGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBh
bmRvIF0gPworICAgICAgICAgICAgZXZlbnQgOgorICAgICAgICAgICAgbmV3IGpRdWVyeS5FdmVu
dCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOworCisgICAgICAg
IC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1
ZXJ5IChhbHdheXMgdHJ1ZSkKKyAgICAgICAgZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJz
ID8gMiA6IDM7CisgICAgICAgIGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggIi4i
ICk7CisgICAgICAgIGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgPworICAgICAg
ICAgICAgbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86Lipc
XC58KSIgKSArICIoXFwufCQpIiApIDoKKyAgICAgICAgICAgIG51bGw7CisKKyAgICAgICAgLy8g
Q2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCisgICAgICAgIGV2
ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKKyAgICAgICAgaWYgKCAhZXZlbnQudGFyZ2V0ICkgewor
ICAgICAgICAgICAgZXZlbnQudGFyZ2V0ID0gZWxlbTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcg
dGhlIGhhbmRsZXIgYXJnIGxpc3QKKyAgICAgICAgZGF0YSA9IGRhdGEgPT0gbnVsbCA/CisgICAg
ICAgICAgICBbIGV2ZW50IF0gOgorICAgICAgICAgICAgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwg
WyBldmVudCBdICk7CisKKyAgICAgICAgLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBv
dXRzaWRlIHRoZSBsaW5lcworICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxb
IHR5cGUgXSB8fCB7fTsKKyAgICAgICAgaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJp
Z2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUg
ZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgj
OTk1MSkKKyAgICAgICAgLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsg
d2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKKyAgICAgICAgaWYg
KCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3co
IGVsZW0gKSApIHsKKworICAgICAgICAgICAgYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVU
eXBlIHx8IHR5cGU7CisgICAgICAgICAgICBpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVU
eXBlICsgdHlwZSApICkgeworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnROb2RlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnRO
b2RlICkgeworICAgICAgICAgICAgICAgIGV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKKyAgICAgICAg
ICAgICAgICB0bXAgPSBjdXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkg
YWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3Ig
ZGV0YWNoZWQgRE9NKQorICAgICAgICAgICAgaWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3Vt
ZW50IHx8IGRvY3VtZW50ICkgKSB7CisgICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1c2goIHRt
cC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQg
cGF0aAorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsg
aSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKworICAgICAgICAg
ICAgZXZlbnQudHlwZSA9IGkgPiAxID8KKyAgICAgICAgICAgICAgICBidWJibGVUeXBlIDoKKyAg
ICAgICAgICAgICAgICBzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7CisKKyAgICAgICAgICAgIC8v
IGpRdWVyeSBoYW5kbGVyCisgICAgICAgICAgICBoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3Vy
LCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJgorICAgICAgICAgICAgICAgIGRh
dGFQcml2LmdldCggY3VyLCAiaGFuZGxlIiApOworICAgICAgICAgICAgaWYgKCBoYW5kbGUgKSB7
CisgICAgICAgICAgICAgICAgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gTmF0aXZlIGhhbmRsZXIKKyAgICAgICAgICAgIGhhbmRsZSA9
IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworICAgICAgICAgICAgaWYgKCBoYW5kbGUgJiYgaGFu
ZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgeworICAgICAgICAgICAgICAgIGV2ZW50
LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7CisgICAgICAgICAgICAgICAgaWYg
KCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkgeworICAgICAgICAgICAgICAgICAgICBldmVudC5w
cmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBldmVudC50eXBlID0gdHlwZTsKKworICAgICAgICAvLyBJZiBub2JvZHkg
cHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CisgICAgICAgIGlmICggIW9u
bHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKyAgICAgICAg
ICAgIGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAorICAgICAgICAgICAgICAgIHNwZWNpYWwu
X2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmCisg
ICAgICAgICAgICAgICAgYWNjZXB0RGF0YSggZWxlbSApICkgeworCisgICAgICAgICAgICAgICAg
Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBu
YW1lIG5hbWUgYXMgdGhlIGV2ZW50LgorICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGRlZmF1
bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgj
NjE3MCkKKyAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbigg
ZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCisgICAgICAg
ICAgICAgICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBj
YWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZWxlbVsgb250
eXBlIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNh
bWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorICAgICAgICAgICAg
ICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKKyAgICAgICAgICAgICAgICAg
ICAgZWxlbVsgdHlwZSBdKCk7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmln
Z2VyZWQgPSB1bmRlZmluZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIHJldHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIC8vIFBpZ2d5YmFj
ayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZQorICAgIC8vIFVz
ZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCisgICAgc2ltdWxhdGU6IGZ1bmN0
aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHsKKyAgICAgICAgdmFyIGUgPSBqUXVlcnkuZXh0ZW5k
KAorICAgICAgICAgICAgbmV3IGpRdWVyeS5FdmVudCgpLAorICAgICAgICAgICAgZXZlbnQsCisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAg
ICBpc1NpbXVsYXRlZDogdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CisgICAgfQorCit9ICk7CisK
K2pRdWVyeS5mbi5leHRlbmQoIHsKKworICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRh
ICkgeworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CisgICAgICAgIH0gKTsK
KyAgICB9LAorICAgIHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAg
ICAgICAgdmFyIGVsZW0gPSB0aGlzWyAwIF07CisgICAgICAgIGlmICggZWxlbSApIHsKKyAgICAg
ICAgICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1
ZSApOworICAgICAgICB9CisgICAgfQorfSApOworCisKK2pRdWVyeS5lYWNoKCAoICJibHVyIGZv
Y3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxj
bGljayAiICsKKyAgICAibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3Vz
ZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisgICAgImNoYW5nZSBzZWxlY3Qgc3VibWl0
IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiICkuc3BsaXQoICIgIiAp
LAorICAgIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCisgICAgLy8gSGFuZGxlIGV2ZW50IGJpbmRp
bmcKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsKKyAgICAg
ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KKyAgICAgICAgICAgIHRoaXMub24oIG5h
bWUsIG51bGwsIGRhdGEsIGZuICkgOgorICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCBuYW1lICk7
CisgICAgfTsKK30gKTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGhvdmVyOiBmdW5jdGlv
biggZm5PdmVyLCBmbk91dCApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5P
dmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7CisgICAgfQorfSApOworCisKKwor
CitzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CisKKworLy8gU3VwcG9y
dDogRmlyZWZveAorLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50
cworLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3df
YnVnLmNnaT9pZD02ODc3ODcKKy8vCisvLyBTdXBwb3J0OiBDaHJvbWUsIFNhZmFyaQorLy8gZm9j
dXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCisvLyB3
aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0z
LUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXIKKy8vIFJlbGF0ZWQgdGlja2V0
IC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0
OTg1NworaWYgKCAhc3VwcG9ydC5mb2N1c2luICkgeworICAgIGpRdWVyeS5lYWNoKCB7IGZvY3Vz
OiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsK
KworICAgICAgICAvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRv
Y3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAorICAgICAgICB2YXIg
aGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAgICAgICAgIGpRdWVyeS5ldmVudC5z
aW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsK
KyAgICAgICAgfTsKKworICAgICAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7Cisg
ICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGRvYyA9
IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2hl
cyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKKworICAgICAgICAgICAgICAgIGlmICgg
IWF0dGFjaGVzICkgeworICAgICAgICAgICAgICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigg
b3JpZywgaGFuZGxlciwgdHJ1ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTsKKyAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgICAg
ICAgICAgICAgdmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorICAgICAgICAg
ICAgICAgICAgICBhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CisK
KyAgICAgICAgICAgICAgICBpZiAoICFhdHRhY2hlcyApIHsKKyAgICAgICAgICAgICAgICAgICAg
ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKyAgICAgICAg
ICAgICAgICAgICAgZGF0YVByaXYucmVtb3ZlKCBkb2MsIGZpeCApOworCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZp
eCwgYXR0YWNoZXMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH07CisgICAgfSApOworfQordmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uOworCit2YXIg
bm9uY2UgPSBqUXVlcnkubm93KCk7CisKK3ZhciBycXVlcnkgPSAoIC9cPy8gKTsKKworCisKKy8v
IFN1cHBvcnQ6IEFuZHJvaWQgMi4zCisvLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNh
c3QgbnVsbCBpbnB1dAoralF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAg
IHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgIiIgKTsKK307CisKKworLy8gQ3Jvc3MtYnJvd3Nl
ciB4bWwgcGFyc2luZworalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7CisgICAg
dmFyIHhtbDsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsK
KyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU5CisgICAg
dHJ5IHsKKyAgICAgICAgeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9t
U3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAg
IHhtbCA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1l
bnRzQnlUYWdOYW1lKCAicGFyc2VyZXJyb3IiICkubGVuZ3RoICkgeworICAgICAgICBqUXVlcnku
ZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKKyAgICB9CisgICAgcmV0dXJuIHhtbDsK
K307CisKKwordmFyCisgICAgcmhhc2ggPSAvIy4qJC8sCisgICAgcnRzID0gLyhbPyZdKV89W14m
XSovLAorICAgIHJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKKworICAg
IC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgorICAgIHJs
b2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZp
bGV8cmVzfHdpZGdldCk6JC8sCisgICAgcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCisg
ICAgcnByb3RvY29sID0gL15cL1wvLywKKworICAgIC8qIFByZWZpbHRlcnMKKyAgICAgKiAxKSBU
aGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pz
b25wLmpzIGZvciBhbiBleGFtcGxlKQorICAgICAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CisgICAg
ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydAorICAgICAqICAgIC0gQUZURVIg
cGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEg
aXMgdHJ1ZSkKKyAgICAgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCisgICAgICogNCkgdGhlIGNh
dGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQKKyAgICAgKiA1KSBleGVjdXRpb24gd2lsbCBz
dGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIq
IiBpZiBuZWVkZWQKKyAgICAgKi8KKyAgICBwcmVmaWx0ZXJzID0ge30sCisKKyAgICAvKiBUcmFu
c3BvcnRzIGJpbmRpbmdzCisgICAgICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZQorICAgICAqIDIp
IHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCisgICAgICogMykgc2VsZWN0aW9u
IHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlm
IG5lZWRlZAorICAgICAqLworICAgIHRyYW5zcG9ydHMgPSB7fSwKKworICAgIC8vIEF2b2lkIGNv
bW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFu
ZCBldmFkZSBjb21wcmVzc2lvbgorICAgIGFsbFR5cGVzID0gIiovIi5jb25jYXQoICIqIiApLAor
CisgICAgLy8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luCisgICAg
b3JpZ2luQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CisgICAgb3JpZ2lu
QW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOworCisvLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9y
IGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAorZnVuY3Rpb24g
YWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CisKKyAgICAvLyBkYXRh
VHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgorICAgIHJldHVy
biBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgeworCisgICAgICAgIGlmICgg
dHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBm
dW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOworICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9u
ID0gIioiOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGFUeXBlLAorICAgICAgICAgICAg
aSA9IDAsCisgICAgICAgICAgICBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dl
ckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107CisKKyAgICAgICAgaWYgKCBqUXVlcnku
aXNGdW5jdGlvbiggZnVuYyApICkgeworCisgICAgICAgICAgICAvLyBGb3IgZWFjaCBkYXRhVHlw
ZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCisgICAgICAgICAgICB3aGlsZSAoICggZGF0YVR5
cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBQcmVwZW5k
IGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgICAgIGlmICggZGF0YVR5cGVbIDAgXSA9PT0gIisi
ICkgeworICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkg
fHwgIioiOworICAgICAgICAgICAgICAgICAgICAoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0
cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTsKKworICAgICAgICAg
ICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICAoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0
YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQorCisvLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rp
b24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0aW9uIGluc3BlY3RQcmVmaWx0
ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFY
SFIgKSB7CisKKyAgICB2YXIgaW5zcGVjdGVkID0ge30sCisgICAgICAgIHNlZWtpbmdUcmFuc3Bv
cnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApOworCisgICAgZnVuY3Rpb24gaW5zcGVj
dCggZGF0YVR5cGUgKSB7CisgICAgICAgIHZhciBzZWxlY3RlZDsKKyAgICAgICAgaW5zcGVjdGVk
WyBkYXRhVHlwZSBdID0gdHJ1ZTsKKyAgICAgICAgalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0
YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKKyAgICAg
ICAgICAgIHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRp
b25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CisgICAgICAgICAgICBpZiAoIHR5cGVvZiBk
YXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5nIiAmJgorICAgICAgICAgICAgICAgICFzZWVr
aW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKKwor
ICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFu
c3BvcnQgKTsKKyAgICAgICAgICAgICAgICBpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICgg
c2Vla2luZ1RyYW5zcG9ydCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISggc2VsZWN0ZWQg
PSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gKTsKKyAg
ICAgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHJldHVybiBpbnNwZWN0KCBvcHRp
b25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioi
ICk7Cit9CisKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucworLy8gdGhhdCB0
YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCisvLyBGaXhlcyAj
OTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7CisgICAgdmFyIGtleSwg
ZGVlcCwKKyAgICAgICAgZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRp
b25zIHx8IHt9OworCisgICAgZm9yICgga2V5IGluIHNyYyApIHsKKyAgICAgICAgaWYgKCBzcmNb
IGtleSBdICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAoIGZsYXRPcHRpb25zWyBrZXkg
XSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtl
eSBdOworICAgICAgICB9CisgICAgfQorICAgIGlmICggZGVlcCApIHsKKyAgICAgICAgalF1ZXJ5
LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7CisgICAgfQorCisgICAgcmV0dXJuIHRhcmdl
dDsKK30KKworLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgorICogLSBm
aW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFu
ZCBleHBlY3RlZCBkYXRhVHlwZSkKKyAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNw
b25zZQorICovCitmdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9u
c2VzICkgeworCisgICAgdmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBl
LAorICAgICAgICBjb250ZW50cyA9IHMuY29udGVudHMsCisgICAgICAgIGRhdGFUeXBlcyA9IHMu
ZGF0YVR5cGVzOworCisgICAgLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50
LXR5cGUgaW4gdGhlIHByb2Nlc3MKKyAgICB3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIg
KSB7CisgICAgICAgIGRhdGFUeXBlcy5zaGlmdCgpOworICAgICAgICBpZiAoIGN0ID09PSB1bmRl
ZmluZWQgKSB7CisgICAgICAgICAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9u
c2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBD
aGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKKyAgICBpZiAo
IGN0ICkgeworICAgICAgICBmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgeworICAgICAgICAgICAg
aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHsK
KyAgICAgICAgICAgICAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hl
Y2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBl
CisgICAgaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisgICAgICAgIGZpbmFs
RGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIFRy
eSBjb252ZXJ0aWJsZSBkYXRhVHlwZXMKKyAgICAgICAgZm9yICggdHlwZSBpbiByZXNwb25zZXMg
KSB7CisgICAgICAgICAgICBpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5
cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgeworICAgICAgICAgICAgICAgIGZpbmFsRGF0
YVR5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKKyAgICAgICAgICAgICAgICBmaXJzdERh
dGFUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE9y
IGp1c3QgdXNlIGZpcnN0IG9uZQorICAgICAgICBmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlw
ZSB8fCBmaXJzdERhdGFUeXBlOworICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5
cGUKKyAgICAvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAorICAg
IC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKKyAgICBpZiAoIGZpbmFs
RGF0YVR5cGUgKSB7CisgICAgICAgIGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAw
IF0gKSB7CisgICAgICAgICAgICBkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKKyAg
ICB9Cit9CisKKy8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUg
b3JpZ2luYWwgcmVzcG9uc2UKKyAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9u
IHRoZSBqcVhIUiBpbnN0YW5jZQorICovCitmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9u
c2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7CisgICAgdmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0
bXAsIHByZXYsCisgICAgICAgIGNvbnZlcnRlcnMgPSB7fSwKKworICAgICAgICAvLyBXb3JrIHdp
dGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBj
b252ZXJzaW9uCisgICAgICAgIGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7CisKKyAg
ICAvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXMKKyAgICBpZiAo
IGRhdGFUeXBlc1sgMSBdICkgeworICAgICAgICBmb3IgKCBjb252IGluIHMuY29udmVydGVycyAp
IHsKKyAgICAgICAgICAgIGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252
ZXJ0ZXJzWyBjb252IF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyZW50ID0gZGF0YVR5
cGVzLnNoaWZ0KCk7CisKKyAgICAvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlw
ZQorICAgIHdoaWxlICggY3VycmVudCApIHsKKworICAgICAgICBpZiAoIHMucmVzcG9uc2VGaWVs
ZHNbIGN1cnJlbnQgXSApIHsKKyAgICAgICAgICAgIGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBj
dXJyZW50IF0gXSA9IHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwbHkgdGhl
IGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKKyAgICAgICAgaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3Mg
JiYgcy5kYXRhRmlsdGVyICkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIo
IHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7CisgICAgICAgIH0KKworICAgICAgICBwcmV2ID0gY3Vy
cmVudDsKKyAgICAgICAgY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOworCisgICAgICAgIGlm
ICggY3VycmVudCApIHsKKworICAgICAgICAvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBj
dXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvCisgICAgICAgICAgICBpZiAoIGN1cnJlbnQgPT09
ICIqIiApIHsKKworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcmV2OworCisgICAgICAgICAg
ICAvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRp
ZmZlcnMgZnJvbSBjdXJyZW50CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwcmV2ICE9PSAiKiIg
JiYgcHJldiAhPT0gY3VycmVudCApIHsKKworICAgICAgICAgICAgICAgIC8vIFNlZWsgYSBkaXJl
Y3QgY29udmVydGVyCisgICAgICAgICAgICAgICAgY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAi
ICIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKKworICAgICAg
ICAgICAgICAgIC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyCisgICAgICAgICAgICAgICAg
aWYgKCAhY29udiApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggY29udjIgaW4gY29udmVy
dGVycyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29udjIgb3V0cHV0cyBj
dXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVk
IHRvIGFjY2VwdGVkIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udiA9IGNv
bnZlcnRlcnNbIHByZXYgKyAiICIgKyB0bXBbIDAgXSBdIHx8CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnZlcnRlcnNbICIqICIgKyB0bXBbIDAgXSBdOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggY29udiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRl
cm1lZGlhdGUgZGF0YVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNl
KQorICAgICAgICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5k
IHJldHVybiB0aGVtCisgICAgICAgICAgICAgICAgICAgIGlmICggY29udiAmJiBzLnRocm93cyAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsK
KyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRy
eSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25z
ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGU6ICJwYXJzZXJlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVycm9yOiBjb252ID8gZSA6ICJObyBjb252ZXJzaW9uIGZyb20gIiArIHByZXYgKyAiIHRvICIg
KyBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7IHN0YXRlOiAic3Vj
Y2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07Cit9CisKK2pRdWVyeS5leHRlbmQoIHsKKworICAgIC8v
IENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllcworICAgIGFj
dGl2ZTogMCwKKworICAgIC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJl
cXVlc3QKKyAgICBsYXN0TW9kaWZpZWQ6IHt9LAorICAgIGV0YWc6IHt9LAorCisgICAgYWpheFNl
dHRpbmdzOiB7CisgICAgICAgIHVybDogbG9jYXRpb24uaHJlZiwKKyAgICAgICAgdHlwZTogIkdF
VCIsCisgICAgICAgIGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3Rv
Y29sICksCisgICAgICAgIGdsb2JhbDogdHJ1ZSwKKyAgICAgICAgcHJvY2Vzc0RhdGE6IHRydWUs
CisgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9u
L3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisgICAgICAgIC8qCisgICAg
ICAgIHRpbWVvdXQ6IDAsCisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIGRhdGFUeXBlOiBu
dWxsLAorICAgICAgICB1c2VybmFtZTogbnVsbCwKKyAgICAgICAgcGFzc3dvcmQ6IG51bGwsCisg
ICAgICAgIGNhY2hlOiBudWxsLAorICAgICAgICB0aHJvd3M6IGZhbHNlLAorICAgICAgICB0cmFk
aXRpb25hbDogZmFsc2UsCisgICAgICAgIGhlYWRlcnM6IHt9LAorICAgICAgICAqLworCisgICAg
ICAgIGFjY2VwdHM6IHsKKyAgICAgICAgICAgICIqIjogYWxsVHlwZXMsCisgICAgICAgICAgICB0
ZXh0OiAidGV4dC9wbGFpbiIsCisgICAgICAgICAgICBodG1sOiAidGV4dC9odG1sIiwKKyAgICAg
ICAgICAgIHhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorICAgICAgICAgICAganNv
bjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIKKyAgICAgICAgfSwKKworICAg
ICAgICBjb250ZW50czogeworICAgICAgICAgICAgeG1sOiAvXGJ4bWxcYi8sCisgICAgICAgICAg
ICBodG1sOiAvXGJodG1sLywKKyAgICAgICAgICAgIGpzb246IC9cYmpzb25cYi8KKyAgICAgICAg
fSwKKworICAgICAgICByZXNwb25zZUZpZWxkczogeworICAgICAgICAgICAgeG1sOiAicmVzcG9u
c2VYTUwiLAorICAgICAgICAgICAgdGV4dDogInJlc3BvbnNlVGV4dCIsCisgICAgICAgICAgICBq
c29uOiAicmVzcG9uc2VKU09OIgorICAgICAgICB9LAorCisgICAgICAgIC8vIERhdGEgY29udmVy
dGVycworICAgICAgICAvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBh
bmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQorICAgICAgICBjb252ZXJ0
ZXJzOiB7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAorICAgICAg
ICAgICAgIiogdGV4dCI6IFN0cmluZywKKworICAgICAgICAgICAgLy8gVGV4dCB0byBodG1sICh0
cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCisgICAgICAgICAgICAidGV4dCBodG1sIjogdHJ1ZSwK
KworICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgorICAg
ICAgICAgICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCisKKyAgICAgICAgICAgIC8v
IFBhcnNlIHRleHQgYXMgeG1sCisgICAgICAgICAgICAidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VY
TUwKKyAgICAgICAgfSwKKworICAgICAgICAvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBi
ZSBkZWVwIGV4dGVuZGVkOgorICAgICAgICAvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20g
b3B0aW9ucyBoZXJlIGlmCisgICAgICAgIC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQg
c2hvdWxkbid0IGJlCisgICAgICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQor
ICAgICAgICBmbGF0T3B0aW9uczogeworICAgICAgICAgICAgdXJsOiB0cnVlLAorICAgICAgICAg
ICAgY29udGV4dDogdHJ1ZQorICAgICAgICB9CisgICAgfSwKKworICAgIC8vIENyZWF0ZXMgYSBm
dWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0CisgICAgLy8gd2l0aCBib3Ro
IGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgorICAgIC8vIElmIHRhcmdldCBpcyBv
bWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCisgICAgYWpheFNldHVwOiBmdW5jdGlv
biggdGFyZ2V0LCBzZXR0aW5ncyApIHsKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzID8KKworICAg
ICAgICAgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKKyAgICAgICAgICAgIGFqYXhF
eHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5n
cyApIDoKKworICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncworICAgICAgICAg
ICAgYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7CisgICAgfSwKKwor
ICAgIGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVy
cyApLAorICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJh
bnNwb3J0cyApLAorCisgICAgLy8gTWFpbiBtZXRob2QKKyAgICBhamF4OiBmdW5jdGlvbiggdXJs
LCBvcHRpb25zICkgeworCisgICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRl
IHByZS0xLjUgc2lnbmF0dXJlCisgICAgICAgIGlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIg
KSB7CisgICAgICAgICAgICBvcHRpb25zID0gdXJsOworICAgICAgICAgICAgdXJsID0gdW5kZWZp
bmVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmpl
Y3QKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAgICAgICAgdmFyIHRyYW5z
cG9ydCwKKworICAgICAgICAgICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQorICAg
ICAgICAgICAgY2FjaGVVUkwsCisKKyAgICAgICAgICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMKKyAg
ICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1N0cmluZywKKyAgICAgICAgICAgIHJlc3BvbnNlSGVh
ZGVycywKKworICAgICAgICAgICAgLy8gdGltZW91dCBoYW5kbGUKKyAgICAgICAgICAgIHRpbWVv
dXRUaW1lciwKKworICAgICAgICAgICAgLy8gVXJsIGNsZWFudXAgdmFyCisgICAgICAgICAgICB1
cmxBbmNob3IsCisKKyAgICAgICAgICAgIC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUg
dG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICAgICAgZmlyZUdsb2JhbHMsCisKKyAgICAgICAgICAg
IC8vIExvb3AgdmFyaWFibGUKKyAgICAgICAgICAgIGksCisKKyAgICAgICAgICAgIC8vIENyZWF0
ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKKyAgICAgICAgICAgIHMgPSBqUXVlcnkuYWpheFNl
dHVwKCB7fSwgb3B0aW9ucyApLAorCisgICAgICAgICAgICAvLyBDYWxsYmFja3MgY29udGV4dAor
ICAgICAgICAgICAgY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCisKKyAgICAgICAg
ICAgIC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0
IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb24KKyAgICAgICAgICAgIGdsb2JhbEV2
ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJgorICAgICAgICAgICAgICAgICggY2FsbGJhY2tDb250
ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOgorICAgICAgICAgICAgICAgICAgICBq
UXVlcnkuZXZlbnQsCisKKyAgICAgICAgICAgIC8vIERlZmVycmVkcworICAgICAgICAgICAgZGVm
ZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQg
PSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCisKKyAgICAgICAgICAgIC8vIFN0
YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisgICAgICAgICAgICBzdGF0dXNDb2RlID0gcy5zdGF0
dXNDb2RlIHx8IHt9LAorCisgICAgICAgICAgICAvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFs
bCBhdCBvbmNlKQorICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKKyAgICAgICAgICAg
IHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKKworICAgICAgICAgICAgLy8gVGhlIGpxWEhSIHN0
YXRlCisgICAgICAgICAgICBzdGF0ZSA9IDAsCisKKyAgICAgICAgICAgIC8vIERlZmF1bHQgYWJv
cnQgbWVzc2FnZQorICAgICAgICAgICAgc3RyQWJvcnQgPSAiY2FuY2VsZWQiLAorCisgICAgICAg
ICAgICAvLyBGYWtlIHhocgorICAgICAgICAgICAganFYSFIgPSB7CisgICAgICAgICAgICAgICAg
cmVhZHlTdGF0ZTogMCwKKworICAgICAgICAgICAgICAgIC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0
YWJsZSBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rp
b24oIGtleSApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoOworICAgICAgICAgICAg
ICAgICAgICBpZiAoIHN0YXRlID09PSAyICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCAhcmVzcG9uc2VIZWFkZXJzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Bv
bnNlSGVhZGVycyA9IHt9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCBt
YXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50
b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1h
dGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVs
bCA6IG1hdGNoOworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAvLyBSYXcg
c3RyaW5nCisgICAgICAgICAgICAgICAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFk
ZXJzU3RyaW5nIDogbnVsbDsKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAg
Ly8gQ2FjaGVzIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyOiBm
dW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsbmFtZSA9
IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdGUgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5h
bWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAg
ICAgICB9LAorCisgICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQt
dHlwZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbigg
dHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBzLm1pbWVUeXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICAgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICAgICAgICAg
ICAgICBzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgeworICAgICAgICAgICAgICAgICAgICB2
YXIgY29kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXAgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHN0YXRlIDwgMiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKCBjb2RlIGluIG1hcCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9s
ZCBvbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGVbIGNvZGUg
XSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFj
a3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5hbHdheXMoIG1hcFsganFYSFIu
c3RhdHVzIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9
LAorCisgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAg
ICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgeworICAgICAgICAgICAgICAgICAgICB2
YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCB0cmFuc3BvcnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQu
YWJvcnQoIGZpbmFsVGV4dCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIC8vIEF0
dGFjaCBkZWZlcnJlZHMKKyAgICAgICAgZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0
ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOworICAgICAgICBqcVhIUi5zdWNjZXNzID0ganFYSFIu
ZG9uZTsKKyAgICAgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOworCisgICAgICAgIC8vIFJl
bW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQorICAgICAg
ICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVj
dCBpdCkKKyAgICAgICAgLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0
ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKKyAgICAgICAgLy8gV2Ug
YWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCisgICAgICAgIHMudXJsID0g
KCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyAiIiApLnJlcGxhY2UoIHJoYXNo
LCAiIiApCisgICAgICAgICAgICAucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2Nv
bCArICIvLyIgKTsKKworICAgICAgICAvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMg
cGVyIHRpY2tldCAjMTIwMDQKKyAgICAgICAgcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0
aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKKworICAgICAgICAvLyBFeHRyYWN0IGRh
dGFUeXBlcyBsaXN0CisgICAgICAgIHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5
cGUgfHwgIioiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwor
CisgICAgICAgIC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUg
b3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgorICAgICAgICBpZiAoIHMu
Y3Jvc3NEb21haW4gPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHVybEFuY2hvciA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoICJhIiApOworCisgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgtMTEr
CisgICAgICAgICAgICAvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIGlmIHVybCBpcyBtYWxmb3JtZWQs
IGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAg
ICAgICAgICAgdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKKworICAgICAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFOC0xMSsKKyAgICAgICAgICAgICAgICAvLyBBbmNob3IncyBob3N0IHByb3BlcnR5
IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQorICAgICAgICAgICAg
ICAgIHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7CisgICAgICAgICAgICAgICAgcy5j
cm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArICIvLyIgKyBvcmlnaW5BbmNob3Iu
aG9zdCAhPT0KKyAgICAgICAgICAgICAgICAgICAgdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiAr
IHVybEFuY2hvci5ob3N0OworICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBp
dCBpcyBjcm9zc0RvbWFpbiwKKyAgICAgICAgICAgICAgICAvLyBpdCBjYW4gYmUgcmVqZWN0ZWQg
YnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgcy5jcm9z
c0RvbWFpbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBD
b252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKyAgICAgICAgaWYgKCBzLmRhdGEg
JiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICAg
ICAgICAgIHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSBwcmVmaWx0ZXJzCisgICAgICAgIGluc3BlY3RQ
cmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwor
CisgICAgICAgIC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBz
dG9wIHRoZXJlCisgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7CisgICAgICAgICAgICByZXR1
cm4ganFYSFI7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZl
bnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bworICAgICAgICAvLyBEb24ndCBmaXJlIGV2ZW50cyBp
ZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1
MTE4KQorICAgICAgICBmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDsKKwor
ICAgICAgICAvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisgICAgICAgIGlmICgg
ZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgeworICAgICAgICAgICAgalF1
ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBVcHBlcmNhc2UgdGhlIHR5cGUKKyAgICAgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNl
KCk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKKyAgICAg
ICAgcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CisKKyAgICAgICAg
Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVk
LVNpbmNlCisgICAgICAgIC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgor
ICAgICAgICBjYWNoZVVSTCA9IHMudXJsOworCisgICAgICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5k
bGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgICAgIGlmICggIXMuaGFzQ29u
dGVudCApIHsKKworICAgICAgICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBk
YXRhIHRvIHVybAorICAgICAgICAgICAgaWYgKCBzLmRhdGEgKSB7CisgICAgICAgICAgICAgICAg
Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAi
PyIgKSArIHMuZGF0YSApOworCisgICAgICAgICAgICAgICAgLy8gIzk2ODI6IHJlbW92ZSBkYXRh
IHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeQorICAgICAgICAgICAg
ICAgIGRlbGV0ZSBzLmRhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBh
bnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmICggcy5jYWNoZSA9PT0g
ZmFsc2UgKSB7CisgICAgICAgICAgICAgICAgcy51cmwgPSBydHMudGVzdCggY2FjaGVVUkwgKSA/
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJh
bWV0ZXIsIHNldCBpdHMgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVVUkwucmVwbGFj
ZSggcnRzLCAiJDFfPSIgKyBub25jZSsrICkgOgorCisgICAgICAgICAgICAgICAgICAgIC8vIE90
aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVVUkwg
KyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgbm9uY2Ur
KzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgSWYtTW9k
aWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVk
IG1vZGUuCisgICAgICAgIGlmICggcy5pZk1vZGlmaWVkICkgeworICAgICAgICAgICAgaWYgKCBq
UXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkgeworICAgICAgICAgICAgICAgIGpxWEhS
LnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZp
ZWRbIGNhY2hlVVJMIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggalF1ZXJ5
LmV0YWdbIGNhY2hlVVJMIF0gKSB7CisgICAgICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhl
YWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwg
aWYgZGF0YSBpcyBiZWluZyBzZW50CisgICAgICAgIGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVu
dCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkgewor
ICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29u
dGVudFR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgQWNjZXB0cyBoZWFk
ZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKKyAgICAgICAganFY
SFIuc2V0UmVxdWVzdEhlYWRlcigKKyAgICAgICAgICAgICJBY2NlcHQiLAorICAgICAgICAgICAg
cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CisgICAg
ICAgICAgICAgICAgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gKworICAgICAgICAgICAg
ICAgICAgICAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7
IHE9MC4wMSIgOiAiIiApIDoKKyAgICAgICAgICAgICAgICBzLmFjY2VwdHNbICIqIiBdCisgICAg
ICAgICk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCisgICAgICAgIGZv
ciAoIGkgaW4gcy5oZWFkZXJzICkgeworICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhlYWRl
ciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG93IGN1
c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKyAgICAgICAgaWYgKCBzLmJl
Zm9yZVNlbmQgJiYKKyAgICAgICAgICAgICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29u
dGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKKworICAgICAg
ICAgICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisgICAgICAgICAg
ICByZXR1cm4ganFYSFIuYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFib3J0aW5n
IGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgorICAgICAgICBzdHJBYm9ydCA9ICJhYm9ydCI7
CisKKyAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisgICAgICAgIGZv
ciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKKyAgICAg
ICAgICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0
IHRyYW5zcG9ydAorICAgICAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNw
b3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworICAgICAgICAvLyBJZiBu
byB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKKyAgICAgICAgaWYgKCAhdHJhbnNwb3J0ICkgewor
ICAgICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0gMTsKKworICAgICAgICAgICAgLy8gU2Vu
ZCBnbG9iYWwgZXZlbnQKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7CisgICAgICAg
ICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIs
IHMgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiByZXF1ZXN0IHdhcyBh
Ym9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZQorICAgICAgICAgICAgaWYgKCBzdGF0
ZSA9PT0gMiApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ganFYSFI7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIC8vIFRpbWVvdXQKKyAgICAgICAgICAgIGlmICggcy5hc3luYyAmJiBz
LnRpbWVvdXQgPiAwICkgeworICAgICAgICAgICAgICAgIHRpbWVvdXRUaW1lciA9IHdpbmRvdy5z
ZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAganFYSFIuYWJvcnQo
ICJ0aW1lb3V0IiApOworICAgICAgICAgICAgICAgIH0sIHMudGltZW91dCApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gMTsKKyAg
ICAgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKKyAg
ICAgICAgICAgIH0gY2F0Y2ggKCBlICkgeworCisgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRl
IGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZQorICAgICAgICAgICAgICAgIGlmICggc3Rh
dGUgPCAyICkgeworICAgICAgICAgICAgICAgICAgICBkb25lKCAtMSwgZSApOworCisgICAgICAg
ICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsYmFjayBmb3Igd2hlbiBl
dmVyeXRoaW5nIGlzIGRvbmUKKyAgICAgICAgZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVT
dGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CisgICAgICAgICAgICB2YXIgaXNTdWNj
ZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorICAgICAgICAgICAgICAg
IHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OworCisgICAgICAgICAgICAvLyBDYWxsZWQg
b25jZQorICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PT0gMiApIHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXRlIGlzICJkb25lIiBu
b3cKKyAgICAgICAgICAgIHN0YXRlID0gMjsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91
dCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIGlmICggdGltZW91dFRpbWVyICkgeworICAgICAg
ICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdh
cmJhZ2UgY29sbGVjdGlvbgorICAgICAgICAgICAgLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUg
anFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IHVuZGVm
aW5lZDsKKworICAgICAgICAgICAgLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycworICAgICAgICAg
ICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKKworICAgICAgICAgICAg
Ly8gU2V0IHJlYWR5U3RhdGUKKyAgICAgICAgICAgIGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMg
PiAwID8gNCA6IDA7CisKKyAgICAgICAgICAgIC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCisg
ICAgICAgICAgICBpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBz
dGF0dXMgPT09IDMwNDsKKworICAgICAgICAgICAgLy8gR2V0IHJlc3BvbnNlIGRhdGEKKyAgICAg
ICAgICAgIGlmICggcmVzcG9uc2VzICkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYWph
eEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25z
ZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpCisgICAgICAgICAgICByZXNwb25zZSA9IGFqYXhD
b252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOworCisgICAgICAgICAgICAv
LyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZworICAgICAgICAgICAgaWYgKCBp
c1N1Y2Nlc3MgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNp
bmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgor
ICAgICAgICAgICAgICAgIGlmICggcy5pZk1vZGlmaWVkICkgeworICAgICAgICAgICAgICAgICAg
ICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCAiTGFzdC1Nb2RpZmllZCIgKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGpxWEhSLmdl
dFJlc3BvbnNlSGVhZGVyKCAiZXRhZyIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2Rp
ZmllZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBd
ID0gbW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAvLyBpZiBubyBjb250ZW50CisgICAgICAgICAgICAgICAgaWYgKCBz
dGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKKyAgICAgICAgICAgICAgICAg
ICAgc3RhdHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisgICAgICAgICAgICAgICAgLy8gaWYgbm90
IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7
CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSAibm90bW9kaWZpZWQiOworCisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCA9IHJlc3Bv
bnNlLnN0YXRlOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTsK
KyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjsKKyAgICAgICAgICAg
ICAgICAgICAgaXNTdWNjZXNzID0gIWVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGVycm9yIGZyb20gc3Rh
dHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzCisgICAgICAgICAgICAgICAgZXJy
b3IgPSBzdGF0dXNUZXh0OworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNU
ZXh0ICkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHho
ciBvYmplY3QKKyAgICAgICAgICAgIGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAg
IGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsg
IiI7CisKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MvRXJyb3IKKyAgICAgICAgICAgIGlmICggaXNT
dWNjZXNzICkgeworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFj
a0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0Nv
bnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICAgICAgICAgIGpx
WEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTsKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB1
bmRlZmluZWQ7CisKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7CisgICAgICAgICAg
ICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2Vz
cyIgOiAiYWpheEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywgaXNTdWNj
ZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gQ29tcGxldGUKKyAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxi
YWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7CisKKyAgICAgICAgICAgIGlmICgg
ZmlyZUdsb2JhbHMgKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdn
ZXIoICJhamF4Q29tcGxldGUiLCBbIGpxWEhSLCBzIF0gKTsKKworICAgICAgICAgICAgICAgIC8v
IEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorICAgICAgICAgICAgICAgIGlmICggISgg
LS1qUXVlcnkuYWN0aXZlICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50
cmlnZ2VyKCAiYWpheFN0b3AiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGpxWEhSOworICAgIH0sCisKKyAgICBnZXRKU09O
OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKyAgICAgICAgcmV0dXJuIGpRdWVy
eS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOworICAgIH0sCisKKyAgICBnZXRT
Y3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgeworICAgICAgICByZXR1cm4galF1ZXJ5
LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOworICAgIH0KK30gKTsK
KworalF1ZXJ5LmVhY2goIFsgImdldCIsICJwb3N0IiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkg
eworICAgIGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywg
dHlwZSApIHsKKworICAgICAgICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3
YXMgb21pdHRlZAorICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7Cisg
ICAgICAgICAgICB0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKKyAgICAgICAgICAgIGNhbGxiYWNr
ID0gZGF0YTsKKyAgICAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0
IGhhdmUgLnVybCkKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7
CisgICAgICAgICAgICB1cmw6IHVybCwKKyAgICAgICAgICAgIHR5cGU6IG1ldGhvZCwKKyAgICAg
ICAgICAgIGRhdGFUeXBlOiB0eXBlLAorICAgICAgICAgICAgZGF0YTogZGF0YSwKKyAgICAgICAg
ICAgIHN1Y2Nlc3M6IGNhbGxiYWNrCisgICAgICAgIH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1
cmwgKSAmJiB1cmwgKSApOworICAgIH07Cit9ICk7CisKKworalF1ZXJ5Ll9ldmFsVXJsID0gZnVu
Y3Rpb24oIHVybCApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFqYXgoIHsKKyAgICAgICAgdXJsOiB1
cmwsCisKKyAgICAgICAgLy8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVy
cmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpCisgICAgICAgIHR5cGU6ICJHRVQi
LAorICAgICAgICBkYXRhVHlwZTogInNjcmlwdCIsCisgICAgICAgIGFzeW5jOiBmYWxzZSwKKyAg
ICAgICAgZ2xvYmFsOiBmYWxzZSwKKyAgICAgICAgInRocm93cyI6IHRydWUKKyAgICB9ICk7Cit9
OworCisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICB3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCAp
IHsKKyAgICAgICAgdmFyIHdyYXA7CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
aHRtbCApICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7
CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKCB0aGlz
LCBpICkgKTsKKyAgICAgICAgICAgIH0gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGhp
c1sgMCBdICkgeworCisgICAgICAgICAgICAvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFy
Z2V0IGFyb3VuZAorICAgICAgICAgICAgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93
bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CisKKyAgICAgICAgICAgIGlmICgg
dGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7CisgICAgICAgICAgICAgICAgd3JhcC5pbnNlcnRCZWZv
cmUoIHRoaXNbIDAgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cmFwLm1hcCgg
ZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzOworCisgICAgICAg
ICAgICAgICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgeworICAgICAgICAgICAg
ICAgICAgICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDsKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKKyAgICAgICAgICAgIH0gKS5hcHBlbmQo
IHRoaXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICB3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCBodG1sICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlv
biggaSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwu
Y2FsbCggdGhpcywgaSApICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBzZWxmID0g
alF1ZXJ5KCB0aGlzICksCisgICAgICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLmNvbnRlbnRz
KCk7CisKKyAgICAgICAgICAgIGlmICggY29udGVudHMubGVuZ3RoICkgeworICAgICAgICAgICAg
ICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBzZWxmLmFwcGVuZCggaHRtbCApOworICAgICAgICAgICAgfQorICAgICAg
ICB9ICk7CisgICAgfSwKKworICAgIHdyYXA6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICB2
YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CisgICAgICAgICAgICBqUXVlcnkoIHRoaXMg
KS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7Cisg
ICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgdW53cmFwOiBmdW5jdGlvbigpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaCggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAo
ICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgeworICAgICAgICAgICAgICAgIGpR
dWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSApLmVuZCgpOworICAgIH0KK30gKTsKKworCitqUXVlcnkuZXhwci5maWx0
ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAhalF1ZXJ5LmV4cHIu
ZmlsdGVycy52aXNpYmxlKCBlbGVtICk7Cit9OworalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxl
ID0gZnVuY3Rpb24oIGVsZW0gKSB7CisKKyAgICAvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMgor
ICAgIC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3Mg
dGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKKyAgICAvLyBVc2UgT1IgaW5zdGVhZCBvZiBBTkQg
YXMgdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUgaWYgZWl0aGVyIGlzIHRydWUKKyAgICAvLyBT
ZWUgdGlja2V0cyAjMTA0MDYgYW5kICMxMzEzMgorICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRo
ID4gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA+IDAgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxl
bmd0aCA+IDA7Cit9OworCisKKworCit2YXIgcjIwID0gLyUyMC9nLAorICAgIHJicmFja2V0ID0g
L1xbXF0kLywKKyAgICByQ1JMRiA9IC9ccj9cbi9nLAorICAgIHJzdWJtaXR0ZXJUeXBlcyA9IC9e
KD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSwKKyAgICByc3VibWl0dGFibGUg
PSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7CisKK2Z1bmN0aW9uIGJ1aWxk
UGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKyAgICB2YXIgbmFtZTsK
KworICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgeworCisgICAgICAgIC8vIFNlcmlh
bGl6ZSBhcnJheSBpdGVtLgorICAgICAgICBqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwg
diApIHsKKyAgICAgICAgICAgIGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJl
Zml4ICkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMg
YSBzY2FsYXIuCisgICAgICAgICAgICAgICAgYWRkKCBwcmVmaXgsIHYgKTsKKworICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJy
YXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LgorICAgICAgICAgICAgICAg
IGJ1aWxkUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAiWyIgKyAoIHR5cGVv
ZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKKyAgICAgICAg
ICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICAgICAgdHJhZGl0aW9uYWwsCisgICAgICAg
ICAgICAgICAgICAgIGFkZAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gKTsKKworICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSgg
b2JqICkgPT09ICJvYmplY3QiICkgeworCisgICAgICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRl
bS4KKyAgICAgICAgZm9yICggbmFtZSBpbiBvYmogKSB7CisgICAgICAgICAgICBidWlsZFBhcmFt
cyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBh
ZGQgKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBTZXJpYWxpemUg
c2NhbGFyIGl0ZW0uCisgICAgICAgIGFkZCggcHJlZml4LCBvYmogKTsKKyAgICB9Cit9CisKKy8v
IFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisvLyBrZXkv
dmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKK2pRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0
cmFkaXRpb25hbCApIHsKKyAgICB2YXIgcHJlZml4LAorICAgICAgICBzID0gW10sCisgICAgICAg
IGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCisgICAgICAgICAgICAvLyBJZiB2YWx1
ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKKyAgICAgICAg
ICAgIHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1
ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOworICAgICAgICAgICAgc1sgcy5sZW5ndGggXSA9IGVu
Y29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVl
ICk7CisgICAgICAgIH07CisKKyAgICAvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1
ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLgorICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVy
eS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7CisgICAgfQorCisgICAgLy8gSWYgYW4gYXJyYXkg
d2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50
cy4KKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5
LmlzUGxhaW5PYmplY3QoIGEgKSApICkgeworCisgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgZm9y
bSBlbGVtZW50cworICAgICAgICBqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisgICAgICAg
ICAgICBhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOworICAgICAgICB9ICk7CisKKyAgICB9
IGVsc2UgeworCisgICAgICAgIC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdh
eSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgorICAgICAgICAvLyBkaWQgaXQpLCBvdGhlcndpc2Ug
ZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKyAgICAgICAgZm9yICggcHJlZml4IGluIGEgKSB7
CisgICAgICAgICAgICBidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9u
YWwsIGFkZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRp
bmcgc2VyaWFsaXphdGlvbgorICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwg
IisiICk7Cit9OworCitqUXVlcnkuZm4uZXh0ZW5kKCB7CisgICAgc2VyaWFsaXplOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgp
ICk7CisgICAgfSwKKyAgICBzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJl
dHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIENhbiBhZGQgcHJv
cEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAg
ICAgICAgICB2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRzIiApOwor
ICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMg
KSA6IHRoaXM7CisgICAgICAgIH0gKQorICAgICAgICAuZmlsdGVyKCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOworCisgICAgICAgICAgICAvLyBVc2UgLmlz
KCAiOmRpc2FibGVkIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggIjpkaXNhYmxlZCIg
KSAmJgorICAgICAgICAgICAgICAgIHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkg
JiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKKyAgICAgICAgICAgICAgICAoIHRo
aXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7CisgICAgICAgIH0g
KQorICAgICAgICAubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKKyAgICAgICAgICAgIHZhciB2
YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbCA9PSBu
dWxsID8KKyAgICAgICAgICAgICAgICBudWxsIDoKKyAgICAgICAgICAgICAgICBqUXVlcnkuaXNB
cnJheSggdmFsICkgPworICAgICAgICAgICAgICAgICAgICBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0
aW9uKCB2YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBlbGVt
Lm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CisgICAgICAgICAg
ICAgICAgICAgIH0gKSA6CisgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogZWxlbS5uYW1lLCB2
YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OworICAgICAgICB9ICkuZ2V0KCk7
CisgICAgfQorfSApOworCisKK2pRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7
CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsK
KyAgICB9IGNhdGNoICggZSApIHt9Cit9OworCit2YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHsKKwor
ICAgICAgICAvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNz
dW1lIDIwMAorICAgICAgICAwOiAyMDAsCisKKyAgICAgICAgLy8gU3VwcG9ydDogSUU5CisgICAg
ICAgIC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJl
IDIwNAorICAgICAgICAxMjIzOiAyMDQKKyAgICB9LAorICAgIHhoclN1cHBvcnRlZCA9IGpRdWVy
eS5hamF4U2V0dGluZ3MueGhyKCk7CisKK3N1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYm
ICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7CitzdXBwb3J0LmFqYXggPSB4
aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKKworalF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1
bmN0aW9uKCBvcHRpb25zICkgeworICAgIHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKKwor
ICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1M
SHR0cFJlcXVlc3QKKyAgICBpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9w
dGlvbnMuY3Jvc3NEb21haW4gKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBzZW5k
OiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7CisgICAgICAgICAgICAgICAgdmFyIGks
CisgICAgICAgICAgICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyKCk7CisKKyAgICAgICAgICAg
ICAgICB4aHIub3BlbigKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlLAorICAgICAg
ICAgICAgICAgICAgICBvcHRpb25zLnVybCwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5h
c3luYywKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51c2VybmFtZSwKKyAgICAgICAgICAg
ICAgICAgICAgb3B0aW9ucy5wYXNzd29yZAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAg
ICAgICAgICAvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkCisgICAgICAgICAgICAg
ICAgaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICgg
aSBpbiBvcHRpb25zLnhockZpZWxkcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhoclsg
aSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBp
ZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92
ZXJyaWRlTWltZVR5cGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHhoci5vdmVycmlkZU1pbWVU
eXBlKCBvcHRpb25zLm1pbWVUeXBlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgLy8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXIKKyAgICAgICAgICAgICAgICAvLyBGb3Ig
Y3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGln
aHQgYXJlCisgICAgICAgICAgICAgICAgLy8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNp
bXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS4KKyAgICAgICAgICAgICAgICAvLyAoaXQgY2Fu
IGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhT
ZXR1cCkKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0
IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KKyAgICAgICAgICAgICAgICBpZiAo
ICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyAiWC1SZXF1ZXN0ZWQtV2l0aCIgXSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAi
WE1MSHR0cFJlcXVlc3QiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8v
IFNldCBoZWFkZXJzCisgICAgICAgICAgICAgICAgZm9yICggaSBpbiBoZWFkZXJzICkgeworICAg
ICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sKKyAgICAg
ICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNh
bGxiYWNrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZXJyb3JD
YWxsYmFjayA9IHhoci5vbmxvYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4
aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJhYm9ydCIgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUU5CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRo
cm93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb24gYW55IHBy
b3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoIDAsICJlcnJvciIgKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKAorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMg
MDsgc2VlICM4NjA1LCAjMTQyMDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB4aHIuc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHhoci5zdGF0dXNUZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJTdWNjZXNzU3RhdHVzWyB4
aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHhoci5zdGF0dXNUZXh0LAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBTdXBwb3J0OiBJRTkgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gSUU5IGhhcyBubyBYSFIyIGJ1dCB0aHJvd3Mgb24gYmluYXJ5ICh0cmFjLTExNDI2
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFhIUjIgbm9uLXRl
eHQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSBpdCAoZ2gtMjQ5OCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRl
eHQiICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHhoci5y
ZXNwb25zZVRleHQgIT09ICJzdHJpbmciID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8g
ZXZlbnRzCisgICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CisgICAgICAg
ICAgICAgICAgZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0gY2FsbGJhY2soICJlcnJvciIg
KTsKKworICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFOQorICAgICAgICAgICAgICAgIC8v
IFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CisgICAgICAgICAgICAg
ICAgLy8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0cworICAgICAgICAgICAgICAgIGlmICggeGhy
Lm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICAgICAgeGhyLm9uYWJv
cnQgPSBlcnJvckNhbGxiYWNrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBp
dCBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHhoci5yZWFkeVN0YXRlID09
PSA0ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgb25lcnJvciB0
byBiZSBjYWxsZWQgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRo
YXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWQK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24o
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhYm9y
dCBjYWxsYmFjaworICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIg
KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8g
c2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKQorICAgICAgICAg
ICAgICAgICAgICB4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8
fCBudWxsICk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgLy8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3Rp
ZmllZCBhcyBhbiBlcnJvciB5ZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjYWxsYmFjayAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBhYm9y
dDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjYWxsYmFjayApIHsKKyAgICAg
ICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgIH07CisgICAgfQorfSApOworCisKKworCisvLyBJbnN0YWxsIHNjcmlwdCBk
YXRhVHlwZQoralF1ZXJ5LmFqYXhTZXR1cCggeworICAgIGFjY2VwdHM6IHsKKyAgICAgICAgc2Ny
aXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCAiICsKKyAgICAg
ICAgICAgICJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQi
CisgICAgfSwKKyAgICBjb250ZW50czogeworICAgICAgICBzY3JpcHQ6IC9cYig/OmphdmF8ZWNt
YSlzY3JpcHRcYi8KKyAgICB9LAorICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAgInRleHQgc2Ny
aXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CisgICAgICAgICAgICBqUXVlcnkuZ2xvYmFsRXZhbCgg
dGV4dCApOworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9ICk7
CisKKy8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW4KK2pRdWVy
eS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisgICAgaWYgKCBzLmNh
Y2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgIHMuY2FjaGUgPSBmYWxzZTsKKyAgICB9Cisg
ICAgaWYgKCBzLmNyb3NzRG9tYWluICkgeworICAgICAgICBzLnR5cGUgPSAiR0VUIjsKKyAgICB9
Cit9ICk7CisKKy8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydAoralF1ZXJ5LmFqYXhU
cmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKKworICAgIC8vIFRoaXMgdHJhbnNw
b3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKKyAgICBpZiAoIHMuY3Jv
c3NEb21haW4gKSB7CisgICAgICAgIHZhciBzY3JpcHQsIGNhbGxiYWNrOworICAgICAgICByZXR1
cm4geworICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgeworICAgICAg
ICAgICAgICAgIHNjcmlwdCA9IGpRdWVyeSggIjxzY3JpcHQ+IiApLnByb3AoIHsKKyAgICAgICAg
ICAgICAgICAgICAgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LAorICAgICAgICAgICAgICAgICAg
ICBzcmM6IHMudXJsCisgICAgICAgICAgICAgICAgfSApLm9uKAorICAgICAgICAgICAgICAgICAg
ICAibG9hZCBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24o
IGV2dCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggZXZ0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCBl
dnQudHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7
CisKKyAgICAgICAgICAgICAgICAvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZv
aWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5o
ZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApOworICAgICAgICAgICAgfSwKKyAgICAgICAg
ICAgIGFib3J0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGNhbGxiYWNrICkg
eworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9ICk7CisKKworCisKK3ZhciBvbGRDYWxs
YmFja3MgPSBbXSwKKyAgICByanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vOworCisvLyBEZWZh
dWx0IGpzb25wIHNldHRpbmdzCitqUXVlcnkuYWpheFNldHVwKCB7CisgICAganNvbnA6ICJjYWxs
YmFjayIsCisgICAganNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjYWxs
YmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBu
b25jZSsrICkgKTsKKyAgICAgICAgdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7CisgICAgICAgIHJl
dHVybiBjYWxsYmFjazsKKyAgICB9Cit9ICk7CisKKy8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlv
bnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cworalF1ZXJ5LmFqYXhQ
cmVmaWx0ZXIoICJqc29uIGpzb25wIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpx
WEhSICkgeworCisgICAgdmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29u
dGFpbmVyLAorICAgICAgICBqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25w
LnRlc3QoIHMudXJsICkgPworICAgICAgICAgICAgInVybCIgOgorICAgICAgICAgICAgdHlwZW9m
IHMuZGF0YSA9PT0gInN0cmluZyIgJiYKKyAgICAgICAgICAgICAgICAoIHMuY29udGVudFR5cGUg
fHwgIiIgKQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3
LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgIHJqc29ucC50ZXN0
KCBzLmRhdGEgKSAmJiAiZGF0YSIKKyAgICAgICAgKTsKKworICAgIC8vIEhhbmRsZSBpZmYgdGhl
IGV4cGVjdGVkIGRhdGEgdHlwZSBpcyAianNvbnAiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8g
c2V0CisgICAgaWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiICkg
eworCisgICAgICAgIC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGlu
ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQKKyAgICAgICAgY2FsbGJhY2tOYW1lID0gcy5qc29u
cENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KKyAgICAg
ICAgICAgIHMuanNvbnBDYWxsYmFjaygpIDoKKyAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjazsK
KworICAgICAgICAvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhCisgICAg
ICAgIGlmICgganNvblByb3AgKSB7CisgICAgICAgICAgICBzWyBqc29uUHJvcCBdID0gc1sganNv
blByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKKyAgICAgICAg
fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7CisgICAgICAgICAgICBzLnVybCArPSAo
IHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmpzb25wICsgIj0iICsgY2Fs
bGJhY2tOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlIGRhdGEgY29udmVydGVyIHRv
IHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorICAgICAgICBzLmNvbnZlcnRl
cnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCAhcmVz
cG9uc2VDb250YWluZXIgKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LmVycm9yKCBjYWxsYmFj
a05hbWUgKyAiIHdhcyBub3QgY2FsbGVkIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07CisgICAgICAgIH07CisKKyAgICAgICAgLy8g
Rm9yY2UganNvbiBkYXRhVHlwZQorICAgICAgICBzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOwor
CisgICAgICAgIC8vIEluc3RhbGwgY2FsbGJhY2sKKyAgICAgICAgb3ZlcndyaXR0ZW4gPSB3aW5k
b3dbIGNhbGxiYWNrTmFtZSBdOworICAgICAgICB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50czsKKyAg
ICAgICAgfTsKKworICAgICAgICAvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29u
dmVydGVycykKKyAgICAgICAganFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHsKKworICAgICAgICAg
ICAgLy8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0CisgICAgICAg
ICAgICBpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAg
alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKKworICAgICAgICAg
ICAgLy8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWUKKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgd2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0
dGVuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIGJhY2sgYXMgZnJlZQor
ICAgICAgICAgICAgaWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHsKKworICAgICAgICAgICAgICAg
IC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhp
bmdzIGFyb3VuZAorICAgICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0
dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGNhbGxi
YWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgICAgICBvbGRDYWxsYmFja3MucHVz
aCggY2FsbGJhY2tOYW1lICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENhbGwg
aWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQorICAgICAgICAgICAg
aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4g
KSApIHsKKyAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAg
XSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZUNvbnRhaW5lciA9IG92
ZXJ3cml0dGVuID0gdW5kZWZpbmVkOworICAgICAgICB9ICk7CisKKyAgICAgICAgLy8gRGVsZWdh
dGUgdG8gc2NyaXB0CisgICAgICAgIHJldHVybiAic2NyaXB0IjsKKyAgICB9Cit9ICk7CisKKwor
CisKKy8vIEFyZ3VtZW50ICJkYXRhIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWwKKy8vIGNvbnRl
eHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVk
IGluIHRoaXMgY29udGV4dCwKKy8vIGRlZmF1bHRzIHRvIGRvY3VtZW50CisvLyBrZWVwU2NyaXB0
cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhl
IGh0bWwgc3RyaW5nCitqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQs
IGtlZXBTY3JpcHRzICkgeworICAgIGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJp
bmciICkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgY29u
dGV4dCA9PT0gImJvb2xlYW4iICkgeworICAgICAgICBrZWVwU2NyaXB0cyA9IGNvbnRleHQ7Cisg
ICAgICAgIGNvbnRleHQgPSBmYWxzZTsKKyAgICB9CisgICAgY29udGV4dCA9IGNvbnRleHQgfHwg
ZG9jdW1lbnQ7CisKKyAgICB2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICksCisg
ICAgICAgIHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107CisKKyAgICAvLyBTaW5nbGUgdGFn
CisgICAgaWYgKCBwYXJzZWQgKSB7CisgICAgICAgIHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxl
bWVudCggcGFyc2VkWyAxIF0gKSBdOworICAgIH0KKworICAgIHBhcnNlZCA9IGJ1aWxkRnJhZ21l
bnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CisKKyAgICBpZiAoIHNjcmlwdHMgJiYg
c2NyaXB0cy5sZW5ndGggKSB7CisgICAgICAgIGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwor
ICAgIH0KKworICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyAp
OworfTsKKworCisvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCit2YXIgX2xv
YWQgPSBqUXVlcnkuZm4ubG9hZDsKKworLyoqCisgKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCisg
Ki8KK2pRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsK
KyAgICBpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgeworICAgICAgICBy
ZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworICAgIH0KKworICAgIHZhciBz
ZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsCisgICAgICAgIHNlbGYgPSB0aGlzLAorICAgICAgICBv
ZmYgPSB1cmwuaW5kZXhPZiggIiAiICk7CisKKyAgICBpZiAoIG9mZiA+IC0xICkgeworICAgICAg
ICBzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7CisgICAgICAgIHVy
bCA9IHVybC5zbGljZSggMCwgb2ZmICk7CisgICAgfQorCisgICAgLy8gSWYgaXQncyBhIGZ1bmN0
aW9uCisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CisKKyAgICAgICAg
Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKKyAgICAgICAgY2FsbGJhY2sgPSBw
YXJhbXM7CisgICAgICAgIHBhcmFtcyA9IHVuZGVmaW5lZDsKKworICAgIC8vIE90aGVyd2lzZSwg
YnVpbGQgYSBwYXJhbSBzdHJpbmcKKyAgICB9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBh
cmFtcyA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgIHR5cGUgPSAiUE9TVCI7CisgICAgfQorCisg
ICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3QKKyAg
ICBpZiAoIHNlbGYubGVuZ3RoID4gMCApIHsKKyAgICAgICAgalF1ZXJ5LmFqYXgoIHsKKyAgICAg
ICAgICAgIHVybDogdXJsLAorCisgICAgICAgICAgICAvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMg
dW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAv
LyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2UKKyAgICAgICAgICAgIC8v
IHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZAorICAgICAgICAg
ICAgdHlwZTogdHlwZSB8fCAiR0VUIiwKKyAgICAgICAgICAgIGRhdGFUeXBlOiAiaHRtbCIsCisg
ICAgICAgICAgICBkYXRhOiBwYXJhbXMKKyAgICAgICAgfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNw
b25zZVRleHQgKSB7CisKKyAgICAgICAgICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBj
b21wbGV0ZSBjYWxsYmFjaworICAgICAgICAgICAgcmVzcG9uc2UgPSBhcmd1bWVudHM7CisKKyAg
ICAgICAgICAgIHNlbGYuaHRtbCggc2VsZWN0b3IgPworCisgICAgICAgICAgICAgICAgLy8gSWYg
YSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEg
ZHVtbXkgZGl2CisgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElF
ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzCisgICAgICAgICAgICAgICAgalF1ZXJ5KCAiPGRp
dj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNl
bGVjdG9yICkgOgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCBy
ZXN1bHQKKyAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgKTsKKworICAgICAgICAvLyBJZiB0
aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzICJkYXRhIiwgInN0YXR1cyIs
ICJqcVhIUiIKKyAgICAgICAgLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25z
ZSB3YXMgc2V0IGFib3ZlLgorICAgICAgICAvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBn
ZXRzICJqcVhIUiIsICJzdGF0dXMiLCAiZXJyb3IiCisgICAgICAgIH0gKS5hbHdheXMoIGNhbGxi
YWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkgeworICAgICAgICAgICAgc2VsZi5lYWNo
KCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSggdGhpcywgcmVz
cG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOworICAgICAg
ICAgICAgfSApOworICAgICAgICB9ICk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7Cit9Owor
CisKKworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1v
biBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goIFsKKyAgICAiYWpheFN0YXJ0IiwKKyAgICAiYWph
eFN0b3AiLAorICAgICJhamF4Q29tcGxldGUiLAorICAgICJhamF4RXJyb3IiLAorICAgICJhamF4
U3VjY2VzcyIsCisgICAgImFqYXhTZW5kIgorXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7CisgICAg
alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CisgICAgICAgIHJldHVybiB0aGlz
Lm9uKCB0eXBlLCBmbiApOworICAgIH07Cit9ICk7CisKKworCisKK2pRdWVyeS5leHByLmZpbHRl
cnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdyZXAo
IGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAgICAgICAgcmV0dXJuIGVsZW0gPT09
IGZuLmVsZW07CisgICAgfSApLmxlbmd0aDsKK307CisKKworCisKKy8qKgorICogR2V0cyBhIHdp
bmRvdyBmcm9tIGFuIGVsZW1lbnQKKyAqLworZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgewor
ICAgIHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBl
ID09PSA5ICYmIGVsZW0uZGVmYXVsdFZpZXc7Cit9CisKK2pRdWVyeS5vZmZzZXQgPSB7CisgICAg
c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKKyAgICAgICAgdmFyIGN1
clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NM
ZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbiwKKyAgICAgICAgICAgIHBvc2l0aW9uID0galF1ZXJ5LmNz
cyggZWxlbSwgInBvc2l0aW9uIiApLAorICAgICAgICAgICAgY3VyRWxlbSA9IGpRdWVyeSggZWxl
bSApLAorICAgICAgICAgICAgcHJvcHMgPSB7fTsKKworICAgICAgICAvLyBTZXQgcG9zaXRpb24g
Zmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCisgICAg
ICAgIGlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworICAgICAgICAgICAgZWxlbS5zdHls
ZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisgICAgICAgIH0KKworICAgICAgICBjdXJPZmZzZXQg
PSBjdXJFbGVtLm9mZnNldCgpOworICAgICAgICBjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVt
LCAidG9wIiApOworICAgICAgICBjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQi
ICk7CisgICAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gImFic29sdXRl
IiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApICYmCisgICAgICAgICAgICAoIGN1ckNTU1RvcCAr
IGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOworCisgICAgICAgIC8vIE5lZWQg
dG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyCisgICAgICAgIC8vIHRv
cCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhl
ZAorICAgICAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworICAgICAgICAgICAgY3VyUG9z
aXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBjdXJUb3AgPSBjdXJQb3Np
dGlvbi50b3A7CisgICAgICAgICAgICBjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9w
ICkgfHwgMDsKKyAgICAgICAgICAgIGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkg
fHwgMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlv
bnMgKSApIHsKKworICAgICAgICAgICAgLy8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxv
dyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpCisgICAgICAg
ICAgICBvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwg
Y3VyT2Zmc2V0ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggb3B0aW9ucy50b3AgIT0g
bnVsbCApIHsKKyAgICAgICAgICAgIHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZz
ZXQudG9wICkgKyBjdXJUb3A7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBvcHRpb25zLmxlZnQg
IT0gbnVsbCApIHsKKyAgICAgICAgICAgIHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1
ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAidXNp
bmciIGluIG9wdGlvbnMgKSB7CisgICAgICAgICAgICBvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0s
IHByb3BzICk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1ckVsZW0uY3NzKCBw
cm9wcyApOworICAgICAgICB9CisgICAgfQorfTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAg
IG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CisgICAgICAgIGlmICggYXJndW1lbnRzLmxl
bmd0aCApIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPworICAg
ICAgICAgICAgICAgIHRoaXMgOgorICAgICAgICAgICAgICAgIHRoaXMuZWFjaCggZnVuY3Rpb24o
IGkgKSB7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlz
LCBvcHRpb25zLCBpICk7CisgICAgICAgICAgICAgICAgfSApOworICAgICAgICB9CisKKyAgICAg
ICAgdmFyIGRvY0VsZW0sIHdpbiwKKyAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCisgICAg
ICAgICAgICBib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgICAgICAgICAgZG9jID0gZWxl
bSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKyAgICAgICAgaWYgKCAhZG9jICkgeworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZG9jRWxlbSA9IGRvYy5kb2N1bWVu
dEVsZW1lbnQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVk
IERPTSBub2RlCisgICAgICAgIGlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSAp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGJveDsKKyAgICAgICAgfQorCisgICAgICAgIGJveCA9
IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisgICAgICAgIHdpbiA9IGdldFdpbmRvdygg
ZG9jICk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICB0b3A6IGJveC50b3AgKyB3aW4u
cGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCwKKyAgICAgICAgICAgIGxlZnQ6IGJveC5s
ZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0CisgICAgICAgIH07Cisg
ICAgfSwKKworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpc1sg
MCBdICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG9m
ZnNldFBhcmVudCwgb2Zmc2V0LAorICAgICAgICAgICAgZWxlbSA9IHRoaXNbIDAgXSwKKyAgICAg
ICAgICAgIHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CisKKyAgICAgICAgLy8g
Rml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRvdyAocGFyZW50T2Zmc2V0ID0ge3Rv
cDowLCBsZWZ0OiAwfSwKKyAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQg
cGFyZW50CisgICAgICAgIGlmICggalF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApID09PSAi
Zml4ZWQiICkgeworCisgICAgICAgICAgICAvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0
IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWQKKyAgICAgICAgICAgIG9m
ZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisKKyAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKyAgICAgICAgICAgIG9m
ZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7CisKKyAgICAgICAgICAgIC8vIEdldCBj
b3JyZWN0IG9mZnNldHMKKyAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisgICAg
ICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIg
KSApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0
KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9y
ZGVycworICAgICAgICAgICAgcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQ
YXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSApOworICAgICAgICAgICAgcGFyZW50
T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJMZWZ0
V2lkdGgiLCB0cnVlICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdWJ0cmFjdCBwYXJlbnQg
b2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAg
ICB0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwg
Im1hcmdpblRvcCIsIHRydWUgKSwKKyAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFy
ZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUgKQor
ICAgICAgICB9OworICAgIH0sCisKKyAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1
bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKyAgICAvLyAxKSBGb3IgdGhlIGVs
ZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9k
IHdpbGwgcmV0dXJuCisgICAgLy8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2lu
ZG93CisgICAgLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAorICAgIC8v
IDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5v
ZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGYKKyAgICAvLworICAgIC8vIGJ1dCB0aG9zZSBleGNl
cHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcworICAg
IC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLgor
ICAgIC8vCisgICAgLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5k
IGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKKyAgICBvZmZzZXRQYXJlbnQ6
IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OworCisgICAgICAg
ICAgICB3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJw
b3NpdGlvbiIgKSA9PT0gInN0YXRpYyIgKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50
ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CisgICAgICAgIH0gKTsK
KyAgICB9Cit9ICk7CisKKy8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9k
cworalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAi
cGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7CisgICAgdmFyIHRvcCA9
ICJwYWdlWU9mZnNldCIgPT09IHByb3A7CisKKyAgICBqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVu
Y3Rpb24oIHZhbCApIHsKKyAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVs
ZW0sIG1ldGhvZCwgdmFsICkgeworICAgICAgICAgICAgdmFyIHdpbiA9IGdldFdpbmRvdyggZWxl
bSApOworCisgICAgICAgICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAg
ICAgICAgIHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdpbiApIHsKKyAgICAgICAgICAgICAgICB3aW4u
c2Nyb2xsVG8oCisgICAgICAgICAgICAgICAgICAgICF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZz
ZXQsCisgICAgICAgICAgICAgICAgICAgIHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldAorICAg
ICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
ZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG1ldGhvZCwg
dmFsLCBhcmd1bWVudHMubGVuZ3RoICk7CisgICAgfTsKK30gKTsKKworLy8gU3VwcG9ydDogU2Fm
YXJpPDctOCssIENocm9tZTwzNy00NCsKKy8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNp
bmcgalF1ZXJ5LmZuLnBvc2l0aW9uCisvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKKy8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdv
b2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MAorLy8gZ2V0Q29tcHV0
ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRv
bS9yaWdodDsKKy8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRo
ZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlCitqUXVlcnkuZWFjaCggWyAi
dG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkgeworICAgIGpRdWVyeS5jc3NIb29r
c1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCisgICAgICAg
IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKyAgICAgICAgICAgIGlmICggY29tcHV0ZWQg
KSB7CisgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKKwor
ICAgICAgICAgICAgICAgIC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNr
IHRvIG9mZnNldAorICAgICAgICAgICAgICAgIHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0
ZWQgKSA/CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHBy
b3AgXSArICJweCIgOgorICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICk7Cit9ICk7CisKKworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBp
bm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRo
b2RzCitqUXVlcnkuZWFjaCggeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBm
dW5jdGlvbiggbmFtZSwgdHlwZSApIHsKKyAgICBqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiAiaW5u
ZXIiICsgbmFtZSwgY29udGVudDogdHlwZSwgIiI6ICJvdXRlciIgKyBuYW1lIH0sCisgICAgICAg
IGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgeworCisgICAgICAgIC8vIE1hcmdp
biBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aAorICAgICAgICBqUXVlcnkuZm5b
IGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZh
ciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVv
ZiBtYXJnaW4gIT09ICJib29sZWFuIiApLAorICAgICAgICAgICAgICAgIGV4dHJhID0gZGVmYXVs
dEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIg
OiAiYm9yZGVyIiApOworCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlv
biggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgdmFyIGRvYzsKKworICAg
ICAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCBy
ZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKKyAgICAgICAgICAgICAgICAgICAg
Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMg
VVJMIGZvciBkaXNjdXNzaW9uOgorICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1
Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NAorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBo
ZWlnaHQKKyAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisgICAg
ICAgICAgICAgICAgICAgIGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50OworCisgICAgICAgICAg
ICAgICAgICAgIC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgv
SGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwKKyAgICAgICAgICAgICAgICAgICAgLy8g
d2hpY2hldmVyIGlzIGdyZWF0ZXN0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1h
eCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0s
IGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmJv
ZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBdLAorICAgICAgICAg
ICAgICAgICAgICAgICAgZG9jWyAiY2xpZW50IiArIG5hbWUgXQorICAgICAgICAgICAgICAgICAg
ICApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9
PT0gdW5kZWZpbmVkID8KKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgd2lkdGggb3IgaGVp
Z2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0
CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgor
CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1l
bnQKKyAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwg
ZXh0cmEgKTsKKyAgICAgICAgICAgIH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVm
aW5lZCwgY2hhaW5hYmxlLCBudWxsICk7CisgICAgICAgIH07CisgICAgfSApOworfSApOworCisK
K2pRdWVyeS5mbi5leHRlbmQoIHsKKworICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwg
Zm4gKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTsK
KyAgICB9LAorICAgIHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTsKKyAgICB9LAorCisgICAgZGVsZWdhdGU6
IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgeworICAgICAgICByZXR1cm4g
dGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5kZWxl
Z2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CisKKyAgICAgICAgLy8gKCBu
YW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQorICAgICAgICByZXR1cm4g
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/CisgICAgICAgICAgICB0aGlzLm9mZiggc2VsZWN0b3Is
ICIqKiIgKSA6CisgICAgICAgICAgICB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIs
IGZuICk7CisgICAgfSwKKyAgICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMubGVuZ3RoOworICAgIH0KK30gKTsKKworalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4u
YWRkQmFjazsKKworCisKKworLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5j
ZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyCisvLyBmaWxlcyB0aGF0IG1h
eSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0
aGF0CisvLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlz
IHNhZmVzdCBhbmQgbW9zdCByb2J1c3QKKy8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpx
dWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUKKy8vIGRlcml2ZWQgZnJv
bSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2Vy
Y2FzZQorLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28g
dGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzCisvLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlk
ZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCisKKy8vIE5vdGUgdGhhdCBm
b3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hv
dWxkCisvLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9p
ZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuCisvLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVy
eSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorLy8gaHR0cHM6
Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGli
cmFyaWVzI3dpa2ktYW5vbgorCitpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYg
ZGVmaW5lLmFtZCApIHsKKyAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiBqUXVlcnk7CisgICAgfSApOworfQorCisKKwordmFyCisKKyAgICAvLyBN
YXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKyAgICBfalF1ZXJ5ID0gd2luZG93
LmpRdWVyeSwKKworICAgIC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisg
ICAgXyQgPSB3aW5kb3cuJDsKKworalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCAp
IHsKKyAgICBpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgICAgIHdpbmRvdy4kID0g
XyQ7CisgICAgfQorCisgICAgaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSAp
IHsKKyAgICAgICAgd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisgICAgfQorCisgICAgcmV0dXJu
IGpRdWVyeTsKK307CisKKy8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4g
aW4gQU1ECisvLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9q
cXVlcnkvcHVsbC81NTcpCisvLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgj
MTM1NjYpCitpZiAoICFub0dsb2JhbCApIHsKKyAgICB3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQg
PSBqUXVlcnk7Cit9CisKK3JldHVybiBqUXVlcnk7Cit9KSk7CisKKzs7KGZ1bmN0aW9uKCkgewor
LyohCisgKiBAb3ZlcnZpZXcgIEVtYmVyIC0gSmF2YVNjcmlwdCBBcHBsaWNhdGlvbiBGcmFtZXdv
cmsKKyAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEtMjAxNiBUaWxkZSBJbmMuIGFuZCBjb250
cmlidXRvcnMKKyAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYtMjAxMSBTdHJv
YmUgSW5jLgorICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwOC0yMDExIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIg
TUlUIGxpY2Vuc2UKKyAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZW1i
ZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElDRU5TRQorICogQHZlcnNpb24gICAyLjYuMgorICovCisK
K3ZhciBlbmlmZWQsIHJlcXVpcmVNb2R1bGUsIHJlcXVpcmUsIEVtYmVyOwordmFyIG1haW5Db250
ZXh0ID0gdGhpczsKKworKGZ1bmN0aW9uKCkgeworICB2YXIgaXNOb2RlID0gdHlwZW9mIHdpbmRv
dyA9PT0gJ3VuZGVmaW5lZCcgJiYKKyAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcg
JiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nOworCisg
IGlmICghaXNOb2RlKSB7CisgICAgRW1iZXIgPSB0aGlzLkVtYmVyID0gdGhpcy5FbWJlciB8fCB7
fTsKKyAgfQorCisgIGlmICh0eXBlb2YgRW1iZXIgPT09ICd1bmRlZmluZWQnKSB7IEVtYmVyID0g
e307IH0KKworICBpZiAodHlwZW9mIEVtYmVyLl9fbG9hZGVyID09PSAndW5kZWZpbmVkJykgewor
ICAgIHZhciByZWdpc3RyeSA9IHt9OworICAgIHZhciBzZWVuID0ge307CisKKyAgICBlbmlmZWQg
PSBmdW5jdGlvbihuYW1lLCBkZXBzLCBjYWxsYmFjaykgeworICAgICAgdmFyIHZhbHVlID0geyB9
OworCisgICAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIHZhbHVlLmRlcHMgPSBbXTsKKyAg
ICAgICAgdmFsdWUuY2FsbGJhY2sgPSBkZXBzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFs
dWUuZGVwcyA9IGRlcHM7CisgICAgICAgIHZhbHVlLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAg
ICB9CisKKyAgICAgIHJlZ2lzdHJ5W25hbWVdID0gdmFsdWU7CisgICAgfTsKKworICAgIHJlcXVp
cmUgPSByZXF1aXJlTW9kdWxlID0gZnVuY3Rpb24obmFtZSkgeworICAgICAgcmV0dXJuIGludGVy
bmFsUmVxdWlyZShuYW1lLCBudWxsKTsKKyAgICB9OworCisgICAgLy8gc2V0dXAgYHJlcXVpcmVg
IG1vZHVsZQorICAgIHJlcXVpcmVbJ2RlZmF1bHQnXSA9IHJlcXVpcmU7CisKKyAgICByZXF1aXJl
LmhhcyA9IGZ1bmN0aW9uIHJlZ2lzdHJ5SGFzKG1vZHVsZU5hbWUpIHsKKyAgICAgIHJldHVybiAh
IXJlZ2lzdHJ5W21vZHVsZU5hbWVdIHx8ICEhcmVnaXN0cnlbbW9kdWxlTmFtZSArICcvaW5kZXgn
XTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gbWlzc2luZ01vZHVsZShuYW1lLCByZWZlcnJlck5h
bWUpIHsKKyAgICAgIGlmIChyZWZlcnJlck5hbWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCdDb3VsZCBub3QgZmluZCBtb2R1bGUgJyArIG5hbWUgKyAnIHJlcXVpcmVkIGJ5OiAnICsgcmVm
ZXJyZXJOYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291
bGQgbm90IGZpbmQgbW9kdWxlICcgKyBuYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5j
dGlvbiBpbnRlcm5hbFJlcXVpcmUoX25hbWUsIHJlZmVycmVyTmFtZSkgeworICAgICAgdmFyIG5h
bWUgPSBfbmFtZTsKKyAgICAgIHZhciBtb2QgPSByZWdpc3RyeVtuYW1lXTsKKworICAgICAgaWYg
KCFtb2QpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUgKyAnL2luZGV4JzsKKyAgICAgICAgbW9kID0g
cmVnaXN0cnlbbmFtZV07CisgICAgICB9CisKKyAgICAgIHZhciBleHBvcnRzID0gc2VlbltuYW1l
XTsKKworICAgICAgaWYgKGV4cG9ydHMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4g
ZXhwb3J0czsKKyAgICAgIH0KKworICAgICAgZXhwb3J0cyA9IHNlZW5bbmFtZV0gPSB7fTsKKwor
ICAgICAgaWYgKCFtb2QpIHsKKyAgICAgICAgbWlzc2luZ01vZHVsZShfbmFtZSwgcmVmZXJyZXJO
YW1lKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlcHMgPSBtb2QuZGVwczsKKyAgICAgIHZhciBj
YWxsYmFjayA9IG1vZC5jYWxsYmFjazsKKyAgICAgIHZhciBsZW5ndGggPSBkZXBzLmxlbmd0aDsK
KyAgICAgIHZhciByZWlmaWVkID0gbmV3IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGRlcHNbaV0gPT09ICdleHBv
cnRzJykgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSBleHBvcnRzOworICAgICAgICB9IGVsc2Ug
aWYgKGRlcHNbaV0gPT09ICdyZXF1aXJlJykgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSByZXF1
aXJlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSBpbnRlcm5hbFJl
cXVpcmUoZGVwc1tpXSwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2FsbGJh
Y2suYXBwbHkodGhpcywgcmVpZmllZCk7CisKKyAgICAgIHJldHVybiBleHBvcnRzOworICAgIH0K
KworICAgIHJlcXVpcmVNb2R1bGUuX2Vha19zZWVuID0gcmVnaXN0cnk7CisKKyAgICBFbWJlci5f
X2xvYWRlciA9IHsKKyAgICAgIGRlZmluZTogZW5pZmVkLAorICAgICAgcmVxdWlyZTogcmVxdWly
ZSwKKyAgICAgIHJlZ2lzdHJ5OiByZWdpc3RyeQorICAgIH07CisgIH0gZWxzZSB7CisgICAgZW5p
ZmVkID0gRW1iZXIuX19sb2FkZXIuZGVmaW5lOworICAgIHJlcXVpcmUgPSByZXF1aXJlTW9kdWxl
ID0gRW1iZXIuX19sb2FkZXIucmVxdWlyZTsKKyAgfQorfSkoKTsKKworZW5pZmVkKCdiYWNrYnVy
bmVyJywgWydleHBvcnRzJywgJ2JhY2tidXJuZXIvdXRpbHMnLCAnYmFja2J1cm5lci9wbGF0Zm9y
bScsICdiYWNrYnVybmVyL2JpbmFyeS1zZWFyY2gnLCAnYmFja2J1cm5lci9kZWZlcnJlZC1hY3Rp
b24tcXVldWVzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfYmFja2J1cm5lclV0aWxzLCBfYmFja2J1
cm5lclBsYXRmb3JtLCBfYmFja2J1cm5lckJpbmFyeVNlYXJjaCwgX2JhY2tidXJuZXJEZWZlcnJl
ZEFjdGlvblF1ZXVlcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
QmFja2J1cm5lcjsKKworICBmdW5jdGlvbiBCYWNrYnVybmVyKHF1ZXVlTmFtZXMsIG9wdGlvbnMp
IHsKKyAgICB0aGlzLnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzOworICAgIHRoaXMub3B0aW9ucyA9
IG9wdGlvbnMgfHwge307CisgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlKSB7Cisg
ICAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlID0gcXVldWVOYW1lc1swXTsKKyAgICB9Cisg
ICAgdGhpcy5pbnN0YW5jZVN0YWNrID0gW107CisgICAgdGhpcy5fZGVib3VuY2VlcyA9IFtdOwor
ICAgIHRoaXMuX3Rocm90dGxlcnMgPSBbXTsKKyAgICB0aGlzLl9ldmVudENhbGxiYWNrcyA9IHsK
KyAgICAgIGVuZDogW10sCisgICAgICBiZWdpbjogW10KKyAgICB9OworCisgICAgdmFyIF90aGlz
ID0gdGhpczsKKyAgICB0aGlzLl9ib3VuZENsZWFySXRlbXMgPSBmdW5jdGlvbiAoKSB7CisgICAg
ICBjbGVhckl0ZW1zKCk7CisgICAgfTsKKworICAgIHRoaXMuX3RpbWVyVGltZW91dElkID0gdW5k
ZWZpbmVkOworICAgIHRoaXMuX3RpbWVycyA9IFtdOworCisgICAgdGhpcy5fcGxhdGZvcm0gPSB0
aGlzLm9wdGlvbnMuX3BsYXRmb3JtIHx8IF9iYWNrYnVybmVyUGxhdGZvcm0uZGVmYXVsdDsKKwor
ICAgIHRoaXMuX2JvdW5kUnVuRXhwaXJlZFRpbWVycyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIF90
aGlzLl9ydW5FeHBpcmVkVGltZXJzKCk7CisgICAgfTsKKyAgfQorCisgIEJhY2tidXJuZXIucHJv
dG90eXBlID0geworICAgIGJlZ2luOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3B0aW9ucyA9
IHRoaXMub3B0aW9uczsKKyAgICAgIHZhciBvbkJlZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm9u
QmVnaW47CisgICAgICB2YXIgcHJldmlvdXNJbnN0YW5jZSA9IHRoaXMuY3VycmVudEluc3RhbmNl
OworCisgICAgICBpZiAocHJldmlvdXNJbnN0YW5jZSkgeworICAgICAgICB0aGlzLmluc3RhbmNl
U3RhY2sucHVzaChwcmV2aW91c0luc3RhbmNlKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdXJy
ZW50SW5zdGFuY2UgPSBuZXcgX2JhY2tidXJuZXJEZWZlcnJlZEFjdGlvblF1ZXVlcy5kZWZhdWx0
KHRoaXMucXVldWVOYW1lcywgb3B0aW9ucyk7CisgICAgICB0aGlzLl90cmlnZ2VyKCdiZWdpbics
IHRoaXMuY3VycmVudEluc3RhbmNlLCBwcmV2aW91c0luc3RhbmNlKTsKKyAgICAgIGlmIChvbkJl
Z2luKSB7CisgICAgICAgIG9uQmVnaW4odGhpcy5jdXJyZW50SW5zdGFuY2UsIHByZXZpb3VzSW5z
dGFuY2UpOworICAgICAgfQorICAgIH0sCisKKyAgICBlbmQ6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOworICAgICAgdmFyIG9uRW5kID0gb3B0aW9ucyAm
JiBvcHRpb25zLm9uRW5kOworICAgICAgdmFyIGN1cnJlbnRJbnN0YW5jZSA9IHRoaXMuY3VycmVu
dEluc3RhbmNlOworICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IG51bGw7CisKKyAgICAgIC8vIFBy
ZXZlbnQgZG91YmxlLWZpbmFsbHkgYnVnIGluIFNhZmFyaSA2LjAuMiBhbmQgaU9TIDYKKyAgICAg
IC8vIFRoaXMgYnVnIGFwcGVhcnMgdG8gYmUgcmVzb2x2ZWQgaW4gU2FmYXJpIDYuMC41IGFuZCBp
T1MgNworICAgICAgdmFyIGZpbmFsbHlBbHJlYWR5Q2FsbGVkID0gZmFsc2U7CisgICAgICB0cnkg
eworICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1c2goKTsKKyAgICAgIH0gZmluYWxseSB7Cisg
ICAgICAgIGlmICghZmluYWxseUFscmVhZHlDYWxsZWQpIHsKKyAgICAgICAgICBmaW5hbGx5QWxy
ZWFkeUNhbGxlZCA9IHRydWU7CisKKyAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG51
bGw7CisKKyAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCkgeworICAgICAg
ICAgICAgbmV4dEluc3RhbmNlID0gdGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpOworICAgICAgICAg
ICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7CisgICAgICAgICAgfQorICAg
ICAgICAgIHRoaXMuX3RyaWdnZXIoJ2VuZCcsIGN1cnJlbnRJbnN0YW5jZSwgbmV4dEluc3RhbmNl
KTsKKyAgICAgICAgICBpZiAob25FbmQpIHsKKyAgICAgICAgICAgIG9uRW5kKGN1cnJlbnRJbnN0
YW5jZSwgbmV4dEluc3RhbmNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9LAorCisgICAgLyoqCisgICAgIFRyaWdnZXIgYW4gZXZlbnQuIFN1cHBvcnRzIHVwIHRvIHR3
byBhcmd1bWVudHMuIERlc2lnbmVkIGFyb3VuZAorICAgICB0cmlnZ2VyaW5nIHRyYW5zaXRpb24g
ZXZlbnRzIGZyb20gb25lIHJ1biBsb29wIGluc3RhbmNlIHRvIHRoZQorICAgICBuZXh0LCB3aGlj
aCByZXF1aXJlcyBhbiBhcmd1bWVudCBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIGFuZCB0aGVuCisg
ICAgIGFuIGFyZ3VtZW50IGZvciB0aGUgbmV4dCBpbnN0YW5jZS4KKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2QgX3RyaWdnZXIKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICAg
ICBAcGFyYW0ge2FueX0gYXJnMQorICAgICBAcGFyYW0ge2FueX0gYXJnMgorICAgICAqLworICAg
IF90cmlnZ2VyOiBmdW5jdGlvbiAoZXZlbnROYW1lLCBhcmcxLCBhcmcyKSB7CisgICAgICB2YXIg
Y2FsbGJhY2tzID0gdGhpcy5fZXZlbnRDYWxsYmFja3NbZXZlbnROYW1lXTsKKyAgICAgIGlmIChj
YWxsYmFja3MpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3Ro
OyBpKyspIHsKKyAgICAgICAgICBjYWxsYmFja3NbaV0oYXJnMSwgYXJnMik7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9LAorCisgICAgb246IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNr
KSB7CisgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoJ0NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpOworICAg
ICAgfQorICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2V2ZW50Q2FsbGJhY2tzW2V2ZW50TmFt
ZV07CisgICAgICBpZiAoY2FsbGJhY2tzKSB7CisgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxi
YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5v
dCBvbigpIGV2ZW50ICInICsgZXZlbnROYW1lICsgJyIgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlz
dCcpOworICAgICAgfQorICAgIH0sCisKKyAgICBvZmY6IGZ1bmN0aW9uIChldmVudE5hbWUsIGNh
bGxiYWNrKSB7CisgICAgICBpZiAoZXZlbnROYW1lKSB7CisgICAgICAgIHZhciBjYWxsYmFja3Mg
PSB0aGlzLl9ldmVudENhbGxiYWNrc1tldmVudE5hbWVdOworICAgICAgICB2YXIgY2FsbGJhY2tG
b3VuZCA9IGZhbHNlOworICAgICAgICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuOworICAgICAgICBp
ZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5s
ZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2sp
IHsKKyAgICAgICAgICAgICAgY2FsbGJhY2tGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgIGNh
bGxiYWNrcy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYWxsYmFja0ZvdW5kKSB7Cisg
ICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IG9mZigpIGNhbGxiYWNrIHRoYXQg
ZG9lcyBub3QgZXhpc3QnKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhy
b3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IG9mZigpIGV2ZW50ICInICsgZXZlbnROYW1lICsgJyIg
YmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdCcpOworICAgICAgfQorICAgIH0sCisKKyAgICBydW46
IGZ1bmN0aW9uICgpIC8qIHRhcmdldCwgbWV0aG9kLCBhcmdzICoveworICAgICAgdmFyIGxlbmd0
aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgICB2YXIgbWV0aG9kLCB0YXJnZXQsIGFyZ3M7CisK
KyAgICAgIGlmIChsZW5ndGggPT09IDEpIHsKKyAgICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzBd
OworICAgICAgICB0YXJnZXQgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0
ID0gYXJndW1lbnRzWzBdOworICAgICAgICBtZXRob2QgPSBhcmd1bWVudHNbMV07CisgICAgICB9
CisKKyAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzU3RyaW5nKG1ldGhvZCkpIHsKKyAgICAg
ICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICB9CisKKyAgICAgIGlmIChsZW5ndGgg
PiAyKSB7CisgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMik7CisgICAgICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gbGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGFy
Z3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAg
ICAgICBhcmdzID0gW107CisgICAgICB9CisKKyAgICAgIHZhciBvbkVycm9yID0gZ2V0T25FcnJv
cih0aGlzLm9wdGlvbnMpOworCisgICAgICB0aGlzLmJlZ2luKCk7CisKKyAgICAgIC8vIGd1YXJk
IGFnYWluc3QgU2FmYXJpIDYncyBkb3VibGUtZmluYWxseSBidWcKKyAgICAgIHZhciBkaWRGaW5h
bGx5ID0gZmFsc2U7CisKKyAgICAgIGlmIChvbkVycm9yKSB7CisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOworICAgICAgICB9IGNhdGNo
IChlcnJvcikgeworICAgICAgICAgIG9uRXJyb3IoZXJyb3IpOworICAgICAgICB9IGZpbmFsbHkg
eworICAgICAgICAgIGlmICghZGlkRmluYWxseSkgeworICAgICAgICAgICAgZGlkRmluYWxseSA9
IHRydWU7CisgICAgICAgICAgICB0aGlzLmVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gbWV0aG9kLmFw
cGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgaWYgKCFk
aWRGaW5hbGx5KSB7CisgICAgICAgICAgICBkaWRGaW5hbGx5ID0gdHJ1ZTsKKyAgICAgICAgICAg
IHRoaXMuZW5kKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKwor
ICAgIC8qCisgICAgICBKb2luIHRoZSBwYXNzZWQgbWV0aG9kIHdpdGggYW4gZXhpc3RpbmcgcXVl
dWUgYW5kIGV4ZWN1dGUgaW1tZWRpYXRlbHksCisgICAgICBpZiB0aGVyZSBpc24ndCBvbmUgdXNl
IGBCYWNrYnVybmVyI3J1bmAuCisgICAgICAgVGhlIGpvaW4gbWV0aG9kIGlzIGxpa2UgdGhlIHJ1
biBtZXRob2QgZXhjZXB0IHRoYXQgaXQgd2lsbCBzY2hlZHVsZSBpbnRvCisgICAgICBhbiBleGlz
dGluZyBxdWV1ZSBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIEluIGVpdGhlciBjYXNlLCB0aGUgam9p
biBtZXRob2Qgd2lsbAorICAgICAgaW1tZWRpYXRlbHkgZXhlY3V0ZSB0aGUgcGFzc2VkIGluIGZ1
bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdC4KKyAgICAgICBAbWV0aG9kIGpvaW4KKyAgICAg
IEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBU
aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkCisgICAgICBAcGFyYW0ge2FueX0gYXJncyBUaGUgbWV0
aG9kIGFyZ3VtZW50cworICAgICAgQHJldHVybiBtZXRob2QgcmVzdWx0CisgICAgKi8KKyAgICBq
b2luOiBmdW5jdGlvbiAoKSAvKiB0YXJnZXQsIG1ldGhvZCwgYXJncyAqL3sKKyAgICAgIGlmICgh
dGhpcy5jdXJyZW50SW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucnVuLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMu
bGVuZ3RoOworICAgICAgdmFyIG1ldGhvZCwgdGFyZ2V0OworCisgICAgICBpZiAobGVuZ3RoID09
PSAxKSB7CisgICAgICAgIG1ldGhvZCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgdGFyZ2V0ID0g
bnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXTsKKyAg
ICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzFdOworICAgICAgfQorCisgICAgICBpZiAoX2JhY2ti
dXJuZXJVdGlscy5pc1N0cmluZyhtZXRob2QpKSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldFtt
ZXRob2RdOworICAgICAgfQorCisgICAgICBpZiAobGVuZ3RoID09PSAxKSB7CisgICAgICAgIHJl
dHVybiBtZXRob2QoKTsKKyAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAyKSB7CisgICAgICAg
IHJldHVybiBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFy
IGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMik7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBs
ID0gbGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVu
dHNbaSArIDJdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0
LCBhcmdzKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoKKyAgICAgIERlZmVyIHRoZSBwYXNz
ZWQgZnVuY3Rpb24gdG8gcnVuIGluc2lkZSB0aGUgc3BlY2lmaWVkIHF1ZXVlLgorICAgICAgIEBt
ZXRob2QgZGVmZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBxdWV1ZU5hbWUKKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSB0YXJnZXQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2Qg
VGhlIG1ldGhvZCBvciBtZXRob2QgbmFtZSB0byBiZSBleGVjdXRlZAorICAgICAgQHBhcmFtIHth
bnl9IGFyZ3MgVGhlIG1ldGhvZCBhcmd1bWVudHMKKyAgICAgIEByZXR1cm4gbWV0aG9kIHJlc3Vs
dAorICAgICovCisgICAgZGVmZXI6IGZ1bmN0aW9uIChxdWV1ZU5hbWUgLyogLCB0YXJnZXQsIG1l
dGhvZCwgYXJncyAqLykgeworICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7Cisg
ICAgICB2YXIgbWV0aG9kLCB0YXJnZXQsIGFyZ3M7CisKKyAgICAgIGlmIChsZW5ndGggPT09IDIp
IHsKKyAgICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzFdOworICAgICAgICB0YXJnZXQgPSBudWxs
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzFdOworICAgICAg
ICBtZXRob2QgPSBhcmd1bWVudHNbMl07CisgICAgICB9CisKKyAgICAgIGlmIChfYmFja2J1cm5l
clV0aWxzLmlzU3RyaW5nKG1ldGhvZCkpIHsKKyAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhv
ZF07CisgICAgICB9CisKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBuZXcgRXJyb3Io
KSA6IHVuZGVmaW5lZDsKKworICAgICAgaWYgKGxlbmd0aCA+IDMpIHsKKyAgICAgICAgYXJncyA9
IG5ldyBBcnJheShsZW5ndGggLSAzKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBsZW5n
dGg7IGkrKykgeworICAgICAgICAgIGFyZ3NbaSAtIDNdID0gYXJndW1lbnRzW2ldOworICAgICAg
ICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdzID0gdW5kZWZpbmVkOworICAgICAgfQor
CisgICAgICBpZiAoIXRoaXMuY3VycmVudEluc3RhbmNlKSB7CisgICAgICAgIGNyZWF0ZUF1dG9y
dW4odGhpcyk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2Uuc2No
ZWR1bGUocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgZmFsc2UsIHN0YWNrKTsKKyAg
ICB9LAorCisgICAgZGVmZXJPbmNlOiBmdW5jdGlvbiAocXVldWVOYW1lIC8qICwgdGFyZ2V0LCBt
ZXRob2QsIGFyZ3MgKi8pIHsKKyAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwor
ICAgICAgdmFyIG1ldGhvZCwgdGFyZ2V0LCBhcmdzOworCisgICAgICBpZiAobGVuZ3RoID09PSAy
KSB7CisgICAgICAgIG1ldGhvZCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgdGFyZ2V0ID0gbnVs
bDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXTsKKyAgICAg
ICAgbWV0aG9kID0gYXJndW1lbnRzWzJdOworICAgICAgfQorCisgICAgICBpZiAoX2JhY2tidXJu
ZXJVdGlscy5pc1N0cmluZyhtZXRob2QpKSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldFttZXRo
b2RdOworICAgICAgfQorCisgICAgICB2YXIgc3RhY2sgPSB0aGlzLkRFQlVHID8gbmV3IEVycm9y
KCkgOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChsZW5ndGggPiAzKSB7CisgICAgICAgIGFyZ3Mg
PSBuZXcgQXJyYXkobGVuZ3RoIC0gMyk7CisgICAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVu
Z3RoOyBpKyspIHsKKyAgICAgICAgICBhcmdzW2kgLSAzXSA9IGFyZ3VtZW50c1tpXTsKKyAgICAg
ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJncyA9IHVuZGVmaW5lZDsKKyAgICAgIH0K
KworICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkgeworICAgICAgICBjcmVhdGVBdXRv
cnVuKHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEluc3RhbmNlLnNj
aGVkdWxlKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHRydWUsIHN0YWNrKTsKKyAg
ICB9LAorCisgICAgc2V0VGltZW91dDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGwgPSBhcmd1
bWVudHMubGVuZ3RoOworICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobCk7CisKKyAgICAgIGZv
ciAodmFyIHggPSAwOyB4IDwgbDsgeCsrKSB7CisgICAgICAgIGFyZ3NbeF0gPSBhcmd1bWVudHNb
eF07CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSBhcmdzLmxlbmd0aCwKKyAgICAgICAg
ICBtZXRob2QsCisgICAgICAgICAgd2FpdCwKKyAgICAgICAgICB0YXJnZXQsCisgICAgICAgICAg
bWV0aG9kT3JUYXJnZXQsCisgICAgICAgICAgbWV0aG9kT3JXYWl0LAorICAgICAgICAgIG1ldGhv
ZE9yQXJnczsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMSkgeworICAgICAgICBtZXRob2QgPSBhcmdzLnNo
aWZ0KCk7CisgICAgICAgIHdhaXQgPSAwOworICAgICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDIp
IHsKKyAgICAgICAgbWV0aG9kT3JUYXJnZXQgPSBhcmdzWzBdOworICAgICAgICBtZXRob2RPcldh
aXQgPSBhcmdzWzFdOworCisgICAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzRnVuY3Rpb24o
bWV0aG9kT3JXYWl0KSB8fCBfYmFja2J1cm5lclV0aWxzLmlzRnVuY3Rpb24obWV0aG9kT3JUYXJn
ZXRbbWV0aG9kT3JXYWl0XSkpIHsKKyAgICAgICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7Cisg
ICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOworICAgICAgICAgIHdhaXQgPSAwOworICAg
ICAgICB9IGVsc2UgaWYgKF9iYWNrYnVybmVyVXRpbHMuaXNDb2VyY2FibGVOdW1iZXIobWV0aG9k
T3JXYWl0KSkgeworICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICB3
YWl0ID0gYXJncy5zaGlmdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1ldGhvZCA9
IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICB3YWl0ID0gMDsKKyAgICAgICAgfQorICAgICAgfSBl
bHNlIHsKKyAgICAgICAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CisKKyAgICAg
ICAgaWYgKF9iYWNrYnVybmVyVXRpbHMuaXNDb2VyY2FibGVOdW1iZXIobGFzdCkpIHsKKyAgICAg
ICAgICB3YWl0ID0gYXJncy5wb3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3YWl0
ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJnc1swXTsKKyAg
ICAgICAgbWV0aG9kT3JBcmdzID0gYXJnc1sxXTsKKworICAgICAgICBpZiAoX2JhY2tidXJuZXJV
dGlscy5pc0Z1bmN0aW9uKG1ldGhvZE9yQXJncykgfHwgX2JhY2tidXJuZXJVdGlscy5pc1N0cmlu
ZyhtZXRob2RPckFyZ3MpICYmIG1ldGhvZE9yVGFyZ2V0ICE9PSBudWxsICYmIG1ldGhvZE9yQXJn
cyBpbiBtZXRob2RPclRhcmdldCkgeworICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hpZnQoKTsK
KyAgICAgICAgICBtZXRob2QgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAg
IHZhciBleGVjdXRlQXQgPSBEYXRlLm5vdygpICsgcGFyc2VJbnQod2FpdCAhPT0gd2FpdCA/IDAg
OiB3YWl0LCAxMCk7CisKKyAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzU3RyaW5nKG1ldGhv
ZCkpIHsKKyAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICB9CisKKyAgICAg
IHZhciBvbkVycm9yID0gZ2V0T25FcnJvcih0aGlzLm9wdGlvbnMpOworCisgICAgICBmdW5jdGlv
biBmbigpIHsKKyAgICAgICAgaWYgKG9uRXJyb3IpIHsKKyAgICAgICAgICB0cnkgeworICAgICAg
ICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgICAgfSBjYXRjaCAoZSkg
eworICAgICAgICAgICAgb25FcnJvcihlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgIH0KKyAgICAg
IH0KKworICAgICAgcmV0dXJuIHRoaXMuX3NldFRpbWVvdXQoZm4sIGV4ZWN1dGVBdCk7CisgICAg
fSwKKworICAgIF9zZXRUaW1lb3V0OiBmdW5jdGlvbiAoZm4sIGV4ZWN1dGVBdCkgeworICAgICAg
aWYgKHRoaXMuX3RpbWVycy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgdGhpcy5fdGltZXJzLnB1
c2goZXhlY3V0ZUF0LCBmbik7CisgICAgICAgIHRoaXMuX2luc3RhbGxUaW1lclRpbWVvdXQoKTsK
KyAgICAgICAgcmV0dXJuIGZuOworICAgICAgfQorCisgICAgICAvLyBmaW5kIHBvc2l0aW9uIHRv
IGluc2VydAorICAgICAgdmFyIGkgPSBfYmFja2J1cm5lckJpbmFyeVNlYXJjaC5kZWZhdWx0KGV4
ZWN1dGVBdCwgdGhpcy5fdGltZXJzKTsKKworICAgICAgdGhpcy5fdGltZXJzLnNwbGljZShpLCAw
LCBleGVjdXRlQXQsIGZuKTsKKworICAgICAgLy8gd2Ugc2hvdWxkIGJlIHRoZSBuZXcgZWFybGll
c3QgdGltZXIgaWYgaSA9PSAwCisgICAgICBpZiAoaSA9PT0gMCkgeworICAgICAgICB0aGlzLl9y
ZWluc3RhbGxUaW1lclRpbWVvdXQoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZuOworICAg
IH0sCisKKyAgICB0aHJvdHRsZTogZnVuY3Rpb24gKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywg
d2FpdCwgW2ltbWVkaWF0ZV0gKi8pIHsKKyAgICAgIHZhciBiYWNrYnVybmVyID0gdGhpczsKKyAg
ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpOworICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYXJnc1tpXSA9
IGFyZ3VtZW50c1tpXTsKKyAgICAgIH0KKyAgICAgIHZhciBpbW1lZGlhdGUgPSBhcmdzLnBvcCgp
OworICAgICAgdmFyIHdhaXQsIHRocm90dGxlciwgaW5kZXgsIHRpbWVyOworCisgICAgICBpZiAo
X2JhY2tidXJuZXJVdGlscy5pc051bWJlcihpbW1lZGlhdGUpIHx8IF9iYWNrYnVybmVyVXRpbHMu
aXNTdHJpbmcoaW1tZWRpYXRlKSkgeworICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOworICAgICAg
ICBpbW1lZGlhdGUgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2FpdCA9IGFyZ3Mu
cG9wKCk7CisgICAgICB9CisKKyAgICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAxMCk7CisKKyAg
ICAgIGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCwgdGhpcy5fdGhyb3R0bGVy
cyk7CisgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3R0
bGVyc1tpbmRleF07CisgICAgICB9IC8vIHRocm90dGxlZAorCisgICAgICB0aW1lciA9IHRoaXMu
X3BsYXRmb3JtLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoIWltbWVkaWF0
ZSkgeworICAgICAgICAgIGJhY2tidXJuZXIucnVuLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3MpOwor
ICAgICAgICB9CisgICAgICAgIHZhciBpbmRleCA9IGZpbmRUaHJvdHRsZXIodGFyZ2V0LCBtZXRo
b2QsIGJhY2tidXJuZXIuX3Rocm90dGxlcnMpOworICAgICAgICBpZiAoaW5kZXggPiAtMSkgewor
ICAgICAgICAgIGJhY2tidXJuZXIuX3Rocm90dGxlcnMuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAg
ICAgfQorICAgICAgfSwgd2FpdCk7CisKKyAgICAgIGlmIChpbW1lZGlhdGUpIHsKKyAgICAgICAg
dGhpcy5ydW4uYXBwbHkodGhpcywgYXJncyk7CisgICAgICB9CisKKyAgICAgIHRocm90dGxlciA9
IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOworCisgICAgICB0aGlzLl90aHJvdHRsZXJzLnB1c2go
dGhyb3R0bGVyKTsKKworICAgICAgcmV0dXJuIHRocm90dGxlcjsKKyAgICB9LAorCisgICAgZGVi
b3VuY2U6IGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZCAvKiAsIGFyZ3MsIHdhaXQsIFtpbW1lZGlh
dGVdICovKSB7CisgICAgICB2YXIgYmFja2J1cm5lciA9IHRoaXM7CisgICAgICB2YXIgYXJncyA9
IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07
CisgICAgICB9CisKKyAgICAgIHZhciBpbW1lZGlhdGUgPSBhcmdzLnBvcCgpOworICAgICAgdmFy
IHdhaXQsIGluZGV4LCBkZWJvdW5jZWUsIHRpbWVyOworCisgICAgICBpZiAoX2JhY2tidXJuZXJV
dGlscy5pc051bWJlcihpbW1lZGlhdGUpIHx8IF9iYWNrYnVybmVyVXRpbHMuaXNTdHJpbmcoaW1t
ZWRpYXRlKSkgeworICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOworICAgICAgICBpbW1lZGlhdGUg
PSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdhaXQgPSBhcmdzLnBvcCgpOworICAg
ICAgfQorCisgICAgICB3YWl0ID0gcGFyc2VJbnQod2FpdCwgMTApOworICAgICAgLy8gUmVtb3Zl
IGRlYm91bmNlZQorICAgICAgaW5kZXggPSBmaW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kLCB0
aGlzLl9kZWJvdW5jZWVzKTsKKworICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgZGVi
b3VuY2VlID0gdGhpcy5fZGVib3VuY2Vlc1tpbmRleF07CisgICAgICAgIHRoaXMuX2RlYm91bmNl
ZXMuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgdGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0
KGRlYm91bmNlZVsyXSk7CisgICAgICB9CisKKyAgICAgIHRpbWVyID0gdGhpcy5fcGxhdGZvcm0u
c2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmICghaW1tZWRpYXRlKSB7CisgICAg
ICAgICAgYmFja2J1cm5lci5ydW4uYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgICAgICAgIH0K
KyAgICAgICAgdmFyIGluZGV4ID0gZmluZERlYm91bmNlZSh0YXJnZXQsIG1ldGhvZCwgYmFja2J1
cm5lci5fZGVib3VuY2Vlcyk7CisgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgICAg
YmFja2J1cm5lci5fZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgICB9CisgICAg
ICB9LCB3YWl0KTsKKworICAgICAgaWYgKGltbWVkaWF0ZSAmJiBpbmRleCA9PT0gLTEpIHsKKyAg
ICAgICAgYmFja2J1cm5lci5ydW4uYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgICAgICB9CisK
KyAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOworCisgICAgICBiYWNr
YnVybmVyLl9kZWJvdW5jZWVzLnB1c2goZGVib3VuY2VlKTsKKworICAgICAgcmV0dXJuIGRlYm91
bmNlZTsKKyAgICB9LAorCisgICAgY2FuY2VsVGltZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICBf
YmFja2J1cm5lclV0aWxzLmVhY2godGhpcy5fdGhyb3R0bGVycywgdGhpcy5fYm91bmRDbGVhckl0
ZW1zKTsKKyAgICAgIHRoaXMuX3Rocm90dGxlcnMgPSBbXTsKKworICAgICAgX2JhY2tidXJuZXJV
dGlscy5lYWNoKHRoaXMuX2RlYm91bmNlZXMsIHRoaXMuX2JvdW5kQ2xlYXJJdGVtcyk7CisgICAg
ICB0aGlzLl9kZWJvdW5jZWVzID0gW107CisKKyAgICAgIHRoaXMuX2NsZWFyVGltZXJUaW1lb3V0
KCk7CisgICAgICB0aGlzLl90aW1lcnMgPSBbXTsKKworICAgICAgaWYgKHRoaXMuX2F1dG9ydW4p
IHsKKyAgICAgICAgdGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9ydW4pOwor
ICAgICAgICB0aGlzLl9hdXRvcnVuID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaGFz
VGltZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gISF0aGlzLl90aW1lcnMubGVuZ3Ro
IHx8ICEhdGhpcy5fZGVib3VuY2Vlcy5sZW5ndGggfHwgISF0aGlzLl90aHJvdHRsZXJzLmxlbmd0
aCB8fCB0aGlzLl9hdXRvcnVuOworICAgIH0sCisKKyAgICBjYW5jZWw6IGZ1bmN0aW9uICh0aW1l
cikgeworICAgICAgdmFyIHRpbWVyVHlwZSA9IHR5cGVvZiB0aW1lcjsKKworICAgICAgaWYgKHRp
bWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVjdCcgJiYgdGltZXIucXVldWUgJiYgdGltZXIubWV0
aG9kKSB7CisgICAgICAgIC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBkZWZlck9uY2UKKyAgICAgICAg
cmV0dXJuIHRpbWVyLnF1ZXVlLmNhbmNlbCh0aW1lcik7CisgICAgICB9IGVsc2UgaWYgKHRpbWVy
VHlwZSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAvLyB3ZSdyZSBjYW5jZWxsaW5nIGEgc2V0
VGltZW91dAorICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX3RpbWVycy5sZW5ndGg7
IGkgPCBsOyBpICs9IDIpIHsKKyAgICAgICAgICBpZiAodGhpcy5fdGltZXJzW2kgKyAxXSA9PT0g
dGltZXIpIHsKKyAgICAgICAgICAgIHRoaXMuX3RpbWVycy5zcGxpY2UoaSwgMik7IC8vIHJlbW92
ZSB0aGUgdHdvIGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoaSA9PT0gMCkgeworICAgICAgICAg
ICAgICB0aGlzLl9yZWluc3RhbGxUaW1lclRpbWVvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNl
IGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGltZXIpID09PSAnW29iamVjdCBB
cnJheV0nKSB7CisgICAgICAgIC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSB0aHJvdHRsZSBvciBkZWJv
dW5jZQorICAgICAgICByZXR1cm4gdGhpcy5fY2FuY2VsSXRlbShmaW5kVGhyb3R0bGVyLCB0aGlz
Ll90aHJvdHRsZXJzLCB0aW1lcikgfHwgdGhpcy5fY2FuY2VsSXRlbShmaW5kRGVib3VuY2VlLCB0
aGlzLl9kZWJvdW5jZWVzLCB0aW1lcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm47
IC8vIHRpbWVyIHdhcyBudWxsIG9yIG5vdCBhIHRpbWVyCisgICAgICB9CisgICAgfSwKKworICAg
IF9jYW5jZWxJdGVtOiBmdW5jdGlvbiAoZmluZE1ldGhvZCwgYXJyYXksIHRpbWVyKSB7CisgICAg
ICB2YXIgaXRlbSwgaW5kZXg7CisKKyAgICAgIGlmICh0aW1lci5sZW5ndGggPCAzKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaW5kZXggPSBmaW5kTWV0aG9kKHRp
bWVyWzBdLCB0aW1lclsxXSwgYXJyYXkpOworCisgICAgICBpZiAoaW5kZXggPiAtMSkgeworCisg
ICAgICAgIGl0ZW0gPSBhcnJheVtpbmRleF07CisKKyAgICAgICAgaWYgKGl0ZW1bMl0gPT09IHRp
bWVyWzJdKSB7CisgICAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgICB0
aGlzLl9wbGF0Zm9ybS5jbGVhclRpbWVvdXQodGltZXJbMl0pOworICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAor
CisgICAgX3J1bkV4cGlyZWRUaW1lcnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3RpbWVy
VGltZW91dElkID0gdW5kZWZpbmVkOworICAgICAgdGhpcy5ydW4odGhpcywgdGhpcy5fc2NoZWR1
bGVFeHBpcmVkVGltZXJzKTsKKyAgICB9LAorCisgICAgX3NjaGVkdWxlRXhwaXJlZFRpbWVyczog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG4gPSBEYXRlLm5vdygpOworICAgICAgdmFyIHRpbWVy
cyA9IHRoaXMuX3RpbWVyczsKKyAgICAgIHZhciBpID0gMDsKKyAgICAgIHZhciBsID0gdGltZXJz
Lmxlbmd0aDsKKyAgICAgIGZvciAoOyBpIDwgbDsgaSArPSAyKSB7CisgICAgICAgIHZhciBleGVj
dXRlQXQgPSB0aW1lcnNbaV07CisgICAgICAgIHZhciBmbiA9IHRpbWVyc1tpICsgMV07CisgICAg
ICAgIGlmIChleGVjdXRlQXQgPD0gbikgeworICAgICAgICAgIHRoaXMuc2NoZWR1bGUodGhpcy5v
cHRpb25zLmRlZmF1bHRRdWV1ZSwgbnVsbCwgZm4pOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aW1lcnMuc3BsaWNlKDAsIGkp
OworICAgICAgdGhpcy5faW5zdGFsbFRpbWVyVGltZW91dCgpOworICAgIH0sCisKKyAgICBfcmVp
bnN0YWxsVGltZXJUaW1lb3V0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9jbGVhclRpbWVy
VGltZW91dCgpOworICAgICAgdGhpcy5faW5zdGFsbFRpbWVyVGltZW91dCgpOworICAgIH0sCisK
KyAgICBfY2xlYXJUaW1lclRpbWVvdXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy5f
dGltZXJUaW1lb3V0SWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5f
cGxhdGZvcm0uY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyVGltZW91dElkKTsKKyAgICAgIHRoaXMu
X3RpbWVyVGltZW91dElkID0gdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBfaW5zdGFsbFRpbWVy
VGltZW91dDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF0aGlzLl90aW1lcnMubGVuZ3RoKSB7
CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBtaW5FeHBpcmVzQXQgPSB0aGlz
Ll90aW1lcnNbMF07CisgICAgICB2YXIgbiA9IERhdGUubm93KCk7CisgICAgICB2YXIgd2FpdCA9
IE1hdGgubWF4KDAsIG1pbkV4cGlyZXNBdCAtIG4pOworICAgICAgdGhpcy5fdGltZXJUaW1lb3V0
SWQgPSB0aGlzLl9wbGF0Zm9ybS5zZXRUaW1lb3V0KHRoaXMuX2JvdW5kUnVuRXhwaXJlZFRpbWVy
cywgd2FpdCk7CisgICAgfQorICB9OworCisgIEJhY2tidXJuZXIucHJvdG90eXBlLnNjaGVkdWxl
ID0gQmFja2J1cm5lci5wcm90b3R5cGUuZGVmZXI7CisgIEJhY2tidXJuZXIucHJvdG90eXBlLnNj
aGVkdWxlT25jZSA9IEJhY2tidXJuZXIucHJvdG90eXBlLmRlZmVyT25jZTsKKyAgQmFja2J1cm5l
ci5wcm90b3R5cGUubGF0ZXIgPSBCYWNrYnVybmVyLnByb3RvdHlwZS5zZXRUaW1lb3V0OworCisg
IGZ1bmN0aW9uIGdldE9uRXJyb3Iob3B0aW9ucykgeworICAgIHJldHVybiBvcHRpb25zLm9uRXJy
b3IgfHwgb3B0aW9ucy5vbkVycm9yVGFyZ2V0ICYmIG9wdGlvbnMub25FcnJvclRhcmdldFtvcHRp
b25zLm9uRXJyb3JNZXRob2RdOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlQXV0b3J1bihiYWNr
YnVybmVyKSB7CisgICAgYmFja2J1cm5lci5iZWdpbigpOworICAgIGJhY2tidXJuZXIuX2F1dG9y
dW4gPSBiYWNrYnVybmVyLl9wbGF0Zm9ybS5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAg
IGJhY2tidXJuZXIuX2F1dG9ydW4gPSBudWxsOworICAgICAgYmFja2J1cm5lci5lbmQoKTsKKyAg
ICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmREZWJvdW5jZWUodGFyZ2V0LCBtZXRob2QsIGRl
Ym91bmNlZXMpIHsKKyAgICByZXR1cm4gZmluZEl0ZW0odGFyZ2V0LCBtZXRob2QsIGRlYm91bmNl
ZXMpOworICB9CisKKyAgZnVuY3Rpb24gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCwgdGhy
b3R0bGVycykgeworICAgIHJldHVybiBmaW5kSXRlbSh0YXJnZXQsIG1ldGhvZCwgdGhyb3R0bGVy
cyk7CisgIH0KKworICBmdW5jdGlvbiBmaW5kSXRlbSh0YXJnZXQsIG1ldGhvZCwgY29sbGVjdGlv
bikgeworICAgIHZhciBpdGVtOworICAgIHZhciBpbmRleCA9IC0xOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaXRlbSA9
IGNvbGxlY3Rpb25baV07CisgICAgICBpZiAoaXRlbVswXSA9PT0gdGFyZ2V0ICYmIGl0ZW1bMV0g
PT09IG1ldGhvZCkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBpbmRleDsKKyAgfQorCisgIGZ1bmN0aW9uIGNsZWFySXRl
bXMoaXRlbSkgeworICAgIHRoaXMuX3BsYXRmb3JtLmNsZWFyVGltZW91dChpdGVtWzJdKTsKKyAg
fQorfSk7CitlbmlmZWQoImJhY2tidXJuZXIvYmluYXJ5LXNlYXJjaCIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gYmluYXJ5U2VhcmNoOworCisgIGZ1bmN0aW9uIGJpbmFyeVNlYXJjaCh0aW1lLCB0aW1lcnMp
IHsKKyAgICB2YXIgc3RhcnQgPSAwOworICAgIHZhciBlbmQgPSB0aW1lcnMubGVuZ3RoIC0gMjsK
KyAgICB2YXIgbWlkZGxlLCBsOworCisgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAv
LyBzaW5jZSB0aW1lcnMgaXMgYW4gYXJyYXkgb2YgcGFpcnMgJ2wnIHdpbGwgYWx3YXlzCisgICAg
ICAvLyBiZSBhbiBpbnRlZ2VyCisgICAgICBsID0gKGVuZCAtIHN0YXJ0KSAvIDI7CisKKyAgICAg
IC8vIGNvbXBlbnNhdGUgZm9yIHRoZSBpbmRleCBpbiBjYXNlIGV2ZW4gbnVtYmVyCisgICAgICAv
LyBvZiBwYWlycyBpbnNpZGUgdGltZXJzCisgICAgICBtaWRkbGUgPSBzdGFydCArIGwgLSBsICUg
MjsKKworICAgICAgaWYgKHRpbWUgPj0gdGltZXJzW21pZGRsZV0pIHsKKyAgICAgICAgc3RhcnQg
PSBtaWRkbGUgKyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5kID0gbWlkZGxlOworICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiB0aW1lID49IHRpbWVyc1tzdGFydF0gPyBzdGFydCAr
IDIgOiBzdGFydDsKKyAgfQorfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvZGVmZXJyZWQtYWN0aW9u
LXF1ZXVlcycsIFsnZXhwb3J0cycsICdiYWNrYnVybmVyL3V0aWxzJywgJ2JhY2tidXJuZXIvcXVl
dWUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9iYWNrYnVybmVyVXRpbHMsIF9iYWNrYnVybmVyUXVl
dWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERlZmVycmVkQWN0
aW9uUXVldWVzOworCisgIGZ1bmN0aW9uIERlZmVycmVkQWN0aW9uUXVldWVzKHF1ZXVlTmFtZXMs
IG9wdGlvbnMpIHsKKyAgICB2YXIgcXVldWVzID0gdGhpcy5xdWV1ZXMgPSB7fTsKKyAgICB0aGlz
LnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzID0gcXVldWVOYW1lcyB8fCBbXTsKKworICAgIHRoaXMu
b3B0aW9ucyA9IG9wdGlvbnM7CisKKyAgICBfYmFja2J1cm5lclV0aWxzLmVhY2gocXVldWVOYW1l
cywgZnVuY3Rpb24gKHF1ZXVlTmFtZSkgeworICAgICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcg
X2JhY2tidXJuZXJRdWV1ZS5kZWZhdWx0KHF1ZXVlTmFtZSwgb3B0aW9uc1txdWV1ZU5hbWVdLCBv
cHRpb25zKTsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIG5vU3VjaFF1ZXVlKG5hbWUpIHsK
KyAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhdHRlbXB0ZWQgdG8gc2NoZWR1bGUgYW4gYWN0aW9u
IGluIGEgcXVldWUgKCcgKyBuYW1lICsgJykgdGhhdCBkb2VzblwndCBleGlzdCcpOworICB9CisK
KyAgZnVuY3Rpb24gbm9TdWNoTWV0aG9kKG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1lv
dSBhdHRlbXB0ZWQgdG8gc2NoZWR1bGUgYW4gYWN0aW9uIGluIGEgcXVldWUgKCcgKyBuYW1lICsg
JykgZm9yIGEgbWV0aG9kIHRoYXQgZG9lc25cJ3QgZXhpc3QnKTsKKyAgfQorCisgIERlZmVycmVk
QWN0aW9uUXVldWVzLnByb3RvdHlwZSA9IHsKKyAgICBzY2hlZHVsZTogZnVuY3Rpb24gKG5hbWUs
IHRhcmdldCwgbWV0aG9kLCBhcmdzLCBvbmNlRmxhZywgc3RhY2spIHsKKyAgICAgIHZhciBxdWV1
ZXMgPSB0aGlzLnF1ZXVlczsKKyAgICAgIHZhciBxdWV1ZSA9IHF1ZXVlc1tuYW1lXTsKKworICAg
ICAgaWYgKCFxdWV1ZSkgeworICAgICAgICBub1N1Y2hRdWV1ZShuYW1lKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgICAgbm9TdWNoTWV0aG9kKG5hbWUpOworICAgICAg
fQorCisgICAgICBpZiAob25jZUZsYWcpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLnB1c2hVbmlx
dWUodGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHJldHVybiBxdWV1ZS5wdXNoKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgICB9
CisgICAgfSwKKworICAgIGZsdXNoOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVldWVzID0g
dGhpcy5xdWV1ZXM7CisgICAgICB2YXIgcXVldWVOYW1lcyA9IHRoaXMucXVldWVOYW1lczsKKyAg
ICAgIHZhciBxdWV1ZU5hbWUsIHF1ZXVlOworICAgICAgdmFyIHF1ZXVlTmFtZUluZGV4ID0gMDsK
KyAgICAgIHZhciBudW1iZXJPZlF1ZXVlcyA9IHF1ZXVlTmFtZXMubGVuZ3RoOworCisgICAgICB3
aGlsZSAocXVldWVOYW1lSW5kZXggPCBudW1iZXJPZlF1ZXVlcykgeworICAgICAgICBxdWV1ZU5h
bWUgPSBxdWV1ZU5hbWVzW3F1ZXVlTmFtZUluZGV4XTsKKyAgICAgICAgcXVldWUgPSBxdWV1ZXNb
cXVldWVOYW1lXTsKKworICAgICAgICB2YXIgbnVtYmVyT2ZRdWV1ZUl0ZW1zID0gcXVldWUuX3F1
ZXVlLmxlbmd0aDsKKworICAgICAgICBpZiAobnVtYmVyT2ZRdWV1ZUl0ZW1zID09PSAwKSB7Cisg
ICAgICAgICAgcXVldWVOYW1lSW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBx
dWV1ZS5mbHVzaChmYWxzZSAvKiBhc3luYyAqLyk7CisgICAgICAgICAgcXVldWVOYW1lSW5kZXgg
PSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2JhY2ti
dXJuZXIvcGxhdGZvcm0nLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBHbG9iYWxDb250ZXh0OworCisgIC8qIGdsb2JhbCBzZWxmICov
CisgIGlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHsKKyAgICBHbG9iYWxDb250ZXh0ID0g
c2VsZjsKKworICAgIC8qIGdsb2JhbCBnbG9iYWwgKi8KKyAgfSBlbHNlIGlmICh0eXBlb2YgZ2xv
YmFsID09PSAnb2JqZWN0JykgeworICAgICAgR2xvYmFsQ29udGV4dCA9IGdsb2JhbDsKKworICAg
ICAgLyogZ2xvYmFsIHdpbmRvdyAqLworICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0g
J29iamVjdCcpIHsKKyAgICAgICAgR2xvYmFsQ29udGV4dCA9IHdpbmRvdzsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ2xvYmFsOiBgc2VsZmAsIGBnbG9iYWxg
IG5vciBgd2luZG93YCB3YXMgZm91bmQnKTsKKyAgICAgIH0KKworICBleHBvcnRzLmRlZmF1bHQg
PSBHbG9iYWxDb250ZXh0OworfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvcXVldWUnLCBbJ2V4cG9y
dHMnLCAnYmFja2J1cm5lci91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2JhY2tidXJuZXJV
dGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUXVldWU7CisK
KyAgZnVuY3Rpb24gUXVldWUobmFtZSwgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucykgeworICAgIHRo
aXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucyB8
fCB7fTsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgIHRoaXMuX3F1ZXVlID0gW107
CisgICAgdGhpcy50YXJnZXRRdWV1ZXMgPSB7fTsKKyAgICB0aGlzLl9xdWV1ZUJlaW5nRmx1c2hl
ZCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIFF1ZXVlLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBm
dW5jdGlvbiAodGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7CisgICAgICB2YXIgcXVldWUg
PSB0aGlzLl9xdWV1ZTsKKyAgICAgIHF1ZXVlLnB1c2godGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0
YWNrKTsKKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcXVldWU6IHRoaXMsCisgICAgICAgIHRh
cmdldDogdGFyZ2V0LAorICAgICAgICBtZXRob2Q6IG1ldGhvZAorICAgICAgfTsKKyAgICB9LAor
CisgICAgcHVzaFVuaXF1ZVdpdGhvdXRHdWlkOiBmdW5jdGlvbiAodGFyZ2V0LCBtZXRob2QsIGFy
Z3MsIHN0YWNrKSB7CisgICAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTsKKworICAgICAgZm9y
ICh2YXIgaSA9IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKKyAgICAgICAg
dmFyIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKKyAgICAgICAgdmFyIGN1cnJlbnRNZXRob2Qg
PSBxdWV1ZVtpICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAm
JiBjdXJyZW50TWV0aG9kID09PSBtZXRob2QpIHsKKyAgICAgICAgICBxdWV1ZVtpICsgMl0gPSBh
cmdzOyAvLyByZXBsYWNlIGFyZ3MKKyAgICAgICAgICBxdWV1ZVtpICsgM10gPSBzdGFjazsgLy8g
cmVwbGFjZSBzdGFjaworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisg
ICAgICBxdWV1ZS5wdXNoKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgfSwKKwor
ICAgIHRhcmdldFF1ZXVlOiBmdW5jdGlvbiAodGFyZ2V0UXVldWUsIHRhcmdldCwgbWV0aG9kLCBh
cmdzLCBzdGFjaykgeworICAgICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7CisKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gdGFyZ2V0UXVldWUubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Cisg
ICAgICAgIHZhciBjdXJyZW50TWV0aG9kID0gdGFyZ2V0UXVldWVbaV07CisgICAgICAgIHZhciBj
dXJyZW50SW5kZXggPSB0YXJnZXRRdWV1ZVtpICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRN
ZXRob2QgPT09IG1ldGhvZCkgeworICAgICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleCArIDJdID0g
YXJnczsgLy8gcmVwbGFjZSBhcmdzCisgICAgICAgICAgcXVldWVbY3VycmVudEluZGV4ICsgM10g
PSBzdGFjazsgLy8gcmVwbGFjZSBzdGFjaworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICB0YXJnZXRRdWV1ZS5wdXNoKG1ldGhvZCwgcXVldWUucHVzaCh0YXJn
ZXQsIG1ldGhvZCwgYXJncywgc3RhY2spIC0gNCk7CisgICAgfSwKKworICAgIHB1c2hVbmlxdWVX
aXRoR3VpZDogZnVuY3Rpb24gKGd1aWQsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgewor
ICAgICAgdmFyIGhhc0xvY2FsUXVldWUgPSB0aGlzLnRhcmdldFF1ZXVlc1tndWlkXTsKKworICAg
ICAgaWYgKGhhc0xvY2FsUXVldWUpIHsKKyAgICAgICAgdGhpcy50YXJnZXRRdWV1ZShoYXNMb2Nh
bFF1ZXVlLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy50YXJnZXRRdWV1ZXNbZ3VpZF0gPSBbbWV0aG9kLCB0aGlzLl9xdWV1ZS5wdXNo
KHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgLSA0XTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIHsKKyAgICAgICAgcXVldWU6IHRoaXMsCisgICAgICAgIHRhcmdldDogdGFyZ2V0LAorICAg
ICAgICBtZXRob2Q6IG1ldGhvZAorICAgICAgfTsKKyAgICB9LAorCisgICAgcHVzaFVuaXF1ZTog
ZnVuY3Rpb24gKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgeworICAgICAgdmFyIEtFWSA9
IHRoaXMuZ2xvYmFsT3B0aW9ucy5HVUlEX0tFWTsKKworICAgICAgaWYgKHRhcmdldCAmJiBLRVkp
IHsKKyAgICAgICAgdmFyIGd1aWQgPSB0YXJnZXRbS0VZXTsKKyAgICAgICAgaWYgKGd1aWQpIHsK
KyAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoVW5pcXVlV2l0aEd1aWQoZ3VpZCwgdGFyZ2V0LCBt
ZXRob2QsIGFyZ3MsIHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLnB1
c2hVbmlxdWVXaXRob3V0R3VpZCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOworCisgICAg
ICByZXR1cm4geworICAgICAgICBxdWV1ZTogdGhpcywKKyAgICAgICAgdGFyZ2V0OiB0YXJnZXQs
CisgICAgICAgIG1ldGhvZDogbWV0aG9kCisgICAgICB9OworICAgIH0sCisKKyAgICBpbnZva2U6
IGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZCwgYXJncywgXywgX2Vycm9yUmVjb3JkZWRGb3JTdGFj
aykgeworICAgICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgIG1ldGhv
ZC5hcHBseSh0YXJnZXQsIGFyZ3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0aG9kLmNh
bGwodGFyZ2V0KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaW52b2tlV2l0aE9uRXJyb3I6IGZ1
bmN0aW9uICh0YXJnZXQsIG1ldGhvZCwgYXJncywgb25FcnJvciwgZXJyb3JSZWNvcmRlZEZvclN0
YWNrKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoYXJncyAmJiBhcmdzLmxlbmd0aCA+IDAp
IHsKKyAgICAgICAgICBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmdzKTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgICB9CisgICAgICB9IGNh
dGNoIChlcnJvcikgeworICAgICAgICBvbkVycm9yKGVycm9yLCBlcnJvclJlY29yZGVkRm9yU3Rh
Y2spOworICAgICAgfQorICAgIH0sCisKKyAgICBmbHVzaDogZnVuY3Rpb24gKHN5bmMpIHsKKyAg
ICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlOworICAgICAgdmFyIGxlbmd0aCA9IHF1ZXVlLmxl
bmd0aDsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisKKyAgICAgIHZhciBnbG9iYWxPcHRpb25zID0gdGhpcy5nbG9iYWxPcHRpb25zOworICAg
ICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisgICAgICB2YXIgYmVmb3JlID0gb3B0aW9u
cyAmJiBvcHRpb25zLmJlZm9yZTsKKyAgICAgIHZhciBhZnRlciA9IG9wdGlvbnMgJiYgb3B0aW9u
cy5hZnRlcjsKKyAgICAgIHZhciBvbkVycm9yID0gZ2xvYmFsT3B0aW9ucy5vbkVycm9yIHx8IGds
b2JhbE9wdGlvbnMub25FcnJvclRhcmdldCAmJiBnbG9iYWxPcHRpb25zLm9uRXJyb3JUYXJnZXRb
Z2xvYmFsT3B0aW9ucy5vbkVycm9yTWV0aG9kXTsKKyAgICAgIHZhciB0YXJnZXQsIG1ldGhvZCwg
YXJncywgZXJyb3JSZWNvcmRlZEZvclN0YWNrOworICAgICAgdmFyIGludm9rZSA9IG9uRXJyb3Ig
PyB0aGlzLmludm9rZVdpdGhPbkVycm9yIDogdGhpcy5pbnZva2U7CisKKyAgICAgIHRoaXMudGFy
Z2V0UXVldWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHZhciBxdWV1ZUl0ZW1zID0g
dGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQgPSB0aGlzLl9xdWV1ZS5zbGljZSgpOworICAgICAgdGhp
cy5fcXVldWUgPSBbXTsKKworICAgICAgaWYgKGJlZm9yZSkgeworICAgICAgICBiZWZvcmUoKTsK
KyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewor
ICAgICAgICB0YXJnZXQgPSBxdWV1ZUl0ZW1zW2ldOworICAgICAgICBtZXRob2QgPSBxdWV1ZUl0
ZW1zW2kgKyAxXTsKKyAgICAgICAgYXJncyA9IHF1ZXVlSXRlbXNbaSArIDJdOworICAgICAgICBl
cnJvclJlY29yZGVkRm9yU3RhY2sgPSBxdWV1ZUl0ZW1zW2kgKyAzXTsgLy8gRGVidWdnaW5nIGFz
c2lzdGFuY2UKKworICAgICAgICBpZiAoX2JhY2tidXJuZXJVdGlscy5pc1N0cmluZyhtZXRob2Qp
KSB7CisgICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICAgIH0KKworICAg
ICAgICAvLyBtZXRob2QgY291bGQgaGF2ZSBiZWVuIG51bGxpZmllZCAvIGNhbmNlbGVkIGR1cmlu
ZyBmbHVzaAorICAgICAgICBpZiAobWV0aG9kKSB7CisgICAgICAgICAgLy8KKyAgICAgICAgICAv
LyAgICAqKiBBdHRlbnRpb24gaW50cmVwaWQgZGV2ZWxvcGVyICoqCisgICAgICAgICAgLy8KKyAg
ICAgICAgICAvLyAgICBUbyBmaW5kIG91dCB0aGUgc3RhY2sgb2YgdGhpcyB0YXNrIHdoZW4gaXQg
d2FzIHNjaGVkdWxlZCBvbnRvCisgICAgICAgICAgLy8gICAgdGhlIHJ1biBsb29wLCBhZGQgdGhl
IGZvbGxvd2luZyB0byB5b3VyIGFwcC5qczoKKyAgICAgICAgICAvLworICAgICAgICAgIC8vICAg
IEVtYmVyLnJ1bi5iYWNrYnVybmVyLkRFQlVHID0gdHJ1ZTsgLy8gTk9URTogVGhpcyBzbG93cyB5
b3VyIGFwcCwgZG9uJ3QgbGVhdmUgaXQgb24gaW4gcHJvZHVjdGlvbi4KKyAgICAgICAgICAvLwor
ICAgICAgICAgIC8vICAgIE9uY2UgdGhhdCBpcyBpbiBwbGFjZSwgd2hlbiB5b3UgYXJlIGF0IGEg
YnJlYWtwb2ludCBhbmQgbmF2aWdhdGUKKyAgICAgICAgICAvLyAgICBoZXJlIGluIHRoZSBzdGFj
ayBleHBsb3JlciwgeW91IGNhbiBsb29rIGF0IGBlcnJvclJlY29yZGVkRm9yU3RhY2suc3RhY2tg
LAorICAgICAgICAgIC8vICAgIHdoaWNoIHdpbGwgYmUgdGhlIGNhcHR1cmVkIHN0YWNrIHdoZW4g
dGhpcyBqb2Igd2FzIHNjaGVkdWxlZC4KKyAgICAgICAgICAvLworICAgICAgICAgIGludm9rZSh0
YXJnZXQsIG1ldGhvZCwgYXJncywgb25FcnJvciwgZXJyb3JSZWNvcmRlZEZvclN0YWNrKTsKKyAg
ICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYWZ0ZXIpIHsKKyAgICAgICAgYWZ0ZXIoKTsK
KyAgICAgIH0KKworICAgICAgdGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQgPSB1bmRlZmluZWQ7CisK
KyAgICAgIGlmIChzeW5jICE9PSBmYWxzZSAmJiB0aGlzLl9xdWV1ZS5sZW5ndGggPiAwKSB7Cisg
ICAgICAgIC8vIGNoZWNrIGlmIG5ldyBpdGVtcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgdGhp
cy5mbHVzaCh0cnVlKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgY2FuY2VsOiBmdW5jdGlvbiAo
YWN0aW9uVG9DYW5jZWwpIHsKKyAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLAorICAgICAg
ICAgIGN1cnJlbnRUYXJnZXQsCisgICAgICAgICAgY3VycmVudE1ldGhvZCwKKyAgICAgICAgICBp
LAorICAgICAgICAgIGw7CisgICAgICB2YXIgdGFyZ2V0ID0gYWN0aW9uVG9DYW5jZWwudGFyZ2V0
OworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvblRvQ2FuY2VsLm1ldGhvZDsKKyAgICAgIHZhciBH
VUlEX0tFWSA9IHRoaXMuZ2xvYmFsT3B0aW9ucy5HVUlEX0tFWTsKKworICAgICAgaWYgKEdVSURf
S0VZICYmIHRoaXMudGFyZ2V0UXVldWVzICYmIHRhcmdldCkgeworICAgICAgICB2YXIgdGFyZ2V0
UXVldWUgPSB0aGlzLnRhcmdldFF1ZXVlc1t0YXJnZXRbR1VJRF9LRVldXTsKKworICAgICAgICBp
ZiAodGFyZ2V0UXVldWUpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGFyZ2V0UXVldWUu
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0UXVldWVbaV0gPT09
IG1ldGhvZCkgeworICAgICAgICAgICAgICB0YXJnZXRRdWV1ZS5zcGxpY2UoaSwgMSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAo
aSA9IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKKyAgICAgICAgY3VycmVu
dFRhcmdldCA9IHF1ZXVlW2ldOworICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVbaSArIDFd
OworCisgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09PSB0YXJnZXQgJiYgY3VycmVudE1ldGhv
ZCA9PT0gbWV0aG9kKSB7CisgICAgICAgICAgcXVldWUuc3BsaWNlKGksIDQpOworICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIGlmIG5vdCBmb3Vu
ZCBpbiBjdXJyZW50IHF1ZXVlCisgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUgcXVldWUgdGhhdCBp
cyBiZWluZyBmbHVzaGVkCisgICAgICBxdWV1ZSA9IHRoaXMuX3F1ZXVlQmVpbmdGbHVzaGVkOwor
CisgICAgICBpZiAoIXF1ZXVlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAg
Zm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gNCkgeworICAgICAgICBj
dXJyZW50VGFyZ2V0ID0gcXVldWVbaV07CisgICAgICAgIGN1cnJlbnRNZXRob2QgPSBxdWV1ZVtp
ICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAmJiBjdXJyZW50
TWV0aG9kID09PSBtZXRob2QpIHsKKyAgICAgICAgICAvLyBkb24ndCBtZXNzIHdpdGggYXJyYXkg
ZHVyaW5nIGZsdXNoCisgICAgICAgICAgLy8ganVzdCBudWxsaWZ5IHRoZSBtZXRob2QKKyAgICAg
ICAgICBxdWV1ZVtpICsgMV0gPSBudWxsOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvdXRpbHMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZWFjaCA9IGVhY2g7CisgIGV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZzsKKyAg
ZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKKyAgZXhwb3J0cy5pc051bWJlciA9IGlz
TnVtYmVyOworICBleHBvcnRzLmlzQ29lcmNhYmxlTnVtYmVyID0gaXNDb2VyY2FibGVOdW1iZXI7
CisgIHZhciBOVU1CRVIgPSAvXGQrLzsKKworICBmdW5jdGlvbiBlYWNoKGNvbGxlY3Rpb24sIGNh
bGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsr
KSB7CisgICAgICBjYWxsYmFjayhjb2xsZWN0aW9uW2ldKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBpc1N0cmluZyhzdXNwZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBzdXNwZWN0ID09PSAn
c3RyaW5nJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oc3VzcGVjdCkgeworICAgIHJl
dHVybiB0eXBlb2Ygc3VzcGVjdCA9PT0gJ2Z1bmN0aW9uJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlz
TnVtYmVyKHN1c3BlY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIHN1c3BlY3QgPT09ICdudW1iZXIn
OworICB9CisKKyAgZnVuY3Rpb24gaXNDb2VyY2FibGVOdW1iZXIobnVtYmVyKSB7CisgICAgcmV0
dXJuIGlzTnVtYmVyKG51bWJlcikgfHwgTlVNQkVSLnRlc3QobnVtYmVyKTsKKyAgfQorfSk7Citl
bmlmZWQoJ2NvbnRhaW5lci9jb250YWluZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29y
ZScsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9kaWN0aW9uYXJ5JywgJ2VtYmVy
LW1ldGFsL2ZlYXR1cmVzJywgJ2NvbnRhaW5lci9vd25lcicsICdlbWJlci1ydW50aW1lL21peGlu
cy9jb250YWluZXJfcHJveHknLCAnZW1iZXItbWV0YWwvc3ltYm9sJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRGljdGlv
bmFyeSwgX2VtYmVyTWV0YWxGZWF0dXJlcywgX2NvbnRhaW5lck93bmVyLCBfZW1iZXJSdW50aW1l
TWl4aW5zQ29udGFpbmVyX3Byb3h5LCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgdmFyIENPTlRBSU5FUl9PVkVSUklERSA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1
bHQoJ0NPTlRBSU5FUl9PVkVSUklERScpOworCisgIC8qKgorICAgQSBjb250YWluZXIgdXNlZCB0
byBpbnN0YW50aWF0ZSBhbmQgY2FjaGUgb2JqZWN0cy4KKyAgCisgICBFdmVyeSBgQ29udGFpbmVy
YCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGBSZWdpc3RyeWAsIHdoaWNoIGlzIHJlZmVyZW5j
ZWQKKyAgIHRvIGRldGVybWluZSB0aGUgZmFjdG9yeSBhbmQgb3B0aW9ucyB0aGF0IHNob3VsZCBi
ZSB1c2VkIHRvIGluc3RhbnRpYXRlCisgICBvYmplY3RzLgorICAKKyAgIFRoZSBwdWJsaWMgQVBJ
IGZvciBgQ29udGFpbmVyYCBpcyBzdGlsbCBpbiBmbHV4IGFuZCBzaG91bGQgbm90IGJlIGNvbnNp
ZGVyZWQKKyAgIHN0YWJsZS4KKyAgCisgICBAcHJpdmF0ZQorICAgQGNsYXNzIENvbnRhaW5lcgor
ICAgKi8KKyAgZnVuY3Rpb24gQ29udGFpbmVyKHJlZ2lzdHJ5LCBvcHRpb25zKSB7CisgICAgdGhp
cy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworICAgIHRoaXMub3duZXIgPSBvcHRpb25zICYmIG9wdGlv
bnMub3duZXIgPyBvcHRpb25zLm93bmVyIDogbnVsbDsKKyAgICB0aGlzLmNhY2hlID0gX2VtYmVy
TWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQob3B0aW9ucyAmJiBvcHRpb25zLmNhY2hlID8gb3B0aW9u
cy5jYWNoZSA6IG51bGwpOworICAgIHRoaXMuZmFjdG9yeUNhY2hlID0gX2VtYmVyTWV0YWxEaWN0
aW9uYXJ5LmRlZmF1bHQob3B0aW9ucyAmJiBvcHRpb25zLmZhY3RvcnlDYWNoZSA/IG9wdGlvbnMu
ZmFjdG9yeUNhY2hlIDogbnVsbCk7CisgICAgdGhpcy52YWxpZGF0aW9uQ2FjaGUgPSBfZW1iZXJN
ZXRhbERpY3Rpb25hcnkuZGVmYXVsdChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGlvbkNhY2hl
ID8gb3B0aW9ucy52YWxpZGF0aW9uQ2FjaGUgOiBudWxsKTsKKyAgICB0aGlzLl9mYWtlQ29udGFp
bmVyVG9JbmplY3QgPSBfZW1iZXJSdW50aW1lTWl4aW5zQ29udGFpbmVyX3Byb3h5LmJ1aWxkRmFr
ZUNvbnRhaW5lcldpdGhEZXByZWNhdGlvbnModGhpcyk7CisgICAgdGhpc1tDT05UQUlORVJfT1ZF
UlJJREVdID0gdW5kZWZpbmVkOworICB9CisKKyAgQ29udGFpbmVyLnByb3RvdHlwZSA9IHsKKyAg
ICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgQHByb3BlcnR5IG93bmVyCisgICAgIEB0eXBlIE9i
amVjdAorICAgICAqLworICAgIG93bmVyOiBudWxsLAorCisgICAgLyoqCisgICAgIEBwcml2YXRl
CisgICAgIEBwcm9wZXJ0eSByZWdpc3RyeQorICAgICBAdHlwZSBSZWdpc3RyeQorICAgICBAc2lu
Y2UgMS4xMS4wCisgICAgICovCisgICAgcmVnaXN0cnk6IG51bGwsCisKKyAgICAvKioKKyAgICAg
QHByaXZhdGUKKyAgICAgQHByb3BlcnR5IGNhY2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0
CisgICAgICovCisgICAgY2FjaGU6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAg
ICAgQHByb3BlcnR5IGZhY3RvcnlDYWNoZQorICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAg
ICAqLworICAgIGZhY3RvcnlDYWNoZTogbnVsbCwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQor
ICAgICBAcHJvcGVydHkgdmFsaWRhdGlvbkNhY2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0
CisgICAgICovCisgICAgdmFsaWRhdGlvbkNhY2hlOiBudWxsLAorCisgICAgLyoqCisgICAgIEdp
dmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZS4KKyAgICAgIFRo
ZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBmb3IgbG9va3VwIHRvIHJldHVybiBhIHNpbmdsZXRvbiBp
bnN0YW5jZS4KKyAgICAgVGhlIHNpbmdsZXRvbiBpcyBzY29wZWQgdG8gdGhlIGNvbnRhaW5lciwg
YWxsb3dpbmcgbXVsdGlwbGUgY29udGFpbmVycworICAgICB0byBhbGwgaGF2ZSB0aGVpciBvd24g
bG9jYWxseSBzY29wZWQgc2luZ2xldG9ucy4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFy
IHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHZhciBjb250YWluZXIgPSByZWdpc3Ry
eS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3
aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicpOworICAgICAgdHdpdHRlciBpbnN0YW5jZW9mIFR3aXR0ZXI7IC8vID0+IHRydWUKKyAgICAg
IC8vIGJ5IGRlZmF1bHQgdGhlIGNvbnRhaW5lciB3aWxsIHJldHVybiBzaW5nbGV0b25zCisgICAg
IHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJyk7CisgICAgIHR3
aXR0ZXIyIGluc3RhbmNlb2YgVHdpdHRlcjsgLy8gPT4gdHJ1ZQorICAgICAgdHdpdHRlciA9PT0g
dHdpdHRlcjI7IC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIElmIHNpbmdsZXRvbnMgYXJlIG5v
dCB3YW50ZWQsIGFuIG9wdGlvbmFsIGZsYWcgY2FuIGJlIHByb3ZpZGVkIGF0IGxvb2t1cC4KKyAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7Cisg
ICAgIHZhciBjb250YWluZXIgPSByZWdpc3RyeS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBj
b250YWluZXIubG9va3VwKCdhcGk6dHdpdHRlcicsIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAg
ICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmds
ZXRvbjogZmFsc2UgfSk7CisgICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsgLy89PiBmYWxzZQor
ICAgICBgYGAKKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgbG9va3VwCisgICAgIEBwYXJh
bSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCisgICAg
IEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VdIFRoZSBmdWxsbmFtZSBvZiB0aGUgcmVx
dWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxvb2t1cCkKKyAgICAgQHJldHVybiB7YW55fQor
ICAgICAqLworICAgIGxvb2t1cDogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRpb25zKSB7CisgICAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnZnVsbE5hbWUgbXVzdCBiZSBhIHByb3BlciBmdWxs
IG5hbWUnLCB0aGlzLnJlZ2lzdHJ5LnZhbGlkYXRlRnVsbE5hbWUoZnVsbE5hbWUpKTsKKyAgICAg
IHJldHVybiBsb29rdXAodGhpcywgdGhpcy5yZWdpc3RyeS5ub3JtYWxpemUoZnVsbE5hbWUpLCBv
cHRpb25zKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIEdpdmVuIGEgZnVsbE5hbWUsIHJldHVy
biB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhv
ZCBsb29rdXBGYWN0b3J5CisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFy
YW0ge09iamVjdH0gW29wdGlvbnNdCisgICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3Vy
Y2VdIFRoZSBmdWxsbmFtZSBvZiB0aGUgcmVxdWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxv
b2t1cCkKKyAgICAgQHJldHVybiB7YW55fQorICAgICAqLworICAgIGxvb2t1cEZhY3Rvcnk6IGZ1
bmN0aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3Nl
cnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy5yZWdpc3RyeS52
YWxpZGF0ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisgICAgICByZXR1cm4gZmFjdG9yeUZvcih0aGlz
LCB0aGlzLnJlZ2lzdHJ5Lm5vcm1hbGl6ZShmdWxsTmFtZSksIG9wdGlvbnMpOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgQSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGRlc3Ryb3lpbmcgdGhlIGNv
bnRhaW5lciwgaXRzIGRlc2NlbmRhbnQgY29udGFpbmVycyBhbmQgYWxsCisgICAgIHRoZWlyIG1h
bmFnZWQgb2JqZWN0cy4KKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgZGVzdHJveQorICAg
ICAqLworICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGVhY2hEZXN0cm95YWJsZSh0
aGlzLCBmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5kZXN0cm95KSB7CisgICAg
ICAgICAgaXRlbS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICB0aGlz
LmlzRGVzdHJveWVkID0gdHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIENsZWFyIGVpdGhl
ciB0aGUgZW50aXJlIGNhY2hlIG9yIGp1c3QgdGhlIGNhY2hlIGZvciBhIHBhcnRpY3VsYXIga2V5
LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCByZXNldAorICAgICBAcGFyYW0ge1N0cmlu
Z30gZnVsbE5hbWUgb3B0aW9uYWwga2V5IHRvIHJlc2V0OyBpZiBtaXNzaW5nLCByZXNldHMgZXZl
cnl0aGluZworICAgICAqLworICAgIHJlc2V0OiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICByZXNldE1lbWJlcih0aGlzLCB0
aGlzLnJlZ2lzdHJ5Lm5vcm1hbGl6ZShmdWxsTmFtZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmVzZXRDYWNoZSh0aGlzKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgIFJl
dHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBvd25lciB0byBh
CisgICAgIG1hbnVhbGx5IGNyZWF0ZWQgaW5zdGFuY2UuCisgICAgICBAcHJpdmF0ZQorICAgICBA
bWV0aG9kIG93bmVySW5qZWN0aW9uCisgICAgIEByZXR1cm5zIHsgT2JqZWN0IH0KKyAgICAqLwor
ICAgIG93bmVySW5qZWN0aW9uOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlZjsKKworICAg
ICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltfY29udGFpbmVyT3duZXIuT1dORVJdID0gdGhpcy5v
d25lciwgX3JlZjsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gaXNTaW5nbGV0b24oY29udGFp
bmVyLCBmdWxsTmFtZSkgeworICAgIHJldHVybiBjb250YWluZXIucmVnaXN0cnkuZ2V0T3B0aW9u
KGZ1bGxOYW1lLCAnc2luZ2xldG9uJykgIT09IGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gbG9v
a3VwKGNvbnRhaW5lciwgZnVsbE5hbWUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5s
ZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRz
WzJdOworCisgICAgaWYgKG9wdGlvbnMuc291cmNlKSB7CisgICAgICBmdWxsTmFtZSA9IGNvbnRh
aW5lci5yZWdpc3RyeS5leHBhbmRMb2NhbExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucyk7CisKKyAg
ICAgIC8vIGlmIGV4cGFuZExvY2FsTG9va3VwIHJldHVybnMgZmFsc2V5LCB3ZSBkbyBub3Qgc3Vw
cG9ydCBsb2NhbCBsb29rdXAKKyAgICAgIGlmICghZnVsbE5hbWUpIHsKKyAgICAgICAgcmV0dXJu
OworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb250YWluZXIuY2FjaGVbZnVsbE5hbWVdICE9
PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zaW5nbGV0b24gIT09IGZhbHNlKSB7CisgICAgICByZXR1
cm4gY29udGFpbmVyLmNhY2hlW2Z1bGxOYW1lXTsKKyAgICB9CisKKyAgICB2YXIgdmFsdWUgPSBp
bnN0YW50aWF0ZShjb250YWluZXIsIGZ1bGxOYW1lKTsKKworICAgIGlmICh2YWx1ZSA9PT0gdW5k
ZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzU2luZ2xldG9uKGNv
bnRhaW5lciwgZnVsbE5hbWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBmYWxzZSkgeworICAg
ICAgY29udGFpbmVyLmNhY2hlW2Z1bGxOYW1lXSA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVy
biB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIG1hcmtJbmplY3Rpb25zQXNEeW5hbWljKGluamVj
dGlvbnMpIHsKKyAgICBpbmplY3Rpb25zLl9keW5hbWljID0gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGFyZUluamVjdGlvbnNEeW5hbWljKGluamVjdGlvbnMpIHsKKyAgICByZXR1cm4gISFpbmpl
Y3Rpb25zLl9keW5hbWljOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRJbmplY3Rpb25zKCkgLyog
Y29udGFpbmVyLCAuLi5pbmplY3Rpb25zICoveworICAgIHZhciBoYXNoID0ge307CisKKyAgICBp
ZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKyAgICAgIHZhciBjb250YWluZXIgPSBhcmd1bWVu
dHNbMF07CisgICAgICB2YXIgaW5qZWN0aW9ucyA9IFtdOworICAgICAgdmFyIGluamVjdGlvbjsK
KworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICAgIGlmIChhcmd1bWVudHNbaV0pIHsKKyAgICAgICAgICBpbmplY3Rpb25zID0g
aW5qZWN0aW9ucy5jb25jYXQoYXJndW1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorCisg
ICAgICBjb250YWluZXIucmVnaXN0cnkudmFsaWRhdGVJbmplY3Rpb25zKGluamVjdGlvbnMpOwor
CisgICAgICBmb3IgKGkgPSAwLCBsID0gaW5qZWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgICAgaW5qZWN0aW9uID0gaW5qZWN0aW9uc1tpXTsKKyAgICAgICAgaGFzaFtpbmplY3Rp
b24ucHJvcGVydHldID0gbG9va3VwKGNvbnRhaW5lciwgaW5qZWN0aW9uLmZ1bGxOYW1lKTsKKyAg
ICAgICAgaWYgKCFpc1NpbmdsZXRvbihjb250YWluZXIsIGluamVjdGlvbi5mdWxsTmFtZSkpIHsK
KyAgICAgICAgICBtYXJrSW5qZWN0aW9uc0FzRHluYW1pYyhoYXNoKTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgZnVuY3Rpb24gZmFjdG9y
eUZvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMu
bGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50
c1syXTsKKworICAgIHZhciByZWdpc3RyeSA9IGNvbnRhaW5lci5yZWdpc3RyeTsKKworICAgIGlm
IChvcHRpb25zLnNvdXJjZSkgeworICAgICAgZnVsbE5hbWUgPSByZWdpc3RyeS5leHBhbmRMb2Nh
bExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucyk7CisKKyAgICAgIC8vIGlmIGV4cGFuZExvY2FsTG9v
a3VwIHJldHVybnMgZmFsc2V5LCB3ZSBkbyBub3Qgc3VwcG9ydCBsb2NhbCBsb29rdXAKKyAgICAg
IGlmICghZnVsbE5hbWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAg
IHZhciBjYWNoZSA9IGNvbnRhaW5lci5mYWN0b3J5Q2FjaGU7CisgICAgaWYgKGNhY2hlW2Z1bGxO
YW1lXSkgeworICAgICAgcmV0dXJuIGNhY2hlW2Z1bGxOYW1lXTsKKyAgICB9CisgICAgdmFyIGZh
Y3RvcnkgPSByZWdpc3RyeS5yZXNvbHZlKGZ1bGxOYW1lKTsKKyAgICBpZiAoZmFjdG9yeSA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHR5cGUgPSBmdWxs
TmFtZS5zcGxpdCgnOicpWzBdOworICAgIGlmICghZmFjdG9yeSB8fCB0eXBlb2YgZmFjdG9yeS5l
eHRlbmQgIT09ICdmdW5jdGlvbicgfHwgIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1PREVMX0ZB
Q1RPUllfSU5KRUNUSU9OUyAmJiB0eXBlID09PSAnbW9kZWwnKSB7CisgICAgICBpZiAoZmFjdG9y
eSAmJiB0eXBlb2YgZmFjdG9yeS5fb25Mb29rdXAgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAg
ZmFjdG9yeS5fb25Mb29rdXAoZnVsbE5hbWUpOworICAgICAgfQorCisgICAgICAvLyBUT0RPOiB0
aGluayBhYm91dCBhICdzYWZlJyBtZXJnZSBzdHlsZSBleHRlbnNpb24KKyAgICAgIC8vIGZvciBu
b3cganVzdCBmYWxsYmFjayB0byBjcmVhdGUgdGltZSBpbmplY3Rpb24KKyAgICAgIGNhY2hlW2Z1
bGxOYW1lXSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9IGVsc2Ugewor
ICAgICAgdmFyIGluamVjdGlvbnMgPSBpbmplY3Rpb25zRm9yKGNvbnRhaW5lciwgZnVsbE5hbWUp
OworICAgICAgdmFyIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVjdGlvbnNGb3IoY29u
dGFpbmVyLCBmdWxsTmFtZSk7CisgICAgICB2YXIgY2FjaGVhYmxlID0gIWFyZUluamVjdGlvbnNE
eW5hbWljKGluamVjdGlvbnMpICYmICFhcmVJbmplY3Rpb25zRHluYW1pYyhmYWN0b3J5SW5qZWN0
aW9ucyk7CisKKyAgICAgIGZhY3RvcnlJbmplY3Rpb25zLl90b1N0cmluZyA9IHJlZ2lzdHJ5Lm1h
a2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7CisKKyAgICAgIHZhciBpbmplY3RlZEZhY3Rv
cnkgPSBmYWN0b3J5LmV4dGVuZChpbmplY3Rpb25zKTsKKworICAgICAgLy8gVE9ETyAtIHJlbW92
ZSBhbGwgYGNvbnRhaW5lcmAgaW5qZWN0aW9ucyB3aGVuIEVtYmVyIHJlYWNoZXMgdjMuMC4wCisg
ICAgICBpbmplY3REZXByZWNhdGVkQ29udGFpbmVyKGluamVjdGVkRmFjdG9yeS5wcm90b3R5cGUs
IGNvbnRhaW5lcik7CisgICAgICBpbmplY3RlZEZhY3RvcnkucmVvcGVuQ2xhc3MoZmFjdG9yeUlu
amVjdGlvbnMpOworCisgICAgICBpZiAoZmFjdG9yeSAmJiB0eXBlb2YgZmFjdG9yeS5fb25Mb29r
dXAgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgZmFjdG9yeS5fb25Mb29rdXAoZnVsbE5hbWUp
OworICAgICAgfQorCisgICAgICBpZiAoY2FjaGVhYmxlKSB7CisgICAgICAgIGNhY2hlW2Z1bGxO
YW1lXSA9IGluamVjdGVkRmFjdG9yeTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGluamVjdGVk
RmFjdG9yeTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbmplY3Rpb25zRm9yKGNvbnRhaW5l
ciwgZnVsbE5hbWUpIHsKKyAgICB2YXIgcmVnaXN0cnkgPSBjb250YWluZXIucmVnaXN0cnk7Cisg
ICAgdmFyIHNwbGl0TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCc6Jyk7CisgICAgdmFyIHR5cGUgPSBz
cGxpdE5hbWVbMF07CisKKyAgICB2YXIgaW5qZWN0aW9ucyA9IGJ1aWxkSW5qZWN0aW9ucyhjb250
YWluZXIsIHJlZ2lzdHJ5LmdldFR5cGVJbmplY3Rpb25zKHR5cGUpLCByZWdpc3RyeS5nZXRJbmpl
Y3Rpb25zKGZ1bGxOYW1lKSk7CisgICAgaW5qZWN0aW9ucy5fZGVidWdDb250YWluZXJLZXkgPSBm
dWxsTmFtZTsKKworICAgIF9jb250YWluZXJPd25lci5zZXRPd25lcihpbmplY3Rpb25zLCBjb250
YWluZXIub3duZXIpOworCisgICAgcmV0dXJuIGluamVjdGlvbnM7CisgIH0KKworICBmdW5jdGlv
biBmYWN0b3J5SW5qZWN0aW9uc0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIHJl
Z2lzdHJ5ID0gY29udGFpbmVyLnJlZ2lzdHJ5OworICAgIHZhciBzcGxpdE5hbWUgPSBmdWxsTmFt
ZS5zcGxpdCgnOicpOworICAgIHZhciB0eXBlID0gc3BsaXROYW1lWzBdOworCisgICAgdmFyIGZh
Y3RvcnlJbmplY3Rpb25zID0gYnVpbGRJbmplY3Rpb25zKGNvbnRhaW5lciwgcmVnaXN0cnkuZ2V0
RmFjdG9yeVR5cGVJbmplY3Rpb25zKHR5cGUpLCByZWdpc3RyeS5nZXRGYWN0b3J5SW5qZWN0aW9u
cyhmdWxsTmFtZSkpOworICAgIGZhY3RvcnlJbmplY3Rpb25zLl9kZWJ1Z0NvbnRhaW5lcktleSA9
IGZ1bGxOYW1lOworCisgICAgcmV0dXJuIGZhY3RvcnlJbmplY3Rpb25zOworICB9CisKKyAgZnVu
Y3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxsTmFtZSkgeworICAgIHZhciBmYWN0b3J5
ID0gZmFjdG9yeUZvcihjb250YWluZXIsIGZ1bGxOYW1lKTsKKyAgICB2YXIgbGF6eUluamVjdGlv
bnMsIHZhbGlkYXRpb25DYWNoZTsKKworICAgIGlmIChjb250YWluZXIucmVnaXN0cnkuZ2V0T3B0
aW9uKGZ1bGxOYW1lLCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHsKKyAgICAgIHJldHVybiBm
YWN0b3J5OworICAgIH0KKworICAgIGlmIChmYWN0b3J5KSB7CisgICAgICBpZiAodHlwZW9mIGZh
Y3RvcnkuY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcign
RmFpbGVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBcJycgKyBmdWxsTmFtZSArICdcJy4gJyAr
ICdNb3N0IGxpa2VseSBhbiBpbXByb3Blcmx5IGRlZmluZWQgY2xhc3Mgb3IgYW4gaW52YWxpZCBt
b2R1bGUgZXhwb3J0LicpOworICAgICAgfQorCisgICAgICB2YWxpZGF0aW9uQ2FjaGUgPSBjb250
YWluZXIudmFsaWRhdGlvbkNhY2hlOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLnJ1bkluRGVi
dWcoZnVuY3Rpb24gKCkgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgbGF6eSBpbmplY3Rp
b25zIGFyZSB2YWxpZCBhdCBpbnN0YW50aWF0aW9uIHRpbWUKKyAgICAgICAgaWYgKCF2YWxpZGF0
aW9uQ2FjaGVbZnVsbE5hbWVdICYmIHR5cGVvZiBmYWN0b3J5Ll9sYXp5SW5qZWN0aW9ucyA9PT0g
J2Z1bmN0aW9uJykgeworICAgICAgICAgIGxhenlJbmplY3Rpb25zID0gZmFjdG9yeS5fbGF6eUlu
amVjdGlvbnMoKTsKKyAgICAgICAgICBsYXp5SW5qZWN0aW9ucyA9IGNvbnRhaW5lci5yZWdpc3Ry
eS5ub3JtYWxpemVJbmplY3Rpb25zSGFzaChsYXp5SW5qZWN0aW9ucyk7CisKKyAgICAgICAgICBj
b250YWluZXIucmVnaXN0cnkudmFsaWRhdGVJbmplY3Rpb25zKGxhenlJbmplY3Rpb25zKTsKKyAg
ICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHZhbGlkYXRpb25DYWNoZVtmdWxsTmFtZV0gPSB0
cnVlOworCisgICAgICB2YXIgb2JqID0gdW5kZWZpbmVkOworCisgICAgICBpZiAodHlwZW9mIGZh
Y3RvcnkuZXh0ZW5kID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFj
dG9yeSB3YXMgZXh0ZW5kYWJsZSBhbmQgaXMgYWxyZWFkeSBpbmplY3RlZAorICAgICAgICBvYmog
PSBmYWN0b3J5LmNyZWF0ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gYXNzdW1lIHRo
ZSBmYWN0b3J5IHdhcyBleHRlbmRhYmxlCisgICAgICAgIC8vIHRvIGNyZWF0ZSB0aW1lIGluamVj
dGlvbnMKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBuZXcnaW5nIGZvciBpbnN0YW50aWF0aW9u
IGFuZCBtZXJnZSBpbmplY3Rpb25zIGZvciBwdXJlIEpTIEZ1bmN0aW9ucworICAgICAgICB2YXIg
aW5qZWN0aW9ucyA9IGluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSk7CisKKyAgICAg
ICAgLy8gRW5zdXJlIHRoYXQgYSBjb250YWluZXIgaXMgYXZhaWxhYmxlIHRvIGFuIG9iamVjdCBk
dXJpbmcgaW5zdGFudGlhdGlvbi4KKyAgICAgICAgLy8gVE9ETyAtIHJlbW92ZSB3aGVuIEVtYmVy
IHJlYWNoZXMgdjMuMC4wCisgICAgICAgIC8vIFRoaXMgImZha2UiIGNvbnRhaW5lciB3aWxsIGJl
IHJlcGxhY2VkIGFmdGVyIGluc3RhbnRpYXRpb24gd2l0aCBhCisgICAgICAgIC8vIHByb3BlcnR5
IHRoYXQgcmFpc2VzIGRlcHJlY2F0aW9ucyBldmVyeSB0aW1lIGl0IGlzIGFjY2Vzc2VkLgorICAg
ICAgICBpbmplY3Rpb25zLmNvbnRhaW5lciA9IGNvbnRhaW5lci5fZmFrZUNvbnRhaW5lclRvSW5q
ZWN0OworICAgICAgICBvYmogPSBmYWN0b3J5LmNyZWF0ZShpbmplY3Rpb25zKTsKKworICAgICAg
ICAvLyBUT0RPIC0gcmVtb3ZlIHdoZW4gRW1iZXIgcmVhY2hlcyB2My4wLjAKKyAgICAgICAgaWYg
KCFPYmplY3QuaXNGcm96ZW4ob2JqKSAmJiAnY29udGFpbmVyJyBpbiBvYmopIHsKKyAgICAgICAg
ICBpbmplY3REZXByZWNhdGVkQ29udGFpbmVyKG9iaiwgY29udGFpbmVyKTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICByZXR1cm4gb2JqOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8gLSBy
ZW1vdmUgd2hlbiBFbWJlciByZWFjaGVzIHYzLjAuMAorICBmdW5jdGlvbiBpbmplY3REZXByZWNh
dGVkQ29udGFpbmVyKG9iamVjdCwgY29udGFpbmVyKSB7CisgICAgT2JqZWN0LmRlZmluZVByb3Bl
cnR5KG9iamVjdCwgJ2NvbnRhaW5lcicsIHsKKyAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAg
ICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAg
IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyB0aGUgaW5qZWN0ZWQgYGNvbnRhaW5l
cmAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgYGdldE93bmVyYCBoZWxwZXIgaW5zdGVh
ZCB0byBhY2Nlc3MgdGhlIG93bmVyIG9mIHRoaXMgb2JqZWN0LicsIGZhbHNlLCB7IGlkOiAnZW1i
ZXItYXBwbGljYXRpb24uaW5qZWN0ZWQtY29udGFpbmVyJywgdW50aWw6ICczLjAuMCcsIHVybDog
J2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueCN0b2NfaW5qZWN0ZWQtY29udGFp
bmVyLWFjY2VzcycgfSk7CisgICAgICAgIHJldHVybiB0aGlzW0NPTlRBSU5FUl9PVkVSUklERV0g
fHwgY29udGFpbmVyOworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Byb3ZpZGluZyB0aGUgYGNvbnRh
aW5lcmAgcHJvcGVydHkgdG8gJyArIHRoaXMgKyAnIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ug
YEVtYmVyLnNldE93bmVyYCBvciBgb3duZXIub3duZXJJbmplY3Rpb24oKWAgaW5zdGVhZCB0byBw
cm92aWRlIGFuIG93bmVyIHRvIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkLicsIGZhbHNlLCB7
IGlkOiAnZW1iZXItYXBwbGljYXRpb24uaW5qZWN0ZWQtY29udGFpbmVyJywgdW50aWw6ICczLjAu
MCcsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueCN0b2NfaW5qZWN0
ZWQtY29udGFpbmVyLWFjY2VzcycgfSk7CisKKyAgICAgICAgdGhpc1tDT05UQUlORVJfT1ZFUlJJ
REVdID0gdmFsdWU7CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pOwor
ICB9CisKKyAgZnVuY3Rpb24gZWFjaERlc3Ryb3lhYmxlKGNvbnRhaW5lciwgY2FsbGJhY2spIHsK
KyAgICB2YXIgY2FjaGUgPSBjb250YWluZXIuY2FjaGU7CisgICAgdmFyIGtleXMgPSBPYmplY3Qu
a2V5cyhjYWNoZSk7CisgICAgdmFyIGtleSwgdmFsdWU7CisKKyAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBrZXkgPSBrZXlzW2ldOworICAg
ICAgdmFsdWUgPSBjYWNoZVtrZXldOworCisgICAgICBpZiAoY29udGFpbmVyLnJlZ2lzdHJ5Lmdl
dE9wdGlvbihrZXksICdpbnN0YW50aWF0ZScpICE9PSBmYWxzZSkgeworICAgICAgICBjYWxsYmFj
ayh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVzZXRDYWNoZShj
b250YWluZXIpIHsKKyAgICBlYWNoRGVzdHJveWFibGUoY29udGFpbmVyLCBmdW5jdGlvbiAodmFs
dWUpIHsKKyAgICAgIGlmICh2YWx1ZS5kZXN0cm95KSB7CisgICAgICAgIHZhbHVlLmRlc3Ryb3ko
KTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGNvbnRhaW5lci5jYWNoZS5kaWN0ID0gX2VtYmVy
TWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQobnVsbCk7CisgIH0KKworICBmdW5jdGlvbiByZXNldE1l
bWJlcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIG1lbWJlciA9IGNvbnRhaW5lci5j
YWNoZVtmdWxsTmFtZV07CisKKyAgICBkZWxldGUgY29udGFpbmVyLmZhY3RvcnlDYWNoZVtmdWxs
TmFtZV07CisKKyAgICBpZiAobWVtYmVyKSB7CisgICAgICBkZWxldGUgY29udGFpbmVyLmNhY2hl
W2Z1bGxOYW1lXTsKKworICAgICAgaWYgKG1lbWJlci5kZXN0cm95KSB7CisgICAgICAgIG1lbWJl
ci5kZXN0cm95KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
Q29udGFpbmVyOworfSk7CitlbmlmZWQoJ2NvbnRhaW5lci9pbmRleCcsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jb3JlJywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdjb250YWluZXIvY29udGFp
bmVyJywgJ2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxD
b3JlLCBfY29udGFpbmVyUmVnaXN0cnksIF9jb250YWluZXJDb250YWluZXIsIF9jb250YWluZXJP
d25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoKKyAgUHVibGljIEFQSSBmb3IgdGhlIGNv
bnRhaW5lciBpcyBzdGlsbCBpbiBmbHV4LgorICBUaGUgcHVibGljIEFQSSwgc3BlY2lmaWVkIG9u
IHRoZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhlIHN0YWJs
ZSBBUEkuCisgIC8vIEBtb2R1bGUgY29udGFpbmVyCisgICAgQHByaXZhdGUKKyAgKi8KKworICAv
KgorICAgRmxhZyB0byBlbmFibGUvZGlzYWJsZSBtb2RlbCBmYWN0b3J5IGluamVjdGlvbnMgKGRp
c2FibGVkIGJ5IGRlZmF1bHQpLgorICAgSWYgbW9kZWwgZmFjdG9yeSBpbmplY3Rpb25zIGFyZSBl
bmFibGVkLCBtb2RlbHMgc2hvdWxkIG5vdCBiZQorICAgYWNjZXNzZWQgZ2xvYmFsbHkgKG9ubHkg
dGhyb3VnaCBgY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOm1vZGVsTmFtZScpKWApOwor
ICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMg
PSBmYWxzZTsKKworICBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WICYmIHR5cGVvZiBf
ZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FTlYuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TICE9PSAn
dW5kZWZpbmVkJykgeworICAgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1PREVMX0ZBQ1RPUllf
SU5KRUNUSU9OUyA9ICEhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WLk1PREVMX0ZBQ1RPUllf
SU5KRUNUSU9OUzsKKyAgfQorCisgIGV4cG9ydHMuUmVnaXN0cnkgPSBfY29udGFpbmVyUmVnaXN0
cnkuZGVmYXVsdDsKKyAgZXhwb3J0cy5Db250YWluZXIgPSBfY29udGFpbmVyQ29udGFpbmVyLmRl
ZmF1bHQ7CisgIGV4cG9ydHMuZ2V0T3duZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXI7Cisg
IGV4cG9ydHMuc2V0T3duZXIgPSBfY29udGFpbmVyT3duZXIuc2V0T3duZXI7Cit9KTsKK2VuaWZl
ZCgnY29udGFpbmVyL293bmVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTeW1ib2wpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHMuZ2V0T3duZXIgPSBnZXRPd25lcjsKKyAgZXhwb3J0cy5zZXRPd25lciA9
IHNldE93bmVyOworICB2YXIgT1dORVIgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdPV05F
UicpOworCisgIGV4cG9ydHMuT1dORVIgPSBPV05FUjsKKyAgLyoqCisgICAgRnJhbWV3b3JrIG9i
amVjdHMgaW4gYW4gRW1iZXIgYXBwbGljYXRpb24gKGNvbXBvbmVudHMsIHNlcnZpY2VzLCByb3V0
ZXMsIGV0Yy4pCisgICAgYXJlIGNyZWF0ZWQgdmlhIGEgZmFjdG9yeSBhbmQgZGVwZW5kZW5jeSBp
bmplY3Rpb24gc3lzdGVtLiBFYWNoIG9mIHRoZXNlCisgICAgb2JqZWN0cyBpcyB0aGUgcmVzcG9u
c2liaWxpdHkgb2YgYW4gIm93bmVyIiwgd2hpY2ggaGFuZGxlZCBpdHMKKyAgICBpbnN0YW50aWF0
aW9uIGFuZCBtYW5hZ2VzIGl0cyBsaWZldGltZS4KKyAgCisgICAgYGdldE93bmVyYCBmZXRjaGVz
IHRoZSBvd25lciBvYmplY3QgcmVzcG9uc2libGUgZm9yIGFuIGluc3RhbmNlLiBUaGlzIGNhbgor
ICAgIGJlIHVzZWQgdG8gbG9va3VwIG9yIHJlc29sdmUgb3RoZXIgY2xhc3MgaW5zdGFuY2VzLCBv
ciByZWdpc3RlciBuZXcgZmFjdG9yaWVzCisgICAgaW50byB0aGUgb3duZXIuCisgIAorICAgIEZv
ciBleGFtcGxlLCB0aGlzIGNvbXBvbmVudCBkeW5hbWljYWxseSBsb29rcyB1cCBhIHNlcnZpY2Ug
YmFzZWQgb24gdGhlCisgICAgYGF1ZGlvVHlwZWAgcGFzc2VkIGFzIGFuIGF0dHJpYnV0ZToKKyAg
CisgICAgYGBgCisgICAgLy8gYXBwL2NvbXBvbmVudHMvcGxheS1hdWRpby5qcworICAgIGltcG9y
dCBFbWJlciBmcm9tICdlbWJlcic7CisgIAorICAgIC8vIFVzYWdlOgorICAgIC8vCisgICAgLy8g
ICB7e3BsYXktYXVkaW8gYXVkaW9UeXBlPW1vZGVsLmF1ZGlvVHlwZSBhdWRpb0ZpbGU9bW9kZWwu
ZmlsZX19CisgICAgLy8KKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0ZW5k
KHsKKyAgICAgIGF1ZGlvU2VydmljZTogRW1iZXIuY29tcHV0ZWQoJ2F1ZGlvVHlwZScsIGZ1bmN0
aW9uKCkgeworICAgICAgICBsZXQgb3duZXIgPSBFbWJlci5nZXRPd25lcih0aGlzKTsKKyAgICAg
ICAgcmV0dXJuIG93bmVyLmxvb2t1cChgc2VydmljZToke3RoaXMuZ2V0KCdhdWRpb1R5cGUnKX1g
KTsKKyAgICAgIH0pLAorICAgICAgY2xpY2soKSB7CisgICAgICAgIGxldCBwbGF5ZXIgPSB0aGlz
LmdldCgnYXVkaW9TZXJ2aWNlJyk7CisgICAgICAgIHBsYXllci5wbGF5KHRoaXMuZ2V0KCdhdWRp
b0ZpbGUnKSk7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZ2V0
T3duZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IEFuIG9iamVjdCB3aXRoIGFuIG93bmVy
LgorICAgIEByZXR1cm4ge09iamVjdH0gQW4gb3duZXIgb2JqZWN0LgorICAgIEBmb3IgRW1iZXIK
KyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZ2V0T3duZXIob2JqZWN0KSB7CisgICAg
cmV0dXJuIG9iamVjdFtPV05FUl07CisgIH0KKworICAvKioKKyAgICBgc2V0T3duZXJgIGZvcmNl
cyBhIG5ldyBvd25lciBvbiBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZS4gVGhpcyBpcyBwcmltYXJp
bHkKKyAgICB1c2VmdWwgaW4gc29tZSB0ZXN0aW5nIGNhc2VzLgorICAKKyAgICBAbWV0aG9kIHNl
dE93bmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBBbiBvYmplY3Qgd2l0aCBhbiBvd25l
ci4KKyAgICBAcmV0dXJuIHtPYmplY3R9IEFuIG93bmVyIG9iamVjdC4KKyAgICBAZm9yIEVtYmVy
CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNldE93bmVyKG9iamVjdCwgb3duZXIp
IHsKKyAgICBvYmplY3RbT1dORVJdID0gb3duZXI7CisgIH0KK30pOworZW5pZmVkKCdjb250YWlu
ZXIvcmVnaXN0cnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXIt
bWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZGljdGlvbmFyeScsICdlbWJlci1tZXRhbC9lbXB0
eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2NvbnRhaW5lci9jb250YWluZXInLCAn
ZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVy
ZXMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRGljdGlvbmFyeSwgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QsIF9lbWJlck1ldGFsQXNzaWduLCBfY29udGFpbmVyQ29udGFpbmVyLCBfZW1i
ZXJNZXRhbFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnByaXZhdGl6ZSA9
IHByaXZhdGl6ZTsKKworICB2YXIgVkFMSURfRlVMTF9OQU1FX1JFR0VYUCA9IC9eW146XSs6W146
XSskLzsKKworICAvKioKKyAgIEEgcmVnaXN0cnkgdXNlZCB0byBzdG9yZSBmYWN0b3J5IGFuZCBv
cHRpb24gaW5mb3JtYXRpb24ga2V5ZWQKKyAgIGJ5IHR5cGUuCisgIAorICAgQSBgUmVnaXN0cnlg
IHN0b3JlcyB0aGUgZmFjdG9yeSBhbmQgb3B0aW9uIGluZm9ybWF0aW9uIG5lZWRlZCBieSBhCisg
ICBgQ29udGFpbmVyYCB0byBpbnN0YW50aWF0ZSBhbmQgY2FjaGUgb2JqZWN0cy4KKyAgCisgICBU
aGUgQVBJIGZvciBgUmVnaXN0cnlgIGlzIHN0aWxsIGluIGZsdXggYW5kIHNob3VsZCBub3QgYmUg
Y29uc2lkZXJlZCBzdGFibGUuCisgIAorICAgQHByaXZhdGUKKyAgIEBjbGFzcyBSZWdpc3RyeQor
ICAgQHNpbmNlIDEuMTEuMAorICAqLworICBmdW5jdGlvbiBSZWdpc3RyeShvcHRpb25zKSB7Cisg
ICAgdGhpcy5mYWxsYmFjayA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mYWxsYmFjayA/IG9wdGlvbnMu
ZmFsbGJhY2sgOiBudWxsOworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXNvbHZlcikg
eworICAgICAgdGhpcy5yZXNvbHZlciA9IG9wdGlvbnMucmVzb2x2ZXI7CisKKyAgICAgIGlmICh0
eXBlb2YgdGhpcy5yZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBkZXByZWNhdGVS
ZXNvbHZlckZ1bmN0aW9uKHRoaXMpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMucmVnaXN0
cmF0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG9wdGlvbnMgJiYgb3B0aW9u
cy5yZWdpc3RyYXRpb25zID8gb3B0aW9ucy5yZWdpc3RyYXRpb25zIDogbnVsbCk7CisKKyAgICB0
aGlzLl90eXBlSW5qZWN0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwp
OworICAgIHRoaXMuX2luamVjdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChu
dWxsKTsKKyAgICB0aGlzLl9mYWN0b3J5VHlwZUluamVjdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rp
b25hcnkuZGVmYXVsdChudWxsKTsKKyAgICB0aGlzLl9mYWN0b3J5SW5qZWN0aW9ucyA9IF9lbWJl
ck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwpOworCisgICAgdGhpcy5fbG9jYWxMb29rdXBD
YWNoZSA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgdGhpcy5f
bm9ybWFsaXplQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAg
ICB0aGlzLl9yZXNvbHZlQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxs
KTsKKyAgICB0aGlzLl9mYWlsQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChu
dWxsKTsKKworICAgIHRoaXMuX29wdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVs
dChudWxsKTsKKyAgICB0aGlzLl90eXBlT3B0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5k
ZWZhdWx0KG51bGwpOworICB9CisKKyAgUmVnaXN0cnkucHJvdG90eXBlID0geworICAgIC8qKgor
ICAgICBBIGJhY2t1cCByZWdpc3RyeSBmb3IgcmVzb2x2aW5nIHJlZ2lzdHJhdGlvbnMgd2hlbiBu
byBtYXRjaGVzIGNhbiBiZSBmb3VuZC4KKyAgICAgIEBwcml2YXRlCisgICAgIEBwcm9wZXJ0eSBm
YWxsYmFjaworICAgICBAdHlwZSBSZWdpc3RyeQorICAgICAqLworICAgIGZhbGxiYWNrOiBudWxs
LAorCisgICAgLyoqCisgICAgIEFuIG9iamVjdCB0aGF0IGhhcyBhIGByZXNvbHZlYCBtZXRob2Qg
dGhhdCByZXNvbHZlcyBhIG5hbWUuCisgICAgICBAcHJpdmF0ZQorICAgICBAcHJvcGVydHkgcmVz
b2x2ZXIKKyAgICAgQHR5cGUgUmVzb2x2ZXIKKyAgICAgKi8KKyAgICByZXNvbHZlcjogbnVsbCwK
KworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICBAcHJvcGVydHkgcmVnaXN0cmF0aW9ucwor
ICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAqLworICAgIHJlZ2lzdHJhdGlvbnM6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfdHlwZUluamVj
dGlvbnMKKyAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfdHlwZUluamVj
dGlvbnM6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBf
aW5qZWN0aW9ucworICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAqLworICAgIF9pbmpl
Y3Rpb25zOiBudWxsLAorCisgICAgLyoqCisgICAgIEBwcml2YXRlCisgICAgICBAcHJvcGVydHkg
X2ZhY3RvcnlUeXBlSW5qZWN0aW9ucworICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAq
LworICAgIF9mYWN0b3J5VHlwZUluamVjdGlvbnM6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHBy
aXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfZmFjdG9yeUluamVjdGlvbnMKKyAgICAgQHR5cGUgSW5o
ZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfZmFjdG9yeUluamVjdGlvbnM6IG51bGwsCisKKyAg
ICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfbm9ybWFsaXplQ2FjaGUKKyAg
ICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfbm9ybWFsaXplQ2FjaGU6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfcmVzb2x2ZUNh
Y2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0CisgICAgICovCisgICAgX3Jlc29sdmVDYWNo
ZTogbnVsbCwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICAgQHByb3BlcnR5IF9vcHRp
b25zCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0CisgICAgICovCisgICAgX29wdGlvbnM6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfdHlwZU9wdGlv
bnMKKyAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfdHlwZU9wdGlvbnM6
IG51bGwsCisKKyAgICAvKioKKyAgICAgQ3JlYXRlcyBhIGNvbnRhaW5lciBiYXNlZCBvbiB0aGlz
IHJlZ2lzdHJ5LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBjb250YWluZXIKKyAgICAg
QHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgQHJldHVybiB7Q29udGFpbmVyfSBjcmVhdGVk
IGNvbnRhaW5lcgorICAgICAqLworICAgIGNvbnRhaW5lcjogZnVuY3Rpb24gKG9wdGlvbnMpIHsK
KyAgICAgIHJldHVybiBuZXcgX2NvbnRhaW5lckNvbnRhaW5lci5kZWZhdWx0KHRoaXMsIG9wdGlv
bnMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXJzIGEgZmFjdG9yeSBmb3IgbGF0
ZXIgaW5qZWN0aW9uLgorICAgICAgRXhhbXBsZToKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
dmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgICByZWdpc3RyeS5yZWdpc3Rlcign
bW9kZWw6dXNlcicsIFBlcnNvbiwge3NpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdmcnVpdDpmYXZvcml0ZScsIE9yYW5nZSk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lz
dGVyKCdjb21tdW5pY2F0aW9uOm1haW4nLCBFbWFpbCwge3NpbmdsZXRvbjogZmFsc2V9KTsKKyAg
ICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIHJlZ2lzdGVyCisgICAgIEBwYXJh
bSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmYWN0b3J5CisgICAg
IEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXI6IGZ1bmN0aW9u
IChmdWxsTmFtZSwgZmFjdG9yeSkgeworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVu
Z3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sy
XTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBw
cm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisKKyAg
ICAgIGlmIChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcignQXR0ZW1wdGluZyB0byByZWdpc3RlciBhbiB1bmtub3duIGZhY3Rvcnk6IGAnICsgZnVs
bE5hbWUgKyAnYCcpOworICAgICAgfQorCisgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlz
Lm5vcm1hbGl6ZShmdWxsTmFtZSk7CisKKyAgICAgIGlmICh0aGlzLl9yZXNvbHZlQ2FjaGVbbm9y
bWFsaXplZE5hbWVdKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlLXJlZ2lz
dGVyOiBgJyArIGZ1bGxOYW1lICsgJ2AsIGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQu
Jyk7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSB0aGlzLl9mYWlsQ2FjaGVbbm9ybWFsaXplZE5h
bWVdOworICAgICAgdGhpcy5yZWdpc3RyYXRpb25zW25vcm1hbGl6ZWROYW1lXSA9IGZhY3Rvcnk7
CisgICAgICB0aGlzLl9vcHRpb25zW25vcm1hbGl6ZWROYW1lXSA9IG9wdGlvbnM7CisgICAgfSwK
KworICAgIC8qKgorICAgICBVbnJlZ2lzdGVyIGEgZnVsbE5hbWUKKyAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHJlZ2lzdHJ5LnJl
Z2lzdGVyKCdtb2RlbDp1c2VyJywgVXNlcik7CisgICAgICByZWdpc3RyeS5yZXNvbHZlKCdtb2Rl
bDp1c2VyJykuY3JlYXRlKCkgaW5zdGFuY2VvZiBVc2VyIC8vPT4gdHJ1ZQorICAgICAgcmVnaXN0
cnkudW5yZWdpc3RlcignbW9kZWw6dXNlcicpCisgICAgIHJlZ2lzdHJ5LnJlc29sdmUoJ21vZGVs
OnVzZXInKSA9PT0gdW5kZWZpbmVkIC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIEBwcml2YXRl
CisgICAgIEBtZXRob2QgdW5yZWdpc3RlcgorICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUK
KyAgICAgKi8KKyAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdmdWxsTmFtZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFt
ZScsIHRoaXMudmFsaWRhdGVGdWxsTmFtZShmdWxsTmFtZSkpOworCisgICAgICB2YXIgbm9ybWFs
aXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisKKyAgICAgIHRoaXMuX2xvY2Fs
TG9va3VwQ2FjaGUgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworCisg
ICAgICBkZWxldGUgdGhpcy5yZWdpc3RyYXRpb25zW25vcm1hbGl6ZWROYW1lXTsKKyAgICAgIGRl
bGV0ZSB0aGlzLl9yZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdOworICAgICAgZGVsZXRlIHRo
aXMuX2ZhaWxDYWNoZVtub3JtYWxpemVkTmFtZV07CisgICAgICBkZWxldGUgdGhpcy5fb3B0aW9u
c1tub3JtYWxpemVkTmFtZV07CisgICAgfSwKKworICAgIC8qKgorICAgICBHaXZlbiBhIGZ1bGxO
YW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQnkgZGVmYXVsdCBg
cmVzb2x2ZWAgd2lsbCByZXRyaWV2ZSB0aGUgZmFjdG9yeSBmcm9tCisgICAgIHRoZSByZWdpc3Ry
eS4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5
KCk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOworICAg
ICAgcmVnaXN0cnkucmVzb2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0dGVyCisgICAgIGBg
YAorICAgICAgT3B0aW9uYWxseSB0aGUgcmVnaXN0cnkgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBj
dXN0b20gcmVzb2x2ZXIuCisgICAgIElmIHByb3ZpZGVkLCBgcmVzb2x2ZWAgd2lsbCBmaXJzdCBw
cm92aWRlIHRoZSBjdXN0b20gcmVzb2x2ZXIKKyAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIHJlc29s
dmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjaworICAgICB0byB0aGUg
cmVnaXN0cnkuCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5ldyBS
ZWdpc3RyeSgpOworICAgICByZWdpc3RyeS5yZXNvbHZlciA9IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7
CisgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBzeXN0ZW0gb2YgY2hvaWNlCisgICAg
ICB9OworICAgICAgLy8gdGhlIHR3aXR0ZXIgZmFjdG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxl
IHN5c3RlbQorICAgICByZWdpc3RyeS5yZXNvbHZlKCdhcGk6dHdpdHRlcicpIC8vID0+IFR3aXR0
ZXIKKyAgICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIHJlc29sdmUKKyAgICAg
QHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10K
KyAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNvdXJjZV0gdGhlIGZ1bGxuYW1lIG9mIHRo
ZSByZXF1ZXN0IHNvdXJjZSAodXNlZCBmb3IgbG9jYWwgbG9va3VwcykKKyAgICAgQHJldHVybiB7
RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9yeQorICAgICAqLworICAgIHJlc29sdmU6IGZ1bmN0
aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQo
J2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0ZUZ1bGxO
YW1lKGZ1bGxOYW1lKSk7CisgICAgICB2YXIgZmFjdG9yeSA9IHJlc29sdmUodGhpcywgdGhpcy5u
b3JtYWxpemUoZnVsbE5hbWUpLCBvcHRpb25zKTsKKyAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRl
ZmluZWQgJiYgdGhpcy5mYWxsYmFjaykgeworICAgICAgICB2YXIgX2ZhbGxiYWNrOworCisgICAg
ICAgIGZhY3RvcnkgPSAoX2ZhbGxiYWNrID0gdGhpcy5mYWxsYmFjaykucmVzb2x2ZS5hcHBseShf
ZmFsbGJhY2ssIGFyZ3VtZW50cyk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFjdG9yeTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgIEEgaG9vayB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJl
IGhvdyB0aGUgcmVzb2x2ZXIgd2lsbAorICAgICBhdHRlbXB0IHRvIGZpbmQgdGhlIGZhY3Rvcnku
CisgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgRW1iZXIgYC5kZXNjcmliZWAgcmV0dXJu
cyB0aGUgZnVsbAorICAgICBjbGFzcyBuYW1lIChpbmNsdWRpbmcgbmFtZXNwYWNlKSB3aGVyZSBF
bWJlcidzIHJlc29sdmVyIGV4cGVjdHMKKyAgICAgdG8gZmluZCB0aGUgYGZ1bGxOYW1lYC4KKyAg
ICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgZGVzY3JpYmUKKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge3N0cmluZ30gZGVzY3JpYmVkIGZ1bGxOYW1lCisgICAg
ICovCisgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgaWYgKHRoaXMu
cmVzb2x2ZXIgJiYgdGhpcy5yZXNvbHZlci5sb29rdXBEZXNjcmlwdGlvbikgeworICAgICAgICBy
ZXR1cm4gdGhpcy5yZXNvbHZlci5sb29rdXBEZXNjcmlwdGlvbihmdWxsTmFtZSk7CisgICAgICB9
IGVsc2UgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmFsbGJhY2su
ZGVzY3JpYmUoZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxO
YW1lOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgQSBob29rIHRvIGVuYWJsZSBj
dXN0b20gZnVsbE5hbWUgbm9ybWFsaXphdGlvbiBiZWhhdmlvdXIKKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2Qgbm9ybWFsaXplRnVsbE5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxO
YW1lCisgICAgIEByZXR1cm4ge3N0cmluZ30gbm9ybWFsaXplZCBmdWxsTmFtZQorICAgICAqLwor
ICAgIG5vcm1hbGl6ZUZ1bGxOYW1lOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIGlmICh0
aGlzLnJlc29sdmVyICYmIHRoaXMucmVzb2x2ZXIubm9ybWFsaXplKSB7CisgICAgICAgIHJldHVy
biB0aGlzLnJlc29sdmVyLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB9IGVsc2UgaWYgKHRo
aXMuZmFsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmFsbGJhY2subm9ybWFsaXplRnVs
bE5hbWUoZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxOYW1l
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgTm9ybWFsaXplIGEgZnVsbE5hbWUg
YmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgY29udmVudGlvbnMKKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2Qgbm9ybWFsaXplCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAg
ICBAcmV0dXJuIHtzdHJpbmd9IG5vcm1hbGl6ZWQgZnVsbE5hbWUKKyAgICAgKi8KKyAgICBub3Jt
YWxpemU6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6
ZUNhY2hlW2Z1bGxOYW1lXSB8fCAodGhpcy5fbm9ybWFsaXplQ2FjaGVbZnVsbE5hbWVdID0gdGhp
cy5ub3JtYWxpemVGdWxsTmFtZShmdWxsTmFtZSkpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
QG1ldGhvZCBtYWtlVG9TdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgIEBwYXJhbSB7YW55fSBm
YWN0b3J5CisgICAgIEBwYXJhbSB7c3RyaW5nfSBmdWxsTmFtZQorICAgICBAcmV0dXJuIHtmdW5j
dGlvbn0gdG9TdHJpbmcgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBtYWtlVG9TdHJpbmc6IGZ1bmN0
aW9uIChmYWN0b3J5LCBmdWxsTmFtZSkgeworICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiYgdGhp
cy5yZXNvbHZlci5tYWtlVG9TdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXIu
bWFrZVRvU3RyaW5nKGZhY3RvcnksIGZ1bGxOYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5m
YWxsYmFjaykgeworICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFjay5tYWtlVG9TdHJpbmcoZmFj
dG9yeSwgZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnku
dG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgIEdpdmVuIGEgZnVs
bE5hbWUgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBhd2FyZSBvZiBpdHMgZmFjdG9yeQorICAg
ICBvciBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIGhh
cworICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IFtv
cHRpb25zXQorICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc291cmNlXSB0aGUgZnVsbG5h
bWUgb2YgdGhlIHJlcXVlc3Qgc291cmNlICh1c2VkIGZvciBsb2NhbCBsb29rdXBzKQorICAgICBA
cmV0dXJuIHtCb29sZWFufQorICAgICAqLworICAgIGhhczogZnVuY3Rpb24gKGZ1bGxOYW1lLCBv
cHRpb25zKSB7CisgICAgICBpZiAoIXRoaXMuaXNWYWxpZEZ1bGxOYW1lKGZ1bGxOYW1lKSkgewor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciBzb3VyY2UgPSB1bmRl
ZmluZWQ7CisKKyAgICAgIHNvdXJjZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zb3VyY2UgJiYgdGhp
cy5ub3JtYWxpemUob3B0aW9ucy5zb3VyY2UpOworCisgICAgICByZXR1cm4gaGFzKHRoaXMsIHRo
aXMubm9ybWFsaXplKGZ1bGxOYW1lKSwgc291cmNlKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
IEFsbG93IHJlZ2lzdGVyaW5nIG9wdGlvbnMgZm9yIGFsbCBmYWN0b3JpZXMgb2YgYSB0eXBlLgor
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsK
KyAgICAgdmFyIGNvbnRhaW5lciA9IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgLy8gaWYg
YWxsIG9mIHR5cGUgYGNvbm5lY3Rpb25gIG11c3Qgbm90IGJlIHNpbmdsZXRvbnMKKyAgICAgcmVn
aXN0cnkub3B0aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7
CisgICAgICByZWdpc3RyeS5yZWdpc3RlcignY29ubmVjdGlvbjp0d2l0dGVyJywgVHdpdHRlckNv
bm5lY3Rpb24pOworICAgICByZWdpc3RyeS5yZWdpc3RlcignY29ubmVjdGlvbjpmYWNlYm9vaycs
IEZhY2Vib29rQ29ubmVjdGlvbik7CisgICAgICB2YXIgdHdpdHRlciA9IGNvbnRhaW5lci5sb29r
dXAoJ2Nvbm5lY3Rpb246dHdpdHRlcicpOworICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIu
bG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsKKyAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIy
OyAvLyA9PiBmYWxzZQorICAgICAgdmFyIGZhY2Vib29rID0gY29udGFpbmVyLmxvb2t1cCgnY29u
bmVjdGlvbjpmYWNlYm9vaycpOworICAgICB2YXIgZmFjZWJvb2syID0gY29udGFpbmVyLmxvb2t1
cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOworICAgICAgZmFjZWJvb2sgPT09IGZhY2Vib29rMjsg
Ly8gPT4gZmFsc2UKKyAgICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIG9wdGlv
bnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgIEBwYXJhbSB7T2JqZWN0
fSBvcHRpb25zCisgICAgICovCisgICAgb3B0aW9uc0ZvclR5cGU6IGZ1bmN0aW9uICh0eXBlLCBv
cHRpb25zKSB7CisgICAgICB0aGlzLl90eXBlT3B0aW9uc1t0eXBlXSA9IG9wdGlvbnM7CisgICAg
fSwKKworICAgIGdldE9wdGlvbnNGb3JUeXBlOiBmdW5jdGlvbiAodHlwZSkgeworICAgICAgdmFy
IG9wdGlvbnNGb3JUeXBlID0gdGhpcy5fdHlwZU9wdGlvbnNbdHlwZV07CisgICAgICBpZiAob3B0
aW9uc0ZvclR5cGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIG9w
dGlvbnNGb3JUeXBlID0gdGhpcy5mYWxsYmFjay5nZXRPcHRpb25zRm9yVHlwZSh0eXBlKTsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiBvcHRpb25zRm9yVHlwZTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgIEBwcml2YXRlCisgICAgIEBtZXRob2Qgb3B0aW9ucworICAgICBAcGFyYW0ge1N0cmluZ30g
ZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgKi8KKyAgICBvcHRp
b25zOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRz
Lmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVu
dHNbMV07CisKKyAgICAgIHZhciBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxO
YW1lKTsKKyAgICAgIHRoaXMuX29wdGlvbnNbbm9ybWFsaXplZE5hbWVdID0gb3B0aW9uczsKKyAg
ICB9LAorCisgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICB2YXIg
bm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB2YXIgb3B0
aW9ucyA9IHRoaXMuX29wdGlvbnNbbm9ybWFsaXplZE5hbWVdOworICAgICAgaWYgKG9wdGlvbnMg
PT09IHVuZGVmaW5lZCAmJiB0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIG9wdGlvbnMgPSB0aGlz
LmZhbGxiYWNrLmdldE9wdGlvbnMoZnVsbE5hbWUpOworICAgICAgfQorICAgICAgcmV0dXJuIG9w
dGlvbnM7CisgICAgfSwKKworICAgIGdldE9wdGlvbjogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRp
b25OYW1lKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbZnVsbE5hbWVdOwor
CisgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zW29wdGlvbk5hbWVdICE9PSB1bmRlZmluZWQp
IHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV07CisgICAgICB9CisKKyAgICAg
IHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoJzonKVswXTsKKyAgICAgIG9wdGlvbnMgPSB0aGlz
Ll90eXBlT3B0aW9uc1t0eXBlXTsKKworICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRp
b25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5h
bWVdOworICAgICAgfSBlbHNlIGlmICh0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiB0
aGlzLmZhbGxiYWNrLmdldE9wdGlvbihmdWxsTmFtZSwgb3B0aW9uTmFtZSk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIC8qKgorICAgICBVc2VkIG9ubHkgdmlhIGBpbmplY3Rpb25gLgorICAgICAg
UHJvdmlkZXMgYSBzcGVjaWFsaXplZCBmb3JtIG9mIGluamVjdGlvbiwgc3BlY2lmaWNhbGx5IGVu
YWJsaW5nCisgICAgIGFsbCBvYmplY3RzIG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGgg
YSByZWZlcmVuY2UgdG8gYW5vdGhlcgorICAgICBvYmplY3QuCisgICAgICBGb3IgZXhhbXBsZSwg
cHJvdmlkZWQgZWFjaCBvYmplY3Qgb2YgdHlwZSBgY29udHJvbGxlcmAgbmVlZGVkIGEgYHJvdXRl
cmAuCisgICAgIG9uZSB3b3VsZCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgYGBgamF2YXNjcmlw
dAorICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgdmFyIGNvbnRhaW5l
ciA9IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JvdXRl
cjptYWluJywgUm91dGVyKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6dXNl
cicsIFVzZXJDb250cm9sbGVyKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6
cG9zdCcsIFBvc3RDb250cm9sbGVyKTsKKyAgICAgIHJlZ2lzdHJ5LnR5cGVJbmplY3Rpb24oJ2Nv
bnRyb2xsZXInLCAncm91dGVyJywgJ3JvdXRlcjptYWluJyk7CisgICAgICB2YXIgdXNlciA9IGNv
bnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6dXNlcicpOworICAgICB2YXIgcG9zdCA9IGNvbnRh
aW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6cG9zdCcpOworICAgICAgdXNlci5yb3V0ZXIgaW5zdGFu
Y2VvZiBSb3V0ZXI7IC8vPT4gdHJ1ZQorICAgICBwb3N0LnJvdXRlciBpbnN0YW5jZW9mIFJvdXRl
cjsgLy89PiB0cnVlCisgICAgICAvLyBib3RoIGNvbnRyb2xsZXJzIHNoYXJlIHRoZSBzYW1lIHJv
dXRlcgorICAgICB1c2VyLnJvdXRlciA9PT0gcG9zdC5yb3V0ZXI7IC8vPT4gdHJ1ZQorICAgICBg
YGAKKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgdHlwZUluamVjdGlvbgorICAgICBAcGFy
YW0ge1N0cmluZ30gdHlwZQorICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgICovCisgICAgdHlwZUluamVjdGlvbjogZnVuY3Rp
b24gKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0
ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisKKyAgICAgIHZhciBmdWxsTmFtZVR5cGUgPSBmdWxsTmFt
ZS5zcGxpdCgnOicpWzBdOworICAgICAgaWYgKGZ1bGxOYW1lVHlwZSA9PT0gdHlwZSkgeworICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmplY3QgYSBgJyArIGZ1bGxOYW1lICsgJ2Ag
b24gb3RoZXIgJyArIHR5cGUgKyAnKHMpLicpOworICAgICAgfQorCisgICAgICB2YXIgaW5qZWN0
aW9ucyA9IHRoaXMuX3R5cGVJbmplY3Rpb25zW3R5cGVdIHx8ICh0aGlzLl90eXBlSW5qZWN0aW9u
c1t0eXBlXSA9IFtdKTsKKworICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVy
dHk6IHByb3BlcnR5LAorICAgICAgICBmdWxsTmFtZTogZnVsbE5hbWUKKyAgICAgIH0pOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgRGVmaW5lcyBpbmplY3Rpb24gcnVsZXMuCisgICAgICBUaGVz
ZSBydWxlcyBhcmUgdXNlZCB0byBpbmplY3QgZGVwZW5kZW5jaWVzIG9udG8gb2JqZWN0cyB3aGVu
IHRoZXkKKyAgICAgYXJlIGluc3RhbnRpYXRlZC4KKyAgICAgIFR3byBmb3JtcyBvZiBpbmplY3Rp
b25zIGFyZSBwb3NzaWJsZToKKyAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90
aGVyIGZ1bGxOYW1lCisgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhIHR5cGUKKyAg
ICAgIEV4YW1wbGU6CisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5l
dyBSZWdpc3RyeSgpOworICAgICB2YXIgY29udGFpbmVyID0gcmVnaXN0cnkuY29udGFpbmVyKCk7
CisgICAgICByZWdpc3RyeS5yZWdpc3Rlcignc291cmNlOm1haW4nLCBTb3VyY2UpOworICAgICBy
ZWdpc3RyeS5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOworICAgICByZWdpc3RyeS5yZWdp
c3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOworICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFt
ZSBvbiBhbm90aGVyIGZ1bGxOYW1lCisgICAgIC8vIGVnLiBlYWNoIHVzZXIgbW9kZWwgZ2V0cyBh
IHBvc3QgbW9kZWwKKyAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdtb2RlbDp1c2VyJywgJ3Bvc3Qn
LCAnbW9kZWw6cG9zdCcpOworICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90
aGVyIHR5cGUKKyAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdtb2RlbCcsICdzb3VyY2UnLCAnc291
cmNlOm1haW4nKTsKKyAgICAgIHZhciB1c2VyID0gY29udGFpbmVyLmxvb2t1cCgnbW9kZWw6dXNl
cicpOworICAgICB2YXIgcG9zdCA9IGNvbnRhaW5lci5sb29rdXAoJ21vZGVsOnBvc3QnKTsKKyAg
ICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2YgU291cmNlOyAvLz0+IHRydWUKKyAgICAgcG9zdC5z
b3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQorICAgICAgdXNlci5wb3N0IGluc3Rh
bmNlb2YgUG9zdDsgLy89PiB0cnVlCisgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUgdGhl
IHNhbWUgc291cmNlCisgICAgIHVzZXIuc291cmNlID09PSBwb3N0LnNvdXJjZTsgLy89PiB0cnVl
CisgICAgIGBgYAorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBpbmplY3Rpb24KKyAgICAg
QHBhcmFtIHtTdHJpbmd9IGZhY3RvcnlOYW1lCisgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0
eQorICAgICBAcGFyYW0ge1N0cmluZ30gaW5qZWN0aW9uTmFtZQorICAgICAqLworICAgIGluamVj
dGlvbjogZnVuY3Rpb24gKGZ1bGxOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSkgeworICAg
ICAgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGluamVjdGlvbk5hbWUpOworICAgICAgdmFyIG5vcm1h
bGl6ZWRJbmplY3Rpb25OYW1lID0gdGhpcy5ub3JtYWxpemUoaW5qZWN0aW9uTmFtZSk7CisKKyAg
ICAgIGlmIChmdWxsTmFtZS5pbmRleE9mKCc6JykgPT09IC0xKSB7CisgICAgICAgIHJldHVybiB0
aGlzLnR5cGVJbmplY3Rpb24oZnVsbE5hbWUsIHByb3BlcnR5LCBub3JtYWxpemVkSW5qZWN0aW9u
TmFtZSk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdmdWxsTmFt
ZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRhdGVGdWxsTmFtZShmdWxs
TmFtZSkpOworICAgICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemUoZnVsbE5h
bWUpOworCisgICAgICB2YXIgaW5qZWN0aW9ucyA9IHRoaXMuX2luamVjdGlvbnNbbm9ybWFsaXpl
ZE5hbWVdIHx8ICh0aGlzLl9pbmplY3Rpb25zW25vcm1hbGl6ZWROYW1lXSA9IFtdKTsKKworICAg
ICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LAorICAgICAg
ICBmdWxsTmFtZTogbm9ybWFsaXplZEluamVjdGlvbk5hbWUKKyAgICAgIH0pOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgVXNlZCBvbmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCisgICAgICBQ
cm92aWRlcyBhIHNwZWNpYWxpemVkIGZvcm0gb2YgaW5qZWN0aW9uLCBzcGVjaWZpY2FsbHkgZW5h
YmxpbmcKKyAgICAgYWxsIGZhY3Rvcnkgb2Ygb25lIHR5cGUgdG8gYmUgaW5qZWN0ZWQgd2l0aCBh
IHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgIG9iamVjdC4KKyAgICAgIEZvciBleGFtcGxlLCBw
cm92aWRlZCBlYWNoIGZhY3Rvcnkgb2YgdHlwZSBgbW9kZWxgIG5lZWRlZCBhIGBzdG9yZWAuCisg
ICAgIG9uZSB3b3VsZCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVy
KCdzdG9yZTptYWluJywgU29tZVN0b3JlKTsKKyAgICAgIHJlZ2lzdHJ5LmZhY3RvcnlUeXBlSW5q
ZWN0aW9uKCdtb2RlbCcsICdzdG9yZScsICdzdG9yZTptYWluJyk7CisgICAgICB2YXIgc3RvcmUg
PSByZWdpc3RyeS5sb29rdXAoJ3N0b3JlOm1haW4nKTsKKyAgICAgdmFyIFVzZXJGYWN0b3J5ID0g
cmVnaXN0cnkubG9va3VwRmFjdG9yeSgnbW9kZWw6dXNlcicpOworICAgICAgVXNlckZhY3Rvcnku
c3RvcmUgaW5zdGFuY2VvZiBTb21lU3RvcmU7IC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIEBw
cml2YXRlCisgICAgIEBtZXRob2QgZmFjdG9yeVR5cGVJbmplY3Rpb24KKyAgICAgQHBhcmFtIHtT
dHJpbmd9IHR5cGUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5CisgICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZQorICAgICAqLworICAgIGZhY3RvcnlUeXBlSW5qZWN0aW9uOiBmdW5j
dGlvbiAodHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKSB7CisgICAgICB2YXIgaW5qZWN0aW9ucyA9
IHRoaXMuX2ZhY3RvcnlUeXBlSW5qZWN0aW9uc1t0eXBlXSB8fCAodGhpcy5fZmFjdG9yeVR5cGVJ
bmplY3Rpb25zW3R5cGVdID0gW10pOworCisgICAgICBpbmplY3Rpb25zLnB1c2goeworICAgICAg
ICBwcm9wZXJ0eTogcHJvcGVydHksCisgICAgICAgIGZ1bGxOYW1lOiB0aGlzLm5vcm1hbGl6ZShm
dWxsTmFtZSkKKyAgICAgIH0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgRGVmaW5lcyBmYWN0
b3J5IGluamVjdGlvbiBydWxlcy4KKyAgICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmplY3Rpb24g
cnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWluc3QgZmFjdG9yaWVzLCB2aWEKKyAgICAgYFJlZ2lzdHJ5
I2xvb2t1cEZhY3RvcnlgLgorICAgICAgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gaW5qZWN0IG9i
amVjdHMgb250byBmYWN0b3JpZXMgd2hlbiB0aGV5CisgICAgIGFyZSBsb29rZWQgdXAuCisgICAg
ICBUd28gZm9ybXMgb2YgaW5qZWN0aW9ucyBhcmUgcG9zc2libGU6CisgICAgICAqIEluamVjdGlu
ZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQorICAgICAqIEluamVjdGluZyBvbmUg
ZnVsbE5hbWUgb24gYSB0eXBlCisgICAgICBFeGFtcGxlOgorICAgICAgYGBgamF2YXNjcmlwdAor
ICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgdmFyIGNvbnRhaW5lciA9
IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3N0b3JlOm1h
aW4nLCBTdG9yZSk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdzdG9yZTpzZWNvbmRhcnknLCBP
dGhlclN0b3JlKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBVc2VyKTsK
KyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ21vZGVsOnBvc3QnLCBQb3N0KTsKKyAgICAgIC8vIGlu
amVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciB0eXBlCisgICAgIHJlZ2lzdHJ5LmZhY3Rv
cnlJbmplY3Rpb24oJ21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKKyAgICAgIC8vIGlu
amVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQorICAgICByZWdpc3RyeS5m
YWN0b3J5SW5qZWN0aW9uKCdtb2RlbDpwb3N0JywgJ3NlY29uZGFyeVN0b3JlJywgJ3N0b3JlOnNl
Y29uZGFyeScpOworICAgICAgdmFyIFVzZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3Rv
cnkoJ21vZGVsOnVzZXInKTsKKyAgICAgdmFyIFBvc3RGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1
cEZhY3RvcnkoJ21vZGVsOnBvc3QnKTsKKyAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1
cCgnc3RvcmU6bWFpbicpOworICAgICAgVXNlckZhY3Rvcnkuc3RvcmUgaW5zdGFuY2VvZiBTdG9y
ZTsgLy89PiB0cnVlCisgICAgIFVzZXJGYWN0b3J5LnNlY29uZGFyeVN0b3JlIGluc3RhbmNlb2Yg
T3RoZXJTdG9yZTsgLy89PiBmYWxzZQorICAgICAgUG9zdEZhY3Rvcnkuc3RvcmUgaW5zdGFuY2Vv
ZiBTdG9yZTsgLy89PiB0cnVlCisgICAgIFBvc3RGYWN0b3J5LnNlY29uZGFyeVN0b3JlIGluc3Rh
bmNlb2YgT3RoZXJTdG9yZTsgLy89PiB0cnVlCisgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hh
cmUgdGhlIHNhbWUgc291cmNlIGluc3RhbmNlCisgICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQ
b3N0RmFjdG9yeS5zdG9yZTsgLy89PiB0cnVlCisgICAgIGBgYAorICAgICAgQHByaXZhdGUKKyAg
ICAgQG1ldGhvZCBmYWN0b3J5SW5qZWN0aW9uCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmYWN0b3J5
TmFtZQorICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGluamVjdGlvbk5hbWUKKyAgICAgKi8KKyAgICBmYWN0b3J5SW5qZWN0aW9uOiBmdW5jdGlvbiAo
ZnVsbE5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7CisgICAgICB2YXIgbm9ybWFsaXpl
ZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB2YXIgbm9ybWFsaXplZElu
amVjdGlvbk5hbWUgPSB0aGlzLm5vcm1hbGl6ZShpbmplY3Rpb25OYW1lKTsKKworICAgICAgdGhp
cy52YWxpZGF0ZUZ1bGxOYW1lKGluamVjdGlvbk5hbWUpOworCisgICAgICBpZiAoZnVsbE5hbWUu
aW5kZXhPZignOicpID09PSAtMSkgeworICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5VHlwZUlu
amVjdGlvbihub3JtYWxpemVkTmFtZSwgcHJvcGVydHksIG5vcm1hbGl6ZWRJbmplY3Rpb25OYW1l
KTsKKyAgICAgIH0KKworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlzLl9mYWN0b3J5SW5qZWN0
aW9uc1tub3JtYWxpemVkTmFtZV0gfHwgKHRoaXMuX2ZhY3RvcnlJbmplY3Rpb25zW25vcm1hbGl6
ZWROYW1lXSA9IFtdKTsKKworICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVy
dHk6IHByb3BlcnR5LAorICAgICAgICBmdWxsTmFtZTogbm9ybWFsaXplZEluamVjdGlvbk5hbWUK
KyAgICAgIH0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhv
ZCBrbm93bkZvclR5cGUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gaXRl
cmF0ZSBvdmVyCisgICAgKi8KKyAgICBrbm93bkZvclR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7Cisg
ICAgICB2YXIgZmFsbGJhY2tLbm93biA9IHVuZGVmaW5lZCwKKyAgICAgICAgICByZXNvbHZlcktu
b3duID0gdW5kZWZpbmVkOworCisgICAgICB2YXIgbG9jYWxLbm93biA9IF9lbWJlck1ldGFsRGlj
dGlvbmFyeS5kZWZhdWx0KG51bGwpOworICAgICAgdmFyIHJlZ2lzdGVyZWROYW1lcyA9IE9iamVj
dC5rZXlzKHRoaXMucmVnaXN0cmF0aW9ucyk7CisgICAgICBmb3IgKHZhciBpbmRleCA9IDAsIF9s
ZW5ndGggPSByZWdpc3RlcmVkTmFtZXMubGVuZ3RoOyBpbmRleCA8IF9sZW5ndGg7IGluZGV4Kysp
IHsKKyAgICAgICAgdmFyIGZ1bGxOYW1lID0gcmVnaXN0ZXJlZE5hbWVzW2luZGV4XTsKKyAgICAg
ICAgdmFyIGl0ZW1UeXBlID0gZnVsbE5hbWUuc3BsaXQoJzonKVswXTsKKworICAgICAgICBpZiAo
aXRlbVR5cGUgPT09IHR5cGUpIHsKKyAgICAgICAgICBsb2NhbEtub3duW2Z1bGxOYW1lXSA9IHRy
dWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAg
ICAgICAgZmFsbGJhY2tLbm93biA9IHRoaXMuZmFsbGJhY2sua25vd25Gb3JUeXBlKHR5cGUpOwor
ICAgICAgfQorCisgICAgICBpZiAodGhpcy5yZXNvbHZlciAmJiB0aGlzLnJlc29sdmVyLmtub3du
Rm9yVHlwZSkgeworICAgICAgICByZXNvbHZlcktub3duID0gdGhpcy5yZXNvbHZlci5rbm93bkZv
clR5cGUodHlwZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbEFzc2lnbi5k
ZWZhdWx0KHt9LCBmYWxsYmFja0tub3duLCBsb2NhbEtub3duLCByZXNvbHZlcktub3duKTsKKyAg
ICB9LAorCisgICAgdmFsaWRhdGVGdWxsTmFtZTogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAg
ICBpZiAoIXRoaXMuaXNWYWxpZEZ1bGxOYW1lKGZ1bGxOYW1lKSkgeworICAgICAgICB0aHJvdyBu
ZXcgVHlwZUVycm9yKCdJbnZhbGlkIEZ1bGxuYW1lLCBleHBlY3RlZDogYHR5cGU6bmFtZWAgZ290
OiAnICsgZnVsbE5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAor
CisgICAgaXNWYWxpZEZ1bGxOYW1lOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHJldHVy
biAhIVZBTElEX0ZVTExfTkFNRV9SRUdFWFAudGVzdChmdWxsTmFtZSk7CisgICAgfSwKKworICAg
IHZhbGlkYXRlSW5qZWN0aW9uczogZnVuY3Rpb24gKGluamVjdGlvbnMpIHsKKyAgICAgIGlmICgh
aW5qZWN0aW9ucykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmdWxs
TmFtZTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGluamVjdGlvbnMubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZnVsbE5hbWUgPSBpbmplY3Rpb25zW2ldLmZ1
bGxOYW1lOworCisgICAgICAgIGlmICghdGhpcy5oYXMoZnVsbE5hbWUpKSB7CisgICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIGluamVjdCBhbiB1bmtub3duIGluamVjdGlv
bjogYCcgKyBmdWxsTmFtZSArICdgJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisg
ICAgbm9ybWFsaXplSW5qZWN0aW9uc0hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CisgICAgICB2YXIg
aW5qZWN0aW9ucyA9IFtdOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gaGFzaCkgeworICAgICAg
ICBpZiAoaGFzaC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ0V4cGVjdGVkIGEgcHJvcGVyIGZ1bGwgbmFtZSwgZ2l2ZW4gXCcnICsgaGFz
aFtrZXldICsgJ1wnJywgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGhhc2hba2V5XSkpOworCisgICAg
ICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgICAgIHByb3BlcnR5OiBrZXksCisgICAg
ICAgICAgICBmdWxsTmFtZTogaGFzaFtrZXldCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIGluamVjdGlvbnM7CisgICAgfSwKKworICAgIGdldEluamVj
dGlvbnM6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlz
Ll9pbmplY3Rpb25zW2Z1bGxOYW1lXSB8fCBbXTsKKyAgICAgIGlmICh0aGlzLmZhbGxiYWNrKSB7
CisgICAgICAgIGluamVjdGlvbnMgPSBpbmplY3Rpb25zLmNvbmNhdCh0aGlzLmZhbGxiYWNrLmdl
dEluamVjdGlvbnMoZnVsbE5hbWUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmplY3Rpb25z
OworICAgIH0sCisKKyAgICBnZXRUeXBlSW5qZWN0aW9uczogZnVuY3Rpb24gKHR5cGUpIHsKKyAg
ICAgIHZhciBpbmplY3Rpb25zID0gdGhpcy5fdHlwZUluamVjdGlvbnNbdHlwZV0gfHwgW107Cisg
ICAgICBpZiAodGhpcy5mYWxsYmFjaykgeworICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9u
cy5jb25jYXQodGhpcy5mYWxsYmFjay5nZXRUeXBlSW5qZWN0aW9ucyh0eXBlKSk7CisgICAgICB9
CisgICAgICByZXR1cm4gaW5qZWN0aW9uczsKKyAgICB9LAorCisgICAgZ2V0RmFjdG9yeUluamVj
dGlvbnM6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlz
Ll9mYWN0b3J5SW5qZWN0aW9uc1tmdWxsTmFtZV0gfHwgW107CisgICAgICBpZiAodGhpcy5mYWxs
YmFjaykgeworICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9ucy5jb25jYXQodGhpcy5mYWxs
YmFjay5nZXRGYWN0b3J5SW5qZWN0aW9ucyhmdWxsTmFtZSkpOworICAgICAgfQorICAgICAgcmV0
dXJuIGluamVjdGlvbnM7CisgICAgfSwKKworICAgIGdldEZhY3RvcnlUeXBlSW5qZWN0aW9uczog
ZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgIHZhciBpbmplY3Rpb25zID0gdGhpcy5fZmFjdG9yeVR5
cGVJbmplY3Rpb25zW3R5cGVdIHx8IFtdOworICAgICAgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAg
ICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KHRoaXMuZmFsbGJhY2suZ2V0RmFj
dG9yeVR5cGVJbmplY3Rpb25zKHR5cGUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmplY3Rp
b25zOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBkZXByZWNhdGVSZXNvbHZlckZ1bmN0aW9u
KHJlZ2lzdHJ5KSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Bhc3NpbmcgYSBg
cmVzb2x2ZXJgIGZ1bmN0aW9uIGludG8gYSBSZWdpc3RyeSBpcyBkZXByZWNhdGVkLiBQbGVhc2Ug
cGFzcyBpbiBhIFJlc29sdmVyIG9iamVjdCB3aXRoIGEgYHJlc29sdmVgIG1ldGhvZC4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLnJlZ2lzdHJ5LXJlc29sdmVyLWFzLWZ1bmN0aW9u
JywgdW50aWw6ICczLjAuMCcsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMv
djIueCN0b2NfcmVnaXN0cnktcmVzb2x2ZXItYXMtZnVuY3Rpb24nIH0pOworICAgIHJlZ2lzdHJ5
LnJlc29sdmVyID0geworICAgICAgcmVzb2x2ZTogcmVnaXN0cnkucmVzb2x2ZXIKKyAgICB9Owor
ICB9CisKKyAgLyoqCisgICAgR2l2ZW4gYSBmdWxsTmFtZSBhbmQgYSBzb3VyY2UgZnVsbE5hbWUg
cmV0dXJucyB0aGUgZnVsbHkgcmVzb2x2ZWQKKyAgICBmdWxsTmFtZS4gVXNlZCB0byBhbGxvdyBm
b3IgbG9jYWwgbG9va3VwLgorICAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHJlZ2lzdHJ5ID0g
bmV3IFJlZ2lzdHJ5KCk7CisgICAgIC8vIHRoZSB0d2l0dGVyIGZhY3RvcnkgaXMgYWRkZWQgdG8g
dGhlIG1vZHVsZSBzeXN0ZW0KKyAgICByZWdpc3RyeS5leHBhbmRMb2NhbExvb2t1cCgnY29tcG9u
ZW50OnBvc3QtdGl0bGUnLCB7IHNvdXJjZTogJ3RlbXBsYXRlOnBvc3QnIH0pIC8vID0+IGNvbXBv
bmVudDpwb3N0L3Bvc3QtdGl0bGUKKyAgICBgYGAKKyAgICAgQHByaXZhdGUKKyAgICBAbWV0aG9k
IGV4cGFuZExvY2FsTG9va3VwCisgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgQHBh
cmFtIHtPYmplY3R9IFtvcHRpb25zXQorICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3Vy
Y2VdIHRoZSBmdWxsbmFtZSBvZiB0aGUgcmVxdWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxv
b2t1cHMpCisgICAgQHJldHVybiB7U3RyaW5nfSBmdWxsTmFtZQorICAqLworICBSZWdpc3RyeS5w
cm90b3R5cGUuZXhwYW5kTG9jYWxMb29rdXAgPSBmdW5jdGlvbiBSZWdpc3RyeV9leHBhbmRMb2Nh
bExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgIGlmICh0aGlzLnJlc29sdmVyICYmIHRo
aXMucmVzb2x2ZXIuZXhwYW5kTG9jYWxMb29rdXApIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdmdWxsTmFtZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRh
dGVGdWxsTmFtZShmdWxsTmFtZSkpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ29w
dGlvbnMuc291cmNlIG11c3QgYmUgcHJvdmlkZWQgdG8gZXhwYW5kTG9jYWxMb29rdXAnLCBvcHRp
b25zICYmIG9wdGlvbnMuc291cmNlKTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdv
cHRpb25zLnNvdXJjZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRhdGVG
dWxsTmFtZShvcHRpb25zLnNvdXJjZSkpOworCisgICAgICB2YXIgbm9ybWFsaXplZEZ1bGxOYW1l
ID0gdGhpcy5ub3JtYWxpemUoZnVsbE5hbWUpOworICAgICAgdmFyIG5vcm1hbGl6ZWRTb3VyY2Ug
PSB0aGlzLm5vcm1hbGl6ZShvcHRpb25zLnNvdXJjZSk7CisKKyAgICAgIHJldHVybiBleHBhbmRM
b2NhbExvb2t1cCh0aGlzLCBub3JtYWxpemVkRnVsbE5hbWUsIG5vcm1hbGl6ZWRTb3VyY2UpOwor
ICAgIH0gZWxzZSBpZiAodGhpcy5mYWxsYmFjaykgeworICAgICAgcmV0dXJuIHRoaXMuZmFsbGJh
Y2suZXhwYW5kTG9jYWxMb29rdXAoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZXhwYW5kTG9jYWxM
b29rdXAocmVnaXN0cnksIG5vcm1hbGl6ZWROYW1lLCBub3JtYWxpemVkU291cmNlKSB7CisgICAg
dmFyIGNhY2hlID0gcmVnaXN0cnkuX2xvY2FsTG9va3VwQ2FjaGU7CisgICAgdmFyIG5vcm1hbGl6
ZWROYW1lQ2FjaGUgPSBjYWNoZVtub3JtYWxpemVkTmFtZV07CisKKyAgICBpZiAoIW5vcm1hbGl6
ZWROYW1lQ2FjaGUpIHsKKyAgICAgIG5vcm1hbGl6ZWROYW1lQ2FjaGUgPSBjYWNoZVtub3JtYWxp
emVkTmFtZV0gPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgIH0K
KworICAgIHZhciBjYWNoZWQgPSBub3JtYWxpemVkTmFtZUNhY2hlW25vcm1hbGl6ZWRTb3VyY2Vd
OworCisgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gY2FjaGVk
OworICAgIH0KKworICAgIHZhciBleHBhbmRlZCA9IHJlZ2lzdHJ5LnJlc29sdmVyLmV4cGFuZExv
Y2FsTG9va3VwKG5vcm1hbGl6ZWROYW1lLCBub3JtYWxpemVkU291cmNlKTsKKworICAgIHJldHVy
biBub3JtYWxpemVkTmFtZUNhY2hlW25vcm1hbGl6ZWRTb3VyY2VdID0gZXhwYW5kZWQ7CisgIH0K
KworICBmdW5jdGlvbiByZXNvbHZlKHJlZ2lzdHJ5LCBub3JtYWxpemVkTmFtZSwgb3B0aW9ucykg
eworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc291cmNlKSB7CisgICAgICAvLyB3aGVuIGBz
b3VyY2VgIGlzIHByb3ZpZGVkIGV4cGFuZCBub3JtYWxpemVkTmFtZQorICAgICAgLy8gYW5kIHNv
dXJjZSBpbnRvIHRoZSBmdWxsIG5vcm1hbGl6ZWROYW1lCisgICAgICBub3JtYWxpemVkTmFtZSA9
IHJlZ2lzdHJ5LmV4cGFuZExvY2FsTG9va3VwKG5vcm1hbGl6ZWROYW1lLCBvcHRpb25zKTsKKwor
ICAgICAgLy8gaWYgZXhwYW5kTG9jYWxMb29rdXAgcmV0dXJucyBmYWxzZXksIHdlIGRvIG5vdCBz
dXBwb3J0IGxvY2FsIGxvb2t1cAorICAgICAgaWYgKCFub3JtYWxpemVkTmFtZSkgeworICAgICAg
ICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGNhY2hlZCA9IHJlZ2lzdHJ5Ll9y
ZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdOworICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5l
ZCkgeworICAgICAgcmV0dXJuIGNhY2hlZDsKKyAgICB9CisgICAgaWYgKHJlZ2lzdHJ5Ll9mYWls
Q2FjaGVbbm9ybWFsaXplZE5hbWVdKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFy
IHJlc29sdmVkID0gdW5kZWZpbmVkOworCisgICAgaWYgKHJlZ2lzdHJ5LnJlc29sdmVyKSB7Cisg
ICAgICByZXNvbHZlZCA9IHJlZ2lzdHJ5LnJlc29sdmVyLnJlc29sdmUobm9ybWFsaXplZE5hbWUp
OworICAgIH0KKworICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXNv
bHZlZCA9IHJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbnNbbm9ybWFsaXplZE5hbWVdOworICAgIH0KKwor
ICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZWdpc3RyeS5fZmFpbENh
Y2hlW25vcm1hbGl6ZWROYW1lXSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZ2lzdHJ5
Ll9yZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdID0gcmVzb2x2ZWQ7CisgICAgfQorCisgICAg
cmV0dXJuIHJlc29sdmVkOworICB9CisKKyAgZnVuY3Rpb24gaGFzKHJlZ2lzdHJ5LCBmdWxsTmFt
ZSwgc291cmNlKSB7CisgICAgcmV0dXJuIHJlZ2lzdHJ5LnJlc29sdmUoZnVsbE5hbWUsIHsgc291
cmNlOiBzb3VyY2UgfSkgIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIHZhciBwcml2YXRlTmFtZXMg
PSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAgdmFyIHByaXZhdGVTdWZm
aXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBuZXcgRGF0ZSgpKSArICcnOworCisgIGZ1
bmN0aW9uIHByaXZhdGl6ZShfcmVmKSB7CisgICAgdmFyIGZ1bGxOYW1lID0gX3JlZlswXTsKKwor
ICAgIHZhciBuYW1lID0gcHJpdmF0ZU5hbWVzW2Z1bGxOYW1lXTsKKyAgICBpZiAobmFtZSkgewor
ICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgdmFyIF9mdWxsTmFtZSRzcGxpdCA9IGZ1
bGxOYW1lLnNwbGl0KCc6Jyk7CisKKyAgICB2YXIgdHlwZSA9IF9mdWxsTmFtZSRzcGxpdFswXTsK
KyAgICB2YXIgcmF3TmFtZSA9IF9mdWxsTmFtZSRzcGxpdFsxXTsKKworICAgIHJldHVybiBwcml2
YXRlTmFtZXNbZnVsbE5hbWVdID0gX2VtYmVyTWV0YWxVdGlscy5pbnRlcm4odHlwZSArICc6JyAr
IHJhd05hbWUgKyAnLScgKyBwcml2YXRlU3VmZml4KTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVs
dCA9IFJlZ2lzdHJ5OworfSk7CitlbmlmZWQoJ2RhZy1tYXAnLCBbJ2V4cG9ydHMnLCAndmVydGV4
JywgJ3Zpc2l0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfdmVydGV4LCBfdmlzaXQpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERBRzsKKworICAvKioKKyAgICogREFH
IHN0YW5kcyBmb3IgRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaC4KKyAgICoKKyAgICogSXQgaXMgdXNl
ZCB0byBidWlsZCBhIGdyYXBoIG9mIGRlcGVuZGVuY2llcyBjaGVja2luZyB0aGF0IHRoZXJlIGlz
bid0IGNpcmN1bGFyCisgICAqIGRlcGVuZGVuY2llcy4gcC5lIFJlZ2lzdGVyaW5nIGluaXRpYWxp
emVycyB3aXRoIGEgY2VydGFpbiBwcmVjZWRlbmNlIG9yZGVyLgorICAgKgorICAgKiBAY2xhc3Mg
REFHCisgICAqIEBjb25zdHJ1Y3RvcgorICAgKi8KKworICBmdW5jdGlvbiBEQUcoKSB7CisgICAg
dGhpcy5uYW1lcyA9IFtdOworICAgIHRoaXMudmVydGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwp
OworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSB2ZXJ0ZXggZW50cnkgdG8gdGhlIGdyYXBoIHVu
bGVzcyBpdCBpcyBhbHJlYWR5IGFkZGVkLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAbWV0
aG9kIGFkZAorICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4
IHRvIGFkZAorICAgKi8KKyAgREFHLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobmFtZSkgewor
ICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBhZGQgVmVydGV4
IHdpdGhvdXQgbmFtZSIpOworICAgIH0KKyAgICBpZiAodGhpcy52ZXJ0aWNlc1tuYW1lXSAhPT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc1tuYW1lXTsKKyAgICB9Cisg
ICAgdmFyIHZlcnRleCA9IG5ldyBfdmVydGV4LmRlZmF1bHQobmFtZSk7CisgICAgdGhpcy52ZXJ0
aWNlc1tuYW1lXSA9IHZlcnRleDsKKyAgICB0aGlzLm5hbWVzLnB1c2gobmFtZSk7CisgICAgcmV0
dXJuIHZlcnRleDsKKyAgfTsKKworICAvKioKKyAgICogQWRkcyBhIHZlcnRleCB0byB0aGUgZ3Jh
cGggYW5kIHNldHMgaXRzIHZhbHVlLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAbWV0aG9k
IG1hcAorICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4Lgor
ICAgKiBAcGFyYW0gICAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gcHV0IGluIHRoZSB2ZXJ0ZXgu
CisgICAqLworICBEQUcucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewor
ICAgIHRoaXMuYWRkKG5hbWUpLnZhbHVlID0gdmFsdWU7CisgIH07CisKKyAgLyoqCisgICAqIENv
bm5lY3RzIHRoZSB2ZXJ0aWNlcyB3aXRoIHRoZSBnaXZlbiBuYW1lcywgYWRkaW5nIHRoZW0gdG8g
dGhlIGdyYXBoIGlmCisgICAqIG5lY2Vzc2FyeSwgb25seSBpZiB0aGlzIGRvZXMgbm90IHByb2R1
Y2UgaXMgYW55IGNpcmN1bGFyIGRlcGVuZGVuY3kuCisgICAqCisgICAqIEBwcml2YXRlCisgICAq
IEBtZXRob2QgYWRkRWRnZQorICAgKiBAcGFyYW0ge1N0cmluZ30gZnJvbU5hbWUgVGhlIG5hbWUg
dGhlIHZlcnRleCB3aGVyZSB0aGUgZWRnZSBzdGFydHMuCisgICAqIEBwYXJhbSB7U3RyaW5nfSB0
b05hbWUgVGhlIG5hbWUgdGhlIHZlcnRleCB3aGVyZSB0aGUgZWRnZSBlbmRzLgorICAgKi8KKyAg
REFHLnByb3RvdHlwZS5hZGRFZGdlID0gZnVuY3Rpb24gKGZyb21OYW1lLCB0b05hbWUpIHsKKyAg
ICBpZiAoIWZyb21OYW1lIHx8ICF0b05hbWUgfHwgZnJvbU5hbWUgPT09IHRvTmFtZSkgeworICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgZnJvbSA9IHRoaXMuYWRkKGZyb21OYW1lKTsKKyAg
ICB2YXIgdG8gPSB0aGlzLmFkZCh0b05hbWUpOworICAgIGlmICh0by5pbmNvbWluZy5oYXNPd25Q
cm9wZXJ0eShmcm9tTmFtZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnVuY3Rpb24g
Y2hlY2tDeWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKKyAgICAgIGlmICh2ZXJ0ZXgubmFtZSA9PT0gdG9O
YW1lKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiY3ljbGUgZGV0ZWN0ZWQ6ICIgKyB0b05h
bWUgKyAiIDwtICIgKyBwYXRoLmpvaW4oIiA8LSAiKSk7CisgICAgICB9CisgICAgfQorICAgIF92
aXNpdC5kZWZhdWx0KGZyb20sIGNoZWNrQ3ljbGUpOworICAgIGZyb20uaGFzT3V0Z29pbmcgPSB0
cnVlOworICAgIHRvLmluY29taW5nW2Zyb21OYW1lXSA9IGZyb207CisgICAgdG8uaW5jb21pbmdO
YW1lcy5wdXNoKGZyb21OYW1lKTsKKyAgfTsKKworICAvKioKKyAgICogVmlzaXRzIGFsbCB0aGUg
dmVydGV4IG9mIHRoZSBncmFwaCBjYWxsaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGVhY2gg
b25lLAorICAgKiBlbnN1cmluZyB0aGF0IHRoZSB2ZXJ0aWNlcyBhcmUgdmlzaXRlZCByZXNwZWN0
aW5nIHRoZWlyIHByZWNlZGVuY2UuCisgICAqCisgICAqIEBtZXRob2QgIHRvcHNvcnQKKyAgICog
QHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgb24gZWFjaCB2
ZXJ0ZXguCisgICAqLworICBEQUcucHJvdG90eXBlLnRvcHNvcnQgPSBmdW5jdGlvbiAoZm4pIHsK
KyAgICB2YXIgdmlzaXRlZCA9IHt9OworICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7
CisgICAgdmFyIG5hbWVzID0gdGhpcy5uYW1lczsKKyAgICB2YXIgbGVuID0gbmFtZXMubGVuZ3Ro
OworICAgIHZhciBpLCB2ZXJ0ZXg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIHZlcnRleCA9IHZlcnRpY2VzW25hbWVzW2ldXTsKKyAgICAgIGlmICghdmVydGV4Lmhh
c091dGdvaW5nKSB7CisgICAgICAgIF92aXNpdC5kZWZhdWx0KHZlcnRleCwgZm4sIHZpc2l0ZWQp
OworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQWRkcyBhIHZlcnRleCB3aXRo
IHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZSB0byB0aGUgZ3JhcGggYW5kIGpvaW5zIGl0IHdpdGgg
dGhlCisgICAqIHZlcnRpY2VzIHJlZmVyZW5jZWQgaW4gX2JlZm9yZV8gYW5kIF9hZnRlcl8uIElm
IHRoZXJlIGlzbid0IHZlcnRpY2VzIHdpdGggdGhvc2UKKyAgICogbmFtZXMsIHRoZXkgYXJlIGFk
ZGVkIHRvby4KKyAgICoKKyAgICogSWYgZWl0aGVyIF9iZWZvcmVfIG9yIF9hZnRlcl8gYXJlIGZh
bHN5L2VtcHR5LCB0aGUgYWRkZWQgdmVydGV4IHdpbGwgbm90IGhhdmUKKyAgICogYW4gaW5jb21p
bmcvb3V0Z29pbmcgZWRnZS4KKyAgICoKKyAgICogQG1ldGhvZCBhZGRFZGdlcworICAgKiBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4IHRvIGJlIGFkZGVkLgorICAg
KiBAcGFyYW0gICAgICAgICB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhhdCB2ZXJ0ZXguCisgICAqIEBw
YXJhbSAgICAgICAgYmVmb3JlIEFuIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhl
IG5hbWVzIG9mIHRoZSB2ZXJ0aWNlcyBiZWZvcmUKKyAgICogICAgICAgICAgICAgICAgICAgICAg
d2hpY2ggdGhpcyB2ZXJ0ZXggbXVzdCBiZSB2aXNpdGVkLgorICAgKiBAcGFyYW0gICAgICAgICBh
ZnRlciBBbiBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUg
dmVydGV4IGFmdGVyCisgICAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoaXMgdmVydGV4
IG11c3QgYmUgdmlzaXRlZC4KKyAgICoKKyAgICovCisgIERBRy5wcm90b3R5cGUuYWRkRWRnZXMg
PSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGJlZm9yZSwgYWZ0ZXIpIHsKKyAgICB2YXIgaTsKKyAg
ICB0aGlzLm1hcChuYW1lLCB2YWx1ZSk7CisgICAgaWYgKGJlZm9yZSkgeworICAgICAgaWYgKHR5
cGVvZiBiZWZvcmUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHRoaXMuYWRkRWRnZShuYW1lLCBi
ZWZvcmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJlZm9yZS5s
ZW5ndGg7IGkrKykgeworICAgICAgICAgIHRoaXMuYWRkRWRnZShuYW1lLCBiZWZvcmVbaV0pOwor
ICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChhZnRlcikgeworICAgICAgaWYgKHR5
cGVvZiBhZnRlciA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgdGhpcy5hZGRFZGdlKGFmdGVyLCBu
YW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZnRlci5sZW5n
dGg7IGkrKykgeworICAgICAgICAgIHRoaXMuYWRkRWRnZShhZnRlcltpXSwgbmFtZSk7CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07Cit9KTsKK2VuaWZlZCgnZGFnLW1hcC51bWQnLCBb
J2V4cG9ydHMnLCAnZGFnLW1hcC9wbGF0Zm9ybScsICdkYWctbWFwJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZGFnTWFwUGxhdGZvcm0sIF9kYWdNYXApIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
IGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi8KKyAgaWYgKHR5
cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeworICAgIGRlZmluZShm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2RhZ01hcC5kZWZhdWx0OworICAgIH0pOworICB9
IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRz
KSB7CisgICAgbW9kdWxlLmV4cG9ydHMgPSBfZGFnTWFwLmRlZmF1bHQ7CisgIH0gZWxzZSBpZiAo
dHlwZW9mIF9kYWdNYXBQbGF0Zm9ybS5kZWZhdWx0ICE9PSAndW5kZWZpbmVkJykgeworICAgIF9k
YWdNYXBQbGF0Zm9ybS5kZWZhdWx0WydEQUcnXSA9IF9kYWdNYXAuZGVmYXVsdDsKKyAgfQorfSk7
CitlbmlmZWQoJ2RhZy1tYXAvcGxhdGZvcm0nLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9y
dHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBwbGF0Zm9ybTsKKworICAvKiBnbG9iYWwg
c2VsZiAqLworICBpZiAodHlwZW9mIHNlbGYgPT09ICdvYmplY3QnKSB7CisgICAgcGxhdGZvcm0g
PSBzZWxmOworCisgICAgLyogZ2xvYmFsIGdsb2JhbCAqLworICB9IGVsc2UgaWYgKHR5cGVvZiBn
bG9iYWwgPT09ICdvYmplY3QnKSB7CisgICAgICBwbGF0Zm9ybSA9IGdsb2JhbDsKKyAgICB9IGVs
c2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBnbG9iYWw6IGBzZWxmYCBvciBgZ2xvYmFs
YCBmb3VuZCcpOworICAgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBwbGF0Zm9ybTsKK30pOwor
ZW5pZmVkKCJkb20taGVscGVyIiwgWyJleHBvcnRzIiwgImh0bWxiYXJzLXJ1bnRpbWUvbW9ycGgi
LCAibW9ycGgtYXR0ciIsICJkb20taGVscGVyL2J1aWxkLWh0bWwtZG9tIiwgImRvbS1oZWxwZXIv
Y2xhc3NlcyIsICJkb20taGVscGVyL3Byb3AiXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9odG1sYmFy
c1J1bnRpbWVNb3JwaCwgX21vcnBoQXR0ciwgX2RvbUhlbHBlckJ1aWxkSHRtbERvbSwgX2RvbUhl
bHBlckNsYXNzZXMsIF9kb21IZWxwZXJQcm9wKSB7CisgIC8qZ2xvYmFscyBtb2R1bGUsIFVSTCov
CisKKyAgInVzZSBzdHJpY3QiOworCisgIHZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1
bmRlZmluZWQnID8gZmFsc2UgOiBkb2N1bWVudDsKKworICB2YXIgZGVsZXRlc0JsYW5rVGV4dE5v
ZGVzID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgZWxlbWVudCA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9j
dW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpKTsKKyAgICB2YXIgY2xvbmVkRWxlbWVudCA9IGVsZW1l
bnQuY2xvbmVOb2RlKHRydWUpOworICAgIHJldHVybiBjbG9uZWRFbGVtZW50LmNoaWxkTm9kZXMu
bGVuZ3RoID09PSAwOworICB9KShkb2MpOworCisgIHZhciBpZ25vcmVzQ2hlY2tlZEF0dHJpYnV0
ZSA9IGRvYyAmJiAoZnVuY3Rpb24gKGRvY3VtZW50KSB7CisgICAgdmFyIGVsZW1lbnQgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdj
aGVja2VkJywgJ2NoZWNrZWQnKTsKKyAgICB2YXIgY2xvbmVkRWxlbWVudCA9IGVsZW1lbnQuY2xv
bmVOb2RlKGZhbHNlKTsKKyAgICByZXR1cm4gIWNsb25lZEVsZW1lbnQuY2hlY2tlZDsKKyAgfSko
ZG9jKTsKKworICB2YXIgY2FuUmVtb3ZlU3ZnVmlld0JveEF0dHJpYnV0ZSA9IGRvYyAmJiAoZG9j
LmNyZWF0ZUVsZW1lbnROUyA/IChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgZWxlbWVu
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhfZG9tSGVscGVyQnVpbGRIdG1sRG9tLnN2Z05h
bWVzcGFjZSwgJ3N2ZycpOworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAg
MCAxMDAgMTAwJyk7CisgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3ZpZXdCb3gnKTsKKyAg
ICByZXR1cm4gIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyk7CisgIH0pKGRvYykgOiB0
cnVlKTsKKworICB2YXIgY2FuQ2xvbmUgPSBkb2MgJiYgKGZ1bmN0aW9uIChkb2N1bWVudCkgewor
ICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgZWxl
bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpKTsKKyAgICBlbGVt
ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJykpOworICAgIHZhciBj
bG9uZWRFbGVtZW50ID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisgICAgcmV0dXJuIGNsb25l
ZEVsZW1lbnQuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgPT09ICcgJzsKKyAgfSkoZG9jKTsKKwor
ICAvLyBUaGlzIGlzIG5vdCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LCBidXQgb2YKKyAg
Ly8gdGhlIGVsZW1lbnRzIGluc2lkZSB0aGF0IGVsZW1lbnRzLgorICBmdW5jdGlvbiBpbnRlcmlv
ck5hbWVzcGFjZShlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5uYW1lc3Bh
Y2VVUkkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3ZnTmFtZXNwYWNlICYmICFfZG9tSGVs
cGVyQnVpbGRIdG1sRG9tLnN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50c1tlbGVtZW50LnRhZ05hbWVd
KSB7CisgICAgICByZXR1cm4gX2RvbUhlbHBlckJ1aWxkSHRtbERvbS5zdmdOYW1lc3BhY2U7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBI
VE1MIHNwZWMgYWxsb3dzIGZvciAib21pdHRlZCBzdGFydCB0YWdzIi4gVGhlc2UgdGFncyBhcmUg
b3B0aW9uYWwKKyAgLy8gd2hlbiB0aGVpciBpbnRlbmRlZCBjaGlsZCBpcyB0aGUgZmlyc3QgdGhp
bmcgaW4gdGhlIHBhcmVudCB0YWcuIEZvcgorICAvLyBleGFtcGxlLCB0aGlzIGlzIGEgdGJvZHkg
c3RhcnQgdGFnOgorICAvLworICAvLyA8dGFibGU+CisgIC8vICAgPHRib2R5PgorICAvLyAgICAg
PHRyPgorICAvLworICAvLyBUaGUgdGJvZHkgbWF5IGJlIG9taXR0ZWQsIGFuZCB0aGUgYnJvd3Nl
ciB3aWxsIGFjY2VwdCBhbmQgcmVuZGVyOgorICAvLworICAvLyA8dGFibGU+CisgIC8vICAgPHRy
PgorICAvLworICAvLyBIb3dldmVyLCB0aGUgb21pdHRlZCBzdGFydCB0YWcgd2lsbCBzdGlsbCBi
ZSBhZGRlZCB0byB0aGUgRE9NLiBIZXJlCisgIC8vIHdlIHRlc3QgdGhlIHN0cmluZyBhbmQgY29u
dGV4dCB0byBzZWUgaWYgdGhlIGJyb3dzZXIgaXMgYWJvdXQgdG8KKyAgLy8gcGVyZm9ybSB0aGlz
IGNsZWFudXAuCisgIC8vCisgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBw
cy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3N5bnRheC5odG1sI29wdGlvbmFsLXRhZ3MKKyAgLy8g
ZGVzY3JpYmVzIHdoaWNoIHRhZ3MgYXJlIG9taXR0YWJsZS4gVGhlIHNwZWMgZm9yIHRib2R5IGFu
ZCBjb2xncm91cAorICAvLyBleHBsYWlucyB0aGlzIGJlaGF2aW9yOgorICAvLworICAvLyBodHRw
Oi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90
YWJsZXMuaHRtbCN0aGUtdGJvZHktZWxlbWVudAorICAvLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcv
c3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90YWJsZXMuaHRtbCN0aGUtY29s
Z3JvdXAtZWxlbWVudAorICAvLworCisgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZFRlc3QgPSAv
PChbXHc6XSspLzsKKyAgZnVuY3Rpb24gZGV0ZWN0T21pdHRlZFN0YXJ0VGFnKHN0cmluZywgY29u
dGV4dHVhbEVsZW1lbnQpIHsKKyAgICAvLyBPbWl0dGVkIHN0YXJ0IHRhZ3MgYXJlIG9ubHkgaW5z
aWRlIHRhYmxlIHRhZ3MuCisgICAgaWYgKGNvbnRleHR1YWxFbGVtZW50LnRhZ05hbWUgPT09ICdU
QUJMRScpIHsKKyAgICAgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZE1hdGNoID0gb21pdHRlZFN0
YXJ0VGFnQ2hpbGRUZXN0LmV4ZWMoc3RyaW5nKTsKKyAgICAgIGlmIChvbWl0dGVkU3RhcnRUYWdD
aGlsZE1hdGNoKSB7CisgICAgICAgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZCA9IG9taXR0ZWRT
dGFydFRhZ0NoaWxkTWF0Y2hbMV07CisgICAgICAgIC8vIEl0IGlzIGFscmVhZHkgYXNzZXJ0ZWQg
dGhhdCB0aGUgY29udGV4dHVhbCBlbGVtZW50IGlzIGEgdGFibGUKKyAgICAgICAgLy8gYW5kIG5v
dCB0aGUgcHJvcGVyIHN0YXJ0IHRhZy4gSnVzdCBzZWUgaWYgYSB0YWcgd2FzIG9taXR0ZWQuCisg
ICAgICAgIHJldHVybiBvbWl0dGVkU3RhcnRUYWdDaGlsZCA9PT0gJ3RyJyB8fCBvbWl0dGVkU3Rh
cnRUYWdDaGlsZCA9PT0gJ2NvbCc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24g
YnVpbGRTVkdET00oaHRtbCwgZG9tKSB7CisgICAgdmFyIGRpdiA9IGRvbS5kb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdkaXYnKTsKKyAgICBkaXYuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwgKyAn
PC9zdmc+JzsKKyAgICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQuY2hpbGROb2RlczsKKyAgfQorCisg
IHZhciBndWlkID0gMTsKKworICBmdW5jdGlvbiBFbGVtZW50TW9ycGgoZWxlbWVudCwgZG9tLCBu
YW1lc3BhY2UpIHsKKyAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgIHRoaXMuZG9tID0g
ZG9tOworICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOworICAgIHRoaXMuZ3VpZCA9ICJl
bGVtZW50IiArIGd1aWQrKzsKKworICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkOworICAgIHRo
aXMuaXNEaXJ0eSA9IHRydWU7CisgIH0KKworICBFbGVtZW50TW9ycGgucHJvdG90eXBlLmdldFN0
YXRlID0gZnVuY3Rpb24gKCkgeworICAgIGlmICghdGhpcy5fc3RhdGUpIHsKKyAgICAgIHRoaXMu
X3N0YXRlID0ge307CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3N0YXRlOworICB9OworCisg
IEVsZW1lbnRNb3JwaC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAobmV3U3RhdGUpIHsK
KyAgICAvKmpzaGludCAtVzA5MyAqLworCisgICAgcmV0dXJuIHRoaXMuX3N0YXRlID0gbmV3U3Rh
dGU7CisgIH07CisKKyAgLy8gcmVuZGVyQW5kQ2xlYW51cCBjYWxscyBgY2xlYXJgIG9uIGFsbCBp
dGVtcyBpbiB0aGUgbW9ycGggbWFwCisgIC8vIGp1c3QgYmVmb3JlIGNhbGxpbmcgYGRlc3Ryb3lg
IG9uIHRoZSBtb3JwaC4KKyAgLy8KKyAgLy8gQXMgYSBmdXR1cmUgcmVmYWN0b3IgdGhpcyBjb3Vs
ZCBiZSBjaGFuZ2VkIHRvIHNldCB0aGUgcHJvcGVydHkKKyAgLy8gYmFjayB0byBpdHMgb3JpZ2lu
YWwvZGVmYXVsdCB2YWx1ZS4KKyAgRWxlbWVudE1vcnBoLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0
aW9uICgpIHt9OworCisgIEVsZW1lbnRNb3JwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB0aGlzLmVsZW1lbnQgPSBudWxsOworICAgIHRoaXMuZG9tID0gbnVsbDsKKyAg
fTsKKworICAvKgorICAgKiBBIGNsYXNzIHdyYXBwaW5nIERPTSBmdW5jdGlvbnMgdG8gYWRkcmVz
cyBlbnZpcm9ubWVudCBjb21wYXRpYmlsaXR5LAorICAgKiBuYW1lc3BhY2VzLCBjb250ZXh0dWFs
IGVsZW1lbnRzIGZvciBtb3JwaCB1bi1lc2NhcGVkIGNvbnRlbnQKKyAgICogaW5zZXJ0aW9uLgor
ICAgKgorICAgKiBXaGVuIGVudGVyaW5nIGEgdGVtcGxhdGUsIGEgRE9NSGVscGVyIHNob3VsZCBi
ZSBwYXNzZWQ6CisgICAqCisgICAqICAgdGVtcGxhdGUoY29udGV4dCwgeyBob29rczogaG9va3Ms
IGRvbTogbmV3IERPTUhlbHBlcigpIH0pOworICAgKgorICAgKiBUT0RPOiBzdXBwb3J0IGZvcmVp
Z25PYmplY3QgYXMgYSBwYXNzZWQgY29udGV4dHVhbCBlbGVtZW50LiBJdCBoYXMKKyAgICogYSBu
YW1lc3BhY2UgKHN2ZykgdGhhdCBkb2VzIG5vdCBtYXRjaCBpdHMgaW50ZXJuYWwgbmFtZXNwYWNl
CisgICAqICh4aHRtbCkuCisgICAqCisgICAqIEBjbGFzcyBET01IZWxwZXIKKyAgICogQGNvbnN0
cnVjdG9yCisgICAqIEBwYXJhbSB7SFRNTERvY3VtZW50fSBfZG9jdW1lbnQgVGhlIGRvY3VtZW50
IERPTSBtZXRob2RzIGFyZSBwcm94aWVkIHRvCisgICAqLworICBmdW5jdGlvbiBET01IZWxwZXIo
X2RvY3VtZW50KSB7CisgICAgdGhpcy5kb2N1bWVudCA9IF9kb2N1bWVudCB8fCBkb2N1bWVudDsK
KyAgICBpZiAoIXRoaXMuZG9jdW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQSBkb2N1
bWVudCBvYmplY3QgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIERPTUhlbHBlciwgb3IgYXZhaWxhYmxl
IG9uIHRoZSBnbG9iYWwgc2NvcGUiKTsKKyAgICB9CisgICAgdGhpcy5jYW5DbG9uZSA9IGNhbkNs
b25lOworICAgIHRoaXMubmFtZXNwYWNlID0gbnVsbDsKKworICAgIGluc3RhbGxFbnZpcm9ubWVu
dFNwZWNpZmljTWV0aG9kcyh0aGlzKTsKKyAgfQorCisgIHZhciBwcm90b3R5cGUgPSBET01IZWxw
ZXIucHJvdG90eXBlOworICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBET01IZWxwZXI7CisKKyAg
cHJvdG90eXBlLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24gKGlkLCByb290Tm9kZSkgeworICAg
IHJvb3ROb2RlID0gcm9vdE5vZGUgfHwgdGhpcy5kb2N1bWVudDsKKyAgICByZXR1cm4gcm9vdE5v
ZGUuZ2V0RWxlbWVudEJ5SWQoaWQpOworICB9OworCisgIHByb3RvdHlwZS5pbnNlcnRCZWZvcmUg
PSBmdW5jdGlvbiAoZWxlbWVudCwgY2hpbGRFbGVtZW50LCByZWZlcmVuY2VDaGlsZCkgeworICAg
IHJldHVybiBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZEVsZW1lbnQsIHJlZmVyZW5jZUNoaWxk
KTsKKyAgfTsKKworICBwcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAoZWxlbWVudCwg
Y2hpbGRFbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVt
ZW50KTsKKyAgfTsKKworICB2YXIgaXRlbUF0OworCisgIC8vIEl0IGFwcGVhcnMgdGhhdCBzb21l
dGltZXMsIGluIHlldCB0byBiZSBpdGVudGlmaWVkIHNjZW5hcmlvcyBQaGFudG9tSlMgMi4wCisg
IC8vIGNyYXNoZXMgb24gY2hpbGROb2Rlcy5pdGVtKGluZGV4KSwgYnV0IHdvcmtzIGFzIGV4cGVj
dGVkIHdpdGggY2hpbGROb2Rlc1tpbmRleF07CisgIC8vCisgIC8vIEFsdGhvdWdoIGl0IHdvdWxk
IGJlIG5pY2UgdG8gbW92ZSB0byBjaGlsZE5vZGVzW2luZGV4XSBpbiBhbGwgc2NlbmFyaW9zLAor
ICAvLyB0aGlzIHdvdWxkIHJlcXVpcmUgU2ltcGxlRE9NIHRvIG1haW50YWluIHRoZSBjaGlsZE5v
ZGVzIGFycmF5LiBUaGlzIHdvdWxkIGJlCisgIC8vIHF1aXRlIGNvc3RseSwgaW4gYm90aCBkZXYg
dGltZSBhbmQgcnVudGltZS4KKyAgLy8KKyAgLy8gU28gaW5zdGVhZCwgd2UgY2hvb3NlIHRoZSBi
ZXN0IHBvc3NpYmxlIG1ldGhvZCBhbmQgY2FsbCBpdCBhIGRheS4KKyAgLy8KKyAgLypnbG9iYWwg
bmF2aWdhdG9yICovCisgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBu
YXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1BoYW50b21KUycpKSB7CisgICAgaXRlbUF0ID0g
ZnVuY3Rpb24gKG5vZGVzLCBpbmRleCkgeworICAgICAgcmV0dXJuIG5vZGVzW2luZGV4XTsKKyAg
ICB9OworICB9IGVsc2UgeworICAgIGl0ZW1BdCA9IGZ1bmN0aW9uIChub2RlcywgaW5kZXgpIHsK
KyAgICAgIHJldHVybiBub2Rlcy5pdGVtKGluZGV4KTsKKyAgICB9OworICB9CisKKyAgcHJvdG90
eXBlLmNoaWxkQXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgaW5kaWNlcykgeworICAgIHZhciBjaGls
ZCA9IGVsZW1lbnQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBp
KyspIHsKKyAgICAgIGNoaWxkID0gaXRlbUF0KGNoaWxkLmNoaWxkTm9kZXMsIGluZGljZXNbaV0p
OworICAgIH0KKworICAgIHJldHVybiBjaGlsZDsKKyAgfTsKKworICAvLyBOb3RlIHRvIGEgRmVs
bG93IEltcGxlbWVudG9yOgorICAvLyBBaGgsIGFjY2Vzc2luZyBhIGNoaWxkIG5vZGUgYXQgYW4g
aW5kZXguIFNlZW1zIGxpa2UgaXQgc2hvdWxkIGJlIHNvIHNpbXBsZSwKKyAgLy8gZG9lc24ndCBp
dD8gVW5mb3J0dW5hdGVseSwgdGhpcyBwYXJ0aWN1bGFyIG1ldGhvZCBoYXMgY2F1c2VkIHVzIGEg
c3VycHJpc2luZworICAvLyBhbW91bnQgb2YgcGFpbi4gQXMgeW91J2xsIG5vdGUgYmVsb3csIHRo
aXMgbWV0aG9kIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdhbGsKKyAgLy8gdGhlIGxpbmtlZCBsaXN0
IG9mIGNoaWxkIG5vZGVzIHJhdGhlciB0aGFuIGFjY2VzcyB0aGUgY2hpbGQgYnkgaW5kZXgKKyAg
Ly8gZGlyZWN0bHksIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSB0d28gKDIpIEFQSXMgaW4gdGhlIERP
TSB0aGF0IGRvIHRoaXMgZm9yIHVzLgorICAvLyBJZiB5b3UncmUgdGhpbmtpbmcgdG8geW91cnNl
bGYsICJXaGF0IGFuIG92ZXJzaWdodCEgV2hhdCBhbiBvcHBvcnR1bml0eSB0bworICAvLyBvcHRp
bWl6ZSB0aGlzIGNvZGUhIiB0aGVuIHRvIHlvdSBJIHNheTogc3RvcCEgRm9yIEkgaGF2ZSBhIHRh
bGUgdG8gdGVsbC4KKyAgLy8KKyAgLy8gRmlyc3QsIHRoaXMgY29kZSBtdXN0IGJlIGNvbXBhdGli
bGUgd2l0aCBzaW1wbGUtZG9tIGZvciByZW5kZXJpbmcgb24gdGhlCisgIC8vIHNlcnZlciB3aGVy
ZSB0aGVyZSBpcyBubyByZWFsIERPTS4gUHJldmlvdXNseSwgd2UgYWNjZXNzZWQgYSBjaGlsZCBu
b2RlCisgIC8vIGRpcmVjdGx5IHZpYSBgZWxlbWVudC5jaGlsZE5vZGVzW2luZGV4XWAuIFdoaWxl
IHdlICpjb3VsZCogaW4gdGhlb3J5IGRvIGEKKyAgLy8gZnVsbC1maWRlbGl0eSBzaW11bGF0aW9u
IG9mIGEgbGl2ZSBgY2hpbGROb2Rlc2AgYXJyYXksIHRoaXMgaXMgc2xvdywKKyAgLy8gY29tcGxp
Y2F0ZWQgYW5kIGVycm9yLXByb25lLgorICAvLworICAvLyAiTm8gcHJvYmxlbSwiIHdlIHRob3Vn
aHQsICJ3ZSdsbCBqdXN0IHVzZSB0aGUgc2ltaWxhcgorICAvLyBgY2hpbGROb2Rlcy5pdGVtKGlu
ZGV4KWAgQVBJLiIgVGhlbiwgd2UgY291bGQganVzdCBpbXBsZW1lbnQgb3VyIG93biBgaXRlbWAK
KyAgLy8gbWV0aG9kIGluIHNpbXBsZS1kb20gYW5kIHdhbGsgdGhlIGNoaWxkIG5vZGUgbGlua2Vk
IGxpc3QgdGhlcmUsIGFsbG93aW5nCisgIC8vIHVzIHRvIHJldGFpbiB0aGUgcGVyZm9ybWFuY2Ug
YWR2YW50YWdlcyBvZiB0aGUgKHN1cmVseSBvcHRpbWl6ZWQpIGBpdGVtKClgCisgIC8vIEFQSSBp
biB0aGUgYnJvd3Nlci4KKyAgLy8KKyAgLy8gVW5mb3J0dW5hdGVseSwgYW4gZW50ZXJwcmlzaW5n
IHNvdWwgbmFtZWQgU2FteSBBbHphaHJhbmkgZGlzY292ZXJlZCB0aGF0IGluCisgIC8vIElFOCwg
YWNjZXNzaW5nIGFuIGl0ZW0gb3V0LW9mLWJvdW5kcyB2aWEgYGl0ZW0oKWAgY2F1c2VzIGFuIGV4
Y2VwdGlvbiB3aGVyZQorICAvLyBvdGhlciBicm93c2VycyByZXR1cm4gbnVsbC4gVGhpcyBuZWNl
c3NpdGF0ZWQgYS4uLiBjaGVjayBvZgorICAvLyBgY2hpbGROb2Rlcy5sZW5ndGhgLCBicmluZ2lu
ZyB1cyBiYWNrIGFyb3VuZCB0byBoYXZpbmcgdG8gc3VwcG9ydCBhCisgIC8vIGZ1bGwtZmlkZWxp
dHkgYGNoaWxkTm9kZXNgIGFycmF5IQorICAvLworICAvLyBXb3JzdCBvZiBhbGwsIEtyaXMgU2Vs
ZGVuIGludmVzdGlnYXRlZCBob3cgYnJvd3NlcnMgYXJlIGFjdHVhbHkgaW1wbGVtZW50ZWQKKyAg
Ly8gYW5kIGRpc2NvdmVyZWQgdGhhdCB0aGV5J3JlIGFsbCBsaW5rZWQgbGlzdHMgdW5kZXIgdGhl
IGhvb2QgYW55d2F5LiBBY2Nlc3NpbmcKKyAgLy8gYGNoaWxkTm9kZXNgIHJlcXVpcmVzIHRoZW0g
dG8gYWxsb2NhdGUgYSBuZXcgbGl2ZSBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGF0CisgIC8vIGxp
bmtlZCBsaXN0LCB3aGljaCBpcyBpdHNlbGYgYSByYXRoZXIgZXhwZW5zaXZlIG9wZXJhdGlvbi4g
T3VyIGFzc3VtZWQKKyAgLy8gb3B0aW1pemF0aW9uIGhhZCBiYWNrZmlyZWQhIFRoYXQgaXMgdGhl
IGRhbmdlciBvZiBtYWdpY2FsIHRoaW5raW5nIGFib3V0CisgIC8vIHRoZSBwZXJmb3JtYW5jZSBv
ZiBuYXRpdmUgaW1wbGVtZW50YXRpb25zLgorICAvLworICAvLyBBbmQgdGhpcywgbXkgZnJpZW5k
cywgaXMgd2h5IHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24ganVzdCB3YWxrcyB0aGUKKyAg
Ly8gbGlua2VkIGxpc3QsIGFzIHN1cnByaXNlZCBhcyB0aGF0IG1heSBtYWtlIHlvdS4gUGxlYXNl
IGVuc3VyZSB5b3UgdW5kZXJzdGFuZAorICAvLyB0aGUgYWJvdmUgYmVmb3JlIGNoYW5naW5nIHRo
aXMgYW5kIHN1Ym1pdHRpbmcgYSBQUi4KKyAgLy8KKyAgLy8gVG9tIERhbGUsIEphbnVhcnkgMTh0
aCwgMjAxNSwgUG9ydGxhbmQgT1IKKyAgcHJvdG90eXBlLmNoaWxkQXRJbmRleCA9IGZ1bmN0aW9u
IChlbGVtZW50LCBpbmRleCkgeworICAgIHZhciBub2RlID0gZWxlbWVudC5maXJzdENoaWxkOwor
CisgICAgZm9yICh2YXIgaWR4ID0gMDsgbm9kZSAmJiBpZHggPCBpbmRleDsgaWR4KyspIHsKKyAg
ICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworICAgIH0KKworICAgIHJldHVybiBub2RlOwor
ICB9OworCisgIHByb3RvdHlwZS5hcHBlbmRUZXh0ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHRleHQp
IHsKKyAgICByZXR1cm4gZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmNyZWF0ZVRl
eHROb2RlKHRleHQpKTsKKyAgfTsKKworICBwcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rp
b24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFt
ZSwgU3RyaW5nKHZhbHVlKSk7CisgIH07CisKKyAgcHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1
bmN0aW9uIChlbGVtZW50LCBuYW1lKSB7CisgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRl
KG5hbWUpOworICB9OworCisgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChl
bGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1
dGVOUyhuYW1lc3BhY2UsIG5hbWUsIFN0cmluZyh2YWx1ZSkpOworICB9OworCisgIHByb3RvdHlw
ZS5nZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpIHsK
KyAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUpOworICB9
OworCisgIGlmIChjYW5SZW1vdmVTdmdWaWV3Qm94QXR0cmlidXRlKSB7CisgICAgcHJvdG90eXBl
LnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lKSB7CisgICAgICBlbGVt
ZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9OworICB9IGVsc2UgeworICAgIHByb3Rv
dHlwZS5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgeworICAgICAg
aWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ3N2ZycgJiYgbmFtZSA9PT0gJ3ZpZXdCb3gnKSB7Cisg
ICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG51bGwpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICB9CisgICAgfTsK
KyAgfQorCisgIHByb3RvdHlwZS5zZXRQcm9wZXJ0eVN0cmljdCA9IGZ1bmN0aW9uIChlbGVtZW50
LCBuYW1lLCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICB2
YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgaWYgKHZhbHVlID09PSBudWxsICYmIChuYW1lID09
PSAndmFsdWUnIHx8IG5hbWUgPT09ICd0eXBlJyB8fCBuYW1lID09PSAnc3JjJykpIHsKKyAgICAg
IHZhbHVlID0gJyc7CisgICAgfQorCisgICAgZWxlbWVudFtuYW1lXSA9IHZhbHVlOworICB9Owor
CisgIHByb3RvdHlwZS5nZXRQcm9wZXJ0eVN0cmljdCA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1l
KSB7CisgICAgcmV0dXJuIGVsZW1lbnRbbmFtZV07CisgIH07CisKKyAgcHJvdG90eXBlLnNldFBy
b3BlcnR5ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpIHsKKyAg
ICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3Zn
TmFtZXNwYWNlKSB7CisgICAgICBpZiAoX2RvbUhlbHBlclByb3AuaXNBdHRyUmVtb3ZhbFZhbHVl
KHZhbHVlKSkgeworICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIGlmIChuYW1lc3BhY2UpIHsKKyAgICAgICAgICBlbGVtZW50LnNl
dEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQor
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgX25vcm1hbGl6ZVByb3BlcnR5ID0gX2Rv
bUhlbHBlclByb3Aubm9ybWFsaXplUHJvcGVydHkoZWxlbWVudCwgbmFtZSk7CisKKyAgICAgIHZh
ciBub3JtYWxpemVkID0gX25vcm1hbGl6ZVByb3BlcnR5Lm5vcm1hbGl6ZWQ7CisgICAgICB2YXIg
dHlwZSA9IF9ub3JtYWxpemVQcm9wZXJ0eS50eXBlOworCisgICAgICBpZiAodHlwZSA9PT0gJ3By
b3AnKSB7CisgICAgICAgIGVsZW1lbnRbbm9ybWFsaXplZF0gPSB2YWx1ZTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIGlmIChfZG9tSGVscGVyUHJvcC5pc0F0dHJSZW1vdmFsVmFsdWUodmFsdWUp
KSB7CisgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgaWYgKG5hbWVzcGFjZSAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZU5T
KSB7CisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwg
dmFsdWUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJp
YnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAg
fQorICB9OworCisgIGlmIChkb2MgJiYgZG9jLmNyZWF0ZUVsZW1lbnROUykgeworICAgIC8vIE9u
bHkgb3B0IGludG8gbmFtZXNwYWNlIGRldGVjdGlvbiBpZiBhIGNvbnRleHR1YWxFbGVtZW50Cisg
ICAgLy8gaXMgcGFzc2VkLgorICAgIHByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24g
KHRhZ05hbWUsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5uYW1lc3BhY2U7CisgICAgICBpZiAoY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgaWYg
KHRhZ05hbWUgPT09ICdzdmcnKSB7CisgICAgICAgICAgbmFtZXNwYWNlID0gX2RvbUhlbHBlckJ1
aWxkSHRtbERvbS5zdmdOYW1lc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmFt
ZXNwYWNlID0gaW50ZXJpb3JOYW1lc3BhY2UoY29udGV4dHVhbEVsZW1lbnQpOworICAgICAgICB9
CisgICAgICB9CisgICAgICBpZiAobmFtZXNwYWNlKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIHRhZ05hbWUpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsK
KyAgICAgIH0KKyAgICB9OworICAgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9u
IChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7CisgICAgICBlbGVtZW50LnNldEF0
dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgU3RyaW5nKHZhbHVlKSk7CisgICAgfTsKKyAgfSBl
bHNlIHsKKyAgICBwcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7
CisgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOworICAg
IH07CisgICAgcHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5h
bWVzcGFjZSwgbmFtZSwgdmFsdWUpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUs
IFN0cmluZyh2YWx1ZSkpOworICAgIH07CisgIH0KKworICBwcm90b3R5cGUuYWRkQ2xhc3NlcyA9
IF9kb21IZWxwZXJDbGFzc2VzLmFkZENsYXNzZXM7CisgIHByb3RvdHlwZS5yZW1vdmVDbGFzc2Vz
ID0gX2RvbUhlbHBlckNsYXNzZXMucmVtb3ZlQ2xhc3NlczsKKworICBwcm90b3R5cGUuc2V0TmFt
ZXNwYWNlID0gZnVuY3Rpb24gKG5zKSB7CisgICAgdGhpcy5uYW1lc3BhY2UgPSBuczsKKyAgfTsK
KworICBwcm90b3R5cGUuZGV0ZWN0TmFtZXNwYWNlID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAg
ICB0aGlzLm5hbWVzcGFjZSA9IGludGVyaW9yTmFtZXNwYWNlKGVsZW1lbnQpOworICB9OworCisg
IHByb3RvdHlwZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gKCkgeworICAgIHJl
dHVybiB0aGlzLmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgfTsKKworICBw
cm90b3R5cGUuY3JlYXRlVGV4dE5vZGUgPSBmdW5jdGlvbiAodGV4dCkgeworICAgIHJldHVybiB0
aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOworICB9OworCisgIHByb3RvdHlwZS5j
cmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKHRleHQpIHsKKyAgICByZXR1cm4gdGhpcy5kb2N1bWVu
dC5jcmVhdGVDb21tZW50KHRleHQpOworICB9OworCisgIHByb3RvdHlwZS5yZXBhaXJDbG9uZWRO
b2RlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGJsYW5rQ2hpbGRUZXh0Tm9kZXMsIGlzQ2hlY2tlZCkg
eworICAgIGlmIChkZWxldGVzQmxhbmtUZXh0Tm9kZXMgJiYgYmxhbmtDaGlsZFRleHROb2Rlcy5s
ZW5ndGggPiAwKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmxhbmtDaGlsZFRleHRO
b2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2YXIgdGV4dE5vZGUgPSB0aGlz
LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSwKKyAgICAgICAgICAgIG9mZnNldCA9IGJsYW5r
Q2hpbGRUZXh0Tm9kZXNbaV0sCisgICAgICAgICAgICBiZWZvcmUgPSB0aGlzLmNoaWxkQXRJbmRl
eChlbGVtZW50LCBvZmZzZXQpOworICAgICAgICBpZiAoYmVmb3JlKSB7CisgICAgICAgICAgZWxl
bWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGJlZm9yZSk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICB9CisgICAgaWYgKGlnbm9yZXNDaGVja2VkQXR0cmlidXRlICYmIGlzQ2hlY2tlZCkg
eworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOworICAg
IH0KKyAgfTsKKworICBwcm90b3R5cGUuY2xvbmVOb2RlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGRl
ZXApIHsKKyAgICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSghIWRlZXApOworICAgIHJl
dHVybiBjbG9uZTsKKyAgfTsKKworICBwcm90b3R5cGUuQXR0ck1vcnBoQ2xhc3MgPSBfbW9ycGhB
dHRyLmRlZmF1bHQ7CisKKyAgcHJvdG90eXBlLmNyZWF0ZUF0dHJNb3JwaCA9IGZ1bmN0aW9uIChl
bGVtZW50LCBhdHRyTmFtZSwgbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIHRoaXMuQXR0ck1vcnBo
Q2xhc3MuY3JlYXRlKGVsZW1lbnQsIGF0dHJOYW1lLCB0aGlzLCBuYW1lc3BhY2UpOworICB9Owor
CisgIHByb3RvdHlwZS5FbGVtZW50TW9ycGhDbGFzcyA9IEVsZW1lbnRNb3JwaDsKKworICBwcm90
b3R5cGUuY3JlYXRlRWxlbWVudE1vcnBoID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWVzcGFjZSkg
eworICAgIHJldHVybiBuZXcgdGhpcy5FbGVtZW50TW9ycGhDbGFzcyhlbGVtZW50LCB0aGlzLCBu
YW1lc3BhY2UpOworICB9OworCisgIHByb3RvdHlwZS5jcmVhdGVVbnNhZmVBdHRyTW9ycGggPSBm
dW5jdGlvbiAoZWxlbWVudCwgYXR0ck5hbWUsIG5hbWVzcGFjZSkgeworICAgIHZhciBtb3JwaCA9
IHRoaXMuY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBuYW1lc3BhY2UpOworICAg
IG1vcnBoLmVzY2FwZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgcHJv
dG90eXBlLk1vcnBoQ2xhc3MgPSBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVsdDsKKworICBw
cm90b3R5cGUuY3JlYXRlTW9ycGggPSBmdW5jdGlvbiAocGFyZW50LCBzdGFydCwgZW5kLCBjb250
ZXh0dWFsRWxlbWVudCkgeworICAgIGlmIChjb250ZXh0dWFsRWxlbWVudCAmJiBjb250ZXh0dWFs
RWxlbWVudC5ub2RlVHlwZSA9PT0gMTEpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90
IHBhc3MgYSBmcmFnbWVudCBhcyB0aGUgY29udGV4dHVhbCBlbGVtZW50IHRvIGNyZWF0ZU1vcnBo
Iik7CisgICAgfQorCisgICAgaWYgKCFjb250ZXh0dWFsRWxlbWVudCAmJiBwYXJlbnQgJiYgcGFy
ZW50Lm5vZGVUeXBlID09PSAxKSB7CisgICAgICBjb250ZXh0dWFsRWxlbWVudCA9IHBhcmVudDsK
KyAgICB9CisgICAgdmFyIG1vcnBoID0gbmV3IHRoaXMuTW9ycGhDbGFzcyh0aGlzLCBjb250ZXh0
dWFsRWxlbWVudCk7CisgICAgbW9ycGguZmlyc3ROb2RlID0gc3RhcnQ7CisgICAgbW9ycGgubGFz
dE5vZGUgPSBlbmQ7CisgICAgcmV0dXJuIG1vcnBoOworICB9OworCisgIHByb3RvdHlwZS5jcmVh
dGVGcmFnbWVudE1vcnBoID0gZnVuY3Rpb24gKGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgaWYg
KGNvbnRleHR1YWxFbGVtZW50ICYmIGNvbnRleHR1YWxFbGVtZW50Lm5vZGVUeXBlID09PSAxMSkg
eworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGFzcyBhIGZyYWdtZW50IGFzIHRoZSBj
b250ZXh0dWFsIGVsZW1lbnQgdG8gY3JlYXRlTW9ycGgiKTsKKyAgICB9CisKKyAgICB2YXIgZnJh
Z21lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICByZXR1cm4gX2h0bWxi
YXJzUnVudGltZU1vcnBoLmRlZmF1bHQuY3JlYXRlKHRoaXMsIGNvbnRleHR1YWxFbGVtZW50LCBm
cmFnbWVudCk7CisgIH07CisKKyAgcHJvdG90eXBlLnJlcGxhY2VDb250ZW50V2l0aE1vcnBoID0g
ZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgICB2YXIgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZmlyc3RD
aGlsZDsKKworICAgIGlmICghZmlyc3RDaGlsZCkgeworICAgICAgdmFyIGNvbW1lbnQgPSB0aGlz
LmNyZWF0ZUNvbW1lbnQoJycpOworICAgICAgdGhpcy5hcHBlbmRDaGlsZChlbGVtZW50LCBjb21t
ZW50KTsKKyAgICAgIHJldHVybiBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVsdC5jcmVhdGUo
dGhpcywgZWxlbWVudCwgY29tbWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBtb3JwaCA9
IF9odG1sYmFyc1J1bnRpbWVNb3JwaC5kZWZhdWx0LmF0dGFjaCh0aGlzLCBlbGVtZW50LCBmaXJz
dENoaWxkLCBlbGVtZW50Lmxhc3RDaGlsZCk7CisgICAgICBtb3JwaC5jbGVhcigpOworICAgICAg
cmV0dXJuIG1vcnBoOworICAgIH0KKyAgfTsKKworICBwcm90b3R5cGUuY3JlYXRlVW5zYWZlTW9y
cGggPSBmdW5jdGlvbiAocGFyZW50LCBzdGFydCwgZW5kLCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgIHZhciBtb3JwaCA9IHRoaXMuY3JlYXRlTW9ycGgocGFyZW50LCBzdGFydCwgZW5kLCBjb250
ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGgucGFyc2VUZXh0QXNIVE1MID0gdHJ1ZTsKKyAgICBy
ZXR1cm4gbW9ycGg7CisgIH07CisKKyAgLy8gVGhpcyBoZWxwZXIgaXMganVzdCB0byBrZWVwIHRo
ZSB0ZW1wbGF0ZXMgZ29vZCBsb29raW5nLAorICAvLyBwYXNzaW5nIGludGVnZXJzIGluc3RlYWQg
b2YgZWxlbWVudCByZWZlcmVuY2VzLgorICBwcm90b3R5cGUuY3JlYXRlTW9ycGhBdCA9IGZ1bmN0
aW9uIChwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgIHZhciBzaW5nbGUgPSBzdGFydEluZGV4ID09PSBlbmRJbmRleDsKKyAgICB2YXIgc3RhcnQg
PSB0aGlzLmNoaWxkQXRJbmRleChwYXJlbnQsIHN0YXJ0SW5kZXgpOworICAgIHZhciBlbmQgPSBz
aW5nbGUgPyBzdGFydCA6IHRoaXMuY2hpbGRBdEluZGV4KHBhcmVudCwgZW5kSW5kZXgpOworICAg
IHJldHVybiB0aGlzLmNyZWF0ZU1vcnBoKHBhcmVudCwgc3RhcnQsIGVuZCwgY29udGV4dHVhbEVs
ZW1lbnQpOworICB9OworCisgIHByb3RvdHlwZS5jcmVhdGVVbnNhZmVNb3JwaEF0ID0gZnVuY3Rp
b24gKHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIGNvbnRleHR1YWxFbGVtZW50KSB7Cisg
ICAgdmFyIG1vcnBoID0gdGhpcy5jcmVhdGVNb3JwaEF0KHBhcmVudCwgc3RhcnRJbmRleCwgZW5k
SW5kZXgsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICBtb3JwaC5wYXJzZVRleHRBc0hUTUwgPSB0
cnVlOworICAgIHJldHVybiBtb3JwaDsKKyAgfTsKKworICBwcm90b3R5cGUuaW5zZXJ0TW9ycGhC
ZWZvcmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgcmVmZXJlbmNlQ2hpbGQsIGNvbnRleHR1YWxFbGVt
ZW50KSB7CisgICAgdmFyIGluc2VydGlvbiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgn
Jyk7CisgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoaW5zZXJ0aW9uLCByZWZlcmVuY2VDaGlsZCk7
CisgICAgcmV0dXJuIHRoaXMuY3JlYXRlTW9ycGgoZWxlbWVudCwgaW5zZXJ0aW9uLCBpbnNlcnRp
b24sIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgfTsKKworICBwcm90b3R5cGUuYXBwZW5kTW9ycGgg
PSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgaW5zZXJ0
aW9uID0gdGhpcy5kb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTsKKyAgICBlbGVtZW50LmFwcGVu
ZENoaWxkKGluc2VydGlvbik7CisgICAgcmV0dXJuIHRoaXMuY3JlYXRlTW9ycGgoZWxlbWVudCwg
aW5zZXJ0aW9uLCBpbnNlcnRpb24sIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgfTsKKworICBwcm90
b3R5cGUuaW5zZXJ0Qm91bmRhcnkgPSBmdW5jdGlvbiAoZnJhZ21lbnQsIGluZGV4KSB7CisgICAg
Ly8gdGhpcyB3aWxsIGFsd2F5cyBiZSBudWxsIG9yIGZpcnN0Q2hpbGQKKyAgICB2YXIgY2hpbGQg
PSBpbmRleCA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLmNoaWxkQXRJbmRleChmcmFnbWVudCwgaW5k
ZXgpOworICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmNyZWF0ZVRleHROb2Rl
KCcnKSwgY2hpbGQpOworICB9OworCisgIHByb3RvdHlwZS5zZXRNb3JwaEhUTUwgPSBmdW5jdGlv
biAobW9ycGgsIGh0bWwpIHsKKyAgICBtb3JwaC5zZXRIVE1MKGh0bWwpOworICB9OworCisgIHBy
b3RvdHlwZS5wYXJzZUhUTUwgPSBmdW5jdGlvbiAoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpIHsK
KyAgICB2YXIgY2hpbGROb2RlczsKKworICAgIGlmIChpbnRlcmlvck5hbWVzcGFjZShjb250ZXh0
dWFsRWxlbWVudCkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3ZnTmFtZXNwYWNlKSB7Cisg
ICAgICBjaGlsZE5vZGVzID0gYnVpbGRTVkdET00oaHRtbCwgdGhpcyk7CisgICAgfSBlbHNlIHsK
KyAgICAgIHZhciBub2RlcyA9IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uYnVpbGRIVE1MRE9NKGh0
bWwsIGNvbnRleHR1YWxFbGVtZW50LCB0aGlzKTsKKyAgICAgIGlmIChkZXRlY3RPbWl0dGVkU3Rh
cnRUYWcoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpKSB7CisgICAgICAgIHZhciBub2RlID0gbm9k
ZXNbMF07CisgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUubm9kZVR5cGUgIT09IDEpIHsKKyAg
ICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgICAgfQorICAgICAgICBjaGls
ZE5vZGVzID0gbm9kZS5jaGlsZE5vZGVzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hpbGRO
b2RlcyA9IG5vZGVzOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgbm9kZSBsaXN0IHRv
IGEgZnJhZ21lbnQuCisgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVEb2N1
bWVudEZyYWdtZW50KCk7CisKKyAgICBpZiAoY2hpbGROb2RlcyAmJiBjaGlsZE5vZGVzLmxlbmd0
aCA+IDApIHsKKyAgICAgIHZhciBjdXJyZW50Tm9kZSA9IGNoaWxkTm9kZXNbMF07CisKKyAgICAg
IC8vIFdlIHByZXBlbmQgYW4gPG9wdGlvbj4gdG8gPHNlbGVjdD4gYm94ZXMgdG8gYWJzb3JiIGFu
eSBicm93c2VyIGJ1Z3MKKyAgICAgIC8vIHJlbGF0ZWQgdG8gYXV0by1zZWxlY3QgYmVoYXZpb3Iu
IFNraXAgcGFzdCBpdC4KKyAgICAgIGlmIChjb250ZXh0dWFsRWxlbWVudC50YWdOYW1lID09PSAn
U0VMRUNUJykgeworICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5n
OworICAgICAgfQorCisgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKKyAgICAgICAgdmFyIHRl
bXBOb2RlID0gY3VycmVudE5vZGU7CisgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUu
bmV4dFNpYmxpbmc7CisKKyAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcE5vZGUpOwor
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmcmFnbWVudDsKKyAgfTsKKworICB2YXIgbm9k
ZVVSTDsKKyAgdmFyIHBhcnNpbmdOb2RlOworCisgIGZ1bmN0aW9uIGluc3RhbGxFbnZpcm9ubWVu
dFNwZWNpZmljTWV0aG9kcyhkb21IZWxwZXIpIHsKKyAgICB2YXIgcHJvdG9jb2wgPSBicm93c2Vy
UHJvdG9jb2xGb3JVUkwuY2FsbChkb21IZWxwZXIsICdmb29iYXI6YmF6Jyk7CisKKyAgICAvLyBU
ZXN0IHRvIHNlZSBpZiBvdXIgRE9NIGltcGxlbWVudGF0aW9uIHBhcnNlcworICAgIC8vIGFuZCBu
b3JtYWxpemVzIFVSTHMuCisgICAgaWYgKHByb3RvY29sID09PSAnZm9vYmFyOicpIHsKKyAgICAg
IC8vIFN3YXAgaW4gdGhlIG1ldGhvZCB0aGF0IGRvZXNuJ3QgZG8gdGhpcyB0ZXN0IG5vdyB0aGF0
CisgICAgICAvLyB3ZSBrbm93IGl0IHdvcmtzLgorICAgICAgZG9tSGVscGVyLnByb3RvY29sRm9y
VVJMID0gYnJvd3NlclByb3RvY29sRm9yVVJMOworICAgIH0gZWxzZSBpZiAodHlwZW9mIFVSTCA9
PT0gJ29iamVjdCcpIHsKKyAgICAgIC8vIFVSTCBnbG9iYWxseSBwcm92aWRlZCwgbGlrZWx5IGZy
b20gRmFzdEJvb3QncyBzYW5kYm94CisgICAgICBub2RlVVJMID0gVVJMOworICAgICAgZG9tSGVs
cGVyLnByb3RvY29sRm9yVVJMID0gbm9kZVByb3RvY29sRm9yVVJMOworICAgIH0gZWxzZSBpZiAo
dHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5yZXF1aXJlID09PSAn
ZnVuY3Rpb24nKSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRv
IG91ciBvd24gVVJMIHBhcnNpbmcuCisgICAgICAvLyBHbG9iYWwgYHJlcXVpcmVgIGlzIHNoYWRv
d2VkIGJ5IEVtYmVyJ3MgbG9hZGVyIHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBmdWxseQorICAgICAg
Ly8gcXVhbGlmaWVkIGBtb2R1bGUucmVxdWlyZWAuCisgICAgICBub2RlVVJMID0gbW9kdWxlLnJl
cXVpcmUoJ3VybCcpOworICAgICAgZG9tSGVscGVyLnByb3RvY29sRm9yVVJMID0gbm9kZVByb3Rv
Y29sRm9yVVJMOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRPTSBIZWxw
ZXIgY291bGQgbm90IGZpbmQgdmFsaWQgVVJMIHBhcnNpbmcgbWVjaGFuaXNtIik7CisgICAgfQor
CisgICAgLy8gQSBTaW1wbGVET00tc3BlY2lmaWMgZXh0ZW5zaW9uIHRoYXQgYWxsb3dzIHVzIHRv
IHBsYWNlIEhUTUwgZGlyZWN0bHkKKyAgICAvLyBpbnRvIHRoZSBET00gdHJlZSwgZm9yIHdoZW4g
dGhlIG91dHB1dCB0YXJnZXQgaXMgYWx3YXlzIHNlcmlhbGl6ZWQgSFRNTC4KKyAgICBpZiAoZG9t
SGVscGVyLmRvY3VtZW50LmNyZWF0ZVJhd0hUTUxTZWN0aW9uKSB7CisgICAgICBkb21IZWxwZXIu
c2V0TW9ycGhIVE1MID0gbm9kZVNldE1vcnBoSFRNTDsKKyAgICB9CisgIH0KKworICBmdW5jdGlv
biBub2RlU2V0TW9ycGhIVE1MKG1vcnBoLCBodG1sKSB7CisgICAgdmFyIHNlY3Rpb24gPSB0aGlz
LmRvY3VtZW50LmNyZWF0ZVJhd0hUTUxTZWN0aW9uKGh0bWwpOworICAgIG1vcnBoLnNldE5vZGUo
c2VjdGlvbik7CisgIH0KKworICBmdW5jdGlvbiBicm93c2VyUHJvdG9jb2xGb3JVUkwodXJsKSB7
CisgICAgaWYgKCFwYXJzaW5nTm9kZSkgeworICAgICAgcGFyc2luZ05vZGUgPSB0aGlzLmRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgICB9CisKKyAgICBwYXJzaW5nTm9kZS5ocmVmID0g
dXJsOworICAgIHJldHVybiBwYXJzaW5nTm9kZS5wcm90b2NvbDsKKyAgfQorCisgIGZ1bmN0aW9u
IG5vZGVQcm90b2NvbEZvclVSTCh1cmwpIHsKKyAgICB2YXIgcHJvdG9jb2wgPSBub2RlVVJMLnBh
cnNlKHVybCkucHJvdG9jb2w7CisgICAgcmV0dXJuIHByb3RvY29sID09PSBudWxsID8gJzonIDog
cHJvdG9jb2w7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBET01IZWxwZXI7Cit9KTsKK2Vu
aWZlZCgnZG9tLWhlbHBlci9idWlsZC1odG1sLWRvbScsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAo
ZXhwb3J0cykgeworICAvKiBnbG9iYWwgWE1MU2VyaWFsaXplcjpmYWxzZSAqLworICAndXNlIHN0
cmljdCc7CisKKyAgdmFyIHN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50cyA9IHsgZm9yZWlnbk9iamVj
dDogMSwgZGVzYzogMSwgdGl0bGU6IDEgfTsKKyAgZXhwb3J0cy5zdmdIVE1MSW50ZWdyYXRpb25Q
b2ludHMgPSBzdmdIVE1MSW50ZWdyYXRpb25Qb2ludHM7CisgIHZhciBzdmdOYW1lc3BhY2UgPSAn
aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOworCisgIGV4cG9ydHMuc3ZnTmFtZXNwYWNlID0g
c3ZnTmFtZXNwYWNlOworICB2YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVk
JyA/IGZhbHNlIDogZG9jdW1lbnQ7CisKKyAgLy8gU2FmYXJpIGRvZXMgbm90IGxpa2UgdXNpbmcg
aW5uZXJIVE1MIG9uIFNWRyBIVE1MIGludGVncmF0aW9uCisgIC8vIHBvaW50cyAoZGVzYy90aXRs
ZS9mb3JlaWduT2JqZWN0KS4KKyAgdmFyIG5lZWRzSW50ZWdyYXRpb25Qb2ludEZpeCA9IGRvYyAm
JiAoZnVuY3Rpb24gKGRvY3VtZW50KSB7CisgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRO
UyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEluIEZGIHRp
dGxlIHdpbGwgbm90IGFjY2VwdCBpbm5lckhUTUwuCisgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnROUyhzdmdOYW1lc3BhY2UsICd0aXRsZScpOworICAgIHRlc3RFbC5pbm5l
ckhUTUwgPSAiPGRpdj48L2Rpdj4iOworICAgIHJldHVybiB0ZXN0RWwuY2hpbGROb2Rlcy5sZW5n
dGggPT09IDAgfHwgdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgIT09IDE7CisgIH0pKGRv
Yyk7CisKKyAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgcHJpb3IgdG8gOSBkb2VzIG5vdCBhbGxvdyBz
ZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmlyc3QgZWxlbWVudAorICAvLyBpcyBhICJ6ZXJvLXNj
b3BlIiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5n
CisgIC8vIHRoZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0ZXh0IG5vZGUuIFdlLCBsaWtlIE1v
ZGVybml6ciwgdXNlICZzaHk7CisgIHZhciBuZWVkc1NoeSA9IGRvYyAmJiAoZnVuY3Rpb24gKGRv
Y3VtZW50KSB7CisgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp
OworICAgIHRlc3RFbC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4iOworICAgIHRlc3RFbC5maXJz
dENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0PjxcL3NjcmlwdD4iOworICAgIHJldHVybiB0ZXN0
RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOworICB9KShkb2MpOworCisgIC8vIElFIDgg
KGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcK
KyAgLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0IHdl
IGNhbgorICAvLyBhY2NpZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3BhY2Ugd2hlbiB1cGRhdGluZyBh
IG1vcnBoLgorICB2YXIgbW92ZXNXaGl0ZXNwYWNlID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1l
bnQpIHsKKyAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Cisg
ICAgdGVzdEVsLmlubmVySFRNTCA9ICJUZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhv
bGRlcic+PFwvc2NyaXB0PlZhbHVlIjsKKyAgICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0u
bm9kZVZhbHVlID09PSAnVGVzdDonICYmIHRlc3RFbC5jaGlsZE5vZGVzWzJdLm5vZGVWYWx1ZSA9
PT0gJyBWYWx1ZSc7CisgIH0pKGRvYyk7CisKKyAgdmFyIHRhZ05hbWVzUmVxdWlyaW5nSW5uZXJI
VE1MRml4ID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgdGFnTmFtZXNS
ZXF1aXJpbmdJbm5lckhUTUxGaXg7CisgICAgLy8gSUUgOSBhbmQgZWFybGllciBkb24ndCBhbGxv
dyB1cyB0byBzZXQgaW5uZXJIVE1MIG9uIGNvbCwgY29sZ3JvdXAsIGZyYW1lc2V0LAorICAgIC8v
IGh0bWwsIHN0eWxlLCB0YWJsZSwgdGJvZHksIHRmb290LCB0aGVhZCwgdGl0bGUsIHRyLiBEZXRl
Y3QgdGhpcyBhbmQgYWRkCisgICAgLy8gdGhlbSB0byBhbiBpbml0aWFsIGxpc3Qgb2YgY29ycmVj
dGVkIHRhZ3MuCisgICAgLy8KKyAgICAvLyBIZXJlIHdlIGFyZSBvbmx5IGRlYWxpbmcgd2l0aCB0
aGUgb25lcyB3aGljaCBjYW4gaGF2ZSBjaGlsZCBub2Rlcy4KKyAgICAvLworICAgIHZhciB0YWJs
ZU5lZWRzSW5uZXJIVE1MRml4OworICAgIHZhciB0YWJsZUlubmVySFRNTFRlc3RFbGVtZW50ID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTsKKyAgICB0cnkgeworICAgICAgdGFibGVJ
bm5lckhUTUxUZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnPHRib2R5PjwvdGJvZHk+JzsKKyAgICB9
IGNhdGNoIChlKSB7fSBmaW5hbGx5IHsKKyAgICAgIHRhYmxlTmVlZHNJbm5lckhUTUxGaXggPSB0
YWJsZUlubmVySFRNTFRlc3RFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOworICAgIH0K
KyAgICBpZiAodGFibGVOZWVkc0lubmVySFRNTEZpeCkgeworICAgICAgdGFnTmFtZXNSZXF1aXJp
bmdJbm5lckhUTUxGaXggPSB7CisgICAgICAgIGNvbGdyb3VwOiBbJ3RhYmxlJ10sCisgICAgICAg
IHRhYmxlOiBbXSwKKyAgICAgICAgdGJvZHk6IFsndGFibGUnXSwKKyAgICAgICAgdGZvb3Q6IFsn
dGFibGUnXSwKKyAgICAgICAgdGhlYWQ6IFsndGFibGUnXSwKKyAgICAgICAgdHI6IFsndGFibGUn
LCAndGJvZHknXQorICAgICAgfTsKKyAgICB9CisKKyAgICAvLyBJRSA4IGRvZXNuJ3QgYWxsb3cg
c2V0dGluZyBpbm5lckhUTUwgb24gYSBzZWxlY3QgdGFnLiBEZXRlY3QgdGhpcyBhbmQKKyAgICAv
LyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgY29ycmVjdGVkIHRhZ3MuCisgICAgLy8KKyAgICB2YXIg
c2VsZWN0SW5uZXJIVE1MVGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxl
Y3QnKTsKKyAgICBzZWxlY3RJbm5lckhUTUxUZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnPG9wdGlv
bj48L29wdGlvbj4nOworICAgIGlmICghc2VsZWN0SW5uZXJIVE1MVGVzdEVsZW1lbnQuY2hpbGRO
b2Rlc1swXSkgeworICAgICAgdGFnTmFtZXNSZXF1aXJpbmdJbm5lckhUTUxGaXggPSB0YWdOYW1l
c1JlcXVpcmluZ0lubmVySFRNTEZpeCB8fCB7fTsKKyAgICAgIHRhZ05hbWVzUmVxdWlyaW5nSW5u
ZXJIVE1MRml4LnNlbGVjdCA9IFtdOworICAgIH0KKyAgICByZXR1cm4gdGFnTmFtZXNSZXF1aXJp
bmdJbm5lckhUTUxGaXg7CisgIH0pKGRvYyk7CisKKyAgZnVuY3Rpb24gc2NyaXB0U2FmZUlubmVy
SFRNTChlbGVtZW50LCBodG1sKSB7CisgICAgLy8gd2l0aG91dCBhIGxlYWRpbmcgdGV4dCBub2Rl
LCBJRSB3aWxsIGRyb3AgYSBsZWFkaW5nIHNjcmlwdCB0YWcuCisgICAgaHRtbCA9ICcmc2h5Oycg
KyBodG1sOworCisgICAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1sOworCisgICAgdmFyIG5vZGVz
ID0gZWxlbWVudC5jaGlsZE5vZGVzOworCisgICAgLy8gTG9vayBmb3IgJnNoeTsgdG8gcmVtb3Zl
IGl0LgorICAgIHZhciBzaHlFbGVtZW50ID0gbm9kZXNbMF07CisgICAgd2hpbGUgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKKyAgICAgIHNoeUVs
ZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgfQorICAgIC8vIEF0IHRoaXMgcG9p
bnQgaXQncyB0aGUgYWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgorICAgIGlmIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1
MDBBRCIpIHsKKyAgICAgIHZhciBuZXdWYWx1ZSA9IHNoeUVsZW1lbnQubm9kZVZhbHVlLnNsaWNl
KDEpOworICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCkgeworICAgICAgICBzaHlFbGVtZW50Lm5v
ZGVWYWx1ZSA9IHNoeUVsZW1lbnQubm9kZVZhbHVlLnNsaWNlKDEpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgc2h5RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNoeUVsZW1lbnQpOwor
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub2RlczsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1
aWxkRE9NV2l0aEZpeChodG1sLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHZhciB0YWdOYW1l
ID0gY29udGV4dHVhbEVsZW1lbnQudGFnTmFtZTsKKworICAgIC8vIEZpcmVmb3ggdmVyc2lvbnMg
PCAxMSBkbyBub3QgaGF2ZSBzdXBwb3J0IGZvciBlbGVtZW50Lm91dGVySFRNTC4KKyAgICB2YXIg
b3V0ZXJIVE1MID0gY29udGV4dHVhbEVsZW1lbnQub3V0ZXJIVE1MIHx8IG5ldyBYTUxTZXJpYWxp
emVyKCkuc2VyaWFsaXplVG9TdHJpbmcoY29udGV4dHVhbEVsZW1lbnQpOworICAgIGlmICghb3V0
ZXJIVE1MKSB7CisgICAgICB0aHJvdyAiQ2FuJ3Qgc2V0IGlubmVySFRNTCBvbiAiICsgdGFnTmFt
ZSArICIgaW4gdGhpcyBicm93c2VyIjsKKyAgICB9CisKKyAgICBodG1sID0gZml4U2VsZWN0KGh0
bWwsIGNvbnRleHR1YWxFbGVtZW50KTsKKworICAgIHZhciB3cmFwcGluZ1RhZ3MgPSB0YWdOYW1l
c1JlcXVpcmluZ0lubmVySFRNTEZpeFt0YWdOYW1lLnRvTG93ZXJDYXNlKCldOworCisgICAgdmFy
IHN0YXJ0VGFnID0gb3V0ZXJIVE1MLm1hdGNoKG5ldyBSZWdFeHAoIjwiICsgdGFnTmFtZSArICIo
W14+XSopPiIsICdpJykpWzBdOworICAgIHZhciBlbmRUYWcgPSAnPC8nICsgdGFnTmFtZSArICc+
JzsKKworICAgIHZhciB3cmFwcGVkSFRNTCA9IFtzdGFydFRhZywgaHRtbCwgZW5kVGFnXTsKKwor
ICAgIHZhciBpID0gd3JhcHBpbmdUYWdzLmxlbmd0aDsKKyAgICB2YXIgd3JhcHBlZERlcHRoID0g
MSArIGk7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgd3JhcHBlZEhUTUwudW5zaGlmdCgnPCcg
KyB3cmFwcGluZ1RhZ3NbaV0gKyAnPicpOworICAgICAgd3JhcHBlZEhUTUwucHVzaCgnPC8nICsg
d3JhcHBpbmdUYWdzW2ldICsgJz4nKTsKKyAgICB9CisKKyAgICB2YXIgd3JhcHBlciA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgIHNjcmlwdFNhZmVJbm5lckhUTUwod3JhcHBl
ciwgd3JhcHBlZEhUTUwuam9pbignJykpOworICAgIHZhciBlbGVtZW50ID0gd3JhcHBlcjsKKyAg
ICB3aGlsZSAod3JhcHBlZERlcHRoLS0pIHsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmZpcnN0
Q2hpbGQ7CisgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7
CisgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgICAgfQorICAgIH0K
KyAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgIT09IHRhZ05hbWUpIHsKKyAg
ICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgIH0KKyAgICByZXR1cm4gZWxl
bWVudCA/IGVsZW1lbnQuY2hpbGROb2RlcyA6IFtdOworICB9CisKKyAgdmFyIGJ1aWxkRE9NOwor
ICBpZiAobmVlZHNTaHkpIHsKKyAgICBidWlsZERPTSA9IGZ1bmN0aW9uIGJ1aWxkRE9NKGh0bWws
IGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIGh0bWwgPSBmaXhTZWxlY3QoaHRtbCwg
Y29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICBjb250ZXh0dWFsRWxlbWVudCA9IGRvbS5jbG9u
ZU5vZGUoY29udGV4dHVhbEVsZW1lbnQsIGZhbHNlKTsKKyAgICAgIHNjcmlwdFNhZmVJbm5lckhU
TUwoY29udGV4dHVhbEVsZW1lbnQsIGh0bWwpOworICAgICAgcmV0dXJuIGNvbnRleHR1YWxFbGVt
ZW50LmNoaWxkTm9kZXM7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBidWlsZERPTSA9IGZ1bmN0
aW9uIGJ1aWxkRE9NKGh0bWwsIGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIGh0bWwg
PSBmaXhTZWxlY3QoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICBjb250ZXh0dWFs
RWxlbWVudCA9IGRvbS5jbG9uZU5vZGUoY29udGV4dHVhbEVsZW1lbnQsIGZhbHNlKTsKKyAgICAg
IGNvbnRleHR1YWxFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7CisgICAgICByZXR1cm4gY29udGV4
dHVhbEVsZW1lbnQuY2hpbGROb2RlczsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZml4U2Vs
ZWN0KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgaWYgKGNvbnRleHR1YWxFbGVtZW50
LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7CisgICAgICBodG1sID0gIjxvcHRpb24+PC9vcHRpb24+
IiArIGh0bWw7CisgICAgfQorCisgICAgcmV0dXJuIGh0bWw7CisgIH0KKworICB2YXIgYnVpbGRJ
RVNhZmVET007CisgIGlmICh0YWdOYW1lc1JlcXVpcmluZ0lubmVySFRNTEZpeCB8fCBtb3Zlc1do
aXRlc3BhY2UpIHsKKyAgICBidWlsZElFU2FmZURPTSA9IGZ1bmN0aW9uIGJ1aWxkSUVTYWZlRE9N
KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIC8vIE1ha2UgYSBsaXN0IG9m
IHRoZSBsZWFkaW5nIHRleHQgb24gc2NyaXB0IG5vZGVzLiBJbmNsdWRlCisgICAgICAvLyBzY3Jp
cHQgdGFncyB3aXRob3V0IGFueSB3aGl0ZXNwYWNlIGZvciBlYXNpZXIgcHJvY2Vzc2luZyBsYXRl
ci4KKyAgICAgIHZhciBzcGFjZXNCZWZvcmUgPSBbXTsKKyAgICAgIHZhciBzcGFjZXNBZnRlciA9
IFtdOworICAgICAgaWYgKHR5cGVvZiBodG1sID09PSAnc3RyaW5nJykgeworICAgICAgICBodG1s
ID0gaHRtbC5yZXBsYWNlKC8oXHMqKSg8c2NyaXB0KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHNwYWNl
cywgdGFnKSB7CisgICAgICAgICAgc3BhY2VzQmVmb3JlLnB1c2goc3BhY2VzKTsKKyAgICAgICAg
ICByZXR1cm4gdGFnOworICAgICAgICB9KTsKKworICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNl
KC8oPFwvc2NyaXB0PikoXHMqKS9nLCBmdW5jdGlvbiAobWF0Y2gsIHRhZywgc3BhY2VzKSB7Cisg
ICAgICAgICAgc3BhY2VzQWZ0ZXIucHVzaChzcGFjZXMpOworICAgICAgICAgIHJldHVybiB0YWc7
CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICAvLyBGZXRjaCBub2RlcworICAgICAgdmFy
IG5vZGVzOworICAgICAgaWYgKHRhZ05hbWVzUmVxdWlyaW5nSW5uZXJIVE1MRml4W2NvbnRleHR1
YWxFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pIHsKKyAgICAgICAgLy8gYnVpbGRET01X
aXRoRml4IHVzZXMgc3RyaW5nIHdyYXBwZXJzIGZvciBwcm9ibGVtYXRpYyBpbm5lckhUTUwuCisg
ICAgICAgIG5vZGVzID0gYnVpbGRET01XaXRoRml4KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50KTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGVzID0gYnVpbGRET00oaHRtbCwgY29udGV4dHVh
bEVsZW1lbnQsIGRvbSk7CisgICAgICB9CisKKyAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBzY3Jp
cHQgdGFncywgdGhlIG5vZGVzIHRoZW1zZWx2ZXMgd2lsbCBiZQorICAgICAgLy8gbXV0YXRlZCBh
cyB3ZSBhZGQgdGVzdCBub2Rlcy4KKyAgICAgIHZhciBpLCBqLCBub2RlLCBub2RlU2NyaXB0Tm9k
ZXM7CisgICAgICB2YXIgc2NyaXB0Tm9kZXMgPSBbXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBu
b2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBub2RlID0gbm9kZXNbaV07CisgICAgICAgIGlm
IChub2RlLm5vZGVUeXBlICE9PSAxKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsKKyAgICAgICAgICBzY3Jp
cHROb2Rlcy5wdXNoKG5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5vZGVTY3Jp
cHROb2RlcyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOworICAgICAgICAg
IGZvciAoaiA9IDA7IGogPCBub2RlU2NyaXB0Tm9kZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAg
ICAgIHNjcmlwdE5vZGVzLnB1c2gobm9kZVNjcmlwdE5vZGVzW2pdKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gV2FsayB0aGUgc2NyaXB0IHRhZ3MgYW5kIHB1
dCBiYWNrIHRoZWlyIGxlYWRpbmcgdGV4dCBub2Rlcy4KKyAgICAgIHZhciBzY3JpcHROb2RlLCB0
ZXh0Tm9kZSwgc3BhY2VCZWZvcmUsIHNwYWNlQWZ0ZXI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwg
c2NyaXB0Tm9kZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2NyaXB0Tm9kZSA9IHNjcmlwdE5v
ZGVzW2ldOworICAgICAgICBzcGFjZUJlZm9yZSA9IHNwYWNlc0JlZm9yZVtpXTsKKyAgICAgICAg
aWYgKHNwYWNlQmVmb3JlICYmIHNwYWNlQmVmb3JlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICB0
ZXh0Tm9kZSA9IGRvbS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzcGFjZUJlZm9yZSk7CisgICAg
ICAgICAgc2NyaXB0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgc2NyaXB0
Tm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBzcGFjZUFmdGVyID0gc3BhY2VzQWZ0ZXJbaV07
CisgICAgICAgIGlmIChzcGFjZUFmdGVyICYmIHNwYWNlQWZ0ZXIubGVuZ3RoID4gMCkgeworICAg
ICAgICAgIHRleHROb2RlID0gZG9tLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNwYWNlQWZ0ZXIp
OworICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dE5vZGUs
IHNjcmlwdE5vZGUubmV4dFNpYmxpbmcpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBub2RlczsKKyAgICB9OworICB9IGVsc2UgeworICAgIGJ1aWxkSUVTYWZlRE9NID0gYnVp
bGRET007CisgIH0KKworICB2YXIgYnVpbGRIVE1MRE9NOworICBpZiAobmVlZHNJbnRlZ3JhdGlv
blBvaW50Rml4KSB7CisgICAgZXhwb3J0cy5idWlsZEhUTUxET00gPSBidWlsZEhUTUxET00gPSBm
dW5jdGlvbiBidWlsZEhUTUxET00oaHRtbCwgY29udGV4dHVhbEVsZW1lbnQsIGRvbSkgeworICAg
ICAgaWYgKHN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50c1tjb250ZXh0dWFsRWxlbWVudC50YWdOYW1l
XSkgeworICAgICAgICByZXR1cm4gYnVpbGRJRVNhZmVET00oaHRtbCwgZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnZGl2JyksIGRvbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYnVp
bGRJRVNhZmVET00oaHRtbCwgY29udGV4dHVhbEVsZW1lbnQsIGRvbSk7CisgICAgICB9CisgICAg
fTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRzLmJ1aWxkSFRNTERPTSA9IGJ1aWxkSFRNTERPTSA9
IGJ1aWxkSUVTYWZlRE9NOworICB9CisKKyAgZXhwb3J0cy5idWlsZEhUTUxET00gPSBidWlsZEhU
TUxET007Cit9KTsKK2VuaWZlZCgnZG9tLWhlbHBlci9jbGFzc2VzJywgWydleHBvcnRzJ10sIGZ1
bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgZG9jID0gdHlwZW9m
IGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogZG9jdW1lbnQ7CisKKyAgLy8gUGhh
bnRvbUpTIGhhcyBhIGJyb2tlbiBjbGFzc0xpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXJp
eWEvcGhhbnRvbWpzL2lzc3Vlcy8xMjc4MgorICB2YXIgY2FuQ2xhc3NMaXN0ID0gZG9jICYmIChm
dW5jdGlvbiAoKSB7CisgICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsK
KyAgICBpZiAoIWQuY2xhc3NMaXN0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGQuY2xhc3NMaXN0LmFkZCgnYm9vJyk7CisgICAgZC5jbGFzc0xpc3QuYWRkKCdib28nLCAnYmF6
Jyk7CisgICAgcmV0dXJuIGQuY2xhc3NOYW1lID09PSAnYm9vIGJheic7CisgIH0pKCk7CisKKyAg
ZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoZWxlbWVudCkgeworICAgIHZhciBjbGFzc1N0cmluZyA9
IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnOworICAgIHJldHVybiBjbGFzc1N0
cmluZyAhPT0gJycgJiYgY2xhc3NTdHJpbmcgIT09ICcgJyA/IGNsYXNzU3RyaW5nLnNwbGl0KCcg
JykgOiBbXTsKKyAgfQorCisgIGZ1bmN0aW9uIGludGVyc2VjdChjb250YWluaW5nQXJyYXksIHZh
bHVlc0FycmF5KSB7CisgICAgdmFyIGNvbnRhaW5pbmdJbmRleCA9IDA7CisgICAgdmFyIGNvbnRh
aW5pbmdMZW5ndGggPSBjb250YWluaW5nQXJyYXkubGVuZ3RoOworICAgIHZhciB2YWx1ZXNJbmRl
eCA9IDA7CisgICAgdmFyIHZhbHVlc0xlbmd0aCA9IHZhbHVlc0FycmF5Lmxlbmd0aDsKKworICAg
IHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgQXJyYXkodmFsdWVzTGVuZ3RoKTsKKworICAgIC8vIFRP
RE86IHJld3JpdGUgdGhpcyBsb29wIGluIGFuIG9wdGltYWwgbWFubmVyCisgICAgZm9yICg7IGNv
bnRhaW5pbmdJbmRleCA8IGNvbnRhaW5pbmdMZW5ndGg7IGNvbnRhaW5pbmdJbmRleCsrKSB7Cisg
ICAgICB2YWx1ZXNJbmRleCA9IDA7CisgICAgICBmb3IgKDsgdmFsdWVzSW5kZXggPCB2YWx1ZXNM
ZW5ndGg7IHZhbHVlc0luZGV4KyspIHsKKyAgICAgICAgaWYgKHZhbHVlc0FycmF5W3ZhbHVlc0lu
ZGV4XSA9PT0gY29udGFpbmluZ0FycmF5W2NvbnRhaW5pbmdJbmRleF0pIHsKKyAgICAgICAgICBp
bnRlcnNlY3Rpb25bdmFsdWVzSW5kZXhdID0gY29udGFpbmluZ0luZGV4OworICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGludGVyc2VjdGlv
bjsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZENsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xh
c3NOYW1lcykgeworICAgIHZhciBleGlzdGluZ0NsYXNzZXMgPSBidWlsZENsYXNzTGlzdChlbGVt
ZW50KTsKKworICAgIHZhciBpbmRleGVzID0gaW50ZXJzZWN0KGV4aXN0aW5nQ2xhc3NlcywgY2xh
c3NOYW1lcyk7CisgICAgdmFyIGRpZENoYW5nZSA9IGZhbHNlOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjbGFzc05hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaWYgKGluZGV4
ZXNbaV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAgICAg
ICBleGlzdGluZ0NsYXNzZXMucHVzaChjbGFzc05hbWVzW2ldKTsKKyAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoZGlkQ2hhbmdlKSB7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3Mn
LCBleGlzdGluZ0NsYXNzZXMubGVuZ3RoID4gMCA/IGV4aXN0aW5nQ2xhc3Nlcy5qb2luKCcgJykg
OiAnJyk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlc1ZpYUF0dHJpYnV0
ZShlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgdmFyIGV4aXN0aW5nQ2xhc3NlcyA9IGJ1aWxk
Q2xhc3NMaXN0KGVsZW1lbnQpOworCisgICAgdmFyIGluZGV4ZXMgPSBpbnRlcnNlY3QoY2xhc3NO
YW1lcywgZXhpc3RpbmdDbGFzc2VzKTsKKyAgICB2YXIgZGlkQ2hhbmdlID0gZmFsc2U7CisgICAg
dmFyIG5ld0NsYXNzZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXhpc3RpbmdD
bGFzc2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaWYgKGluZGV4ZXNbaV0gPT09IHVu
ZGVmaW5lZCkgeworICAgICAgICBuZXdDbGFzc2VzLnB1c2goZXhpc3RpbmdDbGFzc2VzW2ldKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpZENoYW5nZSA9IHRydWU7CisgICAgICB9CisgICAg
fQorCisgICAgaWYgKGRpZENoYW5nZSkgeworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Ns
YXNzJywgbmV3Q2xhc3Nlcy5sZW5ndGggPiAwID8gbmV3Q2xhc3Nlcy5qb2luKCcgJykgOiAnJyk7
CisgICAgfQorICB9CisKKyAgdmFyIGFkZENsYXNzZXMsIHJlbW92ZUNsYXNzZXM7CisgIGlmIChj
YW5DbGFzc0xpc3QpIHsKKyAgICBleHBvcnRzLmFkZENsYXNzZXMgPSBhZGRDbGFzc2VzID0gZnVu
Y3Rpb24gYWRkQ2xhc3NlcyhlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgICBpZiAoZWxlbWVu
dC5jbGFzc0xpc3QpIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAxKSB7Cisg
ICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbMF0pOworICAgICAgICB9
IGVsc2UgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAyKSB7CisgICAgICAgICAgZWxlbWVudC5j
bGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbMF0sIGNsYXNzTmFtZXNbMV0pOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZC5hcHBseShlbGVtZW50LmNsYXNz
TGlzdCwgY2xhc3NOYW1lcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFk
ZENsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xhc3NOYW1lcyk7CisgICAgICB9CisgICAg
fTsKKyAgICBleHBvcnRzLnJlbW92ZUNsYXNzZXMgPSByZW1vdmVDbGFzc2VzID0gZnVuY3Rpb24g
cmVtb3ZlQ2xhc3NlcyhlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgICBpZiAoZWxlbWVudC5j
bGFzc0xpc3QpIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAxKSB7CisgICAg
ICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbMF0pOworICAgICAgICB9
IGVsc2UgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAyKSB7CisgICAgICAgICAgZWxlbWVudC5j
bGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbMF0sIGNsYXNzTmFtZXNbMV0pOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZS5hcHBseShlbGVtZW50
LmNsYXNzTGlzdCwgY2xhc3NOYW1lcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJlbW92ZUNsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xhc3NOYW1lcyk7CisgICAg
ICB9CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRzLmFkZENsYXNzZXMgPSBhZGRDbGFz
c2VzID0gYWRkQ2xhc3Nlc1ZpYUF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLnJlbW92ZUNsYXNzZXMg
PSByZW1vdmVDbGFzc2VzID0gcmVtb3ZlQ2xhc3Nlc1ZpYUF0dHJpYnV0ZTsKKyAgfQorCisgIGV4
cG9ydHMuYWRkQ2xhc3NlcyA9IGFkZENsYXNzZXM7CisgIGV4cG9ydHMucmVtb3ZlQ2xhc3NlcyA9
IHJlbW92ZUNsYXNzZXM7Cit9KTsKK2VuaWZlZCgnZG9tLWhlbHBlci9wcm9wJywgWydleHBvcnRz
J10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmlz
QXR0clJlbW92YWxWYWx1ZSA9IGlzQXR0clJlbW92YWxWYWx1ZTsKKyAgZXhwb3J0cy5ub3JtYWxp
emVQcm9wZXJ0eSA9IG5vcm1hbGl6ZVByb3BlcnR5OworCisgIGZ1bmN0aW9uIGlzQXR0clJlbW92
YWxWYWx1ZSh2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0g
dW5kZWZpbmVkOworICB9CisKKyAgLyoKKyAgICoKKyAgICogQG1ldGhvZCBub3JtYWxpemVQcm9w
ZXJ0eQorICAgKiBAcGFyYW0gZWxlbWVudCB7SFRNTEVsZW1lbnR9CisgICAqIEBwYXJhbSBzbG90
TmFtZSB7U3RyaW5nfQorICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IG5hbWUsIHR5cGUgfQorICAg
Ki8KKworICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBzbG90TmFtZSkgewor
ICAgIHZhciB0eXBlLCBub3JtYWxpemVkOworCisgICAgaWYgKHNsb3ROYW1lIGluIGVsZW1lbnQp
IHsKKyAgICAgIG5vcm1hbGl6ZWQgPSBzbG90TmFtZTsKKyAgICAgIHR5cGUgPSAncHJvcCc7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHZhciBsb3dlciA9IHNsb3ROYW1lLnRvTG93ZXJDYXNlKCk7Cisg
ICAgICBpZiAobG93ZXIgaW4gZWxlbWVudCkgeworICAgICAgICB0eXBlID0gJ3Byb3AnOworICAg
ICAgICBub3JtYWxpemVkID0gbG93ZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0g
J2F0dHInOworICAgICAgICBub3JtYWxpemVkID0gc2xvdE5hbWU7CisgICAgICB9CisgICAgfQor
CisgICAgaWYgKHR5cGUgPT09ICdwcm9wJyAmJiAobm9ybWFsaXplZC50b0xvd2VyQ2FzZSgpID09
PSAnc3R5bGUnIHx8IHByZWZlckF0dHIoZWxlbWVudC50YWdOYW1lLCBub3JtYWxpemVkKSkpIHsK
KyAgICAgIHR5cGUgPSAnYXR0cic7CisgICAgfQorCisgICAgcmV0dXJuIHsgbm9ybWFsaXplZDog
bm9ybWFsaXplZCwgdHlwZTogdHlwZSB9OworICB9CisKKyAgLy8gcHJvcGVydGllcyB0aGF0IE1V
U1QgYmUgc2V0IGFzIGF0dHJpYnV0ZXMsIGR1ZSB0bzoKKyAgLy8gKiBicm93c2VyIGJ1ZworICAv
LyAqIHN0cmFuZ2Ugc3BlYyBvdXRsaWVyCisgIHZhciBBVFRSX09WRVJSSURFUyA9IHsKKworICAg
IC8vIHBoYW50b21qcyA8IDIuMCBsZXRzIHlvdSBzZXQgaXQgYXMgYSBwcm9wIGJ1dCB3b24ndCBy
ZWZsZWN0IGl0CisgICAgLy8gYmFjayB0byB0aGUgYXR0cmlidXRlLiBidXR0b24uZ2V0QXR0cmli
dXRlKCd0eXBlJykgPT09IG51bGwKKyAgICBCVVRUT046IHsgdHlwZTogdHJ1ZSwgZm9ybTogdHJ1
ZSB9LAorCisgICAgSU5QVVQ6IHsKKyAgICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIElFOCBpcyBk
cm9wZWQKKyAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSUUgKElFOCkgdGhyb3cgYW4gZXhjZXB0
aW9uIHdoZW4gc2V0dGluZworICAgICAgLy8gYGlucHV0Lmxpc3QgPSAnc29tZXN0cmluZydgOgor
ICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvZW1iZXIuanMvaXNzdWVzLzEwOTA4
CisgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9pc3N1ZXMvMTEz
NjQKKyAgICAgIGxpc3Q6IHRydWUsCisgICAgICAvLyBTb21lIHZlcnNpb24gb2YgSUUgKGxpa2Ug
SUU5KSBhY3R1YWxseSB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgIC8vIGlmIHlvdSBzZXQgaW5w
dXQudHlwZSA9ICdzb21ldGhpbmctdW5rbm93bicKKyAgICAgIHR5cGU6IHRydWUsCisgICAgICBm
b3JtOiB0cnVlLAorICAgICAgLy8gQ2hyb21lIDQ2LjAuMjQ2NC4wOiAnYXV0b2NvcnJlY3QnIGlu
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JykgPT09IGZhbHNlCisgICAgICAvLyBTYWZh
cmkgOC4wLjc6ICdhdXRvY29ycmVjdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQn
KSA9PT0gZmFsc2UKKyAgICAgIC8vIE1vYmlsZSBTYWZhcmkgKGlPUyA4LjQgc2ltdWxhdG9yKTog
J2F1dG9jb3JyZWN0JyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpID09PSB0cnVl
CisgICAgICBhdXRvY29ycmVjdDogdHJ1ZQorICAgIH0sCisKKyAgICAvLyBlbGVtZW50LmZvcm0g
aXMgYWN0dWFsbHkgYSBsZWdpdGltYXRlIHJlYWRPbmx5IHByb3BlcnR5LCB0aGF0IGlzIHRvIGJl
CisgICAgLy8gbXV0YXRlZCwgYnV0IG11c3QgYmUgbXV0YXRlZCBieSBzZXRBdHRyaWJ1dGUuLi4K
KyAgICBTRUxFQ1Q6IHsgZm9ybTogdHJ1ZSB9LAorICAgIE9QVElPTjogeyBmb3JtOiB0cnVlIH0s
CisgICAgVEVYVEFSRUE6IHsgZm9ybTogdHJ1ZSB9LAorICAgIExBQkVMOiB7IGZvcm06IHRydWUg
fSwKKyAgICBGSUVMRFNFVDogeyBmb3JtOiB0cnVlIH0sCisgICAgTEVHRU5EOiB7IGZvcm06IHRy
dWUgfSwKKyAgICBPQkpFQ1Q6IHsgZm9ybTogdHJ1ZSB9CisgIH07CisKKyAgZnVuY3Rpb24gcHJl
ZmVyQXR0cih0YWdOYW1lLCBwcm9wTmFtZSkgeworICAgIHZhciB0YWcgPSBBVFRSX09WRVJSSURF
U1t0YWdOYW1lLnRvVXBwZXJDYXNlKCldOworICAgIHJldHVybiB0YWcgJiYgdGFnW3Byb3BOYW1l
LnRvTG93ZXJDYXNlKCldIHx8IGZhbHNlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItYXBwbGlj
YXRpb24vaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRh
bC9mZWF0dXJlcycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCAnZW1iZXItYXBw
bGljYXRpb24vc3lzdGVtL3Jlc29sdmVyJywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBs
aWNhdGlvbicsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24taW5zdGFuY2Un
LCAnZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZScsICdlbWJlci1hcHBsaWNhdGlvbi9z
eXN0ZW0vZW5naW5lLWluc3RhbmNlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENv
cmUsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQsIF9l
bWJlckFwcGxpY2F0aW9uU3lzdGVtUmVzb2x2ZXIsIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBw
bGljYXRpb24sIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb25JbnN0YW5jZSwgX2Vt
YmVyQXBwbGljYXRpb25TeXN0ZW1FbmdpbmUsIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5l
SW5zdGFuY2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0
LkFwcGxpY2F0aW9uID0gX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbi5kZWZhdWx0
OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5SZXNvbHZlciA9IF9lbWJlckFwcGxpY2F0aW9u
U3lzdGVtUmVzb2x2ZXIuUmVzb2x2ZXI7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkRlZmF1
bHRSZXNvbHZlciA9IF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtUmVzb2x2ZXIuZGVmYXVsdDsKKwor
ICBfZW1iZXJSdW50aW1lU3lzdGVtTGF6eV9sb2FkLnJ1bkxvYWRIb29rcygnRW1iZXIuQXBwbGlj
YXRpb24nLCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUFwcGxpY2F0aW9uLmRlZmF1bHQpOworfSk7
CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgorKi8K
KworLy8gRXhwb3NlIGBFbmdpbmVJbnN0YW5jZWAgYW5kIGBBcHBsaWNhdGlvbkluc3RhbmNlYCBm
b3IgZWFzeSBvdmVycmlkaW5nLgorLy8gUmVhbmFseXplIHdoZXRoZXIgdG8gY29udGludWUgZXhw
b3NpbmcgdGhlc2UgYWZ0ZXIgZmVhdHVyZSBmbGFnIGlzIHJlbW92ZWQuCitlbmlmZWQoJ2VtYmVy
LWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBsaWNhdGlvbi1pbnN0YW5jZScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0
YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9ydW5f
bG9vcCcsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1ydW50aW1lL21peGlucy9yZWdp
c3RyeV9wcm94eScsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvZW52aXJvbm1l
bnQnLCAnZW1iZXItcnVudGltZS9leHQvcnN2cCcsICdlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5
JywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUtaW5zdGFuY2UnXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxTeW1ib2wsIF9lbWJlck1ldGFsUnVuX2xv
b3AsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94
eSwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsRW52aXJvbm1lbnQsIF9lbWJlclJ1bnRp
bWVFeHRSc3ZwLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyQXBwbGljYXRpb25TeXN0
ZW1FbmdpbmVJbnN0YW5jZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLWFwcGxpY2F0aW9uCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBJTlRF
Uk5BTF9CT09UX09QVElPTlMgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdJTlRFUk5BTF9C
T09UX09QVElPTlMnKTsKKworICBleHBvcnRzLklOVEVSTkFMX0JPT1RfT1BUSU9OUyA9IElOVEVS
TkFMX0JPT1RfT1BUSU9OUzsKKyAgdmFyIEJvb3RPcHRpb25zID0gdW5kZWZpbmVkOworCisgIC8q
KgorICAgIFRoZSBgQXBwbGljYXRpb25JbnN0YW5jZWAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUg
c3RhdGVmdWwgYXNwZWN0cyBvZiBhCisgICAgcnVubmluZyBgQXBwbGljYXRpb25gLgorICAKKyAg
ICBBdCBhIGhpZ2gtbGV2ZWwsIHdlIGJyZWFrIGFwcGxpY2F0aW9uIGJvb3QgaW50byB0d28gZGlz
dGluY3QgcGhhc2VzOgorICAKKyAgICAqIERlZmluaXRpb24gdGltZSwgd2hlcmUgYWxsIG9mIHRo
ZSBjbGFzc2VzLCB0ZW1wbGF0ZXMsIGFuZCBvdGhlcgorICAgICAgZGVwZW5kZW5jaWVzIGFyZSBs
b2FkZWQgKHR5cGljYWxseSBpbiB0aGUgYnJvd3NlcikuCisgICAgKiBSdW4gdGltZSwgd2hlcmUg
d2UgYmVnaW4gZXhlY3V0aW5nIHRoZSBhcHBsaWNhdGlvbiBvbmNlIGV2ZXJ5dGhpbmcKKyAgICAg
IGhhcyBsb2FkZWQuCisgIAorICAgIERlZmluaXRpb24gdGltZSBjYW4gYmUgZXhwZW5zaXZlIGFu
ZCBvbmx5IG5lZWRzIHRvIGhhcHBlbiBvbmNlIHNpbmNlIGl0IGlzCisgICAgYW4gaWRlbXBvdGVu
dCBvcGVyYXRpb24uIEZvciBleGFtcGxlLCBiZXR3ZWVuIHRlc3QgcnVucyBhbmQgRmFzdEJvb3QK
KyAgICByZXF1ZXN0cywgdGhlIGFwcGxpY2F0aW9uIHN0YXlzIHRoZSBzYW1lLiBJdCBpcyBvbmx5
IHRoZSBzdGF0ZSB0aGF0IHdlIHdhbnQKKyAgICB0byByZXNldC4KKyAgCisgICAgVGhhdCBzdGF0
ZSBpcyB3aGF0IHRoZSBgQXBwbGljYXRpb25JbnN0YW5jZWAgbWFuYWdlczogaXQgaXMgcmVzcG9u
c2libGUgZm9yCisgICAgY3JlYXRpbmcgdGhlIGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIGFsbCBh
cHBsaWNhdGlvbiBzdGF0ZSwgYW5kIGRpc3Bvc2luZyBvZgorICAgIGl0IG9uY2UgdGhlIHBhcnRp
Y3VsYXIgdGVzdCBydW4gb3IgRmFzdEJvb3QgcmVxdWVzdCBoYXMgZmluaXNoZWQuCisgIAorICAg
IEBwdWJsaWMKKyAgICBAY2xhc3MgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZQorICAgIEBleHRl
bmRzIEVtYmVyLkVuZ2luZUluc3RhbmNlCisgICovCisKKyAgdmFyIEFwcGxpY2F0aW9uSW5zdGFu
Y2UgPSBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUVuZ2luZUluc3RhbmNlLmRlZmF1bHQuZXh0ZW5k
KHsKKyAgICAvKioKKyAgICAgIFRoZSBgQXBwbGljYXRpb25gIGZvciB3aGljaCB0aGlzIGlzIGFu
IGluc3RhbmNlLgorICAgICAgIEBwcm9wZXJ0eSB7RW1iZXIuQXBwbGljYXRpb259IGFwcGxpY2F0
aW9uCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYXBwbGljYXRpb246IG51bGwsCisKKyAg
ICAvKioKKyAgICAgIFRoZSBET00gZXZlbnRzIGZvciB3aGljaCB0aGUgZXZlbnQgZGlzcGF0Y2hl
ciBzaG91bGQgbGlzdGVuLgorICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBhcHBsaWNhdGlvbidzIGBF
bWJlci5FdmVudERpc3BhdGNoZXJgIGxpc3RlbnMKKyAgICAgIGZvciBhIHNldCBvZiBzdGFuZGFy
ZCBET00gZXZlbnRzLCBzdWNoIGFzIGBtb3VzZWRvd25gIGFuZAorICAgICAgYGtleXVwYCwgYW5k
IGRlbGVnYXRlcyB0aGVtIHRvIHlvdXIgYXBwbGljYXRpb24ncyBgRW1iZXIuVmlld2AKKyAgICAg
IGluc3RhbmNlcy4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQHByb3BlcnR5IHtPYmplY3R9IGN1
c3RvbUV2ZW50cworICAgICovCisgICAgY3VzdG9tRXZlbnRzOiBudWxsLAorCisgICAgLyoqCisg
ICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBvZiB0aGUgQXBwbGljYXRpb24gYXMgYW4gZWxlbWVu
dCBvciBhCisgICAgICBbalF1ZXJ5LWNvbXBhdGlibGUgc2VsZWN0b3IKKyAgICAgIHN0cmluZ10o
aHR0cDovL2FwaS5qcXVlcnkuY29tL2NhdGVnb3J5L3NlbGVjdG9ycy8pLgorICAgICAgIEBwcml2
YXRlCisgICAgICBAcHJvcGVydHkge1N0cmluZ3xET01FbGVtZW50fSByb290RWxlbWVudAorICAg
ICovCisgICAgcm9vdEVsZW1lbnQ6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICAvLyBSZWdp
c3RlciB0aGlzIGluc3RhbmNlIGluIHRoZSBwZXItaW5zdGFuY2UgcmVnaXN0cnkuCisgICAgICAv
LworICAgICAgLy8gV2h5IGRvIHdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGluc3RhbmNlIGluIHRo
ZSBmaXJzdCBwbGFjZT8KKyAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCBhIGdvb2Qgd2F5IGZvciB0
aGUgcm9vdCByb3V0ZSAoYS5rLmEgQXBwbGljYXRpb25Sb3V0ZSkKKyAgICAgIC8vIHRvIG5vdGlm
eSB1cyB3aGVuIGl0IGhhcyBjcmVhdGVkIHRoZSByb290LW1vc3Qgdmlldy4gVGhhdCB2aWV3IGlz
IHRoZW4KKyAgICAgIC8vIGFwcGVuZGVkIHRvIHRoZSByb290RWxlbWVudCwgaW4gdGhlIGNhc2Ug
b2YgYXBwcywgdG8gdGhlIGZpeHR1cmUgaGFybmVzcworICAgICAgLy8gaW4gdGVzdHMsIG9yIHJl
bmRlcmVkIHRvIGEgc3RyaW5nIGluIHRoZSBjYXNlIG9mIEZhc3RCb290LgorICAgICAgdGhpcy5y
ZWdpc3RlcignLWFwcGxpY2F0aW9uLWluc3RhbmNlOm1haW4nLCB0aGlzLCB7IGluc3RhbnRpYXRl
OiBmYWxzZSB9KTsKKworICAgICAgdGhpcy5fYm9vdGVkID0gZmFsc2U7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgSW5pdGlhbGl6ZSB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2VgIGFu
ZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMKKyAgICAgIHdpdGggdGhlIGluc3RhbmNl
IGl0c2VsZiB3aGVuIHRoZSBib290IHByb2Nlc3MgaXMgY29tcGxldGUuCisgICAgICAgVGhlIHBy
aW1hcnkgdGFzayBoZXJlIGlzIHRvIHJ1biBhbnkgcmVnaXN0ZXJlZCBpbnN0YW5jZSBpbml0aWFs
aXplcnMuCisgICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBCb290T3B0aW9uc2AgZm9y
IHRoZSBvcHRpb25zIGl0IHRha2VzLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGJv
b3QKKyAgICAgIEBwYXJhbSBvcHRpb25zCisgICAgICBAcmV0dXJuIHtQcm9taXNlPEVtYmVyLkFw
cGxpY2F0aW9uSW5zdGFuY2UsRXJyb3I+fQorICAgICovCisgICAgYm9vdDogZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVu
dHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3Vt
ZW50c1swXTsKKworICAgICAgaWYgKHRoaXMuX2Jvb3RQcm9taXNlKSB7CisgICAgICAgIHJldHVy
biB0aGlzLl9ib290UHJvbWlzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fYm9vdFByb21pc2Ug
PSBuZXcgX2VtYmVyUnVudGltZUV4dFJzdnAuZGVmYXVsdC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNv
bHZlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlKF90aGlzLl9ib290U3luYyhvcHRpb25zKSk7
CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRoaXMuX2Jvb3RQcm9taXNlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFVuZm9ydHVuYXRlbHksIGEgbG90IG9mIGV4aXN0aW5nIGNvZGUgYXNz
dW1lcyBib290aW5nIGFuIGluc3RhbmNlIGlzCisgICAgICBzeW5jaHJvbm91cyDigJMgc3BlY2lm
aWNhbGx5LCBhIGxvdCBvZiB0ZXN0cyBhc3N1bWVzIHRoZSBsYXN0IGNhbGwgdG8KKyAgICAgIGBh
cHAuYWR2YW5jZVJlYWRpbmVzcygpYCBvciBgYXBwLnJlc2V0KClgIHdpbGwgcmVzdWx0IGluIGEg
bmV3IGluc3RhbmNlCisgICAgICBiZWluZyBmdWxseS1ib290ZWQgd2hlbiB0aGUgY3VycmVudCBy
dW5sb29wIGNvbXBsZXRlcy4KKyAgICAgICBXZSB3b3VsZCBsaWtlIG5ldyBjb2RlIChsaWtlIHRo
ZSBgdmlzaXRgIEFQSSkgdG8gc3RvcCBtYWtpbmcgdGhpcyBhc3N1bXB0aW9uLAorICAgICAgc28g
d2UgY3JlYXRlZCB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gYWJvdmUgdGhhdCByZXR1cm5zIGEg
cHJvbWlzZS4gQnV0IHVudGlsCisgICAgICB3ZSBoYXZlIG1pZ3JhdGVkIGFsbCB0aGUgY29kZSwg
d2Ugd291bGQgaGF2ZSB0byBleHBvc2UgdGhpcyBtZXRob2QgZm9yIHVzZQorICAgICAgKmludGVy
bmFsbHkqIGluIHBsYWNlcyB3aGVyZSB3ZSBuZWVkIHRvIGJvb3QgYW4gaW5zdGFuY2Ugc3luY2hy
b25vdXNseS4KKyAgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2Jvb3RTeW5jOiBmdW5jdGlv
biAob3B0aW9ucykgeworICAgICAgaWYgKHRoaXMuX2Jvb3RlZCkgeworICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgIH0KKworICAgICAgb3B0aW9ucyA9IG5ldyBCb290T3B0aW9ucyhvcHRpb25z
KTsKKworICAgICAgdmFyIHJlZ2lzdHJ5ID0gdGhpcy5fX3JlZ2lzdHJ5X187CisKKyAgICAgIHJl
Z2lzdHJ5LnJlZ2lzdGVyKCctZW52aXJvbm1lbnQ6bWFpbicsIG9wdGlvbnMudG9FbnZpcm9ubWVu
dCgpLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKyAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
dmlldycsICdfZW52aXJvbm1lbnQnLCAnLWVudmlyb25tZW50Om1haW4nKTsKKyAgICAgIHJlZ2lz
dHJ5LmluamVjdGlvbigncm91dGUnLCAnX2Vudmlyb25tZW50JywgJy1lbnZpcm9ubWVudDptYWlu
Jyk7CisKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdzZXJ2aWNlOi1kb2N1bWVudCcsIG9wdGlv
bnMuZG9jdW1lbnQsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworCisgICAgICBpZiAob3B0aW9u
cy5pc0ludGVyYWN0aXZlKSB7CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldycsICdy
ZW5kZXJlcicsICdyZW5kZXJlcjotZG9tJyk7CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
Y29tcG9uZW50JywgJ3JlbmRlcmVyJywgJ3JlbmRlcmVyOi1kb20nKTsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldycsICdyZW5kZXJlcicsICdyZW5kZXJl
cjotaW5lcnQnKTsKKyAgICAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdjb21wb25lbnQnLCAncmVu
ZGVyZXInLCAncmVuZGVyZXI6LWluZXJ0Jyk7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25z
LnJvb3RFbGVtZW50KSB7CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSBvcHRpb25zLnJvb3RF
bGVtZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IHRoaXMu
YXBwbGljYXRpb24ucm9vdEVsZW1lbnQ7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25zLmxv
Y2F0aW9uKSB7CisgICAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ3JvdXRlcicpOworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQo
cm91dGVyLCAnbG9jYXRpb24nLCBvcHRpb25zLmxvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAg
dGhpcy5hcHBsaWNhdGlvbi5ydW5JbnN0YW5jZUluaXRpYWxpemVycyh0aGlzKTsKKworICAgICAg
aWYgKG9wdGlvbnMuaXNJbnRlcmFjdGl2ZSkgeworICAgICAgICB0aGlzLnNldHVwRXZlbnREaXNw
YXRjaGVyKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX2Jvb3RlZCA9IHRydWU7CisKKyAgICAg
IHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICByb3V0ZXI6IF9lbWJlck1ldGFsQ29tcHV0ZWQu
Y29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMubG9va3VwKCdyb3V0ZXI6
bWFpbicpOworICAgIH0pLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIFRoaXMgaG9vayBp
cyBjYWxsZWQgYnkgdGhlIHJvb3QtbW9zdCBSb3V0ZSAoYS5rLmEuIHRoZSBBcHBsaWNhdGlvblJv
dXRlKQorICAgICAgd2hlbiBpdCBoYXMgZmluaXNoZWQgY3JlYXRpbmcgdGhlIHJvb3QgVmlldy4g
QnkgZGVmYXVsdCwgd2Ugc2ltcGx5IHRha2UgdGhlCisgICAgICB2aWV3IGFuZCBhcHBlbmQgaXQg
dG8gdGhlIGByb290RWxlbWVudGAgc3BlY2lmaWVkIG9uIHRoZSBBcHBsaWNhdGlvbi4KKyAgICAg
ICBJbiBjYXNlcyBsaWtlIEZhc3RCb290IGFuZCB0ZXN0aW5nLCB3ZSBjYW4gb3ZlcnJpZGUgdGhp
cyBob29rIGFuZCBpbXBsZW1lbnQKKyAgICAgIGN1c3RvbSBiZWhhdmlvciwgc3VjaCBhcyBzZXJp
YWxpemluZyB0byBhIHN0cmluZyBhbmQgc2VuZGluZyBvdmVyIGFuIEhUVFAKKyAgICAgIHNvY2tl
dCByYXRoZXIgdGhhbiBhcHBlbmRpbmcgdG8gRE9NLgorICAgICAgIEBwYXJhbSB2aWV3IHtFbWJl
ci5WaWV3fSB0aGUgcm9vdC1tb3N0IHZpZXcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBk
aWRDcmVhdGVSb290VmlldzogZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgIHZpZXcuYXBwZW5kVG8o
dGhpcy5yb290RWxlbWVudCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGVsbHMgdGhlIHJv
dXRlciB0byBzdGFydCByb3V0aW5nLiBUaGUgcm91dGVyIHdpbGwgYXNrIHRoZSBsb2NhdGlvbiBm
b3IgdGhlCisgICAgICBjdXJyZW50IFVSTCBvZiB0aGUgcGFnZSB0byBkZXRlcm1pbmUgdGhlIGlu
aXRpYWwgVVJMIHRvIHN0YXJ0IHJvdXRpbmcgdG8uCisgICAgICBUbyBzdGFydCB0aGUgYXBwIGF0
IGEgc3BlY2lmaWMgVVJMLCBjYWxsIGBoYW5kbGVVUkxgIGluc3RlYWQuCisgICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIHN0YXJ0Um91dGluZzogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJv
dXRlciA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAg
ICByb3V0ZXIuc3RhcnRSb3V0aW5nKCk7CisgICAgICB0aGlzLl9kaWRTZXR1cFJvdXRlciA9IHRy
dWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBTZXRzIHVwIHRo
ZSByb3V0ZXIsIGluaXRpYWxpemluZyB0aGUgY2hpbGQgcm91dGVyIGFuZCBjb25maWd1cmluZyB0
aGUKKyAgICAgIGxvY2F0aW9uIGJlZm9yZSByb3V0aW5nIGJlZ2lucy4KKyAgICAgICBCZWNhdXNl
IHNldHVwIHNob3VsZCBvbmx5IG9jY3VyIG9uY2UsIG11bHRpcGxlIGNhbGxzIHRvIGBzZXR1cFJv
dXRlcmAKKyAgICAgIGJleW9uZCB0aGUgZmlyc3QgY2FsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICAq
LworICAgIHNldHVwUm91dGVyOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5fZGlkU2V0
dXBSb3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5fZGlkU2V0
dXBSb3V0ZXIgPSB0cnVlOworCisgICAgICB2YXIgcm91dGVyID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKyAgICAgIHJvdXRlci5zZXR1cFJvdXRlcigpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIERpcmVjdHMgdGhlIHJvdXRlciB0byByb3V0ZSB0byBh
IHBhcnRpY3VsYXIgVVJMLiBUaGlzIGlzIHVzZWZ1bCBpbiB0ZXN0cywKKyAgICAgIGZvciBleGFt
cGxlLCB0byB0ZWxsIHRoZSBhcHAgdG8gc3RhcnQgYXQgYSBwYXJ0aWN1bGFyIFVSTC4KKyAgICAg
ICBAcGFyYW0gdXJsIHtTdHJpbmd9IHRoZSBVUkwgdGhlIHJvdXRlciBzaG91bGQgcm91dGUgdG8K
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYW5kbGVVUkw6IGZ1bmN0aW9uICh1cmwpIHsK
KyAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Jv
dXRlcicpOworCisgICAgICB0aGlzLnNldHVwUm91dGVyKCk7CisgICAgICByZXR1cm4gcm91dGVy
LmhhbmRsZVVSTCh1cmwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAg
Ki8KKyAgICBzZXR1cEV2ZW50RGlzcGF0Y2hlcjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGRp
c3BhdGNoZXIgPSB0aGlzLmxvb2t1cCgnZXZlbnRfZGlzcGF0Y2hlcjptYWluJyk7CisgICAgICB2
YXIgYXBwbGljYXRpb25DdXN0b21FdmVudHMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcy5hcHBsaWNhdGlvbiwgJ2N1c3RvbUV2ZW50cycpOworICAgICAgdmFyIGluc3RhbmNlQ3Vz
dG9tRXZlbnRzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjdXN0b21FdmVu
dHMnKTsKKworICAgICAgdmFyIGN1c3RvbUV2ZW50cyA9IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1
bHQoe30sIGFwcGxpY2F0aW9uQ3VzdG9tRXZlbnRzLCBpbnN0YW5jZUN1c3RvbUV2ZW50cyk7Cisg
ICAgICBkaXNwYXRjaGVyLnNldHVwKGN1c3RvbUV2ZW50cywgdGhpcy5yb290RWxlbWVudCk7CisK
KyAgICAgIHJldHVybiBkaXNwYXRjaGVyOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVy
bnMgdGhlIGN1cnJlbnQgVVJMIG9mIHRoZSBhcHAgaW5zdGFuY2UuIFRoaXMgaXMgdXNlZnVsIHdo
ZW4geW91cgorICAgICAgYXBwIGRvZXMgbm90IHVwZGF0ZSB0aGUgYnJvd3NlcnMgVVJMIGJhciAo
aS5lLiBpdCB1c2VzIHRoZSBgJ25vbmUnYAorICAgICAgbG9jYXRpb24gYWRhcHRlcikuCisgICAg
ICAgQHB1YmxpYworICAgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgY3VycmVudCBVUkwKKyAgICAq
LworICAgIGdldFVSTDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJvdXRlciA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAgICByZXR1cm4gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlciwgJ3VybCcpOworICAgIH0sCisKKyAgICAvLyBg
aW5zdGFuY2UudmlzaXQodXJsKWAgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBgaW5zdGFuY2Uu
aGFuZGxlVVJMKClgOworICAgIC8vIHRoZSB0ZXN0IGhlbHBlcnMgY2FuIHByb2JhYmx5IGJlIHN3
aXRjaGVkIHRvIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvbworCisgICAgLyoqCisgICAgICBO
YXZpZ2F0ZSB0aGUgaW5zdGFuY2UgdG8gYSBwYXJ0aWN1bGFyIFVSTC4gVGhpcyBpcyB1c2VmdWwg
aW4gdGVzdHMsIGZvcgorICAgICAgZXhhbXBsZSwgb3IgdG8gdGVsbCB0aGUgYXBwIHRvIHN0YXJ0
IGF0IGEgcGFydGljdWxhciBVUkwuIFRoaXMgbWV0aG9kCisgICAgICByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFwcCBpbnN0YW5jZSB3aGVuIHRoZSB0cmFuc2l0aW9u
CisgICAgICBpcyBjb21wbGV0ZSwgb3IgcmVqZWN0cyBpZiB0aGUgdHJhbnNpb24gd2FzIGFib3J0
ZWQgZHVlIHRvIGFuIGVycm9yLgorICAgICAgIEBwdWJsaWMKKyAgICAgIEBwYXJhbSB1cmwge1N0
cmluZ30gdGhlIGRlc3RpbmF0aW9uIFVSTAorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgICAq
LworICAgIHZpc2l0OiBmdW5jdGlvbiAodXJsKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsK
KworICAgICAgdGhpcy5zZXR1cFJvdXRlcigpOworCisgICAgICB2YXIgcm91dGVyID0gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKworICAgICAgdmFyIGhhbmRs
ZVJlc29sdmUgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8vIFJlc29sdmUgb25seSBhZnRlciBy
ZW5kZXJpbmcgaXMgY29tcGxldGUKKyAgICAgICAgcmV0dXJuIG5ldyBfZW1iZXJSdW50aW1lRXh0
UnN2cC5kZWZhdWx0LlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICAvLyBU
T0RPOiB3aHkgaXMgdGhpcyBuZWNlc3Nhcnk/IFNob3VsZG4ndCAnYWN0aW9ucycgcXVldWUgYmUg
ZW5vdWdoPworICAgICAgICAgIC8vIEFsc28sIGFyZW4ndCBwcm9pbXNlcyBzdXBwb3NlZCB0byBi
ZSBhc3luYyBhbnl3YXk/CisgICAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm5l
eHQobnVsbCwgcmVzb2x2ZSwgX3RoaXMyKTsKKyAgICAgICAgfSk7CisgICAgICB9OworCisgICAg
ICB2YXIgaGFuZGxlUmVqZWN0ID0gZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgIGlmIChlcnJv
ci5lcnJvcikgeworICAgICAgICAgIHRocm93IGVycm9yLmVycm9yOworICAgICAgICB9IGVsc2Ug
aWYgKGVycm9yLm5hbWUgPT09ICdUcmFuc2l0aW9uQWJvcnRlZCcgJiYgcm91dGVyLnJvdXRlci5h
Y3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHJvdXRlci5yb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbi50aGVuKGhhbmRsZVJlc29sdmUsIGhhbmRsZVJlamVjdCk7CisgICAgICAgIH0g
ZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1RyYW5zaXRpb25BYm9ydGVkJykgeworICAgICAgICAg
IHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdmFyIGxvY2F0
aW9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlciwgJ2xvY2F0aW9uJyk7CisK
KyAgICAgIC8vIEtlZXBzIHRoZSBsb2NhdGlvbiBhZGFwdGVyJ3MgaW50ZXJuYWwgVVJMIGluLXN5
bmMKKyAgICAgIGxvY2F0aW9uLnNldFVSTCh1cmwpOworCisgICAgICAvLyBnZXRVUkwgcmV0dXJu
cyB0aGUgc2V0IHVybCB3aXRoIHRoZSByb290VVJMIHN0cmlwcGVkIG9mZgorICAgICAgcmV0dXJu
IHJvdXRlci5oYW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkpLnRoZW4oaGFuZGxlUmVzb2x2ZSwg
aGFuZGxlUmVqZWN0KTsKKyAgICB9CisgIH0pOworCisgIC8qKgorICAgIEEgbGlzdCBvZiBib290
LXRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Ig
b2YKKyAgICBhbiBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZWAuCisgIAorICAgIFRoaXMgaXMg
YW4gaW50ZXJmYWNlIGNsYXNzIHRoYXQgZXhpc3RzIHB1cmVseSB0byBkb2N1bWVudCB0aGUgYXZh
aWxhYmxlCisgICAgb3B0aW9uczsgeW91IGRvIG5vdCBuZWVkIHRvIGNvbnN0cnVjdCBpdCBtYW51
YWxseS4gU2ltcGx5IHBhc3MgYSByZWd1bGFyCisgICAgSmF2YVNjcmlwdCBvYmplY3QgY29udGFp
bmluZyB0aGUgZGVzaXJlZCBvcHRpb25zIGludG8gbWV0aG9kcyB0aGF0IHJlcXVpcmUKKyAgICBv
bmUgb2YgdGhlc2Ugb3B0aW9ucyBvYmplY3Q6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBN
eUFwcC52aXNpdCgiLyIsIHsgbG9jYXRpb246ICJub25lIiwgcm9vdEVsZW1lbnQ6ICIjY29udGFp
bmVyIiB9KTsKKyAgICBgYGAKKyAgCisgICAgTm90IGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIHN1
cHBvcnRlZCBvcHRpb25zIGFyZSB2YWxpZC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uCisgICAgb24g
YEVtYmVyLkFwcGxpY2F0aW9uI3Zpc2l0YCBmb3IgdGhlIHN1cHBvcnRlZCBjb25maWd1cmF0aW9u
cy4KKyAgCisgICAgSW50ZXJuYWwsIGV4cGVyaW1lbnRhbCBvciBvdGhlcndpc2UgdW5zdGFibGUg
ZmxhZ3MgYXJlIG1hcmtlZCBhcyBwcml2YXRlLgorICAKKyAgICBAY2xhc3MgQm9vdE9wdGlvbnMK
KyAgICBAbmFtZXNwYWNlIEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UKKyAgICBAcHVibGljCisg
ICovCisgIEJvb3RPcHRpb25zID0gZnVuY3Rpb24gQm9vdE9wdGlvbnMoKSB7CisgICAgdmFyIG9w
dGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmlu
ZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKKworICAgIC8qKgorICAgICAgUHJvdmlkZSBhIHNwZWNp
ZmljIGluc3RhbmNlIG9mIGpRdWVyeS4gVGhpcyBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0
aAorICAgICAgdGhlIGBkb2N1bWVudGAgb3B0aW9uLCBhcyBpdCBhbGxvd3MgeW91IHRvIHVzZSBh
IGNvcHkgb2YgYGpRdWVyeWAgdGhhdCBpcworICAgICAgYXBwcm9wcmlhdGVseSBib3VuZCB0byB0
aGUgZm9yZWlnbiBgZG9jdW1lbnRgIChlLmcuIGEganNkb20pLgorICAgICAgIFRoaXMgaXMgaGln
aGx5IGV4cGVyaW1lbnRhbCBhbmQgc3VwcG9ydCB2ZXJ5IGluY29tcGxldGUgYXQgdGhlIG1vbWVu
dC4KKyAgICAgICBAcHJvcGVydHkgalF1ZXJ5CisgICAgICBAdHlwZSBPYmplY3QKKyAgICAgIEBk
ZWZhdWx0IGF1dG8tZGV0ZWN0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICB0aGlzLmpR
dWVyeSA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQ7IC8vIFRoaXMgZGVmYXVsdCBp
cyBvdmVycmlkYWJsZSBiZWxvdworCisgICAgLyoqCisgICAgICBJbnRlcmFjdGl2ZSBtb2RlOiB3
aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIGV2ZW50IGRlbGVnYXRpb24gYW5kIGludm9rZQorICAg
ICAgbGlmZWN5Y2xlIGNhbGxiYWNrcyBvbiBDb21wb25lbnRzLgorICAgICAgIEBwcm9wZXJ0eSBp
c0ludGVyYWN0aXZlCisgICAgICBAdHlwZSBib29sZWFuCisgICAgICBAZGVmYXVsdCBhdXRvLWRl
dGVjdGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgdGhpcy5pc0ludGVyYWN0aXZlID0g
X2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTTsgLy8gVGhpcyBkZWZhdWx0IGlz
IG92ZXJyaWRhYmxlIGJlbG93CisKKyAgICAvKioKKyAgICAgIFJ1biBpbiBhIGZ1bGwgYnJvd3Nl
ciBlbnZpcm9ubWVudC4KKyAgICAgICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGZhbHNlYCwg
aXQgd2lsbCBkaXNhYmxlIG1vc3QgYnJvd3Nlci1zcGVjaWZpYworICAgICAgYW5kIGludGVyYWN0
aXZlIGZlYXR1cmVzLiBTcGVjaWZpY2FsbHk6CisgICAgICAgKiBJdCBkb2VzIG5vdCB1c2UgYGpR
dWVyeWAgdG8gYXBwZW5kIHRoZSByb290IHZpZXc7IHRoZSBgcm9vdEVsZW1lbnRgCisgICAgICAg
IChlaXRoZXIgc3BlY2lmaWVkIGFzIGEgc3Vic2VxdWVudCBvcHRpb24gb3Igb24gdGhlIGFwcGxp
Y2F0aW9uIGl0c2VsZikKKyAgICAgICAgbXVzdCBhbHJlYWR5IGJlIGFuIGBFbGVtZW50YCBpbiB0
aGUgZ2l2ZW4gYGRvY3VtZW50YCAoYXMgb3Bwb3NlZCB0byBhCisgICAgICAgIHN0cmluZyBzZWxl
Y3RvcikuCisgICAgICAgKiBJdCBkb2VzIG5vdCBzZXQgdXAgYW4gYEV2ZW50RGlzcGF0Y2hlcmAu
CisgICAgICAgKiBJdCBkb2VzIG5vdCBydW4gYW55IGBDb21wb25lbnRgIGxpZmVjeWNsZSBob29r
cyAoc3VjaCBhcyBgZGlkSW5zZXJ0RWxlbWVudGApLgorICAgICAgICogSXQgc2V0cyB0aGUgYGxv
Y2F0aW9uYCBvcHRpb24gdG8gYCJub25lImAuIChJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UKKyAg
ICAgICAgdGhlIGxvY2F0aW9uIGFkYXB0ZXIgc3BlY2lmaWVkIGluIHRoZSBhcHAncyByb3V0ZXIg
aW5zdGVhZCwgeW91IGNhbiBhbHNvCisgICAgICAgIHNwZWNpZnkgYHsgbG9jYXRpb246IG51bGwg
fWAgdG8gc3BlY2lmaWNhbGx5IG9wdC1vdXQuKQorICAgICAgIEBwcm9wZXJ0eSBpc0Jyb3dzZXIK
KyAgICAgIEB0eXBlIGJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IGF1dG8tZGV0ZWN0ZWQKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGlmIChvcHRpb25zLmlzQnJvd3NlciAhPT0gdW5kZWZpbmVk
KSB7CisgICAgICB0aGlzLmlzQnJvd3NlciA9ICEhb3B0aW9ucy5pc0Jyb3dzZXI7CisgICAgfSBl
bHNlIHsKKyAgICAgIHRoaXMuaXNCcm93c2VyID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0Lmhhc0RPTTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7CisgICAgICB0
aGlzLmpRdWVyeSA9IG51bGw7CisgICAgICB0aGlzLmlzSW50ZXJhY3RpdmUgPSBmYWxzZTsKKyAg
ICAgIHRoaXMubG9jYXRpb24gPSAnbm9uZSc7CisgICAgfQorCisgICAgLyoqCisgICAgICBEaXNh
YmxlIHJlbmRlcmluZyBjb21wbGV0ZWx5LgorICAgICAgIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0
byBgdHJ1ZWAsIGl0IHdpbGwgZGlzYWJsZSB0aGUgZW50aXJlIHJlbmRlcmluZworICAgICAgcGlw
ZWxpbmUuIEVzc2VudGlhbGx5LCB0aGlzIHB1dHMgdGhlIGFwcCBpbnRvICJyb3V0aW5nLW9ubHki
IG1vZGUuIE5vCisgICAgICB0ZW1wbGF0ZXMgd2lsbCBiZSByZW5kZXJlZCwgYW5kIG5vIENvbXBv
bmVudHMgd2lsbCBiZSBjcmVhdGVkLgorICAgICAgIEBwcm9wZXJ0eSBzaG91bGRSZW5kZXIKKyAg
ICAgIEB0eXBlIGJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IHRydWUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGlmIChvcHRpb25zLnNob3VsZFJlbmRlciAhPT0gdW5kZWZpbmVkKSB7CisgICAg
ICB0aGlzLnNob3VsZFJlbmRlciA9ICEhb3B0aW9ucy5zaG91bGRSZW5kZXI7CisgICAgfSBlbHNl
IHsKKyAgICAgIHRoaXMuc2hvdWxkUmVuZGVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXRo
aXMuc2hvdWxkUmVuZGVyKSB7CisgICAgICB0aGlzLmpRdWVyeSA9IG51bGw7CisgICAgICB0aGlz
LmlzSW50ZXJhY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgIElmIHByZXNl
bnQsIHJlbmRlciBpbnRvIHRoZSBnaXZlbiBgRG9jdW1lbnRgIG9iamVjdCBpbnN0ZWFkIG9mIHRo
ZQorICAgICAgZ2xvYmFsIGB3aW5kb3cuZG9jdW1lbnRgIG9iamVjdC4KKyAgICAgICBJbiBwcmFj
dGljZSwgdGhpcyBpcyBvbmx5IHVzZWZ1bCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBp
bgorICAgICAgbm9uLWludGVyYWN0aXZlIG1vZGUsIGJlY2F1c2UgRW1iZXIncyBgalF1ZXJ5YCBk
ZXBlbmRlbmN5IGlzCisgICAgICBpbXBsaWNpdGx5IGJvdW5kIHRvIHRoZSBjdXJyZW50IGRvY3Vt
ZW50LCBjYXVzaW5nIGV2ZW50IGRlbGVnYXRpb24KKyAgICAgIHRvIG5vdCB3b3JrIHByb3Blcmx5
IHdoZW4gdGhlIGFwcCBpcyByZW5kZXJlZCBpbnRvIGEgZm9yZWlnbgorICAgICAgZG9jdW1lbnQg
b2JqZWN0IChzdWNoIGFzIGFuIGlmcmFtZSdzIGBjb250ZW50RG9jdW1lbnRgKS4KKyAgICAgICBJ
biBub24tYnJvd3NlciBtb2RlLCB0aGlzIGNvdWxkIGJlIGEgImBEb2N1bWVudGAtbGlrZSIgb2Jq
ZWN0IGFzCisgICAgICBFbWJlciBvbmx5IGludGVyYWN0IHdpdGggYSBzbWFsbCBzdWJzZXQgb2Yg
dGhlIERPTSBBUEkgaW4gbm9uLQorICAgICAgaW50ZXJhY3RpdmUgbW9kZS4gV2hpbGUgdGhlIGV4
YWN0IHJlcXVpcmVtZW50cyBoYXZlIG5vdCB5ZXQgYmVlbgorICAgICAgZm9ybWFsaXplZCwgdGhl
IGBTaW1wbGVET01gIGxpYnJhcnkncyBpbXBsZW1lbnRhdGlvbiBpcyBrbm93biB0bworICAgICAg
d29yay4KKyAgICAgICBAcHJvcGVydHkgZG9jdW1lbnQKKyAgICAgIEB0eXBlIERvY3VtZW50Cisg
ICAgICBAZGVmYXVsdCB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgb2JqZWN0CisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICBpZiAob3B0aW9ucy5kb2N1bWVudCkgeworICAgICAgdGhpcy5kb2N1bWVu
dCA9IG9wdGlvbnMuZG9jdW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZG9jdW1lbnQg
PSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsOworICAg
IH0KKworICAgIC8qKgorICAgICAgSWYgcHJlc2VudCwgb3ZlcnJpZGVzIHRoZSBhcHBsaWNhdGlv
bidzIGByb290RWxlbWVudGAgcHJvcGVydHkgb24KKyAgICAgIHRoZSBpbnN0YW5jZS4gVGhpcyBp
cyB1c2VmdWwgZm9yIHRlc3RpbmcgZW52aXJvbm1lbnQsIHdoZXJlIHlvdQorICAgICAgbWlnaHQg
d2FudCB0byBhcHBlbmQgdGhlIHJvb3QgdmlldyB0byBhIGZpeHR1cmUgYXJlYS4KKyAgICAgICBJ
biBub24tYnJvd3NlciBtb2RlLCBiZWNhdXNlIEVtYmVyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRv
IGpRdWVyeSwKKyAgICAgIHRoaXMgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIERPTSBg
RWxlbWVudGAgb2JqZWN0IGluc3RlYWQgb2YKKyAgICAgIGEgc2VsZWN0b3Igc3RyaW5nLgorICAg
ICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBgRW1iZXIuQXBwbGljYXRpb25zYCdzIGByb290
RWxlbWVudGAgZm9yCisgICAgICBkZXRhaWxzLgorICAgICAgIEBwcm9wZXJ0eSByb290RWxlbWVu
dAorICAgICAgQHR5cGUgU3RyaW5nfEVsZW1lbnQKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAg
IEBwdWJsaWMKKyAgICAgKi8KKyAgICBpZiAob3B0aW9ucy5yb290RWxlbWVudCkgeworICAgICAg
dGhpcy5yb290RWxlbWVudCA9IG9wdGlvbnMucm9vdEVsZW1lbnQ7CisgICAgfQorCisgICAgLy8g
U2V0IHRoZXNlIG9wdGlvbnMgbGFzdCB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIG92ZXJy
aWRlIHRoZQorICAgIC8vIGRlZmF1bHRzIGZyb20gdGhlICJjb21ibyIgb3B0aW9ucyBsaWtlIGBp
c0Jyb3dzZXJgIChhbHRob3VnaCBpbgorICAgIC8vIHByYWN0aWNlLCB0aGUgcmVzdWx0aW5nIGNv
bWJpbmF0aW9uIGlzIHByb2JhYmx5IGludmFsaWQpCisKKyAgICAvKioKKyAgICAgIElmIHByZXNl
bnQsIG92ZXJyaWRlcyB0aGUgcm91dGVyJ3MgYGxvY2F0aW9uYCBwcm9wZXJ0eSB3aXRoIHRoaXMK
KyAgICAgIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW52aXJvbm1lbnRzIHdoZXJlIHRyeWlu
ZyB0byBtb2RpZnkgdGhlCisgICAgICBVUkwgd291bGQgYmUgaW5hcHByb3ByaWF0ZS4KKyAgICAg
ICBAcHJvcGVydHkgbG9jYXRpb24KKyAgICAgIEB0eXBlIHN0cmluZworICAgICAgQGRlZmF1bHQg
bnVsbAorICAgICAgQHB1YmxpYworICAgICovCisgICAgaWYgKG9wdGlvbnMubG9jYXRpb24gIT09
IHVuZGVmaW5lZCkgeworICAgICAgdGhpcy5sb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247Cisg
ICAgfQorCisgICAgaWYgKG9wdGlvbnMualF1ZXJ5ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRo
aXMualF1ZXJ5ID0gb3B0aW9ucy5qUXVlcnk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMuaXNJ
bnRlcmFjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLmlzSW50ZXJhY3RpdmUgPSAh
IW9wdGlvbnMuaXNJbnRlcmFjdGl2ZTsKKyAgICB9CisgIH07CisKKyAgQm9vdE9wdGlvbnMucHJv
dG90eXBlLnRvRW52aXJvbm1lbnQgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGVudiA9IF9lbWJl
ck1ldGFsQXNzaWduLmRlZmF1bHQoe30sIF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdCk7
CisgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlCisgICAgZW52Lmhh
c0RPTSA9IHRoaXMuaXNCcm93c2VyOworICAgIGVudi5vcHRpb25zID0gdGhpczsKKyAgICByZXR1
cm4gZW52OworICB9OworCisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvbkluc3Rh
bmNlLnByb3RvdHlwZSwgJ2NvbnRhaW5lcicsIHsKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisg
ICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIg
aW5zdGFuY2UgPSB0aGlzOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbG9va3VwOiBmdW5jdGlv
biAoKSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1VzaW5nIGBBcHBs
aWNhdGlvbkluc3RhbmNlLmNvbnRhaW5lci5sb29rdXBgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1
c2UgYEFwcGxpY2F0aW9uSW5zdGFuY2UubG9va3VwYCBpbnN0ZWFkLicsIGZhbHNlLCB7CisgICAg
ICAgICAgICBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLmFwcC1pbnN0YW5jZS1jb250YWluZXInLAor
ICAgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAgICAgICB1cmw6ICdodHRwOi8vZW1i
ZXJqcy5jb20vZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1hcHBsaWNhdGlvbmluc3RhbmNl
LWNvbnRhaW5lcicKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gaW5zdGFuY2UubG9v
a3VwLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICB9OworICAg
IH0KKyAgfSk7CisKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFwcGxpY2F0aW9uSW5zdGFuY2Uu
cHJvdG90eXBlLCAncmVnaXN0cnknLCB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIGVu
dW1lcmFibGU6IGZhbHNlLAorICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9l
bWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94eS5idWlsZEZha2VSZWdpc3RyeVdpdGhEZXBy
ZWNhdGlvbnModGhpcywgJ0FwcGxpY2F0aW9uSW5zdGFuY2UnKTsKKyAgICB9CisgIH0pOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEFwcGxpY2F0aW9uSW5zdGFuY2U7Cit9KTsKK2VuaWZlZCgnZW1i
ZXItYXBwbGljYXRpb24vc3lzdGVtL2FwcGxpY2F0aW9uJywgWydleHBvcnRzJywgJ2VtYmVyLW1l
dGFsJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdl
bWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAn
ZW1iZXItcnVudGltZS9jb250cm9sbGVycy9jb250cm9sbGVyJywgJ2VtYmVyLWh0bWxiYXJzL3N5
c3RlbS9kb20taGVscGVyJywgJ2VtYmVyLW1ldGFsLXZpZXdzJywgJ2VtYmVyLWh0bWxiYXJzL3Rl
bXBsYXRlcy90b3AtbGV2ZWwtdmlldycsICdlbWJlci1yb3V0aW5nLXZpZXdzL3ZpZXdzL291dGxl
dCcsICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9ldmVudF9k
aXNwYXRjaGVyJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItcm91dGluZy9z
eXN0ZW0vcm91dGUnLCAnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGVyJywgJ2VtYmVyLXJvdXRp
bmcvbG9jYXRpb24vaGFzaF9sb2NhdGlvbicsICdlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2hpc3Rv
cnlfbG9jYXRpb24nLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi9hdXRvX2xvY2F0aW9uJywgJ2Vt
YmVyLXJvdXRpbmcvbG9jYXRpb24vbm9uZV9sb2NhdGlvbicsICdlbWJlci1yb3V0aW5nL3N5c3Rl
bS9jYWNoZScsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24taW5zdGFuY2Un
LCAnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9maWVsZCcsICdlbWJlci12aWV3cy92aWV3cy90ZXh0
X2FyZWEnLCAnZW1iZXItdmlld3Mvdmlld3MvY2hlY2tib3gnLCAnZW1iZXItcm91dGluZy12aWV3
cy9jb21wb25lbnRzL2xpbmstdG8nLCAnZW1iZXItcm91dGluZy9zZXJ2aWNlcy9yb3V0aW5nJywg
J2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2NvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyJywgJ2VtYmVy
LXJ1bnRpbWUvbWl4aW5zL3JlZ2lzdHJ5X3Byb3h5JywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdl
bWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci1ydW50aW1lL2V4dC9yc3ZwJywgJ2VtYmVy
LWFwcGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWwsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LCBfZW1iZXJSdW50aW1lU3lzdGVtTGF6eV9sb2FkLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1i
ZXJSdW50aW1lQ29udHJvbGxlcnNDb250cm9sbGVyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhl
bHBlciwgX2VtYmVyTWV0YWxWaWV3cywgX2VtYmVySHRtbGJhcnNUZW1wbGF0ZXNUb3BMZXZlbFZp
ZXcsIF9lbWJlclJvdXRpbmdWaWV3c1ZpZXdzT3V0bGV0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldywg
X2VtYmVyVmlld3NTeXN0ZW1FdmVudF9kaXNwYXRjaGVyLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVy
eSwgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRlLCBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGVyLCBf
ZW1iZXJSb3V0aW5nTG9jYXRpb25IYXNoX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25I
aXN0b3J5X2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25BdXRvX2xvY2F0aW9uLCBfZW1i
ZXJSb3V0aW5nTG9jYXRpb25Ob25lX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nU3lzdGVtQ2FjaGUs
IF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb25JbnN0YW5jZSwgX2VtYmVyVmlld3NW
aWV3c1RleHRfZmllbGQsIF9lbWJlclZpZXdzVmlld3NUZXh0X2FyZWEsIF9lbWJlclZpZXdzVmll
d3NDaGVja2JveCwgX2VtYmVyUm91dGluZ1ZpZXdzQ29tcG9uZW50c0xpbmtUbywgX2VtYmVyUm91
dGluZ1NlcnZpY2VzUm91dGluZywgX2VtYmVyRXh0ZW5zaW9uU3VwcG9ydENvbnRhaW5lcl9kZWJ1
Z19hZGFwdGVyLCBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHksIF9jb250YWluZXJS
ZWdpc3RyeSwgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9l
bWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lLCBfcmVxdWlyZTIpIHsKKyAgLyoqCisgIEBtb2R1
bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgorICAqLworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5fcmVzZXRMZWdhY3lBZGRvbldhcm5pbmdzID0gX3Jlc2V0TGVn
YWN5QWRkb25XYXJuaW5nczsKKworICB2YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBs
YXRlTGl0ZXJhbExvb3NlKFsnLWJ1Y2tldC1jYWNoZTptYWluJ10sIFsnLWJ1Y2tldC1jYWNoZTpt
YWluJ10pLAorICAgICAgX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxM
b29zZShbJ3RlbXBsYXRlOmNvbXBvbmVudHMvLWRlZmF1bHQnXSwgWyd0ZW1wbGF0ZTpjb21wb25l
bnRzLy1kZWZhdWx0J10pOworCisgIGZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29z
ZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9CisK
KyAgdmFyIGxpYnJhcmllc1JlZ2lzdGVyZWQgPSBmYWxzZTsKKworICB2YXIgd2FybmVkQWJvdXRM
ZWdhY3lWaWV3QWRkb24gPSBmYWxzZTsKKyAgdmFyIHdhcm5lZEFib3V0TGVnYWN5Q29udHJvbGxl
ckFkZG9uID0gZmFsc2U7CisKKyAgLy8gRm9yIHRlc3RpbmcKKworICBmdW5jdGlvbiBfcmVzZXRM
ZWdhY3lBZGRvbldhcm5pbmdzKCkgeworICAgIHdhcm5lZEFib3V0TGVnYWN5Vmlld0FkZG9uID0g
ZmFsc2U7CisgICAgd2FybmVkQWJvdXRMZWdhY3lDb250cm9sbGVyQWRkb24gPSBmYWxzZTsKKyAg
fQorCisgIC8qKgorICAgIEFuIGluc3RhbmNlIG9mIGBFbWJlci5BcHBsaWNhdGlvbmAgaXMgdGhl
IHN0YXJ0aW5nIHBvaW50IGZvciBldmVyeSBFbWJlcgorICAgIGFwcGxpY2F0aW9uLiBJdCBoZWxw
cyB0byBpbnN0YW50aWF0ZSwgaW5pdGlhbGl6ZSBhbmQgY29vcmRpbmF0ZSB0aGUgbWFueQorICAg
IG9iamVjdHMgdGhhdCBtYWtlIHVwIHlvdXIgYXBwLgorICAKKyAgICBFYWNoIEVtYmVyIGFwcCBo
YXMgb25lIGFuZCBvbmx5IG9uZSBgRW1iZXIuQXBwbGljYXRpb25gIG9iamVjdC4gSW4gZmFjdCwg
dGhlCisgICAgdmVyeSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxkIGRvIGluIHlvdXIgYXBwbGljYXRp
b24gaXMgY3JlYXRlIHRoZSBpbnN0YW5jZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHdp
bmRvdy5BcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICBgYGAKKyAgCisgICAg
VHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIHRoZSBvbmx5IGdsb2JhbCB2YXJp
YWJsZS4gQWxsIG90aGVyCisgICAgY2xhc3NlcyBpbiB5b3VyIGFwcCBzaG91bGQgYmUgcHJvcGVy
dGllcyBvbiB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uYCBpbnN0YW5jZSwKKyAgICB3aGljaCBoaWdo
bGlnaHRzIGl0cyBmaXJzdCByb2xlOiBhIGdsb2JhbCBuYW1lc3BhY2UuCisgIAorICAgIEZvciBl
eGFtcGxlLCBpZiB5b3UgZGVmaW5lIGEgdmlldyBjbGFzcywgaXQgbWlnaHQgbG9vayBsaWtlIHRo
aXM6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuTXlWaWV3ID0gRW1iZXIuVmlldy5l
eHRlbmQoKTsKKyAgICBgYGAKKyAgCisgICAgQnkgZGVmYXVsdCwgY2FsbGluZyBgRW1iZXIuQXBw
bGljYXRpb24uY3JlYXRlKClgIHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplCisgICAgeW91
ciBhcHBsaWNhdGlvbiBieSBjYWxsaW5nIHRoZSBgRW1iZXIuQXBwbGljYXRpb24uaW5pdGlhbGl6
ZSgpYCBtZXRob2QuIElmCisgICAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlhbGl6YXRpb24sIHlv
dSBjYW4gY2FsbCB5b3VyIGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAorICAgIG1ldGhvZC4gV2hl
biB5b3UgYXJlIHJlYWR5IGZvciB5b3VyIGFwcCB0byBiZSBpbml0aWFsaXplZCwgY2FsbCBpdHMK
KyAgICBgYWR2YW5jZVJlYWRpbmVzcygpYCBtZXRob2QuCisgIAorICAgIFlvdSBjYW4gZGVmaW5l
IGEgYHJlYWR5YCBtZXRob2Qgb24gdGhlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5zdGFuY2UsIHdo
aWNoCisgICAgd2lsbCBiZSBydW4gYnkgRW1iZXIgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgaW5p
dGlhbGl6ZWQuCisgIAorICAgIEJlY2F1c2UgYEVtYmVyLkFwcGxpY2F0aW9uYCBpbmhlcml0cyBm
cm9tIGBFbWJlci5OYW1lc3BhY2VgLCBhbnkgY2xhc3NlcworICAgIHlvdSBjcmVhdGUgd2lsbCBo
YXZlIHVzZWZ1bCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHdoZW4gY2FsbGluZyBgdG9TdHJpbmco
KWAuCisgICAgU2VlIHRoZSBgRW1iZXIuTmFtZXNwYWNlYCBkb2N1bWVudGF0aW9uIGZvciBtb3Jl
IGluZm9ybWF0aW9uLgorICAKKyAgICBXaGlsZSB5b3UgY2FuIHRoaW5rIG9mIHlvdXIgYEVtYmVy
LkFwcGxpY2F0aW9uYCBhcyBhIGNvbnRhaW5lciB0aGF0IGhvbGRzIHRoZQorICAgIG90aGVyIGNs
YXNzZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgcmVzcG9u
c2liaWxpdGllcworICAgIGdvaW5nIG9uIHVuZGVyLXRoZS1ob29kIHRoYXQgeW91IG1heSB3YW50
IHRvIHVuZGVyc3RhbmQuCisgIAorICAgICMjIyBFdmVudCBEZWxlZ2F0aW9uCisgIAorICAgIEVt
YmVyIHVzZXMgYSB0ZWNobmlxdWUgY2FsbGVkIF9ldmVudCBkZWxlZ2F0aW9uXy4gVGhpcyBhbGxv
d3MgdGhlIGZyYW1ld29yaworICAgIHRvIHNldCB1cCBhIGdsb2JhbCwgc2hhcmVkIGV2ZW50IGxp
c3RlbmVyIGluc3RlYWQgb2YgcmVxdWlyaW5nIGVhY2ggdmlldyB0bworICAgIGRvIGl0IG1hbnVh
bGx5LiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBlYWNoIHZpZXcgcmVnaXN0ZXJpbmcgaXRzIG93
bgorICAgIGBtb3VzZWRvd25gIGxpc3RlbmVyIG9uIGl0cyBhc3NvY2lhdGVkIGVsZW1lbnQsIEVt
YmVyIHNldHMgdXAgYSBgbW91c2Vkb3duYAorICAgIGxpc3RlbmVyIG9uIHRoZSBgYm9keWAuCisg
IAorICAgIElmIGEgYG1vdXNlZG93bmAgZXZlbnQgb2NjdXJzLCBFbWJlciB3aWxsIGxvb2sgYXQg
dGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgYW5kCisgICAgc3RhcnQgd2Fsa2luZyB1cCB0aGUgRE9N
IG5vZGUgdHJlZSwgZmluZGluZyBjb3JyZXNwb25kaW5nIHZpZXdzIGFuZCBpbnZva2luZworICAg
IHRoZWlyIGBtb3VzZURvd25gIG1ldGhvZCBhcyBpdCBnb2VzLgorICAKKyAgICBgRW1iZXIuQXBw
bGljYXRpb25gIGhhcyBhIG51bWJlciBvZiBkZWZhdWx0IGV2ZW50cyB0aGF0IGl0IGxpc3RlbnMg
Zm9yLCBhcworICAgIHdlbGwgYXMgYSBtYXBwaW5nIGZyb20gbG93ZXJjYXNlIGV2ZW50cyB0byBj
YW1lbC1jYXNlZCB2aWV3IG1ldGhvZCBuYW1lcy4gRm9yCisgICAgZXhhbXBsZSwgdGhlIGBrZXlw
cmVzc2AgZXZlbnQgY2F1c2VzIHRoZSBga2V5UHJlc3NgIG1ldGhvZCBvbiB0aGUgdmlldyB0byBi
ZQorICAgIGNhbGxlZCwgdGhlIGBkYmxjbGlja2AgZXZlbnQgY2F1c2VzIGBkb3VibGVDbGlja2Ag
dG8gYmUgY2FsbGVkLCBhbmQgc28gb24uCisgIAorICAgIElmIHRoZXJlIGlzIGEgYnViYmxpbmcg
YnJvd3NlciBldmVudCB0aGF0IEVtYmVyIGRvZXMgbm90IGxpc3RlbiBmb3IgYnkKKyAgICBkZWZh
dWx0LCB5b3UgY2FuIHNwZWNpZnkgY3VzdG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGlu
ZyB2aWV3IG1ldGhvZAorICAgIG5hbWVzIGJ5IHNldHRpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgYGN1
c3RvbUV2ZW50c2AgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgdGhlIHBhc3RlIGV2ZW50CisgICAgICAgIHBhc3RlOiAn
cGFzdGUnCisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFRvIHByZXZlbnQgRW1i
ZXIgZnJvbSBzZXR0aW5nIHVwIGEgbGlzdGVuZXIgZm9yIGEgZGVmYXVsdCBldmVudCwKKyAgICBz
cGVjaWZ5IHRoZSBldmVudCBuYW1lIHdpdGggYSBgbnVsbGAgdmFsdWUgaW4gdGhlIGBjdXN0b21F
dmVudHNgCisgICAgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAvLyBwcmV2ZW50IGxpc3RlbmVycyBmb3IgbW91c2VlbnRlci9tb3VzZWxlYXZlIGV2ZW50
cworICAgICAgICBtb3VzZWVudGVyOiBudWxsLAorICAgICAgICBtb3VzZWxlYXZlOiBudWxsCisg
ICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEJ5IGRlZmF1bHQsIHRoZSBhcHBsaWNh
dGlvbiBzZXRzIHVwIHRoZXNlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgZG9jdW1lbnQKKyAgICBi
b2R5LiBIb3dldmVyLCBpbiBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGluZyBhbiBFbWJlciBh
cHBsaWNhdGlvbiBpbnNpZGUKKyAgICBhbiBleGlzdGluZyBwYWdlLCB5b3UgbWF5IHdhbnQgaXQg
dG8gc2V0IHVwIHRoZSBsaXN0ZW5lcnMgb24gYW4gZWxlbWVudAorICAgIGluc2lkZSB0aGUgYm9k
eS4KKyAgCisgICAgRm9yIGV4YW1wbGUsIGlmIG9ubHkgZXZlbnRzIGluc2lkZSBhIERPTSBlbGVt
ZW50IHdpdGggdGhlIElEIG9mIGBlbWJlci1hcHBgCisgICAgc2hvdWxkIGJlIGRlbGVnYXRlZCwg
c2V0IHlvdXIgYXBwbGljYXRpb24ncyBgcm9vdEVsZW1lbnRgIHByb3BlcnR5OgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7Cisg
ICAgICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IFRoZSBgcm9vdEVsZW1lbnRgIGNhbiBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciBhIGpRdWVy
eS1jb21wYXRpYmxlIHNlbGVjdG9yCisgICAgc3RyaW5nLiBOb3RlIHRoYXQgKnZpZXdzIGFwcGVu
ZGVkIHRvIHRoZSBET00gb3V0c2lkZSB0aGUgcm9vdCBlbGVtZW50IHdpbGwKKyAgICBub3QgcmVj
ZWl2ZSBldmVudHMuKiBJZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVsZW1lbnQsIG1ha2Ug
c3VyZSB5b3Ugb25seQorICAgIGFwcGVuZCB2aWV3cyBpbnNpZGUgaXQhCisgIAorICAgIFRvIGxl
YXJuIG1vcmUgYWJvdXQgdGhlIGV2ZW50cyBFbWJlciBjb21wb25lbnRzIHVzZSwgc2VlCisgICAg
W2NvbXBvbmVudHMvaGFuZGxpbmctZXZlbnRzXShodHRwczovL2d1aWRlcy5lbWJlcmpzLmNvbS92
Mi42LjAvY29tcG9uZW50cy9oYW5kbGluZy1ldmVudHMvI3RvY19ldmVudC1uYW1lcykuCisgIAor
ICAgICMjIyBJbml0aWFsaXplcnMKKyAgCisgICAgTGlicmFyaWVzIG9uIHRvcCBvZiBFbWJlciBj
YW4gYWRkIGluaXRpYWxpemVycywgbGlrZSBzbzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICdhcGktYWRhcHRl
cicsCisgIAorICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAg
ICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2FwaS1hZGFwdGVyOm1haW4nLCBBcGlBZGFwdGVyKTsK
KyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSW5pdGlhbGl6ZXJzIHByb3ZpZGUg
YW4gb3Bwb3J0dW5pdHkgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCByZWdpc3RyeSwgd2hpY2gKKyAg
ICBvcmdhbml6ZXMgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIGFuIEVtYmVyIGFwcGxpY2F0
aW9uLiBBZGRpdGlvbmFsbHkKKyAgICB0aGV5IHByb3ZpZGUgYSBjaGFuY2UgdG8gYWNjZXNzIHRo
ZSBpbnN0YW50aWF0ZWQgYXBwbGljYXRpb24uIEJleW9uZAorICAgIGJlaW5nIHVzZWQgZm9yIGxp
YnJhcmllcywgaW5pdGlhbGl6ZXJzIGFyZSBhbHNvIGEgZ3JlYXQgd2F5IHRvIG9yZ2FuaXplCisg
ICAgZGVwZW5kZW5jeSBpbmplY3Rpb24gb3Igc2V0dXAgaW4geW91ciBvd24gYXBwbGljYXRpb24u
CisgIAorICAgICMjIyBSb3V0aW5nCisgIAorICAgIEluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIHlv
dXIgYXBwbGljYXRpb24ncyByb3V0ZXIsIGBFbWJlci5BcHBsaWNhdGlvbmAgaXMKKyAgICBhbHNv
IHJlc3BvbnNpYmxlIGZvciB0ZWxsaW5nIHRoZSByb3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5n
LiBUcmFuc2l0aW9ucworICAgIGJldHdlZW4gcm91dGVzIGNhbiBiZSBsb2dnZWQgd2l0aCB0aGUg
YExPR19UUkFOU0lUSU9OU2AgZmxhZywgYW5kIG1vcmUKKyAgICBkZXRhaWxlZCBpbnRyYS10cmFu
c2l0aW9uIGxvZ2dpbmcgY2FuIGJlIGxvZ2dlZCB3aXRoCisgICAgdGhlIGBMT0dfVFJBTlNJVElP
TlNfSU5URVJOQUxgIGZsYWc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBwID0g
RW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIExPR19UUkFOU0lUSU9OUzogdHJ1ZSwg
Ly8gYmFzaWMgbG9nZ2luZyBvZiBzdWNjZXNzZnVsIHRyYW5zaXRpb25zCisgICAgICBMT0dfVFJB
TlNJVElPTlNfSU5URVJOQUw6IHRydWUgLy8gZGV0YWlsZWQgbG9nZ2luZyBvZiBhbGwgcm91dGlu
ZyBzdGVwcworICAgIH0pOworICAgIGBgYAorICAKKyAgICBCeSBkZWZhdWx0LCB0aGUgcm91dGVy
IHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBVUkwgaW50bworICAg
IGFwcGxpY2F0aW9uIHN0YXRlIG9uY2UgdGhlIGJyb3dzZXIgZW1pdHMgdGhlIGBET01Db250ZW50
UmVhZHlgIGV2ZW50LiBJZiB5b3UKKyAgICBuZWVkIHRvIGRlZmVyIHJvdXRpbmcsIHlvdSBjYW4g
Y2FsbCB0aGUgYXBwbGljYXRpb24ncyBgZGVmZXJSZWFkaW5lc3MoKWAKKyAgICBtZXRob2QuIE9u
Y2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhlIGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhv
ZC4KKyAgCisgICAgSWYgdGhlcmUgaXMgYW55IHNldHVwIHJlcXVpcmVkIGJlZm9yZSByb3V0aW5n
IGJlZ2lucywgeW91IGNhbiBpbXBsZW1lbnQgYQorICAgIGByZWFkeSgpYCBtZXRob2Qgb24geW91
ciBhcHAgdGhhdCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHJvdXRpbmcKKyAg
ICBiZWdpbnMuCisgIAorICAgIEBjbGFzcyBBcHBsaWNhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1i
ZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5FbmdpbmUKKyAgICBAdXNlcyBSZWdpc3RyeVByb3h5TWl4
aW4KKyAgICBAcHVibGljCisgICovCisKKyAgdmFyIEFwcGxpY2F0aW9uID0gX2VtYmVyQXBwbGlj
YXRpb25TeXN0ZW1FbmdpbmUuZGVmYXVsdC5leHRlbmQoeworICAgIF9zdXBwcmVzc0RlZmVycmVk
RGVwcmVjYXRpb246IHRydWUsCisKKyAgICAvKioKKyAgICAgIFRoZSByb290IERPTSBlbGVtZW50
IG9mIHRoZSBBcHBsaWNhdGlvbi4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuCisgICAgICBl
bGVtZW50IG9yIGEKKyAgICAgIFtqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmddKGh0
dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jYXRlZ29yeS9zZWxlY3RvcnMvKS4KKyAgICAgICBUaGlzIGlz
IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIEFwcGxpY2F0aW9uJ3MsCisg
ICAgICBgZXZlbnREaXNwYXRjaGVyYCwgd2hpY2ggc2V0cyB1cCB0aGUgbGlzdGVuZXJzIGZvciBl
dmVudCBkZWxlZ2F0aW9uLiBFdmVyeQorICAgICAgdmlldyBpbiB5b3VyIGFwcGxpY2F0aW9uIHNo
b3VsZCBiZSBhIGNoaWxkIG9mIHRoZSBlbGVtZW50IHlvdSBzcGVjaWZ5IGhlcmUuCisgICAgICAg
QHByb3BlcnR5IHJvb3RFbGVtZW50CisgICAgICBAdHlwZSBET01FbGVtZW50CisgICAgICBAZGVm
YXVsdCAnYm9keScKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJvb3RFbGVtZW50OiAnYm9k
eScsCisKKyAgICAvKioKKyAgICAgIFRoZSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCByZXNwb25z
aWJsZSBmb3IgZGVsZWdhdGluZyBldmVudHMgdG8gdGhpcworICAgICAgYXBwbGljYXRpb24ncyB2
aWV3cy4KKyAgICAgICBUaGUgZXZlbnQgZGlzcGF0Y2hlciBpcyBjcmVhdGVkIGJ5IHRoZSBhcHBs
aWNhdGlvbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lCisgICAgICBhbmQgc2V0cyB1cCBldmVudCBs
aXN0ZW5lcnMgb24gdGhlIERPTSBlbGVtZW50IGRlc2NyaWJlZCBieSB0aGUKKyAgICAgIGFwcGxp
Y2F0aW9uJ3MgYHJvb3RFbGVtZW50YCBwcm9wZXJ0eS4KKyAgICAgICBTZWUgdGhlIGRvY3VtZW50
YXRpb24gZm9yIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLgor
ICAgICAgIEBwcm9wZXJ0eSBldmVudERpc3BhdGNoZXIKKyAgICAgIEB0eXBlIEVtYmVyLkV2ZW50
RGlzcGF0Y2hlcgorICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgZXZlbnREaXNwYXRjaGVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgRE9NIGV2ZW50
cyBmb3Igd2hpY2ggdGhlIGV2ZW50IGRpc3BhdGNoZXIgc2hvdWxkIGxpc3Rlbi4KKyAgICAgICBC
eSBkZWZhdWx0LCB0aGUgYXBwbGljYXRpb24ncyBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBsaXN0
ZW5zCisgICAgICBmb3IgYSBzZXQgb2Ygc3RhbmRhcmQgRE9NIGV2ZW50cywgc3VjaCBhcyBgbW91
c2Vkb3duYCBhbmQKKyAgICAgIGBrZXl1cGAsIGFuZCBkZWxlZ2F0ZXMgdGhlbSB0byB5b3VyIGFw
cGxpY2F0aW9uJ3MgYEVtYmVyLlZpZXdgCisgICAgICBpbnN0YW5jZXMuCisgICAgICAgSWYgeW91
IHdvdWxkIGxpa2UgYWRkaXRpb25hbCBidWJibGluZyBldmVudHMgdG8gYmUgZGVsZWdhdGVkIHRv
IHlvdXIKKyAgICAgIHZpZXdzLCBzZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gJ3MgYGN1c3Rv
bUV2ZW50c2AgcHJvcGVydHkKKyAgICAgIHRvIGEgaGFzaCBjb250YWluaW5nIHRoZSBET00gZXZl
bnQgbmFtZSBhcyB0aGUga2V5IGFuZCB0aGUKKyAgICAgIGNvcnJlc3BvbmRpbmcgdmlldyBtZXRo
b2QgbmFtZSBhcyB0aGUgdmFsdWUuIFNldHRpbmcgYW4gZXZlbnQgdG8KKyAgICAgIGEgdmFsdWUg
b2YgYG51bGxgIHdpbGwgcHJldmVudCBhIGRlZmF1bHQgZXZlbnQgbGlzdGVuZXIgZnJvbSBiZWlu
ZworICAgICAgYWRkZWQgZm9yIHRoYXQgZXZlbnQuCisgICAgICAgVG8gYWRkIG5ldyBldmVudHMg
dG8gYmUgbGlzdGVuZWQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9
IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7CisgICAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciB0aGUgcGFzdGUgZXZlbnQKKyAgICAgICAgICBwYXN0
ZTogJ3Bhc3RlJworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRvIHBy
ZXZlbnQgZGVmYXVsdCBldmVudHMgZnJvbSBiZWluZyBsaXN0ZW5lZCB0bzoKKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAg
ICAgICAgY3VzdG9tRXZlbnRzOiB7CisgICAgICAgICAgLy8gcmVtb3ZlIHN1cHBvcnQgZm9yIG1v
dXNlZW50ZXIgLyBtb3VzZWxlYXZlIGV2ZW50cworICAgICAgICAgIG1vdXNlZW50ZXI6IG51bGws
CisgICAgICAgICAgbW91c2VsZWF2ZTogbnVsbAorICAgICAgICB9CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgQHByb3BlcnR5IGN1c3RvbUV2ZW50cworICAgICAgQHR5cGUgT2JqZWN0Cisg
ICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBjdXN0b21FdmVu
dHM6IG51bGwsCisKKyAgICAvKioKKyAgICAgIFdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNob3Vs
ZCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHJvdXRpbmcgYW5kIHJlbmRlcgorICAgICAgdGVtcGxhdGVz
IHRvIHRoZSBgcm9vdEVsZW1lbnRgIG9uIERPTSByZWFkeS4gV2hpbGUgZGVmYXVsdCBieSB0cnVl
LAorICAgICAgb3RoZXIgZW52aXJvbm1lbnRzIHN1Y2ggYXMgRmFzdEJvb3Qgb3IgYSB0ZXN0aW5n
IGhhcm5lc3MgY2FuIHNldCB0aGlzCisgICAgICBwcm9wZXJ0eSB0byBgZmFsc2VgIGFuZCBjb250
cm9sIHRoZSBwcmVjaXNlIHRpbWluZyBhbmQgYmVoYXZpb3Igb2YgdGhlIGJvb3QKKyAgICAgIHBy
b2Nlc3MuCisgICAgICAgQHByb3BlcnR5IGF1dG9ib290CisgICAgICBAdHlwZSBCb29sZWFuCisg
ICAgICBAZGVmYXVsdCB0cnVlCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYXV0b2Jvb3Q6
IHRydWUsCisKKyAgICAvKioKKyAgICAgIFdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBi
ZSBjb25maWd1cmVkIGZvciB0aGUgbGVnYWN5ICJnbG9iYWxzIG1vZGUiLgorICAgICAgVW5kZXIg
dGhpcyBtb2RlLCB0aGUgQXBwbGljYXRpb24gb2JqZWN0IHNlcnZlcyBhcyBhIGdsb2JhbCBuYW1l
c3BhY2UgZm9yIGFsbAorICAgICAgY2xhc3Nlcy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgICAgLi4uCisgICAg
ICB9KTsKKyAgICAgICBBcHAuUm91dGVyLnJlb3Blbih7CisgICAgICAgIGxvY2F0aW9uOiAnbm9u
ZScKKyAgICAgIH0pOworICAgICAgIEFwcC5Sb3V0ZXIubWFwKHsKKyAgICAgICAgLi4uCisgICAg
ICB9KTsKKyAgICAgICBBcHAuTXlDb21wb25lbnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsK
KyAgICAgICAgLi4uCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRoaXMgZmxhZyBhbHNv
IGV4cG9zZXMgb3RoZXIgaW50ZXJuYWwgQVBJcyB0aGF0IGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBv
ZgorICAgICAgYSBzcGVjaWFsICJkZWZhdWx0IGluc3RhbmNlIiwgbGlrZSBgQXBwLl9fY29udGFp
bmVyX18ubG9va3VwKC4uLilgLgorICAgICAgIFRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBub3Qg
Y29uZmlndXJhYmxlLCBpdHMgdmFsdWUgaXMgZGVyaXZlZCBmcm9tCisgICAgICB0aGUgYGF1dG9i
b290YCBmbGFnIOKAkyBkaXNhYmxpbmcgYGF1dG9ib290YCBhbHNvIGltcGxpZXMgb3B0aW5nLW91
dCBvZgorICAgICAgZ2xvYmFscyBtb2RlIHN1cHBvcnQsIGFsdGhvdWdoIHRoZXkgYXJlIHVsdGlt
YXRlbHkgb3J0aG9nb25hbCBjb25jZXJucy4KKyAgICAgICBTb21lIG9mIHRoZSBnbG9iYWwgbW9k
ZXMgZmVhdHVyZXMgYXJlIGFscmVhZHkgZGVwcmVjYXRlZCBpbiAxLnguIFRoZQorICAgICAgZXhp
c3RlbmNlIG9mIHRoaXMgZmxhZyBpcyB0byB1bnRhbmdsZSB0aGUgZ2xvYmFscyBtb2RlIGNvZGUg
cGF0aHMgZnJvbQorICAgICAgdGhlIGF1dG9ib290IGNvZGUgcGF0aHMsIHNvIHRoYXQgdGhlc2Ug
bGVnYWN5IGZlYXR1cmVzIGNhbiBiZSByZXZpZXdlZAorICAgICAgZm9yIGRlcHJlY2F0aW9uL3Jl
bW92YWwgc2VwYXJhdGVseS4KKyAgICAgICBGb3JjaW5nIHRoZSAoYXV0b2Jvb3Q9dHJ1ZSwgX2ds
b2JhbHNNb2RlPWZhbHNlKSBoZXJlIGFuZCBydW5uaW5nIHRoZSB0ZXN0cworICAgICAgd291bGQg
cmV2ZWFsIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHdlIGFyZSBzdGlsbCByZWx5aW5nIG9uIHRoZXNl
IGxlZ2FjeQorICAgICAgYmVoYXZpb3IgaW50ZXJuYWxseSAobW9zdGx5IGp1c3QgdGVzdHMpLgor
ICAgICAgIEBwcm9wZXJ0eSBfZ2xvYmFsc01vZGUKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAgICAg
IEBkZWZhdWx0IHRydWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBfZ2xvYmFsc01vZGU6
IHRydWUsCisKKyAgICBpbml0OiBmdW5jdGlvbiAob3B0aW9ucykgeworICAgICAgdGhpcy5fc3Vw
ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKCF0aGlzLiQpIHsKKyAgICAg
ICAgdGhpcy4kID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdDsKKyAgICAgIH0KKwor
ICAgICAgcmVnaXN0ZXJMaWJyYXJpZXMoKTsKKyAgICAgIGxvZ0xpYnJhcnlWZXJzaW9ucygpOwor
CisgICAgICAvLyBTdGFydCBvZmYgdGhlIG51bWJlciBvZiBkZWZlcnJhbHMgYXQgMS4gVGhpcyB3
aWxsIGJlIGRlY3JlbWVudGVkIGJ5CisgICAgICAvLyB0aGUgQXBwbGljYXRpb24ncyBvd24gYGJv
b3RgIG1ldGhvZC4KKyAgICAgIHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9IDE7CisgICAgICB0
aGlzLl9ib290ZWQgPSBmYWxzZTsKKworICAgICAgdGhpcy5hdXRvYm9vdCA9IHRoaXMuX2dsb2Jh
bHNNb2RlID0gISF0aGlzLmF1dG9ib290OworCisgICAgICBpZiAodGhpcy5fZ2xvYmFsc01vZGUp
IHsKKyAgICAgICAgdGhpcy5fcHJlcGFyZUZvckdsb2JhbHNNb2RlKCk7CisgICAgICB9CisKKyAg
ICAgIGlmICh0aGlzLmF1dG9ib290KSB7CisgICAgICAgIHRoaXMud2FpdEZvckRPTVJlYWR5KCk7
CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ3JlYXRlIGFuIEFwcGxpY2F0aW9u
SW5zdGFuY2UgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgYnVpbGRJbnN0YW5jZQorICAgICAgQHJldHVybiB7RW1iZXIuQXBwbGljYXRpb25JbnN0
YW5jZX0gdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlCisgICAgKi8KKyAgICBidWlsZEluc3RhbmNl
OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0g
MCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisg
ICAgICBvcHRpb25zLmJhc2UgPSB0aGlzOworICAgICAgb3B0aW9ucy5hcHBsaWNhdGlvbiA9IHRo
aXM7CisgICAgICByZXR1cm4gX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbkluc3Rh
bmNlLmRlZmF1bHQuY3JlYXRlKG9wdGlvbnMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEVu
YWJsZSB0aGUgbGVnYWN5IGdsb2JhbHMgbW9kZSBieSBhbGxvd2luZyB0aGlzIGFwcGxpY2F0aW9u
IHRvIGFjdAorICAgICAgYXMgYSBnbG9iYWwgbmFtZXNwYWNlLiBTZWUgdGhlIGRvY3Mgb24gdGhl
IGBfZ2xvYmFsc01vZGVgIHByb3BlcnR5CisgICAgICBmb3IgZGV0YWlscy4KKyAgICAgICBNb3N0
IG9mIHRoZXNlIGZlYXR1cmVzIGFyZSBhbHJlYWR5IGRlcHJlY2F0ZWQgaW4gMS54LCBzbyB3ZSBj
YW4KKyAgICAgIHN0b3AgdXNpbmcgdGhlbSBpbnRlcm5hbGx5IGFuZCB0cnkgdG8gcmVtb3ZlIHRo
ZW0uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgX3ByZXBhcmVGb3JHbG9iYWxzTW9k
ZQorICAgICovCisgICAgX3ByZXBhcmVGb3JHbG9iYWxzTW9kZTogZnVuY3Rpb24gKCkgeworICAg
ICAgLy8gQ3JlYXRlIHN1YmNsYXNzIG9mIEVtYmVyLlJvdXRlciBmb3IgdGhpcyBBcHBsaWNhdGlv
biBpbnN0YW5jZS4KKyAgICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgc29tZW9uZSByZW9w
ZW5pbmcgYEFwcC5Sb3V0ZXJgIGRvZXMgbm90CisgICAgICAvLyB0YW1wZXIgd2l0aCB0aGUgZGVm
YXVsdCBgRW1iZXIuUm91dGVyYC4KKyAgICAgIHRoaXMuUm91dGVyID0gKHRoaXMuUm91dGVyIHx8
IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXIuZGVmYXVsdCkuZXh0ZW5kKCk7CisKKyAgICAgIHRo
aXMuX2J1aWxkRGVwcmVjYXRlZEluc3RhbmNlKCk7CisgICAgfSwKKworICAgIC8qCisgICAgICBC
dWlsZCB0aGUgZGVwcmVjYXRlZCBpbnN0YW5jZSBmb3IgbGVnYWN5IGdsb2JhbHMgbW9kZSBzdXBw
b3J0LgorICAgICAgQ2FsbGVkIHdoZW4gY3JlYXRpbmcgYW5kIHJlc2V0dGluZyB0aGUgYXBwbGlj
YXRpb24uCisgICAgICAgVGhpcyBpcyBvcnRob2dvbmFsIHRvIGF1dG9ib290OiB0aGUgZGVwcmVj
YXRlZCBpbnN0YW5jZSBuZWVkcyB0bworICAgICAgYmUgY3JlYXRlZCBhdCBBcHBsaWNhdGlvbiBj
b25zdHJ1Y3Rpb24gKG5vdCBib290KSB0aW1lIHRvIGV4cG9zZQorICAgICAgQXBwLl9fY29udGFp
bmVyX18gYW5kIHRoZSBnbG9iYWwgRW1iZXIuVmlldy52aWV3cyByZWdpc3RyeS4gSWYKKyAgICAg
IGF1dG9ib290IHNlZXMgdGhhdCB0aGlzIGluc3RhbmNlIGV4aXN0cywgaXQgd2lsbCBjb250aW51
ZSBib290aW5nCisgICAgICBpdCB0byBhdm9pZCBkb2luZyB1bm5jZXNzYXJ5IHdvcmsgKGFzIG9w
cG9zZWQgdG8gYnVpbGRpbmcgYSBuZXcKKyAgICAgIGluc3RhbmNlIGF0IGJvb3QgdGltZSksIGJ1
dCB0aGV5IGFyZSBvdGhlcndpc2UgdW5yZWxhdGVkLgorICAgICAgIEBwcml2YXRlCisgICAgICBA
bWV0aG9kIF9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZQorICAgICovCisgICAgX2J1aWxkRGVwcmVj
YXRlZEluc3RhbmNlOiBmdW5jdGlvbiAoKSB7CisgICAgICAvLyBCdWlsZCBhIGRlZmF1bHQgaW5z
dGFuY2UKKyAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuYnVpbGRJbnN0YW5jZSgpOworCisgICAg
ICAvLyBMZWdhY3kgc3VwcG9ydCBmb3IgQXBwLl9fY29udGFpbmVyX18gYW5kIG90aGVyIGdsb2Jh
bCBtZXRob2RzCisgICAgICAvLyBvbiBBcHAgdGhhdCByZWx5IG9uIGEgc2luZ2xlLCBkZWZhdWx0
IGluc3RhbmNlLgorICAgICAgdGhpcy5fX2RlcHJlY2F0ZWRJbnN0YW5jZV9fID0gaW5zdGFuY2U7
CisgICAgICB0aGlzLl9fY29udGFpbmVyX18gPSBpbnN0YW5jZS5fX2NvbnRhaW5lcl9fOworCisg
ICAgICAvLyBGb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb25seSwgc2V0IHRoZSB2aWV3IHJlZ2lz
dHJ5IHRvIHRoZSBnbG9iYWwKKyAgICAgIC8vIEVtYmVyLlZpZXcudmlld3MgaGFzaCBmb3IgYmFj
a3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICAgICBfZW1iZXJWaWV3c1ZpZXdzVmlldy5kZWZhdWx0
LnZpZXdzID0gaW5zdGFuY2UubG9va3VwKCctdmlldy1yZWdpc3RyeTptYWluJyk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgQXV0b21hdGljYWxseSBraWNrLW9mZiB0aGUgYm9vdCBwcm9jZXNz
IGZvciB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUKKyAgICAgIERPTSBoYXMgYmVjb21lIHJlYWR5
LgorICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBpdHNlbGYgaXMgc2NoZWR1bGVkIG9uIHRoZSBh
Y3Rpb25zIHF1ZXVlIHdoaWNoCisgICAgICBlbnN1cmVzIHRoYXQgY29kZS1sb2FkaW5nIGZpbmlz
aGVzIGJlZm9yZSBib290aW5nLgorICAgICAgIElmIHlvdSBhcmUgYXN5bmNocm9ub3VzbHkgbG9h
ZGluZyBjb2RlLCB5b3Ugc2hvdWxkIGNhbGwgYGRlZmVyUmVhZGluZXNzKClgCisgICAgICB0byBk
ZWZlciBib290aW5nLCBhbmQgdGhlbiBjYWxsIGBhZHZhbmNlUmVhZGluZXNzKClgIG9uY2UgYWxs
IG9mIHlvdXIgY29kZQorICAgICAgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2Qgd2FpdEZvckRPTVJlYWR5CisgICAgKi8KKyAgICB3YWl0Rm9yRE9N
UmVhZHk6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy4kIHx8IHRoaXMuJC5pc1JlYWR5
KSB7CisgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZSgnYWN0aW9u
cycsIHRoaXMsICdkb21SZWFkeScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy4kKCku
cmVhZHkoX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmJpbmQodGhpcywgJ2RvbVJlYWR5Jykp
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRoaXMgaXMgdGhlIGF1dG9ib290
IGZsb3c6CisgICAgICAgMS4gQm9vdCB0aGUgYXBwIGJ5IGNhbGxpbmcgYHRoaXMuYm9vdCgpYAor
ICAgICAgMi4gQ3JlYXRlIGFuIGluc3RhbmNlIChvciB1c2UgdGhlIGBfX2RlcHJlY2F0ZWRJbnN0
YW5jZV9fYCBpbiBnbG9iYWxzIG1vZGUpCisgICAgICAzLiBCb290IHRoZSBpbnN0YW5jZSBieSBj
YWxsaW5nIGBpbnN0YW5jZS5ib290KClgCisgICAgICA0LiBJbnZva2UgdGhlIGBBcHAucmVhZHko
KWAgY2FsbGJhY2sKKyAgICAgIDUuIEtpY2stb2ZmIHJvdXRpbmcgb24gdGhlIGluc3RhbmNlCisg
ICAgICAgSWRlYWxseSwgdGhpcyBpcyBhbGwgd2Ugd291bGQgbmVlZCB0byBkbzoKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBfYXV0b0Jvb3QoKSB7CisgICAgICAgIHRoaXMuYm9vdCgpLnRo
ZW4oKCkgPT4geworICAgICAgICAgIGxldCBpbnN0YW5jZSA9ICh0aGlzLl9nbG9iYWxzTW9kZSkg
PyB0aGlzLl9fZGVwcmVjYXRlZEluc3RhbmNlX18gOiB0aGlzLmJ1aWxkSW5zdGFuY2UoKTsKKyAg
ICAgICAgICByZXR1cm4gaW5zdGFuY2UuYm9vdCgpOworICAgICAgICB9KS50aGVuKChpbnN0YW5j
ZSkgPT4geworICAgICAgICAgIEFwcC5yZWFkeSgpOworICAgICAgICAgIGluc3RhbmNlLnN0YXJ0
Um91dGluZygpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIGBgYAorICAgICAgIFVuZm9y
dHVuYXRlbHksIHdlIGNhbm5vdCBhY3R1YWxseSB3cml0ZSB0aGlzIGJlY2F1c2Ugd2UgbmVlZCB0
byBwYXJ0aWNpcGF0ZQorICAgICAgaW4gdGhlICJzeW5jaHJvbm91cyIgYm9vdCBwcm9jZXNzLiBX
aGlsZSB0aGUgY29kZSBhYm92ZSB3b3VsZCB3b3JrIGZpbmUgb24KKyAgICAgIHRoZSBpbml0aWFs
IGJvb3QgKGkuZS4gRE9NIHJlYWR5KSwgd2hlbiBgQXBwLnJlc2V0KClgIGlzIGNhbGxlZCwgd2Ug
bmVlZCB0bworICAgICAgYm9vdCBhIG5ldyBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChzZWUgdGhl
IGRvY3VtZW50YXRpb24gb24gYF9ib290U3luYygpYAorICAgICAgZm9yIGRldGFpbHMpLgorICAg
ICAgIEJlY2F1c2Ugb2YgdGhpcyByZXN0cmljdGlvbiwgdGhlIGFjdHVhbCBsb2dpYyBvZiB0aGlz
IG1ldGhvZCBpcyBsb2NhdGVkCisgICAgICBpbnNpZGUgYGRpZEJlY29tZVJlYWR5KClgLgorICAg
ICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGRvbVJlYWR5CisgICAgKi8KKyAgICBkb21SZWFk
eTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHsKKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9ib290U3luYygpOworCisgICAgICAvLyBD
b250aW51ZXMgdG8gYGRpZEJlY29tZVJlYWR5YAorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFVz
ZSB0aGlzIHRvIGRlZmVyIHJlYWRpbmVzcyB1bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0cnVlLgor
ICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9IEVt
YmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOworICAgICAgIEFwcC5kZWZlclJlYWRpbmVzcygpOwor
ICAgICAgIC8vIEVtYmVyLiQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGpRdWVyeSBvYmplY3QvZnVu
Y3Rpb24KKyAgICAgIEVtYmVyLiQuZ2V0SlNPTignL2F1dGgtdG9rZW4nLCBmdW5jdGlvbih0b2tl
bikgeworICAgICAgICBBcHAudG9rZW4gPSB0b2tlbjsKKyAgICAgICAgQXBwLmFkdmFuY2VSZWFk
aW5lc3MoKTsKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgVGhpcyBhbGxvd3MgeW91IHRv
IHBlcmZvcm0gYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGFuZCBkZWZlcgorICAgICAgYm9vdGlu
ZyB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHRoZSBzZXR1cCBoYXMgZmluaXNoZWQuCisgICAgICAg
SG93ZXZlciwgaWYgdGhlIHNldHVwIHJlcXVpcmVzIGEgbG9hZGluZyBVSSwgaXQgbWlnaHQgYmUg
YmV0dGVyCisgICAgICB0byB1c2UgdGhlIHJvdXRlciBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAg
IEBtZXRob2QgZGVmZXJSZWFkaW5lc3MKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGRlZmVy
UmVhZGluZXNzOiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
WW91IG11c3QgY2FsbCBkZWZlclJlYWRpbmVzcyBvbiBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBs
aWNhdGlvbicsIHRoaXMgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbik7CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBkZWZlciByZWFkaW5lc3Mgc2luY2UgdGhlIGByZWFk
eSgpYCBob29rIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLicsIHRoaXMuX3JlYWRpbmVzc0RlZmVy
cmFscyA+IDApOworICAgICAgdGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzKys7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgQ2FsbCBgYWR2YW5jZVJlYWRpbmVzc2AgYWZ0ZXIgYW55IGFzeW5jaHJv
bm91cyBzZXR1cCBsb2dpYyBoYXMgY29tcGxldGVkLgorICAgICAgRWFjaCBjYWxsIHRvIGBkZWZl
clJlYWRpbmVzc2AgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5jZVJlYWRpbmVz
c2AKKyAgICAgIG9yIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlY29tZSByZWFkeSBhbmQg
cm91dGluZyB3aWxsIG5vdCBiZWdpbi4KKyAgICAgICBAbWV0aG9kIGFkdmFuY2VSZWFkaW5lc3MK
KyAgICAgIEBzZWUge0VtYmVyLkFwcGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzfQorICAgICAgQHB1
YmxpYworICAgICovCisgICAgYWR2YW5jZVJlYWRpbmVzczogZnVuY3Rpb24gKCkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBtdXN0IGNhbGwgYWR2YW5jZVJlYWRpbmVzcyBv
biBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBsaWNhdGlvbicsIHRoaXMgaW5zdGFuY2VvZiBBcHBs
aWNhdGlvbik7CisgICAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMtLTsKKworICAgICAgaWYg
KHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9PT0gMCkgeworICAgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLCB0aGlzLmRpZEJlY29tZVJlYWR5KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBhbmQg
cmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGBFbWJlci5BcHBsaWNhdGlv
bmAKKyAgICAgIG9iamVjdCB3aGVuIHRoZSBib290IHByb2Nlc3MgaXMgY29tcGxldGUuCisgICAg
ICAgUnVuIGFueSBhcHBsaWNhdGlvbiBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRp
b24gbG9hZCBob29rLiBUaGVzZSBob29rcyBtYXkKKyAgICAgIGNob29zZSB0byBkZWZlciByZWFk
aW5lc3MuIEZvciBleGFtcGxlLCBhbiBhdXRoZW50aWNhdGlvbiBob29rIG1pZ2h0IHdhbnQgdG8g
ZGVmZXIKKyAgICAgIHJlYWRpbmVzcyB1bnRpbCB0aGUgYXV0aCB0b2tlbiBoYXMgYmVlbiByZXRy
aWV2ZWQuCisgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRp
Y2FsbHkgb24gIkRPTSByZWFkeSI7IGhvd2V2ZXIsIGlmIGF1dG9ib290CisgICAgICBpcyBkaXNh
YmxlZCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHRoZSBmaXJzdCBhcHBsaWNh
dGlvbiBpbnN0YW5jZSBpcworICAgICAgY3JlYXRlZCB2aWEgYHZpc2l0YC4KKyAgICAgICBAcHJp
dmF0ZQorICAgICAgQG1ldGhvZCBib290CisgICAgICBAcmV0dXJuIHtQcm9taXNlPEVtYmVyLkFw
cGxpY2F0aW9uLEVycm9yPn0KKyAgICAqLworICAgIGJvb3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGlmICh0aGlzLl9ib290UHJvbWlzZSkgeworICAgICAgICByZXR1cm4gdGhpcy5fYm9vdFByb21p
c2U7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX2Jvb3RTeW5jKCk7Cisg
ICAgICB9IGNhdGNoIChfKSB7CisgICAgICAgIC8vIElnbm9yZSB0aCBlcnJvcjogaW4gdGhlIGFz
eW5jaHJvbm91cyBib290IHBhdGgsIHRoZSBlcnJvciBpcyBhbHJlYWR5IHJlZmxlY3RlZAorICAg
ICAgICAvLyBpbiB0aGUgcHJvbWlzZSByZWplY3Rpb24KKyAgICAgIH0KKworICAgICAgcmV0dXJu
IHRoaXMuX2Jvb3RQcm9taXNlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFVuZm9ydHVuYXRl
bHksIGEgbG90IG9mIGV4aXN0aW5nIGNvZGUgYXNzdW1lcyB0aGUgYm9vdGluZyBwcm9jZXNzIGlz
CisgICAgICAic3luY2hyb25vdXMiLiBTcGVjaWZpY2FsbHksIGEgbG90IG9mIHRlc3RzIGFzc3Vt
ZXMgdGhlIGxhc3QgY2FsbCB0bworICAgICAgYGFwcC5hZHZhbmNlUmVhZGluZXNzKClgIG9yIGBh
cHAucmVzZXQoKWAgd2lsbCByZXN1bHQgaW4gdGhlIGFwcCBiZWluZworICAgICAgZnVsbHktYm9v
dGVkIHdoZW4gdGhlIGN1cnJlbnQgcnVubG9vcCBjb21wbGV0ZXMuCisgICAgICAgV2Ugd291bGQg
bGlrZSBuZXcgY29kZSAobGlrZSB0aGUgYHZpc2l0YCBBUEkpIHRvIHN0b3AgbWFraW5nIHRoaXMg
YXNzdW1wdGlvbiwKKyAgICAgIHNvIHdlIGNyZWF0ZWQgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9u
IGFib3ZlIHRoYXQgcmV0dXJucyBhIHByb21pc2UuIEJ1dCB1bnRpbAorICAgICAgd2UgaGF2ZSBt
aWdyYXRlZCBhbGwgdGhlIGNvZGUsIHdlIHdvdWxkIGhhdmUgdG8gZXhwb3NlIHRoaXMgbWV0aG9k
IGZvciB1c2UKKyAgICAgICppbnRlcm5hbGx5KiBpbiBwbGFjZXMgd2hlcmUgd2UgbmVlZCB0byBi
b290IGFuIGFwcCAic3luY2hyb25vdXNseSIuCisgICAgICAgQHByaXZhdGUKKyAgICAqLworICAg
IF9ib290U3luYzogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuX2Jvb3RlZCkgeworICAg
ICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkVO
Vi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQgJiYgIXdhcm5lZEFib3V0TGVnYWN5Vmlld0Fk
ZG9uKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdTdXBwb3J0IGZvciB0
aGUgYGVtYmVyLWxlZ2FjeS12aWV3c2AgYWRkb24gd2lsbCBlbmQgc29vbiwgcGxlYXNlIHJlbW92
ZSBpdCBmcm9tIHlvdXIgYXBwbGljYXRpb24uJywgZmFsc2UsIHsgaWQ6ICdlbWJlci1sZWdhY3kt
dmlld3MnLCB1bnRpbDogJzIuNi4wJywgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0
aW9ucy92MS54LyN0b2NfZW1iZXItdmlldycgfSk7CisKKyAgICAgICAgd2FybmVkQWJvdXRMZWdh
Y3lWaWV3QWRkb24gPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoX2VtYmVyTWV0YWwuZGVm
YXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfQ09OVFJPTExFUl9TVVBQT1JUICYmICF3YXJuZWRBYm91
dExlZ2FjeUNvbnRyb2xsZXJBZGRvbikgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4o
J1N1cHBvcnQgZm9yIHRoZSBgZW1iZXItbGVnYWN5LWNvbnRyb2xsZXJzYCBoYXMgYmVlbiByZW1v
dmVkLCBwbGVhc2UgcmVtb3ZlIGl0IGZyb20geW91ciBhcHBsaWNhdGlvbi4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLWxlZ2FjeS1jb250cm9sbGVycycsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9k
ZXByZWNhdGlvbnMvdjEueC8jdG9jX29iamVjdGNvbnRyb2xsZXInIH0pOworCisgICAgICAgIHdh
cm5lZEFib3V0TGVnYWN5Q29udHJvbGxlckFkZG9uID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAg
Ly8gRXZlbiB0aG91Z2ggdGhpcyByZXR1cm5zIHN5bmNocm9ub3VzbHksIHdlIHN0aWxsIG5lZWQg
dG8gbWFrZSBzdXJlIHRoZQorICAgICAgLy8gYm9vdCBwcm9taXNlIGV4aXN0cyBmb3IgYm9vay1r
ZWVwaW5nIHB1cnBvc2VzOiBpZiBhbnl0aGluZyB3ZW50IHdyb25nIGluCisgICAgICAvLyB0aGUg
Ym9vdCBwcm9jZXNzLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBlcnJvciBhcyBhIHJlamVjdGlvbiBv
biB0aGUgYm9vdAorICAgICAgLy8gcHJvbWlzZSBzbyB0aGF0IGEgZnV0dXJlIGNhbGxlciBvZiBg
Ym9vdCgpYCBjYW4gdGVsbCB3aGF0IGZhaWxlZC4KKyAgICAgIHZhciBkZWZlciA9IHRoaXMuX2Jv
b3RSZXNvbHZlciA9IG5ldyBfZW1iZXJSdW50aW1lRXh0UnN2cC5kZWZhdWx0LmRlZmVyKCk7Cisg
ICAgICB0aGlzLl9ib290UHJvbWlzZSA9IGRlZmVyLnByb21pc2U7CisKKyAgICAgIHRyeSB7Cisg
ICAgICAgIHRoaXMucnVuSW5pdGlhbGl6ZXJzKCk7CisgICAgICAgIF9lbWJlclJ1bnRpbWVTeXN0
ZW1MYXp5X2xvYWQucnVuTG9hZEhvb2tzKCdhcHBsaWNhdGlvbicsIHRoaXMpOworICAgICAgICB0
aGlzLmFkdmFuY2VSZWFkaW5lc3MoKTsKKyAgICAgICAgLy8gQ29udGludWVzIHRvIGBkaWRCZWNv
bWVSZWFkeWAKKyAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgICAgIC8vIEZvciB0aGUgYXN5
bmNocm9ub3VzIGJvb3QgcGF0aAorICAgICAgICBkZWZlci5yZWplY3QoZXJyb3IpOworCisgICAg
ICAgIC8vIEZvciB0aGUgc3luY2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRocm93IGVycm9y
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJlc2V0IHRoZSBhcHBsaWNhdGlv
bi4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBvbmx5IGluIHRlc3RzLiBJdCBjbGVhbnMgdXAKKyAg
ICAgIHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAgIDEuIERl
YWN0aXZhdGUgZXhpc3Rpbmcgcm91dGVzCisgICAgICAyLiBEZXN0cm95IGFsbCBvYmplY3RzIGlu
IHRoZSBjb250YWluZXIKKyAgICAgIDMuIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjb250YWlu
ZXIKKyAgICAgIDQuIFJlLXJvdXRlIHRvIHRoZSBleGlzdGluZyB1cmwKKyAgICAgICBUeXBpY2Fs
IEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcDsKKyAgICAgICBy
dW4oZnVuY3Rpb24oKSB7CisgICAgICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OworICAgICAgfSk7CisgICAgICAgbW9kdWxlKCdhY2NlcHRhbmNlIHRlc3QnLCB7CisgICAgICAg
IHNldHVwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBBcHAucmVzZXQoKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICAgdGVzdCgnZmlyc3QgdGVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAg
ICAvLyBBcHAgaXMgZnJlc2hseSByZXNldAorICAgICAgfSk7CisgICAgICAgdGVzdCgnc2Vjb25k
IHRlc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gQXBwIGlzIGFnYWluIGZyZXNobHkgcmVz
ZXQKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQWR2YW5jZWQgRXhhbXBsZToKKyAgICAg
ICBPY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tIGluaXRp
YWxpemluZyBkdXJpbmcKKyAgICAgIHNldHVwLiBUaGlzIGNvdWxkIGVuYWJsZSBleHRyYSBjb25m
aWd1cmF0aW9uLCBvciBlbmFibGUgYXNzZXJ0aW5nIHByaW9yCisgICAgICB0byB0aGUgYXBwIGJl
Y29taW5nIHJlYWR5LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBBcHA7CisgICAg
ICAgcnVuKGZ1bmN0aW9uKCkgeworICAgICAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVh
dGUoKTsKKyAgICAgIH0pOworICAgICAgIG1vZHVsZSgnYWNjZXB0YW5jZSB0ZXN0JywgeworICAg
ICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgcnVuKGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgQXBwLnJlc2V0KCk7CisgICAgICAgICAgICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsK
KyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgdGVzdCgnZmlyc3Qg
dGVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBvayh0cnVlLCAnc29tZXRoaW5nIGJlZm9yZSBh
cHAgaXMgaW5pdGlhbGl6ZWQnKTsKKyAgICAgICAgIHJ1bihmdW5jdGlvbigpIHsKKyAgICAgICAg
ICBBcHAuYWR2YW5jZVJlYWRpbmVzcygpOworICAgICAgICB9KTsKKyAgICAgICAgIG9rKHRydWUs
ICdzb21ldGhpbmcgYWZ0ZXIgYXBwIGlzIGluaXRpYWxpemVkJyk7CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgIEBtZXRob2QgcmVzZXQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FsbGlu
ZyByZXNldCgpIG9uIGluc3RhbmNlcyBvZiBgRW1iZXIuQXBwbGljYXRpb25gIGlzIG5vdFxuICAg
ICAgICAgICAgc3VwcG9ydGVkIHdoZW4gZ2xvYmFscyBtb2RlIGlzIGRpc2FibGVkOyBjYWxsIGB2
aXNpdCgpYCB0b1xuICAgICAgICAgICAgY3JlYXRlIG5ldyBgRW1iZXIuQXBwbGljYXRpb25JbnN0
YW5jZWBzIGFuZCBkaXNwb3NlIHRoZW1cbiAgICAgICAgICAgIHZpYSB0aGVpciBgZGVzdHJveSgp
YCBtZXRob2QgaW5zdGVhZC4nLCB0aGlzLl9nbG9iYWxzTW9kZSAmJiB0aGlzLmF1dG9ib290KTsK
KworICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5fX2RlcHJlY2F0ZWRJbnN0YW5jZV9fOworCisg
ICAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPSAxOworICAgICAgdGhpcy5fYm9vdFByb21p
c2UgPSBudWxsOworICAgICAgdGhpcy5fYm9vdFJlc29sdmVyID0gbnVsbDsKKyAgICAgIHRoaXMu
X2Jvb3RlZCA9IGZhbHNlOworCisgICAgICBmdW5jdGlvbiBoYW5kbGVSZXNldCgpIHsKKyAgICAg
ICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KGluc3RhbmNlLCAnZGVzdHJveScpOworICAg
ICAgICB0aGlzLl9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZSgpOworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCAnX2Jvb3RTeW5jJyk7
CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5qb2luKHRoaXMs
IGhhbmRsZVJlc2V0KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAg
QG1ldGhvZCBkaWRCZWNvbWVSZWFkeQorICAgICovCisgICAgZGlkQmVjb21lUmVhZHk6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIFRPRE86IElzIHRoaXMgc3RpbGwgbmVl
ZGVkIGZvciBfZ2xvYmFsc01vZGUgPSBmYWxzZT8KKyAgICAgICAgaWYgKCFfZW1iZXJNZXRhbC5k
ZWZhdWx0LnRlc3RpbmcpIHsKKyAgICAgICAgICAvLyBFYWdlcmx5IG5hbWUgYWxsIGNsYXNzZXMg
dGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQKKyAgICAgICAgICBfZW1iZXJNZXRhbC5kZWZhdWx0Lk5h
bWVzcGFjZS5wcm9jZXNzQWxsKCk7CisgICAgICAgICAgX2VtYmVyTWV0YWwuZGVmYXVsdC5CT09U
RUQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGRvY3VtZW50YXRpb24gb24g
YF9hdXRvYm9vdCgpYCBmb3IgZGV0YWlscworICAgICAgICBpZiAodGhpcy5hdXRvYm9vdCkgewor
ICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHVuZGVmaW5lZDsKKworICAgICAgICAgIGlmICh0aGlz
Ll9nbG9iYWxzTW9kZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBf
X2RlcHJlY2F0ZWRJbnN0YW5jZV9fIGx5aW5nIGFyb3VuZCwgYm9vdCBpdCB0bworICAgICAgICAg
ICAgLy8gYXZvaWQgdW5uZWNlc3Nhcnkgd29yaworICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlz
Ll9fZGVwcmVjYXRlZEluc3RhbmNlX187CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IC8vIE90aGVyd2lzZSwgYnVpbGQgYW4gaW5zdGFuY2UgYW5kIGJvb3QgaXQuIFRoaXMgaXMgY3Vy
cmVudGx5IHVucmVhY2hhYmxlLAorICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBmb3JjZWQgX2ds
b2JhbHNNb2RlIHRvID09PSBhdXRvYm9vdDsgYnV0IGhhdmluZyB0aGlzIGJyYW5jaAorICAgICAg
ICAgICAgLy8gYWxsb3dzIHVzIHRvIGxvY2FsbHkgdG9nZ2xlIHRoYXQgZmxhZyBmb3Igd2VlZGlu
ZyBvdXQgbGVnYWN5IGdsb2JhbHMgbW9kZQorICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGlu
ZGVwZW5kZW50bHkKKyAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5idWlsZEluc3RhbmNlKCk7
CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5zdGFuY2UuX2Jvb3RTeW5jKCk7CisKKyAgICAg
ICAgICAvLyBUT0RPOiBBcHAucmVhZHkoKSBpcyBub3QgY2FsbGVkIHdoZW4gYXV0b2Jvb3QgaXMg
ZGlzYWJsZWQsIGlzIHRoaXMgY29ycmVjdD8KKyAgICAgICAgICB0aGlzLnJlYWR5KCk7CisKKyAg
ICAgICAgICBpbnN0YW5jZS5zdGFydFJvdXRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEZvciB0aGUgYXN5bmNocm9ub3VzIGJvb3QgcGF0aAorICAgICAgICB0aGlzLl9ib290UmVzb2x2
ZXIucmVzb2x2ZSh0aGlzKTsKKworICAgICAgICAvLyBGb3IgdGhlIHN5bmNocm9ub3VzIGJvb3Qg
cGF0aAorICAgICAgICB0aGlzLl9ib290ZWQgPSB0cnVlOworICAgICAgfSBjYXRjaCAoZXJyb3Ip
IHsKKyAgICAgICAgLy8gRm9yIHRoZSBhc3luY2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRo
aXMuX2Jvb3RSZXNvbHZlci5yZWplY3QoZXJyb3IpOworCisgICAgICAgIC8vIEZvciB0aGUgc3lu
Y2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRocm93IGVycm9yOworICAgICAgfQorICAgIH0s
CisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBBcHBsaWNhdGlvbiBoYXMgYmVjb21l
IHJlYWR5LCBpbW1lZGlhdGVseSBiZWZvcmUgcm91dGluZworICAgICAgYmVnaW5zLiBUaGUgY2Fs
bCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIERPTSBoYXMgYmVjb21lIHJlYWR5LgorICAgICAg
IEBldmVudCByZWFkeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVhZHk6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBUaGlzIG1ldGhvZCBt
dXN0IGJlIG1vdmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSBvYmplY3QKKyAgICB3aWxs
RGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICAgIF9lbWJlck1ldGFsLmRlZmF1bHQuQk9PVEVEID0gZmFsc2U7CisgICAg
ICB0aGlzLl9ib290ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuX2Jvb3RQcm9taXNlID0gbnVsbDsK
KyAgICAgIHRoaXMuX2Jvb3RSZXNvbHZlciA9IG51bGw7CisKKyAgICAgIGlmIChfZW1iZXJSdW50
aW1lU3lzdGVtTGF6eV9sb2FkLl9sb2FkZWQuYXBwbGljYXRpb24gPT09IHRoaXMpIHsKKyAgICAg
ICAgX2VtYmVyUnVudGltZVN5c3RlbUxhenlfbG9hZC5fbG9hZGVkLmFwcGxpY2F0aW9uID0gdW5k
ZWZpbmVkOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fZ2xvYmFsc01vZGUgJiYgdGhpcy5f
X2RlcHJlY2F0ZWRJbnN0YW5jZV9fKSB7CisgICAgICAgIHRoaXMuX19kZXByZWNhdGVkSW5zdGFu
Y2VfXy5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgQm9vdCBh
IG5ldyBpbnN0YW5jZSBvZiBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZWAgZm9yIHRoZSBjdXJy
ZW50CisgICAgICBhcHBsaWNhdGlvbiBhbmQgbmF2aWdhdGUgaXQgdG8gdGhlIGdpdmVuIGB1cmxg
LiBSZXR1cm5zIGEgYFByb21pc2VgIHRoYXQKKyAgICAgIHJlc29sdmVzIHdpdGggdGhlIGluc3Rh
bmNlIHdoZW4gdGhlIGluaXRpYWwgcm91dGluZyBhbmQgcmVuZGVyaW5nIGlzCisgICAgICBjb21w
bGV0ZSwgb3IgcmVqZWN0cyB3aXRoIGFueSBlcnJvciB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZSBi
b290IHByb2Nlc3MuCisgICAgICAgV2hlbiBgYXV0b2Jvb3RgIGlzIGRpc2FibGVkLCBjYWxsaW5n
IGB2aXNpdGAgd291bGQgZmlyc3QgY2F1c2UgdGhlCisgICAgICBhcHBsaWNhdGlvbiB0byBib290
LCB3aGljaCBydW5zIHRoZSBhcHBsaWNhdGlvbiBpbml0aWFsaXplcnMuCisgICAgICAgVGhpcyBt
ZXRob2QgYWxzbyB0YWtlcyBhIGhhc2ggb2YgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9u
cyBmb3IKKyAgICAgIGN1c3RvbWl6aW5nIHRoZSBpbnN0YW5jZSdzIGJlaGF2aW9yLiBTZWUgdGhl
IGRvY3VtZW50YXRpb24gb24KKyAgICAgIGBFbWJlci5BcHBsaWNhdGlvbkluc3RhbmNlLkJvb3RP
cHRpb25zYCBmb3IgZGV0YWlscy4KKyAgICAgICBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZS5C
b290T3B0aW9uc2AgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIHRoYXQgZXhpc3RzCisgICAgICBwdXJl
bHkgdG8gZG9jdW1lbnQgdGhlIGF2YWlsYWJsZSBvcHRpb25zOyB5b3UgZG8gbm90IG5lZWQgdG8g
Y29uc3RydWN0IGl0CisgICAgICBtYW51YWxseS4gU2ltcGx5IHBhc3MgYSByZWd1bGFyIEphdmFT
Y3JpcHQgb2JqZWN0IGNvbnRhaW5pbmcgb2YgdGhlCisgICAgICBkZXNpcmVkIG9wdGlvbnM6Cisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgTXlBcHAudmlzaXQoIi8iLCB7IGxvY2F0aW9uOiAi
bm9uZSIsIHJvb3RFbGVtZW50OiAiI2NvbnRhaW5lciIgfSk7CisgICAgICBgYGAKKyAgICAgICAj
IyMgU3VwcG9ydGVkIFNjZW5hcmlvcworICAgICAgIFdoaWxlIHRoZSBgQm9vdE9wdGlvbnNgIGNs
YXNzIGV4cG9zZXMgYSBsYXJnZSBudW1iZXIgb2Yga25vYnMsIG5vdCBhbGwKKyAgICAgIGNvbWJp
bmF0aW9ucyBvZiB0aGVtIGFyZSB2YWxpZDsgY2VydGFpbiBpbmNvbXBhdGlibGUgY29tYmluYXRp
b25zIG1pZ2h0CisgICAgICByZXN1bHQgaW4gdW5leHBlY3RlZCBiZWhhdmlvci4KKyAgICAgICBG
b3IgZXhhbXBsZSwgYm9vdGluZyB0aGUgaW5zdGFuY2UgaW4gdGhlIGZ1bGwgYnJvd3NlciBlbnZp
cm9ubWVudAorICAgICAgd2hpbGUgc3BlY2lmeWluZyBhIGZvcmllZ24gYGRvY3VtZW50YCBvYmpl
Y3QgKGUuZy4gYHsgaXNCcm93c2VyOiB0cnVlLAorICAgICAgZG9jdW1lbnQ6IGlmcmFtZS5jb250
ZW50RG9jdW1lbnQgfWApIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHRvZGF5LAorICAgICAgbGFy
Z2VseSBkdWUgdG8gRW1iZXIncyBqUXVlcnkgZGVwZW5kZW5jeS4KKyAgICAgICBDdXJyZW50bHks
IHRoZXJlIGFyZSB0aHJlZSBvZmZpY2lhbGx5IHN1cHBvcnRlZCBzY2VuYXJpb3MvY29uZmlndXJh
dGlvbnMuCisgICAgICBVc2FnZXMgb3V0c2lkZSBvZiB0aGVzZSBzY2VuYXJpb3MgYXJlIG5vdCBn
dWFyYW50ZWVkIHRvIHdvcmssIGJ1dCBwbGVhc2UKKyAgICAgIGZlZWwgZnJlZSB0byBmaWxlIGJ1
ZyByZXBvcnRzIGRvY3VtZW50aW5nIHlvdXIgZXhwZXJpZW5jZSBhbmQgYW55IGlzc3VlcworICAg
ICAgeW91IGVuY291bnRlcmVkIHRvIGhlbHAgZXhwYW5kIHN1cHBvcnQuCisgICAgICAgIyMjIyBC
cm93c2VyIEFwcGxpY2F0aW9ucyAoTWFudWFsIEJvb3QpCisgICAgICAgVGhlIHNldHVwIGlzIGxh
cmdlbHkgc2ltaWxhciB0byBob3cgRW1iZXIgd29ya3Mgb3V0LW9mLXRoZS1ib3guIE5vcm1hbGx5
LAorICAgICAgRW1iZXIgd2lsbCBib290IGEgZGVmYXVsdCBpbnN0YW5jZSBmb3IgeW91ciBBcHBs
aWNhdGlvbiBvbiAiRE9NIHJlYWR5Ii4KKyAgICAgIEhvd2V2ZXIsIHlvdSBjYW4gY3VzdG9taXpl
IHRoaXMgYmVoYXZpb3IgYnkgZGlzYWJsaW5nIGBhdXRvYm9vdGAuCisgICAgICAgRm9yIGV4YW1w
bGUsIHRoaXMgYWxsb3dzIHlvdSB0byByZW5kZXIgYSBtaW5pdHVyZSBkZW1vIG9mIHlvdXIgYXBw
bGljYXRpb24KKyAgICAgIGludG8gYSBzcGVjaWZpYyBhcmVhIG9uIHlvdXIgbWFya2V0aW5nIHdl
YnNpdGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgaW1wb3J0IE15QXBwIGZyb20gJ215
LWFwcCc7CisgICAgICAgJChmdW5jdGlvbigpIHsKKyAgICAgICAgbGV0IEFwcCA9IE15QXBwLmNy
ZWF0ZSh7IGF1dG9ib290OiBmYWxzZSB9KTsKKyAgICAgICAgIGxldCBvcHRpb25zID0geworICAg
ICAgICAgIC8vIE92ZXJyaWRlIHRoZSByb3V0ZXIncyBsb2NhdGlvbiBhZGFwdGVyIHRvIHByZXZl
bnQgaXQgZnJvbSB1cGRhdGluZworICAgICAgICAgIC8vIHRoZSBVUkwgaW4gdGhlIGFkZHJlc3Mg
YmFyCisgICAgICAgICAgbG9jYXRpb246ICdub25lJywKKyAgICAgICAgICAgLy8gT3ZlcnJpZGUg
dGhlIGRlZmF1bHQgYHJvb3RFbGVtZW50YCBvbiB0aGUgYXBwIHRvIHJlbmRlciBpbnRvIGEKKyAg
ICAgICAgICAvLyBzcGVjaWZpYyBgZGl2YCBvbiB0aGUgcGFnZQorICAgICAgICAgIHJvb3RFbGVt
ZW50OiAnI2RlbW8nCisgICAgICAgIH07CisgICAgICAgICAvLyBTdGFydCB0aGUgYXBwIGF0IHRo
ZSBzcGVjaWFsIGRlbW8gVVJMCisgICAgICAgIEFwcC52aXNpdCgnL2RlbW8nLCBvcHRpb25zKTsK
KyAgICAgIH0pOworICAgICAgYGBgYAorICAgICAgIE9yIHBlcmhhcHMgeW91IG1pZ2h0IHdhbnQg
dG8gYm9vdCB0d28gaW5zdGFuY2VzIG9mIHlvdXIgYXBwIG9uIHRoZSBzYW1lCisgICAgICBwYWdl
IGZvciBhIHNwbGl0LXNjcmVlbiBtdWx0aXBsYXllciBleHBlcmllbmNlOgorICAgICAgIGBgYGph
dmFzY3JpcHQKKyAgICAgIGltcG9ydCBNeUFwcCBmcm9tICdteS1hcHAnOworICAgICAgICQoZnVu
Y3Rpb24oKSB7CisgICAgICAgIGxldCBBcHAgPSBNeUFwcC5jcmVhdGUoeyBhdXRvYm9vdDogZmFs
c2UgfSk7CisgICAgICAgICBsZXQgc2Vzc2lvbklkID0gTXlBcHAuZ2VuZXJhdGVTZXNzaW9uSUQo
KTsKKyAgICAgICAgIGxldCBwbGF5ZXIxID0gQXBwLnZpc2l0KGAvbWF0Y2hlcy9qb2luP25hbWU9
UGxheWVyKzEmc2Vzc2lvbj0ke3Nlc3Npb25JZH1gLCB7IHJvb3RFbGVtZW50OiAnI2xlZnQnLCBs
b2NhdGlvbjogJ25vbmUnIH0pOworICAgICAgICBsZXQgcGxheWVyMiA9IEFwcC52aXNpdChgL21h
dGNoZXMvam9pbj9uYW1lPVBsYXllcisyJnNlc3Npb249JHtzZXNzaW9uSWR9YCwgeyByb290RWxl
bWVudDogJyNyaWdodCcsIGxvY2F0aW9uOiAnbm9uZScgfSk7CisgICAgICAgICBQcm9taXNlLmFs
bChbcGxheWVyMSwgcGxheWVyMl0pLnRoZW4oKCkgPT4geworICAgICAgICAgIC8vIEJvdGggYXBw
cyBoYXZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCByZW5kZXIKKyAgICAgICAgICAkKCcjbG9hZGlu
ZycpLmZhZGVPdXQoKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAg
IERvIG5vdGUgdGhhdCBlYWNoIGFwcCBpbnN0YW5jZSBtYWludGFpbnMgdGhlaXIgb3duIHJlZ2lz
dHJ5L2NvbnRhaW5lciwgc28KKyAgICAgIHRoZXkgd2lsbCBydW4gaW4gY29tcGxldGUgaXNvbGF0
aW9uIGJ5IGRlZmF1bHQuCisgICAgICAgIyMjIyBTZXJ2ZXItU2lkZSBSZW5kZXJpbmcgKGFsc28g
a25vd24gYXMgRmFzdEJvb3QpCisgICAgICAgVGhpcyBzZXR1cCBhbGxvd3MgeW91IHRvIHJ1biB5
b3VyIEVtYmVyIGFwcCBpbiBhIHNlcnZlciBlbnZpcm9ubWVudCB1c2luZworICAgICAgTm9kZS5q
cyBhbmQgcmVuZGVyIGl0cyBjb250ZW50IGludG8gc3RhdGljIEhUTUwgZm9yIFNFTyBwdXJwb3Nl
cy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBjb25zdCBIVE1MU2VyaWFsaXplciA9IG5l
dyBTaW1wbGVET00uSFRNTFNlcmlhbGl6ZXIoU2ltcGxlRE9NLnZvaWRNYXApOworICAgICAgIGZ1
bmN0aW9uIHJlbmRlclVSTCh1cmwpIHsKKyAgICAgICAgbGV0IGRvbSA9IG5ldyBTaW1wbGVET00u
RG9jdW1lbnQoKTsKKyAgICAgICAgbGV0IHJvb3RFbGVtZW50ID0gZG9tLmJvZHk7CisgICAgICAg
IGxldCBvcHRpb25zID0geyBpc0Jyb3dzZXI6IGZhbHNlLCBkb2N1bWVudDogZG9tLCByb290RWxl
bWVudDogcm9vdEVsZW1lbnQgfTsKKyAgICAgICAgIHJldHVybiBNeUFwcC52aXNpdChvcHRpb25z
KS50aGVuKGluc3RhbmNlID0+IHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJu
IEhUTUxTZXJpYWxpemVyLnNlcmlhbGl6ZShyb290RWxlbWVudC5maXJzdENoaWxkKTsKKyAgICAg
ICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJveSgpOworICAgICAg
ICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICBgYGAKKyAgICAgICBJbiB0aGlzIHNj
ZW5hcmlvLCBiZWNhdXNlIEVtYmVyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIGEgZ2xvYmFsIGBk
b2N1bWVudGAKKyAgICAgIG9iamVjdCBpbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCwgeW91IG11
c3QgcHJvdmlkZSBvbmUgZXhwbGljaXRseS4gSW4gcHJhY3RpY2UsCisgICAgICBpbiB0aGUgbm9u
LWJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSBzdGFuZC1pbiBgZG9jdW1lbnRgIG9iamVjdCBvbmx5
IG5lZWQgdG8KKyAgICAgIGltcGxlbWVudCBhIGxpbWl0ZWQgc3Vic2V0IG9mIHRoZSBmdWxsIERP
TSBBUEkuIFRoZSBgU2ltcGxlRE9NYCBsaWJyYXJ5IGlzIGtub3duCisgICAgICB0byB3b3JrLgor
ICAgICAgIFNpbmNlIHRoZXJlIGlzIG5vIGFjY2VzcyB0byBqUXVlcnkgaW4gdGhlIG5vbi1icm93
c2VyIGVudmlyb25tZW50LCB5b3UgbXVzdCBhbHNvCisgICAgICBzcGVjaWZ5IGEgRE9NIGBFbGVt
ZW50YCBvYmplY3QgaW4gdGhlIHNhbWUgYGRvY3VtZW50YCBmb3IgdGhlIGByb290RWxlbWVudGAg
b3B0aW9uCisgICAgICAoYXMgb3Bwb3NlZCB0byBhIHNlbGVjdG9yIHN0cmluZyBsaWtlIGAiYm9k
eSJgKS4KKyAgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIGBpc0Jyb3dzZXJgLCBg
ZG9jdW1lbnRgIGFuZCBgcm9vdEVsZW1lbnRgIHByb3BlcnRpZXMKKyAgICAgIG9uIGBFbWJlci5B
cHBsaWNhdGlvbkluc3RhbmNlLkJvb3RPcHRpb25zYCBmb3IgZGV0YWlscy4KKyAgICAgICAjIyMj
IFNlcnZlci1TaWRlIFJlc291cmNlIERpc2NvdmVyeQorICAgICAgIFRoaXMgc2V0dXAgYWxsb3dz
IHlvdSB0byBydW4gdGhlIHJvdXRpbmcgbGF5ZXIgb2YgeW91ciBFbWJlciBhcHAgaW4gYSBzZXJ2
ZXIKKyAgICAgIGVudmlyb25tZW50IHVzaW5nIE5vZGUuanMgYW5kIGNvbXBsZXRlbHkgZGlzYWJs
ZSByZW5kZXJpbmcuIFRoaXMgYWxsb3dzIHlvdQorICAgICAgdG8gc2ltdWxhdGUgYW5kIGRpc2Nv
dmVyIHRoZSByZXNvdXJjZXMgKGkuZS4gQUpBWCByZXF1ZXN0cykgbmVlZGVkIHRvIGZ1ZmlsbAor
ICAgICAgYSBnaXZlbiByZXF1ZXN0IGFuZCBlYWdlcmx5ICJwdXNoIiB0aGVzZSByZXNvdXJjZXMg
dG8gdGhlIGNsaWVudC4KKyAgICAgICBgYGBhcHAvaW5pdGlhbGl6ZXJzL25ldHdvcmstc2Vydmlj
ZS5qcworICAgICAgaW1wb3J0IEJyb3dzZXJOZXR3b3JrU2VydmljZSBmcm9tICdhcHAvc2Vydmlj
ZXMvbmV0d29yay9icm93c2VyJzsKKyAgICAgIGltcG9ydCBOb2RlTmV0d29ya1NlcnZpY2UgZnJv
bSAnYXBwL3NlcnZpY2VzL25ldHdvcmsvbm9kZSc7CisgICAgICAgLy8gSW5qZWN0IGEgKGh5cG90
aGV0aWNhbCkgc2VydmljZSBmb3IgYWJzdHJhY3RpbmcgYWxsIEFKQVggY2FsbHMgYW5kIHVzZQor
ICAgICAgLy8gdGhlIGFwcHJvcGlhdGUgaW1wbGVtZW50YWlvbiBvbiB0aGUgY2xpZW50L3NlcnZl
ci4gVGhpcyBhbHNvIGFsbG93cyB0aGUKKyAgICAgIC8vIHNlcnZlciB0byBsb2cgYWxsIHRoZSBB
SkFYIGNhbGxzIG1hZGUgZHVyaW5nIGEgcGFydGljdWxhciByZXF1ZXN0IGFuZCB1c2UKKyAgICAg
IC8vIHRoYXQgZm9yIHJlc291cmNlLWRpc2NvdmVyeSBwdXJwb3NlLgorICAgICAgIGV4cG9ydCBm
dW5jdGlvbiBpbml0aWFsaXplKGFwcGxpY2F0aW9uKSB7CisgICAgICAgIGlmICh3aW5kb3cpIHsg
Ly8gYnJvd3NlcgorICAgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdzZXJ2aWNlOm5ldHdv
cmsnLCBCcm93c2VyTmV0d29ya1NlcnZpY2UpOworICAgICAgICB9IGVsc2UgeyAvLyBub2RlCisg
ICAgICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcnZpY2U6bmV0d29yaycsIE5vZGVOZXR3
b3JrU2VydmljZSk7CisgICAgICAgIH0KKyAgICAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91
dGUnLCAnbmV0d29yaycsICdzZXJ2aWNlOm5ldHdvcmsnKTsKKyAgICAgIH07CisgICAgICAgZXhw
b3J0IGRlZmF1bHQgeworICAgICAgICBuYW1lOiAnbmV0d29yay1zZXJ2aWNlJywKKyAgICAgICAg
aW5pdGlhbGl6ZTogaW5pdGlhbGl6ZQorICAgICAgfTsKKyAgICAgIGBgYAorICAgICAgIGBgYGFw
cC9yb3V0ZXMvcG9zdC5qcworICAgICAgaW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVyJzsKKyAgICAg
ICAvLyBBbiBleGFtcGxlIG9mIGhvdyB0aGUgKGh5cG90aGV0aWNhbCkgc2VydmljZSBpcyB1c2Vk
IGluIHJvdXRlcy4KKyAgICAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Sb3V0ZS5leHRlbmQoewor
ICAgICAgICBtb2RlbChwYXJhbXMpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmZl
dGNoKGAvYXBpL3Bvc3RzLyR7cGFyYW1zLnBvc3RfaWR9Lmpzb25gKTsKKyAgICAgICAgfSwKKyAg
ICAgICAgIGFmdGVyTW9kZWwocG9zdCkgeworICAgICAgICAgIGlmIChwb3N0LmlzRXh0ZXJuYWxD
b250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmZldGNoKGAvYXBpL2V4
dGVybmFsLz91cmw9JHtwb3N0LmV4dGVybmFsVVJMfWApOworICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICByZXR1cm4gcG9zdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgYGBgCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgLy8gRmluYWxseSwgcHV0
IGFsbCB0aGUgcGllY2VzIHRvZ2V0aGVyCisgICAgICAgZnVuY3Rpb24gZGlzY292ZXJSZXNvdXJj
ZXNGb3IodXJsKSB7CisgICAgICAgIHJldHVybiBNeUFwcC52aXNpdCh1cmwsIHsgaXNCcm93c2Vy
OiBmYWxzZSwgc2hvdWxkUmVuZGVyOiBmYWxzZSB9KS50aGVuKGluc3RhbmNlID0+IHsKKyAgICAg
ICAgICBsZXQgbmV0d29ya1NlcnZpY2UgPSBpbnN0YW5jZS5sb29rdXAoJ3NlcnZpY2U6bmV0d29y
aycpOworICAgICAgICAgIHJldHVybiBuZXR3b3JrU2VydmljZS5yZXF1ZXN0czsgLy8gPT4geyAi
L2FwaS9wb3N0cy8xMjMuanNvbiI6ICIuLi4iIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAg
ICBgYGAKKyAgICAgICBAcHVibGljCisgICAgICBAbWV0aG9kIHZpc2l0CisgICAgICBAcGFyYW0g
dXJsIHtTdHJpbmd9IFRoZSBpbml0aWFsIFVSTCB0byBuYXZpZ2F0ZSB0bworICAgICAgQHBhcmFt
IG9wdGlvbnMge0VtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UuQm9vdE9wdGlvbnN9CisgICAgICBA
cmV0dXJuIHtQcm9taXNlPEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UsIEVycm9yPn0KKyAgICAq
LworICAgIHZpc2l0OiBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7CisgICAgICB2YXIgX3RoaXMg
PSB0aGlzOworCisgICAgICByZXR1cm4gdGhpcy5ib290KCkudGhlbihmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIHJldHVybiBfdGhpcy5idWlsZEluc3RhbmNlKCkuYm9vdChvcHRpb25zKS50aGVuKGZ1
bmN0aW9uIChpbnN0YW5jZSkgeworICAgICAgICAgIHJldHVybiBpbnN0YW5jZS52aXNpdCh1cmwp
OworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSk7CisKKyAgT2JqZWN0LmRlZmlu
ZVByb3BlcnR5KEFwcGxpY2F0aW9uLnByb3RvdHlwZSwgJ3JlZ2lzdHJ5JywgeworICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZSwKKyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgICBnZXQ6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHkuYnVp
bGRGYWtlUmVnaXN0cnlXaXRoRGVwcmVjYXRpb25zKHRoaXMsICdBcHBsaWNhdGlvbicpOworICAg
IH0KKyAgfSk7CisKKyAgQXBwbGljYXRpb24ucmVvcGVuQ2xhc3MoeworICAgIC8qKgorICAgICAg
VGhpcyBjcmVhdGVzIGEgcmVnaXN0cnkgd2l0aCB0aGUgZGVmYXVsdCBFbWJlciBuYW1pbmcgY29u
dmVudGlvbnMuCisgICAgICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSByZWdpc3RyeToKKyAgICAg
ICAqIHJlZ2lzdGVyZWQgdmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGV5IGFyZSBsb29r
ZWQgdXAgKHRoZXkgYXJlCisgICAgICAgIG5vdCBzaW5nbGV0b25zKQorICAgICAgKiByZWdpc3Rl
cmVkIHRlbXBsYXRlcyBhcmUgbm90IGZhY3RvcmllczsgdGhlIHJlZ2lzdGVyZWQgdmFsdWUgaXMK
KyAgICAgICAgcmV0dXJuZWQgZGlyZWN0bHkuCisgICAgICAqIHRoZSByb3V0ZXIgcmVjZWl2ZXMg
dGhlIGFwcGxpY2F0aW9uIGFzIGl0cyBgbmFtZXNwYWNlYCBwcm9wZXJ0eQorICAgICAgKiBhbGwg
Y29udHJvbGxlcnMgcmVjZWl2ZSB0aGUgcm91dGVyIGFzIHRoZWlyIGB0YXJnZXRgIGFuZCBgY29u
dHJvbGxlcnNgCisgICAgICAgIHByb3BlcnRpZXMKKyAgICAgICogYWxsIGNvbnRyb2xsZXJzIHJl
Y2VpdmUgdGhlIGFwcGxpY2F0aW9uIGFzIHRoZWlyIGBuYW1lc3BhY2VgIHByb3BlcnR5CisgICAg
ICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBjb250cm9s
bGVyIGFzIGl0cworICAgICAgICBgY29udHJvbGxlcmAgcHJvcGVydHkKKyAgICAgICogdGhlIGFw
cGxpY2F0aW9uIHZpZXcgcmVjZWl2ZXMgdGhlIGFwcGxpY2F0aW9uIHRlbXBsYXRlIGFzIGl0cwor
ICAgICAgICBgZGVmYXVsdFRlbXBsYXRlYCBwcm9wZXJ0eQorICAgICAgIEBwcml2YXRlCisgICAg
ICBAbWV0aG9kIGJ1aWxkUmVnaXN0cnkKKyAgICAgIEBzdGF0aWMKKyAgICAgIEBwYXJhbSB7RW1i
ZXIuQXBwbGljYXRpb259IG5hbWVzcGFjZSB0aGUgYXBwbGljYXRpb24gZm9yIHdoaWNoIHRvCisg
ICAgICAgIGJ1aWxkIHRoZSByZWdpc3RyeQorICAgICAgQHJldHVybiB7RW1iZXIuUmVnaXN0cnl9
IHRoZSBidWlsdCByZWdpc3RyeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgYnVpbGRSZWdp
c3RyeTogZnVuY3Rpb24gKGFwcGxpY2F0aW9uKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Vt
ZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJn
dW1lbnRzWzFdOworCisgICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9zdXBlci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2FwcGxpY2F0aW9uOm1haW4n
LCBhcHBsaWNhdGlvbiwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisKKyAgICAgIGlmIChvcHRp
b25zW19lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lLkdMSU1NRVJdKSB7CisgICAgICAgIGds
aW1tZXJTZXR1cFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0
bWxiYXJzU2V0dXBSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBy
ZWdpc3RyeTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9uIGNvbW1vblNldHVwUmVnaXN0cnko
cmVnaXN0cnkpIHsKKyAgICByZWdpc3RyeS5vcHRpb25zRm9yVHlwZSgnY29tcG9uZW50JywgeyBz
aW5nbGV0b246IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5Lm9wdGlvbnNGb3JUeXBlKCd2aWV3Jywg
eyBzaW5nbGV0b246IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5LmluamVjdGlvbigncmVuZGVyZXIn
LCAnZG9tJywgJ3NlcnZpY2U6LWRvbS1oZWxwZXInKTsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVy
KCdjb250cm9sbGVyOmJhc2ljJywgX2VtYmVyUnVudGltZUNvbnRyb2xsZXJzQ29udHJvbGxlci5k
ZWZhdWx0LCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKworICAgIHJlZ2lzdHJ5LmluamVjdGlv
bignc2VydmljZTotZG9tLWhlbHBlcicsICdkb2N1bWVudCcsICdzZXJ2aWNlOi1kb2N1bWVudCcp
OworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJy12aWV3LXJlZ2lzdHJ5Om1haW4nLCB7IGNyZWF0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4ge307CisgICAgICB9IH0pOworCisgICAg
cmVnaXN0cnkuaW5qZWN0aW9uKCd2aWV3JywgJ192aWV3UmVnaXN0cnknLCAnLXZpZXctcmVnaXN0
cnk6bWFpbicpOworCisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdfdG9wTGV2ZWxW
aWV3VGVtcGxhdGUnLCAndGVtcGxhdGU6LW91dGxldCcpOworCisgICAgcmVnaXN0cnkucmVnaXN0
ZXIoJ3JvdXRlOmJhc2ljJywgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRlLmRlZmF1bHQpOworICAg
IHJlZ2lzdHJ5LnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1haW4nLCBfZW1iZXJWaWV3c1N5
c3RlbUV2ZW50X2Rpc3BhdGNoZXIuZGVmYXVsdCk7CisKKyAgICByZWdpc3RyeS5pbmplY3Rpb24o
J3JvdXRlcjptYWluJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlvbjptYWluJyk7CisgICAgcmVn
aXN0cnkuaW5qZWN0aW9uKCd2aWV3Oi1vdXRsZXQnLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9u
Om1haW4nKTsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdsb2NhdGlvbjphdXRvJywgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXV0b19sb2NhdGlvbi5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdp
c3RlcignbG9jYXRpb246aGFzaCcsIF9lbWJlclJvdXRpbmdMb2NhdGlvbkhhc2hfbG9jYXRpb24u
ZGVmYXVsdCk7CisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnknLCBfZW1i
ZXJSb3V0aW5nTG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdsb2NhdGlvbjpub25lJywgX2VtYmVyUm91dGluZ0xvY2F0aW9uTm9uZV9sb2Nh
dGlvbi5kZWZhdWx0KTsKKworICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udHJvbGxlcicsICd0
YXJnZXQnLCAncm91dGVyOm1haW4nKTsKKyAgICByZWdpc3RyeS5pbmplY3Rpb24oJ2NvbnRyb2xs
ZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1haW4nKTsKKworICAgIHJlZ2lzdHJ5LnJl
Z2lzdGVyKF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRpemUoX3RlbXBsYXRlT2JqZWN0KSwgX2Vt
YmVyUm91dGluZ1N5c3RlbUNhY2hlLmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
cm91dGVyJywgJ19idWNrZXRDYWNoZScsIF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRpemUoX3Rl
bXBsYXRlT2JqZWN0KSk7CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdfYnVja2V0
Q2FjaGUnLCBfY29udGFpbmVyUmVnaXN0cnkucHJpdmF0aXplKF90ZW1wbGF0ZU9iamVjdCkpOwor
ICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udHJvbGxlcicsICdfYnVja2V0Q2FjaGUnLCBfY29u
dGFpbmVyUmVnaXN0cnkucHJpdmF0aXplKF90ZW1wbGF0ZU9iamVjdCkpOworCisgICAgcmVnaXN0
cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdyb3V0ZXInLCAncm91dGVyOm1haW4nKTsKKworICAgIHJl
Z2lzdHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6LXRleHQtZmllbGQnLCBfZW1iZXJWaWV3c1ZpZXdz
VGV4dF9maWVsZC5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcignY29tcG9uZW50Oi10
ZXh0LWFyZWEnLCBfZW1iZXJWaWV3c1ZpZXdzVGV4dF9hcmVhLmRlZmF1bHQpOworICAgIHJlZ2lz
dHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6LWNoZWNrYm94JywgX2VtYmVyVmlld3NWaWV3c0NoZWNr
Ym94LmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6bGluay10bycs
IF9lbWJlclJvdXRpbmdWaWV3c0NvbXBvbmVudHNMaW5rVG8uZGVmYXVsdCk7CisKKyAgICAvLyBS
ZWdpc3RlciB0aGUgcm91dGluZyBzZXJ2aWNlLi4uCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3Nl
cnZpY2U6LXJvdXRpbmcnLCBfZW1iZXJSb3V0aW5nU2VydmljZXNSb3V0aW5nLmRlZmF1bHQpOwor
ICAgIC8vIFRoZW4gaW5qZWN0IHRoZSBhcHAgcm91dGVyIGludG8gaXQKKyAgICByZWdpc3RyeS5p
bmplY3Rpb24oJ3NlcnZpY2U6LXJvdXRpbmcnLCAncm91dGVyJywgJ3JvdXRlcjptYWluJyk7CisK
KyAgICAvLyBERUJVR0dJTkcKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVzb2x2ZXItZm9yLWRl
YnVnZ2luZzptYWluJywgcmVnaXN0cnkucmVzb2x2ZXIsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0p
OworICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udGFpbmVyLWRlYnVnLWFkYXB0ZXI6bWFpbics
ICdyZXNvbHZlcicsICdyZXNvbHZlci1mb3ItZGVidWdnaW5nOm1haW4nKTsKKyAgICByZWdpc3Ry
eS5pbmplY3Rpb24oJ2RhdGEtYWRhcHRlcjptYWluJywgJ2NvbnRhaW5lckRlYnVnQWRhcHRlcics
ICdjb250YWluZXItZGVidWctYWRhcHRlcjptYWluJyk7CisgICAgLy8gQ3VzdG9tIHJlc29sdmVy
IGF1dGhvcnMgbWF5IHdhbnQgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIENvbnRhaW5lckRlYnVnQWRh
cHRlciB3aXRoIHRoaXMga2V5CisKKyAgICByZWdpc3RyeS5yZWdpc3RlcignY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXI6bWFpbicsIF9lbWJlckV4dGVuc2lvblN1cHBvcnRDb250YWluZXJfZGVidWdf
YWRhcHRlci5kZWZhdWx0KTsKKyAgfQorCisgIGZ1bmN0aW9uIGdsaW1tZXJTZXR1cFJlZ2lzdHJ5
KHJlZ2lzdHJ5KSB7CisgICAgY29tbW9uU2V0dXBSZWdpc3RyeShyZWdpc3RyeSk7CisKKyAgICB2
YXIgRW52aXJvbm1lbnQgPSBfcmVxdWlyZTIuZGVmYXVsdCgnZW1iZXItZ2xpbW1lci9lbnZpcm9u
bWVudCcpLmRlZmF1bHQ7CisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3NlcnZpY2U6LWdsaW1tZXIt
ZW52aXJvbm1lbnQnLCBFbnZpcm9ubWVudCk7CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdzZXJ2
aWNlOi1nbGltbWVyLWVudmlyb25tZW50JywgJ2RvbScsICdzZXJ2aWNlOi1kb20taGVscGVyJyk7
CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyZW5kZXJlcicsICdlbnYnLCAnc2VydmljZTotZ2xp
bW1lci1lbnZpcm9ubWVudCcpOworCisgICAgdmFyIE91dGxldFZpZXcgPSBfcmVxdWlyZTIuZGVm
YXVsdCgnZW1iZXItZ2xpbW1lci9lbWJlci1yb3V0aW5nLXZpZXcnKS5PdXRsZXRWaWV3OworICAg
IHJlZ2lzdHJ5LnJlZ2lzdGVyKCd2aWV3Oi1vdXRsZXQnLCBPdXRsZXRWaWV3KTsKKworICAgIHZh
ciBfcmVxdWlyZSA9IF9yZXF1aXJlMi5kZWZhdWx0KCdlbWJlci1nbGltbWVyL2VtYmVyLW1ldGFs
LXZpZXdzJyk7CisKKyAgICB2YXIgSW50ZXJhY3RpdmVSZW5kZXJlciA9IF9yZXF1aXJlLkludGVy
YWN0aXZlUmVuZGVyZXI7CisgICAgdmFyIEluZXJ0UmVuZGVyZXIgPSBfcmVxdWlyZS5JbmVydFJl
bmRlcmVyOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JlbmRlcmVyOi1kb20nLCBJbnRlcmFj
dGl2ZVJlbmRlcmVyKTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVuZGVyZXI6LWluZXJ0Jywg
SW5lcnRSZW5kZXJlcik7CisKKyAgICB2YXIgRE9NSGVscGVyID0gX3JlcXVpcmUyLmRlZmF1bHQo
J2VtYmVyLWdsaW1tZXIvZG9tJykuZGVmYXVsdDsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdz
ZXJ2aWNlOi1kb20taGVscGVyJywgeworICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoX3JlZikgewor
ICAgICAgICB2YXIgZG9jdW1lbnQgPSBfcmVmLmRvY3VtZW50OworICAgICAgICByZXR1cm4gbmV3
IERPTUhlbHBlcihkb2N1bWVudCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgZ2xpbW1l
ck91dGxldFRlbXBsYXRlID0gX3JlcXVpcmUyLmRlZmF1bHQoJ2VtYmVyLWdsaW1tZXIvdGVtcGxh
dGVzL291dGxldCcpLmRlZmF1bHQ7CisgICAgdmFyIGdsaW1tZXJDb21wb25lbnRUZW1wbGF0ZSA9
IF9yZXF1aXJlMi5kZWZhdWx0KCdlbWJlci1nbGltbWVyL3RlbXBsYXRlcy9jb21wb25lbnQnKS5k
ZWZhdWx0OworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRp
emUoX3RlbXBsYXRlT2JqZWN0MiksIGdsaW1tZXJDb21wb25lbnRUZW1wbGF0ZSk7CisgICAgcmVn
aXN0cnkucmVnaXN0ZXIoJ3RlbXBsYXRlOi1vdXRsZXQnLCBnbGltbWVyT3V0bGV0VGVtcGxhdGUp
OworICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldzotb3V0bGV0JywgJ3RlbXBsYXRlJywgJ3Rl
bXBsYXRlOi1vdXRsZXQnKTsKKyAgICByZWdpc3RyeS5pbmplY3Rpb24oJ3RlbXBsYXRlJywgJ2Vu
dicsICdzZXJ2aWNlOi1nbGltbWVyLWVudmlyb25tZW50Jyk7CisKKyAgICByZWdpc3RyeS5vcHRp
b25zRm9yVHlwZSgnaGVscGVyJywgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisgIH0KKworICBm
dW5jdGlvbiBodG1sYmFyc1NldHVwUmVnaXN0cnkocmVnaXN0cnkpIHsKKyAgICBjb21tb25TZXR1
cFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKworICAgIHJlZ2lzdHJ5Lm9wdGlvbnNGb3JUeXBlKCd0ZW1w
bGF0ZScsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCd2
aWV3Oi1vdXRsZXQnLCBfZW1iZXJSb3V0aW5nVmlld3NWaWV3c091dGxldC5PdXRsZXRWaWV3KTsK
KworICAgIHZhciBJbnRlcmFjdGl2ZVJlbmRlcmVyID0gX2VtYmVyTWV0YWxWaWV3cy5JbnRlcmFj
dGl2ZVJlbmRlcmVyOworICAgIHZhciBJbmVydFJlbmRlcmVyID0gX2VtYmVyTWV0YWxWaWV3cy5J
bmVydFJlbmRlcmVyOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JlbmRlcmVyOi1kb20nLCBJ
bnRlcmFjdGl2ZVJlbmRlcmVyKTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVuZGVyZXI6LWlu
ZXJ0JywgSW5lcnRSZW5kZXJlcik7CisKKyAgICByZWdpc3RyeS5yZWdpc3Rlcignc2VydmljZTot
ZG9tLWhlbHBlcicsIHsKKyAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICAg
IHZhciBkb2N1bWVudCA9IF9yZWYyLmRvY3VtZW50OworICAgICAgICByZXR1cm4gbmV3IF9lbWJl
ckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLmRlZmF1bHQoZG9jdW1lbnQpOworICAgICAgfQorICAg
IH0pOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3RlbXBsYXRlOi1vdXRsZXQnLCBfZW1iZXJI
dG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldy5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdp
c3Rlcigndmlldzp0b3BsZXZlbCcsIF9lbWJlclZpZXdzVmlld3NWaWV3LmRlZmF1bHQuZXh0ZW5k
KCkpOworICB9CisKKyAgZnVuY3Rpb24gcmVnaXN0ZXJMaWJyYXJpZXMoKSB7CisgICAgaWYgKCFs
aWJyYXJpZXNSZWdpc3RlcmVkKSB7CisgICAgICBsaWJyYXJpZXNSZWdpc3RlcmVkID0gdHJ1ZTsK
KworICAgICAgaWYgKF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5oYXNET00pIHsKKyAg
ICAgICAgX2VtYmVyTWV0YWwuZGVmYXVsdC5saWJyYXJpZXMucmVnaXN0ZXJDb3JlTGlicmFyeSgn
alF1ZXJ5JywgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCgpLmpxdWVyeSk7CisgICAg
ICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbG9nTGlicmFyeVZlcnNpb25zKCkgeworICAg
IGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkxPR19WRVJTSU9OKSB7CisgICAgICAvLyB3ZSBvbmx5
IG5lZWQgdG8gc2VlIHRoaXMgb25jZSBwZXIgQXBwbGljYXRpb24jaW5pdAorICAgICAgX2VtYmVy
TWV0YWwuZGVmYXVsdC5MT0dfVkVSU0lPTiA9IGZhbHNlOworICAgICAgdmFyIGxpYnMgPSBfZW1i
ZXJNZXRhbC5kZWZhdWx0LmxpYnJhcmllcy5fcmVnaXN0cnk7CisKKyAgICAgIHZhciBuYW1lTGVu
Z3RocyA9IGxpYnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbSwgJ25hbWUubGVuZ3RoJyk7CisgICAgICB9KTsKKwor
ICAgICAgdmFyIG1heE5hbWVMZW5ndGggPSBNYXRoLm1heC5hcHBseSh0aGlzLCBuYW1lTGVuZ3Ro
cyk7CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0nKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlicy5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKKyAgICAgICAgdmFyIGxpYiA9IGxpYnNbaV07CisgICAgICAgIHZhciBzcGFj
ZXMgPSBuZXcgQXJyYXkobWF4TmFtZUxlbmd0aCAtIGxpYi5uYW1lLmxlbmd0aCArIDEpLmpvaW4o
JyAnKTsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1ZyhbbGliLm5hbWUsIHNwYWNlcywg
JyA6ICcsIGxpYi52ZXJzaW9uXS5qb2luKCcnKSk7CisgICAgICB9CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlYnVnKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgfQor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQXBwbGljYXRpb247Cit9KTsKKy8vIEVtYmVyLmxp
YnJhcmllcywgTE9HX1ZFUlNJT04sIE5hbWVzcGFjZSwgQk9PVEVECitlbmlmZWQoJ2VtYmVyLWFw
cGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUtaW5zdGFuY2UnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVu
dGltZS9zeXN0ZW0vb2JqZWN0JywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdlbWJlci1ydW50aW1l
L21peGlucy9jb250YWluZXJfcHJveHknLCAnZW1iZXItcnVudGltZS9taXhpbnMvcmVnaXN0cnlf
cHJveHknLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9jb250YWluZXJSZWdpc3RyeSwgX2VtYmVyUnVudGltZU1p
eGluc0NvbnRhaW5lcl9wcm94eSwgX2VtYmVyUnVudGltZU1peGluc1JlZ2lzdHJ5X3Byb3h5LCBf
ZW1iZXJNZXRhbFJ1bl9sb29wKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItYXBwbGljYXRpb24KKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisg
ICAgVGhlIGBFbmdpbmVJbnN0YW5jZWAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgc3RhdGVmdWwg
YXNwZWN0cyBvZiBhCisgICAgcnVubmluZyBgRW5naW5lYC4KKyAgCisgICAgQHB1YmxpYworICAg
IEBjbGFzcyBFbWJlci5FbmdpbmVJbnN0YW5jZQorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAor
ICAgIEB1c2VzIFJlZ2lzdHJ5UHJveHlNaXhpbgorICAgIEB1c2VzIENvbnRhaW5lclByb3h5TWl4
aW4KKyAgICBAY2F0ZWdvcnkgZW1iZXItYXBwbGljYXRpb24tZW5naW5lcworICAqLworCisgIHZh
ciBFbmdpbmVJbnN0YW5jZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRl
bmQoX2VtYmVyUnVudGltZU1peGluc1JlZ2lzdHJ5X3Byb3h5LmRlZmF1bHQsIF9lbWJlclJ1bnRp
bWVNaXhpbnNDb250YWluZXJfcHJveHkuZGVmYXVsdCwgeworICAgIC8qKgorICAgICAgVGhlIGJh
c2UgYEVuZ2luZWAgZm9yIHdoaWNoIHRoaXMgaXMgYW4gaW5zdGFuY2UuCisgICAgICAgQHByb3Bl
cnR5IHtFbWJlci5FbmdpbmV9IGVuZ2luZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGJh
c2U6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICB2YXIgYmFzZSA9IHRoaXMuYmFzZTsKKwor
ICAgICAgaWYgKCFiYXNlKSB7CisgICAgICAgIGJhc2UgPSB0aGlzLmFwcGxpY2F0aW9uOworICAg
ICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgYSBwZXIt
aW5zdGFuY2UgcmVnaXN0cnkgdGhhdCB3aWxsIHVzZSB0aGUgYXBwbGljYXRpb24ncyByZWdpc3Ry
eQorICAgICAgLy8gYXMgYSBmYWxsYmFjayBmb3IgcmVzb2x2aW5nIHJlZ2lzdHJhdGlvbnMuCisg
ICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9fcmVnaXN0cnlfXyA9IG5ldyBfY29udGFpbmVyUmVn
aXN0cnkuZGVmYXVsdCh7CisgICAgICAgIGZhbGxiYWNrOiBiYXNlLl9fcmVnaXN0cnlfXworICAg
ICAgfSk7CisKKyAgICAgIC8vIENyZWF0ZSBhIHBlci1pbnN0YW5jZSBjb250YWluZXIgZnJvbSB0
aGUgaW5zdGFuY2UncyByZWdpc3RyeQorICAgICAgdGhpcy5fX2NvbnRhaW5lcl9fID0gcmVnaXN0
cnkuY29udGFpbmVyKHsgb3duZXI6IHRoaXMgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICBV
bnJlZ2lzdGVyIGEgZmFjdG9yeS4KKyAgICAgIE92ZXJyaWRlcyBgUmVnaXN0cnlQcm94eSN1bnJl
Z2lzdGVyYCBpbiBvcmRlciB0byBjbGVhciBhbnkgY2FjaGVkIGluc3RhbmNlcworICAgICBvZiB0
aGUgdW5yZWdpc3RlcmVkIGZhY3RvcnkuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgdW5y
ZWdpc3RlcgorICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgKi8KKyAgICB1bnJl
Z2lzdGVyOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHRoaXMuX19jb250YWluZXJfXy5y
ZXNldChmdWxsTmFtZSk7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICB3aWxsRGVz
dHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKKyAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdCh0aGlzLl9fY29udGFpbmVy
X18sICdkZXN0cm95Jyk7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBFbmdp
bmVJbnN0YW5jZTsKK30pOworZW5pZmVkKCdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vZW5naW5l
JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hbWVzcGFjZScsICdjb250YWlu
ZXIvcmVnaXN0cnknLCAnZW1iZXItcnVudGltZS9taXhpbnMvcmVnaXN0cnlfcHJveHknLCAnZGFn
LW1hcCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
c2V0JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vcmVzb2x2ZXInLCAn
ZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZS1pbnN0YW5jZScsICdlbWJlci1tZXRhbC9m
ZWF0dXJlcycsICdlbWJlci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UsIF9jb250YWluZXJSZWdpc3RyeSwgX2VtYmVyUnVudGlt
ZU1peGluc1JlZ2lzdHJ5X3Byb3h5LCBfZGFnTWFwLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbVJlc29s
dmVyLCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUVuZ2luZUluc3RhbmNlLCBfZW1iZXJNZXRhbEZl
YXR1cmVzLCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICB2
YXIgR0xJTU1FUiA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0dMSU1NRVInKTsKKworICBl
eHBvcnRzLkdMSU1NRVIgPSBHTElNTUVSOworICBmdW5jdGlvbiBwcm9wcyhvYmopIHsKKyAgICB2
YXIgcHJvcGVydGllcyA9IFtdOworCisgICAgZm9yICh2YXIga2V5IGluIG9iaikgeworICAgICAg
cHJvcGVydGllcy5wdXNoKGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb3BlcnRpZXM7Cisg
IH0KKworICAvKioKKyAgICBUaGUgYEVuZ2luZWAgY2xhc3MgY29udGFpbnMgY29yZSBmdW5jdGlv
bmFsaXR5IGZvciBib3RoIGFwcGxpY2F0aW9ucyBhbmQKKyAgICBlbmdpbmVzLgorICAKKyAgICBF
YWNoIGVuZ2luZSBtYW5hZ2VzIGEgcmVnaXN0cnkgdGhhdCdzIHVzZWQgZm9yIGRlcGVuZGVuY3kg
aW5qZWN0aW9uIGFuZAorICAgIGV4cG9zZWQgdGhyb3VnaCBgUmVnaXN0cnlQcm94eWAuCisgIAor
ICAgIEVuZ2luZXMgYWxzbyBtYW5hZ2UgaW5pdGlhbGl6ZXJzIGFuZCBpbnN0YW5jZSBpbml0aWFs
aXplcnMuCisgIAorICAgIEVuZ2luZXMgY2FuIHNwYXduIGBFbmdpbmVJbnN0YW5jZWAgaW5zdGFu
Y2VzIHZpYSBgYnVpbGRJbnN0YW5jZSgpYC4KKyAgCisgICAgQGNsYXNzIEVuZ2luZQorICAgIEBu
YW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKKyAgICBAdXNlcyBS
ZWdpc3RyeVByb3h5CisgICAgQGNhdGVnb3J5IGVtYmVyLWFwcGxpY2F0aW9uLWVuZ2luZXMKKyAg
ICBAcHVibGljCisgICovCisgIHZhciBFbmdpbmUgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNw
YWNlLmRlZmF1bHQuZXh0ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94eS5kZWZh
dWx0LCB7CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKHRoaXNbR0xJTU1FUl0gPT09IHVuZGVmaW5l
ZCkgeworICAgICAgICB0aGlzW0dMSU1NRVJdID0gX2VtYmVyTWV0YWxGZWF0dXJlcy5kZWZhdWx0
KCdlbWJlci1nbGltbWVyJyk7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVpbGRSZWdpc3RyeSgp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIENyZWF0ZSBhbiBFbmdpbmVJbnN0YW5jZSBmb3Ig
dGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBidWlsZElu
c3RhbmNlCisgICAgICBAcmV0dXJuIHtFbWJlci5FbmdpbmVJbnN0YW5jZX0gdGhlIGFwcGxpY2F0
aW9uIGluc3RhbmNlCisgICAgKi8KKyAgICBidWlsZEluc3RhbmNlOiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0g
PT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgICBvcHRpb25zLmJhc2Ug
PSB0aGlzOworICAgICAgcmV0dXJuIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lSW5zdGFu
Y2UuZGVmYXVsdC5jcmVhdGUob3B0aW9ucyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQnVp
bGQgYW5kIGNvbmZpZ3VyZSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9u
LgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGJ1aWxkUmVnaXN0cnkKKyAgICAgIEBy
ZXR1cm4ge0VtYmVyLlJlZ2lzdHJ5fSB0aGUgY29uZmlndXJlZCByZWdpc3RyeQorICAgICovCisg
ICAgYnVpbGRSZWdpc3RyeTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9jb25zdHJ1Y3RvciRi
dWlsZFJlZ2lzdHJ5OworCisgICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9fcmVnaXN0cnlfXyA9
IHRoaXMuY29uc3RydWN0b3IuYnVpbGRSZWdpc3RyeSh0aGlzLCAoX2NvbnN0cnVjdG9yJGJ1aWxk
UmVnaXN0cnkgPSB7fSwgX2NvbnN0cnVjdG9yJGJ1aWxkUmVnaXN0cnlbR0xJTU1FUl0gPSB0aGlz
W0dMSU1NRVJdLCBfY29uc3RydWN0b3IkYnVpbGRSZWdpc3RyeSkpOworCisgICAgICByZXR1cm4g
cmVnaXN0cnk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgaW5pdGlhbGl6ZXIKKyAgICAqLworICAgIGluaXRpYWxpemVyOiBmdW5jdGlvbiAob3B0aW9u
cykgeworICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5pbml0aWFsaXplcihvcHRpb25zKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBpbnN0YW5jZUluaXRp
YWxpemVyCisgICAgKi8KKyAgICBpbnN0YW5jZUluaXRpYWxpemVyOiBmdW5jdGlvbiAob3B0aW9u
cykgeworICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5pbnN0YW5jZUluaXRpYWxpemVyKG9wdGlvbnMp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHJ1bklu
aXRpYWxpemVycworICAgICovCisgICAgcnVuSW5pdGlhbGl6ZXJzOiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB0aGlzLl9ydW5Jbml0aWFsaXplcignaW5p
dGlhbGl6ZXJzJywgZnVuY3Rpb24gKG5hbWUsIGluaXRpYWxpemVyKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdObyBhcHBsaWNhdGlvbiBpbml0aWFsaXplciBuYW1lZCBcJycg
KyBuYW1lICsgJ1wnJywgISFpbml0aWFsaXplcik7CisgICAgICAgIGlmIChpbml0aWFsaXplci5p
bml0aWFsaXplLmxlbmd0aCA9PT0gMikgeworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdUaGUgYGluaXRpYWxpemVgIG1ldGhvZCBmb3IgQXBwbGljYXRpb24gaW5pdGlhbGl6
ZXIgXCcnICsgbmFtZSArICdcJyBzaG91bGQgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCAtIGBBcHBg
LCBhbiBpbnN0YW5jZSBvZiBhbiBgQXBwbGljYXRpb25gLicsIGZhbHNlLCB7CisgICAgICAgICAg
ICBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLmFwcC1pbml0aWFsaXplci1pbml0aWFsaXplLWFyZ3Vt
ZW50cycsCisgICAgICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgICAgIHVybDogJ2h0
dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueC8jdG9jX2luaXRpYWxpemVyLWFyaXR5
JworICAgICAgICAgIH0pOworCisgICAgICAgICAgaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShfdGhp
cy5fX3JlZ2lzdHJ5X18sIF90aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbml0
aWFsaXplci5pbml0aWFsaXplKF90aGlzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgIEBzaW5jZSAxLjEyLjAKKyAgICAgIEBt
ZXRob2QgcnVuSW5zdGFuY2VJbml0aWFsaXplcnMKKyAgICAqLworICAgIHJ1bkluc3RhbmNlSW5p
dGlhbGl6ZXJzOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKKyAgICAgIHRoaXMuX3J1bkluaXRpYWxp
emVyKCdpbnN0YW5jZUluaXRpYWxpemVycycsIGZ1bmN0aW9uIChuYW1lLCBpbml0aWFsaXplcikg
eworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnTm8gaW5zdGFuY2UgaW5pdGlhbGl6
ZXIgbmFtZWQgXCcnICsgbmFtZSArICdcJycsICEhaW5pdGlhbGl6ZXIpOworICAgICAgICBpbml0
aWFsaXplci5pbml0aWFsaXplKGluc3RhbmNlKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBf
cnVuSW5pdGlhbGl6ZXI6IGZ1bmN0aW9uIChidWNrZXROYW1lLCBjYikgeworICAgICAgdmFyIGlu
aXRpYWxpemVyc0J5TmFtZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLmNvbnN0
cnVjdG9yLCBidWNrZXROYW1lKTsKKyAgICAgIHZhciBpbml0aWFsaXplcnMgPSBwcm9wcyhpbml0
aWFsaXplcnNCeU5hbWUpOworICAgICAgdmFyIGdyYXBoID0gbmV3IF9kYWdNYXAuZGVmYXVsdCgp
OworICAgICAgdmFyIGluaXRpYWxpemVyOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlu
aXRpYWxpemVycy5sZW5ndGg7IGkrKykgeworICAgICAgICBpbml0aWFsaXplciA9IGluaXRpYWxp
emVyc0J5TmFtZVtpbml0aWFsaXplcnNbaV1dOworICAgICAgICBncmFwaC5hZGRFZGdlcyhpbml0
aWFsaXplci5uYW1lLCBpbml0aWFsaXplciwgaW5pdGlhbGl6ZXIuYmVmb3JlLCBpbml0aWFsaXpl
ci5hZnRlcik7CisgICAgICB9CisKKyAgICAgIGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRl
eCkgeworICAgICAgICBjYih2ZXJ0ZXgubmFtZSwgdmVydGV4LnZhbHVlKTsKKyAgICAgIH0pOwor
ICAgIH0KKyAgfSk7CisKKyAgRW5naW5lLnJlb3BlbkNsYXNzKHsKKyAgICBpbml0aWFsaXplcnM6
IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksCisgICAgaW5zdGFuY2VJbml0
aWFsaXplcnM6IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksCisKKyAgICAv
KioKKyAgICAgIFRoZSBnb2FsIG9mIGluaXRpYWxpemVycyBzaG91bGQgYmUgdG8gcmVnaXN0ZXIg
ZGVwZW5kZW5jaWVzIGFuZCBpbmplY3Rpb25zLgorICAgICAgVGhpcyBwaGFzZSBydW5zIG9uY2Uu
IEJlY2F1c2UgdGhlc2UgaW5pdGlhbGl6ZXJzIG1heSBsb2FkIGNvZGUsIHRoZXkgYXJlCisgICAg
ICBhbGxvd2VkIHRvIGRlZmVyIGFwcGxpY2F0aW9uIHJlYWRpbmVzcyBhbmQgYWR2YW5jZSBpdC4g
SWYgeW91IG5lZWQgdG8gYWNjZXNzCisgICAgICB0aGUgY29udGFpbmVyIG9yIHN0b3JlIHlvdSBz
aG91bGQgdXNlIGFuIEluc3RhbmNlSW5pdGlhbGl6ZXIgdGhhdCB3aWxsIGJlIHJ1bgorICAgICAg
YWZ0ZXIgYWxsIGluaXRpYWxpemVycyBhbmQgdGhlcmVmb3JlIGFmdGVyIGFsbCBjb2RlIGlzIGxv
YWRlZCBhbmQgdGhlIGFwcCBpcworICAgICAgcmVhZHkuCisgICAgICAgSW5pdGlhbGl6ZXIgcmVj
ZWl2ZXMgYW4gb2JqZWN0IHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAg
ICBgbmFtZWAsIGBiZWZvcmVgLCBgYWZ0ZXJgLCBgaW5pdGlhbGl6ZWAuIFRoZSBvbmx5IHJlcXVp
cmVkIGF0dHJpYnV0ZSBpcworICAgICAgYGluaXRpYWxpemVgLCBhbGwgb3RoZXJzIGFyZSBvcHRp
b25hbC4KKyAgICAgICAqIGBuYW1lYCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdW5kZXIgd2hpY2gg
bmFtZSB0aGUgaW5pdGlhbGl6ZXIgaXMgcmVnaXN0ZXJlZC4KKyAgICAgIFRoaXMgbXVzdCBiZSBh
IHVuaXF1ZSBuYW1lLCBhcyB0cnlpbmcgdG8gcmVnaXN0ZXIgdHdvIGluaXRpYWxpemVycyB3aXRo
IHRoZQorICAgICAgc2FtZSBuYW1lIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAg
ICAgbmFtZTogJ25hbWVkSW5pdGlhbGl6ZXInLAorICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rp
b24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICBFbWJlci5kZWJ1ZygnUnVubmluZyBuYW1lZElu
aXRpYWxpemVyIScpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgICog
YGJlZm9yZWAgYW5kIGBhZnRlcmAgYXJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBpbml0aWFs
aXplciBpcyByYW4gcHJpb3IKKyAgICAgIG9yIGFmdGVyIHRoZSBvbmUgaWRlbnRpZmllZCBieSB0
aGUgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIGEgc2luZ2xlIHN0cmluZworICAgICAgb3IgYW4g
YXJyYXkgb2Ygc3RyaW5ncywgcmVmZXJlbmNpbmcgdGhlIGBuYW1lYCBvZiBvdGhlciBpbml0aWFs
aXplcnMuCisgICAgICAgQW4gZXhhbXBsZSBvZiBvcmRlcmluZyBpbml0aWFsaXplcnMsIHdlIGNy
ZWF0ZSBhbiBpbml0aWFsaXplciBuYW1lZCBgZmlyc3RgOgorICAgICAgIGBgYGphdmFzY3JpcHQK
KyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgICAgbmFtZTogJ2Zp
cnN0JywKKyAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7CisgICAg
ICAgICAgRW1iZXIuZGVidWcoJ0ZpcnN0IGluaXRpYWxpemVyIScpOworICAgICAgICB9CisgICAg
ICB9KTsKKyAgICAgICAvLyBERUJVRzogRmlyc3QgaW5pdGlhbGl6ZXIhCisgICAgICBgYGAKKyAg
ICAgICBXZSBhZGQgYW5vdGhlciBpbml0aWFsaXplciBuYW1lZCBgc2Vjb25kYCwgc3BlY2lmeWlu
ZyB0aGF0IGl0IHNob3VsZCBydW4KKyAgICAgIGFmdGVyIHRoZSBpbml0aWFsaXplciBuYW1lZCBg
Zmlyc3RgOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmlu
aXRpYWxpemVyKHsKKyAgICAgICAgbmFtZTogJ3NlY29uZCcsCisgICAgICAgIGFmdGVyOiAnZmly
c3QnLAorICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAg
ICAgICBFbWJlci5kZWJ1ZygnU2Vjb25kIGluaXRpYWxpemVyIScpOworICAgICAgICB9CisgICAg
ICB9KTsKKyAgICAgICAvLyBERUJVRzogRmlyc3QgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJV
RzogU2Vjb25kIGluaXRpYWxpemVyIQorICAgICAgYGBgCisgICAgICAgQWZ0ZXJ3YXJkcyB3ZSBh
ZGQgYSBmdXJ0aGVyIGluaXRpYWxpemVyIG5hbWVkIGBwcmVgLCB0aGlzIHRpbWUgc3BlY2lmeWlu
ZworICAgICAgdGhhdCBpdCBzaG91bGQgcnVuIGJlZm9yZSB0aGUgaW5pdGlhbGl6ZXIgbmFtZWQg
YGZpcnN0YDoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5p
bml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdwcmUnLAorICAgICAgICBiZWZvcmU6ICdmaXJz
dCcsCisgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikgeworICAgICAg
ICAgIEVtYmVyLmRlYnVnKCdQcmUgaW5pdGlhbGl6ZXIhJyk7CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgIC8vIERFQlVHOiBQcmUgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogRmly
c3QgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogU2Vjb25kIGluaXRpYWxpemVyIQorICAg
ICAgYGBgCisgICAgICAgRmluYWxseSB3ZSBhZGQgYW4gaW5pdGlhbGl6ZXIgbmFtZWQgYHBvc3Rg
LCBzcGVjaWZ5aW5nIGl0IHNob3VsZCBydW4gYWZ0ZXIKKyAgICAgIGJvdGggdGhlIGBmaXJzdGAg
YW5kIHRoZSBgc2Vjb25kYCBpbml0aWFsaXplcnM6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgRW1iZXIuQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgICAgICBuYW1lOiAncG9zdCcs
CisgICAgICAgIGFmdGVyOiBbJ2ZpcnN0JywgJ3NlY29uZCddLAorICAgICAgICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICBFbWJlci5kZWJ1ZygnUG9zdCBp
bml0aWFsaXplciEnKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgLy8gREVCVUc6IFBy
ZSBpbml0aWFsaXplciEKKyAgICAgIC8vIERFQlVHOiBGaXJzdCBpbml0aWFsaXplciEKKyAgICAg
IC8vIERFQlVHOiBTZWNvbmQgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogUG9zdCBpbml0
aWFsaXplciEKKyAgICAgIGBgYAorICAgICAgICogYGluaXRpYWxpemVgIGlzIGEgY2FsbGJhY2sg
ZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBvbmUgYXJndW1lbnQsCisgICAgICAgIGBhcHBsaWNhdGlv
bmAsIG9uIHdoaWNoIHlvdSBjYW4gb3BlcmF0ZS4KKyAgICAgICBFeGFtcGxlIG9mIHVzaW5nIGBh
cHBsaWNhdGlvbmAgdG8gcmVnaXN0ZXIgYW4gYWRhcHRlcjoKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdh
cGktYWRhcHRlcicsCisgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikg
eworICAgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhcGktYWRhcHRlcjptYWluJywgQXBp
QWRhcHRlcik7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhv
ZCBpbml0aWFsaXplcgorICAgICAgQHBhcmFtIGluaXRpYWxpemVyIHtPYmplY3R9CisgICAgICBA
cHVibGljCisgICAgKi8KKworICAgIGluaXRpYWxpemVyOiBidWlsZEluaXRpYWxpemVyTWV0aG9k
KCdpbml0aWFsaXplcnMnLCAnaW5pdGlhbGl6ZXInKSwKKworICAgIC8qKgorICAgICAgSW5zdGFu
Y2UgaW5pdGlhbGl6ZXJzIHJ1biBhZnRlciBhbGwgaW5pdGlhbGl6ZXJzIGhhdmUgcnVuLiBCZWNh
dXNlCisgICAgICBpbnN0YW5jZSBpbml0aWFsaXplcnMgcnVuIGFmdGVyIHRoZSBhcHAgaXMgZnVs
bHkgc2V0IHVwLiBXZSBoYXZlIGFjY2VzcworICAgICAgdG8gdGhlIHN0b3JlLCBjb250YWluZXIs
IGFuZCBvdGhlciBpdGVtcy4gSG93ZXZlciwgdGhlc2UgaW5pdGlhbGl6ZXJzIHJ1bgorICAgICAg
YWZ0ZXIgY29kZSBoYXMgbG9hZGVkIGFuZCBhcmUgbm90IGFsbG93ZWQgdG8gZGVmZXIgcmVhZGlu
ZXNzLgorICAgICAgIEluc3RhbmNlIGluaXRpYWxpemVyIHJlY2VpdmVzIGFuIG9iamVjdCB3aGlj
aCBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgYG5hbWVgLCBgYmVmb3JlYCwg
YGFmdGVyYCwgYGluaXRpYWxpemVgLiBUaGUgb25seSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMKKyAg
ICAgIGBpbml0aWFsaXplYCwgYWxsIG90aGVycyBhcmUgb3B0aW9uYWwuCisgICAgICAgKiBgbmFt
ZWAgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHVuZGVyIHdoaWNoIG5hbWUgdGhlIGluc3RhbmNlSW5p
dGlhbGl6ZXIgaXMKKyAgICAgIHJlZ2lzdGVyZWQuIFRoaXMgbXVzdCBiZSBhIHVuaXF1ZSBuYW1l
LCBhcyB0cnlpbmcgdG8gcmVnaXN0ZXIgdHdvCisgICAgICBpbnN0YW5jZUluaXRpYWxpemVyIHdp
dGggdGhlIHNhbWUgbmFtZSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5pbnN0YW5jZUluaXRpYWxpemVyKHsKKyAg
ICAgICAgbmFtZTogJ25hbWVkaW5zdGFuY2VJbml0aWFsaXplcicsCisgICAgICAgICBpbml0aWFs
aXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikgeworICAgICAgICAgIEVtYmVyLmRlYnVnKCdSdW5u
aW5nIG5hbWVkSW5pdGlhbGl6ZXIhJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBg
CisgICAgICAgKiBgYmVmb3JlYCBhbmQgYGFmdGVyYCBhcmUgdXNlZCB0byBlbnN1cmUgdGhhdCB0
aGlzIGluaXRpYWxpemVyIGlzIHJhbiBwcmlvcgorICAgICAgb3IgYWZ0ZXIgdGhlIG9uZSBpZGVu
dGlmaWVkIGJ5IHRoZSB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgYSBzaW5nbGUgc3RyaW5nCisg
ICAgICBvciBhbiBhcnJheSBvZiBzdHJpbmdzLCByZWZlcmVuY2luZyB0aGUgYG5hbWVgIG9mIG90
aGVyIGluaXRpYWxpemVycy4KKyAgICAgICAqIFNlZSBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFs
aXplciBmb3IgZGlzY3Vzc2lvbiBvbiB0aGUgdXNhZ2Ugb2YgYmVmb3JlCisgICAgICBhbmQgYWZ0
ZXIuCisgICAgICAgRXhhbXBsZSBpbnN0YW5jZUluaXRpYWxpemVyIHRvIHByZWxvYWQgZGF0YSBp
bnRvIHRoZSBzdG9yZS4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNh
dGlvbi5pbml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdwcmVsb2FkLWRhdGEnLAorICAgICAg
ICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICB2YXIgdXNl
ckNvbmZpZywgdXNlckNvbmZpZ0VuY29kZWQsIHN0b3JlOworICAgICAgICAgIC8vIFdlIGhhdmUg
YSBIVE1MIGVzY2FwZWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdXNlcidzIGJhc2ljCisg
ICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgc2VydmVyIHNpZGUgYW5kIHN0b3Jl
ZCBpbiB0aGUgRE9NIG9mIHRoZSBtYWluCisgICAgICAgICAgLy8gaW5kZXguaHRtbCBmaWxlLiBU
aGlzIGFsbG93cyB0aGUgYXBwIHRvIGhhdmUgYWNjZXNzIHRvIGEgc2V0IG9mIGRhdGEKKyAgICAg
ICAgICAvLyB3aXRob3V0IG1ha2luZyBhbnkgYWRkaXRpb25hbCByZW1vdGUgY2FsbHMuIEdvb2Qg
Zm9yIGJhc2ljIGRhdGEgdGhhdCBpcworICAgICAgICAgIC8vIG5lZWRlZCBmb3IgaW1tZWRpYXRl
IHJlbmRlcmluZyBvZiB0aGUgcGFnZS4gS2VlcCBpbiBtaW5kLCB0aGlzIGRhdGEsCisgICAgICAg
ICAgLy8gbGlrZSBhbGwgbG9jYWwgbW9kZWxzIGFuZCBkYXRhIGNhbiBiZSBtYW5pcHVsYXRlZCBi
eSB0aGUgdXNlciwgc28gaXQKKyAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9u
IGZvciBzZWN1cml0eSBvciBhdXRob3JpemF0aW9uLgorICAgICAgICAgIC8vCisgICAgICAgICAg
Ly8gR3JhYiB0aGUgZW5jb2RlZCBkYXRhIGZyb20gdGhlIG1ldGEgdGFnCisgICAgICAgICAgdXNl
ckNvbmZpZ0VuY29kZWQgPSBFbWJlci4kKCdoZWFkIG1ldGFbbmFtZT1hcHAtdXNlci1jb25maWdd
JykuYXR0cignY29udGVudCcpOworICAgICAgICAgIC8vIFVuZXNjYXBlIHRoZSB0ZXh0LCB0aGVu
IHBhcnNlIHRoZSByZXN1bHRpbmcgSlNPTiBpbnRvIGEgcmVhbCBvYmplY3QKKyAgICAgICAgICB1
c2VyQ29uZmlnID0gSlNPTi5wYXJzZSh1bmVzY2FwZSh1c2VyQ29uZmlnRW5jb2RlZCkpOworICAg
ICAgICAgIC8vIExvb2t1cCB0aGUgc3RvcmUKKyAgICAgICAgICBzdG9yZSA9IGFwcGxpY2F0aW9u
Lmxvb2t1cCgnc2VydmljZTpzdG9yZScpOworICAgICAgICAgIC8vIFB1c2ggdGhlIGVuY29kZWQg
SlNPTiBpbnRvIHRoZSBzdG9yZQorICAgICAgICAgIHN0b3JlLnB1c2hQYXlsb2FkKHVzZXJDb25m
aWcpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgaW5z
dGFuY2VJbml0aWFsaXplcgorICAgICAgQHBhcmFtIGluc3RhbmNlSW5pdGlhbGl6ZXIKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGluc3RhbmNlSW5pdGlhbGl6ZXI6IGJ1aWxkSW5pdGlhbGl6
ZXJNZXRob2QoJ2luc3RhbmNlSW5pdGlhbGl6ZXJzJywgJ2luc3RhbmNlIGluaXRpYWxpemVyJyks
CisKKyAgICAvKioKKyAgICAgIFRoaXMgY3JlYXRlcyBhIHJlZ2lzdHJ5IHdpdGggdGhlIGRlZmF1
bHQgRW1iZXIgbmFtaW5nIGNvbnZlbnRpb25zLgorICAgICAgIEl0IGFsc28gY29uZmlndXJlcyB0
aGUgcmVnaXN0cnk6CisgICAgICAgKiByZWdpc3RlcmVkIHZpZXdzIGFyZSBjcmVhdGVkIGV2ZXJ5
IHRpbWUgdGhleSBhcmUgbG9va2VkIHVwICh0aGV5IGFyZQorICAgICAgICBub3Qgc2luZ2xldG9u
cykKKyAgICAgICogcmVnaXN0ZXJlZCB0ZW1wbGF0ZXMgYXJlIG5vdCBmYWN0b3JpZXM7IHRoZSBy
ZWdpc3RlcmVkIHZhbHVlIGlzCisgICAgICAgIHJldHVybmVkIGRpcmVjdGx5LgorICAgICAgKiB0
aGUgcm91dGVyIHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBpdHMgYG5hbWVzcGFjZWAgcHJv
cGVydHkKKyAgICAgICogYWxsIGNvbnRyb2xsZXJzIHJlY2VpdmUgdGhlIHJvdXRlciBhcyB0aGVp
ciBgdGFyZ2V0YCBhbmQgYGNvbnRyb2xsZXJzYAorICAgICAgICBwcm9wZXJ0aWVzCisgICAgICAq
IGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVpciBgbmFtZXNw
YWNlYCBwcm9wZXJ0eQorICAgICAgKiB0aGUgYXBwbGljYXRpb24gdmlldyByZWNlaXZlcyB0aGUg
YXBwbGljYXRpb24gY29udHJvbGxlciBhcyBpdHMKKyAgICAgICAgYGNvbnRyb2xsZXJgIHByb3Bl
cnR5CisgICAgICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlv
biB0ZW1wbGF0ZSBhcyBpdHMKKyAgICAgICAgYGRlZmF1bHRUZW1wbGF0ZWAgcHJvcGVydHkKKyAg
ICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBidWlsZFJlZ2lzdHJ5CisgICAgICBAc3RhdGlj
CisgICAgICBAcGFyYW0ge0VtYmVyLkFwcGxpY2F0aW9ufSBuYW1lc3BhY2UgdGhlIGFwcGxpY2F0
aW9uIGZvciB3aGljaCB0bworICAgICAgICBidWlsZCB0aGUgcmVnaXN0cnkKKyAgICAgIEByZXR1
cm4ge0VtYmVyLlJlZ2lzdHJ5fSB0aGUgYnVpbHQgcmVnaXN0cnkKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGJ1aWxkUmVnaXN0cnk6IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHsKKyAgICAgIHZh
ciByZWdpc3RyeSA9IG5ldyBfY29udGFpbmVyUmVnaXN0cnkuZGVmYXVsdCh7CisgICAgICAgIHJl
c29sdmVyOiByZXNvbHZlckZvcihuYW1lc3BhY2UpCisgICAgICB9KTsKKworICAgICAgcmVnaXN0
cnkuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworCisgICAgICByZXR1cm4gcmVn
aXN0cnk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBh
bHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKKyAgICAgICAgQGRlcHJl
Y2F0ZWQgVXNlICdSZXNvbHZlcicgaW5zdGVhZAorICAgICAgQHByb3BlcnR5IHJlc29sdmVyCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlcjogbnVsbCwKKworICAgIC8qKgorICAg
ICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1
bHRSZXNvbHZlcmAKKyAgICAgICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIFJlc29sdmVyOiBudWxsCisgIH0pOworCisgIC8qKgorICAgIFRoaXMgZnVuY3Rp
b24gZGVmaW5lcyB0aGUgZGVmYXVsdCBsb29rdXAgcnVsZXMgZm9yIGNvbnRhaW5lciBsb29rdXBz
OgorICAKKyAgICAqIHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJlci5URU1QTEFURVNg
CisgICAgKiBvdGhlciBuYW1lcyBhcmUgbG9va2VkIHVwIG9uIHRoZSBhcHBsaWNhdGlvbiBhZnRl
ciBjbGFzc2lmeWluZyB0aGUgbmFtZS4KKyAgICAgIEZvciBleGFtcGxlLCBgY29udHJvbGxlcjpw
b3N0YCBsb29rcyB1cCBgQXBwLlBvc3RDb250cm9sbGVyYCBieSBkZWZhdWx0LgorICAgICogaWYg
dGhlIGRlZmF1bHQgbG9va3VwIGZhaWxzLCBsb29rIGZvciByZWdpc3RlcmVkIGNsYXNzZXMgb24g
dGhlIGNvbnRhaW5lcgorICAKKyAgICBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gcmVn
aXN0ZXIgZGVmYXVsdCBpbmplY3Rpb25zIGluIHRoZSBjb250YWluZXIKKyAgICB0aGF0IGNvdWxk
IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG5vcm1hbCBuYW1pbmcgY29udmVudGlvbi4KKyAgCisgICAg
QHByaXZhdGUKKyAgICBAbWV0aG9kIHJlc29sdmVyRm9yCisgICAgQHBhcmFtIHtFbWJlci5OYW1l
c3BhY2V9IG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIGxvb2sgZm9yIGNsYXNzZXMKKyAgICBA
cmV0dXJuIHsqfSB0aGUgcmVzb2x2ZWQgdmFsdWUgZm9yIGEgZ2l2ZW4gbG9va3VwCisgICovCisg
IGZ1bmN0aW9uIHJlc29sdmVyRm9yKG5hbWVzcGFjZSkgeworICAgIHZhciBSZXNvbHZlckNsYXNz
ID0gbmFtZXNwYWNlLmdldCgnUmVzb2x2ZXInKSB8fCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbVJl
c29sdmVyLmRlZmF1bHQ7CisKKyAgICByZXR1cm4gUmVzb2x2ZXJDbGFzcy5jcmVhdGUoeworICAg
ICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxk
SW5pdGlhbGl6ZXJNZXRob2QoYnVja2V0TmFtZSwgaHVtYW5OYW1lKSB7CisgICAgcmV0dXJuIGZ1
bmN0aW9uIChpbml0aWFsaXplcikgeworICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5p
dGlhbGl6ZXIgYmVpbmcgYWRkZWQgdG8gYSBzdWJjbGFzcywgd2UgYXJlIGdvaW5nIHRvIHJlb3Bl
biB0aGUgY2xhc3MKKyAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbmV3IGBpbml0aWFs
aXplcnNgIG9iamVjdCwgd2hpY2ggZXh0ZW5kcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MnIHVzaW5n
CisgICAgICAvLyBwcm90b3R5cGFsIGluaGVyaXRhbmNlLiBXaXRob3V0IHRoaXMsIGF0dGVtcHRp
bmcgdG8gYWRkIGluaXRpYWxpemVycyB0byB0aGUgc3ViY2xhc3Mgd291bGQKKyAgICAgIC8vIHBv
bGx1dGUgdGhlIHBhcmVudCBjbGFzcyBhcyB3ZWxsIGFzIG90aGVyIHN1YmNsYXNzZXMuCisgICAg
ICBpZiAodGhpcy5zdXBlcmNsYXNzW2J1Y2tldE5hbWVdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5z
dXBlcmNsYXNzW2J1Y2tldE5hbWVdID09PSB0aGlzW2J1Y2tldE5hbWVdKSB7CisgICAgICAgIHZh
ciBhdHRycyA9IHt9OworICAgICAgICBhdHRyc1tidWNrZXROYW1lXSA9IE9iamVjdC5jcmVhdGUo
dGhpc1tidWNrZXROYW1lXSk7CisgICAgICAgIHRoaXMucmVvcGVuQ2xhc3MoYXR0cnMpOworICAg
ICAgfQorCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlICcgKyBodW1hbk5hbWUg
KyAnIFwnJyArIGluaXRpYWxpemVyLm5hbWUgKyAnXCcgaGFzIGFscmVhZHkgYmVlbiByZWdpc3Rl
cmVkJywgIXRoaXNbYnVja2V0TmFtZV1baW5pdGlhbGl6ZXIubmFtZV0pOworICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0FuICcgKyBodW1hbk5hbWUgKyAnIGNhbm5vdCBiZSByZWdpc3Rl
cmVkIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbicsIF9lbWJlck1ldGFsVXRpbHMuY2Fu
SW52b2tlKGluaXRpYWxpemVyLCAnaW5pdGlhbGl6ZScpKTsKKyAgICAgIF9lbWJlck1ldGFsRGVi
dWcuYXNzZXJ0KCdBbiAnICsgaHVtYW5OYW1lICsgJyBjYW5ub3QgYmUgcmVnaXN0ZXJlZCB3aXRo
b3V0IGEgbmFtZSBwcm9wZXJ0eScsIGluaXRpYWxpemVyLm5hbWUgIT09IHVuZGVmaW5lZCk7CisK
KyAgICAgIHRoaXNbYnVja2V0TmFtZV1baW5pdGlhbGl6ZXIubmFtZV0gPSBpbml0aWFsaXplcjsK
KyAgICB9OworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW5naW5lOworfSk7CitlbmlmZWQo
J2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9yZXNvbHZlcicsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vc3RyaW5nJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50
aW1lL3N5c3RlbS9uYW1lc3BhY2UnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycycsICdlbWJlci1h
cHBsaWNhdGlvbi91dGlscy92YWxpZGF0ZS10eXBlJywgJ2VtYmVyLW1ldGFsL2RpY3Rpb25hcnkn
LCAnZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVfcmVnaXN0cnknXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJSdW50aW1l
U3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1lU3lz
dGVtTmFtZXNwYWNlLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnMsIF9lbWJlckFwcGxpY2F0aW9uVXRp
bHNWYWxpZGF0ZVR5cGUsIF9lbWJlck1ldGFsRGljdGlvbmFyeSwgX2VtYmVySHRtbGJhcnNUZW1w
bGF0ZV9yZWdpc3RyeSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVt
YmVyLWFwcGxpY2F0aW9uCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBSZXNvbHZl
ciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qCisg
ICAgICBUaGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpbnN0YW5jZSB3aGVuIGl0
IGlzCisgICAgICBjcmVhdGVkLgorICAgICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKKyAgICAqLwor
ICAgIG5hbWVzcGFjZTogbnVsbCwKKyAgICBub3JtYWxpemU6IG51bGwsIC8vIHJlcXVpcmVkCisg
ICAgcmVzb2x2ZTogbnVsbCwgLy8gcmVxdWlyZWQKKyAgICBwYXJzZU5hbWU6IG51bGwsIC8vIHJl
cXVpcmVkCisgICAgbG9va3VwRGVzY3JpcHRpb246IG51bGwsIC8vIHJlcXVpcmVkCisgICAgbWFr
ZVRvU3RyaW5nOiBudWxsLCAvLyByZXF1aXJlZAorICAgIHJlc29sdmVPdGhlcjogbnVsbCwgLy8g
cmVxdWlyZWQKKyAgICBfbG9nTG9va3VwOiBudWxsIC8vIHJlcXVpcmVkCisgIH0pOworCisgIGV4
cG9ydHMuUmVzb2x2ZXIgPSBSZXNvbHZlcjsKKyAgLyoqCisgICAgVGhlIERlZmF1bHRSZXNvbHZl
ciBkZWZpbmVzIHRoZSBkZWZhdWx0IGxvb2t1cCBydWxlcyB0byByZXNvbHZlCisgICAgY29udGFp
bmVyIGxvb2t1cHMgYmVmb3JlIGNvbnN1bHRpbmcgdGhlIGNvbnRhaW5lciBmb3IgcmVnaXN0ZXJl
ZAorICAgIGl0ZW1zOgorICAKKyAgICAqIHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJl
ci5URU1QTEFURVNgCisgICAgKiBvdGhlciBuYW1lcyBhcmUgbG9va2VkIHVwIG9uIHRoZSBhcHBs
aWNhdGlvbiBhZnRlciBjb252ZXJ0aW5nCisgICAgICB0aGUgbmFtZS4gRm9yIGV4YW1wbGUsIGBj
b250cm9sbGVyOnBvc3RgIGxvb2tzIHVwCisgICAgICBgQXBwLlBvc3RDb250cm9sbGVyYCBieSBk
ZWZhdWx0LgorICAgICogdGhlcmUgYXJlIHNvbWUgbnVhbmNlcyAoc2VlIGV4YW1wbGVzIGJlbG93
KQorICAKKyAgICAjIyMgSG93IFJlc29sdmluZyBXb3JrcworICAKKyAgICBUaGUgY29udGFpbmVy
IGNhbGxzIHRoaXMgb2JqZWN0J3MgYHJlc29sdmVgIG1ldGhvZCB3aXRoIHRoZQorICAgIGBmdWxs
TmFtZWAgYXJndW1lbnQuCisgIAorICAgIEl0IGZpcnN0IHBhcnNlcyB0aGUgZnVsbE5hbWUgaW50
byBhbiBvYmplY3QgdXNpbmcgYHBhcnNlTmFtZWAuCisgIAorICAgIFRoZW4gaXQgY2hlY2tzIGZv
ciB0aGUgcHJlc2VuY2Ugb2YgYSB0eXBlLXNwZWNpZmljIGluc3RhbmNlCisgICAgbWV0aG9kIG9m
IHRoZSBmb3JtIGByZXNvbHZlW1R5cGVdYCBhbmQgY2FsbHMgaXQgaWYgaXQgZXhpc3RzLgorICAg
IEZvciBleGFtcGxlIGlmIGl0IHdhcyByZXNvbHZpbmcgJ3RlbXBsYXRlOnBvc3QnLCBpdCB3b3Vs
ZCBjYWxsCisgICAgdGhlIGByZXNvbHZlVGVtcGxhdGVgIG1ldGhvZC4KKyAgCisgICAgSXRzIGxh
c3QgcmVzb3J0IGlzIHRvIGNhbGwgdGhlIGByZXNvbHZlT3RoZXJgIG1ldGhvZC4KKyAgCisgICAg
VGhlIG1ldGhvZHMgb2YgdGhpcyBvYmplY3QgYXJlIGRlc2lnbmVkIHRvIGJlIGVhc3kgdG8gb3Zl
cnJpZGUKKyAgICBpbiBhIHN1YmNsYXNzLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVuaGFuY2Ug
aG93IGEgdGVtcGxhdGUKKyAgICBpcyByZXNvbHZlZCBsaWtlIHNvOgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIFJlc29s
dmVyOiBFbWJlci5EZWZhdWx0UmVzb2x2ZXIuZXh0ZW5kKHsKKyAgICAgICAgcmVzb2x2ZVRlbXBs
YXRlOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7CisgICAgICAgICAgdmFyIHJlc29sdmVkVGVtcGxh
dGUgPSB0aGlzLl9zdXBlcihwYXJzZWROYW1lKTsKKyAgICAgICAgICBpZiAocmVzb2x2ZWRUZW1w
bGF0ZSkgeyByZXR1cm4gcmVzb2x2ZWRUZW1wbGF0ZTsgfQorICAgICAgICAgIHJldHVybiBFbWJl
ci5URU1QTEFURVNbJ25vdF9mb3VuZCddOworICAgICAgICB9CisgICAgICB9KQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBTb21lIGV4YW1wbGVzIG9mIGhvdyBuYW1lcyBhcmUgcmVzb2x2ZWQ6
CisgIAorICAgIGBgYAorICAgICd0ZW1wbGF0ZTpwb3N0JyAgICAgICAgICAgLy89PiBFbWJlci5U
RU1QTEFURVNbJ3Bvc3QnXQorICAgICd0ZW1wbGF0ZTpwb3N0cy9ieWxpbmUnICAgLy89PiBFbWJl
ci5URU1QTEFURVNbJ3Bvc3RzL2J5bGluZSddCisgICAgJ3RlbXBsYXRlOnBvc3RzLmJ5bGluZScg
ICAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KKyAgICAndGVtcGxhdGU6Ymxv
Z1Bvc3QnICAgICAgIC8vPT4gRW1iZXIuVEVNUExBVEVTWydibG9nUG9zdCddCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyAgIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyAgIEVtYmVyLlRFTVBMQVRFU1snYmxvZ19wb3N0J10KKyAgICAnY29udHJvbGxlcjpwb3N0
JyAgICAgICAgIC8vPT4gQXBwLlBvc3RDb250cm9sbGVyCisgICAgJ2NvbnRyb2xsZXI6cG9zdHMu
aW5kZXgnICAvLz0+IEFwcC5Qb3N0c0luZGV4Q29udHJvbGxlcgorICAgICdjb250cm9sbGVyOmJs
b2cvcG9zdCcgICAgLy89PiBCbG9nLlBvc3RDb250cm9sbGVyCisgICAgJ2NvbnRyb2xsZXI6YmFz
aWMnICAgICAgICAvLz0+IEVtYmVyLkNvbnRyb2xsZXIKKyAgICAncm91dGU6cG9zdCcgICAgICAg
ICAgICAgIC8vPT4gQXBwLlBvc3RSb3V0ZQorICAgICdyb3V0ZTpwb3N0cy5pbmRleCcgICAgICAg
Ly89PiBBcHAuUG9zdHNJbmRleFJvdXRlCisgICAgJ3JvdXRlOmJsb2cvcG9zdCcgICAgICAgICAv
Lz0+IEJsb2cuUG9zdFJvdXRlCisgICAgJ3JvdXRlOmJhc2ljJyAgICAgICAgICAgICAvLz0+IEVt
YmVyLlJvdXRlCisgICAgJ3ZpZXc6cG9zdCcgICAgICAgICAgICAgICAvLz0+IEFwcC5Qb3N0Vmll
dworICAgICd2aWV3OnBvc3RzLmluZGV4JyAgICAgICAgLy89PiBBcHAuUG9zdHNJbmRleFZpZXcK
KyAgICAndmlldzpibG9nL3Bvc3QnICAgICAgICAgIC8vPT4gQmxvZy5Qb3N0VmlldworICAgICd2
aWV3OmJhc2ljJyAgICAgICAgICAgICAgLy89PiBFbWJlci5WaWV3CisgICAgJ2Zvbzpwb3N0JyAg
ICAgICAgICAgICAgICAvLz0+IEFwcC5Qb3N0Rm9vCisgICAgJ21vZGVsOnBvc3QnICAgICAgICAg
ICAgICAvLz0+IEFwcC5Qb3N0CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBEZWZhdWx0UmVzb2x2
ZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAg
QHB1YmxpYworICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1P
YmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qKgorICAgICAgVGhpcyB3aWxsIGJlIHNldCB0
byB0aGUgQXBwbGljYXRpb24gaW5zdGFuY2Ugd2hlbiBpdCBpcworICAgICAgY3JlYXRlZC4KKyAg
ICAgICBAcHJvcGVydHkgbmFtZXNwYWNlCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBuYW1l
c3BhY2U6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9wYXJz
ZU5hbWVDYWNoZSA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwpOworICAgIH0s
CisgICAgbm9ybWFsaXplOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBfZnVsbE5h
bWUkc3BsaXQgPSBmdWxsTmFtZS5zcGxpdCgnOicsIDIpOworCisgICAgICB2YXIgdHlwZSA9IF9m
dWxsTmFtZSRzcGxpdFswXTsKKyAgICAgIHZhciBuYW1lID0gX2Z1bGxOYW1lJHNwbGl0WzFdOwor
CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVHJpZWQgdG8gbm9ybWFsaXplIGEgY29u
dGFpbmVyIG5hbWUgd2l0aG91dCBhIGNvbG9uICg6KSBpbiBpdC4gJyArICdZb3UgcHJvYmFibHkg
dHJpZWQgdG8gbG9va3VwIGEgbmFtZSB0aGF0IGRpZCBub3QgY29udGFpbiBhIHR5cGUsICcgKyAn
YSBjb2xvbiwgYW5kIGEgbmFtZS4gQSBwcm9wZXIgbG9va3VwIG5hbWUgd291bGQgYmUgYHZpZXc6
cG9zdGAuJywgZnVsbE5hbWUuc3BsaXQoJzonKS5sZW5ndGggPT09IDIpOworCisgICAgICBpZiAo
dHlwZSAhPT0gJ3RlbXBsYXRlJykgeworICAgICAgICB2YXIgcmVzdWx0ID0gbmFtZTsKKworICAg
ICAgICBpZiAocmVzdWx0LmluZGV4T2YoJy4nKSA+IC0xKSB7CisgICAgICAgICAgcmVzdWx0ID0g
cmVzdWx0LnJlcGxhY2UoL1wuKC4pL2csIGZ1bmN0aW9uIChtKSB7CisgICAgICAgICAgICByZXR1
cm4gbS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJ18nKSA+IC0xKSB7CisgICAgICAgICAgcmVzdWx0
ID0gcmVzdWx0LnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24gKG0pIHsKKyAgICAgICAgICAgIHJl
dHVybiBtLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgIH0pOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHsKKyAgICAgICAgICByZXN1
bHQgPSByZXN1bHQucmVwbGFjZSgvLSguKS9nLCBmdW5jdGlvbiAobSkgeworICAgICAgICAgICAg
cmV0dXJuIG0uY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgfSk7CisgICAgICAg
IH0KKworICAgICAgICByZXR1cm4gdHlwZSArICc6JyArIHJlc3VsdDsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdmlhIHRoZSBjb250YWluZXIncyByZXNvbHZlciBt
ZXRob2QuCisgICAgICBJdCBwYXJzZXMgdGhlIHByb3ZpZGVkIGBmdWxsTmFtZWAgYW5kIHRoZW4g
bG9va3MgdXAgYW5kCisgICAgICByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBvciBj
bGFzcy4KKyAgICAgICBAbWV0aG9kIHJlc29sdmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxs
TmFtZSB0aGUgbG9va3VwIHN0cmluZworICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcmVzb2x2
ZWQgZmFjdG9yeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVzb2x2ZTogZnVuY3Rpb24g
KGZ1bGxOYW1lKSB7CisgICAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxO
YW1lKTsKKyAgICAgIHZhciByZXNvbHZlTWV0aG9kTmFtZSA9IHBhcnNlZE5hbWUucmVzb2x2ZU1l
dGhvZE5hbWU7CisgICAgICB2YXIgcmVzb2x2ZWQ7CisKKyAgICAgIGlmICh0aGlzW3Jlc29sdmVN
ZXRob2ROYW1lXSkgeworICAgICAgICByZXNvbHZlZCA9IHRoaXNbcmVzb2x2ZU1ldGhvZE5hbWVd
KHBhcnNlZE5hbWUpOworICAgICAgfQorCisgICAgICByZXNvbHZlZCA9IHJlc29sdmVkIHx8IHRo
aXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOworCisgICAgICBpZiAocGFyc2VkTmFtZS5yb290
ICYmIHBhcnNlZE5hbWUucm9vdC5MT0dfUkVTT0xWRVIpIHsKKyAgICAgICAgdGhpcy5fbG9nTG9v
a3VwKHJlc29sdmVkLCBwYXJzZWROYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc29sdmVk
KSB7CisgICAgICAgIF9lbWJlckFwcGxpY2F0aW9uVXRpbHNWYWxpZGF0ZVR5cGUuZGVmYXVsdChy
ZXNvbHZlZCwgcGFyc2VkTmFtZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXNvbHZlZDsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBDb252ZXJ0IHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUg
Zm9ybSAndHlwZTpuYW1lJyB0bworICAgICAgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoZSBw
YXJzZWQgYXNwZWN0cyBvZiB0aGUgbmFtZQorICAgICAgYnJva2VuIG91dC4KKyAgICAgICBAcHJv
dGVjdGVkCisgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUgdGhlIGxvb2t1cCBzdHJpbmcK
KyAgICAgIEBtZXRob2QgcGFyc2VOYW1lCisgICAgICBAcHVibGljCisgICAgKi8KKworICAgIHBh
cnNlTmFtZTogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5fcGFyc2VO
YW1lQ2FjaGVbZnVsbE5hbWVdIHx8ICh0aGlzLl9wYXJzZU5hbWVDYWNoZVtmdWxsTmFtZV0gPSB0
aGlzLl9wYXJzZU5hbWUoZnVsbE5hbWUpKTsKKyAgICB9LAorCisgICAgX3BhcnNlTmFtZTogZnVu
Y3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICB2YXIgX2Z1bGxOYW1lJHNwbGl0MiA9IGZ1bGxOYW1l
LnNwbGl0KCc6Jyk7CisKKyAgICAgIHZhciB0eXBlID0gX2Z1bGxOYW1lJHNwbGl0MlswXTsKKyAg
ICAgIHZhciBmdWxsTmFtZVdpdGhvdXRUeXBlID0gX2Z1bGxOYW1lJHNwbGl0MlsxXTsKKworICAg
ICAgdmFyIG5hbWUgPSBmdWxsTmFtZVdpdGhvdXRUeXBlOworICAgICAgdmFyIG5hbWVzcGFjZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJyk7CisgICAgICB2
YXIgcm9vdCA9IG5hbWVzcGFjZTsKKyAgICAgIHZhciBsYXN0U2xhc2hJbmRleCA9IG5hbWUubGFz
dEluZGV4T2YoJy8nKTsKKyAgICAgIHZhciBkaXJuYW1lID0gbGFzdFNsYXNoSW5kZXggIT09IC0x
ID8gbmFtZS5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCkgOiBudWxsOworCisgICAgICBpZiAodHlw
ZSAhPT0gJ3RlbXBsYXRlJyAmJiBsYXN0U2xhc2hJbmRleCAhPT0gLTEpIHsKKyAgICAgICAgdmFy
IHBhcnRzID0gbmFtZS5zcGxpdCgnLycpOworICAgICAgICBuYW1lID0gcGFydHNbcGFydHMubGVu
Z3RoIC0gMV07CisgICAgICAgIHZhciBuYW1lc3BhY2VOYW1lID0gX2VtYmVyUnVudGltZVN5c3Rl
bVN0cmluZy5jYXBpdGFsaXplKHBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJykpOworICAgICAg
ICByb290ID0gX2VtYmVyUnVudGltZVN5c3RlbU5hbWVzcGFjZS5kZWZhdWx0LmJ5TmFtZShuYW1l
c3BhY2VOYW1lKTsKKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGFyZSBs
b29raW5nIGZvciBhICcgKyBuYW1lICsgJyAnICsgdHlwZSArICcgaW4gdGhlICcgKyBuYW1lc3Bh
Y2VOYW1lICsgJyBuYW1lc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlIGNvdWxkIG5vdCBiZSBmb3Vu
ZCcsIHJvb3QpOworICAgICAgfQorCisgICAgICB2YXIgcmVzb2x2ZU1ldGhvZE5hbWUgPSBmdWxs
TmFtZVdpdGhvdXRUeXBlID09PSAnbWFpbicgPyAnTWFpbicgOiBfZW1iZXJSdW50aW1lU3lzdGVt
U3RyaW5nLmNsYXNzaWZ5KHR5cGUpOworCisgICAgICBpZiAoIShuYW1lICYmIHR5cGUpKSB7Cisg
ICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZnVsbE5hbWU6IGAnICsgZnVsbE5h
bWUgKyAnYCwgbXVzdCBiZSBvZiB0aGUgZm9ybSBgdHlwZTpuYW1lYCAnKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHsKKyAgICAgICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAorICAgICAgICB0eXBl
OiB0eXBlLAorICAgICAgICBmdWxsTmFtZVdpdGhvdXRUeXBlOiBmdWxsTmFtZVdpdGhvdXRUeXBl
LAorICAgICAgICBkaXJuYW1lOiBkaXJuYW1lLAorICAgICAgICBuYW1lOiBuYW1lLAorICAgICAg
ICByb290OiByb290LAorICAgICAgICByZXNvbHZlTWV0aG9kTmFtZTogJ3Jlc29sdmUnICsgcmVz
b2x2ZU1ldGhvZE5hbWUKKyAgICAgIH07CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJu
cyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGZ1bGxOYW1lLiBVc2VkIGJ5IHRo
ZQorICAgICAgQXBwbGljYXRpb24gbmFtZXNwYWNlIGluIGFzc2VydGlvbnMgdG8gZGVzY3JpYmUg
dGhlCisgICAgICBwcmVjaXNlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgRW1iZXIgaXMgbG9va2lu
ZyBmb3IsIHJhdGhlciB0aGFuCisgICAgICBjb250YWluZXIga2V5cy4KKyAgICAgICBAcHJvdGVj
dGVkCisgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUgdGhlIGxvb2t1cCBzdHJpbmcKKyAg
ICAgIEBtZXRob2QgbG9va3VwRGVzY3JpcHRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IGxvb2t1cERlc2NyaXB0aW9uOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBwYXJz
ZWROYW1lID0gdGhpcy5wYXJzZU5hbWUoZnVsbE5hbWUpOworICAgICAgdmFyIGRlc2NyaXB0aW9u
OworCisgICAgICBpZiAocGFyc2VkTmFtZS50eXBlID09PSAndGVtcGxhdGUnKSB7CisgICAgICAg
IHJldHVybiAndGVtcGxhdGUgYXQgJyArIHBhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZS5y
ZXBsYWNlKC9cLi9nLCAnLycpOworICAgICAgfQorCisgICAgICBkZXNjcmlwdGlvbiA9IHBhcnNl
ZE5hbWUucm9vdCArICcuJyArIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkocGFy
c2VkTmFtZS5uYW1lKS5yZXBsYWNlKC9cLi9nLCAnJyk7CisKKyAgICAgIGlmIChwYXJzZWROYW1l
LnR5cGUgIT09ICdtb2RlbCcpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gKz0gX2VtYmVyUnVudGlt
ZVN5c3RlbVN0cmluZy5jbGFzc2lmeShwYXJzZWROYW1lLnR5cGUpOworICAgICAgfQorCisgICAg
ICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfSwKKworICAgIG1ha2VUb1N0cmluZzogZnVuY3Rp
b24gKGZhY3RvcnksIGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gZmFjdG9yeS50b1N0cmluZygp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEdpdmVuIGEgcGFyc2VOYW1lIG9iamVjdCAob3V0
cHV0IGZyb20gYHBhcnNlTmFtZWApLCBhcHBseQorICAgICAgdGhlIGNvbnZlbnRpb25zIGV4cGVj
dGVkIGJ5IGBFbWJlci5Sb3V0ZXJgCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFtIHtP
YmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAg
ICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHVzZVJvdXRlck5hbWlu
ZworICAgICAgQHB1YmxpYworICAgICovCisgICAgdXNlUm91dGVyTmFtaW5nOiBmdW5jdGlvbiAo
cGFyc2VkTmFtZSkgeworICAgICAgcGFyc2VkTmFtZS5uYW1lID0gcGFyc2VkTmFtZS5uYW1lLnJl
cGxhY2UoL1wuL2csICdfJyk7CisgICAgICBpZiAocGFyc2VkTmFtZS5uYW1lID09PSAnYmFzaWMn
KSB7CisgICAgICAgIHBhcnNlZE5hbWUubmFtZSA9ICcnOworICAgICAgfQorICAgIH0sCisgICAg
LyoqCisgICAgICBMb29rIHVwIHRoZSB0ZW1wbGF0ZSBpbiBFbWJlci5URU1QTEFURVMKKyAgICAg
ICBAcHJvdGVjdGVkCisgICAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFt
ZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcK
KyAgICAgIEBtZXRob2QgcmVzb2x2ZVRlbXBsYXRlCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uIChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgdGVt
cGxhdGVOYW1lID0gcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlLnJlcGxhY2UoL1wuL2cs
ICcvJyk7CisKKyAgICAgIHJldHVybiBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlX3JlZ2lzdHJ5Lmdl
dCh0ZW1wbGF0ZU5hbWUpIHx8IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkuZ2V0KF9l
bWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuZGVjYW1lbGl6ZSh0ZW1wbGF0ZU5hbWUpKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBMb29rdXAgdGhlIHZpZXcgdXNpbmcgYHJlc29sdmVPdGhlcmAK
KyAgICAgICBAcHJvdGVjdGVkCisgICAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBh
cnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICAgIGZ1bGxOYW1lIGxvb2t1cCBz
dHJpbmcKKyAgICAgIEBtZXRob2QgcmVzb2x2ZVZpZXcKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIHJlc29sdmVWaWV3OiBmdW5jdGlvbiAocGFyc2VkTmFtZSkgeworICAgICAgdGhpcy51c2VS
b3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7CisgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIo
cGFyc2VkTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTG9va3VwIHRoZSBjb250cm9s
bGVyIHVzaW5nIGByZXNvbHZlT3RoZXJgCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFt
IHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAor
ICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVDb250
cm9sbGVyCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlQ29udHJvbGxlcjogZnVu
Y3Rpb24gKHBhcnNlZE5hbWUpIHsKKyAgICAgIHRoaXMudXNlUm91dGVyTmFtaW5nKHBhcnNlZE5h
bWUpOworICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOworICAgIH0s
CisgICAgLyoqCisgICAgICBMb29rdXAgdGhlIHJvdXRlIHVzaW5nIGByZXNvbHZlT3RoZXJgCisg
ICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJz
ZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3Ry
aW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVSb3V0ZQorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgcmVzb2x2ZVJvdXRlOiBmdW5jdGlvbiAocGFyc2VkTmFtZSkgeworICAgICAgdGhpcy51c2VS
b3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7CisgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIo
cGFyc2VkTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTG9va3VwIHRoZSBtb2RlbCBv
biB0aGUgQXBwbGljYXRpb24gbmFtZXNwYWNlCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBh
cmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNl
ZAorICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVN
b2RlbAorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVzb2x2ZU1vZGVsOiBmdW5jdGlvbiAo
cGFyc2VkTmFtZSkgeworICAgICAgdmFyIGNsYXNzTmFtZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1T
dHJpbmcuY2xhc3NpZnkocGFyc2VkTmFtZS5uYW1lKTsKKyAgICAgIHZhciBmYWN0b3J5ID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHBhcnNlZE5hbWUucm9vdCwgY2xhc3NOYW1lKTsKKwor
ICAgICAgaWYgKGZhY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICB9Cisg
ICAgfSwKKyAgICAvKioKKyAgICAgIExvb2sgdXAgdGhlIHNwZWNpZmllZCBvYmplY3QgKGZyb20g
cGFyc2VkTmFtZSkgb24gdGhlIGFwcHJvcHJpYXRlCisgICAgICBuYW1lc3BhY2UgKHVzdWFsbHkg
b24gdGhlIEFwcGxpY2F0aW9uKQorICAgICAgIEBwcm90ZWN0ZWQKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKKyAgICAg
ICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAgICAgQG1ldGhvZCByZXNvbHZlSGVscGVyCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlSGVscGVyOiBmdW5jdGlvbiAocGFyc2Vk
TmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpIHx8IF9l
bWJlckh0bWxiYXJzSGVscGVycy5kZWZhdWx0W3BhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlw
ZV07CisgICAgfSwKKyAgICAvKioKKyAgICAgIExvb2sgdXAgdGhlIHNwZWNpZmllZCBvYmplY3Qg
KGZyb20gcGFyc2VkTmFtZSkgb24gdGhlIGFwcHJvcHJpYXRlCisgICAgICBuYW1lc3BhY2UgKHVz
dWFsbHkgb24gdGhlIEFwcGxpY2F0aW9uKQorICAgICAgIEBwcm90ZWN0ZWQKKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQK
KyAgICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAgICAgQG1ldGhvZCByZXNvbHZlT3Ro
ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlc29sdmVPdGhlcjogZnVuY3Rpb24gKHBh
cnNlZE5hbWUpIHsKKyAgICAgIHZhciBjbGFzc05hbWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtU3Ry
aW5nLmNsYXNzaWZ5KHBhcnNlZE5hbWUubmFtZSkgKyBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5n
LmNsYXNzaWZ5KHBhcnNlZE5hbWUudHlwZSk7CisgICAgICB2YXIgZmFjdG9yeSA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldChwYXJzZWROYW1lLnJvb3QsIGNsYXNzTmFtZSk7CisgICAgICBp
ZiAoZmFjdG9yeSkgeworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgIH0KKyAgICB9LAor
CisgICAgcmVzb2x2ZU1haW46IGZ1bmN0aW9uIChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgY2xh
c3NOYW1lID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeShwYXJzZWROYW1lLnR5
cGUpOworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwYXJzZWROYW1l
LnJvb3QsIGNsYXNzTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICBAbWV0aG9kIF9sb2dM
b29rdXAKKyAgICAgQHBhcmFtIHtCb29sZWFufSBmb3VuZAorICAgICBAcGFyYW0ge09iamVjdH0g
cGFyc2VkTmFtZQorICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2xvZ0xvb2t1cDogZnVuY3Rp
b24gKGZvdW5kLCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgc3ltYm9sLCBwYWRkaW5nOworCisg
ICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgc3ltYm9sID0gJ1vinJNdJzsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHN5bWJvbCA9ICdbIF0nOworICAgICAgfQorCisgICAgICBpZiAocGFyc2Vk
TmFtZS5mdWxsTmFtZS5sZW5ndGggPiA2MCkgeworICAgICAgICBwYWRkaW5nID0gJy4nOworICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgcGFkZGluZyA9IG5ldyBBcnJheSg2MCAtIHBhcnNlZE5hbWUu
ZnVsbE5hbWUubGVuZ3RoKS5qb2luKCcuJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFs
RGVidWcuaW5mbyhzeW1ib2wsIHBhcnNlZE5hbWUuZnVsbE5hbWUsIHBhZGRpbmcsIHRoaXMubG9v
a3VwRGVzY3JpcHRpb24ocGFyc2VkTmFtZS5mdWxsTmFtZSkpOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgVXNlZCB0byBpdGVyYXRlIGFsbCBpdGVtcyBvZiBhIGdpdmVuIHR5cGUuCisgICAgICBA
bWV0aG9kIGtub3duRm9yVHlwZQorICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0
byBzZWFyY2ggZm9yCisgICAgIEBwcml2YXRlCisgICAgICovCisgICAga25vd25Gb3JUeXBlOiBm
dW5jdGlvbiAodHlwZSkgeworICAgICAgdmFyIG5hbWVzcGFjZSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJyk7CisgICAgICB2YXIgc3VmZml4ID0gX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeSh0eXBlKTsKKyAgICAgIHZhciB0eXBlUmVnZXhw
ID0gbmV3IFJlZ0V4cChzdWZmaXggKyAnJCcpOworCisgICAgICB2YXIga25vd24gPSBfZW1iZXJN
ZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAgICAgIHZhciBrbm93bktleXMgPSBPYmpl
Y3Qua2V5cyhuYW1lc3BhY2UpOworICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBfbGVuZ3RoID0g
a25vd25LZXlzLmxlbmd0aDsgaW5kZXggPCBfbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgIHZh
ciBfbmFtZSA9IGtub3duS2V5c1tpbmRleF07CisKKyAgICAgICAgaWYgKHR5cGVSZWdleHAudGVz
dChfbmFtZSkpIHsKKyAgICAgICAgICB2YXIgY29udGFpbmVyTmFtZSA9IHRoaXMudHJhbnNsYXRl
VG9Db250YWluZXJGdWxsbmFtZSh0eXBlLCBfbmFtZSk7CisKKyAgICAgICAgICBrbm93bltjb250
YWluZXJOYW1lXSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGtu
b3duOworICAgIH0sCisKKyAgICAvKioKKyAgICAgQ29udmVydHMgcHJvdmlkZWQgbmFtZSBmcm9t
IHRoZSBiYWNraW5nIG5hbWVzcGFjZSBpbnRvIGEgY29udGFpbmVyIGxvb2t1cCBuYW1lLgorICAg
ICAgRXhhbXBsZXM6CisgICAgICBBcHAuRm9vQmFySGVscGVyIC0+IGhlbHBlcjpmb28tYmFyCisg
ICAgIEFwcC5USGVscGVyIC0+IGhlbHBlcjp0CisgICAgICBAbWV0aG9kIHRyYW5zbGF0ZVRvQ29u
dGFpbmVyRnVsbG5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKKyAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUKKyAgICAgQHByaXZhdGUKKyAgICAgKi8KKworICAgIHRyYW5zbGF0ZVRvQ29u
dGFpbmVyRnVsbG5hbWU6IGZ1bmN0aW9uICh0eXBlLCBuYW1lKSB7CisgICAgICB2YXIgc3VmZml4
ID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeSh0eXBlKTsKKyAgICAgIHZhciBu
YW1lUHJlZml4ID0gbmFtZS5zbGljZSgwLCBzdWZmaXgubGVuZ3RoICogLTEpOworICAgICAgdmFy
IGRhc2hlcml6ZWROYW1lID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5kYXNoZXJpemUobmFt
ZVByZWZpeCk7CisKKyAgICAgIHJldHVybiB0eXBlICsgJzonICsgZGFzaGVyaXplZE5hbWU7Cisg
ICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1hcHBsaWNhdGlvbi91dGlscy92YWxpZGF0
ZS10eXBlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItYXBwbGljYXRpb24KKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gdmFsaWRhdGVUeXBlOworCisgIHZhciBWQUxJREFURURfVFlQRVMgPSB7
CisgICAgcm91dGU6IFsnYXNzZXJ0JywgJ2lzUm91dGVGYWN0b3J5JywgJ0VtYmVyLlJvdXRlJ10s
CisgICAgY29tcG9uZW50OiBbJ2RlcHJlY2F0ZScsICdpc0NvbXBvbmVudEZhY3RvcnknLCAnRW1i
ZXIuQ29tcG9uZW50J10sCisgICAgdmlldzogWydkZXByZWNhdGUnLCAnaXNWaWV3RmFjdG9yeScs
ICdFbWJlci5WaWV3J10sCisgICAgc2VydmljZTogWydkZXByZWNhdGUnLCAnaXNTZXJ2aWNlRmFj
dG9yeScsICdFbWJlci5TZXJ2aWNlJ10KKyAgfTsKKworICBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUo
cmVzb2x2ZWRUeXBlLCBwYXJzZWROYW1lKSB7CisgICAgdmFyIHZhbGlkYXRpb25BdHRyaWJ1dGVz
ID0gVkFMSURBVEVEX1RZUEVTW3BhcnNlZE5hbWUudHlwZV07CisKKyAgICBpZiAoIXZhbGlkYXRp
b25BdHRyaWJ1dGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGFjdGlvbiA9
IHZhbGlkYXRpb25BdHRyaWJ1dGVzWzBdOworICAgIHZhciBmYWN0b3J5RmxhZyA9IHZhbGlkYXRp
b25BdHRyaWJ1dGVzWzFdOworICAgIHZhciBleHBlY3RlZFR5cGUgPSB2YWxpZGF0aW9uQXR0cmli
dXRlc1syXTsKKworICAgIGlmIChhY3Rpb24gPT09ICdkZXByZWNhdGUnKSB7CisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnSW4gRW1iZXIgMi4wICcgKyBwYXJzZWROYW1lLnR5cGUg
KyAnIGZhY3RvcmllcyBtdXN0IGhhdmUgYW4gYCcgKyBmYWN0b3J5RmxhZyArICdgICcgKyAoJ3By
b3BlcnR5IHNldCB0byB0cnVlLiBZb3UgcmVnaXN0ZXJlZCAnICsgcmVzb2x2ZWRUeXBlICsgJyBh
cyBhICcgKyBwYXJzZWROYW1lLnR5cGUgKyAnICcpICsgKCdmYWN0b3J5LiBFaXRoZXIgYWRkIHRo
ZSBgJyArIGZhY3RvcnlGbGFnICsgJ2AgcHJvcGVydHkgdG8gdGhpcyBmYWN0b3J5IG9yICcpICsg
KCdleHRlbmQgZnJvbSAnICsgZXhwZWN0ZWRUeXBlICsgJy4nKSwgISFyZXNvbHZlZFR5cGVbZmFj
dG9yeUZsYWddLCB7IGlkOiAnZW1iZXItYXBwbGljYXRpb24udmFsaWRhdGUtdHlwZScsIHVudGls
OiAnMy4wLjAnIH0pOworICAgIH0gZWxzZSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnRXhwZWN0ZWQgJyArIHBhcnNlZE5hbWUuZnVsbE5hbWUgKyAnIHRvIHJlc29sdmUgdG8gYW4g
JyArIGV4cGVjdGVkVHlwZSArICcgYnV0ICcgKyAoJ2luc3RlYWQgaXQgd2FzICcgKyByZXNvbHZl
ZFR5cGUgKyAnLicpLCAhIXJlc29sdmVkVHlwZVtmYWN0b3J5RmxhZ10pOworICAgIH0KKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLWRlYnVnL2RlcHJlY2F0ZScsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9jb3JlJywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2VtYmVyLW1ldGFsL2xvZ2dlcicsICdl
bWJlci1kZWJ1Zy9oYW5kbGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3Jl
LCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbExvZ2dlciwgX2VtYmVyRGVidWdIYW5kbGVy
cykgeworICAvKmdsb2JhbCBfX2ZhaWxfXyovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBf
c2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgIGV4cG9ydHMucmVnaXN0ZXJIYW5kbGVy
ID0gcmVnaXN0ZXJIYW5kbGVyOworICBleHBvcnRzLmRlZmF1bHQgPSBkZXByZWNhdGU7CisKKyAg
ZnVuY3Rpb24gcmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXIpIHsKKyAgICBfZW1iZXJEZWJ1Z0hhbmRs
ZXJzLnJlZ2lzdGVySGFuZGxlcignZGVwcmVjYXRlJywgaGFuZGxlcik7CisgIH0KKworICBmdW5j
dGlvbiBmb3JtYXRNZXNzYWdlKF9tZXNzYWdlLCBvcHRpb25zKSB7CisgICAgdmFyIG1lc3NhZ2Ug
PSBfbWVzc2FnZTsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWQpIHsKKyAgICAgIG1l
c3NhZ2UgPSBtZXNzYWdlICsgKCcgW2RlcHJlY2F0aW9uIGlkOiAnICsgb3B0aW9ucy5pZCArICdd
Jyk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51cmwpIHsKKyAgICAgIG1l
c3NhZ2UgKz0gJyBTZWUgJyArIG9wdGlvbnMudXJsICsgJyBmb3IgbW9yZSBkZXRhaWxzLic7Cisg
ICAgfQorCisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0KKworICByZWdpc3RlckhhbmRsZXIoZnVu
Y3Rpb24gbG9nRGVwcmVjYXRpb25Ub0NvbnNvbGUobWVzc2FnZSwgb3B0aW9ucykgeworICAgIHZh
ciB1cGRhdGVkTWVzc2FnZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSwgb3B0aW9ucyk7CisKKyAg
ICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ0RFUFJFQ0FUSU9OOiAnICsgdXBkYXRl
ZE1lc3NhZ2UpOworICB9KTsKKworICB2YXIgY2FwdHVyZUVycm9yRm9yU3RhY2sgPSB1bmRlZmlu
ZWQ7CisKKyAgaWYgKG5ldyBFcnJvcigpLnN0YWNrKSB7CisgICAgY2FwdHVyZUVycm9yRm9yU3Rh
Y2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gbmV3IEVycm9yKCk7CisgICAgfTsKKyAg
fSBlbHNlIHsKKyAgICBjYXB0dXJlRXJyb3JGb3JTdGFjayA9IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHRyeSB7CisgICAgICAgIF9fZmFpbF9fLmZhaWwoKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAg
ICAgICAgcmV0dXJuIGU7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJlZ2lzdGVySGFuZGxl
cihmdW5jdGlvbiBsb2dEZXByZWNhdGlvblN0YWNrVHJhY2UobWVzc2FnZSwgb3B0aW9ucywgbmV4
dCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5MT0dfU1RBQ0tUUkFDRV9PTl9E
RVBSRUNBVElPTikgeworICAgICAgdmFyIHN0YWNrU3RyID0gJyc7CisgICAgICB2YXIgZXJyb3Ig
PSBjYXB0dXJlRXJyb3JGb3JTdGFjaygpOworICAgICAgdmFyIHN0YWNrID0gdW5kZWZpbmVkOwor
CisgICAgICBpZiAoZXJyb3Iuc3RhY2spIHsKKyAgICAgICAgaWYgKGVycm9yWydhcmd1bWVudHMn
XSkgeworICAgICAgICAgIC8vIENocm9tZQorICAgICAgICAgIHN0YWNrID0gZXJyb3Iuc3RhY2su
cmVwbGFjZSgvXlxzK2F0XHMrL2dtLCAnJykucmVwbGFjZSgvXihbXlwoXSs/KShbXG4kXSkvZ20s
ICd7YW5vbnltb3VzfSgkMSkkMicpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5ccypcKChb
XlwpXSspXCkvZ20sICd7YW5vbnltb3VzfSgkMSknKS5zcGxpdCgnXG4nKTsKKyAgICAgICAgICBz
dGFjay5zaGlmdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEZpcmVmb3gKKyAg
ICAgICAgICBzdGFjayA9IGVycm9yLnN0YWNrLnJlcGxhY2UoLyg/OlxuQDowKT9ccyskL20sICcn
KS5yZXBsYWNlKC9eXCgvZ20sICd7YW5vbnltb3VzfSgnKS5zcGxpdCgnXG4nKTsKKyAgICAgICAg
fQorCisgICAgICAgIHN0YWNrU3RyID0gJ1xuICAgICcgKyBzdGFjay5zbGljZSgyKS5qb2luKCdc
biAgICAnKTsKKyAgICAgIH0KKworICAgICAgdmFyIHVwZGF0ZWRNZXNzYWdlID0gZm9ybWF0TWVz
c2FnZShtZXNzYWdlLCBvcHRpb25zKTsKKworICAgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVs
dC53YXJuKCdERVBSRUNBVElPTjogJyArIHVwZGF0ZWRNZXNzYWdlICsgc3RhY2tTdHIpOworICAg
IH0gZWxzZSB7CisgICAgICBuZXh0LmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKKyAgICB9
CisgIH0pOworCisgIHJlZ2lzdGVySGFuZGxlcihmdW5jdGlvbiByYWlzZU9uRGVwcmVjYXRpb24o
bWVzc2FnZSwgb3B0aW9ucywgbmV4dCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5FTlYuUkFJU0VfT05fREVQUkVDQVRJT04pIHsKKyAgICAgIHZhciB1cGRhdGVkTWVzc2FnZSA9
IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVy
cm9yLmRlZmF1bHQodXBkYXRlZE1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBuZXh0LmFw
cGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKKyAgICB9CisgIH0pOworCisgIHZhciBtaXNzaW5n
T3B0aW9uc0RlcHJlY2F0aW9uID0gJ1doZW4gY2FsbGluZyBgRW1iZXIuZGVwcmVjYXRlYCB5b3Ug
JyArICdtdXN0IHByb3ZpZGUgYW4gYG9wdGlvbnNgIGhhc2ggYXMgdGhlIHRoaXJkIHBhcmFtZXRl
ci4gICcgKyAnYG9wdGlvbnNgIHNob3VsZCBpbmNsdWRlIGBpZGAgYW5kIGB1bnRpbGAgcHJvcGVy
dGllcy4nOworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24gPSBtaXNzaW5nT3B0
aW9uc0RlcHJlY2F0aW9uOworICB2YXIgbWlzc2luZ09wdGlvbnNJZERlcHJlY2F0aW9uID0gJ1do
ZW4gY2FsbGluZyBgRW1iZXIuZGVwcmVjYXRlYCB5b3UgbXVzdCBwcm92aWRlIGBpZGAgaW4gb3B0
aW9ucy4nOworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiA9IG1pc3NpbmdP
cHRpb25zSWREZXByZWNhdGlvbjsKKyAgdmFyIG1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNhdGlv
biA9ICdXaGVuIGNhbGxpbmcgYEVtYmVyLmRlcHJlY2F0ZWAgeW91IG11c3QgcHJvdmlkZSBgdW50
aWxgIGluIG9wdGlvbnMuJzsKKworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNh
dGlvbiA9IG1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNhdGlvbjsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1kZWJ1ZworICAqLworCisgIC8qKgorICAgIERpc3Bs
YXkgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYW5kIGEg
c3RhY2sgdHJhY2UKKyAgICAoQ2hyb21lIGFuZCBGaXJlZm94IG9ubHkpLgorICAKKyAgICAqIElu
IGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBm
dW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMgbWV0aG9kIGluIEVtYmVyIGl0c2VsZiBh
cmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5qcyBidWlsZC4KKyAgCisgICAgQG1ldGhv
ZCBkZXByZWNhdGUKKyAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9m
IHRoZSBkZXByZWNhdGlvbi4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgQSBib29sZWFuLiBJ
ZiBmYWxzeSwgdGhlIGRlcHJlY2F0aW9uCisgICAgICB3aWxsIGJlIGRpc3BsYXllZC4KKyAgICBA
cGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXNz
CisgICAgICBpbiBhIGB1cmxgIHRvIHRoZSB0cmFuc2l0aW9uIGd1aWRlIG9uIHRoZSBlbWJlcmpz
LmNvbSB3ZWJzaXRlLCBhbmQgYSB1bmlxdWUKKyAgICAgIGBpZGAgZm9yIHRoaXMgZGVwcmVjYXRp
b24uIFRoZSBgaWRgIGNhbiBiZSB1c2VkIGJ5IEVtYmVyIGRlYnVnZ2luZyB0b29scworICAgICAg
dG8gY2hhbmdlIHRoZSBiZWhhdmlvciAocmFpc2UsIGxvZyBvciBzaWxlbmNlKSBmb3IgdGhhdCBz
cGVjaWZpYyBkZXByZWNhdGlvbi4KKyAgICAgIFRoZSBgaWRgIHNob3VsZCBiZSBuYW1lc3BhY2Vk
IGJ5IGRvdHMsIGUuZy4gInZpZXcuaGVscGVyLnNlbGVjdCIuCisgICAgQGZvciBFbWJlcgorICAg
IEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBkZXByZWNhdGUobWVzc2FnZSwgdGVzdCwgb3B0
aW9ucykgeworICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5pZCAmJiAhb3B0aW9ucy51bnRp
bCkgeworICAgICAgZGVwcmVjYXRlKG1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24sIGZhbHNlLCB7
CisgICAgICAgIGlkOiAnZW1iZXItZGVidWcuZGVwcmVjYXRlLW9wdGlvbnMtbWlzc2luZycsCisg
ICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20v
ZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAg
ICAgfSk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuaWQpIHsKKyAgICAg
IGRlcHJlY2F0ZShtaXNzaW5nT3B0aW9uc0lkRGVwcmVjYXRpb24sIGZhbHNlLCB7CisgICAgICAg
IGlkOiAnZW1iZXItZGVidWcuZGVwcmVjYXRlLWlkLW1pc3NpbmcnLAorICAgICAgICB1bnRpbDog
JzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92
Mi54LyN0b2NfZW1iZXItZGVidWctZnVuY3Rpb24tb3B0aW9ucycKKyAgICAgIH0pOworICAgIH0K
KworICAgIGlmIChvcHRpb25zICYmICFvcHRpb25zLnVudGlsKSB7CisgICAgICBkZXByZWNhdGUo
bWlzc2luZ09wdGlvbnNVbnRpbERlcHJlY2F0aW9uLCBvcHRpb25zICYmIG9wdGlvbnMudW50aWws
IHsKKyAgICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy5kZXByZWNhdGUtdW50aWwtbWlzc2luZycsCisg
ICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20v
ZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAg
ICAgfSk7CisgICAgfQorCisgICAgX2VtYmVyRGVidWdIYW5kbGVycy5pbnZva2UuYXBwbHkodW5k
ZWZpbmVkLCBbJ2RlcHJlY2F0ZSddLmNvbmNhdChfc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7Cisg
IH0KK30pOworZW5pZmVkKCJlbWJlci1kZWJ1Zy9oYW5kbGVycyIsIFsiZXhwb3J0cyJdLCBmdW5j
dGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5yZWdpc3Rlckhh
bmRsZXIgPSByZWdpc3RlckhhbmRsZXI7CisgIGV4cG9ydHMuaW52b2tlID0gaW52b2tlOworICB2
YXIgSEFORExFUlMgPSB7fTsKKworICBleHBvcnRzLkhBTkRMRVJTID0gSEFORExFUlM7CisKKyAg
ZnVuY3Rpb24gcmVnaXN0ZXJIYW5kbGVyKHR5cGUsIGNhbGxiYWNrKSB7CisgICAgdmFyIG5leHRI
YW5kbGVyID0gSEFORExFUlNbdHlwZV0gfHwgZnVuY3Rpb24gKCkge307CisKKyAgICBIQU5ETEVS
U1t0eXBlXSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBvcHRpb25zKSB7CisgICAgICBjYWxsYmFjayht
ZXNzYWdlLCBvcHRpb25zLCBuZXh0SGFuZGxlcik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9u
IGludm9rZSh0eXBlLCBtZXNzYWdlLCB0ZXN0LCBvcHRpb25zKSB7CisgICAgaWYgKHRlc3QpIHsK
KyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaGFuZGxlckZvclR5cGUgPSBIQU5ETEVS
U1t0eXBlXTsKKworICAgIGlmICghaGFuZGxlckZvclR5cGUpIHsKKyAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAoaGFuZGxlckZvclR5cGUpIHsKKyAgICAgIGhhbmRsZXJGb3JUeXBlKG1l
c3NhZ2UsIG9wdGlvbnMpOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWRlYnVnL2lu
ZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcn
LCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0
YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL2Vudmlyb25tZW50JywgJ2VtYmVyLWRlYnVnL2RlcHJl
Y2F0ZScsICdlbWJlci1kZWJ1Zy93YXJuJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFs
RXJyb3IsIF9lbWJlck1ldGFsTG9nZ2VyLCBfZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJE
ZWJ1Z0RlcHJlY2F0ZSwgX2VtYmVyRGVidWdXYXJuKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLl93YXJuSWZVc2luZ1N0cmlwcGVkRmVhdHVyZUZsYWdzID0gX3dhcm5JZlVzaW5nU3Ry
aXBwZWRGZWF0dXJlRmxhZ3M7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci1kZWJ1ZworICAqLworCisgIC8qKgorICBAY2xhc3MgRW1iZXIKKyAgQHB1YmxpYwor
ICAqLworCisgIC8qKgorICAgIERlZmluZSBhbiBhc3NlcnRpb24gdGhhdCB3aWxsIHRocm93IGFu
IGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuCisgIAorICAgICogSW4gYSBw
cm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0
aW9uIChOT1ApLgorICAgIFVzZXMgb2YgdGhpcyBtZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBz
dHJpcHBlZCBmcm9tIHRoZSBlbWJlci5wcm9kLmpzIGJ1aWxkLgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gVGVzdCBmb3IgdHJ1dGhpbmVzcworICAgIEVtYmVyLmFzc2VydCgnTXVzdCBw
YXNzIGEgdmFsaWQgb2JqZWN0Jywgb2JqKTsKKyAgCisgICAgLy8gRmFpbCB1bmNvbmRpdGlvbmFs
bHkKKyAgICBFbWJlci5hc3NlcnQoJ1RoaXMgY29kZSBwYXRoIHNob3VsZCBuZXZlciBiZSBydW4n
KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhc3NlcnQKKyAgICBAcGFyYW0ge1N0cmluZ30g
ZGVzYyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3NlcnRpb24uIFRoaXMgd2lsbCBiZWNvbWUKKyAg
ICAgIHRoZSB0ZXh0IG9mIHRoZSBFcnJvciB0aHJvd24gaWYgdGhlIGFzc2VydGlvbiBmYWlscy4K
KyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgTXVzdCBiZSB0cnV0aHkgZm9yIHRoZSBhc3NlcnRp
b24gdG8gcGFzcy4gSWYKKyAgICAgIGZhbHN5LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24u
CisgICAgQHB1YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24o
J2Fzc2VydCcsIGZ1bmN0aW9uIGFzc2VydChkZXNjLCB0ZXN0KSB7CisgICAgaWYgKCF0ZXN0KSB7
CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdBc3NlcnRpb24gRmFp
bGVkOiAnICsgZGVzYyk7CisgICAgfQorICB9KTsKKworICAvKioKKyAgICBEaXNwbGF5IGEgZGVi
dWcgbm90aWNlLgorICAKKyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2Qg
aXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMg
bWV0aG9kIGluIEVtYmVyIGl0c2VsZiBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5q
cyBidWlsZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmRlYnVnKCdJXCdtIGEg
ZGVidWcgbm90aWNlIScpOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGRlYnVnCisgICAgQHBh
cmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSBkZWJ1ZyBtZXNzYWdlIHRvIGRpc3BsYXkuCisgICAgQHB1
YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24oJ2RlYnVnJywg
ZnVuY3Rpb24gZGVidWcobWVzc2FnZSkgeworICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQu
ZGVidWcoJ0RFQlVHOiAnICsgbWVzc2FnZSk7CisgIH0pOworCisgIC8qKgorICAgIERpc3BsYXkg
YW4gaW5mbyBub3RpY2UuCisgIAorICAgICogSW4gYSBwcm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1l
dGhvZCBpcyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0aW9uIChOT1ApLgorICAgIFVzZXMgb2Yg
dGhpcyBtZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBlbWJlci5w
cm9kLmpzIGJ1aWxkLgorICAKKyAgICBAbWV0aG9kIGluZm8KKyAgICBAcHJpdmF0ZQorICAqLwor
ICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24oJ2luZm8nLCBmdW5jdGlvbiBpbmZv
KCkgeworICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQuaW5mby5hcHBseSh1bmRlZmluZWQs
IGFyZ3VtZW50cyk7CisgIH0pOworCisgIC8qKgorICAgIEFsaWFzIGFuIG9sZCwgZGVwcmVjYXRl
ZCBtZXRob2Qgd2l0aCBpdHMgbmV3IGNvdW50ZXJwYXJ0LgorICAKKyAgICBEaXNwbGF5IGEgZGVw
cmVjYXRpb24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBhIHN0YWNrIHRy
YWNlCisgICAgKENocm9tZSBhbmQgRmlyZWZveCBvbmx5KSB3aGVuIHRoZSBhc3NpZ25lZCBtZXRo
b2QgaXMgY2FsbGVkLgorICAKKyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRo
b2QgaXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEVtYmVyLm9sZE1ldGhvZCA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoJ1BsZWFz
ZSB1c2UgdGhlIG5ldywgdXBkYXRlZCBtZXRob2QnLCBFbWJlci5uZXdNZXRob2QpOworICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGRlcHJlY2F0ZUZ1bmMKKyAgICBAcGFyYW0ge1N0cmluZ30gbWVz
c2FnZSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4KKyAgICBAcGFyYW0ge09iamVj
dH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdCBmb3IgRW1iZXIuZGVwcmVjYXRlLgorICAg
IEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIG5ldyBmdW5jdGlvbiBjYWxsZWQgdG8gcmVwbGFj
ZSBpdHMgZGVwcmVjYXRlZCBjb3VudGVycGFydC4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gQSBu
ZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCBhIGRlcHJl
Y2F0aW9uIHdhcm5pbmcKKyAgICBAcHJpdmF0ZQorICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNl
dERlYnVnRnVuY3Rpb24oJ2RlcHJlY2F0ZUZ1bmMnLCBmdW5jdGlvbiBkZXByZWNhdGVGdW5jKCkg
eworICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xl
biksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICBhcmdzW19rZXldID0g
YXJndW1lbnRzW19rZXldOworICAgIH0KKworICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykgewor
ICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgbWVzc2FnZSA9IGFy
Z3NbMF07CisgICAgICAgIHZhciBvcHRpb25zID0gYXJnc1sxXTsKKyAgICAgICAgdmFyIGZ1bmMg
PSBhcmdzWzJdOworCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgdjogZnVuY3Rpb24gKCkg
eworICAgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUobWVzc2FnZSwgZmFsc2Us
IG9wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KSgpOworCisgICAgICBpZiAodHlw
ZW9mIF9yZXQgPT09ICdvYmplY3QnKSByZXR1cm4gX3JldC52OworICAgIH0gZWxzZSB7CisgICAg
ICB2YXIgX3JldDIgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgbWVzc2FnZSA9IGFyZ3Nb
MF07CisgICAgICAgIHZhciBmdW5jID0gYXJnc1sxXTsKKworICAgICAgICByZXR1cm4geworICAg
ICAgICAgIHY6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KSgpOworCisgICAgICBp
ZiAodHlwZW9mIF9yZXQyID09PSAnb2JqZWN0JykgcmV0dXJuIF9yZXQyLnY7CisgICAgfQorICB9
KTsKKworICAvKioKKyAgICBSdW4gYSBmdW5jdGlvbiBtZWFudCBmb3IgZGVidWdnaW5nLgorICAK
KyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBhcyBh
biBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMgbWV0aG9kIGluIEVtYmVy
IGl0c2VsZiBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5qcyBidWlsZC4KKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLnJ1bkluRGVidWcoKCkgPT4geworICAgICAgRW1i
ZXIuQ29tcG9uZW50LnJlb3Blbih7CisgICAgICAgIGRpZEluc2VydEVsZW1lbnQoKSB7CisgICAg
ICAgICAgY29uc29sZS5sb2coIkknbSBoYXBweSIpOworICAgICAgICB9CisgICAgICB9KTsKKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBydW5JbkRlYnVnCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCisgICAgQHNpbmNlIDEu
NS4wCisgICAgQHB1YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rp
b24oJ3J1bkluRGVidWcnLCBmdW5jdGlvbiBydW5JbkRlYnVnKGZ1bmMpIHsKKyAgICBmdW5jKCk7
CisgIH0pOworCisgIF9lbWJlck1ldGFsRGVidWcuc2V0RGVidWdGdW5jdGlvbignZGVidWdTZWFs
JywgZnVuY3Rpb24gZGVidWdTZWFsKG9iaikgeworICAgIE9iamVjdC5zZWFsKG9iaik7CisgIH0p
OworCisgIF9lbWJlck1ldGFsRGVidWcuc2V0RGVidWdGdW5jdGlvbignZGVwcmVjYXRlJywgX2Vt
YmVyRGVidWdEZXByZWNhdGUuZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxEZWJ1Zy5zZXREZWJ1
Z0Z1bmN0aW9uKCd3YXJuJywgX2VtYmVyRGVidWdXYXJuLmRlZmF1bHQpOworCisgIC8qKgorICAg
IFdpbGwgY2FsbCBgRW1iZXIud2FybigpYCBpZiBFTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVMgb3IK
KyAgICBhbnkgc3BlY2lmaWMgRkVBVFVSRVMgZmxhZyBpcyB0cnV0aHkuCisgIAorICAgIFRoaXMg
bWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGluIGRlYnVnIGNhbmFyeSBidWlsZHMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfd2FybklmVXNpbmdTdHJpcHBlZEZlYXR1cmVG
bGFncworICAgIEByZXR1cm4ge3ZvaWR9CisgICovCisKKyAgZnVuY3Rpb24gX3dhcm5JZlVzaW5n
U3RyaXBwZWRGZWF0dXJlRmxhZ3MoRkVBVFVSRVMsIGtub3duRmVhdHVyZXMsIGZlYXR1cmVzV2Vy
ZVN0cmlwcGVkKSB7CisgICAgaWYgKGZlYXR1cmVzV2VyZVN0cmlwcGVkKSB7CisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLndhcm4oJ0VtYmVyLkVOVi5FTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVMgaXMg
b25seSBhdmFpbGFibGUgaW4gY2FuYXJ5IGJ1aWxkcy4nLCAhX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQuRU5WLkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFUywgeyBpZDogJ2VtYmVyLWRlYnVnLmZlYXR1
cmUtZmxhZy13aXRoLWZlYXR1cmVzLXN0cmlwcGVkJyB9KTsKKworICAgICAgdmFyIGtleXMgPSBP
YmplY3Qua2V5cyhGRUFUVVJFUyB8fCB7fSk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtl
eXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGtleSA9IGtleXNbaV07CisgICAgICAgIGlm
IChrZXkgPT09ICdpc0VuYWJsZWQnIHx8ICEoa2V5IGluIGtub3duRmVhdHVyZXMpKSB7CisgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndh
cm4oJ0ZFQVRVUkVbIicgKyBrZXkgKyAnIl0gaXMgc2V0IGFzIGVuYWJsZWQsIGJ1dCBGRUFUVVJF
IGZsYWdzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBjYW5hcnkgYnVpbGRzLicsICFGRUFUVVJFU1tr
ZXldLCB7IGlkOiAnZW1iZXItZGVidWcuZmVhdHVyZS1mbGFnLXdpdGgtZmVhdHVyZXMtc3RyaXBw
ZWQnIH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQudGVzdGluZykgeworICAgIC8vIENvbXBsYWluIGlmIHRoZXkncmUgdXNpbmcgRkVBVFVS
RSBmbGFncyBpbiBidWlsZHMgb3RoZXIgdGhhbiBjYW5hcnkKKyAgICBfZW1iZXJNZXRhbEZlYXR1
cmVzLkZFQVRVUkVTWydmZWF0dXJlcy1zdHJpcHBlZC10ZXN0J10gPSB0cnVlOworICAgIHZhciBm
ZWF0dXJlc1dlcmVTdHJpcHBlZCA9IHRydWU7CisKKyAgICBkZWxldGUgX2VtYmVyTWV0YWxGZWF0
dXJlcy5GRUFUVVJFU1snZmVhdHVyZXMtc3RyaXBwZWQtdGVzdCddOworICAgIF93YXJuSWZVc2lu
Z1N0cmlwcGVkRmVhdHVyZUZsYWdzKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5GRUFUVVJF
UywgX2VtYmVyTWV0YWxGZWF0dXJlcy5LTk9XTl9GRUFUVVJFUywgZmVhdHVyZXNXZXJlU3RyaXBw
ZWQpOworCisgICAgLy8gSW5mb3JtIHRoZSBkZXZlbG9wZXIgYWJvdXQgdGhlIEVtYmVyIEluc3Bl
Y3RvciBpZiBub3QgaW5zdGFsbGVkLgorICAgIHZhciBpc0ZpcmVmb3ggPSBfZW1iZXJNZXRhbEVu
dmlyb25tZW50LmRlZmF1bHQuaXNGaXJlZm94OworICAgIHZhciBpc0Nocm9tZSA9IF9lbWJlck1l
dGFsRW52aXJvbm1lbnQuZGVmYXVsdC5pc0Nocm9tZTsKKworICAgIGlmICh0eXBlb2Ygd2luZG93
ICE9PSAndW5kZWZpbmVkJyAmJiAoaXNGaXJlZm94IHx8IGlzQ2hyb21lKSAmJiB3aW5kb3cuYWRk
RXZlbnRMaXN0ZW5lcikgeworICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBm
dW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dC5kYXRhc2V0LmVtYmVyRXh0ZW5zaW9uKSB7CisgICAgICAgICAgdmFyIGRvd25sb2FkVVJMOwor
CisgICAgICAgICAgaWYgKGlzQ2hyb21lKSB7CisgICAgICAgICAgICBkb3dubG9hZFVSTCA9ICdo
dHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9lbWJlci1pbnNwZWN0b3Iv
Ym1kYmxuY2Vna2Vua2FjaWVpaGZocGpmcHBvY29uaGknOworICAgICAgICAgIH0gZWxzZSBpZiAo
aXNGaXJlZm94KSB7CisgICAgICAgICAgICBkb3dubG9hZFVSTCA9ICdodHRwczovL2FkZG9ucy5t
b3ppbGxhLm9yZy9lbi1VUy9maXJlZm94L2FkZG9uL2VtYmVyLWluc3BlY3Rvci8nOworICAgICAg
ICAgIH0KKworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVidWcoJ0ZvciBtb3JlIGFkdmFu
Y2VkIGRlYnVnZ2luZywgaW5zdGFsbCB0aGUgRW1iZXIgSW5zcGVjdG9yIGZyb20gJyArIGRvd25s
b2FkVVJMKTsKKyAgICAgICAgfQorICAgICAgfSwgZmFsc2UpOworICAgIH0KKyAgfQorICAvKioK
KyAgICBAcHVibGljCisgICAgQGNsYXNzIEVtYmVyLkRlYnVnCisgICovCisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LkRlYnVnID0ge307CisKKyAgLyoqCisgICAgQWxsb3dzIGZvciBydW50aW1l
IHJlZ2lzdHJhdGlvbiBvZiBoYW5kbGVyIGZ1bmN0aW9ucyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZh
dWx0IGRlcHJlY2F0aW9uIGJlaGF2aW9yLgorICAgIERlcHJlY2F0aW9ucyBhcmUgaW52b2tlZCBi
eSBjYWxscyB0byBbRW1iZXIuZGVwcmVjYXRlXShodHRwOi8vZW1iZXJqcy5jb20vYXBpL2NsYXNz
ZXMvRW1iZXIuaHRtbCNtZXRob2RfZGVwcmVjYXRlKS4KKyAgICBUaGUgZm9sbG93aW5nIGV4YW1w
bGUgZGVtb25zdHJhdGVzIGl0cyB1c2FnZSBieSByZWdpc3RlcmluZyBhIGhhbmRsZXIgdGhhdCB0
aHJvd3MgYW4gZXJyb3IgaWYgdGhlCisgICAgbWVzc2FnZSBjb250YWlucyB0aGUgd29yZCAic2hv
dWxkIiwgb3RoZXJ3aXNlIGRlZmVycyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgRW1iZXIuRGVidWcucmVnaXN0ZXJEZXByZWNhdGlvbkhhbmRsZXIo
KG1lc3NhZ2UsIG9wdGlvbnMsIG5leHQpID0+IHsKKyAgICAgIGlmIChtZXNzYWdlLmluZGV4T2Yo
J3Nob3VsZCcpICE9PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcHJlY2F0aW9u
IG1lc3NhZ2Ugd2l0aCBzaG91bGQ6ICR7bWVzc2FnZX1gKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIC8vIGRlZmVyIHRvIHdoYXRldmVyIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgYmVmb3JlIHRo
aXMgb25lCisgICAgICAgIG5leHQobWVzc2FnZSwgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQor
ICAgIGBgYAorICAKKyAgICBUaGUgaGFuZGxlciBmdW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5n
IGFyZ3VtZW50czoKKyAgCisgICAgPHVsPgorICAgICAgPGxpPiA8Y29kZT5tZXNzYWdlPC9jb2Rl
PiAtIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGRlcHJlY2F0aW9uIGNhbGwuPC9saT4K
KyAgICAgIDxsaT4gPGNvZGU+b3B0aW9uczwvY29kZT4gLSBBbiBvYmplY3QgcGFzc2VkIGluIHdp
dGggdGhlIGRlcHJlY2F0aW9uIGNhbGwgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9u
IGluY2x1ZGluZzo8L2xpPgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPiA8Y29kZT5pZDwv
Y29kZT4gLSBBbiBpZCBvZiB0aGUgZGVwcmVjYXRpb24gaW4gdGhlIGZvcm0gb2YgPGNvZGU+cGFj
a2FnZS1uYW1lLnNwZWNpZmljLWRlcHJlY2F0aW9uPC9jb2RlPi48L2xpPgorICAgICAgICAgIDxs
aT4gPGNvZGU+dW50aWw8L2NvZGU+IC0gVGhlIEVtYmVyIHZlcnNpb24gbnVtYmVyIHRoZSBmZWF0
dXJlIGFuZCBkZXByZWNhdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4uPC9saT4KKyAgICAgICAgPC91
bD4KKyAgICAgIDxsaT4gPGNvZGU+bmV4dDwvY29kZT4gLSBBIGZ1bmN0aW9uIHRoYXQgY2FsbHMg
aW50byB0aGUgcHJldmlvdXNseSByZWdpc3RlcmVkIGhhbmRsZXIuPC9saT4KKyAgICA8L3VsPgor
ICAKKyAgICBAcHVibGljCisgICAgQHN0YXRpYworICAgIEBtZXRob2QgcmVnaXN0ZXJEZXByZWNh
dGlvbkhhbmRsZXIKKyAgICBAcGFyYW0gaGFuZGxlciB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8g
aGFuZGxlIGRlcHJlY2F0aW9uIGNhbGxzLgorICAgIEBzaW5jZSAyLjEuMAorICAqLworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5EZWJ1Zy5yZWdpc3RlckRlcHJlY2F0aW9uSGFuZGxlciA9IF9l
bWJlckRlYnVnRGVwcmVjYXRlLnJlZ2lzdGVySGFuZGxlcjsKKyAgLyoqCisgICAgQWxsb3dzIGZv
ciBydW50aW1lIHJlZ2lzdHJhdGlvbiBvZiBoYW5kbGVyIGZ1bmN0aW9ucyB0aGF0IG92ZXJyaWRl
IHRoZSBkZWZhdWx0IHdhcm5pbmcgYmVoYXZpb3IuCisgICAgV2FybmluZ3MgYXJlIGludm9rZWQg
YnkgY2FsbHMgbWFkZSB0byBbRW1iZXIud2Fybl0oaHR0cDovL2VtYmVyanMuY29tL2FwaS9jbGFz
c2VzL0VtYmVyLmh0bWwjbWV0aG9kX3dhcm4pLgorICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBk
ZW1vbnN0cmF0ZXMgaXRzIHVzYWdlIGJ5IHJlZ2lzdGVyaW5nIGEgaGFuZGxlciB0aGF0IGRvZXMg
bm90aGluZyBvdmVycmlkaW5nIEVtYmVyJ3MKKyAgICBkZWZhdWx0IHdhcm5pbmcgYmVoYXZpb3Iu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICAvLyBuZXh0IGlzIG5vdCBjYWxsZWQsIHNvIG5v
IHdhcm5pbmdzIGdldCB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgIEVtYmVyLkRlYnVnLnJlZ2lz
dGVyV2FybkhhbmRsZXIoKCkgPT4ge30pOworICAgIGBgYAorICAKKyAgICBUaGUgaGFuZGxlciBm
dW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAgCisgICAgPHVsPgorICAg
ICAgPGxpPiA8Y29kZT5tZXNzYWdlPC9jb2RlPiAtIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20g
dGhlIHdhcm4gY2FsbC4gPC9saT4KKyAgICAgIDxsaT4gPGNvZGU+b3B0aW9uczwvY29kZT4gLSBB
biBvYmplY3QgcGFzc2VkIGluIHdpdGggdGhlIHdhcm4gY2FsbCBjb250YWluaW5nIGFkZGl0aW9u
YWwgaW5mb3JtYXRpb24gaW5jbHVkaW5nOjwvbGk+CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8
bGk+IDxjb2RlPmlkPC9jb2RlPiAtIEFuIGlkIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmb3JtIG9m
IDxjb2RlPnBhY2thZ2UtbmFtZS5zcGVjaWZpYy13YXJuaW5nPC9jb2RlPi48L2xpPgorICAgICAg
ICA8L3VsPgorICAgICAgPGxpPiA8Y29kZT5uZXh0PC9jb2RlPiAtIEEgZnVuY3Rpb24gdGhhdCBj
YWxscyBpbnRvIHRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaGFuZGxlci48L2xpPgorICAgIDwv
dWw+CisgIAorICAgIEBwdWJsaWMKKyAgICBAc3RhdGljCisgICAgQG1ldGhvZCByZWdpc3Rlcldh
cm5IYW5kbGVyCisgICAgQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIGhh
bmRsZSB3YXJuaW5ncy4KKyAgICBAc2luY2UgMi4xLjAKKyAgKi8KKyAgX2VtYmVyTWV0YWxDb3Jl
LmRlZmF1bHQuRGVidWcucmVnaXN0ZXJXYXJuSGFuZGxlciA9IF9lbWJlckRlYnVnV2Fybi5yZWdp
c3RlckhhbmRsZXI7CisKKyAgLyoKKyAgICBXZSBhcmUgdHJhbnNpdGlvbmluZyBhd2F5IGZyb20g
YGVtYmVyLmpzYCB0byBgZW1iZXIuZGVidWcuanNgIHRvIG1ha2UKKyAgICBpdCBtdWNoIGNsZWFy
ZXIgdGhhdCBpdCBpcyBvbmx5IGZvciBsb2NhbCBkZXZlbG9wbWVudCBwdXJwb3Nlcy4KKyAgCisg
ICAgVGhpcyBmbGFnIHZhbHVlIGlzIGNoYW5nZWQgYnkgdGhlIHRvb2xpbmcgKGJ5IGEgc2ltcGxl
IHN0cmluZyByZXBsYWNlbWVudCkKKyAgICBzbyB0aGF0IGlmIGBlbWJlci5qc2AgKHdoaWNoIG11
c3QgYmUgb3V0cHV0IGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMpIGlzCisgICAgdXNlZCBh
IG5pY2UgaGVscGZ1bCB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIG91dC4KKyAgKi8K
KyAgdmFyIHJ1bm5pbmdOb25FbWJlckRlYnVnSlMgPSBmYWxzZTsKKyAgZXhwb3J0cy5ydW5uaW5n
Tm9uRW1iZXJEZWJ1Z0pTID0gcnVubmluZ05vbkVtYmVyRGVidWdKUzsKKyAgaWYgKHJ1bm5pbmdO
b25FbWJlckRlYnVnSlMpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ1BsZWFzZSB1c2Ug
YGVtYmVyLmRlYnVnLmpzYCBpbnN0ZWFkIG9mIGBlbWJlci5qc2AgZm9yIGRldmVsb3BtZW50IGFu
ZCBkZWJ1Z2dpbmcuJyk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1kZWJ1Zy93YXJuJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL2xvZ2dlcicsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJl
ci1kZWJ1Zy9oYW5kbGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxMb2dnZXIs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlckRlYnVnSGFuZGxlcnMpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIHZhciBfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgIGV4cG9ydHMucmVn
aXN0ZXJIYW5kbGVyID0gcmVnaXN0ZXJIYW5kbGVyOworICBleHBvcnRzLmRlZmF1bHQgPSB3YXJu
OworCisgIGZ1bmN0aW9uIHJlZ2lzdGVySGFuZGxlcihoYW5kbGVyKSB7CisgICAgX2VtYmVyRGVi
dWdIYW5kbGVycy5yZWdpc3RlckhhbmRsZXIoJ3dhcm4nLCBoYW5kbGVyKTsKKyAgfQorCisgIHJl
Z2lzdGVySGFuZGxlcihmdW5jdGlvbiBsb2dXYXJuaW5nKG1lc3NhZ2UsIG9wdGlvbnMpIHsKKyAg
ICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ1dBUk5JTkc6ICcgKyBtZXNzYWdlKTsK
KyAgICBpZiAoJ3RyYWNlJyBpbiBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0KSB7CisgICAgICBf
ZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0LnRyYWNlKCk7CisgICAgfQorICB9KTsKKworICB2YXIg
bWlzc2luZ09wdGlvbnNEZXByZWNhdGlvbiA9ICdXaGVuIGNhbGxpbmcgYEVtYmVyLndhcm5gIHlv
dSAnICsgJ211c3QgcHJvdmlkZSBhbiBgb3B0aW9uc2AgaGFzaCBhcyB0aGUgdGhpcmQgcGFyYW1l
dGVyLiAgJyArICdgb3B0aW9uc2Agc2hvdWxkIGluY2x1ZGUgYW4gYGlkYCBwcm9wZXJ0eS4nOwor
ICBleHBvcnRzLm1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24gPSBtaXNzaW5nT3B0aW9uc0RlcHJl
Y2F0aW9uOworICB2YXIgbWlzc2luZ09wdGlvbnNJZERlcHJlY2F0aW9uID0gJ1doZW4gY2FsbGlu
ZyBgRW1iZXIud2FybmAgeW91IG11c3QgcHJvdmlkZSBgaWRgIGluIG9wdGlvbnMuJzsKKworICBl
eHBvcnRzLm1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiA9IG1pc3NpbmdPcHRpb25zSWREZXBy
ZWNhdGlvbjsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1kZWJ1
ZworICAqLworCisgIC8qKgorICAgIERpc3BsYXkgYSB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVk
IG1lc3NhZ2UuCisgIAorICAgICogSW4gYSBwcm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1ldGhvZCBp
cyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0aW9uIChOT1ApLgorICAgIFVzZXMgb2YgdGhpcyBt
ZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBlbWJlci5wcm9kLmpz
IGJ1aWxkLgorICAKKyAgICBAbWV0aG9kIHdhcm4KKyAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2Fn
ZSBBIHdhcm5pbmcgdG8gZGlzcGxheS4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgQW4gb3B0
aW9uYWwgYm9vbGVhbi4gSWYgZmFsc3ksIHRoZSB3YXJuaW5nCisgICAgICB3aWxsIGJlIGRpc3Bs
YXllZC4KKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBjYW4gYmUg
dXNlZCB0byBwYXNzIGEgdW5pcXVlCisgICAgICBgaWRgIGZvciB0aGlzIHdhcm5pbmcuICBUaGUg
YGlkYCBjYW4gYmUgdXNlZCBieSBFbWJlciBkZWJ1Z2dpbmcgdG9vbHMKKyAgICAgIHRvIGNoYW5n
ZSB0aGUgYmVoYXZpb3IgKHJhaXNlLCBsb2csIG9yIHNpbGVuY2UpIGZvciB0aGF0IHNwZWNpZmlj
IHdhcm5pbmcuCisgICAgICBUaGUgYGlkYCBzaG91bGQgYmUgbmFtZXNwYWNlZCBieSBkb3RzLCBl
LmcuICJlbWJlci1kZWJ1Zy5mZWF0dXJlLWZsYWctd2l0aC1mZWF0dXJlcy1zdHJpcHBlZCIKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHdhcm4obWVzc2Fn
ZSwgdGVzdCwgb3B0aW9ucykgeworICAgIGlmICghb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0
YWxEZWJ1Zy5kZXByZWNhdGUobWlzc2luZ09wdGlvbnNEZXByZWNhdGlvbiwgZmFsc2UsIHsKKyAg
ICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy53YXJuLW9wdGlvbnMtbWlzc2luZycsCisgICAgICAgIHVu
dGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20vZGVwcmVjYXRp
b25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAgICAgfSk7Cisg
ICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuaWQpIHsKKyAgICAgIF9lbWJlck1l
dGFsRGVidWcuZGVwcmVjYXRlKG1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiwgZmFsc2UsIHsK
KyAgICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy53YXJuLWlkLW1pc3NpbmcnLAorICAgICAgICB1bnRp
bDogJzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9u
cy92Mi54LyN0b2NfZW1iZXItZGVidWctZnVuY3Rpb24tb3B0aW9ucycKKyAgICAgIH0pOworICAg
IH0KKworICAgIF9lbWJlckRlYnVnSGFuZGxlcnMuaW52b2tlLmFwcGx5KHVuZGVmaW5lZCwgWyd3
YXJuJ10uY29uY2F0KF9zbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2NvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vbmF0aXZlX2Fy
cmF5JywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc3RyaW5n
JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hbWVzcGFjZScsICdlbWJlci1ydW50aW1lL3N5c3Rl
bS9vYmplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUnVu
dGltZVN5c3RlbU5hdGl2ZV9hcnJheSwgX2VtYmVyUnVudGltZVV0aWxzLCBfZW1iZXJSdW50aW1l
U3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNwYWNlLCBfZW1iZXJSdW50aW1l
U3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWV4dGVuc2lvbi1zdXBwb3J0CisgICovCisKKyAgLyoqCisg
ICAgVGhlIGBDb250YWluZXJEZWJ1Z0FkYXB0ZXJgIGhlbHBzIHRoZSBjb250YWluZXIgYW5kIHJl
c29sdmVyIGludGVyZmFjZQorICAgIHdpdGggdG9vbHMgdGhhdCBkZWJ1ZyBFbWJlciBzdWNoIGFz
IHRoZQorICAgIFtFbWJlciBFeHRlbnNpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL2Vt
YmVyLWV4dGVuc2lvbikKKyAgICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94LgorICAKKyAgICBUaGlz
IGNsYXNzIGNhbiBiZSBleHRlbmRlZCBieSBhIGN1c3RvbSByZXNvbHZlciBpbXBsZW1lbnRlcgor
ICAgIHRvIG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMgd2l0aCBsaWJyYXJ5LXNwZWNpZmlj
IGNvZGUuCisgIAorICAgIFRoZSBtZXRob2RzIGxpa2VseSB0byBiZSBvdmVycmlkZGVuIGFyZToK
KyAgCisgICAgKiBgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGVgCisgICAgKiBgY2F0YWxvZ0VudHJp
ZXNCeVR5cGVgCisgIAorICAgIFRoZSBhZGFwdGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3RlcmVk
CisgICAgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgY29udGFpbmVyIGFzIGBjb250YWluZXItZGVidWct
YWRhcHRlcjptYWluYC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICJjb250YWluZXJEZWJ1
Z0FkYXB0ZXIiLAorICAKKyAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7
CisgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdjb250YWluZXItZGVidWctYWRhcHRlcjpt
YWluJywgcmVxdWlyZSgnYXBwL2NvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyJykpOworICAgICAgfQor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgQ29udGFpbmVyRGVidWdBZGFwdGVyCisg
ICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBzaW5j
ZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVu
dGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgLyoqCisgICAgICBUaGUgcmVz
b2x2ZXIgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICBiZWluZyBkZWJ1Z2dlZC4g
VGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGluamVjdGVkCisgICAgICBvbiBjcmVhdGlvbi4KKyAgICAg
ICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMK
KyAgICAqLworICAgIHJlc29sdmVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRy
dWUgaWYgaXQgaXMgcG9zc2libGUgdG8gY2F0YWxvZyBhIGxpc3Qgb2YgYXZhaWxhYmxlCisgICAg
ICBjbGFzc2VzIGluIHRoZSByZXNvbHZlciBmb3IgYSBnaXZlbiB0eXBlLgorICAgICAgIEBtZXRo
b2QgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRo
ZSB0eXBlLiBlLmcuICJtb2RlbCIsICJjb250cm9sbGVyIiwgInJvdXRlIi4KKyAgICAgIEByZXR1
cm4ge2Jvb2xlYW59IHdoZXRoZXIgYSBsaXN0IGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlLgor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGU6IGZ1bmN0
aW9uICh0eXBlKSB7CisgICAgICBpZiAodHlwZSA9PT0gJ21vZGVsJyB8fCB0eXBlID09PSAndGVt
cGxhdGUnKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgYXZhaWxhYmxlIGNs
YXNzZXMgYSBnaXZlbiB0eXBlLgorICAgICAgIEBtZXRob2QgY2F0YWxvZ0VudHJpZXNCeVR5cGUK
KyAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSB0eXBlLiBlLmcuICJtb2RlbCIsICJjb250
cm9sbGVyIiwgInJvdXRlIi4KKyAgICAgIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJp
bmdzLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2F0YWxvZ0VudHJpZXNCeVR5cGU6IGZ1
bmN0aW9uICh0eXBlKSB7CisgICAgICB2YXIgbmFtZXNwYWNlcyA9IF9lbWJlclJ1bnRpbWVTeXN0
ZW1OYXRpdmVfYXJyYXkuQShfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNwYWNlLmRlZmF1bHQuTkFN
RVNQQUNFUyk7CisgICAgICB2YXIgdHlwZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2Fy
cmF5LkEoKTsKKyAgICAgIHZhciB0eXBlU3VmZml4UmVnZXggPSBuZXcgUmVnRXhwKF9lbWJlclJ1
bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkodHlwZSkgKyAnJCcpOworCisgICAgICBuYW1lc3Bh
Y2VzLmZvckVhY2goZnVuY3Rpb24gKG5hbWVzcGFjZSkgeworICAgICAgICBpZiAobmFtZXNwYWNl
ICE9PSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdCkgeworICAgICAgICAgIGZvciAodmFyIGtleSBp
biBuYW1lc3BhY2UpIHsKKyAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmhhc093blByb3BlcnR5
KGtleSkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAodHlwZVN1ZmZpeFJlZ2V4LnRlc3Qoa2V5KSkgeworICAgICAgICAgICAgICB2YXIg
a2xhc3MgPSBuYW1lc3BhY2Vba2V5XTsKKyAgICAgICAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVV
dGlscy50eXBlT2Yoa2xhc3MpID09PSAnY2xhc3MnKSB7CisgICAgICAgICAgICAgICAgdHlwZXMu
cHVzaChfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShrZXkucmVwbGFjZSh0eXBl
U3VmZml4UmVnZXgsICcnKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0eXBlczsKKyAgICB9
CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2RhdGFfYWRhcHRl
cicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwv
cnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc3RyaW5nJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL25hbWVzcGFjZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXIt
cnVudGltZS9zeXN0ZW0vbmF0aXZlX2FycmF5JywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9h
cHBsaWNhdGlvbicsICdjb250YWluZXIvb3duZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvYXJy
YXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJN
ZXRhbFJ1bl9sb29wLCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lz
dGVtTmFtZXNwYWNlLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1lU3lz
dGVtTmF0aXZlX2FycmF5LCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUFwcGxpY2F0aW9uLCBfY29u
dGFpbmVyT3duZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheSkgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1leHRlbnNpb24t
c3VwcG9ydAorICAqLworCisgIC8qKgorICAgIFRoZSBgRGF0YUFkYXB0ZXJgIGhlbHBzIGEgZGF0
YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5CisgICAgaW50ZXJmYWNlIHdpdGggdG9vbHMgdGhhdCBkZWJ1
ZyBFbWJlciBzdWNoCisgICAgYXMgdGhlIFtFbWJlciBFeHRlbnNpb25dKGh0dHBzOi8vZ2l0aHVi
LmNvbS90aWxkZWlvL2VtYmVyLWV4dGVuc2lvbikKKyAgICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94
LgorICAKKyAgICBUaGlzIGNsYXNzIHdpbGwgYmUgZXh0ZW5kZWQgYnkgYSBwZXJzaXN0ZW5jZSBs
aWJyYXJ5CisgICAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzIHdpdGgK
KyAgICBsaWJyYXJ5LXNwZWNpZmljIGNvZGUuCisgIAorICAgIFRoZSBtZXRob2RzIGxpa2VseSB0
byBiZSBvdmVycmlkZGVuIGFyZToKKyAgCisgICAgKiBgZ2V0RmlsdGVyc2AKKyAgICAqIGBkZXRl
Y3RgCisgICAgKiBgY29sdW1uc0ZvclR5cGVgCisgICAgKiBgZ2V0UmVjb3Jkc2AKKyAgICAqIGBn
ZXRSZWNvcmRDb2x1bW5WYWx1ZXNgCisgICAgKiBgZ2V0UmVjb3JkS2V5d29yZHNgCisgICAgKiBg
Z2V0UmVjb3JkRmlsdGVyVmFsdWVzYAorICAgICogYGdldFJlY29yZENvbG9yYAorICAgICogYG9i
c2VydmVSZWNvcmRgCisgIAorICAgIFRoZSBhZGFwdGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3Rl
cmVkCisgICAgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgY29udGFpbmVyIGFzIGBkYXRhQWRhcHRlcjpt
YWluYC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcGxp
Y2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICJkYXRhLWFkYXB0ZXIiLAorICAKKyAg
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7CisgICAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCdkYXRhLWFkYXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVyKTsKKyAgICAg
IH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQGNsYXNzIERhdGFBZGFwdGVyCisgICAgQG5h
bWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyT2JqZWN0CisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQu
ZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgdGhpcy5yZWxlYXNlTWV0aG9kcyA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRo
ZSBjb250YWluZXItZGVidWctYWRhcHRlciB3aGljaCBpcyB1c2VkCisgICAgICB0byBsaXN0IGFs
bCBtb2RlbHMuCisgICAgICAgQHByb3BlcnR5IGNvbnRhaW5lckRlYnVnQWRhcHRlcgorICAgICAg
QGRlZmF1bHQgdW5kZWZpbmVkCisgICAgICBAc2luY2UgMS41LjAKKyAgICAgIEBwdWJsaWMKKyAg
ICAqKi8KKyAgICBjb250YWluZXJEZWJ1Z0FkYXB0ZXI6IHVuZGVmaW5lZCwKKworICAgIC8qKgor
ICAgICAgVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHRvIHNlbmQKKyAgICAgIGFzIGNvbHVtbnMu
IChFbm91Z2ggdG8gbWFrZSB0aGUgcmVjb3JkCisgICAgICBpZGVudGlmaWFibGUpLgorICAgICAg
IEBwcml2YXRlCisgICAgICBAcHJvcGVydHkgYXR0cmlidXRlTGltaXQKKyAgICAgIEBkZWZhdWx0
IDMKKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICovCisgICAgYXR0cmlidXRlTGltaXQ6IDMsCisK
KyAgICAvKioKKyAgICAgICBFbWJlciBEYXRhID4gdjEuMC4wLWJldGEuMTgKKyAgICAgICByZXF1
aXJlcyBzdHJpbmcgbW9kZWwgbmFtZXMgdG8gYmUgcGFzc2VkCisgICAgICAgYXJvdW5kIGluc3Rl
YWQgb2YgdGhlIGFjdHVhbCBmYWN0b3JpZXMuCisgICAgICAgIFRoaXMgaXMgYSBzdGFtcCBmb3Ig
dGhlIEVtYmVyIEluc3BlY3RvcgorICAgICAgIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUg
dmVyc2lvbnMKKyAgICAgICB0byBiZSBhYmxlIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgdG9v
LgorICAgICAgICBAcHVibGljCisgICAgICAgQHByb3BlcnR5IGFjY2VwdHNNb2RlbE5hbWUKKyAg
ICAgKi8KKyAgICBhY2NlcHRzTW9kZWxOYW1lOiB0cnVlLAorCisgICAgLyoqCisgICAgICBTdG9y
ZXMgYWxsIG1ldGhvZHMgdGhhdCBjbGVhciBvYnNlcnZlcnMuCisgICAgICBUaGVzZSBtZXRob2Rz
IHdpbGwgYmUgY2FsbGVkIG9uIGRlc3RydWN0aW9uLgorICAgICAgIEBwcml2YXRlCisgICAgICBA
cHJvcGVydHkgcmVsZWFzZU1ldGhvZHMKKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICovCisgICAg
cmVsZWFzZU1ldGhvZHM6IF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSgpLAorCisg
ICAgLyoqCisgICAgICBTcGVjaWZpZXMgaG93IHJlY29yZHMgY2FuIGJlIGZpbHRlcmVkLgorICAg
ICAgUmVjb3JkcyByZXR1cm5lZCB3aWxsIG5lZWQgdG8gaGF2ZSBhIGBmaWx0ZXJWYWx1ZXNgCisg
ICAgICBwcm9wZXJ0eSB3aXRoIGEga2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBh
cnJheS4KKyAgICAgICBAcHVibGljCisgICAgICBAbWV0aG9kIGdldEZpbHRlcnMKKyAgICAgIEBy
ZXR1cm4ge0FycmF5fSBMaXN0IG9mIG9iamVjdHMgZGVmaW5pbmcgZmlsdGVycy4KKyAgICAgICBU
aGUgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5hbWVgIGFuZCBgZGVzY2AgcHJvcGVydHkuCisgICAg
Ki8KKyAgICBnZXRGaWx0ZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUnVu
dGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgRmV0
Y2ggdGhlIG1vZGVsIHR5cGVzIGFuZCBvYnNlcnZlIHRoZW0gZm9yIGNoYW5nZXMuCisgICAgICAg
QHB1YmxpYworICAgICAgQG1ldGhvZCB3YXRjaE1vZGVsVHlwZXMKKyAgICAgICBAcGFyYW0ge0Z1
bmN0aW9ufSB0eXBlc0FkZGVkIENhbGxiYWNrIHRvIGNhbGwgdG8gYWRkIHR5cGVzLgorICAgICAg
VGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBwZWQgdHlwZXMgKHJldHVy
bmVkIGZyb20gYHdyYXBNb2RlbFR5cGVgKS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBl
c1VwZGF0ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgdHlwZSBoYXMgY2hhbmdlZC4KKyAgICAg
IFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHR5cGVzLgorICAg
ICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBNZXRob2QgdG8gY2FsbCB0byByZW1vdmUgYWxsIG9ic2Vy
dmVycworICAgICovCisgICAgd2F0Y2hNb2RlbFR5cGVzOiBmdW5jdGlvbiAodHlwZXNBZGRlZCwg
dHlwZXNVcGRhdGVkKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2YXIgbW9k
ZWxUeXBlcyA9IHRoaXMuZ2V0TW9kZWxUeXBlcygpOworICAgICAgdmFyIHJlbGVhc2VNZXRob2Rz
ID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgICB2YXIgdHlwZXNU
b1NlbmQ7CisKKyAgICAgIHR5cGVzVG9TZW5kID0gbW9kZWxUeXBlcy5tYXAoZnVuY3Rpb24gKHR5
cGUpIHsKKyAgICAgICAgdmFyIGtsYXNzID0gdHlwZS5rbGFzczsKKyAgICAgICAgdmFyIHdyYXBw
ZWQgPSBfdGhpcy53cmFwTW9kZWxUeXBlKGtsYXNzLCB0eXBlLm5hbWUpOworICAgICAgICByZWxl
YXNlTWV0aG9kcy5wdXNoKF90aGlzLm9ic2VydmVNb2RlbFR5cGUodHlwZS5uYW1lLCB0eXBlc1Vw
ZGF0ZWQpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQ7CisgICAgICB9KTsKKworICAgICAgdHlw
ZXNBZGRlZCh0eXBlc1RvU2VuZCk7CisKKyAgICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24gKCkg
eworICAgICAgICByZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeworICAgICAg
ICAgIHJldHVybiBmbigpOworICAgICAgICB9KTsKKyAgICAgICAgX3RoaXMucmVsZWFzZU1ldGhv
ZHMucmVtb3ZlT2JqZWN0KHJlbGVhc2UpOworICAgICAgfTsKKyAgICAgIHRoaXMucmVsZWFzZU1l
dGhvZHMucHVzaE9iamVjdChyZWxlYXNlKTsKKyAgICAgIHJldHVybiByZWxlYXNlOworICAgIH0s
CisKKyAgICBfbmFtZVRvQ2xhc3M6IGZ1bmN0aW9uICh0eXBlKSB7CisgICAgICBpZiAodHlwZW9m
IHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHR5cGUgPSBfY29udGFpbmVyT3duZXIuZ2V0
T3duZXIodGhpcykuX2xvb2t1cEZhY3RvcnkoJ21vZGVsOicgKyB0eXBlKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiB0eXBlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEZldGNoIHRoZSByZWNv
cmRzIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgb2JzZXJ2ZSB0aGVtIGZvciBjaGFuZ2VzLgorICAgICAg
IEBwdWJsaWMKKyAgICAgIEBtZXRob2Qgd2F0Y2hSZWNvcmRzCisgICAgICAgQHBhcmFtIHtTdHJp
bmd9IG1vZGVsTmFtZSBUaGUgbW9kZWwgbmFtZS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBy
ZWNvcmRzQWRkZWQgQ2FsbGJhY2sgdG8gY2FsbCB0byBhZGQgcmVjb3Jkcy4KKyAgICAgIFRha2Vz
IGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCisgICAgICBU
aGUgb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAg
Y29sdW1uVmFsdWVzOiB7T2JqZWN0fSBUaGUga2V5IGFuZCB2YWx1ZSBvZiBhIHRhYmxlIGNlbGwu
CisgICAgICAgIG9iamVjdDoge09iamVjdH0gVGhlIGFjdHVhbCByZWNvcmQgb2JqZWN0LgorICAg
ICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZHNVcGRhdGVkIENhbGxiYWNrIHRvIGNhbGwgd2hl
biBhIHJlY29yZCBoYXMgY2hhbmdlZC4KKyAgICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMg
Y29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCisgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVj
b3Jkc1JlbW92ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhhcyByZW1vdmVkLgor
ICAgICAgVGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICBpbmRleDogVGhl
IGFycmF5IGluZGV4IHdoZXJlIHRoZSByZWNvcmRzIHdlcmUgcmVtb3ZlZC4KKyAgICAgICAgY291
bnQ6IFRoZSBudW1iZXIgb2YgcmVjb3JkcyByZW1vdmVkLgorICAgICAgIEByZXR1cm4ge0Z1bmN0
aW9ufSBNZXRob2QgdG8gY2FsbCB0byByZW1vdmUgYWxsIG9ic2VydmVycy4KKyAgICAqLworICAg
IHdhdGNoUmVjb3JkczogZnVuY3Rpb24gKG1vZGVsTmFtZSwgcmVjb3Jkc0FkZGVkLCByZWNvcmRz
VXBkYXRlZCwgcmVjb3Jkc1JlbW92ZWQpIHsKKyAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisg
ICAgICB2YXIgcmVsZWFzZU1ldGhvZHMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKyAgICAgIHZhciBrbGFzcyA9IHRoaXMuX25hbWVUb0NsYXNzKG1vZGVsTmFtZSk7Cisg
ICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3JkcyhrbGFzcywgbW9kZWxOYW1lKTsKKyAg
ICAgIHZhciByZWxlYXNlOworCisgICAgICB2YXIgcmVjb3JkVXBkYXRlZCA9IGZ1bmN0aW9uICh1
cGRhdGVkUmVjb3JkKSB7CisgICAgICAgIHJlY29yZHNVcGRhdGVkKFt1cGRhdGVkUmVjb3JkXSk7
CisgICAgICB9OworCisgICAgICB2YXIgcmVjb3Jkc1RvU2VuZCA9IHJlY29yZHMubWFwKGZ1bmN0
aW9uIChyZWNvcmQpIHsKKyAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChfdGhpczIub2JzZXJ2
ZVJlY29yZChyZWNvcmQsIHJlY29yZFVwZGF0ZWQpKTsKKyAgICAgICAgcmV0dXJuIF90aGlzMi53
cmFwUmVjb3JkKHJlY29yZCk7CisgICAgICB9KTsKKworICAgICAgdmFyIGNvbnRlbnREaWRDaGFu
Z2UgPSBmdW5jdGlvbiAoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Cisg
ICAgICAgIGZvciAodmFyIGkgPSBpZHg7IGkgPCBpZHggKyBhZGRlZENvdW50OyBpKyspIHsKKyAg
ICAgICAgICB2YXIgcmVjb3JkID0gX2VtYmVyUnVudGltZU1peGluc0FycmF5Lm9iamVjdEF0KGFy
cmF5LCBpKTsKKyAgICAgICAgICB2YXIgd3JhcHBlZCA9IF90aGlzMi53cmFwUmVjb3JkKHJlY29y
ZCk7CisgICAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChfdGhpczIub2JzZXJ2ZVJlY29yZChy
ZWNvcmQsIHJlY29yZFVwZGF0ZWQpKTsKKyAgICAgICAgICByZWNvcmRzQWRkZWQoW3dyYXBwZWRd
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdmVkQ291bnQpIHsKKyAgICAgICAgICBy
ZWNvcmRzUmVtb3ZlZChpZHgsIHJlbW92ZWRDb3VudCk7CisgICAgICAgIH0KKyAgICAgIH07CisK
KyAgICAgIHZhciBvYnNlcnZlciA9IHsgZGlkQ2hhbmdlOiBjb250ZW50RGlkQ2hhbmdlLCB3aWxs
Q2hhbmdlOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0g
fTsKKyAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRBcnJheU9ic2VydmVyKHJlY29y
ZHMsIHRoaXMsIG9ic2VydmVyKTsKKworICAgICAgcmVsZWFzZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsKKyAgICAgICAgICBm
bigpOworICAgICAgICB9KTsKKyAgICAgICAgX2VtYmVyUnVudGltZU1peGluc0FycmF5LnJlbW92
ZUFycmF5T2JzZXJ2ZXIocmVjb3JkcywgX3RoaXMyLCBvYnNlcnZlcik7CisgICAgICAgIF90aGlz
Mi5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFzZSk7CisgICAgICB9OworCisgICAg
ICByZWNvcmRzQWRkZWQocmVjb3Jkc1RvU2VuZCk7CisKKyAgICAgIHRoaXMucmVsZWFzZU1ldGhv
ZHMucHVzaE9iamVjdChyZWxlYXNlKTsKKyAgICAgIHJldHVybiByZWxlYXNlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIENsZWFyIGFsbCBvYnNlcnZlcnMgYmVmb3JlIGRlc3RydWN0aW9uCisg
ICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCB3aWxsRGVzdHJveQorICAgICovCisgICAgd2ls
bERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgICAgICB0aGlzLnJlbGVhc2VNZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKGZu
KSB7CisgICAgICAgIGZuKCk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBE
ZXRlY3Qgd2hldGhlciBhIGNsYXNzIGlzIGEgbW9kZWwuCisgICAgICAgVGVzdCB0aGF0IGFnYWlu
c3QgdGhlIG1vZGVsIGNsYXNzCisgICAgICBvZiB5b3VyIHBlcnNpc3RlbmNlIGxpYnJhcnkuCisg
ICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZGV0ZWN0CisgICAgICBAcGFyYW0ge0NsYXNz
fSBrbGFzcyBUaGUgY2xhc3MgdG8gdGVzdC4KKyAgICAgIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVy
IHRoZSBjbGFzcyBpcyBhIG1vZGVsIGNsYXNzIG9yIG5vdC4KKyAgICAqLworICAgIGRldGVjdDog
ZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIC8q
KgorICAgICAgR2V0IHRoZSBjb2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5cGUuCisgICAgICAg
QHByaXZhdGUKKyAgICAgIEBtZXRob2QgY29sdW1uc0ZvclR5cGUKKyAgICAgIEBwYXJhbSB7Q2xh
c3N9IHR5cGUgVGhlIG1vZGVsIHR5cGUuCisgICAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkg
b2YgY29sdW1ucyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgICAgICBuYW1lOiB7U3RyaW5n
fSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uLgorICAgICAgIGRlc2M6IHtTdHJpbmd9IEh1bWFuaXpl
ZCBkZXNjcmlwdGlvbiAod2hhdCB3b3VsZCBzaG93IGluIGEgdGFibGUgY29sdW1uIG5hbWUpLgor
ICAgICovCisgICAgY29sdW1uc0ZvclR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgfSwKKworICAgIC8q
KgorICAgICAgQWRkcyBvYnNlcnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNzLgorICAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIG9ic2VydmVNb2RlbFR5cGUKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtb2RlbE5hbWUgVGhlIG1vZGVsIHR5cGUgbmFtZS4KKyAgICAgIEBwYXJhbSB7RnVuY3Rp
b259IHR5cGVzVXBkYXRlZCBDYWxsZWQgd2hlbiBhIHR5cGUgaXMgbW9kaWZpZWQuCisgICAgICBA
cmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcmVtb3ZlIG9ic2VydmVy
cy4KKyAgICAqLworCisgICAgb2JzZXJ2ZU1vZGVsVHlwZTogZnVuY3Rpb24gKG1vZGVsTmFtZSwg
dHlwZXNVcGRhdGVkKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgdmFyIGts
YXNzID0gdGhpcy5fbmFtZVRvQ2xhc3MobW9kZWxOYW1lKTsKKyAgICAgIHZhciByZWNvcmRzID0g
dGhpcy5nZXRSZWNvcmRzKGtsYXNzLCBtb2RlbE5hbWUpOworCisgICAgICB2YXIgb25DaGFuZ2Ug
PSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHR5cGVzVXBkYXRlZChbX3RoaXMzLndyYXBNb2RlbFR5
cGUoa2xhc3MsIG1vZGVsTmFtZSldKTsKKyAgICAgIH07CisgICAgICB2YXIgb2JzZXJ2ZXIgPSB7
CisgICAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgIF9lbWJlck1ldGFs
UnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCB0aGlzLCBvbkNoYW5nZSk7
CisgICAgICAgIH0sCisgICAgICAgIHdpbGxDaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAg
ICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgX2VtYmVyUnVudGlt
ZU1peGluc0FycmF5LmFkZEFycmF5T2JzZXJ2ZXIocmVjb3JkcywgdGhpcywgb2JzZXJ2ZXIpOwor
CisgICAgICB2YXIgcmVsZWFzZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgX2VtYmVyUnVudGlt
ZU1peGluc0FycmF5LnJlbW92ZUFycmF5T2JzZXJ2ZXIocmVjb3JkcywgX3RoaXMzLCBvYnNlcnZl
cik7CisgICAgICB9OworCisgICAgICByZXR1cm4gcmVsZWFzZTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBXcmFwcyBhIGdpdmVuIG1vZGVsIHR5cGUgYW5kIG9ic2VydmVzIGNoYW5nZXMgdG8g
aXQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgd3JhcE1vZGVsVHlwZQorICAgICAg
QHBhcmFtIHtDbGFzc30ga2xhc3MgQSBtb2RlbCBjbGFzcy4KKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBtb2RlbE5hbWUgTmFtZSBvZiB0aGUgY2xhc3MuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IENv
bnRhaW5zIHRoZSB3cmFwcGVkIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiB0byByZW1vdmUgb2JzZXJ2
ZXJzCisgICAgICBGb3JtYXQ6CisgICAgICAgIHR5cGU6IHtPYmplY3R9IFRoZSB3cmFwcGVkIHR5
cGUuCisgICAgICAgICAgVGhlIHdyYXBwZWQgdHlwZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6
CisgICAgICAgICAgICBuYW1lOiB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KKyAgICAg
ICAgICAgIGNvdW50OiB7SW50ZWdlcn0gVGhlIG51bWJlciBvZiByZWNvcmRzIGF2YWlsYWJsZS4K
KyAgICAgICAgICAgIGNvbHVtbnM6IHtDb2x1bW5zfSBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGRl
c2NyaWJlIHRoZSByZWNvcmQuCisgICAgICAgICAgICBvYmplY3Q6IHtDbGFzc30gVGhlIGFjdHVh
bCBNb2RlbCB0eXBlIGNsYXNzLgorICAgICAgICByZWxlYXNlOiB7RnVuY3Rpb259IFRoZSBmdW5j
dGlvbiB0byByZW1vdmUgb2JzZXJ2ZXJzLgorICAgICovCisgICAgd3JhcE1vZGVsVHlwZTogZnVu
Y3Rpb24gKGtsYXNzLCBuYW1lKSB7CisgICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jk
cyhrbGFzcywgbmFtZSk7CisgICAgICB2YXIgdHlwZVRvU2VuZDsKKworICAgICAgdHlwZVRvU2Vu
ZCA9IHsKKyAgICAgICAgbmFtZTogbmFtZSwKKyAgICAgICAgY291bnQ6IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldChyZWNvcmRzLCAnbGVuZ3RoJyksCisgICAgICAgIGNvbHVtbnM6IHRoaXMu
Y29sdW1uc0ZvclR5cGUoa2xhc3MpLAorICAgICAgICBvYmplY3Q6IGtsYXNzCisgICAgICB9Owor
CisgICAgICByZXR1cm4gdHlwZVRvU2VuZDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBGZXRj
aGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcworICAgICAgQHJldHVybiB7QXJyYXl9IEFy
cmF5IG9mIG1vZGVsIHR5cGVzLgorICAgICovCisgICAgZ2V0TW9kZWxUeXBlczogZnVuY3Rpb24g
KCkgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciBjb250YWluZXJEZWJ1
Z0FkYXB0ZXIgPSB0aGlzLmdldCgnY29udGFpbmVyRGVidWdBZGFwdGVyJyk7CisgICAgICB2YXIg
dHlwZXM7CisKKyAgICAgIGlmIChjb250YWluZXJEZWJ1Z0FkYXB0ZXIuY2FuQ2F0YWxvZ0VudHJp
ZXNCeVR5cGUoJ21vZGVsJykpIHsKKyAgICAgICAgdHlwZXMgPSBjb250YWluZXJEZWJ1Z0FkYXB0
ZXIuY2F0YWxvZ0VudHJpZXNCeVR5cGUoJ21vZGVsJyk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICB0eXBlcyA9IHRoaXMuX2dldE9iamVjdHNPbk5hbWVzcGFjZXMoKTsKKyAgICAgIH0KKworICAg
ICAgLy8gTmV3IGFkYXB0ZXJzIHJldHVybiBzdHJpbmdzIGluc3RlYWQgb2YgY2xhc3Nlcy4KKyAg
ICAgIHR5cGVzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHR5cGVzKS5tYXAo
ZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBrbGFzczogX3Ro
aXM0Ll9uYW1lVG9DbGFzcyhuYW1lKSwKKyAgICAgICAgICBuYW1lOiBuYW1lCisgICAgICAgIH07
CisgICAgICB9KTsKKyAgICAgIHR5cGVzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJh
eS5BKHR5cGVzKS5maWx0ZXIoZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIF90aGlz
NC5kZXRlY3QodHlwZS5rbGFzcyk7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSh0eXBlcyk7CisgICAgfSwKKworICAgIC8qKgorICAg
ICAgTG9vcHMgb3ZlciBhbGwgbmFtZXNwYWNlcyBhbmQgYWxsIG9iamVjdHMKKyAgICAgIGF0dGFj
aGVkIHRvIHRoZW0uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgX2dldE9iamVjdHNP
bk5hbWVzcGFjZXMKKyAgICAgIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiBtb2RlbCB0eXBlIHN0
cmluZ3MuCisgICAgKi8KKyAgICBfZ2V0T2JqZWN0c09uTmFtZXNwYWNlczogZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CisKKyAgICAgIHZhciBuYW1lc3BhY2VzID0gX2Vt
YmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1lc3Bh
Y2UuZGVmYXVsdC5OQU1FU1BBQ0VTKTsKKyAgICAgIHZhciB0eXBlcyA9IF9lbWJlclJ1bnRpbWVT
eXN0ZW1OYXRpdmVfYXJyYXkuQSgpOworCisgICAgICBuYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rp
b24gKG5hbWVzcGFjZSkgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNwYWNlKSB7Cisg
ICAgICAgICAgaWYgKCFuYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIHdp
bGwgZmlsdGVyIGFnYWluIGluIGBnZXRNb2RlbFR5cGVzYCwKKyAgICAgICAgICAvLyB3ZSBzaG91
bGQgbm90IGNhbGwgYGxvb2t1cEZhY3RvcnlgIG9uIG5vbi1tb2RlbHMKKyAgICAgICAgICAvLyAo
ZXNwZWNpYWxseSB3aGVuIGBFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlNgIGlzIGB0cnVl
YCkKKyAgICAgICAgICBpZiAoIV90aGlzNS5kZXRlY3QobmFtZXNwYWNlW2tleV0pKSB7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG5hbWUgPSBfZW1i
ZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShrZXkpOworICAgICAgICAgIGlmICghKG5h
bWVzcGFjZSBpbnN0YW5jZW9mIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb24uZGVm
YXVsdCkgJiYgbmFtZXNwYWNlLnRvU3RyaW5nKCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1l
c3BhY2UgKyAnLycgKyBuYW1lOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlcy5wdXNoKG5h
bWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0eXBlczsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBGZXRjaGVzIGFsbCBsb2FkZWQgcmVjb3JkcyBmb3IgYSBnaXZlbiB0
eXBlLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGdldFJlY29yZHMKKyAgICAgIEBy
ZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiByZWNvcmRzLgorICAgICAgIFRoaXMgYXJyYXkgd2ls
bCBiZSBvYnNlcnZlZCBmb3IgY2hhbmdlcywKKyAgICAgICBzbyBpdCBzaG91bGQgdXBkYXRlIHdo
ZW4gbmV3IHJlY29yZHMgYXJlIGFkZGVkL3JlbW92ZWQuCisgICAgKi8KKyAgICBnZXRSZWNvcmRz
OiBmdW5jdGlvbiAodHlwZSkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRp
dmVfYXJyYXkuQSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFdyYXBzIGEgcmVjb3JkIGFu
ZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhv
ZCB3cmFwUmVjb3JkCisgICAgICBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5z
dGFuY2UuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSB3cmFwcGVkIHJlY29yZC4gRm9ybWF0
OgorICAgICAgY29sdW1uVmFsdWVzOiB7QXJyYXl9CisgICAgICBzZWFyY2hLZXl3b3Jkczoge0Fy
cmF5fQorICAgICovCisgICAgd3JhcFJlY29yZDogZnVuY3Rpb24gKHJlY29yZCkgeworICAgICAg
dmFyIHJlY29yZFRvU2VuZCA9IHsgb2JqZWN0OiByZWNvcmQgfTsKKworICAgICAgcmVjb3JkVG9T
ZW5kLmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKHJlY29yZCk7Cisg
ICAgICByZWNvcmRUb1NlbmQuc2VhcmNoS2V5d29yZHMgPSB0aGlzLmdldFJlY29yZEtleXdvcmRz
KHJlY29yZCk7CisgICAgICByZWNvcmRUb1NlbmQuZmlsdGVyVmFsdWVzID0gdGhpcy5nZXRSZWNv
cmRGaWx0ZXJWYWx1ZXMocmVjb3JkKTsKKyAgICAgIHJlY29yZFRvU2VuZC5jb2xvciA9IHRoaXMu
Z2V0UmVjb3JkQ29sb3IocmVjb3JkKTsKKworICAgICAgcmV0dXJuIHJlY29yZFRvU2VuZDsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBHZXRzIHRoZSB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uLgor
ICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGdldFJlY29yZENvbHVtblZhbHVlcworICAg
ICAgQHJldHVybiB7T2JqZWN0fSBLZXlzIHNob3VsZCBtYXRjaCBjb2x1bW4gbmFtZXMgZGVmaW5l
ZAorICAgICAgYnkgdGhlIG1vZGVsIHR5cGUuCisgICAgKi8KKyAgICBnZXRSZWNvcmRDb2x1bW5W
YWx1ZXM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBSZXR1cm5zIGtleXdvcmRzIHRvIG1hdGNoIHdoZW4gc2VhcmNoaW5nIHJl
Y29yZHMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZ2V0UmVjb3JkS2V5d29yZHMK
KyAgICAgIEByZXR1cm4ge0FycmF5fSBSZWxldmFudCBrZXl3b3JkcyBmb3Igc2VhcmNoLgorICAg
ICovCisgICAgZ2V0UmVjb3JkS2V5d29yZHM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJl
dHVybiBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgZmlsdGVycyBkZWZpbmVkIGJ5IGBnZXRG
aWx0ZXJzYC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBnZXRSZWNvcmRGaWx0ZXJW
YWx1ZXMKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZS4K
KyAgICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGZpbHRlciB2YWx1ZXMuCisgICAgKi8KKyAgICBn
ZXRSZWNvcmRGaWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJldHVybiB7
fTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBFYWNoIHJlY29yZCBjYW4gaGF2ZSBhIGNvbG9y
IHRoYXQgcmVwcmVzZW50cyBpdHMgc3RhdGUuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgZ2V0UmVjb3JkQ29sb3IKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29y
ZCBpbnN0YW5jZQorICAgICAgQHJldHVybiB7U3RyaW5nfSBUaGUgcmVjb3JkcyBjb2xvci4KKyAg
ICAgICAgUG9zc2libGUgb3B0aW9uczogYmxhY2ssIHJlZCwgYmx1ZSwgZ3JlZW4uCisgICAgKi8K
KyAgICBnZXRSZWNvcmRDb2xvcjogZnVuY3Rpb24gKHJlY29yZCkgeworICAgICAgcmV0dXJuIG51
bGw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50IHByb3Bl
cnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFwcGVkIHJlY29yZAorICAgICAgd2hlbiBhIGNoYW5n
ZSBvY2N1cnMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb2JzZXJ2ZXJSZWNvcmQK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZS4KKyAgICAg
IEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZFVwZGF0ZWQgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hl
biBhIHJlY29yZCBpcyB1cGRhdGVkLgorICAgICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5j
dGlvbiB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzLgorICAgICovCisgICAgb2JzZXJ2
ZVJlY29yZDogZnVuY3Rpb24gKHJlY29yZCwgcmVjb3JkVXBkYXRlZCkgeworICAgICAgcmV0dXJu
IGZ1bmN0aW9uICgpIHt9OworICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItZXh0ZW5z
aW9uLXN1cHBvcnQvaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci1leHRlbnNpb24tc3VwcG9ydC9kYXRhX2FkYXB0ZXInLCAnZW1iZXItZXh0ZW5zaW9uLXN1cHBv
cnQvY29udGFpbmVyX2RlYnVnX2FkYXB0ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsQ29yZSwgX2VtYmVyRXh0ZW5zaW9uU3VwcG9ydERhdGFfYWRhcHRlciwgX2VtYmVyRXh0ZW5z
aW9uU3VwcG9ydENvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItZXh0ZW5zaW9uLXN1cHBvcnQKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRGF0YUFkYXB0ZXIgPSBfZW1i
ZXJFeHRlbnNpb25TdXBwb3J0RGF0YV9hZGFwdGVyLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LkNvbnRhaW5lckRlYnVnQWRhcHRlciA9IF9lbWJlckV4dGVuc2lvblN1cHBvcnRD
b250YWluZXJfZGVidWdfYWRhcHRlci5kZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxi
YXJzL2NvbXBhdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLWh0bWxi
YXJzL3V0aWxzL3N0cmluZyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBf
ZW1iZXJIdG1sYmFyc1V0aWxzU3RyaW5nKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgRW1i
ZXJIYW5kbGViYXJzID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFuZGxlYmFycyA9IF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0LkhhbmRsZWJhcnMgfHwge307CisKKyAgRW1iZXJIYW5kbGViYXJz
LlNhZmVTdHJpbmcgPSBfZW1iZXJIdG1sYmFyc1V0aWxzU3RyaW5nLlNhZmVTdHJpbmc7CisgIEVt
YmVySGFuZGxlYmFycy5VdGlscyA9IHsKKyAgICBlc2NhcGVFeHByZXNzaW9uOiBfZW1iZXJIdG1s
YmFyc1V0aWxzU3RyaW5nLmVzY2FwZUV4cHJlc3Npb24KKyAgfTsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBFbWJlckhhbmRsZWJhcnM7Cit9KTsKKy8vIGZvciBIYW5kbGViYXJzIGV4cG9ydAorZW5p
ZmVkKCdlbWJlci1odG1sYmFycy9lbnYnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwnLCAnZW1i
ZXItbWV0YWwvZW52aXJvbm1lbnQnLCAnaHRtbGJhcnMtcnVudGltZScsICdlbWJlci1tZXRhbC9h
c3NpZ24nLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsICdlbWJlci1odG1sYmFycy9o
b29rcy9jb25jYXQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvbGluay1yZW5kZXItbm9kZScsICdl
bWJlci1odG1sYmFycy9ob29rcy9jcmVhdGUtZnJlc2gtc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMv
aG9va3MvYmluZC1zaGFkb3ctc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1zZWxm
JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMvaG9v
a3MvYmluZC1sb2NhbCcsICdlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLWJsb2NrJywgJ2VtYmVy
LWh0bWxiYXJzL2hvb2tzL3VwZGF0ZS1zZWxmJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1y
b290JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1jaGlsZCcsICdlbWJlci1odG1sYmFycy9o
b29rcy9nZXQtYmxvY2snLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LXZhbHVlJywgJ2VtYmVy
LWh0bWxiYXJzL2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tz
L2NsZWFudXAtcmVuZGVyLW5vZGUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZGVzdHJveS1yZW5k
ZXItbm9kZScsICdlbWJlci1odG1sYmFycy9ob29rcy9kaWQtcmVuZGVyLW5vZGUnLCAnZW1iZXIt
aHRtbGJhcnMvaG9va3Mvd2lsbC1jbGVhbnVwLXRyZWUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mv
ZGlkLWNsZWFudXAtdHJlZScsICdlbWJlci1odG1sYmFycy9ob29rcy9jbGFzc2lmeScsICdlbWJl
ci1odG1sYmFycy9ob29rcy9jb21wb25lbnQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvbG9va3Vw
LWhlbHBlcicsICdlbWJlci1odG1sYmFycy9ob29rcy9oYXMtaGVscGVyJywgJ2VtYmVyLWh0bWxi
YXJzL2hvb2tzL2ludm9rZS1oZWxwZXInLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZWxlbWVudCcs
ICdlbWJlci1odG1sYmFycy9oZWxwZXJzJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzJywgJ2Vt
YmVyLWh0bWxiYXJzL3N5c3RlbS9kb20taGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRz
L2RlYnVnZ2VyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3dpdGgnLCAnZW1iZXItaHRtbGJh
cnMva2V5d29yZHMvb3V0bGV0JywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3VuYm91bmQnLCAn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvdmlldycsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9j
b21wb25lbnQnLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1jb21wb25lbnQnLCAn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvcGFydGlhbCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jk
cy9pbnB1dCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy90ZXh0YXJlYScsICdlbWJlci1odG1s
YmFycy9rZXl3b3Jkcy95aWVsZCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9tdXQnLCAnZW1i
ZXItaHRtbGJhcnMva2V5d29yZHMvcmVhZG9ubHknLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMv
Z2V0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbCwgX2VtYmVyTWV0YWxFbnZpcm9u
bWVudCwgX2h0bWxiYXJzUnVudGltZSwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxiYXJz
SG9va3NTdWJleHByLCBfZW1iZXJIdG1sYmFyc0hvb2tzQ29uY2F0LCBfZW1iZXJIdG1sYmFyc0hv
b2tzTGlua1JlbmRlck5vZGUsIF9lbWJlckh0bWxiYXJzSG9va3NDcmVhdGVGcmVzaFNjb3BlLCBf
ZW1iZXJIdG1sYmFyc0hvb2tzQmluZFNoYWRvd1Njb3BlLCBfZW1iZXJIdG1sYmFyc0hvb2tzQmlu
ZFNlbGYsIF9lbWJlckh0bWxiYXJzSG9va3NCaW5kU2NvcGUsIF9lbWJlckh0bWxiYXJzSG9va3NC
aW5kTG9jYWwsIF9lbWJlckh0bWxiYXJzSG9va3NCaW5kQmxvY2ssIF9lbWJlckh0bWxiYXJzSG9v
a3NVcGRhdGVTZWxmLCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Um9vdCwgX2VtYmVySHRtbGJhcnNI
b29rc0dldENoaWxkLCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0QmxvY2ssIF9lbWJlckh0bWxiYXJz
SG9va3NHZXRWYWx1ZSwgX2VtYmVySHRtbGJhcnNIb29rc0dldENlbGxPclZhbHVlLCBfZW1iZXJI
dG1sYmFyc0hvb2tzQ2xlYW51cFJlbmRlck5vZGUsIF9lbWJlckh0bWxiYXJzSG9va3NEZXN0cm95
UmVuZGVyTm9kZSwgX2VtYmVySHRtbGJhcnNIb29rc0RpZFJlbmRlck5vZGUsIF9lbWJlckh0bWxi
YXJzSG9va3NXaWxsQ2xlYW51cFRyZWUsIF9lbWJlckh0bWxiYXJzSG9va3NEaWRDbGVhbnVwVHJl
ZSwgX2VtYmVySHRtbGJhcnNIb29rc0NsYXNzaWZ5LCBfZW1iZXJIdG1sYmFyc0hvb2tzQ29tcG9u
ZW50LCBfZW1iZXJIdG1sYmFyc0hvb2tzTG9va3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hvb2tz
SGFzSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hvb2tzSW52b2tlSGVscGVyLCBfZW1iZXJIdG1sYmFy
c0hvb2tzRWxlbWVudCwgX2VtYmVySHRtbGJhcnNIZWxwZXJzLCBfZW1iZXJIdG1sYmFyc0tleXdv
cmRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhlbHBlciwgX2VtYmVySHRtbGJhcnNLZXl3b3Jk
c0RlYnVnZ2VyLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzV2l0aCwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc091dGxldCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1VuYm91bmQsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNWaWV3LCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ29tcG9uZW50LCBfZW1iZXJIdG1s
YmFyc0tleXdvcmRzRWxlbWVudENvbXBvbmVudCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1BhcnRp
YWwsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNJbnB1dCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1Rl
eHRhcmVhLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzWWllbGQsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNNdXQsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNSZWFkb25seSwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc0dldCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIGVtYmVySG9va3MgPSBfZW1iZXJN
ZXRhbEFzc2lnbi5kZWZhdWx0KHt9LCBfaHRtbGJhcnNSdW50aW1lLmhvb2tzKTsKKyAgZW1iZXJI
b29rcy5rZXl3b3JkcyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHMuZGVmYXVsdDsKKworICBfZW1i
ZXJNZXRhbEFzc2lnbi5kZWZhdWx0KGVtYmVySG9va3MsIHsKKyAgICBsaW5rUmVuZGVyTm9kZTog
X2VtYmVySHRtbGJhcnNIb29rc0xpbmtSZW5kZXJOb2RlLmRlZmF1bHQsCisgICAgY3JlYXRlRnJl
c2hTY29wZTogX2VtYmVySHRtbGJhcnNIb29rc0NyZWF0ZUZyZXNoU2NvcGUuZGVmYXVsdCwKKyAg
ICBjcmVhdGVDaGlsZFNjb3BlOiBfZW1iZXJIdG1sYmFyc0hvb2tzQ3JlYXRlRnJlc2hTY29wZS5j
cmVhdGVDaGlsZFNjb3BlLAorICAgIGJpbmRTaGFkb3dTY29wZTogX2VtYmVySHRtbGJhcnNIb29r
c0JpbmRTaGFkb3dTY29wZS5kZWZhdWx0LAorICAgIGJpbmRTZWxmOiBfZW1iZXJIdG1sYmFyc0hv
b2tzQmluZFNlbGYuZGVmYXVsdCwKKyAgICBiaW5kU2NvcGU6IF9lbWJlckh0bWxiYXJzSG9va3NC
aW5kU2NvcGUuZGVmYXVsdCwKKyAgICBiaW5kTG9jYWw6IF9lbWJlckh0bWxiYXJzSG9va3NCaW5k
TG9jYWwuZGVmYXVsdCwKKyAgICBiaW5kQmxvY2s6IF9lbWJlckh0bWxiYXJzSG9va3NCaW5kQmxv
Y2suZGVmYXVsdCwKKyAgICB1cGRhdGVTZWxmOiBfZW1iZXJIdG1sYmFyc0hvb2tzVXBkYXRlU2Vs
Zi5kZWZhdWx0LAorICAgIGdldEJsb2NrOiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0QmxvY2suZGVm
YXVsdCwKKyAgICBnZXRSb290OiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Um9vdC5kZWZhdWx0LAor
ICAgIGdldENoaWxkOiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Q2hpbGQuZGVmYXVsdCwKKyAgICBn
ZXRWYWx1ZTogX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQsCisgICAgZ2V0Q2Vs
bE9yVmFsdWU6IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZhdWx0LAorICAg
IHN1YmV4cHI6IF9lbWJlckh0bWxiYXJzSG9va3NTdWJleHByLmRlZmF1bHQsCisgICAgY29uY2F0
OiBfZW1iZXJIdG1sYmFyc0hvb2tzQ29uY2F0LmRlZmF1bHQsCisgICAgY2xlYW51cFJlbmRlck5v
ZGU6IF9lbWJlckh0bWxiYXJzSG9va3NDbGVhbnVwUmVuZGVyTm9kZS5kZWZhdWx0LAorICAgIGRl
c3Ryb3lSZW5kZXJOb2RlOiBfZW1iZXJIdG1sYmFyc0hvb2tzRGVzdHJveVJlbmRlck5vZGUuZGVm
YXVsdCwKKyAgICB3aWxsQ2xlYW51cFRyZWU6IF9lbWJlckh0bWxiYXJzSG9va3NXaWxsQ2xlYW51
cFRyZWUuZGVmYXVsdCwKKyAgICBkaWRDbGVhbnVwVHJlZTogX2VtYmVySHRtbGJhcnNIb29rc0Rp
ZENsZWFudXBUcmVlLmRlZmF1bHQsCisgICAgZGlkUmVuZGVyTm9kZTogX2VtYmVySHRtbGJhcnNI
b29rc0RpZFJlbmRlck5vZGUuZGVmYXVsdCwKKyAgICBjbGFzc2lmeTogX2VtYmVySHRtbGJhcnNI
b29rc0NsYXNzaWZ5LmRlZmF1bHQsCisgICAgY29tcG9uZW50OiBfZW1iZXJIdG1sYmFyc0hvb2tz
Q29tcG9uZW50LmRlZmF1bHQsCisgICAgbG9va3VwSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
TG9va3VwSGVscGVyLmRlZmF1bHQsCisgICAgaGFzSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
SGFzSGVscGVyLmRlZmF1bHQsCisgICAgaW52b2tlSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
SW52b2tlSGVscGVyLmRlZmF1bHQsCisgICAgZWxlbWVudDogX2VtYmVySHRtbGJhcnNIb29rc0Vs
ZW1lbnQuZGVmYXVsdAorICB9KTsKKworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVy
S2V5d29yZCgnZGVidWdnZXInLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzRGVidWdnZXIuZGVmYXVs
dCk7CisgIF9lbWJlckh0bWxiYXJzS2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCd3aXRoJywgX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc1dpdGguZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHMucmVnaXN0ZXJLZXl3b3JkKCdvdXRsZXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzT3V0bGV0
LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgndW5i
b3VuZCcsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNVbmJvdW5kLmRlZmF1bHQpOworICBfZW1iZXJI
dG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnY29tcG9uZW50JywgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkc0NvbXBvbmVudC5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5y
ZWdpc3RlcktleXdvcmQoJ0BlbGVtZW50X2NvbXBvbmVudCcsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNFbGVtZW50Q29tcG9uZW50LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJl
Z2lzdGVyS2V5d29yZCgncGFydGlhbCcsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNQYXJ0aWFsLmRl
ZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnaW5wdXQn
LCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzSW5wdXQuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJz
S2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCd0ZXh0YXJlYScsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNUZXh0YXJlYS5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5yZWdpc3Rlcktl
eXdvcmQoJ3lpZWxkJywgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1lpZWxkLmRlZmF1bHQpOworICBf
ZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnbXV0JywgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkc011dC5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5yZWdpc3Rl
cktleXdvcmQoJ0BtdXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzTXV0LnByaXZhdGVNdXQpOwor
ICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgncmVhZG9ubHknLCBfZW1i
ZXJIdG1sYmFyc0tleXdvcmRzUmVhZG9ubHkuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzS2V5
d29yZHMucmVnaXN0ZXJLZXl3b3JkKCdnZXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzR2V0LmRl
ZmF1bHQpOworCisgIGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9W
SUVXX1NVUFBPUlQpIHsKKyAgICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29y
ZCgndmlldycsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNWaWV3LmRlZmF1bHQpOworICB9CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0geworICAgIGhvb2tzOiBlbWJlckhvb2tzLAorICAgIGhlbHBlcnM6
IF9lbWJlckh0bWxiYXJzSGVscGVycy5kZWZhdWx0LAorICAgIHVzZUZyYWdtZW50Q2FjaGU6IHRy
dWUKKyAgfTsKKworICB2YXIgZG9tSGVscGVyID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0Lmhhc0RPTSA/IG5ldyBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhlbHBlci5kZWZhdWx0KCkg
OiBudWxsOworCisgIGV4cG9ydHMuZG9tSGVscGVyID0gZG9tSGVscGVyOworfSk7CitlbmlmZWQo
J2VtYmVyLWh0bWxiYXJzL2dsaW1tZXItY29tcG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLXZp
ZXdzL3ZpZXdzL2NvcmVfdmlldycsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19jaGlsZF92aWV3
c19zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy92aWV3X3N0YXRlX3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL3RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0JywgJ2VtYmVyLXZpZXdz
L21peGlucy9jbGFzc19uYW1lc19zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy9pbnN0cnVt
ZW50YXRpb25fc3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvYXJpYV9yb2xlX3N1cHBvcnQn
LCAnZW1iZXItdmlld3MvbWl4aW5zL3ZpZXdfc3VwcG9ydCcsICdlbWJlci12aWV3cy92aWV3cy92
aWV3J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1ZpZXdzQ29yZV92aWV3LCBfZW1i
ZXJWaWV3c01peGluc1ZpZXdfY2hpbGRfdmlld3Nfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNW
aWV3X3N0YXRlX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1
cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydCwgX2VtYmVyVmlld3NN
aXhpbnNJbnN0cnVtZW50YXRpb25fc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNBcmlhX3JvbGVf
c3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNWaWV3X3N1cHBvcnQsIF9lbWJlclZpZXdzVmlld3NW
aWV3KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJWaWV3
c1ZpZXdzQ29yZV92aWV3LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclZpZXdzTWl4aW5zVmlld19jaGls
ZF92aWV3c19zdXBwb3J0LmRlZmF1bHQsIF9lbWJlclZpZXdzTWl4aW5zVmlld19zdGF0ZV9zdXBw
b3J0LmRlZmF1bHQsIF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1cHBvcnQu
ZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNDbGFzc19uYW1lc19zdXBwb3J0LmRlZmF1bHQsIF9l
bWJlclZpZXdzTWl4aW5zSW5zdHJ1bWVudGF0aW9uX3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmll
d3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1ZpZXdf
c3VwcG9ydC5kZWZhdWx0LCB7CisgICAgaXNDb21wb25lbnQ6IHRydWUsCisgICAgaXNHbGltbWVy
Q29tcG9uZW50OiB0cnVlLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5f
c3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3ZpZXdSZWdpc3RyeSA9
IHRoaXMuX3ZpZXdSZWdpc3RyeSB8fCBfZW1iZXJWaWV3c1ZpZXdzVmlldy5kZWZhdWx0LnZpZXdz
OworICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVyJywgWydl
eHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmhlbHBlciA9IGhlbHBlcjsKKworICAvKioKKyAgICBFbWJlciBIZWxwZXJzIGFy
ZSBmdW5jdGlvbnMgdGhhdCBjYW4gY29tcHV0ZSB2YWx1ZXMsIGFuZCBhcmUgdXNlZCBpbiB0ZW1w
bGF0ZXMuCisgICAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBjYWxscyBhIGhlbHBlciBuYW1lZCBg
Zm9ybWF0LWN1cnJlbmN5YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDxkaXY+e3tmb3Jt
YXQtY3VycmVuY3kgY2VudHMgY3VycmVuY3k9IiQifX08L2Rpdj4KKyAgICBgYGAKKyAgCisgICAg
QWRkaXRpb25hbGx5LCBhIGhlbHBlciBjYW4gYmUgY2FsbGVkIGFzIGEgbmVzdGVkIGhlbHBlciAo
c29tZXRpbWVzIGNhbGxlZCBhCisgICAgc3ViZXhwcmVzc2lvbikuIEluIHRoaXMgZXhhbXBsZSwg
dGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgaGVscGVyIGlzIHBhc3NlZAorICAgIHRvIGEgY29tcG9u
ZW50IG5hbWVkIGBzaG93LW1vbmV5YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7c2hv
dy1tb25leSBhbW91bnQ9KGZvcm1hdC1jdXJyZW5jeSBjZW50cyBjdXJyZW5jeT0iJCIpfX0KKyAg
ICBgYGAKKyAgCisgICAgSGVscGVycyBkZWZpbmVkIHVzaW5nIGEgY2xhc3MgbXVzdCBwcm92aWRl
IGEgYGNvbXB1dGVgIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZToKKyAgCisgICAgYGBganMKKyAgICBl
eHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuZXh0ZW5kKHsKKyAgICAgIGNvbXB1dGUocGFyYW1z
LCBoYXNoKSB7CisgICAgICAgIGxldCBjZW50cyA9IHBhcmFtc1swXTsKKyAgICAgICAgbGV0IGN1
cnJlbmN5ID0gaGFzaC5jdXJyZW5jeTsKKyAgICAgICAgcmV0dXJuIGAke2N1cnJlbmN5fSR7Y2Vu
dHMgKiAwLjAxfWA7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEVhY2ggdGlt
ZSB0aGUgaW5wdXQgdG8gYSBoZWxwZXIgY2hhbmdlcywgdGhlIGBjb21wdXRlYCBmdW5jdGlvbiB3
aWxsIGJlCisgICAgY2FsbGVkIGFnYWluLgorICAKKyAgICBBcyBpbnN0YW5jZXMsIHRoZXNlIGhl
bHBlcnMgYWxzbyBoYXZlIGFjY2VzcyB0byB0aGUgY29udGFpbmVyIGFuZCB3aWxsIGFjY2VwdAor
ICAgIGluamVjdGVkIGRlcGVuZGVuY2llcy4KKyAgCisgICAgQWRkaXRpb25hbGx5LCBjbGFzcyBo
ZWxwZXJzIGNhbiBjYWxsIGByZWNvbXB1dGVgIHRvIGZvcmNlIGEgbmV3IGNvbXB1dGF0aW9uLgor
ICAKKyAgICBAY2xhc3MgRW1iZXIuSGVscGVyCisgICAgQHB1YmxpYworICAgIEBzaW5jZSAxLjEz
LjAKKyAgKi8KKyAgdmFyIEhlbHBlciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVs
dC5leHRlbmQoeworICAgIGlzSGVscGVySW5zdGFuY2U6IHRydWUsCisKKyAgICAvKioKKyAgICAg
IE9uIGEgY2xhc3MtYmFzZWQgaGVscGVyLCBpdCBtYXkgYmUgdXNlZnVsIHRvIGZvcmNlIGEgcmVj
b21wdXRhdGlvbiBvZiB0aGF0CisgICAgICBoZWxwZXJzIHZhbHVlLiBUaGlzIGlzIGFraW4gdG8g
YHJlcmVuZGVyYCBvbiBhIGNvbXBvbmVudC4KKyAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBjb21w
b25lbnQgd2lsbCByZXJlbmRlciB3aGVuIHRoZSBgY3VycmVudFVzZXJgIG9uIGEKKyAgICAgIHNl
c3Npb24gc2VydmljZSBjaGFuZ2VzOgorICAgICAgIGBgYGpzCisgICAgICAvLyBhcHAvaGVscGVy
cy9jdXJyZW50LXVzZXItZW1haWwuanMKKyAgICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkhlbHBl
ci5leHRlbmQoeworICAgICAgICBzZXNzaW9uOiBFbWJlci5pbmplY3Quc2VydmljZSgpLAorICAg
ICAgICBvbk5ld1VzZXI6IEVtYmVyLm9ic2VydmVyKCdzZXNzaW9uLmN1cnJlbnRVc2VyJywgZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5yZWNvbXB1dGUoKTsKKyAgICAgICAgfSksCisgICAg
ICAgIGNvbXB1dGUoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdzZXNzaW9uLmN1cnJl
bnRVc2VyLmVtYWlsJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAg
QG1ldGhvZCByZWNvbXB1dGUKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5jZSAxLjEzLjAKKyAg
ICAqLworICAgIHJlY29tcHV0ZTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3RyZWFtLm5v
dGlmeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB3
aGVuIHdyaXRpbmcgYSBjbGFzcy1iYXNlZCBoZWxwZXIuCisgICAgICAgQG1ldGhvZCBjb21wdXRl
CisgICAgICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgVGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRv
IHRoZSBoZWxwZXIKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBuYW1lZCBhcmd1bWVu
dHMgdG8gdGhlIGhlbHBlcgorICAgICAgQHB1YmxpYworICAgICAgQHNpbmNlIDEuMTMuMAorICAg
ICovCisgIH0pOworCisgIEhlbHBlci5yZW9wZW5DbGFzcyh7CisgICAgaXNIZWxwZXJGYWN0b3J5
OiB0cnVlCisgIH0pOworCisgIC8qKgorICAgIEluIG1hbnkgY2FzZXMsIHRoZSBjZXJlbW9ueSBv
ZiBhIGZ1bGwgYEVtYmVyLkhlbHBlcmAgY2xhc3MgaXMgbm90IHJlcXVpcmVkLgorICAgIFRoZSBg
aGVscGVyYCBtZXRob2QgY3JlYXRlIHB1cmUtZnVuY3Rpb24gaGVscGVycyB3aXRob3V0IGluc3Rh
bmNlcy4gRm9yCisgICAgZXhhbXBsZToKKyAgCisgICAgYGBganMKKyAgICAvLyBhcHAvaGVscGVy
cy9mb3JtYXQtY3VycmVuY3kuanMKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuaGVs
cGVyKGZ1bmN0aW9uKHBhcmFtcywgaGFzaCkgeworICAgICAgbGV0IGNlbnRzID0gcGFyYW1zWzBd
OworICAgICAgbGV0IGN1cnJlbmN5ID0gaGFzaC5jdXJyZW5jeTsKKyAgICAgIHJldHVybiBgJHtj
dXJyZW5jeX0ke2NlbnRzICogMC4wMX1gOworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAc3Rh
dGljCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyIFRoZSBoZWxwZXIgZnVuY3Rpb24KKyAg
ICBAbWV0aG9kIGhlbHBlcgorICAgIEBwdWJsaWMKKyAgICBAc2luY2UgMS4xMy4wCisgICovCisK
KyAgZnVuY3Rpb24gaGVscGVyKGhlbHBlckZuKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGlzSGVs
cGVySW5zdGFuY2U6IHRydWUsCisgICAgICBjb21wdXRlOiBoZWxwZXJGbgorICAgIH07CisgIH0K
KworICBleHBvcnRzLmRlZmF1bHQgPSBIZWxwZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJh
cnMvaGVscGVycycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0KSB7CisgIC8qKgorICBAbW9k
dWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAvKioKKyAg
IEBwcml2YXRlCisgICBAcHJvcGVydHkgaGVscGVycworICAqLworICAndXNlIHN0cmljdCc7CisK
KyAgZXhwb3J0cy5yZWdpc3RlckhlbHBlciA9IHJlZ2lzdGVySGVscGVyOworCisgIHZhciBoZWxw
ZXJzID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgLyoq
CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIF9yZWdpc3RlckhlbHBlcgorICAgIEBmb3IgRW1i
ZXIuSFRNTEJhcnMKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7T2JqZWN0
fEZ1bmN0aW9ufSBoZWxwZXJGdW5jIFRoZSBoZWxwZXIgZnVuY3Rpb24gdG8gYWRkLgorICAqLwor
CisgIGZ1bmN0aW9uIHJlZ2lzdGVySGVscGVyKG5hbWUsIGhlbHBlckZ1bmMpIHsKKyAgICBoZWxw
ZXJzW25hbWVdID0gaGVscGVyRnVuYzsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IGhlbHBl
cnM7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVycy8taHRtbC1zYWZlJywgWydl
eHBvcnRzJywgJ2h0bWxiYXJzLXV0aWwvc2FmZS1zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9odG1sYmFyc1V0aWxTYWZlU3RyaW5nKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBodG1sU2FmZUhlbHBlcjsKKworICAvKioKKyAgIFRoaXMgcHJpdmF0ZSBoZWxw
ZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSBgaXNWaXNpYmxlOiBmYWxzZWAgZm9yCisg
ICBFbWJlci5WaWV3IGFuZCBFbWJlci5Db21wb25lbnQuCisgIAorICAgQHByaXZhdGUKKyAgICov
CisKKyAgZnVuY3Rpb24gaHRtbFNhZmVIZWxwZXIoX3JlZikgeworICAgIHZhciB2YWx1ZSA9IF9y
ZWZbMF07CisKKyAgICByZXR1cm4gbmV3IF9odG1sYmFyc1V0aWxTYWZlU3RyaW5nLmRlZmF1bHQo
dmFsdWUpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVycy8tam9pbi1j
bGFzc2VzJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qCisgICAgVGhp
cyBwcml2YXRlIGhlbHBlciBpcyB1c2VkIHRvIGpvaW4gYW5kIGNvbXBhY3QgYSBsaXN0IG9mIGNs
YXNzIG5hbWVzLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBqb2luQ2xhc3NlczsKKworICBmdW5jdGlvbiBqb2luQ2xhc3Nl
cyhjbGFzc05hbWVzKSB7CisgICAgdmFyIHJlc3VsdCA9IFtdOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjbGFzc05hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFyIGNsYXNz
TmFtZSA9IGNsYXNzTmFtZXNbaV07CisKKyAgICAgIGlmIChjbGFzc05hbWUpIHsKKyAgICAgICAg
cmVzdWx0LnB1c2goY2xhc3NOYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVz
dWx0LmpvaW4oJyAnKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMv
LW5vcm1hbGl6ZS1jbGFzcycsIFsnZXhwb3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJp
bmcnLCAnZW1iZXItbWV0YWwvcGF0aF9jYWNoZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZywgX2VtYmVyTWV0YWxQYXRoX2NhY2hlKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBub3JtYWxpemVDbGFzczsKKworICAvKgorICAg
IFRoaXMgcHJpdmF0ZSBoZWxwZXIgaXMgdXNlZCBieSBDb21wb25lbnROb2RlIHRvIGNvbnZlcnQg
dGhlIGNsYXNzTmFtZUJpbmRpbmdzCisgICAgbWljcm9zeW50YXggaW50byBhIGNsYXNzIG5hbWUu
CisgIAorICAgIFdoZW4gYSBjb21wb25lbnQgb3IgdmlldyBpcyBjcmVhdGVkLCB3ZSBub3JtYWxp
emUgY2xhc3MgbmFtZSBiaW5kaW5ncyBpbnRvIGEKKyAgICBzZXJpZXMgb2YgYXR0cmlidXRlIG5v
ZGVzIHRoYXQgdXNlIHRoaXMgaGVscGVyLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1
bmN0aW9uIG5vcm1hbGl6ZUNsYXNzKHBhcmFtcywgaGFzaCkgeworICAgIHZhciBwcm9wTmFtZSA9
IHBhcmFtc1swXTsKKyAgICB2YXIgdmFsdWUgPSBwYXJhbXNbMV07CisgICAgdmFyIGFjdGl2ZUNs
YXNzID0gaGFzaC5hY3RpdmVDbGFzczsKKyAgICB2YXIgaW5hY3RpdmVDbGFzcyA9IGhhc2guaW5h
Y3RpdmVDbGFzczsKKworICAgIC8vIFdoZW4gdXNpbmcgdGhlIGNvbG9uIHN5bnRheCwgZXZhbHVh
dGUgdGhlIHRydXRoaW5lc3Mgb3IgZmFsc2luZXNzCisgICAgLy8gb2YgdGhlIHZhbHVlIHRvIGRl
dGVybWluZSB3aGljaCBjbGFzc05hbWUgdG8gcmV0dXJuLgorICAgIGlmIChhY3RpdmVDbGFzcyB8
fCBpbmFjdGl2ZUNsYXNzKSB7CisgICAgICBpZiAoISF2YWx1ZSkgeworICAgICAgICByZXR1cm4g
YWN0aXZlQ2xhc3M7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaW5hY3RpdmVDbGFz
czsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdmFsdWUgaXMgYSBCb29sZWFuIGFuZCB0cnVlLCBy
ZXR1cm4gdGhlIGRhc2hlcml6ZWQgcHJvcGVydHkKKyAgICAgIC8vIG5hbWUuCisgICAgfSBlbHNl
IGlmICh2YWx1ZSA9PT0gdHJ1ZSkgeworICAgICAgICAvLyBPbmx5IGFwcGx5IHRvIGxhc3Qgc2Vn
bWVudCBpbiB0aGUgcGF0aC4KKyAgICAgICAgaWYgKHByb3BOYW1lICYmIF9lbWJlck1ldGFsUGF0
aF9jYWNoZS5pc1BhdGgocHJvcE5hbWUpKSB7CisgICAgICAgICAgdmFyIHNlZ21lbnRzID0gcHJv
cE5hbWUuc3BsaXQoJy4nKTsKKyAgICAgICAgICBwcm9wTmFtZSA9IHNlZ21lbnRzW3NlZ21lbnRz
Lmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVT
eXN0ZW1TdHJpbmcuZGFzaGVyaXplKHByb3BOYW1lKTsKKworICAgICAgICAvLyBJZiB0aGUgdmFs
dWUgaXMgbm90IGZhbHNlLCB1bmRlZmluZWQsIG9yIG51bGwsIHJldHVybiB0aGUgY3VycmVudAor
ICAgICAgICAvLyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICB9IGVsc2UgaWYgKHZhbHVl
ICE9PSBmYWxzZSAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOwor
CisgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LiBSZXR1cm4gbnVsbCBzbyB0aGF0IHRo
ZSBvbGQgY2xhc3MgaXMgcmVtb3ZlZAorICAgICAgICAgIC8vIGJ1dCBubyBuZXcgY2xhc3MgaXMg
YWRkZWQuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAg
ICAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9oZWxwZXJzL2NvbmNhdCcs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgorICAgIENvbmNh
dGVuYXRlcyBpbnB1dCBwYXJhbXMgdG9nZXRoZXIuCisgICAgRXhhbXBsZToKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3tzb21lLWNvbXBvbmVudCBuYW1lPShjb25jYXQgZmlyc3ROYW1lICIgIiBs
YXN0TmFtZSl9fQorICAgIHt7ISB3b3VsZCBwYXNzIG5hbWU9IjxmaXJzdCBuYW1lIHZhbHVlPiA8
bGFzdCBuYW1lIHZhbHVlPiIgdG8gdGhlIGNvbXBvbmVudH19CisgICAgYGBgCisgICAgQHB1Ymxp
YworICAgIEBtZXRob2QgY29uY2F0CisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycwor
ICAgIEBzaW5jZSAxLjEzLjAKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IGNvbmNhdDsKKworICBmdW5jdGlvbiBjb25jYXQocGFyYW1zKSB7CisgICAgcmV0dXJu
IHBhcmFtcy5qb2luKCcnKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBl
cnMvZWFjaC1pbicsIFsnZXhwb3J0cycsICdlbWJlci12aWV3cy9zdHJlYW1zL3Nob3VsZF9kaXNw
bGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1N0cmVhbXNTaG91bGRfZGlzcGxh
eSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRl
cworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgYHt7ZWFjaC1pbn19
YCBoZWxwZXIgbG9vcHMgb3ZlciBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdC4gSXQgaXMgdW5ib3Vu
ZCwKKyAgICBpbiB0aGF0IG5ldyAob3IgcmVtb3ZlZCkgcHJvcGVydGllcyBhZGRlZCB0byB0aGUg
dGFyZ2V0IG9iamVjdCB3aWxsIG5vdCBiZQorICAgIHJlbmRlcmVkLgorICAKKyAgICBGb3IgZXhh
bXBsZSwgZ2l2ZW4gYSBgdXNlcmAgb2JqZWN0IHRoYXQgbG9va3MgbGlrZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHsKKyAgICAgICJuYW1lIjogIlNoZWxseSBTYWlscyIsCisgICAgICAi
YWdlIjogNDIKKyAgICB9CisgICAgYGBgCisgIAorICAgIFRoaXMgdGVtcGxhdGUgd291bGQgZGlz
cGxheSBhbGwgcHJvcGVydGllcyBvbiB0aGUgYHVzZXJgCisgICAgb2JqZWN0IGluIGEgbGlzdDoK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDx1bD4KKyAgICB7eyNlYWNoLWluIHVzZXIgYXMg
fGtleSB2YWx1ZXx9fQorICAgICAgPGxpPnt7a2V5fX06IHt7dmFsdWV9fTwvbGk+CisgICAge3sv
ZWFjaC1pbn19CisgICAgPC91bD4KKyAgICBgYGAKKyAgCisgICAgT3V0cHV0dGluZyB0aGVpciBu
YW1lIGFuZCBhZ2UuCisgIAorICAgIEBtZXRob2QgZWFjaC1pbgorICAgIEBmb3IgRW1iZXIuVGVt
cGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICAgQHNpbmNlIDIuMS4wCisgICovCisgIHZh
ciBlYWNoSW5IZWxwZXIgPSBmdW5jdGlvbiAoX3JlZiwgaGFzaCwgYmxvY2tzKSB7CisgICAgdmFy
IG9iamVjdCA9IF9yZWZbMF07CisKKyAgICB2YXIgb2JqS2V5cywgcHJvcCwgaTsKKyAgICBvYmpL
ZXlzID0gb2JqZWN0ID8gT2JqZWN0LmtleXMob2JqZWN0KSA6IFtdOworICAgIGlmIChfZW1iZXJW
aWV3c1N0cmVhbXNTaG91bGRfZGlzcGxheS5kZWZhdWx0KG9iaktleXMpKSB7CisgICAgICBmb3Ig
KGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICBwcm9wID0gb2JqS2V5
c1tpXTsKKyAgICAgICAgYmxvY2tzLnRlbXBsYXRlLnlpZWxkSXRlbShwcm9wLCBbcHJvcCwgb2Jq
ZWN0W3Byb3BdXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChibG9ja3MuaW52ZXJzZS55aWVs
ZCkgeworICAgICAgYmxvY2tzLmludmVyc2UueWllbGQoKTsKKyAgICB9CisgIH07CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gZWFjaEluSGVscGVyOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L2hlbHBlcnMvZWFjaCcsIFsnZXhwb3J0cycsICdlbWJlci12aWV3cy9zdHJlYW1zL3Nob3VsZF9k
aXNwbGF5JywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2RlY29kZS1lYWNoLWtleSddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyVmlld3NTdHJlYW1zU2hvdWxkX2Rpc3BsYXksIF9lbWJlckh0bWxi
YXJzVXRpbHNEZWNvZGVFYWNoS2V5KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IGVhY2hIZWxwZXI7CisKKyAgLyoqCisgICAgVGhlIGB7eyNlYWNofX1gIGhl
bHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGluIGEgY29sbGVjdGlvbi4gSXQgaXMgYW4gZXh0ZW5z
aW9uCisgICAgb2YgdGhlIGJhc2UgSGFuZGxlYmFycyBge3sjZWFjaH19YCBoZWxwZXIuCisgIAor
ICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGB7eyNlYWNofX1gIGlzIHRvIHlpZWxkIGl0cyBp
bm5lciBibG9jayBvbmNlIGZvciBldmVyeQorICAgIGl0ZW0gaW4gYW4gYXJyYXkgcGFzc2luZyB0
aGUgaXRlbSBhcyB0aGUgZmlyc3QgYmxvY2sgcGFyYW1ldGVyLgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgdmFyIGRldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1ZGEnfSx7bmFtZTogJ1RvbSd9
LCB7bmFtZTogJ1BhdWwnfV07CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
eyNlYWNoIGRldmVsb3BlcnMga2V5PSJuYW1lIiBhcyB8cGVyc29ufH19CisgICAgICB7e3BlcnNv
bi5uYW1lfX0KKyAgICAgIHt7ISBgdGhpc2AgaXMgd2hhdGV2ZXIgaXQgd2FzIG91dHNpZGUgdGhl
ICNlYWNoIH19CisgICAge3svZWFjaH19CisgICAgYGBgCisgIAorICAgIFRoZSBzYW1lIHJ1bGVz
IGFwcGx5IHRvIGFycmF5cyBvZiBwcmltaXRpdmVzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIGRldmVsb3Blck5hbWVzID0gWydZZWh1ZGEnLCAnVG9tJywgJ1BhdWwnXQorICAgIGBg
YAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjZWFjaCBkZXZlbG9wZXJOYW1lcyBrZXk9
IkBpbmRleCIgYXMgfG5hbWV8fX0KKyAgICAgIHt7bmFtZX19CisgICAge3svZWFjaH19CisgICAg
YGBgCisgIAorICAgIER1cmluZyBpdGVyYXRpb24sIHRoZSBpbmRleCBvZiBlYWNoIGl0ZW0gaW4g
dGhlIGFycmF5IGlzIHByb3ZpZGVkIGFzIGEgc2Vjb25kIGJsb2NrIHBhcmFtZXRlci4KKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIDx1bD4KKyAgICAgIHt7I2VhY2ggcGVvcGxlIGFzIHxwZXJz
b24gaW5kZXh8fX0KKyAgICAgICAgPGxpPkhlbGxvLCB7e3BlcnNvbi5uYW1lfX0hIFlvdSdyZSBu
dW1iZXIge3tpbmRleH19IGluIGxpbmU8L2xpPgorICAgICAge3svZWFjaH19CisgICAgPC91bD4K
KyAgICBgYGAKKyAgCisgICAgIyMjIFNwZWNpZnlpbmcgS2V5cworICAKKyAgICBUaGUgYGtleWAg
b3B0aW9uIGlzIHVzZWQgdG8gdGVsbCBFbWJlciBob3cgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcnJh
eSBiZWluZworICAgIGl0ZXJhdGVkIG92ZXIgd2l0aCBge3sjZWFjaH19YCBoYXMgY2hhbmdlZCBi
ZXR3ZWVuIHJlbmRlcnMuIEJ5IGhlbHBpbmcgRW1iZXIKKyAgICBkZXRlY3QgdGhhdCBzb21lIGVs
ZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgdGhlIHNhbWUsIERPTSBlbGVtZW50cyBjYW4gYmUKKyAg
ICByZS11c2VkLCBzaWduaWZpY2FudGx5IGltcHJvdmluZyByZW5kZXJpbmcgc3BlZWQuCisgIAor
ICAgIEZvciBleGFtcGxlLCBoZXJlJ3MgdGhlIGB7eyNlYWNofX1gIGhlbHBlciB3aXRoIGl0cyBg
a2V5YCBzZXQgdG8gYGlkYDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2VhY2ggbW9k
ZWwga2V5PSJpZCIgYXMgfGl0ZW18fX0KKyAgICB7ey9lYWNofX0KKyAgICBgYGAKKyAgCisgICAg
V2hlbiB0aGlzIGB7eyNlYWNofX1gIHJlLXJlbmRlcnMsIEVtYmVyIHdpbGwgbWF0Y2ggdXAgdGhl
IHByZXZpb3VzbHkgcmVuZGVyZWQKKyAgICBpdGVtcyAoYW5kIHJlb3JkZXIgdGhlIGdlbmVyYXRl
ZCBET00gZWxlbWVudHMpIGJhc2VkIG9uIGVhY2ggaXRlbSdzIGBpZGAKKyAgICBwcm9wZXJ0eS4K
KyAgCisgICAgQnkgZGVmYXVsdCB0aGUgaXRlbSdzIG93biByZWZlcmVuY2UgaXMgdXNlZC4KKyAg
CisgICAgIyMjIHt7ZWxzZX19IGNvbmRpdGlvbgorICAKKyAgICBge3sjZWFjaH19YCBjYW4gaGF2
ZSBhIG1hdGNoaW5nIGB7e2Vsc2V9fWAuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrIHdpbGwg
cmVuZGVyCisgICAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuCisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgICB7eyNlYWNoIGRldmVsb3BlcnMgYXMgfHBlcnNvbnx9fQorICAgICAge3twZXJz
b24ubmFtZX19CisgICAge3tlbHNlfX0KKyAgICAgIDxwPlNvcnJ5LCBub2JvZHkgaXMgYXZhaWxh
YmxlIGZvciB0aGlzIHRhc2suPC9wPgorICAgIHt7L2VhY2h9fQorICAgIGBgYAorICAKKyAgICBA
bWV0aG9kIGVhY2gKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHB1Ymxp
YworICAqLworCisgIGZ1bmN0aW9uIGVhY2hIZWxwZXIocGFyYW1zLCBoYXNoLCBibG9ja3MpIHsK
KyAgICB2YXIgbGlzdCA9IHBhcmFtc1swXTsKKyAgICB2YXIga2V5UGF0aCA9IGhhc2gua2V5Owor
CisgICAgaWYgKF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9kaXNwbGF5LmRlZmF1bHQobGlzdCkp
IHsKKyAgICAgIGZvckVhY2gobGlzdCwgZnVuY3Rpb24gKGl0ZW0sIGkpIHsKKyAgICAgICAgdmFy
IGtleSA9IF9lbWJlckh0bWxiYXJzVXRpbHNEZWNvZGVFYWNoS2V5LmRlZmF1bHQoaXRlbSwga2V5
UGF0aCwgaSk7CisKKyAgICAgICAgYmxvY2tzLnRlbXBsYXRlLnlpZWxkSXRlbShrZXksIFtpdGVt
LCBpXSk7CisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKGJsb2Nrcy5pbnZlcnNlLnlpZWxkKSB7
CisgICAgICBibG9ja3MuaW52ZXJzZS55aWVsZCgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9u
IGZvckVhY2goaXRlcmFibGUsIGNiKSB7CisgICAgcmV0dXJuIGl0ZXJhYmxlLmZvckVhY2ggPyBp
dGVyYWJsZS5mb3JFYWNoKGNiKSA6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaXRlcmFi
bGUsIGNiKTsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL2hlbHBlcnMvaGFzaCIs
IFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAgLyoqCisgICBAbW9kdWxlIGVt
YmVyCisgICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAgKi8KKworICAgLyoqCisgICAg
ICBVc2UgdGhlIGB7e2hhc2h9fWAgaGVscGVyIHRvIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhcyBh
biBvcHRpb24gdG8geW91cgorICAgICAgY29tcG9uZW50cy4gVGhpcyBpcyBzcGVjaWFsbHkgdXNl
ZnVsIGZvciBjb250ZXh0dWFsIGNvbXBvbmVudHMgd2hlcmUgeW91IGNhbgorICAgICAganVzdCB5
aWVsZCBhIGhhc2g6CisgICAgICBgYGBoYW5kbGViYXJzCisgICAgICB7e3lpZWxkIChoYXNoCisg
ICAgICAgICBuYW1lPSdTYXJhaCcKKyAgICAgICAgIHRpdGxlPW9mZmljZQorICAgICAgKX19Cisg
ICAgICBgYGAKKyAgICAgIFdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3Qgc3VjaCBhczoKKyAgICAg
IGBgYGpzCisgICAgICB7IG5hbWU6ICdTYXJhaCcsIHRpdGxlOiB0aGlzLmdldCgnb2ZmaWNlJykg
fQorICAgICAgYGBgCisgICAgICBXaGVyZSB0aGUgYHRpdGxlYCBpcyBib3VuZCB0byB1cGRhdGVz
IG9mIHRoZSBgb2ZmaWNlYCBwcm9wZXJ0eS4KKyAgICAgIEBtZXRob2QgaGFzaAorICAgICAgQGZv
ciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMK
KyAgICAgIEByZXR1cm4ge09iamVjdH0gSGFzaAorICAgICAgQHB1YmxpYworICAgICovCisKKyAg
ICJ1c2Ugc3RyaWN0IjsKKworICAgZXhwb3J0cy5kZWZhdWx0ID0gaGFzaEhlbHBlcjsKKworICAg
ZnVuY3Rpb24gaGFzaEhlbHBlcihwYXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICAgIHJldHVy
biBoYXNoOworICAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvaWZfdW5s
ZXNzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXZpZXdzL3N0cmVh
bXMvc2hvdWxkX2Rpc3BsYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9kaXNwbGF5KSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIC8qKgorICAgIFVzZSB0aGUgYGlmYCBibG9jayBoZWxwZXIgdG8gY29uZGl0aW9uYWxs
eSByZW5kZXIgYSBibG9jayBkZXBlbmRpbmcgb24gYQorICAgIHByb3BlcnR5LiBJZiB0aGUgcHJv
cGVydHkgaXMgImZhbHNleSIsIGZvciBleGFtcGxlOiBgZmFsc2VgLCBgdW5kZWZpbmVkYCwKKyAg
IGBudWxsYCwgYCIiYCwgYDBgLCBgTmFOYCBvciBhbiBlbXB0eSBhcnJheSwgdGhlIGJsb2NrIHdp
bGwgbm90IGJlIHJlbmRlcmVkLgorICAKKyAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyEgd2lsbCBu
b3QgcmVuZGVyIGlmIGZvbyBpcyBmYWxzZXl9fQorICAgIHt7I2lmIGZvb319CisgICAgICBXZWxj
b21lIHRvIHRoZSB7e2Zvby5iYXJ9fQorICAgIHt7L2lmfX0KKyAgICBgYGAKKyAgCisgICAgWW91
IGNhbiBhbHNvIHNwZWNpZnkgYSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBwcm9wZXJ0eSBpcyBm
YWxzZXkgYnkgdXNpbmcKKyAgICB0aGUgYGVsc2VgIGhlbHBlci4KKyAgCisgICAgYGBgaGFuZGxl
YmFycworICAgIHt7ISBpcyBpdCByYWluaW5nIG91dHNpZGU/fX0KKyAgICB7eyNpZiBpc1JhaW5p
bmd9fQorICAgICAgWWVzLCBncmFiIGFuIHVtYnJlbGxhIQorICAgIHt7ZWxzZX19CisgICAgICBO
bywgaXQncyBsb3ZlbHkgb3V0c2lkZSEKKyAgICB7ey9pZn19CisgICAgYGBgCisgIAorICAgIFlv
dSBhcmUgYWxzbyBhYmxlIHRvIGNvbWJpbmUgYGVsc2VgIGFuZCBgaWZgIGhlbHBlcnMgdG8gY3Jl
YXRlIG1vcmUgY29tcGxleAorICAgIGNvbmRpdGlvbmFsIGxvZ2ljLgorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3sjaWYgaXNNb3JuaW5nfX0KKyAgICAgIEdvb2QgbW9ybmluZworICAgIHt7
ZWxzZSBpZiBpc0FmdGVybm9vbn19CisgICAgICBHb29kIGFmdGVybm9vbgorICAgIHt7ZWxzZX19
CisgICAgICBHb29kIG5pZ2h0CisgICAge3svaWZ9fQorICAgIGBgYAorICAKKyAgICBZb3UgY2Fu
IHVzZSBgaWZgIGlubGluZSB0byBjb25kaXRpb25hbGx5IHJlbmRlciBhIHNpbmdsZSBwcm9wZXJ0
eSBvciBzdHJpbmcuCisgICAgVGhpcyBoZWxwZXIgYWN0cyBsaWtlIGEgdGVybmFyeSBvcGVyYXRv
ci4gSWYgdGhlIGZpcnN0IHByb3BlcnR5IGlzIHRydXRoeSwKKyAgICB0aGUgc2Vjb25kIGFyZ3Vt
ZW50IHdpbGwgYmUgZGlzcGxheWVkLCBpZiBub3QsIHRoZSB0aGlyZCBhcmd1bWVudCB3aWxsIGJl
CisgICAgZGlzcGxheWVkCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2lmIHVzZUxvbmdH
cmVldGluZyAiSGVsbG8iICJIaSJ9fSBEYXZlCisgICAgYGBgCisgIAorICAgIEZpbmFsbHksIHlv
dSBjYW4gdXNlIHRoZSBgaWZgIGhlbHBlciBpbnNpZGUgYW5vdGhlciBoZWxwZXIgYXMgYSBzdWJl
eHByZXNzaW9uLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tzb21lLWNvbXBvbmVudCBo
ZWlnaHQ9KGlmIGlzQmlnICIxMDAiICIxMCIpfX0KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBp
ZgorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisg
IGZ1bmN0aW9uIGlmSGVscGVyKHBhcmFtcywgaGFzaCwgb3B0aW9ucykgeworICAgIHJldHVybiBp
ZlVubGVzcyhwYXJhbXMsIGhhc2gsIG9wdGlvbnMsIF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9k
aXNwbGF5LmRlZmF1bHQocGFyYW1zWzBdKSk7CisgIH0KKworICAvKioKKyAgICBUaGUgYHVubGVz
c2AgaGVscGVyIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBgaWZgIGhlbHBlci4gSXRzIGJsb2NrIHdp
bGwgYmUKKyAgICByZW5kZXJlZCBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhIGZhbHNleSB2
YWx1ZS4gIEFsbCBmb3JtcyBvZiB0aGUgYGlmYAorICAgIGhlbHBlciBjYW4gYWxzbyBiZSB1c2Vk
IHdpdGggYHVubGVzc2AuCisgIAorICAgIEBtZXRob2QgdW5sZXNzCisgICAgQGZvciBFbWJlci5U
ZW1wbGF0ZXMuaGVscGVycworICAgIEBwdWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24gdW5sZXNzSGVs
cGVyKHBhcmFtcywgaGFzaCwgb3B0aW9ucykgeworICAgIHJldHVybiBpZlVubGVzcyhwYXJhbXMs
IGhhc2gsIG9wdGlvbnMsICFfZW1iZXJWaWV3c1N0cmVhbXNTaG91bGRfZGlzcGxheS5kZWZhdWx0
KHBhcmFtc1swXSkpOworICB9CisKKyAgZnVuY3Rpb24gaWZVbmxlc3MocGFyYW1zLCBoYXNoLCBv
cHRpb25zLCB0cnV0aHkpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGJsb2Nr
IGZvcm0gb2YgdGhlIGBpZmAgYW5kIGB1bmxlc3NgIGhlbHBlcnMgZXhwZWN0IGV4YWN0bHkgb25l
ICcgKyAnYXJndW1lbnQsIGUuZy4gYHt7I2lmIG5ld01lc3NhZ2VzfX0gWW91IGhhdmUgbmV3IG1l
c3NhZ2VzLiB7ey9pZn19LmAnLCAhb3B0aW9ucy50ZW1wbGF0ZS55aWVsZCB8fCBwYXJhbXMubGVu
Z3RoID09PSAxKTsKKworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgaW5saW5lIGZv
cm0gb2YgdGhlIGBpZmAgYW5kIGB1bmxlc3NgIGhlbHBlcnMgZXhwZWN0IHR3byBvciAnICsgJ3Ro
cmVlIGFyZ3VtZW50cywgZS5nLiBge3tpZiB0cmlhbEV4cGlyZWQgXCdFeHBpcmVkXCcgZXhwaXJ5
RGF0ZX19YCAnICsgJ29yIGB7e3VubGVzcyBpc0ZpcnN0TG9naW4gXCdXZWxjb21lIGJhY2shXCd9
fWAuJywgISFvcHRpb25zLnRlbXBsYXRlLnlpZWxkIHx8IHBhcmFtcy5sZW5ndGggPT09IDIgfHwg
cGFyYW1zLmxlbmd0aCA9PT0gMyk7CisKKyAgICBpZiAodHJ1dGh5KSB7CisgICAgICBpZiAob3B0
aW9ucy50ZW1wbGF0ZS55aWVsZCkgeworICAgICAgICBvcHRpb25zLnRlbXBsYXRlLnlpZWxkKCk7
CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGFyYW1zWzFdOworICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICBpZiAob3B0aW9ucy5pbnZlcnNlLnlpZWxkKSB7CisgICAgICAgIG9w
dGlvbnMuaW52ZXJzZS55aWVsZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBh
cmFtc1syXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLmlmSGVscGVyID0gaWZI
ZWxwZXI7CisgIGV4cG9ydHMudW5sZXNzSGVscGVyID0gdW5sZXNzSGVscGVyOworfSk7Citlbmlm
ZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9jJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL2hlbHBlcicsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlckh0bWxiYXJzSGVscGVyLCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgorICAgIENhbGxzIFtFbWJlci5TdHJpbmcu
bG9jXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2xvYykgd2l0aCB0aGUK
KyAgICBwcm92aWRlZCBzdHJpbmcuIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6
ZSB0ZXh0IHdpdGhpbiBhIHRlbXBsYXRlLgorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIuU1RSSU5HUyA9IHsKKyAgICAgICdfd2VsY29tZV8nOiAnQm9u
am91cicKKyAgICB9OworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGRpdiBj
bGFzcz0nbWVzc2FnZSc+CisgICAgICB7e2xvYyAnX3dlbGNvbWVfJ319CisgICAgPC9kaXY+Cisg
ICAgYGBgCisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGNsYXNzPSdtZXNzYWdlJz4KKyAgICAg
IEJvbmpvdXIKKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgU2VlIFtFbWJlci5TdHJpbmcu
bG9jXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2xvYykgZm9yIGhvdyB0
bworICAgIHNldCB1cCBsb2NhbGl6ZWQgc3RyaW5nIHJlZmVyZW5jZXMuCisgIAorICAgIEBtZXRo
b2QgbG9jCisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgIEBwYXJhbSB7U3Ry
aW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQuCisgICAgQHNlZSB7RW1iZXIuU3RyaW5nI2xv
Y30KKyAgICBAcHVibGljCisgICovCisgIGZ1bmN0aW9uIGxvY0hlbHBlcihwYXJhbXMpIHsKKyAg
ICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5sb2MuYXBwbHkobnVsbCwgcGFyYW1z
KTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBl
cihsb2NIZWxwZXIpOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9nJywg
WydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2xvZ2dlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxMb2dnZXIpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gbG9nSGVscGVyOworCisgIC8qKgorICAgIGBsb2dgIGFsbG93cyB5b3UgdG8gb3V0cHV0
IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nCisgICAgY29u
dGV4dC4gYGxvZ2AgYWxzbyBhY2NlcHRzIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIHN0cmluZ3Mg
b3IgbnVtYmVycy4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7bG9nICJteVZhcmlhYmxl
OiIgbXlWYXJpYWJsZSB9fQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxvZworICAgIEBmb3Ig
RW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcGFyYW0geyp9IHZhbHVlcworICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBsb2dIZWxwZXIodmFsdWVzKSB7CisgICAgX2VtYmVyTWV0
YWxMb2dnZXIuZGVmYXVsdC5sb2cuYXBwbHkobnVsbCwgdmFsdWVzKTsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvd2l0aCcsIFsnZXhwb3J0cycsICdlbWJlci12aWV3
cy9zdHJlYW1zL3Nob3VsZF9kaXNwbGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3
c1N0cmVhbXNTaG91bGRfZGlzcGxheSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzLmRlZmF1bHQgPSB3aXRoSGVscGVyOworCisgIC8qKgorICAgIFVzZSB0aGUgYHt7d2l0aH19
YCBoZWxwZXIgd2hlbiB5b3Ugd2FudCB0byBhbGlhcyBhIHByb3BlcnR5IHRvIGEgbmV3IG5hbWUu
IFRoaXMgaXMgaGVscGZ1bAorICAgIGZvciBzZW1hbnRpYyBjbGFyaXR5IGFzIGl0IGFsbG93cyB5
b3UgdG8gcmV0YWluIGRlZmF1bHQgc2NvcGUgb3IgdG8gcmVmZXJlbmNlIGEgcHJvcGVydHkgZnJv
bSBhbm90aGVyCisgICAgYHt7d2l0aH19YCBibG9jay4KKyAgCisgICAgSWYgdGhlIGFsaWFzZWQg
cHJvcGVydHkgaXMgImZhbHNleSIsIGZvciBleGFtcGxlOiBgZmFsc2VgLCBgdW5kZWZpbmVkYCBg
bnVsbGAsIGAiImAsIGAwYCwgTmFOIG9yCisgICAgYW4gZW1wdHkgYXJyYXksIHRoZSBibG9jayB3
aWxsIG5vdCBiZSByZW5kZXJlZC4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBXaWxs
IG9ubHkgcmVuZGVyIGlmIHVzZXIucG9zdHMgY29udGFpbnMgaXRlbXN9fQorICAgIHt7I3dpdGgg
dXNlci5wb3N0cyBhcyB8YmxvZ1Bvc3RzfH19CisgICAgICA8ZGl2IGNsYXNzPSJub3RpY2UiPgor
ICAgICAgICBUaGVyZSBhcmUge3tibG9nUG9zdHMubGVuZ3RofX0gYmxvZyBwb3N0cyB3cml0dGVu
IGJ5IHt7dXNlci5uYW1lfX0uCisgICAgICA8L2Rpdj4KKyAgICAgIHt7I2VhY2ggYmxvZ1Bvc3Rz
IGFzIHxwb3N0fH19CisgICAgICAgIDxsaT57e3Bvc3QudGl0bGV9fTwvbGk+CisgICAgICB7ey9l
YWNofX0KKyAgICB7ey93aXRofX0KKyAgICBgYGAKKyAgCisgICAgV2l0aG91dCB0aGUgYGFzYCBv
cGVyYXRvciwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byByZWZlcmVuY2UgYHVzZXIubmFtZWAg
aW4gdGhlIGV4YW1wbGUgYWJvdmUuCisgIAorICAgIE5PVEU6IFRoZSBhbGlhcyBzaG91bGQgbm90
IHJldXNlIGEgbmFtZSBmcm9tIHRoZSBib3VuZCBwcm9wZXJ0eSBwYXRoLgorICAgIEZvciBleGFt
cGxlOiBge3sjd2l0aCBmb28uYmFyIGFzIHxmb298fX1gIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVz
ZSBpdCBhdHRlbXB0cyB0byBhbGlhcyB1c2luZworICAgIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBw
cm9wZXJ0eSBwYXRoLCBgZm9vYC4gSW5zdGVhZCwgdXNlIGB7eyN3aXRoIGZvby5iYXIgYXMgfGJh
enx9fWAuCisgIAorICAgIEBtZXRob2Qgd2l0aAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhl
bHBlcnMKKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgIEByZXR1cm4ge1N0cmluZ30g
SFRNTCBzdHJpbmcKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gd2l0aEhlbHBlcihw
YXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICBpZiAoX2VtYmVyVmlld3NTdHJlYW1zU2hvdWxk
X2Rpc3BsYXkuZGVmYXVsdChwYXJhbXNbMF0pKSB7CisgICAgICBvcHRpb25zLnRlbXBsYXRlLnlp
ZWxkKFtwYXJhbXNbMF1dKTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW52ZXJzZSAmJiBvcHRp
b25zLmludmVyc2UueWllbGQpIHsKKyAgICAgIG9wdGlvbnMuaW52ZXJzZS55aWVsZChbXSk7Cisg
ICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1ibG9jaycs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gYmluZEJsb2NrOworCisgIGZ1bmN0aW9uIGJpbmRCbG9jayhlbnYs
IHNjb3BlLCBibG9jaykgeworICAgIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8
IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gJ2RlZmF1bHQnIDogYXJndW1lbnRzWzNdOwor
CisgICAgc2NvcGUuYmluZEJsb2NrKG5hbWUsIGJsb2NrKTsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtbG9jYWwnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
c3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9wcm94eS1zdHJlYW0nXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSwgX2VtYmVyTWV0YWxTdHJl
YW1zUHJveHlTdHJlYW0pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBiaW5kTG9jYWw7CisKKyAgZnVuY3Rpb24gYmluZExvY2FsKGVudiwgc2NvcGUsIGtleSwg
dmFsdWUpIHsKKyAgICAvLyBUT0RPOiBXaGF0IGlzIHRoZSBjYXVzZSBvZiB0aGVzZSBjYXNlcz8K
KyAgICBpZiAoc2NvcGUuaGFzT3duTG9jYWwoa2V5KSkgeworICAgICAgdmFyIGV4aXN0aW5nID0g
c2NvcGUuZ2V0TG9jYWwoa2V5KTsKKyAgICAgIGlmIChleGlzdGluZyAhPT0gdmFsdWUpIHsKKyAg
ICAgICAgZXhpc3Rpbmcuc2V0U291cmNlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2Ugewor
ICAgICAgdmFyIG5ld1ZhbHVlID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLndyYXAodmFsdWUs
IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQsIGtleSk7CisgICAgICBzY29w
ZS5iaW5kTG9jYWwoa2V5LCBuZXdWYWx1ZSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgiZW1i
ZXItaHRtbGJhcnMvaG9va3MvYmluZC1zY29wZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhw
b3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gYmluZFNjb3Bl
OworCisgIGZ1bmN0aW9uIGJpbmRTY29wZShlbnYsIHNjb3BlKSB7fQorfSk7CitlbmlmZWQoJ2Vt
YmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2VsZicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbCcs
ICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbSddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWwsIF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gYmluZFNlbGY7CisKKyAgZnVuY3Rpb24g
YmluZFNlbGYoZW52LCBzY29wZSwgc2VsZikgeworICAgIGlmIChzZWxmICYmIHNlbGYuaXNWaWV3
KSB7CisgICAgICBpZiAoISFfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9W
SUVXX1NVUFBPUlQpIHsKKyAgICAgICAgc2NvcGUuYmluZExvY2FsKCd2aWV3JywgbmV3U3RyZWFt
KHNlbGYsICd2aWV3JykpOworICAgICAgfQorCisgICAgICB2YXIgX3NlbGZTdHJlYW0gPSBuZXdT
dHJlYW0oc2VsZiwgJycpOworCisgICAgICBpZiAoc2VsZi5pc0dsaW1tZXJDb21wb25lbnQpIHsK
KyAgICAgICAgc2NvcGUuYmluZFNlbGYoX3NlbGZTdHJlYW0pOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgc2NvcGUuYmluZFNlbGYobmV3U3RyZWFtKF9zZWxmU3RyZWFtLmdldEtleSgnY29udGV4
dCcpLCAnJykpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHNl
bGZTdHJlYW0gPSBuZXdTdHJlYW0oc2VsZiwgJycpOworICAgIHNjb3BlLmJpbmRTZWxmKHNlbGZT
dHJlYW0pOworICB9CisKKyAgZnVuY3Rpb24gbmV3U3RyZWFtKG5ld1ZhbHVlLCBrZXkpIHsKKyAg
ICByZXR1cm4gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFs
dWUsIGtleSk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLXNo
YWRvdy1zY29wZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVh
bSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0pIHsK
KyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBiaW5kU2hhZG93U2Nv
cGU7CisKKyAgZnVuY3Rpb24gYmluZFNoYWRvd1Njb3BlKGVudiwgcGFyZW50U2NvcGUsIHNoYWRv
d1Njb3BlLCBvcHRpb25zKSB7CisgICAgaWYgKCFvcHRpb25zKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgdmFyIHZpZXcgPSBvcHRpb25zLnZpZXc7CisgICAgaWYgKHZpZXcgJiYgIXZp
ZXcuaXNDb21wb25lbnQpIHsKKyAgICAgIHNoYWRvd1Njb3BlLmJpbmRMb2NhbCgndmlldycsIG5l
d1N0cmVhbSh2aWV3LCAndmlldycpKTsKKworICAgICAgaWYgKHZpZXcuaXNWaWV3KSB7CisgICAg
ICAgIHNoYWRvd1Njb3BlLmJpbmRTZWxmKG5ld1N0cmVhbShzaGFkb3dTY29wZS5nZXRMb2NhbCgn
dmlldycpLmdldEtleSgnY29udGV4dCcpLCAnJykpOworICAgICAgfQorICAgIH0KKworICAgIHNo
YWRvd1Njb3BlLmJpbmRWaWV3KHZpZXcpOworCisgICAgaWYgKHZpZXcgJiYgb3B0aW9ucy5hdHRy
cykgeworICAgICAgc2hhZG93U2NvcGUuYmluZENvbXBvbmVudCh2aWV3KTsKKyAgICB9CisKKyAg
ICBpZiAoJ2F0dHJzJyBpbiBvcHRpb25zKSB7CisgICAgICBzaGFkb3dTY29wZS5iaW5kQXR0cnMo
b3B0aW9ucy5hdHRycyk7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRvd1Njb3BlOworICB9CisK
KyAgZnVuY3Rpb24gbmV3U3RyZWFtKG5ld1ZhbHVlLCBrZXkpIHsKKyAgICByZXR1cm4gbmV3IF9l
bWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFsdWUsIGtleSk7CisgIH0K
K30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9jbGFzc2lmeScsIFsnZXhwb3J0cycs
ICdlbWJlci1odG1sYmFycy91dGlscy9pcy1jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlckh0bWxiYXJzVXRpbHNJc0NvbXBvbmVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNsYXNzaWZ5OworCisgIGZ1bmN0aW9uIGNsYXNzaWZ5KGVu
diwgc2NvcGUsIHBhdGgpIHsKKyAgICBpZiAoX2VtYmVySHRtbGJhcnNVdGlsc0lzQ29tcG9uZW50
LmRlZmF1bHQoZW52LCBzY29wZSwgcGF0aCkpIHsKKyAgICAgIHJldHVybiAnY29tcG9uZW50JzsK
KyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxi
YXJzL2hvb2tzL2NsZWFudXAtcmVuZGVyLW5vZGUiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4
cG9ydHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1s
YmFycworICAqLworCisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjbGVh
bnVwUmVuZGVyTm9kZTsKKworICBmdW5jdGlvbiBjbGVhbnVwUmVuZGVyTm9kZShyZW5kZXJOb2Rl
KSB7CisgICAgaWYgKHJlbmRlck5vZGUuY2xlYW51cCkgeworICAgICAgcmVuZGVyTm9kZS5jbGVh
bnVwKCk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvY29t
cG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2ZlYXR1cmVzJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvY29tcG9uZW50LW5vZGUtbWFu
YWdlcicsICdlbWJlci12aWV3cy9zeXN0ZW0vYnVpbGQtY29tcG9uZW50LXRlbXBsYXRlJywgJ2Vt
YmVyLWh0bWxiYXJzL3V0aWxzL2xvb2t1cC1jb21wb25lbnQnLCAnZW1iZXItbWV0YWwvYXNzaWdu
JywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1tZXRhbC9jYWNoZScsICdlbWJl
ci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdlbWJlci1odG1sYmFycy91dGlscy9l
eHRyYWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1
cmUtY29tcG9uZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJIdG1sYmFyc05vZGVNYW5hZ2Vyc0NvbXBvbmVudE5vZGVN
YW5hZ2VyLCBfZW1iZXJWaWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVtcGxhdGUsIF9lbWJlckh0
bWxiYXJzVXRpbHNMb29rdXBDb21wb25lbnQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1iZXJNZXRh
bEVtcHR5X29iamVjdCwgX2VtYmVyTWV0YWxDYWNoZSwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29r
dXBIZWxwZXIsIF9lbWJlckh0bWxiYXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNvbXBvbmVudEhvb2s7CisKKyAgdmFyIElTX0FOR0xFX0NB
Q0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7
CisgICAgcmV0dXJuIGtleS5tYXRjaCgvXihAPyk8KC4qKT4kLyk7CisgIH0pOworCisgIGZ1bmN0
aW9uIGNvbXBvbmVudEhvb2socmVuZGVyTm9kZSwgZW52LCBzY29wZSwgX3RhZ05hbWUsIHBhcmFt
cywgYXR0cnMsIHRlbXBsYXRlcywgdmlzaXRvcikgeworICAgIHZhciBzdGF0ZSA9IHJlbmRlck5v
ZGUuZ2V0U3RhdGUoKTsKKworICAgIHZhciB0YWdOYW1lID0gX3RhZ05hbWU7CisgICAgaWYgKF9l
bWJlckh0bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RPVF9DQUNIRS5nZXQodGFn
TmFtZSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBlbnYuaG9va3MuZ2V0KGVudiwgc2NvcGUsIHRh
Z05hbWUpOworICAgICAgdmFyIGNvbXBvbmVudENlbGwgPSBzdHJlYW0udmFsdWUoKTsKKyAgICAg
IGlmIChfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5pc0NvbXBvbmVudENl
bGwoY29tcG9uZW50Q2VsbCkpIHsKKyAgICAgICAgdGFnTmFtZSA9IGNvbXBvbmVudENlbGxbX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuQ09NUE9ORU5UX1BBVEhdOworCisg
ICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3NpbmcgcG9zaXRpb25hbCBwYXJhbXMgYmVmb3Jl
IG1lcmdpbmcgaW50byBhIGhhc2ggbXVzdCBiZSBkb25lCisgICAgICAgICAqIGhlcmUgdG8gYXZv
aWQgcHJvYmxlbXMgd2l0aCByZXN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycyByZW5kZXJlZCB1c2lu
ZworICAgICAgICAgKiB0aGUgZG90IG5vdGF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBD
bG9zdXJlIGNvbXBvbmVudHMgKGZvciB0aGUgY29udGV4dHVhbCBjb21wb25lbnQgZmVhdHVyZSkg
ZG8gbm90CisgICAgICAgICAqIGFjdHVhbGx5IGtlZXAgdGhlIHBvc2l0aW9uYWwgcGFyYW1zLCBi
dXQgcHJvY2VzcyB0aGVtIGF0IGVhY2ggbGV2ZWwuCisgICAgICAgICAqIFRoZXJlZm9yZSwgd2hl
biByZW5kZXJpbmcgYSBjbG9zdXJlIGNvbXBvbmVudCB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAg
ICAgICogaGVscGVyIHdlIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMgYW5kIGF0dHJpYnV0ZXMgYW5k
IHRoZW4gbWVyZ2UgdGhvc2UKKyAgICAgICAgICogb24gdG9wIG9mIHRoZSBjbG9zdXJlIGNvbXBv
bmVudCBhdHRyaWJ1dGVzLgorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgdmFyIG5l
d0F0dHJzID0gX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChuZXcgX2VtYmVyTWV0YWxFbXB0eV9v
YmplY3QuZGVmYXVsdCgpLCBhdHRycyk7CisgICAgICAgIF9lbWJlckh0bWxiYXJzS2V5d29yZHND
bG9zdXJlQ29tcG9uZW50LnByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50
Q2VsbCwgcGFyYW1zLCBuZXdBdHRycyk7CisgICAgICAgIHBhcmFtcyA9IFtdOworICAgICAgICBh
dHRycyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50Lm1lcmdlSW5OZXdI
YXNoKGNvbXBvbmVudENlbGxbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQu
Q09NUE9ORU5UX0hBU0hdLCBuZXdBdHRycyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRGV0
ZXJtaW5lIGlmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb3IgYSByZS1yZW5kZXIuCisgICAg
aWYgKHN0YXRlLm1hbmFnZXIpIHsKKyAgICAgIHZhciBzbSA9IHN0YXRlLm1hbmFnZXI7CisgICAg
ICB2YXIgdGVtcGxhdGVNZXRhID0gbnVsbDsKKyAgICAgIGlmIChzbS5ibG9jaykgeworICAgICAg
ICB0ZW1wbGF0ZU1ldGEgPSBzbS5ibG9jay50ZW1wbGF0ZS5tZXRhOworICAgICAgfSBlbHNlIGlm
IChzbS5zY29wZSAmJiBzbS5zY29wZS5fdmlldykgeworICAgICAgICB0ZW1wbGF0ZU1ldGEgPSBz
bS5zY29wZS5fdmlldy50ZW1wbGF0ZS5tZXRhOworICAgICAgfQorICAgICAgZW52Lm1ldGEubW9k
dWxlTmFtZSA9IHRlbXBsYXRlTWV0YSAmJiB0ZW1wbGF0ZU1ldGEubW9kdWxlTmFtZSB8fCBlbnYu
bWV0YSAmJiBlbnYubWV0YS5tb2R1bGVOYW1lOworICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc0V4
dHJhY3RQb3NpdGlvbmFsUGFyYW1zLmRlZmF1bHQocmVuZGVyTm9kZSwgc20uY29tcG9uZW50LmNv
bnN0cnVjdG9yLCBwYXJhbXMsIGF0dHJzLCBmYWxzZSk7CisgICAgICBzdGF0ZS5tYW5hZ2VyLnJl
cmVuZGVyKGVudiwgYXR0cnMsIHZpc2l0b3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IHZhciBpc0FuZ2xlQnJhY2tldCA9IGZhbHNlOworICAgIHZhciBpc1RvcExldmVsID0gZmFsc2U7
CisgICAgdmFyIGlzRGFzaGVyaXplZCA9IGZhbHNlOworCisgICAgdmFyIGFuZ2xlcyA9IElTX0FO
R0xFX0NBQ0hFLmdldCh0YWdOYW1lKTsKKworICAgIGlmIChhbmdsZXMpIHsKKyAgICAgIHRhZ05h
bWUgPSBhbmdsZXNbMl07CisgICAgICBpc0FuZ2xlQnJhY2tldCA9IHRydWU7CisgICAgICBpc1Rv
cExldmVsID0gISFhbmdsZXNbMV07CisgICAgfQorCisgICAgaWYgKF9lbWJlckh0bWxiYXJzU3lz
dGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RBU0hfQ0FDSEUuZ2V0KHRhZ05hbWUpKSB7CisgICAg
ICBpc0Rhc2hlcml6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZhciBwYXJlbnRWaWV3ID0gZW52
LnZpZXc7CisKKyAgICAvLyB8IFRvcC1sZXZlbCAgICB8IEludm9jYXRpb246IDxmb28tYmFyPiAg
ICB8IEludm9jYXRpb246IHt7Zm9vLWJhcn19ICB8CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAg
IC8vIHwgPGRpdj4gICAgICAgIHwgPGRpdj4gaXMgY29tcG9uZW50IGVsICAgIHwgbm8gc3BlY2lh
bCBzZW1hbnRpY3MgKGEpIHwKKyAgICAvLyB8IDxmb28tYmFyPiAgICB8IDxmb28tYmFyPiBpcyBp
ZGVudGl0eSBlbCB8IEVXVEYgICAgICAgICAgICAgICAgICAgICB8CisgICAgLy8gfCA8YmFyLWJh
ej4gICAgfCByZWN1cnNpdmUgaW52b2NhdGlvbiAgICAgfCBubyBzcGVjaWFsIHNlbWFudGljcyAg
ICAgfAorICAgIC8vIHwge3thbnl0aGluZ319IHwgRVdURiAgICAgICAgICAgICAgICAgICAgIHwg
bm8gc3BlY2lhbCBzZW1hbnRpY3MgICAgIHwKKyAgICAvLworICAgIC8vIChhKSBuZWVkcyB0byBi
ZSBpbXBsZW1lbnRlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHVzdWFsIHNlbWFudGljcyBvZgor
ICAgIC8vICAgICA8ZGl2PiBhcmUgZGVmaW5lZCBieSB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFu
ZCB3ZSBuZWVkIHRvIGVtdWxhdGUKKyAgICAvLyAgICAgdGhvc2Ugc2VtYW50aWNzLgorCisgICAg
dmFyIGN1cnJlbnRDb21wb25lbnQgPSBlbnYudmlldzsKKyAgICB2YXIgaXNJbnZva2VkV2l0aEFu
Z2xlcyA9IGN1cnJlbnRDb21wb25lbnQgJiYgY3VycmVudENvbXBvbmVudC5faXNBbmdsZUJyYWNr
ZXQ7CisgICAgdmFyIGlzSW52b2tlZFdpdGhDdXJsaWVzID0gY3VycmVudENvbXBvbmVudCAmJiAh
Y3VycmVudENvbXBvbmVudC5faXNBbmdsZUJyYWNrZXQ7CisKKyAgICAvLyA8ZGl2PiBhdCB0aGUg
dG9wIGxldmVsIG9mIGEgPGZvby1iYXI+IGludm9jYXRpb24uCisgICAgdmFyIGlzQ29tcG9uZW50
SFRNTEVsZW1lbnQgPSBpc0FuZ2xlQnJhY2tldCAmJiAhaXNEYXNoZXJpemVkICYmIGlzSW52b2tl
ZFdpdGhBbmdsZXM7CisKKyAgICAvLyA8Zm9vLWJhcj4gYXQgdGhlIHRvcCBsZXZlbCBvZiBhIDxm
b28tYmFyPiBpbnZvY2F0aW9uLgorICAgIHZhciBpc0NvbXBvbmVudElkZW50aXR5RWxlbWVudCA9
IGlzQW5nbGVCcmFja2V0ICYmIGlzVG9wTGV2ZWwgJiYgdGFnTmFtZSA9PT0gZW52LnZpZXcudGFn
TmFtZTsKKworICAgIC8vIDxkaXY+IGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSB7e2Zvby1iYXJ9fSBp
bnZvY2F0aW9uLgorICAgIHZhciBpc05vcm1hbEhUTUxFbGVtZW50ID0gaXNBbmdsZUJyYWNrZXQg
JiYgIWlzRGFzaGVyaXplZCAmJiBpc0ludm9rZWRXaXRoQ3VybGllczsKKworICAgIHZhciBjb21w
b25lbnQgPSB1bmRlZmluZWQsCisgICAgICAgIGxheW91dCA9IHVuZGVmaW5lZDsKKyAgICBpZiAo
aXNEYXNoZXJpemVkIHx8ICFpc0FuZ2xlQnJhY2tldCkgeworICAgICAgdmFyIG9wdGlvbnMgPSB7
fTsKKworICAgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0YSAmJiBlbnYubWV0YS5tb2R1bGVO
YW1lOworCisgICAgICBpZiAobW9kdWxlTmFtZSkgeworICAgICAgICBvcHRpb25zLnNvdXJjZSA9
ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlc3VsdCA9
IF9lbWJlckh0bWxiYXJzVXRpbHNMb29rdXBDb21wb25lbnQuZGVmYXVsdChlbnYub3duZXIsIHRh
Z05hbWUsIG9wdGlvbnMpOworCisgICAgICBjb21wb25lbnQgPSByZXN1bHQuY29tcG9uZW50Owor
ICAgICAgbGF5b3V0ID0gcmVzdWx0LmxheW91dDsKKworICAgICAgaWYgKGlzQW5nbGVCcmFja2V0
ICYmIGlzRGFzaGVyaXplZCAmJiAhY29tcG9uZW50ICYmICFsYXlvdXQpIHsKKyAgICAgICAgaXND
b21wb25lbnRIVE1MRWxlbWVudCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnSFRNTEJhcnMgZXJyb3I6IENvdWxkIG5vdCBmaW5kIGNvbXBv
bmVudCBuYW1lZCAiJyArIHRhZ05hbWUgKyAnIiAobm8gY29tcG9uZW50IG9yIHRlbXBsYXRlIHdp
dGggdGhhdCBuYW1lIHdhcyBmb3VuZCknLCAhIShjb21wb25lbnQgfHwgbGF5b3V0KSk7CisgICAg
ICB9CisgICAgfQorCisgICAgaWYgKGlzQ29tcG9uZW50SWRlbnRpdHlFbGVtZW50IHx8IGlzQ29t
cG9uZW50SFRNTEVsZW1lbnQpIHsKKyAgICAgIC8vIEluc2lkZSB0aGUgbGF5b3V0IGZvciA8Zm9v
LWJhcj4gaW52b2tlZCB3aXRoIGFuZ2xlcywgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQK
KyAgICAgIC8vIGZvciB0aGUgY29tcG9uZW50LiBJdCBjYW4gZWl0aGVyIGJlIGA8Zm9vLWJhcj5g
ICh0aGUgImlkZW50aXR5IGVsZW1lbnQiKSBvciBhbnkKKyAgICAgIC8vIG5vcm1hbCBIVE1MIGVs
ZW1lbnQgKG5vbi1kYXNoZXJpemVkKS4KKyAgICAgIHZhciB0ZW1wbGF0ZU9wdGlvbnMgPSB7Cisg
ICAgICAgIGNvbXBvbmVudDogY3VycmVudENvbXBvbmVudCwKKyAgICAgICAgdGFnTmFtZTogdGFn
TmFtZSwKKyAgICAgICAgaXNBbmdsZUJyYWNrZXQ6IHRydWUsCisgICAgICAgIGlzQ29tcG9uZW50
RWxlbWVudDogdHJ1ZSwKKyAgICAgICAgb3V0ZXJBdHRyczogc2NvcGUuZ2V0QXR0cnMoKSwKKyAg
ICAgICAgcGFyZW50U2NvcGU6IHNjb3BlCisgICAgICB9OworCisgICAgICB2YXIgY29udGVudE9w
dGlvbnMgPSB7IHRlbXBsYXRlczogdGVtcGxhdGVzLCBzY29wZTogc2NvcGUgfTsKKworICAgICAg
dmFyIF9idWlsZENvbXBvbmVudFRlbXBsYXRlID0gX2VtYmVyVmlld3NTeXN0ZW1CdWlsZENvbXBv
bmVudFRlbXBsYXRlLmRlZmF1bHQodGVtcGxhdGVPcHRpb25zLCBhdHRycywgY29udGVudE9wdGlv
bnMpOworCisgICAgICB2YXIgYmxvY2sgPSBfYnVpbGRDb21wb25lbnRUZW1wbGF0ZS5ibG9jazsK
KworICAgICAgYmxvY2suaW52b2tlKGVudiwgW10sIHVuZGVmaW5lZCwgcmVuZGVyTm9kZSwgc2Nv
cGUsIHZpc2l0b3IpOworICAgIH0gZWxzZSBpZiAoaXNOb3JtYWxIVE1MRWxlbWVudCkgeworICAg
ICAgdmFyIGJsb2NrID0gX2VtYmVyVmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmJ1
aWxkSFRNTFRlbXBsYXRlKHRhZ05hbWUsIGF0dHJzLCB7IHRlbXBsYXRlczogdGVtcGxhdGVzLCBz
Y29wZTogc2NvcGUgfSk7CisgICAgICBibG9jay5pbnZva2UoZW52LCBbXSwgdW5kZWZpbmVkLCBy
ZW5kZXJOb2RlLCBzY29wZSwgdmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEludm9r
aW5nIGEgY29tcG9uZW50IGZyb20gdGhlIG91dHNpZGUgKGVpdGhlciB2aWEgPGZvby1iYXI+IGFu
Z2xlIGJyYWNrZXRzCisgICAgICAvLyBvciB7e2Zvby1iYXJ9fSBsZWdhY3kgY3VybGllcykuCisK
KyAgICAgIHZhciBtYW5hZ2VyID0gX2VtYmVySHRtbGJhcnNOb2RlTWFuYWdlcnNDb21wb25lbnRO
b2RlTWFuYWdlci5kZWZhdWx0LmNyZWF0ZShyZW5kZXJOb2RlLCBlbnYsIHsKKyAgICAgICAgdGFn
TmFtZTogdGFnTmFtZSwKKyAgICAgICAgcGFyYW1zOiBwYXJhbXMsCisgICAgICAgIGF0dHJzOiBh
dHRycywKKyAgICAgICAgcGFyZW50VmlldzogcGFyZW50VmlldywKKyAgICAgICAgdGVtcGxhdGVz
OiB0ZW1wbGF0ZXMsCisgICAgICAgIGlzQW5nbGVCcmFja2V0OiBpc0FuZ2xlQnJhY2tldCwKKyAg
ICAgICAgaXNUb3BMZXZlbDogaXNUb3BMZXZlbCwKKyAgICAgICAgY29tcG9uZW50OiBjb21wb25l
bnQsCisgICAgICAgIGxheW91dDogbGF5b3V0LAorICAgICAgICBwYXJlbnRTY29wZTogc2NvcGUK
KyAgICAgIH0pOworCisgICAgICBzdGF0ZS5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgIG1hbmFn
ZXIucmVuZGVyKGVudiwgdmlzaXRvcik7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
aHRtbGJhcnMvaG9va3MvY29uY2F0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzKSB7Cisg
IC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8K
KworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gY29uY2F0OworCisgIGZ1
bmN0aW9uIGNvbmNhdChlbnYsIHBhcnRzKSB7CisgICAgcmV0dXJuIF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLmNvbmNhdChwYXJ0cywgJycpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJh
cnMvaG9va3MvY3JlYXRlLWZyZXNoLXNjb3BlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N0
cmVhbXMvcHJveHktc3RyZWFtJywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0sIF9lbWJlck1ldGFsRW1w
dHlfb2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjcmVh
dGVGcmVzaFNjb3BlOworICBleHBvcnRzLmNyZWF0ZUNoaWxkU2NvcGUgPSBjcmVhdGVDaGlsZFNj
b3BlOworCisgIC8qCisgICAgRW1iZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBIVE1MQmFycyBjcmVh
dGVzIGFuIGVucmljaGVkIHNjb3BlLgorICAKKyAgICAqIHNlbGY6IHNhbWUgYXMgSFRNTEJhcnMs
IHRoaXMgZmllbGQgcmVwcmVzZW50cyB0aGUgZHluYW1pYyBsb29rdXAKKyAgICAgIG9mIHJvb3Qg
a2V5cyB0aGF0IGFyZSBub3Qgc3BlY2lhbCBrZXl3b3JkcyBvciBibG9jayBhcmd1bWVudHMuCisg
ICAgKiBibG9ja3M6IHNhbWUgYXMgSFRNTEJhcnMsIGEgYnVuZGxlIG9mIG5hbWVkIGJsb2NrcyB0
aGUgbGF5b3V0CisgICAgICBjYW4geWllbGQgdG8uCisgICAgKiBjb21wb25lbnQ6IGluZGljYXRl
cyB0aGF0IHRoZSBzY29wZSBpcyB0aGUgbGF5b3V0IG9mIGEgY29tcG9uZW50LAorICAgICAgd2hp
Y2ggaXMgdXNlZCB0byB0cmlnZ2VyIGxpZmVjeWNsZSBob29rcyBmb3IgdGhlIGNvbXBvbmVudCB3
aGVuCisgICAgICBvbmUgb2YgdGhlIHN0cmVhbXMgaW4gaXRzIGxheW91dCBmaXJlcy4KKyAgICAq
IGF0dHJzOiBhIG1hcCBvZiBrZXktdmFsdWUgYXR0cmlidXRlcyBzZW50IGluIGJ5IHRoZSBpbnZv
a2VyIG9mCisgICAgICBhIHRlbXBsYXRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBjb21wb25lbnQn
cyBsYXlvdXQuCisgICAgKiBsb2NhbHM6IGEgbWFwIG9mIGxvY2FscywgcHJvZHVjZWQgYnkgYmxv
Y2sgcGFyYW1zIChgYXMgfGEgYnxgKQorICAgICogbG9jYWxQcmVzZW50OiBhIG1hcCBvZiBhdmFp
bGFibGUgbG9jYWxzIHRvIGF2b2lkIGV4cGVuc2l2ZQorICAgICAgYGhhc093blByb3BlcnR5YCBj
aGVja3MuCisgIAorICAgIFRoZSBgc2VsZmAgZmllbGQgaGFzIHR3byBzcGVjaWFsIG1lYW5pbmdz
OgorICAKKyAgICAqIElmIGBzZWxmYCBpcyBhIHZpZXcgKGBpc1ZpZXdgKSwgdGhlIGFjdHVhbCBI
VE1MQmFycyBgc2VsZmAgYmVjb21lcworICAgICAgdGhlIHZpZXcncyBgY29udGV4dGAuIFRoaXMg
aXMgbGVnYWN5IHNlbWFudGljczsgY29tcG9uZW50cyBhbHdheXMKKyAgICAgIHVzZSB0aGUgY29t
cG9uZW50IGl0c2VsZiBhcyB0aGUgYHRoaXNgLgorICAgICogSWYgYHNlbGZgIGlzIGEgdmlldywg
dHdvIHNwZWNpYWwgbG9jYWxzIGFyZSBjcmVhdGVkOiBgdmlld2AgYW5kCisgICAgICBgY29udHJv
bGxlcmAuIFRoZXNlIGxvY2FscyBhcmUgbGVnYWN5IHNlbWFudGljcy4KKyAgCisgICAgKipJTVBP
UlRBTlQqKjogVGhlcmUgYXJlIHR3byBwbGFjZXMgaW4gRW1iZXIgd2hlcmUgdGhlIGFtYmllbnQK
KyAgICBjb250cm9sbGVyIGlzIGxvb2tlZCB1cC4gQm90aCBvZiB0aG9zZSBwbGFjZXMgdXNlIHRo
ZSBwcmVzZW5jZQorICAgIG9mIGBzY29wZS5sb2NhbHMudmlld2AgdG8gaW5kaWNhdGUgdGhhdCB0
aGUgY29udHJvbGxlciBsb29rdXAKKyAgICBzaG91bGQgYmUgZHluYW1pYyBvZmYgb2YgdGhlIGFt
YmllbnQgdmlldy4gSWYgYHNjb3BlLmxvY2Fscy52aWV3YAorICAgIGRvZXMgbm90IGV4aXN0LCB0
aGUgY29kZSBhc3N1bWVzIHRoYXQgaXQgaXMgaW5zaWRlIG9mIGEgdG9wLWxldmVsCisgICAgdGVt
cGxhdGUgKHdpdGhvdXQgYSB2aWV3KSBhbmQgdXNlcyB0aGUgYHNlbGZgIGl0c2VsZiBhcyB0aGUK
KyAgICBjb250cm9sbGVyLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHJlbW92ZSBgc2NvcGUubG9j
YWxzLnZpZXdgCisgICAgKHBlcmhhcHMgYmVjYXVzZSB3ZSBhcmUgZmluYWxseSByZWFkeSB0byBz
aGVkIHRoZSB2aWV3IGtleXdvcmQpLAorICAgIHRoZXJlIG1heSBiZSB1bmV4cGVjdGVkIGNvbnNl
cXVlbmNlcyBvbiBjb250cm9sbGVyIHNlbWFudGljcy4KKyAgICBJZiB0aGlzIGhhcHBlbnMgdG8g
eW91LCBJIGhvcGUgeW91IGZpbmQgdGhpcyBjb21tZW50LiAtIFlLICYgVEQKKyAgCisgICAgSW4g
cHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCB3aXRoIHRoZSBleGNlcHRpb25zIG9mIHRvcC1sZXZl
bAorICAgIHZpZXctbGVzcyB0ZW1wbGF0ZXMgYW5kIHRoZSBsZWdhY3kgYGNvbnRyb2xsZXI9Zm9v
YCBzZW1hbnRpY3MsCisgICAgdGhlIGNvbnRyb2xsZXIgaGllcmFyY2h5IGlzIG1hbmFnZWQgZHlu
YW1pY2FsbHkgYnkgbG9va2luZyBhdAorICAgIHRoZSBjdXJyZW50IHZpZXcncyBgY29udHJvbGxl
cmAuCisgICovCisKKyAgZnVuY3Rpb24gU2NvcGUocGFyZW50KSB7CisgICAgdGhpcy5fc2VsZiA9
IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9ibG9ja3MgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fY29t
cG9uZW50ID0gdW5kZWZpbmVkOworICAgIHRoaXMuX3ZpZXcgPSB1bmRlZmluZWQ7CisgICAgdGhp
cy5fYXR0cnMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fbG9jYWxzID0gdW5kZWZpbmVkOworICAg
IHRoaXMuX2xvY2FsUHJlc2VudCA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLm92ZXJyaWRlQ29udHJv
bGxlciA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgfQorCisgIHZh
ciBwcm90byA9IFNjb3BlLnByb3RvdHlwZTsKKworICBwcm90by5nZXRTZWxmID0gZnVuY3Rpb24g
KCkgeworICAgIHJldHVybiB0aGlzLl9zZWxmIHx8IHRoaXMucGFyZW50LmdldFNlbGYoKTsKKyAg
fTsKKworICBwcm90by5iaW5kU2VsZiA9IGZ1bmN0aW9uIChzZWxmKSB7CisgICAgdGhpcy5fc2Vs
ZiA9IHNlbGY7CisgIH07CisKKyAgcHJvdG8udXBkYXRlU2VsZiA9IGZ1bmN0aW9uIChzZWxmLCBr
ZXkpIHsKKyAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLl9zZWxmOworCisgICAgaWYgKGV4aXN0aW5n
KSB7CisgICAgICBleGlzdGluZy5zZXRTb3VyY2Uoc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAg
IHRoaXMuX3NlbGYgPSBuZXcgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0uZGVmYXVsdChz
ZWxmLCBrZXkpOworICAgIH0KKyAgfTsKKworICBwcm90by5nZXRCbG9jayA9IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgaWYgKCF0aGlzLl9ibG9ja3MpIHsKKyAgICAgIHJldHVybiB0aGlzLnBhcmVu
dC5nZXRCbG9jayhuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX2Jsb2Nrc1tuYW1lXSB8
fCB0aGlzLnBhcmVudC5nZXRCbG9jayhuYW1lKTsKKyAgfTsKKworICBwcm90by5oYXNCbG9jayA9
IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9ibG9ja3MpIHsKKyAgICAgIHJldHVy
biB0aGlzLnBhcmVudC5oYXNCbG9jayhuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuICEhKHRoaXMu
X2Jsb2Nrc1tuYW1lXSB8fCB0aGlzLnBhcmVudC5oYXNCbG9jayhuYW1lKSk7CisgIH07CisKKyAg
cHJvdG8uYmluZEJsb2NrID0gZnVuY3Rpb24gKG5hbWUsIGJsb2NrKSB7CisgICAgaWYgKCF0aGlz
Ll9ibG9ja3MpIHsKKyAgICAgIHRoaXMuX2Jsb2NrcyA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCk7CisgICAgfQorICAgIHRoaXMuX2Jsb2Nrc1tuYW1lXSA9IGJsb2NrOwor
ICB9OworCisgIHByb3RvLmdldENvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g
dGhpcy5fY29tcG9uZW50IHx8IHRoaXMucGFyZW50LmdldENvbXBvbmVudCgpOworICB9OworCisg
IHByb3RvLmJpbmRDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CisgICAgdGhpcy5f
Y29tcG9uZW50ID0gY29tcG9uZW50OworICB9OworCisgIHByb3RvLmdldFZpZXcgPSBmdW5jdGlv
biAoKSB7CisgICAgcmV0dXJuIHRoaXMuX3ZpZXcgfHwgdGhpcy5wYXJlbnQuZ2V0VmlldygpOwor
ICB9OworCisgIHByb3RvLmJpbmRWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICB0aGlzLl92
aWV3ID0gdmlldzsKKyAgfTsKKworICBwcm90by5nZXRBdHRycyA9IGZ1bmN0aW9uICgpIHsKKyAg
ICByZXR1cm4gdGhpcy5fYXR0cnMgfHwgdGhpcy5wYXJlbnQuZ2V0QXR0cnMoKTsKKyAgfTsKKwor
ICBwcm90by5iaW5kQXR0cnMgPSBmdW5jdGlvbiAoYXR0cnMpIHsKKyAgICB0aGlzLl9hdHRycyA9
IGF0dHJzOworICB9OworCisgIHByb3RvLmhhc0xvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAg
ICBpZiAoIXRoaXMuX2xvY2FsUHJlc2VudCkgeworICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lmhh
c0xvY2FsKG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fbG9jYWxQcmVzZW50W25hbWVd
IHx8IHRoaXMucGFyZW50Lmhhc0xvY2FsKG5hbWUpOworICB9OworCisgIHByb3RvLmhhc093bkxv
Y2FsID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5fbG9jYWxQcmVzZW50ICYm
IHRoaXMuX2xvY2FsUHJlc2VudFtuYW1lXTsKKyAgfTsKKworICBwcm90by5nZXRMb2NhbCA9IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9sb2NhbFByZXNlbnQpIHsKKyAgICAgIHJl
dHVybiB0aGlzLnBhcmVudC5nZXRMb2NhbChuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMu
X2xvY2FsUHJlc2VudFtuYW1lXSA/IHRoaXMuX2xvY2Fsc1tuYW1lXSA6IHRoaXMucGFyZW50Lmdl
dExvY2FsKG5hbWUpOworICB9OworCisgIHByb3RvLmJpbmRMb2NhbCA9IGZ1bmN0aW9uIChuYW1l
LCB2YWx1ZSkgeworICAgIGlmICghdGhpcy5fbG9jYWxQcmVzZW50KSB7CisgICAgICB0aGlzLl9s
b2NhbFByZXNlbnQgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAg
ICAgdGhpcy5fbG9jYWxzID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsK
KyAgICB9CisKKyAgICB0aGlzLl9sb2NhbFByZXNlbnRbbmFtZV0gPSB0cnVlOworICAgIHRoaXMu
X2xvY2Fsc1tuYW1lXSA9IHZhbHVlOworICB9OworCisgIHZhciBFTVBUWSA9IHsKKyAgICBfc2Vs
ZjogdW5kZWZpbmVkLAorICAgIF9ibG9ja3M6IHVuZGVmaW5lZCwKKyAgICBfY29tcG9uZW50OiB1
bmRlZmluZWQsCisgICAgX3ZpZXc6IHVuZGVmaW5lZCwKKyAgICBfYXR0cnM6IHVuZGVmaW5lZCwK
KyAgICBfbG9jYWxzOiB1bmRlZmluZWQsCisgICAgX2xvY2FsUHJlc2VudDogdW5kZWZpbmVkLAor
ICAgIG92ZXJyaWRlQ29udHJvbGxlcjogdW5kZWZpbmVkLAorCisgICAgZ2V0U2VsZjogZnVuY3Rp
b24gKCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBiaW5kU2VsZjogZnVuY3Rp
b24gKHNlbGYpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisgICAgdXBkYXRlU2VsZjog
ZnVuY3Rpb24gKHNlbGYsIGtleSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBn
ZXRCbG9jazogZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisg
ICAgYmluZEJsb2NrOiBmdW5jdGlvbiAobmFtZSwgYmxvY2spIHsKKyAgICAgIHJldHVybiBudWxs
OworICAgIH0sCisgICAgaGFzQmxvY2s6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSwKKyAgICBnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJl
dHVybiBudWxsOworICAgIH0sCisgICAgYmluZENvbXBvbmVudDogZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBnZXRWaWV3OiBmdW5jdGlvbiAoKSB7CisgICAg
ICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGJpbmRWaWV3OiBmdW5jdGlvbiAodmlldykgewor
ICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBnZXRBdHRyczogZnVuY3Rpb24gKCkgewor
ICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBiaW5kQXR0cnM6IGZ1bmN0aW9uIChhdHRy
cykgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBoYXNMb2NhbDogZnVuY3Rpb24g
KG5hbWUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorICAgIGhhc093bkxvY2FsOiBm
dW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisgICAgZ2V0TG9j
YWw6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGJp
bmRMb2NhbDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgIH07CisKKyAgZnVuY3Rpb24gY3JlYXRlRnJlc2hTY29wZSgpIHsKKyAgICByZXR1cm4g
bmV3IFNjb3BlKEVNUFRZKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkU2NvcGUocGFy
ZW50KSB7CisgICAgcmV0dXJuIG5ldyBTY29wZShwYXJlbnQpOworICB9Cit9KTsKK2VuaWZlZCgi
ZW1iZXItaHRtbGJhcnMvaG9va3MvZGVzdHJveS1yZW5kZXItbm9kZSIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IGRlc3Ryb3lSZW5kZXJOb2RlOworCisgIGZ1bmN0aW9uIGRlc3Ryb3lSZW5kZXJOb2Rl
KHJlbmRlck5vZGUpIHsKKyAgICBpZiAocmVuZGVyTm9kZS5lbWJlclZpZXcpIHsKKyAgICAgIHJl
bmRlck5vZGUuZW1iZXJWaWV3LmRlc3Ryb3koKTsKKyAgICB9CisKKyAgICB2YXIgc3RyZWFtVW5z
dWJzY3JpYmVycyA9IHJlbmRlck5vZGUuc3RyZWFtVW5zdWJzY3JpYmVyczsKKyAgICBpZiAoc3Ry
ZWFtVW5zdWJzY3JpYmVycykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdHJlYW1VbnN1
YnNjcmliZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBzdHJlYW1VbnN1YnNjcmli
ZXJzW2ldKCk7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJh
cnMvaG9va3MvZGlkLWNsZWFudXAtdHJlZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0
cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGlkQ2xlYW51cFRy
ZWU7CisKKyAgZnVuY3Rpb24gZGlkQ2xlYW51cFRyZWUoZW52KSB7CisgICAgLy8gT25jZSB3ZSBo
YXZlIGZpbnNpaGVkIGNsZWFuaW5nIHVwIHRoZSByZW5kZXIgbm9kZSBhbmQgc3ViLW5vZGVzLCBy
ZXNldAorICAgIC8vIHN0YXRlIHRyYWNraW5nIHdoaWNoIHZpZXcgdGhvc2UgcmVuZGVyIG5vZGVz
IGJlbG9uZ2VkIHRvLgorICAgIGVudi52aWV3Lm93bmVyVmlldy5fZGVzdHJveWluZ1N1YnRyZWVG
b3JWaWV3ID0gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2Rp
ZC1yZW5kZXItbm9kZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAidXNl
IHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGlkUmVuZGVyTm9kZTsKKworICBmdW5j
dGlvbiBkaWRSZW5kZXJOb2RlKG1vcnBoLCBlbnYpIHsKKyAgICBlbnYucmVuZGVyZWROb2Rlcy5h
ZGQobW9ycGgpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvZWxlbWVu
dCcsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdo
dG1sYmFycy1ydW50aW1lL2hvb2tzJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnZva2UtaGVs
cGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBl
ciwgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBl
cikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJz
CisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGVtYmVyRWxl
bWVudDsKKworICBmdW5jdGlvbiBlbWJlckVsZW1lbnQobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgs
IHBhcmFtcywgaGFzaCwgdmlzaXRvcikgeworICAgIGlmIChfaHRtbGJhcnNSdW50aW1lSG9va3Mu
aGFuZGxlUmVkaXJlY3QobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgbnVs
bCwgbnVsbCwgdmlzaXRvcikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgcmVz
dWx0OworICAgIHZhciBoZWxwZXIgPSBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBlci5m
aW5kSGVscGVyKHBhdGgsIHNjb3BlLmdldFNlbGYoKSwgZW52KTsKKyAgICBpZiAoaGVscGVyKSB7
CisgICAgICB2YXIgaGVscGVyU3RyZWFtID0gX2VtYmVySHRtbGJhcnNTeXN0ZW1JbnZva2VIZWxw
ZXIuYnVpbGRIZWxwZXJTdHJlYW0oaGVscGVyLCBwYXJhbXMsIGhhc2gsIHsgZWxlbWVudDogbW9y
cGguZWxlbWVudCB9LCBlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHJlc3VsdCA9IGhlbHBlclN0
cmVhbS52YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBlbnYuaG9va3MuZ2V0
KGVudiwgc2NvcGUsIHBhdGgpOworICAgIH0KKworICAgIGVudi5ob29rcy5nZXRWYWx1ZShyZXN1
bHQpOworICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LWJsb2NrIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBnZXRCbG9jazsKKworICBmdW5jdGlvbiBnZXRCbG9jayhzY29wZSwg
a2V5KSB7CisgICAgcmV0dXJuIHNjb3BlLmdldEJsb2NrKGtleSk7CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtY2VsbC1vci12YWx1ZScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL211dCdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlckh0bWxi
YXJzS2V5d29yZHNNdXQpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IGdldENlbGxPclZhbHVlOworCisgIGZ1bmN0aW9uIGdldENlbGxPclZhbHVlKHJlZikgeworICAg
IGlmIChyZWYgJiYgcmVmW19lbWJlckh0bWxiYXJzS2V5d29yZHNNdXQuTVVUQUJMRV9SRUZFUkVO
Q0VdKSB7CisgICAgICAvLyBSZWlmeSB0aGUgbXV0YWJsZSByZWZlcmVuY2UgaW50byBhIG11dGFi
bGUgY2VsbC4KKyAgICAgIHJldHVybiByZWYuY2VsbCgpOworICAgIH0KKworICAgIC8vIEdldCB0
aGUgdmFsdWUgb3V0IG9mIHRoZSByZWZlcmVuY2UuCisgICAgcmV0dXJuIF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQocmVmKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hv
b2tzL2dldC1jaGlsZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGdldENoaWxkOworCisgIGZ1bmN0aW9u
IGdldENoaWxkKHBhcmVudCwga2V5KSB7CisgICAgaWYgKF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LmlzU3RyZWFtKHBhcmVudCkpIHsKKyAgICAgIHJldHVybiBwYXJlbnQuZ2V0S2V5KGtleSk7Cisg
ICAgfQorCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBhcmUgbG9va2lu
ZyBhdCBhbiBgYXR0cnNgIGhhc2guCisgICAgLy8gVGhhdCBtaWdodCBjaGFuZ2UgaWYgaXQgaXMg
cG9zc2libGUgdG8gcGFzcyBvYmplY3QgbGl0ZXJhbHMKKyAgICAvLyB0aHJvdWdoIHRoZSB0ZW1w
bGF0aW5nIHN5c3RlbS4KKyAgICByZXR1cm4gcGFyZW50W2tleV07CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtcm9vdCcsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAo
ZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0
bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGdl
dFJvb3Q7CisKKyAgZnVuY3Rpb24gZ2V0Um9vdChzY29wZSwga2V5KSB7CisgICAgaWYgKGtleSA9
PT0gJ3RoaXMnKSB7CisgICAgICByZXR1cm4gW3Njb3BlLmdldFNlbGYoKV07CisgICAgfSBlbHNl
IGlmIChrZXkgPT09ICdoYXNCbG9jaycpIHsKKyAgICAgIHJldHVybiBbISFzY29wZS5oYXNCbG9j
aygnZGVmYXVsdCcpXTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2hhc0Jsb2NrUGFyYW1zJykg
eworICAgICAgdmFyIGJsb2NrID0gc2NvcGUuZ2V0QmxvY2soJ2RlZmF1bHQnKTsKKyAgICAgIHJl
dHVybiBbISFibG9jayAmJiBibG9jay5hcml0eV07CisgICAgfSBlbHNlIGlmIChzY29wZS5oYXNM
b2NhbChrZXkpKSB7CisgICAgICByZXR1cm4gW3Njb3BlLmdldExvY2FsKGtleSldOworICAgIH0g
ZWxzZSB7CisgICAgICByZXR1cm4gW2dldEtleShzY29wZSwga2V5KV07CisgICAgfQorICB9CisK
KyAgZnVuY3Rpb24gZ2V0S2V5KHNjb3BlLCBrZXkpIHsKKyAgICBpZiAoa2V5ID09PSAnYXR0cnMn
KSB7CisgICAgICB2YXIgX2F0dHJzID0gc2NvcGUuZ2V0QXR0cnMoKTsKKyAgICAgIGlmIChfYXR0
cnMpIHsKKyAgICAgICAgcmV0dXJuIF9hdHRyczsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIg
c2VsZiA9IHNjb3BlLmdldFNlbGYoKSB8fCBzY29wZS5nZXRMb2NhbCgndmlldycpOworCisgICAg
aWYgKHNlbGYpIHsKKyAgICAgIHJldHVybiBzZWxmLmdldEtleShrZXkpOworICAgIH0KKworICAg
IHZhciBhdHRycyA9IHNjb3BlLmdldEF0dHJzKCk7CisgICAgaWYgKGF0dHJzICYmIGtleSBpbiBh
dHRycykgeworICAgICAgLy8gVE9ETzogYXR0cnMKKyAgICAgIC8vIGRlcHJlY2F0ZSgiWW91IGFj
Y2Vzc2VkIHRoZSBgIiArIGtleSArICJgIGF0dHJpYnV0ZSBkaXJlY3RseS4gUGxlYXNlIHVzZSBg
YXR0cnMuIiArIGtleSArICJgIGluc3RlYWQuIik7CisgICAgICByZXR1cm4gYXR0cnNba2V5XTsK
KyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtdmFsdWUn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci12aWV3cy9j
b21wYXQvYXR0cnMtcHJveHknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBnZXRWYWx1ZTsKKworICBmdW5jdGlvbiBnZXRWYWx1
ZShyZWYpIHsKKyAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHJl
Zik7CisKKyAgICBpZiAodmFsdWUgJiYgdmFsdWVbX2VtYmVyVmlld3NDb21wYXRBdHRyc1Byb3h5
Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdmFsdWU7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9o
YXMtaGVscGVyJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVs
cGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBl
cikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaGFzSGVscGVySG9v
azsKKworICBmdW5jdGlvbiBoYXNIZWxwZXJIb29rKGVudiwgc2NvcGUsIGhlbHBlck5hbWUpIHsK
KyAgICBpZiAoZW52LmhlbHBlcnNbaGVscGVyTmFtZV0pIHsKKyAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKyAgICBpZiAoX2VtYmVySHRtbGJh
cnNTeXN0ZW1Mb29rdXBIZWxwZXIudmFsaWRhdGVMYXp5SGVscGVyTmFtZShoZWxwZXJOYW1lLCBv
d25lciwgZW52Lmhvb2tzLmtleXdvcmRzKSkgeworICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUg
PSAnaGVscGVyOicgKyBoZWxwZXJOYW1lOworICAgICAgaWYgKG93bmVyLmhhc1JlZ2lzdHJhdGlv
bihyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKwor
ICAgICAgdmFyIG9wdGlvbnMgPSB7fTsKKyAgICAgIHZhciBtb2R1bGVOYW1lID0gZW52Lm1ldGEg
JiYgZW52Lm1ldGEubW9kdWxlTmFtZTsKKyAgICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAgICAg
IG9wdGlvbnMuc291cmNlID0gJ3RlbXBsYXRlOicgKyBtb2R1bGVOYW1lOworICAgICAgfQorCisg
ICAgICBpZiAob3duZXIuaGFzUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbk5hbWUsIG9wdGlvbnMp
KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2ludm9rZS1oZWxw
ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2ludm9rZS1oZWxwZXInLCAn
ZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vic2NyaWJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlciwgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmli
ZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaW52b2tlSGVscGVy
OworCisgIGZ1bmN0aW9uIGludm9rZUhlbHBlcihtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvciwg
cGFyYW1zLCBoYXNoLCBoZWxwZXIsIHRlbXBsYXRlcywgY29udGV4dCkgeworICAgIHZhciBoZWxw
ZXJTdHJlYW0gPSBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlci5idWlsZEhlbHBlclN0
cmVhbShoZWxwZXIsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGVzLCBlbnYsIHNjb3BlKTsKKworICAg
IC8vIEVtYmVyLkhlbHBlciBoZWxwZXJzIGFyZSBwdXJlIHZhbHVlcywgdGh1cyBsaW5rYWJsZS4K
KyAgICBpZiAoaGVscGVyU3RyZWFtLmxpbmthYmxlKSB7CisgICAgICBpZiAobW9ycGgpIHsKKyAg
ICAgICAgLy8gV2hlbiBwcm9jZXNzaW5nIGFuIGlubGluZSBleHByZXNzaW9uLCB0aGUgcGFyYW1z
IGFuZCBoYXNoIGhhdmUgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGxpbmtlZC4gVGh1cywgSFRN
TEJhcnMgd2lsbCBub3QgbGluayB0aGUgcmV0dXJuZWQgaGVscGVyU3RyZWFtLgorICAgICAgICAv
LyBXZSBzdWJzY3JpYmUgdGhlIG1vcnBoIHRvIHRoZSBoZWxwZXJTdHJlYW0gaGVyZSwgYW5kIGFs
c28gc3Vic2NyaWJlCisgICAgICAgIC8vIHRoZSBoZWxwZXJTdHJlYW0gdG8gYW55IHBhcmFtcy4K
KyAgICAgICAgdmFyIGFkZGVkRGVwZW5kZW5jeSA9IGZhbHNlOworICAgICAgICBmb3IgKHZhciBp
ID0gMCwgbCA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICBhZGRlZERl
cGVuZGVuY3kgPSB0cnVlOworICAgICAgICAgIGhlbHBlclN0cmVhbS5hZGREZXBlbmRlbmN5KHBh
cmFtc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHsKKyAg
ICAgICAgICBhZGRlZERlcGVuZGVuY3kgPSB0cnVlOworICAgICAgICAgIGhlbHBlclN0cmVhbS5h
ZGREZXBlbmRlbmN5KGhhc2hba2V5XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZGVkRGVw
ZW5kZW5jeSkgeworICAgICAgICAgIF9lbWJlckh0bWxiYXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVs
dChtb3JwaCwgZW52LCBzY29wZSwgaGVscGVyU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgfQor
CisgICAgICByZXR1cm4geyBsaW5rOiB0cnVlLCB2YWx1ZTogaGVscGVyU3RyZWFtIH07CisgICAg
fQorCisgICAgLy8gQnVpbHQtaW4gaGVscGVycyBhcmUgbm90IGxpbmthYmxlLiBUaGV5IG11c3Qg
cnVuIG9uIGV2ZXJ5IHJlcmVuZGVyLgorICAgIHJldHVybiB7IHZhbHVlOiBoZWxwZXJTdHJlYW0u
dmFsdWUoKSB9OworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvbGluay1y
ZW5kZXItbm9kZScsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUn
LCAnZW1iZXItcnVudGltZS91dGlscycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2Vt
YmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdv
cmRzL2Nsb3N1cmUtY29tcG9uZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFy
c1V0aWxzU3Vic2NyaWJlLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0
aWxzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBlciwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc0Nsb3N1cmVDb21wb25lbnQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1v
ZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBsaW5rUmVuZGVyTm9kZTsKKyAgZXhwb3J0cy5saW5rUGFyYW1zRm9yID0gbGlu
a1BhcmFtc0ZvcjsKKworICBmdW5jdGlvbiBsaW5rUmVuZGVyTm9kZShyZW5kZXJOb2RlLCBlbnYs
IHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gpIHsKKyAgICBpZiAocmVuZGVyTm9kZS5zdHJlYW1V
bnN1YnNjcmliZXJzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIga2V5
d29yZCA9IGVudi5ob29rcy5rZXl3b3Jkc1twYXRoXTsKKyAgICBpZiAoa2V5d29yZCAmJiBrZXl3
b3JkLmxpbmspIHsKKyAgICAgIGtleXdvcmQubGluayhyZW5kZXJOb2RlLmdldFN0YXRlKCksIHBh
cmFtcywgaGFzaCk7CisgICAgfSBlbHNlIGlmIChwYXRoID09PSAndW5ib3VuZCcpIHsKKyAgICAg
IHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBsaW5rUGFyYW1zRm9yKHBhdGgsIHBh
cmFtcyk7CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgaXMgYSBkb3QgaW4gdGhlIHBhdGgsIHdl
IG5lZWQgdG8gc3Vic2NyaWJlIHRvIHRoZSBhcmd1bWVudHMgaW4gdGhlCisgICAgLy8gY2xvc3Vy
ZSBjb21wb25lbnQgYXMgd2VsbC4KKworICAgIGlmIChfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1
cEhlbHBlci5DT05UQUlOU19ET1RfQ0FDSEUuZ2V0KHBhdGgpKSB7CisgICAgICB2YXIgc3RyZWFt
ID0gZW52Lmhvb2tzLmdldChlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHZhciBjb21wb25lbnRD
ZWxsID0gc3RyZWFtLnZhbHVlKCk7CisKKyAgICAgIGlmIChfZW1iZXJIdG1sYmFyc0tleXdvcmRz
Q2xvc3VyZUNvbXBvbmVudC5pc0NvbXBvbmVudENlbGwoY29tcG9uZW50Q2VsbCkpIHsKKyAgICAg
ICAgdmFyIGNsb3N1cmVBdHRycyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9u
ZW50Lm1lcmdlSW5OZXdIYXNoKGNvbXBvbmVudENlbGxbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Ns
b3N1cmVDb21wb25lbnQuQ09NUE9ORU5UX0hBU0hdLCBoYXNoKTsKKworICAgICAgICBmb3IgKHZh
ciBrZXkgaW4gY2xvc3VyZUF0dHJzKSB7CisgICAgICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1
YnNjcmliZS5kZWZhdWx0KHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIGNsb3N1cmVBdHRyc1trZXld
KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJhbXMgJiYgcGFyYW1z
Lmxlbmd0aCkgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZS5kZWZhdWx0KHJlbmRlck5v
ZGUsIGVudiwgc2NvcGUsIHBhcmFtc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhh
c2gpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiBoYXNoKSB7CisgICAgICAgIF9lbWJlckh0bWxi
YXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVsdChyZW5kZXJOb2RlLCBlbnYsIHNjb3BlLCBoYXNoW2tl
eV0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSBwYXJhbXMgYW5kIGhhc2ggY2FuIGJl
IHJldXNlZC4gVGhleSBkb24ndCBuZWVkIHRvIGJlCisgICAgLy8gcmVjb21wdXRlZCBvbiBzdWJz
ZXF1ZW50IHJlLXJlbmRlcnMgYmVjYXVzZSB0aGV5IGFyZQorICAgIC8vIHN0cmVhbXMuCisgICAg
cmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBsaW5rUGFyYW1zRm9yKHBhdGgsIHBhcmFt
cykgeworICAgIHN3aXRjaCAocGF0aCkgeworICAgICAgY2FzZSAndW5sZXNzJzoKKyAgICAgIGNh
c2UgJ2lmJzoKKyAgICAgICAgcGFyYW1zWzBdID0gc2hvdWxkRGlzcGxheShwYXJhbXNbMF0sIHRv
Qm9vbCk7YnJlYWs7CisgICAgICBjYXNlICdlYWNoJzoKKyAgICAgICAgcGFyYW1zWzBdID0gZWFj
aFBhcmFtKHBhcmFtc1swXSk7YnJlYWs7CisgICAgICBjYXNlICd3aXRoJzoKKyAgICAgICAgcGFy
YW1zWzBdID0gc2hvdWxkRGlzcGxheShwYXJhbXNbMF0sIGlkZW50aXR5KTticmVhazsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBlYWNoUGFyYW0obGlzdCkgeworICAgIHZhciBsaXN0Q2hhbmdl
ID0gZ2V0S2V5KGxpc3QsICdbXScpOworCisgICAgdmFyIHN0cmVhbSA9IF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLmNoYWluKGxpc3QsIGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQobGlzdENoYW5nZSk7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMucmVhZChsaXN0KTsKKyAgICB9LCAnZWFjaCcpOworCisgICAgc3RyZWFtLmFkZERl
cGVuZGVuY3kobGlzdENoYW5nZSk7CisgICAgcmV0dXJuIHN0cmVhbTsKKyAgfQorCisgIGZ1bmN0
aW9uIHNob3VsZERpc3BsYXkocHJlZGljYXRlLCBjb2VyY2VyKSB7CisgICAgdmFyIGxlbmd0aCA9
IGdldEtleShwcmVkaWNhdGUsICdsZW5ndGgnKTsKKyAgICB2YXIgaXNUcnV0aHkgPSBnZXRLZXko
cHJlZGljYXRlLCAnaXNUcnV0aHknKTsKKworICAgIHZhciBzdHJlYW0gPSBfZW1iZXJNZXRhbFN0
cmVhbXNVdGlscy5jaGFpbihwcmVkaWNhdGUsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBwcmVk
aWNhdGVWYWwgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHByZWRpY2F0ZSk7CisgICAg
ICB2YXIgbGVuZ3RoVmFsID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChsZW5ndGgpOwor
ICAgICAgdmFyIGlzVHJ1dGh5VmFsID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChpc1Ry
dXRoeSk7CisKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShwcmVkaWNhdGVW
YWwpKSB7CisgICAgICAgIHJldHVybiBsZW5ndGhWYWwgPiAwID8gY29lcmNlcihwcmVkaWNhdGVW
YWwpIDogZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgaXNUcnV0aHlWYWwgPT09
ICdib29sZWFuJykgeworICAgICAgICByZXR1cm4gaXNUcnV0aHlWYWwgPyBjb2VyY2VyKHByZWRp
Y2F0ZVZhbCkgOiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNvZXJjZXIocHJlZGlj
YXRlVmFsKTsKKyAgICB9LCAnU2hvdWxkRGlzcGxheScpOworCisgICAgX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMuYWRkRGVwZW5kZW5jeShzdHJlYW0sIGxlbmd0aCk7CisgICAgX2VtYmVyTWV0YWxT
dHJlYW1zVXRpbHMuYWRkRGVwZW5kZW5jeShzdHJlYW0sIGlzVHJ1dGh5KTsKKworICAgIHJldHVy
biBzdHJlYW07CisgIH0KKworICBmdW5jdGlvbiB0b0Jvb2wodmFsdWUpIHsKKyAgICByZXR1cm4g
ISF2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7CisgICAgcmV0dXJu
IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gZ2V0S2V5KG9iaiwga2V5KSB7CisgICAgaWYgKF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9iaikpIHsKKyAgICAgIHJldHVybiBvYmou
Z2V0S2V5KGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvYmogJiYgb2JqW2tleV07
CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvbG9va3VwLWhl
bHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcidd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGxvb2t1cEhlbHBlckhvb2s7
CisKKyAgZnVuY3Rpb24gbG9va3VwSGVscGVySG9vayhlbnYsIHNjb3BlLCBoZWxwZXJOYW1lKSB7
CisgICAgcmV0dXJuIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLmRlZmF1bHQoaGVs
cGVyTmFtZSwgc2NvcGUuZ2V0U2VsZigpLCBlbnYpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
aHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0
ZW0vbG9va3VwLWhlbHBlcicsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vaW52b2tlLWhlbHBlcics
ICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2xpbmst
cmVuZGVyLW5vZGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlciwgX2VtYmVyTWV0YWxT
dHJlYW1zVXRpbHMsIF9lbWJlckh0bWxiYXJzSG9va3NMaW5rUmVuZGVyTm9kZSkgeworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHN1YmV4cHI7CisgIGV4cG9ydHMu
bGFiZWxGb3JTdWJleHByID0gbGFiZWxGb3JTdWJleHByOworCisgIGZ1bmN0aW9uIHN1YmV4cHIo
ZW52LCBzY29wZSwgaGVscGVyTmFtZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgLy8gVE9ETzogS2V5
d29yZHMgYW5kIGhlbHBlciBpbnZvY2F0aW9uIHNob3VsZCBiZSBpbnRlZ3JhdGVkIGludG8KKyAg
ICAvLyB0aGUgc3ViZXhwciBob29rIHVwc3RyZWFtIGluIEhUTUxCYXJzLgorICAgIHZhciBrZXl3
b3JkID0gZW52Lmhvb2tzLmtleXdvcmRzW2hlbHBlck5hbWVdOworICAgIGlmIChrZXl3b3JkKSB7
CisgICAgICByZXR1cm4ga2V5d29yZChudWxsLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIG51
bGwsIG51bGwpOworICAgIH0KKworICAgIF9lbWJlckh0bWxiYXJzSG9va3NMaW5rUmVuZGVyTm9k
ZS5saW5rUGFyYW1zRm9yKGhlbHBlck5hbWUsIHBhcmFtcyk7CisKKyAgICB2YXIgbGFiZWwgPSBs
YWJlbEZvclN1YmV4cHIocGFyYW1zLCBoYXNoLCBoZWxwZXJOYW1lKTsKKyAgICB2YXIgaGVscGVy
ID0gX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIuZGVmYXVsdChoZWxwZXJOYW1lLCBz
Y29wZS5nZXRTZWxmKCksIGVudik7CisKKyAgICB2YXIgaGVscGVyU3RyZWFtID0gX2VtYmVySHRt
bGJhcnNTeXN0ZW1JbnZva2VIZWxwZXIuYnVpbGRIZWxwZXJTdHJlYW0oaGVscGVyLCBwYXJhbXMs
IGhhc2gsIG51bGwsIGVudiwgc2NvcGUsIGxhYmVsKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBs
ID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaGVscGVyU3RyZWFtLmFkZERl
cGVuZGVuY3kocGFyYW1zW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBrZXkgaW4gaGFzaCkg
eworICAgICAgaGVscGVyU3RyZWFtLmFkZERlcGVuZGVuY3koaGFzaFtrZXldKTsKKyAgICB9CisK
KyAgICByZXR1cm4gaGVscGVyU3RyZWFtOworICB9CisKKyAgZnVuY3Rpb24gbGFiZWxGb3JTdWJl
eHByKHBhcmFtcywgaGFzaCwgaGVscGVyTmFtZSkgeworICAgIHZhciBwYXJhbXNMYWJlbHMgPSBs
YWJlbHNGb3JQYXJhbXMocGFyYW1zKTsKKyAgICB2YXIgaGFzaExhYmVscyA9IGxhYmVsc0Zvckhh
c2goaGFzaCk7CisgICAgdmFyIGxhYmVsID0gJygnICsgaGVscGVyTmFtZTsKKworICAgIGlmIChw
YXJhbXNMYWJlbHMpIHsKKyAgICAgIGxhYmVsICs9ICcgJyArIHBhcmFtc0xhYmVsczsKKyAgICB9
CisgICAgaWYgKGhhc2hMYWJlbHMpIHsKKyAgICAgIGxhYmVsICs9ICcgJyArIGhhc2hMYWJlbHM7
CisgICAgfQorCisgICAgcmV0dXJuIGxhYmVsICsgJyknOworICB9CisKKyAgZnVuY3Rpb24gbGFi
ZWxzRm9yUGFyYW1zKHBhcmFtcykgeworICAgIHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGls
cy5sYWJlbHNGb3IocGFyYW1zKS5qb2luKCcgJyk7CisgIH0KKworICBmdW5jdGlvbiBsYWJlbHNG
b3JIYXNoKGhhc2gpIHsKKyAgICB2YXIgb3V0ID0gW107CisKKyAgICBmb3IgKHZhciBwcm9wIGlu
IGhhc2gpIHsKKyAgICAgIG91dC5wdXNoKHByb3AgKyAnPScgKyBfZW1iZXJNZXRhbFN0cmVhbXNV
dGlscy5sYWJlbEZvcihoYXNoW3Byb3BdKSk7CisgICAgfQorCisgICAgcmV0dXJuIG91dC5qb2lu
KCcgJyk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy91cGRhdGUtc2Vs
ZicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItaHRtbGJhcnMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gdXBkYXRlU2VsZjsKKworICBmdW5jdGlvbiB1cGRhdGVTZWxmKGVudiwgc2NvcGUsIF9zZWxm
KSB7CisgICAgdmFyIHNlbGYgPSBfc2VsZjsKKworICAgIGlmIChzZWxmICYmIHNlbGYuaGFzQm91
bmRDb250cm9sbGVyKSB7CisgICAgICB2YXIgX3NlbGYyID0gc2VsZjsKKyAgICAgIHZhciBjb250
cm9sbGVyID0gX3NlbGYyLmNvbnRyb2xsZXI7CisKKyAgICAgIHNlbGYgPSBzZWxmLnNlbGY7CisK
KyAgICAgIHNjb3BlLnVwZGF0ZUxvY2FsKCdjb250cm9sbGVyJywgY29udHJvbGxlciB8fCBzZWxm
KTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQlVHOiBzY29wZS5hdHRy
cyBhbmQgc2VsZi5pc1ZpZXcgc2hvdWxkIG5vdCBib3RoIGJlIHRydWUnLCAhKHNjb3BlLmF0dHJz
ICYmIHNlbGYuaXNWaWV3KSk7CisKKyAgICBpZiAoc2VsZiAmJiBzZWxmLmlzVmlldykgeworICAg
ICAgc2NvcGUudXBkYXRlTG9jYWwoJ3ZpZXcnLCBzZWxmKTsKKyAgICAgIHNjb3BlLnVwZGF0ZVNl
bGYoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHNlbGYsICdjb250ZXh0JyksICcnKTsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzY29wZS51cGRhdGVTZWxmKHNlbGYpOworICB9Cit9
KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMvaG9va3Mvd2lsbC1jbGVhbnVwLXRyZWUiLCBbImV4
cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IHdpbGxDbGVhbnVwVHJlZTsKKworICBmdW5jdGlvbiB3aWxsQ2xlYW51cFRy
ZWUoZW52KSB7CisgICAgdmFyIHZpZXcgPSBlbnYudmlldzsKKworICAgIC8vIFdoZW4gd2UgZ28g
dG8gY2xlYW4gdXAgdGhlIHJlbmRlciBub2RlIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLCB3ZSBt
YXkKKyAgICAvLyBlbmNvdW50ZXIgdmlld3MvY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhv
c2Ugbm9kZXMgYWxvbmcgdGhlIHdheS4gSW4KKyAgICAvLyB0aG9zZSBjYXNlcywgd2UgbmVlZCB0
byBzZXZlciB0aGUgbGluayBiZXR3ZWVuIHRoZQorICAgIC8vIGV4aXN0aW5nIHZpZXcgaGllcmFy
Y2h5IGFuZCB0aG9zZSB2aWV3cy4KKyAgICAvLworICAgIC8vIEhvd2V2ZXIsIHdlIGRvICpub3Qq
IG5lZWQgdG8gcmVtb3ZlIHRoZSBjaGlsZCB2aWV3cyBvZiBjaGlsZCB2aWV3cywgc2luY2UKKyAg
ICAvLyBzZXZlcmluZyB0aGUgY29ubmVjdGlvbiB0byB0aGVpciBwYXJlbnQgZWZmZWN0aXZlbHkg
c2V2ZXJzIHRoZW0gZnJvbSB0aGUKKyAgICAvLyB2aWV3IGdyYXBoLgorICAgIC8vCisgICAgLy8g
Rm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyB2aWV3IGdyYXBoOgorICAgIC8vCisg
ICAgLy8gICAgQQorICAgIC8vICAgLyBcCisgICAgLy8gIEIgIEMKKyAgICAvLyAgICAvIFwKKyAg
ICAvLyAgIEQgIEUKKyAgICAvLworICAgIC8vIElmIHdlIGFyZSBjbGVhbmluZyB1cCB0aGUgbm9k
ZSBmb3IgdmlldyBDLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IHZpZXcKKyAgICAvLyBmcm9tIEEn
cyBjaGlsZCB2aWV3cy4gSG93ZXZlciwgd2UgZG8gbm90IG5lZWQgdG8gcmVtb3ZlIEQgYW5kIEUg
ZnJvbSBDJ3MKKyAgICAvLyBjaGlsZCB2aWV3cywgc2luY2UgcmVtb3ZpbmcgQyB0cmFuc2l0aXZl
bHkgcmVtb3ZlcyBEIGFuZCBFIGFzIHdlbGwuCisgICAgLy8KKyAgICAvLyBUbyBhY2NvbXBsaXNo
IHRoaXMsIHdlIHRyYWNrIHRoZSBuZWFyZXN0IHZpZXcgdG8gdGhpcyByZW5kZXIgbm9kZSBvbiB0
aGUKKyAgICAvLyBvd25lciB2aWV3LCB0aGUgcm9vdC1tb3N0IHZpZXcgaW4gdGhlIGdyYXBoIChB
IGluIHRoZSBleGFtcGxlIGFib3ZlKS4gSWYKKyAgICAvLyB3ZSBkZXRlY3QgYSB2aWV3IHRoYXQg
aXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhhdCB2aWV3LCB3ZSByZW1vdmUgaXQgZnJvbQorICAgIC8v
IHRoZSBgY2hpbGRWaWV3c2AgYXJyYXkuIE90aGVyIHBhcmVudC9jaGlsZCB2aWV3IHJlbGF0aW9u
c2hpcHMgYXJlCisgICAgLy8gdW50b3VjaGVkLiAgVGhpcyB2aWV3IGlzIHRoZW4gY2xlYXJlZCBv
bmNlIGNsZWFudXAgaXMgY29tcGxldGUgaW4KKyAgICAvLyBgZGlkQ2xlYW51cFRyZWVgLgorICAg
IHZpZXcub3duZXJWaWV3Ll9kZXN0cm95aW5nU3VidHJlZUZvclZpZXcgPSB2aWV3OworICB9Cit9
KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvY29yZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlcicsICdlbWJlci1odG1sYmFycy9zeXN0
ZW0vbWFrZV9ib3VuZF9oZWxwZXInLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycycsICdlbWJlci1o
dG1sYmFycy9oZWxwZXJzL2lmX3VubGVzcycsICdlbWJlci1odG1sYmFycy9oZWxwZXJzL3dpdGgn
LCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9sb2MnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9s
b2cnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9lYWNoJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBl
cnMvZWFjaC1pbicsICdlbWJlci1odG1sYmFycy9oZWxwZXJzLy1ub3JtYWxpemUtY2xhc3MnLCAn
ZW1iZXItaHRtbGJhcnMvaGVscGVycy9jb25jYXQnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy8t
am9pbi1jbGFzc2VzJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvLWh0bWwtc2FmZScsICdlbWJl
ci1odG1sYmFycy9oZWxwZXJzL2hhc2gnLCAnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxw
ZXInLCAnZW1iZXItaHRtbGJhcnMvaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL3RlbXBsYXRlX3Jl
Z2lzdHJ5JywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9ib290c3RyYXAnLCAnZW1iZXItaHRtbGJh
cnMvY29tcGF0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlclRl
bXBsYXRlQ29tcGlsZXIsIF9lbWJlckh0bWxiYXJzU3lzdGVtTWFrZV9ib3VuZF9oZWxwZXIsIF9l
bWJlckh0bWxiYXJzSGVscGVycywgX2VtYmVySHRtbGJhcnNIZWxwZXJzSWZfdW5sZXNzLCBfZW1i
ZXJIdG1sYmFyc0hlbHBlcnNXaXRoLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNMb2MsIF9lbWJlckh0
bWxiYXJzSGVscGVyc0xvZywgX2VtYmVySHRtbGJhcnNIZWxwZXJzRWFjaCwgX2VtYmVySHRtbGJh
cnNIZWxwZXJzRWFjaEluLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNOb3JtYWxpemVDbGFzcywgX2Vt
YmVySHRtbGJhcnNIZWxwZXJzQ29uY2F0LCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNKb2luQ2xhc3Nl
cywgX2VtYmVySHRtbGJhcnNIZWxwZXJzSHRtbFNhZmUsIF9lbWJlckh0bWxiYXJzSGVscGVyc0hh
c2gsIF9lbWJlckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hlbHBlciwg
X2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeSwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Cb290
c3RyYXAsIF9lbWJlckh0bWxiYXJzQ29tcGF0KSB7CisgIC8qKgorICAgIEVtYmVyIHRlbXBsYXRl
cyBhcmUgZXhlY3V0ZWQgYnkgW0hUTUxCYXJzXShodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9o
dG1sYmFycyksCisgICAgYW4gSFRNTC1mcmllbmRseSB2ZXJzaW9uIG9mIFtIYW5kbGViYXJzXSho
dHRwOi8vaGFuZGxlYmFyc2pzLmNvbS8pLiBBbnkgdmFsaWQgSGFuZGxlYmFycyBzeW50YXggaXMg
dmFsaWQgaW4gYW4gRW1iZXIgdGVtcGxhdGUuCisgIAorICAgICMjIyBTaG93aW5nIGEgcHJvcGVy
dHkKKyAgCisgICAgVGVtcGxhdGVzIG1hbmFnZSB0aGUgZmxvdyBvZiBhbiBhcHBsaWNhdGlvbidz
IFVJLCBhbmQgZGlzcGxheSBzdGF0ZSAodGhyb3VnaAorICAgIHRoZSBET00pIHRvIGEgdXNlci4g
Rm9yIGV4YW1wbGUsIGdpdmVuIGEgY29tcG9uZW50IHdpdGggdGhlIHByb3BlcnR5ICJuYW1lIiwK
KyAgICB0aGF0IGNvbXBvbmVudCdzIHRlbXBsYXRlIGNhbiB1c2UgdGhlIG5hbWUgaW4gc2V2ZXJh
bCB3YXlzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8gYXBwL2NvbXBvbmVudHMvcGVy
c29uLmpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAg
ICBuYW1lOiAnSmlsbCcKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7ISBhcHAvY29tcG9uZW50cy9wZXJzb24uaGJzIH19CisgICAge3tuYW1lfX0KKyAgICA8
ZGl2Pnt7bmFtZX19PC9kaXY+CisgICAgPHNwYW4gZGF0YS1uYW1lPXt7bmFtZX19Pjwvc3Bhbj4K
KyAgICBgYGAKKyAgCisgICAgQW55IHRpbWUgdGhlICJuYW1lIiBwcm9wZXJ0eSBvbiB0aGUgY29t
cG9uZW50IGNoYW5nZXMsIHRoZSBET00gd2lsbCBiZQorICAgIHVwZGF0ZWQuCisgIAorICAgIFBy
b3BlcnRpZXMgY2FuIGJlIGNoYWluZWQgYXMgd2VsbDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7YVVzZXJNb2RlbC5uYW1lfX0KKyAgICA8ZGl2Pnt7bGlzdE9mVXNlcnMuZmlyc3RPYmpl
Y3QubmFtZX19PC9kaXY+CisgICAgYGBgCisgIAorICAgICMjIyBVc2luZyBFbWJlciBoZWxwZXJz
CisgIAorICAgIFdoZW4gY29udGVudCBpcyBwYXNzZWQgaW4gbXVzdGFjaGVzIGB7e319YCwgRW1i
ZXIgd2lsbCBmaXJzdCB0cnkgdG8gZmluZCBhIGhlbHBlcgorICAgIG9yIGNvbXBvbmVudCB3aXRo
IHRoYXQgbmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBgaWZgIGhlbHBlcjoKKyAgCisgICAgYGBgaGFu
ZGxlYmFycworICAgIHt7aWYgbmFtZSAiSSBoYXZlIGEgbmFtZSIgIkkgaGF2ZSBubyBuYW1lIn19
CisgICAgPHNwYW4gZGF0YS1oYXMtbmFtZT17e2lmIG5hbWUgdHJ1ZX19Pjwvc3Bhbj4KKyAgICBg
YGAKKyAgCisgICAgVGhlIHJldHVybmVkIHZhbHVlIGlzIHBsYWNlZCB3aGVyZSB0aGUgYHt7fX1g
IGlzIGNhbGxlZC4gVGhlIGFib3ZlIHN0eWxlIGlzCisgICAgY2FsbGVkICJpbmxpbmUiLiBBIHNl
Y29uZCBzdHlsZSBvZiBoZWxwZXIgdXNhZ2UgaXMgY2FsbGVkICJibG9jayIuIEZvciBleGFtcGxl
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjaWYgbmFtZX19CisgICAgICBJIGhhdmUg
YSBuYW1lCisgICAge3tlbHNlfX0KKyAgICAgIEkgaGF2ZSBubyBuYW1lCisgICAge3svaWZ9fQor
ICAgIGBgYAorICAKKyAgICBUaGUgYmxvY2sgZm9ybSBvZiBoZWxwZXJzIGFsbG93cyB5b3UgdG8g
Y29udHJvbCBob3cgdGhlIFVJIGlzIGNyZWF0ZWQgYmFzZWQKKyAgICBvbiB0aGUgdmFsdWVzIG9m
IHByb3BlcnRpZXMuCisgIAorICAgIEEgdGhpcmQgZm9ybSBvZiBoZWxwZXIgaXMgY2FsbGVkICJu
ZXN0ZWQiLiBGb3IgZXhhbXBsZSBoZXJlIHRoZSBjb25jYXQKKyAgICBoZWxwZXIgd2lsbCBhZGQg
IiBEb2UiIHRvIGEgZGlzcGxheWVkIG5hbWUgaWYgdGhlIHBlcnNvbiBoYXMgbm8gbGFzdCBuYW1l
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPHNwYW4gZGF0YS1uYW1lPXt7Y29uY2F0IGZp
cnN0TmFtZSAoCisgICAgIGlmIGxhc3ROYW1lIChjb25jYXQgIiAiIGxhc3ROYW1lKSAiRG9lIgor
ICAgICl9fT48L3NwYW4+CisgICAgYGBgCisgIAorICAgIEVtYmVyJ3MgYnVpbHQtaW4gaGVscGVy
cyBhcmUgZGVzY3JpYmVkIHVuZGVyIHRoZSBbRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnNdKC9hcGkv
Y2xhc3Nlcy9FbWJlci5UZW1wbGF0ZXMuaGVscGVycy5odG1sKQorICAgIG5hbWVzcGFjZS4gRG9j
dW1lbnRhdGlvbiBvbiBjcmVhdGluZyBjdXN0b20gaGVscGVycyBjYW4gYmUgZm91bmQgdW5kZXIK
KyAgICBbRW1iZXIuSGVscGVyXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGVscGVyLmh0bWwpLgorICAK
KyAgICAjIyMgSW52b2tpbmcgYSBDb21wb25lbnQKKyAgCisgICAgRW1iZXIgY29tcG9uZW50cyBy
ZXByZXNlbnQgc3RhdGUgdG8gdGhlIFVJIG9mIGFuIGFwcGxpY2F0aW9uLiBGdXJ0aGVyCisgICAg
cmVhZGluZyBvbiBjb21wb25lbnRzIGNhbiBiZSBmb3VuZCB1bmRlciBbRW1iZXIuQ29tcG9uZW50
XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpLgorICAKKyAgICBAbW9kdWxlIGVt
YmVyCisgICAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgICBAbWFpbiBlbWJlci10ZW1w
bGF0ZXMKKyAgICBAcHVibGljCisgICovCisKKyAgLyoqCisgIAorICAgIFtIVE1MQmFyc10oaHR0
cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vaHRtbGJhcnMpIGlzIGEgW0hhbmRsZWJhcnNdKGh0dHA6
Ly9oYW5kbGViYXJzanMuY29tLykKKyAgICBjb21wYXRpYmxlIHRlbXBsYXRpbmcgZW5naW5lIHVz
ZWQgYnkgRW1iZXIuanMuIFRoZSBjbGFzc2VzIGFuZCBuYW1lc3BhY2VzCisgICAgY292ZXJlZCBi
eSB0aGlzIGRvY3VtZW50YXRpb24gYXR0ZW1wdCB0byBmb2N1cyBvbiBBUElzIGZvciBpbnRlcmFj
dGluZworICAgIHdpdGggSFRNTEJhcnMgaXRzZWxmLiBGb3IgbW9yZSBnZW5lcmFsIGd1aWRhbmNl
IG9uIEVtYmVyLmpzIHRlbXBsYXRlcyBhbmQKKyAgICBoZWxwZXJzLCBwbGVhc2Ugc2VlIHRoZSBb
ZW1iZXItdGVtcGxhdGVzXSgvYXBpL21vZHVsZXMvZW1iZXItdGVtcGxhdGVzLmh0bWwpCisgICAg
cGFja2FnZS4KKyAgCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItaHRt
bGJhcnMKKyAgICBAbWFpbiBlbWJlci1odG1sYmFycworICAgIEBwdWJsaWMKKyAgKi8KKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIF9lbWJlckh0bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcignaWYn
LCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNJZl91bmxlc3MuaWZIZWxwZXIpOworICBfZW1iZXJIdG1s
YmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIF9lbWJlckh0bWxiYXJzSGVscGVy
c0lmX3VubGVzcy51bmxlc3NIZWxwZXIpOworICBfZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0
ZXJIZWxwZXIoJ3dpdGgnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNXaXRoLmRlZmF1bHQpOworICBf
ZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJ2xvYycsIF9lbWJlckh0bWxiYXJz
SGVscGVyc0xvYy5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVs
cGVyKCdsb2cnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNMb2cuZGVmYXVsdCk7CisgIF9lbWJlckh0
bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcignZWFjaCcsIF9lbWJlckh0bWxiYXJzSGVscGVy
c0VhY2guZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcign
ZWFjaC1pbicsIF9lbWJlckh0bWxiYXJzSGVscGVyc0VhY2hJbi5kZWZhdWx0KTsKKyAgX2VtYmVy
SHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCctbm9ybWFsaXplLWNsYXNzJywgX2VtYmVy
SHRtbGJhcnNIZWxwZXJzTm9ybWFsaXplQ2xhc3MuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJz
SGVscGVycy5yZWdpc3RlckhlbHBlcignY29uY2F0JywgX2VtYmVySHRtbGJhcnNIZWxwZXJzQ29u
Y2F0LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJy1q
b2luLWNsYXNzZXMnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNKb2luQ2xhc3Nlcy5kZWZhdWx0KTsK
KyAgX2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCctaHRtbC1zYWZlJywgX2Vt
YmVySHRtbGJhcnNIZWxwZXJzSHRtbFNhZmUuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzSGVs
cGVycy5yZWdpc3RlckhlbHBlcignaGFzaCcsIF9lbWJlckh0bWxiYXJzSGVscGVyc0hhc2guZGVm
YXVsdCk7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSFRNTEJhcnMgPSB7CisgICAgdGVt
cGxhdGU6IF9lbWJlclRlbXBsYXRlQ29tcGlsZXIudGVtcGxhdGUsCisgICAgY29tcGlsZTogX2Vt
YmVyVGVtcGxhdGVDb21waWxlci5jb21waWxlLAorICAgIHByZWNvbXBpbGU6IF9lbWJlclRlbXBs
YXRlQ29tcGlsZXIucHJlY29tcGlsZSwKKyAgICBtYWtlQm91bmRIZWxwZXI6IF9lbWJlckh0bWxi
YXJzU3lzdGVtTWFrZV9ib3VuZF9oZWxwZXIuZGVmYXVsdCwKKyAgICByZWdpc3RlclBsdWdpbjog
X2VtYmVyVGVtcGxhdGVDb21waWxlci5yZWdpc3RlclBsdWdpbiwKKyAgICBET01IZWxwZXI6IF9l
bWJlckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLmRlZmF1bHQKKyAgfTsKKworICBfZW1iZXJIdG1s
YmFyc0hlbHBlci5kZWZhdWx0LmhlbHBlciA9IF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBlcjsK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGVscGVyID0gX2VtYmVySHRtbGJhcnNIZWxwZXIu
ZGVmYXVsdDsKKworICAvKioKKyAgICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVtcGxhdGVzLiBU
aGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0ZWQKKyAgICBieSB0aGUgYnVpbGQgdG9v
bHMgc28gdGhhdCB5b3UgY2FuIHN0b3JlIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgaW4KKyAg
ICBzZXBhcmF0ZSBmaWxlcyB0aGF0IGdldCBsb2FkZWQgaW50byBKYXZhU2NyaXB0IGF0IGJ1aWxk
dGltZS4KKyAgCisgICAgQHByb3BlcnR5IFRFTVBMQVRFUworICAgIEBmb3IgRW1iZXIKKyAgICBA
dHlwZSBPYmplY3QKKyAgICBAcHJpdmF0ZQorICAqLworICBPYmplY3QuZGVmaW5lUHJvcGVydHko
X2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQsICdURU1QTEFURVMnLCB7CisgICAgY29uZmlndXJhYmxl
OiBmYWxzZSwKKyAgICBnZXQ6IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkuZ2V0VGVt
cGxhdGVzLAorICAgIHNldDogX2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeS5zZXRUZW1w
bGF0ZXMKKyAgfSk7Cit9KTsKKworLy8gSW1wb3J0aW5nIGFkZHMgdGVtcGxhdGUgYm9vdHN0cmFw
cGluZworLy8gaW5pdGlhbGl6ZXIgdG8gZW5hYmxlIGVtYmVkZGVkIHRlbXBsYXRlcy4KKworLy8g
SW1wb3J0aW5nIGVtYmVyLWh0bWxiYXJzL2NvbXBhdCB1cGRhdGVzIHRoZQorLy8gRW1iZXIuSGFu
ZGxlYmFycyBnbG9iYWwgaWYgaHRtbGJhcnMgaXMgZW5hYmxlZC4KK2VuaWZlZCgnZW1iZXItaHRt
bGJhcnMva2V5d29yZHMnLCBbJ2V4cG9ydHMnLCAnaHRtbGJhcnMtcnVudGltZSddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMucmVnaXN0ZXJLZXl3b3JkID0gcmVnaXN0ZXJLZXl3b3JkOworCisgIC8qKgorICAg
QHByaXZhdGUKKyAgIEBwcm9wZXJ0eSBoZWxwZXJzCisgICovCisgIHZhciBrZXl3b3JkcyA9IE9i
amVjdC5jcmVhdGUoX2h0bWxiYXJzUnVudGltZS5ob29rcy5rZXl3b3Jkcyk7CisKKyAgLyoqCisg
IEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgIC8q
KgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfcmVnaXN0ZXJIZWxwZXIKKyAgICBAZm9yIEVt
YmVyLkhUTUxCYXJzCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKKyAgICBAcGFyYW0ge09iamVj
dHxGdW5jdGlvbn0ga2V5d29yZCBUaGUga2V5d29yZCB0byBhZGQuCisgICovCisKKyAgZnVuY3Rp
b24gcmVnaXN0ZXJLZXl3b3JkKG5hbWUsIGtleXdvcmQpIHsKKyAgICBrZXl3b3Jkc1tuYW1lXSA9
IGtleXdvcmQ7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBrZXl3b3JkczsKK30pOworZW5p
ZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWNvbXBvbmVudCcsIFsnZXhwb3J0
cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1l
dGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1tZXRhbC9l
bXB0eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1odG1sYmFy
cy9ob29rcy9zdWJleHByJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdlbWJlci1odG1sYmFycy91
dGlscy9leHRyYWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2xv
b2t1cC1jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9l
bWJlck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxTeW1ib2wsIF9lbWJlck1ldGFsU3RyZWFtc1N0
cmVhbSwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBf
ZW1iZXJIdG1sYmFyc0hvb2tzU3ViZXhwciwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxi
YXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1
cENvbXBvbmVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVy
LXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBjbG9zdXJlQ29tcG9uZW50OworICBleHBvcnRzLmlzQ29tcG9uZW50Q2VsbCA9IGlzQ29tcG9u
ZW50Q2VsbDsKKyAgZXhwb3J0cy5wcm9jZXNzUG9zaXRpb25hbFBhcmFtc0Zyb21DZWxsID0gcHJv
Y2Vzc1Bvc2l0aW9uYWxQYXJhbXNGcm9tQ2VsbDsKKyAgZXhwb3J0cy5tZXJnZUluTmV3SGFzaCA9
IG1lcmdlSW5OZXdIYXNoOworICB2YXIgQ09NUE9ORU5UX1JFRkVSRU5DRSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0NPTVBPTkVOVF9SRUZFUkVOQ0UnKTsKKyAgZXhwb3J0cy5DT01QT05F
TlRfUkVGRVJFTkNFID0gQ09NUE9ORU5UX1JFRkVSRU5DRTsKKyAgdmFyIENPTVBPTkVOVF9DRUxM
ID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnQ09NUE9ORU5UX0NFTEwnKTsKKyAgZXhwb3J0
cy5DT01QT05FTlRfQ0VMTCA9IENPTVBPTkVOVF9DRUxMOworICB2YXIgQ09NUE9ORU5UX1BBVEgg
PSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdDT01QT05FTlRfUEFUSCcpOworICBleHBvcnRz
LkNPTVBPTkVOVF9QQVRIID0gQ09NUE9ORU5UX1BBVEg7CisgIHZhciBDT01QT05FTlRfUE9TSVRJ
T05BTF9QQVJBTVMgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdDT01QT05FTlRfUE9TSVRJ
T05BTF9QQVJBTVMnKTsKKyAgZXhwb3J0cy5DT01QT05FTlRfUE9TSVRJT05BTF9QQVJBTVMgPSBD
T01QT05FTlRfUE9TSVRJT05BTF9QQVJBTVM7CisgIHZhciBDT01QT05FTlRfSEFTSCA9IF9lbWJl
ck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0NPTVBPTkVOVF9IQVNIJyk7CisKKyAgZXhwb3J0cy5DT01Q
T05FTlRfSEFTSCA9IENPTVBPTkVOVF9IQVNIOworICB2YXIgQ2xvc3VyZUNvbXBvbmVudFN0cmVh
bSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDog
ZnVuY3Rpb24gKGVudiwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB0aGlzLl9lbnYgPSBl
bnY7CisgICAgICB0aGlzLl9wYXRoID0gcGF0aDsKKyAgICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFt
czsKKyAgICAgIHRoaXMuX2hhc2ggPSBoYXNoOworICAgICAgdGhpcy5sYWJlbCA9IF9lbWJlckh0
bWxiYXJzSG9va3NTdWJleHByLmxhYmVsRm9yU3ViZXhwcihbcGF0aF0uY29uY2F0KHBhcmFtcyks
IGhhc2gsICdjb21wb25lbnQnKTsKKyAgICAgIHRoaXNbQ09NUE9ORU5UX1JFRkVSRU5DRV0gPSB0
cnVlOworICAgIH0sCisgICAgY29tcHV0ZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGNy
ZWF0ZUNsb3N1cmVDb21wb25lbnRDZWxsKHRoaXMuX2VudiwgdGhpcy5fcGF0aCwgdGhpcy5fcGFy
YW1zLCB0aGlzLl9oYXNoLCB0aGlzLmxhYmVsKTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9u
IGNsb3N1cmVDb21wb25lbnQoZW52LCBfcmVmMywgaGFzaCkgeworICAgIHZhciBwYXRoID0gX3Jl
ZjNbMF07CisKKyAgICB2YXIgcGFyYW1zID0gX3JlZjMuc2xpY2UoMSk7CisKKyAgICB2YXIgcyA9
IG5ldyBDbG9zdXJlQ29tcG9uZW50U3RyZWFtKGVudiwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKwor
ICAgIHMuYWRkRGVwZW5kZW5jeShwYXRoKTsKKworICAgIC8vIEZJWE1FOiBJZiB0aGUgc3RyZWFt
IGludmFsaWRhdGVzIG9uIGV2ZXJ5IHBhcmFtcyBvciBoYXNoIGNoYW5nZSwgdGhlbgorICAgIC8v
IHRoZSB7e2NvbXBvbmVudCBoZWxwZXIgd2lsbCBiZSBmb3JjZWQgdG8gcmUtcmVuZGVyIHRoZSB3
aG9sZSBjb21wb25lbnQKKyAgICAvLyBlYWNoIHRpbWUuIEluc3RlYWQsIHRoZXNlIGRlcGVuZGVu
Y2llcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGFuZCB0aGUKKyAgICAvLyBlbGVtZW50IGNvbXBv
bmVudCBrZXl3b3JkIHNob3VsZCBhZGQgdGhlIHBhcmFtcyBhbmQgaGFzaCBhcyBkZXBlbmRlbmNp
ZXMuCisgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgIHJldHVybiBz
LmFkZERlcGVuZGVuY3koaXRlbSk7CisgICAgfSk7CisgICAgT2JqZWN0LmtleXMoaGFzaCkuZm9y
RWFjaChmdW5jdGlvbiAoa2V5KSB7CisgICAgICByZXR1cm4gcy5hZGREZXBlbmRlbmN5KGhhc2hb
a2V5XSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gczsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0
ZUNsb3N1cmVDb21wb25lbnRDZWxsKGVudiwgb3JpZ2luYWxDb21wb25lbnRQYXRoLCBwYXJhbXMs
IGhhc2gsIGxhYmVsKSB7CisgICAgdmFyIGNvbXBvbmVudFBhdGggPSBfZW1iZXJNZXRhbFN0cmVh
bXNVdGlscy5yZWFkKG9yaWdpbmFsQ29tcG9uZW50UGF0aCk7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnQ29tcG9uZW50IHBhdGggY2Fubm90IGJlIG51bGwgaW4gJyArIGxhYmVsLCAh
X2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoY29tcG9uZW50UGF0aCkpOworCisgICAgdmFyIG5l
d0hhc2ggPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCksIGhhc2gpOworCisgICAgaWYgKGlzQ29tcG9uZW50Q2VsbChjb21wb25l
bnRQYXRoKSkgeworICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZENsb3N1cmVDb21wb25lbnRDZWxs
KGNvbXBvbmVudFBhdGgsIHBhcmFtcywgbmV3SGFzaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgY29tcG9uZW50IGhlbHBlciBjYW5ub3QgYmUgdXNl
ZCB3aXRob3V0IGEgdmFsaWQgY29tcG9uZW50IG5hbWUuIFlvdSB1c2VkICInICsgY29tcG9uZW50
UGF0aCArICciIHZpYSAnICsgbGFiZWwsIGlzVmFsaWRDb21wb25lbnRQYXRoKGVudiwgY29tcG9u
ZW50UGF0aCkpOworICAgICAgcmV0dXJuIGNyZWF0ZU5ld0Nsb3N1cmVDb21wb25lbnRDZWxsKGVu
diwgY29tcG9uZW50UGF0aCwgcGFyYW1zLCBuZXdIYXNoKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBpc1ZhbGlkQ29tcG9uZW50UGF0aChlbnYsIHBhdGgpIHsKKyAgICB2YXIgcmVzdWx0ID0g
X2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1cENvbXBvbmVudC5kZWZhdWx0KGVudi5vd25lciwgcGF0
aCk7CisKKyAgICByZXR1cm4gISEocmVzdWx0LmNvbXBvbmVudCB8fCByZXN1bHQubGF5b3V0KTsK
KyAgfQorCisgIGZ1bmN0aW9uIGlzQ29tcG9uZW50Q2VsbChjb21wb25lbnQpIHsKKyAgICByZXR1
cm4gY29tcG9uZW50ICYmIGNvbXBvbmVudFtDT01QT05FTlRfQ0VMTF07CisgIH0KKworICBmdW5j
dGlvbiBjcmVhdGVOZXN0ZWRDbG9zdXJlQ29tcG9uZW50Q2VsbChjb21wb25lbnRDZWxsLCBwYXJh
bXMsIGhhc2gpIHsKKyAgICB2YXIgX3JlZjsKKworICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9u
ZSBpbiBlYWNoIG5lc3RpbmcgbGV2ZWwgdG8gYXZvaWQgcmFpc2luZyBhc3NlcnRpb25zLgorICAg
IHByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50Q2VsbCwgcGFyYW1zLCBo
YXNoKTsKKworICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZbQ09NUE9ORU5UX1BBVEhdID0gY29t
cG9uZW50Q2VsbFtDT01QT05FTlRfUEFUSF0sIF9yZWZbQ09NUE9ORU5UX0hBU0hdID0gbWVyZ2VJ
bk5ld0hhc2goY29tcG9uZW50Q2VsbFtDT01QT05FTlRfSEFTSF0sIGhhc2gpLCBfcmVmW0NPTVBP
TkVOVF9QT1NJVElPTkFMX1BBUkFNU10gPSBjb21wb25lbnRDZWxsW0NPTVBPTkVOVF9QT1NJVElP
TkFMX1BBUkFNU10sIF9yZWZbQ09NUE9ORU5UX0NFTExdID0gdHJ1ZSwgX3JlZjsKKyAgfQorCisg
IGZ1bmN0aW9uIHByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50Q2VsbCwg
cGFyYW1zLCBoYXNoKSB7CisgICAgdmFyIHBvc2l0aW9uYWxQYXJhbXMgPSBjb21wb25lbnRDZWxs
W0NPTVBPTkVOVF9QT1NJVElPTkFMX1BBUkFNU107CisKKyAgICBfZW1iZXJIdG1sYmFyc1V0aWxz
RXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMucHJvY2Vzc1Bvc2l0aW9uYWxQYXJhbXMobnVsbCwgcG9z
aXRpb25hbFBhcmFtcywgcGFyYW1zLCBoYXNoKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU5l
d0Nsb3N1cmVDb21wb25lbnRDZWxsKGVudiwgY29tcG9uZW50UGF0aCwgcGFyYW1zLCBoYXNoKSB7
CisgICAgdmFyIF9yZWYyOworCisgICAgdmFyIHBvc2l0aW9uYWxQYXJhbXMgPSBnZXRQb3NpdGlv
bmFsUGFyYW1zKGVudi5vd25lciwgY29tcG9uZW50UGF0aCk7CisKKyAgICAvLyBUaGlzIG5lZWRz
IHRvIGJlIGRvbmUgaW4gZWFjaCBuZXN0aW5nIGxldmVsIHRvIGF2b2lkIHJhaXNpbmcgYXNzZXJ0
aW9ucy4KKyAgICBfZW1iZXJIdG1sYmFyc1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMucHJv
Y2Vzc1Bvc2l0aW9uYWxQYXJhbXMobnVsbCwgcG9zaXRpb25hbFBhcmFtcywgcGFyYW1zLCBoYXNo
KTsKKworICAgIHJldHVybiBfcmVmMiA9IHt9LCBfcmVmMltDT01QT05FTlRfUEFUSF0gPSBjb21w
b25lbnRQYXRoLCBfcmVmMltDT01QT05FTlRfSEFTSF0gPSBoYXNoLCBfcmVmMltDT01QT05FTlRf
UE9TSVRJT05BTF9QQVJBTVNdID0gcG9zaXRpb25hbFBhcmFtcywgX3JlZjJbQ09NUE9ORU5UX0NF
TExdID0gdHJ1ZSwgX3JlZjI7CisgIH0KKworICAvKgorICAgUmV0dXJucyB0aGUgcG9zaXRpb25h
bCBwYXJhbWV0ZXJzIGZvciBjb21wb25lbnQgYGNvbXBvbmVudFBhdGhgLgorICAgSWYgaXQgaGFz
IG5vIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgaXQgcmV0dXJucyB0aGUgZW1wdHkgYXJyYXkuCisg
ICAqLworICBmdW5jdGlvbiBnZXRQb3NpdGlvbmFsUGFyYW1zKGNvbnRhaW5lciwgY29tcG9uZW50
UGF0aCkgeworICAgIGlmICghY29tcG9uZW50UGF0aCkgeworICAgICAgcmV0dXJuIFtdOworICAg
IH0KKyAgICB2YXIgcmVzdWx0ID0gX2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1cENvbXBvbmVudC5k
ZWZhdWx0KGNvbnRhaW5lciwgY29tcG9uZW50UGF0aCk7CisgICAgdmFyIGNvbXBvbmVudCA9IHJl
c3VsdC5jb21wb25lbnQ7CisKKyAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5wb3NpdGlv
bmFsUGFyYW1zKSB7CisgICAgICByZXR1cm4gY29tcG9uZW50LnBvc2l0aW9uYWxQYXJhbXM7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBbXTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBt
ZXJnZUluTmV3SGFzaChvcmlnaW5hbCwgdXBkYXRlcykgeworICAgIHJldHVybiBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBvcmlnaW5hbCwgdXBkYXRlcyk7CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jb21wb25lbnQnLCBbJ2V4cG9ydHMnLCAnaHRtbGJh
cnMtcnVudGltZS9ob29rcycsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWNvbXBv
bmVudCcsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfaHRtbGJhcnNSdW50aW1lSG9va3MsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2VtYmVy
TWV0YWxBc3NpZ24pIHsKKyAgLyoqCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUg
ZW1iZXItdGVtcGxhdGVzCisgICAgQHB1YmxpYworICAqLworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICAgVGhlIGB7e2NvbXBvbmVudH19YCBoZWxwZXIgbGV0cyB5b3UgYWRkIGluc3RhbmNl
cyBvZiBgRW1iZXIuQ29tcG9uZW50YCB0byBhCisgICAgdGVtcGxhdGUuIFNlZSBbRW1iZXIuQ29t
cG9uZW50XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpIGZvcgorICAgIGFkZGl0
aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEgYENvbXBvbmVudGAgZnVuY3Rpb25zLgorICAgIGB7
e2NvbXBvbmVudH19YCdzIHByaW1hcnkgdXNlIGlzIGZvciBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0
byBkeW5hbWljYWxseQorICAgIGNoYW5nZSB3aGljaCB0eXBlIG9mIGNvbXBvbmVudCBpcyByZW5k
ZXJlZCBhcyB0aGUgc3RhdGUgb2YgeW91ciBhcHBsaWNhdGlvbgorICAgIGNoYW5nZXMuIFRoZSBw
cm92aWRlZCBibG9jayB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgY29t
cG9uZW50LgorICAgIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRoZSBmb2xsb3dpbmcgdGVtcGxh
dGU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyEgYXBwbGljYXRpb24uaGJzIH19Cisg
ICAge3tjb21wb25lbnQgaW5mb2dyYXBoaWNDb21wb25lbnROYW1lfX0KKyAgICBgYGAKKyAgCisg
ICAgQW5kIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY29kZToKKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAg
IGluZm9ncmFwaGljQ29tcG9uZW50TmFtZTogY29tcHV0ZWQoJ2lzTWFya2V0T3BlbicsIHsKKyAg
ICAgICAgZ2V0KCkgeworICAgICAgICAgIGlmICh0aGlzLmdldCgnaXNNYXJrZXRPcGVuJykpIHsK
KyAgICAgICAgICAgIHJldHVybiAnbGl2ZS11cGRhdGluZy1jaGFydCc7CisgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHJldHVybiAnbWFya2V0LWNsb3NlLXN1bW1hcnknOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgVGhl
IGBsaXZlLXVwZGF0aW5nLWNoYXJ0YCBjb21wb25lbnQgd2lsbCBiZSBhcHBlbmRlZCB3aGVuIGBp
c01hcmtldE9wZW5gIGlzCisgICAgYHRydWVgLCBhbmQgdGhlIGBtYXJrZXQtY2xvc2Utc3VtbWFy
eWAgY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWQgd2hlbgorICAgIGBpc01hcmtldE9wZW5gIGlz
IGBmYWxzZWAuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzIHdoaWxlIHRoZSBhcHAgaXMgcnVubmluZywK
KyAgICB0aGUgY29tcG9uZW50IHdpbGwgYmUgYXV0b21hdGljYWxseSBzd2FwcGVkIG91dCBhY2Nv
cmRpbmdseS4KKyAgICBOb3RlOiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBoZWxwZXIgd2hlbiB5
b3UgYXJlIGNvbnNpc3RlbnRseSByZW5kZXJpbmcgdGhlIHNhbWUKKyAgICBjb21wb25lbnQuIElu
IHRoYXQgY2FzZSwgdXNlIHN0YW5kYXJkIGNvbXBvbmVudCBzeW50YXgsIGZvciBleGFtcGxlOgor
ICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3shIGFwcGxpY2F0aW9uLmhicyB9fQorICAgIHt7
bGl2ZS11cGRhdGluZy1jaGFydH19CisgICAgYGBgCisgIAorICAgICMjIE5lc3RlZCBVc2FnZQor
ICAKKyAgICBUaGUgYGNvbXBvbmVudGAgaGVscGVyIGNhbiBiZSB1c2VkIHRvIHBhY2thZ2UgYSBj
b21wb25lbnQgcGF0aCB3aXRoIGluaXRpYWwgYXR0cnMuCisgICAgVGhlIGluY2x1ZGVkIGF0dHJz
IGNhbiB0aGVuIGJlIG1lcmdlZCBkdXJpbmcgdGhlIGZpbmFsIGludm9jYXRpb24uCisgIAorICAg
IEZvciBleGFtcGxlLCBnaXZlbiBhIGBwZXJzb24tZm9ybWAgY29tcG9uZW50IHdpdGggdGhlIGZv
bGxvd2luZyB0ZW1wbGF0ZToKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7eWllbGQgKGhh
c2gKKyAgICAgICAgbmFtZUlucHV0PShjb21wb25lbnQgIm15LWlucHV0LWNvbXBvbmVudCIgdmFs
dWU9bW9kZWwubmFtZSBwbGFjZWhvbGRlcj0iRmlyc3QgTmFtZSIpKX19CisgICAgYGBgCisgIAor
ICAgIFRoZSBmb2xsb3dpbmcgc25pcHBldDoKKyAgCisgICAgYGBgCisgICAge3sjcGVyc29uLWZv
cm0gYXMgfGZvcm18fX0KKyAgICAgIHt7Y29tcG9uZW50IGZvcm0ubmFtZUlucHV0IHBsYWNlaG9s
ZGVyPSJVc2VybmFtZSJ9fQorICAgIHt7L3BlcnNvbi1mb3JtfX0KKyAgICBgYGAKKyAgCisgICAg
d291bGQgb3V0cHV0IGFuIGlucHV0IHdob3NlIHZhbHVlIGlzIGFscmVhZHkgYm91bmQgdG8gYG1v
ZGVsLm5hbWVgIGFuZCBgcGxhY2Vob2xkZXJgCisgICAgaXMgIlVzZXJuYW1lIi4KKyAgCisgICAg
QG1ldGhvZCBjb21wb25lbnQKKyAgICBAc2luY2UgMS4xMS4wCisgICAgQGZvciBFbWJlci5UZW1w
bGF0ZXMuaGVscGVycworICAgIEBwdWJsaWMKKyAgKi8KKworICBleHBvcnRzLmRlZmF1bHQgPSBm
dW5jdGlvbiAobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICBpZiAoIW1vcnBoKSB7CisgICAgICByZXR1cm4gX2VtYmVySHRt
bGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuZGVmYXVsdChlbnYsIHBhcmFtcywgaGFzaCk7
CisgICAgfQorCisgICAgdmFyIG5ld0hhc2ggPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5l
dyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksIGhhc2gpOworCisgICAgX2h0bWxi
YXJzUnVudGltZUhvb2tzLmtleXdvcmQoJ0BlbGVtZW50X2NvbXBvbmVudCcsIG1vcnBoLCBlbnYs
IHNjb3BlLCBwYXJhbXMsIG5ld0hhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKKyAgfTsKK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jk
cy9kZWJ1Z2dlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZyddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZykgeworICAvKmpzaGludCBkZWJ1Zzp0cnVlKi8KKwor
ICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICov
CisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGRlYnVnZ2VyS2V5d29y
ZDsKKworICAvKioKKyAgICBFeGVjdXRlIHRoZSBgZGVidWdnZXJgIHN0YXRlbWVudCBpbiB0aGUg
Y3VycmVudCB0ZW1wbGF0ZSdzIGNvbnRleHQuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
e2RlYnVnZ2VyfX0KKyAgICBgYGAKKyAgCisgICAgV2hlbiB1c2luZyB0aGUgZGVidWdnZXIgaGVs
cGVyIHlvdSB3aWxsIGhhdmUgYWNjZXNzIHRvIGEgYGdldGAgZnVuY3Rpb24uIFRoaXMKKyAgICBm
dW5jdGlvbiByZXRyaWV2ZXMgdmFsdWVzIGF2YWlsYWJsZSBpbiB0aGUgY29udGV4dCBvZiB0aGUg
dGVtcGxhdGUuCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB3b25kZXJpbmcgd2h5IGEgdmFs
dWUgYHt7Zm9vfX1gIGlzbid0IHJlbmRlcmluZyBhcworICAgIGV4cGVjdGVkIHdpdGhpbiBhIHRl
bXBsYXRlLCB5b3UgY291bGQgcGxhY2UgYSBge3tkZWJ1Z2dlcn19YCBzdGF0ZW1lbnQgYW5kLAor
ICAgIHdoZW4gdGhlIGBkZWJ1Z2dlcjtgIGJyZWFrcG9pbnQgaXMgaGl0LCB5b3UgY2FuIGF0dGVt
cHQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZToKKyAgCisgICAgYGBgCisgICAgPiBnZXQoJ2Zvbycp
CisgICAgYGBgCisgIAorICAgIGBnZXRgIGlzIGFsc28gYXdhcmUgb2Yga2V5d29yZHMuIFNvIGlu
IHRoaXMgc2l0dWF0aW9uCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNlYWNoIGl0ZW1z
IGFzIHxpdGVtfH19CisgICAgICB7e2RlYnVnZ2VyfX0KKyAgICB7ey9lYWNofX0KKyAgICBgYGAK
KyAgCisgICAgWW91J2xsIGJlIGFibGUgdG8gZ2V0IHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IGl0
ZW06CisgIAorICAgIGBgYAorICAgID4gZ2V0KCdpdGVtLm5hbWUnKQorICAgIGBgYAorICAKKyAg
ICBZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBjb250ZXh0IG9mIHRoZSB2aWV3IHRvIG1ha2Ugc3Vy
ZSBpdCBpcyB0aGUgb2JqZWN0IHRoYXQKKyAgICB5b3UgZXhwZWN0OgorICAKKyAgICBgYGAKKyAg
ICA+IGNvbnRleHQKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBkZWJ1Z2dlcgorICAgIEBmb3Ig
RW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
ZGVidWdnZXJLZXl3b3JkKG1vcnBoLCBlbnYsIHNjb3BlKSB7CisgICAgLyoganNoaW50IHVudXNl
ZDogZmFsc2UsIGRlYnVnOiB0cnVlICovCisKKyAgICB2YXIgdmlldyA9IGVudi5ob29rcy5nZXRW
YWx1ZShzY29wZS5nZXRMb2NhbCgndmlldycpKTsKKyAgICB2YXIgY29udGV4dCA9IGVudi5ob29r
cy5nZXRWYWx1ZShzY29wZS5nZXRTZWxmKCkpOworCisgICAgZnVuY3Rpb24gZ2V0KHBhdGgpIHsK
KyAgICAgIHJldHVybiBlbnYuaG9va3MuZ2V0VmFsdWUoZW52Lmhvb2tzLmdldChlbnYsIHNjb3Bl
LCBwYXRoKSk7CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5pbmZvKCdVc2UgYHZpZXdg
LCBgY29udGV4dGAsIGFuZCBgZ2V0KDxwYXRoPilgIHRvIGRlYnVnIHRoaXMgdGVtcGxhdGUuJyk7
CisKKyAgICBkZWJ1Z2dlcjsKKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1jb21wb25lbnQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtY29t
cG9uZW50JywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2xvb2t1cC1jb21wb25lbnQnLCAnZW1iZXIt
aHRtbGJhcnMvdXRpbHMvZXh0cmFjdC1wb3NpdGlvbmFsLXBhcmFtcyddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29t
cG9uZW50LCBfZW1iZXJIdG1sYmFyc1V0aWxzTG9va3VwQ29tcG9uZW50LCBfZW1iZXJIdG1sYmFy
c1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBzZXR1cFN0YXRlOiBmdW5jdGlvbiAobGFzdFN0YXRlLCBl
bnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gpIHsKKyAgICAgIHZhciBjb21wb25lbnRQYXRoID0gZ2V0
Q29tcG9uZW50UGF0aChwYXJhbXNbMF0sIGVudik7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdCh7fSwgbGFzdFN0YXRlLCB7CisgICAgICAgIGNvbXBvbmVudFBhdGg6IGNv
bXBvbmVudFBhdGgsCisgICAgICAgIGlzQ29tcG9uZW50SGVscGVyOiB0cnVlCisgICAgICB9KTsK
KyAgICB9LAorCisgICAgcmVuZGVyOiBmdW5jdGlvbiAobW9ycGgpIHsKKyAgICAgIHZhciBzdGF0
ZSA9IG1vcnBoLmdldFN0YXRlKCk7CisKKyAgICAgIGlmIChzdGF0ZS5tYW5hZ2VyKSB7CisgICAg
ICAgIHN0YXRlLm1hbmFnZXIuZGVzdHJveSgpOworICAgICAgfQorCisgICAgICAvLyBGb3JjZSB0
aGUgY29tcG9uZW50IGhvb2sgdG8gdHJlYXQgdGhpcyBhcyBhIGZpcnN0LXRpbWUgcmVuZGVyLAor
ICAgICAgLy8gYmVjYXVzZSBub3JtYWwgY29tcG9uZW50cyAoYDxmb28tYmFyPmApIGNhbm5vdCBj
aGFuZ2UgYXQgcnVudGltZSwKKyAgICAgIC8vIGJ1dCB0aGUgYHt7Y29tcG9uZW50fX1gIGhlbHBl
ciBjYW4uCisgICAgICBzdGF0ZS5tYW5hZ2VyID0gbnVsbDsKKworICAgICAgZm9yICh2YXIgX2xl
biA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDog
MCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIHJlc3RbX2tleSAt
IDFdID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZW5kZXIuYXBwbHkodW5k
ZWZpbmVkLCBbbW9ycGhdLmNvbmNhdChyZXN0KSk7CisgICAgfSwKKworICAgIHJlcmVuZGVyOiBy
ZW5kZXIKKyAgfTsKKworICBmdW5jdGlvbiBnZXRDb21wb25lbnRQYXRoKHBhcmFtLCBlbnYpIHsK
KyAgICB2YXIgcGF0aCA9IGVudi5ob29rcy5nZXRWYWx1ZShwYXJhbSk7CisgICAgaWYgKF9lbWJl
ckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LmlzQ29tcG9uZW50Q2VsbChwYXRoKSkg
eworICAgICAgcGF0aCA9IHBhdGhbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25l
bnQuQ09NUE9ORU5UX1BBVEhdOworICAgIH0KKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIGZ1
bmN0aW9uIHJlbmRlcihtb3JwaCwgZW52LCBzY29wZSwgX3JlZiwgaGFzaCwgdGVtcGxhdGUsIGlu
dmVyc2UsIHZpc2l0b3IpIHsKKyAgICB2YXIgcGF0aCA9IF9yZWZbMF07CisKKyAgICB2YXIgcGFy
YW1zID0gX3JlZi5zbGljZSgxKTsKKworICAgIHZhciBpc1JlcmVuZGVyID0gYXJndW1lbnRzLmxl
bmd0aCA8PSA4IHx8IGFyZ3VtZW50c1s4XSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBhcmd1bWVu
dHNbOF07CisKKyAgICB2YXIgX21vcnBoJGdldFN0YXRlID0gbW9ycGguZ2V0U3RhdGUoKTsKKwor
ICAgIHZhciBjb21wb25lbnRQYXRoID0gX21vcnBoJGdldFN0YXRlLmNvbXBvbmVudFBhdGg7CisK
KyAgICAvLyBJZiB0aGUgdmFsdWUgcGFzc2VkIHRvIHRoZSB7e2NvbXBvbmVudH19IGhlbHBlciBp
cyB1bmRlZmluZWQgb3IgbnVsbCwKKyAgICAvLyBkb24ndCBjcmVhdGUgYSBuZXcgQ29tcG9uZW50
Tm9kZS4KKyAgICBpZiAoY29tcG9uZW50UGF0aCA9PT0gdW5kZWZpbmVkIHx8IGNvbXBvbmVudFBh
dGggPT09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYXRoID0gZW52Lmhv
b2tzLmdldFZhbHVlKHBhdGgpOworCisgICAgaWYgKGlzUmVyZW5kZXIpIHsKKyAgICAgIHZhciBy
ZXN1bHQgPSBfZW1iZXJIdG1sYmFyc1V0aWxzTG9va3VwQ29tcG9uZW50LmRlZmF1bHQoZW52Lm93
bmVyLCBjb21wb25lbnRQYXRoKTsKKyAgICAgIHZhciBjb21wb25lbnQgPSByZXN1bHQuY29tcG9u
ZW50OworCisgICAgICBfZW1iZXJIdG1sYmFyc1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMu
ZGVmYXVsdChudWxsLCBjb21wb25lbnQsIHBhcmFtcywgaGFzaCk7CisgICAgfQorCisgICAgaWYg
KF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LmlzQ29tcG9uZW50Q2VsbChw
YXRoKSkgeworICAgICAgdmFyIGNsb3N1cmVDb21wb25lbnQgPSBlbnYuaG9va3MuZ2V0VmFsdWUo
cGF0aCk7CisKKyAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBlYWNoIG5lc3Rpbmcg
bGV2ZWwgdG8gYXZvaWQgcmFpc2luZyBhc3NlcnRpb25zCisgICAgICBfZW1iZXJIdG1sYmFyc0tl
eXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5wcm9jZXNzUG9zaXRpb25hbFBhcmFtc0Zyb21DZWxsKGNs
b3N1cmVDb21wb25lbnQsIHBhcmFtcywgaGFzaCk7CisgICAgICBwYXJhbXMgPSBbXTsKKyAgICAg
IGhhc2ggPSBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5tZXJnZUluTmV3
SGFzaChjbG9zdXJlQ29tcG9uZW50W19lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9u
ZW50LkNPTVBPTkVOVF9IQVNIXSwgaGFzaCk7CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlcyA9
IHsgZGVmYXVsdDogdGVtcGxhdGUsIGludmVyc2U6IGludmVyc2UgfTsKKyAgICBlbnYuaG9va3Mu
Y29tcG9uZW50KG1vcnBoLCBlbnYsIHNjb3BlLCBjb21wb25lbnRQYXRoLCBwYXJhbXMsIGhhc2gs
IHRlbXBsYXRlcywgdmlzaXRvcik7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9r
ZXl3b3Jkcy9nZXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1o
dG1sYmFycy91dGlscy9zdWJzY3JpYmUnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9vYnNlcnZlciddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLCBf
ZW1iZXJNZXRhbFN0cmVhbXNVdGlscywgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRh
bE9ic2VydmVyKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIGxhYmVsRm9y
KHNvdXJjZSwga2V5KSB7CisgICAgdmFyIHNvdXJjZUxhYmVsID0gc291cmNlLmxhYmVsID8gc291
cmNlLmxhYmVsIDogJyc7CisgICAgdmFyIGtleUxhYmVsID0ga2V5LmxhYmVsID8ga2V5LmxhYmVs
IDogJyc7CisgICAgcmV0dXJuICcoZ2V0ICcgKyBzb3VyY2VMYWJlbCArICcgJyArIGtleUxhYmVs
ICsgJyknOworICB9CisKKyAgdmFyIER5bmFtaWNLZXlTdHJlYW0gPSBfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0uZGVmYXVsdC5leHRlbmQoeworICAgIGluaXQ6IGZ1bmN0aW9uIChzb3VyY2UsIGtl
eVNvdXJjZSkgeworICAgICAgLy8gVXNlZCB0byBnZXQgdGhlIG9yaWdpbmFsIHBhdGggZm9yIGRl
YnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAgIHZhciBsYWJlbCA9IGxhYmVsRm9yKHNvdXJjZSwga2V5
U291cmNlKTsKKworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgdGhpcy5wYXRoID0g
bGFiZWw7CisgICAgICB0aGlzLnNvdXJjZURlcCA9IHRoaXMuYWRkTXV0YWJsZURlcGVuZGVuY3ko
c291cmNlKTsKKyAgICAgIHRoaXMua2V5RGVwID0gdGhpcy5hZGRNdXRhYmxlRGVwZW5kZW5jeShr
ZXlTb3VyY2UpOworICAgICAgdGhpcy5vYnNlcnZlZE9iamVjdCA9IG51bGw7CisgICAgICB0aGlz
Lm9ic2VydmVkS2V5ID0gbnVsbDsKKyAgICB9LAorCisgICAga2V5OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIga2V5ID0gdGhpcy5rZXlEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmICh0eXBlb2Yg
a2V5ID09PSAnc3RyaW5nJykgeworICAgICAgICByZXR1cm4ga2V5OworICAgICAgfQorICAgIH0s
CisKKyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5z
b3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIHZhciBrZXkgPSB0aGlzLmtleSgpOworICAgICAg
aWYgKG9iamVjdCAmJiBrZXkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldChvYmplY3QsIGtleSk7CisgICAgICB9CisgICAgfSwKKworICAgIHNldFZhbHVlOiBm
dW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIHZhciBvYmplY3QgPSB0aGlzLnNvdXJjZURlcC5nZXRW
YWx1ZSgpOworICAgICAgdmFyIGtleSA9IHRoaXMua2V5KCk7CisgICAgICBpZiAob2JqZWN0KSB7
CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChvYmplY3QsIGtleSwgdmFsdWUp
OworICAgICAgfQorICAgIH0sCisKKyAgICBfc3VwZXIkcmV2YWxpZGF0ZTogX2VtYmVyTWV0YWxT
dHJlYW1zU3RyZWFtLmRlZmF1bHQucHJvdG90eXBlLnJldmFsaWRhdGUsCisKKyAgICByZXZhbGlk
YXRlOiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIHRoaXMuX3N1cGVyJHJldmFsaWRhdGUodmFs
dWUpOworCisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAg
ICAgIHZhciBrZXkgPSB0aGlzLmtleSgpOworICAgICAgaWYgKG9iamVjdCAhPT0gdGhpcy5vYnNl
cnZlZE9iamVjdCB8fCBrZXkgIT09IHRoaXMub2JzZXJ2ZWRLZXkpIHsKKyAgICAgICAgdGhpcy5f
Y2xlYXJPYnNlcnZlZE9iamVjdCgpOworCisgICAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9i
amVjdCA9PT0gJ29iamVjdCcgJiYga2V5KSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxPYnNlcnZl
ci5hZGRPYnNlcnZlcihvYmplY3QsIGtleSwgdGhpcywgdGhpcy5ub3RpZnkpOworICAgICAgICAg
IHRoaXMub2JzZXJ2ZWRPYmplY3QgPSBvYmplY3Q7CisgICAgICAgICAgdGhpcy5vYnNlcnZlZEtl
eSA9IGtleTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBfY2xlYXJPYnNlcnZl
ZE9iamVjdDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMub2JzZXJ2ZWRPYmplY3QpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxPYnNlcnZlci5yZW1vdmVPYnNlcnZlcih0aGlzLm9ic2VydmVk
T2JqZWN0LCB0aGlzLm9ic2VydmVkS2V5LCB0aGlzLCB0aGlzLm5vdGlmeSk7CisgICAgICAgIHRo
aXMub2JzZXJ2ZWRPYmplY3QgPSBudWxsOworICAgICAgICB0aGlzLm9ic2VydmVkS2V5ID0gbnVs
bDsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIHZhciBidWlsZFN0cmVhbSA9IGZ1bmN0aW9u
IGJ1aWxkU3RyZWFtKHBhcmFtcykgeworICAgIHZhciBvYmpSZWYgPSBwYXJhbXNbMF07CisgICAg
dmFyIHBhdGhSZWYgPSBwYXJhbXNbMV07CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
VGhlIGZpcnN0IGFyZ3VtZW50IHRvIHt7Z2V0fX0gbXVzdCBiZSBhIHN0cmVhbScsIF9lbWJlck1l
dGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9ialJlZikpOworICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCd7e2dldH19IHJlcXVpcmVzIGF0IGxlYXN0IHR3byBhcmd1bWVudHMnLCBwYXJhbXMu
bGVuZ3RoID4gMSk7CisKKyAgICB2YXIgc3RyZWFtID0gYnVpbGREeW5hbWljS2V5U3RyZWFtKG9i
alJlZiwgcGF0aFJlZik7CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9OworCisgIGZ1bmN0aW9u
IGJ1aWxkRHluYW1pY0tleVN0cmVhbShzb3VyY2UsIGtleVNvdXJjZSkgeworICAgIGlmICghX2Vt
YmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0oa2V5U291cmNlKSkgeworICAgICAgcmV0dXJu
IHNvdXJjZS5nZXQoa2V5U291cmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBE
eW5hbWljS2V5U3RyZWFtKHNvdXJjZSwga2V5U291cmNlKTsKKyAgICB9CisgIH0KKworICAvKioK
KyAgICBEeW5hbWljYWxseSBsb29rIHVwIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBUaGUgc2Vj
b25kIGFyZ3VtZW50IHRvIGB7e2dldH19YAorICAgIHNob3VsZCBoYXZlIGEgc3RyaW5nIHZhbHVl
LCBhbHRob3VnaCBpdCBjYW4gYmUgYm91bmQuCisgIAorICAgIEZvciBleGFtcGxlLCB0aGVzZSB0
d28gdXNhZ2VzIGFyZSBlcXVpdmlsZW50OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tw
ZXJzb24uaGVpZ2h0fX0KKyAgICB7e2dldCBwZXJzb24gImhlaWdodCJ9fQorICAgIGBgYAorICAK
KyAgICBJZiB0aGVyZSB3ZXJlIHNldmVyYWwgZmFjdHMgYWJvdXQgYSBwZXJzb24sIHRoZSBge3tn
ZXR9fWAgaGVscGVyIGNhbiBkeW5hbWljYWxseQorICAgIHBpY2sgb25lOgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3tnZXQgcGVyc29uIGZhY3ROYW1lfX0KKyAgICBgYGAKKyAgCisgICAg
Rm9yIGEgbW9yZSBjb21wbGV4IGV4YW1wbGUsIHRoaXMgdGVtcGxhdGUgd291bGQgYWxsb3cgdGhl
IHVzZXIgdG8gc3dpdGNoCisgICAgYmV0d2VlbiBzaG93aW5nIHRoZSB1c2VyJ3MgaGVpZ2h0IGFu
ZCB3ZWlnaHQgd2l0aCBhIGNsaWNrOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tnZXQg
cGVyc29uIGZhY3ROYW1lfX0KKyAgICA8YnV0dG9uIHt7YWN0aW9uIChtdXQgZmFjdE5hbWUpICJo
ZWlnaHQifX0+U2hvdyBoZWlnaHQ8L2J1dHRvbj4KKyAgICA8YnV0dG9uIHt7YWN0aW9uIChtdXQg
ZmFjdE5hbWUpICJ3ZWlnaHQifX0+U2hvdyB3ZWlnaHQ8L2J1dHRvbj4KKyAgICBgYGAKKyAgCisg
ICAgVGhlIGB7e2dldH19YCBoZWxwZXIgY2FuIGFsc28gcmVzcGVjdCBtdXRhYmxlIHZhbHVlcyBp
dHNlbGYuIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tpbnB1dCB2
YWx1ZT0obXV0IChnZXQgcGVyc29uIGZhY3ROYW1lKSkgdHlwZT0idGV4dCJ9fQorICAgIDxidXR0
b24ge3thY3Rpb24gKG11dCBmYWN0TmFtZSkgImhlaWdodCJ9fT5TaG93IGhlaWdodDwvYnV0dG9u
PgorICAgIDxidXR0b24ge3thY3Rpb24gKG11dCBmYWN0TmFtZSkgIndlaWdodCJ9fT5TaG93IHdl
aWdodDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBXb3VsZCBhbGxvdyB0aGUgdXNlciB0byBz
d2FwIHdoYXQgZmFjdCBpcyBiZWluZyBkaXNwbGF5ZWQsIGFuZCBhbHNvIGVkaXQKKyAgICB0aGF0
IGZhY3QgdmlhIGEgdHdvLXdheSBtdXRhYmxlIGJpbmRpbmcuCisgIAorICAgIEBwdWJsaWMKKyAg
ICBAbWV0aG9kIGdldAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAc2lu
Y2UgMi4xLjAKKyAgKi8KKyAgZnVuY3Rpb24gZ2V0S2V5d29yZChtb3JwaCwgZW52LCBzY29wZSwg
cGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGlmIChtb3Jw
aCA9PT0gbnVsbCkgeworICAgICAgcmV0dXJuIGJ1aWxkU3RyZWFtKHBhcmFtcyk7CisgICAgfSBl
bHNlIHsKKyAgICAgIHZhciBzdHJlYW0gPSB1bmRlZmluZWQ7CisgICAgICBpZiAobW9ycGgubGlu
a2VkUmVzdWx0KSB7CisgICAgICAgIHN0cmVhbSA9IG1vcnBoLmxpbmtlZFJlc3VsdDsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHN0cmVhbSA9IGJ1aWxkU3RyZWFtKHBhcmFtcyk7CisKKyAgICAg
ICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZS5kZWZhdWx0KG1vcnBoLCBlbnYsIHNjb3Bl
LCBzdHJlYW0pOworICAgICAgICBlbnYuaG9va3MubGlua1JlbmRlck5vZGUobW9ycGgsIGVudiwg
c2NvcGUsIG51bGwsIHBhcmFtcywgaGFzaCk7CisKKyAgICAgICAgbW9ycGgubGlua2VkUmVzdWx0
ID0gc3RyZWFtOworICAgICAgfQorICAgICAgZW52Lmhvb2tzLnJhbmdlKG1vcnBoLCBlbnYsIHNj
b3BlLCBudWxsLCBzdHJlYW0sIHZpc2l0b3IpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZ2V0S2V5d29yZDsKK30pOworZW5pZmVkKCdlbWJl
ci1odG1sYmFycy9rZXl3b3Jkcy9pbnB1dCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1
ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFs
RGVidWcsIF9lbWJlck1ldGFsQXNzaWduKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBz
dWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBUaGUgYHt7aW5wdXR9fWAgaGVscGVyIGxldHMgeW91IGNyZWF0ZSBhbiBIVE1MIGA8aW5w
dXQgLz5gIGNvbXBvbmVudC4KKyAgICBJdCBjYXVzZXMgYW4gYEVtYmVyLlRleHRGaWVsZGAgY29t
cG9uZW50IHRvIGJlIHJlbmRlcmVkLiAgRm9yIG1vcmUgaW5mbywKKyAgICBzZWUgdGhlIFtFbWJl
ci5UZXh0RmllbGRdKC9hcGkvY2xhc3Nlcy9FbWJlci5UZXh0RmllbGQuaHRtbCkgZG9jcyBhbmQK
KyAgICB0aGUgW3RlbXBsYXRlcyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy90ZW1w
bGF0ZXMvaW5wdXQtaGVscGVycy8pLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tpbnB1
dCB2YWx1ZT0iOTg3In19CisgICAgYGBgCisgIAorICAgIHJlbmRlcnMgYXM6CisgIAorICAgIGBg
YEhUTUwKKyAgICA8aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Ijk4NyIgLz4KKyAgICBgYGAKKyAg
CisgICAgIyMjIFRleHQgZmllbGQKKyAgCisgICAgSWYgbm8gYHR5cGVgIG9wdGlvbiBpcyBzcGVj
aWZpZWQsIGEgZGVmYXVsdCBvZiB0eXBlICd0ZXh0JyBpcyB1c2VkLgorICAKKyAgICBNYW55IG9m
IHRoZSBzdGFuZGFyZCBIVE1MIGF0dHJpYnV0ZXMgbWF5IGJlIHBhc3NlZCB0byB0aGlzIGhlbHBl
ci4KKyAgCisgICAgPHRhYmxlPgorICAgICAgPHRyPjx0ZD5gcmVhZG9ubHlgPC90ZD48dGQ+YHJl
cXVpcmVkYDwvdGQ+PHRkPmBhdXRvZm9jdXNgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD5gdmFs
dWVgPC90ZD48dGQ+YHBsYWNlaG9sZGVyYDwvdGQ+PHRkPmBkaXNhYmxlZGA8L3RkPjwvdHI+Cisg
ICAgICA8dHI+PHRkPmBzaXplYDwvdGQ+PHRkPmB0YWJpbmRleGA8L3RkPjx0ZD5gbWF4bGVuZ3Ro
YDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YG5hbWVgPC90ZD48dGQ+YG1pbmA8L3RkPjx0ZD5g
bWF4YDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YHBhdHRlcm5gPC90ZD48dGQ+YGFjY2VwdGA8
L3RkPjx0ZD5gYXV0b2NvbXBsZXRlYDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YGF1dG9zYXZl
YDwvdGQ+PHRkPmBmb3JtYWN0aW9uYDwvdGQ+PHRkPmBmb3JtZW5jdHlwZWA8L3RkPjwvdHI+Cisg
ICAgICA8dHI+PHRkPmBmb3JtbWV0aG9kYDwvdGQ+PHRkPmBmb3Jtbm92YWxpZGF0ZWA8L3RkPjx0
ZD5gZm9ybXRhcmdldGA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPmBoZWlnaHRgPC90ZD48dGQ+
YGlucHV0bW9kZWA8L3RkPjx0ZD5gbXVsdGlwbGVgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD5g
c3RlcGA8L3RkPjx0ZD5gd2lkdGhgPC90ZD48dGQ+YGZvcm1gPC90ZD48L3RyPgorICAgICAgPHRy
Pjx0ZD5gc2VsZWN0aW9uRGlyZWN0aW9uYDwvdGQ+PHRkPmBzcGVsbGNoZWNrYDwvdGQ+PHRkPiZu
YnNwOzwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAKKyAgCisgICAgV2hlbiBzZXQgdG8gYSBx
dW90ZWQgc3RyaW5nLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBkaXJlY3RseSBhcHBsaWVkIHRvIHRo
ZSBIVE1MCisgICAgZWxlbWVudC4gV2hlbiBsZWZ0IHVucXVvdGVkLCB0aGVzZSB2YWx1ZXMgd2ls
bCBiZSBib3VuZCB0byBhIHByb3BlcnR5IG9uIHRoZQorICAgIHRlbXBsYXRlJ3MgY3VycmVudCBy
ZW5kZXJpbmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4K
KyAgCisgIAorICAgIEEgdmVyeSBjb21tb24gdXNlIG9mIHRoaXMgaGVscGVyIGlzIHRvIGJpbmQg
dGhlIGB2YWx1ZWAgb2YgYW4gaW5wdXQgdG8gYW4gT2JqZWN0J3MgYXR0cmlidXRlOgorICAKKyAg
ICBgYGBoYW5kbGViYXJzCisgICAgU2VhcmNoOgorICAgIHt7aW5wdXQgdmFsdWU9c2VhcmNoV29y
ZH19CisgICAgYGBgCisgIAorICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGluaXRhbCB2YWx1ZSBp
biB0aGUgYDxpbnB1dCAvPmAgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIGBzZWFyY2hXb3Jk
YC4KKyAgICBJZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB0ZXh0LCB0aGUgdmFsdWUgb2YgYHNlYXJj
aFdvcmRgIHdpbGwgYWxzbyBiZSB1cGRhdGVkLgorICAKKyAgICAjIyMgQWN0aW9ucworICAgIFRo
ZSBoZWxwZXIgY2FuIHNlbmQgbXVsdGlwbGUgYWN0aW9ucyBiYXNlZCBvbiB1c2VyIGV2ZW50cy4K
KyAgICBUaGUgYWN0aW9uIHByb3BlcnR5IGRlZmluZXMgdGhlIGFjdGlvbiB3aGljaCBpcyBzZW50
IHdoZW4KKyAgICB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3tpbnB1dCBhY3Rpb249InN1Ym1pdCJ9fQorICAgIGBgYAorICAKKyAg
ICBUaGUgaGVscGVyIGFsbG93cyBzb21lIHVzZXIgZXZlbnRzIHRvIHNlbmQgYWN0aW9ucy4KKyAg
CisgICAgKiBgZW50ZXJgCisgICAgKiBgaW5zZXJ0LW5ld2xpbmVgCisgICAgKiBgZXNjYXBlLXBy
ZXNzYAorICAgICogYGZvY3VzLWluYAorICAgICogYGZvY3VzLW91dGAKKyAgICAqIGBrZXktcHJl
c3NgCisgICAgKiBga2V5LXVwYAorICAKKyAgCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZXNp
cmUgYW4gYWN0aW9uIHRvIGJlIHNlbnQgd2hlbiB0aGUgaW5wdXQgaXMgYmx1cnJlZCwKKyAgICB5
b3Ugb25seSBuZWVkIHRvIHNldHVwIHRoZSBhY3Rpb24gbmFtZSB0byB0aGUgZXZlbnQgbmFtZSBw
cm9wZXJ0eS4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7aW5wdXQgZm9jdXMtb3V0PSJh
bGVydE1lc3NhZ2UifX0KKyAgICBgYGAKKyAgCisgICAgU2VlIG1vcmUgYWJvdXQgW1RleHQgU3Vw
cG9ydCBBY3Rpb25zXSgvYXBpL2NsYXNzZXMvRW1iZXIuVGV4dEZpZWxkLmh0bWwpCisgIAorICAK
KyAgICAjIyMgRXh0ZW5kaW5nIGBFbWJlci5UZXh0RmllbGRgCisgIAorICAgIEludGVybmFsbHks
IGB7e2lucHV0IHR5cGU9InRleHQifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRl
eHRGaWVsZGAsIHBhc3NpbmcKKyAgICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJl
ci5UZXh0RmllbGRgJ3MgYGNyZWF0ZWAgbWV0aG9kLiBZb3UgY2FuIGV4dGVuZCB0aGUKKyAgICBj
YXBhYmlsaXRpZXMgb2YgdGV4dCBpbnB1dHMgaW4geW91ciBhcHBsaWNhdGlvbnMgYnkgcmVvcGVu
aW5nIHRoaXMgY2xhc3MuIEZvciBleGFtcGxlLAorICAgIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBC
b290c3RyYXAgcHJvamVjdCB3aGVyZSBgZGF0YS0qYCBhdHRyaWJ1dGVzIGFyZSB1c2VkLCB5b3UK
KyAgICBjYW4gYWRkIG9uZSB0byB0aGUgYFRleHRGaWVsZGAncyBgYXR0cmlidXRlQmluZGluZ3Ng
IHByb3BlcnR5OgorICAKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlRleHRGaWVs
ZC5yZW9wZW4oeworICAgICAgYXR0cmlidXRlQmluZGluZ3M6IFsnZGF0YS1lcnJvciddCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIEtlZXAgaW4gbWluZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRl
eHRGaWVsZGAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0RmllbGRgCisgICAgaXRzZWxmIGV4
dGVuZHMgYEVtYmVyLkNvbXBvbmVudGAuIEV4cGVjdCBpc29sYXRlZCBjb21wb25lbnQgc2VtYW50
aWNzLCBub3QKKyAgICBsZWdhY3kgMS54IHZpZXcgc2VtYW50aWNzIChsaWtlIGBjb250cm9sbGVy
YCBiZWluZyBwcmVzZW50KS4KKyAgCisgICAgU2VlIG1vcmUgYWJvdXQgW0VtYmVyIGNvbXBvbmVu
dHNdKC9hcGkvY2xhc3Nlcy9FbWJlci5Db21wb25lbnQuaHRtbCkKKyAgCisgIAorICAgICMjIyBD
aGVja2JveAorICAKKyAgICBDaGVja2JveGVzIGFyZSBzcGVjaWFsIGZvcm1zIG9mIHRoZSBge3tp
bnB1dH19YCBoZWxwZXIuICBUbyBjcmVhdGUgYSBgPGNoZWNrYm94IC8+YDoKKyAgCisgICAgYGBg
aGFuZGxlYmFycworICAgIEVtYmVyaXplIEV2ZXJ5dGhpbmc6CisgICAge3tpbnB1dCB0eXBlPSJj
aGVja2JveCIgbmFtZT0iaXNFbWJlcml6ZWQiIGNoZWNrZWQ9aXNFbWJlcml6ZWR9fQorICAgIGBg
YAorICAKKyAgICBUaGlzIHdpbGwgYmluZCBjaGVja2VkIHN0YXRlIG9mIHRoaXMgY2hlY2tib3gg
dG8gdGhlIHZhbHVlIG9mIGBpc0VtYmVyaXplZGAgIC0tIGlmIGVpdGhlciBvbmUgY2hhbmdlcywK
KyAgICBpdCB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgb3RoZXIuCisgIAorICAKKyAgICBUaGUg
Zm9sbG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0aGUgaGVscGVyOgorICAK
KyAgICAqIGBjaGVja2VkYAorICAgICogYGRpc2FibGVkYAorICAgICogYHRhYmluZGV4YAorICAg
ICogYGluZGV0ZXJtaW5hdGVgCisgICAgKiBgbmFtZWAKKyAgICAqIGBhdXRvZm9jdXNgCisgICAg
KiBgZm9ybWAKKyAgCisgIAorICAgICMjIyBFeHRlbmRpbmcgYEVtYmVyLkNoZWNrYm94YAorICAK
KyAgICBJbnRlcm5hbGx5LCBge3tpbnB1dCB0eXBlPSJjaGVja2JveCJ9fWAgY3JlYXRlcyBhbiBp
bnN0YW5jZSBvZiBgRW1iZXIuQ2hlY2tib3hgLCBwYXNzaW5nCisgICAgYXJndW1lbnRzIGZyb20g
dGhlIGhlbHBlciB0byBgRW1iZXIuQ2hlY2tib3hgJ3MgYGNyZWF0ZWAgbWV0aG9kLiBZb3UgY2Fu
IGV4dGVuZCB0aGUKKyAgICBjYXBhYmxpbHRpZXMgb2YgY2hlY2tib3ggaW5wdXRzIGluIHlvdXIg
YXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0aGlzIGNsYXNzLiBGb3IgZXhhbXBsZSwKKyAgICBp
ZiB5b3Ugd2FudGVkIHRvIGFkZCBhIGNzcyBjbGFzcyB0byBhbGwgY2hlY2tib3hlcyBpbiB5b3Vy
IGFwcGxpY2F0aW9uOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuQ2hlY2tib3gu
cmVvcGVuKHsKKyAgICAgIGNsYXNzTmFtZXM6IFsnbXktYXBwLWNoZWNrYm94J10KKyAgICB9KTsK
KyAgICBgYGAKKyAgCisgIAorICAgIEBtZXRob2QgaW5wdXQKKyAgICBAZm9yIEVtYmVyLlRlbXBs
YXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgc2V0dXBTdGF0ZTogZnVuY3Rpb24gKGxhc3RT
dGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgdHlwZSA9IGVudi5o
b29rcy5nZXRWYWx1ZShoYXNoLnR5cGUpOworICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21w
b25lbnROYW1lTWFwW3R5cGVdIHx8IGRlZmF1bHRDb21wb25lbnROYW1lOworCisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgne3tpbnB1dCB0eXBlPVwnY2hlY2tib3hcJ319IGRvZXMgbm90
IHN1cHBvcnQgc2V0dGluZyBgdmFsdWU9c29tZUJvb2xlYW5WYWx1ZWA7ICcgKyAneW91IG11c3Qg
dXNlIGBjaGVja2VkPXNvbWVCb29sZWFuVmFsdWVgIGluc3RlYWQuJywgISh0eXBlID09PSAnY2hl
Y2tib3gnICYmIGhhc2guaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpKTsKKworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoe30sIGxhc3RTdGF0ZSwgeyBjb21wb25lbnROYW1l
OiBjb21wb25lbnROYW1lIH0pOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikg
eworICAgICAgZW52Lmhvb2tzLmNvbXBvbmVudChtb3JwaCwgZW52LCBzY29wZSwgbW9ycGguZ2V0
U3RhdGUoKS5jb21wb25lbnROYW1lLCBwYXJhbXMsIGhhc2gsIHsgZGVmYXVsdDogdGVtcGxhdGUs
IGludmVyc2U6IGludmVyc2UgfSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIHJlcmVuZGVyOiBm
dW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgIH0KKyAgfTsKKworICB2YXIgZGVmYXVsdENvbXBvbmVudE5hbWUgPSAnLXRleHQtZmllbGQn
OworCisgIHZhciBjb21wb25lbnROYW1lTWFwID0geworICAgICdjaGVja2JveCc6ICctY2hlY2ti
b3gnCisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvbXV0JywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJl
ci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVh
bScsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLXZpZXdzL2NvbXBhdC9hdHRy
cy1wcm94eScsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtYWN0aW9u
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFN5bWJv
bCwgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0sIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVh
bSwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eSwg
X2VtYmVyUm91dGluZ0h0bWxiYXJzS2V5d29yZHNDbG9zdXJlQWN0aW9uKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBfUHJveHlTdHJlYW0kZXh0ZW5kOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IG11dDsKKyAgZXhwb3J0cy5wcml2YXRlTXV0ID0gcHJpdmF0ZU11dDsKKyAgdmFyIE1V
VEFCTEVfUkVGRVJFTkNFID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnTVVUQUJMRV9SRUZF
UkVOQ0UnKTsKKworICBleHBvcnRzLk1VVEFCTEVfUkVGRVJFTkNFID0gTVVUQUJMRV9SRUZFUkVO
Q0U7CisgIHZhciBNdXRTdHJlYW0gPSBfZW1iZXJNZXRhbFN0cmVhbXNQcm94eVN0cmVhbS5kZWZh
dWx0LmV4dGVuZCgoX1Byb3h5U3RyZWFtJGV4dGVuZCA9IHsKKyAgICBpbml0OiBmdW5jdGlvbiAo
c3RyZWFtKSB7CisgICAgICB0aGlzLmxhYmVsID0gJyhtdXQgJyArIHN0cmVhbS5sYWJlbCArICcp
JzsKKyAgICAgIHRoaXMucGF0aCA9IHN0cmVhbS5wYXRoOworICAgICAgdGhpcy5zb3VyY2VEZXAg
PSB0aGlzLmFkZE11dGFibGVEZXBlbmRlbmN5KHN0cmVhbSk7CisgICAgICB0aGlzW01VVEFCTEVf
UkVGRVJFTkNFXSA9IHRydWU7CisgICAgfSwKKworICAgIGNlbGw6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHZhciBzb3VyY2UgPSB0aGlzOworICAgICAgdmFyIHZhbHVlID0gc291cmNlLnZhbHVlKCk7
CisKKyAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVtfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jk
c0Nsb3N1cmVBY3Rpb24uQUNUSU9OXSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9
CisKKyAgICAgIHZhciB2YWwgPSB7CisgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgdXBk
YXRlOiBmdW5jdGlvbiAodmFsKSB7CisgICAgICAgICAgc291cmNlLnNldFZhbHVlKHZhbCk7Cisg
ICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHZhbFtfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJv
eHkuTVVUQUJMRV9DRUxMXSA9IHRydWU7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgfSwg
X1Byb3h5U3RyZWFtJGV4dGVuZFtfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVB
Y3Rpb24uSU5WT0tFXSA9IGZ1bmN0aW9uICh2YWwpIHsKKyAgICB0aGlzLnNldFZhbHVlKHZhbCk7
CisgIH0sIF9Qcm94eVN0cmVhbSRleHRlbmQpKTsKKworICAvKioKKyAgICBUaGUgYG11dGAgaGVs
cGVyIGxldHMgeW91IF9fY2xlYXJseSBzcGVjaWZ5X18gdGhhdCBhIGNoaWxkIGBDb21wb25lbnRg
IGNhbiB1cGRhdGUgdGhlCisgICAgKG11dGFibGUpIHZhbHVlIHBhc3NlZCB0byBpdCwgd2hpY2gg
d2lsbCBfX2NoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBjb21wb25lbnRfXy4KKyAgCisg
ICAgVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yIHBhc3NpbmcgbXV0YWJsZSB2YWx1ZXMgdG8gYSBg
Q29tcG9uZW50YCBvZiBhbnkgc2l6ZSwgYnV0CisgICAgY3JpdGljYWwgdG8gdW5kZXJzdGFuZGlu
ZyB0aGUgbG9naWMgb2YgYSBsYXJnZS9jb21wbGV4IGBDb21wb25lbnRgLgorICAKKyAgICBUbyBz
cGVjaWZ5IHRoYXQgYSBwYXJhbWV0ZXIgaXMgbXV0YWJsZSwgd2hlbiBpbnZva2luZyB0aGUgY2hp
bGQgYENvbXBvbmVudGA6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e215LWNoaWxkIGNo
aWxkQ2xpY2tDb3VudD0obXV0IHRvdGFsQ2xpY2tzKX19CisgICAgYGBgCisgIAorICAgIFRoZSBj
aGlsZCBgQ29tcG9uZW50YCBjYW4gdGhlbiBtb2RpZnkgdGhlIHBhcmVudCdzIHZhbHVlIGFzIG5l
ZWRlZDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIG15LWNoaWxkLmpzCisgICAgZXhw
b3J0IGRlZmF1bHQgQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBjbGljaygpIHsKKyAgICAgICAg
dGhpcy5nZXQoJ2NoaWxkQ2xpY2tDb3VudCcpLnVwZGF0ZSh0aGlzLmdldCgnY2hpbGRDbGlja0Nv
dW50JykudmFsdWUgKyAxKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQWRk
aXRpb25hbGx5LCB0aGUgYG11dGAgaGVscGVyIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBgYWN0
aW9uYCBoZWxwZXIgdG8KKyAgICBtdXRhdGUgYSB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgIAorICAg
IGBgYGhhbmRsZWJhcnMKKyAgICB7e215LWNoaWxkIGNoaWxkQ2xpY2tDb3VudD10b3RhbENsaWNr
cyBjbGljay1jb3VudC1jaGFuZ2U9KGFjdGlvbiAobXV0IHRvdGFsQ2xpY2tzKSl9fQorICAgIGBg
YAorICAKKyAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgd291bGQgaW52b2tlIHRoZSBhY3Rpb24g
d2l0aCB0aGUgbmV3IGNsaWNrIHZhbHVlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8g
bXktY2hpbGQuanMKKyAgICBleHBvcnQgZGVmYXVsdCBDb21wb25lbnQuZXh0ZW5kKHsKKyAgICAg
IGNsaWNrKCkgeworICAgICAgICB0aGlzLmdldCgnY2xpY2tDb3VudENoYW5nZScpKHRoaXMuZ2V0
KCdjaGlsZENsaWNrQ291bnQnKSArIDEpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBUaGUgYG11dGAgaGVscGVyIGNoYW5nZXMgdGhlIGB0b3RhbENsaWNrc2AgdmFsdWUgdG8g
d2hhdCB3YXMgcHJvdmlkZWQgYXMgdGhlIGFjdGlvbiBhcmd1bWVudC4KKyAgCisgICAgU2VlIGEg
WzIuMCBibG9nIHBvc3RdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ibG9nLzIwMTUvMDUvMTAvcnVuLXVw
LXRvLXR3by1vaC5odG1sI3RvY190aGUtY29kZS1tdXQtY29kZS1oZWxwZXIpIGZvcgorICAgIGFk
ZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdXNpbmcgYHt7bXV0fX1gLgorICAKKyAgICBAcHVibGlj
CisgICAgQG1ldGhvZCBtdXQKKyAgICBAcGFyYW0ge09iamVjdH0gW2F0dHJdIHRoZSAidHdvLXdh
eSIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIG1vZGlmaWVkLgorICAgIEBmb3IgRW1iZXIuVGVtcGxh
dGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbXV0KG1vcnBoLCBl
bnYsIHNjb3BlLCBvcmlnaW5hbFBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UpIHsKKyAg
ICAvLyBJZiBgbW9ycGhgIGlzIGBudWxsYCB0aGUga2V5d29yZCBpcyBiZWluZyBpbnZva2VkIGFz
IGEgc3ViZXhwcmVzc2lvbi4KKyAgICBpZiAobW9ycGggPT09IG51bGwpIHsKKyAgICAgIHZhciB2
YWx1ZVN0cmVhbSA9IG9yaWdpbmFsUGFyYW1zWzBdOworICAgICAgcmV0dXJuIG11dFBhcmFtKGVu
di5ob29rcy5nZXRWYWx1ZSwgdmFsdWVTdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiB0cnVl
OworICB9CisKKyAgZnVuY3Rpb24gcHJpdmF0ZU11dChtb3JwaCwgZW52LCBzY29wZSwgb3JpZ2lu
YWxQYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlKSB7CisgICAgLy8gSWYgYG1vcnBoYCBp
cyBgbnVsbGAgdGhlIGtleXdvcmQgaXMgYmVpbmcgaW52b2tlZCBhcyBhIHN1YmV4cHJlc3Npb24u
CisgICAgaWYgKG1vcnBoID09PSBudWxsKSB7CisgICAgICB2YXIgdmFsdWVTdHJlYW0gPSBvcmln
aW5hbFBhcmFtc1swXTsKKyAgICAgIHJldHVybiBtdXRQYXJhbShlbnYuaG9va3MuZ2V0VmFsdWUs
IHZhbHVlU3RyZWFtLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisg
IHZhciBMaXRlcmFsU3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0
ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAobGl0ZXJhbCkgeworICAgICAgdGhpcy5saXRlcmFs
ID0gbGl0ZXJhbDsKKyAgICAgIHRoaXMubGFiZWwgPSAnKGxpdGVyYWwgJyArIGxpdGVyYWwgKyAn
KSc7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0
aGlzLmxpdGVyYWw7CisgICAgfSwKKworICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsKSB7Cisg
ICAgICB0aGlzLmxpdGVyYWwgPSB2YWw7CisgICAgICB0aGlzLm5vdGlmeSgpOworICAgIH0KKyAg
fSk7CisKKyAgZnVuY3Rpb24gbXV0UGFyYW0ocmVhZCwgc3RyZWFtLCBpbnRlcm5hbCkgeworICAg
IGlmIChpbnRlcm5hbCkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0
cmVhbShzdHJlYW0pKSB7CisgICAgICAgIHZhciBsaXRlcmFsID0gc3RyZWFtOworICAgICAgICBz
dHJlYW0gPSBuZXcgTGl0ZXJhbFN0cmVhbShsaXRlcmFsKTsKKyAgICAgIH0KKyAgICB9IGVsc2Ug
eworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW4gb25seSBwYXNzIGEgcGF0
aCB0byBtdXQnLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShzdHJlYW0pKTsKKyAg
ICB9CisKKyAgICBpZiAoc3RyZWFtW01VVEFCTEVfUkVGRVJFTkNFXSkgeworICAgICAgcmV0dXJu
IHN0cmVhbTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE11dFN0cmVhbShzdHJlYW0pOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvb3V0bGV0JywgWydleHBvcnRz
JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJl
ci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL3ZpZXctbm9kZS1tYW5hZ2VyJywgJ2VtYmVyLWh0bWxi
YXJzL3RlbXBsYXRlcy90b3AtbGV2ZWwtdmlldycsICdlbWJlci1tZXRhbC9mZWF0dXJlcyddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQsIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzVmlld05vZGVNYW5hZ2VyLCBfZW1iZXJIdG1s
YmFyc1RlbXBsYXRlc1RvcExldmVsVmlldywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldy5k
ZWZhdWx0Lm1ldGEucmV2aXNpb24gPSAnRW1iZXJAMi42LjInOworCisgIC8qKgorICAgIFRoZSBg
e3tvdXRsZXR9fWAgaGVscGVyIGxldHMgeW91IHNwZWNpZnkgd2hlcmUgYSBjaGlsZCByb3V0ZSB3
aWxsIHJlbmRlciBpbgorICAgIHlvdXIgdGVtcGxhdGUuIEFuIGltcG9ydGFudCB1c2Ugb2YgdGhl
IGB7e291dGxldH19YCBoZWxwZXIgaXMgaW4geW91cgorICAgIGFwcGxpY2F0aW9uJ3MgYGFwcGxp
Y2F0aW9uLmhic2AgZmlsZToKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBhcHAvdGVt
cGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAKKyAgICA8IS0tIGhlYWRlciBjb250ZW50IGdv
ZXMgaGVyZSwgYW5kIHdpbGwgYWx3YXlzIGRpc3BsYXkgLS0+CisgICAge3tteS1oZWFkZXJ9fQor
ICAKKyAgICA8ZGl2IGNsYXNzPSJteS1keW5hbWljLWNvbnRlbnQiPgorICAgICAgPCEtLSB0aGlz
IGNvbnRlbnQgd2lsbCBjaGFuZ2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgcm91dGUsIHdoaWNoIGRl
cGVuZHMgb24gdGhlIGN1cnJlbnQgVVJMIC0tPgorICAgICAge3tvdXRsZXR9fQorICAgIDwvZGl2
PgorICAKKyAgICA8IS0tIGZvb3RlciBjb250ZW50IGdvZXMgaGVyZSwgYW5kIHdpbGwgYWx3YXlz
IGRpc3BsYXkgLS0+CisgICAge3tteS1mb290ZXJ9fQorICAgIGBgYAorICAKKyAgICBTZWUgW3Rl
bXBsYXRlcyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy90ZW1wbGF0ZXMvdGhlLWFw
cGxpY2F0aW9uLXRlbXBsYXRlLykgZm9yCisgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB1
c2luZyBge3tvdXRsZXR9fWAgaW4gYGFwcGxpY2F0aW9uLmhic2AuCisgIAorICAgIFlvdSBtYXkg
YWxzbyBzcGVjaWZ5IGEgbmFtZSBmb3IgdGhlIGB7e291dGxldH19YCwgd2hpY2ggaXMgdXNlZnVs
IHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZQorICAgIGB7e291dGxldH19YCBpbiBhIHRlbXBsYXRl
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tvdXRsZXQgIm1lbnUifX0KKyAgICB7e291
dGxldCAic2lkZWJhciJ9fQorICAgIHt7b3V0bGV0ICJtYWluIn19CisgICAgYGBgCisgIAorICAg
IFlvdXIgcm91dGVzIGNhbiB0aGVuIHJlbmRlciBpbnRvIGEgc3BlY2lmaWMgb25lIG9mIHRoZXNl
IGBvdXRsZXRgcyBieSBzcGVjaWZ5aW5nIHRoZSBgb3V0bGV0YAorICAgIGF0dHJpYnV0ZSBpbiB5
b3VyIGByZW5kZXJUZW1wbGF0ZWAgZnVuY3Rpb246CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAvLyBhcHAvcm91dGVzL21lbnUuanMKKyAgCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgIHJlbmRlclRlbXBsYXRlKCkgeworICAgICAgICB0aGlzLnJlbmRl
cih7IG91dGxldDogJ21lbnUnIH0pOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBTZWUgdGhlIFtyb3V0aW5nIGd1aWRlXShodHRwOi8vZW1iZXJqcy5jb20vZ3VpZGVzL3JvdXRp
bmcvcmVuZGVyaW5nLWEtdGVtcGxhdGUvKSBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIG9uIGhv
dyB5b3VyIGByb3V0ZWAgaW50ZXJhY3RzIHdpdGggdGhlIGB7e291dGxldH19YCBoZWxwZXIuCisg
IAorICAgIE5vdGU6IFlvdXIgY29udGVudCBfX3dpbGwgbm90IHJlbmRlcl9fIGlmIHRoZXJlIGlz
bid0IGFuIGB7e291dGxldH19YCBmb3IgaXQuCisgIAorICAgIEBwdWJsaWMKKyAgICBAbWV0aG9k
IG91dGxldAorICAgIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0KKyAgICBAZm9yIEVtYmVyLlRlbXBs
YXRlcy5oZWxwZXJzCisgICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQgPSB7Cisg
ICAgd2lsbFJlbmRlcjogZnVuY3Rpb24gKHJlbmRlck5vZGUsIGVudikgeworICAgICAgZW52LnZp
ZXcub3duZXJWaWV3Ll9vdXRsZXRzLnB1c2gocmVuZGVyTm9kZSk7CisgICAgfSwKKworICAgIHNl
dHVwU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7Cisg
ICAgICB2YXIgb3V0bGV0U3RhdGUgPSBlbnYub3V0bGV0U3RhdGU7CisgICAgICB2YXIgcmVhZCA9
IGVudi5ob29rcy5nZXRWYWx1ZTsKKyAgICAgIHZhciBvdXRsZXROYW1lID0gcmVhZChwYXJhbXNb
MF0pIHx8ICdtYWluJzsKKyAgICAgIHZhciBzZWxlY3RlZE91dGxldFN0YXRlID0gb3V0bGV0U3Rh
dGVbb3V0bGV0TmFtZV07CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIG91dGxldFN0YXRlOiBz
ZWxlY3RlZE91dGxldFN0YXRlLAorICAgICAgICBoYXNQYXJlbnRPdXRsZXQ6IGVudi5oYXNQYXJl
bnRPdXRsZXQsCisgICAgICAgIG1hbmFnZXI6IHN0YXRlLm1hbmFnZXIKKyAgICAgIH07CisgICAg
fSwKKworICAgIGNoaWxkRW52OiBmdW5jdGlvbiAoc3RhdGUsIGVudikgeworICAgICAgdmFyIG91
dGxldFN0YXRlID0gc3RhdGUub3V0bGV0U3RhdGU7CisgICAgICB2YXIgdG9SZW5kZXIgPSBvdXRs
ZXRTdGF0ZSAmJiBvdXRsZXRTdGF0ZS5yZW5kZXI7CisgICAgICB2YXIgbWV0YSA9IHRvUmVuZGVy
ICYmIHRvUmVuZGVyLnRlbXBsYXRlICYmIHRvUmVuZGVyLnRlbXBsYXRlLm1ldGE7CisKKyAgICAg
IHJldHVybiBlbnYuY2hpbGRXaXRoT3V0bGV0U3RhdGUob3V0bGV0U3RhdGUgJiYgb3V0bGV0U3Rh
dGUub3V0bGV0cywgdHJ1ZSwgbWV0YSk7CisgICAgfSwKKworICAgIGlzU3RhYmxlOiBmdW5jdGlv
biAobGFzdFN0YXRlLCBuZXh0U3RhdGUpIHsKKyAgICAgIHJldHVybiBpc1N0YWJsZShsYXN0U3Rh
dGUub3V0bGV0U3RhdGUsIG5leHRTdGF0ZS5vdXRsZXRTdGF0ZSk7CisgICAgfSwKKworICAgIGlz
RW1wdHk6IGZ1bmN0aW9uIChzdGF0ZSkgeworICAgICAgcmV0dXJuIGlzRW1wdHkoc3RhdGUub3V0
bGV0U3RhdGUpOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJOb2RlLCBl
bnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7Cisg
ICAgICB2YXIgc3RhdGUgPSByZW5kZXJOb2RlLmdldFN0YXRlKCk7CisgICAgICB2YXIgcGFyZW50
VmlldyA9IGVudi52aWV3OworICAgICAgdmFyIG91dGxldFN0YXRlID0gc3RhdGUub3V0bGV0U3Rh
dGU7CisgICAgICB2YXIgdG9SZW5kZXIgPSBvdXRsZXRTdGF0ZS5yZW5kZXI7CisgICAgICB2YXIg
bmFtZXNwYWNlID0gZW52Lm93bmVyLmxvb2t1cCgnYXBwbGljYXRpb246bWFpbicpOworICAgICAg
dmFyIExPR19WSUVXX0xPT0tVUFMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobmFtZXNw
YWNlLCAnTE9HX1ZJRVdfTE9PS1VQUycpOworCisgICAgICB2YXIgVmlld0NsYXNzID0gb3V0bGV0
U3RhdGUucmVuZGVyLlZpZXdDbGFzczsKKworICAgICAgaWYgKCFzdGF0ZS5oYXNQYXJlbnRPdXRs
ZXQgJiYgIVZpZXdDbGFzcykgeworICAgICAgICBWaWV3Q2xhc3MgPSBlbnYub3duZXIuX2xvb2t1
cEZhY3RvcnkoJ3ZpZXc6dG9wbGV2ZWwnKTsKKyAgICAgIH0KKworICAgICAgdmFyIENvbXBvbmVu
dDsKKworICAgICAgdmFyIG9wdGlvbnM7CisgICAgICB2YXIgYXR0cnMgPSB7fTsKKyAgICAgIGlm
IChDb21wb25lbnQpIHsKKyAgICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICBjb21wb25lbnQ6
IENvbXBvbmVudAorICAgICAgICB9OworICAgICAgICBhdHRycyA9IHRvUmVuZGVyLmF0dHJzOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICBjb21wb25lbnQ6
IFZpZXdDbGFzcywKKyAgICAgICAgICBzZWxmOiB0b1JlbmRlci5jb250cm9sbGVyLAorICAgICAg
ICAgIGNyZWF0ZU9wdGlvbnM6IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXI6IHRvUmVuZGVyLmNv
bnRyb2xsZXIKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGUgPSB0
ZW1wbGF0ZSB8fCB0b1JlbmRlci50ZW1wbGF0ZSAmJiB0b1JlbmRlci50ZW1wbGF0ZS5yYXc7CisK
KyAgICAgICAgaWYgKExPR19WSUVXX0xPT0tVUFMgJiYgVmlld0NsYXNzKSB7CisgICAgICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5pbmZvKCdSZW5kZXJpbmcgJyArIHRvUmVuZGVyLm5hbWUgKyAnIHdp
dGggJyArIFZpZXdDbGFzcywgeyBmdWxsTmFtZTogJ3ZpZXc6JyArIHRvUmVuZGVyLm5hbWUgfSk7
CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlLm1hbmFnZXIpIHsKKyAgICAg
ICAgc3RhdGUubWFuYWdlci5kZXN0cm95KCk7CisgICAgICAgIHN0YXRlLm1hbmFnZXIgPSBudWxs
OworICAgICAgfQorCisgICAgICB2YXIgbm9kZU1hbmFnZXIgPSBfZW1iZXJIdG1sYmFyc05vZGVN
YW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlci5kZWZhdWx0LmNyZWF0ZShyZW5kZXJOb2RlLCBlbnYsIGF0
dHJzLCBvcHRpb25zLCBwYXJlbnRWaWV3LCBudWxsLCBudWxsLCB0ZW1wbGF0ZSk7CisgICAgICBz
dGF0ZS5tYW5hZ2VyID0gbm9kZU1hbmFnZXI7CisKKyAgICAgIG5vZGVNYW5hZ2VyLnJlbmRlcihl
bnYsIGhhc2gsIHZpc2l0b3IpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBpc0VtcHR5KG91
dGxldFN0YXRlKSB7CisgICAgcmV0dXJuICFvdXRsZXRTdGF0ZSB8fCAhb3V0bGV0U3RhdGUucmVu
ZGVyLlZpZXdDbGFzcyAmJiAhb3V0bGV0U3RhdGUucmVuZGVyLnRlbXBsYXRlOworICB9CisKKyAg
ZnVuY3Rpb24gaXNTdGFibGUoYSwgYikgeworICAgIGlmICghYSAmJiAhYikgeworICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIGlmICghYSB8fCAhYikgeworICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBhID0gYS5yZW5kZXI7CisgICAgYiA9IGIucmVuZGVyOworICAgIGZvciAo
dmFyIGtleSBpbiBhKSB7CisgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAg
ICAgIC8vIE5hbWUgaXMgb25seSBoZXJlIGZvciBsb2dnaW5nICYgZGVidWdnaW5nLiBJZiB0d28g
ZGlmZmVyZW50CisgICAgICAgIC8vIG5hbWVzIHJlc3VsdCBpbiBvdGhlcndpc2UgaWRlbnRpY2Fs
IHN0YXRlcywgdGhleSdyZSBzdGlsbAorICAgICAgICAvLyBpZGVudGljYWwuCisgICAgICAgIGlm
IChhW2tleV0gIT09IGJba2V5XSAmJiBrZXkgIT09ICduYW1lJykgeworICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3BhcnRpYWwnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItdmlld3Mvc3lzdGVtL2xvb2t1cF9wYXJ0aWFsJywgJ2h0bWxiYXJzLXJ1bnRp
bWUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzU3lzdGVtTG9va3VwX3BhcnRpYWws
IF9odG1sYmFyc1J1bnRpbWUpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
VGhlIGBwYXJ0aWFsYCBoZWxwZXIgcmVuZGVycyBhbm90aGVyIHRlbXBsYXRlIHdpdGhvdXQKKyAg
ICBjaGFuZ2luZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7Zm9vfX0KKyAgICB7e3BhcnRpYWwgIm5hdiJ9fQorICAgIGBgYAorICAKKyAgICBUaGUg
YWJvdmUgZXhhbXBsZSB0ZW1wbGF0ZSB3aWxsIHJlbmRlciBhIHRlbXBsYXRlIG5hbWVkCisgICAg
Il9uYXYiLCB3aGljaCBoYXMgdGhlIHNhbWUgY29udGV4dCBhcyB0aGUgcGFyZW50IHRlbXBsYXRl
CisgICAgaXQncyByZW5kZXJlZCBpbnRvLCBzbyBpZiB0aGUgIl9uYXYiIHRlbXBsYXRlIGFsc28g
cmVmZXJlbmNlZAorICAgIGB7e2Zvb319YCwgaXQgd291bGQgcHJpbnQgdGhlIHNhbWUgdGhpbmcg
YXMgdGhlIGB7e2Zvb319YAorICAgIGluIHRoZSBhYm92ZSBleGFtcGxlLgorICAKKyAgICBJZiBh
ICJfbmF2IiB0ZW1wbGF0ZSBpc24ndCBmb3VuZCwgdGhlIGBwYXJ0aWFsYCBoZWxwZXIgd2lsbAor
ICAgIGZhbGwgYmFjayB0byBhIHRlbXBsYXRlIG5hbWVkICJuYXYiLgorICAKKyAgICAjIyMgQm91
bmQgdGVtcGxhdGUgbmFtZXMKKyAgCisgICAgVGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBgcGFy
dGlhbGAgY2FuIGFsc28gYmUgYSBwYXRoCisgICAgdG8gYSBwcm9wZXJ0eSBjb250YWluaW5nIGEg
dGVtcGxhdGUgbmFtZSwgZS5nLjoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7cGFydGlh
bCBzb21lVGVtcGxhdGVOYW1lfX0KKyAgICBgYGAKKyAgCisgICAgVGhlIGFib3ZlIGV4YW1wbGUg
d2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBgc29tZVRlbXBsYXRlTmFtZWAKKyAgICBvbiB0aGUg
dGVtcGxhdGUgY29udGV4dCAoZS5nLiBhIGNvbnRyb2xsZXIpIGFuZCB1c2UgdGhhdAorICAgIHZh
bHVlIGFzIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIuIElmIHRoZSByZXNvbHZl
ZAorICAgIHZhbHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwgYmUgcmVuZGVyZWQuIElmIGBzb21l
VGVtcGxhdGVOYW1lYAorICAgIGNoYW5nZXMsIHRoZSBwYXJ0aWFsIHdpbGwgYmUgcmUtcmVuZGVy
ZWQgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZQorICAgIG5hbWUuCisgIAorICAKKyAgICBAbWV0aG9k
IHBhcnRpYWwKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtT
dHJpbmd9IHBhcnRpYWxOYW1lIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgbWlu
dXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICBAcHVibGljCisgICovCisKKyAgZXhwb3J0
cy5kZWZhdWx0ID0geworICAgIHNldHVwU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSwgZW52LCBzY29w
ZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICByZXR1cm4geyBwYXJ0aWFsTmFtZTogZW52Lmhvb2tz
LmdldFZhbHVlKHBhcmFtc1swXSkgfTsKKyAgICB9LAorCisgICAgcmVuZGVyOiBmdW5jdGlvbiAo
cmVuZGVyTm9kZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwg
dmlzaXRvcikgeworICAgICAgdmFyIHN0YXRlID0gcmVuZGVyTm9kZS5nZXRTdGF0ZSgpOworICAg
ICAgaWYgKCFzdGF0ZS5wYXJ0aWFsTmFtZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
IH0KKyAgICAgIHZhciBmb3VuZCA9IF9lbWJlclZpZXdzU3lzdGVtTG9va3VwX3BhcnRpYWwuZGVm
YXVsdChlbnYsIHN0YXRlLnBhcnRpYWxOYW1lKTsKKyAgICAgIGlmICghZm91bmQpIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIF9odG1sYmFyc1J1bnRpbWUuaW50ZXJu
YWwuaG9zdEJsb2NrKHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIGZvdW5kLnJhdywgbnVsbCwgbnVs
bCwgdmlzaXRvciwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgICAgb3B0aW9ucy50ZW1wbGF0
ZXMudGVtcGxhdGUueWllbGQoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfTsKK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9yZWFkb25seScsIFsnZXhwb3J0cycsICdlbWJlci1o
dG1sYmFycy9rZXl3b3Jkcy9tdXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNNdXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJl
ci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gcmVhZG9ubHk7CisKKyAgZnVuY3Rpb24gcmVhZG9ubHkobW9ycGgsIGVudiwgc2NvcGUsIG9y
aWdpbmFsUGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSkgeworICAgIC8vIElmIGBtb3Jw
aGAgaXMgYG51bGxgIHRoZSBrZXl3b3JkIGlzIGJlaW5nIGludm9rZWQgYXMgYSBzdWJleHByZXNz
aW9uLgorICAgIGlmIChtb3JwaCA9PT0gbnVsbCkgeworICAgICAgdmFyIHN0cmVhbSA9IG9yaWdp
bmFsUGFyYW1zWzBdOworICAgICAgaWYgKHN0cmVhbSAmJiBzdHJlYW1bX2VtYmVySHRtbGJhcnNL
ZXl3b3Jkc011dC5NVVRBQkxFX1JFRkVSRU5DRV0pIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS5z
b3VyY2VEZXAuZGVwZW5kZWU7CisgICAgICB9CisgICAgICByZXR1cm4gc3RyZWFtOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5
d29yZHMvdGV4dGFyZWEnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKwor
ICAvKioKKyAgICBge3t0ZXh0YXJlYX19YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9mIGA8dGV4
dGFyZWE+YCB0YWcgaW50byB0aGUgdGVtcGxhdGUuCisgICAgVGhlIGF0dHJpYnV0ZXMgb2YgYHt7
dGV4dGFyZWF9fWAgbWF0Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRhZ3MgYXMKKyAgICBj
bG9zZWx5IGFzIHBvc3NpYmxlLgorICAKKyAgICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0cmlidXRl
cyBjYW4gYmUgc2V0OgorICAKKyAgICAgICogYHZhbHVlYAorICAgICAgKiBgbmFtZWAKKyAgICAg
ICogYHJvd3NgCisgICAgICAqIGBjb2xzYAorICAgICAgKiBgcGxhY2Vob2xkZXJgCisgICAgICAq
IGBkaXNhYmxlZGAKKyAgICAgICogYG1heGxlbmd0aGAKKyAgICAgICogYHRhYmluZGV4YAorICAg
ICAgKiBgc2VsZWN0aW9uRW5kYAorICAgICAgKiBgc2VsZWN0aW9uU3RhcnRgCisgICAgICAqIGBz
ZWxlY3Rpb25EaXJlY3Rpb25gCisgICAgICAqIGB3cmFwYAorICAgICAgKiBgcmVhZG9ubHlgCisg
ICAgICAqIGBhdXRvZm9jdXNgCisgICAgICAqIGBmb3JtYAorICAgICAgKiBgc3BlbGxjaGVja2AK
KyAgICAgICogYHJlcXVpcmVkYAorICAKKyAgICBXaGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcs
IHRoZXNlIHZhbHVlIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAorICAgIGVs
ZW1lbnQuIFdoZW4gbGVmdCB1bnF1b3RlZCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgYm91bmQgdG8g
YSBwcm9wZXJ0eSBvbiB0aGUKKyAgICB0ZW1wbGF0ZSdzIGN1cnJlbnQgcmVuZGVyaW5nIGNvbnRl
eHQgKG1vc3QgdHlwaWNhbGx5IGEgY29udHJvbGxlciBpbnN0YW5jZSkuCisgIAorICAgIFVuYm91
bmQ6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e3RleHRhcmVhIHZhbHVlPSJMb3RzIG9m
IHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1QgYm91bmQifX0KKyAgICBgYGAKKyAgCisgICAgV291bGQg
cmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKKyAgCisgICAgYGBgaHRtbAorICAgIDx0ZXh0
YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2Ygc3RhdGljIHRleHQg
dGhhdCBJU04nVCBib3VuZAorICAgIDwvdGV4dGFyZWE+CisgICAgYGBgCisgIAorICAgIEJvdW5k
OgorICAKKyAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBgd3JpdHRlbldvcmRzYCBw
cm9wZXJ0eSBvbiBgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlcmAKKyAgICB3aWxsIGJlIHVwZGF0
ZWQgbGl2ZSBhcyB0aGUgdXNlciB0eXBlcyAnTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQnIGlu
dG8KKyAgICB0aGUgdGV4dCBhcmVhIG9mIHRoZWlyIGJyb3dzZXIncyB3aW5kb3cuCisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29u
dHJvbGxlci5leHRlbmQoeworICAgICAgd3JpdHRlbldvcmRzOiAiTG90cyBvZiB0ZXh0IHRoYXQg
SVMgYm91bmQiCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jkc319CisgICAgYGBgCisgIAorICAgICBXb3VsZCBy
ZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgorICAKKyAgICBgYGBodG1sCisgICAgPHRleHRh
cmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgorICAgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMg
Ym91bmQKKyAgICA8L3RleHRhcmVhPgorICAgIGBgYAorICAKKyAgICBJZiB5b3Ugd2FudGVkIGEg
b25lIHdheSBiaW5kaW5nIGJldHdlZW4gdGhlIHRleHQgYXJlYSBhbmQgYSBkaXYgdGFnCisgICAg
c29tZXdoZXJlIGVsc2Ugb24geW91ciBzY3JlZW4sIHlvdSBjb3VsZCB1c2UgYEVtYmVyLmNvbXB1
dGVkLm9uZVdheWA6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25D
b250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgd3JpdHRlbldvcmRz
OiAiTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQiLAorICAgICAgb3V0cHV0V3JpdHRlbldvcmRz
OiBFbWJlci5jb21wdXRlZC5vbmVXYXkoIndyaXR0ZW5Xb3JkcyIpCisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jk
c319CisgIAorICAgIDxkaXY+CisgICAgICB7e291dHB1dFdyaXR0ZW5Xb3Jkc319CisgICAgPC9k
aXY+CisgICAgYGBgCisgIAorICAgIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6
CisgIAorICAgIGBgYGh0bWwKKyAgICA8dGV4dGFyZWEgY2xhc3M9ImVtYmVyLXRleHQtYXJlYSI+
CisgICAgICBMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZAorICAgIDwvdGV4dGFyZWE+CisgIAor
ICAgIDwtLSB0aGUgZm9sbG93aW5nIGRpdiB3aWxsIGJlIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGFz
IHlvdSB0eXBlIC0tPgorICAKKyAgICA8ZGl2PgorICAgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMg
Ym91bmQKKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgRmluYWxseSwgdGhpcyBleGFtcGxl
IHJlYWxseSBzaG93cyB0aGUgcG93ZXIgYW5kIGVhc2Ugb2YgRW1iZXIgd2hlbiB0d28KKyAgICBw
cm9wZXJ0aWVzIGFyZSBib3VuZCB0byBlYWNob3RoZXIgdmlhIGBFbWJlci5jb21wdXRlZC5hbGlh
c2AuIFR5cGUgaW50bworICAgIGVpdGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5J2xsIGJvdGgg
c3RheSBpbiBzeW5jLiBOb3RlIHRoYXQKKyAgICBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgIGNvc3Rz
IG1vcmUgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNvIG9ubHkgdXNlIGl0IHdoZW4KKyAgICB5
b3VyIHJlYWxseSBiaW5kaW5nIGluIGJvdGggZGlyZWN0aW9uczoKKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4
dGVuZCh7CisgICAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCIs
CisgICAgICB0d29XYXlXcml0dGVuV29yZHM6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCJ3cml0dGVu
V29yZHMiKQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3t0
ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQorICAgIHt7dGV4dGFyZWEgdmFsdWU9dHdvV2F5
V3JpdHRlbldvcmRzfX0KKyAgICBgYGAKKyAgCisgICAgYGBgaHRtbAorICAgIDx0ZXh0YXJlYSBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2YgdGV4dCB0
aGF0IElTIGJvdW5kCisgICAgPC90ZXh0YXJlYT4KKyAgCisgICAgPC0tIGJvdGggdXBkYXRlZCBp
biByZWFsIHRpbWUgLS0+CisgIAorICAgIDx0ZXh0YXJlYSBpZD0iZW1iZXIyIiBjbGFzcz0iZW1i
ZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCisgICAgPC90
ZXh0YXJlYT4KKyAgICBgYGAKKyAgCisgICAgIyMjIEFjdGlvbnMKKyAgCisgICAgVGhlIGhlbHBl
ciBjYW4gc2VuZCBtdWx0aXBsZSBhY3Rpb25zIGJhc2VkIG9uIHVzZXIgZXZlbnRzLgorICAKKyAg
ICBUaGUgYWN0aW9uIHByb3BlcnR5IGRlZmluZXMgdGhlIGFjdGlvbiB3aGljaCBpcyBzZW5kIHdo
ZW4KKyAgICB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LgorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3tpbnB1dCBhY3Rpb249InN1Ym1pdCJ9fQorICAgIGBgYAorICAKKyAgICBU
aGUgaGVscGVyIGFsbG93cyBzb21lIHVzZXIgZXZlbnRzIHRvIHNlbmQgYWN0aW9ucy4KKyAgCisg
ICogYGVudGVyYAorICAqIGBpbnNlcnQtbmV3bGluZWAKKyAgKiBgZXNjYXBlLXByZXNzYAorICAq
IGBmb2N1cy1pbmAKKyAgKiBgZm9jdXMtb3V0YAorICAqIGBrZXktcHJlc3NgCisgIAorICAgIEZv
ciBleGFtcGxlLCBpZiB5b3UgZGVzaXJlIGFuIGFjdGlvbiB0byBiZSBzZW50IHdoZW4gdGhlIGlu
cHV0IGlzIGJsdXJyZWQsCisgICAgeW91IG9ubHkgbmVlZCB0byBzZXR1cCB0aGUgYWN0aW9uIG5h
bWUgdG8gdGhlIGV2ZW50IG5hbWUgcHJvcGVydHkuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAg
ICB7e3RleHRhcmVhIGZvY3VzLWluPSJhbGVydE1lc3NhZ2UifX0KKyAgICBgYGAKKyAgCisgICAg
U2VlIG1vcmUgYWJvdXQgW1RleHQgU3VwcG9ydCBBY3Rpb25zXSgvYXBpL2NsYXNzZXMvRW1iZXIu
VGV4dEFyZWEuaHRtbCkKKyAgCisgICAgIyMjIEV4dGVuc2lvbgorICAKKyAgICBJbnRlcm5hbGx5
LCBge3t0ZXh0YXJlYX19YCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBFbWJlci5UZXh0QXJlYWAs
IHBhc3NpbmcKKyAgICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5UZXh0QXJl
YWAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KKyAgICBleHRlbmQgdGhlIGNhcGFiaWxpdGll
cyBvZiB0ZXh0IGFyZWFzIGluIHlvdXIgYXBwbGljYXRpb24gYnkgcmVvcGVuaW5nIHRoaXMKKyAg
ICBjbGFzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBCb290c3RyYXAgcHJv
amVjdCB3aGVyZSBgZGF0YS0qYAorICAgIGF0dHJpYnV0ZXMgYXJlIHVzZWQsIHlvdSBjYW4gZ2xv
YmFsbHkgYWRkIHN1cHBvcnQgZm9yIGEgYGRhdGEtKmAgYXR0cmlidXRlCisgICAgb24gYWxsIGB7
e3RleHRhcmVhfX1gcycgaW4geW91ciBhcHAgYnkgcmVvcGVuaW5nIGBFbWJlci5UZXh0QXJlYWAg
b3IKKyAgICBgRW1iZXIuVGV4dFN1cHBvcnRgIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1
dGVCaW5kaW5nc2AgY29uY2F0ZW5hdGVkCisgICAgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBFbWJlci5UZXh0QXJlYS5yZW9wZW4oeworICAgICAgYXR0cmlidXRlQmluZGlu
Z3M6IFsnZGF0YS1lcnJvciddCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEtlZXAgaW4gbWlu
ZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRleHRBcmVhYCBzdWJjbGFzc2VzIHRoYXQgYEVtYmVyLlRl
eHRBcmVhYAorICAgIGl0c2VsZiBleHRlbmRzIGBFbWJlci5Db21wb25lbnRgLiBFeHBlY3QgaXNv
bGF0ZWQgY29tcG9uZW50IHNlbWFudGljcywgbm90CisgICAgbGVnYWN5IDEueCB2aWV3IHNlbWFu
dGljcyAobGlrZSBgY29udHJvbGxlcmAgYmVpbmcgcHJlc2VudCkuCisgIAorICAgIFNlZSBtb3Jl
IGFib3V0IFtFbWJlciBjb21wb25lbnRzXSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0
bWwpCisgIAorICAgIEBtZXRob2QgdGV4dGFyZWEKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5o
ZWxwZXJzCisgICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgICAgQHB1YmxpYworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dGFyZWE7CisKKyAgZnVuY3Rp
b24gdGV4dGFyZWEobW9ycGgsIGVudiwgc2NvcGUsIG9yaWdpbmFsUGFyYW1zLCBoYXNoLCB0ZW1w
bGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGVudi5ob29rcy5jb21wb25lbnQobW9ycGgs
IGVudiwgc2NvcGUsICctdGV4dC1hcmVhJywgb3JpZ2luYWxQYXJhbXMsIGhhc2gsIHsgZGVmYXVs
dDogdGVtcGxhdGUsIGludmVyc2U6IGludmVyc2UgfSwgdmlzaXRvcik7CisgICAgcmV0dXJuIHRy
dWU7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy91bmJvdW5kJywg
WydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Ry
ZWFtJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSwgX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10
ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
dW5ib3VuZDsKKworICAvKioKKyAgICBUaGUgYHt7dW5ib3VuZH19YCBoZWxwZXIgZGlzY29ubmVj
dHMgdGhlIG9uZS13YXkgYmluZGluZyBvZiBhIHByb3BlcnR5LAorICAgIGVzc2VudGlhbGx5IGZy
ZWV6aW5nIGl0cyB2YWx1ZSBhdCB0aGUgbW9tZW50IG9mIHJlbmRlcmluZy4gRm9yIGV4YW1wbGUs
CisgICAgaW4gdGhpcyBleGFtcGxlIHRoZSBkaXNwbGF5IG9mIHRoZSB2YXJpYWJsZSBgbmFtZWAg
d2lsbCBub3QgY2hhbmdlIGV2ZW4KKyAgICBpZiBpdCBpcyBzZXQgd2l0aCBhIG5ldyB2YWx1ZToK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7dW5ib3VuZCBuYW1lfX0KKyAgICBgYGAKKyAg
CisgICAgTGlrZSBhbnkgaGVscGVyLCB0aGUgYHVuYm91bmRgIGhlbHBlciBjYW4gYWNjZXB0IGEg
bmVzdGVkIGhlbHBlciBleHByZXNzaW9uLgorICAgIFRoaXMgYWxsb3dzIGZvciBjdXN0b20gaGVs
cGVycyB0byBiZSByZW5kZXJlZCB1bmJvdW5kOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3t1bmJvdW5kIChzb21lLWN1c3RvbS1oZWxwZXIpfX0KKyAgICB7e3VuYm91bmQgKGNhcGl0YWxp
emUgbmFtZSl9fQorICAgIHt7ISBZb3UgY2FuIHVzZSBhbnkgaGVscGVyLCBpbmNsdWRpbmcgdW5i
b3VuZCwgaW4gYSBuZXN0ZWQgZXhwcmVzc2lvbiB9fQorICAgIHt7Y2FwaXRhbGl6ZSAodW5ib3Vu
ZCBuYW1lKX19CisgICAgYGBgCisgIAorICAgIFRoZSBgdW5ib3VuZGAgaGVscGVyIG9ubHkgYWNj
ZXB0cyBhIHNpbmdsZSBhcmd1bWVudCwgYW5kIGl0IHJldHVybiBhbgorICAgIHVuYm91bmQgdmFs
dWUuCisgIAorICAgIEBtZXRob2QgdW5ib3VuZAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhl
bHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgdmFyIFZvbGF0aWxlU3RyZWFtID0gX2VtYmVy
TWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAo
c291cmNlKSB7CisgICAgICB0aGlzLmxhYmVsID0gJyh2b2xhdGlsZSAnICsgc291cmNlLmxhYmVs
ICsgJyknOworICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICB0aGlzLmFkZERlcGVu
ZGVuY3koc291cmNlKTsKKyAgICB9LAorCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHRoaXMuc291cmNlKTsKKyAgICB9
LAorCisgICAgbm90aWZ5OiBmdW5jdGlvbiAoKSB7fQorICB9KTsKKworICBmdW5jdGlvbiB1bmJv
dW5kKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2
aXNpdG9yKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3VuYm91bmQgaGVscGVyIGNh
bm5vdCBiZSBjYWxsZWQgd2l0aCBtdWx0aXBsZSBwYXJhbXMgb3IgaGFzaCBwYXJhbXMnLCBwYXJh
bXMubGVuZ3RoID09PSAxICYmIE9iamVjdC5rZXlzKGhhc2gpLmxlbmd0aCA9PT0gMCk7CisgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3VuYm91bmQgaGVscGVyIGNhbm5vdCBiZSBjYWxsZWQg
YXMgYSBibG9jaycsICF0ZW1wbGF0ZSk7CisKKyAgICBpZiAobW9ycGggPT09IG51bGwpIHsKKyAg
ICAgIHJldHVybiBuZXcgVm9sYXRpbGVTdHJlYW0ocGFyYW1zWzBdKTsKKyAgICB9CisKKyAgICB2
YXIgc3RyZWFtID0gdW5kZWZpbmVkOworICAgIGlmIChtb3JwaC5saW5rZWRSZXN1bHQpIHsKKyAg
ICAgIHN0cmVhbSA9IG1vcnBoLmxpbmtlZFJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgc3Ry
ZWFtID0gbmV3IFZvbGF0aWxlU3RyZWFtKHBhcmFtc1swXSk7CisgICAgICBtb3JwaC5saW5rZWRS
ZXN1bHQgPSBzdHJlYW07CisgICAgfQorICAgIGVudi5ob29rcy5yYW5nZShtb3JwaCwgZW52LCBz
Y29wZSwgbnVsbCwgc3RyZWFtLCB2aXNpdG9yKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3ZpZXcnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItdmlld3Mvc3RyZWFtcy91dGlscycsICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVy
LWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2RlLW1hbmFnZXInXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlclZpZXdzU3RyZWFtc1V0aWxzLCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2Vt
YmVySHRtbGJhcnNOb2RlTWFuYWdlcnNWaWV3Tm9kZU1hbmFnZXIpIHsKKyAgLyoqCisgIEBtb2R1
bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgICAgYHt7dmlld319YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9m
IGFuIGBFbWJlci5WaWV3YCBpbnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMKKyAgICBvcHRpb25z
IHRvIHRoZSBgRW1iZXIuVmlld2AncyBgY3JlYXRlYCBtZXRob2QgYW5kIHVzaW5nIHRoZSBzdXBw
bGllZCBibG9jayBhcworICAgIHRoZSB2aWV3J3Mgb3duIHRlbXBsYXRlLgorICAKKyAgICBBbiBl
bXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKyAgCisgICAgYGBgaGFu
ZGxlYmFycworICAgIEEgc3BhbjoKKyAgICB7eyN2aWV3IHRhZ05hbWU9InNwYW4ifX0KKyAgICAg
IGhlbGxvLgorICAgIHt7L3ZpZXd9fQorICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiBI
VE1MIHN0cnVjdHVyZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxib2R5PgorICAgICAgPCEtLSBO
b3RlOiB0aGUgaGFuZGxlYmFycyB0ZW1wbGF0ZSBzY3JpcHQKKyAgICAgICAgICAgYWxzbyByZXN1
bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIuVmlldworICAgICAgICAgICB3aGljaCBpcyB0aGUgb3V0
ZXIgPGRpdj4gaGVyZSAtLT4KKyAgCisgICAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAg
ICAgICAgQSBzcGFuOgorICAgICAgICA8c3BhbiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll
dyI+CisgICAgICAgICAgSGVsbG8uCisgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvZGl2PgorICAg
IDwvYm9keT4KKyAgICBgYGAKKyAgCisgICAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0aW5nCisgIAor
ICAgIFRoZSBgcGFyZW50Vmlld2AgcHJvcGVydHkgb2YgdGhlIG5ldyBgRW1iZXIuVmlld2AgaW5z
dGFuY2UgY3JlYXRlZCB0aHJvdWdoCisgICAgYHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0aGUg
YEVtYmVyLlZpZXdgIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZQorICAgIGB7e3ZpZXd9
fWAgd2FzIGNhbGxlZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGFWaWV3ID0gRW1iZXIu
Vmlldy5jcmVhdGUoeworICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgi
e3sjdmlld319IG15IHBhcmVudDoge3twYXJlbnRWaWV3LmVsZW1lbnRJZH19IHt7L3ZpZXd9fSIp
CisgICAgfSk7CisgIAorICAgIGFWaWV3LmFwcGVuZFRvKCdib2R5Jyk7CisgICAgYGBgCisgIAor
ICAgIFdpbGwgcmVzdWx0IGluIEhUTUwgc3RydWN0dXJlOgorICAKKyAgICBgYGBodG1sCisgICAg
PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgICA8ZGl2IGlkPSJlbWJl
cjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICAgICAgbXkgcGFyZW50OiBlbWJlcjEKKyAgICAg
IDwvZGl2PgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICAjIyMgU2V0dGluZyBDU1MgaWQg
YW5kIGNsYXNzIGF0dHJpYnV0ZXMKKyAgCisgICAgVGhlIEhUTUwgYGlkYCBhdHRyaWJ1dGUgY2Fu
IGJlIHNldCBvbiB0aGUgYHt7dmlld319YCdzIHJlc3VsdGluZyBlbGVtZW50IHdpdGgKKyAgICB0
aGUgYGlkYCBvcHRpb24uIFRoaXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFzc2VkIHRvIGBFbWJl
ci5WaWV3LmNyZWF0ZWAuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyN2aWV3IHRhZ05h
bWU9InNwYW4iIGlkPSJhLWN1c3RvbS1pZCJ9fQorICAgICAgaGVsbG8uCisgICAge3svdmlld319
CisgICAgYGBgCisgIAorICAgIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVy
ZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAg
PHNwYW4gaWQ9ImEtY3VzdG9tLWlkIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgICAgIGhlbGxv
LgorICAgICAgPC9zcGFuPgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBUaGUgSFRNTCBg
Y2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5n
IGVsZW1lbnQKKyAgICB3aXRoIHRoZSBgY2xhc3NgIG9yIGBjbGFzc05hbWVCaW5kaW5nc2Agb3B0
aW9ucy4gVGhlIGBjbGFzc2Agb3B0aW9uIHdpbGwKKyAgICBkaXJlY3RseSBzZXQgdGhlIENTUyBg
Y2xhc3NgIGF0dHJpYnV0ZSBhbmQgd2lsbCBub3QgYmUgcGFzc2VkIHRvCisgICAgYEVtYmVyLlZp
ZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdzYCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRl
YCBhbmQgdXNlCisgICAgYEVtYmVyLlZpZXdgJ3MgY2xhc3MgbmFtZSBiaW5kaW5nIGZ1bmN0aW9u
YWxpdHk6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyN2aWV3IHRhZ05hbWU9InNwYW4i
IGNsYXNzPSJhLWN1c3RvbS1jbGFzcyJ9fQorICAgICAgaGVsbG8uCisgICAge3svdmlld319Cisg
ICAgYGBgCisgIAorICAgIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToK
KyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgPHNw
YW4gaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcgYS1jdXN0b20tY2xhc3MiPgorICAgICAg
ICBoZWxsby4KKyAgICAgIDwvc3Bhbj4KKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgIyMj
IFN1cHBseWluZyBhIGRpZmZlcmVudCB2aWV3IGNsYXNzCisgIAorICAgIGB7e3ZpZXd9fWAgY2Fu
IHRha2UgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBzdXBwbGllZCBvcHRp
b25zIHRvCisgICAgc3BlY2lmeSBhIHBhdGggdG8gYSBjdXN0b20gdmlldyBjbGFzcy4KKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIHt7I3ZpZXcgImN1c3RvbSJ9fXt7ISB3aWxsIGxvb2sgdXAg
QXBwLkN1c3RvbVZpZXcgfX0KKyAgICAgIGhlbGxvLgorICAgIHt7L3ZpZXd9fQorICAgIGBgYAor
ICAKKyAgICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoIGFj
Y2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAorICAgIGNvbnRleHQuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBNeUFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7fSk7CisgICAgTXlB
cHAuT3V0ZXJWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgaW5uZXJWaWV3Q2xhc3M6
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgICAgY2xhc3NOYW1lczogWydhLWN1c3RvbS12aWV3
LWNsYXNzLWFzLXByb3BlcnR5J10KKyAgICAgIH0pLAorICAgICAgdGVtcGxhdGU6IEVtYmVyLkhh
bmRsZWJhcnMuY29tcGlsZSgne3sjdmlldyB2aWV3LmlubmVyVmlld0NsYXNzfX0gaGkge3svdmll
d319JykKKyAgICB9KTsKKyAgCisgICAgTXlBcHAuT3V0ZXJWaWV3LmNyZWF0ZSgpLmFwcGVuZFRv
KCdib2R5Jyk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcg
SFRNTDoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXciPgorICAgICAgPGRpdiBpZD0iZW1iZXIyIiBjbGFzcz0iZW1iZXItdmlldyBhLWN1c3Rv
bS12aWV3LWNsYXNzLWFzLXByb3BlcnR5Ij4KKyAgICAgICAgaGkKKyAgICAgIDwvZGl2PgorICAg
IDwvZGl2PgorICAgIGBgYAorICAKKyAgICAjIyMgQmxvY2tsZXNzIHVzZQorICAKKyAgICBJZiB5
b3Ugc3VwcGx5IGEgY3VzdG9tIGBFbWJlci5WaWV3YCBzdWJjbGFzcyB0aGF0IHNwZWNpZmllcyBp
dHMgb3duIHRlbXBsYXRlCisgICAgb3IgcHJvdmlkZSBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlvbiB0
byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQKKyAgICBzdXBwbHlpbmcgYSBibG9j
ay4gQXR0ZW1wdHMgdG8gdXNlIGJvdGggYSBgdGVtcGxhdGVOYW1lYCBvcHRpb24gYW5kIHN1cHBs
eSBhCisgICAgYmxvY2sgd2lsbCB0aHJvdyBhbiBlcnJvci4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICBBcHAuV2l0
aFRlbXBsYXRlRGVmaW5lZFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0
ZU5hbWU6ICdkZWZpbmVkLXRlbXBsYXRlJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3shIGFwcGxpY2F0aW9uLmhicyB9fQorICAgIHt7dmlldyAnd2l0aC10
ZW1wbGF0ZS1kZWZpbmVkJ319CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
eyEgZGVmaW5lZC10ZW1wbGF0ZS5oYnMgfX0KKyAgICBTb21lIGNvbnRlbnQgZm9yIHRoZSBkZWZp
bmVkIHRlbXBsYXRlIHZpZXcuCisgICAgYGBgCisgIAorICAgICMjIyBgdmlld05hbWVgIHByb3Bl
cnR5CisgIAorICAgIFlvdSBjYW4gc3VwcGx5IGEgYHZpZXdOYW1lYCBvcHRpb24gdG8gYHt7dmll
d319YC4gVGhlIGBFbWJlci5WaWV3YCBpbnN0YW5jZQorICAgIHdpbGwgYmUgcmVmZXJlbmNlZCBh
cyBhIHByb3BlcnR5IG9mIGl0cyBwYXJlbnQgdmlldyBieSB0aGlzIG5hbWUuCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBhVmlldyA9IEVtYmVyLlZpZXcuY3JlYXRlKHsKKyAgICAgIHRlbXBs
YXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7I3ZpZXcgdmlld05hbWU9ImFDaGlsZEJ5
TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQorICAgIH0pOworICAKKyAgICBhVmlldy5hcHBlbmRUbygn
Ym9keScpOworICAgIGFWaWV3LmdldCgnYUNoaWxkQnlOYW1lJykgLy8gdGhlIGluc3RhbmNlIG9m
IEVtYmVyLlZpZXcgY3JlYXRlZCBieSB7e3ZpZXd9fSBoZWxwZXIKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCB2aWV3CisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgIEBwdWJs
aWMKKyAgICBAZGVwcmVjYXRlZAorICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBz
ZXR1cFN0YXRlOiBmdW5jdGlvbiAoc3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkgewor
ICAgICAgdmFyIHJlYWQgPSBlbnYuaG9va3MuZ2V0VmFsdWU7CisgICAgICB2YXIgdGFyZ2V0T2Jq
ZWN0ID0gcmVhZChzY29wZS5nZXRTZWxmKCkpOworICAgICAgdmFyIHZpZXdDbGFzc09ySW5zdGFu
Y2UgPSBzdGF0ZS52aWV3Q2xhc3NPckluc3RhbmNlOworICAgICAgaWYgKCF2aWV3Q2xhc3NPcklu
c3RhbmNlKSB7CisgICAgICAgIHZpZXdDbGFzc09ySW5zdGFuY2UgPSBnZXRWaWV3KHJlYWQocGFy
YW1zWzBdKSwgZW52Lm93bmVyKTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgcGFyZW50VmlldyBl
eGlzdHMsIHVzZSBpdHMgY29udHJvbGxlciAodGhlIGRlZmF1bHQKKyAgICAgIC8vIGJlaGF2aW9y
KSwgb3RoZXJ3aXNlIHVzZSBgc2NvcGUuc2VsZmAgYXMgdGhlIGNvbnRyb2xsZXIKKyAgICAgIHZh
ciBjb250cm9sbGVyID0gc2NvcGUuaGFzTG9jYWwoJ3ZpZXcnKSA/IG51bGwgOiByZWFkKHNjb3Bl
LmdldFNlbGYoKSk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1hbmFnZXI6IHN0YXRlLm1h
bmFnZXIsCisgICAgICAgIHBhcmVudFZpZXc6IGVudi52aWV3LAorICAgICAgICBjb250cm9sbGVy
OiBjb250cm9sbGVyLAorICAgICAgICB0YXJnZXRPYmplY3Q6IHRhcmdldE9iamVjdCwKKyAgICAg
ICAgdmlld0NsYXNzT3JJbnN0YW5jZTogdmlld0NsYXNzT3JJbnN0YW5jZQorICAgICAgfTsKKyAg
ICB9LAorCisgICAgcmVyZW5kZXI6IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1z
LCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgICAgLy8gSWYgdGhlIGhh
c2ggaXMgZW1wdHksIHRoZSBjb21wb25lbnQgY2Fubm90IGhhdmUgZXh0cmFjdGVkIGEgcGFydAor
ICAgICAgLy8gb2YgYSBtdXRhYmxlIHBhcmFtIGFuZCB1c2VkIGl0IGluIGl0cyBsYXlvdXQsIGJl
Y2F1c2UgdGhlcmUgYXJlCisgICAgICAvLyBubyBwYXJhbXMgYXQgYWxsLgorICAgICAgaWYgKE9i
amVjdC5rZXlzKGhhc2gpLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gbW9ycGguZ2V0U3RhdGUo
KS5tYW5hZ2VyLnJlcmVuZGVyKGVudiwgaGFzaCwgdmlzaXRvciwgdHJ1ZSk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIHJlbmRlcjogZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsKKyAgICAgIGlmIChoYXNoLnRhZykg
eworICAgICAgICBoYXNoID0gc3dhcEtleShoYXNoLCAndGFnJywgJ3RhZ05hbWUnKTsKKyAgICAg
IH0KKworICAgICAgaWYgKGhhc2guY2xhc3NOYW1lQmluZGluZ3MpIHsKKyAgICAgICAgaGFzaC5j
bGFzc05hbWVCaW5kaW5ncyA9IGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKTsKKyAg
ICAgIH0KKworICAgICAgdmFyIHN0YXRlID0gbm9kZS5nZXRTdGF0ZSgpOworICAgICAgdmFyIHBh
cmVudFZpZXcgPSBzdGF0ZS5wYXJlbnRWaWV3OworCisgICAgICB2YXIgb3B0aW9ucyA9IHsKKyAg
ICAgICAgY29tcG9uZW50OiBzdGF0ZS52aWV3Q2xhc3NPckluc3RhbmNlLAorICAgICAgICBsYXlv
dXQ6IG51bGwKKyAgICAgIH07CisKKyAgICAgIG9wdGlvbnMuY3JlYXRlT3B0aW9ucyA9IHt9Owor
ICAgICAgaWYgKHN0YXRlLmNvbnRyb2xsZXIpIHsKKyAgICAgICAgLy8gVXNlIGBfY29udHJvbGxl
cmAgdG8gYXZvaWQgc3RvbXBpbmcgb24gYSBDUAorICAgICAgICAvLyB0aGF0IGV4aXN0cyBpbiB0
aGUgdGFyZ2V0IHZpZXcvY29tcG9uZW50CisgICAgICAgIG9wdGlvbnMuY3JlYXRlT3B0aW9ucy5f
Y29udHJvbGxlciA9IHN0YXRlLmNvbnRyb2xsZXI7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0
ZS50YXJnZXRPYmplY3QpIHsKKyAgICAgICAgLy8gVXNlIGBfdGFyZ2V0T2JqZWN0YCB0byBhdm9p
ZCBzdG9tcGluZyBvbiBhIENQCisgICAgICAgIC8vIHRoYXQgZXhpc3RzIGluIHRoZSB0YXJnZXQg
dmlldy9jb21wb25lbnQKKyAgICAgICAgb3B0aW9ucy5jcmVhdGVPcHRpb25zLl90YXJnZXRPYmpl
Y3QgPSBzdGF0ZS50YXJnZXRPYmplY3Q7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZS5tYW5h
Z2VyKSB7CisgICAgICAgIHN0YXRlLm1hbmFnZXIuZGVzdHJveSgpOworICAgICAgICBzdGF0ZS5t
YW5hZ2VyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIG5vZGVNYW5hZ2VyID0gX2VtYmVy
SHRtbGJhcnNOb2RlTWFuYWdlcnNWaWV3Tm9kZU1hbmFnZXIuZGVmYXVsdC5jcmVhdGUobm9kZSwg
ZW52LCBoYXNoLCBvcHRpb25zLCBwYXJlbnRWaWV3LCBudWxsLCBzY29wZSwgdGVtcGxhdGUpOwor
ICAgICAgc3RhdGUubWFuYWdlciA9IG5vZGVNYW5hZ2VyOworCisgICAgICBub2RlTWFuYWdlci5y
ZW5kZXIoZW52LCBoYXNoLCB2aXNpdG9yKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZ2V0
Vmlldyh2aWV3UGF0aCwgb3duZXIpIHsKKyAgICB2YXIgdmlld0NsYXNzT3JJbnN0YW5jZTsKKwor
ICAgIGlmICghdmlld1BhdGgpIHsKKyAgICAgIGlmIChvd25lcikgeworICAgICAgICB2aWV3Q2xh
c3NPckluc3RhbmNlID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoJ3ZpZXc6dG9wbGV2ZWwnKTsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIHZpZXdDbGFzc09ySW5zdGFuY2UgPSBfZW1iZXJWaWV3c1Zp
ZXdzVmlldy5kZWZhdWx0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2aWV3Q2xhc3NP
ckluc3RhbmNlID0gX2VtYmVyVmlld3NTdHJlYW1zVXRpbHMucmVhZFZpZXdGYWN0b3J5KHZpZXdQ
YXRoLCBvd25lcik7CisgICAgfQorCisgICAgcmV0dXJuIHZpZXdDbGFzc09ySW5zdGFuY2U7Cisg
IH0KKworICBmdW5jdGlvbiBzd2FwS2V5KGhhc2gsIG9yaWdpbmFsLCB1cGRhdGUpIHsKKyAgICB2
YXIgbmV3SGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBoYXNoKSB7CisgICAgICBp
ZiAocHJvcCA9PT0gb3JpZ2luYWwpIHsKKyAgICAgICAgbmV3SGFzaFt1cGRhdGVdID0gaGFzaFtw
cm9wXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld0hhc2hbcHJvcF0gPSBoYXNoW3Byb3Bd
OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdIYXNoOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvd2l0aCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9kZWJ1ZycsICdodG1sYmFycy1ydW50aW1lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbERlYnVnLCBfaHRtbGJhcnNSdW50aW1lKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisg
IEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBpc1N0YWJsZTogZnVuY3Rpb24gKCkgeworICAgICAg
cmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIGlzRW1wdHk6IGZ1bmN0aW9uIChzdGF0ZSkgewor
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikg
eworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3t7I3dpdGggZm9vfX0gbXVzdCBiZSBj
YWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCBvciB0aGUgdXNlIHRoZSAnICsgJ3t7I3dpdGgg
Zm9vIGFzIHxiYXJ8fX0gc3ludGF4JywgcGFyYW1zLmxlbmd0aCA9PT0gMSk7CisKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUge3sjd2l0aH19IGhlbHBlciBtdXN0IGJlIGNhbGxl
ZCB3aXRoIGEgYmxvY2snLCAhIXRlbXBsYXRlKTsKKworICAgICAgX2h0bWxiYXJzUnVudGltZS5p
bnRlcm5hbC5jb250aW51ZUJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCAnd2l0aCcsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOworICAgIH0sCisKKyAgICByZXJlbmRl
cjogZnVuY3Rpb24gKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBp
bnZlcnNlLCB2aXNpdG9yKSB7CisgICAgICBfaHRtbGJhcnNSdW50aW1lLmludGVybmFsLmNvbnRp
bnVlQmxvY2sobW9ycGgsIGVudiwgc2NvcGUsICd3aXRoJywgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0
ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLWh0
bWxiYXJzL2tleXdvcmRzL3lpZWxkJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSB5aWVsZEtleXdvcmQ7CisK
KyAgZnVuY3Rpb24geWllbGRLZXl3b3JkKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gs
IHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7CisgICAgdmFyIHRvID0gZW52Lmhvb2tzLmdl
dFZhbHVlKGhhc2gudG8pIHx8ICdkZWZhdWx0JzsKKyAgICB2YXIgYmxvY2sgPSBzY29wZS5nZXRC
bG9jayh0byk7CisKKyAgICBpZiAoYmxvY2spIHsKKyAgICAgIGJsb2NrLmludm9rZShlbnYsIHBh
cmFtcywgaGFzaC5zZWxmLCBtb3JwaCwgc2NvcGUsIHZpc2l0b3IpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvbW9ycGhzL2F0dHIt
bW9ycGgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZG9tLWhlbHBlcicsICdl
bWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVn
LCBfZG9tSGVscGVyLCBfZW1iZXJNZXRhbElzX25vbmUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBIVE1MQmFyc0F0dHJNb3JwaCA9IF9kb21IZWxwZXIuZGVmYXVsdC5wcm90b3R5cGUuQXR0
ck1vcnBoQ2xhc3M7CisKKyAgdmFyIHN0eWxlV2FybmluZyA9ICcnICsgJ0JpbmRpbmcgc3R5bGUg
YXR0cmlidXRlcyBtYXkgaW50cm9kdWNlIGNyb3NzLXNpdGUgc2NyaXB0aW5nIHZ1bG5lcmFiaWxp
dGllczsgJyArICdwbGVhc2UgZW5zdXJlIHRoYXQgdmFsdWVzIGJlaW5nIGJvdW5kIGFyZSBwcm9w
ZXJseSBlc2NhcGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgJyArICdpbmNsdWRpbmcgaG93IHRv
IGRpc2FibGUgdGhpcyB3YXJuaW5nLCBzZWUgJyArICdodHRwOi8vZW1iZXJqcy5jb20vZGVwcmVj
YXRpb25zL3YxLngvI3RvY19iaW5kaW5nLXN0eWxlLWF0dHJpYnV0ZXMuJzsKKworICBleHBvcnRz
LnN0eWxlV2FybmluZyA9IHN0eWxlV2FybmluZzsKKyAgdmFyIHByb3RvID0gSFRNTEJhcnNBdHRy
TW9ycGgucHJvdG90eXBlOworCisgIHByb3RvLmRpZEluaXQgPSBmdW5jdGlvbiAoKSB7CisgICAg
dGhpcy5zdHJlYW1VbnN1YnNjcmliZXJzID0gbnVsbDsKKworICAgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIGRlcHJlY2F0ZUVzY2FwZWRTdHls
ZShtb3JwaCwgdmFsdWUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oc3R5bGVXYXJuaW5n
LCAoZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBlc2NhcGVkKSB7CisgICAgICAvLyBTYWZlU3RyaW5n
CisgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQodmFsdWUpIHx8IHZhbHVlICYm
IHZhbHVlLnRvSFRNTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAg
aWYgKG5hbWUgIT09ICdzdHlsZScpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisK
KyAgICAgIHJldHVybiAhZXNjYXBlZDsKKyAgICB9KShtb3JwaC5hdHRyTmFtZSwgdmFsdWUsIG1v
cnBoLmVzY2FwZWQpLCB7IGlkOiAnZW1iZXItaHRtbGJhcnMuc3R5bGUteHNzLXdhcm5pbmcnIH0p
OworICB9CisKKyAgcHJvdG8ud2lsbFNldENvbnRlbnQgPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAg
ICBkZXByZWNhdGVFc2NhcGVkU3R5bGUodGhpcywgdmFsdWUpOworICB9OworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IEhUTUxCYXJzQXR0ck1vcnBoOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L21vcnBocy9tb3JwaCcsIFsnZXhwb3J0cycsICdkb20taGVscGVyJywgJ2VtYmVyLW1ldGFsL2Rl
YnVnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZG9tSGVscGVyLCBfZW1iZXJNZXRhbERlYnVnKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgSFRNTEJhcnNNb3JwaCA9IF9kb21IZWxwZXIuZGVm
YXVsdC5wcm90b3R5cGUuTW9ycGhDbGFzczsKKyAgdmFyIGd1aWQgPSAxOworCisgIGZ1bmN0aW9u
IEVtYmVyTW9ycGgoRE9NSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMuSFRN
TEJhcnNNb3JwaCRjb25zdHJ1Y3RvcihET01IZWxwZXIsIGNvbnRleHR1YWxFbGVtZW50KTsKKwor
ICAgIHRoaXMuZW1iZXJWaWV3ID0gbnVsbDsKKyAgICB0aGlzLmVtYmVyVG9EZXN0cm95ID0gbnVs
bDsKKyAgICB0aGlzLnN0cmVhbVVuc3Vic2NyaWJlcnMgPSBudWxsOworICAgIHRoaXMuZ3VpZCA9
IGd1aWQrKzsKKworICAgIC8vIEEgY29tcG9uZW50IGNhbiBiZWNvbWUgZGlydHkgZWl0aGVyIGJl
Y2F1c2Ugb25lIG9mIGl0cworICAgIC8vIGF0dHJpYnV0ZXMgY2hhbmdlZCwgb3IgYmVjYXVzZSBp
dCB3YXMgcmUtcmVuZGVyZWQuIElmIGFueSBwYXJ0CisgICAgLy8gb2YgdGhlIGNvbXBvbmVudCdz
IHRlbXBsYXRlIGNoYW5nZXMgdGhyb3VnaCBvYnNlcnZhdGlvbiwgaXQgaGFzCisgICAgLy8gcmUt
cmVuZGVyZWQgZnJvbSB0aGUgcGVycHNlY3RpdmUgb2YgdGhlIHByb2dyYW1taW5nIG1vZGVsLiBU
aGlzCisgICAgLy8gZmxhZyBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciBhIGNvbXBvbmVudCBiZWNv
bWVzIGRpcnR5IGJlY2F1c2UKKyAgICAvLyBvbmUgb2YgaXRzIGF0dHJpYnV0ZXMgY2hhbmdlZCwg
d2hpY2ggYWxzbyB0cmlnZ2VycyB0aGUgYXR0cmlidXRlCisgICAgLy8gdXBkYXRlIGZsYWcgKGRp
ZFVwZGF0ZUF0dHJzKS4KKyAgICB0aGlzLnNob3VsZFJlY2VpdmVBdHRycyA9IGZhbHNlOworCisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1Z1NlYWwodGhpcyk7CisgIH0KKworICB2YXIgcHJvdG8g
PSBFbWJlck1vcnBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSFRNTEJhcnNNb3JwaC5wcm90
b3R5cGUpOworICBwcm90by5IVE1MQmFyc01vcnBoJGNvbnN0cnVjdG9yID0gSFRNTEJhcnNNb3Jw
aDsKKyAgcHJvdG8uSFRNTEJhcnNNb3JwaCRjbGVhciA9IEhUTUxCYXJzTW9ycGgucHJvdG90eXBl
LmNsZWFyOworCisgIHByb3RvLmFkZERlc3RydWN0aW9uID0gZnVuY3Rpb24gKHRvRGVzdHJveSkg
eworICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kgPSB0aGlzLmVtYmVyVG9EZXN0cm95IHx8IFtdOwor
ICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kucHVzaCh0b0Rlc3Ryb3kpOworICB9OworCisgIHByb3Rv
LmNsZWFudXAgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHZpZXcgPSB0aGlzLmVtYmVyVmlldzsK
KworICAgIGlmICh2aWV3KSB7CisgICAgICB2YXIgcGFyZW50VmlldyA9IHZpZXcucGFyZW50Vmll
dzsKKworICAgICAgaWYgKHBhcmVudFZpZXcgJiYgdmlldy5vd25lclZpZXcuX2Rlc3Ryb3lpbmdT
dWJ0cmVlRm9yVmlldyA9PT0gcGFyZW50VmlldykgeworICAgICAgICBwYXJlbnRWaWV3LnJlbW92
ZUNoaWxkKHZpZXcpOworICAgICAgfQorICAgIH0KKworICAgIHZhciB0b0Rlc3Ryb3kgPSB0aGlz
LmVtYmVyVG9EZXN0cm95OworCisgICAgaWYgKHRvRGVzdHJveSkgeworICAgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSB0b0Rlc3Ryb3kubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHRvRGVz
dHJveVtpXS5kZXN0cm95KCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kg
PSBudWxsOworICAgIH0KKyAgfTsKKworICBwcm90by5kaWRSZW5kZXIgPSBmdW5jdGlvbiAoZW52
LCBzY29wZSkgeworICAgIGVudi5yZW5kZXJlZE5vZGVzLmFkZCh0aGlzKTsKKyAgfTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBFbWJlck1vcnBoOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L25vZGUtbWFuYWdlcnMvY29tcG9uZW50LW5vZGUtbWFuYWdlcicsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci12aWV3cy9zeXN0ZW0vYnVpbGQtY29tcG9uZW50LXRlbXBs
YXRlJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLW1l
dGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItdmll
d3MvY29tcGF0L2F0dHJzLXByb3h5JywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVtZW50
YXRpb24tc3VwcG9ydCcsICdlbWJlci12aWV3cy9jb21wb25lbnRzL2NvbXBvbmVudCcsICdlbWJl
ci1odG1sYmFycy9nbGltbWVyLWNvbXBvbmVudCcsICdlbWJlci1odG1sYmFycy91dGlscy9leHRy
YWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdjb250YWluZXIv
b3duZXInLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LXZhbHVlJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJWaWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVt
cGxhdGUsIF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZSwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJz
UHJveHksIF9lbWJlckh0bWxiYXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCwgX2VtYmVy
Vmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1iZXJIdG1sYmFyc0dsaW1tZXJDb21wb25lbnQs
IF9lbWJlckh0bWxiYXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2VtYmVyTWV0YWxT
eW1ib2wsIF9jb250YWluZXJPd25lciwgX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlKSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmNyZWF0ZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBv
bmVudDsKKyAgZXhwb3J0cy50YWtlTGVnYWN5U25hcHNob3QgPSB0YWtlTGVnYWN5U25hcHNob3Q7
CisKKyAgLy8gVGhlc2Ugc3ltYm9scyB3aWxsIGJlIHVzZWQgdG8gbGltaXQgbGluay10bydzIHB1
YmxpYyBBUEkgc3VyZmFjZSBhcmVhLgorICB2YXIgSEFTX0JMT0NLID0gX2VtYmVyTWV0YWxTeW1i
b2wuZGVmYXVsdCgnSEFTX0JMT0NLJyk7CisKKyAgZXhwb3J0cy5IQVNfQkxPQ0sgPSBIQVNfQkxP
Q0s7CisgIC8vIEluIHRoZW9yeSB0aGlzIHNob3VsZCBjb21lIHRocm91Z2ggdGhlIGVudiwgYnV0
IGl0IHNob3VsZAorICAvLyBiZSBzYWZlIHRvIGltcG9ydCB0aGlzIHVudGlsIHdlIG1ha2UgdGhl
IGhvb2sgc3lzdGVtIHB1YmxpYworICAvLyBhbmQgaXQgZ2V0cyBhY3RpdmVseSB1c2VkIGluIGFk
ZG9ucyBvciBvdGhlciBkb3duc3RyZWFtCisgIC8vIGxpYnJhcmllcy4KKworICBmdW5jdGlvbiBD
b21wb25lbnROb2RlTWFuYWdlcihjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBzY29wZSwgcmVu
ZGVyTm9kZSwgYXR0cnMsIGJsb2NrLCBleHBlY3RFbGVtZW50KSB7CisgICAgdGhpcy5jb21wb25l
bnQgPSBjb21wb25lbnQ7CisgICAgdGhpcy5pc0FuZ2xlQnJhY2tldCA9IGlzQW5nbGVCcmFja2V0
OworICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB0aGlzLnJlbmRlck5vZGUgPSByZW5kZXJO
b2RlOworICAgIHRoaXMuYXR0cnMgPSBhdHRyczsKKyAgICB0aGlzLmJsb2NrID0gYmxvY2s7Cisg
ICAgdGhpcy5leHBlY3RFbGVtZW50ID0gZXhwZWN0RWxlbWVudDsKKyAgfQorCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IENvbXBvbmVudE5vZGVNYW5hZ2VyOworCisgIENvbXBvbmVudE5vZGVNYW5hZ2Vy
LmNyZWF0ZSA9IGZ1bmN0aW9uIENvbXBvbmVudE5vZGVNYW5hZ2VyX2NyZWF0ZShyZW5kZXJOb2Rl
LCBlbnYsIG9wdGlvbnMpIHsKKyAgICB2YXIgX2NyZWF0ZU9wdGlvbnM7CisKKyAgICB2YXIgdGFn
TmFtZSA9IG9wdGlvbnMudGFnTmFtZTsKKyAgICB2YXIgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7
CisgICAgdmFyIF9vcHRpb25zJGF0dHJzID0gb3B0aW9ucy5hdHRyczsKKyAgICB2YXIgYXR0cnMg
PSBfb3B0aW9ucyRhdHRycyA9PT0gdW5kZWZpbmVkID8ge30gOiBfb3B0aW9ucyRhdHRyczsKKyAg
ICB2YXIgcGFyZW50VmlldyA9IG9wdGlvbnMucGFyZW50VmlldzsKKyAgICB2YXIgcGFyZW50U2Nv
cGUgPSBvcHRpb25zLnBhcmVudFNjb3BlOworICAgIHZhciBpc0FuZ2xlQnJhY2tldCA9IG9wdGlv
bnMuaXNBbmdsZUJyYWNrZXQ7CisgICAgdmFyIGNvbXBvbmVudCA9IG9wdGlvbnMuY29tcG9uZW50
OworICAgIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDsKKyAgICB2YXIgdGVtcGxhdGVzID0g
b3B0aW9ucy50ZW1wbGF0ZXM7CisKKyAgICBjb21wb25lbnQgPSBjb21wb25lbnQgfHwgKGlzQW5n
bGVCcmFja2V0ID8gX2VtYmVySHRtbGJhcnNHbGltbWVyQ29tcG9uZW50LmRlZmF1bHQgOiBfZW1i
ZXJWaWV3c0NvbXBvbmVudHNDb21wb25lbnQuZGVmYXVsdCk7CisKKyAgICB2YXIgY3JlYXRlT3B0
aW9ucyA9IChfY3JlYXRlT3B0aW9ucyA9IHsKKyAgICAgIHBhcmVudFZpZXc6IHBhcmVudFZpZXcK
KyAgICB9LCBfY3JlYXRlT3B0aW9uc1tIQVNfQkxPQ0tdID0gISF0ZW1wbGF0ZXMuZGVmYXVsdCwg
X2NyZWF0ZU9wdGlvbnMpOworCisgICAgY29uZmlndXJlVGFnTmFtZShhdHRycywgdGFnTmFtZSwg
Y29tcG9uZW50LCBpc0FuZ2xlQnJhY2tldCwgY3JlYXRlT3B0aW9ucyk7CisKKyAgICAvLyBNYXAg
cGFzc2VkIGF0dHJpYnV0ZXMgKGUuZy4gPG15LWNvbXBvbmVudCBpZD0iZm9vIj4pIHRvIGNvbXBv
bmVudAorICAgIC8vIHByb3BlcnRpZXMgKHsgaWQ6ICJmb28iIH0pLgorICAgIGNvbmZpZ3VyZUNy
ZWF0ZU9wdGlvbnMoYXR0cnMsIGNyZWF0ZU9wdGlvbnMpOworCisgICAgLy8gSWYgdGhlcmUgaXMg
YSBjb250cm9sbGVyIG9uIHRoZSBzY29wZSwgcGx1Y2sgaXQgb2ZmIGFuZCBzYXZlIGl0IG9uIHRo
ZQorICAgIC8vIGNvbXBvbmVudC4gVGhpcyBhbGxvd3MgdGhlIGNvbXBvbmVudCB0byB0YXJnZXQg
YWN0aW9ucyBzZW50IHZpYQorICAgIC8vIGBzZW5kQWN0aW9uYCBjb3JyZWN0bHkuCisgICAgaWYg
KHBhcmVudFNjb3BlLmhhc0xvY2FsKCdjb250cm9sbGVyJykpIHsKKyAgICAgIGNyZWF0ZU9wdGlv
bnMuX2NvbnRyb2xsZXIgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChwYXJl
bnRTY29wZS5nZXRMb2NhbCgnY29udHJvbGxlcicpKTsKKyAgICB9IGVsc2UgeworICAgICAgY3Jl
YXRlT3B0aW9ucy5fdGFyZ2V0T2JqZWN0ID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRl
ZmF1bHQocGFyZW50U2NvcGUuZ2V0U2VsZigpKTsKKyAgICB9CisKKyAgICBfZW1iZXJIdG1sYmFy
c1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMuZGVmYXVsdChyZW5kZXJOb2RlLCBjb21wb25l
bnQsIHBhcmFtcywgYXR0cnMpOworCisgICAgLy8gSW5zdGFudGlhdGUgdGhlIGNvbXBvbmVudAor
ICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0
LCBjcmVhdGVPcHRpb25zLCByZW5kZXJOb2RlLCBlbnYsIGF0dHJzKTsKKworICAgIC8vIElmIHRo
ZSBjb21wb25lbnQgc3BlY2lmaWVzIGl0cyBsYXlvdXQgdmlhIHRoZSBgbGF5b3V0YCBwcm9wZXJ0
eQorICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgdGhlIHRlbXBsYXRlIGxvb2tlZCB1cCBpbiB0aGUg
Y29udGFpbmVyLCBnZXQgaXQKKyAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBjb21wb25lbnQg
aW5zdGFuY2UuCisgICAgaWYgKCFsYXlvdXQpIHsKKyAgICAgIGxheW91dCA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChjb21wb25lbnQsICdsYXlvdXQnKTsKKyAgICB9CisKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLnJ1bkluRGVidWcoZnVuY3Rpb24gKCkgeworICAgICAgaWYgKGlzQW5nbGVC
cmFja2V0KSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IGlu
dm9rZSB0aGUgXCcnICsgdGFnTmFtZSArICdcJyBjb21wb25lbnQgd2l0aCBhbmdsZSBicmFja2V0
cywgYmVjYXVzZSBpdFwncyBhIHN1YmNsYXNzIG9mIENvbXBvbmVudC4gUGxlYXNlIHVwZ3JhZGUg
dG8gR2xpbW1lckNvbXBvbmVudC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnZva2UgYXMgXCd7
eycgKyB0YWdOYW1lICsgJ319XCcuJywgY29tcG9uZW50LmlzR2xpbW1lckNvbXBvbmVudCk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5v
dCBpbnZva2UgdGhlIFwnJyArIHRhZ05hbWUgKyAnXCcgY29tcG9uZW50IHdpdGggY3VybHkgYnJh
Y2VzLCBiZWNhdXNlIGl0XCdzIGEgc3ViY2xhc3Mgb2YgR2xpbW1lckNvbXBvbmVudC4gUGxlYXNl
IGludm9rZSBpdCBhcyBcJzwnICsgdGFnTmFtZSArICc+XCcgaW5zdGVhZC4nLCAhY29tcG9uZW50
LmlzR2xpbW1lckNvbXBvbmVudCk7CisgICAgICB9CisKKyAgICAgIGlmICghbGF5b3V0KSB7Cisg
ICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGZyYWdtZW50UmVhc29uID0gbGF5
b3V0Lm1ldGEuZnJhZ21lbnRSZWFzb247CisgICAgICBpZiAoaXNBbmdsZUJyYWNrZXQgJiYgZnJh
Z21lbnRSZWFzb24pIHsKKyAgICAgICAgc3dpdGNoIChmcmFnbWVudFJlYXNvbi5uYW1lKSB7Cisg
ICAgICAgICAgY2FzZSAnbWlzc2luZy13cmFwcGVyJzoKKyAgICAgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdUaGUgPCcgKyB0YWdOYW1lICsgJz4gdGVtcGxhdGUgbXVzdCBoYXZlIGEg
c2luZ2xlIHRvcC1sZXZlbCBlbGVtZW50IGJlY2F1c2UgaXQgaXMgYSBHbGltbWVyQ29tcG9uZW50
LicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbW9kaWZpZXJzJzoKKyAg
ICAgICAgICAgIHZhciBtb2RpZmllcnMgPSBmcmFnbWVudFJlYXNvbi5tb2RpZmllcnMubWFwKGZ1
bmN0aW9uIChtKSB7CisgICAgICAgICAgICAgIHJldHVybiAne3snICsgbSArICcgLi4ufX0nOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IGNhbm5vdCB1c2UgJyArIG1vZGlmaWVycy5qb2luKCcsICcpICsgJyBpbiB0aGUgdG9wLWxldmVs
IGVsZW1lbnQgb2YgdGhlIDwnICsgdGFnTmFtZSArICc+IHRlbXBsYXRlIGJlY2F1c2UgaXQgaXMg
YSBHbGltbWVyQ29tcG9uZW50LicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2Fz
ZSAndHJpcGxlLWN1cmxpZXMnOgorICAgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQo
J1lvdSBjYW5ub3QgdXNlIHRyaXBsZSBjdXJsaWVzIChlLmcuIHN0eWxlPXt7eyAuLi4gfX19KSBp
biB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgdGhlIDwnICsgdGFnTmFtZSArICc+IHRlbXBsYXRl
IGJlY2F1c2UgaXQgaXMgYSBHbGltbWVyQ29tcG9uZW50LicpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciByZXN1bHRzID0gX2VtYmVy
Vmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmRlZmF1bHQoeyBsYXlvdXQ6IGxheW91
dCwgY29tcG9uZW50OiBjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0OiBpc0FuZ2xlQnJhY2tldCB9
LCBhdHRycywgeyB0ZW1wbGF0ZXM6IHRlbXBsYXRlcywgc2NvcGU6IHBhcmVudFNjb3BlIH0pOwor
CisgICAgcmV0dXJuIG5ldyBDb21wb25lbnROb2RlTWFuYWdlcihjb21wb25lbnQsIGlzQW5nbGVC
cmFja2V0LCBwYXJlbnRTY29wZSwgcmVuZGVyTm9kZSwgYXR0cnMsIHJlc3VsdHMuYmxvY2ssIHJl
c3VsdHMuY3JlYXRlZEVsZW1lbnQpOworICB9OworCisgIGZ1bmN0aW9uIGNvbmZpZ3VyZVRhZ05h
bWUoYXR0cnMsIHRhZ05hbWUsIGNvbXBvbmVudCwgaXNBbmdsZUJyYWNrZXQsIGNyZWF0ZU9wdGlv
bnMpIHsKKyAgICBpZiAoaXNBbmdsZUJyYWNrZXQpIHsKKyAgICAgIGNyZWF0ZU9wdGlvbnMudGFn
TmFtZSA9IHRhZ05hbWU7CisgICAgfSBlbHNlIGlmIChhdHRycy50YWdOYW1lKSB7CisgICAgICBj
cmVhdGVPcHRpb25zLnRhZ05hbWUgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVs
dChhdHRycy50YWdOYW1lKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb25maWd1cmVDcmVh
dGVPcHRpb25zKGF0dHJzLCBjcmVhdGVPcHRpb25zKSB7CisgICAgLy8gU29tZSBhdHRycyBhcmUg
c3BlY2lhbCBhbmQgbmVlZCB0byBiZSBzZXQgYXMgcHJvcGVydGllcyBvbiB0aGUgY29tcG9uZW50
CisgICAgLy8gaW5zdGFuY2UuIE1ha2Ugc3VyZSB3ZSB1c2UgZ2V0VmFsdWUoKSB0byBnZXQgdGhl
bSBmcm9tIGBhdHRyc2Agc2luY2UKKyAgICAvLyB0aGV5IGFyZSBzdGlsbCBzdHJlYW1zLgorICAg
IGlmIChhdHRycy5pZCkgeworICAgICAgY3JlYXRlT3B0aW9ucy5lbGVtZW50SWQgPSBfZW1iZXJI
dG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCk7CisgICAgfQorICAgIGlmIChh
dHRycy5fZGVmYXVsdFRhZ05hbWUpIHsKKyAgICAgIGNyZWF0ZU9wdGlvbnMuX2RlZmF1bHRUYWdO
YW1lID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0cnMuX2RlZmF1bHRU
YWdOYW1lKTsKKyAgICB9CisgICAgaWYgKGF0dHJzLnZpZXdOYW1lKSB7CisgICAgICBjcmVhdGVP
cHRpb25zLnZpZXdOYW1lID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0
cnMudmlld05hbWUpOworICAgIH0KKyAgfQorCisgIENvbXBvbmVudE5vZGVNYW5hZ2VyLnByb3Rv
dHlwZS5yZW5kZXIgPSBmdW5jdGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9yZW5kZXIoX2Vudiwg
dmlzaXRvcikgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDsKKworICAgIHJl
dHVybiBfZW1iZXJIdG1sYmFyc1N5c3RlbUluc3RydW1lbnRhdGlvblN1cHBvcnQuaW5zdHJ1bWVu
dChjb21wb25lbnQsIGZ1bmN0aW9uIENvbXBvbmVudE5vZGVNYW5hZ2VyX3JlbmRlcl9pbnN0cnVt
ZW50KCkgeworICAgICAgdmFyIG1ldGEgPSB0aGlzLmJsb2NrICYmIHRoaXMuYmxvY2sudGVtcGxh
dGUubWV0YTsKKyAgICAgIHZhciBlbnYgPSBfZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50LCBt
ZXRhKTsKKworICAgICAgZW52LnJlbmRlcmVyLmNvbXBvbmVudFdpbGxSZW5kZXIoY29tcG9uZW50
KTsKKyAgICAgIGVudi5yZW5kZXJlZFZpZXdzLnB1c2goY29tcG9uZW50LmVsZW1lbnRJZCk7CisK
KyAgICAgIGlmICh0aGlzLmJsb2NrKSB7CisgICAgICAgIHRoaXMuYmxvY2suaW52b2tlKGVudiwg
W10sIHVuZGVmaW5lZCwgdGhpcy5yZW5kZXJOb2RlLCB0aGlzLnNjb3BlLCB2aXNpdG9yKTsKKyAg
ICAgIH0KKworICAgICAgdmFyIGVsZW1lbnQgPSB1bmRlZmluZWQ7CisgICAgICBpZiAodGhpcy5l
eHBlY3RFbGVtZW50IHx8IGNvbXBvbmVudC5pc0dsaW1tZXJDb21wb25lbnQpIHsKKyAgICAgICAg
Ly8gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBHbGltbWVyIGNvbXBvbmVudHMgYXJlIG5ldmVyIGZy
YWdtZW50cy4gV2hlbgorICAgICAgICAvLyBHbGltbWVyIGNvbXBvbmVudHMgZ2FpbiBmcmFnbWVu
dCBwb3dlcnMsIHdlIHdpbGwgbmVlZCB0byBjb21tdW5pY2F0ZQorICAgICAgICAvLyB3aGV0aGVy
IHRoZSBsYXlvdXQgcHJvZHVjZWQgYSBzaW5nbGUgdG9wLWxldmVsIG5vZGUgb3IgZnJhZ21lbnQK
KyAgICAgICAgLy8gc29tZWhvdyAoZWl0aGVyIHZpYSBzdGF0aWMgaW5mb3JtYXRpb24gb24gdGhl
IHRlbXBsYXRlL2NvbXBvbmVudCwgb3IKKyAgICAgICAgLy8gZHluYW1pY2FsbHkgYXMgdGhlIGxh
eW91dCBpcyBiZWluZyByZW5kZXJlZCkuCisgICAgICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlck5v
ZGUuZmlyc3ROb2RlOworCisgICAgICAgIC8vIEdsaW1tZXIgY29tcG9uZW50cyBtYXkgaGF2ZSB3
aGl0ZXNwYWNlIG9yIGJvdW5kYXJ5IG5vZGVzIGFyb3VuZCB0aGUKKyAgICAgICAgLy8gdG9wLWxl
dmVsIGVsZW1lbnQuCisgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09
IDEpIHsKKyAgICAgICAgICBlbGVtZW50ID0gbmV4dEVsZW1lbnRTaWJsaW5nKGVsZW1lbnQpOwor
ICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEluIGVudmlyb25tZW50cyBsaWtlIEZhc3RC
b290LCBkaXNhYmxlIGFueSBob29rcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBjb21wb25lbnQKKyAg
ICAgIC8vIHRvIGFjY2VzcyB0aGUgRE9NIGRpcmVjdGx5LgorICAgICAgaWYgKGVudi5kZXN0aW5l
ZEZvckRPTSkgeworICAgICAgICBlbnYucmVuZGVyZXIuZGlkQ3JlYXRlRWxlbWVudChjb21wb25l
bnQsIGVsZW1lbnQpOworICAgICAgICBlbnYucmVuZGVyZXIud2lsbEluc2VydEVsZW1lbnQoY29t
cG9uZW50LCBlbGVtZW50KTsKKworICAgICAgICBlbnYubGlmZWN5Y2xlSG9va3MucHVzaCh7IHR5
cGU6ICdkaWRJbnNlcnRFbGVtZW50JywgdmlldzogY29tcG9uZW50IH0pOworICAgICAgfQorICAg
IH0sIHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIG5leHRFbGVtZW50U2libGluZyhub2RlKSB7
CisgICAgdmFyIGN1cnJlbnQgPSBub2RlOworCisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAg
IGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSAxKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50Owor
ICAgICAgfQorICAgICAgY3VycmVudCA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgfQorICB9CisK
KyAgQ29tcG9uZW50Tm9kZU1hbmFnZXIucHJvdG90eXBlLnJlcmVuZGVyID0gZnVuY3Rpb24gQ29t
cG9uZW50Tm9kZU1hbmFnZXJfcmVyZW5kZXIoX2VudiwgYXR0cnMsIHZpc2l0b3IpIHsKKyAgICB2
YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7CisKKyAgICByZXR1cm4gX2VtYmVySHRtbGJh
cnNTeXN0ZW1JbnN0cnVtZW50YXRpb25TdXBwb3J0Lmluc3RydW1lbnQoY29tcG9uZW50LCBmdW5j
dGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9yZXJlbmRlcl9pbnN0cnVtZW50KCkgeworICAgICAg
dmFyIGVudiA9IF9lbnYuY2hpbGRXaXRoVmlldyhjb21wb25lbnQpOworCisgICAgICB2YXIgc25h
cHNob3QgPSB0YWtlU25hcHNob3QoYXR0cnMpOworCisgICAgICBpZiAoY29tcG9uZW50Ll9yZW5k
ZXJOb2RlLnNob3VsZFJlY2VpdmVBdHRycykgeworICAgICAgICBpZiAoY29tcG9uZW50Ll9wcm9w
YWdhdGVBdHRyc1RvVGhpcykgeworICAgICAgICAgIGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNU
b1RoaXModGFrZUxlZ2FjeVNuYXBzaG90KGF0dHJzKSk7CisgICAgICAgIH0KKworICAgICAgICBl
bnYucmVuZGVyZXIuY29tcG9uZW50VXBkYXRlQXR0cnMoY29tcG9uZW50LCBzbmFwc2hvdCk7Cisg
ICAgICAgIGNvbXBvbmVudC5fcmVuZGVyTm9kZS5zaG91bGRSZWNlaXZlQXR0cnMgPSBmYWxzZTsK
KyAgICAgIH0KKworICAgICAgLy8gTm90aWZ5IGNvbXBvbmVudCB0aGF0IGl0IGhhcyBiZWNvbWUg
ZGlydHkgYW5kIGlzIGFib3V0IHRvIGNoYW5nZS4KKyAgICAgIGVudi5yZW5kZXJlci5jb21wb25l
bnRXaWxsVXBkYXRlKGNvbXBvbmVudCwgc25hcHNob3QpOworICAgICAgZW52LnJlbmRlcmVyLmNv
bXBvbmVudFdpbGxSZW5kZXIoY29tcG9uZW50KTsKKworICAgICAgZW52LnJlbmRlcmVkVmlld3Mu
cHVzaChjb21wb25lbnQuZWxlbWVudElkKTsKKworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAg
ICAgICAgdGhpcy5ibG9jay5pbnZva2UoZW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5v
ZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3IpOworICAgICAgfQorCisgICAgICBlbnYubGlmZWN5Y2xl
SG9va3MucHVzaCh7IHR5cGU6ICdkaWRVcGRhdGUnLCB2aWV3OiBjb21wb25lbnQgfSk7CisKKyAg
ICAgIHJldHVybiBlbnY7CisgICAgfSwgdGhpcyk7CisgIH07CisKKyAgQ29tcG9uZW50Tm9kZU1h
bmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9k
ZXN0cm95KCkgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDsKKworICAgIC8v
IENsZWFyIGNvbXBvbmVudCdzIHJlbmRlciBub2RlLiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYXJl
ZAorICAgIC8vIGR1cmluZyB2aWV3IGRlc3RydWN0aW9uLCBidXQgaW4gdGhpcyBjYXNlIHdlJ3Jl
IHJlLWFzc2lnbmluZyB0aGUKKyAgICAvLyBub2RlIHRvIGEgZGlmZmVyZW50IHZpZXcgYW5kIGl0
IHdpbGwgZ2V0IGNsZWFuZWQgdXAgYXV0b21hdGljYWxseS4KKyAgICBjb21wb25lbnQuX3JlbmRl
ck5vZGUgPSBudWxsOworICAgIGNvbXBvbmVudC5kZXN0cm95KCk7CisgIH07CisKKyAgZnVuY3Rp
b24gY3JlYXRlQ29tcG9uZW50KF9jb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBwcm9wcywgcmVu
ZGVyTm9kZSwgZW52KSB7CisgICAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA8PSA1IHx8
IGFyZ3VtZW50c1s1XSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbNV07CisKKyAgICBp
ZiAoIWlzQW5nbGVCcmFja2V0KSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY29u
dHJvbGxlcj0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCcsICEoJ2NvbnRyb2xsZXInIGluIGF0dHJz
KSk7CisKKyAgICAgIHNuYXBzaG90QW5kVXBkYXRlVGFyZ2V0KGF0dHJzLCBwcm9wcyk7CisgICAg
fSBlbHNlIHsKKyAgICAgIHByb3BzLmF0dHJzID0gdGFrZVNuYXBzaG90KGF0dHJzKTsKKworICAg
ICAgcHJvcHMuX2lzQW5nbGVCcmFja2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBfY29udGFpbmVy
T3duZXIuc2V0T3duZXIocHJvcHMsIGVudi5vd25lcik7CisgICAgcHJvcHMucmVuZGVyZXIgPSBw
cm9wcy5wYXJlbnRWaWV3ID8gcHJvcHMucGFyZW50Vmlldy5yZW5kZXJlciA6IGVudi5vd25lci5s
b29rdXAoJ3JlbmRlcmVyOi1kb20nKTsKKyAgICBwcm9wcy5fdmlld1JlZ2lzdHJ5ID0gcHJvcHMu
cGFyZW50VmlldyA/IHByb3BzLnBhcmVudFZpZXcuX3ZpZXdSZWdpc3RyeSA6IGVudi5vd25lci5s
b29rdXAoJy12aWV3LXJlZ2lzdHJ5Om1haW4nKTsKKworICAgIHZhciBjb21wb25lbnQgPSBfY29t
cG9uZW50LmNyZWF0ZShwcm9wcyk7CisKKyAgICBpZiAocHJvcHMucGFyZW50VmlldykgeworICAg
ICAgcHJvcHMucGFyZW50Vmlldy5hcHBlbmRDaGlsZChjb21wb25lbnQpOworCisgICAgICBpZiAo
cHJvcHMudmlld05hbWUpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHBy
b3BzLnBhcmVudFZpZXcsIHByb3BzLnZpZXdOYW1lLCBjb21wb25lbnQpOworICAgICAgfQorICAg
IH0KKworICAgIGNvbXBvbmVudC5fcmVuZGVyTm9kZSA9IHJlbmRlck5vZGU7CisgICAgcmVuZGVy
Tm9kZS5lbWJlclZpZXcgPSBjb21wb25lbnQ7CisgICAgcmVuZGVyTm9kZS5idWlsZENoaWxkRW52
ID0gYnVpbGRDaGlsZEVudjsKKyAgICByZXR1cm4gY29tcG9uZW50OworICB9CisKKyAgZnVuY3Rp
b24gdGFrZVNuYXBzaG90KGF0dHJzKSB7CisgICAgdmFyIGhhc2ggPSB7fTsKKworICAgIGZvciAo
dmFyIHByb3AgaW4gYXR0cnMpIHsKKyAgICAgIGhhc2hbcHJvcF0gPSBfZW1iZXJIdG1sYmFyc0hv
b2tzR2V0Q2VsbE9yVmFsdWUuZGVmYXVsdChhdHRyc1twcm9wXSk7CisgICAgfQorCisgICAgcmV0
dXJuIGhhc2g7CisgIH0KKworICBmdW5jdGlvbiB0YWtlTGVnYWN5U25hcHNob3QoYXR0cnMpIHsK
KyAgICB2YXIgaGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBhdHRycykgeworICAg
ICAgaGFzaFtwcm9wXSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KGF0dHJz
W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIGZ1bmN0aW9uIHNu
YXBzaG90QW5kVXBkYXRlVGFyZ2V0KHJhd0F0dHJzLCB0YXJnZXQpIHsKKyAgICB2YXIgYXR0cnMg
PSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gcmF3QXR0cnMpIHsKKyAgICAgIHZhciB2YWx1
ZSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZhdWx0KHJhd0F0dHJzW3By
b3BdKTsKKyAgICAgIGF0dHJzW3Byb3BdID0gdmFsdWU7CisKKyAgICAgIC8vIHdoZW4gYGF0dHJz
YCBpcyBhbiBhY3R1YWwgdmFsdWUgYmVpbmcgc2V0IGluIHRoZQorICAgICAgLy8gYXR0cnMgaGFz
aCAoYHt7Zm9vLWJhciBhdHRycz0iYmxhaCJ9fWApIHdlIGNhbm5vdAorICAgICAgLy8gc2V0IGAi
YmxhaCJgIHRvIHRoZSByb290IG9mIHRoZSB0YXJnZXQgYmVjYXVzZQorICAgICAgLy8gdGhhdCB3
b3VsZCByZXBsYWNlIGFsbCBhdHRycyB3aXRoIGBhdHRycy5hdHRyc2AKKyAgICAgIGlmIChwcm9w
ID09PSAnYXR0cnMnKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcud2FybignSW52b2tpbmcg
YSBjb21wb25lbnQgd2l0aCBhIGhhc2ggYXR0cmlidXRlIG5hbWVkIGBhdHRyc2AgaXMgbm90IHN1
cHBvcnRlZC4gUGxlYXNlIHJlZmFjdG9yIHVzYWdlIG9mICcgKyB0YXJnZXQgKyAnIHRvIGF2b2lk
IHBhc3NpbmcgYGF0dHJzYCBhcyBhIGhhc2ggcGFyYW1ldGVyLicsIGZhbHNlLCB7IGlkOiAnZW1i
ZXItaHRtbGJhcnMuY29tcG9uZW50LXVuc3VwcG9ydGVkLWF0dHJzJyB9KTsKKyAgICAgICAgY29u
dGludWU7CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVtfZW1iZXJWaWV3c0Nv
bXBhdEF0dHJzUHJveHkuTVVUQUJMRV9DRUxMXSkgeworICAgICAgICB2YWx1ZSA9IHZhbHVlLnZh
bHVlOworICAgICAgfQorCisgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdGFyZ2V0LmF0dHJzID0gYXR0cnM7CisgIH0KKworICBmdW5jdGlvbiBidWlsZENo
aWxkRW52KHN0YXRlLCBlbnYpIHsKKyAgICByZXR1cm4gZW52LmNoaWxkV2l0aFZpZXcodGhpcy5l
bWJlclZpZXcpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvbm9kZS1tYW5hZ2Vy
cy92aWV3LW5vZGUtbWFuYWdlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAn
ZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItdmlld3Mvc3lzdGVtL2J1aWxkLWNvbXBvbmVudC10
ZW1wbGF0ZScsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfc2V0JywgJ2VtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLXZpZXdzL3ZpZXdz
L3ZpZXcnLCAnZW1iZXItdmlld3MvY29tcGF0L2F0dHJzLXByb3h5JywgJ2VtYmVyLWh0bWxiYXJz
L2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVt
ZW50YXRpb24tc3VwcG9ydCcsICdlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL2NvbXBvbmVu
dC1ub2RlLW1hbmFnZXInLCAnY29udGFpbmVyL293bmVyJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tz
L2dldC12YWx1ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJl
ck1ldGFsRGVidWcsIF9lbWJlclZpZXdzU3lzdGVtQnVpbGRDb21wb25lbnRUZW1wbGF0ZSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRh
bFNldF9wcm9wZXJ0aWVzLCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2VtYmVyVmlld3NDb21wYXRB
dHRyc1Byb3h5LCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Q2VsbE9yVmFsdWUsIF9lbWJlckh0bWxi
YXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCwgX2VtYmVySHRtbGJhcnNOb2RlTWFuYWdl
cnNDb21wb25lbnROb2RlTWFuYWdlciwgX2NvbnRhaW5lck93bmVyLCBfZW1iZXJIdG1sYmFyc0hv
b2tzR2V0VmFsdWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuY3JlYXRlT3JVcGRh
dGVDb21wb25lbnQgPSBjcmVhdGVPclVwZGF0ZUNvbXBvbmVudDsKKworICBmdW5jdGlvbiBWaWV3
Tm9kZU1hbmFnZXIoY29tcG9uZW50LCBzY29wZSwgcmVuZGVyTm9kZSwgYmxvY2ssIGV4cGVjdEVs
ZW1lbnQpIHsKKyAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICB0aGlzLnNjb3Bl
ID0gc2NvcGU7CisgICAgdGhpcy5yZW5kZXJOb2RlID0gcmVuZGVyTm9kZTsKKyAgICB0aGlzLmJs
b2NrID0gYmxvY2s7CisgICAgdGhpcy5leHBlY3RFbGVtZW50ID0gZXhwZWN0RWxlbWVudDsKKyAg
fQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IFZpZXdOb2RlTWFuYWdlcjsKKworICBWaWV3Tm9kZU1h
bmFnZXIuY3JlYXRlID0gZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX2NyZWF0ZShyZW5kZXJOb2Rl
LCBlbnYsIGF0dHJzLCBmb3VuZCwgcGFyZW50VmlldywgcGF0aCwgY29udGVudFNjb3BlLCBjb250
ZW50VGVtcGxhdGUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnSFRNTEJhcnMgZXJy
b3I6IENvdWxkIG5vdCBmaW5kIGNvbXBvbmVudCBuYW1lZCAiJyArIHBhdGggKyAnIiAobm8gY29t
cG9uZW50IG9yIHRlbXBsYXRlIHdpdGggdGhhdCBuYW1lIHdhcyBmb3VuZCknLCAhIShmdW5jdGlv
biAoKSB7CisgICAgICBpZiAocGF0aCkgeworICAgICAgICByZXR1cm4gZm91bmQuY29tcG9uZW50
IHx8IGZvdW5kLmxheW91dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmb3VuZC5j
b21wb25lbnQgfHwgZm91bmQubGF5b3V0IHx8IGNvbnRlbnRUZW1wbGF0ZTsKKyAgICAgIH0KKyAg
ICB9KSgpKTsKKworICAgIHZhciBjb21wb25lbnQ7CisgICAgdmFyIGNvbXBvbmVudEluZm8gPSB7
IGxheW91dDogZm91bmQubGF5b3V0IH07CisKKyAgICBpZiAoZm91bmQuY29tcG9uZW50KSB7Cisg
ICAgICB2YXIgb3B0aW9ucyA9IHsgcGFyZW50VmlldzogcGFyZW50VmlldyB9OworCisgICAgICBp
ZiAoYXR0cnMgJiYgYXR0cnMuaWQpIHsKKyAgICAgICAgb3B0aW9ucy5lbGVtZW50SWQgPSBfZW1i
ZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCk7CisgICAgICB9CisgICAg
ICBpZiAoYXR0cnMgJiYgYXR0cnMudGFnTmFtZSkgeworICAgICAgICBvcHRpb25zLnRhZ05hbWUg
PSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy50YWdOYW1lKTsKKyAg
ICAgIH0KKyAgICAgIGlmIChhdHRycyAmJiBhdHRycy5fZGVmYXVsdFRhZ05hbWUpIHsKKyAgICAg
ICAgb3B0aW9ucy5fZGVmYXVsdFRhZ05hbWUgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUu
ZGVmYXVsdChhdHRycy5fZGVmYXVsdFRhZ05hbWUpOworICAgICAgfQorICAgICAgaWYgKGF0dHJz
ICYmIGF0dHJzLnZpZXdOYW1lKSB7CisgICAgICAgIG9wdGlvbnMudmlld05hbWUgPSBfZW1iZXJI
dG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy52aWV3TmFtZSk7CisgICAgICB9CisK
KyAgICAgIGlmIChmb3VuZC5jb21wb25lbnQuY3JlYXRlICYmIGNvbnRlbnRTY29wZSkgeworICAg
ICAgICB2YXIgX3NlbGYgPSBjb250ZW50U2NvcGUuZ2V0U2VsZigpOworICAgICAgICBpZiAoX3Nl
bGYpIHsKKyAgICAgICAgICBvcHRpb25zLl9jb250ZXh0ID0gX2VtYmVySHRtbGJhcnNIb29rc0dl
dFZhbHVlLmRlZmF1bHQoY29udGVudFNjb3BlLmdldFNlbGYoKSk7CisgICAgICAgIH0KKyAgICAg
IH0KKworICAgICAgaWYgKGZvdW5kLnNlbGYpIHsKKyAgICAgICAgb3B0aW9ucy5fY29udGV4dCA9
IF9lbWJlckh0bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KGZvdW5kLnNlbGYpOworICAgICAg
fQorCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRJbmZvLmNvbXBvbmVudCA9IGNyZWF0ZU9y
VXBkYXRlQ29tcG9uZW50KGZvdW5kLmNvbXBvbmVudCwgb3B0aW9ucywgZm91bmQuY3JlYXRlT3B0
aW9ucywgcmVuZGVyTm9kZSwgZW52LCBhdHRycyk7CisKKyAgICAgIHZhciBsYXlvdXQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoY29tcG9uZW50LCAnbGF5b3V0Jyk7CisgICAgICBpZiAo
bGF5b3V0KSB7CisgICAgICAgIGNvbXBvbmVudEluZm8ubGF5b3V0ID0gbGF5b3V0OworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgY29tcG9uZW50SW5mby5sYXlvdXQgPSBnZXRUZW1wbGF0ZShjb21w
b25lbnQpIHx8IGNvbXBvbmVudEluZm8ubGF5b3V0OworICAgICAgfQorCisgICAgICByZW5kZXJO
b2RlLmVtYmVyVmlldyA9IGNvbXBvbmVudDsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydCgnQlVHOiBWaWV3Tm9kZU1hbmFnZXIuY3JlYXRlIGNhbiB0YWtlIGEgc2NvcGUgb3Ig
YSBzZWxmLCBidXQgbm90IGJvdGgnLCAhKGNvbnRlbnRTY29wZSAmJiBmb3VuZC5zZWxmKSk7CisK
KyAgICB2YXIgcmVzdWx0cyA9IF9lbWJlclZpZXdzU3lzdGVtQnVpbGRDb21wb25lbnRUZW1wbGF0
ZS5kZWZhdWx0KGNvbXBvbmVudEluZm8sIGF0dHJzLCB7CisgICAgICB0ZW1wbGF0ZXM6IHsgZGVm
YXVsdDogY29udGVudFRlbXBsYXRlIH0sCisgICAgICBzY29wZTogY29udGVudFNjb3BlLAorICAg
ICAgc2VsZjogZm91bmQuc2VsZgorICAgIH0pOworCisgICAgcmV0dXJuIG5ldyBWaWV3Tm9kZU1h
bmFnZXIoY29tcG9uZW50LCBjb250ZW50U2NvcGUsIHJlbmRlck5vZGUsIHJlc3VsdHMuYmxvY2ss
IHJlc3VsdHMuY3JlYXRlZEVsZW1lbnQpOworICB9OworCisgIFZpZXdOb2RlTWFuYWdlci5wcm90
b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX3JlbmRlcihlbnYsIGF0dHJz
LCB2aXNpdG9yKSB7CisgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50OworCisgICAg
cmV0dXJuIF9lbWJlckh0bWxiYXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydC5pbnN0cnVt
ZW50KGNvbXBvbmVudCwgZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX3JlbmRlcl9pbnN0cnVtZW50
KCkgeworICAgICAgdmFyIG5ld0VudiA9IGVudjsKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAg
ICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50KTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHZhciBtZXRhID0gdGhpcy5ibG9jayAmJiB0aGlzLmJsb2NrLnRlbXBsYXRl
Lm1ldGE7CisKKyAgICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aE1ldGEobWV0YSk7CisgICAg
ICB9CisKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAgICAgICAgZW52LnJlbmRlcmVyLndpbGxS
ZW5kZXIoY29tcG9uZW50KTsKKyAgICAgICAgZW52LnJlbmRlcmVkVmlld3MucHVzaChjb21wb25l
bnQuZWxlbWVudElkKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAgICAg
ICAgdGhpcy5ibG9jay5pbnZva2UobmV3RW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5v
ZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3IpOworICAgICAgfQorCisgICAgICBpZiAoY29tcG9uZW50
KSB7CisgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5leHBlY3RFbGVtZW50ICYmIHRoaXMucmVu
ZGVyTm9kZS5maXJzdE5vZGU7CisKKyAgICAgICAgLy8gSW4gZW52aXJvbm1lbnRzIGxpa2UgRmFz
dEJvb3QsIGRpc2FibGUgYW55IGhvb2tzIHRoYXQgd291bGQgY2F1c2UgdGhlIGNvbXBvbmVudAor
ICAgICAgICAvLyB0byBhY2Nlc3MgdGhlIERPTSBkaXJlY3RseS4KKyAgICAgICAgaWYgKGVudi5k
ZXN0aW5lZEZvckRPTSkgeworICAgICAgICAgIGVudi5yZW5kZXJlci5kaWRDcmVhdGVFbGVtZW50
KGNvbXBvbmVudCwgZWxlbWVudCk7CisgICAgICAgICAgZW52LnJlbmRlcmVyLndpbGxJbnNlcnRF
bGVtZW50KGNvbXBvbmVudCwgZWxlbWVudCk7CisgICAgICAgICAgZW52LmxpZmVjeWNsZUhvb2tz
LnB1c2goeyB0eXBlOiAnZGlkSW5zZXJ0RWxlbWVudCcsIHZpZXc6IGNvbXBvbmVudCB9KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0sIHRoaXMpOworICB9OworCisgIFZpZXdOb2RlTWFuYWdl
ci5wcm90b3R5cGUucmVyZW5kZXIgPSBmdW5jdGlvbiBWaWV3Tm9kZU1hbmFnZXJfcmVyZW5kZXIo
ZW52LCBhdHRycywgdmlzaXRvcikgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVu
dDsKKworICAgIHJldHVybiBfZW1iZXJIdG1sYmFyc1N5c3RlbUluc3RydW1lbnRhdGlvblN1cHBv
cnQuaW5zdHJ1bWVudChjb21wb25lbnQsIGZ1bmN0aW9uIFZpZXdOb2RlTWFuYWdlcl9yZXJlbmRl
cl9pbnN0cnVtZW50KCkgeworICAgICAgdmFyIG5ld0VudiA9IGVudjsKKyAgICAgIGlmIChjb21w
b25lbnQpIHsKKyAgICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50KTsK
KworICAgICAgICB2YXIgc25hcHNob3QgPSB0YWtlU25hcHNob3QoYXR0cnMpOworCisgICAgICAg
IC8vIE5vdGlmeSBjb21wb25lbnQgdGhhdCBpdCBoYXMgYmVjb21lIGRpcnR5IGFuZCBpcyBhYm91
dCB0byBjaGFuZ2UuCisgICAgICAgIGVudi5yZW5kZXJlci53aWxsVXBkYXRlKGNvbXBvbmVudCwg
c25hcHNob3QpOworCisgICAgICAgIGlmIChjb21wb25lbnQuX3JlbmRlck5vZGUuc2hvdWxkUmVj
ZWl2ZUF0dHJzKSB7CisgICAgICAgICAgaWYgKGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNUb1Ro
aXMpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNUb1RoaXMoX2VtYmVy
SHRtbGJhcnNOb2RlTWFuYWdlcnNDb21wb25lbnROb2RlTWFuYWdlci50YWtlTGVnYWN5U25hcHNo
b3QoYXR0cnMpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnYucmVuZGVyZXIuY29tcG9u
ZW50VXBkYXRlQXR0cnMoY29tcG9uZW50LCBzbmFwc2hvdCk7CisgICAgICAgICAgY29tcG9uZW50
Ll9yZW5kZXJOb2RlLnNob3VsZFJlY2VpdmVBdHRycyA9IGZhbHNlOworICAgICAgICB9CisKKyAg
ICAgICAgZW52LnJlbmRlcmVyLndpbGxSZW5kZXIoY29tcG9uZW50KTsKKworICAgICAgICBlbnYu
cmVuZGVyZWRWaWV3cy5wdXNoKGNvbXBvbmVudC5lbGVtZW50SWQpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgdmFyIG1ldGEgPSB0aGlzLmJsb2NrICYmIHRoaXMuYmxvY2sudGVtcGxhdGUubWV0
YTsKKworICAgICAgICBuZXdFbnYgPSBlbnYuY2hpbGRXaXRoTWV0YShtZXRhKTsKKyAgICAgIH0K
KworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAgICAgICAgdGhpcy5ibG9jay5pbnZva2UobmV3
RW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5vZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3Ip
OworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3RW52OworICAgIH0sIHRoaXMpOworICB9Owor
CisgIFZpZXdOb2RlTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIFZpZXdOb2Rl
TWFuYWdlcl9kZXN0cm95KCkgeworICAgIGlmICh0aGlzLmNvbXBvbmVudCkgeworICAgICAgdGhp
cy5jb21wb25lbnQuZGVzdHJveSgpOworICAgICAgdGhpcy5jb21wb25lbnQgPSBudWxsOworICAg
IH0KKyAgfTsKKworICBmdW5jdGlvbiBnZXRUZW1wbGF0ZShjb21wb25lbnRPclZpZXcpIHsKKyAg
ICBpZiAoIWNvbXBvbmVudE9yVmlldy5pc0NvbXBvbmVudCkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldChjb21wb25lbnRPclZpZXcsICd0ZW1wbGF0ZScpOworICAg
IH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGVD
b21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLCBjcmVhdGVPcHRpb25zLCByZW5kZXJOb2RlLCBl
bnYpIHsKKyAgICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDUgfHwgYXJndW1lbnRz
WzVdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1s1XTsKKworICAgIHZhciBzbmFwc2hv
dCA9IHRha2VTbmFwc2hvdChhdHRycyk7CisgICAgdmFyIHByb3BzID0gX2VtYmVyTWV0YWxBc3Np
Z24uZGVmYXVsdCh7fSwgb3B0aW9ucyk7CisgICAgdmFyIGRlZmF1bHRDb250cm9sbGVyID0gX2Vt
YmVyVmlld3NWaWV3c1ZpZXcuZGVmYXVsdC5wcm90bygpLmNvbnRyb2xsZXI7CisgICAgdmFyIGhh
c1N1cHBsaWVkQ29udHJvbGxlciA9ICdjb250cm9sbGVyJyBpbiBhdHRycyB8fCAnY29udHJvbGxl
cicgaW4gcHJvcHM7CisKKyAgICBpZiAoIXByb3BzLm93bmVyVmlldyAmJiBvcHRpb25zLnBhcmVu
dFZpZXcpIHsKKyAgICAgIHByb3BzLm93bmVyVmlldyA9IG9wdGlvbnMucGFyZW50Vmlldy5vd25l
clZpZXc7CisgICAgfQorCisgICAgcHJvcHMuYXR0cnMgPSBzbmFwc2hvdDsKKyAgICBpZiAoY29t
cG9uZW50LmNyZWF0ZSkgeworICAgICAgdmFyIHByb3RvID0gY29tcG9uZW50LnByb3RvKCk7CisK
KyAgICAgIGlmIChjcmVhdGVPcHRpb25zKSB7CisgICAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRl
ZmF1bHQocHJvcHMsIGNyZWF0ZU9wdGlvbnMpOworICAgICAgfQorCisgICAgICBtZXJnZUJpbmRp
bmdzKHByb3BzLCBzbmFwc2hvdCk7CisKKyAgICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKwor
ICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKHByb3BzLCBvd25lcik7CisgICAgICBwcm9w
cy5yZW5kZXJlciA9IG9wdGlvbnMucGFyZW50VmlldyA/IG9wdGlvbnMucGFyZW50Vmlldy5yZW5k
ZXJlciA6IG93bmVyICYmIG93bmVyLmxvb2t1cCgncmVuZGVyZXI6LWRvbScpOworICAgICAgcHJv
cHMuX3ZpZXdSZWdpc3RyeSA9IG9wdGlvbnMucGFyZW50VmlldyA/IG9wdGlvbnMucGFyZW50Vmll
dy5fdmlld1JlZ2lzdHJ5IDogb3duZXIgJiYgb3duZXIubG9va3VwKCctdmlldy1yZWdpc3RyeTpt
YWluJyk7CisKKyAgICAgIGlmIChwcm90by5jb250cm9sbGVyICE9PSBkZWZhdWx0Q29udHJvbGxl
ciB8fCBoYXNTdXBwbGllZENvbnRyb2xsZXIpIHsKKyAgICAgICAgZGVsZXRlIHByb3BzLl9jb250
ZXh0OworICAgICAgfQorCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuY3JlYXRlKHByb3Bz
KTsKKyAgICB9IGVsc2UgeworICAgICAgZW52LnJlbmRlcmVyLmNvbXBvbmVudFVwZGF0ZUF0dHJz
KGNvbXBvbmVudCwgc25hcHNob3QpOworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJvcGVydGllcy5k
ZWZhdWx0KGNvbXBvbmVudCwgcHJvcHMpOworCisgICAgICBpZiAoY29tcG9uZW50Ll9wcm9wYWdh
dGVBdHRyc1RvVGhpcykgeworICAgICAgICBjb21wb25lbnQuX3Byb3BhZ2F0ZUF0dHJzVG9UaGlz
KF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIudGFrZUxlZ2Fj
eVNuYXBzaG90KGF0dHJzKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMucGFy
ZW50VmlldykgeworICAgICAgb3B0aW9ucy5wYXJlbnRWaWV3LmFwcGVuZENoaWxkKGNvbXBvbmVu
dCk7CisKKyAgICAgIGlmIChvcHRpb25zLnZpZXdOYW1lKSB7CisgICAgICAgIF9lbWJlck1ldGFs
UHJvcGVydHlfc2V0LnNldChvcHRpb25zLnBhcmVudFZpZXcsIG9wdGlvbnMudmlld05hbWUsIGNv
bXBvbmVudCk7CisgICAgICB9CisgICAgfQorCisgICAgY29tcG9uZW50Ll9yZW5kZXJOb2RlID0g
cmVuZGVyTm9kZTsKKworICAgIHJlbmRlck5vZGUuZW1iZXJWaWV3ID0gY29tcG9uZW50OworICAg
IHJldHVybiBjb21wb25lbnQ7CisgIH0KKworICBmdW5jdGlvbiB0YWtlU25hcHNob3QoYXR0cnMp
IHsKKyAgICB2YXIgaGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBhdHRycykgewor
ICAgICAgaGFzaFtwcm9wXSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZh
dWx0KGF0dHJzW3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIGZ1
bmN0aW9uIG1lcmdlQmluZGluZ3ModGFyZ2V0LCBhdHRycykgeworICAgIGZvciAodmFyIHByb3Ag
aW4gYXR0cnMpIHsKKyAgICAgIGlmICghYXR0cnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAg
ICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyB3aGVuIGBhdHRyc2AgaXMgYW4gYWN0
dWFsIHZhbHVlIGJlaW5nIHNldCBpbiB0aGUKKyAgICAgIC8vIGF0dHJzIGhhc2ggKGB7e2Zvby1i
YXIgYXR0cnM9ImJsYWgifX1gKSB3ZSBjYW5ub3QKKyAgICAgIC8vIHNldCBgImJsYWgiYCB0byB0
aGUgcm9vdCBvZiB0aGUgdGFyZ2V0IGJlY2F1c2UKKyAgICAgIC8vIHRoYXQgd291bGQgcmVwbGFj
ZSBhbGwgYXR0cnMgd2l0aCBgYXR0cnMuYXR0cnNgCisgICAgICBpZiAocHJvcCA9PT0gJ2F0dHJz
JykgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ0ludm9raW5nIGEgY29tcG9uZW50
IHdpdGggYSBoYXNoIGF0dHJpYnV0ZSBuYW1lZCBgYXR0cnNgIGlzIG5vdCBzdXBwb3J0ZWQuIFBs
ZWFzZSByZWZhY3RvciB1c2FnZSBvZiAnICsgdGFyZ2V0ICsgJyB0byBhdm9pZCBwYXNzaW5nIGBh
dHRyc2AgYXMgYSBoYXNoIHBhcmFtZXRlci4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLWh0bWxiYXJz
LnZpZXctdW5zdXBwb3J0ZWQtYXR0cnMnIH0pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0K
KyAgICAgIHZhciB2YWx1ZSA9IGF0dHJzW3Byb3BdOworCisgICAgICBpZiAodmFsdWUgJiYgdmFs
dWVbX2VtYmVyVmlld3NDb21wYXRBdHRyc1Byb3h5Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgICAg
dGFyZ2V0W3Byb3BdID0gdmFsdWUudmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YXJn
ZXRbcHJvcF0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGFyZ2V0Owor
ICB9Cit9KTsKKworLy8gSW4gdGhlb3J5IHRoaXMgc2hvdWxkIGNvbWUgdGhyb3VnaCB0aGUgZW52
LCBidXQgaXQgc2hvdWxkCisvLyBiZSBzYWZlIHRvIGltcG9ydCB0aGlzIHVudGlsIHdlIG1ha2Ug
dGhlIGhvb2sgc3lzdGVtIHB1YmxpYworLy8gYW5kIGl0IGdldHMgYWN0aXZlbHkgdXNlZCBpbiBh
ZGRvbnMgb3Igb3RoZXIgZG93bnN0cmVhbQorLy8gbGlicmFyaWVzLgorZW5pZmVkKCdlbWJlci1o
dG1sYmFycy9zdHJlYW1zL2J1aWx0LWluLWhlbHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0sIF9lbWJlckh0bWxiYXJzU3Ry
ZWFtc1V0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgQnVpbHRJbkhlbHBlclN0cmVh
bSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDog
ZnVuY3Rpb24gKGhlbHBlciwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZXMsIGVudiwgc2NvcGUsIGxh
YmVsKSB7CisgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKKyAgICAgIHRoaXMucGFyYW1zID0g
cGFyYW1zOworICAgICAgdGhpcy50ZW1wbGF0ZXMgPSB0ZW1wbGF0ZXM7CisgICAgICB0aGlzLmVu
diA9IGVudjsKKyAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgIHRoaXMuaGFzaCA9IGhh
c2g7CisgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLmhlbHBlcihfZW1iZXJIdG1sYmFyc1N0cmVh
bXNVdGlscy5nZXRBcnJheVZhbHVlcyh0aGlzLnBhcmFtcyksIF9lbWJlckh0bWxiYXJzU3RyZWFt
c1V0aWxzLmdldEhhc2hWYWx1ZXModGhpcy5oYXNoKSwgdGhpcy50ZW1wbGF0ZXMsIHRoaXMuZW52
LCB0aGlzLnNjb3BlKTsKKyAgICB9CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEJ1aWx0
SW5IZWxwZXJTdHJlYW07Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3RyZWFtcy9oZWxw
ZXItZmFjdG9yeScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdl
bWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbFN0cmVhbXNTdHJlYW0sIF9lbWJlckh0bWxiYXJzU3RyZWFtc1V0aWxzKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICB2YXIgSGVscGVyRmFjdG9yeVN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFt
c1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGhlbHBlckZhY3Rv
cnksIHBhcmFtcywgaGFzaCwgbGFiZWwpIHsKKyAgICAgIHRoaXMuaGVscGVyRmFjdG9yeSA9IGhl
bHBlckZhY3Rvcnk7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgIHRoaXMuaGFz
aCA9IGhhc2g7CisgICAgICB0aGlzLmxpbmthYmxlID0gdHJ1ZTsKKyAgICAgIHRoaXMuaGVscGVy
ID0gbnVsbDsKKyAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICB9LAorCisgICAgY29tcHV0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF0aGlzLmhlbHBlcikgeworICAgICAgICB0aGlz
LmhlbHBlciA9IHRoaXMuaGVscGVyRmFjdG9yeS5jcmVhdGUoeyBfc3RyZWFtOiB0aGlzIH0pOwor
ICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmNvbXB1dGUoX2VtYmVySHRtbGJhcnNT
dHJlYW1zVXRpbHMuZ2V0QXJyYXlWYWx1ZXModGhpcy5wYXJhbXMpLCBfZW1iZXJIdG1sYmFyc1N0
cmVhbXNVdGlscy5nZXRIYXNoVmFsdWVzKHRoaXMuaGFzaCkpOworICAgIH0sCisKKyAgICBkZWFj
dGl2YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnN1cGVyJGRlYWN0aXZhdGUoKTsKKyAg
ICAgIGlmICh0aGlzLmhlbHBlcikgeworICAgICAgICB0aGlzLmhlbHBlci5kZXN0cm95KCk7Cisg
ICAgICAgIHRoaXMuaGVscGVyID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorICAgIHN1cGVyJGRl
YWN0aXZhdGU6IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LnByb3RvdHlwZS5kZWFj
dGl2YXRlCisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEhlbHBlckZhY3RvcnlTdHJlYW07
Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3RyZWFtcy9oZWxwZXItaW5zdGFuY2UnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItaHRtbGJhcnMv
c3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zU3Ry
ZWFtLCBfZW1iZXJIdG1sYmFyc1N0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAg
dmFyIEhlbHBlckluc3RhbmNlU3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1
bHQuZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAoaGVscGVyLCBwYXJhbXMsIGhhc2gsIGxh
YmVsKSB7CisgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKKyAgICAgIHRoaXMucGFyYW1zID0g
cGFyYW1zOworICAgICAgdGhpcy5oYXNoID0gaGFzaDsKKyAgICAgIHRoaXMubGlua2FibGUgPSB0
cnVlOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0sCisKKyAgICBjb21wdXRlOiBm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuY29tcHV0ZShfZW1iZXJIdG1s
YmFyc1N0cmVhbXNVdGlscy5nZXRBcnJheVZhbHVlcyh0aGlzLnBhcmFtcyksIF9lbWJlckh0bWxi
YXJzU3RyZWFtc1V0aWxzLmdldEhhc2hWYWx1ZXModGhpcy5oYXNoKSk7CisgICAgfQorICB9KTsK
KworICBleHBvcnRzLmRlZmF1bHQgPSBIZWxwZXJJbnN0YW5jZVN0cmVhbTsKK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL2hvb2tzL2dldC12YWx1ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySHRtbGJhcnNI
b29rc0dldFZhbHVlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmdldEFycmF5VmFs
dWVzID0gZ2V0QXJyYXlWYWx1ZXM7CisgIGV4cG9ydHMuZ2V0SGFzaFZhbHVlcyA9IGdldEhhc2hW
YWx1ZXM7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBsZWFrIG11dGFibGUgY2VsbHMgaW50byBo
ZWxwZXJzLCB3aGljaAorICAvLyBhcmUgcHVyZSBmdW5jdGlvbnMgdGhhdCBjYW4gb25seSB3b3Jr
IHdpdGggdmFsdWVzLgorCisgIGZ1bmN0aW9uIGdldEFycmF5VmFsdWVzKHBhcmFtcykgeworICAg
IHZhciBsID0gcGFyYW1zLmxlbmd0aDsKKyAgICB2YXIgb3V0ID0gbmV3IEFycmF5KGwpOworCisg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICAgIG91dFtpXSA9IF9lbWJlckh0
bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KHBhcmFtc1tpXSk7CisgICAgfQorCisgICAgcmV0
dXJuIG91dDsKKyAgfQorCisgIGZ1bmN0aW9uIGdldEhhc2hWYWx1ZXMoaGFzaCkgeworICAgIHZh
ciBvdXQgPSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgICAgb3V0W3By
b3BdID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoaGFzaFtwcm9wXSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L3N5c3RlbS9hcHBlbmQtdGVtcGxhdGVkLXZpZXcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3Zp
ZXcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldykgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGFwcGVuZFRlbXBsYXRlZFZpZXc7CisKKyAgZnVuY3Rpb24g
YXBwZW5kVGVtcGxhdGVkVmlldyhwYXJlbnRWaWV3LCBtb3JwaCwgdmlld0NsYXNzT3JJbnN0YW5j
ZSwgcHJvcHMpIHsKKyAgICB2YXIgdmlld1Byb3RvOworICAgIGlmIChfZW1iZXJWaWV3c1ZpZXdz
Vmlldy5kZWZhdWx0LmRldGVjdEluc3RhbmNlKHZpZXdDbGFzc09ySW5zdGFuY2UpKSB7CisgICAg
ICB2aWV3UHJvdG8gPSB2aWV3Q2xhc3NPckluc3RhbmNlOworICAgIH0gZWxzZSB7CisgICAgICB2
aWV3UHJvdG8gPSB2aWV3Q2xhc3NPckluc3RhbmNlLnByb3RvKCk7CisgICAgfQorCisgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhIHRlbXBsYXRlIGJsb2Nr
IGlmIHlvdSBhbHNvIHNwZWNpZmllZCBhIHRlbXBsYXRlTmFtZScsICFwcm9wcy50ZW1wbGF0ZSB8
fCAhX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHByb3BzLCAndGVtcGxhdGVOYW1lJykgJiYg
IV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3UHJvdG8sICd0ZW1wbGF0ZU5hbWUnKSk7
CisKKyAgICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBfY29udGV4dGAgY29tcHV0
ZWQgcHJvcGVydHkgaWYgdGhlcmUgaXMKKyAgICAvLyBubyBzcGVjaWZpZWQgY29udHJvbGxlci4g
U2VlIFZpZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgdmFyIG5vQ29udHJv
bGxlckluUHJvdG8gPSAhdmlld1Byb3RvLmNvbnRyb2xsZXI7CisgICAgaWYgKHZpZXdQcm90by5j
b250cm9sbGVyICYmIHZpZXdQcm90by5jb250cm9sbGVyLmlzRGVzY3JpcHRvcikgeworICAgICAg
bm9Db250cm9sbGVySW5Qcm90byA9IHRydWU7CisgICAgfQorICAgIGlmIChub0NvbnRyb2xsZXJJ
blByb3RvICYmICF2aWV3UHJvdG8uY29udHJvbGxlckJpbmRpbmcgJiYgIXByb3BzLmNvbnRyb2xs
ZXIgJiYgIXByb3BzLmNvbnRyb2xsZXJCaW5kaW5nKSB7CisgICAgICBwcm9wcy5fY29udGV4dCA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwYXJlbnRWaWV3LCAnY29udGV4dCcpOyAvLyBU
T0RPOiBpcyB0aGlzIHJpZ2h0PyEKKyAgICB9CisKKyAgICBwcm9wcy5fbW9ycGggPSBtb3JwaDsK
KworICAgIHJldHVybiBwYXJlbnRWaWV3LmFwcGVuZENoaWxkKHZpZXdDbGFzc09ySW5zdGFuY2Us
IHByb3BzKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9ib290c3Ry
YXAnLCBbJ2V4cG9ydHMnLCAnZW1iZXItdmlld3MvY29tcG9uZW50X2xvb2t1cCcsICdlbWJlci12
aWV3cy9zeXN0ZW0vanF1ZXJ5JywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL2xhenlfbG9hZCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY29tcGls
ZScsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci1odG1sYmFycy90ZW1wbGF0ZV9y
ZWdpc3RyeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVmlld3NDb21wb25lbnRfbG9va3Vw
LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyUnVudGlt
ZVN5c3RlbUxhenlfbG9hZCwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGUsIF9l
bWJlck1ldGFsRW52aXJvbm1lbnQsIF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkpIHsK
KyAgLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
KgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKwor
ICAvKioKKyAgICBGaW5kIHRlbXBsYXRlcyBzdG9yZWQgaW4gdGhlIGhlYWQgdGFnIGFzIHNjcmlw
dCB0YWdzIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCisgICAgdG8gYEVtYmVyLkNvcmVWaWV3YCBp
biB0aGUgZ2xvYmFsIGBFbWJlci5URU1QTEFURVNgIG9iamVjdC4gVGhpcyB3aWxsIGJlIHJ1bgor
ICAgIGFzIGEgalF1ZXJ5IERPTS1yZWFkeSBjYWxsYmFjay4KKyAgCisgICAgU2NyaXB0IHRhZ3Mg
d2l0aCBgdGV4dC94LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKKyAgICB3aXRoIEVtYmVy
J3MgdGVtcGxhdGUgY29tcGlsZXIgYW5kIGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydz
IHRlbXBsYXRlLgorICAgIFRob3NlIHdpdGggdHlwZSBgdGV4dC94LXJhdy1oYW5kbGViYXJzYCB3
aWxsIGJlIGNvbXBpbGVkIHdpdGggcmVndWxhcgorICAgIEhhbmRsZWJhcnMgYW5kIGFyZSBzdWl0
YWJsZSBmb3IgdXNlIGluIHZpZXdzJyBjb21wdXRlZCBwcm9wZXJ0aWVzLgorICAKKyAgICBAcHJp
dmF0ZQorICAgIEBtZXRob2QgYm9vdHN0cmFwCisgICAgQGZvciBFbWJlci5IVE1MQmFycworICAg
IEBzdGF0aWMKKyAgICBAcGFyYW0gY3R4CisgICovCisgIGZ1bmN0aW9uIGJvb3RzdHJhcChjdHgp
IHsKKyAgICB2YXIgc2VsZWN0b3JzID0gJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyJd
LCBzY3JpcHRbdHlwZT0idGV4dC94LXJhdy1oYW5kbGViYXJzIl0nOworCisgICAgX2VtYmVyVmll
d3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWxlY3RvcnMsIGN0eCkuZWFjaChmdW5jdGlvbiAoKSB7
CisgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcuCisgICAgICB2YXIg
c2NyaXB0ID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh0aGlzKTsKKworICAgICAg
Ly8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQsIHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBs
YXRlTmFtZSBwcm9wZXJ0eS4KKyAgICAgIC8vIEZpcnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUt
bmFtZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNrIHRvIGl0cworICAgICAgLy8gaWQgaWYgbm8g
bmFtZSBpcyBmb3VuZC4KKyAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBzY3JpcHQuYXR0cignZGF0
YS10ZW1wbGF0ZS1uYW1lJykgfHwgc2NyaXB0LmF0dHIoJ2lkJykgfHwgJ2FwcGxpY2F0aW9uJzsK
KyAgICAgIHZhciB0ZW1wbGF0ZSwgY29tcGlsZTsKKworICAgICAgaWYgKHNjcmlwdC5hdHRyKCd0
eXBlJykgPT09ICd0ZXh0L3gtcmF3LWhhbmRsZWJhcnMnKSB7CisgICAgICAgIGNvbXBpbGUgPSBf
ZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LnByb3h5KEhhbmRsZWJhcnMuY29tcGlsZSwg
SGFuZGxlYmFycyk7CisgICAgICAgIHRlbXBsYXRlID0gY29tcGlsZShzY3JpcHQuaHRtbCgpKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxl
clN5c3RlbUNvbXBpbGUuZGVmYXVsdChzY3JpcHQuaHRtbCgpLCB7CisgICAgICAgICAgbW9kdWxl
TmFtZTogdGVtcGxhdGVOYW1lCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICAvLyBDaGVj
ayBpZiB0ZW1wbGF0ZSBvZiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCisgICAgICBpZiAoX2Vt
YmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeS5oYXModGVtcGxhdGVOYW1lKSkgeworICAgICAg
ICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdUZW1wbGF0ZSBuYW1lZCAiJyAr
IHRlbXBsYXRlTmFtZSArICciIGFscmVhZHkgZXhpc3RzLicpOworICAgICAgfQorCisgICAgICAv
LyBGb3IgdGVtcGxhdGVzIHdoaWNoIGhhdmUgYSBuYW1lLCB3ZSBzYXZlIHRoZW0gYW5kIHRoZW4g
cmVtb3ZlIHRoZW0gZnJvbSB0aGUgRE9NLgorICAgICAgX2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9y
ZWdpc3RyeS5zZXQodGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZSk7CisKKyAgICAgIC8vIFJlbW92ZSBz
Y3JpcHQgdGFnIGZyb20gRE9NLgorICAgICAgc2NyaXB0LnJlbW92ZSgpOworICAgIH0pOworICB9
CisKKyAgZnVuY3Rpb24gX2Jvb3RzdHJhcCgpIHsKKyAgICBib290c3RyYXAoX2VtYmVyVmlld3NT
eXN0ZW1KcXVlcnkuZGVmYXVsdChkb2N1bWVudCkpOworICB9CisKKyAgZnVuY3Rpb24gcmVnaXN0
ZXJDb21wb25lbnRMb29rdXAoYXBwKSB7CisgICAgYXBwLnJlZ2lzdGVyKCdjb21wb25lbnQtbG9v
a3VwOm1haW4nLCBfZW1iZXJWaWV3c0NvbXBvbmVudF9sb29rdXAuZGVmYXVsdCk7CisgIH0KKwor
ICAvKgorICAgIFdlIHRpZSB0aGlzIHRvIGFwcGxpY2F0aW9uLmxvYWQgdG8gZW5zdXJlIHRoYXQg
d2UndmUgYXQgbGVhc3QKKyAgICBhdHRlbXB0ZWQgdG8gYm9vdHN0cmFwIGF0IHRoZSBwb2ludCB0
aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBsb2FkZWQuCisgIAorICAgIFdlIGFsc28gdGllIHRoaXMg
dG8gZG9jdW1lbnQgcmVhZHkgc2luY2Ugd2UncmUgZ3VhcmFudGVlZCB0aGF0IGFsbAorICAgIHRo
ZSBpbmxpbmUgdGVtcGxhdGVzIGFyZSBwcmVzZW50IGF0IHRoaXMgcG9pbnQuCisgIAorICAgIFRo
ZXJlJ3Mgbm8gaGFybSB0byBydW5uaW5nIHRoaXMgdHdpY2UsIHNpbmNlIHdlIHJlbW92ZSB0aGUg
dGVtcGxhdGVzCisgICAgZnJvbSB0aGUgRE9NIGFmdGVyIHByb2Nlc3NpbmcuCisgICovCisKKyAg
X2VtYmVyUnVudGltZVN5c3RlbUxhenlfbG9hZC5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywg
ZnVuY3Rpb24gKEFwcGxpY2F0aW9uKSB7CisgICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewor
ICAgICAgbmFtZTogJ2RvbVRlbXBsYXRlcycsCisgICAgICBpbml0aWFsaXplOiBfZW1iZXJNZXRh
bEVudmlyb25tZW50LmRlZmF1bHQuaGFzRE9NID8gX2Jvb3RzdHJhcCA6IGZ1bmN0aW9uICgpIHt9
CisgICAgfSk7CisKKyAgICBBcHBsaWNhdGlvbi5pbnN0YW5jZUluaXRpYWxpemVyKHsKKyAgICAg
IG5hbWU6ICdyZWdpc3RlckNvbXBvbmVudExvb2t1cCcsCisgICAgICBpbml0aWFsaXplOiByZWdp
c3RlckNvbXBvbmVudExvb2t1cAorICAgIH0pOworICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBib290c3RyYXA7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxw
ZXInLCBbJ2V4cG9ydHMnLCAnZG9tLWhlbHBlcicsICdlbWJlci1odG1sYmFycy9tb3JwaHMvbW9y
cGgnLCAnZW1iZXItaHRtbGJhcnMvbW9ycGhzL2F0dHItbW9ycGgnXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9kb21IZWxwZXIsIF9lbWJlckh0bWxiYXJzTW9ycGhzTW9ycGgsIF9lbWJlckh0bWxiYXJz
TW9ycGhzQXR0ck1vcnBoKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBFbWJlckRP
TUhlbHBlcihfZG9jdW1lbnQpIHsKKyAgICBfZG9tSGVscGVyLmRlZmF1bHQuY2FsbCh0aGlzLCBf
ZG9jdW1lbnQpOworICB9CisKKyAgdmFyIHByb3RvID0gRW1iZXJET01IZWxwZXIucHJvdG90eXBl
ID0gT2JqZWN0LmNyZWF0ZShfZG9tSGVscGVyLmRlZmF1bHQucHJvdG90eXBlKTsKKyAgcHJvdG8u
TW9ycGhDbGFzcyA9IF9lbWJlckh0bWxiYXJzTW9ycGhzTW9ycGguZGVmYXVsdDsKKyAgcHJvdG8u
QXR0ck1vcnBoQ2xhc3MgPSBfZW1iZXJIdG1sYmFyc01vcnBoc0F0dHJNb3JwaC5kZWZhdWx0Owor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IEVtYmVyRE9NSGVscGVyOworfSk7CitlbmlmZWQoJ2VtYmVy
LWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVtZW50YXRpb24tc3VwcG9ydCcsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9pbnN0cnVtZW50YXRpb24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsSW5zdHJ1bWVudGF0aW9uKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmluc3Ry
dW1lbnQgPSBpbnN0cnVtZW50OworCisgIC8qKgorICAgIFByb3ZpZGVzIGluc3RydW1lbnRhdGlv
biBmb3Igbm9kZSBtYW5hZ2Vycy4KKyAgCisgICAgV3JhcCB5b3VyIG5vZGUgbWFuYWdlcidzIHJl
bmRlciBhbmQgcmUtcmVuZGVyIG1ldGhvZHMKKyAgICB3aXRoIHRoaXMgZnVuY3Rpb24uCisgIAor
ICAgIEBwYXJhbSB7T2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IG9yIFZpZXcgaW5zdGFuY2Ug
KG9wdGlvbmFsKS4KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24g
dG8gaW5zdHJ1bWVudC4KKyAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgY29udGV4dCB0
byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLgorICAgIEByZXR1cm4ge09iamVjdH0gUmV0dXJuIHZh
bHVlIGZyb20gdGhlIGludm9rZWQgY2FsbGJhY2suCisgICAgQHByaXZhdGUKKyAgKi8KKworICBm
dW5jdGlvbiBpbnN0cnVtZW50KGNvbXBvbmVudCwgY2FsbGJhY2ssIGNvbnRleHQpIHsKKyAgICB2
YXIgaW5zdHJ1bWVudE5hbWUsIHZhbCwgZGV0YWlscywgZW5kOworICAgIC8vIE9ubHkgaW5zdHJ1
bWVudCBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBzdWJzY3JpYmVyLgorICAgIGlmIChfZW1iZXJN
ZXRhbEluc3RydW1lbnRhdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHsKKyAgICAgIGlmIChjb21w
b25lbnQpIHsKKyAgICAgICAgaW5zdHJ1bWVudE5hbWUgPSBjb21wb25lbnQuaW5zdHJ1bWVudE5h
bWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnN0cnVtZW50TmFtZSA9ICdub2RlJzsKKyAg
ICAgIH0KKyAgICAgIGRldGFpbHMgPSB7fTsKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAgICAg
ICAgY29tcG9uZW50Lmluc3RydW1lbnREZXRhaWxzKGRldGFpbHMpOworICAgICAgfQorICAgICAg
ZW5kID0gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uX2luc3RydW1lbnRTdGFydCgncmVuZGVy
LicgKyBpbnN0cnVtZW50TmFtZSwgZnVuY3Rpb24gdmlld0luc3RydW1lbnREZXRhaWxzKCkgewor
ICAgICAgICByZXR1cm4gZGV0YWlsczsKKyAgICAgIH0pOworICAgICAgdmFsID0gY2FsbGJhY2su
Y2FsbChjb250ZXh0KTsKKyAgICAgIGlmIChlbmQpIHsKKyAgICAgICAgZW5kKCk7CisgICAgICB9
CisgICAgICByZXR1cm4gdmFsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FsbGJhY2su
Y2FsbChjb250ZXh0KTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9z
eXN0ZW0vaW52b2tlLWhlbHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1odG1sYmFycy9zdHJlYW1zL2hlbHBlci1pbnN0YW5jZScsICdlbWJlci1odG1sYmFycy9z
dHJlYW1zL2hlbHBlci1mYWN0b3J5JywgJ2VtYmVyLWh0bWxiYXJzL3N0cmVhbXMvYnVpbHQtaW4t
aGVscGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJIdG1s
YmFyc1N0cmVhbXNIZWxwZXJJbnN0YW5jZSwgX2VtYmVySHRtbGJhcnNTdHJlYW1zSGVscGVyRmFj
dG9yeSwgX2VtYmVySHRtbGJhcnNTdHJlYW1zQnVpbHRJbkhlbHBlcikgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5idWlsZEhlbHBlclN0cmVhbSA9IGJ1aWxkSGVscGVyU3RyZWFtOwor
CisgIGZ1bmN0aW9uIGJ1aWxkSGVscGVyU3RyZWFtKGhlbHBlciwgcGFyYW1zLCBoYXNoLCB0ZW1w
bGF0ZXMsIGVudiwgc2NvcGUsIGxhYmVsKSB7CisgICAgdmFyIGlzQW55S2luZE9mSGVscGVyID0g
aGVscGVyLmlzSGVscGVySW5zdGFuY2UgfHwgaGVscGVyLmlzSGVscGVyRmFjdG9yeTsKKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnSGVscGVycyBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIGJs
b2NrIGZvcm0sIGZvciBleGFtcGxlIHt7I215LWhlbHBlcn19e3svbXktaGVscGVyfX0uIFBsZWFz
ZSB1c2UgYSBjb21wb25lbnQsIG9yIGFsdGVybmF0aXZlbHkgdXNlIHRoZSBoZWxwZXIgaW4gY29t
YmluYXRpb24gd2l0aCBhIGJ1aWx0LWluIEVtYmVyIGhlbHBlciwgZm9yIGV4YW1wbGUge3sjaWYg
KG15LWhlbHBlcil9fXt7L2lmfX0uJywgIShpc0FueUtpbmRPZkhlbHBlciAmJiB0ZW1wbGF0ZXMg
JiYgdGVtcGxhdGVzLnRlbXBsYXRlICYmIHRlbXBsYXRlcy50ZW1wbGF0ZS5tZXRhKSk7CisgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0hlbHBlcnMgbWF5IG5vdCBiZSB1c2VkIGluIHRoZSBl
bGVtZW50IGZvcm0sIGZvciBleGFtcGxlIDxkaXYge3tteS1oZWxwZXJ9fT4uJywgIShpc0FueUtp
bmRPZkhlbHBlciAmJiB0ZW1wbGF0ZXMgJiYgdGVtcGxhdGVzLmVsZW1lbnQpKTsKKyAgICBpZiAo
aGVscGVyLmlzSGVscGVyRmFjdG9yeSkgeworICAgICAgcmV0dXJuIG5ldyBfZW1iZXJIdG1sYmFy
c1N0cmVhbXNIZWxwZXJGYWN0b3J5LmRlZmF1bHQoaGVscGVyLCBwYXJhbXMsIGhhc2gsIGxhYmVs
KTsKKyAgICB9IGVsc2UgaWYgKGhlbHBlci5pc0hlbHBlckluc3RhbmNlKSB7CisgICAgICByZXR1
cm4gbmV3IF9lbWJlckh0bWxiYXJzU3RyZWFtc0hlbHBlckluc3RhbmNlLmRlZmF1bHQoaGVscGVy
LCBwYXJhbXMsIGhhc2gsIGxhYmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcGxhdGVzID0g
dGVtcGxhdGVzIHx8IHsgdGVtcGxhdGU6IHt9LCBpbnZlcnNlOiB7fSB9OworICAgICAgcmV0dXJu
IG5ldyBfZW1iZXJIdG1sYmFyc1N0cmVhbXNCdWlsdEluSGVscGVyLmRlZmF1bHQoaGVscGVyLCBw
YXJhbXMsIGhhc2gsIHRlbXBsYXRlcywgZW52LCBzY29wZSwgbGFiZWwpOworICAgIH0KKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL2NhY2hlJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbENhY2hlKSB7CisgIC8qKgor
ICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy52YWxpZGF0ZUxhenlIZWxwZXJOYW1lID0gdmFsaWRh
dGVMYXp5SGVscGVyTmFtZTsKKyAgZXhwb3J0cy5maW5kSGVscGVyID0gZmluZEhlbHBlcjsKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gbG9va3VwSGVscGVyOworICB2YXIgQ09OVEFJTlNfREFTSF9DQUNI
RSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkgewor
ICAgIHJldHVybiBrZXkuaW5kZXhPZignLScpICE9PSAtMTsKKyAgfSk7CisKKyAgZXhwb3J0cy5D
T05UQUlOU19EQVNIX0NBQ0hFID0gQ09OVEFJTlNfREFTSF9DQUNIRTsKKyAgdmFyIENPTlRBSU5T
X0RPVF9DQUNIRSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24g
KGtleSkgeworICAgIHJldHVybiBrZXkuaW5kZXhPZignLicpICE9PSAtMTsKKyAgfSk7CisKKyAg
ZXhwb3J0cy5DT05UQUlOU19ET1RfQ0FDSEUgPSBDT05UQUlOU19ET1RfQ0FDSEU7CisKKyAgZnVu
Y3Rpb24gdmFsaWRhdGVMYXp5SGVscGVyTmFtZShoZWxwZXJOYW1lLCBjb250YWluZXIsIGtleXdv
cmRzKSB7CisgICAgcmV0dXJuIGNvbnRhaW5lciAmJiAhKGhlbHBlck5hbWUgaW4ga2V5d29yZHMp
OworICB9CisKKyAgLyoqCisgICAgVXNlZCB0byBsb29rdXAvcmVzb2x2ZSBoYW5kbGViYXJzIGhl
bHBlcnMuIFRoZSBsb29rdXAgb3JkZXIgaXM6CisgIAorICAgICogTG9vayBmb3IgYSByZWdpc3Rl
cmVkIGhlbHBlcgorICAgICogSWYgYSBkYXNoIGV4aXN0cyBpbiB0aGUgbmFtZToKKyAgICAgICog
TG9vayBmb3IgYSBoZWxwZXIgcmVnaXN0ZWQgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgICogVXNl
IEVtYmVyLkNvbXBvbmVudExvb2t1cCB0byBmaW5kIGFuIEVtYmVyLkNvbXBvbmVudCB0aGF0IHJl
c29sdmVzCisgICAgICAgIHRvIHRoZSBnaXZlbiBuYW1lLgorICAKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgcmVzb2x2ZUhlbHBlcgorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1l
IG9mIHRoZSBoZWxwZXIgdG8gbG9va3VwLgorICAgIEByZXR1cm4ge0hlbHBlcn0KKyAgKi8KKyAg
ZnVuY3Rpb24gX2ZpbmRIZWxwZXIobmFtZSwgdmlldywgZW52LCBvcHRpb25zKSB7CisgICAgdmFy
IGhlbHBlciA9IGVudi5oZWxwZXJzW25hbWVdOworCisgICAgaWYgKCFoZWxwZXIpIHsKKyAgICAg
IHZhciBvd25lciA9IGVudi5vd25lcjsKKyAgICAgIGlmICh2YWxpZGF0ZUxhenlIZWxwZXJOYW1l
KG5hbWUsIG93bmVyLCBlbnYuaG9va3Mua2V5d29yZHMpKSB7CisgICAgICAgIHZhciBoZWxwZXJO
YW1lID0gJ2hlbHBlcjonICsgbmFtZTsKKyAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNv
bS9lbWJlcmpzL2VtYmVyLmpzL2lzc3Vlcy8xMzA3MQorICAgICAgICAvLyBTZWUgaHR0cHM6Ly9i
dWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDgzOQorICAgICAgICB2YXIg
cmVnaXN0ZXJlZCA9IG93bmVyLmhhc1JlZ2lzdHJhdGlvbihoZWxwZXJOYW1lLCBvcHRpb25zKTsK
KyAgICAgICAgaWYgKHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICBoZWxwZXIgPSBvd25lci5fbG9v
a3VwRmFjdG9yeShoZWxwZXJOYW1lLCBvcHRpb25zKTsKKyAgICAgICAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnRXhwZWN0ZWQgdG8gZmluZCBhbiBFbWJlci5IZWxwZXIgd2l0aCB0aGUgbmFt
ZSAnICsgaGVscGVyTmFtZSArICcsIGJ1dCBmb3VuZCBhbiBvYmplY3Qgb2YgdHlwZSAnICsgdHlw
ZW9mIGhlbHBlciArICcgaW5zdGVhZC4nLCBoZWxwZXIuaXNIZWxwZXJGYWN0b3J5IHx8IGhlbHBl
ci5pc0hlbHBlckluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBoZWxwZXI7CisgIH0KKworICBmdW5jdGlvbiBmaW5kSGVscGVyKG5hbWUsIHZpZXcsIGVu
dikgeworICAgIHZhciBvcHRpb25zID0ge307CisgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0
YSAmJiBlbnYubWV0YS5tb2R1bGVOYW1lOworICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAgICBv
cHRpb25zLnNvdXJjZSA9ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZTsKKyAgICB9CisKKyAgICB2
YXIgbG9jYWxIZWxwZXIgPSBfZmluZEhlbHBlcihuYW1lLCB2aWV3LCBlbnYsIG9wdGlvbnMpOwor
CisgICAgLy8gTG9jYWwgbWF0Y2ggZm91bmQsIHVzZSBpdC4KKyAgICBpZiAobG9jYWxIZWxwZXIp
IHsKKyAgICAgIHJldHVybiBsb2NhbEhlbHBlcjsKKyAgICB9CisKKyAgICAvLyBGYWxsIGJhY2sg
dG8gZ2xvYmFsLgorICAgIHJldHVybiBfZmluZEhlbHBlcihuYW1lLCB2aWV3LCBlbnYpOworICB9
CisKKyAgZnVuY3Rpb24gbG9va3VwSGVscGVyKG5hbWUsIHZpZXcsIGVudikgeworICAgIHZhciBo
ZWxwZXIgPSBmaW5kSGVscGVyKG5hbWUsIHZpZXcsIGVudik7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnQSBoZWxwZXIgbmFtZWQgXCcnICsgbmFtZSArICdcJyBjb3VsZCBub3QgYmUg
Zm91bmQnLCAhIWhlbHBlcik7CisKKyAgICByZXR1cm4gaGVscGVyOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL21ha2VfYm91bmRfaGVscGVyJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBlciddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVySHRtbGJhcnNIZWxwZXIpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbWFrZUJvdW5kSGVscGVyOworCisg
IC8qKgorICAgIENyZWF0ZSBhIGJvdW5kIGhlbHBlci4gQWNjZXB0cyBhIGZ1bmN0aW9uIHRoYXQg
cmVjZWl2ZXMgdGhlIG9yZGVyZWQgYW5kIGhhc2ggcGFyYW1ldGVycworICAgIGZyb20gdGhlIHRl
bXBsYXRlLiBJZiBhIGJvdW5kIHByb3BlcnR5IHdhcyBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUs
IGl0IHdpbGwgYmUgcmVzb2x2ZWQgdG8gaXRzCisgICAgdmFsdWUgYW5kIGFueSBjaGFuZ2VzIHRv
IHRoZSBib3VuZCBwcm9wZXJ0eSBjYXVzZSB0aGUgaGVscGVyIGZ1bmN0aW9uIHRvIGJlIHJlLXJ1
biB3aXRoIHRoZSB1cGRhdGVkCisgICAgdmFsdWVzLgorICAKKyAgICAqIGBwYXJhbXNgIC0gQW4g
YXJyYXkgb2YgcmVzb2x2ZWQgb3JkZXJlZCBwYXJhbWV0ZXJzLgorICAgICogYGhhc2hgIC0gQW4g
b2JqZWN0IGNvbnRhaW5pbmcgdGhlIGhhc2ggcGFyYW1ldGVycy4KKyAgCisgICAgRm9yIGV4YW1w
bGU6CisgIAorICAgICogV2l0aCBhbiB1bnF1b3RlZCBvcmRlcmVkIHBhcmFtZXRlcjoKKyAgCisg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB7e3gtY2FwaXRhbGl6ZSBmb299fQorICAgICAgYGBg
CisgIAorICAgICAgQXNzdW1pbmcgYGZvb2Agd2FzIHNldCB0byBgImJhciJgLCB0aGUgYm91bmQg
aGVscGVyIHdvdWxkIHJlY2VpdmUgYFsiYmFyIl1gIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgYW5k
CisgICAgICBhbiBlbXB0eSBoYXNoIGFzIGl0cyBzZWNvbmQuCisgIAorICAgICogV2l0aCBhIHF1
b3RlZCBvcmRlcmVkIHBhcmFtZXRlcjoKKyAgCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB7
e3gtY2FwaXRhbGl6ZSAiZm9vIn19CisgICAgICBgYGAKKyAgCisgICAgICBUaGUgYm91bmQgaGVs
cGVyIHdvdWxkIHJlY2VpdmUgYFsiZm9vIl1gIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgYW5kIGFu
IGVtcHR5IGhhc2ggYXMgaXRzIHNlY29uZC4KKyAgCisgICAgKiBXaXRoIGFuIHVucXVvdGVkIGhh
c2ggcGFyYW1ldGVyOgorICAKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHt7eC1yZXBlYXQg
ImZvbyIgY291bnQ9cmVwZWF0Q291bnR9fQorICAgICAgYGBgCisgIAorICAgICAgQXNzdW1pbmcg
dGhhdCBgcmVwZWF0Q291bnRgIHJlc29sdmVkIHRvIDIsIHRoZSBib3VuZCBoZWxwZXIgd291bGQg
cmVjZWl2ZSBgWyJmb28iXWAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LAorICAgICAgYW5kIHsgY291
bnQ6IDIgfSBhcyBpdHMgc2Vjb25kLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgbWFr
ZUJvdW5kSGVscGVyCisgICAgQGZvciBFbWJlci5IVE1MQmFycworICAgIEBwYXJhbSB7RnVuY3Rp
b259IGZuCisgICAgQHNpbmNlIDEuMTAuMAorICAqLworCisgIGZ1bmN0aW9uIG1ha2VCb3VuZEhl
bHBlcihmbikgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyBgRW1iZXIu
SFRNTEJhcnMubWFrZUJvdW5kSGVscGVyYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcmVmYWN0b3Ig
dG8gdXNlIGBFbWJlci5IZWxwZXJgIG9yIGBFbWJlci5IZWxwZXIuaGVscGVyYC4nLCBmYWxzZSwg
eyBpZDogJ2VtYmVyLWh0bWxiYXJzLm1ha2UtYm91bmQtaGVscGVyJywgdW50aWw6ICczLjAuMCcg
fSk7CisgICAgcmV0dXJuIF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBlcihmbik7CisgIH0KK30p
OworZW5pZmVkKCdlbWJlci1odG1sYmFycy9zeXN0ZW0vcmVuZGVyLWVudicsIFsnZXhwb3J0cycs
ICdlbWJlci1odG1sYmFycy9lbnYnLCAnZW1iZXItbWV0YWwtdmlld3MnLCAnY29udGFpbmVyL293
bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc0VudiwgX2VtYmVyTWV0YWxW
aWV3cywgX2NvbnRhaW5lck93bmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBSZW5kZXJFbnY7CisKKyAgZnVuY3Rpb24gUmVuZGVyRW52KG9wdGlvbnMpIHsKKyAg
ICB0aGlzLmxpZmVjeWNsZUhvb2tzID0gb3B0aW9ucy5saWZlY3ljbGVIb29rcyB8fCBbXTsKKyAg
ICB0aGlzLnJlbmRlcmVkVmlld3MgPSBvcHRpb25zLnJlbmRlcmVkVmlld3MgfHwgW107CisgICAg
dGhpcy5yZW5kZXJlZE5vZGVzID0gb3B0aW9ucy5yZW5kZXJlZE5vZGVzIHx8IG5ldyBfZW1iZXJN
ZXRhbFZpZXdzLk1vcnBoU2V0KCk7CisgICAgdGhpcy5oYXNQYXJlbnRPdXRsZXQgPSBvcHRpb25z
Lmhhc1BhcmVudE91dGxldCB8fCBmYWxzZTsKKworICAgIHRoaXMudmlldyA9IG9wdGlvbnMudmll
dzsKKyAgICB0aGlzLm91dGxldFN0YXRlID0gb3B0aW9ucy5vdXRsZXRTdGF0ZTsKKyAgICB0aGlz
Lm93bmVyID0gb3B0aW9ucy5vd25lcjsKKyAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucy5yZW5k
ZXJlcjsKKyAgICB0aGlzLmRvbSA9IG9wdGlvbnMuZG9tOworICAgIHRoaXMubWV0YSA9IG9wdGlv
bnMubWV0YTsKKworICAgIHRoaXMuaG9va3MgPSBfZW1iZXJIdG1sYmFyc0Vudi5kZWZhdWx0Lmhv
b2tzOworICAgIHRoaXMuaGVscGVycyA9IF9lbWJlckh0bWxiYXJzRW52LmRlZmF1bHQuaGVscGVy
czsKKyAgICB0aGlzLnVzZUZyYWdtZW50Q2FjaGUgPSBfZW1iZXJIdG1sYmFyc0Vudi5kZWZhdWx0
LnVzZUZyYWdtZW50Q2FjaGU7CisgICAgdGhpcy5kZXN0aW5lZEZvckRPTSA9IHRoaXMucmVuZGVy
ZXIuX2Rlc3RpbmVkRm9yRE9NOworICB9CisKKyAgUmVuZGVyRW52LmJ1aWxkID0gZnVuY3Rpb24g
KHZpZXcsIG1ldGEpIHsKKyAgICByZXR1cm4gbmV3IFJlbmRlckVudih7CisgICAgICB2aWV3OiB2
aWV3LAorICAgICAgb3V0bGV0U3RhdGU6IHZpZXcub3V0bGV0U3RhdGUsCisgICAgICBvd25lcjog
X2NvbnRhaW5lck93bmVyLmdldE93bmVyKHZpZXcpLAorICAgICAgcmVuZGVyZXI6IHZpZXcucmVu
ZGVyZXIsCisgICAgICBkb206IHZpZXcucmVuZGVyZXIuX2RvbSwKKyAgICAgIG1ldGE6IG1ldGEK
KyAgICB9KTsKKyAgfTsKKworICBSZW5kZXJFbnYucHJvdG90eXBlLmNoaWxkV2l0aE1ldGEgPSBm
dW5jdGlvbiAobWV0YSkgeworICAgIHJldHVybiBuZXcgUmVuZGVyRW52KHsKKyAgICAgIHZpZXc6
IHRoaXMudmlldywKKyAgICAgIG91dGxldFN0YXRlOiB0aGlzLm91dGxldFN0YXRlLAorICAgICAg
b3duZXI6IHRoaXMub3duZXIsCisgICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlciwKKyAgICAg
IGRvbTogdGhpcy5kb20sCisgICAgICBsaWZlY3ljbGVIb29rczogdGhpcy5saWZlY3ljbGVIb29r
cywKKyAgICAgIHJlbmRlcmVkVmlld3M6IHRoaXMucmVuZGVyZWRWaWV3cywKKyAgICAgIHJlbmRl
cmVkTm9kZXM6IHRoaXMucmVuZGVyZWROb2RlcywKKyAgICAgIGhhc1BhcmVudE91dGxldDogdGhp
cy5oYXNQYXJlbnRPdXRsZXQsCisgICAgICBtZXRhOiBtZXRhCisgICAgfSk7CisgIH07CisKKyAg
UmVuZGVyRW52LnByb3RvdHlwZS5jaGlsZFdpdGhWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAg
ICB2YXIgbWV0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVu
ZGVmaW5lZCA/IHRoaXMubWV0YSA6IGFyZ3VtZW50c1sxXTsKKworICAgIHJldHVybiBuZXcgUmVu
ZGVyRW52KHsKKyAgICAgIHZpZXc6IHZpZXcsCisgICAgICBvdXRsZXRTdGF0ZTogdGhpcy5vdXRs
ZXRTdGF0ZSwKKyAgICAgIG93bmVyOiB0aGlzLm93bmVyLAorICAgICAgcmVuZGVyZXI6IHRoaXMu
cmVuZGVyZXIsCisgICAgICBkb206IHRoaXMuZG9tLAorICAgICAgbGlmZWN5Y2xlSG9va3M6IHRo
aXMubGlmZWN5Y2xlSG9va3MsCisgICAgICByZW5kZXJlZFZpZXdzOiB0aGlzLnJlbmRlcmVkVmll
d3MsCisgICAgICByZW5kZXJlZE5vZGVzOiB0aGlzLnJlbmRlcmVkTm9kZXMsCisgICAgICBoYXNQ
YXJlbnRPdXRsZXQ6IHRoaXMuaGFzUGFyZW50T3V0bGV0LAorICAgICAgbWV0YTogbWV0YQorICAg
IH0pOworICB9OworCisgIFJlbmRlckVudi5wcm90b3R5cGUuY2hpbGRXaXRoT3V0bGV0U3RhdGUg
PSBmdW5jdGlvbiAob3V0bGV0U3RhdGUpIHsKKyAgICB2YXIgaGFzUGFyZW50T3V0bGV0ID0gYXJn
dW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5o
YXNQYXJlbnRPdXRsZXQgOiBhcmd1bWVudHNbMV07CisgICAgdmFyIG1ldGEgPSBhcmd1bWVudHMu
bGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB0aGlzLm1ldGEgOiBh
cmd1bWVudHNbMl07CisKKyAgICByZXR1cm4gbmV3IFJlbmRlckVudih7CisgICAgICB2aWV3OiB0
aGlzLnZpZXcsCisgICAgICBvdXRsZXRTdGF0ZTogb3V0bGV0U3RhdGUsCisgICAgICBvd25lcjog
dGhpcy5vd25lciwKKyAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLAorICAgICAgZG9tOiB0
aGlzLmRvbSwKKyAgICAgIGxpZmVjeWNsZUhvb2tzOiB0aGlzLmxpZmVjeWNsZUhvb2tzLAorICAg
ICAgcmVuZGVyZWRWaWV3czogdGhpcy5yZW5kZXJlZFZpZXdzLAorICAgICAgcmVuZGVyZWROb2Rl
czogdGhpcy5yZW5kZXJlZE5vZGVzLAorICAgICAgaGFzUGFyZW50T3V0bGV0OiBoYXNQYXJlbnRP
dXRsZXQsCisgICAgICBtZXRhOiBtZXRhCisgICAgfSk7CisgIH07Cit9KTsKK2VuaWZlZCgnZW1i
ZXItaHRtbGJhcnMvc3lzdGVtL3JlbmRlci12aWV3JywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2RlLW1hbmFnZXInLCAnZW1iZXItaHRtbGJhcnMvc3lz
dGVtL3JlbmRlci1lbnYnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJzTm9kZU1h
bmFnZXJzVmlld05vZGVNYW5hZ2VyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbVJlbmRlckVudikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5yZW5kZXJIVE1MQmFyc0Jsb2NrID0gcmVuZGVy
SFRNTEJhcnNCbG9jazsKKworICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgb25j
ZSBwZXIgcmVuZGVyIG9mIGEgInJvb3QgdmlldyIgKGBhcHBlbmRUb2ApLiBPdGhlcndpc2UsCisg
IC8vIEhUTUxCYXJzIHByb3BhZ2F0ZXMgdGhlIGV4aXN0aW5nIGVudiBhbmQgcmVuZGVycyB0ZW1w
bGF0ZXMgZm9yIGEgZ2l2ZW4gcmVuZGVyIG5vZGUuCisKKyAgZnVuY3Rpb24gcmVuZGVySFRNTEJh
cnNCbG9jayh2aWV3LCBibG9jaywgcmVuZGVyTm9kZSkgeworICAgIHZhciBtZXRhID0gYmxvY2sg
JiYgYmxvY2sudGVtcGxhdGUgJiYgYmxvY2sudGVtcGxhdGUubWV0YTsKKyAgICB2YXIgZW52ID0g
X2VtYmVySHRtbGJhcnNTeXN0ZW1SZW5kZXJFbnYuZGVmYXVsdC5idWlsZCh2aWV3LCBtZXRhKTsK
KworICAgIHZpZXcuZW52ID0gZW52OworICAgIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzVmll
d05vZGVNYW5hZ2VyLmNyZWF0ZU9yVXBkYXRlQ29tcG9uZW50KHZpZXcsIHt9LCBudWxsLCByZW5k
ZXJOb2RlLCBlbnYpOworICAgIHZhciBub2RlTWFuYWdlciA9IG5ldyBfZW1iZXJIdG1sYmFyc05v
ZGVNYW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlci5kZWZhdWx0KHZpZXcsIG51bGwsIHJlbmRlck5vZGUs
IGJsb2NrLCB2aWV3LnRhZ05hbWUgIT09ICcnKTsKKworICAgIG5vZGVNYW5hZ2VyLnJlbmRlcihl
bnYsIHt9KTsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlX3JlZ2lz
dHJ5IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8vIFNUQVRFIHdpdGhp
biBhIG1vZHVsZSBpcyBmcm93bmVkIGFwb24sIHRoaXMgZXhpc3RzCisgIC8vIHRvIHN1cHBvcnQg
RW1iZXIuVEVNUExBVEVTIGJ1dCBzaGllbGQgZW1iZXIgaW50ZXJuYWxzIGZyb20gdGhpcyBsZWdh
Y3kKKyAgLy8gZ2xvYmFsIEFQSS4KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuc2V0VGVt
cGxhdGVzID0gc2V0VGVtcGxhdGVzOworICBleHBvcnRzLmdldFRlbXBsYXRlcyA9IGdldFRlbXBs
YXRlczsKKyAgZXhwb3J0cy5nZXQgPSBnZXQ7CisgIGV4cG9ydHMuaGFzID0gaGFzOworICBleHBv
cnRzLnNldCA9IHNldDsKKyAgdmFyIFRFTVBMQVRFUyA9IHt9OworCisgIGZ1bmN0aW9uIHNldFRl
bXBsYXRlcyh0ZW1wbGF0ZXMpIHsKKyAgICBURU1QTEFURVMgPSB0ZW1wbGF0ZXM7CisgIH0KKwor
ICBmdW5jdGlvbiBnZXRUZW1wbGF0ZXMoKSB7CisgICAgcmV0dXJuIFRFTVBMQVRFUzsKKyAgfQor
CisgIGZ1bmN0aW9uIGdldChuYW1lKSB7CisgICAgaWYgKFRFTVBMQVRFUy5oYXNPd25Qcm9wZXJ0
eShuYW1lKSkgeworICAgICAgcmV0dXJuIFRFTVBMQVRFU1tuYW1lXTsKKyAgICB9CisgIH0KKwor
ICBmdW5jdGlvbiBoYXMobmFtZSkgeworICAgIHJldHVybiBURU1QTEFURVMuaGFzT3duUHJvcGVy
dHkobmFtZSk7CisgIH0KKworICBmdW5jdGlvbiBzZXQobmFtZSwgdGVtcGxhdGUpIHsKKyAgICBy
ZXR1cm4gVEVNUExBVEVTW25hbWVdID0gdGVtcGxhdGU7CisgIH0KK30pOworZW5pZmVkKCJlbWJl
ci1odG1sYmFycy90ZW1wbGF0ZXMvY29tcG9uZW50IiwgWyJleHBvcnRzIiwgImVtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
VGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBsYXRlKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUuZGVm
YXVsdCgoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICBtZXRhOiB7fSwKKyAgICAg
IGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDog
bnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRl
RG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQo
IiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgfSwKKyAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVu
ZGVyTm9kZXMoZG9tLCBmcmFnbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFy
IG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1v
cnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmlu
c2VydEJvdW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZy
YWdtZW50LCBudWxsKTsKKyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBz
dGF0ZW1lbnRzOiBbWyJjb250ZW50IiwgInlpZWxkIiwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBb
MSwgOV1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9
OworICB9KSgpKTsKK30pOworZW5pZmVkKCJlbWJlci1odG1sYmFycy90ZW1wbGF0ZXMvZW1wdHki
LCBbImV4cG9ydHMiLCAiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL3RlbXBsYXRlIl0s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUp
IHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclRlbXBsYXRl
Q29tcGlsZXJTeXN0ZW1UZW1wbGF0ZS5kZWZhdWx0KChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJu
IHsKKyAgICAgIG1ldGE6IHt9LAorICAgICAgaXNFbXB0eTogdHJ1ZSwKKyAgICAgIGFyaXR5OiAw
LAorICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2Us
CisgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAg
ICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgcmV0
dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWls
ZFJlbmRlck5vZGVzKCkgeworICAgICAgICByZXR1cm4gW107CisgICAgICB9LAorICAgICAgc3Rh
dGVtZW50czogW10sCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXQorICAg
IH07CisgIH0pKCkpOworfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlcy9saW5r
LXRvIiwgWyJleHBvcnRzIiwgImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0
ZSJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBs
YXRlKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZW1w
bGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUuZGVmYXVsdCgoZnVuY3Rpb24gKCkgeworICAgIHZh
ciBjaGlsZDAgPSAoZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbWV0YTog
e30sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICBhcml0eTogMCwKKyAgICAgICAg
Y2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAg
ICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAg
ICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVp
bGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBj
b250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7
CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAs
IGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21l
bnQsIDApOworICAgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFyeShmcmFnbWVudCwgbnVsbCk7Cisg
ICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwKKyAgICAgICAgc3RhdGVtZW50czog
W1siY29udGVudCIsICJsaW5rVGl0bGUiLCBbImxvYyIsIFtudWxsLCBbMSwgMTddLCBbMSwgMzBd
XV1dXSwKKyAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAg
fTsKKyAgICB9KSgpOworICAgIHZhciBjaGlsZDEgPSAoZnVuY3Rpb24gKCkgeworICAgICAgcmV0
dXJuIHsKKyAgICAgICAgbWV0YToge30sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAg
ICBhcml0eTogMCwKKyAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1Jl
bmRlcmVkOiBmYWxzZSwKKyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFn
bWVudChkb20pIHsKKyAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21l
bnQoKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAg
ICAgICAgfSwKKyAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJO
b2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBt
b3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1v
cnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBkb20u
aW5zZXJ0Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFy
eShmcmFnbWVudCwgbnVsbCk7CisgICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwK
KyAgICAgICAgc3RhdGVtZW50czogW1siY29udGVudCIsICJ5aWVsZCIsIFsibG9jIiwgW251bGws
IFsxLCAzOF0sIFsxLCA0N11dXV1dLAorICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICB0ZW1w
bGF0ZXM6IFtdCisgICAgICB9OworICAgIH0pKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6
IHt9LAorICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwKKyAgICAgIGNhY2hl
ZEZyYWdtZW50OiBudWxsLAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgYnVpbGRG
cmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgdmFyIGVsMCA9
IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3Jl
YXRlQ29tbWVudCgiIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAg
ICAgIHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rp
b24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgICAgICB2YXIgbW9ycGhzID0gbmV3IEFycmF5KDEpOworICAgICAgICBtb3JwaHNbMF0gPSBk
b20uY3JlYXRlTW9ycGhBdChmcmFnbWVudCwgMCwgMCwgY29udGV4dHVhbEVsZW1lbnQpOworICAg
ICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICBkb20uaW5zZXJ0
Qm91bmRhcnkoZnJhZ21lbnQsIG51bGwpOworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAg
fSwKKyAgICAgIHN0YXRlbWVudHM6IFtbImJsb2NrIiwgImlmIiwgW1siZ2V0IiwgImxpbmtUaXRs
ZSIsIFsibG9jIiwgW251bGwsIFsxLCA2XSwgWzEsIDE1XV1dXV0sIFtdLCAwLCAxLCBbImxvYyIs
IFtudWxsLCBbMSwgMF0sIFsxLCA1NF1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRl
bXBsYXRlczogW2NoaWxkMCwgY2hpbGQxXQorICAgIH07CisgIH0pKCkpOworfSk7CitlbmlmZWQo
ImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlcy90b3AtbGV2ZWwtdmlldyIsIFsiZXhwb3J0cyIsICJl
bWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vdGVtcGxhdGUiXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSkgeworICAidXNlIHN0cmlj
dCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRl
bXBsYXRlLmRlZmF1bHQoKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4geworICAgICAgbWV0YTog
e30sCisgICAgICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVk
RnJhZ21lbnQ6IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZy
YWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0g
ZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVh
dGVDb21tZW50KCIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAg
ICAgcmV0dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlv
biBidWlsZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7Cisg
ICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgIG1vcnBoc1swXSA9IGRv
bS5jcmVhdGVNb3JwaEF0KGZyYWdtZW50LCAwLCAwLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAg
ICAgIGRvbS5pbnNlcnRCb3VuZGFyeShmcmFnbWVudCwgMCk7CisgICAgICAgIGRvbS5pbnNlcnRC
b3VuZGFyeShmcmFnbWVudCwgbnVsbCk7CisgICAgICAgIHJldHVybiBtb3JwaHM7CisgICAgICB9
LAorICAgICAgc3RhdGVtZW50czogW1siY29udGVudCIsICJvdXRsZXQiLCBbImxvYyIsIFtudWxs
LCBbMSwgMF0sIFsxLCAxMF1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRl
czogW10KKyAgICB9OworICB9KSgpKTsKK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy91dGls
cy9kZWNvZGUtZWFjaC1rZXknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0
JywgJ2VtYmVyLW1ldGFsL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldCwgX2VtYmVyTWV0YWxVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gZGVjb2RlRWFjaEtleTsKKworICBmdW5jdGlvbiBpZGVudGl0eShpdGVt
KSB7CisgICAgdmFyIGtleSA9IHVuZGVmaW5lZDsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiBpdGVt
OworCisgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7Cisg
ICAgICBrZXkgPSBpdGVtOworICAgIH0gZWxzZSB7CisgICAgICBrZXkgPSBfZW1iZXJNZXRhbFV0
aWxzLmd1aWRGb3IoaXRlbSk7CisgICAgfQorCisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIGZ1
bmN0aW9uIGRlY29kZUVhY2hLZXkoaXRlbSwga2V5UGF0aCwgaW5kZXgpIHsKKyAgICB2YXIga2V5
OworCisgICAgc3dpdGNoIChrZXlQYXRoKSB7CisgICAgICBjYXNlICdAaW5kZXgnOgorICAgICAg
ICBrZXkgPSBpbmRleDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdAaWRlbnRpdHknOgor
ICAgICAgICBrZXkgPSBpZGVudGl0eShpdGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBpZiAoa2V5UGF0aCkgeworICAgICAgICAgIGtleSA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXlQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICBrZXkgPSBpZGVudGl0eShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0
eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgeworICAgICAga2V5ID0gU3RyaW5nKGtleSk7CisgICAg
fQorCisgICAgcmV0dXJuIGtleTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0
aWxzL2V4dHJhY3QtcG9zaXRpb25hbC1wYXJhbXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFt
cy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0
YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZXh0cmFjdFBvc2l0aW9uYWxQYXJhbXM7CisgIGV4
cG9ydHMucHJvY2Vzc1Bvc2l0aW9uYWxQYXJhbXMgPSBwcm9jZXNzUG9zaXRpb25hbFBhcmFtczsK
KworICBmdW5jdGlvbiBleHRyYWN0UG9zaXRpb25hbFBhcmFtcyhyZW5kZXJOb2RlLCBjb21wb25l
bnQsIHBhcmFtcywgYXR0cnMpIHsKKyAgICB2YXIgcmFpc2VBc3NlcnRpb25zID0gYXJndW1lbnRz
Lmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGFyZ3Vt
ZW50c1s0XTsKKworICAgIHZhciBwb3NpdGlvbmFsUGFyYW1zID0gY29tcG9uZW50LnBvc2l0aW9u
YWxQYXJhbXM7CisKKyAgICBpZiAocG9zaXRpb25hbFBhcmFtcykgeworICAgICAgcHJvY2Vzc1Bv
c2l0aW9uYWxQYXJhbXMocmVuZGVyTm9kZSwgcG9zaXRpb25hbFBhcmFtcywgcGFyYW1zLCBhdHRy
cywgcmFpc2VBc3NlcnRpb25zKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzUG9z
aXRpb25hbFBhcmFtcyhyZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJz
KSB7CisgICAgdmFyIHJhaXNlQXNzZXJ0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBh
cmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IHRydWUgOiBhcmd1bWVudHNbNF07CisKKyAgICB2
YXIgaXNSZXN0ID0gdHlwZW9mIHBvc2l0aW9uYWxQYXJhbXMgPT09ICdzdHJpbmcnOworCisgICAg
aWYgKGlzUmVzdCkgeworICAgICAgcHJvY2Vzc1Jlc3RQb3NpdGlvbmFsUGFyYW1ldGVycyhyZW5k
ZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJzLCByYWlzZUFzc2VydGlvbnMp
OworICAgIH0gZWxzZSB7CisgICAgICBwcm9jZXNzTmFtZWRQb3NpdGlvbmFsUGFyYW1ldGVycyhy
ZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJzLCByYWlzZUFzc2VydGlv
bnMpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHByb2Nlc3NOYW1lZFBvc2l0aW9uYWxQYXJh
bWV0ZXJzKHJlbmRlck5vZGUsIHBvc2l0aW9uYWxQYXJhbXMsIHBhcmFtcywgYXR0cnMsIHJhaXNl
QXNzZXJ0aW9ucykgeworICAgIHZhciBsaW1pdCA9IE1hdGgubWluKHBhcmFtcy5sZW5ndGgsIHBv
c2l0aW9uYWxQYXJhbXMubGVuZ3RoKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltaXQ7
IGkrKykgeworICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldOworCisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYSBwb3NpdGlvbmFsIHBhcmFt
IChhdCBwb3NpdGlvbiAnICsgaSArICcpIGFuZCB0aGUgaGFzaCBhcmd1bWVudCBgJyArIHBvc2l0
aW9uYWxQYXJhbXNbaV0gKyAnYC4nLCAhKHBvc2l0aW9uYWxQYXJhbXNbaV0gaW4gYXR0cnMgJiYg
cmFpc2VBc3NlcnRpb25zKSk7CisKKyAgICAgIGF0dHJzW3Bvc2l0aW9uYWxQYXJhbXNbaV1dID0g
cGFyYW07CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcHJvY2Vzc1Jlc3RQb3NpdGlvbmFsUGFy
YW1ldGVycyhyZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zTmFtZSwgcGFyYW1zLCBhdHRycywg
cmFpc2VBc3NlcnRpb25zKSB7CisgICAgdmFyIG5hbWVJbkF0dHJzID0gKHBvc2l0aW9uYWxQYXJh
bXNOYW1lIGluIGF0dHJzKTsKKworICAgIC8vIHdoZW4gbm8gcGFyYW1zIGFyZSB1c2VkLCBkbyBu
b3Qgb3ZlcnJpZGUgdGhlIHNwZWNpZmllZCBgYXR0cnMuc3RyaW5nUGFyYW1OYW1lYCB2YWx1ZQor
ICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAwICYmIG5hbWVJbkF0dHJzKSB7CisgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhdHRyaWJ1dGUgZm9y
IHRoYXQgdmFyaWFibGUsIGRvIG5vdGhpbmcKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
WW91IGNhbm5vdCBzcGVjaWZ5IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgdGhlIGhhc2ggYXJn
dW1lbnQgYCcgKyBwb3NpdGlvbmFsUGFyYW1zTmFtZSArICdgLicsICEobmFtZUluQXR0cnMgJiYg
cmFpc2VBc3NlcnRpb25zKSk7CisKKyAgICB2YXIgcGFyYW1zU3RyZWFtID0gbmV3IF9lbWJlck1l
dGFsU3RyZWFtc1N0cmVhbS5TdHJlYW0oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsU3RyZWFtc1V0aWxzLnJlYWRBcnJheShwYXJhbXMuc2xpY2UoMCkpOworICAgIH0sICdw
YXJhbXMnKTsKKworICAgIGF0dHJzW3Bvc2l0aW9uYWxQYXJhbXNOYW1lXSA9IHBhcmFtc1N0cmVh
bTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAg
ICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07CisgICAgICBwYXJhbXNTdHJlYW0uYWRkRGVwZW5kZW5j
eShwYXJhbSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvdXRpbHMv
aXMtY29tcG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2ZlYXR1cmVzJywgJ2VtYmVy
LWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRz
L2Nsb3N1cmUtY29tcG9uZW50JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudCwgX2VtYmVy
TWV0YWxTdHJlYW1zVXRpbHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBpc0NvbXBvbmVudDsKKworICBmdW5jdGlvbiBoYXNDb21wb25lbnRPclRlbXBsYXRl
KG93bmVyLCBwYXRoLCBvcHRpb25zKSB7CisgICAgcmV0dXJuIG93bmVyLmhhc1JlZ2lzdHJhdGlv
bignY29tcG9uZW50OicgKyBwYXRoLCBvcHRpb25zKSB8fCBvd25lci5oYXNSZWdpc3RyYXRpb24o
J3RlbXBsYXRlOmNvbXBvbmVudHMvJyArIHBhdGgsIG9wdGlvbnMpOworICB9CisKKyAgLyoKKyAg
IEdpdmVuIGEgcGF0aCBuYW1lLCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgY29tcG9uZW50IHdp
dGggdGhhdAorICAgbmFtZSB3YXMgZm91bmQgaW4gdGhlIGNvbnRhaW5lci4KKyAgKi8KKworICBm
dW5jdGlvbiBpc0NvbXBvbmVudChlbnYsIHNjb3BlLCBwYXRoKSB7CisgICAgdmFyIG93bmVyID0g
ZW52Lm93bmVyOworICAgIGlmICghb3duZXIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeworICAgICAgaWYgKF9lbWJlckh0
bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RPVF9DQUNIRS5nZXQocGF0aCkpIHsK
KyAgICAgICAgdmFyIHN0cmVhbSA9IGVudi5ob29rcy5nZXQoZW52LCBzY29wZSwgcGF0aCk7Cisg
ICAgICAgIGlmIChfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShzdHJlYW0pKSB7Cisg
ICAgICAgICAgdmFyIGNlbGwgPSBzdHJlYW0udmFsdWUoKTsKKyAgICAgICAgICBpZiAoX2VtYmVy
SHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuaXNDb21wb25lbnRDZWxsKGNlbGwpKSB7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICAgIGlmICghX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIuQ09OVEFJTlNf
REFTSF9DQUNIRS5nZXQocGF0aCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQor
CisgICAgICBpZiAoaGFzQ29tcG9uZW50T3JUZW1wbGF0ZShvd25lciwgcGF0aCkpIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7IC8vIGdsb2JhbCBjb21wb25lbnQgZm91bmQKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0YSAmJiBlbnYubWV0YS5tb2R1bGVO
YW1lOworCisgICAgICAgICAgaWYgKCFtb2R1bGVOYW1lKSB7CisgICAgICAgICAgICAvLyBXaXRo
b3V0IGEgc291cmNlIG1vZHVsZU5hbWUsIHdlIGNhbiBub3QgcGVyZm9ybSBsb2NhbCBsb29rdXBz
LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZh
ciBvcHRpb25zID0geyBzb3VyY2U6ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZSB9OworCisgICAg
ICAgICAgcmV0dXJuIGhhc0NvbXBvbmVudE9yVGVtcGxhdGUob3duZXIsIHBhdGgsIG9wdGlvbnMp
OworICAgICAgICB9CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvdXRp
bHMvbG9va3VwLWNvbXBvbmVudCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9mZWF0dXJlcydd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbG9va3VwQ29tcG9uZW50OworCisgIGZ1bmN0aW9u
IGxvb2t1cENvbXBvbmVudFBhaXIoY29tcG9uZW50TG9va3VwLCBvd25lciwgbmFtZSwgb3B0aW9u
cykgeworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudExvb2t1cC5jb21w
b25lbnRGb3IobmFtZSwgb3duZXIsIG9wdGlvbnMpLAorICAgICAgbGF5b3V0OiBjb21wb25lbnRM
b29rdXAubGF5b3V0Rm9yKG5hbWUsIG93bmVyLCBvcHRpb25zKQorICAgIH07CisgIH0KKworICBm
dW5jdGlvbiBsb29rdXBDb21wb25lbnQob3duZXIsIG5hbWUsIG9wdGlvbnMpIHsKKyAgICB2YXIg
Y29tcG9uZW50TG9va3VwID0gb3duZXIubG9va3VwKCdjb21wb25lbnQtbG9va3VwOm1haW4nKTsK
KworICAgIHZhciBzb3VyY2UgPSBvcHRpb25zICYmIG9wdGlvbnMuc291cmNlOworCisgICAgaWYg
KHNvdXJjZSkgeworICAgICAgdmFyIGxvY2FsUmVzdWx0ID0gbG9va3VwQ29tcG9uZW50UGFpcihj
b21wb25lbnRMb29rdXAsIG93bmVyLCBuYW1lLCBvcHRpb25zKTsKKworICAgICAgaWYgKGxvY2Fs
UmVzdWx0LmNvbXBvbmVudCB8fCBsb2NhbFJlc3VsdC5sYXlvdXQpIHsKKyAgICAgICAgcmV0dXJu
IGxvY2FsUmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsb29rdXBDb21wb25l
bnRQYWlyKGNvbXBvbmVudExvb2t1cCwgb3duZXIsIG5hbWUpOworICB9Cit9KTsKK2VuaWZlZCgn
ZW1iZXItaHRtbGJhcnMvdXRpbHMvbmV3LXN0cmVhbScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLCBfZW1i
ZXJIdG1sYmFyc1V0aWxzU3Vic2NyaWJlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBuZXdTdHJlYW07CisKKyAgZnVuY3Rpb24gbmV3U3RyZWFtKHNjb3BlLCBrZXks
IG5ld1ZhbHVlLCByZW5kZXJOb2RlLCBpc1NlbGYpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9l
bWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFsdWUsIGlzU2VsZiA/ICcn
IDoga2V5KTsKKyAgICBpZiAocmVuZGVyTm9kZSkgeworICAgICAgX2VtYmVySHRtbGJhcnNVdGls
c1N1YnNjcmliZS5kZWZhdWx0KHJlbmRlck5vZGUsIHNjb3BlLCBzdHJlYW0pOworICAgIH0KKyAg
ICBzY29wZVtrZXldID0gc3RyZWFtOworICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMv
dXRpbHMvbm9ybWFsaXplLXNlbGYiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsK
KyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IG5vcm1hbGl6ZVNlbGY7CisK
KyAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZihzZWxmKSB7CisgICAgaWYgKHNlbGYgPT09IHVuZGVm
aW5lZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBz
ZWxmOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3N0cmlu
ZycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVt
L3N0cmluZycsICdodG1sYmFycy11dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcsIF9odG1sYmFyc1V0aWwpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBNYXJrIGEgc3RyaW5nIGFzIHNhZmUgZm9yIHVu
ZXNjYXBlZCBvdXRwdXQgd2l0aCBFbWJlciB0ZW1wbGF0ZXMuIElmIHlvdQorICAgIHJldHVybiBI
VE1MIGZyb20gYSBoZWxwZXIsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgICAgZW5zdXJlIEVtYmVy
J3MgcmVuZGVyaW5nIGxheWVyIGRvZXMgbm90IGVzY2FwZSB0aGUgSFRNTC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEVtYmVyLlN0cmluZy5odG1sU2FmZSgnPGRpdj5zb21lU3RyaW5nPC9k
aXY+JykKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBodG1sU2FmZQorICAgIEBmb3IgRW1iZXIu
U3RyaW5nCisgICAgQHN0YXRpYworICAgIEByZXR1cm4ge0hhbmRsZWJhcnMuU2FmZVN0cmluZ30g
QSBzdHJpbmcgdGhhdCB3aWxsIG5vdCBiZSBIVE1MIGVzY2FwZWQgYnkgSGFuZGxlYmFycy4KKyAg
ICBAcHVibGljCisgICovCisgIGZ1bmN0aW9uIGh0bWxTYWZlKHN0cikgeworICAgIGlmIChzdHIg
PT09IG51bGwgfHwgc3RyID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHN0ciA9ICcnOworICAgIH0g
ZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHsKKyAgICAgIHN0ciA9ICcnICsgc3Ry
OworICAgIH0KKyAgICByZXR1cm4gbmV3IF9odG1sYmFyc1V0aWwuU2FmZVN0cmluZyhzdHIpOwor
ICB9CisKKyAgX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5kZWZhdWx0Lmh0bWxTYWZlID0gaHRt
bFNhZmU7CisgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUyA9
PT0gdHJ1ZSB8fCBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy5TdHJp
bmcpIHsKKyAgICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0gZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIGh0bWxTYWZlKHRoaXMpOworICAgIH07CisgIH0KKworICBleHBvcnRzLlNhZmVT
dHJpbmcgPSBfaHRtbGJhcnNVdGlsLlNhZmVTdHJpbmc7CisgIGV4cG9ydHMuaHRtbFNhZmUgPSBo
dG1sU2FmZTsKKyAgZXhwb3J0cy5lc2NhcGVFeHByZXNzaW9uID0gX2h0bWxiYXJzVXRpbC5lc2Nh
cGVFeHByZXNzaW9uOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3N1YnNjcmli
ZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gc3Vic2NyaWJlOworCisgIGZ1bmN0aW9uIHN1YnNjcmliZShub2Rl
LCBlbnYsIHNjb3BlLCBzdHJlYW0pIHsKKyAgICBpZiAoIV9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LmlzU3RyZWFtKHN0cmVhbSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGNvbXBv
bmVudCA9IHNjb3BlLmdldENvbXBvbmVudCgpOworICAgIHZhciB1bnN1YnNjcmliZXJzID0gbm9k
ZS5zdHJlYW1VbnN1YnNjcmliZXJzID0gbm9kZS5zdHJlYW1VbnN1YnNjcmliZXJzIHx8IFtdOwor
CisgICAgdW5zdWJzY3JpYmVycy5wdXNoKHN0cmVhbS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkgewor
ICAgICAgbm9kZS5pc0RpcnR5ID0gdHJ1ZTsKKworICAgICAgLy8gV2hlbmV2ZXIgYSByZW5kZXIg
bm9kZSBkaXJlY3RseSBpbnNpZGUgYSBjb21wb25lbnQgYmVjb21lcworICAgICAgLy8gZGlydHks
IHdlIHdhbnQgdG8gaW52b2tlIHRoZSB3aWxsUmVuZGVyRWxlbWVudCBhbmQKKyAgICAgIC8vIGRp
ZFJlbmRlckVsZW1lbnQgbGlmZWN5Y2xlIGhvb2tzLiBGcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0
aGUKKyAgICAgIC8vIHByb2dyYW1taW5nIG1vZGVsLCB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUg
RE9NIGNoYW5nZXMsIGEKKyAgICAgIC8vICJyZS1yZW5kZXIiIGhhcyBvY2N1cmVkLgorICAgICAg
aWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuX3JlbmRlck5vZGUpIHsKKyAgICAgICAgY29tcG9u
ZW50Ll9yZW5kZXJOb2RlLmlzRGlydHkgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAobm9k
ZS5nZXRTdGF0ZSgpLm1hbmFnZXIpIHsKKyAgICAgICAgbm9kZS5zaG91bGRSZWNlaXZlQXR0cnMg
PSB0cnVlOworICAgICAgfQorCisgICAgICBub2RlLm93bmVyTm9kZS5lbWJlclZpZXcuc2NoZWR1
bGVSZXZhbGlkYXRlKG5vZGUsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmxhYmVsRm9yKHN0cmVh
bSkpOworICAgIH0pKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3Vw
ZGF0ZS1zY29wZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVh
bScsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLCBfZW1iZXJIdG1sYmFyc1V0aWxzU3Vic2Ny
aWJlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSB1cGRhdGVTY29w
ZTsKKworICBmdW5jdGlvbiB1cGRhdGVTY29wZShzY29wZSwga2V5LCBuZXdWYWx1ZSwgcmVuZGVy
Tm9kZSwgaXNTZWxmKSB7CisgICAgdmFyIGV4aXN0aW5nID0gc2NvcGVba2V5XTsKKworICAgIGlm
IChleGlzdGluZykgeworICAgICAgZXhpc3Rpbmcuc2V0U291cmNlKG5ld1ZhbHVlKTsKKyAgICB9
IGVsc2UgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfZW1iZXJNZXRhbFN0cmVhbXNQcm94eVN0
cmVhbS5kZWZhdWx0KG5ld1ZhbHVlLCBpc1NlbGYgPyBudWxsIDoga2V5KTsKKyAgICAgIGlmIChy
ZW5kZXJOb2RlKSB7CisgICAgICAgIF9lbWJlckh0bWxiYXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVs
dChyZW5kZXJOb2RlLCBzY29wZSwgc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHNjb3BlW2tleV0g
PSBzdHJlYW07CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwtdmlld3MvaHRt
bGJhcnMtcmVuZGVyZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1i
ZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJl
ci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2J1aWxkLWNvbXBvbmVudC10ZW1wbGF0ZScsICdlbWJlci1tZXRhbC9lbnZpcm9u
bWVudCcsICdodG1sYmFycy1ydW50aW1lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bFJ1bl9sb29wLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9z
ZXQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVzLCBfZW1iZXJW
aWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVtcGxhdGUsIF9lbWJlck1ldGFsRW52aXJvbm1lbnQs
IF9odG1sYmFyc1J1bnRpbWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuUmVuZGVy
ZXIgPSBSZW5kZXJlcjsKKyAgZXhwb3J0cy5Nb3JwaFNldCA9IE1vcnBoU2V0OworCisgIGZ1bmN0
aW9uIFJlbmRlcmVyKGRvbUhlbHBlcikgeworICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0
aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07
CisKKyAgICB2YXIgZGVzdGluZWRGb3JET00gPSBfcmVmLmRlc3RpbmVkRm9yRE9NOworCisgICAg
dGhpcy5fZG9tID0gZG9tSGVscGVyOworCisgICAgLy8gVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0
aGVyIHRoZSByZXN1bHRpbmcgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlCisgICAgLy8gaW5zZXJ0
ZWQgaW50byB0aGUgRE9NLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYCBpZiB0aGUgcmVu
ZGVyZWQKKyAgICAvLyBlbGVtZW50IGlzIGdvaW5nIHRvIGJlIHNlcmlhbGl6ZWQgdG8gSFRNTCB3
aXRob3V0IGJlaW5nIGluc2VydGVkIGludG8KKyAgICAvLyB0aGUgRE9NIChlLmcuLCBpbiBGYXN0
Qm9vdCBtb2RlKS4gQnkgZGVmYXVsdCwgdGhpcyBmbGFnIGlzIHRoZSBzYW1lCisgICAgLy8gYXMg
d2hldGhlciB3ZSBhcmUgcnVubmluZyBpbiBhbiBlbnZpcm9ubWVudCB3aXRoIERPTSwgYnV0IG1h
eSBiZQorICAgIC8vIG92ZXJyaWRkZW4uCisgICAgdGhpcy5fZGVzdGluZWRGb3JET00gPSBkZXN0
aW5lZEZvckRPTSA9PT0gdW5kZWZpbmVkID8gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0
Lmhhc0RPTSA6IGRlc3RpbmVkRm9yRE9NOworICB9CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLnBy
ZXJlbmRlclRvcExldmVsVmlldyA9IGZ1bmN0aW9uIFJlbmRlcmVyX3ByZXJlbmRlclRvcExldmVs
Vmlldyh2aWV3LCByZW5kZXJOb2RlKSB7CisgICAgaWYgKHZpZXcuX3N0YXRlID09PSAnaW5ET00n
KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgaW5zZXJ0IGEgVmlldyB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQnKTsKKyAgICB9CisgICAgdmlldy5vd25lclZpZXcg
PSByZW5kZXJOb2RlLmVtYmVyVmlldyA9IHZpZXc7CisgICAgdmlldy5fcmVuZGVyTm9kZSA9IHJl
bmRlck5vZGU7CisKKyAgICB2YXIgbGF5b3V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0
KHZpZXcsICdsYXlvdXQnKTsKKyAgICB2YXIgdGVtcGxhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodmlldywgJ3RlbXBsYXRlJyk7CisKKyAgICB2YXIgY29tcG9uZW50SW5mbyA9IHsg
Y29tcG9uZW50OiB2aWV3LCBsYXlvdXQ6IGxheW91dCB9OworCisgICAgdmFyIGJsb2NrID0gX2Vt
YmVyVmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmRlZmF1bHQoY29tcG9uZW50SW5m
bywge30sIHsKKyAgICAgIHNlbGY6IHZpZXcsCisgICAgICB0ZW1wbGF0ZXM6IHRlbXBsYXRlID8g
eyBkZWZhdWx0OiB0ZW1wbGF0ZS5yYXcgfSA6IHVuZGVmaW5lZAorICAgIH0pLmJsb2NrOworCisg
ICAgdmlldy5yZW5kZXJCbG9jayhibG9jaywgcmVuZGVyTm9kZSk7CisgICAgdmlldy5sYXN0UmVz
dWx0ID0gcmVuZGVyTm9kZS5sYXN0UmVzdWx0OworICAgIHRoaXMuY2xlYXJSZW5kZXJlZFZpZXdz
KHZpZXcuZW52KTsKKyAgfTsKKworICBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyVG9wTGV2ZWxW
aWV3ID0gZnVuY3Rpb24gUmVuZGVyZXJfcmVuZGVyVG9wTGV2ZWxWaWV3KHZpZXcsIHJlbmRlck5v
ZGUpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgaW5zZXJ0aW9uIGhhcyBiZWVuIGNhbmNlbGVk
LgorICAgIGlmICh2aWV3Ll93aWxsSW5zZXJ0KSB7CisgICAgICB2aWV3Ll93aWxsSW5zZXJ0ID0g
ZmFsc2U7CisgICAgICB0aGlzLnByZXJlbmRlclRvcExldmVsVmlldyh2aWV3LCByZW5kZXJOb2Rl
KTsKKyAgICAgIHRoaXMuZGlzcGF0Y2hMaWZlY3ljbGVIb29rcyh2aWV3LmVudik7CisgICAgfQor
ICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXZhbGlkYXRlVG9wTGV2ZWxWaWV3ID0gZnVu
Y3Rpb24gUmVuZGVyZXJfcmV2YWxpZGF0ZVRvcExldmVsVmlldyh2aWV3KSB7CisgICAgLy8gVGhp
cyBndWFyZCBwcmV2ZW50cyByZXZhbGlkYXRpb24gb24gYW4gYWxyZWFkeS1kZXN0cm95ZWQgdmll
dy4KKyAgICBpZiAodmlldy5fcmVuZGVyTm9kZS5sYXN0UmVzdWx0KSB7CisgICAgICB2aWV3Ll9y
ZW5kZXJOb2RlLmxhc3RSZXN1bHQucmV2YWxpZGF0ZSh2aWV3LmVudik7CisgICAgICAvLyBzdXBw
b3J0cyBjcmVhdGVFbGVtZW50LCB3aGljaCBvcGVyYXRlcyB3aXRob3V0IG1vdmluZyB0aGUgdmll
dyBpbnRvCisgICAgICAvLyB0aGUgaW5ET00gc3RhdGUuCisgICAgICBpZiAodmlldy5fc3RhdGUg
PT09ICdpbkRPTScpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRjaExpZmVjeWNsZUhvb2tzKHZpZXcu
ZW52KTsKKyAgICAgIH0KKyAgICAgIHRoaXMuY2xlYXJSZW5kZXJlZFZpZXdzKHZpZXcuZW52KTsK
KyAgICB9CisgIH07CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLmRpc3BhdGNoTGlmZWN5Y2xlSG9v
a3MgPSBmdW5jdGlvbiBSZW5kZXJlcl9kaXNwYXRjaExpZmVjeWNsZUhvb2tzKGVudikgeworICAg
IHZhciBvd25lclZpZXcgPSBlbnYudmlldzsKKworICAgIHZhciBsaWZlY3ljbGVIb29rcyA9IGVu
di5saWZlY3ljbGVIb29rczsKKyAgICB2YXIgaSwgaG9vazsKKworICAgIGZvciAoaSA9IDA7IGkg
PCBsaWZlY3ljbGVIb29rcy5sZW5ndGg7IGkrKykgeworICAgICAgaG9vayA9IGxpZmVjeWNsZUhv
b2tzW2ldOworICAgICAgb3duZXJWaWV3Ll9kaXNwYXRjaGluZyA9IGhvb2sudHlwZTsKKworICAg
ICAgc3dpdGNoIChob29rLnR5cGUpIHsKKyAgICAgICAgY2FzZSAnZGlkSW5zZXJ0RWxlbWVudCc6
CisgICAgICAgICAgdGhpcy5kaWRJbnNlcnRFbGVtZW50KGhvb2sudmlldyk7YnJlYWs7CisgICAg
ICAgIGNhc2UgJ2RpZFVwZGF0ZSc6CisgICAgICAgICAgdGhpcy5kaWRVcGRhdGUoaG9vay52aWV3
KTticmVhazsKKyAgICAgIH0KKworICAgICAgdGhpcy5kaWRSZW5kZXIoaG9vay52aWV3KTsKKyAg
ICB9CisKKyAgICBvd25lclZpZXcuX2Rpc3BhdGNoaW5nID0gbnVsbDsKKyAgICBlbnYubGlmZWN5
Y2xlSG9va3MubGVuZ3RoID0gMDsKKyAgfTsKKworICBSZW5kZXJlci5wcm90b3R5cGUuZW5zdXJl
Vmlld05vdFJlbmRlcmluZyA9IGZ1bmN0aW9uIFJlbmRlcmVyX2Vuc3VyZVZpZXdOb3RSZW5kZXJp
bmcodmlldykgeworICAgIHZhciBlbnYgPSB2aWV3Lm93bmVyVmlldy5lbnY7CisgICAgaWYgKGVu
diAmJiBlbnYucmVuZGVyZWRWaWV3cy5pbmRleE9mKHZpZXcuZWxlbWVudElkKSAhPT0gLTEpIHsK
KyAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHlvdSBkaWQgY2F1c2VkIGEgdmlldyB0
byByZS1yZW5kZXIgYWZ0ZXIgaXQgcmVuZGVyZWQgYnV0IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQg
aW50byB0aGUgRE9NLicpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBNb3JwaFNldCgpIHsK
KyAgICB0aGlzLm1vcnBocyA9IFtdOworICB9CisKKyAgTW9ycGhTZXQucHJvdG90eXBlLmFkZCA9
IGZ1bmN0aW9uIChtb3JwaCkgeworICAgIHRoaXMubW9ycGhzLnB1c2gobW9ycGgpOworICAgIG1v
cnBoLnNlZW4gPSB0cnVlOworICB9OworCisgIE1vcnBoU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5j
dGlvbiAobW9ycGgpIHsKKyAgICByZXR1cm4gbW9ycGguc2VlbjsKKyAgfTsKKworICBNb3JwaFNl
dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIG1vcnBocyA9IHRoaXMu
bW9ycGhzOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9ycGhzLmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgbW9ycGhzW2ldLnNlZW4gPSBmYWxzZTsKKyAgICB9CisKKyAgICB0aGlzLm1v
cnBocyA9IFtdOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5jbGVhclJlbmRlcmVkVmll
d3MgPSBmdW5jdGlvbiBSZW5kZXJlcl9jbGVhclJlbmRlcmVkVmlld3MoZW52KSB7CisgICAgZW52
LnJlbmRlcmVkTm9kZXMuY2xlYXIoKTsKKyAgICBlbnYucmVuZGVyZWRWaWV3cy5sZW5ndGggPSAw
OworICB9OworCisgIC8vIFRoaXMgZW50cnkgcG9pbnQgaXMgY2FsbGVkIGZyb20gdG9wLWxldmVs
IGB2aWV3LmFwcGVuZFRvYC4KKyAgUmVuZGVyZXIucHJvdG90eXBlLmFwcGVuZFRvID0gZnVuY3Rp
b24gUmVuZGVyZXJfYXBwZW5kVG8odmlldywgdGFyZ2V0KSB7CisgICAgdmFyIG1vcnBoID0gdGhp
cy5fZG9tLmFwcGVuZE1vcnBoKHRhcmdldCk7CisgICAgbW9ycGgub3duZXJOb2RlID0gbW9ycGg7
CisgICAgdmlldy5fd2lsbEluc2VydCA9IHRydWU7CisgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5k
ZWZhdWx0LnNjaGVkdWxlKCdyZW5kZXInLCB0aGlzLCB0aGlzLnJlbmRlclRvcExldmVsVmlldywg
dmlldywgbW9ycGgpOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXBsYWNlSW4gPSBm
dW5jdGlvbiBSZW5kZXJlcl9yZXBsYWNlSW4odmlldywgdGFyZ2V0KSB7CisgICAgdmFyIG1vcnBo
ID0gdGhpcy5fZG9tLnJlcGxhY2VDb250ZW50V2l0aE1vcnBoKHRhcmdldCk7CisgICAgbW9ycGgu
b3duZXJOb2RlID0gbW9ycGg7CisgICAgdmlldy5fd2lsbEluc2VydCA9IHRydWU7CisgICAgX2Vt
YmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgdGhp
cy5yZW5kZXJUb3BMZXZlbFZpZXcsIHZpZXcsIG1vcnBoKTsKKyAgfTsKKworICBSZW5kZXJlci5w
cm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIFJlbmRlcmVyX2NyZWF0ZUVsZW1lbnQo
dmlldykgeworICAgIHZhciBtb3JwaCA9IHRoaXMuX2RvbS5jcmVhdGVGcmFnbWVudE1vcnBoKCk7
CisgICAgbW9ycGgub3duZXJOb2RlID0gbW9ycGg7CisgICAgdGhpcy5wcmVyZW5kZXJUb3BMZXZl
bFZpZXcodmlldywgbW9ycGgpOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWRDcmVh
dGVFbGVtZW50ID0gZnVuY3Rpb24gKHZpZXcsIGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudCkg
eworICAgICAgdmlldy5lbGVtZW50ID0gZWxlbWVudDsKKyAgICB9CisKKyAgICBpZiAodmlldy5f
dHJhbnNpdGlvblRvKSB7CisgICAgICB2aWV3Ll90cmFuc2l0aW9uVG8oJ2hhc0VsZW1lbnQnKTsK
KyAgICB9CisgIH07IC8vIGhhc0VsZW1lbnQKKworICBSZW5kZXJlci5wcm90b3R5cGUud2lsbElu
c2VydEVsZW1lbnQgPSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsK
KyAgICAgIHZpZXcudHJpZ2dlcignd2lsbEluc2VydEVsZW1lbnQnKTsKKyAgICB9CisgIH07IC8v
IFdpbGwgcGxhY2UgaW50byBET00uCisKKyAgUmVuZGVyZXIucHJvdG90eXBlLnNldEF0dHJzID0g
ZnVuY3Rpb24gKHZpZXcsIGF0dHJzKSB7CisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0
KHZpZXcsICdhdHRycycsIGF0dHJzKTsKKyAgfTsgLy8gU2V0IGF0dHJzIHRoZSBmaXJzdCB0aW1l
LgorCisgIFJlbmRlcmVyLnByb3RvdHlwZS5jb21wb25lbnRJbml0QXR0cnMgPSBmdW5jdGlvbiAo
Y29tcG9uZW50LCBhdHRycykgeworICAgIGNvbXBvbmVudC50cmlnZ2VyKCdkaWRJbml0QXR0cnMn
LCB7IGF0dHJzOiBhdHRycyB9KTsKKyAgICBjb21wb25lbnQudHJpZ2dlcignZGlkUmVjZWl2ZUF0
dHJzJywgeyBuZXdBdHRyczogYXR0cnMgfSk7CisgIH07IC8vIFNldCBhdHRycyB0aGUgZmlyc3Qg
dGltZS4KKworICBSZW5kZXJlci5wcm90b3R5cGUuZGlkSW5zZXJ0RWxlbWVudCA9IGZ1bmN0aW9u
ICh2aWV3KSB7CisgICAgaWYgKHZpZXcuX3RyYW5zaXRpb25UbykgeworICAgICAgdmlldy5fdHJh
bnNpdGlvblRvKCdpbkRPTScpOworICAgIH0KKworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAg
ICAgIHZpZXcudHJpZ2dlcignZGlkSW5zZXJ0RWxlbWVudCcpOworICAgIH0KKyAgfTsgLy8gaW5E
T00gLy8gUGxhY2VkIGludG8gRE9NLgorCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWRVcGRhdGUg
PSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAgICAgIHZpZXcu
dHJpZ2dlcignZGlkVXBkYXRlJyk7CisgICAgfQorICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlw
ZS5kaWRSZW5kZXIgPSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsK
KyAgICAgIHZpZXcudHJpZ2dlcignZGlkUmVuZGVyJyk7CisgICAgfQorICB9OworCisgIFJlbmRl
cmVyLnByb3RvdHlwZS51cGRhdGVBdHRycyA9IGZ1bmN0aW9uICh2aWV3LCBhdHRycykgeworICAg
IHRoaXMuc2V0QXR0cnModmlldywgYXR0cnMpOworICB9OyAvLyBTZXR0aW5nIG5ldyBhdHRycy4K
KworICBSZW5kZXJlci5wcm90b3R5cGUuY29tcG9uZW50VXBkYXRlQXR0cnMgPSBmdW5jdGlvbiAo
Y29tcG9uZW50LCBuZXdBdHRycykgeworICAgIHZhciBvbGRBdHRycyA9IG51bGw7CisKKyAgICBp
ZiAoY29tcG9uZW50LmF0dHJzKSB7CisgICAgICBvbGRBdHRycyA9IF9lbWJlck1ldGFsQXNzaWdu
LmRlZmF1bHQoe30sIGNvbXBvbmVudC5hdHRycyk7CisgICAgICBfZW1iZXJNZXRhbFNldF9wcm9w
ZXJ0aWVzLmRlZmF1bHQoY29tcG9uZW50LmF0dHJzLCBuZXdBdHRycyk7CisgICAgfSBlbHNlIHsK
KyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChjb21wb25lbnQsICdhdHRycycsIG5l
d0F0dHJzKTsKKyAgICB9CisKKyAgICBjb21wb25lbnQudHJpZ2dlcignZGlkVXBkYXRlQXR0cnMn
LCB7IG9sZEF0dHJzOiBvbGRBdHRycywgbmV3QXR0cnM6IG5ld0F0dHJzIH0pOworICAgIGNvbXBv
bmVudC50cmlnZ2VyKCdkaWRSZWNlaXZlQXR0cnMnLCB7IG9sZEF0dHJzOiBvbGRBdHRycywgbmV3
QXR0cnM6IG5ld0F0dHJzIH0pOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS53aWxsVXBk
YXRlID0gZnVuY3Rpb24gKHZpZXcsIGF0dHJzKSB7CisgICAgaWYgKHZpZXcuX3dpbGxVcGRhdGUp
IHsKKyAgICAgIHZpZXcuX3dpbGxVcGRhdGUoYXR0cnMpOworICAgIH0KKyAgfTsKKworICBSZW5k
ZXJlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIChjb21wb25lbnQp
IHsKKyAgICBjb21wb25lbnQudHJpZ2dlcignd2lsbFVwZGF0ZScpOworICB9OworCisgIFJlbmRl
cmVyLnByb3RvdHlwZS53aWxsUmVuZGVyID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBpZiAodmll
dy5fd2lsbFJlbmRlcikgeworICAgICAgdmlldy5fd2lsbFJlbmRlcigpOworICAgIH0KKyAgfTsK
KworICBSZW5kZXJlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlbmRlciA9IGZ1bmN0aW9uIChj
b21wb25lbnQpIHsKKyAgICBjb21wb25lbnQudHJpZ2dlcignd2lsbFJlbmRlcicpOworICB9Owor
CisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXJlbmRlciA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICAg
dmFyIHJlbmRlck5vZGUgPSB2aWV3Ll9yZW5kZXJOb2RlOworCisgICAgcmVuZGVyTm9kZS5pc0Rp
cnR5ID0gdHJ1ZTsKKyAgICBfaHRtbGJhcnNSdW50aW1lLmludGVybmFsLnZpc2l0Q2hpbGRyZW4o
cmVuZGVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgaWYgKG5vZGUu
Z2V0U3RhdGUoKS5tYW5hZ2VyKSB7CisgICAgICAgIG5vZGUuc2hvdWxkUmVjZWl2ZUF0dHJzID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICAgIG5vZGUuaXNEaXJ0eSA9IHRydWU7CisgICAgfSk7CisKKyAg
ICByZW5kZXJOb2RlLm93bmVyTm9kZS5lbWJlclZpZXcuc2NoZWR1bGVSZXZhbGlkYXRlKHJlbmRl
ck5vZGUsIHZpZXcudG9TdHJpbmcoKSwgJ3JlcmVuZGVyaW5nJyk7CisgIH07CisKKyAgUmVuZGVy
ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2aWV3LCBzaG91bGREZXN0cm95KSB7Cisg
ICAgdGhpcy53aWxsRGVzdHJveUVsZW1lbnQodmlldyk7CisKKyAgICB2aWV3Ll93aWxsUmVtb3Zl
RWxlbWVudCA9IHRydWU7CisgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
KCdyZW5kZXInLCB0aGlzLCB0aGlzLnJlbmRlckVsZW1lbnRSZW1vdmFsLCB2aWV3KTsKKyAgfTsK
KworICBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyRWxlbWVudFJlbW92YWwgPSBmdW5jdGlvbiBS
ZW5kZXJlcl9yZW5kZXJFbGVtZW50UmVtb3ZhbCh2aWV3KSB7CisgICAgLy8gVXNlIHRoZSBfd2ls
bFJlbW92ZUVsZW1lbnQgZmxhZyB0byBhdm9pZCBtdWxpdHBsZSByZW1vdmFsIGF0dGVtcHRzIGlu
CisgICAgLy8gY2FzZSBtYW55IGhhdmUgYmVlbiBzY2hlZHVsZWQuIFRoaXMgc2hvdWxkIGJlIG1v
cmUgcGVyZm9ybWFudCB0aGFuIHVzaW5nCisgICAgLy8gYHNjaGVkdWxlT25jZWAuCisgICAgaWYg
KHZpZXcuX3dpbGxSZW1vdmVFbGVtZW50KSB7CisgICAgICB2aWV3Ll93aWxsUmVtb3ZlRWxlbWVu
dCA9IGZhbHNlOworCisgICAgICBpZiAodmlldy5fcmVuZGVyTm9kZSAmJiB2aWV3LmVsZW1lbnQg
JiYgdmlldy5lbGVtZW50LnBhcmVudE5vZGUpIHsKKyAgICAgICAgdmlldy5fcmVuZGVyTm9kZS5j
bGVhcigpOworICAgICAgfQorICAgICAgdGhpcy5kaWREZXN0cm95RWxlbWVudCh2aWV3KTsKKyAg
ICB9CisgIH07CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLndpbGxSZW1vdmVFbGVtZW50ID0gZnVu
Y3Rpb24gKCkgLyp2aWV3Ki97fTsKKworICBSZW5kZXJlci5wcm90b3R5cGUud2lsbERlc3Ryb3lF
bGVtZW50ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBpZiAodmlldy5fd2lsbERlc3Ryb3lFbGVt
ZW50KSB7CisgICAgICB2aWV3Ll93aWxsRGVzdHJveUVsZW1lbnQoKTsKKyAgICB9CisgICAgaWYg
KHZpZXcudHJpZ2dlcikgeworICAgICAgdmlldy50cmlnZ2VyKCd3aWxsRGVzdHJveUVsZW1lbnQn
KTsKKyAgICAgIHZpZXcudHJpZ2dlcignd2lsbENsZWFyUmVuZGVyJyk7CisgICAgfQorCisgICAg
aWYgKHZpZXcuX3RyYW5zaXRpb25UbykgeworICAgICAgdmlldy5fdHJhbnNpdGlvblRvKCdkZXN0
cm95aW5nJyk7CisgICAgfQorICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWREZXN0cm95
RWxlbWVudCA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgdmlldy5lbGVtZW50ID0gbnVsbDsKKwor
ICAgIC8vIFZpZXdzIHRoYXQgYXJlIGJlaW5nIGRlc3Ryb3llZCBzaG91bGQgbmV2ZXIgZ28gYmFj
ayB0byB0aGUgcHJlUmVuZGVyIHN0YXRlLgorICAgIC8vIEhvd2V2ZXIgaWYgd2UncmUganVzdCBk
ZXN0cm95aW5nIGFuIGVsZW1lbnQgb24gYSB2aWV3IChhcyBpcyB0aGUgY2FzZSB3aGVuCisgICAg
Ly8gdXNpbmcgVmlldyNyZW1vdmUpIHRoZW4gdGhlIHZpZXcgc2hvdWxkIGdvIHRvIGEgcHJlUmVu
ZGVyIHN0YXRlIHNvIHRoYXQKKyAgICAvLyBpdCBjYW4gYmUgcmVuZGVyZWQgYWdhaW4gbGF0ZXIu
CisgICAgaWYgKHZpZXcuX3N0YXRlICE9PSAnZGVzdHJveWluZycgJiYgdmlldy5fdHJhbnNpdGlv
blRvKSB7CisgICAgICB2aWV3Ll90cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOworICAgIH0KKwor
ICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAgICAgIHZpZXcudHJpZ2dlcignZGlkRGVzdHJveUVs
ZW1lbnQnKTsKKyAgICB9CisgIH07IC8vIEVsZW1lbnQgZGVzdHJveWVkIHNvIHZpZXcuZGVzdHJv
eSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdCByZW1vdmVkRnJvbURPTQorCisgIHZhciBJbmVy
dFJlbmRlcmVyID0geworICAgIGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICB2YXIg
ZG9tID0gX3JlZjIuZG9tOworCisgICAgICByZXR1cm4gbmV3IFJlbmRlcmVyKGRvbSwgeyBkZXN0
aW5lZEZvckRPTTogZmFsc2UgfSk7CisgICAgfQorICB9OworCisgIGV4cG9ydHMuSW5lcnRSZW5k
ZXJlciA9IEluZXJ0UmVuZGVyZXI7CisgIHZhciBJbnRlcmFjdGl2ZVJlbmRlcmVyID0geworICAg
IGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYzKSB7CisgICAgICB2YXIgZG9tID0gX3JlZjMuZG9tOwor
CisgICAgICByZXR1cm4gbmV3IFJlbmRlcmVyKGRvbSwgeyBkZXN0aW5lZEZvckRPTTogdHJ1ZSB9
KTsKKyAgICB9CisgIH07CisgIGV4cG9ydHMuSW50ZXJhY3RpdmVSZW5kZXJlciA9IEludGVyYWN0
aXZlUmVuZGVyZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwtdmlld3MvaW5kZXgnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwtdmlld3MvaHRtbGJhcnMtcmVuZGVyZXInXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsVmlld3NIdG1sYmFyc1JlbmRlcmVyKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICBmdW5jdGlvbiBfaW50ZXJvcEV4cG9ydFdpbGRjYXJkKG9iaiwgZGVmYXVsdHMp
IHsgdmFyIG5ld09iaiA9IGRlZmF1bHRzKHt9LCBvYmopOyBkZWxldGUgbmV3T2JqWydkZWZhdWx0
J107IHJldHVybiBuZXdPYmo7IH0KKworICBmdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0
cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9y
ICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2
YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkp
OyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmlu
ZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4g
b2JqOyB9CisKKyAgX2RlZmF1bHRzKGV4cG9ydHMsIF9pbnRlcm9wRXhwb3J0V2lsZGNhcmQoX2Vt
YmVyTWV0YWxWaWV3c0h0bWxiYXJzUmVuZGVyZXIsIF9kZWZhdWx0cykpOworfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL2FsaWFzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1i
ZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9j
b21wdXRlZCcsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9tZXRhJywgJ2VtYmVy
LW1ldGFsL2RlcGVuZGVudF9rZXlzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERl
YnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9l
bWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxDb21wdXRl
ZCwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxNZXRhLCBfZW1iZXJNZXRhbERlcGVuZGVu
dF9rZXlzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBhbGlhczsK
KyAgZXhwb3J0cy5BbGlhc2VkUHJvcGVydHkgPSBBbGlhc2VkUHJvcGVydHk7CisKKyAgZnVuY3Rp
b24gYWxpYXMoYWx0S2V5KSB7CisgICAgcmV0dXJuIG5ldyBBbGlhc2VkUHJvcGVydHkoYWx0S2V5
KTsKKyAgfQorCisgIGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0eShhbHRLZXkpIHsKKyAgICB0aGlz
LmlzRGVzY3JpcHRvciA9IHRydWU7CisgICAgdGhpcy5hbHRLZXkgPSBhbHRLZXk7CisgICAgdGhp
cy5fZGVwZW5kZW50S2V5cyA9IFthbHRLZXldOworICB9CisKKyAgQWxpYXNlZFByb3BlcnR5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3Iu
cHJvdG90eXBlKTsKKworICBBbGlhc2VkUHJvcGVydHkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9u
IEFsaWFzZWRQcm9wZXJ0eV9nZXQob2JqLCBrZXlOYW1lKSB7CisgICAgcmV0dXJuIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldChvYmosIHRoaXMuYWx0S2V5KTsKKyAgfTsKKworICBBbGlhc2Vk
UHJvcGVydHkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0eV9zZXQob2Jq
LCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5z
ZXQob2JqLCB0aGlzLmFsdEtleSwgdmFsdWUpOworICB9OworCisgIEFsaWFzZWRQcm9wZXJ0eS5w
cm90b3R5cGUud2lsbFdhdGNoID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIF9lbWJl
ck1ldGFsRGVwZW5kZW50X2tleXMuYWRkRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUs
IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaikpOworICB9OworCisgIEFsaWFzZWRQcm9wZXJ0eS5w
cm90b3R5cGUuZGlkVW53YXRjaCA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKKyAgICBfZW1i
ZXJNZXRhbERlcGVuZGVudF9rZXlzLnJlbW92ZURlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlO
YW1lLCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopKTsKKyAgfTsKKworICBBbGlhc2VkUHJvcGVy
dHkucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdTZXR0aW5nIGFsaWFzIFwnJyArIGtleU5hbWUgKyAnXCcgb24g
c2VsZicsIHRoaXMuYWx0S2V5ICE9PSBrZXlOYW1lKTsKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFs
TWV0YS5tZXRhKG9iaik7CisgICAgaWYgKG0ucGVla1dhdGNoaW5nKGtleU5hbWUpKSB7CisgICAg
ICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBr
ZXlOYW1lLCBtKTsKKyAgICB9CisgIH07CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3RvdHlwZS50
ZWFyZG93biA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKKyAgICB2YXIgbSA9IF9lbWJlck1l
dGFsTWV0YS5tZXRhKG9iaik7CisgICAgaWYgKG0ucGVla1dhdGNoaW5nKGtleU5hbWUpKSB7Cisg
ICAgICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLnJlbW92ZURlcGVuZGVudEtleXModGhpcywg
b2JqLCBrZXlOYW1lLCBtKTsKKyAgICB9CisgIH07CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3Rv
dHlwZS5yZWFkT25seSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnNldCA9IEFsaWFzZWRQcm9w
ZXJ0eV9yZWFkT25seVNldDsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworICBmdW5jdGlvbiBB
bGlhc2VkUHJvcGVydHlfcmVhZE9ubHlTZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIHRo
cm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0Nhbm5vdCBzZXQgcmVhZC1vbmx5IHBy
b3BlcnR5IFwnJyArIGtleU5hbWUgKyAnXCcgb24gb2JqZWN0OiAnICsgX2VtYmVyTWV0YWxVdGls
cy5pbnNwZWN0KG9iaikpOworICB9CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3RvdHlwZS5vbmVX
YXkgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5zZXQgPSBBbGlhc2VkUHJvcGVydHlfb25lV2F5
U2V0OworICAgIHJldHVybiB0aGlzOworICB9OworCisgIGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0
eV9vbmVXYXlTZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIF9lbWJlck1ldGFsUHJvcGVy
dGllcy5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwpOworICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldC5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgIH0KKworICAv
LyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEVtYmVyIERhdGEuCisgIEFsaWFzZWRQcm9w
ZXJ0eS5wcm90b3R5cGUuX21ldGEgPSB1bmRlZmluZWQ7CisgIEFsaWFzZWRQcm9wZXJ0eS5wcm90
b3R5cGUubWV0YSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5
cGUubWV0YTsKK30pOworZW5pZmVkKCJlbWJlci1tZXRhbC9hc3NpZ24iLCBbImV4cG9ydHMiXSwg
ZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoqCisgICAgQ29weSBwcm9wZXJ0aWVzIGZyb20gYSBz
b3VyY2Ugb2JqZWN0IHRvIGEgdGFyZ2V0IG9iamVjdC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciBhID0ge2ZpcnN0OiAnWWVodWRhJ307CisgICAgdmFyIGIgPSB7bGFzdDogJ0thdHon
fTsKKyAgICB2YXIgYyA9IHtjb21wYW55OiAnVGlsZGUgSW5jLid9OworICAgIEVtYmVyLmFzc2ln
bihhLCBiLCBjKTsgLy8gYSA9PT0ge2ZpcnN0OiAnWWVodWRhJywgbGFzdDogJ0thdHonLCBjb21w
YW55OiAnVGlsZGUgSW5jLid9LCBiID09PSB7bGFzdDogJ0thdHonfSwgYyA9PT0ge2NvbXBhbnk6
ICdUaWxkZSBJbmMuJ30KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhc3NpZ24KKyAgICBAZm9y
IEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9yaWdpbmFsIFRoZSBvYmplY3QgdG8gYXNzaWdu
IGludG8KKyAgICBAcGFyYW0ge09iamVjdH0gLi4uYXJncyBUaGUgb2JqZWN0cyB0byBjb3B5IHBy
b3BlcnRpZXMgZnJvbQorICAgIEByZXR1cm4ge09iamVjdH0KKyAgICBAcHVibGljCisgICovCisg
ICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBhc3NpZ247CisKKyAgZnVuY3Rp
b24gYXNzaWduKG9yaWdpbmFsKSB7CisgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5
IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5
XTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsg
aSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJnc1tpXTsKKyAgICAgIGlmICghYXJnKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgdXBkYXRlcyA9IE9iamVjdC5rZXlz
KGFyZyk7CisKKyAgICAgIGZvciAodmFyIF9pID0gMCwgX2wgPSB1cGRhdGVzLmxlbmd0aDsgX2kg
PCBfbDsgX2krKykgeworICAgICAgICB2YXIgcHJvcCA9IHVwZGF0ZXNbX2ldOworICAgICAgICBv
cmlnaW5hbFtwcm9wXSA9IGFyZ1twcm9wXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4g
b3JpZ2luYWw7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9iaW5kaW5nJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1l
dGFsL3J1bl9sb29wJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAn
ZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFs
L3BhdGhfY2FjaGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVy
TWV0YWxMb2dnZXIsIF9lbWJlck1ldGFsUnVuX2xvb3AsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxV
dGlscywgX2VtYmVyTWV0YWxFdmVudHMsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1ldGFs
UGF0aF9jYWNoZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5iaW5kID0gYmluZDsK
KworICAvLyBFUzZUT0RPOiB3aGVyZSBpcyBFbWJlci5sb29rdXAgZGVmaW5lZD8KKyAgLyoqCisg
IEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
KyAgLy8gQ09OU1RBTlRTCisgIC8vCisKKyAgLyoqCisgICAgRGVidWcgcGFyYW1ldGVyIHlvdSBj
YW4gdHVybiBvbi4gVGhpcyB3aWxsIGxvZyBhbGwgYmluZGluZ3MgdGhhdCBmaXJlIHRvCisgICAg
dGhlIGNvbnNvbGUuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gY29kZS4g
Tm90ZSB0aGF0IHlvdQorICAgIGNhbiBhbHNvIGVuYWJsZSB0aGlzIGZyb20gdGhlIGNvbnNvbGUg
b3IgdGVtcG9yYXJpbHkuCisgIAorICAgIEBwcm9wZXJ0eSBMT0dfQklORElOR1MKKyAgICBAZm9y
IEVtYmVyCisgICAgQHR5cGUgQm9vbGVhbgorICAgIEBkZWZhdWx0IGZhbHNlCisgICAgQHB1Ymxp
YworICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5MT0dfQklORElOR1MgPSBmYWxzZSB8
fCAhIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5MT0dfQklORElOR1M7CisKKyAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
ICAvLyBCSU5ESU5HCisgIC8vCisKKyAgZnVuY3Rpb24gQmluZGluZyh0b1BhdGgsIGZyb21QYXRo
KSB7CisgICAgLy8gQ29uZmlndXJhdGlvbgorICAgIHRoaXMuX2Zyb20gPSBmcm9tUGF0aDsKKyAg
ICB0aGlzLl90byA9IHRvUGF0aDsKKyAgICB0aGlzLl9vbmVXYXkgPSB1bmRlZmluZWQ7CisKKyAg
ICAvLyBTdGF0ZQorICAgIHRoaXMuX2RpcmVjdGlvbiA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9y
ZWFkeVRvU3luYyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9mcm9tT2JqID0gdW5kZWZpbmVkOwor
ICAgIHRoaXMuX2Zyb21QYXRoID0gdW5kZWZpbmVkOworICAgIHRoaXMuX3RvT2JqID0gdW5kZWZp
bmVkOworICB9CisKKyAgLyoqCisgICAgQGNsYXNzIEJpbmRpbmcKKyAgICBAbmFtZXNwYWNlIEVt
YmVyCisgICAgQHB1YmxpYworICAqLworCisgIEJpbmRpbmcucHJvdG90eXBlID0geworICAgIC8q
KgorICAgICAgVGhpcyBjb3BpZXMgdGhlIEJpbmRpbmcgc28gaXQgY2FuIGJlIGNvbm5lY3RlZCB0
byBhbm90aGVyIG9iamVjdC4KKyAgICAgICBAbWV0aG9kIGNvcHkKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgY29weTogZnVu
Y3Rpb24gKCkgeworICAgICAgdmFyIGNvcHkgPSBuZXcgQmluZGluZyh0aGlzLl90bywgdGhpcy5f
ZnJvbSk7CisgICAgICBpZiAodGhpcy5fb25lV2F5KSB7CisgICAgICAgIGNvcHkuX29uZVdheSA9
IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gY29weTsKKyAgICB9LAorCisgICAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
ICAgIC8vIENPTkZJRworICAgIC8vCisKKyAgICAvKioKKyAgICAgIFRoaXMgd2lsbCBzZXQgYGZy
b21gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2lsbCBub3QKKyAg
ICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4gYWN0dWFsIG9i
amVjdCB1bnRpbCB5b3UKKyAgICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisgICAgICAgVGhlIGJp
bmRpbmcgd2lsbCBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSBwYXRoIHN0YXJ0aW5nIGF0IHRoZSBy
b290IG9iamVjdAorICAgICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRp
bmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKKyAgICAgIGBnZXQoKWAgLSBzZWUgdGhh
dCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgQG1ldGhvZCBmcm9tCisgICAg
ICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byBjb25uZWN0IHRvLgor
ICAgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCisgICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBmcm9tOiBmdW5jdGlvbiAocGF0aCkgeworICAgICAgdGhpcy5fZnJvbSA9IHBhdGg7
CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGlzIHdpbGwg
c2V0IHRoZSBgdG9gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2ls
bCBub3QKKyAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4g
YWN0dWFsIG9iamVjdCB1bnRpbCB5b3UKKyAgICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisgICAg
ICAgVGhlIGJpbmRpbmcgd2lsbCBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSBwYXRoIHN0YXJ0aW5n
IGF0IHRoZSByb290IG9iamVjdAorICAgICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAg
dGhlIGJpbmRpbmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKKyAgICAgIGBnZXQoKWAg
LSBzZWUgdGhhdCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgQG1ldGhvZCB0
bworICAgICAgQHBhcmFtIHtTdHJpbmd8VHVwbGV9IHBhdGggQSBwcm9wZXJ0eSBwYXRoIG9yIHR1
cGxlLgorICAgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICB0bzogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHRoaXMuX3RvID0gcGF0
aDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIENvbmZpZ3Vy
ZXMgdGhlIGJpbmRpbmcgYXMgb25lIHdheS4gQSBvbmUtd2F5IGJpbmRpbmcgd2lsbCByZWxheSBj
aGFuZ2VzCisgICAgICBvbiB0aGUgYGZyb21gIHNpZGUgdG8gdGhlIGB0b2Agc2lkZSwgYnV0IG5v
dCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gVGhpcworICAgICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hh
bmdlIHRoZSBgdG9gIHNpZGUgZGlyZWN0bHksIHRoZSBgZnJvbWAgc2lkZSBtYXkgaGF2ZQorICAg
ICAgYSBkaWZmZXJlbnQgdmFsdWUuCisgICAgICAgQG1ldGhvZCBvbmVXYXkKKyAgICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgb25l
V2F5OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9vbmVXYXkgPSB0cnVlOworICAgICAgcmV0
dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCB0b1N0cmluZworICAg
ICAgQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYmluZGluZworICAg
ICAgQHB1YmxpYworICAgICovCisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBvbmVXYXkgPSB0aGlzLl9vbmVXYXkgPyAnW29uZVdheV0nIDogJyc7CisgICAgICByZXR1cm4g
J0VtYmVyLkJpbmRpbmc8JyArIF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKSArICc+KCcg
KyB0aGlzLl9mcm9tICsgJyAtPiAnICsgdGhpcy5fdG8gKyAnKScgKyBvbmVXYXk7CisgICAgfSwK
KworICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgICAvLyBDT05ORUNUIEFORCBTWU5DCisgICAgLy8KKworICAgIC8qKgor
ICAgICAgQXR0ZW1wdHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBp
dCBjYW4gcmVjZWl2ZSBhbmQgcmVsYXkKKyAgICAgIGNoYW5nZXMuIFRoaXMgbWV0aG9kIHdpbGwg
cmFpc2UgYW4gZXhjZXB0aW9uIGlmIHlvdSBoYXZlIG5vdCBzZXQgdGhlCisgICAgICBmcm9tL3Rv
IHByb3BlcnRpZXMgeWV0LgorICAgICAgIEBtZXRob2QgY29ubmVjdAorICAgICAgQHBhcmFtIHtP
YmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3QgZm9yIHRoaXMgYmluZGluZy4KKyAgICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgY29u
bmVjdDogZnVuY3Rpb24gKG9iaikgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ011
c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScsICEhb2Jq
KTsKKworICAgICAgdmFyIGZyb21PYmogPSB1bmRlZmluZWQsCisgICAgICAgICAgZnJvbVBhdGgg
PSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIElmIHRoZSBiaW5kaW5nJ3MgImZyb20iIHBhdGggY291
bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBnbG9iYWwsIHZlcmlmeQorICAgICAgLy8gd2hldGhlciB0
aGUgcGF0aCByZWZlcnMgdG8gYSBnbG9iYWwgb3Igbm90IGJ5IGNvbnN1bHRpbmcgYEVtYmVyLmxv
b2t1cGAuCisgICAgICBpZiAoX2VtYmVyTWV0YWxQYXRoX2NhY2hlLmlzR2xvYmFsUGF0aCh0aGlz
Ll9mcm9tKSkgeworICAgICAgICB2YXIgX25hbWUgPSBfZW1iZXJNZXRhbFBhdGhfY2FjaGUuZ2V0
Rmlyc3RLZXkodGhpcy5fZnJvbSk7CisgICAgICAgIHZhciBwb3NzaWJsZUdsb2JhbCA9IF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0Lmxvb2t1cFtfbmFtZV07CisKKyAgICAgICAgaWYgKHBvc3NpYmxl
R2xvYmFsKSB7CisgICAgICAgICAgZnJvbU9iaiA9IHBvc3NpYmxlR2xvYmFsOworICAgICAgICAg
IGZyb21QYXRoID0gX2VtYmVyTWV0YWxQYXRoX2NhY2hlLmdldFRhaWxQYXRoKHRoaXMuX2Zyb20p
OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmcm9tT2JqID09PSB1bmRlZmluZWQp
IHsKKyAgICAgICAgZnJvbU9iaiA9IG9iajsKKyAgICAgICAgZnJvbVBhdGggPSB0aGlzLl9mcm9t
OworICAgICAgfQorCisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50cnlTZXQob2JqLCB0
aGlzLl90bywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGZyb21PYmosIGZyb21QYXRoKSk7
CisKKyAgICAgIC8vIEFkZCBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHRvIGJlIG5vdGlmaWVk
IHdoZW4gdGhlIGJpbmRpbmcgc2hvdWxkIGJlIHVwZGF0ZWQuCisgICAgICBfZW1iZXJNZXRhbE9i
c2VydmVyLmFkZE9ic2VydmVyKGZyb21PYmosIGZyb21QYXRoLCB0aGlzLCAnZnJvbURpZENoYW5n
ZScpOworCisgICAgICAvLyBJZiB0aGUgYmluZGluZyBpcyBhIHR3by13YXkgYmluZGluZywgYWxz
byBzZXQgdXAgYW4gb2JzZXJ2ZXIgb24gdGhlIHRhcmdldC4KKyAgICAgIGlmICghdGhpcy5fb25l
V2F5KSB7CisgICAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIob2JqLCB0aGlz
Ll90bywgdGhpcywgJ3RvRGlkQ2hhbmdlJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFs
RXZlbnRzLmFkZExpc3RlbmVyKG9iaiwgJ3dpbGxEZXN0cm95JywgdGhpcywgJ2Rpc2Nvbm5lY3Qn
KTsKKworICAgICAgdGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOworICAgICAgdGhpcy5fZnJvbU9i
aiA9IGZyb21PYmo7CisgICAgICB0aGlzLl9mcm9tUGF0aCA9IGZyb21QYXRoOworICAgICAgdGhp
cy5fdG9PYmogPSBvYmo7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIERpc2Nvbm5lY3RzIHRoZSBiaW5kaW5nIGluc3RhbmNlLiBDaGFuZ2VzIHdpbGwgbm8g
bG9uZ2VyIGJlIHJlbGF5ZWQuIFlvdQorICAgICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNh
bGwgdGhpcyBtZXRob2QuCisgICAgICAgQG1ldGhvZCBkaXNjb25uZWN0CisgICAgICBAcmV0dXJu
IHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGRpc2Nv
bm5lY3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdNdXN0
IHBhc3MgYSB2YWxpZCBvYmplY3QgdG8gRW1iZXIuQmluZGluZy5kaXNjb25uZWN0KCknLCAhIXRo
aXMuX3RvT2JqKTsKKworICAgICAgLy8gUmVtb3ZlIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3Qg
c28gd2UncmUgbm8gbG9uZ2VyIG5vdGlmaWVkIG9mCisgICAgICAvLyBjaGFuZ2VzIHRoYXQgc2hv
dWxkIHVwZGF0ZSBiaW5kaW5ncy4KKyAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2Jz
ZXJ2ZXIodGhpcy5fZnJvbU9iaiwgdGhpcy5fZnJvbVBhdGgsIHRoaXMsICdmcm9tRGlkQ2hhbmdl
Jyk7CisKKyAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2Jz
ZXJ2ZXIgZnJvbSB0aGUgdGFyZ2V0IGFzIHdlbGwuCisgICAgICBpZiAoIXRoaXMuX29uZVdheSkg
eworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2VydmVyKHRoaXMuX3RvT2Jq
LCB0aGlzLl90bywgdGhpcywgJ3RvRGlkQ2hhbmdlJyk7CisgICAgICB9CisKKyAgICAgIHRoaXMu
X3JlYWR5VG9TeW5jID0gZmFsc2U7IC8vIERpc2FibGUgc2NoZWR1bGVkIHN5bmNzLi4uCisgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIFBSSVZBVEUKKyAgICAv
LworCisgICAgLyogQ2FsbGVkIHdoZW4gdGhlIGZyb20gc2lkZSBjaGFuZ2VzLiAqLworICAgIGZy
b21EaWRDaGFuZ2U6IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgIHRoaXMuX3NjaGVkdWxlU3lu
YygnZndkJyk7CisgICAgfSwKKworICAgIC8qIENhbGxlZCB3aGVuIHRoZSB0byBzaWRlIGNoYW5n
ZXMuICovCisgICAgdG9EaWRDaGFuZ2U6IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgIHRoaXMu
X3NjaGVkdWxlU3luYygnYmFjaycpOworICAgIH0sCisKKyAgICBfc2NoZWR1bGVTeW5jOiBmdW5j
dGlvbiAoZGlyKSB7CisgICAgICB2YXIgZXhpc3RpbmdEaXIgPSB0aGlzLl9kaXJlY3Rpb247CisK
KyAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgc2NoZWR1bGVkIHRoZSBiaW5kaW5nIHlldCwgc2NoZWR1
bGUgaXQuCisgICAgICBpZiAoZXhpc3RpbmdEaXIgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBf
ZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUoJ3N5bmMnLCB0aGlzLCAnX3N5bmMn
KTsKKyAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gZGlyOworICAgICAgfQorCisgICAgICAvLyBJ
ZiBib3RoIGEgJ2JhY2snIGFuZCAnZndkJyBzeW5jIGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhl
IHNhbWUgb2JqZWN0LAorICAgICAgLy8gZGVmYXVsdCB0byBhICdmd2QnIHN5bmMgc28gdGhhdCBp
dCByZW1haW5zIGRldGVybWluaXN0aWMuCisgICAgICBpZiAoZXhpc3RpbmdEaXIgPT09ICdiYWNr
JyAmJiBkaXIgPT09ICdmd2QnKSB7CisgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9ICdmd2QnOwor
ICAgICAgfQorICAgIH0sCisKKyAgICBfc3luYzogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGxv
ZyA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkxPR19CSU5ESU5HUzsKKworICAgICAgdmFyIHRv
T2JqID0gdGhpcy5fdG9PYmo7CisKKyAgICAgIC8vIERvbid0IHN5bmNocm9uaXplIGRlc3Ryb3ll
ZCBvYmplY3RzIG9yIGRpc2Nvbm5lY3RlZCBiaW5kaW5ncy4KKyAgICAgIGlmICh0b09iai5pc0Rl
c3Ryb3llZCB8fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAg
fQorCisgICAgICAvLyBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmluZGluZyBmb3IgdGhlIG9i
amVjdCB3ZSBhcmUKKyAgICAgIC8vIHN5bmNocm9uaXppbmcgZnJvbS4KKyAgICAgIHZhciBkaXJl
Y3Rpb24gPSB0aGlzLl9kaXJlY3Rpb247CisKKyAgICAgIHZhciBmcm9tT2JqID0gdGhpcy5fZnJv
bU9iajsKKyAgICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb21QYXRoOworCisgICAgICB0aGlz
Ll9kaXJlY3Rpb24gPSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIElmIHdlJ3JlIHN5bmNocm9uaXpp
bmcgZnJvbSB0aGUgcmVtb3RlIG9iamVjdC4uLgorICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Z3
ZCcpIHsKKyAgICAgICAgdmFyIGZyb21WYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dChmcm9tT2JqLCBmcm9tUGF0aCk7CisgICAgICAgIGlmIChsb2cpIHsKKyAgICAgICAgICBfZW1i
ZXJNZXRhbExvZ2dlci5kZWZhdWx0LmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwgJy0+JywgZnJv
bVZhbHVlLCBmcm9tT2JqKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fb25lV2F5KSB7
CisgICAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQudHJ5U2V0KHRvT2JqLCB0aGlzLl90
bywgZnJvbVZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfZW1iZXJNZXRhbE9i
c2VydmVyLl9zdXNwZW5kT2JzZXJ2ZXIodG9PYmosIHRoaXMuX3RvLCB0aGlzLCAndG9EaWRDaGFu
Z2UnLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50
cnlTZXQodG9PYmosIHRoaXMuX3RvLCBmcm9tVmFsdWUpOworICAgICAgICAgIH0pOworICAgICAg
ICB9CisgICAgICAgIC8vIElmIHdlJ3JlIHN5bmNocm9uaXppbmcgKnRvKiB0aGUgcmVtb3RlIG9i
amVjdC4KKyAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnYmFjaycpIHsKKyAgICAgICAg
ICB2YXIgdG9WYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0b09iaiwgdGhpcy5f
dG8pOworICAgICAgICAgIGlmIChsb2cpIHsKKyAgICAgICAgICAgIF9lbWJlck1ldGFsTG9nZ2Vy
LmRlZmF1bHQubG9nKCcgJywgdGhpcy50b1N0cmluZygpLCAnPC0nLCB0b1ZhbHVlLCB0b09iaik7
CisgICAgICAgICAgfQorICAgICAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNl
cnZlcihmcm9tT2JqLCBmcm9tUGF0aCwgdGhpcywgJ2Zyb21EaWRDaGFuZ2UnLCBmdW5jdGlvbiAo
KSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50cnlTZXQoZnJvbU9iaiwg
ZnJvbVBhdGgsIHRvVmFsdWUpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisg
IH07CisKKyAgZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKHRvLCBmcm9tKSB7CisgICAgZm9yICh2
YXIga2V5IGluIGZyb20pIHsKKyAgICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGtleSkpIHsK
KyAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBt
aXhpblByb3BlcnRpZXMoQmluZGluZywgeworCisgICAgLyoKKyAgICAgIFNlZSBgRW1iZXIuQmlu
ZGluZy5mcm9tYC4KKyAgICAgICBAbWV0aG9kIGZyb20KKyAgICAgIEBzdGF0aWMKKyAgICAqLwor
ICAgIGZyb206IGZ1bmN0aW9uIChmcm9tKSB7CisgICAgICB2YXIgQyA9IHRoaXM7CisgICAgICBy
ZXR1cm4gbmV3IEModW5kZWZpbmVkLCBmcm9tKTsKKyAgICB9LAorCisgICAgLyoKKyAgICAgIFNl
ZSBgRW1iZXIuQmluZGluZy50b2AuCisgICAgICAgQG1ldGhvZCB0bworICAgICAgQHN0YXRpYwor
ICAgICovCisgICAgdG86IGZ1bmN0aW9uICh0bykgeworICAgICAgdmFyIEMgPSB0aGlzOworICAg
ICAgcmV0dXJuIG5ldyBDKHRvLCB1bmRlZmluZWQpOworICAgIH0KKyAgfSk7CisgIC8qKgorICAg
IEFuIGBFbWJlci5CaW5kaW5nYCBjb25uZWN0cyB0aGUgcHJvcGVydGllcyBvZiB0d28gb2JqZWN0
cyBzbyB0aGF0IHdoZW5ldmVyCisgICAgdGhlIHZhbHVlIG9mIG9uZSBwcm9wZXJ0eSBjaGFuZ2Vz
LCB0aGUgb3RoZXIgcHJvcGVydHkgd2lsbCBiZSBjaGFuZ2VkIGFsc28uCisgIAorICAgICMjIEF1
dG9tYXRpYyBDcmVhdGlvbiBvZiBCaW5kaW5ncyB3aXRoIGAvXipCaW5kaW5nL2AtbmFtZWQgUHJv
cGVydGllcy4KKyAgCisgICAgWW91IGRvIG5vdCB1c3VhbGx5IGNyZWF0ZSBCaW5kaW5nIG9iamVj
dHMgZGlyZWN0bHkgYnV0IGluc3RlYWQgZGVzY3JpYmUKKyAgICBiaW5kaW5ncyBpbiB5b3VyIGNs
YXNzIG9yIG9iamVjdCBkZWZpbml0aW9uIHVzaW5nIGF1dG9tYXRpYyBiaW5kaW5nCisgICAgZGV0
ZWN0aW9uLgorICAKKyAgICBQcm9wZXJ0aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5nYCBzdWZmaXgg
d2lsbCBiZSBjb252ZXJ0ZWQgdG8gYEVtYmVyLkJpbmRpbmdgCisgICAgaW5zdGFuY2VzLiBUaGUg
dmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEg
cGF0aAorICAgIHRvIGFub3RoZXIgb2JqZWN0IG9yIGEgY3VzdG9tIGJpbmRpbmcgaW5zdGFuY2Ug
Y3JlYXRlZCB1c2luZyBCaW5kaW5nIGhlbHBlcnMKKyAgICAoc2VlICJPbmUgV2F5IEJpbmRpbmdz
Iik6CisgIAorICAgIGBgYAorICAgIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250cm9sbGVy
LnRpdGxlIgorICAgIGBgYAorICAKKyAgICBUaGlzIHdpbGwgY3JlYXRlIGEgYmluZGluZyBmcm9t
IGBNeUFwcC5zb21lQ29udHJvbGxlci50aXRsZWAgdG8gdGhlIGB2YWx1ZWAKKyAgICBwcm9wZXJ0
eSBvZiB5b3VyIG9iamVjdCBpbnN0YW5jZSBhdXRvbWF0aWNhbGx5LiBOb3cgdGhlIHR3byB2YWx1
ZXMgd2lsbCBiZQorICAgIGtlcHQgaW4gc3luYy4KKyAgCisgICAgIyMgT25lIFdheSBCaW5kaW5n
cworICAKKyAgICBPbmUgZXNwZWNpYWxseSB1c2VmdWwgYmluZGluZyBjdXN0b21pemF0aW9uIHlv
dSBjYW4gdXNlIGlzIHRoZSBgb25lV2F5KClgCisgICAgaGVscGVyLiBUaGlzIGhlbHBlciB0ZWxs
cyBFbWJlciB0aGF0IHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluCisgICAgcmVjZWl2aW5nIGNo
YW5nZXMgb24gdGhlIG9iamVjdCB5b3UgYXJlIGJpbmRpbmcgZnJvbS4gRm9yIGV4YW1wbGUsIGlm
IHlvdQorICAgIGFyZSBiaW5kaW5nIHRvIGEgcHJlZmVyZW5jZSBhbmQgeW91IHdhbnQgdG8gYmUg
bm90aWZpZWQgaWYgdGhlIHByZWZlcmVuY2UKKyAgICBoYXMgY2hhbmdlZCwgYnV0IHlvdXIgb2Jq
ZWN0IHdpbGwgbm90IGJlIGNoYW5naW5nIHRoZSBwcmVmZXJlbmNlIGl0c2VsZiwgeW91CisgICAg
Y291bGQgZG86CisgIAorICAgIGBgYAorICAgIGJpZ1RpdGxlc0JpbmRpbmc6IEVtYmVyLkJpbmRp
bmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzIikKKyAgICBg
YGAKKyAgCisgICAgVGhpcyB3YXkgaWYgdGhlIHZhbHVlIG9mIGBNeUFwcC5wcmVmZXJlbmNlc0Nv
bnRyb2xsZXIuYmlnVGl0bGVzYCBjaGFuZ2VzIHRoZQorICAgIGBiaWdUaXRsZXNgIHByb3BlcnR5
IG9mIHlvdXIgb2JqZWN0IHdpbGwgY2hhbmdlIGFsc28uIEhvd2V2ZXIsIGlmIHlvdQorICAgIGNo
YW5nZSB0aGUgdmFsdWUgb2YgeW91ciBgYmlnVGl0bGVzYCBwcm9wZXJ0eSwgaXQgd2lsbCBub3Qg
dXBkYXRlIHRoZQorICAgIGBwcmVmZXJlbmNlc0NvbnRyb2xsZXJgLgorICAKKyAgICBPbmUgd2F5
IGJpbmRpbmdzIGFyZSBhbG1vc3QgdHdpY2UgYXMgZmFzdCB0byBzZXR1cCBhbmQgdHdpY2UgYXMg
ZmFzdCB0bworICAgIGV4ZWN1dGUgYmVjYXVzZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3b3Jy
eSBhYm91dCBjaGFuZ2VzIHRvIG9uZSBzaWRlLgorICAKKyAgICBZb3Ugc2hvdWxkIGNvbnNpZGVy
IHVzaW5nIG9uZSB3YXkgYmluZGluZ3MgYW55dGltZSB5b3UgaGF2ZSBhbiBvYmplY3QgdGhhdAor
ICAgIG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5kIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNo
YW5nZSBhIHByb3BlcnR5OyBvbmx5CisgICAgdG8gbW9uaXRvciBpdCBmb3IgY2hhbmdlcyAoc3Vj
aCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuCisgIAorICAgICMjIEFkZGluZyBCaW5kaW5ncyBN
YW51YWxseQorICAKKyAgICBBbGwgb2YgdGhlIGV4YW1wbGVzIGFib3ZlIHNob3cgeW91IGhvdyB0
byBjb25maWd1cmUgYSBjdXN0b20gYmluZGluZywgYnV0IHRoZQorICAgIHJlc3VsdCBvZiB0aGVz
ZSBjdXN0b21pemF0aW9ucyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkg
YWN0aXZlCisgICAgQmluZGluZyBpbnN0YW5jZS4gVGhlIGJpbmRpbmcgd2lsbCBhY3R1YWxseSBi
ZWNvbWUgYWN0aXZlIG9ubHkgd2hlbiB5b3UKKyAgICBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IHRo
ZSBiaW5kaW5nIGJlbG9uZ3MgdG8uIEl0IGlzIHVzZWZ1bCwgaG93ZXZlciwgdG8KKyAgICB1bmRl
cnN0YW5kIHdoYXQgYWN0dWFsbHkgaGFwcGVucyB3aGVuIHRoZSBiaW5kaW5nIGlzIGFjdGl2YXRl
ZC4KKyAgCisgICAgRm9yIGEgYmluZGluZyB0byBmdW5jdGlvbiBpdCBtdXN0IGhhdmUgYXQgbGVh
c3QgYSBgZnJvbWAgcHJvcGVydHkgYW5kIGEgYHRvYAorICAgIHByb3BlcnR5LiBUaGUgYGZyb21g
IHByb3BlcnR5IHBhdGggcG9pbnRzIHRvIHRoZSBvYmplY3Qva2V5IHRoYXQgeW91IHdhbnQgdG8K
KyAgICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2AgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9r
ZXkgeW91IHdhbnQgdG8gYmluZCB0by4KKyAgCisgICAgV2hlbiB5b3UgZGVmaW5lIGEgY3VzdG9t
IGJpbmRpbmcsIHlvdSBhcmUgdXN1YWxseSBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0eQorICAgIHlv
dSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWVg
IGluIHRoZSBleGFtcGxlcworICAgIGFib3ZlKS4gV2hlbiB5b3VyIG9iamVjdCBpcyBjcmVhdGVk
LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXNzaWduIHRoZSB2YWx1ZQorICAgIHlvdSB3YW50IHRv
IGJpbmQgYHRvYCBiYXNlZCBvbiB0aGUgbmFtZSBvZiB5b3VyIGJpbmRpbmcga2V5LiBJbiB0aGUK
KyAgICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9iamVjdHMgd2lsbCBlZmZl
Y3RpdmVseSBjYWxsCisgICAgc29tZXRoaW5nIGxpa2UgdGhpcyBvbiB5b3VyIGJpbmRpbmc6Cisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBiaW5kaW5nID0gRW1iZXIuQmluZGluZy5mcm9tKCJ2
YWx1ZUJpbmRpbmciKS50bygidmFsdWUiKTsKKyAgICBgYGAKKyAgCisgICAgVGhpcyBjcmVhdGVz
IGEgbmV3IGJpbmRpbmcgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHRlbXBsYXRlIHlvdSBwcm92aWRl
LCBhbmQKKyAgICBzZXRzIHRoZSB0byBwYXRoIHRvIHRoZSBgdmFsdWVgIHByb3BlcnR5IG9mIHRo
ZSBuZXcgb2JqZWN0LiBOb3cgdGhhdCB0aGUKKyAgICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3Vy
ZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBpdCBzaW1wbHkgbmVlZHMgdG8gYmUKKyAgICBj
b25uZWN0ZWQgdG8gYmVjb21lIGFjdGl2ZS4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjb25u
ZWN0KClgIG1ldGhvZDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGJpbmRpbmcuY29ubmVj
dCh0aGlzKTsKKyAgICBgYGAKKyAgCisgICAgTm90ZSB0aGF0IHdoZW4geW91IGNvbm5lY3QgYSBi
aW5kaW5nIHlvdSBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgaXQgdG8gYmUKKyAgICBjb25uZWN0
ZWQgdG8uIFRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBmb3IgYm90aCB0aGUg
ZnJvbSBhbmQKKyAgICB0byBzaWRlIG9mIHRoZSBiaW5kaW5nIHdoZW4gaW5zcGVjdGluZyByZWxh
dGl2ZSBwYXRocy4gVGhpcyBhbGxvd3MgdGhlCisgICAgYmluZGluZyB0byBiZSBhdXRvbWF0aWNh
bGx5IGluaGVyaXRlZCBieSBzdWJjbGFzc2VkIG9iamVjdHMgYXMgd2VsbC4KKyAgCisgICAgVGhp
cyBhbHNvIGFsbG93cyB5b3UgdG8gYmluZCBiZXR3ZWVuIG9iamVjdHMgdXNpbmcgdGhlIHBhdGhz
IHlvdSBkZWNsYXJlIGluCisgICAgYGZyb21gIGFuZCBgdG9gOgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gRXhhbXBsZSAxCisgICAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcuZnJvbSgi
QXBwLnNvbWVPYmplY3QudmFsdWUiKS50bygidmFsdWUiKTsKKyAgICBiaW5kaW5nLmNvbm5lY3Qo
dGhpcyk7CisgIAorICAgIC8vIEV4YW1wbGUgMgorICAgIGJpbmRpbmcgPSBFbWJlci5CaW5kaW5n
LmZyb20oInBhcmVudFZpZXcudmFsdWUiKS50bygiQXBwLnNvbWVPYmplY3QudmFsdWUiKTsKKyAg
ICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7CisgICAgYGBgCisgIAorICAgIE5vdyB0aGF0IHRoZSBi
aW5kaW5nIGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBvYnNlcnZlIGJvdGggdGhlIGZyb20gYW5kIHRv
IHNpZGUKKyAgICBhbmQgcmVsYXkgY2hhbmdlcy4KKyAgCisgICAgSWYgeW91IGV2ZXIgbmVlZGVk
IHRvIGRvIHNvICh5b3UgYWxtb3N0IG5ldmVyIHdpbGwsIGJ1dCBpdCBpcyB1c2VmdWwgdG8KKyAg
ICB1bmRlcnN0YW5kIHRoaXMgYW55d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBh
Y3RpdmUgYmluZGluZyBieQorICAgIHVzaW5nIHRoZSBgRW1iZXIuYmluZCgpYCBoZWxwZXIgbWV0
aG9kLiAoVGhpcyBpcyB0aGUgc2FtZSBtZXRob2QgdXNlZCBieQorICAgIHRvIHNldHVwIHlvdXIg
YmluZGluZ3Mgb24gb2JqZWN0cyk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5i
aW5kKE15QXBwLmFub3RoZXJPYmplY3QsICJ2YWx1ZSIsICJNeUFwcC5zb21lQ29udHJvbGxlci52
YWx1ZSIpOworICAgIGBgYAorICAKKyAgICBCb3RoIG9mIHRoZXNlIGNvZGUgZnJhZ21lbnRzIGhh
dmUgdGhlIHNhbWUgZWZmZWN0IGFzIGRvaW5nIHRoZSBtb3N0IGZyaWVuZGx5CisgICAgZm9ybSBv
ZiBiaW5kaW5nIGNyZWF0aW9uIGxpa2Ugc286CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBN
eUFwcC5hbm90aGVyT2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgICB2YWx1ZUJp
bmRpbmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci52YWx1ZSIsCisgIAorICAgICAgLy8gT1RIRVIg
Q09ERSBGT1IgVEhJUyBPQkpFQ1QuLi4KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgRW1iZXIn
cyBidWlsdCBpbiBiaW5kaW5nIGNyZWF0aW9uIG1ldGhvZCBtYWtlcyBpdCBlYXN5IHRvIGF1dG9t
YXRpY2FsbHkKKyAgICBjcmVhdGUgYmluZGluZ3MgZm9yIHlvdS4gWW91IHNob3VsZCBhbHdheXMg
dXNlIHRoZSBoaWdoZXN0LWxldmVsIEFQSXMKKyAgICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVu
ZGVyc3RhbmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCisgIAorICAgIEBjbGFzcyBCaW5kaW5n
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAcHVibGlj
CisgICovCisgIC8vIEVtYmVyLkJpbmRpbmcgPSBCaW5kaW5nOyBFUzZUT0RPOiB3aGVyZSB0byBw
dXQgdGhpcz8KKworICAvKioKKyAgICBHbG9iYWwgaGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBu
ZXcgYmluZGluZy4gSnVzdCBwYXNzIHRoZSByb290IG9iamVjdAorICAgIGFsb25nIHdpdGggYSBg
dG9gIGFuZCBgZnJvbWAgcGF0aCB0byBjcmVhdGUgYW5kIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisg
IAorICAgIEBtZXRob2QgYmluZAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
b2JqIFRoZSByb290IG9iamVjdCBvZiB0aGUgdHJhbnNmb3JtLgorICAgIEBwYXJhbSB7U3RyaW5n
fSB0byBUaGUgcGF0aCB0byB0aGUgJ3RvJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgorICAgICAgTXVz
dCBiZSByZWxhdGl2ZSB0byBvYmouCisgICAgQHBhcmFtIHtTdHJpbmd9IGZyb20gVGhlIHBhdGgg
dG8gdGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgorICAgICAgTXVzdCBiZSByZWxhdGl2
ZSB0byBvYmogb3IgYSBnbG9iYWwgcGF0aC4KKyAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBi
aW5kaW5nIGluc3RhbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGJpbmQob2Jq
LCB0bywgZnJvbSkgeworICAgIHJldHVybiBuZXcgQmluZGluZyh0bywgZnJvbSkuY29ubmVjdChv
YmopOworICB9CisKKyAgZXhwb3J0cy5CaW5kaW5nID0gQmluZGluZzsKK30pOworLy8gRW1iZXIu
TE9HX0JJTkRJTkdTCitlbmlmZWQoJ2VtYmVyLW1ldGFsL2NhY2hlJywgWydleHBvcnRzJywgJ2Vt
YmVyLW1ldGFsL2VtcHR5X29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IENh
Y2hlOworCisgIGZ1bmN0aW9uIENhY2hlKGxpbWl0LCBmdW5jKSB7CisgICAgdGhpcy5zdG9yZSA9
IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgdGhpcy5zaXplID0g
MDsKKyAgICB0aGlzLm1pc3NlcyA9IDA7CisgICAgdGhpcy5oaXRzID0gMDsKKyAgICB0aGlzLmxp
bWl0ID0gbGltaXQ7CisgICAgdGhpcy5mdW5jID0gZnVuYzsKKyAgfQorCisgIHZhciBVTkRFRklO
RUQgPSBmdW5jdGlvbiAoKSB7fTsKKworICBDYWNoZS5wcm90b3R5cGUgPSB7CisgICAgc2V0OiBm
dW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgaWYgKHRoaXMubGltaXQgPiB0aGlzLnNpemUp
IHsKKyAgICAgICAgdGhpcy5zaXplKys7CisgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVk
KSB7CisgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gVU5ERUZJTkVEOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlOworICAgICAgICB9CisgICAg
ICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAgZ2V0OiBmdW5jdGlvbiAo
a2V5KSB7CisgICAgICB2YXIgdmFsdWUgPSB0aGlzLnN0b3JlW2tleV07CisKKyAgICAgIGlmICh2
YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRoaXMubWlzc2VzKys7CisgICAgICAgIHZh
bHVlID0gdGhpcy5zZXQoa2V5LCB0aGlzLmZ1bmMoa2V5KSk7CisgICAgICB9IGVsc2UgaWYgKHZh
bHVlID09PSBVTkRFRklORUQpIHsKKyAgICAgICAgdGhpcy5oaXRzKys7CisgICAgICAgIHZhbHVl
ID0gdW5kZWZpbmVkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5oaXRzKys7CisgICAg
ICAgIC8vIG5vdGhpbmcgdG8gdHJhbnNsYXRlCisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1
ZTsKKyAgICB9LAorCisgICAgcHVyZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuc3RvcmUg
PSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgdGhpcy5zaXpl
ID0gMDsKKyAgICAgIHRoaXMuaGl0cyA9IDA7CisgICAgICB0aGlzLm1pc3NlcyA9IDA7CisgICAg
fQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2NoYWlucycsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRh
bC93YXRjaF9rZXknLCAnZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0J10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxNZXRhLCBfZW1iZXJNZXRh
bFdhdGNoX2tleSwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZmluaXNoQ2hhaW5zID0gZmluaXNoQ2hhaW5zOworCisgIHZhciBGSVJTVF9L
RVkgPSAvXihbXlwuXSspLzsKKworICBmdW5jdGlvbiBmaXJzdEtleShwYXRoKSB7CisgICAgcmV0
dXJuIHBhdGgubWF0Y2goRklSU1RfS0VZKVswXTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzT2JqZWN0
KG9iaikgeworICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7CisgIH0K
KworICBmdW5jdGlvbiBpc1ZvbGF0aWxlKG9iaikgeworICAgIHJldHVybiAhKGlzT2JqZWN0KG9i
aikgJiYgb2JqLmlzRGVzY3JpcHRvciAmJiBvYmouX3ZvbGF0aWxlID09PSBmYWxzZSk7CisgIH0K
KworICBmdW5jdGlvbiBDaGFpbldhdGNoZXJzKCkgeworICAgIC8vIGNoYWluIG5vZGVzIHRoYXQg
cmVmZXJlbmNlIGEga2V5IGluIHRoaXMgb2JqIGJ5IGtleQorICAgIC8vIHdlIG9ubHkgY3JlYXRl
IENoYWluV2F0Y2hlcnMgd2hlbiB3ZSBhcmUgZ29pbmcgdG8gYWRkIHRoZW0KKyAgICAvLyBzbyBj
cmVhdGUgdGhpcyB1cGZyb250CisgICAgdGhpcy5jaGFpbnMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0
eV9vYmplY3QuZGVmYXVsdCgpOworICB9CisKKyAgQ2hhaW5XYXRjaGVycy5wcm90b3R5cGUgPSB7
CisgICAgYWRkOiBmdW5jdGlvbiAoa2V5LCBub2RlKSB7CisgICAgICB2YXIgbm9kZXMgPSB0aGlz
LmNoYWluc1trZXldOworICAgICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAg
dGhpcy5jaGFpbnNba2V5XSA9IFtub2RlXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGVz
LnB1c2gobm9kZSk7CisgICAgICB9CisgICAgfSwKKworICAgIHJlbW92ZTogZnVuY3Rpb24gKGtl
eSwgbm9kZSkgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAgICAgIGlm
IChub2RlcykgeworICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8
IGw7IGkrKykgeworICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZSkgeworICAgICAgICAg
ICAgbm9kZXMuc3BsaWNlKGksIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIGhhczogZnVuY3Rpb24gKGtleSwgbm9k
ZSkgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAgICAgIGlmIChub2Rl
cykgeworICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZSkgeworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSwKKworICAgIHJldmFsaWRhdGVBbGw6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGZvciAodmFyIGtleSBpbiB0aGlzLmNoYWlucykgeworICAgICAgICB0aGlzLm5vdGlmeShrZXks
IHRydWUsIHVuZGVmaW5lZCk7CisgICAgICB9CisgICAgfSwKKworICAgIHJldmFsaWRhdGU6IGZ1
bmN0aW9uIChrZXkpIHsKKyAgICAgIHRoaXMubm90aWZ5KGtleSwgdHJ1ZSwgdW5kZWZpbmVkKTsK
KyAgICB9LAorCisgICAgLy8ga2V5OiB0aGUgc3RyaW5nIGtleSB0aGF0IGlzIHBhcnQgb2YgYSBw
YXRoIGNoYW5nZWQKKyAgICAvLyByZXZhbGlkYXRlOiBib29sZWFuOyB0aGUgY2hhaW5zIHRoYXQg
YXJlIHdhdGNoaW5nIHRoaXMgdmFsdWUgc2hvdWxkIHJldmFsaWRhdGUKKyAgICAvLyBjYWxsYmFj
azogZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBvYmplY3QgYW5kIHBhdGgg
dGhhdAorICAgIC8vICAgICAgICAgICB3aWxsIGJlL2FyZSBpbnZhbGlkYXRlZCBieSB0aGlzIGtl
eSBjaGFuZ2UsIGRlcGVuZGluZyBvbgorICAgIC8vICAgICAgICAgICB3aGV0aGVyIHRoZSByZXZh
bGlkYXRlIGZsYWcgaXMgcGFzc2VkCisgICAgbm90aWZ5OiBmdW5jdGlvbiAoa2V5LCByZXZhbGlk
YXRlLCBjYWxsYmFjaykgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAg
ICAgIGlmIChub2RlcyA9PT0gdW5kZWZpbmVkIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkgeworICAg
ICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBhZmZlY3RlZCA9IHVuZGVmaW5lZDsK
KworICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIGFmZmVjdGVkID0gW107CisgICAgICB9
CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICAgIG5vZGVzW2ldLm5vdGlmeShyZXZhbGlkYXRlLCBhZmZlY3RlZCk7CisgICAgICB9
CisKKyAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgLy8gd2UgZ2F0aGVyIGNhbGxiYWNrcyBzbyB3ZSBkb24ndCBub3Rp
ZnkgdGhlbSBkdXJpbmcgcmV2YWxpZGF0aW9uCisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFm
ZmVjdGVkLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgeworICAgICAgICB2YXIgb2JqID0gYWZmZWN0
ZWRbaV07CisgICAgICAgIHZhciBwYXRoID0gYWZmZWN0ZWRbaSArIDFdOworICAgICAgICBjYWxs
YmFjayhvYmosIHBhdGgpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBtYWtl
Q2hhaW5XYXRjaGVyKCkgeworICAgIHJldHVybiBuZXcgQ2hhaW5XYXRjaGVycygpOworICB9CisK
KyAgZnVuY3Rpb24gYWRkQ2hhaW5XYXRjaGVyKG9iaiwga2V5TmFtZSwgbm9kZSkgeworICAgIGlm
ICghaXNPYmplY3Qob2JqKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBtID0g
X2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKyAgICBtLndyaXRhYmxlQ2hhaW5XYXRjaGVycyht
YWtlQ2hhaW5XYXRjaGVyKS5hZGQoa2V5TmFtZSwgbm9kZSk7CisgICAgX2VtYmVyTWV0YWxXYXRj
aF9rZXkud2F0Y2hLZXkob2JqLCBrZXlOYW1lLCBtKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlbW92
ZUNoYWluV2F0Y2hlcihvYmosIGtleU5hbWUsIG5vZGUpIHsKKyAgICBpZiAoIWlzT2JqZWN0KG9i
aikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0
YS5wZWVrTWV0YShvYmopOworCisgICAgaWYgKCFtIHx8ICFtLnJlYWRhYmxlQ2hhaW5XYXRjaGVy
cygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbWFrZSBtZXRhIHdyaXRhYmxl
CisgICAgbSA9IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisKKyAgICBtLnJlYWRhYmxlQ2hh
aW5XYXRjaGVycygpLnJlbW92ZShrZXlOYW1lLCBub2RlKTsKKworICAgIF9lbWJlck1ldGFsV2F0
Y2hfa2V5LnVud2F0Y2hLZXkob2JqLCBrZXlOYW1lLCBtKTsKKyAgfQorCisgIC8vIEEgQ2hhaW5O
b2RlIHdhdGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBz
dGFydGluZworICAvLyB2YWx1ZSBmb3IgdGhlIGtleSB0aGVuIHRoZSBub2RlIHdvbid0IGFjdHVh
bGx5IHdhdGNoIGl0LiBGb3IgYSByb290IG5vZGUKKyAgLy8gcGFzcyBudWxsIGZvciBwYXJlbnQg
YW5kIGtleSBhbmQgb2JqZWN0IGZvciB2YWx1ZS4KKyAgZnVuY3Rpb24gQ2hhaW5Ob2RlKHBhcmVu
dCwga2V5LCB2YWx1ZSkgeworICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKKyAgICB0aGlzLl9r
ZXkgPSBrZXk7CisKKyAgICAvLyBfd2F0Y2hpbmcgaXMgdHJ1ZSB3aGVuIGNhbGxpbmcgZ2V0KHRo
aXMuX3BhcmVudCwgdGhpcy5fa2V5KSB3aWxsCisgICAgLy8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0
aGlzIG5vZGUuCisgICAgLy8KKyAgICAvLyBJdCBpcyBmYWxzZSBmb3IgdGhlIHJvb3Qgb2YgYSBj
aGFpbiAoYmVjYXVzZSB3ZSBoYXZlIG5vIHBhcmVudCkKKyAgICAvLyBhbmQgZm9yIGdsb2JhbCBw
YXRocyAoYmVjYXVzZSB0aGUgcGFyZW50IG5vZGUgaXMgdGhlIG9iamVjdCB3aXRoCisgICAgLy8g
dGhlIG9ic2VydmVyIG9uIGl0KQorICAgIHRoaXMuX3dhdGNoaW5nID0gdmFsdWUgPT09IHVuZGVm
aW5lZDsKKworICAgIHRoaXMuX2NoYWlucyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9vYmplY3Qg
PSB1bmRlZmluZWQ7CisgICAgdGhpcy5jb3VudCA9IDA7CisKKyAgICB0aGlzLl92YWx1ZSA9IHZh
bHVlOworICAgIHRoaXMuX3BhdGhzID0ge307CisgICAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7Cisg
ICAgICB0aGlzLl9vYmplY3QgPSBwYXJlbnQudmFsdWUoKTsKKyAgICAgIGlmICh0aGlzLl9vYmpl
Y3QpIHsKKyAgICAgICAgYWRkQ2hhaW5XYXRjaGVyKHRoaXMuX29iamVjdCwgdGhpcy5fa2V5LCB0
aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBsYXp5R2V0KG9iaiwga2V5
KSB7CisgICAgaWYgKCFvYmopIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbWV0
YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworCisgICAgLy8gY2hlY2sgaWYgb2Jq
ZWN0IG1lYW50IG9ubHkgdG8gYmUgYSBwcm90b3R5cGUKKyAgICBpZiAobWV0YSAmJiBtZXRhLnBy
b3RvID09PSBvYmopIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBVc2UgYGdldGAg
aWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBFYWNoUHJveHkgb3IgYW4gdW5jYWNoZWFibGUgdmFs
dWUuCisgICAgaWYgKGlzVm9sYXRpbGUob2JqW2tleV0pKSB7CisgICAgICByZXR1cm4gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iaiwga2V5KTsKKyAgICAgIC8vIE90aGVyd2lzZSBhdHRl
bXB0IHRvIGdldCB0aGUgY2FjaGVkIHZhbHVlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQorICAg
IH0gZWxzZSB7CisgICAgICAgIHZhciBjYWNoZSA9IG1ldGEucmVhZGFibGVDYWNoZSgpOworICAg
ICAgICBpZiAoY2FjaGUgJiYga2V5IGluIGNhY2hlKSB7CisgICAgICAgICAgcmV0dXJuIGNhY2hl
W2tleV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIENoYWluTm9kZS5wcm90b3R5cGUg
PSB7CisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl92YWx1ZSA9PT0g
dW5kZWZpbmVkICYmIHRoaXMuX3dhdGNoaW5nKSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLl9w
YXJlbnQudmFsdWUoKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSBsYXp5R2V0KG9iaiwgdGhpcy5f
a2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLl92YWx1ZTsKKyAgICB9LAorCisgICAg
ZGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7CisgICAg
ICAgIHZhciBvYmogPSB0aGlzLl9vYmplY3Q7CisgICAgICAgIGlmIChvYmopIHsKKyAgICAgICAg
ICByZW1vdmVDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRoaXMpOworICAgICAgICB9Cisg
ICAgICAgIHRoaXMuX3dhdGNoaW5nID0gZmFsc2U7IC8vIHNvIGZ1dHVyZSBjYWxscyBkbyBub3Ro
aW5nCisgICAgICB9CisgICAgfSwKKworICAgIC8vIGNvcGllcyBhIHRvcCBsZXZlbCBvYmplY3Qg
b25seQorICAgIGNvcHk6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgIHZhciByZXQgPSBuZXcgQ2hh
aW5Ob2RlKG51bGwsIG51bGwsIG9iaik7CisgICAgICB2YXIgcGF0aHMgPSB0aGlzLl9wYXRoczsK
KyAgICAgIHZhciBwYXRoOworCisgICAgICBmb3IgKHBhdGggaW4gcGF0aHMpIHsKKyAgICAgICAg
Ly8gdGhpcyBjaGVjayB3aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2YWxzLgorICAgICAgICBp
ZiAocGF0aHNbcGF0aF0gPD0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIHJldC5hZGQocGF0aCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0s
CisKKyAgICAvLyBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZSBvZiBhIGNoYWluIHRvIHNldHVwIHdh
dGNoZXJzIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAvLyBwYXRoLgorICAgIGFkZDogZnVuY3Rpb24g
KHBhdGgpIHsKKyAgICAgIHZhciBwYXRocyA9IHRoaXMuX3BhdGhzOworICAgICAgcGF0aHNbcGF0
aF0gPSAocGF0aHNbcGF0aF0gfHwgMCkgKyAxOworCisgICAgICB2YXIga2V5ID0gZmlyc3RLZXko
cGF0aCk7CisgICAgICB2YXIgdGFpbCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCArIDEpOworCisg
ICAgICB0aGlzLmNoYWluKGtleSwgdGFpbCk7CisgICAgfSwKKworICAgIC8vIGNhbGxlZCBvbiB0
aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8gdGVhcmRvd24gd2F0Y2hlciBvbiB0aGUgc3BlY2lm
aWVkCisgICAgLy8gcGF0aAorICAgIHJlbW92ZTogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZh
ciBwYXRocyA9IHRoaXMuX3BhdGhzOworICAgICAgaWYgKHBhdGhzW3BhdGhdID4gMCkgeworICAg
ICAgICBwYXRoc1twYXRoXS0tOworICAgICAgfQorCisgICAgICB2YXIga2V5ID0gZmlyc3RLZXko
cGF0aCk7CisgICAgICB2YXIgdGFpbCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCArIDEpOworCisg
ICAgICB0aGlzLnVuY2hhaW4oa2V5LCB0YWlsKTsKKyAgICB9LAorCisgICAgY2hhaW46IGZ1bmN0
aW9uIChrZXksIHBhdGgpIHsKKyAgICAgIHZhciBjaGFpbnMgPSB0aGlzLl9jaGFpbnM7CisgICAg
ICB2YXIgbm9kZTsKKyAgICAgIGlmIChjaGFpbnMgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBj
aGFpbnMgPSB0aGlzLl9jaGFpbnMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVs
dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9kZSA9IGNoYWluc1trZXldOworICAgICAg
fQorCisgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIG5vZGUgPSBjaGFp
bnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCB1bmRlZmluZWQpOworICAgICAgfQor
CisgICAgICBub2RlLmNvdW50Kys7IC8vIGNvdW50IGNoYWlucy4uLgorCisgICAgICAvLyBjaGFp
biByZXN0IG9mIHBhdGggaWYgdGhlcmUgaXMgb25lCisgICAgICBpZiAocGF0aCkgeworICAgICAg
ICBrZXkgPSBmaXJzdEtleShwYXRoKTsKKyAgICAgICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxl
bmd0aCArIDEpOworICAgICAgICBub2RlLmNoYWluKGtleSwgcGF0aCk7CisgICAgICB9CisgICAg
fSwKKworICAgIHVuY2hhaW46IGZ1bmN0aW9uIChrZXksIHBhdGgpIHsKKyAgICAgIHZhciBjaGFp
bnMgPSB0aGlzLl9jaGFpbnM7CisgICAgICB2YXIgbm9kZSA9IGNoYWluc1trZXldOworCisgICAg
ICAvLyB1bmNoYWluIHJlc3Qgb2YgcGF0aCBmaXJzdC4uLgorICAgICAgaWYgKHBhdGggJiYgcGF0
aC5sZW5ndGggPiAxKSB7CisgICAgICAgIHZhciBuZXh0S2V5ID0gZmlyc3RLZXkocGF0aCk7Cisg
ICAgICAgIHZhciBuZXh0UGF0aCA9IHBhdGguc2xpY2UobmV4dEtleS5sZW5ndGggKyAxKTsKKyAg
ICAgICAgbm9kZS51bmNoYWluKG5leHRLZXksIG5leHRQYXRoKTsKKyAgICAgIH0KKworICAgICAg
Ly8gZGVsZXRlIG5vZGUgaWYgbmVlZGVkLgorICAgICAgbm9kZS5jb3VudC0tOworICAgICAgaWYg
KG5vZGUuY291bnQgPD0gMCkgeworICAgICAgICBjaGFpbnNbbm9kZS5fa2V5XSA9IHVuZGVmaW5l
ZDsKKyAgICAgICAgbm9kZS5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSwKKworICAgIG5vdGlm
eTogZnVuY3Rpb24gKHJldmFsaWRhdGUsIGFmZmVjdGVkKSB7CisgICAgICBpZiAocmV2YWxpZGF0
ZSAmJiB0aGlzLl93YXRjaGluZykgeworICAgICAgICB2YXIgb2JqID0gdGhpcy5fcGFyZW50LnZh
bHVlKCk7CisgICAgICAgIGlmIChvYmogIT09IHRoaXMuX29iamVjdCkgeworICAgICAgICAgIHJl
bW92ZUNoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7CisgICAgICAg
ICAgdGhpcy5fb2JqZWN0ID0gb2JqOworICAgICAgICAgIGFkZENoYWluV2F0Y2hlcihvYmosIHRo
aXMuX2tleSwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmlu
ZWQ7CisgICAgICB9CisKKyAgICAgIC8vIHRoZW4gbm90aWZ5IGNoYWlucy4uLgorICAgICAgdmFy
IGNoYWlucyA9IHRoaXMuX2NoYWluczsKKyAgICAgIHZhciBub2RlOworICAgICAgaWYgKGNoYWlu
cykgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gY2hhaW5zKSB7CisgICAgICAgICAgbm9kZSA9
IGNoYWluc1trZXldOworICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHsKKyAgICAg
ICAgICAgIG5vZGUubm90aWZ5KHJldmFsaWRhdGUsIGFmZmVjdGVkKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGFmZmVjdGVkICYmIHRoaXMuX3BhcmVudCkg
eworICAgICAgICB0aGlzLl9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZCh0aGlzLl9rZXksIDEsIGFm
ZmVjdGVkKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcG9wdWxhdGVBZmZlY3RlZDogZnVuY3Rp
b24gKHBhdGgsIGRlcHRoLCBhZmZlY3RlZCkgeworICAgICAgaWYgKHRoaXMuX2tleSkgeworICAg
ICAgICBwYXRoID0gdGhpcy5fa2V5ICsgJy4nICsgcGF0aDsKKyAgICAgIH0KKworICAgICAgaWYg
KHRoaXMuX3BhcmVudCkgeworICAgICAgICB0aGlzLl9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZChw
YXRoLCBkZXB0aCArIDEsIGFmZmVjdGVkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChk
ZXB0aCA+IDEpIHsKKyAgICAgICAgICBhZmZlY3RlZC5wdXNoKHRoaXMudmFsdWUoKSwgcGF0aCk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZmluaXNoQ2hh
aW5zKG9iaikgeworICAgIC8vIFdlIG9ubHkgY3JlYXRlIG1ldGEgaWYgd2UgcmVhbGx5IGhhdmUg
dG8KKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIGlmICht
KSB7CisgICAgICBtID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKworICAgICAgLy8gZmlu
aXNoIGFueSBjdXJyZW50IGNoYWlucyBub2RlIHdhdGNoZXJzIHRoYXQgcmVmZXJlbmNlIG9iagor
ICAgICAgdmFyIGNoYWluV2F0Y2hlcnMgPSBtLnJlYWRhYmxlQ2hhaW5XYXRjaGVycygpOworICAg
ICAgaWYgKGNoYWluV2F0Y2hlcnMpIHsKKyAgICAgICAgY2hhaW5XYXRjaGVycy5yZXZhbGlkYXRl
QWxsKCk7CisgICAgICB9CisgICAgICAvLyBlbnN1cmUgdGhhdCBpZiB3ZSBoYXZlIGluaGVyaXRl
ZCBhbnkgY2hhaW5zIHRoZXkgaGF2ZSBiZWVuCisgICAgICAvLyBjb3BpZWQgb250byBvdXIgb3du
IG1ldGEuCisgICAgICBpZiAobS5yZWFkYWJsZUNoYWlucygpKSB7CisgICAgICAgIG0ud3JpdGFi
bGVDaGFpbnMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLnJlbW92ZUNoYWlu
V2F0Y2hlciA9IHJlbW92ZUNoYWluV2F0Y2hlcjsKKyAgZXhwb3J0cy5DaGFpbk5vZGUgPSBDaGFp
bk5vZGU7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1l
dGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvZXhwYW5kX3Byb3Bl
cnRpZXMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZGVwZW5kZW50X2tleXMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVy
dHlfc2V0LCBfZW1iZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsRXhw
YW5kX3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVydGllcywg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRGVwZW5kZW50X2tleXMpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGNvbXB1dGVkOworCisgIC8q
KgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICBm
dW5jdGlvbiBVTkRFRklORUQoKSB7fQorCisgIHZhciBERUVQX0VBQ0hfUkVHRVggPSAvXC5AZWFj
aFwuW14uXStcLi87CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0cmFuc2Zvcm1z
IGFuIG9iamVjdCBsaXRlcmFsIHdpdGggb2JqZWN0J3MgYWNjZXNzb3IgZnVuY3Rpb24ocykgaW50
byBhIHByb3BlcnR5LgorICAKKyAgICBCeSBkZWZhdWx0IHRoZSBmdW5jdGlvbiBiYWNraW5nIHRo
ZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgY2FsbGVkCisgICAgb25jZSBhbmQgdGhl
IHJlc3VsdCB3aWxsIGJlIGNhY2hlZC4gWW91IGNhbiBzcGVjaWZ5IHZhcmlvdXMgcHJvcGVydGll
cworICAgIHRoYXQgeW91ciBjb21wdXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uLiBUaGlzIHdpbGwg
Zm9yY2UgdGhlIGNhY2hlZAorICAgIHJlc3VsdCB0byBiZSByZWNvbXB1dGVkIGlmIHRoZSBkZXBl
bmRlbmNpZXMgYXJlIG1vZGlmaWVkLgorICAKKyAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUg
d2UgZGVjbGFyZSBhIGNvbXB1dGVkIHByb3BlcnR5IC0gYGZ1bGxOYW1lYCAtIGJ5IGNhbGxpbmcK
KyAgICBgLkVtYmVyLmNvbXB1dGVkKClgIHdpdGggcHJvcGVydHkgZGVwZW5kZW5jaWVzIChgZmly
c3ROYW1lYCBhbmQgYGxhc3ROYW1lYCkgYXMgbGVhZGluZyBhcmd1bWVudHMgYW5kIGdldHRlciBh
Y2Nlc3NvciBmdW5jdGlvbi4gVGhlIGBmdWxsTmFtZWAgZ2V0dGVyIGZ1bmN0aW9uCisgICAgd2ls
bCBiZSBjYWxsZWQgb25jZSAocmVnYXJkbGVzcyBvZiBob3cgbWFueSB0aW1lcyBpdCBpcyBhY2Nl
c3NlZCkgYXMgbG9uZworICAgIGFzIGl0cyBkZXBlbmRlbmNpZXMgaGF2ZSBub3QgY2hhbmdlZC4g
T25jZSBgZmlyc3ROYW1lYCBvciBgbGFzdE5hbWVgIGFyZSB1cGRhdGVkCisgICAgYW55IGZ1dHVy
ZSBjYWxscyAob3IgYW55dGhpbmcgYm91bmQpIHRvIGBmdWxsTmFtZWAgd2lsbCBpbmNvcnBvcmF0
ZSB0aGUgbmV3CisgICAgdmFsdWVzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgbGV0IFBl
cnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgLy8gdGhlc2Ugd2lsbCBiZSBzdXBw
bGllZCBieSBgY3JlYXRlYAorICAgICAgZmlyc3ROYW1lOiBudWxsLAorICAgICAgbGFzdE5hbWU6
IG51bGwsCisgIAorICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1dGVkKCdmaXJzdE5hbWUnLCAn
bGFzdE5hbWUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgbGV0IGZpcnN0TmFtZSA9IHRoaXMuZ2V0
KCdmaXJzdE5hbWUnKSwKKyAgICAgICAgICAgIGxhc3ROYW1lICA9IHRoaXMuZ2V0KCdsYXN0TmFt
ZScpOworICAKKyAgICAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAg
ICAgfSkKKyAgICB9KTsKKyAgCisgICAgbGV0IHRvbSA9IFBlcnNvbi5jcmVhdGUoeworICAgICAg
Zmlyc3ROYW1lOiAnVG9tJywKKyAgICAgIGxhc3ROYW1lOiAnRGFsZScKKyAgICB9KTsKKyAgCisg
ICAgdG9tLmdldCgnZnVsbE5hbWUnKSAvLyAnVG9tIERhbGUnCisgICAgYGBgCisgIAorICAgIFlv
dSBjYW4gYWxzbyBkZWZpbmUgd2hhdCBFbWJlciBzaG91bGQgZG8gd2hlbiBzZXR0aW5nIGEgY29t
cHV0ZWQgcHJvcGVydHkgYnkgcHJvdmlkaW5nIGFkZGl0aW9uYWwgZnVuY3Rpb24gKGBzZXRgKSBp
biBoYXNoIGFyZ3VtZW50LgorICAgIElmIHlvdSB0cnkgdG8gc2V0IGEgY29tcHV0ZWQgcHJvcGVy
dHksIGl0IHdpbGwgdHJ5IHRvIGludm9rZSBzZXR0ZXIgYWNjZXNzb3IgZnVuY3Rpb24gd2l0aCB0
aGUga2V5IGFuZAorICAgIHZhbHVlIHlvdSB3YW50IHRvIHNldCBpdCB0byBhcyBhcmd1bWVudHMu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBsZXQgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4
dGVuZCh7CisgICAgICAvLyB0aGVzZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IGBjcmVhdGVgCisgICAg
ICBmaXJzdE5hbWU6IG51bGwsCisgICAgICBsYXN0TmFtZTogbnVsbCwKKyAgCisgICAgICBmdWxs
TmFtZTogRW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIHsKKyAgICAgICAg
Z2V0KGtleSkgeworICAgICAgICAgIGxldCBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1l
JyksCisgICAgICAgICAgICAgIGxhc3ROYW1lICA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOworICAK
KyAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgJyAnICsgbGFzdE5hbWU7CisgICAgICAgIH0s
CisgICAgICAgIHNldChrZXksIHZhbHVlKSB7CisgICAgICAgICAgbGV0IFtmaXJzdE5hbWUsIGxh
c3ROYW1lXSA9IHZhbHVlLnNwbGl0KCcgJyk7CisgIAorICAgICAgICAgIHRoaXMuc2V0KCdmaXJz
dE5hbWUnLCBmaXJzdE5hbWUpOworICAgICAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScsIGxhc3RO
YW1lKTsKKyAgCisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICB9KQor
ICAgIH0pOworICAKKyAgICBsZXQgcGVyc29uID0gUGVyc29uLmNyZWF0ZSgpOworICAKKyAgICBw
ZXJzb24uc2V0KCdmdWxsTmFtZScsICdQZXRlciBXYWdlbmV0Jyk7CisgICAgcGVyc29uLmdldCgn
Zmlyc3ROYW1lJyk7IC8vICdQZXRlcicKKyAgICBwZXJzb24uZ2V0KCdsYXN0TmFtZScpOyAgLy8g
J1dhZ2VuZXQnCisgICAgYGBgCisgIAorICAgIFlvdSBjYW4gb3ZlcndyaXRlIGNvbXB1dGVkIHBy
b3BlcnR5IHdpdGggbm9ybWFsIHByb3BlcnR5IChubyBsb25nZXIgY29tcHV0ZWQpLCB0aGF0IHdv
bid0IGNoYW5nZSBpZiBkZXBlbmRlbmNpZXMgY2hhbmdlLCBpZiB5b3Ugc2V0IGNvbXB1dGVkIHBy
b3BlcnR5IGFuZCBpdCB3b24ndCBoYXZlIHNldHRlciBhY2Nlc3NvciBmdW5jdGlvbiBkZWZpbmVk
LgorICAKKyAgICBZb3UgY2FuIGFsc28gbWFyayBjb21wdXRlZCBwcm9wZXJ0eSBhcyBgLnJlYWRP
bmx5KClgIGFuZCBibG9jayBhbGwgYXR0ZW1wdHMgdG8gc2V0IGl0LgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgLy8g
dGhlc2Ugd2lsbCBiZSBzdXBwbGllZCBieSBgY3JlYXRlYAorICAgICAgZmlyc3ROYW1lOiBudWxs
LAorICAgICAgbGFzdE5hbWU6IG51bGwsCisgIAorICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1
dGVkKCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCB7CisgICAgICAgIGdldChrZXkpIHsKKyAgICAg
ICAgICBsZXQgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOworICAgICAgICAgIGxl
dCBsYXN0TmFtZSAgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAgCisgICAgICAgICAgcmV0dXJu
IGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAgICAgICB9CisgICAgICB9KS5yZWFkT25s
eSgpCisgICAgfSk7CisgIAorICAgIGxldCBwZXJzb24gPSBQZXJzb24uY3JlYXRlKCk7CisgICAg
cGVyc29uLnNldCgnZnVsbE5hbWUnLCAnUGV0ZXIgV2FnZW5ldCcpOyAvLyBVbmNhdWdodCBFcnJv
cjogQ2Fubm90IHNldCByZWFkLW9ubHkgcHJvcGVydHkgImZ1bGxOYW1lIiBvbiBvYmplY3Q6IDwo
Li4uKTplbWJlclhYWD4KKyAgICBgYGAKKyAgCisgICAgQWRkaXRpb25hbCByZXNvdXJjZXM6Cisg
ICAgLSBbTmV3IENQIHN5bnRheCBSRkNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL3JmY3Mv
YmxvYi9tYXN0ZXIvdGV4dC8wMDExLWltcHJvdmVkLWNwLXN5bnRheC5tZCkKKyAgICAtIFtOZXcg
Y29tcHV0ZWQgc3ludGF4IGV4cGxhaW5lZCBpbiAiRW1iZXIgMS4xMiByZWxlYXNlZCIgXShodHRw
Oi8vZW1iZXJqcy5jb20vYmxvZy8yMDE1LzA1LzEzL2VtYmVyLTEtMTItcmVsZWFzZWQuaHRtbCN0
b2NfbmV3LWNvbXB1dGVkLXN5bnRheCkKKyAgCisgICAgQGNsYXNzIENvbXB1dGVkUHJvcGVydHkK
KyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHB1YmxpYworICAqLworICBmdW5jdGlvbiBDb21w
dXRlZFByb3BlcnR5KGNvbmZpZywgb3B0cykgeworICAgIHRoaXMuaXNEZXNjcmlwdG9yID0gdHJ1
ZTsKKyAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgdGhpcy5f
Z2V0dGVyID0gY29uZmlnOworICAgIH0gZWxzZSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnRW1iZXIuY29tcHV0ZWQgZXhwZWN0cyBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCBhcyBs
YXN0IGFyZ3VtZW50LicsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0Fy
cmF5KGNvbmZpZykpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0NvbmZpZyBvYmpl
Y3QgcGFzZWQgdG8gYSBFbWJlci5jb21wdXRlZCBjYW4gb25seSBjb250YWluIGBnZXRgIG9yIGBz
ZXRgIGtleXMuJywgKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5
cyhjb25maWcpOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgICBpZiAoa2V5c1tpXSAhPT0gJ2dldCcgJiYga2V5c1tpXSAhPT0gJ3NldCcp
IHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KSgpKTsKKyAgICAgIHRoaXMuX2dldHRlciA9IGNv
bmZpZy5nZXQ7CisgICAgICB0aGlzLl9zZXR0ZXIgPSBjb25maWcuc2V0OworICAgIH0KKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ29tcHV0ZWQgcHJvcGVydGllcyBtdXN0IHJlY2VpdmUg
YSBnZXR0ZXIgb3IgYSBzZXR0ZXIsIHlvdSBwYXNzZWQgbm9uZS4nLCAhIXRoaXMuX2dldHRlciB8
fCAhIXRoaXMuX3NldHRlcik7CisgICAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IHVuZGVmaW5lZDsK
KyAgICB0aGlzLl9zdXNwZW5kZWQgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fbWV0YSA9IHVuZGVm
aW5lZDsKKyAgICB0aGlzLl92b2xhdGlsZSA9IGZhbHNlOworICAgIHRoaXMuX2RlcGVuZGVudEtl
eXMgPSBvcHRzICYmIG9wdHMuZGVwZW5kZW50S2V5czsKKyAgICB0aGlzLl9yZWFkT25seSA9IGZh
bHNlOworICB9CisKKyAgQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcgX2VtYmVyTWV0
YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3IoKTsKKworICB2YXIgQ29tcHV0ZWRQcm9wZXJ0eVByb3Rv
dHlwZSA9IENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlOworCisgIC8qKgorICAgIENhbGwgb24g
YSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUuIFdoZW4g
aW4gdGhpcworICAgIG1vZGUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdpbGwgbm90IGF1dG9tYXRp
Y2FsbHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KKyAgCisgICAgSXQgYWxzbyBkb2VzIG5vdCBh
dXRvbWF0aWNhbGx5IGZpcmUgYW55IGNoYW5nZSBldmVudHMuIFlvdSBtdXN0IG1hbnVhbGx5IG5v
dGlmeQorICAgIGFueSBjaGFuZ2VzIGlmIHlvdSB3YW50IHRvIG9ic2VydmUgdGhpcyBwcm9wZXJ0
eS4KKyAgCisgICAgRGVwZW5kZW5jeSBrZXlzIGhhdmUgbm8gZWZmZWN0IG9uIHZvbGF0aWxlIHBy
b3BlcnRpZXMgYXMgdGhleSBhcmUgZm9yIGNhY2hlCisgICAgaW52YWxpZGF0aW9uIGFuZCBub3Rp
ZmljYXRpb24gd2hlbiBjYWNoZWQgdmFsdWUgaXMgaW52YWxpZGF0ZWQuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBsZXQgb3V0c2lkZVNlcnZpY2UgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
KyAgICAgIHZhbHVlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJu
IE91dHNpZGVTZXJ2aWNlLmdldFZhbHVlKCk7CisgICAgICB9KS52b2xhdGlsZSgpCisgICAgfSku
Y3JlYXRlKCk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2Qgdm9sYXRpbGUKKyAgICBAcmV0dXJu
IHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWluYWJsZQorICAgIEBwdWJs
aWMKKyAgKi8KKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS52b2xhdGlsZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB0aGlzLl92b2xhdGlsZSA9IHRydWU7CisgICAgcmV0dXJuIHRoaXM7CisgIH07
CisKKyAgLyoqCisgICAgQ2FsbCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5IHRvIHNldCBpdCBpbnRv
IHJlYWQtb25seSBtb2RlLiBXaGVuIGluIHRoaXMKKyAgICBtb2RlIHRoZSBjb21wdXRlZCBwcm9w
ZXJ0eSB3aWxsIHRocm93IGFuIGVycm9yIHdoZW4gc2V0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgZ3VpZDogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAnZ3VpZC1ndWlkLWd1aWQn
OworICAgICAgfSkucmVhZE9ubHkoKQorICAgIH0pOworICAKKyAgICBsZXQgcGVyc29uID0gUGVy
c29uLmNyZWF0ZSgpOworICAKKyAgICBwZXJzb24uc2V0KCdndWlkJywgJ25ldy1ndWlkJyk7IC8v
IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgcmVhZE9u
bHkKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWlu
YWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5yZWFk
T25seSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLl9yZWFkT25seSA9IHRydWU7CisgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0NvbXB1dGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgYSBz
ZXR0ZXIgdXNpbmcgdGhlIG5ldyBzeW50YXggY2Fubm90IGJlIHJlYWQtb25seScsICEodGhpcy5f
cmVhZE9ubHkgJiYgdGhpcy5fc2V0dGVyICYmIHRoaXMuX3NldHRlciAhPT0gdGhpcy5fZ2V0dGVy
KSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgLyoqCisgICAgU2V0cyB0aGUgZGVwZW5k
ZW50IGtleXMgb24gdGhpcyBjb21wdXRlZCBwcm9wZXJ0eS4gUGFzcyBhbnkgbnVtYmVyIG9mCisg
ICAgYXJndW1lbnRzIGNvbnRhaW5pbmcga2V5IHBhdGhzIHRoYXQgdGhpcyBjb21wdXRlZCBwcm9w
ZXJ0eSBkZXBlbmRzIG9uLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgbGV0IFByZXNpZGVu
dCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAn
ICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisgIAorICAgICAgICAvLyBUZWxsIEVtYmVyIHRoYXQg
dGhpcyBjb21wdXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uIGZpcnN0TmFtZQorICAgICAgICAvLyBh
bmQgbGFzdE5hbWUKKyAgICAgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQor
ICAgIH0pOworICAKKyAgICBsZXQgcHJlc2lkZW50ID0gUHJlc2lkZW50LmNyZWF0ZSh7CisgICAg
ICBmaXJzdE5hbWU6ICdCYXJhY2snLAorICAgICAgbGFzdE5hbWU6ICdPYmFtYScKKyAgICB9KTsK
KyAgCisgICAgcHJlc2lkZW50LmdldCgnZnVsbE5hbWUnKTsgLy8gJ0JhcmFjayBPYmFtYScKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRo
KiB6ZXJvIG9yIG1vcmUgcHJvcGVydHkgcGF0aHMKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRl
ZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWluYWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgQ29t
cHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIg
YXJnczsKKworICAgIHZhciBhZGRBcmcgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcud2FybignRGVwZW5kZW50IGtleXMgY29udGFpbmluZyBAZWFjaCBvbmx5
IHdvcmsgb25lIGxldmVsIGRlZXAuICcgKyAnWW91IGNhbm5vdCB1c2UgbmVzdGVkIGZvcm1zIGxp
a2UgdG9kb3MuQGVhY2gub3duZXIubmFtZSBvciB0b2Rvcy5AZWFjaC5vd25lci5AZWFjaC5uYW1l
LiAnICsgJ1BsZWFzZSBjcmVhdGUgYW4gaW50ZXJtZWRpYXJ5IGNvbXB1dGVkIHByb3BlcnR5Lics
IERFRVBfRUFDSF9SRUdFWC50ZXN0KHByb3BlcnR5KSA9PT0gZmFsc2UsIHsgaWQ6ICdlbWJlci1t
ZXRhbC5jb21wdXRlZC1kZWVwLWVhY2gnIH0pOworICAgICAgYXJncy5wdXNoKHByb3BlcnR5KTsK
KyAgICB9OworCisgICAgYXJncyA9IFtdOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1l
bnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVy
dGllcy5kZWZhdWx0KGFyZ3VtZW50c1tpXSwgYWRkQXJnKTsKKyAgICB9CisKKyAgICB0aGlzLl9k
ZXBlbmRlbnRLZXlzID0gYXJnczsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworICAvKioKKyAg
ICBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gYW5ub3RhdGUgY29tcHV0ZWQgcHJvcGVy
dGllcyB3aXRoIGFkZGl0aW9uYWwKKyAgICBtZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlv
biBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJhdGUgb24uIEZvciBleGFtcGxlLAorICAgIGNvbXB1
dGVkIHByb3BlcnR5IGZ1bmN0aW9ucyBtYXkgY2xvc2Ugb3ZlciB2YXJpYWJsZXMgdGhhdCBhcmUg
dGhlbiBubyBsb25nZXIKKyAgICBhdmFpbGFibGUgZm9yIGludHJvc3BlY3Rpb24uCisgIAorICAg
IFlvdSBjYW4gcGFzcyBhIGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVy
dHkgbGlrZSB0aGlzOgorICAKKyAgICBgYGAKKyAgICBwZXJzb246IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKCkgeworICAgICAgbGV0IHBlcnNvbklkID0gdGhpcy5nZXQoJ3BlcnNvbklkJyk7Cisg
ICAgICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgICAgfSku
bWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKKyAgICBgYGAKKyAgCisgICAgVGhlIGhhc2ggdGhh
dCB5b3UgcGFzcyB0byB0aGUgYG1ldGEoKWAgZnVuY3Rpb24gd2lsbCBiZSBzYXZlZCBvbiB0aGUK
KyAgICBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4g
RW1iZXIgcnVudGltZQorICAgIGV4cG9zZXMgYSBwdWJsaWMgQVBJIGZvciByZXRyaWV2aW5nIHRo
ZXNlIHZhbHVlcyBmcm9tIGNsYXNzZXMsCisgICAgdmlhIHRoZSBgbWV0YUZvclByb3BlcnR5KClg
IGZ1bmN0aW9uLgorICAKKyAgICBAbWV0aG9kIG1ldGEKKyAgICBAcGFyYW0ge09iamVjdH0gbWV0
YQorICAgIEBjaGFpbmFibGUKKyAgICBAcHVibGljCisgICovCisgIENvbXB1dGVkUHJvcGVydHlQ
cm90b3R5cGUubWV0YSA9IGZ1bmN0aW9uIChtZXRhKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPT09IDApIHsKKyAgICAgIHJldHVybiB0aGlzLl9tZXRhIHx8IHt9OworICAgIH0gZWxzZSB7
CisgICAgICB0aGlzLl9tZXRhID0gbWV0YTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAg
fTsKKworICAvLyBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gQ1Aga2V5IGNoYW5nZXMKKyAgQ29tcHV0
ZWRQcm9wZXJ0eVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7
CisgICAgLy8gX3N1c3BlbmRlZCBpcyBzZXQgdmlhIGEgQ1Auc2V0IHRvIGVuc3VyZSB3ZSBkb24n
dCBjbGVhcgorICAgIC8vIHRoZSBjYWNoZWQgdmFsdWUgc2V0IGJ5IHRoZSBzZXR0ZXIKKyAgICBp
ZiAodGhpcy5fdm9sYXRpbGUgfHwgdGhpcy5fc3VzcGVuZGVkID09PSBvYmopIHsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyBkb24ndCBjcmVhdGUgb2JqZWN0cyBqdXN0IHRvIGludmFs
aWRhdGUKKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAg
IGlmICghbWV0YSB8fCBtZXRhLnNvdXJjZSAhPT0gb2JqKSB7CisgICAgICByZXR1cm47CisgICAg
fQorCisgICAgdmFyIGNhY2hlID0gbWV0YS5yZWFkYWJsZUNhY2hlKCk7CisgICAgaWYgKGNhY2hl
ICYmIGNhY2hlW2tleU5hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGNhY2hlW2tleU5hbWVd
ID0gdW5kZWZpbmVkOworICAgICAgX2VtYmVyTWV0YWxEZXBlbmRlbnRfa2V5cy5yZW1vdmVEZXBl
bmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7CisgICAgfQorICB9OworCisgIENv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgewor
ICAgIGlmICh0aGlzLl92b2xhdGlsZSkgeworICAgICAgcmV0dXJuIHRoaXMuX2dldHRlci5jYWxs
KG9iaiwga2V5TmFtZSk7CisgICAgfQorCisgICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEu
bWV0YShvYmopOworICAgIHZhciBjYWNoZSA9IG1ldGEud3JpdGFibGVDYWNoZSgpOworCisgICAg
dmFyIHJlc3VsdCA9IGNhY2hlW2tleU5hbWVdOworICAgIGlmIChyZXN1bHQgPT09IFVOREVGSU5F
RCkgeworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZhciByZXQg
PSB0aGlzLl9nZXR0ZXIuY2FsbChvYmosIGtleU5hbWUpOworICAgIGlmIChyZXQgPT09IHVuZGVm
aW5lZCkgeworICAgICAgY2FjaGVba2V5TmFtZV0gPSBVTkRFRklORUQ7CisgICAgfSBlbHNlIHsK
KyAgICAgIGNhY2hlW2tleU5hbWVdID0gcmV0OworICAgIH0KKworICAgIHZhciBjaGFpbldhdGNo
ZXJzID0gbWV0YS5yZWFkYWJsZUNoYWluV2F0Y2hlcnMoKTsKKyAgICBpZiAoY2hhaW5XYXRjaGVy
cykgeworICAgICAgY2hhaW5XYXRjaGVycy5yZXZhbGlkYXRlKGtleU5hbWUpOworICAgIH0KKyAg
ICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBr
ZXlOYW1lLCBtZXRhKTsKKworICAgIHJldHVybiByZXQ7CisgIH07CisKKyAgQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBjb21wdXRlZFByb3BlcnR5U2V0RW50cnkob2Jq
LCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIGlmICh0aGlzLl9yZWFkT25seSkgeworICAgICAgdGhp
cy5fdGhyb3dSZWFkT25seUVycm9yKG9iaiwga2V5TmFtZSk7CisgICAgfQorCisgICAgaWYgKCF0
aGlzLl9zZXR0ZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLmNsb2JiZXJTZXQob2JqLCBrZXlOYW1l
LCB2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3ZvbGF0aWxlKSB7CisgICAgICByZXR1
cm4gdGhpcy52b2xhdGlsZVNldChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGhpcy5zZXRXaXRoU3VzcGVuZChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgfTsKKwor
ICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLl90aHJvd1JlYWRPbmx5RXJyb3IgPSBmdW5jdGlv
biBjb21wdXRlZFByb3BlcnR5VGhyb3dSZWFkT25seUVycm9yKG9iaiwga2V5TmFtZSkgeworICAg
IHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0Nhbm5vdCBzZXQgcmVhZC1vbmx5
IHByb3BlcnR5ICInICsga2V5TmFtZSArICciIG9uIG9iamVjdDogJyArIF9lbWJlck1ldGFsVXRp
bHMuaW5zcGVjdChvYmopKTsKKyAgfTsKKworICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLmNs
b2JiZXJTZXQgPSBmdW5jdGlvbiBjb21wdXRlZFByb3BlcnR5Q2xvYmJlclNldChvYmosIGtleU5h
bWUsIHZhbHVlKSB7CisgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVGb3Iob2JqLCBrZXlOYW1l
KTsKKyAgICBfZW1iZXJNZXRhbFByb3BlcnRpZXMuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1l
LCBudWxsLCBjYWNoZWRWYWx1ZSk7CisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KG9i
aiwga2V5TmFtZSwgdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKKworICBDb21wdXRl
ZFByb3BlcnR5UHJvdG90eXBlLnZvbGF0aWxlU2V0ID0gZnVuY3Rpb24gY29tcHV0ZWRQcm9wZXJ0
eVZvbGF0aWxlU2V0KG9iaiwga2V5TmFtZSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5fc2V0
dGVyLmNhbGwob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgIH07CisKKyAgQ29tcHV0ZWRQcm9wZXJ0
eVByb3RvdHlwZS5zZXRXaXRoU3VzcGVuZCA9IGZ1bmN0aW9uIGNvbXB1dGVkUHJvcGVydHlTZXRX
aXRoU3VzcGVuZChvYmosIGtleU5hbWUsIHZhbHVlKSB7CisgICAgdmFyIG9sZFN1c3BlbmRlZCA9
IHRoaXMuX3N1c3BlbmRlZDsKKyAgICB0aGlzLl9zdXNwZW5kZWQgPSBvYmo7CisgICAgdHJ5IHsK
KyAgICAgIHJldHVybiB0aGlzLl9zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgICAgfSBmaW5h
bGx5IHsKKyAgICAgIHRoaXMuX3N1c3BlbmRlZCA9IG9sZFN1c3BlbmRlZDsKKyAgICB9CisgIH07
CisKKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5fc2V0ID0gZnVuY3Rpb24gY29tcHV0ZWRQ
cm9wZXJ0eVNldChvYmosIGtleU5hbWUsIHZhbHVlKSB7CisgICAgLy8gY2FjaGUgcmVxdWlyZXMg
b3duIG1ldGEKKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisgICAg
Ly8gZWl0aGVyIHRoZXJlIGlzIGEgd3JpdGFibGUgY2FjaGUgb3Igd2UgbmVlZCBvbmUgdG8gdXBk
YXRlCisgICAgdmFyIGNhY2hlID0gbWV0YS53cml0YWJsZUNhY2hlKCk7CisgICAgdmFyIGhhZENh
Y2hlZFZhbHVlID0gZmFsc2U7CisgICAgdmFyIGNhY2hlZFZhbHVlID0gdW5kZWZpbmVkOworICAg
IGlmIChjYWNoZVtrZXlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBpZiAoY2FjaGVba2V5
TmFtZV0gIT09IFVOREVGSU5FRCkgeworICAgICAgICBjYWNoZWRWYWx1ZSA9IGNhY2hlW2tleU5h
bWVdOworICAgICAgfQorICAgICAgaGFkQ2FjaGVkVmFsdWUgPSB0cnVlOworICAgIH0KKworICAg
IHZhciByZXQgPSB0aGlzLl9zZXR0ZXIuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlLCBjYWNoZWRW
YWx1ZSk7CisKKyAgICAvLyBhbGxvd3Mgc2V0dGVyIHRvIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0
aGF0IGlzIGNhY2hlZCBhbHJlYWR5CisgICAgaWYgKGhhZENhY2hlZFZhbHVlICYmIGNhY2hlZFZh
bHVlID09PSByZXQpIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdmFyIHdhdGNo
ZWQgPSBtZXRhLnBlZWtXYXRjaGluZyhrZXlOYW1lKTsKKyAgICBpZiAod2F0Y2hlZCkgeworICAg
ICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKG9iaiwga2V5
TmFtZSk7CisgICAgfQorCisgICAgaWYgKGhhZENhY2hlZFZhbHVlKSB7CisgICAgICBjYWNoZVtr
ZXlOYW1lXSA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBpZiAoIWhhZENhY2hlZFZhbHVlKSB7
CisgICAgICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywg
b2JqLCBrZXlOYW1lLCBtZXRhKTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09PSB1bmRlZmluZWQp
IHsKKyAgICAgIGNhY2hlW2tleU5hbWVdID0gVU5ERUZJTkVEOworICAgIH0gZWxzZSB7CisgICAg
ICBjYWNoZVtrZXlOYW1lXSA9IHJldDsKKyAgICB9CisKKyAgICBpZiAod2F0Y2hlZCkgeworICAg
ICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlEaWRDaGFuZ2Uob2JqLCBrZXlO
YW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9OworCisgIC8qIGNhbGxlZCBiZWZv
cmUgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiAqLworICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBl
LnRlYXJkb3duID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIGlmICh0aGlzLl92b2xh
dGlsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFs
TWV0YS5tZXRhKG9iaik7CisgICAgdmFyIGNhY2hlID0gbWV0YS5yZWFkYWJsZUNhY2hlKCk7Cisg
ICAgaWYgKGNhY2hlICYmIGNhY2hlW2tleU5hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVwZW5kZW50X2tleXMucmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtl
eU5hbWUsIG1ldGEpOworICAgICAgY2FjaGVba2V5TmFtZV0gPSB1bmRlZmluZWQ7CisgICAgfQor
ICB9OworCisgIC8qKgorICAgIFRoaXMgaGVscGVyIHJldHVybnMgYSBuZXcgcHJvcGVydHkgZGVz
Y3JpcHRvciB0aGF0IHdyYXBzIHRoZSBwYXNzZWQKKyAgICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5j
dGlvbi4gWW91IGNhbiB1c2UgdGhpcyBoZWxwZXIgdG8gZGVmaW5lIHByb3BlcnRpZXMKKyAgICB3
aXRoIG1peGlucyBvciB2aWEgYEVtYmVyLmRlZmluZVByb3BlcnR5KClgLgorICAKKyAgICBJZiB5
b3UgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBn
ZXR0ZXIuIEEgY29tcHV0ZWQKKyAgICBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoaXMgd2F5IG1pZ2h0
IGxvb2sgbGlrZSB0aGlzOgorICAKKyAgICBgYGBqcworICAgIGxldCBQZXJzb24gPSBFbWJlci5P
YmplY3QuZXh0ZW5kKHsKKyAgICAgIGluaXQoKSB7CisgICAgICAgIHRoaXMuX3N1cGVyKC4uLmFy
Z3VtZW50cyk7CisgIAorICAgICAgICB0aGlzLmZpcnN0TmFtZSA9ICdCZXR0eSc7CisgICAgICAg
IHRoaXMubGFzdE5hbWUgPSAnSm9uZXMnOworICAgICAgfSwKKyAgCisgICAgICBmdWxsTmFtZTog
RW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIGZ1bmN0aW9uKCkgeworICAg
ICAgICByZXR1cm4gYCR7dGhpcy5nZXQoJ2ZpcnN0TmFtZScpfSAke3RoaXMuZ2V0KCdsYXN0TmFt
ZScpfWA7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICBsZXQgY2xpZW50ID0gUGVyc29uLmNy
ZWF0ZSgpOworICAKKyAgICBjbGllbnQuZ2V0KCdmdWxsTmFtZScpOyAvLyAnQmV0dHkgSm9uZXMn
CisgIAorICAgIGNsaWVudC5zZXQoJ2xhc3ROYW1lJywgJ0Z1bGxlcicpOworICAgIGNsaWVudC5n
ZXQoJ2Z1bGxOYW1lJyk7IC8vICdCZXR0eSBGdWxsZXInCisgICAgYGBgCisgIAorICAgIFlvdSBj
YW4gcGFzcyBhIGhhc2ggd2l0aCB0d28gZnVuY3Rpb25zLCBgZ2V0YCBhbmQgYHNldGAsIGFzIGFu
CisgICAgYXJndW1lbnQgdG8gcHJvdmlkZSBib3RoIGEgZ2V0dGVyIGFuZCBzZXR0ZXI6CisgIAor
ICAgIGBgYGpzCisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
aW5pdCgpIHsKKyAgICAgICAgdGhpcy5fc3VwZXIoLi4uYXJndW1lbnRzKTsKKyAgCisgICAgICAg
IHRoaXMuZmlyc3ROYW1lID0gJ0JldHR5JzsKKyAgICAgICAgdGhpcy5sYXN0TmFtZSA9ICdKb25l
cyc7CisgICAgICB9LAorICAKKyAgICAgIGZ1bGxOYW1lOiBFbWJlci5jb21wdXRlZCgnZmlyc3RO
YW1lJywgJ2xhc3ROYW1lJywgeworICAgICAgICBnZXQoa2V5KSB7CisgICAgICAgICAgcmV0dXJu
IGAke3RoaXMuZ2V0KCdmaXJzdE5hbWUnKX0gJHt0aGlzLmdldCgnbGFzdE5hbWUnKX1gOworICAg
ICAgICB9LAorICAgICAgICBzZXQoa2V5LCB2YWx1ZSkgeworICAgICAgICAgIGxldCBbZmlyc3RO
YW1lLCBsYXN0TmFtZV0gPSB2YWx1ZS5zcGxpdCgvXHMrLyk7CisgICAgICAgICAgdGhpcy5zZXRQ
cm9wZXJ0aWVzKHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9KTsKKyAgICAgICAgICByZXR1cm4gdmFs
dWU7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pCisgIAorICAgIGxldCBjbGllbnQgPSBQ
ZXJzb24uY3JlYXRlKCk7CisgICAgY2xpZW50LmdldCgnZmlyc3ROYW1lJyk7IC8vICdCZXR0eScK
KyAgCisgICAgY2xpZW50LnNldCgnZnVsbE5hbWUnLCAnQ2Fycm9sbCBGdWxsZXInKTsKKyAgICBj
bGllbnQuZ2V0KCdmaXJzdE5hbWUnKTsgLy8gJ0NhcnJvbGwnCisgICAgYGBgCisgIAorICAgIFRo
ZSBgc2V0YCBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHR3byBwYXJhbWV0ZXJzLCBga2V5YCBhbmQg
YHZhbHVlYC4gVGhlIHZhbHVlCisgICAgcmV0dXJuZWQgZnJvbSBgc2V0YCB3aWxsIGJlIHRoZSBu
ZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAKKyAgICBfTm90ZTogVGhpcyBpcyB0aGUgcHJl
ZmVycmVkIHdheSB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyB3aGVuIHdyaXRpbmcgdGhp
cmQtcGFydHkKKyAgICBsaWJyYXJpZXMgdGhhdCBkZXBlbmQgb24gb3IgdXNlIEVtYmVyLCBzaW5j
ZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgdXNlcgorICAgIHdpbGwgaGF2ZSBbcHJv
dG90eXBlIEV4dGVuc2lvbnNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvY29uZmlndXJpbmct
ZW1iZXIvZGlzYWJsaW5nLXByb3RvdHlwZS1leHRlbnNpb25zLykgZW5hYmxlZC5fCisgIAorICAg
IFRoZSBhbHRlcm5hdGl2ZSBzeW50YXgsIHdpdGggcHJvdG90eXBlIGV4dGVuc2lvbnMsIG1pZ2h0
IGxvb2sgbGlrZToKKyAgCisgICAgYGBganMKKyAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7Cisg
ICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3RO
YW1lJyk7CisgICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgICBgYGAK
KyAgCisgICAgQGNsYXNzIGNvbXB1dGVkCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBjb25z
dHJ1Y3RvcgorICAgIEBzdGF0aWMKKyAgICBAcGFyYW0ge1N0cmluZ30gW2RlcGVuZGVudEtleXMq
XSBPcHRpb25hbCBkZXBlbmRlbnQga2V5cyB0aGF0IHRyaWdnZXIgdGhpcyBjb21wdXRlZCBwcm9w
ZXJ0eS4KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBm
dW5jdGlvbi4KKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBwcm9wZXJ0eSBk
ZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvbXB1
dGVkKGZ1bmMpIHsKKyAgICB2YXIgYXJnczsKKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4g
MSkgeworICAgICAgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAgIGZ1bmMg
PSBhcmdzLnBvcCgpOworICAgIH0KKworICAgIHZhciBjcCA9IG5ldyBDb21wdXRlZFByb3BlcnR5
KGZ1bmMpOworCisgICAgaWYgKGFyZ3MpIHsKKyAgICAgIGNwLnByb3BlcnR5LmFwcGx5KGNwLCBh
cmdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3A7CisgIH0KKworICAvKioKKyAgICBSZXR1cm5z
IHRoZSBjYWNoZWQgdmFsdWUgZm9yIGEgcHJvcGVydHksIGlmIG9uZSBleGlzdHMuCisgICAgVGhp
cyBjYW4gYmUgdXNlZnVsIGZvciBwZWVraW5nIGF0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkCisg
ICAgcHJvcGVydHkgdGhhdCBpcyBnZW5lcmF0ZWQgbGF6aWx5LCB3aXRob3V0IGFjY2lkZW50YWxs
eSBjYXVzaW5nCisgICAgaXQgdG8gYmUgY3JlYXRlZC4KKyAgCisgICAgQG1ldGhvZCBjYWNoZUZv
cgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIHRoZSBvYmplY3Qgd2hv
c2UgcHJvcGVydHkgeW91IHdhbnQgdG8gY2hlY2sKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBjYWNoZWQgdmFsdWUgeW91IHdhbnQKKyAgICAg
IHRvIHJldHVybgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIGNhY2hlZCB2YWx1ZQorICAgIEBw
dWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24gY2FjaGVGb3Iob2JqLCBrZXkpIHsKKyAgICB2YXIgbWV0
YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIHZhciBjYWNoZSA9IG1ldGEg
JiYgbWV0YS5zb3VyY2UgPT09IG9iaiAmJiBtZXRhLnJlYWRhYmxlQ2FjaGUoKTsKKyAgICB2YXIg
cmV0ID0gY2FjaGUgJiYgY2FjaGVba2V5XTsKKworICAgIGlmIChyZXQgPT09IFVOREVGSU5FRCkg
eworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQor
CisgIGNhY2hlRm9yLnNldCA9IGZ1bmN0aW9uIChjYWNoZSwga2V5LCB2YWx1ZSkgeworICAgIGlm
ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjYWNoZVtrZXldID0gVU5ERUZJTkVEOwor
ICAgIH0gZWxzZSB7CisgICAgICBjYWNoZVtrZXldID0gdmFsdWU7CisgICAgfQorICB9OworCisg
IGNhY2hlRm9yLmdldCA9IGZ1bmN0aW9uIChjYWNoZSwga2V5KSB7CisgICAgdmFyIHJldCA9IGNh
Y2hlW2tleV07CisgICAgaWYgKHJldCA9PT0gVU5ERUZJTkVEKSB7CisgICAgICByZXR1cm4gdW5k
ZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9OworCisgIGNhY2hlRm9yLnJlbW92
ZSA9IGZ1bmN0aW9uIChjYWNoZSwga2V5KSB7CisgICAgY2FjaGVba2V5XSA9IHVuZGVmaW5lZDsK
KyAgfTsKKworICBleHBvcnRzLkNvbXB1dGVkUHJvcGVydHkgPSBDb21wdXRlZFByb3BlcnR5Owor
ICBleHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7CisgIGV4cG9ydHMuY2FjaGVGb3IgPSBjYWNo
ZUZvcjsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9jb21wdXRlZF9tYWNyb3MnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1t
ZXRhbC9pc19lbXB0eScsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1ldGFsL2FsaWFz
JywgJ2VtYmVyLW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsSXNfZW1wdHksIF9lbWJl
ck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVy
dGllcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5lbXB0eSA9IGVtcHR5OworICBl
eHBvcnRzLm5vdEVtcHR5ID0gbm90RW1wdHk7CisgIGV4cG9ydHMubm9uZSA9IG5vbmU7CisgIGV4
cG9ydHMubm90ID0gbm90OworICBleHBvcnRzLmJvb2wgPSBib29sOworICBleHBvcnRzLm1hdGNo
ID0gbWF0Y2g7CisgIGV4cG9ydHMuZXF1YWwgPSBlcXVhbDsKKyAgZXhwb3J0cy5ndCA9IGd0Owor
ICBleHBvcnRzLmd0ZSA9IGd0ZTsKKyAgZXhwb3J0cy5sdCA9IGx0OworICBleHBvcnRzLmx0ZSA9
IGx0ZTsKKyAgZXhwb3J0cy5vbmVXYXkgPSBvbmVXYXk7CisgIGV4cG9ydHMucmVhZE9ubHkgPSBy
ZWFkT25seTsKKyAgZXhwb3J0cy5kZXByZWNhdGluZ0FsaWFzID0gZGVwcmVjYXRpbmdBbGlhczsK
KworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLW1ldGFsCisgICov
CisKKyAgZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhzZWxmLCBwcm9wZXJ0eU5hbWVzKSB7CisgICAg
dmFyIHJldCA9IHt9OworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5n
dGg7IGkrKykgeworICAgICAgcmV0W3Byb3BlcnR5TmFtZXNbaV1dID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHNlbGYsIHByb3BlcnR5TmFtZXNbaV0pOworICAgIH0KKyAgICByZXR1cm4g
cmV0OworICB9CisKKyAgZnVuY3Rpb24gZ2VuZXJhdGVDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKG1h
Y3JvKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBleHBhbmRlZFByb3Bl
cnRpZXMgPSBbXTsKKyAgICAgIHZhciBjb21wdXRlZEZ1bmMgPSBfZW1iZXJNZXRhbENvbXB1dGVk
LmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIG1hY3JvLmFwcGx5KHRoaXMs
IFtnZXRQcm9wZXJ0aWVzKHRoaXMsIGV4cGFuZGVkUHJvcGVydGllcyldKTsKKyAgICAgIH0pOwor
CisgICAgICBmdW5jdGlvbiBleHRyYWN0UHJvcGVydHkoZW50cnkpIHsKKyAgICAgICAgZXhwYW5k
ZWRQcm9wZXJ0aWVzLnB1c2goZW50cnkpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfbGVu
ID0gYXJndW1lbnRzLmxlbmd0aCwgcHJvcGVydGllcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsg
X2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBwcm9wZXJ0aWVzW19rZXldID0gYXJndW1l
bnRzW19rZXldOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRp
ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVydGllcy5k
ZWZhdWx0KHByb3BlcnRpZXNbaV0sIGV4dHJhY3RQcm9wZXJ0eSk7CisgICAgICB9CisKKyAgICAg
IHJldHVybiBjb21wdXRlZEZ1bmMucHJvcGVydHkuYXBwbHkoY29tcHV0ZWRGdW5jLCBleHBhbmRl
ZFByb3BlcnRpZXMpOworICAgIH07CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50CisgICAg
cHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkg
ZnVuY3Rpb24uCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZh
ciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaXNEb25lOiBFbWJlci5j
b21wdXRlZC5lbXB0eSgndG9kb3MnKQorICAgIH0pOworICAKKyAgICB2YXIgdG9kb0xpc3QgPSBU
b0RvTGlzdC5jcmVhdGUoeworICAgICAgdG9kb3M6IFsnVW5pdCBUZXN0JywgJ0RvY3VtZW50YXRp
b24nLCAnUmVsZWFzZSddCisgICAgfSk7CisgIAorICAgIHRvZG9MaXN0LmdldCgnaXNEb25lJyk7
IC8vIGZhbHNlCisgICAgdG9kb0xpc3QuZ2V0KCd0b2RvcycpLmNsZWFyKCk7CisgICAgdG9kb0xp
c3QuZ2V0KCdpc0RvbmUnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAc2luY2UgMS42LjAK
KyAgICBAbWV0aG9kIGVtcHR5CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBuZWdhdGUKKyAgICB0aGUgb3JpZ2luYWwgdmFsdWUg
Zm9yIHByb3BlcnR5CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGVtcHR5KGRlcGVu
ZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVu
ZGVudEtleSArICcubGVuZ3RoJywgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsSXNfZW1wdHkuZGVmYXVsdChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgZGVw
ZW5kZW50S2V5KSk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50CisgICAg
cHJvcGVydHkgaXMgTk9UIG51bGwsIGFuIGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksIG9yIGVt
cHR5IGZ1bmN0aW9uLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFzU3R1ZmY6IEVt
YmVyLmNvbXB1dGVkLm5vdEVtcHR5KCdiYWNrcGFjaycpCisgICAgfSk7CisgIAorICAgIHZhciBo
YW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoeyBiYWNrcGFjazogWydGb29kJywgJ1NsZWVwaW5nIEJh
ZycsICdUZW50J10gfSk7CisgIAorICAgIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAgICAgICAg
IC8vIHRydWUKKyAgICBoYW1zdGVyLmdldCgnYmFja3BhY2snKS5jbGVhcigpOyAvLyBbXQorICAg
IGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAgICAgICAgIC8vIGZhbHNlCisgICAgYGBgCisgIAor
ICAgIEBtZXRob2Qgbm90RW1wdHkKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVy
dHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgorICAgIG9yaWdpbmFs
IHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBub3QgZW1wdHkuCisgICAgQHB1YmxpYworICAqLworCisg
IGZ1bmN0aW9uIG5vdEVtcHR5KGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRh
bENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSArICcubGVuZ3RoJywgZnVuY3Rpb24gKCkg
eworICAgICAgcmV0dXJuICFfZW1iZXJNZXRhbElzX2VtcHR5LmRlZmF1bHQoX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOworICAgIH0pOworICB9CisKKyAg
LyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFs
dWUgb2YgdGhlIGRlcGVuZGVudAorICAgIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcKKyAgICBhYm91dCB1c2Ug
b2YgPT0sIHdoaWNoIGNhbiBiZSB0ZWNobmljYWxseSBjb25mdXNpbmcuCisgIAorICAgIEV4YW1w
bGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICBpc0h1bmdyeTogRW1iZXIuY29tcHV0ZWQubm9uZSgnZm9vZCcpCisg
ICAgfSk7CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAg
aGFtc3Rlci5nZXQoJ2lzSHVuZ3J5Jyk7IC8vIHRydWUKKyAgICBoYW1zdGVyLnNldCgnZm9vZCcs
ICdCYW5hbmEnKTsKKyAgICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8gZmFsc2UKKyAgICBo
YW1zdGVyLnNldCgnZm9vZCcsIG51bGwpOworICAgIGhhbXN0ZXIuZ2V0KCdpc0h1bmdyeScpOyAv
LyB0cnVlCisgICAgYGBgCisgIAorICAgIEBtZXRob2Qgbm9uZQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKKyAgICByZXR1cm5z
IHRydWUgaWYgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVk
LgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBub25lKGRlcGVuZGVudEtleSkgewor
ICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVu
Y3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKKyAgICB9KTsKKyAg
fQorCisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRoZSBpbnZl
cnNlIGJvb2xlYW4gdmFsdWUKKyAgICBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRoZSBkZXBl
bmRlbnQgcHJvcGVydHkuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBpc0Fub255bW91czog
RW1iZXIuY29tcHV0ZWQubm90KCdsb2dnZWRJbicpCisgICAgfSk7CisgIAorICAgIHZhciB1c2Vy
ID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0pOworICAKKyAgICB1c2VyLmdldCgnaXNB
bm9ueW1vdXMnKTsgLy8gdHJ1ZQorICAgIHVzZXIuc2V0KCdsb2dnZWRJbicsIHRydWUpOworICAg
IHVzZXIuZ2V0KCdpc0Fub255bW91cycpOyAvLyBmYWxzZQorICAgIGBgYAorICAKKyAgICBAbWV0
aG9kIG5vdAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQg
cHJvcGVydHkgd2hpY2ggcmV0dXJucworICAgIGludmVyc2Ugb2YgdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBub3QoZGVwZW5k
ZW50S2V5KSB7CisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5k
ZW50S2V5LCBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gIV9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNvbnZlcnRzIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg
cHJvcGVydHkKKyAgICBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBoYXNCYW5h
bmFzOiBFbWJlci5jb21wdXRlZC5ib29sKCdudW1CYW5hbmFzJykKKyAgICB9KTsKKyAgCisgICAg
dmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnaGFz
QmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMCk7Cisg
ICAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UKKyAgICBoYW1zdGVyLnNldCgn
bnVtQmFuYW5hcycsIDEpOworICAgIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIHRydWUK
KyAgICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIG51bGwpOworICAgIGhhbXN0ZXIuZ2V0KCdo
YXNCYW5hbmFzJyk7IC8vIGZhbHNlCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYm9vbAorICAg
IEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Cisg
ICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hp
Y2ggY29udmVydHMKKyAgICB0byBib29sZWFuIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVy
dHkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gYm9vbChkZXBlbmRlbnRLZXkpIHsK
KyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0
aGlzLCBkZXBlbmRlbnRLZXkpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRl
ZCBwcm9wZXJ0eSB3aGljaCBtYXRjaGVzIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlCisgICAg
ZGVwZW5kZW50IHByb3BlcnR5IGFnYWluc3QgYSBnaXZlbiBSZWdFeHAsIHJldHVybmluZyBgdHJ1
ZWAKKyAgICBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgUmVnRXhwIGFuZCBgZmFsc2VgIGlmIGl0
IGRvZXMgbm90LgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2
YXIgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFzVmFsaWRFbWFpbDogRW1i
ZXIuY29tcHV0ZWQubWF0Y2goJ2VtYWlsJywgL14uK0AuK1wuLiskLykKKyAgICB9KTsKKyAgCisg
ICAgdmFyIHVzZXIgPSBVc2VyLmNyZWF0ZSh7bG9nZ2VkSW46IGZhbHNlfSk7CisgIAorICAgIHVz
ZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCisgICAgdXNlci5zZXQoJ2VtYWlsJywg
JycpOworICAgIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCisgICAgdXNlci5z
ZXQoJ2VtYWlsJywgJ2VtYmVyX2hhbXN0ZXJAZXhhbXBsZS5jb20nKTsKKyAgICB1c2VyLmdldCgn
aGFzVmFsaWRFbWFpbCcpOyAvLyB0cnVlCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgbWF0Y2gK
KyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtl
eQorICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleHAKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRl
ZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBtYXRjaAorICAgIHRoZSBvcmlnaW5h
bCB2YWx1ZSBmb3IgcHJvcGVydHkgYWdhaW5zdCBhIGdpdmVuIFJlZ0V4cAorICAgIEBwdWJsaWMK
KyAgKi8KKworICBmdW5jdGlvbiBtYXRjaChkZXBlbmRlbnRLZXksIHJlZ2V4cCkgeworICAgIHJl
dHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24g
KCkgeworICAgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
IGRlcGVuZGVudEtleSk7CisKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcn
ID8gcmVnZXhwLnRlc3QodmFsdWUpIDogZmFsc2U7CisgICAgfSk7CisgIH0KKworICAvKioKKyAg
ICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBk
ZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgIAor
ICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBuYXBUaW1lOiBFbWJlci5jb21wdXRlZC5lcXVhbCgn
c3RhdGUnLCAnc2xlZXB5JykKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVy
LmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnbmFwVGltZScpOyAvLyBmYWxzZQorICAg
IGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdzbGVlcHknKTsKKyAgICBoYW1zdGVyLmdldCgnbmFwVGlt
ZScpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ3N0YXRlJywgJ2h1bmdyeScpOworICAgIGhh
bXN0ZXIuZ2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCisgICAgYGBgCisgIAorICAgIEBtZXRob2Qg
ZXF1YWwKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVu
ZGVudEtleQorICAgIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxPYmplY3R9IHZhbHVlCisgICAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0
dXJucyB0cnVlIGlmCisgICAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBlcXVh
bCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGVx
dWFsKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgZGVwZW5kZW50S2V5KSA9PT0gdmFsdWU7Cisg
ICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJu
cyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBncmVhdGVy
IHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
aGFzVG9vTWFueUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmd0KCdudW1CYW5hbmFzJywgMTApCisg
ICAgfSk7CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAg
aGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIGZhbHNlCisgICAgaGFtc3Rlci5z
ZXQoJ251bUJhbmFuYXMnLCAzKTsKKyAgICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMn
KTsgLy8gZmFsc2UKKyAgICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDExKTsKKyAgICBoYW1z
dGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBA
bWV0aG9kIGd0CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBk
ZXBlbmRlbnRLZXkKKyAgICBAcGFyYW0ge051bWJlcn0gdmFsdWUKKyAgICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUg
aWYKKyAgICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGdyZWF0ZXIgdGhhbiBn
aXZlbiB2YWx1ZS4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZ3QoZGVwZW5kZW50
S2V5LCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRl
cGVuZGVudEtleSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID4gdmFsdWU7CisgICAgfSk7CisgIH0KKwor
ICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBw
cm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwg
dG8gdGhlIHByb3ZpZGVkIHZhbHVlLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFz
VG9vTWFueUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmd0ZSgnbnVtQmFuYW5hcycsIDEwKQorICAg
IH0pOworICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIGhh
bXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0
KCdudW1CYW5hbmFzJywgMyk7CisgICAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7
IC8vIGZhbHNlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAxMCk7CisgICAgaGFtc3Rl
ci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIHRydWUKKyAgICBgYGAKKyAgCisgICAgQG1l
dGhvZCBndGUKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRl
cGVuZGVudEtleQorICAgIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZQorICAgIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBp
ZgorICAgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciBvciBlcXVh
bCB0aGVuIGdpdmVuIHZhbHVlLgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBndGUo
ZGVwZW5kZW50S2V5LCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID49IHZhbHVlOworICAgIH0p
OworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1
ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnR5CisgICAgaXMgbGVzcyB0aGFuIHRo
ZSBwcm92aWRlZCB2YWx1ZS4KKyAgCisgICAgRXhhbXBsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIG5lZWRzTW9y
ZUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmx0KCdudW1CYW5hbmFzJywgMykKKyAgICB9KTsKKyAg
CisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdl
dCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFu
YXMnLCAzKTsKKyAgICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQor
ICAgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMik7CisgICAgaGFtc3Rlci5nZXQoJ25lZWRz
TW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGx0CisgICAg
QGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAg
ICBAcGFyYW0ge051bWJlcn0gdmFsdWUKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl
cnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKKyAgICB0aGUgb3Jp
Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGxlc3MgdGhlbiBnaXZlbiB2YWx1ZS4KKyAgICBA
cHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbHQoZGVwZW5kZW50S2V5LCB2YWx1ZSkgeworICAg
IHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rp
b24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBk
ZXBlbmRlbnRLZXkpIDwgdmFsdWU7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1
dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg
cHJvcGVydHkKKyAgICBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVl
LgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3Rl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgbmVlZHNNb3JlQmFuYW5hczogRW1iZXIu
Y29tcHV0ZWQubHRlKCdudW1CYW5hbmFzJywgMykKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0
ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFu
YW5hcycpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCA1KTsKKyAgICBo
YW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0
KCdudW1CYW5hbmFzJywgMyk7CisgICAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsg
Ly8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGx0ZQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHBhcmFtIHtOdW1i
ZXJ9IHZhbHVlCisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQg
cHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCisgICAgdGhlIG9yaWdpbmFsIHZhbHVlIGZv
ciBwcm9wZXJ0eSBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gZ2l2ZW4gdmFsdWUuCisgICAgQHB1Ymxp
YworICAqLworCisgIGZ1bmN0aW9uIGx0ZShkZXBlbmRlbnRLZXksIHZhbHVlKSB7CisgICAgcmV0
dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVu
ZGVudEtleSkgPD0gdmFsdWU7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVk
IHByb3BlcnR5IHRoYXQgcGVyZm9ybXMgYSBsb2dpY2FsIGBhbmRgIG9uIHRoZQorICAgIG9yaWdp
bmFsIHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0aWVzLgorICAKKyAg
ICBZb3UgbWF5IHBhc3MgaW4gbW9yZSB0aGFuIHR3byBwcm9wZXJ0aWVzIGFuZCBldmVuIHVzZQor
ICAgIHByb3BlcnR5IGJyYWNlIGV4cGFuc2lvbi4gIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxs
CisgICAgcmV0dXJucyB0aGUgZmlyc3QgZmFsc3kgdmFsdWUgb3IgbGFzdCB0cnV0aHkgdmFsdWUK
KyAgICBqdXN0IGxpa2UgSmF2YVNjcmlwdCdzIGB8fGAgb3BlcmF0b3IuCisgIAorICAgIEV4YW1w
bGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICByZWFkeUZvckNhbXA6IEVtYmVyLmNvbXB1dGVkLmFuZCgnaGFzVGVu
dCcsICdoYXNCYWNrcGFjaycpLAorICAgICAgcmVhZHlGb3JIaWtlOiBFbWJlci5jb21wdXRlZC5h
bmQoJ2hhc1dhbGtpbmdTdGljaycsICdoYXNCYWNrcGFjaycpCisgICAgfSk7CisgIAorICAgIHZh
ciB0b21zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAgdG9tc3Rlci5nZXQoJ3JlYWR5
Rm9yQ2FtcCcpOyAvLyBmYWxzZQorICAgIHRvbXN0ZXIuc2V0KCdoYXNUZW50JywgdHJ1ZSk7Cisg
ICAgdG9tc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyBmYWxzZQorICAgIHRvbXN0ZXIuc2V0
KCdoYXNCYWNrcGFjaycsIHRydWUpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckNhbXAnKTsg
Ly8gdHJ1ZQorICAgIHRvbXN0ZXIuc2V0KCdoYXNCYWNrcGFjaycsICdZZXMnKTsKKyAgICB0b21z
dGVyLmdldCgncmVhZHlGb3JDYW1wJyk7IC8vICdZZXMnCisgICAgdG9tc3Rlci5zZXQoJ2hhc1dh
bGtpbmdTdGljaycsIG51bGwpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckhpa2UnKTsgLy8g
bnVsbAorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGFuZAorICAgIEBmb3IgRW1iZXIuY29tcHV0
ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zCisgICAg
YSBsb2dpY2FsIGBhbmRgIG9uIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMg
Zm9yIHByb3BlcnRpZXMuCisgICAgQHB1YmxpYworICAqLworICB2YXIgYW5kID0gZ2VuZXJhdGVD
b21wdXRlZFdpdGhQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7CisgICAgdmFyIHZh
bHVlOworICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CisgICAgICB2YWx1ZSA9IHBy
b3BlcnRpZXNba2V5XTsKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkg
JiYgIXZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHZhbHVlOworICB9KTsKKworICBleHBvcnRzLmFuZCA9IGFuZDsKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBwZXJmb3JtcyBhIGxvZ2ljYWwgYG9yYCBvbiB0aGUK
KyAgICBvcmlnaW5hbCB2YWx1ZXMgZm9yIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGll
cy4KKyAgCisgICAgWW91IG1heSBwYXNzIGluIG1vcmUgdGhhbiB0d28gcHJvcGVydGllcyBhbmQg
ZXZlbiB1c2UKKyAgICBwcm9wZXJ0eSBicmFjZSBleHBhbnNpb24uICBUaGUgY29tcHV0ZWQgcHJv
cGVydHkgd2lsbAorICAgIHJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSBvciBsYXN0IGZh
bHN5IHZhbHVlIGp1c3QKKyAgICBsaWtlIEphdmFTY3JpcHQncyBgfHxgIG9wZXJhdG9yLgorICAK
KyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoeworICAgICAgcmVhZHlGb3JSYWluOiBFbWJlci5jb21wdXRlZC5v
cignaGFzSmFja2V0JywgJ2hhc1VtYnJlbGxhJyksCisgICAgICByZWFkeUZvckJlYWNoOiBFbWJl
ci5jb21wdXRlZC5vcigne2hhc1N1bnNjcmVlbixoYXNVbWJyZWxsYX0nKQorICAgIH0pOworICAK
KyAgICB2YXIgdG9tc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIHRvbXN0ZXIuZ2V0
KCdyZWFkeUZvclJhaW4nKTsgLy8gdW5kZWZpbmVkCisgICAgdG9tc3Rlci5zZXQoJ2hhc1VtYnJl
bGxhJywgdHJ1ZSk7CisgICAgdG9tc3Rlci5nZXQoJ3JlYWR5Rm9yUmFpbicpOyAvLyB0cnVlCisg
ICAgdG9tc3Rlci5zZXQoJ2hhc0phY2tldCcsICdZZXMnKTsKKyAgICB0b21zdGVyLmdldCgncmVh
ZHlGb3JSYWluJyk7IC8vICdZZXMnCisgICAgdG9tc3Rlci5zZXQoJ2hhc1N1bnNjcmVlbicsICdD
aGVjaycpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckJlYWNoJyk7IC8vICdDaGVjaycKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBvcgorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBA
cGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zCisgICAgYSBsb2dpY2Fs
IGBvcmAgb24gdGhlIHZhbHVlcyBvZiBhbGwgdGhlIG9yaWdpbmFsIHZhbHVlcyBmb3IgcHJvcGVy
dGllcy4KKyAgICBAcHVibGljCisgICovCisgIHZhciBvciA9IGdlbmVyYXRlQ29tcHV0ZWRXaXRo
UHJvcGVydGllcyhmdW5jdGlvbiAocHJvcGVydGllcykgeworICAgIHZhciB2YWx1ZTsKKyAgICBm
b3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgeworICAgICAgdmFsdWUgPSBwcm9wZXJ0aWVzW2tl
eV07CisgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlKSB7
CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVl
OworICB9KTsKKworICBleHBvcnRzLm9yID0gb3I7CisgIC8qKgorICAgIENyZWF0ZXMgYSBuZXcg
cHJvcGVydHkgdGhhdCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBwcm9wZXJ0eQorICAgIG9uIGFu
IG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBiZWhhdmUgYXMK
KyAgICB0aG91Z2ggdGhleSB3ZXJlIGNhbGxlZCBvbiB0aGUgb3JpZ2luYWwgcHJvcGVydHkuCisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7CisgICAgICBuYW1lOiAnQWxleCBNYXRjaG5lZXInLAorICAgICAgbm9tZW46IEVtYmVyLmNv
bXB1dGVkLmFsaWFzKCduYW1lJykKKyAgICB9KTsKKyAgCisgICAgdmFyIGFsZXggPSBQZXJzb24u
Y3JlYXRlKCk7CisgIAorICAgIGFsZXguZ2V0KCdub21lbicpOyAvLyAnQWxleCBNYXRjaG5lZXIn
CisgICAgYWxleC5nZXQoJ25hbWUnKTsgIC8vICdBbGV4IE1hdGNobmVlcicKKyAgCisgICAgYWxl
eC5zZXQoJ25vbWVuJywgJ0BtYWNodHknKTsKKyAgICBhbGV4LmdldCgnbmFtZScpOyAgLy8gJ0Bt
YWNodHknCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYWxpYXMKKyAgICBAZm9yIEVtYmVyLmNv
bXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4K
KyAgICBhbGlhcyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5LgorICAgIEBwdWJs
aWMKKyAgKi8KKworICAvKioKKyAgICBXaGVyZSBgY29tcHV0ZWQuYWxpYXNgIGFsaWFzZXMgYGdl
dGAgYW5kIGBzZXRgLCBhbmQgYWxsb3dzIGZvciBiaWRpcmVjdGlvbmFsCisgICAgZGF0YSBmbG93
LCBgY29tcHV0ZWQub25lV2F5YCBvbmx5IHByb3ZpZGVzIGFuIGFsaWFzZWQgYGdldGAuIFRoZSBg
c2V0YCB3aWxsCisgICAgbm90IG11dGF0ZSB0aGUgdXBzdHJlYW0gcHJvcGVydHksIHJhdGhlciBj
YXVzZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkgdG8KKyAgICBiZWNvbWUgdGhlIHZhbHVlIHNldC4g
VGhpcyBjYXVzZXMgdGhlIGRvd25zdHJlYW0gcHJvcGVydHkgdG8gcGVybWFuZW50bHkKKyAgICBk
aXZlcmdlIGZyb20gdGhlIHVwc3RyZWFtIHByb3BlcnR5LgorICAKKyAgICBFeGFtcGxlCisgIAor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgICAgZmlyc3ROYW1lOiBudWxsLAorICAgICAgbGFzdE5hbWU6IG51bGwsCisgICAgICBuaWNr
TmFtZTogRW1iZXIuY29tcHV0ZWQub25lV2F5KCdmaXJzdE5hbWUnKQorICAgIH0pOworICAKKyAg
ICB2YXIgdGVkZHkgPSBVc2VyLmNyZWF0ZSh7CisgICAgICBmaXJzdE5hbWU6ICdUZWRkeScsCisg
ICAgICBsYXN0TmFtZTogICdaZWVubnknCisgICAgfSk7CisgIAorICAgIHRlZGR5LmdldCgnbmlj
a05hbWUnKTsgICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICB0ZWRkeS5zZXQoJ25pY2tOYW1l
JywgJ1RlZGR5QmVhcicpOyAvLyAnVGVkZHlCZWFyJworICAgIHRlZGR5LmdldCgnZmlyc3ROYW1l
Jyk7ICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBvbmVX
YXkKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3Bl
cnR5IHdoaWNoIGNyZWF0ZXMgYQorICAgIG9uZSB3YXkgY29tcHV0ZWQgcHJvcGVydHkgdG8gdGhl
IG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVu
Y3Rpb24gb25lV2F5KGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbEFsaWFz
LmRlZmF1bHQoZGVwZW5kZW50S2V5KS5vbmVXYXkoKTsKKyAgfQorCisgIC8qKgorICAgIFRoaXMg
aXMgYSBtb3JlIHNlbWFudGljYWxseSBtZWFuaW5nZnVsIGFsaWFzIG9mIGBjb21wdXRlZC5vbmVX
YXlgLAorICAgIHdob3NlIG5hbWUgaXMgc29tZXdoYXQgYW1iaWd1b3VzIGFzIHRvIHdoaWNoIGRp
cmVjdGlvbiB0aGUgZGF0YSBmbG93cy4KKyAgCisgICAgQG1ldGhvZCByZWFkcworICAgIEBmb3Ig
RW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY3Jl
YXRlcyBhCisgICAgICBvbmUgd2F5IGNvbXB1dGVkIHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCB2
YWx1ZSBmb3IgcHJvcGVydHkuCisgICAgQHB1YmxpYworICAgKi8KKworICAvKioKKyAgICBXaGVy
ZSBgY29tcHV0ZWQub25lV2F5YCBwcm92aWRlcyBvbmVXYXkgYmluZGluZ3MsIGBjb21wdXRlZC5y
ZWFkT25seWAgcHJvdmlkZXMKKyAgICBhIHJlYWRPbmx5IG9uZSB3YXkgYmluZGluZy4gVmVyeSBv
ZnRlbiB3aGVuIHVzaW5nIGBjb21wdXRlZC5vbmVXYXlgIG9uZSBkb2VzCisgICAgbm90IGFsc28g
d2FudCBjaGFuZ2VzIHRvIHByb3BhZ2F0ZSBiYWNrIHVwLCBhcyB0aGV5IHdpbGwgcmVwbGFjZSB0
aGUgdmFsdWUuCisgIAorICAgIFRoaXMgcHJldmVudHMgdGhlIHJldmVyc2UgZmxvdywgYW5kIGFs
c28gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IG9jY3Vycy4KKyAgCisgICAgRXhhbXBsZQor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFVzZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KHsKKyAgICAgIGZpcnN0TmFtZTogbnVsbCwKKyAgICAgIGxhc3ROYW1lOiBudWxsLAorICAgICAg
bmlja05hbWU6IEVtYmVyLmNvbXB1dGVkLnJlYWRPbmx5KCdmaXJzdE5hbWUnKQorICAgIH0pOwor
ICAKKyAgICB2YXIgdGVkZHkgPSBVc2VyLmNyZWF0ZSh7CisgICAgICBmaXJzdE5hbWU6ICdUZWRk
eScsCisgICAgICBsYXN0TmFtZTogICdaZWVubnknCisgICAgfSk7CisgIAorICAgIHRlZGR5Lmdl
dCgnbmlja05hbWUnKTsgICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICB0ZWRkeS5zZXQoJ25p
Y2tOYW1lJywgJ1RlZGR5QmVhcicpOyAvLyB0aHJvd3MgRXhjZXB0aW9uCisgICAgLy8gdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCdDYW5ub3QgU2V0OiBuaWNrTmFtZSBvbjogPFVzZXI6ZW1iZXIyNzI4
OD4nICk7YAorICAgIHRlZGR5LmdldCgnZmlyc3ROYW1lJyk7ICAgICAgICAgICAgIC8vICdUZWRk
eScKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZWFkT25seQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY3JlYXRlcyBhCisg
ICAgb25lIHdheSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHBy
b3BlcnR5LgorICAgIEBzaW5jZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biByZWFkT25seShkZXBlbmRlbnRLZXkpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxBbGlhcy5k
ZWZhdWx0KGRlcGVuZGVudEtleSkucmVhZE9ubHkoKTsKKyAgfQorCisgIC8qKgorICAgIENyZWF0
ZXMgYSBuZXcgcHJvcGVydHkgdGhhdCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBwcm9wZXJ0eQor
ICAgIG9uIGFuIG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBi
ZWhhdmUgYXMKKyAgICB0aG91Z2ggdGhleSB3ZXJlIGNhbGxlZCBvbiB0aGUgb3JpZ2luYWwgcHJv
cGVydHksIGJ1dCBhbHNvCisgICAgcHJpbnQgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgorICAKKyAg
ICBAbWV0aG9kIGRlcHJlY2F0aW5nQWxpYXMKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAg
QHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KKyAgICBhbGlhcyB3
aXRoIGEgZGVwcmVjYXRpb24gdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKyAg
ICBAc2luY2UgMS43LjAKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZGVwcmVjYXRp
bmdBbGlhcyhkZXBlbmRlbnRLZXksIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIHsKKyAgICAgIGdldDogZnVuY3Rpb24gKGtl
eSkgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnVXNhZ2Ugb2YgYCcgKyBr
ZXkgKyAnYCBpcyBkZXByZWNhdGVkLCB1c2UgYCcgKyBkZXBlbmRlbnRLZXkgKyAnYCBpbnN0ZWFk
LicsIGZhbHNlLCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rp
b24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Vz
YWdlIG9mIGAnICsga2V5ICsgJ2AgaXMgZGVwcmVjYXRlZCwgdXNlIGAnICsgZGVwZW5kZW50S2V5
ICsgJ2AgaW5zdGVhZC4nLCBmYWxzZSwgb3B0aW9ucyk7CisgICAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCBkZXBlbmRlbnRLZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJu
IHZhbHVlOworICAgICAgfQorICAgIH0pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwv
Y29yZScsIFsnZXhwb3J0cycsICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWly
ZSkgeworICAvKmdsb2JhbHMgRW1iZXI6dHJ1ZSxFTlYsRW1iZXJFTlYgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRh
bAorICAqLworCisgIC8qKgorICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCBFbWJlciBt
ZXRob2RzIGFuZCBmdW5jdGlvbnMuIEZ1dHVyZSB2ZXJzaW9ucyBvZgorICAgIEVtYmVyIG1heSBv
dmVyd3JpdGUgdGhpcyBuYW1lc3BhY2UgYW5kIHRoZXJlZm9yZSwgeW91IHNob3VsZCBhdm9pZCBh
ZGRpbmcgYW55CisgICAgbmV3IHByb3BlcnRpZXMuCisgIAorICAgIEF0IHRoZSBoZWFydCBvZiBF
bWJlciBpcyBFbWJlci1SdW50aW1lLCBhIHNldCBvZiBjb3JlIGZ1bmN0aW9ucyB0aGF0IHByb3Zp
ZGUKKyAgICBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5IGFuZCBvYmplY3QgcHJvcGVydHkg
b2JzZXJ2aW5nLiAgRW1iZXItUnVudGltZSBpcworICAgIHNtYWxsIGFuZCBwZXJmb3JtYW5jZS1m
b2N1c2VkIHNvIHlvdSBjYW4gdXNlIGl0IGFsb25nc2lkZSBvdGhlcgorICAgIGNyb3NzLXBsYXRm
b3JtIGxpYnJhcmllcyBzdWNoIGFzIGpRdWVyeS4gRm9yIG1vcmUgZGV0YWlscywgc2VlCisgICAg
W0VtYmVyLVJ1bnRpbWVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9hcGkvbW9kdWxlcy9lbWJlci1ydW50
aW1lLmh0bWwpLgorICAKKyAgICBAY2xhc3MgRW1iZXIKKyAgICBAc3RhdGljCisgICAgQHZlcnNp
b24gMi42LjIKKyAgICBAcHVibGljCisgICovCisKKyAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBl
b2YgRW1iZXIpIHsKKyAgICAvLyBDcmVhdGUgY29yZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2Ug
YW4gaW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNwYWNlIHNvIHRoYXQKKyAgICAvLyBvYmplY3RzIGFz
c2lnbmVkIHRvIGl0IGFyZSBnaXZlbiBhIHNhbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAg
IEVtYmVyID0ge307CisgIH0KKworICAvLyBEZWZhdWx0IGltcG9ydHMsIGV4cG9ydHMgYW5kIGxv
b2t1cCB0byB0aGUgZ2xvYmFsIG9iamVjdDsKKyAgdmFyIGdsb2JhbCA9IG1haW5Db250ZXh0IHx8
IHt9OyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKKyAgRW1iZXIuaW1wb3J0cyA9IEVtYmVyLmltcG9y
dHMgfHwgZ2xvYmFsOworICBFbWJlci5sb29rdXAgPSBFbWJlci5sb29rdXAgfHwgZ2xvYmFsOwor
ICB2YXIgZW1FeHBvcnRzID0gRW1iZXIuZXhwb3J0cyA9IEVtYmVyLmV4cG9ydHMgfHwgZ2xvYmFs
OworCisgIC8vIGFsaWFzZXMgbmVlZGVkIHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3Zpbmcg
dGhlIGdsb2JhbCBjb250ZXh0CisgIGVtRXhwb3J0cy5FbSA9IGVtRXhwb3J0cy5FbWJlciA9IEVt
YmVyOworCisgIC8vIE1ha2Ugc3VyZSB0aGVzZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFs
cmVhZHkgZGVmaW5lZCBvciBub3QKKworICBFbWJlci5pc05hbWVzcGFjZSA9IHRydWU7CisKKyAg
RW1iZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICdFbWJlcic7CisgIH07
CisKKyAgLy8gVGhlIGRlYnVnIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgdG8gZ2xvYmFscyB3aXRo
IGByZXF1aXJlYCB0bworICAvLyBwcmV2ZW50IGJhYmVsLXBsdWdpbi1maWx0ZXItaW1wb3J0cyBm
cm9tIHJlbW92aW5nIHRoZW0uCisgIHZhciBkZWJ1Z01vZHVsZSA9IF9yZXF1aXJlLmRlZmF1bHQo
J2VtYmVyLW1ldGFsL2RlYnVnJyk7CisgIEVtYmVyLmFzc2VydCA9IGRlYnVnTW9kdWxlLmFzc2Vy
dDsKKyAgRW1iZXIud2FybiA9IGRlYnVnTW9kdWxlLndhcm47CisgIEVtYmVyLmRlYnVnID0gZGVi
dWdNb2R1bGUuZGVidWc7CisgIEVtYmVyLmRlcHJlY2F0ZSA9IGRlYnVnTW9kdWxlLmRlcHJlY2F0
ZTsKKyAgRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGRlYnVnTW9kdWxlLmRlcHJlY2F0ZUZ1bmM7Cisg
IEVtYmVyLnJ1bkluRGVidWcgPSBkZWJ1Z01vZHVsZS5ydW5JbkRlYnVnOworCisgIC8qKgorICAg
IFRoZSBzZW1hbnRpYyB2ZXJzaW9uLgorICAKKyAgICBAcHJvcGVydHkgVkVSU0lPTgorICAgIEB0
eXBlIFN0cmluZworICAgIEBkZWZhdWx0ICcyLjYuMicKKyAgICBAc3RhdGljCisgICAgQHB1Ymxp
YworICAqLworICBFbWJlci5WRVJTSU9OID0gJzIuNi4yJzsKKworICAvKioKKyAgICBUaGUgaGFz
aCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgY29uZmln
dXJhdGlvbgorICAgIHNldHRpbmdzLiBUbyBzcGVjaWZ5IHlvdXIgb3duIG9yIG92ZXJyaWRlIGRl
ZmF1bHQgc2V0dGluZ3MsIGFkZCB0aGUKKyAgICBkZXNpcmVkIHByb3BlcnRpZXMgdG8gYSBnbG9i
YWwgaGFzaCBuYW1lZCBgRW1iZXJFTlZgIChvciBgRU5WYCBmb3IKKyAgICBiYWNrd2FyZHMgY29t
cGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgRW1iZXIpLiBUaGUgYEVtYmVyRU5W
YAorICAgIGhhc2ggbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBsb2FkaW5nIEVtYmVyLgorICAKKyAg
ICBAcHJvcGVydHkgRU5WCisgICAgQHR5cGUgT2JqZWN0CisgICAgQHB1YmxpYworICAqLworCisg
IGlmIChFbWJlci5FTlYpIHsKKyAgICAvLyBkbyBub3RoaW5nIGlmIEVtYmVyLkVOViBpcyBhbHJl
YWR5IHNldHVwCisgICAgRW1iZXIuYXNzZXJ0KCdFbWJlci5FTlYgc2hvdWxkIGJlIGFuIG9iamVj
dC4nLCAnb2JqZWN0JyAhPT0gdHlwZW9mIEVtYmVyLkVOVik7CisgIH0gZWxzZSBpZiAoJ3VuZGVm
aW5lZCcgIT09IHR5cGVvZiBFbWJlckVOVikgeworICAgIEVtYmVyLkVOViA9IEVtYmVyRU5WOwor
ICB9IGVsc2UgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgRU5WKSB7CisgICAgRW1iZXIuRU5W
ID0gRU5WOworICB9IGVsc2UgeworICAgIEVtYmVyLkVOViA9IHt9OworICB9CisKKyAgLy8gRU5B
QkxFX0FMTF9GRUFUVVJFUyB3YXMgZG9jdW1lbnRlZCwgYnV0IHlvdSBjYW4ndCBhY3R1YWxseSBl
bmFibGUgbm9uIG9wdGlvbmFsIGZlYXR1cmVzLgorICBpZiAoRW1iZXIuRU5WLkVOQUJMRV9BTExf
RkVBVFVSRVMpIHsKKyAgICBFbWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZFQVRVUkVTID0gRW1i
ZXIuRU5WLkVOQUJMRV9BTExfRkVBVFVSRVM7CisgIH0KKworICBFbWJlci5jb25maWcgPSBFbWJl
ci5jb25maWcgfHwge307CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBCT09UU1RSQVAKKyAgLy8KKworICAvKioK
KyAgICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGFkZCB0byBgQXJyYXlgLCBgRnVu
Y3Rpb25gLCBhbmQgYFN0cmluZ2AKKyAgICBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMsIGEgZmV3
IGV4dHJhIG1ldGhvZHMgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIG1vcmUKKyAgICBmcmllbmRseSBB
UEkuCisgIAorICAgIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgbGVhdmluZyB0aGlzIG9wdGlvbiBz
ZXQgdG8gdHJ1ZSBob3dldmVyLCBpZiB5b3UgbmVlZAorICAgIHRvIHR1cm4gaXQgb2ZmLCB5b3Ug
Y2FuIGFkZCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgIGBFWFRFTkRfUFJPVE9UWVBF
U2AgdG8gYEVtYmVyRU5WYCBhbmQgc2V0IGl0IHRvIGBmYWxzZWAuCisgIAorICAgIE5vdGUsIHdo
ZW4gZGlzYWJsZWQgKHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIEVtYmVyIEFkZG9ucyks
IHlvdSB3aWxsCisgICAgaW5zdGVhZCBoYXZlIHRvIGFjY2VzcyBhbGwgbWV0aG9kcyBhbmQgZnVu
Y3Rpb25zIGZyb20gdGhlIEVtYmVyCisgICAgbmFtZXNwYWNlLgorICAKKyAgICBAcHJvcGVydHkg
RVhURU5EX1BST1RPVFlQRVMKKyAgICBAdHlwZSBCb29sZWFuCisgICAgQGRlZmF1bHQgdHJ1ZQor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcHVibGljCisgICovCisgIEVtYmVyLkVYVEVORF9QUk9UT1RZ
UEVTID0gRW1iZXIuRU5WLkVYVEVORF9QUk9UT1RZUEVTOworCisgIGlmICh0eXBlb2YgRW1iZXIu
RVhURU5EX1BST1RPVFlQRVMgPT09ICd1bmRlZmluZWQnKSB7CisgICAgRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVMgPSB0cnVlOworICB9CisKKyAgLyoqCisgICAgVGhlIGBMT0dfU1RBQ0tUUkFDRV9P
Tl9ERVBSRUNBVElPTmAgcHJvcGVydHksIHdoZW4gdHJ1ZSwgdGVsbHMgRW1iZXIgdG8gbG9nCisg
ICAgYSBmdWxsIHN0YWNrIHRyYWNlIGR1cmluZyBkZXByZWNhdGlvbiB3YXJuaW5ncy4KKyAgCisg
ICAgQHByb3BlcnR5IExPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OCisgICAgQHR5cGUgQm9v
bGVhbgorICAgIEBkZWZhdWx0IHRydWUKKyAgICBAcHVibGljCisgICovCisgIEVtYmVyLkxPR19T
VEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OID0gRW1iZXIuRU5WLkxPR19TVEFDS1RSQUNFX09OX0RF
UFJFQ0FUSU9OICE9PSBmYWxzZTsKKworICAvKioKKyAgICBUaGUgYExPR19WRVJTSU9OYCBwcm9w
ZXJ0eSwgd2hlbiB0cnVlLCB0ZWxscyBFbWJlciB0byBsb2cgdmVyc2lvbnMgb2YgYWxsCisgICAg
ZGVwZW5kZW50IGxpYnJhcmllcyBpbiB1c2UuCisgIAorICAgIEBwcm9wZXJ0eSBMT0dfVkVSU0lP
TgorICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCB0cnVlCisgICAgQHB1YmxpYworICAq
LworICBFbWJlci5MT0dfVkVSU0lPTiA9IEVtYmVyLkVOVi5MT0dfVkVSU0lPTiA9PT0gZmFsc2Ug
PyBmYWxzZSA6IHRydWU7CisKKyAgLyoqCisgICAgQW4gZW1wdHkgZnVuY3Rpb24gdXNlZnVsIGZv
ciBzb21lIG9wZXJhdGlvbnMuIEFsd2F5cyByZXR1cm5zIGB0aGlzYC4KKyAgCisgICAgQG1ldGhv
ZCBLCisgICAgQHJldHVybiB7T2JqZWN0fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24g
SygpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICBleHBvcnRzLksgPSBLOworCisgIEVtYmVy
LksgPSBLOworICAvL1RPRE86IEVTNiBHTE9CQUwgVE9ETworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IEVtYmVyOworfSk7CitlbmlmZWQoImVtYmVyLW1ldGFsL2RlYnVnIiwgWyJleHBvcnRzIl0sIGZ1
bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmdldERlYnVn
RnVuY3Rpb24gPSBnZXREZWJ1Z0Z1bmN0aW9uOworICBleHBvcnRzLnNldERlYnVnRnVuY3Rpb24g
PSBzZXREZWJ1Z0Z1bmN0aW9uOworICBleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKKyAgZXhwb3J0
cy5pbmZvID0gaW5mbzsKKyAgZXhwb3J0cy53YXJuID0gd2FybjsKKyAgZXhwb3J0cy5kZWJ1ZyA9
IGRlYnVnOworICBleHBvcnRzLmRlcHJlY2F0ZSA9IGRlcHJlY2F0ZTsKKyAgZXhwb3J0cy5kZXBy
ZWNhdGVGdW5jID0gZGVwcmVjYXRlRnVuYzsKKyAgZXhwb3J0cy5ydW5JbkRlYnVnID0gcnVuSW5E
ZWJ1ZzsKKyAgZXhwb3J0cy5kZWJ1Z1NlYWwgPSBkZWJ1Z1NlYWw7CisgIHZhciBkZWJ1Z0Z1bmN0
aW9ucyA9IHsKKyAgICBhc3NlcnQ6IGZ1bmN0aW9uICgpIHt9LAorICAgIGluZm86IGZ1bmN0aW9u
ICgpIHt9LAorICAgIHdhcm46IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlYnVnOiBmdW5jdGlvbiAo
KSB7fSwKKyAgICBkZXByZWNhdGU6IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlcHJlY2F0ZUZ1bmM6
IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBh
cmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHJldHVy
biBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CisgICAgfSwKKyAgICBydW5JbkRlYnVnOiBmdW5jdGlv
biAoKSB7fSwKKyAgICBkZWJ1Z1NlYWw6IGZ1bmN0aW9uICgpIHt9CisgIH07CisKKyAgZXhwb3J0
cy5kZWJ1Z0Z1bmN0aW9ucyA9IGRlYnVnRnVuY3Rpb25zOworCisgIGZ1bmN0aW9uIGdldERlYnVn
RnVuY3Rpb24obmFtZSkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9uc1tuYW1lXTsKKyAgfQor
CisgIGZ1bmN0aW9uIHNldERlYnVnRnVuY3Rpb24obmFtZSwgZm4pIHsKKyAgICBkZWJ1Z0Z1bmN0
aW9uc1tuYW1lXSA9IGZuOworICB9CisKKyAgZnVuY3Rpb24gYXNzZXJ0KCkgeworICAgIHJldHVy
biBkZWJ1Z0Z1bmN0aW9ucy5hc3NlcnQuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9
CisKKyAgZnVuY3Rpb24gaW5mbygpIHsKKyAgICByZXR1cm4gZGVidWdGdW5jdGlvbnMuaW5mby5h
cHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiB3YXJuKCkgewor
ICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9ucy53YXJuLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRz
KTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlYnVnKCkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9u
cy5kZWJ1Zy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiBk
ZXByZWNhdGUoKSB7CisgICAgcmV0dXJuIGRlYnVnRnVuY3Rpb25zLmRlcHJlY2F0ZS5hcHBseSh1
bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiBkZXByZWNhdGVGdW5jKCkg
eworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9ucy5kZXByZWNhdGVGdW5jLmFwcGx5KHVuZGVmaW5l
ZCwgYXJndW1lbnRzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJ1bkluRGVidWcoKSB7CisgICAgcmV0
dXJuIGRlYnVnRnVuY3Rpb25zLnJ1bkluRGVidWcuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMp
OworICB9CisKKyAgZnVuY3Rpb24gZGVidWdTZWFsKCkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0
aW9ucy5kZWJ1Z1NlYWwuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItbWV0YWwvZGVwZW5kZW50X2tleXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvd2F0Y2hpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsV2F0Y2hpbmcpIHsK
KyAgJ25vIHVzZSBzdHJpY3QnOworICAvLyBSZW1vdmUgInVzZSBzdHJpY3QiOyBmcm9tIHRyYW5z
cGlsZWQgbW9kdWxlIHVudGlsCisgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xMzgwMzggaXMgZml4ZWQKKworICBleHBvcnRzLmFkZERlcGVuZGVudEtleXMgPSBh
ZGREZXBlbmRlbnRLZXlzOworICBleHBvcnRzLnJlbW92ZURlcGVuZGVudEtleXMgPSByZW1vdmVE
ZXBlbmRlbnRLZXlzOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItbWV0YWwKKyAgKi8KKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIERFUEVOREVOVCBLRVlTCisgIC8vCisKKyAg
ZnVuY3Rpb24gYWRkRGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAg
ICAvLyB0aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRlcGVuZGVudCBrZXlzLCBzbworICAg
IC8vIGFkZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBrZXlzLgorICAgIHZhciBpZHgsIGxlbiwgZGVw
S2V5OworICAgIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5czsKKyAgICBpZiAoIWRl
cEtleXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGlkeCA9IDAsIGxlbiA9
IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICBkZXBLZXkgPSBkZXBL
ZXlzW2lkeF07CisgICAgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyBkZXBLZXkg
ZGVwZW5kcyBvbiBrZXlOYW1lLgorICAgICAgbWV0YS53cml0ZURlcHMoZGVwS2V5LCBrZXlOYW1l
LCAobWV0YS5wZWVrRGVwcyhkZXBLZXksIGtleU5hbWUpIHx8IDApICsgMSk7CisgICAgICAvLyBX
YXRjaCB0aGUgZGVwS2V5CisgICAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLndhdGNoKG9iaiwgZGVw
S2V5LCBtZXRhKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiByZW1vdmVEZXBlbmRlbnRLZXlz
KGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgeworICAgIC8vIHRoZSBkZXNjcmlwdG9yIGhhcyBh
IGxpc3Qgb2YgZGVwZW5kZW50IGtleXMsIHNvCisgICAgLy8gcmVtb3ZlIGFsbCBvZiBpdHMgZGVw
ZW5kZW50IGtleXMuCisgICAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRlbnRLZXlzOworICAg
IHZhciBpZHgsIGxlbiwgZGVwS2V5OworICAgIGlmICghZGVwS2V5cykgeworICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGZvciAoaWR4ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8
IGxlbjsgaWR4KyspIHsKKyAgICAgIGRlcEtleSA9IGRlcEtleXNbaWR4XTsKKyAgICAgIC8vIERl
Y3JlbWVudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9uIGtleU5hbWUuCisg
ICAgICBtZXRhLndyaXRlRGVwcyhkZXBLZXksIGtleU5hbWUsIChtZXRhLnBlZWtEZXBzKGRlcEtl
eSwga2V5TmFtZSkgfHwgMCkgLSAxKTsKKyAgICAgIC8vIFVud2F0Y2ggdGhlIGRlcEtleQorICAg
ICAgX2VtYmVyTWV0YWxXYXRjaGluZy51bndhdGNoKG9iaiwgZGVwS2V5LCBtZXRhKTsKKyAgICB9
CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9kZXByZWNhdGVfcHJvcGVydHknLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0Jywg
J2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0
KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAg
Ki8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZXByZWNhdGVQcm9wZXJ0eSA9IGRl
cHJlY2F0ZVByb3BlcnR5OworCisgIC8qKgorICAgIFVzZWQgaW50ZXJuYWxseSB0byBhbGxvdyBj
aGFuZ2luZyBwcm9wZXJ0aWVzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5LCBhbmQgcHJp
bnQgYSBoZWxwZnVsCisgICAgZGVwcmVjYXRpb24gd2FybmluZy4KKyAgCisgICAgQG1ldGhvZCBk
ZXByZWNhdGVQcm9wZXJ0eQorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0
byBhZGQgdGhlIGRlcHJlY2F0ZWQgcHJvcGVydHkgdG8uCisgICAgQHBhcmFtIHtTdHJpbmd9IGRl
cHJlY2F0ZWRLZXkgVGhlIHByb3BlcnR5IHRvIGFkZCAoYW5kIHByaW50IGRlcHJlY2F0aW9uIHdh
cm5pbmdzIHVwb24gYWNjZXNzaW5nKS4KKyAgICBAcGFyYW0ge1N0cmluZ30gbmV3S2V5IFRoZSBw
cm9wZXJ0eSB0aGF0IHdpbGwgYmUgYWxpYXNlZC4KKyAgICBAcHJpdmF0ZQorICAgIEBzaW5jZSAx
LjcuMAorICAqLworCisgIGZ1bmN0aW9uIGRlcHJlY2F0ZVByb3BlcnR5KG9iamVjdCwgZGVwcmVj
YXRlZEtleSwgbmV3S2V5LCBvcHRpb25zKSB7CisgICAgZnVuY3Rpb24gX2RlcHJlY2F0ZSgpIHsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2FnZSBvZiBgJyArIGRlcHJlY2F0
ZWRLZXkgKyAnYCBpcyBkZXByZWNhdGVkLCB1c2UgYCcgKyBuZXdLZXkgKyAnYCBpbnN0ZWFkLics
IGZhbHNlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2Jq
ZWN0LCBkZXByZWNhdGVkS2V5LCB7CisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICBl
bnVtZXJhYmxlOiBmYWxzZSwKKyAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAg
IF9kZXByZWNhdGUoKTsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMs
IG5ld0tleSwgdmFsdWUpOworICAgICAgfSwKKyAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAg
ICAgICBfZGVwcmVjYXRlKCk7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgbmV3S2V5KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL2RpY3Rpb25hcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZW1wdHlf
b2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCkgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbWFrZURpY3Rpb25hcnk7CisK
KyAgLy8gdGhlIGRlbGV0ZSBpcyBtZWFudCB0byBoaW50IGF0IHJ1bnRpbWVzIHRoYXQgdGhpcyBv
YmplY3Qgc2hvdWxkIHJlbWFpbiBpbgorICAvLyBkaWN0aW9uYXJ5IG1vZGUuIFRoaXMgaXMgY2xl
YXJseSBhIHJ1bnRpbWUgc3BlY2lmaWMgaGFjaywgYnV0IGN1cnJlbnRseSBpdAorICAvLyBhcHBl
YXJzIHdvcnRod2hpbGUgaW4gc29tZSB1c2VjYXNlcy4gUGxlYXNlIG5vdGUsIHRoZXNlIGRlbGV0
ZXMgZG8gaW5jcmVhc2UKKyAgLy8gdGhlIGNvc3Qgb2YgY3JlYXRpb24gZHJhbWF0aWNhbGx5IG92
ZXIgYSBwbGFpbiBPYmplY3QuY3JlYXRlLiBBbmQgYXMgdGhpcworICAvLyBvbmx5IG1ha2VzIHNl
bnNlIGZvciBsb25nLWxpdmVkIGRpY3Rpb25hcmllcyB0aGF0IGFyZW4ndCBpbnN0YW50aWF0ZWQg
b2Z0ZW4uCisKKyAgZnVuY3Rpb24gbWFrZURpY3Rpb25hcnkocGFyZW50KSB7CisgICAgdmFyIGRp
Y3Q7CisgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkgeworICAgICAgZGljdCA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpY3QgPSBP
YmplY3QuY3JlYXRlKHBhcmVudCk7CisgICAgfQorICAgIGRpY3RbJ19kaWN0J10gPSBudWxsOwor
ICAgIGRlbGV0ZSBkaWN0WydfZGljdCddOworICAgIHJldHVybiBkaWN0OworICB9Cit9KTsKK2Vu
aWZlZCgiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChl
eHBvcnRzKSB7CisgIC8vIFRoaXMgZXhpc3RzIGJlY2F1c2UgYE9iamVjdC5jcmVhdGUobnVsbClg
IGlzIGFic3VyZGx5IHNsb3cgY29tcGFyZWQKKyAgLy8gdG8gYG5ldyBFbXB0eU9iamVjdCgpYC4g
SW4gZWl0aGVyIGNhc2UsIHlvdSB3YW50IGEgbnVsbCBwcm90b3R5cGUKKyAgLy8gd2hlbiB5b3Un
cmUgdHJlYXRpbmcgdGhlIG9iamVjdCBpbnN0YW5jZXMgYXMgYXJiaXRyYXJ5IGRpY3Rpb25hcmll
cworICAvLyBhbmQgZG9uJ3Qgd2FudCB5b3VyIGtleXMgY29sbGlkaW5nIHdpdGggYnVpbGQtaW4g
bWV0aG9kcyBvbiB0aGUKKyAgLy8gZGVmYXVsdCBvYmplY3QgcHJvdG90eXBlLgorCisgICJ1c2Ug
c3RyaWN0IjsKKworICB2YXIgcHJvdG8gPSBPYmplY3QuY3JlYXRlKG51bGwsIHsKKyAgICAvLyB3
aXRob3V0IHRoaXMsIHdlIHdpbGwgYWx3YXlzIHN0aWxsIGVuZCB1cCB3aXRoIChuZXcKKyAgICAv
LyBFbXB0eU9iamVjdCgpKS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0CisgICAgY29uc3RydWN0b3I6
IHsKKyAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAg
ICAgIHdyaXRhYmxlOiB0cnVlCisgICAgfQorICB9KTsKKworICBmdW5jdGlvbiBFbXB0eU9iamVj
dCgpIHt9CisgIEVtcHR5T2JqZWN0LnByb3RvdHlwZSA9IHByb3RvOworICBleHBvcnRzLmRlZmF1
bHQgPSBFbXB0eU9iamVjdDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcs
IFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbENvcmUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qCisgICAgRW1iZXIgY2FuIHJ1
biBpbiBtYW55IGRpZmZlcmVudCBlbnZpcm9ubWVudHMsIGluY2x1ZGluZyBlbnZpcm9ubWVudHMg
bGlrZQorICAgIE5vZGUuanMgd2hlcmUgdGhlIERPTSBpcyB1bmF2YWlsYWJsZS4gVGhpcyBvYmpl
Y3Qgc2VydmVzIGFzIGFuIGFic3RyYWN0aW9uCisgICAgb3ZlciB0aGUgYnJvd3NlciBmZWF0dXJl
cyB0aGF0IEVtYmVyIHJlbGllcyBvbiwgc28gdGhhdCBjb2RlIGRvZXMgbm90CisgICAgZXhwbG9k
ZSB3aGVuIHRyeWluZyB0byBib290IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBoYXZl
IHRoZW0uCisgIAorICAgIFRoaXMgaXMgYSBwcml2YXRlIGFic3RyYWN0aW9uLiBJbiB0aGUgZnV0
dXJlLCB3ZSBob3BlIHRoYXQgb3RoZXIKKyAgICBhYnN0cmFjdGlvbnMgKGxpa2UgYExvY2F0aW9u
YCwgYFJlbmRlcmVyYCwgYGRvbS1oZWxwZXJgKSBjYW4gZnVsbHkgYWJzdHJhY3QKKyAgICBvdmVy
IHRoZSBkaWZmZXJlbmNlcyBpbiBlbnZpcm9ubWVudC4KKyAgKi8KKyAgdmFyIGVudmlyb25tZW50
OworCisgIC8vIFRoaXMgY29kZSBhdHRlbXB0cyB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBhbiBl
bnZpcm9ubWVudCB3aXRoIERPTQorICAvLyBieSBzZWFyY2hpbmcgZm9yIHdpbmRvdyBhbmQgZG9j
dW1lbnQuY3JlYXRlRWxlbWVudC4gQW4gZW52aXJvbm1lbnQKKyAgLy8gd2l0aCBET00gbWF5IGRp
c2FibGUgdGhlIERPTSBmdW5jdGlvbmFsaXR5IG9mIEVtYmVyIGV4cGxpY2l0bHkgYnkKKyAgLy8g
ZGVmaW5pbmcgYSBgZGlzYWJsZUJyb3dzZXJFbnZpcm9ubWVudGAgRU5WLgorICB2YXIgaGFzRE9N
ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAn
dW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5l
ZCcgJiYgIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5kaXNhYmxlQnJvd3NlckVudmlyb25t
ZW50OworCisgIGlmIChoYXNET00pIHsKKyAgICBlbnZpcm9ubWVudCA9IHsKKyAgICAgIGhhc0RP
TTogdHJ1ZSwKKyAgICAgIGlzQ2hyb21lOiAhIXdpbmRvdy5jaHJvbWUgJiYgIXdpbmRvdy5vcGVy
YSwKKyAgICAgIGlzRmlyZWZveDogdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVk
JywKKyAgICAgIGlzUGhhbnRvbTogISF3aW5kb3cuY2FsbFBoYW50b20sCisgICAgICBsb2NhdGlv
bjogd2luZG93LmxvY2F0aW9uLAorICAgICAgaGlzdG9yeTogd2luZG93Lmhpc3RvcnksCisgICAg
ICB1c2VyQWdlbnQ6IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LAorICAgICAgZ2xvYmFsOiB3
aW5kb3cKKyAgICB9OworICB9IGVsc2UgeworICAgIGVudmlyb25tZW50ID0geworICAgICAgaGFz
RE9NOiBmYWxzZSwKKyAgICAgIGlzQ2hyb21lOiBmYWxzZSwKKyAgICAgIGlzRmlyZWZveDogZmFs
c2UsCisgICAgICBpc1BoYW50b206IGZhbHNlLAorICAgICAgbG9jYXRpb246IG51bGwsCisgICAg
ICBoaXN0b3J5OiBudWxsLAorICAgICAgdXNlckFnZW50OiAnTHlueCAodGV4dG1vZGUpJywKKyAg
ICAgIGdsb2JhbDogbnVsbAorICAgIH07CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBlbnZp
cm9ubWVudDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9lcnJvcicsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jb3JlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEVtYmVyRXJyb3I7CisKKyAg
dmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXIn
LCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOworCisgIC8qKgorICAgIEEg
c3ViY2xhc3Mgb2YgdGhlIEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0IGZvciB1c2UgaW4gRW1iZXIu
CisgIAorICAgIEBjbGFzcyBFcnJvcgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5k
cyBFcnJvcgorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biBFbWJlckVycm9yKCkgeworICAgIHZhciB0bXAgPSBFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpOworCisgICAgLy8gQWRkcyBhIGBzdGFja2AgcHJvcGVydHkgdG8gdGhlIGdpdmVuIGVycm9y
IG9iamVjdCB0aGF0IHdpbGwgeWllbGQgdGhlCisgICAgLy8gc3RhY2sgdHJhY2UgYXQgdGhlIHRp
bWUgY2FwdHVyZVN0YWNrVHJhY2Ugd2FzIGNhbGxlZC4KKyAgICAvLyBXaGVuIGNvbGxlY3Rpbmcg
dGhlIHN0YWNrIHRyYWNlIGFsbCBmcmFtZXMgYWJvdmUgdGhlIHRvcG1vc3QgY2FsbAorICAgIC8v
IHRvIHRoaXMgZnVuY3Rpb24sIGluY2x1ZGluZyB0aGF0IGNhbGwsIHdpbGwgYmUgbGVmdCBvdXQg
b2YgdGhlCisgICAgLy8gc3RhY2sgdHJhY2UuCisgICAgLy8gVGhpcyBpcyB1c2VmdWwgYmVjYXVz
ZSB3ZSBjYW4gaGlkZSBFbWJlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgICAgLy8gdGhhdCBh
cmUgbm90IHZlcnkgaGVscGZ1bCBmb3IgdGhlIHVzZXIuCisgICAgaWYgKEVycm9yLmNhcHR1cmVT
dGFja1RyYWNlKSB7CisgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5FcnJvcik7CisgICAgfQorICAgIC8vIFVuZm9ydHVuYXRlbHkgZXJy
b3JzIGFyZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9w
IGluIHRtcGAgZG9lc24ndCB3b3JrLgorICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9y
UHJvcHMubGVuZ3RoOyBpZHgrKykgeworICAgICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1w
W2Vycm9yUHJvcHNbaWR4XV07CisgICAgfQorICB9CisKKyAgRW1iZXJFcnJvci5wcm90b3R5cGUg
PSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0
YWwvZXZlbnRzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFs
L3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMs
IF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxNZXRhX2xpc3RlbmVycykgeworICAnbm8gdXNl
IHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNwaWxlZCBtb2R1
bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEz
ODAzOCBpcyBmaXhlZAorCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItbWV0YWwKKyAgKi8KKyAgZXhwb3J0cy5hY2N1bXVsYXRlTGlzdGVuZXJzID0gYWNjdW11bGF0
ZUxpc3RlbmVyczsKKyAgZXhwb3J0cy5hZGRMaXN0ZW5lciA9IGFkZExpc3RlbmVyOworICBleHBv
cnRzLnJlbW92ZUxpc3RlbmVyID0gcmVtb3ZlTGlzdGVuZXI7CisgIGV4cG9ydHMuc3VzcGVuZExp
c3RlbmVyID0gc3VzcGVuZExpc3RlbmVyOworICBleHBvcnRzLnN1c3BlbmRMaXN0ZW5lcnMgPSBz
dXNwZW5kTGlzdGVuZXJzOworICBleHBvcnRzLndhdGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRz
OworICBleHBvcnRzLnNlbmRFdmVudCA9IHNlbmRFdmVudDsKKyAgZXhwb3J0cy5oYXNMaXN0ZW5l
cnMgPSBoYXNMaXN0ZW5lcnM7CisgIGV4cG9ydHMubGlzdGVuZXJzRm9yID0gbGlzdGVuZXJzRm9y
OworICBleHBvcnRzLm9uID0gb247CisKKyAgLyoKKyAgICBUaGUgZXZlbnQgc3lzdGVtIHVzZXMg
YSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyB0byBzdG9yZSBsaXN0ZW5lcnMgb24gYW4KKyAgICBv
YmplY3QuIFdoZW4gYSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50IGFy
cml2ZXMsIHRoZXNlCisgICAgaGFzaGVzIGFyZSBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIHdoaWNo
IHRhcmdldCBhbmQgYWN0aW9uIHBhaXIgdG8gaW52b2tlLgorICAKKyAgICBUaGUgaGFzaGVzIGFy
ZSBzdG9yZWQgaW4gdGhlIG9iamVjdCdzIG1ldGEgaGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgor
ICAKKyAgICAgICAgLy8gT2JqZWN0J3MgbWV0YSBoYXNoCisgICAgICAgIHsKKyAgICAgICAgICBs
aXN0ZW5lcnM6IHsgICAgICAgLy8gdmFyaWFibGUgbmFtZTogYGxpc3RlbmVyU2V0YAorICAgICAg
ICAgICAgImZvbzpjaGFuZ2VkIjogWyAvLyB2YXJpYWJsZSBuYW1lOiBgYWN0aW9uc2AKKyAgICAg
ICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGZsYWdzCisgICAgICAgICAgICBdCisgICAgICAgICAg
fQorICAgICAgICB9CisgIAorICAqLworCisgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHRhcmdl
dCwgbWV0aG9kKSB7CisgICAgdmFyIGluZGV4ID0gLTE7CisgICAgLy8gaGFzaGVzIGFyZSBhZGRl
ZCB0byB0aGUgZW5kIG9mIHRoZSBldmVudCBhcnJheQorICAgIC8vIHNvIGl0IG1ha2VzIHNlbnNl
IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgZW5kCisgICAgLy8gb2YgdGhlIGFycmF5IGFuZCBz
ZWFyY2ggaW4gcmV2ZXJzZQorICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAzOyBpID49
IDA7IGkgLT0gMykgeworICAgICAgaWYgKHRhcmdldCA9PT0gYXJyYXlbaV0gJiYgbWV0aG9kID09
PSBhcnJheVtpICsgMV0pIHsKKyAgICAgICAgaW5kZXggPSBpOworICAgICAgICBicmVhazsKKyAg
ICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworICB9CisKKyAgZnVuY3Rpb24gYWNjdW11
bGF0ZUxpc3RlbmVycyhvYmosIGV2ZW50TmFtZSwgb3RoZXJBY3Rpb25zKSB7CisgICAgdmFyIG1l
dGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAoIW1ldGEpIHsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGFjdGlvbnMgPSBtZXRhLm1hdGNoaW5nTGlzdGVu
ZXJzKGV2ZW50TmFtZSk7CisgICAgdmFyIG5ld0FjdGlvbnMgPSBbXTsKKworICAgIGZvciAodmFy
IGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7CisgICAgICB2YXIgdGFy
Z2V0ID0gYWN0aW9uc1tpXTsKKyAgICAgIHZhciBtZXRob2QgPSBhY3Rpb25zW2kgKyAxXTsKKyAg
ICAgIHZhciBmbGFncyA9IGFjdGlvbnNbaSArIDJdOworICAgICAgdmFyIGFjdGlvbkluZGV4ID0g
aW5kZXhPZihvdGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKKworICAgICAgaWYgKGFjdGlv
bkluZGV4ID09PSAtMSkgeworICAgICAgICBvdGhlckFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhv
ZCwgZmxhZ3MpOworICAgICAgICBuZXdBY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdz
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3QWN0aW9uczsKKyAgfQorCisgIC8q
KgorICAgIEFkZCBhbiBldmVudCBsaXN0ZW5lcgorICAKKyAgICBAbWV0aG9kIGFkZExpc3RlbmVy
CisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0ge1N0cmluZ30gZXZl
bnROYW1lCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldCBBIHRhcmdldCBvYmpl
Y3Qgb3IgYSBmdW5jdGlvbgorICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBm
dW5jdGlvbiBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0
YAorICAgIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBBIGZsYWcgd2hldGhlciBhIGZ1bmN0aW9uIHNo
b3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9u
IGFkZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgb25jZSkgeworICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVzdCBwYXNzIGF0IGxlYXN0IGFuIG9iamVj
dCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5hZGRMaXN0ZW5lcicsICEhb2JqICYmICEhZXZlbnRO
YW1lKTsKKworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdkaWRJbml0QXR0cnMgY2Fs
bGVkIGluICcgKyAob2JqICYmIG9iai50b1N0cmluZyAmJiBvYmoudG9TdHJpbmcoKSkgKyAnLics
IGV2ZW50TmFtZSAhPT0gJ2RpZEluaXRBdHRycycsIHsKKyAgICAgIGlkOiAnZW1iZXItdmlld3Mu
ZGlkLWluaXQtYXR0cnMnLAorICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICB1cmw6ICdodHRw
Oi8vZW1iZXJqcy5jb20vZGVwcmVjYXRpb25zL3YyLngjdG9jX2VtYmVyLWNvbXBvbmVudC1kaWRp
bml0YXR0cnMnCisgICAgfSk7CisKKyAgICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0
eXBlb2YgdGFyZ2V0KSB7CisgICAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgICB0YXJnZXQgPSBu
dWxsOworICAgIH0KKworICAgIHZhciBmbGFncyA9IDA7CisgICAgaWYgKG9uY2UpIHsKKyAgICAg
IGZsYWdzIHw9IF9lbWJlck1ldGFsTWV0YV9saXN0ZW5lcnMuT05DRTsKKyAgICB9CisKKyAgICBf
ZW1iZXJNZXRhbE1ldGEubWV0YShvYmopLmFkZFRvTGlzdGVuZXJzKGV2ZW50TmFtZSwgdGFyZ2V0
LCBtZXRob2QsIGZsYWdzKTsKKworICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRp
ZEFkZExpc3RlbmVyKSB7CisgICAgICBvYmouZGlkQWRkTGlzdGVuZXIoZXZlbnROYW1lLCB0YXJn
ZXQsIG1ldGhvZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgUmVtb3ZlIGFuIGV2ZW50IGxp
c3RlbmVyCisgIAorICAgIEFyZ3VtZW50cyBzaG91bGQgbWF0Y2ggdGhvc2UgcGFzc2VkIHRvIGBF
bWJlci5hZGRMaXN0ZW5lcmAuCisgIAorICAgIEBtZXRob2QgcmVtb3ZlTGlzdGVuZXIKKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUK
KyAgICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0IEEgdGFyZ2V0IG9iamVjdCBvciBh
IGZ1bmN0aW9uCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9u
IG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisgICAg
QHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG9iaiwgZXZlbnROYW1l
LCB0YXJnZXQsIG1ldGhvZCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVz
dCBwYXNzIGF0IGxlYXN0IGFuIG9iamVjdCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5yZW1vdmVM
aXN0ZW5lcicsICEhb2JqICYmICEhZXZlbnROYW1lKTsKKworICAgIGlmICghbWV0aG9kICYmICdm
dW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAg
ICAgIHRhcmdldCA9IG51bGw7CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2Jq
KS5yZW1vdmVGcm9tTGlzdGVuZXJzKGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2QsIGZ1bmN0aW9u
ICgpIHsKKyAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRpZFJlbW92ZUxpc3Rl
bmVyKSB7CisgICAgICAgIG9iai5kaWRSZW1vdmVMaXN0ZW5lci5hcHBseShvYmosIGFyZ3VtZW50
cyk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBTdXNwZW5kIGxpc3RlbmVy
IGR1cmluZyBjYWxsYmFjay4KKyAgCisgICAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRo
ZSB0YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgd2hlbiBpdCBpcyB0YWtpbmcgYW4g
YWN0aW9uIHRoYXQgd291bGQgY2F1c2UgdGhlIGV2ZW50LCBlLmcuCisgICAgYW4gb2JqZWN0IG1p
Z2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB3aGlsZSBpdCBpcworICAg
IHNldHRpbmcgdGhhdCBwcm9wZXJ0eS4KKyAgCisgICAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIK
KyAgICBAZm9yIEVtYmVyCisgIAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIG9iagorICAgIEBw
YXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFy
Z2V0IEEgdGFyZ2V0IG9iamVjdCBvciBhIGZ1bmN0aW9uCisgICAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUg
Y2FsbGVkIG9uIGB0YXJnZXRgCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgKi8K
KworICBmdW5jdGlvbiBzdXNwZW5kTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0
aG9kLCBjYWxsYmFjaykgeworICAgIHJldHVybiBzdXNwZW5kTGlzdGVuZXJzKG9iaiwgW2V2ZW50
TmFtZV0sIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7CisgIH0KKworICAvKioKKyAgICBTdXNw
ZW5kcyBtdWx0aXBsZSBsaXN0ZW5lcnMgZHVyaW5nIGEgY2FsbGJhY2suCisgIAorICAgIEBtZXRo
b2Qgc3VzcGVuZExpc3RlbmVycworICAgIEBmb3IgRW1iZXIKKyAgCisgICAgQHByaXZhdGUKKyAg
ICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtBcnJheX0gZXZlbnROYW1lcyBBcnJheSBvZiBldmVu
dCBuYW1lcworICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQgQSB0YXJnZXQgb2Jq
ZWN0IG9yIGEgZnVuY3Rpb24KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEg
ZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdl
dGAKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAqLworCisgIGZ1bmN0aW9uIHN1
c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudE5hbWVzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2sp
IHsKKyAgICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Cisg
ICAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgICB0YXJnZXQgPSBudWxsOworICAgIH0KKyAgICBy
ZXR1cm4gX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKS5zdXNwZW5kTGlzdGVuZXJzKGV2ZW50TmFt
ZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7CisgIH0KKworICAvKioKKyAgICBSZXR1cm4g
YSBsaXN0IG9mIGN1cnJlbnRseSB3YXRjaGVkIGV2ZW50cworICAKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2Qgd2F0Y2hlZEV2ZW50cworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisg
ICovCisKKyAgZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsKKyAgICByZXR1cm4gX2VtYmVy
TWV0YWxNZXRhLm1ldGEob2JqKS53YXRjaGVkRXZlbnRzKCk7CisgIH0KKworICAvKioKKyAgICBT
ZW5kIGFuIGV2ZW50LiBUaGUgZXhlY3V0aW9uIG9mIHN1c3BlbmRlZCBsaXN0ZW5lcnMKKyAgICBp
cyBza2lwcGVkLCBhbmQgb25jZSBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuIEEgbGlzdGVuZXIgd2l0
aG91dAorICAgIGEgdGFyZ2V0IGlzIGV4ZWN1dGVkIG9uIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiBh
biBhcnJheSBvZiBhY3Rpb25zCisgICAgaXMgbm90IHBhc3NlZCwgdGhlIGFjdGlvbnMgc3RvcmVk
IG9uIHRoZSBwYXNzZWQgb2JqZWN0IGFyZSBpbnZva2VkLgorICAKKyAgICBAbWV0aG9kIHNlbmRF
dmVudAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQorICAgIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJz
IGZvciBlYWNoIGxpc3RlbmVyLgorICAgIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgT3B0aW9uYWwg
YXJyYXkgb2YgYWN0aW9ucyAobGlzdGVuZXJzKS4KKyAgICBAcmV0dXJuIHRydWUKKyAgICBAcHVi
bGljCisgICovCisKKyAgZnVuY3Rpb24gc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBwYXJhbXMs
IGFjdGlvbnMpIHsKKyAgICBpZiAoIWFjdGlvbnMpIHsKKyAgICAgIHZhciBtZXRhID0gX2VtYmVy
TWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLm1h
dGNoaW5nTGlzdGVuZXJzKGV2ZW50TmFtZSk7CisgICAgfQorCisgICAgaWYgKCFhY3Rpb25zIHx8
IGFjdGlvbnMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9y
ICh2YXIgaSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKKyAgICAgIC8v
IGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKKyAgICAgIHZhciB0YXJnZXQg
PSBhY3Rpb25zW2ldOworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbnNbaSArIDFdOworICAgICAg
dmFyIGZsYWdzID0gYWN0aW9uc1tpICsgMl07CisKKyAgICAgIGlmICghbWV0aG9kKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGZsYWdzICYgX2VtYmVyTWV0YWxNZXRh
X2xpc3RlbmVycy5TVVNQRU5ERUQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAg
ICBpZiAoZmxhZ3MgJiBfZW1iZXJNZXRhbE1ldGFfbGlzdGVuZXJzLk9OQ0UpIHsKKyAgICAgICAg
cmVtb3ZlTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIH0K
KyAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgIHRhcmdldCA9IG9iajsKKyAgICAgIH0KKyAg
ICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1ldGhvZCkgeworICAgICAgICBpZiAocGFyYW1z
KSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxVdGlscy5hcHBseVN0cih0YXJnZXQsIG1ldGhvZCwg
cGFyYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0YXJnZXRbbWV0aG9kXSgpOwor
ICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFyYW1zKSB7CisgICAgICAg
ICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgcGFyYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGhh
c0xpc3RlbmVycworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtT
dHJpbmd9IGV2ZW50TmFtZQorICAqLworCisgIGZ1bmN0aW9uIGhhc0xpc3RlbmVycyhvYmosIGV2
ZW50TmFtZSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7
CisgICAgaWYgKCFtZXRhKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVy
biBtZXRhLm1hdGNoaW5nTGlzdGVuZXJzKGV2ZW50TmFtZSkubGVuZ3RoID4gMDsKKyAgfQorCisg
IC8qKgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBsaXN0ZW5lcnNGb3IKKyAgICBAZm9yIEVt
YmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgKi8K
KworICBmdW5jdGlvbiBsaXN0ZW5lcnNGb3Iob2JqLCBldmVudE5hbWUpIHsKKyAgICB2YXIgcmV0
ID0gW107CisgICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAg
ICB2YXIgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5tYXRjaGluZ0xpc3RlbmVycyhldmVudE5hbWUp
OworCisgICAgaWYgKCFhY3Rpb25zKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAg
IGZvciAodmFyIGkgPSAwLCBsID0gYWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpICs9IDMpIHsKKyAg
ICAgIHZhciB0YXJnZXQgPSBhY3Rpb25zW2ldOworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbnNb
aSArIDFdOworICAgICAgcmV0LnB1c2goW3RhcmdldCwgbWV0aG9kXSk7CisgICAgfQorCisgICAg
cmV0dXJuIHJldDsKKyAgfQorCisgIC8qKgorICAgIERlZmluZSBhIHByb3BlcnR5IGFzIGEgZnVu
Y3Rpb24gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgd2hlbgorICAgIGEgc3BlY2lmaWVkIGV2ZW50
IG9yIGV2ZW50cyBhcmUgdHJpZ2dlcmVkLgorICAKKyAgCisgICAgYGBgIGphdmFzY3JpcHQKKyAg
ICB2YXIgSm9iID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBsb2dDb21wbGV0ZWQ6IEVt
YmVyLm9uKCdjb21wbGV0ZWQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ0pv
YiBjb21wbGV0ZWQhJyk7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICB2YXIgam9iID0gSm9i
LmNyZWF0ZSgpOworICAKKyAgICBFbWJlci5zZW5kRXZlbnQoam9iLCAnY29tcGxldGVkJyk7IC8v
IExvZ3MgJ0pvYiBjb21wbGV0ZWQhJworICAgYGBgCisgIAorICAgIEBtZXRob2Qgb24KKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZXMqCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYworICAgIEByZXR1cm4gZnVuYworICAgIEBwdWJsaWMKKyAgKi8KKworICBm
dW5jdGlvbiBvbigpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJn
cyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAg
YXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICB2YXIgZnVuYyA9IGFy
Z3MucG9wKCk7CisgICAgdmFyIGV2ZW50cyA9IGFyZ3M7CisgICAgZnVuYy5fX2VtYmVyX2xpc3Rl
bnNfXyA9IGV2ZW50czsKKyAgICByZXR1cm4gZnVuYzsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVn
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBleHBhbmRQcm9wZXJ0aWVzOworCisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICB2YXIgU1BM
SVRfUkVHRVggPSAvXHt8XH0vOworICB2YXIgRU5EX1dJVEhfRUFDSF9SRUdFWCA9IC9cLkBlYWNo
JC87CisKKyAgLyoqCisgICAgRXhwYW5kcyBgcGF0dGVybmAsIGludm9raW5nIGBjYWxsYmFja2Ag
Zm9yIGVhY2ggZXhwYW5zaW9uLgorICAKKyAgICBUaGUgb25seSBwYXR0ZXJuIHN1cHBvcnRlZCBp
cyBicmFjZS1leHBhbnNpb24sIGFueXRoaW5nIGVsc2Ugd2lsbCBiZSBwYXNzZWQKKyAgICBvbmNl
IHRvIGBjYWxsYmFja2AgZGlyZWN0bHkuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBganMK
KyAgICBmdW5jdGlvbiBlY2hvKGFyZyl7IGNvbnNvbGUubG9nKGFyZyk7IH0KKyAgCisgICAgRW1i
ZXIuZXhwYW5kUHJvcGVydGllcygnZm9vLmJhcicsIGVjaG8pOyAgICAgICAgICAgICAgLy89PiAn
Zm9vLmJhcicKKyAgICBFbWJlci5leHBhbmRQcm9wZXJ0aWVzKCd7Zm9vLGJhcn0nLCBlY2hvKTsg
ICAgICAgICAgICAvLz0+ICdmb28nLCAnYmFyJworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMo
J2Zvby57YmFyLGJhen0nLCBlY2hvKTsgICAgICAgIC8vPT4gJ2Zvby5iYXInLCAnZm9vLmJheicK
KyAgICBFbWJlci5leHBhbmRQcm9wZXJ0aWVzKCd7Zm9vLGJhcn0uYmF6JywgZWNobyk7ICAgICAg
ICAvLz0+ICdmb28uYmF6JywgJ2Jhci5iYXonCisgICAgRW1iZXIuZXhwYW5kUHJvcGVydGllcygn
Zm9vLntiYXIsYmF6fS5bXScsIGVjaG8pICAgICAgLy89PiAnZm9vLmJhci5bXScsICdmb28uYmF6
LltdJworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMoJ3tmb28sYmFyfS57c3BhbSxlZ2dzfScs
IGVjaG8pIC8vPT4gJ2Zvby5zcGFtJywgJ2Zvby5lZ2dzJywgJ2Jhci5zcGFtJywgJ2Jhci5lZ2dz
JworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMoJ3tmb299LmJhci57YmF6fScpICAgICAgICAg
ICAgIC8vPT4gJ2Zvby5iYXIuYmF6JworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGV4cGFuZFBy
b3BlcnRpZXMKKyAgICBAZm9yIEVtYmVyCisgICAgQHByaXZhdGUKKyAgICBAcGFyYW0ge1N0cmlu
Z30gcGF0dGVybiBUaGUgcHJvcGVydHkgcGF0dGVybiB0byBleHBhbmQuCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZS4gIEl0IGlzIGludm9rZWQg
b25jZSBwZXIKKyAgICBleHBhbnNpb24sIGFuZCBpcyBwYXNzZWQgdGhlIGV4cGFuc2lvbi4KKyAg
Ki8KKworICBmdW5jdGlvbiBleHBhbmRQcm9wZXJ0aWVzKHBhdHRlcm4sIGNhbGxiYWNrKSB7Cisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0EgY29tcHV0ZWQgcHJvcGVydHkga2V5IG11c3Qg
YmUgYSBzdHJpbmcnLCB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpOworICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdCcmFjZSBleHBhbmRlZCBwcm9wZXJ0aWVzIGNhbm5vdCBjb250YWlu
IHNwYWNlcywgZS5nLiAidXNlci57Zmlyc3ROYW1lLCBsYXN0TmFtZX0iIHNob3VsZCBiZSAidXNl
ci57Zmlyc3ROYW1lLGxhc3ROYW1lfSInLCBwYXR0ZXJuLmluZGV4T2YoJyAnKSA9PT0gLTEpOwor
CisgICAgdmFyIHBhcnRzID0gcGF0dGVybi5zcGxpdChTUExJVF9SRUdFWCk7CisgICAgdmFyIHBy
b3BlcnRpZXMgPSBbcGFydHNdOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5n
dGg7IGkrKykgeworICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIGlmIChwYXJ0Lmlu
ZGV4T2YoJywnKSA+PSAwKSB7CisgICAgICAgIHByb3BlcnRpZXMgPSBkdXBsaWNhdGVBbmRSZXBs
YWNlKHByb3BlcnRpZXMsIHBhcnQuc3BsaXQoJywnKSwgaSk7CisgICAgICB9CisgICAgfQorCisg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBj
YWxsYmFjayhwcm9wZXJ0aWVzW2ldLmpvaW4oJycpLnJlcGxhY2UoRU5EX1dJVEhfRUFDSF9SRUdF
WCwgJy5bXScpKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkdXBsaWNhdGVBbmRSZXBsYWNl
KHByb3BlcnRpZXMsIGN1cnJlbnRQYXJ0cywgaW5kZXgpIHsKKyAgICB2YXIgYWxsID0gW107CisK
KyAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgICBjdXJy
ZW50UGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkgeworICAgICAgICB2YXIgY3VycmVudCA9
IHByb3BlcnR5LnNsaWNlKDApOworICAgICAgICBjdXJyZW50W2luZGV4XSA9IHBhcnQ7CisgICAg
ICAgIGFsbC5wdXNoKGN1cnJlbnQpOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICByZXR1cm4g
YWxsOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxBc3NpZ24pIHsKKyAgJ3VzZSBzdHJp
Y3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzRW5hYmxlZDsKKworICAvKioKKyAgICBUaGUg
aGFzaCBvZiBlbmFibGVkIENhbmFyeSBmZWF0dXJlcy4gQWRkIHRvIHRoaXMsIGFueSBjYW5hcnkg
ZmVhdHVyZXMKKyAgICBiZWZvcmUgY3JlYXRpbmcgeW91ciBhcHBsaWNhdGlvbi4KKyAgCisgICAg
QWx0ZXJuYXRpdmVseSAoYW5kIHJlY29tbWVuZGVkKSwgeW91IGNhbiBhbHNvIGRlZmluZSBgRW1i
ZXJFTlYuRkVBVFVSRVNgCisgICAgaWYgeW91IG5lZWQgdG8gZW5hYmxlIGZlYXR1cmVzIGZsYWdn
ZWQgYXQgcnVudGltZS4KKyAgCisgICAgQGNsYXNzIEZFQVRVUkVTCisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBzdGF0aWMKKyAgICBAc2luY2UgMS4xLjAKKyAgICBAcHVibGljCisgICovCisg
IHZhciBLTk9XTl9GRUFUVVJFUyA9IHt9O2V4cG9ydHMuS05PV05fRkVBVFVSRVMgPSBLTk9XTl9G
RUFUVVJFUzsKKyAgLy8ganNoaW50IGlnbm9yZTpsaW5lCisgIHZhciBGRUFUVVJFUyA9IF9lbWJl
ck1ldGFsQXNzaWduLmRlZmF1bHQoS05PV05fRkVBVFVSRVMsIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVOVi5GRUFUVVJFUyk7CisKKyAgZXhwb3J0cy5GRUFUVVJFUyA9IEZFQVRVUkVTOworICAv
KioKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIGBmZWF0dXJlYCBpcyBlbmFi
bGVkLiBVc2VkIGJ5IEVtYmVyJ3MKKyAgICBidWlsZCB0b29scyB0byBleGNsdWRlIGV4cGVyaW1l
bnRhbCBmZWF0dXJlcyBmcm9tIGJldGEvc3RhYmxlIGJ1aWxkcy4KKyAgCisgICAgWW91IGNhbiBk
ZWZpbmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIAorICAgICogYEVt
YmVyRU5WLkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFU2AgLSBlbmFibGUgYW55IGZlYXR1cmVzIHRo
YXQgaGF2ZSBub3QgYmVlbiBleHBsaWNpdGx5CisgICAgICBlbmFibGVkL2Rpc2FibGVkLgorICAK
KyAgICBAbWV0aG9kIGlzRW5hYmxlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBmZWF0dXJlIFRoZSBm
ZWF0dXJlIHRvIGNoZWNrCisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICBAZm9yIEVtYmVyLkZF
QVRVUkVTCisgICAgQHNpbmNlIDEuMS4wCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9u
IGlzRW5hYmxlZChmZWF0dXJlKSB7CisgICAgdmFyIGZlYXR1cmVWYWx1ZSA9IEZFQVRVUkVTW2Zl
YXR1cmVdOworCisgICAgaWYgKGZlYXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFsdWUg
PT09IGZhbHNlIHx8IGZlYXR1cmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4g
ZmVhdHVyZVZhbHVlOworICAgIH0gZWxzZSBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5W
LkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFUykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBl
bHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJl
ci1tZXRhbC9nZXRfcHJvcGVydGllcycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBnZXRQcm9wZXJ0aWVzOworCisg
IC8qKgorICAgIFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYEVtYmVy
LmdldFByb3BlcnRpZXNgCisgICAgd2l0aCBhbiBvYmplY3QgZm9sbG93ZWQgYnkgYSBsaXN0IG9m
IHN0cmluZ3Mgb3IgYW4gYXJyYXk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5n
ZXRQcm9wZXJ0aWVzKHJlY29yZCwgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICd6aXBDb2RlJyk7
CisgICAgLy8geyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAn
MTAwMTEnIH0KKyAgICBgYGAKKyAgCisgICAgaXMgZXF1aXZhbGVudCB0bzoKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEVtYmVyLmdldFByb3BlcnRpZXMocmVjb3JkLCBbJ2ZpcnN0TmFtZScs
ICdsYXN0TmFtZScsICd6aXBDb2RlJ10pOworICAgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxh
c3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9CisgICAgYGBgCisgIAorICAgIEBtZXRo
b2QgZ2V0UHJvcGVydGllcworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2Jq
CisgICAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKKyAgICBA
cmV0dXJuIHtPYmplY3R9CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGdldFByb3Bl
cnRpZXMob2JqKSB7CisgICAgdmFyIHJldCA9IHt9OworICAgIHZhciBwcm9wZXJ0eU5hbWVzID0g
YXJndW1lbnRzOworICAgIHZhciBpID0gMTsKKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09
PSAyICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzFdKSkgeworICAgICAgaSA9IDA7CisgICAg
ICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFdOworICAgIH0KKyAgICBmb3IgKHZhciBsZW4g
PSBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICByZXRbcHJvcGVy
dHlOYW1lc1tpXV0gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQob2JqLCBwcm9wZXJ0eU5h
bWVzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LW1ldGFsL2luZGV4JywgWydleHBvcnRzJywgJ3JlcXVpcmUnLCAnZW1iZXItbWV0YWwvY29yZScs
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRh
bC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvbWVyZ2UnLCAnZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0
aW9uJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0
YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvY2FjaGUnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9ldmVudHMnLCAnZW1iZXItbWV0
YWwvb2JzZXJ2ZXJfc2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRh
bC9tYXAnLCAnZW1iZXItbWV0YWwvZ2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvc2V0X3By
b3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvd2F0Y2hfa2V5JywgJ2VtYmVyLW1ldGFsL2NoYWlucycs
ICdlbWJlci1tZXRhbC93YXRjaF9wYXRoJywgJ2VtYmVyLW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVy
LW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVy
LW1ldGFsL2FsaWFzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkX21hY3JvcycsICdlbWJlci1tZXRh
bC9vYnNlcnZlcicsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9iaW5kaW5nJywg
J2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXIt
bWV0YWwvbGlicmFyaWVzJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAnZW1iZXItbWV0YWwvaXNf
ZW1wdHknLCAnZW1iZXItbWV0YWwvaXNfYmxhbmsnLCAnZW1iZXItbWV0YWwvaXNfcHJlc2VudCcs
ICdiYWNrYnVybmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWlyZSwgX2VtYmVyTWV0YWxD
b3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbEFz
c2lnbiwgX2VtYmVyTWV0YWxNZXJnZSwgX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24sIF9lbWJl
ck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0
YWxDYWNoZSwgX2VtYmVyTWV0YWxMb2dnZXIsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbEV2ZW50cywgX2VtYmVyTWV0YWxPYnNlcnZlcl9zZXQsIF9lbWJlck1ldGFsUHJvcGVy
dHlfZXZlbnRzLCBfZW1iZXJNZXRhbFByb3BlcnRpZXMsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0
LCBfZW1iZXJNZXRhbE1hcCwgX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcywgX2VtYmVyTWV0YWxT
ZXRfcHJvcGVydGllcywgX2VtYmVyTWV0YWxXYXRjaF9rZXksIF9lbWJlck1ldGFsQ2hhaW5zLCBf
ZW1iZXJNZXRhbFdhdGNoX3BhdGgsIF9lbWJlck1ldGFsV2F0Y2hpbmcsIF9lbWJlck1ldGFsRXhw
YW5kX3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsQWxpYXMsIF9l
bWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRh
bE1peGluLCBfZW1iZXJNZXRhbEJpbmRpbmcsIF9lbWJlck1ldGFsUGF0aF9jYWNoZSwgX2VtYmVy
TWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxMaWJyYXJpZXMsIF9lbWJlck1ldGFsSXNfbm9uZSwg
X2VtYmVyTWV0YWxJc19lbXB0eSwgX2VtYmVyTWV0YWxJc19ibGFuaywgX2VtYmVyTWV0YWxJc19w
cmVzZW50LCBfYmFja2J1cm5lcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLW1ldGFsCisgICovCisKKyAgLy8gQkVHSU4gSU1QT1JUUworICAndXNlIHN0cmlj
dCc7CisKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5lbXB0eSA9IF9lbWJlck1ldGFs
Q29tcHV0ZWRfbWFjcm9zLmVtcHR5OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLm5v
dEVtcHR5ID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3Mubm90RW1wdHk7CisgIF9lbWJlck1l
dGFsQ29tcHV0ZWQuY29tcHV0ZWQubm9uZSA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLm5v
bmU7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQubm90ID0gX2VtYmVyTWV0YWxDb21w
dXRlZF9tYWNyb3Mubm90OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLmJvb2wgPSBf
ZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5ib29sOworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkLm1hdGNoID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MubWF0Y2g7CisgIF9lbWJl
ck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuZXF1YWwgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jv
cy5lcXVhbDsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5ndCA9IF9lbWJlck1ldGFs
Q29tcHV0ZWRfbWFjcm9zLmd0OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLmd0ZSA9
IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmd0ZTsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5j
b21wdXRlZC5sdCA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmx0OworICBfZW1iZXJNZXRh
bENvbXB1dGVkLmNvbXB1dGVkLmx0ZSA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmx0ZTsK
KyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5hbGlhcyA9IF9lbWJlck1ldGFsQWxpYXMu
ZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5vbmVXYXkgPSBfZW1iZXJN
ZXRhbENvbXB1dGVkX21hY3Jvcy5vbmVXYXk7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0
ZWQucmVhZHMgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5vbmVXYXk7CisgIF9lbWJlck1l
dGFsQ29tcHV0ZWQuY29tcHV0ZWQucmVhZE9ubHkgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jv
cy5yZWFkT25seTsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5kZWZhdWx0VG8gPSBf
ZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5kZWZhdWx0VG87CisgIF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQuZGVwcmVjYXRpbmdBbGlhcyA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9z
LmRlcHJlY2F0aW5nQWxpYXM7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuYW5kID0g
X2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MuYW5kOworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkLm9yID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3Mub3I7CisgIF9lbWJlck1ldGFs
Q29tcHV0ZWQuY29tcHV0ZWQuYW55ID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MuYW55Owor
CisgIC8vIEVORCBJTVBPUlRTCisKKyAgLy8gQkVHSU4gRVhQT1JUUworICB2YXIgRW1iZXJJbnN0
cnVtZW50YXRpb24gPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5JbnN0cnVtZW50YXRpb24gPSB7
fTsKKyAgRW1iZXJJbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCA9IF9lbWJlck1ldGFsSW5zdHJ1
bWVudGF0aW9uLmluc3RydW1lbnQ7CisgIEVtYmVySW5zdHJ1bWVudGF0aW9uLnN1YnNjcmliZSA9
IF9lbWJlck1ldGFsSW5zdHJ1bWVudGF0aW9uLnN1YnNjcmliZTsKKyAgRW1iZXJJbnN0cnVtZW50
YXRpb24udW5zdWJzY3JpYmUgPSBfZW1iZXJNZXRhbEluc3RydW1lbnRhdGlvbi51bnN1YnNjcmli
ZTsKKyAgRW1iZXJJbnN0cnVtZW50YXRpb24ucmVzZXQgPSBfZW1iZXJNZXRhbEluc3RydW1lbnRh
dGlvbi5yZXNldDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pbnN0cnVtZW50ID0gX2Vt
YmVyTWV0YWxJbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuc3Vic2NyaWJlID0gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlOwor
CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Ll9DYWNoZSA9IF9lbWJlck1ldGFsQ2FjaGUuZGVm
YXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5nZW5lcmF0ZUd1aWQgPSBfZW1iZXJN
ZXRhbFV0aWxzLmdlbmVyYXRlR3VpZDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuR1VJRF9L
RVkgPSBfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5wbGF0Zm9ybSA9IHsKKyAgICBkZWZpbmVQcm9wZXJ0eTogdHJ1ZSwKKyAgICBoYXNQcm9wZXJ0
eUFjY2Vzc29yczogdHJ1ZQorICB9OworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVycm9y
ID0gX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5n
dWlkRm9yID0gX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yOworICBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5NRVRBX0RFU0MgPSBfZW1iZXJNZXRhbE1ldGEuTUVUQV9ERVNDOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5tZXRhID0gX2VtYmVyTWV0YWxNZXRhLm1ldGE7CisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0Lmluc3BlY3QgPSBfZW1iZXJNZXRhbFV0aWxzLmluc3BlY3Q7CisKKyAgX2Vt
YmVyTWV0YWxDb3JlLmRlZmF1bHQudHJ5Q2F0Y2hGaW5hbGx5ID0gX2VtYmVyTWV0YWxVdGlscy5k
ZXByZWNhdGVkVHJ5Q2F0Y2hGaW5hbGx5OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5tYWtl
QXJyYXkgPSBfZW1iZXJNZXRhbFV0aWxzLm1ha2VBcnJheTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuY2FuSW52b2tlID0gX2VtYmVyTWV0YWxVdGlscy5jYW5JbnZva2U7CisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LnRyeUludm9rZSA9IF9lbWJlck1ldGFsVXRpbHMudHJ5SW52b2tlOwor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC53cmFwID0gX2VtYmVyTWV0YWxVdGlscy53cmFwOwor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hcHBseSA9IF9lbWJlck1ldGFsVXRpbHMuYXBwbHk7
CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmFwcGx5U3RyID0gX2VtYmVyTWV0YWxVdGlscy5h
cHBseVN0cjsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudXVpZCA9IF9lbWJlck1ldGFsVXRp
bHMudXVpZDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5Mb2dnZXIgPSBfZW1iZXJNZXRh
bExvZ2dlci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmdldCA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuZ2V0V2l0
aERlZmF1bHQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXRXaXRoRGVmYXVsdDsKKyAgX2Vt
YmVyTWV0YWxDb3JlLmRlZmF1bHQuX2dldFBhdGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5f
Z2V0UGF0aDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vbiA9IF9lbWJlck1ldGFsRXZl
bnRzLm9uOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hZGRMaXN0ZW5lciA9IF9lbWJlck1l
dGFsRXZlbnRzLmFkZExpc3RlbmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5yZW1vdmVM
aXN0ZW5lciA9IF9lbWJlck1ldGFsRXZlbnRzLnJlbW92ZUxpc3RlbmVyOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5fc3VzcGVuZExpc3RlbmVyID0gX2VtYmVyTWV0YWxFdmVudHMuc3VzcGVu
ZExpc3RlbmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fc3VzcGVuZExpc3RlbmVycyA9
IF9lbWJlck1ldGFsRXZlbnRzLnN1c3BlbmRMaXN0ZW5lcnM7CisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LnNlbmRFdmVudCA9IF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudDsKKyAgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaGFzTGlzdGVuZXJzID0gX2VtYmVyTWV0YWxFdmVudHMuaGFzTGlz
dGVuZXJzOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC53YXRjaGVkRXZlbnRzID0gX2VtYmVy
TWV0YWxFdmVudHMud2F0Y2hlZEV2ZW50czsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubGlz
dGVuZXJzRm9yID0gX2VtYmVyTWV0YWxFdmVudHMubGlzdGVuZXJzRm9yOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5hY2N1bXVsYXRlTGlzdGVuZXJzID0gX2VtYmVyTWV0YWxFdmVudHMuYWNj
dW11bGF0ZUxpc3RlbmVyczsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fT2JzZXJ2ZXJT
ZXQgPSBfZW1iZXJNZXRhbE9ic2VydmVyX3NldC5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LnByb3BlcnR5V2lsbENoYW5nZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRz
LnByb3BlcnR5V2lsbENoYW5nZTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucHJvcGVydHlE
aWRDaGFuZ2UgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZTsK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQub3ZlcnJpZGVDaGFpbnMgPSBfZW1iZXJNZXRhbFBy
b3BlcnR5X2V2ZW50cy5vdmVycmlkZUNoYWluczsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
YmVnaW5Qcm9wZXJ0eUNoYW5nZXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblBy
b3BlcnR5Q2hhbmdlczsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuZW5kUHJvcGVydHlDaGFu
Z2VzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMuZW5kUHJvcGVydHlDaGFuZ2VzOworICBf
ZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5jaGFuZ2VQcm9wZXJ0aWVzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9ldmVudHMuY2hhbmdlUHJvcGVydGllczsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5kZWZpbmVQcm9wZXJ0eSA9IF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eTsK
KworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5zZXQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X3Nl
dC5zZXQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRyeVNldCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnRyeVNldDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5PcmRlcmVkU2V0
ID0gX2VtYmVyTWV0YWxNYXAuT3JkZXJlZFNldDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
TWFwID0gX2VtYmVyTWV0YWxNYXAuTWFwOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NYXBX
aXRoRGVmYXVsdCA9IF9lbWJlck1ldGFsTWFwLk1hcFdpdGhEZWZhdWx0OworCisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LmdldFByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbEdldF9wcm9wZXJ0aWVz
LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnNldFByb3BlcnRpZXMgPSBfZW1i
ZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQud2F0Y2hLZXkgPSBfZW1iZXJNZXRhbFdhdGNoX2tleS53YXRjaEtleTsKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQudW53YXRjaEtleSA9IF9lbWJlck1ldGFsV2F0Y2hfa2V5LnVud2F0Y2hL
ZXk7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucmVtb3ZlQ2hhaW5XYXRjaGVyID0gX2Vt
YmVyTWV0YWxDaGFpbnMucmVtb3ZlQ2hhaW5XYXRjaGVyOworICBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5fQ2hhaW5Ob2RlID0gX2VtYmVyTWV0YWxDaGFpbnMuQ2hhaW5Ob2RlOworICBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5maW5pc2hDaGFpbnMgPSBfZW1iZXJNZXRhbENoYWlucy5maW5pc2hD
aGFpbnM7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQud2F0Y2hQYXRoID0gX2VtYmVyTWV0
YWxXYXRjaF9wYXRoLndhdGNoUGF0aDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudW53YXRj
aFBhdGggPSBfZW1iZXJNZXRhbFdhdGNoX3BhdGgudW53YXRjaFBhdGg7CisKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQud2F0Y2ggPSBfZW1iZXJNZXRhbFdhdGNoaW5nLndhdGNoOworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5pc1dhdGNoaW5nID0gX2VtYmVyTWV0YWxXYXRjaGluZy5pc1dh
dGNoaW5nOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC51bndhdGNoID0gX2VtYmVyTWV0YWxX
YXRjaGluZy51bndhdGNoOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5yZXdhdGNoID0gX2Vt
YmVyTWV0YWxXYXRjaGluZy5yZXdhdGNoOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5kZXN0
cm95ID0gX2VtYmVyTWV0YWxXYXRjaGluZy5kZXN0cm95OworCisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmV4cGFuZFByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbEV4cGFuZF9wcm9wZXJ0aWVzLmRl
ZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQ29tcHV0ZWRQcm9wZXJ0eSA9IF9l
bWJlck1ldGFsQ29tcHV0ZWQuQ29tcHV0ZWRQcm9wZXJ0eTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuY29tcHV0ZWQgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkOworICBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5jYWNoZUZvciA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY2FjaGVGb3I7
CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuYWRkT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE9i
c2VydmVyLmFkZE9ic2VydmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vYnNlcnZlcnNG
b3IgPSBfZW1iZXJNZXRhbE9ic2VydmVyLm9ic2VydmVyc0ZvcjsKKyAgX2VtYmVyTWV0YWxDb3Jl
LmRlZmF1bHQucmVtb3ZlT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2Vy
dmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fc3VzcGVuZE9ic2VydmVyID0gX2VtYmVy
TWV0YWxPYnNlcnZlci5fc3VzcGVuZE9ic2VydmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5fc3VzcGVuZE9ic2VydmVycyA9IF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNlcnZl
cnM7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSVNfQklORElORyA9IF9lbWJlck1ldGFs
TWl4aW4uSVNfQklORElORzsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucmVxdWlyZWQgPSBf
ZW1iZXJNZXRhbE1peGluLnJlcXVpcmVkOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hbGlh
c01ldGhvZCA9IF9lbWJlck1ldGFsTWl4aW4uYWxpYXNNZXRob2Q7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0Lm9ic2VydmVyID0gX2VtYmVyTWV0YWxNaXhpbi5vYnNlcnZlcjsKKyAgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaW1tZWRpYXRlT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE1peGluLl9p
bW1lZGlhdGVPYnNlcnZlcjsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubWl4aW4gPSBfZW1i
ZXJNZXRhbE1peGluLm1peGluOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NaXhpbiA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW47CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuYmluZCA9
IF9lbWJlck1ldGFsQmluZGluZy5iaW5kOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5CaW5k
aW5nID0gX2VtYmVyTWV0YWxCaW5kaW5nLkJpbmRpbmc7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LmlzR2xvYmFsUGF0aCA9IF9lbWJlck1ldGFsUGF0aF9jYWNoZS5pc0dsb2JhbFBhdGg7CisK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucnVuID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZh
dWx0OworCisgIC8qKgorICBAY2xhc3MgQmFja2J1cm5lcgorICBAZm9yIEVtYmVyCisgIEBwcml2
YXRlCisgICovCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkJhY2tidXJuZXIgPSBfYmFja2J1
cm5lci5kZWZhdWx0OworICAvLyB0aGlzIGlzIHRoZSBuZXcgZ28gZm9yd2FyZCwgb25jZSBFbWJl
ciBEYXRhIHVwZGF0ZXMgdG8gdXNpbmcgYF9CYWNrYnVybmVyYCB3ZQorICAvLyBjYW4gcmVtb3Zl
IHRoZSBub24tdW5kZXJzY29yZWQgdmVyc2lvbi4KKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
X0JhY2tidXJuZXIgPSBfYmFja2J1cm5lci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmxpYnJhcmllcyA9IG5ldyBfZW1iZXJNZXRhbExpYnJhcmllcy5kZWZhdWx0KCk7Cisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdF
bWJlcicsIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlZFUlNJT04pOworCisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LmlzTm9uZSA9IF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0OworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5pc0VtcHR5ID0gX2VtYmVyTWV0YWxJc19lbXB0eS5kZWZhdWx0
OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pc0JsYW5rID0gX2VtYmVyTWV0YWxJc19ibGFu
ay5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pc1ByZXNlbnQgPSBfZW1iZXJN
ZXRhbElzX3ByZXNlbnQuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hc3Np
Z24gPSBPYmplY3QuYXNzaWduIHx8IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0Lm1lcmdlID0gX2VtYmVyTWV0YWxNZXJnZS5kZWZhdWx0OworCisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkZFQVRVUkVTID0gX2VtYmVyTWV0YWxGZWF0dXJlcy5G
RUFUVVJFUzsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRkVBVFVSRVMuaXNFbmFibGVkID0g
X2VtYmVyTWV0YWxGZWF0dXJlcy5kZWZhdWx0OworCisgIC8qKgorICAgIEEgZnVuY3Rpb24gbWF5
IGJlIGFzc2lnbmVkIHRvIGBFbWJlci5vbmVycm9yYCB0byBiZSBjYWxsZWQgd2hlbiBFbWJlcgor
ICAgIGludGVybmFscyBlbmNvdW50ZXIgYW4gZXJyb3IuIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVj
aWFsaXplZCBlcnJvciBoYW5kbGluZworICAgIGFuZCByZXBvcnRpbmcgY29kZS4KKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEVtYmVyLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikgeworICAg
ICAgRW0uJC5hamF4KCcvcmVwb3J0LWVycm9yJywgJ1BPU1QnLCB7CisgICAgICAgIHN0YWNrOiBl
cnJvci5zdGFjaywKKyAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjogJ3doYXRldmVyIGFwcCBzdGF0
ZSB5b3Ugd2FudCB0byBwcm92aWRlJworICAgICAgfSk7CisgICAgfTsKKyAgICBgYGAKKyAgCisg
ICAgSW50ZXJuYWxseSwgYEVtYmVyLm9uZXJyb3JgIGlzIHVzZWQgYXMgQmFja2J1cm5lcidzIGVy
cm9yIGhhbmRsZXIuCisgIAorICAgIEBldmVudCBvbmVycm9yCisgICAgQGZvciBFbWJlcgorICAg
IEBwYXJhbSB7RXhjZXB0aW9ufSBlcnJvciB0aGUgZXJyb3Igb2JqZWN0CisgICAgQHB1YmxpYwor
ICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vbmVycm9yID0gbnVsbDsKKyAgLy8gRU5E
IEVYUE9SVFMKKworICAvLyBkbyB0aGlzIGZvciBzaWRlLWVmZmVjdHMgb2YgdXBkYXRpbmcgRW1i
ZXIuYXNzZXJ0LCB3YXJuLCBldGMgd2hlbgorICAvLyBlbWJlci1kZWJ1ZyBpcyBwcmVzZW50Cisg
IC8vIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgZGVwcmVjYXRlRnVuYworICBp
ZiAoX3JlcXVpcmUuaGFzKCdlbWJlci1kZWJ1ZycpKSB7CisgICAgX3JlcXVpcmUuZGVmYXVsdCgn
ZW1iZXItZGVidWcnKTsKKyAgfSBlbHNlIHsKKyAgICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5E
ZWJ1ZyA9IHt9OworICAgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkRlYnVnLnJlZ2lzdGVyRGVw
cmVjYXRpb25IYW5kbGVyID0gZnVuY3Rpb24gKCkge307CisgICAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuRGVidWcucmVnaXN0ZXJXYXJuSGFuZGxlciA9IGZ1bmN0aW9uICgpIHt9OworICB9CisK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuY3JlYXRlID0gX2VtYmVyTWV0YWxEZWJ1Zy5kZXBy
ZWNhdGVGdW5jKCdFbWJlci5jcmVhdGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBPYmplY3Qu
Y3JlYXRlJywgeyBpZDogJ2VtYmVyLW1ldGFsLmVtYmVyLWNyZWF0ZScsIHVudGlsOiAnMy4wLjAn
IH0sIE9iamVjdC5jcmVhdGUpOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5rZXlzID0gX2Vt
YmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGVGdW5jKCdFbWJlci5rZXlzIGlzIGRlcHJlY2F0ZWQgaW4g
ZmF2b3Igb2YgT2JqZWN0LmtleXMnLCB7IGlkOiAnZW1iZXItbWV0YWwuZW1iZXIua2V5cycsIHVu
dGlsOiAnMy4wLjAnIH0sIE9iamVjdC5rZXlzKTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9pbmplY3RlZF9w
cm9wZXJ0eScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9j
b21wdXRlZCcsICdlbWJlci1tZXRhbC9hbGlhcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywg
J2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1Zywg
X2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyTWV0YWxQcm9wZXJ0
aWVzLCBfY29udGFpbmVyT3duZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIFJl
YWQtb25seSBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIGNvbnRhaW5lciBs
b29rdXAuCisgIAorICAgIEBjbGFzcyBJbmplY3RlZFByb3BlcnR5CisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBjb250
YWluZXIgdHlwZSB0aGUgcHJvcGVydHkgd2lsbCBsb29rdXAKKyAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSAob3B0aW9uYWwpIFRoZSBuYW1lIHRoZSBwcm9wZXJ0eSB3aWxsIGxvb2t1cCwgZGVmYXVs
dHMKKyAgICAgICAgICAgdG8gdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEBwcml2YXRlCisgICov
CisgIGZ1bmN0aW9uIEluamVjdGVkUHJvcGVydHkodHlwZSwgbmFtZSkgeworICAgIHRoaXMudHlw
ZSA9IHR5cGU7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKworICAgIHRoaXMuX3N1cGVyJENvbnN0
cnVjdG9yKGluamVjdGVkUHJvcGVydHlHZXQpOworICAgIEFsaWFzZWRQcm9wZXJ0eVByb3RvdHlw
ZS5vbmVXYXkuY2FsbCh0aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluamVjdGVkUHJvcGVydHlH
ZXQoa2V5TmFtZSkgeworICAgIHZhciBkZXNjID0gdGhpc1trZXlOYW1lXTsKKyAgICB2YXIgb3du
ZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykgfHwgdGhpcy5jb250YWluZXI7IC8v
IGZhbGxiYWNrIHRvIGBjb250YWluZXJgIGZvciBiYWNrd2FyZHMgY29tcGF0CisKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnSW5qZWN0ZWRQcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVk
IHdpdGggdGhlIEVtYmVyLmluamVjdCBjb21wdXRlZCBwcm9wZXJ0eSBtYWNyb3MuJywgZGVzYyAm
JiBkZXNjLmlzRGVzY3JpcHRvciAmJiBkZXNjLnR5cGUpOworICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdBdHRlbXB0aW5nIHRvIGxvb2t1cCBhbiBpbmplY3RlZCBwcm9wZXJ0eSBvbiBhbiBv
YmplY3Qgd2l0aG91dCBhIGNvbnRhaW5lciwgZW5zdXJlIHRoYXQgdGhlIG9iamVjdCB3YXMgaW5z
dGFudGlhdGVkIHZpYSBhIGNvbnRhaW5lci4nLCBvd25lcik7CisKKyAgICByZXR1cm4gb3duZXIu
bG9va3VwKGRlc2MudHlwZSArICc6JyArIChkZXNjLm5hbWUgfHwga2V5TmFtZSkpOworICB9CisK
KyAgSW5qZWN0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9lbWJlck1ldGFs
UHJvcGVydGllcy5EZXNjcmlwdG9yLnByb3RvdHlwZSk7CisKKyAgdmFyIEluamVjdGVkUHJvcGVy
dHlQcm90b3R5cGUgPSBJbmplY3RlZFByb3BlcnR5LnByb3RvdHlwZTsKKyAgdmFyIENvbXB1dGVk
UHJvcGVydHlQcm90b3R5cGUgPSBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVkUHJvcGVydHku
cHJvdG90eXBlOworICB2YXIgQWxpYXNlZFByb3BlcnR5UHJvdG90eXBlID0gX2VtYmVyTWV0YWxB
bGlhcy5BbGlhc2VkUHJvcGVydHkucHJvdG90eXBlOworCisgIEluamVjdGVkUHJvcGVydHlQcm90
b3R5cGUuX3N1cGVyJENvbnN0cnVjdG9yID0gX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFBy
b3BlcnR5OworCisgIEluamVjdGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5nZXQ7CisgIEluamVjdGVkUHJvcGVydHlQcm90b3R5cGUucmVhZE9ubHkg
PSBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnJlYWRPbmx5OworCisgIEluamVjdGVkUHJvcGVy
dHlQcm90b3R5cGUudGVhcmRvd24gPSBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnRlYXJkb3du
OworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEluamVjdGVkUHJvcGVydHk7Cit9KTsKK2VuaWZlZCgn
ZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0aW9uJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Nv
cmUnLCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsQ29yZSwgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudDsKKyAgZXhwb3J0cy5faW5zdHJ1bWVudFN0YXJ0
ID0gX2luc3RydW1lbnRTdGFydDsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7Cisg
IGV4cG9ydHMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKKyAgZXhwb3J0cy5yZXNldCA9IHJl
c2V0OworCisgIC8qKgorICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBFbWJlciBJbnN0cnVtZW50YXRp
b24gbW9kdWxlIGlzCisgICAgdG8gcHJvdmlkZSBlZmZpY2llbnQsIGdlbmVyYWwtcHVycG9zZSBp
bnN0cnVtZW50YXRpb24KKyAgICBmb3IgRW1iZXIuCisgIAorICAgIFN1YnNjcmliZSB0byBhIGxp
c3RlbmVyIGJ5IHVzaW5nIGBFbWJlci5zdWJzY3JpYmVgOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgRW1iZXIuc3Vic2NyaWJlKCJyZW5kZXIiLCB7CisgICAgICBiZWZvcmU6IGZ1bmN0aW9u
KG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgeworICAKKyAgICAgIH0sCisgIAorICAgICAgYWZ0
ZXI6IGZ1bmN0aW9uKG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgeworICAKKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgSWYgeW91IHJldHVybiBhIHZhbHVlIGZyb20gdGhlIGBi
ZWZvcmVgIGNhbGxiYWNrLCB0aGF0IHNhbWUKKyAgICB2YWx1ZSB3aWxsIGJlIHBhc3NlZCBhcyBh
IGZvdXJ0aCBwYXJhbWV0ZXIgdG8gdGhlIGBhZnRlcmAKKyAgICBjYWxsYmFjay4KKyAgCisgICAg
SW5zdHJ1bWVudCBhIGJsb2NrIG9mIGNvZGUgYnkgdXNpbmcgYEVtYmVyLmluc3RydW1lbnRgOgor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuaW5zdHJ1bWVudCgicmVuZGVyLmhhbmRs
ZWJhcnMiLCBwYXlsb2FkLCBmdW5jdGlvbigpIHsKKyAgICAgIC8vIHJlbmRlcmluZyBsb2dpYwor
ICAgIH0sIGJpbmRpbmcpOworICAgIGBgYAorICAKKyAgICBFdmVudCBuYW1lcyBwYXNzZWQgdG8g
YEVtYmVyLmluc3RydW1lbnRgIGFyZSBuYW1lc3BhY2VkCisgICAgYnkgcGVyaW9kcywgZnJvbSBt
b3JlIGdlbmVyYWwgdG8gbW9yZSBzcGVjaWZpYy4gU3Vic2NyaWJlcnMKKyAgICBjYW4gbGlzdGVu
IGZvciBldmVudHMgYnkgd2hhdGV2ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQorICAgIGFy
ZSBpbnRlcmVzdGVkIGluLgorICAKKyAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50
IGlzIGByZW5kZXIuaGFuZGxlYmFyc2AsCisgICAgYW5kIHRoZSBzdWJzY3JpYmVyIGxpc3RlbmVk
IGZvciBhbGwgZXZlbnRzIGJlZ2lubmluZyB3aXRoCisgICAgYHJlbmRlcmAuIEl0IHdvdWxkIHJl
Y2VpdmUgY2FsbGJhY2tzIGZvciBldmVudHMgbmFtZWQKKyAgICBgcmVuZGVyYCwgYHJlbmRlci5o
YW5kbGViYXJzYCwgYHJlbmRlci5jb250YWluZXJgLCBvcgorICAgIGV2ZW4gYHJlbmRlci5oYW5k
bGViYXJzLmxheW91dGAuCisgIAorICAgIEBjbGFzcyBJbnN0cnVtZW50YXRpb24KKyAgICBAbmFt
ZXNwYWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICovCisgIHZhciBzdWJz
Y3JpYmVycyA9IFtdOworICBleHBvcnRzLnN1YnNjcmliZXJzID0gc3Vic2NyaWJlcnM7CisgIHZh
ciBjYWNoZSA9IHt9OworCisgIHZhciBwb3B1bGF0ZUxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1l
KSB7CisgICAgdmFyIGxpc3RlbmVycyA9IFtdOworICAgIHZhciBzdWJzY3JpYmVyOworCisgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBzdWJzY3JpYmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAg
ICAgIHN1YnNjcmliZXIgPSBzdWJzY3JpYmVyc1tpXTsKKyAgICAgIGlmIChzdWJzY3JpYmVyLnJl
Z2V4LnRlc3QobmFtZSkpIHsKKyAgICAgICAgbGlzdGVuZXJzLnB1c2goc3Vic2NyaWJlci5vYmpl
Y3QpOworICAgICAgfQorICAgIH0KKworICAgIGNhY2hlW25hbWVdID0gbGlzdGVuZXJzOworICAg
IHJldHVybiBsaXN0ZW5lcnM7CisgIH07CisKKyAgdmFyIHRpbWUgPSAoZnVuY3Rpb24gKCkgewor
ICAgIHZhciBwZXJmID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cucGVy
Zm9ybWFuY2UgfHwge30gOiB7fTsKKyAgICB2YXIgZm4gPSBwZXJmLm5vdyB8fCBwZXJmLm1vek5v
dyB8fCBwZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdzsKKyAgICAvLyBm
bi5iaW5kIHdpbGwgYmUgYXZhaWxhYmxlIGluIGFsbCB0aGUgYnJvd3NlcnMgdGhhdCBzdXBwb3J0
IHRoZSBhZHZhbmNlZCB3aW5kb3cucGVyZm9ybWFuY2UuLi4gOy0pCisgICAgcmV0dXJuIGZuID8g
Zm4uYmluZChwZXJmKSA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiArbmV3IERhdGUoKTsK
KyAgICB9OworICB9KSgpOworCisgIC8qKgorICAgIE5vdGlmaWVzIGV2ZW50J3Mgc3Vic2NyaWJl
cnMsIGNhbGxzIGBiZWZvcmVgIGFuZCBgYWZ0ZXJgIGhvb2tzLgorICAKKyAgICBAbWV0aG9kIGlu
c3RydW1lbnQKKyAgICBAbmFtZXNwYWNlIEVtYmVyLkluc3RydW1lbnRhdGlvbgorICAKKyAgICBA
cGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFjZWQgZXZlbnQgbmFtZS4KKyAgICBAcGFyYW0g
e09iamVjdH0gX3BheWxvYWQKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBGdW5jdGlv
biB0aGF0IHlvdSdyZSBpbnN0cnVtZW50aW5nLgorICAgIEBwYXJhbSB7T2JqZWN0fSBiaW5kaW5n
IENvbnRleHQgdGhhdCBpbnN0cnVtZW50IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoLgorICAgIEBw
cml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gaW5zdHJ1bWVudChuYW1lLCBfcGF5bG9hZCwgY2Fs
bGJhY2ssIGJpbmRpbmcpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAzICYmIHR5cGVv
ZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgYmluZGluZyA9IGNhbGxiYWNrOwor
ICAgICAgY2FsbGJhY2sgPSBfcGF5bG9hZDsKKyAgICAgIF9wYXlsb2FkID0gdW5kZWZpbmVkOwor
ICAgIH0KKyAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4g
Y2FsbGJhY2suY2FsbChiaW5kaW5nKTsKKyAgICB9CisgICAgdmFyIHBheWxvYWQgPSBfcGF5bG9h
ZCB8fCB7fTsKKyAgICB2YXIgZmluYWxpemVyID0gX2luc3RydW1lbnRTdGFydChuYW1lLCBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9KTsKKworICAgIGlmIChmaW5h
bGl6ZXIpIHsKKyAgICAgIHJldHVybiB3aXRoRmluYWxpemVyKGNhbGxiYWNrLCBmaW5hbGl6ZXIs
IHBheWxvYWQsIGJpbmRpbmcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FsbGJhY2su
Y2FsbChiaW5kaW5nKTsKKyAgICB9CisgIH0KKworICB2YXIgZmxhZ2dlZEluc3RydW1lbnQ7CisK
KyAgZXhwb3J0cy5mbGFnZ2VkSW5zdHJ1bWVudCA9IGZsYWdnZWRJbnN0cnVtZW50ID0gZnVuY3Rp
b24gKG5hbWUsIHBheWxvYWQsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIGNhbGxiYWNrKCk7Cisg
IH07CisgIGV4cG9ydHMuZmxhZ2dlZEluc3RydW1lbnQgPSBmbGFnZ2VkSW5zdHJ1bWVudDsKKwor
ICBmdW5jdGlvbiB3aXRoRmluYWxpemVyKGNhbGxiYWNrLCBmaW5hbGl6ZXIsIHBheWxvYWQsIGJp
bmRpbmcpIHsKKyAgICB2YXIgcmVzdWx0ID0gdW5kZWZpbmVkOworICAgIHRyeSB7CisgICAgICBy
ZXN1bHQgPSBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
IHBheWxvYWQuZXhjZXB0aW9uID0gZTsKKyAgICAgIHJlc3VsdCA9IHBheWxvYWQ7CisgICAgfSBm
aW5hbGx5IHsKKyAgICAgIGZpbmFsaXplcigpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisgIH0KKworICAvLyBwcml2YXRlIGZvciBub3cKKworICBmdW5jdGlvbiBfaW5zdHJ1bWVudFN0
YXJ0KG5hbWUsIF9wYXlsb2FkKSB7CisgICAgdmFyIGxpc3RlbmVycyA9IGNhY2hlW25hbWVdOwor
CisgICAgaWYgKCFsaXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVycyA9IHBvcHVsYXRlTGlzdGVu
ZXJzKG5hbWUpOworICAgIH0KKworICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7Cisg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHBheWxvYWQgPSBfcGF5bG9hZCgpOworCisg
ICAgdmFyIFNUUlVDVFVSRURfUFJPRklMRSA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlNUUlVD
VFVSRURfUFJPRklMRTsKKyAgICB2YXIgdGltZU5hbWU7CisgICAgaWYgKFNUUlVDVFVSRURfUFJP
RklMRSkgeworICAgICAgdGltZU5hbWUgPSBuYW1lICsgJzogJyArIHBheWxvYWQub2JqZWN0Owor
ICAgICAgY29uc29sZS50aW1lKHRpbWVOYW1lKTsKKyAgICB9CisKKyAgICB2YXIgbCA9IGxpc3Rl
bmVycy5sZW5ndGg7CisgICAgdmFyIGJlZm9yZVZhbHVlcyA9IG5ldyBBcnJheShsKTsKKyAgICB2
YXIgaSwgbGlzdGVuZXI7CisgICAgdmFyIHRpbWVzdGFtcCA9IHRpbWUoKTsKKyAgICBmb3IgKGkg
PSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKyAgICAg
IGJlZm9yZVZhbHVlc1tpXSA9IGxpc3RlbmVyLmJlZm9yZShuYW1lLCB0aW1lc3RhbXAsIHBheWxv
YWQpOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbiBfaW5zdHJ1bWVudEVuZCgpIHsKKyAg
ICAgIHZhciBpLCBsLCBsaXN0ZW5lcjsKKyAgICAgIHZhciB0aW1lc3RhbXAgPSB0aW1lKCk7Cisg
ICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKyAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5l
ci5hZnRlciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIGxpc3RlbmVyLmFmdGVyKG5hbWUs
IHRpbWVzdGFtcCwgcGF5bG9hZCwgYmVmb3JlVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgICAg
fQorCisgICAgICBpZiAoU1RSVUNUVVJFRF9QUk9GSUxFKSB7CisgICAgICAgIGNvbnNvbGUudGlt
ZUVuZCh0aW1lTmFtZSk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgIFN1YnNj
cmliZXMgdG8gYSBwYXJ0aWN1bGFyIGV2ZW50IG9yIGluc3RydW1lbnRlZCBibG9jayBvZiBjb2Rl
LgorICAKKyAgICBAbWV0aG9kIHN1YnNjcmliZQorICAgIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1
bWVudGF0aW9uCisgIAorICAgIEBwYXJhbSB7U3RyaW5nfSBbcGF0dGVybl0gTmFtZXNwYWNlZCBl
dmVudCBuYW1lLgorICAgIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBCZWZvcmUgYW5kIEFmdGVy
IGhvb2tzLgorICAKKyAgICBAcmV0dXJuIHtTdWJzY3JpYmVyfQorICAgIEBwcml2YXRlCisgICov
CisKKyAgZnVuY3Rpb24gc3Vic2NyaWJlKHBhdHRlcm4sIG9iamVjdCkgeworICAgIHZhciBwYXRo
cyA9IHBhdHRlcm4uc3BsaXQoJy4nKTsKKyAgICB2YXIgcGF0aDsKKyAgICB2YXIgcmVnZXggPSBb
XTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICBwYXRoID0gcGF0aHNbaV07CisgICAgICBpZiAocGF0aCA9PT0gJyonKSB7CisgICAg
ICAgIHJlZ2V4LnB1c2goJ1teXFwuXSonKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlZ2V4
LnB1c2gocGF0aCk7CisgICAgICB9CisgICAgfQorCisgICAgcmVnZXggPSByZWdleC5qb2luKCdc
XC4nKTsKKyAgICByZWdleCA9IHJlZ2V4ICsgJyhcXC4uKik/JzsKKworICAgIHZhciBzdWJzY3Jp
YmVyID0geworICAgICAgcGF0dGVybjogcGF0dGVybiwKKyAgICAgIHJlZ2V4OiBuZXcgUmVnRXhw
KCdeJyArIHJlZ2V4ICsgJyQnKSwKKyAgICAgIG9iamVjdDogb2JqZWN0CisgICAgfTsKKworICAg
IHN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7CisgICAgY2FjaGUgPSB7fTsKKworICAgIHJl
dHVybiBzdWJzY3JpYmVyOworICB9CisKKyAgLyoqCisgICAgVW5zdWJzY3JpYmVzIGZyb20gYSBw
YXJ0aWN1bGFyIGV2ZW50IG9yIGluc3RydW1lbnRlZCBibG9jayBvZiBjb2RlLgorICAKKyAgICBA
bWV0aG9kIHVuc3Vic2NyaWJlCisgICAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24K
KyAgCisgICAgQHBhcmFtIHtPYmplY3R9IFtzdWJzY3JpYmVyXQorICAgIEBwcml2YXRlCisgICov
CisKKyAgZnVuY3Rpb24gdW5zdWJzY3JpYmUoc3Vic2NyaWJlcikgeworICAgIHZhciBpbmRleDsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3Vic2NyaWJlcnMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICBpZiAoc3Vic2NyaWJlcnNbaV0gPT09IHN1YnNjcmliZXIpIHsKKyAgICAgICAg
aW5kZXggPSBpOworICAgICAgfQorICAgIH0KKworICAgIHN1YnNjcmliZXJzLnNwbGljZShpbmRl
eCwgMSk7CisgICAgY2FjaGUgPSB7fTsKKyAgfQorCisgIC8qKgorICAgIFJlc2V0cyBgRW1iZXIu
SW5zdHJ1bWVudGF0aW9uYCBieSBmbHVzaGluZyBsaXN0IG9mIHN1YnNjcmliZXJzLgorICAKKyAg
ICBAbWV0aG9kIHJlc2V0CisgICAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24KKyAg
ICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlc2V0KCkgeworICAgIHN1YnNjcmliZXJz
Lmxlbmd0aCA9IDA7CisgICAgY2FjaGUgPSB7fTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1l
dGFsL2lzX2JsYW5rJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2lzX2VtcHR5J10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbElzX2VtcHR5KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBpc0JsYW5rOworCisgIC8qKgorICAgIEEgdmFsdWUgaXMgYmxh
bmsgaWYgaXQgaXMgZW1wdHkgb3IgYSB3aGl0ZXNwYWNlIHN0cmluZy4KKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEVtYmVyLmlzQmxhbmsoKTsgICAgICAgICAgICAgICAgLy8gdHJ1ZQorICAg
IEVtYmVyLmlzQmxhbmsobnVsbCk7ICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxh
bmsodW5kZWZpbmVkKTsgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoJycpOyAgICAg
ICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoW10pOyAgICAgICAgICAgICAgLy8g
dHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoJ1xuXHQnKTsgICAgICAgICAgLy8gdHJ1ZQorICAgIEVt
YmVyLmlzQmxhbmsoJyAgJyk7ICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmso
e30pOyAgICAgICAgICAgICAgLy8gZmFsc2UKKyAgICBFbWJlci5pc0JsYW5rKCdcblx0IEhlbGxv
Jyk7ICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNCbGFuaygnSGVsbG8gd29ybGQnKTsgICAvLyBm
YWxzZQorICAgIEVtYmVyLmlzQmxhbmsoWzEsMiwzXSk7ICAgICAgICAgLy8gZmFsc2UKKyAgICBg
YGAKKyAgCisgICAgQG1ldGhvZCBpc0JsYW5rCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7
T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgQHNp
bmNlIDEuNS4wCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGlzQmxhbmsob2JqKSB7
CisgICAgcmV0dXJuIF9lbWJlck1ldGFsSXNfZW1wdHkuZGVmYXVsdChvYmopIHx8IHR5cGVvZiBv
YmogPT09ICdzdHJpbmcnICYmIG9iai5tYXRjaCgvXFMvKSA9PT0gbnVsbDsKKyAgfQorfSk7Citl
bmlmZWQoJ2VtYmVyLW1ldGFsL2lzX2VtcHR5JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3By
b3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxJc19ub25lKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICAvKioKKyAgICBWZXJpZmllcyB0aGF0IGEgdmFsdWUgaXMgYG51bGxgIG9yIGFu
IGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksCisgICAgb3IgZW1wdHkgZnVuY3Rpb24uCisgIAor
ICAgIENvbnN0cmFpbnMgdGhlIHJ1bGVzIG9uIGBFbWJlci5pc05vbmVgIGJ5IHJldHVybmluZyB0
cnVlIGZvciBlbXB0eQorICAgIHN0cmluZyBhbmQgZW1wdHkgYXJyYXlzLgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIuaXNFbXB0eSgpOyAgICAgICAgICAgICAgICAvLyB0cnVlCisg
ICAgRW1iZXIuaXNFbXB0eShudWxsKTsgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNF
bXB0eSh1bmRlZmluZWQpOyAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eSgnJyk7ICAg
ICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAv
LyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eSh7fSk7ICAgICAgICAgICAgICAvLyBmYWxzZQorICAg
IEVtYmVyLmlzRW1wdHkoJ0FkYW0gSGF3a2lucycpOyAgLy8gZmFsc2UKKyAgICBFbWJlci5pc0Vt
cHR5KFswLDEsMl0pOyAgICAgICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNFbXB0eSgnXG5cdCcp
OyAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzRW1wdHkoJyAgJyk7ICAgICAgICAgICAg
Ly8gZmFsc2UKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBpc0VtcHR5CisgICAgQGZvciBFbWJl
cgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICAgIEByZXR1cm4ge0Jv
b2xlYW59CisgICAgQHB1YmxpYworICAqLworICBmdW5jdGlvbiBpc0VtcHR5KG9iaikgeworICAg
IHZhciBub25lID0gX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQob2JqKTsKKyAgICBpZiAobm9u
ZSkgeworICAgICAgcmV0dXJuIG5vbmU7CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBvYmouc2l6
ZSA9PT0gJ251bWJlcicpIHsKKyAgICAgIHJldHVybiAhb2JqLnNpemU7CisgICAgfQorCisgICAg
dmFyIG9iamVjdFR5cGUgPSB0eXBlb2Ygb2JqOworCisgICAgaWYgKG9iamVjdFR5cGUgPT09ICdv
YmplY3QnKSB7CisgICAgICB2YXIgc2l6ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChv
YmosICdzaXplJyk7CisgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7CisgICAg
ICAgIHJldHVybiAhc2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHlwZW9mIG9iai5s
ZW5ndGggPT09ICdudW1iZXInICYmIG9iamVjdFR5cGUgIT09ICdmdW5jdGlvbicpIHsKKyAgICAg
IHJldHVybiAhb2JqLmxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0VHlwZSA9PT0gJ29i
amVjdCcpIHsKKyAgICAgIHZhciBsZW5ndGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
b2JqLCAnbGVuZ3RoJyk7CisgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHsK
KyAgICAgICAgcmV0dXJuICFsZW5ndGg7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaXNFbXB0eTsKK30pOworZW5pZmVkKCJl
bWJlci1tZXRhbC9pc19ub25lIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
IC8qKgorICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgb3IgdW5k
ZWZpbmVkLiBUaGlzIGF2b2lkcyBlcnJvcnMKKyAgICBmcm9tIEpTTGludCBjb21wbGFpbmluZyBh
Ym91dCB1c2Ugb2YgPT0sIHdoaWNoIGNhbiBiZSB0ZWNobmljYWxseQorICAgIGNvbmZ1c2luZy4K
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmlzTm9uZSgpOyAgICAgICAgICAgICAg
Ly8gdHJ1ZQorICAgIEVtYmVyLmlzTm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQorICAgIEVt
YmVyLmlzTm9uZSh1bmRlZmluZWQpOyAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzTm9uZSgnJyk7
ICAgICAgICAgICAgLy8gZmFsc2UKKyAgICBFbWJlci5pc05vbmUoW10pOyAgICAgICAgICAgIC8v
IGZhbHNlCisgICAgRW1iZXIuaXNOb25lKGZ1bmN0aW9uKCkge30pOyAvLyBmYWxzZQorICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGlzTm9uZQorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09i
amVjdH0gb2JqIFZhbHVlIHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBwdWJs
aWMKKyAgKi8KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzTm9uZTsK
KworICBmdW5jdGlvbiBpc05vbmUob2JqKSB7CisgICAgcmV0dXJuIG9iaiA9PT0gbnVsbCB8fCBv
YmogPT09IHVuZGVmaW5lZDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2lzX3ByZXNl
bnQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvaXNfYmxhbmsnXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlck1ldGFsSXNfYmxhbmspIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IGlzUHJlc2VudDsKKworICAvKioKKyAgICBBIHZhbHVlIGlzIHByZXNlbnQgaWYg
aXQgbm90IGBpc0JsYW5rYC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmlzUHJl
c2VudCgpOyAgICAgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudChudWxs
KTsgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCh1bmRlZmluZWQpOyAg
ICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCgnJyk7ICAgICAgICAgICAgICAvLyBm
YWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCgnICAnKTsgICAgICAgICAgICAvLyBmYWxzZQorICAg
IEVtYmVyLmlzUHJlc2VudCgnXG5cdCcpOyAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlz
UHJlc2VudChbXSk7ICAgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCh7
IGxlbmd0aDogMCB9KSAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudChmYWxzZSk7ICAg
ICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQcmVzZW50KHRydWUpOyAgICAgICAgICAgIC8v
IHRydWUKKyAgICBFbWJlci5pc1ByZXNlbnQoJ3N0cmluZycpOyAgICAgICAgLy8gdHJ1ZQorICAg
IEVtYmVyLmlzUHJlc2VudCgwKTsgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQ
cmVzZW50KGZ1bmN0aW9uKCkge30pICAgIC8vIHRydWUKKyAgICBFbWJlci5pc1ByZXNlbnQoe30p
OyAgICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzUHJlc2VudChmYWxzZSk7ICAgICAg
ICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQcmVzZW50KCdcblx0IEhlbGxvJyk7ICAgIC8vIHRy
dWUKKyAgICBFbWJlci5pc1ByZXNlbnQoWzEsMiwzXSk7ICAgICAgICAgLy8gdHJ1ZQorICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGlzUHJlc2VudAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0g
e09iamVjdH0gb2JqIFZhbHVlIHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBz
aW5jZSAxLjguMAorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBpc1ByZXNlbnQob2Jq
KSB7CisgICAgcmV0dXJuICFfZW1iZXJNZXRhbElzX2JsYW5rLmRlZmF1bHQob2JqKTsKKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2xpYnJhcmllcycsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9mZWF0dXJlcyddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgICAgSGVscGVyIGNsYXNzIHRoYXQgYWxsb3dzIHlvdSB0byByZWdpc3RlciB5
b3VyIGxpYnJhcnkgd2l0aCBFbWJlci4KKyAgCisgICAgU2luZ2xldG9uIGNyZWF0ZWQgYXQgYEVt
YmVyLmxpYnJhcmllc2AuCisgIAorICAgIEBjbGFzcyBMaWJyYXJpZXMKKyAgICBAY29uc3RydWN0
b3IKKyAgICBAcHJpdmF0ZQorICAqLworICBmdW5jdGlvbiBMaWJyYXJpZXMoKSB7CisgICAgdGhp
cy5fcmVnaXN0cnkgPSBbXTsKKyAgICB0aGlzLl9jb3JlTGliSW5kZXggPSAwOworICB9CisKKyAg
TGlicmFyaWVzLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogTGlicmFyaWVzLAorCisg
ICAgX2dldExpYnJhcnlCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgbGlicyA9
IHRoaXMuX3JlZ2lzdHJ5OworICAgICAgdmFyIGNvdW50ID0gbGlicy5sZW5ndGg7CisKKyAgICAg
IGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAobGlic1tpXS5u
YW1lID09PSBuYW1lKSB7CisgICAgICAgICAgcmV0dXJuIGxpYnNbaV07CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBp
c0NvcmVMaWJyYXJ5KSB7CisgICAgICB2YXIgaW5kZXggPSB0aGlzLl9yZWdpc3RyeS5sZW5ndGg7
CisKKyAgICAgIGlmICghdGhpcy5fZ2V0TGlicmFyeUJ5TmFtZShuYW1lKSkgeworICAgICAgICBp
ZiAoaXNDb3JlTGlicmFyeSkgeworICAgICAgICAgIGluZGV4ID0gdGhpcy5fY29yZUxpYkluZGV4
Kys7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fcmVnaXN0cnkuc3BsaWNlKGluZGV4LCAwLCB7
IG5hbWU6IG5hbWUsIHZlcnNpb246IHZlcnNpb24gfSk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ0xpYnJhcnkgIicgKyBuYW1lICsgJyIgaXMgYWxyZWFk
eSByZWdpc3RlcmVkIHdpdGggRW1iZXIuJywgZmFsc2UsIHsgaWQ6ICdlbWJlci1tZXRhbC5saWJy
YXJpZXMtcmVnaXN0ZXInIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICByZWdpc3RlckNvcmVM
aWJyYXJ5OiBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbikgeworICAgICAgdGhpcy5yZWdpc3Rlcihu
YW1lLCB2ZXJzaW9uLCB0cnVlKTsKKyAgICB9LAorCisgICAgZGVSZWdpc3RlcjogZnVuY3Rpb24g
KG5hbWUpIHsKKyAgICAgIHZhciBsaWIgPSB0aGlzLl9nZXRMaWJyYXJ5QnlOYW1lKG5hbWUpOwor
ICAgICAgdmFyIGluZGV4OworCisgICAgICBpZiAobGliKSB7CisgICAgICAgIGluZGV4ID0gdGhp
cy5fcmVnaXN0cnkuaW5kZXhPZihsaWIpOworICAgICAgICB0aGlzLl9yZWdpc3RyeS5zcGxpY2Uo
aW5kZXgsIDEpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBM
aWJyYXJpZXM7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbG9nZ2VyJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZXJyb3InXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxFcnJvcikgeworICAndXNlIHN0cmljdCc7
CisKKyAgZnVuY3Rpb24gSygpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGZ1bmN0aW9u
IGNvbnNvbGVNZXRob2QobmFtZSkgeworICAgIHZhciBjb25zb2xlT2JqLCBsb2dUb0NvbnNvbGU7
CisgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMuY29uc29sZSkgeworICAg
ICAgY29uc29sZU9iaiA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMuY29uc29sZTsK
KyAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgICAg
Y29uc29sZU9iaiA9IGNvbnNvbGU7CisgICAgfQorCisgICAgdmFyIG1ldGhvZCA9IHR5cGVvZiBj
b25zb2xlT2JqID09PSAnb2JqZWN0JyA/IGNvbnNvbGVPYmpbbmFtZV0gOiBudWxsOworCisgICAg
aWYgKG1ldGhvZCkgeworICAgICAgLy8gT2xkZXIgSUUgZG9lc24ndCBzdXBwb3J0IGJpbmQsIGJ1
dCBDaHJvbWUgbmVlZHMgaXQKKyAgICAgIGlmICh0eXBlb2YgbWV0aG9kLmJpbmQgPT09ICdmdW5j
dGlvbicpIHsKKyAgICAgICAgbG9nVG9Db25zb2xlID0gbWV0aG9kLmJpbmQoY29uc29sZU9iaik7
CisgICAgICAgIGxvZ1RvQ29uc29sZS5kaXNwbGF5TmFtZSA9ICdjb25zb2xlLicgKyBuYW1lOwor
ICAgICAgICByZXR1cm4gbG9nVG9Db25zb2xlOworICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0
aG9kLmFwcGx5ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGxvZ1RvQ29uc29sZSA9IGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgICBtZXRob2QuYXBwbHkoY29uc29sZU9iaiwgYXJndW1lbnRzKTsK
KyAgICAgICAgfTsKKyAgICAgICAgbG9nVG9Db25zb2xlLmRpc3BsYXlOYW1lID0gJ2NvbnNvbGUu
JyArIG5hbWU7CisgICAgICAgIHJldHVybiBsb2dUb0NvbnNvbGU7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciBtZXNzYWdlID0gQXJy
YXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsICcsICcpOworICAgICAgICAgIG1ldGhv
ZChtZXNzYWdlKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlv
biBhc3NlcnRQb2x5ZmlsbCh0ZXN0LCBtZXNzYWdlKSB7CisgICAgaWYgKCF0ZXN0KSB7CisgICAg
ICB0cnkgeworICAgICAgICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHRoZSBzdGFjaworICAgICAg
ICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdhc3NlcnRpb24gZmFpbGVkOiAn
ICsgbWVzc2FnZSk7CisgICAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgICBzZXRUaW1lb3V0
KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgfSwgMCk7Cisg
ICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1w
bHkgdXNlcyB0aGUgbWV0aG9kcyBmcm9tIGBpbXBvcnRzLmNvbnNvbGVgLgorICAgIE92ZXJyaWRl
IHRoaXMgdG8gcHJvdmlkZSBtb3JlIHJvYnVzdCBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkuCisgIAor
ICAgIEBjbGFzcyBMb2dnZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgLyoqCisgICAgIExvZ3MgdGhlIGFyZ3VtZW50
cyB0byB0aGUgY29uc29sZS4KKyAgICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFz
IHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4K
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgZm9vID0gMTsKKyAgICAgIEVtYmVyLkxv
Z2dlci5sb2coJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsKKyAgICAgIC8vICJsb2cgdmFsdWUg
b2YgZm9vOiAxIiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUKKyAgICAgIGBgYAorICAg
ICAgQG1ldGhvZCBsb2cKKyAgICAgQGZvciBFbWJlci5Mb2dnZXIKKyAgICAgQHBhcmFtIHsqfSBh
cmd1bWVudHMKKyAgICAgQHB1YmxpYworICAgICovCisgICAgbG9nOiBjb25zb2xlTWV0aG9kKCds
b2cnKSB8fCBLLAorCisgICAgLyoqCisgICAgIFByaW50cyB0aGUgYXJndW1lbnRzIHRvIHRoZSBj
b25zb2xlIHdpdGggYSB3YXJuaW5nIGljb24uCisgICAgIFlvdSBjYW4gcGFzcyBhcyBtYW55IGFy
Z3VtZW50cyBhcyB5b3Ugd2FudCBhbmQgdGhleSB3aWxsIGJlIGpvaW5lZCB0b2dldGhlciB3aXRo
IGEgc3BhY2UuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuTG9nZ2VyLndhcm4o
J1NvbWV0aGluZyBoYXBwZW5lZCEnKTsKKyAgICAgIC8vICJTb21ldGhpbmcgaGFwcGVuZWQhIiB3
aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgd2l0aCBhIHdhcm5pbmcgaWNvbi4KKyAgICAg
IGBgYAorICAgICAgQG1ldGhvZCB3YXJuCisgICAgIEBmb3IgRW1iZXIuTG9nZ2VyCisgICAgIEBw
YXJhbSB7Kn0gYXJndW1lbnRzCisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdhcm46IGNvbnNv
bGVNZXRob2QoJ3dhcm4nKSB8fCBLLAorCisgICAgLyoqCisgICAgIFByaW50cyB0aGUgYXJndW1l
bnRzIHRvIHRoZSBjb25zb2xlIHdpdGggYW4gZXJyb3IgaWNvbiwgcmVkIHRleHQgYW5kIGEgc3Rh
Y2sgdHJhY2UuCisgICAgIFlvdSBjYW4gcGFzcyBhcyBtYW55IGFyZ3VtZW50cyBhcyB5b3Ugd2Fu
dCBhbmQgdGhleSB3aWxsIGJlIGpvaW5lZCB0b2dldGhlciB3aXRoIGEgc3BhY2UuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuTG9nZ2VyLmVycm9yKCdEYW5nZXIhIERhbmdlciEn
KTsKKyAgICAgIC8vICJEYW5nZXIhIERhbmdlciEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29u
c29sZSBpbiByZWQgdGV4dC4KKyAgICAgIGBgYAorICAgICAgQG1ldGhvZCBlcnJvcgorICAgICBA
Zm9yIEVtYmVyLkxvZ2dlcgorICAgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAgICBAcHVibGlj
CisgICAgKi8KKyAgICBlcnJvcjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBLLAorCisgICAg
LyoqCisgICAgIExvZ3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZS4KKyAgICAgWW91IGNh
biBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9p
bmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2
YXIgZm9vID0gMTsKKyAgICAgIEVtYmVyLkxvZ2dlci5pbmZvKCdsb2cgdmFsdWUgb2YgZm9vOics
IGZvbyk7CisgICAgICAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmludGVkIHRv
IHRoZSBjb25zb2xlCisgICAgICBgYGAKKyAgICAgIEBtZXRob2QgaW5mbworICAgICBAZm9yIEVt
YmVyLkxvZ2dlcgorICAgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBpbmZvOiBjb25zb2xlTWV0aG9kKCdpbmZvJykgfHwgSywKKworICAgIC8qKgorICAg
ICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgorICAgICBZ
b3UgY2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdhbnQgYW5kIHRoZXkgd2lsbCBi
ZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIHZhciBmb28gPSAxOworICAgICAgRW1iZXIuTG9nZ2VyLmRlYnVnKCdsb2cgdmFsdWUgb2Yg
Zm9vOicsIGZvbyk7CisgICAgICAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmlu
dGVkIHRvIHRoZSBjb25zb2xlCisgICAgICBgYGAKKyAgICAgIEBtZXRob2QgZGVidWcKKyAgICAg
QGZvciBFbWJlci5Mb2dnZXIKKyAgICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKKyAgICAgQHB1Ymxp
YworICAgICovCisgICAgZGVidWc6IGNvbnNvbGVNZXRob2QoJ2RlYnVnJykgfHwgY29uc29sZU1l
dGhvZCgnaW5mbycpIHx8IEssCisKKyAgICAvKioKKyAgICAgSWYgdGhlIHZhbHVlIHBhc3NlZCBp
bnRvIGBFbWJlci5Mb2dnZXIuYXNzZXJ0YCBpcyBub3QgdHJ1dGh5IGl0IHdpbGwgdGhyb3cgYW4g
ZXJyb3Igd2l0aCBhIHN0YWNrIHRyYWNlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVt
YmVyLkxvZ2dlci5hc3NlcnQodHJ1ZSk7IC8vIHVuZGVmaW5lZAorICAgICAgRW1iZXIuTG9nZ2Vy
LmFzc2VydCh0cnVlID09PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVy
cm9yLgorICAgICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVlID09PSBmYWxzZSwgJ1NvbWV0aGlu
ZyBpbnZhbGlkJyk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVycm9yIHdpdGggbWVz
c2FnZS4KKyAgICAgIGBgYAorICAgICAgQG1ldGhvZCBhc3NlcnQKKyAgICAgQGZvciBFbWJlci5M
b2dnZXIKKyAgICAgQHBhcmFtIHtCb29sZWFufSBib29sIFZhbHVlIHRvIHRlc3QKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IG1lc3NhZ2UgQXNzZXJ0aW9uIG1lc3NhZ2Ugb24gZmFpbGVkCisgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIGFzc2VydDogY29uc29sZU1ldGhvZCgnYXNzZXJ0JykgfHwgYXNz
ZXJ0UG9seWZpbGwKKyAgfTsKK30pOworLy8gRW1iZXIuaW1wb3J0cworZW5pZmVkKCdlbWJlci1t
ZXRhbC9tYXAnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC91
dGlscycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3Qp
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAorICAq
LworCisgIC8qCisgICAgSmF2YVNjcmlwdCAoYmVmb3JlIEVTNikgZG9lcyBub3QgaGF2ZSBhIE1h
cCBpbXBsZW1lbnRhdGlvbi4gT2JqZWN0cywKKyAgICB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBhcyBk
aWN0aW9uYXJpZXMsIG1heSBvbmx5IGhhdmUgU3RyaW5ncyBhcyBrZXlzLgorICAKKyAgICBCZWNh
dXNlIEVtYmVyIGhhcyBhIHdheSB0byBnZXQgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZXZlcnkg
b2JqZWN0CisgICAgdmlhIGBFbWJlci5ndWlkRm9yYCwgd2UgY2FuIGltcGxlbWVudCBhIHBlcmZv
cm1hbnQgTWFwIHdpdGggYXJiaXRyYXJ5CisgICAga2V5cy4gQmVjYXVzZSBpdCBpcyBjb21tb25s
eSB1c2VkIGluIGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFwIGlzCisgICAgaW1wbGVtZW50ZWQg
YXMgYSBwdXJlIEphdmFTY3JpcHQgb2JqZWN0IGZvciBwZXJmb3JtYW5jZS4KKyAgCisgICAgVGhp
cyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBvZiB0aGUgRVM2
IHByb3Bvc2FsIGZvcgorICAgIG1hcHMgKGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3Uu
cGhwP2lkPWhhcm1vbnk6c2ltcGxlX21hcHNfYW5kX3NldHMpLAorICAgIHdpdGggb25lIGV4Y2Vw
dGlvbjogIGFzIHdlIGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4tVk0gaXRlcmF0aW9uLCB3
ZSBpbXBsZW1lbnQgYQorICAgIGZvckVhY2ggbWV0aG9kIGZvciBpdGVyYXRpb24uCisgIAorICAg
IE1hcCBpcyBtb2NrZWQgb3V0IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3QsIHNvIHlvdSBj
YW4gZG8KKyAgICBgRW1iZXIuTWFwLmNyZWF0ZSgpYCBmb3Igc3ltbWV0cnkgd2l0aCBvdGhlciBF
bWJlciBjbGFzc2VzLgorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBtaXNz
aW5nRnVuY3Rpb24oZm4pIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKE9iamVjdC5wcm90b3R5
cGUudG9TdHJpbmcuY2FsbChmbikgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgIH0KKworICBm
dW5jdGlvbiBtaXNzaW5nTmV3KG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25z
dHJ1Y3RvciAnICsgbmFtZSArICcgcmVxdWlyZXMgXCduZXdcJycpOworICB9CisKKyAgZnVuY3Rp
b24gY29weU51bGwob2JqKSB7CisgICAgdmFyIG91dHB1dCA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5
X29iamVjdC5kZWZhdWx0KCk7CisKKyAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgICAg
Ly8gaGFzT3duUHJvcGVyeSBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugb2JqIGlzIG5ldyBFbXB0eU9i
amVjdCgpOworICAgICAgb3V0cHV0W3Byb3BdID0gb2JqW3Byb3BdOworICAgIH0KKworICAgIHJl
dHVybiBvdXRwdXQ7CisgIH0KKworICBmdW5jdGlvbiBjb3B5TWFwKG9yaWdpbmFsLCBuZXdPYmpl
Y3QpIHsKKyAgICB2YXIga2V5cyA9IG9yaWdpbmFsLl9rZXlzLmNvcHkoKTsKKyAgICB2YXIgdmFs
dWVzID0gY29weU51bGwob3JpZ2luYWwuX3ZhbHVlcyk7CisKKyAgICBuZXdPYmplY3QuX2tleXMg
PSBrZXlzOworICAgIG5ld09iamVjdC5fdmFsdWVzID0gdmFsdWVzOworICAgIG5ld09iamVjdC5z
aXplID0gb3JpZ2luYWwuc2l6ZTsKKworICAgIHJldHVybiBuZXdPYmplY3Q7CisgIH0KKworICAv
KioKKyAgICBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBFbWJlciBhbmQgRW1iZXIg
RGF0YS4KKyAgICBQbGVhc2UgZG8gbm90IHVzZSBpdCBhdCB0aGlzIHRpbWUuIFdlIHBsYW4gdG8g
Y2xlYW4gaXQgdXAKKyAgICBhbmQgYWRkIG1hbnkgdGVzdHMgc29vbi4KKyAgCisgICAgQGNsYXNz
IE9yZGVyZWRTZXQKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGNvbnN0cnVjdG9yCisgICAg
QHByaXZhdGUKKyAgKi8KKyAgZnVuY3Rpb24gT3JkZXJlZFNldCgpIHsKKyAgICBpZiAodGhpcyBp
bnN0YW5jZW9mIE9yZGVyZWRTZXQpIHsKKyAgICAgIHRoaXMuY2xlYXIoKTsKKyAgICAgIHRoaXMu
X3NpbGVuY2VSZW1vdmVEZXByZWNhdGlvbiA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBt
aXNzaW5nTmV3KCdPcmRlcmVkU2V0Jyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQG1ldGhv
ZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAgQHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KKyAg
ICBAcHJpdmF0ZQorICAqLworICBPcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOworCisgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcigp
OworICB9OworCisgIE9yZGVyZWRTZXQucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBP
cmRlcmVkU2V0LAorICAgIC8qKgorICAgICAgQG1ldGhvZCBjbGVhcgorICAgICAgQHByaXZhdGUK
KyAgICAqLworICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnByZXNlbmNlU2V0
ID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHRoaXMubGlz
dCA9IFtdOworICAgICAgdGhpcy5zaXplID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBA
bWV0aG9kIGFkZAorICAgICAgQHBhcmFtIG9iagorICAgICAgQHBhcmFtIGd1aWQgKG9wdGlvbmFs
LCBhbmQgZm9yIGludGVybmFsIHVzZSkKKyAgICAgIEByZXR1cm4ge0VtYmVyLk9yZGVyZWRTZXR9
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYWRkOiBmdW5jdGlvbiAob2JqLCBfZ3VpZCkg
eworICAgICAgdmFyIGd1aWQgPSBfZ3VpZCB8fCBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3Iob2Jq
KTsKKyAgICAgIHZhciBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQ7CisgICAgICB2YXIg
bGlzdCA9IHRoaXMubGlzdDsKKworICAgICAgaWYgKHByZXNlbmNlU2V0W2d1aWRdICE9PSB0cnVl
KSB7CisgICAgICAgIHByZXNlbmNlU2V0W2d1aWRdID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5zaXpl
ID0gbGlzdC5wdXNoKG9iaik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEBzaW5jZSAxLjguMAorICAgICAgQG1ldGhvZCBkZWxldGUKKyAg
ICAgIEBwYXJhbSBvYmoKKyAgICAgIEBwYXJhbSBfZ3VpZCAob3B0aW9uYWwgYW5kIGZvciBpbnRl
cm5hbCB1c2Ugb25seSkKKyAgICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgICBAcHJpdmF0ZQor
ICAgICovCisgICAgZGVsZXRlOiBmdW5jdGlvbiAob2JqLCBfZ3VpZCkgeworICAgICAgdmFyIGd1
aWQgPSBfZ3VpZCB8fCBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3Iob2JqKTsKKyAgICAgIHZhciBw
cmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQ7CisgICAgICB2YXIgbGlzdCA9IHRoaXMubGlz
dDsKKworICAgICAgaWYgKHByZXNlbmNlU2V0W2d1aWRdID09PSB0cnVlKSB7CisgICAgICAgIGRl
bGV0ZSBwcmVzZW5jZVNldFtndWlkXTsKKyAgICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9m
KG9iaik7CisgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgICAgbGlzdC5zcGxpY2Uo
aW5kZXgsIDEpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2l6ZSA9IGxpc3QubGVuZ3RoOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0aG9kIGlzRW1wdHkKKyAg
ICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaXNFbXB0
eTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gMDsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBAbWV0aG9kIGhhcworICAgICAgQHBhcmFtIG9iagorICAgICAgQHJl
dHVybiB7Qm9vbGVhbn0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYXM6IGZ1bmN0aW9u
IChvYmopIHsKKyAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICB2YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZv
cihvYmopOworICAgICAgdmFyIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldDsKKworICAg
ICAgcmV0dXJuIHByZXNlbmNlU2V0W2d1aWRdID09PSB0cnVlOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIEBtZXRob2QgZm9yRWFjaAorICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAgICAg
IEBwYXJhbSBzZWxmCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZm9yRWFjaDogZnVuY3Rp
b24gKGZuIC8qLCAuLi50aGlzQXJnKi8pIHsKKyAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5j
dGlvbicpIHsKKyAgICAgICAgbWlzc2luZ0Z1bmN0aW9uKGZuKTsKKyAgICAgIH0KKworICAgICAg
aWYgKHRoaXMuc2l6ZSA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAg
IHZhciBsaXN0ID0gdGhpcy5saXN0OworICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5n
dGg7CisgICAgICB2YXIgaTsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMikgeworICAgICAgICBm
b3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGZuLmNhbGwoYXJn
dW1lbnRzWzFdLCBsaXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg
Zm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBmbihsaXN0W2ld
KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2Qg
dG9BcnJheQorICAgICAgQHJldHVybiB7QXJyYXl9CisgICAgICBAcHJpdmF0ZQorICAgICovCisg
ICAgdG9BcnJheTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMubGlzdC5zbGljZSgp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgY29weQorICAgICAgQHJldHVybiB7
RW1iZXIuT3JkZXJlZFNldH0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBjb3B5OiBmdW5j
dGlvbiAoKSB7CisgICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yOworICAg
ICAgdmFyIHNldCA9IG5ldyBDb25zdHJ1Y3RvcigpOworCisgICAgICBzZXQuX3NpbGVuY2VSZW1v
dmVEZXByZWNhdGlvbiA9IHRoaXMuX3NpbGVuY2VSZW1vdmVEZXByZWNhdGlvbjsKKyAgICAgIHNl
dC5wcmVzZW5jZVNldCA9IGNvcHlOdWxsKHRoaXMucHJlc2VuY2VTZXQpOworICAgICAgc2V0Lmxp
c3QgPSB0aGlzLnRvQXJyYXkoKTsKKyAgICAgIHNldC5zaXplID0gdGhpcy5zaXplOworCisgICAg
ICByZXR1cm4gc2V0OworICAgIH0KKyAgfTsKKworICAvKioKKyAgICBBIE1hcCBzdG9yZXMgdmFs
dWVzIGluZGV4ZWQgYnkga2V5cy4gVW5saWtlIEphdmFTY3JpcHQncworICAgIGRlZmF1bHQgT2Jq
ZWN0cywgdGhlIGtleXMgb2YgYSBNYXAgY2FuIGJlIGFueSBKYXZhU2NyaXB0CisgICAgb2JqZWN0
LgorICAKKyAgICBJbnRlcm5hbGx5LCBhIE1hcCBoYXMgdHdvIGRhdGEgc3RydWN0dXJlczoKKyAg
CisgICAgMS4gYGtleXNgOiBhbiBPcmRlcmVkU2V0IG9mIGFsbCBvZiB0aGUgZXhpc3Rpbmcga2V5
cworICAgIDIuIGB2YWx1ZXNgOiBhIEphdmFTY3JpcHQgT2JqZWN0IGluZGV4ZWQgYnkgdGhlIGBF
bWJlci5ndWlkRm9yKGtleSlgCisgIAorICAgIFdoZW4gYSBrZXkvdmFsdWUgcGFpciBpcyBhZGRl
ZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlCisgICAgYWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBP
cmRlcmVkU2V0LCBhbmQgY3JlYXRlIG9yCisgICAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVz
YC4gV2hlbiBhbiBlbnRyeSBpcyBkZWxldGVkLAorICAgIHdlIGRlbGV0ZSBpdHMgZW50cnkgaW4g
YGtleXNgIGFuZCBgdmFsdWVzYC4KKyAgCisgICAgQGNsYXNzIE1hcAorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAcHJpdmF0ZQorICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5jdGlvbiBN
YXAoKSB7CisgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7CisgICAg
ICB0aGlzLl9rZXlzID0gT3JkZXJlZFNldC5jcmVhdGUoKTsKKyAgICAgIHRoaXMuX2tleXMuX3Np
bGVuY2VSZW1vdmVEZXByZWNhdGlvbiA9IHRydWU7CisgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcg
X2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgdGhpcy5zaXplID0gMDsK
KyAgICB9IGVsc2UgeworICAgICAgbWlzc2luZ05ldygnT3JkZXJlZFNldCcpOworICAgIH0KKyAg
fQorCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1hcCA9IE1hcDsKKworICAvKioKKyAgICBA
bWV0aG9kIGNyZWF0ZQorICAgIEBzdGF0aWMKKyAgICBAcHJpdmF0ZQorICAqLworICBNYXAuY3Jl
YXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CisgICAgcmV0
dXJuIG5ldyBDb25zdHJ1Y3RvcigpOworICB9OworCisgIE1hcC5wcm90b3R5cGUgPSB7CisgICAg
Y29uc3RydWN0b3I6IE1hcCwKKworICAgIC8qKgorICAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNo
YW5nZSBhcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG1hcCBjaGFuZ2VzLgorICAgICAg
IEBzaW5jZSAxLjguMAorICAgICAgQHByb3BlcnR5IHNpemUKKyAgICAgIEB0eXBlIG51bWJlcgor
ICAgICAgQGRlZmF1bHQgMAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHNpemU6IDAsCisK
KyAgICAvKioKKyAgICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZl
biBrZXkuCisgICAgICAgQG1ldGhvZCBnZXQKKyAgICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgICBA
cmV0dXJuIHsqfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIGB1bmRlZmlu
ZWRgCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7Cisg
ICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwor
ICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlczsKKyAgICAgIHZhciBndWlkID0gX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKGtleSk7CisKKyAgICAgIHJldHVybiB2YWx1ZXNbZ3VpZF07Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQWRkcyBhIHZhbHVlIHRvIHRoZSBtYXAuIElmIGEgdmFs
dWUgZm9yIHRoZSBnaXZlbiBrZXkgaGFzIGFscmVhZHkgYmVlbgorICAgICAgcHJvdmlkZWQsIHRo
ZSBuZXcgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSBvbGQgdmFsdWUuCisgICAgICAgQG1ldGhvZCBz
ZXQKKyAgICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgICBAcGFyYW0geyp9IHZhbHVlCisgICAgICBA
cmV0dXJuIHtFbWJlci5NYXB9CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgc2V0OiBmdW5j
dGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAg
dmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlczsKKyAgICAgIHZhciBndWlkID0gX2VtYmVyTWV0YWxV
dGlscy5ndWlkRm9yKGtleSk7CisKKyAgICAgIC8vIGVuc3VyZSB3ZSBkb24ndCBzdG9yZSAtMAor
ICAgICAgdmFyIGsgPSBrZXkgPT09IC0wID8gMCA6IGtleTsKKworICAgICAga2V5cy5hZGQoaywg
Z3VpZCk7CisKKyAgICAgIHZhbHVlc1tndWlkXSA9IHZhbHVlOworCisgICAgICB0aGlzLnNpemUg
PSBrZXlzLnNpemU7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBtYXAgZm9yIGFuIGFzc29jaWF0ZWQga2V5Lgor
ICAgICAgIEBzaW5jZSAxLjguMAorICAgICAgQG1ldGhvZCBkZWxldGUKKyAgICAgIEBwYXJhbSB7
Kn0ga2V5CisgICAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFuIGl0ZW0gd2FzIHJlbW92
ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGRlbGV0ZTog
ZnVuY3Rpb24gKGtleSkgeworICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgeworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBkb24ndCB1c2UgRVM2ICJkZWxldGUiIGJl
Y2F1c2UgaXQgd2lsbCBiZSBhbm5veWluZworICAgICAgLy8gdG8gdXNlIGluIGJyb3dzZXJzIHRo
YXQgYXJlIG5vdCBFUzYgZnJpZW5kbHk7CisgICAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7Cisg
ICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzOworICAgICAgdmFyIGd1aWQgPSBfZW1iZXJN
ZXRhbFV0aWxzLmd1aWRGb3Ioa2V5KTsKKworICAgICAgaWYgKGtleXMuZGVsZXRlKGtleSwgZ3Vp
ZCkpIHsKKyAgICAgICAgZGVsZXRlIHZhbHVlc1tndWlkXTsKKyAgICAgICAgdGhpcy5zaXplID0g
a2V5cy5zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBDaGVjayB3
aGV0aGVyIGEga2V5IGlzIHByZXNlbnQuCisgICAgICAgQG1ldGhvZCBoYXMKKyAgICAgIEBwYXJh
bSB7Kn0ga2V5CisgICAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIHdhcyBw
cmVzZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYXM6
IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9rZXlzLmhhcyhrZXkpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGtleXMgYW5kIHZhbHVl
cy4gQ2FsbHMgdGhlIGZ1bmN0aW9uIG9uY2UKKyAgICAgIGZvciBlYWNoIGtleSwgcGFzc2luZyBp
biB2YWx1ZSwga2V5LCBhbmQgdGhlIG1hcCBiZWluZyBpdGVyYXRlZCBvdmVyLAorICAgICAgaW4g
dGhhdCBvcmRlci4KKyAgICAgICBUaGUga2V5cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBpdGVyYXRl
ZCBvdmVyIGluIGluc2VydGlvbiBvcmRlci4KKyAgICAgICBAbWV0aG9kIGZvckVhY2gKKyAgICAg
IEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICBAcGFyYW0geyp9IHNlbGYgaWYgcGFz
c2VkLCB0aGUgYHRoaXNgIHZhbHVlIGluc2lkZSB0aGUKKyAgICAgICAgY2FsbGJhY2suIEJ5IGRl
ZmF1bHQsIGB0aGlzYCBpcyB0aGUgbWFwLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGZv
ckVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjayAvKiwgLi4udGhpc0FyZyovKSB7CisgICAgICBpZiAo
dHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIG1pc3NpbmdGdW5jdGlv
bihjYWxsYmFjayk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxl
bmd0aDsKKyAgICAgIHZhciBtYXAgPSB0aGlzOworICAgICAgdmFyIGNiLCB0aGlzQXJnOworCisg
ICAgICBpZiAobGVuZ3RoID09PSAyKSB7CisgICAgICAgIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07
CisgICAgICAgIGNiID0gZnVuY3Rpb24gKGtleSkgeworICAgICAgICAgIGNhbGxiYWNrLmNhbGwo
dGhpc0FyZywgbWFwLmdldChrZXkpLCBrZXksIG1hcCk7CisgICAgICAgIH07CisgICAgICB9IGVs
c2UgeworICAgICAgICBjYiA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgICAgICBjYWxsYmFjayht
YXAuZ2V0KGtleSksIGtleSwgbWFwKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdGhp
cy5fa2V5cy5mb3JFYWNoKGNiKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0aG9kIGNs
ZWFyCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRoaXMuX2tleXMuY2xlYXIoKTsKKyAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgICB0aGlzLnNpemUgPSAwOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgY29weQorICAgICAgQHJldHVybiB7RW1iZXIuTWFw
fQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNvcHk6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiBjb3B5TWFwKHRoaXMsIG5ldyBNYXAoKSk7CisgICAgfQorICB9OworCisgIC8qKgor
ICAgIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0
ZW5kcyBFbWJlci5NYXAKKyAgICBAcHJpdmF0ZQorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwYXJh
bSBbb3B0aW9uc10KKyAgICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQorICAq
LworICBmdW5jdGlvbiBNYXBXaXRoRGVmYXVsdChvcHRpb25zKSB7CisgICAgdGhpcy5fc3VwZXIk
Y29uc3RydWN0b3IoKTsKKyAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZh
bHVlOworICB9CisKKyAgLyoqCisgICAgQG1ldGhvZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAg
QHBhcmFtIFtvcHRpb25zXQorICAgICAgQHBhcmFtIHsqfSBbb3B0aW9ucy5kZWZhdWx0VmFsdWVd
CisgICAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIuTWFwfSBJZiBvcHRpb25z
IGFyZSBwYXNzZWQsIHJldHVybnMKKyAgICAgIGBFbWJlci5NYXBXaXRoRGVmYXVsdGAgb3RoZXJ3
aXNlIHJldHVybnMgYEVtYmVyLk1hcGAKKyAgICBAcHJpdmF0ZQorICAqLworICBNYXBXaXRoRGVm
YXVsdC5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykgeworICAgIGlmIChvcHRpb25zKSB7Cisg
ICAgICByZXR1cm4gbmV3IE1hcFdpdGhEZWZhdWx0KG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICByZXR1cm4gbmV3IE1hcCgpOworICAgIH0KKyAgfTsKKworICBNYXBXaXRoRGVmYXVsdC5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1hcC5wcm90b3R5cGUpOworICBNYXBXaXRoRGVmYXVs
dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXBXaXRoRGVmYXVsdDsKKyAgTWFwV2l0aERlZmF1
bHQucHJvdG90eXBlLl9zdXBlciRjb25zdHJ1Y3RvciA9IE1hcDsKKyAgTWFwV2l0aERlZmF1bHQu
cHJvdG90eXBlLl9zdXBlciRnZXQgPSBNYXAucHJvdG90eXBlLmdldDsKKworICAvKioKKyAgICBS
ZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LgorICAKKyAgICBA
bWV0aG9kIGdldAorICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgQHJldHVybiB7Kn0gdGhlIHZhbHVl
IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQorICAgIEBwcml2
YXRlCisgICovCisgIE1hcFdpdGhEZWZhdWx0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5
KSB7CisgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5oYXMoa2V5KTsKKworICAgIGlmIChoYXNWYWx1
ZSkgeworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyJGdldChrZXkpOworICAgIH0gZWxzZSB7Cisg
ICAgICB2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUoa2V5KTsKKyAgICAgIHRo
aXMuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Cisg
ICAgfQorICB9OworCisgIC8qKgorICAgIEBtZXRob2QgY29weQorICAgIEByZXR1cm4ge0VtYmVy
Lk1hcFdpdGhEZWZhdWx0fQorICAgIEBwcml2YXRlCisgICovCisgIE1hcFdpdGhEZWZhdWx0LnBy
b3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXMu
Y29uc3RydWN0b3I7CisgICAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IENvbnN0cnVjdG9yKHsK
KyAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUKKyAgICB9KSk7CisgIH07CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gTWFwOworICBleHBvcnRzLk9yZGVyZWRTZXQgPSBPcmRlcmVk
U2V0OworICBleHBvcnRzLk1hcCA9IE1hcDsKKyAgZXhwb3J0cy5NYXBXaXRoRGVmYXVsdCA9IE1h
cFdpdGhEZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL21lcmdlJywgWydleHBvcnRz
J10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgIE1lcmdlIHRoZSBjb250ZW50cyBv
ZiB0d28gb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBFbWJlci5tZXJnZSh7Zmlyc3Q6ICdUb20nfSwge2xhc3Q6ICdEYWxl
J30pOyAvLyB7Zmlyc3Q6ICdUb20nLCBsYXN0OiAnRGFsZSd9CisgICAgdmFyIGEgPSB7Zmlyc3Q6
ICdZZWh1ZGEnfTsKKyAgICB2YXIgYiA9IHtsYXN0OiAnS2F0eid9OworICAgIEVtYmVyLm1lcmdl
KGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1llaHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0ge2xh
c3Q6ICdLYXR6J30KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBtZXJnZQorICAgIEBmb3IgRW1i
ZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWwgVGhlIG9iamVjdCB0byBtZXJnZSBpbnRv
CisgICAgQHBhcmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRp
ZXMgZnJvbQorICAgIEByZXR1cm4ge09iamVjdH0KKyAgICBAcHVibGljCisgICovCisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBtZXJnZTsKKworICBmdW5jdGlvbiBtZXJn
ZShvcmlnaW5hbCwgdXBkYXRlcykgeworICAgIGlmICghdXBkYXRlcyB8fCB0eXBlb2YgdXBkYXRl
cyAhPT0gJ29iamVjdCcpIHsKKyAgICAgIHJldHVybiBvcmlnaW5hbDsKKyAgICB9CisKKyAgICB2
YXIgcHJvcHMgPSBPYmplY3Qua2V5cyh1cGRhdGVzKTsKKyAgICB2YXIgcHJvcDsKKyAgICB2YXIg
bGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7
IGkrKykgeworICAgICAgcHJvcCA9IHByb3BzW2ldOworICAgICAgb3JpZ2luYWxbcHJvcF0gPSB1
cGRhdGVzW3Byb3BdOworICAgIH0KKworICAgIHJldHVybiBvcmlnaW5hbDsKKyAgfQorfSk7Citl
bmlmZWQoJ2VtYmVyLW1ldGFsL21ldGEnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YV9s
aXN0ZW5lcnMnLCAnZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXJNZXRhbE1ldGFfbGlzdGVuZXJzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCkgewor
ICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNw
aWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisgIGV4cG9ydHMubWV0YSA9IG1ldGE7CisgIGV4cG9y
dHMucGVla01ldGEgPSBwZWVrTWV0YTsKKyAgZXhwb3J0cy5kZWxldGVNZXRhID0gZGVsZXRlTWV0
YTsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8qCisgICBUaGlz
IGRlY2xhcmVzIHNldmVyYWwgbWV0YS1wcm9ncmFtbWVkIG1lbWJlcnMgb24gdGhlIE1ldGEgY2xh
c3MuIFN1Y2gKKyAgIG1ldGEhCisgIAorICAgSW4gZ2VuZXJhbCwgdGhlIGByZWFkYWJsZWAgdmFy
aWFudHMgd2lsbCBnaXZlIHlvdSBhbiBvYmplY3QgKGlmIGl0CisgICBhbHJlYWR5IGV4aXN0cykg
dGhhdCB5b3UgY2FuIHJlYWQgYnV0IHNob3VsZCBub3QgbW9kaWZ5LiBUaGUKKyAgIGB3cml0YWJs
ZWAgdmFyaWFudHMgd2lsbCBnaXZlIHlvdSBhIG11dGFibGUgb2JqZWN0LCBhbmQgdGhleSB3aWxs
CisgICBjcmVhdGUgaXQgaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QuCisgIAorICAgVGhlIGZv
bGxvd2luZyBtZXRob2RzIHdpbGwgZ2V0IGdlbmVyYXRlZCBtZXRhcHJvZ3JhbW1hdGljYWxseSwg
YW5kCisgICBJJ20gaW5jbHVkaW5nIHRoZW0gaGVyZSBmb3IgZ3JlcHBhYmlsaXR5OgorICAKKyAg
IHdyaXRhYmxlQ2FjaGUsIHJlYWRhYmxlQ2FjaGUsIHdyaXRlV2F0Y2hpbmcsCisgICBwZWVrV2F0
Y2hpbmcsIGNsZWFyV2F0Y2hpbmcsIHdyaXRlTWl4aW5zLAorICAgcGVla01peGlucywgY2xlYXJN
aXhpbnMsIHdyaXRlQmluZGluZ3MsCisgICBwZWVrQmluZGluZ3MsIGNsZWFyQmluZGluZ3MsIHdy
aXRlVmFsdWVzLAorICAgcGVla1ZhbHVlcywgY2xlYXJWYWx1ZXMsIHdyaXRlRGVwcywgZm9yRWFj
aEluRGVwcworICAgd3JpdGFibGVDaGFpbldhdGNoZXJzLCByZWFkYWJsZUNoYWluV2F0Y2hlcnMs
IHdyaXRhYmxlQ2hhaW5zLAorICAgcmVhZGFibGVDaGFpbnMsIHdyaXRhYmxlVGFnLCByZWFkYWJs
ZVRhZworICAKKyAgKi8KKyAgdmFyIG1lbWJlcnMgPSB7CisgICAgY2FjaGU6IG93bk1hcCwKKyAg
ICB3ZWFrOiBvd25NYXAsCisgICAgd2F0Y2hpbmc6IGluaGVyaXRlZE1hcCwKKyAgICBtaXhpbnM6
IGluaGVyaXRlZE1hcCwKKyAgICBiaW5kaW5nczogaW5oZXJpdGVkTWFwLAorICAgIHZhbHVlczog
aW5oZXJpdGVkTWFwLAorICAgIGRlcHM6IGluaGVyaXRlZE1hcE9mTWFwcywKKyAgICBjaGFpbldh
dGNoZXJzOiBvd25DdXN0b21PYmplY3QsCisgICAgY2hhaW5zOiBpbmhlcml0ZWRDdXN0b21PYmpl
Y3QsCisgICAgdGFnOiBvd25DdXN0b21PYmplY3QKKyAgfTsKKworICB2YXIgbWVtYmVyTmFtZXMg
PSBPYmplY3Qua2V5cyhtZW1iZXJzKTsKKyAgdmFyIE1FVEFfRklFTEQgPSAnX19lbWJlcl9tZXRh
X18nOworCisgIGZ1bmN0aW9uIE1ldGEob2JqLCBwYXJlbnRNZXRhKSB7CisgICAgdGhpcy5fY2Fj
aGUgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fd2VhayA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl93
YXRjaGluZyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9taXhpbnMgPSB1bmRlZmluZWQ7CisgICAg
dGhpcy5fYmluZGluZ3MgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fdmFsdWVzID0gdW5kZWZpbmVk
OworICAgIHRoaXMuX2RlcHMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fY2hhaW5XYXRjaGVycyA9
IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9jaGFpbnMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fdGFn
ID0gdW5kZWZpbmVkOworCisgICAgLy8gdXNlZCBvbmx5IGludGVybmFsbHkKKyAgICB0aGlzLnNv
dXJjZSA9IG9iajsKKworICAgIC8vIHdoZW4gbWV0YShvYmopLnByb3RvID09PSBvYmosIHRoZSBv
YmplY3QgaXMgaW50ZW5kZWQgdG8gYmUgb25seSBhCisgICAgLy8gcHJvdG90eXBlIGFuZCBkb2Vz
bid0IG5lZWQgdG8gYWN0dWFsbHkgYmUgb2JzZXJ2YWJsZSBpdHNlbGYKKyAgICB0aGlzLnByb3Rv
ID0gdW5kZWZpbmVkOworCisgICAgLy8gVGhlIG5leHQgbWV0YSBpbiBvdXIgaW5oZXJpdGFuY2Ug
Y2hhaW4uIFdlICh3aWxsKSB0cmFjayB0aGlzCisgICAgLy8gZXhwbGljaXRseSBpbnN0ZWFkIG9m
IHVzaW5nIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBiZWNhdXNlIHdlCisgICAgLy8gaGF2ZSBk
ZXRhaWxlZCBrbm93bGVkZ2Ugb2YgaG93IGVhY2ggcHJvcGVydHkgc2hvdWxkIHJlYWxseSBiZQor
ICAgIC8vIGluaGVyaXRlZCwgYW5kIHdlIGNhbiBvcHRpbWl6ZSBpdCBtdWNoIGJldHRlciB0aGFu
IEpTIHJ1bnRpbWVzLgorICAgIHRoaXMucGFyZW50ID0gcGFyZW50TWV0YTsKKworICAgIHRoaXMu
X2luaXRpYWxpemVMaXN0ZW5lcnMoKTsKKyAgfQorCisgIGZvciAodmFyIF9uYW1lIGluIF9lbWJl
ck1ldGFsTWV0YV9saXN0ZW5lcnMucHJvdG9NZXRob2RzKSB7CisgICAgTWV0YS5wcm90b3R5cGVb
X25hbWVdID0gX2VtYmVyTWV0YWxNZXRhX2xpc3RlbmVycy5wcm90b01ldGhvZHNbX25hbWVdOwor
ICB9CisgIG1lbWJlck5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICByZXR1cm4g
bWVtYmVyc1tuYW1lXShuYW1lLCBNZXRhKTsKKyAgfSk7CisKKyAgLy8gSW1wbGVtZW50cyBhIG1l
bWJlciB0aGF0IGlzIGEgbGF6aWx5IGNyZWF0ZWQsIG5vbi1pbmhlcml0YWJsZQorICAvLyBQT0pP
LgorICBmdW5jdGlvbiBvd25NYXAobmFtZSwgTWV0YSkgeworICAgIHZhciBrZXkgPSBtZW1iZXJQ
cm9wZXJ0eShuYW1lKTsKKyAgICB2YXIgY2FwaXRhbGl6ZWQgPSBjYXBpdGFsaXplKG5hbWUpOwor
ICAgIE1ldGEucHJvdG90eXBlWyd3cml0YWJsZScgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVPd25NYXAoa2V5KTsKKyAgICB9Owor
ICAgIE1ldGEucHJvdG90eXBlWydyZWFkYWJsZScgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gdGhpc1trZXldOworICAgIH07CisgIH0KKworICBNZXRhLnByb3Rv
dHlwZS5fZ2V0T3JDcmVhdGVPd25NYXAgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIHJldCA9
IHRoaXNba2V5XTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0ID0gdGhpc1trZXldID0gbmV3
IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJl
dDsKKyAgfTsKKworICAvLyBJbXBsZW1lbnRzIGEgbWVtYmVyIHRoYXQgaXMgYSBsYXppbHkgY3Jl
YXRlZCBQT0pPIHdpdGggaW5oZXJpdGFibGUKKyAgLy8gdmFsdWVzLgorICBmdW5jdGlvbiBpbmhl
cml0ZWRNYXAobmFtZSwgTWV0YSkgeworICAgIHZhciBrZXkgPSBtZW1iZXJQcm9wZXJ0eShuYW1l
KTsKKyAgICB2YXIgY2FwaXRhbGl6ZWQgPSBjYXBpdGFsaXplKG5hbWUpOworCisgICAgTWV0YS5w
cm90b3R5cGVbJ3dyaXRlJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXksIHZhbHVl
KSB7CisgICAgICB2YXIgbWFwID0gdGhpcy5fZ2V0T3JDcmVhdGVPd25NYXAoa2V5KTsKKyAgICAg
IG1hcFtzdWJrZXldID0gdmFsdWU7CisgICAgfTsKKworICAgIE1ldGEucHJvdG90eXBlWydwZWVr
JyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXkpIHsKKyAgICAgIHJldHVybiB0aGlz
Ll9maW5kSW5oZXJpdGVkKGtleSwgc3Via2V5KTsKKyAgICB9OworCisgICAgTWV0YS5wcm90b3R5
cGVbJ2ZvckVhY2gnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGZuKSB7CisgICAgICB2YXIg
cG9pbnRlciA9IHRoaXM7CisgICAgICB2YXIgc2VlbiA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCk7CisgICAgICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7Cisg
ICAgICAgIHZhciBtYXAgPSBwb2ludGVyW2tleV07CisgICAgICAgIGlmIChtYXApIHsKKyAgICAg
ICAgICBmb3IgKHZhciBfa2V5IGluIG1hcCkgeworICAgICAgICAgICAgaWYgKCFzZWVuW19rZXld
KSB7CisgICAgICAgICAgICAgIHNlZW5bX2tleV0gPSB0cnVlOworICAgICAgICAgICAgICBmbihf
a2V5LCBtYXBbX2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9CisgICAgfTsKKworICAg
IE1ldGEucHJvdG90eXBlWydjbGVhcicgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoKSB7Cisg
ICAgICB0aGlzW2tleV0gPSB1bmRlZmluZWQ7CisgICAgfTsKKworICAgIE1ldGEucHJvdG90eXBl
WydkZWxldGVGcm9tJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXkpIHsKKyAgICAg
IGRlbGV0ZSB0aGlzLl9nZXRPckNyZWF0ZU93bk1hcChrZXkpW3N1YmtleV07CisgICAgfTsKKwor
ICAgIE1ldGEucHJvdG90eXBlWydoYXNJbicgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoc3Vi
a2V5KSB7CisgICAgICByZXR1cm4gdGhpcy5fZmluZEluaGVyaXRlZChrZXksIHN1YmtleSkgIT09
IHVuZGVmaW5lZDsKKyAgICB9OworICB9CisKKyAgTWV0YS5wcm90b3R5cGUuX2dldEluaGVyaXRl
ZCA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgd2hpbGUg
KHBvaW50ZXIgIT09IHVuZGVmaW5lZCkgeworICAgICAgaWYgKHBvaW50ZXJba2V5XSkgeworICAg
ICAgICByZXR1cm4gcG9pbnRlcltrZXldOworICAgICAgfQorICAgICAgcG9pbnRlciA9IHBvaW50
ZXIucGFyZW50OworICAgIH0KKyAgfTsKKworICBNZXRhLnByb3RvdHlwZS5fZmluZEluaGVyaXRl
ZCA9IGZ1bmN0aW9uIChrZXksIHN1YmtleSkgeworICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAg
ICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB2YXIgbWFwID0gcG9pbnRl
cltrZXldOworICAgICAgaWYgKG1hcCkgeworICAgICAgICB2YXIgdmFsdWUgPSBtYXBbc3Via2V5
XTsKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICByZXR1cm4g
dmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBvaW50ZXIgPSBwb2ludGVyLnBhcmVu
dDsKKyAgICB9CisgIH07CisKKyAgLy8gSW1wbGVtZW50cyBhIG1lbWJlciB0aGF0IHByb3ZpZGVz
IGEgbGF6aWx5IGNyZWF0ZWQgbWFwIG9mIG1hcHMsCisgIC8vIHdpdGggaW5oZXJpdGFuY2UgYXQg
Ym90aCBsZXZlbHMuCisgIGZ1bmN0aW9uIGluaGVyaXRlZE1hcE9mTWFwcyhuYW1lLCBNZXRhKSB7
CisgICAgdmFyIGtleSA9IG1lbWJlclByb3BlcnR5KG5hbWUpOworICAgIHZhciBjYXBpdGFsaXpl
ZCA9IGNhcGl0YWxpemUobmFtZSk7CisKKyAgICBNZXRhLnByb3RvdHlwZVsnd3JpdGUnICsgY2Fw
aXRhbGl6ZWRdID0gZnVuY3Rpb24gKHN1YmtleSwgaXRlbWtleSwgdmFsdWUpIHsKKyAgICAgIHZh
ciBvdXRlck1hcCA9IHRoaXMuX2dldE9yQ3JlYXRlT3duTWFwKGtleSk7CisgICAgICB2YXIgaW5u
ZXJNYXAgPSBvdXRlck1hcFtzdWJrZXldOworICAgICAgaWYgKCFpbm5lck1hcCkgeworICAgICAg
ICBpbm5lck1hcCA9IG91dGVyTWFwW3N1YmtleV0gPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmpl
Y3QuZGVmYXVsdCgpOworICAgICAgfQorICAgICAgaW5uZXJNYXBbaXRlbWtleV0gPSB2YWx1ZTsK
KyAgICB9OworCisgICAgTWV0YS5wcm90b3R5cGVbJ3BlZWsnICsgY2FwaXRhbGl6ZWRdID0gZnVu
Y3Rpb24gKHN1YmtleSwgaXRlbWtleSkgeworICAgICAgdmFyIHBvaW50ZXIgPSB0aGlzOworICAg
ICAgd2hpbGUgKHBvaW50ZXIgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgbWFwID0gcG9p
bnRlcltrZXldOworICAgICAgICBpZiAobWFwKSB7CisgICAgICAgICAgdmFyIHZhbHVlID0gbWFw
W3N1YmtleV07CisgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWVb
aXRlbWtleV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbaXRl
bWtleV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBv
aW50ZXIgPSBwb2ludGVyLnBhcmVudDsKKyAgICAgIH0KKyAgICB9OworCisgICAgTWV0YS5wcm90
b3R5cGVbJ2hhcycgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoc3Via2V5KSB7CisgICAgICB2
YXIgcG9pbnRlciA9IHRoaXM7CisgICAgICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7
CisgICAgICAgIGlmIChwb2ludGVyW2tleV0gJiYgcG9pbnRlcltrZXldW3N1YmtleV0pIHsKKyAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRl
ci5wYXJlbnQ7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIE1l
dGEucHJvdG90eXBlWydmb3JFYWNoSW4nICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKHN1Ymtl
eSwgZm4pIHsKKyAgICAgIHJldHVybiB0aGlzLl9mb3JFYWNoSW4oa2V5LCBzdWJrZXksIGZuKTsK
KyAgICB9OworICB9CisKKyAgTWV0YS5wcm90b3R5cGUuX2ZvckVhY2hJbiA9IGZ1bmN0aW9uIChr
ZXksIHN1YmtleSwgZm4pIHsKKyAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgdmFyIHNlZW4g
PSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgIHZhciBjYWxscyA9
IFtdOworICAgIHdoaWxlIChwb2ludGVyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHZhciBtYXAg
PSBwb2ludGVyW2tleV07CisgICAgICBpZiAobWFwKSB7CisgICAgICAgIHZhciBpbm5lck1hcCA9
IG1hcFtzdWJrZXldOworICAgICAgICBpZiAoaW5uZXJNYXApIHsKKyAgICAgICAgICBmb3IgKHZh
ciBpbm5lcktleSBpbiBpbm5lck1hcCkgeworICAgICAgICAgICAgaWYgKCFzZWVuW2lubmVyS2V5
XSkgeworICAgICAgICAgICAgICBzZWVuW2lubmVyS2V5XSA9IHRydWU7CisgICAgICAgICAgICAg
IGNhbGxzLnB1c2goW2lubmVyS2V5LCBpbm5lck1hcFtpbm5lcktleV1dKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBvaW50ZXIgPSBwb2lu
dGVyLnBhcmVudDsKKyAgICB9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7
IGkrKykgeworICAgICAgdmFyIF9jYWxscyRpID0gY2FsbHNbaV07CisgICAgICB2YXIgaW5uZXJL
ZXkgPSBfY2FsbHMkaVswXTsKKyAgICAgIHZhciB2YWx1ZSA9IF9jYWxscyRpWzFdOworCisgICAg
ICBmbihpbm5lcktleSwgdmFsdWUpOworICAgIH0KKyAgfTsKKworICAvLyBJbXBsZW1lbnRzIGEg
bWVtYmVyIHRoYXQgcHJvdmlkZXMgYSBub24taGVyaXRhYmxlLCBsYXppbHktY3JlYXRlZAorICAv
LyBvYmplY3QgdXNpbmcgdGhlIG1ldGhvZCB5b3UgcHJvdmlkZS4KKyAgZnVuY3Rpb24gb3duQ3Vz
dG9tT2JqZWN0KG5hbWUsIE1ldGEpIHsKKyAgICB2YXIga2V5ID0gbWVtYmVyUHJvcGVydHkobmFt
ZSk7CisgICAgdmFyIGNhcGl0YWxpemVkID0gY2FwaXRhbGl6ZShuYW1lKTsKKyAgICBNZXRhLnBy
b3RvdHlwZVsnd3JpdGFibGUnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGNyZWF0ZSkgewor
ICAgICAgdmFyIHJldCA9IHRoaXNba2V5XTsKKyAgICAgIGlmICghcmV0KSB7CisgICAgICAgIHJl
dCA9IHRoaXNba2V5XSA9IGNyZWF0ZSh0aGlzLnNvdXJjZSk7CisgICAgICB9CisgICAgICByZXR1
cm4gcmV0OworICAgIH07CisgICAgTWV0YS5wcm90b3R5cGVbJ3JlYWRhYmxlJyArIGNhcGl0YWxp
emVkXSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgfTsKKyAg
fQorCisgIC8vIEltcGxlbWVudHMgYSBtZW1iZXIgdGhhdCBwcm92aWRlcyBhbiBpbmhlcml0YWJs
ZSwgbGF6aWx5LWNyZWF0ZWQKKyAgLy8gb2JqZWN0IHVzaW5nIHRoZSBtZXRob2QgeW91IHByb3Zp
ZGUuIFdlIHdpbGwgZGVyaXZlZCBjaGlsZHJlbiBmcm9tCisgIC8vIHRoZWlyIHBhcmVudHMgYnkg
Y2FsbGluZyB5b3VyIG9iamVjdCdzIGBjb3B5KClgIG1ldGhvZC4KKyAgZnVuY3Rpb24gaW5oZXJp
dGVkQ3VzdG9tT2JqZWN0KG5hbWUsIE1ldGEpIHsKKyAgICB2YXIga2V5ID0gbWVtYmVyUHJvcGVy
dHkobmFtZSk7CisgICAgdmFyIGNhcGl0YWxpemVkID0gY2FwaXRhbGl6ZShuYW1lKTsKKyAgICBN
ZXRhLnByb3RvdHlwZVsnd3JpdGFibGUnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGNyZWF0
ZSkgeworICAgICAgdmFyIHJldCA9IHRoaXNba2V5XTsKKyAgICAgIGlmICghcmV0KSB7CisgICAg
ICAgIGlmICh0aGlzLnBhcmVudCkgeworICAgICAgICAgIHJldCA9IHRoaXNba2V5XSA9IHRoaXMu
cGFyZW50Wyd3cml0YWJsZScgKyBjYXBpdGFsaXplZF0oY3JlYXRlKS5jb3B5KHRoaXMuc291cmNl
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXQgPSB0aGlzW2tleV0gPSBjcmVhdGUo
dGhpcy5zb3VyY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAg
IH07CisgICAgTWV0YS5wcm90b3R5cGVbJ3JlYWRhYmxlJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9nZXRJbmhlcml0ZWQoa2V5KTsKKyAgICB9Owor
ICB9CisKKyAgZnVuY3Rpb24gbWVtYmVyUHJvcGVydHkobmFtZSkgeworICAgIHJldHVybiAnXycg
KyBuYW1lOworICB9CisKKyAgLy8gdGhlcmUncyBhIG1vcmUgZ2VuZXJhbC1wdXJwb3NlIGNhcGl0
YWxpemUgaW4gZW1iZXItcnVudGltZSwgYnV0IHdlCisgIC8vIGRvbid0IHdhbnQgdG8gbWFrZSBl
bWJlci1tZXRhbCBkZXBlbmQgb24gZW1iZXItcnVudGltZS4KKyAgZnVuY3Rpb24gY2FwaXRhbGl6
ZShuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXlx3LywgZnVuY3Rpb24gKG0pIHsK
KyAgICAgIHJldHVybiBtLnRvVXBwZXJDYXNlKCk7CisgICAgfSk7CisgIH0KKworICB2YXIgTUVU
QV9ERVNDID0geworICAgIHdyaXRhYmxlOiB0cnVlLAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwK
KyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgICB2YWx1ZTogbnVsbAorICB9OworCisgIGV4cG9y
dHMuTUVUQV9ERVNDID0gTUVUQV9ERVNDOworICB2YXIgRU1CRVJfTUVUQV9QUk9QRVJUWSA9IHsK
KyAgICBuYW1lOiBNRVRBX0ZJRUxELAorICAgIGRlc2NyaXB0b3I6IE1FVEFfREVTQworICB9Owor
CisgIC8vIGNob29zZSB0aGUgb25lIGFwcHJvcHJpYXRlIGZvciBnaXZlbiBwbGF0Zm9ybQorICB2
YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChvYmosIG1ldGEpIHsKKyAgICAvLyBpZiBgbnVsbGAgYWxy
ZWFkeSwganVzdCBzZXQgaXQgdG8gdGhlIG5ldyB2YWx1ZQorICAgIC8vIG90aGVyd2lzZSBkZWZp
bmUgcHJvcGVydHkgZmlyc3QKKyAgICBpZiAob2JqW01FVEFfRklFTERdICE9PSBudWxsKSB7Cisg
ICAgICBpZiAob2JqLl9fZGVmaW5lTm9uRW51bWVyYWJsZSkgeworICAgICAgICBvYmouX19kZWZp
bmVOb25FbnVtZXJhYmxlKEVNQkVSX01FVEFfUFJPUEVSVFkpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgTUVUQV9GSUVMRCwgTUVUQV9ERVNDKTsK
KyAgICAgIH0KKyAgICB9CisKKyAgICBvYmpbTUVUQV9GSUVMRF0gPSBtZXRhOworICB9OworCisg
IC8qKgorICAgIFJldHJpZXZlcyB0aGUgbWV0YSBoYXNoIGZvciBhbiBvYmplY3QuIElmIGB3cml0
YWJsZWAgaXMgdHJ1ZSBlbnN1cmVzIHRoZQorICAgIGhhc2ggaXMgd3JpdGFibGUgZm9yIHRoaXMg
b2JqZWN0IGFzIHdlbGwuCisgIAorICAgIFRoZSBtZXRhIG9iamVjdCBjb250YWlucyBpbmZvcm1h
dGlvbiBhYm91dCBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBhcworICAgIHdlbGwgYXMg
YW55IHdhdGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIFlvdSBnZW5lcmFs
bHkgd2lsbAorICAgIG5vdCBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseSBidXQgaW5z
dGVhZCB3b3JrIHdpdGggaGlnaGVyIGxldmVsCisgICAgbWV0aG9kcyB0aGF0IG1hbmlwdWxhdGUg
dGhpcyBoYXNoIGluZGlyZWN0bHkuCisgIAorICAgIEBtZXRob2QgbWV0YQorICAgIEBmb3IgRW1i
ZXIKKyAgICBAcHJpdmF0ZQorICAKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qg
dG8gcmV0cmlldmUgbWV0YSBmb3IKKyAgICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJsZT10cnVl
XSBQYXNzIGBmYWxzZWAgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gbW9kaWZ5CisgICAgICB0aGUg
bWV0YSBoYXNoLCBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGF2b2lkIG1ha2luZyBhbiB1bm5lY2Vz
c2FyeSBjb3B5LgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1ldGEgaGFzaCBmb3IgYW4gb2Jq
ZWN0CisgICovCisKKyAgZnVuY3Rpb24gbWV0YShvYmopIHsKKyAgICB2YXIgbWF5YmVNZXRhID0g
cGVla01ldGEob2JqKTsKKyAgICB2YXIgcGFyZW50ID0gdW5kZWZpbmVkOworCisgICAgLy8gcmVt
b3ZlIHRoaXMgY29kZSwgaW4tZmF2b3Igb2YgZXhwbGljaXQgcGFyZW50CisgICAgaWYgKG1heWJl
TWV0YSkgeworICAgICAgaWYgKG1heWJlTWV0YS5zb3VyY2UgPT09IG9iaikgeworICAgICAgICBy
ZXR1cm4gbWF5YmVNZXRhOworICAgICAgfQorICAgICAgcGFyZW50ID0gbWF5YmVNZXRhOworICAg
IH0KKworICAgIHZhciBuZXdNZXRhID0gbmV3IE1ldGEob2JqLCBwYXJlbnQpOworICAgIHNldE1l
dGEob2JqLCBuZXdNZXRhKTsKKyAgICByZXR1cm4gbmV3TWV0YTsKKyAgfQorCisgIGZ1bmN0aW9u
IHBlZWtNZXRhKG9iaikgeworICAgIHJldHVybiBvYmpbTUVUQV9GSUVMRF07CisgIH0KKworICBm
dW5jdGlvbiBkZWxldGVNZXRhKG9iaikgeworICAgIGlmICh0eXBlb2Ygb2JqW01FVEFfRklFTERd
ICE9PSAnb2JqZWN0JykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvYmpbTUVUQV9GSUVM
RF0gPSBudWxsOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoKKyAgIFdoZW4gd2UgcmVu
ZGVyIGEgcmljaCB0ZW1wbGF0ZSBoaWVyYXJjaHksIHRoZSBzZXQgb2YgZXZlbnRzIHRoYXQKKyAg
ICptaWdodCogaGFwcGVuIHRlbmRzIHRvIGJlIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIHNldCBvZiBl
dmVudHMgdGhhdAorICAgYWN0dWFsbHkgaGFwcGVuLiBUaGlzIGltcGxpZXMgdGhhdCB3ZSBzaG91
bGQgbWFrZSBsaXN0ZW5lciBjcmVhdGlvbiAmCisgICBkZXN0cnVjdGlvbiBjaGVhcCwgZXZlbiBh
dCB0aGUgY29zdCBvZiBtYWtpbmcgZXZlbnQgZGlzcGF0Y2ggbW9yZQorICAgZXhwZW5zaXZlLgor
ICAKKyAgIFRodXMgd2Ugc3RvcmUgYSBuZXcgbGlzdGVuZXIgd2l0aCBhIHNpbmdsZSBwdXNoIGFu
ZCBubyBuZXcKKyAgIGFsbG9jYXRpb25zLCB3aXRob3V0IGV2ZW4gYm90aGVyaW5nIHRvIGRvIGRl
ZHVwbGljYXRpb24gLS0gd2UgY2FuCisgICBzYXZlIHRoYXQgZm9yIGRpc3BhdGNoIHRpbWUsIGlm
IGFuIGV2ZW50IGFjdHVhbGx5IGhhcHBlbnMuCisgICAqLworCisgIC8qIGxpc3RlbmVyIGZsYWdz
ICovCisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgT05DRSA9IDE7CisgIGV4cG9ydHMuT05DRSA9
IE9OQ0U7CisgIHZhciBTVVNQRU5ERUQgPSAyOworCisgIGV4cG9ydHMuU1VTUEVOREVEID0gU1VT
UEVOREVEOworICB2YXIgcHJvdG9NZXRob2RzID0geworCisgICAgYWRkVG9MaXN0ZW5lcnM6IGZ1
bmN0aW9uIChldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBmbGFncykgeworICAgICAgaWYgKCF0
aGlzLl9saXN0ZW5lcnMpIHsKKyAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CisgICAgICB9
CisgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBm
bGFncyk7CisgICAgfSwKKworICAgIF9maW5hbGl6ZUxpc3RlbmVyczogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZCkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9CisgICAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykgeworICAgICAgICB0aGlzLl9saXN0
ZW5lcnMgPSBbXTsKKyAgICAgIH0KKyAgICAgIHZhciBwb2ludGVyID0gdGhpcy5wYXJlbnQ7Cisg
ICAgICB3aGlsZSAocG9pbnRlcikgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gcG9pbnRlci5f
bGlzdGVuZXJzOworICAgICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAgICAgdGhpcy5fbGlz
dGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmNvbmNhdChsaXN0ZW5lcnMpOworICAgICAgICB9Cisg
ICAgICAgIGlmIChwb2ludGVyLl9saXN0ZW5lcnNGaW5hbGl6ZWQpIHsKKyAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9
CisgICAgICB0aGlzLl9saXN0ZW5lcnNGaW5hbGl6ZWQgPSB0cnVlOworICAgIH0sCisKKyAgICBy
ZW1vdmVGcm9tTGlzdGVuZXJzOiBmdW5jdGlvbiAoZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwg
ZGlkUmVtb3ZlKSB7CisgICAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgICB3aGlsZSAocG9p
bnRlcikgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gcG9pbnRlci5fbGlzdGVuZXJzOworICAg
ICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSBsaXN0ZW5l
cnMubGVuZ3RoIC0gNDsgaW5kZXggPj0gMDsgaW5kZXggLT0gNCkgeworICAgICAgICAgICAgaWYg
KGxpc3RlbmVyc1tpbmRleF0gPT09IGV2ZW50TmFtZSAmJiAoIW1ldGhvZCB8fCBsaXN0ZW5lcnNb
aW5kZXggKyAxXSA9PT0gdGFyZ2V0ICYmIGxpc3RlbmVyc1tpbmRleCArIDJdID09PSBtZXRob2Qp
KSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVyID09PSB0aGlzKSB7CisgICAgICAgICAgICAg
ICAgLy8gd2UgYXJlIG1vZGlmeWluZyBvdXIgb3duIGxpc3QsIHNvIHdlIGVkaXQgZGlyZWN0bHkK
KyAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRpZFJlbW92ZSA9PT0gJ2Z1bmN0aW9uJykgewor
ICAgICAgICAgICAgICAgICAgZGlkUmVtb3ZlKGV2ZW50TmFtZSwgdGFyZ2V0LCBsaXN0ZW5lcnNb
aW5kZXggKyAyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RlbmVy
cy5zcGxpY2UoaW5kZXgsIDQpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gcmVtb3ZlIGFuIGluaGVyaXRlZCBsaXN0ZW5lciwgc28g
d2UgZG8KKyAgICAgICAgICAgICAgICAvLyBqdXN0LWluLXRpbWUgY29weWluZyB0byBkZXRhY2gg
b3VyIG93biBsaXN0ZW5lcnMgZnJvbQorICAgICAgICAgICAgICAgIC8vIG91ciBpbmhlcml0YW5j
ZSBjaGFpbi4KKyAgICAgICAgICAgICAgICB0aGlzLl9maW5hbGl6ZUxpc3RlbmVycygpOworICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUZyb21MaXN0ZW5lcnMoZXZlbnROYW1lLCB0
YXJnZXQsIG1ldGhvZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvaW50ZXIuX2xpc3RlbmVyc0ZpbmFsaXplZCkg
eworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgPSBwb2ludGVy
LnBhcmVudDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgbWF0Y2hpbmdMaXN0ZW5lcnM6IGZ1bmN0
aW9uIChldmVudE5hbWUpIHsKKyAgICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAgICAgIHZhciBy
ZXN1bHQgPSBbXTsKKyAgICAgIHdoaWxlIChwb2ludGVyKSB7CisgICAgICAgIHZhciBsaXN0ZW5l
cnMgPSBwb2ludGVyLl9saXN0ZW5lcnM7CisgICAgICAgIGlmIChsaXN0ZW5lcnMpIHsKKyAgICAg
ICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGlzdGVuZXJzLmxlbmd0aCAtIDM7IGlu
ZGV4ICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaW5kZXhdID09PSBldmVudE5h
bWUpIHsKKyAgICAgICAgICAgICAgcHVzaFVuaXF1ZUxpc3RlbmVyKHJlc3VsdCwgbGlzdGVuZXJz
LCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGlmIChwb2ludGVyLl9saXN0ZW5lcnNGaW5hbGl6ZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9CisgICAg
ICB2YXIgc3VzID0gdGhpcy5fc3VzcGVuZGVkTGlzdGVuZXJzOworICAgICAgaWYgKHN1cykgewor
ICAgICAgICBmb3IgKHZhciBzdXNJbmRleCA9IDA7IHN1c0luZGV4IDwgc3VzLmxlbmd0aCAtIDI7
IHN1c0luZGV4ICs9IDMpIHsKKyAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBzdXNbc3VzSW5k
ZXhdKSB7CisgICAgICAgICAgICBmb3IgKHZhciByZXN1bHRJbmRleCA9IDA7IHJlc3VsdEluZGV4
IDwgcmVzdWx0Lmxlbmd0aCAtIDI7IHJlc3VsdEluZGV4ICs9IDMpIHsKKyAgICAgICAgICAgICAg
aWYgKHJlc3VsdFtyZXN1bHRJbmRleF0gPT09IHN1c1tzdXNJbmRleCArIDFdICYmIHJlc3VsdFty
ZXN1bHRJbmRleCArIDFdID09PSBzdXNbc3VzSW5kZXggKyAyXSkgeworICAgICAgICAgICAgICAg
IHJlc3VsdFtyZXN1bHRJbmRleCArIDJdIHw9IFNVU1BFTkRFRDsKKyAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgc3VzcGVuZExpc3RlbmVyczogZnVuY3Rpb24gKGV2
ZW50TmFtZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgeworICAgICAgdmFyIHN1cyA9IHRo
aXMuX3N1c3BlbmRlZExpc3RlbmVyczsKKyAgICAgIGlmICghc3VzKSB7CisgICAgICAgIHN1cyA9
IHRoaXMuX3N1c3BlbmRlZExpc3RlbmVycyA9IFtdOworICAgICAgfQorICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHN1cy5wdXNoKGV2
ZW50TmFtZXNbaV0sIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAg
ICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRhcmdldCk7CisgICAgICB9IGZpbmFsbHkgeworICAg
ICAgICBpZiAoc3VzLmxlbmd0aCA9PT0gZXZlbnROYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICB0
aGlzLl9zdXNwZW5kZWRMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgZm9yICh2YXIgaSA9IHN1cy5sZW5ndGggLSAzOyBpID49IDA7IGkgLT0gMykgewor
ICAgICAgICAgICAgaWYgKHN1c1tpICsgMV0gPT09IHRhcmdldCAmJiBzdXNbaSArIDJdID09PSBt
ZXRob2QgJiYgZXZlbnROYW1lcy5pbmRleE9mKHN1c1tpXSkgIT09IC0xKSB7CisgICAgICAgICAg
ICAgIHN1cy5zcGxpY2UoaSwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICB9CisgICAgfSwKKworICAgIHdhdGNoZWRFdmVudHM6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAgICAgIHZhciBuYW1lcyA9IHt9OworICAgICAg
d2hpbGUgKHBvaW50ZXIpIHsKKyAgICAgICAgdmFyIGxpc3RlbmVycyA9IHBvaW50ZXIuX2xpc3Rl
bmVyczsKKyAgICAgICAgaWYgKGxpc3RlbmVycykgeworICAgICAgICAgIGZvciAodmFyIGluZGV4
ID0gMDsgaW5kZXggPCBsaXN0ZW5lcnMubGVuZ3RoIC0gMzsgaW5kZXggKz0gNCkgeworICAgICAg
ICAgICAgbmFtZXNbbGlzdGVuZXJzW2luZGV4XV0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBpZiAocG9pbnRlci5fbGlzdGVuZXJzRmluYWxpemVkKSB7CisgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIucGFyZW50Owor
ICAgICAgfQorICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG5hbWVzKTsKKyAgICB9LAorCisgICAg
X2luaXRpYWxpemVMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX2xpc3RlbmVy
cyA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZCA9IHVuZGVmaW5l
ZDsKKyAgICAgIHRoaXMuX3N1c3BlbmRlZExpc3RlbmVycyA9IHVuZGVmaW5lZDsKKyAgICB9Cisg
IH07CisKKyAgZXhwb3J0cy5wcm90b01ldGhvZHMgPSBwcm90b01ldGhvZHM7CisgIGZ1bmN0aW9u
IHB1c2hVbmlxdWVMaXN0ZW5lcihkZXN0aW5hdGlvbiwgc291cmNlLCBpbmRleCkgeworICAgIHZh
ciB0YXJnZXQgPSBzb3VyY2VbaW5kZXggKyAxXTsKKyAgICB2YXIgbWV0aG9kID0gc291cmNlW2lu
ZGV4ICsgMl07CisgICAgZm9yICh2YXIgZGVzdGluYXRpb25JbmRleCA9IDA7IGRlc3RpbmF0aW9u
SW5kZXggPCBkZXN0aW5hdGlvbi5sZW5ndGggLSAyOyBkZXN0aW5hdGlvbkluZGV4ICs9IDMpIHsK
KyAgICAgIGlmIChkZXN0aW5hdGlvbltkZXN0aW5hdGlvbkluZGV4XSA9PT0gdGFyZ2V0ICYmIGRl
c3RpbmF0aW9uW2Rlc3RpbmF0aW9uSW5kZXggKyAxXSA9PT0gbWV0aG9kKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdGluYXRpb24ucHVzaCh0YXJnZXQsIG1ldGhv
ZCwgc291cmNlW2luZGV4ICsgM10pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbWl4
aW4nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9lcnJvcics
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwv
ZW1wdHlfb2JqZWN0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdl
bWJlci1tZXRhbC9leHBhbmRfcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywg
J2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2JpbmRpbmcnLCAnZW1iZXItbWV0
YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxF
cnJvciwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsRW1w
dHlfb2JqZWN0LCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9z
ZXQsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFeHBhbmRf
cHJvcGVydGllcywgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLCBfZW1iZXJNZXRhbENvbXB1dGVkLCBf
ZW1iZXJNZXRhbEJpbmRpbmcsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1ldGFsRXZlbnRz
LCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJl
bW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNwaWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisg
IC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKyAg
ZXhwb3J0cy5taXhpbiA9IG1peGluOworICBleHBvcnRzLmRlZmF1bHQgPSBNaXhpbjsKKyAgZXhw
b3J0cy5yZXF1aXJlZCA9IHJlcXVpcmVkOworICBleHBvcnRzLmFsaWFzTWV0aG9kID0gYWxpYXNN
ZXRob2Q7CisgIGV4cG9ydHMub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKKyAgZXhwb3J0cy5faW1tZWRp
YXRlT2JzZXJ2ZXIgPSBfaW1tZWRpYXRlT2JzZXJ2ZXI7CisgIGV4cG9ydHMuX2JlZm9yZU9ic2Vy
dmVyID0gX2JlZm9yZU9ic2VydmVyOworCisgIGZ1bmN0aW9uIFJPT1QoKSB7fQorICBST09ULl9f
aGFzU3VwZXIgPSBmYWxzZTsKKworICB2YXIgUkVRVUlSRUQ7CisgIHZhciBhX3NsaWNlID0gW10u
c2xpY2U7CisKKyAgZnVuY3Rpb24gaXNNZXRob2Qob2JqKSB7CisgICAgcmV0dXJuICdmdW5jdGlv
bicgPT09IHR5cGVvZiBvYmogJiYgb2JqLmlzTWV0aG9kICE9PSBmYWxzZSAmJiBvYmogIT09IEJv
b2xlYW4gJiYgb2JqICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBBcnJh
eSAmJiBvYmogIT09IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7CisgIH0KKworICB2YXIgQ09OVElO
VUUgPSB7fTsKKworICBmdW5jdGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwgbWl4aW4p
IHsKKyAgICB2YXIgZ3VpZDsKKworICAgIGlmIChtaXhpbiBpbnN0YW5jZW9mIE1peGluKSB7Cisg
ICAgICBndWlkID0gX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yKG1peGluKTsKKyAgICAgIGlmICht
aXhpbnNNZXRhLnBlZWtNaXhpbnMoZ3VpZCkpIHsKKyAgICAgICAgcmV0dXJuIENPTlRJTlVFOwor
ICAgICAgfQorICAgICAgbWl4aW5zTWV0YS53cml0ZU1peGlucyhndWlkLCBtaXhpbik7CisgICAg
ICByZXR1cm4gbWl4aW4ucHJvcGVydGllczsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1p
eGluOyAvLyBhcHBseSBhbm9ueW1vdXMgbWl4aW4gcHJvcGVydGllcworICAgIH0KKyAgfQorCisg
IGZ1bmN0aW9uIGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcyhjb25jYXRQcm9wLCBwcm9wcywg
dmFsdWVzLCBiYXNlKSB7CisgICAgdmFyIGNvbmNhdHM7CisKKyAgICAvLyByZXNldCBiZWZvcmUg
YWRkaW5nIGVhY2ggbmV3IG1peGluIHRvIHBpY2t1cCBjb25jYXRzIGZyb20gcHJldmlvdXMKKyAg
ICBjb25jYXRzID0gdmFsdWVzW2NvbmNhdFByb3BdIHx8IGJhc2VbY29uY2F0UHJvcF07CisgICAg
aWYgKHByb3BzW2NvbmNhdFByb3BdKSB7CisgICAgICBjb25jYXRzID0gY29uY2F0cyA/IGNvbmNh
dHMuY29uY2F0KHByb3BzW2NvbmNhdFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3BdOworICAgIH0K
KworICAgIHJldHVybiBjb25jYXRzOworICB9CisKKyAgZnVuY3Rpb24gZ2l2ZURlc2NyaXB0b3JT
dXBlcihtZXRhLCBrZXksIHByb3BlcnR5LCB2YWx1ZXMsIGRlc2NzLCBiYXNlKSB7CisgICAgdmFy
IHN1cGVyUHJvcGVydHk7CisKKyAgICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJyaWRlIG1l
dGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCisgICAgaWYgKHZhbHVlc1trZXld
ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3Ig
aW4gYSBwYXJlbnQgbWl4aW4KKyAgICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOworICAg
IH0KKworICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIGlu
IGEgcGFyZW50IG1peGluLCBmaW5kCisgICAgLy8gaXQgb24gdGhlIG9yaWdpbmFsIG9iamVjdC4K
KyAgICBpZiAoIXN1cGVyUHJvcGVydHkpIHsKKyAgICAgIHZhciBwb3NzaWJsZURlc2MgPSBiYXNl
W2tleV07CisgICAgICB2YXIgc3VwZXJEZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5
cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0
b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIHN1cGVyUHJvcGVydHkgPSBz
dXBlckRlc2M7CisgICAgfQorCisgICAgaWYgKHN1cGVyUHJvcGVydHkgPT09IHVuZGVmaW5lZCB8
fCAhKHN1cGVyUHJvcGVydHkgaW5zdGFuY2VvZiBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVk
UHJvcGVydHkpKSB7CisgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgLy8gU2lu
Y2UgbXVsdGlwbGUgbWl4aW5zIG1heSBpbmhlcml0IGZyb20gdGhlIHNhbWUgcGFyZW50LCB3ZSBu
ZWVkCisgICAgLy8gdG8gY2xvbmUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHNvIHRoYXQgb3RoZXIg
bWl4aW5zIGRvIG5vdCByZWNlaXZlCisgICAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KKyAgICBw
cm9wZXJ0eSA9IE9iamVjdC5jcmVhdGUocHJvcGVydHkpOworICAgIHByb3BlcnR5Ll9nZXR0ZXIg
PSBfZW1iZXJNZXRhbFV0aWxzLndyYXAocHJvcGVydHkuX2dldHRlciwgc3VwZXJQcm9wZXJ0eS5f
Z2V0dGVyKTsKKyAgICBpZiAoc3VwZXJQcm9wZXJ0eS5fc2V0dGVyKSB7CisgICAgICBpZiAocHJv
cGVydHkuX3NldHRlcikgeworICAgICAgICBwcm9wZXJ0eS5fc2V0dGVyID0gX2VtYmVyTWV0YWxV
dGlscy53cmFwKHByb3BlcnR5Ll9zZXR0ZXIsIHN1cGVyUHJvcGVydHkuX3NldHRlcik7CisgICAg
ICB9IGVsc2UgeworICAgICAgICBwcm9wZXJ0eS5fc2V0dGVyID0gc3VwZXJQcm9wZXJ0eS5fc2V0
dGVyOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgfQorCisgIGZ1
bmN0aW9uIGdpdmVNZXRob2RTdXBlcihvYmosIGtleSwgbWV0aG9kLCB2YWx1ZXMsIGRlc2NzKSB7
CisgICAgdmFyIHN1cGVyTWV0aG9kOworCisgICAgLy8gTWV0aG9kcyBvdmVyd3JpdGUgY29tcHV0
ZWQgcHJvcGVydGllcywgYW5kIGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCisgICAgaWYgKGRl
c2NzW2tleV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgbWV0
aG9kIGluIGEgcGFyZW50IG1peGluCisgICAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXldOwor
ICAgIH0KKworICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbiBh
IHBhcmVudCBtaXhpbiwgZmluZCBpdCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QKKyAg
ICBzdXBlck1ldGhvZCA9IHN1cGVyTWV0aG9kIHx8IG9ialtrZXldOworCisgICAgLy8gT25seSB3
cmFwIHRoZSBuZXcgbWV0aG9kIGlmIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2FzIGEgZnVuY3Rpb24K
KyAgICBpZiAoc3VwZXJNZXRob2QgPT09IHVuZGVmaW5lZCB8fCAnZnVuY3Rpb24nICE9PSB0eXBl
b2Ygc3VwZXJNZXRob2QpIHsKKyAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcmV0
dXJuIF9lbWJlck1ldGFsVXRpbHMud3JhcChtZXRob2QsIHN1cGVyTWV0aG9kKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGFwcGx5Q29uY2F0ZW5hdGVkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZh
bHVlcykgeworICAgIHZhciBiYXNlVmFsdWUgPSB2YWx1ZXNba2V5XSB8fCBvYmpba2V5XTsKKwor
ICAgIGlmIChiYXNlVmFsdWUpIHsKKyAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYmFz
ZVZhbHVlLmNvbmNhdCkgeworICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09
IHVuZGVmaW5lZCkgeworICAgICAgICAgIHJldHVybiBiYXNlVmFsdWU7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgcmV0dXJuIGJhc2VWYWx1ZS5jb25jYXQodmFsdWUpOworICAgICAgICB9
CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxVdGlscy5tYWtlQXJy
YXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICByZXR1cm4gX2VtYmVyTWV0YWxVdGlscy5tYWtlQXJyYXkodmFsdWUpOworICAgIH0KKyAgfQor
CisgIGZ1bmN0aW9uIGFwcGx5TWVyZ2VkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZhbHVl
cykgeworICAgIHZhciBiYXNlVmFsdWUgPSB2YWx1ZXNba2V5XSB8fCBvYmpba2V5XTsKKworICAg
IF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoQXJy
YXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgLy8gdXNlIGNvbmRpdGlvbmFsIHRvIGF2b2lk
IHN0cmluZ2lmeWluZyBldmVyeSB0aW1lCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0
KCdZb3UgcGFzc2VkIGluIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AgYXMgdGhlIHZh
bHVlIGZvciBgJyArIGtleSArICdgIGJ1dCBgJyArIGtleSArICdgIGNhbm5vdCBiZSBhbiBBcnJh
eScsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGlmICghYmFzZVZhbHVlKSB7Cisg
ICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgdmFyIG5ld0Jhc2UgPSBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBiYXNlVmFsdWUpOworICAgIHZhciBoYXNGdW5jdGlvbiA9IGZh
bHNlOworCisgICAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZS5o
YXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAg
ICAgdmFyIHByb3BWYWx1ZSA9IHZhbHVlW3Byb3BdOworICAgICAgaWYgKGlzTWV0aG9kKHByb3BW
YWx1ZSkpIHsKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmb3IgQ29tcHV0ZWQgUHJvcGVydGll
cywgZXRjPworICAgICAgICBoYXNGdW5jdGlvbiA9IHRydWU7CisgICAgICAgIG5ld0Jhc2VbcHJv
cF0gPSBnaXZlTWV0aG9kU3VwZXIob2JqLCBwcm9wLCBwcm9wVmFsdWUsIGJhc2VWYWx1ZSwge30p
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3QmFzZVtwcm9wXSA9IHByb3BWYWx1ZTsKKyAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzRnVuY3Rpb24pIHsKKyAgICAgIG5ld0Jhc2UuX3N1
cGVyID0gUk9PVDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3QmFzZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHZhbHVlLCBtZXRhLCBkZXNjcywg
dmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncykgeworICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9l
bWJlck1ldGFsUHJvcGVydGllcy5EZXNjcmlwdG9yKSB7CisgICAgICBpZiAodmFsdWUgPT09IFJF
UVVJUkVEICYmIGRlc2NzW2tleV0pIHsKKyAgICAgICAgcmV0dXJuIENPTlRJTlVFOworICAgICAg
fQorCisgICAgICAvLyBXcmFwIGRlc2NyaXB0b3IgZnVuY3Rpb24gdG8gaW1wbGVtZW50CisgICAg
ICAvLyBfc3VwZXIoKSBpZiBuZWVkZWQKKyAgICAgIGlmICh2YWx1ZS5fZ2V0dGVyKSB7CisgICAg
ICAgIHZhbHVlID0gZ2l2ZURlc2NyaXB0b3JTdXBlcihtZXRhLCBrZXksIHZhbHVlLCB2YWx1ZXMs
IGRlc2NzLCBiYXNlKTsKKyAgICAgIH0KKworICAgICAgZGVzY3Nba2V5XSA9IHZhbHVlOworICAg
ICAgdmFsdWVzW2tleV0gPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjb25j
YXRzICYmIGNvbmNhdHMuaW5kZXhPZihrZXkpID49IDAgfHwga2V5ID09PSAnY29uY2F0ZW5hdGVk
UHJvcGVydGllcycgfHwga2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycpIHsKKyAgICAgICAgdmFs
dWUgPSBhcHBseUNvbmNhdGVuYXRlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2YWx1ZSwgdmFsdWVz
KTsKKyAgICAgIH0gZWxzZSBpZiAobWVyZ2luZ3MgJiYgbWVyZ2luZ3MuaW5kZXhPZihrZXkpID49
IDApIHsKKyAgICAgICAgdmFsdWUgPSBhcHBseU1lcmdlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2
YWx1ZSwgdmFsdWVzKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNNZXRob2QodmFsdWUpKSB7CisgICAg
ICAgIHZhbHVlID0gZ2l2ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVz
Y3MpOworICAgICAgfQorCisgICAgICBkZXNjc1trZXldID0gdW5kZWZpbmVkOworICAgICAgdmFs
dWVzW2tleV0gPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBtZXJnZU1peGlucyht
aXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UsIGtleXMpIHsKKyAgICB2YXIgY3VycmVudE1p
eGluLCBwcm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywgbWV0YTsKKworICAgIGZ1bmN0aW9u
IHJlbW92ZUtleXMoa2V5TmFtZSkgeworICAgICAgZGVsZXRlIGRlc2NzW2tleU5hbWVdOworICAg
ICAgZGVsZXRlIHZhbHVlc1trZXlOYW1lXTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwg
bCA9IG1peGlucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGN1cnJlbnRNaXhpbiA9IG1p
eGluc1tpXTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdFeHBlY3RlZCBoYXNoIG9y
IE1peGluIGluc3RhbmNlLCBnb3QgJyArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChj
dXJyZW50TWl4aW4pLCB0eXBlb2YgY3VycmVudE1peGluID09PSAnb2JqZWN0JyAmJiBjdXJyZW50
TWl4aW4gIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGN1cnJlbnRN
aXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOworCisgICAgICBwcm9wcyA9IG1peGluUHJvcGVy
dGllcyhtLCBjdXJyZW50TWl4aW4pOworICAgICAgaWYgKHByb3BzID09PSBDT05USU5VRSkgewor
ICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb3BzKSB7CisgICAgICAg
IG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEubWV0YShiYXNlKTsKKyAgICAgICAgaWYgKGJhc2Uud2ls
bE1lcmdlTWl4aW4pIHsKKyAgICAgICAgICBiYXNlLndpbGxNZXJnZU1peGluKHByb3BzKTsKKyAg
ICAgICAgfQorICAgICAgICBjb25jYXRzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdj
b25jYXRlbmF0ZWRQcm9wZXJ0aWVzJywgcHJvcHMsIHZhbHVlcywgYmFzZSk7CisgICAgICAgIG1l
cmdpbmdzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdtZXJnZWRQcm9wZXJ0aWVzJywg
cHJvcHMsIHZhbHVlcywgYmFzZSk7CisKKyAgICAgICAgZm9yIChrZXkgaW4gcHJvcHMpIHsKKyAg
ICAgICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICAgICAg
ICBhZGROb3JtYWxpemVkUHJvcGVydHkoYmFzZSwga2V5LCBwcm9wc1trZXldLCBtZXRhLCBkZXNj
cywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBt
YW51YWxseSBjb3B5IHRvU3RyaW5nKCkgYmVjYXVzZSBzb21lIEpTIGVuZ2luZXMgZG8gbm90IGVu
dW1lcmF0ZSBpdAorICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykp
IHsKKyAgICAgICAgICBiYXNlLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7CisgICAgICAgIH0K
KyAgICAgIH0gZWxzZSBpZiAoY3VycmVudE1peGluLm1peGlucykgeworICAgICAgICBtZXJnZU1p
eGlucyhjdXJyZW50TWl4aW4ubWl4aW5zLCBtLCBkZXNjcywgdmFsdWVzLCBiYXNlLCBrZXlzKTsK
KyAgICAgICAgaWYgKGN1cnJlbnRNaXhpbi5fd2l0aG91dCkgeworICAgICAgICAgIGN1cnJlbnRN
aXhpbi5fd2l0aG91dC5mb3JFYWNoKHJlbW92ZUtleXMpOworICAgICAgICB9CisgICAgICB9Cisg
ICAgfQorICB9CisKKyAgdmFyIElTX0JJTkRJTkcgPSAvXi4rQmluZGluZyQvOworCisgIGZ1bmN0
aW9uIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBtKSB7CisgICAgaWYgKElTX0JJTkRJ
TkcudGVzdChrZXkpKSB7CisgICAgICBtLndyaXRlQmluZGluZ3Moa2V5LCB2YWx1ZSk7CisgICAg
fQorICB9CisKKyAgZnVuY3Rpb24gY29ubmVjdFN0cmVhbUJpbmRpbmcob2JqLCBrZXksIHN0cmVh
bSkgeworICAgIHZhciBvbk5vdGlmeSA9IGZ1bmN0aW9uIChzdHJlYW0pIHsKKyAgICAgIF9lbWJl
ck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNlcnZlcihvYmosIGtleSwgbnVsbCwgZGlkQ2hhbmdl
LCBmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnRyeVNldChv
YmosIGtleSwgc3RyZWFtLnZhbHVlKCkpOworICAgICAgfSk7CisgICAgfTsKKworICAgIHZhciBk
aWRDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICBzdHJlYW0uc2V0VmFsdWUoX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iaiwga2V5KSwgb25Ob3RpZnkpOworICAgIH07CisKKyAgICAv
LyBJbml0aWFsaXplIHZhbHVlCisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KG9iaiwg
a2V5LCBzdHJlYW0udmFsdWUoKSk7CisKKyAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2Vy
dmVyKG9iaiwga2V5LCBudWxsLCBkaWRDaGFuZ2UpOworCisgICAgc3RyZWFtLnN1YnNjcmliZShv
bk5vdGlmeSk7CisKKyAgICBpZiAob2JqLl9zdHJlYW1CaW5kaW5nU3Vic2NyaXB0aW9ucyA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICBvYmouX3N0cmVhbUJpbmRpbmdTdWJzY3JpcHRpb25zID0gbmV3
IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICB9CisKKyAgICBvYmouX3N0
cmVhbUJpbmRpbmdTdWJzY3JpcHRpb25zW2tleV0gPSBvbk5vdGlmeTsKKyAgfQorCisgIGZ1bmN0
aW9uIGNvbm5lY3RCaW5kaW5ncyhvYmosIG0pIHsKKyAgICAvLyBUT0RPIE1peGluLmFwcGx5KGlu
c3RhbmNlKSBzaG91bGQgZGlzY29ubmVjdCBiaW5kaW5nIGlmIGV4aXN0cworICAgIG0uZm9yRWFj
aEJpbmRpbmdzKGZ1bmN0aW9uIChrZXksIGJpbmRpbmcpIHsKKyAgICAgIGlmIChiaW5kaW5nKSB7
CisgICAgICAgIHZhciB0byA9IGtleS5zbGljZSgwLCAtNyk7IC8vIHN0cmlwIEJpbmRpbmcgb2Zm
IGVuZAorICAgICAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0oYmluZGlu
ZykpIHsKKyAgICAgICAgICBjb25uZWN0U3RyZWFtQmluZGluZyhvYmosIHRvLCBiaW5kaW5nKTsK
KyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9m
IF9lbWJlck1ldGFsQmluZGluZy5CaW5kaW5nKSB7CisgICAgICAgICAgYmluZGluZyA9IGJpbmRp
bmcuY29weSgpOyAvLyBjb3B5IHByb3RvdHlwZXMnIGluc3RhbmNlCisgICAgICAgICAgYmluZGlu
Zy50byh0byk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gYmluZGluZyBpcyBzdHJp
bmcgcGF0aAorICAgICAgICAgIGJpbmRpbmcgPSBuZXcgX2VtYmVyTWV0YWxCaW5kaW5nLkJpbmRp
bmcodG8sIGJpbmRpbmcpOworICAgICAgICB9CisgICAgICAgIGJpbmRpbmcuY29ubmVjdChvYmop
OworICAgICAgICBvYmpba2V5XSA9IGJpbmRpbmc7CisgICAgICB9CisgICAgfSk7CisgICAgLy8g
bWFyayBhcyBhcHBsaWVkCisgICAgbS5jbGVhckJpbmRpbmdzKCk7CisgIH0KKworICBmdW5jdGlv
biBmaW5pc2hQYXJ0aWFsKG9iaiwgbSkgeworICAgIGNvbm5lY3RCaW5kaW5ncyhvYmosIG0gfHwg
X2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKSk7CisgICAgcmV0dXJuIG9iajsKKyAgfQorCisgIGZ1
bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcykgeworICAgIHZh
ciBhbHRLZXkgPSBkZXNjLm1ldGhvZE5hbWU7CisgICAgdmFyIHZhbHVlOworICAgIHZhciBwb3Nz
aWJsZURlc2M7CisgICAgaWYgKGRlc2NzW2FsdEtleV0gfHwgdmFsdWVzW2FsdEtleV0pIHsKKyAg
ICAgIHZhbHVlID0gdmFsdWVzW2FsdEtleV07CisgICAgICBkZXNjID0gZGVzY3NbYWx0S2V5XTsK
KyAgICB9IGVsc2UgaWYgKChwb3NzaWJsZURlc2MgPSBvYmpbYWx0S2V5XSkgJiYgcG9zc2libGVE
ZXNjICE9PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3Np
YmxlRGVzYy5pc0Rlc2NyaXB0b3IpIHsKKyAgICAgIGRlc2MgPSBwb3NzaWJsZURlc2M7CisgICAg
ICB2YWx1ZSA9IHVuZGVmaW5lZDsKKyAgICB9IGVsc2UgeworICAgICAgZGVzYyA9IHVuZGVmaW5l
ZDsKKyAgICAgIHZhbHVlID0gb2JqW2FsdEtleV07CisgICAgfQorCisgICAgcmV0dXJuIHsgZGVz
YzogZGVzYywgdmFsdWU6IHZhbHVlIH07CisgIH0KKworICBmdW5jdGlvbiB1cGRhdGVPYnNlcnZl
cnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lciwgcGF0aHNLZXksIHVw
ZGF0ZU1ldGhvZCkgeworICAgIHZhciBwYXRocyA9IG9ic2VydmVyT3JMaXN0ZW5lcltwYXRoc0tl
eV07CisKKyAgICBpZiAocGF0aHMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aHMu
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHVwZGF0ZU1ldGhvZChvYmosIHBhdGhzW2ld
LCBudWxsLCBrZXkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlcGxhY2VP
YnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lcikgeworICAg
IHZhciBwcmV2ID0gb2JqW2tleV07CisKKyAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHBy
ZXYpIHsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgcHJldiwg
J19fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXycsIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3JlbW92ZUJl
Zm9yZU9ic2VydmVyKTsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtl
eSwgcHJldiwgJ19fZW1iZXJfb2JzZXJ2ZXNfXycsIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3Zl
T2JzZXJ2ZXIpOworICAgICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBw
cmV2LCAnX19lbWJlcl9saXN0ZW5zX18nLCBfZW1iZXJNZXRhbEV2ZW50cy5yZW1vdmVMaXN0ZW5l
cik7CisgICAgfQorCisgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYnNlcnZlck9yTGlz
dGVuZXIpIHsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgb2Jz
ZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fJywgX2VtYmVyTWV0YWxP
YnNlcnZlci5fYWRkQmVmb3JlT2JzZXJ2ZXIpOworICAgICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlz
dGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVyX29ic2VydmVzX18n
LCBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKTsKKyAgICAgIHVwZGF0ZU9ic2VydmVy
c0FuZExpc3RlbmVycyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9saXN0
ZW5zX18nLCBfZW1iZXJNZXRhbEV2ZW50cy5hZGRMaXN0ZW5lcik7CisgICAgfQorICB9CisKKyAg
ZnVuY3Rpb24gYXBwbHlNaXhpbihvYmosIG1peGlucywgcGFydGlhbCkgeworICAgIHZhciBkZXNj
cyA9IHt9OworICAgIHZhciB2YWx1ZXMgPSB7fTsKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0
YS5tZXRhKG9iaik7CisgICAgdmFyIGtleXMgPSBbXTsKKyAgICB2YXIga2V5LCB2YWx1ZSwgZGVz
YzsKKworICAgIG9iai5fc3VwZXIgPSBST09UOworCisgICAgLy8gR28gdGhyb3VnaCBhbGwgbWl4
aW5zIGFuZCBoYXNoZXMgcGFzc2VkIGluLCBhbmQ6CisgICAgLy8KKyAgICAvLyAqIEhhbmRsZSBj
b25jYXRlbmF0ZWQgcHJvcGVydGllcworICAgIC8vICogSGFuZGxlIG1lcmdlZCBwcm9wZXJ0aWVz
CisgICAgLy8gKiBTZXQgdXAgX3N1cGVyIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeQorICAgIC8vICog
U2V0IHVwIGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCisgICAgLy8gKiBDb3B5aW5nIGB0
b1N0cmluZ2AgaW4gYnJva2VuIGJyb3dzZXJzCisgICAgbWVyZ2VNaXhpbnMobWl4aW5zLCBtLCBk
ZXNjcywgdmFsdWVzLCBvYmosIGtleXMpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlz
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAga2V5ID0ga2V5c1tpXTsKKyAgICAgIGlmIChr
ZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwgIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Cisg
ICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBkZXNjID0gZGVzY3Nba2V5XTsKKyAg
ICAgIHZhbHVlID0gdmFsdWVzW2tleV07CisKKyAgICAgIGlmIChkZXNjID09PSBSRVFVSVJFRCkg
eworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGRlc2MgJiYgZGVz
YyBpbnN0YW5jZW9mIEFsaWFzKSB7CisgICAgICAgIHZhciBmb2xsb3dlZCA9IGZvbGxvd0FsaWFz
KG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcyk7CisgICAgICAgIGRlc2MgPSBmb2xsb3dlZC5k
ZXNjOworICAgICAgICB2YWx1ZSA9IGZvbGxvd2VkLnZhbHVlOworICAgICAgfQorCisgICAgICBp
ZiAoZGVzYyA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAg
Y29udGludWU7CisgICAgICB9CisKKyAgICAgIHJlcGxhY2VPYnNlcnZlcnNBbmRMaXN0ZW5lcnMo
b2JqLCBrZXksIHZhbHVlKTsKKyAgICAgIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBt
KTsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwg
ZGVzYywgdmFsdWUsIG0pOworICAgIH0KKworICAgIGlmICghcGFydGlhbCkgeworICAgICAgLy8g
ZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBlCisgICAgICBmaW5pc2hQYXJ0aWFsKG9iaiwgbSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG9iajsKKyAgfQorCisgIC8qKgorICAgIEBtZXRob2QgbWl4aW4K
KyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSBtaXhpbnMqCisgICAg
QHJldHVybiBvYmoKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIG1peGluKG9iaikg
eworICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xl
biA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykgewor
ICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgfQorCisgICAgYXBw
bHlNaXhpbihvYmosIGFyZ3MsIGZhbHNlKTsKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgLyoq
CisgICAgVGhlIGBFbWJlci5NaXhpbmAgY2xhc3MgYWxsb3dzIHlvdSB0byBjcmVhdGUgbWl4aW5z
LCB3aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZQorICAgIGFkZGVkIHRvIG90aGVyIGNsYXNzZXMuIEZv
ciBpbnN0YW5jZSwKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5FZGl0YWJsZSA9IEVt
YmVyLk1peGluLmNyZWF0ZSh7CisgICAgICBlZGl0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgY29u
c29sZS5sb2coJ3N0YXJ0aW5nIHRvIGVkaXQnKTsKKyAgICAgICAgdGhpcy5zZXQoJ2lzRWRpdGlu
ZycsIHRydWUpOworICAgICAgfSwKKyAgICAgIGlzRWRpdGluZzogZmFsc2UKKyAgICB9KTsKKyAg
CisgICAgLy8gTWl4IG1peGlucyBpbnRvIGNsYXNzZXMgYnkgcGFzc2luZyB0aGVtIGFzIHRoZSBm
aXJzdCBhcmd1bWVudHMgdG8KKyAgICAvLyAuZXh0ZW5kLgorICAgIEFwcC5Db21tZW50VmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEFwcC5FZGl0YWJsZSwgeworICAgICAgdGVtcGxhdGU6IEVtYmVy
LkhhbmRsZWJhcnMuY29tcGlsZSgne3sjaWYgdmlldy5pc0VkaXRpbmd9fS4uLnt7ZWxzZX19Li4u
e3svaWZ9fScpCisgICAgfSk7CisgIAorICAgIGNvbW1lbnRWaWV3ID0gQXBwLkNvbW1lbnRWaWV3
LmNyZWF0ZSgpOworICAgIGNvbW1lbnRWaWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRpbmcg
dG8gZWRpdCcKKyAgICBgYGAKKyAgCisgICAgTm90ZSB0aGF0IE1peGlucyBhcmUgY3JlYXRlZCB3
aXRoIGBFbWJlci5NaXhpbi5jcmVhdGVgLCBub3QKKyAgICBgRW1iZXIuTWl4aW4uZXh0ZW5kYC4K
KyAgCisgICAgTm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlw
ZSBzbyBhcnJheXMgYW5kIG9iamVjdCBsaXRlcmFscworICAgIGRlZmluZWQgYXMgcHJvcGVydGll
cyB3aWxsIGJlIHNoYXJlZCBhbW9uZ3N0IG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIG1peGlu
LgorICAgIElmIHlvdSB3YW50IHRvIGRlZmluZSBhIHByb3BlcnR5IGluIGEgbWl4aW4gdGhhdCBp
cyBub3Qgc2hhcmVkLCB5b3UgY2FuIGRlZmluZQorICAgIGl0IGVpdGhlciBhcyBhIGNvbXB1dGVk
IHByb3BlcnR5IG9yIGhhdmUgaXQgYmUgY3JlYXRlZCBvbiBpbml0aWFsaXphdGlvbiBvZiB0aGUg
b2JqZWN0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy9maWx0ZXJzIGFycmF5IHdpbGwg
YmUgc2hhcmVkIGFtb25nc3QgYW55IG9iamVjdCBpbXBsZW1lbnRpbmcgbWl4aW4KKyAgICBBcHAu
RmlsdGVyYWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgICAgICBmaWx0ZXJzOiBFbWJlci5B
KCkKKyAgICB9KTsKKyAgCisgICAgLy9maWx0ZXJzIHdpbGwgYmUgYSBzZXBhcmF0ZSAgYXJyYXkg
Zm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1peGluCisgICAgQXBwLkZpbHRlcmFi
bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgZmlsdGVyczogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7cmV0dXJuIEVtYmVyLkEoKTt9KQorICAgIH0pOworICAKKyAgICAvL2ZpbHRl
cnMgd2lsbCBiZSBjcmVhdGVkIGFzIGEgc2VwYXJhdGUgYXJyYXkgZHVyaW5nIHRoZSBvYmplY3Qn
cyBpbml0aWFsaXphdGlvbgorICAgIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKKyAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLl9zdXBlciguLi5hcmd1
bWVudHMpOworICAgICAgICB0aGlzLnNldCgiZmlsdGVycyIsIEVtYmVyLkEoKSk7CisgICAgICB9
CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBNaXhpbgorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gTWl4aW4oYXJncywgcHJvcGVy
dGllcykgeworICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisKKyAgICB2YXIgbGVu
Z3RoID0gYXJncyAmJiBhcmdzLmxlbmd0aDsKKworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAg
ICB2YXIgbSA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB4ID0gYXJnc1tpXTsKKyAgICAgICAgaWYgKHgg
aW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgICAgIG1baV0gPSB4OworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIG1baV0gPSBuZXcgTWl4aW4odW5kZWZpbmVkLCB4KTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICB0aGlzLm1peGlucyA9IG07CisgICAgfSBlbHNlIHsKKyAgICAgIHRo
aXMubWl4aW5zID0gdW5kZWZpbmVkOworICAgIH0KKyAgICB0aGlzLm93bmVyQ29uc3RydWN0b3Ig
PSB1bmRlZmluZWQ7CisgICAgdGhpcy5fd2l0aG91dCA9IHVuZGVmaW5lZDsKKyAgICB0aGlzW19l
bWJlck1ldGFsVXRpbHMuR1VJRF9LRVldID0gbnVsbDsKKyAgICB0aGlzW19lbWJlck1ldGFsVXRp
bHMuR1VJRF9LRVkgKyAnX25hbWUnXSA9IG51bGw7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1
Z1NlYWwodGhpcyk7CisgIH0KKworICBNaXhpbi5fYXBwbHkgPSBhcHBseU1peGluOworCisgIE1p
eGluLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uIChvYmopIHsKKyAgICB2YXIgYXJncyA9IGFfc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBhcHBseU1peGluKG9iaiwgYXJncywg
dHJ1ZSk7CisgIH07CisKKyAgTWl4aW4uZmluaXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7CisK
KyAgLy8gRVM2VE9ETzogdGhpcyByZWxpZXMgb24gYSBnbG9iYWwgc3RhdGU/CisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7CisKKyAgLyoqCisg
ICAgQG1ldGhvZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIGFyZ3VtZW50cyoKKyAg
ICBAcHVibGljCisgICovCisgIE1peGluLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAvLyBF
UzZUT0RPOiB0aGlzIHJlbGllcyBvbiBhIGdsb2JhbCBzdGF0ZT8KKyAgICBfZW1iZXJNZXRhbENv
cmUuZGVmYXVsdC5hbnlVbnByb2Nlc3NlZE1peGlucyA9IHRydWU7CisgICAgdmFyIE0gPSB0aGlz
OworCisgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHsKKyAgICAgIGFyZ3Nb
X2tleTJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE0oYXJn
cywgdW5kZWZpbmVkKTsKKyAgfTsKKworICB2YXIgTWl4aW5Qcm90b3R5cGUgPSBNaXhpbi5wcm90
b3R5cGU7CisKKyAgLyoqCisgICAgQG1ldGhvZCByZW9wZW4KKyAgICBAcGFyYW0gYXJndW1lbnRz
KgorICAgIEBwcml2YXRlCisgICovCisgIE1peGluUHJvdG90eXBlLnJlb3BlbiA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB2YXIgY3VycmVudE1peGluOworCisgICAgaWYgKHRoaXMucHJvcGVydGllcykg
eworICAgICAgY3VycmVudE1peGluID0gbmV3IE1peGluKHVuZGVmaW5lZCwgdGhpcy5wcm9wZXJ0
aWVzKTsKKyAgICAgIHRoaXMucHJvcGVydGllcyA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMubWl4
aW5zID0gW2N1cnJlbnRNaXhpbl07CisgICAgfSBlbHNlIGlmICghdGhpcy5taXhpbnMpIHsKKyAg
ICAgIHRoaXMubWl4aW5zID0gW107CisgICAgfQorCisgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5s
ZW5ndGg7CisgICAgdmFyIG1peGlucyA9IHRoaXMubWl4aW5zOworICAgIHZhciBpZHg7CisKKyAg
ICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICAgIGN1cnJlbnRNaXhpbiA9
IGFyZ3VtZW50c1tpZHhdOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0V4cGVjdGVk
IGhhc2ggb3IgTWl4aW4gaW5zdGFuY2UsIGdvdCAnICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu
Zy5jYWxsKGN1cnJlbnRNaXhpbiksIHR5cGVvZiBjdXJyZW50TWl4aW4gPT09ICdvYmplY3QnICYm
IGN1cnJlbnRNaXhpbiAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
Y3VycmVudE1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7CisKKyAgICAgIGlmIChjdXJyZW50
TWl4aW4gaW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgICBtaXhpbnMucHVzaChjdXJyZW50TWl4
aW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWl4aW5zLnB1c2gobmV3IE1peGluKHVuZGVm
aW5lZCwgY3VycmVudE1peGluKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7
CisgIH07CisKKyAgLyoqCisgICAgQG1ldGhvZCBhcHBseQorICAgIEBwYXJhbSBvYmoKKyAgICBA
cmV0dXJuIGFwcGxpZWQgb2JqZWN0CisgICAgQHByaXZhdGUKKyAgKi8KKyAgTWl4aW5Qcm90b3R5
cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBb
dGhpc10sIGZhbHNlKTsKKyAgfTsKKworICBNaXhpblByb3RvdHlwZS5hcHBseVBhcnRpYWwgPSBm
dW5jdGlvbiAob2JqKSB7CisgICAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBbdGhpc10sIHRydWUp
OworICB9OworCisgIE1peGluUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gTWl4aW5fdG9T
dHJpbmcoKSB7CisgICAgcmV0dXJuICcodW5rbm93biBtaXhpbiknOworICB9OworCisgIGZ1bmN0
aW9uIF9kZXRlY3QoY3VyTWl4aW4sIHRhcmdldE1peGluLCBzZWVuKSB7CisgICAgdmFyIGd1aWQg
PSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IoY3VyTWl4aW4pOworCisgICAgaWYgKHNlZW5bZ3Vp
ZF0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2VlbltndWlkXSA9IHRydWU7
CisKKyAgICBpZiAoY3VyTWl4aW4gPT09IHRhcmdldE1peGluKSB7CisgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgdmFyIG1peGlucyA9IGN1ck1peGluLm1peGluczsKKyAgICB2YXIgbG9j
ID0gbWl4aW5zID8gbWl4aW5zLmxlbmd0aCA6IDA7CisgICAgd2hpbGUgKC0tbG9jID49IDApIHsK
KyAgICAgIGlmIChfZGV0ZWN0KG1peGluc1tsb2NdLCB0YXJnZXRNaXhpbiwgc2VlbikpIHsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAg
fQorCisgIC8qKgorICAgIEBtZXRob2QgZGV0ZWN0CisgICAgQHBhcmFtIG9iagorICAgIEByZXR1
cm4ge0Jvb2xlYW59CisgICAgQHByaXZhdGUKKyAgKi8KKyAgTWl4aW5Qcm90b3R5cGUuZGV0ZWN0
ID0gZnVuY3Rpb24gKG9iaikgeworICAgIGlmICghb2JqKSB7CisgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIGlmIChvYmogaW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgcmV0dXJuIF9k
ZXRlY3Qob2JqLCB0aGlzLCB7fSk7CisgICAgfQorICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRh
LnBlZWtNZXRhKG9iaik7CisgICAgaWYgKCFtKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIHJldHVybiAhIW0ucGVla01peGlucyhfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhp
cykpOworICB9OworCisgIE1peGluUHJvdG90eXBlLndpdGhvdXQgPSBmdW5jdGlvbiAoKSB7Cisg
ICAgdmFyIHJldCA9IG5ldyBNaXhpbihbdGhpc10pOworCisgICAgZm9yICh2YXIgX2xlbjMgPSBh
cmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwg
X2xlbjM7IF9rZXkzKyspIHsKKyAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTsK
KyAgICB9CisKKyAgICByZXQuX3dpdGhvdXQgPSBhcmdzOworICAgIHJldHVybiByZXQ7CisgIH07
CisKKyAgZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgeworICAgIGlmIChzZWVuW19l
bWJlck1ldGFsVXRpbHMuZ3VpZEZvcihtaXhpbildKSB7CisgICAgICByZXR1cm47CisgICAgfQor
ICAgIHNlZW5bX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yKG1peGluKV0gPSB0cnVlOworCisgICAg
aWYgKG1peGluLnByb3BlcnRpZXMpIHsKKyAgICAgIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKG1p
eGluLnByb3BlcnRpZXMpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7
IGkrKykgeworICAgICAgICB2YXIga2V5ID0gcHJvcHNbaV07CisgICAgICAgIHJldFtrZXldID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1peGluLm1peGlucykgeworICAgICAgbWl4
aW4ubWl4aW5zLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgcmV0dXJuIF9rZXlzKHJl
dCwgeCwgc2Vlbik7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBNaXhpblByb3RvdHlwZS5r
ZXlzID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBrZXlzID0ge307CisgICAgdmFyIHNlZW4gPSB7
fTsKKworICAgIF9rZXlzKGtleXMsIHRoaXMsIHNlZW4pOworICAgIHZhciByZXQgPSBPYmplY3Qu
a2V5cyhrZXlzKTsKKyAgICByZXR1cm4gcmV0OworICB9OworCisgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKE1peGluUHJvdG90eXBlKTsKKworICAvLyByZXR1cm5zIHRoZSBtaXhpbnMgY3Vy
cmVudGx5IGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QKKyAgLy8gVE9ETzogTWFrZSBF
bWJlci5taXhpbgorICBNaXhpbi5taXhpbnMgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgdmFyIG0g
PSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICB2YXIgcmV0ID0gW107CisgICAg
aWYgKCFtKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG0uZm9yRWFjaE1peGlu
cyhmdW5jdGlvbiAoa2V5LCBjdXJyZW50TWl4aW4pIHsKKyAgICAgIC8vIHNraXAgcHJpbWl0aXZl
IG1peGlucyBzaW5jZSB0aGVzZSBhcmUgYWx3YXlzIGFub255bW91cworICAgICAgaWYgKCFjdXJy
ZW50TWl4aW4ucHJvcGVydGllcykgeworICAgICAgICByZXQucHVzaChjdXJyZW50TWl4aW4pOwor
ICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIHJldDsKKyAgfTsKKworICBleHBvcnRzLlJF
UVVJUkVEID0gUkVRVUlSRUQgPSBuZXcgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3Io
KTsKKyAgUkVRVUlSRUQudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICcoUmVx
dWlyZWQgUHJvcGVydHkpJzsKKyAgfTsKKworICAvKioKKyAgICBEZW5vdGVzIGEgcmVxdWlyZWQg
cHJvcGVydHkgZm9yIGEgbWl4aW4KKyAgCisgICAgQG1ldGhvZCByZXF1aXJlZAorICAgIEBmb3Ig
RW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlcXVpcmVkKCkgeworICAg
IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdFbWJlci5yZXF1aXJlZCBpcyBkZXByZWNhdGVk
IGFzIGl0cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgYW5kIHVucmVsaWFibGUuJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1tZXRhbC5yZXF1aXJlZCcsIHVudGlsOiAnMy4wLjAnIH0pOworICAgIHJl
dHVybiBSRVFVSVJFRDsKKyAgfQorCisgIGZ1bmN0aW9uIEFsaWFzKG1ldGhvZE5hbWUpIHsKKyAg
ICB0aGlzLmlzRGVzY3JpcHRvciA9IHRydWU7CisgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9k
TmFtZTsKKyAgfQorCisgIEFsaWFzLnByb3RvdHlwZSA9IG5ldyBfZW1iZXJNZXRhbFByb3BlcnRp
ZXMuRGVzY3JpcHRvcigpOworCisgIC8qKgorICAgIE1ha2VzIGEgbWV0aG9kIGF2YWlsYWJsZSB2
aWEgYW4gYWRkaXRpb25hbCBuYW1lLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBl
cnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgbmFtZTogZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiAnVG9taHVkYSBLYXR6ZGFsZSc7CisgICAgICB9LAorICAgICAgbW9uaWtl
cjogRW1iZXIuYWxpYXNNZXRob2QoJ25hbWUnKQorICAgIH0pOworICAKKyAgICB2YXIgZ29vZEd1
eSA9IEFwcC5QZXJzb24uY3JlYXRlKCk7CisgIAorICAgIGdvb2RHdXkubmFtZSgpOyAgICAvLyAn
VG9taHVkYSBLYXR6ZGFsZScKKyAgICBnb29kR3V5Lm1vbmlrZXIoKTsgLy8gJ1RvbWh1ZGEgS2F0
emRhbGUnCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYWxpYXNNZXRob2QKKyAgICBAZm9yIEVt
YmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIHRv
IGFsaWFzCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGFsaWFzTWV0aG9kKG1ldGhv
ZE5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOworICB9CisKKyAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgorICAvLyBPQlNFUlZFUiBIRUxQRVIKKyAgLy8KKworICAvKioKKyAgICBTcGVjaWZ5IGEgbWV0
aG9kIHRoYXQgb2JzZXJ2ZXMgcHJvcGVydHkgY2hhbmdlcy4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgdmFsdWVPYnNlcnZlcjogRW1iZXIu
b2JzZXJ2ZXIoJ3ZhbHVlJywgZnVuY3Rpb24oKSB7CisgICAgICAgIC8vIEV4ZWN1dGVzIHdoZW5l
dmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICAgIH0pCisgICAgfSk7CisgICAg
YGBgCisgIAorICAgIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2
ZXNgIGlmIHByb3RvdHlwZSBleHRlbnNpb25zIGFyZQorICAgIGVuYWJsZWQuCisgIAorICAgIEBt
ZXRob2Qgb2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3Bl
cnR5TmFtZXMqCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYworICAgIEByZXR1cm4gZnVuYwor
ICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBvYnNlcnZlcigpIHsKKyAgICBmb3IgKHZh
ciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0g
MDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykgeworICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVu
dHNbX2tleTRdOworICAgIH0KKworICAgIHZhciBmdW5jID0gYXJncy5zbGljZSgtMSlbMF07Cisg
ICAgdmFyIHBhdGhzOworCisgICAgdmFyIGFkZFdhdGNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChw
YXRoKSB7CisgICAgICBwYXRocy5wdXNoKHBhdGgpOworICAgIH07CisgICAgdmFyIF9wYXRocyA9
IGFyZ3Muc2xpY2UoMCwgLTEpOworCisgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24n
KSB7CisgICAgICAvLyByZXZlcnQgdG8gb2xkLCBzb2Z0LWRlcHJlY2F0ZWQgYXJndW1lbnQgb3Jk
ZXJpbmcKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdQYXNzaW5nIHRoZSBkZXBl
bmRlbnRLZXlzIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbiBFbWJlci5vYnNlcnZlciBp
cyBkZXByZWNhdGVkLiBFbnN1cmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBsYXN0IGFy
Z3VtZW50LicsIGZhbHNlLCB7IGlkOiAnZW1iZXItbWV0YWwub2JzZXJ2ZXItYXJndW1lbnQtb3Jk
ZXInLCB1bnRpbDogJzMuMC4wJyB9KTsKKworICAgICAgZnVuYyA9IGFyZ3NbMF07CisgICAgICBf
cGF0aHMgPSBhcmdzLnNsaWNlKDEpOworICAgIH0KKworICAgIHBhdGhzID0gW107CisKKyAgICBm
b3IgKHZhciBpID0gMDsgaSA8IF9wYXRocy5sZW5ndGg7ICsraSkgeworICAgICAgX2VtYmVyTWV0
YWxFeHBhbmRfcHJvcGVydGllcy5kZWZhdWx0KF9wYXRoc1tpXSwgYWRkV2F0Y2hlZFByb3BlcnR5
KTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHsKKyAgICAg
IHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0VtYmVyLm9ic2VydmVyIGNhbGxl
ZCB3aXRob3V0IGEgZnVuY3Rpb24nKTsKKyAgICB9CisKKyAgICBmdW5jLl9fZW1iZXJfb2JzZXJ2
ZXNfXyA9IHBhdGhzOworICAgIHJldHVybiBmdW5jOworICB9CisKKyAgLyoqCisgICAgU3BlY2lm
eSBhIG1ldGhvZCB0aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHZhbHVlT2JzZXJ2ZXI6
IEVtYmVyLmltbWVkaWF0ZU9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgeworICAgICAgICAv
LyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgICB9
KQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBJbiB0aGUgZnV0dXJlLCBgRW1iZXIub2JzZXJ2
ZXJgIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0aGlzIGV2ZW50LAorICAgIGBFbWJlci5p
bW1lZGlhdGVPYnNlcnZlcmAgd2lsbCBtYWludGFpbiB0aGUgc3luY2hyb25vdXMgYmVoYXZpb3Iu
CisgIAorICAgIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNJ
bW1lZGlhdGVseWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgICAgZW5hYmxlZC4KKyAg
CisgICAgQG1ldGhvZCBfaW1tZWRpYXRlT2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBh
cmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYwor
ICAgIEBkZXByZWNhdGVkIFVzZSBgRW1iZXIub2JzZXJ2ZXJgIGluc3RlYWQuCisgICAgQHJldHVy
biBmdW5jCisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBfaW1tZWRpYXRlT2JzZXJ2
ZXIoKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1VzYWdlIG9mIGBFbWJlci5p
bW1lZGlhdGVPYnNlcnZlcmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBFbWJlci5vYnNlcnZlcmAgaW5z
dGVhZC4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLW1ldGFsLmltbWVkaWF0ZS1vYnNlcnZlcicsIHVu
dGlsOiAnMy4wLjAnIH0pOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldOworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0ltbWVkaWF0ZSBvYnNlcnZlcnMgbXVzdCBvYnNlcnZl
IGludGVybmFsIHByb3BlcnRpZXMgb25seSwgbm90IHByb3BlcnRpZXMgb24gb3RoZXIgb2JqZWN0
cy4nLCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyB8fCBhcmcuaW5kZXhPZignLicpID09PSAtMSk7
CisgICAgfQorCisgICAgcmV0dXJuIG9ic2VydmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cisg
IH0KKworICAvKioKKyAgICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5IGFyZSBjYWxsZWQgd2l0
aCB0aGUgYXJndW1lbnRzIGBvYmpgLCBga2V5TmFtZWAuCisgIAorICAgIE5vdGUsIGBAZWFjaC5w
cm9wZXJ0eWAgb2JzZXJ2ZXIgaXMgY2FsbGVkIHBlciBlYWNoIGFkZCBvciByZXBsYWNlIG9mIGFu
IGVsZW1lbnQKKyAgICBhbmQgaXQncyBub3QgY2FsbGVkIHdpdGggYSBzcGVjaWZpYyBlbnVtZXJh
dGlvbiBpdGVtLgorICAKKyAgICBBIGBfYmVmb3JlT2JzZXJ2ZXJgIGZpcmVzIGJlZm9yZSBhIHBy
b3BlcnR5IGNoYW5nZXMuCisgIAorICAgIEEgYF9iZWZvcmVPYnNlcnZlcmAgaXMgYW4gYWx0ZXJu
YXRpdmUgZm9ybSBvZiBgLm9ic2VydmVzQmVmb3JlKClgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgQXBwLlBlcnNvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBmcmllbmRz
OiBbeyBuYW1lOiAnVG9tJyB9LCB7IG5hbWU6ICdTdGVmYW4nIH0sIHsgbmFtZTogJ0tyaXMnIH1d
LAorICAKKyAgICAgIHZhbHVlRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGVudC52YWx1
ZScsIGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICAgICAgICAgIC8vIG9ubHkgcnVuIGlmIHVw
ZGF0aW5nIGEgdmFsdWUgYWxyZWFkeSBpbiB0aGUgRE9NCisgICAgICAgICAgaWYgKHRoaXMuZ2V0
KCdzdGF0ZScpID09PSAnaW5ET00nKSB7CisgICAgICAgICAgICB2YXIgY29sb3IgPSBvYmouZ2V0
KGtleU5hbWUpID4gdGhpcy5jaGFuZ2luZ0Zyb20gPyAnZ3JlZW4nIDogJ3JlZCc7CisgICAgICAg
ICAgICAvLyBsb2dpYworICAgICAgICAgIH0KKyAgICAgIH0pLAorICAKKyAgICAgIGZyaWVuZHNE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdmcmllbmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKKyAgICAgICAgLy8gc29tZSBsb2dpYworICAgICAgICAvLyBvYmouZ2V0
KGtleU5hbWUpIHJldHVybnMgZnJpZW5kcyBhcnJheQorICAgICAgfSkKKyAgICB9KTsKKyAgICBg
YGAKKyAgCisgICAgQWxzbyBhdmFpbGFibGUgYXMgYEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZl
c0JlZm9yZWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgICAgZW5hYmxlZC4KKyAgCisg
ICAgQG1ldGhvZCBiZWZvcmVPYnNlcnZlcgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge1N0
cmluZ30gcHJvcGVydHlOYW1lcyoKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgICAgQHJl
dHVybiBmdW5jCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0
aW9uIF9iZWZvcmVPYnNlcnZlcigpIHsKKyAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5s
ZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tl
eTUrKykgeworICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdOworICAgIH0KKwor
ICAgIHZhciBmdW5jID0gYXJncy5zbGljZSgtMSlbMF07CisgICAgdmFyIHBhdGhzOworCisgICAg
dmFyIGFkZFdhdGNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBwYXRocy5w
dXNoKHBhdGgpOworICAgIH07CisKKyAgICB2YXIgX3BhdGhzID0gYXJncy5zbGljZSgwLCAtMSk7
CisKKyAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgIC8vIHJldmVy
dCB0byBvbGQsIHNvZnQtZGVwcmVjYXRlZCBhcmd1bWVudCBvcmRlcmluZworCisgICAgICBmdW5j
ID0gYXJnc1swXTsKKyAgICAgIF9wYXRocyA9IGFyZ3Muc2xpY2UoMSk7CisgICAgfQorCisgICAg
cGF0aHMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3BhdGhzLmxlbmd0aDsgKytp
KSB7CisgICAgICBfZW1iZXJNZXRhbEV4cGFuZF9wcm9wZXJ0aWVzLmRlZmF1bHQoX3BhdGhzW2ld
LCBhZGRXYXRjaGVkUHJvcGVydHkpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgZnVuYyAhPT0g
J2Z1bmN0aW9uJykgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVy
cm9yKCdFbWJlci5iZWZvcmVPYnNlcnZlciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uJyk7Cisg
ICAgfQorCisgICAgZnVuYy5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsKKyAgICBy
ZXR1cm4gZnVuYzsKKyAgfQorCisgIGV4cG9ydHMuSVNfQklORElORyA9IElTX0JJTkRJTkc7Cisg
IGV4cG9ydHMuTWl4aW4gPSBNaXhpbjsKKyAgZXhwb3J0cy5yZXF1aXJlZCA9IHJlcXVpcmVkOwor
ICBleHBvcnRzLlJFUVVJUkVEID0gUkVRVUlSRUQ7Cit9KTsKKy8vIHdhcm4sIGFzc2VydCwgd3Jh
cCwgZXQ7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVyLW1ldGFsL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxXYXRjaGluZywgX2VtYmVyTWV0YWxFdmVudHMpIHsKKyAgJ3VzZSBzdHJp
Y3QnOworCisgIGV4cG9ydHMuYWRkT2JzZXJ2ZXIgPSBhZGRPYnNlcnZlcjsKKyAgZXhwb3J0cy5v
YnNlcnZlcnNGb3IgPSBvYnNlcnZlcnNGb3I7CisgIGV4cG9ydHMucmVtb3ZlT2JzZXJ2ZXIgPSBy
ZW1vdmVPYnNlcnZlcjsKKyAgZXhwb3J0cy5fYWRkQmVmb3JlT2JzZXJ2ZXIgPSBfYWRkQmVmb3Jl
T2JzZXJ2ZXI7CisgIGV4cG9ydHMuX3N1c3BlbmRPYnNlcnZlciA9IF9zdXNwZW5kT2JzZXJ2ZXI7
CisgIGV4cG9ydHMuX3N1c3BlbmRPYnNlcnZlcnMgPSBfc3VzcGVuZE9ic2VydmVyczsKKyAgZXhw
b3J0cy5fcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIgPSBfcmVtb3ZlQmVmb3JlT2JzZXJ2ZXI7CisKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICB2YXIgQUZURVJfT0JTRVJWRVJT
ID0gJzpjaGFuZ2UnOworICB2YXIgQkVGT1JFX09CU0VSVkVSUyA9ICc6YmVmb3JlJzsKKworICBm
dW5jdGlvbiBjaGFuZ2VFdmVudChrZXlOYW1lKSB7CisgICAgcmV0dXJuIGtleU5hbWUgKyBBRlRF
Ul9PQlNFUlZFUlM7CisgIH0KKworICBmdW5jdGlvbiBiZWZvcmVFdmVudChrZXlOYW1lKSB7Cisg
ICAgcmV0dXJuIGtleU5hbWUgKyBCRUZPUkVfT0JTRVJWRVJTOworICB9CisKKyAgLyoqCisgICAg
QG1ldGhvZCBhZGRPYnNlcnZlcgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAg
QHBhcmFtIHtTdHJpbmd9IF9wYXRoCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdl
dAorICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQorICAgIEBwdWJsaWMKKyAg
Ki8KKworICBmdW5jdGlvbiBhZGRPYnNlcnZlcihvYmosIF9wYXRoLCB0YXJnZXQsIG1ldGhvZCkg
eworICAgIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3Bh
dGgpLCB0YXJnZXQsIG1ldGhvZCk7CisgICAgX2VtYmVyTWV0YWxXYXRjaGluZy53YXRjaChvYmos
IF9wYXRoKTsKKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZnVuY3Rpb24gb2JzZXJ2ZXJz
Rm9yKG9iaiwgcGF0aCkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbEV2ZW50cy5saXN0ZW5lcnNG
b3Iob2JqLCBjaGFuZ2VFdmVudChwYXRoKSk7CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIHJl
bW92ZU9ic2VydmVyCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0g
e1N0cmluZ30gcGF0aAorICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQKKyAgICBA
cGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KKyAgICBAcHVibGljCisgICovCisKKyAg
ZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXIob2JqLCBwYXRoLCB0YXJnZXQsIG1ldGhvZCkgeworICAg
IF9lbWJlck1ldGFsV2F0Y2hpbmcudW53YXRjaChvYmosIHBhdGgpOworICAgIF9lbWJlck1ldGFs
RXZlbnRzLnJlbW92ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0
aG9kKTsKKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAgQG1ldGhvZCBfYWRk
QmVmb3JlT2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJh
bSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldAorICAg
IEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQorICAgIEBkZXByZWNhdGVkCisgICAg
QHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBfYWRkQmVmb3JlT2JzZXJ2ZXIob2JqLCBwYXRo
LCB0YXJnZXQsIG1ldGhvZCkgeworICAgIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyKG9i
aiwgYmVmb3JlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKKyAgICBfZW1iZXJNZXRhbFdh
dGNoaW5nLndhdGNoKG9iaiwgcGF0aCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8v
IFN1c3BlbmQgb2JzZXJ2ZXIgZHVyaW5nIGNhbGxiYWNrLgorICAvLworICAvLyBUaGlzIHNob3Vs
ZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHRhcmdldCBvZiB0aGUgb2JzZXJ2ZXIKKyAgLy8gd2hpbGUg
aXQgaXMgc2V0dGluZyB0aGUgb2JzZXJ2ZWQgcGF0aC4KKworICBmdW5jdGlvbiBfc3VzcGVuZE9i
c2VydmVyKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJu
IF9lbWJlck1ldGFsRXZlbnRzLnN1c3BlbmRMaXN0ZW5lcihvYmosIGNoYW5nZUV2ZW50KHBhdGgp
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOworICB9CisKKyAgZnVuY3Rpb24gX3N1c3BlbmRP
YnNlcnZlcnMob2JqLCBwYXRocywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgICAgdmFy
IGV2ZW50cyA9IHBhdGhzLm1hcChjaGFuZ2VFdmVudCk7CisgICAgcmV0dXJuIF9lbWJlck1ldGFs
RXZlbnRzLnN1c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudHMsIHRhcmdldCwgbWV0aG9kLCBjYWxs
YmFjayk7CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIHJlbW92ZUJlZm9yZU9ic2VydmVyCisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0ge1N0cmluZ30gcGF0aAor
ICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQKKyAgICBAcGFyYW0ge0Z1bmN0aW9u
fFN0cmluZ30gW21ldGhvZF0KKyAgICBAZGVwcmVjYXRlZAorICAgIEBwcml2YXRlCisgICovCisK
KyAgZnVuY3Rpb24gX3JlbW92ZUJlZm9yZU9ic2VydmVyKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRo
b2QpIHsKKyAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLnVud2F0Y2gob2JqLCBwYXRoKTsKKyAgICBf
ZW1iZXJNZXRhbEV2ZW50cy5yZW1vdmVMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KHBhdGgpLCB0
YXJnZXQsIG1ldGhvZCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLW1ldGFsL29ic2VydmVyX3NldCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC91dGlscycs
ICdlbWJlci1tZXRhbC9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKgorICAgIHRo
aXMub2JzZXJ2ZXJTZXQgPSB7CisgICAgICBbc2VuZGVyR3VpZF06IHsgLy8gdmFyaWFibGUgbmFt
ZTogYGtleVNldGAKKyAgICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKKyAgICAgIH0KKyAgICB9
LAorICAgIHRoaXMub2JzZXJ2ZXJzID0gWworICAgICAgeworICAgICAgICBzZW5kZXI6IG9iaiwK
KyAgICAgICAga2V5TmFtZToga2V5TmFtZSwKKyAgICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUs
CisgICAgICAgIGxpc3RlbmVyczogWworICAgICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgZmxhZ3Nd
CisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAuLi4KKyAgICBdCisgICovCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IE9ic2VydmVyU2V0OworCisgIGZ1bmN0aW9uIE9ic2VydmVyU2V0KCkgeworICAg
IHRoaXMuY2xlYXIoKTsKKyAgfQorCisgIE9ic2VydmVyU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5j
dGlvbiAoc2VuZGVyLCBrZXlOYW1lLCBldmVudE5hbWUpIHsKKyAgICB2YXIgb2JzZXJ2ZXJTZXQg
PSB0aGlzLm9ic2VydmVyU2V0OworICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyczsK
KyAgICB2YXIgc2VuZGVyR3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcihzZW5kZXIpOwor
ICAgIHZhciBrZXlTZXQgPSBvYnNlcnZlclNldFtzZW5kZXJHdWlkXTsKKyAgICB2YXIgaW5kZXg7
CisKKyAgICBpZiAoIWtleVNldCkgeworICAgICAgb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0gPSBr
ZXlTZXQgPSB7fTsKKyAgICB9CisgICAgaW5kZXggPSBrZXlTZXRba2V5TmFtZV07CisgICAgaWYg
KGluZGV4ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGluZGV4ID0gb2JzZXJ2ZXJzLnB1c2goewor
ICAgICAgICBzZW5kZXI6IHNlbmRlciwKKyAgICAgICAga2V5TmFtZToga2V5TmFtZSwKKyAgICAg
ICAgZXZlbnROYW1lOiBldmVudE5hbWUsCisgICAgICAgIGxpc3RlbmVyczogW10KKyAgICAgIH0p
IC0gMTsKKyAgICAgIGtleVNldFtrZXlOYW1lXSA9IGluZGV4OworICAgIH0KKyAgICByZXR1cm4g
b2JzZXJ2ZXJzW2luZGV4XS5saXN0ZW5lcnM7CisgIH07CisKKyAgT2JzZXJ2ZXJTZXQucHJvdG90
eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2Vy
dmVyczsKKyAgICB2YXIgaSwgbGVuLCBvYnNlcnZlciwgc2VuZGVyOworICAgIHRoaXMuY2xlYXIo
KTsKKyAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKKyAgICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJzW2ldOworICAgICAgc2VuZGVyID0gb2JzZXJ2
ZXIuc2VuZGVyOworICAgICAgaWYgKHNlbmRlci5pc0Rlc3Ryb3lpbmcgfHwgc2VuZGVyLmlzRGVz
dHJveWVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxF
dmVudHMuc2VuZEV2ZW50KHNlbmRlciwgb2JzZXJ2ZXIuZXZlbnROYW1lLCBbc2VuZGVyLCBvYnNl
cnZlci5rZXlOYW1lXSwgb2JzZXJ2ZXIubGlzdGVuZXJzKTsKKyAgICB9CisgIH07CisKKyAgT2Jz
ZXJ2ZXJTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMub2JzZXJ2
ZXJTZXQgPSB7fTsKKyAgICB0aGlzLm9ic2VydmVycyA9IFtdOworICB9OworfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY2FjaGUn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ2FjaGUpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHMuaXNHbG9iYWwgPSBpc0dsb2JhbDsKKyAgZXhwb3J0cy5pc0dsb2JhbFBh
dGggPSBpc0dsb2JhbFBhdGg7CisgIGV4cG9ydHMuaGFzVGhpcyA9IGhhc1RoaXM7CisgIGV4cG9y
dHMuaXNQYXRoID0gaXNQYXRoOworICBleHBvcnRzLmdldEZpcnN0S2V5ID0gZ2V0Rmlyc3RLZXk7
CisgIGV4cG9ydHMuZ2V0VGFpbFBhdGggPSBnZXRUYWlsUGF0aDsKKworICB2YXIgSVNfR0xPQkFM
ID0gL15bQS1aJF0vOworICB2YXIgSVNfR0xPQkFMX1BBVEggPSAvXltBLVokXS4qW1wuXS87Cisg
IHZhciBIQVNfVEhJUyA9ICd0aGlzLic7CisKKyAgdmFyIGlzR2xvYmFsQ2FjaGUgPSBuZXcgX2Vt
YmVyTWV0YWxDYWNoZS5kZWZhdWx0KDEwMDAsIGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4g
SVNfR0xPQkFMLnRlc3Qoa2V5KTsKKyAgfSk7CisKKyAgdmFyIGlzR2xvYmFsUGF0aENhY2hlID0g
bmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7CisgICAg
cmV0dXJuIElTX0dMT0JBTF9QQVRILnRlc3Qoa2V5KTsKKyAgfSk7CisKKyAgdmFyIGhhc1RoaXND
YWNoZSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkg
eworICAgIHJldHVybiBrZXkubGFzdEluZGV4T2YoSEFTX1RISVMsIDApID09PSAwOworICB9KTsK
KworICB2YXIgZmlyc3REb3RJbmRleENhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtleS5pbmRleE9mKCcuJyk7Cisg
IH0pOworCisgIHZhciBmaXJzdEtleUNhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAocGF0aCkgeworICAgIHZhciBpbmRleCA9IGZpcnN0RG90SW5kZXhD
YWNoZS5nZXQocGF0aCk7CisgICAgaWYgKGluZGV4ID09PSAtMSkgeworICAgICAgcmV0dXJuIHBh
dGg7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGluZGV4KTsKKyAg
ICB9CisgIH0pOworCisgIHZhciB0YWlsUGF0aENhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUu
ZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAocGF0aCkgeworICAgIHZhciBpbmRleCA9IGZpcnN0RG90
SW5kZXhDYWNoZS5nZXQocGF0aCk7CisgICAgaWYgKGluZGV4ICE9PSAtMSkgeworICAgICAgcmV0
dXJuIHBhdGguc2xpY2UoaW5kZXggKyAxKTsKKyAgICB9CisgIH0pOworCisgIHZhciBjYWNoZXMg
PSB7CisgICAgaXNHbG9iYWxDYWNoZTogaXNHbG9iYWxDYWNoZSwKKyAgICBpc0dsb2JhbFBhdGhD
YWNoZTogaXNHbG9iYWxQYXRoQ2FjaGUsCisgICAgaGFzVGhpc0NhY2hlOiBoYXNUaGlzQ2FjaGUs
CisgICAgZmlyc3REb3RJbmRleENhY2hlOiBmaXJzdERvdEluZGV4Q2FjaGUsCisgICAgZmlyc3RL
ZXlDYWNoZTogZmlyc3RLZXlDYWNoZSwKKyAgICB0YWlsUGF0aENhY2hlOiB0YWlsUGF0aENhY2hl
CisgIH07CisKKyAgZXhwb3J0cy5jYWNoZXMgPSBjYWNoZXM7CisKKyAgZnVuY3Rpb24gaXNHbG9i
YWwocGF0aCkgeworICAgIHJldHVybiBpc0dsb2JhbENhY2hlLmdldChwYXRoKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGlzR2xvYmFsUGF0aChwYXRoKSB7CisgICAgcmV0dXJuIGlzR2xvYmFsUGF0aENh
Y2hlLmdldChwYXRoKTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhc1RoaXMocGF0aCkgeworICAgIHJl
dHVybiBoYXNUaGlzQ2FjaGUuZ2V0KHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gaXNQYXRoKHBh
dGgpIHsKKyAgICByZXR1cm4gZmlyc3REb3RJbmRleENhY2hlLmdldChwYXRoKSAhPT0gLTE7Cisg
IH0KKworICBmdW5jdGlvbiBnZXRGaXJzdEtleShwYXRoKSB7CisgICAgcmV0dXJuIGZpcnN0S2V5
Q2FjaGUuZ2V0KHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VGFpbFBhdGgocGF0aCkgewor
ICAgIHJldHVybiB0YWlsUGF0aENhY2hlLmdldChwYXRoKTsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLW1ldGFsL3Byb3BlcnRpZXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAn
ZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9l
bWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9l
dmVudHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5EZXNjcmlwdG9yID0gRGVzY3JpcHRvcjsKKyAgZXhwb3J0cy5N
QU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OID0gTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTjsKKyAg
ZXhwb3J0cy5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9O
OworICBleHBvcnRzLklOSEVSSVRJTkdfR0VUVEVSX0ZVTkNUSU9OID0gSU5IRVJJVElOR19HRVRU
RVJfRlVOQ1RJT047CisgIGV4cG9ydHMuZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsK
KworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCisgIC8vIERFU0NSSVBUT1IKKyAgLy8KKworICAvKioKKyAgICBPYmplY3RzIG9m
IHRoaXMgdHlwZSBjYW4gaW1wbGVtZW50IGFuIGludGVyZmFjZSB0byByZXNwb25kIHRvIHJlcXVl
c3RzIHRvCisgICAgZ2V0IGFuZCBzZXQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRs
ZXMgc2ltcGxlIHByb3BlcnRpZXMuCisgIAorICAgIEBjbGFzcyBEZXNjcmlwdG9yCisgICAgQHBy
aXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBEZXNjcmlwdG9yKCkgeworICAgIHRoaXMuaXNEZXNj
cmlwdG9yID0gdHJ1ZTsKKyAgfQorCisgIHZhciBSRURFRklORV9TVVBQT1JURUQgPSAoZnVuY3Rp
b24gKCkgeworICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGFsZ2VyL2tpYmFuYS9jb21taXQv
YjdlMzVlNjczN2RmNTg1NTg1MzMyODU3YTRjMzk3ZGMyMDZlN2ZmOQorICAgIHZhciBhID0gT2Jq
ZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCB7CisgICAgICBwcm9wOiB7CisgICAgICAgIGNv
bmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgdmFsdWU6IDEKKyAgICAgIH0KKyAgICB9KTsKKwor
ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCAncHJvcCcsIHsKKyAgICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZSwKKyAgICAgIHZhbHVlOiAyCisgICAgfSk7CisKKyAgICByZXR1cm4gYS5wcm9wID09
PSAyOworICB9KSgpOworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIERFRklOSU5HIFBST1BFUlRJRVMgQVBJCisgIC8v
CisKKyAgZnVuY3Rpb24gTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTihuYW1lKSB7CisgICAgZnVu
Y3Rpb24gU0VUVEVSX0ZVTkNUSU9OKHZhbHVlKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnWW91IG11c3QgdXNlIEVtYmVyLnNldCgpIHRvIHNldCB0aGUgYCcgKyBuYW1lICsgJ2Ag
cHJvcGVydHkgKG9mICcgKyB0aGlzICsgJykgdG8gYCcgKyB2YWx1ZSArICdgLicsIGZhbHNlKTsK
KyAgICB9CisKKyAgICBTRVRURVJfRlVOQ1RJT04uaXNNYW5kYXRvcnlTZXR0ZXIgPSB0cnVlOwor
ICAgIHJldHVybiBTRVRURVJfRlVOQ1RJT047CisgIH0KKworICBmdW5jdGlvbiBERUZBVUxUX0dF
VFRFUl9GVU5DVElPTihuYW1lKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uIEdFVFRFUl9GVU5DVElP
TigpIHsKKyAgICAgIHZhciBtZXRhID0gdGhpc1snX19lbWJlcl9tZXRhX18nXTsKKyAgICAgIHJl
dHVybiBtZXRhICYmIG1ldGEucGVla1ZhbHVlcyhuYW1lKTsKKyAgICB9OworICB9CisKKyAgZnVu
Y3Rpb24gSU5IRVJJVElOR19HRVRURVJfRlVOQ1RJT04obmFtZSkgeworICAgIGZ1bmN0aW9uIElH
RVRURVJfRlVOQ1RJT04oKSB7CisgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBl
T2YodGhpcyk7CisgICAgICByZXR1cm4gcHJvdG8gJiYgcHJvdG9bbmFtZV07CisgICAgfQorCisg
ICAgSUdFVFRFUl9GVU5DVElPTi5pc0luaGVyaXRpbmdHZXR0ZXIgPSB0cnVlOworICAgIHJldHVy
biBJR0VUVEVSX0ZVTkNUSU9OOworICB9CisKKyAgLyoqCisgICAgTk9URTogVGhpcyBpcyBhIGxv
dy1sZXZlbCBtZXRob2QgdXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgQVBJLiBZb3UgYWxtb3N0
CisgICAgbmV2ZXIgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkIHlv
dSBzaG91bGQgdXNlCisgICAgYEVtYmVyLm1peGluKClgIHRvIGRlZmluZSBuZXcgcHJvcGVydGll
cy4KKyAgCisgICAgRGVmaW5lcyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBFUzUKKyAgICBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClgIG1l
dGhvZCBleGNlcHQgdGhhdCBpdCBjYW4gYWxzbyBhY2NlcHQgY29tcHV0ZWQKKyAgICBwcm9wZXJ0
aWVzIGFuZCBvdGhlciBzcGVjaWFsIGRlc2NyaXB0b3JzLgorICAKKyAgICBOb3JtYWxseSB0aGlz
IG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRlcnMuIEhvd2V2ZXIgaWYgeW91IHBhc3Mg
YW4KKyAgICBpbnN0YW5jZSBvZiBgRGVzY3JpcHRvcmAgYXMgdGhlIHRoaXJkIHBhcmFtIHRoZW4g
eW91IGNhbiBwYXNzIGFuCisgICAgb3B0aW9uYWwgdmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0
ZXIuIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbgorICAgIGNyZWF0aW5nIG5ldyBk
ZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0eS4KKyAgCisgICAgIyMgRXhhbXBsZXMK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIEVTNSBjb21wYXRpYmxlIG1vZGUKKyAgICBF
bWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnZmlyc3ROYW1lJywgeworICAgICAgd3JpdGFi
bGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAorICAgICAgZW51bWVyYWJsZTog
dHJ1ZSwKKyAgICAgIHZhbHVlOiAnQ2hhcmxlcycKKyAgICB9KTsKKyAgCisgICAgLy8gZGVmaW5l
IGEgc2ltcGxlIHByb3BlcnR5CisgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2xh
c3ROYW1lJywgdW5kZWZpbmVkLCAnSm9sbGV5Jyk7CisgIAorICAgIC8vIGRlZmluZSBhIGNvbXB1
dGVkIHByb3BlcnR5CisgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1l
JywgRW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlzLmxhc3ROYW1lOworICAgIH0pKTsK
KyAgICBgYGAKKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Cisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdCB0byBkZWZp
bmUgdGhpcyBwcm9wZXJ0eSBvbi4gVGhpcyBtYXkgYmUgYSBwcm90b3R5cGUuCisgICAgQHBhcmFt
IHtTdHJpbmd9IGtleU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgQHBhcmFtIHtE
ZXNjcmlwdG9yfSBbZGVzY10gYW4gaW5zdGFuY2Ugb2YgYERlc2NyaXB0b3JgICh0eXBpY2FsbHkg
YQorICAgICAgY29tcHV0ZWQgcHJvcGVydHkpIG9yIGFuIEVTNSBkZXNjcmlwdG9yLgorICAgICAg
WW91IG11c3QgcHJvdmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJvdGguCisgICAgQHBhcmFt
IHsqfSBbZGF0YV0gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBkZXNjcmlwdG9yLCB0aGF0IHdpbGwK
KyAgICAgIGJlY29tZSB0aGUgZXhwbGljaXQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS4KKyAgKi8K
KworICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MsIGRhdGEsIG1l
dGEpIHsKKyAgICB2YXIgcG9zc2libGVEZXNjLCBleGlzdGluZ0Rlc2MsIHdhdGNoaW5nLCB2YWx1
ZTsKKworICAgIGlmICghbWV0YSkgeworICAgICAgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5tZXRh
KG9iaik7CisgICAgfQorICAgIHZhciB3YXRjaEVudHJ5ID0gbWV0YS5wZWVrV2F0Y2hpbmcoa2V5
TmFtZSk7CisgICAgcG9zc2libGVEZXNjID0gb2JqW2tleU5hbWVdOworICAgIGV4aXN0aW5nRGVz
YyA9IHBvc3NpYmxlRGVzYyAhPT0gbnVsbCAmJiB0eXBlb2YgcG9zc2libGVEZXNjID09PSAnb2Jq
ZWN0JyAmJiBwb3NzaWJsZURlc2MuaXNEZXNjcmlwdG9yID8gcG9zc2libGVEZXNjIDogdW5kZWZp
bmVkOworCisgICAgd2F0Y2hpbmcgPSB3YXRjaEVudHJ5ICE9PSB1bmRlZmluZWQgJiYgd2F0Y2hF
bnRyeSA+IDA7CisKKyAgICBpZiAoZXhpc3RpbmdEZXNjKSB7CisgICAgICBleGlzdGluZ0Rlc2Mu
dGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKKyAgICB9CisKKyAgICBpZiAoZGVzYyBpbnN0YW5jZW9m
IERlc2NyaXB0b3IpIHsKKyAgICAgIHZhbHVlID0gZGVzYzsKKworICAgICAgaWYgKHdhdGNoaW5n
KSB7CisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKKyAgICAg
ICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAg
ICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICB2YWx1ZTogdmFsdWUKKyAgICAgICAg
fSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKKyAgICAg
IH0KKworICAgICAgaWYgKGRlc2Muc2V0dXApIHsKKyAgICAgICAgZGVzYy5zZXR1cChvYmosIGtl
eU5hbWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7
CisgICAgICAgIHZhbHVlID0gZGF0YTsKKworICAgICAgICBpZiAod2F0Y2hpbmcpIHsKKyAgICAg
ICAgICBtZXRhLndyaXRlVmFsdWVzKGtleU5hbWUsIGRhdGEpOworCisgICAgICAgICAgdmFyIGRl
ZmF1bHREZXNjcmlwdG9yID0geworICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAg
ICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHNldDogTUFOREFUT1JZX1NF
VFRFUl9GVU5DVElPTihrZXlOYW1lKSwKKyAgICAgICAgICAgIGdldDogREVGQVVMVF9HRVRURVJf
RlVOQ1RJT04oa2V5TmFtZSkKKyAgICAgICAgICB9OworCisgICAgICAgICAgaWYgKFJFREVGSU5F
X1NVUFBPUlRFRCkgeworICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5
TmFtZSwgZGVmYXVsdERlc2NyaXB0b3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBoYW5kbGVCcm9rZW5QaGFudG9tRGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBkZWZhdWx0
RGVzY3JpcHRvcik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9i
altrZXlOYW1lXSA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZh
bHVlID0gZGVzYzsKKworICAgICAgICAvLyBmYWxsYmFjayB0byBFUzUKKyAgICAgICAgT2JqZWN0
LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgZGVzYyk7CisgICAgICB9CisgICAgfQorCisg
ICAgLy8gaWYga2V5IGlzIGJlaW5nIHdhdGNoZWQsIG92ZXJyaWRlIGNoYWlucyB0aGF0CisgICAg
Ly8gd2VyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm90b3R5cGUKKyAgICBpZiAod2F0Y2hpbmcp
IHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLm92ZXJyaWRlQ2hhaW5zKG9iaiwg
a2V5TmFtZSwgbWV0YSk7CisgICAgfQorCisgICAgLy8gVGhlIGB2YWx1ZWAgcGFzc2VkIHRvIHRo
ZSBgZGlkRGVmaW5lUHJvcGVydHlgIGhvb2sgaXMKKyAgICAvLyBlaXRoZXIgdGhlIGRlc2NyaXB0
b3Igb3IgZGF0YSwgd2hpY2hldmVyIHdhcyBwYXNzZWQuCisgICAgaWYgKG9iai5kaWREZWZpbmVQ
cm9wZXJ0eSkgeworICAgICAgb2JqLmRpZERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgdmFs
dWUpOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZnVuY3Rpb24gaGFuZGxl
QnJva2VuUGhhbnRvbURlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgZGVzYykgeworICAgIC8v
IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvaXNzdWVzLzExODU2CisgICAgT2Jq
ZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdy
aXRhYmxlOiB0cnVlLCB2YWx1ZTogJ2lDcnknIH0pOworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
eShvYmosIGtleU5hbWUsIGRlc2MpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvcHJv
cGVydHlfZXZlbnRzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL21ldGEnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyX3Nl
dCcsICdlbWJlci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFs
VXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFdmVudHMsIF9lbWJlck1ldGFsT2Jz
ZXJ2ZXJfc2V0LCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFy
IFBST1BFUlRZX0RJRF9DSEFOR0UgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdQUk9QRVJU
WV9ESURfQ0hBTkdFJyk7CisKKyAgZXhwb3J0cy5QUk9QRVJUWV9ESURfQ0hBTkdFID0gUFJPUEVS
VFlfRElEX0NIQU5HRTsKKyAgdmFyIGJlZm9yZU9ic2VydmVyU2V0ID0gbmV3IF9lbWJlck1ldGFs
T2JzZXJ2ZXJfc2V0LmRlZmF1bHQoKTsKKyAgdmFyIG9ic2VydmVyU2V0ID0gbmV3IF9lbWJlck1l
dGFsT2JzZXJ2ZXJfc2V0LmRlZmF1bHQoKTsKKyAgdmFyIGRlZmVycmVkID0gMDsKKworICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
CisgIC8vIFBST1BFUlRZIENIQU5HRVMKKyAgLy8KKworICAvKioKKyAgICBUaGlzIGZ1bmN0aW9u
IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhbiBvYmplY3QgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh
bmdlLgorICAgIEl0IHdpbGwgbm90aWZ5IGFueSBiZWZvcmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJl
IGNhY2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCisgIAorICAgIE5vcm1hbGx5IHlvdSB3aWxsIG5v
dCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgYnV0IGlmIGZvciBzb21lCisgICAg
cmVhc29uIHlvdSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4gaW52b2tl
IHRoaXMgbWV0aG9kCisgICAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVydHlEaWRD
aGFuZ2UoKWAgd2hpY2ggeW91IHNob3VsZCBjYWxsIGp1c3QKKyAgICBhZnRlciB0aGUgcHJvcGVy
dHkgdmFsdWUgY2hhbmdlcy4KKyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eVdpbGxDaGFuZ2UKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhl
IHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU
aGUgcHJvcGVydHkga2V5IChvciBwYXRoKSB0aGF0IHdpbGwgY2hhbmdlLgorICAgIEByZXR1cm4g
e3ZvaWR9CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZnVuY3Rpb24gcHJvcGVydHlXaWxsQ2hhbmdl
KG9iaiwga2V5TmFtZSkgeworICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9i
aik7CisgICAgdmFyIHdhdGNoaW5nID0gbSAmJiBtLnBlZWtXYXRjaGluZyhrZXlOYW1lKSA+IDAg
fHwga2V5TmFtZSA9PT0gJ2xlbmd0aCc7CisgICAgdmFyIHByb3RvID0gbSAmJiBtLnByb3RvOwor
ICAgIHZhciBwb3NzaWJsZURlc2MgPSBvYmpba2V5TmFtZV07CisgICAgdmFyIGRlc2MgPSBwb3Nz
aWJsZURlc2MgIT09IG51bGwgJiYgdHlwZW9mIHBvc3NpYmxlRGVzYyA9PT0gJ29iamVjdCcgJiYg
cG9zc2libGVEZXNjLmlzRGVzY3JpcHRvciA/IHBvc3NpYmxlRGVzYyA6IHVuZGVmaW5lZDsKKwor
ICAgIGlmICghd2F0Y2hpbmcpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHJv
dG8gPT09IG9iaikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkZXNjICYmIGRl
c2Mud2lsbENoYW5nZSkgeworICAgICAgZGVzYy53aWxsQ2hhbmdlKG9iaiwga2V5TmFtZSk7Cisg
ICAgfQorCisgICAgZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKKyAg
ICBjaGFpbnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7CisgICAgbm90aWZ5QmVmb3JlT2Jz
ZXJ2ZXJzKG9iaiwga2V5TmFtZSk7CisgIH0KKworICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlz
IGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KKyAgICBJ
dCB3aWxsIG5vdGlmeSBhbnkgb2JzZXJ2ZXJzIGFuZCBjbGVhciBjYWNoZXMgYW1vbmcgb3RoZXIg
dGhpbmdzLgorICAKKyAgICBOb3JtYWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMg
bWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Igc29tZQorICAgIHJlYXNvbiB5b3UgY2FuJ3QgZGly
ZWN0bHkgd2F0Y2ggYSBwcm9wZXJ0eSB5b3UgY2FuIGludm9rZSB0aGlzIG1ldGhvZAorICAgIG1h
bnVhbGx5IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSgpYCB3aGljaCB5b3Ug
c2hvdWxkIGNhbGwganVzdAorICAgIGJlZm9yZSB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4K
KyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eURpZENoYW5nZQorICAgIEBmb3IgRW1iZXIKKyAgICBA
cGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydHkgdGhhdCB3aWxs
IGNoYW5nZQorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgKG9y
IHBhdGgpIHRoYXQgd2lsbCBjaGFuZ2UuCisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHJpdmF0
ZQorICAqLworICBmdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpIHsKKyAg
ICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIHZhciB3YXRjaGlu
ZyA9IG0gJiYgbS5wZWVrV2F0Y2hpbmcoa2V5TmFtZSkgPiAwIHx8IGtleU5hbWUgPT09ICdsZW5n
dGgnOworICAgIHZhciBwcm90byA9IG0gJiYgbS5wcm90bzsKKyAgICB2YXIgcG9zc2libGVEZXNj
ID0gb2JqW2tleU5hbWVdOworICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYm
IHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2Ny
aXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICBpZiAocHJvdG8gPT09IG9i
aikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHNob3VsZG4ndCB0aGlzIG1lYW4g
dGhhdCB3ZSdyZSB3YXRjaGluZyB0aGlzIGtleT8KKyAgICBpZiAoZGVzYyAmJiBkZXNjLmRpZENo
YW5nZSkgeworICAgICAgZGVzYy5kaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKTsKKyAgICB9CisKKyAg
ICBpZiAob2JqW1BST1BFUlRZX0RJRF9DSEFOR0VdKSB7CisgICAgICBvYmpbUFJPUEVSVFlfRElE
X0NIQU5HRV0oa2V5TmFtZSk7CisgICAgfQorCisgICAgaWYgKCF3YXRjaGluZyAmJiBrZXlOYW1l
ICE9PSAnbGVuZ3RoJykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtICYmIG0u
aGFzRGVwcyhrZXlOYW1lKSkgeworICAgICAgZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGtl
eU5hbWUsIG0pOworICAgIH0KKworICAgIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0s
IGZhbHNlKTsKKyAgICBub3RpZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKKyAgfQorCisgIHZh
ciBXSUxMX1NFRU4sIERJRF9TRUVOOworICAvLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBp
cyBhYm91dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNhY2hlIG9mIGFueSBkZXBlbmRlbnQga2V5
cyAoYW5kIG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9mIGNoYW5nZXMsIGV0Yy4uLikKKyAgZnVu
Y3Rpb24gZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBkZXBLZXksIG1ldGEpIHsKKyAgICBp
ZiAob2JqLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICht
ZXRhICYmIG1ldGEuaGFzRGVwcyhkZXBLZXkpKSB7CisgICAgICB2YXIgc2VlbiA9IFdJTExfU0VF
TjsKKyAgICAgIHZhciB0b3AgPSAhc2VlbjsKKworICAgICAgaWYgKHRvcCkgeworICAgICAgICBz
ZWVuID0gV0lMTF9TRUVOID0ge307CisgICAgICB9CisKKyAgICAgIGl0ZXJEZXBzKHByb3BlcnR5
V2lsbENoYW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOworCisgICAgICBpZiAodG9wKSB7
CisgICAgICAgIFdJTExfU0VFTiA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8g
Y2FsbGVkIHdoZW5ldmVyIGEgcHJvcGVydHkgaGFzIGp1c3QgY2hhbmdlZCB0byB1cGRhdGUgZGVw
ZW5kZW50IGtleXMKKyAgZnVuY3Rpb24gZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRlcEtl
eSwgbWV0YSkgeworICAgIGlmIChvYmouaXNEZXN0cm95aW5nKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKG1ldGEgJiYgbWV0YS5oYXNEZXBzKGRlcEtleSkpIHsKKyAgICAgIHZh
ciBzZWVuID0gRElEX1NFRU47CisgICAgICB2YXIgdG9wID0gIXNlZW47CisKKyAgICAgIGlmICh0
b3ApIHsKKyAgICAgICAgc2VlbiA9IERJRF9TRUVOID0ge307CisgICAgICB9CisKKyAgICAgIGl0
ZXJEZXBzKHByb3BlcnR5RGlkQ2hhbmdlLCBvYmosIGRlcEtleSwgc2VlbiwgbWV0YSk7CisKKyAg
ICAgIGlmICh0b3ApIHsKKyAgICAgICAgRElEX1NFRU4gPSBudWxsOworICAgICAgfQorICAgIH0K
KyAgfQorCisgIGZ1bmN0aW9uIGl0ZXJEZXBzKG1ldGhvZCwgb2JqLCBkZXBLZXksIHNlZW4sIG1l
dGEpIHsKKyAgICB2YXIgcG9zc2libGVEZXNjLCBkZXNjOworICAgIHZhciBndWlkID0gX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKG9iaik7CisgICAgdmFyIGN1cnJlbnQgPSBzZWVuW2d1aWRdOwor
CisgICAgaWYgKCFjdXJyZW50KSB7CisgICAgICBjdXJyZW50ID0gc2VlbltndWlkXSA9IHt9Owor
ICAgIH0KKworICAgIGlmIChjdXJyZW50W2RlcEtleV0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBjdXJyZW50W2RlcEtleV0gPSB0cnVlOworCisgICAgbWV0YS5mb3JFYWNoSW5EZXBz
KGRlcEtleSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwb3NzaWJsZURlc2MgPSBvYmpba2V5XTsK
KyAgICAgIGRlc2MgPSBwb3NzaWJsZURlc2MgIT09IG51bGwgJiYgdHlwZW9mIHBvc3NpYmxlRGVz
YyA9PT0gJ29iamVjdCcgJiYgcG9zc2libGVEZXNjLmlzRGVzY3JpcHRvciA/IHBvc3NpYmxlRGVz
YyA6IHVuZGVmaW5lZDsKKworICAgICAgaWYgKGRlc2MgJiYgZGVzYy5fc3VzcGVuZGVkID09PSBv
YmopIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBtZXRob2Qob2JqLCBrZXkp
OworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gY2hhaW5zV2lsbENoYW5nZShvYmosIGtleU5h
bWUsIG0pIHsKKyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYg
KGMpIHsKKyAgICAgIGMubm90aWZ5KGtleU5hbWUsIGZhbHNlLCBwcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUs
IG0pIHsKKyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYgKGMp
IHsKKyAgICAgIGMubm90aWZ5KGtleU5hbWUsIHRydWUsIHByb3BlcnR5RGlkQ2hhbmdlKTsKKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBvdmVycmlkZUNoYWlucyhvYmosIGtleU5hbWUsIG0pIHsK
KyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYgKGMpIHsKKyAg
ICAgIGMucmV2YWxpZGF0ZShrZXlOYW1lKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICBAbWV0
aG9kIGJlZ2luUHJvcGVydHlDaGFuZ2VzCisgICAgQGNoYWluYWJsZQorICAgIEBwcml2YXRlCisg
ICovCisgIGZ1bmN0aW9uIGJlZ2luUHJvcGVydHlDaGFuZ2VzKCkgeworICAgIGRlZmVycmVkKys7
CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcworICAgIEBwcml2
YXRlCisgICovCisgIGZ1bmN0aW9uIGVuZFByb3BlcnR5Q2hhbmdlcygpIHsKKyAgICBkZWZlcnJl
ZC0tOworICAgIGlmIChkZWZlcnJlZCA8PSAwKSB7CisgICAgICBiZWZvcmVPYnNlcnZlclNldC5j
bGVhcigpOworICAgICAgb2JzZXJ2ZXJTZXQuZmx1c2goKTsKKyAgICB9CisgIH0KKworICAvKioK
KyAgICBNYWtlIGEgc2VyaWVzIG9mIHByb3BlcnR5IGNoYW5nZXMgdG9nZXRoZXIgaW4gYW4KKyAg
ICBleGNlcHRpb24tc2FmZSB3YXkuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5j
aGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgeworICAgICAgb2JqMS5zZXQoJ2ZvbycsIG1heUJs
b3dVcFdoZW5TZXQpOworICAgICAgb2JqMi5zZXQoJ2JhcicsIGJheik7CisgICAgfSk7CisgICAg
YGBgCisgIAorICAgIEBtZXRob2QgY2hhbmdlUHJvcGVydGllcworICAgIEBwYXJhbSB7RnVuY3Rp
b259IGNhbGxiYWNrCisgICAgQHBhcmFtIFtiaW5kaW5nXQorICAgIEBwcml2YXRlCisgICovCisg
IGZ1bmN0aW9uIGNoYW5nZVByb3BlcnRpZXMoY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICBiZWdp
blByb3BlcnR5Q2hhbmdlcygpOworICAgIHRyeSB7CisgICAgICBjYWxsYmFjay5jYWxsKGJpbmRp
bmcpOworICAgIH0gZmluYWxseSB7CisgICAgICBlbmRQcm9wZXJ0eUNoYW5nZXMuY2FsbChiaW5k
aW5nKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBub3RpZnlCZWZvcmVPYnNlcnZlcnMob2Jq
LCBrZXlOYW1lKSB7CisgICAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsKKyAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICB2YXIgZXZlbnROYW1lID0ga2V5TmFtZSArICc6YmVmb3JlJzsKKyAgICB2
YXIgbGlzdGVuZXJzLCBhZGRlZDsKKyAgICBpZiAoZGVmZXJyZWQpIHsKKyAgICAgIGxpc3RlbmVy
cyA9IGJlZm9yZU9ic2VydmVyU2V0LmFkZChvYmosIGtleU5hbWUsIGV2ZW50TmFtZSk7CisgICAg
ICBhZGRlZCA9IF9lbWJlck1ldGFsRXZlbnRzLmFjY3VtdWxhdGVMaXN0ZW5lcnMob2JqLCBldmVu
dE5hbWUsIGxpc3RlbmVycyk7CisgICAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQob2Jq
LCBldmVudE5hbWUsIFtvYmosIGtleU5hbWVdLCBhZGRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAg
IF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFt
ZV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG5vdGlmeU9ic2VydmVycyhvYmosIGtleU5h
bWUpIHsKKyAgICBpZiAob2JqLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIHZhciBldmVudE5hbWUgPSBrZXlOYW1lICsgJzpjaGFuZ2UnOworICAgIHZhciBsaXN0
ZW5lcnM7CisgICAgaWYgKGRlZmVycmVkKSB7CisgICAgICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNl
dC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOworICAgICAgX2VtYmVyTWV0YWxFdmVudHMu
YWNjdW11bGF0ZUxpc3RlbmVycyhvYmosIGV2ZW50TmFtZSwgbGlzdGVuZXJzKTsKKyAgICB9IGVs
c2UgeworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBb
b2JqLCBrZXlOYW1lXSk7CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5wcm9wZXJ0eVdpbGxDaGFu
Z2UgPSBwcm9wZXJ0eVdpbGxDaGFuZ2U7CisgIGV4cG9ydHMucHJvcGVydHlEaWRDaGFuZ2UgPSBw
cm9wZXJ0eURpZENoYW5nZTsKKyAgZXhwb3J0cy5vdmVycmlkZUNoYWlucyA9IG92ZXJyaWRlQ2hh
aW5zOworICBleHBvcnRzLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVnaW5Qcm9wZXJ0eUNoYW5n
ZXM7CisgIGV4cG9ydHMuZW5kUHJvcGVydHlDaGFuZ2VzID0gZW5kUHJvcGVydHlDaGFuZ2VzOwor
ICBleHBvcnRzLmNoYW5nZVByb3BlcnRpZXMgPSBjaGFuZ2VQcm9wZXJ0aWVzOworfSk7Citlbmlm
ZWQoJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9k
ZWJ1ZycsICdlbWJlci1tZXRhbC9wYXRoX2NhY2hlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFBhdGhfY2FjaGUpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXItbWV0YWwKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXQgPSBn
ZXQ7CisgIGV4cG9ydHMuX2dldFBhdGggPSBfZ2V0UGF0aDsKKyAgZXhwb3J0cy5nZXRXaXRoRGVm
YXVsdCA9IGdldFdpdGhEZWZhdWx0OworCisgIHZhciBBTExPV0FCTEVfVFlQRVMgPSB7CisgICAg
b2JqZWN0OiB0cnVlLAorICAgIGZ1bmN0aW9uOiB0cnVlLAorICAgIHN0cmluZzogdHJ1ZQorICB9
OworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gR0VUIEFORCBTRVQKKyAgLy8KKyAgLy8gSWYgd2UgYXJlIG9uIGEg
cGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIHVzZSB0aG9zZS4KKyAgLy8g
T3RoZXJ3aXNlIHNpbXVsYXRlIGFjY2Vzc29ycyBieSBsb29raW5nIHVwIHRoZSBwcm9wZXJ0eSBk
aXJlY3RseSBvbiB0aGUKKyAgLy8gb2JqZWN0LgorCisgIC8qKgorICAgIEdldHMgdGhlIHZhbHVl
IG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0ZWQs
CisgICAgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZC4gSWYgdGhlIHByb3BlcnR5IGlzIG5v
dCBkZWZpbmVkIGJ1dCB0aGUKKyAgICBvYmplY3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Qcm9w
ZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQuCisgIAorICAgIElmIHlvdSBw
bGFuIHRvIHJ1biBvbiBJRTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2Ug
dGhpcworICAgIG1ldGhvZCBhbnl0aW1lIHlvdSB3YW50IHRvIHJldHJpZXZlIGEgcHJvcGVydHkg
b24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0CisgICAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRl
LiAoUHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlICdfJworICAgIGFyZSBj
b25zaWRlcmVkIHByaXZhdGUuKQorICAKKyAgICBPbiBhbGwgbmV3ZXIgYnJvd3NlcnMsIHlvdSBv
bmx5IG5lZWQgdG8gdXNlIHRoaXMgbWV0aG9kIHRvIHJldHJpZXZlCisgICAgcHJvcGVydGllcyBp
ZiB0aGUgcHJvcGVydHkgbWlnaHQgbm90IGJlIGRlZmluZWQgb24gdGhlIG9iamVjdCBhbmQgeW91
IHdhbnQKKyAgICB0byByZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5YCBoYW5kbGVyLiBPdGhl
cndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcworICAgIG1ldGhvZC4KKyAgCisgICAgTm90ZSB0aGF0
IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRlZmluZWRgLCB0aGlzIG1ldGhvZCB3aWxsIHRo
cm93CisgICAgYW4gZXJyb3IuCisgIAorICAgIEBtZXRob2QgZ2V0CisgICAgQGZvciBFbWJlcgor
ICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSBmcm9tLgorICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmV0cmlldmUKKyAg
ICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBgbnVsbGAuCisgICAgQHB1
YmxpYworICAqLworCisgIGZ1bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKKyAgICBfZW1iZXJN
ZXRhbERlYnVnLmFzc2VydCgnR2V0IG11c3QgYmUgY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czsg
YW4gb2JqZWN0IGFuZCBhIHByb3BlcnR5IGtleScsIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpOwor
ICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgY2FsbCBnZXQgd2l0aCBcJycgKyBr
ZXlOYW1lICsgJ1wnIG9uIGFuIHVuZGVmaW5lZCBvYmplY3QuJywgb2JqICE9PSB1bmRlZmluZWQg
JiYgb2JqICE9PSBudWxsKTsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGtleSBw
cm92aWRlZCB0byBnZXQgbXVzdCBiZSBhIHN0cmluZywgeW91IHBhc3NlZCAnICsga2V5TmFtZSwg
dHlwZW9mIGtleU5hbWUgPT09ICdzdHJpbmcnKTsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnXCd0aGlzXCcgaW4gcGF0aHMgaXMgbm90IHN1cHBvcnRlZCcsICFfZW1iZXJNZXRhbFBhdGhf
Y2FjaGUuaGFzVGhpcyhrZXlOYW1lKSk7CisKKyAgICAvLyBIZWxwZXJzIHRoYXQgb3BlcmF0ZSB3
aXRoICd0aGlzJyB3aXRoaW4gYW4gI2VhY2gKKyAgICBpZiAoa2V5TmFtZSA9PT0gJycpIHsKKyAg
ICAgIHJldHVybiBvYmo7CisgICAgfQorCisgICAgdmFyIHZhbHVlID0gb2JqW2tleU5hbWVdOwor
ICAgIHZhciBkZXNjID0gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0
JyAmJiB2YWx1ZS5pc0Rlc2NyaXB0b3IgPyB2YWx1ZSA6IHVuZGVmaW5lZDsKKyAgICB2YXIgcmV0
OworCisgICAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiBfZW1iZXJNZXRhbFBhdGhfY2FjaGUu
aXNQYXRoKGtleU5hbWUpKSB7CisgICAgICByZXR1cm4gX2dldFBhdGgob2JqLCBrZXlOYW1lKTsK
KyAgICB9CisKKyAgICBpZiAoZGVzYykgeworICAgICAgcmV0dXJuIGRlc2MuZ2V0KG9iaiwga2V5
TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IHZhbHVlOworCisgICAgICBpZiAocmV0
ID09PSB1bmRlZmluZWQgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGlu
IG9iaikgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai51bmtub3duUHJvcGVydHkpIHsKKyAg
ICAgICAgcmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7CisgICAgICB9CisKKyAg
ICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gX2dldFBhdGgocm9vdCwg
cGF0aCkgeworICAgIHZhciBvYmogPSByb290OworICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQo
Jy4nKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKKyAg
ICAgIGlmICghaXNHZXR0YWJsZShvYmopKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Cisg
ICAgICB9CisKKyAgICAgIG9iaiA9IGdldChvYmosIHBhcnRzW2ldKTsKKworICAgICAgaWYgKG9i
aiAmJiBvYmouaXNEZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgZnVuY3Rpb24gaXNHZXR0YWJs
ZShvYmopIHsKKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gQUxMT1dBQkxFX1RZUEVTW3R5cGVvZiBvYmpdOworICB9CisKKyAg
LyoqCisgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGZyb20gYW4gT2JqZWN0
LCBvciBhIGRlZmF1bHQgdmFsdWUgaW4gdGhlCisgICAgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eSBy
ZXR1cm5zIGB1bmRlZmluZWRgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuZ2V0
V2l0aERlZmF1bHQocGVyc29uLCAnbGFzdE5hbWUnLCAnRG9lJyk7CisgICAgYGBgCisgIAorICAg
IEBtZXRob2QgZ2V0V2l0aERlZmF1bHQKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIGZyb20uCisgICAgQHBhcmFtIHtTdHJpbmd9
IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCisgICAgQHBhcmFt
IHtPYmplY3R9IGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0
eSB2YWx1ZSBpcyB1bmRlZmluZWQKKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBwcm9wZXJ0eSB2
YWx1ZSBvciB0aGUgZGVmYXVsdFZhbHVlLgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biBnZXRXaXRoRGVmYXVsdChyb290LCBrZXksIGRlZmF1bHRWYWx1ZSkgeworICAgIHZhciB2YWx1
ZSA9IGdldChyb290LCBrZXkpOworCisgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAg
ICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGdldDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9zZXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
ZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3Bl
cnR5X2V2ZW50cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1t
ZXRhbC91dGlscycsICdlbWJlci1tZXRhbC90YWdzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2Vt
YmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxQYXRoX2NhY2hlLCBfZW1iZXJNZXRhbE1ldGEsIF9l
bWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsVGFncykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5zZXQgPSBzZXQ7CisgIGV4cG9ydHMudHJ5U2V0ID0gdHJ5U2V0OworCisgIC8qKgor
ICAgIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LCByZXNwZWN0aW5n
IGNvbXB1dGVkIHByb3BlcnRpZXMKKyAgICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBhbmQgb3Ro
ZXIgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIElmIHRoZQorICAgIHByb3BlcnR5IGlzIG5vdCBk
ZWZpbmVkIGJ1dCB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBzZXRVbmtub3duUHJvcGVydHlg
CisgICAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQgYXMgd2VsbC4KKyAgCisgICAg
QG1ldGhvZCBzZXQKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUg
b2JqZWN0IHRvIG1vZGlmeS4KKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVy
dHkga2V5IHRvIHNldAorICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0
CisgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIHZhbHVlLgorICAgIEBwdWJsaWMKKyAg
Ki8KKworICBmdW5jdGlvbiBzZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSwgdG9sZXJhbnQpIHsKKyAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnU2V0IG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWUg
b3IgZm91ciBhcmd1bWVudHM7IGFuIG9iamVjdCwgYSBwcm9wZXJ0eSBrZXksIGEgdmFsdWUgYW5k
IHRvbGVyYW50IHRydWUvZmFsc2UnLCBhcmd1bWVudHMubGVuZ3RoID09PSAzIHx8IGFyZ3VtZW50
cy5sZW5ndGggPT09IDQpOworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgY2Fs
bCBzZXQgd2l0aCBcJycgKyBrZXlOYW1lICsgJ1wnIG9uIGFuIHVuZGVmaW5lZCBvYmplY3QuJywg
b2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsKTsKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydCgnVGhlIGtleSBwcm92aWRlZCB0byBzZXQgbXVzdCBiZSBhIHN0cmluZywgeW91IHBh
c3NlZCAnICsga2V5TmFtZSwgdHlwZW9mIGtleU5hbWUgPT09ICdzdHJpbmcnKTsKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnXCd0aGlzXCcgaW4gcGF0aHMgaXMgbm90IHN1cHBvcnRlZCcs
ICFfZW1iZXJNZXRhbFBhdGhfY2FjaGUuaGFzVGhpcyhrZXlOYW1lKSk7CisKKyAgICB2YXIgbWV0
YSA9IHVuZGVmaW5lZCwKKyAgICAgICAgcG9zc2libGVEZXNjID0gdW5kZWZpbmVkLAorICAgICAg
ICBkZXNjID0gdW5kZWZpbmVkOworCisgICAgaWYgKG9iaikgeworICAgICAgbWV0YSA9IF9lbWJl
ck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgICAgcG9zc2libGVEZXNjID0gb2JqW2tleU5h
bWVdOworICAgICAgZGVzYyA9IHBvc3NpYmxlRGVzYyAhPT0gbnVsbCAmJiB0eXBlb2YgcG9zc2li
bGVEZXNjID09PSAnb2JqZWN0JyAmJiBwb3NzaWJsZURlc2MuaXNEZXNjcmlwdG9yID8gcG9zc2li
bGVEZXNjIDogdW5kZWZpbmVkOworICAgICAgX2VtYmVyTWV0YWxUYWdzLm1hcmtPYmplY3RBc0Rp
cnR5KG1ldGEpOworICAgIH0KKworICAgIHZhciBpc1Vua25vd24sIGN1cnJlbnRWYWx1ZTsKKyAg
ICBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkICYmIF9lbWJlck1ldGFsUGF0aF9jYWNoZS5pc1BhdGgo
a2V5TmFtZSkpIHsKKyAgICAgIHJldHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRv
bGVyYW50KTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY2FsbGluZyBz
ZXQgb24gZGVzdHJveWVkIG9iamVjdDogJyArIF9lbWJlck1ldGFsVXRpbHMudG9TdHJpbmcob2Jq
KSArICcuJyArIGtleU5hbWUgKyAnID0gJyArIF9lbWJlck1ldGFsVXRpbHMudG9TdHJpbmcodmFs
dWUpLCAhb2JqLmlzRGVzdHJveWVkKTsKKworICAgIGlmIChkZXNjKSB7CisgICAgICBkZXNjLnNl
dChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHZhbHVlICE9
PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqW2tleU5hbWVdID09
PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlzVW5r
bm93biA9ICdvYmplY3QnID09PSB0eXBlb2Ygb2JqICYmICEoa2V5TmFtZSBpbiBvYmopOworCisg
ICAgICAvLyBzZXRVbmtub3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlzIGFuIG9iamVj
dCwKKyAgICAgIC8vIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBhbmQgdGhl
CisgICAgICAvLyBgc2V0VW5rbm93blByb3BlcnR5YCBtZXRob2QgZXhpc3RzIG9uIHRoZSBvYmpl
Y3QKKyAgICAgIGlmIChpc1Vua25vd24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZXRV
bmtub3duUHJvcGVydHkpIHsKKyAgICAgICAgb2JqLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1l
LCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKG1ldGEgJiYgbWV0YS5wZWVrV2F0Y2hpbmcoa2V5
TmFtZSkgPiAwKSB7CisgICAgICAgIGlmIChtZXRhLnByb3RvICE9PSBvYmopIHsKKyAgICAgICAg
ICBjdXJyZW50VmFsdWUgPSBvYmpba2V5TmFtZV07CisgICAgICAgIH0KKyAgICAgICAgLy8gb25s
eSB0cmlnZ2VyIGEgY2hhbmdlIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAorICAgICAgICBpZiAo
dmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlf
ZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZShvYmosIGtleU5hbWUpOworCisgICAgICAgICAgaWYg
KGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5TmFtZSBpbiBvYmopIHx8ICFPYmpl
Y3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBrZXlOYW1lKSkgewor
ICAgICAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLmRlZmluZVByb3BlcnR5KG9iaiwga2V5
TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkgc2V0dGVyCisgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBfZW1iZXJNZXRhbFV0aWxz
Lmxvb2t1cERlc2NyaXB0b3Iob2JqLCBrZXlOYW1lKTsKKyAgICAgICAgICAgICAgdmFyIGlzTWFu
ZGF0b3J5U2V0dGVyID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnNldCAmJiBkZXNjcmlwdG9y
LnNldC5pc01hbmRhdG9yeVNldHRlcjsKKyAgICAgICAgICAgICAgaWYgKGlzTWFuZGF0b3J5U2V0
dGVyKSB7CisgICAgICAgICAgICAgICAgbWV0YS53cml0ZVZhbHVlcyhrZXlOYW1lLCB2YWx1ZSk7
CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2JqW2tleU5hbWVdID0g
dmFsdWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5RGlkQ2hhbmdlKG9iaiwga2V5TmFtZSk7Cisg
ICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9ialtrZXlOYW1lXSA9IHZhbHVlOwor
ICAgICAgICBpZiAob2JqW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BFUlRZX0RJRF9D
SEFOR0VdKSB7CisgICAgICAgICAgb2JqW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BF
UlRZX0RJRF9DSEFOR0VdKGtleU5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHNldFBhdGgocm9vdCwgcGF0aCwgdmFs
dWUsIHRvbGVyYW50KSB7CisgICAgdmFyIGtleU5hbWU7CisKKyAgICAvLyBnZXQgdGhlIGxhc3Qg
cGFydCBvZiB0aGUgcGF0aAorICAgIGtleU5hbWUgPSBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4
T2YoJy4nKSArIDEpOworCisgICAgLy8gZ2V0IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXJ0Cisg
ICAgcGF0aCA9IHBhdGggPT09IGtleU5hbWUgPyBrZXlOYW1lIDogcGF0aC5zbGljZSgwLCBwYXRo
Lmxlbmd0aCAtIChrZXlOYW1lLmxlbmd0aCArIDEpKTsKKworICAgIC8vIHVubGVzcyB0aGUgcGF0
aCBpcyB0aGlzLCBsb29rIHVwIHRoZSBmaXJzdCBwYXJ0IHRvCisgICAgLy8gZ2V0IHRoZSByb290
CisgICAgaWYgKHBhdGggIT09ICd0aGlzJykgeworICAgICAgcm9vdCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0Ll9nZXRQYXRoKHJvb3QsIHBhdGgpOworICAgIH0KKworICAgIGlmICgha2V5TmFt
ZSB8fCBrZXlOYW1lLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFs
RXJyb3IuZGVmYXVsdCgnUHJvcGVydHkgc2V0IGZhaWxlZDogWW91IHBhc3NlZCBhbiBlbXB0eSBw
YXRoJyk7CisgICAgfQorCisgICAgaWYgKCFyb290KSB7CisgICAgICBpZiAodG9sZXJhbnQpIHsK
KyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJl
ck1ldGFsRXJyb3IuZGVmYXVsdCgnUHJvcGVydHkgc2V0IGZhaWxlZDogb2JqZWN0IGluIHBhdGgg
IicgKyBwYXRoICsgJyIgY291bGQgbm90IGJlIGZvdW5kIG9yIHdhcyBkZXN0cm95ZWQuJyk7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNldChyb290LCBrZXlOYW1lLCB2YWx1ZSk7Cisg
IH0KKworICAvKioKKyAgICBFcnJvci10b2xlcmFudCBmb3JtIG9mIGBFbWJlci5zZXRgLiBXaWxs
IG5vdCBibG93IHVwIGlmIGFueSBwYXJ0IG9mIHRoZQorICAgIGNoYWluIGlzIGB1bmRlZmluZWRg
LCBgbnVsbGAsIG9yIGRlc3Ryb3llZC4KKyAgCisgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3
aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1heSB0cnkgdG8gdXBkYXRlIGFmdGVyCisgICAg
YW4gb2JqZWN0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgCisgICAgQG1ldGhvZCB0cnlTZXQKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBtb2Rp
ZnkuCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gc2V0Cisg
ICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKKyAgICBAcHVibGljCisg
ICovCisKKyAgZnVuY3Rpb24gdHJ5U2V0KHJvb3QsIHBhdGgsIHZhbHVlKSB7CisgICAgcmV0dXJu
IHNldChyb290LCBwYXRoLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KK30pOworZW5pZmVkKCJlbWJlci1t
ZXRhbC9yZXBsYWNlIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ug
c3RyaWN0IjsKKworICBleHBvcnRzLl9yZXBsYWNlID0gX3JlcGxhY2U7CisgIGV4cG9ydHMuZGVm
YXVsdCA9IHJlcGxhY2U7CisgIHZhciBzcGxpY2UgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlOwor
CisgIGZ1bmN0aW9uIF9yZXBsYWNlKGFycmF5LCBpZHgsIGFtdCwgb2JqZWN0cykgeworICAgIHZh
ciBhcmdzID0gW10uY29uY2F0KG9iamVjdHMpOworICAgIHZhciByZXQgPSBbXTsKKyAgICAvLyBo
dHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTY1ODgK
KyAgICB2YXIgc2l6ZSA9IDYwMDAwOworICAgIHZhciBzdGFydCA9IGlkeDsKKyAgICB2YXIgZW5k
cyA9IGFtdDsKKyAgICB2YXIgY291bnQsIGNodW5rOworCisgICAgd2hpbGUgKGFyZ3MubGVuZ3Ro
KSB7CisgICAgICBjb3VudCA9IGVuZHMgPiBzaXplID8gc2l6ZSA6IGVuZHM7CisgICAgICBpZiAo
Y291bnQgPD0gMCkgeworICAgICAgICBjb3VudCA9IDA7CisgICAgICB9CisKKyAgICAgIGNodW5r
ID0gYXJncy5zcGxpY2UoMCwgc2l6ZSk7CisgICAgICBjaHVuayA9IFtzdGFydCwgY291bnRdLmNv
bmNhdChjaHVuayk7CisKKyAgICAgIHN0YXJ0ICs9IHNpemU7CisgICAgICBlbmRzIC09IGNvdW50
OworCisgICAgICByZXQgPSByZXQuY29uY2F0KHNwbGljZS5hcHBseShhcnJheSwgY2h1bmspKTsK
KyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qKgorICAgIFJlcGxhY2VzIG9iamVj
dHMgaW4gYW4gYXJyYXkgd2l0aCB0aGUgcGFzc2VkIG9iamVjdHMuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIHZhciBhcnJheSA9IFsxLDIsM107CisgICAgICBFbWJlci5FbnVtZXJhYmxl
VXRpbHMucmVwbGFjZShhcnJheSwgMSwgMiwgWzQsIDVdKTsgLy8gWzEsIDQsIDVdCisgIAorICAg
ICAgdmFyIGFycmF5ID0gWzEsMiwzXTsKKyAgICAgIEVtYmVyLkVudW1lcmFibGVVdGlscy5yZXBs
YWNlKGFycmF5LCAxLCAxLCBbNCwgNV0pOyAvLyBbMSwgNCwgNSwgM10KKyAgCisgICAgICB2YXIg
YXJyYXkgPSBbMSwyLDNdOworICAgICAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2UoYXJy
YXksIDEwLCAxLCBbNCwgNV0pOyAvLyBbMSwgMiwgMywgNCwgNV0KKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCByZXBsYWNlCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAcGFyYW0ge0FycmF5fSBhcnJh
eSBUaGUgYXJyYXkgdGhlIG9iamVjdHMgc2hvdWxkIGJlIGluc2VydGVkIGludG8uCisgICAgQHBh
cmFtIHtOdW1iZXJ9IGlkeCBTdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdG8gcmVwbGFjZS4g
SWYgKmlkeCogPj0KKyAgICBsZW5ndGgsIHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFy
cmF5LgorICAgIEBwYXJhbSB7TnVtYmVyfSBhbXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgc2hv
dWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXksCisgICAgc3RhcnRpbmcgYXQgKmlkeCoKKyAg
ICBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBvYmplY3Rz
IHRoYXQgc2hvdWxkIGJlCisgICAgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoKKyAg
CisgICAgQHJldHVybiB7QXJyYXl9IFRoZSBtb2RpZmllZCBhcnJheS4KKyAgICBAcHVibGljCisg
ICovCisKKyAgZnVuY3Rpb24gcmVwbGFjZShhcnJheSwgaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAg
ICBpZiAoYXJyYXkucmVwbGFjZSkgeworICAgICAgcmV0dXJuIGFycmF5LnJlcGxhY2UoaWR4LCBh
bXQsIG9iamVjdHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gX3JlcGxhY2UoYXJyYXks
IGlkeCwgYW10LCBvYmplY3RzKTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRh
bC9ydW5fbG9vcCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50
cycsICdiYWNrYnVybmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9l
bWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZXZl
bnRzLCBfYmFja2J1cm5lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gcnVuOworCisgIGZ1bmN0aW9uIG9uQmVnaW4oY3VycmVudCkgeworICAgIHJ1bi5jdXJyZW50
UnVuTG9vcCA9IGN1cnJlbnQ7CisgIH0KKworICBmdW5jdGlvbiBvbkVuZChjdXJyZW50LCBuZXh0
KSB7CisgICAgcnVuLmN1cnJlbnRSdW5Mb29wID0gbmV4dDsKKyAgfQorCisgIC8vIEVTNlRPRE86
IHNob3VsZCBCYWNrYnVybmVyIGJlY29tZSBlczY/CisgIHZhciBiYWNrYnVybmVyID0gbmV3IF9i
YWNrYnVybmVyLmRlZmF1bHQoWydzeW5jJywgJ2FjdGlvbnMnLCAnZGVzdHJveSddLCB7CisgICAg
R1VJRF9LRVk6IF9lbWJlck1ldGFsVXRpbHMuR1VJRF9LRVksCisgICAgc3luYzogeworICAgICAg
YmVmb3JlOiBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblByb3BlcnR5Q2hhbmdlcywK
KyAgICAgIGFmdGVyOiBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5lbmRQcm9wZXJ0eUNoYW5n
ZXMKKyAgICB9LAorICAgIGRlZmF1bHRRdWV1ZTogJ2FjdGlvbnMnLAorICAgIG9uQmVnaW46IG9u
QmVnaW4sCisgICAgb25FbmQ6IG9uRW5kLAorICAgIG9uRXJyb3JUYXJnZXQ6IF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LAorICAgIG9uRXJyb3JNZXRob2Q6ICdvbmVycm9yJworICB9KTsKKworICAv
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisgIC8vIHJ1biAtIHRoaXMgaXMgaWRlYWxseSB0aGUgb25seSBwdWJsaWMgQVBJIHRoZSBk
ZXYgc2VlcworICAvLworCisgIC8qKgorICAgIFJ1bnMgdGhlIHBhc3NlZCB0YXJnZXQgYW5kIG1l
dGhvZCBpbnNpZGUgb2YgYSBSdW5Mb29wLCBlbnN1cmluZyBhbnkKKyAgICBkZWZlcnJlZCBhY3Rp
b25zIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBkYXRlcyBhcmUgZmx1c2hlZCBhdCB0
aGUKKyAgICBlbmQuCisgIAorICAgIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQgdG8gaW52
b2tlIHRoaXMgbWV0aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCisgICAgeW91IGFyZSBpbXBsZW1l
bnRpbmcgcmF3IGV2ZW50IGhhbmRsZXJzIHdoZW4gaW50ZXJmYWNpbmcgd2l0aCBvdGhlcgorICAg
IGxpYnJhcmllcyBvciBwbHVnaW5zLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHdyYXAgYWxsIG9mIHlv
dXIgY29kZSBpbnNpZGUgdGhpcworICAgIGNhbGwuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBydW4oZnVuY3Rpb24oKSB7CisgICAgICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGVkIHdpdGhpbiBh
IFJ1bkxvb3AKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQGNsYXNzIHJ1bgorICAgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgICBAc3RhdGljCisgICAgQGNvbnN0cnVjdG9yCisgICAgQHBhcmFtIHtP
YmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gY2FsbAorICAgIEBwYXJhbSB7RnVu
Y3Rpb258U3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGludm9rZS4KKyAgICAgIE1heSBiZSBhIGZ1
bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZworICAgICAgdGhlbiBpdCB3
aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KKyAgICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgeW91IHdpc2ggdG8gcGFzcyB0byB0
aGUgbWV0aG9kLgorICAgIEByZXR1cm4ge09iamVjdH0gcmV0dXJuIHZhbHVlIGZyb20gaW52b2tp
bmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
cnVuKCkgeworICAgIHJldHVybiBiYWNrYnVybmVyLnJ1bi5hcHBseShiYWNrYnVybmVyLCBhcmd1
bWVudHMpOworICB9CisKKyAgLyoqCisgICAgSWYgbm8gcnVuLWxvb3AgaXMgcHJlc2VudCwgaXQg
Y3JlYXRlcyBhIG5ldyBvbmUuIElmIGEgcnVuIGxvb3AgaXMKKyAgICBwcmVzZW50IGl0IHdpbGwg
cXVldWUgaXRzZWxmIHRvIHJ1biBvbiB0aGUgZXhpc3RpbmcgcnVuLWxvb3BzIGFjdGlvbgorICAg
IHF1ZXVlLgorICAKKyAgICBQbGVhc2Ugbm90ZTogVGhpcyBpcyBub3QgZm9yIG5vcm1hbCB1c2Fn
ZSwgYW5kIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKyAgCisgICAgSWYgaW52b2tlZCB3aGVu
IG5vdCB3aXRoaW4gYSBydW4gbG9vcDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5q
b2luKGZ1bmN0aW9uKCkgeworICAgICAgLy8gY3JlYXRlcyBhIG5ldyBydW4tbG9vcAorICAgIH0p
OworICAgIGBgYAorICAKKyAgICBBbHRlcm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGluIGFuIGV4
aXN0aW5nIHJ1biBsb29wOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuKGZ1bmN0aW9u
KCkgeworICAgICAgLy8gY3JlYXRlcyBhIG5ldyBydW4tbG9vcAorICAgICAgcnVuLmpvaW4oZnVu
Y3Rpb24oKSB7CisgICAgICAgIC8vIGpvaW5zIHdpdGggdGhlIGV4aXN0aW5nIHJ1bi1sb29wLCBh
bmQgcXVldWVzIGZvciBpbnZvY2F0aW9uIG9uCisgICAgICAgIC8vIHRoZSBleGlzdGluZyBydW4t
bG9vcHMgYWN0aW9uIHF1ZXVlLgorICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IEBtZXRob2Qgam9pbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
W3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gaW52b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24g
b3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUg
bG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJn
cypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRo
b2QuCisgICAgQHJldHVybiB7T2JqZWN0fSBSZXR1cm4gdmFsdWUgZnJvbSBpbnZva2luZyB0aGUg
cGFzc2VkIGZ1bmN0aW9uLiBQbGVhc2Ugbm90ZSwKKyAgICB3aGVuIGNhbGxlZCB3aXRoaW4gYW4g
ZXhpc3RpbmcgbG9vcCwgbm8gcmV0dXJuIHZhbHVlIGlzIHBvc3NpYmxlLgorICAgIEBwdWJsaWMK
KyAgKi8KKyAgcnVuLmpvaW4gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGJhY2tidXJuZXIu
am9pbi5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8qKgorICAgIEFs
bG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBjb250ZXh0IHRvIGNhbGwgdGhlIHNwZWNpZmllZCBm
dW5jdGlvbiBpbiB3aGlsZQorICAgIGFkZGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoYXQgZnVuY3Rp
b24gdG8gdGhlIEVtYmVyIHJ1biBsb29wLiBUaGlzIGFiaWxpdHkKKyAgICBtYWtlcyB0aGlzIG1l
dGhvZCBhIGdyZWF0IHdheSB0byBhc3luY2hyb25vdXNseSBpbnRlZ3JhdGUgdGhpcmQtcGFydHkg
bGlicmFyaWVzCisgICAgaW50byB5b3VyIEVtYmVyIGFwcGxpY2F0aW9uLgorICAKKyAgICBgcnVu
LmJpbmRgIHRha2VzIHR3byBtYWluIGFyZ3VtZW50cywgdGhlIGRlc2lyZWQgY29udGV4dCBhbmQg
dGhlIGZ1bmN0aW9uIHRvCisgICAgaW52b2tlIGluIHRoYXQgY29udGV4dC4gQW55IGFkZGl0aW9u
YWwgYXJndW1lbnRzIHdpbGwgYmUgc3VwcGxpZWQgYXMgYXJndW1lbnRzCisgICAgdG8gdGhlIGZ1
bmN0aW9uIHRoYXQgaXMgcGFzc2VkIGluLgorICAKKyAgICBMZXQncyB1c2UgdGhlIGNyZWF0aW9u
IG9mIGEgVGlueU1DRSBjb21wb25lbnQgYXMgYW4gZXhhbXBsZS4gQ3VycmVudGx5LAorICAgIFRp
bnlNQ0UgcHJvdmlkZXMgYSBzZXR1cCBjb25maWd1cmF0aW9uIG9wdGlvbiB3ZSBjYW4gdXNlIHRv
IGRvIHNvbWUgcHJvY2Vzc2luZworICAgIGFmdGVyIHRoZSBUaW55TUNFIGluc3RhbmNlIGlzIGlu
aXRpYWxpemVkIGJ1dCBiZWZvcmUgaXQgaXMgYWN0dWFsbHkgcmVuZGVyZWQuCisgICAgV2UgY2Fu
IHVzZSB0aGF0IHNldHVwIG9wdGlvbiB0byBkbyBzb21lIGFkZGl0aW9uYWwgc2V0dXAgZm9yIG91
ciBjb21wb25lbnQuCisgICAgVGhlIGNvbXBvbmVudCBpdHNlbGYgY291bGQgbG9vayBzb21ldGhp
bmcgbGlrZSB0aGUgZm9sbG93aW5nOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJp
Y2hUZXh0RWRpdG9yQ29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBp
bml0aWFsaXplVGlueU1DRTogRW1iZXIub24oJ2RpZEluc2VydEVsZW1lbnQnLCBmdW5jdGlvbigp
IHsKKyAgICAgICAgdGlueW1jZS5pbml0KHsKKyAgICAgICAgICBzZWxlY3RvcjogJyMnICsgdGhp
cy4kKCkucHJvcCgnaWQnKSwKKyAgICAgICAgICBzZXR1cDogRW1iZXIucnVuLmJpbmQodGhpcywg
dGhpcy5zZXR1cEVkaXRvcikKKyAgICAgICAgfSk7CisgICAgICB9KSwKKyAgCisgICAgICBzZXR1
cEVkaXRvcjogZnVuY3Rpb24oZWRpdG9yKSB7CisgICAgICAgIHRoaXMuc2V0KCdlZGl0b3InLCBl
ZGl0b3IpOworICAKKyAgICAgICAgZWRpdG9yLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBjaGFuZ2VkIScpOworICAgICAgICB9KTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSW4gdGhpcyBleGFtcGxlLCB3ZSB1c2Ug
RW1iZXIucnVuLmJpbmQgdG8gYmluZCB0aGUgc2V0dXBFZGl0b3IgbWV0aG9kIHRvIHRoZQorICAg
IGNvbnRleHQgb2YgdGhlIEFwcC5SaWNoVGV4dEVkaXRvckNvbXBvbmVudCBhbmQgdG8gaGF2ZSB0
aGUgaW52b2NhdGlvbiBvZiB0aGF0CisgICAgbWV0aG9kIGJlIHNhZmVseSBoYW5kbGVkIGFuZCBl
eGVjdXRlZCBieSB0aGUgRW1iZXIgcnVuIGxvb3AuCisgIAorICAgIEBtZXRob2QgYmluZAorICAg
IEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9m
IG1ldGhvZCB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRo
b2QgdG8gaW52b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlv
dSBwYXNzIGEgc3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBw
YXNzZWQgdGFyZ2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFs
IGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgQHJldHVybiB7
RnVuY3Rpb259IHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3aWxsIGFsd2F5cyBoYXZlIGEg
cGFydGljdWxhciBjb250ZXh0CisgICAgQHNpbmNlIDEuNC4wCisgICAgQHB1YmxpYworICAqLwor
ICBydW4uYmluZCA9IGZ1bmN0aW9uICgpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRz
Lmxlbmd0aCwgY3VycmllZCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9r
ZXkrKykgeworICAgICAgY3VycmllZFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisK
KyAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVu
dHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7
IF9rZXkyKyspIHsKKyAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAg
ICAgfQorCisgICAgICByZXR1cm4gcnVuLmpvaW4uYXBwbHkocnVuLCBjdXJyaWVkLmNvbmNhdChh
cmdzKSk7CisgICAgfTsKKyAgfTsKKworICBydW4uYmFja2J1cm5lciA9IGJhY2tidXJuZXI7Cisg
IHJ1bi5jdXJyZW50UnVuTG9vcCA9IG51bGw7CisgIHJ1bi5xdWV1ZXMgPSBiYWNrYnVybmVyLnF1
ZXVlTmFtZXM7CisKKyAgLyoqCisgICAgQmVnaW5zIGEgbmV3IFJ1bkxvb3AuIEFueSBkZWZlcnJl
ZCBhY3Rpb25zIGludm9rZWQgYWZ0ZXIgdGhlIGJlZ2luIHdpbGwKKyAgICBiZSBidWZmZXJlZCB1
bnRpbCB5b3UgaW52b2tlIGEgbWF0Y2hpbmcgY2FsbCB0byBgcnVuLmVuZCgpYC4gVGhpcyBpcwor
ICAgIGEgbG93ZXItbGV2ZWwgd2F5IHRvIHVzZSBhIFJ1bkxvb3AgaW5zdGVhZCBvZiB1c2luZyBg
cnVuKClgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuLmJlZ2luKCk7CisgICAgLy8g
Y29kZSB0byBiZSBleGVjdXRlZCB3aXRoaW4gYSBSdW5Mb29wCisgICAgcnVuLmVuZCgpOworICAg
IGBgYAorICAKKyAgICBAbWV0aG9kIGJlZ2luCisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHVi
bGljCisgICovCisgIHJ1bi5iZWdpbiA9IGZ1bmN0aW9uICgpIHsKKyAgICBiYWNrYnVybmVyLmJl
Z2luKCk7CisgIH07CisKKyAgLyoqCisgICAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBj
YWxsZWQgc29tZXRpbWUgYWZ0ZXIgeW91IGNhbGwKKyAgICBgcnVuLmJlZ2luKClgIHRvIGZsdXNo
IGFueSBkZWZlcnJlZCBhY3Rpb25zLiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgd2F5CisgICAgdG8g
dXNlIGEgUnVuTG9vcCBpbnN0ZWFkIG9mIHVzaW5nIGBydW4oKWAuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBydW4uYmVnaW4oKTsKKyAgICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGVkIHdpdGhp
biBhIFJ1bkxvb3AKKyAgICBydW4uZW5kKCk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZW5k
CisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5lbmQgPSBmdW5j
dGlvbiAoKSB7CisgICAgYmFja2J1cm5lci5lbmQoKTsKKyAgfTsKKworICAvKioKKyAgICBBcnJh
eSBvZiBuYW1lZCBxdWV1ZXMuIFRoaXMgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hp
Y2ggcXVldWVzCisgICAgYXJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgUnVuTG9vcC4gWW91
IGNhbiBkZWZpbmUgeW91ciBvd24gcXVldWVzIGJ5CisgICAgc2ltcGx5IGFkZGluZyB0aGUgcXVl
dWUgbmFtZSB0byB0aGlzIGFycmF5LiBOb3JtYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkCisgICAg
dG8gaW5zcGVjdCBvciBtb2RpZnkgdGhpcyBwcm9wZXJ0eS4KKyAgCisgICAgQHByb3BlcnR5IHF1
ZXVlcworICAgIEB0eXBlIEFycmF5CisgICAgQGRlZmF1bHQgWydzeW5jJywgJ2FjdGlvbnMnLCAn
ZGVzdHJveSddCisgICAgQHByaXZhdGUKKyAgKi8KKworICAvKioKKyAgICBBZGRzIHRoZSBwYXNz
ZWQgdGFyZ2V0L21ldGhvZCBhbmQgYW55IG9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgbmFtZWQK
KyAgICBxdWV1ZSB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBJZiB5
b3UgaGF2ZSBub3QgYWxyZWFkeQorICAgIHN0YXJ0ZWQgYSBSdW5Mb29wIHdoZW4gY2FsbGluZyB0
aGlzIG1ldGhvZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UKKyAgICBhdXRvbWF0aWNhbGx5
LgorICAKKyAgICBBdCB0aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMgc2NoZWR1bGVk
IGluIHRoaXMgd2F5IHdpbGwgYmUgaW52b2tlZC4KKyAgICBNZXRob2RzIHdpbGwgYmUgaW52b2tl
ZCBpbiBhbiBvcmRlciBtYXRjaGluZyB0aGUgbmFtZWQgcXVldWVzIGRlZmluZWQgaW4KKyAgICB0
aGUgYHJ1bi5xdWV1ZXNgIHByb3BlcnR5LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVu
LnNjaGVkdWxlKCdzeW5jJywgdGhpcywgZnVuY3Rpb24oKSB7CisgICAgICAvLyB0aGlzIHdpbGwg
YmUgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4gYmluZGluZ3MgYXJl
IHN5bmNlZAorICAgICAgY29uc29sZS5sb2coJ3NjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlJyk7Cisg
ICAgfSk7CisgIAorICAgIHJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIGZ1bmN0aW9uKCkg
eworICAgICAgLy8gdGhpcyB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSAnYWN0aW9ucycgcXVldWUs
IGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2VkLgorICAgICAgY29uc29sZS5sb2coJ3NjaGVkdWxl
ZCBvbiBhY3Rpb25zIHF1ZXVlJyk7CisgICAgfSk7CisgIAorICAgIC8vIE5vdGUgdGhlIGZ1bmN0
aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBiYXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4K
KyAgICAvLyBPdXRwdXQgd291bGQgYmU6CisgICAgLy8gICBzY2hlZHVsZWQgb24gc3luYyBxdWV1
ZQorICAgIC8vICAgc2NoZWR1bGVkIG9uIGFjdGlvbnMgcXVldWUKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBzY2hlZHVsZQorICAgIEBwYXJhbSB7U3RyaW5nfSBxdWV1ZSBUaGUgbmFtZSBvZiB0
aGUgcXVldWUgdG8gc2NoZWR1bGUgYWdhaW5zdC4KKyAgICAgIERlZmF1bHQgcXVldWVzIGFyZSAn
c3luYycgYW5kICdhY3Rpb25zJworICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQg
b2JqZWN0IHRvIHVzZSBhcyB0aGUgY29udGV4dCB3aGVuIGludm9raW5nIGEgbWV0aG9kLgorICAg
IEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuIElm
IHlvdSBwYXNzIGEgc3RyaW5nIGl0CisgICAgICB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZSB0YXJn
ZXQgb2JqZWN0IGF0IHRoZSB0aW1lIHRoZSBzY2hlZHVsZWQgaXRlbSBpcworICAgICAgaW52b2tl
ZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZnVuY3Rpb24uCisgICAgQHBhcmFt
IHtPYmplY3R9IFthcmd1bWVudHMqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRv
IHRoZSBxdWV1ZWQgbWV0aG9kLgorICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHB1YmxpYworICAq
LworICBydW4uc2NoZWR1bGUgPSBmdW5jdGlvbiAoKSAvKiBxdWV1ZSwgdGFyZ2V0LCBtZXRob2Qg
Ki97CisgICAgY2hlY2tBdXRvUnVuKCk7CisgICAgYmFja2J1cm5lci5zY2hlZHVsZS5hcHBseShi
YWNrYnVybmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8vIFVzZWQgYnkgZ2xvYmFsIHRlc3Qg
dGVhcmRvd24KKyAgcnVuLmhhc1NjaGVkdWxlZFRpbWVycyA9IGZ1bmN0aW9uICgpIHsKKyAgICBy
ZXR1cm4gYmFja2J1cm5lci5oYXNUaW1lcnMoKTsKKyAgfTsKKworICAvLyBVc2VkIGJ5IGdsb2Jh
bCB0ZXN0IHRlYXJkb3duCisgIHJ1bi5jYW5jZWxUaW1lcnMgPSBmdW5jdGlvbiAoKSB7CisgICAg
YmFja2J1cm5lci5jYW5jZWxUaW1lcnMoKTsKKyAgfTsKKworICAvKioKKyAgICBJbW1lZGlhdGVs
eSBmbHVzaGVzIGFueSBldmVudHMgc2NoZWR1bGVkIGluIHRoZSAnc3luYycgcXVldWUuIEJpbmRp
bmdzCisgICAgdXNlIHRoaXMgcXVldWUgc28gdGhpcyBtZXRob2QgaXMgYSB1c2VmdWwgd2F5IHRv
IGltbWVkaWF0ZWx5IGZvcmNlIGFsbAorICAgIGJpbmRpbmdzIGluIHRoZSBhcHBsaWNhdGlvbiB0
byBzeW5jLgorICAKKyAgICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYW55dGltZSB5b3Ug
bmVlZCBhbnkgY2hhbmdlZCBzdGF0ZSB0byBwcm9wYWdhdGUKKyAgICB0aHJvdWdob3V0IHRoZSBh
cHAgaW1tZWRpYXRlbHkgd2l0aG91dCByZXBhaW50aW5nIHRoZSBVSSAod2hpY2ggaGFwcGVucwor
ICAgIGluIHRoZSBsYXRlciAncmVuZGVyJyBxdWV1ZSBhZGRlZCBieSB0aGUgYGVtYmVyLXZpZXdz
YCBwYWNrYWdlKS4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5zeW5jKCk7CisgICAg
YGBgCisgIAorICAgIEBtZXRob2Qgc3luYworICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHByaXZh
dGUKKyAgKi8KKyAgcnVuLnN5bmMgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGJhY2tidXJuZXIu
Y3VycmVudEluc3RhbmNlKSB7CisgICAgICBiYWNrYnVybmVyLmN1cnJlbnRJbnN0YW5jZS5xdWV1
ZXMuc3luYy5mbHVzaCgpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICBJbnZva2VzIHRoZSBw
YXNzZWQgdGFyZ2V0L21ldGhvZCBhbmQgb3B0aW9uYWwgYXJndW1lbnRzIGFmdGVyIGEgc3BlY2lm
aWVkCisgICAgcGVyaW9kIG9mIHRpbWUuIFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlzIG1ldGhv
ZCBtdXN0IGFsd2F5cyBiZSBhIG51bWJlcgorICAgIG9mIG1pbGxpc2Vjb25kcy4KKyAgCisgICAg
WW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUg
YWN0aW9uIGFmdGVyIGEKKyAgICBwZXJpb2Qgb2YgdGltZSBpbnN0ZWFkIG9mIHVzaW5nIGBzZXRU
aW1lb3V0KClgLiBUaGlzIG1ldGhvZCB3aWxsIGVuc3VyZSB0aGF0CisgICAgaXRlbXMgdGhhdCBl
eHBpcmUgZHVyaW5nIHRoZSBzYW1lIHNjcmlwdCBleGVjdXRpb24gY3ljbGUgYWxsIGV4ZWN1dGUK
KyAgICB0b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyBh
IHJlYWwgc2V0VGltZW91dC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5sYXRlciht
eUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gY29kZSBoZXJlIHdpbGwgZXhlY3V0ZSB3
aXRoaW4gYSBSdW5Mb29wIGluIGFib3V0IDUwMG1zIHdpdGggdGhpcyA9PSBteUNvbnRleHQKKyAg
ICB9LCA1MDApOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxhdGVyCisgICAgQHBhcmFtIHtP
YmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCisgICAgQHBhcmFtIHtG
dW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICAgIElmIHlv
dSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCisgICAgICB0YXJnZXQg
YXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgIEBwYXJhbSB7T2JqZWN0fSBb
YXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgorICAgIEBw
YXJhbSB7TnVtYmVyfSB3YWl0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KKyAgICBA
cmV0dXJuIHsqfSBUaW1lciBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIGNhbmNlbGxpbmcsIHNlZSBg
cnVuLmNhbmNlbGAuCisgICAgQHB1YmxpYworICAqLworICBydW4ubGF0ZXIgPSBmdW5jdGlvbiAo
KSAvKnRhcmdldCwgbWV0aG9kKi97CisgICAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBwbHko
YmFja2J1cm5lciwgYXJndW1lbnRzKTsKKyAgfTsKKworICAvKioKKyAgICBTY2hlZHVsZSBhIGZ1
bmN0aW9uIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhlIGN1cnJlbnQgUnVuTG9vcC4gVGhpcyBp
cyBlcXVpdmFsZW50CisgICAgdG8gY2FsbGluZyBgc2NoZWR1bGVPbmNlYCB3aXRoIHRoZSAiYWN0
aW9ucyIgcXVldWUuCisgIAorICAgIEBtZXRob2Qgb25jZQorICAgIEBwYXJhbSB7T2JqZWN0fSBb
dGFyZ2V0XSBUaGUgdGFyZ2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgIEBwYXJhbSB7
RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgICBJZiB5
b3UgcGFzcyBhIHN0cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQorICAgICAgdGFyZ2V0
IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KKyAgICBAcGFyYW0ge09iamVjdH0g
W2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAgICBA
cmV0dXJuIHtPYmplY3R9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywg
c2VlIGBydW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5vbmNlID0gZnVuY3Rp
b24gKCkgeworICAgIGNoZWNrQXV0b1J1bigpOworCisgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1
bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xl
bjM7IF9rZXkzKyspIHsKKyAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTsKKyAg
ICB9CisKKyAgICBhcmdzLnVuc2hpZnQoJ2FjdGlvbnMnKTsKKyAgICByZXR1cm4gYmFja2J1cm5l
ci5zY2hlZHVsZU9uY2UuYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgIH07CisKKyAgLyoqCisg
ICAgU2NoZWR1bGVzIGEgZnVuY3Rpb24gdG8gcnVuIG9uZSB0aW1lIGluIGEgZ2l2ZW4gcXVldWUg
b2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4KKyAgICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhl
IHNhbWUgcXVldWUvdGFyZ2V0L21ldGhvZCBjb21iaW5hdGlvbiB3aWxsIGhhdmUKKyAgICBubyBl
ZmZlY3QgKHBhc3QgdGhlIGluaXRpYWwgY2FsbCkuCisgIAorICAgIE5vdGUgdGhhdCBhbHRob3Vn
aCB5b3UgY2FuIHBhc3Mgb3B0aW9uYWwgYXJndW1lbnRzIHRoZXNlIHdpbGwgbm90IGJlCisgICAg
Y29uc2lkZXJlZCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuIE5ldyBhcmd1bWVudHMgd2ls
bCByZXBsYWNlIHByZXZpb3VzCisgICAgY2FsbHMuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBmdW5jdGlvbiBzYXlIaSgpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdoaScpOworICAgIH0KKyAg
CisgICAgcnVuKGZ1bmN0aW9uKCkgeworICAgICAgcnVuLnNjaGVkdWxlT25jZSgnYWZ0ZXJSZW5k
ZXInLCBteUNvbnRleHQsIHNheUhpKTsKKyAgICAgIHJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVu
ZGVyJywgbXlDb250ZXh0LCBzYXlIaSk7CisgICAgICAvLyBzYXlIaSB3aWxsIG9ubHkgYmUgZXhl
Y3V0ZWQgb25jZSwgaW4gdGhlIGFmdGVyUmVuZGVyIHF1ZXVlIG9mIHRoZSBSdW5Mb29wCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIEFsc28gbm90ZSB0aGF0IHBhc3NpbmcgYW4gYW5vbnltb3Vz
IGZ1bmN0aW9uIHRvIGBydW4uc2NoZWR1bGVPbmNlYCB3aWxsCisgICAgbm90IHByZXZlbnQgYWRk
aXRpb25hbCBjYWxscyB3aXRoIGFuIGlkZW50aWNhbCBhbm9ueW1vdXMgZnVuY3Rpb24gZnJvbQor
ICAgIHNjaGVkdWxpbmcgdGhlIGl0ZW1zIG11bHRpcGxlIHRpbWVzLCBlLmcuOgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gc2NoZWR1bGVJdCgpIHsKKyAgICAgIHJ1bi5zY2hl
ZHVsZU9uY2UoJ2FjdGlvbnMnLCBteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgICBjb25z
b2xlLmxvZygnQ2xvc3VyZScpOworICAgICAgfSk7CisgICAgfQorICAKKyAgICBzY2hlZHVsZUl0
KCk7CisgICAgc2NoZWR1bGVJdCgpOworICAKKyAgICAvLyAiQ2xvc3VyZSIgd2lsbCBwcmludCB0
d2ljZSwgZXZlbiB0aG91Z2ggd2UncmUgdXNpbmcgYHJ1bi5zY2hlZHVsZU9uY2VgLAorICAgIC8v
IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdlIHBhc3MgdG8gaXQgaXMgYW5vbnltb3VzIGFuZCB3b24n
dCBtYXRjaCB0aGUKKyAgICAvLyBwcmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24uCisgICAg
YGBgCisgIAorICAgIEF2YWlsYWJsZSBxdWV1ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZv
dW5kIGF0IGBydW4ucXVldWVzYAorICAKKyAgICBAbWV0aG9kIHNjaGVkdWxlT25jZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBh
Z2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUgJ3N5bmMnIGFuZCAnYWN0aW9ucycuCisgICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Uu
CisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9r
ZS4KKyAgICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhl
CisgICAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgIEBw
YXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0
aW1lb3V0LgorICAgIEByZXR1cm4ge09iamVjdH0gVGltZXIgaW5mb3JtYXRpb24gZm9yIHVzZSBp
biBjYW5jZWxsaW5nLCBzZWUgYHJ1bi5jYW5jZWxgLgorICAgIEBwdWJsaWMKKyAgKi8KKyAgcnVu
LnNjaGVkdWxlT25jZSA9IGZ1bmN0aW9uICgpIC8qcXVldWUsIHRhcmdldCwgbWV0aG9kKi97Cisg
ICAgY2hlY2tBdXRvUnVuKCk7CisgICAgcmV0dXJuIGJhY2tidXJuZXIuc2NoZWR1bGVPbmNlLmFw
cGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7CisgIH07CisKKyAgLyoqCisgICAgU2NoZWR1bGVz
IGFuIGl0ZW0gdG8gcnVuIGZyb20gd2l0aGluIGEgc2VwYXJhdGUgcnVuIGxvb3AsIGFmdGVyCisg
ICAgY29udHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiBUaGlzIGlzIGVxdWl2
YWxlbnQgdG8gY2FsbGluZworICAgIGBydW4ubGF0ZXJgIHdpdGggYSB3YWl0IHRpbWUgb2YgMW1z
LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlv
bigpIHsKKyAgICAgIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG5leHQgcnVuIGxvb3As
CisgICAgICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3VycmVudCBvbmUK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgTXVsdGlwbGUgb3BlcmF0aW9ucyBzY2hlZHVsZWQg
d2l0aCBgcnVuLm5leHRgIHdpbGwgY29hbGVzY2UKKyAgICBpbnRvIHRoZSBzYW1lIGxhdGVyIHJ1
biBsb29wLCBhbG9uZyB3aXRoIGFueSBvdGhlciBvcGVyYXRpb25zCisgICAgc2NoZWR1bGVkIGJ5
IGBydW4ubGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQorICAgIHRpbWUg
dGhhdCBgcnVuLm5leHRgIG9wZXJhdGlvbnMgd2lsbCBmaXJlLgorICAKKyAgICBOb3RlIHRoYXQg
dGhlcmUgYXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0byB1c2luZyBgcnVuLm5leHRgLgorICAgIEZv
ciBpbnN0YW5jZSwgaWYgeW91J2QgbGlrZSB0byBzY2hlZHVsZSBhbiBvcGVyYXRpb24gdG8gaGFw
cGVuCisgICAgYWZ0ZXIgYWxsIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGF2ZSBjb21wbGV0ZWQg
d2l0aGluIHRoZSBjdXJyZW50CisgICAgcnVuIGxvb3AsIHlvdSBjYW4gbWFrZSB1c2Ugb2YgdGhl
IGBhZnRlclJlbmRlcmAgcnVuIGxvb3AgcXVldWUgKGFkZGVkCisgICAgYnkgdGhlIGBlbWJlci12
aWV3c2AgcGFja2FnZSwgYWxvbmcgd2l0aCB0aGUgcHJlY2VkaW5nIGByZW5kZXJgIHF1ZXVlCisg
ICAgd2hlcmUgYWxsIHRoZSBET00gZWxlbWVudCBvcGVyYXRpb25zIGhhcHBlbikuCisgIAorICAg
IEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJl
ci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICAgIGRpZEluc2VydEVsZW1lbnQoKSB7CisgICAgICAg
IHRoaXMuX3N1cGVyKC4uLmFyZ3VtZW50cyk7CisgICAgICAgIHJ1bi5zY2hlZHVsZU9uY2UoJ2Fm
dGVyUmVuZGVyJywgdGhpcywgJ3Byb2Nlc3NDaGlsZEVsZW1lbnRzJyk7CisgICAgICB9LAorICAK
KyAgICAgIHByb2Nlc3NDaGlsZEVsZW1lbnRzKCkgeworICAgICAgICAvLyAuLi4gZG8gc29tZXRo
aW5nIHdpdGggY29tcG9uZW50J3MgY2hpbGQgY29tcG9uZW50CisgICAgICAgIC8vIGVsZW1lbnRz
IGFmdGVyIHRoZXkndmUgZmluaXNoZWQgcmVuZGVyaW5nLCB3aGljaAorICAgICAgICAvLyBjYW4n
dCBiZSBkb25lIHdpdGhpbiB0aGlzIGNvbXBvbmVudCdzCisgICAgICAgIC8vIGBkaWRJbnNlcnRF
bGVtZW50YCBob29rIGJlY2F1c2UgdGhhdCBnZXRzIHJ1bgorICAgICAgICAvLyBiZWZvcmUgdGhl
IGNoaWxkIGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgRE9NLgorICAgICAgfQorICAg
IH0pOworICAgIGBgYAorICAKKyAgICBPbmUgYmVuZWZpdCBvZiB0aGUgYWJvdmUgYXBwcm9hY2gg
Y29tcGFyZWQgdG8gdXNpbmcgYHJ1bi5uZXh0YCBpcworICAgIHRoYXQgeW91IHdpbGwgYmUgYWJs
ZSB0byBwZXJmb3JtIERPTS9DU1Mgb3BlcmF0aW9ucyBiZWZvcmUgdW5wcm9jZXNzZWQKKyAgICBl
bGVtZW50cyBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlbiwgd2hpY2ggbWF5IHByZXZlbnQgZmxp
Y2tlcmluZyBvcgorICAgIG90aGVyIGFydGlmYWN0cyBjYXVzZWQgYnkgZGVsYXlpbmcgcHJvY2Vz
c2luZyB1bnRpbCBhZnRlciByZW5kZXJpbmcuCisgIAorICAgIFRoZSBvdGhlciBtYWpvciBiZW5l
Zml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0IGBydW4ubmV4dGAKKyAgICBpbnRyb2R1
Y2VzIGFuIGVsZW1lbnQgb2Ygbm9uLWRldGVybWluaXNtLCB3aGljaCBjYW4gbWFrZSB0aGluZ3Mg
bXVjaAorICAgIGhhcmRlciB0byB0ZXN0LCBkdWUgdG8gaXRzIHJlbGlhbmNlIG9uIGBzZXRUaW1l
b3V0YDsgaXQncyBtdWNoIGhhcmRlcgorICAgIHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Ygc2No
ZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBzY2hlZHVsZWQKKyAgICBvdXRzaWRlIG9m
IHRoZSBjdXJyZW50IHJ1biBsb29wLCBpLmUuIHdpdGggYHJ1bi5uZXh0YC4KKyAgCisgICAgQG1l
dGhvZCBuZXh0CisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2Qg
dG8gaW52b2tlCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9k
IHRvIGludm9rZS4KKyAgICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2
ZWQgb24gdGhlCisgICAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2Vk
LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNz
IHRvIHRoZSB0aW1lb3V0LgorICAgIEByZXR1cm4ge09iamVjdH0gVGltZXIgaW5mb3JtYXRpb24g
Zm9yIHVzZSBpbiBjYW5jZWxsaW5nLCBzZWUgYHJ1bi5jYW5jZWxgLgorICAgIEBwdWJsaWMKKyAg
Ki8KKyAgcnVuLm5leHQgPSBmdW5jdGlvbiAoKSB7CisgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1
bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xl
bjQ7IF9rZXk0KyspIHsKKyAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTsKKyAg
ICB9CisKKyAgICBhcmdzLnB1c2goMSk7CisgICAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBw
bHkoYmFja2J1cm5lciwgYXJncyk7CisgIH07CisKKyAgLyoqCisgICAgQ2FuY2VscyBhIHNjaGVk
dWxlZCBpdGVtLiBNdXN0IGJlIGEgdmFsdWUgcmV0dXJuZWQgYnkgYHJ1bi5sYXRlcigpYCwKKyAg
ICBgcnVuLm9uY2UoKWAsIGBydW4uc2NoZWR1bGVPbmNlKClgLCBgcnVuLm5leHQoKWAsIGBydW4u
ZGVib3VuY2UoKWAsIG9yCisgICAgYHJ1bi50aHJvdHRsZSgpYC4KKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIHZhciBydW5OZXh0ID0gcnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpIHsK
KyAgICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisgICAgfSk7CisgIAorICAgIHJ1bi5jYW5j
ZWwocnVuTmV4dCk7CisgIAorICAgIHZhciBydW5MYXRlciA9IHJ1bi5sYXRlcihteUNvbnRleHQs
IGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKKyAgICB9LCA1MDAp
OworICAKKyAgICBydW4uY2FuY2VsKHJ1bkxhdGVyKTsKKyAgCisgICAgdmFyIHJ1blNjaGVkdWxl
T25jZSA9IHJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgbXlDb250ZXh0LCBmdW5jdGlv
bigpIHsKKyAgICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisgICAgfSk7CisgIAorICAgIHJ1
bi5jYW5jZWwocnVuU2NoZWR1bGVPbmNlKTsKKyAgCisgICAgdmFyIHJ1bk9uY2UgPSBydW4ub25j
ZShteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQK
KyAgICB9KTsKKyAgCisgICAgcnVuLmNhbmNlbChydW5PbmNlKTsKKyAgCisgICAgdmFyIHRocm90
dGxlID0gcnVuLnRocm90dGxlKG15Q29udGV4dCwgZnVuY3Rpb24oKSB7CisgICAgICAvLyB3aWxs
IG5vdCBiZSBleGVjdXRlZAorICAgIH0sIDEsIGZhbHNlKTsKKyAgCisgICAgcnVuLmNhbmNlbCh0
aHJvdHRsZSk7CisgIAorICAgIHZhciBkZWJvdW5jZSA9IHJ1bi5kZWJvdW5jZShteUNvbnRleHQs
IGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKKyAgICB9LCAxKTsK
KyAgCisgICAgcnVuLmNhbmNlbChkZWJvdW5jZSk7CisgIAorICAgIHZhciBkZWJvdW5jZUltbWVk
aWF0ZSA9IHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2ls
bCBiZSBleGVjdXRlZCBzaW5jZSB3ZSBwYXNzZWQgaW4gdHJ1ZSAoaW1tZWRpYXRlKQorICAgIH0s
IDEwMCwgdHJ1ZSk7CisgIAorICAgIC8vIHRoZSAxMDBtcyBkZWxheSB1bnRpbCB0aGlzIG1ldGhv
ZCBjYW4gYmUgY2FsbGVkIGFnYWluIHdpbGwgYmUgY2FuY2VsbGVkCisgICAgcnVuLmNhbmNlbChk
ZWJvdW5jZUltbWVkaWF0ZSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgY2FuY2VsCisgICAg
QHBhcmFtIHtPYmplY3R9IHRpbWVyIFRpbWVyIG9iamVjdCB0byBjYW5jZWwKKyAgICBAcmV0dXJu
IHtCb29sZWFufSB0cnVlIGlmIGNhbmNlbGxlZCBvciBmYWxzZS91bmRlZmluZWQgaWYgaXQgd2Fz
bid0IGZvdW5kCisgICAgQHB1YmxpYworICAqLworICBydW4uY2FuY2VsID0gZnVuY3Rpb24gKHRp
bWVyKSB7CisgICAgcmV0dXJuIGJhY2tidXJuZXIuY2FuY2VsKHRpbWVyKTsKKyAgfTsKKworICAv
KioKKyAgICBEZWxheSBjYWxsaW5nIHRoZSB0YXJnZXQgbWV0aG9kIHVudGlsIHRoZSBkZWJvdW5j
ZSBwZXJpb2QgaGFzIGVsYXBzZWQKKyAgICB3aXRoIG5vIGFkZGl0aW9uYWwgZGVib3VuY2UgY2Fs
bHMuIElmIGBkZWJvdW5jZWAgaXMgY2FsbGVkIGFnYWluIGJlZm9yZQorICAgIHRoZSBzcGVjaWZp
ZWQgdGltZSBoYXMgZWxhcHNlZCwgdGhlIHRpbWVyIGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBl
cmlvZAorICAgIG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUgdGhlIHRhcmdldCBtZXRob2QgaXMgY2Fs
bGVkLgorICAKKyAgICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIGFuIGV2ZW50IG1h
eSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAgICBidXQgdGhlIGFjdGlvbiBzaG91bGQgb25s
eSBiZSBjYWxsZWQgb25jZSB3aGVuIHRoZSBldmVudCBpcyBkb25lIGZpcmluZy4KKyAgICBBIGNv
bW1vbiBleGFtcGxlIGlzIGZvciBzY3JvbGwgZXZlbnRzIHdoZXJlIHlvdSBvbmx5IHdhbnQgdXBk
YXRlcyB0bworICAgIGhhcHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vhc2VkLgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gd2hvUmFuKCkgeworICAgICAgY29uc29sZS5sb2co
dGhpcy5uYW1lICsgJyByYW4uJyk7CisgICAgfQorICAKKyAgICB2YXIgbXlDb250ZXh0ID0geyBu
YW1lOiAnZGVib3VuY2UnIH07CisgIAorICAgIHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIHdob1Jh
biwgMTUwKTsKKyAgCisgICAgLy8gbGVzcyB0aGFuIDE1MG1zIHBhc3NlcworICAgIHJ1bi5kZWJv
dW5jZShteUNvbnRleHQsIHdob1JhbiwgMTUwKTsKKyAgCisgICAgLy8gMTUwbXMgcGFzc2VzCisg
ICAgLy8gd2hvUmFuIGlzIGludm9rZWQgd2l0aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNv
bnNvbGUgbG9ncyAnZGVib3VuY2UgcmFuLicgb25lIHRpbWUuCisgICAgYGBgCisgIAorICAgIElt
bWVkaWF0ZSBhbGxvd3MgeW91IHRvIHJ1biB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHksIGJ1dCBk
ZWJvdW5jZQorICAgIG90aGVyIGNhbGxzIGZvciB0aGlzIGZ1bmN0aW9uIHVudGlsIHRoZSB3YWl0
IHRpbWUgaGFzIGVsYXBzZWQuIElmCisgICAgYGRlYm91bmNlYCBpcyBjYWxsZWQgYWdhaW4gYmVm
b3JlIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwKKyAgICB0aGUgdGltZXIgaXMgcmVz
ZXQgYW5kIHRoZSBlbnRpcmUgcGVyaW9kIG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUKKyAgICB0aGUg
bWV0aG9kIGNhbiBiZSBjYWxsZWQgYWdhaW4uCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBm
dW5jdGlvbiB3aG9SYW4oKSB7CisgICAgICBjb25zb2xlLmxvZyh0aGlzLm5hbWUgKyAnIHJhbi4n
KTsKKyAgICB9CisgIAorICAgIHZhciBteUNvbnRleHQgPSB7IG5hbWU6ICdkZWJvdW5jZScgfTsK
KyAgCisgICAgcnVuLmRlYm91bmNlKG15Q29udGV4dCwgd2hvUmFuLCAxNTAsIHRydWUpOworICAK
KyAgICAvLyBjb25zb2xlIGxvZ3MgJ2RlYm91bmNlIHJhbi4nIG9uZSB0aW1lIGltbWVkaWF0ZWx5
LgorICAgIC8vIDEwMG1zIHBhc3NlcworICAgIHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIHdob1Jh
biwgMTUwLCB0cnVlKTsKKyAgCisgICAgLy8gMTUwbXMgcGFzc2VzIGFuZCBub3RoaW5nIGVsc2Ug
aXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGFuZAorICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMgbm8g
bG9uZ2VyIGJlaW5nIHdhdGNoZWQKKyAgICBydW4uZGVib3VuY2UobXlDb250ZXh0LCB3aG9SYW4s
IDE1MCwgdHJ1ZSk7CisgIAorICAgIC8vIGNvbnNvbGUgbG9ncyAnZGVib3VuY2UgcmFuLicgb25l
IHRpbWUgaW1tZWRpYXRlbHkuCisgICAgLy8gMTUwbXMgcGFzc2VzIGFuZCBub3RoaW5nIGVsc2Ug
aXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGFuZAorICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMgbm8g
bG9uZ2VyIGJlaW5nIHdhdGNoZWQKKyAgCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZGVib3Vu
Y2UKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZv
a2UKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52
b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEg
c3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFy
Z2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBw
YXNzIHRvIHRoZSB0aW1lb3V0LgorICAgIEBwYXJhbSB7TnVtYmVyfSB3YWl0IE51bWJlciBvZiBt
aWxsaXNlY29uZHMgdG8gd2FpdC4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZSBUcmln
Z2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGluZyBpbnN0ZWFkCisgICAgICBvZiB0aGUgdHJh
aWxpbmcgZWRnZSBvZiB0aGUgd2FpdCBpbnRlcnZhbC4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAg
QHJldHVybiB7QXJyYXl9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywg
c2VlIGBydW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5kZWJvdW5jZSA9IGZ1
bmN0aW9uICgpIHsKKyAgICByZXR1cm4gYmFja2J1cm5lci5kZWJvdW5jZS5hcHBseShiYWNrYnVy
bmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8qKgorICAgIEVuc3VyZSB0aGF0IHRoZSB0YXJn
ZXQgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbgorICAgIHRoZSBz
cGVjaWZpZWQgc3BhY2luZyBwZXJpb2QuIFRoZSB0YXJnZXQgbWV0aG9kIGlzIGNhbGxlZCBpbW1l
ZGlhdGVseS4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uIHdob1JhbigpIHsK
KyAgICAgIGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOworICAgIH0KKyAgCisgICAg
dmFyIG15Q29udGV4dCA9IHsgbmFtZTogJ3Rocm90dGxlJyB9OworICAKKyAgICBydW4udGhyb3R0
bGUobXlDb250ZXh0LCB3aG9SYW4sIDE1MCk7CisgICAgLy8gd2hvUmFuIGlzIGludm9rZWQgd2l0
aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNvbnNvbGUgbG9ncyAndGhyb3R0bGUgcmFuLicK
KyAgCisgICAgLy8gNTBtcyBwYXNzZXMKKyAgICBydW4udGhyb3R0bGUobXlDb250ZXh0LCB3aG9S
YW4sIDE1MCk7CisgIAorICAgIC8vIDUwbXMgcGFzc2VzCisgICAgcnVuLnRocm90dGxlKG15Q29u
dGV4dCwgd2hvUmFuLCAxNTApOworICAKKyAgICAvLyAxNTBtcyBwYXNzZXMKKyAgICBydW4udGhy
b3R0bGUobXlDb250ZXh0LCB3aG9SYW4sIDE1MCk7CisgICAgLy8gd2hvUmFuIGlzIGludm9rZWQg
d2l0aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNvbnNvbGUgbG9ncyAndGhyb3R0bGUgcmFu
LicKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCB0aHJvdHRsZQorICAgIEBwYXJhbSB7T2JqZWN0
fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGludm9rZQorICAgIEBwYXJhbSB7RnVuY3Rp
b258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgICBNYXkgYmUgYSBm
dW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcKKyAgICAgIHRoZW4gaXQg
d2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0YXJnZXQuCisgICAgQHBhcmFtIHtPYmpl
Y3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCisg
ICAgQHBhcmFtIHtOdW1iZXJ9IHNwYWNpbmcgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzcGFj
ZSBvdXQgcmVxdWVzdHMuCisgICAgQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgVHJpZ2dlciB0
aGUgZnVuY3Rpb24gb24gdGhlIGxlYWRpbmcgaW5zdGVhZAorICAgICAgb2YgdGhlIHRyYWlsaW5n
IGVkZ2Ugb2YgdGhlIHdhaXQgaW50ZXJ2YWwuIERlZmF1bHRzIHRvIHRydWUuCisgICAgQHJldHVy
biB7QXJyYXl9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywgc2VlIGBy
dW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi50aHJvdHRsZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICByZXR1cm4gYmFja2J1cm5lci50aHJvdHRsZS5hcHBseShiYWNrYnVybmVyLCBh
cmd1bWVudHMpOworICB9OworCisgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBhdXRvcnVuIGR1
cmluZyB0ZXN0aW5nCisgIGZ1bmN0aW9uIGNoZWNrQXV0b1J1bigpIHsKKyAgICBpZiAoIXJ1bi5j
dXJyZW50UnVuTG9vcCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBoYXZl
IHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4tbG9vcFwncyBh
dXRvcnVuLiAnICsgJ1lvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5jaHJv
bm91cyBzaWRlLWVmZmVjdHMgaW4gYSBydW4nLCAhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudGVz
dGluZyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGFm
dGVyIHRoZSBzcGVjaWZpZWQgcXVldWUuCisgIAorICAgIFRoZSBxdWV1ZSB0byBhZGQgd2lsbCBv
bmx5IGJlIGFkZGVkIG9uY2UuCisgIAorICAgIEBtZXRob2QgX2FkZFF1ZXVlCisgICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGFkZC4KKyAgICBAcGFyYW0g
e1N0cmluZ30gYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGFkZCBhZnRlci4KKyAgICBA
cHJpdmF0ZQorICAqLworICBydW4uX2FkZFF1ZXVlID0gZnVuY3Rpb24gKG5hbWUsIGFmdGVyKSB7
CisgICAgaWYgKHJ1bi5xdWV1ZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHsKKyAgICAgIHJ1bi5x
dWV1ZXMuc3BsaWNlKHJ1bi5xdWV1ZXMuaW5kZXhPZihhZnRlcikgKyAxLCAwLCBuYW1lKTsKKyAg
ICB9CisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzJywgJ2VtYmVyLW1ldGFsL3Byb3Bl
cnR5X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMs
IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBzZXRQcm9wZXJ0aWVzOworCisgIC8qKgorICAgIFNldCBhIGxpc3Qgb2YgcHJv
cGVydGllcyBvbiBhbiBvYmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUKKyAg
ICBhIHNpbmdsZSBgYmVnaW5Qcm9wZXJ0eUNoYW5nZXNgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2Vz
YCBiYXRjaCwgc28KKyAgICBvYnNlcnZlcnMgd2lsbCBiZSBidWZmZXJlZC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBhbk9iamVjdCA9IEVtYmVyLk9iamVjdC5jcmVhdGUoKTsKKyAg
CisgICAgYW5PYmplY3Quc2V0UHJvcGVydGllcyh7CisgICAgICBmaXJzdE5hbWU6ICdTdGFubGV5
JywKKyAgICAgIGxhc3ROYW1lOiAnU3R1YXJ0JywKKyAgICAgIGFnZTogMjEKKyAgICB9KTsKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCisgICAgQHBhcmFtIG9iagorICAg
IEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzCisgICAgQHJldHVybiBwcm9wZXJ0aWVzCisgICAg
QHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNldFByb3BlcnRpZXMob2JqLCBwcm9wZXJ0aWVz
KSB7CisgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHR5cGVvZiBwcm9wZXJ0aWVzICE9PSAnb2JqZWN0
JykgeworICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQorICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfZXZlbnRzLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBy
b3BzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7CisgICAgICB2YXIgcHJvcGVydHlOYW1lOwor
CisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHByb3BzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wc1tpXTsKKworICAgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQob2JqLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnRpZXNbcHJvcGVydHlOYW1l
XSk7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1tZXRhbC9zdHJlYW1zL2RlcGVuZGVuY3knLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLW1ldGFsL3N0cmVh
bXMvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsQXNzaWduLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisK
KyAgLyoqCisgICAgQG1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8qKgorICAgIEBwcml2
YXRlCisgICAgQGNsYXNzIERlcGVuZGVuY3kKKyAgICBAbmFtZXNwYWNlIEVtYmVyLnN0cmVhbXMK
KyAgICBAY29uc3RydWN0b3IKKyAgKi8KKyAgZnVuY3Rpb24gRGVwZW5kZW5jeShkZXBlbmRlciwg
ZGVwZW5kZWUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnRGVwZW5kZW5jeSBlcnJv
cjogRGVwZW5kZXIgbXVzdCBiZSBhIHN0cmVhbScsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmlz
U3RyZWFtKGRlcGVuZGVyKSk7CisKKyAgICB0aGlzLm5leHQgPSBudWxsOworICAgIHRoaXMucHJl
diA9IG51bGw7CisgICAgdGhpcy5kZXBlbmRlciA9IGRlcGVuZGVyOworICAgIHRoaXMuZGVwZW5k
ZWUgPSBkZXBlbmRlZTsKKyAgICB0aGlzLnVuc3Vic2NyaXB0aW9uID0gbnVsbDsKKyAgfQorCisg
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoRGVwZW5kZW5jeS5wcm90b3R5cGUsIHsKKyAgICBz
dWJzY3JpYmU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdE
ZXBlbmRlbmN5IGVycm9yOiBEZXBlbmRlbmN5IHRyaWVkIHRvIHN1YnNjcmliZSB3aGlsZSBhbHJl
YWR5IHN1YnNjcmliZWQnLCAhdGhpcy51bnN1YnNjcmlwdGlvbik7CisKKyAgICAgIHRoaXMudW5z
dWJzY3JpcHRpb24gPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5zdWJzY3JpYmUodGhpcy5kZXBl
bmRlZSwgdGhpcy5kZXBlbmRlci5ub3RpZnksIHRoaXMuZGVwZW5kZXIpOworICAgIH0sCisKKyAg
ICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMudW5zdWJzY3JpcHRp
b24pIHsKKyAgICAgICAgdGhpcy51bnN1YnNjcmlwdGlvbigpOworICAgICAgICB0aGlzLnVuc3Vi
c2NyaXB0aW9uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVwbGFjZTogZnVuY3Rp
b24gKGRlcGVuZGVlKSB7CisgICAgICBpZiAodGhpcy5kZXBlbmRlZSAhPT0gZGVwZW5kZWUpIHsK
KyAgICAgICAgdGhpcy5kZXBlbmRlZSA9IGRlcGVuZGVlOworCisgICAgICAgIGlmICh0aGlzLnVu
c3Vic2NyaXB0aW9uKSB7CisgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOworICAgICAgICAg
IHRoaXMuc3Vic2NyaWJlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIGdldFZhbHVlOiBmdW5jdGlv
biAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZCh0aGlzLmRl
cGVuZGVlKTsKKyAgICB9LAorCisgICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkgeworICAg
ICAgcmV0dXJuIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnNldFZhbHVlKHRoaXMuZGVwZW5kZWUs
IHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBkZXN0cm95KCkgeworICAgIC8vICAgdmFyIG5leHQg
PSB0aGlzLm5leHQ7CisgICAgLy8gICB2YXIgcHJldiA9IHRoaXMucHJldjsKKworICAgIC8vICAg
aWYgKHByZXYpIHsKKyAgICAvLyAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAvLyAgIH0gZWxz
ZSB7CisgICAgLy8gICAgIHRoaXMuZGVwZW5kZXIuZGVwZW5kZW5jeUhlYWQgPSBuZXh0OworICAg
IC8vICAgfQorCisgICAgLy8gICBpZiAobmV4dCkgeworICAgIC8vICAgICBuZXh0LnByZXYgPSBw
cmV2OworICAgIC8vICAgfSBlbHNlIHsKKyAgICAvLyAgICAgdGhpcy5kZXBlbmRlci5kZXBlbmRl
bmN5VGFpbCA9IHByZXY7CisgICAgLy8gICB9CisKKyAgICAvLyAgIHRoaXMudW5zdWJzY3JpYmUo
KTsKKyAgICAvLyB9CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERlcGVuZGVuY3k7Cit9
KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvc3RyZWFtcy9rZXktc3RyZWFtJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwv
c3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0sIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICBmdW5jdGlvbiBsYWJlbEZvcihzb3VyY2UsIGtleSkgeworICAgIHJldHVybiBzb3VyY2UubGFi
ZWwgPyBzb3VyY2UubGFiZWwgKyAnLicgKyBrZXkgOiBrZXk7CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uZGVmYXVsdC5leHRlbmQoeworICAgIGlu
aXQ6IGZ1bmN0aW9uIChzb3VyY2UsIGtleSkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3Nl
cnQoJ0tleVN0cmVhbSBlcnJvcjogc291cmNlIG11c3QgYmUgYSBzdHJlYW0nLCBfZW1iZXJNZXRh
bFN0cmVhbXNVdGlscy5pc1N0cmVhbShzb3VyY2UpKTsgLy8gVE9ETzogVGhpcyBpc24ndCBuZWNl
c3NhcnkuCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnS2V5U3RyZWFtIGVycm9yOiBr
ZXkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAm
JiBrZXkubGVuZ3RoID4gMCk7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnS2V5U3Ry
ZWFtIGVycm9yOiBrZXkgbXVzdCBub3QgaGF2ZSBhIFwnLlwnJywga2V5LmluZGV4T2YoJy4nKSA9
PT0gLTEpOworCisgICAgICB2YXIgbGFiZWwgPSBsYWJlbEZvcihzb3VyY2UsIGtleSk7CisKKyAg
ICAgIHRoaXMucGF0aCA9IGxhYmVsOworICAgICAgdGhpcy5vYnNlcnZlZE9iamVjdCA9IG51bGw7
CisgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIHRoaXMuc291cmNlRGVwID0gdGhpcy5hZGRN
dXRhYmxlRGVwZW5kZW5jeShzb3VyY2UpOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAg
IH0sCisKKyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhp
cy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIHZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsK
KworICAgICAgaWYgKCFvYmplY3QgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICAg
IHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQob2JqZWN0LCB0aGlzLmtleSk7Cisg
ICAgICB9CisKKyAgICAgIHJldHVybiBvYmplY3RbdGhpcy5rZXldOworICAgIH0sCisKKyAgICBz
ZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5zb3Vy
Y2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmIChvYmplY3QpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxQcm9wZXJ0eV9zZXQuc2V0KG9iamVjdCwgdGhpcy5rZXksIHZhbHVlKTsKKyAgICAgIH0KKyAg
ICB9LAorCisgICAgc2V0U291cmNlOiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICB0aGlzLnNv
dXJjZURlcC5yZXBsYWNlKHNvdXJjZSk7CisgICAgICB0aGlzLm5vdGlmeSgpOworICAgIH0sCisK
KyAgICBfc3VwZXIkcmV2YWxpZGF0ZTogX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQu
cHJvdG90eXBlLnJldmFsaWRhdGUsCisKKyAgICByZXZhbGlkYXRlOiBmdW5jdGlvbiAodmFsdWUp
IHsKKyAgICAgIHRoaXMuX3N1cGVyJHJldmFsaWRhdGUodmFsdWUpOworCisgICAgICB2YXIgb2Jq
ZWN0ID0gdGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmIChvYmplY3QgIT09IHRo
aXMub2JzZXJ2ZWRPYmplY3QpIHsKKyAgICAgICAgdGhpcy5fY2xlYXJPYnNlcnZlZE9iamVjdCgp
OworCisgICAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKG9iamVjdCwgdGhpcy5r
ZXksIHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgICB0aGlzLm9ic2VydmVkT2JqZWN0ID0g
b2JqZWN0OworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIF9zdXBlciRkZWFjdGl2
YXRlOiBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uZGVmYXVsdC5wcm90b3R5cGUuZGVhY3RpdmF0
ZSwKKworICAgIF9jbGVhck9ic2VydmVkT2JqZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAo
dGhpcy5vYnNlcnZlZE9iamVjdCkgeworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92
ZU9ic2VydmVyKHRoaXMub2JzZXJ2ZWRPYmplY3QsIHRoaXMua2V5LCB0aGlzLCB0aGlzLm5vdGlm
eSk7CisgICAgICAgIHRoaXMub2JzZXJ2ZWRPYmplY3QgPSBudWxsOworICAgICAgfQorICAgIH0s
CisKKyAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlciRkZWFj
dGl2YXRlKCk7CisgICAgICB0aGlzLl9jbGVhck9ic2VydmVkT2JqZWN0KCk7CisgICAgfQorICB9
KTsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsIFsnZXhw
b3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3RyZWFt
cy9zdHJlYW0nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3Qs
IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFBy
b3h5U3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kKHsKKyAg
ICBpbml0OiBmdW5jdGlvbiAoc291cmNlLCBsYWJlbCkgeworICAgICAgdGhpcy5sYWJlbCA9IGxh
YmVsOworICAgICAgdGhpcy5zb3VyY2VEZXAgPSB0aGlzLmFkZE11dGFibGVEZXBlbmRlbmN5KHNv
dXJjZSk7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVy
biB0aGlzLnNvdXJjZURlcC5nZXRWYWx1ZSgpOworICAgIH0sCisKKyAgICBzZXRWYWx1ZTogZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgICB0aGlzLnNvdXJjZURlcC5zZXRWYWx1ZSh2YWx1ZSk7Cisg
ICAgfSwKKworICAgIHNldFNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgdmFyIGRp
ZENoYW5nZSA9IHRoaXMuc291cmNlRGVwLnJlcGxhY2Uoc291cmNlKTsKKyAgICAgIGlmIChkaWRD
aGFuZ2UgfHwgIShzb3VyY2UgaW5zdGFuY2VvZiBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRl
ZmF1bHQpKSB7CisgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgY2hhbmdlZCwgd2UgbXVzdCBub3Rp
ZnkuIElmIHRoZSBzb3VyY2UgaXMgbm90CisgICAgICAgIC8vIGFuIEVtYmVyLk9iamVjdCwgd2Ug
bXVzdCBhbHNvIG5vdGlmeSwgYmVjYXVzZSBpdCBjb3VsZCBoYXZlCisgICAgICAgIC8vIGludGVy
aW9yIG11dGFiaWxpdHkgdGhhdCBpcyBvdGhlcndpc2Ugbm90IGJlaW5nIG9ic2VydmVkLgorICAg
ICAgICB0aGlzLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgUHJveHlTdHJl
YW0uZXh0ZW5kID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IFByb3h5U3RyZWFtOworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFs
L3N0cmVhbXMvc3RyZWFtJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wYXRoX2NhY2hlJywgJ2VtYmVyLW1ldGFsL29i
c2VydmVyJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnLCAnZW1iZXItbWV0YWwvZW1wdHlf
b2JqZWN0JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Vic2NyaWJlcicsICdlbWJlci1tZXRhbC9z
dHJlYW1zL2RlcGVuZGVuY3knLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAncmVxdWlyZScsICdlbWJl
ci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQXNzaWduLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFBhdGhfY2FjaGUsIF9lbWJlck1ldGFsT2JzZXJ2
ZXIsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2Vt
YmVyTWV0YWxTdHJlYW1zU3Vic2NyaWJlciwgX2VtYmVyTWV0YWxTdHJlYW1zRGVwZW5kZW5jeSwg
X2VtYmVyTWV0YWxVdGlscywgX3JlcXVpcmUsIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLndyYXAgPSB3cmFwOworICB2YXIgSVNfU1RSRUFNID0gX2Vt
YmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnSVNfU1RSRUFNJyk7CisKKyAgZXhwb3J0cy5JU19TVFJF
QU0gPSBJU19TVFJFQU07CisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKwor
ICAvKioKKyAgICBAcHJpdmF0ZQorICAgIEBjbGFzcyBTdHJlYW0KKyAgICBAbmFtZXNwYWNlIEVt
YmVyLnN0cmVhbQorICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5jdGlvbiBCYXNpY1N0cmVh
bShsYWJlbCkgeworICAgIHRoaXMuX2luaXQobGFiZWwpOworICB9CisKKyAgdmFyIEtleVN0cmVh
bTsKKyAgdmFyIFByb3h5TWl4aW47CisKKyAgQmFzaWNTdHJlYW0ucHJvdG90eXBlID0geworICAg
IF9pbml0OiBmdW5jdGlvbiAobGFiZWwpIHsKKyAgICAgIHRoaXNbSVNfU1RSRUFNXSA9IHRydWU7
CisgICAgICB0aGlzLmxhYmVsID0gbWFrZUxhYmVsKGxhYmVsKTsKKyAgICAgIHRoaXMuaXNBY3Rp
dmUgPSBmYWxzZTsKKyAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7CisgICAgICB0aGlzLmlzRGVz
dHJveWVkID0gZmFsc2U7CisgICAgICB0aGlzLmNhY2hlID0gdW5kZWZpbmVkOworICAgICAgdGhp
cy5jaGlsZHJlbiA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuc3Vic2NyaWJlckhlYWQgPSBudWxs
OworICAgICAgdGhpcy5zdWJzY3JpYmVyVGFpbCA9IG51bGw7CisgICAgICB0aGlzLmRlcGVuZGVu
Y3lIZWFkID0gbnVsbDsKKyAgICAgIHRoaXMuZGVwZW5kZW5jeVRhaWwgPSBudWxsOworICAgICAg
dGhpcy5vYnNlcnZlZFByb3h5ID0gbnVsbDsKKyAgICAgIHRoaXMuX19lbWJlcl9tZXRhX18gPSBu
dWxsOworICAgICAgdGhpc1tfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZXSA9IG51bGw7CisgICAg
fSwKKworICAgIF9tYWtlQ2hpbGRTdHJlYW06IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIEtleVN0
cmVhbSA9IEtleVN0cmVhbSB8fCBfcmVxdWlyZS5kZWZhdWx0KCdlbWJlci1tZXRhbC9zdHJlYW1z
L2tleS1zdHJlYW0nKS5kZWZhdWx0OworICAgICAgcmV0dXJuIG5ldyBLZXlTdHJlYW0odGhpcywg
a2V5KTsKKyAgICB9LAorCisgICAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAg
IGRlbGV0ZSB0aGlzLmNoaWxkcmVuW2tleV07CisgICAgfSwKKworICAgIGdldEtleTogZnVuY3Rp
b24gKGtleSkgeworICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeworICAg
ICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQo
KTsKKyAgICAgIH0KKworICAgICAgdmFyIGtleVN0cmVhbSA9IHRoaXMuY2hpbGRyZW5ba2V5XTsK
KworICAgICAgaWYgKGtleVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGtleVN0cmVh
bSA9IHRoaXMuX21ha2VDaGlsZFN0cmVhbShrZXkpOworICAgICAgICB0aGlzLmNoaWxkcmVuW2tl
eV0gPSBrZXlTdHJlYW07CisgICAgICB9CisKKyAgICAgIHJldHVybiBrZXlTdHJlYW07CisgICAg
fSwKKworICAgIGdldDogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBmaXJzdEtleSA9IF9l
bWJlck1ldGFsUGF0aF9jYWNoZS5nZXRGaXJzdEtleShwYXRoKTsKKyAgICAgIHZhciB0YWlsUGF0
aCA9IF9lbWJlck1ldGFsUGF0aF9jYWNoZS5nZXRUYWlsUGF0aChwYXRoKTsKKworICAgICAgaWYg
KHRoaXMuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aGlzLmNoaWxkcmVuID0g
bmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIH0KKworICAgICAg
dmFyIGtleVN0cmVhbSA9IHRoaXMuY2hpbGRyZW5bZmlyc3RLZXldOworCisgICAgICBpZiAoa2V5
U3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAga2V5U3RyZWFtID0gdGhpcy5fbWFrZUNo
aWxkU3RyZWFtKGZpcnN0S2V5LCBwYXRoKTsKKyAgICAgICAgdGhpcy5jaGlsZHJlbltmaXJzdEtl
eV0gPSBrZXlTdHJlYW07CisgICAgICB9CisKKyAgICAgIGlmICh0YWlsUGF0aCA9PT0gdW5kZWZp
bmVkKSB7CisgICAgICAgIHJldHVybiBrZXlTdHJlYW07CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4ga2V5U3RyZWFtLmdldCh0YWlsUGF0aCk7CisgICAgICB9CisgICAgfSwKKworICAg
IHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICAvLyBUT0RPOiBFbnN1cmUgdmFsdWUgaXMgbmV2
ZXIgY2FsbGVkIG9uIGEgZGVzdHJveWVkIHN0cmVhbQorICAgICAgLy8gc28gdGhhdCB3ZSBjYW4g
dW5jb21tZW50IHRoaXMgYXNzZXJ0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIGFzc2VydCgiU3Ry
ZWFtIGVycm9yOiB2YWx1ZSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gd2FzIGRlc3Ryb3ll
ZCIsICF0aGlzLmlzRGVzdHJveWVkKTsKKworICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmxv
Y2suIFRoaXMgd2lsbCByZXF1aXJlIGVuc3VyaW5nIHdlIGFyZQorICAgICAgLy8gbm90IHRyZWF0
aW5nIHN0cmVhbXMgYXMgInZvbGF0aWxlIiBhbnl3aGVyZS4KKyAgICAgIGlmICghdGhpcy5pc0Fj
dGl2ZSkgeworICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlOworICAgICAgfQorCisgICAgICB2
YXIgd2lsbFJldmFsaWRhdGUgPSBmYWxzZTsKKworICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlICYm
IHRoaXMuc3Vic2NyaWJlckhlYWQpIHsKKyAgICAgICAgdGhpcy5hY3RpdmF0ZSgpOworICAgICAg
ICB3aWxsUmV2YWxpZGF0ZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmlzRGly
dHkpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHsKKyAgICAgICAgICB3aWxsUmV2YWxp
ZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jb21w
dXRlKCk7CisgICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlOworICAgICAgfQorCisgICAgICBp
ZiAod2lsbFJldmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy5yZXZhbGlkYXRlKHRoaXMuY2FjaGUp
OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jYWNoZTsKKyAgICB9LAorCisgICAgYWRk
TXV0YWJsZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChvYmplY3QpIHsKKyAgICAgIHZhciBkZXBlbmRl
bmN5ID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc0RlcGVuZGVuY3kuZGVmYXVsdCh0aGlzLCBvYmpl
Y3QpOworCisgICAgICBpZiAodGhpcy5pc0FjdGl2ZSkgeworICAgICAgICBkZXBlbmRlbmN5LnN1
YnNjcmliZSgpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5kZXBlbmRlbmN5SGVhZCA9PT0g
bnVsbCkgeworICAgICAgICB0aGlzLmRlcGVuZGVuY3lIZWFkID0gdGhpcy5kZXBlbmRlbmN5VGFp
bCA9IGRlcGVuZGVuY3k7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdGFpbCA9IHRoaXMu
ZGVwZW5kZW5jeVRhaWw7CisgICAgICAgIHRhaWwubmV4dCA9IGRlcGVuZGVuY3k7CisgICAgICAg
IGRlcGVuZGVuY3kucHJldiA9IHRhaWw7CisgICAgICAgIHRoaXMuZGVwZW5kZW5jeVRhaWwgPSBk
ZXBlbmRlbmN5OworICAgICAgfQorCisgICAgICByZXR1cm4gZGVwZW5kZW5jeTsKKyAgICB9LAor
CisgICAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKG9iamVjdCkgeworICAgICAgaWYgKF9lbWJl
ck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9iamVjdCkpIHsKKyAgICAgICAgdGhpcy5hZGRN
dXRhYmxlRGVwZW5kZW5jeShvYmplY3QpOworICAgICAgfQorICAgIH0sCisKKyAgICBzdWJzY3Jp
YmVEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5ID0gdGhp
cy5kZXBlbmRlbmN5SGVhZDsKKyAgICAgIHdoaWxlIChkZXBlbmRlbmN5KSB7CisgICAgICAgIHZh
ciBuZXh0ID0gZGVwZW5kZW5jeS5uZXh0OworICAgICAgICBkZXBlbmRlbmN5LnN1YnNjcmliZSgp
OworICAgICAgICBkZXBlbmRlbmN5ID0gbmV4dDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgdW5z
dWJzY3JpYmVEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5
ID0gdGhpcy5kZXBlbmRlbmN5SGVhZDsKKyAgICAgIHdoaWxlIChkZXBlbmRlbmN5KSB7CisgICAg
ICAgIHZhciBuZXh0ID0gZGVwZW5kZW5jeS5uZXh0OworICAgICAgICBkZXBlbmRlbmN5LnVuc3Vi
c2NyaWJlKCk7CisgICAgICAgIGRlcGVuZGVuY3kgPSBuZXh0OworICAgICAgfQorICAgIH0sCisK
KyAgICBtYXliZURlYWN0aXZhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy5zdWJz
Y3JpYmVySGVhZCAmJiB0aGlzLmlzQWN0aXZlKSB7CisgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBm
YWxzZTsKKyAgICAgICAgdGhpcy51bnN1YnNjcmliZURlcGVuZGVuY2llcygpOworICAgICAgICB0
aGlzLmRlYWN0aXZhdGUoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgYWN0aXZhdGU6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlOworICAgICAgdGhpcy5zdWJzY3Jp
YmVEZXBlbmRlbmNpZXMoKTsKKyAgICB9LAorCisgICAgcmV2YWxpZGF0ZTogZnVuY3Rpb24gKHZh
bHVlKSB7CisgICAgICBpZiAodmFsdWUgIT09IHRoaXMub2JzZXJ2ZWRQcm94eSkgeworICAgICAg
ICB0aGlzLl9jbGVhck9ic2VydmVkUHJveHkoKTsKKworICAgICAgICBQcm94eU1peGluID0gUHJv
eHlNaXhpbiB8fCBfcmVxdWlyZS5kZWZhdWx0KCdlbWJlci1ydW50aW1lL21peGlucy8tcHJveHkn
KS5kZWZhdWx0OworCisgICAgICAgIGlmIChQcm94eU1peGluLmRldGVjdCh2YWx1ZSkpIHsKKyAg
ICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKHZhbHVlLCAnY29udGVudCcs
IHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgICB0aGlzLm9ic2VydmVkUHJveHkgPSB2YWx1
ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBfY2xlYXJPYnNlcnZlZFByb3h5
OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5vYnNlcnZlZFByb3h5KSB7CisgICAgICAg
IF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcy5vYnNlcnZlZFByb3h5LCAn
Y29udGVudCcsIHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgdGhpcy5vYnNlcnZlZFByb3h5
ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gKCkg
eworICAgICAgdGhpcy5fY2xlYXJPYnNlcnZlZFByb3h5KCk7CisgICAgfSwKKworICAgIGNvbXB1
dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtIGVycm9yOiBj
b21wdXRlIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIH0sCisKKyAgICBzZXRWYWx1ZTogZnVuY3Rp
b24gKCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJlYW0gZXJyb3I6IHNldFZhbHVlIG5v
dCBpbXBsZW1lbnRlZCcpOworICAgIH0sCisKKyAgICBub3RpZnk6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRoaXMubm90aWZ5RXhjZXB0KCk7CisgICAgfSwKKworICAgIG5vdGlmeUV4Y2VwdDogZnVu
Y3Rpb24gKGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKSB7CisgICAgICBpZiAoIXRoaXMu
aXNEaXJ0eSkgeworICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlOworICAgICAgICB0aGlzLm5v
dGlmeVN1YnNjcmliZXJzKGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdHJpZWQgdG8gc3Vic2NyaWJlIHRv
IGEgc3RyZWFtIGJ1dCB0aGUgY2FsbGJhY2sgcHJvdmlkZWQgd2FzIG5vdCBhIGZ1bmN0aW9uLics
IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyk7CisKKyAgICAgIHZhciBzdWJzY3JpYmVy
ID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1N1YnNjcmliZXIuZGVmYXVsdChjYWxsYmFjaywgY29u
dGV4dCwgdGhpcyk7CisgICAgICBpZiAodGhpcy5zdWJzY3JpYmVySGVhZCA9PT0gbnVsbCkgewor
ICAgICAgICB0aGlzLnN1YnNjcmliZXJIZWFkID0gdGhpcy5zdWJzY3JpYmVyVGFpbCA9IHN1YnNj
cmliZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdGFpbCA9IHRoaXMuc3Vic2NyaWJl
clRhaWw7CisgICAgICAgIHRhaWwubmV4dCA9IHN1YnNjcmliZXI7CisgICAgICAgIHN1YnNjcmli
ZXIucHJldiA9IHRhaWw7CisgICAgICAgIHRoaXMuc3Vic2NyaWJlclRhaWwgPSBzdWJzY3JpYmVy
OworICAgICAgfQorCisgICAgICB2YXIgc3RyZWFtID0gdGhpczsKKyAgICAgIHJldHVybiBmdW5j
dGlvbiAocHJ1bmUpIHsKKyAgICAgICAgc3Vic2NyaWJlci5yZW1vdmVGcm9tKHN0cmVhbSk7Cisg
ICAgICAgIGlmIChwcnVuZSkgeworICAgICAgICAgIHN0cmVhbS5wcnVuZSgpOworICAgICAgICB9
CisgICAgICB9OworICAgIH0sCisKKyAgICBwcnVuZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYg
KHRoaXMuc3Vic2NyaWJlckhlYWQgPT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5kZXN0cm95KHRy
dWUpOworICAgICAgfQorICAgIH0sCisKKyAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKGNhbGxi
YWNrLCBjb250ZXh0KSB7CisgICAgICB2YXIgc3Vic2NyaWJlciA9IHRoaXMuc3Vic2NyaWJlckhl
YWQ7CisKKyAgICAgIHdoaWxlIChzdWJzY3JpYmVyKSB7CisgICAgICAgIHZhciBuZXh0ID0gc3Vi
c2NyaWJlci5uZXh0OworICAgICAgICBpZiAoc3Vic2NyaWJlci5jYWxsYmFjayA9PT0gY2FsbGJh
Y2sgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09PSBjb250ZXh0KSB7CisgICAgICAgICAgc3Vic2Ny
aWJlci5yZW1vdmVGcm9tKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN1YnNjcmliZXIgPSBu
ZXh0OworICAgICAgfQorICAgIH0sCisKKyAgICBub3RpZnlTdWJzY3JpYmVyczogZnVuY3Rpb24g
KGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKSB7CisgICAgICB2YXIgc3Vic2NyaWJlciA9
IHRoaXMuc3Vic2NyaWJlckhlYWQ7CisKKyAgICAgIHdoaWxlIChzdWJzY3JpYmVyKSB7CisgICAg
ICAgIHZhciBuZXh0ID0gc3Vic2NyaWJlci5uZXh0OworCisgICAgICAgIHZhciBjYWxsYmFjayA9
IHN1YnNjcmliZXIuY2FsbGJhY2s7CisgICAgICAgIHZhciBjb250ZXh0ID0gc3Vic2NyaWJlci5j
b250ZXh0OworCisgICAgICAgIHN1YnNjcmliZXIgPSBuZXh0OworCisgICAgICAgIGlmIChjYWxs
YmFjayA9PT0gY2FsbGJhY2tUb1NraXAgJiYgY29udGV4dCA9PT0gY29udGV4dFRvU2tpcCkgewor
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT09
IHVuZGVmaW5lZCkgeworICAgICAgICAgIGNhbGxiYWNrKHRoaXMpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdGhpcyk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgZGVzdHJveTogZnVuY3Rpb24gKHBydW5lKSB7CisgICAgICBp
ZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKKyAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7
CisKKyAgICAgICAgdGhpcy5zdWJzY3JpYmVySGVhZCA9IHRoaXMuc3Vic2NyaWJlclRhaWwgPSBu
dWxsOworICAgICAgICB0aGlzLm1heWJlRGVhY3RpdmF0ZSgpOworCisgICAgICAgIHZhciBkZXBl
bmRlbmNpZXMgPSB0aGlzLmRlcGVuZGVuY2llczsKKworICAgICAgICBpZiAoZGVwZW5kZW5jaWVz
KSB7CisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBkZXBlbmRlbmNpZXMubGVuZ3RoOyBp
IDwgbDsgaSsrKSB7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXNbaV0ocHJ1bmUpOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0K
KyAgfTsKKworICBCYXNpY1N0cmVhbS5leHRlbmQgPSBmdW5jdGlvbiAob2JqZWN0KSB7CisgICAg
dmFyIENoaWxkID0gZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5faW5pdCgpOworICAgICAgdGhp
cy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKHRoaXMpOworICAgIH07CisKKyAgICBDaGlsZC5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKHRoaXMucHJvdG90eXBlKTsKKworICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQo
Q2hpbGQucHJvdG90eXBlLCBvYmplY3QpOworICAgIENoaWxkLmV4dGVuZCA9IEJhc2ljU3RyZWFt
LmV4dGVuZDsKKyAgICByZXR1cm4gQ2hpbGQ7CisgIH07CisKKyAgdmFyIFN0cmVhbSA9IEJhc2lj
U3RyZWFtLmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGZuLCBsYWJlbCkgeworICAgICAg
dGhpcy5fY29tcHV0ZSA9IGZuOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0sCisK
KyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY29tcHV0ZSgp
OworICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgS2luZCwgcGFyYW0pIHsK
KyAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0odmFsdWUpKSB7CisgICAg
ICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgS2luZCh2YWx1
ZSwgcGFyYW0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1ha2VMYWJlbChsYWJlbCkgewor
ICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gJyhubyBsYWJlbCkn
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorICB9CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gQmFzaWNTdHJlYW07CisgIGV4cG9ydHMuU3RyZWFtID0gU3RyZWFtOwor
fSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Vic2NyaWJlcicsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQXNz
aWduKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBAbW9kdWxlIGVtYmVyLW1ldGFs
CisgICovCisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAY2xhc3MgU3Vic2NyaWJlcgorICAg
IEBuYW1lc3BhY2UgRW1iZXIuc3RyZWFtcworICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5j
dGlvbiBTdWJzY3JpYmVyKGNhbGxiYWNrLCBjb250ZXh0KSB7CisgICAgdGhpcy5uZXh0ID0gbnVs
bDsKKyAgICB0aGlzLnByZXYgPSBudWxsOworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsK
KyAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24u
ZGVmYXVsdChTdWJzY3JpYmVyLnByb3RvdHlwZSwgeworICAgIHJlbW92ZUZyb206IGZ1bmN0aW9u
IChzdHJlYW0pIHsKKyAgICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0OworICAgICAgdmFyIHByZXYg
PSB0aGlzLnByZXY7CisKKyAgICAgIGlmIChwcmV2KSB7CisgICAgICAgIHByZXYubmV4dCA9IG5l
eHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0uc3Vic2NyaWJlckhlYWQgPSBuZXh0
OworICAgICAgfQorCisgICAgICBpZiAobmV4dCkgeworICAgICAgICBuZXh0LnByZXYgPSBwcmV2
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtLnN1YnNjcmliZXJUYWlsID0gcHJldjsK
KyAgICAgIH0KKworICAgICAgc3RyZWFtLm1heWJlRGVhY3RpdmF0ZSgpOworICAgIH0KKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gU3Vic2NyaWJlcjsKK30pOworZW5pZmVkKCdlbWJlci1t
ZXRhbC9zdHJlYW1zL3V0aWxzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2Vt
YmVyLW1ldGFsL3N0cmVhbXMvc3RyZWFtJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bERlYnVnLCBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuaXNTdHJlYW0gPSBpc1N0cmVhbTsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJz
Y3JpYmU7CisgIGV4cG9ydHMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKKyAgZXhwb3J0cy5y
ZWFkID0gcmVhZDsKKyAgZXhwb3J0cy5yZWFkQXJyYXkgPSByZWFkQXJyYXk7CisgIGV4cG9ydHMu
cmVhZEhhc2ggPSByZWFkSGFzaDsKKyAgZXhwb3J0cy5zY2FuQXJyYXkgPSBzY2FuQXJyYXk7Cisg
IGV4cG9ydHMuc2Nhbkhhc2ggPSBzY2FuSGFzaDsKKyAgZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7
CisgIGV4cG9ydHMubGFiZWxzRm9yID0gbGFiZWxzRm9yOworICBleHBvcnRzLmxhYmVsc0Zvck9i
amVjdCA9IGxhYmVsc0Zvck9iamVjdDsKKyAgZXhwb3J0cy5sYWJlbEZvciA9IGxhYmVsRm9yOwor
ICBleHBvcnRzLm9yID0gb3I7CisgIGV4cG9ydHMuYWRkRGVwZW5kZW5jeSA9IGFkZERlcGVuZGVu
Y3k7CisgIGV4cG9ydHMuemlwID0gemlwOworICBleHBvcnRzLnppcEhhc2ggPSB6aXBIYXNoOwor
ICBleHBvcnRzLmNoYWluID0gY2hhaW47CisgIGV4cG9ydHMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsK
KworICAvKgorICAgQ2hlY2sgd2hldGhlciBhbiBvYmplY3QgaXMgYSBzdHJlYW0gb3Igbm90Lgor
ICAKKyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIGlzU3Ry
ZWFtCisgICBAcGFyYW0ge09iamVjdHxTdHJlYW19IG9iamVjdCBPYmplY3QgdG8gY2hlY2sgd2hl
dGhlciBpdCBpcyBhIHN0cmVhbS4KKyAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUg
b2JqZWN0IGlzIGEgc3RyZWFtLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgKi8KKworICBmdW5jdGlv
biBpc1N0cmVhbShvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtfZW1iZXJN
ZXRhbFN0cmVhbXNTdHJlYW0uSVNfU1RSRUFNXTsKKyAgfQorCisgIC8qCisgICBBIG1ldGhvZCBv
ZiBzdWJzY3JpYmluZyB0byBhIHN0cmVhbSB3aGljaCBpcyBzYWZlIGZvciB1c2Ugd2l0aCBhIG5v
bi1zdHJlYW0KKyAgIG9iamVjdC4gSWYgYSBub24tc3RyZWFtIG9iamVjdCBpcyBwYXNzZWQsIHRo
ZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgIAorICAgQHB1YmxpYworICAgQGZvciBFbWJlci5z
dHJlYW0KKyAgIEBmdW5jdGlvbiBzdWJzY3JpYmUKKyAgIEBwYXJhbSB7T2JqZWN0fFN0cmVhbX0g
b2JqZWN0IE9iamVjdCBvciBzdHJlYW0gdG8gcG90ZW50aWFsbHkgc3Vic2NyaWJlIHRvLgorICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gcnVuIHdoZW4gc3RyZWFtIHZh
bHVlIGNoYW5nZXMuCisgICBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIHRoZSBjYWxsYmFjayB3
aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhpcyBjb250ZXh0IGlmIGl0CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgorICAgKi8KKworICBmdW5jdGlvbiBzdWJzY3JpYmUo
b2JqZWN0LCBjYWxsYmFjaywgY29udGV4dCkgeworICAgIGlmIChvYmplY3QgJiYgb2JqZWN0W19l
bWJlck1ldGFsU3RyZWFtc1N0cmVhbS5JU19TVFJFQU1dKSB7CisgICAgICByZXR1cm4gb2JqZWN0
LnN1YnNjcmliZShjYWxsYmFjaywgY29udGV4dCk7CisgICAgfQorICB9CisKKyAgLyoKKyAgIEEg
bWV0aG9kIG9mIHVuc3Vic2NyaWJpbmcgZnJvbSBhIHN0cmVhbSB3aGljaCBpcyBzYWZlIGZvciB1
c2Ugd2l0aCBhIG5vbi1zdHJlYW0KKyAgIG9iamVjdC4gSWYgYSBub24tc3RyZWFtIG9iamVjdCBp
cyBwYXNzZWQsIHRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgIAorICAgQHByaXZhdGUKKyAg
IEBmb3IgRW1iZXIuc3RyZWFtCisgICBAZnVuY3Rpb24gdW5zdWJzY3JpYmUKKyAgIEBwYXJhbSB7
T2JqZWN0fFN0cmVhbX0gb2JqZWN0IE9iamVjdCBvciBzdHJlYW0gdG8gcG90ZW50aWFsbHkgdW5z
dWJzY3JpYmUgZnJvbS4KKyAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIG9y
aWdpbmFsbHkgcGFzc2VkIHRvIGBzdWJzY3JpYmUoKWAuCisgICBAcGFyYW0ge09iamVjdH0gW2Nv
bnRleHRdIE9iamVjdCBvcmlnaW5hbGx5IHBhc3NlZCB0byBgc3Vic2NyaWJlKClgLgorICAgKi8K
KworICBmdW5jdGlvbiB1bnN1YnNjcmliZShvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7Cisg
ICAgaWYgKG9iamVjdCAmJiBvYmplY3RbX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLklTX1NUUkVB
TV0pIHsKKyAgICAgIG9iamVjdC51bnN1YnNjcmliZShjYWxsYmFjaywgY29udGV4dCk7CisgICAg
fQorICB9CisKKyAgLyoKKyAgIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIHN0cmVhbSwgb3IgaW4g
dGhlIGNhc2Ugd2hlcmUgYSBub24tc3RyZWFtIG9iamVjdCBpcyBwYXNzZWQsCisgICByZXR1cm4g
dGhlIG9iamVjdCBpdHNlbGYuCisgIAorICAgQHByaXZhdGUKKyAgIEBmb3IgRW1iZXIuc3RyZWFt
CisgICBAZnVuY3Rpb24gcmVhZAorICAgQHBhcmFtIHtPYmplY3R8U3RyZWFtfSBvYmplY3QgT2Jq
ZWN0IHRvIHJldHVybiB0aGUgdmFsdWUgb2YuCisgICBAcmV0dXJuIFRoZSBzdHJlYW0ncyBjdXJy
ZW50IHZhbHVlLCBvciB0aGUgbm9uLXN0cmVhbSBvYmplY3QgaXRzZWxmLgorICAgKi8KKworICBm
dW5jdGlvbiByZWFkKG9iamVjdCkgeworICAgIGlmIChvYmplY3QgJiYgb2JqZWN0W19lbWJlck1l
dGFsU3RyZWFtc1N0cmVhbS5JU19TVFJFQU1dKSB7CisgICAgICByZXR1cm4gb2JqZWN0LnZhbHVl
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorICB9CisKKyAg
LyoKKyAgIE1hcCBhbiBhcnJheSwgcmVwbGFjaW5nIGFueSBzdHJlYW1zIHdpdGggdGhlaXIgdmFs
dWVzLgorICAKKyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9u
IHJlYWRBcnJheQorICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlYWQgdmFs
dWVzIGZyb20KKyAgIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheSBvZiB0aGUgc2FtZSBsZW5n
dGggd2l0aCB0aGUgdmFsdWVzIG9mIG5vbi1zdHJlYW0KKyAgICAgICAgICAgICAgICAgICBvYmpl
Y3RzIG1hcHBlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9ucyB1bnRvdWNoZWQsIGFuZAor
ICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZXMgb2Ygc3RyZWFtIG9iamVjdHMgcmV0YWluaW5n
IHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgYW5kIHJlcGxhY2Vk
IHdpdGggdGhlIHN0cmVhbSdzIGN1cnJlbnQgdmFsdWUuCisgICAqLworCisgIGZ1bmN0aW9uIHJl
YWRBcnJheShhcnJheSkgeworICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgdmFy
IHJldCA9IG5ldyBBcnJheShsZW5ndGgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3Ro
OyBpKyspIHsKKyAgICAgIHJldFtpXSA9IHJlYWQoYXJyYXlbaV0pOworICAgIH0KKyAgICByZXR1
cm4gcmV0OworICB9CisKKyAgLyoKKyAgIE1hcCBhIGhhc2gsIHJlcGxhY2luZyBhbnkgc3RyZWFt
IHByb3BlcnR5IHZhbHVlcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoYXQKKyAgIHN0cmVh
bS4KKyAgCisgICBAcHJpdmF0ZQorICAgQGZvciBFbWJlci5zdHJlYW0KKyAgIEBmdW5jdGlvbiBy
ZWFkSGFzaAorICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgaGFzaCB0byByZWFkIGtleXMg
YW5kIHZhbHVlcyBmcm9tLgorICAgQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCB0
aGUgc2FtZSBrZXlzIGFzIHRoZSBwYXNzZWQgb2JqZWN0LiBUaGUKKyAgICAgICAgICAgICAgICAg
ICAgcHJvcGVydHkgdmFsdWVzIGluIHRoZSBuZXcgb2JqZWN0IGFyZSB0aGUgb3JpZ2luYWwgdmFs
dWVzIGluCisgICAgICAgICAgICAgICAgICAgIHRoZSBjYXNlIG9mIG5vbi1zdHJlYW0gb2JqZWN0
cywgYW5kIHRoZSBzdHJlYW1zJyBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBp
biB0aGUgY2FzZSBvZiBzdHJlYW0gb2JqZWN0cy4KKyAgICovCisKKyAgZnVuY3Rpb24gcmVhZEhh
c2gob2JqZWN0KSB7CisgICAgdmFyIHJldCA9IHt9OworICAgIGZvciAodmFyIGtleSBpbiBvYmpl
Y3QpIHsKKyAgICAgIHJldFtrZXldID0gcmVhZChvYmplY3Rba2V5XSk7CisgICAgfQorICAgIHJl
dHVybiByZXQ7CisgIH0KKworICAvKgorICAgQ2hlY2sgd2hldGhlciBhbiBhcnJheSBjb250YWlu
cyBhbnkgc3RyZWFtIHZhbHVlcy4KKyAgCisgICBAcHJpdmF0ZQorICAgQGZvciBFbWJlci5zdHJl
YW0KKyAgIEBmdW5jdGlvbiBzY2FuQXJyYXkKKyAgIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFycmF5
IGdpdmVuIHRvIGEgaGFuZGxlYmFycyBoZWxwZXIuCisgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1
ZWAgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGEgc3RyZWFtL2JvdW5kIHZhbHVlLCBgZmFsc2VgCisg
ICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICovCisKKyAgZnVuY3Rpb24gc2NhbkFy
cmF5KGFycmF5KSB7CisgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKyAgICB2YXIgY29u
dGFpbnNTdHJlYW0gPSBmYWxzZTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBp
KyspIHsKKyAgICAgIGlmIChpc1N0cmVhbShhcnJheVtpXSkpIHsKKyAgICAgICAgY29udGFpbnNT
dHJlYW0gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gY29udGFpbnNTdHJlYW07CisgIH0KKworICAvKgorICAgQ2hlY2sgd2hldGhlciBhIGhhc2gg
aGFzIGFueSBzdHJlYW0gcHJvcGVydHkgdmFsdWVzLgorICAKKyAgIEBwcml2YXRlCisgICBAZm9y
IEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIHNjYW5IYXNoCisgICBAcGFyYW0ge09iamVjdH0g
aGFzaCAiaGFzaCIgYXJndW1lbnQgZ2l2ZW4gdG8gYSBoYW5kbGViYXJzIGhlbHBlci4KKyAgIEBy
ZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGEgc3RyZWFtL2Jv
dW5kIHZhbHVlLCBgZmFsc2VgCisgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICAq
LworCisgIGZ1bmN0aW9uIHNjYW5IYXNoKGhhc2gpIHsKKyAgICB2YXIgY29udGFpbnNTdHJlYW0g
PSBmYWxzZTsKKworICAgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgICAgaWYgKGlzU3Ry
ZWFtKGhhc2hbcHJvcF0pKSB7CisgICAgICAgIGNvbnRhaW5zU3RyZWFtID0gdHJ1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRhaW5zU3RyZWFtOwor
ICB9CisKKyAgdmFyIENvbmNhdFN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZh
dWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGFycmF5LCBzZXBhcmF0b3IpIHsKKyAg
ICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKyAgICAgIHRoaXMuc2VwYXJhdG9yID0gc2VwYXJhdG9y
OworCisgICAgICAvLyBVc2VkIGJ5IGFuZ2xlIGJyYWNrZXQgY29tcG9uZW50cyB0byBkZXRlY3Qg
YW4gYXR0cmlidXRlIHdhcyBwcm92aWRlZAorICAgICAgLy8gYXMgYSBzdHJpbmcgbGl0ZXJhbC4K
KyAgICAgIHRoaXMuaXNDb25jYXQgPSB0cnVlOworICAgIH0sCisKKyAgICBsYWJlbDogZnVuY3Rp
b24gKCkgeworICAgICAgdmFyIGxhYmVscyA9IGxhYmVsc0Zvcih0aGlzLmFycmF5KTsKKyAgICAg
IHJldHVybiAnY29uY2F0KFsnICsgbGFiZWxzLmpvaW4oJywgJykgKyAnXTsgc2VwYXJhdG9yPScg
KyBpbnNwZWN0KHRoaXMuc2VwYXJhdG9yKSArICcpJzsKKyAgICB9LAorCisgICAgY29tcHV0ZTog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGNvbmNhdChyZWFkQXJyYXkodGhpcy5hcnJheSks
IHRoaXMuc2VwYXJhdG9yKTsKKyAgICB9CisgIH0pOworCisgIC8qCisgICBKb2luIGFuIGFycmF5
LCB3aXRoIGFueSBzdHJlYW1zIHJlcGxhY2VkIGJ5IHRoZWlyIGN1cnJlbnQgdmFsdWVzLgorICAK
KyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIGNvbmNhdAor
ICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgQW4gYXJyYXkgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUg
c3RyZWFtIG9iamVjdHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIG9yIG1vcmUg
bm9uLXN0cmVhbSBvYmplY3RzLgorICAgQHBhcmFtIHtTdHJpbmd9IHNlcGFyYXRvciBTdHJpbmcg
dG8gYmUgdXNlZCB0byBqb2luIGFycmF5IGVsZW1lbnRzLgorICAgQHJldHVybiB7U3RyaW5nfSBT
dHJpbmcgd2l0aCBhcnJheSBlbGVtZW50cyBjb25jYXRlbmF0ZWQgYW5kIGpvaW5lZCBieSB0aGUK
KyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgc2VwYXJhdG9yLCBhbmQgYW55IHN0cmVhbSBh
cnJheSBtZW1iZXJzIGhhdmluZyBiZWVuCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5
IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJlYW0uCisgICAqLworCisgIGZ1bmN0aW9uIGNv
bmNhdChhcnJheSwgc2VwYXJhdG9yKSB7CisgICAgLy8gVE9ETzogQ3JlYXRlIHN1YmNsYXNzIENv
bmNhdFN0cmVhbSA8IFN0cmVhbS4gRGVmZXIKKyAgICAvLyBzdWJzY3JpYmluZyB0byBzdHJlYW1z
IHVudGlsIHRoZSB2YWx1ZSgpIGlzIGNhbGxlZC4KKyAgICB2YXIgaGFzU3RyZWFtID0gc2NhbkFy
cmF5KGFycmF5KTsKKyAgICBpZiAoaGFzU3RyZWFtKSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3
IENvbmNhdFN0cmVhbShhcnJheSwgc2VwYXJhdG9yKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAs
IGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgYWRkRGVwZW5kZW5jeShz
dHJlYW0sIGFycmF5W2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICB9
IGVsc2UgeworICAgICAgcmV0dXJuIGFycmF5LmpvaW4oc2VwYXJhdG9yKTsKKyAgICB9CisgIH0K
KworICBmdW5jdGlvbiBsYWJlbHNGb3Ioc3RyZWFtcykgeworICAgIHZhciBsYWJlbHMgPSBbXTsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3RyZWFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgIHZhciBzdHJlYW0gPSBzdHJlYW1zW2ldOworICAgICAgbGFiZWxzLnB1c2gobGFiZWxG
b3Ioc3RyZWFtKSk7CisgICAgfQorCisgICAgcmV0dXJuIGxhYmVsczsKKyAgfQorCisgIGZ1bmN0
aW9uIGxhYmVsc0Zvck9iamVjdChzdHJlYW1zKSB7CisgICAgdmFyIGxhYmVscyA9IFtdOworCisg
ICAgZm9yICh2YXIgcHJvcCBpbiBzdHJlYW1zKSB7CisgICAgICBsYWJlbHMucHVzaChwcm9wICsg
JzogJyArIGluc3BlY3Qoc3RyZWFtc1twcm9wXSkpOworICAgIH0KKworICAgIHJldHVybiBsYWJl
bHMubGVuZ3RoID8gJ3sgJyArIGxhYmVscy5qb2luKCcsICcpICsgJyB9JyA6ICd7fSc7CisgIH0K
KworICBmdW5jdGlvbiBsYWJlbEZvcihtYXliZVN0cmVhbSkgeworICAgIGlmIChpc1N0cmVhbSht
YXliZVN0cmVhbSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBtYXliZVN0cmVhbTsKKyAgICAgIHJl
dHVybiB0eXBlb2Ygc3RyZWFtLmxhYmVsID09PSAnZnVuY3Rpb24nID8gc3RyZWFtLmxhYmVsKCkg
OiBzdHJlYW0ubGFiZWw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbnNwZWN0KG1heWJl
U3RyZWFtKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlKSB7CisgICAg
c3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKKyAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgIHJl
dHVybiAnIicgKyB2YWx1ZSArICciJzsKKyAgICAgIGNhc2UgJ29iamVjdCc6CisgICAgICAgIHJl
dHVybiAneyAuLi4gfSc7CisgICAgICBjYXNlICdmdW5jdGlvbic6CisgICAgICAgIHJldHVybiAn
ZnVuY3Rpb24oKSB7IC4uLiB9JzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTdHJp
bmcodmFsdWUpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG9yKGZpcnN0LCBzZWNvbmQpIHsK
KyAgICB2YXIgc3RyZWFtID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5TdHJlYW0oZnVu
Y3Rpb24gKCkgeworICAgICAgcmV0dXJuIGZpcnN0LnZhbHVlKCkgfHwgc2Vjb25kLnZhbHVlKCk7
CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGxhYmVsRm9yKGZpcnN0KSArICcg
fHwgJyArIGxhYmVsRm9yKHNlY29uZCk7CisgICAgfSk7CisKKyAgICBzdHJlYW0uYWRkRGVwZW5k
ZW5jeShmaXJzdCk7CisgICAgc3RyZWFtLmFkZERlcGVuZGVuY3koc2Vjb25kKTsKKworICAgIHJl
dHVybiBzdHJlYW07CisgIH0KKworICBmdW5jdGlvbiBhZGREZXBlbmRlbmN5KHN0cmVhbSwgZGVw
ZW5kZW5jeSkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgYWRkIGEgc3Ry
ZWFtIGFzIGEgZGVwZW5kZW5jeSB0byBhIG5vbi1zdHJlYW0nLCBpc1N0cmVhbShzdHJlYW0pIHx8
ICFpc1N0cmVhbShkZXBlbmRlbmN5KSk7CisgICAgaWYgKGlzU3RyZWFtKHN0cmVhbSkpIHsKKyAg
ICAgIHN0cmVhbS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgIH0KKyAgfQorCisgIGZ1
bmN0aW9uIHppcChzdHJlYW1zLCBjYWxsYmFjaywgbGFiZWwpIHsKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnTXVzdCBjYWxsIHppcCB3aXRoIGEgbGFiZWwnLCAhIWxhYmVsKTsKKworICAg
IHZhciBzdHJlYW0gPSBuZXcgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLlN0cmVhbShmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYXJyYXkgPSByZWFkQXJyYXkoc3RyZWFtcyk7CisgICAgICByZXR1
cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhhcnJheSkgOiBhcnJheTsKKyAgICB9LCBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gbGFiZWwgKyAnKCcgKyBsYWJlbHNGb3Ioc3RyZWFtcykgKyAnKSc7
CisgICAgfSk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHN0cmVhbXMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICBzdHJlYW0uYWRkRGVwZW5kZW5jeShzdHJlYW1zW2ldKTsKKyAgICB9
CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgZnVuY3Rpb24gemlwSGFzaChvYmplY3Qs
IGNhbGxiYWNrLCBsYWJlbCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdNdXN0IGNh
bGwgemlwSGFzaCB3aXRoIGEgbGFiZWwnLCAhIWxhYmVsKTsKKworICAgIHZhciBzdHJlYW0gPSBu
ZXcgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLlN0cmVhbShmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgaGFzaCA9IHJlYWRIYXNoKG9iamVjdCk7CisgICAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxs
YmFjayhoYXNoKSA6IGhhc2g7CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGxh
YmVsICsgJygnICsgbGFiZWxzRm9yT2JqZWN0KG9iamVjdCkgKyAnKSc7CisgICAgfSk7CisKKyAg
ICBmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgeworICAgICAgc3RyZWFtLmFkZERlcGVuZGVuY3ko
b2JqZWN0W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgLyoq
CisgICBHZW5lcmF0ZSBhIG5ldyBzdHJlYW0gYnkgcHJvdmlkaW5nIGEgc291cmNlIHN0cmVhbSBh
bmQgYSBmdW5jdGlvbiB0aGF0IGNhbgorICAgYmUgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIHN0cmVh
bSdzIHZhbHVlLiBJbiB0aGUgY2FzZSBvZiBhIG5vbi1zdHJlYW0gb2JqZWN0LAorICAgcmV0dXJu
cyB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi4KKyAgCisgICBUaGUgdmFsdWUgdG8gdHJhbnNm
b3JtIHdvdWxkIHR5cGljYWxseSBiZSBhdmFpbGFibGUgdG8gdGhlIGZ1bmN0aW9uIHlvdSBwYXNz
CisgICB0byBgY2hhaW4oKWAgdmlhIHNjb3BlLiBGb3IgZXhhbXBsZToKKyAgCisgICBgYGBqYXZh
c2NyaXB0CisgICAgICAgdmFyIHNvdXJjZSA9IC4uLjsgIC8vIHN0cmVhbSByZXR1cm5pbmcgYSBu
dW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgbnVtZXJpYyAobm9u
LXN0cmVhbSkgb2JqZWN0CisgICAgICAgdmFyIHJlc3VsdCA9IGNoYWluKHNvdXJjZSwgZnVuY3Rp
b24oKSB7CisgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gcmVhZChzb3VyY2UpOworICAgICAg
ICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSArIDE7CisgICAgICAgfSk7CisgICBgYGAKKyAgCisgICBJ
biB0aGUgZXhhbXBsZSwgcmVzdWx0IGlzIGEgc3RyZWFtIGlmIHNvdXJjZSBpcyBhIHN0cmVhbSwg
b3IgYSBudW1iZXIgb2YKKyAgIHNvdXJjZSB3YXMgbnVtZXJpYy4KKyAgCisgICBAcHJpdmF0ZQor
ICAgQGZvciBFbWJlci5zdHJlYW0KKyAgIEBmdW5jdGlvbiBjaGFpbgorICAgQHBhcmFtIHtPYmpl
Y3R8U3RyZWFtfSB2YWx1ZSBBIHN0cmVhbSBvciBub24tc3RyZWFtIG9iamVjdC4KKyAgIEBwYXJh
bSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIHJ1biB3aGVuIHRoZSBzdHJlYW0gdmFsdWUg
Y2hhbmdlcywgb3IgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJ1biBvbmNlIGluIHRo
ZSBjYXNlIG9mIGEgbm9uLXN0cmVhbSBvYmplY3QuCisgICBAcmV0dXJuIHtPYmplY3R8U3RyZWFt
fSBJbiB0aGUgY2FzZSBvZiBhIHN0cmVhbSBgdmFsdWVgIHBhcmFtZXRlciwgYSBuZXcKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0aGF0IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRo
ZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRl
ZCBmdW5jdGlvbiBgZm5gLiBJbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub24tc3RyZWFtIG9iamVjdCwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvdmlkZWQK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGBmbmAuCisgICAqLworCisgIGZ1
bmN0aW9uIGNoYWluKHZhbHVlLCBmbiwgbGFiZWwpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnTXVzdCBjYWxsIGNoYWluIHdpdGggYSBsYWJlbCcsICEhbGFiZWwpOworICAgIGlmIChp
c1N0cmVhbSh2YWx1ZSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX2VtYmVyTWV0YWxTdHJl
YW1zU3RyZWFtLlN0cmVhbShmbiwgZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gbGFiZWwg
KyAnKCcgKyBsYWJlbEZvcih2YWx1ZSkgKyAnKSc7CisgICAgICB9KTsKKyAgICAgIHN0cmVhbS5h
ZGREZXBlbmRlbmN5KHZhbHVlKTsKKyAgICAgIHJldHVybiBzdHJlYW07CisgICAgfSBlbHNlIHsK
KyAgICAgIHJldHVybiBmbigpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHNldFZhbHVlKG9i
amVjdCwgdmFsdWUpIHsKKyAgICBpZiAob2JqZWN0ICYmIG9iamVjdFtfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0uSVNfU1RSRUFNXSkgeworICAgICAgb2JqZWN0LnNldFZhbHVlKHZhbHVlKTsKKyAg
ICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9zeW1ib2wnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHN5bWJvbDsKKworICBm
dW5jdGlvbiBzeW1ib2woZGVidWdOYW1lKSB7CisgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgdXNp
bmcgcGxhdGZvcm0gc3ltYm9scywgYnV0IHdlIGRvIG5vdAorICAgIC8vIHdhbnQgdG8gcmVxdWly
ZSBub24tZW51bWVyYWJpbGl0eSBmb3IgdGhpcyBBUEksIHdoaWNoCisgICAgLy8gd291bGQgaW50
cm9kdWNlIGEgbGFyZ2UgY29zdC4KKworICAgIHJldHVybiBfZW1iZXJNZXRhbFV0aWxzLmludGVy
bihkZWJ1Z05hbWUgKyAnIFtpZD0nICsgX2VtYmVyTWV0YWxVdGlscy5HVUlEX0tFWSArIE1hdGgu
Zmxvb3IoTWF0aC5yYW5kb20oKSAqIG5ldyBEYXRlKCkpICsgJ10nKTsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLW1ldGFsL3RhZ3MnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdy
ZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbE1ldGEsIF9yZXF1aXJlMikg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy50YWdGb3IgPSB0YWdGb3I7CisKKyAgdmFy
IGhhc0dsaW1tZXIgPSBfcmVxdWlyZTIuaGFzKCdnbGltbWVyLXJlZmVyZW5jZScpOworICB2YXIg
Q09OU1RBTlRfVEFHID0gdW5kZWZpbmVkLAorICAgICAgQ1VSUkVOVF9UQUcgPSB1bmRlZmluZWQs
CisgICAgICBEaXJ0eWFibGVUYWcgPSB1bmRlZmluZWQsCisgICAgICBtYWtlVGFnID0gdW5kZWZp
bmVkOworCisgIHZhciBtYXJrT2JqZWN0QXNEaXJ0eSA9IHVuZGVmaW5lZDsKKworICBleHBvcnRz
Lm1hcmtPYmplY3RBc0RpcnR5ID0gbWFya09iamVjdEFzRGlydHk7CisKKyAgZnVuY3Rpb24gdGFn
Rm9yKG9iamVjdCwgX21ldGEpIHsKKyAgICBpZiAoIWhhc0dsaW1tZXIpIHsKKyAgICAgIHRocm93
IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgdGFnRm9yIHdpdGhvdXQgR2xpbW1lcicpOworICAgIH0K
KworICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHsKKyAgICAg
IHZhciBtZXRhID0gX21ldGEgfHwgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqZWN0KTsKKyAgICAg
IHJldHVybiBtZXRhLndyaXRhYmxlVGFnKG1ha2VUYWcpOworICAgIH0gZWxzZSB7CisgICAgICBy
ZXR1cm4gQ09OU1RBTlRfVEFHOworICAgIH0KKyAgfQorCisgIGlmIChoYXNHbGltbWVyKSB7Cisg
ICAgdmFyIF9yZXF1aXJlID0gX3JlcXVpcmUyLmRlZmF1bHQoJ2dsaW1tZXItcmVmZXJlbmNlJyk7
CisKKyAgICBEaXJ0eWFibGVUYWcgPSBfcmVxdWlyZS5EaXJ0eWFibGVUYWc7CisgICAgQ09OU1RB
TlRfVEFHID0gX3JlcXVpcmUuQ09OU1RBTlRfVEFHOworICAgIENVUlJFTlRfVEFHID0gX3JlcXVp
cmUuQ1VSUkVOVF9UQUc7CisKKyAgICBtYWtlVGFnID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0
dXJuIG5ldyBEaXJ0eWFibGVUYWcoKTsKKyAgICB9OworCisgICAgZXhwb3J0cy5tYXJrT2JqZWN0
QXNEaXJ0eSA9IG1hcmtPYmplY3RBc0RpcnR5ID0gZnVuY3Rpb24gKG1ldGEpIHsKKyAgICAgIHZh
ciB0YWcgPSBtZXRhICYmIG1ldGEucmVhZGFibGVUYWcoKSB8fCBDVVJSRU5UX1RBRzsKKyAgICAg
IHRhZy5kaXJ0eSgpOworICAgIH07CisgIH0gZWxzZSB7CisgICAgZXhwb3J0cy5tYXJrT2JqZWN0
QXNEaXJ0eSA9IG1hcmtPYmplY3RBc0RpcnR5ID0gZnVuY3Rpb24gKCkge307CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1tZXRhbC91dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0
cykgeworICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20g
dHJhbnNwaWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisgIC8qKgorICBAbW9kdWxlIGVtYmVyLW1l
dGFsCisgICovCisKKyAgLyoqCisgICAgUHJldmlvdXNseSB3ZSB1c2VkIGBFbWJlci4kLnV1aWRg
LCBob3dldmVyIGAkLnV1aWRgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbQorICAgIGpRdWVyeSBtYXN0
ZXIuIFdlJ2xsIGp1c3QgYm9vdHN0cmFwIG91ciBvd24gdXVpZCBub3cuCisgIAorICAgIEBwcml2
YXRlCisgICAgQHJldHVybiB7TnVtYmVyfSB0aGUgdXVpZAorICAqLworICBleHBvcnRzLnV1aWQg
PSB1dWlkOworICBleHBvcnRzLmludGVybiA9IGludGVybjsKKyAgZXhwb3J0cy5nZW5lcmF0ZUd1
aWQgPSBnZW5lcmF0ZUd1aWQ7CisgIGV4cG9ydHMuZ3VpZEZvciA9IGd1aWRGb3I7CisgIGV4cG9y
dHMud3JhcCA9IHdyYXA7CisgIGV4cG9ydHMudHJ5SW52b2tlID0gdHJ5SW52b2tlOworICBleHBv
cnRzLm1ha2VBcnJheSA9IG1ha2VBcnJheTsKKyAgZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDsK
KyAgZXhwb3J0cy5hcHBseVN0ciA9IGFwcGx5U3RyOworICBleHBvcnRzLmxvb2t1cERlc2NyaXB0
b3IgPSBsb29rdXBEZXNjcmlwdG9yOworICBleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7Cisg
IHZhciBfdXVpZCA9IDA7CisKKyAgLyoqCisgICAgR2VuZXJhdGVzIGEgdW5pdmVyc2FsbHkgdW5p
cXVlIGlkZW50aWZpZXIuIFRoaXMgbWV0aG9kCisgICAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEVt
YmVyIGZvciBhc3Npc3Rpbmcgd2l0aAorICAgIHRoZSBnZW5lcmF0aW9uIG9mIEdVSUQncyBhbmQg
b3RoZXIgdW5pcXVlIGlkZW50aWZpZXJzLgorICAKKyAgICBAcHVibGljCisgICAgQHJldHVybiB7
TnVtYmVyfSBbZGVzY3JpcHRpb25dCisgICAqLworCisgIGZ1bmN0aW9uIHV1aWQoKSB7CisgICAg
cmV0dXJuICsrX3V1aWQ7CisgIH0KKworICAvKioKKyAgICBQcmVmaXggdXNlZCBmb3IgZ3VpZHMg
dGhyb3VnaCBvdXQgRW1iZXIuCisgICAgQHByaXZhdGUKKyAgICBAcHJvcGVydHkgR1VJRF9QUkVG
SVgKKyAgICBAZm9yIEVtYmVyCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGZpbmFsCisgICovCisg
IHZhciBHVUlEX1BSRUZJWCA9ICdlbWJlcic7CisKKyAgLy8gVXNlZCBmb3IgZ3VpZCBnZW5lcmF0
aW9uLi4uCisgIHZhciBudW1iZXJDYWNoZSA9IFtdOworICB2YXIgc3RyaW5nQ2FjaGUgPSB7fTsK
KworICAvKioKKyAgICBTdHJvbmdseSBoaW50IHJ1bnRpbWVzIHRvIGludGVybiB0aGUgcHJvdmlk
ZWQgc3RyaW5nLgorICAKKyAgICBXaGVuIGRvIEkgbmVlZCB0byB1c2UgdGhpcyBmdW5jdGlvbj8K
KyAgCisgICAgRm9yIHRoZSBtb3N0IHBhcnQsIG5ldmVyLiBQcmUtbWF0dXJlIG9wdGltaXphdGlv
biBpcyBiYWQsIGFuZCBvZnRlbiB0aGUKKyAgICBydW50aW1lIGRvZXMgZXhhY3RseSB3aGF0IHlv
dSBuZWVkIGl0IHRvLCBhbmQgbW9yZSBvZnRlbiB0aGUgdHJhZGUtb2ZmIGlzbid0CisgICAgd29y
dGggaXQuCisgIAorICAgIFdoeT8KKyAgCisgICAgUnVudGltZXMgc3RvcmUgc3RyaW5ncyBpbiBh
dCBsZWFzdCAyIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnM6CisgICAgUm9wZXMgYW5kIFN5bWJv
bHMgKGludGVybmVkIHN0cmluZ3MpLiBUaGUgUm9wZSBwcm92aWRlcyBhIG1lbW9yeSBlZmZpY2ll
bnQKKyAgICBkYXRhLXN0cnVjdHVyZSBmb3Igc3RyaW5ncyBjcmVhdGVkIGZyb20gY29uY2F0ZW5h
dGlvbiBvciBzb21lIG90aGVyIHN0cmluZworICAgIG1hbmlwdWxhdGlvbiBsaWtlIHNwbGl0dGlu
Zy4KKyAgCisgICAgVW5mb3J0dW5hdGVseSBjaGVja2luZyBlcXVhbGl0eSBvZiBkaWZmZXJlbnQg
cm9wZXMgY2FuIGJlIHF1aXRlIGNvc3RseSBhcworICAgIHJ1bnRpbWVzIG11c3QgcmVzb3J0IHRv
IGNsZXZlciBzdHJpbmcgY29tcGFyaXNvbiBhbGdvcml0aG1zLiBUaGVzZQorICAgIGFsZ29yaXRo
bXMgdHlwaWNhbGx5IGNvc3QgaW4gcHJvcG9ydGlvbiB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJp
bmcuCisgICAgTHVja2lseSwgdGhpcyBpcyB3aGVyZSB0aGUgU3ltYm9scyAoaW50ZXJuZWQgc3Ry
aW5ncykgc2hpbmUuIEFzIFN5bWJvbHMgYXJlCisgICAgdW5pcXVlIGJ5IHRoZWlyIHN0cmluZyBj
b250ZW50LCBlcXVhbGl0eSBjaGVja3MgY2FuIGJlIGRvbmUgYnkgcG9pbnRlcgorICAgIGNvbXBh
cmlzb24uCisgIAorICAgIEhvdyBkbyBJIGtub3cgaWYgbXkgc3RyaW5nIGlzIGEgcm9wZSBvciBz
eW1ib2w/CisgIAorICAgIFR5cGljYWxseSAod2FybmluZyBnZW5lcmFsIHN3ZWVwaW5nIHN0YXRl
bWVudCwgYnV0IHRydXRoeSBpbiBydW50aW1lcyBhdAorICAgIHByZXNlbnQpIHN0YXRpYyBzdHJp
bmdzIGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUgSlMgc291cmNlIGFyZSBpbnRlcm5lZC4KKyAgICBT
dHJpbmdzIG9mdGVuIHVzZWQgZm9yIGNvbXBhcmlzb25zIGNhbiBiZSBpbnRlcm5lZCBhdCBydW50
aW1lIGlmIHNvbWUKKyAgICBjcml0ZXJpYSBhcmUgbWV0LiAgT25lIG9mIHRoZXNlIGNyaXRlcmlh
IGNhbiBiZSB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIHJvcGUuCisgICAgRm9yIGV4YW1wbGUsIGlu
IGNocm9tZSAzOCBhIHJvcGUgbG9uZ2VyIHRoZW4gMTIgY2hhcmFjdGVycyB3aWxsIG5vdAorICAg
IGludGVybiwgbm9yIHdpbGwgc2VnbWVudHMgb2YgdGhhdCByb3BlLgorICAKKyAgICBTb21lIG51
bWJlcnM6IGh0dHA6Ly9qc3BlcmYuY29tL2V2YWwtdnMta2V5cy84CisgIAorICAgIEtub3duIFRy
aWNr4oSiCisgIAorICAgIEBwcml2YXRlCisgICAgQHJldHVybiB7U3RyaW5nfSBpbnRlcm5lZCB2
ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBzdHJpbmcKKyAgKi8KKworICBmdW5jdGlvbiBpbnRlcm4o
c3RyKSB7CisgICAgdmFyIG9iaiA9IHt9OworICAgIG9ialtzdHJdID0gMTsKKyAgICBmb3IgKHZh
ciBrZXkgaW4gb2JqKSB7CisgICAgICBpZiAoa2V5ID09PSBzdHIpIHsKKyAgICAgICAgcmV0dXJu
IGtleTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8qKgorICAg
IEEgdW5pcXVlIGtleSB1c2VkIHRvIGFzc2lnbiBndWlkcyBhbmQgb3RoZXIgcHJpdmF0ZSBtZXRh
ZGF0YSB0byBvYmplY3RzLgorICAgIElmIHlvdSBpbnNwZWN0IGFuIG9iamVjdCBpbiB5b3VyIGJy
b3dzZXIgZGVidWdnZXIgeW91IHdpbGwgb2Z0ZW4gc2VlIHRoZXNlLgorICAgIFRoZXkgY2FuIGJl
IHNhZmVseSBpZ25vcmVkLgorICAKKyAgICBPbiBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQsIHRo
ZXNlIHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGggZW51bWVyYXRpb24KKyAgICBkaXNhYmxlZCBz
byB0aGV5IHdvbid0IHNob3cgdXAgd2hlbiB5b3UgaXRlcmF0ZSBvdmVyIHlvdXIgcHJvcGVydGll
cy4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAcHJvcGVydHkgR1VJRF9LRVkKKyAgICBAZm9yIEVt
YmVyCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGZpbmFsCisgICovCisgIHZhciBHVUlEX0tFWSA9
IGludGVybignX19lbWJlcicgKyArbmV3IERhdGUoKSk7CisKKyAgdmFyIEdVSURfREVTQyA9IHsK
KyAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgZW51bWVy
YWJsZTogZmFsc2UsCisgICAgdmFsdWU6IG51bGwKKyAgfTsKKworICBleHBvcnRzLkdVSURfREVT
QyA9IEdVSURfREVTQzsKKyAgdmFyIG51bGxEZXNjcmlwdG9yID0geworICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZSwKKyAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAg
ICB2YWx1ZTogbnVsbAorICB9OworCisgIHZhciBHVUlEX0tFWV9QUk9QRVJUWSA9IHsKKyAgICBu
YW1lOiBHVUlEX0tFWSwKKyAgICBkZXNjcmlwdG9yOiBudWxsRGVzY3JpcHRvcgorICB9OworCisg
IGV4cG9ydHMuR1VJRF9LRVlfUFJPUEVSVFkgPSBHVUlEX0tFWV9QUk9QRVJUWTsKKyAgLyoqCisg
ICAgR2VuZXJhdGVzIGEgbmV3IGd1aWQsIG9wdGlvbmFsbHkgc2F2aW5nIHRoZSBndWlkIHRvIHRo
ZSBvYmplY3QgdGhhdCB5b3UKKyAgICBwYXNzIGluLiBZb3Ugd2lsbCByYXJlbHkgbmVlZCB0byB1
c2UgdGhpcyBtZXRob2QuIEluc3RlYWQgeW91IHNob3VsZAorICAgIGNhbGwgYEVtYmVyLmd1aWRG
b3Iob2JqKWAsIHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBndWlkIGlmIGF2YWlsYWJsZS4KKyAg
CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGdlbmVyYXRlR3VpZAorICAgIEBmb3IgRW1iZXIK
KyAgICBAcGFyYW0ge09iamVjdH0gW29ial0gT2JqZWN0IHRoZSBndWlkIHdpbGwgYmUgdXNlZCBm
b3IuIElmIHBhc3NlZCBpbiwgdGhlIGd1aWQgd2lsbAorICAgICAgYmUgc2F2ZWQgb24gdGhlIG9i
amVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlvdSBwYXNzIHRoZSBzYW1lIG9iamVjdAorICAgICAg
YWdhaW4uCisgIAorICAgICAgSWYgbm8gb2JqZWN0IGlzIHBhc3NlZCwganVzdCBnZW5lcmF0ZSBh
IG5ldyBndWlkLgorICAgIEBwYXJhbSB7U3RyaW5nfSBbcHJlZml4XSBQcmVmaXggdG8gcGxhY2Ug
aW4gZnJvbnQgb2YgdGhlIGd1aWQuIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCisgICAgICBzZXBh
cmF0ZSB0aGUgZ3VpZCBpbnRvIHNlcGFyYXRlIG5hbWVzcGFjZXMuCisgICAgQHJldHVybiB7U3Ry
aW5nfSB0aGUgZ3VpZAorICAqLworCisgIGZ1bmN0aW9uIGdlbmVyYXRlR3VpZChvYmosIHByZWZp
eCkgeworICAgIGlmICghcHJlZml4KSB7CisgICAgICBwcmVmaXggPSBHVUlEX1BSRUZJWDsKKyAg
ICB9CisKKyAgICB2YXIgcmV0ID0gcHJlZml4ICsgdXVpZCgpOworICAgIGlmIChvYmopIHsKKyAg
ICAgIGlmIChvYmpbR1VJRF9LRVldID09PSBudWxsKSB7CisgICAgICAgIG9ialtHVUlEX0tFWV0g
PSByZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBHVUlEX0RFU0MudmFsdWUgPSByZXQ7Cisg
ICAgICAgIGlmIChvYmouX19kZWZpbmVOb25FbnVtZXJhYmxlKSB7CisgICAgICAgICAgb2JqLl9f
ZGVmaW5lTm9uRW51bWVyYWJsZShHVUlEX0tFWV9QUk9QRVJUWSk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgR1VJRF9LRVksIEdVSURfREVT
Qyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisg
IC8qKgorICAgIFJldHVybnMgYSB1bmlxdWUgaWQgZm9yIHRoZSBvYmplY3QuIElmIHRoZSBvYmpl
Y3QgZG9lcyBub3QgeWV0IGhhdmUgYSBndWlkLAorICAgIG9uZSB3aWxsIGJlIGFzc2lnbmVkIHRv
IGl0LiBZb3UgY2FuIGNhbGwgdGhpcyBvbiBhbnkgb2JqZWN0LAorICAgIGBFbWJlci5PYmplY3Rg
LWJhc2VkIG9yIG5vdCwgYnV0IGJlIGF3YXJlIHRoYXQgaXQgd2lsbCBhZGQgYSBgX2d1aWRgCisg
ICAgcHJvcGVydHkuCisgIAorICAgIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBtZXRob2Qgb24gRE9N
IEVsZW1lbnQgb2JqZWN0cy4KKyAgCisgICAgQHB1YmxpYworICAgIEBtZXRob2QgZ3VpZEZvcgor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIGFueSBvYmplY3QsIHN0cmlu
ZywgbnVtYmVyLCBFbGVtZW50LCBvciBwcmltaXRpdmUKKyAgICBAcmV0dXJuIHtTdHJpbmd9IHRo
ZSB1bmlxdWUgZ3VpZCBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgKi8KKworICBmdW5jdGlvbiBndWlk
Rm9yKG9iaikgeworICAgIGlmIChvYmogJiYgb2JqW0dVSURfS0VZXSkgeworICAgICAgcmV0dXJu
IG9ialtHVUlEX0tFWV07CisgICAgfQorCisgICAgLy8gc3BlY2lhbCBjYXNlcyB3aGVyZSB3ZSBk
b24ndCB3YW50IHRvIGFkZCBhIGtleSB0byBvYmplY3QKKyAgICBpZiAob2JqID09PSB1bmRlZmlu
ZWQpIHsKKyAgICAgIHJldHVybiAnKHVuZGVmaW5lZCknOworICAgIH0KKworICAgIGlmIChvYmog
PT09IG51bGwpIHsKKyAgICAgIHJldHVybiAnKG51bGwpJzsKKyAgICB9CisKKyAgICB2YXIgcmV0
OworICAgIHZhciB0eXBlID0gdHlwZW9mIG9iajsKKworICAgIC8vIERvbid0IGFsbG93IHByb3Rv
dHlwZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRvIGNoYW5nZSB0aGUgZ3VpZEZvcgorICAgIHN3
aXRjaCAodHlwZSkgeworICAgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgICAgcmV0ID0gbnVtYmVy
Q2FjaGVbb2JqXTsKKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIHJldCA9IG51bWJl
ckNhY2hlW29ial0gPSAnbnUnICsgb2JqOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJl
dDsKKworICAgICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAgcmV0ID0gc3RyaW5nQ2FjaGVbb2Jq
XTsKKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIHJldCA9IHN0cmluZ0NhY2hlW29i
al0gPSAnc3QnICsgdXVpZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwor
ICAgICAgY2FzZSAnYm9vbGVhbic6CisgICAgICAgIHJldHVybiBvYmogPyAnKHRydWUpJyA6ICco
ZmFsc2UpJzsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG9iaiA9PT0gT2JqZWN0KSB7
CisgICAgICAgICAgcmV0dXJuICcoT2JqZWN0KSc7CisgICAgICAgIH0KKworICAgICAgICBpZiAo
b2JqID09PSBBcnJheSkgeworICAgICAgICAgIHJldHVybiAnKEFycmF5KSc7CisgICAgICAgIH0K
KworICAgICAgICByZXQgPSBHVUlEX1BSRUZJWCArIHV1aWQoKTsKKworICAgICAgICBpZiAob2Jq
W0dVSURfS0VZXSA9PT0gbnVsbCkgeworICAgICAgICAgIG9ialtHVUlEX0tFWV0gPSByZXQ7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1VJRF9ERVNDLnZhbHVlID0gcmV0OworCisgICAg
ICAgICAgaWYgKG9iai5fX2RlZmluZU5vbkVudW1lcmFibGUpIHsKKyAgICAgICAgICAgIG9iai5f
X2RlZmluZU5vbkVudW1lcmFibGUoR1VJRF9LRVlfUFJPUEVSVFkpOworICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJ
RF9ERVNDKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAg
ICB9CisgIH0KKworICB2YXIgSEFTX1NVUEVSX1BBVFRFUk4gPSAvXC4oX3N1cGVyfGNhbGxcKHRo
aXN8YXBwbHlcKHRoaXMpLzsKKyAgdmFyIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUu
dG9TdHJpbmc7CisKKyAgdmFyIGNoZWNrSGFzU3VwZXIgPSAoZnVuY3Rpb24gKCkgeworICAgIHZh
ciBzb3VyY2VBdmFpbGFibGUgPSBmblRvU3RyaW5nLmNhbGwoZnVuY3Rpb24gKCkgeworICAgICAg
cmV0dXJuIHRoaXM7CisgICAgfSkuaW5kZXhPZigncmV0dXJuIHRoaXMnKSA+IC0xOworCisgICAg
aWYgKHNvdXJjZUF2YWlsYWJsZSkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrSGFzU3Vw
ZXIoZnVuYykgeworICAgICAgICByZXR1cm4gSEFTX1NVUEVSX1BBVFRFUk4udGVzdChmblRvU3Ry
aW5nLmNhbGwoZnVuYykpOworICAgICAgfTsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb24g
Y2hlY2tIYXNTdXBlcigpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH07CisgIH0pKCk7CisK
KyAgZXhwb3J0cy5jaGVja0hhc1N1cGVyID0gY2hlY2tIYXNTdXBlcjsKKyAgZnVuY3Rpb24gUk9P
VCgpIHt9CisgIFJPT1QuX19oYXNTdXBlciA9IGZhbHNlOworCisgIGZ1bmN0aW9uIGhhc1N1cGVy
KGZ1bmMpIHsKKyAgICBpZiAoZnVuYy5fX2hhc1N1cGVyID09PSB1bmRlZmluZWQpIHsKKyAgICAg
IGZ1bmMuX19oYXNTdXBlciA9IGNoZWNrSGFzU3VwZXIoZnVuYyk7CisgICAgfQorICAgIHJldHVy
biBmdW5jLl9faGFzU3VwZXI7CisgIH0KKworICAvKioKKyAgICBXcmFwcyB0aGUgcGFzc2VkIGZ1
bmN0aW9uIHNvIHRoYXQgYHRoaXMuX3N1cGVyYCB3aWxsIHBvaW50IHRvIHRoZSBzdXBlckZ1bmMK
KyAgICB3aGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGlzIGlzIHRoZSBwcmltaXRpdmUg
d2UgdXNlIHRvIGltcGxlbWVudAorICAgIGNhbGxzIHRvIHN1cGVyLgorICAKKyAgICBAcHJpdmF0
ZQorICAgIEBtZXRob2Qgd3JhcAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJG
dW5jIFRoZSBzdXBlciBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gd3JhcHBlZCBm
dW5jdGlvbi4KKyAgKi8KKworICBmdW5jdGlvbiB3cmFwKGZ1bmMsIHN1cGVyRnVuYykgeworICAg
IGlmICghaGFzU3VwZXIoZnVuYykpIHsKKyAgICAgIHJldHVybiBmdW5jOworICAgIH0KKyAgICAv
LyBlbnN1cmUgYW4gdW53cmFwcGVkIHN1cGVyIHRoYXQgY2FsbHMgX3N1cGVyIGlzIHdyYXBwZWQg
d2l0aCBhIHRlcm1pbmFsIF9zdXBlcgorICAgIGlmICghc3VwZXJGdW5jLndyYXBwZWRGdW5jdGlv
biAmJiBoYXNTdXBlcihzdXBlckZ1bmMpKSB7CisgICAgICByZXR1cm4gX3dyYXAoZnVuYywgX3dy
YXAoc3VwZXJGdW5jLCBST09UKSk7CisgICAgfQorICAgIHJldHVybiBfd3JhcChmdW5jLCBzdXBl
ckZ1bmMpOworICB9CisKKyAgZnVuY3Rpb24gX3dyYXAoZnVuYywgc3VwZXJGdW5jKSB7CisgICAg
ZnVuY3Rpb24gc3VwZXJXcmFwcGVyKCkgeworICAgICAgdmFyIG9yaWcgPSB0aGlzLl9zdXBlcjsK
KyAgICAgIHRoaXMuX3N1cGVyID0gc3VwZXJGdW5jOworICAgICAgdmFyIHJldCA9IGZ1bmMuYXBw
bHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3N1cGVyID0gb3JpZzsKKyAgICAgIHJl
dHVybiByZXQ7CisgICAgfQorCisgICAgc3VwZXJXcmFwcGVyLndyYXBwZWRGdW5jdGlvbiA9IGZ1
bmM7CisgICAgc3VwZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNfXyA9IGZ1bmMuX19lbWJlcl9v
YnNlcnZlc19fOworICAgIHN1cGVyV3JhcHBlci5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBm
dW5jLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXzsKKyAgICBzdXBlcldyYXBwZXIuX19lbWJlcl9s
aXN0ZW5zX18gPSBmdW5jLl9fZW1iZXJfbGlzdGVuc19fOworCisgICAgcmV0dXJuIHN1cGVyV3Jh
cHBlcjsKKyAgfQorCisgIC8qKgorICAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGBtZXRob2ROYW1l
YCBleGlzdHMgb24gdGhlIGBvYmpgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGZv
byA9IHsgYmFyOiBmdW5jdGlvbigpIHsgcmV0dXJuICdiYXInOyB9LCBiYXo6IG51bGwgfTsKKyAg
CisgICAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JhcicpOyAvLyB0cnVlCisgICAgRW1iZXIuY2Fu
SW52b2tlKGZvbywgJ2JheicpOyAvLyBmYWxzZQorICAgIEVtYmVyLmNhbkludm9rZShmb28sICdi
YXQnKTsgLy8gZmFsc2UKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjYW5JbnZva2UKKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZv
ciB0aGUgbWV0aG9kCisgICAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBu
YW1lIHRvIGNoZWNrIGZvcgorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgQHByaXZhdGUKKyAg
Ki8KKyAgZnVuY3Rpb24gY2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkgeworICAgIHJldHVybiAh
IShvYmogJiYgdHlwZW9mIG9ialttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7CisgIH0KKwor
ICAvKioKKyAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBgbWV0aG9kTmFtZWAgZXhpc3RzIG9uIHRo
ZSBgb2JqYCwKKyAgICBhbmQgaWYgaXQgZG9lcywgaW52b2tlcyBpdCB3aXRoIHRoZSBhcmd1bWVu
dHMgcGFzc2VkLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGQgPSBuZXcgRGF0ZSgn
MDMvMTUvMjAxMycpOworICAKKyAgICBFbWJlci50cnlJbnZva2UoZCwgJ2dldFRpbWUnKTsgICAg
ICAgICAgICAgIC8vIDEzNjMzMjAwMDAwMDAKKyAgICBFbWJlci50cnlJbnZva2UoZCwgJ3NldEZ1
bGxZZWFyJywgWzIwMTRdKTsgIC8vIDEzOTQ4NTYwMDAwMDAKKyAgICBFbWJlci50cnlJbnZva2Uo
ZCwgJ25vU3VjaE1ldGhvZCcsIFsyMDE0XSk7IC8vIHVuZGVmaW5lZAorICAgIGBgYAorICAKKyAg
ICBAbWV0aG9kIHRyeUludm9rZQorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
b2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBtZXRob2QKKyAgICBAcGFyYW0ge1N0cmlu
Z30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2hlY2sgZm9yCisgICAgQHBhcmFtIHtB
cnJheX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kCisgICAgQHJl
dHVybiB7Kn0gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgaW52b2tlZCBtZXRob2Qgb3IgdW5kZWZp
bmVkIGlmIGl0IGNhbm5vdCBiZSBpbnZva2VkCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0
aW9uIHRyeUludm9rZShvYmosIG1ldGhvZE5hbWUsIGFyZ3MpIHsKKyAgICBpZiAoY2FuSW52b2tl
KG9iaiwgbWV0aG9kTmFtZSkpIHsKKyAgICAgIHJldHVybiBhcmdzID8gYXBwbHlTdHIob2JqLCBt
ZXRob2ROYW1lLCBhcmdzKSA6IGFwcGx5U3RyKG9iaiwgbWV0aG9kTmFtZSk7CisgICAgfQorICB9
CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBU
WVBJTkcgJiBBUlJBWSBNRVNTQUdJTkcKKyAgLy8KKworICB2YXIgb2JqZWN0VG9TdHJpbmcgPSBP
YmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCisgIC8qKgorICAgIEZvcmNlcyB0aGUgcGFzc2Vk
IG9iamVjdCB0byBiZSBwYXJ0IG9mIGFuIGFycmF5LiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkK
KyAgICBhbiBhcnJheSwgaXQgd2lsbCByZXR1cm4gdGhlIG9iamVjdC4gT3RoZXJ3aXNlLCBpdCB3
aWxsIGFkZCB0aGUgb2JqZWN0IHRvCisgICAgYW4gYXJyYXkuIElmIG9iaiBpcyBgbnVsbGAgb3Ig
YHVuZGVmaW5lZGAsIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIubWFrZUFycmF5KCk7ICAgICAgICAgICAgLy8gW10KKyAgICBF
bWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAvLyBbXQorICAgIEVtYmVyLm1ha2VBcnJheSh1
bmRlZmluZWQpOyAgIC8vIFtdCisgICAgRW1iZXIubWFrZUFycmF5KCdsaW5kc2F5Jyk7ICAgLy8g
WydsaW5kc2F5J10KKyAgICBFbWJlci5tYWtlQXJyYXkoWzEsIDIsIDQyXSk7ICAvLyBbMSwgMiwg
NDJdCisgIAorICAgIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5jcmVhdGUoeyBj
b250ZW50OiBbXSB9KTsKKyAgCisgICAgRW1iZXIubWFrZUFycmF5KGNvbnRyb2xsZXIpID09PSBj
b250cm9sbGVyOyAgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1ha2VBcnJheQor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIHRoZSBvYmplY3QKKyAgICBA
cmV0dXJuIHtBcnJheX0KKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIG1ha2VBcnJh
eShvYmopIHsKKyAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgICByZXR1cm4gW107CisgICAgfQorICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgPyBv
YmogOiBbb2JqXTsKKyAgfQorCisgIC8qKgorICAgIENvbnZlbmllbmNlIG1ldGhvZCB0byBpbnNw
ZWN0IGFuIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgY29udmVydCB0
aGUgb2JqZWN0IGludG8gYSB1c2VmdWwgc3RyaW5nIGRlc2NyaXB0aW9uLgorICAKKyAgICBJdCBp
cyBhIHByZXR0eSBzaW1wbGUgaW1wbGVtZW50YXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBt
b3JlIHJvYnVzdCwKKyAgICB1c2Ugc29tZXRoaW5nIGxpa2UgSlNEdW1wOiBodHRwczovL2dpdGh1
Yi5jb20vTlYvanNEdW1wCisgIAorICAgIEBtZXRob2QgaW5zcGVjdAorICAgIEBmb3IgRW1iZXIK
KyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgeW91IHdhbnQgdG8gaW5zcGVjdC4K
KyAgICBAcmV0dXJuIHtTdHJpbmd9IEEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAorICAgIEBz
aW5jZSAxLjQuMAorICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gaW5zcGVjdChvYmop
IHsKKyAgICBpZiAob2JqID09PSBudWxsKSB7CisgICAgICByZXR1cm4gJ251bGwnOworICAgIH0K
KyAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldHVybiAndW5kZWZpbmVkJzsK
KyAgICB9CisgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuICdbJyAr
IG9iaiArICddJzsKKyAgICB9CisgICAgLy8gZm9yIG5vbiBvYmplY3RzCisgICAgdmFyIHR5cGUg
PSB0eXBlb2Ygb2JqOworICAgIGlmICh0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnc3lt
Ym9sJykgeworICAgICAgcmV0dXJuICcnICsgb2JqOworICAgIH0KKyAgICAvLyBvdmVycmlkZGVu
IHRvU3RyaW5nCisgICAgaWYgKHR5cGVvZiBvYmoudG9TdHJpbmcgPT09ICdmdW5jdGlvbicgJiYg
b2JqLnRvU3RyaW5nICE9PSBvYmplY3RUb1N0cmluZykgeworICAgICAgcmV0dXJuIG9iai50b1N0
cmluZygpOworICAgIH0KKworICAgIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPT09IHt9
LnRvU3RyaW5nCisgICAgdmFyIHY7CisgICAgdmFyIHJldCA9IFtdOworICAgIGZvciAodmFyIGtl
eSBpbiBvYmopIHsKKyAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAg
ICB2ID0gb2JqW2tleV07CisgICAgICAgIGlmICh2ID09PSAndG9TdHJpbmcnKSB7CisgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0gLy8gaWdub3JlIHVzZWxlc3MgaXRlbXMKKyAgICAgICAg
aWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgdiA9ICdmdW5jdGlvbigp
IHsgLi4uIH0nOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYudG9TdHJp
bmcgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICByZXQucHVzaChrZXkgKyAnOiAnICsgb2Jq
ZWN0VG9TdHJpbmcuY2FsbCh2KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0LnB1
c2goa2V5ICsgJzogJyArIHYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVy
biAneycgKyByZXQuam9pbignLCAnKSArICd9JzsKKyAgfQorCisgIC8qKgorICAgIEBwYXJhbSB7
T2JqZWN0fSB0IHRhcmdldAorICAgIEBwYXJhbSB7U3RyaW5nfSBtIG1ldGhvZAorICAgIEBwYXJh
bSB7QXJyYXl9IGEgYXJncworICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gYXBwbHlT
dHIodCwgbSwgYSkgeworICAgIHZhciBsID0gYSAmJiBhLmxlbmd0aDsKKyAgICBpZiAoIWEgfHwg
IWwpIHsKKyAgICAgIHJldHVybiB0W21dKCk7CisgICAgfQorICAgIHN3aXRjaCAobCkgeworICAg
ICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gdFttXShhWzBdKTsKKyAgICAgIGNhc2UgMjoKKyAg
ICAgICAgcmV0dXJuIHRbbV0oYVswXSwgYVsxXSk7CisgICAgICBjYXNlIDM6CisgICAgICAgIHJl
dHVybiB0W21dKGFbMF0sIGFbMV0sIGFbMl0pOworICAgICAgY2FzZSA0OgorICAgICAgICByZXR1
cm4gdFttXShhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAg
cmV0dXJuIHRbbV0oYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7CisgICAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm4gdFttXS5hcHBseSh0LCBhKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBsb29rdXBEZXNjcmlwdG9yKG9iaiwga2V5TmFtZSkgeworICAgIHZhciBjdXJyZW50ID0g
b2JqOworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVj
dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VycmVudCwga2V5TmFtZSk7CisKKyAgICAgIGlm
IChkZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgfQorCisg
ICAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpOworICAgIH0KKwor
ICAgIHJldHVybiBudWxsOworICB9CisKKyAgLy8gQSBgdG9TdHJpbmdgIHV0aWwgZnVuY3Rpb24g
dGhhdCBzdXBwb3J0cyBvYmplY3RzIHdpdGhvdXQgYSBgdG9TdHJpbmdgCisgIC8vIG1ldGhvZCwg
ZS5nLiBhbiBvYmplY3QgY3JlYXRlZCB3aXRoIGBPYmplY3QuY3JlYXRlKG51bGwpYC4KKworICBm
dW5jdGlvbiB0b1N0cmluZyhvYmopIHsKKyAgICBpZiAob2JqICYmIG9iai50b1N0cmluZykgewor
ICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4g
b2JqZWN0VG9TdHJpbmcuY2FsbChvYmopOworICAgIH0KKyAgfQorCisgIGV4cG9ydHMuR1VJRF9L
RVkgPSBHVUlEX0tFWTsKKyAgZXhwb3J0cy5tYWtlQXJyYXkgPSBtYWtlQXJyYXk7CisgIGV4cG9y
dHMuY2FuSW52b2tlID0gY2FuSW52b2tlOworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3dhdGNo
X2tleScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9t
ZXRhJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFsTWV0YSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0aWVzLCBfZW1iZXJNZXRhbFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLndhdGNoS2V5ID0gd2F0Y2hLZXk7CisgIGV4cG9ydHMudW53YXRjaEtleSA9
IHVud2F0Y2hLZXk7CisKKyAgdmFyIGhhbmRsZU1hbmRhdG9yeVNldHRlciA9IHVuZGVmaW5lZDsK
KworICBmdW5jdGlvbiB3YXRjaEtleShvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgICAvLyBjYW4n
dCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCisgICAgaWYgKGtleU5h
bWUgPT09ICdsZW5ndGgnICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIHZhciBtID0gbWV0YSB8fCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopOwor
CisgICAgLy8gYWN0aXZhdGUgd2F0Y2hpbmcgZmlyc3QgdGltZQorICAgIGlmICghbS5wZWVrV2F0
Y2hpbmcoa2V5TmFtZSkpIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhrZXlOYW1lLCAxKTsKKwor
ICAgICAgdmFyIHBvc3NpYmxlRGVzYyA9IG9ialtrZXlOYW1lXTsKKyAgICAgIHZhciBkZXNjID0g
cG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3Qn
ICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7
CisgICAgICBpZiAoZGVzYyAmJiBkZXNjLndpbGxXYXRjaCkgeworICAgICAgICBkZXNjLndpbGxX
YXRjaChvYmosIGtleU5hbWUpOworICAgICAgfQorCisgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0g
dHlwZW9mIG9iai53aWxsV2F0Y2hQcm9wZXJ0eSkgeworICAgICAgICBvYmoud2lsbFdhdGNoUHJv
cGVydHkoa2V5TmFtZSk7CisgICAgICB9CisKKyAgICAgIC8vIE5PVEU6IHRoaXMgaXMgZHJvcHBl
ZCBmb3IgcHJvZCArIG1pbmlmaWVkIGJ1aWxkcworICAgICAgaGFuZGxlTWFuZGF0b3J5U2V0dGVy
KG0sIG9iaiwga2V5TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhr
ZXlOYW1lLCAobS5wZWVrV2F0Y2hpbmcoa2V5TmFtZSkgfHwgMCkgKyAxKTsKKyAgICB9CisgIH0K
KworICAvLyBGdXR1cmUgdHJhdmVsZXIsIGFsdGhvdWdoIHRoaXMgY29kZSBsb29rcyBzY2FyeS4g
SXQgbWVyZWx5IGV4aXN0cyBpbgorICAvLyBkZXZlbG9wbWVudCB0byBhaWQgaW4gZGV2ZWxvcG1l
bnQgYXNlcnRpb25zLiBQcm9kdWN0aW9uIGJ1aWxkcyBvZgorICAvLyBlbWJlciBzdHJpcCB0aGlz
IGVudGlyZSBibG9jayBvdXQKKyAgaGFuZGxlTWFuZGF0b3J5U2V0dGVyID0gZnVuY3Rpb24gaGFu
ZGxlTWFuZGF0b3J5U2V0dGVyKG0sIG9iaiwga2V5TmFtZSkgeworICAgIHZhciBkZXNjcmlwdG9y
ID0gX2VtYmVyTWV0YWxVdGlscy5sb29rdXBEZXNjcmlwdG9yKG9iaiwga2V5TmFtZSk7CisgICAg
dmFyIGNvbmZpZ3VyYWJsZSA9IGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6
IHRydWU7CisgICAgdmFyIGlzV3JpdGFibGUgPSBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci53cml0
YWJsZSA6IHRydWU7CisgICAgdmFyIGhhc1ZhbHVlID0gZGVzY3JpcHRvciA/ICd2YWx1ZScgaW4g
ZGVzY3JpcHRvciA6IHRydWU7CisgICAgdmFyIHBvc3NpYmxlRGVzYyA9IGRlc2NyaXB0b3IgJiYg
ZGVzY3JpcHRvci52YWx1ZTsKKyAgICB2YXIgaXNEZXNjcmlwdG9yID0gcG9zc2libGVEZXNjICE9
PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVz
Yy5pc0Rlc2NyaXB0b3I7CisKKyAgICBpZiAoaXNEZXNjcmlwdG9yKSB7CisgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gdGhpcyB4IGluIFkgZGVvcHRzLCBzbyBrZWVwaW5nIGl0IGluIHRo
aXMgZnVuY3Rpb24gaXMgYmV0dGVyOworICAgIGlmIChjb25maWd1cmFibGUgJiYgaXNXcml0YWJs
ZSAmJiBoYXNWYWx1ZSAmJiBrZXlOYW1lIGluIG9iaikgeworICAgICAgdmFyIGRlc2MgPSB7Cisg
ICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgZW51bWVyYWJsZTogT2JqZWN0LnBy
b3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwga2V5TmFtZSksCisgICAgICAg
IHNldDogX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04oa2V5
TmFtZSksCisgICAgICAgIGdldDogdW5kZWZpbmVkCisgICAgICB9OworCisgICAgICBpZiAoT2Jq
ZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5TmFtZSkpIHsKKyAgICAg
ICAgbS53cml0ZVZhbHVlcyhrZXlOYW1lLCBvYmpba2V5TmFtZV0pOworICAgICAgICBkZXNjLmdl
dCA9IF9lbWJlck1ldGFsUHJvcGVydGllcy5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1l
KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MuZ2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0
aWVzLklOSEVSSVRJTkdfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUpOworICAgICAgfQorCisgICAg
ICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBkZXNjKTsKKyAgICB9CisgIH07
CisKKyAgZnVuY3Rpb24gdW53YXRjaEtleShvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgICB2YXIg
bSA9IG1ldGEgfHwgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKyAgICB2YXIgY291bnQgPSBt
LnBlZWtXYXRjaGluZyhrZXlOYW1lKTsKKyAgICBpZiAoY291bnQgPT09IDEpIHsKKyAgICAgIG0u
d3JpdGVXYXRjaGluZyhrZXlOYW1lLCAwKTsKKworICAgICAgdmFyIHBvc3NpYmxlRGVzYyA9IG9i
altrZXlOYW1lXTsKKyAgICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5
cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0
b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChkZXNjICYmIGRlc2Mu
ZGlkVW53YXRjaCkgeworICAgICAgICBkZXNjLmRpZFVud2F0Y2gob2JqLCBrZXlOYW1lKTsKKyAg
ICAgIH0KKworICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkVW53YXRjaFBy
b3BlcnR5KSB7CisgICAgICAgIG9iai5kaWRVbndhdGNoUHJvcGVydHkoa2V5TmFtZSk7CisgICAg
ICB9CisKKyAgICAgIC8vIEl0IGlzIHRydWUsIHRoZSBmb2xsb3dpbmcgY29kZSBsb29rcyBxdWl0
ZSBXQVQuIEJ1dCBoYXZlIG5vIGZlYXIsIEl0CisgICAgICAvLyBleGlzdHMgcHVyZWx5IHRvIGlt
cHJvdmUgZGV2ZWxvcG1lbnQgZXJnb25vbWljcyBhbmQgaXMgcmVtb3ZlZCBmcm9tCisgICAgICAv
LyBlbWJlci5taW4uanMgYW5kIGVtYmVyLnByb2QuanMgYnVpbGRzLgorICAgICAgLy8KKyAgICAg
IC8vIFNvbWUgZnVydGhlciBjb250ZXh0OiBPbmNlIGEgcHJvcGVydHkgaXMgd2F0Y2hlZCBieSBl
bWJlciwgYnlwYXNzaW5nIGBzZXRgCisgICAgICAvLyBmb3IgbXV0YXRpb24sIHdpbGwgYnlwYXNz
IG9ic2VydmF0aW9uLiBUaGlzIGNvZGUgZXhpc3RzIHRvIGFzc2VydCB3aGVuCisgICAgICAvLyB0
aGF0IG9jY3VycywgYW5kIGF0dGVtcHQgdG8gcHJvdmlkZSBtb3JlIGhlbHBmdWwgZmVlZGJhY2su
IFRoZSBhbHRlcm5hdGl2ZQorICAgICAgLy8gaXMgdHJpY2t5IHRvIGRlYnVnIHBhcnRpYWxseSBv
YnNlcnZhYmxlIHByb3BlcnRpZXMuCisgICAgICBpZiAoIWRlc2MgJiYga2V5TmFtZSBpbiBvYmop
IHsKKyAgICAgICAgdmFyIG1heWJlTWFuZGF0b3J5RGVzY3JpcHRvciA9IF9lbWJlck1ldGFsVXRp
bHMubG9va3VwRGVzY3JpcHRvcihvYmosIGtleU5hbWUpOworCisgICAgICAgIGlmIChtYXliZU1h
bmRhdG9yeURlc2NyaXB0b3Iuc2V0ICYmIG1heWJlTWFuZGF0b3J5RGVzY3JpcHRvci5zZXQuaXNN
YW5kYXRvcnlTZXR0ZXIpIHsKKyAgICAgICAgICBpZiAobWF5YmVNYW5kYXRvcnlEZXNjcmlwdG9y
LmdldCAmJiBtYXliZU1hbmRhdG9yeURlc2NyaXB0b3IuZ2V0LmlzSW5oZXJpdGluZ0dldHRlcikg
eworICAgICAgICAgICAgZGVsZXRlIG9ialtrZXlOYW1lXTsKKyAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeworICAgICAg
ICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICAgIGVudW1lcmFibGU6IE9i
amVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIGtleU5hbWUpLAor
ICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgdmFsdWU6IG0ucGVl
a1ZhbHVlcyhrZXlOYW1lKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtLmRlbGV0ZUZy
b21WYWx1ZXMoa2V5TmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAg
fSBlbHNlIGlmIChjb3VudCA+IDEpIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhrZXlOYW1lLCBj
b3VudCAtIDEpOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3dhdGNoX3Bh
dGgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRhbC9jaGFpbnMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxDaGFpbnMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMud2F0Y2hQYXRoID0gd2F0Y2hQYXRoOwor
ICBleHBvcnRzLnVud2F0Y2hQYXRoID0gdW53YXRjaFBhdGg7CisKKyAgLy8gZ2V0IHRoZSBjaGFp
bnMgZm9yIHRoZSBjdXJyZW50IG9iamVjdC4gSWYgdGhlIGN1cnJlbnQgb2JqZWN0IGhhcworICAv
LyBjaGFpbnMgaW5oZXJpdGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBiZSBjbG9uZWQgYW5k
IHJlY29uZmlndXJlZCBmb3IKKyAgLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgorICBmdW5jdGlvbiBj
aGFpbnNGb3Iob2JqLCBtZXRhKSB7CisgICAgcmV0dXJuIChtZXRhIHx8IF9lbWJlck1ldGFsTWV0
YS5tZXRhKG9iaikpLndyaXRhYmxlQ2hhaW5zKG1ha2VDaGFpbk5vZGUpOworICB9CisKKyAgZnVu
Y3Rpb24gbWFrZUNoYWluTm9kZShvYmopIHsKKyAgICByZXR1cm4gbmV3IF9lbWJlck1ldGFsQ2hh
aW5zLkNoYWluTm9kZShudWxsLCBudWxsLCBvYmopOworICB9CisKKyAgZnVuY3Rpb24gd2F0Y2hQ
YXRoKG9iaiwga2V5UGF0aCwgbWV0YSkgeworICAgIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBB
cnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KKyAgICBpZiAoa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYg
QXJyYXkuaXNBcnJheShvYmopKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG0g
PSBtZXRhIHx8IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisgICAgdmFyIGNvdW50ZXIgPSBt
LnBlZWtXYXRjaGluZyhrZXlQYXRoKSB8fCAwOworICAgIGlmICghY291bnRlcikgeworICAgICAg
Ly8gYWN0aXZhdGUgd2F0Y2hpbmcgZmlyc3QgdGltZQorICAgICAgbS53cml0ZVdhdGNoaW5nKGtl
eVBhdGgsIDEpOworICAgICAgY2hhaW5zRm9yKG9iaiwgbSkuYWRkKGtleVBhdGgpOworICAgIH0g
ZWxzZSB7CisgICAgICBtLndyaXRlV2F0Y2hpbmcoa2V5UGF0aCwgY291bnRlciArIDEpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIHVud2F0Y2hQYXRoKG9iaiwga2V5UGF0aCwgbWV0YSkgewor
ICAgIHZhciBtID0gbWV0YSB8fCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopOworICAgIHZhciBj
b3VudGVyID0gbS5wZWVrV2F0Y2hpbmcoa2V5UGF0aCkgfHwgMDsKKworICAgIGlmIChjb3VudGVy
ID09PSAxKSB7CisgICAgICBtLndyaXRlV2F0Y2hpbmcoa2V5UGF0aCwgMCk7CisgICAgICBjaGFp
bnNGb3Iob2JqLCBtKS5yZW1vdmUoa2V5UGF0aCk7CisgICAgfSBlbHNlIGlmIChjb3VudGVyID4g
MSkgeworICAgICAgbS53cml0ZVdhdGNoaW5nKGtleVBhdGgsIGNvdW50ZXIgLSAxKTsKKyAgICB9
CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC93YXRjaGluZycsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jaGFpbnMnLCAnZW1iZXItbWV0YWwvd2F0Y2hfa2V5JywgJ2VtYmVyLW1ldGFs
L3dhdGNoX3BhdGgnLCAnZW1iZXItbWV0YWwvcGF0aF9jYWNoZScsICdlbWJlci1tZXRhbC9tZXRh
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENoYWlucywgX2VtYmVyTWV0YWxXYXRj
aF9rZXksIF9lbWJlck1ldGFsV2F0Y2hfcGF0aCwgX2VtYmVyTWV0YWxQYXRoX2NhY2hlLCBfZW1i
ZXJNZXRhbE1ldGEpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5pc1dhdGNoaW5nID0gaXNXYXRjaGluZzsKKyAgZXhw
b3J0cy53YXRjaGVyQ291bnQgPSB3YXRjaGVyQ291bnQ7CisgIGV4cG9ydHMudW53YXRjaCA9IHVu
d2F0Y2g7CisgIGV4cG9ydHMuZGVzdHJveSA9IGRlc3Ryb3k7CisKKyAgLyoqCisgICAgU3RhcnRz
IHdhdGNoaW5nIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBXaGVuZXZlciB0aGUgcHJvcGVydHkg
Y2hhbmdlcywKKyAgICBpbnZva2VzIGBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2VgIGFuZCBgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2VgLiBUaGlzIGlzIHRoZQorICAgIHByaW1pdGl2ZSB1c2VkIGJ5
IG9ic2VydmVycyBhbmQgZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91IHdpbGwgbmV2ZXIgY2Fs
bAorICAgIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIHVzZSBoaWdoZXIgbGV2ZWwg
bWV0aG9kcyBsaWtlCisgICAgYEVtYmVyLmFkZE9ic2VydmVyKClgCisgIAorICAgIEBwcml2YXRl
CisgICAgQG1ldGhvZCB3YXRjaAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAg
QHBhcmFtIHtTdHJpbmd9IF9rZXlQYXRoCisgICovCisgIGZ1bmN0aW9uIHdhdGNoKG9iaiwgX2tl
eVBhdGgsIG0pIHsKKyAgICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBz
cGVjaWFsLi4uCisgICAgaWYgKF9rZXlQYXRoID09PSAnbGVuZ3RoJyAmJiBBcnJheS5pc0FycmF5
KG9iaikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIV9lbWJlck1ldGFsUGF0
aF9jYWNoZS5pc1BhdGgoX2tleVBhdGgpKSB7CisgICAgICBfZW1iZXJNZXRhbFdhdGNoX2tleS53
YXRjaEtleShvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0
YWxXYXRjaF9wYXRoLndhdGNoUGF0aChvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9CisgIH0KKwor
ICBleHBvcnRzLndhdGNoID0gd2F0Y2g7CisKKyAgZnVuY3Rpb24gaXNXYXRjaGluZyhvYmosIGtl
eSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAg
cmV0dXJuIChtZXRhICYmIG1ldGEucGVla1dhdGNoaW5nKGtleSkpID4gMDsKKyAgfQorCisgIGZ1
bmN0aW9uIHdhdGNoZXJDb3VudChvYmosIGtleSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0
YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAgcmV0dXJuIG1ldGEgJiYgbWV0YS5wZWVrV2F0Y2hp
bmcoa2V5KSB8fCAwOworICB9CisKKyAgZnVuY3Rpb24gdW53YXRjaChvYmosIF9rZXlQYXRoLCBt
KSB7CisgICAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMgc3BlY2lhbC4u
LgorICAgIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgQXJyYXkuaXNBcnJheShvYmopKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFfZW1iZXJNZXRhbFBhdGhfY2FjaGUu
aXNQYXRoKF9rZXlQYXRoKSkgeworICAgICAgX2VtYmVyTWV0YWxXYXRjaF9rZXkudW53YXRjaEtl
eShvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0YWxXYXRj
aF9wYXRoLnVud2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgsIG0pOworICAgIH0KKyAgfQorCisgIHZh
ciBOT0RFX1NUQUNLID0gW107CisKKyAgLyoqCisgICAgVGVhcnMgZG93biB0aGUgbWV0YSBvbiBh
biBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgTXVsdGlw
bGUgY2FsbHMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgCisgICAgQG1ldGhvZCBkZXN0cm95Cisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogIHRoZSBvYmplY3QgdG8gZGVz
dHJveQorICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlv
biBkZXN0cm95KG9iaikgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRh
KG9iaik7CisgICAgdmFyIG5vZGUsIG5vZGVzLCBrZXksIG5vZGVPYmplY3Q7CisKKyAgICBpZiAo
bWV0YSkgeworICAgICAgX2VtYmVyTWV0YWxNZXRhLmRlbGV0ZU1ldGEob2JqKTsKKyAgICAgIC8v
IHJlbW92ZSBjaGFpbldhdGNoZXJzIHRvIHJlbW92ZSBjaXJjdWxhciByZWZlcmVuY2VzIHRoYXQg
d291bGQgcHJldmVudCBHQworICAgICAgbm9kZSA9IG1ldGEucmVhZGFibGVDaGFpbnMoKTsKKyAg
ICAgIGlmIChub2RlKSB7CisgICAgICAgIE5PREVfU1RBQ0sucHVzaChub2RlKTsKKyAgICAgICAg
Ly8gcHJvY2VzcyB0cmVlCisgICAgICAgIHdoaWxlIChOT0RFX1NUQUNLLmxlbmd0aCA+IDApIHsK
KyAgICAgICAgICBub2RlID0gTk9ERV9TVEFDSy5wb3AoKTsKKyAgICAgICAgICAvLyBwdXNoIGNo
aWxkcmVuCisgICAgICAgICAgbm9kZXMgPSBub2RlLl9jaGFpbnM7CisgICAgICAgICAgaWYgKG5v
ZGVzKSB7CisgICAgICAgICAgICBmb3IgKGtleSBpbiBub2RlcykgeworICAgICAgICAgICAgICBp
ZiAobm9kZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgTk9ERV9TVEFD
Sy5wdXNoKG5vZGVzW2tleV0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgfQorICAgICAgICAgIC8vIHJlbW92ZSBjaGFpbldhdGNoZXIgaW4gbm9kZSBvYmplY3QK
KyAgICAgICAgICBpZiAobm9kZS5fd2F0Y2hpbmcpIHsKKyAgICAgICAgICAgIG5vZGVPYmplY3Qg
PSBub2RlLl9vYmplY3Q7CisgICAgICAgICAgICBpZiAobm9kZU9iamVjdCkgeworICAgICAgICAg
ICAgICBfZW1iZXJNZXRhbENoYWlucy5yZW1vdmVDaGFpbldhdGNoZXIobm9kZU9iamVjdCwgbm9k
ZS5fa2V5LCBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC93ZWFrX21hcCcsIFsn
ZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJl
ci1tZXRhbC9tZXRhJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1i
ZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbE1ldGEpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFdlYWtNYXA7CisKKyAgdmFyIGlkID0gMDsKKyAgZnVuY3Rpb24gVU5E
RUZJTkVEKCkge30KKworICAvKgorICAgKiBAcHJpdmF0ZQorICAgKiBAY2xhc3MgRW1iZXIuV2Vh
a01hcAorICAgKgorICAgKiBBIHBhcnRpYWwgcG9seWZpbGwgZm9yIFtXZWFrTWFwXShodHRwOi8v
d3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtd2Vha21hcC1vYmpl
Y3RzKS4KKyAgICoKKyAgICogVGhlcmUgaXMgYSBzbWFsbCBidXQgaW1wb3J0YW50IGNhdmVhdC4g
VGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlCisgICAqIHdlYWsgbWFwIHdpbGwg
bGl2ZSBsb25nZXIgKGluIHRoZSBzZW5zZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24pIHRoYW4gYWxs
IG9mIGl0cworICAgKiBrZXlzLCBvdGhlcndpc2UgaXQgaXMgcG9zc2libGUgdG8gbGVhayB0aGUg
dmFsdWVzIHN0b3JlZCBpbiB0aGUgd2VhayBtYXAuIEluCisgICAqIHByYWN0aWNlLCBtb3N0IHVz
ZSBjYXNlcyBzYXRpc2Z5IHRoaXMgbGltaXRhdGlvbiB3aGljaCBpcyB3aHkgaXQgaXMgaW5jbHVk
ZWQKKyAgICogaW4gZW1iZXItbWV0YWwuCisgICAqLworCisgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7
CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0ludm9raW5nIHRoZSBXZWFrTWFwIGNvbnN0
cnVjdG9yIHdpdGggYXJndW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJywgYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMCk7CisKKyAgICB0aGlzLl9pZCA9IF9lbWJlck1ldGFsVXRpbHMu
R1VJRF9LRVkgKyBpZCsrOworICB9CisKKyAgLyoKKyAgICogQG1ldGhvZCBnZXQKKyAgICogQHBh
cmFtIGtleSB7T2JqZWN0IHwgRnVuY3Rpb259CisgICAqIEByZXR1cm4ge0FueX0gc3RvcmVkIHZh
bHVlCisgICAqLworICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAob2JqKSB7Cisg
ICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAobWV0
YSkgeworICAgICAgdmFyIG1hcCA9IG1ldGEucmVhZGFibGVXZWFrKCk7CisgICAgICBpZiAobWFw
KSB7CisgICAgICAgIGlmIChtYXBbdGhpcy5faWRdID09PSBVTkRFRklORUQpIHsKKyAgICAgICAg
ICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hcFt0aGlz
Ll9pZF07CisgICAgICB9CisgICAgfQorICB9OworCisgIC8qCisgICAqIEBtZXRob2Qgc2V0Cisg
ICAqIEBwYXJhbSBrZXkge09iamVjdCB8IEZ1bmN0aW9ufQorICAgKiBAcGFyYW0gdmFsdWUge0Fu
eX0KKyAgICogQHJldHVybiB7V2Vha01hcH0gdGhlIHdlYWsgbWFwCisgICAqLworICBXZWFrTWFw
LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob2JqLCB2YWx1ZSkgeworICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdVbmNhdWdodCBUeXBlRXJyb3I6IEludmFsaWQgdmFsdWUgdXNlZCBhcyB3
ZWFrIG1hcCBrZXknLCBvYmogJiYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiBv
YmogPT09ICdmdW5jdGlvbicpKTsKKworICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgICB2YWx1ZSA9IFVOREVGSU5FRDsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbE1ldGEubWV0
YShvYmopLndyaXRhYmxlV2VhaygpW3RoaXMuX2lkXSA9IHZhbHVlOworCisgICAgcmV0dXJuIHRo
aXM7CisgIH07CisKKyAgLyoKKyAgICogQG1ldGhvZCBoYXMKKyAgICogQHBhcmFtIGtleSB7T2Jq
ZWN0IHwgRnVuY3Rpb259CisgICAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIHRoZSBrZXkgZXhpc3Rz
CisgICAqLworICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAob2JqKSB7CisgICAg
dmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAobWV0YSkg
eworICAgICAgdmFyIG1hcCA9IG1ldGEucmVhZGFibGVXZWFrKCk7CisgICAgICBpZiAobWFwKSB7
CisgICAgICAgIHJldHVybiBtYXBbdGhpcy5faWRdICE9PSB1bmRlZmluZWQ7CisgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9OworCisgIC8qCisgICAqIEBtZXRob2QgZGVs
ZXRlCisgICAqIEBwYXJhbSBrZXkge09iamVjdCB8IEZ1bmN0aW9ufQorICAgKiBAcmV0dXJuIHti
b29sZWFufSBpZiB0aGUga2V5IHdhcyBkZWxldGVkCisgICAqLworICBXZWFrTWFwLnByb3RvdHlw
ZS5kZWxldGUgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgaWYgKHRoaXMuaGFzKG9iaikpIHsKKyAg
ICAgIGRlbGV0ZSBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopLndyaXRhYmxlV2VhaygpW3RoaXMu
X2lkXTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMvaGVs
cGVycy9xdWVyeS1wYXJhbXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1i
ZXItcm91dGluZy9zeXN0ZW0vcXVlcnlfcGFyYW1zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJSb3V0aW5nU3lzdGVtUXVlcnlfcGFyYW1zKSB7CisgIC8qKgor
ICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcm91dGluZy1odG1sYmFycworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnF1ZXJ5UGFyYW1zSGVscGVyID0gcXVl
cnlQYXJhbXNIZWxwZXI7CisKKyAgLyoqCisgICAgVGhpcyBpcyBhIGhlbHBlciB0byBiZSB1c2Vk
IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGxpbmstdG8gaGVscGVyLgorICAgIEl0IHdpbGwgc3Vw
cGx5IHVybCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHRoZSB0YXJnZXQgcm91dGUuCisgIAorICAgIEV4
YW1wbGUKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bvc3RzJyAocXVl
cnktcGFyYW1zIGRpcmVjdGlvbj0iYXNjIil9fVNvcnR7ey9saW5rLXRvfX0KKyAgICBgYGAKKyAg
CisgICAgQG1ldGhvZCBxdWVyeS1wYXJhbXMKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxw
ZXJzCisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2ggdGFrZXMgYSBoYXNoIG9mIHF1ZXJ5IHBhcmFt
ZXRlcnMKKyAgICBAcmV0dXJuIHtPYmplY3R9IEEgYFF1ZXJ5UGFyYW1zYCBvYmplY3QgZm9yIGB7
e2xpbmstdG99fWAKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gcXVlcnlQYXJhbXNI
ZWxwZXIocGFyYW1zLCBoYXNoKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBg
cXVlcnktcGFyYW1zYCBoZWxwZXIgb25seSBhY2NlcHRzIGhhc2ggcGFyYW1ldGVycywgZS5nLiAo
cXVlcnktcGFyYW1zIHF1ZXJ5UGFyYW1Qcm9wZXJ0eU5hbWU9XCdmb29cJykgYXMgb3Bwb3NlZCB0
byBqdXN0IChxdWVyeS1wYXJhbXMgXCdmb29cJyknLCBwYXJhbXMubGVuZ3RoID09PSAwKTsKKwor
ICAgIHJldHVybiBfZW1iZXJSb3V0aW5nU3lzdGVtUXVlcnlfcGFyYW1zLmRlZmF1bHQuY3JlYXRl
KHsKKyAgICAgIHZhbHVlczogaGFzaAorICAgIH0pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
cm91dGluZy1odG1sYmFycy9pbmRleCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywg
J2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMnLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMnLCAnZW1i
ZXItcm91dGluZy1odG1sYmFycy9oZWxwZXJzL3F1ZXJ5LXBhcmFtcycsICdlbWJlci1yb3V0aW5n
LWh0bWxiYXJzL2tleXdvcmRzL2FjdGlvbicsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdv
cmRzL2VsZW1lbnQtYWN0aW9uJywgJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvcmVu
ZGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlckh0bWxiYXJz
SGVscGVycywgX2VtYmVySHRtbGJhcnNLZXl3b3JkcywgX2VtYmVyUm91dGluZ0h0bWxiYXJzSGVs
cGVyc1F1ZXJ5UGFyYW1zLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0FjdGlvbiwgX2Vt
YmVyUm91dGluZ0h0bWxiYXJzS2V5d29yZHNFbGVtZW50QWN0aW9uLCBfZW1iZXJSb3V0aW5nSHRt
bGJhcnNLZXl3b3Jkc1JlbmRlcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJvdXRpbmctaHRtbGJhcnMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAg
X2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCdxdWVyeS1wYXJhbXMnLCBfZW1i
ZXJSb3V0aW5nSHRtbGJhcnNIZWxwZXJzUXVlcnlQYXJhbXMucXVlcnlQYXJhbXNIZWxwZXIpOwor
CisgIF9lbWJlckh0bWxiYXJzS2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCdhY3Rpb24nLCBfZW1i
ZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0FjdGlvbi5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkcy5yZWdpc3RlcktleXdvcmQoJ0BlbGVtZW50X2FjdGlvbicsIF9lbWJlclJvdXRp
bmdIdG1sYmFyc0tleXdvcmRzRWxlbWVudEFjdGlvbi5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkcy5yZWdpc3RlcktleXdvcmQoJ3JlbmRlcicsIF9lbWJlclJvdXRpbmdIdG1sYmFy
c0tleXdvcmRzUmVuZGVyLmRlZmF1bHQpOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5
d29yZHMvYWN0aW9uJywgWydleHBvcnRzJywgJ2h0bWxiYXJzLXJ1bnRpbWUvaG9va3MnLCAnZW1i
ZXItcm91dGluZy1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWFjdGlvbiddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3
b3Jkc0Nsb3N1cmVBY3Rpb24pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
VGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgcHJvdmlkZXMgYSB3YXkgdG8gcGFzcyB0cmlnZ2VycyBm
b3IgYmVoYXZpb3IgKHVzdWFsbHkKKyAgICBqdXN0IGEgZnVuY3Rpb24pIGJldHdlZW4gY29tcG9u
ZW50cywgYW5kIGludG8gY29tcG9uZW50cyBmcm9tIGNvbnRyb2xsZXJzLgorICAKKyAgICAjIyMg
UGFzc2luZyBmdW5jdGlvbnMgd2l0aCB0aGUgYWN0aW9uIGhlbHBlcgorICAKKyAgICBUaGVyZSBh
cmUgdGhyZWUgY29udGV4dHMgYW4gYWN0aW9uIGhlbHBlciBjYW4gYmUgdXNlZCBpbi4gVGhlIGZp
cnN0IHR3bworICAgIGNvbnRleHRzIHRvIGRpc2N1c3MgYXJlIGF0dHJpYnV0ZSBjb250ZXh0LCBh
bmQgSGFuZGxlYmFycyB2YWx1ZSBjb250ZXh0LgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3shIEFuIGV4YW1wbGUgb2YgYXR0cmlidXRlIGNvbnRleHQgfX0KKyAgICA8ZGl2IG9uY2xpY2s9
e3thY3Rpb24gInNhdmUifX0+PC9kaXY+CisgICAge3shIEV4YW1wbGVzIG9mIEhhbmRsZWJhcnMg
dmFsdWUgY29udGV4dCB9fQorICAgIHt7aW5wdXQgb24taW5wdXQ9KGFjdGlvbiAic2F2ZSIpfX0K
KyAgICB7e3lpZWxkIChhY3Rpb24gInJlZnJlc2hEYXRhIikgYW5kQW5vdGhlclBhcmFtfX0KKyAg
ICBgYGAKKyAgCisgICAgSW4gdGhlc2UgY29udGV4dHMsCisgICAgdGhlIGhlbHBlciBpcyBjYWxs
ZWQgYSAiY2xvc3VyZSBhY3Rpb24iIGhlbHBlci4gSXRzIGJlaGF2aW9yIGlzIHNpbXBsZToKKyAg
ICBJZiBwYXNzZWQgYSBmdW5jdGlvbiBuYW1lLCByZWFkIHRoYXQgZnVuY3Rpb24gb2ZmIHRoZSBg
YWN0aW9uc2AgcHJvcGVydHkKKyAgICBvZiB0aGUgY3VycmVudCBjb250ZXh0LiBPbmNlIHRoYXQg
ZnVuY3Rpb24gaXMgcmVhZCAob3IgaWYgYSBmdW5jdGlvbiB3YXMKKyAgICBwYXNzZWQpLCBjcmVh
dGUgYSBjbG9zdXJlIG92ZXIgdGhhdCBmdW5jdGlvbiBhbmQgYW55IGFyZ3VtZW50cy4KKyAgCisg
ICAgVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBhbiBhY3Rpb24gaGVscGVyIHVzZWQgdGhpcyB3YXkg
aXMgc2ltcGx5IGEgZnVuY3Rpb24uCisgICAgRm9yIGV4YW1wbGUsIGluIHRoZSBhdHRyaWJ1dGUg
Y29udGV4dDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBBbiBleGFtcGxlIG9mIGF0
dHJpYnV0ZSBjb250ZXh0IH19CisgICAgPGRpdiBvbmNsaWNrPXt7YWN0aW9uICJzYXZlIn19Pjwv
ZGl2PgorICAgIGBgYAorICAKKyAgICBUaGUgcmVzdWx0aW5nIHRlbXBsYXRlIHJlbmRlciBsb2dp
YyB3b3VsZCBiZToKKyAgCisgICAgYGBganMKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnZGl2Jyk7CisgICAgdmFyIGFjdGlvbkZ1bmN0aW9uID0gKGZ1bmN0aW9uKGNvbnRl
eHQpeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5h
Y3Rpb25zLnNhdmUuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsKKyAgICAgIH07CisgICAgfSko
Y29udGV4dCk7CisgICAgZGl2Lm9uY2xpY2sgPSBhY3Rpb25GdW5jdGlvbjsKKyAgICBgYGAKKyAg
CisgICAgVGh1cyB3aGVuIHRoZSBkaXYgaXMgY2xpY2tlZCwgdGhlIGFjdGlvbiBvbiB0aGF0IGNv
bnRleHQgaXMgY2FsbGVkLgorICAgIEJlY2F1c2UgdGhlIGBhY3Rpb25GdW5jdGlvbmAgaXMganVz
dCBhIGZ1bmN0aW9uLCBjbG9zdXJlIGFjdGlvbnMgY2FuIGJlCisgICAgcGFzc2VkIGJldHdlZW4g
Y29tcG9uZW50cyBhbmQgc3RpbGwgZXhlY3V0ZSBpbiB0aGUgY29ycmVjdCBjb250ZXh0LgorICAK
KyAgICBIZXJlIGlzIGFuIGV4YW1wbGUgYWN0aW9uIGhhbmRsZXIgb24gYSBjb21wb25lbnQ6Cisg
IAorICAgIGBgYGpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7
CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHNhdmUoKSB7CisgICAgICAgICAgdGhpcy5nZXQo
J21vZGVsJykuc2F2ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisg
IAorICAgIEFjdGlvbnMgYXJlIGFsd2F5cyBsb29rZWQgdXAgb24gdGhlIGBhY3Rpb25zYCBwcm9w
ZXJ0eSBvZiB0aGUgY3VycmVudCBjb250ZXh0LgorICAgIFRoaXMgYXZvaWRzIGNvbGxpc2lvbnMg
aW4gdGhlIG5hbWluZyBvZiBjb21tb24gYWN0aW9ucywgc3VjaCBhcyBgZGVzdHJveWAuCisgIAor
ICAgIFR3byBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGBhY3Rpb25gIGhlbHBlciB3aGVu
IGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkuCisgIAorICAgICogYHRhcmdldD1zb21lUHJvcGVydHlg
IHdpbGwgbG9vayB0byBgc29tZVByb3BlcnR5YCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50CisgICAg
ICBjb250ZXh0IGZvciB0aGUgYGFjdGlvbnNgIGhhc2guIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVu
IHRhcmdldHRpbmcgYQorICAgICAgc2VydmljZSBmb3IgYWN0aW9ucy4KKyAgICAqIGB2YWx1ZT0i
dGFyZ2V0LnZhbHVlImAgd2lsbCByZWFkIHRoZSBwYXRoIGB0YXJnZXQudmFsdWVgIG9mZiB0aGUg
Zmlyc3QKKyAgICAgIGFyZ3VtZW50IHRvIHRoZSBhY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQgYW5k
IHJld3JpdGUgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICB0byBiZSB0aGF0IHZhbHVlLiBUaGlz
IGlzIHVzZWZ1bCB3aGVuIGF0dGFjaGluZyBhY3Rpb25zIHRvIGV2ZW50IGxpc3RlbmVycy4KKyAg
CisgICAgIyMjIEludm9raW5nIGFuIGFjdGlvbgorICAKKyAgICBDbG9zdXJlIGFjdGlvbnMgY3Vy
cnkgYm90aCB0aGVpciBzY29wZSBhbmQgYW55IGFyZ3VtZW50cy4gV2hlbiBpbnZva2VkLCBhbnkK
KyAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgY3Vycmll
ZCBsaXN0LgorICAKKyAgICBBY3Rpb25zIHNob3VsZCBiZSBpbnZva2VkIHVzaW5nIHRoZSBbc2Vu
ZEFjdGlvbl0oL2FwaS9jbGFzc2VzL0VtYmVyLkNvbXBvbmVudC5odG1sI21ldGhvZF9zZW5kQWN0
aW9uKQorICAgIG1ldGhvZC4gVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBzZW5kQWN0aW9uYCBpcyB0
aGUgYWN0aW9uIHRvIGJlIGNhbGxlZCwgYW5kCisgICAgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJl
IHBhc3NlZCB0byB0aGUgYWN0aW9uIGZ1bmN0aW9uLiBUaGlzIGhhcyBpbnRlcmVzdGluZworICAg
IHByb3BlcnRpZXMgY29tYmluZWQgd2l0aCBjdXJyeWluZyBvZiBhcmd1bWVudHMuIEZvciBleGFt
cGxlOgorICAKKyAgICBgYGBqcworICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5l
eHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICAvLyBVc2FnZSB7e2lucHV0IG9uLWlu
cHV0PShhY3Rpb24gKGFjdGlvbiAnc2V0TmFtZScgbW9kZWwpIHZhbHVlPSJ0YXJnZXQudmFsdWUi
KX19CisgICAgICAgIHNldE5hbWUobW9kZWwsIG5hbWUpIHsKKyAgICAgICAgICBtb2RlbC5zZXQo
J25hbWUnLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBUaGUgZmlyc3QgYXJndW1lbnQgKGBtb2RlbGApIHdhcyBjdXJyaWVkIG92ZXIsIGFuZCB0
aGUgcnVuLXRpbWUgYXJndW1lbnQgKGBldmVudGApCisgICAgYmVjb21lcyBhIHNlY29uZCBhcmd1
bWVudC4gQWN0aW9uIGNhbGxzIGNhbiBiZSBuZXN0ZWQgdGhpcyB3YXkgYmVjYXVzZSBlYWNoIHNp
bXBseQorICAgIHJldHVybnMgYSBmdW5jdGlvbi4gQW55IGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQg
dG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGluY2x1ZGluZworICAgIG90aGVyIGFjdGlvbnMu
CisgIAorICAgIEFjdGlvbnMgaW52b2tlZCB3aXRoIGBzZW5kQWN0aW9uYCBoYXZlIHRoZSBzYW1l
IGN1cnJ5aW5nIGJlaGF2aW9yIGFzIGRlbW9uc3RyYXRlZAorICAgIHdpdGggYG9uLWlucHV0YCBh
Ym92ZS4gRm9yIGV4YW1wbGU6CisgIAorICAgIGBgYGpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1i
ZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHNldE5hbWUo
bW9kZWwsIG5hbWUpIHsKKyAgICAgICAgICBtb2RlbC5zZXQoJ25hbWUnLCBuYW1lKTsKKyAgICAg
ICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisg
ICAge3tteS1pbnB1dCBzdWJtaXQ9KGFjdGlvbiAnc2V0TmFtZScgbW9kZWwpfX0KKyAgICBgYGAK
KyAgCisgICAgYGBganMKKyAgICAvLyBhcHAvY29tcG9uZW50cy9teS1jb21wb25lbnQuanMKKyAg
ICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICAgIGNsaWNrKCkg
eworICAgICAgICAvLyBOb3RlIHRoYXQgbW9kZWwgaXMgbm90IHBhc3NlZCwgaXQgd2FzIGN1cnJp
ZWQgaW4gdGhlIHRlbXBsYXRlCisgICAgICAgIHRoaXMuc2VuZEFjdGlvbignc3VibWl0JywgJ2Jv
YicpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICAjIyMgQXR0YWNoaW5nIGFj
dGlvbnMgdG8gRE9NIGVsZW1lbnRzCisgIAorICAgIFRoZSB0aGlyZCBjb250ZXh0IG9mIHRoZSBg
e3thY3Rpb259fWAgaGVscGVyIGNhbiBiZSBjYWxsZWQgImVsZW1lbnQgc3BhY2UiLgorICAgIEZv
ciBleGFtcGxlOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3shIEFuIGV4YW1wbGUgb2Yg
ZWxlbWVudCBzcGFjZSB9fQorICAgIDxkaXYge3thY3Rpb24gInNhdmUifX0+PC9kaXY+CisgICAg
YGBgCisgIAorICAgIFVzZWQgdGhpcyB3YXksIHRoZSBge3thY3Rpb259fWAgaGVscGVyIHByb3Zp
ZGVzIGEgdXNlZnVsIHNob3J0Y3V0IGZvcgorICAgIHJlZ2lzdGVyaW5nIGFuIEhUTUwgZWxlbWVu
dCBpbiBhIHRlbXBsYXRlIGZvciBhIHNpbmdsZSBET00gZXZlbnQgYW5kCisgICAgZm9yd2FyZGlu
ZyB0aGF0IGludGVyYWN0aW9uIHRvIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQgKGNvbnRyb2xsZXIg
b3IgY29tcG9uZW50KS4KKyAgCisgICAgSWYgdGhlIGNvbnRleHQgb2YgYSB0ZW1wbGF0ZSBpcyBh
IGNvbnRyb2xsZXIsIGFjdGlvbnMgdXNlZCB0aGlzIHdheSB3aWxsCisgICAgYnViYmxlIHRvIHJv
dXRlcyB3aGVuIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IGltcGxlbWVudCB0aGUgc3BlY2lmaWVk
IGFjdGlvbi4KKyAgICBPbmNlIGFuIGFjdGlvbiBoaXRzIGEgcm91dGUsIGl0IHdpbGwgYnViYmxl
IHRocm91Z2ggdGhlIHJvdXRlIGhpZXJhcmNoeS4KKyAgCisgICAgIyMjIEV2ZW50IFByb3BhZ2F0
aW9uCisgIAorICAgIGB7e2FjdGlvbn19YCBoZWxwZXJzIGNhbGxlZCBpbiBlbGVtZW50IHNwYWNl
IGNhbiBjb250cm9sIGV2ZW50IGJ1YmJsaW5nLiBOb3RlCisgICAgdGhhdCB0aGUgY2xvc3VyZSBz
dHlsZSBhY3Rpb25zIGNhbm5vdC4KKyAgCisgICAgRXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIHRo
ZSBhY3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCisgICAgYC5wcmV2ZW50RGVm
YXVsdCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGRvIHNvIGluIHlvdXIg
ZXZlbnQKKyAgICBoYW5kbGVycy4gSWYgeW91IG5lZWQgdG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRp
b24gKHRvIGhhbmRsZSBmaWxlIGlucHV0cyBmb3IKKyAgICBleGFtcGxlKSB5b3UgY2FuIHN1cHBs
eSB0aGUgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBvcHRpb24gdG8gdGhlIGB7e2FjdGlvbn19YCBo
ZWxwZXI6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IHt7YWN0aW9uICJzYXlIZWxs
byIgcHJldmVudERlZmF1bHQ9ZmFsc2V9fT4KKyAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiAvPgor
ICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPgorICAgIDwvZGl2PgorICAgIGBgYAorICAK
KyAgICBUbyBkaXNhYmxlIGJ1YmJsaW5nLCBwYXNzIGBidWJibGVzPWZhbHNlYCB0byB0aGUgaGVs
cGVyOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGJ1dHRvbiB7e2FjdGlvbiAnZWRpdCcg
cG9zdCBidWJibGVzPWZhbHNlfX0+RWRpdDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBUbyBk
aXNhYmxlIGJ1YmJsaW5nIHdpdGggY2xvc3VyZSBzdHlsZSBhY3Rpb25zIHlvdSBtdXN0IGNyZWF0
ZSB5b3VyIG93bgorICAgIHdyYXBwZXIgaGVscGVyIHRoYXQgbWFrZXMgdXNlIG9mIGBldmVudC5z
dG9wUHJvcGFnYXRpb24oKWA6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IG9uY2xp
Y2s9e3tkaXNhYmxlLWJ1YmJsaW5nIChhY3Rpb24gInNheUhlbGxvIil9fT5IZWxsbzwvZGl2Pgor
ICAgIGBgYAorICAKKyAgICBgYGBqcworICAgIC8vIGFwcC9oZWxwZXJzL2Rpc2FibGUtYnViYmxp
bmcuanMKKyAgICBpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworICAKKyAgICBleHBvcnQgZnVu
Y3Rpb24gZGlzYWJsZUJ1YmJsaW5nKFthY3Rpb25dKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24o
ZXZlbnQpIHsKKyAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgIAorICAgICAgICBy
ZXR1cm4gYWN0aW9uKGV2ZW50KTsKKyAgICAgIH07CisgICAgfQorICAKKyAgICBleHBvcnQgZGVm
YXVsdCBFbWJlci5IZWxwZXIuaGVscGVyKGRpc2FibGVCdWJibGluZyk7CisgICAgYGBgCisgIAor
ICAgIElmIHlvdSBuZWVkIHRoZSBkZWZhdWx0IGhhbmRsZXIgdG8gdHJpZ2dlciB5b3Ugc2hvdWxk
IGVpdGhlciByZWdpc3RlciB5b3VyCisgICAgb3duIGV2ZW50IGhhbmRsZXIsIG9yIHVzZSBldmVu
dCBtZXRob2RzIG9uIHlvdXIgdmlldyBjbGFzcy4gU2VlCisgICAgWyJSZXNwb25kaW5nIHRvIEJy
b3dzZXIgRXZlbnRzIl0oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCN0b2NfcmVzcG9uZGlu
Zy10by1icm93c2VyLWV2ZW50cykKKyAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgRW1iZXIu
VmlldyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgCisgICAgIyMjIFNwZWNpZnlpbmcgRE9NIGV2
ZW50IHR5cGUKKyAgCisgICAgYHt7YWN0aW9ufX1gIGhlbHBlcnMgY2FsbGVkIGluIGVsZW1lbnQg
c3BhY2UgY2FuIHNwZWNpZnkgYW4gZXZlbnQgdHlwZS4KKyAgCisgICAgQnkgZGVmYXVsdCB0aGUg
YHt7YWN0aW9ufX1gIGhlbHBlciByZWdpc3RlcnMgZm9yIERPTSBgY2xpY2tgIGV2ZW50cy4gWW91
IGNhbgorICAgIHN1cHBseSBhbiBgb25gIG9wdGlvbiB0byB0aGUgaGVscGVyIHRvIHNwZWNpZnkg
YSBkaWZmZXJlbnQgRE9NIGV2ZW50IG5hbWU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8
ZGl2IHt7YWN0aW9uICJhbkFjdGlvbk5hbWUiIG9uPSJkb3VibGVDbGljayJ9fT4KKyAgICAgIGNs
aWNrIG1lCisgICAgPC9kaXY+CisgICAgYGBgCisgIAorICAgIFNlZSBbIkV2ZW50IE5hbWVzIl0o
L2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCN0b2NfZXZlbnQtbmFtZXMpIGZvciBhIGxpc3Qg
b2YKKyAgICBhY2NlcHRhYmxlIERPTSBldmVudCBuYW1lcy4KKyAgCisgICAgIyMjIFNwZWNpZnlp
bmcgd2hpdGVsaXN0ZWQgbW9kaWZpZXIga2V5cworICAKKyAgICBge3thY3Rpb259fWAgaGVscGVy
cyBjYWxsZWQgaW4gZWxlbWVudCBzcGFjZSBjYW4gc3BlY2lmeSBtb2RpZmllciBrZXlzLgorICAK
KyAgICBCeSBkZWZhdWx0IHRoZSBge3thY3Rpb259fWAgaGVscGVyIHdpbGwgaWdub3JlIGNsaWNr
IGV2ZW50cyB3aXRoIHByZXNzZWQgbW9kaWZpZXIKKyAgICBrZXlzLiBZb3UgY2FuIHN1cHBseSBh
biBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGtleXMgc2hvdWxkIG5vdCBi
ZSBpZ25vcmVkLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGRpdiB7e2FjdGlvbiAiYW5B
Y3Rpb25OYW1lIiBhbGxvd2VkS2V5cz0iYWx0In19PgorICAgICAgY2xpY2sgbWUKKyAgICA8L2Rp
dj4KKyAgICBgYGAKKyAgCisgICAgVGhpcyB3YXkgdGhlIGFjdGlvbiB3aWxsIGZpcmUgd2hlbiBj
bGlja2luZyB3aXRoIHRoZSBhbHQga2V5IHByZXNzZWQgZG93bi4KKyAgCisgICAgQWx0ZXJuYXRp
dmVseSwgc3VwcGx5ICJhbnkiIHRvIHRoZSBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBhY2NlcHQg
YW55IGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVyIGtleXMuCisgIAorICAgIGBgYGhhbmRsZWJhcnMK
KyAgICA8ZGl2IHt7YWN0aW9uICJhbkFjdGlvbk5hbWUiIGFsbG93ZWRLZXlzPSJhbnkifX0+Cisg
ICAgICBjbGljayBtZSB3aXRoIGFueSBrZXkgcHJlc3NlZAorICAgIDwvZGl2PgorICAgIGBgYAor
ICAKKyAgICAjIyMgU3BlY2lmeWluZyBhIFRhcmdldAorICAKKyAgICBBIGB0YXJnZXRgIG9wdGlv
biBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIGhlbHBlciB0byBjaGFuZ2UKKyAgICB3aGljaCBvYmpl
Y3Qgd2lsbCByZWNlaXZlIHRoZSBtZXRob2QgY2FsbC4gVGhpcyBvcHRpb24gbXVzdCBiZSBhIHBh
dGgKKyAgICB0byBhbiBvYmplY3QsIGFjY2Vzc2libGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dDoK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBhcHAvdGVtcGxhdGVzL2FwcGxpY2F0aW9u
LmhicyB9fQorICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgdGFyZ2V0PXNvbWVTZXJ2
aWNlfX0+CisgICAgICBjbGljayBtZQorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgLy8gYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpzCisgICAgZXhw
b3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgc29tZVNlcnZpY2U6
IEVtYmVyLmluamVjdC5zZXJ2aWNlKCkKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhv
ZCBhY3Rpb24KKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHB1YmxpYwor
ICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBzY29wZSwg
cGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGlmIChtb3Jw
aCkgeworICAgICAgX2h0bWxiYXJzUnVudGltZUhvb2tzLmtleXdvcmQoJ0BlbGVtZW50X2FjdGlv
bicsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2
aXNpdG9yKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBfZW1iZXJS
b3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVBY3Rpb24uZGVmYXVsdChtb3JwaCwgZW52LCBz
Y29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgIH07Cit9
KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWFjdGlv
bicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsICdlbWJlci1tZXRhbC9l
cnJvcicsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcsICdlbWJlci1tZXRhbC9pbnN0cnVtZW50YXRp
b24nLCAnZW1iZXItbWV0YWwvaXNfbm9uZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscywgX2VtYmVyTWV0YWxTeW1i
b2wsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJIdG1sYmFyc0hvb2tzU3ViZXhwciwg
X2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxJbnN0cnVt
ZW50YXRpb24sIF9lbWJlck1ldGFsSXNfbm9uZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gY2xvc3VyZUFjdGlvbjsKKyAgdmFyIElOVk9LRSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0lOVk9LRScpOworICBleHBvcnRzLklOVk9LRSA9IElOVk9LRTsKKyAg
dmFyIEFDVElPTiA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0FDVElPTicpOworCisgIGV4
cG9ydHMuQUNUSU9OID0gQUNUSU9OOworCisgIGZ1bmN0aW9uIGNsb3N1cmVBY3Rpb24obW9ycGgs
IGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsK
KyAgICB2YXIgcyA9IG5ldyBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uU3RyZWFtKGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciByYXdBY3Rpb24gPSBwYXJhbXNbMF07CisgICAgICB2YXIgYWN0aW9u
QXJndW1lbnRzID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZEFycmF5KHBhcmFtcy5zbGlj
ZSgxLCBwYXJhbXMubGVuZ3RoKSk7CisKKyAgICAgIHZhciB0YXJnZXQgPSB1bmRlZmluZWQsCisg
ICAgICAgICAgYWN0aW9uID0gdW5kZWZpbmVkLAorICAgICAgICAgIHZhbHVlUGF0aCA9IHVuZGVm
aW5lZDsKKworICAgICAgaWYgKF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KHJhd0FjdGlvbikp
IHsKKyAgICAgICAgdmFyIGxhYmVsID0gX2VtYmVySHRtbGJhcnNIb29rc1N1YmV4cHIubGFiZWxG
b3JTdWJleHByKHBhcmFtcywgaGFzaCwgJ2FjdGlvbicpOworICAgICAgICB0aHJvdyBuZXcgX2Vt
YmVyTWV0YWxFcnJvci5kZWZhdWx0KCdBY3Rpb24gcGFzc2VkIGlzIG51bGwgb3IgdW5kZWZpbmVk
IGluICcgKyBsYWJlbCArICcgZnJvbSAnICsgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChz
Y29wZS5nZXRTZWxmKCkpICsgJy4nKTsKKyAgICAgIH0gZWxzZSBpZiAocmF3QWN0aW9uW0lOVk9L
RV0pIHsKKyAgICAgICAgLy8gb24tY2hhbmdlPXt7YWN0aW9uIChtdXQgbmFtZSl9fQorICAgICAg
ICB0YXJnZXQgPSByYXdBY3Rpb247CisgICAgICAgIGFjdGlvbiA9IHJhd0FjdGlvbltJTlZPS0Vd
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb24tY2hhbmdlPXt7YWN0aW9uIHNldE5hbWV9
fQorICAgICAgICAvLyBlbGVtZW50LXNwYWNlIGFjdGlvbnMgbG9vayB0byAiY29udHJvbGxlciIg
dGhlbiB0YXJnZXQuIEhlcmUgd2Ugb25seQorICAgICAgICAvLyBsb29rIHRvICJ0YXJnZXQiLgor
ICAgICAgICB0YXJnZXQgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHNjb3BlLmdldFNl
bGYoKSk7CisgICAgICAgIGFjdGlvbiA9IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQocmF3
QWN0aW9uKTsKKyAgICAgICAgdmFyIGFjdGlvblR5cGUgPSB0eXBlb2YgYWN0aW9uOworCisgICAg
ICAgIGlmIChhY3Rpb25UeXBlID09PSAnc3RyaW5nJykgeworICAgICAgICAgIHZhciBhY3Rpb25O
YW1lID0gYWN0aW9uOworICAgICAgICAgIGFjdGlvbiA9IG51bGw7CisgICAgICAgICAgLy8gb24t
Y2hhbmdlPXt7YWN0aW9uICdzZXROYW1lJ319CisgICAgICAgICAgaWYgKGhhc2gudGFyZ2V0KSB7
CisgICAgICAgICAgICAvLyBvbi1jaGFuZ2U9e3thY3Rpb24gJ3NldE5hbWUnIHRhcmdldD1hbHRl
cm5hdGl2ZUNvbXBvbmVudH19CisgICAgICAgICAgICB0YXJnZXQgPSBfZW1iZXJNZXRhbFN0cmVh
bXNVdGlscy5yZWFkKGhhc2gudGFyZ2V0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRh
cmdldC5hY3Rpb25zKSB7CisgICAgICAgICAgICBhY3Rpb24gPSB0YXJnZXQuYWN0aW9uc1thY3Rp
b25OYW1lXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFjdGlvbikgeworICAgICAg
ICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnQW4gYWN0aW9uIG5hbWVk
IFwnJyArIGFjdGlvbk5hbWUgKyAnXCcgd2FzIG5vdCBmb3VuZCBpbiAnICsgdGFyZ2V0ICsgJy4n
KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uICYmIHR5cGVvZiBhY3Rp
b25bSU5WT0tFXSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHRhcmdldCA9IGFjdGlvbjsK
KyAgICAgICAgICBhY3Rpb24gPSBhY3Rpb25bSU5WT0tFXTsKKyAgICAgICAgfSBlbHNlIGlmIChh
Y3Rpb25UeXBlICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1l
dGFsRXJyb3IuZGVmYXVsdCgnQW4gYWN0aW9uIGNvdWxkIG5vdCBiZSBtYWRlIGZvciBgJyArIHJh
d0FjdGlvbi5sYWJlbCArICdgIGluICcgKyB0YXJnZXQgKyAnLiBQbGVhc2UgY29uZmlybSB0aGF0
IHlvdSBhcmUgdXNpbmcgZWl0aGVyIGEgcXVvdGVkIGFjdGlvbiBuYW1lIChpLmUuIGAoYWN0aW9u
IFwnJyArIHJhd0FjdGlvbi5sYWJlbCArICdcJylgKSBvciBhIGZ1bmN0aW9uIGF2YWlsYWJsZSBp
biAnICsgdGFyZ2V0ICsgJy4nKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaGFz
aC52YWx1ZSkgeworICAgICAgICAvLyA8YnV0dG9uIG9uLWtleXByZXNzPXt7YWN0aW9uIChtdXQg
bmFtZSkgdmFsdWU9IndoaWNoIn19CisgICAgICAgIC8vIG9uLWtleXByZXNzIGlzIG5vdCBldmVu
IGFuIEVtYmVyIGZlYXR1cmUgeWV0CisgICAgICAgIHZhbHVlUGF0aCA9IF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQoaGFzaC52YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjcmVh
dGVDbG9zdXJlQWN0aW9uKHRoaXMsIHRhcmdldCwgYWN0aW9uLCB2YWx1ZVBhdGgsIGFjdGlvbkFy
Z3VtZW50cyk7CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlckh0bWxi
YXJzSG9va3NTdWJleHByLmxhYmVsRm9yU3ViZXhwcihwYXJhbXMsIGhhc2gsICdhY3Rpb24nKTsK
KyAgICB9KTsKKworICAgIHBhcmFtcy5mb3JFYWNoKHMuYWRkRGVwZW5kZW5jeSwgcyk7CisgICAg
T2JqZWN0LmtleXMoaGFzaCkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgcmV0dXJu
IHMuYWRkRGVwZW5kZW5jeShpdGVtKTsKKyAgICB9KTsKKworICAgIHJldHVybiBzOworICB9CisK
KyAgZnVuY3Rpb24gY3JlYXRlQ2xvc3VyZUFjdGlvbihzdHJlYW0sIHRhcmdldCwgYWN0aW9uLCB2
YWx1ZVBhdGgsIGFjdGlvbkFyZ3VtZW50cykgeworICAgIHZhciBjbG9zdXJlQWN0aW9uOworCisg
ICAgaWYgKGFjdGlvbkFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisgICAgICBjbG9zdXJlQWN0aW9u
ID0gZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgYXJncyA9IGFjdGlvbkFyZ3VtZW50czsKKwor
ICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGFzc2VkQXJndW1lbnRz
ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAg
ICAgcGFzc2VkQXJndW1lbnRzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKHBhc3NlZEFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgYXJn
cyA9IGFjdGlvbkFyZ3VtZW50cy5jb25jYXQocGFzc2VkQXJndW1lbnRzKTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAodmFsdWVQYXRoICYmIGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgIGFy
Z3NbMF0gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJnc1swXSwgdmFsdWVQYXRoKTsK
KyAgICAgICAgfQorCisgICAgICAgIHZhciBwYXlsb2FkID0geyB0YXJnZXQ6IHRhcmdldCwgYXJn
czogYXJncywgbGFiZWw6IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmxhYmVsRm9yKHN0cmVhbSkg
fTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsSW5zdHJ1bWVudGF0aW9uLmZsYWdnZWRJbnN0
cnVtZW50KCdpbnRlcmFjdGlvbi5lbWJlci1hY3Rpb24nLCBwYXlsb2FkLCBmdW5jdGlvbiAoKSB7
CisgICAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5qb2luLmFwcGx5
KF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdCwgW3RhcmdldCwgYWN0aW9uXS5jb25jYXQoYXJn
cykpOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb3N1cmVB
Y3Rpb24gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRz
Lmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBf
a2V5MisrKSB7CisgICAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlUGF0aCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAg
ICAgICAgICBhcmdzWzBdID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGFyZ3NbMF0sIHZh
bHVlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGF5bG9hZCA9IHsgdGFyZ2V0OiB0
YXJnZXQsIGFyZ3M6IGFyZ3MsIGxhYmVsOiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5sYWJlbEZv
cihzdHJlYW0pIH07CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbEluc3RydW1lbnRhdGlvbi5m
bGFnZ2VkSW5zdHJ1bWVudCgnaW50ZXJhY3Rpb24uZW1iZXItYWN0aW9uJywgcGF5bG9hZCwgZnVu
Y3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQu
am9pbi5hcHBseShfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQsIFt0YXJnZXQsIGFjdGlvbl0u
Y29uY2F0KGFyZ3MpKTsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0KKworICAgIGNsb3N1
cmVBY3Rpb25bQUNUSU9OXSA9IHRydWU7CisKKyAgICByZXR1cm4gY2xvc3VyZUFjdGlvbjsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1h
Y3Rpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvdXRp
bHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcs
ICdlbWJlci12aWV3cy9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS91dGlscycs
ICdlbWJlci12aWV3cy9zeXN0ZW0vYWN0aW9uX21hbmFnZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0
aWxzLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJWaWV3c1N0cmVhbXNVdGlscywgX2VtYmVy
Vmlld3NTeXN0ZW1VdGlscywgX2VtYmVyVmlld3NTeXN0ZW1BY3Rpb25fbWFuYWdlcikgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0geworICAgIHNldHVwU3RhdGU6IGZ1
bmN0aW9uIChzdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgZ2V0
U3RyZWFtID0gZW52Lmhvb2tzLmdldDsKKyAgICAgIHZhciByZWFkID0gZW52Lmhvb2tzLmdldFZh
bHVlOworCisgICAgICB2YXIgYWN0aW9uTmFtZSA9IHJlYWQocGFyYW1zWzBdKTsKKworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBzcGVjaWZpZWQgYSBxdW90ZWxlc3MgcGF0aCB0
byB0aGUge3thY3Rpb259fSBoZWxwZXIgJyArICd3aGljaCBkaWQgbm90IHJlc29sdmUgdG8gYW4g
YWN0aW9uIG5hbWUgKGEgc3RyaW5nKS4gJyArICdQZXJoYXBzIHlvdSBtZWFudCB0byB1c2UgYSBx
dW90ZWQgYWN0aW9uTmFtZT8gKGUuZy4ge3thY3Rpb24gXCdzYXZlXCd9fSkuJywgdHlwZW9mIGFj
dGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAnZnVuY3Rpb24n
KTsKKworICAgICAgdmFyIGFjdGlvbkFyZ3MgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAxLCBs
ID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBhY3Rpb25BcmdzLnB1c2go
X2VtYmVyVmlld3NTdHJlYW1zVXRpbHMucmVhZFVud3JhcHBlZE1vZGVsKHBhcmFtc1tpXSkpOwor
ICAgICAgfQorCisgICAgICB2YXIgdGFyZ2V0OworICAgICAgaWYgKGhhc2gudGFyZ2V0KSB7Cisg
ICAgICAgIGlmICh0eXBlb2YgaGFzaC50YXJnZXQgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAg
dGFyZ2V0ID0gcmVhZChnZXRTdHJlYW0oZW52LCBzY29wZSwgaGFzaC50YXJnZXQpKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICB0YXJnZXQgPSByZWFkKGhhc2gudGFyZ2V0KTsKKyAgICAg
ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0ID0gcmVhZChzY29wZS5nZXRMb2Nh
bCgnY29udHJvbGxlcicpKSB8fCByZWFkKHNjb3BlLmdldFNlbGYoKSk7CisgICAgICB9CisKKyAg
ICAgIHJldHVybiB7IGFjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGFjdGlvbkFyZ3M6IGFjdGlvbkFy
Z3MsIHRhcmdldDogdGFyZ2V0IH07CisgICAgfSwKKworICAgIGlzU3RhYmxlOiBmdW5jdGlvbiAo
c3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkgeworICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfSwKKworICAgIHJlbmRlcjogZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBhY3Rpb25JZCA9
IGVudi5kb20uZ2V0QXR0cmlidXRlKG5vZGUuZWxlbWVudCwgJ2RhdGEtZW1iZXItYWN0aW9uJykg
fHwgX2VtYmVyTWV0YWxVdGlscy51dWlkKCk7CisKKyAgICAgIEFjdGlvbkhlbHBlci5yZWdpc3Rl
ckFjdGlvbih7CisgICAgICAgIGFjdGlvbklkOiBhY3Rpb25JZCwKKyAgICAgICAgbm9kZTogbm9k
ZSwKKyAgICAgICAgZXZlbnROYW1lOiBoYXNoLm9uIHx8ICdjbGljaycsCisgICAgICAgIGJ1YmJs
ZXM6IGhhc2guYnViYmxlcywKKyAgICAgICAgcHJldmVudERlZmF1bHQ6IGhhc2gucHJldmVudERl
ZmF1bHQsCisgICAgICAgIHdpdGhLZXlDb2RlOiBoYXNoLndpdGhLZXlDb2RlLAorICAgICAgICBh
bGxvd2VkS2V5czogaGFzaC5hbGxvd2VkS2V5cworICAgICAgfSk7CisKKyAgICAgIG5vZGUuY2xl
YW51cCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgQWN0aW9uSGVscGVyLnVucmVnaXN0ZXJBY3Rp
b24oYWN0aW9uSWQpOworICAgICAgfTsKKworICAgICAgZW52LmRvbS5zZXRBdHRyaWJ1dGUobm9k
ZS5lbGVtZW50LCAnZGF0YS1lbWJlci1hY3Rpb24nLCBhY3Rpb25JZCk7CisgICAgfQorICB9Owor
ICB2YXIgQWN0aW9uSGVscGVyID0ge307CisKKyAgZXhwb3J0cy5BY3Rpb25IZWxwZXIgPSBBY3Rp
b25IZWxwZXI7CisgIC8vIHJlZ2lzdGVyZWRBY3Rpb25zIGlzIHJlLWV4cG9ydGVkIGZvciBjb21w
YXRpYmlsaXR5IHdpdGggb2xkZXIgcGx1Z2lucworICAvLyB0aGF0IHdlcmUgdXNpbmcgdGhpcyB1
bmRvY3VtZW50ZWQgQVBJLgorICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnMgPSBfZW1i
ZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLmRlZmF1bHQucmVnaXN0ZXJlZEFjdGlvbnM7CisK
KyAgQWN0aW9uSGVscGVyLnJlZ2lzdGVyQWN0aW9uID0gZnVuY3Rpb24gKF9yZWYpIHsKKyAgICB2
YXIgYWN0aW9uSWQgPSBfcmVmLmFjdGlvbklkOworICAgIHZhciBub2RlID0gX3JlZi5ub2RlOwor
ICAgIHZhciBldmVudE5hbWUgPSBfcmVmLmV2ZW50TmFtZTsKKyAgICB2YXIgcHJldmVudERlZmF1
bHQgPSBfcmVmLnByZXZlbnREZWZhdWx0OworICAgIHZhciBidWJibGVzID0gX3JlZi5idWJibGVz
OworICAgIHZhciBhbGxvd2VkS2V5cyA9IF9yZWYuYWxsb3dlZEtleXM7CisKKyAgICB2YXIgYWN0
aW9ucyA9IF9lbWJlclZpZXdzU3lzdGVtQWN0aW9uX21hbmFnZXIuZGVmYXVsdC5yZWdpc3RlcmVk
QWN0aW9uc1thY3Rpb25JZF07CisKKyAgICBpZiAoIWFjdGlvbnMpIHsKKyAgICAgIGFjdGlvbnMg
PSBfZW1iZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLmRlZmF1bHQucmVnaXN0ZXJlZEFjdGlv
bnNbYWN0aW9uSWRdID0gW107CisgICAgfQorCisgICAgYWN0aW9ucy5wdXNoKHsKKyAgICAgIGV2
ZW50TmFtZTogZXZlbnROYW1lLAorICAgICAgaGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50KSB7Cisg
ICAgICAgIGlmICghaXNBbGxvd2VkRXZlbnQoZXZlbnQsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LnJlYWQoYWxsb3dlZEtleXMpKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQocHJldmVudERlZmF1
bHQpICE9PSBmYWxzZSkgeworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChidWJibGVz
KSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAg
ICAgfQorCisgICAgICAgIHZhciBfbm9kZSRnZXRTdGF0ZSA9IG5vZGUuZ2V0U3RhdGUoKTsKKwor
ICAgICAgICB2YXIgdGFyZ2V0ID0gX25vZGUkZ2V0U3RhdGUudGFyZ2V0OworICAgICAgICB2YXIg
YWN0aW9uTmFtZSA9IF9ub2RlJGdldFN0YXRlLmFjdGlvbk5hbWU7CisgICAgICAgIHZhciBhY3Rp
b25BcmdzID0gX25vZGUkZ2V0U3RhdGUuYWN0aW9uQXJnczsKKworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQoZnVuY3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigpIHsKKyAgICAg
ICAgICBpZiAodHlwZW9mIGFjdGlvbk5hbWUgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAg
IGFjdGlvbk5hbWUuYXBwbHkodGFyZ2V0LCBhY3Rpb25BcmdzKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhcmdldC5zZW5kKSB7CisgICAgICAgICAg
ICB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIFthY3Rpb25OYW1lXS5jb25jYXQoYWN0aW9uQXJn
cykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnVGhlIGFjdGlvbiBcJycgKyBhY3Rpb25OYW1lICsgJ1wnIGRpZCBub3QgZXhpc3Qgb24g
JyArIHRhcmdldCwgdHlwZW9mIHRhcmdldFthY3Rpb25OYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7CisK
KyAgICAgICAgICAgIHRhcmdldFthY3Rpb25OYW1lXS5hcHBseSh0YXJnZXQsIGFjdGlvbkFyZ3Mp
OworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1
cm4gYWN0aW9uSWQ7CisgIH07CisKKyAgQWN0aW9uSGVscGVyLnVucmVnaXN0ZXJBY3Rpb24gPSBm
dW5jdGlvbiAoYWN0aW9uSWQpIHsKKyAgICBkZWxldGUgX2VtYmVyVmlld3NTeXN0ZW1BY3Rpb25f
bWFuYWdlci5kZWZhdWx0LnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklkXTsKKyAgfTsKKworICB2
YXIgTU9ESUZJRVJTID0gWydhbHQnLCAnc2hpZnQnLCAnbWV0YScsICdjdHJsJ107CisgIHZhciBQ
T0lOVEVSX0VWRU5UX1RZUEVfUkVHRVggPSAvXmNsaWNrfG1vdXNlfHRvdWNoLzsKKworICBmdW5j
dGlvbiBpc0FsbG93ZWRFdmVudChldmVudCwgYWxsb3dlZEtleXMpIHsKKyAgICBpZiAodHlwZW9m
IGFsbG93ZWRLZXlzID09PSAndW5kZWZpbmVkJykgeworICAgICAgaWYgKFBPSU5URVJfRVZFTlRf
VFlQRV9SRUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJWaWV3
c1N5c3RlbVV0aWxzLmlzU2ltcGxlQ2xpY2soZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgYWxsb3dlZEtleXMgPSAnJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWxsb3dlZEtl
eXMuaW5kZXhPZignYW55JykgPj0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgZm9yICh2YXIgaSA9IDAsIGwgPSBNT0RJRklFUlMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Cisg
ICAgICBpZiAoZXZlbnRbTU9ESUZJRVJTW2ldICsgJ0tleSddICYmIGFsbG93ZWRLZXlzLmluZGV4
T2YoTU9ESUZJRVJTW2ldKSA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91
dGluZy1odG1sYmFycy9rZXl3b3Jkcy9yZW5kZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2VtcHR5X29i
amVjdCcsICdlbWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywg
J2VtYmVyLXJ1bnRpbWUvc3lzdGVtL3N0cmluZycsICdlbWJlci1yb3V0aW5nL3N5c3RlbS9nZW5l
cmF0ZV9jb250cm9sbGVyJywgJ2VtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2Rl
LW1hbmFnZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2VtYmVyTWV0YWxFcnJv
ciwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcsIF9l
bWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVyLCBfZW1iZXJIdG1sYmFyc05vZGVN
YW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBDYWxsaW5nIGBge3tyZW5kZXJ9fWBgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgd2lsbCBp
bnNlcnQgYW5vdGhlcgorICAgIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgbmFt
ZS4gVGhlIGluc2VydGVkIHRlbXBsYXRlIHdpbGwKKyAgICBhY2Nlc3MgaXRzIHByb3BlcnRpZXMg
b24gaXRzIG93biBjb250cm9sbGVyIChyYXRoZXIgdGhhbiB0aGUgY29udHJvbGxlcgorICAgIG9m
IHRoZSBwYXJlbnQgdGVtcGxhdGUpLgorICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1l
IG5hbWUgZXhpc3RzLCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4KKyAgICBOb3Rl
OiBBIGdpdmVuIGNvbnRyb2xsZXIgbWF5IG9ubHkgYmUgdXNlZCAqb25jZSogaW4geW91ciBhcHAg
aW4gdGhpcyBtYW5uZXIuCisgICAgQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyb2xs
ZXIgd2lsbCBiZSBjcmVhdGVkIGZvciB5b3UuCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEFwcC5OYXZpZ2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKKyAgICAgIHdobzogIndvcmxkIgorICAgIH0pOworICAgIGBgYAorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAgPCEtLSBuYXZpZ2F0aW9uLmhicyAtLT4KKyAgICBIZWxsbywge3t3
aG99fS4KKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDwhLS0gYXBwbGljYXRp
b24uaGJzIC0tPgorICAgIDxoMT5NeSBncmVhdCBhcHA8L2gxPgorICAgIHt7cmVuZGVyICJuYXZp
Z2F0aW9uIn19CisgICAgYGBgCisgIAorICAgIGBgYGh0bWwKKyAgICA8aDE+TXkgZ3JlYXQgYXBw
PC9oMT4KKyAgICA8ZGl2IGNsYXNzPSdlbWJlci12aWV3Jz4KKyAgICAgIEhlbGxvLCB3b3JsZC4K
KyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgT3B0aW9uYWxseSB5b3UgbWF5IHByb3ZpZGUg
YSBzZWNvbmQgYXJndW1lbnQ6IGEgcHJvcGVydHkgcGF0aAorICAgIHRoYXQgd2lsbCBiZSBib3Vu
ZCB0byB0aGUgYG1vZGVsYCBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbGxlci4KKyAgICBJZiBhIGBt
b2RlbGAgcHJvcGVydHkgcGF0aCBpcyBzcGVjaWZpZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2Ugb2Yg
dGhlCisgICAgY29udHJvbGxlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7e3JlbmRlcn19YCBjYW4g
YmUgdXNlZCBtdWx0aXBsZSB0aW1lcworICAgIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgCisgICAg
Rm9yIGV4YW1wbGUgaWYgeW91IGhhZCB0aGlzIGBhdXRob3JgIHRlbXBsYXRlLgorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAgPGRpdiBjbGFzcz0iYXV0aG9yIj4KKyAgICAgIFdyaXR0ZW4gYnkg
e3tmaXJzdE5hbWV9fSB7e2xhc3ROYW1lfX0uCisgICAgICBUb3RhbCBQb3N0czoge3twb3N0Q291
bnR9fQorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBZb3UgY291bGQgcmVuZGVyIGl0IGlu
c2lkZSB0aGUgYHBvc3RgIHRlbXBsYXRlIHVzaW5nIHRoZSBgcmVuZGVyYCBoZWxwZXIuCisgIAor
ICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IGNsYXNzPSJwb3N0Ij4KKyAgICAgIDxoMT57e3Rp
dGxlfX08L2gxPgorICAgICAgPGRpdj57e2JvZHl9fTwvZGl2PgorICAgICAge3tyZW5kZXIgImF1
dGhvciIgYXV0aG9yfX0KKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZW5k
ZXIKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtTdHJpbmd9
IG5hbWUKKyAgICBAcGFyYW0ge09iamVjdD99IGNvbnRleHQKKyAgICBAcGFyYW0ge0hhc2h9IG9w
dGlvbnMKKyAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgd2lsbFJlbmRlcjogZnVuY3Rpb24gKHJlbmRl
ck5vZGUsIGVudikgeworICAgICAgaWYgKGVudi52aWV3Lm93bmVyVmlldy5fb3V0bGV0cykgewor
ICAgICAgICAvLyBXZSBtYWtlIHN1cmUgd2Ugd2lsbCBnZXQgZGlydGllZCB3aGVuIG91dGxldCBz
dGF0ZSBjaGFuZ2VzLgorICAgICAgICBlbnYudmlldy5vd25lclZpZXcuX291dGxldHMucHVzaChy
ZW5kZXJOb2RlKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc2V0dXBTdGF0ZTogZnVuY3Rpb24g
KHByZXZTdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgbmFtZSA9
IHBhcmFtc1swXTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBmaXJzdCBh
cmd1bWVudCBvZiB7e3JlbmRlcn19IG11c3QgYmUgcXVvdGVkLCBlLmcuIHt7cmVuZGVyICJzaWRl
YmFyIn19LicsIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyk7CisKKyAgICAgIHJldHVybiB7Cisg
ICAgICAgIHBhcmVudFZpZXc6IGVudi52aWV3LAorICAgICAgICBtYW5hZ2VyOiBwcmV2U3RhdGUu
bWFuYWdlciwKKyAgICAgICAgY29udHJvbGxlcjogcHJldlN0YXRlLmNvbnRyb2xsZXIsCisgICAg
ICAgIGNoaWxkT3V0bGV0U3RhdGU6IGNoaWxkT3V0bGV0U3RhdGUobmFtZSwgZW52KQorICAgICAg
fTsKKyAgICB9LAorCisgICAgY2hpbGRFbnY6IGZ1bmN0aW9uIChzdGF0ZSwgZW52KSB7CisgICAg
ICByZXR1cm4gZW52LmNoaWxkV2l0aE91dGxldFN0YXRlKHN0YXRlLmNoaWxkT3V0bGV0U3RhdGUp
OworICAgIH0sCisKKyAgICBpc1N0YWJsZTogZnVuY3Rpb24gKGxhc3RTdGF0ZSwgbmV4dFN0YXRl
KSB7CisgICAgICByZXR1cm4gaXNTdGFibGUobGFzdFN0YXRlLmNoaWxkT3V0bGV0U3RhdGUsIG5l
eHRTdGF0ZS5jaGlsZE91dGxldFN0YXRlKTsKKyAgICB9LAorCisgICAgaXNFbXB0eTogZnVuY3Rp
b24gKHN0YXRlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIHJlbmRlcjog
ZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBzdGF0ZSA9IG5vZGUuZ2V0U3RhdGUoKTsKKyAgICAg
IHZhciBuYW1lID0gcGFyYW1zWzBdOworICAgICAgdmFyIGNvbnRleHQgPSBwYXJhbXNbMV07CisK
KyAgICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKworICAgICAgLy8gVGhlIHJlbmRlciBrZXl3
b3JkIHByZXN1bWVzIGl0IGNhbiB3b3JrIHdpdGhvdXQgYSByb3V0ZXIuIFRoaXMgaXMgcmVhbGx5
CisgICAgICAvLyBvbmx5IHRvIHNhdGlzZnkgdGhlIHRlc3Q6CisgICAgICAvLworICAgICAgLy8g
ICAgIHt7dmlld319IHNob3VsZCBub3Qgb3ZlcnJpZGUgY2xhc3MgYmluZGluZ3MgZGVmaW5lZCBv
biBhIGNoaWxkIHZpZXciCisgICAgICAvLworICAgICAgdmFyIHJvdXRlciA9IG93bmVyLmxvb2t1
cCgncm91dGVyOm1haW4nKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBz
ZWNvbmQgYXJndW1lbnQgb2Yge3tyZW5kZXJ9fSBtdXN0IGJlIGEgcGF0aCwgZS5nLiB7e3JlbmRl
ciAicG9zdCIgcG9zdH19LicsIHBhcmFtcy5sZW5ndGggPCAyIHx8IF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLmlzU3RyZWFtKHBhcmFtc1sxXSkpOworCisgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9
PT0gMSkgeworICAgICAgICAvLyB1c2UgdGhlIHNpbmdsZXRvbiBjb250cm9sbGVyCisgICAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2FuIG9ubHkgdXNlIHRoZSB7e3JlbmRlcn19
IGhlbHBlciBvbmNlIHdpdGhvdXQgYSBtb2RlbCBvYmplY3QgYXMgJyArICdpdHMgc2Vjb25kIGFy
Z3VtZW50LCBhcyBpbiB7e3JlbmRlciAicG9zdCIgcG9zdH19LicsICFyb3V0ZXIgfHwgIXJvdXRl
ci5fbG9va3VwQWN0aXZlQ29tcG9uZW50Tm9kZShuYW1lKSk7CisgICAgICB9IGVsc2UgaWYgKHBh
cmFtcy5sZW5ndGggIT09IDIpIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3Iu
ZGVmYXVsdCgnWW91IG11c3QgcGFzcyBhIHRlbXBsYXRlTmFtZSB0byByZW5kZXInKTsKKyAgICAg
IH0KKworICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9ICd0ZW1wbGF0ZTonICsgbmFtZTsKKyAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdXNlZCBge3tyZW5kZXIgXCcnICsgbmFtZSAr
ICdcJ319YCwgYnV0IFwnJyArIG5hbWUgKyAnXCcgY2FuIG5vdCBiZSAnICsgJ2ZvdW5kIGFzIGVp
dGhlciBhIHRlbXBsYXRlIG9yIGEgdmlldy4nLCBvd25lci5oYXNSZWdpc3RyYXRpb24oJ3ZpZXc6
JyArIG5hbWUpIHx8IG93bmVyLmhhc1JlZ2lzdHJhdGlvbih0ZW1wbGF0ZU5hbWUpIHx8ICEhdGVt
cGxhdGUpOworCisgICAgICB2YXIgdmlldyA9IG93bmVyLmxvb2t1cCgndmlldzonICsgbmFtZSk7
CisgICAgICBpZiAoIXZpZXcpIHsKKyAgICAgICAgdmlldyA9IG93bmVyLmxvb2t1cCgndmlldzpk
ZWZhdWx0Jyk7CisgICAgICB9CisgICAgICB2YXIgdmlld0hhc1RlbXBsYXRlU3BlY2lmaWVkID0g
dmlldyAmJiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAndGVtcGxhdGUnKTsK
KyAgICAgIGlmICghdGVtcGxhdGUgJiYgIXZpZXdIYXNUZW1wbGF0ZVNwZWNpZmllZCkgeworICAg
ICAgICB0ZW1wbGF0ZSA9IG93bmVyLmxvb2t1cCh0ZW1wbGF0ZU5hbWUpOworICAgICAgfQorCisg
ICAgICBpZiAodmlldykgeworICAgICAgICB2aWV3Lm93bmVyVmlldyA9IGVudi52aWV3Lm93bmVy
VmlldzsKKyAgICAgIH0KKworICAgICAgLy8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCisg
ICAgICB2YXIgY29udHJvbGxlck5hbWU7CisgICAgICB2YXIgY29udHJvbGxlckZ1bGxOYW1lOwor
CisgICAgICBpZiAoaGFzaC5jb250cm9sbGVyKSB7CisgICAgICAgIGNvbnRyb2xsZXJOYW1lID0g
aGFzaC5jb250cm9sbGVyOworICAgICAgICBjb250cm9sbGVyRnVsbE5hbWUgPSAnY29udHJvbGxl
cjonICsgY29udHJvbGxlck5hbWU7CisgICAgICAgIGRlbGV0ZSBoYXNoLmNvbnRyb2xsZXI7CisK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBjb250cm9sbGVyIG5hbWUgeW91
IHN1cHBsaWVkIFwnJyArIGNvbnRyb2xsZXJOYW1lICsgJ1wnICcgKyAnZGlkIG5vdCByZXNvbHZl
IHRvIGEgY29udHJvbGxlci4nLCBvd25lci5oYXNSZWdpc3RyYXRpb24oY29udHJvbGxlckZ1bGxO
YW1lKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250cm9sbGVyTmFtZSA9IG5hbWU7Cisg
ICAgICAgIGNvbnRyb2xsZXJGdWxsTmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFt
ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHRhcmdldCA9IHJvdXRlcjsKKyAgICAgIHZhciBjb250
cm9sbGVyOworCisgICAgICAvLyBjaG9vc2UgbmFtZQorICAgICAgaWYgKHBhcmFtcy5sZW5ndGgg
PiAxKSB7CisgICAgICAgIHZhciBmYWN0b3J5ID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoY29udHJv
bGxlckZ1bGxOYW1lKSB8fCBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5n
ZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSk7CisKKyAgICAg
ICAgY29udHJvbGxlciA9IGZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgICBtb2RlbDogX2VtYmVy
TWV0YWxTdHJlYW1zVXRpbHMucmVhZChjb250ZXh0KSwKKyAgICAgICAgICB0YXJnZXQ6IHRhcmdl
dAorICAgICAgICB9KTsKKworICAgICAgICBub2RlLmFkZERlc3RydWN0aW9uKGNvbnRyb2xsZXIp
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udHJvbGxlciA9IG93bmVyLmxvb2t1cChjb250
cm9sbGVyRnVsbE5hbWUpIHx8IF9lbWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVy
LmRlZmF1bHQob3duZXIsIGNvbnRyb2xsZXJOYW1lKTsKKworICAgICAgICBjb250cm9sbGVyLnNl
dFByb3BlcnRpZXMoeworICAgICAgICAgIHRhcmdldDogdGFyZ2V0CisgICAgICAgIH0pOworICAg
ICAgfQorCisgICAgICBpZiAodmlldykgeworICAgICAgICB2aWV3LnNldCgnY29udHJvbGxlcics
IGNvbnRyb2xsZXIpOworICAgICAgfQorICAgICAgc3RhdGUuY29udHJvbGxlciA9IGNvbnRyb2xs
ZXI7CisKKyAgICAgIGhhc2gudmlld05hbWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmNh
bWVsaXplKG5hbWUpOworCisgICAgICBpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUucmF3KSB7Cisg
ICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmF3OworICAgICAgfQorCisgICAgICB2YXIgb3B0
aW9ucyA9IHsKKyAgICAgICAgbGF5b3V0OiBudWxsLAorICAgICAgICBzZWxmOiBjb250cm9sbGVy
CisgICAgICB9OworCisgICAgICBpZiAodmlldykgeworICAgICAgICBvcHRpb25zLmNvbXBvbmVu
dCA9IHZpZXc7CisgICAgICB9CisKKyAgICAgIHZhciBub2RlTWFuYWdlciA9IF9lbWJlckh0bWxi
YXJzTm9kZU1hbmFnZXJzVmlld05vZGVNYW5hZ2VyLmRlZmF1bHQuY3JlYXRlKG5vZGUsIGVudiwg
aGFzaCwgb3B0aW9ucywgc3RhdGUucGFyZW50VmlldywgbnVsbCwgbnVsbCwgdGVtcGxhdGUpOwor
ICAgICAgc3RhdGUubWFuYWdlciA9IG5vZGVNYW5hZ2VyOworCisgICAgICBpZiAocm91dGVyICYm
IHBhcmFtcy5sZW5ndGggPT09IDEpIHsKKyAgICAgICAgcm91dGVyLl9jb25uZWN0QWN0aXZlQ29t
cG9uZW50Tm9kZShuYW1lLCBub2RlTWFuYWdlcik7CisgICAgICB9CisKKyAgICAgIG5vZGVNYW5h
Z2VyLnJlbmRlcihlbnYsIGhhc2gsIHZpc2l0b3IpOworICAgIH0sCisKKyAgICByZXJlbmRlcjog
ZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkgeworICAgICAgICB2
YXIgbW9kZWwgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHBhcmFtc1sxXSk7CisgICAg
ICAgIG5vZGUuZ2V0U3RhdGUoKS5jb250cm9sbGVyLnNldCgnbW9kZWwnLCBtb2RlbCk7CisgICAg
ICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGNoaWxkT3V0bGV0U3RhdGUobmFtZSwgZW52
KSB7CisgICAgdmFyIHRvcExldmVsID0gZW52LnZpZXcub3duZXJWaWV3OworICAgIGlmICghdG9w
TGV2ZWwgfHwgIXRvcExldmVsLm91dGxldFN0YXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQor
CisgICAgdmFyIG91dGxldFN0YXRlID0gdG9wTGV2ZWwub3V0bGV0U3RhdGU7CisgICAgaWYgKCFv
dXRsZXRTdGF0ZS5tYWluKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHNlbGVj
dGVkT3V0bGV0U3RhdGUgPSBvdXRsZXRTdGF0ZS5tYWluLm91dGxldHNbJ19fZW1iZXJfb3JwaGFu
c19fJ107CisgICAgaWYgKCFzZWxlY3RlZE91dGxldFN0YXRlKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorICAgIHZhciBtYXRjaGVkID0gc2VsZWN0ZWRPdXRsZXRTdGF0ZS5vdXRsZXRzW25hbWVd
OworICAgIGlmIChtYXRjaGVkKSB7CisgICAgICB2YXIgY2hpbGRTdGF0ZSA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgICBjaGlsZFN0YXRlW21hdGNoZWQucmVu
ZGVyLm91dGxldF0gPSBtYXRjaGVkOworICAgICAgbWF0Y2hlZC53YXNVc2VkID0gdHJ1ZTsKKyAg
ICAgIHJldHVybiBjaGlsZFN0YXRlOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGlzU3RhYmxl
KGEsIGIpIHsKKyAgICBpZiAoIWEgJiYgIWIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICBpZiAoIWEgfHwgIWIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9y
ICh2YXIgb3V0bGV0TmFtZSBpbiBhKSB7CisgICAgICBpZiAoIWlzU3RhYmxlT3V0bGV0KGFbb3V0
bGV0TmFtZV0sIGJbb3V0bGV0TmFtZV0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBpc1N0YWJsZU91
dGxldChhLCBiKSB7CisgICAgaWYgKCFhICYmICFiKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgaWYgKCFhIHx8ICFiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGEgPSBhLnJlbmRlcjsKKyAgICBiID0gYi5yZW5kZXI7CisgICAgZm9yICh2YXIga2V5IGluIGEp
IHsKKyAgICAgIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgLy8gbmFtZSBp
cyBvbmx5IGhlcmUgZm9yIGxvZ2dpbmcgJiBkZWJ1Z2dpbmcuIElmIHR3byBkaWZmZXJlbnQKKyAg
ICAgICAgLy8gbmFtZXMgcmVzdWx0IGluIG90aGVyd2lzZSBpZGVudGljYWwgc3RhdGVzLCB0aGV5
J3JlIHN0aWxsCisgICAgICAgIC8vIGlkZW50aWNhbC4KKyAgICAgICAgaWYgKGFba2V5XSAhPT0g
YltrZXldICYmIGtleSAhPT0gJ25hbWUnKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItcm91dGluZy12aWV3cy9jb21wb25lbnRzL2xpbmstdG8nLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9jb21wdXRl
ZCcsICdlbWJlci1tZXRhbC9jb21wdXRlZF9tYWNyb3MnLCAnZW1iZXItdmlld3Mvc3lzdGVtL3V0
aWxzJywgJ2VtYmVyLXZpZXdzL2NvbXBvbmVudHMvY29tcG9uZW50JywgJ2VtYmVyLXJ1bnRpbWUv
aW5qZWN0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL3NlcnZpY2UnLCAnZW1iZXItcnVudGltZS9t
aXhpbnMvY29udHJvbGxlcicsICdlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL2NvbXBvbmVu
dC1ub2RlLW1hbmFnZXInLCAnZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVzL2xpbmstdG8nLCAncmVx
dWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcywgX2VtYmVyTWV0
YWxMb2dnZXIsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3JvcywgX2VtYmVyVmlld3NT
eXN0ZW1VdGlscywgX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1iZXJSdW50aW1l
SW5qZWN0LCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyUnVudGltZU1peGluc0Nv
bnRyb2xsZXIsIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIs
IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVzTGlua1RvLCBfcmVxdWlyZSkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgor
ICAgIFRoZSBge3tsaW5rLXRvfX1gIGNvbXBvbmVudCByZW5kZXJzIGEgbGluayB0byB0aGUgc3Vw
cGxpZWQKKyAgICBgcm91dGVOYW1lYCBwYXNzaW5nIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgbW9k
ZWwgdG8gdGhlCisgICAgcm91dGUgYXMgaXRzIGBtb2RlbGAgY29udGV4dCBvZiB0aGUgcm91dGUu
IFRoZSBibG9jaworICAgIGZvciBge3tsaW5rLXRvfX1gIGJlY29tZXMgdGhlIGlubmVySFRNTCBv
ZiB0aGUgcmVuZGVyZWQKKyAgICBlbGVtZW50OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3sjbGluay10byAncGhvdG9HYWxsZXJ5J319CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3Rvcwor
ICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBZb3UgY2FuIGFsc28gdXNlIGFuIGlu
bGluZSBmb3JtIG9mIGB7e2xpbmstdG99fWAgY29tcG9uZW50IGJ5CisgICAgcGFzc2luZyB0aGUg
bGluayB0ZXh0IGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICAgIHRvIHRoZSBjb21wb25lbnQ6Cisg
IAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2xpbmstdG8gJ0dyZWF0IEhhbXN0ZXIgUGhvdG9z
JyAncGhvdG9HYWxsZXJ5J319CisgICAgYGBgCisgIAorICAgIEJvdGggd2lsbCByZXN1bHQgaW46
CisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MiPgorICAgICAg
R3JlYXQgSGFtc3RlciBQaG90b3MKKyAgICA8L2E+CisgICAgYGBgCisgIAorICAgICMjIyBTdXBw
bHlpbmcgYSB0YWdOYW1lCisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIHJlbmRlcnMgYW4g
YDxhPmAgZWxlbWVudC4gVGhpcyBjYW4KKyAgICBiZSBvdmVycmlkZGVuIGZvciBhIHNpbmdsZSB1
c2Ugb2YgYHt7bGluay10b319YCBieSBzdXBwbHlpbmcKKyAgICBhIGB0YWdOYW1lYCBvcHRpb246
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIHRh
Z05hbWU9ImxpIn19CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcworICAgIHt7L2xpbmstdG99
fQorICAgIGBgYAorICAKKyAgICBgYGBodG1sCisgICAgPGxpPgorICAgICAgR3JlYXQgSGFtc3Rl
ciBQaG90b3MKKyAgICA8L2xpPgorICAgIGBgYAorICAKKyAgICBUbyBvdmVycmlkZSB0aGlzIG9w
dGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIHNlZQorICAgICJPdmVycmlkaW5nIEFw
cGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgorICAKKyAgICAjIyMgRGlzYWJsaW5nIHRoZSBgbGlu
ay10b2AgY29tcG9uZW50CisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIGlzIGVuYWJsZWQu
CisgICAgYW55IHBhc3NlZCB2YWx1ZSB0byB0aGUgYGRpc2FibGVkYCBjb21wb25lbnQgcHJvcGVy
dHkgd2lsbCBkaXNhYmxlCisgICAgdGhlIGBsaW5rLXRvYCBjb21wb25lbnQuCisgIAorICAgIHN0
YXRpYyB1c2U6IHRoZSBgZGlzYWJsZWRgIG9wdGlvbjoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWQ9dHJ1ZX19CisgICAgICBHcmVh
dCBIYW1zdGVyIFBob3RvcworICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBkeW5h
bWljIHVzZTogdGhlIGBkaXNhYmxlZFdoZW5gIG9wdGlvbjoKKyAgCisgICAgYGBgaGFuZGxlYmFy
cworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWRXaGVuPWNvbnRyb2xsZXIu
c29tZVByb3BlcnR5fX0KKyAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAge3svbGluay10
b319CisgICAgYGBgCisgIAorICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2FibGVkYCB3aWxs
IGRpc2FibGUgaXQgZXhjZXB0IGB1bmRlZmluZWRgLgorICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkg
YHRydWVgIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBjb21wb25lbnQgeW91IGNhbgorICAgIG92ZXJy
aWRlIHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBFbWJlci5MaW5rQ29tcG9uZW50YC4KKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLkxpbmtDb21wb25lbnQucmVvcGVuKHsKKyAgICAg
IGRpc2FibGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAg
IGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdGhpcy5zZXQoJ19pc0Rpc2Fi
bGVkJywgdmFsdWUgPT09IHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZSA9
PT0gdHJ1ZSA/IGdldCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7CisgICAgICB9KQor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBzZWUgIk92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lk
ZSBEZWZhdWx0cyIgZm9yIG1vcmUuCisgIAorICAgICMjIyBIYW5kbGluZyBgaHJlZmAKKyAgICBg
e3tsaW5rLXRvfX1gIHdpbGwgdXNlIHlvdXIgYXBwbGljYXRpb24ncyBSb3V0ZXIgdG8KKyAgICBm
aWxsIHRoZSBlbGVtZW50J3MgYGhyZWZgIHByb3BlcnR5IHdpdGggYSB1cmwgdGhhdAorICAgIG1h
dGNoZXMgdGhlIHBhdGggdG8gdGhlIHN1cHBsaWVkIGByb3V0ZU5hbWVgIGZvciB5b3VyCisgICAg
cm91dGVyJ3MgY29uZmlndXJlZCBgTG9jYXRpb25gIHNjaGVtZSwgd2hpY2ggZGVmYXVsdHMKKyAg
ICB0byBFbWJlci5IYXNoTG9jYXRpb24uCisgIAorICAgICMjIyBIYW5kbGluZyBjdXJyZW50IHJv
dXRlCisgICAgYHt7bGluay10b319YCB3aWxsIGFwcGx5IGEgQ1NTIGNsYXNzIG5hbWUgb2YgJ2Fj
dGl2ZScKKyAgICB3aGVuIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgbWF0Y2hlcwor
ICAgIHRoZSBzdXBwbGllZCByb3V0ZU5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRp
b24ncworICAgIGN1cnJlbnQgcm91dGUgaXMgJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIHRoZSBmb2xs
b3dpbmcKKyAgICB1c2Ugb2YgYHt7bGluay10b319YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnfX0KKyAgICAgIEdyZWF0IEhhbXN0
ZXIgUGhvdG9zCisgICAge3svbGluay10b319CisgICAgYGBgCisgIAorICAgIHdpbGwgcmVzdWx0
IGluCisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MvdGhpcy13
ZWVrIiBjbGFzcz0iYWN0aXZlIj4KKyAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAgPC9h
PgorICAgIGBgYAorICAKKyAgICBUaGUgQ1NTIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIGNs
YXNzZXMgY2FuIGJlIGN1c3RvbWl6ZWQKKyAgICBmb3IgYSBzaW5nbGUgdXNlIG9mIGB7e2xpbmst
dG99fWAgYnkgcGFzc2luZyBhbiBgYWN0aXZlQ2xhc3NgCisgICAgb3B0aW9uOgorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LnJlY2VudCcgYWN0aXZl
Q2xhc3M9ImN1cnJlbnQtdXJsIn19CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcworICAgIHt7
L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBgYGBodG1sCisgICAgPGEgaHJlZj0iL2hhbXN0
ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KKyAgICAgIEdyZWF0IEhh
bXN0ZXIgUGhvdG9zCisgICAgPC9hPgorICAgIGBgYAorICAKKyAgICBUbyBvdmVycmlkZSB0aGlz
IG9wdGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIHNlZQorICAgICJPdmVycmlkaW5n
IEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgorICAKKyAgICAjIyMgS2VlcGluZyBhIGxpbmsg
YWN0aXZlIGZvciBvdGhlciByb3V0ZXMKKyAgCisgICAgSWYgeW91IG5lZWQgYSBsaW5rIHRvIGJl
ICdhY3RpdmUnIGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1hdGNoCisgICAgdGhlIGN1cnJlbnQgcm91
dGUsIHlvdSBjYW4gdXNlIHRoZSBgY3VycmVudC13aGVuYCBhcmd1bWVudC4KKyAgCisgICAgYGBg
aGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgY3VycmVudC13aGVuPSdw
aG90b3MnfX0KKyAgICAgIFBob3RvIEdhbGxlcnkKKyAgICB7ey9saW5rLXRvfX0KKyAgICBgYGAK
KyAgCisgICAgVGhpcyBtYXkgYmUgaGVscGZ1bCBmb3Iga2VlcGluZyBsaW5rcyBhY3RpdmUgZm9y
OgorICAKKyAgICAqIG5vbi1uZXN0ZWQgcm91dGVzIHRoYXQgYXJlIGxvZ2ljYWxseSByZWxhdGVk
CisgICAgKiBzb21lIHNlY29uZGFyeSBtZW51IGFwcHJvYWNoZXMKKyAgICAqICd0b3AgbmF2aWdh
dGlvbicgd2l0aCAnc3ViIG5hdmlnYXRpb24nIHNjZW5hcmlvcworICAKKyAgICBBIGxpbmsgd2ls
bCBiZSBhY3RpdmUgaWYgYGN1cnJlbnQtd2hlbmAgaXMgYHRydWVgIG9yIHRoZSBjdXJyZW50Cisg
ICAgcm91dGUgaXMgdGhlIHJvdXRlIHRoaXMgbGluayB3b3VsZCB0cmFuc2l0aW9uIHRvLgorICAK
KyAgICBUbyBtYXRjaCBtdWx0aXBsZSByb3V0ZXMgJ3NwYWNlLXNlcGFyYXRlJyB0aGUgcm91dGVz
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAnZ2FsbGVyeScgY3VycmVu
dC13aGVuPSdwaG90b3MgZHJhd2luZ3MgcGFpbnRpbmdzJ319CisgICAgICBBcnQgR2FsbGVyeQor
ICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICAjIyMgU3VwcGx5aW5nIGEgbW9kZWwK
KyAgICBBbiBvcHRpb25hbCBtb2RlbCBhcmd1bWVudCBjYW4gYmUgdXNlZCBmb3Igcm91dGVzIHdo
b3NlCisgICAgcGF0aHMgY29udGFpbiBkeW5hbWljIHNlZ21lbnRzLiBUaGlzIGFyZ3VtZW50IHdp
bGwgYmVjb21lCisgICAgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtlZCByb3V0ZToKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIFJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0
aGlzLnJvdXRlKCJwaG90b0dhbGxlcnkiLCB7cGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19p
ZCJ9KTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xp
bmstdG8gJ3Bob3RvR2FsbGVyeScgYVBob3RvfX0KKyAgICAgIHt7YVBob3RvLnRpdGxlfX0KKyAg
ICB7ey9saW5rLXRvfX0KKyAgICBgYGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9o
YW1zdGVyLXBob3Rvcy80MiI+CisgICAgICBUb21zdGVyCisgICAgPC9hPgorICAgIGBgYAorICAK
KyAgICAjIyMgU3VwcGx5aW5nIG11bHRpcGxlIG1vZGVscworICAgIEZvciBkZWVwLWxpbmtpbmcg
dG8gcm91dGUgcGF0aHMgdGhhdCBjb250YWluIG11bHRpcGxlCisgICAgZHluYW1pYyBzZWdtZW50
cywgbXVsdGlwbGUgbW9kZWwgYXJndW1lbnRzIGNhbiBiZSB1c2VkLgorICAgIEFzIHRoZSByb3V0
ZXIgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgcm91dGUgcGF0aCwgZWFjaAorICAgIHN1cHBsaWVk
IG1vZGVsIGFyZ3VtZW50IHdpbGwgYmVjb21lIHRoZSBjb250ZXh0IGZvciB0aGUKKyAgICByb3V0
ZSB3aXRoIHRoZSBkeW5hbWljIHNlZ21lbnRzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoInBob3RvR2FsbGVyeSIs
IHsgcGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19pZCIgfSwgZnVuY3Rpb24oKSB7CisgICAg
ICAgIHRoaXMucm91dGUoImNvbW1lbnQiLCB7cGF0aDogImNvbW1lbnRzLzpjb21tZW50X2lkIn0p
OworICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgICAgVGhpcyBhcmd1bWVudCB3aWxsIGJl
Y29tZSB0aGUgbW9kZWwgY29udGV4dCBvZiB0aGUgbGlua2VkIHJvdXRlOgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LmNvbW1lbnQnIGFQaG90byBj
b21tZW50fX0KKyAgICAgIHt7Y29tbWVudC5ib2R5fX0KKyAgICB7ey9saW5rLXRvfX0KKyAgICBg
YGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9jb21t
ZW50cy83MTgiPgorICAgICAgQSsrKyB3b3VsZCBzbnVnZ2xlIGFnYWluLgorICAgIDwvYT4KKyAg
ICBgYGAKKyAgCisgICAgIyMjIFN1cHBseWluZyBhbiBleHBsaWNpdCBkeW5hbWljIHNlZ21lbnQg
dmFsdWUKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIG1vZGVsIG9iamVjdCBhdmFpbGFibGUgdG8g
cGFzcyB0byBge3tsaW5rLXRvfX1gLAorICAgIGFuIG9wdGlvbmFsIHN0cmluZyBvciBpbnRlZ2Vy
IGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgZm9yIHJvdXRlcyB3aG9zZQorICAgIHBhdGhzIGNvbnRh
aW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgdmFsdWUK
KyAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoInBob3RvR2FsbGVyeSIs
IHsgcGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19pZCIgfSk7CisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQ
aG90b0lkfX0KKyAgICAgIHt7YVBob3RvLnRpdGxlfX0KKyAgICB7ey9saW5rLXRvfX0KKyAgICBg
YGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80MiI+Cisg
ICAgICBUb21zdGVyCisgICAgPC9hPgorICAgIGBgYAorICAKKyAgICBXaGVuIHRyYW5zaXRpb25p
bmcgaW50byB0aGUgbGlua2VkIHJvdXRlLCB0aGUgYG1vZGVsYCBob29rIHdpbGwKKyAgICBiZSB0
cmlnZ2VyZWQgd2l0aCBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVy
LgorICAKKyAgICAjIyMgQWxsb3dpbmcgRGVmYXVsdCBBY3Rpb24KKyAgCisgICBCeSBkZWZhdWx0
IHRoZSBge3tsaW5rLXRvfX1gIGNvbXBvbmVudCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBicm93c2Vy
IGFjdGlvbgorICAgYnkgY2FsbGluZyBgcHJldmVudERlZmF1bHQoKWAgYXMgdGhpcyBzb3J0IG9m
IGFjdGlvbiBidWJibGluZyBpcyBub3JtYWxseQorICAgaGFuZGxlZCBpbnRlcm5hbGx5IGFuZCB3
ZSBkbyBub3Qgd2FudCB0byB0YWtlIHRoZSBicm93c2VyIHRvIGEgbmV3IFVSTCAoZm9yCisgICBl
eGFtcGxlKS4KKyAgCisgICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHNw
ZWNpZnkgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBpbgorICAgeW91ciB0ZW1wbGF0ZToKKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgYVBob3RvSWQg
cHJldmVudERlZmF1bHQ9ZmFsc2V9fQorICAgICAge3thUGhvdG9JZC50aXRsZX19CisgICAge3sv
bGluay10b319CisgICAgYGBgCisgIAorICAgICMjIyBPdmVycmlkaW5nIGF0dHJpYnV0ZXMKKyAg
ICBZb3UgY2FuIG92ZXJyaWRlIGFueSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgYEVtYmVyLkxpbmtD
b21wb25lbnRgCisgICAgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGB7e2xpbmstdG99fWAgY29t
cG9uZW50IGJ5IHBhc3NpbmcKKyAgICBrZXkvdmFsdWUgcGFpcnMsIGxpa2Ugc286CisgIAorICAg
IGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICBhUGhvdG8gdGFnTmFtZT0nbGknIHRpdGxl
PSdGb2xsb3dpbmcgdGhpcyBsaW5rIHdpbGwgY2hhbmdlIHlvdXIgbGlmZScgY2xhc3NOYW1lcz0n
cGljIHN3ZWV0J319CisgICAgICBVaC1tYXppbmchCisgICAge3svbGluay10b319CisgICAgYGBg
CisgIAorICAgIFNlZSBbRW1iZXIuTGlua0NvbXBvbmVudF0oL2FwaS9jbGFzc2VzL0VtYmVyLkxp
bmtDb21wb25lbnQuaHRtbCkgZm9yIGEKKyAgICBjb21wbGV0ZSBsaXN0IG9mIG92ZXJyaWRlYWJs
ZSBwcm9wZXJ0aWVzLiBCZSBzdXJlIHRvIGFsc28KKyAgICBjaGVjayBvdXQgaW5oZXJpdGVkIHBy
b3BlcnRpZXMgb2YgYExpbmtDb21wb25lbnRgLgorICAKKyAgICAjIyMgT3ZlcnJpZGluZyBBcHBs
aWNhdGlvbi13aWRlIERlZmF1bHRzCisgICAgYGB7e2xpbmstdG99fWBgIGNyZWF0ZXMgYW4gaW5z
dGFuY2Ugb2YgYEVtYmVyLkxpbmtDb21wb25lbnRgCisgICAgZm9yIHJlbmRlcmluZy4gVG8gb3Zl
cnJpZGUgb3B0aW9ucyBmb3IgeW91ciBlbnRpcmUKKyAgICBhcHBsaWNhdGlvbiwgcmVvcGVuIGBF
bWJlci5MaW5rQ29tcG9uZW50YCBhbmQgc3VwcGx5IHRoZQorICAgIGRlc2lyZWQgdmFsdWVzOgor
ICAKKyAgICBgYGAgamF2YXNjcmlwdAorICAgIEVtYmVyLkxpbmtDb21wb25lbnQucmVvcGVuKHsK
KyAgICAgIGFjdGl2ZUNsYXNzOiAiaXMtYWN0aXZlIiwKKyAgICAgIHRhZ05hbWU6ICdsaScKKyAg
ICB9KQorICAgIGBgYAorICAKKyAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRo
ZSBkZWZhdWx0IGV2ZW50IGluCisgICAgdGhpcyBtYW5uZXI6CisgIAorICAgIGBgYCBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuTGlua0NvbXBvbmVudC5yZW9wZW4oeworICAgICAgZXZlbnROYW1lOiAn
Y3VzdG9tRXZlbnROYW1lJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxpbmst
dG8KKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtTdHJpbmd9
IHJvdXRlTmFtZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0qCisgICAgQHBhcmFtIFtv
cHRpb25zXSB7T2JqZWN0fSBIYW5kbGViYXJzIGtleS92YWx1ZSBwYWlycyBvZiBvcHRpb25zLCB5
b3UgY2FuIG92ZXJyaWRlIGFueSBwcm9wZXJ0eSBvZiBFbWJlci5MaW5rQ29tcG9uZW50CisgICAg
QHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZworICAgIEBzZWUge0VtYmVyLkxpbmtDb21wb25l
bnR9CisgICAgQHB1YmxpYworICAqLworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItcm91dGluZy12aWV3cworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICB2
YXIgbGF5b3V0ID0gX2VtYmVySHRtbGJhcnNUZW1wbGF0ZXNMaW5rVG8uZGVmYXVsdDsKKworICAv
KioKKyAgICBgRW1iZXIuTGlua0NvbXBvbmVudGAgcmVuZGVycyBhbiBlbGVtZW50IHdob3NlIGBj
bGlja2AgZXZlbnQgdHJpZ2dlcnMgYQorICAgIHRyYW5zaXRpb24gb2YgdGhlIGFwcGxpY2F0aW9u
J3MgaW5zdGFuY2Ugb2YgYEVtYmVyLlJvdXRlcmAgdG8KKyAgICBhIHN1cHBsaWVkIHJvdXRlIGJ5
IG5hbWUuCisgIAorICAgIGBFbWJlci5MaW5rQ29tcG9uZW50YCBjb21wb25lbnRzIGFyZSBpbnZv
a2VkIHdpdGgge3sjbGluay10b319LiBQcm9wZXJ0aWVzCisgICAgb2YgdGhpcyBjbGFzcyBjYW4g
YmUgb3ZlcnJpZGRlbiB3aXRoIGByZW9wZW5gIHRvIGN1c3RvbWl6ZSBhcHBsaWNhdGlvbi13aWRl
CisgICAgYmVoYXZpb3IuCisgIAorICAgIEBjbGFzcyBMaW5rQ29tcG9uZW50CisgICAgQG5hbWVz
cGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEBzZWUge0VtYmVy
LlRlbXBsYXRlcy5oZWxwZXJzLmxpbmstdG99CisgICAgQHByaXZhdGUKKyAgKiovCisgIHZhciBM
aW5rQ29tcG9uZW50ID0gX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LmRlZmF1bHQuZXh0
ZW5kKHsKKyAgICBsYXlvdXQ6IGxheW91dCwKKworICAgIHRhZ05hbWU6ICdhJywKKworICAgIC8q
KgorICAgICAgQGRlcHJlY2F0ZWQgVXNlIGN1cnJlbnQtd2hlbiBpbnN0ZWFkLgorICAgICAgQHBy
b3BlcnR5IGN1cnJlbnRXaGVuCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY3VycmVudFdo
ZW46IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmRlcHJlY2F0aW5nQWxpYXMoJ2N1cnJlbnQt
d2hlbicsIHsgaWQ6ICdlbWJlci1yb3V0aW5nLXZpZXcuZGVwcmVjYXRlZC1jdXJyZW50LXdoZW4n
LCB1bnRpbDogJzMuMC4wJyB9KSwKKworICAgIC8qKgorICAgICAgVXNlZCB0byBkZXRlcm1pbmUg
d2hlbiB0aGlzIGBMaW5rQ29tcG9uZW50YCBpcyBhY3RpdmUuCisgICAgICAgQHByb3BlcnR5IGN1
cnJlbnRXaGVuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICAnY3VycmVudC13aGVuJzogbnVs
bCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRpdGxlYCBhdHRyaWJ1dGUgb2YgdGhlIGBM
aW5rQ29tcG9uZW50YCdzIEhUTUwgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkgdGl0bGUKKyAg
ICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqKi8KKyAgICB0aXRsZTogbnVs
bCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHJlbGAgYXR0cmlidXRlIG9mIHRoZSBgTGlu
a0NvbXBvbmVudGAncyBIVE1MIGVsZW1lbnQuCisgICAgICAgQHByb3BlcnR5IHJlbAorICAgICAg
QGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICoqLworICAgIHJlbDogbnVsbCwKKwor
ICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUgb2YgdGhlIGBMaW5r
Q29tcG9uZW50YCdzIEhUTUwgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkgdGFiaW5kZXgKKyAg
ICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqKi8KKyAgICB0YWJpbmRleDog
bnVsbCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRhcmdldGAgYXR0cmlidXRlIG9mIHRo
ZSBgTGlua0NvbXBvbmVudGAncyBIVE1MIGVsZW1lbnQuCisgICAgICAgQHNpbmNlIDEuOC4wCisg
ICAgICBAcHJvcGVydHkgdGFyZ2V0CisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGlj
CisgICAgKiovCisgICAgdGFyZ2V0OiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgQ1NTIGNs
YXNzIHRvIGFwcGx5IHRvIGBMaW5rQ29tcG9uZW50YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGFjdGl2
ZWAKKyAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KKyAgICAgICBAcHJvcGVydHkgYWN0aXZlQ2xh
c3MKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgYWN0aXZlCisgICAgICBAcHJp
dmF0ZQorICAgICoqLworICAgIGFjdGl2ZUNsYXNzOiAnYWN0aXZlJywKKworICAgIC8qKgorICAg
ICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBgTGlua0NvbXBvbmVudGAncyBlbGVtZW50IHdo
ZW4gaXRzIGBsb2FkaW5nYAorICAgICAgcHJvcGVydHkgaXMgYHRydWVgLgorICAgICAgIEBwcm9w
ZXJ0eSBsb2FkaW5nQ2xhc3MKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgbG9h
ZGluZworICAgICAgQHByaXZhdGUKKyAgICAqKi8KKyAgICBsb2FkaW5nQ2xhc3M6ICdsb2FkaW5n
JywKKworICAgIC8qKgorICAgICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBhIGBMaW5rQ29t
cG9uZW50YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGRpc2FibGVkYAorICAgICAgcHJvcGVydHkgaXMg
YHRydWVgLgorICAgICAgIEBwcm9wZXJ0eSBkaXNhYmxlZENsYXNzCisgICAgICBAdHlwZSBTdHJp
bmcKKyAgICAgIEBkZWZhdWx0IGRpc2FibGVkCisgICAgICBAcHJpdmF0ZQorICAgICoqLworICAg
IGRpc2FibGVkQ2xhc3M6ICdkaXNhYmxlZCcsCisgICAgX2lzRGlzYWJsZWQ6IGZhbHNlLAorCisg
ICAgLyoqCisgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGBMaW5rQ29tcG9uZW50YCB3aWxs
IHRyaWdnZXIgcm91dGluZyB2aWEKKyAgICAgIHRoZSBgcmVwbGFjZVdpdGhgIHJvdXRpbmcgc3Ry
YXRlZ3kuCisgICAgICAgQHByb3BlcnR5IHJlcGxhY2UKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAg
ICAgIEBkZWZhdWx0IGZhbHNlCisgICAgICBAcHVibGljCisgICAgKiovCisgICAgcmVwbGFjZTog
ZmFsc2UsCisKKyAgICAvKioKKyAgICAgIEJ5IGRlZmF1bHQgdGhlIGB7e2xpbmstdG99fWAgY29t
cG9uZW50IHdpbGwgYmluZCB0byB0aGUgYGhyZWZgIGFuZAorICAgICAgYHRpdGxlYCBhdHRyaWJ1
dGVzLiBJdCdzIGRpc2NvdXJhZ2VkIHRoYXQgeW91IG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAor
ICAgICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0aGUgYXJyYXkgaWYgbmVlZGVkLgorICAg
ICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVCaW5kaW5ncworICAgICAgQHR5cGUgQXJyYXkgfCBTdHJp
bmcKKyAgICAgIEBkZWZhdWx0IFsndGl0bGUnLCAncmVsJywgJ3RhYmluZGV4JywgJ3RhcmdldCdd
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydocmVmJywg
J3RpdGxlJywgJ3JlbCcsICd0YWJpbmRleCcsICd0YXJnZXQnXSwKKworICAgIC8qKgorICAgICAg
QnkgZGVmYXVsdCB0aGUgYHt7bGluay10b319YCBjb21wb25lbnQgd2lsbCBiaW5kIHRvIHRoZSBg
YWN0aXZlYCwgYGxvYWRpbmdgLAorICAgICAgYW5kIGBkaXNhYmxlZGAgY2xhc3Nlcy4gSXQgaXMg
ZGlzY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhlc2UgZGlyZWN0bHkuCisgICAgICAgQHByb3BlcnR5
IGNsYXNzTmFtZUJpbmRpbmdzCisgICAgICBAdHlwZSBBcnJheQorICAgICAgQGRlZmF1bHQgWydh
Y3RpdmUnLCAnbG9hZGluZycsICdkaXNhYmxlZCcsICdlbWJlci10cmFuc2l0aW9uaW5nLWluJywg
J2VtYmVyLXRyYW5zaXRpb25pbmctb3V0J10KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ2FjdGl2ZScsICdsb2FkaW5nJywgJ2Rpc2FibGVkJywgJ3RyYW5z
aXRpb25pbmdJbicsICd0cmFuc2l0aW9uaW5nT3V0J10sCisKKyAgICAvKioKKyAgICAgIEJ5IGRl
ZmF1bHQgdGhlIGB7e2xpbmstdG99fWAgY29tcG9uZW50IHJlc3BvbmRzIHRvIHRoZSBgY2xpY2tg
IGV2ZW50LiBZb3UKKyAgICAgIGNhbiBvdmVycmlkZSB0aGlzIGdsb2JhbGx5IGJ5IHNldHRpbmcg
dGhpcyBwcm9wZXJ0eSB0byB5b3VyIGN1c3RvbQorICAgICAgZXZlbnQgbmFtZS4KKyAgICAgICBU
aGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgb24gbW9iaWxlIHdoZW4gb25lIHdhbnRzIHRvIGF2
b2lkIHRoZSAzMDBtcworICAgICAgY2xpY2sgZGVsYXkgdXNpbmcgc29tZSBzb3J0IG9mIGN1c3Rv
bSBgdGFwYCBldmVudC4KKyAgICAgICBAcHJvcGVydHkgZXZlbnROYW1lCisgICAgICBAdHlwZSBT
dHJpbmcKKyAgICAgIEBkZWZhdWx0IGNsaWNrCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAg
ZXZlbnROYW1lOiAnY2xpY2snLAorCisgICAgLy8gdGhpcyBpcyBkb2MnZWQgaGVyZSBzbyBpdCBz
aG93cyB1cCBpbiB0aGUgZXZlbnRzCisgICAgLy8gc2VjdGlvbiBvZiB0aGUgQVBJIGRvY3VtZW50
YXRpb24sIHdoaWNoIGlzIHdoZXJlCisgICAgLy8gcGVvcGxlIHdpbGwgbGlrZWx5IGdvIGxvb2tp
bmcgZm9yIGl0LgorICAgIC8qKgorICAgICAgVHJpZ2dlcnMgdGhlIGBMaW5rQ29tcG9uZW50YCdz
IHJvdXRpbmcgYmVoYXZpb3IuIElmCisgICAgICBgZXZlbnROYW1lYCBpcyBjaGFuZ2VkIHRvIGEg
dmFsdWUgb3RoZXIgdGhhbiBgY2xpY2tgCisgICAgICB0aGUgcm91dGluZyBiZWhhdmlvciB3aWxs
IHRyaWdnZXIgb24gdGhhdCBjdXN0b20gZXZlbnQKKyAgICAgIGluc3RlYWQuCisgICAgICAgQGV2
ZW50IGNsaWNrCisgICAgICBAcHJpdmF0ZQorICAgICovCisKKyAgICAvKioKKyAgICAgIEFuIG92
ZXJyaWRhYmxlIG1ldGhvZCBjYWxsZWQgd2hlbiBgTGlua0NvbXBvbmVudGAgb2JqZWN0cyBhcmUg
aW5zdGFudGlhdGVkLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgQXBwLk15TGlua0NvbXBvbmVudCA9IEVtYmVyLkxpbmtDb21wb25lbnQuZXh0ZW5kKHsKKyAg
ICAgICAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIoLi4uYXJndW1l
bnRzKTsKKyAgICAgICAgICBFbWJlci5Mb2dnZXIubG9nKCdFdmVudCBpcyAnICsgdGhpcy5nZXQo
J2V2ZW50TmFtZScpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBO
T1RFOiBJZiB5b3UgZG8gb3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1ld29yayBjbGFzcyBsaWtl
IGBFbWJlci5WaWV3YCwKKyAgICAgIGJlIHN1cmUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoLi4uYXJn
dW1lbnRzKWAgaW4geW91cgorICAgICAgYGluaXRgIGRlY2xhcmF0aW9uISBJZiB5b3UgZG9uJ3Qs
IEVtYmVyIG1heSBub3QgaGF2ZSBhbiBvcHBvcnR1bml0eSB0bworICAgICAgZG8gaW1wb3J0YW50
IHNldHVwIHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFuZ2UgYmVoYXZpb3IgaW4geW91cgorICAg
ICAgYXBwbGljYXRpb24uCisgICAgICAgQG1ldGhvZCBpbml0CisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKworICAgICAgLy8gTWFwIGRlc2lyZWQgZXZlbnQgbmFtZSB0byBpbnZv
a2UgZnVuY3Rpb24KKyAgICAgIHZhciBldmVudE5hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2V2ZW50TmFtZScpOworICAgICAgdGhpcy5vbihldmVudE5hbWUsIHRoaXMs
IHRoaXMuX2ludm9rZSk7CisgICAgfSwKKworICAgIF9yb3V0aW5nOiBfZW1iZXJSdW50aW1lSW5q
ZWN0LmRlZmF1bHQuc2VydmljZSgnLXJvdXRpbmcnKSwKKworICAgIC8qKgorICAgICAgQWNjZXNz
ZWQgYXMgYSBjbGFzc25hbWUgYmluZGluZyB0byBhcHBseSB0aGUgYExpbmtDb21wb25lbnRgJ3Mg
YGRpc2FibGVkQ2xhc3NgCisgICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVuIHRo
ZSBsaW5rIGlzIGRpc2FibGVkLgorICAgICAgIFdoZW4gYHRydWVgIGludGVyYWN0aW9ucyB3aXRo
IHRoZSBlbGVtZW50IHdpbGwgbm90IHRyaWdnZXIgcm91dGUgY2hhbmdlcy4KKyAgICAgIEBwcm9w
ZXJ0eSBkaXNhYmxlZAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGRpc2FibGVkOiBfZW1i
ZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICAgIGdldDogZnVuY3Rpb24gKGtleSwgdmFs
dWUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rp
b24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAg
ICAgICAgICB0aGlzLnNldCgnX2lzRGlzYWJsZWQnLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAg
ICAgICByZXR1cm4gdmFsdWUgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Rp
c2FibGVkQ2xhc3MnKSA6IGZhbHNlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2NvbXB1dGVB
Y3RpdmU6IGZ1bmN0aW9uIChyb3V0ZXJTdGF0ZSkgeworICAgICAgaWYgKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbG9hZGluZycpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgIH0KKworICAgICAgdmFyIHJvdXRpbmcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ19yb3V0aW5nJyk7CisgICAgICB2YXIgbW9kZWxzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKyAgICAgIHZhciByZXNvbHZlZFF1ZXJ5UGFy
YW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyZXNvbHZlZFF1ZXJ5UGFy
YW1zJyk7CisKKyAgICAgIHZhciBjdXJyZW50V2hlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY3VycmVudC13aGVuJyk7CisgICAgICB2YXIgaXNDdXJyZW50V2hlblNwZWNp
ZmllZCA9ICEhY3VycmVudFdoZW47CisgICAgICBjdXJyZW50V2hlbiA9IGN1cnJlbnRXaGVuIHx8
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7
CisgICAgICBjdXJyZW50V2hlbiA9IGN1cnJlbnRXaGVuLnNwbGl0KCcgJyk7CisKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBsZW4gPSBjdXJyZW50V2hlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykgewor
ICAgICAgICBpZiAocm91dGluZy5pc0FjdGl2ZUZvclJvdXRlKG1vZGVscywgcmVzb2x2ZWRRdWVy
eVBhcmFtcywgY3VycmVudFdoZW5baV0sIHJvdXRlclN0YXRlLCBpc0N1cnJlbnRXaGVuU3BlY2lm
aWVkKSkgeworICAgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ2FjdGl2ZUNsYXNzJyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJp
bmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rQ29tcG9uZW50YCdzIGBhY3RpdmVDbGFzc2AKKyAgICAg
IENTUyBgY2xhc3NgIHRvIHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZlLgorICAg
ICAgIEEgYExpbmtDb21wb25lbnRgIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4gaXRzIGBjdXJy
ZW50V2hlbmAgcHJvcGVydHkgaXMgYHRydWVgCisgICAgICBvciB0aGUgYXBwbGljYXRpb24ncyBj
dXJyZW50IHJvdXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtDb21wb25lbnRgIHdvdWxkIHRyaWdn
ZXIKKyAgICAgIHRyYW5zaXRpb25zIGludG8uCisgICAgICAgVGhlIGBjdXJyZW50V2hlbmAgcHJv
cGVydHkgY2FuIG1hdGNoIGFnYWluc3QgbXVsdGlwbGUgcm91dGVzIGJ5IHNlcGFyYXRpbmcKKyAg
ICAgIHJvdXRlIG5hbWVzIHVzaW5nIHRoZSBgIGAgKHNwYWNlKSBjaGFyYWN0ZXIuCisgICAgICAg
QHByb3BlcnR5IGFjdGl2ZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGFjdGl2ZTogX2Vt
YmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnYXR0cnMucGFyYW1zJywgJ19yb3V0aW5nLmN1cnJl
bnRTdGF0ZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9Db21wb25lbnRBY3RpdmUoKSB7CisgICAg
ICB2YXIgY3VycmVudFN0YXRlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdf
cm91dGluZy5jdXJyZW50U3RhdGUnKTsKKyAgICAgIGlmICghY3VycmVudFN0YXRlKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVB
Y3RpdmUoY3VycmVudFN0YXRlKTsKKyAgICB9KSwKKworICAgIHdpbGxCZUFjdGl2ZTogX2VtYmVy
TWV0YWxDb21wdXRlZC5jb21wdXRlZCgnX3JvdXRpbmcudGFyZ2V0U3RhdGUnLCBmdW5jdGlvbiBj
b21wdXRlTGlua1RvQ29tcG9uZW50V2lsbEJlQWN0aXZlKCkgeworICAgICAgdmFyIHJvdXRpbmcg
PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ19yb3V0aW5nJyk7CisgICAgICB2
YXIgdGFyZ2V0U3RhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGluZywgJ3Rh
cmdldFN0YXRlJyk7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRp
bmcsICdjdXJyZW50U3RhdGUnKSA9PT0gdGFyZ2V0U3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgfQorCisgICAgICByZXR1cm4gISF0aGlzLl9jb21wdXRlQWN0aXZlKHRhcmdldFN0YXRl
KTsKKyAgICB9KSwKKworICAgIHRyYW5zaXRpb25pbmdJbjogX2VtYmVyTWV0YWxDb21wdXRlZC5j
b21wdXRlZCgnYWN0aXZlJywgJ3dpbGxCZUFjdGl2ZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9D
b21wb25lbnRUcmFuc2l0aW9uaW5nSW4oKSB7CisgICAgICB2YXIgd2lsbEJlQWN0aXZlID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd3aWxsQmVBY3RpdmUnKTsKKyAgICAgIGlm
ICh0eXBlb2Ygd2lsbEJlQWN0aXZlID09PSAndW5kZWZpbmVkJykgeworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiAhX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdhY3RpdmUnKSAmJiB3aWxsQmVBY3RpdmUgJiYgJ2VtYmVyLXRyYW5zaXRpb25p
bmctaW4nOworICAgIH0pLAorCisgICAgdHJhbnNpdGlvbmluZ091dDogX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZCgnYWN0aXZlJywgJ3dpbGxCZUFjdGl2ZScsIGZ1bmN0aW9uIGNvbXB1dGVM
aW5rVG9Db21wb25lbnRUcmFuc2l0aW9uaW5nT3V0KCkgeworICAgICAgdmFyIHdpbGxCZUFjdGl2
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnd2lsbEJlQWN0aXZlJyk7Cisg
ICAgICBpZiAodHlwZW9mIHdpbGxCZUFjdGl2ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdhY3RpdmUnKSAmJiAhd2lsbEJlQWN0aXZlICYmICdlbWJlci10cmFu
c2l0aW9uaW5nLW91dCc7CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIEV2ZW50IGhhbmRsZXIg
dGhhdCBpbnZva2VzIHRoZSBsaW5rLCBhY3RpdmF0aW5nIHRoZSBhc3NvY2lhdGVkIHJvdXRlLgor
ICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIF9pbnZva2UKKyAgICAgIEBwYXJhbSB7RXZl
bnR9IGV2ZW50CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2ludm9rZTogZnVuY3Rpb24g
KGV2ZW50KSB7CisgICAgICBpZiAoIV9lbWJlclZpZXdzU3lzdGVtVXRpbHMuaXNTaW1wbGVDbGlj
ayhldmVudCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBw
cmV2ZW50RGVmYXVsdCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncHJldmVu
dERlZmF1bHQnKTsKKyAgICAgIHZhciB0YXJnZXRBdHRyaWJ1dGUgPSBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQodGhpcywgJ3RhcmdldCcpOworCisgICAgICBpZiAocHJldmVudERlZmF1bHQg
IT09IGZhbHNlKSB7CisgICAgICAgIGlmICghdGFyZ2V0QXR0cmlidXRlIHx8IHRhcmdldEF0dHJp
YnV0ZSA9PT0gJ19zZWxmJykgeworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnYnViYmxlcycpID09PSBmYWxzZSkgeworICAgICAgICBldmVudC5zdG9wUHJvcGFn
YXRpb24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnX2lzRGlzYWJsZWQnKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9
CisKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmcn
KSkgeworICAgICAgICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ1RoaXMgbGluay10
byBpcyBpbiBhbiBpbmFjdGl2ZSBsb2FkaW5nIHN0YXRlIGJlY2F1c2UgYXQgbGVhc3Qgb25lIG9m
IGl0cyBwYXJhbWV0ZXJzIHByZXNlbnRseSBoYXMgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSwgb3Ig
dGhlIHByb3ZpZGVkIHJvdXRlIG5hbWUgaXMgaW52YWxpZC4nKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICBpZiAodGFyZ2V0QXR0cmlidXRlICYmIHRhcmdldEF0dHJp
YnV0ZSAhPT0gJ19zZWxmJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAg
ICAgIHZhciByb3V0aW5nID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcm91
dGluZycpOworICAgICAgdmFyIHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAgICB2YXIgbW9kZWxz
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKyAgICAgIHZh
ciBxdWVyeVBhcmFtVmFsdWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdx
dWVyeVBhcmFtcy52YWx1ZXMnKTsKKyAgICAgIHZhciBzaG91bGRSZXBsYWNlID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyZXBsYWNlJyk7CisKKyAgICAgIHJvdXRpbmcudHJh
bnNpdGlvblRvKHF1YWxpZmllZFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtVmFsdWVzLCBz
aG91bGRSZXBsYWNlKTsKKyAgICB9LAorCisgICAgcXVlcnlQYXJhbXM6IG51bGwsCisKKyAgICBx
dWFsaWZpZWRSb3V0ZU5hbWU6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoJ3RhcmdldFJv
dXRlTmFtZScsICdfcm91dGluZy5jdXJyZW50U3RhdGUnLCBmdW5jdGlvbiBjb21wdXRlTGlua1Rv
Q29tcG9uZW50UXVhbGlmaWVkUm91dGVOYW1lKCkgeworICAgICAgdmFyIHBhcmFtcyA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncGFyYW1zJykuc2xpY2UoKTsKKyAgICAgIHZh
ciBsYXN0UGFyYW0gPSBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdOworICAgICAgaWYgKGxhc3RQ
YXJhbSAmJiBsYXN0UGFyYW0uaXNRdWVyeVBhcmFtcykgeworICAgICAgICBwYXJhbXMucG9wKCk7
CisgICAgICB9CisgICAgICB2YXIgb25seVF1ZXJ5UGFyYW1zU3VwcGxpZWQgPSB0aGlzW19lbWJl
ckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIuSEFTX0JMT0NLXSA/IHBh
cmFtcy5sZW5ndGggPT09IDAgOiBwYXJhbXMubGVuZ3RoID09PSAxOworICAgICAgaWYgKG9ubHlR
dWVyeVBhcmFtc1N1cHBsaWVkKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ19yb3V0aW5nLmN1cnJlbnRSb3V0ZU5hbWUnKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3RhcmdldFJvdXRl
TmFtZScpOworICAgIH0pLAorCisgICAgcmVzb2x2ZWRRdWVyeVBhcmFtczogX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZCgncXVlcnlQYXJhbXMnLCBmdW5jdGlvbiBjb21wdXRlTGlua1RvQ29t
cG9uZW50UmVzb2x2ZWRRdWVyeVBhcmFtcygpIHsKKyAgICAgIHZhciByZXNvbHZlZFF1ZXJ5UGFy
YW1zID0ge307CisgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ3F1ZXJ5UGFyYW1zJyk7CisKKyAgICAgIGlmICghcXVlcnlQYXJhbXMpIHsK
KyAgICAgICAgcmV0dXJuIHJlc29sdmVkUXVlcnlQYXJhbXM7CisgICAgICB9CisKKyAgICAgIHZh
ciB2YWx1ZXMgPSBxdWVyeVBhcmFtcy52YWx1ZXM7CisgICAgICBmb3IgKHZhciBrZXkgaW4gdmFs
dWVzKSB7CisgICAgICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlZFF1ZXJ5UGFyYW1zW2tl
eV0gPSB2YWx1ZXNba2V5XTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc29sdmVkUXVlcnlQ
YXJhbXM7CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIFNldHMgdGhlIGVsZW1lbnQncyBgaHJl
ZmAgYXR0cmlidXRlIHRvIHRoZSB1cmwgZm9yCisgICAgICB0aGUgYExpbmtDb21wb25lbnRgJ3Mg
dGFyZ2V0ZWQgcm91dGUuCisgICAgICAgSWYgdGhlIGBMaW5rQ29tcG9uZW50YCdzIGB0YWdOYW1l
YCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3RoZXIKKyAgICAgIHRoYW4gYGFgLCB0aGlzIHByb3Bl
cnR5IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICBAcHJvcGVydHkgaHJlZgorICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIGhyZWY6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoJ21vZGVs
cycsICdxdWFsaWZpZWRSb3V0ZU5hbWUnLCBmdW5jdGlvbiBjb21wdXRlTGlua1RvQ29tcG9uZW50
SHJlZigpIHsKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Rh
Z05hbWUnKSAhPT0gJ2EnKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFy
IHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
cXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAgICB2YXIgbW9kZWxzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbG9hZGluZycpKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmdIcmVmJyk7CisgICAgICB9CisKKyAg
ICAgIHZhciByb3V0aW5nID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcm91
dGluZycpOworICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdxdWVyeVBhcmFtcy52YWx1ZXMnKTsKKyAgICAgIHJldHVybiByb3V0aW5nLmdl
bmVyYXRlVVJMKHF1YWxpZmllZFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcyk7CisgICAg
fSksCisKKyAgICBsb2FkaW5nOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKCdfbW9kZWxz
QXJlTG9hZGVkJywgJ3F1YWxpZmllZFJvdXRlTmFtZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9D
b21wb25lbnRMb2FkaW5nKCkgeworICAgICAgdmFyIHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAg
ICB2YXIgbW9kZWxzQXJlTG9hZGVkID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdfbW9kZWxzQXJlTG9hZGVkJyk7CisKKyAgICAgIGlmICghbW9kZWxzQXJlTG9hZGVkIHx8IHF1
YWxpZmllZFJvdXRlTmFtZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmdDbGFzcycpOworICAgICAgfQorICAgIH0pLAor
CisgICAgX21vZGVsc0FyZUxvYWRlZDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnbW9k
ZWxzJywgZnVuY3Rpb24gY29tcHV0ZUxpbmtUb0NvbXBvbmVudE1vZGVsc0FyZUxvYWRlZCgpIHsK
KyAgICAgIHZhciBtb2RlbHMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ21v
ZGVscycpOworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBtb2RlbHMubGVuZ3RoOyBpIDwgbDsg
aSsrKSB7CisgICAgICAgIGlmIChtb2RlbHNbaV0gPT0gbnVsbCkgeworICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
KSwKKworICAgIF9nZXRNb2RlbHM6IGZ1bmN0aW9uIChwYXJhbXMpIHsKKyAgICAgIHZhciBtb2Rl
bENvdW50ID0gcGFyYW1zLmxlbmd0aCAtIDE7CisgICAgICB2YXIgbW9kZWxzID0gbmV3IEFycmF5
KG1vZGVsQ291bnQpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsQ291bnQ7IGkr
KykgeworICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbXNbaSArIDFdOworCisgICAgICAgIHdoaWxl
IChfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdCh2YWx1ZSkpIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnUHJvdmlkaW5nIGB7e2xpbmst
dG99fWAgd2l0aCBhIHBhcmFtIHRoYXQgaXMgd3JhcHBlZCBpbiBhIGNvbnRyb2xsZXIgaXMgZGVw
cmVjYXRlZC4gJyArICh0aGlzLnBhcmVudFZpZXcgPyAnUGxlYXNlIHVwZGF0ZSBgJyArIHRoaXMu
cGFyZW50VmlldyArICdgIHRvIHVzZSBge3tsaW5rLXRvICJwb3N0IiBzb21lQ29udHJvbGxlci5t
b2RlbH19YCBpbnN0ZWFkLicgOiAnJyksIGZhbHNlLCB7IGlkOiAnZW1iZXItcm91dGluZy12aWV3
cy5jb250cm9sbGVyLXdyYXBwZWQtcGFyYW0nLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgICAg
ICB2YWx1ZSA9IHZhbHVlLmdldCgnbW9kZWwnKTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGVs
c1tpXSA9IHZhbHVlOworICAgICAgfQorCisgICAgICByZXR1cm4gbW9kZWxzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8gdXNlIHdoaWxlIGEgbGlu
ay10byBpcyBsb2FkaW5nLgorICAgICAgT25seSBhcHBsaWVzIHdoZW4gdGFnTmFtZSBpcyAnYScK
KyAgICAgICBAcHJvcGVydHkgbG9hZGluZ0hyZWYKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAg
QGRlZmF1bHQgIworICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGxvYWRpbmdIcmVmOiAnIycs
CisKKyAgICB3aWxsUmVuZGVyOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVlcnlQYXJhbXMg
PSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIERvIG5vdCBtdXRhdGUgcGFyYW1zIGluIHBsYWNlCisg
ICAgICB2YXIgcGFyYW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdwYXJh
bXMnKS5zbGljZSgpOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IG11c3Qg
cHJvdmlkZSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHRvIHRoZSBsaW5rLXRvIGNvbXBvbmVudC4n
LCBwYXJhbXMubGVuZ3RoKTsKKworICAgICAgdmFyIGRpc2FibGVkV2hlbiA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnZGlzYWJsZWRXaGVuJyk7CisgICAgICBpZiAoZGlzYWJs
ZWRXaGVuICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhpcy5zZXQoJ2Rpc2FibGVkJywgZGlz
YWJsZWRXaGVuKTsKKyAgICAgIH0KKworICAgICAgLy8gUHJvY2VzcyB0aGUgcG9zaXRpb25hbCBh
cmd1bWVudHMsIGluIG9yZGVyLgorICAgICAgLy8gMS4gSW5saW5lIGxpbmsgdGl0bGUgY29tZXMg
Zmlyc3QsIGlmIHByZXNlbnQuCisgICAgICBpZiAoIXRoaXNbX2VtYmVySHRtbGJhcnNOb2RlTWFu
YWdlcnNDb21wb25lbnROb2RlTWFuYWdlci5IQVNfQkxPQ0tdKSB7CisgICAgICAgIHRoaXMuc2V0
KCdsaW5rVGl0bGUnLCBwYXJhbXMuc2hpZnQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIDIuIGB0
YXJnZXRSb3V0ZU5hbWVgIGlzIG5vdyBhbHdheXMgYXQgaW5kZXggMC4KKyAgICAgIHRoaXMuc2V0
KCd0YXJnZXRSb3V0ZU5hbWUnLCBwYXJhbXNbMF0pOworCisgICAgICAvLyAzLiBUaGUgbGFzdCBh
cmd1bWVudCAoaWYgc3RpbGwgcmVtYWluaW5nKSBpcyB0aGUgYHF1ZXJ5UGFyYW1zYCBvYmplY3Qu
CisgICAgICB2YXIgbGFzdFBhcmFtID0gcGFyYW1zW3BhcmFtcy5sZW5ndGggLSAxXTsKKworICAg
ICAgaWYgKGxhc3RQYXJhbSAmJiBsYXN0UGFyYW0uaXNRdWVyeVBhcmFtcykgeworICAgICAgICBx
dWVyeVBhcmFtcyA9IHBhcmFtcy5wb3AoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHF1ZXJ5
UGFyYW1zID0ge307CisgICAgICB9CisgICAgICB0aGlzLnNldCgncXVlcnlQYXJhbXMnLCBxdWVy
eVBhcmFtcyk7CisKKyAgICAgIC8vIDQuIEFueSByZW1haW5pbmcgaW5kaWNlcyAoZXhjZXB0aW5n
IGB0YXJnZXRSb3V0ZU5hbWVgIGF0IDApIGFyZSBgbW9kZWxzYC4KKyAgICAgIGlmIChwYXJhbXMu
bGVuZ3RoID4gMSkgeworICAgICAgICB0aGlzLnNldCgnbW9kZWxzJywgdGhpcy5fZ2V0TW9kZWxz
KHBhcmFtcykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zZXQoJ21vZGVscycsIFtd
KTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIExpbmtDb21wb25lbnQudG9TdHJpbmcgPSBm
dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICdMaW5rQ29tcG9uZW50JzsKKyAgfTsKKworICBMaW5r
Q29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICBwb3NpdGlvbmFsUGFyYW1zOiAncGFyYW1zJwor
ICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBMaW5rQ29tcG9uZW50OworfSk7CisvLyBjcmVh
dGVzIGluamVjdC5zZXJ2aWNlCitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctdmlld3MvaW5kZXgnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1yb3V0aW5nLXZpZXdzL2NvbXBv
bmVudHMvbGluay10bycsICdlbWJlci1yb3V0aW5nLXZpZXdzL3ZpZXdzL291dGxldCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJSb3V0aW5nVmlld3NDb21wb25l
bnRzTGlua1RvLCBfZW1iZXJSb3V0aW5nVmlld3NWaWV3c091dGxldCkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmctdmlld3MKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuTGlua0NvbXBvbmVudCA9
IF9lbWJlclJvdXRpbmdWaWV3c0NvbXBvbmVudHNMaW5rVG8uZGVmYXVsdDsKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQuT3V0bGV0VmlldyA9IF9lbWJlclJvdXRpbmdWaWV3c1ZpZXdzT3V0bGV0
Lk91dGxldFZpZXc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy12aWV3cy92aWV3cy9vdXRsZXQnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItdmlld3Mvdmlld3MvdmlldycsICdlbWJlci1odG1sYmFycy90ZW1wbGF0
ZXMvdG9wLWxldmVsLXZpZXcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzVmlld3NW
aWV3LCBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldykgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmctdmlld3MKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIENvcmVPdXRsZXRWaWV3ID0gX2VtYmVyVmlld3NWaWV3c1Zp
ZXcuZGVmYXVsdC5leHRlbmQoeworICAgIGRlZmF1bHRUZW1wbGF0ZTogX2VtYmVySHRtbGJhcnNU
ZW1wbGF0ZXNUb3BMZXZlbFZpZXcuZGVmYXVsdCwKKworICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHRoaXMuX3N1cGVyKCk7CisgICAgICB0aGlzLl9vdXRsZXRzID0gW107CisgICAgfSwK
KworICAgIHNldE91dGxldFN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpIHsKKyAgICAgIHRoaXMub3V0
bGV0U3RhdGUgPSB7IG1haW46IHN0YXRlIH07CisKKyAgICAgIGlmICh0aGlzLmVudikgeworICAg
ICAgICB0aGlzLmVudi5vdXRsZXRTdGF0ZSA9IHRoaXMub3V0bGV0U3RhdGU7CisgICAgICB9CisK
KyAgICAgIGlmICh0aGlzLmxhc3RSZXN1bHQpIHsKKyAgICAgICAgdGhpcy5kaXJ0eU91dGxldHMo
KTsKKyAgICAgICAgdGhpcy5fb3V0bGV0cyA9IFtdOworCisgICAgICAgIHRoaXMuc2NoZWR1bGVS
ZXZhbGlkYXRlKG51bGwsIG51bGwpOworICAgICAgfQorICAgIH0sCisKKyAgICBkaXJ0eU91dGxl
dHM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIERpcnR5IGFueSByZW5kZXIgbm9kZXMgdGhhdCBj
b3JyZXNwb25kIHRvIG91dGxldHMKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0
bGV0cy5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlzLl9vdXRsZXRzW2ldLmlzRGlydHkgPSB0
cnVlOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZXhwb3J0cy5Db3JlT3V0bGV0VmlldyA9
IENvcmVPdXRsZXRWaWV3OworICB2YXIgT3V0bGV0VmlldyA9IENvcmVPdXRsZXRWaWV3LmV4dGVu
ZCh7IHRhZ05hbWU6ICcnIH0pOworICBleHBvcnRzLk91dGxldFZpZXcgPSBPdXRsZXRWaWV3Owor
fSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvZXh0L2NvbnRyb2xsZXInLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRyb2xs
ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJS
dW50aW1lTWl4aW5zQ29udHJvbGxlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBt
b2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisgICovCisKKyAgX2VtYmVy
UnVudGltZU1peGluc0NvbnRyb2xsZXIuZGVmYXVsdC5yZW9wZW4oeworICAgIGNvbmNhdGVuYXRl
ZFByb3BlcnRpZXM6IFsncXVlcnlQYXJhbXMnXSwKKworICAgIC8qKgorICAgICAgRGVmaW5lcyB3
aGljaCBxdWVyeSBwYXJhbWV0ZXJzIHRoZSBjb250cm9sbGVyIGFjY2VwdHMuCisgICAgICBJZiB5
b3UgZ2l2ZSB0aGUgbmFtZXMgYFsnY2F0ZWdvcnknLCdwYWdlJ11gIGl0IHdpbGwgYmluZAorICAg
ICAgdGhlIHZhbHVlcyBvZiB0aGVzZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIHRoZSB2YXJpYWJsZXMK
KyAgICAgIGB0aGlzLmNhdGVnb3J5YCBhbmQgYHRoaXMucGFnZWAKKyAgICAgICBAcHJvcGVydHkg
cXVlcnlQYXJhbXMKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHF1ZXJ5UGFyYW1zOiBudWxs
LAorCisgICAgLyoqCisgICAgICBAcHJvcGVydHkgX3FwRGVsZWdhdGUKKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICBfcXBEZWxlZ2F0ZTogbnVsbCwgLy8gc2V0IGJ5IHJvdXRlCisKKyAgICAv
KioKKyAgICAgIEBtZXRob2QgX3FwQ2hhbmdlZAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAg
IF9xcENoYW5nZWQ6IGZ1bmN0aW9uIChjb250cm9sbGVyLCBfcHJvcCkgeworICAgICAgdmFyIHBy
b3AgPSBfcHJvcC5zdWJzdHIoMCwgX3Byb3AubGVuZ3RoIC0gMyk7CisKKyAgICAgIHZhciBkZWxl
Z2F0ZSA9IGNvbnRyb2xsZXIuX3FwRGVsZWdhdGU7CisgICAgICB2YXIgdmFsdWUgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoY29udHJvbGxlciwgcHJvcCk7CisgICAgICBkZWxlZ2F0ZShw
cm9wLCB2YWx1ZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVHJhbnNpdGlvbiB0aGUgYXBw
bGljYXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBUaGUgcm91dGUgbWF5CisgICAgICBiZSBlaXRo
ZXIgYSBzaW5nbGUgcm91dGUgb3Igcm91dGUgcGF0aDoKKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzJyk7CisgICAgICBh
Q29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsK
KyAgICAgIGBgYAorICAgICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0
ZSBpbiBxdWVzdGlvbi4gVGhlIG1vZGVsCisgICAgICB3aWxsIGJlIHNlcmlhbGl6ZWQgaW50byB0
aGUgVVJMIHVzaW5nIHRoZSBgc2VyaWFsaXplYCBob29rIG9mCisgICAgICB0aGUgcm91dGU6Cisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUo
J2Jsb2dQb3N0JywgYVBvc3QpOworICAgICAgYGBgCisgICAgICAgSWYgYSBsaXRlcmFsIGlzIHBh
c3NlZCAoc3VjaCBhcyBhIG51bWJlciBvciBhIHN0cmluZyksIGl0IHdpbGwKKyAgICAgIGJlIHRy
ZWF0ZWQgYXMgYW4gaWRlbnRpZmllciBpbnN0ZWFkLiBJbiB0aGlzIGNhc2UsIHRoZSBgbW9kZWxg
CisgICAgICBob29rIG9mIHRoZSByb3V0ZSB3aWxsIGJlIHRyaWdnZXJlZDoKKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3Qn
LCAxKTsKKyAgICAgIGBgYAorICAgICAgIE11bHRpcGxlIG1vZGVscyB3aWxsIGJlIGFwcGxpZWQg
bGFzdCB0byBmaXJzdCByZWN1cnNpdmVseSB1cCB0aGUKKyAgICAgIHJvdXRlIHRyZWUuCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAg
ICAgIHRoaXMucm91dGUoJ2Jsb2dQb3N0JywgeyBwYXRoOiAnOmJsb2dQb3N0SWQnIH0sIGZ1bmN0
aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ2Jsb2dDb21tZW50JywgeyBwYXRoOiAnOmJs
b2dDb21tZW50SWQnLCByZXNldE5hbWVzcGFjZTogdHJ1ZSB9KTsKKyAgICAgICAgfSk7CisgICAg
ICB9KTsKKyAgICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ0NvbW1lbnQn
LCBhUG9zdCwgYUNvbW1lbnQpOworICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUo
J2Jsb2dDb21tZW50JywgMSwgMTMpOworICAgICAgYGBgCisgICAgICAgSXQgaXMgYWxzbyBwb3Nz
aWJsZSB0byBwYXNzIGEgVVJMIChhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGEKKyAgICAgIGAv
YCkuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcyBh
bmQKKyAgICAgIHNob3VsZCByYXJlbHkgYmUgdXNlZCBpbiBwcm9kdWN0aW9uIGNvZGUuCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJy8n
KTsKKyAgICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCcvYmxvZy9wb3N0LzEvY29t
bWVudC8xMycpOworICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJy9ibG9nL3Bv
c3RzP3NvcnQ9dGl0bGUnKTsKKyAgICAgIGBgYAorICAgICAgIEFuIG9wdGlvbnMgaGFzaCB3aXRo
IGEgYHF1ZXJ5UGFyYW1zYCBwcm9wZXJ0eSBtYXkgYmUgcHJvdmlkZWQgYXMKKyAgICAgIHRoZSBm
aW5hbCBhcmd1bWVudCB0byBhZGQgcXVlcnkgcGFyYW1ldGVycyB0byB0aGUgZGVzdGluYXRpb24g
VVJMLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25U
b1JvdXRlKCdibG9nUG9zdCcsIDEsIHsKKyAgICAgICAgcXVlcnlQYXJhbXM6IHtzaG93Q29tbWVu
dHM6ICd0cnVlJ30KKyAgICAgIH0pOworICAgICAgIC8vIGlmIHlvdSBqdXN0IHdhbnQgdG8gdHJh
bnNpdGlvbiB0aGUgcXVlcnkgcGFyYW1ldGVycyB3aXRob3V0IGNoYW5naW5nIHRoZSByb3V0ZQor
ICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoe3F1ZXJ5UGFyYW1zOiB7c29ydDog
J2RhdGUnfX0pOworICAgICAgYGBgCisgICAgICAgU2VlIGFsc28gW3JlcGxhY2VSb3V0ZV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLkNvbnRyb2xsZXJNaXhpbi5odG1sI21ldGhvZF9yZXBsYWNlUm91dGUp
LgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZSBvciBh
IFVSTAorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgb3IgaWRl
bnRpZmllcihzKSB0byBiZSB1c2VkCisgICAgICAgIHdoaWxlIHRyYW5zaXRpb25pbmcgdG8gdGhl
IHJvdXRlLgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBoYXNoIHdp
dGggYSBxdWVyeVBhcmFtcyBwcm9wZXJ0eQorICAgICAgICBjb250YWluaW5nIGEgbWFwcGluZyBv
ZiBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICBAZm9yIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgorICAg
ICAgQG1ldGhvZCB0cmFuc2l0aW9uVG9Sb3V0ZQorICAgICAgQHB1YmxpYworICAgICovCisgICAg
dHJhbnNpdGlvblRvUm91dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIHRhcmdldCBtYXkgYmUg
ZWl0aGVyIGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgorICAgICAgdmFyIHRhcmdldCA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGFyZ2V0Jyk7CisgICAgICB2YXIg
bWV0aG9kID0gdGFyZ2V0LnRyYW5zaXRpb25Ub1JvdXRlIHx8IHRhcmdldC50cmFuc2l0aW9uVG87
CisgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZSB3aGlsZSByZXBs
YWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KKyAgICAgIFRoaXMgd2lsbCByZXBs
YWNlIHRoZSBjdXJyZW50IGhpc3RvcnkgZW50cnkgaW5zdGVhZCBvZiBhZGRpbmcgYSBuZXcgb25l
LgorICAgICAgQmVzaWRlIHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBgdHJhbnNpdGlvblRvUm91
dGVgIGluIGFsbCBvdGhlciByZXNwZWN0cy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBh
Q29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0cycpOworICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCdibG9nUG9zdHMucmVjZW50RW50cmllcycpOworICAgICAgYGBgCisgICAg
ICAgT3B0aW9uYWxseSBzdXBwbHkgYSBtb2RlbCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBU
aGUgbW9kZWwKKyAgICAgIHdpbGwgYmUgc2VyaWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhl
IGBzZXJpYWxpemVgIGhvb2sgb2YKKyAgICAgIHRoZSByb3V0ZToKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgYVBvc3QpOwor
ICAgICAgYGBgCisgICAgICAgSWYgYSBsaXRlcmFsIGlzIHBhc3NlZCAoc3VjaCBhcyBhIG51bWJl
ciBvciBhIHN0cmluZyksIGl0IHdpbGwKKyAgICAgIGJlIHRyZWF0ZWQgYXMgYW4gaWRlbnRpZmll
ciBpbnN0ZWFkLiBJbiB0aGlzIGNhc2UsIHRoZSBgbW9kZWxgCisgICAgICBob29rIG9mIHRoZSBy
b3V0ZSB3aWxsIGJlIHRyaWdnZXJlZDoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBhQ29u
dHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgMSk7CisgICAgICBgYGAKKyAgICAgICBN
dWx0aXBsZSBtb2RlbHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkg
dXAgdGhlCisgICAgICByb3V0ZSB0cmVlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdibG9nUG9zdCcs
IHsgcGF0aDogJzpibG9nUG9zdElkJyB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aGlzLnJv
dXRlKCdibG9nQ29tbWVudCcsIHsgcGF0aDogJzpibG9nQ29tbWVudElkJywgcmVzZXROYW1lc3Bh
Y2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCdibG9nQ29tbWVudCcsIGFQb3N0LCBhQ29tbWVudCk7CisgICAgICBhQ29u
dHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dDb21tZW50JywgMSwgMTMpOworICAgICAgYGBgCisg
ICAgICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgVVJMIChhIHN0cmluZyB0aGF0IHN0
YXJ0cyB3aXRoIGEKKyAgICAgIGAvYCkuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5k
IGRlYnVnZ2luZyBwdXJwb3NlcyBhbmQKKyAgICAgIHNob3VsZCByYXJlbHkgYmUgdXNlZCBpbiBw
cm9kdWN0aW9uIGNvZGUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCcvJyk7CisgICAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJy9ibG9n
L3Bvc3QvMS9jb21tZW50LzEzJyk7CisgICAgICBgYGAKKyAgICAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgb3IgYSBVUkwKKyAgICAgIEBwYXJhbSB7Li4uT2Jq
ZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIG9yIGlkZW50aWZpZXIocykgdG8gYmUgdXNlZAorICAg
ICAgd2hpbGUgdHJhbnNpdGlvbmluZyB0byB0aGUgcm91dGUuCisgICAgICBAZm9yIEVtYmVyLkNv
bnRyb2xsZXJNaXhpbgorICAgICAgQG1ldGhvZCByZXBsYWNlUm91dGUKKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICByZXBsYWNlUm91dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIHRhcmdl
dCBtYXkgYmUgZWl0aGVyIGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgorICAgICAgdmFy
IHRhcmdldCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGFyZ2V0Jyk7Cisg
ICAgICB2YXIgbWV0aG9kID0gdGFyZ2V0LnJlcGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdp
dGg7CisgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9s
bGVyLmRlZmF1bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9leHQvcnVuX2xvb3AnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsUnVuX2xvb3ApIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9kdWxl
IGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKworICAvLyBBZGQgYSBuZXcg
bmFtZWQgcXVldWUgYWZ0ZXIgdGhlICdhY3Rpb25zJyBxdWV1ZSAod2hlcmUgUlNWUCBwcm9taXNl
cworICAvLyByZXNvbHZlKSwgd2hpY2ggaXMgdXNlZCBpbiByb3V0ZXIgdHJhbnNpdGlvbnMgdG8g
cHJldmVudCB1bm5lY2Vzc2FyeQorICAvLyBsb2FkaW5nIHN0YXRlIGVudHJ5IGlmIGFsbCBjb250
ZXh0IHByb21pc2VzIHJlc29sdmUgb24gdGhlCisgIC8vICdhY3Rpb25zJyBxdWV1ZSBmaXJzdC4K
KyAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Ll9hZGRRdWV1ZSgncm91dGVyVHJhbnNpdGlv
bnMnLCAnYWN0aW9ucycpOworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvaW5kZXgnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1yb3V0aW5nL2V4dC9ydW5fbG9vcCcs
ICdlbWJlci1yb3V0aW5nL2V4dC9jb250cm9sbGVyJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24v
YXBpJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vbm9uZV9sb2NhdGlvbicsICdlbWJlci1yb3V0
aW5nL2xvY2F0aW9uL2hhc2hfbG9jYXRpb24nLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi9oaXN0
b3J5X2xvY2F0aW9uJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2NhdGlvbicsICdl
bWJlci1yb3V0aW5nL3N5c3RlbS9nZW5lcmF0ZV9jb250cm9sbGVyJywgJ2VtYmVyLXJvdXRpbmcv
c3lzdGVtL2NvbnRyb2xsZXJfZm9yJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCcsICdlbWJl
ci1yb3V0aW5nL3N5c3RlbS9yb3V0ZXInLCAnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGUnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUm91dGluZ0V4dFJ1bl9s
b29wLCBfZW1iZXJSb3V0aW5nRXh0Q29udHJvbGxlciwgX2VtYmVyUm91dGluZ0xvY2F0aW9uQXBp
LCBfZW1iZXJSb3V0aW5nTG9jYXRpb25Ob25lX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRp
b25IYXNoX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLCBf
ZW1iZXJSb3V0aW5nTG9jYXRpb25BdXRvX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlciwgX2VtYmVyUm91dGluZ1N5c3RlbUNvbnRyb2xsZXJfZm9yLCBfZW1i
ZXJSb3V0aW5nU3lzdGVtRHNsLCBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGVyLCBfZW1iZXJSb3V0
aW5nU3lzdGVtUm91dGUpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1yb3V0aW5nCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LkxvY2F0aW9uID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uQXBpLmRlZmF1bHQ7Cisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkF1dG9Mb2NhdGlvbiA9IF9lbWJlclJvdXRpbmdMb2Nh
dGlvbkF1dG9fbG9jYXRpb24uZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFz
aExvY2F0aW9uID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uSGFzaF9sb2NhdGlvbi5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5IaXN0b3J5TG9jYXRpb24gPSBfZW1iZXJSb3V0aW5n
TG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0Lk5vbmVMb2NhdGlvbiA9IF9lbWJlclJvdXRpbmdMb2NhdGlvbk5vbmVfbG9jYXRpb24uZGVm
YXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5jb250cm9sbGVyRm9yID0gX2VtYmVy
Um91dGluZ1N5c3RlbUNvbnRyb2xsZXJfZm9yLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmdlbmVyYXRlQ29udHJvbGxlckZhY3RvcnkgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5OworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5nZW5lcmF0ZUNvbnRyb2xsZXIgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlci5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5Sb3V0
ZXJEU0wgPSBfZW1iZXJSb3V0aW5nU3lzdGVtRHNsLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LlJvdXRlciA9IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXIuZGVmYXVsdDsKKyAg
X2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuUm91dGUgPSBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGUu
ZGVmYXVsdDsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdDsK
K30pOworCisvLyBFUzZUT0RPOiBDbGVhbnVwIG1vZHVsZXMgd2l0aCBzaWRlLWVmZmVjdHMgYmVs
b3cKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi9hcGknLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZW52aXJvbm1lbnQnLCAnZW1iZXItcm91dGlu
Zy9sb2NhdGlvbi91dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBf
ZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVy
LXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAgICBFbWJlci5Mb2NhdGlvbiByZXR1cm5zIGFuIGlu
c3RhbmNlIG9mIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mCisgICAgdGhlIGBsb2NhdGlv
bmAgQVBJLgorICAKKyAgICAjIyBJbXBsZW1lbnRhdGlvbnMKKyAgCisgICAgWW91IGNhbiBwYXNz
IGFuIGltcGxlbWVudGF0aW9uIG5hbWUgKGBoYXNoYCwgYGhpc3RvcnlgLCBgbm9uZWApIHRvIGZv
cmNlIGEKKyAgICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4geW91ciBh
cHBsaWNhdGlvbi4KKyAgCisgICAgIyMjIEhhc2hMb2NhdGlvbgorICAKKyAgICBVc2luZyBgSGFz
aExvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgd2l0aCBhIGAjYCAoaGFzaCBzaWduKSBzZXBhcmF0
aW5nIHRoZQorICAgIHNlcnZlciBzaWRlIFVSTCBwb3J0aW9uIG9mIHRoZSBVUkwgZnJvbSB0aGUg
cG9ydGlvbiB0aGF0IGlzIHVzZWQgYnkgRW1iZXIuCisgICAgVGhpcyByZWxpZXMgdXBvbiB0aGUg
YGhhc2hjaGFuZ2VgIGV2ZW50IGV4aXN0aW5nIGluIHRoZSBicm93c2VyLgorICAKKyAgICBFeGFt
cGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24o
KSB7CisgICAgICB0aGlzLnJvdXRlKCdwb3N0cycsIGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlz
LnJvdXRlKCduZXcnKTsKKyAgICAgIH0pOworICAgIH0pOworICAKKyAgICBBcHAuUm91dGVyLnJl
b3Blbih7CisgICAgICBsb2NhdGlvbjogJ2hhc2gnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvIy9wb3N0cy9uZXdgLgor
ICAKKyAgICAjIyMgSGlzdG9yeUxvY2F0aW9uCisgIAorICAgIFVzaW5nIGBIaXN0b3J5TG9jYXRp
b25gIHJlc3VsdHMgaW4gVVJMcyB0aGF0IGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEKKyAg
ICBzdGFuZGFyZCBVUkwuIFRoaXMgcmVsaWVzIHVwb24gdGhlIGJyb3dzZXIncyBgaGlzdG9yeWAg
QVBJLgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJv
dXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJvdXRlKCdwb3N0cycsIGZ1bmN0aW9u
KCkgeworICAgICAgICB0aGlzLnJvdXRlKCduZXcnKTsKKyAgICAgIH0pOworICAgIH0pOworICAK
KyAgICBBcHAuUm91dGVyLnJlb3Blbih7CisgICAgICBsb2NhdGlvbjogJ2hpc3RvcnknCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJs
IG9mIGAvcG9zdHMvbmV3YC4KKyAgCisgICAgS2VlcCBpbiBtaW5kIHRoYXQgeW91ciBzZXJ2ZXIg
bXVzdCBzZXJ2ZSB0aGUgRW1iZXIgYXBwIGF0IGFsbCB0aGUgcm91dGVzIHlvdQorICAgIGRlZmlu
ZS4KKyAgCisgICAgIyMjIEF1dG9Mb2NhdGlvbgorICAKKyAgICBVc2luZyBgQXV0b0xvY2F0aW9u
YCwgdGhlIHJvdXRlciB3aWxsIHVzZSB0aGUgYmVzdCBMb2NhdGlvbiBjbGFzcyBzdXBwb3J0ZWQg
YnkKKyAgICB0aGUgYnJvd3NlciBpdCBpcyBydW5uaW5nIGluLgorICAKKyAgICBCcm93c2VycyB0
aGF0IHN1cHBvcnQgdGhlIGBoaXN0b3J5YCBBUEkgd2lsbCB1c2UgYEhpc3RvcnlMb2NhdGlvbmAs
IHRob3NlIHRoYXQKKyAgICBkbyBub3QsIGJ1dCBzdGlsbCBzdXBwb3J0IHRoZSBgaGFzaGNoYW5n
ZWAgZXZlbnQgd2lsbCB1c2UgYEhhc2hMb2NhdGlvbmAsIGFuZAorICAgIGluIHRoZSByYXJlIGNh
c2UgbmVpdGhlciBpcyBzdXBwb3J0ZWQgd2lsbCB1c2UgYE5vbmVMb2NhdGlvbmAuCisgIAorICAg
IEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7CisgICAgICAg
IHRoaXMucm91dGUoJ25ldycpOworICAgICAgfSk7CisgICAgfSk7CisgIAorICAgIEFwcC5Sb3V0
ZXIucmVvcGVuKHsKKyAgICAgIGxvY2F0aW9uOiAnYXV0bycKKyAgICB9KTsKKyAgICBgYGAKKyAg
CisgICAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhIHBvc3RzLm5ldyB1cmwgb2YgYC9wb3N0cy9uZXdg
IGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdAorICAgIHN1cHBvcnQgdGhlIGBoaXN0b3J5YCBhcGkg
b3IgYC8jL3Bvc3RzL25ld2AgZm9yIG9sZGVyIG9uZXMsIGxpa2UgSW50ZXJuZXQKKyAgICBFeHBs
b3JlciA5IGFuZCBiZWxvdy4KKyAgCisgICAgV2hlbiBhIHVzZXIgdmlzaXRzIGEgbGluayB0byB5
b3VyIGFwcGxpY2F0aW9uLCB0aGV5IHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgIHVwZ3JhZGVk
IG9yIGRvd25ncmFkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGBMb2NhdGlvbmAgY2xhc3MsIHdpdGgg
dGhlIFVSTAorICAgIHRyYW5zZm9ybWVkIGFjY29yZGluZ2x5LCBpZiBuZWVkZWQuCisgIAorICAg
IEtlZXAgaW4gbWluZCB0aGF0IHNpbmNlIHNvbWUgb2YgeW91ciB1c2VycyB3aWxsIHVzZSBgSGlz
dG9yeUxvY2F0aW9uYCwgeW91cgorICAgIHNlcnZlciBtdXN0IHNlcnZlIHRoZSBFbWJlciBhcHAg
YXQgYWxsIHRoZSByb3V0ZXMgeW91IGRlZmluZS4KKyAgCisgICAgIyMjIE5vbmVMb2NhdGlvbgor
ICAKKyAgICBVc2luZyBgTm9uZUxvY2F0aW9uYCBjYXVzZXMgRW1iZXIgdG8gbm90IHN0b3JlIHRo
ZSBhcHBsaWNhdGlvbnMgVVJMIHN0YXRlCisgICAgaW4gdGhlIGFjdHVhbCBVUkwuIFRoaXMgaXMg
Z2VuZXJhbGx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGFuZCBpcyBvbmUKKyAgICBvZiB0
aGUgY2hhbmdlcyBtYWRlIHdoZW4gY2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KKyAg
CisgICAgIyMgTG9jYXRpb24gQVBJCisgIAorICAgIEVhY2ggbG9jYXRpb24gaW1wbGVtZW50YXRp
b24gbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgCisgICAgKiBpbXBsZW1l
bnRhdGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGlt
cGxlbWVudGF0aW9uLgorICAgICogZ2V0VVJMOiByZXR1cm5zIHRoZSBjdXJyZW50IFVSTC4KKyAg
ICAqIHNldFVSTChwYXRoKTogc2V0cyB0aGUgY3VycmVudCBVUkwuCisgICAgKiByZXBsYWNlVVJM
KHBhdGgpOiByZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0aW9uYWwpLgorICAgICogb25VcGRh
dGVVUkwoY2FsbGJhY2spOiB0cmlnZ2VycyB0aGUgY2FsbGJhY2sgd2hlbiB0aGUgVVJMIGNoYW5n
ZXMuCisgICAgKiBmb3JtYXRVUkwodXJsKTogZm9ybWF0cyBgdXJsYCB0byBiZSBwbGFjZWQgaW50
byBgaHJlZmAgYXR0cmlidXRlLgorICAgICogZGV0ZWN0KCkgKG9wdGlvbmFsKTogaW5zdHJ1Y3Rz
IHRoZSBsb2NhdGlvbiB0byBkbyBhbnkgZmVhdHVyZSBkZXRlY3Rpb24KKyAgICAgICAgbmVjZXNz
YXJ5LiBJZiB0aGUgbG9jYXRpb24gbmVlZHMgdG8gcmVkaXJlY3QgdG8gYSBkaWZmZXJlbnQgVVJM
LCBpdAorICAgICAgICBjYW4gY2FuY2VsIHJvdXRpbmcgYnkgc2V0dGluZyB0aGUgYGNhbmNlbFJv
dXRlclNldHVwYCBwcm9wZXJ0eSBvbiBpdHNlbGYKKyAgICAgICAgdG8gYGZhbHNlYC4KKyAgCisg
ICAgQ2FsbGluZyBzZXRVUkwgb3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRl
VVJMIGNhbGxiYWNrcy4KKyAgCisgICAgIyMgQ3VzdG9tIGltcGxlbWVudGF0aW9uCisgIAorICAg
IEVtYmVyIHNjYW5zIGBhcHAvbG9jYXRpb25zLypgIGZvciBleHRlbmRpbmcgdGhlIExvY2F0aW9u
IEFQSS4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGltcG9y
dCBFbWJlciBmcm9tICdlbWJlcic7CisgIAorICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkhpc3Rv
cnlMb2NhdGlvbi5leHRlbmQoeworICAgICAgaW1wbGVtZW50YXRpb246ICdoaXN0b3J5LXVybC1s
b2dnaW5nJywKKyAgCisgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICAg
IGNvbnNvbGUubG9nKHBhdGgpOworICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgTG9jYXRp
b24KKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICov
CisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICAvKioKKyAgICAgVGhpcyBpcyBkZXByZWNhdGVk
IGluIGZhdm9yIG9mIHVzaW5nIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbgor
ICAgICBpbXBsZW1lbnRhdGlvbiBhcyBkZXNpcmVkLgorICAgICAgRm9yIGV4YW1wbGU6CisgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgIC8vIEdpdmVuIGEgbG9jYXRpb24gcmVnaXN0ZXJlZCBhcyBm
b2xsb3dzOgorICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnktdGVzdCcs
IEhpc3RvcnlUZXN0TG9jYXRpb24pOworICAgICAgLy8gWW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBp
bnN0YW5jZSB2aWE6CisgICAgIGNvbnRhaW5lci5sb29rdXAoJ2xvY2F0aW9uOmhpc3RvcnktdGVz
dCcpOworICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGNyZWF0ZQorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9wdGlvbnMKKyAgICAgIEByZXR1cm4ge09iamVjdH0gYW4gaW5zdGFuY2Ugb2YgYW4gaW1w
bGVtZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAgQVBJCisgICAgICBAZGVwcmVjYXRlZCBVc2Ug
dGhlIGNvbnRhaW5lciB0byBsb29rdXAgdGhlIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIHRoYXQg
eW91CisgICAgICBuZWVkLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNyZWF0ZTogZnVu
Y3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYg
b3B0aW9ucy5pbXBsZW1lbnRhdGlvbjsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdF
bWJlci5Mb2NhdGlvbi5jcmVhdGU6IHlvdSBtdXN0IHNwZWNpZnkgYSBcJ2ltcGxlbWVudGF0aW9u
XCcgb3B0aW9uJywgISFpbXBsZW1lbnRhdGlvbik7CisKKyAgICAgIHZhciBpbXBsZW1lbnRhdGlv
bkNsYXNzID0gdGhpcy5pbXBsZW1lbnRhdGlvbnNbaW1wbGVtZW50YXRpb25dOworICAgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLkxvY2F0aW9uLmNyZWF0ZTogJyArIGltcGxlbWVu
dGF0aW9uICsgJyBpcyBub3QgYSB2YWxpZCBpbXBsZW1lbnRhdGlvbicsICEhaW1wbGVtZW50YXRp
b25DbGFzcyk7CisKKyAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbkNsYXNzLmNyZWF0ZS5hcHBs
eShpbXBsZW1lbnRhdGlvbkNsYXNzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBpbXBsZW1l
bnRhdGlvbnM6IHt9LAorICAgIF9sb2NhdGlvbjogX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0LmxvY2F0aW9uLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2Nh
dGlvbi5oYXNoYCBieSBwYXJzaW5nIGxvY2F0aW9uLmhyZWYgc2luY2UgYnJvd3NlcnMKKyAgICAg
IGluY29uc2lzdGVudGx5IFVSTC1kZWNvZGUgYGxvY2F0aW9uLmhhc2hgLgorICAgICAgIGh0dHBz
Oi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ4MzMwNAorICAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIGdldEhhc2gKKyAgICAgIEBzaW5jZSAxLjQuMAorICAgICov
CisgICAgX2dldEhhc2g6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSb3V0aW5n
TG9jYXRpb25VdGlsLmdldEhhc2godGhpcy5sb2NhdGlvbik7CisgICAgfQorICB9OworfSk7Citl
bmlmZWQoJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2NhdGlvbicsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXIt
bWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2NvbnRhaW5lci9vd25l
cicsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItbWV0YWwvZW52aXJvbm1l
bnQnLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQsIF9lbWJlck1ldGFsVXRpbHMsIF9jb250YWluZXJPd25lciwgX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdCwgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyUm91dGluZ0xvY2F0
aW9uVXRpbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRIaXN0b3J5UGF0aCA9
IGdldEhpc3RvcnlQYXRoOworICBleHBvcnRzLmdldEhhc2hQYXRoID0gZ2V0SGFzaFBhdGg7CisK
KyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisgICov
CisKKyAgLyoqCisgICAgRW1iZXIuQXV0b0xvY2F0aW9uIHdpbGwgc2VsZWN0IHRoZSBiZXN0IGxv
Y2F0aW9uIG9wdGlvbiBiYXNlZCBvZmYgYnJvd3NlcgorICAgIHN1cHBvcnQgd2l0aCB0aGUgcHJp
b3JpdHkgb3JkZXI6IGhpc3RvcnksIGhhc2gsIG5vbmUuCisgIAorICAgIENsZWFuIHB1c2hTdGF0
ZSBwYXRocyBhY2Nlc3NlZCBieSBoYXNoY2hhbmdlLW9ubHkgYnJvd3NlcnMgd2lsbCBiZSByZWRp
cmVjdGVkCisgICAgdG8gdGhlIGhhc2gtZXF1aXZhbGVudCBhbmQgdmljZSB2ZXJzYSBzbyBmdXR1
cmUgdHJhbnNpdGlvbnMgYXJlIGNvbnNpc3RlbnQuCisgIAorICAgIEtlZXAgaW4gbWluZCB0aGF0
IHNpbmNlIHNvbWUgb2YgeW91ciB1c2VycyB3aWxsIHVzZSBgSGlzdG9yeUxvY2F0aW9uYCwgeW91
cgorICAgIHNlcnZlciBtdXN0IHNlcnZlIHRoZSBFbWJlciBhcHAgYXQgYWxsIHRoZSByb3V0ZXMg
eW91IGRlZmluZS4KKyAgCisgICAgQGNsYXNzIEF1dG9Mb2NhdGlvbgorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAc3RhdGljCisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0
ID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFRoZSBicm93c2VyJ3MgYGxvY2F0aW9uYCBvYmplY3QuIFRo
aXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAgICAgIGB3aW5kb3cubG9jYXRpb25gLCBi
dXQgbWF5IGJlIG92ZXJyaWRkZW4gZm9yIHRlc3RpbmcuCisgICAgICAgQHByb3BlcnR5IGxvY2F0
aW9uCisgICAgICBAZGVmYXVsdCBlbnZpcm9ubWVudC5sb2NhdGlvbgorICAgICovCisgICAgbG9j
YXRpb246IF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5sb2NhdGlvbiwKKworICAgIC8q
KgorICAgICAgQHByaXZhdGUKKyAgICAgICBUaGUgYnJvd3NlcidzIGBoaXN0b3J5YCBvYmplY3Qu
IFRoaXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAgICAgIGB3aW5kb3cuaGlzdG9yeWAs
IGJ1dCBtYXkgYmUgb3ZlcnJpZGRlbiBmb3IgdGVzdGluZy4KKyAgICAgICBAc2luY2UgMS41LjEK
KyAgICAgIEBwcm9wZXJ0eSBoaXN0b3J5CisgICAgICBAZGVmYXVsdCBlbnZpcm9ubWVudC5oaXN0
b3J5CisgICAgKi8KKyAgICBoaXN0b3J5OiBfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQu
aGlzdG9yeSwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICAgVGhlIHVzZXIgYWdlbnQn
cyBnbG9iYWwgdmFyaWFibGUuIEluIGJyb3dzZXJzLCB0aGlzIHdpbGwgYmUgYHdpbmRvd2AuCisg
ICAgICBAc2luY2UgMS4xMQorICAgICBAcHJvcGVydHkgZ2xvYmFsCisgICAgIEBkZWZhdWx0IGVu
dmlyb25tZW50Lmdsb2JhbAorICAgICovCisgICAgZ2xvYmFsOiBfZW1iZXJNZXRhbEVudmlyb25t
ZW50LmRlZmF1bHQuZ2xvYmFsLAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIFRo
ZSBicm93c2VyJ3MgYHVzZXJBZ2VudGAuIFRoaXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8K
KyAgICAgIGBuYXZpZ2F0b3IudXNlckFnZW50YCwgYnV0IG1heSBiZSBvdmVycmlkZGVuIGZvciB0
ZXN0aW5nLgorICAgICAgIEBzaW5jZSAxLjUuMQorICAgICAgQHByb3BlcnR5IHVzZXJBZ2VudAor
ICAgICAgQGRlZmF1bHQgZW52aXJvbm1lbnQuaGlzdG9yeQorICAgICovCisgICAgdXNlckFnZW50
OiBfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQudXNlckFnZW50LAorCisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSB0aGUgcm91dGVy
IHRvIGtub3cgd2hldGhlciB0byBjYW5jZWwgdGhlIHJvdXRpbmcKKyAgICAgIHNldHVwIHByb2Nl
c3MsIHdoaWNoIGlzIG5lZWRlZCB3aGlsZSB3ZSByZWRpcmVjdCB0aGUgYnJvd3Nlci4KKyAgICAg
ICBAc2luY2UgMS41LjEKKyAgICAgIEBwcm9wZXJ0eSBjYW5jZWxSb3V0ZXJTZXR1cAorICAgICAg
QGRlZmF1bHQgZmFsc2UKKyAgICAqLworICAgIGNhbmNlbFJvdXRlclNldHVwOiBmYWxzZSwKKwor
ICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBXaWxsIGJlIHByZS1wZW5kZWQgdG8gcGF0
aCB1cG9uIHN0YXRlIGNoYW5nZS4KKyAgICAgICBAc2luY2UgMS41LjEKKyAgICAgIEBwcm9wZXJ0
eSByb290VVJMCisgICAgICBAZGVmYXVsdCAnLycKKyAgICAqLworICAgIHJvb3RVUkw6ICcvJywK
KworICAgIC8qKgorICAgICBDYWxsZWQgYnkgdGhlIHJvdXRlciB0byBpbnN0cnVjdCB0aGUgbG9j
YXRpb24gdG8gZG8gYW55IGZlYXR1cmUgZGV0ZWN0aW9uCisgICAgIG5lY2Vzc2FyeS4gSW4gdGhl
IGNhc2Ugb2YgQXV0b0xvY2F0aW9uLCB3ZSBkZXRlY3Qgd2hldGhlciB0byB1c2UgaGlzdG9yeQor
ICAgICBvciBoYXNoIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucy4KKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBkZXRlY3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb290VVJMID0gdGhp
cy5yb290VVJMOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgncm9vdFVSTCBtdXN0
IGVuZCB3aXRoIGEgdHJhaWxpbmcgZm9yd2FyZCBzbGFzaCBlLmcuICIvYXBwLyInLCByb290VVJM
LmNoYXJBdChyb290VVJMLmxlbmd0aCAtIDEpID09PSAnLycpOworCisgICAgICB2YXIgaW1wbGVt
ZW50YXRpb24gPSBkZXRlY3RJbXBsZW1lbnRhdGlvbih7CisgICAgICAgIGxvY2F0aW9uOiB0aGlz
LmxvY2F0aW9uLAorICAgICAgICBoaXN0b3J5OiB0aGlzLmhpc3RvcnksCisgICAgICAgIHVzZXJB
Z2VudDogdGhpcy51c2VyQWdlbnQsCisgICAgICAgIHJvb3RVUkw6IHJvb3RVUkwsCisgICAgICAg
IGRvY3VtZW50TW9kZTogdGhpcy5kb2N1bWVudE1vZGUsCisgICAgICAgIGdsb2JhbDogdGhpcy5n
bG9iYWwKKyAgICAgIH0pOworCisgICAgICBpZiAoaW1wbGVtZW50YXRpb24gPT09IGZhbHNlKSB7
CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnY2FuY2VsUm91dGVy
U2V0dXAnLCB0cnVlKTsKKyAgICAgICAgaW1wbGVtZW50YXRpb24gPSAnbm9uZSc7CisgICAgICB9
CisKKyAgICAgIHZhciBjb25jcmV0ZSA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKS5s
b29rdXAoJ2xvY2F0aW9uOicgKyBpbXBsZW1lbnRhdGlvbik7CisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQoY29uY3JldGUsICdyb290VVJMJywgcm9vdFVSTCk7CisKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDb3VsZCBub3QgZmluZCBsb2NhdGlvbiBcJycgKyBpbXBs
ZW1lbnRhdGlvbiArICdcJy4nLCAhIWNvbmNyZXRlKTsKKworICAgICAgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQuc2V0KHRoaXMsICdjb25jcmV0ZUltcGxlbWVudGF0aW9uJywgY29uY3JldGUpOwor
ICAgIH0sCisKKyAgICBpbml0U3RhdGU6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0aW9u
KCdpbml0U3RhdGUnKSwKKyAgICBnZXRVUkw6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0
aW9uKCdnZXRVUkwnKSwKKyAgICBzZXRVUkw6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0
aW9uKCdzZXRVUkwnKSwKKyAgICByZXBsYWNlVVJMOiBkZWxlZ2F0ZVRvQ29uY3JldGVJbXBsZW1l
bnRhdGlvbigncmVwbGFjZVVSTCcpLAorICAgIG9uVXBkYXRlVVJMOiBkZWxlZ2F0ZVRvQ29uY3Jl
dGVJbXBsZW1lbnRhdGlvbignb25VcGRhdGVVUkwnKSwKKyAgICBmb3JtYXRVUkw6IGRlbGVnYXRl
VG9Db25jcmV0ZUltcGxlbWVudGF0aW9uKCdmb3JtYXRVUkwnKSwKKworICAgIHdpbGxEZXN0cm95
OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29uY3JldGVJbXBsZW1lbnRhdGlvbiA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29uY3JldGVJbXBsZW1lbnRhdGlvbicpOwor
CisgICAgICBpZiAoY29uY3JldGVJbXBsZW1lbnRhdGlvbikgeworICAgICAgICBjb25jcmV0ZUlt
cGxlbWVudGF0aW9uLmRlc3Ryb3koKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGZ1bmN0
aW9uIGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICBy
ZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNvbmNyZXRlSW1wbGVtZW50YXRpb24gPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbmNyZXRlSW1wbGVtZW50YXRpb24n
KTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdBdXRvTG9jYXRpb25cJ3MgZGV0ZWN0
KCkgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGhvb2tz
LicsICEhY29uY3JldGVJbXBsZW1lbnRhdGlvbik7CisKKyAgICAgIGZvciAodmFyIF9sZW4gPSBh
cmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xl
bjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAg
ICB9CisKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFV0aWxzLnRyeUludm9rZShjb25jcmV0ZUlt
cGxlbWVudGF0aW9uLCBtZXRob2ROYW1lLCBhcmdzKTsKKyAgICB9OworICB9CisKKyAgLyoKKyAg
ICBHaXZlbiB0aGUgYnJvd3NlcidzIGBsb2NhdGlvbmAsIGBoaXN0b3J5YCBhbmQgYHVzZXJBZ2Vu
dGAsIGFuZCBhIGNvbmZpZ3VyZWQKKyAgICByb290IFVSTCwgdGhpcyBmdW5jdGlvbiBkZXRlY3Rz
IHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIFtIaXN0b3J5CisgICAgQVBJXShodHRw
czovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGlzdG9yeSkgYW5k
IHJldHVybnMgYQorICAgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIExvY2F0aW9uIG9iamVjdCB0
byB1c2UgYmFzZWQgb24gaXRzIGRldGVybWluYXRpb24uCisgIAorICAgIEZvciBleGFtcGxlLCBp
ZiB0aGUgcGFnZSBsb2FkcyBpbiBhbiBldmVyZ3JlZW4gYnJvd3NlciwgdGhpcyBmdW5jdGlvbiB3
b3VsZAorICAgIHJldHVybiB0aGUgc3RyaW5nICJoaXN0b3J5IiwgbWVhbmluZyB0aGUgaGlzdG9y
eSBBUEkgYW5kIHRodXMgSGlzdG9yeUxvY2F0aW9uCisgICAgc2hvdWxkIGJlIHVzZWQuIElmIHRo
ZSBwYWdlIGlzIGxvYWRlZCBpbiBJRTgsIGl0IHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAi
aGFzaCwiIGluZGljYXRpbmcgdGhhdCB0aGUgSGlzdG9yeSBBUEkgc2hvdWxkIGJlIHNpbXVsYXRl
ZCBieSBtYW5pcHVsYXRpbmcgdGhlCisgICAgaGFzaCBwb3J0aW9uIG9mIHRoZSBsb2NhdGlvbi4K
KyAgCisgICovCisKKyAgZnVuY3Rpb24gZGV0ZWN0SW1wbGVtZW50YXRpb24ob3B0aW9ucykgewor
ICAgIHZhciBsb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247CisgICAgdmFyIHVzZXJBZ2VudCA9
IG9wdGlvbnMudXNlckFnZW50OworICAgIHZhciBoaXN0b3J5ID0gb3B0aW9ucy5oaXN0b3J5Owor
ICAgIHZhciBkb2N1bWVudE1vZGUgPSBvcHRpb25zLmRvY3VtZW50TW9kZTsKKyAgICB2YXIgZ2xv
YmFsID0gb3B0aW9ucy5nbG9iYWw7CisgICAgdmFyIHJvb3RVUkwgPSBvcHRpb25zLnJvb3RVUkw7
CisKKyAgICB2YXIgaW1wbGVtZW50YXRpb24gPSAnbm9uZSc7CisgICAgdmFyIGNhbmNlbFJvdXRl
clNldHVwID0gZmFsc2U7CisgICAgdmFyIGN1cnJlbnRQYXRoID0gX2VtYmVyUm91dGluZ0xvY2F0
aW9uVXRpbC5nZXRGdWxsUGF0aChsb2NhdGlvbik7CisKKyAgICBpZiAoX2VtYmVyUm91dGluZ0xv
Y2F0aW9uVXRpbC5zdXBwb3J0c0hpc3RvcnkodXNlckFnZW50LCBoaXN0b3J5KSkgeworICAgICAg
dmFyIGhpc3RvcnlQYXRoID0gZ2V0SGlzdG9yeVBhdGgocm9vdFVSTCwgbG9jYXRpb24pOworCisg
ICAgICAvLyBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBoaXN0b3J5IGFuZCB3ZSBoYXZlIGEgaGlz
dG9yeSBwYXRoLCB3ZSBjYW4gdXNlCisgICAgICAvLyB0aGUgaGlzdG9yeSBsb2NhdGlvbiB3aXRo
IG5vIHJlZGlyZWN0cy4KKyAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gaGlzdG9yeVBhdGgpIHsK
KyAgICAgICAgcmV0dXJuICdoaXN0b3J5JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChj
dXJyZW50UGF0aC5zdWJzdHIoMCwgMikgPT09ICcvIycpIHsKKyAgICAgICAgICBoaXN0b3J5LnJl
cGxhY2VTdGF0ZSh7IHBhdGg6IGhpc3RvcnlQYXRoIH0sIG51bGwsIGhpc3RvcnlQYXRoKTsKKyAg
ICAgICAgICBpbXBsZW1lbnRhdGlvbiA9ICdoaXN0b3J5JzsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICBjYW5jZWxSb3V0ZXJTZXR1cCA9IHRydWU7CisgICAgICAgICAgX2VtYmVyUm91dGlu
Z0xvY2F0aW9uVXRpbC5yZXBsYWNlUGF0aChsb2NhdGlvbiwgaGlzdG9yeVBhdGgpOworICAgICAg
ICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLnN1
cHBvcnRzSGFzaENoYW5nZShkb2N1bWVudE1vZGUsIGdsb2JhbCkpIHsKKyAgICAgIHZhciBoYXNo
UGF0aCA9IGdldEhhc2hQYXRoKHJvb3RVUkwsIGxvY2F0aW9uKTsKKworICAgICAgLy8gQmUgc3Vy
ZSB3ZSdyZSB1c2luZyBhIGhhc2hlZCBwYXRoLCBvdGhlcndpc2UgbGV0J3Mgc3dpdGNoIG92ZXIg
aXQgdG8gc28KKyAgICAgIC8vIHdlIHN0YXJ0IG9mZiBjbGVhbiBhbmQgY29uc2lzdGVudC4gV2Un
bGwgY291bnQgYW4gaW5kZXggcGF0aCB3aXRoIG5vCisgICAgICAvLyBoYXNoIGFzICJnb29kIGVu
b3VnaCIgYXMgd2VsbC4KKyAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gaGFzaFBhdGggfHwgY3Vy
cmVudFBhdGggPT09ICcvJyAmJiBoYXNoUGF0aCA9PT0gJy8jLycpIHsKKyAgICAgICAgaW1wbGVt
ZW50YXRpb24gPSAnaGFzaCc7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdXIgVVJMIGlz
bid0IGluIHRoZSBleHBlY3RlZCBoYXNoLXN1cHBvcnRlZCBmb3JtYXQsIHNvIHdlIHdhbnQgdG8K
KyAgICAgICAgLy8gY2FuY2VsIHRoZSByb3V0ZXIgc2V0dXAgYW5kIHJlcGxhY2UgdGhlIFVSTCB0
byBzdGFydCBvZmYgY2xlYW4KKyAgICAgICAgY2FuY2VsUm91dGVyU2V0dXAgPSB0cnVlOworICAg
ICAgICBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLnJlcGxhY2VQYXRoKGxvY2F0aW9uLCBoYXNo
UGF0aCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhbmNlbFJvdXRlclNldHVwKSB7Cisg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwor
ICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBw
YXRoIGFzIGl0IHNob3VsZCBhcHBlYXIgZm9yIEhpc3RvcnlMb2NhdGlvbiBzdXBwb3J0ZWQKKyAg
ICBicm93c2Vycy4gVGhpcyBtYXkgdmVyeSB3ZWxsIGRpZmZlciBmcm9tIHRoZSByZWFsIGN1cnJl
bnQgcGF0aCAoZS5nLiBpZiBpdAorICAgIHN0YXJ0cyBvZmYgYXMgYSBoYXNoZWQgVVJMKQorICAq
LworCisgIGZ1bmN0aW9uIGdldEhpc3RvcnlQYXRoKHJvb3RVUkwsIGxvY2F0aW9uKSB7CisgICAg
dmFyIHBhdGggPSBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLmdldFBhdGgobG9jYXRpb24pOwor
ICAgIHZhciBoYXNoID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uVXRpbC5nZXRIYXNoKGxvY2F0aW9u
KTsKKyAgICB2YXIgcXVlcnkgPSBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLmdldFF1ZXJ5KGxv
Y2F0aW9uKTsKKyAgICB2YXIgcm9vdFVSTEluZGV4ID0gcGF0aC5pbmRleE9mKHJvb3RVUkwpOwor
ICAgIHZhciByb3V0ZUhhc2gsIGhhc2hQYXJ0czsKKworICAgIF9lbWJlck1ldGFsRGVidWcuYXNz
ZXJ0KCdQYXRoICcgKyBwYXRoICsgJyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBwcm92aWRlZCBy
b290VVJMICcgKyByb290VVJMLCByb290VVJMSW5kZXggPT09IDApOworCisgICAgLy8gQnkgY29u
dmVudGlvbiwgRW1iZXIuanMgcm91dGVzIHVzaW5nIEhhc2hMb2NhdGlvbiBhcmUgcmVxdWlyZWQg
dG8gc3RhcnQKKyAgICAvLyB3aXRoIGAjL2AuIEFueXRoaW5nIGVsc2Ugc2hvdWxkIE5PVCBiZSBj
b25zaWRlcmVkIGEgcm91dGUgYW5kIHNob3VsZAorICAgIC8vIGJlIHBhc3NlZCBzdHJhaWdodCB0
aHJvdWdoLCB3aXRob3V0IHRyYW5zZm9ybWF0aW9uLgorICAgIGlmIChoYXNoLnN1YnN0cigwLCAy
KSA9PT0gJyMvJykgeworICAgICAgLy8gVGhlcmUgY291bGQgYmUgZXh0cmEgaGFzaCBzZWdtZW50
cyBhZnRlciB0aGUgcm91dGUKKyAgICAgIGhhc2hQYXJ0cyA9IGhhc2guc3Vic3RyKDEpLnNwbGl0
KCcjJyk7CisgICAgICAvLyBUaGUgZmlyc3Qgb25lIGlzIGFsd2F5cyB0aGUgcm91dGUgdXJsCisg
ICAgICByb3V0ZUhhc2ggPSBoYXNoUGFydHMuc2hpZnQoKTsKKworICAgICAgLy8gSWYgdGhlIHBh
dGggYWxyZWFkeSBoYXMgYSB0cmFpbGluZyBzbGFzaCwgcmVtb3ZlIHRoZSBvbmUKKyAgICAgIC8v
IGZyb20gdGhlIGhhc2hlZCByb3V0ZSBzbyB3ZSBkb24ndCBkb3VibGUgdXAuCisgICAgICBpZiAo
cGF0aC5zbGljZSgtMSkgPT09ICcvJykgeworICAgICAgICByb3V0ZUhhc2ggPSByb3V0ZUhhc2gu
c3Vic3RyKDEpOworICAgICAgfQorCisgICAgICAvLyBUaGlzIGlzIHRoZSAiZXhwZWN0ZWQiIGZp
bmFsIG9yZGVyCisgICAgICBwYXRoID0gcGF0aCArIHJvdXRlSGFzaCArIHF1ZXJ5OworCisgICAg
ICBpZiAoaGFzaFBhcnRzLmxlbmd0aCkgeworICAgICAgICBwYXRoICs9ICcjJyArIGhhc2hQYXJ0
cy5qb2luKCcjJyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBhdGggPSBwYXRoICsg
cXVlcnkgKyBoYXNoOworICAgIH0KKworICAgIHJldHVybiBwYXRoOworICB9CisKKyAgLyoqCisg
ICAgQHByaXZhdGUKKyAgCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoIGFzIGl0IHNob3Vs
ZCBhcHBlYXIgZm9yIEhhc2hMb2NhdGlvbiBzdXBwb3J0ZWQKKyAgICBicm93c2Vycy4gVGhpcyBt
YXkgdmVyeSB3ZWxsIGRpZmZlciBmcm9tIHRoZSByZWFsIGN1cnJlbnQgcGF0aC4KKyAgCisgICAg
QG1ldGhvZCBfZ2V0SGFzaFBhdGgKKyAgKi8KKworICBmdW5jdGlvbiBnZXRIYXNoUGF0aChyb290
VVJMLCBsb2NhdGlvbikgeworICAgIHZhciBwYXRoID0gcm9vdFVSTDsKKyAgICB2YXIgaGlzdG9y
eVBhdGggPSBnZXRIaXN0b3J5UGF0aChyb290VVJMLCBsb2NhdGlvbik7CisgICAgdmFyIHJvdXRl
UGF0aCA9IGhpc3RvcnlQYXRoLnN1YnN0cihyb290VVJMLmxlbmd0aCk7CisKKyAgICBpZiAocm91
dGVQYXRoICE9PSAnJykgeworICAgICAgaWYgKHJvdXRlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykg
eworICAgICAgICByb3V0ZVBhdGggPSAnLycgKyByb3V0ZVBhdGg7CisgICAgICB9CisKKyAgICAg
IHBhdGggKz0gJyMnICsgcm91dGVQYXRoOworICAgIH0KKworICAgIHJldHVybiBwYXRoOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi9oYXNoX2xvY2F0aW9uJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9zZXQnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1i
ZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0JywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXBpJywg
J2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxSdW5f
bG9vcCwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXBpLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSkgeworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0
aW5nCisgICovCisKKyAgLyoqCisgICAgYEVtYmVyLkhhc2hMb2NhdGlvbmAgaW1wbGVtZW50cyB0
aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MKKyAgICBoYXNoLiBBdCBwcmVzZW50
LCBpdCByZWxpZXMgb24gYSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCisgICAg
YnJvd3Nlci4KKyAgCisgICAgQGNsYXNzIEhhc2hMb2NhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1i
ZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBv
cnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsK
KyAgICBpbXBsZW1lbnRhdGlvbjogJ2hhc2gnLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgewor
ICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMsICdsb2NhdGlvbicsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX2xvY2F0aW9uJykgfHwgd2luZG93LmxvY2F0
aW9uKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIFJldHVybnMg
bm9ybWFsaXplZCBsb2NhdGlvbi5oYXNoCisgICAgICAgQHNpbmNlIDEuNS4xCisgICAgICBAbWV0
aG9kIGdldEhhc2gKKyAgICAqLworICAgIGdldEhhc2g6IF9lbWJlclJvdXRpbmdMb2NhdGlvbkFw
aS5kZWZhdWx0Ll9nZXRIYXNoLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBub3JtYWxp
emVkIFVSTCwgY29uc3RydWN0ZWQgZnJvbSBgbG9jYXRpb24uaGFzaGAuCisgICAgICAgZS5nLiBg
Iy9mb29gID0+IGAvZm9vYCBhcyB3ZWxsIGFzIGAjL2ZvbyNiYXJgID0+IGAvZm9vI2JhcmAuCisg
ICAgICAgQnkgY29udmVudGlvbiwgaGFzaGVkIHBhdGhzIG11c3QgYmVnaW4gd2l0aCBhIGZvcndh
cmQgc2xhc2gsIG90aGVyd2lzZSB0aGV5CisgICAgICBhcmUgbm90IHRyZWF0ZWQgYXMgYSBwYXRo
IHNvIHdlIGNhbiBkaXN0aW5ndWlzaCBpbnRlbnQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgZ2V0VVJMCisgICAgKi8KKyAgICBnZXRVUkw6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBvcmlnaW5hbFBhdGggPSB0aGlzLmdldEhhc2goKS5zdWJzdHIoMSk7CisgICAgICB2YXIgb3V0
UGF0aCA9IG9yaWdpbmFsUGF0aDsKKworICAgICAgaWYgKG91dFBhdGguY2hhckF0KDApICE9PSAn
LycpIHsKKyAgICAgICAgb3V0UGF0aCA9ICcvJzsKKworICAgICAgICAvLyBPbmx5IGFkZCB0aGUg
IyBpZiB0aGUgcGF0aCBpc24ndCBlbXB0eS4KKyAgICAgICAgLy8gV2UgZG8gTk9UIHdhbnQgYC8j
YCBzaW5jZSB0aGUgYW1wZXJzYW5kCisgICAgICAgIC8vIGlzIG9ubHkgaW5jbHVkZWQgKGNvbnZl
bnRpb25hbGx5KSB3aGVuCisgICAgICAgIC8vIHRoZSBsb2NhdGlvbi5oYXNoIGhhcyBhIHZhbHVl
CisgICAgICAgIGlmIChvcmlnaW5hbFBhdGgpIHsKKyAgICAgICAgICBvdXRQYXRoICs9ICcjJyAr
IG9yaWdpbmFsUGF0aDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb3V0UGF0
aDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBTZXQgdGhlIGBsb2NhdGlvbi5oYXNoYCBhbmQg
cmVtZW1iZXJzIHdoYXQgd2FzIHNldC4gVGhpcyBwcmV2ZW50cworICAgICAgYG9uVXBkYXRlVVJM
YCBjYWxsYmFja3MgZnJvbSB0cmlnZ2VyaW5nIHdoZW4gdGhlIGhhc2ggd2FzIHNldCBieQorICAg
ICAgYEhhc2hMb2NhdGlvbmAuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgc2V0VVJM
CisgICAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQorICAgICovCisgICAgc2V0VVJMOiBmdW5jdGlv
biAocGF0aCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsb2Nh
dGlvbicpLmhhc2ggPSBwYXRoOworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRo
aXMsICdsYXN0U2V0VVJMJywgcGF0aCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVXNlcyBs
b2NhdGlvbi5yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZAor
ICAgICAgb3IgaGlzdG9yeSBtb2RpZmljYXRpb24uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgcmVwbGFjZVVSTAorICAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAg
IHJlcGxhY2VVUkw6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xvY2F0aW9uJykucmVwbGFjZSgnIycgKyBwYXRoKTsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3
aGVuIHRoZSBoYXNoIGNoYW5nZXMuIFRoZXNlCisgICAgICBjYWxsYmFja3Mgd2lsbCBleGVjdXRl
IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgYmFjayBvciBmb3J3YXJkCisgICAgICBidXR0b24s
IGJ1dCBub3QgYWZ0ZXIgYHNldFVSTGAgaXMgaW52b2tlZC4KKyAgICAgICBAcHJpdmF0ZQorICAg
ICAgQG1ldGhvZCBvblVwZGF0ZVVSTAorICAgICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0K
KyAgICAqLworICAgIG9uVXBkYXRlVVJMOiBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgIHZh
ciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBndWlkID0gX2VtYmVyTWV0YWxVdGlscy5ndWlk
Rm9yKHRoaXMpOworCisgICAgICBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KHdpbmRv
dykub24oJ2hhc2hjaGFuZ2UuZW1iZXItbG9jYXRpb24tJyArIGd1aWQsIGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KGZ1bmN0aW9uICgpIHsKKyAgICAg
ICAgICB2YXIgcGF0aCA9IF90aGlzLmdldFVSTCgpOworICAgICAgICAgIGlmIChfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQoX3RoaXMsICdsYXN0U2V0VVJMJykgPT09IHBhdGgpIHsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQoX3RoaXMsICdsYXN0U2V0VVJMJywgbnVsbCk7CisKKyAgICAgICAgICBjYWxs
YmFjayhwYXRoKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBh
cyBwYXJ0CisgICAgICBvZiBhbiBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0ZS4KKyAgICAgICBU
aGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7e2FjdGlvbn19IGhlbHBl
cgorICAgICAgdG8gZ2VuZXJhdGUgYSBVUkwgYmFzZWQgb24gYW4gZXZlbnQuCisgICAgICAgQHBy
aXZhdGUKKyAgICAgIEBtZXRob2QgZm9ybWF0VVJMCisgICAgICBAcGFyYW0gdXJsIHtTdHJpbmd9
CisgICAgKi8KKyAgICBmb3JtYXRVUkw6IGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgIHJldHVybiAn
IycgKyB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2xlYW5zIHVwIHRoZSBIYXNoTG9j
YXRpb24gZXZlbnQgbGlzdGVuZXIuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgd2ls
bERlc3Ryb3kKKyAgICAqLworICAgIHdpbGxEZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2VtYmVy
Vmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9mZignaGFzaGNoYW5nZS5lbWJlci1s
b2NhdGlvbi0nICsgZ3VpZCk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1yb3V0
aW5nL2xvY2F0aW9uL2hpc3RvcnlfbG9jYXRpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
cHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC91
dGlscycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcm91dGluZy9sb2Nh
dGlvbi9hcGknLCAnZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1i
ZXJNZXRhbFV0aWxzLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSb3V0aW5nTG9j
YXRpb25BcGksIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8K
KworICB2YXIgcG9wc3RhdGVGaXJlZCA9IGZhbHNlOworCisgIC8qKgorICAgIEVtYmVyLkhpc3Rv
cnlMb2NhdGlvbiBpbXBsZW1lbnRzIHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJyb3dzZXIn
cworICAgIGhpc3RvcnkucHVzaFN0YXRlIEFQSS4KKyAgCisgICAgQGNsYXNzIEhpc3RvcnlMb2Nh
dGlvbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyAg
ICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVt
T2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbXBsZW1lbnRhdGlvbjogJ2hpc3RvcnknLAor
CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQu
c2V0KHRoaXMsICdsb2NhdGlvbicsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
bG9jYXRpb24nKSB8fCB3aW5kb3cubG9jYXRpb24pOworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQuc2V0KHRoaXMsICdiYXNlVVJMJywgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVs
dCgnYmFzZScpLmF0dHIoJ2hyZWYnKSB8fCAnJyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
VXNlZCB0byBzZXQgc3RhdGUgb24gZmlyc3QgY2FsbCB0byBzZXRVUkwKKyAgICAgICBAcHJpdmF0
ZQorICAgICAgQG1ldGhvZCBpbml0U3RhdGUKKyAgICAqLworICAgIGluaXRTdGF0ZTogZnVuY3Rp
b24gKCkgeworICAgICAgdmFyIGhpc3RvcnkgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcywgJ2hpc3RvcnknKSB8fCB3aW5kb3cuaGlzdG9yeTsKKyAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCAnaGlzdG9yeScsIGhpc3RvcnkpOworCisgICAgICBpZiAoaGlz
dG9yeSAmJiAnc3RhdGUnIGluIGhpc3RvcnkpIHsKKyAgICAgICAgdGhpcy5zdXBwb3J0c0hpc3Rv
cnkgPSB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh0aGlzLmZvcm1h
dFVSTCh0aGlzLmdldFVSTCgpKSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgV2lsbCBiZSBw
cmUtcGVuZGVkIHRvIHBhdGggdXBvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgICBAcHJvcGVydHkgcm9v
dFVSTAorICAgICAgQGRlZmF1bHQgJy8nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgcm9v
dFVSTDogJy8nLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlv
bi5wYXRobmFtZWAgd2l0aG91dCBgcm9vdFVSTGAgb3IgYGJhc2VVUkxgCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2QgZ2V0VVJMCisgICAgICBAcmV0dXJuIHVybCB7U3RyaW5nfQorICAg
ICovCisgICAgZ2V0VVJMOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbG9jYXRpb24gPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvY2F0aW9uJyk7CisgICAgICB2YXIgcGF0
aCA9IGxvY2F0aW9uLnBhdGhuYW1lOworCisgICAgICB2YXIgcm9vdFVSTCA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm9vdFVSTCcpOworICAgICAgdmFyIGJhc2VVUkwgPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Jhc2VVUkwnKTsKKworICAgICAgLy8g
cmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgaWYgdGhleSBleGlzdHMKKyAgICAgIHJvb3RVUkwgPSBy
b290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKKyAgICAgIGJhc2VVUkwgPSBiYXNlVVJMLnJlcGxh
Y2UoL1wvJC8sICcnKTsKKworICAgICAgLy8gcmVtb3ZlIGJhc2VVUkwgYW5kIHJvb3RVUkwgZnJv
bSBzdGFydCBvZiBwYXRoCisgICAgICB2YXIgdXJsID0gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAo
J14nICsgYmFzZVVSTCArICcoPz0vfCQpJyksICcnKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsg
cm9vdFVSTCArICcoPz0vfCQpJyksICcnKTsKKworICAgICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9u
LnNlYXJjaCB8fCAnJzsKKyAgICAgIHVybCArPSBzZWFyY2g7CisgICAgICB1cmwgKz0gdGhpcy5n
ZXRIYXNoKCk7CisKKyAgICAgIHJldHVybiB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
VXNlcyBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdl
IHJlbG9hZC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBzZXRVUkwKKyAgICAgIEBw
YXJhbSBwYXRoIHtTdHJpbmd9CisgICAgKi8KKyAgICBzZXRVUkw6IGZ1bmN0aW9uIChwYXRoKSB7
CisgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7CisgICAgICBwYXRoID0gdGhpcy5m
b3JtYXRVUkwocGF0aCk7CisKKyAgICAgIGlmICghc3RhdGUgfHwgc3RhdGUucGF0aCAhPT0gcGF0
aCkgeworICAgICAgICB0aGlzLnB1c2hTdGF0ZShwYXRoKTsKKyAgICAgIH0KKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBVc2VzIGBoaXN0b3J5LnJlcGxhY2VTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1
cmwgd2l0aG91dCBhIHBhZ2UgcmVsb2FkCisgICAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlvbi4K
KyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCByZXBsYWNlVVJMCisgICAgICBAcGFyYW0g
cGF0aCB7U3RyaW5nfQorICAgICovCisgICAgcmVwbGFjZVVSTDogZnVuY3Rpb24gKHBhdGgpIHsK
KyAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTsKKyAgICAgIHBhdGggPSB0aGlzLmZv
cm1hdFVSTChwYXRoKTsKKworICAgICAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5wYXRoICE9PSBwYXRo
KSB7CisgICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHBhdGgpOworICAgICAgfQorICAgIH0sCisK
KyAgICAvKioKKyAgICAgIEdldCB0aGUgY3VycmVudCBgaGlzdG9yeS5zdGF0ZWAuIENoZWNrcyBm
b3IgaWYgYSBwb2x5ZmlsbCBpcworICAgICAgcmVxdWlyZWQgYW5kIGlmIHNvIGZldGNoZXMgdGhp
cy5faGlzdG9yeVN0YXRlLiBUaGUgc3RhdGUgcmV0dXJuZWQKKyAgICAgIGZyb20gZ2V0U3RhdGUg
bWF5IGJlIG51bGwgaWYgYW4gaWZyYW1lIGhhcyBjaGFuZ2VkIGEgd2luZG93J3MKKyAgICAgIGhp
c3RvcnkuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZ2V0U3RhdGUKKyAgICAgIEBy
ZXR1cm4gc3RhdGUge09iamVjdH0KKyAgICAqLworICAgIGdldFN0YXRlOiBmdW5jdGlvbiAoKSB7
CisgICAgICBpZiAodGhpcy5zdXBwb3J0c0hpc3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaGlzdG9yeScpLnN0YXRlOworICAgICAgfQor
CisgICAgICByZXR1cm4gdGhpcy5faGlzdG9yeVN0YXRlOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgUHVzaGVzIGEgbmV3IHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBwdXNo
U3RhdGUKKyAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAgIHB1c2hTdGF0ZTog
ZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OworCisg
ICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2hpc3RvcnknKS5wdXNoU3Rh
dGUoc3RhdGUsIG51bGwsIHBhdGgpOworCisgICAgICB0aGlzLl9oaXN0b3J5U3RhdGUgPSBzdGF0
ZTsKKworICAgICAgLy8gdXNlZCBmb3Igd2Via2l0IHdvcmthcm91bmQKKyAgICAgIHRoaXMuX3By
ZXZpb3VzVVJMID0gdGhpcy5nZXRVUkwoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIFJlcGxh
Y2VzIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCByZXBs
YWNlU3RhdGUKKyAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAgIHJlcGxhY2VT
dGF0ZTogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9
OworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdoaXN0b3J5JykucmVw
bGFjZVN0YXRlKHN0YXRlLCBudWxsLCBwYXRoKTsKKworICAgICAgdGhpcy5faGlzdG9yeVN0YXRl
ID0gc3RhdGU7CisKKyAgICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCisgICAgICB0
aGlzLl9wcmV2aW91c1VSTCA9IHRoaXMuZ2V0VVJMKCk7CisgICAgfSwKKworICAgIC8qKgorICAg
ICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBicm93c2Vy
CisgICAgICBoaXN0b3J5IGNoYW5nZXMsIGluY2x1ZGluZyB1c2luZyBmb3J3YXJkIGFuZCBiYWNr
IGJ1dHRvbnMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb25VcGRhdGVVUkwKKyAg
ICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259CisgICAgKi8KKyAgICBvblVwZGF0ZVVSTDog
ZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2
YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2VtYmVy
Vmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9uKCdwb3BzdGF0ZS5lbWJlci1sb2Nh
dGlvbi0nICsgZ3VpZCwgZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgLy8gSWdub3JlIGluaXRpYWwg
cGFnZSBsb2FkIHBvcHN0YXRlIGV2ZW50IGluIENocm9tZQorICAgICAgICBpZiAoIXBvcHN0YXRl
RmlyZWQpIHsKKyAgICAgICAgICBwb3BzdGF0ZUZpcmVkID0gdHJ1ZTsKKyAgICAgICAgICBpZiAo
X3RoaXMuZ2V0VVJMKCkgPT09IF90aGlzLl9wcmV2aW91c1VSTCkgeworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayhfdGhpcy5nZXRV
UkwoKSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBVc2VkIHdoZW4gdXNp
bmcgYHt7YWN0aW9ufX1gIGhlbHBlci4gIFRoZSB1cmwgaXMgYWx3YXlzIGFwcGVuZGVkIHRvIHRo
ZSByb290VVJMLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGZvcm1hdFVSTAorICAg
ICAgQHBhcmFtIHVybCB7U3RyaW5nfQorICAgICAgQHJldHVybiBmb3JtYXR0ZWQgdXJsIHtTdHJp
bmd9CisgICAgKi8KKyAgICBmb3JtYXRVUkw6IGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgIHZhciBy
b290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290VVJMJyk7Cisg
ICAgICB2YXIgYmFzZVVSTCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYmFz
ZVVSTCcpOworCisgICAgICBpZiAodXJsICE9PSAnJykgeworICAgICAgICAvLyByZW1vdmUgdHJh
aWxpbmcgc2xhc2hlcyBpZiB0aGV5IGV4aXN0cworICAgICAgICByb290VVJMID0gcm9vdFVSTC5y
ZXBsYWNlKC9cLyQvLCAnJyk7CisgICAgICAgIGJhc2VVUkwgPSBiYXNlVVJMLnJlcGxhY2UoL1wv
JC8sICcnKTsKKyAgICAgIH0gZWxzZSBpZiAoYmFzZVVSTC5tYXRjaCgvXlwvLykgJiYgcm9vdFVS
TC5tYXRjaCgvXlwvLykpIHsKKyAgICAgICAgLy8gaWYgYmFzZVVSTCBhbmQgcm9vdFVSTCBib3Ro
IHN0YXJ0IHdpdGggYSBzbGFzaAorICAgICAgICAvLyAuLi4gcmVtb3ZlIHRyYWlsaW5nIHNsYXNo
IGZyb20gYmFzZVVSTCBpZiBpdCBleGlzdHMKKyAgICAgICAgYmFzZVVSTCA9IGJhc2VVUkwucmVw
bGFjZSgvXC8kLywgJycpOworICAgICAgfQorCisgICAgICByZXR1cm4gYmFzZVVSTCArIHJvb3RV
UkwgKyB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2xlYW5zIHVwIHRoZSBIaXN0b3J5
TG9jYXRpb24gZXZlbnQgbGlzdGVuZXIuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qg
d2lsbERlc3Ryb3kKKyAgICAqLworICAgIHdpbGxEZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAg
ICB2YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2Vt
YmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9mZigncG9wc3RhdGUuZW1iZXIt
bG9jYXRpb24tJyArIGd1aWQpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisg
ICAgICAgUmV0dXJucyBub3JtYWxpemVkIGxvY2F0aW9uLmhhc2gKKyAgICAgICBAbWV0aG9kIGdl
dEhhc2gKKyAgICAqLworICAgIGdldEhhc2g6IF9lbWJlclJvdXRpbmdMb2NhdGlvbkFwaS5kZWZh
dWx0Ll9nZXRIYXNoCisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24v
bm9uZV9sb2NhdGlvbicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLXJ1
bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1
ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1i
ZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAg
ICBFbWJlci5Ob25lTG9jYXRpb24gZG9lcyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvd3Nlci4g
SXQgaXMgdXNlZnVsIGZvcgorICAgIHRlc3RpbmcsIG9yIHdoZW4geW91IG5lZWQgdG8gbWFuYWdl
IHN0YXRlIHdpdGggeW91ciBSb3V0ZXIsIGJ1dCB0ZW1wb3JhcmlseQorICAgIGRvbid0IHdhbnQg
aXQgdG8gbXVjayB3aXRoIHRoZSBVUkwgKGZvciBleGFtcGxlIHdoZW4geW91IGVtYmVkIHlvdXIK
KyAgICBhcHBsaWNhdGlvbiBpbiBhIGxhcmdlciBwYWdlKS4KKyAgCisgICAgQGNsYXNzIE5vbmVM
b2NhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QK
KyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lz
dGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbXBsZW1lbnRhdGlvbjogJ25vbmUnLAor
ICAgIHBhdGg6ICcnLAorCisgICAgZGV0ZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcm9v
dFVSTCA9IHRoaXMucm9vdFVSTDsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3Jv
b3RVUkwgbXVzdCBlbmQgd2l0aCBhIHRyYWlsaW5nIGZvcndhcmQgc2xhc2ggZS5nLiAiL2FwcC8i
Jywgcm9vdFVSTC5jaGFyQXQocm9vdFVSTC5sZW5ndGggLSAxKSA9PT0gJy8nKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBXaWxsIGJlIHByZS1wZW5kZWQgdG8gcGF0aC4KKyAgICAgICBAcHJp
dmF0ZQorICAgICAgQHByb3BlcnR5IHJvb3RVUkwKKyAgICAgIEBkZWZhdWx0ICcvJworICAgICov
CisgICAgcm9vdFVSTDogJy8nLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50
IHBhdGggd2l0aG91dCBgcm9vdFVSTGAuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qg
Z2V0VVJMCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHBhdGgKKyAgICAqLworICAgIGdldFVSTDog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhdGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ3BhdGgnKTsKKyAgICAgIHZhciByb290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdyb290VVJMJyk7CisKKyAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBz
bGFzaGVzIGlmIHRoZXkgZXhpc3RzCisgICAgICByb290VVJMID0gcm9vdFVSTC5yZXBsYWNlKC9c
LyQvLCAnJyk7CisKKyAgICAgIC8vIHJlbW92ZSByb290VVJMIGZyb20gdXJsCisgICAgICByZXR1
cm4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsgcm9vdFVSTCArICcoPz0vfCQpJyksICcn
KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBTZXQgdGhlIHBhdGggYW5kIHJlbWVtYmVycyB3
aGF0IHdhcyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCisgICAgICB0byBjaGFuZ2UgdGhlIHBhdGgg
d2lsbCBub3QgaW52b2tlIHRoZSBgdXBkYXRlVVJMYCBjYWxsYmFjay4KKyAgICAgICBAcHJpdmF0
ZQorICAgICAgQG1ldGhvZCBzZXRVUkwKKyAgICAgIEBwYXJhbSBwYXRoIHtTdHJpbmd9CisgICAg
Ki8KKyAgICBzZXRVUkw6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQodGhpcywgJ3BhdGgnLCBwYXRoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgcGF0aCBjaGFuZ2Vz
LiBUaGVzZQorICAgICAgY2FsbGJhY2tzIHdpbGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNz
ZXMgdGhlIGJhY2sgb3IgZm9yd2FyZAorICAgICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBzZXRV
UkxgIGlzIGludm9rZWQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb25VcGRhdGVV
UkwKKyAgICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259CisgICAgKi8KKyAgICBvblVwZGF0
ZVVSTDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0g
Y2FsbGJhY2s7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgcGF0aCBhbmQgY2Fs
bHMgdGhlIGB1cGRhdGVVUkxgIGNhbGxiYWNrLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0
aG9kIGhhbmRsZVVSTAorICAgICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0KKyAgICAqLwor
ICAgIGhhbmRsZVVSTDogZnVuY3Rpb24gKHVybCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQuc2V0KHRoaXMsICdwYXRoJywgdXJsKTsKKyAgICAgIHRoaXMudXBkYXRlQ2FsbGJhY2so
dXJsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0
byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0CisgICAgICBvZiBhbiBlbGVtZW50J3Mg
YGhyZWZgIGF0dHJpYnV0ZS4KKyAgICAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVu
IHVzaW5nIHRoZSB7e2FjdGlvbn19IGhlbHBlcgorICAgICAgdG8gZ2VuZXJhdGUgYSBVUkwgYmFz
ZWQgb24gYW4gZXZlbnQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZm9ybWF0VVJM
CisgICAgICBAcGFyYW0gdXJsIHtTdHJpbmd9CisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHVybAor
ICAgICovCisgICAgZm9ybWF0VVJMOiBmdW5jdGlvbiAodXJsKSB7CisgICAgICB2YXIgcm9vdFVS
TCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm9vdFVSTCcpOworCisgICAg
ICBpZiAodXJsICE9PSAnJykgeworICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBp
ZiB0aGV5IGV4aXN0cworICAgICAgICByb290VVJMID0gcm9vdFVSTC5yZXBsYWNlKC9cLyQvLCAn
Jyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByb290VVJMICsgdXJsOworICAgIH0KKyAgfSk7
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsJywgWydleHBvcnRzJ10s
IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFJldHVy
bnMgdGhlIGN1cnJlbnQgYGxvY2F0aW9uLnBhdGhuYW1lYCwgbm9ybWFsaXplZCBmb3IgSUUgaW5j
b25zaXN0ZW5jaWVzLgorICAqLworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRQYXRo
ID0gZ2V0UGF0aDsKKyAgZXhwb3J0cy5nZXRRdWVyeSA9IGdldFF1ZXJ5OworICBleHBvcnRzLmdl
dEhhc2ggPSBnZXRIYXNoOworICBleHBvcnRzLmdldEZ1bGxQYXRoID0gZ2V0RnVsbFBhdGg7Cisg
IGV4cG9ydHMuZ2V0T3JpZ2luID0gZ2V0T3JpZ2luOworICBleHBvcnRzLnN1cHBvcnRzSGFzaENo
YW5nZSA9IHN1cHBvcnRzSGFzaENoYW5nZTsKKyAgZXhwb3J0cy5zdXBwb3J0c0hpc3RvcnkgPSBz
dXBwb3J0c0hpc3Rvcnk7CisgIGV4cG9ydHMucmVwbGFjZVBhdGggPSByZXBsYWNlUGF0aDsKKwor
ICBmdW5jdGlvbiBnZXRQYXRoKGxvY2F0aW9uKSB7CisgICAgdmFyIHBhdGhuYW1lID0gbG9jYXRp
b24ucGF0aG5hbWU7CisgICAgLy8gVmFyaW91cyB2ZXJzaW9ucyBvZiBJRS9PcGVyYSBkb24ndCBh
bHdheXMgcmV0dXJuIGEgbGVhZGluZyBzbGFzaAorICAgIGlmIChwYXRobmFtZS5jaGFyQXQoMCkg
IT09ICcvJykgeworICAgICAgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gcGF0aG5hbWU7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBS
ZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlvbi5zZWFyY2hgLgorICAqLworCisgIGZ1bmN0aW9u
IGdldFF1ZXJ5KGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIGxvY2F0aW9uLnNlYXJjaDsKKyAgfQor
CisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFJldHVybnMgdGhlIGN1cnJlbnQgYGxvY2F0
aW9uLmhhc2hgIGJ5IHBhcnNpbmcgbG9jYXRpb24uaHJlZiBzaW5jZSBicm93c2VycworICAgIGlu
Y29uc2lzdGVudGx5IFVSTC1kZWNvZGUgYGxvY2F0aW9uLmhhc2hgLgorICAKKyAgICBTaG91bGQg
YmUgcGFzc2VkIHRoZSBicm93c2VyJ3MgYGxvY2F0aW9uYCBvYmplY3QgYXMgdGhlIGZpcnN0IGFy
Z3VtZW50LgorICAKKyAgICBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNn
aT9pZD00ODMzMDQKKyAgKi8KKworICBmdW5jdGlvbiBnZXRIYXNoKGxvY2F0aW9uKSB7CisgICAg
dmFyIGhyZWYgPSBsb2NhdGlvbi5ocmVmOworICAgIHZhciBoYXNoSW5kZXggPSBocmVmLmluZGV4
T2YoJyMnKTsKKworICAgIGlmIChoYXNoSW5kZXggPT09IC0xKSB7CisgICAgICByZXR1cm4gJyc7
CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBocmVmLnN1YnN0cihoYXNoSW5kZXgpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGxvY2F0aW9uKSB7CisgICAgcmV0dXJu
IGdldFBhdGgobG9jYXRpb24pICsgZ2V0UXVlcnkobG9jYXRpb24pICsgZ2V0SGFzaChsb2NhdGlv
bik7CisgIH0KKworICBmdW5jdGlvbiBnZXRPcmlnaW4obG9jYXRpb24pIHsKKyAgICB2YXIgb3Jp
Z2luID0gbG9jYXRpb24ub3JpZ2luOworCisgICAgLy8gT2xkZXIgYnJvd3NlcnMsIGVzcGVjaWFs
bHkgSUUsIGRvbid0IGhhdmUgb3JpZ2luCisgICAgaWYgKCFvcmlnaW4pIHsKKyAgICAgIG9yaWdp
biA9IGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3RuYW1lOworCisgICAg
ICBpZiAobG9jYXRpb24ucG9ydCkgeworICAgICAgICBvcmlnaW4gKz0gJzonICsgbG9jYXRpb24u
cG9ydDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3JpZ2luOworICB9CisKKyAgLyoK
KyAgICBgZG9jdW1lbnRNb2RlYCBvbmx5IGV4aXN0IGluIEludGVybmV0IEV4cGxvcmVyLCBhbmQg
aXQncyB0ZXN0ZWQgYmVjYXVzZSBJRTggcnVubmluZyBpbgorICAgIElFNyBjb21wYXRpYmlsaXR5
IG1vZGUgY2xhaW1zIHRvIHN1cHBvcnQgYG9uaGFzaGNoYW5nZWAgYnV0IGFjdHVhbGx5IGRvZXMg
bm90LgorICAKKyAgICBgZ2xvYmFsYCBpcyBhbiBvYmplY3QgdGhhdCBtYXkgaGF2ZSBhbiBgb25o
YXNoY2hhbmdlYCBwcm9wZXJ0eS4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAZnVuY3Rpb24gc3Vw
cG9ydHNIYXNoQ2hhbmdlCisgICovCisKKyAgZnVuY3Rpb24gc3VwcG9ydHNIYXNoQ2hhbmdlKGRv
Y3VtZW50TW9kZSwgZ2xvYmFsKSB7CisgICAgcmV0dXJuICdvbmhhc2hjaGFuZ2UnIGluIGdsb2Jh
bCAmJiAoZG9jdW1lbnRNb2RlID09PSB1bmRlZmluZWQgfHwgZG9jdW1lbnRNb2RlID4gNyk7Cisg
IH0KKworICAvKgorICAgIGB1c2VyQWdlbnRgIGlzIGEgdXNlciBhZ2VudCBzdHJpbmcuIFdlIHVz
ZSB1c2VyIGFnZW50IHRlc3RpbmcgaGVyZSwgYmVjYXVzZQorICAgIHRoZSBzdG9jayBBbmRyb2lk
IGJyb3dzZXIgaXMga25vd24gdG8gaGF2ZSBidWdneSB2ZXJzaW9ucyBvZiB0aGUgSGlzdG9yeSBB
UEksCisgICAgaW4gc29tZSBBbmRyb2lkIHZlcnNpb25zLgorICAKKyAgICBAcHJpdmF0ZQorICAg
IEBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkKKyAgKi8KKworICBmdW5jdGlvbiBzdXBwb3J0c0hp
c3RvcnkodXNlckFnZW50LCBoaXN0b3J5KSB7CisgICAgLy8gQm9vc3RlZCBmcm9tIE1vZGVybml6
cjogaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVh
dHVyZS1kZXRlY3RzL2hpc3RvcnkuanMKKyAgICAvLyBUaGUgc3RvY2sgYnJvd3NlciBvbiBBbmRy
b2lkIDIuMiAmIDIuMywgYW5kIDQuMC54IHJldHVybnMgcG9zaXRpdmUgb24gaGlzdG9yeSBzdXBw
b3J0CisgICAgLy8gVW5mb3J0dW5hdGVseSBzdXBwb3J0IGlzIHJlYWxseSBidWdneSBhbmQgdGhl
cmUgaXMgbm8gY2xlYW4gd2F5IHRvIGRldGVjdAorICAgIC8vIHRoZXNlIGJ1Z3MsIHNvIHdlIGZh
bGwgYmFjayB0byBhIHVzZXIgYWdlbnQgc25pZmYgOigKKworICAgIC8vIFdlIG9ubHkgd2FudCBB
bmRyb2lkIDIgYW5kIDQuMCwgc3RvY2sgYnJvd3NlciwgYW5kIG5vdCBDaHJvbWUgd2hpY2ggaWRl
bnRpZmllcworICAgIC8vIGl0c2VsZiBhcyAnTW9iaWxlIFNhZmFyaScgYXMgd2VsbCwgbm9yIFdp
bmRvd3MgUGhvbmUuCisgICAgaWYgKCh1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCAyLicpICE9
PSAtMSB8fCB1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCA0LjAnKSAhPT0gLTEpICYmIHVzZXJB
Z2VudC5pbmRleE9mKCdNb2JpbGUgU2FmYXJpJykgIT09IC0xICYmIHVzZXJBZ2VudC5pbmRleE9m
KCdDaHJvbWUnKSA9PT0gLTEgJiYgdXNlckFnZW50LmluZGV4T2YoJ1dpbmRvd3MgUGhvbmUnKSA9
PT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gISEoaGlz
dG9yeSAmJiAncHVzaFN0YXRlJyBpbiBoaXN0b3J5KTsKKyAgfQorCisgIC8qKgorICAgIFJlcGxh
Y2VzIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBtYWtpbmcgc3VyZSB3ZSBleHBsaWNpdGx5IGluY2x1
ZGUgdGhlIG9yaWdpbgorICAgIHRvIHByZXZlbnQgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQg
b3JpZ2luLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlcGxhY2VQYXRo
KGxvY2F0aW9uLCBwYXRoKSB7CisgICAgbG9jYXRpb24ucmVwbGFjZShnZXRPcmlnaW4obG9jYXRp
b24pICsgcGF0aCk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1yb3V0aW5nL3NlcnZpY2VzL3Jv
dXRpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsICdlbWJl
ci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvY29tcHV0ZWRfbWFjcm9zJywgJ2Vt
YmVyLXJvdXRpbmcvdXRpbHMnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQs
IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9lbWJlck1l
dGFsQXNzaWduKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
cm91dGluZworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgUm91dGlu
ZyBzZXJ2aWNlIGlzIHVzZWQgYnkgTGlua0NvbXBvbmVudCwgYW5kIHByb3ZpZGVzIGZhY2lsaXRp
ZXMgZm9yCisgICAgdGhlIGNvbXBvbmVudC92aWV3IGxheWVyIHRvIGludGVyYWN0IHdpdGggdGhl
IHJvdXRlci4KKyAgCisgICAgV2hpbGUgc3RpbGwgcHJpdmF0ZSwgdGhpcyBzZXJ2aWNlIGNhbiBl
dmVudHVhbGx5IGJlIG9wZW5lZCB1cCwgYW5kIHByb3ZpZGVzCisgICAgdGhlIHNldCBvZiBBUEkg
bmVlZGVkIGZvciBjb21wb25lbnRzIHRvIGNvbnRyb2wgcm91dGluZyB3aXRob3V0IGludGVyYWN0
aW5nCisgICAgd2l0aCByb3V0ZXIgaW50ZXJuYWxzLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBj
bGFzcyBSb3V0aW5nU2VydmljZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50
aW1lU3lzdGVtU2VydmljZS5kZWZhdWx0LmV4dGVuZCh7CisgICAgcm91dGVyOiBudWxsLAorCisg
ICAgdGFyZ2V0U3RhdGU6IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLnJlYWRPbmx5KCdyb3V0
ZXIudGFyZ2V0U3RhdGUnKSwKKyAgICBjdXJyZW50U3RhdGU6IF9lbWJlck1ldGFsQ29tcHV0ZWRf
bWFjcm9zLnJlYWRPbmx5KCdyb3V0ZXIuY3VycmVudFN0YXRlJyksCisgICAgY3VycmVudFJvdXRl
TmFtZTogX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MucmVhZE9ubHkoJ3JvdXRlci5jdXJyZW50
Um91dGVOYW1lJyksCisgICAgY3VycmVudFBhdGg6IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9z
LnJlYWRPbmx5KCdyb3V0ZXIuY3VycmVudFBhdGgnKSwKKworICAgIGF2YWlsYWJsZVJvdXRlczog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJykucm91dGVyLnJlY29nbml6ZXIubmFtZXMpOworICAg
IH0sCisKKyAgICBoYXNSb3V0ZTogZnVuY3Rpb24gKHJvdXRlTmFtZSkgeworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJykuaGFzUm91dGUocm91
dGVOYW1lKTsKKyAgICB9LAorCisgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAocm91dGVOYW1l
LCBtb2RlbHMsIHF1ZXJ5UGFyYW1zLCBzaG91bGRSZXBsYWNlKSB7CisgICAgICB2YXIgcm91dGVy
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKworICAgICAg
dmFyIHRyYW5zaXRpb24gPSByb3V0ZXIuX2RvVHJhbnNpdGlvbihyb3V0ZU5hbWUsIG1vZGVscywg
cXVlcnlQYXJhbXMpOworCisgICAgICBpZiAoc2hvdWxkUmVwbGFjZSkgeworICAgICAgICB0cmFu
c2l0aW9uLm1ldGhvZCgncmVwbGFjZScpOworICAgICAgfQorICAgIH0sCisKKyAgICBub3JtYWxp
emVRdWVyeVBhcmFtczogZnVuY3Rpb24gKHJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykg
eworICAgICAgdmFyIHJvdXRlciA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
cm91dGVyJyk7CisgICAgICByb3V0ZXIuX3ByZXBhcmVRdWVyeVBhcmFtcyhyb3V0ZU5hbWUsIG1v
ZGVscywgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBnZW5lcmF0ZVVSTDogZnVuY3Rpb24g
KHJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFyIHJvdXRlciA9IF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAgICBpZiAoIXJv
dXRlci5yb3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgdmlz
aWJsZVF1ZXJ5UGFyYW1zID0ge307CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHZp
c2libGVRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpOworCisgICAgICB0aGlzLm5vcm1hbGl6ZVF1
ZXJ5UGFyYW1zKHJvdXRlTmFtZSwgbW9kZWxzLCB2aXNpYmxlUXVlcnlQYXJhbXMpOworCisgICAg
ICB2YXIgYXJncyA9IF9lbWJlclJvdXRpbmdVdGlscy5yb3V0ZUFyZ3Mocm91dGVOYW1lLCBtb2Rl
bHMsIHZpc2libGVRdWVyeVBhcmFtcyk7CisgICAgICByZXR1cm4gcm91dGVyLmdlbmVyYXRlLmFw
cGx5KHJvdXRlciwgYXJncyk7CisgICAgfSwKKworICAgIGlzQWN0aXZlRm9yUm91dGU6IGZ1bmN0
aW9uIChjb250ZXh0cywgcXVlcnlQYXJhbXMsIHJvdXRlTmFtZSwgcm91dGVyU3RhdGUsIGlzQ3Vy
cmVudFdoZW5TcGVjaWZpZWQpIHsKKyAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQodGhpcywgJ3JvdXRlcicpOworCisgICAgICB2YXIgaGFuZGxlcnMgPSByb3V0
ZXIucm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3Iocm91dGVOYW1lKTsKKyAgICAgIHZhciBs
ZWFmTmFtZSA9IGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXI7CisgICAgICB2
YXIgbWF4aW11bUNvbnRleHRzID0gbnVtYmVyT2ZDb250ZXh0c0FjY2VwdGVkQnlIYW5kbGVyKHJv
dXRlTmFtZSwgaGFuZGxlcnMpOworCisgICAgICAvLyBOT1RFOiBhbnkgdWdsaW5lc3MgaW4gdGhl
IGNhbGN1bGF0aW9uIG9mIGFjdGl2ZW5lc3MgaXMgbGFyZ2VseQorICAgICAgLy8gZHVlIHRvIHRo
ZSBmYWN0IHRoYXQgd2Ugc3VwcG9ydCBhdXRvbWF0aWMgbm9ybWFsaXppbmcgb2YKKyAgICAgIC8v
IGByZXNvdXJjZWAgLT4gYHJlc291cmNlLmluZGV4YCwgZXZlbiB0aG91Z2ggdGhlcmUgbWlnaHQg
YmUKKyAgICAgIC8vIGR5bmFtaWMgc2VnbWVudHMgLyBxdWVyeSBwYXJhbXMgZGVmaW5lZCBvbiBg
cmVzb3VyY2UuaW5kZXhgCisgICAgICAvLyB3aGljaCBjb21wbGljYXRlcyAoYW5kIG1ha2VzIHNv
bWV3aGF0IGFtYmlndW91cykgdGhlIGNhbGN1bGF0aW9uCisgICAgICAvLyBvZiBhY3RpdmVuZXNz
IGZvciBsaW5rcyB0aGF0IGxpbmsgdG8gYHJlc291cmNlYCBpbnN0ZWFkIG9mCisgICAgICAvLyBk
aXJlY3RseSB0byBgcmVzb3VyY2UuaW5kZXhgLgorCisgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZl
IGVub3VnaCBjb250ZXh0cyByZXZlcnQgYmFjayB0byBmdWxsIHJvdXRlIG5hbWUKKyAgICAgIC8v
IHRoaXMgaXMgYmVjYXVzZSB0aGUgbGVhZiByb3V0ZSB3aWxsIHVzZSBvbmUgb2YgdGhlIGNvbnRl
eHRzCisgICAgICBpZiAoY29udGV4dHMubGVuZ3RoID4gbWF4aW11bUNvbnRleHRzKSB7CisgICAg
ICAgIHJvdXRlTmFtZSA9IGxlYWZOYW1lOworICAgICAgfQorCisgICAgICByZXR1cm4gcm91dGVy
U3RhdGUuaXNBY3RpdmVJbnRlbnQocm91dGVOYW1lLCBjb250ZXh0cywgcXVlcnlQYXJhbXMsICFp
c0N1cnJlbnRXaGVuU3BlY2lmaWVkKTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9uIG51bWJl
ck9mQ29udGV4dHNBY2NlcHRlZEJ5SGFuZGxlcihoYW5kbGVyLCBoYW5kbGVySW5mb3MpIHsKKyAg
ICB2YXIgcmVxID0gMDsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJJbmZvcy5sZW5n
dGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHJlcSA9IHJlcSArIGhhbmRsZXJJbmZvc1tpXS5uYW1l
cy5sZW5ndGg7CisgICAgICBpZiAoaGFuZGxlckluZm9zW2ldLmhhbmRsZXIgPT09IGhhbmRsZXIp
IHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlcTsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2NhY2hlJywgWydleHBvcnRzJywg
J2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
UnVudGltZVN5c3RlbU9iamVjdCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5p
dDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5jYWNoZSA9IHt9OworICAgIH0sCisgICAgaGFz
OiBmdW5jdGlvbiAoYnVja2V0S2V5KSB7CisgICAgICByZXR1cm4gYnVja2V0S2V5IGluIHRoaXMu
Y2FjaGU7CisgICAgfSwKKyAgICBzdGFzaDogZnVuY3Rpb24gKGJ1Y2tldEtleSwga2V5LCB2YWx1
ZSkgeworICAgICAgdmFyIGJ1Y2tldCA9IHRoaXMuY2FjaGVbYnVja2V0S2V5XTsKKyAgICAgIGlm
ICghYnVja2V0KSB7CisgICAgICAgIGJ1Y2tldCA9IHRoaXMuY2FjaGVbYnVja2V0S2V5XSA9IHt9
OworICAgICAgfQorICAgICAgYnVja2V0W2tleV0gPSB2YWx1ZTsKKyAgICB9LAorICAgIGxvb2t1
cDogZnVuY3Rpb24gKGJ1Y2tldEtleSwgcHJvcCwgZGVmYXVsdFZhbHVlKSB7CisgICAgICB2YXIg
Y2FjaGUgPSB0aGlzLmNhY2hlOworICAgICAgaWYgKCEoYnVja2V0S2V5IGluIGNhY2hlKSkgewor
ICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgdmFyIGJ1Y2tldCA9
IGNhY2hlW2J1Y2tldEtleV07CisgICAgICBpZiAocHJvcCBpbiBidWNrZXQpIHsKKyAgICAgICAg
cmV0dXJuIGJ1Y2tldFtwcm9wXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkZWZh
dWx0VmFsdWU7CisgICAgICB9CisgICAgfSwKKyAgICBjYWNoZTogbnVsbAorICB9KTsKK30pOwor
ZW5pZmVkKCJlbWJlci1yb3V0aW5nL3N5c3RlbS9jb250cm9sbGVyX2ZvciIsIFsiZXhwb3J0cyJd
LCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAgICBGaW5kcyBhIGNvbnRyb2xsZXIg
aW5zdGFuY2UuCisgIAorICAgIEBmb3IgRW1iZXIKKyAgICBAbWV0aG9kIGNvbnRyb2xsZXJGb3IK
KyAgICBAcHJpdmF0ZQorICAqLworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gY29udHJvbGxlckZvcjsKKworICBmdW5jdGlvbiBjb250cm9sbGVyRm9yKGNvbnRhaW5lciwg
Y29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlvbnMpIHsKKyAgICByZXR1cm4gY29udGFpbmVyLmxv
b2t1cCgiY29udHJvbGxlcjoiICsgY29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlvbnMpOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vZHNsJywgWydleHBvcnRzJywgJ2Vt
YmVyLW1ldGFsL2RlYnVnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICBmdW5jdGlvbiBEU0wobmFtZSwgb3B0aW9ucykgewor
ICAgIHRoaXMucGFyZW50ID0gbmFtZTsKKyAgICB0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0ZXMg
PSBvcHRpb25zICYmIG9wdGlvbnMuZW5hYmxlTG9hZGluZ1N1YnN0YXRlczsKKyAgICB0aGlzLm1h
dGNoZXMgPSBbXTsKKyAgICB0aGlzLmV4cGxpY2l0SW5kZXggPSB1bmRlZmluZWQ7CisgICAgdGhp
cy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IERTTDsKKwor
ICBEU0wucHJvdG90eXBlID0geworICAgIHJvdXRlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywg
Y2FsbGJhY2spIHsKKyAgICAgIHZhciBkdW1teUVycm9yUm91dGUgPSAnL191bnVzZWRfZHVtbXlf
ZXJyb3JfcGF0aF9yb3V0ZV8nICsgbmFtZSArICcvOmVycm9yJzsKKyAgICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7CisgICAg
ICAgIGNhbGxiYWNrID0gb3B0aW9uczsKKyAgICAgICAgb3B0aW9ucyA9IHt9OworICAgICAgfQor
CisgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICBvcHRpb25zID0g
e307CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdcJycgKyBuYW1l
ICsgJ1wnIGNhbm5vdCBiZSB1c2VkIGFzIGEgcm91dGUgbmFtZS4nLCAoZnVuY3Rpb24gKCkgewor
ICAgICAgICBpZiAob3B0aW9ucy5vdmVycmlkZU5hbWVBc3NlcnRpb24gPT09IHRydWUpIHsKKyAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBbJ2FycmF5
JywgJ2Jhc2ljJywgJ29iamVjdCcsICdhcHBsaWNhdGlvbiddLmluZGV4T2YobmFtZSkgPT09IC0x
OworICAgICAgfSkoKSk7CisKKyAgICAgIGlmICh0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0ZXMp
IHsKKyAgICAgICAgY3JlYXRlUm91dGUodGhpcywgbmFtZSArICdfbG9hZGluZycsIHsgcmVzZXRO
YW1lc3BhY2U6IG9wdGlvbnMucmVzZXROYW1lc3BhY2UgfSk7CisgICAgICAgIGNyZWF0ZVJvdXRl
KHRoaXMsIG5hbWUgKyAnX2Vycm9yJywgeyBwYXRoOiBkdW1teUVycm9yUm91dGUgfSk7CisgICAg
ICB9CisKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICB2YXIgZnVsbE5hbWUgPSBnZXRG
dWxsTmFtZSh0aGlzLCBuYW1lLCBvcHRpb25zLnJlc2V0TmFtZXNwYWNlKTsKKyAgICAgICAgdmFy
IGRzbCA9IG5ldyBEU0woZnVsbE5hbWUsIHRoaXMub3B0aW9ucyk7CisKKyAgICAgICAgY3JlYXRl
Um91dGUoZHNsLCAnbG9hZGluZycpOworICAgICAgICBjcmVhdGVSb3V0ZShkc2wsICdlcnJvcics
IHsgcGF0aDogZHVtbXlFcnJvclJvdXRlIH0pOworCisgICAgICAgIGNhbGxiYWNrLmNhbGwoZHNs
KTsKKworICAgICAgICBjcmVhdGVSb3V0ZSh0aGlzLCBuYW1lLCBvcHRpb25zLCBkc2wuZ2VuZXJh
dGUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjcmVhdGVSb3V0ZSh0aGlzLCBuYW1lLCBv
cHRpb25zKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcHVzaDogZnVuY3Rpb24gKHVybCwgbmFt
ZSwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKKyAgICAg
IGlmICh1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFd
ID09PSAnaW5kZXgnKSB7CisgICAgICAgIHRoaXMuZXhwbGljaXRJbmRleCA9IHRydWU7CisgICAg
ICB9CisKKyAgICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmwsIG5hbWUsIGNhbGxiYWNrXSk7Cisg
ICAgfSwKKworICAgIHJlc291cmNlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywgY2FsbGJhY2sp
IHsKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09
PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsKKyAgICAgICAgb3B0
aW9ucyA9IHt9OworICAgICAgfQorCisgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkg
eworICAgICAgICBvcHRpb25zID0ge307CisgICAgICB9CisKKyAgICAgIG9wdGlvbnMucmVzZXRO
YW1lc3BhY2UgPSB0cnVlOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ3RoaXMu
cmVzb3VyY2UoKSBpcyBkZXByZWNhdGVkLiBVc2UgdGhpcy5yb3V0ZShcJ25hbWVcJywgeyByZXNl
dE5hbWVzcGFjZTogdHJ1ZSB9LCBmdW5jdGlvbiAoKSB7fSkgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJvdXRpbmcucm91dGVyLXJlc291cmNlJywgdW50aWw6ICczLjAuMCcgfSk7Cisg
ICAgICB0aGlzLnJvdXRlKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKTsKKyAgICB9LAorCisgICAg
Z2VuZXJhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkc2xNYXRjaGVzID0gdGhpcy5tYXRj
aGVzOworCisgICAgICBpZiAoIXRoaXMuZXhwbGljaXRJbmRleCkgeworICAgICAgICB0aGlzLnJv
dXRlKCdpbmRleCcsIHsgcGF0aDogJy8nIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gZnVu
Y3Rpb24gKG1hdGNoKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZHNsTWF0Y2hlcy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICB2YXIgZHNsTWF0Y2ggPSBkc2xNYXRjaGVz
W2ldOworICAgICAgICAgIG1hdGNoKGRzbE1hdGNoWzBdKS50byhkc2xNYXRjaFsxXSwgZHNsTWF0
Y2hbMl0pOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBj
YW5OZXN0KGRzbCkgeworICAgIHJldHVybiBkc2wucGFyZW50ICYmIGRzbC5wYXJlbnQgIT09ICdh
cHBsaWNhdGlvbic7CisgIH0KKworICBmdW5jdGlvbiBnZXRGdWxsTmFtZShkc2wsIG5hbWUsIHJl
c2V0TmFtZXNwYWNlKSB7CisgICAgaWYgKGNhbk5lc3QoZHNsKSAmJiByZXNldE5hbWVzcGFjZSAh
PT0gdHJ1ZSkgeworICAgICAgcmV0dXJuIGRzbC5wYXJlbnQgKyAnLicgKyBuYW1lOworICAgIH0g
ZWxzZSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjcmVh
dGVSb3V0ZShkc2wsIG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7CisgICAgb3B0aW9ucyA9IG9w
dGlvbnMgfHwge307CisKKyAgICB2YXIgZnVsbE5hbWUgPSBnZXRGdWxsTmFtZShkc2wsIG5hbWUs
IG9wdGlvbnMucmVzZXROYW1lc3BhY2UpOworCisgICAgaWYgKHR5cGVvZiBvcHRpb25zLnBhdGgg
IT09ICdzdHJpbmcnKSB7CisgICAgICBvcHRpb25zLnBhdGggPSAnLycgKyBuYW1lOworICAgIH0K
KworICAgIGRzbC5wdXNoKG9wdGlvbnMucGF0aCwgZnVsbE5hbWUsIGNhbGxiYWNrKTsKKyAgfQor
CisgIERTTC5tYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICB2YXIgZHNsID0gbmV3IERT
TCgpOworICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsKKyAgICByZXR1cm4gZHNsOworICB9OworfSk7
CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2dlbmVyYXRlX2NvbnRyb2xsZXInLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0J10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZW5lcmF0ZUNvbnRyb2xsZXJG
YWN0b3J5ID0gZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeTsKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
Z2VuZXJhdGVDb250cm9sbGVyOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItcm91dGluZworICAqLworCisgIC8qKgorICAgIEdlbmVyYXRlcyBhIGNvbnRyb2xs
ZXIgZmFjdG9yeQorICAKKyAgICBAZm9yIEVtYmVyCisgICAgQG1ldGhvZCBnZW5lcmF0ZUNvbnRy
b2xsZXJGYWN0b3J5CisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBnZW5lcmF0ZUNv
bnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSwgY29udGV4dCkgeworICAgIHZh
ciBGYWN0b3J5LCBmdWxsTmFtZTsKKworICAgIEZhY3RvcnkgPSBvd25lci5fbG9va3VwRmFjdG9y
eSgnY29udHJvbGxlcjpiYXNpYycpLmV4dGVuZCh7CisgICAgICBpc0dlbmVyYXRlZDogdHJ1ZSwK
KyAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAnKGdlbmVyYXRl
ZCAnICsgY29udHJvbGxlck5hbWUgKyAnIGNvbnRyb2xsZXIpJzsKKyAgICAgIH0KKyAgICB9KTsK
KworICAgIGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOworCisgICAg
b3duZXIucmVnaXN0ZXIoZnVsbE5hbWUsIEZhY3RvcnkpOworCisgICAgcmV0dXJuIEZhY3Rvcnk7
CisgIH0KKworICAvKioKKyAgICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRlcyBhIGNvbnRyb2xs
ZXIuCisgIAorICAgIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY29udHJvbGxlciBmYWN0b3J5
IGlzIGRlcml2ZWQKKyAgICBmcm9tIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBhbiBh
cnJheSBhbiBhcnJheSBjb250cm9sbGVyCisgICAgaXMgZ2VuZXJhdGVkLCBpZiBhbiBvYmplY3Qs
IGFuIG9iamVjdCBjb250cm9sbGVyIG90aGVyd2lzZSwgYSBiYXNpYworICAgIGNvbnRyb2xsZXIg
aXMgZ2VuZXJhdGVkLgorICAKKyAgICBAZm9yIEVtYmVyCisgICAgQG1ldGhvZCBnZW5lcmF0ZUNv
bnRyb2xsZXIKKyAgICBAcHJpdmF0ZQorICAgIEBzaW5jZSAxLjMuMAorICAqLworCisgIGZ1bmN0
aW9uIGdlbmVyYXRlQ29udHJvbGxlcihvd25lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpIHsK
KyAgICBnZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSwgY29u
dGV4dCk7CisKKyAgICB2YXIgZnVsbE5hbWUgPSAnY29udHJvbGxlcjonICsgY29udHJvbGxlck5h
bWU7CisgICAgdmFyIGluc3RhbmNlID0gb3duZXIubG9va3VwKGZ1bGxOYW1lKTsKKworICAgIGlm
IChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaW5zdGFuY2UsICduYW1lc3BhY2UuTE9HX0FD
VElWRV9HRU5FUkFUSU9OJykpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuaW5mbygnZ2VuZXJh
dGVkIC0+ICcgKyBmdWxsTmFtZSwgeyBmdWxsTmFtZTogZnVsbE5hbWUgfSk7CisgICAgfQorCisg
ICAgcmV0dXJuIGluc3RhbmNlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0
ZW0vcXVlcnlfcGFyYW1zJywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVj
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCkgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGltZVN5c3RlbU9i
amVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaXNRdWVyeVBhcmFtczogdHJ1ZSwKKyAgICB2YWx1
ZXM6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGUn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL2dl
dF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAnZW1iZXItbWV0YWwvY29tcHV0
ZWQnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXIt
bWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9jb3B5JywgJ2VtYmVyLXJ1bnRpbWUvc3lz
dGVtL3N0cmluZycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGlt
ZS9zeXN0ZW0vbmF0aXZlX2FycmF5JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQnLCAn
ZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRsZXInLCAnZW1iZXItcm91dGluZy9zeXN0
ZW0vZ2VuZXJhdGVfY29udHJvbGxlcicsICdlbWJlci1yb3V0aW5nL3V0aWxzJywgJ2NvbnRhaW5l
ci9vd25lcicsICdlbWJlci1tZXRhbC9pc19lbXB0eSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1i
ZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQsIF9lbWJlck1ldGFsR2V0X3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsSXNfbm9uZSwgX2Vt
YmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlclJ1bnRpbWVVdGlscywg
X2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyUnVudGltZUNvcHksIF9lbWJlclJ1bnRpbWVTeXN0
ZW1TdHJpbmcsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXksIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLCBfZW1iZXJSdW50aW1lTWl4
aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVy
LCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxJc19lbXB0
eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNs
aWNlOworCisgIGZ1bmN0aW9uIEsoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAv
KioKKyAgICBUaGUgYEVtYmVyLlJvdXRlYCBjbGFzcyBpcyB1c2VkIHRvIGRlZmluZSBpbmRpdmlk
dWFsIHJvdXRlcy4gUmVmZXIgdG8KKyAgICB0aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6Ly9lbWJl
cmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZvciBkb2N1bWVudGF0aW9uLgorICAKKyAgICBAY2xh
c3MgUm91dGUKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0
CisgICAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgorICAgIEB1c2VzIEVtYmVyLkV2ZW50ZWQK
KyAgICBAcHVibGljCisgICovCisgIHZhciBSb3V0ZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmpl
Y3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9oYW5kbGVyLmRlZmF1
bHQsIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLmRlZmF1bHQsIHsKKyAgICAvKioKKyAgICAg
IENvbmZpZ3VyYXRpb24gaGFzaCBmb3IgdGhpcyByb3V0ZSdzIHF1ZXJ5UGFyYW1zLiBUaGUgcG9z
c2libGUKKyAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgdGhlaXIgZGVmYXVsdHMgYXJl
IGFzIGZvbGxvd3MKKyAgICAgIChhc3N1bWluZyBhIHF1ZXJ5IHBhcmFtIHdob3NlIGNvbnRyb2xs
ZXIgcHJvcGVydHkgaXMgYHBhZ2VgKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBxdWVy
eVBhcmFtczogeworICAgICAgICBwYWdlOiB7CisgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgY29u
dHJvbGxlciBxdWVyeSBwYXJhbSBwcm9wZXJ0aWVzIGRvbid0CisgICAgICAgICAgLy8gY2F1c2Ug
YSBmdWxsIHRyYW5zaXRpb24gd2hlbiB0aGV5IGFyZSBjaGFuZ2VkLCBidXQKKyAgICAgICAgICAv
LyByYXRoZXIgb25seSBjYXVzZSB0aGUgVVJMIHRvIHVwZGF0ZS4gU2V0dGluZworICAgICAgICAg
IC8vIGByZWZyZXNoTW9kZWxgIHRvIHRydWUgd2lsbCBjYXVzZSBhbiAiaW4tcGxhY2UiCisgICAg
ICAgICAgLy8gdHJhbnNpdGlvbiB0byBvY2N1ciwgd2hlcmVieSB0aGUgbW9kZWwgaG9va3MgZm9y
CisgICAgICAgICAgLy8gdGhpcyByb3V0ZSAoYW5kIGFueSBjaGlsZCByb3V0ZXMpIHdpbGwgcmUt
ZmlyZSwgYWxsb3dpbmcKKyAgICAgICAgICAvLyB5b3UgdG8gcmVsb2FkIG1vZGVscyAoZS5nLiwg
ZnJvbSB0aGUgc2VydmVyKSB1c2luZyB0aGUKKyAgICAgICAgICAvLyB1cGRhdGVkIHF1ZXJ5IHBh
cmFtIHZhbHVlcy4KKyAgICAgICAgICByZWZyZXNoTW9kZWw6IGZhbHNlLAorICAgICAgICAgICAv
LyBCeSBkZWZhdWx0LCBjaGFuZ2VzIHRvIGNvbnRyb2xsZXIgcXVlcnkgcGFyYW0gcHJvcGVydGll
cworICAgICAgICAgIC8vIGNhdXNlIHRoZSBVUkwgdG8gdXBkYXRlIHZpYSBgcHVzaFN0YXRlYCwg
d2hpY2ggbWVhbnMgYW4KKyAgICAgICAgICAvLyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJy
b3dzZXIncyBoaXN0b3J5LCBhbGxvd2luZworICAgICAgICAgIC8vIHlvdSB0byB1c2UgdGhlIGJh
Y2sgYnV0dG9uIHRvIHJlc3RvcmUgdGhlIGFwcCB0byB0aGUKKyAgICAgICAgICAvLyBwcmV2aW91
cyBzdGF0ZSBiZWZvcmUgdGhlIHF1ZXJ5IHBhcmFtIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgorICAg
ICAgICAgIC8vIFNldHRpbmcgYHJlcGxhY2VgIHRvIHRydWUgd2lsbCB1c2UgYHJlcGxhY2VTdGF0
ZWAgKG9yIGl0cworICAgICAgICAgIC8vIGhhc2ggbG9jYXRpb24gZXF1aXZhbGVudCksIHdoaWNo
IGNhdXNlcyBubyBicm93c2VyIGhpc3RvcnkKKyAgICAgICAgICAvLyBpdGVtIHRvIGJlIGFkZGVk
LiBUaGlzIG9wdGlvbnMgbmFtZSBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUKKyAgICAgICAgICAvLyB0
aGUgc2FtZSBhcyB0aGUgYGxpbmstdG9gIGhlbHBlcidzIGByZXBsYWNlYCBvcHRpb24uCisgICAg
ICAgICAgcmVwbGFjZTogZmFsc2UsCisgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBxdWVy
eSBwYXJhbSBVUkwga2V5IGlzIHRoZSBzYW1lIG5hbWUgYXMKKyAgICAgICAgICAvLyB0aGUgY29u
dHJvbGxlciBwcm9wZXJ0eSBuYW1lLiBVc2UgYGFzYCB0byBzcGVjaWZ5IGEKKyAgICAgICAgICAv
LyBkaWZmZXJlbnQgVVJMIGtleS4KKyAgICAgICAgICBhczogJ3BhZ2UnCisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBxdWVyeVBhcmFtcworICAgICAgQGZv
ciBFbWJlci5Sb3V0ZQorICAgICAgQHR5cGUgT2JqZWN0CisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICBxdWVyeVBhcmFtczoge30sCisKKyAgICAvKioKKyAgICAgIFRoZSBuYW1lIG9mIHRoZSBy
b3V0ZSwgZG90LWRlbGltaXRlZC4KKyAgICAgICBGb3IgZXhhbXBsZSwgYSByb3V0ZSBmb3VuZCBh
dCBgYXBwL3JvdXRlcy9wb3N0cy9wb3N0LmpzYCBvcgorICAgICAgYGFwcC9wb3N0cy9wb3N0L3Jv
dXRlLmpzYCAod2l0aCBwb2RzKSB3aWxsIGhhdmUgYSBgcm91dGVOYW1lYCBvZgorICAgICAgYHBv
c3RzLnBvc3RgLgorICAgICAgIEBwcm9wZXJ0eSByb3V0ZU5hbWUKKyAgICAgIEBmb3IgRW1iZXIu
Um91dGUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAv
KioKKyAgICAgIEBwcml2YXRlCisgICAgICAgQHByb3BlcnR5IF9xcAorICAgICovCisgICAgX3Fw
OiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBf
dGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBjb250cm9sbGVyUHJvdG8sIGNvbWJpbmVkUXVlcnlQ
YXJhbWV0ZXJDb25maWd1cmF0aW9uOworCisgICAgICB2YXIgY29udHJvbGxlck5hbWUgPSB0aGlz
LmNvbnRyb2xsZXJOYW1lIHx8IHRoaXMucm91dGVOYW1lOworICAgICAgdmFyIGRlZmluZWRDb250
cm9sbGVyQ2xhc3MgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykuX2xvb2t1cEZhY3Rv
cnkoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lKTsKKyAgICAgIHZhciBxdWVyeVBhcmFt
ZXRlckNvbmZpZ3VyYXRvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVl
cnlQYXJhbXMnKTsKKyAgICAgIHZhciBoYXNSb3V0ZXJEZWZpbmVkUXVlcnlQYXJhbXMgPSAhIU9i
amVjdC5rZXlzKHF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJhdG9uKS5sZW5ndGg7CisKKyAgICAgIGlm
IChkZWZpbmVkQ29udHJvbGxlckNsYXNzKSB7CisgICAgICAgIC8vIHRoZSBkZXZlbG9wZXIgaGFz
IGF1dGhvcmVkIGEgY29udHJvbGxlciBjbGFzcyBpbiB0aGVpciBhcHBsaWNhdGlvbiBmb3IgdGhp
cyByb3V0ZQorICAgICAgICAvLyBhY2Nlc3MgdGhlIHByb3RvdHlwZSwgZmluZCBpdHMgcXVlcnkg
cGFyYW1zIGFuZCBub3JtYWxpemUgdGhlaXIgb2JqZWN0IHNoYXBlCisgICAgICAgIC8vIHRoZW0g
bWVyZ2UgaW4gdGhlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhlIHJvdXRlLiBBcyBhIG1lcmdlZFByb3Bl
cnR5LCBSb3V0ZSNxdWVyeVBhcmFtcyBpcyBhbHdheXMKKyAgICAgICAgLy8gYXQgbGVhc3QgYHt9
YAorICAgICAgICBjb250cm9sbGVyUHJvdG8gPSBkZWZpbmVkQ29udHJvbGxlckNsYXNzLnByb3Rv
KCk7CisKKyAgICAgICAgdmFyIGNvbnRyb2xsZXJEZWZpbmVkUXVlcnlQYXJhbWV0ZXJDb25maWd1
cmF0aW9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXJQcm90bywgJ3F1
ZXJ5UGFyYW1zJyk7CisgICAgICAgIHZhciBub3JtYWxpemVkQ29udHJvbGxlclF1ZXJ5UGFyYW1l
dGVyQ29uZmlndXJhdGlvbiA9IF9lbWJlclJvdXRpbmdVdGlscy5ub3JtYWxpemVDb250cm9sbGVy
UXVlcnlQYXJhbXMoY29udHJvbGxlckRlZmluZWRRdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRpb24p
OworICAgICAgICBjb21iaW5lZFF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJhdGlvbiA9IG1lcmdlRWFj
aFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRDb250cm9sbGVyUXVlcnlQYXJhbWV0ZXJDb25maWd1cmF0
aW9uLCBxdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRvbik7CisgICAgICB9IGVsc2UgaWYgKGhhc1Jv
dXRlckRlZmluZWRRdWVyeVBhcmFtcykgeworICAgICAgICAvLyB0aGUgZGV2ZWxvcGVyIGhhcyBu
b3QgZGVmaW5lZCBhIGNvbnRyb2xsZXIgYnV0ICpoYXMqIHN1cHBsaWVkIHJvdXRlIHF1ZXJ5IHBh
cmFtcy4KKyAgICAgICAgLy8gR2VuZXJhdGUgYSBjbGFzcyBmb3IgdGhlbSBzbyB3ZSBjYW4gbGF0
ZXIgaW5zZXJ0IGRlZmF1bHQgdmFsdWVzCisgICAgICAgIHZhciBnZW5lcmF0ZWRDb250cm9sbGVy
Q2xhc3MgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5nZW5lcmF0ZUNv
bnRyb2xsZXJGYWN0b3J5KF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKSwgY29udHJvbGxl
ck5hbWUpOworICAgICAgICBjb250cm9sbGVyUHJvdG8gPSBnZW5lcmF0ZWRDb250cm9sbGVyQ2xh
c3MucHJvdG8oKTsKKyAgICAgICAgY29tYmluZWRRdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRpb24g
PSBxdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRvbjsKKyAgICAgIH0KKworICAgICAgdmFyIHFwcyA9
IFtdOworICAgICAgdmFyIG1hcCA9IHt9OworICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBbXTsK
KworICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gY29tYmluZWRRdWVyeVBhcmFtZXRlckNvbmZp
Z3VyYXRpb24pIHsKKyAgICAgICAgaWYgKCFjb21iaW5lZFF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJh
dGlvbi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIHRvIHN1cHBvcnQgdGhlIGR1YmlvdXMgZmVhdHVyZSBvZiB1
c2luZyB1bmtub3duUHJvcGVydHkKKyAgICAgICAgLy8gb24gcXVlcnlQYXJhbXMgY29uZmlndXJh
dGlvbgorICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd1bmtub3duUHJvcGVydHknIHx8IHByb3BO
YW1lID09PSAnX3N1cGVyJykgeworICAgICAgICAgIC8vIHBvc3NpYmxlIHRvZG86IGlzc3VlIGRl
cHJlY2F0aW9uIHdhcm5pbmc/CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg
ICAgICB2YXIgZGVzYyA9IGNvbWJpbmVkUXVlcnlQYXJhbWV0ZXJDb25maWd1cmF0aW9uW3Byb3BO
YW1lXTsKKworICAgICAgICB2YXIgc2NvcGUgPSBkZXNjLnNjb3BlIHx8ICdtb2RlbCc7CisgICAg
ICAgIHZhciBwYXJ0czsKKworICAgICAgICBpZiAoc2NvcGUgPT09ICdjb250cm9sbGVyJykgewor
ICAgICAgICAgIHBhcnRzID0gW107CisgICAgICAgIH0KKworICAgICAgICB2YXIgdXJsS2V5ID0g
ZGVzYy5hcyB8fCB0aGlzLnNlcmlhbGl6ZVF1ZXJ5UGFyYW1LZXkocHJvcE5hbWUpOworICAgICAg
ICB2YXIgZGVmYXVsdFZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xs
ZXJQcm90bywgcHJvcE5hbWUpOworCisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRW
YWx1ZSkpIHsKKyAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0
aXZlX2FycmF5LkEoZGVmYXVsdFZhbHVlLnNsaWNlKCkpOworICAgICAgICB9CisKKyAgICAgICAg
dmFyIHR5cGUgPSBkZXNjLnR5cGUgfHwgX2VtYmVyUnVudGltZVV0aWxzLnR5cGVPZihkZWZhdWx0
VmFsdWUpOworCisgICAgICAgIHZhciBkZWZhdWx0VmFsdWVTZXJpYWxpemVkID0gdGhpcy5zZXJp
YWxpemVRdWVyeVBhcmFtKGRlZmF1bHRWYWx1ZSwgdXJsS2V5LCB0eXBlKTsKKyAgICAgICAgdmFy
IHNjb3BlZFByb3BlcnR5TmFtZSA9IGNvbnRyb2xsZXJOYW1lICsgJzonICsgcHJvcE5hbWU7Cisg
ICAgICAgIHZhciBxcCA9IHsKKyAgICAgICAgICB1bmRlY29yYXRlZERlZmF1bHRWYWx1ZTogX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXJQcm90bywgcHJvcE5hbWUpLAorICAg
ICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLAorICAgICAgICAgIHNlcmlhbGl6ZWRE
ZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZVNlcmlhbGl6ZWQsCisgICAgICAgICAgc2VyaWFsaXpl
ZFZhbHVlOiBkZWZhdWx0VmFsdWVTZXJpYWxpemVkLAorCisgICAgICAgICAgdHlwZTogdHlwZSwK
KyAgICAgICAgICB1cmxLZXk6IHVybEtleSwKKyAgICAgICAgICBwcm9wOiBwcm9wTmFtZSwKKyAg
ICAgICAgICBzY29wZWRQcm9wZXJ0eU5hbWU6IHNjb3BlZFByb3BlcnR5TmFtZSwKKyAgICAgICAg
ICBjdHJsOiBjb250cm9sbGVyTmFtZSwKKyAgICAgICAgICByb3V0ZTogdGhpcywKKyAgICAgICAg
ICBwYXJ0czogcGFydHMsIC8vIHByb3ZpZGVkIGxhdGVyIHdoZW4gc3Rhc2hOYW1lcyBpcyBjYWxs
ZWQgaWYgJ21vZGVsJyBzY29wZQorICAgICAgICAgIHZhbHVlczogbnVsbCwgLy8gcHJvdmlkZWQg
bGF0ZXIgd2hlbiBzZXR1cCBpcyBjYWxsZWQuIG5vIGlkZWEgd2h5LgorICAgICAgICAgIHNjb3Bl
OiBzY29wZSwKKyAgICAgICAgICBwcmVmaXg6ICcnCisgICAgICAgIH07CisKKyAgICAgICAgbWFw
W3Byb3BOYW1lXSA9IG1hcFt1cmxLZXldID0gbWFwW3Njb3BlZFByb3BlcnR5TmFtZV0gPSBxcDsK
KyAgICAgICAgcXBzLnB1c2gocXApOworICAgICAgICBwcm9wZXJ0eU5hbWVzLnB1c2gocHJvcE5h
bWUpOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBxcHM6IHFwcywKKyAgICAg
ICAgbWFwOiBtYXAsCisgICAgICAgIHByb3BlcnR5TmFtZXM6IHByb3BlcnR5TmFtZXMsCisgICAg
ICAgIHN0YXRlczogeworICAgICAgICAgIC8qCisgICAgICAgICAgICBDYWxsZWQgd2hlbiBhIHF1
ZXJ5IHBhcmFtZXRlciBjaGFuZ2VzIGluIHRoZSBVUkwsIHRoaXMgcm91dGUgY2FyZXMKKyAgICAg
ICAgICAgIGFib3V0IHRoYXQgcXVlcnkgcGFyYW1ldGVyLCBidXQgdGhlIHJvdXRlIGlzIG5vdCBj
dXJyZW50bHkKKyAgICAgICAgICAgIGluIHRoZSBhY3RpdmUgcm91dGUgaGllcmFyY2h5LgorICAg
ICAgICAgICovCisgICAgICAgICAgaW5hY3RpdmU6IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkgewor
ICAgICAgICAgICAgdmFyIHFwID0gbWFwW3Byb3BdOworICAgICAgICAgICAgX3RoaXMuX3FwQ2hh
bmdlZChwcm9wLCB2YWx1ZSwgcXApOworICAgICAgICAgIH0sCisgICAgICAgICAgLyoKKyAgICAg
ICAgICAgIENhbGxlZCB3aGVuIGEgcXVlcnkgcGFyYW1ldGVyIGNoYW5nZXMgaW4gdGhlIFVSTCwg
dGhpcyByb3V0ZSBjYXJlcworICAgICAgICAgICAgYWJvdXQgdGhhdCBxdWVyeSBwYXJhbWV0ZXIs
IGFuZCB0aGUgcm91dGUgaXMgY3VycmVudGx5CisgICAgICAgICAgICBpbiB0aGUgYWN0aXZlIHJv
dXRlIGhpZXJhcmNoeS4KKyAgICAgICAgICAqLworICAgICAgICAgIGFjdGl2ZTogZnVuY3Rpb24g
KHByb3AsIHZhbHVlKSB7CisgICAgICAgICAgICB2YXIgcXAgPSBtYXBbcHJvcF07CisgICAgICAg
ICAgICBfdGhpcy5fcXBDaGFuZ2VkKHByb3AsIHZhbHVlLCBxcCk7CisgICAgICAgICAgICByZXR1
cm4gX3RoaXMuX2FjdGl2ZVFQQ2hhbmdlZChtYXBbcHJvcF0sIHZhbHVlKTsKKyAgICAgICAgICB9
LAorICAgICAgICAgIC8qCisgICAgICAgICAgICBDYWxsZWQgd2hlbiBhIHZhbHVlIG9mIGEgcXVl
cnkgcGFyYW1ldGVyIHRoaXMgcm91dGUgaGFuZGxlcyBjaGFuZ2VzIGluIGEgY29udHJvbGxlcgor
ICAgICAgICAgICAgYW5kIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgaW4gdGhlIGFjdGl2ZSByb3V0
ZSBoaWVyYXJjaHkuCisgICAgICAgICAgKi8KKyAgICAgICAgICBhbGxvd092ZXJyaWRlczogZnVu
Y3Rpb24gKHByb3AsIHZhbHVlKSB7CisgICAgICAgICAgICB2YXIgcXAgPSBtYXBbcHJvcF07Cisg
ICAgICAgICAgICBfdGhpcy5fcXBDaGFuZ2VkKHByb3AsIHZhbHVlLCBxcCk7CisgICAgICAgICAg
ICByZXR1cm4gX3RoaXMuX3VwZGF0aW5nUVBDaGFuZ2VkKG1hcFtwcm9wXSk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9OworICAgIH0pLAorCisgICAgLyoqCisgICAgICBAcHJpdmF0
ZQorICAgICAgIEBwcm9wZXJ0eSBfbmFtZXMKKyAgICAqLworICAgIF9uYW1lczogbnVsbCwKKwor
ICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIF9zdGFzaE5hbWVzCisgICAg
Ki8KKyAgICBfc3Rhc2hOYW1lczogZnVuY3Rpb24gKF9oYW5kbGVySW5mbywgZHluYW1pY1BhcmVu
dCkgeworICAgICAgdmFyIGhhbmRsZXJJbmZvID0gX2hhbmRsZXJJbmZvOworICAgICAgaWYgKHRo
aXMuX25hbWVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBuYW1lcyA9
IHRoaXMuX25hbWVzID0gaGFuZGxlckluZm8uX25hbWVzOworCisgICAgICBpZiAoIW5hbWVzLmxl
bmd0aCkgeworICAgICAgICBoYW5kbGVySW5mbyA9IGR5bmFtaWNQYXJlbnQ7CisgICAgICAgIG5h
bWVzID0gaGFuZGxlckluZm8gJiYgaGFuZGxlckluZm8uX25hbWVzIHx8IFtdOworICAgICAgfQor
CisgICAgICB2YXIgcXBzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAu
cXBzJyk7CisgICAgICB2YXIgbGVuID0gcXBzLmxlbmd0aDsKKworICAgICAgdmFyIG5hbWVQYXRo
cyA9IG5ldyBBcnJheShuYW1lcy5sZW5ndGgpOworICAgICAgZm9yICh2YXIgYSA9IDAsIG5sZW4g
PSBuYW1lcy5sZW5ndGg7IGEgPCBubGVuOyArK2EpIHsKKyAgICAgICAgbmFtZVBhdGhzW2FdID0g
aGFuZGxlckluZm8ubmFtZSArICcuJyArIG5hbWVzW2FdOworICAgICAgfQorCisgICAgICBmb3Ig
KHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHZhciBxcCA9IHFwc1tpXTsKKyAg
ICAgICAgaWYgKHFwLnNjb3BlID09PSAnbW9kZWwnKSB7CisgICAgICAgICAgcXAucGFydHMgPSBu
YW1lUGF0aHM7CisgICAgICAgIH0KKyAgICAgICAgcXAucHJlZml4ID0gcXAuY3RybDsKKyAgICAg
IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIEBwcm9wZXJ0eSBf
YWN0aXZlUVBDaGFuZ2VkCisgICAgKi8KKyAgICBfYWN0aXZlUVBDaGFuZ2VkOiBmdW5jdGlvbiAo
cXAsIHZhbHVlKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByb3V0
ZXIuX2FjdGl2ZVFQQ2hhbmdlZChxcC5zY29wZWRQcm9wZXJ0eU5hbWUsIHZhbHVlKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBfdXBkYXRpbmdRUENo
YW5nZWQKKyAgICAqLworICAgIF91cGRhdGluZ1FQQ2hhbmdlZDogZnVuY3Rpb24gKHFwKSB7Cisg
ICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByb3V0ZXIuX3VwZGF0aW5nUVBD
aGFuZ2VkKHFwLnVybEtleSk7CisgICAgfSwKKworICAgIG1lcmdlZFByb3BlcnRpZXM6IFsncXVl
cnlQYXJhbXMnXSwKKworICAgIC8qKgorICAgICAgUmV0cmlldmVzIHBhcmFtZXRlcnMsIGZvciBj
dXJyZW50IHJvdXRlIHVzaW5nIHRoZSBzdGF0ZS5wYXJhbXMKKyAgICAgIHZhcmlhYmxlIGFuZCBn
ZXRRdWVyeVBhcmFtc0ZvciwgdXNpbmcgdGhlIHN1cHBsaWVkIHJvdXRlTmFtZS4KKyAgICAgICBA
bWV0aG9kIHBhcmFtc0ZvcgorICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKKyAgICAgIEBwdWJs
aWMKKyAgICAqLworICAgIHBhcmFtc0ZvcjogZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgIHZhciBy
b3V0ZSA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKS5sb29rdXAoJ3JvdXRlOicgKyBu
YW1lKTsKKworICAgICAgaWYgKCFyb3V0ZSkgeworICAgICAgICByZXR1cm4ge307CisgICAgICB9
CisKKyAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5z
aXRpb247CisgICAgICB2YXIgc3RhdGUgPSB0cmFuc2l0aW9uID8gdHJhbnNpdGlvbi5zdGF0ZSA6
IHRoaXMucm91dGVyLnJvdXRlci5zdGF0ZTsKKworICAgICAgdmFyIHBhcmFtcyA9IHt9OworICAg
ICAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChwYXJhbXMsIHN0YXRlLnBhcmFtc1tuYW1lXSk7
CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHBhcmFtcywgZ2V0UXVlcnlQYXJhbXNG
b3Iocm91dGUsIHN0YXRlKSk7CisKKyAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgU2VyaWFsaXplcyB0aGUgcXVlcnkgcGFyYW1ldGVyIGtleQorICAgICAgIEBt
ZXRob2Qgc2VyaWFsaXplUXVlcnlQYXJhbUtleQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGNvbnRy
b2xsZXJQcm9wZXJ0eU5hbWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBzZXJpYWxpemVR
dWVyeVBhcmFtS2V5OiBmdW5jdGlvbiAoY29udHJvbGxlclByb3BlcnR5TmFtZSkgeworICAgICAg
cmV0dXJuIGNvbnRyb2xsZXJQcm9wZXJ0eU5hbWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
U2VyaWFsaXplcyB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGJhc2VkIG9uIGRlZmF1bHRW
YWx1ZVR5cGUKKyAgICAgICBAbWV0aG9kIHNlcmlhbGl6ZVF1ZXJ5UGFyYW0KKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSB2YWx1ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHVybEtleQorICAgICAgQHBh
cmFtIHtTdHJpbmd9IGRlZmF1bHRWYWx1ZVR5cGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBzZXJpYWxpemVRdWVyeVBhcmFtOiBmdW5jdGlvbiAodmFsdWUsIHVybEtleSwgZGVmYXVsdFZh
bHVlVHlwZSkgeworICAgICAgLy8gdXJsS2V5IGlzbid0IHVzZWQgaGVyZSwgYnV0IGFueW9uZSBv
dmVycmlkaW5nCisgICAgICAvLyBjYW4gdXNlIGl0IHRvIHByb3ZpZGUgc2VyaWFsaXphdGlvbiBz
cGVjaWZpYworICAgICAgLy8gdG8gYSBjZXJ0YWluIHF1ZXJ5IHBhcmFtLgorICAgICAgaWYgKGRl
ZmF1bHRWYWx1ZVR5cGUgPT09ICdhcnJheScpIHsKKyAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5n
aWZ5KHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAnJyArIHZhbHVlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIERlc2VyaWFsaXplcyB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVy
IGJhc2VkIG9uIGRlZmF1bHRWYWx1ZVR5cGUKKyAgICAgICBAbWV0aG9kIGRlc2VyaWFsaXplUXVl
cnlQYXJhbQorICAgICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCisgICAgICBAcGFyYW0ge1N0cmlu
Z30gdXJsS2V5CisgICAgICBAcGFyYW0ge1N0cmluZ30gZGVmYXVsdFZhbHVlVHlwZQorICAgICAg
QHByaXZhdGUKKyAgICAqLworICAgIGRlc2VyaWFsaXplUXVlcnlQYXJhbTogZnVuY3Rpb24gKHZh
bHVlLCB1cmxLZXksIGRlZmF1bHRWYWx1ZVR5cGUpIHsKKyAgICAgIC8vIHVybEtleSBpc24ndCB1
c2VkIGhlcmUsIGJ1dCBhbnlvbmUgb3ZlcnJpZGluZworICAgICAgLy8gY2FuIHVzZSBpdCB0byBw
cm92aWRlIGRlc2VyaWFsaXphdGlvbiBzcGVjaWZpYworICAgICAgLy8gdG8gYSBjZXJ0YWluIHF1
ZXJ5IHBhcmFtLgorCisgICAgICAvLyBVc2UgdGhlIGRlZmF1bHRWYWx1ZVR5cGUgb2YgdGhlIGRl
ZmF1bHQgdmFsdWUgKHRoZSBpbml0aWFsIHZhbHVlIGFzc2lnbmVkIHRvIGEKKyAgICAgIC8vIGNv
bnRyb2xsZXIgcXVlcnkgcGFyYW0gcHJvcGVydHkpLCB0byBpbnRlbGxpZ2VudGx5IGRlc2VyaWFs
aXplIGFuZCBjYXN0LgorICAgICAgaWYgKGRlZmF1bHRWYWx1ZVR5cGUgPT09ICdib29sZWFuJykg
eworICAgICAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTsKKyAgICAg
IH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlVHlwZSA9PT0gJ251bWJlcicpIHsKKyAgICAgICAgcmV0
dXJuIE51bWJlcih2YWx1ZSkudmFsdWVPZigpOworICAgICAgfSBlbHNlIGlmIChkZWZhdWx0VmFs
dWVUeXBlID09PSAnYXJyYXknKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lU3lzdGVt
TmF0aXZlX2FycmF5LkEoSlNPTi5wYXJzZSh2YWx1ZSkpOworICAgICAgfQorICAgICAgcmV0dXJu
IHZhbHVlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgICAgQHByb3Bl
cnR5IF9vcHRpb25zRm9yUXVlcnlQYXJhbQorICAgICovCisgICAgX29wdGlvbnNGb3JRdWVyeVBh
cmFtOiBmdW5jdGlvbiAocXApIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ3F1ZXJ5UGFyYW1zLicgKyBxcC51cmxLZXkpIHx8IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAncXVlcnlQYXJhbXMuJyArIHFwLnByb3ApIHx8IHt9OworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byByZXNldCBjb250cm9s
bGVyIHZhbHVlcyBlaXRoZXIgd2hlbiB0aGUgbW9kZWwKKyAgICAgIGNoYW5nZXMgb3IgdGhlIHJv
dXRlIGlzIGV4aXRpbmcuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkFydGljbGVz
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICAvLyAuLi4KKyAgICAgICAgIHJl
c2V0Q29udHJvbGxlcjogZnVuY3Rpb24oY29udHJvbGxlciwgaXNFeGl0aW5nLCB0cmFuc2l0aW9u
KSB7CisgICAgICAgICAgaWYgKGlzRXhpdGluZykgeworICAgICAgICAgICAgY29udHJvbGxlci5z
ZXQoJ3BhZ2UnLCAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAg
YGBgCisgICAgICAgQG1ldGhvZCByZXNldENvbnRyb2xsZXIKKyAgICAgIEBwYXJhbSB7Q29udHJv
bGxlcn0gY29udHJvbGxlciBpbnN0YW5jZQorICAgICAgQHBhcmFtIHtCb29sZWFufSBpc0V4aXRp
bmcKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2l0aW9uCisgICAgICBAc2luY2UgMS43LjAK
KyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlc2V0Q29udHJvbGxlcjogSywKKworICAgIC8q
KgorICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIGV4aXQKKyAgICAqLworICAgIGV4aXQ6
IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpOworICAgICAgdGhpcy50cmln
Z2VyKCdkZWFjdGl2YXRlJyk7CisgICAgICB0aGlzLnRlYXJkb3duVmlld3MoKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIEBtZXRob2QgX3Jlc2V0CisgICAgICBA
c2luY2UgMS43LjAKKyAgICAqLworICAgIF9yZXNldDogZnVuY3Rpb24gKGlzRXhpdGluZywgdHJh
bnNpdGlvbikgeworICAgICAgdmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXI7CisgICAg
ICBjb250cm9sbGVyLl9xcERlbGVnYXRlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRo
aXMsICdfcXAuc3RhdGVzLmluYWN0aXZlJyk7CisKKyAgICAgIHRoaXMucmVzZXRDb250cm9sbGVy
KGNvbnRyb2xsZXIsIGlzRXhpdGluZywgdHJhbnNpdGlvbik7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIGVudGVyCisgICAgKi8KKyAgICBlbnRlcjog
ZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdOworICAgICAgdGhpcy5h
Y3RpdmF0ZSgpOworICAgICAgdGhpcy50cmlnZ2VyKCdhY3RpdmF0ZScpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFRoZSBuYW1lIG9mIHRoZSB2aWV3IHRvIHVzZSBieSBkZWZhdWx0IHdoZW4g
cmVuZGVyaW5nIHRoaXMgcm91dGVzIHRlbXBsYXRlLgorICAgICAgIFdoZW4gcmVuZGVyaW5nIGEg
dGVtcGxhdGUsIHRoZSByb3V0ZSB3aWxsLCBieSBkZWZhdWx0LCBkZXRlcm1pbmUgdGhlCisgICAg
ICB0ZW1wbGF0ZSBhbmQgdmlldyB0byB1c2UgZnJvbSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgaXRz
ZWxmLiBJZiB5b3UgbmVlZCB0bworICAgICAgZGVmaW5lIGEgc3BlY2lmaWMgdmlldywgc2V0IHRo
aXMgcHJvcGVydHkuCisgICAgICAgVGhpcyBpcyB1c2VmdWwgd2hlbiBtdWx0aXBsZSByb3V0ZXMg
d291bGQgYmVuZWZpdCBmcm9tIHVzaW5nIHRoZSBzYW1lIHZpZXcKKyAgICAgIGJlY2F1c2UgaXQg
ZG9lc24ndCByZXF1aXJlIGEgY3VzdG9tIGByZW5kZXJUZW1wbGF0ZWAgbWV0aG9kLiBGb3IgZXhh
bXBsZSwKKyAgICAgIHRoZSBmb2xsb3dpbmcgcm91dGVzIHdpbGwgYWxsIHJlbmRlciB1c2luZyB0
aGUgYEFwcC5Qb3N0c0xpc3RWaWV3YCB2aWV3OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IHZhciBQb3N0c0xpc3QgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICB2aWV3TmFtZTog
J3Bvc3RzTGlzdCcKKyAgICAgIH0pOworICAgICAgIEFwcC5Qb3N0c0luZGV4Um91dGUgPSBQb3N0
c0xpc3QuZXh0ZW5kKCk7CisgICAgICBBcHAuUG9zdHNBcmNoaXZlZFJvdXRlID0gUG9zdHNMaXN0
LmV4dGVuZCgpOworICAgICAgYGBgCisgICAgICAgQHByb3BlcnR5IHZpZXdOYW1lCisgICAgICBA
dHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBzaW5jZSAxLjQuMAorICAg
ICAgQHB1YmxpYworICAgICovCisgICAgdmlld05hbWU6IG51bGwsCisKKyAgICAvKioKKyAgICAg
IFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byB1c2UgYnkgZGVmYXVsdCB3aGVuIHJlbmRlcmlu
ZyB0aGlzIHJvdXRlcworICAgICAgdGVtcGxhdGUuCisgICAgICAgVGhpcyBpcyBzaW1pbGFyIHdp
dGggYHZpZXdOYW1lYCwgYnV0IGlzIHVzZWZ1bCB3aGVuIHlvdSBqdXN0IHdhbnQgYSBjdXN0b20K
KyAgICAgIHRlbXBsYXRlIHdpdGhvdXQgYSB2aWV3LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIHZhciBQb3N0c0xpc3QgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICB0ZW1wbGF0
ZU5hbWU6ICdwb3N0cy9saXN0JworICAgICAgfSk7CisgICAgICAgQXBwLlBvc3RzSW5kZXhSb3V0
ZSA9IFBvc3RzTGlzdC5leHRlbmQoKTsKKyAgICAgIEFwcC5Qb3N0c0FyY2hpdmVkUm91dGUgPSBQ
b3N0c0xpc3QuZXh0ZW5kKCk7CisgICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgdGVtcGxhdGVO
YW1lCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBzaW5j
ZSAxLjQuMAorICAgICAgQHB1YmxpYworICAgICovCisgICAgdGVtcGxhdGVOYW1lOiBudWxsLAor
CisgICAgLyoqCisgICAgICBUaGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciB0byBhc3NvY2lhdGUg
d2l0aCB0aGlzIHJvdXRlLgorICAgICAgIEJ5IGRlZmF1bHQsIEVtYmVyIHdpbGwgbG9va3VwIGEg
cm91dGUncyBjb250cm9sbGVyIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZQorICAgICAgb2YgdGhlIHJv
dXRlIChpLmUuIGBBcHAuUG9zdENvbnRyb2xsZXJgIGZvciBgQXBwLlBvc3RSb3V0ZWApLiBIb3dl
dmVyLAorICAgICAgaWYgeW91IHdvdWxkIGxpa2UgdG8gZGVmaW5lIGEgc3BlY2lmaWMgY29udHJv
bGxlciB0byB1c2UsIHlvdSBjYW4gZG8gc28KKyAgICAgIHVzaW5nIHRoaXMgcHJvcGVydHkuCisg
ICAgICAgVGhpcyBpcyB1c2VmdWwgaW4gbWFueSB3YXlzLCBhcyB0aGUgY29udHJvbGxlciBzcGVj
aWZpZWQgd2lsbCBiZToKKyAgICAgICAqIHBhc3NlZCB0byB0aGUgYHNldHVwQ29udHJvbGxlcmAg
bWV0aG9kLgorICAgICAgKiB1c2VkIGFzIHRoZSBjb250cm9sbGVyIGZvciB0aGUgdmlldyBiZWlu
ZyByZW5kZXJlZCBieSB0aGUgcm91dGUuCisgICAgICAqIHJldHVybmVkIGZyb20gYSBjYWxsIHRv
IGBjb250cm9sbGVyRm9yYCBmb3IgdGhlIHJvdXRlLgorICAgICAgIEBwcm9wZXJ0eSBjb250cm9s
bGVyTmFtZQorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBA
c2luY2UgMS40LjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNvbnRyb2xsZXJOYW1lOiBu
dWxsLAorCisgICAgLyoqCisgICAgICBUaGUgYHdpbGxUcmFuc2l0aW9uYCBhY3Rpb24gaXMgZmly
ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkKKyAgICAgIGF0dGVtcHRlZCB0cmFuc2l0aW9uIHdp
dGggYSBgVHJhbnNpdGlvbmAgb2JqZWN0IGFzIHRoZSBzb2xlCisgICAgICBhcmd1bWVudC4gVGhp
cyBhY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFib3J0aW5nLCByZWRpcmVjdGluZywKKyAgICAgIG9y
IGRlY29yYXRpbmcgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0
ZXMuCisgICAgICAgQSBnb29kIGV4YW1wbGUgaXMgcHJldmVudGluZyBuYXZpZ2F0aW9uIHdoZW4g
YSBmb3JtIGlzCisgICAgICBoYWxmLWZpbGxlZCBvdXQ6CisgICAgICAgYGBgamF2YXNjcmlwdAor
ICAgICAgQXBwLkNvbnRhY3RGb3JtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAg
ICBhY3Rpb25zOiB7CisgICAgICAgICAgd2lsbFRyYW5zaXRpb246IGZ1bmN0aW9uKHRyYW5zaXRp
b24pIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0KCd1c2VySGFzRW50ZXJl
ZERhdGEnKSkgeworICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGxheU5hdmlnYXRp
b25Db25maXJtKCk7CisgICAgICAgICAgICAgIHRyYW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAg
ICAgWW91IGNhbiBhbHNvIHJlZGlyZWN0IGVsc2V3aGVyZSBieSBjYWxsaW5nCisgICAgICBgdGhp
cy50cmFuc2l0aW9uVG8oJ2Vsc2V3aGVyZScpYCBmcm9tIHdpdGhpbiBgd2lsbFRyYW5zaXRpb25g
LgorICAgICAgTm90ZSB0aGF0IGB3aWxsVHJhbnNpdGlvbmAgd2lsbCBub3QgYmUgZmlyZWQgZm9y
IHRoZQorICAgICAgcmVkaXJlY3RpbmcgYHRyYW5zaXRpb25Ub2AsIHNpbmNlIGB3aWxsVHJhbnNp
dGlvbmAgZG9lc24ndAorICAgICAgZmlyZSB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSB0cmFuc2l0
aW9uIHVuZGVyd2F5LiBJZiB5b3Ugd2FudAorICAgICAgc3Vic2VxdWVudCBgd2lsbFRyYW5zaXRp
b25gIGFjdGlvbnMgdG8gZmlyZSBmb3IgdGhlIHJlZGlyZWN0aW5nCisgICAgICB0cmFuc2l0aW9u
LCB5b3UgbXVzdCBmaXJzdCBleHBsaWNpdGx5IGNhbGwKKyAgICAgIGB0cmFuc2l0aW9uLmFib3J0
KClgLgorICAgICAgIFRvIGFsbG93IHRoZSBgd2lsbFRyYW5zaXRpb25gIGV2ZW50IHRvIGNvbnRp
bnVlIGJ1YmJsaW5nIHRvIHRoZSBwYXJlbnQKKyAgICAgIHJvdXRlLCB1c2UgYHJldHVybiB0cnVl
O2AuIFdoZW4gdGhlIGB3aWxsVHJhbnNpdGlvbmAgbWV0aG9kIGhhcyBhCisgICAgICByZXR1cm4g
dmFsdWUgb2YgYHRydWVgIHRoZW4gdGhlIHBhcmVudCByb3V0ZSdzIGB3aWxsVHJhbnNpdGlvbmAg
bWV0aG9kCisgICAgICB3aWxsIGJlIGZpcmVkLCBlbmFibGluZyAiYnViYmxpbmciIGJlaGF2aW9y
IGZvciB0aGUgZXZlbnQuCisgICAgICAgQGV2ZW50IHdpbGxUcmFuc2l0aW9uCisgICAgICBAcGFy
YW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAg
LyoqCisgICAgICBUaGUgYGRpZFRyYW5zaXRpb25gIGFjdGlvbiBpcyBmaXJlZCBhZnRlciBhIHRy
YW5zaXRpb24gaGFzCisgICAgICBzdWNjZXNzZnVsbHkgYmVlbiBjb21wbGV0ZWQuIFRoaXMgb2Nj
dXJzIGFmdGVyIHRoZSBub3JtYWwgbW9kZWwKKyAgICAgIGhvb2tzIChgYmVmb3JlTW9kZWxgLCBg
bW9kZWxgLCBgYWZ0ZXJNb2RlbGAsIGBzZXR1cENvbnRyb2xsZXJgKQorICAgICAgaGF2ZSByZXNv
bHZlZC4gVGhlIGBkaWRUcmFuc2l0aW9uYCBhY3Rpb24gaGFzIG5vIGFyZ3VtZW50cywKKyAgICAg
IGhvd2V2ZXIsIGl0IGNhbiBiZSB1c2VmdWwgZm9yIHRyYWNraW5nIHBhZ2Ugdmlld3Mgb3IgcmVz
ZXR0aW5nCisgICAgICBzdGF0ZSBvbiB0aGUgY29udHJvbGxlci4KKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBBcHAuTG9naW5Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAg
IGFjdGlvbnM6IHsKKyAgICAgICAgICBkaWRUcmFuc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIHRoaXMuY29udHJvbGxlci5nZXQoJ2Vycm9ycy5iYXNlJykuY2xlYXIoKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOyAvLyBCdWJibGUgdGhlIGRpZFRyYW5zaXRpb24gZXZlbnQKKyAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQGV2ZW50
IGRpZFRyYW5zaXRpb24KKyAgICAgIEBzaW5jZSAxLjIuMAorICAgICAgQHB1YmxpYworICAgICov
CisKKyAgICAvKioKKyAgICAgIFRoZSBgbG9hZGluZ2AgYWN0aW9uIGlzIGZpcmVkIG9uIHRoZSBy
b3V0ZSB3aGVuIGEgcm91dGUncyBgbW9kZWxgCisgICAgICBob29rIHJldHVybnMgYSBwcm9taXNl
IHRoYXQgaXMgbm90IGFscmVhZHkgcmVzb2x2ZWQuIFRoZSBjdXJyZW50CisgICAgICBgVHJhbnNp
dGlvbmAgb2JqZWN0IGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSByb3V0ZSB0aGF0Cisg
ICAgICB0cmlnZ2VyZWQgdGhlIGxvYWRpbmcgZXZlbnQgaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIu
CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJl
ci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgbG9hZGluZzog
ZnVuY3Rpb24odHJhbnNpdGlvbiwgcm91dGUpIHsKKyAgICAgICAgICAgIGxldCBjb250cm9sbGVy
ID0gdGhpcy5jb250cm9sbGVyRm9yKCdmb28nKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0
KCdjdXJyZW50bHlMb2FkaW5nJywgdHJ1ZSk7CisgICAgICAgICAgICAgdHJhbnNpdGlvbi5maW5h
bGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICBjb250cm9sbGVyLnNldCgnY3VycmVudGx5
TG9hZGluZycsIGZhbHNlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAZXZlbnQgbG9hZGluZworICAgICAgQHBh
cmFtIHtUcmFuc2l0aW9ufSB0cmFuc2l0aW9uCisgICAgICBAcGFyYW0ge0VtYmVyLlJvdXRlfSBy
b3V0ZSBUaGUgcm91dGUgdGhhdCB0cmlnZ2VyZWQgdGhlIGxvYWRpbmcgZXZlbnQKKyAgICAgIEBz
aW5jZSAxLjIuMAorICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAvKioKKyAgICAgIFdoZW4g
YXR0ZW1wdGluZyB0byB0cmFuc2l0aW9uIGludG8gYSByb3V0ZSwgYW55IG9mIHRoZSBob29rcwor
ICAgICAgbWF5IHJldHVybiBhIHByb21pc2UgdGhhdCByZWplY3RzLCBhdCB3aGljaCBwb2ludCBh
biBgZXJyb3JgCisgICAgICBhY3Rpb24gd2lsbCBiZSBmaXJlZCBvbiB0aGUgcGFydGlhbGx5LWVu
dGVyZWQgcm91dGVzLCBhbGxvd2luZworICAgICAgZm9yIHBlci1yb3V0ZSBlcnJvciBoYW5kbGlu
ZyBsb2dpYywgb3Igc2hhcmVkIGVycm9yIGhhbmRsaW5nCisgICAgICBsb2dpYyBkZWZpbmVkIG9u
IGEgcGFyZW50IHJvdXRlLgorICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBlcnJvciBo
YW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkCisgICAgICBmb3IgcmVqZWN0ZWQgcHJvbWlzZXMg
ZnJvbSB0aGUgdmFyaW91cyBob29rcyBvbiB0aGUgcm91dGUsCisgICAgICBhcyB3ZWxsIGFzIGFu
eSB1bmhhbmRsZWQgZXJyb3JzIGZyb20gY2hpbGQgcm91dGVzOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIEFwcC5BZG1pblJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAg
YmVmb3JlTW9kZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJl
amVjdCgnYmFkIHRoaW5ncyEnKTsKKyAgICAgICAgfSwKKyAgICAgICAgIGFjdGlvbnM6IHsKKyAg
ICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IsIHRyYW5zaXRpb24pIHsKKyAgICAgICAgICAg
IC8vIEFzc3VtaW5nIHdlIGdvdCBoZXJlIGR1ZSB0byB0aGUgZXJyb3IgaW4gYGJlZm9yZU1vZGVs
YCwKKyAgICAgICAgICAgIC8vIHdlIGNhbiBleHBlY3QgdGhhdCBlcnJvciA9PT0gImJhZCB0aGlu
Z3MhIiwKKyAgICAgICAgICAgIC8vIGJ1dCBhIHByb21pc2UgbW9kZWwgcmVqZWN0aW5nIHdvdWxk
IGFsc28KKyAgICAgICAgICAgIC8vIGNhbGwgdGhpcyBob29rLCBhcyB3b3VsZCBhbnkgZXJyb3Jz
IGVuY291bnRlcmVkCisgICAgICAgICAgICAvLyBpbiBgYWZ0ZXJNb2RlbGAuCisgICAgICAgICAg
ICAgLy8gVGhlIGBlcnJvcmAgaG9vayBpcyBhbHNvIHByb3ZpZGVkIHRoZSBmYWlsZWQKKyAgICAg
ICAgICAgIC8vIGB0cmFuc2l0aW9uYCwgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQgbGF0ZXIKKyAg
ICAgICAgICAgIC8vIGAucmV0cnkoKWBkIGlmIGRlc2lyZWQuCisgICAgICAgICAgICAgdGhpcy50
cmFuc2l0aW9uVG8oJ2xvZ2luJyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIGBlcnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJsZSB1cCBhbGwgdGhl
IHdheSB0byBgQXBwbGljYXRpb25Sb3V0ZWAKKyAgICAgIHdpbGwgZmlyZSBhIGRlZmF1bHQgZXJy
b3IgaGFuZGxlciB0aGF0IGxvZ3MgdGhlIGVycm9yLiBZb3UgY2FuCisgICAgICBzcGVjaWZ5IHlv
dXIgb3duIGdsb2JhbCBkZWZhdWx0IGVycm9yIGhhbmRsZXIgYnkgb3ZlcnJpZGluZyB0aGUKKyAg
ICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBwbGljYXRpb25Sb3V0ZWA6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
eworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yLCB0
cmFuc2l0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ2Jhbm5lcicpLmRp
c3BsYXlFcnJvcihlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgYGBgCisgICAgICBAZXZlbnQgZXJyb3IKKyAgICAgIEBwYXJhbSB7RXJyb3J9
IGVycm9yCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEBwdWJs
aWMKKyAgICAqLworCisgICAgLyoqCisgICAgICBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVu
IHRoZSByb3V0ZXIgZW50ZXJzIHRoZSByb3V0ZS4gSXQgaXMKKyAgICAgIG5vdCBleGVjdXRlZCB3
aGVuIHRoZSBtb2RlbCBmb3IgdGhlIHJvdXRlIGNoYW5nZXMuCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAg
ICAgICBjb2xsZWN0QW5hbHl0aWNzOiBmdW5jdGlvbigpeworICAgICAgICAgIGNvbGxlY3RBbmFs
eXRpY3MoKTsKKyAgICAgICAgfS5vbignYWN0aXZhdGUnKQorICAgICAgfSk7CisgICAgICBgYGAK
KyAgICAgICBAZXZlbnQgYWN0aXZhdGUKKyAgICAgIEBzaW5jZSAxLjkuMAorICAgICAgQHB1Ymxp
YworICAgICovCisKKyAgICAvKioKKyAgICAgIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4g
dGhlIHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMKKyAgICAgIHJvdXRlLiBJdCBpcyBub3Qg
ZXhlY3V0ZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK
KyAgICAgICAgdHJhY2tQYWdlTGVhdmVBbmFseXRpY3M6IGZ1bmN0aW9uKCl7CisgICAgICAgICAg
dHJhY2tQYWdlTGVhdmVBbmFseXRpY3MoKTsKKyAgICAgICAgfS5vbignZGVhY3RpdmF0ZScpCisg
ICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBldmVudCBkZWFjdGl2YXRlCisgICAgICBAc2lu
Y2UgMS45LjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAgLyoqCisgICAgICBUaGUgY29u
dHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KKyAgICAgICBFeGFtcGxlCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkZvcm1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rp
b24odHJhbnNpdGlvbikgeworICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5nZXQoJ3Vz
ZXJIYXNFbnRlcmVkRGF0YScpICYmCisgICAgICAgICAgICAgICAgIWNvbmZpcm0oJ0FyZSB5b3Ug
c3VyZSB5b3Ugd2FudCB0byBhYmFuZG9uIHByb2dyZXNzPycpKSB7CisgICAgICAgICAgICAgIHRy
YW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8v
IEJ1YmJsZSB0aGUgYHdpbGxUcmFuc2l0aW9uYCBhY3Rpb24gc28gdGhhdAorICAgICAgICAgICAg
ICAvLyBwYXJlbnQgcm91dGVzIGNhbiBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gYWJvcnQuCisg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgY29udHJvbGxl
cgorICAgICAgQHR5cGUgRW1iZXIuQ29udHJvbGxlcgorICAgICAgQHNpbmNlIDEuNi4wCisgICAg
ICBAcHVibGljCisgICAgKi8KKworICAgIGFjdGlvbnM6IHsKKworICAgICAgcXVlcnlQYXJhbXNE
aWRDaGFuZ2U6IGZ1bmN0aW9uIChjaGFuZ2VkLCB0b3RhbFByZXNlbnQsIHJlbW92ZWQpIHsKKyAg
ICAgICAgdmFyIHFwTWFwID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAn
KS5tYXA7CisKKyAgICAgICAgdmFyIHRvdGFsQ2hhbmdlZCA9IE9iamVjdC5rZXlzKGNoYW5nZWQp
LmNvbmNhdChPYmplY3Qua2V5cyhyZW1vdmVkKSk7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBs
ZW4gPSB0b3RhbENoYW5nZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICB2YXIg
cXAgPSBxcE1hcFt0b3RhbENoYW5nZWRbaV1dOworICAgICAgICAgIGlmIChxcCAmJiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcy5fb3B0aW9uc0ZvclF1ZXJ5UGFyYW0ocXApLCAncmVm
cmVzaE1vZGVsJykgJiYgdGhpcy5yb3V0ZXIuY3VycmVudFN0YXRlKSB7CisgICAgICAgICAgICB0
aGlzLnJlZnJlc2goKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgIH0sCisKKyAgICAgIGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZTogZnVuY3Rp
b24gKHBhcmFtcywgZmluYWxQYXJhbXMsIHRyYW5zaXRpb24pIHsKKyAgICAgICAgaWYgKHRoaXMu
cm91dGVOYW1lICE9PSAnYXBwbGljYXRpb24nKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBUcmFuc2l0aW9uIG9iamVjdCBpcyBhYnNlbnQgZm9yIGlu
dGVybWVkaWF0ZSB0cmFuc2l0aW9ucy4KKyAgICAgICAgaWYgKCF0cmFuc2l0aW9uKSB7CisgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IHRy
YW5zaXRpb24uc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7CisgICAgICAgIHZhciBxcE1ldGEgPSByb3V0ZXIuX3F1ZXJ5UGFyYW1zRm9yKGhhbmRs
ZXJJbmZvc1toYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSk7CisgICAgICAgIHZhciBjaGFu
Z2VzID0gcm91dGVyLl9xcFVwZGF0ZXM7CisgICAgICAgIHZhciByZXBsYWNlVXJsOworCisgICAg
ICAgIF9lbWJlclJvdXRpbmdVdGlscy5zdGFzaFBhcmFtTmFtZXMocm91dGVyLCBoYW5kbGVySW5m
b3MpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBxcE1ldGEucXBzLmxlbmd0aDsg
aSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgdmFyIHFwID0gcXBNZXRhLnFwc1tpXTsKKyAgICAg
ICAgICB2YXIgcm91dGUgPSBxcC5yb3V0ZTsKKyAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJv
dXRlLmNvbnRyb2xsZXI7CisgICAgICAgICAgdmFyIHByZXNlbnRLZXkgPSBxcC51cmxLZXkgaW4g
cGFyYW1zICYmIHFwLnVybEtleTsKKworICAgICAgICAgIC8vIERvIGEgcmV2ZXJzZSBsb29rdXAg
dG8gc2VlIGlmIHRoZSBjaGFuZ2VkIHF1ZXJ5CisgICAgICAgICAgLy8gcGFyYW0gVVJMIGtleSBj
b3JyZXNwb25kcyB0byBhIFFQIHByb3BlcnR5IG9uCisgICAgICAgICAgLy8gdGhpcyBjb250cm9s
bGVyLgorICAgICAgICAgIHZhciB2YWx1ZSwgc3ZhbHVlOworICAgICAgICAgIGlmIChjaGFuZ2Vz
ICYmIHFwLnVybEtleSBpbiBjaGFuZ2VzKSB7CisgICAgICAgICAgICAvLyBWYWx1ZSB1cGRhdGVk
IGluL2JlZm9yZSBzZXR1cENvbnRyb2xsZXIKKyAgICAgICAgICAgIHZhbHVlID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXIsIHFwLnByb3ApOworICAgICAgICAgICAgc3Zh
bHVlID0gcm91dGUuc2VyaWFsaXplUXVlcnlQYXJhbSh2YWx1ZSwgcXAudXJsS2V5LCBxcC50eXBl
KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByZXNlbnRLZXkpIHsKKyAg
ICAgICAgICAgICAgc3ZhbHVlID0gcGFyYW1zW3ByZXNlbnRLZXldOworICAgICAgICAgICAgICB2
YWx1ZSA9IHJvdXRlLmRlc2VyaWFsaXplUXVlcnlQYXJhbShzdmFsdWUsIHFwLnVybEtleSwgcXAu
dHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBObyBRUCBwcm92
aWRlZDsgdXNlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICAgIHN2YWx1ZSA9IHFwLnNlcmlh
bGl6ZWREZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgIHZhbHVlID0gY29weURlZmF1bHRWYWx1
ZShxcC5kZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAg
ICAgIGNvbnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
cm91dGUsICdfcXAuc3RhdGVzLmluYWN0aXZlJyk7CisKKyAgICAgICAgICB2YXIgdGhpc1F1ZXJ5
UGFyYW1DaGFuZ2VkID0gc3ZhbHVlICE9PSBxcC5zZXJpYWxpemVkVmFsdWU7CisgICAgICAgICAg
aWYgKHRoaXNRdWVyeVBhcmFtQ2hhbmdlZCkgeworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24u
cXVlcnlQYXJhbXNPbmx5ICYmIHJlcGxhY2VVcmwgIT09IGZhbHNlKSB7CisgICAgICAgICAgICAg
IHZhciBvcHRpb25zID0gcm91dGUuX29wdGlvbnNGb3JRdWVyeVBhcmFtKHFwKTsKKyAgICAgICAg
ICAgICAgdmFyIHJlcGxhY2VDb25maWdWYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dChvcHRpb25zLCAncmVwbGFjZScpOworICAgICAgICAgICAgICBpZiAocmVwbGFjZUNvbmZpZ1Zh
bHVlKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZVVybCA9IHRydWU7CisgICAgICAgICAgICAg
IH0gZWxzZSBpZiAocmVwbGFjZUNvbmZpZ1ZhbHVlID09PSBmYWxzZSkgeworICAgICAgICAgICAg
ICAgIC8vIEV4cGxpY2l0IHB1c2hTdGF0ZSB3aW5zIG92ZXIgYW55IG90aGVyIHJlcGxhY2VTdGF0
ZXMuCisgICAgICAgICAgICAgICAgcmVwbGFjZVVybCA9IGZhbHNlOworICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dChjb250cm9sbGVyLCBxcC5wcm9wLCB2YWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAg
Ly8gU3Rhc2ggY3VycmVudCBzZXJpYWxpemVkIHZhbHVlIG9mIGNvbnRyb2xsZXIuCisgICAgICAg
ICAgcXAuc2VyaWFsaXplZFZhbHVlID0gc3ZhbHVlOworCisgICAgICAgICAgdmFyIHRoaXNRdWVy
eVBhcmFtSGFzRGVmYXVsdFZhbHVlID0gcXAuc2VyaWFsaXplZERlZmF1bHRWYWx1ZSA9PT0gc3Zh
bHVlOworICAgICAgICAgIGlmICghdGhpc1F1ZXJ5UGFyYW1IYXNEZWZhdWx0VmFsdWUpIHsKKyAg
ICAgICAgICAgIGZpbmFsUGFyYW1zLnB1c2goeworICAgICAgICAgICAgICB2YWx1ZTogc3ZhbHVl
LAorICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLAorICAgICAgICAgICAgICBrZXk6IHByZXNl
bnRLZXkgfHwgcXAudXJsS2V5CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAocmVwbGFjZVVybCkgeworICAgICAgICAgIHRyYW5zaXRpb24ubWV0
aG9kKCdyZXBsYWNlJyk7CisgICAgICAgIH0KKworICAgICAgICBxcE1ldGEucXBzLmZvckVhY2go
ZnVuY3Rpb24gKHFwKSB7CisgICAgICAgICAgdmFyIHJvdXRlUXBNZXRhID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHFwLnJvdXRlLCAnX3FwJyk7CisgICAgICAgICAgdmFyIGZpbmFsaXpl
ZENvbnRyb2xsZXIgPSBxcC5yb3V0ZS5jb250cm9sbGVyOworICAgICAgICAgIGZpbmFsaXplZENv
bnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGVR
cE1ldGEsICdzdGF0ZXMuYWN0aXZlJyk7CisgICAgICAgIH0pOworCisgICAgICAgIHJvdXRlci5f
cXBVcGRhdGVzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGlz
IGhvb2sgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcm91dGVyIGNvbXBsZXRlbHkgZXhpdHMgdGhpcyBy
b3V0ZS4gSXQgaXMKKyAgICAgIG5vdCBleGVjdXRlZCB3aGVuIHRoZSBtb2RlbCBmb3IgdGhlIHJv
dXRlIGNoYW5nZXMuCisgICAgICAgQG1ldGhvZCBkZWFjdGl2YXRlCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBkZWFjdGl2YXRlOiBLLAorCisgICAgLyoqCisgICAgICBUaGlzIGhvb2sgaXMg
ZXhlY3V0ZWQgd2hlbiB0aGUgcm91dGVyIGVudGVycyB0aGUgcm91dGUuIEl0IGlzIG5vdCBleGVj
dXRlZAorICAgICAgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgorICAgICAg
IEBtZXRob2QgYWN0aXZhdGUKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGFjdGl2YXRlOiBL
LAorCisgICAgLyoqCisgICAgICBUcmFuc2l0aW9uIHRoZSBhcHBsaWNhdGlvbiBpbnRvIGFub3Ro
ZXIgcm91dGUuIFRoZSByb3V0ZSBtYXkKKyAgICAgIGJlIGVpdGhlciBhIHNpbmdsZSByb3V0ZSBv
ciByb3V0ZSBwYXRoOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNpdGlv
blRvKCdibG9nUG9zdHMnKTsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nUG9zdHMucmVj
ZW50RW50cmllcycpOworICAgICAgYGBgCisgICAgICAgT3B0aW9uYWxseSBzdXBwbHkgYSBtb2Rl
bCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBUaGUgbW9kZWwKKyAgICAgIHdpbGwgYmUgc2Vy
aWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhlIGBzZXJpYWxpemVgIGhvb2sgb2YKKyAgICAg
IHRoZSByb3V0ZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB0aGlzLnRyYW5zaXRpb25U
bygnYmxvZ1Bvc3QnLCBhUG9zdCk7CisgICAgICBgYGAKKyAgICAgICBJZiBhIGxpdGVyYWwgaXMg
cGFzc2VkIChzdWNoIGFzIGEgbnVtYmVyIG9yIGEgc3RyaW5nKSwgaXQgd2lsbAorICAgICAgYmUg
dHJlYXRlZCBhcyBhbiBpZGVudGlmaWVyIGluc3RlYWQuIEluIHRoaXMgY2FzZSwgdGhlIGBtb2Rl
bGAKKyAgICAgIGhvb2sgb2YgdGhlIHJvdXRlIHdpbGwgYmUgdHJpZ2dlcmVkOgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nUG9zdCcsIDEpOworICAg
ICAgYGBgCisgICAgICAgTXVsdGlwbGUgbW9kZWxzIHdpbGwgYmUgYXBwbGllZCBsYXN0IHRvIGZp
cnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQorICAgICAgcm91dGUgdHJlZS4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5y
b3V0ZSgnYmxvZ1Bvc3QnLCB7IHBhdGg6JzpibG9nUG9zdElkJyB9LCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICB0aGlzLnJvdXRlKCdibG9nQ29tbWVudCcsIHsgcGF0aDogJzpibG9nQ29tbWVudElk
JywgcmVzZXROYW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAg
ICAgdGhpcy50cmFuc2l0aW9uVG8oJ2Jsb2dDb21tZW50JywgYVBvc3QsIGFDb21tZW50KTsKKyAg
ICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nQ29tbWVudCcsIDEsIDEzKTsKKyAgICAgIGBgYAor
ICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcGFzcyBhIFVSTCAoYSBzdHJpbmcgdGhhdCBz
dGFydHMgd2l0aCBhCisgICAgICBgL2ApLiBUaGlzIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nIGFu
ZCBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kCisgICAgICBzaG91bGQgcmFyZWx5IGJlIHVzZWQgaW4g
cHJvZHVjdGlvbiBjb2RlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNp
dGlvblRvKCcvJyk7CisgICAgICB0aGlzLnRyYW5zaXRpb25UbygnL2Jsb2cvcG9zdC8xL2NvbW1l
bnQvMTMnKTsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCcvYmxvZy9wb3N0cz9zb3J0PXRpdGxl
Jyk7CisgICAgICBgYGAKKyAgICAgICBBbiBvcHRpb25zIGhhc2ggd2l0aCBhIGBxdWVyeVBhcmFt
c2AgcHJvcGVydHkgbWF5IGJlIHByb3ZpZGVkIGFzCisgICAgICB0aGUgZmluYWwgYXJndW1lbnQg
dG8gYWRkIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIGRlc3RpbmF0aW9uIFVSTC4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB0aGlzLnRyYW5zaXRpb25UbygnYmxvZ1Bvc3QnLCAxLCB7Cisg
ICAgICAgIHF1ZXJ5UGFyYW1zOiB7c2hvd0NvbW1lbnRzOiAndHJ1ZSd9CisgICAgICB9KTsKKyAg
ICAgICAvLyBpZiB5b3UganVzdCB3YW50IHRvIHRyYW5zaXRpb24gdGhlIHF1ZXJ5IHBhcmFtZXRl
cnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgcm91dGUKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKHtx
dWVyeVBhcmFtczoge3NvcnQ6ICdkYXRlJ319KTsKKyAgICAgIGBgYAorICAgICAgIFNlZSBhbHNv
IFtyZXBsYWNlV2l0aF0oI21ldGhvZF9yZXBsYWNlV2l0aCkuCisgICAgICAgU2ltcGxlIFRyYW5z
aXRpb24gRXhhbXBsZQorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdpbmRleCcpOworICAgICAgICB0aGlz
LnJvdXRlKCdzZWNyZXQnKTsKKyAgICAgICAgdGhpcy5yb3V0ZSgnZm91ck9oRm91cicsIHsgcGF0
aDogJyo6JyB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIG1vdmVUb1NlY3JldDog
ZnVuY3Rpb24oY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQoKSkgeworICAg
ICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubygnc2VjcmV0JywgY29udGV4dCk7CisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygnZm91ck9oRm91
cicpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBUcmFuc2l0aW9uIHRvIGEgbmVzdGVkIHJvdXRlCisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRo
aXMucm91dGUoJ2FydGljbGVzJywgeyBwYXRoOiAnL2FydGljbGVzJyB9LCBmdW5jdGlvbigpIHsK
KyAgICAgICAgICB0aGlzLnJvdXRlKCduZXcnKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAg
ICAgICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGFjdGlv
bnM6IHsKKyAgICAgICAgICB0cmFuc2l0aW9uVG9OZXdBcnRpY2xlOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdhcnRpY2xlcy5uZXcnKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgTXVsdGlwbGUgTW9kZWxz
IEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgnaW5kZXgnKTsKKyAgICAgICAgIHRoaXMucm91
dGUoJ2JyZWFrZmFzdCcsIHsgcGF0aDogJzpicmVha2Zhc3RJZCcgfSwgZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgdGhpcy5yb3V0ZSgnY2VyZWFsJywgeyBwYXRoOiAnOmNlcmVhbElkJywgcmVzZXRO
YW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAgQXBwLklu
ZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAg
ICAgICAgbW92ZVRvQ2hvY29sYXRlQ2VyZWFsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZh
ciBjZXJlYWwgPSB7IGNlcmVhbElkOiAnQ2hvY29sYXRlWXVtbWluZXNzJyB9OworICAgICAgICAg
ICAgdmFyIGJyZWFrZmFzdCA9IHsgYnJlYWtmYXN0SWQ6ICdDZXJlYWxBbmRNaWxrJyB9OworICAg
ICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdjZXJlYWwnLCBicmVha2Zhc3QsIGNlcmVhbCk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIE5l
c3RlZCBSb3V0ZSB3aXRoIFF1ZXJ5IFN0cmluZyBFeGFtcGxlCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucm91dGUo
J2ZydWl0cycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ2FwcGxlcycpOwor
ICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHRyYW5zaXRpb25Ub0Fw
cGxlczogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygnZnJ1aXRz
LmFwcGxlcycsIHtxdWVyeVBhcmFtczoge2NvbG9yOiAncmVkJ319KTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCB0cmFuc2l0aW9u
VG8KKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZSBvciBh
IFVSTAorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgb3IgaWRl
bnRpZmllcihzKSB0byBiZSB1c2VkIHdoaWxlCisgICAgICAgIHRyYW5zaXRpb25pbmcgdG8gdGhl
IHJvdXRlLgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBoYXNoIHdp
dGggYSBxdWVyeVBhcmFtcyBwcm9wZXJ0eQorICAgICAgICBjb250YWluaW5nIGEgbWFwcGluZyBv
ZiBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGUgdHJhbnNp
dGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgICAgYXR0ZW1wdGVkIHRyYW5z
aXRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHRyYW5zaXRpb25UbzogZnVuY3Rpb24g
KG5hbWUsIGNvbnRleHQpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKKyAgICAg
IHJldHVybiByb3V0ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJndW1lbnRzKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBQZXJmb3JtIGEgc3luY2hyb25vdXMgdHJhbnNpdGlvbiBp
bnRvIGFub3RoZXIgcm91dGUgd2l0aG91dCBhdHRlbXB0aW5nCisgICAgICB0byByZXNvbHZlIHBy
b21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1cnJlbnRseSBhY3RpdmUKKyAg
ICAgIGFzeW5jaHJvbm91cyB0cmFuc2l0aW9ucyAoaS5lLiByZWd1bGFyIHRyYW5zaXRpb25zIGNh
dXNlZCBieQorICAgICAgYHRyYW5zaXRpb25Ub2Agb3IgVVJMIGNoYW5nZXMpLgorICAgICAgIFRo
aXMgbWV0aG9kIGlzIGhhbmR5IGZvciBwZXJmb3JtaW5nIGludGVybWVkaWF0ZSB0cmFuc2l0aW9u
cyBvbiB0aGUKKyAgICAgIHdheSB0byBhIGZpbmFsIGRlc3RpbmF0aW9uIHJvdXRlLCBhbmQgaXMg
Y2FsbGVkIGludGVybmFsbHkgYnkgdGhlCisgICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBv
ZiB0aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRsZXJzLgorICAgICAgIEBtZXRob2QgaW50
ZXJtZWRpYXRlVHJhbnNpdGlvblRvCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFt
ZSBvZiB0aGUgcm91dGUKKyAgICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVs
KHMpIHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlvbmluZworICAgICAgdG8gdGhlIHJvdXRlLgor
ICAgICAgQHNpbmNlIDEuMi4wCisgICAgICBAcHVibGljCisgICAgICovCisgICAgaW50ZXJtZWRp
YXRlVHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7CisgICAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJvdXRl
ciwgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZWZyZXNoIHRoZSBtb2Rl
bCBvbiB0aGlzIHJvdXRlIGFuZCBhbnkgY2hpbGQgcm91dGVzLCBmaXJpbmcgdGhlCisgICAgICBg
YmVmb3JlTW9kZWxgLCBgbW9kZWxgLCBhbmQgYGFmdGVyTW9kZWxgIGhvb2tzIGluIGEgc2ltaWxh
ciBmYXNoaW9uCisgICAgICB0byBob3cgcm91dGVzIGFyZSBlbnRlcmVkIHdoZW4gdHJhbnNpdGlv
bmluZyBpbiBmcm9tIG90aGVyIHJvdXRlLgorICAgICAgVGhlIGN1cnJlbnQgcm91dGUgcGFyYW1z
IChlLmcuIGBhcnRpY2xlX2lkYCkgd2lsbCBiZSBwYXNzZWQgaW4KKyAgICAgIHRvIHRoZSByZXNw
ZWN0aXZlIG1vZGVsIGhvb2tzLCBhbmQgaWYgYSBkaWZmZXJlbnQgbW9kZWwgaXMgcmV0dXJuZWQs
CisgICAgICBgc2V0dXBDb250cm9sbGVyYCBhbmQgYXNzb2NpYXRlZCByb3V0ZSBob29rcyB3aWxs
IHJlLWZpcmUgYXMgd2VsbC4KKyAgICAgICBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbWV0aG9k
IGlzIHJlLXF1ZXJ5aW5nIHRoZSBzZXJ2ZXIgZm9yIHRoZQorICAgICAgbGF0ZXN0IGluZm9ybWF0
aW9uIHVzaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgd2hlbiB0aGUgcm91dGUKKyAgICAgIHdh
cyBmaXJzdCBlbnRlcmVkLgorICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UgYG1vZGVs
YCBob29rcyB0byBmaXJlIGV2ZW4gb24gcm91dGVzCisgICAgICB0aGF0IHdlcmUgcHJvdmlkZWQg
YSBtb2RlbCBvYmplY3Qgd2hlbiB0aGUgcm91dGUgd2FzIGluaXRpYWxseQorICAgICAgZW50ZXJl
ZC4KKyAgICAgICBAbWV0aG9kIHJlZnJlc2gKKyAgICAgIEByZXR1cm4ge1RyYW5zaXRpb259IHRo
ZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAgICBhdHRlbXB0
ZWQgdHJhbnNpdGlvbgorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgICov
CisgICAgcmVmcmVzaDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnJv
dXRlci5yZWZyZXNoKHRoaXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRyYW5zaXRpb24g
aW50byBhbm90aGVyIHJvdXRlIHdoaWxlIHJlcGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGlmIHBv
c3NpYmxlLgorICAgICAgVGhpcyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRy
eSBpbnN0ZWFkIG9mIGFkZGluZyBhIG5ldyBvbmUuCisgICAgICBCZXNpZGUgdGhhdCwgaXQgaXMg
aWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9gIGluIGFsbCBvdGhlciByZXNwZWN0cy4gU2VlCisg
ICAgICAndHJhbnNpdGlvblRvJyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcg
bXVsdGlwbGUgbW9kZWxzLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgnaW5k
ZXgnKTsKKyAgICAgICAgdGhpcy5yb3V0ZSgnc2VjcmV0Jyk7CisgICAgICB9KTsKKyAgICAgICBB
cHAuU2VjcmV0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhZnRlck1vZGVs
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBpZiAoIWF1dGhvcml6ZWQoKSl7CisgICAgICAgICAg
ICB0aGlzLnJlcGxhY2VXaXRoKCdpbmRleCcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlcGxhY2VXaXRoCisgICAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgb3IgYSBVUkwKKyAgICAgIEBw
YXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIG9yIGlkZW50aWZpZXIocykgdG8g
YmUgdXNlZCB3aGlsZQorICAgICAgICB0cmFuc2l0aW9uaW5nIHRvIHRoZSByb3V0ZS4KKyAgICAg
IEByZXR1cm4ge1RyYW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdp
dGggdGhpcworICAgICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0
aGlzLnJvdXRlcjsKKyAgICAgIHJldHVybiByb3V0ZXIucmVwbGFjZVdpdGguYXBwbHkocm91dGVy
LCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNlbmRzIGFuIGFjdGlvbiB0
byB0aGUgcm91dGVyLCB3aGljaCB3aWxsIGRlbGVnYXRlIGl0IHRvIHRoZSBjdXJyZW50bHkKKyAg
ICAgIGFjdGl2ZSByb3V0ZSBoaWVyYXJjaHkgcGVyIHRoZSBidWJibGluZyBydWxlcyBleHBsYWlu
ZWQgdW5kZXIgYGFjdGlvbnNgLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgn
aW5kZXgnKTsKKyAgICAgIH0pOworICAgICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHRyYWNrOiBmdW5j
dGlvbihhcmcpIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGFyZywgJ3dhcyBjbGlja2VkJyk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgICBBcHAuSW5kZXhSb3V0
ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICB0
cmFja0lmRGVidWc6IGZ1bmN0aW9uKGFyZykgeworICAgICAgICAgICAgaWYgKGRlYnVnKSB7Cisg
ICAgICAgICAgICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOworICAgICAgICAgICAgfQorICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IHNlbmQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
dG8gdHJpZ2dlcgorICAgICAgQHBhcmFtIHsuLi4qfSBhcmdzCisgICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBzZW5kOiBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1l
bnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9r
ZXkrKykgeworICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQor
CisgICAgICBpZiAodGhpcy5yb3V0ZXIgJiYgdGhpcy5yb3V0ZXIucm91dGVyIHx8ICFfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC50ZXN0aW5nKSB7CisgICAgICAgIHZhciBfcm91dGVyOworCisgICAg
ICAgIChfcm91dGVyID0gdGhpcy5yb3V0ZXIpLnNlbmQuYXBwbHkoX3JvdXRlciwgYXJncyk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF07CisgICAgICAgIGFyZ3Mg
PSBzbGljZS5jYWxsKGFyZ3MsIDEpOworICAgICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb25z
W25hbWVdOworICAgICAgICBpZiAoYWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0
aW9uc1tuYW1lXS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0s
CisKKyAgICAvKioKKyAgICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRl
ci5qcworICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHNldHVwCisgICAgKi8KKyAgICBz
ZXR1cDogZnVuY3Rpb24gKGNvbnRleHQsIHRyYW5zaXRpb24pIHsKKyAgICAgIHZhciBjb250cm9s
bGVyOworCisgICAgICB2YXIgY29udHJvbGxlck5hbWUgPSB0aGlzLmNvbnRyb2xsZXJOYW1lIHx8
IHRoaXMucm91dGVOYW1lOworICAgICAgdmFyIGRlZmluZWRDb250cm9sbGVyID0gdGhpcy5jb250
cm9sbGVyRm9yKGNvbnRyb2xsZXJOYW1lLCB0cnVlKTsKKworICAgICAgaWYgKCFkZWZpbmVkQ29u
dHJvbGxlcikgeworICAgICAgICBjb250cm9sbGVyID0gdGhpcy5nZW5lcmF0ZUNvbnRyb2xsZXIo
Y29udHJvbGxlck5hbWUsIGNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udHJv
bGxlciA9IGRlZmluZWRDb250cm9sbGVyOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ24gdGhl
IHJvdXRlJ3MgY29udHJvbGxlciBzbyB0aGF0IGl0IGNhbiBtb3JlIGVhc2lseSBiZQorICAgICAg
Ly8gcmVmZXJlbmNlZCBpbiBhY3Rpb24gaGFuZGxlcnMuIFNpZGUgZWZmZWN0cy4gU2lkZSBlZmZl
Y3RzIGV2ZXJ5d2hlcmUuCisgICAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgeworICAgICAgICB2
YXIgcHJvcE5hbWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAucHJv
cGVydHlOYW1lcycpOworICAgICAgICBhZGRRdWVyeVBhcmFtc09ic2VydmVycyhjb250cm9sbGVy
LCBwcm9wTmFtZXMpOworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAg
ICAgfQorCisgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ19xcCcpOworCisgICAgICB2YXIgc3RhdGVzID0gcXVlcnlQYXJhbXMuc3RhdGVz
OworICAgICAgaWYgKHRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBtb2RlbCBk
ZXAgdmFsdWVzIHVzZWQgdG8gY2FsY3VsYXRlIGNhY2hlIGtleXMuCisgICAgICAgIF9lbWJlclJv
dXRpbmdVdGlscy5zdGFzaFBhcmFtTmFtZXModGhpcy5yb3V0ZXIsIHRyYW5zaXRpb24uc3RhdGUu
aGFuZGxlckluZm9zKTsKKworICAgICAgICB2YXIgcGFyYW1zID0gdHJhbnNpdGlvbi5wYXJhbXM7
CisgICAgICAgIHZhciBhbGxQYXJhbXMgPSBxdWVyeVBhcmFtcy5wcm9wZXJ0eU5hbWVzOworICAg
ICAgICB2YXIgY2FjaGUgPSB0aGlzLl9idWNrZXRDYWNoZTsKKworICAgICAgICBhbGxQYXJhbXMu
Zm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeworICAgICAgICAgIHZhciBhUXAgPSBxdWVyeVBhcmFt
cy5tYXBbcHJvcF07CisKKyAgICAgICAgICBhUXAudmFsdWVzID0gcGFyYW1zOworICAgICAgICAg
IHZhciBjYWNoZUtleSA9IF9lbWJlclJvdXRpbmdVdGlscy5jYWxjdWxhdGVDYWNoZUtleShhUXAu
cHJlZml4LCBhUXAucGFydHMsIGFRcC52YWx1ZXMpOworCisgICAgICAgICAgaWYgKGNhY2hlKSB7
CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBjYWNoZS5sb29rdXAoY2FjaGVLZXksIHByb3AsIGFR
cC51bmRlY29yYXRlZERlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQoY29udHJvbGxlciwgcHJvcCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAg
ICAgfSk7CisgICAgICB9CisKKyAgICAgIGNvbnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBzdGF0ZXMu
YWxsb3dPdmVycmlkZXM7CisKKyAgICAgIGlmICh0cmFuc2l0aW9uKSB7CisgICAgICAgIHZhciBx
cFZhbHVlcyA9IGdldFF1ZXJ5UGFyYW1zRm9yKHRoaXMsIHRyYW5zaXRpb24uc3RhdGUpOworICAg
ICAgICBjb250cm9sbGVyLnNldFByb3BlcnRpZXMocXBWYWx1ZXMpOworICAgICAgfQorCisgICAg
ICB0aGlzLnNldHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBjb250ZXh0LCB0cmFuc2l0aW9uKTsK
KworICAgICAgaWYgKCF0aGlzLl9lbnZpcm9ubWVudCB8fCB0aGlzLl9lbnZpcm9ubWVudC5vcHRp
b25zLnNob3VsZFJlbmRlcikgeworICAgICAgICB0aGlzLnJlbmRlclRlbXBsYXRlKGNvbnRyb2xs
ZXIsIGNvbnRleHQpOworICAgICAgfQorICAgIH0sCisKKyAgICAvKgorICAgICAgQ2FsbGVkIHdo
ZW4gYSBxdWVyeSBwYXJhbWV0ZXIgZm9yIHRoaXMgcm91dGUgY2hhbmdlcywgcmVnYXJkbGVzcyBv
ZiB3aGV0aGVyIHRoZSByb3V0ZQorICAgICAgaXMgY3VycmVudGx5IHBhcnQgb2YgdGhlIGFjdGl2
ZSByb3V0ZSBoaWVyYXJjaHkuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHF1ZXJ5IHBhcmFtZXRlcidz
CisgICAgICB2YWx1ZSBpbiB0aGUgY2FjaGUgc28gaWYgdGhpcyByb3V0ZSBiZWNvbWVzIGFjdGl2
ZSwgdGhlIGNhY2hlIHZhbHVlIGhhcyBiZWVuIHVwZGF0ZWQuCisgICAgKi8KKyAgICBfcXBDaGFu
Z2VkOiBmdW5jdGlvbiAocHJvcCwgdmFsdWUsIHFwKSB7CisgICAgICBpZiAoIXFwKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNhY2hlS2V5ID0gX2VtYmVyUm91dGlu
Z1V0aWxzLmNhbGN1bGF0ZUNhY2hlS2V5KHFwLnByZWZpeCB8fCAnJywgcXAucGFydHMsIHFwLnZh
bHVlcyk7CisKKyAgICAgIC8vIFVwZGF0ZSBtb2RlbC1kZXAgY2FjaGUKKyAgICAgIHZhciBjYWNo
ZSA9IHRoaXMuX2J1Y2tldENhY2hlOworICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgIGNhY2hl
LnN0YXNoKGNhY2hlS2V5LCBwcm9wLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSwKKyAgICAvKioK
KyAgICAgIFRoaXMgaG9vayBpcyB0aGUgZmlyc3Qgb2YgdGhlIHJvdXRlIGVudHJ5IHZhbGlkYXRp
b24gaG9va3MKKyAgICAgIGNhbGxlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB0cmFuc2l0
aW9uIGludG8gYSByb3V0ZQorICAgICAgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4gSXQgaXMgY2Fs
bGVkIGJlZm9yZSBgbW9kZWxgIGFuZAorICAgICAgYGFmdGVyTW9kZWxgLCBhbmQgaXMgYXBwcm9w
cmlhdGUgZm9yIGNhc2VzIHdoZW46CisgICAgICAgMSkgQSBkZWNpc2lvbiBjYW4gYmUgbWFkZSB0
byByZWRpcmVjdCBlbHNld2hlcmUgd2l0aG91dAorICAgICAgICAgbmVlZGluZyB0byByZXNvbHZl
IHRoZSBtb2RlbCBmaXJzdC4KKyAgICAgIDIpIEFueSBhc3luYyBvcGVyYXRpb25zIG5lZWQgdG8g
b2NjdXIgZmlyc3QgYmVmb3JlIHRoZQorICAgICAgICAgbW9kZWwgaXMgYXR0ZW1wdGVkIHRvIGJl
IHJlc29sdmVkLgorICAgICAgIFRoaXMgaG9vayBpcyBwcm92aWRlZCB0aGUgY3VycmVudCBgdHJh
bnNpdGlvbmAgYXR0ZW1wdAorICAgICAgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSB1c2Vk
IHRvIGAuYWJvcnQoKWAgdGhlIHRyYW5zaXRpb24sCisgICAgICBzYXZlIGl0IGZvciBhIGxhdGVy
IGAucmV0cnkoKWAsIG9yIHJldHJpZXZlIHZhbHVlcyBzZXQKKyAgICAgIG9uIGl0IGZyb20gYSBw
cmV2aW91cyBob29rLiBZb3UgY2FuIGFsc28ganVzdCBjYWxsCisgICAgICBgdGhpcy50cmFuc2l0
aW9uVG9gIHRvIGFub3RoZXIgcm91dGUgdG8gaW1wbGljaXRseQorICAgICAgYWJvcnQgdGhlIGB0
cmFuc2l0aW9uYC4KKyAgICAgICBZb3UgY2FuIHJldHVybiBhIHByb21pc2UgZnJvbSB0aGlzIGhv
b2sgdG8gcGF1c2UgdGhlCisgICAgICB0cmFuc2l0aW9uIHVudGlsIHRoZSBwcm9taXNlIHJlc29s
dmVzIChvciByZWplY3RzKS4gVGhpcyBjb3VsZAorICAgICAgYmUgdXNlZnVsLCBmb3IgaW5zdGFu
Y2UsIGZvciByZXRyaWV2aW5nIGFzeW5jIGNvZGUgZnJvbQorICAgICAgdGhlIHNlcnZlciB0aGF0
IGlzIHJlcXVpcmVkIHRvIGVudGVyIGEgcm91dGUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGJlZm9yZU1v
ZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7CisgICAgICAgICAgaWYgKCFBcHAuUG9zdCkgewor
ICAgICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0U2NyaXB0KCcvbW9kZWxzL3Bvc3QuanMnKTsK
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSWYg
YEFwcC5Qb3N0YCBkb2Vzbid0IGV4aXN0IGluIHRoZSBhYm92ZSBleGFtcGxlLAorICAgICAgYGJl
Zm9yZU1vZGVsYCB3aWxsIHVzZSBqUXVlcnkncyBgZ2V0U2NyaXB0YCwgd2hpY2gKKyAgICAgIHJl
dHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNlcnZlciBoYXMKKyAgICAg
IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgYW5kIGV4ZWN1dGVkIHRoZSBjb2RlIGZyb20gdGhlCisg
ICAgICBzZXJ2ZXIuIE5vdGUgdGhhdCBpZiBhbiBlcnJvciB3ZXJlIHRvIG9jY3VyLCBpdCB3b3Vs
ZAorICAgICAgYmUgcGFzc2VkIHRvIHRoZSBgZXJyb3JgIGhvb2sgb24gYEVtYmVyLlJvdXRlYCwg
YnV0CisgICAgICBpdCdzIGFsc28gcG9zc2libGUgdG8gaGFuZGxlIGVycm9ycyBzcGVjaWZpYyB0
bworICAgICAgYGJlZm9yZU1vZGVsYCByaWdodCBmcm9tIHdpdGhpbiB0aGUgaG9vayAodG8gZGlz
dGluZ3Vpc2gKKyAgICAgIGZyb20gdGhlIHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBv
ZiB0aGUgYGVycm9yYAorICAgICAgaG9vayk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
QXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGJlZm9yZU1vZGVs
OiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7CisgICAgICAgICAgaWYgKCFBcHAuUG9zdCkgeworICAg
ICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0
U2NyaXB0KCdwb3N0LmpzJykudGhlbihudWxsLCBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAg
IHNlbGYudHJhbnNpdGlvblRvKCdoZWxwJyk7CisgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQg
dGhlIGFib3ZlIHRyYW5zaXRpb25UbyB3aWxsIGltcGxpY2l0bHkKKyAgICAgICAgICAgICAgLy8g
aGFsdCB0aGUgdHJhbnNpdGlvbi4gSWYgeW91IHdlcmUgdG8gcmV0dXJuCisgICAgICAgICAgICAg
IC8vIG5vdGhpbmcgZnJvbSB0aGlzIHByb21pc2UgcmVqZWN0IGhhbmRsZXIsCisgICAgICAgICAg
ICAgIC8vIGFjY29yZGluZyB0byBwcm9taXNlIHNlbWFudGljcywgdGhhdCB3b3VsZAorICAgICAg
ICAgICAgICAvLyBjb252ZXJ0IHRoZSByZWplY3QgaW50byBhIHJlc29sdmUgYW5kIHRoZQorICAg
ICAgICAgICAgICAvLyB0cmFuc2l0aW9uIHdvdWxkIGNvbnRpbnVlLiBUbyBwcm9wYWdhdGUgdGhl
CisgICAgICAgICAgICAgIC8vIGVycm9yIHNvIHRoYXQgaXQnZCBiZSBoYW5kbGVkIGJ5IHRoZSBg
ZXJyb3JgCisgICAgICAgICAgICAgIC8vIGhvb2ssIHlvdSB3b3VsZCBoYXZlIHRvCisgICAgICAg
ICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdChlKTsKKyAgICAgICAgICAgIH0pOworICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGJlZm9yZU1vZGVsCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgaG9vayBp
cworICAgICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhl
IHRyYW5zaXRpb24KKyAgICAgICAgcmVzb2x2ZXMuIE90aGVyd2lzZSwgbm9uLXByb21pc2UgcmV0
dXJuIHZhbHVlcyBhcmUgbm90CisgICAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCisgICAgICBA
cHVibGljCisgICAgKi8KKyAgICBiZWZvcmVNb2RlbDogSywKKworICAgIC8qKgorICAgICAgVGhp
cyBob29rIGlzIGNhbGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9kZWwgaGFzIHJlc29sdmVkLgor
ICAgICAgSXQgZm9sbG93cyBpZGVudGljYWwgYXN5bmMvcHJvbWlzZSBzZW1hbnRpY3MgdG8gYGJl
Zm9yZU1vZGVsYAorICAgICAgYnV0IGlzIHByb3ZpZGVkIHRoZSByb3V0ZSdzIHJlc29sdmVkIG1v
ZGVsIGluIGFkZGl0aW9uIHRvCisgICAgICB0aGUgYHRyYW5zaXRpb25gLCBhbmQgaXMgdGhlcmVm
b3JlIHN1aXRlZCB0byBwZXJmb3JtaW5nCisgICAgICBsb2dpYyB0aGF0IGNhbiBvbmx5IHRha2Ug
cGxhY2UgYWZ0ZXIgdGhlIG1vZGVsIGhhcyBhbHJlYWR5CisgICAgICByZXNvbHZlZC4KKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICAgIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKHBvc3RzLCB0cmFuc2l0aW9uKSB7Cisg
ICAgICAgICAgaWYgKHBvc3RzLmdldCgnbGVuZ3RoJykgPT09IDEpIHsKKyAgICAgICAgICAgIHRo
aXMudHJhbnNpdGlvblRvKCdwb3N0LnNob3cnLCBwb3N0cy5nZXQoJ2ZpcnN0T2JqZWN0JykpOwor
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBSZWZl
ciB0byBkb2N1bWVudGF0aW9uIGZvciBgYmVmb3JlTW9kZWxgIGZvciBhIGRlc2NyaXB0aW9uCisg
ICAgICBvZiB0cmFuc2l0aW9uLXBhdXNpbmcgc2VtYW50aWNzIHdoZW4gYSBwcm9taXNlIGlzIHJl
dHVybmVkCisgICAgICBmcm9tIHRoaXMgaG9vay4KKyAgICAgICBAbWV0aG9kIGFmdGVyTW9kZWwK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZXNvbHZlZE1vZGVsIHRoZSB2YWx1ZSByZXR1cm5lZCBm
cm9tIGBtb2RlbGAsCisgICAgICAgIG9yIGl0cyByZXNvbHZlZCB2YWx1ZSBpZiBpdCB3YXMgYSBw
cm9taXNlCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEByZXR1
cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgaG9vayBpcworICAg
ICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhlIHRyYW5z
aXRpb24KKyAgICAgICAgcmVzb2x2ZXMuIE90aGVyd2lzZSwgbm9uLXByb21pc2UgcmV0dXJuIHZh
bHVlcyBhcmUgbm90CisgICAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCisgICAgICBAcHVibGlj
CisgICAgICovCisgICAgYWZ0ZXJNb2RlbDogSywKKworICAgIC8qKgorICAgICAgQSBob29rIHlv
dSBjYW4gaW1wbGVtZW50IHRvIG9wdGlvbmFsbHkgcmVkaXJlY3QgdG8gYW5vdGhlciByb3V0ZS4K
KyAgICAgICBJZiB5b3UgY2FsbCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20gaW5zaWRlIG9mIHRo
aXMgaG9vaywgdGhpcyByb3V0ZQorICAgICAgd2lsbCBub3QgYmUgZW50ZXJlZCBpbiBmYXZvciBv
ZiB0aGUgb3RoZXIgaG9vay4KKyAgICAgICBgcmVkaXJlY3RgIGFuZCBgYWZ0ZXJNb2RlbGAgYmVo
YXZlIHZlcnkgc2ltaWxhcmx5IGFuZCBhcmUKKyAgICAgIGNhbGxlZCBhbG1vc3QgYXQgdGhlIHNh
bWUgdGltZSwgYnV0IHRoZXkgaGF2ZSBhbiBpbXBvcnRhbnQKKyAgICAgIGRpc3RpbmN0aW9uIGlu
IHRoZSBjYXNlIHRoYXQsIGZyb20gb25lIG9mIHRoZXNlIGhvb2tzLCBhCisgICAgICByZWRpcmVj
dCBpbnRvIGEgY2hpbGQgcm91dGUgb2YgdGhpcyByb3V0ZSBvY2N1cnM6IHJlZGlyZWN0cworICAg
ICAgZnJvbSBgYWZ0ZXJNb2RlbGAgZXNzZW50aWFsbHkgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBh
dHRlbXB0CisgICAgICB0byBlbnRlciB0aGlzIHJvdXRlLCBhbmQgd2lsbCByZXN1bHQgaW4gdGhp
cyByb3V0ZSdzIGBiZWZvcmVNb2RlbGAsCisgICAgICBgbW9kZWxgLCBhbmQgYGFmdGVyTW9kZWxg
IGhvb2tzIGJlaW5nIGZpcmVkIGFnYWluIHdpdGhpbgorICAgICAgdGhlIG5ldywgcmVkaXJlY3Rp
bmcgdHJhbnNpdGlvbi4gUmVkaXJlY3RzIHRoYXQgb2NjdXIgd2l0aGluCisgICAgICB0aGUgYHJl
ZGlyZWN0YCBob29rLCBvbiB0aGUgb3RoZXIgaGFuZCwgd2lsbCBfbm90XyBjYXVzZQorICAgICAg
dGhlc2UgaG9va3MgdG8gYmUgZmlyZWQgYWdhaW4gdGhlIHNlY29uZCB0aW1lIGFyb3VuZDsgaW4K
KyAgICAgIG90aGVyIHdvcmRzLCBieSB0aGUgdGltZSB0aGUgYHJlZGlyZWN0YCBob29rIGhhcyBi
ZWVuIGNhbGxlZCwKKyAgICAgIGJvdGggdGhlIHJlc29sdmVkIG1vZGVsIGFuZCBhdHRlbXB0ZWQg
ZW50cnkgaW50byB0aGlzIHJvdXRlCisgICAgICBhcmUgY29uc2lkZXJlZCB0byBiZSBmdWxseSB2
YWxpZGF0ZWQuCisgICAgICAgQG1ldGhvZCByZWRpcmVjdAorICAgICAgQHBhcmFtIHtPYmplY3R9
IG1vZGVsIHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZQorICAgICAgQHBhcmFtIHtUcmFuc2l0aW9u
fSB0cmFuc2l0aW9uIHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1
cnJlbnQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVkaXJlY3Q6IEss
CisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNoYW5nZWQgYnkg
cm91dGVyLmpzLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGNvbnRleHREaWRDaGFu
Z2UKKyAgICAqLworICAgIGNvbnRleHREaWRDaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRo
aXMuY3VycmVudE1vZGVsID0gdGhpcy5jb250ZXh0OworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBjb252ZXJ0IHRoZSBVUkwgaW50byB0aGUgbW9k
ZWwgZm9yCisgICAgICB0aGlzIHJvdXRlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdwb3N0JywgeyBw
YXRoOiAnL3Bvc3RzLzpwb3N0X2lkJyB9KTsKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAg
VGhlIG1vZGVsIGZvciB0aGUgYHBvc3RgIHJvdXRlIGlzIGBzdG9yZS5maW5kUmVjb3JkKCdwb3N0
JywgcGFyYW1zLnBvc3RfaWQpYC4KKyAgICAgICBCeSBkZWZhdWx0LCBpZiB5b3VyIHJvdXRlIGhh
cyBhIGR5bmFtaWMgc2VnbWVudCBlbmRpbmcgaW4gYF9pZGA6CisgICAgICAgKiBUaGUgbW9kZWwg
Y2xhc3MgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChgcG9zdF9pZGAncworICAgICAg
ICBjbGFzcyBpcyBgQXBwLlBvc3RgKQorICAgICAgKiBUaGUgZmluZCBtZXRob2QgaXMgY2FsbGVk
IG9uIHRoZSBtb2RlbCBjbGFzcyB3aXRoIHRoZSB2YWx1ZSBvZgorICAgICAgICB0aGUgZHluYW1p
YyBzZWdtZW50LgorICAgICAgIE5vdGUgdGhhdCBmb3Igcm91dGVzIHdpdGggZHluYW1pYyBzZWdt
ZW50cywgdGhpcyBob29rIGlzIG5vdCBhbHdheXMKKyAgICAgIGV4ZWN1dGVkLiBJZiB0aGUgcm91
dGUgaXMgZW50ZXJlZCB0aHJvdWdoIGEgdHJhbnNpdGlvbiAoZS5nLiB3aGVuCisgICAgICB1c2lu
ZyB0aGUgYGxpbmstdG9gIEhhbmRsZWJhcnMgaGVscGVyIG9yIHRoZSBgdHJhbnNpdGlvblRvYCBt
ZXRob2QKKyAgICAgIG9mIHJvdXRlcyksIGFuZCBhIG1vZGVsIGNvbnRleHQgaXMgYWxyZWFkeSBw
cm92aWRlZCB0aGlzIGhvb2sKKyAgICAgIGlzIG5vdCBjYWxsZWQuCisgICAgICAgQSBtb2RlbCBj
b250ZXh0IGRvZXMgbm90IGluY2x1ZGUgYSBwcmltaXRpdmUgc3RyaW5nIG9yIG51bWJlciwKKyAg
ICAgIHdoaWNoIGRvZXMgY2F1c2UgdGhlIG1vZGVsIGhvb2sgdG8gYmUgY2FsbGVkLgorICAgICAg
IFJvdXRlcyB3aXRob3V0IGR5bmFtaWMgc2VnbWVudHMgd2lsbCBhbHdheXMgZXhlY3V0ZSB0aGUg
bW9kZWwgaG9vay4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBubyBkeW5hbWljIHNl
Z21lbnQsIG1vZGVsIGhvb2sgYWx3YXlzIGNhbGxlZAorICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3RzJyk7CisgICAgICAgLy8gbW9kZWwgcGFzc2VkIGluLCBzbyBtb2RlbCBob29rIG5vdCBj
YWxsZWQKKyAgICAgIHRoZVBvc3QgPSBzdG9yZS5maW5kUmVjb3JkKCdwb3N0JywgMSk7CisgICAg
ICB0aGlzLnRyYW5zaXRpb25UbygncG9zdCcsIHRoZVBvc3QpOworICAgICAgIC8vIGludGVnZXIg
cGFzc2VkIGluLCBtb2RlbCBob29rIGlzIGNhbGxlZAorICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3QnLCAxKTsKKyAgICAgICAvLyBtb2RlbCBpZCBwYXNzZWQgaW4sIG1vZGVsIGhvb2sgaXMg
Y2FsbGVkCisgICAgICAvLyB1c2VmdWwgZm9yIGZvcmNpbmcgdGhlIGhvb2sgdG8gZXhlY3V0ZQor
ICAgICAgdGhlUG9zdCA9IHN0b3JlLmZpbmRSZWNvcmQoJ3Bvc3QnLCAxKTsKKyAgICAgIHRoaXMu
dHJhbnNpdGlvblRvKCdwb3N0JywgdGhlUG9zdC5pZCk7CisgICAgICBgYGAKKyAgICAgICAgVGhp
cyBob29rIGZvbGxvd3MgdGhlIGFzeW5jaHJvbm91cy9wcm9taXNlIHNlbWFudGljcworICAgICAg
ZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgYmVmb3JlTW9kZWxgLiBJbiBwYXJ0
aWN1bGFyLAorICAgICAgaWYgYSBwcm9taXNlIHJldHVybmVkIGZyb20gYG1vZGVsYCBmYWlscywg
dGhlIGVycm9yIHdpbGwgYmUKKyAgICAgIGhhbmRsZWQgYnkgdGhlIGBlcnJvcmAgaG9vayBvbiBg
RW1iZXIuUm91dGVgLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgbW9kZWw6IGZ1
bmN0aW9uKHBhcmFtcykgeworICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmZpbmRSZWNvcmQo
J3Bvc3QnLCBwYXJhbXMucG9zdF9pZCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBg
CisgICAgICAgQG1ldGhvZCBtb2RlbAorICAgICAgQHBhcmFtIHtPYmplY3R9IHBhcmFtcyB0aGUg
cGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgVVJMCisgICAgICBAcGFyYW0ge1RyYW5zaXRp
b259IHRyYW5zaXRpb24KKyAgICAgIEByZXR1cm4ge09iamVjdHxQcm9taXNlfSB0aGUgbW9kZWwg
Zm9yIHRoaXMgcm91dGUuIElmCisgICAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5lZCwgdGhlIHRy
YW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAorICAgICAgICB0aGUgcHJvbWlzZSByZXNvbHZlcywg
YW5kIHRoZSByZXNvbHZlZCB2YWx1ZSBvZiB0aGUgcHJvbWlzZQorICAgICAgICB3aWxsIGJlIHVz
ZWQgYXMgdGhlIG1vZGVsIGZvciB0aGlzIHJvdXRlLgorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgbW9kZWw6IGZ1bmN0aW9uIChwYXJhbXMsIHRyYW5zaXRpb24pIHsKKyAgICAgIHZhciBtYXRj
aCwgbmFtZSwgc2F3UGFyYW1zLCB2YWx1ZTsKKyAgICAgIHZhciBxdWVyeVBhcmFtcyA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX3FwLm1hcCcpOworCisgICAgICBmb3IgKHZh
ciBwcm9wIGluIHBhcmFtcykgeworICAgICAgICBpZiAocHJvcCA9PT0gJ3F1ZXJ5UGFyYW1zJyB8
fCBxdWVyeVBhcmFtcyAmJiBwcm9wIGluIHF1ZXJ5UGFyYW1zKSB7CisgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF0Y2ggPSBwcm9wLm1hdGNoKC9eKC4qKV9p
ZCQvKSkgeworICAgICAgICAgIG5hbWUgPSBtYXRjaFsxXTsKKyAgICAgICAgICB2YWx1ZSA9IHBh
cmFtc1twcm9wXTsKKyAgICAgICAgfQorICAgICAgICBzYXdQYXJhbXMgPSB0cnVlOworICAgICAg
fQorCisgICAgICBpZiAoIW5hbWUgJiYgc2F3UGFyYW1zKSB7CisgICAgICAgIHJldHVybiBfZW1i
ZXJSdW50aW1lQ29weS5kZWZhdWx0KHBhcmFtcyk7CisgICAgICB9IGVsc2UgaWYgKCFuYW1lKSB7
CisgICAgICAgIGlmICh0cmFuc2l0aW9uLnJlc29sdmVJbmRleCA8IDEpIHsKKyAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGFyZW50TW9kZWwgPSB0cmFuc2l0aW9u
LnN0YXRlLmhhbmRsZXJJbmZvc1t0cmFuc2l0aW9uLnJlc29sdmVJbmRleCAtIDFdLmNvbnRleHQ7
CisKKyAgICAgICAgcmV0dXJuIHBhcmVudE1vZGVsOworICAgICAgfQorCisgICAgICByZXR1cm4g
dGhpcy5maW5kTW9kZWwobmFtZSwgdmFsdWUpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIGRlc2VyaWFsaXplCisgICAgICBAcGFyYW0ge09iamVjdH0g
cGFyYW1zIHRoZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkwKKyAgICAgIEBwYXJh
bSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgorICAgICAgQHJldHVybiB7T2JqZWN0fFByb21pc2V9
IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4KKyAgICAgICBSb3V0ZXIuanMgaG9vay4KKyAgICAg
Ki8KKyAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24gKHBhcmFtcywgdHJhbnNpdGlvbikgeworICAg
ICAgcmV0dXJuIHRoaXMubW9kZWwodGhpcy5wYXJhbXNGb3IodGhpcy5yb3V0ZU5hbWUpLCB0cmFu
c2l0aW9uKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQG1ldGhvZCBmaW5kTW9kZWwKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtb2RlbCB0eXBlCisgICAgICBAcGFyYW0ge09i
amVjdH0gdmFsdWUgdGhlIHZhbHVlIHBhc3NlZCB0byBmaW5kCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgZmluZE1vZGVsOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RvcmUgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3N0b3JlJyk7CisgICAgICByZXR1cm4gc3Rv
cmUuZmluZC5hcHBseShzdG9yZSwgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBTdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVyc2lzdGVuY2UgbGli
cmFyaWVzIHRvIGluamVjdCB0aGVtc2VsdmVzLgorICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgc3Rv
cmUgcHJvcGVydHkgcHJvdmlkZXMgdGhlIGV4YWN0IHNhbWUgZnVuY3Rpb25hbGl0eSBwcmV2aW91
c2x5CisgICAgICBpbiB0aGUgbW9kZWwgaG9vay4KKyAgICAgICBDdXJyZW50bHksIHRoZSByZXF1
aXJlZCBpbnRlcmZhY2UgaXM6CisgICAgICAgYHN0b3JlLmZpbmQobW9kZWxOYW1lLCBmaW5kQXJn
dW1lbnRzKWAKKyAgICAgICBAbWV0aG9kIHN0b3JlCisgICAgICBAcGFyYW0ge09iamVjdH0gc3Rv
cmUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBzdG9yZTogX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVyT3du
ZXIuZ2V0T3duZXIodGhpcyk7CisgICAgICB2YXIgcm91dGVOYW1lID0gdGhpcy5yb3V0ZU5hbWU7
CisgICAgICB2YXIgbmFtZXNwYWNlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdyb3V0ZXIubmFtZXNwYWNlJyk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGZpbmQ6IGZ1
bmN0aW9uIChuYW1lLCB2YWx1ZSkgeworICAgICAgICAgIHZhciBtb2RlbENsYXNzID0gb3duZXIu
X2xvb2t1cEZhY3RvcnkoJ21vZGVsOicgKyBuYW1lKTsKKworICAgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdZb3UgdXNlZCB0aGUgZHluYW1pYyBzZWdtZW50ICcgKyBuYW1lICsgJ19p
ZCBpbiB5b3VyIHJvdXRlICcgKyByb3V0ZU5hbWUgKyAnLCBidXQgJyArIG5hbWVzcGFjZSArICcu
JyArIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkobmFtZSkgKyAnIGRpZCBub3Qg
ZXhpc3QgYW5kIHlvdSBkaWQgbm90IG92ZXJyaWRlIHlvdXIgcm91dGVcJ3MgYG1vZGVsYCBob29r
LicsICEhbW9kZWxDbGFzcyk7CisKKyAgICAgICAgICBpZiAoIW1vZGVsQ2xhc3MpIHsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydChfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmNsYXNzaWZ5KG5hbWUpICsgJyBoYXMg
bm8gbWV0aG9kIGBmaW5kYC4nLCB0eXBlb2YgbW9kZWxDbGFzcy5maW5kID09PSAnZnVuY3Rpb24n
KTsKKworICAgICAgICAgIHJldHVybiBtb2RlbENsYXNzLmZpbmQodmFsdWUpOworICAgICAgICB9
CisgICAgICB9OworICAgIH0pLAorCisgICAgLyoqCisgICAgICBBIGhvb2sgeW91IGNhbiBpbXBs
ZW1lbnQgdG8gY29udmVydCB0aGUgcm91dGUncyBtb2RlbCBpbnRvIHBhcmFtZXRlcnMKKyAgICAg
IGZvciB0aGUgVVJMLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdwb3N0JywgeyBwYXRoOiAnL3Bvc3Rz
Lzpwb3N0X2lkJyB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5S
b3V0ZS5leHRlbmQoeworICAgICAgICBtb2RlbDogZnVuY3Rpb24ocGFyYW1zKSB7CisgICAgICAg
ICAgLy8gdGhlIHNlcnZlciByZXR1cm5zIGB7IGlkOiAxMiB9YAorICAgICAgICAgIHJldHVybiBF
bWJlci4kLmdldEpTT04oJy9wb3N0cy8nICsgcGFyYW1zLnBvc3RfaWQpOworICAgICAgICB9LAor
ICAgICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2RlbCkgeworICAgICAgICAgIC8vIHRoaXMg
d2lsbCBtYWtlIHRoZSBVUkwgYC9wb3N0cy8xMmAKKyAgICAgICAgICByZXR1cm4geyBwb3N0X2lk
OiBtb2RlbC5pZCB9OworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRo
ZSBkZWZhdWx0IGBzZXJpYWxpemVgIG1ldGhvZCB3aWxsIGluc2VydCB0aGUgbW9kZWwncyBgaWRg
IGludG8gdGhlCisgICAgICByb3V0ZSdzIGR5bmFtaWMgc2VnbWVudCAoaW4gdGhpcyBjYXNlLCBg
OnBvc3RfaWRgKSBpZiB0aGUgc2VnbWVudCBjb250YWlucyAnX2lkJy4KKyAgICAgIElmIHRoZSBy
b3V0ZSBoYXMgbXVsdGlwbGUgZHluYW1pYyBzZWdtZW50cyBvciBkb2VzIG5vdCBjb250YWluICdf
aWQnLCBgc2VyaWFsaXplYAorICAgICAgd2lsbCByZXR1cm4gYEVtYmVyLmdldFByb3BlcnRpZXMo
bW9kZWwsIHBhcmFtcylgCisgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYHRyYW5z
aXRpb25Ub2AgaXMgY2FsbGVkIHdpdGggYSBjb250ZXh0CisgICAgICBpbiBvcmRlciB0byBwb3B1
bGF0ZSB0aGUgVVJMLgorICAgICAgIEBtZXRob2Qgc2VyaWFsaXplCisgICAgICBAcGFyYW0ge09i
amVjdH0gbW9kZWwgdGhlIHJvdXRlcyBtb2RlbAorICAgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1z
IGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1cnJlbnQKKyAgICAgICAgcm91
dGUgKGluIHRoZSBleGFtcGxlLCBgWydwb3N0X2lkJ11gLgorICAgICAgQHJldHVybiB7T2JqZWN0
fSB0aGUgc2VyaWFsaXplZCBwYXJhbWV0ZXJzCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBz
ZXJpYWxpemU6IGZ1bmN0aW9uIChtb2RlbCwgcGFyYW1zKSB7CisgICAgICBpZiAocGFyYW1zLmxl
bmd0aCA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKCFtb2RlbCkg
eworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBuYW1lID0gcGFyYW1zWzBd
OworICAgICAgdmFyIG9iamVjdCA9IHt9OworCisgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0g
MSkgeworICAgICAgICBpZiAobmFtZSBpbiBtb2RlbCkgeworICAgICAgICAgIG9iamVjdFtuYW1l
XSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChtb2RlbCwgbmFtZSk7CisgICAgICAgIH0g
ZWxzZSBpZiAoL19pZCQvLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICBvYmplY3RbbmFtZV0gPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobW9kZWwsICdpZCcpOworICAgICAgICB9CisgICAg
ICB9IGVsc2UgeworICAgICAgICBvYmplY3QgPSBfZW1iZXJNZXRhbEdldF9wcm9wZXJ0aWVzLmRl
ZmF1bHQobW9kZWwsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmplY3Q7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQSBob29rIHlvdSBjYW4gdXNlIHRvIHNldHVwIHRoZSBj
b250cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyBj
YWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUgYW5kIHRoZQor
ICAgICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9vay4KKyAgICAgICBCeSBkZWZh
dWx0LCB0aGUgYHNldHVwQ29udHJvbGxlcmAgaG9vayBzZXRzIHRoZSBgbW9kZWxgIHByb3BlcnR5
IG9mCisgICAgICB0aGUgY29udHJvbGxlciB0byB0aGUgYG1vZGVsYC4KKyAgICAgICBJZiB5b3Ug
aW1wbGVtZW50IHRoZSBgc2V0dXBDb250cm9sbGVyYCBob29rIGluIHlvdXIgUm91dGUsIGl0IHdp
bGwKKyAgICAgIHByZXZlbnQgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLiBJZiB5b3Ugd2FudCB0byBw
cmVzZXJ2ZSB0aGF0IGJlaGF2aW9yCisgICAgICB3aGVuIGltcGxlbWVudGluZyB5b3VyIGBzZXR1
cENvbnRyb2xsZXJgIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gY2FsbAorICAgICAgYF9zdXBlcmA6
CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBob3Rvc1JvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgbW9kZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVy
biB0aGlzLnN0b3JlLmZpbmRBbGwoJ3Bob3RvJyk7CisgICAgICAgIH0sCisgICAgICAgICBzZXR1
cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIG1vZGVsKSB7CisgICAgICAgICAgLy8g
Q2FsbCBfc3VwZXIgZm9yIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgICAgICB0aGlzLl9zdXBlcihj
b250cm9sbGVyLCBtb2RlbCk7CisgICAgICAgICAgLy8gSW1wbGVtZW50IHlvdXIgY3VzdG9tIHNl
dHVwIGFmdGVyCisgICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCdhcHBsaWNhdGlvbicpLnNl
dCgnc2hvd2luZ1Bob3RvcycsIHRydWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBg
YAorICAgICAgIFRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdpbGwgYmUgb25lIHJlc29sdmVkIGJh
c2VkIG9uIHRoZSBuYW1lCisgICAgICBvZiB0aGlzIHJvdXRlLgorICAgICAgIElmIG5vIGV4cGxp
Y2l0IGNvbnRyb2xsZXIgaXMgZGVmaW5lZCwgRW1iZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0
ZSBvbmUuCisgICAgICAgQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIHJvdXRlcjoKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAg
ICAgdGhpcy5yb3V0ZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0cy86cG9zdF9pZCcgfSk7CisgICAg
ICB9KTsKKyAgICAgIGBgYAorICAgICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCBhIGNvbnRyb2xs
ZXIgbmFtZWQgYEFwcC5Qb3N0Q29udHJvbGxlcmAgd291bGQKKyAgICAgIGJlIHVzZWQgaWYgaXQg
aXMgZGVmaW5lZC4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGEgYmFzaWMgYEVtYmVyLkNvbnRyb2xs
ZXJgCisgICAgICBpbnN0YW5jZSB3b3VsZCBiZSB1c2VkLgorICAgICAgIEV4YW1wbGUKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5k
KHsKKyAgICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkg
eworICAgICAgICAgIGNvbnRyb2xsZXIuc2V0KCdtb2RlbCcsIG1vZGVsKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHNldHVwQ29udHJvbGxlcgorICAg
ICAgQHBhcmFtIHtDb250cm9sbGVyfSBjb250cm9sbGVyIGluc3RhbmNlCisgICAgICBAcGFyYW0g
e09iamVjdH0gbW9kZWwKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNldHVwQ29udHJvbGxl
cjogZnVuY3Rpb24gKGNvbnRyb2xsZXIsIGNvbnRleHQsIHRyYW5zaXRpb24pIHsKKyAgICAgIGlm
IChjb250cm9sbGVyICYmIGNvbnRleHQgIT09IHVuZGVmaW5lZCkgeworICAgICAgICBfZW1iZXJN
ZXRhbFByb3BlcnR5X3NldC5zZXQoY29udHJvbGxlciwgJ21vZGVsJywgY29udGV4dCk7CisgICAg
ICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgY29udHJvbGxlciBmb3Ig
YSBwYXJ0aWN1bGFyIHJvdXRlIG9yIG5hbWUuCisgICAgICAgVGhlIGNvbnRyb2xsZXIgaW5zdGFu
Y2UgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkLCBlaXRoZXIgdGhyb3VnaCBlbnRlcmlu
ZyB0aGUKKyAgICAgIGFzc29jaWF0ZWQgcm91dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJvbGxl
cmAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7CisgICAgICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rpb24oY29udHJvbGxl
ciwgcG9zdCkgeworICAgICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIsIHBvc3QpOworICAg
ICAgICAgIHRoaXMuY29udHJvbGxlckZvcigncG9zdHMnKS5zZXQoJ2N1cnJlbnRQb3N0JywgcG9z
dCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBjb250
cm9sbGVyRm9yCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91
dGUgb3IgY29udHJvbGxlcgorICAgICAgQHJldHVybiB7RW1iZXIuQ29udHJvbGxlcn0KKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGNvbnRyb2xsZXJGb3I6IGZ1bmN0aW9uIChuYW1lLCBfc2tp
cEFzc2VydCkgeworICAgICAgdmFyIG93bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRo
aXMpOworICAgICAgdmFyIHJvdXRlID0gb3duZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSk7Cisg
ICAgICB2YXIgY29udHJvbGxlcjsKKworICAgICAgaWYgKHJvdXRlICYmIHJvdXRlLmNvbnRyb2xs
ZXJOYW1lKSB7CisgICAgICAgIG5hbWUgPSByb3V0ZS5jb250cm9sbGVyTmFtZTsKKyAgICAgIH0K
KworICAgICAgY29udHJvbGxlciA9IG93bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgbmFtZSk7
CisKKyAgICAgIC8vIE5PVEU6IFdlJ3JlIHNwZWNpZmljYWxseSBjaGVja2luZyB0aGF0IHNraXBB
c3NlcnQgaXMgdHJ1ZSwgYmVjYXVzZSBhY2NvcmRpbmcKKyAgICAgIC8vICAgdG8gdGhlIG9sZCBB
UEkgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIG1vZGVsLiBXZSBkbyBub3Qgd2FudCBwZW9wbGUg
d2hvCisgICAgICAvLyAgIHBhc3NlZCBhIG1vZGVsIHRvIHNraXAgdGhlIGFzc2VydGlvbi4KKyAg
ICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgY29udHJvbGxlciBuYW1lZCBcJycgKyBu
YW1lICsgJ1wnIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlIHRoYXQgdGhpcyByb3V0ZSBl
eGlzdHMgYW5kIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZCBhdCBsZWFzdCBvbmNlLiBJZiB5b3Ug
YXJlIGFjY2Vzc2luZyBhIGNvbnRyb2xsZXIgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlLCBt
YWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgY2xhc3MgaXMgZXhwbGljaXRseSBkZWZpbmVkLicsIGNv
bnRyb2xsZXIgfHwgX3NraXBBc3NlcnQgPT09IHRydWUpOworCisgICAgICByZXR1cm4gY29udHJv
bGxlcjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBHZW5lcmF0ZXMgYSBjb250cm9sbGVyIGZv
ciBhIHJvdXRlLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBB
cHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgc2V0dXBDb250cm9s
bGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIo
Y29udHJvbGxlciwgcG9zdCk7CisgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbnRyb2xsZXIoJ3Bv
c3RzJywgcG9zdCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBnZW5lcmF0ZUNvbnRyb2xsZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBu
YW1lIG9mIHRoZSBjb250cm9sbGVyCisgICAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwgdGhlIG1v
ZGVsIHRvIGluZmVyIHRoZSB0eXBlIG9mIHRoZSBjb250cm9sbGVyIChvcHRpb25hbCkKKyAgICAg
IEBwcml2YXRlCisgICAgKi8KKyAgICBnZW5lcmF0ZUNvbnRyb2xsZXI6IGZ1bmN0aW9uIChuYW1l
LCBtb2RlbCkgeworICAgICAgdmFyIG93bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRo
aXMpOworCisgICAgICBtb2RlbCA9IG1vZGVsIHx8IHRoaXMubW9kZWxGb3IobmFtZSk7CisKKyAg
ICAgIHJldHVybiBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5kZWZhdWx0
KG93bmVyLCBuYW1lLCBtb2RlbCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0
aGUgcmVzb2x2ZWQgbW9kZWwgb2YgYSBwYXJlbnQgKG9yIGFueSBhbmNlc3Rvcikgcm91dGUKKyAg
ICAgIGluIGEgcm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEgdHJhbnNpdGlvbiwgYWxsIHJvdXRl
cworICAgICAgbXVzdCByZXNvbHZlIGEgbW9kZWwgb2JqZWN0LCBhbmQgaWYgYSByb3V0ZQorICAg
ICAgbmVlZHMgYWNjZXNzIHRvIGEgcGFyZW50IHJvdXRlJ3MgbW9kZWwgaW4gb3JkZXIgdG8KKyAg
ICAgIHJlc29sdmUgYSBtb2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9kZWwgZnJvbSBhIHBhcmVu
dCksCisgICAgICBpdCBjYW4gY2FsbCBgdGhpcy5tb2RlbEZvcih0aGVOYW1lT2ZQYXJlbnRSb3V0
ZSlgIHRvCisgICAgICByZXRyaWV2ZSBpdC4gSWYgdGhlIGFuY2VzdG9yIHJvdXRlJ3MgbW9kZWwg
d2FzIGEgcHJvbWlzZSwKKyAgICAgIGl0cyByZXNvbHZlZCByZXN1bHQgaXMgcmV0dXJuZWQuCisg
ICAgICAgRXhhbXBsZQorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ3Bvc3QnLCB7IHBhdGg6ICcvcG9z
dC86cG9zdF9pZCcgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnJvdXRlKCdjb21t
ZW50cycsIHsgcmVzZXROYW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgICAgfSk7CisgICAgICB9
KTsKKyAgICAgICBBcHAuQ29tbWVudHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAg
ICAgICAgYWZ0ZXJNb2RlbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnNldCgncG9z
dCcsIHRoaXMubW9kZWxGb3IoJ3Bvc3QnKSk7CisgICAgICAgICAgfQorICAgICAgfSk7CisgICAg
ICBgYGAKKyAgICAgICBAbWV0aG9kIG1vZGVsRm9yCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVs
IG9iamVjdAorICAgICAgQHB1YmxpYworICAgICovCisgICAgbW9kZWxGb3I6IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgICB2YXIgcm91dGUgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcyku
bG9va3VwKCdyb3V0ZTonICsgbmFtZSk7CisgICAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMucm91
dGVyID8gdGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5zaXRpb24gOiBudWxsOworCisgICAg
ICAvLyBJZiB3ZSBhcmUgbWlkLXRyYW5zaXRpb24sIHdlIHdhbnQgdG8gdHJ5IGFuZCBsb29rIHVw
CisgICAgICAvLyByZXNvbHZlZCBwYXJlbnQgY29udGV4dHMgb24gdGhlIGN1cnJlbnQgdHJhbnNp
dGlvbkV2ZW50LgorICAgICAgaWYgKHRyYW5zaXRpb24pIHsKKyAgICAgICAgdmFyIG1vZGVsTG9v
a3VwTmFtZSA9IHJvdXRlICYmIHJvdXRlLnJvdXRlTmFtZSB8fCBuYW1lOworICAgICAgICBpZiAo
dHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVscy5oYXNPd25Qcm9wZXJ0eShtb2RlbExvb2t1cE5hbWUp
KSB7CisgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxMb29r
dXBOYW1lXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gcm91dGUgJiYgcm91
dGUuY3VycmVudE1vZGVsOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEEgaG9vayB5b3UgY2Fu
IHVzZSB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAg
ICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJl
bnQgcm91dGUgYW5kIHRoZQorICAgICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9v
ay4gQnkgZGVmYXVsdCwgaXQgcmVuZGVycyB0aGUgcm91dGUncworICAgICAgdGVtcGxhdGUsIGNv
bmZpZ3VyZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIHJvdXRlLgorICAgICAgIFRoaXMg
bWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIHNldCB1cCBhbmQgcmVuZGVyIGFkZGl0aW9uYWwg
b3IKKyAgICAgIGFsdGVybmF0aXZlIHRlbXBsYXRlcy4KKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIHJlbmRl
clRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgeworICAgICAgICAgIHZhciBm
YXZDb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyRm9yKCdmYXZvcml0ZVBvc3QnKTsKKyAgICAg
ICAgICAgLy8gUmVuZGVyIHRoZSBgZmF2b3JpdGVQb3N0YCB0ZW1wbGF0ZSBpbnRvCisgICAgICAg
ICAgLy8gdGhlIG91dGxldCBgcG9zdHNgLCBhbmQgZGlzcGxheSB0aGUgYGZhdm9yaXRlUG9zdGAK
KyAgICAgICAgICAvLyBjb250cm9sbGVyLgorICAgICAgICAgIHRoaXMucmVuZGVyKCdmYXZvcml0
ZVBvc3QnLCB7CisgICAgICAgICAgICBvdXRsZXQ6ICdwb3N0cycsCisgICAgICAgICAgICBjb250
cm9sbGVyOiBmYXZDb250cm9sbGVyCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCByZW5kZXJUZW1wbGF0ZQorICAgICAgQHBhcmFt
IHtPYmplY3R9IGNvbnRyb2xsZXIgdGhlIHJvdXRlJ3MgY29udHJvbGxlcgorICAgICAgQHBhcmFt
IHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24gKGNvbnRyb2xsZXIsIG1vZGVsKSB7CisgICAg
ICB0aGlzLnJlbmRlcigpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIGByZW5kZXJgIGlzIHVz
ZWQgdG8gcmVuZGVyIGEgdGVtcGxhdGUgaW50byBhIHJlZ2lvbiBvZiBhbm90aGVyIHRlbXBsYXRl
CisgICAgICAoaW5kaWNhdGVkIGJ5IGFuIGB7e291dGxldH19YCkuIGByZW5kZXJgIGlzIHVzZWQg
Ym90aCBkdXJpbmcgdGhlIGVudHJ5CisgICAgICBwaGFzZSBvZiByb3V0aW5nICh2aWEgdGhlIGBy
ZW5kZXJUZW1wbGF0ZWAgaG9vaykgYW5kIGxhdGVyIGluIHJlc3BvbnNlIHRvCisgICAgICB1c2Vy
IGludGVyYWN0aW9uLgorICAgICAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1p
bmltYWwgcm91dGVyIGFuZCB0ZW1wbGF0ZXM6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgncGhvdG9zJyk7Cisg
ICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIDwhLS0gYXBw
bGljYXRpb24uaGJzIC0tPgorICAgICAgPGRpdiBjbGFzcz0nc29tZXRoaW5nLWluLXRoZS1hcHAt
aGJzJz4KKyAgICAgICAge3tvdXRsZXQgImFuT3V0bGV0TmFtZSJ9fQorICAgICAgPC9kaXY+Cisg
ICAgICBgYGAKKyAgICAgICBgYGBoYW5kbGViYXJzCisgICAgICA8IS0tIHBob3Rvcy5oYnMgLS0+
CisgICAgICA8aDE+UGhvdG9zPC9oMT4KKyAgICAgIGBgYAorICAgICAgIFlvdSBjYW4gcmVuZGVy
IGBwaG90b3MuaGJzYCBpbnRvIHRoZSBgImFuT3V0bGV0TmFtZSJgIG91dGxldCBvZgorICAgICAg
YGFwcGxpY2F0aW9uLmhic2AgYnkgY2FsbGluZyBgcmVuZGVyYDoKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAvLyBwb3N0cyByb3V0ZQorICAgICAgRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAg
ICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucmVuZGVy
KCdwaG90b3MnLCB7CisgICAgICAgICAgICBpbnRvOiAnYXBwbGljYXRpb24nLAorICAgICAgICAg
ICAgb3V0bGV0OiAnYW5PdXRsZXROYW1lJworICAgICAgICAgIH0pCisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgYGBgCisgICAgICAgYHJlbmRlcmAgYWRkaXRpb25hbGx5IGFsbG93cyB5b3Ug
dG8gc3VwcGx5IHdoaWNoIGB2aWV3YCwgYGNvbnRyb2xsZXJgLCBhbmQKKyAgICAgIGBtb2RlbGAg
b2JqZWN0cyBzaG91bGQgYmUgbG9hZGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmVk
IHRlbXBsYXRlLgorICAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBwb3N0cyByb3V0ZQor
ICAgICAgRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0
aW9uKGNvbnRyb2xsZXIsIG1vZGVsKXsKKyAgICAgICAgICB0aGlzLnJlbmRlcigncG9zdHMnLCB7
ICAgIC8vIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIsIHJlZmVyZW5jZWQgYnkgbmFtZQorICAgICAg
ICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJywgICAgLy8gdGhlIHRlbXBsYXRlIHRvIHJlbmRlciBp
bnRvLCByZWZlcmVuY2VkIGJ5IG5hbWUKKyAgICAgICAgICAgIG91dGxldDogJ2FuT3V0bGV0TmFt
ZScsIC8vIHRoZSBvdXRsZXQgaW5zaWRlIGBvcHRpb25zLnRlbXBsYXRlYCB0byByZW5kZXIgaW50
by4KKyAgICAgICAgICAgIHZpZXc6ICdhVmlld05hbWUnLCAgICAgIC8vIHRoZSB2aWV3IHRvIHVz
ZSBmb3IgdGhpcyB0ZW1wbGF0ZSwgcmVmZXJlbmNlZCBieSBuYW1lCisgICAgICAgICAgICBjb250
cm9sbGVyOiAnc29tZUNvbnRyb2xsZXJOYW1lJywgLy8gdGhlIGNvbnRyb2xsZXIgdG8gdXNlIGZv
ciB0aGlzIHRlbXBsYXRlLCByZWZlcmVuY2VkIGJ5IG5hbWUKKyAgICAgICAgICAgIG1vZGVsOiBt
b2RlbCAgICAgICAgICAgIC8vIHRoZSBtb2RlbCB0byBzZXQgb24gYG9wdGlvbnMuY29udHJvbGxl
cmAuCisgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAg
ICBUaGUgc3RyaW5nIHZhbHVlcyBwcm92aWRlZCBmb3IgdGhlIHRlbXBsYXRlIG5hbWUsIHZpZXcs
IGFuZCBjb250cm9sbGVyCisgICAgICB3aWxsIGV2ZW50dWFsbHkgcGFzcyB0aHJvdWdoIHRvIHRo
ZSByZXNvbHZlciBmb3IgbG9va3VwLiBTZWUKKyAgICAgIEVtYmVyLlJlc29sdmVyIGZvciBob3cg
dGhlc2UgYXJlIG1hcHBlZCB0byBKYXZhU2NyaXB0IG9iamVjdHMgaW4geW91cgorICAgICAgYXBw
bGljYXRpb24uCisgICAgICAgTm90IGFsbCBvcHRpb25zIG5lZWQgdG8gYmUgcGFzc2VkIHRvIGBy
ZW5kZXJgLiBEZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQKKyAgICAgIGJhc2VkIG9uIHRoZSBu
YW1lIG9mIHRoZSByb3V0ZSBzcGVjaWZpZWQgaW4gdGhlIHJvdXRlciBvciB0aGUgUm91dGUncwor
ICAgICAgYGNvbnRyb2xsZXJOYW1lYCwgYHZpZXdOYW1lYCBhbmQgYHRlbXBsYXRlTmFtZWAgcHJv
cGVydGllcy4KKyAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICAvLyByb3V0ZXIKKyAgICAgIFJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMu
cm91dGUoJ2luZGV4Jyk7CisgICAgICAgIHRoaXMucm91dGUoJ3Bvc3QnLCB7IHBhdGg6ICcvcG9z
dHMvOnBvc3RfaWQnIH0pOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAvLyBwb3N0IHJvdXRlCisgICAgICBQb3N0Um91dGUgPSBBcHAuUm91dGUuZXh0
ZW5kKHsKKyAgICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRo
aXMucmVuZGVyKCk7IC8vIGFsbCBkZWZhdWx0cyBhcHBseQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIFRoZSBuYW1lIG9mIHRoZSBgUG9zdFJvdXRlYCwgZGVmaW5lZCBi
eSB0aGUgcm91dGVyLCBpcyBgcG9zdGAuCisgICAgICAgVGhlIGZvbGxvd2luZyBlcXVpdmFsZW50
IGRlZmF1bHQgb3B0aW9ucyB3aWxsIGJlIGFwcGxpZWQgd2hlbgorICAgICAgdGhlIFJvdXRlIGNh
bGxzIGByZW5kZXJgOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIC8vCisgICAgICB0aGlz
LnJlbmRlcigncG9zdCcsIHsgIC8vIHRoZSB0ZW1wbGF0ZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCAn
cG9zdCcgUm91dGUKKyAgICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJywgLy8gdGhlIHBhcmVudCBy
b3V0ZSB0byAncG9zdCcgUm91dGUKKyAgICAgICAgb3V0bGV0OiAnbWFpbicsICAgICAgLy8ge3tv
dXRsZXR9fSBhbmQge3tvdXRsZXQgJ21haW4nfX0gYXJlIHN5bm9ueW1vdXMsCisgICAgICAgIHZp
ZXc6ICdwb3N0JywgICAgICAgIC8vIHRoZSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3Bvc3Qn
IFJvdXRlCisgICAgICAgIGNvbnRyb2xsZXI6ICdwb3N0JywgIC8vIHRoZSBjb250cm9sbGVyIGFz
c29jaWF0ZWQgd2l0aCB0aGUgJ3Bvc3QnIFJvdXRlCisgICAgICB9KQorICAgICAgYGBgCisgICAg
ICAgQnkgZGVmYXVsdCB0aGUgY29udHJvbGxlcidzIGBtb2RlbGAgd2lsbCBiZSB0aGUgcm91dGUn
cyBtb2RlbCwgc28gaXQgZG9lcyBub3QKKyAgICAgIG5lZWQgdG8gYmUgcGFzc2VkIHVubGVzcyB5
b3Ugd2lzaCB0byBjaGFuZ2Ugd2hpY2ggbW9kZWwgaXMgYmVpbmcgdXNlZC4KKyAgICAgICBAbWV0
aG9kIHJlbmRlcgorICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRl
bXBsYXRlIHRvIHJlbmRlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSB0aGUgb3B0
aW9ucworICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmludG9dIHRoZSB0ZW1wbGF0ZSB0
byByZW5kZXIgaW50bywKKyAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IG5hbWUu
IERlZmF1bHRzIHRvIHRoZSBwYXJlbnQgdGVtcGxhdGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBb
b3B0aW9ucy5vdXRsZXRdIHRoZSBvdXRsZXQgaW5zaWRlIGBvcHRpb25zLnRlbXBsYXRlYCB0byBy
ZW5kZXIgaW50by4KKyAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAnbWFpbicKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuY29udHJvbGxlcl0gdGhlIGNvbnRy
b2xsZXIgdG8gdXNlIGZvciB0aGlzIHRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgIHJl
ZmVyZW5jZWQgYnkgbmFtZSBvciBhcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2UuIERlZmF1bHRzIHRv
IHRoZSBSb3V0ZSdzIHBhaXJlZCBjb250cm9sbGVyCisgICAgICBAcGFyYW0ge09iamVjdH0gW29w
dGlvbnMubW9kZWxdIHRoZSBtb2RlbCBvYmplY3QgdG8gc2V0IG9uIGBvcHRpb25zLmNvbnRyb2xs
ZXJgLgorICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUg
b2YgdGhlIFJvdXRlJ3MgbW9kZWwgaG9vaworICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVu
ZGVyOiBmdW5jdGlvbiAoX25hbWUsIG9wdGlvbnMpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdUaGUgbmFtZSBpbiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGlzIHVuZGVmaW5lZCcsIGFy
Z3VtZW50cy5sZW5ndGggPiAwID8gIV9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KGFyZ3VtZW50
c1swXSkgOiB0cnVlKTsKKworICAgICAgdmFyIG5hbWVQYXNzZWQgPSB0eXBlb2YgX25hbWUgPT09
ICdzdHJpbmcnICYmICEhX25hbWU7CisgICAgICB2YXIgaXNEZWZhdWx0UmVuZGVyID0gYXJndW1l
bnRzLmxlbmd0aCA9PT0gMCB8fCBfZW1iZXJNZXRhbElzX2VtcHR5LmRlZmF1bHQoYXJndW1lbnRz
WzBdKTsKKyAgICAgIHZhciBuYW1lOworCisgICAgICBpZiAodHlwZW9mIF9uYW1lID09PSAnb2Jq
ZWN0JyAmJiAhb3B0aW9ucykgeworICAgICAgICBuYW1lID0gdGhpcy5yb3V0ZU5hbWU7CisgICAg
ICAgIG9wdGlvbnMgPSBfbmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5hbWUgPSBfbmFt
ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlbmRlck9wdGlvbnMgPSBidWlsZFJlbmRlck9wdGlv
bnModGhpcywgbmFtZVBhc3NlZCwgaXNEZWZhdWx0UmVuZGVyLCBuYW1lLCBvcHRpb25zKTsKKyAg
ICAgIHRoaXMuY29ubmVjdGlvbnMucHVzaChyZW5kZXJPcHRpb25zKTsKKyAgICAgIF9lbWJlck1l
dGFsUnVuX2xvb3AuZGVmYXVsdC5vbmNlKHRoaXMucm91dGVyLCAnX3NldE91dGxldHMnKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBEaXNjb25uZWN0cyBhIHZpZXcgdGhhdCBoYXMgYmVlbiBy
ZW5kZXJlZCBpbnRvIGFuIG91dGxldC4KKyAgICAgICBZb3UgbWF5IHBhc3MgYW55IG9yIGFsbCBv
ZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gYGRpc2Nvbm5lY3RPdXRsZXRgOgorICAgICAgICog
YG91dGxldGA6IHRoZSBuYW1lIG9mIHRoZSBvdXRsZXQgdG8gY2xlYXIgKGRlZmF1bHQ6ICdtYWlu
JykKKyAgICAgICogYHBhcmVudFZpZXdgOiB0aGUgbmFtZSBvZiB0aGUgdmlldyBjb250YWluaW5n
IHRoZSBvdXRsZXQgdG8gY2xlYXIKKyAgICAgICAgIChkZWZhdWx0OiB0aGUgdmlldyByZW5kZXJl
ZCBieSB0aGUgcGFyZW50IHJvdXRlKQorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBBcHAuUm91dGUuZXh0ZW5kKHsKKyAg
ICAgICAgYWN0aW9uczogeworICAgICAgICAgIHNob3dNb2RhbDogZnVuY3Rpb24oZXZ0KSB7Cisg
ICAgICAgICAgICB0aGlzLnJlbmRlcihldnQubW9kYWxOYW1lLCB7CisgICAgICAgICAgICAgIG91
dGxldDogJ21vZGFsJywKKyAgICAgICAgICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJworICAgICAg
ICAgICAgfSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBoaWRlTW9kYWw6IGZ1bmN0aW9uKGV2
dCkgeworICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0T3V0bGV0KHsKKyAgICAgICAgICAgICAg
b3V0bGV0OiAnbW9kYWwnLAorICAgICAgICAgICAgICBwYXJlbnRWaWV3OiAnYXBwbGljYXRpb24n
CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgYGBgCisgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwYXNzIHRoZSBgb3V0bGV0YCBu
YW1lIGRpcmVjdGx5IGFzIGEgc3RyaW5nLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgaGlkZU1vZGFsOiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgdGhpcy5k
aXNjb25uZWN0T3V0bGV0KCdtb2RhbCcpOworICAgICAgfQorICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBkaXNjb25uZWN0T3V0bGV0CisgICAgICBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlv
bnMgdGhlIG9wdGlvbnMgaGFzaCBvciBvdXRsZXQgbmFtZQorICAgICAgQHB1YmxpYworICAgICov
CisgICAgZGlzY29ubmVjdE91dGxldDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgIHZhciBv
dXRsZXROYW1lOworICAgICAgdmFyIHBhcmVudFZpZXc7CisgICAgICBpZiAoIW9wdGlvbnMgfHwg
dHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIG91dGxldE5hbWUgPSBvcHRp
b25zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0bGV0TmFtZSA9IG9wdGlvbnMub3V0bGV0
OworICAgICAgICBwYXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRWaWV3OworCisgICAgICAgIGlm
IChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmluZGV4T2YoJ291dGxldCcpICE9PSAt
MSAmJiB0eXBlb2Ygb3B0aW9ucy5vdXRsZXQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAg
dGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91IHBhc3NlZCB1bmRlZmluZWQg
YXMgdGhlIG91dGxldCBuYW1lLicpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwYXJlbnRW
aWV3ID0gcGFyZW50VmlldyAmJiBwYXJlbnRWaWV3LnJlcGxhY2UoL1wvL2csICcuJyk7CisgICAg
ICBvdXRsZXROYW1lID0gb3V0bGV0TmFtZSB8fCAnbWFpbic7CisgICAgICB0aGlzLl9kaXNjb25u
ZWN0T3V0bGV0KG91dGxldE5hbWUsIHBhcmVudFZpZXcpOworICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCB0aGlzLnJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGg7IGkrKykg
eworICAgICAgICAvLyBUaGlzIG5vbi1sb2NhbCBzdGF0ZSBtdW5naW5nIGlzIHNhZGx5IG5lY2Vz
c2FyeSB0byBtYWludGFpbgorICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgg
b3VyIGV4aXN0aW5nIHNlbWFudGljcywgd2hpY2ggYWxsb3cKKyAgICAgICAgLy8gYW55IHJvdXRl
IHRvIGRpc2Nvbm5lY3RPdXRsZXQgdGhpbmdzIG9yaWdpbmFsbHkgcmVuZGVyZWQgYnkgYW55Cisg
ICAgICAgIC8vIG90aGVyIHJvdXRlLiBUaGlzIHNob3VsZCBhbGwgZ2V0IGN1dCBpbiAyLjAuCisg
ICAgICAgIHRoaXMucm91dGVyLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zW2ldLmhhbmRsZXIu
X2Rpc2Nvbm5lY3RPdXRsZXQob3V0bGV0TmFtZSwgcGFyZW50Vmlldyk7CisgICAgICB9CisgICAg
fSwKKworICAgIF9kaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbiAob3V0bGV0TmFtZSwgcGFyZW50
VmlldykgeworICAgICAgdmFyIHBhcmVudCA9IHBhcmVudFJvdXRlKHRoaXMpOworICAgICAgaWYg
KHBhcmVudCAmJiBwYXJlbnRWaWV3ID09PSBwYXJlbnQucm91dGVOYW1lKSB7CisgICAgICAgIHBh
cmVudFZpZXcgPSB1bmRlZmluZWQ7CisgICAgICB9CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNvbm5lY3Rpb24g
PSB0aGlzLmNvbm5lY3Rpb25zW2ldOworICAgICAgICBpZiAoY29ubmVjdGlvbi5vdXRsZXQgPT09
IG91dGxldE5hbWUgJiYgY29ubmVjdGlvbi5pbnRvID09PSBwYXJlbnRWaWV3KSB7CisgICAgICAg
ICAgLy8gVGhpcyBuZXV0ZXJzIHRoZSBkaXNjb25uZWN0ZWQgb3V0bGV0IHN1Y2ggdGhhdCBpdCBk
b2Vzbid0CisgICAgICAgICAgLy8gcmVuZGVyIGFueXRoaW5nLCBidXQgaXQgbGVhdmVzIGFuIGVu
dHJ5IGluIHRoZSBvdXRsZXQKKyAgICAgICAgICAvLyBoaWVyYXJjaHkgc28gdGhhdCBhbnkgZXhp
c3Rpbmcgb3RoZXIgcmVuZGVycyB0aGF0IHRhcmdldCBpdAorICAgICAgICAgIC8vIGRvbid0IHN1
ZGRlbmx5IGJsb3cgdXAuIFRoZXkgd2lsbCBzdGlsbCBzdGljayB0aGVtc2VsdmVzCisgICAgICAg
ICAgLy8gaW50byBpdHMgb3V0bGV0cywgd2hpY2ggd29uJ3QgcmVuZGVyIGFueXdoZXJlLiBBbGwg
b2YgdGhpcworICAgICAgICAgIC8vIHN0YXRlZnVsbmVzcyBzaG91bGQgZ2V0IHRoZSBtYWNoZXRl
IGluIDIuMC4KKyAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25zW2ldID0geworICAgICAgICAgICAg
b3duZXI6IGNvbm5lY3Rpb24ub3duZXIsCisgICAgICAgICAgICBpbnRvOiBjb25uZWN0aW9uLmlu
dG8sCisgICAgICAgICAgICBvdXRsZXQ6IGNvbm5lY3Rpb24ub3V0bGV0LAorICAgICAgICAgICAg
bmFtZTogY29ubmVjdGlvbi5uYW1lLAorICAgICAgICAgICAgY29udHJvbGxlcjogdW5kZWZpbmVk
LAorICAgICAgICAgICAgdGVtcGxhdGU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgIFZpZXdDbGFz
czogdW5kZWZpbmVkCisgICAgICAgICAgfTsKKyAgICAgICAgICBfZW1iZXJNZXRhbFJ1bl9sb29w
LmRlZmF1bHQub25jZSh0aGlzLnJvdXRlciwgJ19zZXRPdXRsZXRzJyk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRo
aXMudGVhcmRvd25WaWV3cygpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisg
ICAgICAgQG1ldGhvZCB0ZWFyZG93blZpZXdzCisgICAgKi8KKyAgICB0ZWFyZG93blZpZXdzOiBm
dW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5jb25uZWN0aW9ucyAmJiB0aGlzLmNvbm5lY3Rp
b25zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdOworICAgICAg
ICBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLnJvdXRlciwgJ19zZXRPdXRs
ZXRzJyk7CisgICAgICB9CisgICAgfQorICB9KTsKKworICBfZW1iZXJSdW50aW1lTWl4aW5zQWN0
aW9uX2hhbmRsZXIuZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMoUm91dGUpOworCisgIFJvdXRl
LnJlb3BlbkNsYXNzKHsKKyAgICBpc1JvdXRlRmFjdG9yeTogdHJ1ZQorICB9KTsKKworICBmdW5j
dGlvbiBwYXJlbnRSb3V0ZShyb3V0ZSkgeworICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJ
bmZvRm9yKHJvdXRlLCByb3V0ZS5yb3V0ZXIucm91dGVyLnN0YXRlLmhhbmRsZXJJbmZvcywgLTEp
OworICAgIHJldHVybiBoYW5kbGVySW5mbyAmJiBoYW5kbGVySW5mby5oYW5kbGVyOworICB9CisK
KyAgZnVuY3Rpb24gaGFuZGxlckluZm9Gb3Iocm91dGUsIGhhbmRsZXJJbmZvcywgX29mZnNldCkg
eworICAgIGlmICghaGFuZGxlckluZm9zKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAg
dmFyIG9mZnNldCA9IF9vZmZzZXQgfHwgMDsKKyAgICB2YXIgY3VycmVudDsKKyAgICBmb3IgKHZh
ciBpID0gMCwgbCA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGN1
cnJlbnQgPSBoYW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKKyAgICAgIGlmIChjdXJyZW50ID09PSBy
b3V0ZSkgeworICAgICAgICByZXR1cm4gaGFuZGxlckluZm9zW2kgKyBvZmZzZXRdOworICAgICAg
fQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkUmVuZGVyT3B0aW9ucyhyb3V0ZSwgbmFt
ZVBhc3NlZCwgaXNEZWZhdWx0UmVuZGVyLCBuYW1lLCBvcHRpb25zKSB7CisgICAgdmFyIGNvbnRy
b2xsZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udHJvbGxlcjsKKyAgICB2YXIgdGVtcGxhdGVO
YW1lOworICAgIHZhciB2aWV3TmFtZTsKKyAgICB2YXIgVmlld0NsYXNzOworICAgIHZhciB0ZW1w
bGF0ZTsKKyAgICB2YXIgTE9HX1ZJRVdfTE9PS1VQUyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldChyb3V0ZS5yb3V0ZXIsICduYW1lc3BhY2UuTE9HX1ZJRVdfTE9PS1VQUycpOworICAgIHZh
ciBpbnRvID0gb3B0aW9ucyAmJiBvcHRpb25zLmludG8gJiYgb3B0aW9ucy5pbnRvLnJlcGxhY2Uo
L1wvL2csICcuJyk7CisgICAgdmFyIG91dGxldCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5vdXRsZXQg
fHwgJ21haW4nOworICAgIHZhciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcihyb3V0
ZSk7CisKKyAgICBpZiAobmFtZSkgeworICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXC8vZywg
Jy4nKTsKKyAgICAgIHRlbXBsYXRlTmFtZSA9IG5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5h
bWUgPSByb3V0ZS5yb3V0ZU5hbWU7CisgICAgICB0ZW1wbGF0ZU5hbWUgPSByb3V0ZS50ZW1wbGF0
ZU5hbWUgfHwgbmFtZTsKKyAgICB9CisKKyAgICBpZiAoIWNvbnRyb2xsZXIpIHsKKyAgICAgIGlm
IChuYW1lUGFzc2VkKSB7CisgICAgICAgIGNvbnRyb2xsZXIgPSBvd25lci5sb29rdXAoJ2NvbnRy
b2xsZXI6JyArIG5hbWUpIHx8IHJvdXRlLmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJvdXRlTmFt
ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRyb2xsZXIgPSByb3V0ZS5jb250cm9sbGVy
TmFtZSB8fCBvd25lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpOworICAgICAgfQorICAg
IH0KKworICAgIGlmICh0eXBlb2YgY29udHJvbGxlciA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHZh
ciBjb250cm9sbGVyTmFtZSA9IGNvbnRyb2xsZXI7CisgICAgICBjb250cm9sbGVyID0gb3duZXIu
bG9va3VwKCdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZSk7CisgICAgICBpZiAoIWNvbnRy
b2xsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91
IHBhc3NlZCBgY29udHJvbGxlcjogXCcnICsgY29udHJvbGxlck5hbWUgKyAnXCdgIGludG8gdGhl
IGByZW5kZXJgIG1ldGhvZCwgYnV0IG5vIHN1Y2ggY29udHJvbGxlciBjb3VsZCBiZSBmb3VuZC4n
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRp
b25zKS5pbmRleE9mKCdvdXRsZXQnKSAhPT0gLTEgJiYgdHlwZW9mIG9wdGlvbnMub3V0bGV0ID09
PSAndW5kZWZpbmVkJykgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnWW91IHBhc3NlZCB1bmRlZmluZWQgYXMgdGhlIG91dGxldCBuYW1lLicpOworICAgIH0KKwor
ICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubW9kZWwpIHsKKyAgICAgIGNvbnRyb2xsZXIuc2V0
KCdtb2RlbCcsIG9wdGlvbnMubW9kZWwpOworICAgIH0KKworICAgIHZpZXdOYW1lID0gb3B0aW9u
cyAmJiBvcHRpb25zLnZpZXcgfHwgbmFtZVBhc3NlZCAmJiBuYW1lIHx8IHJvdXRlLnZpZXdOYW1l
IHx8IG5hbWU7CisgICAgVmlld0NsYXNzID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoJ3ZpZXc6JyAr
IHZpZXdOYW1lKTsKKyAgICB0ZW1wbGF0ZSA9IG93bmVyLmxvb2t1cCgndGVtcGxhdGU6JyArIHRl
bXBsYXRlTmFtZSk7CisKKyAgICB2YXIgcGFyZW50OworICAgIGlmIChpbnRvICYmIChwYXJlbnQg
PSBwYXJlbnRSb3V0ZShyb3V0ZSkpICYmIGludG8gPT09IHBhcmVudFJvdXRlKHJvdXRlKS5yb3V0
ZU5hbWUpIHsKKyAgICAgIGludG8gPSB1bmRlZmluZWQ7CisgICAgfQorCisgICAgdmFyIHJlbmRl
ck9wdGlvbnMgPSB7CisgICAgICBvd25lcjogb3duZXIsCisgICAgICBpbnRvOiBpbnRvLAorICAg
ICAgb3V0bGV0OiBvdXRsZXQsCisgICAgICBuYW1lOiBuYW1lLAorICAgICAgY29udHJvbGxlcjog
Y29udHJvbGxlciwKKyAgICAgIFZpZXdDbGFzczogVmlld0NsYXNzLAorICAgICAgdGVtcGxhdGU6
IHRlbXBsYXRlIHx8IHJvdXRlLl90b3BMZXZlbFZpZXdUZW1wbGF0ZQorICAgIH07CisKKyAgICB2
YXIgQ29tcG9uZW50ID0gdW5kZWZpbmVkOworCisgICAgaWYgKCFWaWV3Q2xhc3MgJiYgIXRlbXBs
YXRlICYmICFDb21wb25lbnQpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDb3Vs
ZCBub3QgZmluZCAiJyArIG5hbWUgKyAnIiB0ZW1wbGF0ZSwgdmlldywgb3IgY29tcG9uZW50Lics
IGlzRGVmYXVsdFJlbmRlcik7CisgICAgICBpZiAoTE9HX1ZJRVdfTE9PS1VQUykgeworICAgICAg
ICB2YXIgZnVsbE5hbWUgPSAndGVtcGxhdGU6JyArIG5hbWU7CisgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuaW5mbygnQ291bGQgbm90IGZpbmQgIicgKyBuYW1lICsgJyIgdGVtcGxhdGUgb3Igdmll
dy4gTm90aGluZyB3aWxsIGJlIHJlbmRlcmVkJywgeyBmdWxsTmFtZTogZnVsbE5hbWUgfSk7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlck9wdGlvbnM7CisgIH0KKworICBmdW5j
dGlvbiBnZXRGdWxsUXVlcnlQYXJhbXMocm91dGVyLCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5m
dWxsUXVlcnlQYXJhbXMpIHsKKyAgICAgIHJldHVybiBzdGF0ZS5mdWxsUXVlcnlQYXJhbXM7Cisg
ICAgfQorCisgICAgc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zID0ge307CisgICAgX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdChzdGF0ZS5mdWxsUXVlcnlQYXJhbXMsIHN0YXRlLnF1ZXJ5UGFyYW1zKTsK
KworICAgIHZhciB0YXJnZXRSb3V0ZU5hbWUgPSBzdGF0ZS5oYW5kbGVySW5mb3Nbc3RhdGUuaGFu
ZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWU7CisgICAgcm91dGVyLl9kZXNlcmlhbGl6ZVF1ZXJ5
UGFyYW1zKHRhcmdldFJvdXRlTmFtZSwgc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zKTsKKyAgICByZXR1
cm4gc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zOworICB9CisKKyAgZnVuY3Rpb24gZ2V0UXVlcnlQYXJh
bXNGb3Iocm91dGUsIHN0YXRlKSB7CisgICAgc3RhdGUucXVlcnlQYXJhbXNGb3IgPSBzdGF0ZS5x
dWVyeVBhcmFtc0ZvciB8fCB7fTsKKyAgICB2YXIgbmFtZSA9IHJvdXRlLnJvdXRlTmFtZTsKKwor
ICAgIGlmIChzdGF0ZS5xdWVyeVBhcmFtc0ZvcltuYW1lXSkgeworICAgICAgcmV0dXJuIHN0YXRl
LnF1ZXJ5UGFyYW1zRm9yW25hbWVdOworICAgIH0KKworICAgIHZhciBmdWxsUXVlcnlQYXJhbXMg
PSBnZXRGdWxsUXVlcnlQYXJhbXMocm91dGUucm91dGVyLCBzdGF0ZSk7CisKKyAgICB2YXIgcGFy
YW1zID0gc3RhdGUucXVlcnlQYXJhbXNGb3JbbmFtZV0gPSB7fTsKKworICAgIC8vIENvcHkgb3Zl
ciBhbGwgdGhlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhpcyByb3V0ZS9jb250cm9sbGVyIGludG8gcGFy
YW1zIGhhc2guCisgICAgdmFyIHFwTWV0YSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChy
b3V0ZSwgJ19xcCcpOworICAgIHZhciBxcHMgPSBxcE1ldGEucXBzOworICAgIGZvciAodmFyIGkg
PSAwLCBsZW4gPSBxcHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgIC8vIFB1dCBkZXNl
cmlhbGl6ZWQgcXAgb24gcGFyYW1zIGhhc2guCisgICAgICB2YXIgcXAgPSBxcHNbaV07CisKKyAg
ICAgIHZhciBxcFZhbHVlV2FzUGFzc2VkSW4gPSAocXAucHJvcCBpbiBmdWxsUXVlcnlQYXJhbXMp
OworICAgICAgcGFyYW1zW3FwLnByb3BdID0gcXBWYWx1ZVdhc1Bhc3NlZEluID8gZnVsbFF1ZXJ5
UGFyYW1zW3FwLnByb3BdIDogY29weURlZmF1bHRWYWx1ZShxcC5kZWZhdWx0VmFsdWUpOworICAg
IH0KKworICAgIHJldHVybiBwYXJhbXM7CisgIH0KKworICBmdW5jdGlvbiBjb3B5RGVmYXVsdFZh
bHVlKHZhbHVlKSB7CisgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHZhbHVlLnNsaWNlKCkpOworICAg
IH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvKgorICAgIE1lcmdlcyBhbGwgcXVlcnkg
cGFyYW1ldGVycyBmcm9tIGEgY29udHJvbGxlciB3aXRoIHRob3NlIGZyb20KKyAgICBhIHJvdXRl
LCByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IGFuZCBhdm9pZGluZyBhbnkgbXV0YXRpb25zIHRvCisg
ICAgdGhlIGV4aXN0aW5nIG9iamVjdHMuCisgICovCisgIGZ1bmN0aW9uIG1lcmdlRWFjaFF1ZXJ5
UGFyYW1zKGNvbnRyb2xsZXJRUCwgcm91dGVRUCkgeworICAgIHZhciBrZXlzQWxyZWFkeU1lcmdl
ZE9yU2tpcHBhYmxlOworICAgIHZhciBxcHMgPSB7fTsKKworICAgIGtleXNBbHJlYWR5TWVyZ2Vk
T3JTa2lwcGFibGUgPSB7CisgICAgICBkZWZhdWx0VmFsdWU6IHRydWUsCisgICAgICB0eXBlOiB0
cnVlLAorICAgICAgc2NvcGU6IHRydWUsCisgICAgICBhczogdHJ1ZQorICAgIH07CisKKyAgICAv
LyBmaXJzdCBsb29wIG92ZXIgYWxsIGNvbnRyb2xsZXIgcXBzLCBtZXJnaW5nIHRoZW0gd2l0aCBh
bnkgbWF0Y2hpbmcgcm91dGUgcXBzCisgICAgLy8gaW50byBhIG5ldyBlbXB0eSBvYmplY3QgdG8g
YXZvaWQgbXV0YXRpbmcuCisgICAgZm9yICh2YXIgY3FwTmFtZSBpbiBjb250cm9sbGVyUVApIHsK
KyAgICAgIGlmICghY29udHJvbGxlclFQLmhhc093blByb3BlcnR5KGNxcE5hbWUpKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbmV3Q29udHJvbGxlclBhcmFtZXRl
ckNvbmZpZ3VyYXRpb24gPSB7fTsKKyAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQobmV3
Q29udHJvbGxlclBhcmFtZXRlckNvbmZpZ3VyYXRpb24sIGNvbnRyb2xsZXJRUFtjcXBOYW1lXSk7
CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5ld0NvbnRyb2xsZXJQYXJhbWV0ZXJD
b25maWd1cmF0aW9uLCByb3V0ZVFQW2NxcE5hbWVdKTsKKworICAgICAgcXBzW2NxcE5hbWVdID0g
bmV3Q29udHJvbGxlclBhcmFtZXRlckNvbmZpZ3VyYXRpb247CisKKyAgICAgIC8vIGFsbG93cyB1
cyB0byBza2lwIHRoaXMgUVAgd2hlbiB3ZSBjaGVjayByb3V0ZSBRUHMuCisgICAgICBrZXlzQWxy
ZWFkeU1lcmdlZE9yU2tpcHBhYmxlW2NxcE5hbWVdID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBs
b29wIG92ZXIgYWxsIHJvdXRlIHFwcywgc2tpcHBpbmcgdGhvc2UgdGhhdCB3ZXJlIG1lcmdlZCBp
biB0aGUgZmlyc3QgcGFzcworICAgIC8vIGJlY2F1c2UgdGhleSBhbHNvIGFwcGVhciBpbiBjb250
cm9sbGVyIHFwcworICAgIGZvciAodmFyIHJxcE5hbWUgaW4gcm91dGVRUCkgeworICAgICAgaWYg
KCFyb3V0ZVFQLmhhc093blByb3BlcnR5KHJxcE5hbWUpIHx8IGtleXNBbHJlYWR5TWVyZ2VkT3JT
a2lwcGFibGVbcnFwTmFtZV0pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAg
IHZhciBuZXdSb3V0ZVBhcmFtZXRlckNvbmZpZ3VyYXRpb24gPSB7fTsKKyAgICAgIF9lbWJlck1l
dGFsQXNzaWduLmRlZmF1bHQobmV3Um91dGVQYXJhbWV0ZXJDb25maWd1cmF0aW9uLCByb3V0ZVFQ
W3JxcE5hbWVdLCBjb250cm9sbGVyUVBbcnFwTmFtZV0pOworICAgICAgcXBzW3JxcE5hbWVdID0g
bmV3Um91dGVQYXJhbWV0ZXJDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBxcHM7
CisgIH0KKworICBmdW5jdGlvbiBhZGRRdWVyeVBhcmFtc09ic2VydmVycyhjb250cm9sbGVyLCBw
cm9wTmFtZXMpIHsKKyAgICBwcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeworICAg
ICAgY29udHJvbGxlci5hZGRPYnNlcnZlcihwcm9wICsgJy5bXScsIGNvbnRyb2xsZXIsIGNvbnRy
b2xsZXIuX3FwQ2hhbmdlZCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZXByZWNhdGVR
dWVyeVBhcmFtRGVmYXVsdFZhbHVlc1NldE9uQ29udHJvbGxlcihjb250cm9sbGVyTmFtZSwgcm91
dGVOYW1lLCBwcm9wTmFtZSkgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdDb25m
aWd1cmluZyBxdWVyeSBwYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZXMgb24gY29udHJvbGxlcnMgaXMg
ZGVwcmVjYXRlZC4gUGxlYXNlIG1vdmUgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgXCcnICsg
cHJvcE5hbWUgKyAnXCcgZnJvbSB0aGUgXCcnICsgY29udHJvbGxlck5hbWUgKyAnXCcgY29udHJv
bGxlciB0byB0aGUgXCcnICsgcm91dGVOYW1lICsgJ1wnIHJvdXRlIGluIHRoZSBmb3JtYXQ6IHtx
dWVyeVBhcmFtczogJyArIHByb3BOYW1lICsgJzoge2RlZmF1bHRWYWx1ZTogPGRlZmF1bHQgdmFs
dWU+IH19JywgZmFsc2UsIHsgaWQ6ICdlbWJlci1yb3V0aW5nLmRlcHJlY2F0ZS1xdWVyeS1wYXJh
bS1kZWZhdWx0LXZhbHVlcy1zZXQtb24tY29udHJvbGxlcicsIHVudGlsOiAnMy4wLjAnIH0pOwor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUm91dGU7Cit9KTsKKy8vIEZFQVRVUkVTLCBBLCBk
ZXByZWNhdGUsIGFzc2VydCwgTG9nZ2VyCisKKy8vIGFwcGx5IGRlZmF1bHQgdmFsdWVzIHRvIGNv
bnRyb2xsZXJzCisvLyBkZXRlY3QgdGhhdCBkZWZhdWx0IHZhbHVlIGRlZmluZWQgb24gcm91dGVy
IGNvbmZpZworCisvLyBkZXRlY3QgdGhhdCBwcm9wZXJ0eSB3YXMgbm90IGRlZmluZWQgb24gY29u
dHJvbGxlcgorZW5pZmVkKCdlbWJlci1yb3V0aW5nL3N5c3RlbS9yb3V0ZXInLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFs
L2Vycm9yJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9zZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmpl
Y3QnLCAnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVy
LW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1y
dW50aW1lL21peGlucy9ldmVudGVkJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCcsICdlbWJl
ci1yb3V0aW5nL2xvY2F0aW9uL2FwaScsICdlbWJlci1yb3V0aW5nL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL3V0aWxzJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL3JvdXRlcl9zdGF0ZScsICdjb250YWlu
ZXIvb3duZXInLCAnZW1iZXItbWV0YWwvZGljdGlvbmFyeScsICdyb3V0ZXInLCAncm91dGVyL3Ry
YW5zaXRpb24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTG9nZ2VyLCBfZW1iZXJN
ZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1i
ZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1l
TWl4aW5zRXZlbnRlZCwgX2VtYmVyUm91dGluZ1N5c3RlbURzbCwgX2VtYmVyUm91dGluZ0xvY2F0
aW9uQXBpLCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlclJvdXRp
bmdTeXN0ZW1Sb3V0ZXJfc3RhdGUsIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxEaWN0aW9u
YXJ5LCBfcm91dGVyNCwgX3JvdXRlclRyYW5zaXRpb24pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMudHJpZ2dlckV2ZW50ID0gdHJpZ2dlckV2ZW50OworCisgIGZ1bmN0aW9uIEsoKSB7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICB2YXIgc2xpY2UgPSBbXS5zbGljZTsKKworICAv
KioKKyAgICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0aGUgYXBwbGljYXRpb24g
c3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCisgICAgdGhlIFtyb3V0aW5nIGd1aWRlXShodHRwOi8v
ZW1iZXJqcy5jb20vZ3VpZGVzL3JvdXRpbmcvKSBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgCisgICAg
QGNsYXNzIFJvdXRlcgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5P
YmplY3QKKyAgICBAdXNlcyBFbWJlci5FdmVudGVkCisgICAgQHB1YmxpYworICAqLworICB2YXIg
RW1iZXJSb3V0ZXIgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKF9l
bWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLmRlZmF1bHQsIHsKKyAgICAvKioKKyAgICAgIFRoZSBg
bG9jYXRpb25gIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHR5cGUgb2YgVVJMJ3MgdGhhdCB5b3Vy
CisgICAgICBhcHBsaWNhdGlvbiB3aWxsIHVzZS4KKyAgICAgICBUaGUgZm9sbG93aW5nIGxvY2F0
aW9uIHR5cGVzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlOgorICAgICAgICogYGhpc3RvcnlgIC0g
dXNlIHRoZSBicm93c2VyJ3MgaGlzdG9yeSBBUEkgdG8gbWFrZSB0aGUgVVJMcyBsb29rIGp1c3Qg
bGlrZSBhbnkgc3RhbmRhcmQgVVJMCisgICAgICAqIGBoYXNoYCAtIHVzZSBgI2AgdG8gc2VwYXJh
dGUgdGhlIHNlcnZlciBwYXJ0IG9mIHRoZSBVUkwgZnJvbSB0aGUgRW1iZXIgcGFydDogYC9ibG9n
LyMvcG9zdHMvbmV3YAorICAgICAgKiBgbm9uZWAgLSBkbyBub3Qgc3RvcmUgdGhlIEVtYmVyIFVS
TCBpbiB0aGUgYWN0dWFsIGJyb3dzZXIgVVJMIChtYWlubHkgdXNlZCBmb3IgdGVzdGluZykKKyAg
ICAgICogYGF1dG9gIC0gdXNlIHRoZSBiZXN0IG9wdGlvbiBiYXNlZCBvbiBicm93c2VyIGNhcGFi
aWxpdGVzOiBgaGlzdG9yeWAgaWYgcG9zc2libGUsIHRoZW4gYGhhc2hgIGlmIHBvc3NpYmxlLCBv
dGhlcndpc2UgYG5vbmVgCisgICAgICAgTm90ZTogSWYgdXNpbmcgZW1iZXItY2xpLCB0aGlzIHZh
bHVlIGlzIGRlZmF1bHRlZCB0byBgYXV0b2AgYnkgdGhlIGBsb2NhdGlvblR5cGVgIHNldHRpbmcg
b2YgYC9jb25maWcvZW52aXJvbm1lbnQuanNgCisgICAgICAgQHByb3BlcnR5IGxvY2F0aW9uCisg
ICAgICBAZGVmYXVsdCAnaGFzaCcKKyAgICAgIEBzZWUge0VtYmVyLkxvY2F0aW9ufQorICAgICAg
QHB1YmxpYworICAgICovCisgICAgbG9jYXRpb246ICdoYXNoJywKKworICAgIC8qKgorICAgICBS
ZXByZXNlbnRzIHRoZSBVUkwgb2YgdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uLCBvZnRlbiAn
LycuIFRoaXMgcHJlZml4IGlzCisgICAgIGFzc3VtZWQgb24gYWxsIHJvdXRlcyBkZWZpbmVkIG9u
IHRoaXMgcm91dGVyLgorICAgICAgQHByb3BlcnR5IHJvb3RVUkwKKyAgICAgQGRlZmF1bHQgJy8n
CisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJvb3RVUkw6ICcvJywKKworICAgIF9pbml0Um91
dGVySnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlciA9IG5l
dyBfcm91dGVyNC5kZWZhdWx0KCk7CisgICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0gdHJpZ2dl
ckV2ZW50OworCisgICAgICByb3V0ZXIuX3RyaWdnZXJXaWxsQ2hhbmdlQ29udGV4dCA9IEs7Cisg
ICAgICByb3V0ZXIuX3RyaWdnZXJXaWxsTGVhdmUgPSBLOworCisgICAgICB2YXIgZHNsQ2FsbGJh
Y2tzID0gdGhpcy5jb25zdHJ1Y3Rvci5kc2xDYWxsYmFja3MgfHwgW0tdOworICAgICAgdmFyIGRz
bCA9IHRoaXMuX2J1aWxkRFNMKCk7CisKKyAgICAgIGRzbC5yb3V0ZSgnYXBwbGljYXRpb24nLCB7
IHBhdGg6ICcvJywgcmVzZXROYW1lc3BhY2U6IHRydWUsIG92ZXJyaWRlTmFtZUFzc2VydGlvbjog
dHJ1ZSB9LCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHNsQ2Fs
bGJhY2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgZHNsQ2FsbGJhY2tzW2ldLmNhbGwodGhp
cyk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICduYW1lc3BhY2UuTE9HX1RSQU5TSVRJT05TX0lOVEVSTkFMJykpIHsK
KyAgICAgICAgcm91dGVyLmxvZyA9IF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQuZGVidWc7Cisg
ICAgICB9CisKKyAgICAgIHJvdXRlci5tYXAoZHNsLmdlbmVyYXRlKCkpOworICAgIH0sCisKKyAg
ICBfYnVpbGREU0w6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBtb2R1bGVCYXNlZFJlc29sdmVy
ID0gdGhpcy5faGFzTW9kdWxlQmFzZWRSZXNvbHZlcigpOworCisgICAgICByZXR1cm4gbmV3IF9l
bWJlclJvdXRpbmdTeXN0ZW1Ec2wuZGVmYXVsdChudWxsLCB7CisgICAgICAgIGVuYWJsZUxvYWRp
bmdTdWJzdGF0ZXM6ICEhbW9kdWxlQmFzZWRSZXNvbHZlcgorICAgICAgfSk7CisgICAgfSwKKwor
ICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisKKyAgICAgIHRoaXMuX2FjdGl2ZVZpZXdzID0ge307CisgICAgICB0aGlzLl9x
cENhY2hlID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHRo
aXMuX3Jlc2V0UXVldWVkUXVlcnlQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICB0aGlzLl9oYW5k
bGVkRXJyb3JzID0gX2VtYmVyTWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQobnVsbCk7CisgICAgfSwK
KworICAgIC8qCisgICAgICBSZXNldHMgYWxsIHBlbmRpbmcgcXVlcnkgcGFyYW10ZXIgY2hhbmdl
cy4KKyAgICAgIENhbGxlZCBhZnRlciB0cmFuc2l0aW9uaW5nIHRvIGEgbmV3IHJvdXRlCisgICAg
ICBiYXNlZCBvbiBxdWVyeSBwYXJhbWV0ZXIgY2hhbmdlcy4KKyAgICAqLworICAgIF9yZXNldFF1
ZXVlZFF1ZXJ5UGFyYW1ldGVyQ2hhbmdlczogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fcXVl
dWVkUVBDaGFuZ2VzID0ge307CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVwcmVzZW50cyB0
aGUgY3VycmVudCBVUkwuCisgICAgICAgQG1ldGhvZCB1cmwKKyAgICAgIEByZXR1cm4ge1N0cmlu
Z30gVGhlIGN1cnJlbnQgVVJMLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHVybDogX2Vt
YmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsb2NhdGlvbicpLmdldFVSTCgpOworICAg
IH0pLAorCisgICAgX2hhc01vZHVsZUJhc2VkUmVzb2x2ZXI6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHZhciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKworICAgICAgaWYg
KCFvd25lcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciBy
ZXNvbHZlciA9IG93bmVyLmFwcGxpY2F0aW9uICYmIG93bmVyLmFwcGxpY2F0aW9uLl9fcmVnaXN0
cnlfXyAmJiBvd25lci5hcHBsaWNhdGlvbi5fX3JlZ2lzdHJ5X18ucmVzb2x2ZXI7CisKKyAgICAg
IGlmICghcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAg
ICByZXR1cm4gISFyZXNvbHZlci5tb2R1bGVCYXNlZFJlc29sdmVyOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIEluaXRpYWxpemVzIHRoZSBjdXJyZW50IHJvdXRlciBpbnN0YW5jZSBhbmQgc2V0
cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCisgICAgICBldmVudCBsaXN0ZW5lcnMgdXNlZCBieSB0
aGUgaW5zdGFuY2VzIGBsb2NhdGlvbmAgaW1wbGVtZW50YXRpb24uCisgICAgICAgQSBwcm9wZXJ0
eSBuYW1lZCBgaW5pdGlhbFVSTGAgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlh
bCBVUkwuCisgICAgICBJZiBubyB2YWx1ZSBpcyBmb3VuZCBgL2Agd2lsbCBiZSB1c2VkLgorICAg
ICAgIEBtZXRob2Qgc3RhcnRSb3V0aW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgc3Rh
cnRSb3V0aW5nOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5pdGlhbFVSTCA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaW5pdGlhbFVSTCcpOworCisgICAgICBpZiAodGhp
cy5zZXR1cFJvdXRlcigpKSB7CisgICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFVSTCA9PT0gJ3Vu
ZGVmaW5lZCcpIHsKKyAgICAgICAgICBpbml0aWFsVVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdsb2NhdGlvbicpLmdldFVSTCgpOworICAgICAgICB9CisgICAgICAgIHZh
ciBpbml0aWFsVHJhbnNpdGlvbiA9IHRoaXMuaGFuZGxlVVJMKGluaXRpYWxVUkwpOworICAgICAg
ICBpZiAoaW5pdGlhbFRyYW5zaXRpb24gJiYgaW5pdGlhbFRyYW5zaXRpb24uZXJyb3IpIHsKKyAg
ICAgICAgICB0aHJvdyBpbml0aWFsVHJhbnNpdGlvbi5lcnJvcjsKKyAgICAgICAgfQorICAgICAg
fQorICAgIH0sCisKKyAgICBzZXR1cFJvdXRlcjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF90
aGlzID0gdGhpczsKKworICAgICAgdGhpcy5faW5pdFJvdXRlckpzKCk7CisgICAgICB0aGlzLl9z
ZXR1cExvY2F0aW9uKCk7CisKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKKyAgICAg
IHZhciBsb2NhdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbG9jYXRp
b24nKTsKKworICAgICAgLy8gQWxsb3cgdGhlIExvY2F0aW9uIGNsYXNzIHRvIGNhbmNlbCB0aGUg
cm91dGVyIHNldHVwIHdoaWxlIGl0IHJlZnJlc2hlcworICAgICAgLy8gdGhlIHBhZ2UKKyAgICAg
IGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobG9jYXRpb24sICdjYW5jZWxSb3V0ZXJT
ZXR1cCcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5f
c2V0dXBSb3V0ZXIocm91dGVyLCBsb2NhdGlvbik7CisKKyAgICAgIGxvY2F0aW9uLm9uVXBkYXRl
VVJMKGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgICAgX3RoaXMuaGFuZGxlVVJMKHVybCk7CisgICAg
ICB9KTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSGFu
ZGxlcyB1cGRhdGluZyB0aGUgcGF0aHMgYW5kIG5vdGlmeWluZyBhbnkgbGlzdGVuZXJzIG9mIHRo
ZSBVUkwKKyAgICAgIGNoYW5nZS4KKyAgICAgICBUcmlnZ2VycyB0aGUgcm91dGVyIGxldmVsIGBk
aWRUcmFuc2l0aW9uYCBob29rLgorICAgICAgIEZvciBleGFtcGxlLCB0byBub3RpZnkgZ29vZ2xl
IGFuYWx5dGljcyB3aGVuIHRoZSByb3V0ZSBjaGFuZ2VzLAorICAgICAgeW91IGNvdWxkIHVzZSB0
aGlzIGhvb2suICAoTm90ZTogcmVxdWlyZXMgYWxzbyBpbmNsdWRpbmcgR0Egc2NyaXB0cywgZXRj
LikKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgUm91dGVyID0gRW1iZXIuUm91dGVy
LmV4dGVuZCh7CisgICAgICAgIGxvY2F0aW9uOiBjb25maWcubG9jYXRpb25UeXBlLAorICAgICAg
ICAgZGlkVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIoLi4u
YXJndW1lbnRzKTsKKyAgICAgICAgICAgcmV0dXJuIGdhKCdzZW5kJywgJ3BhZ2V2aWV3Jywgewor
ICAgICAgICAgICAgJ3BhZ2UnOiB0aGlzLmdldCgndXJsJyksCisgICAgICAgICAgICAndGl0bGUn
OiB0aGlzLmdldCgndXJsJykKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGRpZFRyYW5zaXRpb24KKyAgICAgIEBwdWJsaWMKKyAg
ICAgIEBzaW5jZSAxLjIuMAorICAgICovCisgICAgZGlkVHJhbnNpdGlvbjogZnVuY3Rpb24gKGlu
Zm9zKSB7CisgICAgICB1cGRhdGVQYXRocyh0aGlzKTsKKworICAgICAgdGhpcy5fY2FuY2VsU2xv
d1RyYW5zaXRpb25UaW1lcigpOworCisgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCd1
cmwnKTsKKyAgICAgIHRoaXMuc2V0KCdjdXJyZW50U3RhdGUnLCB0aGlzLnRhcmdldFN0YXRlKTsK
KworICAgICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1bmxvb3Agc28gdXJsIHdpbGwgYmUgYWNjdXJh
dGUuIFNlZW1zCisgICAgICAvLyBsZXNzIHN1cnByaXNpbmcgdGhhbiBkaWRUcmFuc2l0aW9uIGJl
aW5nIG91dCBvZiBzeW5jLgorICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm9uY2Uo
dGhpcywgdGhpcy50cmlnZ2VyLCAnZGlkVHJhbnNpdGlvbicpOworCisgICAgICBpZiAoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJVElPTlMp
IHsKKyAgICAgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVsdC5sb2coJ1RyYW5zaXRpb25lZCBp
bnRvIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgJ1wnJyk7CisgICAgICB9
CisgICAgfSwKKworICAgIF9zZXRPdXRsZXRzOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaGFu
ZGxlckluZm9zID0gdGhpcy5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvczsKKyAgICAgIHZhciBy
b3V0ZTsKKyAgICAgIHZhciBkZWZhdWx0UGFyZW50U3RhdGU7CisgICAgICB2YXIgbGl2ZVJvdXRl
cyA9IG51bGw7CisKKyAgICAgIGlmICghaGFuZGxlckluZm9zKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVySW5mb3MubGVuZ3Ro
OyBpKyspIHsKKyAgICAgICAgcm91dGUgPSBoYW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKKyAgICAg
ICAgdmFyIGNvbm5lY3Rpb25zID0gcm91dGUuY29ubmVjdGlvbnM7CisgICAgICAgIHZhciBvd25T
dGF0ZTsKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0aW9ucy5sZW5ndGg7IGor
KykgeworICAgICAgICAgIHZhciBhcHBlbmRlZCA9IGFwcGVuZExpdmVSb3V0ZShsaXZlUm91dGVz
LCBkZWZhdWx0UGFyZW50U3RhdGUsIGNvbm5lY3Rpb25zW2pdKTsKKyAgICAgICAgICBsaXZlUm91
dGVzID0gYXBwZW5kZWQubGl2ZVJvdXRlczsKKyAgICAgICAgICBpZiAoYXBwZW5kZWQub3duU3Rh
dGUucmVuZGVyLm5hbWUgPT09IHJvdXRlLnJvdXRlTmFtZSB8fCBhcHBlbmRlZC5vd25TdGF0ZS5y
ZW5kZXIub3V0bGV0ID09PSAnbWFpbicpIHsKKyAgICAgICAgICAgIG93blN0YXRlID0gYXBwZW5k
ZWQub3duU3RhdGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25uZWN0
aW9ucy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICBvd25TdGF0ZSA9IHJlcHJlc2VudEVtcHR5
Um91dGUobGl2ZVJvdXRlcywgZGVmYXVsdFBhcmVudFN0YXRlLCByb3V0ZSk7CisgICAgICAgIH0K
KyAgICAgICAgZGVmYXVsdFBhcmVudFN0YXRlID0gb3duU3RhdGU7CisgICAgICB9CisgICAgICBp
ZiAoIXRoaXMuX3RvcGxldmVsVmlldykgeworICAgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVy
T3duZXIuZ2V0T3duZXIodGhpcyk7CisgICAgICAgIHZhciBPdXRsZXRWaWV3ID0gb3duZXIuX2xv
b2t1cEZhY3RvcnkoJ3ZpZXc6LW91dGxldCcpOworICAgICAgICB0aGlzLl90b3BsZXZlbFZpZXcg
PSBPdXRsZXRWaWV3LmNyZWF0ZSgpOworICAgICAgICB0aGlzLl90b3BsZXZlbFZpZXcuc2V0T3V0
bGV0U3RhdGUobGl2ZVJvdXRlcyk7CisgICAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyLmxvb2t1
cCgnLWFwcGxpY2F0aW9uLWluc3RhbmNlOm1haW4nKTsKKyAgICAgICAgaW5zdGFuY2UuZGlkQ3Jl
YXRlUm9vdFZpZXcodGhpcy5fdG9wbGV2ZWxWaWV3KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHRoaXMuX3RvcGxldmVsVmlldy5zZXRPdXRsZXRTdGF0ZShsaXZlUm91dGVzKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBIYW5kbGVzIG5vdGlmeWluZyBhbnkgbGlzdGVuZXJz
IG9mIGFuIGltcGVuZGluZyBVUkwKKyAgICAgIGNoYW5nZS4KKyAgICAgICBUcmlnZ2VycyB0aGUg
cm91dGVyIGxldmVsIGB3aWxsVHJhbnNpdGlvbmAgaG9vay4KKyAgICAgICBAbWV0aG9kIHdpbGxU
cmFuc2l0aW9uCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMS4wCisgICAgKi8KKyAg
ICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rpb24gKG9sZEluZm9zLCBuZXdJbmZvcywgdHJhbnNpdGlv
bikgeworICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm9uY2UodGhpcywgdGhpcy50
cmlnZ2VyLCAnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0aW9uKTsKKworICAgICAgaWYgKF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJykuTE9HX1RSQU5TSVRJT05T
KSB7CisgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQubG9nKCdQcmVwYXJpbmcgdG8g
dHJhbnNpdGlvbiBmcm9tIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgob2xkSW5mb3MpICsg
J1wnIHRvIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgobmV3SW5mb3MpICsgJ1wnJyk7Cisg
ICAgICB9CisgICAgfSwKKworICAgIGhhbmRsZVVSTDogZnVuY3Rpb24gKHVybCkgeworICAgICAg
Ly8gVW50aWwgd2UgaGF2ZSBhbiBlbWJlci1pZGlvbWF0aWMgd2F5IG9mIGFjY2Vzc2luZyAjaGFz
aGVzLCB3ZSBuZWVkIHRvCisgICAgICAvLyByZW1vdmUgaXQgYmVjYXVzZSByb3V0ZXIuanMgZG9l
c24ndCBrbm93IGhvdyB0byBoYW5kbGUgaXQuCisgICAgICB1cmwgPSB1cmwuc3BsaXQoLyMoLisp
Py8pWzBdOworICAgICAgcmV0dXJuIHRoaXMuX2RvVVJMVHJhbnNpdGlvbignaGFuZGxlVVJMJywg
dXJsKTsKKyAgICB9LAorCisgICAgX2RvVVJMVHJhbnNpdGlvbjogZnVuY3Rpb24gKHJvdXRlckpz
TWV0aG9kLCB1cmwpIHsKKyAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXJbcm91dGVy
SnNNZXRob2RdKHVybCB8fCAnLycpOworICAgICAgZGlkQmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRp
b24sIHRoaXMpOworICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgVHJhbnNpdGlvbiB0aGUgYXBwbGljYXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBUaGUg
cm91dGUgbWF5CisgICAgICBiZSBlaXRoZXIgYSBzaW5nbGUgcm91dGUgb3Igcm91dGUgcGF0aDoK
KyAgICAgICBTZWUgW1JvdXRlLnRyYW5zaXRpb25Ub10oaHR0cDovL2VtYmVyanMuY29tL2FwaS9j
bGFzc2VzL0VtYmVyLlJvdXRlLmh0bWwjbWV0aG9kX3RyYW5zaXRpb25UbykgZm9yIG1vcmUgaW5m
by4KKyAgICAgICBAbWV0aG9kIHRyYW5zaXRpb25UbworICAgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIG9yIGEgVVJMCisgICAgICBAcGFyYW0gey4uLk9iamVj
dH0gbW9kZWxzIHRoZSBtb2RlbChzKSBvciBpZGVudGlmaWVyKHMpIHRvIGJlIHVzZWQgd2hpbGUK
KyAgICAgICAgdHJhbnNpdGlvbmluZyB0byB0aGUgcm91dGUuCisgICAgICBAcGFyYW0ge09iamVj
dH0gW29wdGlvbnNdIG9wdGlvbmFsIGhhc2ggd2l0aCBhIHF1ZXJ5UGFyYW1zIHByb3BlcnR5Cisg
ICAgICAgIGNvbnRhaW5pbmcgYSBtYXBwaW5nIG9mIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgIEBy
ZXR1cm4ge1RyYW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGgg
dGhpcworICAgICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAgICov
CisgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVlcnlQYXJhbXM7
CisKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tl
eV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIGlmIChyZXNlbWJsZXNVUkwo
YXJnc1swXSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RvVVJMVHJhbnNpdGlvbigndHJhbnNp
dGlvblRvJywgYXJnc1swXSk7CisgICAgICB9CisKKyAgICAgIHZhciBwb3NzaWJsZVF1ZXJ5UGFy
YW1zID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdOworICAgICAgaWYgKHBvc3NpYmxlUXVlcnlQYXJh
bXMgJiYgcG9zc2libGVRdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgncXVlcnlQYXJhbXMnKSkg
eworICAgICAgICBxdWVyeVBhcmFtcyA9IGFyZ3MucG9wKCkucXVlcnlQYXJhbXM7CisgICAgICB9
IGVsc2UgeworICAgICAgICBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgfQorCisgICAgICB2YXIg
dGFyZ2V0Um91dGVOYW1lID0gYXJncy5zaGlmdCgpOworICAgICAgcmV0dXJuIHRoaXMuX2RvVHJh
bnNpdGlvbih0YXJnZXRSb3V0ZU5hbWUsIGFyZ3MsIHF1ZXJ5UGFyYW1zKTsKKyAgICB9LAorCisg
ICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3Jv
dXRlcjsKKworICAgICAgKF9yb3V0ZXIgPSB0aGlzLnJvdXRlcikuaW50ZXJtZWRpYXRlVHJhbnNp
dGlvblRvLmFwcGx5KF9yb3V0ZXIsIGFyZ3VtZW50cyk7CisKKyAgICAgIHVwZGF0ZVBhdGhzKHRo
aXMpOworCisgICAgICB2YXIgaW5mb3MgPSB0aGlzLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9z
OworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNl
JykuTE9HX1RSQU5TSVRJT05TKSB7CisgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQu
bG9nKCdJbnRlcm1lZGlhdGUtdHJhbnNpdGlvbmVkIGludG8gXCcnICsgRW1iZXJSb3V0ZXIuX3Jv
dXRlUGF0aChpbmZvcykgKyAnXCcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVwbGFjZVdp
dGg6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Uby5hcHBseSh0
aGlzLCBhcmd1bWVudHMpLm1ldGhvZCgncmVwbGFjZScpOworICAgIH0sCisKKyAgICBnZW5lcmF0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9yb3V0ZXIyOworCisgICAgICB2YXIgdXJsID0g
KF9yb3V0ZXIyID0gdGhpcy5yb3V0ZXIpLmdlbmVyYXRlLmFwcGx5KF9yb3V0ZXIyLCBhcmd1bWVu
dHMpOworICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uZm9ybWF0VVJMKHVybCk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgc3VwcGxpZWQgcm91dGUgaXMgY3Vy
cmVudGx5IGFjdGl2ZS4KKyAgICAgICBAbWV0aG9kIGlzQWN0aXZlCisgICAgICBAcGFyYW0gcm91
dGVOYW1lCisgICAgICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAocm91dGVOYW1lKSB7CisgICAgICB2YXIgcm91dGVyID0g
dGhpcy5yb3V0ZXI7CisgICAgICByZXR1cm4gcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwg
YXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBbiBhbHRlcm5hdGl2ZSBmb3Jt
IG9mIGBpc0FjdGl2ZWAgdGhhdCBkb2Vzbid0IHJlcXVpcmUKKyAgICAgIG1hbnVhbCBjb25jYXRl
bmF0aW9uIG9mIHRoZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZQorICAgICAgYXJyYXkuCisgICAg
ICAgQG1ldGhvZCBpc0FjdGl2ZUludGVudAorICAgICAgQHBhcmFtIHJvdXRlTmFtZQorICAgICAg
QHBhcmFtIG1vZGVscworICAgICAgQHBhcmFtIHF1ZXJ5UGFyYW1zCisgICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAgIEBzaW5jZSAxLjcuMAorICAgICovCisgICAg
aXNBY3RpdmVJbnRlbnQ6IGZ1bmN0aW9uIChyb3V0ZU5hbWUsIG1vZGVscywgcXVlcnlQYXJhbXMp
IHsKKyAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5pc0FjdGl2ZUludGVudChyb3V0ZU5h
bWUsIG1vZGVscywgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBzZW5kOiBmdW5jdGlvbiAo
bmFtZSwgY29udGV4dCkgeworICAgICAgdmFyIF9yb3V0ZXIzOworCisgICAgICAoX3JvdXRlcjMg
PSB0aGlzLnJvdXRlcikudHJpZ2dlci5hcHBseShfcm91dGVyMywgYXJndW1lbnRzKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBEb2VzIHRoaXMgcm91dGVyIGluc3RhbmNlIGhhdmUgdGhlIGdp
dmVuIHJvdXRlLgorICAgICAgIEBtZXRob2QgaGFzUm91dGUKKyAgICAgIEByZXR1cm4ge0Jvb2xl
YW59CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaGFzUm91dGU6IGZ1bmN0aW9uIChyb3V0
ZSkgeworICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmhhc1JvdXRlKHJvdXRlKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSByb3V0ZXIgYnkgY2xlYXJp
bmcgdGhlIGN1cnJlbnQgcm91dGUKKyAgICAgIGhhbmRsZXJzIGFuZCBkZWFjdGl2YXRpbmcgdGhl
bS4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCByZXNldAorICAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5yb3V0ZXIpIHsKKyAgICAgICAgdGhp
cy5yb3V0ZXIucmVzZXQoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl90b3BsZXZlbFZpZXcpIHsKKyAgICAgICAgdGhp
cy5fdG9wbGV2ZWxWaWV3LmRlc3Ryb3koKTsKKyAgICAgICAgdGhpcy5fdG9wbGV2ZWxWaWV3ID0g
bnVsbDsKKyAgICAgIH0KKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfSwKKworICAgIF9sb29rdXBBY3RpdmVDb21wb25l
bnROb2RlOiBmdW5jdGlvbiAodGVtcGxhdGVOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5fYWN0
aXZlVmlld3NbdGVtcGxhdGVOYW1lXTsKKyAgICB9LAorCisgICAgLyoKKyAgICAgIENhbGxlZCB3
aGVuIGFuIGFjdGl2ZSByb3V0ZSdzIHF1ZXJ5IHBhcmFtZXRlciBoYXMgY2hhbmdlZC4KKyAgICAg
IFRoZXNlIGNoYW5nZXMgYXJlIGJhdGNoZWQgaW50byBhIHJ1bmxvb3AgcnVuIGFuZCB0cmlnZ2Vy
CisgICAgICBhIHNpbmdsZSB0cmFuc2l0aW9uLgorICAgICovCisgICAgX2FjdGl2ZVFQQ2hhbmdl
ZDogZnVuY3Rpb24gKHF1ZXJ5UGFyYW1ldGVyTmFtZSwgbmV3VmFsdWUpIHsKKyAgICAgIHRoaXMu
X3F1ZXVlZFFQQ2hhbmdlc1txdWVyeVBhcmFtZXRlck5hbWVdID0gbmV3VmFsdWU7CisgICAgICBf
ZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLCB0aGlzLl9maXJlUXVlcnlQYXJh
bVRyYW5zaXRpb24pOworICAgIH0sCisKKyAgICBfdXBkYXRpbmdRUENoYW5nZWQ6IGZ1bmN0aW9u
IChxdWVyeVBhcmFtZXRlck5hbWUpIHsKKyAgICAgIGlmICghdGhpcy5fcXBVcGRhdGVzKSB7Cisg
ICAgICAgIHRoaXMuX3FwVXBkYXRlcyA9IHt9OworICAgICAgfQorICAgICAgdGhpcy5fcXBVcGRh
dGVzW3F1ZXJ5UGFyYW1ldGVyTmFtZV0gPSB0cnVlOworICAgIH0sCisKKyAgICAvKgorICAgICAg
VHJpZ2dlcnMgYSB0cmFuc2l0aW9uIHRvIGEgcm91dGUgYmFzZWQgb24gcXVlcnkgcGFyYW1ldGVy
IGNoYW5nZXMuCisgICAgICBUaGlzIGlzIGNhbGxlZCBvbmNlIHBlciBydW5sb29wLCB0byBiYXRj
aCBjaGFuZ2VzLgorICAgICAgIGUuZy4KKyAgICAgICBpZiB0aGVzZSBtZXRob2RzIGFyZSBjYWxs
ZWQgaW4gc3VjY2Vzc2lvbjoKKyAgICAgIHRoaXMuX2FjdGl2ZVFQQ2hhbmdlZCgnZm9vJywgJzEw
Jyk7CisgICAgICAgIC8vIHJlc3VsdHMgaW4gX3F1ZXVlZFFQQ2hhbmdlcyA9IHtmb286ICcxMCd9
CisgICAgICB0aGlzLl9hY3RpdmVRUENoYW5nZWQoJ2JhcicsIGZhbHNlKTsKKyAgICAgICAgLy8g
cmVzdWx0cyBpbiBfcXVldWVkUVBDaGFuZ2VzID0ge2ZvbzogJzEwJywgYmFyOiBmYWxzZX0KKyAg
ICAgICAgX3F1ZXVlZFFQQ2hhbmdlcyB3aWxsIHJlcHJlc2VudCBib3RoIG9mIHRoZXNlIGNoYW5n
ZXMKKyAgICAgIGFuZCB0aGUgdHJhbnNpdGlvbiB1c2luZyBgdHJhbnNpdGlvblRvYCB3aWxsIGJl
IHRyaWdnZXJlZAorICAgICAgb25jZS4KKyAgICAqLworICAgIF9maXJlUXVlcnlQYXJhbVRyYW5z
aXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKHsgcXVlcnlQYXJh
bXM6IHRoaXMuX3F1ZXVlZFFQQ2hhbmdlcyB9KTsKKyAgICAgIHRoaXMuX3Jlc2V0UXVldWVkUXVl
cnlQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgfSwKKworICAgIF9jb25uZWN0QWN0aXZlQ29tcG9u
ZW50Tm9kZTogZnVuY3Rpb24gKHRlbXBsYXRlTmFtZSwgY29tcG9uZW50Tm9kZSkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Nhbm5vdCBjb25uZWN0IGFuIGFjdGl2ZVZpZXcgdGhh
dCBhbHJlYWR5IGV4aXN0cycsICF0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdKTsKKwor
ICAgICAgdmFyIF9hY3RpdmVWaWV3cyA9IHRoaXMuX2FjdGl2ZVZpZXdzOworICAgICAgZnVuY3Rp
b24gZGlzY29ubmVjdEFjdGl2ZVZpZXcoKSB7CisgICAgICAgIGRlbGV0ZSBfYWN0aXZlVmlld3Nb
dGVtcGxhdGVOYW1lXTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxh
dGVOYW1lXSA9IGNvbXBvbmVudE5vZGU7CisgICAgICBjb21wb25lbnROb2RlLnJlbmRlck5vZGUu
YWRkRGVzdHJ1Y3Rpb24oeyBkZXN0cm95OiBkaXNjb25uZWN0QWN0aXZlVmlldyB9KTsKKyAgICB9
LAorCisgICAgX3NldHVwTG9jYXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBsb2NhdGlv
biA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbG9jYXRpb24nKTsKKyAgICAg
IHZhciByb290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290VVJM
Jyk7CisgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcyk7CisK
KyAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGxvY2F0aW9uICYmIG93bmVyKSB7CisgICAg
ICAgIHZhciByZXNvbHZlZExvY2F0aW9uID0gb3duZXIubG9va3VwKCdsb2NhdGlvbjonICsgbG9j
YXRpb24pOworCisgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHJlc29sdmVkTG9j
YXRpb24pIHsKKyAgICAgICAgICBsb2NhdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dCh0aGlzLCAnbG9jYXRpb24nLCByZXNvbHZlZExvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRlZCByZWdpc3RyYXRpb24gb2YgY3VzdG9t
IGxvY2F0aW9uIEFQSSdzCisgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7CisgICAgICAgICAgICBp
bXBsZW1lbnRhdGlvbjogbG9jYXRpb24KKyAgICAgICAgICB9OworCisgICAgICAgICAgbG9jYXRp
b24gPSBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywgJ2xvY2F0aW9uJywgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXBpLmRlZmF1bHQuY3JlYXRlKG9wdGlvbnMpKTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICBpZiAobG9jYXRpb24gIT09IG51bGwgJiYgdHlwZW9mIGxvY2F0aW9u
ID09PSAnb2JqZWN0JykgeworICAgICAgICBpZiAocm9vdFVSTCkgeworICAgICAgICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LnNldChsb2NhdGlvbiwgJ3Jvb3RVUkwnLCByb290VVJMKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIEFsbG93IHRoZSBsb2NhdGlvbiB0byBkbyBhbnkgZmVhdHVy
ZSBkZXRlY3Rpb24sIHN1Y2ggYXMgQXV0b0xvY2F0aW9uCisgICAgICAgIC8vIGRldGVjdGluZyBo
aXN0b3J5IHN1cHBvcnQuIFRoaXMgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gc2V0IGl0cworICAgICAg
ICAvLyBgY2FuY2VsUm91dGVyU2V0dXBgIHByb3BlcnR5IHdoaWNoIGFib3J0cyByb3V0aW5nLgor
ICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmRldGVjdCA9PT0gJ2Z1bmN0aW9uJykgeworICAg
ICAgICAgIGxvY2F0aW9uLmRldGVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZW5zdXJl
IHRoYXQgaW5pdFN0YXRlIGlzIGNhbGxlZCBBRlRFUiB0aGUgcm9vdFVSTCBpcyBzZXQgb24KKyAg
ICAgICAgLy8gdGhlIGxvY2F0aW9uIGluc3RhbmNlCisgICAgICAgIGlmICh0eXBlb2YgbG9jYXRp
b24uaW5pdFN0YXRlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgbG9jYXRpb24uaW5pdFN0
YXRlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgX2dldEhhbmRsZXJGdW5j
dGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZh
ciBzZWVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHZh
ciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKyAgICAgIHZhciBEZWZh
dWx0Um91dGUgPSBvd25lci5fbG9va3VwRmFjdG9yeSgncm91dGU6YmFzaWMnKTsKKworICAgICAg
cmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgIHZhciByb3V0ZU5hbWUgPSAncm91dGU6
JyArIG5hbWU7CisgICAgICAgIHZhciBoYW5kbGVyID0gb3duZXIubG9va3VwKHJvdXRlTmFtZSk7
CisKKyAgICAgICAgaWYgKHNlZW5bbmFtZV0pIHsKKyAgICAgICAgICByZXR1cm4gaGFuZGxlcjsK
KyAgICAgICAgfQorCisgICAgICAgIHNlZW5bbmFtZV0gPSB0cnVlOworCisgICAgICAgIGlmICgh
aGFuZGxlcikgeworICAgICAgICAgIG93bmVyLnJlZ2lzdGVyKHJvdXRlTmFtZSwgRGVmYXVsdFJv
dXRlLmV4dGVuZCgpKTsKKyAgICAgICAgICBoYW5kbGVyID0gb3duZXIubG9va3VwKHJvdXRlTmFt
ZSk7CisKKyAgICAgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KF90aGlzMiwg
J25hbWVzcGFjZS5MT0dfQUNUSVZFX0dFTkVSQVRJT04nKSkgeworICAgICAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5pbmZvKCdnZW5lcmF0ZWQgLT4gJyArIHJvdXRlTmFtZSwgeyBmdWxsTmFtZTog
cm91dGVOYW1lIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZXIu
cm91dGVOYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICB9OworICAg
IH0sCisKKyAgICBfc2V0dXBSb3V0ZXI6IGZ1bmN0aW9uIChyb3V0ZXIsIGxvY2F0aW9uKSB7Cisg
ICAgICB2YXIgbGFzdFVSTDsKKyAgICAgIHZhciBlbWJlclJvdXRlciA9IHRoaXM7CisKKyAgICAg
IHJvdXRlci5nZXRIYW5kbGVyID0gdGhpcy5fZ2V0SGFuZGxlckZ1bmN0aW9uKCk7CisKKyAgICAg
IHZhciBkb1VwZGF0ZVVSTCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbG9jYXRpb24uc2V0VVJM
KGxhc3RVUkwpOworICAgICAgfTsKKworICAgICAgcm91dGVyLnVwZGF0ZVVSTCA9IGZ1bmN0aW9u
IChwYXRoKSB7CisgICAgICAgIGxhc3RVUkwgPSBwYXRoOworICAgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQub25jZShkb1VwZGF0ZVVSTCk7CisgICAgICB9OworCisgICAgICBpZiAo
bG9jYXRpb24ucmVwbGFjZVVSTCkgeworICAgICAgICB2YXIgZG9SZXBsYWNlVVJMID0gZnVuY3Rp
b24gKCkgeworICAgICAgICAgIGxvY2F0aW9uLnJlcGxhY2VVUkwobGFzdFVSTCk7CisgICAgICAg
IH07CisKKyAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwgPSBmdW5jdGlvbiAocGF0aCkgeworICAg
ICAgICAgIGxhc3RVUkwgPSBwYXRoOworICAgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVm
YXVsdC5vbmNlKGRvUmVwbGFjZVVSTCk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHJv
dXRlci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKGluZm9zKSB7CisgICAgICAgIGVtYmVyUm91
dGVyLmRpZFRyYW5zaXRpb24oaW5mb3MpOworICAgICAgfTsKKworICAgICAgcm91dGVyLndpbGxU
cmFuc2l0aW9uID0gZnVuY3Rpb24gKG9sZEluZm9zLCBuZXdJbmZvcywgdHJhbnNpdGlvbikgewor
ICAgICAgICBlbWJlclJvdXRlci53aWxsVHJhbnNpdGlvbihvbGRJbmZvcywgbmV3SW5mb3MsIHRy
YW5zaXRpb24pOworICAgICAgfTsKKyAgICB9LAorCisgICAgX3NlcmlhbGl6ZVF1ZXJ5UGFyYW1z
OiBmdW5jdGlvbiAodGFyZ2V0Um91dGVOYW1lLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFyIGdy
b3VwZWRCeVVybEtleSA9IHt9OworCisgICAgICBmb3JFYWNoUXVlcnlQYXJhbSh0aGlzLCB0YXJn
ZXRSb3V0ZU5hbWUsIHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgcXApIHsKKyAg
ICAgICAgdmFyIHVybEtleSA9IHFwLnVybEtleTsKKyAgICAgICAgaWYgKCFncm91cGVkQnlVcmxL
ZXlbdXJsS2V5XSkgeworICAgICAgICAgIGdyb3VwZWRCeVVybEtleVt1cmxLZXldID0gW107Cisg
ICAgICAgIH0KKyAgICAgICAgZ3JvdXBlZEJ5VXJsS2V5W3VybEtleV0ucHVzaCh7CisgICAgICAg
ICAgcXA6IHFwLAorICAgICAgICAgIHZhbHVlOiB2YWx1ZQorICAgICAgICB9KTsKKyAgICAgICAg
ZGVsZXRlIHF1ZXJ5UGFyYW1zW2tleV07CisgICAgICB9KTsKKworICAgICAgZm9yICh2YXIga2V5
IGluIGdyb3VwZWRCeVVybEtleSkgeworICAgICAgICB2YXIgcXBzID0gZ3JvdXBlZEJ5VXJsS2V5
W2tleV07CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3VcJ3JlIG5vdCBhbGxv
d2VkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBjb250cm9sbGVyIHByb3BlcnR5IG1hcCB0byB0aGUg
c2FtZSBxdWVyeSBwYXJhbSBrZXksIGJ1dCBib3RoIGAnICsgcXBzWzBdLnFwLnNjb3BlZFByb3Bl
cnR5TmFtZSArICdgIGFuZCBgJyArIChxcHNbMV0gPyBxcHNbMV0ucXAuc2NvcGVkUHJvcGVydHlO
YW1lIDogJycpICsgJ2AgbWFwIHRvIGAnICsgcXBzWzBdLnFwLnVybEtleSArICdgLiBZb3UgY2Fu
IGZpeCB0aGlzIGJ5IG1hcHBpbmcgb25lIG9mIHRoZSBjb250cm9sbGVyIHByb3BlcnRpZXMgdG8g
YSBkaWZmZXJlbnQgcXVlcnkgcGFyYW0ga2V5IHZpYSB0aGUgYGFzYCBjb25maWcgb3B0aW9uLCBl
LmcuIGAnICsgcXBzWzBdLnFwLnByb3AgKyAnOiB7IGFzOiBcJ290aGVyLScgKyBxcHNbMF0ucXAu
cHJvcCArICdcJyB9YCcsIHFwcy5sZW5ndGggPD0gMSk7CisgICAgICAgIHZhciBxcCA9IHFwc1sw
XS5xcDsKKyAgICAgICAgcXVlcnlQYXJhbXNbcXAudXJsS2V5XSA9IHFwLnJvdXRlLnNlcmlhbGl6
ZVF1ZXJ5UGFyYW0ocXBzWzBdLnZhbHVlLCBxcC51cmxLZXksIHFwLnR5cGUpOworICAgICAgfQor
ICAgIH0sCisKKyAgICBfZGVzZXJpYWxpemVRdWVyeVBhcmFtczogZnVuY3Rpb24gKHRhcmdldFJv
dXRlTmFtZSwgcXVlcnlQYXJhbXMpIHsKKyAgICAgIGZvckVhY2hRdWVyeVBhcmFtKHRoaXMsIHRh
cmdldFJvdXRlTmFtZSwgcXVlcnlQYXJhbXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBxcCkgewor
ICAgICAgICBkZWxldGUgcXVlcnlQYXJhbXNba2V5XTsKKyAgICAgICAgcXVlcnlQYXJhbXNbcXAu
cHJvcF0gPSBxcC5yb3V0ZS5kZXNlcmlhbGl6ZVF1ZXJ5UGFyYW0odmFsdWUsIHFwLnVybEtleSwg
cXAudHlwZSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgX3BydW5lRGVmYXVsdFF1ZXJ5UGFy
YW1WYWx1ZXM6IGZ1bmN0aW9uICh0YXJnZXRSb3V0ZU5hbWUsIHF1ZXJ5UGFyYW1zKSB7CisgICAg
ICB2YXIgcXBzID0gdGhpcy5fcXVlcnlQYXJhbXNGb3IodGFyZ2V0Um91dGVOYW1lKTsKKyAgICAg
IGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgeworICAgICAgICB2YXIgcXAgPSBxcHMubWFw
W2tleV07CisgICAgICAgIGlmIChxcCAmJiBxcC5zZXJpYWxpemVkRGVmYXVsdFZhbHVlID09PSBx
dWVyeVBhcmFtc1trZXldKSB7CisgICAgICAgICAgZGVsZXRlIHF1ZXJ5UGFyYW1zW2tleV07Cisg
ICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgX2RvVHJhbnNpdGlvbjogZnVuY3Rpb24g
KF90YXJnZXRSb3V0ZU5hbWUsIG1vZGVscywgX3F1ZXJ5UGFyYW1zKSB7CisgICAgICB2YXIgdGFy
Z2V0Um91dGVOYW1lID0gX3RhcmdldFJvdXRlTmFtZSB8fCBfZW1iZXJSb3V0aW5nVXRpbHMuZ2V0
QWN0aXZlVGFyZ2V0TmFtZSh0aGlzLnJvdXRlcik7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnVGhlIHJvdXRlICcgKyB0YXJnZXRSb3V0ZU5hbWUgKyAnIHdhcyBub3QgZm91bmQnLCB0
YXJnZXRSb3V0ZU5hbWUgJiYgdGhpcy5yb3V0ZXIuaGFzUm91dGUodGFyZ2V0Um91dGVOYW1lKSk7
CisKKyAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgLy8gbWVyZ2UgaW4gYW55IHF1
ZXJ5UGFyYW1zIGZyb20gdGhlIGFjdGl2ZSB0cmFuc2l0aW9uIHdoaWNoIGNvdWxkIGluY2x1ZGUK
KyAgICAgIC8vIHF1ZXJ5cGFyYW1zIGZyb20gdGhlIHVybCBvbiBpbml0aWFsIGxvYWQuCisgICAg
ICBpZiAodGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbikgeworICAgICAgICBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHF1ZXJ5UGFyYW1zLCB0aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9u
LnF1ZXJ5UGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVs
dChxdWVyeVBhcmFtcywgX3F1ZXJ5UGFyYW1zKTsKKyAgICAgIHRoaXMuX3ByZXBhcmVRdWVyeVBh
cmFtcyh0YXJnZXRSb3V0ZU5hbWUsIG1vZGVscywgcXVlcnlQYXJhbXMpOworCisgICAgICB2YXIg
dHJhbnNpdGlvbkFyZ3MgPSBfZW1iZXJSb3V0aW5nVXRpbHMucm91dGVBcmdzKHRhcmdldFJvdXRl
TmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcyk7CisgICAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMu
cm91dGVyLnRyYW5zaXRpb25Uby5hcHBseSh0aGlzLnJvdXRlciwgdHJhbnNpdGlvbkFyZ3MpOwor
CisgICAgICBkaWRCZWdpblRyYW5zaXRpb24odHJhbnNpdGlvbiwgdGhpcyk7CisKKyAgICAgIHJl
dHVybiB0cmFuc2l0aW9uOworICAgIH0sCisKKyAgICBfcHJlcGFyZVF1ZXJ5UGFyYW1zOiBmdW5j
dGlvbiAodGFyZ2V0Um91dGVOYW1lLCBtb2RlbHMsIHF1ZXJ5UGFyYW1zKSB7CisgICAgICB0aGlz
Ll9oeWRyYXRlVW5zdXBwbGllZFF1ZXJ5UGFyYW1zKHRhcmdldFJvdXRlTmFtZSwgbW9kZWxzLCBx
dWVyeVBhcmFtcyk7CisgICAgICB0aGlzLl9zZXJpYWxpemVRdWVyeVBhcmFtcyh0YXJnZXRSb3V0
ZU5hbWUsIHF1ZXJ5UGFyYW1zKTsKKyAgICAgIHRoaXMuX3BydW5lRGVmYXVsdFF1ZXJ5UGFyYW1W
YWx1ZXModGFyZ2V0Um91dGVOYW1lLCBxdWVyeVBhcmFtcyk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJucyBhIG1lcmdlZCBxdWVyeSBwYXJhbXMgbWV0YSBvYmplY3QgZm9yIGEgZ2l2
ZW4gcm91dGUuCisgICAgICBVc2VmdWwgZm9yIGFza2luZyBhIHJvdXRlIHdoYXQgaXRzIGtub3du
IHF1ZXJ5IHBhcmFtcyBhcmUuCisgICAgICAgQHByaXZhdGUKKyAgICAgKi8KKyAgICBfcXVlcnlQ
YXJhbXNGb3I6IGZ1bmN0aW9uIChsZWFmUm91dGVOYW1lKSB7CisgICAgICBpZiAodGhpcy5fcXBD
YWNoZVtsZWFmUm91dGVOYW1lXSkgeworICAgICAgICByZXR1cm4gdGhpcy5fcXBDYWNoZVtsZWFm
Um91dGVOYW1lXTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hcCA9IHt9OworICAgICAgdmFyIHFw
cyA9IFtdOworICAgICAgdGhpcy5fcXBDYWNoZVtsZWFmUm91dGVOYW1lXSA9IHsKKyAgICAgICAg
bWFwOiBtYXAsCisgICAgICAgIHFwczogcXBzCisgICAgICB9OworCisgICAgICB2YXIgcm91dGVy
anMgPSB0aGlzLnJvdXRlcjsKKyAgICAgIHZhciByZWNvZ0hhbmRsZXJJbmZvcyA9IHJvdXRlcmpz
LnJlY29nbml6ZXIuaGFuZGxlcnNGb3IobGVhZlJvdXRlTmFtZSk7CisKKyAgICAgIGZvciAodmFy
IGkgPSAwLCBsZW4gPSByZWNvZ0hhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewor
ICAgICAgICB2YXIgcmVjb2dIYW5kbGVyID0gcmVjb2dIYW5kbGVySW5mb3NbaV07CisgICAgICAg
IHZhciByb3V0ZSA9IHJvdXRlcmpzLmdldEhhbmRsZXIocmVjb2dIYW5kbGVyLmhhbmRsZXIpOwor
ICAgICAgICB2YXIgcXBNZXRhID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlLCAn
X3FwJyk7CisKKyAgICAgICAgaWYgKCFxcE1ldGEpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQobWFwLCBxcE1ldGEu
bWFwKTsKKyAgICAgICAgcXBzLnB1c2guYXBwbHkocXBzLCBxcE1ldGEucXBzKTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcXBzOiBxcHMsCisgICAgICAgIG1hcDogbWFwCisg
ICAgICB9OworICAgIH0sCisKKyAgICBfaHlkcmF0ZVVuc3VwcGxpZWRRdWVyeVBhcmFtczogZnVu
Y3Rpb24gKGxlYWZSb3V0ZU5hbWUsIGNvbnRleHRzLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFy
IHN0YXRlID0gY2FsY3VsYXRlUG9zdFRyYW5zaXRpb25TdGF0ZSh0aGlzLCBsZWFmUm91dGVOYW1l
LCBjb250ZXh0cyk7CisgICAgICB2YXIgaGFuZGxlckluZm9zID0gc3RhdGUuaGFuZGxlckluZm9z
OworICAgICAgdmFyIGFwcENhY2hlID0gdGhpcy5fYnVja2V0Q2FjaGU7CisgICAgICBfZW1iZXJS
b3V0aW5nVXRpbHMuc3Rhc2hQYXJhbU5hbWVzKHRoaXMsIGhhbmRsZXJJbmZvcyk7CisKKyAgICAg
IGZvciAodmFyIGkgPSAwLCBsZW4gPSBoYW5kbGVySW5mb3MubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKKyAgICAgICAgdmFyIHJvdXRlID0gaGFuZGxlckluZm9zW2ldLmhhbmRsZXI7CisgICAgICAg
IHZhciBxcE1ldGEgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGUsICdfcXAnKTsK
KworICAgICAgICBmb3IgKHZhciBqID0gMCwgcXBMZW4gPSBxcE1ldGEucXBzLmxlbmd0aDsgaiA8
IHFwTGVuOyArK2opIHsKKyAgICAgICAgICB2YXIgcXAgPSBxcE1ldGEucXBzW2pdOworCisgICAg
ICAgICAgdmFyIHByZXNlbnRQcm9wID0gcXAucHJvcCBpbiBxdWVyeVBhcmFtcyAmJiBxcC5wcm9w
IHx8IHFwLnNjb3BlZFByb3BlcnR5TmFtZSBpbiBxdWVyeVBhcmFtcyAmJiBxcC5zY29wZWRQcm9w
ZXJ0eU5hbWU7CisKKyAgICAgICAgICBpZiAocHJlc2VudFByb3ApIHsKKyAgICAgICAgICAgIGlm
IChwcmVzZW50UHJvcCAhPT0gcXAuc2NvcGVkUHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICAg
IHF1ZXJ5UGFyYW1zW3FwLnNjb3BlZFByb3BlcnR5TmFtZV0gPSBxdWVyeVBhcmFtc1twcmVzZW50
UHJvcF07CisgICAgICAgICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtc1twcmVzZW50UHJvcF07Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBjYWNoZUtl
eSA9IF9lbWJlclJvdXRpbmdVdGlscy5jYWxjdWxhdGVDYWNoZUtleShxcC5jdHJsLCBxcC5wYXJ0
cywgc3RhdGUucGFyYW1zKTsKKyAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW3FwLnNjb3BlZFByb3Bl
cnR5TmFtZV0gPSBhcHBDYWNoZS5sb29rdXAoY2FjaGVLZXksIHFwLnByb3AsIHFwLmRlZmF1bHRW
YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIF9z
Y2hlZHVsZUxvYWRpbmdFdmVudDogZnVuY3Rpb24gKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7
CisgICAgICB0aGlzLl9jYW5jZWxTbG93VHJhbnNpdGlvblRpbWVyKCk7CisgICAgICB0aGlzLl9z
bG93VHJhbnNpdGlvblRpbWVyID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
T25jZSgncm91dGVyVHJhbnNpdGlvbnMnLCB0aGlzLCAnX2hhbmRsZVNsb3dUcmFuc2l0aW9uJywg
dHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOworICAgIH0sCisKKyAgICBjdXJyZW50U3RhdGU6IG51
bGwsCisgICAgdGFyZ2V0U3RhdGU6IG51bGwsCisKKyAgICBfaGFuZGxlU2xvd1RyYW5zaXRpb246
IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAgaWYgKCF0aGlzLnJv
dXRlci5hY3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgIC8vIERvbid0IGZpcmUgYW4gZXZlbnQg
aWYgd2UndmUgc2luY2UgbW92ZWQgb24gZnJvbQorICAgICAgICAvLyB0aGUgdHJhbnNpdGlvbiB0
aGF0IHB1dCB1cyBpbiBhIGxvYWRpbmcgc3RhdGUuCisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KworICAgICAgdGhpcy5zZXQoJ3RhcmdldFN0YXRlJywgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRl
cl9zdGF0ZS5kZWZhdWx0LmNyZWF0ZSh7CisgICAgICAgIGVtYmVyUm91dGVyOiB0aGlzLAorICAg
ICAgICByb3V0ZXJKczogdGhpcy5yb3V0ZXIsCisgICAgICAgIHJvdXRlckpzU3RhdGU6IHRoaXMu
cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24uc3RhdGUKKyAgICAgIH0pKTsKKworICAgICAgdHJhbnNp
dGlvbi50cmlnZ2VyKHRydWUsICdsb2FkaW5nJywgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwor
ICAgIH0sCisKKyAgICBfY2FuY2VsU2xvd1RyYW5zaXRpb25UaW1lcjogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXIpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxSdW5fbG9vcC5kZWZhdWx0LmNhbmNlbCh0aGlzLl9zbG93VHJhbnNpdGlvblRpbWVyKTsKKyAg
ICAgIH0KKyAgICAgIHRoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXIgPSBudWxsOworICAgIH0sCisK
KyAgICAvLyBUaGVzZSB0aHJlZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVuc3VyZSBl
cnJvcnMgYXJlbid0CisgICAgLy8gcmUtcmFpc2VkIGlmIHRoZXkncmUgaGFuZGxlZCBpbiBhIHJv
dXRlJ3MgZXJyb3IgYWN0aW9uLgorICAgIF9tYXJrRXJyb3JBc0hhbmRsZWQ6IGZ1bmN0aW9uIChl
cnJvckd1aWQpIHsKKyAgICAgIHRoaXMuX2hhbmRsZWRFcnJvcnNbZXJyb3JHdWlkXSA9IHRydWU7
CisgICAgfSwKKworICAgIF9pc0Vycm9ySGFuZGxlZDogZnVuY3Rpb24gKGVycm9yR3VpZCkgewor
ICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZWRFcnJvcnNbZXJyb3JHdWlkXTsKKyAgICB9LAorCisg
ICAgX2NsZWFySGFuZGxlZEVycm9yOiBmdW5jdGlvbiAoZXJyb3JHdWlkKSB7CisgICAgICBkZWxl
dGUgdGhpcy5faGFuZGxlZEVycm9yc1tlcnJvckd1aWRdOworICAgIH0KKyAgfSk7CisKKyAgLyoK
KyAgICBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyByb290LXdhcmQsIHN0YXJ0aW5nCisg
ICAgZnJvbSAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBwcm92aWRlZCBgb3JpZ2luUm91dGVgLgor
ICAKKyAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgY2FsbGJhY2sgZmlyZWQgcmVxdWVzdGVk
CisgICAgdG8gYnViYmxlIHVwd2FyZC4KKyAgCisgICAgQHByaXZhdGUKKyAgICovCisgIGZ1bmN0
aW9uIGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBjYWxsYmFjaykg
eworICAgIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9uLnN0YXRlLmhhbmRsZXJJbmZvczsK
KyAgICB2YXIgb3JpZ2luUm91dGVGb3VuZCA9IGZhbHNlOworICAgIHZhciBoYW5kbGVySW5mbywg
cm91dGU7CisKKyAgICBmb3IgKHZhciBpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGkgPj0g
MDsgLS1pKSB7CisgICAgICBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKKyAgICAgIHJv
dXRlID0gaGFuZGxlckluZm8uaGFuZGxlcjsKKworICAgICAgaWYgKCFvcmlnaW5Sb3V0ZUZvdW5k
KSB7CisgICAgICAgIGlmIChvcmlnaW5Sb3V0ZSA9PT0gcm91dGUpIHsKKyAgICAgICAgICBvcmln
aW5Sb3V0ZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAg
IH0KKworICAgICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBoYW5kbGVySW5mb3NbaSArIDFdLmhhbmRs
ZXIpICE9PSB0cnVlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBUaGVzZSBnZXQgaW52b2tlZCB3aGVuIGFuIGFj
dGlvbiBidWJibGVzIGFib3ZlIEFwcGxpY2F0aW9uUm91dGUKKyAgLy8gYW5kIGFyZSBub3QgbWVh
bnQgdG8gYmUgb3ZlcnJpZGFibGUuCisgIHZhciBkZWZhdWx0QWN0aW9uSGFuZGxlcnMgPSB7CisK
KyAgICB3aWxsUmVzb2x2ZU1vZGVsOiBmdW5jdGlvbiAodHJhbnNpdGlvbiwgb3JpZ2luUm91dGUp
IHsKKyAgICAgIG9yaWdpblJvdXRlLnJvdXRlci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJhbnNp
dGlvbiwgb3JpZ2luUm91dGUpOworICAgIH0sCisKKyAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9y
LCB0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIGFu
IGFwcHJvcHJpYXRlIGVycm9yIHN1YnN0YXRlIHRvIGVudGVyLgorICAgICAgdmFyIHJvdXRlciA9
IG9yaWdpblJvdXRlLnJvdXRlcjsKKworICAgICAgdmFyIHRyeVRvcExldmVsID0gZm9yRWFjaFJv
dXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRpb24sIGZ1bmN0aW9uIChyb3V0ZSwgY2hpbGRS
b3V0ZSkgeworICAgICAgICB2YXIgY2hpbGRFcnJvclJvdXRlTmFtZSA9IGZpbmRDaGlsZFJvdXRl
TmFtZShyb3V0ZSwgY2hpbGRSb3V0ZSwgJ2Vycm9yJyk7CisgICAgICAgIGlmIChjaGlsZEVycm9y
Um91dGVOYW1lKSB7CisgICAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25Ubyhj
aGlsZEVycm9yUm91dGVOYW1lLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSk7CisKKyAgICAgIGlmICh0cnlUb3BMZXZl
bCkgeworICAgICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVsIGVycm9yIHN0YXRlIHRvIGVudGVy
LgorICAgICAgICBpZiAocm91dGVIYXNCZWVuRGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0ZXIsICdh
cHBsaWNhdGlvbl9lcnJvcicpKSB7CisgICAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5z
aXRpb25UbygnYXBwbGljYXRpb25fZXJyb3InLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxvZ0Vycm9yKGVycm9yLCAnRXJyb3Igd2hpbGUg
cHJvY2Vzc2luZyByb3V0ZTogJyArIHRyYW5zaXRpb24udGFyZ2V0TmFtZSk7CisgICAgfSwKKwor
ICAgIGxvYWRpbmc6IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAg
Ly8gQXR0ZW1wdCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGxvYWRpbmcgc3Vic3RhdGUgdG8gZW50
ZXIuCisgICAgICB2YXIgcm91dGVyID0gb3JpZ2luUm91dGUucm91dGVyOworCisgICAgICB2YXIg
dHJ5VG9wTGV2ZWwgPSBmb3JFYWNoUm91dGVBYm92ZShvcmlnaW5Sb3V0ZSwgdHJhbnNpdGlvbiwg
ZnVuY3Rpb24gKHJvdXRlLCBjaGlsZFJvdXRlKSB7CisgICAgICAgIHZhciBjaGlsZExvYWRpbmdS
b3V0ZU5hbWUgPSBmaW5kQ2hpbGRSb3V0ZU5hbWUocm91dGUsIGNoaWxkUm91dGUsICdsb2FkaW5n
Jyk7CisKKyAgICAgICAgaWYgKGNoaWxkTG9hZGluZ1JvdXRlTmFtZSkgeworICAgICAgICAgIHJv
dXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8oY2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKKyAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBidWJibGUgYWJv
dmUgcGl2b3Qgcm91dGUuCisgICAgICAgIGlmICh0cmFuc2l0aW9uLnBpdm90SGFuZGxlciAhPT0g
cm91dGUpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisK
KyAgICAgIGlmICh0cnlUb3BMZXZlbCkgeworICAgICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVs
IGxvYWRpbmcgc3RhdGUgdG8gZW50ZXIuCisgICAgICAgIGlmIChyb3V0ZUhhc0JlZW5EZWZpbmVk
KG9yaWdpblJvdXRlLnJvdXRlciwgJ2FwcGxpY2F0aW9uX2xvYWRpbmcnKSkgeworICAgICAgICAg
IHJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8oJ2FwcGxpY2F0aW9uX2xvYWRpbmcnKTsK
KyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAg
ZnVuY3Rpb24gbG9nRXJyb3IoX2Vycm9yLCBpbml0aWFsTWVzc2FnZSkgeworICAgIHZhciBlcnJv
ckFyZ3MgPSBbXTsKKyAgICB2YXIgZXJyb3I7CisgICAgaWYgKF9lcnJvciAmJiB0eXBlb2YgX2Vy
cm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgX2Vycm9yLmVycm9yVGhyb3duID09PSAnb2JqZWN0
JykgeworICAgICAgZXJyb3IgPSBfZXJyb3IuZXJyb3JUaHJvd247CisgICAgfSBlbHNlIHsKKyAg
ICAgIGVycm9yID0gX2Vycm9yOworICAgIH0KKworICAgIGlmIChpbml0aWFsTWVzc2FnZSkgewor
ICAgICAgZXJyb3JBcmdzLnB1c2goaW5pdGlhbE1lc3NhZ2UpOworICAgIH0KKworICAgIGlmIChl
cnJvcikgeworICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHsKKyAgICAgICAgZXJyb3JBcmdzLnB1
c2goZXJyb3IubWVzc2FnZSk7CisgICAgICB9CisgICAgICBpZiAoZXJyb3Iuc3RhY2spIHsKKyAg
ICAgICAgZXJyb3JBcmdzLnB1c2goZXJyb3Iuc3RhY2spOworICAgICAgfQorCisgICAgICBpZiAo
dHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykgeworICAgICAgICBlcnJvckFyZ3MucHVzaChlcnJv
cik7CisgICAgICB9CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVsdC5lcnJv
ci5hcHBseSh0aGlzLCBlcnJvckFyZ3MpOworICB9CisKKyAgZnVuY3Rpb24gZmluZENoaWxkUm91
dGVOYW1lKHBhcmVudFJvdXRlLCBvcmlnaW5hdGluZ0NoaWxkUm91dGUsIG5hbWUpIHsKKyAgICB2
YXIgcm91dGVyID0gcGFyZW50Um91dGUucm91dGVyOworICAgIHZhciBjaGlsZE5hbWU7CisgICAg
dmFyIHRhcmdldENoaWxkUm91dGVOYW1lID0gb3JpZ2luYXRpbmdDaGlsZFJvdXRlLnJvdXRlTmFt
ZS5zcGxpdCgnLicpLnBvcCgpOworICAgIHZhciBuYW1lc3BhY2UgPSBwYXJlbnRSb3V0ZS5yb3V0
ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicgPyAnJyA6IHBhcmVudFJvdXRlLnJvdXRlTmFtZSArICcu
JzsKKworICAgIC8vIEZpcnN0LCB0cnkgYSBuYW1lZCBsb2FkaW5nIHN0YXRlLCBlLmcuICdmb29f
bG9hZGluZycKKyAgICBjaGlsZE5hbWUgPSBuYW1lc3BhY2UgKyB0YXJnZXRDaGlsZFJvdXRlTmFt
ZSArICdfJyArIG5hbWU7CisgICAgaWYgKHJvdXRlSGFzQmVlbkRlZmluZWQocm91dGVyLCBjaGls
ZE5hbWUpKSB7CisgICAgICByZXR1cm4gY2hpbGROYW1lOworICAgIH0KKworICAgIC8vIFNlY29u
ZCwgdHJ5IGdlbmVyYWwgbG9hZGluZyBzdGF0ZSwgZS5nLiAnbG9hZGluZycKKyAgICBjaGlsZE5h
bWUgPSBuYW1lc3BhY2UgKyBuYW1lOworICAgIGlmIChyb3V0ZUhhc0JlZW5EZWZpbmVkKHJvdXRl
ciwgY2hpbGROYW1lKSkgeworICAgICAgcmV0dXJuIGNoaWxkTmFtZTsKKyAgICB9CisgIH0KKwor
ICBmdW5jdGlvbiByb3V0ZUhhc0JlZW5EZWZpbmVkKHJvdXRlciwgbmFtZSkgeworICAgIHZhciBv
d25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcihyb3V0ZXIpOworICAgIHJldHVybiByb3V0
ZXIuaGFzUm91dGUobmFtZSkgJiYgKG93bmVyLmhhc1JlZ2lzdHJhdGlvbigndGVtcGxhdGU6JyAr
IG5hbWUpIHx8IG93bmVyLmhhc1JlZ2lzdHJhdGlvbigncm91dGU6JyArIG5hbWUpKTsKKyAgfQor
CisgIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChoYW5kbGVySW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFy
Z3MpIHsKKyAgICB2YXIgbmFtZSA9IGFyZ3Muc2hpZnQoKTsKKworICAgIGlmICghaGFuZGxlcklu
Zm9zKSB7CisgICAgICBpZiAoaWdub3JlRmFpbHVyZSkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDYW5cJ3QgdHJp
Z2dlciBhY3Rpb24gXCcnICsgbmFtZSArICdcJyBiZWNhdXNlIHlvdXIgYXBwIGhhc25cJ3QgZmlu
aXNoZWQgdHJhbnNpdGlvbmluZyBpbnRvIGl0cyBmaXJzdCByb3V0ZS4gVG8gdHJpZ2dlciBhbiBh
Y3Rpb24gb24gZGVzdGluYXRpb24gcm91dGVzIGR1cmluZyBhIHRyYW5zaXRpb24sIHlvdSBjYW4g
Y2FsbCBgLnNlbmQoKWAgb24gdGhlIGBUcmFuc2l0aW9uYCBvYmplY3QgcGFzc2VkIHRvIHRoZSBg
bW9kZWwvYmVmb3JlTW9kZWwvYWZ0ZXJNb2RlbGAgaG9va3MuJyk7CisgICAgfQorCisgICAgdmFy
IGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOworICAgIHZhciBoYW5kbGVySW5mbywgaGFuZGxlcjsK
KworICAgIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0p
IHsKKyAgICAgIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgaGFuZGxlciA9
IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisKKyAgICAgIGlmIChoYW5kbGVyLmFjdGlvbnMgJiYgaGFu
ZGxlci5hY3Rpb25zW25hbWVdKSB7CisgICAgICAgIGlmIChoYW5kbGVyLmFjdGlvbnNbbmFtZV0u
YXBwbHkoaGFuZGxlciwgYXJncykgPT09IHRydWUpIHsKKyAgICAgICAgICBldmVudFdhc0hhbmRs
ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGhp
dCBoZXJlIGlmIGEgbm9uLWJ1YmJsaW5nIGVycm9yIGFjdGlvbiBpcyB0cmlnZ2VyZWQgb24gYSBy
b3V0ZS4KKyAgICAgICAgICBpZiAobmFtZSA9PT0gJ2Vycm9yJykgeworICAgICAgICAgICAgdmFy
IGVycm9ySWQgPSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IoYXJnc1swXSk7CisgICAgICAgICAg
ICBoYW5kbGVyLnJvdXRlci5fbWFya0Vycm9yQXNIYW5kbGVkKGVycm9ySWQpOworICAgICAgICAg
IH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoZGVmYXVsdEFjdGlvbkhhbmRsZXJzW25hbWVdKSB7CisgICAgICBkZWZhdWx0QWN0aW9uSGFu
ZGxlcnNbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYgIWlnbm9yZUZhaWx1cmUpIHsKKyAgICAgIHRocm93
IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ05vdGhpbmcgaGFuZGxlZCB0aGUgYWN0aW9u
IFwnJyArIG5hbWUgKyAnXCcuIElmIHlvdSBkaWQgaGFuZGxlIHRoZSBhY3Rpb24sIHRoaXMgZXJy
b3IgY2FuIGJlIGNhdXNlZCBieSByZXR1cm5pbmcgdHJ1ZSBmcm9tIGFuIGFjdGlvbiBoYW5kbGVy
IGluIGEgY29udHJvbGxlciwgY2F1c2luZyB0aGUgYWN0aW9uIHRvIGJ1YmJsZS4nKTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBjYWxjdWxhdGVQb3N0VHJhbnNpdGlvblN0YXRlKGVtYmVyUm91
dGVyLCBsZWFmUm91dGVOYW1lLCBjb250ZXh0cykgeworICAgIHZhciByb3V0ZXJqcyA9IGVtYmVy
Um91dGVyLnJvdXRlcjsKKyAgICB2YXIgc3RhdGUgPSByb3V0ZXJqcy5hcHBseUludGVudChsZWFm
Um91dGVOYW1lLCBjb250ZXh0cyk7CisgICAgdmFyIGhhbmRsZXJJbmZvcyA9IHN0YXRlLmhhbmRs
ZXJJbmZvczsKKyAgICB2YXIgcGFyYW1zID0gc3RhdGUucGFyYW1zOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAg
dmFyIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgaWYgKCFoYW5kbGVySW5m
by5pc1Jlc29sdmVkKSB7CisgICAgICAgIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm8uYmVjb21l
UmVzb2x2ZWQobnVsbCwgaGFuZGxlckluZm8uY29udGV4dCk7CisgICAgICB9CisgICAgICBwYXJh
bXNbaGFuZGxlckluZm8ubmFtZV0gPSBoYW5kbGVySW5mby5wYXJhbXM7CisgICAgfQorICAgIHJl
dHVybiBzdGF0ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZVBhdGhzKHJvdXRlcikgeworICAg
IHZhciBpbmZvcyA9IHJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvczsKKyAgICB2YXIg
cGF0aCA9IEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpOworICAgIHZhciBjdXJyZW50Um91
dGVOYW1lID0gaW5mb3NbaW5mb3MubGVuZ3RoIC0gMV0ubmFtZTsKKworICAgIF9lbWJlck1ldGFs
UHJvcGVydHlfc2V0LnNldChyb3V0ZXIsICdjdXJyZW50UGF0aCcsIHBhdGgpOworICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LnNldChyb3V0ZXIsICdjdXJyZW50Um91dGVOYW1lJywgY3VycmVu
dFJvdXRlTmFtZSk7CisKKyAgICB2YXIgYXBwQ29udHJvbGxlciA9IF9jb250YWluZXJPd25lci5n
ZXRPd25lcihyb3V0ZXIpLmxvb2t1cCgnY29udHJvbGxlcjphcHBsaWNhdGlvbicpOworCisgICAg
aWYgKCFhcHBDb250cm9sbGVyKSB7CisgICAgICAvLyBhcHBDb250cm9sbGVyIG1pZ2h0IG5vdCBl
eGlzdCB3aGVuIHRvcC1sZXZlbCBsb2FkaW5nL2Vycm9yCisgICAgICAvLyBzdWJzdGF0ZXMgaGF2
ZSBiZWVuIGVudGVyZWQgc2luY2UgQXBwbGljYXRpb25Sb3V0ZSBoYXNuJ3QKKyAgICAgIC8vIGFj
dHVhbGx5IGJlZW4gZW50ZXJlZCBhdCB0aGF0IHBvaW50LgorICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmICghKCdjdXJyZW50UGF0aCcgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eShhcHBDb250cm9sbGVyLCAnY3VycmVu
dFBhdGgnKTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoYXBwQ29u
dHJvbGxlciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7CisKKyAgICBpZiAoISgnY3VycmVudFJvdXRl
TmFtZScgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5k
ZWZpbmVQcm9wZXJ0eShhcHBDb250cm9sbGVyLCAnY3VycmVudFJvdXRlTmFtZScpOworICAgIH0K
KworICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChhcHBDb250cm9sbGVyLCAnY3VycmVu
dFJvdXRlTmFtZScsIGN1cnJlbnRSb3V0ZU5hbWUpOworICB9CisKKyAgRW1iZXJSb3V0ZXIucmVv
cGVuQ2xhc3MoeworICAgIHJvdXRlcjogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIGBSb3V0
ZXIubWFwYCBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGRlZmluZSBtYXBwaW5ncyBmcm9tIFVSTHMg
dG8gcm91dGVzCisgICAgICBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUaGVzZSBtYXBwaW5ncyBhcmUg
ZGVmaW5lZCB3aXRoaW4gdGhlCisgICAgICBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiB1c2lu
ZyBgdGhpcy5yb3V0ZWAuCisgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBv
ZiB0aGUgcm91dGUgd2hpY2ggaXMgdXNlZCBieSBkZWZhdWx0IGFzIHRoZQorICAgICAgcGF0aCBu
YW1lIGFzIHdlbGwuCisgICAgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIG9wdGlvbmFs
IG9wdGlvbnMgaGFzaC4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlOgorICAgICAgICAqIGBwYXRoYDog
YWxsb3dzIHlvdSB0byBwcm92aWRlIHlvdXIgb3duIHBhdGggYXMgd2VsbCBhcyBtYXJrIGR5bmFt
aWMKKyAgICAgICAgICBzZWdtZW50cy4KKyAgICAgICAgKiBgcmVzZXROYW1lc3BhY2VgOiBmYWxz
ZSBieSBkZWZhdWx0OyB3aGVuIG5lc3Rpbmcgcm91dGVzLCBlbWJlciB3aWxsCisgICAgICAgICAg
Y29tYmluZSB0aGUgcm91dGUgbmFtZXMgdG8gZm9ybSB0aGUgZnVsbHktcXVhbGlmaWVkIHJvdXRl
IG5hbWUsIHdoaWNoIGlzCisgICAgICAgICAgdXNlZCB3aXRoIGB7e2xpbmstdG99fWAgb3IgbWFu
dWFsbHkgdHJhbnNpdGlvbmluZyB0byByb3V0ZXMuIFNldHRpbmcKKyAgICAgICAgICBgcmVzZXRO
YW1lc3BhY2U6IHRydWVgIHdpbGwgY2F1c2UgdGhlIHJvdXRlIG5vdCB0byBpbmhlcml0IGZyb20g
aXRzCisgICAgICAgICAgcGFyZW50IHJvdXRlJ3MgbmFtZXMuIFRoaXMgaXMgaGFuZHkgZm9yIHJl
c291cmNlcyB3aGljaCBjYW4gYmUgYWNjZXNzZWQKKyAgICAgICAgICBpbiBtdWx0aXBsZSBwbGFj
ZXMgYXMgd2VsbCBhcyBwcmV2ZW50aW5nIGV4dHJlbWVseSBsb25nIHJvdXRlIG5hbWVzLgorICAg
ICAgICAgIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIHBhdGggYmVoYXZpb3IgaXMg
c3RpbGwgcmV0YWluZWQuCisgICAgICAgVGhlIHRoaXJkIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9u
LCB3aGljaCBjYW4gYmUgdXNlZCB0byBuZXN0IHJvdXRlcy4KKyAgICAgIE5lc3RlZCByb3V0ZXMs
IGJ5IGRlZmF1bHQsIHdpbGwgaGF2ZSB0aGUgcGFyZW50IHJvdXRlIHRyZWUncyByb3V0ZSBuYW1l
IGFuZAorICAgICAgcGF0aCBwcmVwZW5kZWQgdG8gaXQncyBvd24uCisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKXsKKyAgICAgICAgdGhpcy5yb3V0
ZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0Lzpwb3N0X2lkJyB9LCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICB0aGlzLnJvdXRlKCdlZGl0Jyk7CisgICAgICAgICAgdGhpcy5yb3V0ZSgnY29tbWVudHMn
LCB7IHJlc2V0TmFtZXNwYWNlOiB0cnVlIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdGhp
cy5yb3V0ZSgnbmV3Jyk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBGb3IgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFt
cGxlcyBwbGVhc2Ugc2VlCisgICAgICBbdGhlIGd1aWRlc10oaHR0cDovL2VtYmVyanMuY29tL2d1
aWRlcy9yb3V0aW5nL2RlZmluaW5nLXlvdXItcm91dGVzLykuCisgICAgICAgQG1ldGhvZCBtYXAK
KyAgICAgIEBwYXJhbSBjYWxsYmFjaworICAgICAgQHB1YmxpYworICAgICovCisgICAgbWFwOiBm
dW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgIGlmICghdGhpcy5kc2xDYWxsYmFja3MpIHsKKyAg
ICAgICAgdGhpcy5kc2xDYWxsYmFja3MgPSBbXTsKKyAgICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7
IGRzbENhbGxiYWNrczogdGhpcy5kc2xDYWxsYmFja3MgfSk7CisgICAgICB9CisKKyAgICAgIHRo
aXMuZHNsQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOworCisgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LAorCisgICAgX3JvdXRlUGF0aDogZnVuY3Rpb24gKGhhbmRsZXJJbmZvcykgeworICAgICAg
dmFyIHBhdGggPSBbXTsKKworICAgICAgLy8gV2UgaGF2ZSB0byBoYW5kbGUgY29hbGVzY2luZyBy
ZXNvdXJjZSBuYW1lcyB0aGF0CisgICAgICAvLyBhcmUgcHJlZml4ZWQgd2l0aCB0aGVpciBwYXJl
bnQncyBuYW1lcywgZS5nLgorICAgICAgLy8gWydmb28nLCAnZm9vLmJhci5iYXonXSA9PiAnZm9v
LmJhci5iYXonLCBub3QgJ2Zvby5mb28uYmFyLmJheicKKworICAgICAgZnVuY3Rpb24gaW50ZXJz
ZWN0aW9uTWF0Y2hlcyhhMSwgYTIpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGEx
Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkg
eworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIG5hbWUsIG5hbWVQYXJ0cywg
b2xkTmFtZVBhcnRzOworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBoYW5kbGVySW5mb3MubGVu
Z3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIG5hbWUgPSBoYW5kbGVySW5mb3NbaV0ubmFtZTsK
KyAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLicpOworICAgICAgICBvbGROYW1lUGFy
dHMgPSBzbGljZS5jYWxsKHBhdGgpOworCisgICAgICAgIHdoaWxlIChvbGROYW1lUGFydHMubGVu
Z3RoKSB7CisgICAgICAgICAgaWYgKGludGVyc2VjdGlvbk1hdGNoZXMob2xkTmFtZVBhcnRzLCBu
YW1lUGFydHMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAg
b2xkTmFtZVBhcnRzLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwYXRoLnB1c2guYXBw
bHkocGF0aCwgbmFtZVBhcnRzLnNsaWNlKG9sZE5hbWVQYXJ0cy5sZW5ndGgpKTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHBhdGguam9pbignLicpOworICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rp
b24gZGlkQmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRpb24sIHJvdXRlcikgeworICAgIHZhciByb3V0
ZXJTdGF0ZSA9IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXJfc3RhdGUuZGVmYXVsdC5jcmVhdGUo
eworICAgICAgZW1iZXJSb3V0ZXI6IHJvdXRlciwKKyAgICAgIHJvdXRlckpzOiByb3V0ZXIucm91
dGVyLAorICAgICAgcm91dGVySnNTdGF0ZTogdHJhbnNpdGlvbi5zdGF0ZQorICAgIH0pOworCisg
ICAgaWYgKCFyb3V0ZXIuY3VycmVudFN0YXRlKSB7CisgICAgICByb3V0ZXIuc2V0KCdjdXJyZW50
U3RhdGUnLCByb3V0ZXJTdGF0ZSk7CisgICAgfQorICAgIHJvdXRlci5zZXQoJ3RhcmdldFN0YXRl
Jywgcm91dGVyU3RhdGUpOworCisgICAgdHJhbnNpdGlvbi5wcm9taXNlID0gdHJhbnNpdGlvbi5j
YXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKKyAgICAgIHZhciBlcnJvcklkID0gX2VtYmVyTWV0YWxV
dGlscy5ndWlkRm9yKGVycm9yKTsKKworICAgICAgaWYgKHJvdXRlci5faXNFcnJvckhhbmRsZWQo
ZXJyb3JJZCkpIHsKKyAgICAgICAgcm91dGVyLl9jbGVhckhhbmRsZWRFcnJvcihlcnJvcklkKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGVycm9yOworICAgICAgfQorICAgIH0pOwor
ICB9CisKKyAgZnVuY3Rpb24gcmVzZW1ibGVzVVJMKHN0cikgeworICAgIHJldHVybiB0eXBlb2Yg
c3RyID09PSAnc3RyaW5nJyAmJiAoc3RyID09PSAnJyB8fCBzdHIuY2hhckF0KDApID09PSAnLycp
OworICB9CisKKyAgZnVuY3Rpb24gZm9yRWFjaFF1ZXJ5UGFyYW0ocm91dGVyLCB0YXJnZXRSb3V0
ZU5hbWUsIHF1ZXJ5UGFyYW1zLCBjYWxsYmFjaykgeworICAgIHZhciBxcENhY2hlID0gcm91dGVy
Ll9xdWVyeVBhcmFtc0Zvcih0YXJnZXRSb3V0ZU5hbWUpOworCisgICAgZm9yICh2YXIga2V5IGlu
IHF1ZXJ5UGFyYW1zKSB7CisgICAgICBpZiAoIXF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KGtl
eSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgdmFsdWUgPSBxdWVy
eVBhcmFtc1trZXldOworICAgICAgdmFyIHFwID0gcXBDYWNoZS5tYXBba2V5XTsKKworICAgICAg
aWYgKHFwKSB7CisgICAgICAgIGNhbGxiYWNrKGtleSwgdmFsdWUsIHFwKTsKKyAgICAgIH0KKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kTGl2ZVJvdXRlKGxpdmVSb3V0ZXMsIG5hbWUpIHsK
KyAgICBpZiAoIWxpdmVSb3V0ZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIHN0
YWNrID0gW2xpdmVSb3V0ZXNdOworICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAg
ICB2YXIgdGVzdCA9IHN0YWNrLnNoaWZ0KCk7CisgICAgICBpZiAodGVzdC5yZW5kZXIubmFtZSA9
PT0gbmFtZSkgeworICAgICAgICByZXR1cm4gdGVzdDsKKyAgICAgIH0KKyAgICAgIHZhciBvdXRs
ZXRzID0gdGVzdC5vdXRsZXRzOworICAgICAgZm9yICh2YXIgb3V0bGV0TmFtZSBpbiBvdXRsZXRz
KSB7CisgICAgICAgIHN0YWNrLnB1c2gob3V0bGV0c1tvdXRsZXROYW1lXSk7CisgICAgICB9Cisg
ICAgfQorICB9CisKKyAgZnVuY3Rpb24gYXBwZW5kTGl2ZVJvdXRlKGxpdmVSb3V0ZXMsIGRlZmF1
bHRQYXJlbnRTdGF0ZSwgcmVuZGVyT3B0aW9ucykgeworICAgIHZhciB0YXJnZXQ7CisgICAgdmFy
IG15U3RhdGUgPSB7CisgICAgICByZW5kZXI6IHJlbmRlck9wdGlvbnMsCisgICAgICBvdXRsZXRz
OiBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpCisgICAgfTsKKyAgICBpZiAo
cmVuZGVyT3B0aW9ucy5pbnRvKSB7CisgICAgICB0YXJnZXQgPSBmaW5kTGl2ZVJvdXRlKGxpdmVS
b3V0ZXMsIHJlbmRlck9wdGlvbnMuaW50byk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhcmdldCA9
IGRlZmF1bHRQYXJlbnRTdGF0ZTsKKyAgICB9CisgICAgaWYgKHRhcmdldCkgeworICAgICAgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRhcmdldC5vdXRsZXRzLCByZW5kZXJPcHRpb25zLm91
dGxldCwgbXlTdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZW5kZXJPcHRpb25zLmlu
dG8pIHsKKyAgICAgICAgLy8gTWVnYWhheCB0aW1lLiBQb3N0LTIuMC1icmVha2luZy1jaGFuZ2Vz
LCB3ZSB3aWxsIGp1c3QgYXNzZXJ0CisgICAgICAgIC8vIHJpZ2h0IGhlcmUgdGhhdCB0aGUgdXNl
ciB0cmllZCB0byB0YXJnZXQgYSBub25leGlzdGVudAorICAgICAgICAvLyB0aGluZy4gQnV0IGZv
ciBub3cgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBgcmVuZGVyYAorICAgICAgICAvLyBo
ZWxwZXIsIGFuZCBwZW9wbGUgYXJlIGFsbG93ZWQgdG8gdGFyZ2V0IHRlbXBsYXRlcyByZW5kZXJl
ZAorICAgICAgICAvLyBieSB0aGUgcmVuZGVyIGhlbHBlci4gU28gaW5zdGVhZCB3ZSBkZWZlciBk
b2luZyBhbnl0aW5nIHdpdGgKKyAgICAgICAgLy8gdGhlc2Ugb3JwaGFuIHJlbmRlcnMgdW50aWwg
YWZ0ZXJSZW5kZXIuCisgICAgICAgIGFwcGVuZE9ycGhhbihsaXZlUm91dGVzLCByZW5kZXJPcHRp
b25zLmludG8sIG15U3RhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGl2ZVJvdXRlcyA9
IG15U3RhdGU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB7CisgICAgICBsaXZlUm91dGVz
OiBsaXZlUm91dGVzLAorICAgICAgb3duU3RhdGU6IG15U3RhdGUKKyAgICB9OworICB9CisKKyAg
ZnVuY3Rpb24gYXBwZW5kT3JwaGFuKGxpdmVSb3V0ZXMsIGludG8sIG15U3RhdGUpIHsKKyAgICBp
ZiAoIWxpdmVSb3V0ZXMub3V0bGV0cy5fX2VtYmVyX29ycGhhbnNfXykgeworICAgICAgbGl2ZVJv
dXRlcy5vdXRsZXRzLl9fZW1iZXJfb3JwaGFuc19fID0geworICAgICAgICByZW5kZXI6IHsKKyAg
ICAgICAgICBuYW1lOiAnX19lbWJlcl9vcnBoYW5zX18nCisgICAgICAgIH0sCisgICAgICAgIG91
dGxldHM6IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCkKKyAgICAgIH07Cisg
ICAgfQorICAgIGxpdmVSb3V0ZXMub3V0bGV0cy5fX2VtYmVyX29ycGhhbnNfXy5vdXRsZXRzW2lu
dG9dID0gbXlTdGF0ZTsKKyAgICBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUo
J2FmdGVyUmVuZGVyJywgZnVuY3Rpb24gKCkgeworICAgICAgLy8gYHdhc1VzZWRgIGdldHMgc2V0
IGJ5IHRoZSByZW5kZXIgaGVscGVyLiBTZWUgdGhlIGZ1bmN0aW9uCisgICAgICAvLyBgaW1wZXJz
b25hdGVBbk91dGxldGAuCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGF0dGVt
cHRlZCB0byByZW5kZXIgaW50byBcJycgKyBpbnRvICsgJ1wnIGJ1dCBpdCB3YXMgbm90IGZvdW5k
JywgbGl2ZVJvdXRlcy5vdXRsZXRzLl9fZW1iZXJfb3JwaGFuc19fLm91dGxldHNbaW50b10ud2Fz
VXNlZCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiByZXByZXNlbnRFbXB0eVJvdXRlKGxp
dmVSb3V0ZXMsIGRlZmF1bHRQYXJlbnRTdGF0ZSwgcm91dGUpIHsKKyAgICAvLyB0aGUgcm91dGUg
ZGlkbid0IHJlbmRlciBhbnl0aGluZworICAgIHZhciBhbHJlYWR5QXBwZW5kZWQgPSBmaW5kTGl2
ZVJvdXRlKGxpdmVSb3V0ZXMsIHJvdXRlLnJvdXRlTmFtZSk7CisgICAgaWYgKGFscmVhZHlBcHBl
bmRlZCkgeworICAgICAgLy8gQnV0IHNvbWUgb3RoZXIgcm91dGUgaGFzIGFscmVhZHkgcmVuZGVy
ZWQgb3VyIGRlZmF1bHQKKyAgICAgIC8vIHRlbXBsYXRlLCBzbyB0aGF0IGJlY29tZXMgdGhlIGRl
ZmF1bHQgdGFyZ2V0IGZvciBhbnkKKyAgICAgIC8vIGNoaWxkcmVuIHdlIG1heSBoYXZlLgorICAg
ICAgcmV0dXJuIGFscmVhZHlBcHBlbmRlZDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ3JlYXRl
IGFuIGVudHJ5IHRvIHJlcHJlc2VudCBvdXIgZGVmYXVsdCB0ZW1wbGF0ZSBuYW1lLAorICAgICAg
Ly8ganVzdCBzbyBvdGhlciByb3V0ZXMgY2FuIHRhcmdldCBpdCBhbmQgaW5oZXJpdCBpdHMgcGxh
Y2UKKyAgICAgIC8vIGluIHRoZSBvdXRsZXQgaGllcmFyY2h5LgorICAgICAgZGVmYXVsdFBhcmVu
dFN0YXRlLm91dGxldHMubWFpbiA9IHsKKyAgICAgICAgcmVuZGVyOiB7CisgICAgICAgICAgbmFt
ZTogcm91dGUucm91dGVOYW1lLAorICAgICAgICAgIG91dGxldDogJ21haW4nCisgICAgICAgIH0s
CisgICAgICAgIG91dGxldHM6IHt9CisgICAgICB9OworICAgICAgcmV0dXJuIGRlZmF1bHRQYXJl
bnRTdGF0ZTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBFbWJlclJvdXRlcjsK
K30pOworCisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8K
K2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGVyX3N0YXRlJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2lzX2VtcHR5JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdl
bWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsSXNfZW1w
dHksIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlck1ldGFsQXNzaWduKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICB2YXIga2V5cyA9IE9iamVjdC5rZXlzOworCisgIHZhciBSb3V0ZXJT
dGF0ZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIGVt
YmVyUm91dGVyOiBudWxsLAorICAgIHJvdXRlckpzOiBudWxsLAorICAgIHJvdXRlckpzU3RhdGU6
IG51bGwsCisKKyAgICBpc0FjdGl2ZUludGVudDogZnVuY3Rpb24gKHJvdXRlTmFtZSwgbW9kZWxz
LCBxdWVyeVBhcmFtcywgcXVlcnlQYXJhbXNNdXN0TWF0Y2gpIHsKKyAgICAgIHZhciBzdGF0ZSA9
IHRoaXMucm91dGVySnNTdGF0ZTsKKyAgICAgIGlmICghdGhpcy5yb3V0ZXJKcy5pc0FjdGl2ZUlu
dGVudChyb3V0ZU5hbWUsIG1vZGVscywgbnVsbCwgc3RhdGUpKSB7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgIH0KKworICAgICAgdmFyIGVtcHR5UXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRh
bElzX2VtcHR5LmRlZmF1bHQoa2V5cyhxdWVyeVBhcmFtcykpOworCisgICAgICBpZiAocXVlcnlQ
YXJhbXNNdXN0TWF0Y2ggJiYgIWVtcHR5UXVlcnlQYXJhbXMpIHsKKyAgICAgICAgdmFyIHZpc2li
bGVRdWVyeVBhcmFtcyA9IHt9OworICAgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHZp
c2libGVRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpOworCisgICAgICAgIHRoaXMuZW1iZXJSb3V0
ZXIuX3ByZXBhcmVRdWVyeVBhcmFtcyhyb3V0ZU5hbWUsIG1vZGVscywgdmlzaWJsZVF1ZXJ5UGFy
YW1zKTsKKyAgICAgICAgcmV0dXJuIHNoYWxsb3dFcXVhbCh2aXNpYmxlUXVlcnlQYXJhbXMsIHN0
YXRlLnF1ZXJ5UGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICB9KTsKKworICBmdW5jdGlvbiBzaGFsbG93RXF1YWwoYSwgYikgeworICAgIHZhciBrOworICAg
IGZvciAoayBpbiBhKSB7CisgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrKSAmJiBhW2tdICE9
PSBiW2tdKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9y
IChrIGluIGIpIHsKKyAgICAgIGlmIChiLmhhc093blByb3BlcnR5KGspICYmIGFba10gIT09IGJb
a10pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IFJvdXRlclN0YXRlOworfSk7Citlbmlm
ZWQoJ2VtYmVyLXJvdXRpbmcvdXRpbHMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvYXNzaWdu
JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLnJvdXRlQXJncyA9IHJvdXRlQXJnczsKKyAgZXhwb3J0cy5nZXRBY3RpdmVU
YXJnZXROYW1lID0gZ2V0QWN0aXZlVGFyZ2V0TmFtZTsKKyAgZXhwb3J0cy5zdGFzaFBhcmFtTmFt
ZXMgPSBzdGFzaFBhcmFtTmFtZXM7CisgIGV4cG9ydHMuY2FsY3VsYXRlQ2FjaGVLZXkgPSBjYWxj
dWxhdGVDYWNoZUtleTsKKyAgZXhwb3J0cy5ub3JtYWxpemVDb250cm9sbGVyUXVlcnlQYXJhbXMg
PSBub3JtYWxpemVDb250cm9sbGVyUXVlcnlQYXJhbXM7CisKKyAgZnVuY3Rpb24gcm91dGVBcmdz
KHRhcmdldFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykgeworICAgIHZhciBhcmdzID0g
W107CisgICAgaWYgKHR5cGVvZiB0YXJnZXRSb3V0ZU5hbWUgPT09ICdzdHJpbmcnKSB7CisgICAg
ICBhcmdzLnB1c2goJycgKyB0YXJnZXRSb3V0ZU5hbWUpOworICAgIH0KKyAgICBhcmdzLnB1c2gu
YXBwbHkoYXJncywgbW9kZWxzKTsKKyAgICBhcmdzLnB1c2goeyBxdWVyeVBhcmFtczogcXVlcnlQ
YXJhbXMgfSk7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKworICBmdW5jdGlvbiBnZXRBY3RpdmVU
YXJnZXROYW1lKHJvdXRlcikgeworICAgIHZhciBoYW5kbGVySW5mb3MgPSByb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbiA/IHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uLnN0YXRlLmhhbmRsZXJJbmZvcyA6
IHJvdXRlci5zdGF0ZS5oYW5kbGVySW5mb3M7CisgICAgcmV0dXJuIGhhbmRsZXJJbmZvc1toYW5k
bGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZTsKKyAgfQorCisgIGZ1bmN0aW9uIHN0YXNoUGFyYW1O
YW1lcyhyb3V0ZXIsIGhhbmRsZXJJbmZvcykgeworICAgIGlmIChoYW5kbGVySW5mb3MuX25hbWVz
U3Rhc2hlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgaGVscGVyIGV4
aXN0cyBiZWNhdXNlIHJvdXRlci5qcy9yb3V0ZS1yZWNvZ25pemVyLmpzIGF3a3dhcmRseQorICAg
IC8vIGtlZXBzIHNlcGFyYXRlIGEgaGFuZGxlckluZm8ncyBsaXN0IG9mIHBhcmFtZXRlciBuYW1l
cyBkZXBlbmRpbmcKKyAgICAvLyBvbiB3aGV0aGVyIGEgVVJMIHRyYW5zaXRpb24gb3IgbmFtZWQg
dHJhbnNpdGlvbiBpcyBoYXBwZW5pbmcuCisgICAgLy8gSG9wZWZ1bGx5IHdlIGNhbiByZW1vdmUg
dGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIHZhciB0YXJnZXRSb3V0ZU5hbWUgPSBoYW5kbGVySW5m
b3NbaGFuZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWU7CisgICAgdmFyIHJlY29nSGFuZGxlcnMg
PSByb3V0ZXIucm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGFyZ2V0Um91dGVOYW1lKTsK
KyAgICB2YXIgZHluYW1pY1BhcmVudCA9IG51bGw7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVu
ID0gaGFuZGxlckluZm9zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAgICB2YXIgaGFuZGxl
ckluZm8gPSBoYW5kbGVySW5mb3NbaV07CisgICAgICB2YXIgbmFtZXMgPSByZWNvZ0hhbmRsZXJz
W2ldLm5hbWVzOworCisgICAgICBpZiAobmFtZXMubGVuZ3RoKSB7CisgICAgICAgIGR5bmFtaWNQ
YXJlbnQgPSBoYW5kbGVySW5mbzsKKyAgICAgIH0KKworICAgICAgaGFuZGxlckluZm8uX25hbWVz
ID0gbmFtZXM7CisKKyAgICAgIHZhciByb3V0ZSA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAg
ICByb3V0ZS5fc3Rhc2hOYW1lcyhoYW5kbGVySW5mbywgZHluYW1pY1BhcmVudCk7CisgICAgfQor
CisgICAgaGFuZGxlckluZm9zLl9uYW1lc1N0YXNoZWQgPSB0cnVlOworICB9CisKKyAgZnVuY3Rp
b24gX2NhbGN1bGF0ZUNhY2hlVmFsdWVQcmVmaXgocHJlZml4LCBwYXJ0KSB7CisgICAgLy8gY2Fs
Y3VsYXRlcyB0aGUgZG90IHNlcGVyYXRlZCBzZWN0aW9ucyBmcm9tIHByZWZpeCB0aGF0IGFyZSBh
bHNvCisgICAgLy8gYXQgdGhlIHN0YXJ0IG9mIHBhcnQgLSB3aGljaCBnaXZlcyB1cyB0aGUgcm91
dGUgbmFtZQorCisgICAgLy8gZ2l2ZW4gOiBwcmVmaXggPSBzaXRlLmFydGljbGUuY29tbWVudHMs
IHBhcnQgPSBzaXRlLmFydGljbGUuaWQKKyAgICAvLyAgICAgIC0gcmV0dXJuczogc2l0ZS5hcnRp
Y2xlICh1c2UgZ2V0KHZhbHVlc1tzaXRlLmFydGljbGVdLCAnaWQnKSB0byBnZXQgdGhlIGR5bmFt
aWMgcGFydCAtIHVzZWQgYmVsb3cpCisKKyAgICAvLyBnaXZlbiA6IHByZWZpeCA9IHNpdGUuYXJ0
aWNsZSwgcGFydCA9IHNpdGUuYXJ0aWNsZS5pZAorICAgIC8vICAgICAgLSByZXR1cm5zOiBzaXRl
LmFydGljbGUuICh1c2UgZ2V0KHZhbHVlc1tzaXRlLmFydGljbGVdLCAnaWQnKSB0byBnZXQgdGhl
IGR5bmFtaWMgcGFydCAtIHVzZWQgYmVsb3cpCisKKyAgICB2YXIgcHJlZml4UGFydHMgPSBwcmVm
aXguc3BsaXQoJy4nKTsKKyAgICB2YXIgY3VyclByZWZpeCA9ICcnOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGxlbiA9IHByZWZpeFBhcnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICB2
YXIgY3VyclBhcnQgPSBwcmVmaXhQYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbignLicpOworICAg
ICAgaWYgKHBhcnQuaW5kZXhPZihjdXJyUGFydCkgIT09IDApIHsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICB9CisgICAgICBjdXJyUHJlZml4ID0gY3VyclBhcnQ7CisgICAgfQorCisgICAgcmV0dXJu
IGN1cnJQcmVmaXg7CisgIH0KKworICAvKgorICAgIFN0b2xlbiBmcm9tIENvbnRyb2xsZXIKKyAg
Ki8KKworICBmdW5jdGlvbiBjYWxjdWxhdGVDYWNoZUtleShwcmVmaXgsIF9wYXJ0cywgdmFsdWVz
KSB7CisgICAgdmFyIHBhcnRzID0gX3BhcnRzIHx8IFtdOworICAgIHZhciBzdWZmaXhlcyA9ICcn
OworICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkg
eworICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHZhciBjYWNoZVZhbHVlUHJlZml4
ID0gX2NhbGN1bGF0ZUNhY2hlVmFsdWVQcmVmaXgocHJlZml4LCBwYXJ0KTsKKyAgICAgIHZhciB2
YWx1ZTsKKyAgICAgIGlmICh2YWx1ZXMpIHsKKyAgICAgICAgaWYgKGNhY2hlVmFsdWVQcmVmaXgg
JiYgY2FjaGVWYWx1ZVByZWZpeCBpbiB2YWx1ZXMpIHsKKyAgICAgICAgICB2YXIgcGFydFJlbW92
ZWRQcmVmaXggPSBwYXJ0LmluZGV4T2YoY2FjaGVWYWx1ZVByZWZpeCkgPT09IDAgPyBwYXJ0LnN1
YnN0cihjYWNoZVZhbHVlUHJlZml4Lmxlbmd0aCArIDEpIDogcGFydDsKKyAgICAgICAgICB2YWx1
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2YWx1ZXNbY2FjaGVWYWx1ZVByZWZpeF0s
IHBhcnRSZW1vdmVkUHJlZml4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWx1ZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2YWx1ZXMsIHBhcnQpOworICAgICAgICB9Cisg
ICAgICB9CisgICAgICBzdWZmaXhlcyArPSAnOjonICsgcGFydCArICc6JyArIHZhbHVlOworICAg
IH0KKyAgICByZXR1cm4gcHJlZml4ICsgc3VmZml4ZXMucmVwbGFjZShBTExfUEVSSU9EU19SRUdF
WCwgJy0nKTsKKyAgfQorCisgIHZhciBBTExfUEVSSU9EU19SRUdFWCA9IC9cLi9nOworCisgIC8q
CisgICAgQ29udHJvbGxlci1kZWZpbmVkIHF1ZXJ5IHBhcmFtZXRlcnMgY2FuIGNvbWUgaW4gdGhy
ZWUgc2hhcGVzOgorICAKKyAgICBBcnJheQorICAgICAgcXVlcnlQYXJhbXM6IFsnZm9vJywgJ2Jh
ciddCisgICAgQXJyYXkgb2Ygc2ltcGxlIG9iamVjdHMgd2hlcmUgdmFsdWUgaXMgYW4gYWxpYXMK
KyAgICAgIHF1ZXJ5UGFyYW1zOiBbCisgICAgICAgIHsKKyAgICAgICAgICAnZm9vJzogJ3JlbmFt
ZV9mb29fdG9fdGhpcycKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICdiYXInOiAn
Y2FsbF9iYXJfdGhpc19pbnN0ZWFkJworICAgICAgICB9CisgICAgICBdCisgICAgQXJyYXkgb2Yg
ZnVsbHkgZGVmaW5lZCBvYmplY3RzCisgICAgICBxdWVyeVBhcmFtczogWworICAgICAgICB7Cisg
ICAgICAgICAgJ2Zvbyc6IHsKKyAgICAgICAgICAgIGFzOiAncmVuYW1lX2Zvb190b190aGlzJwor
ICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICdiYXInOiB7Cisg
ICAgICAgICAgICBhczogJ2NhbGxfYmFyX3RoaXNfaW5zdGVhZCcsCisgICAgICAgICAgICBzY29w
ZTogJ2NvbnRyb2xsZXInCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgIAorICAg
IFRoaXMgaGVscGVyIG5vcm1hbGl6ZXMgYWxsIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBpbnRvIHRo
ZQorICAgICdBcnJheSBvZiBmdWxseSBkZWZpbmVkIG9iamVjdHMnIHN0eWxlLgorICAqLworCisg
IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRyb2xsZXJRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykgewor
ICAgIGlmIChxdWVyeVBhcmFtcy5fcXBNYXApIHsKKyAgICAgIHJldHVybiBxdWVyeVBhcmFtcy5f
cXBNYXA7CisgICAgfQorCisgICAgdmFyIHFwTWFwID0gcXVlcnlQYXJhbXMuX3FwTWFwID0ge307
CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcXVlcnlQYXJhbXMubGVuZ3RoOyBpIDwgbGVu
OyArK2kpIHsKKyAgICAgIGFjY3VtdWxhdGVRdWVyeVBhcmFtRGVzY3JpcHRvcnMocXVlcnlQYXJh
bXNbaV0sIHFwTWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcXBNYXA7CisgIH0KKworICBmdW5j
dGlvbiBhY2N1bXVsYXRlUXVlcnlQYXJhbURlc2NyaXB0b3JzKF9kZXNjLCBhY2N1bSkgeworICAg
IHZhciBkZXNjID0gX2Rlc2M7CisgICAgdmFyIHRtcDsKKyAgICBpZiAodHlwZW9mIGRlc2MgPT09
ICdzdHJpbmcnKSB7CisgICAgICB0bXAgPSB7fTsKKyAgICAgIHRtcFtkZXNjXSA9IHsgYXM6IG51
bGwgfTsKKyAgICAgIGRlc2MgPSB0bXA7CisgICAgfQorCisgICAgZm9yICh2YXIga2V5IGluIGRl
c2MpIHsKKyAgICAgIGlmICghZGVzYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHNpbmdsZURlc2MgPSBkZXNjW2tleV07CisgICAg
ICBpZiAodHlwZW9mIHNpbmdsZURlc2MgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHNpbmdsZURl
c2MgPSB7IGFzOiBzaW5nbGVEZXNjIH07CisgICAgICB9CisKKyAgICAgIHRtcCA9IGFjY3VtW2tl
eV0gfHwgeyBhczogbnVsbCwgc2NvcGU6ICdtb2RlbCcgfTsKKyAgICAgIF9lbWJlck1ldGFsQXNz
aWduLmRlZmF1bHQodG1wLCBzaW5nbGVEZXNjKTsKKworICAgICAgYWNjdW1ba2V5XSA9IHRtcDsK
KyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL2NvbXBhcmUnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItcnVudGltZS91dGlscycsICdlbWJlci1ydW50aW1lL21peGlucy9jb21wYXJh
YmxlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlclJ1bnRp
bWVNaXhpbnNDb21wYXJhYmxlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBjb21wYXJlOworCisgIHZhciBUWVBFX09SREVSID0geworICAgICd1bmRlZmluZWQnOiAw
LAorICAgICdudWxsJzogMSwKKyAgICAnYm9vbGVhbic6IDIsCisgICAgJ251bWJlcic6IDMsCisg
ICAgJ3N0cmluZyc6IDQsCisgICAgJ2FycmF5JzogNSwKKyAgICAnb2JqZWN0JzogNiwKKyAgICAn
aW5zdGFuY2UnOiA3LAorICAgICdmdW5jdGlvbic6IDgsCisgICAgJ2NsYXNzJzogOSwKKyAgICAn
ZGF0ZSc6IDEwCisgIH07CisKKyAgLy8KKyAgLy8gdGhlIHNwYWNlc2hpcCBvcGVyYXRvcgorICAv
LworICAvLyAgICAgICAgICAgICAgICAgICAgICBgLiBfX18KKyAgLy8gICAgICAgICAgICAgICAg
ICAgICBfXywnIF9fYC4gICAgICAgICAgICAgICAgXy4uLS0tLS4uLi5fX19fCisgIC8vICAgICAg
ICAgX18uLi4tLS4nYGA7LiAgICwuICAgO2BgLS0uLl9fICAgICAuJyAgICAsLS5fICAgIF8uLScK
KyAgLy8gICBfLi4tJyctLS0tLS0tJyAgIGAnICAgYCcgICBgJyAgICAgTyBgYC0nJy5fICAgKCw7
JykgXywnCisgIC8vICwnX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAg
XGAtLl9gLScsJworICAvLyAgYC5fICAgICAgICAgICAgICBgYGBgYGBgYGBgYC0tLS0tLS4uLl9f
XyAgICctLi5fJy06CisgIC8vICAgICBgYGAtLS4uXyAgICAgICwuICAgICAgICAgICAgICAgICAg
ICAgYGBgYC0tLi4uX19cLS4KKyAgLy8gICAgICAgICAgICAgYC4tLS4gYC1gICJJTkZJTklUWSBJ
UyBMRVNTICAgICBfX19fICAgIHwgIHxgCisgIC8vICAgICAgICAgICAgICAgYC4gYC4gICBUSEFO
IEJFWU9ORCIgICAgICAgICwnYGBgYGAuICA7ICA7YAorICAvLyAgICAgICAgICAgICAgICAgYC5f
YC4gICAgICAgIF9fX19fX19fX18gICBgLiAgICAgIFwnX18vYAorICAvLyAgICAgICAgICAgICAg
ICAgICAgYC06Ll9fX19fL19fX19fXy9fX18vX19fX2AuICAgICBcICBgCisgIC8vICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIGAuXyAgICBgLiAgICBcCisgIC8vICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBgLl9fX19fX19fX2AtLiAgIGAuICAgYC5fX18KKyAg
Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1N0ICBgLS0t
LS0tJ2AKKyAgZnVuY3Rpb24gc3BhY2VzaGlwKGEsIGIpIHsKKyAgICB2YXIgZGlmZiA9IGEgLSBi
OworICAgIHJldHVybiAoZGlmZiA+IDApIC0gKGRpZmYgPCAwKTsKKyAgfQorCisgIC8qKgorICAg
Q29tcGFyZXMgdHdvIGphdmFzY3JpcHQgdmFsdWVzIGFuZCByZXR1cm5zOgorICAKKyAgICAtIC0x
IGlmIHRoZSBmaXJzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwKKyAgICAtIDAgaWYgYm90
aCBhcmUgZXF1YWwsCisgICAgLSAxIGlmIHRoZSBmaXJzdCBpcyBncmVhdGVyIHRoYW4gdGhlIHNl
Y29uZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywg
J2hlbGxvJyk7ICAvLyAwCisgICAgRW1iZXIuY29tcGFyZSgnYWJjJywgJ2RmZycpOyAgICAgIC8v
IC0xCisgICAgRW1iZXIuY29tcGFyZSgyLCAxKTsgICAgICAgICAgICAgIC8vIDEKKyAgICBgYGAK
KyAgCisgICBJZiB0aGUgdHlwZXMgb2YgdGhlIHR3byBvYmplY3RzIGFyZSBkaWZmZXJlbnQgcHJl
Y2VkZW5jZSBvY2N1cnMgaW4gdGhlCisgICBmb2xsb3dpbmcgb3JkZXIsIHdpdGggdHlwZXMgZWFy
bGllciBpbiB0aGUgbGlzdCBjb25zaWRlcmVkIGA8YCB0eXBlcworICAgbGF0ZXIgaW4gdGhlIGxp
c3Q6CisgIAorICAgIC0gdW5kZWZpbmVkCisgICAgLSBudWxsCisgICAgLSBib29sZWFuCisgICAg
LSBudW1iZXIKKyAgICAtIHN0cmluZworICAgIC0gYXJyYXkKKyAgICAtIG9iamVjdAorICAgIC0g
aW5zdGFuY2UKKyAgICAtIGZ1bmN0aW9uCisgICAgLSBjbGFzcworICAgIC0gZGF0ZQorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuY29tcGFyZSgnaGVsbG8nLCA1MCk7ICAgICAgIC8v
IDEKKyAgICBFbWJlci5jb21wYXJlKDUwLCAnaGVsbG8nKTsgICAgICAgLy8gLTEKKyAgICBgYGAK
KyAgCisgICBAbWV0aG9kIGNvbXBhcmUKKyAgIEBmb3IgRW1iZXIKKyAgIEBwYXJhbSB7T2JqZWN0
fSB2IEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUKKyAgIEBwYXJhbSB7T2JqZWN0fSB3IFNlY29uZCB2
YWx1ZSB0byBjb21wYXJlCisgICBAcmV0dXJuIHtOdW1iZXJ9IC0xIGlmIHYgPCB3LCAwIGlmIHYg
PSB3IGFuZCAxIGlmIHYgPiB3LgorICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvbXBh
cmUodiwgdykgeworICAgIGlmICh2ID09PSB3KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisK
KyAgICB2YXIgdHlwZTEgPSBfZW1iZXJSdW50aW1lVXRpbHMudHlwZU9mKHYpOworICAgIHZhciB0
eXBlMiA9IF9lbWJlclJ1bnRpbWVVdGlscy50eXBlT2Yodyk7CisKKyAgICBpZiAoX2VtYmVyUnVu
dGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdCkgeworICAgICAgaWYgKHR5cGUxID09PSAnaW5z
dGFuY2UnICYmIF9lbWJlclJ1bnRpbWVNaXhpbnNDb21wYXJhYmxlLmRlZmF1bHQuZGV0ZWN0KHYp
ICYmIHYuY29uc3RydWN0b3IuY29tcGFyZSkgeworICAgICAgICByZXR1cm4gdi5jb25zdHJ1Y3Rv
ci5jb21wYXJlKHYsIHcpOworICAgICAgfQorCisgICAgICBpZiAodHlwZTIgPT09ICdpbnN0YW5j
ZScgJiYgX2VtYmVyUnVudGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdC5kZXRlY3QodykgJiYg
dy5jb25zdHJ1Y3Rvci5jb21wYXJlKSB7CisgICAgICAgIHJldHVybiB3LmNvbnN0cnVjdG9yLmNv
bXBhcmUodywgdikgKiAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgcmVzID0gc3BhY2Vz
aGlwKFRZUEVfT1JERVJbdHlwZTFdLCBUWVBFX09SREVSW3R5cGUyXSk7CisKKyAgICBpZiAocmVz
ICE9PSAwKSB7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHR5cGVzIGFyZSBl
cXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5vdworICAgIHN3aXRjaCAodHlwZTEp
IHsKKyAgICAgIGNhc2UgJ2Jvb2xlYW4nOgorICAgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgICAg
cmV0dXJuIHNwYWNlc2hpcCh2LCB3KTsKKworICAgICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAg
cmV0dXJuIHNwYWNlc2hpcCh2LmxvY2FsZUNvbXBhcmUodyksIDApOworCisgICAgICBjYXNlICdh
cnJheSc6CisgICAgICAgIHZhciB2TGVuID0gdi5sZW5ndGg7CisgICAgICAgIHZhciB3TGVuID0g
dy5sZW5ndGg7CisgICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2TGVuLCB3TGVuKTsKKworICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgdmFyIHIgPSBj
b21wYXJlKHZbaV0sIHdbaV0pOworICAgICAgICAgIGlmIChyICE9PSAwKSB7CisgICAgICAgICAg
ICByZXR1cm4gcjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGwgZWxl
bWVudHMgYXJlIGVxdWFsIG5vdworICAgICAgICAvLyBzaG9ydGVyIGFycmF5IHNob3VsZCBiZSBv
cmRlcmVkIGZpcnN0CisgICAgICAgIHJldHVybiBzcGFjZXNoaXAodkxlbiwgd0xlbik7CisKKyAg
ICAgIGNhc2UgJ2luc3RhbmNlJzoKKyAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVNaXhpbnNDb21w
YXJhYmxlLmRlZmF1bHQgJiYgX2VtYmVyUnVudGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdC5k
ZXRlY3QodikpIHsKKyAgICAgICAgICByZXR1cm4gdi5jb21wYXJlKHYsIHcpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiAwOworCisgICAgICBjYXNlICdkYXRlJzoKKyAgICAgICAgcmV0dXJu
IHNwYWNlc2hpcCh2LmdldFRpbWUoKSwgdy5nZXRUaW1lKCkpOworCisgICAgICBkZWZhdWx0Ogor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1l
L2NvbXB1dGVkL3JlZHVjZV9jb21wdXRlZF9tYWNyb3MnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVy
LXJ1bnRpbWUvY29tcGFyZScsICdlbWJlci1ydW50aW1lL3V0aWxzJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL25hdGl2ZV9hcnJheScsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1ldGFs
L2dldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1tZXRh
bC91dGlscycsICdlbWJlci1tZXRhbC93ZWFrX21hcCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsRXJyb3Is
IF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlclJ1bnRpbWVD
b21wYXJlLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJy
YXksIF9lbWJlck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcywgX2VtYmVy
TWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsV2Vha19tYXAp
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisg
ICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuc3VtID0gc3VtOworICBleHBvcnRz
Lm1heCA9IG1heDsKKyAgZXhwb3J0cy5taW4gPSBtaW47CisgIGV4cG9ydHMubWFwID0gbWFwOwor
ICBleHBvcnRzLm1hcEJ5ID0gbWFwQnk7CisgIGV4cG9ydHMuZmlsdGVyID0gZmlsdGVyOworICBl
eHBvcnRzLmZpbHRlckJ5ID0gZmlsdGVyQnk7CisgIGV4cG9ydHMudW5pcSA9IHVuaXE7CisgIGV4
cG9ydHMudW5pcUJ5ID0gdW5pcUJ5OworICBleHBvcnRzLmludGVyc2VjdCA9IGludGVyc2VjdDsK
KyAgZXhwb3J0cy5zZXREaWZmID0gc2V0RGlmZjsKKyAgZXhwb3J0cy5jb2xsZWN0ID0gY29sbGVj
dDsKKyAgZXhwb3J0cy5zb3J0ID0gc29ydDsKKworICBmdW5jdGlvbiByZWR1Y2VNYWNybyhkZXBl
bmRlbnRLZXksIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0
YWxDb21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXkgKyAnLltdJywgZnVuY3Rpb24gKCkgewor
ICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIGFyciA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworCisgICAgICBpZiAoYXJyID09PSBu
dWxsIHx8IHR5cGVvZiBhcnIgIT09ICdvYmplY3QnKSB7CisgICAgICAgIHJldHVybiBpbml0aWFs
VmFsdWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChwcmV2
aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGluZGV4LCBhcnJheSkgeworICAgICAgICByZXR1cm4g
Y2FsbGJhY2suY2FsbChfdGhpcywgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlLCBpbmRleCwg
YXJyYXkpOworICAgICAgfSwgaW5pdGlhbFZhbHVlKTsKKyAgICB9KS5yZWFkT25seSgpOworICB9
CisKKyAgZnVuY3Rpb24gYXJyYXlNYWNybyhkZXBlbmRlbnRLZXksIGNhbGxiYWNrKSB7CisgICAg
Ly8gVGhpcyBpcyBhIGJpdCB1Z2x5CisgICAgdmFyIHByb3BlcnR5TmFtZTsKKyAgICBpZiAoL0Bl
YWNoLy50ZXN0KGRlcGVuZGVudEtleSkpIHsKKyAgICAgIHByb3BlcnR5TmFtZSA9IGRlcGVuZGVu
dEtleS5yZXBsYWNlKC9cLkBlYWNoLiokLywgJycpOworICAgIH0gZWxzZSB7CisgICAgICBwcm9w
ZXJ0eU5hbWUgPSBkZXBlbmRlbnRLZXk7CisgICAgICBkZXBlbmRlbnRLZXkgKz0gJy5bXSc7Cisg
ICAgfQorCisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5kZW50
S2V5LCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgcHJvcGVydHlOYW1lKTsKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRp
bHMuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXkuQShjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlKSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7Cisg
ICAgICB9CisgICAgfSkucmVhZE9ubHkoKTsKKyAgfQorCisgIGZ1bmN0aW9uIG11bHRpQXJyYXlN
YWNybyhkZXBlbmRlbnRLZXlzLCBjYWxsYmFjaykgeworICAgIHZhciBhcmdzID0gZGVwZW5kZW50
S2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeworICAgICAgcmV0dXJuIGtleSArICcuW10nOworICAg
IH0pOworCisgICAgYXJncy5wdXNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJS
dW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoY2FsbGJhY2suY2FsbCh0aGlzLCBkZXBlbmRlbnRL
ZXlzKSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRl
ZC5hcHBseSh0aGlzLCBhcmdzKS5yZWFkT25seSgpOworICB9CisKKyAgLyoqCisgICAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzCisgICAgaW4g
dGhlIGRlcGVuZGVudCBhcnJheS4KKyAgCisgICAgQG1ldGhvZCBzdW0KKyAgICBAZm9yIEVtYmVy
LmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHZhbHVlcyBp
biB0aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyAgICBAc2luY2UgMS40LjAKKyAgICBAcHVibGlj
CisgICovCisKKyAgZnVuY3Rpb24gc3VtKGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiByZWR1
Y2VNYWNybyhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uIChzdW0sIGl0ZW0pIHsKKyAgICAgIHJldHVy
biBzdW0gKyBpdGVtOworICAgIH0sIDApOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBw
cm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlCisgICAgZGVw
ZW5kZW50IGFycmF5LiBUaGlzIHdpbGwgcmV0dXJuIGAtSW5maW5pdHlgIHdoZW4gdGhlIGRlcGVu
ZGVudAorICAgIGFycmF5IGlzIGVtcHR5LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFy
IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgY2hpbGRBZ2VzOiBFbWJlci5j
b21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJyksCisgICAgICBtYXhDaGlsZEFnZTogRW1i
ZXIuY29tcHV0ZWQubWF4KCdjaGlsZEFnZXMnKQorICAgIH0pOworICAKKyAgICB2YXIgbG9yZEJ5
cm9uID0gUGVyc29uLmNyZWF0ZSh7IGNoaWxkcmVuOiBbXSB9KTsKKyAgCisgICAgbG9yZEJ5cm9u
LmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gLUluZmluaXR5CisgICAgbG9yZEJ5cm9uLmdldCgnY2hp
bGRyZW4nKS5wdXNoT2JqZWN0KHsKKyAgICAgIG5hbWU6ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFn
ZTogNworICAgIH0pOworICAgIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIDcKKyAg
ICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7CisgICAgICBuYW1lOiAn
QWxsZWdyYSBCeXJvbicsCisgICAgICBhZ2U6IDUKKyAgICB9LCB7CisgICAgICBuYW1lOiAnRWxp
emFiZXRoIE1lZG9yYSBMZWlnaCcsCisgICAgICBhZ2U6IDgKKyAgICB9XSk7CisgICAgbG9yZEJ5
cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gOAorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1h
eAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50
S2V5CisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgdGhlIGxh
cmdlc3QgdmFsdWUgaW4gdGhlIGRlcGVuZGVudEtleSdzIGFycmF5CisgICAgQHB1YmxpYworICAq
LworCisgIGZ1bmN0aW9uIG1heChkZXBlbmRlbnRLZXkpIHsKKyAgICByZXR1cm4gcmVkdWNlTWFj
cm8oZGVwZW5kZW50S2V5LCBmdW5jdGlvbiAobWF4LCBpdGVtKSB7CisgICAgICByZXR1cm4gTWF0
aC5tYXgobWF4LCBpdGVtKTsKKyAgICB9LCAtSW5maW5pdHkpOworICB9CisKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgaW4g
dGhlCisgICAgZGVwZW5kZW50IGFycmF5LiBUaGlzIHdpbGwgcmV0dXJuIGBJbmZpbml0eWAgd2hl
biB0aGUgZGVwZW5kZW50CisgICAgYXJyYXkgaXMgZW1wdHkuCisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBjaGlsZEFn
ZXM6IEVtYmVyLmNvbXB1dGVkLm1hcEJ5KCdjaGlsZHJlbicsICdhZ2UnKSwKKyAgICAgIG1pbkNo
aWxkQWdlOiBFbWJlci5jb21wdXRlZC5taW4oJ2NoaWxkQWdlcycpCisgICAgfSk7CisgIAorICAg
IHZhciBsb3JkQnlyb24gPSBQZXJzb24uY3JlYXRlKHsgY2hpbGRyZW46IFtdIH0pOworICAKKyAg
ICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScpOyAvLyBJbmZpbml0eQorICAgIGxvcmRCeXJv
bi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7CisgICAgICBuYW1lOiAnQXVndXN0YSBBZGEg
Qnlyb24nLCBhZ2U6IDcKKyAgICB9KTsKKyAgICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScp
OyAvLyA3CisgICAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbeworICAg
ICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgICAgYWdlOiA1CisgICAgfSwgeworICAgICAg
bmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgICAgYWdlOiA4CisgICAgfV0pOwor
ICAgIGxvcmRCeXJvbi5nZXQoJ21pbkNoaWxkQWdlJyk7IC8vIDUKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBtaW4KKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9
IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1
dGVzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiB0aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyAgICBA
cHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbWluKGRlcGVuZGVudEtleSkgeworICAgIHJldHVy
biByZWR1Y2VNYWNybyhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uIChtaW4sIGl0ZW0pIHsKKyAgICAg
IHJldHVybiBNYXRoLm1pbihtaW4sIGl0ZW0pOworICAgIH0sIEluZmluaXR5KTsKKyAgfQorCisg
IC8qKgorICAgIFJldHVybnMgYW4gYXJyYXkgbWFwcGVkIHZpYSB0aGUgY2FsbGJhY2sKKyAgCisg
ICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93
aW5nIHNpZ25hdHVyZS4KKyAgICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRl
cmF0aW9uLgorICAgIGBpbmRleGAgaXMgdGhlIGludGVnZXIgaW5kZXggb2YgdGhlIGN1cnJlbnQg
aXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rp
b24oaXRlbSwgaW5kZXgpOworICAgIGBgYAorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
ZXhjaXRpbmdDaG9yZXM6IEVtYmVyLmNvbXB1dGVkLm1hcCgnY2hvcmVzJywgZnVuY3Rpb24oY2hv
cmUsIGluZGV4KSB7CisgICAgICAgIHJldHVybiBjaG9yZS50b1VwcGVyQ2FzZSgpICsgJyEnOwor
ICAgICAgfSkKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7
CisgICAgICBjaG9yZXM6IFsnY2xlYW4nLCAnd3JpdGUgbW9yZSB1bml0IHRlc3RzJ10KKyAgICB9
KTsKKyAgCisgICAgaGFtc3Rlci5nZXQoJ2V4Y2l0aW5nQ2hvcmVzJyk7IC8vIFsnQ0xFQU4hJywg
J1dSSVRFIE1PUkUgVU5JVCBURVNUUyEnXQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1hcAor
ICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5
CisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBwZWQgdmlhIHRoZSBjYWxsYmFjaworICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBtYXAoZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgeworICAg
IHJldHVybiBhcnJheU1hY3JvKGRlcGVuZGVudEtleSwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAg
ICByZXR1cm4gdmFsdWUubWFwKGNhbGxiYWNrLCB0aGlzKTsKKyAgICB9KTsKKyAgfQorCisgIC8q
KgorICAgIFJldHVybnMgYW4gYXJyYXkgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
eworICAgICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdl
JykKKyAgICB9KTsKKyAgCisgICAgdmFyIGxvcmRCeXJvbiA9IFBlcnNvbi5jcmVhdGUoeyBjaGls
ZHJlbjogW10gfSk7CisgIAorICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbXQor
ICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7IG5hbWU6ICdBdWd1c3Rh
IEFkYSBCeXJvbicsIGFnZTogNyB9KTsKKyAgICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsg
Ly8gWzddCisgICAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbeworICAg
ICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgICAgYWdlOiA1CisgICAgfSwgeworICAgICAg
bmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgICAgYWdlOiA4CisgICAgfV0pOwor
ICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbNywgNSwgOF0KKyAgICBgYGAKKyAg
CisgICAgQG1ldGhvZCBtYXBCeQorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0g
e1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5Cisg
ICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gYW4gYXJyYXkgbWFwcGVkIHRvIHRo
ZSBzcGVjaWZpZWQga2V5CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIG1hcEJ5KGRl
cGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
RW1iZXIuY29tcHV0ZWQubWFwQnkgZXhwZWN0cyBhIHByb3BlcnR5IHN0cmluZyBmb3IgaXRzIHNl
Y29uZCBhcmd1bWVudCwgJyArICdwZXJoYXBzIHlvdSBtZWFudCB0byB1c2UgIm1hcCInLCB0eXBl
b2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnKTsKKworICAgIHJldHVybiBtYXAoZGVwZW5kZW50
S2V5ICsgJy5AZWFjaC4nICsgcHJvcGVydHlLZXksIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICBy
ZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsKKyAg
ICB9KTsKKyAgfQorCisgIC8qKgorICAgIEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBjYWxsYmFj
ay4KKyAgCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0
aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4KKyAgICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBp
biB0aGUgaXRlcmF0aW9uLgorICAgIGBpbmRleGAgaXMgdGhlIGludGVnZXIgaW5kZXggb2YgdGhl
IGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgIGBhcnJheWAgaXMgdGhlIGRlcGVu
ZGFudCBhcnJheSBpdHNlbGYuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlvbihp
dGVtLCBpbmRleCwgYXJyYXkpOworICAgIGBgYAorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
dmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHJlbWFpbmluZ0Nob3Jl
czogRW1iZXIuY29tcHV0ZWQuZmlsdGVyKCdjaG9yZXMnLCBmdW5jdGlvbihjaG9yZSwgaW5kZXgs
IGFycmF5KSB7CisgICAgICAgIHJldHVybiAhY2hvcmUuZG9uZTsKKyAgICAgIH0pCisgICAgfSk7
CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoeworICAgICAgY2hvcmVzOiBb
CisgICAgICAgIHsgbmFtZTogJ2Nvb2snLCBkb25lOiB0cnVlIH0sCisgICAgICAgIHsgbmFtZTog
J2NsZWFuJywgZG9uZTogdHJ1ZSB9LAorICAgICAgICB7IG5hbWU6ICd3cml0ZSBtb3JlIHVuaXQg
dGVzdHMnLCBkb25lOiBmYWxzZSB9CisgICAgICBdCisgICAgfSk7CisgIAorICAgIGhhbXN0ZXIu
Z2V0KCdyZW1haW5pbmdDaG9yZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3Rz
JywgZG9uZTogZmFsc2V9XQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbHRlcgorICAgIEBm
b3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFBy
b3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rp
b24gZmlsdGVyKGRlcGVuZGVudEtleSwgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gYXJyYXlNYWNy
byhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlLmZp
bHRlcihjYWxsYmFjaywgdGhpcyk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBGaWx0ZXJz
IHRoZSBhcnJheSBieSB0aGUgcHJvcGVydHkgYW5kIHZhbHVlCisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgcmVtYWlu
aW5nQ2hvcmVzOiBFbWJlci5jb21wdXRlZC5maWx0ZXJCeSgnY2hvcmVzJywgJ2RvbmUnLCBmYWxz
ZSkKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAg
ICBjaG9yZXM6IFsKKyAgICAgICAgeyBuYW1lOiAnY29vaycsIGRvbmU6IHRydWUgfSwKKyAgICAg
ICAgeyBuYW1lOiAnY2xlYW4nLCBkb25lOiB0cnVlIH0sCisgICAgICAgIHsgbmFtZTogJ3dyaXRl
IG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6IGZhbHNlIH0KKyAgICAgIF0KKyAgICB9KTsKKyAgCisg
ICAgaGFtc3Rlci5nZXQoJ3JlbWFpbmluZ0Nob3JlcycpOyAvLyBbeyBuYW1lOiAnd3JpdGUgbW9y
ZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2UgfV0KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBm
aWx0ZXJCeQorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5CisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5CisgICAgQHBhcmFtIHsq
fSB2YWx1ZQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoZSBmaWx0ZXJl
ZCBhcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBmaWx0ZXJCeShkZXBlbmRl
bnRLZXksIHByb3BlcnR5S2V5LCB2YWx1ZSkgeworICAgIHZhciBjYWxsYmFjazsKKworICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CisgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChp
dGVtKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbSwg
cHJvcGVydHlLZXkpOworICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgY2FsbGJhY2sgPSBm
dW5jdGlvbiAoaXRlbSkgeworICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KGl0ZW0sIHByb3BlcnR5S2V5KSA9PT0gdmFsdWU7CisgICAgICB9OworICAgIH0KKworICAg
IHJldHVybiBmaWx0ZXIoZGVwZW5kZW50S2V5ICsgJy5AZWFjaC4nICsgcHJvcGVydHlLZXksIGNh
bGxiYWNrKTsKKyAgfQorCisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0
dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgdW5pcXVlCisgICAgZWxlbWVudHMgZnJvbSBv
bmUgb3IgbW9yZSBkZXBlbmRlbnQgYXJyYXlzLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAg
ICAgdW5pcXVlRnJ1aXRzOiBFbWJlci5jb21wdXRlZC51bmlxKCdmcnVpdHMnKQorICAgIH0pOwor
ICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKHsKKyAgICAgIGZydWl0czogWwor
ICAgICAgICAnYmFuYW5hJywKKyAgICAgICAgJ2dyYXBlJywKKyAgICAgICAgJ2thbGUnLAorICAg
ICAgICAnYmFuYW5hJworICAgICAgXQorICAgIH0pOworICAKKyAgICBoYW1zdGVyLmdldCgndW5p
cXVlRnJ1aXRzJyk7IC8vIFsnYmFuYW5hJywgJ2dyYXBlJywgJ2thbGUnXQorICAgIGBgYAorICAK
KyAgICBAbWV0aG9kIHVuaXEKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtT
dHJpbmd9IHByb3BlcnR5S2V5KgorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9
IGNvbXB1dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHVuaXF1ZSBlbGVtZW50cyBm
cm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
dW5pcSgpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFy
cmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgYXJnc1tf
a2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICByZXR1cm4gbXVsdGlBcnJheU1h
Y3JvKGFyZ3MsIGZ1bmN0aW9uIChkZXBlbmRlbnRLZXlzKSB7CisgICAgICB2YXIgX3RoaXMyID0g
dGhpczsKKworICAgICAgdmFyIHVuaXEgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKworICAgICAgZGVwZW5kZW50S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChkZXBlbmRlbnRL
ZXkpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KF90
aGlzMiwgZGVwZW5kZW50S2V5KTsKKyAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVVdGlscy5pc0Fy
cmF5KHZhbHVlKSkgeworICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsK
KyAgICAgICAgICAgIGlmICh1bmlxLmluZGV4T2YoaXRlbSkgPT09IC0xKSB7CisgICAgICAgICAg
ICAgIHVuaXEucHVzaChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAg
ICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiB1bmlxOworICAgIH0pOworICB9CisKKyAg
LyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdp
dGggYWxsIHRoZSB1bmlxdWUKKyAgICBlbGVtZW50cyBmcm9tIGFuIGFycmF5LCB3aXRoIHVuaXF1
ZW5lc3MgZGV0ZXJtaW5lZCBieSBzcGVjaWZpYyBrZXkuCisgICAgRXhhbXBsZQorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
dW5pcXVlRnJ1aXRzOiBFbWJlci5jb21wdXRlZC51bmlxQnkoJ2ZydWl0cycsICdpZCcpCisgICAg
fSk7CisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAgICBmcnVpdHM6IFsK
KyAgICAgICAgeyBpZDogMSwgJ2JhbmFuYScgfSwKKyAgICAgICAgeyBpZDogMiwgJ2dyYXBlJyB9
LAorICAgICAgICB7IGlkOiAzLCAncGVhY2gnIH0sCisgICAgICAgIHsgaWQ6IDEsICdiYW5hbmEn
IH0KKyAgICAgIF0KKyAgICB9KTsKKyAgICBoYW1zdGVyLmdldCgndW5pcXVlRnJ1aXRzJyk7IC8v
IFsgeyBpZDogMSwgJ2JhbmFuYScgfSwgeyBpZDogMiwgJ2dyYXBlJyB9LCB7IGlkOiAzLCAncGVh
Y2gnIH1dCisgICAgYGBgCisgICAgQG1ldGhvZCB1bmlxQnkKKyAgICBAZm9yIEVtYmVyLmNvbXB1
dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wZXJ0eUtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1
dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRo
ZSBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gdW5pcUJ5
KGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXkgKyAnLltdJywgZnVuY3Rpb24gKCkgeworICAgICAg
dmFyIHVuaXEgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIHZh
ciBzZWVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHZh
ciBsaXN0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7
CisgICAgICBpZiAoX2VtYmVyUnVudGltZVV0aWxzLmlzQXJyYXkobGlzdCkpIHsKKyAgICAgICAg
bGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgdmFyIGd1aWQgPSBfZW1i
ZXJNZXRhbFV0aWxzLmd1aWRGb3IoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGl0ZW0sIHBy
b3BlcnR5S2V5KSk7CisgICAgICAgICAgaWYgKCEoZ3VpZCBpbiBzZWVuKSkgeworICAgICAgICAg
ICAgc2VlbltndWlkXSA9IHRydWU7CisgICAgICAgICAgICB1bmlxLnB1c2goaXRlbSk7CisgICAg
ICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB1bmlxOworICAgIH0p
LnJlYWRPbmx5KCk7CisgIH0KKworICAvKioKKyAgICBBbGlhcyBmb3IgW0VtYmVyLmNvbXB1dGVk
LnVuaXFdKC9hcGkvI21ldGhvZF9jb21wdXRlZF91bmlxKS4KKyAgCisgICAgQG1ldGhvZCB1bmlv
bgorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlL
ZXkqCisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcg
YXJyYXkgd2l0aCBhbGwgdGhlCisgICAgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVuZGVu
dCBhcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIHVuaW9uID0gdW5pcTsKKworICBleHBv
cnRzLnVuaW9uID0gdW5pb247CisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gg
cmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgZHVwbGljYXRlZAorICAgIGVsZW1lbnRz
IGZyb20gdHdvIG9yIG1vcmUgZGVwZW5kZW50IGFycmF5cy4KKyAgCisgICAgRXhhbXBsZQorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIG9iaiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgICAgZnJpZW5kc0luQ29tbW9uOiBFbWJlci5jb21wdXRlZC5pbnRlcnNlY3QoJ2FkYUZyaWVu
ZHMnLCAnY2hhcmxlc0ZyaWVuZHMnKQorICAgIH0pLmNyZWF0ZSh7CisgICAgICBhZGFGcmllbmRz
OiBbJ0NoYXJsZXMgQmFiYmFnZScsICdKb2huIEhvYmhvdXNlJywgJ1dpbGxpYW0gS2luZycsICdN
YXJ5IFNvbWVydmlsbGUnXSwKKyAgICAgIGNoYXJsZXNGcmllbmRzOiBbJ1dpbGxpYW0gS2luZycs
ICdNYXJ5IFNvbWVydmlsbGUnLCAnQWRhIExvdmVsYWNlJywgJ0dlb3JnZSBQZWFjb2NrJ10KKyAg
ICB9KTsKKyAgCisgICAgb2JqLmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsnV2lsbGlhbSBL
aW5nJywgJ01hcnkgU29tZXJ2aWxsZSddCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgaW50ZXJz
ZWN0CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0
eUtleSoKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5l
dyBhcnJheSB3aXRoIGFsbCB0aGUKKyAgICBkdXBsaWNhdGVkIGVsZW1lbnRzIGZyb20gdGhlIGRl
cGVuZGVudCBhcnJheXMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gaW50ZXJzZWN0
KCkgeworICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5
KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICBhcmdz
W19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgfQorCisgICAgcmV0dXJuIG11bHRpQXJy
YXlNYWNybyhhcmdzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5cykgeworICAgICAgdmFyIF90aGlz
MyA9IHRoaXM7CisKKyAgICAgIHZhciBhcnJheXMgPSBkZXBlbmRlbnRLZXlzLm1hcChmdW5jdGlv
biAoZGVwZW5kZW50S2V5KSB7CisgICAgICAgIHZhciBhcnJheSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldChfdGhpczMsIGRlcGVuZGVudEtleSk7CisKKyAgICAgICAgcmV0dXJuIF9lbWJl
clJ1bnRpbWVVdGlscy5pc0FycmF5KGFycmF5KSA/IGFycmF5IDogW107CisgICAgICB9KTsKKwor
ICAgICAgdmFyIHJlc3VsdHMgPSBhcnJheXMucG9wKCkuZmlsdGVyKGZ1bmN0aW9uIChjYW5kaWRh
dGUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICB2YXIgYXJyYXkgPSBhcnJh
eXNbaV07CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykg
eworICAgICAgICAgICAgaWYgKGFycmF5W2pdID09PSBjYW5kaWRhdGUpIHsKKyAgICAgICAgICAg
ICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRp
dmVfYXJyYXkuQShyZXN1bHRzKTsKKyAgICB9KTsKKyAgfQorCisgIC8qKgorICAgIEEgY29tcHV0
ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKKyAgICBw
cm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0aGF0IGFyZSBub3QgaW4g
dGhlIHNlY29uZAorICAgIGRlcGVuZGVudCBhcnJheS4KKyAgCisgICAgRXhhbXBsZQorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
KyAgICAgIGxpa2VzOiBbJ2JhbmFuYScsICdncmFwZScsICdrYWxlJ10sCisgICAgICB3YW50czog
RW1iZXIuY29tcHV0ZWQuc2V0RGlmZignbGlrZXMnLCAnZnJ1aXRzJykKKyAgICB9KTsKKyAgCisg
ICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAgICBmcnVpdHM6IFsKKyAgICAg
ICAgJ2dyYXBlJywKKyAgICAgICAgJ2thbGUnLAorICAgICAgXQorICAgIH0pOworICAKKyAgICBo
YW1zdGVyLmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEnXQorICAgIGBgYAorICAKKyAgICBAbWV0
aG9kIHNldERpZmYKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9
IHNldEFQcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVydHkKKyAgICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFs
bCB0aGUKKyAgICBpdGVtcyBmcm9tIHRoZSBmaXJzdCBkZXBlbmRlbnQgYXJyYXkgdGhhdCBhcmUg
bm90IGluIHRoZSBzZWNvbmQKKyAgICBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICov
CisKKyAgZnVuY3Rpb24gc2V0RGlmZihzZXRBUHJvcGVydHksIHNldEJQcm9wZXJ0eSkgeworICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAyKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0
YWxFcnJvci5kZWZhdWx0KCdzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkgdHdvIGRlcGVuZGVudCBh
cnJheXMuJyk7CisgICAgfQorCisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0
ZWQoc2V0QVByb3BlcnR5ICsgJy5bXScsIHNldEJQcm9wZXJ0eSArICcuW10nLCBmdW5jdGlvbiAo
KSB7CisgICAgICB2YXIgc2V0QSA9IHRoaXMuZ2V0KHNldEFQcm9wZXJ0eSk7CisgICAgICB2YXIg
c2V0QiA9IHRoaXMuZ2V0KHNldEJQcm9wZXJ0eSk7CisKKyAgICAgIGlmICghX2VtYmVyUnVudGlt
ZVV0aWxzLmlzQXJyYXkoc2V0QSkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0
ZW1OYXRpdmVfYXJyYXkuQSgpOworICAgICAgfQorICAgICAgaWYgKCFfZW1iZXJSdW50aW1lVXRp
bHMuaXNBcnJheShzZXRCKSkgeworICAgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbU5h
dGl2ZV9hcnJheS5BKHNldEEpOworICAgICAgfQorCisgICAgICByZXR1cm4gc2V0QS5maWx0ZXIo
ZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgcmV0dXJuIHNldEIuaW5kZXhPZih4KSA9PT0gLTE7Cisg
ICAgICB9KTsKKyAgICB9KS5yZWFkT25seSgpOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRl
ZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcworICAgIGZvciB0aGUg
cHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnRpZXMuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Cisg
ICAgICBjbG90aGVzOiBFbWJlci5jb21wdXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQnKQorICAg
IH0pOworICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIGhh
bXN0ZXIuZ2V0KCdjbG90aGVzJyk7IC8vIFtudWxsLCBudWxsXQorICAgIGhhbXN0ZXIuc2V0KCdo
YXQnLCAnQ2FtcCBIYXQnKTsKKyAgICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGlydCcp
OworICAgIGhhbXN0ZXIuZ2V0KCdjbG90aGVzJyk7IC8vIFsnQ2FtcCBIYXQnLCAnQ2FtcCBTaGly
dCddCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgY29sbGVjdAorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG1hcHMKKyAgICB2
YWx1ZXMgb2YgYWxsIHBhc3NlZCBpbiBwcm9wZXJ0aWVzIHRvIGFuIGFycmF5LgorICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBjb2xsZWN0KCkgeworICAgIGZvciAodmFyIF9sZW4zID0g
YXJndW1lbnRzLmxlbmd0aCwgZGVwZW5kZW50S2V5cyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAw
OyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7CisgICAgICBkZXBlbmRlbnRLZXlzW19rZXkzXSA9
IGFyZ3VtZW50c1tfa2V5M107CisgICAgfQorCisgICAgcmV0dXJuIG11bHRpQXJyYXlNYWNybyhk
ZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcHJvcGVydGllcyA9IF9lbWJl
ck1ldGFsR2V0X3Byb3BlcnRpZXMuZGVmYXVsdCh0aGlzLCBkZXBlbmRlbnRLZXlzKTsKKyAgICAg
IHZhciByZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIGZv
ciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093
blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1
bHQocHJvcGVydGllc1trZXldKSkgeworICAgICAgICAgICAgcmVzLnB1c2gobnVsbCk7CisgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNba2V5XSk7Cisg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzOworICAgIH0p
OworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEg
bmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVw
ZW5kZW50IGFycmF5IHNvcnRlZCBiYXNlZCBvbiBhIHByb3BlcnR5CisgICAgb3Igc29ydCBmdW5j
dGlvbi4KKyAgCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2
ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1
bmN0aW9uKGl0ZW1BLCBpdGVtQik7CisgICAgYGBgCisgIAorICAgIC0gYGl0ZW1BYCB0aGUgZmly
c3QgaXRlbSB0byBjb21wYXJlLgorICAgIC0gYGl0ZW1CYCB0aGUgc2Vjb25kIGl0ZW0gdG8gY29t
cGFyZS4KKyAgCisgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG5lZ2F0aXZlIG51bWJl
ciAoZS5nLiBgLTFgKSB3aGVuIGBpdGVtQWAgc2hvdWxkIGNvbWUgYmVmb3JlCisgICAgYGl0ZW1C
YC4gSXQgc2hvdWxkIHJldHVybiBwb3NpdGl2ZSBudW1iZXIgKGUuZy4gYDFgKSB3aGVuIGBpdGVt
QWAgc2hvdWxkIGNvbWUgYWZ0ZXIKKyAgICBgaXRlbUJgLiBJZiB0aGUgYGl0ZW1BYCBhbmQgYGl0
ZW1CYCBhcmUgZXF1YWwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGAwYC4KKyAgCisgICAg
VGhlcmVmb3JlLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBhcmluZyBzb21lIG51bWVyaWMgdmFs
dWVzLCBzaW1wbGUgYGl0ZW1BIC0gaXRlbUJgIG9yCisgICAgYGl0ZW1BLmdldCggJ2ZvbycgKSAt
IGl0ZW1CLmdldCggJ2ZvbycgKWAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBzZXJpZXMgb2YgYGlm
YC4KKyAgCisgICAgRXhhbXBsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFRvRG9M
aXN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAvLyB1c2luZyBzdGFuZGFyZCBhc2Nl
bmRpbmcgc29ydAorICAgICAgdG9kb3NTb3J0aW5nOiBbJ25hbWUnXSwKKyAgICAgIHNvcnRlZFRv
ZG9zOiBFbWJlci5jb21wdXRlZC5zb3J0KCd0b2RvcycsICd0b2Rvc1NvcnRpbmcnKSwKKyAgCisg
ICAgICAvLyB1c2luZyBkZXNjZW5kaW5nIHNvcnQKKyAgICAgIHRvZG9zU29ydGluZ0Rlc2M6IFsn
bmFtZTpkZXNjJ10sCisgICAgICBzb3J0ZWRUb2Rvc0Rlc2M6IEVtYmVyLmNvbXB1dGVkLnNvcnQo
J3RvZG9zJywgJ3RvZG9zU29ydGluZ0Rlc2MnKSwKKyAgCisgICAgICAvLyB1c2luZyBhIGN1c3Rv
bSBzb3J0IGZ1bmN0aW9uCisgICAgICBwcmlvcml0eVRvZG9zOiBFbWJlci5jb21wdXRlZC5zb3J0
KCd0b2RvcycsIGZ1bmN0aW9uKGEsIGIpeworICAgICAgICBpZiAoYS5wcmlvcml0eSA+IGIucHJp
b3JpdHkpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhLnByaW9y
aXR5IDwgYi5wcmlvcml0eSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICB2YXIgdG9kb0xp
c3QgPSBUb0RvTGlzdC5jcmVhdGUoe3RvZG9zOiBbCisgICAgICB7IG5hbWU6ICdVbml0IFRlc3Qn
LCBwcmlvcml0eTogMiB9LAorICAgICAgeyBuYW1lOiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5
OiAzIH0sCisgICAgICB7IG5hbWU6ICdSZWxlYXNlJywgcHJpb3JpdHk6IDEgfQorICAgIF19KTsK
KyAgCisgICAgdG9kb0xpc3QuZ2V0KCdzb3J0ZWRUb2RvcycpOyAgICAgIC8vIFt7IG5hbWU6J0Rv
Y3VtZW50YXRpb24nLCBwcmlvcml0eTozIH0sIHsgbmFtZTonUmVsZWFzZScsIHByaW9yaXR5OjEg
fSwgeyBuYW1lOidVbml0IFRlc3QnLCBwcmlvcml0eToyIH1dCisgICAgdG9kb0xpc3QuZ2V0KCdz
b3J0ZWRUb2Rvc0Rlc2MnKTsgIC8vIFt7IG5hbWU6J1VuaXQgVGVzdCcsIHByaW9yaXR5OjIgfSwg
eyBuYW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MSB9LCB7IG5hbWU6J0RvY3VtZW50YXRpb24nLCBw
cmlvcml0eTozIH1dCisgICAgdG9kb0xpc3QuZ2V0KCdwcmlvcml0eVRvZG9zJyk7ICAgIC8vIFt7
IG5hbWU6J1JlbGVhc2UnLCBwcmlvcml0eToxIH0sIHsgbmFtZTonVW5pdCBUZXN0JywgcHJpb3Jp
dHk6MiB9LCB7IG5hbWU6J0RvY3VtZW50YXRpb24nLCBwcmlvcml0eTozIH1dCisgICAgYGBgCisg
IAorICAgIEBtZXRob2Qgc29ydAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0g
e1N0cmluZ30gaXRlbXNLZXkKKyAgICBAcGFyYW0ge1N0cmluZyBvciBGdW5jdGlvbn0gc29ydERl
ZmluaXRpb24gYSBkZXBlbmRlbnQga2V5IHRvIGFuCisgICAgYXJyYXkgb2Ygc29ydCBwcm9wZXJ0
aWVzIChhZGQgYDpkZXNjYCB0byB0aGUgYXJyYXlzIHNvcnQgcHJvcGVydGllcyB0byBzb3J0IGRl
c2NlbmRpbmcpIG9yIGEgZnVuY3Rpb24gdG8gdXNlIHdoZW4gc29ydGluZworICAgIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IHNvcnRlZCBhcnJheSBiYXNl
ZAorICAgIG9uIHRoZSBzb3J0IHByb3BlcnR5IGFycmF5IG9yIGNhbGxiYWNrIGZ1bmN0aW9uCisg
ICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNvcnQoaXRlbXNLZXksIHNvcnREZWZpbml0
aW9uKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLmNvbXB1dGVkLnNvcnQg
cmVxdWlyZXMgdHdvIGFyZ3VtZW50czogYW4gYXJyYXkga2V5IHRvIHNvcnQgYW5kICcgKyAnZWl0
aGVyIGEgc29ydCBwcm9wZXJ0aWVzIGtleSBvciBzb3J0IGZ1bmN0aW9uJywgYXJndW1lbnRzLmxl
bmd0aCA9PT0gMik7CisKKyAgICBpZiAodHlwZW9mIHNvcnREZWZpbml0aW9uID09PSAnZnVuY3Rp
b24nKSB7CisgICAgICByZXR1cm4gY3VzdG9tU29ydChpdGVtc0tleSwgc29ydERlZmluaXRpb24p
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcHJvcGVydHlTb3J0KGl0ZW1zS2V5LCBzb3J0
RGVmaW5pdGlvbik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY3VzdG9tU29ydChpdGVtc0tl
eSwgY29tcGFyYXRvcikgeworICAgIHJldHVybiBhcnJheU1hY3JvKGl0ZW1zS2V5LCBmdW5jdGlv
biAodmFsdWUpIHsKKyAgICAgIHZhciBfdGhpczQgPSB0aGlzOworCisgICAgICByZXR1cm4gdmFs
dWUuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uICh4LCB5KSB7CisgICAgICAgIHJldHVybiBjb21wYXJh
dG9yLmNhbGwoX3RoaXM0LCB4LCB5KTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgLy8g
VGhpcyBvbmUgbmVlZHMgdG8gZHluYW1pY2FsbHkgc2V0IHVwIGFuZCB0ZWFyIGRvd24gb2JzZXJ2
ZXJzIG9uIHRoZSBpdGVtc0tleQorICAvLyBkZXBlbmRpbmcgb24gdGhlIHNvcnRQcm9wZXJ0aWVz
CisgIGZ1bmN0aW9uIHByb3BlcnR5U29ydChpdGVtc0tleSwgc29ydFByb3BlcnRpZXNLZXkpIHsK
KyAgICB2YXIgY3AgPSBuZXcgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFByb3BlcnR5KGZ1
bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBfdGhpczUgPSB0aGlzOworCisgICAgICB2YXIgaXRl
bXNLZXlJc0F0VGhpcyA9IGl0ZW1zS2V5ID09PSAnQHRoaXMnOworICAgICAgdmFyIHNvcnRQcm9w
ZXJ0aWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIHNvcnRQcm9wZXJ0aWVz
S2V5KTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBzb3J0IGRlZmluaXRp
b24gZm9yIFwnJyArIGtleSArICdcJyBvbiAnICsgdGhpcyArICcgbXVzdCBiZSBhIGZ1bmN0aW9u
IG9yIGFuIGFycmF5IG9mIHN0cmluZ3MnLCBfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShzb3J0
UHJvcGVydGllcykgJiYgc29ydFByb3BlcnRpZXMuZXZlcnkoZnVuY3Rpb24gKHMpIHsKKyAgICAg
ICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJzsKKyAgICAgIH0pKTsKKworICAgICAgdmFy
IG5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcyA9IG5vcm1hbGl6ZVNvcnRQcm9wZXJ0aWVzKHNvcnRQ
cm9wZXJ0aWVzKTsKKworICAgICAgLy8gQWRkL3JlbW92ZSBwcm9wZXJ0eSBvYnNlcnZlcnMgYXMg
cmVxdWlyZWQuCisgICAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzTWFwID0gY3AuX2FjdGl2ZU9ic2Vy
dmVyTWFwIHx8IChjcC5fYWN0aXZlT2JzZXJ2ZXJNYXAgPSBuZXcgX2VtYmVyTWV0YWxXZWFrX21h
cC5kZWZhdWx0KCkpOworICAgICAgdmFyIGFjdGl2ZU9ic2VydmVycyA9IGFjdGl2ZU9ic2VydmVy
c01hcC5nZXQodGhpcyk7CisKKyAgICAgIGlmIChhY3RpdmVPYnNlcnZlcnMpIHsKKyAgICAgICAg
YWN0aXZlT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gKGFyZ3MpIHsKKyAgICAgICAgICBfZW1i
ZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2VydmVyLmFwcGx5KG51bGwsIGFyZ3MpOworICAgICAg
ICB9KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc29ydFByb3BlcnR5RGlkQ2hhbmdlKCkg
eworICAgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKGtleSk7CisgICAgICB9CisKKyAg
ICAgIGFjdGl2ZU9ic2VydmVycyA9IG5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcy5tYXAoZnVuY3Rp
b24gKF9yZWYpIHsKKyAgICAgICAgdmFyIHByb3AgPSBfcmVmWzBdOworCisgICAgICAgIHZhciBw
YXRoID0gaXRlbXNLZXlJc0F0VGhpcyA/ICdAZWFjaC4nICsgcHJvcCA6IGl0ZW1zS2V5ICsgJy5A
ZWFjaC4nICsgcHJvcDsKKyAgICAgICAgdmFyIGFyZ3MgPSBbX3RoaXM1LCBwYXRoLCBzb3J0UHJv
cGVydHlEaWRDaGFuZ2VdOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVy
LmFwcGx5KG51bGwsIGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICAgIH0pOworCisg
ICAgICBhY3RpdmVPYnNlcnZlcnNNYXAuc2V0KHRoaXMsIGFjdGl2ZU9ic2VydmVycyk7CisKKyAg
ICAgIC8vIFNvcnQgYW5kIHJldHVybiB0aGUgYXJyYXkuCisgICAgICB2YXIgaXRlbXMgPSBpdGVt
c0tleUlzQXRUaGlzID8gdGhpcyA6IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBp
dGVtc0tleSk7CisKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShpdGVtcykp
IHsKKyAgICAgICAgcmV0dXJuIHNvcnRCeU5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcyhpdGVtcywg
bm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIH0KKyAgICB9KTsK
KworICAgIGNwLl9hY3RpdmVPYnNlcnZlck1hcCA9IHVuZGVmaW5lZDsKKworICAgIHJldHVybiBj
cC5wcm9wZXJ0eShzb3J0UHJvcGVydGllc0tleSArICcuW10nKS5yZWFkT25seSgpOworICB9CisK
KyAgZnVuY3Rpb24gbm9ybWFsaXplU29ydFByb3BlcnRpZXMoc29ydFByb3BlcnRpZXMpIHsKKyAg
ICByZXR1cm4gc29ydFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwKSB7CisgICAgICB2YXIgX3Ak
c3BsaXQgPSBwLnNwbGl0KCc6Jyk7CisKKyAgICAgIHZhciBwcm9wID0gX3Akc3BsaXRbMF07Cisg
ICAgICB2YXIgZGlyZWN0aW9uID0gX3Akc3BsaXRbMV07CisKKyAgICAgIGRpcmVjdGlvbiA9IGRp
cmVjdGlvbiB8fCAnYXNjJzsKKworICAgICAgcmV0dXJuIFtwcm9wLCBkaXJlY3Rpb25dOworICAg
IH0pOworICB9CisKKyAgZnVuY3Rpb24gc29ydEJ5Tm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzKGl0
ZW1zLCBub3JtYWxpemVkU29ydFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gX2VtYmVyUnVudGlt
ZVN5c3RlbU5hdGl2ZV9hcnJheS5BKGl0ZW1zLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoaXRlbUEs
IGl0ZW1CKSB7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vcm1hbGl6ZWRTb3J0UHJvcGVy
dGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgX25vcm1hbGl6ZWRTb3J0UHJvcGVydGll
cyRpID0gbm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzW2ldOworICAgICAgICB2YXIgcHJvcCA9IF9u
b3JtYWxpemVkU29ydFByb3BlcnRpZXMkaVswXTsKKyAgICAgICAgdmFyIGRpcmVjdGlvbiA9IF9u
b3JtYWxpemVkU29ydFByb3BlcnRpZXMkaVsxXTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gX2Vt
YmVyUnVudGltZUNvbXBhcmUuZGVmYXVsdChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRl
bUEsIHByb3ApLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbUIsIHByb3ApKTsKKyAg
ICAgICAgaWYgKHJlc3VsdCAhPT0gMCkgeworICAgICAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09
ICdkZXNjJyA/IC0xICogcmVzdWx0IDogcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisKKyAg
ICAgIHJldHVybiAwOworICAgIH0pKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUv
Y29udHJvbGxlcnMvY29udHJvbGxlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1Zycs
ICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29u
dHJvbGxlcicsICdlbWJlci1ydW50aW1lL2luamVjdCcsICdlbWJlci1ydW50aW1lL21peGlucy9h
Y3Rpb25faGFuZGxlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2Vt
YmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVyUnVudGltZU1peGluc0NvbnRyb2xsZXIsIF9l
bWJlclJ1bnRpbWVJbmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlcikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCisgICovCisKKyAgLyoqCisgICAgQGNsYXNzIENvbnRyb2xsZXIKKyAgICBA
bmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAgQHVzZXMgRW1i
ZXIuQ29udHJvbGxlck1peGluCisgICAgQHB1YmxpYworICAqLworICB2YXIgQ29udHJvbGxlciA9
IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1p
eGluc0NvbnRyb2xsZXIuZGVmYXVsdCk7CisKKyAgX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9o
YW5kbGVyLmRlcHJlY2F0ZVVuZGVyc2NvcmVBY3Rpb25zKENvbnRyb2xsZXIpOworCisgIGZ1bmN0
aW9uIGNvbnRyb2xsZXJJbmplY3Rpb25IZWxwZXIoZmFjdG9yeSkgeworICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdEZWZpbmluZyBhbiBpbmplY3RlZCBjb250cm9sbGVyIHByb3BlcnR5IG9u
IGEgJyArICdub24tY29udHJvbGxlciBpcyBub3QgYWxsb3dlZC4nLCBfZW1iZXJSdW50aW1lTWl4
aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdChmYWN0b3J5LlByb3RvdHlwZU1peGluKSk7Cisg
IH0KKworICAvKioKKyAgICBDcmVhdGVzIGEgcHJvcGVydHkgdGhhdCBsYXppbHkgbG9va3MgdXAg
YW5vdGhlciBjb250cm9sbGVyIGluIHRoZSBjb250YWluZXIuCisgICAgQ2FuIG9ubHkgYmUgdXNl
ZCB3aGVuIGRlZmluaW5nIGFub3RoZXIgY29udHJvbGxlci4KKyAgCisgICAgRXhhbXBsZToKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Qb3N0Q29udHJvbGxlciA9IEVtYmVyLkNvbnRy
b2xsZXIuZXh0ZW5kKHsKKyAgICAgIHBvc3RzOiBFbWJlci5pbmplY3QuY29udHJvbGxlcigpCisg
ICAgfSk7CisgICAgYGBgCisgIAorICAgIFRoaXMgZXhhbXBsZSB3aWxsIGNyZWF0ZSBhIGBwb3N0
c2AgcHJvcGVydHkgb24gdGhlIGBwb3N0YCBjb250cm9sbGVyIHRoYXQKKyAgICBsb29rcyB1cCB0
aGUgYHBvc3RzYCBjb250cm9sbGVyIGluIHRoZSBjb250YWluZXIsIG1ha2luZyBpdCBlYXN5IHRv
CisgICAgcmVmZXJlbmNlIG90aGVyIGNvbnRyb2xsZXJzLiBUaGlzIGlzIGZ1bmN0aW9uYWxseSBl
cXVpdmFsZW50IHRvOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBvc3RDb250cm9s
bGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgbmVlZHM6ICdwb3N0cycsCisg
ICAgICBwb3N0czogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXJzLnBvc3RzJykKKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjb250cm9sbGVyCisgICAgQHNpbmNlIDEu
MTAuMAorICAgIEBmb3IgRW1iZXIuaW5qZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgKG9w
dGlvbmFsKSBuYW1lIG9mIHRoZSBjb250cm9sbGVyIHRvIGluamVjdCwgZGVmYXVsdHMKKyAgICAg
ICAgICAgdG8gdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEByZXR1cm4ge0VtYmVyLkluamVjdGVk
UHJvcGVydHl9IGluamVjdGlvbiBkZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYworICAq
LworICBfZW1iZXJSdW50aW1lSW5qZWN0LmNyZWF0ZUluamVjdGlvbkhlbHBlcignY29udHJvbGxl
cicsIGNvbnRyb2xsZXJJbmplY3Rpb25IZWxwZXIpOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IENv
bnRyb2xsZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9jb3B5JywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJl
ci1ydW50aW1lL21peGlucy9jb3B5YWJsZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxEZWJ1ZywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVyUnVudGltZU1peGluc0Nv
cHlhYmxlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjb3B5Owor
CisgIGZ1bmN0aW9uIF9jb3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7CisgICAgdmFyIHJl
dCwgbG9jLCBrZXk7CisKKyAgICAvLyBwcmltaXRpdmUgZGF0YSB0eXBlcyBhcmUgaW1tdXRhYmxl
LCBqdXN0IHJldHVybiB0aGVtLgorICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBv
YmogPT09IG51bGwpIHsKKyAgICAgIHJldHVybiBvYmo7CisgICAgfQorCisgICAgLy8gYXZvaWQg
Y3ljbGljYWwgbG9vcHMKKyAgICBpZiAoZGVlcCAmJiAobG9jID0gc2Vlbi5pbmRleE9mKG9iaikp
ID49IDApIHsKKyAgICAgIHJldHVybiBjb3BpZXNbbG9jXTsKKyAgICB9CisKKyAgICBfZW1iZXJN
ZXRhbERlYnVnLmFzc2VydCgnQ2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0aGF0IGRvZXMg
bm90IGltcGxlbWVudCBFbWJlci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2YgX2VtYmVyUnVu
dGltZVN5c3RlbU9iamVjdC5kZWZhdWx0KSB8fCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUu
ZGVmYXVsdCAmJiBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdC5kZXRlY3Qob2Jq
KSk7CisKKyAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVjdCBh
IG5hdGl2ZSBhcnJheSBvbmx5LiBBbnkgb3RoZXIKKyAgICAvLyBvYmplY3Qgd2lsbCBuZWVkIHRv
IGltcGxlbWVudCBDb3B5YWJsZS4KKyAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CisgICAg
ICByZXQgPSBvYmouc2xpY2UoKTsKKworICAgICAgaWYgKGRlZXApIHsKKyAgICAgICAgbG9jID0g
cmV0Lmxlbmd0aDsKKworICAgICAgICB3aGlsZSAoLS1sb2MgPj0gMCkgeworICAgICAgICAgIHJl
dFtsb2NdID0gX2NvcHkocmV0W2xvY10sIGRlZXAsIHNlZW4sIGNvcGllcyk7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKF9lbWJlclJ1bnRpbWVNaXhpbnNDb3B5YWJsZS5kZWZh
dWx0ICYmIF9lbWJlclJ1bnRpbWVNaXhpbnNDb3B5YWJsZS5kZWZhdWx0LmRldGVjdChvYmopKSB7
CisgICAgICByZXQgPSBvYmouY29weShkZWVwLCBzZWVuLCBjb3BpZXMpOworICAgIH0gZWxzZSBp
ZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgcmV0ID0gbmV3IERhdGUob2JqLmdldFRp
bWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IHt9OworCisgICAgICBmb3IgKGtleSBp
biBvYmopIHsKKyAgICAgICAgLy8gc3VwcG9ydCBOdWxsIHByb3RvdHlwZQorICAgICAgICBpZiAo
IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsKKyAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXZlbnRzIGJyb3dzZXJz
IHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCisgICAgICAgIC8vIGNv
cHlpbmcgaW50ZXJuYWwgRW1iZXIgcHJvcGVydGllcworICAgICAgICBpZiAoa2V5LnN1YnN0cmlu
ZygwLCAyKSA9PT0gJ19fJykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAg
ICAgICAgcmV0W2tleV0gPSBkZWVwID8gX2NvcHkob2JqW2tleV0sIGRlZXAsIHNlZW4sIGNvcGll
cykgOiBvYmpba2V5XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVlcCkgeworICAgICAg
c2Vlbi5wdXNoKG9iaik7CisgICAgICBjb3BpZXMucHVzaChyZXQpOworICAgIH0KKworICAgIHJl
dHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIHRo
ZSBwYXNzZWQgb2JqZWN0LiBBIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IGlzCisgICAgcmV0dXJu
ZWQgaWYgdGhlIG9wdGlvbmFsIGBkZWVwYCBhcmd1bWVudCBpcyBgdHJ1ZWAuCisgIAorICAgIElm
IHRoZSBwYXNzZWQgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBFbWJlci5Db3B5YWJsZWAgaW50ZXJm
YWNlLCB0aGVuIHRoaXMKKyAgICBmdW5jdGlvbiB3aWxsIGRlbGVnYXRlIHRvIHRoZSBvYmplY3Qn
cyBgY29weSgpYCBtZXRob2QgYW5kIHJldHVybiB0aGUKKyAgICByZXN1bHQuIFNlZSBgRW1iZXIu
Q29weWFibGVgIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgIAorICAgIEZvciBwcmltaXRpdmUgdmFs
dWVzICh3aGljaCBhcmUgaW1tdXRhYmxlIGluIEphdmFTY3JpcHQpLCB0aGUgcGFzc2VkIG9iamVj
dAorICAgIGlzIHNpbXBseSByZXR1cm5lZC4KKyAgCisgICAgQG1ldGhvZCBjb3B5CisgICAgQGZv
ciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZQorICAg
IEBwYXJhbSB7Qm9vbGVhbn0gW2RlZXA9ZmFsc2VdIElmIHRydWUsIGEgZGVlcCBjb3B5IG9mIHRo
ZSBvYmplY3QgaXMgbWFkZS4KKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBjb3BpZWQgb2JqZWN0
CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvcHkob2JqLCBkZWVwKSB7CisgICAg
Ly8gZmFzdCBwYXRocworICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmogPT09
IG51bGwpIHsKKyAgICAgIHJldHVybiBvYmo7IC8vIGNhbid0IGNvcHkgcHJpbWl0aXZlcworICAg
IH0KKworICAgIGlmIChfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdCAmJiBfZW1i
ZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdC5kZXRlY3Qob2JqKSkgeworICAgICAgcmV0
dXJuIG9iai5jb3B5KGRlZXApOworICAgIH0KKworICAgIHJldHVybiBfY29weShvYmosIGRlZXAs
IGRlZXAgPyBbXSA6IG51bGwsIGRlZXAgPyBbXSA6IG51bGwpOworICB9Cit9KTsKK2VuaWZlZCgi
ZW1iZXItcnVudGltZS9jb3JlIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
ICJ1c2Ugc3RyaWN0IjsKK30pOworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVy
LXJ1bnRpbWUKKyovCitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvZXh0L2Z1bmN0aW9uJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2Vt
YmVyTWV0YWxNaXhpbikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIGFfc2xpY2UgPSBB
cnJheS5wcm90b3R5cGUuc2xpY2U7CisgIHZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9u
LnByb3RvdHlwZTsKKworICBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRVhURU5EX1BST1RP
VFlQRVMgPT09IHRydWUgfHwgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRVhURU5EX1BST1RPVFlQ
RVMuRnVuY3Rpb24pIHsKKyAgICAvKioKKyAgICAgIFRoZSBgcHJvcGVydHlgIGV4dGVuc2lvbiBv
ZiBKYXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzIGF2YWlsYWJsZQorICAgICAgd2hl
biBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5G
dW5jdGlvbmAgaXMKKyAgICAgIGB0cnVlYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAg
Q29tcHV0ZWQgcHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJlYXQgYSBmdW5jdGlvbiBsaWtlIGEg
cHJvcGVydHk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgTXlBcHAuUHJlc2lkZW50ID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIGZpcnN0TmFtZTogJycsCisgICAgICAgIGxh
c3ROYW1lOiAgJycsCisgICAgICAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAgICAg
cmV0dXJuIHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSArICcgJyArIHRoaXMuZ2V0KCdsYXN0TmFtZScp
OworICAgICAgICB9LnByb3BlcnR5KCkgLy8gQ2FsbCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVu
Y3Rpb24gYXMgYSBwcm9wZXJ0eQorICAgICAgfSk7CisgICAgICAgdmFyIHByZXNpZGVudCA9IE15
QXBwLlByZXNpZGVudC5jcmVhdGUoeworICAgICAgICBmaXJzdE5hbWU6ICdCYXJhY2snLAorICAg
ICAgICBsYXN0TmFtZTogJ09iYW1hJworICAgICAgfSk7CisgICAgICAgcHJlc2lkZW50LmdldCgn
ZnVsbE5hbWUnKTsgLy8gJ0JhcmFjayBPYmFtYScKKyAgICAgIGBgYAorICAgICAgIFRyZWF0aW5n
IGEgZnVuY3Rpb24gbGlrZSBhIHByb3BlcnR5IGlzIHVzZWZ1bCBiZWNhdXNlIHRoZXkgY2FuIHdv
cmsgd2l0aAorICAgICAgYmluZGluZ3MsIGp1c3QgbGlrZSBhbnkgb3RoZXIgcHJvcGVydHkuCisg
ICAgICAgTWFueSBjb21wdXRlZCBwcm9wZXJ0aWVzIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG90aGVy
IHByb3BlcnRpZXMuIEZvcgorICAgICAgZXhhbXBsZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRo
ZSBgZnVsbE5hbWVgIHByb3BlcnR5IGRlcGVuZHMgb24KKyAgICAgIGBmaXJzdE5hbWVgIGFuZCBg
bGFzdE5hbWVgIHRvIGRldGVybWluZSBpdHMgdmFsdWUuIFlvdSBjYW4gdGVsbCBFbWJlcgorICAg
ICAgYWJvdXQgdGhlc2UgZGVwZW5kZW5jaWVzIGxpa2UgdGhpczoKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBNeUFwcC5QcmVzaWRlbnQgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAg
ICAgZmlyc3ROYW1lOiAnJywKKyAgICAgICAgbGFzdE5hbWU6ICAnJywKKyAgICAgICAgIGZ1bGxO
YW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScp
ICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisgICAgICAgICAgIC8vIFRlbGwgRW1iZXIu
anMgdGhhdCB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGRlcGVuZHMgb24gZmlyc3ROYW1lCisgICAg
ICAgICAgLy8gYW5kIGxhc3ROYW1lCisgICAgICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICds
YXN0TmFtZScpCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIE1ha2Ugc3VyZSB5b3UgbGlz
dCB0aGVzZSBkZXBlbmRlbmNpZXMgc28gRW1iZXIga25vd3Mgd2hlbiB0byB1cGRhdGUKKyAgICAg
IGJpbmRpbmdzIHRoYXQgY29ubmVjdCB0byBhIGNvbXB1dGVkIHByb3BlcnR5LiBDaGFuZ2luZyBh
IGRlcGVuZGVuY3kKKyAgICAgIHdpbGwgbm90IGltbWVkaWF0ZWx5IHRyaWdnZXIgYW4gdXBkYXRl
IG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSwgYnV0CisgICAgICB3aWxsIGluc3RlYWQgY2xlYXIg
dGhlIGNhY2hlIHNvIHRoYXQgaXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBuZXh0IGBnZXRgCisgICAg
ICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5LgorICAgICAgIFNlZSBbRW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eV0oL2FwaS9jbGFzc2VzL0VtYmVyLkNvbXB1dGVkUHJvcGVydHkuaHRtbCksIFtFbWJl
ci5jb21wdXRlZF0oL2FwaS9jbGFzc2VzL0VtYmVyLmNvbXB1dGVkLmh0bWwpLgorICAgICAgIEBt
ZXRob2QgcHJvcGVydHkKKyAgICAgIEBmb3IgRnVuY3Rpb24KKyAgICAgIEBwdWJsaWMKKyAgICAq
LworICAgIEZ1bmN0aW9uUHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24gKCkgeworICAgICAg
dmFyIHJldCA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQodGhpcyk7CisgICAgICAvLyBD
b21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5wcm9wZXJ0eSBleHBhbmRzIHByb3BlcnRpZXM7IG5v
IG5lZWQgZm9yIHVzIHRvCisgICAgICAvLyBkbyBzbyBoZXJlLgorICAgICAgcmV0dXJuIHJldC5w
cm9wZXJ0eS5hcHBseShyZXQsIGFyZ3VtZW50cyk7CisgICAgfTsKKworICAgIC8qKgorICAgICAg
VGhlIGBvYnNlcnZlc2AgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5
cGUgaXMgYXZhaWxhYmxlCisgICAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3Ig
YEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcworICAgICAgdHJ1ZSwgd2hpY2gg
aXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMg
c2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAorICAgICAgY2FsbCB0byB0aGUgZW5kIG9m
IHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgorICAg
ICAgRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICAg
IC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICAg
ICAgfS5vYnNlcnZlcygndmFsdWUnKQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJbiB0
aGUgZnV0dXJlIHRoaXMgbWV0aG9kIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLgorICAgICAgIFNl
ZSBgRW1iZXIub2JzZXJ2ZXJgLgorICAgICAgIEBtZXRob2Qgb2JzZXJ2ZXMKKyAgICAgIEBmb3Ig
RnVuY3Rpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIEZ1bmN0aW9uUHJvdG90eXBlLm9i
c2VydmVzID0gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5s
ZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5Kysp
IHsKKyAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAgIH0KKworICAg
ICAgYXJncy5wdXNoKHRoaXMpOworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2
ZXIuYXBwbHkodGhpcywgYXJncyk7CisgICAgfTsKKworICAgIEZ1bmN0aW9uUHJvdG90eXBlLl9v
YnNlcnZlc0ltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ0ltbWVkaWF0ZSBvYnNlcnZlcnMgbXVzdCBvYnNlcnZlIGludGVybmFsIHByb3Bl
cnRpZXMgb25seSwgJyArICdub3QgcHJvcGVydGllcyBvbiBvdGhlciBvYmplY3RzLicsIGZ1bmN0
aW9uIGNoZWNrSXNJbnRlcm5hbFByb3BlcnR5KCkgeworICAgICAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICBpZiAoYXJndW1l
bnRzW2ldLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KTsK
KworICAgICAgLy8gb2JzZXJ2ZXMgaGFuZGxlcyBwcm9wZXJ0eSBleHBhbnNpb24KKyAgICAgIHJl
dHVybiB0aGlzLm9ic2VydmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICAv
KioKKyAgICAgIFRoZSBgb2JzZXJ2ZXNJbW1lZGlhdGVseWAgZXh0ZW5zaW9uIG9mIEphdmFzY3Jp
cHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMKKyAgICAgIGF2YWlsYWJsZSB3aGVuIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFU2Agb3IKKyAgICAgIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5j
dGlvbmAgaXMgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBvYnNl
cnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzSW1tZWRp
YXRlbHlgCisgICAgICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25z
IGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCisgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgICAgdmFsdWVP
YnNlcnZlcjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgLy8gRXhlY3V0ZXMgaW1tZWRpYXRlbHkg
YWZ0ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcworICAgICAgICB9Lm9ic2VydmVzSW1t
ZWRpYXRlbHkoJ3ZhbHVlJykKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSW4gdGhlIGZ1
dHVyZSwgYG9ic2VydmVzYCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4gSW4gdGhpcyBldmVudCwK
KyAgICAgIGBvYnNlcnZlc0ltbWVkaWF0ZWx5YCB3aWxsIG1haW50YWluIHRoZSBzeW5jaHJvbm91
cyBiZWhhdmlvci4KKyAgICAgICBTZWUgYEVtYmVyLmltbWVkaWF0ZU9ic2VydmVyYC4KKyAgICAg
ICBAbWV0aG9kIG9ic2VydmVzSW1tZWRpYXRlbHkKKyAgICAgIEBmb3IgRnVuY3Rpb24KKyAgICAg
IEBkZXByZWNhdGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgRnVuY3Rpb25Qcm90b3R5
cGUub2JzZXJ2ZXNJbW1lZGlhdGVseSA9IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlRnVuYygn
RnVuY3Rpb24jb2JzZXJ2ZXNJbW1lZGlhdGVseSBpcyBkZXByZWNhdGVkLiBVc2UgRnVuY3Rpb24j
b2JzZXJ2ZXMgaW5zdGVhZCcsIHsgaWQ6ICdlbWJlci1ydW50aW1lLmV4dC1mdW5jdGlvbicsIHVu
dGlsOiAnMy4wLjAnIH0sIEZ1bmN0aW9uUHJvdG90eXBlLl9vYnNlcnZlc0ltbWVkaWF0ZWx5KTsK
KworICAgIC8qKgorICAgICAgVGhlIGBvbmAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5j
dGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCisgICAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJP
VE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcworICAgICAg
dHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBsaXN0ZW4gZm9yIGV2
ZW50cyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb25gIGNhbGwgdG8gdGhlIGVuZCBvZgorICAgICAg
eW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgb3IgbWl4aW5zIHRoYXQgeW91IHdy
aXRlLiBGb3IgZXhhbXBsZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5NaXhp
bi5jcmVhdGUoeworICAgICAgICBkb1NvbWV0aGluZ1dpdGhFbGVtZW50OiBmdW5jdGlvbigpIHsK
KyAgICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgImRpZEluc2VydEVsZW1lbnQiIGV2
ZW50IGZpcmVzCisgICAgICAgIH0ub24oJ2RpZEluc2VydEVsZW1lbnQnKQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBTZWUgYEVtYmVyLm9uYC4KKyAgICAgICBAbWV0aG9kIG9uCisgICAg
ICBAZm9yIEZ1bmN0aW9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBGdW5jdGlvblByb3Rv
dHlwZS5vbiA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBldmVudHMgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX19lbWJlcl9saXN0ZW5zX18gPSBldmVudHM7CisKKyAg
ICAgIHJldHVybiB0aGlzOworICAgIH07CisgIH0KK30pOworLy8gRW1iZXIuRVhURU5EX1BST1RP
VFlQRVMKK2VuaWZlZCgnZW1iZXItcnVudGltZS9leHQvcnN2cCcsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbC9jb3JlJywgJ3JlcXVpcmUnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL3J1bl9sb29wJywgJ3JzdnAnXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX3JlcXVpcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJl
ck1ldGFsTG9nZ2VyLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfcnN2cCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5vbmVycm9yRGVmYXVsdCA9IG9uZXJyb3JEZWZhdWx0OworICBleHBv
cnRzLmFmdGVyID0gYWZ0ZXI7CisKKyAgdmFyIHRlc3RNb2R1bGVOYW1lID0gJ2VtYmVyLXRlc3Rp
bmcvdGVzdCc7CisgIHZhciBUZXN0OworCisgIHZhciBhc3luY1N0YXJ0ID0gZnVuY3Rpb24gKCkg
eworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0ICYmIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LlRlc3QuYWRhcHRlcikgeworICAgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
VGVzdC5hZGFwdGVyLmFzeW5jU3RhcnQoKTsKKyAgICB9CisgIH07CisKKyAgdmFyIGFzeW5jRW5k
ID0gZnVuY3Rpb24gKCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0ICYm
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlRlc3QuYWRhcHRlcikgeworICAgICAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQuVGVzdC5hZGFwdGVyLmFzeW5jRW5kKCk7CisgICAgfQorICB9OworCisg
IF9yc3ZwLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlvbiAoY2FsbGJhY2ssIHByb21pc2UpIHsK
KyAgICB2YXIgYXN5bmMgPSAhX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmN1cnJlbnRSdW5M
b29wOworCisgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRlc3RpbmcgJiYgYXN5bmMp
IHsKKyAgICAgIGFzeW5jU3RhcnQoKTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbFJ1bl9sb29w
LmRlZmF1bHQuYmFja2J1cm5lci5zY2hlZHVsZSgnYWN0aW9ucycsIGZ1bmN0aW9uICgpIHsKKyAg
ICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC50ZXN0aW5nICYmIGFzeW5jKSB7CisgICAg
ICAgIGFzeW5jRW5kKCk7CisgICAgICB9CisgICAgICBjYWxsYmFjayhwcm9taXNlKTsKKyAgICB9
KTsKKyAgfSk7CisKKyAgZnVuY3Rpb24gb25lcnJvckRlZmF1bHQocmVhc29uKSB7CisgICAgdmFy
IGVycm9yOworCisgICAgaWYgKHJlYXNvbiAmJiByZWFzb24uZXJyb3JUaHJvd24pIHsKKyAgICAg
IC8vIGpxWEhSIHByb3ZpZGVzIHRoaXMKKyAgICAgIGVycm9yID0gcmVhc29uLmVycm9yVGhyb3du
OworICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgZXJyb3Ig
PSBuZXcgRXJyb3IoZXJyb3IpOworICAgICAgfQorICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5
KGVycm9yLCAnX19yZWFzb25fd2l0aF9lcnJvcl90aHJvd25fXycsIHsKKyAgICAgICAgdmFsdWU6
IHJlYXNvbiwKKyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UKKyAgICAgIH0pOworICAgIH0gZWxz
ZSB7CisgICAgICBlcnJvciA9IHJlYXNvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IgJiYgZXJy
b3IubmFtZSA9PT0gJ1VucmVjb2duaXplZFVSTEVycm9yJykgeworICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ1RoZSBVUkwgXCcnICsgZXJyb3IubWVzc2FnZSArICdcJyBkaWQgbm90IG1h
dGNoIGFueSByb3V0ZXMgaW4geW91ciBhcHBsaWNhdGlvbicsIGZhbHNlKTsKKyAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IgJiYgZXJyb3IubmFtZSAhPT0gJ1RyYW5zaXRpb25B
Ym9ydGVkJykgeworICAgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRlc3RpbmcpIHsK
KyAgICAgICAgLy8gRVM2VE9ETzogcmVtb3ZlIHdoZW4gcG9zc2libGUKKyAgICAgICAgaWYgKCFU
ZXN0ICYmIF9yZXF1aXJlLmhhcyh0ZXN0TW9kdWxlTmFtZSkpIHsKKyAgICAgICAgICBUZXN0ID0g
X3JlcXVpcmUuZGVmYXVsdCh0ZXN0TW9kdWxlTmFtZSlbJ2RlZmF1bHQnXTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChUZXN0ICYmIFRlc3QuYWRhcHRlcikgeworICAgICAgICAgIFRlc3QuYWRh
cHRlci5leGNlcHRpb24oZXJyb3IpOworICAgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1
bHQuZXJyb3IoZXJyb3Iuc3RhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93
IGVycm9yOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0Lm9uZXJyb3IpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQub25lcnJvcihl
cnJvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0
LmVycm9yKGVycm9yLnN0YWNrKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBh
ZnRlcihjYikgeworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZShfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQucXVldWVzW19lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVs
dC5xdWV1ZXMubGVuZ3RoIC0gMV0sIGNiKTsKKyAgfQorCisgIF9yc3ZwLm9uKCdlcnJvcicsIG9u
ZXJyb3JEZWZhdWx0KTsKKyAgX3JzdnAuY29uZmlndXJlKCdhZnRlcicsIGFmdGVyKTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBfcnN2cDsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL2V4dC9z
dHJpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1ydW50aW1lL3N5
c3RlbS9zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFN0cmlu
Z1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7CisKKyAgaWYgKF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVYVEVORF9QUk9UT1RZUEVTLlN0cmluZykgeworICAgIC8qKgorICAgICAgU2VlIFtFbWJl
ci5TdHJpbmcuZm10XSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2ZtdCku
CisgICAgICAgQG1ldGhvZCBmbXQKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQor
ICAgICAgQGRlcHJlY2F0ZWQKKyAgICAqLworICAgIFN0cmluZ1Byb3RvdHlwZS5mbXQgPSBmdW5j
dGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9
IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBh
cmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZXR1cm4gX2Vt
YmVyUnVudGltZVN5c3RlbVN0cmluZy5mbXQodGhpcywgYXJncyk7CisgICAgfTsKKworICAgIC8q
KgorICAgICAgU2VlIFtFbWJlci5TdHJpbmcud10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5o
dG1sI21ldGhvZF93KS4KKyAgICAgICBAbWV0aG9kIHcKKyAgICAgIEBmb3IgU3RyaW5nCisgICAg
ICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLncgPSBmdW5jdGlvbiAoKSB7
CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy53KHRoaXMpOworICAgIH07
CisKKyAgICAvKioKKyAgICAgIFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9jbGFzc2VzL0Vt
YmVyLlN0cmluZy5odG1sI21ldGhvZF9sb2MpLgorICAgICAgIEBtZXRob2QgbG9jCisgICAgICBA
Zm9yIFN0cmluZworICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIFN0cmluZ1Byb3RvdHlwZS5s
b2MgPSBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIr
KykgeworICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgICB9CisK
KyAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmxvYyh0aGlzLCBhcmdzKTsK
KyAgICB9OworCisgICAgLyoqCisgICAgICBTZWUgW0VtYmVyLlN0cmluZy5jYW1lbGl6ZV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYW1lbGl6ZSkuCisgICAgICAgQG1l
dGhvZCBjYW1lbGl6ZQorICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8K
KyAgICBTdHJpbmdQcm90b3R5cGUuY2FtZWxpemUgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jYW1lbGl6ZSh0aGlzKTsKKyAgICB9OworCisg
ICAgLyoqCisgICAgICBTZWUgW0VtYmVyLlN0cmluZy5kZWNhbWVsaXplXSgvYXBpL2NsYXNzZXMv
RW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2RlY2FtZWxpemUpLgorICAgICAgIEBtZXRob2QgZGVj
YW1lbGl6ZQorICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBT
dHJpbmdQcm90b3R5cGUuZGVjYW1lbGl6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBf
ZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRlY2FtZWxpemUodGhpcyk7CisgICAgfTsKKworICAg
IC8qKgorICAgICAgU2VlIFtFbWJlci5TdHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rhc2hlcml6ZSkuCisgICAgICAgQG1ldGhvZCBkYXNoZXJp
emUKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5n
UHJvdG90eXBlLmRhc2hlcml6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJS
dW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZSh0aGlzKTsKKyAgICB9OworCisgICAgLyoqCisg
ICAgICBTZWUgW0VtYmVyLlN0cmluZy51bmRlcnNjb3JlXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3Ry
aW5nLmh0bWwjbWV0aG9kX3VuZGVyc2NvcmUpLgorICAgICAgIEBtZXRob2QgdW5kZXJzY29yZQor
ICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBTdHJpbmdQcm90
b3R5cGUudW5kZXJzY29yZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSdW50
aW1lU3lzdGVtU3RyaW5nLnVuZGVyc2NvcmUodGhpcyk7CisgICAgfTsKKworICAgIC8qKgorICAg
ICAgU2VlIFtFbWJlci5TdHJpbmcuY2xhc3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcu
aHRtbCNtZXRob2RfY2xhc3NpZnkpLgorICAgICAgIEBtZXRob2QgY2xhc3NpZnkKKyAgICAgIEBm
b3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLmNs
YXNzaWZ5ID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1T
dHJpbmcuY2xhc3NpZnkodGhpcyk7CisgICAgfTsKKworICAgIC8qKgorICAgICAgU2VlIFtFbWJl
ci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhv
ZF9jYXBpdGFsaXplKS4KKyAgICAgICBAbWV0aG9kIGNhcGl0YWxpemUKKyAgICAgIEBmb3IgU3Ry
aW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLmNhcGl0YWxp
emUgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmlu
Zy5jYXBpdGFsaXplKHRoaXMpOworICAgIH07CisgIH0KK30pOworLy8gRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVMKK2VuaWZlZCgnZW1iZXItcnVudGltZS9pbmRleCcsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbCcsICdlbWJlci1ydW50aW1lL2lzLWVxdWFsJywgJ2VtYmVyLXJ1bnRpbWUvY29tcGFy
ZScsICdlbWJlci1ydW50aW1lL2NvcHknLCAnZW1iZXItcnVudGltZS9pbmplY3QnLCAnZW1iZXIt
cnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcs
ICdlbWJlci1ydW50aW1lL3N5c3RlbS9jb250YWluZXInLCAnZW1iZXItcnVudGltZS9zeXN0ZW0v
YXJyYXlfcHJveHknLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0X3Byb3h5JywgJ2VtYmVy
LXJ1bnRpbWUvc3lzdGVtL2NvcmVfb2JqZWN0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2
ZV9hcnJheScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vbGF6eV9sb2FkJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5JywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL2NvbXBhcmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29weWFibGUn
LCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1ydW50aW1lL21peGlu
cy9mcmVlemFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvLXByb3h5JywgJ2VtYmVyLXJ1bnRp
bWUvbWl4aW5zL29ic2VydmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRs
ZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvbXV0YWJsZV9lbnVtZXJhYmxlJywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL211dGFibGVfYXJyYXknLCAnZW1iZXItcnVudGltZS9taXhpbnMvdGFyZ2V0
X2FjdGlvbl9zdXBwb3J0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQnLCAnZW1iZXIt
cnVudGltZS9taXhpbnMvcHJvbWlzZV9wcm94eScsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdl
bWJlci1ydW50aW1lL2NvbXB1dGVkL3JlZHVjZV9jb21wdXRlZF9tYWNyb3MnLCAnZW1iZXItcnVu
dGltZS9jb250cm9sbGVycy9jb250cm9sbGVyJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRy
b2xsZXInLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsICdlbWJlci1ydW50aW1lL2V4
dC9yc3ZwJywgJ2VtYmVyLXJ1bnRpbWUvZXh0L3N0cmluZycsICdlbWJlci1ydW50aW1lL2V4dC9m
dW5jdGlvbicsICdlbWJlci1ydW50aW1lL3V0aWxzJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL3Jl
Z2lzdHJ5X3Byb3h5JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRhaW5lcl9wcm94eScsICdl
bWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWwsIF9lbWJlclJ1bnRpbWVJc0VxdWFsLCBfZW1iZXJSdW50aW1lQ29tcGFyZSwgX2VtYmVy
UnVudGltZUNvcHksIF9lbWJlclJ1bnRpbWVJbmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1l
c3BhY2UsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1Db250
YWluZXIsIF9lbWJlclJ1bnRpbWVTeXN0ZW1BcnJheV9wcm94eSwgX2VtYmVyUnVudGltZVN5c3Rl
bU9iamVjdF9wcm94eSwgX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1iZXJSdW50
aW1lU3lzdGVtTmF0aXZlX2FycmF5LCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLCBfZW1iZXJS
dW50aW1lU3lzdGVtTGF6eV9sb2FkLCBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXksIF9lbWJlclJ1
bnRpbWVNaXhpbnNDb21wYXJhYmxlLCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUsIF9lbWJl
clJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLCBfZW1iZXJSdW50aW1lTWl4aW5zRnJlZXphYmxlLCBf
ZW1iZXJSdW50aW1lTWl4aW5zUHJveHksIF9lbWJlclJ1bnRpbWVNaXhpbnNPYnNlcnZhYmxlLCBf
ZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRh
YmxlX2VudW1lcmFibGUsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJS
dW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJSdW50aW1lTWl4aW5zRXZl
bnRlZCwgX2VtYmVyUnVudGltZU1peGluc1Byb21pc2VfcHJveHksIF9lbWJlck1ldGFsRmVhdHVy
ZXMsIF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MsIF9lbWJlclJ1
bnRpbWVDb250cm9sbGVyc0NvbnRyb2xsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9sbGVy
LCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9lbWJl
clJ1bnRpbWVFeHRTdHJpbmcsIF9lbWJlclJ1bnRpbWVFeHRGdW5jdGlvbiwgX2VtYmVyUnVudGlt
ZVV0aWxzLCBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHksIF9lbWJlclJ1bnRpbWVN
aXhpbnNDb250YWluZXJfcHJveHksIF9lbWJlclJ1bnRpbWVTdHJpbmdfcmVnaXN0cnkpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisK
KyAgLy8gQkVHSU4gSU1QT1JUUworICAndXNlIHN0cmljdCc7CisKKyAgLy8gRU5EIElNUE9SVFMK
KworICAvLyBCRUdJTiBFWFBPUlRTCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuY29tcGFyZSA9IF9l
bWJlclJ1bnRpbWVDb21wYXJlLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuY29weSA9
IF9lbWJlclJ1bnRpbWVDb3B5LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuaXNFcXVh
bCA9IF9lbWJlclJ1bnRpbWVJc0VxdWFsLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVs
dC5pbmplY3QgPSBfZW1iZXJSdW50aW1lSW5qZWN0LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwu
ZGVmYXVsdC5BcnJheSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5kZWZhdWx0OworCisgIF9l
bWJlck1ldGFsLmRlZmF1bHQuQ29tcGFyYWJsZSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb21wYXJh
YmxlLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQ29weWFibGUgPSBfZW1iZXJSdW50
aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LkZyZWV6
YWJsZSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUuRnJlZXphYmxlOworICBfZW1iZXJN
ZXRhbC5kZWZhdWx0LkZST1pFTl9FUlJPUiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUu
RlJPWkVOX0VSUk9SOworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuTXV0YWJsZUVudW1lcmFibGUg
PSBfZW1iZXJSdW50aW1lTWl4aW5zTXV0YWJsZV9lbnVtZXJhYmxlLmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsLmRlZmF1bHQuTXV0YWJsZUFycmF5ID0gX2VtYmVyUnVudGltZU1peGluc011dGFibGVf
YXJyYXkuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LlRhcmdldEFjdGlvblN1cHBv
cnQgPSBfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LmRlZmF1bHQ7Cisg
IF9lbWJlck1ldGFsLmRlZmF1bHQuRXZlbnRlZCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVk
LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5Qcm9taXNlUHJveHlNaXhpbiA9IF9l
bWJlclJ1bnRpbWVNaXhpbnNQcm9taXNlX3Byb3h5LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwu
ZGVmYXVsdC5PYnNlcnZhYmxlID0gX2VtYmVyUnVudGltZU1peGluc09ic2VydmFibGUuZGVmYXVs
dDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LnR5cGVPZiA9IF9lbWJlclJ1bnRpbWVVdGlscy50
eXBlT2Y7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuaXNBcnJheSA9IF9lbWJlclJ1bnRpbWVVdGls
cy5pc0FycmF5OworCisgIC8vIEVTNlRPRE86IHRoaXMgc2VlbXMgYSBsZXNzIHRoYW4gaWRlYWwg
d2F5L3BsYWNlIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIEVtYmVyLmNvbXB1dGVkCisgIHZhciBFbUNv
bXB1dGVkID0gX2VtYmVyTWV0YWwuZGVmYXVsdC5jb21wdXRlZDsKKworICBFbUNvbXB1dGVkLnN1
bSA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3Muc3VtOworICBF
bUNvbXB1dGVkLm1pbiA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNy
b3MubWluOworICBFbUNvbXB1dGVkLm1heCA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9j
b21wdXRlZF9tYWNyb3MubWF4OworICBFbUNvbXB1dGVkLm1hcCA9IF9lbWJlclJ1bnRpbWVDb21w
dXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MubWFwOworICBFbUNvbXB1dGVkLnNvcnQgPSBfZW1i
ZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2VfY29tcHV0ZWRfbWFjcm9zLnNvcnQ7CisgIEVtQ29tcHV0
ZWQuc2V0RGlmZiA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3Mu
c2V0RGlmZjsKKyAgRW1Db21wdXRlZC5tYXBCeSA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVj
ZV9jb21wdXRlZF9tYWNyb3MubWFwQnk7CisgIEVtQ29tcHV0ZWQuZmlsdGVyID0gX2VtYmVyUnVu
dGltZUNvbXB1dGVkUmVkdWNlX2NvbXB1dGVkX21hY3Jvcy5maWx0ZXI7CisgIEVtQ29tcHV0ZWQu
ZmlsdGVyQnkgPSBfZW1iZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2VfY29tcHV0ZWRfbWFjcm9zLmZp
bHRlckJ5OworICBFbUNvbXB1dGVkLnVuaXEgPSBfZW1iZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2Vf
Y29tcHV0ZWRfbWFjcm9zLnVuaXE7CisKKyAgRW1Db21wdXRlZC51bmlvbiA9IF9lbWJlclJ1bnRp
bWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MudW5pb247CisgIEVtQ29tcHV0ZWQuaW50
ZXJzZWN0ID0gX2VtYmVyUnVudGltZUNvbXB1dGVkUmVkdWNlX2NvbXB1dGVkX21hY3Jvcy5pbnRl
cnNlY3Q7CisgIEVtQ29tcHV0ZWQuY29sbGVjdCA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVj
ZV9jb21wdXRlZF9tYWNyb3MuY29sbGVjdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LlN0cmlu
ZyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVm
YXVsdC5PYmplY3QgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsLmRlZmF1bHQuQ29udGFpbmVyID0gX2VtYmVyUnVudGltZVN5c3RlbUNvbnRhaW5lci5D
b250YWluZXI7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuUmVnaXN0cnkgPSBfZW1iZXJSdW50aW1l
U3lzdGVtQ29udGFpbmVyLlJlZ2lzdHJ5OworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuZ2V0T3du
ZXIgPSBfZW1iZXJSdW50aW1lU3lzdGVtQ29udGFpbmVyLmdldE93bmVyOworICBfZW1iZXJNZXRh
bC5kZWZhdWx0LnNldE93bmVyID0gX2VtYmVyUnVudGltZVN5c3RlbUNvbnRhaW5lci5zZXRPd25l
cjsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0Ll9SZWdpc3RyeVByb3h5TWl4aW4gPSBfZW1iZXJS
dW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHkuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVs
dC5fQ29udGFpbmVyUHJveHlNaXhpbiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb250YWluZXJfcHJv
eHkuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0Lk5hbWVzcGFjZSA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYW1lc3BhY2UuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5FbnVt
ZXJhYmxlID0gX2VtYmVyUnVudGltZU1peGluc0VudW1lcmFibGUuZGVmYXVsdDsKKyAgX2VtYmVy
TWV0YWwuZGVmYXVsdC5BcnJheVByb3h5ID0gX2VtYmVyUnVudGltZVN5c3RlbUFycmF5X3Byb3h5
LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuT2JqZWN0UHJveHkgPSBfZW1iZXJSdW50
aW1lU3lzdGVtT2JqZWN0X3Byb3h5LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQWN0
aW9uSGFuZGxlciA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlci5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbC5kZWZhdWx0LkNvcmVPYmplY3QgPSBfZW1iZXJSdW50aW1lU3lzdGVtQ29y
ZV9vYmplY3QuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5OYXRpdmVBcnJheSA9IF9l
bWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuZGVmYXVsdDsKKyAgLy8gRVM2VE9ETzogQ3Vy
cmVudGx5IHdlIG11c3QgcmVseSBvbiB0aGUgZ2xvYmFsIGZyb20gZW1iZXItbWV0YWwvY29yZSB0
byBhdm9pZCBjaXJjdWxhciBkZXBzCisgIC8vIEVtYmVyLkEgPSBBOworICBfZW1iZXJNZXRhbC5k
ZWZhdWx0Lm9uTG9hZCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQub25Mb2FkOworICBf
ZW1iZXJNZXRhbC5kZWZhdWx0LnJ1bkxvYWRIb29rcyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5
X2xvYWQucnVuTG9hZEhvb2tzOworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQ29udHJvbGxlciA9
IF9lbWJlclJ1bnRpbWVDb250cm9sbGVyc0NvbnRyb2xsZXIuZGVmYXVsdDsKKyAgX2VtYmVyTWV0
YWwuZGVmYXVsdC5Db250cm9sbGVyTWl4aW4gPSBfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxl
ci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuU2VydmljZSA9IF9lbWJlclJ1bnRp
bWVTeXN0ZW1TZXJ2aWNlLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5fUHJveHlN
aXhpbiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNQcm94eS5kZWZhdWx0OworCisgIF9lbWJlck1ldGFs
LmRlZmF1bHQuUlNWUCA9IF9lbWJlclJ1bnRpbWVFeHRSc3ZwLmRlZmF1bHQ7CisgIC8vIEVORCBF
WFBPUlRTCisKKyAgLyoqCisgICAgRGVmaW5lcyB0aGUgaGFzaCBvZiBsb2NhbGl6ZWQgc3RyaW5n
cyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuIFVzZWQgYnkKKyAgICB0aGUgYEVtYmVyLlN0cmlu
Zy5sb2MoKWAgaGVscGVyLiBUbyBsb2NhbGl6ZSwgYWRkIHN0cmluZyB2YWx1ZXMgdG8gdGhpcwor
ICAgIGhhc2guCisgIAorICAgIEBwcm9wZXJ0eSBTVFJJTkdTCisgICAgQGZvciBFbWJlcgorICAg
IEB0eXBlIE9iamVjdAorICAgIEBwcml2YXRlCisgICovCisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
eShfZW1iZXJNZXRhbC5kZWZhdWx0LCAnU1RSSU5HUycsIHsKKyAgICBjb25maWd1cmFibGU6IGZh
bHNlLAorICAgIGdldDogX2VtYmVyUnVudGltZVN0cmluZ19yZWdpc3RyeS5nZXRTdHJpbmdzLAor
ICAgIHNldDogX2VtYmVyUnVudGltZVN0cmluZ19yZWdpc3RyeS5zZXRTdHJpbmdzCisgIH0pOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsLmRlZmF1bHQ7Cit9KTsKKy8vIGp1c3Qg
Zm9yIHNpZGUgZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5SU1ZQCisvLyBqdXN0IGZvciBzaWRl
IGVmZmVjdCBvZiBleHRlbmRpbmcgU3RyaW5nLnByb3RvdHlwZQorLy8ganVzdCBmb3Igc2lkZSBl
ZmZlY3Qgb2YgZXh0ZW5kaW5nIEZ1bmN0aW9uLnByb3RvdHlwZQorZW5pZmVkKCdlbWJlci1ydW50
aW1lL2luamVjdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRh
bC9pbmplY3RlZF9wcm9wZXJ0eSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1
ZywgX2VtYmVyTWV0YWxJbmplY3RlZF9wcm9wZXJ0eSkgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gaW5qZWN0OworICBleHBvcnRzLmNyZWF0ZUluamVjdGlvbkhlbHBl
ciA9IGNyZWF0ZUluamVjdGlvbkhlbHBlcjsKKyAgZXhwb3J0cy52YWxpZGF0ZVByb3BlcnR5SW5q
ZWN0aW9ucyA9IHZhbGlkYXRlUHJvcGVydHlJbmplY3Rpb25zOworCisgIC8qKgorICAgIE5hbWVz
cGFjZSBmb3IgaW5qZWN0aW9uIGhlbHBlciBtZXRob2RzLgorICAKKyAgICBAY2xhc3MgaW5qZWN0
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzdGF0aWMKKyAgICBAcHVibGljCisgICovCisK
KyAgZnVuY3Rpb24gaW5qZWN0KCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdJbmpl
Y3RlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY3JlYXRlZCB0aHJvdWdoIGhlbHBlcnMsIHNlZSBcJycg
KyBPYmplY3Qua2V5cyhpbmplY3QpLmpvaW4oJyInLCAnIicpICsgJ1wnJyk7CisgIH0KKworICAv
LyBEaWN0aW9uYXJ5IG9mIGluamVjdGlvbiB2YWxpZGF0aW9ucyBieSB0eXBlLCBhZGRlZCB0byBi
eSBgY3JlYXRlSW5qZWN0aW9uSGVscGVyYAorICB2YXIgdHlwZVZhbGlkYXRvcnMgPSB7fTsKKwor
ICAvKioKKyAgICBUaGlzIG1ldGhvZCBhbGxvd3Mgb3RoZXIgRW1iZXIgbW9kdWxlcyB0byByZWdp
c3RlciBpbmplY3Rpb24gaGVscGVycyBmb3IgYQorICAgIGdpdmVuIGNvbnRhaW5lciB0eXBlLiBI
ZWxwZXJzIGFyZSBleHBvcnRlZCB0byB0aGUgYGluamVjdGAgbmFtZXNwYWNlIGFzIHRoZQorICAg
IGNvbnRhaW5lciB0eXBlIGl0c2VsZi4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGNy
ZWF0ZUluamVjdGlvbkhlbHBlcgorICAgIEBzaW5jZSAxLjEwLjAKKyAgICBAZm9yIEVtYmVyCisg
ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGNvbnRhaW5lciB0eXBlIHRoZSBoZWxwZXIgd2ls
bCBpbmplY3QKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSB2YWxpZGF0b3IgQSB2YWxpZGF0aW9uIGNh
bGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgYXQgbWl4aW4tdGltZQorICAqLworCisgIGZ1bmN0aW9u
IGNyZWF0ZUluamVjdGlvbkhlbHBlcih0eXBlLCB2YWxpZGF0b3IpIHsKKyAgICB0eXBlVmFsaWRh
dG9yc1t0eXBlXSA9IHZhbGlkYXRvcjsKKworICAgIGluamVjdFt0eXBlXSA9IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgICByZXR1cm4gbmV3IF9lbWJlck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVm
YXVsdCh0eXBlLCBuYW1lKTsKKyAgICB9OworICB9CisKKyAgLyoqCisgICAgVmFsaWRhdGlvbiBm
dW5jdGlvbiB0aGF0IHJ1bnMgcGVyLXR5cGUgdmFsaWRhdGlvbiBmdW5jdGlvbnMgb25jZSBmb3Ig
ZWFjaAorICAgIGluamVjdGVkIHR5cGUgZW5jb3VudGVyZWQuCisgIAorICAgIEBwcml2YXRlCisg
ICAgQG1ldGhvZCB2YWxpZGF0ZVByb3BlcnR5SW5qZWN0aW9ucworICAgIEBzaW5jZSAxLjEwLjAK
KyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IGZhY3RvcnkgVGhlIGZhY3Rvcnkg
b2JqZWN0CisgICovCisKKyAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUluamVjdGlvbnMoZmFj
dG9yeSkgeworICAgIHZhciBwcm90byA9IGZhY3RvcnkucHJvdG8oKTsKKyAgICB2YXIgdHlwZXMg
PSBbXTsKKyAgICB2YXIga2V5LCBkZXNjLCB2YWxpZGF0b3IsIGksIGw7CisKKyAgICBmb3IgKGtl
eSBpbiBwcm90bykgeworICAgICAgZGVzYyA9IHByb3RvW2tleV07CisgICAgICBpZiAoZGVzYyBp
bnN0YW5jZW9mIF9lbWJlck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVmYXVsdCAmJiB0eXBlcy5p
bmRleE9mKGRlc2MudHlwZSkgPT09IC0xKSB7CisgICAgICAgIHR5cGVzLnB1c2goZGVzYy50eXBl
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHlwZXMubGVuZ3RoKSB7CisgICAgICBmb3Ig
KGkgPSAwLCBsID0gdHlwZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhbGlkYXRv
ciA9IHR5cGVWYWxpZGF0b3JzW3R5cGVzW2ldXTsKKworICAgICAgICBpZiAodHlwZW9mIHZhbGlk
YXRvciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHZhbGlkYXRvcihmYWN0b3J5KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItcnVudGltZS9pcy1lcXVhbCcsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhw
b3J0cykgeworICAvKioKKyAgICBDb21wYXJlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIHRydWUg
aWYgdGhleSBhcmUgZXF1YWwuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5pc0Vx
dWFsKCdoZWxsbycsICdoZWxsbycpOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1i
ZXIuaXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UK
KyAgICBgYGAKKyAgCisgICAgYGlzRXF1YWxgIGlzIGEgbW9yZSBzcGVjaWZpYyBjb21wYXJpc29u
IHRoYW4gYSB0cmlwbGUgZXF1YWwgY29tcGFyaXNvbi4KKyAgICBJdCB3aWxsIGNhbGwgdGhlIGBp
c0VxdWFsYCBpbnN0YW5jZSBtZXRob2Qgb24gdGhlIG9iamVjdHMgYmVpbmcKKyAgICBjb21wYXJl
ZCwgYWxsb3dpbmcgZmluZXIgY29udHJvbCBvdmVyIHdoZW4gb2JqZWN0cyBzaG91bGQgYmUgY29u
c2lkZXJlZAorICAgIGVxdWFsIHRvIGVhY2ggb3RoZXIuCisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBsZXQgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBpc0VxdWFsKG90
aGVyKSB7IHJldHVybiB0aGlzLnNzbiA9PSBvdGhlci5zc247IH0KKyAgICB9KTsKKyAgCisgICAg
bGV0IHBlcnNvbkEgPSBQZXJzb24uY3JlYXRlKHtuYW1lOiAnTXVoYW1tYWQgQWxpJywgc3NuOiAn
MTIzLTQ1LTY3ODknfSk7CisgICAgbGV0IHBlcnNvbkIgPSBQZXJzb24uY3JlYXRlKHtuYW1lOiAn
Q2Fzc2l1cyBDbGF5Jywgc3NuOiAnMTIzLTQ1LTY3ODknfSk7CisgIAorICAgIEVtYmVyLmlzRXF1
YWwocGVyc29uQSwgcGVyc29uQik7IC8vIHRydWUKKyAgICBgYGAKKyAgCisgICAgRHVlIHRvIHRo
ZSBleHBlbnNlIG9mIGFycmF5IGNvbXBhcmlzb25zLCBjb2xsZWN0aW9ucyB3aWxsIG5ldmVyIGJl
IGVxdWFsIHRvCisgICAgZWFjaCBvdGhlciBldmVuIGlmIGVhY2ggb2YgdGhlaXIgaXRlbXMgYXJl
IGVxdWFsIHRvIGVhY2ggb3RoZXIuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5p
c0VxdWFsKFs0LCAyXSwgWzQsIDJdKTsgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQorICAg
IGBgYAorICAKKyAgICBAbWV0aG9kIGlzRXF1YWwKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFt
IHtPYmplY3R9IGEgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICBAcGFyYW0ge09iamVjdH0g
YiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBw
dWJsaWMKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzRXF1
YWw7CisKKyAgZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7CisgICAgaWYgKGEgJiYgdHlwZW9mIGEu
aXNFcXVhbCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgcmV0dXJuIGEuaXNFcXVhbChiKTsKKyAg
ICB9CisKKyAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHsK
KyAgICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCk7CisgICAgfQorCisgICAg
cmV0dXJuIGEgPT09IGI7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy8t
cHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJv
cGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9tZXRh
JywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycs
ICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVy
LW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1l
dGFsUHJvcGVydHlfZXZlbnRzLCBfZW1iZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbFByb3Bl
cnRpZXMsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ug
c3RyaWN0JzsKKworICB2YXIgX01peGluJGNyZWF0ZTsKKworICBleHBvcnRzLmlzUHJveHkgPSBp
c1Byb3h5OworCisgIHZhciBJU19QUk9YWSA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0lT
X1BST1hZJyk7CisKKyAgZnVuY3Rpb24gaXNQcm94eSh2YWx1ZSkgeworICAgIHJldHVybiB2YWx1
ZSAmJiB2YWx1ZVtJU19QUk9YWV07CisgIH0KKworICBmdW5jdGlvbiBjb250ZW50UHJvcGVydHlX
aWxsQ2hhbmdlKGNvbnRlbnQsIGNvbnRlbnRLZXkpIHsKKyAgICB2YXIga2V5ID0gY29udGVudEtl
eS5zbGljZSg4KTsgLy8gcmVtb3ZlICJjb250ZW50LiIKKyAgICBpZiAoa2V5IGluIHRoaXMpIHsK
KyAgICAgIHJldHVybjsKKyAgICB9IC8vIGlmIHNoYWRvd2VkIGluIHByb3h5CisgICAgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CisgIH0K
KworICBmdW5jdGlvbiBjb250ZW50UHJvcGVydHlEaWRDaGFuZ2UoY29udGVudCwgY29udGVudEtl
eSkgeworICAgIHZhciBrZXkgPSBjb250ZW50S2V5LnNsaWNlKDgpOyAvLyByZW1vdmUgImNvbnRl
bnQuIgorICAgIGlmIChrZXkgaW4gdGhpcykgeworICAgICAgcmV0dXJuOworICAgIH0gLy8gaWYg
c2hhZG93ZWQgaW4gcHJveHkKKyAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0
eURpZENoYW5nZSh0aGlzLCBrZXkpOworICB9CisKKyAgLyoqCisgICAgYEVtYmVyLlByb3h5TWl4
aW5gIGZvcndhcmRzIGFsbCBwcm9wZXJ0aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94eSBpdHNl
bGYKKyAgICB0byBhIHByb3hpZWQgYGNvbnRlbnRgIG9iamVjdC4gIFNlZSBFbWJlci5PYmplY3RQ
cm94eSBmb3IgbW9yZSBkZXRhaWxzLgorICAKKyAgICBAY2xhc3MgUHJveHlNaXhpbgorICAgIEBu
YW1lc3BhY2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHt9LCBfTWl4aW4k
Y3JlYXRlW0lTX1BST1hZXSA9IHRydWUsIF9NaXhpbiRjcmVhdGUuY29udGVudCA9IG51bGwsIF9N
aXhpbiRjcmVhdGUuX2NvbnRlbnREaWRDaGFuZ2UgPSBfZW1iZXJNZXRhbE1peGluLm9ic2VydmVy
KCdjb250ZW50JywgZnVuY3Rpb24gKCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdD
YW5cJ3Qgc2V0IFByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50JykgIT09IHRoaXMpOworICB9KSwgX01peGluJGNyZWF0
ZS5pc1RydXRoeSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuYm9vbCgnY29udGVudCcp
LCBfTWl4aW4kY3JlYXRlLl9kZWJ1Z0NvbnRhaW5lcktleSA9IG51bGwsIF9NaXhpbiRjcmVhdGUu
d2lsbFdhdGNoUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkg
PSAnY29udGVudC4nICsga2V5OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX2FkZEJlZm9yZU9i
c2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIodGhpcywgY29udGVudEtleSwg
bnVsbCwgY29udGVudFByb3BlcnR5RGlkQ2hhbmdlKTsKKyAgfSwgX01peGluJGNyZWF0ZS5kaWRV
bndhdGNoUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkgPSAn
Y29udGVudC4nICsga2V5OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3JlbW92ZUJlZm9yZU9i
c2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywgY29udGVudEtl
eSwgbnVsbCwgY29udGVudFByb3BlcnR5RGlkQ2hhbmdlKTsKKyAgfSwgX01peGluJGNyZWF0ZS51
bmtub3duUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbnRlbnQnKTsKKyAgICBpZiAoY29udGVu
dCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1lvdSBhdHRlbXB0ZWQgdG8g
YWNjZXNzIGAnICsga2V5ICsgJ2AgZnJvbSBgJyArIHRoaXMgKyAnYCwgYnV0IG9iamVjdCBwcm94
eWluZyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBtb2RlbC4nICsga2V5ICsgJ2AgaW5zdGVh
ZC4nLCAhdGhpcy5pc0NvbnRyb2xsZXIsIHsgaWQ6ICdlbWJlci1ydW50aW1lLmNvbnRyb2xsZXIt
cHJveHknLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQoY29udGVudCwga2V5KTsKKyAgICB9CisgIH0sIF9NaXhpbiRjcmVhdGUuc2V0
VW5rbm93blByb3BlcnR5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICB2YXIgbSA9IF9l
bWJlck1ldGFsTWV0YS5tZXRhKHRoaXMpOworICAgIGlmIChtLnByb3RvID09PSB0aGlzKSB7Cisg
ICAgICAvLyBpZiBtYXJrZWQgYXMgcHJvdG90eXBlIHRoZW4ganVzdCBkZWZpbmVQcm9wZXJ0eQor
ICAgICAgLy8gcmF0aGVyIHRoYW4gZGVsZWdhdGUKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGll
cy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIG51bGwsIHZhbHVlKTsKKyAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICB9CisKKyAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY29udGVudCcpOworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5u
b3QgZGVsZWdhdGUgc2V0KFwnJyArIGtleSArICdcJywgJyArIHZhbHVlICsgJykgdG8gdGhlIFwn
Y29udGVudFwnIHByb3BlcnR5IG9mIG9iamVjdCBwcm94eSAnICsgdGhpcyArICc6IGl0cyBcJ2Nv
bnRlbnRcJyBpcyB1bmRlZmluZWQuJywgY29udGVudCk7CisKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmRlcHJlY2F0ZSgnWW91IGF0dGVtcHRlZCB0byBzZXQgYCcgKyBrZXkgKyAnYCBmcm9tIGAnICsg
dGhpcyArICdgLCBidXQgb2JqZWN0IHByb3h5aW5nIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ug
YG1vZGVsLicgKyBrZXkgKyAnYCBpbnN0ZWFkLicsICF0aGlzLmlzQ29udHJvbGxlciwgeyBpZDog
J2VtYmVyLXJ1bnRpbWUuY29udHJvbGxlci1wcm94eScsIHVudGlsOiAnMy4wLjAnIH0pOworICAg
IHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoY29udGVudCwga2V5LCB2YWx1ZSk7
CisgIH0sIF9NaXhpbiRjcmVhdGUpKTsKK30pOworCisvKioKKyAgVGhlIG9iamVjdCB3aG9zZSBw
cm9wZXJ0aWVzIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgQHByb3BlcnR5IGNvbnRlbnQKKyAgQHR5
cGUgRW1iZXIuT2JqZWN0CisgIEBkZWZhdWx0IG51bGwKKyAgQHByaXZhdGUKKyovCitlbmlmZWQo
J2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FjdGlvbl9oYW5kbGVyJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxN
aXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIK
KyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMgPSBkZXByZWNhdGVVbmRlcnNjb3Jl
QWN0aW9uczsKKworICAvKioKKyAgICBgRW1iZXIuQWN0aW9uSGFuZGxlcmAgaXMgYXZhaWxhYmxl
IG9uIHNvbWUgZmFtaWxpYXIgY2xhc3NlcyBpbmNsdWRpbmcKKyAgICBgRW1iZXIuUm91dGVgLCBg
RW1iZXIuVmlld2AsIGBFbWJlci5Db21wb25lbnRgLCBhbmQgYEVtYmVyLkNvbnRyb2xsZXJgLgor
ICAgIChJbnRlcm5hbGx5IHRoZSBtaXhpbiBpcyB1c2VkIGJ5IGBFbWJlci5Db3JlVmlld2AsIGBF
bWJlci5Db250cm9sbGVyTWl4aW5gLAorICAgIGFuZCBgRW1iZXIuUm91dGVgIGFuZCBhdmFpbGFi
bGUgdG8gdGhlIGFib3ZlIGNsYXNzZXMgdGhyb3VnaAorICAgIGluaGVyaXRhbmNlLikKKyAgCisg
ICAgQGNsYXNzIEFjdGlvbkhhbmRsZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHByaXZh
dGUKKyAgKi8KKyAgdmFyIEFjdGlvbkhhbmRsZXIgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNy
ZWF0ZSh7CisgICAgbWVyZ2VkUHJvcGVydGllczogWydhY3Rpb25zJ10sCisKKyAgICAvKioKKyAg
ICAgIFRoZSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucywga2V5ZWQgYnkgbmFtZSwgYXZhaWxhYmxl
IG9uIHRoaXMKKyAgICAgIGBBY3Rpb25IYW5kbGVyYCBhcyBhY3Rpb24gdGFyZ2V0cy4KKyAgICAg
ICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBpbnZva2VkIHdoZW4gYSBtYXRjaGluZyBge3thY3Rp
b259fWAgaXMgdHJpZ2dlcmVkCisgICAgICBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIGFuZCB0aGUg
YXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIGlzIHRoaXMgcm91dGUuCisgICAgICAgQWN0aW9u
cyBjYW4gYWxzbyBiZSBpbnZva2VkIGZyb20gb3RoZXIgcGFydHMgb2YgeW91ciBhcHBsaWNhdGlv
bgorICAgICAgdmlhIGBBY3Rpb25IYW5kbGVyI3NlbmRgLgorICAgICAgIFRoZSBgYWN0aW9uc2Ag
aGFzaCB3aWxsIGluaGVyaXQgYWN0aW9uIGhhbmRsZXJzIGZyb20KKyAgICAgIHRoZSBgYWN0aW9u
c2AgaGFzaCBkZWZpbmVkIG9uIGV4dGVuZGVkIHBhcmVudCBjbGFzc2VzCisgICAgICBvciBtaXhp
bnMgcmF0aGVyIHRoYW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgaGFzaCwgZS5nLjoKKyAgICAg
ICBgYGBqcworICAgICAgQXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJlci5NaXhpbi5jcmVhdGUo
eworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgZGlzcGxheUJhbm5lcjogZnVuY3Rpb24o
bXNnKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNh
bkRpc3BsYXlCYW5uZXIsIHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHBsYXlNdXNp
YzogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgIH0pOworICAgICAgIC8vIGBXZWxjb21lUm91dGVgLCB3aGVuIGFjdGl2ZSwgd2ls
bCBiZSBhYmxlIHRvIHJlc3BvbmQKKyAgICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2UgdGhl
IGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQgcmF0aGVyCisgICAgICAvLyB0aGVuIHJlcGxhY2VkIHdo
ZW4gZXh0ZW5kaW5nIG1peGlucyAvIHBhcmVudCBjbGFzc2VzLgorICAgICAgdGhpcy5zZW5kKCdk
aXNwbGF5QmFubmVyJyk7CisgICAgICB0aGlzLnNlbmQoJ3BsYXlNdXNpYycpOworICAgICAgYGBg
CisgICAgICAgV2l0aGluIGEgQ29udHJvbGxlciwgUm91dGUsIFZpZXcgb3IgQ29tcG9uZW50J3Mg
YWN0aW9uIGhhbmRsZXIsCisgICAgICB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0IGlz
IHRoZSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvcgorICAgICAgQ29tcG9uZW50IG9iamVjdDoK
KyAgICAgICBgYGBqcworICAgICAgQXBwLlNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7
CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoInNvbmciKTsKKyAgICAgICAgICAgIHRoaXMu
dHJhbnNpdGlvblRvKCJvdGhlci5yb3V0ZSIpOworICAgICAgICAgICAgLi4uCisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEl0IGlzIGFsc28gcG9z
c2libGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoLi4uYXJndW1lbnRzKWAgZnJvbSB3aXRoaW4gYW4K
KyAgICAgIGFjdGlvbiBoYW5kbGVyIGlmIGl0IG92ZXJyaWRlcyBhIGhhbmRsZXIgZGVmaW5lZCBv
biBhIHBhcmVudAorICAgICAgY2xhc3Mgb3IgbWl4aW46CisgICAgICAgVGFrZSBmb3IgZXhhbXBs
ZSB0aGUgZm9sbG93aW5nIHJvdXRlczoKKyAgICAgICBgYGBqcworICAgICAgQXBwLkRlYnVnUm91
dGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAg
ZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNvbnNvbGUu
ZGVidWcoInRyb2xvbG8iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVn
Um91dGUsIHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIGRlYnVnUm91dGVJbmZvcm1h
dGlvbjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91
dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVidWdSb3V0ZQorICAgICAgICAgICAgdGhp
cy5fc3VwZXIoLi4uYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAvLyBzaG93IGFkZGl0aW9uYWwg
YW5ub3lhbmNlCisgICAgICAgICAgICB3aW5kb3cuYWxlcnQoLi4uKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgIyMgQnViYmxpbmcKKyAgICAg
ICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVy
IGRlZmluZWQKKyAgICAgIG9uIHRoZSBgYWN0aW9uc2AgaGFzaCBoYW5kbGVzIGl0LiBUbyBjb250
aW51ZSBidWJibGluZyB0aGUgYWN0aW9uLAorICAgICAgeW91IG11c3QgcmV0dXJuIGB0cnVlYCBm
cm9tIHRoZSBoYW5kbGVyOgorICAgICAgIGBgYGpzCisgICAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICB0aGlzLnJvdXRlKCJzb25nIik7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAg
QXBwLkFsYnVtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7
CisgICAgICAgICAgc3RhcnRQbGF5aW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRl
LmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBzdGFydFBsYXlpbmc6IGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgLy8gLi4uCisgICAgICAgICAgICAgaWYgKGFjdGlvblNo
b3VsZEFsc29CZVRyaWdnZXJlZE9uUGFyZW50Um91dGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBhY3Rpb25zCisgICAgICBAdHlwZSBPYmplY3QK
KyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAgLyoqCisg
ICAgICBUcmlnZ2VycyBhIG5hbWVkIGFjdGlvbiBvbiB0aGUgYEFjdGlvbkhhbmRsZXJgLiBBbnkg
cGFyYW1ldGVycworICAgICAgc3VwcGxpZWQgYWZ0ZXIgdGhlIGBhY3Rpb25OYW1lYCBzdHJpbmcg
d2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzCisgICAgICB0byB0aGUgYWN0aW9uIHRhcmdldCBm
dW5jdGlvbi4KKyAgICAgICBJZiB0aGUgYEFjdGlvbkhhbmRsZXJgIGhhcyBpdHMgYHRhcmdldGAg
cHJvcGVydHkgc2V0LCBhY3Rpb25zIG1heQorICAgICAgYnViYmxlIHRvIHRoZSBgdGFyZ2V0YC4g
QnViYmxpbmcgaGFwcGVucyB3aGVuIGFuIGBhY3Rpb25OYW1lYCBjYW4KKyAgICAgIG5vdCBiZSBm
b3VuZCBpbiB0aGUgYEFjdGlvbkhhbmRsZXJgJ3MgYGFjdGlvbnNgIGhhc2ggb3IgaWYgdGhlCisg
ICAgICBhY3Rpb24gdGFyZ2V0IGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLgorICAgICAgIEV4YW1w
bGUKKyAgICAgICBgYGBqcworICAgICAgQXBwLldlbGNvbWVSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4
dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBwbGF5VGhlbWU6IGZ1bmN0aW9u
KCkgeworICAgICAgICAgICAgIHRoaXMuc2VuZCgncGxheU11c2ljJywgJ3RoZW1lLm1wMycpOwor
ICAgICAgICAgIH0sCisgICAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbih0cmFjaykgeworICAg
ICAgICAgICAgLy8gLi4uCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgIEBtZXRob2Qgc2VuZAorICAgICAgQHBhcmFtIHtTdHJpbmd9IGFjdGlvbk5h
bWUgVGhlIGFjdGlvbiB0byB0cmlnZ2VyCisgICAgICBAcGFyYW0geyp9IGNvbnRleHQgYSBjb250
ZXh0IHRvIHNlbmQgd2l0aCB0aGUgYWN0aW9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBz
ZW5kOiBmdW5jdGlvbiAoYWN0aW9uTmFtZSkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3Vt
ZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkg
PSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJn
dW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICB2YXIgdGFyZ2V0OworCisgICAgICBpZiAo
dGhpcy5hY3Rpb25zICYmIHRoaXMuYWN0aW9uc1thY3Rpb25OYW1lXSkgeworICAgICAgICB2YXIg
c2hvdWxkQnViYmxlID0gdGhpcy5hY3Rpb25zW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3Mp
ID09PSB0cnVlOworICAgICAgICBpZiAoIXNob3VsZEJ1YmJsZSkgeworICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGFyZ2V0ID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd0YXJnZXQnKSkgeworICAgICAgICB2YXIgX3RhcmdldDsK
KworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGB0YXJnZXRgIGZvciAnICsg
dGhpcyArICcgKCcgKyB0YXJnZXQgKyAnKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRgIG1ldGhvZCcs
IHR5cGVvZiB0YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJyk7CisgICAgICAgIChfdGFyZ2V0ID0g
dGFyZ2V0KS5zZW5kLmFwcGx5KF90YXJnZXQsIGFyZ3VtZW50cyk7CisgICAgICB9CisgICAgfSwK
KworICAgIHdpbGxNZXJnZU1peGluOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAgICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdTcGVjaWZ5aW5nIGBfYWN0aW9uc2AgYW5kIGBhY3Rpb25zYCBpbiB0
aGUgc2FtZSBtaXhpbiBpcyBub3Qgc3VwcG9ydGVkLicsICFwcm9wcy5hY3Rpb25zIHx8ICFwcm9w
cy5fYWN0aW9ucyk7CisKKyAgICAgIGlmIChwcm9wcy5fYWN0aW9ucykgeworICAgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnU3BlY2lmeWluZyBhY3Rpb25zIGluIGBfYWN0aW9uc2Ag
aXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBgYWN0aW9uc2AgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJ1bnRpbWUuYWN0aW9uLWhhbmRsZXItX2FjdGlvbnMnLCB1bnRpbDogJzMuMC4w
JyB9KTsKKworICAgICAgICBwcm9wcy5hY3Rpb25zID0gcHJvcHMuX2FjdGlvbnM7CisgICAgICAg
IGRlbGV0ZSBwcm9wcy5fYWN0aW9uczsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IEFjdGlvbkhhbmRsZXI7CisKKyAgZnVuY3Rpb24gZGVwcmVjYXRlVW5kZXJz
Y29yZUFjdGlvbnMoZmFjdG9yeSkgeworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWN0b3J5
LnByb3RvdHlwZSwgJ19hY3Rpb25zJywgeworICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAg
ICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeworICAg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBzZXQgYF9hY3Rpb25zYCBv
biAnICsgdGhpcyArICcsIHBsZWFzZSB1c2UgYGFjdGlvbnNgIGluc3RlYWQuJyk7CisgICAgICB9
LAorICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdVc2FnZSBvZiBgX2FjdGlvbnNgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgYWN0aW9uc2Ag
aW5zdGVhZC4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLXJ1bnRpbWUuYWN0aW9uLWhhbmRsZXItX2Fj
dGlvbnMnLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnYWN0aW9ucycpOworICAgICAgfQorICAgIH0pOworICB9Cit9
KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9taXhpbnMvYXJyYXknLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9zeW1ib2wnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAn
ZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1tZXRhbC9taXhpbicsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVy
LW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvdGFncycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9l
YWNoX3Byb3h5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1l
dGFsU3ltYm9sLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxDb21wdXRlZCwg
X2VtYmVyTWV0YWxJc19ub25lLCBfZW1iZXJSdW50aW1lTWl4aW5zRW51bWVyYWJsZSwgX2VtYmVy
TWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRXZlbnRz
LCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsVGFncywgX2VtYmVyUnVudGltZVN5c3RlbUVh
Y2hfcHJveHkpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisgICovCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBIRUxQRVJTCisgIC8vCisgICd1c2Ugc3RyaWN0
JzsKKworICB2YXIgX01peGluJGNyZWF0ZTsKKworICBleHBvcnRzLmFkZEFycmF5T2JzZXJ2ZXIg
PSBhZGRBcnJheU9ic2VydmVyOworICBleHBvcnRzLnJlbW92ZUFycmF5T2JzZXJ2ZXIgPSByZW1v
dmVBcnJheU9ic2VydmVyOworICBleHBvcnRzLm9iamVjdEF0ID0gb2JqZWN0QXQ7CisgIGV4cG9y
dHMuaXNFbWJlckFycmF5ID0gaXNFbWJlckFycmF5OworCisgIGZ1bmN0aW9uIGFycmF5T2JzZXJ2
ZXJzSGVscGVyKG9iaiwgdGFyZ2V0LCBvcHRzLCBvcGVyYXRpb24sIG5vdGlmeSkgeworICAgIHZh
ciB3aWxsQ2hhbmdlID0gb3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UgfHwgJ2FycmF5V2lsbENoYW5n
ZSc7CisgICAgdmFyIGRpZENoYW5nZSA9IG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UgfHwgJ2FycmF5
RGlkQ2hhbmdlJzsKKyAgICB2YXIgaGFzT2JzZXJ2ZXJzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KG9iaiwgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7CisKKyAgICBpZiAoaGFzT2JzZXJ2ZXJz
ID09PSBub3RpZnkpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5
V2lsbENoYW5nZShvYmosICdoYXNBcnJheU9ic2VydmVycycpOworICAgIH0KKworICAgIG9wZXJh
dGlvbihvYmosICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAgICBvcGVy
YXRpb24ob2JqLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgIGlm
IChoYXNPYnNlcnZlcnMgPT09IG5vdGlmeSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9l
dmVudHMucHJvcGVydHlEaWRDaGFuZ2Uob2JqLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKKyAgICB9
CisKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgZnVuY3Rpb24gYWRkQXJyYXlPYnNlcnZlcihh
cnJheSwgdGFyZ2V0LCBvcHRzKSB7CisgICAgcmV0dXJuIGFycmF5T2JzZXJ2ZXJzSGVscGVyKGFy
cmF5LCB0YXJnZXQsIG9wdHMsIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyLCBmYWxzZSk7
CisgIH0KKworICBmdW5jdGlvbiByZW1vdmVBcnJheU9ic2VydmVyKGFycmF5LCB0YXJnZXQsIG9w
dHMpIHsKKyAgICByZXR1cm4gYXJyYXlPYnNlcnZlcnNIZWxwZXIoYXJyYXksIHRhcmdldCwgb3B0
cywgX2VtYmVyTWV0YWxFdmVudHMucmVtb3ZlTGlzdGVuZXIsIHRydWUpOworICB9CisKKyAgZnVu
Y3Rpb24gb2JqZWN0QXQoY29udGVudCwgaWR4KSB7CisgICAgaWYgKGNvbnRlbnQub2JqZWN0QXQp
IHsKKyAgICAgIHJldHVybiBjb250ZW50Lm9iamVjdEF0KGlkeCk7CisgICAgfQorCisgICAgcmV0
dXJuIGNvbnRlbnRbaWR4XTsKKyAgfQorCisgIHZhciBFTUJFUl9BUlJBWSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0VNQkVSX0FSUkFZJyk7CisKKyAgZnVuY3Rpb24gaXNFbWJlckFycmF5
KG9iaikgeworICAgIHJldHVybiBvYmogJiYgISFvYmpbRU1CRVJfQVJSQVldOworICB9CisKKyAg
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgorICAvLyBBUlJBWQorICAvLworICAvKioKKyAgICBUaGlzIG1peGluIGltcGxlbWVudHMg
T2JzZXJ2ZXItZnJpZW5kbHkgQXJyYXktbGlrZSBiZWhhdmlvci4gSXQgaXMgbm90IGEKKyAgICBj
b25jcmV0ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IGNhbiBiZSB1c2VkIHVwIGJ5IG90aGVyIGNs
YXNzZXMgdGhhdCB3YW50CisgICAgdG8gYXBwZWFyIGxpa2UgYXJyYXlzLgorICAKKyAgICBGb3Ig
ZXhhbXBsZSwgQXJyYXlQcm94eSBpcyBhIGNvbmNyZXRlIGNsYXNzZXMgdGhhdCBjYW4KKyAgICBi
ZSBpbnN0YW50aWF0ZWQgdG8gaW1wbGVtZW50IGFycmF5LWxpa2UgYmVoYXZpb3IuIEJvdGggb2Yg
dGhlc2UgY2xhc3NlcyB1c2UKKyAgICB0aGUgQXJyYXkgTWl4aW4gYnkgd2F5IG9mIHRoZSBNdXRh
YmxlQXJyYXkgbWl4aW4sIHdoaWNoIGFsbG93cyBvYnNlcnZhYmxlCisgICAgY2hhbmdlcyB0byBi
ZSBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGFycmF5LgorICAKKyAgICBVbmxpa2UgYEVtYmVyLkVu
dW1lcmFibGUsYCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9kcyBzcGVjaWZpY2FsbHkgZm9yCisg
ICAgY29sbGVjdGlvbnMgdGhhdCBwcm92aWRlIGluZGV4LW9yZGVyZWQgYWNjZXNzIHRvIHRoZWly
IGNvbnRlbnRzLiBXaGVuIHlvdQorICAgIGFyZSBkZXNpZ25pbmcgY29kZSB0aGF0IG5lZWRzIHRv
IGFjY2VwdCBhbnkga2luZCBvZiBBcnJheS1saWtlIG9iamVjdCwgeW91CisgICAgc2hvdWxkIHVz
ZSB0aGVzZSBtZXRob2RzIGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZlcyBiZWNhdXNlIHRoZXNl
IHdpbGwKKyAgICBwcm9wZXJseSBub3RpZnkgb2JzZXJ2ZXJzIG9mIGNoYW5nZXMgdG8gdGhlIGFy
cmF5LgorICAKKyAgICBBbHRob3VnaCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2llbnQsIHRoZXkg
ZG8gYWRkIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gdG8KKyAgICB5b3VyIGFwcGxpY2F0aW9uIHNv
IGl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGVtIG9ubHkgd2hlbiB5b3UgbmVlZCB0aGUKKyAg
ICBmbGV4aWJpbGl0eSBvZiB1c2luZyBib3RoIHRydWUgSmF2YVNjcmlwdCBhcnJheXMgYW5kICJ2
aXJ0dWFsIiBhcnJheXMgc3VjaAorICAgIGFzIGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9ucy4K
KyAgCisgICAgWW91IGNhbiB1c2UgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB0
byBhY2Nlc3MgYW5kIG1vZGlmeSBhcnJheQorICAgIGNvbnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5
IHdheS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQorICAgIG1lbWJlcnNo
aXAgb2YgYW4gYXJyYXkgY2hhbmdlcyBieSB1c2luZyBgLm9ic2VydmVzKCdteUFycmF5LltdJylg
LgorICAKKyAgICBUbyBzdXBwb3J0IGBFbWJlci5BcnJheWAgaW4geW91ciBvd24gY2xhc3MsIHlv
dSBtdXN0IG92ZXJyaWRlIHR3bworICAgIHByaW1pdGl2ZXMgdG8gdXNlIGl0OiBgbGVuZ3RoKClg
IGFuZCBgb2JqZWN0QXQoKWAuCisgIAorICAgIE5vdGUgdGhhdCB0aGUgRW1iZXIuQXJyYXkgbWl4
aW4gYWxzbyBpbmNvcnBvcmF0ZXMgdGhlIGBFbWJlci5FbnVtZXJhYmxlYAorICAgIG1peGluLiBB
bGwgYEVtYmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJlIGFsc28gZW51bWVyYWJsZS4KKyAgCisg
ICAgQGNsYXNzIEFycmF5CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEB1c2VzIEVtYmVyLkVu
dW1lcmFibGUKKyAgICBAc2luY2UgRW1iZXIgMC45LjAKKyAgICBAcHVibGljCisgICovCisgIGV4
cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRp
bWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQsIChfTWl4aW4kY3JlYXRlID0ge30sIF9NaXhpbiRj
cmVhdGVbRU1CRVJfQVJSQVldID0gdHJ1ZSwgX01peGluJGNyZWF0ZS5sZW5ndGggPSBudWxsLCBf
TWl4aW4kY3JlYXRlLm9iamVjdEF0ID0gZnVuY3Rpb24gKGlkeCkgeworICAgIGlmIChpZHggPCAw
IHx8IGlkeCA+PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7
CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQodGhpcywgaWR4KTsKKyAgfSwgX01peGluJGNyZWF0ZS5vYmplY3Rz
QXQgPSBmdW5jdGlvbiAoaW5kZXhlcykgeworICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICBy
ZXR1cm4gaW5kZXhlcy5tYXAoZnVuY3Rpb24gKGlkeCkgeworICAgICAgcmV0dXJuIG9iamVjdEF0
KF90aGlzLCBpZHgpOworICAgIH0pOworICB9LCBfTWl4aW4kY3JlYXRlLm5leHRPYmplY3QgPSBm
dW5jdGlvbiAoaWR4KSB7CisgICAgcmV0dXJuIG9iamVjdEF0KHRoaXMsIGlkeCk7CisgIH0sIF9N
aXhpbiRjcmVhdGVbJ1tdJ10gPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICBn
ZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgc2V0
OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgdGhpcy5yZXBsYWNlKDAsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIHZhbHVlKTsKKyAgICAgIHJldHVy
biB0aGlzOworICAgIH0KKyAgfSksIF9NaXhpbiRjcmVhdGUuZmlyc3RPYmplY3QgPSBfZW1iZXJN
ZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gb2JqZWN0QXQo
dGhpcywgMCk7CisgIH0pLnJlYWRPbmx5KCksIF9NaXhpbiRjcmVhdGUubGFzdE9iamVjdCA9IF9l
bWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBvYmpl
Y3RBdCh0aGlzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpIC0g
MSk7CisgIH0pLnJlYWRPbmx5KCksIF9NaXhpbiRjcmVhdGUuY29udGFpbnMgPSBmdW5jdGlvbiAo
b2JqKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihvYmopID49IDA7CisgIH0sIF9NaXhpbiRj
cmVhdGUuc2xpY2UgPSBmdW5jdGlvbiAoYmVnaW5JbmRleCwgZW5kSW5kZXgpIHsKKyAgICB2YXIg
cmV0ID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQSgpOworICAgIHZhciBsZW5ndGggPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworCisgICAgaWYgKF9lbWJl
ck1ldGFsSXNfbm9uZS5kZWZhdWx0KGJlZ2luSW5kZXgpKSB7CisgICAgICBiZWdpbkluZGV4ID0g
MDsKKyAgICB9CisKKyAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoZW5kSW5kZXgp
IHx8IGVuZEluZGV4ID4gbGVuZ3RoKSB7CisgICAgICBlbmRJbmRleCA9IGxlbmd0aDsKKyAgICB9
CisKKyAgICBpZiAoYmVnaW5JbmRleCA8IDApIHsKKyAgICAgIGJlZ2luSW5kZXggPSBsZW5ndGgg
KyBiZWdpbkluZGV4OworICAgIH0KKworICAgIGlmIChlbmRJbmRleCA8IDApIHsKKyAgICAgIGVu
ZEluZGV4ID0gbGVuZ3RoICsgZW5kSW5kZXg7CisgICAgfQorCisgICAgd2hpbGUgKGJlZ2luSW5k
ZXggPCBlbmRJbmRleCkgeworICAgICAgcmV0W3JldC5sZW5ndGhdID0gb2JqZWN0QXQodGhpcywg
YmVnaW5JbmRleCsrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9LCBfTWl4aW4kY3Jl
YXRlLmluZGV4T2YgPSBmdW5jdGlvbiAob2JqZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGxlbiA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgdmFyIGlk
eDsKKworICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHN0YXJ0QXQgPSAw
OworICAgIH0KKworICAgIGlmIChzdGFydEF0IDwgMCkgeworICAgICAgc3RhcnRBdCArPSBsZW47
CisgICAgfQorCisgICAgZm9yIChpZHggPSBzdGFydEF0OyBpZHggPCBsZW47IGlkeCsrKSB7Cisg
ICAgICBpZiAob2JqZWN0QXQodGhpcywgaWR4KSA9PT0gb2JqZWN0KSB7CisgICAgICAgIHJldHVy
biBpZHg7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9LCBfTWl4aW4kY3Jl
YXRlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gKG9iamVjdCwgc3RhcnRBdCkgeworICAgIHZhciBs
ZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworICAgIHZh
ciBpZHg7CisKKyAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0QXQgPj0gbGVu
KSB7CisgICAgICBzdGFydEF0ID0gbGVuIC0gMTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRBdCA8
IDApIHsKKyAgICAgIHN0YXJ0QXQgKz0gbGVuOworICAgIH0KKworICAgIGZvciAoaWR4ID0gc3Rh
cnRBdDsgaWR4ID49IDA7IGlkeC0tKSB7CisgICAgICBpZiAob2JqZWN0QXQodGhpcywgaWR4KSA9
PT0gb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIC0xOworICB9LCBfTWl4aW4kY3JlYXRlLmFkZEFycmF5T2JzZXJ2ZXIgPSBmdW5jdGlv
biAodGFyZ2V0LCBvcHRzKSB7CisgICAgcmV0dXJuIGFkZEFycmF5T2JzZXJ2ZXIodGhpcywgdGFy
Z2V0LCBvcHRzKTsKKyAgfSwgX01peGluJGNyZWF0ZS5yZW1vdmVBcnJheU9ic2VydmVyID0gZnVu
Y3Rpb24gKHRhcmdldCwgb3B0cykgeworICAgIHJldHVybiByZW1vdmVBcnJheU9ic2VydmVyKHRo
aXMsIHRhcmdldCwgb3B0cyk7CisgIH0sIF9NaXhpbiRjcmVhdGUuaGFzQXJyYXlPYnNlcnZlcnMg
PSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g
X2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6Y2hhbmdlJykgfHwg
X2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6YmVmb3JlJyk7Cisg
IH0pLCBfTWl4aW4kY3JlYXRlLmFycmF5Q29udGVudFdpbGxDaGFuZ2UgPSBmdW5jdGlvbiAoc3Rh
cnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KSB7CisgICAgdmFyIHJlbW92aW5nLCBsaW07CisKKyAg
ICAvLyBpZiBubyBhcmdzIGFyZSBwYXNzZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hhbmdlcworICAg
IGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBzdGFydElkeCA9IDA7CisgICAg
ICByZW1vdmVBbXQgPSBhZGRBbXQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlbW92
ZUFtdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJlbW92ZUFtdCA9IC0xOworICAgICAgfQor
CisgICAgICBpZiAoYWRkQW10ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgYWRkQW10ID0gLTE7
CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMuX19lYWNoKSB7CisgICAgICB0aGlzLl9f
ZWFjaC5hcnJheVdpbGxDaGFuZ2UodGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KTsK
KyAgICB9CisKKyAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQodGhpcywgJ0BhcnJheTpi
ZWZvcmUnLCBbdGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10XSk7CisKKyAgICBpZiAo
c3RhcnRJZHggPj0gMCAmJiByZW1vdmVBbXQgPj0gMCAmJiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKSkgeworICAgICAgcmVtb3Zpbmcg
PSBbXTsKKyAgICAgIGxpbSA9IHN0YXJ0SWR4ICsgcmVtb3ZlQW10OworCisgICAgICBmb3IgKHZh
ciBpZHggPSBzdGFydElkeDsgaWR4IDwgbGltOyBpZHgrKykgeworICAgICAgICByZW1vdmluZy5w
dXNoKG9iamVjdEF0KHRoaXMsIGlkeCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBy
ZW1vdmluZyA9IHJlbW92ZUFtdDsKKyAgICB9CisKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50
V2lsbENoYW5nZShyZW1vdmluZywgYWRkQW10KTsKKworICAgIHJldHVybiB0aGlzOworICB9LCBf
TWl4aW4kY3JlYXRlLmFycmF5Q29udGVudERpZENoYW5nZSA9IGZ1bmN0aW9uIChzdGFydElkeCwg
cmVtb3ZlQW10LCBhZGRBbXQpIHsKKyAgICB2YXIgYWRkaW5nLCBsaW07CisKKyAgICBfZW1iZXJN
ZXRhbFRhZ3MubWFya09iamVjdEFzRGlydHkoX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcykpOwor
CisgICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMK
KyAgICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgeworICAgICAgc3RhcnRJZHggPSAwOwor
ICAgICAgcmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChy
ZW1vdmVBbXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICByZW1vdmVBbXQgPSAtMTsKKyAgICAg
IH0KKworICAgICAgaWYgKGFkZEFtdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGFkZEFtdCA9
IC0xOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGFydElkeCA+PSAwICYmIGFkZEFtdCA+
PSAwICYmIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9i
c2VydmVycycpKSB7CisgICAgICBhZGRpbmcgPSBbXTsKKyAgICAgIGxpbSA9IHN0YXJ0SWR4ICsg
YWRkQW10OworCisgICAgICBmb3IgKHZhciBpZHggPSBzdGFydElkeDsgaWR4IDwgbGltOyBpZHgr
KykgeworICAgICAgICBhZGRpbmcucHVzaChvYmplY3RBdCh0aGlzLCBpZHgpKTsKKyAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgYWRkaW5nID0gYWRkQW10OworICAgIH0KKworICAgIHRoaXMu
ZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlQW10LCBhZGRpbmcpOworCisgICAgaWYg
KHRoaXMuX19lYWNoKSB7CisgICAgICB0aGlzLl9fZWFjaC5hcnJheURpZENoYW5nZSh0aGlzLCBz
dGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXQpOworICAgIH0KKworICAgIF9lbWJlck1ldGFsRXZl
bnRzLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmNoYW5nZScsIFt0aGlzLCBzdGFydElkeCwgcmVt
b3ZlQW10LCBhZGRBbXRdKTsKKworICAgIHZhciBsZW5ndGggPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworICAgIHZhciBjYWNoZWRGaXJzdCA9IF9lbWJlck1l
dGFsQ29tcHV0ZWQuY2FjaGVGb3IodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7CisgICAgdmFyIGNhY2hl
ZExhc3QgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNhY2hlRm9yKHRoaXMsICdsYXN0T2JqZWN0Jyk7
CisKKyAgICBpZiAob2JqZWN0QXQodGhpcywgMCkgIT09IGNhY2hlZEZpcnN0KSB7CisgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2ZpcnN0
T2JqZWN0Jyk7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENo
YW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0QXQodGhp
cywgbGVuZ3RoIC0gMSkgIT09IGNhY2hlZExhc3QpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVy
dHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOworICAgICAg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RP
YmplY3QnKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwgX01peGluJGNyZWF0ZVsn
QGVhY2gnXSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAg
IC8vIFRPRE8gdXNlIFN5bWJvbCBvciBhZGQgdG8gbWV0YQorICAgIGlmICghdGhpcy5fX2VhY2gp
IHsKKyAgICAgIHRoaXMuX19lYWNoID0gbmV3IF9lbWJlclJ1bnRpbWVTeXN0ZW1FYWNoX3Byb3h5
LmRlZmF1bHQodGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX19lYWNoOworICB9KS52
b2xhdGlsZSgpLCBfTWl4aW4kY3JlYXRlKSk7Cit9KTsKKy8vIEVTNlRPRE86IEVtYmVyLkEKKwor
LyoqCisgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFw
cGx5IHRoaXMgbWl4aW4uCisgICBZb3VyIGFycmF5IG11c3Qgc3VwcG9ydCB0aGUgYGxlbmd0aGAg
cHJvcGVydHkuIFlvdXIgcmVwbGFjZSBtZXRob2RzIHNob3VsZAorICBzZXQgdGhpcyBwcm9wZXJ0
eSB3aGVuZXZlciBpdCBjaGFuZ2VzLgorICAgQHByb3BlcnR5IHtOdW1iZXJ9IGxlbmd0aAorICBA
cHVibGljCisqLworCisvKioKKyAgUmV0dXJucyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBgaW5k
ZXhgLiBJZiB0aGUgZ2l2ZW4gYGluZGV4YCBpcyBuZWdhdGl2ZQorICBvciBpcyBncmVhdGVyIG9y
IGVxdWFsIHRoYW4gdGhlIGFycmF5IGxlbmd0aCwgcmV0dXJucyBgdW5kZWZpbmVkYC4KKyAgIFRo
aXMgaXMgb25lIG9mIHRoZSBwcmltaXRpdmVzIHlvdSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0
IGBFbWJlci5BcnJheWAuCisgIElmIHlvdXIgb2JqZWN0IHN1cHBvcnRzIHJldHJpZXZpbmcgdGhl
IHZhbHVlIG9mIGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgpYAorICAoaS5lLiBgbXlBcnJheS5n
ZXQoMClgKSwgdGhlbiB5b3UgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCisg
IHlvdXJzZWxmLgorICAgYGBgamF2YXNjcmlwdAorICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycs
ICdkJ107CisgICBhcnIub2JqZWN0QXQoMCk7ICAgLy8gJ2EnCisgIGFyci5vYmplY3RBdCgzKTsg
ICAvLyAnZCcKKyAgYXJyLm9iamVjdEF0KC0xKTsgIC8vIHVuZGVmaW5lZAorICBhcnIub2JqZWN0
QXQoNCk7ICAgLy8gdW5kZWZpbmVkCisgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQK
KyAgYGBgCisgICBAbWV0aG9kIG9iamVjdEF0CisgIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGlu
ZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVybi4KKyAgQHJldHVybiB7Kn0gaXRlbSBhdCBpbmRleCBv
ciB1bmRlZmluZWQKKyAgQHB1YmxpYworKi8KKworLyoqCisgIFRoaXMgcmV0dXJucyB0aGUgb2Jq
ZWN0cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMsIHVzaW5nIGBvYmplY3RBdGAuCisgICBgYGBq
YXZhc2NyaXB0CisgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107CisgICBhcnIub2Jq
ZWN0c0F0KFswLCAxLCAyXSk7ICAvLyBbJ2EnLCAnYicsICdjJ10KKyAgYXJyLm9iamVjdHNBdChb
MiwgMywgNF0pOyAgLy8gWydjJywgJ2QnLCB1bmRlZmluZWRdCisgIGBgYAorICAgQG1ldGhvZCBv
YmplY3RzQXQKKyAgQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBBbiBhcnJheSBvZiBpbmRleGVzIG9m
IGl0ZW1zIHRvIHJldHVybi4KKyAgQHJldHVybiB7QXJyYXl9CisgIEBwdWJsaWMKKyAqLworCisv
LyBvdmVycmlkZXMgRW1iZXIuRW51bWVyYWJsZSB2ZXJzaW9uCisKKy8qKgorICBUaGlzIGlzIHRo
ZSBoYW5kbGVyIGZvciB0aGUgc3BlY2lhbCBhcnJheSBjb250ZW50IHByb3BlcnR5LiBJZiB5b3Ug
Z2V0CisgIHRoaXMgcHJvcGVydHksIGl0IHdpbGwgcmV0dXJuIHRoaXMuIElmIHlvdSBzZXQgdGhp
cyBwcm9wZXJ0eSB0byBhIG5ldworICBhcnJheSwgaXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50
IGNvbnRlbnQuCisgICBUaGlzIHByb3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0
eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxlYC4KKyAgIEBwcm9wZXJ0eSBbXQorICBAcmV0
dXJuIHRoaXMKKyAgQHB1YmxpYworKi8KKworLy8gb3B0aW1pemVkIHZlcnNpb24gZnJvbSBFbnVt
ZXJhYmxlCisKKy8vIEFkZCBhbnkgZXh0cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0aGF0IGFy
ZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWluIEFycmF5LgorLyoqCisgIFJldHVybnMgYSBuZXcgYXJy
YXkgdGhhdCBpcyBhIHNsaWNlIG9mIHRoZSByZWNlaXZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbgor
ICB1c2VzIHRoZSBvYnNlcnZhYmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG9iamVj
dHMgZm9yIHRoZSBuZXcKKyAgc2xpY2UuCisgICBgYGBqYXZhc2NyaXB0CisgIHZhciBhcnIgPSBb
J3JlZCcsICdncmVlbicsICdibHVlJ107CisgICBhcnIuc2xpY2UoMCk7ICAgICAgIC8vIFsncmVk
JywgJ2dyZWVuJywgJ2JsdWUnXQorICBhcnIuc2xpY2UoMCwgMik7ICAgIC8vIFsncmVkJywgJ2dy
ZWVuJ10KKyAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBbJ2dyZWVuJywgJ2JsdWUnXQorICBgYGAK
KyAgIEBtZXRob2Qgc2xpY2UKKyAgQHBhcmFtIHtOdW1iZXJ9IGJlZ2luSW5kZXggKE9wdGlvbmFs
KSBpbmRleCB0byBiZWdpbiBzbGljaW5nIGZyb20uCisgIEBwYXJhbSB7TnVtYmVyfSBlbmRJbmRl
eCAoT3B0aW9uYWwpIGluZGV4IHRvIGVuZCB0aGUgc2xpY2UgYXQgKGJ1dCBub3QgaW5jbHVkZWQp
LgorICBAcmV0dXJuIHtBcnJheX0gTmV3IGFycmF5IHdpdGggc3BlY2lmaWVkIHNsaWNlCisgIEBw
dWJsaWMKKyovCisKKy8qKgorICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0
J3MgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgSWYgbm8gYHN0YXJ0QXRgIGFyZ3VtZW50IGlzIGdpdmVu
LCB0aGUgc3RhcnRpbmcgbG9jYXRpb24gdG8KKyAgc2VhcmNoIGlzIDAuIElmIGl0J3MgbmVnYXRp
dmUsIHdpbGwgY291bnQgYmFja3dhcmQgZnJvbQorICB0aGUgZW5kIG9mIHRoZSBhcnJheS4gUmV0
dXJucyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KKyAgIGBgYGphdmFzY3JpcHQKKyAgdmFyIGFy
ciA9IFsnYScsICdiJywgJ2MnLCAnZCcsICdhJ107CisgICBhcnIuaW5kZXhPZignYScpOyAgICAg
ICAvLyAgMAorICBhcnIuaW5kZXhPZigneicpOyAgICAgICAvLyAtMQorICBhcnIuaW5kZXhPZign
YScsIDIpOyAgICAvLyAgNAorICBhcnIuaW5kZXhPZignYScsIC0xKTsgICAvLyAgNAorICBhcnIu
aW5kZXhPZignYicsIDMpOyAgICAvLyAtMQorICBhcnIuaW5kZXhPZignYScsIDEwMCk7ICAvLyAt
MQorICBgYGAKKyAgIEBtZXRob2QgaW5kZXhPZgorICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRo
ZSBpdGVtIHRvIHNlYXJjaCBmb3IKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwg
c3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKKyAgQHJldHVybiB7TnVtYmVy
fSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAgQHB1YmxpYworKi8KKworLyoqCisgIFJldHVy
bnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QncyBsYXN0IG9jY3VycmVuY2UuCisgIElm
IG5vIGBzdGFydEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHNlYXJjaCBzdGFydHMgZnJvbQor
ICB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgaXQncyBuZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNrd2Fy
ZAorICBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlz
IGZvdW5kLgorICAgYGBgamF2YXNjcmlwdAorICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycsICdk
JywgJ2EnXTsKKyAgIGFyci5sYXN0SW5kZXhPZignYScpOyAgICAgICAvLyAgNAorICBhcnIubGFz
dEluZGV4T2YoJ3onKTsgICAgICAgLy8gLTEKKyAgYXJyLmxhc3RJbmRleE9mKCdhJywgMik7ICAg
IC8vICAwCisgIGFyci5sYXN0SW5kZXhPZignYScsIC0xKTsgICAvLyAgNAorICBhcnIubGFzdElu
ZGV4T2YoJ2InLCAzKTsgICAgLy8gIDEKKyAgYXJyLmxhc3RJbmRleE9mKCdhJywgMTAwKTsgIC8v
ICA0CisgIGBgYAorICAgQG1ldGhvZCBsYXN0SW5kZXhPZgorICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3IKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0
aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKKyAgQHJldHVybiB7
TnVtYmVyfSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAgQHB1YmxpYworKi8KKworLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
Ly8gQVJSQVkgT0JTRVJWRVJTCisvLworCisvKioKKyAgQWRkcyBhbiBhcnJheSBvYnNlcnZlciB0
byB0aGUgcmVjZWl2aW5nIGFycmF5LiBUaGUgYXJyYXkgb2JzZXJ2ZXIgb2JqZWN0CisgIG5vcm1h
bGx5IG11c3QgaW1wbGVtZW50IHR3byBtZXRob2RzOgorICAgKiBgYXJyYXlXaWxsQ2hhbmdlKG9i
c2VydmVkT2JqLCBzdGFydCwgcmVtb3ZlQ291bnQsIGFkZENvdW50KWAgLSBUaGlzIG1ldGhvZCB3
aWxsIGJlCisgICAgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KKyAg
KiBgYXJyYXlEaWRDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291
bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICBjYWxsZWQganVzdCBhZnRlciB0aGUgYXJy
YXkgaXMgbW9kaWZpZWQuCisgICBCb3RoIGNhbGxiYWNrcyB3aWxsIGJlIHBhc3NlZCB0aGUgb2Jz
ZXJ2ZWQgb2JqZWN0LCBzdGFydGluZyBpbmRleCBvZiB0aGUKKyAgY2hhbmdlIGFzIHdlbGwgYXMg
YSBjb3VudCBvZiB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNl
CisgIHRoZXNlIGNhbGxiYWNrcyB0byBvcHRpb25hbGx5IGluc3BlY3QgdGhlIGFycmF5IGR1cmlu
ZyB0aGUgY2hhbmdlLCBjbGVhcgorICBjYWNoZXMsIG9yIGRvIGFueSBvdGhlciBib29ra2VlcGlu
ZyBuZWNlc3NhcnkuCisgICBJbiBhZGRpdGlvbiB0byBwYXNzaW5nIGEgdGFyZ2V0LCB5b3UgY2Fu
IGFsc28gaW5jbHVkZSBhbiBvcHRpb25zIGhhc2gKKyAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3Zl
cnJpZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiB0aGUKKyAgdGFy
Z2V0LgorICAgQG1ldGhvZCBhZGRBcnJheU9ic2VydmVyCisgIEBwYXJhbSB7T2JqZWN0fSB0YXJn
ZXQgVGhlIG9ic2VydmVyIG9iamVjdC4KKyAgQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwg
aGFzaCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nCisgICAgYHdpbGxDaGFuZ2Vg
IGFuZCBgZGlkQ2hhbmdlYCBvcHRpb24uCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgorICBAcHVibGljCisqLworCisvKioKKyAgUmVtb3ZlcyBhbiBhcnJheSBvYnNlcnZlciBmcm9t
IHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKKyAgcmVnaXN0ZXJlZC4gQ2Fs
bGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIG9iamVjdCB3aWxs
CisgIGhhdmUgbm8gZWZmZWN0LgorICAgQG1ldGhvZCByZW1vdmVBcnJheU9ic2VydmVyCisgIEBw
YXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBvYnNlcnZpbmcgdGhlIGFycmF5LgorICBA
cGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBoYXNoIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9u
cyBpbmNsdWRpbmcKKyAgICBgd2lsbENoYW5nZWAgYW5kIGBkaWRDaGFuZ2VgIG9wdGlvbi4KKyAg
QHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgIEBwdWJsaWMKKyovCisKKy8qKgorICBC
ZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdh
dGNoaW5nIGNoYW5nZXMKKyAgb24gdGhlIGFycmF5LgorICAgQHByb3BlcnR5IHtCb29sZWFufSBo
YXNBcnJheU9ic2VydmVycworICBAcHVibGljCisqLworCisvKioKKyAgSWYgeW91IGFyZSBpbXBs
ZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlz
CisgIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgY29udGVudCBjaGFuZ2VzIHRvIG5vdGlm
eSBhbnkgb2JzZXJ2ZXJzIGFuZAorICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMu
IFBhc3MgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKKyAgYXMgd2VsbCBhcyBhIGRl
bHRhIG9mIHRoZSBhbW91bnRzIHRvIGNoYW5nZS4KKyAgIEBtZXRob2QgYXJyYXlDb250ZW50V2ls
bENoYW5nZQorICBAcGFyYW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5nIGluZGV4IGlu
IHRoZSBhcnJheSB0aGF0IHdpbGwgY2hhbmdlLgorICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlQW10
IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHlvdQorICAgIHBh
c3MgYG51bGxgIGFzc3VtZXMgMAorICBAcGFyYW0ge051bWJlcn0gYWRkQW10IFRoZSBudW1iZXIg
b2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkLiBJZiB5b3UKKyAgICBwYXNzIGBudWxsYCBhc3N1
bWVzIDAuCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICBAcHVibGljCisqLwor
CisvKioKKyAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMg
YEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCisgIG1ldGhvZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBj
b250ZW50IGNoYW5nZXMgdG8gbm90aWZ5IGFueSBvYnNlcnZlcnMgYW5kCisgIGludmFsaWRhdGUg
YW55IHJlbGF0ZWQgcHJvcGVydGllcy4gUGFzcyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGNo
YW5nZQorICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMgdG8gY2hhbmdlLgorICAg
QG1ldGhvZCBhcnJheUNvbnRlbnREaWRDaGFuZ2UKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4
IFRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdGhhdCBkaWQgY2hhbmdlLgorICBAcGFy
YW0ge051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92
ZWQuIElmIHlvdQorICAgIHBhc3MgYG51bGxgIGFzc3VtZXMgMAorICBAcGFyYW0ge051bWJlcn0g
YWRkQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLiBJZiB5b3UKKyAgICBw
YXNzIGBudWxsYCBhc3N1bWVzIDAuCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgor
ICBAcHVibGljCisqLworCisvKioKKyAgUmV0dXJucyBhIHNwZWNpYWwgb2JqZWN0IHRoYXQgY2Fu
IGJlIHVzZWQgdG8gb2JzZXJ2ZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMKKyAgb24gdGhlIGFycmF5
LiBKdXN0IGdldCBhbiBlcXVpdmFsZW50IHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IGFuZCBpdCB3
aWxsCisgIHJldHVybiBhbiBlbnVtZXJhYmxlIHRoYXQgbWFwcyBhdXRvbWF0aWNhbGx5IHRvIHRo
ZSBuYW1lZCBrZXkgb24gdGhlCisgIG1lbWJlciBvYmplY3RzLgorICAgYEBlYWNoYCBzaG91bGQg
b25seSBiZSB1c2VkIGluIGEgbm9uLXRlcm1pbmFsIGNvbnRleHQuIEV4YW1wbGU6CisgICBgYGBq
YXZhc2NyaXB0CisgIG15TWV0aG9kOiBjb21wdXRlZCgncG9zdHMuQGVhY2guYXV0aG9yJywgZnVu
Y3Rpb24oKXsKKyAgICAuLi4KKyAgfSk7CisgIGBgYAorICAgSWYgeW91IG1lcmVseSB3YW50IHRv
IHdhdGNoIGZvciB0aGUgYXJyYXkgYmVpbmcgY2hhbmdlZCwgbGlrZSBhbiBvYmplY3QgYmVpbmcK
KyAgcmVwbGFjZWQsIGFkZGVkIG9yIHJlbW92ZWQsIHVzZSBgW11gIGluc3RlYWQgb2YgYEBlYWNo
YC4KKyAgIGBgYGphdmFzY3JpcHQKKyAgbXlNZXRob2Q6IGNvbXB1dGVkKCdwb3N0cy5bXScsIGZ1
bmN0aW9uKCl7CisgICAgLi4uCisgIH0pOworICBgYGAKKyAgIEBwcm9wZXJ0eSBAZWFjaAorICBA
cHVibGljCisqLworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb21wYXJhYmxlJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbE1peGluKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvKioKKyAgICBJbXBsZW1lbnRz
IHNvbWUgc3RhbmRhcmQgbWV0aG9kcyBmb3IgY29tcGFyaW5nIG9iamVjdHMuIEFkZCB0aGlzIG1p
eGluIHRvCisgICAgYW55IGNsYXNzIHlvdSBjcmVhdGUgdGhhdCBjYW4gY29tcGFyZSBpdHMgaW5z
dGFuY2VzLgorICAKKyAgICBZb3Ugc2hvdWxkIGltcGxlbWVudCB0aGUgYGNvbXBhcmUoKWAgbWV0
aG9kLgorICAKKyAgICBAY2xhc3MgQ29tcGFyYWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
ICBAc2luY2UgRW1iZXIgMC45CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0
ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworCisgICAgLyoqCisgICAgICBfX1Jl
cXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1p
eGluLgorICAgICAgIE92ZXJyaWRlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJp
c29uIG9mIHRoZSB0d28gcGFyYW1ldGVycy4gVGhlCisgICAgICBjb21wYXJlIG1ldGhvZCBzaG91
bGQgcmV0dXJuOgorICAgICAgIC0gYC0xYCBpZiBgYSA8IGJgCisgICAgICAtIGAwYCBpZiBgYSA9
PSBiYAorICAgICAgLSBgMWAgaWYgYGEgPiBiYAorICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRp
b24gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIGNvbXBhcmUKKyAgICAgIEBw
YXJhbSBhIHtPYmplY3R9IHRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQorICAgICAgQHBhcmFt
IGIge09iamVjdH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQorICAgICAgQHJldHVybiB7
TnVtYmVyfSB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgY29tcGFyZTogbnVsbAorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1l
L21peGlucy9jb250YWluZXJfcHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xv
b3AnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsUnVuX2xvb3AsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsTWl4aW4pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmJ1aWxkRmFrZUNvbnRh
aW5lcldpdGhEZXByZWNhdGlvbnMgPSBidWlsZEZha2VDb250YWluZXJXaXRoRGVwcmVjYXRpb25z
OworCisgIC8qKgorICAgIENvbnRhaW5lclByb3h5TWl4aW4gaXMgdXNlZCB0byBwcm92aWRlIHB1
YmxpYyBhY2Nlc3MgdG8gc3BlY2lmaWMKKyAgICBjb250YWluZXIgZnVuY3Rpb25hbGl0eS4KKyAg
CisgICAgQGNsYXNzIENvbnRhaW5lclByb3h5TWl4aW4KKyAgICBAcHJpdmF0ZQorICAqLworICBl
eHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgLyoq
CisgICAgIFRoZSBjb250YWluZXIgc3RvcmVzIHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAg
QHByb3BlcnR5IHtFbWJlci5Db250YWluZXJ9IF9fY29udGFpbmVyX18KKyAgICAgKi8KKyAgICBf
X2NvbnRhaW5lcl9fOiBudWxsLAorCisgICAgLyoqCisgICAgIFJldHVybnMgYW4gb2JqZWN0IHRo
YXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBvd25lciB0byBhCisgICAgIG1hbnVhbGx5IGNy
ZWF0ZWQgaW5zdGFuY2UuCisgICAgICBFeGFtcGxlOgorICAgICAgYGBgCisgICAgIGxldCBvd25l
ciA9IEVtYmVyLmdldE93bmVyKHRoaXMpOworICAgICAgVXNlci5jcmVhdGUoCisgICAgICAgb3du
ZXIub3duZXJJbmplY3Rpb24oKSwKKyAgICAgICB7IHVzZXJuYW1lOiAncndqYmx1ZScgfQorICAg
ICApCisgICAgIGBgYAorICAgICAgQHB1YmxpYworICAgICBAbWV0aG9kIG93bmVySW5qZWN0aW9u
CisgICAgIEByZXR1cm4ge09iamVjdH0KKyAgICAqLworICAgIG93bmVySW5qZWN0aW9uOiBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5fX2NvbnRhaW5lcl9fLm93bmVySW5qZWN0aW9u
KCk7CisgICAgfSwKKworICAgIC8qKgorICAgICBHaXZlbiBhIGZ1bGxOYW1lIHJldHVybiBhIGNv
cnJlc3BvbmRpbmcgaW5zdGFuY2UuCisgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgZm9y
IGxvb2t1cCB0byByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgIFRoZSBzaW5nbGV0
b24gaXMgc2NvcGVkIHRvIHRoZSBjb250YWluZXIsIGFsbG93aW5nIG11bHRpcGxlIGNvbnRhaW5l
cnMKKyAgICAgdG8gYWxsIGhhdmUgdGhlaXIgb3duIGxvY2FsbHkgc2NvcGVkIHNpbmdsZXRvbnMu
CisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5ldyBSZWdpc3RyeSgp
OworICAgICB2YXIgY29udGFpbmVyID0gcmVnaXN0cnkuY29udGFpbmVyKCk7CisgICAgICByZWdp
c3RyeS5yZWdpc3RlcignYXBpOnR3aXR0ZXInLCBUd2l0dGVyKTsKKyAgICAgIHZhciB0d2l0dGVy
ID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInKTsKKyAgICAgIHR3aXR0ZXIgaW5zdGFu
Y2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCisgICAgICAvLyBieSBkZWZhdWx0IHRoZSBjb250YWlu
ZXIgd2lsbCByZXR1cm4gc2luZ2xldG9ucworICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIu
bG9va3VwKCdhcGk6dHdpdHRlcicpOworICAgICB0d2l0dGVyMiBpbnN0YW5jZW9mIFR3aXR0ZXI7
IC8vID0+IHRydWUKKyAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IHRydWUKKyAgICAg
YGBgCisgICAgICBJZiBzaW5nbGV0b25zIGFyZSBub3Qgd2FudGVkIGFuIG9wdGlvbmFsIGZsYWcg
Y2FuIGJlIHByb3ZpZGVkIGF0IGxvb2t1cC4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFy
IHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHZhciBjb250YWluZXIgPSByZWdpc3Ry
eS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3
aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicsIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVy
Lmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgICB0d2l0
dGVyID09PSB0d2l0dGVyMjsgLy89PiBmYWxzZQorICAgICBgYGAKKyAgICAgIEBwdWJsaWMKKyAg
ICAgQG1ldGhvZCBsb29rdXAKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgIEByZXR1cm4ge2FueX0KKyAgICAgKi8KKyAgICBs
b29rdXA6IGZ1bmN0aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgcmV0dXJuIHRoaXMu
X19jb250YWluZXJfXy5sb29rdXAoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgR2l2ZW4gYSBmdWxsTmFtZSByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9y
eS4KKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgX2xvb2t1cEZhY3RvcnkKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge2FueX0KKyAgICAgKi8KKyAgICBf
bG9va3VwRmFjdG9yeTogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRpb25zKSB7CisgICAgICByZXR1
cm4gdGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUsIG9wdGlvbnMpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgKi8KKyAgICB3aWxsRGVzdHJv
eTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKKworICAgICAgaWYgKHRoaXMuX19jb250YWluZXJfXykgeworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQodGhpcy5fX2NvbnRhaW5lcl9fLCAnZGVzdHJveScpOworICAgICAg
fQorICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rpb24gYnVpbGRGYWtlQ29udGFpbmVyV2l0aERlcHJl
Y2F0aW9ucyhjb250YWluZXIpIHsKKyAgICB2YXIgZmFrZUNvbnRhaW5lciA9IHt9OworICAgIHZh
ciBwcm9wZXJ0eU1hcHBpbmdzID0geworICAgICAgbG9va3VwOiAnbG9va3VwJywKKyAgICAgIGxv
b2t1cEZhY3Rvcnk6ICdfbG9va3VwRmFjdG9yeScKKyAgICB9OworCisgICAgZm9yICh2YXIgY29u
dGFpbmVyUHJvcGVydHkgaW4gcHJvcGVydHlNYXBwaW5ncykgeworICAgICAgZmFrZUNvbnRhaW5l
cltjb250YWluZXJQcm9wZXJ0eV0gPSBidWlsZEZha2VDb250YWluZXJGdW5jdGlvbihjb250YWlu
ZXIsIGNvbnRhaW5lclByb3BlcnR5LCBwcm9wZXJ0eU1hcHBpbmdzW2NvbnRhaW5lclByb3BlcnR5
XSk7CisgICAgfQorCisgICAgcmV0dXJuIGZha2VDb250YWluZXI7CisgIH0KKworICBmdW5jdGlv
biBidWlsZEZha2VDb250YWluZXJGdW5jdGlvbihjb250YWluZXIsIGNvbnRhaW5lclByb3BlcnR5
LCBvd25lclByb3BlcnR5KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyB0aGUgaW5qZWN0ZWQgYGNvbnRhaW5lcmAgaXMg
ZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgYGdldE93bmVyYCBoZWxwZXIgdG8gYWNjZXNzIHRo
ZSBvd25lciBvZiB0aGlzIG9iamVjdCBhbmQgdGhlbiBjYWxsIGAnICsgb3duZXJQcm9wZXJ0eSAr
ICdgIGluc3RlYWQuJywgZmFsc2UsIHsKKyAgICAgICAgaWQ6ICdlbWJlci1hcHBsaWNhdGlvbi5p
bmplY3RlZC1jb250YWluZXInLAorICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgdXJs
OiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19pbmplY3RlZC1jb250
YWluZXItYWNjZXNzJworICAgICAgfSk7CisgICAgICByZXR1cm4gY29udGFpbmVyW2NvbnRhaW5l
clByb3BlcnR5XS5hcHBseShjb250YWluZXIsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRyb2xsZXInLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItbWV0YWwvYWxpYXMnLCAnZW1iZXItcnVudGltZS9t
aXhpbnMvYWN0aW9uX2hhbmRsZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29udHJvbGxlcl9j
b250ZW50X21vZGVsX2FsaWFzX2RlcHJlY2F0aW9uJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbEFsaWFzLCBfZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9u
X2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9sbGVyX2NvbnRlbnRfbW9kZWxfYWxp
YXNfZGVwcmVjYXRpb24pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIEBjbGFzcyBD
b250cm9sbGVyTWl4aW4KKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuQWN0
aW9uSGFuZGxlcgorICAgIEBwcml2YXRlCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJl
ck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxl
ci5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxlcl9jb250ZW50X21vZGVsX2Fs
aWFzX2RlcHJlY2F0aW9uLmRlZmF1bHQsIHsKKyAgICAvKiBkdWNrdHlwZSBhcyBhIGNvbnRyb2xs
ZXIgKi8KKyAgICBpc0NvbnRyb2xsZXI6IHRydWUsCisKKyAgICAvKioKKyAgICAgIFRoZSBvYmpl
Y3QgdG8gd2hpY2ggYWN0aW9ucyBmcm9tIHRoZSB2aWV3IHNob3VsZCBiZSBzZW50LgorICAgICAg
IEZvciBleGFtcGxlLCB3aGVuIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZSB1c2VzIHRoZSBge3thY3Rp
b259fWAgaGVscGVyLAorICAgICAgaXQgd2lsbCBhdHRlbXB0IHRvIHNlbmQgdGhlIGFjdGlvbiB0
byB0aGUgdmlldydzIGNvbnRyb2xsZXIncyBgdGFyZ2V0YC4KKyAgICAgICBCeSBkZWZhdWx0LCB0
aGUgdmFsdWUgb2YgdGhlIHRhcmdldCBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHJvdXRlciwgYW5k
CisgICAgICBpcyBpbmplY3RlZCB3aGVuIGEgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQuIFRo
aXMgaW5qZWN0aW9uIGlzIGFwcGxpZWQKKyAgICAgIGFzIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9u
J3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gSW4gbW9zdCBjYXNlcyB0aGUKKyAgICAgIGB0YXJn
ZXRgIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gdGhlIGxvZ2ljYWwgY29u
c3VtZXIgb2YKKyAgICAgIGFjdGlvbnMgZm9yIHRoZSBjb250cm9sbGVyLgorICAgICAgIEBwcm9w
ZXJ0eSB0YXJnZXQKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIHRhcmdldDogbnVsbCwKKworICAgIHBhcmVudENvbnRyb2xsZXI6IG51bGwsCisKKyAgICBz
dG9yZTogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIGNvbnRyb2xsZXIncyBjdXJyZW50IG1v
ZGVsLiBXaGVuIHJldHJpZXZpbmcgb3IgbW9kaWZ5aW5nIGEgY29udHJvbGxlcidzCisgICAgICBt
b2RlbCwgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY29udGVu
dGAgcHJvcGVydHkuCisgICAgICAgQHByb3BlcnR5IG1vZGVsCisgICAgICBAcHVibGljCisgICAg
ICovCisgICAgbW9kZWw6IG51bGwsCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgKi8K
KyAgICBjb250ZW50OiBfZW1iZXJNZXRhbEFsaWFzLmRlZmF1bHQoJ21vZGVsJykKKworICB9KTsK
K30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb250cm9sbGVyX2NvbnRlbnRfbW9k
ZWxfYWxpYXNfZGVwcmVjYXRpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAn
ZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlck1ldGFsTWl4aW4pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qCisgICAgVGhlIENv
bnRyb2xsZXJDb250ZW50TW9kZWxBbGlhc0RlcHJlY2F0aW9uIG1peGluIGlzIHVzZWQgdG8gcHJv
dmlkZSBhIHVzZWZ1bAorICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBzcGVjaWZ5aW5nIGBj
b250ZW50YCBkaXJlY3RseSBvbiBhIGBFbWJlci5Db250cm9sbGVyYAorICAgICh3aXRob3V0IGFs
c28gc3BlY2lmeWluZyBgbW9kZWxgKS4KKyAgCisgICAgRW1iZXIgdmVyc2lvbnMgcHJpb3IgdG8g
MS43IHVzZWQgYG1vZGVsYCBhcyBhbiBhbGlhcyBvZiBgY29udGVudGAsIGJ1dCBkdWUgdG8KKyAg
ICBtdWNoIGNvbmZ1c2lvbiB0aGlzIGFsaWFzIHdhcyByZXZlcnNlZCAoc28gYGNvbnRlbnRgIGlz
IG5vdyBhbiBhbGlhcyBvZiBgbW9kZWwpLgorICAKKyAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIG1h
bnkgY2F2ZWF0cyB3aXRoIG1vZGVsL2NvbnRlbnQsIGFuZCBhbHNvIHNldHMgYQorICAgIHNpbXBs
ZSBncm91bmQgcnVsZTogTmV2ZXIgc2V0IGEgY29udHJvbGxlcnMgY29udGVudCwgcmF0aGVyIGFs
d2F5cyBzZXQKKyAgICBpdHMgbW9kZWwgYW5kIGVtYmVyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5n
LgorICAKKyAgICBVc2VkIGludGVybmFsbHkgYnkgRW1iZXIgaW4gYEVtYmVyLkNvbnRyb2xsZXJg
LgorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0
ZSh7CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIE1vdmVzIGBjb250ZW50YCB0byBg
bW9kZWxgICBhdCBleHRlbmQgdGltZSBpZiBhIGBtb2RlbGAgaXMgbm90IGFsc28gc3BlY2lmaWVk
LgorICAgICAgIE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseSBtb2RpZmllcyB0aGUgbWl4aW4gdGhl
bXNlbHZlcywgd2hpY2ggaXMgdGVjaG5pY2FsbHkKKyAgICAgIGR1YmlvdXMgYnV0IGlzIHByYWN0
aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZQorICAg
ICAgZnV0dXJlLgorICAgICAgIEBtZXRob2Qgd2lsbE1lcmdlTWl4aW4KKyAgICAgIEBzaW5jZSAx
LjQuMAorICAgICovCisgICAgd2lsbE1lcmdlTWl4aW46IGZ1bmN0aW9uIChwcm9wcykgeworICAg
ICAgLy8gQ2FsbGluZyBzdXBlciBpcyBvbmx5IE9LIGhlcmUgc2luY2Ugd2UgS05PVyB0aGF0Cisg
ICAgICAvLyB0aGVyZSBpcyBhbm90aGVyIE1peGluIGxvYWRlZCBmaXJzdC4KKyAgICAgIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIHZhciBtb2RlbFNwZWNpZmll
ZCA9ICEhcHJvcHMubW9kZWw7CisKKyAgICAgIGlmIChwcm9wcy5jb250ZW50ICYmICFtb2RlbFNw
ZWNpZmllZCkgeworICAgICAgICBwcm9wcy5tb2RlbCA9IHByb3BzLmNvbnRlbnQ7CisgICAgICAg
IGRlbGV0ZSBwcm9wc1snY29udGVudCddOworCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdEbyBub3Qgc3BlY2lmeSBgY29udGVudGAgb24gYSBDb250cm9sbGVyLCB1c2UgYG1v
ZGVsYCBpbnN0ZWFkLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItcnVudGltZS53aWxsLW1lcmdlLW1p
eGluJywgdW50aWw6ICczLjAuMCcgfSk7CisgICAgICB9CisgICAgfQorICB9KTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb3B5YWJsZScsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvbWl4
aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvZnJlZXphYmxlJywgJ2VtYmVyLW1ldGFsL2Vycm9y
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZU1peGluc0ZyZWV6YWJsZSwg
X2VtYmVyTWV0YWxFcnJvcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgSW1w
bGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvcHlpbmcgYW4gb2JqZWN0LiBBZGQg
dGhpcyBtaXhpbiB0bworICAgIGFueSBvYmplY3QgeW91IGNyZWF0ZSB0aGF0IGNhbiBjcmVhdGUg
YSBjb3B5IG9mIGl0c2VsZi4gVGhpcyBtaXhpbiBpcworICAgIGFkZGVkIGF1dG9tYXRpY2FsbHkg
dG8gdGhlIGJ1aWx0LWluIGFycmF5LgorICAKKyAgICBZb3Ugc2hvdWxkIGdlbmVyYWxseSBpbXBs
ZW1lbnQgdGhlIGBjb3B5KClgIG1ldGhvZCB0byByZXR1cm4gYSBjb3B5IG9mIHRoZQorICAgIHJl
Y2VpdmVyLgorICAKKyAgICBOb3RlIHRoYXQgYGZyb3plbkNvcHkoKWAgd2lsbCBvbmx5IHdvcmsg
aWYgeW91IGFsc28gaW1wbGVtZW50CisgICAgYEVtYmVyLkZyZWV6YWJsZWAuCisgIAorICAgIEBj
bGFzcyBDb3B5YWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAc2luY2UgRW1iZXIgMC45
CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhp
bi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBp
bXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBwbHkgdGhpcyBtaXhpbi4KKyAgICAgICBPdmVycmlk
ZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNlaXZlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlv
biByYWlzZXMKKyAgICAgIGFuIGV4Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIGNvcHkKKyAgICAg
IEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBpZiBgdHJ1ZWAsIGEgZGVlcCBjb3B5IG9mIHRoZSBvYmpl
Y3Qgc2hvdWxkIGJlIG1hZGUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gY29weSBvZiByZWNlaXZl
cgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNvcHk6IG51bGwsCisKKyAgICAvKioKKyAg
ICAgIElmIHRoZSBvYmplY3QgaW1wbGVtZW50cyBgRW1iZXIuRnJlZXphYmxlYCwgdGhlbiB0aGlz
IHdpbGwgcmV0dXJuIGEgbmV3CisgICAgICBjb3B5IGlmIHRoZSBvYmplY3QgaXMgbm90IGZyb3pl
biBhbmQgdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgZnJvemVuLgorICAgICAgIFJhaXNl
cyBhbiBleGNlcHRpb24gaWYgeW91IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIGEgb2JqZWN0
IHRoYXQgZG9lcworICAgICAgbm90IHN1cHBvcnQgZnJlZXppbmcuCisgICAgICAgWW91IHNob3Vs
ZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IHdhbnQgYSBjb3B5IG9mIGEgZnJlZXphYmxl
IG9iamVjdAorICAgICAgc2luY2UgYSBmcmVlemFibGUgb2JqZWN0IGNhbiBzaW1wbHkgcmV0dXJu
IGl0c2VsZiB3aXRob3V0IGFjdHVhbGx5CisgICAgICBjb25zdW1pbmcgbW9yZSBtZW1vcnkuCisg
ICAgICAgQG1ldGhvZCBmcm96ZW5Db3B5CisgICAgICBAcmV0dXJuIHtPYmplY3R9IGNvcHkgb2Yg
cmVjZWl2ZXIgb3IgcmVjZWl2ZXIKKyAgICAgIEBkZXByZWNhdGVkIFVzZSBgT2JqZWN0LmZyZWV6
ZWAgaW5zdGVhZC4KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmcm96ZW5Db3B5OiBmdW5j
dGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnYGZyb3plbkNvcHlg
IGlzIGRlcHJlY2F0ZWQsIHVzZSBgT2JqZWN0LmZyZWV6ZWAgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJ1bnRpbWUuZnJvemVuLWNvcHknLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAg
IGlmIChfZW1iZXJSdW50aW1lTWl4aW5zRnJlZXphYmxlLkZyZWV6YWJsZSAmJiBfZW1iZXJSdW50
aW1lTWl4aW5zRnJlZXphYmxlLkZyZWV6YWJsZS5kZXRlY3QodGhpcykpIHsKKyAgICAgICAgcmV0
dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNGcm96ZW4nKSA/IHRoaXMg
OiB0aGlzLmNvcHkoKS5mcmVlemUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5l
dyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQodGhpcyArICcgZG9lcyBub3Qgc3VwcG9ydCBmcmVl
emluZycpOworICAgICAgfQorICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGlt
ZS9taXhpbnMvZW51bWVyYWJsZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9n
ZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2Vt
YmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2Vt
cHR5X29iamVjdCcsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLXJ1bnRpbWUvY29tcGFyZScs
ICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LCBfZW1iZXJN
ZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cywgX2VtYmVyTWV0YWxFdmVu
dHMsIF9lbWJlclJ1bnRpbWVDb21wYXJlLCBfcmVxdWlyZSkgeworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIEhF
TFBFUlMKKyAgLy8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIF9lbWJlckEgPSB1bmRlZmlu
ZWQ7CisKKyAgZnVuY3Rpb24gZW1iZXJBKCkgeworICAgIHJldHVybiAoX2VtYmVyQSB8fCAoX2Vt
YmVyQSA9IF9yZXF1aXJlLmRlZmF1bHQoJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2ZV9hcnJh
eScpLkEpKSgpOworICB9CisKKyAgdmFyIGNvbnRleHRzID0gW107CisKKyAgZnVuY3Rpb24gcG9w
Q3R4KCkgeworICAgIHJldHVybiBjb250ZXh0cy5sZW5ndGggPT09IDAgPyB7fSA6IGNvbnRleHRz
LnBvcCgpOworICB9CisKKyAgZnVuY3Rpb24gcHVzaEN0eChjdHgpIHsKKyAgICBjb250ZXh0cy5w
dXNoKGN0eCk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBpdGVyKGtleSwg
dmFsdWUpIHsKKyAgICB2YXIgdmFsdWVQcm92aWRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDI7
CisKKyAgICBmdW5jdGlvbiBpKGl0ZW0pIHsKKyAgICAgIHZhciBjdXIgPSBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQoaXRlbSwga2V5KTsKKyAgICAgIHJldHVybiB2YWx1ZVByb3ZpZGVkID8g
dmFsdWUgPT09IGN1ciA6ICEhY3VyOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAg
LyoqCisgICAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIGltcGxlbWVu
dGVkIGJ5IGVudW1lcmFibGUgb2JqZWN0cworICAgIGluIEVtYmVyLiBNb3N0IG9mIHRoZXNlIG1l
dGhvZHMgZm9sbG93IHRoZSBzdGFuZGFyZCBBcnJheSBpdGVyYXRpb24KKyAgICBBUEkgZGVmaW5l
ZCB1cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGZlYXR1
cmVzIHRoYXQKKyAgICBjYW5ub3QgYmUgZW11bGF0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgSmF2
YVNjcmlwdCkuCisgIAorICAgIFRoaXMgbWl4aW4gaXMgYXBwbGllZCBhdXRvbWF0aWNhbGx5IHRv
IHRoZSBBcnJheSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlvdQorICAgIGNhbiB1c2UgYW55IG9m
IHRoZXNlIG1ldGhvZHMgb24gc2ltcGxlIGFycmF5cy4gSWYgQXJyYXkgYWxyZWFkeSBpbXBsZW1l
bnRzCisgICAgb25lIG9mIHRoZXNlIG1ldGhvZHMsIHRoZSBtaXhpbiB3aWxsIG5vdCBvdmVycmlk
ZSB0aGVtLgorICAKKyAgICAjIyBXcml0aW5nIFlvdXIgT3duIEVudW1lcmFibGUKKyAgCisgICAg
VG8gbWFrZSB5b3VyIG93biBjdXN0b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5lZWQgdHdvIGl0
ZW1zOgorICAKKyAgICAxLiBZb3UgbXVzdCBoYXZlIGEgbGVuZ3RoIHByb3BlcnR5LiBUaGlzIHBy
b3BlcnR5IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIKKyAgICAgICB0aGUgbnVtYmVyIG9mIGl0ZW1z
IGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdlcy4gSWYgeW91IHVzZSB0aGlzCisgICAg
ICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFzcywgeW91IHNob3VsZCBiZSBzdXJlIHRv
IGNoYW5nZSB0aGUgbGVuZ3RoCisgICAgICAgcHJvcGVydHkgdXNpbmcgYHNldCgpLmAKKyAgCisg
ICAgMi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9jdW1lbnRhdGlv
bi4KKyAgCisgICAgT25jZSB5b3UgaGF2ZSB0aGVzZSB0d28gbWV0aG9kcyBpbXBsZW1lbnRlZCwg
YXBwbHkgdGhlIGBFbWJlci5FbnVtZXJhYmxlYCBtaXhpbgorICAgIHRvIHlvdXIgY2xhc3MgYW5k
IHlvdSB3aWxsIGJlIGFibGUgdG8gZW51bWVyYXRlIHRoZSBjb250ZW50cyBvZiB5b3VyIG9iamVj
dAorICAgIGxpa2UgYW55IG90aGVyIGNvbGxlY3Rpb24uCisgIAorICAgICMjIFVzaW5nIEVtYmVy
IEVudW1lcmF0aW9uIHdpdGggT3RoZXIgTGlicmFyaWVzCisgIAorICAgIE1hbnkgb3RoZXIgbGli
cmFyaWVzIHByb3ZpZGUgc29tZSBraW5kIG9mIGl0ZXJhdG9yIG9yIGVudW1lcmF0aW9uIGxpa2UK
KyAgICBmYWNpbGl0eS4gVGhpcyBpcyBvZnRlbiB3aGVyZSB0aGUgbW9zdCBjb21tb24gQVBJIGNv
bmZsaWN0cyBvY2N1ci4KKyAgICBFbWJlcidzIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBhcyBmcmll
bmRseSBhcyBwb3NzaWJsZSB3aXRoIG90aGVyCisgICAgbGlicmFyaWVzIGJ5IGltcGxlbWVudGlu
ZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkgY29ycmVzcG9uZCB0byB0aGUKKyAgICBKYXZhU2Ny
aXB0IDEuOCBBUEkuCisgIAorICAgIEBjbGFzcyBFbnVtZXJhYmxlCisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAcHJpdmF0ZQorICAqLworICB2YXIgRW51
bWVyYWJsZSA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAg
ICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBwbHkg
dGhpcyBtaXhpbi4KKyAgICAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbWFrZSB5b3VyIGNs
YXNzIGVudW1lcmFibGUuCisgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgcmVwZWF0
ZWRseSBkdXJpbmcgZW51bWVyYXRpb24uIFRoZSBpbmRleCB2YWx1ZQorICAgICAgd2lsbCBhbHdh
eXMgYmVnaW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9ub3RvbmljYWxseS4gWW91IGRvbid0IGhh
dmUgdG8KKyAgICAgIHJlbHkgb24gdGhlIGluZGV4IHZhbHVlIHRvIGRldGVybWluZSB3aGF0IG9i
amVjdCB0byByZXR1cm4sIGJ1dCB5b3Ugc2hvdWxkCisgICAgICBhbHdheXMgY2hlY2sgdGhlIHZh
bHVlIGFuZCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgd2hlbiB5b3Ugc2VlIHRoZQorICAgICAg
cmVxdWVzdGVkIGluZGV4IGlzIDAuCisgICAgICAgVGhlIGBwcmV2aW91c09iamVjdGAgaXMgdGhl
IG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IGNhbGwKKyAgICAgIHRvIGBu
ZXh0T2JqZWN0YCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLiBUaGlzIGlzIGEgdXNlZnVsIHdh
eSB0bworICAgICAgbWFuYWdlIGl0ZXJhdGlvbiBpZiB5b3UgYXJlIHRyYWNpbmcgYSBsaW5rZWQg
bGlzdCwgZm9yIGV4YW1wbGUuCisgICAgICAgRmluYWxseSB0aGUgY29udGV4dCBwYXJhbWV0ZXIg
d2lsbCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKKyAgICAgIGEgInNjcmF0
Y2hwYWQiIHRvIG1haW50YWluIGFueSBvdGhlciBzdGF0ZSB5b3UgbmVlZCBpbiBvcmRlciB0byBp
dGVyYXRlCisgICAgICBwcm9wZXJseS4gVGhlIGNvbnRleHQgb2JqZWN0IGlzIHJldXNlZCBhbmQg
aXMgbm90IHJlc2V0IGJldHdlZW4KKyAgICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJlIHlvdSBz
ZXR1cCB0aGUgY29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKKyAgICAgIHRoZSBp
bmRleCBwYXJhbWV0ZXIgaXMgMC4KKyAgICAgICBHZW5lcmFsbHkgaXRlcmF0b3JzIHdpbGwgY29u
dGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhlIGluZGV4CisgICAgICByZWFjaGVz
IHRoZSBjdXJyZW50IGxlbmd0aC0xLiBJZiB5b3UgcnVuIG91dCBvZiBkYXRhIGJlZm9yZSB0aGlz
CisgICAgICB0aW1lIGZvciBzb21lIHJlYXNvbiwgeW91IHNob3VsZCBzaW1wbHkgcmV0dXJuIHVu
ZGVmaW5lZC4KKyAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhv
ZCBzaW1wbHkgbG9va3MgdXAgdGhlIGluZGV4LgorICAgICAgVGhpcyB3b3JrcyBncmVhdCBvbiBh
bnkgQXJyYXktbGlrZSBvYmplY3RzLgorICAgICAgIEBtZXRob2QgbmV4dE9iamVjdAorICAgICAg
QHBhcmFtIHtOdW1iZXJ9IGluZGV4IHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBpdGVyYXRpb24K
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSBwcmV2aW91c09iamVjdCB0aGUgdmFsdWUgcmV0dXJuZWQg
YnkgdGhlIGxhc3QgY2FsbCB0bworICAgICAgICBgbmV4dE9iamVjdGAuCisgICAgICBAcGFyYW0g
e09iamVjdH0gY29udGV4dCBhIGNvbnRleHQgb2JqZWN0IHlvdSBjYW4gdXNlIHRvIG1haW50YWlu
IHN0YXRlLgorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0
ZXJhdGlvbiBvciB1bmRlZmluZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBuZXh0T2Jq
ZWN0OiBudWxsLAorCisgICAgLyoqCisgICAgICBIZWxwZXIgbWV0aG9kIHJldHVybnMgdGhlIGZp
cnN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gVGhpcyBpcyB1c3VhbGx5CisgICAgICB1c2Vk
IGJ5IGJpbmRpbmdzIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgZnJhbWV3b3JrIHRvIGV4dHJhY3Qg
YSBzaW5nbGUKKyAgICAgIG9iamVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250YWlucyBvbmx5IG9u
ZSBpdGVtLgorICAgICAgIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IHNob3VsZCBp
bXBsZW1lbnQgaXQgc28gdGhhdCBpdCB3aWxsCisgICAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1l
IHZhbHVlIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQorICAgICAg
Y29udGFpbnMgb25seSBvbmUgb2JqZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVy
biB0aGF0IG9iamVjdC4KKyAgICAgIElmIHlvdXIgZW51bWVyYWJsZSBpcyBlbXB0eSwgdGhpcyBt
ZXRob2Qgc2hvdWxkIHJldHVybiBgdW5kZWZpbmVkYC4KKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYyddOworICAgICAgYXJyLmdldCgnZmlyc3RPYmpl
Y3QnKTsgIC8vICdhJworICAgICAgIHZhciBhcnIgPSBbXTsKKyAgICAgIGFyci5nZXQoJ2ZpcnN0
T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBmaXJz
dE9iamVjdAorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgb2JqZWN0IG9yIHVuZGVmaW5lZAor
ICAgICAgQHJlYWRPbmx5CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBmaXJzdE9iamVjdDog
X2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnW10nLCBmdW5jdGlvbiAoKSB7CisgICAgICBp
ZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSA9PT0gMCkgewor
ICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICAvLyBoYW5kbGUgZ2Vu
ZXJpYyBlbnVtZXJhYmxlcworICAgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKKyAgICAgIHZh
ciByZXQgPSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwgY29udGV4dCk7CisKKyAgICAgIHB1c2hD
dHgoY29udGV4dCk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSkucmVhZE9ubHkoKSwKKwor
ICAgIC8qKgorICAgICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBsYXN0IG9iamVjdCBmcm9t
IGEgY29sbGVjdGlvbi4gSWYgeW91ciBlbnVtZXJhYmxlCisgICAgICBjb250YWlucyBvbmx5IG9u
ZSBvYmplY3QsIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoYXQgb2JqZWN0Lgor
ICAgICAgSWYgeW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0
dXJuIGB1bmRlZmluZWRgLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBhcnIgPSBb
J2EnLCAnYicsICdjJ107CisgICAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAnYycKKyAg
ICAgICB2YXIgYXJyID0gW107CisgICAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1bmRl
ZmluZWQKKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0CisgICAgICBAcmV0
dXJuIHtPYmplY3R9IHRoZSBsYXN0IG9iamVjdCBvciB1bmRlZmluZWQKKyAgICAgIEByZWFkT25s
eQorICAgICAgQHB1YmxpYworICAgICovCisgICAgbGFzdE9iamVjdDogX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZCgnW10nLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKTsKKworICAgICAgaWYgKGxlbiA9
PT0gMCkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICB2YXIg
Y29udGV4dCA9IHBvcEN0eCgpOworICAgICAgdmFyIGlkeCA9IDA7CisgICAgICB2YXIgbGFzdCA9
IG51bGw7CisgICAgICB2YXIgY3VyOworCisgICAgICBkbyB7CisgICAgICAgIGxhc3QgPSBjdXI7
CisgICAgICAgIGN1ciA9IHRoaXMubmV4dE9iamVjdChpZHgrKywgbGFzdCwgY29udGV4dCk7Cisg
ICAgICB9IHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCk7CisKKyAgICAgIHB1c2hDdHgoY29udGV4
dCk7CisKKyAgICAgIHJldHVybiBsYXN0OworICAgIH0pLnJlYWRPbmx5KCksCisKKyAgICAvKioK
KyAgICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgb2JqZWN0IGNhbiBiZSBmb3VuZCBp
biB0aGUgcmVjZWl2ZXIuIFRoZQorICAgICAgZGVmYXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0
aHJvdWdoIHRoZSBlbnVtZXJhYmxlIHVudGlsIHRoZSBvYmplY3QKKyAgICAgIGlzIGZvdW5kLiBZ
b3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB3aXRoIGEgbW9yZSBlZmZpY2llbnQgdmVyc2lv
bi4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYydd
OworICAgICAgIGFyci5jb250YWlucygnYScpOyAvLyB0cnVlCisgICAgICBhcnIuY29udGFpbnMo
J3onKTsgLy8gZmFsc2UKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgY29udGFpbnMKKyAgICAg
IEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgICAgQHJl
dHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIG9iamVjdCBpcyBmb3VuZCBpbiBlbnVtZXJhYmxlLgor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgY29udGFpbnM6IGZ1bmN0aW9uIChvYmopIHsKKyAg
ICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICByZXR1
cm4gaXRlbSA9PT0gb2JqOworICAgICAgfSk7CisKKyAgICAgIHJldHVybiBmb3VuZCAhPT0gdW5k
ZWZpbmVkOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGVu
dW1lcmFibGUsIGNhbGxpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbiBvbiBlYWNoCisgICAgICBpdGVt
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUgYGZvckVhY2goKWAgbWV0aG9kIGRlZmlu
ZWQgaW4KKyAgICAgIEphdmFTY3JpcHQgMS42LgorICAgICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAg
ICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKyAgICAgIGBgYAorICAgICAgIC0g
YGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGlu
ZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgZW51
bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KKyAgICAgICBOb3RlIHRo
YXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9u
YWwgdGFyZ2V0CisgICAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhl
IGNvbnRleHQuIFRoaXMgaXMgYSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9y
IGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBm
b3JFYWNoCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQorICAgICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYwor
ICAgICovCisgICAgZm9yRWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAg
IGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdGhyb3cgbmV3
IFR5cGVFcnJvcigpOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgpOwor
ICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3Ro
Jyk7CisgICAgICB2YXIgbGFzdCA9IG51bGw7CisKKyAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVm
aW5lZCkgeworICAgICAgICB0YXJnZXQgPSBudWxsOworICAgICAgfQorCisgICAgICBmb3IgKHZh
ciBpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgIHZhciBuZXh0ID0gdGhpcy5u
ZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29udGV4dCk7CisgICAgICAgIGNhbGxiYWNrLmNhbGwodGFy
Z2V0LCBuZXh0LCBpZHgsIHRoaXMpOworICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgIH0KKwor
ICAgICAgbGFzdCA9IG51bGw7CisgICAgICBjb250ZXh0ID0gcHVzaEN0eChjb250ZXh0KTsKKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWxpYXMgZm9yIGBt
YXBCeWAKKyAgICAgICBAbWV0aG9kIGdldEVhY2gKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkg
bmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFy
cmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgZ2V0RWFjaDogX2VtYmVyTWV0YWxNaXhp
bi5hbGlhc01ldGhvZCgnbWFwQnknKSwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgdmFsdWUg
b24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlci4gVGhpcyBpcyBtb3JlCisgICAg
ICBlZmZpY2llbnQgdGhhbiB1c2luZyBvdGhlciBtZXRob2RzIGRlZmluZWQgb24gdGhpcyBoZWxw
ZXIuIElmIHRoZSBvYmplY3QKKyAgICAgIGltcGxlbWVudHMgRW1iZXIuT2JzZXJ2YWJsZSwgdGhl
IHZhbHVlIHdpbGwgYmUgY2hhbmdlZCB0byBgc2V0KCksYCBvdGhlcndpc2UKKyAgICAgIGl0IHdp
bGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0cyBhcmUgc2tpcHBlZC4KKyAgICAgICBA
bWV0aG9kIHNldEVhY2gKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgb2JqZWN0IHRvIHNldAorICAgICAgQHJl
dHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgc2V0RWFj
aDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZvckVhY2goZnVu
Y3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KGl0ZW0s
IGtleSwgdmFsdWUpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTWFwcyBh
bGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB0byBhbm90aGVyIHZhbHVlLCByZXR1
cm5pbmcKKyAgICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFw
KClgIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhv
ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisg
ICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAg
LSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBg
aW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBl
bnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNo
b3VsZCByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRp
b24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Cisg
ICAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQuIFRo
aXMgaXMgYSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFj
Y2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBtYXAKKyAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgICBA
cGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgICBA
cmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4KKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIG1hcDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHZhciByZXQgPSBl
bWJlckEoKTsKKworICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh4LCBpZHgsIGkpIHsKKyAg
ICAgICAgcmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LCBpKTsKKyAgICAg
IH0pOworCisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNpbWls
YXIgdG8gbWFwLCB0aGlzIHNwZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9m
IHRoZSBuYW1lZAorICAgICAgcHJvcGVydHkgb24gYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlv
bi4KKyAgICAgICBAbWV0aG9kIG1hcEJ5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IG5hbWUg
b2YgdGhlIHByb3BlcnR5CisgICAgICBAcmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4K
KyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG1hcEJ5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAg
ICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKG5leHQpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldChuZXh0LCBrZXkpOworICAgICAgfSk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMgaW4g
dGhlIGVudW1lcmF0aW9uIHRoYXQgdGhlIHBhc3NlZAorICAgICAgZnVuY3Rpb24gcmV0dXJucyB0
cnVlIGZvci4gVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8gYGZpbHRlcigpYCBkZWZpbmVkIGlu
CisgICAgICBKYXZhU2NyaXB0IDEuNi4KKyAgICAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBw
cm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICAgIHBh
cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdW5j
dGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgICBgYGAKKyAgICAgICAtIGBpdGVt
YCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBpbmRleGAg
aXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGVudW1lcmFi
bGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgSXQgc2hvdWxkIHJl
dHVybiBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0cywgYGZhbHNlYAor
ICAgICAgb3RoZXJ3aXNlLgorICAgICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNhbGxi
YWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKKyAgICAgIG9iamVjdCB0
aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qg
d2F5CisgICAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBj
dXJyZW50IG9iamVjdC4KKyAgICAgICBAbWV0aG9kIGZpbHRlcgorICAgICAgQHBhcmFtIHtGdW5j
dGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICAgIEByZXR1cm4ge0Fy
cmF5fSBBIGZpbHRlcmVkIGFycmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgZmlsdGVy
OiBmdW5jdGlvbiAoY2FsbGJhY2ssIHRhcmdldCkgeworICAgICAgdmFyIHJldCA9IGVtYmVyQSgp
OworCisgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHgsIGlkeCwgaSkgeworICAgICAgICBp
ZiAoY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSkpIHsKKyAgICAgICAgICByZXQucHVz
aCh4KTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMg
aW4gdGhlIGVudW1lcmF0aW9uIHdoZXJlIHRoZSBwYXNzZWQKKyAgICAgIGZ1bmN0aW9uIHJldHVy
bnMgZmFsc2UuIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIGZpbHRlcigpLgorICAgICAg
IFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2lu
ZyBzaWduYXR1cmUgKGFsbAorICAgICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsK
KyAgICAgIGBgYAorICAgICAgIC0gKml0ZW0qIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0
ZXJhdGlvbi4KKyAgICAgIC0gKmluZGV4KiBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRl
cmF0aW9uCisgICAgICAtICplbnVtZXJhYmxlKiBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRz
ZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gYSBmYWxzZXkgdmFsdWUgdG8gaW5jbHVkZSB0
aGUgaXRlbSBpbiB0aGUgcmVzdWx0cy4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8g
YSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgICBv
YmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyAidGhpcyIgb24gdGhlIGNvbnRleHQuIFRoaXMgaXMg
YSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0
byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCByZWplY3QKKyAgICAgIEBwYXJh
bSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgICBAcGFy
YW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgICBAcmV0
dXJuIHtBcnJheX0gQSByZWplY3RlZCBhcnJheS4KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IHJlamVjdDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHJldHVybiB0aGlz
LmZpbHRlcihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAhY2FsbGJhY2suYXBwbHkodGFy
Z2V0LCBhcmd1bWVudHMpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0
dXJucyBhbiBhcnJheSB3aXRoIGp1c3QgdGhlIGl0ZW1zIHdpdGggdGhlIG1hdGNoZWQgcHJvcGVy
dHkuIFlvdQorICAgICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGgg
dGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCisgICAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHBy
b3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KKyAgICAgICBAbWV0aG9kIGZpbHRlckJ5
CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgICBA
cGFyYW0geyp9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICAgICAg
QHJldHVybiB7QXJyYXl9IGZpbHRlcmVkIGFycmF5CisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICBmaWx0ZXJCeTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZp
bHRlcihpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0
aHkgdmFsdWVzIGZvcgorICAgICAga2V5LiAgWW91IGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29u
ZCBhcmd1bWVudCB3aXRoIHRoZSB0YXJnZXQgdmFsdWUuICBPdGhlcndpc2UKKyAgICAgIHRoaXMg
d2lsbCBtYXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gZmFsc2UuCisgICAgICAg
QG1ldGhvZCByZWplY3RCeQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkg
dG8gdGVzdAorICAgICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8g
dGVzdCBhZ2FpbnN0LgorICAgICAgQHJldHVybiB7QXJyYXl9IHJlamVjdGVkIGFycmF5CisgICAg
ICBAcHVibGljCisgICAgKi8KKyAgICByZWplY3RCeTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsK
KyAgICAgIHZhciBleGFjdFZhbHVlID0gZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXkpID09PSB2YWx1ZTsKKyAgICAg
IH07CisKKyAgICAgIHZhciBoYXNWYWx1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgIHJl
dHVybiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXkpOworICAgICAgfTsK
KworICAgICAgdmFyIHVzZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyBleGFjdFZhbHVlIDog
aGFzVmFsdWU7CisKKyAgICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGZvciB3aGlj
aCB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgorICAgICAgVGhpcyBtZXRob2Qgd29ya3Mgc2lt
aWxhciB0byB0aGUgYGZpbHRlcigpYCBtZXRob2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEuNgor
ICAgICAgZXhjZXB0IHRoYXQgaXQgd2lsbCBzdG9wIHdvcmtpbmcgb24gdGhlIGFycmF5IG9uY2Ug
YSBtYXRjaCBpcyBmb3VuZC4KKyAgICAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRl
IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICAgIHBhcmFtZXRl
cnMgYXJlIG9wdGlvbmFsKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdW5jdGlvbihp
dGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgICBgYGAKKyAgICAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBpbmRleGAgaXMgdGhl
IGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGVudW1lcmFibGVgIGlz
IHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgSXQgc2hvdWxkIHJldHVybiB0
aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKKyAg
ICAgIG90aGVyd2lzZS4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFj
aywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgICBvYmplY3QgdGhh
dCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQuIFRoaXMgaXMgYSBnb29kIHdh
eQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3Vy
cmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBmaW5kCisgICAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9
IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAgICAgQHJldHVybiB7T2JqZWN0
fSBGb3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgLgorICAgICAgQHB1YmxpYworICAgICovCisgICAg
ZmluZDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworCisgICAgICBpZiAodGFy
Z2V0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICAgIH0KKwor
ICAgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKKyAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwor
ICAgICAgdmFyIGxhc3QgPSBudWxsOworICAgICAgdmFyIG5leHQsIHJldDsKKworICAgICAgZm9y
ICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuICYmICFmb3VuZDsgaWR4KyspIHsKKyAgICAgICAgbmV4
dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQpOworCisgICAgICAgIGlmIChm
b3VuZCA9IGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpKSB7CisgICAgICAg
ICAgcmV0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAg
fQorCisgICAgICBuZXh0ID0gbGFzdCA9IG51bGw7CisgICAgICBjb250ZXh0ID0gcHVzaEN0eChj
b250ZXh0KTsKKworICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBS
ZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHdpdGggYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgcGFzc2Vk
IHZhbHVlLiBZb3UKKyAgICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3
aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVyd2lzZQorICAgICAgdGhpcyB3aWxsIG1hdGNoIGFu
eSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCisgICAgICAgVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBtb3JlIGdlbmVyaWMgYGZpbmQoKWAgbWV0aG9kLgorICAgICAg
IEBtZXRob2QgZmluZEJ5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0
byB0ZXN0CisgICAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0
ZXN0IGFnYWluc3QuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IGZvdW5kIGl0ZW0gb3IgYHVuZGVm
aW5lZGAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGZpbmRCeTogZnVuY3Rpb24gKGtleSwg
dmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZpbmQoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFz
c2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZXZlcnkgaXRlbSBpbiB0aGUKKyAgICAgIGVu
dW1lcmF0aW9uLiBUaGlzIGNvcnJlc3BvbmRzIHdpdGggdGhlIGBldmVyeSgpYCBtZXRob2QgaW4g
SmF2YVNjcmlwdCAxLjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBz
aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJz
IGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24oaXRl
bSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgaXRlbWAgaXMgdGhl
IGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVtZXJhYmxlYCBpcyB0
aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gdGhl
IGB0cnVlYCBvciBgZmFsc2VgLgorICAgICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNh
bGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKKyAgICAgIG9iamVj
dCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdv
b2Qgd2F5CisgICAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRo
ZSBjdXJyZW50IG9iamVjdC4KKyAgICAgICBFeGFtcGxlIFVzYWdlOgorICAgICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIGlmIChwZW9wbGUuZXZlcnkoaXNFbmdpbmVlcikpIHsKKyAgICAgICAgUGF5
Y2hlY2tzLmFkZEJpZ0JvbnVzKCk7CisgICAgICB9CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGV2ZXJ5CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQorICAgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIGV2ZXJ5OiBmdW5jdGlvbiAoY2FsbGJhY2ssIHRhcmdldCkgeworICAgICAgcmV0dXJuICF0
aGlzLmZpbmQoZnVuY3Rpb24gKHgsIGlkeCwgaSkgeworICAgICAgICByZXR1cm4gIWNhbGxiYWNr
LmNhbGwodGFyZ2V0LCB4LCBpZHgsIGkpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBwcm9wZXJ0eSByZXNvbHZlcyB0byB0
aGUgdmFsdWUgb2YgdGhlIHNlY29uZAorICAgICAgYXJndW1lbnQgZm9yIGFsbCBpdGVtcyBpbiB0
aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIKKyAgICAg
IHRoYW4gdXNpbmcgYSBjYWxsYmFjay4KKyAgICAgICBAbWV0aG9kIGlzRXZlcnkKKyAgICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4gRGVmYXVsdHMgdG8g
YHRydWVgCisgICAgICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHNpbmNlIDEuMy4wCisgICAg
ICBAcHVibGljCisgICAgKi8KKyAgICBpc0V2ZXJ5OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewor
ICAgICAgcmV0dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0
aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCisgICAgICBlbnVtZXJhdGlvbi4g
VGhpcyBjb3JyZXNwb25kcyB3aXRoIHRoZSBgc29tZSgpYCBtZXRob2QgaW4gSmF2YVNjcmlwdCAx
LjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0
aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25h
bCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVu
dW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRl
bSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4
IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJs
ZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBp
bmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCisgICAgICBvdGhlcndpc2Uu
CisgICAgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxz
byBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKKyAgICAgIHRvIGdp
dmUgeW91ciBpdGVyYXRvciBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Lgor
ICAgICAgIFVzYWdlIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgaWYgKHBl
b3BsZS5hbnkoaXNNYW5hZ2VyKSkgeworICAgICAgICBQYXljaGVja3MuYWRkQmlnZ2VyQm9udXMo
KTsKKyAgICAgIH0KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgYW55CisgICAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgICAgQHBhcmFt
IHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAgICAgQHJldHVy
biB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAg
Zm9yIGFueSBpdGVtCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBhbnk6IGZ1bmN0aW9uIChj
YWxsYmFjaywgdGFyZ2V0KSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICAgIHZhciBjb250ZXh0ID0gcG9wQ3R4KCk7Cisg
ICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICAgIHZhciBsYXN0ID0gbnVsbDsKKyAgICAgIHZh
ciBuZXh0LCBpZHg7CisKKyAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkgeworICAgICAg
ICB0YXJnZXQgPSBudWxsOworICAgICAgfQorCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxl
biAmJiAhZm91bmQ7IGlkeCsrKSB7CisgICAgICAgIG5leHQgPSB0aGlzLm5leHRPYmplY3QoaWR4
LCBsYXN0LCBjb250ZXh0KTsKKyAgICAgICAgZm91bmQgPSBjYWxsYmFjay5jYWxsKHRhcmdldCwg
bmV4dCwgaWR4LCB0aGlzKTsKKyAgICAgICAgbGFzdCA9IG5leHQ7CisgICAgICB9CisKKyAgICAg
IG5leHQgPSBsYXN0ID0gbnVsbDsKKyAgICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQpOwor
ICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgYHRy
dWVgIGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gdGhlIHZhbHVlIG9mIHRoZSBz
ZWNvbmQKKyAgICAgIGFyZ3VtZW50IGZvciBhbnkgaXRlbSBpbiB0aGUgZW51bWVyYWJsZS4gVGhp
cyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIKKyAgICAgIHRoYW4gdXNpbmcgYSBjYWxs
YmFjay4KKyAgICAgICBAbWV0aG9kIGlzQW55CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25h
bCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuIERlZmF1bHRzIHRvIGB0cnVlYAorICAgICAgQHJldHVy
biB7Qm9vbGVhbn0KKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaXNBbnk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gdGhpcy5hbnko
aXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBU
aGlzIHdpbGwgY29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9yIGludG8gYSBzaW5n
bGUgdmFsdWUuIEl0CisgICAgICBpcyBhIHVzZWZ1bCB3YXkgdG8gY29sbGVjdCBhIHN1bW1hcnkg
dmFsdWUgZnJvbSBhbiBlbnVtZXJhdGlvbi4gVGhpcworICAgICAgY29ycmVzcG9uZHMgdG8gdGhl
IGByZWR1Y2UoKWAgbWV0aG9kIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjguCisgICAgICAgVGhl
IGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24ocHJldmlvdXNWYWx1ZSwgaXRlbSwgaW5kZXgsIGVu
dW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgcHJldmlvdXNWYWx1ZWAgaXMgdGhlIHZh
bHVlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gdGhlIGl0ZXJhdG9yLgorICAgICAgLSBg
aXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5k
ZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVt
ZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIFJldHVybiB0
aGUgbmV3IGN1bXVsYXRpdmUgdmFsdWUuCisgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGNhbGxi
YWNrIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFsVmFsdWVgLiBBbiBlcnJvcgorICAgICAg
d2lsbCBiZSByYWlzZWQgaWYgeW91IGRvIG5vdCBwYXNzIGFuIGluaXRpYWwgdmFsdWUgYW5kIHRo
ZSBlbnVtZXJhdG9yIGlzCisgICAgICBlbXB0eS4KKyAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRo
ZSBvdGhlciBtZXRob2RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8KKyAgICAg
IHBhc3MgYSB0YXJnZXQgb2JqZWN0IHRvIHNldCBhcyB0aGlzIGZvciB0aGUgY2FsbGJhY2suIEl0
J3MgcGFydCBvZiB0aGUKKyAgICAgIHNwZWMuIFNvcnJ5LgorICAgICAgIEBtZXRob2QgcmVkdWNl
CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0
ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIGZvciB0
aGUgcmVkdWNlCisgICAgICBAcGFyYW0ge1N0cmluZ30gcmVkdWNlclByb3BlcnR5IGludGVybmFs
IHVzZSBvbmx5LgorICAgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1ZS4KKyAg
ICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlZHVjZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBpbml0
aWFsVmFsdWUsIHJlZHVjZXJQcm9wZXJ0eSkgeworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAh
PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgICAgICB9
CisKKyAgICAgIHZhciByZXQgPSBpbml0aWFsVmFsdWU7CisKKyAgICAgIHRoaXMuZm9yRWFjaChm
dW5jdGlvbiAoaXRlbSwgaSkgeworICAgICAgICByZXQgPSBjYWxsYmFjayhyZXQsIGl0ZW0sIGks
IHRoaXMsIHJlZHVjZXJQcm9wZXJ0eSk7CisgICAgICB9LCB0aGlzKTsKKworICAgICAgcmV0dXJu
IHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBJbnZva2VzIHRoZSBuYW1lZCBtZXRob2Qg
b24gZXZlcnkgb2JqZWN0IGluIHRoZSByZWNlaXZlciB0aGF0CisgICAgICBpbXBsZW1lbnRzIGl0
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUgaW1wbGVtZW50YXRpb24gaW4KKyAgICAg
IFByb3RvdHlwZSAxLjYuCisgICAgICAgQG1ldGhvZCBpbnZva2UKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0Li4ufSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGFzIHdlbGwuCisgICAgICBA
cmV0dXJuIHtBcnJheX0gcmV0dXJuIHZhbHVlcyBmcm9tIGNhbGxpbmcgaW52b2tlLgorICAgICAg
QHB1YmxpYworICAgICovCisgICAgaW52b2tlOiBmdW5jdGlvbiAobWV0aG9kTmFtZSkgeworICAg
ICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4g
MSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICB2
YXIgcmV0ID0gZW1iZXJBKCk7CisKKyAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoeCwgaWR4
KSB7CisgICAgICAgIHZhciBtZXRob2QgPSB4ICYmIHhbbWV0aG9kTmFtZV07CisKKyAgICAgICAg
aWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBtZXRob2QpIHsKKyAgICAgICAgICByZXRbaWR4XSA9
IGFyZ3MgPyBtZXRob2QuYXBwbHkoeCwgYXJncykgOiB4W21ldGhvZE5hbWVdKCk7CisgICAgICAg
IH0KKyAgICAgIH0sIHRoaXMpOworCisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIFNpbXBseSBjb252ZXJ0cyB0aGUgZW51bWVyYWJsZSBpbnRvIGEgZ2VudWluZSBh
cnJheS4gVGhlIG9yZGVyIGlzIG5vdAorICAgICAgZ3VhcmFudGVlZC4gQ29ycmVzcG9uZHMgdG8g
dGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBieSBQcm90b3R5cGUuCisgICAgICAgQG1ldGhvZCB0b0Fy
cmF5CisgICAgICBAcmV0dXJuIHtBcnJheX0gdGhlIGVudW1lcmFibGUgYXMgYW4gYXJyYXkuCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgcmV0ID0gZW1iZXJBKCk7CisKKyAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobywgaWR4
KSB7CisgICAgICAgIHJldFtpZHhdID0gbzsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gcmV0
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgYSBjb3B5IG9mIHRoZSBhcnJheSB3
aXRoIGFsbCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGVsZW1lbnRzIHJlbW92ZWQuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGFyciA9IFsnYScsIG51bGwsICdjJywgdW5kZWZpbmVk
XTsKKyAgICAgIGFyci5jb21wYWN0KCk7ICAvLyBbJ2EnLCAnYyddCisgICAgICBgYGAKKyAgICAg
ICBAbWV0aG9kIGNvbXBhY3QKKyAgICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91
dCBudWxsIGFuZCB1bmRlZmluZWQgZWxlbWVudHMuCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICBjb21wYWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rp
b24gKHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOworICAgICAgfSk7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgZXhj
bHVkZXMgdGhlIHBhc3NlZCB2YWx1ZS4gVGhlIGRlZmF1bHQKKyAgICAgIGltcGxlbWVudGF0aW9u
IHJldHVybnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlwZSB1bmxlc3MK
KyAgICAgIHRoZSByZWNlaXZlciBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZS4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYScsICdjJ107CisgICAg
ICBhcnIud2l0aG91dCgnYScpOyAgLy8gWydiJywgJ2MnXQorICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCB3aXRob3V0CisgICAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUKKyAgICAgIEByZXR1cm4g
e0VtYmVyLkVudW1lcmFibGV9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB3aXRob3V0OiBm
dW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIGlmICghdGhpcy5jb250YWlucyh2YWx1ZSkpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgIH0KKworICAgICAgdmFy
IHJldCA9IGVtYmVyQSgpOworCisgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGspIHsKKyAg
ICAgICAgaWYgKGsgIT09IHZhbHVlKSB7CisgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0gazsK
KyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB1
bmlxdWUgdmFsdWVzLiBUaGUgZGVmYXVsdAorICAgICAgaW1wbGVtZW50YXRpb24gcmV0dXJucyBh
biBhcnJheSByZWdhcmRsZXNzIG9mIHRoZSByZWNlaXZlciB0eXBlLgorICAgICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIHZhciBhcnIgPSBbJ2EnLCAnYScsICdiJywgJ2InXTsKKyAgICAgIGFyci51
bmlxKCk7ICAvLyBbJ2EnLCAnYiddCisgICAgICBgYGAKKyAgICAgICBUaGlzIG9ubHkgd29ya3Mg
b24gcHJpbWl0aXZlIGRhdGEgdHlwZXMsIGUuZy4gU3RyaW5ncywgTnVtYmVycywgZXRjLgorICAg
ICAgIEBtZXRob2QgdW5pcQorICAgICAgQHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIHVuaXE6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByZXQg
PSBlbWJlckEoKTsKKworICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CisgICAgICAg
IGlmIChyZXQuaW5kZXhPZihrKSA8IDApIHsKKyAgICAgICAgICByZXQucHVzaChrKTsKKyAgICAg
ICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIHRyaWdnZXIgYW55dGltZSB0aGUgZW51bWVyYWJsZSdz
IGNvbnRlbnQgY2hhbmdlcy4KKyAgICAgIFlvdSBjYW4gb2JzZXJ2ZSB0aGlzIHByb3BlcnR5IHRv
IGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIGVudW1lcmFibGUncworICAgICAgY29udGVu
dC4KKyAgICAgICBGb3IgcGxhaW4gZW51bWVyYWJsZXMsIHRoaXMgcHJvcGVydHkgaXMgcmVhZCBv
bmx5LiBgQXJyYXlgIG92ZXJyaWRlcworICAgICAgdGhpcyBtZXRob2QuCisgICAgICAgQHByb3Bl
cnR5IFtdCisgICAgICBAdHlwZSBBcnJheQorICAgICAgQHJldHVybiB0aGlzCisgICAgICBAcHJp
dmF0ZQorICAgICovCisgICAgJ1tdJzogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCh7Cisg
ICAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9
CisgICAgfSksCisKKyAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAgLy8gRU5VTUVSQUJMRSBPQlNFUlZFUlMKKyAgICAv
LworCisgICAgLyoqCisgICAgICBSZWdpc3RlcnMgYW4gZW51bWVyYWJsZSBvYnNlcnZlci4gTXVz
dCBpbXBsZW1lbnQgYEVtYmVyLkVudW1lcmFibGVPYnNlcnZlcmAKKyAgICAgIG1peGluLgorICAg
ICAgIEBtZXRob2QgYWRkRW51bWVyYWJsZU9ic2VydmVyCisgICAgICBAcGFyYW0ge09iamVjdH0g
dGFyZ2V0CisgICAgICBAcGFyYW0ge09iamVjdH0gW29wdHNdCisgICAgICBAcmV0dXJuIHRoaXMK
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhZGRFbnVtZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0
aW9uICh0YXJnZXQsIG9wdHMpIHsKKyAgICAgIHZhciB3aWxsQ2hhbmdlID0gb3B0cyAmJiBvcHRz
LndpbGxDaGFuZ2UgfHwgJ2VudW1lcmFibGVXaWxsQ2hhbmdlJzsKKyAgICAgIHZhciBkaWRDaGFu
Z2UgPSBvcHRzICYmIG9wdHMuZGlkQ2hhbmdlIHx8ICdlbnVtZXJhYmxlRGlkQ2hhbmdlJzsKKyAg
ICAgIHZhciBoYXNPYnNlcnZlcnMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKworICAgICAgaWYgKCFoYXNPYnNlcnZlcnMpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRo
aXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1l
dGFsRXZlbnRzLmFkZExpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQs
IHdpbGxDaGFuZ2UpOworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuYWRkTGlzdGVuZXIodGhpcywg
J0BlbnVtZXJhYmxlOmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgICAgaWYgKCFo
YXNPYnNlcnZlcnMpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVy
dHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVtb3ZlcyBhIHJl
Z2lzdGVyZWQgZW51bWVyYWJsZSBvYnNlcnZlci4KKyAgICAgICBAbWV0aG9kIHJlbW92ZUVudW1l
cmFibGVPYnNlcnZlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAorICAgICAgQHBhcmFt
IHtPYmplY3R9IFtvcHRzXQorICAgICAgQHJldHVybiB0aGlzCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyOiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRz
KSB7CisgICAgICB2YXIgd2lsbENoYW5nZSA9IG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlIHx8ICdl
bnVtZXJhYmxlV2lsbENoYW5nZSc7CisgICAgICB2YXIgZGlkQ2hhbmdlID0gb3B0cyAmJiBvcHRz
LmRpZENoYW5nZSB8fCAnZW51bWVyYWJsZURpZENoYW5nZSc7CisgICAgICB2YXIgaGFzT2JzZXJ2
ZXJzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2Jz
ZXJ2ZXJzJyk7CisKKyAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJhYmxl
T2JzZXJ2ZXJzJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLnJlbW92ZUxp
c3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwor
ICAgICAgX2VtYmVyTWV0YWxFdmVudHMucmVtb3ZlTGlzdGVuZXIodGhpcywgJ0BlbnVtZXJhYmxl
OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgICAgaWYgKGhhc09ic2VydmVycykg
eworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0
aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOworICAgICAgfQorCisgICAgICByZXR1cm4g
dGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhl
IGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKKyAgICAgIG9u
IHRoZSBhcnJheS4KKyAgICAgICBAcHJvcGVydHkgaGFzRW51bWVyYWJsZU9ic2VydmVycworICAg
ICAgQHR5cGUgQm9vbGVhbgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGhhc0VudW1lcmFi
bGVPYnNlcnZlcnM6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgewor
ICAgICAgcmV0dXJuIF9lbWJlck1ldGFsRXZlbnRzLmhhc0xpc3RlbmVycyh0aGlzLCAnQGVudW1l
cmFibGU6Y2hhbmdlJykgfHwgX2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdA
ZW51bWVyYWJsZTpiZWZvcmUnKTsKKyAgICB9KSwKKworICAgIC8qKgorICAgICAgSW52b2tlIHRo
aXMgbWV0aG9kIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB5b3VyIGVudW1lcmFibGUgd2ls
bAorICAgICAgY2hhbmdlLiBZb3UgY2FuIGVpdGhlciBvbWl0IHRoZSBwYXJhbWV0ZXJzIGNvbXBs
ZXRlbHkgb3IgcGFzcyB0aGUgb2JqZWN0cworICAgICAgdG8gYmUgcmVtb3ZlZCBvciBhZGRlZCBp
ZiBhdmFpbGFibGUgb3IganVzdCBhIGNvdW50LgorICAgICAgIEBtZXRob2QgZW51bWVyYWJsZUNv
bnRlbnRXaWxsQ2hhbmdlCisgICAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSBy
ZW1vdmluZyBBbiBlbnVtZXJhYmxlIG9mIHRoZSBvYmplY3RzIHRvCisgICAgICAgIGJlIHJlbW92
ZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSByZW1vdmVkLgorICAgICAgQHBhcmFtIHtF
bWJlci5FbnVtZXJhYmxlfE51bWJlcn0gYWRkaW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVj
dHMgdG8gYmUKKyAgICAgICAgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBhZGRl
ZC4KKyAgICAgIEBjaGFpbmFibGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBlbnVtZXJh
YmxlQ29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChyZW1vdmluZywgYWRkaW5nKSB7CisgICAg
ICB2YXIgcmVtb3ZlQ250LCBhZGRDbnQsIGhhc0RlbHRhOworCisgICAgICBpZiAoJ251bWJlcicg
PT09IHR5cGVvZiByZW1vdmluZykgeworICAgICAgICByZW1vdmVDbnQgPSByZW1vdmluZzsKKyAg
ICAgIH0gZWxzZSBpZiAocmVtb3ZpbmcpIHsKKyAgICAgICAgcmVtb3ZlQ250ID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHJlbW92aW5nLCAnbGVuZ3RoJyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOworICAgICAgfQorCisgICAgICBpZiAo
J251bWJlcicgPT09IHR5cGVvZiBhZGRpbmcpIHsKKyAgICAgICAgYWRkQ250ID0gYWRkaW5nOwor
ICAgICAgfSBlbHNlIGlmIChhZGRpbmcpIHsKKyAgICAgICAgYWRkQ250ID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KGFkZGluZywgJ2xlbmd0aCcpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgYWRkQ250ID0gYWRkaW5nID0gLTE7CisgICAgICB9CisKKyAgICAgIGhhc0RlbHRhID0gYWRk
Q250IDwgMCB8fCByZW1vdmVDbnQgPCAwIHx8IGFkZENudCAtIHJlbW92ZUNudCAhPT0gMDsKKwor
ICAgICAgaWYgKHJlbW92aW5nID09PSAtMSkgeworICAgICAgICByZW1vdmluZyA9IG51bGw7Cisg
ICAgICB9CisKKyAgICAgIGlmIChhZGRpbmcgPT09IC0xKSB7CisgICAgICAgIGFkZGluZyA9IG51
bGw7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5
V2lsbENoYW5nZSh0aGlzLCAnW10nKTsKKworICAgICAgaWYgKGhhc0RlbHRhKSB7CisgICAgICAg
IF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGVu
Z3RoJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudCh0aGlz
LCAnQGVudW1lcmFibGU6YmVmb3JlJywgW3RoaXMsIHJlbW92aW5nLCBhZGRpbmddKTsKKworICAg
ICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSW52b2tlIHRoaXMgbWV0
aG9kIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHlvdXIgZW51bWVyYWJsZSBoYXMgY2hhbmdlZC4KKyAg
ICAgIFRoaXMgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyB3YXRjaGluZyBmb3IgY29udGVudCBj
aGFuZ2VzLiBJZiB5b3UgYXJlCisgICAgICBpbXBsZW1lbnRpbmcgYW4gb3JkZXJlZCBlbnVtZXJh
YmxlIChzdWNoIGFzIGFuIGFycmF5KSwgYWxzbyBwYXNzIHRoZQorICAgICAgc3RhcnQgYW5kIGVu
ZCB2YWx1ZXMgd2hlcmUgdGhlIGNvbnRlbnQgY2hhbmdlZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2Vk
IHRvCisgICAgICBub3RpZnkgcmFuZ2Ugb2JzZXJ2ZXJzLgorICAgICAgIEBtZXRob2QgZW51bWVy
YWJsZUNvbnRlbnREaWRDaGFuZ2UKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZXxOdW1i
ZXJ9IHJlbW92aW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KKyAgICAgICAgYmUg
cmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCisgICAgICBAcGFy
YW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSBhZGRpbmcgIEFuIGVudW1lcmFibGUgb2YgdGhl
IG9iamVjdHMgdG8KKyAgICAgICAgYmUgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBi
ZSBhZGRlZC4KKyAgICAgIEBjaGFpbmFibGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBl
bnVtZXJhYmxlQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24gKHJlbW92aW5nLCBhZGRpbmcpIHsK
KyAgICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVsdGE7CisKKyAgICAgIGlmICgnbnVt
YmVyJyA9PT0gdHlwZW9mIHJlbW92aW5nKSB7CisgICAgICAgIHJlbW92ZUNudCA9IHJlbW92aW5n
OworICAgICAgfSBlbHNlIGlmIChyZW1vdmluZykgeworICAgICAgICByZW1vdmVDbnQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHJlbW92ZUNudCA9IHJlbW92aW5nID0gLTE7CisgICAgICB9CisKKyAgICAg
IGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGFkZGluZykgeworICAgICAgICBhZGRDbnQgPSBhZGRp
bmc7CisgICAgICB9IGVsc2UgaWYgKGFkZGluZykgeworICAgICAgICBhZGRDbnQgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoYWRkaW5nLCAnbGVuZ3RoJyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBhZGRDbnQgPSBhZGRpbmcgPSAtMTsKKyAgICAgIH0KKworICAgICAgaGFzRGVsdGEg
PSBhZGRDbnQgPCAwIHx8IHJlbW92ZUNudCA8IDAgfHwgYWRkQ250IC0gcmVtb3ZlQ250ICE9PSAw
OworCisgICAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSB7CisgICAgICAgIHJlbW92aW5nID0gbnVs
bDsKKyAgICAgIH0KKworICAgICAgaWYgKGFkZGluZyA9PT0gLTEpIHsKKyAgICAgICAgYWRkaW5n
ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KHRo
aXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCBbdGhpcywgcmVtb3ZpbmcsIGFkZGluZ10pOworCisg
ICAgICBpZiAoaGFzRGVsdGEpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMu
cHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xlbmd0aCcpOworICAgICAgfQorCisgICAgICBfZW1i
ZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnW10nKTsKKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ29udmVydHMgdGhl
IGVudW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQgc29ydHMgYnkgdGhlIGtleXMKKyAgICAgIHNw
ZWNpZmllZCBpbiB0aGUgYXJndW1lbnQuCisgICAgICAgWW91IG1heSBwcm92aWRlIG11bHRpcGxl
IGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHByb3BlcnRpZXMuCisgICAgICAgQG1ldGhv
ZCBzb3J0QnkKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lKHMpIHRvIHNvcnQg
b24KKyAgICAgIEByZXR1cm4ge0FycmF5fSBUaGUgc29ydGVkIGFycmF5LgorICAgICAgQHNpbmNl
IDEuMi4wCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBzb3J0Qnk6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHZhciBzb3J0S2V5cyA9IGFyZ3VtZW50czsKKworICAgICAgcmV0dXJuIHRoaXMudG9B
cnJheSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBzb3J0S2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBrZXkgPSBzb3J0S2V5c1tp
XTsKKyAgICAgICAgICB2YXIgcHJvcEEgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYSwg
a2V5KTsKKyAgICAgICAgICB2YXIgcHJvcEIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
Yiwga2V5KTsKKyAgICAgICAgICAvLyByZXR1cm4gMSBvciAtMSBlbHNlIGNvbnRpbnVlIHRvIHRo
ZSBuZXh0IHNvcnRLZXkKKyAgICAgICAgICB2YXIgY29tcGFyZVZhbHVlID0gX2VtYmVyUnVudGlt
ZUNvbXBhcmUuZGVmYXVsdChwcm9wQSwgcHJvcEIpOworCisgICAgICAgICAgaWYgKGNvbXBhcmVW
YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9KTsKKyAgICB9CisgIH0pOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEVudW1lcmFibGU7Cit9KTsKKworLyoqCisgIFJldHVybnMgYSBu
ZXcgZW51bWVyYWJsZSB0aGF0IGNvbnRhaW5zIG9ubHkgaXRlbXMgY29udGFpbmluZyBhIHVuaXF1
ZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBh
biBhcnJheSByZWdhcmRsZXNzIG9mIHRoZSByZWNlaXZlciB0eXBlLgorICAgYGBgamF2YXNjcmlw
dAorICB2YXIgYXJyID0gW3sgdmFsdWU6ICdhJyB9LCB7IHZhbHVlOiAnYScgfSwgeyB2YWx1ZTog
J2InIH0sIHsgdmFsdWU6ICdiJyB9XTsKKyAgYXJyLnVuaXFCeSgndmFsdWUnKTsgIC8vIFt7IHZh
bHVlOiAnYScgfSwgeyB2YWx1ZTogJ2InIH1dCisgIGBgYAorICAgQG1ldGhvZCB1bmlxQnkKKyAg
QHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KKyAgQHB1YmxpYworKi8KK2VuaWZlZCgnZW1iZXIt
cnVudGltZS9taXhpbnMvZXZlbnRlZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9taXhpbics
ICdlbWJlci1tZXRhbC9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTWl4
aW4sIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvKioKKyAg
ICBUaGlzIG1peGluIGFsbG93cyBmb3IgRW1iZXIgb2JqZWN0cyB0byBzdWJzY3JpYmUgdG8gYW5k
IGVtaXQgZXZlbnRzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBlcnNvbiA9IEVt
YmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgeworICAgICAgZ3JlZXQ6IGZ1bmN0aW9u
KCkgeworICAgICAgICAvLyAuLi4KKyAgICAgICAgdGhpcy50cmlnZ2VyKCdncmVldCcpOworICAg
ICAgfQorICAgIH0pOworICAKKyAgICB2YXIgcGVyc29uID0gQXBwLlBlcnNvbi5jcmVhdGUoKTsK
KyAgCisgICAgcGVyc29uLm9uKCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgICAgY29uc29sZS5s
b2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKKyAgICB9KTsKKyAgCisgICAgcGVyc29uLmdy
ZWV0KCk7CisgIAorICAgIC8vIG91dHB1dHM6ICdPdXIgcGVyc29uIGhhcyBncmVldGVkJworICAg
IGBgYAorICAKKyAgICBZb3UgY2FuIGFsc28gY2hhaW4gbXVsdGlwbGUgZXZlbnQgc3Vic2NyaXB0
aW9uczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHBlcnNvbi5vbignZ3JlZXQnLCBmdW5j
dGlvbigpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdPdXIgcGVyc29uIGhhcyBncmVldGVkJyk7Cisg
ICAgfSkub25lKCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgICAgY29uc29sZS5sb2coJ09mZmVy
IG9uZS10aW1lIHNwZWNpYWwnKTsKKyAgICB9KS5vZmYoJ2V2ZW50JywgdGhpcywgZm9yZ2V0VGhp
cyk7CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBFdmVudGVkCisgICAgQG5hbWVzcGFjZSBFbWJl
cgorICAgIEBwdWJsaWMKKyAgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4
aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAgICBTdWJzY3JpYmVzIHRvIGEgbmFtZWQg
ZXZlbnQgd2l0aCBnaXZlbiBmdW5jdGlvbi4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgcGVy
c29uLm9uKCdkaWRMb2FkJywgZnVuY3Rpb24oKSB7CisgICAgICAgLy8gZmlyZWQgb25jZSB0aGUg
cGVyc29uIGhhcyBsb2FkZWQKKyAgICAgfSk7CisgICAgIGBgYAorICAgICAgQW4gb3B0aW9uYWwg
dGFyZ2V0IGNhbiBiZSBwYXNzZWQgaW4gYXMgdGhlIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwKKyAg
ICAgYmUgc2V0IGFzIHRoZSAidGhpcyIgZm9yIHRoZSBjYWxsYmFjay4gVGhpcyBpcyBhIGdvb2Qg
d2F5IHRvIGdpdmUgeW91cgorICAgICBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0cmln
Z2VyaW5nIHRoZSBldmVudC4gV2hlbiB0aGUgdGFyZ2V0CisgICAgIHBhcmFtZXRlciBpcyB1c2Vk
IHRoZSBjYWxsYmFjayBiZWNvbWVzIHRoZSB0aGlyZCBhcmd1bWVudC4KKyAgICAgIEBtZXRob2Qg
b24KKyAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CisgICAg
IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgInRoaXMiIGJpbmRpbmcgZm9yIHRoZSBjYWxs
YmFjaworICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1
dGUKKyAgICAgQHJldHVybiB0aGlzCisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG9uOiBmdW5j
dGlvbiAobmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLmFk
ZExpc3RlbmVyKHRoaXMsIG5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIHJldHVybiB0aGlz
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBhIG5h
bWVkIGV2ZW50IGFuZCB0aGVuIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbgorICAgICAgYWZ0ZXIg
dGhlIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4gSXQgaXMgZ29vZCB0byB1c2Ug
YGBvbmVgYCB3aGVuCisgICAgICB5b3Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCB0aW1lIGFu
IGV2ZW50IGhhcyB0YWtlbiBwbGFjZS4KKyAgICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIG9w
dGlvbmFsIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwgYmVjb21lIHRoZSAidGhpcyIKKyAgICAgIHZh
bHVlIGZvciB0aGUgY2FsbGJhY2suIElmIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIHRoZW4gdGhl
IDNyZCBhcmd1bWVudAorICAgICAgYmVjb21lcyB0aGUgZnVuY3Rpb24uCisgICAgICAgQG1ldGhv
ZCBvbmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAor
ICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAidGhpcyIgYmluZGluZyBmb3IgdGhl
IGNhbGxiYWNrCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhlIGNhbGxiYWNrIHRv
IGV4ZWN1dGUKKyAgICAgIEByZXR1cm4gdGhpcworICAgICAgQHB1YmxpYworICAgICovCisgICAg
b25lOiBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIGlmICghbWV0aG9k
KSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAg
ICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwg
dGFyZ2V0LCBtZXRob2QsIHRydWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgVHJpZ2dlcnMgYSBuYW1lZCBldmVudCBmb3IgdGhlIG9iamVjdC4gQW55IGFk
ZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICB3aWxsIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRv
IHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byB0aGUKKyAgICAgIGV2ZW50Lgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHBlcnNvbi5vbignZGlkRWF0JywgZnVuY3Rpb24o
Zm9vZCkgeworICAgICAgICBjb25zb2xlLmxvZygncGVyc29uIGF0ZSBzb21lICcgKyBmb29kKTsK
KyAgICAgIH0pOworICAgICAgIHBlcnNvbi50cmlnZ2VyKCdkaWRFYXQnLCAnYnJvY2NvbGknKTsK
KyAgICAgICAvLyBvdXRwdXRzOiBwZXJzb24gYXRlIHNvbWUgYnJvY2NvbGkKKyAgICAgIGBgYAor
ICAgICAgQG1ldGhvZCB0cmlnZ2VyCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFt
ZSBvZiB0aGUgZXZlbnQKKyAgICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlvbmFsIGFy
Z3VtZW50cyB0byBwYXNzIG9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0cmlnZ2VyOiBm
dW5jdGlvbiAobmFtZSkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgs
IGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwg
X2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXld
OworICAgICAgfQorCisgICAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQodGhpcywgbmFt
ZSwgYXJncyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2FuY2VscyBzdWJzY3JpcHRpb24g
Zm9yIGdpdmVuIG5hbWUsIHRhcmdldCwgYW5kIG1ldGhvZC4KKyAgICAgICBAbWV0aG9kIG9mZgor
ICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CisgICAgICBA
cGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHN1YnNjcmlwdGlvbgorICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBmdW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0
aW9uCisgICAgICBAcmV0dXJuIHRoaXMKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG9mZjog
ZnVuY3Rpb24gKG5hbWUsIHRhcmdldCwgbWV0aG9kKSB7CisgICAgICBfZW1iZXJNZXRhbEV2ZW50
cy5yZW1vdmVMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7CisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDaGVja3MgdG8gc2VlIGlmIG9iamVj
dCBoYXMgYW55IHN1YnNjcmlwdGlvbnMgZm9yIG5hbWVkIGV2ZW50LgorICAgICAgIEBtZXRob2Qg
aGFzCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQKKyAg
ICAgIEByZXR1cm4ge0Jvb2xlYW59IGRvZXMgdGhlIG9iamVjdCBoYXZlIGEgc3Vic2NyaXB0aW9u
IGZvciBldmVudAorICAgICAgQHB1YmxpYworICAgICAqLworICAgIGhhczogZnVuY3Rpb24gKG5h
bWUpIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbEV2ZW50cy5oYXNMaXN0ZW5lcnModGhpcywg
bmFtZSk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9m
cmVlemFibGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
bWl4aW4nLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxN
aXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0KSB7
CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgYEVtYmVyLkZyZWV6YWJsZWAg
bWl4aW4gaW1wbGVtZW50cyBzb21lIGJhc2ljIG1ldGhvZHMgZm9yIG1hcmtpbmcgYW4KKyAgICBv
YmplY3QgYXMgZnJvemVuLiBPbmNlIGFuIG9iamVjdCBpcyBmcm96ZW4gaXQgc2hvdWxkIGJlIHJl
YWQgb25seS4gTm8gY2hhbmdlcworICAgIG1heSBiZSBtYWRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBv
ZiB0aGUgb2JqZWN0LgorICAKKyAgICAjIyBFbmZvcmNlbWVudAorICAKKyAgICBUbyBmdWxseSBz
dXBwb3J0IGZyZWV6aW5nIGluIHlvdXIgc3ViY2xhc3MsIHlvdSBtdXN0IGluY2x1ZGUgdGhpcyBt
aXhpbiBhbmQKKyAgICBvdmVycmlkZSBhbnkgbWV0aG9kIHRoYXQgbWlnaHQgYWx0ZXIgYW55IHBy
b3BlcnR5IG9uIHRoZSBvYmplY3QgdG8gaW5zdGVhZAorICAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4g
WW91IGNhbiBjaGVjayB0aGUgc3RhdGUgb2YgYW4gb2JqZWN0IGJ5IGNoZWNraW5nIHRoZQorICAg
IGBpc0Zyb3plbmAgcHJvcGVydHkuCisgIAorICAgIEFsdGhvdWdoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiBKYXZhU2NyaXB0IG1heSBzdXBwb3J0IGxhbmd1YWdlLWxldmVsIGZyZWV6aW5nCisgICAgb2Jq
ZWN0IG9iamVjdHMsIHRoYXQgaXMgbm90IHRoZSBjYXNlIHRvZGF5LiBFdmVuIGlmIGFuIG9iamVj
dCBpcyBmcmVlemFibGUsCisgICAgaXQgaXMgc3RpbGwgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8g
bW9kaWZ5IHRoZSBvYmplY3QsIGV2ZW4gdGhvdWdoIGl0IGNvdWxkCisgICAgYnJlYWsgb3RoZXIg
cGFydHMgb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0IGRvIG5vdCBleHBlY3QgYSBmcm96ZW4gb2Jq
ZWN0IHRvCisgICAgY2hhbmdlLiBJdCBpcywgdGhlcmVmb3JlLCB2ZXJ5IGltcG9ydGFudCB0aGF0
IHlvdSBhbHdheXMgcmVzcGVjdCB0aGUKKyAgICBgaXNGcm96ZW5gIHByb3BlcnR5IG9uIGFsbCBm
cmVlemFibGUgb2JqZWN0cy4KKyAgCisgICAgIyMgRXhhbXBsZSBVc2FnZQorICAKKyAgICBUaGUg
ZXhhbXBsZSBiZWxvdyBzaG93cyBhIHNpbXBsZSBvYmplY3QgdGhhdCBpbXBsZW1lbnQgdGhlIGBF
bWJlci5GcmVlemFibGVgCisgICAgcHJvdG9jb2wuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBDb250YWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5GcmVlemFibGUsIHsKKyAgICAg
IGZpcnN0TmFtZTogbnVsbCwKKyAgICAgIGxhc3ROYW1lOiBudWxsLAorICAKKyAgICAgIC8vIHN3
YXBzIHRoZSBuYW1lcworICAgICAgc3dhcE5hbWVzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYg
KHRoaXMuZ2V0KCdpc0Zyb3plbicpKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7CisgICAgICAg
IHZhciB0bXAgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7CisgICAgICAgIHRoaXMuc2V0KCdmaXJz
dE5hbWUnLCB0aGlzLmdldCgnbGFzdE5hbWUnKSk7CisgICAgICAgIHRoaXMuc2V0KCdsYXN0TmFt
ZScsIHRtcCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAKKyAgICB9KTsKKyAg
CisgICAgYyA9IENvbnRhY3QuY3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIsIGxhc3ROYW1lOiAi
RG9lIiB9KTsKKyAgICBjLnN3YXBOYW1lcygpOyAgLy8gcmV0dXJucyBjCisgICAgYy5mcmVlemUo
KTsKKyAgICBjLnN3YXBOYW1lcygpOyAgLy8gRVhDRVBUSU9OCisgICAgYGBgCisgIAorICAgICMj
IENvcHlpbmcKKyAgCisgICAgVXN1YWxseSB0aGUgYEVtYmVyLkZyZWV6YWJsZWAgcHJvdG9jb2wg
aXMgaW1wbGVtZW50ZWQgaW4gY29vcGVyYXRpb24gd2l0aCB0aGUKKyAgICBgRW1iZXIuQ29weWFi
bGVgIHByb3RvY29sLCB3aGljaCBkZWZpbmVzIGEgYGZyb3plbkNvcHkoKWAgbWV0aG9kIHRoYXQg
d2lsbAorICAgIHJldHVybiBhIGZyb3plbiBvYmplY3QsIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50
cyB0aGlzIG1ldGhvZCBhcyB3ZWxsLgorICAKKyAgICBAY2xhc3MgRnJlZXphYmxlCisgICAgQG5h
bWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAZGVwcmVjYXRlZCBVc2Ug
YE9iamVjdC5mcmVlemVgIGluc3RlYWQuCisgICAgQHByaXZhdGUKKyAgKi8KKyAgdmFyIEZyZWV6
YWJsZSA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIGluaXQ6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdgRW1iZXIuRnJlZXph
YmxlYCBpcyBkZXByZWNhdGVkLCB1c2UgYE9iamVjdC5mcmVlemVgIGluc3RlYWQuJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1ydW50aW1lLmZyZWV6YWJsZS1pbml0JywgdW50aWw6ICczLjAuMCcgfSk7
CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFNldCB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIGZyb3plbi4gVXNl
IHRoaXMgcHJvcGVydHkgdG8gZGV0ZWN0CisgICAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZy
b3plbiBvciBub3QuCisgICAgICAgQHByb3BlcnR5IGlzRnJvemVuCisgICAgICBAdHlwZSBCb29s
ZWFuCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaXNGcm96ZW46IGZhbHNlLAorCisgICAg
LyoqCisgICAgICBGcmVlemVzIHRoZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4g
Y2FsbGVkIHRoZSBvYmplY3Qgc2hvdWxkCisgICAgICBubyBsb25nZXIgYWxsb3cgYW55IHByb3Bl
cnRpZXMgdG8gYmUgZWRpdGVkLgorICAgICAgIEBtZXRob2QgZnJlZXplCisgICAgICBAcmV0dXJu
IHtPYmplY3R9IHJlY2VpdmVyCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZnJlZXplOiBm
dW5jdGlvbiAoKSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdpc0Zyb3plbicpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywgJ2lzRnJvemVuJywgdHJ1ZSk7CisgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgfSk7CisKKyAgZXhwb3J0cy5GcmVlemFibGUgPSBG
cmVlemFibGU7CisgIHZhciBGUk9aRU5fRVJST1IgPSAnRnJvemVuIG9iamVjdCBjYW5ub3QgYmUg
bW9kaWZpZWQuJzsKKyAgZXhwb3J0cy5GUk9aRU5fRVJST1IgPSBGUk9aRU5fRVJST1I7Cit9KTsK
K2VuaWZlZCgnZW1iZXItcnVudGltZS9taXhpbnMvbXV0YWJsZV9hcnJheScsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXIt
bWV0YWwvbWl4aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvYXJyYXknLCAnZW1iZXItcnVudGlt
ZS9taXhpbnMvbXV0YWJsZV9lbnVtZXJhYmxlJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2VudW1l
cmFibGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXks
IF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2VudW1lcmFibGUsIF9lbWJlclJ1bnRpbWVNaXhp
bnNFbnVtZXJhYmxlKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQorICAqLworCisgIC8vIHJlcXVpcmUoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2Fy
cmF5Jyk7CisgIC8vIHJlcXVpcmUoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL211dGFibGVfZW51bWVy
YWJsZScpOworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gQ09OU1RBTlRTCisgIC8vCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIHZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gJ0luZGV4IG91dCBvZiByYW5nZSc7
CisgIHZhciBFTVBUWSA9IFtdOworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gSEVMUEVSUworICAvLworCisgIC8q
KgorICAgIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlpbmcgYXJyYXktbGlr
ZSBvYmplY3RzLiBUaGVzZSBtZXRob2RzCisgICAgY2FuIGJlIGFwcGxpZWQgb25seSB0byBhIGNv
bGxlY3Rpb24gdGhhdCBrZWVwcyBpdHMgaXRlbXMgaW4gYW4gb3JkZXJlZCBzZXQuCisgICAgSXQg
YnVpbGRzIHVwb24gdGhlIEFycmF5IG1peGluIGFuZCBhZGRzIG1ldGhvZHMgdG8gbW9kaWZ5IHRo
ZSBhcnJheS4KKyAgICBPbmUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3Mg
aW5jbHVkZSBBcnJheVByb3h5LgorICAKKyAgICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBt
ZXRob2RzIGluIHRoaXMgY2xhc3MgdG8gbW9kaWZ5IGFycmF5cyBzbyB0aGF0CisgICAgY2hhbmdl
cyBhcmUgb2JzZXJ2YWJsZS4gVGhpcyBhbGxvd3MgdGhlIGJpbmRpbmcgc3lzdGVtIGluIEVtYmVy
IHRvIGZ1bmN0aW9uCisgICAgY29ycmVjdGx5LgorICAKKyAgCisgICAgTm90ZSB0aGF0IGFuIEFy
cmF5IGNhbiBjaGFuZ2UgZXZlbiBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhpbi4K
KyAgICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IGltcGxlbWVudCBhIFNwYXJzZUFycmF5IHRoYXQg
Y2Fubm90IGJlIGRpcmVjdGx5CisgICAgbW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWluZyBl
bnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCisgIAorICAgIEBjbGFzcyBN
dXRhYmxlQXJyYXkKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuQXJyYXkK
KyAgICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoX2VtYmVyUnVu
dGltZU1peGluc0FycmF5LmRlZmF1bHQsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2VudW1l
cmFibGUuZGVmYXVsdCwgeworCisgICAgLyoqCisgICAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0
IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorICAgICAgIFRoaXMg
aXMgb25lIG9mIHRoZSBwcmltaXRpdmVzIHlvdSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0IGBF
bWJlci5BcnJheWAuCisgICAgICBZb3Ugc2hvdWxkIHJlcGxhY2UgYW10IG9iamVjdHMgc3RhcnRl
ZCBhdCBpZHggd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUKKyAgICAgIHBhc3NlZCBhcnJheS4gWW91
IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAKKyAg
ICAgICBAbWV0aG9kIHJlcGxhY2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggU3RhcnRpbmcg
aW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElmCisgICAgICAgIGlkeCA+PSBsZW5ndGgs
IHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgICAgQHBhcmFtIHtOdW1i
ZXJ9IGFtdCBOdW1iZXIgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tCisg
ICAgICAgIHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCouCisgICAgICBAcGFyYW0ge0FycmF5
fSBvYmplY3RzIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJl
CisgICAgICAgIGluc2VydGVkIGludG8gdGhlIGFycmF5IGF0ICppZHgqCisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICByZXBsYWNlOiBudWxsLAorCisgICAgLyoqCisgICAgICBSZW1vdmUgYWxs
IGVsZW1lbnRzIGZyb20gdGhlIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKKyAgICAgIHdh
bnQgdG8gcmV1c2UgYW4gZXhpc3RpbmcgYXJyYXkgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUg
aXQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJywgJ2dy
ZWVuJywgJ2JsdWUnXTsKKyAgICAgICBjb2xvci5sZW5ndGgoKTsgICAvLyAgMworICAgICAgY29s
b3JzLmNsZWFyKCk7ICAgLy8gIFtdCisgICAgICBjb2xvcnMubGVuZ3RoKCk7ICAvLyAgMAorICAg
ICAgYGBgCisgICAgICAgQG1ldGhvZCBjbGVhcgorICAgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9
IEFuIGVtcHR5IEFycmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2xlYXI6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ2xlbmd0aCcpOworICAgICAgaWYgKGxlbiA9PT0gMCkgeworICAgICAgICByZXR1cm4gdGhp
czsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgRU1QVFkpOworICAgICAg
cmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhpcyB3aWxsIHVzZSB0aGUg
cHJpbWl0aXZlIGByZXBsYWNlKClgIG1ldGhvZCB0byBpbnNlcnQgYW4gb2JqZWN0IGF0IHRoZQor
ICAgICAgc3BlY2lmaWVkIGluZGV4LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBj
b2xvcnMgPSBbJ3JlZCcsICdncmVlbicsICdibHVlJ107CisgICAgICAgY29sb3JzLmluc2VydEF0
KDIsICd5ZWxsb3cnKTsgIC8vIFsncmVkJywgJ2dyZWVuJywgJ3llbGxvdycsICdibHVlJ10KKyAg
ICAgIGNvbG9ycy5pbnNlcnRBdCg1LCAnb3JhbmdlJyk7ICAvLyBFcnJvcjogSW5kZXggb3V0IG9m
IHJhbmdlCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGluc2VydEF0CisgICAgICBAcGFyYW0g
e051bWJlcn0gaWR4IGluZGV4IG9mIGluc2VydCB0aGUgb2JqZWN0IGF0LgorICAgICAgQHBhcmFt
IHtPYmplY3R9IG9iamVjdCBvYmplY3QgdG8gaW5zZXJ0CisgICAgICBAcmV0dXJuIHtFbWJlci5B
cnJheX0gcmVjZWl2ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGluc2VydEF0OiBmdW5j
dGlvbiAoaWR4LCBvYmplY3QpIHsKKyAgICAgIGlmIChpZHggPiBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7CisgICAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRh
bEVycm9yLmRlZmF1bHQoT1VUX09GX1JBTkdFX0VYQ0VQVElPTik7CisgICAgICB9CisKKyAgICAg
IHRoaXMucmVwbGFjZShpZHgsIDAsIFtvYmplY3RdKTsKKyAgICAgIHJldHVybiB0aGlzOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJlbW92ZSBhbiBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBp
bmRleCB1c2luZyB0aGUgYHJlcGxhY2UoKWAgcHJpbWl0aXZlCisgICAgICBtZXRob2QuIFlvdSBj
YW4gcGFzcyBlaXRoZXIgYSBzaW5nbGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgor
ICAgICAgIElmIHlvdSBwYXNzIGEgc3RhcnQgYW5kIGxlbmd0aCB0aGF0IGlzIGJleW9uZCB0aGUK
KyAgICAgIGxlbmd0aCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGBPVVRfT0ZfUkFOR0VfRVhD
RVBUSU9OYC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQn
LCAnZ3JlZW4nLCAnYmx1ZScsICd5ZWxsb3cnLCAnb3JhbmdlJ107CisgICAgICAgY29sb3JzLnJl
bW92ZUF0KDApOyAgICAgLy8gWydncmVlbicsICdibHVlJywgJ3llbGxvdycsICdvcmFuZ2UnXQor
ICAgICAgY29sb3JzLnJlbW92ZUF0KDIsIDIpOyAgLy8gWydncmVlbicsICdibHVlJ10KKyAgICAg
IGNvbG9ycy5yZW1vdmVBdCg0LCAyKTsgIC8vIEVycm9yOiBJbmRleCBvdXQgb2YgcmFuZ2UKKyAg
ICAgIGBgYAorICAgICAgIEBtZXRob2QgcmVtb3ZlQXQKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBz
dGFydCBpbmRleCwgc3RhcnQgb2YgcmFuZ2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBsZW4gbGVu
Z3RoIG9mIHBhc3NpbmcgcmFuZ2UKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChzdGFydCwg
bGVuKSB7CisgICAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkgeworICAgICAgICBp
ZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlz
LCAnbGVuZ3RoJykpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZh
dWx0KE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmFz
dCBjYXNlCisgICAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGxlbiA9
IDE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlcGxhY2Uoc3RhcnQsIGxlbiwgRU1QVFkp
OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBQdXNoIHRoZSBvYmplY3Qgb250byB0aGUgZW5kIG9mIHRoZSBhcnJheS4gV29ya3MganVzdCBs
aWtlIGBwdXNoKClgIGJ1dCBpdAorICAgICAgaXMgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQnLCAnZ3JlZW4nXTsKKyAgICAgICBj
b2xvcnMucHVzaE9iamVjdCgnYmxhY2snKTsgICAgIC8vIFsncmVkJywgJ2dyZWVuJywgJ2JsYWNr
J10KKyAgICAgIGNvbG9ycy5wdXNoT2JqZWN0KFsneWVsbG93J10pOyAgLy8gWydyZWQnLCAnZ3Jl
ZW4nLCBbJ3llbGxvdyddXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwdXNoT2JqZWN0Cisg
ICAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gcHVzaAorICAgICAgQHJldHVybiBvYmplY3Qg
c2FtZSBvYmplY3QgcGFzc2VkIGFzIGEgcGFyYW0KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IHB1c2hPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgIHRoaXMuaW5zZXJ0QXQoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSwgb2JqKTsKKyAgICAgIHJldHVy
biBvYmo7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWRkIHRoZSBvYmplY3RzIGluIHRoZSBw
YXNzZWQgbnVtZXJhYmxlIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBEZWZlcnMKKyAgICAgIG5v
dGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRk
ZWQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJ107Cisg
ICAgICAgY29sb3JzLnB1c2hPYmplY3RzKFsneWVsbG93JywgJ29yYW5nZSddKTsgIC8vIFsncmVk
JywgJ3llbGxvdycsICdvcmFuZ2UnXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwdXNoT2Jq
ZWN0cworICAgICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmplY3Rz
IHRvIGFkZAorICAgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgICAgICBAcHVi
bGljCisgICAgKi8KKyAgICBwdXNoT2JqZWN0czogZnVuY3Rpb24gKG9iamVjdHMpIHsKKyAgICAg
IGlmICghKF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQuZGV0ZWN0KG9iamVj
dHMpIHx8IEFycmF5LmlzQXJyYXkob2JqZWN0cykpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBl
RXJyb3IoJ011c3QgcGFzcyBFbWJlci5FbnVtZXJhYmxlIHRvIEVtYmVyLk11dGFibGVBcnJheSNw
dXNoT2JqZWN0cycpOworICAgICAgfQorICAgICAgdGhpcy5yZXBsYWNlKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOworICAgICAgcmV0dXJu
IHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUG9wIG9iamVjdCBmcm9tIGFycmF5IG9y
IG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0IGxpa2UgYHBvcCgpYCBidXQKKyAgICAg
IGl0IGlzIEtWTy1jb21wbGlhbnQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNv
bG9ycyA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXTsKKyAgICAgICBjb2xvcnMucG9wT2JqZWN0
KCk7ICAgLy8gJ2JsdWUnCisgICAgICBjb25zb2xlLmxvZyhjb2xvcnMpOyAgLy8gWydyZWQnLCAn
Z3JlZW4nXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwb3BPYmplY3QKKyAgICAgIEByZXR1
cm4gb2JqZWN0CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBwb3BPYmplY3Q6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J2xlbmd0aCcpOworICAgICAgaWYgKGxlbiA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgIH0KKworICAgICAgdmFyIHJldCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5vYmpl
Y3RBdCh0aGlzLCBsZW4gLSAxKTsKKyAgICAgIHRoaXMucmVtb3ZlQXQobGVuIC0gMSwgMSk7Cisg
ICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNoaWZ0IGFuIG9iamVj
dCBmcm9tIHN0YXJ0IG9mIGFycmF5IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0
CisgICAgICBsaWtlIGBzaGlmdCgpYCBidXQgaXQgaXMgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSdd
OworICAgICAgIGNvbG9ycy5zaGlmdE9iamVjdCgpOyAgLy8gJ3JlZCcKKyAgICAgIGNvbnNvbGUu
bG9nKGNvbG9ycyk7ICAgLy8gWydncmVlbicsICdibHVlJ10KKyAgICAgIGBgYAorICAgICAgIEBt
ZXRob2Qgc2hpZnRPYmplY3QKKyAgICAgIEByZXR1cm4gb2JqZWN0CisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzaGlmdE9iamVjdDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJykgPT09IDApIHsKKyAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZXQgPSBfZW1iZXJSdW50aW1lTWl4aW5z
QXJyYXkub2JqZWN0QXQodGhpcywgMCk7CisgICAgICB0aGlzLnJlbW92ZUF0KDApOworICAgICAg
cmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBVbnNoaWZ0IGFuIG9iamVjdCB0
byBzdGFydCBvZiBhcnJheS4gV29ya3MganVzdCBsaWtlIGB1bnNoaWZ0KClgIGJ1dCBpdCBpcwor
ICAgICAgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29s
b3JzID0gWydyZWQnXTsKKyAgICAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgneWVsbG93Jyk7ICAg
IC8vIFsneWVsbG93JywgJ3JlZCddCisgICAgICBjb2xvcnMudW5zaGlmdE9iamVjdChbJ2JsYWNr
J10pOyAgIC8vIFtbJ2JsYWNrJ10sICd5ZWxsb3cnLCAncmVkJ10KKyAgICAgIGBgYAorICAgICAg
IEBtZXRob2QgdW5zaGlmdE9iamVjdAorICAgICAgQHBhcmFtIHsqfSBvYmogb2JqZWN0IHRvIHVu
c2hpZnQKKyAgICAgIEByZXR1cm4gb2JqZWN0IHNhbWUgb2JqZWN0IHBhc3NlZCBhcyBhIHBhcmFt
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB1bnNoaWZ0T2JqZWN0OiBmdW5jdGlvbiAob2Jq
KSB7CisgICAgICB0aGlzLmluc2VydEF0KDAsIG9iaik7CisgICAgICByZXR1cm4gb2JqOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEFkZHMgdGhlIG5hbWVkIG9iamVjdHMgdG8gdGhlIGJlZ2lu
bmluZyBvZiB0aGUgYXJyYXkuIERlZmVycyBub3RpZnlpbmcKKyAgICAgIG9ic2VydmVycyB1bnRp
bCBhbGwgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgdmFyIGNvbG9ycyA9IFsncmVkJ107CisgICAgICAgY29sb3JzLnVuc2hpZnRPYmplY3RzKFsn
YmxhY2snLCAnd2hpdGUnXSk7ICAgLy8gWydibGFjaycsICd3aGl0ZScsICdyZWQnXQorICAgICAg
Y29sb3JzLnVuc2hpZnRPYmplY3RzKCd5ZWxsb3cnKTsgLy8gVHlwZSBFcnJvcjogJ3VuZGVmaW5l
ZCcgaXMgbm90IGEgZnVuY3Rpb24KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgdW5zaGlmdE9i
amVjdHMKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0
cyB0byBhZGQKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1
YmxpYworICAgICovCisgICAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7Cisg
ICAgICB0aGlzLnJlcGxhY2UoMCwgMCwgb2JqZWN0cyk7CisgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBSZXZlcnNlIG9iamVjdHMgaW4gdGhlIGFycmF5LiBXb3Jr
cyBqdXN0IGxpa2UgYHJldmVyc2UoKWAgYnV0IGl0IGlzCisgICAgICBLVk8tY29tcGxpYW50Lgor
ICAgICAgIEBtZXRob2QgcmV2ZXJzZU9iamVjdHMKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5
fSByZWNlaXZlcgorICAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJldmVyc2VPYmplY3RzOiBm
dW5jdGlvbiAoKSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0
KHRoaXMsICdsZW5ndGgnKTsKKyAgICAgIGlmIChsZW4gPT09IDApIHsKKyAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgICB9CisKKyAgICAgIHZhciBvYmplY3RzID0gdGhpcy50b0FycmF5KCkucmV2
ZXJzZSgpOworICAgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7CisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZXBsYWNlIGFsbCB0aGUgcmVjZWl2
ZXIncyBjb250ZW50IHdpdGggY29udGVudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICBJZiBhcmd1
bWVudCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3aWxsIGJlIGNsZWFyZWQuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUn
XTsKKyAgICAgICBjb2xvcnMuc2V0T2JqZWN0cyhbJ2JsYWNrJywgJ3doaXRlJ10pOyAgLy8gWydi
bGFjaycsICd3aGl0ZSddCisgICAgICBjb2xvcnMuc2V0T2JqZWN0cyhbXSk7ICAgICAgICAgICAg
ICAgICAgLy8gW10KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2Qgc2V0T2JqZWN0cworICAgICAg
QHBhcmFtIHtFbWJlci5BcnJheX0gb2JqZWN0cyBhcnJheSB3aG9zZSBjb250ZW50IHdpbGwgYmUg
dXNlZCBmb3IgcmVwbGFjaW5nCisgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVy
CisgICAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIgd2l0aCB0aGUgbmV3IGNvbnRl
bnQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNldE9iamVjdHM6IGZ1bmN0aW9uIChvYmpl
Y3RzKSB7CisgICAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuY2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgICB0aGlzLnJlcGxhY2UoMCwgbGVu
LCBvYmplY3RzKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAg
Ly8gSU1QTEVNRU5UIEVtYmVyLk11dGFibGVFbnVtZXJhYmxlCisgICAgLy8KKworICAgIC8qKgor
ICAgICAgUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiBhbiBvYmplY3QgaW4gdGhlIGFycmF5Lgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBjaXRpZXMgPSBbJ0NoaWNhZ28nLCAnQmVy
bGluJywgJ0xpbWEnLCAnQ2hpY2FnbyddOworICAgICAgIGNpdGllcy5yZW1vdmVPYmplY3QoJ0No
aWNhZ28nKTsgIC8vIFsnQmVybGluJywgJ0xpbWEnXQorICAgICAgY2l0aWVzLnJlbW92ZU9iamVj
dCgnTGltYScpOyAgICAgLy8gWydCZXJsaW4nXQorICAgICAgY2l0aWVzLnJlbW92ZU9iamVjdCgn
VG9reW8nKSAgICAgLy8gWydCZXJsaW4nXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCByZW1v
dmVPYmplY3QKKyAgICAgIEBwYXJhbSB7Kn0gb2JqIG9iamVjdCB0byByZW1vdmUKKyAgICAgIEBy
ZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAg
cmVtb3ZlT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CisgICAgICB2YXIgbG9jID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSB8fCAwOworICAgICAgd2hpbGUgKC0t
bG9jID49IDApIHsKKyAgICAgICAgdmFyIGN1ck9iamVjdCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNB
cnJheS5vYmplY3RBdCh0aGlzLCBsb2MpOworCisgICAgICAgIGlmIChjdXJPYmplY3QgPT09IG9i
aikgeworICAgICAgICAgIHRoaXMucmVtb3ZlQXQobG9jKTsKKyAgICAgICAgfQorICAgICAgfQor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUHVzaCB0aGUgb2Jq
ZWN0IG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgaWYgaXQgaXMgbm90IGFscmVhZHkKKyAgICAg
IHByZXNlbnQgaW4gdGhlIGFycmF5LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBj
aXRpZXMgPSBbJ0NoaWNhZ28nLCAnQmVybGluJ107CisgICAgICAgY2l0aWVzLmFkZE9iamVjdCgn
TGltYScpOyAgICAvLyBbJ0NoaWNhZ28nLCAnQmVybGluJywgJ0xpbWEnXQorICAgICAgY2l0aWVz
LmFkZE9iamVjdCgnQmVybGluJyk7ICAvLyBbJ0NoaWNhZ28nLCAnQmVybGluJywgJ0xpbWEnXQor
ICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBhZGRPYmplY3QKKyAgICAgIEBwYXJhbSB7Kn0gb2Jq
IG9iamVjdCB0byBhZGQsIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JqZWN0
OiBmdW5jdGlvbiAob2JqKSB7CisgICAgICBpZiAoIXRoaXMuY29udGFpbnMob2JqKSkgeworICAg
ICAgICB0aGlzLnB1c2hPYmplY3Qob2JqKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7
CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxl
X2VudW1lcmFibGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJs
ZScsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLCBfZW1iZXJN
ZXRhbE1peGluLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cykgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisg
ICovCisKKyAgLyoqCisgICAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWlu
ZyBnZW5lcmljIGVudW1lcmFibGVzLiBUaGVzZSBtZXRob2RzCisgICAgY2FuIGJlIGFwcGxpZWQg
dG8gYW4gb2JqZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBvcmRlcmVkIG9yCisgICAg
dW5vcmRlcmVkLgorICAKKyAgICBOb3RlIHRoYXQgYW4gRW51bWVyYWJsZSBjYW4gY2hhbmdlIGV2
ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCisgICAgRm9yIGV4YW1wbGUs
IGEgTWFwcGVkRW51bWVyYWJsZSBjYW5ub3QgYmUgZGlyZWN0bHkgbW9kaWZpZWQgYnV0IGlmIGl0
cworICAgIHVuZGVybHlpbmcgZW51bWVyYWJsZSBjaGFuZ2VzLCBpdCB3aWxsIGNoYW5nZSBhbHNv
LgorICAKKyAgICAjIyBBZGRpbmcgT2JqZWN0cworICAKKyAgICBUbyBhZGQgYW4gb2JqZWN0IHRv
IGFuIGVudW1lcmFibGUsIHVzZSB0aGUgYGFkZE9iamVjdCgpYCBtZXRob2QuIFRoaXMKKyAgICBt
ZXRob2Qgd2lsbCBvbmx5IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJhYmxlIGlmIHRoZSBv
YmplY3QgaXMgbm90CisgICAgYWxyZWFkeSBwcmVzZW50IGFuZCBpcyBvZiBhIHR5cGUgc3VwcG9y
dGVkIGJ5IHRoZSBlbnVtZXJhYmxlLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgc2V0LmFk
ZE9iamVjdChjb250YWN0KTsKKyAgICBgYGAKKyAgCisgICAgIyMgUmVtb3ZpbmcgT2JqZWN0cwor
ICAKKyAgICBUbyByZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBg
cmVtb3ZlT2JqZWN0KClgIG1ldGhvZC4gVGhpcworICAgIHdpbGwgb25seSByZW1vdmUgdGhlIG9i
amVjdCBpZiBpdCBpcyBwcmVzZW50IGluIHRoZSBlbnVtZXJhYmxlLCBvdGhlcndpc2UKKyAgICB0
aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgc2V0
LnJlbW92ZU9iamVjdChjb250YWN0KTsKKyAgICBgYGAKKyAgCisgICAgIyMgSW1wbGVtZW50aW5n
IEluIFlvdXIgT3duIENvZGUKKyAgCisgICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2Jq
ZWN0IGFuZCB3YW50IHRvIHN1cHBvcnQgdGhpcyBBUEksIGp1c3QgaW5jbHVkZQorICAgIHRoaXMg
bWl4aW4gaW4geW91ciBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2RzLiBJ
biB5b3VyIHVuaXQKKyAgICB0ZXN0cywgYmUgc3VyZSB0byBhcHBseSB0aGUgRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KKyAgCisgICAgQGNsYXNzIE11dGFibGVF
bnVtZXJhYmxlCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEB1c2VzIEVtYmVyLkVudW1lcmFi
bGUKKyAgICBAcHVibGljCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4
aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQsIHsK
KworICAgIC8qKgorICAgICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBt
ZXRob2QgdG8gYXBwbHkgdGhpcyBtaXhpbi4KKyAgICAgICBBdHRlbXB0cyB0byBhZGQgdGhlIHBh
c3NlZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgbm90CisgICAgICBh
bHJlYWR5IHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMgcHJlc2Vu
dCwgdGhpcyBtZXRob2QKKyAgICAgIGhhcyBubyBlZmZlY3QuCisgICAgICAgSWYgdGhlIHBhc3Nl
ZCBvYmplY3QgaXMgb2YgYSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlY2VpdmVyLAorICAg
ICAgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgIEBt
ZXRob2QgYWRkT2JqZWN0CisgICAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3Qg
dG8gYWRkIHRvIHRoZSBlbnVtZXJhYmxlLgorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFz
c2VkIG9iamVjdAorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JqZWN0OiBudWxsLAor
CisgICAgLyoqCisgICAgICBBZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJs
ZSB0byB0aGUgcmVjZWl2ZXIuCisgICAgICAgQG1ldGhvZCBhZGRPYmplY3RzCisgICAgICBAcGFy
YW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgorICAgICAg
QHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRk
T2JqZWN0czogZnVuY3Rpb24gKG9iamVjdHMpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisK
KyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRo
aXMpOworICAgICAgb2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgcmV0
dXJuIF90aGlzLmFkZE9iamVjdChvYmopOworICAgICAgfSk7CisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X2V2ZW50cy5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyk7CisgICAgICByZXR1cm4gdGhp
czsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxl
bWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorICAgICAgIEF0dGVtcHRzIHRv
IHJlbW92ZSB0aGUgcGFzc2VkIG9iamVjdCBmcm9tIHRoZSByZWNlaXZlciBjb2xsZWN0aW9uIGlm
IHRoZQorICAgICAgb2JqZWN0IGlzIHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBv
YmplY3QgaXMgbm90IHByZXNlbnQsCisgICAgICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0Lgor
ICAgICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5
IHRoZSByZWNlaXZlciwKKyAgICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4
Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIHJlbW92ZU9iamVjdAorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnVtZXJhYmxlLgorICAg
ICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIG9iamVjdAorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgcmVtb3ZlT2JqZWN0OiBudWxsLAorCisgICAgLyoqCisgICAgICBSZW1vdmVzIGVh
Y2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSBmcm9tIHRoZSByZWNlaXZlci4KKyAg
ICAgICBAbWV0aG9kIHJlbW92ZU9iamVjdHMKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJs
ZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byByZW1vdmUKKyAgICAgIEByZXR1cm4ge09iamVjdH0g
cmVjZWl2ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlbW92ZU9iamVjdHM6IGZ1bmN0
aW9uIChvYmplY3RzKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblBy
b3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgICAgIGZvciAodmFyIGkgPSBvYmplY3RzLmxlbmd0aCAt
IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHRoaXMucmVtb3ZlT2JqZWN0KG9iamVjdHNbaV0p
OworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMuZW5kUHJvcGVydHlD
aGFuZ2VzKHRoaXMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICB9KTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9vYnNlcnZhYmxlJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvZ2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwv
c2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItbWV0YWwvZXZlbnRz
JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycsICdlbWJlci1tZXRhbC9vYnNlcnZlcics
ICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsR2V0X3Byb3BlcnRpZXMsIF9lbWJlck1l
dGFsU2V0X3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsRXZlbnRzLCBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cywgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVyTWV0
YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxJc19ub25lKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVy
CisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvKioKKyAgICAjIyBPdmVydmlldworICAKKyAgICBUaGlzIG1peGluIHByb3ZpZGVzIHByb3Bl
cnRpZXMgYW5kIHByb3BlcnR5IG9ic2VydmluZyBmdW5jdGlvbmFsaXR5LCBjb3JlCisgICAgZmVh
dHVyZXMgb2YgdGhlIEVtYmVyIG9iamVjdCBtb2RlbC4KKyAgCisgICAgUHJvcGVydGllcyBhbmQg
b2JzZXJ2ZXJzIGFsbG93IG9uZSBvYmplY3QgdG8gb2JzZXJ2ZSBjaGFuZ2VzIHRvIGEKKyAgICBw
cm9wZXJ0eSBvbiBhbm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFs
IHdheXMgdGhhdAorICAgIG1vZGVscywgY29udHJvbGxlcnMgYW5kIHZpZXdzIGNvbW11bmljYXRl
IHdpdGggZWFjaCBvdGhlciBpbiBhbiBFbWJlcgorICAgIGFwcGxpY2F0aW9uLgorICAKKyAgICBB
bnkgb2JqZWN0IHRoYXQgaGFzIHRoaXMgbWl4aW4gYXBwbGllZCBjYW4gYmUgdXNlZCBpbiBvYnNl
cnZlcgorICAgIG9wZXJhdGlvbnMuIFRoYXQgaW5jbHVkZXMgYEVtYmVyLk9iamVjdGAgYW5kIG1v
c3Qgb2JqZWN0cyB5b3Ugd2lsbAorICAgIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIg
RW1iZXIgYXBwbGljYXRpb24uCisgIAorICAgIE5vdGUgdGhhdCB5b3Ugd2lsbCBub3QgZ2VuZXJh
bGx5IGFwcGx5IHRoaXMgbWl4aW4gdG8gY2xhc3NlcyB5b3Vyc2VsZiwKKyAgICBidXQgeW91IHdp
bGwgdXNlIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBz
byBpdAorICAgIGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyB0byB1c2UgaXQuCisgIAor
ICAgICMjIFVzaW5nIGBnZXQoKWAgYW5kIGBzZXQoKWAKKyAgCisgICAgQmVjYXVzZSBvZiBFbWJl
cidzIHN1cHBvcnQgZm9yIGJpbmRpbmdzIGFuZCBvYnNlcnZlcnMsIHlvdSB3aWxsIGFsd2F5cwor
ICAgIGFjY2VzcyBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCBhbmQgc2V0IHByb3Bl
cnRpZXMgdXNpbmcgdGhlCisgICAgc2V0IG1ldGhvZC4gVGhpcyBhbGxvd3MgdGhlIG9ic2Vydmlu
ZyBvYmplY3RzIHRvIGJlIG5vdGlmaWVkIGFuZAorICAgIGNvbXB1dGVkIHByb3BlcnRpZXMgdG8g
YmUgaGFuZGxlZCBwcm9wZXJseS4KKyAgCisgICAgTW9yZSBkb2N1bWVudGF0aW9uIGFib3V0IGBn
ZXRgIGFuZCBgc2V0YCBhcmUgYmVsb3cuCisgIAorICAgICMjIE9ic2VydmluZyBQcm9wZXJ0eSBD
aGFuZ2VzCisgIAorICAgIFlvdSB0eXBpY2FsbHkgb2JzZXJ2ZSBwcm9wZXJ0eSBjaGFuZ2VzIHNp
bXBseSBieSB1c2luZyB0aGUgYEVtYmVyLm9ic2VydmVyYAorICAgIGZ1bmN0aW9uIGluIGNsYXNz
ZXMgdGhhdCB5b3Ugd3JpdGUuCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICB2YWx1ZU9ic2VydmVyOiBF
bWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIHJldikg
eworICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFu
Z2VzCisgICAgICAgIC8vIFNlZSB0aGUgYWRkT2JzZXJ2ZXIgbWV0aG9kIGZvciBtb3JlIGluZm9y
bWF0aW9uIGFib3V0IHRoZSBjYWxsYmFjayBhcmd1bWVudHMKKyAgICAgIH0pCisgICAgfSk7Cisg
ICAgYGBgCisgIAorICAgIEFsdGhvdWdoIHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHdheSB0byBh
ZGQgYW4gb2JzZXJ2ZXIsIHRoaXMgY2FwYWJpbGl0eQorICAgIGlzIGFjdHVhbGx5IGJ1aWx0IGlu
dG8gdGhlIGBFbWJlci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0d28gbWV0aG9kcworICAgIGRl
ZmluZWQgaW4gdGhpcyBtaXhpbjogYGFkZE9ic2VydmVyYCBhbmQgYHJlbW92ZU9ic2VydmVyYC4g
WW91IGNhbiB1c2UKKyAgICB0aGVzZSB0d28gbWV0aG9kcyB0byBhZGQgYW5kIHJlbW92ZSBvYnNl
cnZlcnMgeW91cnNlbGYgaWYgeW91IG5lZWQgdG8KKyAgICBkbyBzbyBhdCBydW50aW1lLgorICAK
KyAgICBUbyBhZGQgYW4gb2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHksIGNhbGw6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBvYmplY3QuYWRkT2JzZXJ2ZXIoJ3Byb3BlcnR5S2V5JywgdGFyZ2V0
T2JqZWN0LCB0YXJnZXRBY3Rpb24pCisgICAgYGBgCisgIAorICAgIFRoaXMgd2lsbCBjYWxsIHRo
ZSBgdGFyZ2V0QWN0aW9uYCBtZXRob2Qgb24gdGhlIGB0YXJnZXRPYmplY3RgIHdoZW5ldmVyCisg
ICAgdGhlIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNoYW5nZXMuCisgIAorICAgIE5vdGUg
dGhhdCBpZiBgcHJvcGVydHlLZXlgIGlzIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBvYnNlcnZl
ciB3aWxsIGJlCisgICAgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBwcm9wZXJ0eSBkZXBlbmRlbmNp
ZXMgYXJlIGNoYW5nZWQsIGV2ZW4gaWYgdGhlCisgICAgcmVzdWx0aW5nIHZhbHVlIG9mIHRoZSBj
b21wdXRlZCBwcm9wZXJ0eSBpcyB1bmNoYW5nZWQuIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgYmVj
YXVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBub3QgY29tcHV0ZWQgdW50aWwgYGdldGAgaXMg
Y2FsbGVkLgorICAKKyAgICBAY2xhc3MgT2JzZXJ2YWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIK
KyAgICBAcHVibGljCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4aW4u
TWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBh
IHByb3BlcnR5IGZyb20gdGhlIG9iamVjdC4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5
IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtrZXlOYW1lXWAgb3IgYG9iamVjdC5rZXlOYW1lYCwK
KyAgICAgIGhvd2V2ZXIgaXQgc3VwcG9ydHMgYm90aCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCB0
aGUgdW5rbm93blByb3BlcnR5CisgICAgICBoYW5kbGVyLgorICAgICAgIEJlY2F1c2UgYGdldGAg
dW5pZmllcyB0aGUgc3ludGF4IGZvciBhY2Nlc3NpbmcgYWxsIHRoZXNlIGtpbmRzCisgICAgICBv
ZiBwcm9wZXJ0aWVzLCBpdCBjYW4gbWFrZSBtYW55IHJlZmFjdG9yaW5ncyBlYXNpZXIsIHN1Y2gg
YXMgcmVwbGFjaW5nIGEKKyAgICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJv
cGVydHksIG9yIHZpY2UgdmVyc2EuCisgICAgICAgIyMjIENvbXB1dGVkIFByb3BlcnRpZXMKKyAg
ICAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBtZXRob2RzIGRlZmluZWQgd2l0aCB0aGUgYHBy
b3BlcnR5YCBtb2RpZmllcgorICAgICAgZGVjbGFyZWQgYXQgdGhlIGVuZCwgc3VjaCBhczoKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAg
IHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUn
KTsKKyAgICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCisgICAgICBgYGAK
KyAgICAgICBXaGVuIHlvdSBjYWxsIGBnZXRgIG9uIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBm
dW5jdGlvbiB3aWxsIGJlCisgICAgICBjYWxsZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBi
ZSByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbgorICAgICAgaXRzZWxmLgorICAgICAg
ICMjIyBVbmtub3duIFByb3BlcnRpZXMKKyAgICAgICBMaWtld2lzZSwgaWYgeW91IHRyeSB0byBj
YWxsIGBnZXRgIG9uIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMKKyAgICAgIGB1bmRlZmluZWRg
LCB0aGUgYHVua25vd25Qcm9wZXJ0eSgpYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG9i
amVjdC4KKyAgICAgIElmIHRoaXMgbWV0aG9kIHJldHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4g
YHVuZGVmaW5lZGAsIGl0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgIGluc3RlYWQuIFRoaXMgYWxs
b3dzIHlvdSB0byBpbXBsZW1lbnQgInZpcnR1YWwiIHByb3BlcnRpZXMgdGhhdCBhcmUKKyAgICAg
IG5vdCBkZWZpbmVkIHVwZnJvbnQuCisgICAgICAgQG1ldGhvZCBnZXQKKyAgICAgIEBwYXJhbSB7
U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQorICAgICAgQHJldHVybiB7
T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdW5kZWZpbmVkLgorICAgICAgQHB1YmxpYwor
ICAgICovCisgICAgZ2V0OiBmdW5jdGlvbiAoa2V5TmFtZSkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBUbyBnZXQgdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2Us
IGNhbGwgYGdldFByb3BlcnRpZXNgCisgICAgICB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzIG9yIGFu
IGFycmF5OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHJlY29yZC5nZXRQcm9wZXJ0aWVz
KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZScpOworICAgICAgLy8geyBmaXJzdE5h
bWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0KKyAgICAgIGBg
YAorICAgICAgIGlzIGVxdWl2YWxlbnQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
cmVjb3JkLmdldFByb3BlcnRpZXMoWydmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZSdd
KTsKKyAgICAgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29k
ZTogJzEwMDExJyB9CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGdldFByb3BlcnRpZXMKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMgdG8gZ2V0CisgICAgICBA
cmV0dXJuIHtPYmplY3R9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBnZXRQcm9wZXJ0aWVz
OiBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwg
YXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAg
ICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZXR1
cm4gX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcy5kZWZhdWx0LmFwcGx5KG51bGwsIFt0aGlzXS5j
b25jYXQoYXJncykpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNldHMgdGhlIHByb3ZpZGVk
IGtleSBvciBwYXRoIHRvIHRoZSB2YWx1ZS4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyBnZW5lcmFs
bHkgdmVyeSBzaW1pbGFyIHRvIGNhbGxpbmcgYG9iamVjdFtrZXldID0gdmFsdWVgIG9yCisgICAg
ICBgb2JqZWN0LmtleSA9IHZhbHVlYCwgZXhjZXB0IHRoYXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBm
b3IgY29tcHV0ZWQKKyAgICAgIHByb3BlcnRpZXMsIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClg
IG1ldGhvZCBhbmQgcHJvcGVydHkgb2JzZXJ2ZXJzLgorICAgICAgICMjIyBDb21wdXRlZCBQcm9w
ZXJ0aWVzCisgICAgICAgSWYgeW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGhh
cyBhIGNvbXB1dGVkIHByb3BlcnR5IGhhbmRsZXIKKyAgICAgIGRlZmluZWQgKHNlZSB0aGUgYGdl
dCgpYCBtZXRob2QgZm9yIGFuIGV4YW1wbGUpLCB0aGVuIGBzZXQoKWAgd2lsbCBjYWxsCisgICAg
ICB0aGF0IG1ldGhvZCwgcGFzc2luZyBib3RoIHRoZSB2YWx1ZSBhbmQga2V5IGluc3RlYWQgb2Yg
c2ltcGx5IGNoYW5naW5nCisgICAgICB0aGUgdmFsdWUgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBm
b3IgdGhvc2UgdGltZXMgd2hlbiB5b3UgbmVlZCB0bworICAgICAgaW1wbGVtZW50IGEgcHJvcGVy
dHkgdGhhdCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBtZW1iZXIKKyAgICAgIHByb3BlcnRp
ZXMuCisgICAgICAgIyMjIFVua25vd24gUHJvcGVydGllcworICAgICAgIElmIHlvdSB0cnkgdG8g
c2V0IGEgdmFsdWUgb24gYSBrZXkgdGhhdCBpcyB1bmRlZmluZWQgaW4gdGhlIHRhcmdldAorICAg
ICAgb2JqZWN0LCB0aGVuIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClgIGhhbmRsZXIgd2lsbCBi
ZSBjYWxsZWQgaW5zdGVhZC4gVGhpcworICAgICAgZ2l2ZXMgeW91IGFuIG9wcG9ydHVuaXR5IHRv
IGltcGxlbWVudCBjb21wbGV4ICJ2aXJ0dWFsIiBwcm9wZXJ0aWVzIHRoYXQKKyAgICAgIGFyZSBu
b3QgcHJlZGVmaW5lZCBvbiB0aGUgb2JqZWN0LiBJZiBgc2V0VW5rbm93blByb3BlcnR5KClgIHJl
dHVybnMKKyAgICAgIHVuZGVmaW5lZCwgdGhlbiBgc2V0KClgIHdpbGwgc2ltcGx5IHNldCB0aGUg
dmFsdWUgb24gdGhlIG9iamVjdC4KKyAgICAgICAjIyMgUHJvcGVydHkgT2JzZXJ2ZXJzCisgICAg
ICAgSW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHByb3BlcnR5LCBgc2V0KClgIHdpbGwgYWxz
byByZWdpc3RlciBhIHByb3BlcnR5CisgICAgICBjaGFuZ2Ugd2l0aCB0aGUgb2JqZWN0LiBVbmxl
c3MgeW91IGhhdmUgcGxhY2VkIHRoaXMgY2FsbCBpbnNpZGUgb2YgYQorICAgICAgYGJlZ2luUHJv
cGVydHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxvY2FsIiBv
YnNlcnZlcnMKKyAgICAgIChpLmUuIG9ic2VydmVyIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlIHNh
bWUgb2JqZWN0KSwgd2lsbCBiZSBjYWxsZWQKKyAgICAgIGltbWVkaWF0ZWx5LiBBbnkgInJlbW90
ZSIgb2JzZXJ2ZXJzIChpLmUuIG9ic2VydmVyIG1ldGhvZHMgZGVjbGFyZWQgb24KKyAgICAgIGFu
b3RoZXIgb2JqZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBs
YXRlciB0aW1lIGluIGEKKyAgICAgIGNvYWxlc2NlZCBtYW5uZXIuCisgICAgICAgQG1ldGhvZCBz
ZXQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSB0byBzZXQKKyAg
ICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IG9yIGBudWxsYC4KKyAg
ICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHBhc3NlZCB2YWx1ZQorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgc2V0OiBmdW5jdGlvbiAoa2V5TmFtZSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIFNldHMgYSBsaXN0IG9mIHByb3BlcnRpZXMgYXQgb25jZS4gVGhl
c2UgcHJvcGVydGllcyBhcmUgc2V0IGluc2lkZQorICAgICAgYSBzaW5nbGUgYGJlZ2luUHJvcGVy
dHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCisgICAgICBvYnNl
cnZlcnMgd2lsbCBiZSBidWZmZXJlZC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICByZWNv
cmQuc2V0UHJvcGVydGllcyh7IGZpcnN0TmFtZTogJ0NoYXJsZXMnLCBsYXN0TmFtZTogJ0pvbGxl
eScgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHNldFByb3BlcnRpZXMKKyAgICAgIEBw
YXJhbSB7T2JqZWN0fSBoYXNoIHRoZSBoYXNoIG9mIGtleXMgYW5kIHZhbHVlcyB0byBzZXQKKyAg
ICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHBhc3NlZCBpbiBoYXNoCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoaGFzaCkgeworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsU2V0X3Byb3BlcnRpZXMuZGVmYXVsdCh0aGlzLCBoYXNoKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBCZWdpbnMgYSBncm91cGluZyBvZiBwcm9wZXJ0eSBjaGFuZ2VzLgor
ICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNoYW5nZXMg
c28gdGhhdCBub3RpZmljYXRpb25zCisgICAgICB3aWxsIG5vdCBiZSBzZW50IHVudGlsIHRoZSBj
aGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAgICBsYXJnZSBu
dW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91bGQgY2Fs
bCB0aGlzCisgICAgICBtZXRob2QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhbmdlcyB0byBi
ZWdpbiBkZWZlcnJpbmcgY2hhbmdlCisgICAgICBub3RpZmljYXRpb25zLiBXaGVuIHlvdSBhcmUg
ZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbAorICAgICAgYGVuZFByb3BlcnR5Q2hhbmdlcygpYCB0
byBkZWxpdmVyIHRoZSBkZWZlcnJlZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgZW5kCisgICAg
ICBkZWZlcnJpbmcuCisgICAgICAgQG1ldGhvZCBiZWdpblByb3BlcnR5Q2hhbmdlcworICAgICAg
QHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBi
ZWdpblByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9ldmVudHMuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKTsKKyAgICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEVuZHMgYSBncm91cGluZyBvZiBwcm9wZXJ0eSBjaGFu
Z2VzLgorICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNo
YW5nZXMgc28gdGhhdCBub3RpZmljYXRpb25zCisgICAgICB3aWxsIG5vdCBiZSBzZW50IHVudGls
IHRoZSBjaGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAgICBs
YXJnZSBudW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91
bGQgY2FsbAorICAgICAgYGJlZ2luUHJvcGVydHlDaGFuZ2VzKClgIGF0IHRoZSBiZWdpbm5pbmcg
b2YgdGhlIGNoYW5nZXMgdG8gZGVmZXIgY2hhbmdlCisgICAgICBub3RpZmljYXRpb25zLiBXaGVu
IHlvdSBhcmUgZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbCB0aGlzIG1ldGhvZCB0bworICAgICAg
ZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZCBkZWZlcnJp
bmcuCisgICAgICAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLk9ic2VydmFibGV9CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZW5kUHJvcGVydHlD
aGFuZ2VzOiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5l
bmRQcm9wZXJ0eUNoYW5nZXMoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lzdGVtIHRoYXQgYSBwcm9wZXJ0eSBpcyBh
Ym91dCB0byBjaGFuZ2UuCisgICAgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBhIHZh
bHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAorICAgICAgYWN0dWFsbHkgY2FsbGlu
ZyBgZ2V0KClgIG9yIGBzZXQoKWAgb24gaXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgdGhp
cworICAgICAgbWV0aG9kIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGlu
ZyB0aGVzZSB0d28gbWV0aG9kcworICAgICAgdG9nZXRoZXIgd2lsbCBub3RpZnkgYWxsIG9ic2Vy
dmVycyB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgcG90ZW50aWFsbHkKKyAgICAgIGNoYW5nZWQgdmFs
dWUuCisgICAgICAgTm90ZSB0aGF0IHlvdSBtdXN0IGFsd2F5cyBjYWxsIGBwcm9wZXJ0eVdpbGxD
aGFuZ2VgIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2VgCisgICAgICBhcyBhIHBhaXIuIElmIHlvdSBk
byBub3QsIGl0IG1heSBnZXQgdGhlIHByb3BlcnR5IGNoYW5nZSBncm91cHMgb3V0IG9mCisgICAg
ICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQgbW9yZSBvZnRl
biB0aGFuIHlvdSB3b3VsZAorICAgICAgbGlrZS4KKyAgICAgICBAbWV0aG9kIHByb3BlcnR5V2ls
bENoYW5nZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0
aGF0IGlzIGFib3V0IHRvIGNoYW5nZS4KKyAgICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgcHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlv
biAoa2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlX
aWxsQ2hhbmdlKHRoaXMsIGtleU5hbWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgTm90aWZ5IHRoZSBvYnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5
IGhhcyBqdXN0IGNoYW5nZWQuCisgICAgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBh
IHZhbHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAorICAgICAgYWN0dWFsbHkgY2Fs
bGluZyBgZ2V0KClgIG9yIGBzZXQoKWAgb24gaXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2Ug
dGhpcworICAgICAgbWV0aG9kIGFuZCBgcHJvcGVydHlXaWxsQ2hhbmdlKClgIGluc3RlYWQuIENh
bGxpbmcgdGhlc2UgdHdvIG1ldGhvZHMKKyAgICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBv
YnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5CisgICAgICBjaGFuZ2Vk
IHZhbHVlLgorICAgICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJvcGVydHlX
aWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAorICAgICAgYXMgYSBwYWlyLiBJZiB5
b3UgZG8gbm90LCBpdCBtYXkgZ2V0IHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZ3JvdXBzIG91dCBvZgor
ICAgICAgb3JkZXIgYW5kIGNhdXNlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZGVsaXZlcmVkIG1vcmUg
b2Z0ZW4gdGhhbiB5b3Ugd291bGQKKyAgICAgIGxpa2UuCisgICAgICAgQG1ldGhvZCBwcm9wZXJ0
eURpZENoYW5nZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtl
eSB0aGF0IGhhcyBqdXN0IGNoYW5nZWQuCisgICAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxl
fQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHByb3BlcnR5RGlkQ2hhbmdlOiBmdW5jdGlv
biAoa2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlE
aWRDaGFuZ2UodGhpcywga2V5TmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxsQ2hh
bmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYCBpbgorICAgICAgc3VjY2Vzc2lvbi4KKyAgICAg
ICBAbWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdlCisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5
TmFtZSBUaGUgcHJvcGVydHkga2V5IHRvIGJlIG5vdGlmaWVkIGFib3V0LgorICAgICAgQHJldHVy
biB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG5vdGlmeVBy
b3BlcnR5Q2hhbmdlOiBmdW5jdGlvbiAoa2V5TmFtZSkgeworICAgICAgdGhpcy5wcm9wZXJ0eVdp
bGxDaGFuZ2Uoa2V5TmFtZSk7CisgICAgICB0aGlzLnByb3BlcnR5RGlkQ2hhbmdlKGtleU5hbWUp
OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWRkcyBhbiBv
YnNlcnZlciBvbiBhIHByb3BlcnR5LgorICAgICAgIFRoaXMgaXMgdGhlIGNvcmUgbWV0aG9kIHVz
ZWQgdG8gcmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHkuCisgICAgICAgT25jZSB5
b3UgY2FsbCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhlIGtleSdzIHZhbHVlIGlzIHNldCwgeW91
ciBvYnNlcnZlcgorICAgICAgd2lsbCBiZSBub3RpZmllZC4gTm90ZSB0aGF0IHRoZSBvYnNlcnZl
cnMgYXJlIHRyaWdnZXJlZCBhbnkgdGltZSB0aGUKKyAgICAgIHZhbHVlIGlzIHNldCwgcmVnYXJk
bGVzcyBvZiB3aGV0aGVyIGl0IGhhcyBhY3R1YWxseSBjaGFuZ2VkLiBZb3VyCisgICAgICBvYnNl
cnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQuCisgICAgICAgWW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgdG8gdGhpcyBtZXRob2QuIFRo
ZQorICAgICAgY29udGV4dCB3aWxsIGJlIHBhc3NlZCB0byB5b3VyIG9ic2VydmVyIG1ldGhvZCB3
aGVuZXZlciBpdCBpcyB0cmlnZ2VyZWQuCisgICAgICBOb3RlIHRoYXQgaWYgeW91IGFkZCB0aGUg
c2FtZSB0YXJnZXQvbWV0aG9kIHBhaXIgb24gYSBrZXkgbXVsdGlwbGUgdGltZXMKKyAgICAgIHdp
dGggZGlmZmVyZW50IGNvbnRleHQgcGFyYW1ldGVycywgeW91ciBvYnNlcnZlciB3aWxsIG9ubHkg
YmUgY2FsbGVkIG9uY2UKKyAgICAgIHdpdGggdGhlIGxhc3QgY29udGV4dCB5b3UgcGFzc2VkLgor
ICAgICAgICMjIyBPYnNlcnZlciBNZXRob2RzCisgICAgICAgT2JzZXJ2ZXIgbWV0aG9kcyB5b3Ug
cGFzcyBzaG91bGQgZ2VuZXJhbGx5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgaWYKKyAg
ICAgIHlvdSBkbyBub3QgcGFzcyBhIGBjb250ZXh0YCBwYXJhbWV0ZXI6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgZm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUs
IHJldikgeyB9OworICAgICAgYGBgCisgICAgICAgVGhlIHNlbmRlciBpcyB0aGUgb2JqZWN0IHRo
YXQgY2hhbmdlZC4gVGhlIGtleSBpcyB0aGUgcHJvcGVydHkgdGhhdAorICAgICAgY2hhbmdlcy4g
VGhlIHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUg
cmV2CisgICAgICBpcyB0aGUgbGFzdCBwcm9wZXJ0eSByZXZpc2lvbiBvZiB0aGUgb2JqZWN0IHdo
ZW4gaXQgY2hhbmdlZCwgd2hpY2ggeW91IGNhbgorICAgICAgdXNlIHRvIGRldGVjdCBpZiB0aGUg
a2V5IHZhbHVlIGhhcyByZWFsbHkgY2hhbmdlZCBvciBub3QuCisgICAgICAgSWYgeW91IHBhc3Mg
YSBgY29udGV4dGAgcGFyYW1ldGVyLCB0aGUgY29udGV4dCB3aWxsIGJlIHBhc3NlZCBiZWZvcmUg
dGhlCisgICAgICByZXZpc2lvbiBsaWtlIHNvOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IGZvb0RpZENoYW5nZTogZnVuY3Rpb24oc2VuZGVyLCBrZXksIHZhbHVlLCBjb250ZXh0LCByZXYp
IHsgfTsKKyAgICAgIGBgYAorICAgICAgIFVzdWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdGhlIHZh
bHVlLCBjb250ZXh0IG9yIHJldmlzaW9uIHBhcmFtZXRlcnMgYXQKKyAgICAgIHRoZSBlbmQuIElu
IHRoaXMgY2FzZSwgaXQgaXMgY29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0
YWtlCisgICAgICBvbmx5IGEgc2VuZGVyIGFuZCBrZXkgdmFsdWUgYXMgcGFyYW1ldGVycyBvciwg
aWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluCisgICAgICBhbnkgb2YgdGhlc2UgdmFsdWVzLCB0
byB3cml0ZSBhbiBvYnNlcnZlciB0aGF0IGhhcyBubyBwYXJhbWV0ZXJzIGF0IGFsbC4KKyAgICAg
ICBAbWV0aG9kIGFkZE9ic2VydmVyCisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkg
dG8gb2JzZXJ2ZXIKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmpl
Y3QgdG8gaW52b2tlCisgICAgICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBt
ZXRob2QgdG8gaW52b2tlLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JzZXJ2ZXI6
IGZ1bmN0aW9uIChrZXksIHRhcmdldCwgbWV0aG9kKSB7CisgICAgICBfZW1iZXJNZXRhbE9ic2Vy
dmVyLmFkZE9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2QpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJlbW92ZSBhbiBvYnNlcnZlciB5b3UgaGF2ZSBwcmV2aW91c2x5IHJlZ2lz
dGVyZWQgb24gdGhpcyBvYmplY3QuIFBhc3MKKyAgICAgIHRoZSBzYW1lIGtleSwgdGFyZ2V0LCBh
bmQgbWV0aG9kIHlvdSBwYXNzZWQgdG8gYGFkZE9ic2VydmVyKClgIGFuZCB5b3VyCisgICAgICB0
YXJnZXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zLgorICAgICAgIEBtZXRo
b2QgcmVtb3ZlT2JzZXJ2ZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBv
YnNlcnZlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0
byBpbnZva2UKKyAgICAgIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXRob2QgVGhlIG1ldGhv
ZCB0byBpbnZva2UuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZW1vdmVPYnNlcnZlcjog
ZnVuY3Rpb24gKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIF9lbWJlck1ldGFsT2JzZXJ2
ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywga2V5LCB0YXJnZXQsIG1ldGhvZCk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBjdXJyZW50bHkgaGFz
IG9ic2VydmVycyByZWdpc3RlcmVkIGZvciBhCisgICAgICBwYXJ0aWN1bGFyIGtleS4gWW91IGNh
biB1c2UgdGhpcyBtZXRob2QgdG8gcG90ZW50aWFsbHkgZGVmZXIgcGVyZm9ybWluZworICAgICAg
YW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBzb21lb25lIGJlZ2lucyBvYnNlcnZpbmcgYSBwYXJ0
aWN1bGFyIHByb3BlcnR5CisgICAgICBvbiB0aGUgb2JqZWN0LgorICAgICAgIEBtZXRob2QgaGFz
T2JzZXJ2ZXJGb3IKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgS2V5IHRvIGNoZWNrCisgICAg
ICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGhhc09ic2Vy
dmVyRm9yOiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxFdmVudHMu
aGFzTGlzdGVuZXJzKHRoaXMsIGtleSArICc6Y2hhbmdlJyk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LCBvciBhIGRlZmF1bHQgdmFs
dWUgaW4gdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgIHByb3BlcnR5IHJldHVybnMgYHVuZGVmaW5l
ZGAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgcGVyc29uLmdldFdpdGhEZWZhdWx0KCds
YXN0TmFtZScsICdEb2UnKTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgZ2V0V2l0aERlZmF1
bHQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0
eSB0byByZXRyaWV2ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRWYWx1ZSBUaGUgdmFs
dWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmRlZmluZWQKKyAgICAgIEBy
ZXR1cm4ge09iamVjdH0gVGhlIHByb3BlcnR5IHZhbHVlIG9yIHRoZSBkZWZhdWx0VmFsdWUuCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICBnZXRXaXRoRGVmYXVsdDogZnVuY3Rpb24gKGtleU5h
bWUsIGRlZmF1bHRWYWx1ZSkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldFdpdGhEZWZhdWx0KHRoaXMsIGtleU5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50
IHZhbHVlIHBsdXMgc29tZSBhbW91bnQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgcGVy
c29uLmluY3JlbWVudFByb3BlcnR5KCdhZ2UnKTsKKyAgICAgIHRlYW0uaW5jcmVtZW50UHJvcGVy
dHkoJ3Njb3JlJywgMik7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGluY3JlbWVudFByb3Bl
cnR5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVy
dHkgdG8gaW5jcmVtZW50CisgICAgICBAcGFyYW0ge051bWJlcn0gaW5jcmVtZW50IFRoZSBhbW91
bnQgdG8gaW5jcmVtZW50IGJ5LiBEZWZhdWx0cyB0byAxCisgICAgICBAcmV0dXJuIHtOdW1iZXJ9
IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGluY3Jl
bWVudFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5TmFtZSwgaW5jcmVtZW50KSB7CisgICAgICBpZiAo
X2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoaW5jcmVtZW50KSkgeworICAgICAgICBpbmNyZW1l
bnQgPSAxOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ011c3QgcGFz
cyBhIG51bWVyaWMgdmFsdWUgdG8gaW5jcmVtZW50UHJvcGVydHknLCAhaXNOYU4ocGFyc2VGbG9h
dChpbmNyZW1lbnQpKSAmJiBpc0Zpbml0ZShpbmNyZW1lbnQpKTsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgKHBhcnNlRmxvYXQoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGtleU5hbWUpKSB8fCAwKSArIGluY3JlbWVudCk7
CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRv
IHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIHNvbWUgYW1vdW50LgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIHBsYXllci5kZWNyZW1lbnRQcm9wZXJ0eSgnbGl2ZXMnKTsKKyAgICAgIG9yYy5k
ZWNyZW1lbnRQcm9wZXJ0eSgnaGVhbHRoJywgNSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGRlY3JlbWVudFByb3BlcnR5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFt
ZSBvZiB0aGUgcHJvcGVydHkgdG8gZGVjcmVtZW50CisgICAgICBAcGFyYW0ge051bWJlcn0gZGVj
cmVtZW50IFRoZSBhbW91bnQgdG8gZGVjcmVtZW50IGJ5LiBEZWZhdWx0cyB0byAxCisgICAgICBA
cmV0dXJuIHtOdW1iZXJ9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGRlY3JlbWVudFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5TmFtZSwgZGVjcmVtZW50
KSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoZGVjcmVtZW50KSkgewor
ICAgICAgICBkZWNyZW1lbnQgPSAxOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ011c3QgcGFzcyBhIG51bWVyaWMgdmFsdWUgdG8gZGVjcmVtZW50UHJvcGVydHknLCAh
aXNOYU4ocGFyc2VGbG9hdChkZWNyZW1lbnQpKSAmJiBpc0Zpbml0ZShkZWNyZW1lbnQpKTsKKyAg
ICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgKF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBrZXlOYW1lKSB8fCAwKSAtIGRlY3JlbWVu
dCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4g
cHJvcGVydHkgdG8gdGhlIG9wcG9zaXRlIG9mIGl0cworICAgICAgY3VycmVudCB2YWx1ZS4KKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2FycERy
aXZlRW5nYWdlZCcpOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCB0b2dnbGVQcm9wZXJ0eQor
ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRv
IHRvZ2dsZQorICAgICAgQHJldHVybiB7Qm9vbGVhbn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgdG9nZ2xlUHJvcGVydHk6IGZ1bmN0aW9uIChrZXlO
YW1lKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMsIGtl
eU5hbWUsICFfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywga2V5TmFtZSkpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZSBvZiBhIGNvbXB1
dGVkIHByb3BlcnR5LCBpZiBpdCBleGlzdHMuCisgICAgICBUaGlzIGFsbG93cyB5b3UgdG8gaW5z
cGVjdCB0aGUgdmFsdWUgb2YgYSBjb21wdXRlZCBwcm9wZXJ0eQorICAgICAgd2l0aG91dCBhY2Np
ZGVudGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKKyAgICAgIGdlbmVy
YXRlZCBsYXppbHkuCisgICAgICAgQG1ldGhvZCBjYWNoZUZvcgorICAgICAgQHBhcmFtIHtTdHJp
bmd9IGtleU5hbWUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGNhY2hlZCB2YWx1ZSBvZiB0
aGUgY29tcHV0ZWQgcHJvcGVydHksIGlmIGFueQorICAgICAgQHB1YmxpYworICAgICovCisgICAg
Y2FjaGVGb3I6IGZ1bmN0aW9uIChrZXlOYW1lKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxD
b21wdXRlZC5jYWNoZUZvcih0aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgLy8gaW50ZW5k
ZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICAgIG9ic2VydmVyc0ZvcktleTogZnVuY3Rpb24g
KGtleU5hbWUpIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbE9ic2VydmVyLm9ic2VydmVyc0Zv
cih0aGlzLCBrZXlOYW1lKTsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRp
bWUvbWl4aW5zL3Byb21pc2VfcHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2NvbXB1
dGVkJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL2Vycm9yJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxTZXRfcHJvcGVy
dGllcywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxF
cnJvcikgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIG5vdCA9IF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQubm90OworICB2YXIgb3IgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVk
Lm9yOworCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3VibW9kdWxlIGVtYmVyLXJ1
bnRpbWUKKyAgKi8KKworICBmdW5jdGlvbiB0YXAocHJveHksIHByb21pc2UpIHsKKyAgICBfZW1i
ZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQocHJveHksIHsKKyAgICAgIGlzRnVsZmlsbGVk
OiBmYWxzZSwKKyAgICAgIGlzUmVqZWN0ZWQ6IGZhbHNlCisgICAgfSk7CisKKyAgICByZXR1cm4g
cHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJv
cGVydGllcy5kZWZhdWx0KHByb3h5LCB7CisgICAgICAgIGNvbnRlbnQ6IHZhbHVlLAorICAgICAg
ICBpc0Z1bGZpbGxlZDogdHJ1ZQorICAgICAgfSk7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAg
fSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJvcGVydGllcy5k
ZWZhdWx0KHByb3h5LCB7CisgICAgICAgIHJlYXNvbjogcmVhc29uLAorICAgICAgICBpc1JlamVj
dGVkOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHRocm93IHJlYXNvbjsKKyAgICB9LCAnRW1iZXI6
IFByb21pc2VQcm94eScpOworICB9CisKKyAgLyoqCisgICAgQSBsb3cgbGV2ZWwgbWl4aW4gbWFr
aW5nIE9iamVjdFByb3h5IHByb21pc2UtYXdhcmUuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICB2YXIgT2JqZWN0UHJvbWlzZVByb3h5ID0gRW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKEVtYmVy
LlByb21pc2VQcm94eU1peGluKTsKKyAgCisgICAgdmFyIHByb3h5ID0gT2JqZWN0UHJvbWlzZVBy
b3h5LmNyZWF0ZSh7CisgICAgICBwcm9taXNlOiAkLmdldEpTT04oJy9zb21lL3JlbW90ZS9kYXRh
Lmpzb24nKQorICAgIH0pOworICAKKyAgICBwcm94eS50aGVuKGZ1bmN0aW9uKGpzb24peworICAg
ICAgIC8vIHRoZSBqc29uCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAgLy8gdGhl
IHJlYXNvbiB3aHkgeW91IGhhdmUgbm8ganNvbgorICAgIH0pOworICAgIGBgYAorICAKKyAgICB0
aGUgcHJveHkgaGFzIGJpbmRhYmxlIGF0dHJpYnV0ZXMgd2hpY2gKKyAgICB0cmFjayB0aGUgcHJv
bWlzZXMgbGlmZSBjeWNsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcHJveHkuZ2V0KCdp
c1BlbmRpbmcnKSAgIC8vPT4gdHJ1ZQorICAgIHByb3h5LmdldCgnaXNTZXR0bGVkJykgIC8vPT4g
ZmFsc2UKKyAgICBwcm94eS5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQorICAgIHByb3h5
LmdldCgnaXNGdWxmaWxsZWQnKSAvLz0+IGZhbHNlCisgICAgYGBgCisgIAorICAgIFdoZW4gdGhl
ICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKKyAgICB3
aXRoIGpzb24sIHRoZSBsaWZlIGN5Y2xlIGF0dHJpYnV0ZXMgd2lsbCB1cGRhdGUgYWNjb3JkaW5n
bHkuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBwcm94eS5nZXQoJ2lzUGVuZGluZycpICAg
Ly89PiBmYWxzZQorICAgIHByb3h5LmdldCgnaXNTZXR0bGVkJykgICAvLz0+IHRydWUKKyAgICBw
cm94eS5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQorICAgIHByb3h5LmdldCgnaXNGdWxm
aWxsZWQnKSAvLz0+IHRydWUKKyAgICBgYGAKKyAgCisgICAgQXMgdGhlIHByb3h5IGlzIGFuIE9i
amVjdFByb3h5LCBhbmQgdGhlIGpzb24gbm93IGl0cyBjb250ZW50LAorICAgIGFsbCB0aGUganNv
biBwcm9wZXJ0aWVzIHdpbGwgYmUgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIHByb3h5Lgor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8gQXNzdW1pbmcgdGhlIGZvbGxvd2luZyBqc29u
OgorICAgIHsKKyAgICAgIGZpcnN0TmFtZTogJ1N0ZWZhbicsCisgICAgICBsYXN0TmFtZTogJ1Bl
bm5lcicKKyAgICB9CisgIAorICAgIC8vIGJvdGggcHJvcGVydGllcyB3aWxsIGFjY2Vzc2libGUg
b24gdGhlIHByb3h5CisgICAgcHJveHkuZ2V0KCdmaXJzdE5hbWUnKSAvLz0+ICdTdGVmYW4nCisg
ICAgcHJveHkuZ2V0KCdsYXN0TmFtZScpICAvLz0+ICdQZW5uZXInCisgICAgYGBgCisgIAorICAg
IEBjbGFzcyBFbWJlci5Qcm9taXNlUHJveHlNaXhpbgorICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhw
b3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgor
ICAgICAgSWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyByZWplY3RlZCB0aGlzIHdpbGwgY29udGFp
biB0aGUgcmVhc29uCisgICAgICBwcm92aWRlZC4KKyAgICAgICBAcHJvcGVydHkgcmVhc29uCisg
ICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZWFzb246IG51
bGwsCisKKyAgICAvKioKKyAgICAgIE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxl
ZCB0aGlzIHdpbGwgYmVjb21lIGBmYWxzZWAuCisgICAgICAgQHByb3BlcnR5IGlzUGVuZGluZwor
ICAgICAgQGRlZmF1bHQgdHJ1ZQorICAgICAgQHB1YmxpYworICAgICovCisgICAgaXNQZW5kaW5n
OiBub3QoJ2lzU2V0dGxlZCcpLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIE9uY2UgdGhl
IHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxlZCB0aGlzIHdpbGwgYmVjb21lIGB0cnVlYC4KKyAg
ICAgICBAcHJvcGVydHkgaXNTZXR0bGVkCisgICAgICBAZGVmYXVsdCBmYWxzZQorICAgICAgQHB1
YmxpYworICAgICovCisgICAgaXNTZXR0bGVkOiBvcignaXNSZWplY3RlZCcsICdpc0Z1bGZpbGxl
ZCcpLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0
aGUgcHJveGllZCBwcm9taXNlIGlzIHJlamVjdGVkLgorICAgICAgIEBwcm9wZXJ0eSBpc1JlamVj
dGVkCisgICAgICBAZGVmYXVsdCBmYWxzZQorICAgICAgQHB1YmxpYworICAgICovCisgICAgaXNS
ZWplY3RlZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0
aGUgcHJveGllZCBwcm9taXNlIGlzIGZ1bGZpbGxlZC4KKyAgICAgICBAcHJvcGVydHkgaXNGdWxm
aWxsZWQKKyAgICAgIEBkZWZhdWx0IGZhbHNlCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBp
c0Z1bGZpbGxlZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIFRoZSBwcm9taXNlIHdob3NlIGZ1
bGZpbGxtZW50IHZhbHVlIGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmplY3QuCisgICAgICAg
VGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCB1cG9uIGNyZWF0aW9uLCBhbmQgc2hvdWxk
IG5vdCBiZQorICAgICAgY2hhbmdlZCBvbmNlIGNyZWF0ZWQuCisgICAgICAgRXhhbXBsZToKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoRW1iZXIu
UHJvbWlzZVByb3h5TWl4aW4pLmNyZWF0ZSh7CisgICAgICAgIHByb21pc2U6IDx0aGVuYWJsZT4K
KyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQHByb3BlcnR5IHByb21pc2UKKyAgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIHByb21pc2U6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQo
eworICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRh
bEVycm9yLmRlZmF1bHQoJ1Byb21pc2VQcm94eVwncyBwcm9taXNlIG11c3QgYmUgc2V0Jyk7Cisg
ICAgICB9LAorICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCBwcm9taXNlKSB7CisgICAgICAgIHJl
dHVybiB0YXAodGhpcywgcHJvbWlzZSk7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAg
ICAgIEFuIGFsaWFzIHRvIHRoZSBwcm94aWVkIHByb21pc2UncyBgdGhlbmAuCisgICAgICAgU2Vl
IFJTVlAuUHJvbWlzZS50aGVuLgorICAgICAgIEBtZXRob2QgdGhlbgorICAgICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KKyAgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIHRoZW46IHByb21pc2VBbGlhcygndGhlbicpLAorCisgICAgLyoq
CisgICAgICBBbiBhbGlhcyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KKyAgICAg
ICBTZWUgUlNWUC5Qcm9taXNlLmNhdGNoLgorICAgICAgIEBtZXRob2QgY2F0Y2gKKyAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Cisg
ICAgICBAc2luY2UgMS4zLjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgICdjYXRjaCc6IHBy
b21pc2VBbGlhcygnY2F0Y2gnKSwKKworICAgIC8qKgorICAgICAgQW4gYWxpYXMgdG8gdGhlIHBy
b3hpZWQgcHJvbWlzZSdzIGBmaW5hbGx5YC4KKyAgICAgICBTZWUgUlNWUC5Qcm9taXNlLmZpbmFs
bHkuCisgICAgICAgQG1ldGhvZCBmaW5hbGx5CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs
YmFjaworICAgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgICAgQHNpbmNlIDEuMy4wCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICAnZmluYWxseSc6IHByb21pc2VBbGlhcygnZmluYWxs
eScpCisKKyAgfSk7CisKKyAgZnVuY3Rpb24gcHJvbWlzZUFsaWFzKG5hbWUpIHsKKyAgICByZXR1
cm4gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHByb21pc2UgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ3Byb21pc2UnKTsKKyAgICAgIHJldHVybiBwcm9taXNlW25hbWVdLmFw
cGx5KHByb21pc2UsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LXJ1bnRpbWUvbWl4aW5zL3JlZ2lzdHJ5X3Byb3h5JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL21peGluJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbERlYnVnLCBfZW1iZXJNZXRhbE1peGluKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisg
IEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLmJ1aWxkRmFrZVJlZ2lzdHJ5V2l0aERlcHJlY2F0aW9ucyA9IGJ1aWxkRmFrZVJlZ2lz
dHJ5V2l0aERlcHJlY2F0aW9uczsKKworICAvKioKKyAgICBSZWdpc3RyeVByb3h5TWl4aW4gaXMg
dXNlZCB0byBwcm92aWRlIHB1YmxpYyBhY2Nlc3MgdG8gc3BlY2lmaWMKKyAgICByZWdpc3RyeSBm
dW5jdGlvbmFsaXR5LgorICAKKyAgICBAY2xhc3MgUmVnaXN0cnlQcm94eU1peGluCisgICAgQHBy
aXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5j
cmVhdGUoeworICAgIF9fcmVnaXN0cnlfXzogbnVsbCwKKworICAgIC8qKgorICAgICBHaXZlbiBh
IGZ1bGxOYW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQHB1Ymxp
YworICAgICBAbWV0aG9kIHJlc29sdmVSZWdpc3RyYXRpb24KKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBmdWxsTmFtZSdzIGZhY3RvcnkKKyAg
ICAgKi8KKyAgICByZXNvbHZlUmVnaXN0cmF0aW9uOiByZWdpc3RyeUFsaWFzKCdyZXNvbHZlJyks
CisKKyAgICAvKioKKyAgICAgIFJlZ2lzdGVycyBhIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBm
b3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gKHdpdGgKKyAgICAgIGBpbmplY3RgKSBvciBmb3Igc2Vy
dmljZSBsb29rdXAuIEVhY2ggZmFjdG9yeSBpcyByZWdpc3RlcmVkIHdpdGgKKyAgICAgIGEgZnVs
bCBuYW1lIGluY2x1ZGluZyB0d28gcGFydHM6IGB0eXBlOm5hbWVgLgorICAgICAgIEEgc2ltcGxl
IGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9IEVtYmVyLkFw
cGxpY2F0aW9uLmNyZWF0ZSgpOworICAgICAgIEFwcC5PcmFuZ2UgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKCk7CisgICAgICBBcHAucmVnaXN0ZXIoJ2ZydWl0OmZhdm9yaXRlJywgQXBwLk9yYW5nZSk7
CisgICAgICBgYGAKKyAgICAgICBFbWJlciB3aWxsIHJlc29sdmUgZmFjdG9yaWVzIGZyb20gdGhl
IGBBcHBgIG5hbWVzcGFjZSBhdXRvbWF0aWNhbGx5LgorICAgICAgRm9yIGV4YW1wbGUgYEFwcC5D
YXJzQ29udHJvbGxlcmAgd2lsbCBiZSBkaXNjb3ZlcmVkIGFuZCByZXR1cm5lZCBpZgorICAgICAg
YW4gYXBwbGljYXRpb24gcmVxdWVzdHMgYGNvbnRyb2xsZXI6Y2Fyc2AuCisgICAgICAgQW4gZXhh
bXBsZSBvZiByZWdpc3RlcmluZyBhIGNvbnRyb2xsZXIgd2l0aCBhIG5vbi1zdGFuZGFyZCBuYW1l
OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNhdGlv
bi5jcmVhdGUoKTsKKyAgICAgIHZhciBTZXNzaW9uID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQo
KTsKKyAgICAgICBBcHAucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6c2Vzc2lvbicsIFNlc3Npb24pOwor
ICAgICAgIC8vIFRoZSBTZXNzaW9uIGNvbnRyb2xsZXIgY2FuIG5vdyBiZSB0cmVhdGVkIGxpa2Ug
YSBub3JtYWwgY29udHJvbGxlciwKKyAgICAgIC8vIGRlc3BpdGUgaXRzIG5vbi1zdGFuZGFyZCBu
YW1lLgorICAgICAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKKyAgICAgICAgbmVlZHM6IFsnc2Vzc2lvbiddCisgICAgICB9KTsKKyAgICAgIGBg
YAorICAgICAgIFJlZ2lzdGVyZWQgZmFjdG9yaWVzIGFyZSAqKmluc3RhbnRpYXRlZCoqIGJ5IGhh
dmluZyBgY3JlYXRlYAorICAgICAgY2FsbGVkIG9uIHRoZW0uIEFkZGl0aW9uYWxseSB0aGV5IGFy
ZSAqKnNpbmdsZXRvbnMqKiwgZWFjaCB0aW1lCisgICAgICB0aGV5IGFyZSBsb29rZWQgdXAgdGhl
eSByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UuCisgICAgICAgU29tZSBleGFtcGxlcyBtb2RpZnlp
bmcgdGhhdCBkZWZhdWx0IGJlaGF2aW9yOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZh
ciBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAgICBBcHAuUGVyc29uID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCgpOworICAgICAgQXBwLk9yYW5nZSA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoKTsKKyAgICAgIEFwcC5FbWFpbCA9IEVtYmVyLk9iamVjdC5leHRlbmQoKTsKKyAgICAg
IEFwcC5zZXNzaW9uID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSgpOworICAgICAgIEFwcC5yZWdpc3Rl
cignbW9kZWw6dXNlcicsIEFwcC5QZXJzb24sIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAgICAg
IEFwcC5yZWdpc3RlcignZnJ1aXQ6ZmF2b3JpdGUnLCBBcHAuT3JhbmdlKTsKKyAgICAgIEFwcC5y
ZWdpc3RlcignY29tbXVuaWNhdGlvbjptYWluJywgQXBwLkVtYWlsLCB7IHNpbmdsZXRvbjogZmFs
c2UgfSk7CisgICAgICBBcHAucmVnaXN0ZXIoJ3Nlc3Npb24nLCBBcHAuc2Vzc2lvbiwgeyBpbnN0
YW50aWF0ZTogZmFsc2UgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlZ2lzdGVyCisg
ICAgICBAcGFyYW0gIGZ1bGxOYW1lIHtTdHJpbmd9IHR5cGU6bmFtZSAoZS5nLiwgJ21vZGVsOnVz
ZXInKQorICAgICAgQHBhcmFtICBmYWN0b3J5IHtGdW5jdGlvbn0gKGUuZy4sIEFwcC5QZXJzb24p
CisgICAgICBAcGFyYW0gIG9wdGlvbnMge09iamVjdH0gKG9wdGlvbmFsKSBkaXNhYmxlIGluc3Rh
bnRpYXRpb24gb3Igc2luZ2xldG9uIHVzYWdlCisgICAgICBAcHVibGljCisgICAgICovCisgICAg
cmVnaXN0ZXI6IHJlZ2lzdHJ5QWxpYXMoJ3JlZ2lzdGVyJyksCisKKyAgICAvKioKKyAgICAgVW5y
ZWdpc3RlciBhIGZhY3RvcnkuCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciBBcHAgPSBF
bWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAgdmFyIFVzZXIgPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKCk7CisgICAgIEFwcC5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOworICAgICAg
QXBwLnJlc29sdmVSZWdpc3RyYXRpb24oJ21vZGVsOnVzZXInKS5jcmVhdGUoKSBpbnN0YW5jZW9m
IFVzZXIgLy89PiB0cnVlCisgICAgICBBcHAudW5yZWdpc3RlcignbW9kZWw6dXNlcicpCisgICAg
IEFwcC5yZXNvbHZlUmVnaXN0cmF0aW9uKCdtb2RlbDp1c2VyJykgPT09IHVuZGVmaW5lZCAvLz0+
IHRydWUKKyAgICAgYGBgCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgdW5yZWdpc3Rlcgor
ICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgKi8KKyAgICB1bnJlZ2lzdGVyOiBy
ZWdpc3RyeUFsaWFzKCd1bnJlZ2lzdGVyJyksCisKKyAgICAvKioKKyAgICAgQ2hlY2sgaWYgYSBm
YWN0b3J5IGlzIHJlZ2lzdGVyZWQuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgaGFzUmVn
aXN0cmF0aW9uCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICAqLworICAgIGhhc1JlZ2lzdHJhdGlvbjogcmVnaXN0cnlBbGlhcygnaGFz
JyksCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXIgYW4gb3B0aW9uIGZvciBhIHBhcnRpY3VsYXIg
ZmFjdG9yeS4KKyAgICAgIEBwdWJsaWMKKyAgICAgQG1ldGhvZCByZWdpc3Rlck9wdGlvbgorICAg
ICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbk5h
bWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgKi8KKyAgICByZWdpc3Rlck9w
dGlvbjogcmVnaXN0cnlBbGlhcygnb3B0aW9uJyksCisKKyAgICAvKioKKyAgICAgUmV0dXJuIGEg
c3BlY2lmaWMgcmVnaXN0ZXJlZCBvcHRpb24gZm9yIGEgcGFydGljdWxhciBmYWN0b3J5LgorICAg
ICAgQHB1YmxpYworICAgICBAbWV0aG9kIHJlZ2lzdGVyZWRPcHRpb24KKyAgICAgQHBhcmFtICB7
U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0gIHtTdHJpbmd9IG9wdGlvbk5hbWUKKyAgICAg
QHJldHVybiB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXJlZE9wdGlvbjog
cmVnaXN0cnlBbGlhcygnZ2V0T3B0aW9uJyksCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXIgb3B0
aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGZhY3RvcnkuCisgICAgICBAcHVibGljCisgICAgIEBtZXRo
b2QgcmVnaXN0ZXJPcHRpb25zCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBA
cGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgICAqLworICAgIHJlZ2lzdGVyT3B0aW9uczogcmVn
aXN0cnlBbGlhcygnb3B0aW9ucycpLAorCisgICAgLyoqCisgICAgIFJldHVybiByZWdpc3RlcmVk
IG9wdGlvbnMgZm9yIGEgcGFydGljdWxhciBmYWN0b3J5LgorICAgICAgQHB1YmxpYworICAgICBA
bWV0aG9kIHJlZ2lzdGVyZWRPcHRpb25zCisgICAgIEBwYXJhbSAge1N0cmluZ30gZnVsbE5hbWUK
KyAgICAgQHJldHVybiB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXJlZE9w
dGlvbnM6IHJlZ2lzdHJ5QWxpYXMoJ2dldE9wdGlvbnMnKSwKKworICAgIC8qKgorICAgICBBbGxv
dyByZWdpc3RlcmluZyBvcHRpb25zIGZvciBhbGwgZmFjdG9yaWVzIG9mIGEgdHlwZS4KKyAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OworICAgICB2YXIgYXBwSW5zdGFuY2UgPSBBcHAuYnVpbGRJbnN0YW5jZSgpOworICAgICAgLy8g
aWYgYWxsIG9mIHR5cGUgYGNvbm5lY3Rpb25gIG11c3Qgbm90IGJlIHNpbmdsZXRvbnMKKyAgICAg
YXBwSW5zdGFuY2Uub3B0aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFs
c2UgfSk7CisgICAgICBhcHBJbnN0YW5jZS5yZWdpc3RlcignY29ubmVjdGlvbjp0d2l0dGVyJywg
VHdpdHRlckNvbm5lY3Rpb24pOworICAgICBhcHBJbnN0YW5jZS5yZWdpc3RlcignY29ubmVjdGlv
bjpmYWNlYm9vaycsIEZhY2Vib29rQ29ubmVjdGlvbik7CisgICAgICB2YXIgdHdpdHRlciA9IGFw
cEluc3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7CisgICAgIHZhciB0d2l0dGVy
MiA9IGFwcEluc3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7CisgICAgICB0d2l0
dGVyID09PSB0d2l0dGVyMjsgLy8gPT4gZmFsc2UKKyAgICAgIHZhciBmYWNlYm9vayA9IGFwcElu
c3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOworICAgICB2YXIgZmFjZWJvb2sy
ID0gYXBwSW5zdGFuY2UubG9va3VwKCdjb25uZWN0aW9uOmZhY2Vib29rJyk7CisgICAgICBmYWNl
Ym9vayA9PT0gZmFjZWJvb2syOyAvLyA9PiBmYWxzZQorICAgICBgYGAKKyAgICAgIEBwdWJsaWMK
KyAgICAgQG1ldGhvZCByZWdpc3Rlck9wdGlvbnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5n
fSB0eXBlCisgICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0
ZXJPcHRpb25zRm9yVHlwZTogcmVnaXN0cnlBbGlhcygnb3B0aW9uc0ZvclR5cGUnKSwKKworICAg
IC8qKgorICAgICBSZXR1cm4gdGhlIHJlZ2lzdGVyZWQgb3B0aW9ucyBmb3IgYWxsIGZhY3Rvcmll
cyBvZiBhIHR5cGUuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgcmVnaXN0ZXJlZE9wdGlv
bnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgIEByZXR1cm4ge09iamVj
dH0gb3B0aW9ucworICAgICAqLworICAgIHJlZ2lzdGVyZWRPcHRpb25zRm9yVHlwZTogcmVnaXN0
cnlBbGlhcygnZ2V0T3B0aW9uc0ZvclR5cGUnKSwKKworICAgIC8qKgorICAgICAgRGVmaW5lIGEg
ZGVwZW5kZW5jeSBpbmplY3Rpb24gb250byBhIHNwZWNpZmljIGZhY3Rvcnkgb3IgYWxsIGZhY3Rv
cmllcworICAgICAgb2YgYSB0eXBlLgorICAgICAgIFdoZW4gRW1iZXIgaW5zdGFudGlhdGVzIGEg
Y29udHJvbGxlciwgdmlldywgb3Igb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudAorICAgICAgaXQg
Y2FuIGF0dGFjaCBhIGRlcGVuZGVuY3kgdG8gdGhhdCBjb21wb25lbnQuIFRoaXMgaXMgb2Z0ZW4g
dXNlZCB0bworICAgICAgcHJvdmlkZSBzZXJ2aWNlcyB0byBhIHNldCBvZiBmcmFtZXdvcmsgY29t
cG9uZW50cy4KKyAgICAgICBBbiBleGFtcGxlIG9mIHByb3ZpZGluZyBhIHNlc3Npb24gb2JqZWN0
IHRvIGFsbCBjb250cm9sbGVyczoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CisgICAgICB2YXIgU2Vzc2lvbiA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoeyBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlIH0pOworICAgICAgIC8vIEEg
ZmFjdG9yeSBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGl0IGNhbiBiZSBpbmplY3RlZAorICAg
ICAgQXBwLnJlZ2lzdGVyKCdzZXNzaW9uOm1haW4nLCBTZXNzaW9uKTsKKyAgICAgICAvLyBJbmpl
Y3QgJ3Nlc3Npb246bWFpbicgb250byBhbGwgZmFjdG9yaWVzIG9mIHRoZSB0eXBlICdjb250cm9s
bGVyJworICAgICAgLy8gd2l0aCB0aGUgbmFtZSAnc2Vzc2lvbicKKyAgICAgIEFwcC5pbmplY3Qo
J2NvbnRyb2xsZXInLCAnc2Vzc2lvbicsICdzZXNzaW9uOm1haW4nKTsKKyAgICAgICBBcHAuSW5k
ZXhDb250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgICBpc0xvZ2dl
ZEluOiBFbWJlci5jb21wdXRlZC5hbGlhcygnc2Vzc2lvbi5pc0F1dGhlbnRpY2F0ZWQnKQorICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJbmplY3Rpb25zIGNhbiBhbHNvIGJlIHBlcmZvcm1l
ZCBvbiBzcGVjaWZpYyBmYWN0b3JpZXMuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBw
LmluamVjdCg8ZnVsbF9uYW1lIG9yIHR5cGU+LCA8cHJvcGVydHkgbmFtZT4sIDxmdWxsX25hbWU+
KQorICAgICAgQXBwLmluamVjdCgncm91dGUnLCAnc291cmNlJywgJ3NvdXJjZTptYWluJykKKyAg
ICAgIEFwcC5pbmplY3QoJ3JvdXRlOmFwcGxpY2F0aW9uJywgJ2VtYWlsJywgJ21vZGVsOmVtYWls
JykKKyAgICAgIGBgYAorICAgICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaW5qZWN0
aW9ucyBjYW4gb25seSBiZSBwZXJmb3JtZWQgb24KKyAgICAgIGNsYXNzZXMgdGhhdCBhcmUgaW5z
dGFudGlhdGVkIGJ5IEVtYmVyIGl0c2VsZi4gSW5zdGFudGlhdGluZyBhIGNsYXNzCisgICAgICBk
aXJlY3RseSAodmlhIGBjcmVhdGVgIG9yIGBuZXdgKSBieXBhc3NlcyB0aGUgZGVwZW5kZW5jeSBp
bmplY3Rpb24KKyAgICAgIHN5c3RlbS4KKyAgICAgICAqKk5vdGU6KiogRW1iZXItRGF0YSBpbnN0
YW50aWF0ZXMgaXRzIG1vZGVscyBpbiBhIHVuaXF1ZSBtYW5uZXIsIGFuZCBjb25zZXF1ZW50bHkK
KyAgICAgIGluamVjdGlvbnMgb250byBtb2RlbHMgKG9yIGFsbCBtb2RlbHMpIHdpbGwgbm90IHdv
cmsgYXMgZXhwZWN0ZWQuIEluamVjdGlvbnMKKyAgICAgIG9uIG1vZGVscyBjYW4gYmUgZW5hYmxl
ZCBieSBzZXR0aW5nIGBFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlNgCisgICAgICB0byBg
dHJ1ZWAuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBpbmplY3QKKyAgICAgIEBwYXJh
bSAgZmFjdG9yeU5hbWVPclR5cGUge1N0cmluZ30KKyAgICAgIEBwYXJhbSAgcHJvcGVydHkge1N0
cmluZ30KKyAgICAgIEBwYXJhbSAgaW5qZWN0aW9uTmFtZSB7U3RyaW5nfQorICAgICoqLworICAg
IGluamVjdDogcmVnaXN0cnlBbGlhcygnaW5qZWN0aW9uJykKKyAgfSk7CisKKyAgZnVuY3Rpb24g
cmVnaXN0cnlBbGlhcyhuYW1lKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBfcmVnaXN0cnlfXzsKKworICAgICAgcmV0dXJuIChfcmVnaXN0cnlfXyA9IHRoaXMuX19yZWdp
c3RyeV9fKVtuYW1lXS5hcHBseShfcmVnaXN0cnlfXywgYXJndW1lbnRzKTsKKyAgICB9OworICB9
CisKKyAgZnVuY3Rpb24gYnVpbGRGYWtlUmVnaXN0cnlXaXRoRGVwcmVjYXRpb25zKGluc3RhbmNl
LCB0eXBlRm9yTWVzc2FnZSkgeworICAgIHZhciBmYWtlUmVnaXN0cnkgPSB7fTsKKyAgICB2YXIg
cmVnaXN0cnlQcm9wcyA9IHsKKyAgICAgIHJlc29sdmU6ICdyZXNvbHZlUmVnaXN0cmF0aW9uJywK
KyAgICAgIHJlZ2lzdGVyOiAncmVnaXN0ZXInLAorICAgICAgdW5yZWdpc3RlcjogJ3VucmVnaXN0
ZXInLAorICAgICAgaGFzOiAnaGFzUmVnaXN0cmF0aW9uJywKKyAgICAgIG9wdGlvbjogJ3JlZ2lz
dGVyT3B0aW9uJywKKyAgICAgIG9wdGlvbnM6ICdyZWdpc3Rlck9wdGlvbnMnLAorICAgICAgZ2V0
T3B0aW9uczogJ3JlZ2lzdGVyZWRPcHRpb25zJywKKyAgICAgIG9wdGlvbnNGb3JUeXBlOiAncmVn
aXN0ZXJPcHRpb25zRm9yVHlwZScsCisgICAgICBnZXRPcHRpb25zRm9yVHlwZTogJ3JlZ2lzdGVy
ZWRPcHRpb25zRm9yVHlwZScsCisgICAgICBpbmplY3Rpb246ICdpbmplY3QnCisgICAgfTsKKwor
ICAgIGZvciAodmFyIGRlcHJlY2F0ZWRQcm9wZXJ0eSBpbiByZWdpc3RyeVByb3BzKSB7CisgICAg
ICBmYWtlUmVnaXN0cnlbZGVwcmVjYXRlZFByb3BlcnR5XSA9IGJ1aWxkRmFrZVJlZ2lzdHJ5RnVu
Y3Rpb24oaW5zdGFuY2UsIHR5cGVGb3JNZXNzYWdlLCBkZXByZWNhdGVkUHJvcGVydHksIHJlZ2lz
dHJ5UHJvcHNbZGVwcmVjYXRlZFByb3BlcnR5XSk7CisgICAgfQorCisgICAgcmV0dXJuIGZha2VS
ZWdpc3RyeTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkRmFrZVJlZ2lzdHJ5RnVuY3Rpb24oaW5z
dGFuY2UsIHR5cGVGb3JNZXNzYWdlLCBkZXByZWNhdGVkUHJvcGVydHksIG5vbkRlcHJlY2F0ZWRQ
cm9wZXJ0eSkgeworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERl
YnVnLmRlcHJlY2F0ZSgnVXNpbmcgYCcgKyB0eXBlRm9yTWVzc2FnZSArICcucmVnaXN0cnkuJyAr
IGRlcHJlY2F0ZWRQcm9wZXJ0eSArICdgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYCcgKyB0
eXBlRm9yTWVzc2FnZSArICcuJyArIG5vbkRlcHJlY2F0ZWRQcm9wZXJ0eSArICdgIGluc3RlYWQu
JywgZmFsc2UsIHsKKyAgICAgICAgaWQ6ICdlbWJlci1hcHBsaWNhdGlvbi5hcHAtaW5zdGFuY2Ut
cmVnaXN0cnknLAorICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDov
L2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54LyN0b2NfZW1iZXItYXBwbGljYXRpb24tcmVn
aXN0cnktZW1iZXItYXBwbGljYXRpb25pbnN0YW5jZS1yZWdpc3RyeScKKyAgICAgIH0pOworICAg
ICAgcmV0dXJuIGluc3RhbmNlW25vbkRlcHJlY2F0ZWRQcm9wZXJ0eV0uYXBwbHkoaW5zdGFuY2Us
IGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvbWl4
aW5zL3RhcmdldF9hY3Rpb25fc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3Jl
JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJl
ci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9jb21wdXRlZCddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxDb21wdXRlZCkgeworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgLyoqCisgIGBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1p
eGluIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xhc3MKKyAgdG8gYWRkIGEgYHRyaWdnZXJB
Y3Rpb25gIG1ldGhvZCB3aXRoIHNlbWFudGljcyBzaW1pbGFyIHRvIHRoZSBIYW5kbGViYXJzCisg
IGB7e2FjdGlvbn19YCBoZWxwZXIuIEluIG5vcm1hbCBFbWJlciB1c2FnZSwgdGhlIGB7e2FjdGlv
bn19YCBoZWxwZXIgaXMKKyAgdXN1YWxseSB0aGUgYmVzdCBjaG9pY2UuIFRoaXMgbWl4aW4gaXMg
bW9zdCBvZnRlbiB1c2VmdWwgd2hlbiB5b3UgYXJlCisgIGRvaW5nIG1vcmUgY29tcGxleCBldmVu
dCBoYW5kbGluZyBpbiBWaWV3IG9iamVjdHMuCisgIAorICBTZWUgYWxzbyBgRW1iZXIuVmlld1Rh
cmdldEFjdGlvblN1cHBvcnRgLCB3aGljaCBoYXMKKyAgdmlldy1hd2FyZSBkZWZhdWx0cyBmb3Ig
dGFyZ2V0IGFuZCBhY3Rpb25Db250ZXh0LgorICAKKyAgQGNsYXNzIFRhcmdldEFjdGlvblN1cHBv
cnQKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5NaXhpbgorICBAcHJpdmF0
ZQorICAqLworICB2YXIgVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IF9lbWJlck1ldGFsTWl4aW4uTWl4
aW4uY3JlYXRlKHsKKyAgICB0YXJnZXQ6IG51bGwsCisgICAgYWN0aW9uOiBudWxsLAorICAgIGFj
dGlvbkNvbnRleHQ6IG51bGwsCisKKyAgICB0YXJnZXRPYmplY3Q6IF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQoJ3RhcmdldCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl90YXJn
ZXRPYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldE9iamVjdDsKKyAgICAgIH0K
KworICAgICAgdmFyIHRhcmdldCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
dGFyZ2V0Jyk7CisKKyAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykgeworICAg
ICAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgdGFyZ2V0
KTsKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB2YWx1ZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5sb29r
dXAsIHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9
IGVsc2UgeworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgfQorICAgIH0pLAorCisgICAg
YWN0aW9uQ29udGV4dE9iamVjdDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYWN0aW9uQ29udGV4dCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnYWN0aW9uQ29udGV4dCcpOworCisgICAgICBpZiAodHlwZW9mIGFjdGlvbkNv
bnRleHQgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCBhY3Rpb25Db250ZXh0KTsKKyAgICAgICAgaWYgKHZhbHVlID09
PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB2YWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5sb29rdXAsIGFjdGlvbkNvbnRleHQpOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJl
dHVybiBhY3Rpb25Db250ZXh0OworICAgICAgfQorICAgIH0pLnByb3BlcnR5KCdhY3Rpb25Db250
ZXh0JyksCisKKyAgICAvKioKKyAgICBTZW5kIGFuIGBhY3Rpb25gIHdpdGggYW4gYGFjdGlvbkNv
bnRleHRgIHRvIGEgYHRhcmdldGAuIFRoZSBhY3Rpb24sIGFjdGlvbkNvbnRleHQKKyAgICBhbmQg
dGFyZ2V0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LiBG
b3IgZXhhbXBsZToKKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9uVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICAgIHRh
cmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKKyAgICAgIGFjdGlvbjog
J3NhdmUnLAorICAgICAgYWN0aW9uQ29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRl
eHQnKSwKKyAgICAgIGNsaWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0
aW9uKCk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50
IGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50
IGNvbnRyb2xsZXIKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgICAgVGhlIGB0YXJnZXRg
LCBgYWN0aW9uYCwgYW5kIGBhY3Rpb25Db250ZXh0YCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJvcGVy
dGllcyBvZgorICAgIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1bWVudCB0byBgdHJpZ2dlckFjdGlv
bmAgYXMgd2VsbC4KKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9uVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICAgIGNs
aWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKKyAgICAgICAg
ICBhY3Rpb246ICdzYXZlJywKKyAgICAgICAgICB0YXJnZXQ6IHRoaXMuZ2V0KCdjb250cm9sbGVy
JyksCisgICAgICAgICAgYWN0aW9uQ29udGV4dDogdGhpcy5nZXQoJ2NvbnRleHQnKQorICAgICAg
ICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQg
Y29udGV4dAorICAgICAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgorICAgICAg
fQorICAgIH0pOworICAgIGBgYAorICAgICBUaGUgYGFjdGlvbkNvbnRleHRgIGRlZmF1bHRzIHRv
IHRoZSBvYmplY3QgeW91IGFyZSBtaXhpbmcgYFRhcmdldEFjdGlvblN1cHBvcnRgIGludG8uCisg
ICAgQnV0IGB0YXJnZXRgIGFuZCBgYWN0aW9uYCBtdXN0IGJlIHNwZWNpZmllZCBlaXRoZXIgYXMg
cHJvcGVydGllcyBvciB3aXRoIHRoZSBhcmd1bWVudAorICAgIHRvIGB0cmlnZ2VyQWN0aW9uYCwg
b3IgYSBjb21iaW5hdGlvbjoKKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9u
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAg
ICAgIHRhcmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKKyAgICAgIGNs
aWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKKyAgICAgICAg
ICBhY3Rpb246ICdzYXZlJworICAgICAgICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24s
IGFsb25nIHdpdGggYSByZWZlcmVuY2UgdG8gYHRoaXNgLAorICAgICAgICAgICAgLy8gdG8gdGhl
IGN1cnJlbnQgY29udHJvbGxlcgorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAgICBAbWV0
aG9kIHRyaWdnZXJBY3Rpb24KKyAgICBAcGFyYW0gb3B0cyB7T2JqZWN0fSAob3B0aW9uYWwsIHdp
dGggdGhlIG9wdGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQgYW5kL29yIGFjdGlvbkNvbnRleHQp
CisgICAgQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYWN0aW9uIHdhcyBzZW50IHN1Y2Nl
c3NmdWxseSBhbmQgZGlkIG5vdCByZXR1cm4gZmFsc2UKKyAgICBAcHJpdmF0ZQorICAgICovCisg
ICAgdHJpZ2dlckFjdGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG9wdHMgPSBhcmd1bWVu
dHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3Vt
ZW50c1swXTsKKworICAgICAgdmFyIGFjdGlvbiA9IG9wdHMuYWN0aW9uIHx8IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYWN0aW9uJyk7CisgICAgICB2YXIgdGFyZ2V0ID0gb3B0
cy50YXJnZXQgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd0YXJnZXRPYmpl
Y3QnKTsKKyAgICAgIHZhciBhY3Rpb25Db250ZXh0ID0gb3B0cy5hY3Rpb25Db250ZXh0OworCisg
ICAgICBmdW5jdGlvbiBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsKKyAgICAgICAgdmFyIHJl
dCA9IFtdOworICAgICAgICBpZiAoYWN0aW9uTmFtZSkgeworICAgICAgICAgIHJldC5wdXNoKGFj
dGlvbk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldC5jb25jYXQob3B0aW9u
cyk7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgYWN0aW9uQ29udGV4dCA9PT0gJ3VuZGVm
aW5lZCcpIHsKKyAgICAgICAgYWN0aW9uQ29udGV4dCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnYWN0aW9uQ29udGV4dE9iamVjdCcpIHx8IHRoaXM7CisgICAgICB9CisKKyAg
ICAgIGlmICh0YXJnZXQgJiYgYWN0aW9uKSB7CisgICAgICAgIHZhciByZXQ7CisKKyAgICAgICAg
aWYgKHRhcmdldC5zZW5kKSB7CisgICAgICAgICAgcmV0ID0gdGFyZ2V0LnNlbmQuYXBwbHkodGFy
Z2V0LCBhcmdzKGFjdGlvbkNvbnRleHQsIGFjdGlvbikpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgYWN0aW9uIFwnJyArIGFjdGlvbiAr
ICdcJyBkaWQgbm90IGV4aXN0IG9uICcgKyB0YXJnZXQsIHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9
PT0gJ2Z1bmN0aW9uJyk7CisgICAgICAgICAgcmV0ID0gdGFyZ2V0W2FjdGlvbl0uYXBwbHkodGFy
Z2V0LCBhcmdzKGFjdGlvbkNvbnRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQg
IT09IGZhbHNlKSB7CisgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiByZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICB9CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBUYXJnZXRBY3Rpb25TdXBw
b3J0OworfSk7CisvLyBFbWJlci5sb29rdXAKK2VuaWZlZCgiZW1iZXItcnVudGltZS9zdHJpbmdf
cmVnaXN0cnkiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLy8gU1RBVEUg
d2l0aGluIGEgbW9kdWxlIGlzIGZyb3duZWQgYXBvbiwgdGhpcyBleGlzdHMKKyAgLy8gdG8gc3Vw
cG9ydCBFbWJlci5TVFJJTkdTIGJ1dCBzaGllbGQgZW1iZXIgaW50ZXJuYWxzIGZyb20gdGhpcyBs
ZWdhY3kgZ2xvYmFsCisgIC8vIEFQSS4KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuc2V0
U3RyaW5ncyA9IHNldFN0cmluZ3M7CisgIGV4cG9ydHMuZ2V0U3RyaW5ncyA9IGdldFN0cmluZ3M7
CisgIGV4cG9ydHMuZ2V0ID0gZ2V0OworICB2YXIgU1RSSU5HUyA9IHt9OworCisgIGZ1bmN0aW9u
IHNldFN0cmluZ3Moc3RyaW5ncykgeworICAgIFNUUklOR1MgPSBzdHJpbmdzOworICB9CisKKyAg
ZnVuY3Rpb24gZ2V0U3RyaW5ncygpIHsKKyAgICByZXR1cm4gU1RSSU5HUzsKKyAgfQorCisgIGZ1
bmN0aW9uIGdldChuYW1lKSB7CisgICAgcmV0dXJuIFNUUklOR1NbbmFtZV07CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9hcHBsaWNhdGlvbicsIFsnZXhwb3J0cycsICdl
bWJlci1ydW50aW1lL3N5c3RlbS9uYW1lc3BhY2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UuZGVmYXVsdC5leHRlbmQoKTsK
K30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9hcnJheV9wcm94eScsIFsnZXhwb3J0
cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1i
ZXItcnVudGltZS91dGlscycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9t
aXhpbicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXJyb3In
LCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL211
dGFibGVfYXJyYXknLCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1t
ZXRhbC9hbGlhcycsICdlbWJlci1ydW50aW1lL21peGlucy9hcnJheSddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1
bnRpbWVVdGlscywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlclJ1bnRpbWVTeXN0
ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJSdW50aW1l
TWl4aW5zRW51bWVyYWJsZSwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyUnVudGltZU1peGluc0Fy
cmF5KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICB2YXIgT1VUX09GX1JBTkdFX0VYQ0VQVElP
TiA9ICdJbmRleCBvdXQgb2YgcmFuZ2UnOworICB2YXIgRU1QVFkgPSBbXTsKKworICBmdW5jdGlv
biBLKCkgeworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAgQW4gQXJyYXlQcm94
eSB3cmFwcyBhbnkgb3RoZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFu
ZC9vcgorICAgIGBFbWJlci5NdXRhYmxlQXJyYXksYCBmb3J3YXJkaW5nIGFsbCByZXF1ZXN0cy4g
VGhpcyBtYWtlcyBpdCB2ZXJ5IHVzZWZ1bCBmb3IKKyAgICBhIG51bWJlciBvZiBiaW5kaW5nIHVz
ZSBjYXNlcyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKKyAgICBvdXQg
dGhlIHVuZGVybHlpbmcgYXJyYXkgaXMgdXNlZnVsLgorICAKKyAgICBBIHNpbXBsZSBleGFtcGxl
IG9mIHVzYWdlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHBldHMgPSBbJ2RvZycs
ICdjYXQnLCAnZmlzaCddOworICAgIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsg
Y29udGVudDogRW1iZXIuQShwZXRzKSB9KTsKKyAgCisgICAgYXAuZ2V0KCdmaXJzdE9iamVjdCcp
OyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdkb2cnCisgICAgYXAuc2V0KCdjb250ZW50Jywg
WydhbW9lYmEnLCAncGFyYW1lY2l1bSddKTsKKyAgICBhcC5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gJ2Ftb2ViYScKKyAgICBgYGAKKyAgCisgICAgVGhpcyBj
bGFzcyBjYW4gYWxzbyBiZSB1c2VmdWwgYXMgYSBsYXllciB0byB0cmFuc2Zvcm0gdGhlIGNvbnRl
bnRzIG9mCisgICAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFjY2Vzc2VkLiBUaGlzIGNhbiBiZSBk
b25lIGJ5IG92ZXJyaWRpbmcKKyAgICBgb2JqZWN0QXRDb250ZW50YDoKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIHZhciBwZXRzID0gWydkb2cnLCAnY2F0JywgJ2Zpc2gnXTsKKyAgICB2YXIg
YXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7CisgICAgICAgIGNvbnRlbnQ6IEVtYmVyLkEo
cGV0cyksCisgICAgICAgIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7CisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbnRlbnQnKS5vYmplY3RBdChpZHgpLnRvVXBwZXJDYXNl
KCk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgCisgICAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAv
LyAuICdET0cnCisgICAgYGBgCisgIAorICAgIEBjbGFzcyBBcnJheVByb3h5CisgICAgQG5hbWVz
cGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEB1c2VzIEVtYmVyLk11
dGFibGVBcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIEFycmF5UHJveHkgPSBfZW1iZXJS
dW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRh
YmxlX2FycmF5LmRlZmF1bHQsIHsKKworICAgIC8qKgorICAgICAgVGhlIGNvbnRlbnQgYXJyYXku
IE11c3QgYmUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFuZC9vcgor
ICAgICAgYEVtYmVyLk11dGFibGVBcnJheS5gCisgICAgICAgQHByb3BlcnR5IGNvbnRlbnQKKyAg
ICAgIEB0eXBlIEVtYmVyLkFycmF5CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29udGVu
dDogbnVsbCwKKworICAgIC8qKgorICAgICBUaGUgYXJyYXkgdGhhdCB0aGUgcHJveHkgcHJldGVu
ZHMgdG8gYmUuIEluIHRoZSBkZWZhdWx0IGBBcnJheVByb3h5YAorICAgICBpbXBsZW1lbnRhdGlv
biwgdGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBgQXJyYXlQ
cm94eWAKKyAgICAgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgdG8gcHJvdmlkZSB0aGluZ3Mg
bGlrZSBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcuCisgICAgICBAcHJvcGVydHkgYXJyYW5nZWRDb250
ZW50CisgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhcnJhbmdlZENvbnRlbnQ6IF9lbWJlck1l
dGFsQWxpYXMuZGVmYXVsdCgnY29udGVudCcpLAorCisgICAgLyoqCisgICAgICBTaG91bGQgYWN0
dWFsbHkgcmV0cmlldmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhl
CisgICAgICBjb250ZW50LiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNz
ZXMgdG8gdHJhbnNmb3JtIHRoZQorICAgICAgY29udGVudCBpdGVtIHRvIHNvbWV0aGluZyBuZXcu
CisgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjb250ZW50IGlzIG5v
bi1gbnVsbGAuCisgICAgICAgQG1ldGhvZCBvYmplY3RBdENvbnRlbnQKKyAgICAgIEBwYXJhbSB7
TnVtYmVyfSBpZHggVGhlIGluZGV4IHRvIHJldHJpZXZlLgorICAgICAgQHJldHVybiB7T2JqZWN0
fSB0aGUgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vbmUgZm91bmQKKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkub2JqZWN0QXQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwgaWR4KTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBTaG91bGQgYWN0dWFsbHkgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgb24g
dGhlIGNvbnRlbnQgYXJyYXkuCisgICAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlu
IHN1YmNsYXNzZXMgdG8gdHJhbnNmb3JtIHRoZSBjb250ZW50IGl0ZW0KKyAgICAgIGludG8gc29t
ZXRoaW5nIG5ldy4KKyAgICAgICBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNv
bnRlbnQgaXMgbm9uLWBudWxsYC4KKyAgICAgICBAbWV0aG9kIHJlcGxhY2VDb250ZW50CisgICAg
ICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBzdGFydGluZyBpbmRleAorICAgICAgQHBhcmFtIHtO
dW1iZXJ9IGFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBjb250ZW50
LgorICAgICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBPcHRpb25hbCBhcnJheSBvZiBvYmplY3Rz
IHRvIGluc2VydCBvciBudWxsIGlmIG5vCisgICAgICAgIG9iamVjdHMuCisgICAgICBAcmV0dXJu
IHt2b2lkfQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHJlcGxhY2VDb250ZW50OiBmdW5j
dGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY29udGVudCcpLnJlcGxhY2UoaWR4LCBhbXQsIG9iamVjdHMpOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEludm9rZWQgd2hlbiB0aGUgY29udGVudCBwcm9wZXJ0eSBpcyBh
Ym91dCB0byBjaGFuZ2UuIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IHRoZQorICAgICAgZW50aXJl
IGFycmF5IGNvbnRlbnQgd2lsbCBjaGFuZ2UuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgX2NvbnRlbnRXaWxsQ2hhbmdlCisgICAgKi8KKyAgICBfY29udGVudFdpbGxDaGFuZ2U6IF9l
bWJlck1ldGFsTWl4aW4uX2JlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24gKCkgewor
ICAgICAgdGhpcy5fdGVhcmRvd25Db250ZW50KCk7CisgICAgfSksCisKKyAgICBfdGVhcmRvd25D
b250ZW50OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudCcpOworCisgICAgICBpZiAoY29udGVudCkgewor
ICAgICAgICBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkucmVtb3ZlQXJyYXlPYnNlcnZlcihjb250
ZW50LCB0aGlzLCB7CisgICAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFu
Z2UnLAorICAgICAgICAgIGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURpZENoYW5nZScKKyAgICAg
ICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdG8gaW1w
bGVtZW50IGNvbnRlbnQgYXJyYXkgYHdpbGxDaGFuZ2VgIG9ic2VydmVyLgorICAgICAgIEBtZXRo
b2QgY29udGVudEFycmF5V2lsbENoYW5nZQorICAgICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IGNv
bnRlbnRBcnJheSB0aGUgY29udGVudCBhcnJheQorICAgICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0
IHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSByZW1v
dmVDb3VudCBjb3VudCBvZiBpdGVtcyByZW1vdmVkCisgICAgICBAcGFyYW0ge051bWJlcn0gYWRk
Q291bnQgY291bnQgb2YgaXRlbXMgYWRkZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBj
b250ZW50QXJyYXlXaWxsQ2hhbmdlOiBLLAorICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdG8gaW1w
bGVtZW50IGNvbnRlbnQgYXJyYXkgYGRpZENoYW5nZWAgb2JzZXJ2ZXIuCisgICAgICAgQG1ldGhv
ZCBjb250ZW50QXJyYXlEaWRDaGFuZ2UKKyAgICAgICBAcGFyYW0ge0VtYmVyLkFycmF5fSBjb250
ZW50QXJyYXkgdGhlIGNvbnRlbnQgYXJyYXkKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBz
dGFydGluZyBpbmRleCBvZiB0aGUgY2hhbmdlCisgICAgICBAcGFyYW0ge051bWJlcn0gcmVtb3Zl
Q291bnQgY291bnQgb2YgaXRlbXMgcmVtb3ZlZAorICAgICAgQHBhcmFtIHtOdW1iZXJ9IGFkZENv
dW50IGNvdW50IG9mIGl0ZW1zIGFkZGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29u
dGVudEFycmF5RGlkQ2hhbmdlOiBLLAorCisgICAgLyoqCisgICAgICBJbnZva2VkIHdoZW4gdGhl
IGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCisg
ICAgICBlbnRpcmUgYXJyYXkgY29udGVudCBoYXMgY2hhbmdlZC4KKyAgICAgICBAcHJpdmF0ZQor
ICAgICAgQG1ldGhvZCBfY29udGVudERpZENoYW5nZQorICAgICovCisgICAgX2NvbnRlbnREaWRD
aGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbiAoKSB7
CisgICAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
Y29udGVudCcpOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FuXCd0IHNldCBB
cnJheVByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgY29udGVudCAhPT0gdGhpcyk7CisKKyAg
ICAgIHRoaXMuX3NldHVwQ29udGVudCgpOworICAgIH0pLAorCisgICAgX3NldHVwQ29udGVudDog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNvbnRlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2NvbnRlbnQnKTsKKworICAgICAgaWYgKGNvbnRlbnQpIHsKKyAgICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0FycmF5UHJveHkgZXhwZWN0cyBhbiBBcnJheSBvciBF
bWJlci5BcnJheVByb3h5LCBidXQgeW91IHBhc3NlZCAnICsgdHlwZW9mIGNvbnRlbnQsIF9lbWJl
clJ1bnRpbWVVdGlscy5pc0FycmF5KGNvbnRlbnQpIHx8IGNvbnRlbnQuaXNEZXN0cm95ZWQpOwor
CisgICAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRBcnJheU9ic2VydmVyKGNvbnRl
bnQsIHRoaXMsIHsKKyAgICAgICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5n
ZScsCisgICAgICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAg
ICB9KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6
IF9lbWJlck1ldGFsTWl4aW4uX2JlZm9yZU9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5j
dGlvbiAoKSB7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgIHZhciBsZW4gPSBhcnJh
bmdlZENvbnRlbnQgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJyYW5nZWRDb250ZW50
LCAnbGVuZ3RoJykgOiAwOworCisgICAgICB0aGlzLmFycmFuZ2VkQ29udGVudEFycmF5V2lsbENo
YW5nZSh0aGlzLCAwLCBsZW4sIHVuZGVmaW5lZCk7CisgICAgICB0aGlzLmFycmFuZ2VkQ29udGVu
dFdpbGxDaGFuZ2UodGhpcyk7CisKKyAgICAgIHRoaXMuX3RlYXJkb3duQXJyYW5nZWRDb250ZW50
KGFycmFuZ2VkQ29udGVudCk7CisgICAgfSksCisKKyAgICBfYXJyYW5nZWRDb250ZW50RGlkQ2hh
bmdlOiBfZW1iZXJNZXRhbE1peGluLm9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgIHZhciBsZW4gPSBhcnJhbmdl
ZENvbnRlbnQgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJyYW5nZWRDb250ZW50LCAn
bGVuZ3RoJykgOiAwOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FuXCd0IHNl
dCBBcnJheVByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgYXJyYW5nZWRDb250ZW50ICE9PSB0
aGlzKTsKKworICAgICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKKworICAgICAgdGhp
cy5hcnJhbmdlZENvbnRlbnREaWRDaGFuZ2UodGhpcyk7CisgICAgICB0aGlzLmFycmFuZ2VkQ29u
dGVudEFycmF5RGlkQ2hhbmdlKHRoaXMsIDAsIHVuZGVmaW5lZCwgbGVuKTsKKyAgICB9KSwKKwor
ICAgIF9zZXR1cEFycmFuZ2VkQ29udGVudDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFycmFu
Z2VkQ29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYXJyYW5nZWRD
b250ZW50Jyk7CisKKyAgICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKKyAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0FycmF5UHJveHkgZXhwZWN0cyBhbiBBcnJheSBvciBFbWJlci5B
cnJheVByb3h5LCBidXQgeW91IHBhc3NlZCAnICsgdHlwZW9mIGFycmFuZ2VkQ29udGVudCwgX2Vt
YmVyUnVudGltZVV0aWxzLmlzQXJyYXkoYXJyYW5nZWRDb250ZW50KSB8fCBhcnJhbmdlZENvbnRl
bnQuaXNEZXN0cm95ZWQpOworCisgICAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRB
cnJheU9ic2VydmVyKGFycmFuZ2VkQ29udGVudCwgdGhpcywgeworICAgICAgICAgIHdpbGxDaGFu
Z2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgICAgIGRpZENoYW5n
ZTogJ2FycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAgICB9KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgX3RlYXJkb3duQXJyYW5nZWRDb250ZW50OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRo
aXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKworICAgICAgaWYgKGFycmFuZ2VkQ29udGVudCkgewor
ICAgICAgICBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkucmVtb3ZlQXJyYXlPYnNlcnZlcihhcnJh
bmdlZENvbnRlbnQsIHRoaXMsIHsKKyAgICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRDb250
ZW50QXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgICAgICBkaWRDaGFuZ2U6ICdhcnJhbmdlZENvbnRl
bnRBcnJheURpZENoYW5nZScKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIGFy
cmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEssCisgICAgYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdl
OiBLLAorCisgICAgb2JqZWN0QXQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbnRlbnQnKSAmJiB0aGlzLm9iamVjdEF0
Q29udGVudChpZHgpOworICAgIH0sCisKKyAgICBsZW5ndGg6IF9lbWJlck1ldGFsQ29tcHV0ZWQu
Y29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CisgICAgICBy
ZXR1cm4gYXJyYW5nZWRDb250ZW50ID8gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGFycmFu
Z2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKKyAgICAgIC8vIE5vIGRlcGVuZGVuY2llcyBzaW5j
ZSBFbnVtZXJhYmxlIG5vdGlmaWVzIGxlbmd0aCBvZiBjaGFuZ2UKKyAgICB9KSwKKworICAgIF9y
ZXBsYWNlOiBmdW5jdGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIHZhciBjb250ZW50
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50Jyk7CisgICAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGNvbnRlbnQgcHJvcGVydHkgb2YgJyArIHRoaXMu
Y29uc3RydWN0b3IgKyAnIHNob3VsZCBiZSBzZXQgYmVmb3JlIG1vZGlmeWluZyBpdCcsIGNvbnRl
bnQpOworICAgICAgaWYgKGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5yZXBsYWNlQ29udGVudChp
ZHgsIGFtdCwgb2JqZWN0cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0s
CisKKyAgICByZXBsYWNlOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSA9PT0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50JykpIHsKKyAgICAgICAgdGhpcy5fcmVwbGFjZS5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3
IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnVXNpbmcgcmVwbGFjZSBvbiBhbiBhcnJhbmdlZCBB
cnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLicpOworICAgICAgfQorICAgIH0sCisKKyAgICBfaW5z
ZXJ0QXQ6IGZ1bmN0aW9uIChpZHgsIG9iamVjdCkgeworICAgICAgaWYgKGlkeCA+IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudC5sZW5ndGgnKSkgeworICAgICAgICB0
aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KE9VVF9PRl9SQU5HRV9FWENFUFRJT04p
OworICAgICAgfQorCisgICAgICB0aGlzLl9yZXBsYWNlKGlkeCwgMCwgW29iamVjdF0pOworICAg
ICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGluc2VydEF0OiBmdW5jdGlvbiAoaWR4LCBv
YmplY3QpIHsKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Fy
cmFuZ2VkQ29udGVudCcpID09PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Nv
bnRlbnQnKSkgeworICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnVXNpbmcgaW5zZXJ0QXQgb24gYW4gYXJyYW5nZWQgQXJyYXlQcm94eSBpcyBub3QgYWxsb3dl
ZC4nKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChzdGFydCwg
bGVuKSB7CisgICAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkgeworICAgICAgICB2
YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudCcp
OworICAgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsK
KyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7CisgICAgICAgICAgdGhy
b3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdChPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OKTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAg
IGxlbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIGluZGljZXMg
aW4gb3JpZ2luYWwgY29udGVudCB0byByZW1vdmUKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkg
PCBzdGFydCArIGxlbjsgaSsrKSB7CisgICAgICAgICAgLy8gVXNlIGFycmFuZ2VkQ29udGVudCBo
ZXJlIHNvIHdlIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIG9iamVjdHMgdHJhbnNmb3JtZWQgYnkgb2Jq
ZWN0QXRDb250ZW50CisgICAgICAgICAgaW5kaWNlcy5wdXNoKGNvbnRlbnQuaW5kZXhPZihfZW1i
ZXJSdW50aW1lTWl4aW5zQXJyYXkub2JqZWN0QXQoYXJyYW5nZWRDb250ZW50LCBpKSkpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIGluZGlj
ZXMgd2lsbCBjaGFuZ2UKKyAgICAgICAgaW5kaWNlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7Cisg
ICAgICAgICAgcmV0dXJuIGIgLSBhOworICAgICAgICB9KTsKKworICAgICAgICBfZW1iZXJNZXRh
bFByb3BlcnR5X2V2ZW50cy5iZWdpblByb3BlcnR5Q2hhbmdlcygpOworICAgICAgICBmb3IgKGkg
PSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHRoaXMuX3JlcGxhY2Uo
aW5kaWNlc1tpXSwgMSwgRU1QVFkpOworICAgICAgICB9CisgICAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfZXZlbnRzLmVuZFByb3BlcnR5Q2hhbmdlcygpOworICAgICAgfQorCisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgcHVzaE9iamVjdDogZnVuY3Rpb24gKG9iaikgeworICAg
ICAgdGhpcy5faW5zZXJ0QXQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250
ZW50Lmxlbmd0aCcpLCBvYmopOworICAgICAgcmV0dXJuIG9iajsKKyAgICB9LAorCisgICAgcHVz
aE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7CisgICAgICBpZiAoIShfZW1iZXJSdW50aW1l
TWl4aW5zRW51bWVyYWJsZS5kZWZhdWx0LmRldGVjdChvYmplY3RzKSB8fCBfZW1iZXJSdW50aW1l
VXRpbHMuaXNBcnJheShvYmplY3RzKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcign
TXVzdCBwYXNzIEVtYmVyLkVudW1lcmFibGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1c2hPYmpl
Y3RzJyk7CisgICAgICB9CisgICAgICB0aGlzLl9yZXBsYWNlKF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOworICAgICAgcmV0dXJuIHRoaXM7
CisgICAgfSwKKworICAgIHNldE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7CisgICAgICBp
ZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKTsK
KyAgICAgIH0KKworICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0
aGlzLCAnbGVuZ3RoJyk7CisgICAgICB0aGlzLl9yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgdW5zaGlmdE9iamVjdDogZnVuY3Rpb24g
KG9iaikgeworICAgICAgdGhpcy5faW5zZXJ0QXQoMCwgb2JqKTsKKyAgICAgIHJldHVybiBvYmo7
CisgICAgfSwKKworICAgIHVuc2hpZnRPYmplY3RzOiBmdW5jdGlvbiAob2JqZWN0cykgeworICAg
ICAgdGhpcy5fcmVwbGFjZSgwLCAwLCBvYmplY3RzKTsKKyAgICAgIHJldHVybiB0aGlzOworICAg
IH0sCisKKyAgICBzbGljZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFyciA9IHRoaXMudG9B
cnJheSgpOworICAgICAgcmV0dXJuIGFyci5zbGljZS5hcHBseShhcnIsIGFyZ3VtZW50cyk7Cisg
ICAgfSwKKworICAgIGFycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24gKGl0
ZW0sIGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKKyAgICAgIHRoaXMuYXJyYXlDb250ZW50
V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KTsKKyAgICB9LAorCisgICAgYXJy
YW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uIChpdGVtLCBpZHgsIHJlbW92ZWRD
bnQsIGFkZGVkQ250KSB7CisgICAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5nZShpZHgsIHJl
bW92ZWRDbnQsIGFkZGVkQ250KTsKKyAgICB9LAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgewor
ICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3Nl
dHVwQ29udGVudCgpOworICAgICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKKyAgICB9
LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3RlYXJkb3du
QXJyYW5nZWRDb250ZW50KCk7CisgICAgICB0aGlzLl90ZWFyZG93bkNvbnRlbnQoKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEFycmF5UHJveHk7Cit9KTsKK2VuaWZlZCgn
ZW1iZXItcnVudGltZS9zeXN0ZW0vY29udGFpbmVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L3Byb3BlcnR5X3NldCcsICdjb250YWluZXIvcmVnaXN0cnknLCAnY29udGFpbmVyL2NvbnRhaW5l
cicsICdjb250YWluZXIvb3duZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LCBfY29udGFpbmVyUmVnaXN0cnksIF9jb250YWluZXJDb250YWluZXIsIF9jb250
YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgX2NvbnRhaW5lclJlZ2lzdHJ5LmRl
ZmF1bHQuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworICBfY29udGFpbmVyQ29u
dGFpbmVyLmRlZmF1bHQuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworCisgIGV4
cG9ydHMuUmVnaXN0cnkgPSBfY29udGFpbmVyUmVnaXN0cnkuZGVmYXVsdDsKKyAgZXhwb3J0cy5D
b250YWluZXIgPSBfY29udGFpbmVyQ29udGFpbmVyLmRlZmF1bHQ7CisgIGV4cG9ydHMuZ2V0T3du
ZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXI7CisgIGV4cG9ydHMuc2V0T3duZXIgPSBfY29u
dGFpbmVyT3duZXIuc2V0T3duZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9zeXN0ZW0v
Y29yZV9vYmplY3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCcsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9tZXRhJywgJ2VtYmVyLW1l
dGFsL2NoYWlucycsICdlbWJlci1tZXRhbC9ldmVudHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAn
ZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRsZXIn
LCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9iaW5kaW5nJywgJ2VtYmVy
LW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2luamVjdGVkX3Byb3BlcnR5JywgJ2VtYmVy
LW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVyLW1ldGFsL2Nv
cmUnLCAnZW1iZXItcnVudGltZS9pbmplY3QnLCAnZW1iZXItbWV0YWwvc3ltYm9sJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1i
ZXJNZXRhbEFzc2lnbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsVXRpbHMs
IF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxDaGFpbnMsIF9lbWJlck1ldGFsRXZlbnRzLCBf
ZW1iZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJSdW50aW1lTWl4aW5zQWN0
aW9uX2hhbmRsZXIsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxCaW5kaW5nLCBf
ZW1iZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbEluamVjdGVkX3Byb3BlcnR5LCBfZW1iZXJN
ZXRhbFJ1bl9sb29wLCBfZW1iZXJNZXRhbFdhdGNoaW5nLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJl
clJ1bnRpbWVJbmplY3QsIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgICdubyB1c2Ugc3RyaWN0JzsK
KyAgLy8gUmVtb3ZlICJ1c2Ugc3RyaWN0IjsgZnJvbSB0cmFuc3BpbGVkIG1vZHVsZSB1bnRpbAor
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDM4IGlzIGZp
eGVkCisKKyAgLyoqCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItcnVu
dGltZQorICAqLworCisgIC8vIHVzaW5nIGVtYmVyLW1ldGFsL2xpYi9tYWluIGhlcmUgdG8gZW5z
dXJlIHRoYXQgZW1iZXItZGVidWcgaXMgc2V0dXAKKyAgLy8gaWYgcHJlc2VudAorCisgIHZhciBf
TWl4aW4kY3JlYXRlOworCisgIHZhciBQT1NUX0lOSVQgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZh
dWx0KCdQT1NUX0lOSVQnKTsKKyAgZXhwb3J0cy5QT1NUX0lOSVQgPSBQT1NUX0lOSVQ7CisgIHZh
ciBzY2hlZHVsZSA9IF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZTsKKyAgdmFy
IGFwcGx5TWl4aW4gPSBfZW1iZXJNZXRhbE1peGluLk1peGluLl9hcHBseTsKKyAgdmFyIGZpbmlz
aFBhcnRpYWwgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmZpbmlzaFBhcnRpYWw7CisgIHZhciBy
ZW9wZW4gPSBfZW1iZXJNZXRhbE1peGluLk1peGluLnByb3RvdHlwZS5yZW9wZW47CisgIHZhciBo
YXNDYWNoZWRDb21wdXRlZFByb3BlcnRpZXMgPSBmYWxzZTsKKworICBmdW5jdGlvbiBtYWtlQ3Rv
cigpIHsKKyAgICAvLyBOb3RlOiBhdm9pZCBhY2Nlc3NpbmcgYW55IHByb3BlcnRpZXMgb24gdGhl
IG9iamVjdCBzaW5jZSBpdCBtYWtlcyB0aGUKKyAgICAvLyBtZXRob2QgYSBsb3QgZmFzdGVyLiBU
aGlzIGlzIGdsdWUgY29kZSBzbyB3ZSB3YW50IGl0IHRvIGJlIGFzIGZhc3QgYXMKKyAgICAvLyBw
b3NzaWJsZS4KKworICAgIHZhciB3YXNBcHBsaWVkID0gZmFsc2U7CisgICAgdmFyIGluaXRQcm9w
ZXJ0aWVzOworCisgICAgdmFyIENsYXNzID0gZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF3YXNB
cHBsaWVkKSB7CisgICAgICAgIENsYXNzLnByb3RvKCk7IC8vIHByZXBhcmUgcHJvdG90eXBlLi4u
CisgICAgICB9CisKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICBp
bml0UHJvcGVydGllcyA9IFthcmd1bWVudHNbMF1dOworICAgICAgfQorCisgICAgICB0aGlzLl9f
ZGVmaW5lTm9uRW51bWVyYWJsZShfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZX1BST1BFUlRZKTsK
KyAgICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcyk7CisgICAgICB2YXIgcHJv
dG8gPSBtLnByb3RvOworICAgICAgbS5wcm90byA9IHRoaXM7CisgICAgICBpZiAoaW5pdFByb3Bl
cnRpZXMpIHsKKyAgICAgICAgLy8gY2FwdHVyZSBsb2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUg
Y2xvc2VkIG92ZXIgdmFyaWFibGUKKyAgICAgICAgdmFyIHByb3BzID0gaW5pdFByb3BlcnRpZXM7
CisgICAgICAgIGluaXRQcm9wZXJ0aWVzID0gbnVsbDsKKworICAgICAgICB2YXIgY29uY2F0ZW5h
dGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllczsKKyAgICAgICAgdmFy
IG1lcmdlZFByb3BlcnRpZXMgPSB0aGlzLm1lcmdlZFByb3BlcnRpZXM7CisKKyAgICAgICAgZm9y
ICh2YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICB2
YXIgcHJvcGVydGllcyA9IHByb3BzW2ldOworCisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ0VtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIG1peGluZyBpbiBv
dGhlciAnICsgJ2RlZmluaXRpb25zLCB1c2UgLmV4dGVuZCAmIC5jcmVhdGUgc2VwYXJhdGVseSBp
bnN0ZWFkLicsICEocHJvcGVydGllcyBpbnN0YW5jZW9mIF9lbWJlck1ldGFsTWl4aW4uTWl4aW4p
KTsKKworICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPT0gJ29iamVjdCcgJiYgcHJv
cGVydGllcyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0
YWxFcnJvci5kZWZhdWx0KCdFbWJlci5PYmplY3QuY3JlYXRlIG9ubHkgYWNjZXB0cyBvYmplY3Rz
LicpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghcHJvcGVydGllcykgeworICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIGtleU5hbWVzID0g
T2JqZWN0LmtleXMocHJvcGVydGllcyk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGwg
PSBrZXlOYW1lcy5sZW5ndGg7IGogPCBsbDsgaisrKSB7CisgICAgICAgICAgICB2YXIga2V5TmFt
ZSA9IGtleU5hbWVzW2pdOworICAgICAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydGllc1trZXlO
YW1lXTsKKworICAgICAgICAgICAgaWYgKF9lbWJlck1ldGFsTWl4aW4uSVNfQklORElORy50ZXN0
KGtleU5hbWUpKSB7CisgICAgICAgICAgICAgIG0ud3JpdGVCaW5kaW5ncyhrZXlOYW1lLCB2YWx1
ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZURlc2MgPSB0aGlz
W2tleU5hbWVdOworICAgICAgICAgICAgdmFyIGRlc2MgPSBwb3NzaWJsZURlc2MgIT09IG51bGwg
JiYgdHlwZW9mIHBvc3NpYmxlRGVzYyA9PT0gJ29iamVjdCcgJiYgcG9zc2libGVEZXNjLmlzRGVz
Y3JpcHRvciA/IHBvc3NpYmxlRGVzYyA6IHVuZGVmaW5lZDsKKworICAgICAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRz
IGRlZmluaW5nIGNvbXB1dGVkICcgKyAncHJvcGVydGllcy4gRGVmaW5lIGNvbXB1dGVkIHByb3Bl
cnRpZXMgdXNpbmcgZXh0ZW5kKCkgb3IgcmVvcGVuKCkgJyArICdiZWZvcmUgY2FsbGluZyBjcmVh
dGUoKS4nLCAhKHZhbHVlIGluc3RhbmNlb2YgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFBy
b3BlcnR5KSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnRW1iZXIuT2Jq
ZWN0LmNyZWF0ZSBubyBsb25nZXIgc3VwcG9ydHMgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwg
X3N1cGVyLicsICEodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLnRvU3RyaW5n
KCkuaW5kZXhPZignLl9zdXBlcicpICE9PSAtMSkpOworICAgICAgICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ2BhY3Rpb25zYCBtdXN0IGJlIHByb3ZpZGVkIGF0IGV4dGVuZCB0aW1lLCBu
b3QgYXQgY3JlYXRlIHRpbWUsICcgKyAnd2hlbiBFbWJlci5BY3Rpb25IYW5kbGVyIGlzIHVzZWQg
KGkuZS4gdmlld3MsIGNvbnRyb2xsZXJzICYgcm91dGVzKS4nLCAhKGtleU5hbWUgPT09ICdhY3Rp
b25zJyAmJiBfZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9uX2hhbmRsZXIuZGVmYXVsdC5kZXRlY3Qo
dGhpcykpKTsKKworICAgICAgICAgICAgaWYgKGNvbmNhdGVuYXRlZFByb3BlcnRpZXMgJiYgY29u
Y2F0ZW5hdGVkUHJvcGVydGllcy5sZW5ndGggPiAwICYmIGNvbmNhdGVuYXRlZFByb3BlcnRpZXMu
aW5kZXhPZihrZXlOYW1lKSA+PSAwKSB7CisgICAgICAgICAgICAgIHZhciBiYXNlVmFsdWUgPSB0
aGlzW2tleU5hbWVdOworCisgICAgICAgICAgICAgIGlmIChiYXNlVmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VWYWx1ZS5jb25jYXQpIHsKKyAg
ICAgICAgICAgICAgICAgIHZhbHVlID0gYmFzZVZhbHVlLmNvbmNhdCh2YWx1ZSk7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gX2VtYmVyTWV0YWxV
dGlscy5tYWtlQXJyYXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9lbWJl
ck1ldGFsVXRpbHMubWFrZUFycmF5KHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAobWVyZ2VkUHJvcGVydGllcyAmJiBtZXJnZWRQcm9wZXJ0
aWVzLmxlbmd0aCAmJiBtZXJnZWRQcm9wZXJ0aWVzLmluZGV4T2Yoa2V5TmFtZSkgPj0gMCkgewor
ICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHRoaXNba2V5TmFtZV07CisKKyAgICAg
ICAgICAgICAgdmFsdWUgPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHt9LCBvcmlnaW5hbFZh
bHVlLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXNjKSB7Cisg
ICAgICAgICAgICAgIGRlc2Muc2V0KHRoaXMsIGtleU5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXRVbmtub3duUHJvcGVy
dHkgPT09ICdmdW5jdGlvbicgJiYgIShrZXlOYW1lIGluIHRoaXMpKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwgdmFsdWUpOworICAgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQ
cm9wZXJ0eSh0aGlzLCBrZXlOYW1lLCBudWxsLCB2YWx1ZSk7IC8vIHNldHVwIG1hbmRhdG9yeSBz
ZXR0ZXIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgfQorCisgICAgICBmaW5pc2hQYXJ0aWFsKHRoaXMsIG0pOworCisgICAgICB2
YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkg
eworICAgICAgICB0aGlzLmluaXQoKTsKKyAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7
CisgICAgICAgIHRoaXMuaW5pdChhcmd1bWVudHNbMF0pOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gdjggYnVnIHBvdGVudGlhbGx5IGluY29ycmVjdGx5IGRlb3B0cyB0aGlzIGZ1bmN0aW9u
OiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzcwOQorICAg
ICAgICAvLyB3ZSBtYXkgd2FudCB0byBrZWVwIHRoaXMgYXJvdW5kIHRpbGwgdGhpcyBhZ2VzIG91
dCBvbiBtb2JpbGUKKyAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICAg
ICAgZm9yICh2YXIgeCA9IDA7IHggPCBsZW5ndGg7IHgrKykgeworICAgICAgICAgIGFyZ3NbeF0g
PSBhcmd1bWVudHNbeF07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMs
IGFyZ3MpOworICAgICAgfQorCisgICAgICB0aGlzW1BPU1RfSU5JVF0oKTsKKworICAgICAgbS5w
cm90byA9IHByb3RvOworICAgICAgX2VtYmVyTWV0YWxDaGFpbnMuZmluaXNoQ2hhaW5zKHRoaXMp
OworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KHRoaXMsICdpbml0Jyk7CisgICAg
fTsKKworICAgIENsYXNzLnRvU3RyaW5nID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5wcm90b3R5
cGUudG9TdHJpbmc7CisgICAgQ2xhc3Mud2lsbFJlb3BlbiA9IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGlmICh3YXNBcHBsaWVkKSB7CisgICAgICAgIENsYXNzLlByb3RvdHlwZU1peGluID0gX2VtYmVy
TWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoQ2xhc3MuUHJvdG90eXBlTWl4aW4pOworICAgICAgfQor
CisgICAgICB3YXNBcHBsaWVkID0gZmFsc2U7CisgICAgfTsKKworICAgIENsYXNzLl9pbml0UHJv
cGVydGllcyA9IGZ1bmN0aW9uIChhcmdzKSB7CisgICAgICBpbml0UHJvcGVydGllcyA9IGFyZ3M7
CisgICAgfTsKKworICAgIENsYXNzLnByb3RvID0gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN1
cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNsYXNzOworICAgICAgaWYgKHN1cGVyY2xhc3MpIHsKKyAg
ICAgICAgc3VwZXJjbGFzcy5wcm90bygpOworICAgICAgfQorCisgICAgICBpZiAoIXdhc0FwcGxp
ZWQpIHsKKyAgICAgICAgd2FzQXBwbGllZCA9IHRydWU7CisgICAgICAgIENsYXNzLlByb3RvdHlw
ZU1peGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOworICAgICAgfQorCisgICAgICBy
ZXR1cm4gdGhpcy5wcm90b3R5cGU7CisgICAgfTsKKworICAgIHJldHVybiBDbGFzczsKKyAgfQor
CisgIC8qKgorICAgIEBjbGFzcyBDb3JlT2JqZWN0CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAg
IEBwdWJsaWMKKyAgKi8KKyAgdmFyIENvcmVPYmplY3QgPSBtYWtlQ3RvcigpOworICBDb3JlT2Jq
ZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAnRW1iZXIuQ29yZU9iamVj
dCc7CisgIH07CisgIENvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4gPSBfZW1iZXJNZXRhbE1peGlu
Lk1peGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHsKKyAgICByZW9wZW46IGZ1bmN0aW9uICgp
IHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tl
eV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIGFwcGx5TWl4aW4odGhpcywg
YXJncywgdHJ1ZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgaW5zdGFudGlh
dGVkLiBCeSBkZWZhdWx0LAorICAgICAgZG9lcyBub3RoaW5nIHVubGVzcyBpdCBpcyBvdmVycmlk
ZGVuIGR1cmluZyBjbGFzcyBkZWZpbml0aW9uLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAg
ICAgICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBhbGVydCgnTmFtZSBpcyAnICsgdGhp
cy5nZXQoJ25hbWUnKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIHZhciBzdGV2ZSA9
IEFwcC5QZXJzb24uY3JlYXRlKHsKKyAgICAgICAgbmFtZTogIlN0ZXZlIgorICAgICAgfSk7Cisg
ICAgICAgLy8gYWxlcnRzICdOYW1lIGlzIFN0ZXZlJy4KKyAgICAgIGBgYAorICAgICAgIE5PVEU6
IElmIHlvdSBkbyBvdmVycmlkZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVt
YmVyLlZpZXdgLAorICAgICAgYmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlciguLi5hcmd1bWVu
dHMpYCBpbiB5b3VyCisgICAgICBgaW5pdGAgZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1i
ZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvCisgICAgICBkbyBpbXBvcnRhbnQgc2V0
dXAgd29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCisgICAgICBh
cHBsaWNhdGlvbi4KKyAgICAgICBAbWV0aG9kIGluaXQKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIGluaXQ6IGZ1bmN0aW9uICgpIHt9CisKKyAgfSwgX01peGluJGNyZWF0ZVtQT1NUX0lOSVRd
ID0gZnVuY3Rpb24gKCkge30sIF9NaXhpbiRjcmVhdGUuX19kZWZpbmVOb25FbnVtZXJhYmxlID0g
ZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHBy
b3BlcnR5Lm5hbWUsIHByb3BlcnR5LmRlc2NyaXB0b3IpOworICAgIC8vdGhpc1twcm9wZXJ0eS5u
YW1lXSA9IHByb3BlcnR5LmRlc2NyaXB0b3IudmFsdWU7CisgIH0sIF9NaXhpbiRjcmVhdGUuY29u
Y2F0ZW5hdGVkUHJvcGVydGllcyA9IG51bGwsIF9NaXhpbiRjcmVhdGUubWVyZ2VkUHJvcGVydGll
cyA9IG51bGwsIF9NaXhpbiRjcmVhdGUuaXNEZXN0cm95ZWQgPSBmYWxzZSwgX01peGluJGNyZWF0
ZS5pc0Rlc3Ryb3lpbmcgPSBmYWxzZSwgX01peGluJGNyZWF0ZS5kZXN0cm95ID0gZnVuY3Rpb24g
KCkgeworICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0K
KyAgICB0aGlzLmlzRGVzdHJveWluZyA9IHRydWU7CisKKyAgICBzY2hlZHVsZSgnYWN0aW9ucycs
IHRoaXMsIHRoaXMud2lsbERlc3Ryb3kpOworICAgIHNjaGVkdWxlKCdkZXN0cm95JywgdGhpcywg
dGhpcy5fc2NoZWR1bGVkRGVzdHJveSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sIF9NaXhpbiRj
cmVhdGUud2lsbERlc3Ryb3kgPSBfZW1iZXJNZXRhbENvcmUuSywgX01peGluJGNyZWF0ZS5fc2No
ZWR1bGVkRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkg
eworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLmRlc3Ryb3ko
dGhpcyk7CisgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CisgIH0sIF9NaXhpbiRjcmVhdGUu
YmluZCA9IGZ1bmN0aW9uICh0bywgZnJvbSkgeworICAgIGlmICghKGZyb20gaW5zdGFuY2VvZiBf
ZW1iZXJNZXRhbEJpbmRpbmcuQmluZGluZykpIHsKKyAgICAgIGZyb20gPSBfZW1iZXJNZXRhbEJp
bmRpbmcuQmluZGluZy5mcm9tKGZyb20pOworICAgIH0KKyAgICBmcm9tLnRvKHRvKS5jb25uZWN0
KHRoaXMpOworICAgIHJldHVybiBmcm9tOworICB9LCBfTWl4aW4kY3JlYXRlLnRvU3RyaW5nID0g
ZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNUb1N0cmluZ0V4dGVuc2lvbiA9IHR5cGVvZiB0aGlz
LnRvU3RyaW5nRXh0ZW5zaW9uID09PSAnZnVuY3Rpb24nOworICAgIHZhciBleHRlbnNpb24gPSBo
YXNUb1N0cmluZ0V4dGVuc2lvbiA/ICc6JyArIHRoaXMudG9TdHJpbmdFeHRlbnNpb24oKSA6ICcn
OworICAgIHZhciByZXQgPSAnPCcgKyB0aGlzLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkgKyAnOicg
KyBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhpcykgKyBleHRlbnNpb24gKyAnPic7CisKKyAg
ICByZXR1cm4gcmV0OworICB9LCBfTWl4aW4kY3JlYXRlKSk7CisKKyAgQ29yZU9iamVjdC5Qcm90
b3R5cGVNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsKKworICBDb3JlT2JqZWN0
Ll9fc3VwZXJfXyA9IG51bGw7CisKKyAgdmFyIENsYXNzTWl4aW5Qcm9wcyA9IHsKKworICAgIENs
YXNzTWl4aW46IF9lbWJlck1ldGFsTWl4aW4uUkVRVUlSRUQsCisKKyAgICBQcm90b3R5cGVNaXhp
bjogX2VtYmVyTWV0YWxNaXhpbi5SRVFVSVJFRCwKKworICAgIGlzQ2xhc3M6IHRydWUsCisKKyAg
ICBpc01ldGhvZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIENyZWF0ZXMgYSBuZXcgc3ViY2xh
c3MuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoeworICAgICAgICBzYXk6IGZ1bmN0aW9uKHRoaW5nKSB7CisgICAgICAgICAgYWxl
cnQodGhpbmcpOworICAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlz
IGRlZmluZXMgYSBuZXcgc3ViY2xhc3Mgb2YgRW1iZXIuT2JqZWN0OiBgQXBwLlBlcnNvbmAuIEl0
IGNvbnRhaW5zIG9uZSBtZXRob2Q6IGBzYXkoKWAuCisgICAgICAgWW91IGNhbiBhbHNvIGNyZWF0
ZSBhIHN1YmNsYXNzIGZyb20gYW55IGV4aXN0aW5nIGNsYXNzIGJ5IGNhbGxpbmcgaXRzIGBleHRl
bmQoKWAgbWV0aG9kLgorICAgICAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0
ZSBhIHN1YmNsYXNzIG9mIEVtYmVyJ3MgYnVpbHQtaW4gYEVtYmVyLlZpZXdgIGNsYXNzOgorICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5QZXJzb25WaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgICB0YWdOYW1lOiAnbGknLAorICAgICAgICBjbGFzc05hbWVCaW5kaW5nczog
Wydpc0FkbWluaXN0cmF0b3InXQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBXaGVuIGRl
ZmluaW5nIGEgc3ViY2xhc3MsIHlvdSBjYW4gb3ZlcnJpZGUgbWV0aG9kcyBidXQgc3RpbGwgYWNj
ZXNzIHRoZQorICAgICAgaW1wbGVtZW50YXRpb24gb2YgeW91ciBwYXJlbnQgY2xhc3MgYnkgY2Fs
bGluZyB0aGUgc3BlY2lhbCBgX3N1cGVyKClgIG1ldGhvZDoKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIHNheTog
ZnVuY3Rpb24odGhpbmcpIHsKKyAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7
CisgICAgICAgICAgYWxlcnQobmFtZSArICcgc2F5czogJyArIHRoaW5nKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICAgQXBwLlNvbGRpZXIgPSBBcHAuUGVyc29uLmV4dGVuZCh7CisgICAg
ICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKKyAgICAgICAgICB0aGlzLl9zdXBlcih0aGluZyAr
ICIsIHNpciEiKTsKKyAgICAgICAgfSwKKyAgICAgICAgbWFyY2g6IGZ1bmN0aW9uKG51bWJlck9m
SG91cnMpIHsKKyAgICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBtYXJjaGVzIGZv
ciAnICsgbnVtYmVyT2ZIb3VycyArICcgaG91cnMuJyk7CisgICAgICAgIH0KKyAgICAgIH0pOwor
ICAgICAgIHZhciB5ZWh1ZGEgPSBBcHAuU29sZGllci5jcmVhdGUoeworICAgICAgICBuYW1lOiAi
WWVodWRhIEthdHoiCisgICAgICB9KTsKKyAgICAgICB5ZWh1ZGEuc2F5KCJZZXMiKTsgIC8vIGFs
ZXJ0cyAiWWVodWRhIEthdHogc2F5czogWWVzLCBzaXIhIgorICAgICAgYGBgCisgICAgICAgVGhl
IGBjcmVhdGUoKWAgb24gbGluZSAjMTcgY3JlYXRlcyBhbiAqaW5zdGFuY2UqIG9mIHRoZSBgQXBw
LlNvbGRpZXJgIGNsYXNzLgorICAgICAgVGhlIGBleHRlbmQoKWAgb24gbGluZSAjOCBjcmVhdGVz
IGEgKnN1YmNsYXNzKiBvZiBgQXBwLlBlcnNvbmAuIEFueSBpbnN0YW5jZQorICAgICAgb2YgdGhl
IGBBcHAuUGVyc29uYCBjbGFzcyB3aWxsICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRob2Qu
CisgICAgICAgWW91IGNhbiBhbHNvIHBhc3MgYE1peGluYCBjbGFzc2VzIHRvIGFkZCBhZGRpdGlv
bmFsIHByb3BlcnRpZXMgdG8gdGhlIHN1YmNsYXNzLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgICAgc2F5OiBmdW5j
dGlvbih0aGluZykgeworICAgICAgICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykgKyAnIHNheXM6
ICcgKyB0aGluZyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5TaW5naW5nTWl4
aW4gPSBNaXhpbi5jcmVhdGUoeworICAgICAgICBzaW5nOiBmdW5jdGlvbih0aGluZyl7CisgICAg
ICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgc2luZ3M6IGxhIGxhIGxhICcgKyB0aGlu
Zyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5Ccm9hZHdheVN0YXIgPSBBcHAu
UGVyc29uLmV4dGVuZChBcHAuU2luZ2luZ01peGluLCB7CisgICAgICAgIGRhbmNlOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBkYW5jZXM6IHRhcCB0
YXAgdGFwIHRhcCAnKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBU
aGUgYEFwcC5Ccm9hZHdheVN0YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1ldGhvZHM6IGBzYXko
KWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClgLgorICAgICAgIEBtZXRob2QgZXh0ZW5kCisgICAg
ICBAc3RhdGljCisgICAgICAgQHBhcmFtIHtNaXhpbn0gW21peGluc10qIE9uZSBvciBtb3JlIE1p
eGluIGNsYXNzZXMKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzXSogT2JqZWN0IGNv
bnRhaW5pbmcgdmFsdWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBjbGFzcworICAgICAgQHB1Ymxp
YworICAgICovCisgICAgZXh0ZW5kOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgQ2xhc3MgPSBt
YWtlQ3RvcigpOworICAgICAgdmFyIHByb3RvOworICAgICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHRoaXMuQ2xhc3NNaXhpbik7CisgICAgICBDbGFz
cy5Qcm90b3R5cGVNaXhpbiA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHRoaXMuUHJv
dG90eXBlTWl4aW4pOworCisgICAgICBDbGFzcy5DbGFzc01peGluLm93bmVyQ29uc3RydWN0b3Ig
PSBDbGFzczsKKyAgICAgIENsYXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBD
bGFzczsKKworICAgICAgcmVvcGVuLmFwcGx5KENsYXNzLlByb3RvdHlwZU1peGluLCBhcmd1bWVu
dHMpOworCisgICAgICBDbGFzcy5zdXBlcmNsYXNzID0gdGhpczsKKyAgICAgIENsYXNzLl9fc3Vw
ZXJfXyA9IHRoaXMucHJvdG90eXBlOworCisgICAgICBwcm90byA9IENsYXNzLnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpOworICAgICAgcHJvdG8uY29uc3RydWN0b3Ig
PSBDbGFzczsKKyAgICAgIF9lbWJlck1ldGFsVXRpbHMuZ2VuZXJhdGVHdWlkKHByb3RvKTsKKyAg
ICAgIF9lbWJlck1ldGFsTWV0YS5tZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0aGlzIHdp
bGwgZGlzYWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCisKKyAgICAgIENsYXNzLkNsYXNzTWl4
aW4uYXBwbHkoQ2xhc3MpOworICAgICAgcmV0dXJuIENsYXNzOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy4gQWNjZXB0cyBlaXRoZXIgbm8g
YXJndW1lbnRzLCBvciBhbiBvYmplY3QKKyAgICAgIGNvbnRhaW5pbmcgdmFsdWVzIHRvIGluaXRp
YWxpemUgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBvYmplY3Qgd2l0aC4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAg
IGhlbGxvV29ybGQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGFsZXJ0KCJIaSwgbXkgbmFtZSBp
cyAiICsgdGhpcy5nZXQoJ25hbWUnKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIHZh
ciB0b20gPSBBcHAuUGVyc29uLmNyZWF0ZSh7CisgICAgICAgIG5hbWU6ICdUb20gRGFsZScKKyAg
ICAgIH0pOworICAgICAgIHRvbS5oZWxsb1dvcmxkKCk7IC8vIGFsZXJ0cyAiSGksIG15IG5hbWUg
aXMgVG9tIERhbGUiLgorICAgICAgYGBgCisgICAgICAgYGNyZWF0ZWAgd2lsbCBjYWxsIHRoZSBg
aW5pdGAgZnVuY3Rpb24gaWYgZGVmaW5lZCBkdXJpbmcKKyAgICAgIGBFbWJlci5BbnlPYmplY3Qu
ZXh0ZW5kYAorICAgICAgIElmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIGBjcmVhdGVgLCBp
dCB3aWxsIG5vdCBzZXQgdmFsdWVzIHRvIHRoZSBuZXcKKyAgICAgIGluc3RhbmNlIGR1cmluZyBp
bml0aWFsaXphdGlvbjoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgbm9OYW1lID0g
QXBwLlBlcnNvbi5jcmVhdGUoKTsKKyAgICAgIG5vTmFtZS5oZWxsb1dvcmxkKCk7IC8vIGFsZXJ0
cyB1bmRlZmluZWQKKyAgICAgIGBgYAorICAgICAgIE5PVEU6IEZvciBwZXJmb3JtYW5jZSByZWFz
b25zLCB5b3UgY2Fubm90IGRlY2xhcmUgbWV0aG9kcyBvciBjb21wdXRlZAorICAgICAgcHJvcGVy
dGllcyBkdXJpbmcgYGNyZWF0ZWAuIFlvdSBzaG91bGQgaW5zdGVhZCBkZWNsYXJlIG1ldGhvZHMg
YW5kIGNvbXB1dGVkCisgICAgICBwcm9wZXJ0aWVzIHdoZW4gdXNpbmcgYGV4dGVuZGAuCisgICAg
ICAgQG1ldGhvZCBjcmVhdGUKKyAgICAgIEBzdGF0aWMKKyAgICAgIEBwYXJhbSBbYXJndW1lbnRz
XSoKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkgeworICAg
ICAgdmFyIEMgPSB0aGlzOworCisgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIr
KykgeworICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgICB9CisK
KyAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5faW5pdFByb3BlcnRp
ZXMoYXJncyk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEMoKTsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBBdWdtZW50cyBhIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIHdpdGggYWRkaXRp
b25hbAorICAgICAgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25zOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIG5hbWU6
ICdhbiBvYmplY3QnCisgICAgICB9KTsKKyAgICAgICBvID0gTXlPYmplY3QuY3JlYXRlKCk7Cisg
ICAgICBvLmdldCgnbmFtZScpOyAvLyAnYW4gb2JqZWN0JworICAgICAgIE15T2JqZWN0LnJlb3Bl
bih7CisgICAgICAgIHNheTogZnVuY3Rpb24obXNnKXsKKyAgICAgICAgICBjb25zb2xlLmxvZyht
c2cpOworICAgICAgICB9CisgICAgICB9KQorICAgICAgIG8yID0gTXlPYmplY3QuY3JlYXRlKCk7
CisgICAgICBvMi5zYXkoImhlbGxvIik7IC8vIGxvZ3MgImhlbGxvIgorICAgICAgIG8uc2F5KCJn
b29kYnllIik7IC8vIGxvZ3MgImdvb2RieWUiCisgICAgICBgYGAKKyAgICAgICBUbyBhZGQgZnVu
Y3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRvIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYsCisgICAgICBz
ZWUgYHJlb3BlbkNsYXNzYAorICAgICAgIEBtZXRob2QgcmVvcGVuCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICByZW9wZW46IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMud2lsbFJlb3Blbigp
OworICAgICAgcmVvcGVuLmFwcGx5KHRoaXMuUHJvdG90eXBlTWl4aW4sIGFyZ3VtZW50cyk7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBdWdtZW50cyBhIGNv
bnN0cnVjdG9yJ3Mgb3duIHByb3BlcnRpZXMgYW5kIGZ1bmN0aW9uczoKKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBNeU9iamVjdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgICBu
YW1lOiAnYW4gb2JqZWN0JworICAgICAgfSk7CisgICAgICAgTXlPYmplY3QucmVvcGVuQ2xhc3Mo
eworICAgICAgICBjYW5CdWlsZDogZmFsc2UKKyAgICAgIH0pOworICAgICAgIE15T2JqZWN0LmNh
bkJ1aWxkOyAvLyBmYWxzZQorICAgICAgbyA9IE15T2JqZWN0LmNyZWF0ZSgpOworICAgICAgYGBg
CisgICAgICAgSW4gb3RoZXIgd29yZHMsIHRoaXMgY3JlYXRlcyBzdGF0aWMgcHJvcGVydGllcyBh
bmQgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MuCisgICAgICBUaGVzZSBhcmUgb25seSBhdmFpbGFi
bGUgb24gdGhlIGNsYXNzIGFuZCBub3Qgb24gYW55IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRl
bmQoeworICAgICAgICBuYW1lIDogIiIsCisgICAgICAgIHNheUhlbGxvIDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgYWxlcnQoIkhlbGxvLiBNeSBuYW1lIGlzICIgKyB0aGlzLmdldCgnbmFtZScp
KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgQXBwLlBlcnNvbi5yZW9wZW5DbGFzcyh7
CisgICAgICAgIHNwZWNpZXMgOiAiSG9tbyBzYXBpZW5zIiwKKyAgICAgICAgY3JlYXRlUGVyc29u
OiBmdW5jdGlvbihuZXdQZXJzb25zTmFtZSl7CisgICAgICAgICAgcmV0dXJuIEFwcC5QZXJzb24u
Y3JlYXRlKHsKKyAgICAgICAgICAgIG5hbWU6bmV3UGVyc29uc05hbWUKKyAgICAgICAgICB9KTsK
KyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgdmFyIHRvbSA9IEFwcC5QZXJzb24uY3JlYXRl
KHsKKyAgICAgICAgbmFtZSA6ICJUb20gRGFsZSIKKyAgICAgIH0pOworICAgICAgdmFyIHllaHVk
YSA9IEFwcC5QZXJzb24uY3JlYXRlUGVyc29uKCJZZWh1ZGEgS2F0eiIpOworICAgICAgIHRvbS5z
YXlIZWxsbygpOyAvLyAiSGVsbG8uIE15IG5hbWUgaXMgVG9tIERhbGUiCisgICAgICB5ZWh1ZGEu
c2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBLYXR6IgorICAgICAgYWxl
cnQoQXBwLlBlcnNvbi5zcGVjaWVzKTsgLy8gIkhvbW8gc2FwaWVucyIKKyAgICAgIGBgYAorICAg
ICAgIE5vdGUgdGhhdCBgc3BlY2llc2AgYW5kIGBjcmVhdGVQZXJzb25gIGFyZSAqbm90KiB2YWxp
ZCBvbiB0aGUgYHRvbWAgYW5kIGB5ZWh1ZGFgCisgICAgICB2YXJpYWJsZXMuIFRoZXkgYXJlIG9u
bHkgdmFsaWQgb24gYEFwcC5QZXJzb25gLgorICAgICAgIFRvIGFkZCBmdW5jdGlvbnMgYW5kIHBy
b3BlcnRpZXMgdG8gaW5zdGFuY2VzIG9mCisgICAgICBhIGNvbnN0cnVjdG9yIGJ5IGV4dGVuZGlu
ZyB0aGUgY29uc3RydWN0b3IncyBwcm90b3R5cGUKKyAgICAgIHNlZSBgcmVvcGVuYAorICAgICAg
IEBtZXRob2QgcmVvcGVuQ2xhc3MKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlb3BlbkNs
YXNzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZW9wZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBh
cmd1bWVudHMpOworICAgICAgYXBwbHlNaXhpbih0aGlzLCBhcmd1bWVudHMsIGZhbHNlKTsKKyAg
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICBkZXRlY3Q6IGZ1bmN0aW9uIChvYmopIHsK
KyAgICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2Ygb2JqKSB7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PT0g
dGhpcykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIG9iaiA9
IG9iai5zdXBlcmNsYXNzOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisK
KyAgICBkZXRlY3RJbnN0YW5jZTogZnVuY3Rpb24gKG9iaikgeworICAgICAgcmV0dXJuIG9iaiBp
bnN0YW5jZW9mIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSW4gc29tZSBjYXNlcywg
eW91IG1heSB3YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aCBhZGRpdGlv
bmFsCisgICAgICBtZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVl
cyB0aGV5IG9wZXJhdGUgb24uIEZvcgorICAgICAgZXhhbXBsZSwgY29tcHV0ZWQgcHJvcGVydHkg
ZnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuCisgICAgICBu
byBsb25nZXIgYXZhaWxhYmxlIGZvciBpbnRyb3NwZWN0aW9uLgorICAgICAgIFlvdSBjYW4gcGFz
cyBhIGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVydHkgbGlrZSB0aGlz
OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHBlcnNvbjogZnVuY3Rpb24oKSB7CisgICAg
ICAgIHZhciBwZXJzb25JZCA9IHRoaXMuZ2V0KCdwZXJzb25JZCcpOworICAgICAgICByZXR1cm4g
QXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgICAgICB9LnByb3BlcnR5KCku
bWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKKyAgICAgIGBgYAorICAgICAgIE9uY2UgeW91J3Zl
IGRvbmUgdGhpcywgeW91IGNhbiByZXRyaWV2ZSB0aGUgdmFsdWVzIHNhdmVkIHRvIHRoZSBjb21w
dXRlZAorICAgICAgcHJvcGVydHkgZnJvbSB5b3VyIGNsYXNzIGxpa2UgdGhpczoKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBNeUNsYXNzLm1ldGFGb3JQcm9wZXJ0eSgncGVyc29uJyk7Cisg
ICAgICBgYGAKKyAgICAgICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBoYXNoIHRoYXQg
d2FzIHBhc3NlZCB0byBgbWV0YSgpYC4KKyAgICAgICBAc3RhdGljCisgICAgICBAbWV0aG9kIG1l
dGFGb3JQcm9wZXJ0eQorICAgICAgQHBhcmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lCisg
ICAgICBAcHJpdmF0ZQorICAgICovCisgICAgbWV0YUZvclByb3BlcnR5OiBmdW5jdGlvbiAoa2V5
KSB7CisgICAgICB2YXIgcHJvdG8gPSB0aGlzLnByb3RvKCk7CisgICAgICB2YXIgcG9zc2libGVE
ZXNjID0gcHJvdG9ba2V5XTsKKyAgICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxs
ICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rl
c2NyaXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdtZXRhRm9yUHJvcGVydHkoKSBjb3VsZCBub3QgZmluZCBhIGNvbXB1dGVk
IHByb3BlcnR5ICcgKyAnd2l0aCBrZXkgXCcnICsga2V5ICsgJ1wnLicsICEhZGVzYyAmJiBkZXNj
IGluc3RhbmNlb2YgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFByb3BlcnR5KTsKKyAgICAg
IHJldHVybiBkZXNjLl9tZXRhIHx8IHt9OworICAgIH0sCisKKyAgICBfY29tcHV0ZWRQcm9wZXJ0
aWVzOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgIGhh
c0NhY2hlZENvbXB1dGVkUHJvcGVydGllcyA9IHRydWU7CisgICAgICB2YXIgcHJvdG8gPSB0aGlz
LnByb3RvKCk7CisgICAgICB2YXIgcHJvcGVydHk7CisgICAgICB2YXIgcHJvcGVydGllcyA9IFtd
OworCisgICAgICBmb3IgKHZhciBuYW1lIGluIHByb3RvKSB7CisgICAgICAgIHByb3BlcnR5ID0g
cHJvdG9bbmFtZV07CisKKyAgICAgICAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmlzRGVzY3Jp
cHRvcikgeworICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh7CisgICAgICAgICAgICBuYW1lOiBu
YW1lLAorICAgICAgICAgICAgbWV0YTogcHJvcGVydHkuX21ldGEKKyAgICAgICAgICB9KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfSkucmVhZE9u
bHkoKSwKKworICAgIC8qKgorICAgICAgSXRlcmF0ZSBvdmVyIGVhY2ggY29tcHV0ZWQgcHJvcGVy
dHkgZm9yIHRoZSBjbGFzcywgcGFzc2luZyBpdHMgbmFtZQorICAgICAgYW5kIGFueSBhc3NvY2lh
dGVkIG1ldGFkYXRhIChzZWUgYG1ldGFGb3JQcm9wZXJ0eWApIHRvIHRoZSBjYWxsYmFjay4KKyAg
ICAgICBAc3RhdGljCisgICAgICBAbWV0aG9kIGVhY2hDb21wdXRlZFByb3BlcnR5CisgICAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAgICAgQHBhcmFtIHtPYmplY3R9IGJpbmRpbmcK
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBlYWNoQ29tcHV0ZWRQcm9wZXJ0eTogZnVuY3Rp
b24gKGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgICB2YXIgcHJvcGVydHk7CisgICAgICB2YXIg
ZW1wdHkgPSB7fTsKKworICAgICAgdmFyIHByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ19jb21wdXRlZFByb3BlcnRpZXMnKTsKKworICAgICAgZm9yICh2YXIg
aSA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAg
ICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldOworICAgICAgICBjYWxsYmFjay5jYWxsKGJp
bmRpbmcgfHwgdGhpcywgcHJvcGVydHkubmFtZSwgcHJvcGVydHkubWV0YSB8fCBlbXB0eSk7Cisg
ICAgICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGluamVjdGVkUHJvcGVydHlBc3NlcnRp
b24oKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0luamVjdGVkIHByb3BlcnRpZXMg
YXJlIGludmFsaWQnLCBfZW1iZXJSdW50aW1lSW5qZWN0LnZhbGlkYXRlUHJvcGVydHlJbmplY3Rp
b25zKHRoaXMpKTsKKyAgfQorCisgIF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlv
biAoKSB7CisgICAgLyoqCisgICAgICBQcm92aWRlcyBsb29rdXAtdGltZSB0eXBlIHZhbGlkYXRp
b24gZm9yIGluamVjdGVkIHByb3BlcnRpZXMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgX29uTG9va3VwCisgICAgKi8KKyAgICBDbGFzc01peGluUHJvcHMuX29uTG9va3VwID0gaW5q
ZWN0ZWRQcm9wZXJ0eUFzc2VydGlvbjsKKyAgfSk7CisKKyAgLyoqCisgICAgUmV0dXJucyBhIGhh
c2ggb2YgcHJvcGVydHkgbmFtZXMgYW5kIGNvbnRhaW5lciBuYW1lcyB0aGF0IGluamVjdGVkCisg
ICAgcHJvcGVydGllcyB3aWxsIGxvb2t1cCBvbiB0aGUgY29udGFpbmVyIGxhemlseS4KKyAgCisg
ICAgQG1ldGhvZCBfbGF6eUluamVjdGlvbnMKKyAgICBAcmV0dXJuIHtPYmplY3R9IEhhc2ggb2Yg
YWxsIGxhenkgaW5qZWN0ZWQgcHJvcGVydHkga2V5cyB0byBjb250YWluZXIgbmFtZXMKKyAgICBA
cHJpdmF0ZQorICAqLworICBDbGFzc01peGluUHJvcHMuX2xhenlJbmplY3Rpb25zID0gZnVuY3Rp
b24gKCkgeworICAgIHZhciBpbmplY3Rpb25zID0ge307CisgICAgdmFyIHByb3RvID0gdGhpcy5w
cm90bygpOworICAgIHZhciBrZXksIGRlc2M7CisKKyAgICBmb3IgKGtleSBpbiBwcm90bykgewor
ICAgICAgZGVzYyA9IHByb3RvW2tleV07CisgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIF9lbWJl
ck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVmYXVsdCkgeworICAgICAgICBpbmplY3Rpb25zW2tl
eV0gPSBkZXNjLnR5cGUgKyAnOicgKyAoZGVzYy5uYW1lIHx8IGtleSk7CisgICAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIGluamVjdGlvbnM7CisgIH07CisKKyAgdmFyIENsYXNzTWl4aW4gPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShDbGFzc01peGluUHJvcHMpOworCisgIENsYXNz
TWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmplY3Q7CisKKyAgQ29yZU9iamVjdC5DbGFz
c01peGluID0gQ2xhc3NNaXhpbjsKKworICBDbGFzc01peGluLmFwcGx5KENvcmVPYmplY3QpOwor
CisgIENvcmVPYmplY3QucmVvcGVuKHsKKyAgICBkaWREZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24g
KHByb3RvLCBrZXksIHZhbHVlKSB7CisgICAgICBpZiAoaGFzQ2FjaGVkQ29tcHV0ZWRQcm9wZXJ0
aWVzID09PSBmYWxzZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAodmFs
dWUgaW5zdGFuY2VvZiBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVkUHJvcGVydHkpIHsKKyAg
ICAgICAgdmFyIGNhY2hlID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcy5jb25zdHJ1Y3Rvciku
cmVhZGFibGVDYWNoZSgpOworCisgICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5fY29tcHV0ZWRQ
cm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjYWNoZS5fY29tcHV0ZWRQcm9w
ZXJ0aWVzID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBDb3JlT2JqZWN0OworfSk7CisKKy8vIE5PVEU6IHRoaXMgb2Jq
ZWN0IHNob3VsZCBuZXZlciBiZSBpbmNsdWRlZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgYEVtYmVy
Lk9iamVjdGAuCisvLyBXZSBvbmx5IGRlZmluZSB0aGlzIHNlcGFyYXRlbHkgc28gdGhhdCBgRW1i
ZXIuU2V0YCBjYW4gZGVwZW5kIG9uIGl0LgorCisvKioKKyAgRGVmaW5lcyB0aGUgcHJvcGVydGll
cyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MKKyAgKGluc3Rl
YWQgb2Ygb3ZlcnJpZGRlbikuCisgICBCeSBkZWZhdWx0LCB3aGVuIHlvdSBleHRlbmQgYW4gRW1i
ZXIgY2xhc3MgYSBwcm9wZXJ0eSBkZWZpbmVkIGluCisgIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMg
YSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBpcyBkZWZpbmVkCisgIGluIHRoZSBz
dXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVm
ZXJhYmxlCisgIHRvIGJ1aWxkIHVwIGEgcHJvcGVydHkncyB2YWx1ZSBieSBjb21iaW5pbmcgdGhl
IHN1cGVyY2xhc3MnIHByb3BlcnR5CisgIHZhbHVlIHdpdGggdGhlIHN1YmNsYXNzJyB2YWx1ZS4g
QW4gZXhhbXBsZSBvZiB0aGlzIGluIHVzZSB3aXRoaW4gRW1iZXIKKyAgaXMgdGhlIGBjbGFzc05h
bWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIuVmlld2AuCisgICBIZXJlIGlzIHNvbWUgc2FtcGxlIGNv
ZGUgc2hvd2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29uY2F0ZW5hdGVkCisgIHByb3Bl
cnR5IGFuZCBhIG5vcm1hbCBvbmU6CisgICBgYGBqYXZhc2NyaXB0CisgIEFwcC5CYXJWaWV3ID0g
RW1iZXIuVmlldy5leHRlbmQoeworICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydi
YXInXSwKKyAgICBjbGFzc05hbWVzOiBbJ2JhciddCisgIH0pOworICAgQXBwLkZvb0JhclZpZXcg
PSBBcHAuQmFyVmlldy5leHRlbmQoeworICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTog
Wydmb28nXSwKKyAgICBjbGFzc05hbWVzOiBbJ2ZvbyddCisgIH0pOworICAgdmFyIGZvb0JhclZp
ZXcgPSBBcHAuRm9vQmFyVmlldy5jcmVhdGUoKTsKKyAgZm9vQmFyVmlldy5nZXQoJ3NvbWVOb25D
b25jYXRlbmF0ZWRQcm9wZXJ0eScpOyAvLyBbJ2ZvbyddCisgIGZvb0JhclZpZXcuZ2V0KCdjbGFz
c05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJ10KKyAgYGBgCisgICBUaGlz
IGJlaGF2aW9yIGV4dGVuZHMgdG8gb2JqZWN0IGNyZWF0aW9uIGFzIHdlbGwuIENvbnRpbnVpbmcg
dGhlCisgIGFib3ZlIGV4YW1wbGU6CisgICBgYGBqYXZhc2NyaXB0CisgIHZhciB2aWV3ID0gQXBw
LkZvb0JhclZpZXcuY3JlYXRlKHsKKyAgICBzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHk6IFsn
YmF6J10sCisgICAgY2xhc3NOYW1lczogWydiYXonXQorICB9KQorICB2aWV3LmdldCgnc29tZU5v
bkNvbmNhdGVuYXRlZFByb3BlcnR5Jyk7IC8vIFsnYmF6J10KKyAgdmlldy5nZXQoJ2NsYXNzTmFt
ZXMnKTsgLy8gWydlbWJlci12aWV3JywgJ2JhcicsICdmb28nLCAnYmF6J10KKyAgYGBgCisgIEFk
ZGluZyBhIHNpbmdsZSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBhbiBhcnJheSB3aWxsIGp1c3QgYWRk
IGl0IGluIHRoZSBhcnJheToKKyAgIGBgYGphdmFzY3JpcHQKKyAgdmFyIHZpZXcgPSBBcHAuRm9v
QmFyVmlldy5jcmVhdGUoeworICAgIGNsYXNzTmFtZXM6ICdiYXonCisgIH0pCisgIHZpZXcuZ2V0
KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJywgJ2JheiddCisg
IGBgYAorICAgVXNpbmcgdGhlIGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2Ug
Y2FuIHRlbGwgRW1iZXIgdG8gbWl4IHRoZQorICBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzLgor
ICAgSW4gYEVtYmVyLlZpZXdgIHRoZSBgY2xhc3NOYW1lQmluZGluZ3NgIGFuZCBgYXR0cmlidXRl
QmluZGluZ3NgIHByb3BlcnRpZXMKKyAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlv
biB0byBgY2xhc3NOYW1lc2AuCisgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3Ug
dG8gdXNlIHRocm91Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKKyAgYWx0aG91Z2ggdHlw
aWNhbCBhcHAgZGV2ZWxvcGVycyBhcmUgbGlrZWx5IHRvIHVzZSBpdCBpbmZyZXF1ZW50bHkuIFNp
bmNlCisgIGl0IGNoYW5nZXMgZXhwZWN0YXRpb25zIGFib3V0IGJlaGF2aW9yIG9mIHByb3BlcnRp
ZXMsIHlvdSBzaG91bGQgcHJvcGVybHkKKyAgZG9jdW1lbnQgaXRzIHVzYWdlIGluIGVhY2ggaW5k
aXZpZHVhbCBjb25jYXRlbmF0ZWQgcHJvcGVydHkgKHRvIG5vdAorICBtaXNsZWFkIHlvdXIgdXNl
cnMgdG8gdGhpbmsgdGhleSBjYW4gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGluIGEgc3ViY2xhc3Mp
LgorICAgQHByb3BlcnR5IGNvbmNhdGVuYXRlZFByb3BlcnRpZXMKKyAgQHR5cGUgQXJyYXkKKyAg
QGRlZmF1bHQgbnVsbAorICBAcHVibGljCisqLworCisvKioKKyAgRGVmaW5lcyB0aGUgcHJvcGVy
dGllcyB0aGF0IHdpbGwgYmUgbWVyZ2VkIGZyb20gdGhlIHN1cGVyY2xhc3MKKyAgKGluc3RlYWQg
b2Ygb3ZlcnJpZGRlbikuCisgICBCeSBkZWZhdWx0LCB3aGVuIHlvdSBleHRlbmQgYW4gRW1iZXIg
Y2xhc3MgYSBwcm9wZXJ0eSBkZWZpbmVkIGluCisgIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMgYSBw
cm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBpcyBkZWZpbmVkCisgIGluIHRoZSBzdXBl
cmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVmZXJh
YmxlCisgIHRvIGJ1aWxkIHVwIGEgcHJvcGVydHkncyB2YWx1ZSBieSBtZXJnaW5nIHRoZSBzdXBl
cmNsYXNzIHByb3BlcnR5IHZhbHVlCisgIHdpdGggdGhlIHN1YmNsYXNzIHByb3BlcnR5J3MgdmFs
dWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ugd2l0aGluIEVtYmVyCisgIGlzIHRoZSBgcXVl
cnlQYXJhbXNgIHByb3BlcnR5IG9mIHJvdXRlcy4KKyAgIEhlcmUgaXMgc29tZSBzYW1wbGUgY29k
ZSBzaG93aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBtZXJnZWQKKyAgcHJvcGVydHkgYW5k
IGEgbm9ybWFsIG9uZToKKyAgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkJhclJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKKyAgICBzb21lTm9uTWVyZ2VkUHJvcGVydHk6IHsKKyAgICAgIG5vbk1l
cmdlZDogJ3N1cGVyY2xhc3MgdmFsdWUgb2Ygbm9uTWVyZ2VkJworICAgIH0sCisgICAgcXVlcnlQ
YXJhbXM6IHsKKyAgICAgIHBhZ2U6IHtyZXBsYWNlOiBmYWxzZX0sCisgICAgICBsaW1pdDoge3Jl
cGxhY2U6IHRydWV9CisgICAgfQorICB9KTsKKyAgIEFwcC5Gb29CYXJSb3V0ZSA9IEFwcC5CYXJS
b3V0ZS5leHRlbmQoeworICAgIHNvbWVOb25NZXJnZWRQcm9wZXJ0eTogeworICAgICAgY29tcGxl
dGVseU5vbk1lcmdlZDogJ3N1YmNsYXNzIHZhbHVlIG9mIG5vbk1lcmdlZCcKKyAgICB9LAorICAg
IHF1ZXJ5UGFyYW1zOiB7CisgICAgICBsaW1pdDoge3JlcGxhY2U6IGZhbHNlfQorICAgIH0KKyAg
fSk7CisgICB2YXIgZm9vQmFyUm91dGUgPSBBcHAuRm9vQmFyUm91dGUuY3JlYXRlKCk7CisgICBm
b29CYXJSb3V0ZS5nZXQoJ3NvbWVOb25NZXJnZWRQcm9wZXJ0eScpOworICAvLyA9PiB7IGNvbXBs
ZXRlbHlOb25NZXJnZWQ6ICdzdWJjbGFzcyB2YWx1ZSBvZiBub25NZXJnZWQnIH0KKyAgLy8KKyAg
Ly8gTm90ZSB0aGUgZW50aXJlIG9iamVjdCwgaW5jbHVkaW5nIHRoZSBub25NZXJnZWQgcHJvcGVy
dHkgb2YKKyAgLy8gdGhlIHN1cGVyY2xhc3Mgb2JqZWN0LCBoYXMgYmVlbiByZXBsYWNlZAorICAg
Zm9vQmFyUm91dGUuZ2V0KCdxdWVyeVBhcmFtcycpOworICAvLyA9PiB7CisgIC8vICAgcGFnZTog
e3JlcGxhY2U6IGZhbHNlfSwKKyAgLy8gICBsaW1pdDoge3JlcGxhY2U6IGZhbHNlfQorICAvLyB9
CisgIC8vCisgIC8vIE5vdGUgdGhlIHBhZ2UgcmVtYWlucyBmcm9tIHRoZSBzdXBlcmNsYXNzLCBh
bmQgdGhlCisgIC8vIGBsaW1pdGAgcHJvcGVydHkncyB2YWx1ZSBvZiBgZmFsc2VgIGhhcyBiZWVu
IG1lcmdlZCBmcm9tCisgIC8vIHRoZSBzdWJjbGFzcy4KKyAgYGBgCisgICBUaGlzIGJlaGF2aW9y
IGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nIG9iamVjdCBgY3JlYXRlYCBjYWxscy4gSXQgaXMgb25s
eQorICBhdmFpbGFibGUgYXQgYGV4dGVuZGAgdGltZS4KKyAgIFRoaXMgZmVhdHVyZSBpcyBhdmFp
bGFibGUgZm9yIHlvdSB0byB1c2UgdGhyb3VnaG91dCB0aGUgRW1iZXIgb2JqZWN0IG1vZGVsLAor
ICBhbHRob3VnaCB0eXBpY2FsIGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGlu
ZnJlcXVlbnRseS4gU2luY2UKKyAgaXQgY2hhbmdlcyBleHBlY3RhdGlvbnMgYWJvdXQgYmVoYXZp
b3Igb2YgcHJvcGVydGllcywgeW91IHNob3VsZCBwcm9wZXJseQorICBkb2N1bWVudCBpdHMgdXNh
Z2UgaW4gZWFjaCBpbmRpdmlkdWFsIG1lcmdlZCBwcm9wZXJ0eSAodG8gbm90CisgIG1pc2xlYWQg
eW91ciB1c2VycyB0byB0aGluayB0aGV5IGNhbiBvdmVycmlkZSB0aGUgcHJvcGVydHkgaW4gYSBz
dWJjbGFzcykuCisgICBAcHJvcGVydHkgbWVyZ2VkUHJvcGVydGllcworICBAdHlwZSBBcnJheQor
ICBAZGVmYXVsdCBudWxsCisgIEBwdWJsaWMKKyovCisKKy8qKgorICBEZXN0cm95ZWQgb2JqZWN0
IHByb3BlcnR5IGZsYWcuCisgICBpZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgb2JzZXJ2
ZXJzIGFuZCBiaW5kaW5ncyB3ZXJlIGFscmVhZHkKKyAgcmVtb3ZlZCBieSB0aGUgZWZmZWN0IG9m
IGNhbGxpbmcgdGhlIGBkZXN0cm95KClgIG1ldGhvZC4KKyAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3ll
ZAorICBAZGVmYXVsdCBmYWxzZQorICBAcHVibGljCisqLworCisvKioKKyAgRGVzdHJ1Y3Rpb24g
c2NoZWR1bGVkIGZsYWcuIFRoZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgor
ICAgVGhlIG9iamVjdCBzdGF5cyBpbnRhY3QgdW50aWwgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3Ag
YXQgd2hpY2ggcG9pbnQKKyAgdGhlIGBpc0Rlc3Ryb3llZGAgZmxhZyBpcyBzZXQuCisgICBAcHJv
cGVydHkgaXNEZXN0cm95aW5nCisgIEBkZWZhdWx0IGZhbHNlCisgIEBwdWJsaWMKKyovCisKKy8q
KgorICBEZXN0cm95cyBhbiBvYmplY3QgYnkgc2V0dGluZyB0aGUgYGlzRGVzdHJveWVkYCBmbGFn
IGFuZCByZW1vdmluZyBpdHMKKyAgbWV0YWRhdGEsIHdoaWNoIGVmZmVjdGl2ZWx5IGRlc3Ryb3lz
IG9ic2VydmVycyBhbmQgYmluZGluZ3MuCisgICBJZiB5b3UgdHJ5IHRvIHNldCBhIHByb3BlcnR5
IG9uIGEgZGVzdHJveWVkIG9iamVjdCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUKKyAgcmFpc2VkLgor
ICAgTm90ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGVuZCBvZiB0aGUg
cnVuIGxvb3AgYW5kIGRvZXMgbm90CisgIGhhcHBlbiBpbW1lZGlhdGVseS4gIEl0IHdpbGwgc2V0
IGFuIGlzRGVzdHJveWluZyBmbGFnIGltbWVkaWF0ZWx5LgorICAgQG1ldGhvZCBkZXN0cm95Cisg
IEByZXR1cm4ge0VtYmVyLk9iamVjdH0gcmVjZWl2ZXIKKyAgQHB1YmxpYworKi8KKworLyoqCisg
IE92ZXJyaWRlIHRvIGltcGxlbWVudCB0ZWFyZG93bi4KKyAgIEBtZXRob2Qgd2lsbERlc3Ryb3kK
KyAgQHB1YmxpYworKi8KKworLyoqCisgIEludm9rZWQgYnkgdGhlIHJ1biBsb29wIHRvIGFjdHVh
bGx5IGRlc3Ryb3kgdGhlIG9iamVjdC4gVGhpcyBpcworICBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlv
biBieSB0aGUgYGRlc3Ryb3lgIG1ldGhvZC4KKyAgIEBwcml2YXRlCisgIEBtZXRob2QgX3NjaGVk
dWxlZERlc3Ryb3kKKyovCisKKy8qKgorICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9u
IHdoaWNoIGF0dGVtcHRzIHRvIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbgorICB0aGFuIEphdmFz
Y3JpcHQncyBgdG9TdHJpbmdgIHR5cGljYWxseSBkb2VzLCBpbiBhIGdlbmVyaWMgd2F5IGZvciBh
bGwgRW1iZXIKKyAgb2JqZWN0cy4KKyAgIGBgYGphdmFzY3JpcHQKKyAgQXBwLlBlcnNvbiA9IEVt
Lk9iamVjdC5leHRlbmQoKQorICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCisgIHBlcnNv
bi50b1N0cmluZygpIC8vPT4gIjxBcHAuUGVyc29uOmVtYmVyMTAyND4iCisgIGBgYAorICAgSWYg
dGhlIG9iamVjdCdzIGNsYXNzIGlzIG5vdCBkZWZpbmVkIG9uIGFuIEVtYmVyIG5hbWVzcGFjZSwg
aXQgd2lsbAorICBpbmRpY2F0ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdpc3RlcmVkIHN1
cGVyY2xhc3M6CisgIGBgYGphdmFzY3JpcHQKKyAgU3R1ZGVudCA9IEFwcC5QZXJzb24uZXh0ZW5k
KCkKKyAgc3R1ZGVudCA9IFN0dWRlbnQuY3JlYXRlKCkKKyAgc3R1ZGVudC50b1N0cmluZygpIC8v
PT4gIjwoc3ViY2xhc3Mgb2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1PiIKKyAgYGBgCisgICBJZiB0
aGUgbWV0aG9kIGB0b1N0cmluZ0V4dGVuc2lvbmAgaXMgZGVmaW5lZCwgaXRzIHJldHVybiB2YWx1
ZSB3aWxsIGJlCisgIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisgICBgYGBqYXZhc2NyaXB0Cisg
IEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5leHRlbmQoeworICAgIHRvU3RyaW5nRXh0ZW5zaW9u
OiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldCgnZnVsbE5hbWUnKTsKKyAgICB9
CisgIH0pOworICB0ZWFjaGVyID0gQXBwLlRlYWNoZXIuY3JlYXRlKCkKKyAgdGVhY2hlci50b1N0
cmluZygpOyAvLz0+ICI8QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxlPiIKKyAgYGBgCisg
ICBAbWV0aG9kIHRvU3RyaW5nCisgIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0
aW9uCisgIEBwdWJsaWMKKyovCitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL2VhY2hfcHJv
eHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2
ZW50cycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMv
YXJyYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2
ZW50cywgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheSkg
eworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgVGhpcyBpcyB0aGUgb2JqZWN0IGluc3Rh
bmNlIHJldHVybmVkIHdoZW4geW91IGdldCB0aGUgYEBlYWNoYCBwcm9wZXJ0eSBvbiBhbgorICAg
IGFycmF5LiBJdCB1c2VzIHRoZSB1bmtub3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRvbWF0aWNh
bGx5IGNyZWF0ZQorICAgIEVhY2hBcnJheSBpbnN0YW5jZXMgZm9yIHByb3BlcnR5IG5hbWVzLgor
ICAgIEBjbGFzcyBFYWNoUHJveHkKKyAgICBAcHJpdmF0ZQorICAqLworICBmdW5jdGlvbiBFYWNo
UHJveHkoY29udGVudCkgeworICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50OworICAgIHRoaXMu
X2tleXMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fX2VtYmVyX21ldGFfXyA9IG51bGw7CisgIH0K
KworICBFYWNoUHJveHkucHJvdG90eXBlID0geworICAgIF9fZGVmaW5lTm9uRW51bWVyYWJsZTog
ZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgICB0aGlzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVy
dHkuZGVzY3JpcHRvci52YWx1ZTsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIEFSUkFZIENI
QU5HRVMKKyAgICAvLyBJbnZva2VzIHdoZW5ldmVyIHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiBj
aGFuZ2VzLgorCisgICAgYXJyYXlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAoY29udGVudCwgaWR4LCBy
ZW1vdmVkQ250LCBhZGRlZENudCkgeworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAg
ICAgdmFyIGxpbSA9IHJlbW92ZWRDbnQgPiAwID8gaWR4ICsgcmVtb3ZlZENudCA6IC0xOworICAg
ICAgZm9yICh2YXIga2V5IGluIGtleXMpIHsKKyAgICAgICAgaWYgKGxpbSA+IDApIHsKKyAgICAg
ICAgICByZW1vdmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5LCB0aGlzLCBpZHgs
IGxpbSk7CisgICAgICAgIH0KKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CisgICAgICB9CisgICAgfSwKKworICAgIGFycmF5
RGlkQ2hhbmdlOiBmdW5jdGlvbiAoY29udGVudCwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkg
eworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAgdmFyIGxpbSA9IGFkZGVkQ250
ID4gMCA/IGlkeCArIGFkZGVkQ250IDogLTE7CisgICAgICBmb3IgKHZhciBrZXkgaW4ga2V5cykg
eworICAgICAgICBpZiAobGltID4gMCkgeworICAgICAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVu
dEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsKKyAgICAgICAgfQorICAgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOwor
ICAgICAgfQorICAgIH0sCisKKyAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAgLy8gTElTVEVOIEZPUiBORVcgT0JTRVJW
RVJTIEFORCBPVEhFUiBFVkVOVCBMSVNURU5FUlMKKyAgICAvLyBTdGFydCBtb25pdG9yaW5nIGtl
eXMgYmFzZWQgb24gd2hvIGlzIGxpc3RlbmluZy4uLgorCisgICAgd2lsbFdhdGNoUHJvcGVydHk6
IGZ1bmN0aW9uIChwcm9wZXJ0eSkgeworICAgICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRL
ZXkocHJvcGVydHkpOworICAgIH0sCisKKyAgICBkaWRVbndhdGNoUHJvcGVydHk6IGZ1bmN0aW9u
IChwcm9wZXJ0eSkgeworICAgICAgdGhpcy5zdG9wT2JzZXJ2aW5nQ29udGVudEtleShwcm9wZXJ0
eSk7CisgICAgfSwKKworICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICAvLyBDT05URU5UIEtFWSBPQlNFUlZJTkcKKyAg
ICAvLyBBY3R1YWwgd2F0Y2gga2V5cyBvbiB0aGUgc291cmNlIGNvbnRlbnQuCisKKyAgICBiZWdp
bk9ic2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uIChrZXlOYW1lKSB7CisgICAgICB2YXIga2V5
cyA9IHRoaXMuX2tleXM7CisgICAgICBpZiAoIWtleXMpIHsKKyAgICAgICAga2V5cyA9IHRoaXMu
X2tleXMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgfQor
CisgICAgICBpZiAoIWtleXNba2V5TmFtZV0pIHsKKyAgICAgICAga2V5c1trZXlOYW1lXSA9IDE7
CisgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudDsKKyAgICAgICAgdmFyIGxlbiA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChjb250ZW50LCAnbGVuZ3RoJyk7CisKKyAgICAg
ICAgYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHRoaXMsIDAsIGxl
bik7CisgICAgICB9IGVsc2UgeworICAgICAgICBrZXlzW2tleU5hbWVdKys7CisgICAgICB9Cisg
ICAgfSwKKworICAgIHN0b3BPYnNlcnZpbmdDb250ZW50S2V5OiBmdW5jdGlvbiAoa2V5TmFtZSkg
eworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAgaWYgKGtleXMgJiYga2V5c1tr
ZXlOYW1lXSA+IDAgJiYgLS1rZXlzW2tleU5hbWVdIDw9IDApIHsKKyAgICAgICAgdmFyIGNvbnRl
bnQgPSB0aGlzLl9jb250ZW50OworICAgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KGNvbnRlbnQsICdsZW5ndGgnKTsKKworICAgICAgICByZW1vdmVPYnNlcnZlckZv
ckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgdGhpcywgMCwgbGVuKTsKKyAgICAgIH0KKyAg
ICB9LAorCisgICAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChvYmosIGtleU5hbWUp
IHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgY29udGVudEtleURpZENoYW5nZTogZnVuY3Rp
b24gKG9iaiwga2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJv
cGVydHlEaWRDaGFuZ2UodGhpcywga2V5TmFtZSk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9u
IGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBs
b2MpIHsKKyAgICB3aGlsZSAoLS1sb2MgPj0gaWR4KSB7CisgICAgICB2YXIgaXRlbSA9IF9lbWJl
clJ1bnRpbWVNaXhpbnNBcnJheS5vYmplY3RBdChjb250ZW50LCBsb2MpOworICAgICAgaWYgKGl0
ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1doZW4gdXNpbmcgQGVhY2gg
dG8gb2JzZXJ2ZSB0aGUgYXJyYXkgJyArIGNvbnRlbnQgKyAnLCB0aGUgYXJyYXkgbXVzdCByZXR1
cm4gYW4gb2JqZWN0JywgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKTsKKyAgICAgICAgX2VtYmVy
TWV0YWxPYnNlcnZlci5fYWRkQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdj
b250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9i
c2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOworICAg
ICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtl
eShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKKyAgICB3aGlsZSAoLS1sb2Mg
Pj0gaWR4KSB7CisgICAgICB2YXIgaXRlbSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5vYmpl
Y3RBdChjb250ZW50LCBsb2MpOworICAgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxPYnNlcnZlci5fcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdj
b250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92
ZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOwor
ICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IEVhY2hQcm94eTsKK30p
OworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9uYXRpdmVfYXJyYXknXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUnVudGltZVN5c3RlbU5h
dGl2ZV9hcnJheSkgeworICAvKmdsb2JhbHMgQ3VzdG9tRXZlbnQgKi8KKworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5vbkxvYWQgPSBvbkxvYWQ7CisgIGV4cG9ydHMucnVuTG9hZEhvb2tz
ID0gcnVuTG9hZEhvb2tzOworCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICB2YXIgbG9hZEhvb2tzID0gX2VtYmVyTWV0YWxD
b3JlLmRlZmF1bHQuRU5WLkVNQkVSX0xPQURfSE9PS1MgfHwge307CisgIHZhciBsb2FkZWQgPSB7
fTsKKyAgdmFyIF9sb2FkZWQgPSBsb2FkZWQ7CisKKyAgZXhwb3J0cy5fbG9hZGVkID0gX2xvYWRl
ZDsKKyAgLyoqCisgICAgRGV0ZWN0cyB3aGVuIGEgc3BlY2lmaWMgcGFja2FnZSBvZiBFbWJlciAo
ZS5nLiAnRW1iZXIuQXBwbGljYXRpb24nKQorICAgIGhhcyBmdWxseSBsb2FkZWQgYW5kIGlzIGF2
YWlsYWJsZSBmb3IgZXh0ZW5zaW9uLgorICAKKyAgICBUaGUgcHJvdmlkZWQgYGNhbGxiYWNrYCB3
aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmFtZWAgcGFzc2VkCisgICAgcmVzb2x2ZWQgZnJvbSBh
IHN0cmluZyBpbnRvIHRoZSBvYmplY3Q6CisgIAorICAgIGBgYCBqYXZhc2NyaXB0CisgICAgRW1i
ZXIub25Mb2FkKCdFbWJlci5BcHBsaWNhdGlvbicgZnVuY3Rpb24oaGJhcnMpIHsKKyAgICAgIGhi
YXJzLnJlZ2lzdGVySGVscGVyKC4uLik7CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRo
b2Qgb25Mb2FkCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5hbWUg
b2YgaG9vaworICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIGJlIGNh
bGxlZAorICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gb25Mb2FkKG5hbWUsIGNhbGxi
YWNrKSB7CisgICAgdmFyIG9iamVjdCA9IGxvYWRlZFtuYW1lXTsKKworICAgIGxvYWRIb29rc1tu
YW1lXSA9IGxvYWRIb29rc1tuYW1lXSB8fCBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKyAgICBsb2FkSG9va3NbbmFtZV0ucHVzaE9iamVjdChjYWxsYmFjayk7CisKKyAgICBp
ZiAob2JqZWN0KSB7CisgICAgICBjYWxsYmFjayhvYmplY3QpOworICAgIH0KKyAgfQorCisgIC8q
KgorICAgIENhbGxlZCB3aGVuIGFuIEVtYmVyLmpzIHBhY2thZ2UgKGUuZyBFbWJlci5BcHBsaWNh
dGlvbikgaGFzIGZpbmlzaGVkCisgICAgbG9hZGluZy4gVHJpZ2dlcnMgYW55IGNhbGxiYWNrcyBy
ZWdpc3RlcmVkIGZvciB0aGlzIGV2ZW50LgorICAKKyAgICBAbWV0aG9kIHJ1bkxvYWRIb29rcwor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1lIG9mIGhvb2sKKyAg
ICBAcGFyYW0gb2JqZWN0IHtPYmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNhbGxiYWNrcworICAg
IEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gcnVuTG9hZEhvb2tzKG5hbWUsIG9iamVjdCkg
eworICAgIGxvYWRlZFtuYW1lXSA9IG9iamVjdDsKKworICAgIGlmICh0eXBlb2Ygd2luZG93ID09
PSAnb2JqZWN0JyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicg
JiYgdHlwZW9mIEN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICB2YXIgZXZlbnQg
PSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwgeyBkZXRhaWw6IG9iamVjdCwgbmFtZTogbmFtZSB9KTsK
KyAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBpZiAobG9h
ZEhvb2tzW25hbWVdKSB7CisgICAgICBsb2FkSG9va3NbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAo
Y2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG9iamVjdCk7CisgICAgICB9KTsK
KyAgICB9CisgIH0KK30pOworLy8gRW1iZXIuRU5WLkVNQkVSX0xPQURfSE9PS1MKK2VuaWZlZCgn
ZW1iZXItcnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L2NvcmUnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3V0aWxzJywg
J2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZVN5c3RlbU9i
amVjdCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRp
bWUKKyAgKi8KKworICAvLyBFbWJlci5sb29rdXAsIEVtYmVyLkJPT1RFRCwgRW1iZXIuTkFNRV9L
RVksIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBBIE5hbWVzcGFjZSBpcyBhbiBvYmplY3QgdXN1YWxseSB1c2VkIHRvIGNvbnRhaW4gb3Ro
ZXIgb2JqZWN0cyBvciBtZXRob2RzCisgICAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFt
ZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFjZSBhbnl0aW1lIHlvdSB3YW50CisgICAgdG8gZGVmaW5l
IG9uZSBvZiB0aGVzZSBuZXcgY29udGFpbmVycy4KKyAgCisgICAgIyBFeGFtcGxlIFVzYWdlCisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeUZyYW1ld29yayA9IEVtYmVyLk5hbWVzcGFjZS5j
cmVhdGUoeworICAgICAgVkVSU0lPTjogJzEuMC4wJworICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBAY2xhc3MgTmFtZXNwYWNlCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVt
YmVyLk9iamVjdAorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIE5hbWVzcGFjZSA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIGlzTmFtZXNwYWNlOiB0cnVl
LAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgTmFtZXNwYWNlLk5BTUVTUEFDRVMu
cHVzaCh0aGlzKTsKKyAgICAgIE5hbWVzcGFjZS5QUk9DRVNTRUQgPSBmYWxzZTsKKyAgICB9LAor
CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBuYW1lID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICduYW1lJykgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdtb2R1bGVQcmVmaXgnKTsKKyAgICAgIGlmIChuYW1lKSB7CisgICAgICAg
IHJldHVybiBuYW1lOworICAgICAgfQorCisgICAgICBmaW5kTmFtZXNwYWNlcygpOworICAgICAg
cmV0dXJuIHRoaXNbTkFNRV9LRVldOworICAgIH0sCisKKyAgICBuYW1lQ2xhc3NlczogZnVuY3Rp
b24gKCkgeworICAgICAgcHJvY2Vzc05hbWVzcGFjZShbdGhpcy50b1N0cmluZygpXSwgdGhpcywg
e30pOworICAgIH0sCisKKyAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbmFt
ZXNwYWNlcyA9IE5hbWVzcGFjZS5OQU1FU1BBQ0VTOworICAgICAgdmFyIHRvU3RyaW5nID0gdGhp
cy50b1N0cmluZygpOworCisgICAgICBpZiAodG9TdHJpbmcpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQubG9va3VwW3RvU3RyaW5nXSA9IHVuZGVmaW5lZDsKKyAgICAgICAgZGVs
ZXRlIE5hbWVzcGFjZS5OQU1FU1BBQ0VTX0JZX0lEW3RvU3RyaW5nXTsKKyAgICAgIH0KKyAgICAg
IG5hbWVzcGFjZXMuc3BsaWNlKG5hbWVzcGFjZXMuaW5kZXhPZih0aGlzKSwgMSk7CisgICAgICB0
aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgfSk7CisKKyAgTmFt
ZXNwYWNlLnJlb3BlbkNsYXNzKHsKKyAgICBOQU1FU1BBQ0VTOiBbX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHRdLAorICAgIE5BTUVTUEFDRVNfQllfSUQ6IHt9LAorICAgIFBST0NFU1NFRDogZmFsc2Us
CisgICAgcHJvY2Vzc0FsbDogcHJvY2Vzc0FsbE5hbWVzcGFjZXMsCisgICAgYnlOYW1lOiBmdW5j
dGlvbiAobmFtZSkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5CT09URUQp
IHsKKyAgICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIE5BTUVTUEFDRVNfQllfSURbbmFtZV07CisgICAgfQorICB9KTsKKworICB2YXIgTkFNRVNQ
QUNFU19CWV9JRCA9IE5hbWVzcGFjZS5OQU1FU1BBQ0VTX0JZX0lEOworCisgIHZhciBoYXNPd25Q
cm9wID0gKHt9KS5oYXNPd25Qcm9wZXJ0eTsKKworICBmdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNl
KHBhdGhzLCByb290LCBzZWVuKSB7CisgICAgdmFyIGlkeCA9IHBhdGhzLmxlbmd0aDsKKworICAg
IE5BTUVTUEFDRVNfQllfSURbcGF0aHMuam9pbignLicpXSA9IHJvb3Q7CisKKyAgICAvLyBMb29w
IG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1lc3BhY2UsIGxvb2tpbmcgZm9yIGNsYXNz
ZXMKKyAgICBmb3IgKHZhciBrZXkgaW4gcm9vdCkgeworICAgICAgaWYgKCFoYXNPd25Qcm9wLmNh
bGwocm9vdCwga2V5KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBv
YmogPSByb290W2tleV07CisKKyAgICAgIC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBgRW1i
ZXJgIG5hbWVzcGFjZSwgZm9yIGV4YW1wbGUsIHRoZQorICAgICAgLy8gYHBhdGhzYCB3aWxsIHN0
YXJ0IHdpdGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJhdGlvbiB0aHJvdWdoCisgICAgICAvLyB0
aGUgbG9vcCB3aWxsIHVwZGF0ZSB0aGUgKipzZWNvbmQqKiBlbGVtZW50IG9mIHRoaXMgbGlzdCB3
aXRoCisgICAgICAvLyB0aGUga2V5LCBzbyBwcm9jZXNzaW5nIGBFbWJlci5WaWV3YCB3aWxsIG1h
a2UgdGhlIEFycmF5CisgICAgICAvLyBgWydFbWJlcicsICdWaWV3J11gLgorICAgICAgcGF0aHNb
aWR4XSA9IGtleTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSBmb3VuZCBhbiB1bnByb2Nlc3NlZCBj
bGFzcworICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcgJiYg
IW9ialtOQU1FX0tFWV0pIHsKKyAgICAgICAgLy8gUmVwbGFjZSB0aGUgY2xhc3MnIGB0b1N0cmlu
Z2Agd2l0aCB0aGUgZG90LXNlcGFyYXRlZCBwYXRoCisgICAgICAgIC8vIGFuZCBzZXQgaXRzIGBO
QU1FX0tFWWAKKyAgICAgICAgb2JqW05BTUVfS0VZXSA9IHBhdGhzLmpvaW4oJy4nKTsKKworICAg
ICAgICAvLyBTdXBwb3J0IG5lc3RlZCBuYW1lc3BhY2VzCisgICAgICB9IGVsc2UgaWYgKG9iaiAm
JiBvYmouaXNOYW1lc3BhY2UpIHsKKyAgICAgICAgICAvLyBTa2lwIGFsaWFzZWQgbmFtZXNwYWNl
cworICAgICAgICAgIGlmIChzZWVuW19lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcihvYmopXSkgewor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHNlZW5bX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKG9iaildID0gdHJ1ZTsKKworICAgICAgICAgIC8vIFByb2Nlc3Mg
dGhlIGNoaWxkIG5hbWVzcGFjZQorICAgICAgICAgIHByb2Nlc3NOYW1lc3BhY2UocGF0aHMsIG9i
aiwgc2Vlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXRocy5sZW5ndGggPSBpZHg7IC8v
IGN1dCBvdXQgbGFzdCBpdGVtCisgIH0KKworICB2YXIgU1RBUlRTX1dJVEhfVVBQRVJDQVNFID0g
L15bQS1aXS87CisKKyAgZnVuY3Rpb24gdHJ5SXNOYW1lc3BhY2UobG9va3VwLCBwcm9wKSB7Cisg
ICAgdHJ5IHsKKyAgICAgIHZhciBvYmogPSBsb29rdXBbcHJvcF07CisgICAgICByZXR1cm4gb2Jq
ICYmIG9iai5pc05hbWVzcGFjZSAmJiBvYmo7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy8g
Y29udGludWUKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kTmFtZXNwYWNlcygpIHsKKyAg
ICB2YXIgbG9va3VwID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubG9va3VwOworICAgIHZhciBv
Ymo7CisKKyAgICBpZiAoTmFtZXNwYWNlLlBST0NFU1NFRCkgeworICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGZvciAodmFyIHByb3AgaW4gbG9va3VwKSB7CisgICAgICAvLyBPbmx5IHByb2Nl
c3MgZW50aXRpZXMgdGhhdCBzdGFydCB3aXRoIHVwcGVyY2FzZSBBLVoKKyAgICAgIGlmICghU1RB
UlRTX1dJVEhfVVBQRVJDQVNFLnRlc3QocHJvcCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAg
ICB9CisKKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWUgdmVyc2lvbnMgb2YgSUUgZG9uJ3Qg
c3VwcG9ydCB3aW5kb3cuaGFzT3duUHJvcGVydHkKKyAgICAgIGlmIChsb29rdXAuaGFzT3duUHJv
cGVydHkgJiYgIWxvb2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICBjb250aW51
ZTsKKyAgICAgIH0KKworICAgICAgLy8gQXQgdGltZXMgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFj
Y2VzcyBjZXJ0YWluIHByb3BlcnRpZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCisgICAgICAvLyBU
aGVyZSBhcmUgYWxzbyB0aW1lcyB3aGVyZSBldmVuIGlmIHdlIGNhbiBhY2Nlc3MgdGhlbSwgd2Ug
YXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAgb2JqID0g
dHJ5SXNOYW1lc3BhY2UobG9va3VwLCBwcm9wKTsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAg
b2JqW05BTUVfS0VZXSA9IHByb3A7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIE5BTUVf
S0VZID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuTkFNRV9LRVkgPSBfZW1iZXJNZXRhbFV0aWxz
LkdVSURfS0VZICsgJ19uYW1lJzsKKworICBmdW5jdGlvbiBzdXBlckNsYXNzU3RyaW5nKG1peGlu
KSB7CisgICAgdmFyIHN1cGVyY2xhc3MgPSBtaXhpbi5zdXBlcmNsYXNzOworICAgIGlmIChzdXBl
cmNsYXNzKSB7CisgICAgICBpZiAoc3VwZXJjbGFzc1tOQU1FX0tFWV0pIHsKKyAgICAgICAgcmV0
dXJuIHN1cGVyY2xhc3NbTkFNRV9LRVldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJu
IHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjbGFzc1RvU3RyaW5nKCkgewor
ICAgIGlmICghX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQk9PVEVEICYmICF0aGlzW05BTUVfS0VZ
XSkgeworICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKKyAgICB9CisKKyAgICB2YXIgcmV0
OworCisgICAgaWYgKHRoaXNbTkFNRV9LRVldKSB7CisgICAgICByZXQgPSB0aGlzW05BTUVfS0VZ
XTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuX3RvU3RyaW5nKSB7CisgICAgICByZXQgPSB0aGlzLl90
b1N0cmluZzsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHN0ciA9IHN1cGVyQ2xhc3NTdHJpbmco
dGhpcyk7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIHJldCA9ICcoc3ViY2xhc3Mgb2YgJyAr
IHN0ciArICcpJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9ICcodW5rbm93biBtaXhp
biknOworICAgICAgfQorICAgICAgdGhpcy50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOwor
ICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzQWxsTmFt
ZXNwYWNlcygpIHsKKyAgICB2YXIgdW5wcm9jZXNzZWROYW1lc3BhY2VzID0gIU5hbWVzcGFjZS5Q
Uk9DRVNTRUQ7CisgICAgdmFyIHVucHJvY2Vzc2VkTWl4aW5zID0gX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuYW55VW5wcm9jZXNzZWRNaXhpbnM7CisKKyAgICBpZiAodW5wcm9jZXNzZWROYW1lc3Bh
Y2VzKSB7CisgICAgICBmaW5kTmFtZXNwYWNlcygpOworICAgICAgTmFtZXNwYWNlLlBST0NFU1NF
RCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcyB8fCB1bnBy
b2Nlc3NlZE1peGlucykgeworICAgICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1lc3BhY2UuTkFNRVNQ
QUNFUzsKKyAgICAgIHZhciBuYW1lc3BhY2U7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0g
bmFtZXNwYWNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgbmFtZXNwYWNlID0gbmFt
ZXNwYWNlc1tpXTsKKyAgICAgICAgcHJvY2Vzc05hbWVzcGFjZShbbmFtZXNwYWNlLnRvU3RyaW5n
KCldLCBuYW1lc3BhY2UsIHt9KTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuYW55VW5wcm9jZXNzZWRNaXhpbnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBtYWtlVG9TdHJpbmcocmV0KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiByZXQ7CisgICAgfTsKKyAgfQorCisgIF9lbWJlck1ldGFsTWl4aW4uTWl4aW4ucHJv
dG90eXBlLnRvU3RyaW5nID0gY2xhc3NUb1N0cmluZzsgLy8gRVM2VE9ETzogYWx0ZXJpbmcgaW1w
b3J0ZWQgb2JqZWN0cy4gU0JCLgorCisgIGV4cG9ydHMuZGVmYXVsdCA9IE5hbWVzcGFjZTsKK30p
OworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9uYXRpdmVfYXJyYXknLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9yZXBsYWNlJywgJ2VtYmVyLW1ldGFs
L3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1ydW50aW1lL21peGlu
cy9hcnJheScsICdlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxlX2FycmF5JywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL29ic2VydmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29weWFibGUn
LCAnZW1iZXItcnVudGltZS9taXhpbnMvZnJlZXphYmxlJywgJ2VtYmVyLXJ1bnRpbWUvY29weSdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbFJlcGxhY2Us
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1l
TWl4aW5zQXJyYXksIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJSdW50
aW1lTWl4aW5zT2JzZXJ2YWJsZSwgX2VtYmVyUnVudGltZU1peGluc0NvcHlhYmxlLCBfZW1iZXJS
dW50aW1lTWl4aW5zRnJlZXphYmxlLCBfZW1iZXJSdW50aW1lQ29weSkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLy8gQWRkIEVtYmVyLkFycmF5IHRvIEFycmF5LnByb3RvdHlwZS4gUmVtb3Zl
IG1ldGhvZHMgd2l0aCBuYXRpdmUKKyAgLy8gaW1wbGVtZW50YXRpb25zIGFuZCBzdXBwbHkgc29t
ZSBtb3JlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBnZW5lcmljIG1ldGhvZHMKKyAgLy8gYmVjYXVz
ZSB0aGV5IGFyZSBzbyBjb21tb24uCisKKyAgLyoqCisgICAgVGhlIE5hdGl2ZUFycmF5IG1peGlu
IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCB0byBtYWtlIHRoZSBuYXRpdmUKKyAgICBB
cnJheSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJheSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQg
QVBJcy4gVW5sZXNzIHlvdQorICAgIGhhdmUgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvciBg
RW1iZXIuRVhURU5EX1BST1RPVFlQRVMuQXJyYXlgIHNldCB0bworICAgIGZhbHNlLCB0aGlzIHdp
bGwgYmUgYXBwbGllZCBhdXRvbWF0aWNhbGx5LiBPdGhlcndpc2UgeW91IGNhbiBhcHBseSB0aGUg
bWl4aW4KKyAgICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVtYmVyLk5hdGl2ZUFycmF5LmFwcGx5
KEFycmF5LnByb3RvdHlwZSlgLgorICAKKyAgICBAY2xhc3MgTmF0aXZlQXJyYXkKKyAgICBAbmFt
ZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuTXV0YWJsZUFycmF5CisgICAgQHVzZXMgRW1i
ZXIuT2JzZXJ2YWJsZQorICAgIEB1c2VzIEVtYmVyLkNvcHlhYmxlCisgICAgQHB1YmxpYworICAq
LworICB2YXIgTmF0aXZlQXJyYXkgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShfZW1i
ZXJSdW50aW1lTWl4aW5zTXV0YWJsZV9hcnJheS5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5z
T2JzZXJ2YWJsZS5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdCwg
eworCisgICAgLy8gYmVjYXVzZSBsZW5ndGggaXMgYSBidWlsdC1pbiBwcm9wZXJ0eSB3ZSBuZWVk
IHRvIGtub3cgdG8ganVzdCBnZXQgdGhlCisgICAgLy8gb3JpZ2luYWwgcHJvcGVydHkuCisgICAg
Z2V0OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgeworICAg
ICAgICByZXR1cm4gdGhpcy5sZW5ndGg7CisgICAgICB9IGVsc2UgaWYgKCdudW1iZXInID09PSB0
eXBlb2Yga2V5KSB7CisgICAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoa2V5KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAg
b2JqZWN0QXQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVybiB0aGlzW2lkeF07CisgICAg
fSwKKworICAgIC8vIHByaW1pdGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KKyAgICByZXBsYWNlOiBm
dW5jdGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIGlmICh0aGlzLmlzRnJvemVuKSB7
CisgICAgICAgIHRocm93IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUuRlJPWkVOX0VSUk9S
OworICAgICAgfQorCisgICAgICAvLyBpZiB3ZSByZXBsYWNlZCBleGFjdGx5IHRoZSBzYW1lIG51
bWJlciBvZiBpdGVtcywgdGhlbiBwYXNzIG9ubHkgdGhlCisgICAgICAvLyByZXBsYWNlZCByYW5n
ZS4gT3RoZXJ3aXNlLCBwYXNzIHRoZSBmdWxsIHJlbWFpbmluZyBhcnJheSBsZW5ndGgKKyAgICAg
IC8vIHNpbmNlIGV2ZXJ5dGhpbmcgaGFzIHNoaWZ0ZWQKKyAgICAgIHZhciBsZW4gPSBvYmplY3Rz
ID8gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iamVjdHMsICdsZW5ndGgnKSA6IDA7Cisg
ICAgICB0aGlzLmFycmF5Q29udGVudFdpbGxDaGFuZ2UoaWR4LCBhbXQsIGxlbik7CisKKyAgICAg
IGlmIChsZW4gPT09IDApIHsKKyAgICAgICAgdGhpcy5zcGxpY2UoaWR4LCBhbXQpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgX2VtYmVyTWV0YWxSZXBsYWNlLl9yZXBsYWNlKHRoaXMsIGlkeCwg
YW10LCBvYmplY3RzKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFu
Z2UoaWR4LCBhbXQsIGxlbik7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8g
SWYgeW91IGFzayBmb3IgYW4gdW5rbm93biBwcm9wZXJ0eSwgdGhlbiB0cnkgdG8gY29sbGVjdCB0
aGUgdmFsdWUKKyAgICAvLyBmcm9tIG1lbWJlciBpdGVtcy4KKyAgICB1bmtub3duUHJvcGVydHk6
IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICB2YXIgcmV0OyAvLyA9IHRoaXMucmVkdWNl
ZFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYg
cmV0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgcmV0ID0gdGhpc1trZXldID0gdmFsdWU7Cisg
ICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICBpbmRleE9mOiBBcnJheS5w
cm90b3R5cGUuaW5kZXhPZiwKKyAgICBsYXN0SW5kZXhPZjogQXJyYXkucHJvdG90eXBlLmxhc3RJ
bmRleE9mLAorCisgICAgY29weTogZnVuY3Rpb24gKGRlZXApIHsKKyAgICAgIGlmIChkZWVwKSB7
CisgICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICAgIHJl
dHVybiBfZW1iZXJSdW50aW1lQ29weS5kZWZhdWx0KGl0ZW0sIHRydWUpOworICAgICAgICB9KTsK
KyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoKTsKKyAgICB9CisgIH0pOworCisg
IC8vIFJlbW92ZSBhbnkgbWV0aG9kcyBpbXBsZW1lbnRlZCBuYXRpdmVseSBzbyB3ZSBkb24ndCBv
dmVycmlkZSB0aGVtCisgIHZhciBpZ25vcmUgPSBbJ2xlbmd0aCddOworICBOYXRpdmVBcnJheS5r
ZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkgeworICAgIGlmIChBcnJheS5wcm90
b3R5cGVbbWV0aG9kTmFtZV0pIHsKKyAgICAgIGlnbm9yZS5wdXNoKG1ldGhvZE5hbWUpOworICAg
IH0KKyAgfSk7CisKKyAgZXhwb3J0cy5OYXRpdmVBcnJheSAvLyBUT0RPOiBvbmx5IHVzZSBkZWZh
dWx0IGV4cG9ydAorICAgPSBOYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHko
TmF0aXZlQXJyYXksIGlnbm9yZSk7CisKKyAgLyoqCisgICAgQ3JlYXRlcyBhbiBgRW1iZXIuTmF0
aXZlQXJyYXlgIGZyb20gYW4gQXJyYXkgbGlrZSBvYmplY3QuCisgICAgRG9lcyBub3QgbW9kaWZ5
IHRoZSBvcmlnaW5hbCBvYmplY3QuIEVtYmVyLkEgaXMgbm90IG5lZWRlZCBpZgorICAgIGBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFU2AgaXMgYHRydWVgICh0aGUgZGVmYXVsdCB2YWx1ZSkuIEhvd2V2
ZXIsCisgICAgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIEVtYmVyLkEgd2hlbiBjcmVh
dGluZyBhZGRvbnMgZm9yCisgICAgZW1iZXIgb3Igd2hlbiB5b3UgY2FuIG5vdCBndWFyYW50ZWUg
dGhhdCBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgCisgICAgd2lsbCBiZSBgdHJ1ZWAuCisgIAor
ICAgIEV4YW1wbGUKKyAgCisgICAgYGBganMKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21w
b25lbnQuZXh0ZW5kKHsKKyAgICAgIHRhZ05hbWU6ICd1bCcsCisgICAgICBjbGFzc05hbWVzOiBb
J3BhZ2luYXRpb24nXSwKKyAgCisgICAgICBpbml0KCkgeworICAgICAgICB0aGlzLl9zdXBlcigu
Li5hcmd1bWVudHMpOworICAKKyAgICAgICAgaWYgKCF0aGlzLmdldCgnY29udGVudCcpKSB7Cisg
ICAgICAgICAgdGhpcy5zZXQoJ2NvbnRlbnQnLCBFbWJlci5BKCkpOworICAgICAgICB9CisgICAg
ICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgQQorICAgIEBmb3IgRW1iZXIK
KyAgICBAcmV0dXJuIHtFbWJlci5OYXRpdmVBcnJheX0KKyAgICBAcHVibGljCisgICovCisgIHZh
ciBBOworCisgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUyA9
PT0gdHJ1ZSB8fCBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy5BcnJh
eSkgeworICAgIE5hdGl2ZUFycmF5LmFwcGx5KEFycmF5LnByb3RvdHlwZSk7CisgICAgZXhwb3J0
cy4gLy8gRVM2VE9ETzogU2V0dGluZyBBIG9udG8gdGhlIG9iamVjdCByZXR1cm5lZCBieSBlbWJl
ci1tZXRhbC9jb3JlIHRvIGF2b2lkIGNpcmNsZXMKKyAgICBBID0gQSA9IGZ1bmN0aW9uIChhcnIp
IHsKKyAgICAgIHJldHVybiBhcnIgfHwgW107CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBleHBv
cnRzLkEgPSBBID0gZnVuY3Rpb24gKGFycikgeworICAgICAgaWYgKCFhcnIpIHsKKyAgICAgICAg
YXJyID0gW107CisgICAgICB9CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZU1peGluc0FycmF5
LmRlZmF1bHQuZGV0ZWN0KGFycikgPyBhcnIgOiBOYXRpdmVBcnJheS5hcHBseShhcnIpOworICAg
IH07CisgIH0KKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5BID0gQTtleHBvcnRzLkEgPSBB
OworICBleHBvcnRzLk5hdGl2ZUFycmF5ID0gTmF0aXZlQXJyYXk7CisgIGV4cG9ydHMuZGVmYXVs
dCA9IE5hdGl2ZUFycmF5OworfSk7CisvLyBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUworZW5pZmVk
KCdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGlt
ZS9zeXN0ZW0vY29yZV9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMvb2JzZXJ2YWJsZSdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1i
ZXJSdW50aW1lTWl4aW5zT2JzZXJ2YWJsZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoq
CisgICAgYEVtYmVyLk9iamVjdGAgaXMgdGhlIG1haW4gYmFzZSBjbGFzcyBmb3IgYWxsIEVtYmVy
IG9iamVjdHMuIEl0IGlzIGEgc3ViY2xhc3MKKyAgICBvZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0
aCB0aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFwcGxpZWQuIEZvciBkZXRhaWxzLAorICAg
IHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBvZiB0aGVzZS4KKyAgCisgICAgQGNsYXNz
IE9iamVjdAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5Db3JlT2Jq
ZWN0CisgICAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFy
IEVtYmVyT2JqZWN0ID0gX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LmRlZmF1bHQuZXh0
ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNPYnNlcnZhYmxlLmRlZmF1bHQpOworICBFbWJlck9iamVj
dC50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gJ0VtYmVyLk9iamVjdCc7Cisg
IH07CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW1iZXJPYmplY3Q7Cit9KTsKK2VuaWZlZCgnZW1i
ZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0X3Byb3h5JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRp
bWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50aW1lL21peGlucy8tcHJveHknXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhp
bnNQcm94eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgYEVtYmVyLk9iamVjdFBy
b3h5YCBmb3J3YXJkcyBhbGwgcHJvcGVydGllcyBub3QgZGVmaW5lZCBieSB0aGUgcHJveHkgaXRz
ZWxmCisgICAgdG8gYSBwcm94aWVkIGBjb250ZW50YCBvYmplY3QuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBvYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIG5hbWU6ICdG
b28nCisgICAgfSk7CisgIAorICAgIHByb3h5ID0gRW1iZXIuT2JqZWN0UHJveHkuY3JlYXRlKHsK
KyAgICAgIGNvbnRlbnQ6IG9iamVjdAorICAgIH0pOworICAKKyAgICAvLyBBY2Nlc3MgYW5kIGNo
YW5nZSBleGlzdGluZyBwcm9wZXJ0aWVzCisgICAgcHJveHkuZ2V0KCduYW1lJykgICAgICAgICAg
Ly8gJ0ZvbycKKyAgICBwcm94eS5zZXQoJ25hbWUnLCAnQmFyJyk7CisgICAgb2JqZWN0LmdldCgn
bmFtZScpICAgICAgICAgLy8gJ0JhcicKKyAgCisgICAgLy8gQ3JlYXRlIG5ldyAnZGVzY3JpcHRp
b24nIHByb3BlcnR5IG9uIGBvYmplY3RgCisgICAgcHJveHkuc2V0KCdkZXNjcmlwdGlvbicsICdG
b28gaXMgYSB3aGl6Ym9vIGJheicpOworICAgIG9iamVjdC5nZXQoJ2Rlc2NyaXB0aW9uJykgIC8v
ICdGb28gaXMgYSB3aGl6Ym9vIGJheicKKyAgICBgYGAKKyAgCisgICAgV2hpbGUgYGNvbnRlbnRg
IGlzIHVuc2V0LCBzZXR0aW5nIGEgcHJvcGVydHkgdG8gYmUgZGVsZWdhdGVkIHdpbGwgdGhyb3cg
YW4KKyAgICBFcnJvci4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHByb3h5ID0gRW1iZXIu
T2JqZWN0UHJveHkuY3JlYXRlKHsKKyAgICAgIGNvbnRlbnQ6IG51bGwsCisgICAgICBmbGFnOiBu
dWxsCisgICAgfSk7CisgICAgcHJveHkuc2V0KCdmbGFnJywgdHJ1ZSk7CisgICAgcHJveHkuZ2V0
KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQorICAgIHByb3h5LmdldCgnZm9vJyk7ICAgICAgICAg
IC8vIHVuZGVmaW5lZAorICAgIHByb3h5LnNldCgnZm9vJywgJ2RhdGEnKTsgIC8vIHRocm93cyBF
cnJvcgorICAgIGBgYAorICAKKyAgICBEZWxlZ2F0ZWQgcHJvcGVydGllcyBjYW4gYmUgYm91bmQg
dG8gYW5kIHdpbGwgY2hhbmdlIHdoZW4gY29udGVudCBpcyB1cGRhdGVkLgorICAKKyAgICBDb21w
dXRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBwcm94eSBpdHNlbGYgY2FuIGRlcGVuZCBvbiBkZWxlZ2F0
ZWQgcHJvcGVydGllcy4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFByb3h5V2l0aENvbXB1
dGVkUHJvcGVydHkgPSBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoeworICAgICAgZnVsbE5hbWU6
IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFt
ZScpLAorICAgICAgICAgICAgbGFzdE5hbWUgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAgICAg
ICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFtZSkgeworICAgICAgICAgIHJldHVybiBmaXJzdE5h
bWUgKyAnICcgKyBsYXN0TmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlyc3ROYW1l
IHx8IGxhc3ROYW1lOworICAgICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykK
KyAgICB9KTsKKyAgCisgICAgcHJveHkgPSBQcm94eVdpdGhDb21wdXRlZFByb3BlcnR5LmNyZWF0
ZSgpOworICAKKyAgICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyB1bmRlZmluZWQKKyAgICBw
cm94eS5zZXQoJ2NvbnRlbnQnLCB7CisgICAgICBmaXJzdE5hbWU6ICdUb20nLCBsYXN0TmFtZTog
J0RhbGUnCisgICAgfSk7IC8vIHRyaWdnZXJzIHByb3BlcnR5IGNoYW5nZSBmb3IgZnVsbE5hbWUg
b24gcHJveHkKKyAgCisgICAgcHJveHkuZ2V0KCdmdWxsTmFtZScpOyAgLy8gJ1RvbSBEYWxlJwor
ICAgIGBgYAorICAKKyAgICBAY2xhc3MgT2JqZWN0UHJveHkKKyAgICBAbmFtZXNwYWNlIEVtYmVy
CisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAgQGV4dGVuZHMgRW1iZXIuX1Byb3h5TWl4
aW4KKyAgICBAcHVibGljCisgICovCisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZChfZW1iZXJSdW50aW1lTWl4aW5zUHJveHkuZGVm
YXVsdCk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsIFsnZXhw
b3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGltZS9pbmpl
Y3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJl
clJ1bnRpbWVJbmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIENyZWF0ZXMg
YSBwcm9wZXJ0eSB0aGF0IGxhemlseSBsb29rcyB1cCBhIHNlcnZpY2UgaW4gdGhlIGNvbnRhaW5l
ci4gVGhlcmUKKyAgICBhcmUgbm8gcmVzdHJpY3Rpb25zIGFzIHRvIHdoYXQgb2JqZWN0cyBhIHNl
cnZpY2UgY2FuIGJlIGluamVjdGVkIGludG8uCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICBhdXRoTWFuYWdlcjogRW1iZXIuaW5qZWN0LnNlcnZpY2UoJ2F1dGgnKSwKKyAg
CisgICAgICBtb2RlbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgnYXV0
aE1hbmFnZXInKS5maW5kQ3VycmVudFVzZXIoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAK
KyAgCisgICAgVGhpcyBleGFtcGxlIHdpbGwgY3JlYXRlIGFuIGBhdXRoTWFuYWdlcmAgcHJvcGVy
dHkgb24gdGhlIGFwcGxpY2F0aW9uIHJvdXRlCisgICAgdGhhdCBsb29rcyB1cCB0aGUgYGF1dGhg
IHNlcnZpY2UgaW4gdGhlIGNvbnRhaW5lciwgbWFraW5nIGl0IGVhc2lseQorICAgIGFjY2Vzc2li
bGUgaW4gdGhlIGBtb2RlbGAgaG9vay4KKyAgCisgICAgQG1ldGhvZCBzZXJ2aWNlCisgICAgQHNp
bmNlIDEuMTAuMAorICAgIEBmb3IgRW1iZXIuaW5qZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgKG9wdGlvbmFsKSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGluamVjdCwgZGVmYXVsdHMgdG8K
KyAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEByZXR1cm4ge0VtYmVyLkluamVj
dGVkUHJvcGVydHl9IGluamVjdGlvbiBkZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYwor
ICAqLworICBfZW1iZXJSdW50aW1lSW5qZWN0LmNyZWF0ZUluamVjdGlvbkhlbHBlcignc2Vydmlj
ZScpOworCisgIC8qKgorICAgIEBjbGFzcyBTZXJ2aWNlCisgICAgQG5hbWVzcGFjZSBFbWJlcgor
ICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBzaW5jZSAxLjEwLjAKKyAgICBAcHVibGlj
CisgICovCisgIHZhciBTZXJ2aWNlID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0
LmV4dGVuZCgpOworCisgIFNlcnZpY2UucmVvcGVuQ2xhc3MoeworICAgIGlzU2VydmljZUZhY3Rv
cnk6IHRydWUKKyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gU2VydmljZTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1iZXItcnVudGltZS91dGlscycsICdl
bWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeScsICdlbWJlci1tZXRhbC9jYWNoZSddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVy
UnVudGltZVV0aWxzLCBfZW1iZXJSdW50aW1lU3RyaW5nX3JlZ2lzdHJ5LCBfZW1iZXJNZXRhbENh
Y2hlKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGlt
ZQorICAqLworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFNUUklOR19EQVNIRVJJWkVfUkVHRVhQ
ID0gL1sgX10vZzsKKworICB2YXIgU1RSSU5HX0RBU0hFUklaRV9DQUNIRSA9IG5ldyBfZW1iZXJN
ZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkgeworICAgIHJldHVybiBkZWNh
bWVsaXplKGtleSkucmVwbGFjZShTVFJJTkdfREFTSEVSSVpFX1JFR0VYUCwgJy0nKTsKKyAgfSk7
CisKKyAgdmFyIFNUUklOR19DQU1FTElaRV9SRUdFWFBfMSA9IC8oXC18XF98XC58XHMpKyguKT8v
ZzsKKyAgdmFyIFNUUklOR19DQU1FTElaRV9SRUdFWFBfMiA9IC8oXnxcLykoW0EtWl0pL2c7CisK
KyAgdmFyIENBTUVMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAw
LCBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtleS5yZXBsYWNlKFNUUklOR19DQU1FTEla
RV9SRUdFWFBfMSwgZnVuY3Rpb24gKG1hdGNoLCBzZXBhcmF0b3IsIGNocikgeworICAgICAgcmV0
dXJuIGNociA/IGNoci50b1VwcGVyQ2FzZSgpIDogJyc7CisgICAgfSkucmVwbGFjZShTVFJJTkdf
Q0FNRUxJWkVfUkVHRVhQXzIsIGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBjaHIpIHsKKyAg
ICAgIHJldHVybiBtYXRjaC50b0xvd2VyQ2FzZSgpOworICAgIH0pOworICB9KTsKKworICB2YXIg
U1RSSU5HX0NMQVNTSUZZX1JFR0VYUF8xID0gL14oXC18XykrKC4pPy87CisgIHZhciBTVFJJTkdf
Q0xBU1NJRllfUkVHRVhQXzIgPSAvKC4pKFwtfFxffFwufFxzKSsoLik/L2c7CisgIHZhciBTVFJJ
TkdfQ0xBU1NJRllfUkVHRVhQXzMgPSAvKF58XC98XC4pKFthLXpdKS9nOworCisgIHZhciBDTEFT
U0lGWV9DQUNIRSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24g
KHN0cikgeworICAgIHZhciByZXBsYWNlMSA9IGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBj
aHIpIHsKKyAgICAgIHJldHVybiBjaHIgPyAnXycgKyBjaHIudG9VcHBlckNhc2UoKSA6ICcnOwor
ICAgIH07CisgICAgdmFyIHJlcGxhY2UyID0gZnVuY3Rpb24gKG1hdGNoLCBpbml0aWFsQ2hhciwg
c2VwYXJhdG9yLCBjaHIpIHsKKyAgICAgIHJldHVybiBpbml0aWFsQ2hhciArIChjaHIgPyBjaHIu
dG9VcHBlckNhc2UoKSA6ICcnKTsKKyAgICB9OworICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgn
LycpOworICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47IGkr
KykgeworICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlKFNUUklOR19DTEFTU0lGWV9S
RUdFWFBfMSwgcmVwbGFjZTEpLnJlcGxhY2UoU1RSSU5HX0NMQVNTSUZZX1JFR0VYUF8yLCByZXBs
YWNlMik7CisgICAgfQorICAgIHJldHVybiBwYXJ0cy5qb2luKCcvJykucmVwbGFjZShTVFJJTkdf
Q0xBU1NJRllfUkVHRVhQXzMsIGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBjaHIpIHsKKyAg
ICAgIHJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpOworICAgIH0pOworICB9KTsKKworICB2YXIg
U1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzEgPSAvKFthLXpcZF0pKFtBLVpdKykvZzsKKyAgdmFy
IFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yID0gL1wtfFxzKy9nOworCisgIHZhciBVTkRFUlND
T1JFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAo
c3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8x
LCAnJDFfJDInKS5yZXBsYWNlKFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yLCAnXycpLnRvTG93
ZXJDYXNlKCk7CisgIH0pOworCisgIHZhciBTVFJJTkdfQ0FQSVRBTElaRV9SRUdFWFAgPSAvKF58
XC8pKFthLXpdKS9nOworCisgIHZhciBDQVBJVEFMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFs
Q2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBs
YWNlKFNUUklOR19DQVBJVEFMSVpFX1JFR0VYUCwgZnVuY3Rpb24gKG1hdGNoLCBzZXBhcmF0b3Is
IGNocikgeworICAgICAgcmV0dXJuIG1hdGNoLnRvVXBwZXJDYXNlKCk7CisgICAgfSk7CisgIH0p
OworCisgIHZhciBTVFJJTkdfREVDQU1FTElaRV9SRUdFWFAgPSAvKFthLXpcZF0pKFtBLVpdKS9n
OworCisgIHZhciBERUNBTUVMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAoc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19E
RUNBTUVMSVpFX1JFR0VYUCwgJyQxXyQyJykudG9Mb3dlckNhc2UoKTsKKyAgfSk7CisKKyAgZnVu
Y3Rpb24gX2ZtdChzdHIsIGZvcm1hdHMpIHsKKyAgICB2YXIgY2FjaGVkRm9ybWF0cyA9IGZvcm1h
dHM7CisKKyAgICBpZiAoIV9lbWJlclJ1bnRpbWVVdGlscy5pc0FycmF5KGNhY2hlZEZvcm1hdHMp
IHx8IGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAgICBjYWNoZWRGb3JtYXRzID0gbmV3IEFy
cmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBh
cmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGNhY2hlZEZvcm1hdHNbaSAt
IDFdID0gYXJndW1lbnRzW2ldOworICAgICAgfQorICAgIH0KKworICAgIC8vIGZpcnN0LCByZXBs
YWNlIGFueSBPUkRFUkVEIHJlcGxhY2VtZW50cy4KKyAgICB2YXIgaWR4ID0gMDsgLy8gdGhlIGN1
cnJlbnQgaW5kZXggZm9yIG5vbi1udW1lcmljYWwgcmVwbGFjZW1lbnRzCisgICAgcmV0dXJuIHN0
ci5yZXBsYWNlKC8lQChbMC05XSspPy9nLCBmdW5jdGlvbiAocywgYXJnSW5kZXgpIHsKKyAgICAg
IGFyZ0luZGV4ID0gYXJnSW5kZXggPyBwYXJzZUludChhcmdJbmRleCwgMTApIC0gMSA6IGlkeCsr
OworICAgICAgcyA9IGNhY2hlZEZvcm1hdHNbYXJnSW5kZXhdOworICAgICAgcmV0dXJuIHMgPT09
IG51bGwgPyAnKG51bGwpJyA6IHMgPT09IHVuZGVmaW5lZCA/ICcnIDogX2VtYmVyTWV0YWxVdGls
cy5pbnNwZWN0KHMpOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gZm10KHN0ciwgZm9ybWF0
cykgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdFbWJlci5TdHJpbmcuZm10IGlz
IGRlcHJlY2F0ZWQsIHVzZSBFUzYgdGVtcGxhdGUgc3RyaW5ncyBpbnN0ZWFkLicsIGZhbHNlLCB7
IGlkOiAnZW1iZXItc3RyaW5nLXV0aWxzLmZtdCcsIHVudGlsOiAnMy4wLjAnLCB1cmw6ICdodHRw
Oi8vYmFiZWxqcy5pby9kb2NzL2xlYXJuLWVzMjAxNS8jdGVtcGxhdGUtc3RyaW5ncycgfSk7Cisg
ICAgcmV0dXJuIF9mbXQuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9CisKKyAgZnVu
Y3Rpb24gbG9jKHN0ciwgZm9ybWF0cykgeworICAgIGlmICghX2VtYmVyUnVudGltZVV0aWxzLmlz
QXJyYXkoZm9ybWF0cykgfHwgYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKyAgICAgIGZvcm1hdHMg
PSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIH0KKworICAg
IHN0ciA9IF9lbWJlclJ1bnRpbWVTdHJpbmdfcmVnaXN0cnkuZ2V0KHN0cikgfHwgc3RyOworICAg
IHJldHVybiBfZm10KHN0ciwgZm9ybWF0cyk7CisgIH0KKworICBmdW5jdGlvbiB3KHN0cikgewor
ICAgIHJldHVybiBzdHIuc3BsaXQoL1xzKy8pOworICB9CisKKyAgZnVuY3Rpb24gZGVjYW1lbGl6
ZShzdHIpIHsKKyAgICByZXR1cm4gREVDQU1FTElaRV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGRhc2hlcml6ZShzdHIpIHsKKyAgICByZXR1cm4gU1RSSU5HX0RBU0hFUklaRV9D
QUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbWVsaXplKHN0cikgeworICAgIHJl
dHVybiBDQU1FTElaRV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNsYXNzaWZ5
KHN0cikgeworICAgIHJldHVybiBDTEFTU0lGWV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHVuZGVyc2NvcmUoc3RyKSB7CisgICAgcmV0dXJuIFVOREVSU0NPUkVfQ0FDSEUuZ2V0
KHN0cik7CisgIH0KKworICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikgeworICAgIHJldHVybiBD
QVBJVEFMSVpFX0NBQ0hFLmdldChzdHIpOworICB9CisKKyAgLyoqCisgICAgRGVmaW5lcyBzdHJp
bmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5nIHN0cmluZyBmb3JtYXR0aW5nIGFuZCBsb2NhbGl6
YXRpb24uCisgICAgVW5sZXNzIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmdgIGlzIGBm
YWxzZWAgdGhlc2UgbWV0aG9kcyB3aWxsIGFsc28gYmUKKyAgICBhZGRlZCB0byB0aGUgYFN0cmlu
Zy5wcm90b3R5cGVgIGFzIHdlbGwuCisgIAorICAgIEBjbGFzcyBTdHJpbmcKKyAgICBAbmFtZXNw
YWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZh
dWx0ID0geworICAgIC8qKgorICAgICAgQXBwbHkgZm9ybWF0dGluZyBvcHRpb25zIHRvIHRoZSBz
dHJpbmcuIFRoaXMgd2lsbCBsb29rIGZvciBvY2N1cnJlbmNlcworICAgICAgb2YgIiVAIiBpbiB5
b3VyIHN0cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggdGhlIGFyZ3VtZW50cyB5b3UgcGFz
cyBpbnRvCisgICAgICB0aGlzIG1ldGhvZC4gSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3Bl
Y2lmaWMgb3JkZXIgb2YgcmVwbGFjZW1lbnQsCisgICAgICB5b3UgY2FuIGFkZCBhIG51bWJlciBh
ZnRlciB0aGUga2V5IGFzIHdlbGwgdG8gaW5kaWNhdGUgd2hpY2ggYXJndW1lbnQKKyAgICAgIHlv
dSB3YW50IHRvIGluc2VydC4KKyAgICAgICBPcmRlcmVkIGluc2VydGlvbnMgYXJlIG1vc3QgdXNl
ZnVsIHdoZW4gYnVpbGRpbmcgbG9jIHN0cmluZ3Mgd2hlcmUgdmFsdWVzCisgICAgICB5b3UgbmVl
ZCB0byBpbnNlcnQgbWF5IGFwcGVhciBpbiBkaWZmZXJlbnQgb3JkZXJzLgorICAgICAgIGBgYGph
dmFzY3JpcHQKKyAgICAgICJIZWxsbyAlQCAlQCIuZm10KCdKb2huJywgJ0RvZScpOyAgICAgLy8g
IkhlbGxvIEpvaG4gRG9lIgorICAgICAgIkhlbGxvICVAMiwgJUAxIi5mbXQoJ0pvaG4nLCAnRG9l
Jyk7ICAvLyAiSGVsbG8gRG9lLCBKb2huIgorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBmbXQK
KyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKKyAgICAgIEBw
YXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBvbGF0
ZSBpbnRvIHN0cmluZy4KKyAgICAgIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIHN0cmluZwor
ICAgICAgQHB1YmxpYworICAgICAgQGRlcHJlY2F0ZWQgVXNlIEVTNiB0ZW1wbGF0ZSBzdHJpbmdz
IGluc3RlYWQ6IGh0dHA6Ly9iYWJlbGpzLmlvL2RvY3MvbGVhcm4tZXMyMDE1LyN0ZW1wbGF0ZS1z
dHJpbmdzCisgICAgKi8KKyAgICBmbXQ6IGZtdCwKKworICAgIC8qKgorICAgICAgRm9ybWF0cyB0
aGUgcGFzc2VkIHN0cmluZywgYnV0IGZpcnN0IGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhlIGxv
Y2FsaXplZAorICAgICAgc3RyaW5ncyBoYXNoLiBUaGlzIGlzIGEgY29udmVuaWVudCB3YXkgdG8g
bG9jYWxpemUgdGV4dC4gU2VlCisgICAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBmb3IgbW9yZSBp
bmZvcm1hdGlvbiBvbiBmb3JtYXR0aW5nLgorICAgICAgIE5vdGUgdGhhdCBpdCBpcyB0cmFkaXRp
b25hbCBidXQgbm90IHJlcXVpcmVkIHRvIHByZWZpeCBsb2NhbGl6ZWQgc3RyaW5nCisgICAgICBr
ZXlzIHdpdGggYW4gdW5kZXJzY29yZSBvciBvdGhlciBjaGFyYWN0ZXIgc28geW91IGNhbiBlYXNp
bHkgaWRlbnRpZnkKKyAgICAgIGxvY2FsaXplZCBzdHJpbmdzLgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIEVtYmVyLlNUUklOR1MgPSB7CisgICAgICAgICdfSGVsbG8gV29ybGQnOiAnQm9u
am91ciBsZSBtb25kZScsCisgICAgICAgICdfSGVsbG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcK
KyAgICAgIH07CisgICAgICAgRW1iZXIuU3RyaW5nLmxvYygiX0hlbGxvIFdvcmxkIik7ICAvLyAn
Qm9uam91ciBsZSBtb25kZSc7CisgICAgICBFbWJlci5TdHJpbmcubG9jKCJfSGVsbG8gJUAgJUAi
LCBbIkpvaG4iLCAiU21pdGgiXSk7ICAvLyAiQm9uam91ciBKb2huIFNtaXRoIjsKKyAgICAgIGBg
YAorICAgICAgIEBtZXRob2QgbG9jCisgICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJp
bmcgdG8gZm9ybWF0CisgICAgICBAcGFyYW0ge0FycmF5fSBmb3JtYXRzIE9wdGlvbmFsIGFycmF5
IG9mIHBhcmFtZXRlcnMgdG8gaW50ZXJwb2xhdGUgaW50byBzdHJpbmcuCisgICAgICBAcmV0dXJu
IHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGxv
YzogbG9jLAorCisgICAgLyoqCisgICAgICBTcGxpdHMgYSBzdHJpbmcgaW50byBzZXBhcmF0ZSB1
bml0cyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKKyAgICAgIGVtcHR5IHN0
cmluZ3MgaW4gdGhlIHByb2Nlc3MuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNw
bGl0IHRoYXQKKyAgICAgIGlzIG1vc3RseSB1c2VmdWwgd2hlbiBhcHBsaWVkIHRvIHRoZSBgU3Ry
aW5nLnByb3RvdHlwZWAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuU3RyaW5n
LncoImFscGhhIGJldGEgZ2FtbWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeworICAgICAgICBj
b25zb2xlLmxvZyhrZXkpOworICAgICAgfSk7CisgICAgICAgLy8gPiBhbHBoYQorICAgICAgLy8g
PiBiZXRhCisgICAgICAvLyA+IGdhbW1hCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHcKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdAorICAgICAgQHJldHVy
biB7QXJyYXl9IGFycmF5IGNvbnRhaW5pbmcgdGhlIHNwbGl0IHN0cmluZ3MKKyAgICAgIEBwdWJs
aWMKKyAgICAqLworICAgIHc6IHcsCisKKyAgICAvKioKKyAgICAgIENvbnZlcnRzIGEgY2FtZWxp
emVkIHN0cmluZyBpbnRvIGFsbCBsb3dlciBjYXNlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy4K
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAnaW5uZXJIVE1MJy5kZWNhbWVsaXplKCk7ICAg
ICAgICAgICAvLyAnaW5uZXJfaHRtbCcKKyAgICAgICdhY3Rpb25fbmFtZScuZGVjYW1lbGl6ZSgp
OyAgICAgICAgLy8gJ2FjdGlvbl9uYW1lJworICAgICAgJ2Nzcy1jbGFzcy1uYW1lJy5kZWNhbWVs
aXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkgZmF2b3JpdGUgaXRlbXMn
LmRlY2FtZWxpemUoKTsgIC8vICdteSBmYXZvcml0ZSBpdGVtcycKKyAgICAgIGBgYAorICAgICAg
IEBtZXRob2QgZGVjYW1lbGl6ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5n
IHRvIGRlY2FtZWxpemUuCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBz
dHJpbmcuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBkZWNhbWVsaXplOiBkZWNhbWVsaXpl
LAorCisgICAgLyoqCisgICAgICBSZXBsYWNlcyB1bmRlcnNjb3Jlcywgc3BhY2VzLCBvciBjYW1l
bENhc2Ugd2l0aCBkYXNoZXMuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgJ2lubmVySFRN
TCcuZGFzaGVyaXplKCk7ICAgICAgICAgIC8vICdpbm5lci1odG1sJworICAgICAgJ2FjdGlvbl9u
YW1lJy5kYXNoZXJpemUoKTsgICAgICAgIC8vICdhY3Rpb24tbmFtZScKKyAgICAgICdjc3MtY2xh
c3MtbmFtZScuZGFzaGVyaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkg
ZmF2b3JpdGUgaXRlbXMnLmRhc2hlcml6ZSgpOyAgLy8gJ215LWZhdm9yaXRlLWl0ZW1zJworICAg
ICAgJ3ByaXZhdGVEb2NzL293bmVySW52b2ljZScuZGFzaGVyaXplKCk7IC8vICdwcml2YXRlLWRv
Y3Mvb3duZXItaW52b2ljZScKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgZGFzaGVyaXplCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZGFzaGVyaXplLgorICAgICAg
QHJldHVybiB7U3RyaW5nfSB0aGUgZGFzaGVyaXplZCBzdHJpbmcuCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBkYXNoZXJpemU6IGRhc2hlcml6ZSwKKworICAgIC8qKgorICAgICAgUmV0dXJu
cyB0aGUgbG93ZXJDYW1lbENhc2UgZm9ybSBvZiBhIHN0cmluZy4KKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAnaW5uZXJIVE1MJy5jYW1lbGl6ZSgpOyAgICAgICAgICAvLyAnaW5uZXJIVE1M
JworICAgICAgJ2FjdGlvbl9uYW1lJy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbk5hbWUn
CisgICAgICAnY3NzLWNsYXNzLW5hbWUnLmNhbWVsaXplKCk7ICAgICAvLyAnY3NzQ2xhc3NOYW1l
JworICAgICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jYW1lbGl6ZSgpOyAgLy8gJ215RmF2b3JpdGVJ
dGVtcycKKyAgICAgICdNeSBGYXZvcml0ZSBJdGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZhdm9y
aXRlSXRlbXMnCisgICAgICAncHJpdmF0ZS1kb2NzL293bmVyLWludm9pY2UnLmNhbWVsaXplKCk7
IC8vICdwcml2YXRlRG9jcy9vd25lckludm9pY2UnCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGNhbWVsaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FtZWxp
emUuCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjYW1lbGl6ZWQgc3RyaW5nLgorICAgICAg
QHB1YmxpYworICAgICovCisgICAgY2FtZWxpemU6IGNhbWVsaXplLAorCisgICAgLyoqCisgICAg
ICBSZXR1cm5zIHRoZSBVcHBlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgICdpbm5lckhUTUwnLmNsYXNzaWZ5KCk7ICAgICAgICAgIC8vICdJ
bm5lckhUTUwnCisgICAgICAnYWN0aW9uX25hbWUnLmNsYXNzaWZ5KCk7ICAgICAgICAvLyAnQWN0
aW9uTmFtZScKKyAgICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3NpZnkoKTsgICAgIC8vICdDc3ND
bGFzc05hbWUnCisgICAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNsYXNzaWZ5KCk7ICAvLyAnTXlG
YXZvcml0ZUl0ZW1zJworICAgICAgJ3ByaXZhdGUtZG9jcy9vd25lci1pbnZvaWNlJy5jbGFzc2lm
eSgpOyAvLyAnUHJpdmF0ZURvY3MvT3duZXJJbnZvaWNlJworICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBjbGFzc2lmeQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGNs
YXNzaWZ5CisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lmaWVkIHN0cmluZworICAg
ICAgQHB1YmxpYworICAgICovCisgICAgY2xhc3NpZnk6IGNsYXNzaWZ5LAorCisgICAgLyoqCisg
ICAgICBNb3JlIGdlbmVyYWwgdGhhbiBkZWNhbWVsaXplLiBSZXR1cm5zIHRoZSBsb3dlclxfY2Fz
ZVxfYW5kXF91bmRlcnNjb3JlZAorICAgICAgZm9ybSBvZiBhIHN0cmluZy4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICAnaW5uZXJIVE1MJy51bmRlcnNjb3JlKCk7ICAgICAgICAgIC8vICdp
bm5lcl9odG1sJworICAgICAgJ2FjdGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAgICAvLyAn
YWN0aW9uX25hbWUnCisgICAgICAnY3NzLWNsYXNzLW5hbWUnLnVuZGVyc2NvcmUoKTsgICAgIC8v
ICdjc3NfY2xhc3NfbmFtZScKKyAgICAgICdteSBmYXZvcml0ZSBpdGVtcycudW5kZXJzY29yZSgp
OyAgLy8gJ215X2Zhdm9yaXRlX2l0ZW1zJworICAgICAgJ3ByaXZhdGVEb2NzL293bmVySW52b2lj
ZScudW5kZXJzY29yZSgpOyAvLyAncHJpdmF0ZV9kb2NzL293bmVyX2ludm9pY2UnCisgICAgICBg
YGAKKyAgICAgICBAbWV0aG9kIHVuZGVyc2NvcmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIg
VGhlIHN0cmluZyB0byB1bmRlcnNjb3JlLgorICAgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgdW5k
ZXJzY29yZWQgc3RyaW5nLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgdW5kZXJzY29yZTog
dW5kZXJzY29yZSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQgZm9y
bSBvZiBhIHN0cmluZworICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICdpbm5lckhUTUwnLmNh
cGl0YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhUTUwnCisgICAgICAnYWN0aW9uX25hbWUnLmNh
cGl0YWxpemUoKSAgICAgICAvLyAnQWN0aW9uX25hbWUnCisgICAgICAnY3NzLWNsYXNzLW5hbWUn
LmNhcGl0YWxpemUoKSAgICAvLyAnQ3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkgZmF2b3JpdGUg
aXRlbXMnLmNhcGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUgaXRlbXMnCisgICAgICAncHJpdmF0
ZURvY3Mvb3duZXJJbnZvaWNlJy5jYXBpdGFsaXplKCk7IC8vICdQcml2YXRlRG9jcy9vd25lcklu
dm9pY2UnCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGNhcGl0YWxpemUKKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLgorICAgICAgQHJldHVybiB7
U3RyaW5nfSBUaGUgY2FwaXRhbGl6ZWQgc3RyaW5nLgorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgY2FwaXRhbGl6ZTogY2FwaXRhbGl6ZQorICB9OworICBleHBvcnRzLmZtdCA9IGZtdDsKKyAg
ZXhwb3J0cy5sb2MgPSBsb2M7CisgIGV4cG9ydHMudyA9IHc7CisgIGV4cG9ydHMuZGVjYW1lbGl6
ZSA9IGRlY2FtZWxpemU7CisgIGV4cG9ydHMuZGFzaGVyaXplID0gZGFzaGVyaXplOworICBleHBv
cnRzLmNhbWVsaXplID0gY2FtZWxpemU7CisgIGV4cG9ydHMuY2xhc3NpZnkgPSBjbGFzc2lmeTsK
KyAgZXhwb3J0cy51bmRlcnNjb3JlID0gdW5kZXJzY29yZTsKKyAgZXhwb3J0cy5jYXBpdGFsaXpl
ID0gY2FwaXRhbGl6ZTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL3V0aWxzJywgWydleHBv
cnRzJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVt
L29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZU1peGluc0FycmF5LCBf
ZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmlzQXJyYXkgPSBpc0FycmF5OworICBleHBvcnRzLnR5cGVPZiA9IHR5cGVPZjsKKworICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIFRZUElORyAmIEFS
UkFZIE1FU1NBR0lORworICAvLworICB2YXIgVFlQRV9NQVAgPSB7CisgICAgJ1tvYmplY3QgQm9v
bGVhbl0nOiAnYm9vbGVhbicsCisgICAgJ1tvYmplY3QgTnVtYmVyXSc6ICdudW1iZXInLAorICAg
ICdbb2JqZWN0IFN0cmluZ10nOiAnc3RyaW5nJywKKyAgICAnW29iamVjdCBGdW5jdGlvbl0nOiAn
ZnVuY3Rpb24nLAorICAgICdbb2JqZWN0IEFycmF5XSc6ICdhcnJheScsCisgICAgJ1tvYmplY3Qg
RGF0ZV0nOiAnZGF0ZScsCisgICAgJ1tvYmplY3QgUmVnRXhwXSc6ICdyZWdleHAnLAorICAgICdb
b2JqZWN0IE9iamVjdF0nOiAnb2JqZWN0JworICB9OworCisgIHZhciB0b1N0cmluZyA9IE9iamVj
dC5wcm90b3R5cGUudG9TdHJpbmc7CisKKyAgLyoqCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBw
YXNzZWQgb2JqZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UuCisgIAorICAgIE9iamVjdHMg
YXJlIGNvbnNpZGVyZWQgQXJyYXktbGlrZSBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1
ZToKKyAgCisgICAgICAtIHRoZSBvYmplY3QgaXMgYSBuYXRpdmUgQXJyYXkKKyAgICAgIC0gdGhl
IG9iamVjdCBoYXMgYW4gb2JqZWN0QXQgcHJvcGVydHkKKyAgICAgIC0gdGhlIG9iamVjdCBpcyBh
biBPYmplY3QsIGFuZCBoYXMgYSBsZW5ndGggcHJvcGVydHkKKyAgCisgICAgVW5saWtlIGBFbWJl
ci50eXBlT2ZgIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBldmVuIGlmIHRoZSBwYXNzZWQgb2Jq
ZWN0IGlzCisgICAgbm90IGZvcm1hbGx5IGFuIGFycmF5IGJ1dCBhcHBlYXJzIHRvIGJlIGFycmF5
LWxpa2UgKGkuZS4gaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgKQorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuaXNBcnJheSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNBcnJheShbXSk7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUKKyAgICBFbWJlci5pc0FycmF5KEVtYmVy
LkFycmF5UHJveHkuY3JlYXRlKHsgY29udGVudDogW10gfSkpOyAgLy8gdHJ1ZQorICAgIGBgYAor
ICAKKyAgICBAbWV0aG9kIGlzQXJyYXkKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgb2JqZWN0IHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlm
IHRoZSBwYXNzZWQgb2JqZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UKKyAgICBAcHVibGlj
CisgICovCisKKyAgZnVuY3Rpb24gaXNBcnJheShvYmopIHsKKyAgICBpZiAoIW9iaiB8fCBvYmou
c2V0SW50ZXJ2YWwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKEFycmF5
LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChfZW1i
ZXJSdW50aW1lTWl4aW5zQXJyYXkuZGVmYXVsdC5kZXRlY3Qob2JqKSkgeworICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgdmFyIHR5cGUgPSB0eXBlT2Yob2JqKTsKKyAgICBpZiAoJ2Fy
cmF5JyA9PT0gdHlwZSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvYmou
bGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgJ29iamVjdCcgPT09IHR5cGUpIHsKKyAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICBSZXR1
cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIG9iamVjdC4KKyAgCisgICAgVXNl
IHRoaXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBlIG9m
IGFuIGl0ZW0uCisgICAgSXQgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFjcm9zcyBhbGwg
YnJvd3NlcnMgYW5kIGluY2x1ZGVzIGEgYml0CisgICAgbW9yZSBkZXRhaWwuIEhlcmUgaXMgd2hh
dCB3aWxsIGJlIHJldHVybmVkOgorICAKKyAgICAgICAgfCBSZXR1cm4gVmFsdWUgIHwgTWVhbmlu
ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAg
IHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tfAorICAgICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0
aXZlIG9yIFN0cmluZyBvYmplY3QuICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAnbnVt
YmVyJyAgICAgIHwgTnVtYmVyIHByaW1pdGl2ZSBvciBOdW1iZXIgb2JqZWN0LiAgICAgICAgICAg
ICAgICAgICB8CisgICAgICAgIHwgJ2Jvb2xlYW4nICAgICB8IEJvb2xlYW4gcHJpbWl0aXZlIG9y
IEJvb2xlYW4gb2JqZWN0LiAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICdudWxsJyAgICAg
ICAgfCBOdWxsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHwKKyAgICAgICAgfCAndW5kZWZpbmVkJyAgIHwgVW5kZWZpbmVkIHZhbHVlICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgJ2Z1bmN0aW9uJyAgICB8IEEg
ZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAg
ICAgICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAncmVnZXhwJyAgICAgIHwgQW4gaW5zdGFu
Y2Ugb2YgUmVnRXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwg
J2RhdGUnICAgICAgICB8IEFuIGluc3RhbmNlIG9mIERhdGUgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAorICAgICAgICB8ICdjbGFzcycgICAgICAgfCBBbiBFbWJlciBjbGFzcyAo
Y3JlYXRlZCB1c2luZyBFbWJlci5PYmplY3QuZXh0ZW5kKCkpIHwKKyAgICAgICAgfCAnaW5zdGFu
Y2UnICAgIHwgQW4gRW1iZXIgb2JqZWN0IGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisgICAgICAgIHwgJ2Vycm9yJyAgICAgICB8IEFuIGluc3RhbmNlIG9mIHRoZSBFcnJv
ciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICdvYmplY3QnICAgICAg
fCBBIEphdmFTY3JpcHQgb2JqZWN0IG5vdCBpbmhlcml0aW5nIGZyb20gRW1iZXIuT2JqZWN0IHwK
KyAgCisgICAgRXhhbXBsZXM6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci50eXBl
T2YoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCisgICAgRW1iZXIudHlw
ZU9mKG51bGwpOyAgICAgICAgICAgICAgICAgICAvLyAnbnVsbCcKKyAgICBFbWJlci50eXBlT2Yo
dW5kZWZpbmVkKTsgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCisgICAgRW1iZXIudHlwZU9m
KCdtaWNoYWVsJyk7ICAgICAgICAgICAgICAvLyAnc3RyaW5nJworICAgIEVtYmVyLnR5cGVPZihu
ZXcgU3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmluZycKKyAgICBFbWJlci50eXBlT2YoMTAx
KTsgICAgICAgICAgICAgICAgICAgIC8vICdudW1iZXInCisgICAgRW1iZXIudHlwZU9mKG5ldyBO
dW1iZXIoMTAxKSk7ICAgICAgICAvLyAnbnVtYmVyJworICAgIEVtYmVyLnR5cGVPZih0cnVlKTsg
ICAgICAgICAgICAgICAgICAgLy8gJ2Jvb2xlYW4nCisgICAgRW1iZXIudHlwZU9mKG5ldyBCb29s
ZWFuKHRydWUpKTsgICAgICAvLyAnYm9vbGVhbicKKyAgICBFbWJlci50eXBlT2YoRW1iZXIubWFr
ZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKKyAgICBFbWJlci50eXBlT2YoWzEsIDIsIDkw
XSk7ICAgICAgICAgICAgIC8vICdhcnJheScKKyAgICBFbWJlci50eXBlT2YoL2FiYy8pOyAgICAg
ICAgICAgICAgICAgIC8vICdyZWdleHAnCisgICAgRW1iZXIudHlwZU9mKG5ldyBEYXRlKCkpOyAg
ICAgICAgICAgICAvLyAnZGF0ZScKKyAgICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmV4dGVu
ZCgpKTsgIC8vICdjbGFzcycKKyAgICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmNyZWF0ZSgp
KTsgIC8vICdpbnN0YW5jZScKKyAgICBFbWJlci50eXBlT2YobmV3IEVycm9yKCd0ZWFtb2NpbCcp
KTsgIC8vICdlcnJvcicKKyAgCisgICAgLy8gJ25vcm1hbCcgSmF2YVNjcmlwdCBvYmplY3QKKyAg
ICBFbWJlci50eXBlT2YoeyBhOiAnYicgfSk7ICAgICAgICAgICAgIC8vICdvYmplY3QnCisgICAg
YGBgCisgIAorICAgIEBtZXRob2QgdHlwZU9mCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7
T2JqZWN0fSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrCisgICAgQHJldHVybiB7U3RyaW5nfSB0aGUg
dHlwZQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiB0eXBlT2YoaXRlbSkgeworICAg
IGlmIChpdGVtID09PSBudWxsKSB7CisgICAgICByZXR1cm4gJ251bGwnOworICAgIH0KKyAgICBp
ZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7CisgICAg
fQorICAgIHZhciByZXQgPSBUWVBFX01BUFt0b1N0cmluZy5jYWxsKGl0ZW0pXSB8fCAnb2JqZWN0
JzsKKworICAgIGlmIChyZXQgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGlmIChfZW1iZXJSdW50
aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZGV0ZWN0KGl0ZW0pKSB7CisgICAgICAgIHJldCA9ICdj
bGFzcyc7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT09ICdvYmplY3QnKSB7CisgICAg
ICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgIHJldCA9ICdlcnJvcic7Cisg
ICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0
LmRlZmF1bHQpIHsKKyAgICAgICAgcmV0ID0gJ2luc3RhbmNlJzsKKyAgICAgIH0gZWxzZSBpZiAo
aXRlbSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgcmV0ID0gJ2RhdGUnOworICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9jb21wYXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9jb21wYXQvcHJlY29tcGlsZScsICdlbWJlci10ZW1wbGF0ZS1j
b21waWxlci9zeXN0ZW0vY29tcGlsZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0v
dGVtcGxhdGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyVGVt
cGxhdGVDb21waWxlckNvbXBhdFByZWNvbXBpbGUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0
ZW1Db21waWxlLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBFbWJlckhhbmRsZWJhcnMgPSBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5IYW5kbGViYXJzID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFuZGxlYmFycyB8fCB7
fTsKKworICBFbWJlckhhbmRsZWJhcnMucHJlY29tcGlsZSA9IF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJDb21wYXRQcmVjb21waWxlLmRlZmF1bHQ7CisgIEVtYmVySGFuZGxlYmFycy5jb21waWxlID0g
X2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGUuZGVmYXVsdDsKKyAgRW1iZXJIYW5k
bGViYXJzLnRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBsYXRlLmRl
ZmF1bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvY29tcGF0L3ByZWNv
bXBpbGUnLCBbJ2V4cG9ydHMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9z
eXN0ZW0vY29tcGlsZV9vcHRpb25zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWlyZSwgX2Vt
YmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0aW9ucykgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisg
ICd1c2Ugc3RyaWN0JzsKKworICB2YXIgY29tcGlsZSwgY29tcGlsZVNwZWM7CisKKyAgZXhwb3J0
cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHN0cmluZykgeworICAgIGlmICgoIWNvbXBpbGUgfHwgIWNv
bXBpbGVTcGVjKSAmJiBfcmVxdWlyZS5oYXMoJ2h0bWxiYXJzLWNvbXBpbGVyL2NvbXBpbGVyJykp
IHsKKyAgICAgIHZhciBDb21waWxlciA9IF9yZXF1aXJlLmRlZmF1bHQoJ2h0bWxiYXJzLWNvbXBp
bGVyL2NvbXBpbGVyJyk7CisKKyAgICAgIGNvbXBpbGUgPSBDb21waWxlci5jb21waWxlOworICAg
ICAgY29tcGlsZVNwZWMgPSBDb21waWxlci5jb21waWxlU3BlYzsKKyAgICB9CisKKyAgICBpZiAo
IWNvbXBpbGUgfHwgIWNvbXBpbGVTcGVjKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5v
dCBjYWxsIGBwcmVjb21waWxlYCB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBjb21waWxlciBsb2FkZWQu
IFBsZWFzZSBsb2FkIGBlbWJlci10ZW1wbGF0ZS1jb21waWxlci5qc2AgcHJpb3IgdG8gY2FsbGlu
ZyBgcHJlY29tcGlsZWAuJyk7CisgICAgfQorCisgICAgdmFyIGFzT2JqZWN0ID0gYXJndW1lbnRz
WzFdID09PSB1bmRlZmluZWQgPyB0cnVlIDogYXJndW1lbnRzWzFdOworICAgIHZhciBjb21waWxl
RnVuYyA9IGFzT2JqZWN0ID8gY29tcGlsZSA6IGNvbXBpbGVTcGVjOworCisgICAgcmV0dXJuIGNv
bXBpbGVGdW5jKHN0cmluZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0
aW9ucy5kZWZhdWx0KCkpOworICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBp
bGVyL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsJywgJ2VtYmVyLXRlbXBsYXRlLWNv
bXBpbGVyL3N5c3RlbS9wcmVjb21waWxlJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3Rl
bS9jb21waWxlJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZScsICdl
bWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVy
L3BsdWdpbnMvdHJhbnNmb3JtLW9sZC1iaW5kaW5nLXN5bnRheCcsICdlbWJlci10ZW1wbGF0ZS1j
b21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1vbGQtY2xhc3MtYmluZGluZy1zeW50YXgnLCAnZW1i
ZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0taXRlbS1jbGFzcycsICdlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1jbG9zdXJlLWNvbXBvbmVudC1h
dHRycy1pbnRvLW11dCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9y
bS1jb21wb25lbnQtYXR0cnMtaW50by1tdXQnLCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1
Z2lucy90cmFuc2Zvcm0tY29tcG9uZW50LWN1cmx5LXRvLXJlYWRvbmx5JywgJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWFuZ2xlLWJyYWNrZXQtY29tcG9uZW50cycs
ICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pbnB1dC1vbi10by1v
bkV2ZW50JywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLXRvcC1s
ZXZlbC1jb21wb25lbnRzJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvZGVwcmVj
YXRlLXJlbmRlci1tb2RlbCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3ByZXZl
bnQtcmVuZGVyLWJsb2NrJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNm
b3JtLWlubGluZS1saW5rLXRvJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNz
ZXJ0LW5vLXZpZXctYW5kLWNvbnRyb2xsZXItcGF0aHMnLCAnZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvcGx1Z2lucy9hc3NlcnQtbm8tdmlldy1oZWxwZXInLCAnZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvcGx1Z2lucy9hc3NlcnQtbm8tZWFjaC1pbicsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9j
b21wYXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsLCBfZW1iZXJUZW1wbGF0ZUNv
bXBpbGVyU3lzdGVtUHJlY29tcGlsZSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBp
bGUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSwgX2VtYmVyVGVtcGxhdGVD
b21waWxlclBsdWdpbnMsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xk
QmluZGluZ1N5bnRheCwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1PbGRD
bGFzc0JpbmRpbmdTeW50YXgsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3Jt
SXRlbUNsYXNzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1RyYW5zZm9ybUNsb3N1cmVD
b21wb25lbnRBdHRyc0ludG9NdXQsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNm
b3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0LCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1Ry
YW5zZm9ybUNvbXBvbmVudEN1cmx5VG9SZWFkb25seSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBs
dWdpbnNUcmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyUGx1Z2luc1RyYW5zZm9ybUlucHV0T25Ub09uRXZlbnQsIF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJQbHVnaW5zVHJhbnNmb3JtVG9wTGV2ZWxDb21wb25lbnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyUGx1Z2luc0RlcHJlY2F0ZVJlbmRlck1vZGVsLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1
Z2luc1ByZXZlbnRSZW5kZXJCbG9jaywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFu
c2Zvcm1JbmxpbmVMaW5rVG8sIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zQXNzZXJ0Tm9W
aWV3QW5kQ29udHJvbGxlclBhdGhzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0Fzc2Vy
dE5vVmlld0hlbHBlciwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNBc3NlcnROb0VhY2hJ
biwgX2VtYmVyVGVtcGxhdGVDb21waWxlckNvbXBhdCkgeworICAndXNlIHN0cmljdCc7CisKKyAg
X2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xkQmluZGluZ1N5bnRheC5kZWZhdWx0
KTsKKyAgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcs
IF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3lu
dGF4LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBs
dWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1JdGVtQ2xh
c3MuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zLnJlZ2lzdGVyUGx1
Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1RyYW5zZm9ybUNsb3N1cmVD
b21wb25lbnRBdHRyc0ludG9NdXQuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQ
bHVnaW5zLnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lu
c1RyYW5zZm9ybUNvbXBvbmVudEF0dHJzSW50b011dC5kZWZhdWx0KTsKKyAgX2VtYmVyVGVtcGxh
dGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJlclRlbXBsYXRlQ29t
cGlsZXJQbHVnaW5zVHJhbnNmb3JtQ29tcG9uZW50Q3VybHlUb1JlYWRvbmx5LmRlZmF1bHQpOwor
ICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdpbignYXN0JywgX2Vt
YmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRz
LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdp
bignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1JbnB1dE9uVG9P
bkV2ZW50LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3Rl
clBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1Ub3BM
ZXZlbENvbXBvbmVudHMuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5z
LnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0RlcHJl
Y2F0ZVJlbmRlck1vZGVsLmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lu
cy5yZWdpc3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNQcmV2
ZW50UmVuZGVyQmxvY2suZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5z
LnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0Fzc2Vy
dE5vRWFjaEluLmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdp
c3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1J
bmxpbmVMaW5rVG8uZGVmYXVsdCk7CisKKyAgaWYgKCFfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5f
RU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQpIHsKKyAgICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVy
UGx1Z2lucy5yZWdpc3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdp
bnNBc3NlcnROb1ZpZXdBbmRDb250cm9sbGVyUGF0aHMuZGVmYXVsdCk7CisgICAgX2VtYmVyVGVt
cGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJlclRlbXBsYXRl
Q29tcGlsZXJQbHVnaW5zQXNzZXJ0Tm9WaWV3SGVscGVyLmRlZmF1bHQpOworICB9CisKKyAgZXhw
b3J0cy5fRW1iZXIgPSBfZW1iZXJNZXRhbC5kZWZhdWx0OworICBleHBvcnRzLnByZWNvbXBpbGUg
PSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtUHJlY29tcGlsZS5kZWZhdWx0OworICBleHBv
cnRzLmNvbXBpbGUgPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ29tcGlsZS5kZWZhdWx0
OworICBleHBvcnRzLnRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBs
YXRlLmRlZmF1bHQ7CisgIGV4cG9ydHMucmVnaXN0ZXJQbHVnaW4gPSBfZW1iZXJUZW1wbGF0ZUNv
bXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdpbjsKK30pOworCisvLyB1c2VkIGZvciBhZGRpbmcg
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlIGZvciBiYWNrd2FyZHMgY29tcGF0CitlbmlmZWQoJ2Vt
YmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4
cG9ydHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1w
bGF0ZS1jb21waWxlcgorICAqLworCisgIC8qKgorICAgQHByaXZhdGUKKyAgIEBwcm9wZXJ0eSBo
ZWxwZXJzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnJlZ2lzdGVyUGx1Z2lu
ID0gcmVnaXN0ZXJQbHVnaW47CisgIHZhciBwbHVnaW5zID0geworICAgIGFzdDogW10KKyAgfTsK
KworICAvKioKKyAgICBBZGRzIGFuIEFTVCBwbHVnaW4gdG8gYmUgdXNlZCBieSBFbWJlci5IVE1M
QmFycy5jb21waWxlLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgcmVnaXN0ZXJBU1RQ
bHVnaW4KKyAgKi8KKworICBmdW5jdGlvbiByZWdpc3RlclBsdWdpbih0eXBlLCBQbHVnaW4pIHsK
KyAgICBpZiAoIXBsdWdpbnNbdHlwZV0pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1w
dGluZyB0byByZWdpc3RlciAiJyArIFBsdWdpbiArICciIGFzICInICsgdHlwZSArICciIHdoaWNo
IGlzIG5vdCBhIHZhbGlkIEhUTUxCYXJzIHBsdWdpbiB0eXBlLicpOworICAgIH0KKworICAgIHBs
dWdpbnNbdHlwZV0ucHVzaChQbHVnaW4pOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcGx1
Z2luczsKK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL2Fzc2Vy
dC1uby1lYWNoLWluJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2Nh
dGlvbi1kaXNwbGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJl
ck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlv
bkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIEFzc2VydE5vRWFjaElu
KCkgeworICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50
c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CisKKyAgICB0aGlzLnN5bnRh
eCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIEFzc2VydE5v
RWFjaEluLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBBc3NlcnROb0VhY2hJbl90cmFu
c2Zvcm0oYXN0KSB7CisgICAgaWYgKCEhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WLl9FTkFC
TEVfTEVHQUNZX1ZJRVdfU1VQUE9SVCkgeworICAgICAgcmV0dXJuIGFzdDsKKyAgICB9CisgICAg
dmFyIHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKyAgICB2YXIgbW9kdWxlTmFt
ZSA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kdWxlTmFtZTsKKworICAgIHdhbGtl
ci52aXNpdChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUp
KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGFzc2VydEhlbHBlcihtb2R1bGVO
YW1lLCBub2RlKTsKKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rp
b24gYXNzZXJ0SGVscGVyKG1vZHVsZU5hbWUsIG5vZGUpIHsKKyAgICB2YXIgbW9kdWxlSW5mbyA9
IF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVm
YXVsdChtb2R1bGVOYW1lLCBub2RlLmxvYyk7CisgICAgdmFyIHNpbmd1bGFyID0gbm9kZS5wYXJh
bXNbMF0ub3JpZ2luYWw7CisgICAgdmFyIHBsdXJhbCA9IG5vZGUucGFyYW1zWzJdLm9yaWdpbmFs
OworCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1VzaW5nIHt7I2VhY2ggJyArIHNpbmd1
bGFyICsgJyBpbiAnICsgcGx1cmFsICsgJ319ICcgKyBtb2R1bGVJbmZvICsgJ2lzIG5vIGxvbmdl
ciBzdXBwb3J0ZWQgaW4gRW1iZXIgMi4wKywgcGxlYXNlIHVzZSB7eyNlYWNoICcgKyBwbHVyYWwg
KyAnIGFzIHwnICsgc2luZ3VsYXIgKyAnfH19Jyk7CisgIH0KKworICBmdW5jdGlvbiB2YWxpZGF0
ZShub2RlKSB7CisgICAgcmV0dXJuIChub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcgfHwg
bm9kZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSAmJiBub2RlLnBhdGgub3JpZ2luYWwg
PT09ICdlYWNoJyAmJiBub2RlLnBhcmFtcy5sZW5ndGggPT09IDMgJiYgbm9kZS5wYXJhbXNbMV0u
dHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJyAmJiBub2RlLnBhcmFtc1sxXS5vcmlnaW5hbCA9PT0g
J2luJzsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IEFzc2VydE5vRWFjaEluOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNzZXJ0LW5vLXZpZXctYW5k
LWNvbnRyb2xsZXItcGF0aHMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRl
LWxvY2F0aW9uLWRpc3BsYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNhbGN1bGF0ZUxv
Y2F0aW9uRGlzcGxheSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rpb24gQXNzZXJ0Tm9W
aWV3QW5kQ29udHJvbGxlclBhdGhzKCkgeworICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxl
bmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNb
MF07CisKKyAgICAvLyBzZXQgbGF0ZXIgd2l0aGluIEhUTUxCYXJzIHRvIHRoZSBzeW50YXggcGFj
a2FnZQorICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25z
OworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRyYW5zZm9ybQorICAg
IEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgKi8KKyAgQXNz
ZXJ0Tm9WaWV3QW5kQ29udHJvbGxlclBhdGhzLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlv
biBBc3NlcnROb1ZpZXdBbmRDb250cm9sbGVyUGF0aHNfdHJhbnNmb3JtKGFzdCkgeworICAgIHZh
ciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50YXguV2Fsa2VyKCk7CisgICAgdmFyIG1vZHVsZU5hbWUg
PSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm1vZHVsZU5hbWU7CisKKyAgICB3YWxrZXIu
dmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkg
eworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGFzc2VydFBhdGgobW9kdWxlTmFt
ZSwgbm9kZSwgbm9kZS5wYXRoKTsKKyAgICAgIGFzc2VydFBhdGhzKG1vZHVsZU5hbWUsIG5vZGUs
IG5vZGUucGFyYW1zKTsKKyAgICAgIGFzc2VydEhhc2gobW9kdWxlTmFtZSwgbm9kZSwgbm9kZS5o
YXNoKTsKKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gYXNz
ZXJ0SGFzaChtb2R1bGVOYW1lLCBub2RlLCBoYXNoKSB7CisgICAgaWYgKCFoYXNoIHx8ICFoYXNo
LnBhaXJzKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHZhciBpLCBsLCBwYWlyLCBwYXRo
czsKKyAgICBmb3IgKGkgPSAwLCBsID0gaGFzaC5wYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgIHBhaXIgPSBoYXNoLnBhaXJzW2ldOworICAgICAgcGF0aHMgPSBwYWlyLnZhbHVlLnBh
cmFtczsKKyAgICAgIGFzc2VydFBhdGhzKG1vZHVsZU5hbWUsIHBhaXIsIHBhdGhzKTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRQYXRocyhtb2R1bGVOYW1lLCBub2RlLCBwYXRocykg
eworICAgIGlmICghcGF0aHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGksIGws
IHBhdGg7CisgICAgZm9yIChpID0gMCwgbCA9IHBhdGhzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgcGF0aCA9IHBhdGhzW2ldOworICAgICAgYXNzZXJ0UGF0aChtb2R1bGVOYW1lLCBub2Rl
LCBwYXRoKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRQYXRoKG1vZHVsZU5hbWUs
IG5vZGUsIHBhdGgpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVXNpbmcgYHt7JyAr
IChwYXRoICYmIHBhdGgudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJyAmJiBwYXRoLnBhcnRzWzBd
KSArICd9fWAgb3IgYW55IHBhdGggYmFzZWQgb24gaXQgJyArIF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVmYXVsdChtb2R1bGVOYW1lLCBub2Rl
LmxvYykgKyAnaGFzIGJlZW4gcmVtb3ZlZCBpbiBFbWJlciAyLjAnLCAoZnVuY3Rpb24gKCkgewor
ICAgICAgdmFyIG5vQXNzZXJ0aW9uID0gdHJ1ZTsKKworICAgICAgLy8gYWxsb3cgb3B0LW91dCBv
ZiB0aGUgYXNzZXJ0aW9uIHdoZW4gbGVnYWN5IGFkZG9ucyBhcmUgcHJlc2VudAorICAgICAgdmFy
IHZpZXdLZXl3b3JkID0gcGF0aCAmJiBwYXRoLnR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicgJiYg
cGF0aC5wYXJ0cyAmJiBwYXRoLnBhcnRzWzBdOworICAgICAgaWYgKHZpZXdLZXl3b3JkID09PSAn
dmlldycpIHsKKyAgICAgICAgbm9Bc3NlcnRpb24gPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5F
TlYuX0VOQUJMRV9MRUdBQ1lfVklFV19TVVBQT1JUOworICAgICAgfQorCisgICAgICByZXR1cm4g
bm9Bc3NlcnRpb247CisgICAgfSkoKSwgeworICAgICAgaWQ6IHBhdGgucGFydHMgJiYgcGF0aC5w
YXJ0c1swXSA9PT0gJ3ZpZXcnID8gJ3ZpZXcua2V5d29yZC52aWV3JyA6ICd2aWV3LmtleXdvcmQu
Y29udHJvbGxlcicsCisgICAgICB1bnRpbDogJzIuMC4wJworICAgIH0pOworICB9CisKKyAgZnVu
Y3Rpb24gdmFsaWRhdGUobm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdNdXN0YWNo
ZVN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnOworICB9CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gQXNzZXJ0Tm9WaWV3QW5kQ29udHJvbGxlclBhdGhzOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNzZXJ0LW5vLXZpZXctaGVs
cGVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcn
LCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2NhdGlvbi1kaXNw
bGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1ldGFsRGVi
dWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIEFzc2VydE5vVmlld0hlbHBlcigpIHsK
KyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0g
PT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgLy8gc2V0IGxhdGVyIHdp
dGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBhY2thZ2UKKyAgICB0aGlzLnN5bnRheCA9IG51
bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIC8qKgorICAgIEBwcml2
YXRlCisgICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0gYXN0IFRoZSBBU1Qg
dG8gYmUgdHJhbnNmb3JtZWQuCisgICovCisgIEFzc2VydE5vVmlld0hlbHBlci5wcm90b3R5cGUu
dHJhbnNmb3JtID0gZnVuY3Rpb24gQXNzZXJ0Tm9WaWV3SGVscGVyX3RyYW5zZm9ybShhc3QpIHsK
KyAgICBpZiAoISFfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfVklF
V19TVVBQT1JUKSB7CisgICAgICByZXR1cm4gYXN0OworICAgIH0KKyAgICB2YXIgd2Fsa2VyID0g
bmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworICAgIHZhciBtb2R1bGVOYW1lID0gdGhpcy5vcHRp
b25zICYmIHRoaXMub3B0aW9ucy5tb2R1bGVOYW1lOworCisgICAgd2Fsa2VyLnZpc2l0KGFzdCwg
ZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUobm9kZSkpIHsKKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICBhc3NlcnRIZWxwZXIobW9kdWxlTmFtZSwgbm9kZSk7
CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIGFzc2VydEhl
bHBlcihtb2R1bGVOYW1lLCBub2RlKSB7CisgICAgdmFyIHBhcmFtVmFsdWUgPSBub2RlLnBhcmFt
cy5sZW5ndGggJiYgbm9kZS5wYXJhbXNbMF0udmFsdWU7CisKKyAgICBpZiAoIXBhcmFtVmFsdWUp
IHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ1VzaW5nIHRoZSBge3t2aWV3ICJzdHJpbmcifX1gIGhlbHBlciBpcyByZW1vdmVkIGlu
IDIuMC4gJyArIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRp
c3BsYXkuZGVmYXVsdChtb2R1bGVOYW1lLCBub2RlLmxvYyksIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQsIHsgaWQ6ICd2aWV3LmhlbHBlcics
IHVudGlsOiAnMi4wLjAnIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5v
ZGUpIHsKKyAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBu
b2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmIG5vZGUucGF0aC5wYXJ0c1swXSA9PT0g
J3ZpZXcnOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQXNzZXJ0Tm9WaWV3SGVscGVyOwor
fSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvZGVwcmVjYXRlLXJl
bmRlci1tb2RlbCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci10ZW1w
bGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXknXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0
ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IERlcHJlY2F0ZVJlbmRlck1vZGVsOworCisgIGZ1bmN0aW9uIERlcHJlY2F0
ZVJlbmRlck1vZGVsKG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgICAgdGhp
cy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIERlcHJlY2F0ZVJlbmRlck1vZGVsLnByb3Rv
dHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBEZXByZWNhdGVSZW5kZXJNb2RlbF90cmFuc2Zvcm0o
YXN0KSB7CisgICAgdmFyIG1vZHVsZU5hbWUgPSB0aGlzLm9wdGlvbnMubW9kdWxlTmFtZTsKKyAg
ICB2YXIgd2Fsa2VyID0gbmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworCisgICAgd2Fsa2VyLnZp
c2l0KGFzdCwgZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUobm9kZSkpIHsK
KyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlYWNoKG5vZGUucGFyYW1zLCBmdW5j
dGlvbiAocGFyYW0pIHsKKyAgICAgICAgaWYgKHBhcmFtLnR5cGUgIT09ICdQYXRoRXhwcmVzc2lv
bicpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlcHJlY2F0ZShkZXByZWNhdGlvbk1lc3NhZ2UobW9kdWxlTmFtZSwgbm9kZSwgcGFy
YW0pLCBmYWxzZSwgeworICAgICAgICAgIGlkOiAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIuZGVw
cmVjYXRlLXJlbmRlci1tb2RlbCcsCisgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAg
ICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19tb2RlbC1w
YXJhbS1pbi1jb2RlLXJlbmRlci1jb2RlLWhlbHBlcicKKyAgICAgICAgfSk7CisgICAgICB9KTsK
KyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUo
bm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcgJiYg
bm9kZS5wYXRoLm9yaWdpbmFsID09PSAncmVuZGVyJyAmJiBub2RlLnBhcmFtcy5sZW5ndGggPiAx
OworICB9CisKKyAgZnVuY3Rpb24gZWFjaChsaXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFy
IGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxp
c3RbaV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGRlcHJlY2F0aW9uTWVzc2FnZShtb2R1
bGVOYW1lLCBub2RlLCBwYXJhbSkgeworICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVmYXVsdCht
b2R1bGVOYW1lLCBub2RlLmxvYyk7CisgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBub2RlLnBhcmFt
c1swXS5vcmlnaW5hbDsKKyAgICB2YXIgbW9kZWxOYW1lID0gcGFyYW0ub3JpZ2luYWw7CisgICAg
dmFyIG9yaWdpbmFsID0gJ3t7cmVuZGVyICInICsgY29tcG9uZW50TmFtZSArICciICcgKyBtb2Rl
bE5hbWUgKyAnfX0nOworICAgIHZhciBwcmVmZXJyZWQgPSAne3snICsgY29tcG9uZW50TmFtZSAr
ICcgbW9kZWw9JyArIG1vZGVsTmFtZSArICd9fSc7CisKKyAgICByZXR1cm4gJ1BsZWFzZSByZWZh
Y3RvciBgJyArIG9yaWdpbmFsICsgJ2AgdG8gYSBjb21wb25lbnQgYW5kIGludm9rZSB2aWEnICsg
KCcgYCcgKyBwcmVmZXJyZWQgKyAnYC4gJyArIHNvdXJjZUluZm9ybWF0aW9uKTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvcHJldmVudC1yZW5kZXIt
YmxvY2snLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItdGVtcGxhdGUt
Y29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2NhdGlvbi1kaXNwbGF5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2Fs
Y3VsYXRlTG9jYXRpb25EaXNwbGF5KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBQcmV2ZW50UmVuZGVyQmxvY2s7CisKKyAgZnVuY3Rpb24gUHJldmVudFJlbmRlckJs
b2NrKG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKKyAgfQorCisgIFByZXZlbnRSZW5kZXJCbG9jay5wcm90b3R5cGUudHJhbnNm
b3JtID0gZnVuY3Rpb24gUHJldmVudFJlbmRlckJsb2NrX3RyYW5zZm9ybShhc3QpIHsKKyAgICB2
YXIgbW9kdWxlTmFtZSA9IHRoaXMub3B0aW9ucy5tb2R1bGVOYW1lOworICAgIHZhciB3YWxrZXIg
PSBuZXcgdGhpcy5zeW50YXguV2Fsa2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5j
dGlvbiAobm9kZSkgeworICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1
cm47CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQo
YXNzZXJ0aW9uTWVzc2FnZShtb2R1bGVOYW1lLCBub2RlKSk7CisgICAgfSk7CisKKyAgICByZXR1
cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4g
bm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnICYmIG5vZGUucGF0aC5vcmlnaW5hbCA9PT0g
J3JlbmRlcic7CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRpb25NZXNzYWdlKG1vZHVsZU5hbWUs
IG5vZGUpIHsKKyAgICB2YXIgc291cmNlSW5mb3JtYXRpb24gPSBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyU3lzdGVtQ2FsY3VsYXRlTG9jYXRpb25EaXNwbGF5LmRlZmF1bHQobW9kdWxlTmFtZSwgbm9k
ZS5sb2MpOworCisgICAgcmV0dXJuICdVc2FnZSBvZiBgcmVuZGVyYCBpbiBibG9jayBmb3JtIGlz
IHVuc3VwcG9ydGVkICcgKyBzb3VyY2VJbmZvcm1hdGlvbiArICcuJzsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWFuZ2xlLWJyYWNr
ZXQtY29tcG9uZW50cycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNl
IHN0cmljdCc7CisKKyAgZnVuY3Rpb24gVHJhbnNmb3JtQW5nbGVCcmFja2V0Q29tcG9uZW50cygp
IHsKKyAgICAvLyBzZXQgbGF0ZXIgd2l0aGluIEhUTUxCYXJzIHRvIHRoZSBzeW50YXggcGFja2Fn
ZQorICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisg
ICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0gYXN0IFRoZSBBU1QgdG8gYmUg
dHJhbnNmb3JtZWQuCisgICovCisgIFRyYW5zZm9ybUFuZ2xlQnJhY2tldENvbXBvbmVudHMucHJv
dG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUFuZ2xlQnJhY2tldENvbXBvbmVu
dHNfdHJhbnNmb3JtKGFzdCkgeworICAgIHZhciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50YXguV2Fs
a2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgeworICAgICAg
aWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAg
IG5vZGUudGFnID0gJzwnICsgbm9kZS50YWcgKyAnPic7CisgICAgfSk7CisKKyAgICByZXR1cm4g
YXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9k
ZS50eXBlID09PSAnQ29tcG9uZW50Tm9kZSc7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBU
cmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRzOworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWNsb3N1cmUtY29tcG9uZW50LWF0dHJzLWlu
dG8tbXV0JywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlQ29tcG9uZW50QXR0cnNJbnRvTXV0KCkg
eworICAgIC8vIHNldCBsYXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNrYWdl
CisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAg
ICBAbWV0aG9kIHRyYW5zZm9ybQorICAgIEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0
cmFuc2Zvcm1lZC4KKyAgKi8KKyAgVHJhbnNmb3JtQ2xvc3VyZUNvbXBvbmVudEF0dHJzSW50b011
dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZUNvbXBvbmVu
dEF0dHJzSW50b011dF90cmFuc2Zvcm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5i
dWlsZGVyczsKKworICAgIHRoaXMuc3ludGF4LnRyYXZlcnNlKGFzdCwgeworICAgICAgU3ViRXhw
cmVzc2lvbjogZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgICAgaWYgKGlzQ29tcG9uZW50Q2xvc3Vy
ZShub2RlKSkgeworICAgICAgICAgIG11dFBhcmFtZXRlcnMoYiwgbm9kZSk7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24g
aXNDb21wb25lbnRDbG9zdXJlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3Vi
RXhwcmVzc2lvbicgJiYgbm9kZS5wYXRoLm9yaWdpbmFsID09PSAnY29tcG9uZW50JzsKKyAgfQor
CisgIGZ1bmN0aW9uIG11dFBhcmFtZXRlcnMoYnVpbGRlciwgbm9kZSkgeworICAgIGZvciAodmFy
IGkgPSAxOyBpIDwgbm9kZS5wYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChub2RlLnBh
cmFtc1tpXS50eXBlID09PSAnUGF0aEV4cHJlc3Npb24nKSB7CisgICAgICAgIG5vZGUucGFyYW1z
W2ldID0gYnVpbGRlci5zZXhwcihidWlsZGVyLnBhdGgoJ0BtdXQnKSwgW25vZGUucGFyYW1zW2ld
XSk7CisgICAgICB9CisgICAgfQorCisgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9u
IChwYWlyKSB7CisgICAgICB2YXIgdmFsdWUgPSBwYWlyLnZhbHVlOworCisgICAgICBpZiAodmFs
dWUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJykgeworICAgICAgICBwYWlyLnZhbHVlID0gYnVp
bGRlci5zZXhwcihidWlsZGVyLnBhdGgoJ0BtdXQnKSwgW3BhaXIudmFsdWVdKTsKKyAgICAgIH0K
KyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGVhY2gobGlzdCwgY2FsbGJhY2spIHsKKyAgICBm
b3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBjYWxs
YmFjayhsaXN0W2ldKTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBUcmFuc2Zv
cm1DbG9zdXJlQ29tcG9uZW50QXR0cnNJbnRvTXV0OworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWNvbXBvbmVudC1hdHRycy1pbnRvLW11dCcs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZnVuY3Rpb24gVHJhbnNmb3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0KCkgeworICAgIC8vIHNldCBs
YXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNrYWdlCisgICAgdGhpcy5zeW50
YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRyYW5z
Zm9ybQorICAgIEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0cmFuc2Zvcm1lZC4KKyAg
Ki8KKyAgVHJhbnNmb3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0LnByb3RvdHlwZS50cmFuc2Zvcm0g
PSBmdW5jdGlvbiBUcmFuc2Zvcm1Db21wb25lbnRBdHRyc0ludG9NdXRfdHJhbnNmb3JtKGFzdCkg
eworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7CisgICAgdmFyIHdhbGtlciA9IG5l
dyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52aXNpdChhc3QsIGZ1bmN0aW9u
IChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9uIChwYWlyKSB7
CisgICAgICAgIHZhciB2YWx1ZSA9IHBhaXIudmFsdWU7CisKKyAgICAgICAgaWYgKHZhbHVlLnR5
cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKKyAgICAgICAgICBwYWlyLnZhbHVlID0gYi5zZXhw
cihiLnBhdGgoJ0BtdXQnKSwgW3BhaXIudmFsdWVdKTsKKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5v
ZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnIHx8IG5vZGUu
dHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JzsKKyAgfQorCisgIGZ1bmN0aW9uIGVhY2gobGlz
dCwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICBjYWxsYmFjayhsaXN0W2ldKTsKKyAgICB9CisgIH0KKworICBleHBv
cnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1Db21wb25lbnRBdHRyc0ludG9NdXQ7Cit9KTsKK2VuaWZl
ZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tY29tcG9uZW50LWN1
cmx5LXRvLXJlYWRvbmx5JywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1Db21wb25lbnRDdXJseVRvUmVhZG9u
bHkoKSB7CisgICAgLy8gc2V0IGxhdGVyIHdpdGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBh
Y2thZ2UKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0
ZQorICAgIEBtZXRob2QgdHJhbnNmb3JtCisgICAgQHBhcmFtIHtBU1R9IGFzdCBUaGUgQVNUIHRv
IGJlIHRyYW5zZm9ybWVkLgorICAqLworICBUcmFuc2Zvcm1Db21wb25lbnRDdXJseVRvUmVhZG9u
bHkucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUNvbXBvbmV0bkN1cmx5
VG9SZWFkb25seV90cmFuc2Zvcm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5idWls
ZGVyczsKKyAgICB2YXIgd2Fsa2VyID0gbmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworCisgICAg
d2Fsa2VyLnZpc2l0KGFzdCwgZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUo
bm9kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlYWNoKG5vZGUuYXR0
cmlidXRlcywgZnVuY3Rpb24gKGF0dHIpIHsKKyAgICAgICAgaWYgKGF0dHIudmFsdWUudHlwZSAh
PT0gJ011c3RhY2hlU3RhdGVtZW50JykgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoYXR0ci52YWx1ZS5wYXJhbXMubGVuZ3RoIHx8IGF0dHIudmFsdWUuaGFzaC5w
YWlycy5sZW5ndGgpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBh
dHRyLnZhbHVlID0gYi5tdXN0YWNoZShiLnBhdGgoJ3JlYWRvbmx5JyksIFthdHRyLnZhbHVlLnBh
dGhdLCBudWxsLCAhYXR0ci52YWx1ZS5lc2NhcGUpOworICAgICAgfSk7CisgICAgfSk7CisKKyAg
ICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICBy
ZXR1cm4gbm9kZS50eXBlID09PSAnQ29tcG9uZW50Tm9kZSc7CisgIH0KKworICBmdW5jdGlvbiBl
YWNoKGxpc3QsIGNhbGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0
aDsgaSA8IGw7IGkrKykgeworICAgICAgY2FsbGJhY2sobGlzdFtpXSk7CisgICAgfQorICB9CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNmb3JtQ29tcG9uZW50Q3VybHlUb1JlYWRvbmx5Owor
fSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWlu
bGluZS1saW5rLXRvJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1JbmxpbmVMaW5rVG87CisK
KyAgZnVuY3Rpb24gVHJhbnNmb3JtSW5saW5lTGlua1RvKG9wdGlvbnMpIHsKKyAgICB0aGlzLm9w
dGlvbnMgPSBvcHRpb25zOworICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgfQorCisgIFRyYW5z
Zm9ybUlubGluZUxpbmtUby5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gVHJhbnNmb3Jt
SW5saW5lTGlua1RvX3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIgX3N5bnRheCA9IHRoaXMuc3lu
dGF4OworICAgIHZhciB0cmF2ZXJzZSA9IF9zeW50YXgudHJhdmVyc2U7CisgICAgdmFyIGIgPSBf
c3ludGF4LmJ1aWxkZXJzOworCisgICAgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKGNvbnRlbnQsIGxv
YykgeworICAgICAgcmV0dXJuIGIucHJvZ3JhbShbYnVpbGRTdGF0ZW1lbnQoY29udGVudCwgbG9j
KV0sIG51bGwsIGxvYyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoY29u
dGVudCwgbG9jKSB7CisgICAgICBzd2l0Y2ggKGNvbnRlbnQudHlwZSkgeworICAgICAgICBjYXNl
ICdQYXRoRXhwcmVzc2lvbic6CisgICAgICAgICAgcmV0dXJuIGIubXVzdGFjaGUoY29udGVudCwg
bnVsbCwgbnVsbCwgbnVsbCwgbG9jKTsKKworICAgICAgICBjYXNlICdTdWJFeHByZXNzaW9uJzoK
KyAgICAgICAgICByZXR1cm4gYi5tdXN0YWNoZShjb250ZW50LnBhdGgsIGNvbnRlbnQucGFyYW1z
LCBjb250ZW50Lmhhc2gsIG51bGwsIGxvYyk7CisKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgY2Fz
ZSBoYW5kbGVzIGxpdGVyYWxzLgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBi
LnRleHQoJycgKyBjb250ZW50LnZhbHVlLCBsb2MpOworICAgICAgfQorICAgIH0KKworICAgIGZ1
bmN0aW9uIHVuc2FmZUh0bWwoZXhwcikgeworICAgICAgcmV0dXJuIGIuc2V4cHIoJy1odG1sLXNh
ZmUnLCBbZXhwcl0pOworICAgIH0KKworICAgIHRyYXZlcnNlKGFzdCwgeworICAgICAgTXVzdGFj
aGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgICAgIGlmIChub2RlLnBhdGgub3Jp
Z2luYWwgPT09ICdsaW5rLXRvJykgeworICAgICAgICAgIHZhciBjb250ZW50ID0gbm9kZS5lc2Nh
cGVkID8gbm9kZS5wYXJhbXNbMF0gOiB1bnNhZmVIdG1sKG5vZGUucGFyYW1zWzBdKTsKKyAgICAg
ICAgICByZXR1cm4gYi5ibG9jaygnbGluay10bycsIG5vZGUucGFyYW1zLnNsaWNlKDEpLCBub2Rl
Lmhhc2gsIGJ1aWxkUHJvZ3JhbShjb250ZW50LCBub2RlLmxvYyksIG51bGwsIG5vZGUubG9jKTsK
KyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIGFzdDsKKyAgfTsKK30p
OworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pbnB1
dC1vbi10by1vbkV2ZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVy
LXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS9jYWxjdWxhdGUtbG9jYXRpb24tZGlzcGxheSddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyVGVtcGxhdGVDb21waWxl
clN5c3RlbUNhbGN1bGF0ZUxvY2F0aW9uRGlzcGxheSkgeworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICBAbW9kdWxlIGVtYmVyCisgICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICov
CisKKyAgLyoqCisgICAgQW4gSFRNTEJhcnMgQVNUIHRyYW5zZm9ybWF0aW9uIHRoYXQgcmVwbGFj
ZXMgYWxsIGluc3RhbmNlcyBvZgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICB7e2lucHV0IG9u
PSJlbnRlciIgYWN0aW9uPSJkb1N0dWZmIn19CisgICB7e2lucHV0IG9uPSJrZXktcHJlc3MiIGFj
dGlvbj0iZG9TdHVmZiJ9fQorICAgIGBgYAorICAKKyAgICB3aXRoCisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgIHt7aW5wdXQgZW50ZXI9ImRvU3R1ZmYifX0KKyAgIHt7aW5wdXQga2V5LXByZXNz
PSJkb1N0dWZmIn19CisgICAgYGBgCisgIAorICAgIEBwcml2YXRlCisgICAgQGNsYXNzIFRyYW5z
Zm9ybUlucHV0T25Ub09uRXZlbnQKKyAgKi8KKyAgZnVuY3Rpb24gVHJhbnNmb3JtSW5wdXRPblRv
T25FdmVudCgpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBh
cmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgLy8g
c2V0IGxhdGVyIHdpdGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBhY2thZ2UKKyAgICB0aGlz
LnN5bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIC8q
KgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0g
YXN0IFRoZSBBU1QgdG8gYmUgdHJhbnNmb3JtZWQuCisgICovCisgIFRyYW5zZm9ybUlucHV0T25U
b09uRXZlbnQucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUlucHV0T25U
b09uRXZlbnRfdHJhbnNmb3JtKGFzdCkgeworICAgIHZhciBwbHVnaW5Db250ZXh0ID0gdGhpczsK
KyAgICB2YXIgYiA9IHBsdWdpbkNvbnRleHQuc3ludGF4LmJ1aWxkZXJzOworICAgIHZhciB3YWxr
ZXIgPSBuZXcgcGx1Z2luQ29udGV4dC5zeW50YXguV2Fsa2VyKCk7CisgICAgdmFyIG1vZHVsZU5h
bWUgPSBwbHVnaW5Db250ZXh0Lm9wdGlvbnMubW9kdWxlTmFtZTsKKworICAgIHdhbGtlci52aXNp
dChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAocGx1Z2luQ29udGV4dC52YWxpZGF0
ZShub2RlKSkgeworICAgICAgICB2YXIgYWN0aW9uID0gaGFzaFBhaXJGb3JLZXkobm9kZS5oYXNo
LCAnYWN0aW9uJyk7CisgICAgICAgIHZhciBvbiA9IGhhc2hQYWlyRm9yS2V5KG5vZGUuaGFzaCwg
J29uJyk7CisgICAgICAgIHZhciBvbkV2ZW50ID0gaGFzaFBhaXJGb3JLZXkobm9kZS5oYXNoLCAn
b25FdmVudCcpOworICAgICAgICB2YXIgbm9ybWFsaXplZE9uID0gb24gfHwgb25FdmVudDsKKyAg
ICAgICAgdmFyIG1vZHVsZUluZm8gPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2FsY3Vs
YXRlTG9jYXRpb25EaXNwbGF5LmRlZmF1bHQobW9kdWxlTmFtZSwgbm9kZS5sb2MpOworCisgICAg
ICAgIGlmIChub3JtYWxpemVkT24gJiYgbm9ybWFsaXplZE9uLnZhbHVlLnR5cGUgIT09ICdTdHJp
bmdMaXRlcmFsJykgeworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2lu
ZyBhIGR5bmFtaWMgdmFsdWUgZm9yIFwnI3tub3JtYWxpemVkT24ua2V5fT1cJyB3aXRoIHRoZSBc
J3t7aW5wdXR9fVwnIGhlbHBlciAnICsgbW9kdWxlSW5mbyArICdpcyBkZXByZWNhdGVkLicsIGZh
bHNlLCB7IGlkOiAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIudHJhbnNmb3JtLWlucHV0LW9uLXRv
LW9uRXZlbnQuZHluYW1pYy12YWx1ZScsIHVudGlsOiAnMy4wLjAnIH0pOworCisgICAgICAgICAg
bm9ybWFsaXplZE9uLmtleSA9ICdvbkV2ZW50JzsKKyAgICAgICAgICByZXR1cm47IC8vIGV4aXQg
ZWFybHksIGFzIHdlIGNhbm5vdCB0cmFuc2Zvcm0gZnVydGhlcgorICAgICAgICB9CisKKyAgICAg
ICAgcmVtb3ZlRnJvbUhhc2gobm9kZS5oYXNoLCBub3JtYWxpemVkT24pOworICAgICAgICByZW1v
dmVGcm9tSGFzaChub2RlLmhhc2gsIGFjdGlvbik7CisKKyAgICAgICAgaWYgKCFhY3Rpb24pIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnVXNpbmcgXCd7e2lucHV0ICcg
KyBub3JtYWxpemVkT24ua2V5ICsgJz0iJyArIG5vcm1hbGl6ZWRPbi52YWx1ZS52YWx1ZSArICci
IC4uLn19XCcgd2l0aG91dCBzcGVjaWZ5aW5nIGFuIGFjdGlvbiAnICsgbW9kdWxlSW5mbyArICd3
aWxsIGRvIG5vdGhpbmcuJywgZmFsc2UsIHsgaWQ6ICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci50
cmFuc2Zvcm0taW5wdXQtb24tdG8tb25FdmVudC5uby1hY3Rpb24nLCB1bnRpbDogJzMuMC4wJyB9
KTsKKworICAgICAgICAgIHJldHVybjsgLy8gZXhpdCBlYXJseSwgaWYgbm8gYWN0aW9uIHdhcyBh
dmFpbGFibGUgdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgICAgICB9CisKKyAgICAgICAgdmFy
IHNwZWNpZmllZE9uID0gbm9ybWFsaXplZE9uID8gbm9ybWFsaXplZE9uLmtleSArICc9IicgKyBu
b3JtYWxpemVkT24udmFsdWUudmFsdWUgKyAnIiAnIDogJyc7CisgICAgICAgIGlmIChub3JtYWxp
emVkT24gJiYgbm9ybWFsaXplZE9uLnZhbHVlLnZhbHVlID09PSAna2V5UHJlc3MnKSB7CisgICAg
ICAgICAgLy8gdXNpbmcgYGtleVByZXNzYCBpbiB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50IHdp
bGwKKyAgICAgICAgICAvLyBjbG9iYmVyIHRoZSBrZXlQcmVzcyBldmVudCBoYW5kbGVyCisgICAg
ICAgICAgbm9ybWFsaXplZE9uLnZhbHVlLnZhbHVlID0gJ2tleS1wcmVzcyc7CisgICAgICAgIH0K
KworICAgICAgICB2YXIgZXhwZWN0ZWQgPSAobm9ybWFsaXplZE9uID8gbm9ybWFsaXplZE9uLnZh
bHVlLnZhbHVlIDogJ2VudGVyJykgKyAnPSInICsgYWN0aW9uLnZhbHVlLm9yaWdpbmFsICsgJyIn
OworCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyBcJ3t7aW5wdXQg
JyArIHNwZWNpZmllZE9uICsgJ2FjdGlvbj0iJyArIGFjdGlvbi52YWx1ZS5vcmlnaW5hbCArICci
fX1cJyAnICsgbW9kdWxlSW5mbyArICdpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwne3tpbnB1
dCAnICsgZXhwZWN0ZWQgKyAnfX1cJyBpbnN0ZWFkLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItdGVt
cGxhdGUtY29tcGlsZXIudHJhbnNmb3JtLWlucHV0LW9uLXRvLW9uRXZlbnQubm9ybWFsaXplZC1v
bicsIHVudGlsOiAnMy4wLjAnIH0pOworICAgICAgICBpZiAoIW5vcm1hbGl6ZWRPbikgeworICAg
ICAgICAgIG5vcm1hbGl6ZWRPbiA9IGIucGFpcignb25FdmVudCcsIGIuc3RyaW5nKCdlbnRlcicp
KTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUuaGFzaC5wYWlycy5wdXNoKGIucGFpcihub3Jt
YWxpemVkT24udmFsdWUudmFsdWUsIGFjdGlvbi52YWx1ZSkpOworICAgICAgfQorICAgIH0pOwor
CisgICAgcmV0dXJuIGFzdDsKKyAgfTsKKworICBUcmFuc2Zvcm1JbnB1dE9uVG9PbkV2ZW50LnBy
b3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybVdpdGhBc1RvSGFzaF92YWxpZGF0
ZShub2RlKSB7CisgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyAm
JiBub2RlLnBhdGgub3JpZ2luYWwgPT09ICdpbnB1dCcgJiYgKGhhc2hQYWlyRm9yS2V5KG5vZGUu
aGFzaCwgJ2FjdGlvbicpIHx8IGhhc2hQYWlyRm9yS2V5KG5vZGUuaGFzaCwgJ29uJykgfHwgaGFz
aFBhaXJGb3JLZXkobm9kZS5oYXNoLCAnb25FdmVudCcpKTsKKyAgfTsKKworICBmdW5jdGlvbiBo
YXNoUGFpckZvcktleShoYXNoLCBrZXkpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhc2gu
cGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgcGFpciA9IGhhc2gucGFpcnNb
aV07CisgICAgICBpZiAocGFpci5rZXkgPT09IGtleSkgeworICAgICAgICByZXR1cm4gcGFpcjsK
KyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBy
ZW1vdmVGcm9tSGFzaChoYXNoLCBwYWlyVG9SZW1vdmUpIHsKKyAgICB2YXIgbmV3UGFpcnMgPSBb
XTsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhc2gucGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICB2YXIgcGFpciA9IGhhc2gucGFpcnNbaV07CisKKyAgICAgIGlmIChwYWlyICE9
PSBwYWlyVG9SZW1vdmUpIHsKKyAgICAgICAgbmV3UGFpcnMucHVzaChwYWlyKTsKKyAgICAgIH0K
KyAgICB9CisKKyAgICBoYXNoLnBhaXJzID0gbmV3UGFpcnM7CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBUcmFuc2Zvcm1JbnB1dE9uVG9PbkV2ZW50OworfSk7CitlbmlmZWQoJ2VtYmVyLXRl
bXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWl0ZW0tY2xhc3MnLCBbJ2V4cG9ydHMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IFRyYW5zZm9ybUl0ZW1DbGFzczsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1JdGVtQ2xh
c3MoKSB7CisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgVHJhbnNmb3JtSXRlbUNs
YXNzLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1JdGVtQ2xhc3NfdHJh
bnNmb3JtKGFzdCkgeworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7CisgICAgdmFy
IHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52aXNpdChh
c3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0
aW9uIChwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBwYWlyLmtleTsKKyAgICAgICAgdmFyIHZh
bHVlID0gcGFpci52YWx1ZTsKKworICAgICAgICBpZiAoa2V5ICE9PSAnaXRlbUNsYXNzJykgewor
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0g
J1N0cmluZ0xpdGVyYWwnKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgdmFyIHByb3BOYW1lID0gdmFsdWUub3JpZ2luYWw7CisgICAgICAgIHZhciBwYXJhbXMgPSBb
dmFsdWVdOworICAgICAgICB2YXIgc2V4cHJQYXJhbXMgPSBbYi5zdHJpbmcocHJvcE5hbWUpLCBi
LnBhdGgocHJvcE5hbWUpXTsKKworICAgICAgICBwYXJhbXMucHVzaChiLnNleHByKGIuc3RyaW5n
KCctbm9ybWFsaXplLWNsYXNzJyksIHNleHByUGFyYW1zKSk7CisgICAgICAgIHZhciBzZXhwciA9
IGIuc2V4cHIoYi5zdHJpbmcoJ2lmJyksIHBhcmFtcyk7CisKKyAgICAgICAgcGFpci52YWx1ZSA9
IHNleHByOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisg
IGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gJ0Js
b2NrU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpICYmIG5v
ZGUucGF0aC5vcmlnaW5hbCA9PT0gJ2NvbGxlY3Rpb24nOworICB9CisKKyAgZnVuY3Rpb24gZWFj
aChsaXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7
IGkgPCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxpc3RbaV0pOworICAgIH0KKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLW9sZC1i
aW5kaW5nLXN5bnRheCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci10
ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXknXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJT
eXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFRyYW5zZm9ybU9sZEJpbmRpbmdTeW50YXg7CisKKyAgZnVuY3Rpb24g
VHJhbnNmb3JtT2xkQmluZGluZ1N5bnRheChvcHRpb25zKSB7CisgICAgdGhpcy5zeW50YXggPSBu
dWxsOworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KKworICBUcmFuc2Zvcm1PbGRC
aW5kaW5nU3ludGF4LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1PbGRC
aW5kaW5nU3ludGF4X3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIgbW9kdWxlTmFtZSA9IHRoaXMu
b3B0aW9ucy5tb2R1bGVOYW1lOworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7Cisg
ICAgdmFyIHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52
aXNpdChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7
CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMs
IGZ1bmN0aW9uIChwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBwYWlyLmtleTsKKyAgICAgICAg
dmFyIHZhbHVlID0gcGFpci52YWx1ZTsKKworICAgICAgICB2YXIgc291cmNlSW5mb3JtYXRpb24g
PSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2FsY3VsYXRlTG9jYXRpb25EaXNwbGF5LmRl
ZmF1bHQobW9kdWxlTmFtZSwgcGFpci5sb2MpOworCisgICAgICAgIGlmIChrZXkgPT09ICdjbGFz
c0JpbmRpbmcnKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1NldHRpbmcgXCdhdHRyaWJ1dGVCaW5kaW5nc1wnIHZpYSB0
ZW1wbGF0ZSBoZWxwZXJzIGlzIG5vdCBhbGxvd2VkICcgKyBzb3VyY2VJbmZvcm1hdGlvbiwga2V5
ICE9PSAnYXR0cmlidXRlQmluZGluZ3MnKTsKKworICAgICAgICBpZiAoa2V5LnN1YnN0cigtNykg
PT09ICdCaW5kaW5nJykgeworICAgICAgICAgIHZhciBuZXdLZXkgPSBrZXkuc2xpY2UoMCwgLTcp
OworCisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1lvdVwncmUgdXNpbmcg
bGVnYWN5IGJpbmRpbmcgc3ludGF4OiAnICsga2V5ICsgJz0nICsgZXhwclRvU3RyaW5nKHZhbHVl
KSArICcgJyArIHNvdXJjZUluZm9ybWF0aW9uICsgJy4gUGxlYXNlIHJlcGxhY2Ugd2l0aCAnICsg
bmV3S2V5ICsgJz0nICsgdmFsdWUub3JpZ2luYWwsIGZhbHNlLCB7IGlkOiAnZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIudHJhbnNmb3JtLW9sZC1iaW5kaW5nLXN5bnRheCcsIHVudGlsOiAnMy4wLjAn
IH0pOworCisgICAgICAgICAgcGFpci5rZXkgPSBuZXdLZXk7CisgICAgICAgICAgaWYgKHZhbHVl
LnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykgeworICAgICAgICAgICAgcGFpci52YWx1ZSA9IGIu
cGF0aCh2YWx1ZS5vcmlnaW5hbCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUo
bm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcgfHwgbm9k
ZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnOworICB9CisKKyAgZnVuY3Rpb24gZWFjaChs
aXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxpc3RbaV0pOworICAgIH0KKyAgfQorCisgIGZ1
bmN0aW9uIGV4cHJUb1N0cmluZyhleHByKSB7CisgICAgc3dpdGNoIChleHByLnR5cGUpIHsKKyAg
ICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOgorICAgICAgICByZXR1cm4gJyInICsgZXhwci5vcmln
aW5hbCArICciJzsKKyAgICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzoKKyAgICAgICAgcmV0dXJu
IGV4cHIub3JpZ2luYWw7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUt
Y29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tb2xkLWNsYXNzLWJpbmRpbmctc3ludGF4JywgWydl
eHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1PbGRDbGFzc0JpbmRpbmdTeW50YXg7CisKKyAgZnVuY3Rp
b24gVHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3ludGF4KG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5
bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIFRyYW5z
Zm9ybU9sZENsYXNzQmluZGluZ1N5bnRheC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24g
VHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3ludGF4X3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIg
YiA9IHRoaXMuc3ludGF4LmJ1aWxkZXJzOworICAgIHZhciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50
YXguV2Fsa2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgewor
ICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisK
KyAgICAgIHZhciBhbGxPZlRoZU1pY3Jvc3ludGF4ZXMgPSBbXTsKKyAgICAgIHZhciBhbGxPZlRo
ZU1pY3Jvc3ludGF4SW5kZXhlcyA9IFtdOworICAgICAgdmFyIGNsYXNzUGFpciA9IHVuZGVmaW5l
ZDsKKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9uIChwYWlyLCBpbmRleCkg
eworICAgICAgICB2YXIga2V5ID0gcGFpci5rZXk7CisKKyAgICAgICAgaWYgKGtleSA9PT0gJ2Ns
YXNzQmluZGluZycgfHwga2V5ID09PSAnY2xhc3NOYW1lQmluZGluZ3MnKSB7CisgICAgICAgICAg
YWxsT2ZUaGVNaWNyb3N5bnRheEluZGV4ZXMucHVzaChpbmRleCk7CisgICAgICAgICAgYWxsT2ZU
aGVNaWNyb3N5bnRheGVzLnB1c2gocGFpcik7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAn
Y2xhc3MnKSB7CisgICAgICAgICAgY2xhc3NQYWlyID0gcGFpcjsKKyAgICAgICAgfQorICAgICAg
fSk7CisKKyAgICAgIGlmIChhbGxPZlRoZU1pY3Jvc3ludGF4ZXMubGVuZ3RoID09PSAwKSB7Cisg
ICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNsYXNzVmFsdWUgPSBbXTsKKwor
ICAgICAgaWYgKGNsYXNzUGFpcikgeworICAgICAgICBjbGFzc1ZhbHVlLnB1c2goY2xhc3NQYWly
LnZhbHVlKTsKKyAgICAgICAgY2xhc3NWYWx1ZS5wdXNoKGIuc3RyaW5nKCcgJykpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgY2xhc3NQYWlyID0gYi5wYWlyKCdjbGFzcycsIG51bGwpOworICAg
ICAgICBub2RlLmhhc2gucGFpcnMucHVzaChjbGFzc1BhaXIpOworICAgICAgfQorCisgICAgICBl
YWNoKGFsbE9mVGhlTWljcm9zeW50YXhJbmRleGVzLCBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICAg
ICAgbm9kZS5oYXNoLnBhaXJzLnNwbGljZShpbmRleCwgMSk7CisgICAgICB9KTsKKworICAgICAg
ZWFjaChhbGxPZlRoZU1pY3Jvc3ludGF4ZXMsIGZ1bmN0aW9uIChfcmVmKSB7CisgICAgICAgIHZh
ciB2YWx1ZSA9IF9yZWYudmFsdWU7CisgICAgICAgIHZhciBsb2MgPSBfcmVmLmxvYzsKKworICAg
ICAgICB2YXIgc2V4cHJzID0gW107CisgICAgICAgIC8vIFRPRE86IGFkZCBoZWxwZnVsIGRlcHJl
Y2F0aW9uIHdoZW4gYm90aCBgY2xhc3NOYW1lc2AgYW5kIGBjbGFzc05hbWVCaW5kaW5nc2AgY2Fu
CisgICAgICAgIC8vIGJlIHJlbW92ZWQuCisKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdT
dHJpbmdMaXRlcmFsJykgeworICAgICAgICAgIHZhciBtaWNyb3N5bnRheCA9IHBhcnNlTWljcm9z
eW50YXgodmFsdWUub3JpZ2luYWwpOworCisgICAgICAgICAgYnVpbGRTZXhwcnMobWljcm9zeW50
YXgsIHNleHBycywgYik7CisKKyAgICAgICAgICBjbGFzc1ZhbHVlLnB1c2guYXBwbHkoY2xhc3NW
YWx1ZSwgc2V4cHJzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHZhciBoYXNoID0g
Yi5oYXNoKCk7CisgICAgICBjbGFzc1BhaXIudmFsdWUgPSBiLnNleHByKGIuc3RyaW5nKCdjb25j
YXQnKSwgY2xhc3NWYWx1ZSwgaGFzaCk7CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9
OworCisgIGZ1bmN0aW9uIGJ1aWxkU2V4cHJzKG1pY3Jvc3ludGF4LCBzZXhwcnMsIGIpIHsKKyAg
ICBmb3IgKHZhciBpID0gMCwgbCA9IG1pY3Jvc3ludGF4Lmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgdmFyIF9taWNyb3N5bnRheCRpID0gbWljcm9zeW50YXhbaV07CisgICAgICB2YXIgcHJv
cE5hbWUgPSBfbWljcm9zeW50YXgkaVswXTsKKyAgICAgIHZhciBhY3RpdmVDbGFzcyA9IF9taWNy
b3N5bnRheCRpWzFdOworICAgICAgdmFyIGluYWN0aXZlQ2xhc3MgPSBfbWljcm9zeW50YXgkaVsy
XTsKKworICAgICAgdmFyIHNleHByID0gdW5kZWZpbmVkOworCisgICAgICAvLyA6bXktY2xhc3Mt
bmFtZSBtaWNyb3N5bnRheCBmb3Igc3RhdGljIHZhbHVlcworICAgICAgaWYgKHByb3BOYW1lID09
PSAnJykgeworICAgICAgICBzZXhwciA9IGIuc3RyaW5nKGFjdGl2ZUNsYXNzKTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHZhciBwYXJhbXMgPSBbYi5wYXRoKHByb3BOYW1lKV07CisKKyAgICAg
ICAgaWYgKGFjdGl2ZUNsYXNzKSB7CisgICAgICAgICAgcGFyYW1zLnB1c2goYi5zdHJpbmcoYWN0
aXZlQ2xhc3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgc2V4cHJQYXJhbXMg
PSBbYi5zdHJpbmcocHJvcE5hbWUpLCBiLnBhdGgocHJvcE5hbWUpXTsKKworICAgICAgICAgIHZh
ciBoYXNoID0gYi5oYXNoKCk7CisgICAgICAgICAgaWYgKGFjdGl2ZUNsYXNzICE9PSB1bmRlZmlu
ZWQpIHsKKyAgICAgICAgICAgIGhhc2gucGFpcnMucHVzaChiLnBhaXIoJ2FjdGl2ZUNsYXNzJywg
Yi5zdHJpbmcoYWN0aXZlQ2xhc3MpKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGlu
YWN0aXZlQ2xhc3MgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaGFzaC5wYWlycy5wdXNo
KGIucGFpcignaW5hY3RpdmVDbGFzcycsIGIuc3RyaW5nKGluYWN0aXZlQ2xhc3MpKSk7CisgICAg
ICAgICAgfQorCisgICAgICAgICAgcGFyYW1zLnB1c2goYi5zZXhwcihiLnN0cmluZygnLW5vcm1h
bGl6ZS1jbGFzcycpLCBzZXhwclBhcmFtcywgaGFzaCkpOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKGluYWN0aXZlQ2xhc3MpIHsKKyAgICAgICAgICBwYXJhbXMucHVzaChiLnN0cmluZyhpbmFj
dGl2ZUNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXhwciA9IGIuc2V4cHIoYi5zdHJp
bmcoJ2lmJyksIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIHNleHBycy5wdXNoKHNleHByKTsK
KyAgICAgIHNleHBycy5wdXNoKGIuc3RyaW5nKCcgJykpOworICAgIH0KKyAgfQorCisgIGZ1bmN0
aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnQmxvY2tTdGF0
ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JzsKKyAgfQorCisgIGZ1
bmN0aW9uIGVhY2gobGlzdCwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxp
c3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBjYWxsYmFjayhsaXN0W2ldLCBpKTsKKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZU1pY3Jvc3ludGF4KHN0cmluZykgeworICAgIHZh
ciBzZWdtZW50cyA9IHN0cmluZy5zcGxpdCgnICcpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwg
PSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHNlZ21lbnRzW2ldID0gc2Vn
bWVudHNbaV0uc3BsaXQoJzonKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VnbWVudHM7CisgIH0K
K30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS10
b3AtbGV2ZWwtY29tcG9uZW50cycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rpb24gVHJhbnNmb3JtVG9wTGV2ZWxDb21wb25lbnRz
KCkgeworICAgIC8vIHNldCBsYXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNr
YWdlCisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUK
KyAgICBAbWV0aG9kIHRyYW5zZm9ybQorICAgIEBwYXJhbSB7QVNUfSBUaGUgQVNUIHRvIGJlIHRy
YW5zZm9ybWVkLgorICAqLworICBUcmFuc2Zvcm1Ub3BMZXZlbENvbXBvbmVudHMucHJvdG90eXBl
LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybVRvcExldmVsQ29tcG9uZW50c190cmFuc2Zv
cm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5idWlsZGVyczsKKworICAgIGhhc1Np
bmdsZUNvbXBvbmVudE5vZGUoYXN0LCBmdW5jdGlvbiAoY29tcG9uZW50KSB7CisgICAgICBpZiAo
Y29tcG9uZW50LnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgeworICAgICAgICBjb21wb25lbnQu
dGFnID0gJ0AnICsgY29tcG9uZW50LnRhZzsKKyAgICAgICAgY29tcG9uZW50LmlzU3RhdGljID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICB9LCBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgICAgdmFyIGhh
c1RyaXBsZUN1cmxpZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXMuc29tZShmdW5jdGlvbiAoYXR0cikg
eworICAgICAgICByZXR1cm4gYXR0ci52YWx1ZS5lc2NhcGVkID09PSBmYWxzZTsKKyAgICAgIH0p
OworCisgICAgICBpZiAoZWxlbWVudC5tb2RpZmllcnMubGVuZ3RoIHx8IGhhc1RyaXBsZUN1cmxp
ZXMpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAv
LyBUT0RPOiBQcm9wZXJseSBjb3B5IGxvYyBmcm9tIGNoaWxkcmVuCisgICAgICAgIHZhciBwcm9n
cmFtID0gYi5wcm9ncmFtKGVsZW1lbnQuY2hpbGRyZW4pOworICAgICAgICB2YXIgY29tcG9uZW50
ID0gYi5jb21wb25lbnQoJ0A8JyArIGVsZW1lbnQudGFnICsgJz4nLCBlbGVtZW50LmF0dHJpYnV0
ZXMsIHByb2dyYW0sIGVsZW1lbnQubG9jKTsKKyAgICAgICAgY29tcG9uZW50LmlzU3RhdGljID0g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgIH0KKyAgICB9KTsKKworICAg
IHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gaGFzU2luZ2xlQ29tcG9uZW50Tm9kZShw
cm9ncmFtLCBjb21wb25lbnRDYWxsYmFjaywgZWxlbWVudENhbGxiYWNrKSB7CisgICAgdmFyIGxv
YyA9IHByb2dyYW0ubG9jOworICAgIHZhciBib2R5ID0gcHJvZ3JhbS5ib2R5OworCisgICAgaWYg
KCFsb2MgfHwgbG9jLnN0YXJ0LmxpbmUgIT09IDEgfHwgbG9jLnN0YXJ0LmNvbHVtbiAhPT0gMCkg
eworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBsYXN0Q29tcG9uZW50Tm9kZSA9IHVu
ZGVmaW5lZDsKKyAgICB2YXIgbGFzdEluZGV4ID0gdW5kZWZpbmVkOworICAgIHZhciBub2RlQ291
bnQgPSAwOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgdmFyIGN1cnIgPSBib2R5W2ldOworCisgICAgICAvLyB0ZXh0IG5vZGUgd2l0
aCB3aGl0ZXNwYWNlIG9ubHkKKyAgICAgIGlmIChjdXJyLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYg
L15bXHNdKiQvLnRlc3QoY3Vyci5jaGFycykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9
CisKKyAgICAgIC8vIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzIGlmIHdlJ3ZlIGJlZW4gaGVy
ZSBiZWZvcmUKKyAgICAgIGlmIChub2RlQ291bnQrKyA+IDApIHsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICBpZiAoY3Vyci50eXBlID09PSAnQ29tcG9uZW50Tm9kZScg
fHwgY3Vyci50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7CisgICAgICAgIGxhc3RDb21wb25lbnRO
b2RlID0gY3VycjsKKyAgICAgICAgbGFzdEluZGV4ID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAoIWxhc3RDb21wb25lbnROb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKGxhc3RDb21wb25lbnROb2RlLnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgeworICAgICAg
Y29tcG9uZW50Q2FsbGJhY2sobGFzdENvbXBvbmVudE5vZGUpOworICAgIH0KKyAgfQorCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFRyYW5zZm9ybVRvcExldmVsQ29tcG9uZW50czsKK30pOworZW5pZmVk
KCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3Bs
YXknLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNhbGN1bGF0ZUxvY2F0aW9uRGlzcGxheTsKKworICBmdW5j
dGlvbiBjYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkobW9kdWxlTmFtZSwgX2xvYykgeworICAgIHZh
ciBsb2MgPSBfbG9jIHx8IHt9OworCisgICAgdmFyIF9yZWYgPSBsb2Muc3RhcnQgfHwge307CisK
KyAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47CisgICAgdmFyIGxpbmUgPSBfcmVmLmxpbmU7
CisKKyAgICB2YXIgbW9kdWxlSW5mbyA9ICcnOworICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAg
ICBtb2R1bGVJbmZvICs9ICdcJycgKyBtb2R1bGVOYW1lICsgJ1wnICc7CisgICAgfQorCisgICAg
aWYgKGxpbmUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IHVuZGVmaW5lZCkgeworICAgICAg
aWYgKG1vZHVsZU5hbWUpIHsKKyAgICAgICAgLy8gb25seSBwcmVwZW5kIEAgaWYgdGhlIG1vZHVs
ZU5hbWUgd2FzIHByZXNlbnQKKyAgICAgICAgbW9kdWxlSW5mbyArPSAnQCAnOworICAgICAgfQor
ICAgICAgbW9kdWxlSW5mbyArPSAnTCcgKyBsaW5lICsgJzpDJyArIGNvbHVtbjsKKyAgICB9CisK
KyAgICBpZiAobW9kdWxlSW5mbykgeworICAgICAgbW9kdWxlSW5mbyA9ICcoJyArIG1vZHVsZUlu
Zm8gKyAnKSAnOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVJbmZvOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NvbXBpbGUnLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21w
aWxlci9zeXN0ZW0vY29tcGlsZV9vcHRpb25zJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5
c3RlbS90ZW1wbGF0ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcywg
X3JlcXVpcmUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1Db21waWxlX29wdGlvbnMsIF9l
bWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSkgeworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBjb21waWxlOworCisgIC8qKgorICAgIFVzZXMgSFRNTEJhcnMg
YGNvbXBpbGVgIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBzdHJpbmcgaW50byBhIGNvbXBpbGVkIHRl
bXBsYXRlLgorICAKKyAgICBUaGlzIGlzIG5vdCBwcmVzZW50IGluIHByb2R1Y3Rpb24gYnVpbGRz
LgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgY29tcGlsZQorICAgIEBwYXJhbSB7U3Ry
aW5nfSB0ZW1wbGF0ZVN0cmluZyBUaGlzIGlzIHRoZSBzdHJpbmcgdG8gYmUgY29tcGlsZWQgYnkg
SFRNTEJhcnMuCisgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhpcyBpcyBhbiBvcHRpb25z
IGhhc2ggdG8gYXVnbWVudCB0aGUgY29tcGlsZXIgb3B0aW9ucy4KKyAgKi8KKworICBleHBvcnRz
LmRlZmF1bHQgPSBmdW5jdGlvbiAodGVtcGxhdGVTdHJpbmcsIG9wdGlvbnMpIHsKKyAgICBpZiAo
IWNvbXBpbGUgJiYgX3JlcXVpcmUuaGFzKCdodG1sYmFycy1jb21waWxlci9jb21waWxlcicpKSB7
CisgICAgICBjb21waWxlID0gX3JlcXVpcmUuZGVmYXVsdCgnaHRtbGJhcnMtY29tcGlsZXIvY29t
cGlsZXInKS5jb21waWxlOworICAgIH0KKworICAgIGlmICghY29tcGlsZSkgeworICAgICAgdGhy
b3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBgY29tcGlsZWAgd2l0aG91dCB0aGUgdGVtcGxhdGUg
Y29tcGlsZXIgbG9hZGVkLiBQbGVhc2UgbG9hZCBgZW1iZXItdGVtcGxhdGUtY29tcGlsZXIuanNg
IHByaW9yIHRvIGNhbGxpbmcgYGNvbXBpbGVgLicpOworICAgIH0KKworICAgIHZhciB0ZW1wbGF0
ZVNwZWMgPSBjb21waWxlKHRlbXBsYXRlU3RyaW5nLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lz
dGVtQ29tcGlsZV9vcHRpb25zLmRlZmF1bHQob3B0aW9ucykpOworCisgICAgcmV0dXJuIF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZS5kZWZhdWx0KHRlbXBsYXRlU3BlYyk7Cisg
IH07Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NvbXBpbGVf
b3B0aW9ucycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIvcGx1Z2lucyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3Np
Z24sIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGUtY29tcGlsZXIKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgdmFyIGNvbXBpbGVPcHRpb25zID0gdW5kZWZpbmVkOworICB2YXIgZnJh
Z21lbnRSZWFzb24gPSB1bmRlZmluZWQ7CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAcHJv
cGVydHkgY29tcGlsZU9wdGlvbnMKKyAgKi8KKyAgY29tcGlsZU9wdGlvbnMgPSBmdW5jdGlvbiAo
X29wdGlvbnMpIHsKKyAgICB2YXIgZGlzYWJsZUNvbXBvbmVudEdlbmVyYXRpb24gPSB0cnVlOwor
CisgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CisgICAgLy8gV2hlbiBjYWxsaW5nIGBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoKWAgYSBzZWNvbmQgYXJndW1lbnQgb2YgYHRydWVgCisgICAg
Ly8gaGFkIGEgc3BlY2lhbCBtZWFuaW5nIChsb25nIHNpbmNlIGxvc3QpLCB0aGlzIGp1c3QgZ2F1
cmRzIGFnYWluc3QKKyAgICAvLyBgb3B0aW9uc2AgYmVpbmcgdHJ1ZSwgYW5kIGNhdXNpbmcgYW4g
ZXJyb3IgZHVyaW5nIGNvbXBpbGF0aW9uLgorICAgIGlmIChfb3B0aW9ucyA9PT0gdHJ1ZSkgewor
ICAgICAgb3B0aW9ucyA9IHt9OworICAgIH0gZWxzZSB7CisgICAgICBvcHRpb25zID0gX2VtYmVy
TWV0YWxBc3NpZ24uZGVmYXVsdCh7fSwgX29wdGlvbnMpOworICAgIH0KKworICAgIG9wdGlvbnMu
ZGlzYWJsZUNvbXBvbmVudEdlbmVyYXRpb24gPSBkaXNhYmxlQ29tcG9uZW50R2VuZXJhdGlvbjsK
KworICAgIHZhciBwbHVnaW5zID0geworICAgICAgYXN0OiBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVy
UGx1Z2lucy5kZWZhdWx0LmFzdC5zbGljZSgpCisgICAgfTsKKworICAgIGlmIChvcHRpb25zLnBs
dWdpbnMgJiYgb3B0aW9ucy5wbHVnaW5zLmFzdCkgeworICAgICAgcGx1Z2lucy5hc3QgPSBwbHVn
aW5zLmFzdC5jb25jYXQob3B0aW9ucy5wbHVnaW5zLmFzdCk7CisgICAgfQorICAgIG9wdGlvbnMu
cGx1Z2lucyA9IHBsdWdpbnM7CisKKyAgICBvcHRpb25zLmJ1aWxkTWV0YSA9IGZ1bmN0aW9uIGJ1
aWxkTWV0YShwcm9ncmFtKSB7CisgICAgICByZXR1cm4geworICAgICAgICBmcmFnbWVudFJlYXNv
bjogZnJhZ21lbnRSZWFzb24ocHJvZ3JhbSksCisgICAgICAgIHJldmlzaW9uOiAnRW1iZXJAMi42
LjInLAorICAgICAgICBsb2M6IHByb2dyYW0ubG9jLAorICAgICAgICBtb2R1bGVOYW1lOiBvcHRp
b25zLm1vZHVsZU5hbWUKKyAgICAgIH07CisgICAgfTsKKworICAgIHJldHVybiBvcHRpb25zOwor
ICB9OworCisgIGZyYWdtZW50UmVhc29uID0gZnVuY3Rpb24gKHByb2dyYW0pIHsKKyAgICB2YXIg
bG9jID0gcHJvZ3JhbS5sb2M7CisgICAgdmFyIGJvZHkgPSBwcm9ncmFtLmJvZHk7CisKKyAgICBp
ZiAoIWxvYyB8fCBsb2Muc3RhcnQubGluZSAhPT0gMSB8fCBsb2Muc3RhcnQuY29sdW1uICE9PSAw
KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFyIGNhbmRpZGF0ZSA9IHVu
ZGVmaW5lZDsKKyAgICB2YXIgbm9kZUNvdW50ID0gMDsKKworICAgIHZhciBwcm9ibGVtcyA9IHt9
OworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgdmFyIGN1cnIgPSBib2R5W2ldOworCisgICAgICAvLyB0ZXh0IG5vZGUgd2l0aCB3aGl0
ZXNwYWNlIG9ubHkKKyAgICAgIGlmIChjdXJyLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgL15bXHNd
KiQvLnRlc3QoY3Vyci5jaGFycykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAg
ICAgIC8vIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzIGlmIHdlJ3ZlIGJlZW4gaGVyZSBiZWZv
cmUKKyAgICAgIGlmIChub2RlQ291bnQrKyA+IDApIHsKKyAgICAgICAgcHJvYmxlbXNbJ211bHRp
cGxlLW5vZGVzJ10gPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoY3Vyci50eXBlID09PSAn
Q29tcG9uZW50Tm9kZScgfHwgY3Vyci50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7CisgICAgICAg
IGNhbmRpZGF0ZSA9IGN1cnI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcm9ibGVtc1snd3Jv
bmctdHlwZSddID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobm9kZUNvdW50ID09
PSAwKSB7CisgICAgICByZXR1cm4geyBuYW1lOiAnbWlzc2luZy13cmFwcGVyJywgcHJvYmxlbXM6
IFsnZW1wdHktYm9keSddIH07CisgICAgfQorCisgICAgdmFyIHByb2JsZW1MaXN0ID0gT2JqZWN0
LmtleXMocHJvYmxlbXMpOworICAgIGlmIChwcm9ibGVtTGlzdC5sZW5ndGgpIHsKKyAgICAgIHJl
dHVybiB7IG5hbWU6ICdtaXNzaW5nLXdyYXBwZXInLCBwcm9ibGVtczogcHJvYmxlbUxpc3QgfTsK
KyAgICB9CisKKyAgICBpZiAoY2FuZGlkYXRlLnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgewor
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlLm1vZGlmaWVycy5s
ZW5ndGgpIHsKKyAgICAgIHJldHVybiB7IG5hbWU6ICdtb2RpZmllcnMnLCBtb2RpZmllcnM6IGNh
bmRpZGF0ZS5tb2RpZmllcnMubWFwKGZ1bmN0aW9uIChtKSB7CisgICAgICAgICAgcmV0dXJuIG0u
cGF0aC5vcmlnaW5hbDsKKyAgICAgICAgfSkgfTsKKyAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5h
dHRyaWJ1dGVzLnNvbWUoZnVuY3Rpb24gKGF0dHIpIHsKKyAgICAgIHJldHVybiAhYXR0ci52YWx1
ZS5lc2NhcGVkOworICAgIH0pKSB7CisgICAgICByZXR1cm4geyBuYW1lOiAndHJpcGxlLWN1cmxp
ZXMnIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gY29tcGlsZU9wdGlvbnM7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL3ByZWNvbXBpbGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
bWV0YWwvZmVhdHVyZXMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0
ZW0vY29tcGlsZV9vcHRpb25zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEZlYXR1
cmVzLCBfcmVxdWlyZSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0aW9u
cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBjb21waWxlU3BlYzsK
KworICAvKioKKyAgICBVc2VzIEhUTUxCYXJzIGBjb21waWxlYCBmdW5jdGlvbiB0byBwcm9jZXNz
IGEgc3RyaW5nIGludG8gYSBjb21waWxlZCB0ZW1wbGF0ZSBzdHJpbmcuCisgICAgVGhlIHJldHVy
bmVkIHN0cmluZyBtdXN0IGJlIHBhc3NlZCB0aHJvdWdoIGBFbWJlci5IVE1MQmFycy50ZW1wbGF0
ZWAuCisgIAorICAgIFRoaXMgaXMgbm90IHByZXNlbnQgaW4gcHJvZHVjdGlvbiBidWlsZHMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBwcmVjb21waWxlCisgICAgQHBhcmFtIHtTdHJp
bmd9IHRlbXBsYXRlU3RyaW5nIFRoaXMgaXMgdGhlIHN0cmluZyB0byBiZSBjb21waWxlZCBieSBI
VE1MQmFycy4KKyAgKi8KKworICBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAodGVtcGxhdGVT
dHJpbmcsIG9wdGlvbnMpIHsKKyAgICBpZiAoIWNvbXBpbGVTcGVjICYmIF9yZXF1aXJlLmhhcygn
aHRtbGJhcnMtY29tcGlsZXIvY29tcGlsZXInKSkgeworICAgICAgY29tcGlsZVNwZWMgPSBfcmVx
dWlyZS5kZWZhdWx0KCdodG1sYmFycy1jb21waWxlci9jb21waWxlcicpLmNvbXBpbGVTcGVjOwor
ICAgIH0KKworICAgIGlmICghY29tcGlsZVNwZWMpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcign
Q2Fubm90IGNhbGwgYGNvbXBpbGVTcGVjYCB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBjb21waWxlciBs
b2FkZWQuIFBsZWFzZSBsb2FkIGBlbWJlci10ZW1wbGF0ZS1jb21waWxlci5qc2AgcHJpb3IgdG8g
Y2FsbGluZyBgY29tcGlsZVNwZWNgLicpOworICAgIH0KKworICAgIHJldHVybiBjb21waWxlU3Bl
Yyh0ZW1wbGF0ZVN0cmluZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0
aW9ucy5kZWZhdWx0KG9wdGlvbnMpKTsKKyAgfTsKK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9zeXN0ZW0vdGVtcGxhdGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZmVh
dHVyZXMnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJl
cywgX3JlcXVpcmUyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisKKyAgLyoqCisg
ICAgQXVnbWVudHMgdGhlIGRlZmF1bHQgcHJlY29tcGlsZWQgb3V0cHV0IG9mIGFuIEhUTUxCYXJz
IHRlbXBsYXRlIHdpdGgKKyAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCBieSBFbWJl
ci4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRlbXBsYXRlCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gdGVtcGxhdGVTcGVjIFRoaXMgaXMgdGhlIGNvbXBpbGVkIEhUTUxCYXJzIHRlbXBs
YXRlIHNwZWMuCisgICovCisKKyAgdmFyIHRlbXBsYXRlID0gdW5kZWZpbmVkOworCisgIHZhciBf
cmVxdWlyZSA9IF9yZXF1aXJlMi5kZWZhdWx0KCdodG1sYmFycy1ydW50aW1lL2hvb2tzJyk7CisK
KyAgdmFyIHdyYXAgPSBfcmVxdWlyZS53cmFwOworCisgIHRlbXBsYXRlID0gZnVuY3Rpb24gKHRl
bXBsYXRlU3BlYykgeworICAgIGlmICghdGVtcGxhdGVTcGVjLnJlbmRlcikgeworICAgICAgdGVt
cGxhdGVTcGVjID0gd3JhcCh0ZW1wbGF0ZVNwZWMpOworICAgIH0KKworICAgIHRlbXBsYXRlU3Bl
Yy5pc1RvcCA9IHRydWU7CisgICAgdGVtcGxhdGVTcGVjLmlzTWV0aG9kID0gZmFsc2U7CisKKyAg
ICByZXR1cm4gdGVtcGxhdGVTcGVjOworICB9OworICBleHBvcnRzLmRlZmF1bHQgPSB0ZW1wbGF0
ZTsKK30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2FkYXB0ZXJzL2FkYXB0ZXInLCBbJ2V4cG9y
dHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlv
biBLKCkgeworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICBAbW9kdWxlIGVtYmVy
CisgICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICAvKioKKyAgICBUaGUgcHJp
bWFyeSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gY3JlYXRlIGhvb2tzIHRoYXQgY2FuIGJl
IGltcGxlbWVudGVkCisgICAgYnkgYW4gYWRhcHRlciBmb3IgdmFyaW91cyB0ZXN0IGZyYW1ld29y
a3MuCisgIAorICAgIEBjbGFzcyBBZGFwdGVyCisgICAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Cisg
ICAgQHB1YmxpYworICAqLworICB2YXIgQWRhcHRlciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmpl
Y3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qKgorICAgICAgVGhpcyBjYWxsYmFjayB3aWxsIGJl
IGNhbGxlZCB3aGVuZXZlciBhbiBhc3luYyBvcGVyYXRpb24gaXMgYWJvdXQgdG8gc3RhcnQuCisg
ICAgICAgT3ZlcnJpZGUgdGhpcyB0byBjYWxsIHlvdXIgZnJhbWV3b3JrJ3MgbWV0aG9kcyB0aGF0
IGhhbmRsZSBhc3luYworICAgICAgb3BlcmF0aW9ucy4KKyAgICAgICBAcHVibGljCisgICAgICBA
bWV0aG9kIGFzeW5jU3RhcnQKKyAgICAqLworICAgIGFzeW5jU3RhcnQ6IEssCisKKyAgICAvKioK
KyAgICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5bmMgb3Bl
cmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBhc3lu
Y0VuZAorICAgICovCisgICAgYXN5bmNFbmQ6IEssCisKKyAgICAvKioKKyAgICAgIE92ZXJyaWRl
IHRoaXMgbWV0aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1ld29yaydzIGZhbHNlIGFzc2VydGlv
bi4KKyAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBv
Y2N1cnMgY2F1c2luZyB0aGUgdGVzdGluZworICAgICAgcHJvbWlzZSB0byBmYWlsLgorICAgICAg
IFFVbml0IGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICBleGNlcHRpb246
IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgICAgb2soZmFsc2UsIGVycm9yKTsKKyAgICAgICAg
fTsKKyAgICAgIGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBtZXRob2QgZXhjZXB0aW9uCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCisg
ICAgKi8KKyAgICBleGNlcHRpb246IGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgdGhyb3cgZXJy
b3I7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBBZGFwdGVyOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlc3RpbmcvYWRhcHRlcnMvcXVuaXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
dGVzdGluZy9hZGFwdGVycy9hZGFwdGVyJywgJ2VtYmVyLW1ldGFsL3V0aWxzJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJUZXN0aW5nQWRhcHRlcnNBZGFwdGVyLCBfZW1iZXJNZXRhbFV0aWxz
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMg
dGhlIG1ldGhvZHMgZGVmaW5lZCBieSBFbWJlci5UZXN0LkFkYXB0ZXIgZm9yIHRoZQorICAgIFFV
bml0IHRlc3RpbmcgZnJhbWV3b3JrLgorICAKKyAgICBAY2xhc3MgUVVuaXRBZGFwdGVyCisgICAg
QG5hbWVzcGFjZSBFbWJlci5UZXN0CisgICAgQGV4dGVuZHMgRW1iZXIuVGVzdC5BZGFwdGVyCisg
ICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZXN0aW5nQWRhcHRl
cnNBZGFwdGVyLmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBhc3luY1N0YXJ0OiBmdW5jdGlvbiAoKSB7
CisgICAgICBRVW5pdC5zdG9wKCk7CisgICAgfSwKKyAgICBhc3luY0VuZDogZnVuY3Rpb24gKCkg
eworICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICB9LAorICAgIGV4Y2VwdGlvbjogZnVuY3Rpb24g
KGVycm9yKSB7CisgICAgICBvayhmYWxzZSwgX2VtYmVyTWV0YWxVdGlscy5pbnNwZWN0KGVycm9y
KSk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2hlbHBlcnMnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAn
ZW1iZXItdGVzdGluZy90ZXN0JywgJ2VtYmVyLXJ1bnRpbWUvZXh0L3JzdnAnLCAnZW1iZXItbWV0
YWwvZmVhdHVyZXMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJWaWV3c1N5c3Rl
bUpxdWVyeSwgX2VtYmVyVGVzdGluZ1Rlc3QsIF9lbWJlclJ1bnRpbWVFeHRSc3ZwLCBfZW1iZXJN
ZXRhbEZlYXR1cmVzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICB2YXIgaGVscGVyID0gX2Vt
YmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC5yZWdpc3RlckhlbHBlcjsKKyAgdmFyIGFzeW5jSGVscGVy
ID0gX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC5yZWdpc3RlckFzeW5jSGVscGVyOworCisgIHZh
ciBrZXlib2FyZEV2ZW50VHlwZXMsIG1vdXNlRXZlbnRUeXBlcywgYnVpbGRLZXlib2FyZEV2ZW50
LCBidWlsZE1vdXNlRXZlbnQsIGJ1aWxkQmFzaWNFdmVudCwgZmlyZUV2ZW50LCBmb2N1czsKKwor
ICB2YXIgZGVmYXVsdEV2ZW50T3B0aW9ucyA9IHsgY2FuQnViYmxlOiB0cnVlLCBjYW5jZWxhYmxl
OiB0cnVlIH07CisgIGtleWJvYXJkRXZlbnRUeXBlcyA9IFsna2V5ZG93bicsICdrZXlwcmVzcycs
ICdrZXl1cCddOworICBtb3VzZUV2ZW50VHlwZXMgPSBbJ2NsaWNrJywgJ21vdXNlZG93bicsICdt
b3VzZXVwJywgJ2RibGNsaWNrJywgJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZScsICdtb3VzZW1v
dmUnLCAnbW91c2VvdXQnLCAnbW91c2VvdmVyJ107CisKKyAgYnVpbGRLZXlib2FyZEV2ZW50ID0g
ZnVuY3Rpb24gYnVpbGRLZXlib2FyZEV2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFy
Z3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDog
YXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gdW5kZWZpbmVkOworICAgIHRyeSB7Cisg
ICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdLZXlFdmVudHMnKTsKKyAgICAgIHZh
ciBldmVudE9wdHMgPSBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZCh7fSwg
ZGVmYXVsdEV2ZW50T3B0aW9ucywgb3B0aW9ucyk7CisgICAgICBldmVudC5pbml0S2V5RXZlbnQo
dHlwZSwgZXZlbnRPcHRzLmNhbkJ1YmJsZSwgZXZlbnRPcHRzLmNhbmNlbGFibGUsIHdpbmRvdywg
ZXZlbnRPcHRzLmN0cmxLZXksIGV2ZW50T3B0cy5hbHRLZXksIGV2ZW50T3B0cy5zaGlmdEtleSwg
ZXZlbnRPcHRzLm1ldGFLZXksIGV2ZW50T3B0cy5rZXlDb2RlLCBldmVudE9wdHMuY2hhckNvZGUp
OworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGV2ZW50ID0gYnVpbGRCYXNpY0V2ZW50KHR5cGUs
IG9wdGlvbnMpOworICAgIH0KKyAgICByZXR1cm4gZXZlbnQ7CisgIH07CisKKyAgYnVpbGRNb3Vz
ZUV2ZW50ID0gZnVuY3Rpb24gYnVpbGRNb3VzZUV2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9u
cyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/
IHt9IDogYXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gdW5kZWZpbmVkOworICAgIHRy
eSB7CisgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpOwor
ICAgICAgdmFyIGV2ZW50T3B0cyA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQuZXh0
ZW5kKHt9LCBkZWZhdWx0RXZlbnRPcHRpb25zLCBvcHRpb25zKTsKKyAgICAgIGV2ZW50LmluaXRN
b3VzZUV2ZW50KHR5cGUsIGV2ZW50T3B0cy5jYW5CdWJibGUsIGV2ZW50T3B0cy5jYW5jZWxhYmxl
LCB3aW5kb3csIGV2ZW50T3B0cy5kZXRhaWwsIGV2ZW50T3B0cy5zY3JlZW5YLCBldmVudE9wdHMu
c2NyZWVuWSwgZXZlbnRPcHRzLmNsaWVudFgsIGV2ZW50T3B0cy5jbGllbnRZLCBldmVudE9wdHMu
Y3RybEtleSwgZXZlbnRPcHRzLmFsdEtleSwgZXZlbnRPcHRzLnNoaWZ0S2V5LCBldmVudE9wdHMu
bWV0YUtleSwgZXZlbnRPcHRzLmJ1dHRvbiwgZXZlbnRPcHRzLnJlbGF0ZWRUYXJnZXQpOworICAg
IH0gY2F0Y2ggKGUpIHsKKyAgICAgIGV2ZW50ID0gYnVpbGRCYXNpY0V2ZW50KHR5cGUsIG9wdGlv
bnMpOworICAgIH0KKyAgICByZXR1cm4gZXZlbnQ7CisgIH07CisKKyAgYnVpbGRCYXNpY0V2ZW50
ID0gZnVuY3Rpb24gYnVpbGRCYXNpY0V2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFy
Z3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDog
YXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2
ZW50cycpOworICAgIGV2ZW50LmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKTsKKyAgICBfZW1i
ZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZChldmVudCwgb3B0aW9ucyk7CisgICAg
cmV0dXJuIGV2ZW50OworICB9OworCisgIGZpcmVFdmVudCA9IGZ1bmN0aW9uIGZpcmVFdmVudChl
bGVtZW50LCB0eXBlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIg
fHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1syXTsKKworICAg
IGlmICghZWxlbWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgZXZlbnQgPSB1
bmRlZmluZWQ7CisgICAgaWYgKGtleWJvYXJkRXZlbnRUeXBlcy5pbmRleE9mKHR5cGUpID4gLTEp
IHsKKyAgICAgIGV2ZW50ID0gYnVpbGRLZXlib2FyZEV2ZW50KHR5cGUsIG9wdGlvbnMpOworICAg
IH0gZWxzZSBpZiAobW91c2VFdmVudFR5cGVzLmluZGV4T2YodHlwZSkgPiAtMSkgeworICAgICAg
dmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICAgICAgdmFyIHgg
PSByZWN0LmxlZnQgKyAxOworICAgICAgdmFyIHkgPSByZWN0LnRvcCArIDE7CisgICAgICB2YXIg
c2ltdWxhdGVkQ29vcmRpbmF0ZXMgPSB7CisgICAgICAgIHNjcmVlblg6IHggKyA1LAorICAgICAg
ICBzY3JlZW5ZOiB5ICsgOTUsCisgICAgICAgIGNsaWVudFg6IHgsCisgICAgICAgIGNsaWVudFk6
IHkKKyAgICAgIH07CisgICAgICBldmVudCA9IGJ1aWxkTW91c2VFdmVudCh0eXBlLCBfZW1iZXJW
aWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZChzaW11bGF0ZWRDb29yZGluYXRlcywgb3B0
aW9ucykpOworICAgIH0gZWxzZSB7CisgICAgICBldmVudCA9IGJ1aWxkQmFzaWNFdmVudCh0eXBl
LCBvcHRpb25zKTsKKyAgICB9CisgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAg
fTsKKworICBmb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKGVsKSB7CisgICAgaWYgKCFlbCkgeworICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgJGVsID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnku
ZGVmYXVsdChlbCk7CisgICAgaWYgKCRlbC5pcygnOmlucHV0LCBbY29udGVudGVkaXRhYmxlPXRy
dWVdJykpIHsKKyAgICAgIHZhciB0eXBlID0gJGVsLnByb3AoJ3R5cGUnKTsKKyAgICAgIGlmICh0
eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdyYWRpbycgJiYgdHlwZSAhPT0gJ2hpZGRl
bicpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KG51bGwsIGZ1bmN0aW9u
ICgpIHsKKyAgICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IHRyaWdnZXIgdGhlIGBmb2N1c2lu
YCBldmVudCBpZiB0aGUgd2luZG93CisgICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSBmb2N1cy4g
SWYgdGhlIGRvY3VtZW50IGRvZXNuJ3QgaGF2ZSBmb2N1cyBqdXN0CisgICAgICAgICAgLy8gdXNl
IHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgorCisgICAgICAgICAgaWYgKCFkb2N1bWVudC5o
YXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICBlbC5mb2N1cygp
OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZWwudHJpZ2dlcignZm9jdXNpbicp
OworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9OworCisgIGZ1
bmN0aW9uIGN1cnJlbnRSb3V0ZU5hbWUoYXBwKSB7CisgICAgdmFyIHJvdXRpbmdTZXJ2aWNlID0g
YXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdzZXJ2aWNlOi1yb3V0aW5nJyk7CisKKyAgICByZXR1
cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRpbmdTZXJ2aWNlLCAnY3VycmVudFJv
dXRlTmFtZScpOworICB9CisKKyAgZnVuY3Rpb24gY3VycmVudFBhdGgoYXBwKSB7CisgICAgdmFy
IHJvdXRpbmdTZXJ2aWNlID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdzZXJ2aWNlOi1yb3V0
aW5nJyk7CisKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRpbmdT
ZXJ2aWNlLCAnY3VycmVudFBhdGgnKTsKKyAgfQorCisgIGZ1bmN0aW9uIGN1cnJlbnRVUkwoYXBw
KSB7CisgICAgdmFyIHJvdXRlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1cCgncm91dGVyOm1h
aW4nKTsKKworICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGVyLCAn
bG9jYXRpb24nKS5nZXRVUkwoKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhdXNlVGVzdCgpIHsKKyAg
ICBfZW1iZXJUZXN0aW5nVGVzdC5kZWZhdWx0LmFkYXB0ZXIuYXN5bmNTdGFydCgpOworICAgIHJl
dHVybiBuZXcgX2VtYmVyUnVudGltZUV4dFJzdnAuZGVmYXVsdC5Qcm9taXNlKGZ1bmN0aW9uICgp
IHt9LCAnVGVzdEFkYXB0ZXIgcGF1c2VkIHByb21pc2UnKTsKKyAgfQorCisgIGZ1bmN0aW9uIHZp
c2l0KGFwcCwgdXJsKSB7CisgICAgdmFyIHJvdXRlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1
cCgncm91dGVyOm1haW4nKTsKKyAgICB2YXIgc2hvdWxkSGFuZGxlVVJMID0gZmFsc2U7CisKKyAg
ICBhcHAuYm9vdCgpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgcm91dGVyLmxvY2F0aW9uLnNl
dFVSTCh1cmwpOworCisgICAgICBpZiAoc2hvdWxkSGFuZGxlVVJMKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsUnVuX2xvb3AuZGVmYXVsdChhcHAuX19kZXByZWNhdGVkSW5zdGFuY2VfXywgJ2hhbmRs
ZVVSTCcsIHVybCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoYXBwLl9yZWFkaW5lc3NE
ZWZlcnJhbHMgPiAwKSB7CisgICAgICByb3V0ZXJbJ2luaXRpYWxVUkwnXSA9IHVybDsKKyAgICAg
IF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChhcHAsICdhZHZhbmNlUmVhZGluZXNzJyk7Cisg
ICAgICBkZWxldGUgcm91dGVyWydpbml0aWFsVVJMJ107CisgICAgfSBlbHNlIHsKKyAgICAgIHNo
b3VsZEhhbmRsZVVSTCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVy
cy53YWl0KCk7CisgIH0KKworICBmdW5jdGlvbiBjbGljayhhcHAsIHNlbGVjdG9yLCBjb250ZXh0
KSB7CisgICAgdmFyICRlbCA9IGFwcC50ZXN0SGVscGVycy5maW5kV2l0aEFzc2VydChzZWxlY3Rv
ciwgY29udGV4dCk7CisgICAgdmFyIGVsID0gJGVsWzBdOworCisgICAgX2VtYmVyTWV0YWxSdW5f
bG9vcC5kZWZhdWx0KG51bGwsIGZpcmVFdmVudCwgZWwsICdtb3VzZWRvd24nKTsKKworICAgIGZv
Y3VzKGVsKTsKKworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxsLCBmaXJlRXZl
bnQsIGVsLCAnbW91c2V1cCcpOworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxs
LCBmaXJlRXZlbnQsIGVsLCAnY2xpY2snKTsKKworICAgIHJldHVybiBhcHAudGVzdEhlbHBlcnMu
d2FpdCgpOworICB9CisKKyAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGFwcCwgc2VsZWN0b3IsIGNv
bnRleHRPclR5cGUsIHR5cGVPck9wdGlvbnMsIHBvc3NpYmxlT3B0aW9ucykgeworICAgIHZhciBh
cml0eSA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgdmFyIGNvbnRleHQsIHR5cGUsIG9wdGlvbnM7
CisKKyAgICBpZiAoYXJpdHkgPT09IDMpIHsKKyAgICAgIC8vIGNvbnRleHQgYW5kIG9wdGlvbnMg
YXJlIG9wdGlvbmFsLCBzbyB0aGlzIGlzCisgICAgICAvLyBhcHAsIHNlbGVjdG9yLCB0eXBlCisg
ICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgIHR5cGUgPSBjb250ZXh0T3JUeXBlOworICAgICAg
b3B0aW9ucyA9IHt9OworICAgIH0gZWxzZSBpZiAoYXJpdHkgPT09IDQpIHsKKyAgICAgIC8vIGNv
bnRleHQgYW5kIG9wdGlvbnMgYXJlIG9wdGlvbmFsLCBzbyB0aGlzIGlzCisgICAgICBpZiAodHlw
ZW9mIHR5cGVPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7CisgICAgICAgIC8vIGVpdGhlcgorICAg
ICAgICAvLyBhcHAsIHNlbGVjdG9yLCB0eXBlLCBvcHRpb25zCisgICAgICAgIGNvbnRleHQgPSBu
dWxsOworICAgICAgICB0eXBlID0gY29udGV4dE9yVHlwZTsKKyAgICAgICAgb3B0aW9ucyA9IHR5
cGVPck9wdGlvbnM7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBvcgorICAgICAgICAvLyBh
cHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0eXBlCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0T3JU
eXBlOworICAgICAgICB0eXBlID0gdHlwZU9yT3B0aW9uczsKKyAgICAgICAgb3B0aW9ucyA9IHt9
OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb250ZXh0ID0gY29udGV4dE9yVHlwZTsK
KyAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zOworICAgICAgb3B0aW9ucyA9IHBvc3NpYmxlT3B0
aW9uczsKKyAgICB9CisKKyAgICB2YXIgJGVsID0gYXBwLnRlc3RIZWxwZXJzLmZpbmRXaXRoQXNz
ZXJ0KHNlbGVjdG9yLCBjb250ZXh0KTsKKyAgICB2YXIgZWwgPSAkZWxbMF07CisKKyAgICBfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQobnVsbCwgZmlyZUV2ZW50LCBlbCwgdHlwZSwgb3B0aW9u
cyk7CisKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLndhaXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGtleUV2ZW50KGFwcCwgc2VsZWN0b3IsIGNvbnRleHRPclR5cGUsIHR5cGVPcktleUNvZGUs
IGtleUNvZGUpIHsKKyAgICB2YXIgY29udGV4dCwgdHlwZTsKKworICAgIGlmICh0eXBlb2Yga2V5
Q29kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAga2V5
Q29kZSA9IHR5cGVPcktleUNvZGU7CisgICAgICB0eXBlID0gY29udGV4dE9yVHlwZTsKKyAgICB9
IGVsc2UgeworICAgICAgY29udGV4dCA9IGNvbnRleHRPclR5cGU7CisgICAgICB0eXBlID0gdHlw
ZU9yS2V5Q29kZTsKKyAgICB9CisKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLnRyaWdnZXJF
dmVudChzZWxlY3RvciwgY29udGV4dCwgdHlwZSwgeyBrZXlDb2RlOiBrZXlDb2RlLCB3aGljaDog
a2V5Q29kZSB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbGxJbihhcHAsIHNlbGVjdG9yLCBjb250
ZXh0T3JUZXh0LCB0ZXh0KSB7CisgICAgdmFyICRlbCwgZWwsIGNvbnRleHQ7CisgICAgaWYgKHR5
cGVvZiB0ZXh0ID09PSAndW5kZWZpbmVkJykgeworICAgICAgdGV4dCA9IGNvbnRleHRPclRleHQ7
CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRleHQgPSBjb250ZXh0T3JUZXh0OworICAgIH0KKyAg
ICAkZWwgPSBhcHAudGVzdEhlbHBlcnMuZmluZFdpdGhBc3NlcnQoc2VsZWN0b3IsIGNvbnRleHQp
OworICAgIGVsID0gJGVsWzBdOworICAgIGZvY3VzKGVsKTsKKyAgICBfZW1iZXJNZXRhbFJ1bl9s
b29wLmRlZmF1bHQoZnVuY3Rpb24gKCkgeworICAgICAgJGVsLnZhbCh0ZXh0KTsKKyAgICAgIGZp
cmVFdmVudChlbCwgJ2lucHV0Jyk7CisgICAgICBmaXJlRXZlbnQoZWwsICdjaGFuZ2UnKTsKKyAg
ICB9KTsKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLndhaXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGZpbmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgJGVs
ID0gYXBwLnRlc3RIZWxwZXJzLmZpbmQoc2VsZWN0b3IsIGNvbnRleHQpOworICAgIGlmICgkZWwu
bGVuZ3RoID09PSAwKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0
KCdFbGVtZW50ICcgKyBzZWxlY3RvciArICcgbm90IGZvdW5kLicpOworICAgIH0KKyAgICByZXR1
cm4gJGVsOworICB9CisKKyAgZnVuY3Rpb24gZmluZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7
CisgICAgdmFyICRlbDsKKyAgICBjb250ZXh0ID0gY29udGV4dCB8fCBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQoYXBwLCAncm9vdEVsZW1lbnQnKTsKKyAgICAkZWwgPSBhcHAuJChzZWxlY3Rv
ciwgY29udGV4dCk7CisKKyAgICByZXR1cm4gJGVsOworICB9CisKKyAgZnVuY3Rpb24gYW5kVGhl
bihhcHAsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVycy53YWl0KGNhbGxi
YWNrKGFwcCkpOworICB9CisKKyAgZnVuY3Rpb24gd2FpdChhcHAsIHZhbHVlKSB7CisgICAgcmV0
dXJuIG5ldyBfZW1iZXJSdW50aW1lRXh0UnN2cC5kZWZhdWx0LlByb21pc2UoZnVuY3Rpb24gKHJl
c29sdmUpIHsKKyAgICAgIHZhciByb3V0ZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ3Jv
dXRlcjptYWluJyk7CisKKyAgICAgIC8vIEV2ZXJ5IDEwbXMsIHBvbGwgZm9yIHRoZSBhc3luYyB0
aGluZyB0byBoYXZlIGZpbmlzaGVkCisgICAgICB2YXIgd2F0Y2hlciA9IHNldEludGVydmFsKGZ1
bmN0aW9uICgpIHsKKyAgICAgICAgLy8gMS4gSWYgdGhlIHJvdXRlciBpcyBsb2FkaW5nLCBrZWVw
IHBvbGxpbmcKKyAgICAgICAgdmFyIHJvdXRlcklzTG9hZGluZyA9IHJvdXRlci5yb3V0ZXIgJiYg
ISFyb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5zaXRpb247CisgICAgICAgIGlmIChyb3V0ZXJJc0xv
YWRpbmcpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiBJ
ZiB0aGVyZSBhcmUgcGVuZGluZyBBamF4IHJlcXVlc3RzLCBrZWVwIHBvbGxpbmcKKyAgICAgICAg
aWYgKF9lbWJlclRlc3RpbmdUZXN0LmRlZmF1bHQucGVuZGluZ0FqYXhSZXF1ZXN0cykgeworICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDMuIElmIHRoZXJlIGFyZSBz
Y2hlZHVsZWQgdGltZXJzIG9yIHdlIGFyZSBpbnNpZGUgb2YgYSBydW4gbG9vcCwga2VlcCBwb2xs
aW5nCisgICAgICAgIGlmIChfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuaGFzU2NoZWR1bGVk
VGltZXJzKCkgfHwgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmN1cnJlbnRSdW5Mb29wKSB7
CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChfZW1iZXJUZXN0aW5n
VGVzdC5kZWZhdWx0LndhaXRlcnMgJiYgX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC53YWl0ZXJz
LmFueShmdW5jdGlvbiAod2FpdGVyKSB7CisgICAgICAgICAgdmFyIGNvbnRleHQgPSB3YWl0ZXJb
MF07CisgICAgICAgICAgdmFyIGNhbGxiYWNrID0gd2FpdGVyWzFdOworICAgICAgICAgIHJldHVy
biAhY2FsbGJhY2suY2FsbChjb250ZXh0KTsKKyAgICAgICAgfSkpIHsKKyAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RvcCBwb2xsaW5nCisgICAgICAgIGNsZWFySW50
ZXJ2YWwod2F0Y2hlcik7CisKKyAgICAgICAgLy8gU3luY2hyb25vdXNseSByZXNvbHZlIHRoZSBw
cm9taXNlCisgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxsLCByZXNvbHZl
LCB2YWx1ZSk7CisgICAgICB9LCAxMCk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBMb2Fk
cyBhIHJvdXRlLCBzZXRzIHVwIGFueSBjb250cm9sbGVycywgYW5kIHJlbmRlcnMgYW55IHRlbXBs
YXRlcyBhc3NvY2lhdGVkCisgICAgd2l0aCB0aGUgcm91dGUgYXMgdGhvdWdoIGEgcmVhbCB1c2Vy
IGhhZCB0cmlnZ2VyZWQgdGhlIHJvdXRlIGNoYW5nZSB3aGlsZQorICAgIHVzaW5nIHlvdXIgYXBw
LgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmlzaXQoJ3Bv
c3RzL2luZGV4JykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgIC8vIGFzc2VydCBzb21ldGhpbmcK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCB2aXNpdAorICAgIEBwYXJhbSB7U3Ry
aW5nfSB1cmwgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNl
fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ3Zpc2l0JywgdmlzaXQpOworCisg
IC8qKgorICAgIENsaWNrcyBhbiBlbGVtZW50IGFuZCB0cmlnZ2VycyBhbnkgYWN0aW9ucyB0cmln
Z2VyZWQgYnkgdGhlIGVsZW1lbnQncyBgY2xpY2tgCisgICAgZXZlbnQuCisgIAorICAgIEV4YW1w
bGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBjbGljaygnLnNvbWUtalF1ZXJ5LXNlbGVj
dG9yJykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgIC8vIGFzc2VydCBzb21ldGhpbmcKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjbGljaworICAgIEBwYXJhbSB7U3RyaW5nfSBz
ZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisg
ICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxw
ZXIoJ2NsaWNrJywgY2xpY2spOworCisgIC8qKgorICAgIFNpbXVsYXRlcyBhIGtleSBldmVudCwg
ZS5nLiBga2V5cHJlc3NgLCBga2V5ZG93bmAsIGBrZXl1cGAgd2l0aCB0aGUgZGVzaXJlZCBrZXlD
b2RlCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBrZXlFdmVu
dCgnLnNvbWUtalF1ZXJ5LXNlbGVjdG9yJywgJ2tleXByZXNzJywgMTMpLnRoZW4oZnVuY3Rpb24o
KSB7CisgICAgIC8vIGFzc2VydCBzb21ldGhpbmcKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBrZXlFdmVudAorICAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2Vs
ZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisgICAgQHBhcmFtIHtTdHJpbmd9
IHR5cGUgdGhlIHR5cGUgb2Yga2V5IGV2ZW50LCBlLmcuIGBrZXlwcmVzc2AsIGBrZXlkb3duYCwg
YGtleXVwYAorICAgIEBwYXJhbSB7TnVtYmVyfSBrZXlDb2RlIHRoZSBrZXlDb2RlIG9mIHRoZSBz
aW11bGF0ZWQga2V5IGV2ZW50CisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBzaW5j
ZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ2tleUV2ZW50Jywga2V5
RXZlbnQpOworCisgIC8qKgorICAgIEZpbGxzIGluIGFuIGlucHV0IGVsZW1lbnQgd2l0aCBzb21l
IHRleHQuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBmaWxs
SW4oJyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20nKS50aGVuKGZ1bmN0aW9uKCkgeworICAgICAg
Ly8gYXNzZXJ0IHNvbWV0aGluZworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZp
bGxJbgorICAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZmluZGlu
ZyBhbiBpbnB1dCBlbGVtZW50IG9uIHRoZSBET00KKyAgICB0byBmaWxsIHRleHQgd2l0aAorICAg
IEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRoZSBpbnB1dCBlbGVt
ZW50CisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5
bmNIZWxwZXIoJ2ZpbGxJbicsIGZpbGxJbik7CisKKyAgLyoqCisgICAgRmluZHMgYW4gZWxlbWVu
dCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXBwJ3MgY29udGFpbmVyIGVsZW1lbnQuIEEgc2ltcGxl
IGFsaWFzCisgICAgZm9yIGBhcHAuJChzZWxlY3RvcilgLgorICAKKyAgICBFeGFtcGxlOgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyICRlbCA9IGZpbmQoJy5teS1zZWxlY3RvcicpOwor
ICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbmQKKyAgICBAcGFyYW0ge1N0cmluZ30gc2VsZWN0
b3IgalF1ZXJ5IHN0cmluZyBzZWxlY3RvciBmb3IgZWxlbWVudCBsb29rdXAKKyAgICBAcmV0dXJu
IHtPYmplY3R9IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIHRoZSBx
dWVyeQorICAgIEBwdWJsaWMKKyAgKi8KKyAgaGVscGVyKCdmaW5kJywgZmluZCk7CisKKyAgLyoq
CisgICAgTGlrZSBgZmluZGAsIGJ1dCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgc2Vs
ZWN0b3IgcmV0dXJucyBubyByZXN1bHRzLgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KCcuZG9lc250LWV4aXN0Jyk7
IC8vIHRocm93cyBlcnJvcgorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbmRXaXRoQXNzZXJ0
CisgICAgQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxlY3RvciBzdHJpbmcgZm9y
IGZpbmRpbmcgYW4gZWxlbWVudCB3aXRoaW4KKyAgICB0aGUgRE9NCisgICAgQHJldHVybiB7T2Jq
ZWN0fSBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkK
KyAgICBAdGhyb3dzIHtFcnJvcn0gdGhyb3dzIGVycm9yIGlmIGpRdWVyeSBvYmplY3QgcmV0dXJu
ZWQgaGFzIGEgbGVuZ3RoIG9mIDAKKyAgICBAcHVibGljCisgICovCisgIGhlbHBlcignZmluZFdp
dGhBc3NlcnQnLCBmaW5kV2l0aEFzc2VydCk7CisKKyAgLyoqCisgICAgQ2F1c2VzIHRoZSBydW4g
bG9vcCB0byBwcm9jZXNzIGFueSBwZW5kaW5nIGV2ZW50cy4gVGhpcyBpcyB1c2VkIHRvIGVuc3Vy
ZSB0aGF0CisgICAgYW55IGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBvdGhlciBoZWxwZXJzIChvciB5
b3VyIGFzc2VydGlvbnMpIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgIAorICAgIFRoaXMgaXMgbW9z
dCBvZnRlbiB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBoZWxwZXIgZnVuY3Rpb25z
IChzZWUgJ2NsaWNrJywKKyAgICAnZmlsbEluJywndmlzaXQnLGV0YykuCisgIAorICAgIEV4YW1w
bGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNI
ZWxwZXIoJ2xvZ2luVXNlcicsIGZ1bmN0aW9uKGFwcCwgdXNlcm5hbWUsIHBhc3N3b3JkKSB7Cisg
ICAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUnKQorICAgICAgLmZpbGxJbignI3VzZXJuYW1l
JywgdXNlcm5hbWUpCisgICAgICAuZmlsbEluKCcjcGFzc3dvcmQnLCBwYXNzd29yZCkKKyAgICAg
IC5jbGljaygnLnN1Ym1pdCcpCisgIAorICAgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVycy53YWl0
KCk7CisgICAgfSk7CisgIAorICAgIEBtZXRob2Qgd2FpdAorICAgIEBwYXJhbSB7T2JqZWN0fSB2
YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNl
fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ3dhaXQnLCB3YWl0KTsKKyAgYXN5
bmNIZWxwZXIoJ2FuZFRoZW4nLCBhbmRUaGVuKTsKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBj
dXJyZW50bHkgYWN0aXZlIHJvdXRlIG5hbWUuCisgIAorICBFeGFtcGxlOgorICAKKyAgYGBgamF2
YXNjcmlwdAorICBmdW5jdGlvbiB2YWxpZGF0ZVJvdXRlTmFtZSgpIHsKKyAgICBlcXVhbChjdXJy
ZW50Um91dGVOYW1lKCksICdzb21lLnBhdGgnLCAiY29ycmVjdCByb3V0ZSB3YXMgdHJhbnNpdGlv
bmVkIGludG8uIik7CisgIH0KKyAgCisgIHZpc2l0KCcvc29tZS9wYXRoJykudGhlbih2YWxpZGF0
ZVJvdXRlTmFtZSkKKyAgYGBgCisgIAorICBAbWV0aG9kIGN1cnJlbnRSb3V0ZU5hbWUKKyAgQHJl
dHVybiB7T2JqZWN0fSBUaGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0ZS4KKyAg
QHNpbmNlIDEuNS4wCisgIEBwdWJsaWMKKyAgKi8KKyAgaGVscGVyKCdjdXJyZW50Um91dGVOYW1l
JywgY3VycmVudFJvdXRlTmFtZSk7CisKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBw
YXRoLgorICAKKyAgRXhhbXBsZToKKyAgCisgIGBgYGphdmFzY3JpcHQKKyAgZnVuY3Rpb24gdmFs
aWRhdGVVUkwoKSB7CisgICAgZXF1YWwoY3VycmVudFBhdGgoKSwgJ3NvbWUucGF0aC5pbmRleCcs
ICJjb3JyZWN0IHBhdGggd2FzIHRyYW5zaXRpb25lZCBpbnRvLiIpOworICB9CisgIAorICBjbGlj
aygnI3NvbWUtbGluay1pZCcpLnRoZW4odmFsaWRhdGVVUkwpOworICBgYGAKKyAgCisgIEBtZXRo
b2QgY3VycmVudFBhdGgKKyAgQHJldHVybiB7T2JqZWN0fSBUaGUgY3VycmVudGx5IGFjdGl2ZSBw
YXRoLgorICBAc2luY2UgMS41LjAKKyAgQHB1YmxpYworICAqLworICBoZWxwZXIoJ2N1cnJlbnRQ
YXRoJywgY3VycmVudFBhdGgpOworCisgIC8qKgorICAgIFJldHVybnMgdGhlIGN1cnJlbnQgVVJM
LgorICAKKyAgRXhhbXBsZToKKyAgCisgIGBgYGphdmFzY3JpcHQKKyAgZnVuY3Rpb24gdmFsaWRh
dGVVUkwoKSB7CisgICAgZXF1YWwoY3VycmVudFVSTCgpLCAnL3NvbWUvcGF0aCcsICJjb3JyZWN0
IFVSTCB3YXMgdHJhbnNpdGlvbmVkIGludG8uIik7CisgIH0KKyAgCisgIGNsaWNrKCcjc29tZS1s
aW5rLWlkJykudGhlbih2YWxpZGF0ZVVSTCk7CisgIGBgYAorICAKKyAgQG1ldGhvZCBjdXJyZW50
VVJMCisgIEByZXR1cm4ge09iamVjdH0gVGhlIGN1cnJlbnRseSBhY3RpdmUgVVJMLgorICBAc2lu
Y2UgMS41LjAKKyAgQHB1YmxpYworICAqLworICBoZWxwZXIoJ2N1cnJlbnRVUkwnLCBjdXJyZW50
VVJMKTsKKworICAvKioKKyAgIFBhdXNlcyB0aGUgY3VycmVudCB0ZXN0IC0gdGhpcyBpcyB1c2Vm
dWwgZm9yIGRlYnVnZ2luZyB3aGlsZSB0ZXN0aW5nIG9yIGZvciB0ZXN0LWRyaXZpbmcuCisgICBJ
dCBhbGxvd3MgeW91IHRvIGluc3BlY3QgdGhlIHN0YXRlIG9mIHlvdXIgYXBwbGljYXRpb24gYXQg
YW55IHBvaW50LgorICAKKyAgIEV4YW1wbGUgKFRoZSB0ZXN0IHdpbGwgcGF1c2UgYmVmb3JlIGNs
aWNraW5nIHRoZSBidXR0b24pOgorICAKKyAgIGBgYGphdmFzY3JpcHQKKyAgIHZpc2l0KCcvJykK
KyAgIHJldHVybiBwYXVzZVRlc3QoKTsKKyAgCisgICBjbGljaygnLmJ0bicpOworICAgYGBgCisg
IAorICAgQHNpbmNlIDEuOS4wCisgICBAbWV0aG9kIHBhdXNlVGVzdAorICAgQHJldHVybiB7T2Jq
ZWN0fSBBIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIHJlc29sdmUKKyAgIEBwdWJsaWMKKyAgKi8K
KyAgaGVscGVyKCdwYXVzZVRlc3QnLCBwYXVzZVRlc3QpOworCisgIC8qKgorICAgIFRyaWdnZXJz
IHRoZSBnaXZlbiBET00gZXZlbnQgb24gdGhlIGVsZW1lbnQgaWRlbnRpZmllZCBieSB0aGUgcHJv
dmlkZWQgc2VsZWN0b3IuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICB0cmlnZ2VyRXZlbnQoJyNzb21lLWVsZW0taWQnLCAnYmx1cicpOworICAgIGBgYAorICAK
KyAgICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgYGtleUV2ZW50YCBo
ZWxwZXIgbGlrZSBzbzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHRyaWdnZXJFdmVudCgn
I3NvbWUtZWxlbS1pZCcsICdrZXlwcmVzcycsIHsga2V5Q29kZTogMTMgfSk7CisgICAgYGBgCisg
IAorICAgQG1ldGhvZCB0cmlnZ2VyRXZlbnQKKyAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBq
UXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisgICBAcGFyYW0g
e1N0cmluZ30gW2NvbnRleHRdIGpRdWVyeSBzZWxlY3RvciB0aGF0IHdpbGwgbGltaXQgdGhlIHNl
bGVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIGZpbmQgb25s
eSB3aXRoaW4gdGhlIGNvbnRleHQncyBjaGlsZHJlbgorICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUg
VGhlIGV2ZW50IHR5cGUgdG8gYmUgdHJpZ2dlcmVkLgorICAgQHBhcmFtIHtPYmplY3R9IFtvcHRp
b25zXSBUaGUgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8galF1ZXJ5LkV2ZW50LgorICAgQHJldHVy
biB7UlNWUC5Qcm9taXNlfQorICAgQHNpbmNlIDEuNS4wCisgICBAcHVibGljCisgICovCisgIGFz
eW5jSGVscGVyKCd0cmlnZ2VyRXZlbnQnLCB0cmlnZ2VyRXZlbnQpOworfSk7CisKKy8vIEZpcmVm
b3ggZG9lcyBub3QgdHJpZ2dlciB0aGUgYGZvY3VzaW5gIGV2ZW50IGlmIHRoZSB3aW5kb3cKKy8v
IGRvZXMgbm90IGhhdmUgZm9jdXMuIElmIHRoZSBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZm9jdXMg
anVzdAorLy8gdXNlIHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgorZW5pZmVkKCdlbWJlci10
ZXN0aW5nL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItdGVz
dGluZy9pbml0aWFsaXplcnMnLCAnZW1iZXItdGVzdGluZy9zdXBwb3J0JywgJ2VtYmVyLXRlc3Rp
bmcvc2V0dXBfZm9yX3Rlc3RpbmcnLCAnZW1iZXItdGVzdGluZy90ZXN0JywgJ2VtYmVyLXRlc3Rp
bmcvYWRhcHRlcnMvYWRhcHRlcicsICdlbWJlci10ZXN0aW5nL2FkYXB0ZXJzL3F1bml0JywgJ2Vt
YmVyLXRlc3RpbmcvaGVscGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3Jl
LCBfZW1iZXJUZXN0aW5nSW5pdGlhbGl6ZXJzLCBfZW1iZXJUZXN0aW5nU3VwcG9ydCwgX2VtYmVy
VGVzdGluZ1NldHVwX2Zvcl90ZXN0aW5nLCBfZW1iZXJUZXN0aW5nVGVzdCwgX2VtYmVyVGVzdGlu
Z0FkYXB0ZXJzQWRhcHRlciwgX2VtYmVyVGVzdGluZ0FkYXB0ZXJzUXVuaXQsIF9lbWJlclRlc3Rp
bmdIZWxwZXJzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBhZGRzIGhlbHBlcnMgdG8gaGVs
cGVycyBvYmplY3QgaW4gVGVzdAorCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3Vi
bW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5U
ZXN0ID0gX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQuVGVzdC5BZGFwdGVyID0gX2VtYmVyVGVzdGluZ0FkYXB0ZXJzQWRhcHRlci5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0LlFVbml0QWRhcHRlciA9IF9lbWJlclRlc3Rp
bmdBZGFwdGVyc1F1bml0LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnNldHVw
Rm9yVGVzdGluZyA9IF9lbWJlclRlc3RpbmdTZXR1cF9mb3JfdGVzdGluZy5kZWZhdWx0OworfSk7
CisvLyB0byBzZXR1cCBpbml0aWFsaXplcgorLy8gdG8gaGFuZGxlIHZhcmlvdXMgZWRnZSBjYXNl
cworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2luaXRpYWxpemVycycsIFsnZXhwb3J0cycsICdlbWJl
ci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1
bnRpbWVTeXN0ZW1MYXp5X2xvYWQpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBuYW1lID0g
J2RlZmVyUmVhZGluZXNzIGluIGB0ZXN0aW5nYCBtb2RlJzsKKworICBfZW1iZXJSdW50aW1lU3lz
dGVtTGF6eV9sb2FkLm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbiAoQXBwbGlj
YXRpb24pIHsKKyAgICBpZiAoIUFwcGxpY2F0aW9uLmluaXRpYWxpemVyc1tuYW1lXSkgeworICAg
ICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgICAgICBuYW1lOiBuYW1lLAorCisgICAg
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChhcHBsaWNhdGlvbikgeworICAgICAgICAgIGlmIChh
cHBsaWNhdGlvbi50ZXN0aW5nKSB7CisgICAgICAgICAgICBhcHBsaWNhdGlvbi5kZWZlclJlYWRp
bmVzcygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9KTsK
K30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL3NldHVwX2Zvcl90ZXN0aW5nJywgWydleHBvcnRz
JywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItdGVzdGluZy9hZGFwdGVycy9xdW5pdCcsICdl
bWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlclRlc3RpbmdBZGFwdGVyc1F1bml0LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVy
eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gc2V0dXBGb3JUZXN0
aW5nOworCisgIHZhciBUZXN0LCByZXF1ZXN0czsKKworICBmdW5jdGlvbiBpbmNyZW1lbnRBamF4
UGVuZGluZ1JlcXVlc3RzKF8sIHhocikgeworICAgIHJlcXVlc3RzLnB1c2goeGhyKTsKKyAgICBU
ZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSByZXF1ZXN0cy5sZW5ndGg7CisgIH0KKworICBmdW5j
dGlvbiBkZWNyZW1lbnRBamF4UGVuZGluZ1JlcXVlc3RzKF8sIHhocikgeworICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmICh4aHIgPT09IHJl
cXVlc3RzW2ldKSB7CisgICAgICAgIHJlcXVlc3RzLnNwbGljZShpLCAxKTsKKyAgICAgIH0KKyAg
ICB9CisgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzID0gcmVxdWVzdHMubGVuZ3RoOworICB9
CisKKyAgLyoqCisgICAgU2V0cyBFbWJlciB1cCBmb3IgdGVzdGluZy4gVGhpcyBpcyB1c2VmdWwg
dG8gcGVyZm9ybQorICAgIGJhc2ljIHNldHVwIHN0ZXBzIGluIG9yZGVyIHRvIHVuaXQgdGVzdC4K
KyAgCisgICAgVXNlIGBBcHAuc2V0dXBGb3JUZXN0aW5nYCB0byBwZXJmb3JtIGludGVncmF0aW9u
IHRlc3RzIChmdWxsCisgICAgYXBwbGljYXRpb24gdGVzdGluZykuCisgIAorICAgIEBtZXRob2Qg
c2V0dXBGb3JUZXN0aW5nCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSAxLjUuMAor
ICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gc2V0dXBGb3JUZXN0aW5nKCkgeworICAg
IGlmICghVGVzdCkgeworICAgICAgVGVzdCA9IHJlcXVpcmVNb2R1bGUoJ2VtYmVyLXRlc3Rpbmcv
dGVzdCcpWydkZWZhdWx0J107CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
dGVzdGluZyA9IHRydWU7CisKKyAgICAvLyBpZiBhZGFwdGVyIGlzIG5vdCBtYW51YWxseSBzZXQg
ZGVmYXVsdCB0byBRVW5pdAorICAgIGlmICghVGVzdC5hZGFwdGVyKSB7CisgICAgICBUZXN0LmFk
YXB0ZXIgPSBfZW1iZXJUZXN0aW5nQWRhcHRlcnNRdW5pdC5kZWZhdWx0LmNyZWF0ZSgpOworICAg
IH0KKworICAgIHJlcXVlc3RzID0gW107CisgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzID0g
cmVxdWVzdHMubGVuZ3RoOworCisgICAgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChk
b2N1bWVudCkub2ZmKCdhamF4U2VuZCcsIGluY3JlbWVudEFqYXhQZW5kaW5nUmVxdWVzdHMpOwor
ICAgIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoZG9jdW1lbnQpLm9mZignYWpheENv
bXBsZXRlJywgZGVjcmVtZW50QWpheFBlbmRpbmdSZXF1ZXN0cyk7CisgICAgX2VtYmVyVmlld3NT
eXN0ZW1KcXVlcnkuZGVmYXVsdChkb2N1bWVudCkub24oJ2FqYXhTZW5kJywgaW5jcmVtZW50QWph
eFBlbmRpbmdSZXF1ZXN0cyk7CisgICAgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChk
b2N1bWVudCkub24oJ2FqYXhDb21wbGV0ZScsIGRlY3JlbWVudEFqYXhQZW5kaW5nUmVxdWVzdHMp
OworICB9Cit9KTsKKworLy8gaW1wb3J0IFRlc3QgZnJvbSAiZW1iZXItdGVzdGluZy90ZXN0Ijsg
IC8vIEVTNlRPRE86IGZpeCB3aGVuIGN5Y2xlcyBhcmUgc3VwcG9ydGVkCitlbmlmZWQoJ2VtYmVy
LXRlc3Rpbmcvc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJl
ci12aWV3cy9zeXN0ZW0vanF1ZXJ5JywgJ2VtYmVyLW1ldGFsL2Vudmlyb25tZW50J10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwg
X2VtYmVyTWV0YWxFbnZpcm9ubWVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
QG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworICAqLworCisgIHZh
ciAkID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdDsKKworICAvKioKKyAgICBUaGlz
IG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3ggYW5kIHRyaWdnZXJzIHRoZSBjbGljayBldmVudCB0
byBmaXJlIHRoZQorICAgIHBhc3NlZCBpbiBoYW5kbGVyLiBJdCBpcyB1c2VkIHRvIGNvcnJlY3Qg
Zm9yIGEgYnVnIGluIG9sZGVyIHZlcnNpb25zCisgICAgb2YgalF1ZXJ5IChlLmcgMS44LjMpLgor
ICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgdGVzdENoZWNrYm94Q2xpY2sKKyAgKi8KKyAg
ZnVuY3Rpb24gdGVzdENoZWNrYm94Q2xpY2soaGFuZGxlcikgeworICAgICQoJzxpbnB1dCB0eXBl
PSJjaGVja2JveCI+JykuY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6ICctMTAwMHB4
JywgdG9wOiAnLTEwMDBweCcgfSkuYXBwZW5kVG8oJ2JvZHknKS5vbignY2xpY2snLCBoYW5kbGVy
KS50cmlnZ2VyKCdjbGljaycpLnJlbW92ZSgpOworICB9CisKKyAgaWYgKF9lbWJlck1ldGFsRW52
aXJvbm1lbnQuZGVmYXVsdC5oYXNET00pIHsKKyAgICAkKGZ1bmN0aW9uICgpIHsKKyAgICAgIC8q
CisgICAgICAgIERldGVybWluZSB3aGV0aGVyIGEgY2hlY2tib3ggY2hlY2tlZCB1c2luZyBqUXVl
cnkncyAiY2xpY2siIG1ldGhvZCB3aWxsIGhhdmUKKyAgICAgICAgdGhlIGNvcnJlY3QgdmFsdWUg
Zm9yIGl0cyBjaGVja2VkIHByb3BlcnR5LgorICAgICAgICAgSWYgd2UgZGV0ZXJtaW5lIHRoYXQg
dGhlIGN1cnJlbnQgalF1ZXJ5IHZlcnNpb24gZXhoaWJpdHMgdGhpcyBiZWhhdmlvciwKKyAgICAg
ICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkgYXMgaW4gdGhlIGNvbW1pdCBmb3IgdGhlIGFj
dHVhbCBmaXg6CisgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1p
dC8xZmIyZjkyLgorICAgICAgKi8KKyAgICAgIHRlc3RDaGVja2JveENsaWNrKGZ1bmN0aW9uICgp
IHsKKyAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgISQuZXZlbnQuc3BlY2lhbC5jbGljaykg
eworICAgICAgICAgICQuZXZlbnQuc3BlY2lhbC5jbGljayA9IHsKKyAgICAgICAgICAgIC8vIEZv
ciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJp
Z2h0CisgICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGlm
ICgkLm5vZGVOYW1lKHRoaXMsICdpbnB1dCcpICYmIHRoaXMudHlwZSA9PT0gJ2NoZWNrYm94JyAm
JiB0aGlzLmNsaWNrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGljaygpOworICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgIH07CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICAvLyBUcnkgYWdhaW4gdG8g
dmVyaWZ5IHRoYXQgdGhlIHBhdGNoIHRvb2sgZWZmZWN0IG9yIGJsb3cgdXAuCisgICAgICB0ZXN0
Q2hlY2tib3hDbGljayhmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcud2Fy
bignY2xpY2tlZCBjaGVja2JveGVzIHNob3VsZCBiZSBjaGVja2VkISB0aGUgalF1ZXJ5IHBhdGNo
IGRpZG5cJ3Qgd29yaycsIHRoaXMuY2hlY2tlZCwgeyBpZDogJ2VtYmVyLXRlc3RpbmcudGVzdC1j
aGVja2JveC1jbGljaycgfSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLXRlc3RpbmcvdGVzdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcs
ICdlbWJlci1ydW50aW1lL2V4dC9yc3ZwJywgJ2VtYmVyLXRlc3Rpbmcvc2V0dXBfZm9yX3Rlc3Rp
bmcnLCAnZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2FwcGxpY2F0aW9uJywgJ2VtYmVyLXJ1bnRp
bWUvc3lzdGVtL25hdGl2ZV9hcnJheSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxS
dW5fbG9vcCwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9lbWJlclRlc3RpbmdTZXR1cF9mb3JfdGVz
dGluZywgX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbiwgX2VtYmVyUnVudGltZVN5
c3RlbU5hdGl2ZV9hcnJheSkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgQG1vZHVs
ZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworICAqLworICB2YXIgaGVscGVy
cyA9IHt9OworICB2YXIgaW5qZWN0SGVscGVyc0NhbGxiYWNrcyA9IFtdOworCisgIC8qKgorICAg
IFRoaXMgaXMgYSBjb250YWluZXIgZm9yIGFuIGFzc29ydG1lbnQgb2YgdGVzdGluZyByZWxhdGVk
IGZ1bmN0aW9uYWxpdHk6CisgIAorICAgICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0ZXN0IGFkYXB0
ZXIgKGZvciB5b3VyIGZyYW1ld29yayBvZiBjaG9pY2UpLgorICAgICogUmVnaXN0ZXIvVW5yZWdp
c3RlciBhZGRpdGlvbmFsIHRlc3QgaGVscGVycy4KKyAgICAqIFNldHVwIGNhbGxiYWNrcyB0byBi
ZSBmaXJlZCB3aGVuIHRoZSB0ZXN0IGhlbHBlcnMgYXJlIGluamVjdGVkIGludG8KKyAgICAgIHlv
dXIgYXBwbGljYXRpb24uCisgIAorICAgIEBjbGFzcyBUZXN0CisgICAgQG5hbWVzcGFjZSBFbWJl
cgorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIFRlc3QgPSB7CisgICAgLyoqCisgICAgICBIYXNo
IGNvbnRhaW5pbmcgYWxsIGtub3duIHRlc3QgaGVscGVycy4KKyAgICAgICBAcHJvcGVydHkgX2hl
bHBlcnMKKyAgICAgIEBwcml2YXRlCisgICAgICBAc2luY2UgMS43LjAKKyAgICAqLworICAgIF9o
ZWxwZXJzOiBoZWxwZXJzLAorCisgICAgLyoqCisgICAgICBgcmVnaXN0ZXJIZWxwZXJgIGlzIHVz
ZWQgdG8gcmVnaXN0ZXIgYSB0ZXN0IGhlbHBlciB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICAg
IHdoZW4gYEFwcC5pbmplY3RUZXN0SGVscGVyc2AgaXMgY2FsbGVkLgorICAgICAgIFRoZSBoZWxw
ZXIgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IEFwcGxpY2F0
aW9uIGFzCisgICAgICB0aGUgZmlyc3QgcGFyYW1ldGVyLgorICAgICAgIEZvciBleGFtcGxlOgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJIZWxwZXIoJ2Jv
b3QnLCBmdW5jdGlvbihhcHApIHsKKyAgICAgICAgRW1iZXIucnVuKGFwcCwgYXBwLmFkdmFuY2VS
ZWFkaW5lc3MpOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlzIGhlbHBlciBjYW4g
bGF0ZXIgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIGJlY2F1c2UgaXQgd2lsbCBiZQorICAg
ICAgY2FsbGVkIHdpdGggYGFwcGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAg
IEFwcC5pbmplY3RUZXN0SGVscGVycygpOworICAgICAgYm9vdCgpOworICAgICAgYGBgCisgICAg
ICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZWdpc3RlckhlbHBlcgorICAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlbHBlciBtZXRob2QgdG8gYWRkLgorICAgICAg
QHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyTWV0aG9kCisgICAgICBAcGFyYW0gb3B0aW9ucyB7T2Jq
ZWN0fQorICAgICovCisgICAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIChuYW1lLCBoZWxwZXJN
ZXRob2QpIHsKKyAgICAgIGhlbHBlcnNbbmFtZV0gPSB7CisgICAgICAgIG1ldGhvZDogaGVscGVy
TWV0aG9kLAorICAgICAgICBtZXRhOiB7IHdhaXQ6IGZhbHNlIH0KKyAgICAgIH07CisgICAgfSwK
KworICAgIC8qKgorICAgICAgYHJlZ2lzdGVyQXN5bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0
ZXIgYW4gYXN5bmMgdGVzdCBoZWxwZXIgdGhhdCB3aWxsIGJlIGluamVjdGVkCisgICAgICB3aGVu
IGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KKyAgICAgICBUaGUgaGVscGVyIG1l
dGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBh
cworICAgICAgdGhlIGZpcnN0IHBhcmFtZXRlci4KKyAgICAgICBGb3IgZXhhbXBsZToKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNIZWxwZXIoJ2Jv
b3QnLCBmdW5jdGlvbihhcHApIHsKKyAgICAgICAgRW1iZXIucnVuKGFwcCwgYXBwLmFkdmFuY2VS
ZWFkaW5lc3MpOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGUgYWR2YW50YWdlIG9m
IGFuIGFzeW5jIGhlbHBlciBpcyB0aGF0IGl0IHdpbGwgbm90IHJ1bgorICAgICAgdW50aWwgdGhl
IGxhc3QgYXN5bmMgaGVscGVyIGhhcyBjb21wbGV0ZWQuICBBbGwgYXN5bmMgaGVscGVycworICAg
ICAgYWZ0ZXIgaXQgd2lsbCB3YWl0IGZvciBpdCBjb21wbGV0ZSBiZWZvcmUgcnVubmluZy4KKyAg
ICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuVGVz
dC5yZWdpc3RlckFzeW5jSGVscGVyKCdkZWxldGVQb3N0JywgZnVuY3Rpb24oYXBwLCBwb3N0SWQp
IHsKKyAgICAgICAgY2xpY2soJy5kZWxldGUtJyArIHBvc3RJZCk7CisgICAgICB9KTsKKyAgICAg
ICAvLyAuLi4gaW4geW91ciB0ZXN0CisgICAgICB2aXNpdCgnL3Bvc3QvMicpOworICAgICAgZGVs
ZXRlUG9zdCgyKTsKKyAgICAgIHZpc2l0KCcvcG9zdC8zJyk7CisgICAgICBkZWxldGVQb3N0KDMp
OworICAgICAgYGBgCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZWdpc3RlckFzeW5j
SGVscGVyCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVy
IG1ldGhvZCB0byBhZGQuCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKKyAg
ICAgIEBzaW5jZSAxLjIuMAorICAgICovCisgICAgcmVnaXN0ZXJBc3luY0hlbHBlcjogZnVuY3Rp
b24gKG5hbWUsIGhlbHBlck1ldGhvZCkgeworICAgICAgaGVscGVyc1tuYW1lXSA9IHsKKyAgICAg
ICAgbWV0aG9kOiBoZWxwZXJNZXRob2QsCisgICAgICAgIG1ldGE6IHsgd2FpdDogdHJ1ZSB9Cisg
ICAgICB9OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRk
ZWQgaGVscGVyIG1ldGhvZC4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYGphdmFzY3JpcHQK
KyAgICAgIEVtYmVyLlRlc3QudW5yZWdpc3RlckhlbHBlcignd2FpdCcpOworICAgICAgYGBgCisg
ICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCB1bnJlZ2lzdGVySGVscGVyCisgICAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgaGVscGVyIHRvIHJlbW92ZS4KKyAgICAqLworICAgIHVucmVn
aXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICBkZWxldGUgaGVscGVyc1tuYW1l
XTsKKyAgICAgIGRlbGV0ZSBUZXN0LlByb21pc2UucHJvdG90eXBlW25hbWVdOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFVzZWQgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdo
ZW5ldmVyIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgCisgICAgICBpcyBjYWxsZWQuCisgICAgICAg
VGhlIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBhcyBhbiBh
cmd1bWVudC4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVt
YmVyLlRlc3Qub25JbmplY3RIZWxwZXJzKGZ1bmN0aW9uKCkgeworICAgICAgICBFbWJlci4kKGRv
Y3VtZW50KS5hamF4U2VuZChmdW5jdGlvbigpIHsKKyAgICAgICAgICBUZXN0LnBlbmRpbmdBamF4
UmVxdWVzdHMrKzsKKyAgICAgICAgfSk7CisgICAgICAgICBFbWJlci4kKGRvY3VtZW50KS5hamF4
Q29tcGxldGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3Rz
LS07CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAcHVibGljCisg
ICAgICBAbWV0aG9kIG9uSW5qZWN0SGVscGVycworICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs
bGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAgICAqLworICAgIG9uSW5qZWN0SGVs
cGVyczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tz
LnB1c2goY2FsbGJhY2spOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRoaXMgcmV0dXJucyBh
IHRoZW5hYmxlIHRhaWxvcmVkIGZvciB0ZXN0aW5nLiAgSXQgY2F0Y2hlcyBmYWlsZWQKKyAgICAg
IGBvblN1Y2Nlc3NgIGNhbGxiYWNrcyBhbmQgaW52b2tlcyB0aGUgYEVtYmVyLlRlc3QuYWRhcHRl
ci5leGNlcHRpb25gCisgICAgICBjYWxsYmFjayBpbiB0aGUgbGFzdCBjaGFpbmVkIHRoZW4uCisg
ICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3Vj
aCBhcyBgd2FpdGAuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBwcm9taXNlCisgICAg
ICBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlciBUaGUgZnVuY3Rpb24gdXNlZCB0byByZXNvbHZl
IHRoZSBwcm9taXNlLgorICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEFuIG9wdGlvbmFsIHN0
cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHByb21pc2UuCisgICAgKi8KKyAgICBwcm9taXNlOiBm
dW5jdGlvbiAocmVzb2x2ZXIsIGxhYmVsKSB7CisgICAgICB2YXIgZnVsbExhYmVsID0gJ0VtYmVy
LlRlc3QucHJvbWlzZTogJyArIChsYWJlbCB8fCAnPFVua25vd24gUHJvbWlzZT4nKTsKKyAgICAg
IHJldHVybiBuZXcgVGVzdC5Qcm9taXNlKHJlc29sdmVyLCBmdWxsTGFiZWwpOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgVXNlZCB0byBhbGxvdyBlbWJlci10ZXN0aW5nIHRvIGNvbW11bmljYXRl
IHdpdGggYSBzcGVjaWZpYyB0ZXN0aW5nCisgICAgIGZyYW1ld29yay4KKyAgICAgIFlvdSBjYW4g
bWFudWFsbHkgc2V0IGl0IGJlZm9yZSBjYWxsaW5nIGBBcHAuc2V0dXBGb3JUZXN0aW5nKClgLgor
ICAgICAgRXhhbXBsZToKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgRW1iZXIuVGVzdC5hZGFw
dGVyID0gTXlDdXN0b21BZGFwdGVyLmNyZWF0ZSgpCisgICAgIGBgYAorICAgICAgSWYgeW91IGRv
IG5vdCBzZXQgaXQsIGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRvIGBFbWJlci5UZXN0LlFV
bml0QWRhcHRlcmAuCisgICAgICBAcHVibGljCisgICAgIEBwcm9wZXJ0eSBhZGFwdGVyCisgICAg
IEB0eXBlIHtDbGFzc30gVGhlIGFkYXB0ZXIgdG8gYmUgdXNlZC4KKyAgICAgQGRlZmF1bHQgRW1i
ZXIuVGVzdC5RVW5pdEFkYXB0ZXIKKyAgICAqLworICAgIGFkYXB0ZXI6IG51bGwsCisKKyAgICAv
KioKKyAgICAgIFJlcGxhY2VtZW50IGZvciBgRW1iZXIuUlNWUC5yZXNvbHZlYAorICAgICAgVGhl
IG9ubHkgZGlmZmVyZW5jZSBpcyB0aGlzIHVzZXMKKyAgICAgIGFuIGluc3RhbmNlIG9mIGBFbWJl
ci5UZXN0LlByb21pc2VgCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZXNvbHZlCisg
ICAgICBAcGFyYW0ge01peGVkfSBUaGUgdmFsdWUgdG8gcmVzb2x2ZQorICAgICAgQHNpbmNlIDEu
Mi4wCisgICAgKi8KKyAgICByZXNvbHZlOiBmdW5jdGlvbiAodmFsKSB7CisgICAgICByZXR1cm4g
VGVzdC5wcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZl
KHZhbCk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgVGhpcyBhbGxvd3Mg
ZW1iZXItdGVzdGluZyB0byBwbGF5IG5pY2VseSB3aXRoIG90aGVyIGFzeW5jaHJvbm91cworICAg
ICAgIGV2ZW50cywgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIHdhaXRpbmcgZm9yIGEg
Q1NTMworICAgICAgIHRyYW5zaXRpb24gb3IgYW4gSW5kZXhEQiB0cmFuc2FjdGlvbi4KKyAgICAg
ICAgRm9yIGV4YW1wbGU6CisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICBFbWJlci5UZXN0
LnJlZ2lzdGVyV2FpdGVyKGZ1bmN0aW9uKCkgeworICAgICAgICAgcmV0dXJuIG15UGVuZGluZ1Ry
YW5zYWN0aW9ucygpID09IDA7CisgICAgICAgfSk7CisgICAgICAgYGBgCisgICAgICAgVGhlIGBj
b250ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYHRo
aXNgCisgICAgICAgd2l0aCB3aGljaCB5b3VyIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZC4KKyAg
ICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICBFbWJlci5U
ZXN0LnJlZ2lzdGVyV2FpdGVyKE15REIsIE15REIuaGFzUGVuZGluZ1RyYW5zYWN0aW9ucyk7Cisg
ICAgICAgYGBgCisgICAgICAgIEBwdWJsaWMKKyAgICAgICBAbWV0aG9kIHJlZ2lzdGVyV2FpdGVy
CisgICAgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgKG9wdGlvbmFsKQorICAgICAgIEBwYXJh
bSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICAgQHNpbmNlIDEuMi4wCisgICAgKi8KKyAgICBy
ZWdpc3RlcldhaXRlcjogZnVuY3Rpb24gKGNvbnRleHQsIGNhbGxiYWNrKSB7CisgICAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICBjYWxsYmFjayA9IGNvbnRleHQ7Cisg
ICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgfQorICAgICAgaWYgKCF0aGlzLndhaXRlcnMp
IHsKKyAgICAgICAgdGhpcy53YWl0ZXJzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJh
eS5BKCk7CisgICAgICB9CisgICAgICB0aGlzLndhaXRlcnMucHVzaChbY29udGV4dCwgY2FsbGJh
Y2tdKTsKKyAgICB9LAorICAgIC8qKgorICAgICAgIGB1bnJlZ2lzdGVyV2FpdGVyYCBpcyB1c2Vk
IHRvIHVucmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdhcworICAgICAgIHJlZ2lzdGVyZWQgd2l0
aCBgcmVnaXN0ZXJXYWl0ZXJgLgorICAgICAgICBAcHVibGljCisgICAgICAgQG1ldGhvZCB1bnJl
Z2lzdGVyV2FpdGVyCisgICAgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgKG9wdGlvbmFsKQor
ICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICAgQHNpbmNlIDEuMi4wCisg
ICAgKi8KKyAgICB1bnJlZ2lzdGVyV2FpdGVyOiBmdW5jdGlvbiAoY29udGV4dCwgY2FsbGJhY2sp
IHsKKyAgICAgIGlmICghdGhpcy53YWl0ZXJzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICAgIGNhbGxiYWNrID0g
Y29udGV4dDsKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgICB9CisgICAgICB0aGlzLndh
aXRlcnMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEodGhpcy53YWl0ZXJzLmZp
bHRlcihmdW5jdGlvbiAoZWx0KSB7CisgICAgICAgIHJldHVybiAhKGVsdFswXSA9PT0gY29udGV4
dCAmJiBlbHRbMV0gPT09IGNhbGxiYWNrKTsKKyAgICAgIH0pKTsKKyAgICB9CisgIH07CisKKyAg
ZnVuY3Rpb24gaGVscGVyKGFwcCwgbmFtZSkgeworICAgIHZhciBmbiA9IGhlbHBlcnNbbmFtZV0u
bWV0aG9kOworICAgIHZhciBtZXRhID0gaGVscGVyc1tuYW1lXS5tZXRhOworCisgICAgcmV0dXJu
IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBh
cmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHZhciBs
YXN0UHJvbWlzZTsKKworICAgICAgYXJncy51bnNoaWZ0KGFwcCk7CisKKyAgICAgIC8vIHNvbWUg
aGVscGVycyBhcmUgbm90IGFzeW5jIGFuZAorICAgICAgLy8gbmVlZCB0byByZXR1cm4gYSB2YWx1
ZSBpbW1lZGlhdGVseS4KKyAgICAgIC8vIGV4YW1wbGU6IGBmaW5kYAorICAgICAgaWYgKCFtZXRh
LndhaXQpIHsKKyAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGFwcCwgYXJncyk7CisgICAgICB9CisK
KyAgICAgIGxhc3RQcm9taXNlID0gcnVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIFRl
c3QucmVzb2x2ZShUZXN0Lmxhc3RQcm9taXNlKTsKKyAgICAgIH0pOworCisgICAgICAvLyB3YWl0
IGZvciBsYXN0IGhlbHBlcidzIHByb21pc2UgdG8gcmVzb2x2ZSBhbmQgdGhlbgorICAgICAgLy8g
ZXhlY3V0ZS4gVG8gYmUgc2FmZSwgd2UgbmVlZCB0byB0ZWxsIHRoZSBhZGFwdGVyIHdlJ3JlIGdv
aW5nCisgICAgICAvLyBhc3luY2hyb25vdXMgaGVyZSwgYmVjYXVzZSBmbiBtYXkgbm90IGJlIGlu
dm9rZWQgYmVmb3JlIHdlCisgICAgICAvLyByZXR1cm4uCisgICAgICBUZXN0LmFkYXB0ZXIuYXN5
bmNTdGFydCgpOworICAgICAgcmV0dXJuIGxhc3RQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgewor
ICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwLCBhcmdzKTsKKyAgICAgIH0pLmZpbmFsbHkoZnVu
Y3Rpb24gKCkgeworICAgICAgICBUZXN0LmFkYXB0ZXIuYXN5bmNFbmQoKTsKKyAgICAgIH0pOwor
ICAgIH07CisgIH0KKworICBmdW5jdGlvbiBydW4oZm4pIHsKKyAgICBpZiAoIV9lbWJlck1ldGFs
UnVuX2xvb3AuZGVmYXVsdC5jdXJyZW50UnVuTG9vcCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsUnVuX2xvb3AuZGVmYXVsdChmbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmbigp
OworICAgIH0KKyAgfQorCisgIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb24uZGVm
YXVsdC5yZW9wZW4oeworICAgIC8qKgorICAgICBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIHRoZSB0
ZXN0aW5nIGhlbHBlcnMgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBUaGVzZQorICAgICBh
cmUgY3JlYXRlZCBvbmNlIHlvdSBjYWxsIGBpbmplY3RUZXN0SGVscGVyc2Agb24geW91ciBgRW1i
ZXIuQXBwbGljYXRpb25gCisgICAgIGluc3RhbmNlLiBUaGUgaW5jbHVkZWQgaGVscGVycyBhcmUg
YWxzbyBhdmFpbGFibGUgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQorICAgICBkZWZhdWx0LCBi
dXQgY2FuIGJlIHVzZWQgZnJvbSB0aGlzIG9iamVjdCBvbiB0aGUgaW5kaXZpZHVhbCBhcHBsaWNh
dGlvbiBhbHNvLgorICAgICAgIEBwcm9wZXJ0eSB0ZXN0SGVscGVycworICAgICAgQHR5cGUge09i
amVjdH0KKyAgICAgIEBkZWZhdWx0IHt9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0ZXN0
SGVscGVyczoge30sCisKKyAgICAvKioKKyAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4g
dGhlIG9yaWdpbmFsIG1ldGhvZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQKKyAgICAgb24gdGhlIGBo
ZWxwZXJDb250YWluZXJgIGJlZm9yZSBgaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KKyAg
ICAgIFdoZW4gYHJlbW92ZVRlc3RIZWxwZXJzYCBpcyBjYWxsZWQsIHRoZXNlIG1ldGhvZHMgYXJl
IHJlc3RvcmVkIHRvIHRoZQorICAgICBgaGVscGVyQ29udGFpbmVyYC4KKyAgICAgICBAcHJvcGVy
dHkgb3JpZ2luYWxNZXRob2RzCisgICAgICBAdHlwZSB7T2JqZWN0fQorICAgICAgQGRlZmF1bHQg
e30KKyAgICAgIEBwcml2YXRlCisgICAgICBAc2luY2UgMS4zLjAKKyAgICAqLworICAgIG9yaWdp
bmFsTWV0aG9kczoge30sCisKKyAgICAvKioKKyAgICBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB3
aGV0aGVyIG9yIG5vdCB0aGlzIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBpbgorICAgIHRlc3Rp
bmcgbW9kZS4gVGhpcyBpcyBzZXQgd2hlbiBgc2V0dXBGb3JUZXN0aW5nYCBpcyBjYWxsZWQgb24g
dGhlIGN1cnJlbnQKKyAgICBhcHBsaWNhdGlvbi4KKyAgICAgQHByb3BlcnR5IHRlc3RpbmcKKyAg
ICBAdHlwZSB7Qm9vbGVhbn0KKyAgICBAZGVmYXVsdCBmYWxzZQorICAgIEBzaW5jZSAxLjMuMAor
ICAgIEBwdWJsaWMKKyAgICAqLworICAgIHRlc3Rpbmc6IGZhbHNlLAorCisgICAgLyoqCisgICAg
ICBUaGlzIGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCBzbyB0
aGF0IHlvdSBjYW4gc3RhcnQKKyAgICAgIHRoZSBhcHAgd2hlbiB5b3VyIHRlc3RzIGFyZSByZWFk
eSB0byBydW4uIEl0IGFsc28gc2V0cyB0aGUgcm91dGVyJ3MKKyAgICAgIGxvY2F0aW9uIHRvICdu
b25lJywgc28gdGhhdCB0aGUgd2luZG93J3MgbG9jYXRpb24gd2lsbCBub3QgYmUgbW9kaWZpZWQK
KyAgICAgIChwcmV2ZW50aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJldHdl
ZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQorICAgICAgd2l0aCB5b3VyIHRlc3RpbmcgZnJhbWV3
b3JrKS4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYAorICAgICAgQXBwLnNldHVwRm9yVGVz
dGluZygpOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBzZXR1cEZvclRlc3RpbmcKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIHNldHVwRm9yVGVzdGluZzogZnVuY3Rpb24gKCkgeworICAg
ICAgX2VtYmVyVGVzdGluZ1NldHVwX2Zvcl90ZXN0aW5nLmRlZmF1bHQoKTsKKworICAgICAgdGhp
cy50ZXN0aW5nID0gdHJ1ZTsKKworICAgICAgdGhpcy5Sb3V0ZXIucmVvcGVuKHsKKyAgICAgICAg
bG9jYXRpb246ICdub25lJworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhp
cyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRhaW5lciB0byBpbmplY3QgdGhlIHRlc3QgaGVscGVy
cyBpbnRvLiBCeQorICAgICAgZGVmYXVsdCB0aGUgaGVscGVycyBhcmUgaW5qZWN0ZWQgaW50byBg
d2luZG93YC4KKyAgICAgICBAcHJvcGVydHkgaGVscGVyQ29udGFpbmVyCisgICAgICBAdHlwZSB7
T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRlc3QgaGVscGVycy4KKyAgICAgIEBk
ZWZhdWx0IHdpbmRvdworICAgICAgQHNpbmNlIDEuMi4wCisgICAgICBAcHJpdmF0ZQorICAgICov
CisgICAgaGVscGVyQ29udGFpbmVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGlzIGluamVj
dHMgdGhlIHRlc3QgaGVscGVycyBpbnRvIHRoZSBgaGVscGVyQ29udGFpbmVyYCBvYmplY3QuIElm
IGFuIG9iamVjdCBpcyBwcm92aWRlZAorICAgICAgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBoZWxw
ZXJDb250YWluZXIuIElmIGBoZWxwZXJDb250YWluZXJgIGlzIG5vdCBzZXQgaXQgd2lsbCBkZWZh
dWx0CisgICAgICB0byBgd2luZG93YC4gSWYgYSBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGhh
cyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBpdCB3aWxsIGJlIGNhY2hlZAorICAgICAgKHNvIHRoYXQg
aXQgY2FuIGJlIHJlc2V0IGlmIHRoZSBoZWxwZXIgaXMgcmVtb3ZlZCB3aXRoIGB1bnJlZ2lzdGVy
SGVscGVyYCBvcgorICAgICAgYHJlbW92ZVRlc3RIZWxwZXJzYCkuCisgICAgICAgQW55IGNhbGxi
YWNrcyByZWdpc3RlcmVkIHdpdGggYG9uSW5qZWN0SGVscGVyc2Agd2lsbCBiZSBjYWxsZWQgb25j
ZSB0aGUKKyAgICAgIGhlbHBlcnMgaGF2ZSBiZWVuIGluamVjdGVkLgorICAgICAgIEV4YW1wbGU6
CisgICAgICBgYGAKKyAgICAgIEFwcC5pbmplY3RUZXN0SGVscGVycygpOworICAgICAgYGBgCisg
ICAgICAgQG1ldGhvZCBpbmplY3RUZXN0SGVscGVycworICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaW5qZWN0VGVzdEhlbHBlcnM6IGZ1bmN0aW9uIChoZWxwZXJDb250YWluZXIpIHsKKyAgICAg
IGlmIChoZWxwZXJDb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5oZWxwZXJDb250YWluZXIgPSBo
ZWxwZXJDb250YWluZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmhlbHBlckNvbnRh
aW5lciA9IHdpbmRvdzsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZW9wZW4oeworICAgICAgICB3
aWxsRGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgICAgICAgdGhpcy5yZW1vdmVUZXN0SGVscGVycygpOworICAg
ICAgICB9CisgICAgICB9KTsKKworICAgICAgdGhpcy50ZXN0SGVscGVycyA9IHt9OworICAgICAg
Zm9yICh2YXIgbmFtZSBpbiBoZWxwZXJzKSB7CisgICAgICAgIHRoaXMub3JpZ2luYWxNZXRob2Rz
W25hbWVdID0gdGhpcy5oZWxwZXJDb250YWluZXJbbmFtZV07CisgICAgICAgIHRoaXMudGVzdEhl
bHBlcnNbbmFtZV0gPSB0aGlzLmhlbHBlckNvbnRhaW5lcltuYW1lXSA9IGhlbHBlcih0aGlzLCBu
YW1lKTsKKyAgICAgICAgcHJvdG9XcmFwKFRlc3QuUHJvbWlzZS5wcm90b3R5cGUsIG5hbWUsIGhl
bHBlcih0aGlzLCBuYW1lKSwgaGVscGVyc1tuYW1lXS5tZXRhLndhaXQpOworICAgICAgfQorCisg
ICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGluamVjdEhlbHBlcnNDYWxsYmFja3MubGVuZ3RoOyBp
IDwgbDsgaSsrKSB7CisgICAgICAgIGluamVjdEhlbHBlcnNDYWxsYmFja3NbaV0odGhpcyk7Cisg
ICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhpcyByZW1vdmVzIGFsbCBoZWxwZXJz
IHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQsIGFuZCByZXNldHMgYW5kIGZ1bmN0aW9ucworICAg
ICAgdGhhdCB3ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBlcnMuCisgICAgICAgRXhhbXBsZToK
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAucmVtb3ZlVGVzdEhlbHBlcnMoKTsKKyAg
ICAgIGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBtZXRob2QgcmVtb3ZlVGVzdEhlbHBlcnMK
KyAgICAqLworICAgIHJlbW92ZVRlc3RIZWxwZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAo
IXRoaXMuaGVscGVyQ29udGFpbmVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAg
ICAgZm9yICh2YXIgbmFtZSBpbiBoZWxwZXJzKSB7CisgICAgICAgIHRoaXMuaGVscGVyQ29udGFp
bmVyW25hbWVdID0gdGhpcy5vcmlnaW5hbE1ldGhvZHNbbmFtZV07CisgICAgICAgIGRlbGV0ZSBU
ZXN0LlByb21pc2UucHJvdG90eXBlW25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy50ZXN0SGVs
cGVyc1tuYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVdOwor
ICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgLy8gVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIG5l
ZWRlZAorICAvLyBCdXQgc3RpbGwgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAg
Ly8gb2YgaGVscGVyIGNoYWluaW5nCisgIGZ1bmN0aW9uIHByb3RvV3JhcChwcm90bywgbmFtZSwg
Y2FsbGJhY2ssIGlzQXN5bmMpIHsKKyAgICBwcm90b1tuYW1lXSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4y
KSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICAgIGFyZ3NbX2tl
eTJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzQXN5bmMpIHsK
KyAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0
dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAg
ICB9OworICB9CisKKyAgVGVzdC5Qcm9taXNlID0gZnVuY3Rpb24gKCkgeworICAgIF9lbWJlclJ1
bnRpbWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAg
IFRlc3QubGFzdFByb21pc2UgPSB0aGlzOworICB9OworCisgIFRlc3QuUHJvbWlzZS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKF9lbWJlclJ1bnRpbWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5w
cm90b3R5cGUpOworICBUZXN0LlByb21pc2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGVzdC5Q
cm9taXNlOworICBUZXN0LlByb21pc2UucmVzb2x2ZSA9IFRlc3QucmVzb2x2ZTsKKworICAvLyBQ
YXRjaCBgdGhlbmAgdG8gaXNvbGF0ZSBhc3luYyBtZXRob2RzCisgIC8vIHNwZWNpZmljYWxseSBg
RW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAKKyAgdmFyIG9yaWdpbmFsVGhlbiA9IF9lbWJlclJ1bnRp
bWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5wcm90b3R5cGUudGhlbjsKKyAgVGVzdC5Qcm9taXNl
LnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CisgICAg
cmV0dXJuIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIGZ1bmN0aW9uICh2YWwpIHsKKyAgICAgIHJl
dHVybiBpc29sYXRlKG9uU3VjY2VzcywgdmFsKTsKKyAgICB9LCBvbkZhaWx1cmUpOworICB9Owor
CisgIC8vIFRoaXMgbWV0aG9kIGlzb2xhdGVzIG5lc3RlZCBhc3luYyBtZXRob2RzCisgIC8vIHNv
IHRoYXQgdGhleSBkb24ndCBjb25mbGljdCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCisgIC8v
CisgIC8vIDEuIFNldCBgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAgdG8gbnVsbAorICAvLyAyLiBJ
bnZva2UgbWV0aG9kCisgIC8vIDMuIFJldHVybiB0aGUgbGFzdCBwcm9taXNlIGNyZWF0ZWQgZHVy
aW5nIG1ldGhvZAorICBmdW5jdGlvbiBpc29sYXRlKGZuLCB2YWwpIHsKKyAgICB2YXIgdmFsdWUs
IGxhc3RQcm9taXNlOworCisgICAgLy8gUmVzZXQgbGFzdFByb21pc2UgZm9yIG5lc3RlZCBoZWxw
ZXJzCisgICAgVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7CisKKyAgICB2YWx1ZSA9IGZuKHZhbCk7
CisKKyAgICBsYXN0UHJvbWlzZSA9IFRlc3QubGFzdFByb21pc2U7CisgICAgVGVzdC5sYXN0UHJv
bWlzZSA9IG51bGw7CisKKyAgICAvLyBJZiB0aGUgbWV0aG9kIHJldHVybmVkIGEgcHJvbWlzZQor
ICAgIC8vIHJldHVybiB0aGF0IHByb21pc2UuIElmIG5vdCwKKyAgICAvLyByZXR1cm4gdGhlIGxh
c3QgYXN5bmMgaGVscGVyJ3MgcHJvbWlzZQorICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5j
ZW9mIFRlc3QuUHJvbWlzZSB8fCAhbGFzdFByb21pc2UpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJ1bihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJl
dHVybiBUZXN0LnJlc29sdmUobGFzdFByb21pc2UpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAg
ICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBUZXN0OworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL2NvbXBh
dC9hdHRycy1wcm94eScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1t
ZXRhbC9zeW1ib2wnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzJ10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbFN5bWJvbCwgX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9ldmVudHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVwcmVjYXRp
b24gPSBkZXByZWNhdGlvbjsKKworICBmdW5jdGlvbiBkZXByZWNhdGlvbihrZXkpIHsKKyAgICBy
ZXR1cm4gJ1lvdSB0cmllZCB0byBsb29rIHVwIGFuIGF0dHJpYnV0ZSBkaXJlY3RseSBvbiB0aGUg
Y29tcG9uZW50LiBUaGlzIGlzIGRlcHJlY2F0ZWQuIFVzZSBhdHRycy4nICsga2V5ICsgJyBpbnN0
ZWFkLic7CisgIH0KKworICB2YXIgTVVUQUJMRV9DRUxMID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVm
YXVsdCgnTVVUQUJMRV9DRUxMJyk7CisKKyAgZXhwb3J0cy5NVVRBQkxFX0NFTEwgPSBNVVRBQkxF
X0NFTEw7CisgIGZ1bmN0aW9uIGlzQ2VsbCh2YWwpIHsKKyAgICByZXR1cm4gdmFsICYmIHZhbFtN
VVRBQkxFX0NFTExdOworICB9CisKKyAgdmFyIEF0dHJzUHJveHlNaXhpbiA9IHsKKyAgICBhdHRy
czogbnVsbCwKKworICAgIGdldEF0dHI6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBhdHRy
cyA9IHRoaXMuYXR0cnM7CisgICAgICBpZiAoIWF0dHJzKSB7CisgICAgICAgIHJldHVybjsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiB0aGlzLmdldEF0dHJGb3IoYXR0cnMsIGtleSk7CisgICAgfSwK
KworICAgIGdldEF0dHJGb3I6IGZ1bmN0aW9uIChhdHRycywga2V5KSB7CisgICAgICB2YXIgdmFs
ID0gYXR0cnNba2V5XTsKKyAgICAgIHJldHVybiBpc0NlbGwodmFsKSA/IHZhbC52YWx1ZSA6IHZh
bDsKKyAgICB9LAorCisgICAgc2V0QXR0cjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAg
IHZhciBhdHRycyA9IHRoaXMuYXR0cnM7CisgICAgICB2YXIgdmFsID0gYXR0cnNba2V5XTsKKwor
ICAgICAgaWYgKCFpc0NlbGwodmFsKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBj
YW5cJ3QgdXBkYXRlIGF0dHJzLicgKyBrZXkgKyAnLCBiZWNhdXNlIGl0XCdzIG5vdCBtdXRhYmxl
Jyk7CisgICAgICB9CisKKyAgICAgIHZhbC51cGRhdGUodmFsdWUpOworICAgIH0sCisKKyAgICBf
cHJvcGFnYXRlQXR0cnNUb1RoaXM6IGZ1bmN0aW9uIChhdHRycykgeworICAgICAgdGhpcy5faXNE
aXNwYXRjaGluZ0F0dHJzID0gdHJ1ZTsKKyAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhhdHRycyk7
CisgICAgICB0aGlzLl9pc0Rpc3BhdGNoaW5nQXR0cnMgPSBmYWxzZTsKKyAgICB9CisgIH07CisK
KyAgQXR0cnNQcm94eU1peGluW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BFUlRZX0RJ
RF9DSEFOR0VdID0gZnVuY3Rpb24gKGtleSkgeworICAgIGlmICh0aGlzLl9pc0FuZ2xlQnJhY2tl
dCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhpcy5faXNEaXNwYXRjaGluZ0F0
dHJzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2N1cnJlbnRTdGF0
ZSkgeworICAgICAgdGhpcy5fY3VycmVudFN0YXRlLmxlZ2FjeVByb3BlcnR5RGlkQ2hhbmdlKHRo
aXMsIGtleSk7CisgICAgfQorICB9OworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFs
TWl4aW4uTWl4aW4uY3JlYXRlKEF0dHJzUHJveHlNaXhpbik7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dmlld3MvY29tcG9uZW50X2xvb2t1cCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJl
ci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdjb250YWluZXIvb3duZXInXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVy
UnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIsIF9j
b250YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
X2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW52YWxpZE5h
bWU6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICBpZiAoIV9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLkNPTlRBSU5TX0RBU0hfQ0FDSEUuZ2V0KG5hbWUpKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IHVzZSBcJycgKyBuYW1lICsgJ1wnIGFzIGEg
Y29tcG9uZW50IG5hbWUuIENvbXBvbmVudCBuYW1lcyBtdXN0IGNvbnRhaW4gYSBoeXBoZW4uJyk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0sCisKKyAgICBsb29rdXBGYWN0
b3J5OiBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHsKKyAgICAgIG93bmVyID0gb3duZXIgfHwgX2Nv
bnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworCisgICAgICB2YXIgZnVsbE5hbWUgPSAnY29t
cG9uZW50OicgKyBuYW1lOworICAgICAgdmFyIHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6
Y29tcG9uZW50cy8nICsgbmFtZTsKKyAgICAgIHZhciB0ZW1wbGF0ZVJlZ2lzdGVyZWQgPSBvd25l
ciAmJiBvd25lci5oYXNSZWdpc3RyYXRpb24odGVtcGxhdGVGdWxsTmFtZSk7CisKKyAgICAgIGlm
ICh0ZW1wbGF0ZVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgb3duZXIuaW5qZWN0KGZ1bGxOYW1lLCAn
bGF5b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7CisgICAgICB9CisKKyAgICAgIHZhciBDb21wb25l
bnQgPSBvd25lci5fbG9va3VwRmFjdG9yeShmdWxsTmFtZSk7CisKKyAgICAgIC8vIE9ubHkgdHJl
YXQgYXMgYSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBjb21wb25lbnQKKyAgICAgIC8vIG9yIGEg
dGVtcGxhdGUgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKyAgICAgIGlmICh0ZW1wbGF0ZVJlZ2lzdGVy
ZWQgfHwgQ29tcG9uZW50KSB7CisgICAgICAgIGlmICghQ29tcG9uZW50KSB7CisgICAgICAgICAg
b3duZXIucmVnaXN0ZXIoZnVsbE5hbWUsIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkNvbXBvbmVu
dCk7CisgICAgICAgICAgQ29tcG9uZW50ID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoZnVsbE5hbWUp
OworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb21wb25lbnQ7CisgICAgICB9CisgICAgfSwK
KworICAgIGNvbXBvbmVudEZvcjogZnVuY3Rpb24gKG5hbWUsIG93bmVyLCBvcHRpb25zKSB7Cisg
ICAgICBpZiAodGhpcy5pbnZhbGlkTmFtZShuYW1lKSkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisKKyAgICAgIHZhciBmdWxsTmFtZSA9ICdjb21wb25lbnQ6JyArIG5hbWU7CisgICAgICBy
ZXR1cm4gb3duZXIuX2xvb2t1cEZhY3RvcnkoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0sCisK
KyAgICBsYXlvdXRGb3I6IGZ1bmN0aW9uIChuYW1lLCBvd25lciwgb3B0aW9ucykgeworICAgICAg
aWYgKHRoaXMuaW52YWxpZE5hbWUobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQor
CisgICAgICB2YXIgdGVtcGxhdGVGdWxsTmFtZSA9ICd0ZW1wbGF0ZTpjb21wb25lbnRzLycgKyBu
YW1lOworICAgICAgcmV0dXJuIG93bmVyLmxvb2t1cCh0ZW1wbGF0ZUZ1bGxOYW1lLCBvcHRpb25z
KTsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL2NvbXBvbmVudHMvY29t
cG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL2Vu
dmlyb25tZW50JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL3RhcmdldF9hY3Rpb25fc3VwcG9ydCcs
ICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvaXNfbm9uZScsICdlbWJlci1t
ZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci12aWV3cy9jb21wYXQv
YXR0cnMtcHJveHknLCAnY29udGFpbmVyL293bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJSdW50aW1lTWl4aW5z
VGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbElzX25vbmUs
IF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlclZpZXdzQ29tcGF0
QXR0cnNQcm94eSwgX2NvbnRhaW5lck93bmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5j
dGlvbiB2YWxpZGF0ZUFjdGlvbihjb21wb25lbnQsIGFjdGlvbk5hbWUpIHsKKyAgICBpZiAoYWN0
aW9uTmFtZSAmJiBhY3Rpb25OYW1lW19lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eS5NVVRBQkxF
X0NFTExdKSB7CisgICAgICBhY3Rpb25OYW1lID0gYWN0aW9uTmFtZS52YWx1ZTsKKyAgICB9Cisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBkZWZhdWx0IGFjdGlvbiB3YXMgdHJpZ2dl
cmVkIG9uIHRoZSBjb21wb25lbnQgJyArIGNvbXBvbmVudC50b1N0cmluZygpICsgJywgYnV0IHRo
ZSBhY3Rpb24gbmFtZSAoJyArIGFjdGlvbk5hbWUgKyAnKSB3YXMgbm90IGEgc3RyaW5nLicsIF9l
bWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KGFjdGlvbk5hbWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1l
ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ2Z1bmN0aW9uJyk7CisgICAg
cmV0dXJuIGFjdGlvbk5hbWU7CisgIH0KKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgLyoqCisgICAgQW4gYEVtYmVyLkNvbXBvbmVu
dGAgaXMgYSB2aWV3IHRoYXQgaXMgY29tcGxldGVseQorICAgIGlzb2xhdGVkLiBQcm9wZXJ0aWVz
IGFjY2Vzc2VkIGluIGl0cyB0ZW1wbGF0ZXMgZ28KKyAgICB0byB0aGUgdmlldyBvYmplY3QgYW5k
IGFjdGlvbnMgYXJlIHRhcmdldGVkIGF0CisgICAgdGhlIHZpZXcgb2JqZWN0LiBUaGVyZSBpcyBu
byBhY2Nlc3MgdG8gdGhlCisgICAgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250cm9s
bGVyOyBhbGwKKyAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIG11c3QgYmUgcGFzc2VkIGluLgor
ICAKKyAgICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFuIGBFbWJlci5Db21wb25lbnRgIGlz
IHZpYQorICAgIGEgdGVtcGxhdGUuIElmIHlvdSBuYW1lIGEgdGVtcGxhdGUKKyAgICBgY29tcG9u
ZW50cy9teS1mb29gLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZQorICAgIGB7e215LWZvb319YCBp
biBvdGhlciB0ZW1wbGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQorICAgIGFuIGluc3RhbmNlIG9mIHRo
ZSBpc29sYXRlZCBjb21wb25lbnQuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2FwcC1w
cm9maWxlIHBlcnNvbj1jdXJyZW50VXNlcn19CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJh
cnMKKyAgICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRlIC0tPgorICAgIDxoMT57e3BlcnNvbi50
aXRsZX19PC9oMT4KKyAgICA8aW1nIHNyYz17e3BlcnNvbi5hdmF0YXJ9fT4KKyAgICA8cCBjbGFz
cz0nc2lnbmF0dXJlJz57e3BlcnNvbi5zaWduYXR1cmV9fTwvcD4KKyAgICBgYGAKKyAgCisgICAg
WW91IGNhbiB1c2UgYHlpZWxkYCBpbnNpZGUgYSB0ZW1wbGF0ZSB0bworICAgIGluY2x1ZGUgdGhl
ICoqY29udGVudHMqKiBvZiBhbnkgYmxvY2sgYXR0YWNoZWQgdG8KKyAgICB0aGUgY29tcG9uZW50
LiBUaGUgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUKKyAgICBjb250ZXh0IG9mIHRoZSBz
dXJyb3VuZGluZyBjb250ZXh0IG9yIG91dGVyIGNvbnRyb2xsZXI6CisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgICB7eyNhcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9fQorICAgICAgPHA+
QWRtaW4gbW9kZTwvcD4KKyAgICAgIHt7ISBFeGVjdXRlZCBpbiB0aGUgY29udHJvbGxlcidzIGNv
bnRleHQuIH19CisgICAge3svYXBwLXByb2ZpbGV9fQorICAgIGBgYAorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAgPCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4KKyAgICA8aDE+e3twZXJz
b24udGl0bGV9fTwvaDE+CisgICAge3shIEV4ZWN1dGVkIGluIHRoZSBjb21wb25lbnQncyBjb250
ZXh0LiB9fQorICAgIHt7eWllbGR9fSB7eyEgYmxvY2sgY29udGVudHMgfX0KKyAgICBgYGAKKyAg
CisgICAgSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb21wb25lbnQsIGluIG9yZGVyIHRv
CisgICAgaGFuZGxlIGV2ZW50cyBvciBhY3Rpb25zLCB5b3UgaW1wbGVtZW50IGEgc3ViY2xhc3MK
KyAgICBvZiBgRW1iZXIuQ29tcG9uZW50YCBuYW1lZCBhZnRlciB0aGUgbmFtZSBvZiB0aGUKKyAg
ICBjb21wb25lbnQuIE5vdGUgdGhhdCBgQ29tcG9uZW50YCBuZWVkcyB0byBiZSBhcHBlbmRlZCB0
byB0aGUgbmFtZSBvZgorICAgIHlvdXIgc3ViY2xhc3MgbGlrZSBgQXBwUHJvZmlsZUNvbXBvbmVu
dGAuCisgIAorICAgIEZvciBleGFtcGxlLCB5b3UgY291bGQgaW1wbGVtZW50IHRoZSBhY3Rpb24K
KyAgICBgaGVsbG9gIGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21wb25lbnQ6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBBcHAuQXBwUHJvZmlsZUNvbXBvbmVudCA9IEVtYmVyLkNvbXBvbmVu
dC5leHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICBoZWxsbzogZnVuY3Rpb24obmFt
ZSkgeworICAgICAgICAgIGNvbnNvbGUubG9nKCJIZWxsbyIsIG5hbWUpOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEFuZCB0aGVuIHVzZSBpdCBpbiB0aGUg
Y29tcG9uZW50J3MgdGVtcGxhdGU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8IS0tIGFw
cC1wcm9maWxlIHRlbXBsYXRlIC0tPgorICAKKyAgICA8aDE+e3twZXJzb24udGl0bGV9fTwvaDE+
CisgICAge3t5aWVsZH19IDwhLS0gYmxvY2sgY29udGVudHMgLS0+CisgIAorICAgIDxidXR0b24g
e3thY3Rpb24gJ2hlbGxvJyBwZXJzb24ubmFtZX19PgorICAgICAgU2F5IEhlbGxvIHRvIHt7cGVy
c29uLm5hbWV9fQorICAgIDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBDb21wb25lbnRzIG11
c3QgaGF2ZSBhIGAtYCBpbiB0aGVpciBuYW1lIHRvIGF2b2lkCisgICAgY29uZmxpY3RzIHdpdGgg
YnVpbHQtaW4gY29udHJvbHMgdGhhdCB3cmFwIEhUTUwKKyAgICBlbGVtZW50cy4gVGhpcyBpcyBj
b25zaXN0ZW50IHdpdGggdGhlIHNhbWUKKyAgICByZXF1aXJlbWVudCBpbiB3ZWIgY29tcG9uZW50
cy4KKyAgCisgICAgQGNsYXNzIENvbXBvbmVudAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBA
ZXh0ZW5kcyBFbWJlci5WaWV3CisgICAgQHVzZXMgRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBv
cnQKKyAgICBAcHVibGljCisgICovCisgIHZhciBDb21wb25lbnQgPSBfZW1iZXJWaWV3c1ZpZXdz
Vmlldy5kZWZhdWx0LmV4dGVuZChfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBw
b3J0LmRlZmF1bHQsIHsKKyAgICBpc0NvbXBvbmVudDogdHJ1ZSwKKyAgICAvKgorICAgICAgVGhp
cyBpcyBzZXQgc28gdGhhdCB0aGUgcHJvdG8gaW5zcGVjdGlvbiBpbiBhcHBlbmRUZW1wbGF0ZWRW
aWV3IGRvZXMgbm90CisgICAgICB0aGluayB0aGF0IGl0IHNob3VsZCBzZXQgdGhlIGNvbXBvbmVu
dCdzIGBjb250ZXh0YCB0byB0aGF0IG9mIHRoZSBwYXJlbnQgdmlldy4KKyAgICAqLworICAgIGNv
bnRyb2xsZXI6IG51bGwsCisgICAgY29udGV4dDogbnVsbCwKKworICAgIGluc3RydW1lbnROYW1l
OiAnY29tcG9uZW50JywKKyAgICBpbnN0cnVtZW50RGlzcGxheTogX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5fZGVidWdDb250YWluZXJL
ZXkpIHsKKyAgICAgICAgcmV0dXJuICd7eycgKyB0aGlzLl9kZWJ1Z0NvbnRhaW5lcktleS5zcGxp
dCgnOicpWzFdICsgJ319JzsKKyAgICAgIH0KKyAgICB9KSwKKworICAgIGluaXQ6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhp
cywgJ2NvbnRyb2xsZXInLCB0aGlzKTsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dCh0aGlzLCAnY29udGV4dCcsIHRoaXMpOworCisgICAgICBpZiAoIXRoaXMubGF5b3V0ICYmIHRo
aXMubGF5b3V0TmFtZSAmJiBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykpIHsKKyAgICAg
ICAgdmFyIGxheW91dE5hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xh
eW91dE5hbWUnKTsKKworICAgICAgICB0aGlzLmxheW91dCA9IHRoaXMudGVtcGxhdGVGb3JOYW1l
KGxheW91dE5hbWUpOworICAgICAgfQorCisgICAgICAvLyBJZiBhIGBkZWZhdWx0TGF5b3V0YCB3
YXMgc3BlY2lmaWVkIG1vdmUgaXQgdG8gdGhlIGBsYXlvdXRgIHByb3AuCisgICAgICAvLyBgbGF5
b3V0YCBpcyBubyBsb25nZXIgYSBDUCwgc28gdGhpcyBqdXN0IGVuc3VyZXMgdGhhdCB0aGUgYGRl
ZmF1bHRMYXlvdXRgCisgICAgICAvLyBsb2dpYyBpcyBzdXBwb3J0ZWQgd2l0aCBhIGRlcHJlY2F0
aW9uCisgICAgICBpZiAodGhpcy5kZWZhdWx0TGF5b3V0ICYmICF0aGlzLmxheW91dCkgeworICAg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnU3BlY2lmeWluZyBgZGVmYXVsdExheW91
dGAgdG8gJyArIHRoaXMgKyAnIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxheW91dGAgaW5z
dGVhZC4nLCBmYWxzZSwgeworICAgICAgICAgIGlkOiAnZW1iZXItdmlld3MuY29tcG9uZW50LmRl
ZmF1bHRMYXlvdXQnLAorICAgICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICAgIHVybDog
J2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueC8jdG9jX2VtYmVyLWNvbXBvbmVu
dC1kZWZhdWx0bGF5b3V0JworICAgICAgICB9KTsKKworICAgICAgICB0aGlzLmxheW91dCA9IHRo
aXMuZGVmYXVsdExheW91dDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgaW4gYSB0YWdsZXNzIGNv
bXBvbmVudCwgYXNzZXJ0IHRoYXQgbm8gZXZlbnQgaGFuZGxlcnMgYXJlIGRlZmluZWQKKyAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2FuIG5vdCBkZWZpbmUgYSBmdW5jdGlvbiB0
aGF0IGhhbmRsZXMgRE9NIGV2ZW50cyBpbiB0aGUgYCcgKyB0aGlzICsgJ2AgdGFnbGVzcyBjb21w
b25lbnQgc2luY2UgaXQgZG9lc25cJ3QgaGF2ZSBhbnkgRE9NIGVsZW1lbnQuJywgdGhpcy50YWdO
YW1lICE9PSAnJyB8fCAhX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTSB8fCAh
KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGV2ZW50RGlzcGF0Y2hlciA9IF9jb250YWluZXJP
d25lci5nZXRPd25lcihfdGhpcykubG9va3VwKCdldmVudF9kaXNwYXRjaGVyOm1haW4nKTsKKyAg
ICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50RGlzcGF0Y2hlciAmJiBldmVudERpc3BhdGNoZXIuX2Zp
bmFsRXZlbnRzIHx8IHt9OworCisgICAgICAgIGZvciAodmFyIGtleSBpbiBldmVudHMpIHsKKyAg
ICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGV2ZW50c1trZXldOworCisgICAgICAgICAgaWYgKHR5
cGVvZiBfdGhpc1ttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgICAgcmV0
dXJuIHRydWU7IC8vIGluZGljYXRlIHRoYXQgdGhlIGFzc2VydGlvbiBzaG91bGQgYmUgdHJpZ2dl
cmVkCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KSgpKTsKKyAgICB9LAorCisgICAg
dGVtcGxhdGU6IG51bGwsCisgICAgbGF5b3V0TmFtZTogbnVsbCwKKyAgICBsYXlvdXQ6IG51bGws
CisKKyAgICAvKioKKyAgICAgIElmIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGluc2VydGVk
IGludG8gdGhlIERPTSBvZiBhIHBhcmVudCB2aWV3LCB0aGlzCisgICAgICBwcm9wZXJ0eSB3aWxs
IHBvaW50IHRvIHRoZSBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgdmlldy4KKyAgICAgICBAcHJv
cGVydHkgdGFyZ2V0T2JqZWN0CisgICAgICBAdHlwZSBFbWJlci5Db250cm9sbGVyCisgICAgICBA
ZGVmYXVsdCBudWxsCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgdGFyZ2V0T2JqZWN0OiBf
ZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKCdjb250cm9sbGVyJywgZnVuY3Rpb24gKGtleSkg
eworICAgICAgaWYgKHRoaXMuX3RhcmdldE9iamVjdCkgeworICAgICAgICByZXR1cm4gdGhpcy5f
dGFyZ2V0T2JqZWN0OworICAgICAgfQorICAgICAgaWYgKHRoaXMuX2NvbnRyb2xsZXIpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xsZXI7CisgICAgICB9CisgICAgICB2YXIgcGFyZW50
VmlldyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncGFyZW50VmlldycpOwor
ICAgICAgcmV0dXJuIHBhcmVudFZpZXcgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFy
ZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7CisgICAgfSksCisKKyAgICAvKioKKyAgICAg
IENhbGxzIGFuIGFjdGlvbiBwYXNzZWQgdG8gYSBjb21wb25lbnQuCisgICAgICAgRm9yIGV4YW1w
bGUgYSBjb21wb25lbnQgZm9yIHBsYXlpbmcgb3IgcGF1c2luZyBtdXNpYyBtYXkgdHJhbnNsYXRl
IGNsaWNrIGV2ZW50cworICAgICAgaW50byBhY3Rpb24gbm90aWZpY2F0aW9ucyBvZiAicGxheSIg
b3IgInN0b3AiIGRlcGVuZGluZyBvbiBzb21lIGludGVybmFsIHN0YXRlCisgICAgICBvZiB0aGUg
Y29tcG9uZW50OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIC8vIGFwcC9jb21wb25lbnRz
L3BsYXktYnV0dG9uLmpzCisgICAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0
ZW5kKHsKKyAgICAgICAgY2xpY2soKSB7CisgICAgICAgICAgaWYgKHRoaXMuZ2V0KCdpc1BsYXlp
bmcnKSkgeworICAgICAgICAgICAgdGhpcy5zZW5kQWN0aW9uKCdwbGF5Jyk7CisgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuc2VuZEFjdGlvbignc3RvcCcpOworICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGUgYWN0aW9ucyAi
cGxheSIgYW5kICJzdG9wIiBtdXN0IGJlIHBhc3NlZCB0byB0aGlzIGBwbGF5LWJ1dHRvbmAgY29t
cG9uZW50OgorICAgICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIHt7ISBhcHAvdGVtcGxhdGVzL2Fw
cGxpY2F0aW9uLmhicyB9fQorICAgICAge3twbGF5LWJ1dHRvbiBwbGF5PShhY3Rpb24gIm11c2lj
U3RhcnRlZCIpIHN0b3A9KGFjdGlvbiAibXVzaWNTdG9wcGVkIil9fQorICAgICAgYGBgCisgICAg
ICAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIGEgYnJvd3NlciBgY2xpY2tgIGV2ZW50IGl0
IHRyYW5zbGF0ZSB0aGlzCisgICAgICBpbnRlcmFjdGlvbiBpbnRvIGFwcGxpY2F0aW9uLXNwZWNp
ZmljIHNlbWFudGljcyAoInBsYXkiIG9yICJzdG9wIikgYW5kCisgICAgICBjYWxscyB0aGUgc3Bl
Y2lmaWVkIGFjdGlvbi4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBhcHAvY29udHJv
bGxlci9hcHBsaWNhdGlvbi5qcworICAgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxl
ci5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgbXVzaWNTdGFydGVkKCkg
eworICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHBsYXkgYnV0dG9uIGlzIGNsaWNrZWQK
KyAgICAgICAgICAgIC8vIGFuZCB0aGUgbXVzaWMgc3RhcnRlZCBwbGF5aW5nCisgICAgICAgICAg
fSwKKyAgICAgICAgICBtdXNpY1N0b3BwZWQoKSB7CisgICAgICAgICAgICAvLyBjYWxsZWQgd2hl
biB0aGUgcGxheSBidXR0b24gaXMgY2xpY2tlZAorICAgICAgICAgICAgLy8gYW5kIHRoZSBtdXNp
YyBzdG9wcGVkIHBsYXlpbmcKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgYGBgCisgICAgICAgSWYgbm8gYWN0aW9uIGlzIHBhc3NlZCB0byBgc2VuZEFjdGlvbmAgYSBk
ZWZhdWx0IG5hbWUgb2YgImFjdGlvbiIKKyAgICAgIGlzIGFzc3VtZWQuCisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgLy8gYXBwL2NvbXBvbmVudHMvbmV4dC1idXR0b24uanMKKyAgICAgIGV4
cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoeworICAgICAgICBjbGljaygpIHsK
KyAgICAgICAgICB0aGlzLnNlbmRBY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAg
ICBgYGAKKyAgICAgICBgYGBoYW5kbGViYXJzCisgICAgICB7eyEgYXBwL3RlbXBsYXRlcy9hcHBs
aWNhdGlvbi5oYnMgfX0KKyAgICAgIHt7bmV4dC1idXR0b24gYWN0aW9uPShhY3Rpb24gInBsYXlO
ZXh0U29uZ0luQWxidW0iKX19CisgICAgICBgYGAKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICAvLyBhcHAvY29udHJvbGxlcnMvYXBwbGljYXRpb24uanMKKyAgICAgIEFwcC5BcHBsaWNhdGlv
bkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6
IHsKKyAgICAgICAgICBwbGF5TmV4dFNvbmdJbkFsYnVtKCkgeworICAgICAgICAgICAgLi4uCisg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRo
b2Qgc2VuZEFjdGlvbgorICAgICAgQHBhcmFtIFthY3Rpb25dIHtTdHJpbmd9IHRoZSBhY3Rpb24g
dG8gY2FsbAorICAgICAgQHBhcmFtIFtwYXJhbXNdIHsqfSBhcmd1bWVudHMgZm9yIHRoZSBhY3Rp
b24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNlbmRBY3Rpb246IGZ1bmN0aW9uIChhY3Rp
b24pIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZXh0cyA9
IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBf
a2V5KyspIHsKKyAgICAgICAgY29udGV4dHNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwor
ICAgICAgfQorCisgICAgICB2YXIgYWN0aW9uTmFtZTsKKworICAgICAgLy8gU2VuZCB0aGUgZGVm
YXVsdCBhY3Rpb24KKyAgICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCkgeworICAgICAgICBh
Y3Rpb24gPSAnYWN0aW9uJzsKKyAgICAgIH0KKyAgICAgIGFjdGlvbk5hbWUgPSBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2F0dHJzLicgKyBhY3Rpb24pIHx8IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCBhY3Rpb24pOworICAgICAgYWN0aW9uTmFtZSA9IHZhbGlk
YXRlQWN0aW9uKHRoaXMsIGFjdGlvbk5hbWUpOworCisgICAgICAvLyBJZiBubyBhY3Rpb24gbmFt
ZSBmb3IgdGhhdCBhY3Rpb24gY291bGQgYmUgZm91bmQsIGp1c3QgYWJvcnQuCisgICAgICBpZiAo
YWN0aW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwor
ICAgICAgaWYgKHR5cGVvZiBhY3Rpb25OYW1lID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGFj
dGlvbk5hbWUuYXBwbHkodW5kZWZpbmVkLCBjb250ZXh0cyk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oeworICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwK
KyAgICAgICAgICBhY3Rpb25Db250ZXh0OiBjb250ZXh0cworICAgICAgICB9KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgc2VuZDogZnVuY3Rpb24gKGFjdGlvbk5hbWUpIHsKKyAgICAgIGZvciAo
dmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMSA/IF9s
ZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHsKKyAgICAg
ICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgIH0KKworICAgICAg
dmFyIHRhcmdldDsKKyAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbnMgJiYgdGhpcy5hY3Rp
b25zW2FjdGlvbk5hbWVdOworCisgICAgICBpZiAoYWN0aW9uKSB7CisgICAgICAgIHZhciBzaG91
bGRCdWJibGUgPSBhY3Rpb24uYXBwbHkodGhpcywgYXJncykgPT09IHRydWU7CisgICAgICAgIGlm
ICghc2hvdWxkQnViYmxlKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9
CisKKyAgICAgIGlmICh0YXJnZXQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J3RhcmdldCcpKSB7CisgICAgICAgIHZhciBfdGFyZ2V0OworCisgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdUaGUgYHRhcmdldGAgZm9yICcgKyB0aGlzICsgJyAoJyArIHRhcmdldCAr
ICcpIGRvZXMgbm90IGhhdmUgYSBgc2VuZGAgbWV0aG9kJywgdHlwZW9mIHRhcmdldC5zZW5kID09
PSAnZnVuY3Rpb24nKTsKKyAgICAgICAgKF90YXJnZXQgPSB0YXJnZXQpLnNlbmQuYXBwbHkoX3Rh
cmdldCwgYXJndW1lbnRzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghYWN0aW9uKSB7
CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF9lbWJlck1ldGFsVXRpbHMuaW5zcGVjdCh0aGlz
KSArICcgaGFkIG5vIGFjdGlvbiBoYW5kbGVyIGZvcjogJyArIGFjdGlvbk5hbWUpOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRydWUgd2hlbiB0
aGUgY29tcG9uZW50IHdhcyBpbnZva2VkIHdpdGggYSBibG9jayB0ZW1wbGF0ZS4KKyAgICAgICBF
eGFtcGxlIChgaGFzQmxvY2tgIHdpbGwgYmUgYGZhbHNlYCk6CisgICAgICAgYGBgaGJzCisgICAg
ICB7eyEgdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAgICAgIHt7Zm9vLWJhcn19Cisg
ICAgICAge3shIHRlbXBsYXRlcy9jb21wb25lbnRzL2Zvby1iYXIuaGJzIH19CisgICAgICB7eyNp
ZiBoYXNCbG9ja319CisgICAgICAgIFRoaXMgd2lsbCBub3QgYmUgcHJpbnRlZCwgYmVjYXVzZSBu
byBibG9jayB3YXMgcHJvdmlkZWQKKyAgICAgIHt7L2lmfX0KKyAgICAgIGBgYAorICAgICAgIEV4
YW1wbGUgKGBoYXNCbG9ja2Agd2lsbCBiZSBgdHJ1ZWApOgorICAgICAgIGBgYGhicworICAgICAg
e3shIHRlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMgfX0KKyAgICAgICB7eyNmb28tYmFyfX0KKyAg
ICAgICAgSGkhCisgICAgICB7ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVzL2NvbXBv
bmVudHMvZm9vLWJhci5oYnMgfX0KKyAgICAgIHt7I2lmIGhhc0Jsb2NrfX0KKyAgICAgICAgVGhp
cyB3aWxsIGJlIHByaW50ZWQgYmVjYXVzZSBhIGJsb2NrIHdhcyBwcm92aWRlZAorICAgICAgICB7
e3lpZWxkfX0KKyAgICAgIHt7L2lmfX0KKyAgICAgIGBgYAorICAgICAgIFRoaXMgaGVscGVyIGFj
Y2VwdHMgYW4gYXJndW1lbnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYmxvY2sgd2Ugd2FudCB0byBj
aGVjayB0aGUgcHJlc2VuY2Ugb2YuCisgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcg
Zm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgb3B0aW9uYWwgaW52ZXJzZSBibG9jayBpbiBjb21wb25l
bnRzLgorICAgICAgIGBgYGhicworICAgICAge3shIHRlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMg
fX0KKyAgICAgICB7eyNmb28tYmFyfX0KKyAgICAgICAgSGkhCisgICAgICB7e2Vsc2V9fQorICAg
ICAgICBXaGF0J3MgdXA/CisgICAgICB7ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVz
L2NvbXBvbmVudHMvZm9vLWJhci5oYnMgfX0KKyAgICAgIHt7eWllbGR9fQorICAgICAge3sjaWYg
KGhhc0Jsb2NrICJpbnZlcnNlIil9fQorICAgICAgICB7e3lpZWxkIHRvPSJpbnZlcnNlIn19Cisg
ICAgICB7e2Vsc2V9fQorICAgICAgICBIb3cgYXJlIHlvdT8KKyAgICAgIHt7L2lmfX0KKyAgICAg
IGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBwcm9wZXJ0eSBoYXNCbG9jaworICAgICAgQHBh
cmFtIHtTdHJpbmd9IFtibG9ja05hbWU9ImRlZmF1bHQiXSBUaGUgbmFtZSBvZiB0aGUgYmxvY2sg
dG8gY2hlY2sgcHJlc2VuY2Ugb2YuCisgICAgICBAcmV0dXJucyBCb29sZWFuCisgICAgICBAc2lu
Y2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgUmV0dXJucyB0cnVlIHdoZW4gdGhl
IGNvbXBvbmVudCB3YXMgaW52b2tlZCB3aXRoIGEgYmxvY2sgcGFyYW1ldGVyCisgICAgICBzdXBw
bGllZC4KKyAgICAgICBFeGFtcGxlIChgaGFzQmxvY2tQYXJhbXNgIHdpbGwgYmUgYGZhbHNlYCk6
CisgICAgICAgYGBgaGJzCisgICAgICB7eyEgdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQor
ICAgICAgIHt7I2Zvby1iYXJ9fQorICAgICAgICBObyBibG9jayBwYXJhbWV0ZXIuCisgICAgICB7
ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVzL2NvbXBvbmVudHMvZm9vLWJhci5oYnMg
fX0KKyAgICAgIHt7I2lmIGhhc0Jsb2NrUGFyYW1zfX0KKyAgICAgICAgVGhpcyB3aWxsIG5vdCBi
ZSBwcmludGVkLCBiZWNhdXNlIG5vIGJsb2NrIHdhcyBwcm92aWRlZAorICAgICAgICB7e3lpZWxk
IHRoaXN9fQorICAgICAge3svaWZ9fQorICAgICAgYGBgCisgICAgICAgRXhhbXBsZSAoYGhhc0Js
b2NrUGFyYW1zYCB3aWxsIGJlIGB0cnVlYCk6CisgICAgICAgYGBgaGJzCisgICAgICB7eyEgdGVt
cGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAgICAgIHt7I2Zvby1iYXIgYXMgfGZvb3x9fQor
ICAgICAgICBIaSEKKyAgICAgIHt7L2Zvby1iYXJ9fQorICAgICAgIHt7ISB0ZW1wbGF0ZXMvY29t
cG9uZW50cy9mb28tYmFyLmhicyB9fQorICAgICAge3sjaWYgaGFzQmxvY2tQYXJhbXN9fQorICAg
ICAgICBUaGlzIHdpbGwgYmUgcHJpbnRlZCBiZWNhdXNlIGEgYmxvY2sgd2FzIHByb3ZpZGVkCisg
ICAgICAgIHt7eWllbGQgdGhpc319CisgICAgICB7ey9pZn19CisgICAgICBgYGAKKyAgICAgIEBw
dWJsaWMKKyAgICAgIEBwcm9wZXJ0eSBoYXNCbG9ja1BhcmFtcworICAgICAgQHJldHVybnMgQm9v
bGVhbgorICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIEVuYWJs
ZXMgY29tcG9uZW50cyB0byB0YWtlIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cwor
ICAgICAgIEZvciBleGFtcGxlIGEgY29tcG9uZW50IHRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnMg
d2l0aCB0aGUgbmFtZXMKKyAgICAgIGBuYW1lYCBhbmQgYGFnZWA6CisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgbGV0IE15Q29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZDsKKyAg
ICAgIE15Q29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICAgICAgcG9zaXRpb25hbFBhcmFtczog
WyduYW1lJywgJ2FnZSddCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEl0IGNhbiB0aGVu
IGJlIGludm9rZWQgbGlrZSB0aGlzOgorICAgICAgIGBgYGhicworICAgICAge3tteS1jb21wb25l
bnQgIkpvaG4iIDM4fX0KKyAgICAgIGBgYAorICAgICAgIFRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBy
ZWZlcmVkIHRvIGp1c3QgbGlrZSBuYW1lZCBwYXJhbWV0ZXJzOgorICAgICAgIGBgYGhicworICAg
ICAgTmFtZToge3thdHRycy5uYW1lfX0sIEFnZToge3thdHRycy5hZ2V9fS4KKyAgICAgIGBgYAor
ICAgICAgIFVzaW5nIGEgc3RyaW5nIGluc3RlYWQgb2YgYW4gYXJyYXkgYWxsb3dzIGZvciBhbiBh
cmJpdHJhcnkgbnVtYmVyIG9mCisgICAgICBwYXJhbWV0ZXJzOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIGxldCBNeUNvbXBvbmVudCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQ7CisgICAg
ICBNeUNvbXBvbmVudC5yZW9wZW5DbGFzcyh7CisgICAgICAgIHBvc2l0aW9uYWxQYXJhbXM6ICdu
YW1lcycKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSXQgY2FuIHRoZW4gYmUgaW52b2tl
ZCBsaWtlIHRoaXM6CisgICAgICAgYGBgaGJzCisgICAgICB7e215LWNvbXBvbmVudCAiSm9obiIg
Ik1pY2hhZWwiICJTY290dCJ9fQorICAgICAgYGBgCisgICAgICAgVGhlIHBhcmFtZXRlcnMgY2Fu
IHRoZW4gYmUgcmVmZXJlZCB0byBieSBlbnVtZXJhdGluZyBvdmVyIHRoZSBsaXN0OgorICAgICAg
IGBgYGhicworICAgICAge3sjZWFjaCBhdHRycy5uYW1lcyBhcyB8bmFtZXx9fXt7bmFtZX19e3sv
ZWFjaH19CisgICAgICBgYGAKKyAgICAgICBAc3RhdGljCisgICAgICBAcHVibGljCisgICAgICBA
cHJvcGVydHkgcG9zaXRpb25hbFBhcmFtcworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisK
KyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGVzIHBhc3NlZCBpbnRvIHRo
ZSBjb21wb25lbnQgaGF2ZSBiZWVuIHVwZGF0ZWQuCisgICAgICBDYWxsZWQgYm90aCBkdXJpbmcg
dGhlIGluaXRpYWwgcmVuZGVyIG9mIGEgY29udGFpbmVyIGFuZCBkdXJpbmcgYSByZXJlbmRlci4K
KyAgICAgIENhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIG9ic2VydmVyOyBjb2RlIHBsYWNlZCBo
ZXJlIHdpbGwgYmUgZXhlY3V0ZWQKKyAgICAgIGV2ZXJ5IHRpbWUgYW55IGF0dHJpYnV0ZSB1cGRh
dGVzLgorICAgICAgIEBtZXRob2QgZGlkUmVjZWl2ZUF0dHJzCisgICAgICBAcHVibGljCisgICAg
ICBAc2luY2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhl
IGF0dHJpYnV0ZXMgcGFzc2VkIGludG8gdGhlIGNvbXBvbmVudCBoYXZlIGJlZW4gdXBkYXRlZC4K
KyAgICAgIENhbGxlZCBib3RoIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgb2YgYSBjb250YWlu
ZXIgYW5kIGR1cmluZyBhIHJlcmVuZGVyLgorICAgICAgQ2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2Yg
YW4gb2JzZXJ2ZXI7IGNvZGUgcGxhY2VkIGhlcmUgd2lsbCBiZSBleGVjdXRlZAorICAgICAgZXZl
cnkgdGltZSBhbnkgYXR0cmlidXRlIHVwZGF0ZXMuCisgICAgICAgQGV2ZW50IGRpZFJlY2VpdmVB
dHRycworICAgICAgQHB1YmxpYworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAv
KioKKyAgICAgIENhbGxlZCBhZnRlciBhIGNvbXBvbmVudCBoYXMgYmVlbiByZW5kZXJlZCwgYm90
aCBvbiBpbml0aWFsIHJlbmRlciBhbmQKKyAgICAgIGluIHN1YnNlcXVlbnQgcmVyZW5kZXJzLgor
ICAgICAgIEBtZXRob2QgZGlkUmVuZGVyCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4x
My4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIGFmdGVyIGEgY29tcG9uZW50IGhh
cyBiZWVuIHJlbmRlcmVkLCBib3RoIG9uIGluaXRpYWwgcmVuZGVyIGFuZAorICAgICAgaW4gc3Vi
c2VxdWVudCByZXJlbmRlcnMuCisgICAgICAgQGV2ZW50IGRpZFJlbmRlcgorICAgICAgQHB1Ymxp
YworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIENhbGxlZCBi
ZWZvcmUgYSBjb21wb25lbnQgaGFzIGJlZW4gcmVuZGVyZWQsIGJvdGggb24gaW5pdGlhbCByZW5k
ZXIgYW5kCisgICAgICBpbiBzdWJzZXF1ZW50IHJlcmVuZGVycy4KKyAgICAgICBAbWV0aG9kIHdp
bGxSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5jZSAxLjEzLjAKKyAgICAqLworCisg
ICAgLyoqCisgICAgICBDYWxsZWQgYmVmb3JlIGEgY29tcG9uZW50IGhhcyBiZWVuIHJlbmRlcmVk
LCBib3RoIG9uIGluaXRpYWwgcmVuZGVyIGFuZAorICAgICAgaW4gc3Vic2VxdWVudCByZXJlbmRl
cnMuCisgICAgICAgQGV2ZW50IHdpbGxSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5j
ZSAxLjEzLjAKKyAgICAqLworCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiB0aGUgYXR0cmli
dXRlcyBwYXNzZWQgaW50byB0aGUgY29tcG9uZW50IGhhdmUgYmVlbiBjaGFuZ2VkLgorICAgICAg
Q2FsbGVkIG9ubHkgZHVyaW5nIGEgcmVyZW5kZXIsIG5vdCBkdXJpbmcgYW4gaW5pdGlhbCByZW5k
ZXIuCisgICAgICAgQG1ldGhvZCBkaWRVcGRhdGVBdHRycworICAgICAgQHB1YmxpYworICAgICAg
QHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBh
dHRyaWJ1dGVzIHBhc3NlZCBpbnRvIHRoZSBjb21wb25lbnQgaGF2ZSBiZWVuIGNoYW5nZWQuCisg
ICAgICBDYWxsZWQgb25seSBkdXJpbmcgYSByZXJlbmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFs
IHJlbmRlci4KKyAgICAgICBAZXZlbnQgZGlkVXBkYXRlQXR0cnMKKyAgICAgIEBwdWJsaWMKKyAg
ICAgIEBzaW5jZSAxLjEzLjAKKyAgICAqLworCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiB0
aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBhbmQgcmVyZW5kZXIgaXRzZWxmLgorICAg
ICAgQ2FsbGVkIG9ubHkgZHVyaW5nIGEgcmVyZW5kZXIsIG5vdCBkdXJpbmcgYW4gaW5pdGlhbCBy
ZW5kZXIuCisgICAgICAgQG1ldGhvZCB3aWxsVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBA
c2luY2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNv
bXBvbmVudCBpcyBhYm91dCB0byB1cGRhdGUgYW5kIHJlcmVuZGVyIGl0c2VsZi4KKyAgICAgIENh
bGxlZCBvbmx5IGR1cmluZyBhIHJlcmVuZGVyLCBub3QgZHVyaW5nIGFuIGluaXRpYWwgcmVuZGVy
LgorICAgICAgIEBldmVudCB3aWxsVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2Ug
MS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVu
dCBoYXMgdXBkYXRlZCBhbmQgcmVyZW5kZXJlZCBpdHNlbGYuCisgICAgICBDYWxsZWQgb25seSBk
dXJpbmcgYSByZXJlbmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFsIHJlbmRlci4KKyAgICAgICBA
ZXZlbnQgZGlkVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMy4wCisgICAg
Ki8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgdXBkYXRl
ZCBhbmQgcmVyZW5kZXJlZCBpdHNlbGYuCisgICAgICBDYWxsZWQgb25seSBkdXJpbmcgYSByZXJl
bmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFsIHJlbmRlci4KKyAgICAgICBAZXZlbnQgZGlkVXBk
YXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMy4wCisgICAgKi8KKyAgfSk7CisK
KyAgQ29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICBpc0NvbXBvbmVudEZhY3Rvcnk6IHRydWUK
KyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQ29tcG9uZW50OworfSk7CitlbmlmZWQoJ2Vt
YmVyLXZpZXdzL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2pxdWVyeScsICdlbWJlci12aWV3cy9zeXN0ZW0vdXRpbHMnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2V4dCcsICdlbWJlci1tZXRhbC12aWV3cycsICdlbWJlci12aWV3cy9jb21wb25l
bnRzL2NvbXBvbmVudCcsICdlbWJlci12aWV3cy9zeXN0ZW0vZXZlbnRfZGlzcGF0Y2hlcicsICdl
bWJlci12aWV3cy9taXhpbnMvdmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQnLCAnZW1iZXItdmll
d3MvY29tcG9uZW50X2xvb2t1cCcsICdlbWJlci12aWV3cy92aWV3cy9jaGVja2JveCcsICdlbWJl
ci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3RleHRfZmll
bGQnLCAnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9hcmVhJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJSdW50aW1lLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyVmlld3NTeXN0ZW1V
dGlscywgX2VtYmVyVmlld3NTeXN0ZW1FeHQsIF9lbWJlck1ldGFsVmlld3MsIF9lbWJlclZpZXdz
Q29tcG9uZW50c0NvbXBvbmVudCwgX2VtYmVyVmlld3NTeXN0ZW1FdmVudF9kaXNwYXRjaGVyLCBf
ZW1iZXJWaWV3c01peGluc1ZpZXdfdGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJWaWV3c0Nv
bXBvbmVudF9sb29rdXAsIF9lbWJlclZpZXdzVmlld3NDaGVja2JveCwgX2VtYmVyVmlld3NNaXhp
bnNUZXh0X3N1cHBvcnQsIF9lbWJlclZpZXdzVmlld3NUZXh0X2ZpZWxkLCBfZW1iZXJWaWV3c1Zp
ZXdzVGV4dF9hcmVhKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItdmlld3MKKyAgKi8KKworICAvLyBCRUdJTiBJTVBPUlRTCisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvLyBFTkQgSU1QT1JUUworCisgIC8qKgorICAgIEFsaWFzIGZvciBqUXVlcnkKKyAgCisgICAg
QG1ldGhvZCAkCisgICAgQGZvciBFbWJlcgorICAgQHB1YmxpYworICAqLworCisgIC8vIEJFR0lO
IEVYUE9SVFMKKyAgX2VtYmVyUnVudGltZS5kZWZhdWx0LiQgPSBfZW1iZXJWaWV3c1N5c3RlbUpx
dWVyeS5kZWZhdWx0OworCisgIF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5WaWV3VGFyZ2V0QWN0aW9u
U3VwcG9ydCA9IF9lbWJlclZpZXdzTWl4aW5zVmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQuZGVm
YXVsdDsKKworICB2YXIgVmlld1V0aWxzID0gX2VtYmVyUnVudGltZS5kZWZhdWx0LlZpZXdVdGls
cyA9IHt9OworICBWaWV3VXRpbHMuaXNTaW1wbGVDbGljayA9IF9lbWJlclZpZXdzU3lzdGVtVXRp
bHMuaXNTaW1wbGVDbGljazsKKyAgVmlld1V0aWxzLmdldFZpZXdDbGllbnRSZWN0cyA9IF9lbWJl
clZpZXdzU3lzdGVtVXRpbHMuZ2V0Vmlld0NsaWVudFJlY3RzOworICBWaWV3VXRpbHMuZ2V0Vmll
d0JvdW5kaW5nQ2xpZW50UmVjdCA9IF9lbWJlclZpZXdzU3lzdGVtVXRpbHMuZ2V0Vmlld0JvdW5k
aW5nQ2xpZW50UmVjdDsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuX1JlbmRlcmVyID0gX2Vt
YmVyTWV0YWxWaWV3cy5SZW5kZXJlcjsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuQ2hlY2ti
b3ggPSBfZW1iZXJWaWV3c1ZpZXdzQ2hlY2tib3guZGVmYXVsdDsKKyAgX2VtYmVyUnVudGltZS5k
ZWZhdWx0LlRleHRGaWVsZCA9IF9lbWJlclZpZXdzVmlld3NUZXh0X2ZpZWxkLmRlZmF1bHQ7Cisg
IF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5UZXh0QXJlYSA9IF9lbWJlclZpZXdzVmlld3NUZXh0X2Fy
ZWEuZGVmYXVsdDsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuVGV4dFN1cHBvcnQgPSBfZW1i
ZXJWaWV3c01peGluc1RleHRfc3VwcG9ydC5kZWZhdWx0OworICBfZW1iZXJSdW50aW1lLmRlZmF1
bHQuQ29tcG9uZW50TG9va3VwID0gX2VtYmVyVmlld3NDb21wb25lbnRfbG9va3VwLmRlZmF1bHQ7
CisgIF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5Db21wb25lbnQgPSBfZW1iZXJWaWV3c0NvbXBvbmVu
dHNDb21wb25lbnQuZGVmYXVsdDsKKyAgX2VtYmVyUnVudGltZS5kZWZhdWx0LkV2ZW50RGlzcGF0
Y2hlciA9IF9lbWJlclZpZXdzU3lzdGVtRXZlbnRfZGlzcGF0Y2hlci5kZWZhdWx0OworCisgIC8v
IEVORCBFWFBPUlRTCisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGltZS5kZWZhdWx0
OworfSk7CisvLyBmb3IgdGhlIHNpZGUgZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5ydW4ucXVl
dWVzCitlbmlmZWQoJ2VtYmVyLXZpZXdzL21peGlucy9hcmlhX3JvbGVfc3VwcG9ydCcsIFsnZXhw
b3J0cycsICdlbWJlci1tZXRhbC9taXhpbiddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxNaXhpbikgeworICAvKioKKyAgIEBtb2R1bGUgZW1iZXIKKyAgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICBAY2xhc3MgQXJpYVJv
bGVTdXBwb3J0CisgICBAbmFtZXNwYWNlIEVtYmVyCisgICBAcHJpdmF0ZQorICAqLworICBleHBv
cnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnYXJpYVJvbGU6cm9sZSddLAorCisgICAgLyoqCisgICAgIFRoZSBXQUkt
QVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5IHRoaXMgdmlldy4gRm9yIGV4
YW1wbGUsIGEKKyAgICAgYnV0dG9uIG1heSBoYXZlIGEgcm9sZSBvZiB0eXBlICdidXR0b24nLCBv
ciBhIHBhbmUgbWF5IGhhdmUgYSByb2xlIG9mCisgICAgIHR5cGUgJ2FsZXJ0ZGlhbG9nJy4gVGhp
cyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSBzb2Z0d2FyZSB0byBoZWxwCisgICAgIHZp
c3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUgcmljaCB3ZWIgYXBwbGljYXRpb25zLgor
ICAgICAgVGhlIGZ1bGwgbGlzdCBvZiB2YWxpZCBXQUktQVJJQSByb2xlcyBpcyBhdmFpbGFibGUg
YXQ6CisgICAgIFtodHRwOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRl
Z29yaXphdGlvbl0oaHR0cDovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvcm9sZXMjcm9sZXNfY2F0
ZWdvcml6YXRpb24pCisgICAgICBAcHJvcGVydHkgYXJpYVJvbGUKKyAgICAgQHR5cGUgU3RyaW5n
CisgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgQHB1YmxpYworICAgICovCisgICAgYXJpYVJvbGU6
IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVz
X3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
bWl4aW4nLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vbmF0aXZlX2FycmF5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1l
U3lzdGVtTmF0aXZlX2FycmF5KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBFTVBUWV9BUlJB
WSA9IFtdOworCisgIC8qKgorICAgIEBjbGFzcyBDbGFzc05hbWVzU3VwcG9ydAorICAgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1i
ZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgY29uY2F0ZW5hdGVkUHJvcGVydGllczog
WydjbGFzc05hbWVzJywgJ2NsYXNzTmFtZUJpbmRpbmdzJ10sCisKKyAgICBpbml0OiBmdW5jdGlv
biAoKSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnT25seSBhcnJheXMgYXJlIGFsbG93ZWQgZm9yIFwn
Y2xhc3NOYW1lQmluZGluZ3NcJycsIEFycmF5LmlzQXJyYXkodGhpcy5jbGFzc05hbWVCaW5kaW5n
cykpOworICAgICAgdGhpcy5jbGFzc05hbWVCaW5kaW5ncyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXkuQSh0aGlzLmNsYXNzTmFtZUJpbmRpbmdzLnNsaWNlKCkpOworCisgICAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnT25seSBhcnJheXMgb2Ygc3RhdGljIGNsYXNzIHN0cmlu
Z3MgYXJlIGFsbG93ZWQgZm9yIFwnY2xhc3NOYW1lc1wnLiBGb3IgZHluYW1pYyBjbGFzc2VzLCB1
c2UgXCdjbGFzc05hbWVCaW5kaW5nc1wnLicsIEFycmF5LmlzQXJyYXkodGhpcy5jbGFzc05hbWVz
KSk7CisgICAgICB0aGlzLmNsYXNzTmFtZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2Fy
cmF5LkEodGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IFN0YW5kYXJkIENTUyBjbGFzcyBuYW1lcyB0byBhcHBseSB0byB0aGUgdmlldydzIG91dGVyIGVs
ZW1lbnQuIFRoaXMKKyAgICAgIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkgaW5oZXJpdHMgYW55IGNs
YXNzIG5hbWVzIGRlZmluZWQgYnkgdGhlIHZpZXcncworICAgICAgc3VwZXJjbGFzc2VzIGFzIHdl
bGwuCisgICAgICAgQHByb3BlcnR5IGNsYXNzTmFtZXMKKyAgICAgIEB0eXBlIEFycmF5CisgICAg
ICBAZGVmYXVsdCBbJ2VtYmVyLXZpZXcnXQorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2xh
c3NOYW1lczogWydlbWJlci12aWV3J10sCisKKyAgICAvKioKKyAgICAgIEEgbGlzdCBvZiBwcm9w
ZXJ0aWVzIG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGNsYXNzIG5hbWVzLiBJZiB0aGUgcHJvcGVy
dHkKKyAgICAgIGlzIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhhdCBzdHJpbmcgd2ls
bCBiZSBhcHBsaWVkIGFzIGEgY2xhc3MKKyAgICAgIG5hbWUuCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgLy8gQXBwbGllcyB0aGUgJ2hpZ2gnIGNsYXNzIHRvIHRoZSB2aWV3IGVsZW1lbnQK
KyAgICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
cHJpb3JpdHknXSwKKyAgICAgICAgcHJpb3JpdHk6ICdoaWdoJworICAgICAgfSk7CisgICAgICBg
YGAKKyAgICAgICBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGEgQm9vbGVhbiwgdGhl
IG5hbWUgb2YgdGhhdCBwcm9wZXJ0eSBpcworICAgICAgYWRkZWQgYXMgYSBkYXNoZXJpemVkIGNs
YXNzIG5hbWUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgLy8gQXBwbGllcyB0aGUgJ2lz
LXVyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAorICAgICAgRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc1VyZ2VudCddLAorICAgICAgICBp
c1VyZ2VudDogdHJ1ZQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJZiB5b3Ugd291bGQg
cHJlZmVyIHRvIHVzZSBhIGN1c3RvbSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkYXNoZXJpemVkCisg
ICAgICBwcm9wZXJ0eSBuYW1lLCB5b3UgY2FuIHBhc3MgYSBiaW5kaW5nIGxpa2UgdGhpczoKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBBcHBsaWVzIHRoZSAndXJnZW50JyBjbGFzcyB0
byB0aGUgdmlldyBlbGVtZW50CisgICAgICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50OnVyZ2VudCddLAorICAgICAgICBpc1VyZ2VudDog
dHJ1ZQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlzIGxpc3Qgb2YgcHJvcGVydGll
cyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgdmlldydzIHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgorICAg
ICAgIEBwcm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncworICAgICAgQHR5cGUgQXJyYXkKKyAgICAg
IEBkZWZhdWx0IFtdCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBjbGFzc05hbWVCaW5kaW5n
czogRU1QVFlfQVJSQVkKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3MvbWl4aW5zL2lu
c3RydW1lbnRhdGlvbl9zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJywg
J2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1i
ZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICAgQGNsYXNzIEluc3RydW1lbnRhdGlvblN1cHBvcnQKKyAgICBAbmFtZXNwYWNlIEVt
YmVyCisgICAgQHB1YmxpYworICAqLworICB2YXIgSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKyAgICAvKioKKyAgICAgIFVzZWQgdG8gaWRl
bnRpZnkgdGhpcyB2aWV3IGR1cmluZyBkZWJ1Z2dpbmcKKyAgICAgICBAcHJvcGVydHkgaW5zdHJ1
bWVudERpc3BsYXkKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaW5zdHJ1bWVudERpc3BsYXk6ICcnLAorCisgICAgaW5zdHJ1bWVudE5hbWU6ICd2aWV3JywK
KworICAgIGluc3RydW1lbnREZXRhaWxzOiBmdW5jdGlvbiAoaGFzaCkgeworICAgICAgaGFzaC50
ZW1wbGF0ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGVtcGxhdGVOYW1l
Jyk7CisgICAgICB0aGlzLl9zdXBlcihoYXNoKTsKKyAgICB9CisgIH0pOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IEluc3RydW1lbnRhdGlvblN1cHBvcnQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmll
d3MvbWl4aW5zL2xlZ2FjeV9jaGlsZF92aWV3c19zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnY29udGFpbmVyL293bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQsIF9jb250YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5k
ZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIGxpbmtDaGlsZDog
ZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBpZiAoIWluc3RhbmNlW19jb250YWluZXJPd25l
ci5PV05FUl0pIHsKKyAgICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKGluc3RhbmNlLCBf
Y29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykpOworICAgICAgfQorCisgICAgICBpZiAoX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGluc3RhbmNlLCAncGFyZW50VmlldycpICE9PSB0aGlz
KSB7CisgICAgICAgIC8vIGxpbmtDaGlsZCBzaG91bGQgYmUgaWRlbXBvdGVudAorICAgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoaW5zdGFuY2UsICdwYXJlbnRWaWV3JywgdGhpcyk7
CisgICAgICAgIGluc3RhbmNlLnRyaWdnZXIoJ3BhcmVudFZpZXdEaWRDaGFuZ2UnKTsKKyAgICAg
IH0KKyAgICAgIGluc3RhbmNlLm93bmVyVmlldyA9IHRoaXMub3duZXJWaWV3OworICAgIH0sCisK
KyAgICB1bmxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBfZW1iZXJNZXRh
bFByb3BlcnR5X3NldC5zZXQoaW5zdGFuY2UsICdwYXJlbnRWaWV3JywgbnVsbCk7CisgICAgICBp
bnN0YW5jZS50cmlnZ2VyKCdwYXJlbnRWaWV3RGlkQ2hhbmdlJyk7CisgICAgfQorICB9KTsKK30p
OworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvbGVnYWN5X3ZpZXdfc3VwcG9ydCcsIFsnZXhw
b3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJp
Y3QnOworCisgIC8qKgorICAgIEBjbGFzcyBMZWdhY3lWaWV3U3VwcG9ydAorICAgIEBuYW1lc3Bh
Y2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICB2YXIgTGVnYWN5Vmlld1N1cHBvcnQgPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgbXV0YXRlQ2hpbGRWaWV3czogZnVu
Y3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgY2hpbGRWaWV3cyA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnY2hpbGRWaWV3cycpOworICAgICAgdmFyIGlkeCA9IGNoaWxk
Vmlld3MubGVuZ3RoOworICAgICAgdmFyIHZpZXc7CisKKyAgICAgIHdoaWxlICgtLWlkeCA+PSAw
KSB7CisgICAgICAgIHZpZXcgPSBjaGlsZFZpZXdzW2lkeF07CisgICAgICAgIGNhbGxiYWNrKHRo
aXMsIHZpZXcsIGlkeCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFJlbW92ZXMgYWxsIGNoaWxkcmVuIGZyb20gdGhlIGBwYXJlbnRWaWV3
YC4KKyAgICAgICBAbWV0aG9kIHJlbW92ZUFsbENoaWxkcmVuCisgICAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSByZWNlaXZlcgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHJlbW92ZUFsbENo
aWxkcmVuOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdz
KGZ1bmN0aW9uIChwYXJlbnRWaWV3LCB2aWV3KSB7CisgICAgICAgIHBhcmVudFZpZXcucmVtb3Zl
Q2hpbGQodmlldyk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgZGVzdHJveUFsbENoaWxkcmVu
OiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0
aW9uIChwYXJlbnRWaWV3LCB2aWV3KSB7CisgICAgICAgIHZpZXcuZGVzdHJveSgpOworICAgICAg
fSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9y
IHdob3NlIHBhcmVudCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAgYGtsYXNzYC4KKyAgICAgICBA
bWV0aG9kIG5lYXJlc3RDaGlsZE9mCisgICAgICBAcGFyYW0ge0NsYXNzfSBrbGFzcyBTdWJjbGFz
cyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5WaWV3IGl0c2VsZikKKyAgICAgIEByZXR1cm4gRW1i
ZXIuVmlldworICAgICAgQGRlcHJlY2F0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBu
ZWFyZXN0Q2hpbGRPZjogZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVn
LmRlcHJlY2F0ZSgnbmVhcmVzdENoaWxkT2YgaGFzIGJlZW4gZGVwcmVjYXRlZC4nLCBmYWxzZSwg
eyBpZDogJ2VtYmVyLXZpZXdzLm5lYXJlc3QtY2hpbGQtb2YnLCB1bnRpbDogJzMuMC4wJyB9KTsK
KworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Bh
cmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYgKF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAncGFyZW50VmlldycpIGluc3RhbmNlb2Yga2xhc3Mp
IHsKKyAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQorICAgICAgICB2aWV3ID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQg
aXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkCisgICAgICBjbGFzcy4KKyAgICAgICBAbWV0
aG9kIG5lYXJlc3RJbnN0YW5jZU9mCisgICAgICBAcGFyYW0ge0NsYXNzfSBrbGFzcyBTdWJjbGFz
cyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5WaWV3IGl0c2VsZikKKyAgICAgIEByZXR1cm4gRW1i
ZXIuVmlldworICAgICAgQGRlcHJlY2F0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBu
ZWFyZXN0SW5zdGFuY2VPZjogZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICBfZW1iZXJNZXRhbERl
YnVnLmRlcHJlY2F0ZSgnbmVhcmVzdEluc3RhbmNlT2YgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBi
ZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBVc2UgbmVhcmVzdE9mVHlwZS4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLXZpZXdzLm5lYXJlc3QtaW5zdGFuY2Utb2YnLCB1bnRpbDogJzMuMC4w
JyB9KTsKKworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ3BhcmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYgKHZp
ZXcgaW5zdGFuY2VvZiBrbGFzcykgeworICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9
CisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ3BhcmVu
dFZpZXcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBJZiBhIHZhbHVlIHRo
YXQgYWZmZWN0cyB0ZW1wbGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhlIHZpZXcgc2hvdWxkIGJl
CisgICAgICByZS1yZW5kZXJlZCB0byByZWZsZWN0IHRoZSBuZXcgdmFsdWUuCisgICAgICAgQG1l
dGhvZCBfY29udGV4dERpZENoYW5nZQorICAgICAgQHByaXZhdGUKKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBfY29udGV4dERpZENoYW5nZTogX2VtYmVyTWV0YWxNaXhpbi5vYnNlcnZlcign
Y29udGV4dCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMucmVyZW5kZXIoKTsKKyAgICB9KQor
ICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBMZWdhY3lWaWV3U3VwcG9ydDsKK30pOworZW5p
ZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdGVtcGxhdGVfcmVuZGVyaW5nX3N1cHBvcnQnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsTWl4aW4pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12
aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisKKyAgLy8gQ2lyY3VsYXIgZGVwCisgIHZhciBf
cmVuZGVyVmlldzsKKworICAvKioKKyAgICBAY2xhc3MgVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBwcml2YXRlCisgICovCisgIHZhciBUZW1wbGF0
ZVJlbmRlcmluZ1N1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAg
LyoqCisgICAgICBDYWxsZWQgb24geW91ciB2aWV3IHdoZW4gaXQgc2hvdWxkIHB1c2ggc3RyaW5n
cyBvZiBIVE1MIGludG8gYQorICAgICAgYEVtYmVyLlJlbmRlckJ1ZmZlcmAuIE1vc3QgdXNlcnMg
d2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgdGVtcGxhdGVgCisgICAgICBvciBgdGVtcGxhdGVO
YW1lYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgQnkgZGVmYXVs
dCwgYEVtYmVyLlZpZXdgIHdpbGwgbG9vayBmb3IgYSBmdW5jdGlvbiBpbiB0aGUgYHRlbXBsYXRl
YAorICAgICAgcHJvcGVydHkgYW5kIGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBvZiBgY29udGV4
dGAuIFRoZSB2YWx1ZSBvZgorICAgICAgYGNvbnRleHRgIHdpbGwgYmUgdGhlIHZpZXcncyBjb250
cm9sbGVyIHVubGVzcyB5b3Ugb3ZlcnJpZGUgaXQuCisgICAgICAgQG1ldGhvZCByZW5kZXJCbG9j
aworICAgICAgQHBhcmFtIHtFbWJlci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlciBUaGUgcmVuZGVyIGJ1
ZmZlcgorICAgICAgQHByaXZhdGUKKyAgICAqLworCisgICAgcmVuZGVyQmxvY2s6IGZ1bmN0aW9u
IChibG9jaywgcmVuZGVyTm9kZSkgeworICAgICAgaWYgKF9yZW5kZXJWaWV3ID09PSB1bmRlZmlu
ZWQpIHsKKyAgICAgICAgX3JlbmRlclZpZXcgPSByZXF1aXJlKCdlbWJlci1odG1sYmFycy9zeXN0
ZW0vcmVuZGVyLXZpZXcnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9yZW5kZXJWaWV3LnJl
bmRlckhUTUxCYXJzQmxvY2sodGhpcywgYmxvY2ssIHJlbmRlck5vZGUpOworICAgIH0KKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0OworfSk7Citl
bmlmZWQoJ2VtYmVyLXZpZXdzL21peGlucy90ZXh0X3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJl
ci1tZXRhbC9taXhpbicsICdlbWJlci1ydW50aW1lL21peGlucy90YXJnZXRfYWN0aW9uX3N1cHBv
cnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJN
ZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZU1peGluc1Rh
cmdldF9hY3Rpb25fc3VwcG9ydCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBLRVlfRVZF
TlRTID0geworICAgIDEzOiAnaW5zZXJ0TmV3bGluZScsCisgICAgMjc6ICdjYW5jZWwnCisgIH07
CisKKyAgLyoqCisgICAgYFRleHRTdXBwb3J0YCBpcyBhIHNoYXJlZCBtaXhpbiB1c2VkIGJ5IGJv
dGggYEVtYmVyLlRleHRGaWVsZGAgYW5kCisgICAgYEVtYmVyLlRleHRBcmVhYC4gYFRleHRTdXBw
b3J0YCBhZGRzIGEgbnVtYmVyIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyB5b3UgdG8KKyAgICBzcGVj
aWZ5IGEgY29udHJvbGxlciBhY3Rpb24gdG8gaW52b2tlIHdoZW4gYSBjZXJ0YWluIGV2ZW50IGlz
IGZpcmVkIG9uIHlvdXIKKyAgICB0ZXh0IGZpZWxkIG9yIHRleHRhcmVhLiBUaGUgc3BlY2lmZWQg
Y29udHJvbGxlciBhY3Rpb24gd291bGQgZ2V0IHRoZSBjdXJyZW50CisgICAgdmFsdWUgb2YgdGhl
IGZpZWxkIHBhc3NlZCBpbiBhcyB0aGUgb25seSBhcmd1bWVudCB1bmxlc3MgdGhlIHZhbHVlIG9m
CisgICAgdGhlIGZpZWxkIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIHRoZSBpbnN0YW5jZSBvZiB0
aGUgZmllbGQgaXRzZWxmIGlzIHBhc3NlZAorICAgIGluIGFzIHRoZSBvbmx5IGFyZ3VtZW50Lgor
ICAKKyAgICBMZXQncyB1c2UgdGhlIHByZXNzaW5nIG9mIHRoZSBlc2NhcGUga2V5IGFzIGFuIGV4
YW1wbGUuIElmIHlvdSB3YW50ZWQgdG8KKyAgICBpbnZva2UgYSBjb250cm9sbGVyIGFjdGlvbiB3
aGVuIGEgdXNlciBwcmVzc2VzIHRoZSBlc2NhcGUga2V5IHdoaWxlIG9uIHlvdXIKKyAgICBmaWVs
ZCwgeW91IHdvdWxkIHVzZSB0aGUgYGVzY2FwZS1wcmVzc2AgYXR0cmlidXRlIG9uIHlvdXIgZmll
bGQgbGlrZSBzbzoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgICAge3shIGFwcGxpY2F0aW9u
Lmhic319CisgIAorICAgICAge3tpbnB1dCBlc2NhcGUtcHJlc3M9J2FsZXJ0VXNlcid9fQorICAg
IGBgYAorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0
aW9uLmNyZWF0ZSgpOworICAKKyAgICAgICAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVt
YmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAg
ICBhbGVydFVzZXI6IGZ1bmN0aW9uICggY3VycmVudFZhbHVlICkgeworICAgICAgICAgICAgICBh
bGVydCggJ2VzY2FwZSBwcmVzc2VkLCBjdXJyZW50IHZhbHVlOiAnICsgY3VycmVudFZhbHVlICk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBgYGAKKyAgCisg
ICAgVGhlIGZvbGxvd2luZyBjaGFydCBpcyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB3aGF0
IHRha2VzIHBsYWNlIHdoZW4gdGhlCisgICAgZXNjYXBlIGtleSBpcyBwcmVzc2VkIGluIHRoaXMg
c2NlbmFyaW86CisgIAorICAgIGBgYAorICAgIFRoZSBUZW1wbGF0ZQorICAgICstLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAg
ICB8IGVzY2FwZS1wcmVzcz0nYWxlcnRVc2VyJyAgfAorICAgIHwgICAgICAgICAgICAgICAgICAg
ICAgICAgICB8ICAgICAgICAgIFRleHRTdXBwb3J0IE1peGluCisgICAgKy0tLS0rLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSsgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r
CisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYW5jZWwgbWV0
aG9kICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8ICAgICAgZXNjYXBlIGJ1dHRvbiBwcmVz
c2VkICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfCBjaGVja3MgZm9yIHRoZSBgZXNjYXBlLXBy
ZXNzYCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhdHRy
aWJ1dGUgYW5kIHB1bGxzIG91dCB0aGUgICB8CisgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSsgfCBgYWxlcnRVc2VyYCB2YWx1ZSAgICAgICAgICAgICB8CisgICAgICAg
ICB8ICAgICBhY3Rpb24gbmFtZSAnYWxlcnRVc2VyJyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0rCisgICAgICAgICB8ICAgICBzZW50IHRvIGNvbnRyb2xsZXIKKyAgICAgICAg
IHYKKyAgICBDb250cm9sbGVyCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSArCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisgICAgfCAgYWN0aW9uczogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
CisgICAgfCAgICAgYWxlcnRVc2VyOiBmdW5jdGlvbiggY3VycmVudFZhbHVlICl7ICB8CisgICAg
fCAgICAgICBhbGVydCggJ3RoZSBlc2Mga2V5IHdhcyBwcmVzc2VkIScgKSB8CisgICAgfCAgICAg
fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgfSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgYGBgCisgIAorICAgIEhlcmUgYXJlIHRoZSBldmVu
dHMgdGhhdCB3ZSBjdXJyZW50bHkgc3VwcG9ydCBhbG9uZyB3aXRoIHRoZSBuYW1lIG9mIHRoZQor
ICAgIGF0dHJpYnV0ZSB5b3Ugd291bGQgbmVlZCB0byB1c2Ugb24geW91ciBmaWVsZC4gVG8gcmVp
dGVyYXRlLCB5b3Ugd291bGQgdXNlIHRoZQorICAgIGF0dHJpYnV0ZSBuYW1lIGxpa2Ugc286Cisg
IAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIHt7aW5wdXQgYXR0cmlidXRlLW5hbWU9J2NvbnRy
b2xsZXJBY3Rpb24nfX0KKyAgICBgYGAKKyAgCisgICAgYGBgCisgICAgKy0tLS0tLS0tLS0tLS0t
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAg
ICAgICAgICAgICB8CisgICAgfCBldmVudCAgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgbmFtZSB8
CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBuZXcg
bGluZSBpbnNlcnRlZCAgfCBpbnNlcnQtbmV3bGluZSB8CisgICAgfCAgICAgICAgICAgICAgICAg
ICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBlbnRlciBrZXkgcHJlc3NlZCAgfCBpbnNlcnQt
bmV3bGluZSB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cisg
ICAgfCBjYW5jZWwga2V5IHByZXNzZWQgfCBlc2NhcGUtcHJlc3MgICB8CisgICAgfCAgICAgICAg
ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBmb2N1c2luICAgICAgICAgICAg
fCBmb2N1cy1pbiAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg
ICAgICB8CisgICAgfCBmb2N1c291dCAgICAgICAgICAgfCBmb2N1cy1vdXQgICAgICB8CisgICAg
fCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBrZXlwcmVzcyAg
ICAgICAgICAgfCBrZXktcHJlc3MgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAg
ICAgICAgICAgICAgICB8CisgICAgfCBrZXl1cCAgICAgICAgICAgICAgfCBrZXktdXAgICAgICAg
ICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBr
ZXlkb3duICAgICAgICAgICAgfCBrZXktZG93biAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0t
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgYGBgCisgIAorICAgIEBjbGFzcyBUZXh0U3Vw
cG9ydAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAdXNlcyBFbWJlci5UYXJnZXRBY3Rpb25T
dXBwb3J0CisgICAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgICBAcHJpdmF0ZQorICAqLworICB2
YXIgVGV4dFN1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShfZW1iZXJSdW50
aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LmRlZmF1bHQsIHsKKyAgICB2YWx1ZTogJycs
CisKKyAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydhdXRvY2FwaXRhbGl6ZScsICdhdXRvY29ycmVj
dCcsICdhdXRvZm9jdXMnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdtYXhsZW5ndGgnLCAncGxhY2Vo
b2xkZXInLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnc2VsZWN0aW9uRGlyZWN0aW9uJywgJ3Nw
ZWxsY2hlY2snLCAndGFiaW5kZXgnLCAndGl0bGUnXSwKKyAgICBwbGFjZWhvbGRlcjogbnVsbCwK
KyAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgbWF4bGVuZ3RoOiBudWxsLAorCisgICAgaW5pdDog
ZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
KyAgICAgIHRoaXMub24oJ3Bhc3RlJywgdGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdl
KTsKKyAgICAgIHRoaXMub24oJ2N1dCcsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5n
ZSk7CisgICAgICB0aGlzLm9uKCdpbnB1dCcsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENo
YW5nZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdo
ZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleS4KKyAgICAgICBUaGlzIGlzIHNpbWls
YXIgdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBmaXJlZCB3aGVuCisgICAgICB0
aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5IHdoZW4gZWRpdGluZyBhIHRleHQgZmllbGQs
IGFuZCBzZW5kcworICAgICAgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhcyB0aGUgY29udGV4dC4K
KyAgICAgICBAcHJvcGVydHkgYWN0aW9uCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZh
dWx0IG51bGwKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhY3Rpb246IG51bGwsCisKKyAg
ICAvKioKKyAgICAgIFRoZSBldmVudCB0aGF0IHNob3VsZCBzZW5kIHRoZSBhY3Rpb24uCisgICAg
ICAgT3B0aW9ucyBhcmU6CisgICAgICAgKiBgZW50ZXJgOiB0aGUgdXNlciBwcmVzc2VkIGVudGVy
CisgICAgICAqIGBrZXlQcmVzc2A6IHRoZSB1c2VyIHByZXNzZWQgYSBrZXkKKyAgICAgICBAcHJv
cGVydHkgb25FdmVudAorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBlbnRlcgor
ICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIG9uRXZlbnQ6ICdlbnRlcicsCisKKyAgICAvKioK
KyAgICAgIFdoZXRoZXIgdGhlIGBrZXlVcGAgZXZlbnQgdGhhdCB0cmlnZ2VycyBhbiBgYWN0aW9u
YCB0byBiZSBzZW50IGNvbnRpbnVlcworICAgICAgcHJvcGFnYXRpbmcgdG8gb3RoZXIgdmlld3Mu
CisgICAgICAgQnkgZGVmYXVsdCwgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5
IG9uIHRoZWlyIGtleWJvYXJkIGFuZAorICAgICAgdGhlIHRleHQgZmllbGQgaGFzIGFuIGBhY3Rp
b25gIHNldCwgdGhlIGFjdGlvbiB3aWxsIGJlIHNlbnQgdG8gdGhlIHZpZXcncworICAgICAgY29u
dHJvbGxlciBhbmQgdGhlIGtleSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcuCisgICAgICAg
SWYgeW91IHdvdWxkIGxpa2UgcGFyZW50IHZpZXdzIHRvIHJlY2VpdmUgdGhlIGBrZXlVcGAgZXZl
bnQgZXZlbiBhZnRlciBhbgorICAgICAgYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQsIHNldCBg
YnViYmxlc2AgdG8gdHJ1ZS4KKyAgICAgICBAcHJvcGVydHkgYnViYmxlcworICAgICAgQHR5cGUg
Qm9vbGVhbgorICAgICAgQGRlZmF1bHQgZmFsc2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBidWJibGVzOiBmYWxzZSwKKworICAgIGludGVycHJldEtleUV2ZW50czogZnVuY3Rpb24gKGV2
ZW50KSB7CisgICAgICB2YXIgbWFwID0gS0VZX0VWRU5UUzsKKyAgICAgIHZhciBtZXRob2QgPSBt
YXBbZXZlbnQua2V5Q29kZV07CisKKyAgICAgIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSgp
OworICAgICAgaWYgKG1ldGhvZCkgeworICAgICAgICByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50
KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2VsZW1lbnRWYWx1ZURpZENoYW5nZTogZnVuY3Rp
b24gKCkgeworICAgICAgLy8gVXNpbmcgcmVhZERPTUF0dHIgd2lsbCBlbnN1cmUgdGhhdCBIVE1M
QmFycyBrbm93cyB0aGUgbGFzdAorICAgICAgLy8gdmFsdWUuCisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQodGhpcywgJ3ZhbHVlJywgdGhpcy5yZWFkRE9NQXR0cigndmFsdWUnKSk7
CisgICAgfSwKKworICAgIGNoYW5nZTogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICB0aGlzLl9l
bGVtZW50VmFsdWVEaWRDaGFuZ2UoZXZlbnQpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFs
bG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xsZXIgYWN0aW9uIHRvIGludm9rZSB3aGVuIGVp
dGhlciB0aGUgYGVudGVyYAorICAgICAga2V5IGlzIHByZXNzZWQgb3IsIGluIHRoZSBjYXNlIG9m
IHRoZSBmaWVsZCBiZWluZyBhIHRleHRhcmVhLCB3aGVuIGEgbmV3bGluZQorICAgICAgaXMgaW5z
ZXJ0ZWQuIFRvIHVzZSB0aGlzIG1ldGhvZCwgZ2l2ZSB5b3VyIGZpZWxkIGFuIGBpbnNlcnQtbmV3
bGluZWAKKyAgICAgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlIHNob3Vs
ZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uCisgICAgICBpbiB5b3VyIGNvbnRyb2xsZXIgdGhh
dCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIHVz
ZSB0aGUgYGluc2VydC1uZXdsaW5lYCBhdHRyaWJ1dGUsIHBsZWFzZQorICAgICAgcmVmZXJlbmNl
IHRoZSBleGFtcGxlIG5lYXIgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCisgICAgICAgQG1ldGhvZCBp
bnNlcnROZXdsaW5lCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAgICAgQHByaXZhdGUK
KyAgICAqLworICAgIGluc2VydE5ld2xpbmU6IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgc2Vu
ZEFjdGlvbignZW50ZXInLCB0aGlzLCBldmVudCk7CisgICAgICBzZW5kQWN0aW9uKCdpbnNlcnQt
bmV3bGluZScsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBbGxvd3Mg
eW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgZXNj
YXBlIGJ1dHRvbgorICAgICAgaXMgcHJlc3NlZC4gVG8gdXNlIHRoaXMgbWV0aG9kLCBnaXZlIHlv
dXIgZmllbGQgYW4gYGVzY2FwZS1wcmVzc2AKKyAgICAgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9m
IHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uCisgICAgICBp
biB5b3VyIGNvbnRyb2xsZXIgdGhhdCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFu
IGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGVzY2FwZS1wcmVzc2AgYXR0cmlidXRlLCBwbGVh
c2UgcmVmZXJlbmNlCisgICAgICB0aGUgZXhhbXBsZSBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmaWxl
LgorICAgICAgIEBtZXRob2QgY2FuY2VsCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAg
ICAgQHByaXZhdGUKKyAgICAqLworICAgIGNhbmNlbDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAg
ICBzZW5kQWN0aW9uKCdlc2NhcGUtcHJlc3MnLCB0aGlzLCBldmVudCk7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgY29udHJvbGxlciBhY3Rpb24gdG8g
aW52b2tlIHdoZW4gYSBmaWVsZCByZWNlaXZlcworICAgICAgZm9jdXMuIFRvIHVzZSB0aGlzIG1l
dGhvZCwgZ2l2ZSB5b3VyIGZpZWxkIGEgYGZvY3VzLWluYCBhdHRyaWJ1dGUuIFRoZSB2YWx1ZQor
ICAgICAgb2YgdGhhdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
aW4geW91ciBjb250cm9sbGVyCisgICAgICB0aGF0IHlvdSB3aXNoIHRvIGludm9rZS4KKyAgICAg
ICBGb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gdXNlIHRoZSBgZm9jdXMtaW5gIGF0dHJpYnV0ZSwg
cGxlYXNlIHJlZmVyZW5jZSB0aGUKKyAgICAgIGV4YW1wbGUgbmVhciB0aGUgdG9wIG9mIHRoaXMg
ZmlsZS4KKyAgICAgICBAbWV0aG9kIGZvY3VzSW4KKyAgICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZm9jdXNJbjogZnVuY3Rpb24gKGV2ZW50KSB7
CisgICAgICBzZW5kQWN0aW9uKCdmb2N1cy1pbicsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0
byBpbnZva2Ugd2hlbiBhIGZpZWxkIGxvc2VzCisgICAgICBmb2N1cy4gVG8gdXNlIHRoaXMgbWV0
aG9kLCBnaXZlIHlvdXIgZmllbGQgYSBgZm9jdXMtb3V0YCBhdHRyaWJ1dGUuIFRoZSB2YWx1ZQor
ICAgICAgb2YgdGhhdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
aW4geW91ciBjb250cm9sbGVyCisgICAgICB0aGF0IHlvdSB3aXNoIHRvIGludm9rZS4KKyAgICAg
ICBGb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gdXNlIHRoZSBgZm9jdXMtb3V0YCBhdHRyaWJ1dGUs
IHBsZWFzZSByZWZlcmVuY2UgdGhlCisgICAgICBleGFtcGxlIG5lYXIgdGhlIHRvcCBvZiB0aGlz
IGZpbGUuCisgICAgICAgQG1ldGhvZCBmb2N1c091dAorICAgICAgQHBhcmFtIHtFdmVudH0gZXZl
bnQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmb2N1c091dDogZnVuY3Rpb24gKGV2ZW50
KSB7CisgICAgICB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UoZXZlbnQpOworICAgICAgc2Vu
ZEFjdGlvbignZm9jdXMtb3V0JywgdGhpcywgZXZlbnQpOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xsZXIgYWN0aW9uIHRvIGludm9rZSB3
aGVuIGEga2V5IGlzIHByZXNzZWQuCisgICAgICBUbyB1c2UgdGhpcyBtZXRob2QsIGdpdmUgeW91
ciBmaWVsZCBhIGBrZXktcHJlc3NgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mCisgICAgICB0aGF0
IGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbiB5b3VyIGNvbnRy
b2xsZXIgeW91CisgICAgICB0aGF0IHdpc2ggdG8gaW52b2tlLgorICAgICAgIEZvciBhbiBleGFt
cGxlIG9uIGhvdyB0byB1c2UgdGhlIGBrZXktcHJlc3NgIGF0dHJpYnV0ZSwgcGxlYXNlIHJlZmVy
ZW5jZSB0aGUKKyAgICAgIGV4YW1wbGUgbmVhciB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KKyAgICAg
ICBAbWV0aG9kIGtleVByZXNzCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAgICAgQHBy
aXZhdGUKKyAgICAqLworICAgIGtleVByZXNzOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIHNl
bmRBY3Rpb24oJ2tleS1wcmVzcycsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0byBpbnZva2Ug
d2hlbiBhIGtleS11cCBldmVudCBpcworICAgICAgZmlyZWQuIFRvIHVzZSB0aGlzIG1ldGhvZCwg
Z2l2ZSB5b3VyIGZpZWxkIGEgYGtleS11cGAgYXR0cmlidXRlLiBUaGUgdmFsdWUKKyAgICAgIG9m
IHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIGluIHlvdXIg
Y29udHJvbGxlcgorICAgICAgdGhhdCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFu
IGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGtleS11cGAgYXR0cmlidXRlLCBwbGVhc2UgcmVm
ZXJlbmNlIHRoZQorICAgICAgZXhhbXBsZSBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmaWxlLgorICAg
ICAgIEBtZXRob2Qga2V5VXAKKyAgICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50CisgICAgICBAcHJp
dmF0ZQorICAgICovCisgICAga2V5VXA6IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgdGhpcy5p
bnRlcnByZXRLZXlFdmVudHMoZXZlbnQpOworCisgICAgICB0aGlzLnNlbmRBY3Rpb24oJ2tleS11
cCcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndmFsdWUnKSwgZXZlbnQpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xs
ZXIgYWN0aW9uIHRvIGludm9rZSB3aGVuIGEga2V5LWRvd24gZXZlbnQgaXMKKyAgICAgIGZpcmVk
LiBUbyB1c2UgdGhpcyBtZXRob2QsIGdpdmUgeW91ciBmaWVsZCBhIGBrZXktZG93bmAgYXR0cmli
dXRlLiBUaGUgdmFsdWUKKyAgICAgIG9mIHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFt
ZSBvZiB0aGUgYWN0aW9uIGluIHlvdXIgY29udHJvbGxlciB0aGF0CisgICAgICB5b3Ugd2lzaCB0
byBpbnZva2UuCisgICAgICAgRm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGtleS1k
b3duYCBhdHRyaWJ1dGUsIHBsZWFzZSByZWZlcmVuY2UgdGhlCisgICAgICBleGFtcGxlIG5lYXIg
dGhlIHRvcCBvZiB0aGlzIGZpbGUuCisgICAgICAgQG1ldGhvZCBrZXlEb3duCisgICAgICBAcGFy
YW0ge0V2ZW50fSBldmVudAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGtleURvd246IGZ1
bmN0aW9uIChldmVudCkgeworICAgICAgdGhpcy5zZW5kQWN0aW9uKCdrZXktZG93bicsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndmFsdWUnKSwgZXZlbnQpOworICAgIH0KKyAg
fSk7CisKKyAgLy8gSW4gcHJpbmNpcGxlLCB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1
dCB0aGUgbGVnYWN5CisgIC8vIHNlbmRBY3Rpb24gc2VtYW50aWNzIGZvciBUZXh0RmllbGQgYXJl
IGRpZmZlcmVudCBmcm9tCisgIC8vIHRoZSBjb21wb25lbnQgc2VtYW50aWNzIHNvIHRoaXMgbWV0
aG9kIG5vcm1hbGl6ZXMgdGhlbS4KKyAgZnVuY3Rpb24gc2VuZEFjdGlvbihldmVudE5hbWUsIHZp
ZXcsIGV2ZW50KSB7CisgICAgdmFyIGFjdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh2aWV3LCAnYXR0cnMuJyArIGV2ZW50TmFtZSkgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHZpZXcsIGV2ZW50TmFtZSk7CisgICAgdmFyIG9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHZpZXcsICdvbkV2ZW50Jyk7CisgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHZpZXcsICd2YWx1ZScpOworCisgICAgLy8gYmFjay1jb21wYXQgc3VwcG9y
dCBmb3Iga2V5UHJlc3MgYXMgYW4gZXZlbnQgbmFtZSBldmVuIHRob3VnaAorICAgIC8vIGl0J3Mg
YWxzbyBhIG1ldGhvZCBuYW1lIHRoYXQgY29uc3VtZXMgdGhlIGV2ZW50IChhbmQgdGhlcmVmb3Jl
CisgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggc2VuZEFjdGlvbiBzZW1hbnRpY3MpLgorICAgIGlm
IChvbiA9PT0gZXZlbnROYW1lIHx8IG9uID09PSAna2V5UHJlc3MnICYmIGV2ZW50TmFtZSA9PT0g
J2tleS1wcmVzcycpIHsKKyAgICAgIHZpZXcuc2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOwor
ICAgIH0KKworICAgIHZpZXcuc2VuZEFjdGlvbihldmVudE5hbWUsIHZhbHVlKTsKKworICAgIGlm
IChhY3Rpb24gfHwgb24gPT09IGV2ZW50TmFtZSkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQodmlldywgJ2J1YmJsZXMnKSkgeworICAgICAgICBldmVudC5zdG9wUHJv
cGFnYXRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBU
ZXh0U3VwcG9ydDsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlld19jaGlsZF92
aWV3c19zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1l
dGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vbmF0aXZlX2FycmF5JywgJ2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVz
LCBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LCBfY29udGFpbmVyT3duZXIpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIEVNUFRZX0FSUkFZID0gW107CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAgQXJy
YXkgb2YgY2hpbGQgdmlld3MuIFlvdSBzaG91bGQgbmV2ZXIgZWRpdCB0aGlzIGFycmF5IGRpcmVj
dGx5LgorICAgICAgSW5zdGVhZCwgdXNlIGBhcHBlbmRDaGlsZGAgYW5kIGByZW1vdmVGcm9tUGFy
ZW50YC4KKyAgICAgICBAcHJvcGVydHkgY2hpbGRWaWV3cworICAgICAgQHR5cGUgQXJyYXkKKyAg
ICAgIEBkZWZhdWx0IFtdCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY2hpbGRWaWV3czog
RU1QVFlfQVJSQVksCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICAvLyBzZXR1cCBjaGlsZCB2aWV3cy4g
YmUgc3VyZSB0byBjbG9uZSB0aGUgY2hpbGQgdmlld3MgYXJyYXkgZmlyc3QKKyAgICAgIC8vIDIu
MFRPRE86IFJlbW92ZSBFbWJlci5BKCkgaGVyZQorICAgICAgdGhpcy5jaGlsZFZpZXdzID0gX2Vt
YmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHRoaXMuY2hpbGRWaWV3cy5zbGljZSgpKTsK
KyAgICAgIHRoaXMub3duZXJWaWV3ID0gdGhpcy5vd25lclZpZXcgfHwgdGhpczsKKyAgICB9LAor
CisgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB0aGlzLmxpbmtDaGls
ZCh2aWV3KTsKKyAgICAgIHRoaXMuY2hpbGRWaWV3cy5wdXNoKHZpZXcpOworICAgIH0sCisKKyAg
ICBkZXN0cm95Q2hpbGQ6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3LmRlc3Ryb3koKTsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBSZW1vdmVzIHRoZSBjaGlsZCB2aWV3IGZyb20gdGhl
IHBhcmVudCB2aWV3LgorICAgICAgIEBtZXRob2QgcmVtb3ZlQ2hpbGQKKyAgICAgIEBwYXJhbSB7
RW1iZXIuVmlld30gdmlldworICAgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAg
ICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW1vdmVDaGlsZDogZnVuY3Rpb24gKHZpZXcpIHsK
KyAgICAgIC8vIElmIHdlJ3JlIGRlc3Ryb3lpbmcsIHRoZSBlbnRpcmUgc3VidHJlZSB3aWxsIGJl
CisgICAgICAvLyBmcmVlZCwgYW5kIHRoZSBET00gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHks
CisgICAgICAvLyBzbyBubyBuZWVkIHRvIG1lc3Mgd2l0aCBjaGlsZFZpZXdzLgorICAgICAgaWYg
KHRoaXMuaXNEZXN0cm95aW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAg
Ly8gdXBkYXRlIHBhcmVudCBub2RlCisgICAgICB0aGlzLnVubGlua0NoaWxkKHZpZXcpOworCisg
ICAgICAvLyByZW1vdmUgdmlldyBmcm9tIGNoaWxkVmlld3MgYXJyYXkuCisgICAgICB2YXIgY2hp
bGRWaWV3cyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY2hpbGRWaWV3cycp
OworCisgICAgICB2YXIgaW5kZXggPSBjaGlsZFZpZXdzLmluZGV4T2Yodmlldyk7CisgICAgICBp
ZiAoaW5kZXggIT09IC0xKSB7CisgICAgICAgIGNoaWxkVmlld3Muc3BsaWNlKGluZGV4LCAxKTsK
KyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
SW5zdGFudGlhdGVzIGEgdmlldyB0byBiZSBhZGRlZCB0byB0aGUgY2hpbGRWaWV3cyBhcnJheSBk
dXJpbmcgdmlldworICAgICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbCBub3Qg
Y2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSB1bmxlc3MKKyAgICAgIHlvdSBhcmUgb3ZlcnJpZGlu
ZyBgY3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKKyAgICAg
IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBjb3JyZWN0IHNldHRpbmdzIG9uIHRoZSBuZXcg
dmlldyBpbnN0YW5jZSB0bworICAgICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC4KKyAg
ICAgICBAbWV0aG9kIGNyZWF0ZUNoaWxkVmlldworICAgICAgQHBhcmFtIHtDbGFzc3xTdHJpbmd9
IHZpZXdDbGFzcworICAgICAgQHBhcmFtIHtPYmplY3R9IFthdHRyc10gQXR0cmlidXRlcyB0byBh
ZGQKKyAgICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IG5ldyBpbnN0YW5jZQorICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24gKG1heWJlVmlld0NsYXNz
KSB7CisgICAgICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRz
WzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKKworICAgICAgaWYgKCFtYXli
ZVZpZXdDbGFzcykgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjcmVhdGVDaGlsZFZp
ZXdzIGZpcnN0IGFyZ3VtZW50IG11c3QgZXhpc3QnKTsKKyAgICAgIH0KKworICAgICAgdmFyIG93
bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworCisgICAgICBpZiAobWF5YmVW
aWV3Q2xhc3MuaXNWaWV3ICYmIG1heWJlVmlld0NsYXNzLnBhcmVudFZpZXcgPT09IHRoaXMgJiYg
X2NvbnRhaW5lck93bmVyLmdldE93bmVyKG1heWJlVmlld0NsYXNzKSA9PT0gb3duZXIpIHsKKyAg
ICAgICAgcmV0dXJuIG1heWJlVmlld0NsYXNzOworICAgICAgfQorCisgICAgICB2YXIgdmlldzsK
KworICAgICAgYXR0cnMucGFyZW50VmlldyA9IHRoaXM7CisgICAgICBhdHRycy5yZW5kZXJlciA9
IHRoaXMucmVuZGVyZXI7CisgICAgICBhdHRycy5fdmlld1JlZ2lzdHJ5ID0gdGhpcy5fdmlld1Jl
Z2lzdHJ5OworCisgICAgICBpZiAobWF5YmVWaWV3Q2xhc3MuaXNWaWV3RmFjdG9yeSkgeworICAg
ICAgICBfY29udGFpbmVyT3duZXIuc2V0T3duZXIoYXR0cnMsIG93bmVyKTsKKworICAgICAgICB2
aWV3ID0gbWF5YmVWaWV3Q2xhc3MuY3JlYXRlKGF0dHJzKTsKKworICAgICAgICBpZiAodmlldy52
aWV3TmFtZSkgeworICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCB2
aWV3LnZpZXdOYW1lLCB2aWV3KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgnc3RyaW5n
JyA9PT0gdHlwZW9mIG1heWJlVmlld0NsYXNzKSB7CisgICAgICAgIHZhciBmdWxsTmFtZSA9ICd2
aWV3OicgKyBtYXliZVZpZXdDbGFzczsKKyAgICAgICAgdmFyIFZpZXdLbGFzcyA9IG93bmVyLl9s
b29rdXBGYWN0b3J5KGZ1bGxOYW1lKTsKKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnQ291bGQgbm90IGZpbmQgdmlldzogXCcnICsgZnVsbE5hbWUgKyAnXCcnLCAhIVZpZXdLbGFz
cyk7CisKKyAgICAgICAgdmlldyA9IFZpZXdLbGFzcy5jcmVhdGUoYXR0cnMpOworICAgICAgfSBl
bHNlIHsKKyAgICAgICAgdmlldyA9IG1heWJlVmlld0NsYXNzOworICAgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IG11c3QgcGFzcyBpbnN0YW5jZSBvciBzdWJjbGFzcyBvZiBWaWV3
Jywgdmlldy5pc1ZpZXcpOworCisgICAgICAgIF9jb250YWluZXJPd25lci5zZXRPd25lcihhdHRy
cywgb3duZXIpOworICAgICAgICBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQodmll
dywgYXR0cnMpOworICAgICAgfQorCisgICAgICB0aGlzLmxpbmtDaGlsZCh2aWV3KTsKKworICAg
ICAgcmV0dXJuIHZpZXc7CisgICAgfSwKKworICAgIGxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3Rh
bmNlKSB7CisgICAgICBpZiAoIWluc3RhbmNlW19jb250YWluZXJPd25lci5PV05FUl0pIHsKKyAg
ICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKGluc3RhbmNlLCBfY29udGFpbmVyT3duZXIu
Z2V0T3duZXIodGhpcykpOworICAgICAgfQorCisgICAgICBpbnN0YW5jZS5wYXJlbnRWaWV3ID0g
dGhpczsKKyAgICAgIGluc3RhbmNlLm93bmVyVmlldyA9IHRoaXMub3duZXJWaWV3OworICAgIH0s
CisKKyAgICB1bmxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBpbnN0YW5j
ZS5wYXJlbnRWaWV3ID0gbnVsbDsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXZp
ZXdzL21peGlucy92aWV3X2NvbnRleHRfc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9taXhpbicsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9n
ZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLXZpZXdzL21peGlucy9sZWdh
Y3lfdmlld19zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJWaWV3c01peGluc0xlZ2Fj
eV92aWV3X3N1cHBvcnQsIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBWaWV3Q29udGV4dFN1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShf
ZW1iZXJWaWV3c01peGluc0xlZ2FjeV92aWV3X3N1cHBvcnQuZGVmYXVsdCwgeworICAgIC8qKgor
ICAgICAgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNjZXNzIHByb3Bl
cnRpZXMuCisgICAgICAgVGhpcyBvYmplY3Qgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRl
IGZ1bmN0aW9uIGVhY2ggdGltZSB0aGUgcmVuZGVyCisgICAgICBtZXRob2QgaXMgY2FsbGVkLCBi
dXQgaXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKKyAg
ICAgIHRvIGRvIHdpdGggaXQuCisgICAgICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSB2
aWV3J3MgY29udHJvbGxlci4KKyAgICAgICBAcHJvcGVydHkgY29udGV4dAorICAgICAgQHR5cGUg
T2JqZWN0CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29udGV4dDogX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZCh7CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0
dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX2NvbnRleHQnKTsKKyAgICAg
IH0sCisgICAgICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICAgIF9lbWJlck1l
dGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnX2NvbnRleHQnLCB2YWx1ZSk7CisgICAgICAgIHJl
dHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9KSwKKworICAgIC8qKgorICAgICAgUHJpdmF0ZSBj
b3B5IG9mIHRoZSB2aWV3J3MgdGVtcGxhdGUgY29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRpcmVj
dGx5CisgICAgICBieSBIYW5kbGViYXJzIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgb2JzZXJ2ZXIg
dGhhdCBjYXVzZXMgdGhlIHZpZXcKKyAgICAgIHRvIGJlIHJlLXJlbmRlcmVkLgorICAgICAgIFRo
ZSBjb250ZXh0IG9mIGEgdmlldyBpcyBsb29rZWQgdXAgYXMgZm9sbG93czoKKyAgICAgICAxLiBT
dXBwbGllZCBjb250ZXh0ICh1c3VhbGx5IGJ5IEhhbmRsZWJhcnMpCisgICAgICAyLiBTcGVjaWZp
ZWQgY29udHJvbGxlcgorICAgICAgMy4gYHBhcmVudFZpZXdgJ3MgY29udGV4dAorICAgICAgIFRo
ZSBjb2RlIGluIEhhbmRsZWJhcnMgdGhhdCBvdmVycmlkZXMgdGhlIGBfY29udGV4dGAgcHJvcGVy
dHkgZmlyc3QKKyAgICAgIGNoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgdmlldyBoYXMgYSBzcGVj
aWZpZWQgY29udHJvbGxlci4gVGhpcyBpcworICAgICAgc29tZXRoaW5nIG9mIGEgaGFjayBhbmQg
c2hvdWxkIGJlIHJldmlzaXRlZC4KKyAgICAgICBAcHJvcGVydHkgX2NvbnRleHQKKyAgICAgIEBw
cml2YXRlCisgICAgKi8KKyAgICBfY29udGV4dDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRl
ZCh7CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHBhcmVudFZpZXcsIGNv
bnRyb2xsZXI7CisKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2NvbnRyb2xsZXInKSkgeworICAgICAgICAgIHJldHVybiBjb250cm9s
bGVyOworICAgICAgICB9CisKKyAgICAgICAgcGFyZW50VmlldyA9IHRoaXMucGFyZW50VmlldzsK
KyAgICAgICAgaWYgKHBhcmVudFZpZXcpIHsKKyAgICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHBhcmVudFZpZXcsICdfY29udGV4dCcpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiBudWxsOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rpb24gKGtleSwgdmFs
dWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2Nv
bnRyb2xsZXI6IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBjb250cm9sbGVyIG1hbmFnaW5n
IHRoaXMgdmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgYmUKKyAgICAgIG1h
ZGUgYXZhaWxhYmxlIGZvciB1c2UgYnkgdGhlIHRlbXBsYXRlLgorICAgICAgIEBwcm9wZXJ0eSBj
b250cm9sbGVyCisgICAgICBAdHlwZSBPYmplY3QKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBjb250cm9sbGVyOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICAgIGdldDog
ZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAodGhpcy5fY29udHJvbGxlcikgeworICAgICAgICAg
IHJldHVybiB0aGlzLl9jb250cm9sbGVyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRo
aXMucGFyZW50VmlldyA/IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLnBhcmVudFZp
ZXcsICdjb250cm9sbGVyJykgOiBudWxsOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rpb24g
KF8sIHZhbHVlKSB7CisgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIgPSB2YWx1ZTsKKyAgICAgICAg
cmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2xlZ2FjeUNvbnRyb2xsZXJE
aWRDaGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2NvbnRyb2xsZXInLCBmdW5jdGlv
biAoKSB7CisgICAgICB0aGlzLmNoaWxkVmlld3MuZm9yRWFjaChmdW5jdGlvbiAodmlldykgewor
ICAgICAgICByZXR1cm4gdmlldy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgnY29udHJvbGxlcicpOwor
ICAgICAgfSk7CisgICAgfSksCisKKyAgICBfbm90aWZ5Q29udHJvbGxlckNoYW5nZTogX2VtYmVy
TWV0YWxFdmVudHMub24oJ3BhcmVudFZpZXdEaWRDaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CisgICAg
ICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdjb250cm9sbGVyJyk7CisgICAgfSkKKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVmlld0NvbnRleHRTdXBwb3J0OworfSk7CitlbmlmZWQo
J2VtYmVyLXZpZXdzL21peGlucy92aWV3X3N0YXRlX3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsTWl4aW4pIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIHZhciBWaWV3U3RhdGVTdXBwb3J0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUo
eworICAgIHRyYW5zaXRpb25UbzogZnVuY3Rpb24gKHN0YXRlKSB7CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlcHJlY2F0ZSgnRW1iZXIuVmlldyN0cmFuc2l0aW9uVG8gaGFzIGJlZW4gZGVwcmVj
YXRlZCwgaXQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5JywgZmFsc2UsIHsgaWQ6ICdlbWJlci12
aWV3cy52aWV3LXRyYW5zaXRpb24tdG8nLCB1bnRpbDogJzIuNC4wJyB9KTsKKyAgICAgIHRoaXMu
X3RyYW5zaXRpb25UbyhzdGF0ZSk7CisgICAgfSwKKworICAgIF90cmFuc2l0aW9uVG86IGZ1bmN0
aW9uIChzdGF0ZSkgeworICAgICAgdmFyIHByaW9yU3RhdGUgPSB0aGlzLl9jdXJyZW50U3RhdGU7
CisgICAgICB2YXIgY3VycmVudFN0YXRlID0gdGhpcy5fY3VycmVudFN0YXRlID0gdGhpcy5fc3Rh
dGVzW3N0YXRlXTsKKyAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7CisKKyAgICAgIGlmIChwcmlv
clN0YXRlICYmIHByaW9yU3RhdGUuZXhpdCkgeworICAgICAgICBwcmlvclN0YXRlLmV4aXQodGhp
cyk7CisgICAgICB9CisgICAgICBpZiAoY3VycmVudFN0YXRlLmVudGVyKSB7CisgICAgICAgIGN1
cnJlbnRTdGF0ZS5lbnRlcih0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IFZpZXdTdGF0ZVN1cHBvcnQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mv
bWl4aW5zL3ZpZXdfc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0
YWwvcnVuX2xvb3AnLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwvdXRpbHMn
LCAnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItcnVu
dGltZS9zeXN0ZW0vY29yZV9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3ltYm9sJywgJ2NvbnRhaW5l
ci9vd25lcicsICdlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5J10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCwgX2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVyTWV0
YWxVdGlscywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVu
dGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1iZXJNZXRhbFN5bWJvbCwgX2NvbnRhaW5lck93bmVy
LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIF9N
aXhpbiRjcmVhdGU7CisKKyAgdmFyIElOSVRfV0FTX0NBTExFRCA9IF9lbWJlck1ldGFsU3ltYm9s
LmRlZmF1bHQoJ0lOSVRfV0FTX0NBTExFRCcpOworCisgIGZ1bmN0aW9uIEsoKSB7CisgICAgcmV0
dXJuIHRoaXM7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1p
eGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHsKKyAgICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVz
OiBbJ2F0dHJpYnV0ZUJpbmRpbmdzJ10sCisKKyAgICAvKioKKyAgICAgIEBwcm9wZXJ0eSBpc1Zp
ZXcKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IHRydWUKKyAgICAgIEBzdGF0
aWMKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBpc1ZpZXc6IHRydWUsCisKKyAgICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
CisgICAgLy8gVEVNUExBVEUgU1VQUE9SVAorICAgIC8vCisKKyAgICAvKioKKyAgICAgIFRoZSBu
YW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUgaXMgcHJvdmlkZWQu
CisgICAgICAgQnkgZGVmYXVsdCBgRW1iZXIuVmlld2Agd2lsbCBsb29rdXAgYSB0ZW1wbGF0ZSB3
aXRoIHRoaXMgbmFtZSBpbgorICAgICAgYEVtYmVyLlRFTVBMQVRFU2AgKGEgc2hhcmVkIGdsb2Jh
bCBvYmplY3QpLgorICAgICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZU5hbWUKKyAgICAgIEB0eXBlIFN0
cmluZworICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHRl
bXBsYXRlTmFtZTogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIG5hbWUgb2YgdGhlIGxheW91
dCB0byBsb29rdXAgaWYgbm8gbGF5b3V0IGlzIHByb3ZpZGVkLgorICAgICAgIEJ5IGRlZmF1bHQg
YEVtYmVyLlZpZXdgIHdpbGwgbG9va3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgaW4KKyAg
ICAgIGBFbWJlci5URU1QTEFURVNgIChhIHNoYXJlZCBnbG9iYWwgb2JqZWN0KS4KKyAgICAgICBA
cHJvcGVydHkgbGF5b3V0TmFtZQorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBu
dWxsCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgbGF5b3V0TmFtZTogbnVsbCwKKworICAg
IC8qKgorICAgICAgVGhlIHRlbXBsYXRlIHVzZWQgdG8gcmVuZGVyIHRoZSB2aWV3LiBUaGlzIHNo
b3VsZCBiZSBhIGZ1bmN0aW9uIHRoYXQKKyAgICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4
dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0CisgICAgICB3aWxs
IGJlIGluc2VydGVkIGludG8gdGhlIERPTSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHZpZXcuCisg
ICAgICAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3Bl
cnR5IGluc3RlYWQgb2Ygc2V0dGluZworICAgICAgdGhlIHRlbXBsYXRlIHlvdXJzZWxmLgorICAg
ICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZQorICAgICAgQHR5cGUgRnVuY3Rpb24KKyAgICAgIEBwcml2
YXRlCisgICAgKi8KKyAgICB0ZW1wbGF0ZTogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCh7
CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGVtcGxhdGVOYW1lJyk7CisgICAgICAg
IHZhciB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKHRlbXBsYXRlTmFtZSwgJ3RlbXBs
YXRlJyk7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVkIHRo
ZSB0ZW1wbGF0ZU5hbWUgJyArIHRlbXBsYXRlTmFtZSArICcgZm9yICcgKyB0aGlzICsgJywgYnV0
IGl0IGRpZCBub3QgZXhpc3QuJywgIXRlbXBsYXRlTmFtZSB8fCAhIXRlbXBsYXRlKTsKKyAgICAg
ICAgcmV0dXJuIHRlbXBsYXRlIHx8IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
ZGVmYXVsdFRlbXBsYXRlJyk7CisgICAgICB9LAorICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2
YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHJl
dHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsIGtleSk7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAgICAg
IEEgdmlldyBtYXkgY29udGFpbiBhIGxheW91dC4gQSBsYXlvdXQgaXMgYSByZWd1bGFyIHRlbXBs
YXRlIGJ1dAorICAgICAgc3VwZXJzZWRlcyB0aGUgYHRlbXBsYXRlYCBwcm9wZXJ0eSBkdXJpbmcg
cmVuZGVyaW5nLiBJdCBpcyB0aGUKKyAgICAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBsYXlvdXQg
dGVtcGxhdGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAKKyAgICAgIHByb3BlcnR5IGZyb20g
dGhlIHZpZXcgKG9yIGFsdGVybmF0aXZlbHksIGNhbGwgYEhhbmRsZWJhcnMuaGVscGVycy55aWVs
ZGAsCisgICAgICBge3t5aWVsZH19YCkgdG8gcmVuZGVyIGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0
aW9uLgorICAgICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZpZXcgdGhhdCBoYXMgYSBzaGFyZWQg
d3JhcHBlciwgYnV0IHdoaWNoIGRlbGVnYXRlcworICAgICAgdGhlIHJlbmRlcmluZyBvZiB0aGUg
Y29udGVudHMgb2YgdGhlIHdyYXBwZXIgdG8gdGhlIGB0ZW1wbGF0ZWAgcHJvcGVydHkKKyAgICAg
IG9uIGEgc3ViY2xhc3MuCisgICAgICAgQHByb3BlcnR5IGxheW91dAorICAgICAgQHR5cGUgRnVu
Y3Rpb24KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBsYXlvdXQ6IF9lbWJlck1ldGFsQ29t
cHV0ZWQuY29tcHV0ZWQoeworICAgICAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICAgIHZh
ciBsYXlvdXROYW1lID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsYXlvdXRO
YW1lJyk7CisgICAgICAgIHZhciBsYXlvdXQgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZShsYXlvdXRO
YW1lLCAnbGF5b3V0Jyk7CisKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBz
cGVjaWZpZWQgdGhlIGxheW91dE5hbWUgJyArIGxheW91dE5hbWUgKyAnIGZvciAnICsgdGhpcyAr
ICcsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LicsICFsYXlvdXROYW1lIHx8ICEhbGF5b3V0KTsKKwor
ICAgICAgICByZXR1cm4gbGF5b3V0IHx8IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlz
LCAnZGVmYXVsdExheW91dCcpOworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5
LCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgfSksCisKKyAg
ICB0ZW1wbGF0ZUZvck5hbWU6IGZ1bmN0aW9uIChuYW1lLCB0eXBlKSB7CisgICAgICBpZiAoIW5h
bWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ3RlbXBsYXRlTmFtZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gcGVyaW9kczog
JyArIG5hbWUsIG5hbWUuaW5kZXhPZignLicpID09PSAtMSk7CisKKyAgICAgIHZhciBvd25lciA9
IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKworICAgICAgaWYgKCFvd25lcikgewor
ICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDb250YWluZXIgd2Fz
IG5vdCBmb3VuZCB3aGVuIGxvb2tpbmcgdXAgYSB2aWV3cyB0ZW1wbGF0ZS4gJyArICdUaGlzIGlz
IG1vc3QgbGlrZWx5IGR1ZSB0byBtYW51YWxseSBpbnN0YW50aWF0aW5nIGFuIEVtYmVyLlZpZXcu
ICcgKyAnU2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQScpOworICAgICAgfQorCisgICAgICByZXR1
cm4gb3duZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2Yg
dGhlIHByb3ZpZGVkCisgICAgICBjbGFzcyBvciBtaXhpbi4KKyAgICAgICBAbWV0aG9kIG5lYXJl
c3RPZlR5cGUKKyAgICAgIEBwYXJhbSB7Q2xhc3MsTWl4aW59IGtsYXNzIFN1YmNsYXNzIG9mIEVt
YmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKSwKKyAgICAgICAgICAgICBvciBhbiBpbnN0
YW5jZSBvZiBFbWJlci5NaXhpbi4KKyAgICAgIEByZXR1cm4gRW1iZXIuVmlldworICAgICAgQHBy
aXZhdGUKKyAgICAqLworICAgIG5lYXJlc3RPZlR5cGU6IGZ1bmN0aW9uIChrbGFzcykgeworICAg
ICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3BhcmVudFZp
ZXcnKTsKKyAgICAgIHZhciBpc09mVHlwZSA9IGtsYXNzIGluc3RhbmNlb2YgX2VtYmVyTWV0YWxN
aXhpbi5NaXhpbiA/IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICAgIHJldHVybiBrbGFzcy5kZXRl
Y3Qodmlldyk7CisgICAgICB9IDogZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgICAgcmV0dXJuIGts
YXNzLmRldGVjdCh2aWV3LmNvbnN0cnVjdG9yKTsKKyAgICAgIH07CisKKyAgICAgIHdoaWxlICh2
aWV3KSB7CisgICAgICAgIGlmIChpc09mVHlwZSh2aWV3KSkgeworICAgICAgICAgIHJldHVybiB2
aWV3OworICAgICAgICB9CisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eS4K
KyAgICAgICBAbWV0aG9kIG5lYXJlc3RXaXRoUHJvcGVydHkKKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wZXJ0eSBBIHByb3BlcnR5IG5hbWUKKyAgICAgIEByZXR1cm4gRW1iZXIuVmlldworICAg
ICAgQHByaXZhdGUKKyAgICAqLworICAgIG5lYXJlc3RXaXRoUHJvcGVydHk6IGZ1bmN0aW9uIChw
cm9wZXJ0eSkgeworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcywgJ3BhcmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYg
KHByb3BlcnR5IGluIHZpZXcpIHsKKyAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQor
ICAgICAgICB2aWV3ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHZpZXcsICdwYXJlbnRW
aWV3Jyk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVuZGVycyB0aGUgdmll
dyBhZ2Fpbi4gVGhpcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQorICAgICAg
dmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmlldyBpcyBpbiB0aGUg
RE9NLCB0aGUKKyAgICAgIHJlbmRlcmluZyBwcm9jZXNzIHdpbGwgYmUgZGVmZXJyZWQgdG8gZ2l2
ZSBiaW5kaW5ncyBhIGNoYW5jZQorICAgICAgdG8gc3luY2hyb25pemUuCisgICAgICAgSWYgY2hp
bGRyZW4gd2VyZSBhZGRlZCBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzIHVzaW5nIGBhcHBl
bmRDaGlsZGAsCisgICAgICBgcmVyZW5kZXJgIHdpbGwgcmVtb3ZlIHRoZW0sIGJlY2F1c2UgdGhl
eSB3aWxsIGJlIGFkZGVkIGFnYWluCisgICAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJlbmRl
cmAuCisgICAgICAgSW4gZ2VuZXJhbCwgaWYgdGhlIGRpc3BsYXkgb2YgeW91ciB2aWV3IGNoYW5n
ZXMsIHlvdSBzaG91bGQgbW9kaWZ5CisgICAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5z
dGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgorICAgICAgYmUg
c2xvdy4KKyAgICAgICBAbWV0aG9kIHJlcmVuZGVyCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICByZXJlbmRlcjogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0
ZS5yZXJlbmRlcih0aGlzKTsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIEVMRU1FTlQgU1VQ
UE9SVAorICAgIC8vCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgRE9NIGVs
ZW1lbnQgZm9yIHRoZSB2aWV3LgorICAgICAgIEBwcm9wZXJ0eSBlbGVtZW50CisgICAgICBAdHlw
ZSBET01FbGVtZW50CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBlbGVtZW50OiBudWxsLAor
CisgICAgLyoqCisgICAgICBSZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3Mg
ZWxlbWVudC4gSWYgeW91IHBhc3MgaW4gYSBzZWxlY3RvcgorICAgICAgc3RyaW5nLCB0aGlzIG1l
dGhvZCB3aWxsIHJldHVybiBhIGpRdWVyeSBvYmplY3QsIHVzaW5nIHRoZSBjdXJyZW50IGVsZW1l
bnQKKyAgICAgIGFzIGl0cyBidWZmZXIuCisgICAgICAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgYHZp
ZXcuJCgnbGknKWAgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAg
IGFsbCBvZiB0aGUgYGxpYCBlbGVtZW50cyBpbnNpZGUgdGhlIERPTSBlbGVtZW50IG9mIHRoaXMg
dmlldy4KKyAgICAgICBAbWV0aG9kICQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBbc2VsZWN0b3Jd
IGEgalF1ZXJ5LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nCisgICAgICBAcmV0dXJuIHtqUXVl
cnl9IHRoZSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgRE9NIG5vZGUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgICQ6IGZ1bmN0aW9uIChzZWwpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNz
ZXJ0KCdZb3UgY2Fubm90IGFjY2VzcyB0aGlzLiQoKSBvbiBhIGNvbXBvbmVudCB3aXRoIGB0YWdO
YW1lOiBcJ1wnYCBzcGVjaWZpZWQuJywgdGhpcy50YWdOYW1lICE9PSAnJyk7CisgICAgICByZXR1
cm4gdGhpcy5fY3VycmVudFN0YXRlLiQodGhpcywgc2VsKTsKKyAgICB9LAorCisgICAgZm9yRWFj
aENoaWxkVmlldzogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgY2hpbGRWaWV3cyA9
IHRoaXMuY2hpbGRWaWV3czsKKworICAgICAgaWYgKCFjaGlsZFZpZXdzKSB7CisgICAgICAgIHJl
dHVybiB0aGlzOworICAgICAgfQorCisgICAgICB2YXIgbGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7
CisgICAgICB2YXIgdmlldywgaWR4OworCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsg
aWR4KyspIHsKKyAgICAgICAgdmlldyA9IGNoaWxkVmlld3NbaWR4XTsKKyAgICAgICAgY2FsbGJh
Y2sodmlldyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgcGFy
ZW50IGVsZW1lbnQuCisgICAgICAgSWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbiBIVE1MIHJl
cHJlc2VudGF0aW9uIHlldCwgYGNyZWF0ZUVsZW1lbnQoKWAKKyAgICAgIHdpbGwgYmUgY2FsbGVk
IGF1dG9tYXRpY2FsbHkuCisgICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1
bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCisgICAgICBlbGVtZW50IHdpbGwg
bm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBo
YXZlCisgICAgICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nLgorICAgICAgIFRoaXMgaXMgbm90IHR5
cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgeW91IHdpbGwgbmVlZCB0byBjYWxsIGRpcmVjdGx5IHdo
ZW4KKyAgICAgIGJ1aWxkaW5nIHlvdXIgYXBwbGljYXRpb24uIElmIHlvdSBkbyBuZWVkIHRvIHVz
ZSBgYXBwZW5kVG9gLCBiZSBzdXJlIHRoYXQKKyAgICAgIHRoZSB0YXJnZXQgZWxlbWVudCB5b3Ug
YXJlIHByb3ZpZGluZyBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYEVtYmVyLkFwcGxpY2F0aW9uYAor
ICAgICAgYW5kIGRvZXMgbm90IGhhdmUgYW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGlzIGFzc29j
aWF0ZWQgd2l0aCBhbiBFbWJlciB2aWV3LgorICAgICAgIEBtZXRob2QgYXBwZW5kVG8KKyAgICAg
IEBwYXJhbSB7U3RyaW5nfERPTUVsZW1lbnR8alF1ZXJ5fSBBIHNlbGVjdG9yLCBlbGVtZW50LCBI
VE1MIHN0cmluZywgb3IgalF1ZXJ5IG9iamVjdAorICAgICAgQHJldHVybiB7RW1iZXIuVmlld30g
cmVjZWl2ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhcHBlbmRUbzogZnVuY3Rpb24g
KHNlbGVjdG9yKSB7CisgICAgICB2YXIgJCA9IHRoaXMuX2Vudmlyb25tZW50ID8gdGhpcy5fZW52
aXJvbm1lbnQub3B0aW9ucy5qUXVlcnkgOiBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0
OworCisgICAgICBpZiAoJCkgeworICAgICAgICB2YXIgdGFyZ2V0ID0gJChzZWxlY3Rvcik7CisK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSB0cmllZCB0byBhcHBlbmQgdG8g
KCcgKyBzZWxlY3RvciArICcpIGJ1dCB0aGF0IGlzblwndCBpbiB0aGUgRE9NJywgdGFyZ2V0Lmxl
bmd0aCA+IDApOworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBh
cHBlbmQgdG8gYW4gZXhpc3RpbmcgRW1iZXIuVmlldy4nLCAhdGFyZ2V0LmlzKCcuZW1iZXItdmll
dycpICYmICF0YXJnZXQucGFyZW50cygpLmlzKCcuZW1iZXItdmlldycpKTsKKworICAgICAgICB0
aGlzLnJlbmRlcmVyLmFwcGVuZFRvKHRoaXMsIHRhcmdldFswXSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICB2YXIgdGFyZ2V0ID0gc2VsZWN0b3I7CisKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ1lvdSB0cmllZCB0byBhcHBlbmQgdG8gYSBzZWxlY3RvciBzdHJpbmcgKCcgKyBz
ZWxlY3RvciArICcpIGluIGFuIGVudmlyb25tZW50IHdpdGhvdXQgalF1ZXJ5JywgdHlwZW9mIHRh
cmdldCAhPT0gJ3N0cmluZycpOworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IHRyaWVkIHRvIGFwcGVuZCB0byBhIG5vbi1FbGVtZW50ICgnICsgc2VsZWN0b3IgKyAnKSBpbiBh
biBlbnZpcm9ubWVudCB3aXRob3V0IGpRdWVyeScsIHR5cGVvZiBzZWxlY3Rvci5hcHBlbmRDaGls
ZCA9PT0gJ2Z1bmN0aW9uJyk7CisKKyAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRUbyh0aGlz
LCB0YXJnZXQpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIENyZWF0ZXMgYSBuZXcgRE9NIGVsZW1lbnQsIHJl
bmRlcnMgdGhlIHZpZXcgaW50byBpdCwgdGhlbiByZXR1cm5zIHRoZQorICAgICAgZWxlbWVudC4K
KyAgICAgICBCeSBkZWZhdWx0LCB0aGUgZWxlbWVudCBjcmVhdGVkIGFuZCByZW5kZXJlZCBpbnRv
IHdpbGwgYmUgYSBgQk9EWWAgZWxlbWVudCwKKyAgICAgIHNpbmNlIHRoaXMgaXMgdGhlIGRlZmF1
bHQgY29udGV4dCB0aGF0IHZpZXdzIGFyZSByZW5kZXJlZCBpbnRvIHdoZW4gYmVpbmcKKyAgICAg
IGluc2VydGVkIGRpcmVjdGx5IGludG8gdGhlIERPTS4KKyAgICAgICBgYGBqcworICAgICAgdmFy
IGVsZW1lbnQgPSB2aWV3LnJlbmRlclRvRWxlbWVudCgpOworICAgICAgZWxlbWVudC50YWdOYW1l
OyAvLyA9PiAiQk9EWSIKKyAgICAgIGBgYAorICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGtp
bmQgb2YgZWxlbWVudCByZW5kZXJlZCBpbnRvIGFuZCByZXR1cm5lZCBieQorICAgICAgc3BlY2lm
eWluZyBhbiBvcHRpb25hbCB0YWcgbmFtZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICAg
YGBganMKKyAgICAgIHZhciBlbGVtZW50ID0gdmlldy5yZW5kZXJUb0VsZW1lbnQoJ3RhYmxlJyk7
CisgICAgICBlbGVtZW50LnRhZ05hbWU7IC8vID0+ICJUQUJMRSIKKyAgICAgIGBgYAorICAgICAg
IFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZW5kZXIgdGhlIHZpZXcgaW50
byBhbiBlbGVtZW50IHRoYXQKKyAgICAgIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQncyBib2R5LiBJ
bnN0ZWFkLCBhIG5ldyBgYm9keWAgZWxlbWVudCwgZGV0YWNoZWQgZnJvbQorICAgICAgdGhlIERP
TSBpcyByZXR1cm5lZC4gRmFzdEJvb3QgdXNlcyB0aGlzIHRvIHNlcmlhbGl6ZSB0aGUgcmVuZGVy
ZWQgdmlldyBpbnRvCisgICAgICBhIHN0cmluZyBmb3IgdHJhbnNtaXNzaW9uIG92ZXIgdGhlIG5l
dHdvcmsuCisgICAgICAgYGBganMKKyAgICAgIGFwcC52aXNpdCgnLycpLnRoZW4oZnVuY3Rpb24o
aW5zdGFuY2UpIHsKKyAgICAgICAgdmFyIGVsZW1lbnQ7CisgICAgICAgIEVtYmVyLnJ1bihmdW5j
dGlvbigpIHsKKyAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyVG9FbGVtZW50KGluc3RhbmNlKTsK
KyAgICAgICAgfSk7CisgICAgICAgICByZXMuc2VuZChzZXJpYWxpemUoZWxlbWVudCkpOworICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlbmRlclRvRWxlbWVudAorICAgICAg
QHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUg
YW5kIHJlbmRlciBpbnRvLiBEZWZhdWx0cyB0byAiYm9keSIuCisgICAgICBAcmV0dXJuIHtIVE1M
Qm9keUVsZW1lbnR9IGVsZW1lbnQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW5kZXJU
b0VsZW1lbnQ6IGZ1bmN0aW9uICh0YWdOYW1lKSB7CisgICAgICB0YWdOYW1lID0gdGFnTmFtZSB8
fCAnYm9keSc7CisKKyAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5yZW5kZXJlci5fZG9tLmNyZWF0
ZUVsZW1lbnQodGFnTmFtZSk7CisKKyAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kVG8odGhpcywg
ZWxlbWVudCk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50IHdp
dGggdGhpcyB2aWV3J3MKKyAgICAgIGVsZW1lbnQuIElmIHRoZSB2aWV3IGRvZXMgbm90IGhhdmUg
YW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsCisgICAgICB0aGUgZWxlbWVudCB3aWxsIGJlIGdl
bmVyYXRlZCBhdXRvbWF0aWNhbGx5LgorICAgICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBqdXN0
IHNjaGVkdWxlcyB0aGUgdmlldyB0byBiZSBhcHBlbmRlZDsgdGhlIERPTQorICAgICAgZWxlbWVu
dCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhbGwgYmlu
ZGluZ3MgaGF2ZQorICAgICAgZmluaXNoZWQgc3luY2hyb25pemluZworICAgICAgIEBtZXRob2Qg
cmVwbGFjZUluCisgICAgICBAcGFyYW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0gdGFyZ2V0
IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0CisgICAg
ICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlZAorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIHJlcGxhY2VJbjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CisgICAgICB2YXIgdGFyZ2V0ID0g
X2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWxlY3Rvcik7CisKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdHJpZWQgdG8gcmVwbGFjZSBpbiAoJyArIHNlbGVjdG9y
ICsgJykgYnV0IHRoYXQgaXNuXCd0IGluIHRoZSBET00nLCB0YXJnZXQubGVuZ3RoID4gMCk7Cisg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCByZXBsYWNlIGFuIGV4aXN0
aW5nIEVtYmVyLlZpZXcuJywgIXRhcmdldC5pcygnLmVtYmVyLXZpZXcnKSAmJiAhdGFyZ2V0LnBh
cmVudHMoKS5pcygnLmVtYmVyLXZpZXcnKSk7CisKKyAgICAgIHRoaXMucmVuZGVyZXIucmVwbGFj
ZUluKHRoaXMsIHRhcmdldFswXSk7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBkb2N1bWVudCBi
b2R5LiBJZiB0aGUgdmlldyBkb2VzCisgICAgICBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0
aW9uIHlldAorICAgICAgdGhlIGVsZW1lbnQgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxs
eS4KKyAgICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgdGhlIGByb290RWxlbWVudGAgcHJv
cGVydHksIHlvdSBtdXN0IGFwcGVuZAorICAgICAgdGhlIHZpZXcgd2l0aGluIHRoYXQgZWxlbWVu
dC4gUmVuZGVyaW5nIHZpZXdzIG91dHNpZGUgb2YgdGhlIGByb290RWxlbWVudGAKKyAgICAgIGlz
IG5vdCBzdXBwb3J0ZWQuCisgICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1
bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCisgICAgICBlbGVtZW50IHdpbGwg
bm90IGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5IHVudGlsIGFsbCBiaW5kaW5ncyBo
YXZlCisgICAgICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nLgorICAgICAgIEBtZXRob2QgYXBwZW5k
CisgICAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAgICAgQHByaXZhdGUKKyAg
ICAqLworICAgIGFwcGVuZDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXBwZW5k
VG8oZG9jdW1lbnQuYm9keSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVtb3ZlcyB0aGUg
dmlldydzIGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB0byB3aGljaCBpdCBpcyBhdHRhY2hlZC4K
KyAgICAgICBAbWV0aG9kIHJlbW92ZQorICAgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2
ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIC8vIFdoYXQgd2Ugc2hvdWxkIHJlYWxseSBkbyBoZXJlIGlzIHdhaXQgdW50aWwgdGhlIGVu
ZCBvZiB0aGUgcnVuIGxvb3AKKyAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBo
YXMgYmVlbiByZS1hcHBlbmRlZCB0byBhIGRpZmZlcmVudAorICAgICAgLy8gZWxlbWVudC4KKyAg
ICAgIC8vIEluIHRoZSBpbnRlcmltLCB3ZSB3aWxsIGp1c3QgcmUtcmVuZGVyIGlmIHRoYXQgaGFw
cGVucy4gSXQgaXMgbW9yZQorICAgICAgLy8gaW1wb3J0YW50IHRoYW4gZWxlbWVudHMgZ2V0IGdh
cmJhZ2UgY29sbGVjdGVkLgorICAgICAgaWYgKCF0aGlzLnJlbW92ZWRGcm9tRE9NKSB7CisgICAg
ICAgIHRoaXMuZGVzdHJveUVsZW1lbnQoKTsKKyAgICAgIH0KKworICAgICAgLy8gU2V0IGZsYWcg
dG8gYXZvaWQgZnV0dXJlIHJlbmRlcnMKKyAgICAgIHRoaXMuX3dpbGxJbnNlcnQgPSBmYWxzZTsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGUgSFRNTCBgaWRgIG9mIHRoZSB2aWV3J3MgZWxl
bWVudCBpbiB0aGUgRE9NLiBZb3UgY2FuIHByb3ZpZGUgdGhpcworICAgICAgdmFsdWUgeW91cnNl
bGYgYnV0IGl0IG11c3QgYmUgdW5pcXVlIChqdXN0IGFzIGluIEhUTUwpOgorICAgICAgIGBgYGhh
bmRsZWJhcnMKKyAgICAgICAge3tteS1jb21wb25lbnQgZWxlbWVudElkPSJhLXJlYWxseS1jb29s
LWlkIn19CisgICAgICBgYGAKKyAgICAgICBJZiBub3QgbWFudWFsbHkgc2V0IGEgZGVmYXVsdCB2
YWx1ZSB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZXdvcmsuCisgICAgICAgT25jZSByZW5k
ZXJlZCBhbiBlbGVtZW50J3MgYGVsZW1lbnRJZGAgaXMgY29uc2lkZXJlZCBpbW11dGFibGUgYW5k
IHlvdQorICAgICAgc2hvdWxkIG5ldmVyIGNoYW5nZSBpdC4gSWYgeW91IG5lZWQgdG8gY29tcHV0
ZSBhIGR5bmFtaWMgdmFsdWUgZm9yIHRoZQorICAgICAgYGVsZW1lbnRJZGAsIHlvdSBzaG91bGQg
ZG8gdGhpcyB3aGVuIHRoZSBjb21wb25lbnQgb3IgZWxlbWVudCBpcyBiZWluZworICAgICAgaW5z
dGFudGlhdGVkOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgZXhwb3J0IGRlZmF1bHQg
RW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICAgICAgc2V0RWxlbWVudElkOiBFbWJlci5v
bignaW5pdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXQo
J2luZGV4Jyk7CisgICAgICAgICAgICB0aGlzLnNldCgnZWxlbWVudElkJywgJ2NvbXBvbmVudC1p
ZCcgKyBpbmRleCk7CisgICAgICAgICAgfSkKKyAgICAgICAgfSk7CisgICAgICBgYGAKKyAgICAg
ICBAcHJvcGVydHkgZWxlbWVudElkCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBwdWJsaWMK
KyAgICAqLworICAgIGVsZW1lbnRJZDogbnVsbCwKKworICAgIC8qKgorICAgICAgQXR0ZW1wdHMg
dG8gZGlzY292ZXIgdGhlIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVmYXVs
dAorICAgICAgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yIGFuIGVsZW1lbnQgd2l0aCBhbiBJRCBv
ZiBgZWxlbWVudElkYCAob3IgdGhlCisgICAgICB2aWV3J3MgZ3VpZCBpZiBgZWxlbWVudElkYCBp
cyBudWxsKS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bworICAgICAgcHJvdmlkZSB5
b3VyIG93biBmb3JtIG9mIGxvb2t1cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRpc2Nv
dmVyIHlvdXIKKyAgICAgIGVsZW1lbnQgdXNpbmcgYSBDU1MgY2xhc3MgbmFtZSBpbnN0ZWFkIG9m
IGFuIElELgorICAgICAgIEBtZXRob2QgZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQKKyAgICAg
IEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50RWxlbWVudCBUaGUgcGFyZW50J3MgRE9NIGVsZW1l
bnQKKyAgICAgIEByZXR1cm4ge0RPTUVsZW1lbnR9IFRoZSBkaXNjb3ZlcmVkIGVsZW1lbnQKKyAg
ICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmaW5kRWxlbWVudEluUGFyZW50RWxlbWVudDogZnVu
Y3Rpb24gKHBhcmVudEVsZW0pIHsKKyAgICAgIHZhciBpZCA9ICcjJyArIHRoaXMuZWxlbWVudElk
OworICAgICAgcmV0dXJuIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoaWQpWzBdIHx8
IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoaWQsIHBhcmVudEVsZW0pWzBdOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIENyZWF0ZXMgYSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhl
IHZpZXcgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3MgYnkKKyAgICAgIHJlY3Vyc2l2ZWx5IGNh
bGxpbmcgdGhlIGByZW5kZXIoKWAgbWV0aG9kLiBPbmNlIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQs
CisgICAgICBpdCBzZXRzIHRoZSBgZWxlbWVudGAgcHJvcGVydHkgb2YgdGhlIHZpZXcgdG8gdGhl
IHJlbmRlcmVkIGVsZW1lbnQuCisgICAgICAgQWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gaW5z
ZXJ0ZWQgaW50byB0aGUgRE9NLCBgZGlkSW5zZXJ0RWxlbWVudGAgd2lsbAorICAgICAgYmUgY2Fs
bGVkIG9uIHRoaXMgdmlldyBhbmQgYWxsIG9mIGl0cyBjaGlsZCB2aWV3cy4KKyAgICAgICBAbWV0
aG9kIGNyZWF0ZUVsZW1lbnQKKyAgICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCisg
ICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY3JlYXRlRWxlbWVudDogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuZWxlbWVudCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0K
KworICAgICAgdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMpOworCisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiBhIHZpZXcgaXMg
Z29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NLgorICAgICAgIEBldmVudCB3
aWxsSW5zZXJ0RWxlbWVudAorICAgICAgQHB1YmxpYworICAgICovCisgICAgd2lsbEluc2VydEVs
ZW1lbnQ6IEssCisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRo
ZSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTQorICAgICAgb3IgYWZ0ZXIgdGhl
IHZpZXcgd2FzIHJlLXJlbmRlcmVkLiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueQor
ICAgICAgc2V0IHVwIHRoYXQgcmVxdWlyZXMgYW4gZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQgYm9k
eS4KKyAgICAgICBXaGVuIGEgdmlldyBoYXMgY2hpbGRyZW4sIGRpZEluc2VydEVsZW1lbnQgd2ls
bCBiZSBjYWxsZWQgb24gdGhlCisgICAgICBjaGlsZCB2aWV3KHMpIGZpcnN0LCBidWJibGluZyB1
cHdhcmRzIHRocm91Z2ggdGhlIGhpZXJhcmNoeS4KKyAgICAgICBAZXZlbnQgZGlkSW5zZXJ0RWxl
bWVudAorICAgICAgQHB1YmxpYworICAgICovCisgICAgZGlkSW5zZXJ0RWxlbWVudDogSywKKwor
ICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIHZpZXcgaXMgYWJvdXQgdG8gcmVyZW5kZXIs
IGJ1dCBiZWZvcmUgYW55dGhpbmcgaGFzCisgICAgICBiZWVuIHRvcm4gZG93bi4gVGhpcyBpcyBh
IGdvb2Qgb3Bwb3J0dW5pdHkgdG8gdGVhciBkb3duIGFueSBtYW51YWwKKyAgICAgIG9ic2VydmVy
cyB5b3UgaGF2ZSBpbnN0YWxsZWQgYmFzZWQgb24gdGhlIERPTSBzdGF0ZQorICAgICAgIEBldmVu
dCB3aWxsQ2xlYXJSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdpbGxDbGVhclJl
bmRlcjogSywKKworICAgIC8qKgorICAgICAgRGVzdHJveXMgYW55IGV4aXN0aW5nIGVsZW1lbnQg
YWxvbmcgd2l0aCB0aGUgZWxlbWVudCBmb3IgYW55IGNoaWxkIHZpZXdzCisgICAgICBhcyB3ZWxs
LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIGVsZW1lbnQsIHRoZW4gdGhp
cyBtZXRob2QKKyAgICAgIHdpbGwgZG8gbm90aGluZy4KKyAgICAgICBJZiB5b3UgaW1wbGVtZW50
IGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgb24geW91ciB2aWV3LCB0aGVuIHRoaXMgbWV0aG9kIHdp
bGwKKyAgICAgIGJlIGludm9rZWQgb24geW91ciB2aWV3IGJlZm9yZSB5b3VyIGVsZW1lbnQgaXMg
ZGVzdHJveWVkIHRvIGdpdmUgeW91IGEKKyAgICAgIGNoYW5jZSB0byBjbGVhbiB1cCBhbnkgZXZl
bnQgaGFuZGxlcnMsIGV0Yy4KKyAgICAgICBJZiB5b3Ugd3JpdGUgYSBgd2lsbERlc3Ryb3lFbGVt
ZW50KClgIGhhbmRsZXIsIHlvdSBjYW4gYXNzdW1lIHRoYXQgeW91cgorICAgICAgYGRpZEluc2Vy
dEVsZW1lbnQoKWAgaGFuZGxlciB3YXMgY2FsbGVkIGVhcmxpZXIgZm9yIHRoZSBzYW1lIGVsZW1l
bnQuCisgICAgICAgWW91IHNob3VsZCBub3QgY2FsbCBvciBvdmVycmlkZSB0aGlzIG1ldGhvZCB5
b3Vyc2VsZiwgYnV0IHlvdSBtYXkKKyAgICAgIHdhbnQgdG8gaW1wbGVtZW50IHRoZSBhYm92ZSBj
YWxsYmFja3MuCisgICAgICAgQG1ldGhvZCBkZXN0cm95RWxlbWVudAorICAgICAgQHJldHVybiB7
RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBkZXN0cm95
RWxlbWVudDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZS5k
ZXN0cm95RWxlbWVudCh0aGlzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hl
biB0aGUgZWxlbWVudCBvZiB0aGUgdmlldyBpcyBnb2luZyB0byBiZSBkZXN0cm95ZWQuIE92ZXJy
aWRlCisgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0ZWFyZG93biB0aGF0IHJlcXVpcmVz
IGFuIGVsZW1lbnQsIGxpa2UgcmVtb3ZpbmcKKyAgICAgIGV2ZW50IGxpc3RlbmVycy4KKyAgICAg
ICBQbGVhc2Ugbm90ZTogYW55IHByb3BlcnR5IGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhpcyBldmVu
dCB3aWxsIGhhdmUgbm8KKyAgICAgIGVmZmVjdCBvbiBvYmplY3Qgb2JzZXJ2ZXJzLgorICAgICAg
IEBldmVudCB3aWxsRGVzdHJveUVsZW1lbnQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdp
bGxEZXN0cm95RWxlbWVudDogSywKKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIHBh
cmVudFZpZXcgcHJvcGVydHkgaGFzIGNoYW5nZWQuCisgICAgICAgQGV2ZW50IHBhcmVudFZpZXdE
aWRDaGFuZ2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBwYXJlbnRWaWV3RGlkQ2hhbmdl
OiBLLAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgorICAgIC8vIFNUQU5EQVJEIFJFTkRFUiBQUk9QRVJUSUVTCisgICAg
Ly8KKworICAgIC8qKgorICAgICAgVGFnIG5hbWUgZm9yIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVu
dC4gVGhlIHRhZyBuYW1lIGlzIG9ubHkgdXNlZCB3aGVuIGFuCisgICAgICBlbGVtZW50IGlzIGZp
cnN0IGNyZWF0ZWQuIElmIHlvdSBjaGFuZ2UgdGhlIGB0YWdOYW1lYCBmb3IgYW4gZWxlbWVudCwg
eW91CisgICAgICBtdXN0IGRlc3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSB2aWV3IGVsZW1lbnQuCisg
ICAgICAgQnkgZGVmYXVsdCwgdGhlIHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBgPGRpdj5gIHRh
ZyBmb3Igdmlld3MuCisgICAgICAgQHByb3BlcnR5IHRhZ05hbWUKKyAgICAgIEB0eXBlIFN0cmlu
ZworICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAvLyBX
ZSBsZWF2ZSB0aGlzIG51bGwgYnkgZGVmYXVsdCBzbyB3ZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5j
ZSBiZXR3ZWVuCisgICAgLy8gdGhlIGRlZmF1bHQgY2FzZSBhbmQgYSB1c2VyLXNwZWNpZmllZCB0
YWcuCisgICAgdGFnTmFtZTogbnVsbCwKKworICAgIC8qCisgICAgICBVc2VkIHRvIHNwZWNpZnkg
YSBkZWZhdWx0IHRhZ05hbWUgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGV4dGVuZGluZwor
ICAgICAgb3IgaW52b2tpbmcgZnJvbSBhIHRlbXBsYXRlLgorICAgICAgIEBwcm9wZXJ0eSBfZGVm
YXVsdFRhZ05hbWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKworICAgIC8qKgorICAgICAgTm9y
bWFsbHksIEVtYmVyJ3MgY29tcG9uZW50IG1vZGVsIGlzICJ3cml0ZS1vbmx5Ii4gVGhlIGNvbXBv
bmVudCB0YWtlcyBhCisgICAgICBidW5jaCBvZiBhdHRyaWJ1dGVzIHRoYXQgaXQgZ290IHBhc3Nl
ZCBpbiwgYW5kIHVzZXMgdGhlbSB0byByZW5kZXIgaXRzCisgICAgICB0ZW1wbGF0ZS4KKyAgICAg
ICBPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIG1vZGVsIGlzIHRoYXQgaWYgeW91IHRyeSB0byBz
ZXQgYSB2YWx1ZSB0byB0aGUKKyAgICAgIHNhbWUgdGhpbmcgYXMgbGFzdCB0aW1lLCBFbWJlciAo
dGhyb3VnaCBIVE1MQmFycykgd2lsbCBhdm9pZCBkb2luZyBhbnkKKyAgICAgIHdvcmsgb24gdGhl
IERPTS4KKyAgICAgICBUaGlzIGlzIG5vdCBqdXN0IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9u
LiBJZiBhbiBhdHRyaWJ1dGUgaGFzIG5vdAorICAgICAgY2hhbmdlZCwgaXQgaXMgaW1wb3J0YW50
IG5vdCB0byBjbG9iYmVyIHRoZSBlbGVtZW50J3MgImhpZGRlbiBzdGF0ZSIuCisgICAgICBGb3Ig
ZXhhbXBsZSwgaWYgeW91IHNldCBhbiBpbnB1dCdzIGB2YWx1ZWAgdG8gdGhlIHNhbWUgdmFsdWUg
YXMgYmVmb3JlLAorICAgICAgaXQgd2lsbCBjbG9iYmVyIHNlbGVjdGlvbiBzdGF0ZSBhbmQgY3Vy
c29yIHBvc2l0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAgICAgIHNldHRpbmcgYW4gYXR0cmlidXRl
IGlzIG5vdCAqKmFsd2F5cyoqIGlkZW1wb3RlbnQuCisgICAgICAgVGhpcyBtZXRob2QgcHJvdmlk
ZXMgYSB3YXkgdG8gcmVhZCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIGFuZCBhbHNvCisgICAgICB1
cGRhdGUgdGhlIGxhc3QgdmFsdWUgRW1iZXIga25vd3MgYWJvdXQgYXQgdGhlIHNhbWUgdGltZS4g
VGhpcyBtYWtlcworICAgICAgc2V0dGluZyBhbiBhdHRyaWJ1dGUgaWRlbXBvdGVudC4KKyAgICAg
ICBJbiBwYXJ0aWN1bGFyLCB3aGF0IHRoaXMgbWVhbnMgaXMgdGhhdCBpZiB5b3UgZ2V0IGFuIGA8
aW5wdXQ+YCBlbGVtZW50J3MKKyAgICAgIGB2YWx1ZWAgYXR0cmlidXRlIGFuZCB0aGVuIHJlLXJl
bmRlciB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSwKKyAgICAgIGl0IHdpbGwgYXZv
aWQgY2xvYmJlcmluZyB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gcG9zaXRpb24uCisgICAgICAg
U2luY2UgbW9zdCBhdHRyaWJ1dGUgc2V0cyBhcmUgaWRlbXBvdGVudCBpbiB0aGUgYnJvd3Nlciwg
eW91IHR5cGljYWxseQorICAgICAgY2FuIGdldCBhd2F5IHdpdGggcmVhZGluZyBhdHRyaWJ1dGVz
IHVzaW5nIGpRdWVyeSwgYnV0IHRoZSBtb3N0IHJlbGlhYmxlCisgICAgICB3YXkgdG8gZG8gc28g
aXMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KKyAgICAgICBAbWV0aG9kIHJlYWRET01BdHRyCisgICAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICBA
cmV0dXJuIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVhZERPTUF0dHI6IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgYXR0ciA9IHRoaXMuX3JlbmRlck5vZGUuY2hpbGRO
b2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuYXR0ck5h
bWUgPT09IG5hbWU7CisgICAgICB9KVswXTsKKyAgICAgIGlmICghYXR0cikgeworICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhdHRyLmdldENvbnRlbnQoKTsKKyAg
ICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgorICAgIC8vIENPUkUgRElTUExBWSBNRVRIT0RTCisgICAgLy8KKworICAg
IC8qKgorICAgICAgU2V0dXAgYSB2aWV3LCBidXQgZG8gbm90IGZpbmlzaCB3YWtpbmcgaXQgdXAu
CisgICAgICAgKiBjb25maWd1cmUgYGNoaWxkVmlld3NgCisgICAgICAqIHJlZ2lzdGVyIHRoZSB2
aWV3IHdpdGggdGhlIGdsb2JhbCB2aWV3cyBoYXNoLCB3aGljaCBpcyB1c2VkIGZvciBldmVudAor
ICAgICAgICBkaXNwYXRjaAorICAgICAgIEBtZXRob2QgaW5pdAorICAgICAgQHByaXZhdGUKKyAg
ICAqLworICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIGlmICghdGhpcy5lbGVtZW50SWQpIHsKKyAgICAgICAg
dGhpcy5lbGVtZW50SWQgPSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhpcyk7CisgICAgICB9
CisKKyAgICAgIHRoaXMuc2NoZWR1bGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7CisKKyAgICAgIHRo
aXNbSU5JVF9XQVNfQ0FMTEVEXSA9IHRydWU7CisKKyAgICAgIGlmICh0eXBlb2YgdGhpcy5kaWRJ
bml0QXR0cnMgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXBy
ZWNhdGUoJ1tERVBSRUNBVEVEXSBkaWRJbml0QXR0cnMgY2FsbGVkIGluICcgKyB0aGlzLnRvU3Ry
aW5nKCkgKyAnLicsIGZhbHNlLCB7CisgICAgICAgICAgaWQ6ICdlbWJlci12aWV3cy5kaWQtaW5p
dC1hdHRycycsCisgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAgICAgdXJsOiAnaHR0
cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19lbWJlci1jb21wb25lbnQtZGlk
aW5pdGF0dHJzJworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ1VzaW5nIGEgY3VzdG9tIGAucmVuZGVyYCBmdW5jdGlvbiBpcyBubyBsb25nZXIg
c3VwcG9ydGVkLicsICF0aGlzLnJlbmRlcik7CisgICAgfQorCisgIH0sIF9NaXhpbiRjcmVhdGVb
X2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LlBPU1RfSU5JVF0gPSBmdW5jdGlvbiAoKSB7
CisgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVzdCBjYWxsIGB0aGlzLl9zdXBlciguLi5hcmd1bWVudHMp
O2Agd2hlbiBpbXBsZW1lbnRpbmcgYGluaXRgIGluIGEgY29tcG9uZW50LiBQbGVhc2UgdXBkYXRl
ICcgKyB0aGlzICsgJyB0byBjYWxsIGB0aGlzLl9zdXBlcmAgZnJvbSBgaW5pdGAuJywgdGhpc1tJ
TklUX1dBU19DQUxMRURdKTsKKworICAgIHRoaXMucmVuZGVyZXIuY29tcG9uZW50SW5pdEF0dHJz
KHRoaXMsIHRoaXMuYXR0cnMgfHwge30pOworICB9LCBfTWl4aW4kY3JlYXRlLl9fZGVmaW5lTm9u
RW51bWVyYWJsZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkgeworICAgIHRoaXNbcHJvcGVydHkubmFt
ZV0gPSBwcm9wZXJ0eS5kZXNjcmlwdG9yLnZhbHVlOworICB9LCBfTWl4aW4kY3JlYXRlLnJldmFs
aWRhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5yZW5kZXJlci5yZXZhbGlkYXRlVG9wTGV2
ZWxWaWV3KHRoaXMpOworICAgIHRoaXMuc2NoZWR1bGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7Cisg
IH0sIF9NaXhpbiRjcmVhdGUuc2NoZWR1bGVSZXZhbGlkYXRlID0gZnVuY3Rpb24gKG5vZGUsIGxh
YmVsLCBtYW51YWxSZXJlbmRlcikgeworICAgIGlmIChub2RlICYmICF0aGlzLl9kaXNwYXRjaGlu
ZyAmJiB0aGlzLmVudi5yZW5kZXJlZE5vZGVzLmhhcyhub2RlKSkgeworICAgICAgaWYgKG1hbnVh
bFJlcmVuZGVyKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdZb3UgbWFu
dWFsbHkgcmVyZW5kZXJlZCAnICsgbGFiZWwgKyAnIChhIHBhcmVudCBjb21wb25lbnQpIGZyb20g
YSBjaGlsZCBjb21wb25lbnQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy4gVGhpcyByYXJl
bHkgd29ya2VkIGluIEVtYmVyIDEueCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEVtYmVyIDMuMCcs
IGZhbHNlLCB7IGlkOiAnZW1iZXItdmlld3MubWFudWFsLXBhcmVudC1yZXJlbmRlcicsIHVudGls
OiAnMy4wLjAnIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5k
ZXByZWNhdGUoJ1lvdSBtb2RpZmllZCAnICsgbGFiZWwgKyAnIHR3aWNlIGluIGEgc2luZ2xlIHJl
bmRlci4gVGhpcyB3YXMgdW5yZWxpYWJsZSBpbiBFbWJlciAxLnggYW5kIHdpbGwgYmUgcmVtb3Zl
ZCBpbiBFbWJlciAzLjAnLCBmYWxzZSwgeyBpZDogJ2VtYmVyLXZpZXdzLnJlbmRlci1kb3VibGUt
bW9kaWZ5JywgdW50aWw6ICczLjAuMCcgfSk7CisgICAgICB9CisgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQuc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCB0aGlzLnJldmFsaWRh
dGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVj
YXRlKCdBIHByb3BlcnR5IG9mICcgKyB0aGlzICsgJyB3YXMgbW9kaWZpZWQgaW5zaWRlIHRoZSAn
ICsgdGhpcy5fZGlzcGF0Y2hpbmcgKyAnIGhvb2suIFlvdSBzaG91bGQgbmV2ZXIgY2hhbmdlIHBy
b3BlcnRpZXMgb24gY29tcG9uZW50cywgc2VydmljZXMgb3IgbW9kZWxzIGR1cmluZyAnICsgdGhp
cy5fZGlzcGF0Y2hpbmcgKyAnIGJlY2F1c2UgaXQgY2F1c2VzIHNpZ25pZmljYW50IHBlcmZvcm1h
bmNlIGRlZ3JhZGF0aW9uLicsICF0aGlzLl9kaXNwYXRjaGluZywgeyBpZDogJ2VtYmVyLXZpZXdz
LmRpc3BhdGNoaW5nLW1vZGlmeS1wcm9wZXJ0eScsIHVudGlsOiAnMy4wLjAnIH0pOworCisgICAg
aWYgKCF0aGlzLnNjaGVkdWxlZFJldmFsaWRhdGlvbiB8fCB0aGlzLl9kaXNwYXRjaGluZykgewor
ICAgICAgdGhpcy5zY2hlZHVsZWRSZXZhbGlkYXRpb24gPSB0cnVlOworICAgICAgX2VtYmVyTWV0
YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgdGhpcy5yZXZh
bGlkYXRlKTsKKyAgICB9CisgIH0sIF9NaXhpbiRjcmVhdGUudGVtcGxhdGVSZW5kZXJlciA9IG51
bGwsIF9NaXhpbiRjcmVhdGUucmVtb3ZlRnJvbVBhcmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICB2
YXIgcGFyZW50ID0gdGhpcy5wYXJlbnRWaWV3OworCisgICAgLy8gUmVtb3ZlIERPTSBlbGVtZW50
IGZyb20gcGFyZW50CisgICAgdGhpcy5yZW1vdmUoKTsKKworICAgIGlmIChwYXJlbnQpIHsKKyAg
ICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0sIF9NaXhpbiRjcmVhdGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKKyAgICAvLyBnZXQgcGFy
ZW50VmlldyBiZWZvcmUgY2FsbGluZyBzdXBlciBiZWNhdXNlIGl0J2xsIGJlIGRlc3Ryb3llZAor
ICAgIHZhciBwYXJlbnRWaWV3ID0gdGhpcy5wYXJlbnRWaWV3OworICAgIHZhciB2aWV3TmFtZSA9
IHRoaXMudmlld05hbWU7CisKKyAgICBpZiAoIXRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgZnJvbSBub24t
dmlydHVhbCBwYXJlbnQgdmlldyBpZiB2aWV3TmFtZSB3YXMgc3BlY2lmaWVkCisgICAgaWYgKHZp
ZXdOYW1lICYmIHBhcmVudFZpZXcpIHsKKyAgICAgIHBhcmVudFZpZXcuc2V0KHZpZXdOYW1lLCBu
dWxsKTsKKyAgICB9CisKKyAgICAvLyBEZXN0cm95IEhUTUxiYXJzIHRlbXBsYXRlCisgICAgaWYg
KHRoaXMubGFzdFJlc3VsdCkgeworICAgICAgdGhpcy5sYXN0UmVzdWx0LmRlc3Ryb3koKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwgX01peGluJGNyZWF0ZS5oYW5kbGVFdmVudCA9
IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2dCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3Rh
dGUuaGFuZGxlRXZlbnQodGhpcywgZXZlbnROYW1lLCBldnQpOworICB9LCBfTWl4aW4kY3JlYXRl
Ll9yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
QXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGEgdmlldyB3aXRoIGFuIGlkIGFscmVhZHkgaW4gdXNlOiAn
ICsgdGhpcy5lbGVtZW50SWQsICF0aGlzLl92aWV3UmVnaXN0cnlbdGhpcy5lbGVtZW50SWRdKTsK
KyAgICB0aGlzLl92aWV3UmVnaXN0cnlbdGhpcy5lbGVtZW50SWRdID0gdGhpczsKKyAgfSwgX01p
eGluJGNyZWF0ZS5fdW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHsKKyAgICBkZWxldGUgdGhpcy5f
dmlld1JlZ2lzdHJ5W3RoaXMuZWxlbWVudElkXTsKKyAgfSwgX01peGluJGNyZWF0ZS5yZWdpc3Rl
ck9ic2VydmVyID0gZnVuY3Rpb24gKHJvb3QsIHBhdGgsIHRhcmdldCwgb2JzZXJ2ZXIpIHsKKyAg
ICBpZiAoIW9ic2VydmVyICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICAg
IG9ic2VydmVyID0gdGFyZ2V0OworICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBp
ZiAoIXJvb3QgfHwgdHlwZW9mIHJvb3QgIT09ICdvYmplY3QnKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgdmFyIHNjaGVkdWxlZE9ic2VydmVyID0gdGhpcy5fd3JhcEFzU2NoZWR1bGVk
KG9ic2VydmVyKTsKKworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIocm9vdCwg
cGF0aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZlcik7CisKKyAgICB0aGlzLm9uZSgnd2lsbENs
ZWFyUmVuZGVyJywgZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxPYnNlcnZlci5yZW1v
dmVPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2VydmVyKTsKKyAgICB9
KTsKKyAgfSwgX01peGluJGNyZWF0ZS5fd3JhcEFzU2NoZWR1bGVkID0gZnVuY3Rpb24gKGZuKSB7
CisgICAgdmFyIHZpZXcgPSB0aGlzOworICAgIHZhciBzdGF0ZUNoZWNrZWRGbiA9IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZpZXcuX2N1cnJlbnRTdGF0ZS5pbnZva2VPYnNlcnZlcih0aGlzLCBmbik7
CisgICAgfTsKKyAgICB2YXIgc2NoZWR1bGVkRm4gPSBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCBzdGF0
ZUNoZWNrZWRGbik7CisgICAgfTsKKyAgICByZXR1cm4gc2NoZWR1bGVkRm47CisgIH0sIF9NaXhp
biRjcmVhdGUpKTsKK30pOworLyoKKyBUaGlzIGlzIGEgc3BlY2lhbCBob29rIGltcGxlbWVudGVk
IGluIENvcmVPYmplY3QsIHRoYXQgYWxsb3dzIFZpZXdzL0NvbXBvbmVudHMKKyB0byBoYXZlIGEg
d2F5IHRvIGVuc3VyZSB0aGF0IGBpbml0YCBmaXJlcyBiZWZvcmUgYGRpZEluaXRBdHRyc2AgLyBg
ZGlkUmVjZWl2ZUF0dHJzYAorIChzbyB0aGF0IGB0aGlzLl9zdXBlcmAgaW4gaW5pdCBkb2VzIG5v
dCB0cmlnZ2VyIGBkaWRSZWNlaXZlQXR0cnNgIGJlZm9yZSB0aGUgY2xhc3NlcworIG93biBgaW5p
dGAgaXMgZmluaXNoZWQpLgorICBAbWV0aG9kIF9fcG9zdEluaXRJbml0aWFsaXphdGlvbgorIEBw
cml2YXRlCisgKi8KKworLyoqCisgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVudFZp
ZXdgLCBpZiBvbmUgaXMgZm91bmQuIE90aGVyd2lzZQorICBkb2VzIG5vdGhpbmcuCisgICBAbWV0
aG9kIHJlbW92ZUZyb21QYXJlbnQKKyAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAg
QHByaXZhdGUKKyovCisKKy8qKgorICBZb3UgbXVzdCBjYWxsIGBkZXN0cm95YCBvbiBhIHZpZXcg
dG8gZGVzdHJveSB0aGUgdmlldyAoYW5kIGFsbCBvZiBpdHMKKyAgY2hpbGQgdmlld3MpLiBUaGlz
IHdpbGwgcmVtb3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVudCBub2RlLCB0aGVuIG1ha2UKKyAg
c3VyZSB0aGF0IHRoZSBET00gZWxlbWVudCBtYW5hZ2VkIGJ5IHRoZSB2aWV3IGNhbiBiZSByZWxl
YXNlZCBieSB0aGUKKyAgbWVtb3J5IG1hbmFnZXIuCisgICBAbWV0aG9kIGRlc3Ryb3kKKyAgQHBy
aXZhdGUKKyovCisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KKy8vIEVWRU5UIEhBTkRMSU5HCisvLworCisvKioKKyAgSGFuZGxlIGV2
ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgICBAbWV0aG9kIGhhbmRsZUV2ZW50
CisgIEBwYXJhbSBldmVudE5hbWUge1N0cmluZ30KKyAgQHBhcmFtIGV2dCB7RXZlbnR9CisgIEBw
cml2YXRlCisqLworCisvKioKKyAgUmVnaXN0ZXJzIHRoZSB2aWV3IGluIHRoZSB2aWV3IHJlZ2lz
dHJ5LCBrZXllZCBvbiB0aGUgdmlldydzIGBlbGVtZW50SWRgLgorICBUaGlzIGlzIHVzZWQgYnkg
dGhlIEV2ZW50RGlzcGF0Y2hlciB0byBsb2NhdGUgdGhlIHZpZXcgaW4gcmVzcG9uc2UgdG8KKyAg
ZXZlbnRzLgorICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgdGhlIHZp
ZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUKKyAgRE9NLgorICAgQG1ldGhvZCBfcmVnaXN0
ZXIKKyAgQHByaXZhdGUKKyovCisKKy8qKgorICBSZW1vdmVzIHRoZSB2aWV3IGZyb20gdGhlIHZp
ZXcgcmVnaXN0cnkuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZQorICB2aWV3IGlzIHJl
bW92ZWQgZnJvbSBET00uCisgICBAbWV0aG9kIF91bnJlZ2lzdGVyCisgIEBwcml2YXRlCisqLwor
ZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvdGFy
Z2V0X2FjdGlvbl9zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2FsaWFzJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9z
dXBwb3J0LCBfZW1iZXJNZXRhbEFsaWFzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAg
YEVtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGluIHRoYXQgY2FuIGJlIGlu
Y2x1ZGVkIGluIGEKKyAgdmlldyBjbGFzcyB0byBhZGQgYSBgdHJpZ2dlckFjdGlvbmAgbWV0aG9k
IHdpdGggc2VtYW50aWNzIHNpbWlsYXIgdG8KKyAgdGhlIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1g
IGhlbHBlci4gSXQgcHJvdmlkZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMKKyAgZm9yIHRoZSBhY3Rp
b24ncyB0YXJnZXQ6IHRoZSB2aWV3J3MgY29udHJvbGxlcjsgYW5kIHRoZSBjb250ZXh0IHRoYXQg
aXMKKyAgc2VudCB3aXRoIHRoZSBhY3Rpb246IHRoZSB2aWV3J3MgY29udGV4dC4KKyAgCisgIE5v
dGU6IEluIG5vcm1hbCBFbWJlciB1c2FnZSwgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgaXMgdXN1
YWxseSB0aGUgYmVzdAorICBjaG9pY2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRlbiB1c2VmdWwg
d2hlbiB5b3UgYXJlIGRvaW5nIG1vcmUgY29tcGxleAorICBldmVudCBoYW5kbGluZyBpbiBjdXN0
b20gVmlldyBzdWJjbGFzc2VzLgorICAKKyAgRm9yIGV4YW1wbGU6CisgIAorICBgYGBqYXZhc2Ny
aXB0CisgIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlZpZXdU
YXJnZXRBY3Rpb25TdXBwb3J0LCB7CisgICAgYWN0aW9uOiAnc2F2ZScsCisgICAgY2xpY2s6IGZ1
bmN0aW9uKCkgeworICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKCk7IC8vIFNlbmRzIHRoZSBgc2F2
ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCisgICAgfQorICB9KTsK
KyAgYGBgCisgIAorICBUaGUgYGFjdGlvbmAgY2FuIGJlIHByb3ZpZGVkIGFzIHByb3BlcnRpZXMg
b2YgYW4gb3B0aW9uYWwgb2JqZWN0IGFyZ3VtZW50CisgIHRvIGB0cmlnZ2VyQWN0aW9uYCBhcyB3
ZWxsLgorICAKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgeworICAgIGNsaWNrOiBm
dW5jdGlvbigpIHsKKyAgICAgIHRoaXMudHJpZ2dlckFjdGlvbih7CisgICAgICAgIGFjdGlvbjog
J3NhdmUnCisgICAgICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGgg
dGhlIGN1cnJlbnQgY29udGV4dAorICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xs
ZXIKKyAgICB9CisgIH0pOworICBgYGAKKyAgCisgIEBjbGFzcyBWaWV3VGFyZ2V0QWN0aW9uU3Vw
cG9ydAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLlRhcmdldEFjdGlvblN1
cHBvcnQKKyAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxN
aXhpbi5NaXhpbi5jcmVhdGUoX2VtYmVyUnVudGltZU1peGluc1RhcmdldF9hY3Rpb25fc3VwcG9y
dC5kZWZhdWx0LCB7CisgICAgLyoqCisgICAgIEBwcm9wZXJ0eSB0YXJnZXQKKyAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIHRhcmdldDogX2VtYmVyTWV0YWxBbGlhcy5kZWZhdWx0KCdjb250cm9s
bGVyJyksCisgICAgLyoqCisgICAgIEBwcm9wZXJ0eSBhY3Rpb25Db250ZXh0CisgICAgIEBwcml2
YXRlCisgICAgKi8KKyAgICBhY3Rpb25Db250ZXh0OiBfZW1iZXJNZXRhbEFsaWFzLmRlZmF1bHQo
J2NvbnRleHQnKQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlzaWJp
bGl0eV9zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1l
dGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9ydW5fbG9vcCddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1l
dGFsUnVuX2xvb3ApIHsKKyAgLyoqCisgICBAbW9kdWxlIGVtYmVyCisgICBAc3VibW9kdWxlIGVt
YmVyLXZpZXdzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBLKCkgeworICAg
IHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICBAY2xhc3MgVmlzaWJpbGl0eVN1cHBvcnQK
KyAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIFZpc2liaWxpdHlT
dXBwb3J0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAg
SWYgYGZhbHNlYCwgdGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVuIGluIERPTS4KKyAgICAgICBA
cHJvcGVydHkgaXNWaXNpYmxlCisgICAgICBAdHlwZSBCb29sZWFuCisgICAgICBAZGVmYXVsdCBu
dWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBpc1Zpc2libGU6IHRydWUsCisKKyAgICBi
ZWNhbWVWaXNpYmxlOiBLLAorICAgIGJlY2FtZUhpZGRlbjogSywKKworICAgIC8qKgorICAgICAg
V2hlbiB0aGUgdmlldydzIGBpc1Zpc2libGVgIHByb3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUg
dmlzaWJpbGl0eQorICAgICAgZWxlbWVudCBvZiB0aGUgYWN0dWFsIERPTSBlbGVtZW50LgorICAg
ICAgIEBtZXRob2QgX2lzVmlzaWJsZURpZENoYW5nZQorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIF9pc1Zpc2libGVEaWRDaGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2lzVmlz
aWJsZScsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNWaXNpYmxlJykpIHsKKyAgICAgICAgcmV0
dXJuOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
T25jZSgncmVuZGVyJywgdGhpcywgdGhpcy5fdG9nZ2xlVmlzaWJpbGl0eSk7CisgICAgfSksCisK
KyAgICBfdG9nZ2xlVmlzaWJpbGl0eTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyICRlbCA9IHRo
aXMuJCgpOworICAgICAgdmFyIGlzVmlzaWJsZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IGlz
VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIEl0J3MgaW1w
b3J0YW50IHRvIGtlZXAgdGhlc2UgaW4gc3luYywgZXZlbiBpZiB3ZSBkb24ndCB5ZXQgaGF2ZQor
ICAgICAgLy8gYW4gZWxlbWVudCBpbiB0aGUgRE9NIHRvIG1hbmlwdWxhdGU6CisgICAgICB0aGlz
Ll9pc1Zpc2libGUgPSBpc1Zpc2libGU7CisKKyAgICAgIGlmICghJGVsKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgJGVsLnRvZ2dsZShpc1Zpc2libGUpOworCisgICAgICBp
ZiAodGhpcy5faXNBbmNlc3RvckhpZGRlbigpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KworICAgICAgaWYgKGlzVmlzaWJsZSkgeworICAgICAgICB0aGlzLl9ub3RpZnlCZWNhbWVWaXNp
YmxlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9ub3RpZnlCZWNhbWVIaWRkZW4o
KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX25vdGlmeUJlY2FtZVZpc2libGU6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmlzaWJsZScpOworCisgICAgICB0aGlz
LmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgICAgdmFyIGlzVmlzaWJs
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAnaXNWaXNpYmxlJyk7CisKKyAg
ICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpc1Zpc2libGUgPT09IG51bGwpIHsKKyAgICAgICAgICB2
aWV3Ll9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0s
CisKKyAgICBfbm90aWZ5QmVjYW1lSGlkZGVuOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnRy
aWdnZXIoJ2JlY2FtZUhpZGRlbicpOworICAgICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0
aW9uICh2aWV3KSB7CisgICAgICAgIHZhciBpc1Zpc2libGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodmlldywgJ2lzVmlzaWJsZScpOworCisgICAgICAgIGlmIChpc1Zpc2libGUgfHwg
aXNWaXNpYmxlID09PSBudWxsKSB7CisgICAgICAgICAgdmlldy5fbm90aWZ5QmVjYW1lSGlkZGVu
KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sCisKKyAgICBfaXNBbmNlc3RvckhpZGRl
bjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhcmVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCAncGFyZW50VmlldycpOworCisgICAgICB3aGlsZSAocGFyZW50KSB7Cisg
ICAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFyZW50LCAnaXNWaXNpYmxl
JykgPT09IGZhbHNlKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAg
ICAgICBwYXJlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFyZW50LCAncGFyZW50
VmlldycpOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBWaXNpYmlsaXR5U3VwcG9ydDsKK30pOworZW5pZmVkKCdlbWJl
ci12aWV3cy9zdHJlYW1zL2NsYXNzX25hbWVfYmluZGluZycsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvdXRp
bHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9z
dHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscywg
X2VtYmVyUnVudGltZVN5c3RlbVN0cmluZykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0
cy5wYXJzZVByb3BlcnR5UGF0aCA9IHBhcnNlUHJvcGVydHlQYXRoOworICBleHBvcnRzLmNsYXNz
U3RyaW5nRm9yVmFsdWUgPSBjbGFzc1N0cmluZ0ZvclZhbHVlOworICBleHBvcnRzLnN0cmVhbWlm
eUNsYXNzTmFtZUJpbmRpbmcgPSBzdHJlYW1pZnlDbGFzc05hbWVCaW5kaW5nOworCisgIC8qKgor
ICAgIFBhcnNlIGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xkcyB0aGUgcGFy
c2VkIHByb3BlcnRpZXMuCisgIAorICAgIEZvciBleGFtcGxlIGEgcGF0aCBsaWtlICJjb250ZW50
LmlzRW5hYmxlZDplbmFibGVkOmRpc2FibGVkIiB3aWxsIHJldHVybiB0aGUKKyAgICBmb2xsb3dp
bmcgb2JqZWN0OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeworICAgICAgcGF0aDogImNv
bnRlbnQuaXNFbmFibGVkIiwKKyAgICAgIGNsYXNzTmFtZTogImVuYWJsZWQiLAorICAgICAgZmFs
c3lDbGFzc05hbWU6ICJkaXNhYmxlZCIsCisgICAgICBjbGFzc05hbWVzOiAiOmVuYWJsZWQ6ZGlz
YWJsZWQiCisgICAgfQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIHBhcnNlUHJvcGVydHlQYXRo
CisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gcGFyc2VQcm9w
ZXJ0eVBhdGgocGF0aCkgeworICAgIHZhciBzcGxpdCA9IHBhdGguc3BsaXQoJzonKTsKKyAgICB2
YXIgcHJvcGVydHlQYXRoID0gc3BsaXRbMF07CisgICAgdmFyIGNsYXNzTmFtZXMgPSAnJzsKKyAg
ICB2YXIgY2xhc3NOYW1lLCBmYWxzeUNsYXNzTmFtZTsKKworICAgIC8vIGNoZWNrIGlmIHRoZSBw
cm9wZXJ0eSBpcyBkZWZpbmVkIGFzIHByb3A6Y2xhc3Mgb3IgcHJvcDp0cnVlQ2xhc3M6ZmFsc2VD
bGFzcworICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7CisgICAgICBjbGFzc05hbWUgPSBzcGxp
dFsxXTsKKyAgICAgIGlmIChzcGxpdC5sZW5ndGggPT09IDMpIHsKKyAgICAgICAgZmFsc3lDbGFz
c05hbWUgPSBzcGxpdFsyXTsKKyAgICAgIH0KKworICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNs
YXNzTmFtZTsKKyAgICAgIGlmIChmYWxzeUNsYXNzTmFtZSkgeworICAgICAgICBjbGFzc05hbWVz
ICs9ICc6JyArIGZhbHN5Q2xhc3NOYW1lOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7
CisgICAgICBwYXRoOiBwcm9wZXJ0eVBhdGgsCisgICAgICBjbGFzc05hbWVzOiBjbGFzc05hbWVz
LAorICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgPT09ICcnID8gdW5kZWZpbmVkIDogY2xhc3NO
YW1lLAorICAgICAgZmFsc3lDbGFzc05hbWU6IGZhbHN5Q2xhc3NOYW1lCisgICAgfTsKKyAgfQor
CisgIC8qKgorICAgIEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZSwgYmFzZWQg
b24gdGhlIHBhdGgsIG9wdGlvbmFsCisgICAgYGNsYXNzTmFtZWAgYW5kIG9wdGlvbmFsIGBmYWxz
eUNsYXNzTmFtZWAuCisgIAorICAgIC0gaWYgYSBgY2xhc3NOYW1lYCBvciBgZmFsc3lDbGFzc05h
bWVgIGhhcyBiZWVuIHNwZWNpZmllZDoKKyAgICAgIC0gaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBh
bmQgYGNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAgICBgY2xhc3NOYW1lYCBp
cyByZXR1cm5lZAorICAgICAgLSBpZiB0aGUgdmFsdWUgaXMgZmFsc3kgYW5kIGBmYWxzeUNsYXNz
TmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAgICBgZmFsc3lDbGFzc05hbWVgIGlzIHJl
dHVybmVkCisgICAgICAtIG90aGVyd2lzZSBgbnVsbGAgaXMgcmV0dXJuZWQKKyAgICAtIGlmIHRo
ZSB2YWx1ZSBpcyBgdHJ1ZWAsIHRoZSBkYXNoZXJpemVkIGxhc3QgcGFydCBvZiB0aGUgc3VwcGxp
ZWQgcGF0aAorICAgICAgaXMgcmV0dXJuZWQKKyAgICAtIGlmIHRoZSB2YWx1ZSBpcyBub3QgYGZh
bHNlYCwgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZhbHVlYAorICAgICAgaXMgcmV0dXJu
ZWQKKyAgICAtIGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVzIGFwcGx5LCBgbnVsbGAgaXMgcmV0
dXJuZWQKKyAgCisgICAgQG1ldGhvZCBjbGFzc1N0cmluZ0ZvclZhbHVlCisgICAgQHBhcmFtIHBh
dGgKKyAgICBAcGFyYW0gdmFsCisgICAgQHBhcmFtIGNsYXNzTmFtZQorICAgIEBwYXJhbSBmYWxz
eUNsYXNzTmFtZQorICAgIEBzdGF0aWMKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9u
IGNsYXNzU3RyaW5nRm9yVmFsdWUocGF0aCwgdmFsLCBjbGFzc05hbWUsIGZhbHN5Q2xhc3NOYW1l
KSB7CisgICAgaWYgKF9lbWJlck1ldGFsVXRpbHMuaXNBcnJheSh2YWwpKSB7CisgICAgICB2YWwg
PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmFsLCAnbGVuZ3RoJykgIT09IDA7CisgICAg
fQorCisgICAgLy8gV2hlbiB1c2luZyB0aGUgY29sb24gc3ludGF4LCBldmFsdWF0ZSB0aGUgdHJ1
dGhpbmVzcyBvciBmYWxzaW5lc3MKKyAgICAvLyBvZiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHdo
aWNoIGNsYXNzTmFtZSB0byByZXR1cm4KKyAgICBpZiAoY2xhc3NOYW1lIHx8IGZhbHN5Q2xhc3NO
YW1lKSB7CisgICAgICBpZiAoY2xhc3NOYW1lICYmICEhdmFsKSB7CisgICAgICAgIHJldHVybiBj
bGFzc05hbWU7CisgICAgICB9IGVsc2UgaWYgKGZhbHN5Q2xhc3NOYW1lICYmICF2YWwpIHsKKyAg
ICAgICAgcmV0dXJuIGZhbHN5Q2xhc3NOYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHZhbHVlIGlzIGEgQm9vbGVhbiBhbmQg
dHJ1ZSwgcmV0dXJuIHRoZSBkYXNoZXJpemVkIHByb3BlcnR5CisgICAgICAvLyBuYW1lLgorICAg
IH0gZWxzZSBpZiAodmFsID09PSB0cnVlKSB7CisgICAgICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0
eSBwYXRoIHRvIGJlIHN1aXRhYmxlIGZvciB1c2UKKyAgICAgICAgLy8gYXMgYSBjbGFzcyBuYW1l
LiBGb3IgZXhhcGxlLCBjb250ZW50LmZvby5iYXJCYXoKKyAgICAgICAgLy8gYmVjb21lcyBiYXIt
YmF6LgorICAgICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7CisgICAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgg
LSAxXSk7CisKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmYWxzZSwgdW5kZWZpbmVk
LCBvciBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gdmFsdWUgb2YgdGhlIHBy
b3BlcnR5LgorICAgICAgfSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZhbCAhPSBudWxsKSB7
CisgICAgICAgICAgcmV0dXJuIHZhbDsKKworICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZGlzcGxh
eS4gUmV0dXJuIG51bGwgc28gdGhhdCB0aGUgb2xkIGNsYXNzIGlzIHJlbW92ZWQKKyAgICAgICAg
ICAvLyBidXQgbm8gbmV3IGNsYXNzIGlzIGFkZGVkLgorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICB9CisKKyAgZnVuY3Rpb24gc3RyZWFt
aWZ5Q2xhc3NOYW1lQmluZGluZyh2aWV3LCBjbGFzc05hbWVCaW5kaW5nLCBwcmVmaXgpIHsKKyAg
ICBwcmVmaXggPSBwcmVmaXggfHwgJyc7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Ns
YXNzTmFtZUJpbmRpbmdzIG11c3Qgbm90IGhhdmUgc3BhY2VzIGluIHRoZW0uIE11bHRpcGxlIGNs
YXNzIG5hbWUgYmluZGluZ3MgY2FuIGJlIHByb3ZpZGVkIGFzIGVsZW1lbnRzIG9mIGFuIGFycmF5
LCBlLmcuIFtcJ2Zvb1wnLCBcJzpiYXJcJ10nLCBjbGFzc05hbWVCaW5kaW5nLmluZGV4T2YoJyAn
KSA9PT0gLTEpOworICAgIHZhciBwYXJzZWRQYXRoID0gcGFyc2VQcm9wZXJ0eVBhdGgoY2xhc3NO
YW1lQmluZGluZyk7CisgICAgaWYgKHBhcnNlZFBhdGgucGF0aCA9PT0gJycpIHsKKyAgICAgIHJl
dHVybiBjbGFzc1N0cmluZ0ZvclZhbHVlKHBhcnNlZFBhdGgucGF0aCwgdHJ1ZSwgcGFyc2VkUGF0
aC5jbGFzc05hbWUsIHBhcnNlZFBhdGguZmFsc3lDbGFzc05hbWUpOworICAgIH0gZWxzZSB7Cisg
ICAgICB2YXIgcGF0aFZhbHVlID0gdmlldy5nZXRTdHJlYW0ocHJlZml4ICsgcGFyc2VkUGF0aC5w
YXRoKTsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5jaGFpbihwYXRoVmFs
dWUsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzU3RyaW5nRm9yVmFsdWUocGFy
c2VkUGF0aC5wYXRoLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHBhdGhWYWx1ZSksIHBh
cnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKKyAgICAgIH0p
OworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N0cmVhbXMvc2hvdWxkX2Rp
c3BsYXknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJv
cGVydHlfZ2V0JywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9z
dHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1bnRpbWVV
dGlscywgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gc2hvdWxkRGlzcGxheTsK
KworICB2YXIgU2hvdWxkRGlzcGxheVN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5k
ZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKHByZWRpY2F0ZSkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1Nob3VsZERpc3BsYXlTdHJlYW0gZXJyb3I6IHByZWRp
Y2F0ZSBtdXN0IGJlIGEgc3RyZWFtJywgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0o
cHJlZGljYXRlKSk7CisKKyAgICAgIHZhciBpc1RydXRoeSA9IHByZWRpY2F0ZS5nZXQoJ2lzVHJ1
dGh5Jyk7CisKKyAgICAgIHRoaXMuaW5pdCgpOworICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVk
aWNhdGU7CisgICAgICB0aGlzLmlzVHJ1dGh5ID0gaXNUcnV0aHk7CisgICAgICB0aGlzLmxlbmd0
aERlcCA9IG51bGw7CisKKyAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShwcmVkaWNhdGUpOworICAg
ICAgdGhpcy5hZGREZXBlbmRlbmN5KGlzVHJ1dGh5KTsKKyAgICB9LAorCisgICAgY29tcHV0ZTog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHRydXRoeSA9IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LnJlYWQodGhpcy5pc1RydXRoeSk7CisKKyAgICAgIGlmICh0eXBlb2YgdHJ1dGh5ID09PSAnYm9v
bGVhbicpIHsKKyAgICAgICAgcmV0dXJuIHRydXRoeTsKKyAgICAgIH0KKworICAgICAgaWYgKHRo
aXMubGVuZ3RoRGVwKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aERlcC5nZXRWYWx1ZSgp
ICE9PSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICEhX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMucmVhZCh0aGlzLnByZWRpY2F0ZSk7CisgICAgICB9CisgICAgfSwKKworICAgIHJl
dmFsaWRhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNB
cnJheShfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHRoaXMucHJlZGljYXRlKSkpIHsKKyAg
ICAgICAgaWYgKCF0aGlzLmxlbmd0aERlcCkgeworICAgICAgICAgIHRoaXMubGVuZ3RoRGVwID0g
dGhpcy5hZGRNdXRhYmxlRGVwZW5kZW5jeSh0aGlzLnByZWRpY2F0ZS5nZXQoJ2xlbmd0aCcpKTsK
KyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoRGVwKSB7
CisgICAgICAgICAgdGhpcy5sZW5ndGhEZXAuZGVzdHJveSgpOworICAgICAgICAgIHRoaXMubGVu
Z3RoRGVwID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZnVu
Y3Rpb24gc2hvdWxkRGlzcGxheShwcmVkaWNhdGUpIHsKKyAgICBpZiAoX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMuaXNTdHJlYW0ocHJlZGljYXRlKSkgeworICAgICAgcmV0dXJuIG5ldyBTaG91bGRE
aXNwbGF5U3RyZWFtKHByZWRpY2F0ZSk7CisgICAgfQorCisgICAgdmFyIHR5cGUgPSB0eXBlb2Yg
cHJlZGljYXRlOworCisgICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykgeworICAgICAgcmV0dXJu
IHByZWRpY2F0ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZSAmJiB0eXBlID09PSAnb2JqZWN0JyAm
JiBwcmVkaWNhdGUgIT09IG51bGwpIHsKKyAgICAgIHZhciBpc1RydXRoeSA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChwcmVkaWNhdGUsICdpc1RydXRoeScpOworICAgICAgaWYgKHR5cGVv
ZiBpc1RydXRoeSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgIHJldHVybiBpc1RydXRoeTsKKyAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoX2VtYmVyUnVudGltZVV0aWxzLmlzQXJyYXkocHJlZGlj
YXRlKSkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwcmVkaWNh
dGUsICdsZW5ndGgnKSAhPT0gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICEhcHJlZGlj
YXRlOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N0cmVhbXMvdXRpbHMn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnLCAnZW1iZXItcnVudGltZS9taXhpbnMv
Y29udHJvbGxlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBfZW1iZXJSdW50aW1l
TWl4aW5zQ29udHJvbGxlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5yZWFkVmll
d0ZhY3RvcnkgPSByZWFkVmlld0ZhY3Rvcnk7CisgIGV4cG9ydHMucmVhZENvbXBvbmVudEZhY3Rv
cnkgPSByZWFkQ29tcG9uZW50RmFjdG9yeTsKKyAgZXhwb3J0cy5yZWFkVW53cmFwcGVkTW9kZWwg
PSByZWFkVW53cmFwcGVkTW9kZWw7CisKKyAgZnVuY3Rpb24gcmVhZFZpZXdGYWN0b3J5KG9iamVj
dCwgb3duZXIpIHsKKyAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFk
KG9iamVjdCk7CisgICAgdmFyIHZpZXdDbGFzczsKKworICAgIGlmICh0eXBlb2YgdmFsdWUgPT09
ICdzdHJpbmcnKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVmlldyByZXF1aXJl
cyBhbiBvd25lciB0byByZXNvbHZlIHZpZXdzIG5vdCBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgY29u
dGV4dCcsICEhb3duZXIpOworICAgICAgdmlld0NsYXNzID0gb3duZXIuX2xvb2t1cEZhY3Rvcnko
J3ZpZXc6JyArIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdmlld0NsYXNzID0gdmFsdWU7
CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQodmFsdWUgKyAnIG11c3QgYmUg
YSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBFbWJlci5WaWV3LCBub3QgJyArIHZpZXdDbGFz
cywgKGZ1bmN0aW9uICh2aWV3Q2xhc3MpIHsKKyAgICAgIHJldHVybiB2aWV3Q2xhc3MgJiYgKHZp
ZXdDbGFzcy5pc1ZpZXdGYWN0b3J5IHx8IHZpZXdDbGFzcy5pc1ZpZXcgfHwgdmlld0NsYXNzLmlz
Q29tcG9uZW50RmFjdG9yeSB8fCB2aWV3Q2xhc3MuaXNDb21wb25lbnQpOworICAgIH0pKHZpZXdD
bGFzcykpOworCisgICAgcmV0dXJuIHZpZXdDbGFzczsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRD
b21wb25lbnRGYWN0b3J5KG5hbWVPclN0cmVhbSwgb3duZXIpIHsKKyAgICB2YXIgbmFtZSA9IF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQobmFtZU9yU3RyZWFtKTsKKyAgICB2YXIgY29tcG9u
ZW50TG9va3VwID0gb3duZXIubG9va3VwKCdjb21wb25lbnQtbG9va3VwOm1haW4nKTsKKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ291bGQgbm90IGZpbmQgXCdjb21wb25lbnQtbG9va3Vw
Om1haW5cJyBvbiB0aGUgcHJvdmlkZWQgY29udGFpbmVyLCAnICsgJ3doaWNoIGlzIG5lY2Vzc2Fy
eSBmb3IgcGVyZm9ybWluZyBjb21wb25lbnQgbG9va3VwcycsIGNvbXBvbmVudExvb2t1cCk7CisK
KyAgICByZXR1cm4gY29tcG9uZW50TG9va3VwLmxvb2t1cEZhY3RvcnkobmFtZSwgb3duZXIpOwor
ICB9CisKKyAgZnVuY3Rpb24gcmVhZFVud3JhcHBlZE1vZGVsKG9iamVjdCkgeworICAgIGlmIChf
ZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShvYmplY3QpKSB7CisgICAgICB2YXIgcmVz
dWx0ID0gb2JqZWN0LnZhbHVlKCk7CisKKyAgICAgIC8vIElmIHRoZSBwYXRoIGlzIGV4YWN0bHkg
YGNvbnRyb2xsZXJgIHRoZW4gd2UgZG9uJ3QgdW53cmFwIGl0LgorICAgICAgaWYgKG9iamVjdC5s
YWJlbCAhPT0gJ2NvbnRyb2xsZXInKSB7CisgICAgICAgIHdoaWxlIChfZW1iZXJSdW50aW1lTWl4
aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdChyZXN1bHQpKSB7CisgICAgICAgICAgcmVzdWx0
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJlc3VsdCwgJ21vZGVsJyk7CisgICAgICAg
IH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIG9iamVjdDsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCJlbWJlci12aWV3cy9zeXN0
ZW0vYWN0aW9uX21hbmFnZXIiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworCisg
ICJ1c2Ugc3RyaWN0IjsKKworICBmdW5jdGlvbiBBY3Rpb25NYW5hZ2VyKCkge30KKworICAvKioK
KyAgICBHbG9iYWwgYWN0aW9uIGlkIGhhc2guCisgIAorICAgIEBwcml2YXRlCisgICAgQHByb3Bl
cnR5IHJlZ2lzdGVyZWRBY3Rpb25zCisgICAgQHR5cGUgT2JqZWN0CisgICovCisgIEFjdGlvbk1h
bmFnZXIucmVnaXN0ZXJlZEFjdGlvbnMgPSB7fTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBBY3Rp
b25NYW5hZ2VyOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N5c3RlbS9idWlsZC1jb21wb25l
bnQtdGVtcGxhdGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdodG1sYmFycy1ydW50aW1l
JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC12YWx1ZScsICdlbWJlci1tZXRhbC9zdHJlYW1z
L3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxBc3NpZ24sIF9odG1sYmFyc1J1bnRpbWUsIF9lbWJl
ckh0bWxiYXJzSG9va3NHZXRWYWx1ZSwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGJ1aWxkQ29tcG9uZW50VGVtcGxhdGU7
CisgIGV4cG9ydHMuYnVpbGRIVE1MVGVtcGxhdGUgPSBidWlsZEhUTUxUZW1wbGF0ZTsKKworICBm
dW5jdGlvbiBidWlsZENvbXBvbmVudFRlbXBsYXRlKF9yZWYsIGF0dHJzLCBjb250ZW50KSB7Cisg
ICAgdmFyIGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50OworICAgIHZhciB0YWdOYW1lID0gX3Jl
Zi50YWdOYW1lOworICAgIHZhciBsYXlvdXQgPSBfcmVmLmxheW91dDsKKyAgICB2YXIgaXNBbmds
ZUJyYWNrZXQgPSBfcmVmLmlzQW5nbGVCcmFja2V0OworICAgIHZhciBpc0NvbXBvbmVudEVsZW1l
bnQgPSBfcmVmLmlzQ29tcG9uZW50RWxlbWVudDsKKyAgICB2YXIgb3V0ZXJBdHRycyA9IF9yZWYu
b3V0ZXJBdHRyczsKKworICAgIHZhciBibG9ja1RvUmVuZGVyLCBtZXRhOworCisgICAgaWYgKGNv
bXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb21wb25lbnQgPSBudWxsOworICAgIH0K
KworICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LnJhdykgeworICAgICAgdmFyIHlpZWxkVG8gPSBj
cmVhdGVDb250ZW50QmxvY2tzKGNvbnRlbnQudGVtcGxhdGVzLCBjb250ZW50LnNjb3BlLCBjb250
ZW50LnNlbGYsIGNvbXBvbmVudCk7CisgICAgICBibG9ja1RvUmVuZGVyID0gY3JlYXRlTGF5b3V0
QmxvY2sobGF5b3V0LnJhdywgeWllbGRUbywgY29udGVudC5zZWxmLCBjb21wb25lbnQsIGF0dHJz
KTsKKyAgICAgIG1ldGEgPSBsYXlvdXQucmF3Lm1ldGE7CisgICAgfSBlbHNlIGlmIChjb250ZW50
LnRlbXBsYXRlcyAmJiBjb250ZW50LnRlbXBsYXRlcy5kZWZhdWx0KSB7CisgICAgICBibG9ja1Rv
UmVuZGVyID0gY3JlYXRlQ29udGVudEJsb2NrKGNvbnRlbnQudGVtcGxhdGVzLmRlZmF1bHQsIGNv
bnRlbnQuc2NvcGUsIGNvbnRlbnQuc2VsZiwgY29tcG9uZW50KTsKKyAgICAgIG1ldGEgPSBjb250
ZW50LnRlbXBsYXRlcy5kZWZhdWx0Lm1ldGE7CisgICAgfQorCisgICAgaWYgKGNvbXBvbmVudCAm
JiAhY29tcG9uZW50Ll9pc0FuZ2xlQnJhY2tldCB8fCBpc0NvbXBvbmVudEVsZW1lbnQpIHsKKyAg
ICAgIHRhZ05hbWUgPSB0YWdOYW1lIHx8IHRhZ05hbWVGb3IoY29tcG9uZW50KTsKKworICAgICAg
Ly8gSWYgdGhpcyBpcyBub3QgYSB0YWdsZXNzIGNvbXBvbmVudCwgd2UgbmVlZCB0byBjcmVhdGUg
dGhlIHdyYXBwaW5nCisgICAgICAvLyBlbGVtZW50LiBXZSB1c2UgYG1hbnVhbEVsZW1lbnRgIHRv
IGNyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgcmVwcmVzZW50cworICAgICAgLy8gdGhlIHdyYXBwaW5n
IGVsZW1lbnQgYW5kIHlpZWxkcyB0byB0aGUgcHJldmlvdXMgYmxvY2suCisgICAgICBpZiAodGFn
TmFtZSAhPT0gJycpIHsKKyAgICAgICAgaWYgKGlzQ29tcG9uZW50RWxlbWVudCkgeworICAgICAg
ICAgIGF0dHJzID0gbWVyZ2VBdHRycyhhdHRycywgb3V0ZXJBdHRycyk7CisgICAgICAgIH0KKyAg
ICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBub3JtYWxpemVDb21wb25lbnRBdHRyaWJ1dGVzKGNvbXBv
bmVudCwgaXNBbmdsZUJyYWNrZXQsIGF0dHJzKTsKKyAgICAgICAgdmFyIGVsZW1lbnRUZW1wbGF0
ZSA9IF9odG1sYmFyc1J1bnRpbWUuaW50ZXJuYWwubWFudWFsRWxlbWVudCh0YWdOYW1lLCBhdHRy
aWJ1dGVzKTsKKyAgICAgICAgZWxlbWVudFRlbXBsYXRlLm1ldGEgPSBtZXRhOworCisgICAgICAg
IGJsb2NrVG9SZW5kZXIgPSBjcmVhdGVFbGVtZW50QmxvY2soZWxlbWVudFRlbXBsYXRlLCBibG9j
a1RvUmVuZGVyLCBjb21wb25lbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsaWRhdGVU
YWdsZXNzQ29tcG9uZW50KGNvbXBvbmVudCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gdGFn
TmFtZSBpcyBvbmUgb2Y6CisgICAgLy8gICAqIGB1bmRlZmluZWRgIGlmIG5vIGNvbXBvbmVudCBp
cyBwcmVzZW50CisgICAgLy8gICAqIHRoZSBmYWxzeSB2YWx1ZSAiIiBpZiBzZXQgZXhwbGljaXRs
eSBvbiB0aGUgY29tcG9uZW50CisgICAgLy8gICAqIGFuIGFjdHVhbCB0YWdOYW1lIHNldCBleHBs
aWNpdGx5IG9uIHRoZSBjb21wb25lbnQKKyAgICByZXR1cm4geyBjcmVhdGVkRWxlbWVudDogISF0
YWdOYW1lLCBibG9jazogYmxvY2tUb1JlbmRlciB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRI
VE1MVGVtcGxhdGUodGFnTmFtZSwgX2F0dHJzLCBjb250ZW50KSB7CisgICAgdmFyIGF0dHJzID0g
e307CisKKyAgICBmb3IgKHZhciBwcm9wIGluIF9hdHRycykgeworICAgICAgdmFyIHZhbCA9IF9h
dHRyc1twcm9wXTsKKworICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7CisgICAg
ICAgIGF0dHJzW3Byb3BdID0gdmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0cnNbcHJv
cF0gPSBbJ3ZhbHVlJywgdmFsXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hpbGRUZW1w
bGF0ZSA9IGNvbnRlbnQudGVtcGxhdGVzLmRlZmF1bHQ7CisgICAgdmFyIGVsZW1lbnRUZW1wbGF0
ZSA9IF9odG1sYmFyc1J1bnRpbWUuaW50ZXJuYWwubWFudWFsRWxlbWVudCh0YWdOYW1lLCBhdHRy
cywgY2hpbGRUZW1wbGF0ZS5pc0VtcHR5KTsKKworICAgIGlmIChjaGlsZFRlbXBsYXRlLmlzRW1w
dHkpIHsKKyAgICAgIHJldHVybiBibG9ja0ZvcihlbGVtZW50VGVtcGxhdGUsIHsgc2NvcGU6IGNv
bnRlbnQuc2NvcGUgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBibG9ja1RvUmVuZGVyID0g
YmxvY2tGb3IoY29udGVudC50ZW1wbGF0ZXMuZGVmYXVsdCwgY29udGVudCk7CisgICAgICByZXR1
cm4gYmxvY2tGb3IoZWxlbWVudFRlbXBsYXRlLCB7IHlpZWxkVG86IGJsb2NrVG9SZW5kZXIsIHNj
b3BlOiBjb250ZW50LnNjb3BlIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1lcmdlQXR0
cnMoaW5uZXJBdHRycywgb3V0ZXJBdHRycykgeworICAgIHZhciByZXN1bHQgPSBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBpbm5lckF0dHJzLCBvdXRlckF0dHJzKTsKKworICAgIGlmIChp
bm5lckF0dHJzLmNsYXNzICYmIG91dGVyQXR0cnMuY2xhc3MpIHsKKyAgICAgIHJlc3VsdC5jbGFz
cyA9IFsnc3ViZXhwcicsICctam9pbi1jbGFzc2VzJywgW1sndmFsdWUnLCBpbm5lckF0dHJzLmNs
YXNzXSwgWyd2YWx1ZScsIG91dGVyQXR0cnMuY2xhc3NdXSwgW11dOworICAgIH0KKworICAgIHJl
dHVybiByZXN1bHQ7CisgIH0KKworICBmdW5jdGlvbiBibG9ja0Zvcih0ZW1wbGF0ZSwgb3B0aW9u
cykgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdCVUc6IE11c3QgcGFzcyBhIHRlbXBs
YXRlIHRvIGJsb2NrRm9yJywgISF0ZW1wbGF0ZSk7CisgICAgcmV0dXJuIF9odG1sYmFyc1J1bnRp
bWUuaW50ZXJuYWwuYmxvY2tGb3IoX2h0bWxiYXJzUnVudGltZS5yZW5kZXIsIHRlbXBsYXRlLCBv
cHRpb25zKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRCbG9jayh0ZW1wbGF0ZSwg
c2NvcGUsIHNlbGYsIGNvbXBvbmVudCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdC
VUc6IGJ1aWxkQ29tcG9uZW50VGVtcGxhdGUgY2FuIHRha2UgYSBzY29wZSBvciBhIHNlbGYsIGJ1
dCBub3QgYm90aCcsICEoc2NvcGUgJiYgc2VsZikpOworCisgICAgcmV0dXJuIGJsb2NrRm9yKHRl
bXBsYXRlLCB7CisgICAgICBzY29wZTogc2NvcGUsCisgICAgICBzZWxmOiBzZWxmLAorICAgICAg
b3B0aW9uczogeyB2aWV3OiBjb21wb25lbnQgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24g
Y3JlYXRlQ29udGVudEJsb2Nrcyh0ZW1wbGF0ZXMsIHNjb3BlLCBzZWxmLCBjb21wb25lbnQpIHsK
KyAgICBpZiAoIXRlbXBsYXRlcykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgb3V0
cHV0ID0ge307CisgICAgZm9yICh2YXIgbmFtZSBpbiB0ZW1wbGF0ZXMpIHsKKyAgICAgIGlmICh0
ZW1wbGF0ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgdmFyIHRlbXBsYXRlID0g
dGVtcGxhdGVzW25hbWVdOworICAgICAgICBpZiAodGVtcGxhdGUpIHsKKyAgICAgICAgICBvdXRw
dXRbbmFtZV0gPSBjcmVhdGVDb250ZW50QmxvY2sodGVtcGxhdGVzW25hbWVdLCBzY29wZSwgc2Vs
ZiwgY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0
cHV0OworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlTGF5b3V0QmxvY2sodGVtcGxhdGUsIHlpZWxk
VG8sIHNlbGYsIGNvbXBvbmVudCwgYXR0cnMpIHsKKyAgICByZXR1cm4gYmxvY2tGb3IodGVtcGxh
dGUsIHsKKyAgICAgIHlpZWxkVG86IHlpZWxkVG8sCisKKyAgICAgIC8vIElmIHdlIGhhdmUgYW4g
b2xkLXN0eWxlIENvbnRyb2xsZXIgd2l0aCBhIHRlbXBsYXRlIGl0IHdpbGwgYmUKKyAgICAgIC8v
IHBhc3NlZCBhcyBvdXIgYHNlbGZgIGFyZ3VtZW50LCBhbmQgaXQgc2hvdWxkIGJlIHRoZSBjb250
ZXh0IGZvcgorICAgICAgLy8gdGhlIHRlbXBsYXRlLiBPdGhlcndpc2UsIHdlIG11c3QgaGF2ZSBh
IHJlYWwgQ29tcG9uZW50IGFuZCBpdAorICAgICAgLy8gc2hvdWxkIGJlIGl0cyBvd24gdGVtcGxh
dGUgY29udGV4dC4KKyAgICAgIHNlbGY6IHNlbGYgfHwgY29tcG9uZW50LAorCisgICAgICBvcHRp
b25zOiB7IHZpZXc6IGNvbXBvbmVudCwgYXR0cnM6IGF0dHJzIH0KKyAgICB9KTsKKyAgfQorCisg
IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0ZW1wbGF0ZSwgeWllbGRUbywgY29tcG9uZW50
KSB7CisgICAgcmV0dXJuIGJsb2NrRm9yKHRlbXBsYXRlLCB7CisgICAgICB5aWVsZFRvOiB5aWVs
ZFRvLAorICAgICAgc2VsZjogY29tcG9uZW50LAorICAgICAgb3B0aW9uczogeyB2aWV3OiBjb21w
b25lbnQgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gdGFnTmFtZUZvcih2aWV3KSB7Cisg
ICAgdmFyIHRhZ05hbWUgPSB2aWV3LnRhZ05hbWU7CisKKyAgICBpZiAodGFnTmFtZSAhPT0gbnVs
bCAmJiB0eXBlb2YgdGFnTmFtZSA9PT0gJ29iamVjdCcgJiYgdGFnTmFtZS5pc0Rlc2NyaXB0b3Ip
IHsKKyAgICAgIHRhZ05hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ3Rh
Z05hbWUnKTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdJbiB0aGUgZnV0dXJl
IHVzaW5nIGEgY29tcHV0ZWQgcHJvcGVydHkgdG8gZGVmaW5lIHRhZ05hbWUgd2lsbCBub3QgYmUg
cGVybWl0dGVkLiBUaGF0IHZhbHVlIHdpbGwgYmUgcmVzcGVjdGVkLCBidXQgY2hhbmdpbmcgaXQg
d2lsbCBub3QgdXBkYXRlIHRoZSBlbGVtZW50LicsICF0YWdOYW1lLCB7IGlkOiAnZW1iZXItdmll
d3MuY29tcHV0ZWQtdGFnLW5hbWUnLCB1bnRpbDogJzIuMC4wJyB9KTsKKyAgICB9CisKKyAgICBp
ZiAodGFnTmFtZSA9PT0gbnVsbCB8fCB0YWdOYW1lID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHRh
Z05hbWUgPSB2aWV3Ll9kZWZhdWx0VGFnTmFtZSB8fCAnZGl2JzsKKyAgICB9CisKKyAgICByZXR1
cm4gdGFnTmFtZTsKKyAgfQorCisgIC8vIFRha2VzIGEgY29tcG9uZW50IGFuZCBidWlsZHMgYSBu
b3JtYWxpemVkIHNldCBvZiBhdHRyaWJ1dGUKKyAgLy8gYmluZGluZ3MgY29uc3VtYWJsZSBieSBI
VE1MQmFycycgYGF0dHJpYnV0ZWAgaG9vay4KKyAgZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50
QXR0cmlidXRlcyhjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBhdHRycykgeworICAgIHZhciBu
b3JtYWxpemVkID0ge307CisgICAgdmFyIGF0dHJpYnV0ZUJpbmRpbmdzID0gY29tcG9uZW50LmF0
dHJpYnV0ZUJpbmRpbmdzOworICAgIHZhciBzdHJlYW1CYXNlUGF0aCA9IGNvbXBvbmVudC5pc0Nv
bXBvbmVudCA/ICcnIDogJ3ZpZXcuJzsKKyAgICB2YXIgaSwgbDsKKworICAgIGlmIChhdHRycy5p
ZCAmJiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCkpIHsKKyAg
ICAgIC8vIERvIG5vdCBhbGxvdyBiaW5kaW5nIHRvIHRoZSBgaWRgCisgICAgICBub3JtYWxpemVk
LmlkID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0cnMuaWQpOworICAg
ICAgY29tcG9uZW50LmVsZW1lbnRJZCA9IG5vcm1hbGl6ZWQuaWQ7CisgICAgfSBlbHNlIHsKKyAg
ICAgIG5vcm1hbGl6ZWQuaWQgPSBjb21wb25lbnQuZWxlbWVudElkOworICAgIH0KKworICAgIGlm
IChhdHRyaWJ1dGVCaW5kaW5ncykgeworICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJpYnV0ZUJp
bmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICB2YXIgYXR0ciA9IGF0dHJpYnV0
ZUJpbmRpbmdzW2ldOworICAgICAgICB2YXIgY29sb25JbmRleCA9IGF0dHIuaW5kZXhPZignOicp
OworCisgICAgICAgIHZhciBhdHRyTmFtZSwgZXhwcmVzc2lvbjsKKyAgICAgICAgaWYgKGNvbG9u
SW5kZXggIT09IC0xKSB7CisgICAgICAgICAgdmFyIGF0dHJQcm9wZXJ0eSA9IGF0dHIuc3Vic3Ry
aW5nKDAsIGNvbG9uSW5kZXgpOworICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5zdWJzdHJpbmco
Y29sb25JbmRleCArIDEpOworICAgICAgICAgIGV4cHJlc3Npb24gPSBbJ2dldCcsICcnICsgc3Ry
ZWFtQmFzZVBhdGggKyBhdHRyUHJvcGVydHldOworICAgICAgICB9IGVsc2UgaWYgKGF0dHJzW2F0
dHJdKSB7CisgICAgICAgICAgLy8gVE9ETzogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLngsIHdl
IHByb2JhYmx5IG5lZWQgdG8gYHNldGAKKyAgICAgICAgICAvLyB0aGUgY29tcG9uZW50J3MgYXR0
cmlidXRlIGhlcmUgaWYgaXQgaXMgYSBDUCwgYnV0IHdlIGFsc28KKyAgICAgICAgICAvLyBwcm9i
YWJseSB3YW50IHRvIHN1c3BlbmQgb2JzZXJ2ZXJzIGFuZCBhbGxvdyB0aGUKKyAgICAgICAgICAv
LyB3aWxsVXBkYXRlQXR0cnMgbG9naWMgdG8gdHJpZ2dlciBvYnNlcnZlcnMgYXQgdGhlIGNvcnJl
Y3QgdGltZS4KKyAgICAgICAgICBhdHRyTmFtZSA9IGF0dHI7CisgICAgICAgICAgZXhwcmVzc2lv
biA9IFsndmFsdWUnLCBhdHRyc1thdHRyXV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
YXR0ck5hbWUgPSBhdHRyOworICAgICAgICAgIGV4cHJlc3Npb24gPSBbJ2dldCcsICcnICsgc3Ry
ZWFtQmFzZVBhdGggKyBhdHRyXTsKKyAgICAgICAgfQorCisgICAgICAgIF9lbWJlck1ldGFsRGVi
dWcuYXNzZXJ0KCdZb3UgY2Fubm90IHVzZSBjbGFzcyBhcyBhbiBhdHRyaWJ1dGVCaW5kaW5nLCB1
c2UgY2xhc3NOYW1lQmluZGluZ3MgaW5zdGVhZC4nLCBhdHRyTmFtZSAhPT0gJ2NsYXNzJyk7CisK
KyAgICAgICAgbm9ybWFsaXplZFthdHRyTmFtZV0gPSBleHByZXNzaW9uOworICAgICAgfQorICAg
IH0KKworICAgIGlmIChpc0FuZ2xlQnJhY2tldCkgeworICAgICAgZm9yICh2YXIgcHJvcCBpbiBh
dHRycykgeworICAgICAgICB2YXIgdmFsID0gYXR0cnNbcHJvcF07CisgICAgICAgIGlmICghdmFs
KSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZW9m
IHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsLmlzQ29uY2F0KSB7CisgICAgICAgICAgbm9ybWFsaXpl
ZFtwcm9wXSA9IFsndmFsdWUnLCB2YWxdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGF0dHJzLnRhZ05hbWUpIHsKKyAgICAgIGNvbXBvbmVudC50YWdOYW1lID0gYXR0cnMu
dGFnTmFtZTsKKyAgICB9CisKKyAgICB2YXIgbm9ybWFsaXplZENsYXNzID0gbm9ybWFsaXplQ2xh
c3MoY29tcG9uZW50LCBhdHRycywgc3RyZWFtQmFzZVBhdGgpOworCisgICAgaWYgKG5vcm1hbGl6
ZWRDbGFzcykgeworICAgICAgbm9ybWFsaXplZC5jbGFzcyA9IG5vcm1hbGl6ZWRDbGFzczsKKyAg
ICB9CisKKyAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbXBvbmVudCwgJ2lz
VmlzaWJsZScpID09PSBmYWxzZSkgeworICAgICAgdmFyIGhpZGRlblN0eWxlID0gWydzdWJleHBy
JywgJy1odG1sLXNhZmUnLCBbJ2Rpc3BsYXk6IG5vbmU7J10sIFtdXTsKKyAgICAgIHZhciBleGlz
dGluZ1N0eWxlID0gbm9ybWFsaXplZC5zdHlsZTsKKworICAgICAgaWYgKGV4aXN0aW5nU3R5bGUp
IHsKKyAgICAgICAgbm9ybWFsaXplZC5zdHlsZSA9IFsnc3ViZXhwcicsICdjb25jYXQnLCBbZXhp
c3RpbmdTdHlsZSwgJyAnLCBoaWRkZW5TdHlsZV0sIFtdXTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIG5vcm1hbGl6ZWQuc3R5bGUgPSBoaWRkZW5TdHlsZTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gbm9ybWFsaXplZDsKKyAgfQorCisgIGZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzKGNv
bXBvbmVudCwgYXR0cnMsIHN0cmVhbUJhc2VQYXRoKSB7CisgICAgdmFyIGksIGw7CisgICAgdmFy
IG5vcm1hbGl6ZWRDbGFzcyA9IFtdOworICAgIHZhciBjbGFzc05hbWVzID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KGNvbXBvbmVudCwgJ2NsYXNzTmFtZXMnKTsKKyAgICB2YXIgY2xhc3NO
YW1lQmluZGluZ3MgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoY29tcG9uZW50LCAnY2xh
c3NOYW1lQmluZGluZ3MnKTsKKworICAgIGlmIChhdHRycy5jbGFzcykgeworICAgICAgaWYgKF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKGF0dHJzLmNsYXNzKSkgeworICAgICAgICBu
b3JtYWxpemVkQ2xhc3MucHVzaChbJ3N1YmV4cHInLCAnLW5vcm1hbGl6ZS1jbGFzcycsIFtbJ3Zh
bHVlJywgYXR0cnMuY2xhc3MucGF0aF0sIFsndmFsdWUnLCBhdHRycy5jbGFzc11dLCBbXV0pOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9ybWFsaXplZENsYXNzLnB1c2goYXR0cnMuY2xhc3Mp
OworICAgICAgfQorICAgIH0KKworICAgIGlmIChhdHRycy5jbGFzc0JpbmRpbmcpIHsKKyAgICAg
IG5vcm1hbGl6ZUNsYXNzZXMoYXR0cnMuY2xhc3NCaW5kaW5nLnNwbGl0KCcgJyksIG5vcm1hbGl6
ZWRDbGFzcywgc3RyZWFtQmFzZVBhdGgpOworICAgIH0KKworICAgIGlmIChjbGFzc05hbWVzKSB7
CisgICAgICBmb3IgKGkgPSAwLCBsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgICAgbm9ybWFsaXplZENsYXNzLnB1c2goY2xhc3NOYW1lc1tpXSk7CisgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGNsYXNzTmFtZUJpbmRpbmdzKSB7CisgICAgICBub3JtYWxpemVDbGFz
c2VzKGNsYXNzTmFtZUJpbmRpbmdzLCBub3JtYWxpemVkQ2xhc3MsIHN0cmVhbUJhc2VQYXRoKTsK
KyAgICB9CisKKyAgICBpZiAobm9ybWFsaXplQ2xhc3MubGVuZ3RoKSB7CisgICAgICByZXR1cm4g
WydzdWJleHByJywgJy1qb2luLWNsYXNzZXMnLCBub3JtYWxpemVkQ2xhc3MsIFtdXTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVDbGFzc2VzKGNsYXNzZXMsIG91dHB1dCwgc3Ry
ZWFtQmFzZVBhdGgpIHsKKyAgICB2YXIgaSwgbDsKKworICAgIGZvciAoaSA9IDAsIGwgPSBjbGFz
c2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzZXNb
aV07CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY2xhc3NOYW1lQmluZGluZ3MgbXVz
dCBub3QgaGF2ZSBzcGFjZXMgaW4gdGhlbS4gTXVsdGlwbGUgY2xhc3MgbmFtZSBiaW5kaW5ncyBj
YW4gYmUgcHJvdmlkZWQgYXMgZWxlbWVudHMgb2YgYW4gYXJyYXksIGUuZy4gW1wnZm9vXCcsIFwn
OmJhclwnXScsIGNsYXNzTmFtZS5pbmRleE9mKCcgJykgPT09IC0xKTsKKworICAgICAgdmFyIF9j
bGFzc05hbWUkc3BsaXQgPSBjbGFzc05hbWUuc3BsaXQoJzonKTsKKworICAgICAgdmFyIHByb3BO
YW1lID0gX2NsYXNzTmFtZSRzcGxpdFswXTsKKyAgICAgIHZhciBhY3RpdmVDbGFzcyA9IF9jbGFz
c05hbWUkc3BsaXRbMV07CisgICAgICB2YXIgaW5hY3RpdmVDbGFzcyA9IF9jbGFzc05hbWUkc3Bs
aXRbMl07CisKKyAgICAgIC8vIExlZ2FjeSA6Y2xhc3MgbWljcm9zeW50YXggZm9yIHN0YXRpYyBj
bGFzcyBuYW1lcworICAgICAgaWYgKHByb3BOYW1lID09PSAnJykgeworICAgICAgICBvdXRwdXQu
cHVzaChhY3RpdmVDbGFzcyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2
YXIgcHJvcCA9ICcnICsgc3RyZWFtQmFzZVBhdGggKyBwcm9wTmFtZTsKKworICAgICAgb3V0cHV0
LnB1c2goWydzdWJleHByJywgJy1ub3JtYWxpemUtY2xhc3MnLCBbCisgICAgICAvLyBwYXJhbXMK
KyAgICAgIFsndmFsdWUnLCBwcm9wTmFtZV0sIFsnZ2V0JywgcHJvcF1dLCBbCisgICAgICAvLyBo
YXNoCisgICAgICAnYWN0aXZlQ2xhc3MnLCBhY3RpdmVDbGFzcywgJ2luYWN0aXZlQ2xhc3MnLCBp
bmFjdGl2ZUNsYXNzXV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHZhbGlkYXRlVGFnbGVz
c0NvbXBvbmVudChjb21wb25lbnQpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IGNhbm5vdCB1c2UgYGNsYXNzTmFtZUJpbmRpbmdzYCBvbiBhIHRhZy1sZXNzIGNvbXBvbmVudDog
JyArIGNvbXBvbmVudC50b1N0cmluZygpLCAoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNsYXNz
TmFtZUJpbmRpbmdzID0gY29tcG9uZW50LmNsYXNzTmFtZUJpbmRpbmdzOworICAgICAgcmV0dXJu
ICFjbGFzc05hbWVCaW5kaW5ncyB8fCBjbGFzc05hbWVCaW5kaW5ncy5sZW5ndGggPT09IDA7Cisg
ICAgfSkoKSk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9zeXN0ZW0vZXZlbnRfZGlz
cGF0Y2hlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL2lz
X25vbmUnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2Jq
ZWN0JywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItdmlld3Mvc3lzdGVtL2Fj
dGlvbl9tYW5hZ2VyJywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3ZpZXcnLCAnZW1iZXItbWV0YWwvYXNz
aWduJywgJ2NvbnRhaW5lci9vd25lcicsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQs
IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbElzX25vbmUsIF9lbWJlck1ldGFs
UnVuX2xvb3AsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclZpZXdzU3lzdGVtSnF1
ZXJ5LCBfZW1iZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLCBfZW1iZXJWaWV3c1ZpZXdzVmll
dywgX2VtYmVyTWV0YWxBc3NpZ24sIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxFbnZpcm9u
bWVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdz
CisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBST09UX0VMRU1FTlRfQ0xBU1MgPSAn
ZW1iZXItYXBwbGljYXRpb24nOworICB2YXIgUk9PVF9FTEVNRU5UX1NFTEVDVE9SID0gJy4nICsg
Uk9PVF9FTEVNRU5UX0NMQVNTOworCisgIC8qKgorICAgIGBFbWJlci5FdmVudERpc3BhdGNoZXJg
IGhhbmRsZXMgZGVsZWdhdGluZyBicm93c2VyIGV2ZW50cyB0byB0aGVpcgorICAgIGNvcnJlc3Bv
bmRpbmcgYEVtYmVyLlZpZXdzLmAgRm9yIGV4YW1wbGUsIHdoZW4geW91IGNsaWNrIG9uIGEgdmll
dywKKyAgICBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBlbnN1cmVzIHRoYXQgdGhhdCB2aWV3J3Mg
YG1vdXNlRG93bmAgbWV0aG9kIGdldHMKKyAgICBjYWxsZWQuCisgIAorICAgIEBjbGFzcyBFdmVu
dERpc3BhdGNoZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHByaXZhdGUKKyAgICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisKKyAgICAvKioKKyAgICAgIFRoZSBzZXQg
b2YgZXZlbnRzIG5hbWVzIChhbmQgYXNzb2NpYXRlZCBoYW5kbGVyIGZ1bmN0aW9uIG5hbWVzKSB0
byBiZSBzZXR1cAorICAgICAgYW5kIGRpc3BhdGNoZWQgYnkgdGhlIGBFdmVudERpc3BhdGNoZXJg
LiBNb2RpZmljYXRpb25zIHRvIHRoaXMgbGlzdCBjYW4gYmUgZG9uZQorICAgICAgYXQgc2V0dXAg
dGltZSwgZ2VuZXJhbGx5IHZpYSB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uLmN1c3RvbUV2ZW50c2Ag
aGFzaC4KKyAgICAgICBUbyBhZGQgbmV3IGV2ZW50cyB0byBiZSBsaXN0ZW5lZCB0bzoKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRl
KHsKKyAgICAgICAgY3VzdG9tRXZlbnRzOiB7CisgICAgICAgICAgcGFzdGU6ICdwYXN0ZScKKyAg
ICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUbyBwcmV2ZW50IGRlZmF1bHQg
ZXZlbnRzIGZyb20gYmVpbmcgbGlzdGVuZWQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7CisgICAgICAgIGN1c3RvbUV2
ZW50czogeworICAgICAgICAgIG1vdXNlZW50ZXI6IG51bGwsCisgICAgICAgICAgbW91c2VsZWF2
ZTogbnVsbAorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgQHByb3BlcnR5
IGV2ZW50cworICAgICAgQHR5cGUgT2JqZWN0CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAg
ZXZlbnRzOiB7CisgICAgICB0b3VjaHN0YXJ0OiAndG91Y2hTdGFydCcsCisgICAgICB0b3VjaG1v
dmU6ICd0b3VjaE1vdmUnLAorICAgICAgdG91Y2hlbmQ6ICd0b3VjaEVuZCcsCisgICAgICB0b3Vj
aGNhbmNlbDogJ3RvdWNoQ2FuY2VsJywKKyAgICAgIGtleWRvd246ICdrZXlEb3duJywKKyAgICAg
IGtleXVwOiAna2V5VXAnLAorICAgICAga2V5cHJlc3M6ICdrZXlQcmVzcycsCisgICAgICBtb3Vz
ZWRvd246ICdtb3VzZURvd24nLAorICAgICAgbW91c2V1cDogJ21vdXNlVXAnLAorICAgICAgY29u
dGV4dG1lbnU6ICdjb250ZXh0TWVudScsCisgICAgICBjbGljazogJ2NsaWNrJywKKyAgICAgIGRi
bGNsaWNrOiAnZG91YmxlQ2xpY2snLAorICAgICAgbW91c2Vtb3ZlOiAnbW91c2VNb3ZlJywKKyAg
ICAgIGZvY3VzaW46ICdmb2N1c0luJywKKyAgICAgIGZvY3Vzb3V0OiAnZm9jdXNPdXQnLAorICAg
ICAgbW91c2VlbnRlcjogJ21vdXNlRW50ZXInLAorICAgICAgbW91c2VsZWF2ZTogJ21vdXNlTGVh
dmUnLAorICAgICAgc3VibWl0OiAnc3VibWl0JywKKyAgICAgIGlucHV0OiAnaW5wdXQnLAorICAg
ICAgY2hhbmdlOiAnY2hhbmdlJywKKyAgICAgIGRyYWdzdGFydDogJ2RyYWdTdGFydCcsCisgICAg
ICBkcmFnOiAnZHJhZycsCisgICAgICBkcmFnZW50ZXI6ICdkcmFnRW50ZXInLAorICAgICAgZHJh
Z2xlYXZlOiAnZHJhZ0xlYXZlJywKKyAgICAgIGRyYWdvdmVyOiAnZHJhZ092ZXInLAorICAgICAg
ZHJvcDogJ2Ryb3AnLAorICAgICAgZHJhZ2VuZDogJ2RyYWdFbmQnCisgICAgfSwKKworICAgIC8q
KgorICAgICAgVGhlIHJvb3QgRE9NIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNo
b3VsZCBiZSBhdHRhY2hlZC4gRXZlbnQKKyAgICAgIGxpc3RlbmVycyB3aWxsIGJlIGF0dGFjaGVk
IHRvIHRoZSBkb2N1bWVudCB1bmxlc3MgdGhpcyBpcyBvdmVycmlkZGVuLgorICAgICAgIENhbiBi
ZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgorICAgICAg
IFRoZSBkZWZhdWx0IGJvZHkgaXMgYSBzdHJpbmcgc2luY2UgdGhpcyBtYXkgYmUgZXZhbHVhdGVk
IGJlZm9yZSBkb2N1bWVudC5ib2R5CisgICAgICBleGlzdHMgaW4gdGhlIERPTS4KKyAgICAgICBA
cHJpdmF0ZQorICAgICAgQHByb3BlcnR5IHJvb3RFbGVtZW50CisgICAgICBAdHlwZSBET01FbGVt
ZW50CisgICAgICBAZGVmYXVsdCAnYm9keScKKyAgICAqLworICAgIHJvb3RFbGVtZW50OiAnYm9k
eScsCisKKyAgICAvKioKKyAgICAgIEl0IGVuYWJsZXMgZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQg
dG8gdGhlIHZpZXcncyBgZXZlbnRNYW5hZ2VyLmAgV2hlbiBwcmVzZW50LAorICAgICAgdGhpcyBv
YmplY3QgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGhhbmRsaW5nIG9mIGV2ZW50cyBvbiB0aGUgdmll
dyBpdHNlbGYuCisgICAgICAgTm90ZSB0aGF0IG1vc3QgRW1iZXIgYXBwbGljYXRpb25zIGRvIG5v
dCB1c2UgdGhpcyBmZWF0dXJlLiBJZiB5b3VyIGFwcCBhbHNvCisgICAgICBkb2VzIG5vdCB1c2Ug
aXQsIGNvbnNpZGVyIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBnYWluIHNvbWUg
cGVyZm9ybWFuY2UKKyAgICAgIGltcHJvdmVtZW50IGJ5IGFsbG93aW5nIHRoZSBFdmVudERpc3Bh
dGNoZXIgdG8gc2tpcCB0aGUgc2VhcmNoIGZvciB0aGUKKyAgICAgIGBldmVudE1hbmFnZXJgIG9u
IHRoZSB2aWV3IHRyZWUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEV2ZW50RGlz
cGF0Y2hlciA9IEVtLkV2ZW50RGlzcGF0Y2hlci5leHRlbmQoeworICAgICAgICBldmVudHM6IHsK
KyAgICAgICAgICAgIGNsaWNrICAgICAgIDogJ2NsaWNrJywKKyAgICAgICAgICAgIGZvY3VzaW4g
ICAgIDogJ2ZvY3VzSW4nLAorICAgICAgICAgICAgZm9jdXNvdXQgICAgOiAnZm9jdXNPdXQnLAor
ICAgICAgICAgICAgY2hhbmdlICAgICAgOiAnY2hhbmdlJworICAgICAgICB9LAorICAgICAgICBj
YW5EaXNwYXRjaFRvRXZlbnRNYW5hZ2VyOiBmYWxzZQorICAgICAgfSk7CisgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFpbicsIEV2ZW50RGlzcGF0Y2hlcik7Cisg
ICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgY2FuRGlzcGF0Y2hUb0V2ZW50TWFuYWdlcgorICAg
ICAgQHR5cGUgYm9vbGVhbgorICAgICAgQGRlZmF1bHQgJ3RydWUnCisgICAgICBAc2luY2UgMS43
LjAKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBjYW5EaXNwYXRjaFRvRXZlbnRNYW5hZ2Vy
OiB0cnVlLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIoKTsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdFdmVudERpc3BhdGNoZXIgc2hvdWxkIG5l
dmVyIGJlIGluc3RhbnRpYXRlZCBpbiBmYXN0Ym9vdCBtb2RlLiBQbGVhc2UgcmVwb3J0IHRoaXMg
YXMgYW4gRW1iZXIgYnVnLicsIF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5oYXNET00p
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBz
dGFuZGFyZCBicm93c2VyIGV2ZW50cy4KKyAgICAgICBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVy
IHRoZSBicm93c2VyIHNlbmRzIGEgYERPTUNvbnRlbnRSZWFkeWAgZXZlbnQuIEJ5CisgICAgICBk
ZWZhdWx0LCBpdCB3aWxsIHNldCB1cCBhbGwgb2YgdGhlIGxpc3RlbmVycyBvbiB0aGUgZG9jdW1l
bnQgYm9keS4gSWYgeW91CisgICAgICB3b3VsZCBsaWtlIHRvIHJlZ2lzdGVyIHRoZSBsaXN0ZW5l
cnMgb24gYSBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoZSBldmVudAorICAgICAgZGlzcGF0Y2hl
cidzIGByb290YCBwcm9wZXJ0eS4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBzZXR1
cAorICAgICAgQHBhcmFtIGFkZGVkRXZlbnRzIHtPYmplY3R9CisgICAgKi8KKyAgICBzZXR1cDog
ZnVuY3Rpb24gKGFkZGVkRXZlbnRzLCByb290RWxlbWVudCkgeworICAgICAgdmFyIGV2ZW50Owor
ICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2ZpbmFsRXZlbnRzID0gX2VtYmVyTWV0YWxBc3NpZ24u
ZGVmYXVsdCh7fSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdldmVudHMnKSwg
YWRkZWRFdmVudHMpOworCisgICAgICBpZiAoIV9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KHJv
b3RFbGVtZW50KSkgeworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywg
J3Jvb3RFbGVtZW50Jywgcm9vdEVsZW1lbnQpOworICAgICAgfQorCisgICAgICByb290RWxlbWVu
dCA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdyb290RWxlbWVudCcpKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ1lvdSBjYW5ub3QgdXNlIHRoZSBzYW1lIHJvb3QgZWxlbWVudCAoJyArIChyb290RWxl
bWVudC5zZWxlY3RvciB8fCByb290RWxlbWVudFswXS50YWdOYW1lKSArICcpIG11bHRpcGxlIHRp
bWVzIGluIGFuIEVtYmVyLkFwcGxpY2F0aW9uJywgIXJvb3RFbGVtZW50LmlzKFJPT1RfRUxFTUVO
VF9TRUxFQ1RPUikpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW5ub3Qg
bWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlz
IGEgZGVzY2VuZGVudCBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxl
bWVudC5jbG9zZXN0KFJPT1RfRUxFTUVOVF9TRUxFQ1RPUikubGVuZ3RoKTsKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcgRW1iZXIuQXBwbGljYXRp
b24gdXNpbmcgYSByb290IGVsZW1lbnQgdGhhdCBpcyBhbiBhbmNlc3RvciBvZiBhbiBleGlzdGlu
ZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxlbWVudC5maW5kKFJPT1RfRUxFTUVOVF9TRUxF
Q1RPUikubGVuZ3RoKTsKKworICAgICAgcm9vdEVsZW1lbnQuYWRkQ2xhc3MoUk9PVF9FTEVNRU5U
X0NMQVNTKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1VuYWJsZSB0byBhZGQg
XCcnICsgUk9PVF9FTEVNRU5UX0NMQVNTICsgJ1wnIGNsYXNzIHRvIHJvb3RFbGVtZW50LiBNYWtl
IHN1cmUgeW91IHNldCByb290RWxlbWVudCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50IGluIHRo
ZSBib2R5LicsIHJvb3RFbGVtZW50LmlzKFJPT1RfRUxFTUVOVF9TRUxFQ1RPUikpOworCisgICAg
ICBmb3IgKGV2ZW50IGluIGV2ZW50cykgeworICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3Bl
cnR5KGV2ZW50KSkgeworICAgICAgICAgIHRoaXMuc2V0dXBIYW5kbGVyKHJvb3RFbGVtZW50LCBl
dmVudCwgZXZlbnRzW2V2ZW50XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAg
LyoqCisgICAgICBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIHJvb3RFbGVtZW50
LiBJZiB0aGUgZ2l2ZW4gZXZlbnQgaXMKKyAgICAgIHRyaWdnZXJlZCwgdGhlIHByb3ZpZGVkIGV2
ZW50IGhhbmRsZXIgd2lsbCBiZSB0cmlnZ2VyZWQgb24gdGhlIHRhcmdldCB2aWV3LgorICAgICAg
IElmIHRoZSB0YXJnZXQgdmlldyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGV2ZW50IGhhbmRsZXIs
IG9yIGlmIHRoZSBoYW5kbGVyCisgICAgICByZXR1cm5zIGBmYWxzZWAsIHRoZSBwYXJlbnQgdmll
dyB3aWxsIGJlIGNhbGxlZC4gVGhlIGV2ZW50IHdpbGwgY29udGludWUgdG8KKyAgICAgIGJ1YmJs
ZSB0byBlYWNoIHN1Y2Nlc3NpdmUgcGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0aGUgdG9w
LgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHNldHVwSGFuZGxlcgorICAgICAgQHBh
cmFtIHtFbGVtZW50fSByb290RWxlbWVudAorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50IHRo
ZSBicm93c2VyLW9yaWdpbmF0ZWQgZXZlbnQgdG8gbGlzdGVuIHRvCisgICAgICBAcGFyYW0ge1N0
cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdmll
dworICAgICovCisgICAgc2V0dXBIYW5kbGVyOiBmdW5jdGlvbiAocm9vdEVsZW1lbnQsIGV2ZW50
LCBldmVudE5hbWUpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKworICAgICAgdmFyIG93bmVy
ID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworICAgICAgdmFyIHZpZXdSZWdpc3Ry
eSA9IG93bmVyICYmIG93bmVyLmxvb2t1cCgnLXZpZXctcmVnaXN0cnk6bWFpbicpIHx8IF9lbWJl
clZpZXdzVmlld3NWaWV3LmRlZmF1bHQudmlld3M7CisKKyAgICAgIGlmIChldmVudE5hbWUgPT09
IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICByb290RWxlbWVudC5v
bihldmVudCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcnLCBmdW5jdGlvbiAoZXZ0LCB0cmlnZ2Vy
aW5nTWFuYWdlcikgeworICAgICAgICB2YXIgdmlldyA9IHZpZXdSZWdpc3RyeVt0aGlzLmlkXTsK
KyAgICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgdmFyIG1hbmFnZXIgPSBzZWxm
LmNhbkRpc3BhdGNoVG9FdmVudE1hbmFnZXIgPyBzZWxmLl9maW5kTmVhcmVzdEV2ZW50TWFuYWdl
cih2aWV3LCBldmVudE5hbWUpIDogbnVsbDsKKworICAgICAgICBpZiAobWFuYWdlciAmJiBtYW5h
Z2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikgeworICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2Rp
c3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcpOworICAgICAgICB9IGVs
c2UgaWYgKHZpZXcpIHsKKyAgICAgICAgICByZXN1bHQgPSBzZWxmLl9idWJibGVFdmVudCh2aWV3
LCBldnQsIGV2ZW50TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgICAgfSk7CisKKyAgICAgIHJvb3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJlcicsICdbZGF0
YS1lbWJlci1hY3Rpb25dJywgZnVuY3Rpb24gKGV2dCkgeworICAgICAgICB2YXIgYWN0aW9uSWQg
PSBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRy
KCdkYXRhLWVtYmVyLWFjdGlvbicpOworICAgICAgICB2YXIgYWN0aW9ucyA9IF9lbWJlclZpZXdz
U3lzdGVtQWN0aW9uX21hbmFnZXIuZGVmYXVsdC5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07
CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgYWN0aW9ucyBoZXJlIHNpbmNlIGlu
IHNvbWUgY2FzZXMsIGpRdWVyeSB3aWxsIHRyaWdnZXIKKyAgICAgICAgLy8gYW4gZXZlbnQgb24g
YHJlbW92ZUNoaWxkYCAoaS5lLiBmb2N1c291dCkgYWZ0ZXIgd2UndmUgYWxyZWFkeSB0b3JuIGRv
d24gdGhlCisgICAgICAgIC8vIGFjdGlvbiBoYW5kbGVycyBmb3IgdGhlIHZpZXcuCisgICAgICAg
IGlmICghYWN0aW9ucykgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAg
IGZvciAodmFyIGluZGV4ID0gMCwgX2xlbmd0aCA9IGFjdGlvbnMubGVuZ3RoOyBpbmRleCA8IF9s
ZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpbmRleF07
CisKKyAgICAgICAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5ldmVudE5hbWUgPT09IGV2ZW50TmFt
ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5oYW5kbGVyKGV2dCk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9LAorCisgICAgX2ZpbmROZWFyZXN0RXZlbnRN
YW5hZ2VyOiBmdW5jdGlvbiAodmlldywgZXZlbnROYW1lKSB7CisgICAgICB2YXIgbWFuYWdlciA9
IG51bGw7CisKKyAgICAgIHdoaWxlICh2aWV3KSB7CisgICAgICAgIG1hbmFnZXIgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ2V2ZW50TWFuYWdlcicpOworICAgICAgICBpZiAo
bWFuYWdlciAmJiBtYW5hZ2VyW2V2ZW50TmFtZV0pIHsKKyAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorCisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywg
J3BhcmVudFZpZXcnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1hbmFnZXI7CisgICAgfSwK
KworICAgIF9kaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAob2JqZWN0LCBldnQsIGV2ZW50TmFtZSwg
dmlldykgeworICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICAgIHZhciBoYW5kbGVyID0g
b2JqZWN0W2V2ZW50TmFtZV07CisgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlv
bicpIHsKKyAgICAgICAgcmVzdWx0ID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KG9iamVj
dCwgaGFuZGxlciwgZXZ0LCB2aWV3KTsKKyAgICAgICAgLy8gRG8gbm90IHByZXZlbnREZWZhdWx0
IGluIGV2ZW50TWFuYWdlcnMuCisgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2J1YmJsZUV2ZW50KHZpZXcsIGV2dCwg
ZXZlbnROYW1lKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisg
ICAgX2J1YmJsZUV2ZW50OiBmdW5jdGlvbiAodmlldywgZXZ0LCBldmVudE5hbWUpIHsKKyAgICAg
IHJldHVybiB2aWV3LmhhbmRsZUV2ZW50KGV2ZW50TmFtZSwgZXZ0KTsKKyAgICB9LAorCisgICAg
ZGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJvb3RFbGVtZW50ID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290RWxlbWVudCcpOworICAgICAgX2VtYmVyVmll
d3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChyb290RWxlbWVudCkub2ZmKCcuZW1iZXInLCAnKionKS5y
ZW1vdmVDbGFzcyhST09UX0VMRU1FTlRfQ0xBU1MpOworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVy
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlv
biAoKSB7CisgICAgICByZXR1cm4gJyhFdmVudERpc3BhdGNoZXIpJzsKKyAgICB9CisgIH0pOwor
fSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N5c3RlbS9leHQnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
bWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUnVuX2xvb3Ap
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBBZGQgYSBuZXcgbmFtZWQgcXVldWUgZm9yIHJl
bmRlcmluZyB2aWV3cyB0aGF0IGhhcHBlbnMKKyAgLy8gYWZ0ZXIgYmluZGluZ3MgaGF2ZSBzeW5j
ZWQsIGFuZCBhIHF1ZXVlIGZvciBzY2hlZHVsaW5nIGFjdGlvbnMKKyAgLy8gdGhhdCBzaG91bGQg
b2NjdXIgYWZ0ZXIgdmlldyByZW5kZXJpbmcuCisgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVs
dC5fYWRkUXVldWUoJ3JlbmRlcicsICdhY3Rpb25zJyk7CisgIF9lbWJlck1ldGFsUnVuX2xvb3Au
ZGVmYXVsdC5fYWRkUXVldWUoJ2FmdGVyUmVuZGVyJywgJ3JlbmRlcicpOworfSk7CitlbmlmZWQo
J2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29y
ZScsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWxDb3JlLCBfZW1iZXJNZXRhbEVudmlyb25tZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICB2YXIgalF1ZXJ5OworCisgIGlmIChfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQuaGFz
RE9NKSB7CisgICAgLy8gbWFpbkNvbnRleHQgaXMgc2V0IGluIGBwYWNrYWdlL2xvYWRlci9saWIv
bWFpbi5qc2AgdG8gdGhlIGB0aGlzYCBjb250ZXh0IGJlZm9yZSBlbnRlcmluZyBzdHJpY3QgbW9k
ZQorICAgIGpRdWVyeSA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMgJiYgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaW1wb3J0cy5qUXVlcnkgfHwgbWFpbkNvbnRleHQgJiYgbWFpbkNv
bnRleHQualF1ZXJ5OyAvL2pzaGludCBpZ25vcmU6bGluZQorICAgIGlmICghalF1ZXJ5ICYmIHR5
cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICBqUXVlcnkgPSByZXF1aXJlKCdq
cXVlcnknKTsKKyAgICB9CisKKyAgICBpZiAoalF1ZXJ5KSB7CisgICAgICAvLyBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9kbmQuaHRt
bCNkbmRldmVudHMKKyAgICAgIHZhciBkcmFnRXZlbnRzID0gWydkcmFnc3RhcnQnLCAnZHJhZycs
ICdkcmFnZW50ZXInLCAnZHJhZ2xlYXZlJywgJ2RyYWdvdmVyJywgJ2Ryb3AnLCAnZHJhZ2VuZCdd
OworCisgICAgICAvLyBDb3BpZXMgdGhlIGBkYXRhVHJhbnNmZXJgIHByb3BlcnR5IGZyb20gYSBi
cm93c2VyIGV2ZW50IG9iamVjdCBvbnRvIHRoZQorICAgICAgLy8galF1ZXJ5IGV2ZW50IG9iamVj
dCBmb3IgdGhlIHNwZWNpZmllZCBldmVudHMKKyAgICAgIGRyYWdFdmVudHMuZm9yRWFjaChmdW5j
dGlvbiAoZXZlbnROYW1lKSB7CisgICAgICAgIGpRdWVyeS5ldmVudC5maXhIb29rc1tldmVudE5h
bWVdID0geworICAgICAgICAgIHByb3BzOiBbJ2RhdGFUcmFuc2ZlciddCisgICAgICAgIH07Cisg
ICAgICB9KTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBqUXVlcnk7Cit9KTsK
KworLy8gRVM2VE9ETzogdGhlIGZ1bmN0aW9ucyBvbiBFbnVtZXJhYmxlVXRpbHMgbmVlZCB0aGVp
ciBvd24gZXhwb3J0cworZW5pZmVkKCdlbWJlci12aWV3cy9zeXN0ZW0vbG9va3VwX3BhcnRpYWwn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZXJyb3InXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRXJyb3IpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGxvb2t1cFBhcnRpYWw7CisK
KyAgZnVuY3Rpb24gbG9va3VwUGFydGlhbChlbnYsIHRlbXBsYXRlTmFtZSkgeworICAgIGlmICh0
ZW1wbGF0ZU5hbWUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBu
YW1lUGFydHMgPSB0ZW1wbGF0ZU5hbWUuc3BsaXQoJy8nKTsKKyAgICB2YXIgbGFzdFBhcnQgPSBu
YW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0aCAtIDFdOworCisgICAgbmFtZVBhcnRzW25hbWVQYXJ0
cy5sZW5ndGggLSAxXSA9ICdfJyArIGxhc3RQYXJ0OworCisgICAgdmFyIHVuZGVyc2NvcmVkTmFt
ZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CisgICAgdmFyIHRlbXBsYXRlID0gdGVtcGxhdGVGb3Io
ZW52LCB1bmRlcnNjb3JlZE5hbWUsIHRlbXBsYXRlTmFtZSk7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnVW5hYmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgIicgKyB0ZW1wbGF0
ZU5hbWUgKyAnIicsICEhdGVtcGxhdGUpOworCisgICAgcmV0dXJuIHRlbXBsYXRlOworICB9CisK
KyAgZnVuY3Rpb24gdGVtcGxhdGVGb3IoZW52LCB1bmRlcnNjb3JlZCwgbmFtZSkgeworICAgIGlm
ICghbmFtZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgndGVtcGxhdGVOYW1lcyBhcmUgbm90IGFsbG93ZWQgdG8gY29udGFpbiBwZXJpb2RzOiAn
ICsgbmFtZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKKworICAgIGlmICghZW52Lm93bmVy
KSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDb250YWluZXIg
d2FzIG5vdCBmb3VuZCB3aGVuIGxvb2tpbmcgdXAgYSB2aWV3cyB0ZW1wbGF0ZS4gJyArICdUaGlz
IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byBtYW51YWxseSBpbnN0YW50aWF0aW5nIGFuIEVtYmVyLlZp
ZXcuICcgKyAnU2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQScpOworICAgIH0KKworICAgIHJldHVy
biBlbnYub3duZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgdW5kZXJzY29yZWQpIHx8IGVudi5vd25l
ci5sb29rdXAoJ3RlbXBsYXRlOicgKyBuYW1lKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZp
ZXdzL3N5c3RlbS9wbGF0Zm9ybScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVu
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCkgeworICAndXNl
IHN0cmljdCc7CisKKyAgLy8gSUUgNi83IGhhdmUgYnVncyBhcm91bmQgc2V0dGluZyBuYW1lcyBv
biBpbnB1dHMgZHVyaW5nIGNyZWF0aW9uLgorICAvLyBGcm9tIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9pZS9tczUzNjM4OSh2PXZzLjg1KS5hc3B4OgorICAvLyAiVG8g
aW5jbHVkZSB0aGUgTkFNRSBhdHRyaWJ1dGUgYXQgcnVuIHRpbWUgb24gb2JqZWN0cyBjcmVhdGVk
IHdpdGggdGhlIGNyZWF0ZUVsZW1lbnQgbWV0aG9kLCB1c2UgdGhlIGVUYWcuIgorICB2YXIgY2Fu
U2V0TmFtZU9uSW5wdXRzID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTSAm
JiAoZnVuY3Rpb24gKCkgeworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKTsKKyAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworCisg
ICAgZWwuc2V0QXR0cmlidXRlKCduYW1lJywgJ2ZvbycpOworICAgIGRpdi5hcHBlbmRDaGlsZChl
bCk7CisKKyAgICByZXR1cm4gISFkaXYuaW5uZXJIVE1MLm1hdGNoKCdmb28nKTsKKyAgfSkoKTsK
KyAgZXhwb3J0cy5jYW5TZXROYW1lT25JbnB1dHMgPSBjYW5TZXROYW1lT25JbnB1dHM7Cit9KTsK
K2VuaWZlZCgiZW1iZXItdmlld3Mvc3lzdGVtL3V0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9u
IChleHBvcnRzKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5pc1NpbXBsZUNsaWNr
ID0gaXNTaW1wbGVDbGljazsKKyAgZXhwb3J0cy5nZXRWaWV3Q2xpZW50UmVjdHMgPSBnZXRWaWV3
Q2xpZW50UmVjdHM7CisgIGV4cG9ydHMuZ2V0Vmlld0JvdW5kaW5nQ2xpZW50UmVjdCA9IGdldFZp
ZXdCb3VuZGluZ0NsaWVudFJlY3Q7CisKKyAgZnVuY3Rpb24gaXNTaW1wbGVDbGljayhldmVudCkg
eworICAgIHZhciBtb2RpZmllciA9IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwg
ZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXk7CisgICAgdmFyIHNlY29uZGFyeUNsaWNrID0g
ZXZlbnQud2hpY2ggPiAxOyAvLyBJRTkgbWF5IHJldHVybiB1bmRlZmluZWQKKworICAgIHJldHVy
biAhbW9kaWZpZXIgJiYgIXNlY29uZGFyeUNsaWNrOworICB9CisKKyAgLyoqCisgICAgQHByaXZh
dGUKKyAgICBAbWV0aG9kIGdldFZpZXdSYW5nZQorICAgIEBwYXJhbSB7RW1iZXIuVmlld30gdmll
dworICAqLworICBmdW5jdGlvbiBnZXRWaWV3UmFuZ2UodmlldykgeworICAgIHZhciByYW5nZSA9
IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUodmlldy5f
cmVuZGVyTm9kZS5maXJzdE5vZGUpOworICAgIHJhbmdlLnNldEVuZEFmdGVyKHZpZXcuX3JlbmRl
ck5vZGUubGFzdE5vZGUpOworICAgIHJldHVybiByYW5nZTsKKyAgfQorCisgIC8qKgorICAgIGBn
ZXRWaWV3Q2xpZW50UmVjdHNgIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3NpdGlv
biBvZiB0aGUgYm9yZGVyCisgICAgYm94IGVkZ2VzIG9mIGEgdmlldyByZWxhdGl2ZSB0byB0aGUg
dmlld3BvcnQuCisgIAorICAgIEl0IGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBkZXZl
bG9wbWVudCB0b29scyBsaWtlIHRoZSBFbWJlciBJbnNwZWN0b3IKKyAgICBhbmQgbWF5IG5vdCB3
b3JrIG9uIG9sZGVyIGJyb3dzZXJzLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZ2V0
Vmlld0NsaWVudFJlY3RzCisgICAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3CisgICovCisKKyAg
ZnVuY3Rpb24gZ2V0Vmlld0NsaWVudFJlY3RzKHZpZXcpIHsKKyAgICB2YXIgcmFuZ2UgPSBnZXRW
aWV3UmFuZ2Uodmlldyk7CisgICAgcmV0dXJuIHJhbmdlLmdldENsaWVudFJlY3RzKCk7CisgIH0K
KworICAvKioKKyAgICBgZ2V0Vmlld0JvdW5kaW5nQ2xpZW50UmVjdGAgcHJvdmlkZXMgaW5mb3Jt
YXRpb24gYWJvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgIGJvdW5kaW5nIGJvcmRlciBib3gg
ZWRnZXMgb2YgYSB2aWV3IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgCisgICAgSXQgaXMg
b25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGRldmVsb3BtZW50IHRvb2xzIGxpa2UgdGhlIEVt
YmVyIElucHNlY3RvcgorICAgIGFuZCBtYXkgbm90IHdvcmsgb24gb2xkZXIgYnJvd3NlcnMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBnZXRWaWV3Qm91bmRpbmdDbGllbnRSZWN0Cisg
ICAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3CisgICovCisKKyAgZnVuY3Rpb24gZ2V0Vmlld0Jv
dW5kaW5nQ2xpZW50UmVjdCh2aWV3KSB7CisgICAgdmFyIHJhbmdlID0gZ2V0Vmlld1JhbmdlKHZp
ZXcpOworICAgIHJldHVybiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3ZpZXdzL2NoZWNrYm94JywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXIt
dmlld3MvY29tcG9uZW50cy9jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyVmlld3NDb21w
b25lbnRzQ29tcG9uZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgLyoqCisgICAgVGhlIGlu
dGVybmFsIGNsYXNzIHVzZWQgdG8gY3JlYXRlIHRleHQgaW5wdXRzIHdoZW4gdGhlIGB7e2lucHV0
fX1gCisgICAgaGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2YgYGNoZWNrYm94YC4KKyAgCisg
ICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVycy5pbnB1dF0oL2FwaS9jbGFzc2VzL0VtYmVy
LlRlbXBsYXRlcy5oZWxwZXJzLmh0bWwjbWV0aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRldGFpbHMu
CisgIAorICAgICMjIERpcmVjdCBtYW5pcHVsYXRpb24gb2YgYGNoZWNrZWRgCisgIAorICAgIFRo
ZSBgY2hlY2tlZGAgYXR0cmlidXRlIG9mIGFuIGBFbWJlci5DaGVja2JveGAgb2JqZWN0IHNob3Vs
ZCBhbHdheXMgYmUgc2V0CisgICAgdGhyb3VnaCB0aGUgRW1iZXIgb2JqZWN0IG9yIGJ5IGludGVy
YWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKKyAgICByZXByZXNlbnRhdGlvbiB2aWEg
dGhlIG1vdXNlLCBrZXlib2FyZCwgb3IgdG91Y2guIFVwZGF0aW5nIHRoZSB2YWx1ZSBvZiB0aGUK
KyAgICBjaGVja2JveCB2aWEgalF1ZXJ5IHdpbGwgcmVzdWx0IGluIHRoZSBjaGVja2VkIHZhbHVl
IG9mIHRoZSBvYmplY3QgYW5kIGl0cworICAgIGVsZW1lbnQgbG9zaW5nIHN5bmNocm9uaXphdGlv
bi4KKyAgCisgICAgIyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMKKyAgCisgICAg
QmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBh
bmQgYGxheW91dE5hbWVgCisgICAgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUg
W0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwpJ3MKKyAgICBsYXlvdXQg
c2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgCisgICAgQGNsYXNzIENoZWNrYm94Cisg
ICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEBw
dWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyVmlld3NDb21wb25lbnRzQ29t
cG9uZW50LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbnN0cnVtZW50RGlzcGxheTogJ3t7aW5wdXQg
dHlwZT0iY2hlY2tib3gifX0nLAorCisgICAgY2xhc3NOYW1lczogWydlbWJlci1jaGVja2JveCdd
LAorCisgICAgdGFnTmFtZTogJ2lucHV0JywKKworICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5
cGUnLCAnY2hlY2tlZCcsICdpbmRldGVybWluYXRlJywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4Jywg
J25hbWUnLCAnYXV0b2ZvY3VzJywgJ3JlcXVpcmVkJywgJ2Zvcm0nXSwKKworICAgIHR5cGU6ICdj
aGVja2JveCcsCisgICAgY2hlY2tlZDogZmFsc2UsCisgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAg
IGluZGV0ZXJtaW5hdGU6IGZhbHNlLAorCisgICAgZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rpb24g
KCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnZWxlbWVudCcpLmluZGV0ZXJtaW5hdGUg
PSAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaW5kZXRlcm1pbmF0ZScpOwor
ICAgIH0sCisKKyAgICBjaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCAnY2hlY2tlZCcsIHRoaXMuJCgpLnByb3AoJ2NoZWNrZWQnKSk7
CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy92aWV3cy9jb3JlX3ZpZXcn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50aW1lL21peGlu
cy9ldmVudGVkJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FjdGlvbl9oYW5kbGVyJywgJ2VtYmVy
LXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItbWV0YWwtdmlld3MnLCAnZW1iZXItdmlld3Mvdmlld3Mv
c3RhdGVzJywgJ2h0bWxiYXJzLXJ1bnRpbWUnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1bnRp
bWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLCBfZW1iZXJSdW50aW1l
TWl4aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVVdGlscywgX2VtYmVyTWV0YWxWaWV3
cywgX2VtYmVyVmlld3NWaWV3c1N0YXRlcywgX2h0bWxiYXJzUnVudGltZSwgX3JlcXVpcmUpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIE5vcm1hbGx5LCB0aGUgcmVuZGVyZXIgaXMgaW5qZWN0
ZWQgYnkgdGhlIGNvbnRhaW5lciB3aGVuIHRoZSB2aWV3IGlzIGxvb2tlZAorICAvLyB1cC4gSG93
ZXZlciwgaWYgc29tZW9uZSBjcmVhdGVzIGEgdmlldyB3aXRob3V0IGxvb2tpbmcgaXQgdXAgdmlh
IHRoZQorICAvLyBjb250YWluZXIgKGUuZy4gYEVtYmVyLlZpZXcuY3JlYXRlKCkuYXBwZW5kKClg
KSB0aGVuIHdlIGNyZWF0ZSBhIGZhbGxiYWNrCisgIC8vIERPTSByZW5kZXJlciB0aGF0IGlzIHNo
YXJlZC4gSW4gZ2VuZXJhbCwgdGhpcyBwYXRoIHNob3VsZCBiZSBhdm9pZGVkIHNpbmNlCisgIC8v
IHZpZXdzIGNyZWF0ZWQgdGhpcyB3YXkgY2Fubm90IHJ1biBpbiBhIG5vZGUgZW52aXJvbm1lbnQu
CisgIHZhciByZW5kZXJlcjsKKworICAvKioKKyAgICBgRW1iZXIuQ29yZVZpZXdgIGlzIGFuIGFi
c3RyYWN0IGNsYXNzIHRoYXQgZXhpc3RzIHRvIGdpdmUgdmlldy1saWtlIGJlaGF2aW9yCisgICAg
dG8gYm90aCBFbWJlcidzIG1haW4gdmlldyBjbGFzcyBgRW1iZXIuVmlld2AgYW5kIG90aGVyIGNs
YXNzZXMgdGhhdCBkb24ndCBuZWVkCisgICAgdGhlIGZ1bGx5IGZ1bmN0aW9uYWx0aXkgb2YgYEVt
YmVyLlZpZXdgLgorICAKKyAgICBVbmxlc3MgeW91IGhhdmUgc3BlY2lmaWMgbmVlZHMgZm9yIGBD
b3JlVmlld2AsIHlvdSB3aWxsIHVzZSBgRW1iZXIuVmlld2AKKyAgICBpbiB5b3VyIGFwcGxpY2F0
aW9ucy4KKyAgCisgICAgQGNsYXNzIENvcmVWaWV3CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAg
IEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBkZXByZWNhdGVkIFVzZSBgRW1iZXIuVmlld2Ag
aW5zdGVhZC4KKyAgICBAdXNlcyBFbWJlci5FdmVudGVkCisgICAgQHVzZXMgRW1iZXIuQWN0aW9u
SGFuZGxlcgorICAgIEBwcml2YXRlCisgICovCisgIHZhciBDb3JlVmlldyA9IF9lbWJlclJ1bnRp
bWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1peGluc0V2ZW50ZWQu
ZGVmYXVsdCwgX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9oYW5kbGVyLmRlZmF1bHQsIHsKKyAg
ICBpc1ZpZXc6IHRydWUsCisKKyAgICBfc3RhdGVzOiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzLmNs
b25lU3RhdGVzKF9lbWJlclZpZXdzVmlld3NTdGF0ZXMuc3RhdGVzKSwKKworICAgIGluaXQ6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cisg
ICAgICB0aGlzLl9zdGF0ZSA9ICdwcmVSZW5kZXInOworICAgICAgdGhpcy5fY3VycmVudFN0YXRl
ID0gdGhpcy5fc3RhdGVzLnByZVJlbmRlcjsKKyAgICAgIHRoaXMuX2lzVmlzaWJsZSA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIC8vIEZh
bGxiYWNrIGZvciBsZWdhY3kgY2FzZXMgd2hlcmUgdGhlIHZpZXcgd2FzIGNyZWF0ZWQgZGlyZWN0
bHkKKyAgICAgIC8vIHZpYSBgY3JlYXRlKClgIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCB0aGUg
Y29udGFpbmVyLgorICAgICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7CisgICAgICAgIHZhciBET01I
ZWxwZXIgPSBkb21IZWxwZXIoKTsKKyAgICAgICAgcmVuZGVyZXIgPSByZW5kZXJlciB8fCBfZW1i
ZXJNZXRhbFZpZXdzLkludGVyYWN0aXZlUmVuZGVyZXIuY3JlYXRlKHsgZG9tOiBuZXcgRE9NSGVs
cGVyKCkgfSk7CisgICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKKyAgICAgIH0KKwor
ICAgICAgdGhpcy5fZGVzdHJveWluZ1N1YnRyZWVGb3JWaWV3ID0gbnVsbDsKKyAgICAgIHRoaXMu
X2Rpc3BhdGNoaW5nID0gbnVsbDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBJZiB0aGUgdmll
dyBpcyBjdXJyZW50bHkgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIG9mIGEgcGFyZW50IHZpZXcsIHRo
aXMKKyAgICAgIHByb3BlcnR5IHdpbGwgcG9pbnQgdG8gdGhlIHBhcmVudCBvZiB0aGUgdmlldy4K
KyAgICAgICBAcHJvcGVydHkgcGFyZW50VmlldworICAgICAgQHR5cGUgRW1iZXIuVmlldworICAg
ICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHBhcmVudFZpZXc6
IG51bGwsCisKKyAgICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmlldycsCisKKyAgICBpbnN0cnVt
ZW50RGV0YWlsczogZnVuY3Rpb24gKGhhc2gpIHsKKyAgICAgIGhhc2gub2JqZWN0ID0gdGhpcy50
b1N0cmluZygpOworICAgICAgaGFzaC5jb250YWluZXJLZXkgPSB0aGlzLl9kZWJ1Z0NvbnRhaW5l
cktleTsKKyAgICAgIGhhc2gudmlldyA9IHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
T3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gYEVtYmVyLkV2ZW50ZWRgIHRv
CisgICAgICBhbHNvIGNhbGwgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgIEBt
ZXRob2QgdHJpZ2dlcgorICAgICAgQHBhcmFtIG5hbWUge1N0cmluZ30KKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgdmFyIG5hbWUgPSBhcmd1bWVudHNbMF07Cisg
ICAgICB2YXIgbWV0aG9kID0gdGhpc1tuYW1lXTsKKyAgICAgIGlmIChtZXRob2QpIHsKKyAgICAg
ICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgICAgIHZhciBhcmdzID0gbmV3
IEFycmF5KGxlbmd0aCAtIDEpOworICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICAgIH0KKyAgICB9
LAorCisgICAgaGFzOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRp
bWVVdGlscy50eXBlT2YodGhpc1tuYW1lXSkgPT09ICdmdW5jdGlvbicgfHwgdGhpcy5fc3VwZXIo
bmFtZSk7CisgICAgfSwKKworICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICgh
dGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9CisKKyAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZS5jbGVhbnVwKHRoaXMpOworCisgICAg
ICAvLyBJZiB0aGUgZGVzdHJveWluZ1N1YnRyZWVGb3JWaWV3IHByb3BlcnR5IGlzIG5vdCBzZXQg
YnV0IHdlIGhhdmUgYW4KKyAgICAgIC8vIGFzc29jaWF0ZWQgcmVuZGVyIG5vZGUsIGl0IG1lYW5z
IHRoaXMgdmlldyBpcyBiZWluZyBkZXN0cm95ZWQgZnJvbSB1c2VyCisgICAgICAvLyBjb2RlIGFu
ZCBub3QgdmlhIGEgY2hhbmdlIGluIHRoZSB0ZW1wbGF0aW5nIGxheWVyIChsaWtlIGFuIHt7aWZ9
fQorICAgICAgLy8gYmVjb21pbmcgZmFsc3ksIGZvciBleGFtcGxlKS4gIEluIHRoaXMgY2FzZSwg
aXQgaXMgb3VyIHJlc3BvbnNpYmlsaXR5IHRvCisgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbnkg
cmVuZGVyIG5vZGVzIGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MKKyAg
ICAgIC8vIGFyZSBjbGVhbmVkIHVwLgorICAgICAgaWYgKCF0aGlzLm93bmVyVmlldy5fZGVzdHJv
eWluZ1N1YnRyZWVGb3JWaWV3ICYmIHRoaXMuX3JlbmRlck5vZGUpIHsKKyAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0JVRzogUmVuZGVyIG5vZGUgZXhpc3RzIHdpdGhvdXQgY29uY29t
aXRhbnQgZW52LicsIHRoaXMub3duZXJWaWV3LmVudik7CisgICAgICAgIF9odG1sYmFyc1J1bnRp
bWUuaW50ZXJuYWwuY2xlYXJNb3JwaCh0aGlzLl9yZW5kZXJOb2RlLCB0aGlzLm93bmVyVmlldy5l
bnYsIHRydWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0pOwor
CisgIF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlci5kZXByZWNhdGVVbmRlcnNjb3Jl
QWN0aW9ucyhDb3JlVmlldyk7CisKKyAgQ29yZVZpZXcucmVvcGVuQ2xhc3MoeworICAgIGlzVmll
d0ZhY3Rvcnk6IHRydWUKKyAgfSk7CisKKyAgdmFyIF9kb21IZWxwZXI7CisgIGZ1bmN0aW9uIGRv
bUhlbHBlcigpIHsKKyAgICByZXR1cm4gX2RvbUhlbHBlciA9IF9kb21IZWxwZXIgfHwgX3JlcXVp
cmUuZGVmYXVsdCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxwZXInKS5kZWZhdWx0Owor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQ29yZVZpZXc7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dmlld3Mvdmlld3Mvc3RhdGVzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdl
bWJlci12aWV3cy92aWV3cy9zdGF0ZXMvZGVmYXVsdCcsICdlbWJlci12aWV3cy92aWV3cy9zdGF0
ZXMvcHJlX3JlbmRlcicsICdlbWJlci12aWV3cy92aWV3cy9zdGF0ZXMvaGFzX2VsZW1lbnQnLCAn
ZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2luX2RvbScsICdlbWJlci12aWV3cy92aWV3cy9zdGF0
ZXMvZGVzdHJveWluZyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9l
bWJlclZpZXdzVmlld3NTdGF0ZXNEZWZhdWx0LCBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzUHJlX3Jl
bmRlciwgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0hhc19lbGVtZW50LCBfZW1iZXJWaWV3c1ZpZXdz
U3RhdGVzSW5fZG9tLCBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVzdHJveWluZykgeworICAndXNl
IHN0cmljdCc7CisKKyAgZXhwb3J0cy5jbG9uZVN0YXRlcyA9IGNsb25lU3RhdGVzOworCisgIGZ1
bmN0aW9uIGNsb25lU3RhdGVzKGZyb20pIHsKKyAgICB2YXIgaW50byA9IHt9OworCisgICAgaW50
by5fZGVmYXVsdCA9IHt9OworICAgIGludG8ucHJlUmVuZGVyID0gT2JqZWN0LmNyZWF0ZShpbnRv
Ll9kZWZhdWx0KTsKKyAgICBpbnRvLmRlc3Ryb3lpbmcgPSBPYmplY3QuY3JlYXRlKGludG8uX2Rl
ZmF1bHQpOworICAgIGludG8uaGFzRWxlbWVudCA9IE9iamVjdC5jcmVhdGUoaW50by5fZGVmYXVs
dCk7CisgICAgaW50by5pbkRPTSA9IE9iamVjdC5jcmVhdGUoaW50by5oYXNFbGVtZW50KTsKKwor
ICAgIGZvciAodmFyIHN0YXRlTmFtZSBpbiBmcm9tKSB7CisgICAgICBpZiAoIWZyb20uaGFzT3du
UHJvcGVydHkoc3RhdGVOYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAg
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoaW50b1tzdGF0ZU5hbWVdLCBmcm9tW3N0YXRlTmFt
ZV0pOworICAgIH0KKworICAgIHJldHVybiBpbnRvOworICB9CisKKyAgdmFyIHN0YXRlcyA9IHsK
KyAgICBfZGVmYXVsdDogX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVsdCwKKyAg
ICBwcmVSZW5kZXI6IF9lbWJlclZpZXdzVmlld3NTdGF0ZXNQcmVfcmVuZGVyLmRlZmF1bHQsCisg
ICAgaW5ET006IF9lbWJlclZpZXdzVmlld3NTdGF0ZXNJbl9kb20uZGVmYXVsdCwKKyAgICBoYXNF
bGVtZW50OiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzSGFzX2VsZW1lbnQuZGVmYXVsdCwKKyAgICBk
ZXN0cm95aW5nOiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVzdHJveWluZy5kZWZhdWx0CisgIH07
CisgIGV4cG9ydHMuc3RhdGVzID0gc3RhdGVzOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3Zp
ZXdzL3N0YXRlcy9kZWZhdWx0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci12aWV3cy9jb21wYXQvYXR0cnMtcHJveHkn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8K
KyAgZXhwb3J0cy5kZWZhdWx0ID0geworICAgIC8vIGFwcGVuZENoaWxkIGlzIG9ubHkgbGVnYWwg
d2hpbGUgcmVuZGVyaW5nIHRoZSBidWZmZXIuCisgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uICgp
IHsKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ1lvdSBjYW5cJ3Qg
dXNlIGFwcGVuZENoaWxkIG91dHNpZGUgb2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzJyk7CisgICAg
fSwKKworICAgICQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAg
fSwKKworICAgIGdldEVsZW1lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBudWxsOwor
ICAgIH0sCisKKyAgICBsZWdhY3lQcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24gKHZpZXcsIGtl
eSkgeworICAgICAgdmFyIGF0dHJzID0gdmlldy5hdHRyczsKKyAgICAgIGlmIChhdHRycyAmJiBr
ZXkgaW4gYXR0cnMpIHsKKyAgICAgICAgdmFyIHBvc3NpYmxlQ2VsbCA9IGF0dHJzW2tleV07CisK
KyAgICAgICAgaWYgKHBvc3NpYmxlQ2VsbCAmJiBwb3NzaWJsZUNlbGxbX2VtYmVyVmlld3NDb21w
YXRBdHRyc1Byb3h5Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywga2V5KTsKKyAgICAgICAgICBpZiAodmFsdWUg
PT09IHBvc3NpYmxlQ2VsbC52YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
IH0KKyAgICAgICAgICBwb3NzaWJsZUNlbGwudXBkYXRlKHZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0sCisKKyAgICAvLyBIYW5kbGUgZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlz
cGF0Y2hlcmAKKyAgICBoYW5kbGVFdmVudDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRy
dWU7IC8vIGNvbnRpbnVlIGV2ZW50IHByb3BhZ2F0aW9uCisgICAgfSwKKworICAgIGNsZWFudXA6
IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbiAoKSB7fSwKKwor
ICAgIHJlcmVuZGVyOiBmdW5jdGlvbiAodmlldykgeworICAgICAgdmlldy5yZW5kZXJlci5lbnN1
cmVWaWV3Tm90UmVuZGVyaW5nKHZpZXcpOworICAgIH0sCisgICAgaW52b2tlT2JzZXJ2ZXI6IGZ1
bmN0aW9uICgpIHt9CisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVz
L2Rlc3Ryb3lpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLXZp
ZXdzL3ZpZXdzL3N0YXRlcy9kZWZhdWx0JywgJ2VtYmVyLW1ldGFsL2Vycm9yJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbEFzc2lnbiwgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1
bHQsIF9lbWJlck1ldGFsRXJyb3IpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9k
dWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKworICB2YXIgZGVzdHJv
eWluZyA9IE9iamVjdC5jcmVhdGUoX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVs
dCk7CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChkZXN0cm95aW5nLCB7CisgICAgYXBw
ZW5kQ2hpbGQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9y
LmRlZmF1bHQoJ1lvdSBjYW5cJ3QgY2FsbCBhcHBlbmRDaGlsZCBvbiBhIHZpZXcgYmVpbmcgZGVz
dHJveWVkJyk7CisgICAgfSwKKyAgICByZXJlbmRlcjogZnVuY3Rpb24gKCkgeworICAgICAgdGhy
b3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91IGNhblwndCBjYWxsIHJlcmVuZGVy
IG9uIGEgdmlldyBiZWluZyBkZXN0cm95ZWQnKTsKKyAgICB9LAorICAgIGRlc3Ryb3lFbGVtZW50
OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0
KCdZb3UgY2FuXCd0IGNhbGwgZGVzdHJveUVsZW1lbnQgb24gYSB2aWV3IGJlaW5nIGRlc3Ryb3ll
ZCcpOworICAgIH0KKyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGVzdHJveWluZzsKK30p
OworZW5pZmVkKCdlbWJlci12aWV3cy92aWV3cy9zdGF0ZXMvaGFzX2VsZW1lbnQnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2RlZmF1bHQnLCAnZW1iZXItbWV0YWwvYXNz
aWduJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItbWV0YWwvcnVuX2xvb3An
LCAnZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0aW9uJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dl
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQsIF9l
bWJlck1ldGFsQXNzaWduLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyTWV0YWxSdW5f
bG9vcCwgX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgaGFzRWxlbWVudCA9IE9iamVjdC5jcmVhdGUo
X2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdChoYXNFbGVtZW50LCB7CisgICAgJDogZnVuY3Rpb24gKHZpZXcsIHNlbCkg
eworICAgICAgdmFyIGVsZW0gPSB2aWV3LmVsZW1lbnQ7CisgICAgICByZXR1cm4gc2VsID8gX2Vt
YmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWwsIGVsZW0pIDogX2VtYmVyVmlld3NTeXN0
ZW1KcXVlcnkuZGVmYXVsdChlbGVtKTsKKyAgICB9LAorCisgICAgZ2V0RWxlbWVudDogZnVuY3Rp
b24gKHZpZXcpIHsKKyAgICAgIHZhciBwYXJlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgcGFy
ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHBhcmVudCwgJ2VsZW1lbnQnKTsKKyAg
ICAgIH0KKyAgICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHZpZXcuZmluZEVsZW1l
bnRJblBhcmVudEVsZW1lbnQocGFyZW50KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZW1iZXJW
aWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KCcjJyArIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh2aWV3LCAnZWxlbWVudElkJykpWzBdOworICAgIH0sCisKKyAgICAvLyBvbmNlIHRoZSB2aWV3
IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSwgcmVyZW5kZXJpbmcgaXMKKyAgICAvLyBk
ZWZlcnJlZCB0byBhbGxvdyBiaW5kaW5ncyB0byBzeW5jaHJvbml6ZS4KKyAgICByZXJlbmRlcjog
ZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgIHZpZXcucmVuZGVyZXIuZW5zdXJlVmlld05vdFJlbmRl
cmluZyh2aWV3KTsKKyAgICAgIHZpZXcucmVuZGVyZXIucmVyZW5kZXIodmlldyk7CisgICAgfSwK
KworICAgIGNsZWFudXA6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3Ll9jdXJyZW50U3Rh
dGUuZGVzdHJveUVsZW1lbnQodmlldyk7CisgICAgfSwKKworICAgIC8vIG9uY2UgdGhlIHZpZXcg
aXMgYWxyZWFkeSBpbiB0aGUgRE9NLCBkZXN0cm95aW5nIGl0IHJlbW92ZXMgaXQKKyAgICAvLyBm
cm9tIHRoZSBET00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8gdGhl
CisgICAgLy8gcHJlUmVuZGVyIHN0YXRlIGlmIGluRE9NLgorCisgICAgZGVzdHJveUVsZW1lbnQ6
IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3LnJlbmRlcmVyLnJlbW92ZSh2aWV3LCBmYWxz
ZSk7CisgICAgICByZXR1cm4gdmlldzsKKyAgICB9LAorCisgICAgLy8gSGFuZGxlIGV2ZW50cyBm
cm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgICAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uICh2
aWV3LCBldmVudE5hbWUsIGV2ZW50KSB7CisgICAgICBpZiAodmlldy5oYXMoZXZlbnROYW1lKSkg
eworICAgICAgICAvLyBIYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIHJlLWRpc3BhdGNoIGV2ZW50
cywgc28gd2UgZG9uJ3QKKyAgICAgICAgLy8gcHJldmVudERlZmF1bHQgb3Igc3RvcFByb3BhZ2F0
aW9uLgorICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uZmxhZ2dlZElu
c3RydW1lbnQoJ2ludGVyYWN0aW9uLicgKyBldmVudE5hbWUsIHsgZXZlbnQ6IGV2ZW50LCB2aWV3
OiB2aWV3IH0sIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxSdW5f
bG9vcC5kZWZhdWx0LmpvaW4odmlldywgdmlldy50cmlnZ2VyLCBldmVudE5hbWUsIGV2ZW50KTsK
KyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY29u
dGludWUgZXZlbnQgcHJvcGFnYXRpb24KKyAgICAgIH0KKyAgICB9LAorCisgICAgaW52b2tlT2Jz
ZXJ2ZXI6IGZ1bmN0aW9uICh0YXJnZXQsIG9ic2VydmVyKSB7CisgICAgICBvYnNlcnZlci5jYWxs
KHRhcmdldCk7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBoYXNFbGVtZW50
OworfSk7CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8K
K2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2luX2RvbScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvZXJy
b3InLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2hh
c19lbGVtZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJN
ZXRhbEFzc2lnbiwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVy
Vmlld3NWaWV3c1N0YXRlc0hhc19lbGVtZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgdmFy
IGluRE9NID0gT2JqZWN0LmNyZWF0ZShfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzSGFzX2VsZW1lbnQu
ZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChpbkRPTSwgeworICAgIGVu
dGVyOiBmdW5jdGlvbiAodmlldykgeworICAgICAgLy8gUmVnaXN0ZXIgdGhlIHZpZXcgZm9yIGV2
ZW50IGhhbmRsaW5nLiBUaGlzIGhhc2ggaXMgdXNlZCBieQorICAgICAgLy8gRW1iZXIuRXZlbnRE
aXNwYXRjaGVyIHRvIGRpc3BhdGNoIGluY29taW5nIGV2ZW50cy4KKyAgICAgIGlmICh2aWV3LnRh
Z05hbWUgIT09ICcnKSB7CisgICAgICAgIHZpZXcuX3JlZ2lzdGVyKCk7CisgICAgICB9CisKKyAg
ICAgIF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAgICAgIF9l
bWJlck1ldGFsT2JzZXJ2ZXIuX2FkZEJlZm9yZU9ic2VydmVyKHZpZXcsICdlbGVtZW50SWQnLCBm
dW5jdGlvbiAoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnQ2hhbmdpbmcgYSB2aWV3XCdzIGVsZW1lbnRJZCBhZnRlciBjcmVhdGlvbiBpcyBub3QgYWxs
b3dlZCcpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBleGl0OiBmdW5j
dGlvbiAodmlldykgeworICAgICAgdmlldy5fdW5yZWdpc3RlcigpOworICAgIH0KKyAgfSk7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gaW5ET007Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmll
d3Mvc3RhdGVzL3ByZV9yZW5kZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItdmlld3Mvdmlld3Mvc3Rh
dGVzL2RlZmF1bHQnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVmYXVsdCwgX2VtYmVyTWV0YWxBc3NpZ24pIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICB2YXIgcHJlUmVuZGVyID0gT2JqZWN0LmNyZWF0ZShfZW1iZXJWaWV3
c1ZpZXdzU3RhdGVzRGVmYXVsdC5kZWZhdWx0KTsKKworICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZh
dWx0KHByZVJlbmRlciwgeworICAgIGxlZ2FjeVByb3BlcnR5RGlkQ2hhbmdlOiBmdW5jdGlvbiAo
dmlldywga2V5KSB7fQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBwcmVSZW5kZXI7Cit9
KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9hcmVhJywgWydleHBvcnRzJywgJ2Vt
YmVyLXZpZXdzL2NvbXBvbmVudHMvY29tcG9uZW50JywgJ2VtYmVyLXZpZXdzL21peGlucy90ZXh0
X3N1cHBvcnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzQ29tcG9uZW50c0NvbXBv
bmVudCwgX2VtYmVyVmlld3NNaXhpbnNUZXh0X3N1cHBvcnQpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisK
KyAgLyoqCisgICAgVGhlIGludGVybmFsIGNsYXNzIHVzZWQgdG8gY3JlYXRlIHRleHRhcmVhIGVs
ZW1lbnQgd2hlbiB0aGUgYHt7dGV4dGFyZWF9fWAKKyAgICBoZWxwZXIgaXMgdXNlZC4KKyAgCisg
ICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVycy50ZXh0YXJlYV0oL2FwaS9jbGFzc2VzL0Vt
YmVyLlRlbXBsYXRlcy5oZWxwZXJzLmh0bWwjbWV0aG9kX3RleHRhcmVhKSAgZm9yIHVzYWdlIGRl
dGFpbHMuCisgIAorICAgICMjIExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCisgIAor
ICAgIEJlY2F1c2UgSFRNTCBgdGV4dGFyZWFgIGVsZW1lbnRzIGRvIG5vdCBjb250YWluIGlubmVy
IEhUTUwgdGhlIGBsYXlvdXRgIGFuZAorICAgIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdpbGwg
bm90IGJlIGFwcGxpZWQuIFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcu
aHRtbCkncworICAgIGxheW91dCBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAKKyAg
ICBAY2xhc3MgVGV4dEFyZWEKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1i
ZXIuQ29tcG9uZW50CisgICAgQHVzZXMgRW1iZXIuVGV4dFN1cHBvcnQKKyAgICBAcHVibGljCisg
ICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclZpZXdzQ29tcG9uZW50c0NvbXBvbmVudC5k
ZWZhdWx0LmV4dGVuZChfZW1iZXJWaWV3c01peGluc1RleHRfc3VwcG9ydC5kZWZhdWx0LCB7Cisg
ICAgaW5zdHJ1bWVudERpc3BsYXk6ICd7e3RleHRhcmVhfX0nLAorCisgICAgY2xhc3NOYW1lczog
WydlbWJlci10ZXh0LWFyZWEnXSwKKworICAgIHRhZ05hbWU6ICd0ZXh0YXJlYScsCisgICAgYXR0
cmlidXRlQmluZGluZ3M6IFsncm93cycsICdjb2xzJywgJ25hbWUnLCAnc2VsZWN0aW9uRW5kJywg
J3NlbGVjdGlvblN0YXJ0JywgJ3dyYXAnLCAnbGFuZycsICdkaXInLCAndmFsdWUnXSwKKyAgICBy
b3dzOiBudWxsLAorICAgIGNvbHM6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmll
d3Mvdmlld3MvdGV4dF9maWVsZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcs
ICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci12aWV3cy9jb21wb25lbnRzL2NvbXBv
bmVudCcsICdlbWJlci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2Vt
cHR5X29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2Vt
YmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1i
ZXJWaWV3c01peGluc1RleHRfc3VwcG9ydCwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIGlucHV0VHlwZVRlc3RFbGVtZW50OworICB2YXIgaW5wdXRU
eXBlcyA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgIGZ1bmN0aW9u
IGNhblNldFR5cGVPZklucHV0KHR5cGUpIHsKKyAgICBpZiAodHlwZSBpbiBpbnB1dFR5cGVzKSB7
CisgICAgICByZXR1cm4gaW5wdXRUeXBlc1t0eXBlXTsKKyAgICB9CisKKyAgICAvLyBpZiBydW5u
aW5nIGluIG91dHNpZGUgb2YgYSBicm93c2VyIGFsd2F5cyByZXR1cm4gdGhlCisgICAgLy8gb3Jp
Z2luYWwgdHlwZQorICAgIGlmICghX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RP
TSkgeworICAgICAgaW5wdXRUeXBlc1t0eXBlXSA9IHR5cGU7CisKKyAgICAgIHJldHVybiB0eXBl
OworICAgIH0KKworICAgIGlmICghaW5wdXRUeXBlVGVzdEVsZW1lbnQpIHsKKyAgICAgIGlucHV0
VHlwZVRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKKyAgICB9
CisKKyAgICB0cnkgeworICAgICAgaW5wdXRUeXBlVGVzdEVsZW1lbnQudHlwZSA9IHR5cGU7Cisg
ICAgfSBjYXRjaCAoZSkge30KKworICAgIHJldHVybiBpbnB1dFR5cGVzW3R5cGVdID0gaW5wdXRU
eXBlVGVzdEVsZW1lbnQudHlwZSA9PT0gdHlwZTsKKyAgfQorCisgIC8qKgorICAKKyAgICBUaGUg
aW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5w
dXR9fWAKKyAgICBoZWxwZXIgaXMgdXNlZCB3aXRoIGB0eXBlYCBvZiBgdGV4dGAuCisgIAorICAg
IFNlZSBbRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaW5wdXRdKC9hcGkvY2xhc3Nlcy9FbWJlci5U
ZW1wbGF0ZXMuaGVscGVycy5odG1sI21ldGhvZF9pbnB1dCkgIGZvciB1c2FnZSBkZXRhaWxzLgor
ICAKKyAgICAjIyBMYXlvdXQgYW5kIExheW91dE5hbWUgcHJvcGVydGllcworICAKKyAgICBCZWNh
dXNlIEhUTUwgYGlucHV0YCBlbGVtZW50cyBhcmUgc2VsZiBjbG9zaW5nIGBsYXlvdXRgIGFuZCBg
bGF5b3V0TmFtZWAKKyAgICBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1i
ZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncworICAgIGxheW91dCBzZWN0
aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAKKyAgICBAY2xhc3MgVGV4dEZpZWxkCisgICAg
QG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEB1c2Vz
IEVtYmVyLlRleHRTdXBwb3J0CisgICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQg
PSBfZW1iZXJWaWV3c0NvbXBvbmVudHNDb21wb25lbnQuZGVmYXVsdC5leHRlbmQoX2VtYmVyVmll
d3NNaXhpbnNUZXh0X3N1cHBvcnQuZGVmYXVsdCwgeworICAgIGluc3RydW1lbnREaXNwbGF5OiAn
e3tpbnB1dCB0eXBlPSJ0ZXh0In19JywKKworICAgIGNsYXNzTmFtZXM6IFsnZW1iZXItdGV4dC1m
aWVsZCddLAorICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsn
YWNjZXB0JywgJ2F1dG9jb21wbGV0ZScsICdhdXRvc2F2ZScsICdkaXInLCAnZm9ybWFjdGlvbics
ICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJn
ZXQnLCAnaGVpZ2h0JywgJ2lucHV0bW9kZScsICdsYW5nJywgJ2xpc3QnLCAnbWF4JywgJ21pbics
ICdtdWx0aXBsZScsICduYW1lJywgJ3BhdHRlcm4nLCAnc2l6ZScsICdzdGVwJywgJ3R5cGUnLCAn
dmFsdWUnLCAnd2lkdGgnXSwKKworICAgIGRlZmF1bHRMYXlvdXQ6IG51bGwsCisKKyAgICAvKioK
KyAgICAgIFRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4gQXMgdGhl
IHVzZXIgaW5wdXRzIHRleHQsIHRoaXMKKyAgICAgIHByb3BlcnR5IGlzIHVwZGF0ZWQgbGl2ZS4K
KyAgICAgICBAcHJvcGVydHkgdmFsdWUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1
bHQgIiIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHZhbHVlOiAnJywKKworICAgIC8qKgor
ICAgICAgVGhlIGB0eXBlYCBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCisgICAgICAg
QHByb3BlcnR5IHR5cGUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgInRleHQi
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0eXBlOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkKHsKKyAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gJ3RleHQn
OworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAg
ICB2YXIgdHlwZSA9ICd0ZXh0JzsKKworICAgICAgICBpZiAoY2FuU2V0VHlwZU9mSW5wdXQodmFs
dWUpKSB7CisgICAgICAgICAgdHlwZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIHR5cGU7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIFRoZSBgc2l6ZWAg
b2YgdGhlIHRleHQgZmllbGQgaW4gY2hhcmFjdGVycy4KKyAgICAgICBAcHJvcGVydHkgc2l6ZQor
ICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzaXplOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgYHBhdHRlcm5gIGF0
dHJpYnV0ZSBvZiBpbnB1dCBlbGVtZW50LgorICAgICAgIEBwcm9wZXJ0eSBwYXR0ZXJuCisgICAg
ICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAq
LworICAgIHBhdHRlcm46IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBgbWluYCBhdHRyaWJ1
dGUgb2YgaW5wdXQgZWxlbWVudCB1c2VkIHdpdGggYHR5cGU9Im51bWJlciJgIG9yIGB0eXBlPSJy
YW5nZSJgLgorICAgICAgIEBwcm9wZXJ0eSBtaW4KKyAgICAgIEB0eXBlIFN0cmluZworICAgICAg
QGRlZmF1bHQgbnVsbAorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICBtaW46IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBgbWF4YCBhdHRyaWJ1dGUgb2Yg
aW5wdXQgZWxlbWVudCB1c2VkIHdpdGggYHR5cGU9Im51bWJlciJgIG9yIGB0eXBlPSJyYW5nZSJg
LgorICAgICAgIEBwcm9wZXJ0eSBtYXgKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1
bHQgbnVsbAorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBt
YXg6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3MvdmlldycsIFsn
ZXhwb3J0cycsICdlbWJlci12aWV3cy9zeXN0ZW0vZXh0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL2Nv
cmVfdmlldycsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19jb250ZXh0X3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL3ZpZXdfY2hpbGRfdmlld3Nfc3VwcG9ydCcsICdlbWJlci12aWV3cy9t
aXhpbnMvbGVnYWN5X2NoaWxkX3ZpZXdzX3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5zL3Zp
ZXdfc3RhdGVfc3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvdGVtcGxhdGVfcmVuZGVyaW5n
X3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVzX3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL2xlZ2FjeV92aWV3X3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5z
L2luc3RydW1lbnRhdGlvbl9zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy9hcmlhX3JvbGVf
c3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvdmlzaWJpbGl0eV9zdXBwb3J0JywgJ2VtYmVy
LXZpZXdzL2NvbXBhdC9hdHRycy1wcm94eScsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19zdXBw
b3J0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1N5c3RlbUV4dCwgX2VtYmVyVmll
d3NWaWV3c0NvcmVfdmlldywgX2VtYmVyVmlld3NNaXhpbnNWaWV3X2NvbnRleHRfc3VwcG9ydCwg
X2VtYmVyVmlld3NNaXhpbnNWaWV3X2NoaWxkX3ZpZXdzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4
aW5zTGVnYWN5X2NoaWxkX3ZpZXdzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zVmlld19zdGF0
ZV9zdXBwb3J0LCBfZW1iZXJWaWV3c01peGluc1RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0LCBf
ZW1iZXJWaWV3c01peGluc0NsYXNzX25hbWVzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zTGVn
YWN5X3ZpZXdfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNJbnN0cnVtZW50YXRpb25fc3VwcG9y
dCwgX2VtYmVyVmlld3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNW
aXNpYmlsaXR5X3N1cHBvcnQsIF9lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eSwgX2VtYmVyVmll
d3NNaXhpbnNWaWV3X3N1cHBvcnQpIHsKKyAgLy8galF1ZXJ5LCBFbWJlci5sb29rdXAsCisgIC8v
IEVtYmVyLkVOVgorICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAg
QHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworCisgIC8qKgorICAgIGBFbWJlci5WaWV3YCBp
cyB0aGUgY2xhc3MgaW4gRW1iZXIgcmVzcG9uc2libGUgZm9yIGVuY2Fwc3VsYXRpbmcgdGVtcGxh
dGVzIG9mCisgICAgSFRNTCBjb250ZW50LCBjb21iaW5pbmcgdGVtcGxhdGVzIHdpdGggZGF0YSB0
byByZW5kZXIgYXMgc2VjdGlvbnMgb2YgYSBwYWdlJ3MKKyAgICBET00sIGFuZCByZWdpc3Rlcmlu
ZyBhbmQgcmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBldmVudHMuCisgIAorICAgICMjIEhU
TUwgVGFnCisgIAorICAgIFRoZSBkZWZhdWx0IEhUTUwgdGFnIG5hbWUgdXNlZCBmb3IgYSB2aWV3
J3MgRE9NIHJlcHJlc2VudGF0aW9uIGlzIGBkaXZgLiBUaGlzCisgICAgY2FuIGJlIGN1c3RvbWl6
ZWQgYnkgc2V0dGluZyB0aGUgYHRhZ05hbWVgIHByb3BlcnR5LiBUaGUgZm9sbG93aW5nIHZpZXcK
KyAgICBjbGFzczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFBhcmFncmFwaFZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAnZW0nCisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIFdvdWxkIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCB0aGUgZm9sbG93aW5nIEhU
TUw6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZW0gaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZp
ZXciPjwvZW0+CisgICAgYGBgCisgIAorICAgICMjIEhUTUwgYGNsYXNzYCBBdHRyaWJ1dGUKKyAg
CisgICAgVGhlIEhUTUwgYGNsYXNzYCBhdHRyaWJ1dGUgb2YgYSB2aWV3J3MgdGFnIGNhbiBiZSBz
ZXQgYnkgcHJvdmlkaW5nIGEKKyAgICBgY2xhc3NOYW1lc2AgcHJvcGVydHkgdGhhdCBpcyBzZXQg
dG8gYW4gYXJyYXkgb2Ygc3RyaW5nczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15Vmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAn
bXktb3RoZXItY2xhc3MnXQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAg
IGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IG15LWNsYXNz
IG15LW90aGVyLWNsYXNzIj48L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgYGNsYXNzYCBhdHRyaWJ1
dGUgdmFsdWVzIGNhbiBhbHNvIGJlIHNldCBieSBwcm92aWRpbmcgYSBgY2xhc3NOYW1lQmluZGlu
Z3NgCisgICAgcHJvcGVydHkgc2V0IHRvIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMgZm9y
IHRoZSB2aWV3LiBUaGUgcmV0dXJuIHZhbHVlCisgICAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxs
IGJlIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHZhbHVlIGZvciB0aGUgdmlldydzIGBjbGFzc2AKKyAg
ICBhdHRyaWJ1dGUuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGNvbXB1dGVkIHByb3BlcnRpZXM6
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydwcm9wZXJ0eUEnLCAncHJvcGVydHlCJ10sCisg
ICAgICBwcm9wZXJ0eUE6ICdmcm9tLWEnLAorICAgICAgcHJvcGVydHlCOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKHNvbWVMb2dpYykgeyByZXR1cm4gJ2Zyb20tYic7
IH0KKyAgICAgIH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZp
ZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBg
aHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZnJvbS1hIGZyb20t
YiI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIElmIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUg
YmluZGluZyByZXR1cm5zIGEgYm9vbGVhbiB0aGUgcHJvcGVydHkgbmFtZQorICAgIGl0c2VsZiB3
aWxsIGJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIFRo
ZSBjbGFzcyBuYW1lCisgICAgd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlIHZhbHVlIGlzIGBmYWxz
ZWAgb3IgYHVuZGVmaW5lZGAuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydob3ZlcmVkJ10s
CisgICAgICBob3ZlcmVkOiB0cnVlCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAg
CisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgaG92
ZXJlZCI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIFdoZW4gdXNpbmcgYm9vbGVhbiBjbGFzcyBu
YW1lIGJpbmRpbmdzIHlvdSBjYW4gc3VwcGx5IGEgc3RyaW5nIHZhbHVlIG90aGVyCisgICAgdGhh
biB0aGUgcHJvcGVydHkgbmFtZSBmb3IgdXNlIGFzIHRoZSBgY2xhc3NgIEhUTUwgYXR0cmlidXRl
IGJ5IGFwcGVuZGluZyB0aGUKKyAgICBwcmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIgY2hhcmFj
dGVyIHdoZW4gZGVmaW5pbmcgdGhlIGJpbmRpbmc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczog
Wydhd2Vzb21lOnNvLXZlcnktY29vbCddLAorICAgICAgYXdlc29tZTogdHJ1ZQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhU
TUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+CisgICAgYGBgCisgIAor
ICAgIEJvb2xlYW4gdmFsdWUgY2xhc3MgbmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBuYW1l
cyBhcmUgaW4gYQorICAgIGNhbWVsQ2FzZS1zdHlsZSBmb3JtYXQgd2lsbCBiZSBjb252ZXJ0ZWQg
dG8gYSBkYXNoZXJpemVkIGZvcm1hdDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15Vmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJn
ZW50J10sCisgICAgICBpc1VyZ2VudDogdHJ1ZQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBX
aWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24g
b2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12
aWV3IGlzLXVyZ2VudCI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIENsYXNzIG5hbWUgYmluZGlu
Z3MgY2FuIGFsc28gcmVmZXIgdG8gb2JqZWN0IHZhbHVlcyB0aGF0IGFyZSBmb3VuZCBieQorICAg
IHRyYXZlcnNpbmcgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB2aWV3IGl0c2VsZjoKKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ21lc3NhZ2VzLmVtcHR5J10KKyAgICAgIG1lc3NhZ2VzOiBFbWJl
ci5PYmplY3QuY3JlYXRlKHsKKyAgICAgICAgZW1wdHk6IHRydWUKKyAgICAgIH0pCisgICAgfSk7
CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVt
YmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZW1wdHkiPjwvZGl2PgorICAgIGBgYAorICAKKyAgICBJ
ZiB5b3Ugd2FudCB0byBhZGQgYSBjbGFzcyBuYW1lIGZvciBhIHByb3BlcnR5IHdoaWNoIGV2YWx1
YXRlcyB0byB0cnVlIGFuZAorICAgIGFuZCBhIGRpZmZlcmVudCBjbGFzcyBuYW1lIGlmIGl0IGV2
YWx1YXRlcyB0byBmYWxzZSwgeW91IGNhbiBwYXNzIGEgYmluZGluZworICAgIGxpa2UgdGhpczoK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIEFwcGxpZXMgJ2VuYWJsZWQnIGNsYXNzIHdo
ZW4gaXNFbmFibGVkIGlzIHRydWUgYW5kICdkaXNhYmxlZCcgd2hlbiBpc0VuYWJsZWQgaXMgZmFs
c2UKKyAgICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydp
c0VuYWJsZWQ6ZW5hYmxlZDpkaXNhYmxlZCddCisgICAgICBpc0VuYWJsZWQ6IHRydWUKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAgPGRpdiBpZD0i
ZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBlbmFibGVkIj48L2Rpdj4KKyAgICBgYGAKKyAgCisg
ICAgV2hlbiBpc0VuYWJsZWQgaXMgYGZhbHNlYCwgdGhlIHJlc3VsdGluZyBIVE1MIHJlcHJlc2Vu
dGF0aW9uIGxvb2tzIGxpa2UKKyAgICB0aGlzOgorICAKKyAgICBgYGBodG1sCisgICAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+CisgICAgYGBgCisg
IAorICAgIFRoaXMgc3ludGF4IG9mZmVycyB0aGUgY29udmVuaWVuY2UgdG8gYWRkIGEgY2xhc3Mg
aWYgYSBwcm9wZXJ0eSBpcyBgZmFsc2VgOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8g
QXBwbGllcyBubyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBpcyB0cnVlIGFuZCBjbGFzcyAnZGlzYWJs
ZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCisgICAgRW1iZXIuVmlldy5leHRlbmQoeworICAg
ICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNFbmFibGVkOjpkaXNhYmxlZCddCisgICAgICBpc0Vu
YWJsZWQ6IHRydWUKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBo
dG1sCisgICAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+PC9kaXY+CisgICAg
YGBgCisgIAorICAgIFdoZW4gdGhlIGBpc0VuYWJsZWRgIHByb3BlcnR5IG9uIHRoZSB2aWV3IGlz
IHNldCB0byBgZmFsc2VgLCBpdCB3aWxsIHJlc3VsdAorICAgIGluIHZpZXcgaW5zdGFuY2VzIHdp
dGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZGlzYWJsZWQiPjwvZGl2PgorICAgIGBgYAor
ICAKKyAgICBVcGRhdGVzIHRvIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUgYmluZGluZyB3aWxs
IHJlc3VsdCBpbiBhdXRvbWF0aWMKKyAgICB1cGRhdGUgb2YgdGhlICBIVE1MIGBjbGFzc2AgYXR0
cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTAorICAgIHJlcHJlc2VudGF0aW9uLiBJ
ZiB0aGUgdmFsdWUgYmVjb21lcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgIHRoZSBjbGFzcyBuYW1l
CisgICAgd2lsbCBiZSByZW1vdmVkLgorICAKKyAgICBCb3RoIGBjbGFzc05hbWVzYCBhbmQgYGNs
YXNzTmFtZUJpbmRpbmdzYCBhcmUgY29uY2F0ZW5hdGVkIHByb3BlcnRpZXMuIFNlZQorICAgIFtF
bWJlci5PYmplY3RdKC9hcGkvY2xhc3Nlcy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRhdGlv
biBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVz
LgorICAKKyAgICAjIyBIVE1MIEF0dHJpYnV0ZXMKKyAgCisgICAgVGhlIEhUTUwgYXR0cmlidXRl
IHNlY3Rpb24gb2YgYSB2aWV3J3MgdGFnIGNhbiBiZSBzZXQgYnkgcHJvdmlkaW5nIGFuCisgICAg
YGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8gYW4gYXJyYXkgb2YgcHJvcGVydHkg
bmFtZXMgb24gdGhlIHZpZXcuCisgICAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0
aWVzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHZpZXcncworICAgIEhUTUwgYXNz
b2NpYXRlZCBhdHRyaWJ1dGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBbmNob3JWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2EnLAorICAgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnaHJlZiddLAorICAgICAgaHJlZjogJ2h0dHA6Ly9nb29nbGUuY29tJwor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3
aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20iPjwv
YT4KKyAgICBgYGAKKyAgCisgICAgT25lIHByb3BlcnR5IGNhbiBiZSBtYXBwZWQgb24gdG8gYW5v
dGhlciBieSBwbGFjaW5nIGEgIjoiIGJldHdlZW4KKyAgICB0aGUgc291cmNlIHByb3BlcnR5IGFu
ZCB0aGUgZGVzdGluYXRpb24gcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBB
bmNob3JWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2EnLAorICAg
ICAgYXR0cmlidXRlQmluZGluZ3M6IFsndXJsOmhyZWYnXSwKKyAgICAgIHVybDogJ2h0dHA6Ly9n
b29nbGUuY29tJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3
IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0
bWwKKyAgICA8YSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dv
b2dsZS5jb20iPjwvYT4KKyAgICBgYGAKKyAgCisgICAgTmFtZXNwYWNlZCBhdHRyaWJ1dGVzIChl
LmcuIGB4bGluazpocmVmYCkgYXJlIHN1cHBvcnRlZCwgYnV0IGhhdmUgdG8gYmUKKyAgICBtYXBw
ZWQsIHNpbmNlIGA6YCBpcyBub3QgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yIHByb3BlcnRpZXMgaW4g
SmF2YXNjcmlwdDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFVzZVZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAndXNlJywKKyAgICAgIGF0dHJpYnV0ZUJpbmRp
bmdzOiBbJ3hsaW5rSHJlZjp4bGluazpocmVmJ10sCisgICAgICB4bGlua0hyZWY6ICcjdHJpYW5n
bGUnCisgICAgfSk7CisgICAgYGBgCisgICAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMg
d2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAgPHVz
ZSB4bGluazpocmVmPSIjdHJpYW5nbGUiPjwvdXNlPgorICAgIGBgYAorICAKKyAgICBJZiB0aGUg
cmV0dXJuIHZhbHVlIG9mIGFuIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9uaXRvcmVkIHByb3BlcnR5
IGlzIGEgYm9vbGVhbgorICAgIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEg
Y29lcmNlZCBzdHJpbmc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVRleHRJbnB1dCA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgICBhdHRy
aWJ1dGVCaW5kaW5nczogWydkaXNhYmxlZCddLAorICAgICAgZGlzYWJsZWQ6IGZhbHNlCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIGEgdmlldyBpbnN0YW5jZSB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8aW5wdXQg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciIGRpc2FibGVkPSJmYWxzZSIgLz4KKyAgICBg
YGAKKyAgCisgICAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBjYW4gcmVmZXIgdG8gY29tcHV0ZWQgcHJv
cGVydGllczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15VGV4dElucHV0ID0gRW1iZXIu
Vmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2lucHV0JywKKyAgICAgIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ2Rpc2FibGVkJ10sCisgICAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oKSB7CisgICAgICAgIGlmIChzb21lTG9naWMpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgIH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFRvIHByZXZlbnQgc2V0dGluZyBh
biBhdHRyaWJ1dGUgYWx0b2dldGhlciwgdXNlIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhcyB0aGUK
KyAgICByZXR1cm4gdmFsdWUgb2YgdGhlIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9uaXRvcmVkIHBy
b3BlcnR5OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgTXlUZXh0SW5wdXQgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAnZm9ybScsCisgICAgICBhdHRyaWJ1dGVCaW5k
aW5nczogWydub3ZhbGlkYXRlJ10sCisgICAgICBub3ZhbGlkYXRlOiBudWxsCisgICAgfSk7Cisg
ICAgYGBgCisgIAorICAgIFVwZGF0ZXMgdG8gdGhlIHByb3BlcnR5IG9mIGFuIGF0dHJpYnV0ZSBi
aW5kaW5nIHdpbGwgcmVzdWx0IGluIGF1dG9tYXRpYworICAgIHVwZGF0ZSBvZiB0aGUgIEhUTUwg
YXR0cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTCByZXByZXNlbnRhdGlvbi4KKyAg
CisgICAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBpcyBhIGNvbmNhdGVuYXRlZCBwcm9wZXJ0eS4gU2Vl
IFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nlcy9FbWJlci5PYmplY3QuaHRtbCkKKyAgICBkb2N1
bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0
aWVzLgorICAKKyAgICAjIyBUZW1wbGF0ZXMKKyAgCisgICAgVGhlIEhUTUwgY29udGVudHMgb2Yg
YSB2aWV3J3MgcmVuZGVyZWQgcmVwcmVzZW50YXRpb24gYXJlIGRldGVybWluZWQgYnkgaXRzCisg
ICAgdGVtcGxhdGUuIFRlbXBsYXRlcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBh
biBvcHRpb25hbCBjb250ZXh0CisgICAgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9m
IEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIHdpdGhpbiB0aGUKKyAgICB2aWV3J3MgdGFnLiBN
b3N0IHR5cGljYWxseSBpbiBFbWJlciB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBjb21waWxlZAor
ICAgIHRlbXBsYXRlLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSFRNTEJhcnMuY29tcGlsZSgnSSBh
bSB0aGUgdGVtcGxhdGUnKQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAg
IGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIGFtIHRo
ZSB0ZW1wbGF0ZTwvZGl2PgorICAgIGBgYAorICAKKyAgICBXaXRoaW4gYW4gRW1iZXIgYXBwbGlj
YXRpb24gaXMgbW9yZSBjb21tb24gdG8gZGVmaW5lIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgYXMK
KyAgICBwYXJ0IG9mIGEgcGFnZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxzY3JpcHQgdHlwZT0n
dGV4dC94LWhhbmRsZWJhcnMnIGRhdGEtdGVtcGxhdGUtbmFtZT0nc29tZS10ZW1wbGF0ZSc+Cisg
ICAgICBIZWxsbworICAgIDwvc2NyaXB0PgorICAgIGBgYAorICAKKyAgICBBbmQgYXNzb2NpYXRl
IGl0IGJ5IG5hbWUgdXNpbmcgYSB2aWV3J3MgYHRlbXBsYXRlTmFtZWAgcHJvcGVydHk6CisgIAor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAg
IHRlbXBsYXRlTmFtZTogJ3NvbWUtdGVtcGxhdGUnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IElmIHlvdSBoYXZlIG5lc3RlZCByb3V0ZXMsIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxs
IGxvb2sgbGlrZSB0aGlzOgorICAKKyAgICBgYGBodG1sCisgICAgPHNjcmlwdCB0eXBlPSd0ZXh0
L3gtaGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdwb3N0cy9uZXcnPgorICAgICAgPGgx
Pk5ldyBQb3N0PC9oMT4KKyAgICA8L3NjcmlwdD4KKyAgICBgYGAKKyAgCisgICAgQW5kIGB0ZW1w
bGF0ZU5hbWVgIHByb3BlcnR5OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZU5hbWU6ICdwb3N0cy9uZXcnCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFVzaW5nIGEgdmFsdWUgZm9yIGB0ZW1wbGF0ZU5hbWVgIHRo
YXQgZG9lcyBub3QgaGF2ZSBhIHRlbXBsYXRlCisgICAgd2l0aCBhIG1hdGNoaW5nIGBkYXRhLXRl
bXBsYXRlLW5hbWVgIGF0dHJpYnV0ZSB3aWxsIHRocm93IGFuIGVycm9yLgorICAKKyAgICBGb3Ig
dmlld3MgY2xhc3NlcyB0aGF0IG1heSBoYXZlIGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5n
LiBhcyB0aGUgYmxvY2sKKyAgICBwb3J0aW9uIG9mIGEgYHt7dmlld319YCBoZWxwZXIgY2FsbCBp
biBhbm90aGVyIHRlbXBsYXRlIG9yIGluCisgICAgYSBzdWJjbGFzcyksIHlvdSBjYW4gcHJvdmlk
ZSBhIGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5IHNldCB0byBjb21waWxlZAorICAgIHRlbXBs
YXRlIGZ1bmN0aW9uLiBJZiBhIHRlbXBsYXRlIGlzIG5vdCBsYXRlciBwcm92aWRlZCBmb3IgdGhl
IHZpZXcgaW5zdGFuY2UKKyAgICB0aGUgYGRlZmF1bHRUZW1wbGF0ZWAgdmFsdWUgd2lsbCBiZSB1
c2VkOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVu
ZCh7CisgICAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhUTUxCYXJzLmNvbXBpbGUoJ0kgd2Fz
IHRoZSBkZWZhdWx0JyksCisgICAgICB0ZW1wbGF0ZTogbnVsbCwKKyAgICAgIHRlbXBsYXRlTmFt
ZTogbnVsbAorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiBpbnN0YW5j
ZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAg
PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIGRlZmF1bHQ8L2Rp
dj4KKyAgICBgYGAKKyAgCisgICAgSWYgYSBgdGVtcGxhdGVgIG9yIGB0ZW1wbGF0ZU5hbWVgIGlz
IHByb3ZpZGVkIGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyAgICBgZGVmYXVsdFRlbXBs
YXRlYDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCdJIHdh
cyB0aGUgZGVmYXVsdCcpCisgICAgfSk7CisgIAorICAgIGFWaWV3ID0gQVZpZXcuY3JlYXRlKHsK
KyAgICAgIHRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCdJIHdhcyB0aGUgdGVtcGxh
dGUsIG5vdCBkZWZhdWx0JykKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQg
aW4gdGhlIGZvbGxvd2luZyBIVE1MIHJlcHJlc2VudGF0aW9uIHdoZW4gcmVuZGVyZWQ6CisgIAor
ICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIHdh
cyB0aGUgdGVtcGxhdGUsIG5vdCBkZWZhdWx0PC9kaXY+CisgICAgYGBgCisgIAorICAgICMjIFZp
ZXcgQ29udGV4dAorICAKKyAgICBUaGUgZGVmYXVsdCBjb250ZXh0IG9mIHRoZSBjb21waWxlZCB0
ZW1wbGF0ZSBpcyB0aGUgdmlldydzIGNvbnRyb2xsZXI6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRlbXBsYXRlOiBFbWJlci5I
VE1MQmFycy5jb21waWxlKCdIZWxsbyB7e2V4Y2l0ZWRHcmVldGluZ319JykKKyAgICB9KTsKKyAg
CisgICAgYUNvbnRyb2xsZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIGZpcnN0TmFt
ZTogJ0JhcnJ5JywKKyAgICAgIGV4Y2l0ZWRHcmVldGluZzogRW1iZXIuY29tcHV0ZWQoJ2NvbnRl
bnQuZmlyc3ROYW1lJywgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29u
dGVudC5maXJzdE5hbWUnKSArICchISEnOworICAgICAgfSkKKyAgICB9KTsKKyAgCisgICAgYVZp
ZXcgPSBBVmlldy5jcmVhdGUoeworICAgICAgY29udHJvbGxlcjogYUNvbnRyb2xsZXIKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gYW4gSFRNTCByZXByZXNlbnRhdGlv
biBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXciPkhlbGxvIEJhcnJ5ISEhPC9kaXY+CisgICAgYGBgCisgIAorICAgIEEgY29udGV4dCBj
YW4gYWxzbyBiZSBleHBsaWNpdGx5IHN1cHBsaWVkIHRocm91Z2ggdGhlIHZpZXcncyBgY29udGV4
dGAKKyAgICBwcm9wZXJ0eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5vciBg
Y29udHJvbGxlcmAgcHJvcGVydGllcywgdGhlCisgICAgYHBhcmVudFZpZXdgJ3MgY29udGV4dCB3
aWxsIGJlIHVzZWQuCisgIAorICAgICMjIExheW91dHMKKyAgCisgICAgVmlld3MgY2FuIGhhdmUg
YSBzZWNvbmRhcnkgdGVtcGxhdGUgdGhhdCB3cmFwcyB0aGVpciBtYWluIHRlbXBsYXRlLiBMaWtl
CisgICAgcHJpbWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0
ICBhY2NlcHRzIGFuIG9wdGlvbmFsCisgICAgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMg
YSBzdHJpbmcgb2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW5zaWRlCisgICAgdmlldydz
IHRhZy4gVmlld3Mgd2hvc2UgSFRNTCBlbGVtZW50IGlzIHNlbGYgY2xvc2luZyAoZS5nLiBgPGlu
cHV0IC8+YCkKKyAgICBjYW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBwcm9wZXJ0eSB3aWxs
IGJlIGlnbm9yZWQuCisgIAorICAgIE1vc3QgdHlwaWNhbGx5IGluIEVtYmVyIGEgbGF5b3V0IHdp
bGwgYmUgYSBjb21waWxlZCB0ZW1wbGF0ZS4KKyAgCisgICAgQSB2aWV3J3MgbGF5b3V0IGNhbiBi
ZSBzZXQgZGlyZWN0bHkgd2l0aCB0aGUgYGxheW91dGAgcHJvcGVydHkgb3IgcmVmZXJlbmNlCisg
ICAgYW4gZXhpc3RpbmcgdGVtcGxhdGUgYnkgbmFtZSB3aXRoIHRoZSBgbGF5b3V0TmFtZWAgcHJv
cGVydHkuCisgIAorICAgIEEgdGVtcGxhdGUgdXNlZCBhcyBhIGxheW91dCBtdXN0IGNvbnRhaW4g
YSBzaW5nbGUgdXNlIG9mIHRoZQorICAgIGB7e3lpZWxkfX1gIGhlbHBlci4gVGhlIEhUTUwgY29u
dGVudHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQgYHRlbXBsYXRlYCB3aWxsIGJlCisgICAgaW5zZXJ0
ZWQgYXQgdGhpcyBsb2NhdGlvbjoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFWaWV3V2l0
aExheW91dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGxheW91dDogRW1iZXIuSFRNTEJh
cnMuY29tcGlsZSgiPGRpdiBjbGFzcz0nbXktZGVjb3JhdGl2ZS1jbGFzcyc+e3t5aWVsZH19PC9k
aXY+IiksCisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSFRNTEJhcnMuY29tcGlsZSgiSSBnb3Qgd3Jh
cHBlZCIpCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5z
dGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAor
ICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgPGRpdiBjbGFz
cz0ibXktZGVjb3JhdGl2ZS1jbGFzcyI+CisgICAgICAgIEkgZ290IHdyYXBwZWQKKyAgICAgIDwv
ZGl2PgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBTZWUgW0VtYmVyLlRlbXBsYXRlcy5o
ZWxwZXJzLnlpZWxkXSgvYXBpL2NsYXNzZXMvRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaHRtbCNt
ZXRob2RfeWllbGQpCisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIAorICAgICMjIFJlc3Bv
bmRpbmcgdG8gQnJvd3NlciBFdmVudHMKKyAgCisgICAgVmlld3MgY2FuIHJlc3BvbmQgdG8gdXNl
ci1pbml0aWF0ZWQgZXZlbnRzIGluIG9uZSBvZiB0aHJlZSB3YXlzOiBtZXRob2QKKyAgICBpbXBs
ZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5hZ2VyLCBhbmQgdGhyb3VnaCBge3thY3Rp
b259fWAgaGVscGVyIHVzZQorICAgIGluIHRoZWlyIHRlbXBsYXRlIG9yIGxheW91dC4KKyAgCisg
ICAgIyMjIE1ldGhvZCBJbXBsZW1lbnRhdGlvbgorICAKKyAgICBWaWV3cyBjYW4gcmVzcG9uZCB0
byB1c2VyLWluaXRpYXRlZCBldmVudHMgYnkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIHRoYXQKKyAg
ICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJl
IHBhc3NlZCBhcyB0aGUKKyAgICBhcmd1bWVudCB0byB0aGlzIG1ldGhvZC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgY2xpY2s6
IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaW5z
dGFuY2UncworICAgICAgICAvLyByZW5kZXJlZCBlbGVtZW50IGlzIGNsaWNrZWQKKyAgICAgIH0K
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgIyMjIEV2ZW50IE1hbmFnZXJzCisgIAorICAgIFZp
ZXdzIGNhbiBkZWZpbmUgYW4gb2JqZWN0IGFzIHRoZWlyIGBldmVudE1hbmFnZXJgIHByb3BlcnR5
LiBUaGlzIG9iamVjdCBjYW4KKyAgICB0aGVuIGltcGxlbWVudCBtZXRob2RzIHRoYXQgbWF0Y2gg
dGhlIGRlc2lyZWQgZXZlbnQgbmFtZXMuIE1hdGNoaW5nIGV2ZW50cworICAgIHRoYXQgb2NjdXIg
b24gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MIG9yIHRoZSByZW5kZXJlZCBIVE1MIG9mIGFueSBv
ZiBpdHMgRE9NCisgICAgZGVzY2VuZGFudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbWV0aG9kLiBBIGBq
UXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJlIHBhc3NlZAorICAgIGFzIHRoZSBmaXJzdCBhcmd1
bWVudCB0byB0aGUgbWV0aG9kIGFuZCBhbiAgYEVtYmVyLlZpZXdgIG9iamVjdCBhcyB0aGUKKyAg
ICBzZWNvbmQuIFRoZSBgRW1iZXIuVmlld2Agd2lsbCBiZSB0aGUgdmlldyB3aG9zZSByZW5kZXJl
ZCBIVE1MIHdhcyBpbnRlcmFjdGVkCisgICAgd2l0aC4gVGhpcyBtYXkgYmUgdGhlIHZpZXcgd2l0
aCB0aGUgYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgb3Igb25lIG9mIGl0cworICAgIGRlc2NlbmRh
bnQgdmlld3MuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKKyAgICAgIGV2ZW50TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAg
ICAgIGRvdWJsZUNsaWNrOiBmdW5jdGlvbihldmVudCwgdmlldykgeworICAgICAgICAgIC8vIHdp
bGwgYmUgY2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UncworICAgICAgICAgIC8vIHJlbmRlcmVkIGVs
ZW1lbnQgb3IgYW55IHJlbmRlcmluZworICAgICAgICAgIC8vIG9mIHRoaXMgdmlldydzIGRlc2Nl
bmRhbnQKKyAgICAgICAgICAvLyBlbGVtZW50cyBpcyBjbGlja2VkCisgICAgICAgIH0KKyAgICAg
IH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEFuIGV2ZW50IGRlZmluZWQgZm9yIGFuIGV2
ZW50IG1hbmFnZXIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZW50cyBvZiB0aGUKKyAgICBzYW1l
IG5hbWUgaGFuZGxlZCB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIHZpZXcuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIG1vdXNlRW50
ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgbmV2ZXIgdHJpZ2dlci4KKyAg
ICAgIH0sCisgICAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgICAg
ICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCwgdmlldykgeworICAgICAgICAgIC8vIHRha2Vz
IHByZWNlZGVuY2Ugb3ZlciBBVmlldyNtb3VzZUVudGVyCisgICAgICAgIH0KKyAgICAgIH0pCisg
ICAgfSk7CisgICAgYGBgCisgIAorICAgIFNpbWlsYXJseSBhIHZpZXcncyBldmVudCBtYW5hZ2Vy
IHdpbGwgdGFrZSBwcmVjZWRlbmNlIGZvciBldmVudHMgb2YgYW55IHZpZXdzCisgICAgcmVuZGVy
ZWQgYXMgYSBkZXNjZW5kYW50LiBBIG1ldGhvZCBuYW1lIHRoYXQgbWF0Y2hlcyBhbiBldmVudCBu
YW1lIHdpbGwgbm90CisgICAgYmUgY2FsbGVkIGlmIHRoZSB2aWV3IGluc3RhbmNlIHdhcyByZW5k
ZXJlZCBpbnNpZGUgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YKKyAgICBhIHZpZXcgdGhhdCBo
YXMgYW4gYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgZGVmaW5lZCB0aGF0IGhhbmRsZXMgZXZlbnRz
IG9mIHRoZQorICAgIG5hbWUuIEV2ZW50cyBub3QgaGFuZGxlZCBieSB0aGUgZXZlbnQgbWFuYWdl
ciB3aWxsIHN0aWxsIHRyaWdnZXIgbWV0aG9kIGNhbGxzCisgICAgb24gdGhlIGRlc2NlbmRhbnQu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24u
Y3JlYXRlKCk7CisgICAgQXBwLk91dGVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAg
IHRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCJvdXRlciB7eyN2aWV3ICdpbm5lcid9
fWlubmVye3svdmlld319IG91dGVyIiksCisgICAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVj
dC5jcmVhdGUoeworICAgICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCwgdmlldykgewor
ICAgICAgICAgIC8vIHZpZXcgbWlnaHQgYmUgaW5zdGFuY2Ugb2YgZWl0aGVyCisgICAgICAgICAg
Ly8gT3V0ZXJWaWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcgb24KKyAgICAgICAgICAvLyB3aGVy
ZSBvbiB0aGUgcGFnZSB0aGUgdXNlciBpbnRlcmFjdGlvbiBvY2N1cnJlZAorICAgICAgICB9Cisg
ICAgICB9KQorICAgIH0pOworICAKKyAgICBBcHAuSW5uZXJWaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgY2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgYmUg
Y2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQorICAgICAgICAvLyBhbiBPdXRlclZpZXcgYmVjYXVz
ZSBPdXRlclZpZXcncworICAgICAgICAvLyBldmVudE1hbmFnZXIgZG9lc24ndCBoYW5kbGUgY2xp
Y2sgZXZlbnRzCisgICAgICB9LAorICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsK
KyAgICAgICAgLy8gd2lsbCBuZXZlciBiZSBjYWxsZWQgaWYgcmVuZGVyZWQgaW5zaWRlCisgICAg
ICAgIC8vIGFuIE91dGVyVmlldy4KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAg
IyMjIGB7e2FjdGlvbn19YCBIZWxwZXIKKyAgCisgICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVs
cGVycy5hY3Rpb25dKC9hcGkvY2xhc3Nlcy9FbWJlci5UZW1wbGF0ZXMuaGVscGVycy5odG1sI21l
dGhvZF9hY3Rpb24pLgorICAKKyAgICAjIyMgRXZlbnQgTmFtZXMKKyAgCisgICAgQWxsIG9mIHRo
ZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVzIGRlc2NyaWJlZCBhYm92ZSByZXNwb25kIHRvIHRo
ZSBzYW1lIHNldAorICAgIG9mIGV2ZW50cy4gVGhlIG5hbWVzIG9mIHRoZSBidWlsdC1pbiBldmVu
dHMgYXJlIGxpc3RlZCBiZWxvdy4gKFRoZSBoYXNoIG9mCisgICAgYnVpbHQtaW4gZXZlbnRzIGV4
aXN0cyBpbiBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYC4pIEFkZGl0aW9uYWwsIGN1c3RvbSBldmVu
dHMKKyAgICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2luZyBgRW1iZXIuQXBwbGljYXRpb24uY3Vz
dG9tRXZlbnRzYC4KKyAgCisgICAgVG91Y2ggZXZlbnRzOgorICAKKyAgICAqIGB0b3VjaFN0YXJ0
YAorICAgICogYHRvdWNoTW92ZWAKKyAgICAqIGB0b3VjaEVuZGAKKyAgICAqIGB0b3VjaENhbmNl
bGAKKyAgCisgICAgS2V5Ym9hcmQgZXZlbnRzCisgIAorICAgICogYGtleURvd25gCisgICAgKiBg
a2V5VXBgCisgICAgKiBga2V5UHJlc3NgCisgIAorICAgIE1vdXNlIGV2ZW50cworICAKKyAgICAq
IGBtb3VzZURvd25gCisgICAgKiBgbW91c2VVcGAKKyAgICAqIGBjb250ZXh0TWVudWAKKyAgICAq
IGBjbGlja2AKKyAgICAqIGBkb3VibGVDbGlja2AKKyAgICAqIGBtb3VzZU1vdmVgCisgICAgKiBg
Zm9jdXNJbmAKKyAgICAqIGBmb2N1c091dGAKKyAgICAqIGBtb3VzZUVudGVyYAorICAgICogYG1v
dXNlTGVhdmVgCisgIAorICAgIEZvcm0gZXZlbnRzOgorICAKKyAgICAqIGBzdWJtaXRgCisgICAg
KiBgY2hhbmdlYAorICAgICogYGZvY3VzSW5gCisgICAgKiBgZm9jdXNPdXRgCisgICAgKiBgaW5w
dXRgCisgIAorICAgIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOgorICAKKyAgICAqIGBkcmFn
U3RhcnRgCisgICAgKiBgZHJhZ2AKKyAgICAqIGBkcmFnRW50ZXJgCisgICAgKiBgZHJhZ0xlYXZl
YAorICAgICogYGRyYWdPdmVyYAorICAgICogYGRyYWdFbmRgCisgICAgKiBgZHJvcGAKKyAgCisg
ICAgIyMgYHt7dmlld319YCBIZWxwZXIKKyAgCisgICAgT3RoZXIgYEVtYmVyLlZpZXdgIGluc3Rh
bmNlcyBjYW4gYmUgaW5jbHVkZWQgYXMgcGFydCBvZiBhIHZpZXcncyB0ZW1wbGF0ZSBieQorICAg
IHVzaW5nIHRoZSBge3t2aWV3fX1gIGhlbHBlci4gU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVy
cy52aWV3XSgvYXBpL2NsYXNzZXMvRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaHRtbCNtZXRob2Rf
dmlldykKKyAgICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgCisgICAgQGNsYXNzIFZp
ZXcKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuQ29yZVZpZXcKKyAg
ICBAZGVwcmVjYXRlZCBTZWUgaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92MS54LyN0
b2NfZW1iZXItdmlldworICAgIEB1c2VzIEVtYmVyLlZpZXdTdXBwb3J0CisgICAgQHVzZXMgRW1i
ZXIuVmlld0NvbnRleHRTdXBwb3J0CisgICAgQHVzZXMgRW1iZXIuVmlld0NoaWxkVmlld3NTdXBw
b3J0CisgICAgQHVzZXMgRW1iZXIuVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0CisgICAgQHVzZXMg
RW1iZXIuQ2xhc3NOYW1lc1N1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5BdHRyaWJ1dGVCaW5kaW5n
c1N1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5MZWdhY3lWaWV3U3VwcG9ydAorICAgIEB1c2VzIEVt
YmVyLkluc3RydW1lbnRhdGlvblN1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5WaXNpYmlsaXR5U3Vw
cG9ydAorICAgIEB1c2VzIEVtYmVyLkFyaWFSb2xlU3VwcG9ydAorICAgIEBwdWJsaWMKKyAgKi8K
KyAgLy8ganNjczpkaXNhYmxlIHZhbGlkYXRlSW5kZW50YXRpb24KKyAgdmFyIFZpZXcgPSBfZW1i
ZXJWaWV3c1ZpZXdzQ29yZV92aWV3LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclZpZXdzTWl4aW5zVmll
d19jb250ZXh0X3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNWaWV3X2NoaWxkX3Zp
ZXdzX3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNMZWdhY3lfY2hpbGRfdmlld3Nf
c3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1ZpZXdfc3RhdGVfc3VwcG9ydC5kZWZh
dWx0LCBfZW1iZXJWaWV3c01peGluc1RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0LmRlZmF1bHQs
IF9lbWJlclZpZXdzTWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3
c01peGluc0xlZ2FjeV92aWV3X3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNJbnN0
cnVtZW50YXRpb25fc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1Zpc2liaWxpdHlf
c3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkuZGVmYXVsdCwgX2Vt
YmVyVmlld3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGlu
c1ZpZXdfc3VwcG9ydC5kZWZhdWx0LCB7CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAg
dGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKCF0aGlzLl92
aWV3UmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5fdmlld1JlZ2lzdHJ5ID0gVmlldy52aWV3czsK
KyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBHaXZlbiBhIHByb3BlcnR5IG5hbWUs
IHJldHVybnMgYSBkYXNoZXJpemVkIHZlcnNpb24gb2YgdGhhdAorICAgICAgcHJvcGVydHkgbmFt
ZSBpZiB0aGUgcHJvcGVydHkgZXZhbHVhdGVzIHRvIGEgbm9uLWZhbHN5IHZhbHVlLgorICAgICAg
IEZvciBleGFtcGxlLCBpZiB0aGUgdmlldyBoYXMgcHJvcGVydHkgYGlzVXJnZW50YCB0aGF0IGV2
YWx1YXRlcyB0byB0cnVlLAorICAgICAgcGFzc2luZyBgaXNVcmdlbnRgIHRvIHRoaXMgbWV0aG9k
IHdpbGwgcmV0dXJuIGAiaXMtdXJnZW50ImAuCisgICAgICAgQG1ldGhvZCBfY2xhc3NTdHJpbmdG
b3JQcm9wZXJ0eQorICAgICAgQHBhcmFtIHByb3BlcnR5CisgICAgICBAcHJpdmF0ZQorICAgICov
CisgICAgX2NsYXNzU3RyaW5nRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChwYXJzZWRQYXRoKSB7Cisg
ICAgICByZXR1cm4gVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXJzZWRQYXRoLnBhdGgsIHBh
cnNlZFBhdGguc3RyZWFtLnZhbHVlKCksIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRo
LmZhbHN5Q2xhc3NOYW1lKTsKKyAgICB9CisgIH0pOworCisgIC8vIGpzY3M6ZW5hYmxlIHZhbGlk
YXRlSW5kZW50YXRpb24KKworICAvKgorICAgIERlc2NyaWJlIGhvdyB0aGUgc3BlY2lmaWVkIGFj
dGlvbnMgc2hvdWxkIGJlaGF2ZSBpbiB0aGUgdmFyaW91cworICAgIHN0YXRlcyB0aGF0IGEgdmll
dyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKKyAgCisgICAgKiBwcmVSZW5kZXI6IHdo
ZW4gYSB2aWV3IGlzIGZpcnN0IGluc3RhbnRpYXRlZCwgYW5kIGFmdGVyIGl0cworICAgICAgZWxl
bWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0aGUgcHJlUmVuZGVyIHN0YXRlCisgICAgKiBp
bkJ1ZmZlcjogb25jZSBhIHZpZXcgaGFzIGJlZW4gcmVuZGVyZWQsIGJ1dCBiZWZvcmUgaXQgaGFz
CisgICAgICBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSwgaXQgaXMgaW4gdGhlIGluQnVmZmVy
IHN0YXRlCisgICAgKiBoYXNFbGVtZW50OiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2
aWV3IGlzIGNyZWF0ZWQsCisgICAgICBhbmQgaXMgcmVhZHkgdG8gYmUgaW5zZXJ0ZWQKKyAgICAq
IGluRE9NOiBvbmNlIGEgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBET00gaXQgaXMg
aW4KKyAgICAgIHRoZSBpbkRPTSBzdGF0ZS4gQSB2aWV3IHNwZW5kcyB0aGUgdmFzdCBtYWpvcml0
eSBvZiBpdHMKKyAgICAgIGV4aXN0ZW5jZSBpbiB0aGlzIHN0YXRlLgorICAgICogZGVzdHJveWVk
OiBvbmNlIGEgdmlldyBoYXMgYmVlbiBkZXN0cm95ZWQgKHVzaW5nIHRoZSBkZXN0cm95CisgICAg
ICBtZXRob2QpLCBpdCBpcyBpbiB0aGlzIHN0YXRlLiBObyBmdXJ0aGVyIGFjdGlvbnMgY2FuIGJl
IGludm9rZWQKKyAgICAgIG9uIGEgZGVzdHJveWVkIHZpZXcuCisgICovCisKKyAgLy8gaW4gdGhl
IGRlc3Ryb3llZCBzdGF0ZSwgZXZlcnl0aGluZyBpcyBpbGxlZ2FsCisKKyAgLy8gYmVmb3JlIHJl
bmRlcmluZyBoYXMgYmVndW4sIGFsbCBsZWdhbCBtYW5pcHVsYXRpb25zIGFyZSBub29wcy4KKwor
ICAvLyBpbnNpZGUgdGhlIGJ1ZmZlciwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgZG9uZSBvbiB0
aGUgYnVmZmVyCisKKyAgLy8gb25jZSB0aGUgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRo
ZSBET00sIGxlZ2FsIG1hbmlwdWxhdGlvbnMKKyAgLy8gYXJlIGRvbmUgb24gdGhlIERPTSBlbGVt
ZW50LgorCisgIFZpZXcucmVvcGVuQ2xhc3MoeworICAgIC8qKgorICAgICAgR2xvYmFsIHZpZXdz
IGhhc2gKKyAgICAgICBAcHJvcGVydHkgdmlld3MKKyAgICAgIEBzdGF0aWMKKyAgICAgIEB0eXBl
IE9iamVjdAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHZpZXdzOiB7fQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBWaWV3OworICBleHBvcnRzLlZpZXdDb250ZXh0U3VwcG9ydCA9
IF9lbWJlclZpZXdzTWl4aW5zVmlld19jb250ZXh0X3N1cHBvcnQuZGVmYXVsdDsKKyAgZXhwb3J0
cy5WaWV3Q2hpbGRWaWV3c1N1cHBvcnQgPSBfZW1iZXJWaWV3c01peGluc1ZpZXdfY2hpbGRfdmll
d3Nfc3VwcG9ydC5kZWZhdWx0OworICBleHBvcnRzLlZpZXdTdGF0ZVN1cHBvcnQgPSBfZW1iZXJW
aWV3c01peGluc1ZpZXdfc3RhdGVfc3VwcG9ydC5kZWZhdWx0OworICBleHBvcnRzLlRlbXBsYXRl
UmVuZGVyaW5nU3VwcG9ydCA9IF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1
cHBvcnQuZGVmYXVsdDsKKyAgZXhwb3J0cy5DbGFzc05hbWVzU3VwcG9ydCA9IF9lbWJlclZpZXdz
TWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydC5kZWZhdWx0OworfSk7CisvLyBmb3IgdGhlIHNpZGUg
ZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5ydW4ucXVldWVzCitlbmlmZWQoJ2VtYmVyL2luZGV4
JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsJywgJ2VtYmVyLXJ1bnRpbWUnLCAnZW1iZXItdmll
d3MnLCAnZW1iZXItcm91dGluZycsICdlbWJlci1hcHBsaWNhdGlvbicsICdlbWJlci1leHRlbnNp
b24tc3VwcG9ydCcsICdlbWJlci1odG1sYmFycycsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzJywg
J2VtYmVyLXJvdXRpbmctdmlld3MnLCAncmVxdWlyZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9s
YXp5X2xvYWQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsLCBfZW1iZXJSdW50aW1l
LCBfZW1iZXJWaWV3cywgX2VtYmVyUm91dGluZywgX2VtYmVyQXBwbGljYXRpb24sIF9lbWJlckV4
dGVuc2lvblN1cHBvcnQsIF9lbWJlckh0bWxiYXJzLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnMsIF9l
bWJlclJvdXRpbmdWaWV3cywgX3JlcXVpcmUsIF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQp
IHsKKyAgLy8gcmVxdWlyZSB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGVhY2ggb2YgdGhlc2Ug
cGFja2FnZXMKKyAgLy8gdGhpcyBpcyBzbyB0aGF0IHRoZSBnbG9iYWwgZXhwb3J0cyBvY2N1ciBw
cm9wZXJseQorICAndXNlIHN0cmljdCc7CisKKyAgaWYgKF9yZXF1aXJlLmhhcygnZW1iZXItdGVt
cGxhdGUtY29tcGlsZXInKSkgeworICAgIF9yZXF1aXJlLmRlZmF1bHQoJ2VtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyJyk7CisgIH0KKworICAvLyBkbyB0aGlzIHRvIGVuc3VyZSB0aGF0IEVtYmVyLlRl
c3QgaXMgZGVmaW5lZCBwcm9wZXJseSBvbiB0aGUgZ2xvYmFsCisgIC8vIGlmIGl0IGlzIHByZXNl
bnQuCisgIGlmIChfcmVxdWlyZS5oYXMoJ2VtYmVyLXRlc3RpbmcnKSkgeworICAgIF9yZXF1aXJl
LmRlZmF1bHQoJ2VtYmVyLXRlc3RpbmcnKTsKKyAgfQorCisgIF9lbWJlclJ1bnRpbWVTeXN0ZW1M
YXp5X2xvYWQucnVuTG9hZEhvb2tzKCdFbWJlcicpOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVy
CisgICovCit9KTsKK2VuaWZlZCgnaHRtbGJhcnMtcnVudGltZScsIFsnZXhwb3J0cycsICdodG1s
YmFycy1ydW50aW1lL2hvb2tzJywgJ2h0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyJywgJ2h0bWxiYXJz
LXV0aWwvbW9ycGgtdXRpbHMnLCAnaHRtbGJhcnMtdXRpbC90ZW1wbGF0ZS11dGlscyddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfaHRtbGJhcnNSdW50aW1lUmVu
ZGVyLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBpbnRlcm5hbCA9IHsKKyAgICBibG9ja0Zvcjog
X2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRpbHMuYmxvY2tGb3IsCisgICAgbWFudWFsRWxlbWVudDog
X2h0bWxiYXJzUnVudGltZVJlbmRlci5tYW51YWxFbGVtZW50LAorICAgIGhvc3RCbG9jazogX2h0
bWxiYXJzUnVudGltZUhvb2tzLmhvc3RCbG9jaywKKyAgICBjb250aW51ZUJsb2NrOiBfaHRtbGJh
cnNSdW50aW1lSG9va3MuY29udGludWVCbG9jaywKKyAgICBob3N0WWllbGRXaXRoU2hhZG93VGVt
cGxhdGU6IF9odG1sYmFyc1J1bnRpbWVIb29rcy5ob3N0WWllbGRXaXRoU2hhZG93VGVtcGxhdGUs
CisgICAgdmlzaXRDaGlsZHJlbjogX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMudmlzaXRDaGlsZHJl
biwKKyAgICB2YWxpZGF0ZUNoaWxkTW9ycGhzOiBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscy52YWxp
ZGF0ZUNoaWxkTW9ycGhzLAorICAgIGNsZWFyTW9ycGg6IF9odG1sYmFyc1V0aWxUZW1wbGF0ZVV0
aWxzLmNsZWFyTW9ycGgKKyAgfTsKKworICBleHBvcnRzLmhvb2tzID0gX2h0bWxiYXJzUnVudGlt
ZUhvb2tzLmRlZmF1bHQ7CisgIGV4cG9ydHMucmVuZGVyID0gX2h0bWxiYXJzUnVudGltZVJlbmRl
ci5kZWZhdWx0OworICBleHBvcnRzLmludGVybmFsID0gaW50ZXJuYWw7Cit9KTsKK2VuaWZlZCgn
aHRtbGJhcnMtcnVudGltZS9leHByZXNzaW9uLXZpc2l0b3InLCBbJ2V4cG9ydHMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMpIHsKKyAgLyoqCisgICAgIyBFeHByZXNzaW9uIE5vZGVzOgorICAKKyAgICBU
aGVzZSBub2RlcyBhcmUgbm90IGRpcmVjdGx5IHJlc3BvbnNpYmxlIGZvciBhbnkgcGFydCBvZiB0
aGUgRE9NLCBidXQgYXJlCisgICAgZXZlbnR1YWxseSBwYXNzZWQgdG8gYSBTdGF0ZW1lbnQgTm9k
ZS4KKyAgCisgICAgKiBnZXQKKyAgICAqIHN1YmV4cHIKKyAgICAqIGNvbmNhdAorICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmFjY2VwdFBhcmFtcyA9IGFjY2VwdFBhcmFtczsK
KyAgZXhwb3J0cy5hY2NlcHRIYXNoID0gYWNjZXB0SGFzaDsKKworICBmdW5jdGlvbiBhY2NlcHRQ
YXJhbXMobm9kZXMsIGVudiwgc2NvcGUpIHsKKyAgICB2YXIgYXJyYXkgPSBbXTsKKworICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBhcnJh
eS5wdXNoKGFjY2VwdEV4cHJlc3Npb24obm9kZXNbaV0sIGVudiwgc2NvcGUpLnZhbHVlKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gYXJyYXk7CisgIH0KKworICBmdW5jdGlvbiBhY2NlcHRIYXNoKHBh
aXJzLCBlbnYsIHNjb3BlKSB7CisgICAgdmFyIG9iamVjdCA9IHt9OworCisgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKKyAgICAgIHZhciBrZXkg
PSBwYWlyc1tpXTsKKyAgICAgIHZhciB2YWx1ZSA9IHBhaXJzW2kgKyAxXTsKKyAgICAgIG9iamVj
dFtrZXldID0gYWNjZXB0RXhwcmVzc2lvbih2YWx1ZSwgZW52LCBzY29wZSkudmFsdWU7CisgICAg
fQorCisgICAgcmV0dXJuIG9iamVjdDsKKyAgfQorCisgIGZ1bmN0aW9uIGFjY2VwdEV4cHJlc3Np
b24obm9kZSwgZW52LCBzY29wZSkgeworICAgIHZhciByZXQgPSB7IHZhbHVlOiBudWxsIH07CisK
KyAgICAvLyBQcmltaXRpdmUgbGl0ZXJhbHMgYXJlIHVuYW1iaWd1b3VzbHkgbm9uLWFycmF5IHJl
cHJlc2VudGF0aW9ucyBvZgorICAgIC8vIHRoZW1zZWx2ZXMuCisgICAgaWYgKHR5cGVvZiBub2Rl
ICE9PSAnb2JqZWN0JyB8fCBub2RlID09PSBudWxsKSB7CisgICAgICByZXQudmFsdWUgPSBub2Rl
OworICAgIH0gZWxzZSB7CisgICAgICByZXQudmFsdWUgPSBldmFsdWF0ZU5vZGUobm9kZSwgZW52
LCBzY29wZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGZ1bmN0aW9uIGV2
YWx1YXRlTm9kZShub2RlLCBlbnYsIHNjb3BlKSB7CisgICAgc3dpdGNoIChub2RlWzBdKSB7Cisg
ICAgICAvLyBjYW4gYmUgdXNlZCBieSBtYW51YWxFbGVtZW50CisgICAgICBjYXNlICd2YWx1ZSc6
CisgICAgICAgIHJldHVybiBub2RlWzFdOworICAgICAgY2FzZSAnZ2V0JzoKKyAgICAgICAgcmV0
dXJuIGV2YWx1YXRlR2V0KG5vZGUsIGVudiwgc2NvcGUpOworICAgICAgY2FzZSAnc3ViZXhwcic6
CisgICAgICAgIHJldHVybiBldmFsdWF0ZVN1YmV4cHIobm9kZSwgZW52LCBzY29wZSk7CisgICAg
ICBjYXNlICdjb25jYXQnOgorICAgICAgICByZXR1cm4gZXZhbHVhdGVDb25jYXQobm9kZSwgZW52
LCBzY29wZSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZXZhbHVhdGVHZXQobm9kZSwgZW52
LCBzY29wZSkgeworICAgIHZhciBwYXRoID0gbm9kZVsxXTsKKworICAgIHJldHVybiBlbnYuaG9v
a3MuZ2V0KGVudiwgc2NvcGUsIHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gZXZhbHVhdGVTdWJl
eHByKG5vZGUsIGVudiwgc2NvcGUpIHsKKyAgICB2YXIgcGF0aCA9IG5vZGVbMV07CisgICAgdmFy
IHJhd1BhcmFtcyA9IG5vZGVbMl07CisgICAgdmFyIHJhd0hhc2ggPSBub2RlWzNdOworCisgICAg
dmFyIHBhcmFtcyA9IGFjY2VwdFBhcmFtcyhyYXdQYXJhbXMsIGVudiwgc2NvcGUpOworICAgIHZh
ciBoYXNoID0gYWNjZXB0SGFzaChyYXdIYXNoLCBlbnYsIHNjb3BlKTsKKworICAgIHJldHVybiBl
bnYuaG9va3Muc3ViZXhwcihlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gpOworICB9CisK
KyAgZnVuY3Rpb24gZXZhbHVhdGVDb25jYXQobm9kZSwgZW52LCBzY29wZSkgeworICAgIHZhciBy
YXdQYXJ0cyA9IG5vZGVbMV07CisKKyAgICB2YXIgcGFydHMgPSBhY2NlcHRQYXJhbXMocmF3UGFy
dHMsIGVudiwgc2NvcGUpOworCisgICAgcmV0dXJuIGVudi5ob29rcy5jb25jYXQoZW52LCBwYXJ0
cyk7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFycy1ydW50aW1lL2hvb2tzIiwgWyJleHBvcnRz
IiwgImh0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyIiwgIm1vcnBoLXJhbmdlL21vcnBoLWxpc3QiLCAi
aHRtbGJhcnMtdXRpbC9vYmplY3QtdXRpbHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11dGlscyIs
ICJodG1sYmFycy11dGlsL3RlbXBsYXRlLXV0aWxzIl0sIGZ1bmN0aW9uIChleHBvcnRzLCBfaHRt
bGJhcnNSdW50aW1lUmVuZGVyLCBfbW9ycGhSYW5nZU1vcnBoTGlzdCwgX2h0bWxiYXJzVXRpbE9i
amVjdFV0aWxzLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzVXRpbFRlbXBsYXRl
VXRpbHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMud3JhcCA9IHdyYXA7CisgIGV4
cG9ydHMud3JhcEZvckhlbHBlciA9IHdyYXBGb3JIZWxwZXI7CisgIGV4cG9ydHMuY3JlYXRlU2Nv
cGUgPSBjcmVhdGVTY29wZTsKKyAgZXhwb3J0cy5jcmVhdGVGcmVzaFNjb3BlID0gY3JlYXRlRnJl
c2hTY29wZTsKKyAgZXhwb3J0cy5iaW5kU2hhZG93U2NvcGUgPSBiaW5kU2hhZG93U2NvcGU7Cisg
IGV4cG9ydHMuY3JlYXRlQ2hpbGRTY29wZSA9IGNyZWF0ZUNoaWxkU2NvcGU7CisgIGV4cG9ydHMu
YmluZFNlbGYgPSBiaW5kU2VsZjsKKyAgZXhwb3J0cy51cGRhdGVTZWxmID0gdXBkYXRlU2VsZjsK
KyAgZXhwb3J0cy5iaW5kTG9jYWwgPSBiaW5kTG9jYWw7CisgIGV4cG9ydHMudXBkYXRlTG9jYWwg
PSB1cGRhdGVMb2NhbDsKKyAgZXhwb3J0cy5iaW5kQmxvY2sgPSBiaW5kQmxvY2s7CisgIGV4cG9y
dHMuYmxvY2sgPSBibG9jazsKKyAgZXhwb3J0cy5jb250aW51ZUJsb2NrID0gY29udGludWVCbG9j
azsKKyAgZXhwb3J0cy5ob3N0QmxvY2sgPSBob3N0QmxvY2s7CisgIGV4cG9ydHMuaGFuZGxlUmVk
aXJlY3QgPSBoYW5kbGVSZWRpcmVjdDsKKyAgZXhwb3J0cy5oYW5kbGVLZXl3b3JkID0gaGFuZGxl
S2V5d29yZDsKKyAgZXhwb3J0cy5saW5rUmVuZGVyTm9kZSA9IGxpbmtSZW5kZXJOb2RlOworICBl
eHBvcnRzLmlubGluZSA9IGlubGluZTsKKyAgZXhwb3J0cy5rZXl3b3JkID0ga2V5d29yZDsKKyAg
ZXhwb3J0cy5pbnZva2VIZWxwZXIgPSBpbnZva2VIZWxwZXI7CisgIGV4cG9ydHMuY2xhc3NpZnkg
PSBjbGFzc2lmeTsKKyAgZXhwb3J0cy5wYXJ0aWFsID0gcGFydGlhbDsKKyAgZXhwb3J0cy5yYW5n
ZSA9IHJhbmdlOworICBleHBvcnRzLmVsZW1lbnQgPSBlbGVtZW50OworICBleHBvcnRzLmF0dHJp
YnV0ZSA9IGF0dHJpYnV0ZTsKKyAgZXhwb3J0cy5zdWJleHByID0gc3ViZXhwcjsKKyAgZXhwb3J0
cy5nZXQgPSBnZXQ7CisgIGV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7CisgIGV4cG9ydHMuZ2V0
QmxvY2sgPSBnZXRCbG9jazsKKyAgZXhwb3J0cy5nZXRDaGlsZCA9IGdldENoaWxkOworICBleHBv
cnRzLmdldFZhbHVlID0gZ2V0VmFsdWU7CisgIGV4cG9ydHMuZ2V0Q2VsbE9yVmFsdWUgPSBnZXRD
ZWxsT3JWYWx1ZTsKKyAgZXhwb3J0cy5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgIGV4cG9ydHMu
Y29uY2F0ID0gY29uY2F0OworICBleHBvcnRzLmhhc0hlbHBlciA9IGhhc0hlbHBlcjsKKyAgZXhw
b3J0cy5sb29rdXBIZWxwZXIgPSBsb29rdXBIZWxwZXI7CisgIGV4cG9ydHMuYmluZFNjb3BlID0g
YmluZFNjb3BlOworICBleHBvcnRzLnVwZGF0ZVNjb3BlID0gdXBkYXRlU2NvcGU7CisKKyAgLyoq
CisgICAgSFRNTEJhcnMgZGVsZWdhdGVzIHRoZSBydW50aW1lIGJlaGF2aW9yIG9mIGEgdGVtcGxh
dGUgdG8KKyAgICBob29rcyBwcm92aWRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudC4gVGhlc2Ug
aG9va3MgZXhwbGFpbgorICAgIHRoZSBsZXhpY2FsIGVudmlyb25tZW50IG9mIGEgSGFuZGxlYmFy
cyB0ZW1wbGF0ZSwgdGhlIGludGVybmFsCisgICAgcmVwcmVzZW50YXRpb24gb2YgcmVmZXJlbmNl
cywgYW5kIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFuCisgICAgSFRNTEJhcnMgdGVtcGxhdGUg
YW5kIHRoZSBET00gaXQgaXMgbWFuYWdpbmcuCisgIAorICAgIFdoaWxlIEhUTUxCYXJzIGhvc3Qg
aG9va3MgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoaXMgaW50ZXJuYWwKKyAgICBtYWNoaW5lcnks
IHRlbXBsYXRlcyBhbmQgaGVscGVycyBoYXZlIGFjY2VzcyB0byB0aGUgYWJzdHJhY3Rpb24KKyAg
ICBwcm92aWRlZCBieSB0aGUgaG9zdCBob29rcy4KKyAgCisgICAgIyMgVGhlIExleGljYWwgRW52
aXJvbm1lbnQKKyAgCisgICAgVGhlIGRlZmF1bHQgbGV4aWNhbCBlbnZpcm9ubWVudCBvZiBhbiBI
VE1MQmFycyB0ZW1wbGF0ZSBpbmNsdWRlczoKKyAgCisgICAgKiBBbnkgbG9jYWwgdmFyaWFibGVz
LCBwcm92aWRlZCBieSAqYmxvY2sgYXJndW1lbnRzKgorICAgICogVGhlIGN1cnJlbnQgdmFsdWUg
b2YgYHNlbGZgCisgIAorICAgICMjIFNpbXBsZSBOZXN0aW5nCisgIAorICAgIExldCdzIGxvb2sg
YXQgYSBzaW1wbGUgdGVtcGxhdGUgd2l0aCBhIG5lc3RlZCBibG9jazoKKyAgCisgICAgYGBgaGJz
CisgICAgPGgxPnt7dGl0bGV9fTwvaDE+CisgIAorICAgIHt7I2lmIGF1dGhvcn19CisgICAgICA8
cCBjbGFzcz0iYnlsaW5lIj57e2F1dGhvcn19PC9wPgorICAgIHt7L2lmfX0KKyAgICBgYGAKKyAg
CisgICAgSW4gdGhpcyBjYXNlLCB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudCBhdCB0aGUgdG9wLWxl
dmVsIG9mIHRoZQorICAgIHRlbXBsYXRlIGRvZXMgbm90IGNoYW5nZSBpbnNpZGUgb2YgdGhlIGBp
ZmAgYmxvY2suIFRoaXMgaXMKKyAgICBhY2hpZXZlZCB2aWEgYW4gaW1wbGVtZW50YXRpb24gb2Yg
YGlmYCB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKyAgCisgICAgYGBganMKKyAgICByZWdpc3Rlckhl
bHBlcignaWYnLCBmdW5jdGlvbihwYXJhbXMpIHsKKyAgICAgIGlmICghIXBhcmFtc1swXSkgewor
ICAgICAgICByZXR1cm4gdGhpcy55aWVsZCgpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAor
ICAKKyAgICBBIGNhbGwgdG8gYHRoaXMueWllbGRgIGludm9rZXMgdGhlIGNoaWxkIHRlbXBsYXRl
IHVzaW5nIHRoZQorICAgIGN1cnJlbnQgbGV4aWNhbCBlbnZpcm9ubWVudC4KKyAgCisgICAgIyMg
QmxvY2sgQXJndW1lbnRzCisgIAorICAgIEl0IGlzIHBvc3NpYmxlIGZvciBuZXN0ZWQgYmxvY2tz
IHRvIGludHJvZHVjZSBuZXcgbG9jYWwKKyAgICB2YXJpYWJsZXM6CisgIAorICAgIGBgYGhicwor
ICAgIHt7I2NvdW50LWNhbGxzIGFzIHxpfH19CisgICAgPGgxPnt7dGl0bGV9fTwvaDE+CisgICAg
PHA+Q2FsbGVkIHt7aX19IHRpbWVzPC9wPgorICAgIHt7L2NvdW50fX0KKyAgICBgYGAKKyAgCisg
ICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgY2hpbGQgYmxvY2sgaW5oZXJpdHMgaXRzIHN1cnJvdW5k
aW5nCisgICAgbGV4aWNhbCBlbnZpcm9ubWVudCwgYnV0IGF1Z21lbnRzIGl0IHdpdGggYSBzaW5n
bGUgbmV3CisgICAgdmFyaWFibGUgYmluZGluZy4KKyAgCisgICAgVGhlIGltcGxlbWVudGF0aW9u
IG9mIGBjb3VudC1jYWxsc2Agc3VwcGxpZXMgdGhlIHZhbHVlIG9mCisgICAgYGlgLCBidXQgZG9l
cyBub3Qgb3RoZXJ3aXNlIGFsdGVyIHRoZSBlbnZpcm9ubWVudDoKKyAgCisgICAgYGBganMKKyAg
ICB2YXIgY291bnQgPSAwOworICAgIHJlZ2lzdGVySGVscGVyKCdjb3VudC1jYWxscycsIGZ1bmN0
aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMueWllbGQoWyArK2NvdW50IF0pOworICAgIH0pOwor
ICAgIGBgYAorICAqLworCisgIGZ1bmN0aW9uIHdyYXAodGVtcGxhdGUpIHsKKyAgICBpZiAodGVt
cGxhdGUgPT09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVy
biB7CisgICAgICBtZXRhOiB0ZW1wbGF0ZS5tZXRhLAorICAgICAgYXJpdHk6IHRlbXBsYXRlLmFy
aXR5LAorICAgICAgcmF3OiB0ZW1wbGF0ZSwKKyAgICAgIHJlbmRlcjogZnVuY3Rpb24gKHNlbGYs
IGVudiwgb3B0aW9ucywgYmxvY2tBcmd1bWVudHMpIHsKKyAgICAgICAgdmFyIHNjb3BlID0gZW52
Lmhvb2tzLmNyZWF0ZUZyZXNoU2NvcGUoKTsKKworICAgICAgICB2YXIgY29udGV4dHVhbEVsZW1l
bnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dHVhbEVsZW1lbnQ7CisgICAgICAgIHZhciBy
ZW5kZXJPcHRpb25zID0gbmV3IF9odG1sYmFyc1J1bnRpbWVSZW5kZXIuUmVuZGVyT3B0aW9ucyhu
dWxsLCBzZWxmLCBibG9ja0FyZ3VtZW50cywgY29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICAg
IHJldHVybiBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUsIGVudiwgc2Nv
cGUsIHJlbmRlck9wdGlvbnMpOworICAgICAgfQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiB3
cmFwRm9ySGVscGVyKHRlbXBsYXRlLCBlbnYsIHNjb3BlLCBtb3JwaCwgcmVuZGVyU3RhdGUsIHZp
c2l0b3IpIHsKKyAgICBpZiAoIXRlbXBsYXRlKSB7CisgICAgICByZXR1cm4ge307CisgICAgfQor
CisgICAgdmFyIHlpZWxkQXJncyA9IHlpZWxkVGVtcGxhdGUodGVtcGxhdGUsIGVudiwgc2NvcGUs
IG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcik7CisKKyAgICByZXR1cm4geworICAgICAgbWV0
YTogdGVtcGxhdGUubWV0YSwKKyAgICAgIGFyaXR5OiB0ZW1wbGF0ZS5hcml0eSwKKyAgICAgICd5
aWVsZCc6IHlpZWxkQXJncywgLy8gcXVvdGVkIHNpbmNlIGl0J3MgYSByZXNlcnZlZCB3b3JkLCBz
ZWUgaXNzdWUgIzQyMAorICAgICAgeWllbGRJdGVtOiB5aWVsZEl0ZW0odGVtcGxhdGUsIGVudiwg
c2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvciksCisgICAgICByYXc6IHRlbXBsYXRl
LAorCisgICAgICByZW5kZXI6IGZ1bmN0aW9uIChzZWxmLCBibG9ja0FyZ3VtZW50cykgeworICAg
ICAgICB5aWVsZEFyZ3MoYmxvY2tBcmd1bWVudHMsIHNlbGYpOworICAgICAgfQorICAgIH07Cisg
IH0KKworICAvLyBDYWxsZWQgYnkgYSB1c2VyLWxhbmQgaGVscGVyIHRvIHJlbmRlciBhIHRlbXBs
YXRlLgorICBmdW5jdGlvbiB5aWVsZFRlbXBsYXRlKHRlbXBsYXRlLCBlbnYsIHBhcmVudFNjb3Bl
LCBtb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3IpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKGJs
b2NrQXJndW1lbnRzLCBzZWxmKSB7CisgICAgICAvLyBSZW5kZXIgc3RhdGUgaXMgdXNlZCB0byB0
cmFjayB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGhlbHBlciAoc2luY2UgaXQKKyAgICAgIC8vIG1heSBj
YWxsIGludG8gdXMgbXVsdGlwbGUgdGltZXMpLiBBcyB0aGUgdXNlci1sYW5kIGhlbHBlciBjYWxs
cworICAgICAgLy8gaW50byBsaWJyYXJ5IGNvZGUsIHdlIHRyYWNrIHdoYXQgbmVlZHMgdG8gYmUg
Y2xlYW5lZCB1cCBhZnRlciB0aGUKKyAgICAgIC8vIGhlbHBlciBoYXMgcmV0dXJuZWQuCisgICAg
ICAvLworICAgICAgLy8gSGVyZSwgd2UgcmVtZW1iZXIgdGhhdCBhIHRlbXBsYXRlIGhhcyBiZWVu
IHlpZWxkZWQgYW5kIHNvIHdlIGRvIG5vdAorICAgICAgLy8gbmVlZCB0byByZW1vdmUgdGhlIHBy
ZXZpb3VzIHRlbXBsYXRlLiAoSWYgbm8gdGVtcGxhdGUgaXMgeWllbGRlZAorICAgICAgLy8gdGhp
cyByZW5kZXIgYnkgdGhlIGhlbHBlciwgd2UgYXNzdW1lIG5vdGhpbmcgc2hvdWxkIGJlIHNob3du
IGFuZAorICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyByZW5kZXJlZCB0ZW1wbGF0ZXMuKQor
ICAgICAgcmVuZGVyU3RhdGUubW9ycGhUb0NsZWFyID0gbnVsbDsKKworICAgICAgLy8gSW4gdGhp
cyBjb25kaXRpb25hbCBpcyB0cnVlLCBpdCBtZWFucyB0aGF0IG9uIHRoZSBwcmV2aW91cyByZW5k
ZXJpbmcgcGFzcworICAgICAgLy8gdGhlIGhlbHBlciB5aWVsZGVkIG11bHRpcGxlIGl0ZW1zIHZp
YSBgeWllbGRJdGVtKClgLCBidXQgdGhpcyB0aW1lIHRoZXkKKyAgICAgIC8vIGFyZSB5aWVsZGlu
ZyBhIHNpbmdsZSB0ZW1wbGF0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBtYXJrIHRoZSBtb3JwaCBsaXN0
IGZvcgorICAgICAgLy8gY2xlYW51cCBzbyBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4KKyAg
ICAgIGlmIChtb3JwaC5tb3JwaExpc3QpIHsKKyAgICAgICAgX2h0bWxiYXJzVXRpbFRlbXBsYXRl
VXRpbHMuY2xlYXJNb3JwaExpc3QobW9ycGgubW9ycGhMaXN0LCBtb3JwaCwgZW52KTsKKyAgICAg
ICAgcmVuZGVyU3RhdGUubW9ycGhMaXN0VG9DbGVhciA9IG51bGw7CisgICAgICB9CisKKyAgICAg
IHZhciBzY29wZSA9IHBhcmVudFNjb3BlOworCisgICAgICBpZiAobW9ycGgubGFzdFlpZWxkZWQg
JiYgaXNTdGFibGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgbW9ycGgubGFzdFlpZWxkZWQpKSB7CisgICAg
ICAgIHJldHVybiBtb3JwaC5sYXN0UmVzdWx0LnJldmFsaWRhdGVXaXRoKGVudiwgdW5kZWZpbmVk
LCBzZWxmLCBibG9ja0FyZ3VtZW50cywgdmlzaXRvcik7CisgICAgICB9CisKKyAgICAgIC8vIENo
ZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFjdHVhbGx5ICoqbmVlZCoqIGEgbmV3IHNjb3BlLCBh
bmQgY2FuJ3QKKyAgICAgIC8vIHNoYXJlIHRoZSBwYXJlbnQgc2NvcGUuIE5vdGUgdGhhdCB3ZSBu
ZWVkIHRvIG1vdmUgdGhpcyBjaGVjayBpbnRvCisgICAgICAvLyBhIGhvc3QgaG9vaywgYmVjYXVz
ZSB0aGUgaG9zdCdzIG5vdGlvbiBvZiBzY29wZSBtYXkgcmVxdWlyZSBhIG5ldworICAgICAgLy8g
c2NvcGUgaW4gbW9yZSBjYXNlcyB0aGFuIHRoZSBvbmVzIHdlIGNhbiBkZXRlcm1pbmUgc3RhdGlj
YWxseS4KKyAgICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQgfHwgcGFyZW50U2NvcGUgPT09IG51
bGwgfHwgdGVtcGxhdGUuYXJpdHkpIHsKKyAgICAgICAgc2NvcGUgPSBlbnYuaG9va3MuY3JlYXRl
Q2hpbGRTY29wZShwYXJlbnRTY29wZSk7CisgICAgICB9CisKKyAgICAgIG1vcnBoLmxhc3RZaWVs
ZGVkID0geyBzZWxmOiBzZWxmLCB0ZW1wbGF0ZTogdGVtcGxhdGUsIHNoYWRvd1RlbXBsYXRlOiBu
dWxsIH07CisKKyAgICAgIC8vIFJlbmRlciB0aGUgdGVtcGxhdGUgdGhhdCB3YXMgc2VsZWN0ZWQg
YnkgdGhlIGhlbHBlcgorICAgICAgdmFyIHJlbmRlck9wdGlvbnMgPSBuZXcgX2h0bWxiYXJzUnVu
dGltZVJlbmRlci5SZW5kZXJPcHRpb25zKG1vcnBoLCBzZWxmLCBibG9ja0FyZ3VtZW50cyk7Cisg
ICAgICBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUsIGVudiwgc2NvcGUs
IHJlbmRlck9wdGlvbnMpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB5aWVsZEl0ZW0odGVt
cGxhdGUsIGVudiwgcGFyZW50U2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcikgewor
ICAgIC8vIEluaXRpYWxpemUgc3RhdGUgdGhhdCB0cmFja3MgbXVsdGlwbGUgaXRlbXMgYmVpbmcK
KyAgICAvLyB5aWVsZGVkIGluLgorICAgIHZhciBjdXJyZW50TW9ycGggPSBudWxsOworCisgICAg
Ly8gQ2FuZGlkYXRlIG1vcnBocyBmb3IgZGVsZXRpb24uCisgICAgdmFyIGNhbmRpZGF0ZXMgPSB7
fTsKKworICAgIC8vIFJldXNlIGV4aXN0aW5nIE1vcnBoTGlzdCBpZiB0aGlzIGlzIG5vdCBhIGZp
cnN0LXRpbWUKKyAgICAvLyByZW5kZXIuCisgICAgdmFyIG1vcnBoTGlzdCA9IG1vcnBoLm1vcnBo
TGlzdDsKKyAgICBpZiAobW9ycGhMaXN0KSB7CisgICAgICBjdXJyZW50TW9ycGggPSBtb3JwaExp
c3QuZmlyc3RDaGlsZE1vcnBoOworICAgIH0KKworICAgIC8vIEFkdmFuY2VzIHRoZSBjdXJyZW50
TW9ycGggcG9pbnRlciB0byB0aGUgbW9ycGggaW4gdGhlIHByZXZpb3VzbHktcmVuZGVyZWQKKyAg
ICAvLyBsaXN0IHRoYXQgbWF0Y2hlcyB0aGUgeWllbGRlZCBrZXkuIFdoaWxlIGRvaW5nIHNvLCBp
dCBtYXJrcyBhbnkgbW9ycGhzCisgICAgLy8gdGhhdCBpdCBhZHZhbmNlcyBwYXN0IGFzIGNhbmRp
ZGF0ZXMgZm9yIGRlbGV0aW9uLiBBc3N1bWluZyB0aG9zZSBtb3JwaHMKKyAgICAvLyBhcmUgbm90
IHlpZWxkZWQgaW4gbGF0ZXIsIHRoZXkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBwcnVuZSBzdGVw
IGR1cmluZworICAgIC8vIGNsZWFudXAuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgaGVscGVyIGZ1
bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgbW9ycGggYmVpbmcgc2Vla2VkIHRvIGlzCisgICAgLy8g
Z3VhcmFudGVlZCB0byBleGlzdCBpbiB0aGUgcHJldmlvdXMgTW9ycGhMaXN0OyBpZiB0aGlzIGlz
IGNhbGxlZCBhbmQgdGhlCisgICAgLy8gbW9ycGggZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgcmVz
dWx0IGluIGFuIGluZmluaXRlIGxvb3AKKyAgICBmdW5jdGlvbiBhZHZhbmNlVG9LZXkoa2V5KSB7
CisgICAgICB2YXIgc2VlayA9IGN1cnJlbnRNb3JwaDsKKworICAgICAgd2hpbGUgKHNlZWsua2V5
ICE9PSBrZXkpIHsKKyAgICAgICAgY2FuZGlkYXRlc1tzZWVrLmtleV0gPSBzZWVrOworICAgICAg
ICBzZWVrID0gc2Vlay5uZXh0TW9ycGg7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnRNb3JwaCA9
IHNlZWsubmV4dE1vcnBoOworICAgICAgcmV0dXJuIHNlZWs7CisgICAgfQorCisgICAgcmV0dXJu
IGZ1bmN0aW9uIChfa2V5LCBibG9ja0FyZ3VtZW50cywgc2VsZikgeworICAgICAgaWYgKHR5cGVv
ZiBfa2V5ICE9PSAnc3RyaW5nJykgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0
IHByb3ZpZGUgYSBzdHJpbmcga2V5IHdoZW4gY2FsbGluZyBgeWllbGRJdGVtYDsgeW91IHByb3Zp
ZGVkICIgKyBfa2V5KTsKKyAgICAgIH0KKworICAgICAgLy8gQXQgbGVhc3Qgb25lIGl0ZW0gaGFz
IGJlZW4geWllbGRlZCwgc28gd2UgZG8gbm90IHdob2xlc2FsZQorICAgICAgLy8gY2xlYXIgdGhl
IGxhc3QgTW9ycGhMaXN0IGJ1dCBpbnN0ZWFkIGFwcGx5IGEgcHJ1bmUgb3BlcmF0aW9uLgorICAg
ICAgcmVuZGVyU3RhdGUubW9ycGhMaXN0VG9DbGVhciA9IG51bGw7CisgICAgICBtb3JwaC5sYXN0
WWllbGRlZCA9IG51bGw7CisKKyAgICAgIHZhciBtb3JwaExpc3QsIG1vcnBoTWFwOworCisgICAg
ICBpZiAoIW1vcnBoLm1vcnBoTGlzdCkgeworICAgICAgICBtb3JwaC5tb3JwaExpc3QgPSBuZXcg
X21vcnBoUmFuZ2VNb3JwaExpc3QuZGVmYXVsdCgpOworICAgICAgICBtb3JwaC5tb3JwaE1hcCA9
IHt9OworICAgICAgICBtb3JwaC5zZXRNb3JwaExpc3QobW9ycGgubW9ycGhMaXN0KTsKKyAgICAg
IH0KKworICAgICAgbW9ycGhMaXN0ID0gbW9ycGgubW9ycGhMaXN0OworICAgICAgbW9ycGhNYXAg
PSBtb3JwaC5tb3JwaE1hcDsKKworICAgICAgLy8gQSBtYXAgb2YgbW9ycGhzIHRoYXQgaGF2ZSBi
ZWVuIHlpZWxkZWQgaW4gb24gdGhpcworICAgICAgLy8gcmVuZGVyaW5nIHBhc3MuIEFueSBtb3Jw
aHMgdGhhdCBkbyBub3QgbWFrZSBpdCBpbnRvCisgICAgICAvLyB0aGlzIGxpc3Qgd2lsbCBiZSBw
cnVuZWQgZnJvbSB0aGUgTW9ycGhMaXN0IGR1cmluZyB0aGUgY2xlYW51cAorICAgICAgLy8gcHJv
Y2Vzcy4KKyAgICAgIHZhciBoYW5kbGVkTW9ycGhzID0gcmVuZGVyU3RhdGUuaGFuZGxlZE1vcnBo
czsKKyAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChfa2V5IGluIGhhbmRs
ZWRNb3JwaHMpIHsKKyAgICAgICAgLy8gSW4gdGhpcyBicmFuY2ggd2UgYXJlIGRlYWxpbmcgd2l0
aCBhIGR1cGxpY2F0ZSBrZXkuIFRoZSBzdHJhdGVneQorICAgICAgICAvLyBpcyB0byB0YWtlIHRo
ZSBvcmlnaW5hbCBrZXkgYW5kIGFwcGVuZCBhIGNvdW50ZXIgdG8gaXQgdGhhdCBpcworICAgICAg
ICAvLyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBrZXkgaXMgcmV1c2VkLiBJbiBvcmRlciB0
byBncmVhdGx5CisgICAgICAgIC8vIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGNvbGxpZGluZyB3aXRo
IGFub3RoZXIgdmFsaWQga2V5IHdlIGFsc28gYWRkCisgICAgICAgIC8vIGFuIGV4dHJhIHN0cmlu
ZyAiLS16OG1TMmh2RFcwQS0tIiB0byB0aGUgbmV3IGtleS4KKyAgICAgICAgdmFyIGNvbGxpc2lv
bnMgPSByZW5kZXJTdGF0ZS5jb2xsaXNpb25zOworICAgICAgICBpZiAoY29sbGlzaW9ucyA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICAgICAgY29sbGlzaW9ucyA9IHJlbmRlclN0YXRlLmNvbGxpc2lv
bnMgPSB7fTsKKyAgICAgICAgfQorICAgICAgICB2YXIgY291bnQgPSBjb2xsaXNpb25zW19rZXld
IHwgMDsKKyAgICAgICAgY29sbGlzaW9uc1tfa2V5XSA9ICsrY291bnQ7CisKKyAgICAgICAga2V5
ID0gX2tleSArICctLXo4bVMyaHZEVzBBLS0nICsgY291bnQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBrZXkgPSBfa2V5OworICAgICAgfQorCisgICAgICBpZiAoY3VycmVudE1vcnBoICYmIGN1
cnJlbnRNb3JwaC5rZXkgPT09IGtleSkgeworICAgICAgICB5aWVsZFRlbXBsYXRlKHRlbXBsYXRl
LCBlbnYsIHBhcmVudFNjb3BlLCBjdXJyZW50TW9ycGgsIHJlbmRlclN0YXRlLCB2aXNpdG9yKShi
bG9ja0FyZ3VtZW50cywgc2VsZik7CisgICAgICAgIGN1cnJlbnRNb3JwaCA9IGN1cnJlbnRNb3Jw
aC5uZXh0TW9ycGg7CisgICAgICAgIGhhbmRsZWRNb3JwaHNba2V5XSA9IGN1cnJlbnRNb3JwaDsK
KyAgICAgIH0gZWxzZSBpZiAobW9ycGhNYXBba2V5XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAg
IHZhciBmb3VuZE1vcnBoID0gbW9ycGhNYXBba2V5XTsKKworICAgICAgICBpZiAoa2V5IGluIGNh
bmRpZGF0ZXMpIHsKKyAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IHNhdyB0aGlzIG1vcnBoLCBt
b3ZlIGl0IGZvcndhcmQgdG8gdGhpcyBwb3NpdGlvbgorICAgICAgICAgIG1vcnBoTGlzdC5pbnNl
cnRCZWZvcmVNb3JwaChmb3VuZE1vcnBoLCBjdXJyZW50TW9ycGgpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIC8vIE90aGVyd2lzZSwgbW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkIHRvIHRo
ZSBleGlzdGluZyBtb3JwaCBmb3IgdGhpcyBrZXkKKyAgICAgICAgICBhZHZhbmNlVG9LZXkoa2V5
KTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWRNb3JwaHNbZm91bmRNb3JwaC5rZXldID0g
Zm91bmRNb3JwaDsKKyAgICAgICAgeWllbGRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZW52LCBwYXJlbnRT
Y29wZSwgZm91bmRNb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3IpKGJsb2NrQXJndW1lbnRzLCBz
ZWxmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjaGlsZE1vcnBoID0gX2h0bWxiYXJz
UnVudGltZVJlbmRlci5jcmVhdGVDaGlsZE1vcnBoKGVudi5kb20sIG1vcnBoKTsKKyAgICAgICAg
Y2hpbGRNb3JwaC5rZXkgPSBrZXk7CisgICAgICAgIG1vcnBoTWFwW2tleV0gPSBoYW5kbGVkTW9y
cGhzW2tleV0gPSBjaGlsZE1vcnBoOworICAgICAgICBtb3JwaExpc3QuaW5zZXJ0QmVmb3JlTW9y
cGgoY2hpbGRNb3JwaCwgY3VycmVudE1vcnBoKTsKKyAgICAgICAgeWllbGRUZW1wbGF0ZSh0ZW1w
bGF0ZSwgZW52LCBwYXJlbnRTY29wZSwgY2hpbGRNb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3Ip
KGJsb2NrQXJndW1lbnRzLCBzZWxmKTsKKyAgICAgIH0KKworICAgICAgcmVuZGVyU3RhdGUubW9y
cGhMaXN0VG9QcnVuZSA9IG1vcnBoTGlzdDsKKyAgICAgIG1vcnBoLmNoaWxkTm9kZXMgPSBudWxs
OworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBpc1N0YWJsZVRlbXBsYXRlKHRlbXBsYXRlLCBs
YXN0WWllbGRlZCkgeworICAgIHJldHVybiAhbGFzdFlpZWxkZWQuc2hhZG93VGVtcGxhdGUgJiYg
dGVtcGxhdGUgPT09IGxhc3RZaWVsZGVkLnRlbXBsYXRlOworICB9CisgIGZ1bmN0aW9uIG9wdGlv
bnNGb3IodGVtcGxhdGUsIGludmVyc2UsIGVudiwgc2NvcGUsIG1vcnBoLCB2aXNpdG9yKSB7Cisg
ICAgLy8gSWYgdGhlcmUgd2FzIGEgdGVtcGxhdGUgeWllbGRlZCBsYXN0IHRpbWUsIHNldCBtb3Jw
aFRvQ2xlYXIgc28gaXQgd2lsbCBiZSBjbGVhcmVkCisgICAgLy8gaWYgbm8gdGVtcGxhdGUgaXMg
eWllbGRlZCBvbiB0aGlzIHJlbmRlci4KKyAgICB2YXIgbW9ycGhUb0NsZWFyID0gbW9ycGgubGFz
dFJlc3VsdCA/IG1vcnBoIDogbnVsbDsKKyAgICB2YXIgcmVuZGVyU3RhdGUgPSBuZXcgX2h0bWxi
YXJzVXRpbFRlbXBsYXRlVXRpbHMuUmVuZGVyU3RhdGUobW9ycGhUb0NsZWFyLCBtb3JwaC5tb3Jw
aExpc3QgfHwgbnVsbCk7CisKKyAgICByZXR1cm4geworICAgICAgdGVtcGxhdGVzOiB7CisgICAg
ICAgIHRlbXBsYXRlOiB3cmFwRm9ySGVscGVyKHRlbXBsYXRlLCBlbnYsIHNjb3BlLCBtb3JwaCwg
cmVuZGVyU3RhdGUsIHZpc2l0b3IpLAorICAgICAgICBpbnZlcnNlOiB3cmFwRm9ySGVscGVyKGlu
dmVyc2UsIGVudiwgc2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcikKKyAgICAgIH0s
CisgICAgICByZW5kZXJTdGF0ZTogcmVuZGVyU3RhdGUKKyAgICB9OworICB9CisKKyAgZnVuY3Rp
b24gdGhpc0ZvcihvcHRpb25zKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGFyaXR5OiBvcHRpb25z
LnRlbXBsYXRlLmFyaXR5LAorICAgICAgJ3lpZWxkJzogb3B0aW9ucy50ZW1wbGF0ZS55aWVsZCwg
Ly8gcXVvdGVkIHNpbmNlIGl0J3MgYSByZXNlcnZlZCB3b3JkLCBzZWUgaXNzdWUgIzQyMAorICAg
ICAgeWllbGRJdGVtOiBvcHRpb25zLnRlbXBsYXRlLnlpZWxkSXRlbSwKKyAgICAgIHlpZWxkSW46
IG9wdGlvbnMudGVtcGxhdGUueWllbGRJbgorICAgIH07CisgIH0KKworICAvKioKKyAgICBIb3N0
IEhvb2s6IGNyZWF0ZVNjb3BlCisgIAorICAgIEBwYXJhbSB7U2NvcGU/fSBwYXJlbnRTY29wZQor
ICAgIEByZXR1cm4gU2NvcGUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG8gZW50ZXJpbmcgYSBuZXcg
SFRNTEJhcnMgYmxvY2suCisgIAorICAgIFRoaXMgaG9vayBpcyBpbnZva2VkIHdoZW4gYSBibG9j
ayBpcyBlbnRlcmVkIHdpdGgKKyAgICBhIG5ldyBgc2VsZmAgb3IgYWRkaXRpb25hbCBsb2NhbCB2
YXJpYWJsZXMuCisgIAorICAgIFdoZW4gaW52b2tlZCBmb3IgYSB0b3AtbGV2ZWwgdGVtcGxhdGUs
IHRoZQorICAgIGBwYXJlbnRTY29wZWAgaXMgYG51bGxgLCBhbmQgdGhpcyBob29rIHNob3VsZCBy
ZXR1cm4KKyAgICBhIGZyZXNoIFNjb3BlLgorICAKKyAgICBXaGVuIGludm9rZWQgZm9yIGEgY2hp
bGQgdGVtcGxhdGUsIHRoZSBgcGFyZW50U2NvcGVgCisgICAgaXMgdGhlIHNjb3BlIGZvciB0aGUg
cGFyZW50IGVudmlyb25tZW50LgorICAKKyAgICBOb3RlIHRoYXQgdGhlIGBTY29wZWAgaXMgYW4g
b3BhcXVlIHZhbHVlIHRoYXQgaXMKKyAgICBwYXNzZWQgdG8gb3RoZXIgaG9zdCBob29rcy4gRm9y
IGV4YW1wbGUsIHRoZSBgZ2V0YAorICAgIGhvb2sgdXNlcyB0aGUgc2NvcGUgdG8gcmV0cmlldmUg
YSB2YWx1ZSBmb3IgYSBnaXZlbgorICAgIHNjb3BlIGFuZCB2YXJpYWJsZSBuYW1lLgorICAqLwor
CisgIGZ1bmN0aW9uIGNyZWF0ZVNjb3BlKGVudiwgcGFyZW50U2NvcGUpIHsKKyAgICBpZiAocGFy
ZW50U2NvcGUpIHsKKyAgICAgIHJldHVybiBlbnYuaG9va3MuY3JlYXRlQ2hpbGRTY29wZShwYXJl
bnRTY29wZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbnYuaG9va3MuY3JlYXRlRnJl
c2hTY29wZSgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUZyZXNoU2NvcGUoKSB7
CisgICAgLy8gYmVjYXVzZSBgaW5gIGNoZWNrcyBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFu
Y2UsIGtlZXAgYQorICAgIC8vIHNlcGFyYXRlIGRpY3Rpb25hcnkgdG8gdHJhY2sgd2hldGhlciBh
IGxvY2FsIHdhcyBib3VuZC4KKyAgICAvLyBTZWUgYGJpbmRMb2NhbGAgZm9yIG1vcmUgaW5mb3Jt
YXRpb24uCisgICAgcmV0dXJuIHsgc2VsZjogbnVsbCwgYmxvY2tzOiB7fSwgbG9jYWxzOiB7fSwg
bG9jYWxQcmVzZW50OiB7fSB9OworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kU2hh
ZG93U2NvcGUKKyAgCisgICAgQHBhcmFtIHtTY29wZT99IHBhcmVudFNjb3BlCisgICAgQHJldHVy
biBTY29wZQorICAKKyAgICBDb3JyZXNwb25kcyB0byByZW5kZXJpbmcgYSBuZXcgdGVtcGxhdGUg
aW50byBhbiBleGlzdGluZworICAgIHJlbmRlciB0cmVlLCBidXQgd2l0aCBhIG5ldyB0b3AtbGV2
ZWwgbGV4aWNhbCBzY29wZS4gVGhpcworICAgIHRlbXBsYXRlIGlzIGNhbGxlZCB0aGUgInNoYWRv
dyByb290Ii4KKyAgCisgICAgSWYgYSBzaGFkb3cgdGVtcGxhdGUgaW52b2tlcyBge3t5aWVsZH19
YCwgaXQgd2lsbCByZW5kZXIKKyAgICB0aGUgYmxvY2sgcHJvdmlkZWQgdG8gdGhlIHNoYWRvdyBy
b290IGluIHRoZSBvcmlnaW5hbAorICAgIGxleGljYWwgc2NvcGUuCisgIAorICAgIGBgYGhicwor
ICAgIHt7IS0tIHBvc3QgdGVtcGxhdGUgLS19fQorICAgIDxwPnt7cHJvcHMudGl0bGV9fTwvcD4K
KyAgICB7e3lpZWxkfX0KKyAgCisgICAge3shLS0gYmxvZyB0ZW1wbGF0ZSAtLX19CisgICAge3sj
cG9zdCB0aXRsZT0iSGVsbG8gd29ybGQifX0KKyAgICAgIDxwPmJ5IHt7YnlsaW5lfX08L3A+Cisg
ICAgICA8YXJ0aWNsZT5UaGlzIGlzIG15IGZpcnN0IHBvc3Q8L2FydGljbGU+CisgICAge3svcG9z
dH19CisgIAorICAgIHt7I3Bvc3QgdGl0bGU9Ikdvb2RieWUgd29ybGQifX0KKyAgICAgIDxwPmJ5
IHt7YnlsaW5lfX08L3A+CisgICAgICA8YXJ0aWNsZT5UaGlzIGlzIG15IGxhc3QgcG9zdDwvYXJ0
aWNsZT4KKyAgICB7ey9wb3N0fX0KKyAgICBgYGAKKyAgCisgICAgYGBganMKKyAgICBoZWxwZXJz
LnBvc3QgPSBmdW5jdGlvbihwYXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMu
dGVtcGxhdGUueWllbGRJbihwb3N0VGVtcGxhdGUsIHsgcHJvcHM6IGhhc2ggfSk7CisgICAgfTsK
KyAgCisgICAgYmxvZy5yZW5kZXIoeyBieWxpbmU6ICJZZWh1ZGEgS2F0eiIgfSk7CisgICAgYGBg
CisgIAorICAgIFByb2R1Y2VzOgorICAKKyAgICBgYGBodG1sCisgICAgPHA+SGVsbG8gd29ybGQ8
L3A+CisgICAgPHA+YnkgWWVodWRhIEthdHo8L3A+CisgICAgPGFydGljbGU+VGhpcyBpcyBteSBm
aXJzdCBwb3N0PC9hcnRpY2xlPgorICAKKyAgICA8cD5Hb29kYnllIHdvcmxkPC9wPgorICAgIDxw
PmJ5IFllaHVkYSBLYXR6PC9wPgorICAgIDxhcnRpY2xlPlRoaXMgaXMgbXkgbGFzdCBwb3N0PC9h
cnRpY2xlPgorICAgIGBgYAorICAKKyAgICBJbiBzaG9ydCwgYHlpZWxkSW5gIGNyZWF0ZXMgYSBu
ZXcgdG9wLWxldmVsIHNjb3BlIGZvciB0aGUKKyAgICBwcm92aWRlZCB0ZW1wbGF0ZSBhbmQgcmVu
ZGVycyBpdCwgbWFraW5nIHRoZSBvcmlnaW5hbCBibG9jaworICAgIGF2YWlsYWJsZSB0byBge3t5
aWVsZH19YCBpbiB0aGF0IHRlbXBsYXRlLgorICAqLworCisgIGZ1bmN0aW9uIGJpbmRTaGFkb3dT
Y29wZShlbnYgLyosIHBhcmVudFNjb3BlLCBzaGFkb3dTY29wZSAqLykgeworICAgIHJldHVybiBl
bnYuaG9va3MuY3JlYXRlRnJlc2hTY29wZSgpOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlQ2hp
bGRTY29wZShwYXJlbnQpIHsKKyAgICB2YXIgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7
CisgICAgc2NvcGUubG9jYWxzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQubG9jYWxzKTsKKyAgICBz
Y29wZS5sb2NhbFByZXNlbnQgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5sb2NhbFByZXNlbnQpOwor
ICAgIHNjb3BlLmJsb2NrcyA9IE9iamVjdC5jcmVhdGUocGFyZW50LmJsb2Nrcyk7CisgICAgcmV0
dXJuIHNjb3BlOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kU2VsZgorICAKKyAg
ICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7YW55fSBzZWxmCisgIAorICAgIENv
cnJlc3BvbmRzIHRvIGVudGVyaW5nIGEgdGVtcGxhdGUuCisgIAorICAgIFRoaXMgaG9vayBpcyBp
bnZva2VkIHdoZW4gdGhlIGBzZWxmYCB2YWx1ZSBmb3IgYSBzY29wZSBpcyByZWFkeSB0byBiZSBi
b3VuZC4KKyAgCisgICAgVGhlIGhvc3QgbXVzdCBlbnN1cmUgdGhhdCBjaGlsZCBzY29wZXMgcmVm
bGVjdCB0aGUgY2hhbmdlIHRvIHRoZSBgc2VsZmAgaW4KKyAgICBmdXR1cmUgY2FsbHMgdG8gdGhl
IGBnZXRgIGhvb2suCisgICovCisKKyAgZnVuY3Rpb24gYmluZFNlbGYoZW52LCBzY29wZSwgc2Vs
ZikgeworICAgIHNjb3BlLnNlbGYgPSBzZWxmOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlU2Vs
ZihlbnYsIHNjb3BlLCBzZWxmKSB7CisgICAgZW52Lmhvb2tzLmJpbmRTZWxmKGVudiwgc2NvcGUs
IHNlbGYpOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kTG9jYWwKKyAgCisgICAg
QHBhcmFtIHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBA
cGFyYW0ge1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7YW55fSB2YWx1ZQorICAKKyAgICBDb3Jy
ZXNwb25kcyB0byBlbnRlcmluZyBhIHRlbXBsYXRlIHdpdGggYmxvY2sgYXJndW1lbnRzLgorICAK
KyAgICBUaGlzIGhvb2sgaXMgaW52b2tlZCB3aGVuIGEgbG9jYWwgdmFyaWFibGUgZm9yIGEgc2Nv
cGUgaGFzIGJlZW4gcHJvdmlkZWQuCisgIAorICAgIFRoZSBob3N0IG11c3QgZW5zdXJlIHRoYXQg
Y2hpbGQgc2NvcGVzIHJlZmxlY3QgdGhlIGNoYW5nZSBpbiBmdXR1cmUgY2FsbHMKKyAgICB0byB0
aGUgYGdldGAgaG9vay4KKyAgKi8KKworICBmdW5jdGlvbiBiaW5kTG9jYWwoZW52LCBzY29wZSwg
bmFtZSwgdmFsdWUpIHsKKyAgICBzY29wZS5sb2NhbFByZXNlbnRbbmFtZV0gPSB0cnVlOworICAg
IHNjb3BlLmxvY2Fsc1tuYW1lXSA9IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlTG9j
YWwoZW52LCBzY29wZSwgbmFtZSwgdmFsdWUpIHsKKyAgICBlbnYuaG9va3MuYmluZExvY2FsKGVu
diwgc2NvcGUsIG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgSG9vazogYmlu
ZEJsb2NrCisgIAorICAgIEBwYXJhbSB7RW52aXJvbm1lbnR9IGVudgorICAgIEBwYXJhbSB7U2Nv
cGV9IHNjb3BlCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gYmxvY2sKKyAgCisgICAgQ29ycmVzcG9u
ZHMgdG8gZW50ZXJpbmcgYSBzaGFkb3cgdGVtcGxhdGUgdGhhdCB3YXMgaW52b2tlZCBieSBhIGJs
b2NrIGhlbHBlciB3aXRoCisgICAgYHlpZWxkSW5gLgorICAKKyAgICBUaGlzIGhvb2sgaXMgaW52
b2tlZCB3aXRoIGFuIG9wYXF1ZSBibG9jayB0aGF0IHdpbGwgYmUgcGFzc2VkIGFsb25nCisgICAg
dG8gdGhlIHNoYWRvdyB0ZW1wbGF0ZSwgYW5kIGluc2VydGVkIGludG8gdGhlIHNoYWRvdyB0ZW1w
bGF0ZSB3aGVuCisgICAgYHt7eWllbGR9fWAgaXMgdXNlZC4gT3B0aW9uYWxseSBwcm92aWRlIGEg
bm9uLWRlZmF1bHQgYmxvY2sgbmFtZQorICAgIHRoYXQgY2FuIGJlIHRhcmdldGVkIGJ5IGB7e3lp
ZWxkIHRvPWJsb2NrTmFtZX19YC4KKyAgKi8KKworICBmdW5jdGlvbiBiaW5kQmxvY2soZW52LCBz
Y29wZSwgYmxvY2spIHsKKyAgICB2YXIgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBh
cmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/ICdkZWZhdWx0JyA6IGFyZ3VtZW50c1szXTsKKwor
ICAgIHNjb3BlLmJsb2Nrc1tuYW1lXSA9IGJsb2NrOworICB9CisKKyAgLyoqCisgICAgSG9zdCBI
b29rOiBibG9jaworICAKKyAgICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBA
cGFyYW0ge0Vudmlyb25tZW50fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1zCisgICAgQHBhcmFt
IHtPYmplY3R9IGhhc2gKKyAgICBAcGFyYW0ge0Jsb2NrfSBibG9jaworICAgIEBwYXJhbSB7Qmxv
Y2t9IGVsc2VCbG9jaworICAKKyAgICBDb3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisg
ICAge3sjaGVscGVyIHBhcmFtMSBwYXJhbTIga2V5MT12YWwxIGtleTI9dmFsMn19CisgICAgICB7
eyEtLSBjaGlsZCB0ZW1wbGF0ZSAtLX19CisgICAge3svaGVscGVyfX0KKyAgICBgYGAKKyAgCisg
ICAgVGhpcyBob3N0IGhvb2sgaXMgYSB3b3JraG9yc2Ugb2YgdGhlIHN5c3RlbS4gSXQgaXMgaW52
b2tlZAorICAgIHdoZW5ldmVyIGEgYmxvY2sgaXMgZW5jb3VudGVyZWQsIGFuZCBpcyByZXNwb25z
aWJsZSBmb3IKKyAgICByZXNvbHZpbmcgdGhlIGhlbHBlciB0byBjYWxsLCBhbmQgdGhlbiBpbnZv
a2UgaXQuCisgIAorICAgIFRoZSBoZWxwZXIgc2hvdWxkIGJlIGludm9rZWQgd2l0aDoKKyAgCisg
ICAgLSBge0FycmF5fSBwYXJhbXNgOiB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGhlbHBl
cgorICAgICAgaW4gdGhlIHRlbXBsYXRlLgorICAgIC0gYHtPYmplY3R9IGhhc2hgOiBhbiBvYmpl
Y3QgY29udGFpbmluZyB0aGUga2V5cyBhbmQgdmFsdWVzIHBhc3NlZAorICAgICAgaW4gdGhlIGhh
c2ggcG9zaXRpb24gaW4gdGhlIHRlbXBsYXRlLgorICAKKyAgICBUaGUgdmFsdWVzIGluIGBwYXJh
bXNgIGFuZCBgaGFzaGAgd2lsbCBhbHJlYWR5IGJlIHJlc29sdmVkCisgICAgdGhyb3VnaCBhIHBy
ZXZpb3VzIGNhbGwgdG8gdGhlIGBnZXRgIGhvc3QgaG9vay4KKyAgCisgICAgVGhlIGhlbHBlciBz
aG91bGQgYmUgaW52b2tlZCB3aXRoIGEgYHRoaXNgIHZhbHVlIHRoYXQgaXMKKyAgICBhbiBvYmpl
Y3Qgd2l0aCBvbmUgZmllbGQ6CisgIAorICAgIGB7RnVuY3Rpb259IHlpZWxkYDogd2hlbiBpbnZv
a2VkLCB0aGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZQorICAgIGJsb2NrIHdpdGggdGhlIGN1cnJl
bnQgc2NvcGUuIEl0IHRha2VzIGFuIG9wdGlvbmFsIGFycmF5IG9mCisgICAgYmxvY2sgcGFyYW1l
dGVycy4gSWYgYmxvY2sgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQsIEhUTUxCYXJzCisgICAgd2ls
bCBpbnZva2UgdGhlIGBiaW5kTG9jYWxgIGhvc3QgaG9vayB0byBiaW5kIHRoZSBzdXBwbGllZAor
ICAgIHZhbHVlcyB0byB0aGUgYmxvY2sgYXJndW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSB0ZW1wbGF0
ZS4KKyAgCisgICAgSW4gZ2VuZXJhbCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYGJs
b2NrYCBzaG91bGQgd29yaworICAgIGZvciBtb3N0IGhvc3QgZW52aXJvbm1lbnRzLiBJdCBkZWxl
Z2F0ZXMgdG8gb3RoZXIgaG9zdCBob29rcworICAgIHdoZXJlIGFwcHJvcHJpYXRlLCBhbmQgcHJv
cGVybHkgaW52b2tlcyB0aGUgaGVscGVyIHdpdGggdGhlCisgICAgYXBwcm9wcmlhdGUgYXJndW1l
bnRzLgorICAqLworCisgIGZ1bmN0aW9uIGJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBw
YXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7CisgICAgaWYgKGhhbmRs
ZVJlZGlyZWN0KG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRl
LCBpbnZlcnNlLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRp
bnVlQmxvY2sobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUs
IGludmVyc2UsIHZpc2l0b3IpOworICB9CisKKyAgZnVuY3Rpb24gY29udGludWVCbG9jayhtb3Jw
aCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlz
aXRvcikgeworICAgIGhvc3RCbG9jayhtb3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIGludmVy
c2UsIG51bGwsIHZpc2l0b3IsIGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICB2YXIgaGVscGVy
ID0gZW52Lmhvb2tzLmxvb2t1cEhlbHBlcihlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHJldHVy
biBlbnYuaG9va3MuaW52b2tlSGVscGVyKG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yLCBwYXJh
bXMsIGhhc2gsIGhlbHBlciwgb3B0aW9ucy50ZW1wbGF0ZXMsIHRoaXNGb3Iob3B0aW9ucy50ZW1w
bGF0ZXMpKTsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGhvc3RCbG9jayhtb3JwaCwgZW52
LCBzY29wZSwgdGVtcGxhdGUsIGludmVyc2UsIHNoYWRvd09wdGlvbnMsIHZpc2l0b3IsIGNhbGxi
YWNrKSB7CisgICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zRm9yKHRlbXBsYXRlLCBpbnZlcnNlLCBl
bnYsIHNjb3BlLCBtb3JwaCwgdmlzaXRvcik7CisgICAgX2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRp
bHMucmVuZGVyQW5kQ2xlYW51cChtb3JwaCwgZW52LCBvcHRpb25zLCBzaGFkb3dPcHRpb25zLCBj
YWxsYmFjayk7CisgIH0KKworICBmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBz
Y29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgewor
ICAgIGlmICghcGF0aCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBy
ZWRpcmVjdCA9IGVudi5ob29rcy5jbGFzc2lmeShlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICBpZiAo
cmVkaXJlY3QpIHsKKyAgICAgIHN3aXRjaCAocmVkaXJlY3QpIHsKKyAgICAgICAgY2FzZSAnY29t
cG9uZW50JzoKKyAgICAgICAgICBlbnYuaG9va3MuY29tcG9uZW50KG1vcnBoLCBlbnYsIHNjb3Bl
LCBwYXRoLCBwYXJhbXMsIGhhc2gsIHsgZGVmYXVsdDogdGVtcGxhdGUsIGludmVyc2U6IGludmVy
c2UgfSwgdmlzaXRvcik7YnJlYWs7CisgICAgICAgIGNhc2UgJ2lubGluZSc6CisgICAgICAgICAg
ZW52Lmhvb2tzLmlubGluZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB2
aXNpdG9yKTticmVhazsKKyAgICAgICAgY2FzZSAnYmxvY2snOgorICAgICAgICAgIGVudi5ob29r
cy5ibG9jayhtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwg
aW52ZXJzZSwgdmlzaXRvcik7YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJJbnRlcm5hbCBIVE1MQmFycyByZWRpcmVjdGlvbiB0byAiICsgcmVkaXJl
Y3QgKyAiIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGlmIChoYW5kbGVLZXl3b3JkKHBhdGgsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJh
bXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gaGFuZGxl
S2V5d29yZChwYXRoLCBtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwg
aW52ZXJzZSwgdmlzaXRvcikgeworICAgIHZhciBrZXl3b3JkID0gZW52Lmhvb2tzLmtleXdvcmRz
W3BhdGhdOworICAgIGlmICgha2V5d29yZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIGlmICh0eXBlb2Yga2V5d29yZCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgcmV0dXJu
IGtleXdvcmQobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpOworICAgIH0KKworICAgIGlmIChrZXl3b3JkLndpbGxSZW5kZXIpIHsKKyAg
ICAgIGtleXdvcmQud2lsbFJlbmRlcihtb3JwaCwgZW52KTsKKyAgICB9CisKKyAgICB2YXIgbGFz
dFN0YXRlLCBuZXdTdGF0ZTsKKyAgICBpZiAoa2V5d29yZC5zZXR1cFN0YXRlKSB7CisgICAgICBs
YXN0U3RhdGUgPSBfaHRtbGJhcnNVdGlsT2JqZWN0VXRpbHMuc2hhbGxvd0NvcHkobW9ycGguZ2V0
U3RhdGUoKSk7CisgICAgICBuZXdTdGF0ZSA9IG1vcnBoLnNldFN0YXRlKGtleXdvcmQuc2V0dXBT
dGF0ZShsYXN0U3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkpOworICAgIH0KKworICAg
IGlmIChrZXl3b3JkLmNoaWxkRW52KSB7CisgICAgICAvLyBCdWlsZCB0aGUgY2hpbGQgZW52aXJv
bm1lbnQuLi4KKyAgICAgIGVudiA9IGtleXdvcmQuY2hpbGRFbnYobW9ycGguZ2V0U3RhdGUoKSwg
ZW52KTsKKworICAgICAgLy8gLi50aGVuIHNhdmUgb2ZmIHRoZSBjaGlsZCBlbnYgYnVpbGRlciBv
biB0aGUgcmVuZGVyIG5vZGUuIElmIHRoZSByZW5kZXIKKyAgICAgIC8vIG5vZGUgdHJlZSBpcyBy
ZS1yZW5kZXJlZCBhbmQgdGhpcyBub2RlIGlzIG5vdCBkaXJ0eSwgdGhlIGNoaWxkIGVudgorICAg
ICAgLy8gYnVpbGRlciB3aWxsIHN0aWxsIGJlIGludm9rZWQgc28gdGhhdCBjaGlsZCBkaXJ0eSBy
ZW5kZXIgbm9kZXMgc3RpbGwgZ2V0CisgICAgICAvLyB0aGUgY29ycmVjdCBjaGlsZCBlbnYuCisg
ICAgICBtb3JwaC5idWlsZENoaWxkRW52ID0ga2V5d29yZC5jaGlsZEVudjsKKyAgICB9CisKKyAg
ICB2YXIgZmlyc3RUaW1lID0gIW1vcnBoLnJlbmRlcmVkOworCisgICAgaWYgKGtleXdvcmQuaXNF
bXB0eSkgeworICAgICAgdmFyIGlzRW1wdHkgPSBrZXl3b3JkLmlzRW1wdHkobW9ycGguZ2V0U3Rh
dGUoKSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgaWYgKGlzRW1wdHkpIHsK
KyAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHsKKyAgICAgICAgICBfaHRtbGJhcnNVdGlsVGVtcGxh
dGVVdGlscy5jbGVhck1vcnBoKG1vcnBoLCBlbnYsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlyc3RUaW1lKSB7Cisg
ICAgICBpZiAoa2V5d29yZC5yZW5kZXIpIHsKKyAgICAgICAga2V5d29yZC5yZW5kZXIobW9ycGgs
IGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOwor
ICAgICAgfQorICAgICAgbW9ycGgucmVuZGVyZWQgPSB0cnVlOworICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgdmFyIGlzU3RhYmxlOworICAgIGlmIChrZXl3b3JkLmlzU3RhYmxlKSB7
CisgICAgICBpc1N0YWJsZSA9IGtleXdvcmQuaXNTdGFibGUobGFzdFN0YXRlLCBuZXdTdGF0ZSk7
CisgICAgfSBlbHNlIHsKKyAgICAgIGlzU3RhYmxlID0gc3RhYmxlU3RhdGUobGFzdFN0YXRlLCBu
ZXdTdGF0ZSk7CisgICAgfQorCisgICAgaWYgKGlzU3RhYmxlKSB7CisgICAgICBpZiAoa2V5d29y
ZC5yZXJlbmRlcikgeworICAgICAgICB2YXIgbmV3RW52ID0ga2V5d29yZC5yZXJlbmRlcihtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7
CisgICAgICAgIGVudiA9IG5ld0VudiB8fCBlbnY7CisgICAgICB9CisgICAgICBfaHRtbGJhcnNV
dGlsTW9ycGhVdGlscy52YWxpZGF0ZUNoaWxkTW9ycGhzKGVudiwgbW9ycGgsIHZpc2l0b3IpOwor
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIF9odG1sYmFyc1V0aWxUZW1w
bGF0ZVV0aWxzLmNsZWFyTW9ycGgobW9ycGgsIGVudiwgZmFsc2UpOworICAgIH0KKworICAgIC8v
IElmIHRoZSBub2RlIGlzIHVuc3RhYmxlLCByZS1yZW5kZXIgZnJvbSBzY3JhdGNoCisgICAgaWYg
KGtleXdvcmQucmVuZGVyKSB7CisgICAgICBrZXl3b3JkLnJlbmRlcihtb3JwaCwgZW52LCBzY29w
ZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgICAgICBtb3Jw
aC5yZW5kZXJlZCA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBm
dW5jdGlvbiBzdGFibGVTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpIHsKKyAgICBpZiAoX2h0bWxi
YXJzVXRpbE9iamVjdFV0aWxzLmtleUxlbmd0aChvbGRTdGF0ZSkgIT09IF9odG1sYmFyc1V0aWxP
YmplY3RVdGlscy5rZXlMZW5ndGgobmV3U3RhdGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgZm9yICh2YXIgcHJvcCBpbiBvbGRTdGF0ZSkgeworICAgICAgaWYgKG9sZFN0
YXRlW3Byb3BdICE9PSBuZXdTdGF0ZVtwcm9wXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBsaW5r
UmVuZGVyTm9kZSgpIC8qIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2ggKi97CisgICAg
cmV0dXJuOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBpbmxpbmUKKyAgCisgICAgQHBh
cmFtIHtSZW5kZXJOb2RlfSByZW5kZXJOb2RlCisgICAgQHBhcmFtIHtFbnZpcm9ubWVudH0gZW52
CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICAg
IEBwYXJhbSB7QXJyYXl9IHBhcmFtcworICAgIEBwYXJhbSB7SGFzaH0gaGFzaAorICAKKyAgICBD
b3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisgICAge3toZWxwZXIgcGFyYW0xIHBhcmFt
MiBrZXkxPXZhbDEga2V5Mj12YWwyfX0KKyAgICBgYGAKKyAgCisgICAgVGhpcyBob3N0IGhvb2sg
aXMgc2ltaWxhciB0byB0aGUgYGJsb2NrYCBob3N0IGhvb2ssIGJ1dCBpdAorICAgIGludm9rZXMg
aGVscGVycyB0aGF0IGRvIG5vdCBzdXBwbHkgYW4gYXR0YWNoZWQgYmxvY2suCisgIAorICAgIExp
a2UgdGhlIGBibG9ja2AgaG9vaywgdGhlIGhlbHBlciBzaG91bGQgYmUgaW52b2tlZCB3aXRoOgor
ICAKKyAgICAtIGB7QXJyYXl9IHBhcmFtc2A6IHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUg
aGVscGVyCisgICAgICBpbiB0aGUgdGVtcGxhdGUuCisgICAgLSBge09iamVjdH0gaGFzaGA6IGFu
IG9iamVjdCBjb250YWluaW5nIHRoZSBrZXlzIGFuZCB2YWx1ZXMgcGFzc2VkCisgICAgICBpbiB0
aGUgaGFzaCBwb3NpdGlvbiBpbiB0aGUgdGVtcGxhdGUuCisgIAorICAgIFRoZSB2YWx1ZXMgaW4g
YHBhcmFtc2AgYW5kIGBoYXNoYCB3aWxsIGFscmVhZHkgYmUgcmVzb2x2ZWQKKyAgICB0aHJvdWdo
IGEgcHJldmlvdXMgY2FsbCB0byB0aGUgYGdldGAgaG9zdCBob29rLgorICAKKyAgICBJbiBnZW5l
cmFsLCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaW5saW5lYCBzaG91bGQgd29yawor
ICAgIGZvciBtb3N0IGhvc3QgZW52aXJvbm1lbnRzLiBJdCBkZWxlZ2F0ZXMgdG8gb3RoZXIgaG9z
dCBob29rcworICAgIHdoZXJlIGFwcHJvcHJpYXRlLCBhbmQgcHJvcGVybHkgaW52b2tlcyB0aGUg
aGVscGVyIHdpdGggdGhlCisgICAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorICAKKyAgICBUaGUg
ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaW5saW5lYCBhbHNvIG1ha2VzIGBwYXJ0aWFsYAor
ICAgIGEga2V5d29yZC4gSW5zdGVhZCBvZiBpbnZva2luZyBhIGhlbHBlciBuYW1lZCBgcGFydGlh
bGAsCisgICAgaXQgaW52b2tlcyB0aGUgYHBhcnRpYWxgIGhvc3QgaG9vay4KKyAgKi8KKworICBm
dW5jdGlvbiBpbmxpbmUobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgdmlz
aXRvcikgeworICAgIGlmIChoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwg
cGFyYW1zLCBoYXNoLCBudWxsLCBudWxsLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIHZhciB2YWx1ZSA9IHVuZGVmaW5lZCwKKyAgICAgICAgaGFzVmFsdWUgPSB1bmRl
ZmluZWQ7CisgICAgaWYgKG1vcnBoLmxpbmtlZFJlc3VsdCkgeworICAgICAgdmFsdWUgPSBlbnYu
aG9va3MuZ2V0VmFsdWUobW9ycGgubGlua2VkUmVzdWx0KTsKKyAgICAgIGhhc1ZhbHVlID0gdHJ1
ZTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zRm9yKG51bGwsIG51
bGwsIGVudiwgc2NvcGUsIG1vcnBoKTsKKworICAgICAgdmFyIGhlbHBlciA9IGVudi5ob29rcy5s
b29rdXBIZWxwZXIoZW52LCBzY29wZSwgcGF0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gZW52Lmhv
b2tzLmludm9rZUhlbHBlcihtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvciwgcGFyYW1zLCBoYXNo
LCBoZWxwZXIsIG9wdGlvbnMudGVtcGxhdGVzLCB0aGlzRm9yKG9wdGlvbnMudGVtcGxhdGVzKSk7
CisKKyAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmxpbmspIHsKKyAgICAgICAgbW9ycGgubGlu
a2VkUmVzdWx0ID0gcmVzdWx0LnZhbHVlOworICAgICAgICBfaHRtbGJhcnNVdGlsTW9ycGhVdGls
cy5saW5rUGFyYW1zKGVudiwgc2NvcGUsIG1vcnBoLCAnQGNvbnRlbnQtaGVscGVyJywgW21vcnBo
LmxpbmtlZFJlc3VsdF0sIG51bGwpOworICAgICAgfQorCisgICAgICBpZiAocmVzdWx0ICYmICd2
YWx1ZScgaW4gcmVzdWx0KSB7CisgICAgICAgIHZhbHVlID0gZW52Lmhvb2tzLmdldFZhbHVlKHJl
c3VsdC52YWx1ZSk7CisgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoaGFzVmFsdWUpIHsKKyAgICAgIGlmIChtb3JwaC5sYXN0VmFsdWUgIT09IHZhbHVl
KSB7CisgICAgICAgIG1vcnBoLnNldENvbnRlbnQodmFsdWUpOworICAgICAgfQorICAgICAgbW9y
cGgubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24ga2V5d29yZChw
YXRoLCBtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwg
dmlzaXRvcikgeworICAgIGhhbmRsZUtleXdvcmQocGF0aCwgbW9ycGgsIGVudiwgc2NvcGUsIHBh
cmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOworICB9CisKKyAgZnVuY3Rp
b24gaW52b2tlSGVscGVyKG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yLCBfcGFyYW1zLCBfaGFz
aCwgaGVscGVyLCB0ZW1wbGF0ZXMsIGNvbnRleHQpIHsKKyAgICB2YXIgcGFyYW1zID0gbm9ybWFs
aXplQXJyYXkoZW52LCBfcGFyYW1zKTsKKyAgICB2YXIgaGFzaCA9IG5vcm1hbGl6ZU9iamVjdChl
bnYsIF9oYXNoKTsKKyAgICByZXR1cm4geyB2YWx1ZTogaGVscGVyLmNhbGwoY29udGV4dCwgcGFy
YW1zLCBoYXNoLCB0ZW1wbGF0ZXMpIH07CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVBcnJh
eShlbnYsIGFycmF5KSB7CisgICAgdmFyIG91dCA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpOwor
CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAg
ICAgIG91dFtpXSA9IGVudi5ob29rcy5nZXRDZWxsT3JWYWx1ZShhcnJheVtpXSk7CisgICAgfQor
CisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChlbnYs
IG9iamVjdCkgeworICAgIHZhciBvdXQgPSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gb2Jq
ZWN0KSB7CisgICAgICBvdXRbcHJvcF0gPSBlbnYuaG9va3MuZ2V0Q2VsbE9yVmFsdWUob2JqZWN0
W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgZnVuY3Rpb24gY2xh
c3NpZnkoKSAvKiBlbnYsIHNjb3BlLCBwYXRoICoveworICAgIHJldHVybiBudWxsOworICB9CisK
KyAgdmFyIGtleXdvcmRzID0geworICAgIHBhcnRpYWw6IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBz
Y29wZSwgcGFyYW1zKSB7CisgICAgICB2YXIgdmFsdWUgPSBlbnYuaG9va3MucGFydGlhbChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zWzBdKTsKKyAgICAgIG1vcnBoLnNldENvbnRlbnQodmFsdWUp
OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8vIHF1b3RlZCBzaW5jZSBpdCdz
IGEgcmVzZXJ2ZWQgd29yZCwgc2VlIGlzc3VlICM0MjAKKyAgICAneWllbGQnOiBmdW5jdGlvbiAo
bW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0
b3IpIHsKKyAgICAgIC8vIHRoZSBjdXJyZW50IHNjb3BlIGlzIHByb3ZpZGVkIHB1cmVseSBmb3Ig
dGhlIGNyZWF0aW9uIG9mIHNoYWRvdworICAgICAgLy8gc2NvcGVzOyBpdCBzaG91bGQgbm90IGJl
IHByb3ZpZGVkIHRvIHVzZXIgY29kZS4KKworICAgICAgdmFyIHRvID0gZW52Lmhvb2tzLmdldFZh
bHVlKGhhc2gudG8pIHx8ICdkZWZhdWx0JzsKKyAgICAgIHZhciBibG9jayA9IGVudi5ob29rcy5n
ZXRCbG9jayhzY29wZSwgdG8pOworCisgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgYmxvY2su
aW52b2tlKGVudiwgcGFyYW1zLCBoYXNoLnNlbGYsIG1vcnBoLCBzY29wZSwgdmlzaXRvcik7Cisg
ICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgaGFzQmxvY2s6IGZ1bmN0
aW9uIChtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zKSB7CisgICAgICB2YXIgbmFtZSA9IGVudi5o
b29rcy5nZXRWYWx1ZShwYXJhbXNbMF0pIHx8ICdkZWZhdWx0JzsKKyAgICAgIHJldHVybiAhIWVu
di5ob29rcy5nZXRCbG9jayhzY29wZSwgbmFtZSk7CisgICAgfSwKKworICAgIGhhc0Jsb2NrUGFy
YW1zOiBmdW5jdGlvbiAobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcykgeworICAgICAgdmFyIG5h
bWUgPSBlbnYuaG9va3MuZ2V0VmFsdWUocGFyYW1zWzBdKSB8fCAnZGVmYXVsdCc7CisgICAgICB2
YXIgYmxvY2sgPSBlbnYuaG9va3MuZ2V0QmxvY2soc2NvcGUsIG5hbWUpOworICAgICAgcmV0dXJu
ICEhKGJsb2NrICYmIGJsb2NrLmFyaXR5KTsKKyAgICB9CisKKyAgfTsKKworICBleHBvcnRzLmtl
eXdvcmRzID0ga2V5d29yZHM7CisgIC8qKgorICAgIEhvc3QgSG9vazogcGFydGlhbAorICAKKyAg
ICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBAcGFyYW0ge0Vudmlyb25tZW50
fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRo
CisgIAorICAgIENvcnJlc3BvbmRzIHRvOgorICAKKyAgICBgYGBoYnMKKyAgICB7e3BhcnRpYWwg
ImxvY2F0aW9uIn19CisgICAgYGBgCisgIAorICAgIFRoaXMgaG9zdCBob29rIGlzIGludm9rZWQg
YnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YKKyAgICB0aGUgYGlubGluZWAgaG9vay4g
VGhpcyBtYWtlcyBgcGFydGlhbGAgYSBrZXl3b3JkIGluIGFuCisgICAgSFRNTEJhcnMgZW52aXJv
bm1lbnQgdXNpbmcgdGhlIGRlZmF1bHQgYGlubGluZWAgaG9zdCBob29rLgorICAKKyAgICBJdCBp
cyBpbXBsZW1lbnRlZCBhcyBhIGhvc3QgaG9vayBzbyB0aGF0IGl0IGNhbiByZXRyaWV2ZQorICAg
IHRoZSBuYW1lZCBwYXJ0aWFsIG91dCBvZiB0aGUgYEVudmlyb25tZW50YC4gSGVscGVycywgaW4K
KyAgICBjb250cmFzdCwgb25seSBoYXZlIGFjY2VzcyB0byB0aGUgdmFsdWVzIHBhc3NlZCBpbiB0
byB0aGVtLAorICAgIGFuZCBub3QgdG8gdGhlIGFtYmllbnQgbGV4aWNhbCBlbnZpcm9ubWVudC4K
KyAgCisgICAgVGhlIGhvc3QgaG9vayBzaG91bGQgaW52b2tlIHRoZSByZWZlcmVuY2VkIHBhcnRp
YWwgd2l0aAorICAgIHRoZSBhbWJpZW50IGBzZWxmYC4KKyAgKi8KKworICBmdW5jdGlvbiBwYXJ0
aWFsKHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIHBhdGgpIHsKKyAgICB2YXIgdGVtcGxhdGUgPSBl
bnYucGFydGlhbHNbcGF0aF07CisgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihzY29wZS5zZWxm
LCBlbnYsIHt9KS5mcmFnbWVudDsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgaG9vazogcmFuZ2UK
KyAgCisgICAgQHBhcmFtIHtSZW5kZXJOb2RlfSByZW5kZXJOb2RlCisgICAgQHBhcmFtIHtFbnZp
cm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0ge2FueX0g
dmFsdWUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG86CisgIAorICAgIGBgYGhicworICAgIHt7Y29u
dGVudH19CisgICAge3t7dW5lc2NhcGVkfX19CisgICAgYGBgCisgIAorICAgIFRoaXMgaG9vayBp
cyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYSByZW5kZXIgbm9kZQorICAgIHRoYXQgcmVwcmVz
ZW50cyBhIHJhbmdlIG9mIGNvbnRlbnQgd2l0aCBhIHZhbHVlLgorICAqLworCisgIGZ1bmN0aW9u
IHJhbmdlKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCB2YWx1ZSwgdmlzaXRvcikgeworICAgIGlm
IChoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgW10sIHt9LCBudWxsLCBu
dWxsLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhbHVlID0gZW52
Lmhvb2tzLmdldFZhbHVlKHZhbHVlKTsKKworICAgIGlmIChtb3JwaC5sYXN0VmFsdWUgIT09IHZh
bHVlKSB7CisgICAgICBtb3JwaC5zZXRDb250ZW50KHZhbHVlKTsKKyAgICB9CisKKyAgICBtb3Jw
aC5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgaG9vazogZWxlbWVu
dAorICAKKyAgICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBAcGFyYW0ge0Vu
dmlyb25tZW50fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoCisgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1zCisgICAgQHBhcmFtIHtIYXNofSBo
YXNoCisgIAorICAgIENvcnJlc3BvbmRzIHRvOgorICAKKyAgICBgYGBoYnMKKyAgICA8ZGl2IHt7
YmluZC1hdHRyIGZvbz1iYXJ9fT48L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgVGhpcyBob29rIGlz
IHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyBhIGhlbHBlciB0aGF0CisgICAgbW9kaWZpZXMgYW4g
ZWxlbWVudC4KKyAgCisgICAgSXRzIHB1cnBvc2UgaXMgbGFyZ2VseSBsZWdhY3kgc3VwcG9ydCBm
b3IgYXdrd2FyZAorICAgIGlkaW9tcyB0aGF0IGJlY2FtZSBjb21tb24gd2hlbiB1c2luZyB0aGUg
c3RyaW5nLWJhc2VkCisgICAgSGFuZGxlYmFycyBlbmdpbmUuCisgIAorICAgIE1vc3Qgb2YgdGhl
IHVzZXMgb2YgdGhlIGBlbGVtZW50YCBob29rIGFyZSBleHBlY3RlZAorICAgIHRvIGJlIHN1cGVy
c2VkZWQgYnkgY29tcG9uZW50IHN5bnRheCBhbmQgdGhlCisgICAgYGF0dHJpYnV0ZWAgaG9vay4K
KyAgKi8KKworICBmdW5jdGlvbiBlbGVtZW50KG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJh
bXMsIGhhc2gsIHZpc2l0b3IpIHsKKyAgICBpZiAoaGFuZGxlUmVkaXJlY3QobW9ycGgsIGVudiwg
c2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgbnVsbCwgbnVsbCwgdmlzaXRvcikpIHsKKyAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaGVscGVyID0gZW52Lmhvb2tzLmxvb2t1cEhlbHBl
cihlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICBpZiAoaGVscGVyKSB7CisgICAgICBlbnYuaG9va3Mu
aW52b2tlSGVscGVyKG51bGwsIGVudiwgc2NvcGUsIG51bGwsIHBhcmFtcywgaGFzaCwgaGVscGVy
LCB7IGVsZW1lbnQ6IG1vcnBoLmVsZW1lbnQgfSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAg
SG9zdCBob29rOiBhdHRyaWJ1dGUKKyAgCisgICAgQHBhcmFtIHtSZW5kZXJOb2RlfSByZW5kZXJO
b2RlCisgICAgQHBhcmFtIHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUKKyAgICBAcGFyYW0ge2FueX0gdmFsdWUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG86CisgIAor
ICAgIGBgYGhicworICAgIDxkaXYgZm9vPXt7YmFyfX0+PC9kaXY+CisgICAgYGBgCisgIAorICAg
IFRoaXMgaG9vayBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYSByZW5kZXIgbm9kZQorICAg
IHRoYXQgcmVwcmVzZW50cyBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHdpdGggYSB2YWx1ZS4KKyAg
CisgICAgSXQgcmVjZWl2ZXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyB3ZWxsIGFzIGFu
CisgICAgYWxyZWFkeS1yZXNvbHZlZCB2YWx1ZSwgYW5kIHNob3VsZCB1cGRhdGUgdGhlIHJlbmRl
cgorICAgIG5vZGUgd2l0aCB0aGUgdmFsdWUgaWYgYXBwcm9wcmlhdGUuCisgICovCisKKyAgZnVu
Y3Rpb24gYXR0cmlidXRlKG1vcnBoLCBlbnYsIHNjb3BlLCBuYW1lLCB2YWx1ZSkgeworICAgIHZh
bHVlID0gZW52Lmhvb2tzLmdldFZhbHVlKHZhbHVlKTsKKworICAgIGlmIChtb3JwaC5sYXN0VmFs
dWUgIT09IHZhbHVlKSB7CisgICAgICBtb3JwaC5zZXRDb250ZW50KHZhbHVlKTsKKyAgICB9CisK
KyAgICBtb3JwaC5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHN1YmV4cHIo
ZW52LCBzY29wZSwgaGVscGVyTmFtZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgdmFyIGhlbHBlciA9
IGVudi5ob29rcy5sb29rdXBIZWxwZXIoZW52LCBzY29wZSwgaGVscGVyTmFtZSk7CisgICAgdmFy
IHJlc3VsdCA9IGVudi5ob29rcy5pbnZva2VIZWxwZXIobnVsbCwgZW52LCBzY29wZSwgbnVsbCwg
cGFyYW1zLCBoYXNoLCBoZWxwZXIsIHt9KTsKKyAgICBpZiAocmVzdWx0ICYmICd2YWx1ZScgaW4g
cmVzdWx0KSB7CisgICAgICByZXR1cm4gZW52Lmhvb2tzLmdldFZhbHVlKHJlc3VsdC52YWx1ZSk7
CisgICAgfQorICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBnZXQKKyAgCisgICAgQHBhcmFt
IHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gcGF0aAorICAKKyAgICBDb3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisg
ICAge3tmb28uYmFyfX0KKyAgICAgIF4KKyAgCisgICAge3toZWxwZXIgZm9vLmJhciBrZXk9dmFs
dWV9fQorICAgICAgICAgICAgIF4gICAgICAgICAgIF4KKyAgICBgYGAKKyAgCisgICAgVGhpcyBo
b29rIGlzIHRoZSAibGVhZiIgaG9vayBvZiB0aGUgc3lzdGVtLiBJdCBpcyB1c2VkIHRvCisgICAg
cmVzb2x2ZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICovCisKKyAg
ZnVuY3Rpb24gZ2V0KGVudiwgc2NvcGUsIHBhdGgpIHsKKyAgICBpZiAocGF0aCA9PT0gJycpIHsK
KyAgICAgIHJldHVybiBzY29wZS5zZWxmOworICAgIH0KKworICAgIHZhciBrZXlzID0gcGF0aC5z
cGxpdCgnLicpOworICAgIHZhciB2YWx1ZSA9IGVudi5ob29rcy5nZXRSb290KHNjb3BlLCBrZXlz
WzBdKVswXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewor
ICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIHZhbHVlID0gZW52Lmhvb2tzLmdldENoaWxkKHZh
bHVlLCBrZXlzW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFJvb3Qoc2Nv
cGUsIGtleSkgeworICAgIGlmIChzY29wZS5sb2NhbFByZXNlbnRba2V5XSkgeworICAgICAgcmV0
dXJuIFtzY29wZS5sb2NhbHNba2V5XV07CisgICAgfSBlbHNlIGlmIChzY29wZS5zZWxmKSB7Cisg
ICAgICByZXR1cm4gW3Njb3BlLnNlbGZba2V5XV07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVy
biBbdW5kZWZpbmVkXTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9jayhzY29wZSwg
a2V5KSB7CisgICAgcmV0dXJuIHNjb3BlLmJsb2Nrc1trZXldOworICB9CisKKyAgZnVuY3Rpb24g
Z2V0Q2hpbGQodmFsdWUsIGtleSkgeworICAgIHJldHVybiB2YWx1ZVtrZXldOworICB9CisKKyAg
ZnVuY3Rpb24gZ2V0VmFsdWUocmVmZXJlbmNlKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAg
fQorCisgIGZ1bmN0aW9uIGdldENlbGxPclZhbHVlKHJlZmVyZW5jZSkgeworICAgIHJldHVybiBy
ZWZlcmVuY2U7CisgIH0KKworICBmdW5jdGlvbiBjb21wb25lbnQobW9ycGgsIGVudiwgc2NvcGUs
IHRhZ05hbWUsIHBhcmFtcywgYXR0cnMsIHRlbXBsYXRlcywgdmlzaXRvcikgeworICAgIGlmIChl
bnYuaG9va3MuaGFzSGVscGVyKGVudiwgc2NvcGUsIHRhZ05hbWUpKSB7CisgICAgICByZXR1cm4g
ZW52Lmhvb2tzLmJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCB0YWdOYW1lLCBwYXJhbXMsIGF0dHJz
LCB0ZW1wbGF0ZXMuZGVmYXVsdCwgdGVtcGxhdGVzLmludmVyc2UsIHZpc2l0b3IpOworICAgIH0K
KworICAgIGNvbXBvbmVudEZhbGxiYWNrKG1vcnBoLCBlbnYsIHNjb3BlLCB0YWdOYW1lLCBhdHRy
cywgdGVtcGxhdGVzLmRlZmF1bHQpOworICB9CisKKyAgZnVuY3Rpb24gY29uY2F0KGVudiwgcGFy
YW1zKSB7CisgICAgdmFyIHZhbHVlID0gIiI7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJh
bXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YWx1ZSArPSBlbnYuaG9va3MuZ2V0VmFs
dWUocGFyYW1zW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rp
b24gY29tcG9uZW50RmFsbGJhY2sobW9ycGgsIGVudiwgc2NvcGUsIHRhZ05hbWUsIGF0dHJzLCB0
ZW1wbGF0ZSkgeworICAgIHZhciBlbGVtZW50ID0gZW52LmRvbS5jcmVhdGVFbGVtZW50KHRhZ05h
bWUpOworICAgIGZvciAodmFyIG5hbWUgaW4gYXR0cnMpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0
cmlidXRlKG5hbWUsIGVudi5ob29rcy5nZXRWYWx1ZShhdHRyc1tuYW1lXSkpOworICAgIH0KKyAg
ICB2YXIgZnJhZ21lbnQgPSBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUs
IGVudiwgc2NvcGUsIHt9KS5mcmFnbWVudDsKKyAgICBlbGVtZW50LmFwcGVuZENoaWxkKGZyYWdt
ZW50KTsKKyAgICBtb3JwaC5zZXROb2RlKGVsZW1lbnQpOworICB9CisKKyAgZnVuY3Rpb24gaGFz
SGVscGVyKGVudiwgc2NvcGUsIGhlbHBlck5hbWUpIHsKKyAgICByZXR1cm4gZW52LmhlbHBlcnNb
aGVscGVyTmFtZV0gIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIGZ1bmN0aW9uIGxvb2t1cEhlbHBl
cihlbnYsIHNjb3BlLCBoZWxwZXJOYW1lKSB7CisgICAgcmV0dXJuIGVudi5oZWxwZXJzW2hlbHBl
ck5hbWVdOworICB9CisKKyAgZnVuY3Rpb24gYmluZFNjb3BlKCkgLyogZW52LCBzY29wZSAqL3sK
KyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIGhvc3Qtc3BlY2lmaWVkIGV4
dGVuc2lvbnMgdG8gc2NvcGUKKyAgICAvLyBvdGhlciB0aGFuIGBzZWxmYCwgYGxvY2Fsc2AgYW5k
IGBibG9ja2AuCisgIH0KKworICBmdW5jdGlvbiB1cGRhdGVTY29wZShlbnYsIHNjb3BlKSB7Cisg
ICAgZW52Lmhvb2tzLmJpbmRTY29wZShlbnYsIHNjb3BlKTsKKyAgfQorCisgIGV4cG9ydHMuZGVm
YXVsdCA9IHsKKyAgICAvLyBmdW5kYW1lbnRhbCBob29rcyB0aGF0IHlvdSB3aWxsIGxpa2VseSB3
YW50IHRvIG92ZXJyaWRlCisgICAgYmluZExvY2FsOiBiaW5kTG9jYWwsCisgICAgYmluZFNlbGY6
IGJpbmRTZWxmLAorICAgIGJpbmRTY29wZTogYmluZFNjb3BlLAorICAgIGNsYXNzaWZ5OiBjbGFz
c2lmeSwKKyAgICBjb21wb25lbnQ6IGNvbXBvbmVudCwKKyAgICBjb25jYXQ6IGNvbmNhdCwKKyAg
ICBjcmVhdGVGcmVzaFNjb3BlOiBjcmVhdGVGcmVzaFNjb3BlLAorICAgIGdldENoaWxkOiBnZXRD
aGlsZCwKKyAgICBnZXRSb290OiBnZXRSb290LAorICAgIGdldEJsb2NrOiBnZXRCbG9jaywKKyAg
ICBnZXRWYWx1ZTogZ2V0VmFsdWUsCisgICAgZ2V0Q2VsbE9yVmFsdWU6IGdldENlbGxPclZhbHVl
LAorICAgIGtleXdvcmRzOiBrZXl3b3JkcywKKyAgICBsaW5rUmVuZGVyTm9kZTogbGlua1JlbmRl
ck5vZGUsCisgICAgcGFydGlhbDogcGFydGlhbCwKKyAgICBzdWJleHByOiBzdWJleHByLAorCisg
ICAgLy8gZnVuZGFtZW50YWwgaG9va3Mgd2l0aCBnb29kIGRlZmF1bHQgYmVoYXZpb3IKKyAgICBi
aW5kQmxvY2s6IGJpbmRCbG9jaywKKyAgICBiaW5kU2hhZG93U2NvcGU6IGJpbmRTaGFkb3dTY29w
ZSwKKyAgICB1cGRhdGVMb2NhbDogdXBkYXRlTG9jYWwsCisgICAgdXBkYXRlU2VsZjogdXBkYXRl
U2VsZiwKKyAgICB1cGRhdGVTY29wZTogdXBkYXRlU2NvcGUsCisgICAgY3JlYXRlQ2hpbGRTY29w
ZTogY3JlYXRlQ2hpbGRTY29wZSwKKyAgICBoYXNIZWxwZXI6IGhhc0hlbHBlciwKKyAgICBsb29r
dXBIZWxwZXI6IGxvb2t1cEhlbHBlciwKKyAgICBpbnZva2VIZWxwZXI6IGludm9rZUhlbHBlciwK
KyAgICBjbGVhbnVwUmVuZGVyTm9kZTogbnVsbCwKKyAgICBkZXN0cm95UmVuZGVyTm9kZTogbnVs
bCwKKyAgICB3aWxsQ2xlYW51cFRyZWU6IG51bGwsCisgICAgZGlkQ2xlYW51cFRyZWU6IG51bGws
CisgICAgd2lsbFJlbmRlck5vZGU6IG51bGwsCisgICAgZGlkUmVuZGVyTm9kZTogbnVsbCwKKwor
ICAgIC8vIGRlcml2ZWQgaG9va3MKKyAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZSwKKyAgICBibG9j
azogYmxvY2ssCisgICAgY3JlYXRlU2NvcGU6IGNyZWF0ZVNjb3BlLAorICAgIGVsZW1lbnQ6IGVs
ZW1lbnQsCisgICAgZ2V0OiBnZXQsCisgICAgaW5saW5lOiBpbmxpbmUsCisgICAgcmFuZ2U6IHJh
bmdlLAorICAgIGtleXdvcmQ6IGtleXdvcmQKKyAgfTsKK30pOworZW5pZmVkKCJodG1sYmFycy1y
dW50aW1lL21vcnBoIiwgWyJleHBvcnRzIiwgIm1vcnBoLXJhbmdlIl0sIGZ1bmN0aW9uIChleHBv
cnRzLCBfbW9ycGhSYW5nZSkgeworICAidXNlIHN0cmljdCI7CisKKyAgdmFyIGd1aWQgPSAxOwor
CisgIGZ1bmN0aW9uIEhUTUxCYXJzTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkg
eworICAgIHRoaXMuc3VwZXIkY29uc3RydWN0b3IoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVu
dCk7CisKKyAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLm93bmVyTm9kZSA9
IG51bGw7CisgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7CisgICAgdGhpcy5pc1N1YnRyZWVEaXJ0
eSA9IGZhbHNlOworICAgIHRoaXMubGFzdFlpZWxkZWQgPSBudWxsOworICAgIHRoaXMubGFzdFJl
c3VsdCA9IG51bGw7CisgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOworICAgIHRoaXMuYnVpbGRD
aGlsZEVudiA9IG51bGw7CisgICAgdGhpcy5tb3JwaExpc3QgPSBudWxsOworICAgIHRoaXMubW9y
cGhNYXAgPSBudWxsOworICAgIHRoaXMua2V5ID0gbnVsbDsKKyAgICB0aGlzLmxpbmtlZFBhcmFt
cyA9IG51bGw7CisgICAgdGhpcy5saW5rZWRSZXN1bHQgPSBudWxsOworICAgIHRoaXMuY2hpbGRO
b2RlcyA9IG51bGw7CisgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOworICAgIHRoaXMuZ3VpZCA9
ICJyYW5nZSIgKyBndWlkKys7CisgICAgdGhpcy5zZWVuID0gZmFsc2U7CisgIH0KKworICBIVE1M
QmFyc01vcnBoLmVtcHR5ID0gZnVuY3Rpb24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQp
IHsKKyAgICB2YXIgbW9ycGggPSBuZXcgSFRNTEJhcnNNb3JwaChkb21IZWxwZXIsIGNvbnRleHR1
YWxFbGVtZW50KTsKKyAgICBtb3JwaC5jbGVhcigpOworICAgIHJldHVybiBtb3JwaDsKKyAgfTsK
KworICBIVE1MQmFyc01vcnBoLmNyZWF0ZSA9IGZ1bmN0aW9uIChkb21IZWxwZXIsIGNvbnRleHR1
YWxFbGVtZW50LCBub2RlKSB7CisgICAgdmFyIG1vcnBoID0gbmV3IEhUTUxCYXJzTW9ycGgoZG9t
SGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguc2V0Tm9kZShub2RlKTsKKyAg
ICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgSFRNTEJhcnNNb3JwaC5hdHRhY2ggPSBmdW5jdGlv
biAoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCwgZmlyc3ROb2RlLCBsYXN0Tm9kZSkgewor
ICAgIHZhciBtb3JwaCA9IG5ldyBIVE1MQmFyc01vcnBoKGRvbUhlbHBlciwgY29udGV4dHVhbEVs
ZW1lbnQpOworICAgIG1vcnBoLnNldFJhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUpOworICAgIHJl
dHVybiBtb3JwaDsKKyAgfTsKKworICB2YXIgcHJvdG90eXBlID0gSFRNTEJhcnNNb3JwaC5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9tb3JwaFJhbmdlLmRlZmF1bHQucHJvdG90eXBlKTsKKyAg
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSFRNTEJhcnNNb3JwaDsKKyAgcHJvdG90eXBlLnN1cGVy
JGNvbnN0cnVjdG9yID0gX21vcnBoUmFuZ2UuZGVmYXVsdDsKKworICBwcm90b3R5cGUuZ2V0U3Rh
dGUgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCF0aGlzLl9zdGF0ZSkgeworICAgICAgdGhpcy5f
c3RhdGUgPSB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fc3RhdGU7CisgIH07CisKKyAg
cHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7CisgICAgLypqc2hpbnQg
LVcwOTMgKi8KKworICAgIHJldHVybiB0aGlzLl9zdGF0ZSA9IG5ld1N0YXRlOworICB9OworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEhUTUxCYXJzTW9ycGg7Cit9KTsKK2VuaWZlZCgiaHRtbGJhcnMt
cnVudGltZS9ub2RlLXZpc2l0b3IiLCBbImV4cG9ydHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11
dGlscyIsICJodG1sYmFycy1ydW50aW1lL2V4cHJlc3Npb24tdmlzaXRvciJdLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMsIF9odG1sYmFyc1J1bnRpbWVFeHByZXNz
aW9uVmlzaXRvcikgeworICAidXNlIHN0cmljdCI7CisKKyAgLyoqCisgICAgTm9kZSBjbGFzc2lm
aWNhdGlvbjoKKyAgCisgICAgIyBQcmltYXJ5IFN0YXRlbWVudCBOb2RlczoKKyAgCisgICAgVGhl
c2Ugbm9kZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBhIHJlbmRlciBub2RlIHRoYXQgcmVwcmVzZW50
cyBhIG1vcnBoLXJhbmdlLgorICAKKyAgICAqIGJsb2NrCisgICAgKiBpbmxpbmUKKyAgICAqIGNv
bnRlbnQKKyAgICAqIGVsZW1lbnQKKyAgICAqIGNvbXBvbmVudAorICAKKyAgICAjIExlYWYgU3Rh
dGVtZW50IE5vZGVzOgorICAKKyAgICBUaGlzIG5vZGUgaXMgcmVzcG9uc2libGUgZm9yIGEgcmVu
ZGVyIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbW9ycGgtYXR0ci4KKyAgCisgICAgKiBhdHRyaWJ1
dGUKKyAgKi8KKworICBmdW5jdGlvbiBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNjb3BlLCBtb3Jw
aCwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgaWYgKG1vcnBoLmxpbmtlZFBhcmFtcykgewor
ICAgICAgcGFyYW1zID0gbW9ycGgubGlua2VkUGFyYW1zLnBhcmFtczsKKyAgICAgIGhhc2ggPSBt
b3JwaC5saW5rZWRQYXJhbXMuaGFzaDsKKyAgICB9IGVsc2UgeworICAgICAgcGFyYW1zID0gcGFy
YW1zICYmIF9odG1sYmFyc1J1bnRpbWVFeHByZXNzaW9uVmlzaXRvci5hY2NlcHRQYXJhbXMocGFy
YW1zLCBlbnYsIHNjb3BlKTsKKyAgICAgIGhhc2ggPSBoYXNoICYmIF9odG1sYmFyc1J1bnRpbWVF
eHByZXNzaW9uVmlzaXRvci5hY2NlcHRIYXNoKGhhc2gsIGVudiwgc2NvcGUpOworICAgIH0KKwor
ICAgIF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXMoZW52LCBzY29wZSwgbW9ycGgs
IHBhdGgsIHBhcmFtcywgaGFzaCk7CisgICAgcmV0dXJuIFtwYXJhbXMsIGhhc2hdOworICB9CisK
KyAgdmFyIEFsd2F5c0RpcnR5VmlzaXRvciA9IHsKKworICAgIGJsb2NrOiBmdW5jdGlvbiAobm9k
ZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0
aCA9IG5vZGVbMV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBoYXNo
ID0gbm9kZVszXTsKKyAgICAgIHZhciB0ZW1wbGF0ZUlkID0gbm9kZVs0XTsKKyAgICAgIHZhciBp
bnZlcnNlSWQgPSBub2RlWzVdOworCisgICAgICB2YXIgcGFyYW1zQW5kSGFzaCA9IGxpbmtQYXJh
bXNBbmRIYXNoKGVudiwgc2NvcGUsIG1vcnBoLCBwYXRoLCBwYXJhbXMsIGhhc2gpOworCisgICAg
ICBtb3JwaC5pc0RpcnR5ID0gbW9ycGguaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAgICAgIGVu
di5ob29rcy5ibG9jayhtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwg
cGFyYW1zQW5kSGFzaFsxXSwgdGVtcGxhdGVJZCA9PT0gbnVsbCA/IG51bGwgOiB0ZW1wbGF0ZS50
ZW1wbGF0ZXNbdGVtcGxhdGVJZF0sIGludmVyc2VJZCA9PT0gbnVsbCA/IG51bGwgOiB0ZW1wbGF0
ZS50ZW1wbGF0ZXNbaW52ZXJzZUlkXSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIGlubGluZTog
ZnVuY3Rpb24gKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIg
cGF0aCA9IG5vZGVbMV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBo
YXNoID0gbm9kZVszXTsKKworICAgICAgdmFyIHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5k
SGFzaChlbnYsIHNjb3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgbW9y
cGguaXNEaXJ0eSA9IG1vcnBoLmlzU3VidHJlZURpcnR5ID0gZmFsc2U7CisgICAgICBlbnYuaG9v
a3MuaW5saW5lKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXNBbmRIYXNoWzBdLCBwYXJh
bXNBbmRIYXNoWzFdLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgY29udGVudDogZnVuY3Rpb24g
KG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0aCA9IG5v
ZGVbMV07CisKKyAgICAgIG1vcnBoLmlzRGlydHkgPSBtb3JwaC5pc1N1YnRyZWVEaXJ0eSA9IGZh
bHNlOworCisgICAgICBpZiAoaXNIZWxwZXIoZW52LCBzY29wZSwgcGF0aCkpIHsKKyAgICAgICAg
ZW52Lmhvb2tzLmlubGluZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgW10sIHt9LCB2aXNpdG9y
KTsKKyAgICAgICAgaWYgKG1vcnBoLmxpbmtlZFJlc3VsdCkgeworICAgICAgICAgIF9odG1sYmFy
c1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXMoZW52LCBzY29wZSwgbW9ycGgsICdAY29udGVudC1o
ZWxwZXInLCBbbW9ycGgubGlua2VkUmVzdWx0XSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcGFyYW1zID0gdW5kZWZpbmVkOworICAgICAg
aWYgKG1vcnBoLmxpbmtlZFBhcmFtcykgeworICAgICAgICBwYXJhbXMgPSBtb3JwaC5saW5rZWRQ
YXJhbXMucGFyYW1zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW1zID0gW2Vudi5ob29r
cy5nZXQoZW52LCBzY29wZSwgcGF0aCldOworICAgICAgfQorCisgICAgICBfaHRtbGJhcnNVdGls
TW9ycGhVdGlscy5saW5rUGFyYW1zKGVudiwgc2NvcGUsIG1vcnBoLCAnQHJhbmdlJywgcGFyYW1z
LCBudWxsKTsKKyAgICAgIGVudi5ob29rcy5yYW5nZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwg
cGFyYW1zWzBdLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgZWxlbWVudDogZnVuY3Rpb24gKG5v
ZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0aCA9IG5vZGVb
MV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBoYXNoID0gbm9kZVsz
XTsKKworICAgICAgdmFyIHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNj
b3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgbW9ycGguaXNEaXJ0eSA9
IG1vcnBoLmlzU3VidHJlZURpcnR5ID0gZmFsc2U7CisgICAgICBlbnYuaG9va3MuZWxlbWVudCht
b3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwgcGFyYW1zQW5kSGFzaFsx
XSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIGF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG1v
cnBoLCBlbnYsIHNjb3BlKSB7CisgICAgICB2YXIgbmFtZSA9IG5vZGVbMV07CisgICAgICB2YXIg
dmFsdWUgPSBub2RlWzJdOworCisgICAgICB2YXIgcGFyYW1zQW5kSGFzaCA9IGxpbmtQYXJhbXNB
bmRIYXNoKGVudiwgc2NvcGUsIG1vcnBoLCAnQGF0dHJpYnV0ZScsIFt2YWx1ZV0sIG51bGwpOwor
CisgICAgICBtb3JwaC5pc0RpcnR5ID0gbW9ycGguaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAg
ICAgIGVudi5ob29rcy5hdHRyaWJ1dGUobW9ycGgsIGVudiwgc2NvcGUsIG5hbWUsIHBhcmFtc0Fu
ZEhhc2hbMF1bMF0pOworICAgIH0sCisKKyAgICBjb21wb25lbnQ6IGZ1bmN0aW9uIChub2RlLCBt
b3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBwYXRoID0g
bm9kZVsxXTsKKyAgICAgIHZhciBhdHRycyA9IG5vZGVbMl07CisgICAgICB2YXIgdGVtcGxhdGVJ
ZCA9IG5vZGVbM107CisgICAgICB2YXIgaW52ZXJzZUlkID0gbm9kZVs0XTsKKworICAgICAgdmFy
IHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNjb3BlLCBtb3JwaCwgcGF0
aCwgW10sIGF0dHJzKTsKKyAgICAgIHZhciB0ZW1wbGF0ZXMgPSB7CisgICAgICAgIGRlZmF1bHQ6
IHRlbXBsYXRlLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSwKKyAgICAgICAgaW52ZXJzZTogdGVtcGxh
dGUudGVtcGxhdGVzW2ludmVyc2VJZF0KKyAgICAgIH07CisKKyAgICAgIG1vcnBoLmlzRGlydHkg
PSBtb3JwaC5pc1N1YnRyZWVEaXJ0eSA9IGZhbHNlOworICAgICAgZW52Lmhvb2tzLmNvbXBvbmVu
dChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwgcGFyYW1zQW5kSGFz
aFsxXSwgdGVtcGxhdGVzLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgYXR0cmlidXRlczogZnVu
Y3Rpb24gKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJlbnRNb3JwaCwgdmlzaXRvcikgewor
ICAgICAgdmFyIHRlbXBsYXRlID0gbm9kZVsxXTsKKworICAgICAgZW52Lmhvb2tzLmF0dHJpYnV0
ZXMobW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCBwYXJlbnRNb3JwaCwgdmlzaXRvcik7Cisg
ICAgfQorCisgIH07CisKKyAgZXhwb3J0cy5BbHdheXNEaXJ0eVZpc2l0b3IgPSBBbHdheXNEaXJ0
eVZpc2l0b3I7CisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBibG9jazogZnVuY3Rpb24gKG5v
ZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB0ZW1wbGF0ZSwgdmlzaXRvcikgeworICAgICAgZGlydHlD
aGVjayhlbnYsIG1vcnBoLCB2aXNpdG9yLCBmdW5jdGlvbiAodmlzaXRvcikgeworICAgICAgICBB
bHdheXNEaXJ0eVZpc2l0b3IuYmxvY2sobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRl
LCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBpbmxpbmU6IGZ1bmN0aW9uIChu
b2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvcikgeworICAgICAgZGlydHlDaGVjayhlbnYs
IG1vcnBoLCB2aXNpdG9yLCBmdW5jdGlvbiAodmlzaXRvcikgeworICAgICAgICBBbHdheXNEaXJ0
eVZpc2l0b3IuaW5saW5lKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKTsKKyAgICAg
IH0pOworICAgIH0sCisKKyAgICBjb250ZW50OiBmdW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwg
c2NvcGUsIHZpc2l0b3IpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgdmlzaXRvciwg
ZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICAgICAgQWx3YXlzRGlydHlWaXNpdG9yLmNvbnRlbnQo
bm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHZpc2l0b3IpOworICAgICAgfSk7CisgICAgfSwKKwor
ICAgIGVsZW1lbnQ6IGZ1bmN0aW9uIChub2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUs
IHZpc2l0b3IpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgdmlzaXRvciwgZnVuY3Rp
b24gKHZpc2l0b3IpIHsKKyAgICAgICAgQWx3YXlzRGlydHlWaXNpdG9yLmVsZW1lbnQobm9kZSwg
bW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0s
CisKKyAgICBhdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdGVt
cGxhdGUpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgbnVsbCwgZnVuY3Rpb24gKCkg
eworICAgICAgICBBbHdheXNEaXJ0eVZpc2l0b3IuYXR0cmlidXRlKG5vZGUsIG1vcnBoLCBlbnYs
IHNjb3BlLCB0ZW1wbGF0ZSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgY29tcG9uZW50OiBm
dW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKSB7Cisg
ICAgICBkaXJ0eUNoZWNrKGVudiwgbW9ycGgsIHZpc2l0b3IsIGZ1bmN0aW9uICh2aXNpdG9yKSB7
CisgICAgICAgIEFsd2F5c0RpcnR5VmlzaXRvci5jb21wb25lbnQobm9kZSwgbW9ycGgsIGVudiwg
c2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBhdHRy
aWJ1dGVzOiBmdW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHBhcmVudE1vcnBoLCB2
aXNpdG9yKSB7CisgICAgICBBbHdheXNEaXJ0eVZpc2l0b3IuYXR0cmlidXRlcyhub2RlLCBtb3Jw
aCwgZW52LCBzY29wZSwgcGFyZW50TW9ycGgsIHZpc2l0b3IpOworICAgIH0KKyAgfTsKKworICBm
dW5jdGlvbiBkaXJ0eUNoZWNrKF9lbnYsIG1vcnBoLCB2aXNpdG9yLCBjYWxsYmFjaykgeworICAg
IHZhciBpc0RpcnR5ID0gbW9ycGguaXNEaXJ0eTsKKyAgICB2YXIgaXNTdWJ0cmVlRGlydHkgPSBt
b3JwaC5pc1N1YnRyZWVEaXJ0eTsKKyAgICB2YXIgZW52ID0gX2VudjsKKworICAgIGlmIChpc1N1
YnRyZWVEaXJ0eSkgeworICAgICAgdmlzaXRvciA9IEFsd2F5c0RpcnR5VmlzaXRvcjsKKyAgICB9
CisKKyAgICBpZiAoaXNEaXJ0eSB8fCBpc1N1YnRyZWVEaXJ0eSkgeworICAgICAgY2FsbGJhY2so
dmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtb3JwaC5idWlsZENoaWxkRW52KSB7
CisgICAgICAgIGVudiA9IG1vcnBoLmJ1aWxkQ2hpbGRFbnYobW9ycGguZ2V0U3RhdGUoKSwgZW52
KTsKKyAgICAgIH0KKyAgICAgIF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLnZhbGlkYXRlQ2hpbGRN
b3JwaHMoZW52LCBtb3JwaCwgdmlzaXRvcik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gaXNI
ZWxwZXIoZW52LCBzY29wZSwgcGF0aCkgeworICAgIHJldHVybiBlbnYuaG9va3Mua2V5d29yZHNb
cGF0aF0gIT09IHVuZGVmaW5lZCB8fCBlbnYuaG9va3MuaGFzSGVscGVyKGVudiwgc2NvcGUsIHBh
dGgpOworICB9Cit9KTsKK2VuaWZlZCgiaHRtbGJhcnMtcnVudGltZS9yZW5kZXIiLCBbImV4cG9y
dHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11dGlscyIsICJodG1sYmFycy1ydW50aW1lL25vZGUt
dmlzaXRvciIsICJodG1sYmFycy1ydW50aW1lL21vcnBoIiwgImh0bWxiYXJzLXV0aWwvdGVtcGxh
dGUtdXRpbHMiLCAiaHRtbGJhcnMtdXRpbC92b2lkLXRhZy1uYW1lcyJdLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMsIF9odG1sYmFyc1J1bnRpbWVOb2RlVmlzaXRv
ciwgX2h0bWxiYXJzUnVudGltZU1vcnBoLCBfaHRtbGJhcnNVdGlsVGVtcGxhdGVVdGlscywgX2h0
bWxiYXJzVXRpbFZvaWRUYWdOYW1lcykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5k
ZWZhdWx0ID0gcmVuZGVyOworICBleHBvcnRzLlJlbmRlck9wdGlvbnMgPSBSZW5kZXJPcHRpb25z
OworICBleHBvcnRzLm1hbnVhbEVsZW1lbnQgPSBtYW51YWxFbGVtZW50OworICBleHBvcnRzLmF0
dGFjaEF0dHJpYnV0ZXMgPSBhdHRhY2hBdHRyaWJ1dGVzOworICBleHBvcnRzLmNyZWF0ZUNoaWxk
TW9ycGggPSBjcmVhdGVDaGlsZE1vcnBoOworICBleHBvcnRzLmdldENhY2hlZEZyYWdtZW50ID0g
Z2V0Q2FjaGVkRnJhZ21lbnQ7CisKKyAgdmFyIHN2Z05hbWVzcGFjZSA9ICJodHRwOi8vd3d3Lncz
Lm9yZy8yMDAwL3N2ZyI7CisKKyAgZnVuY3Rpb24gcmVuZGVyKHRlbXBsYXRlLCBlbnYsIHNjb3Bl
LCBvcHRpb25zKSB7CisgICAgdmFyIGRvbSA9IGVudi5kb207CisgICAgdmFyIGNvbnRleHR1YWxF
bGVtZW50OworCisgICAgaWYgKG9wdGlvbnMpIHsKKyAgICAgIGlmIChvcHRpb25zLnJlbmRlck5v
ZGUpIHsKKyAgICAgICAgY29udGV4dHVhbEVsZW1lbnQgPSBvcHRpb25zLnJlbmRlck5vZGUuY29u
dGV4dHVhbEVsZW1lbnQ7CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY29udGV4dHVhbEVsZW1l
bnQpIHsKKyAgICAgICAgY29udGV4dHVhbEVsZW1lbnQgPSBvcHRpb25zLmNvbnRleHR1YWxFbGVt
ZW50OworICAgICAgfQorICAgIH0KKworICAgIGRvbS5kZXRlY3ROYW1lc3BhY2UoY29udGV4dHVh
bEVsZW1lbnQpOworCisgICAgdmFyIHJlbmRlclJlc3VsdCA9IFJlbmRlclJlc3VsdC5idWlsZChl
bnYsIHNjb3BlLCB0ZW1wbGF0ZSwgb3B0aW9ucywgY29udGV4dHVhbEVsZW1lbnQpOworICAgIHJl
bmRlclJlc3VsdC5yZW5kZXIoKTsKKworICAgIHJldHVybiByZW5kZXJSZXN1bHQ7CisgIH0KKwor
ICBmdW5jdGlvbiBSZW5kZXJPcHRpb25zKHJlbmRlck5vZGUsIHNlbGYsIGJsb2NrQXJndW1lbnRz
LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMucmVuZGVyTm9kZSA9IHJlbmRlck5vZGUg
fHwgbnVsbDsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICAgIHRoaXMuYmxvY2tBcmd1bWVudHMg
PSBibG9ja0FyZ3VtZW50cyB8fCBudWxsOworICAgIHRoaXMuY29udGV4dHVhbEVsZW1lbnQgPSBj
b250ZXh0dWFsRWxlbWVudCB8fCBudWxsOworICB9CisKKyAgZnVuY3Rpb24gUmVuZGVyUmVzdWx0
KGVudiwgc2NvcGUsIG9wdGlvbnMsIHJvb3ROb2RlLCBvd25lck5vZGUsIG5vZGVzLCBmcmFnbWVu
dCwgdGVtcGxhdGUsIHNob3VsZFNldENvbnRlbnQpIHsKKyAgICB0aGlzLnJvb3QgPSByb290Tm9k
ZTsKKyAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisKKyAgICB0aGlzLm5vZGVzID0gbm9k
ZXM7CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgIHRoaXMuc3RhdGVtZW50cyA9
IHRlbXBsYXRlLnN0YXRlbWVudHMuc2xpY2UoKTsKKyAgICB0aGlzLmVudiA9IGVudjsKKyAgICB0
aGlzLnNjb3BlID0gc2NvcGU7CisgICAgdGhpcy5zaG91bGRTZXRDb250ZW50ID0gc2hvdWxkU2V0
Q29udGVudDsKKworICAgIGlmIChvcHRpb25zLnNlbGYgIT09IHVuZGVmaW5lZCkgeworICAgICAg
dGhpcy5iaW5kU2VsZihvcHRpb25zLnNlbGYpOworICAgIH0KKyAgICBpZiAob3B0aW9ucy5ibG9j
a0FyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLmJpbmRMb2NhbHMob3B0aW9u
cy5ibG9ja0FyZ3VtZW50cyk7CisgICAgfQorCisgICAgdGhpcy5pbml0aWFsaXplTm9kZXMob3du
ZXJOb2RlKTsKKyAgfQorCisgIFJlbmRlclJlc3VsdC5idWlsZCA9IGZ1bmN0aW9uIChlbnYsIHNj
b3BlLCB0ZW1wbGF0ZSwgb3B0aW9ucywgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgZG9t
ID0gZW52LmRvbTsKKyAgICB2YXIgZnJhZ21lbnQgPSBnZXRDYWNoZWRGcmFnbWVudCh0ZW1wbGF0
ZSwgZW52KTsKKyAgICB2YXIgbm9kZXMgPSB0ZW1wbGF0ZS5idWlsZFJlbmRlck5vZGVzKGRvbSwg
ZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KTsKKworICAgIHZhciByb290Tm9kZSwgb3duZXJO
b2RlLCBzaG91bGRTZXRDb250ZW50OworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZW5k
ZXJOb2RlKSB7CisgICAgICByb290Tm9kZSA9IG9wdGlvbnMucmVuZGVyTm9kZTsKKyAgICAgIG93
bmVyTm9kZSA9IHJvb3ROb2RlLm93bmVyTm9kZTsKKyAgICAgIHNob3VsZFNldENvbnRlbnQgPSB0
cnVlOworICAgIH0gZWxzZSB7CisgICAgICByb290Tm9kZSA9IGRvbS5jcmVhdGVNb3JwaChudWxs
LCBmcmFnbWVudC5maXJzdENoaWxkLCBmcmFnbWVudC5sYXN0Q2hpbGQsIGNvbnRleHR1YWxFbGVt
ZW50KTsKKyAgICAgIG93bmVyTm9kZSA9IHJvb3ROb2RlOworICAgICAgcm9vdE5vZGUub3duZXJO
b2RlID0gb3duZXJOb2RlOworICAgICAgc2hvdWxkU2V0Q29udGVudCA9IGZhbHNlOworICAgIH0K
KworICAgIGlmIChyb290Tm9kZS5jaGlsZE5vZGVzKSB7CisgICAgICBfaHRtbGJhcnNVdGlsTW9y
cGhVdGlscy52aXNpdENoaWxkcmVuKHJvb3ROb2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uIChub2Rl
KSB7CisgICAgICAgIF9odG1sYmFyc1V0aWxUZW1wbGF0ZVV0aWxzLmNsZWFyTW9ycGgobm9kZSwg
ZW52LCB0cnVlKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHJvb3ROb2RlLmNoaWxkTm9kZXMg
PSBub2RlczsKKyAgICByZXR1cm4gbmV3IFJlbmRlclJlc3VsdChlbnYsIHNjb3BlLCBvcHRpb25z
LCByb290Tm9kZSwgb3duZXJOb2RlLCBub2RlcywgZnJhZ21lbnQsIHRlbXBsYXRlLCBzaG91bGRT
ZXRDb250ZW50KTsKKyAgfTsKKworICBmdW5jdGlvbiBtYW51YWxFbGVtZW50KHRhZ05hbWUsIGF0
dHJpYnV0ZXMsIF9pc0VtcHR5KSB7CisgICAgdmFyIHN0YXRlbWVudHMgPSBbXTsKKworICAgIGZv
ciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7CisgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNb
a2V5XSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBz
dGF0ZW1lbnRzLnB1c2goWyJhdHRyaWJ1dGUiLCBrZXksIGF0dHJpYnV0ZXNba2V5XV0pOworICAg
IH0KKworICAgIHZhciBpc0VtcHR5ID0gX2lzRW1wdHkgfHwgX2h0bWxiYXJzVXRpbFZvaWRUYWdO
YW1lcy5kZWZhdWx0W3RhZ05hbWVdOworCisgICAgaWYgKCFpc0VtcHR5KSB7CisgICAgICBzdGF0
ZW1lbnRzLnB1c2goWydjb250ZW50JywgJ3lpZWxkJ10pOworICAgIH0KKworICAgIHZhciB0ZW1w
bGF0ZSA9IHsKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBi
dWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50
RnJhZ21lbnQoKTsKKyAgICAgICAgaWYgKHRhZ05hbWUgPT09ICdzdmcnKSB7CisgICAgICAgICAg
ZG9tLnNldE5hbWVzcGFjZShzdmdOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIHZhciBl
bDEgPSBkb20uY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKKworICAgICAgICBmb3IgKHZhciBrZXkg
aW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1trZXldICE9
PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAg
ICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCBrZXksIGF0dHJpYnV0ZXNba2V5XSk7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIWlzRW1wdHkpIHsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNy
ZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgIH0KKworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworCisgICAgICAg
IHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50KSB7CisgICAgICAgIHZhciBlbGVtZW50ID0g
ZG9tLmNoaWxkQXQoZnJhZ21lbnQsIFswXSk7CisgICAgICAgIHZhciBtb3JwaHMgPSBbXTsKKwor
ICAgICAgICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBl
b2YgYXR0cmlidXRlc1trZXldID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgfQorICAgICAgICAgIG1vcnBocy5wdXNoKGRvbS5jcmVhdGVBdHRyTW9ycGgo
ZWxlbWVudCwga2V5KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRW1wdHkpIHsKKyAg
ICAgICAgICBtb3JwaHMucHVzaChkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50LCAwLCAwKSk7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRl
bWVudHM6IHN0YXRlbWVudHMsCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBb
XQorICAgIH07CisKKyAgICByZXR1cm4gdGVtcGxhdGU7CisgIH0KKworICBmdW5jdGlvbiBhdHRh
Y2hBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHsKKyAgICB2YXIgc3RhdGVtZW50cyA9IFtdOworCisg
ICAgZm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHsKKyAgICAgIGlmICh0eXBlb2YgYXR0cmli
dXRlc1trZXldID09PSAnc3RyaW5nJykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAg
ICAgIHN0YXRlbWVudHMucHVzaChbImF0dHJpYnV0ZSIsIGtleSwgYXR0cmlidXRlc1trZXldXSk7
CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlID0geworICAgICAgYXJpdHk6IDAsCisgICAgICBj
YWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1
aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBl
bDAgPSB0aGlzLmVsZW1lbnQ7CisgICAgICAgIGlmIChlbDAubmFtZXNwYWNlVVJJID09PSAiaHR0
cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSB7CisgICAgICAgICAgZG9tLnNldE5hbWVzcGFjZShz
dmdOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGtleSBpbiBhdHRyaWJ1
dGVzKSB7CisgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09ICdzdHJpbmcn
KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9tLnNl
dEF0dHJpYnV0ZShlbDAsIGtleSwgYXR0cmlidXRlc1trZXldKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rp
b24gYnVpbGRSZW5kZXJOb2Rlcyhkb20pIHsKKyAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVs
ZW1lbnQ7CisgICAgICAgIHZhciBtb3JwaHMgPSBbXTsKKworICAgICAgICBmb3IgKHZhciBrZXkg
aW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1trZXldID09
PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAg
ICAgIG1vcnBocy5wdXNoKGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudCwga2V5KSk7CisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRlbWVu
dHM6IHN0YXRlbWVudHMsCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXSwK
KyAgICAgIGVsZW1lbnQ6IG51bGwKKyAgICB9OworCisgICAgcmV0dXJuIHRlbXBsYXRlOworICB9
CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlwZS5pbml0aWFsaXplTm9kZXMgPSBmdW5jdGlvbiAo
b3duZXJOb2RlKSB7CisgICAgdmFyIGNoaWxkTm9kZXMgPSB0aGlzLnJvb3QuY2hpbGROb2RlczsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKKyAgICAgIGNoaWxkTm9kZXNbaV0ub3duZXJOb2RlID0gb3duZXJOb2RlOworICAgIH0KKyAg
fTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB0aGlzLnJvb3QubGFzdFJlc3VsdCA9IHRoaXM7CisgICAgdGhpcy5yb290LnJlbmRlcmVkID0g
dHJ1ZTsKKyAgICB0aGlzLnBvcHVsYXRlTm9kZXMoX2h0bWxiYXJzUnVudGltZU5vZGVWaXNpdG9y
LkFsd2F5c0RpcnR5VmlzaXRvcik7CisKKyAgICBpZiAodGhpcy5zaG91bGRTZXRDb250ZW50ICYm
IHRoaXMucm9vdC5zZXRDb250ZW50KSB7CisgICAgICB0aGlzLnJvb3Quc2V0Q29udGVudCh0aGlz
LmZyYWdtZW50KTsKKyAgICB9CisgIH07CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlwZS5kaXJ0
eSA9IGZ1bmN0aW9uICgpIHsKKyAgICBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscy52aXNpdENoaWxk
cmVuKFt0aGlzLnJvb3RdLCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgbm9kZS5pc0RpcnR5ID0g
dHJ1ZTsKKyAgICB9KTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBlLnJldmFsaWRh
dGUgPSBmdW5jdGlvbiAoZW52LCBzZWxmLCBibG9ja0FyZ3VtZW50cywgc2NvcGUpIHsKKyAgICB0
aGlzLnJldmFsaWRhdGVXaXRoKGVudiwgc2NvcGUsIHNlbGYsIGJsb2NrQXJndW1lbnRzLCBfaHRt
bGJhcnNSdW50aW1lTm9kZVZpc2l0b3IuZGVmYXVsdCk7CisgIH07CisKKyAgUmVuZGVyUmVzdWx0
LnByb3RvdHlwZS5yZXJlbmRlciA9IGZ1bmN0aW9uIChlbnYsIHNlbGYsIGJsb2NrQXJndW1lbnRz
LCBzY29wZSkgeworICAgIHRoaXMucmV2YWxpZGF0ZVdpdGgoZW52LCBzY29wZSwgc2VsZiwgYmxv
Y2tBcmd1bWVudHMsIF9odG1sYmFyc1J1bnRpbWVOb2RlVmlzaXRvci5BbHdheXNEaXJ0eVZpc2l0
b3IpOworICB9OworCisgIFJlbmRlclJlc3VsdC5wcm90b3R5cGUucmV2YWxpZGF0ZVdpdGggPSBm
dW5jdGlvbiAoZW52LCBzY29wZSwgc2VsZiwgYmxvY2tBcmd1bWVudHMsIHZpc2l0b3IpIHsKKyAg
ICBpZiAoZW52ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRoaXMuZW52ID0gZW52OworICAgIH0K
KyAgICBpZiAoc2NvcGUgIT09IHVuZGVmaW5lZCkgeworICAgICAgdGhpcy5zY29wZSA9IHNjb3Bl
OworICAgIH0KKyAgICB0aGlzLnVwZGF0ZVNjb3BlKCk7CisKKyAgICBpZiAoc2VsZiAhPT0gdW5k
ZWZpbmVkKSB7CisgICAgICB0aGlzLnVwZGF0ZVNlbGYoc2VsZik7CisgICAgfQorICAgIGlmIChi
bG9ja0FyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLnVwZGF0ZUxvY2Fscyhi
bG9ja0FyZ3VtZW50cyk7CisgICAgfQorCisgICAgdGhpcy5wb3B1bGF0ZU5vZGVzKHZpc2l0b3Ip
OworICB9OworCisgIFJlbmRlclJlc3VsdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgp
IHsKKyAgICB2YXIgcm9vdE5vZGUgPSB0aGlzLnJvb3Q7CisgICAgX2h0bWxiYXJzVXRpbFRlbXBs
YXRlVXRpbHMuY2xlYXJNb3JwaChyb290Tm9kZSwgdGhpcy5lbnYsIHRydWUpOworICB9OworCisg
IFJlbmRlclJlc3VsdC5wcm90b3R5cGUucG9wdWxhdGVOb2RlcyA9IGZ1bmN0aW9uICh2aXNpdG9y
KSB7CisgICAgdmFyIGVudiA9IHRoaXMuZW52OworICAgIHZhciBzY29wZSA9IHRoaXMuc2NvcGU7
CisgICAgdmFyIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTsKKyAgICB2YXIgbm9kZXMgPSB0aGlz
Lm5vZGVzOworICAgIHZhciBzdGF0ZW1lbnRzID0gdGhpcy5zdGF0ZW1lbnRzOworICAgIHZhciBp
LCBsOworCisgICAgZm9yIChpID0gMCwgbCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICB2YXIgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKKyAgICAgIHZhciBtb3Jw
aCA9IG5vZGVzW2ldOworCisgICAgICBpZiAoZW52Lmhvb2tzLndpbGxSZW5kZXJOb2RlKSB7Cisg
ICAgICAgIGVudi5ob29rcy53aWxsUmVuZGVyTm9kZShtb3JwaCwgZW52LCBzY29wZSk7CisgICAg
ICB9CisKKyAgICAgIHN3aXRjaCAoc3RhdGVtZW50WzBdKSB7CisgICAgICAgIGNhc2UgJ2Jsb2Nr
JzoKKyAgICAgICAgICB2aXNpdG9yLmJsb2NrKHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUs
IHRlbXBsYXRlLCB2aXNpdG9yKTticmVhazsKKyAgICAgICAgY2FzZSAnaW5saW5lJzoKKyAgICAg
ICAgICB2aXNpdG9yLmlubGluZShzdGF0ZW1lbnQsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9y
KTticmVhazsKKyAgICAgICAgY2FzZSAnY29udGVudCc6CisgICAgICAgICAgdmlzaXRvci5jb250
ZW50KHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUsIHZpc2l0b3IpO2JyZWFrOworICAgICAg
ICBjYXNlICdlbGVtZW50JzoKKyAgICAgICAgICB2aXNpdG9yLmVsZW1lbnQoc3RhdGVtZW50LCBt
b3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIHZpc2l0b3IpO2JyZWFrOworICAgICAgICBjYXNl
ICdhdHRyaWJ1dGUnOgorICAgICAgICAgIHZpc2l0b3IuYXR0cmlidXRlKHN0YXRlbWVudCwgbW9y
cGgsIGVudiwgc2NvcGUpO2JyZWFrOworICAgICAgICBjYXNlICdjb21wb25lbnQnOgorICAgICAg
ICAgIHZpc2l0b3IuY29tcG9uZW50KHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBs
YXRlLCB2aXNpdG9yKTticmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGVudi5ob29rcy5kaWRS
ZW5kZXJOb2RlKSB7CisgICAgICAgIGVudi5ob29rcy5kaWRSZW5kZXJOb2RlKG1vcnBoLCBlbnYs
IHNjb3BlKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlw
ZS5iaW5kU2NvcGUgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5lbnYuaG9va3MuYmluZFNjb3Bl
KHRoaXMuZW52LCB0aGlzLnNjb3BlKTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBl
LnVwZGF0ZVNjb3BlID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMuZW52Lmhvb2tzLnVwZGF0ZVNj
b3BlKHRoaXMuZW52LCB0aGlzLnNjb3BlKTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90
eXBlLmJpbmRTZWxmID0gZnVuY3Rpb24gKHNlbGYpIHsKKyAgICB0aGlzLmVudi5ob29rcy5iaW5k
U2VsZih0aGlzLmVudiwgdGhpcy5zY29wZSwgc2VsZik7CisgIH07CisKKyAgUmVuZGVyUmVzdWx0
LnByb3RvdHlwZS51cGRhdGVTZWxmID0gZnVuY3Rpb24gKHNlbGYpIHsKKyAgICB0aGlzLmVudi5o
b29rcy51cGRhdGVTZWxmKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBzZWxmKTsKKyAgfTsKKworICBS
ZW5kZXJSZXN1bHQucHJvdG90eXBlLmJpbmRMb2NhbHMgPSBmdW5jdGlvbiAoYmxvY2tBcmd1bWVu
dHMpIHsKKyAgICB2YXIgbG9jYWxOYW1lcyA9IHRoaXMudGVtcGxhdGUubG9jYWxzOworCisgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBsb2NhbE5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgdGhpcy5lbnYuaG9va3MuYmluZExvY2FsKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBsb2NhbE5h
bWVzW2ldLCBibG9ja0FyZ3VtZW50c1tpXSk7CisgICAgfQorICB9OworCisgIFJlbmRlclJlc3Vs
dC5wcm90b3R5cGUudXBkYXRlTG9jYWxzID0gZnVuY3Rpb24gKGJsb2NrQXJndW1lbnRzKSB7Cisg
ICAgdmFyIGxvY2FsTmFtZXMgPSB0aGlzLnRlbXBsYXRlLmxvY2FsczsKKworICAgIGZvciAodmFy
IGkgPSAwLCBsID0gbG9jYWxOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHRoaXMu
ZW52Lmhvb2tzLnVwZGF0ZUxvY2FsKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBsb2NhbE5hbWVzW2ld
LCBibG9ja0FyZ3VtZW50c1tpXSk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGluaXRpYWxp
emVOb2RlKG5vZGUsIG93bmVyKSB7CisgICAgbm9kZS5vd25lck5vZGUgPSBvd25lcjsKKyAgfQor
CisgIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkTW9ycGgoZG9tLCBwYXJlbnRNb3JwaCwgY29udGV4dHVh
bEVsZW1lbnQpIHsKKyAgICB2YXIgbW9ycGggPSBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVs
dC5lbXB0eShkb20sIGNvbnRleHR1YWxFbGVtZW50IHx8IHBhcmVudE1vcnBoLmNvbnRleHR1YWxF
bGVtZW50KTsKKyAgICBpbml0aWFsaXplTm9kZShtb3JwaCwgcGFyZW50TW9ycGgub3duZXJOb2Rl
KTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH0KKworICBmdW5jdGlvbiBnZXRDYWNoZWRGcmFnbWVu
dCh0ZW1wbGF0ZSwgZW52KSB7CisgICAgdmFyIGRvbSA9IGVudi5kb20sCisgICAgICAgIGZyYWdt
ZW50OworICAgIGlmIChlbnYudXNlRnJhZ21lbnRDYWNoZSAmJiBkb20uY2FuQ2xvbmUpIHsKKyAg
ICAgIGlmICh0ZW1wbGF0ZS5jYWNoZWRGcmFnbWVudCA9PT0gbnVsbCkgeworICAgICAgICBmcmFn
bWVudCA9IHRlbXBsYXRlLmJ1aWxkRnJhZ21lbnQoZG9tKTsKKyAgICAgICAgaWYgKHRlbXBsYXRl
Lmhhc1JlbmRlcmVkKSB7CisgICAgICAgICAgdGVtcGxhdGUuY2FjaGVkRnJhZ21lbnQgPSBmcmFn
bWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0ZW1wbGF0ZS5oYXNSZW5kZXJlZCA9
IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0ZW1wbGF0ZS5jYWNoZWRGcmFn
bWVudCkgeworICAgICAgICBmcmFnbWVudCA9IGRvbS5jbG9uZU5vZGUodGVtcGxhdGUuY2FjaGVk
RnJhZ21lbnQsIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIWZyYWdtZW50KSB7Cisg
ICAgICBmcmFnbWVudCA9IHRlbXBsYXRlLmJ1aWxkRnJhZ21lbnQoZG9tKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZnJhZ21lbnQ7CisgIH0KK30pOworZW5pZmVkKCdodG1sYmFycy11dGlsJywgWydl
eHBvcnRzJywgJ2h0bWxiYXJzLXV0aWwvc2FmZS1zdHJpbmcnLCAnaHRtbGJhcnMtdXRpbC9oYW5k
bGViYXJzL3V0aWxzJywgJ2h0bWxiYXJzLXV0aWwvbmFtZXNwYWNlcycsICdodG1sYmFycy11dGls
L21vcnBoLXV0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfaHRtbGJhcnNVdGlsU2FmZVN0cmlu
ZywgX2h0bWxiYXJzVXRpbEhhbmRsZWJhcnNVdGlscywgX2h0bWxiYXJzVXRpbE5hbWVzcGFjZXMs
IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LlNhZmVTdHJpbmcgPSBfaHRtbGJhcnNVdGlsU2FmZVN0cmluZy5kZWZhdWx0OworICBleHBvcnRz
LmVzY2FwZUV4cHJlc3Npb24gPSBfaHRtbGJhcnNVdGlsSGFuZGxlYmFyc1V0aWxzLmVzY2FwZUV4
cHJlc3Npb247CisgIGV4cG9ydHMuZ2V0QXR0ck5hbWVzcGFjZSA9IF9odG1sYmFyc1V0aWxOYW1l
c3BhY2VzLmdldEF0dHJOYW1lc3BhY2U7CisgIGV4cG9ydHMudmFsaWRhdGVDaGlsZE1vcnBocyA9
IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLnZhbGlkYXRlQ2hpbGRNb3JwaHM7CisgIGV4cG9ydHMu
bGlua1BhcmFtcyA9IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXM7CisgIGV4cG9y
dHMuZHVtcCA9IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmR1bXA7Cit9KTsKK2VuaWZlZCgnaHRt
bGJhcnMtdXRpbC9hcnJheS11dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5mb3JFYWNoID0gZm9yRWFjaDsKKyAgZXhw
b3J0cy5tYXAgPSBtYXA7CisKKyAgZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIGJp
bmRpbmcpIHsKKyAgICB2YXIgaSwgbDsKKyAgICBpZiAoYmluZGluZyA9PT0gdW5kZWZpbmVkKSB7
CisgICAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAg
ICAgIGNhbGxiYWNrKGFycmF5W2ldLCBpLCBhcnJheSk7CisgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgIGZvciAoaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAg
ICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBhcnJheVtpXSwgaSwgYXJyYXkpOworICAgICAgfQor
ICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1hcChhcnJheSwgY2FsbGJhY2spIHsKKyAgICB2YXIg
b3V0cHV0ID0gW107CisgICAgdmFyIGksIGw7CisKKyAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXku
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBvdXRwdXQucHVzaChjYWxsYmFjayhhcnJheVtp
XSwgaSwgYXJyYXkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisKKyAgdmFy
IGdldElkeDsKKyAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CisgICAgZ2V0SWR4ID0g
ZnVuY3Rpb24gKGFycmF5LCBvYmosIGZyb20pIHsKKyAgICAgIHJldHVybiBhcnJheS5pbmRleE9m
KG9iaiwgZnJvbSk7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBnZXRJZHggPSBmdW5jdGlvbiAo
YXJyYXksIG9iaiwgZnJvbSkgeworICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCB8fCBmcm9t
ID09PSBudWxsKSB7CisgICAgICAgIGZyb20gPSAwOworICAgICAgfSBlbHNlIGlmIChmcm9tIDwg
MCkgeworICAgICAgICBmcm9tID0gTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoICsgZnJvbSk7Cisg
ICAgICB9CisgICAgICBmb3IgKHZhciBpID0gZnJvbSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7
IGkrKykgeworICAgICAgICBpZiAoYXJyYXlbaV0gPT09IG9iaikgeworICAgICAgICAgIHJldHVy
biBpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfTsKKyAgfQor
CisgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyYXkpIHsKKyAg
ICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gJ1tvYmpl
Y3QgQXJyYXldJzsKKyAgfTsKKworICBleHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5OworICB2YXIg
aW5kZXhPZkFycmF5ID0gZ2V0SWR4OworICBleHBvcnRzLmluZGV4T2ZBcnJheSA9IGluZGV4T2ZB
cnJheTsKK30pOworZW5pZmVkKCdodG1sYmFycy11dGlsL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLy8gQnVpbGQgb3V0IG91ciBi
YXNpYyBTYWZlU3RyaW5nIHR5cGUKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIFNhZmVT
dHJpbmcoc3RyaW5nKSB7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KKworICBTYWZl
U3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9
IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gJycgKyB0aGlzLnN0cmluZzsKKyAgfTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBTYWZlU3RyaW5nOworfSk7CitlbmlmZWQoJ2h0bWxiYXJzLXV0aWwv
aGFuZGxlYmFycy91dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7CisgIGV4cG9ydHMuaW5k
ZXhPZiA9IGluZGV4T2Y7CisgIGV4cG9ydHMuZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJl
c3Npb247CisgIGV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7CisgIGV4cG9ydHMuYmxvY2tQYXJh
bXMgPSBibG9ja1BhcmFtczsKKyAgZXhwb3J0cy5hcHBlbmRDb250ZXh0UGF0aCA9IGFwcGVuZENv
bnRleHRQYXRoOworICB2YXIgZXNjYXBlID0geworICAgICcmJzogJyZhbXA7JywKKyAgICAnPCc6
ICcmbHQ7JywKKyAgICAnPic6ICcmZ3Q7JywKKyAgICAnIic6ICcmcXVvdDsnLAorICAgICInIjog
JyYjeDI3OycsCisgICAgJ2AnOiAnJiN4NjA7JworICB9OworCisgIHZhciBiYWRDaGFycyA9IC9b
Jjw+IidgXS9nLAorICAgICAgcG9zc2libGUgPSAvWyY8PiInYF0vOworCisgIGZ1bmN0aW9uIGVz
Y2FwZUNoYXIoY2hyKSB7CisgICAgcmV0dXJuIGVzY2FwZVtjaHJdOworICB9CisKKyAgZnVuY3Rp
b24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykgeworICAgIGZvciAodmFyIGkgPSAxOyBp
IDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gYXJndW1l
bnRzW2ldKSB7CisgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNh
bGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7CisgICAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNb
aV1ba2V5XTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvYmo7Cisg
IH0KKworICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCisgIGV4
cG9ydHMudG9TdHJpbmcgPSB0b1N0cmluZzsKKyAgLy8gU291cmNlZCBmcm9tIGxvZGFzaAorICAv
LyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0Uu
dHh0CisgIC8qZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSwgbm8tdmFyICovCisgIHZhciBpc0Z1
bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0g
J2Z1bmN0aW9uJzsKKyAgfTsKKyAgLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENo
cm9tZSBhbmQgU2FmYXJpCisgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCisgIGlmIChpc0Z1
bmN0aW9uKC94LykpIHsKKyAgICBleHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uID0gZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24n
ICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOworICAgIH07
CisgIH0KKyAgdmFyIGlzRnVuY3Rpb247CisgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rp
b247CisgIC8qZXNsaW50LWVuYWJsZSBmdW5jLXN0eWxlLCBuby12YXIgKi8KKworICAvKiBpc3Rh
bmJ1bCBpZ25vcmUgbmV4dCAqLworICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29i
amVjdCcgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA6IGZhbHNl
OworICB9OworCisgIGV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CisgIC8vIE9sZGVyIElFIHZl
cnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1l
bnQgb3VyIG93biwgc2FkbHkuCisKKyAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHsK
KyAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAg
ICB9CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZ1bmN0aW9uIGVzY2FwZUV4cHJl
c3Npb24oc3RyaW5nKSB7CisgICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7Cisg
ICAgICAvLyBkb24ndCBlc2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBz
YWZlCisgICAgICBpZiAoc3RyaW5nICYmIHN0cmluZy50b0hUTUwpIHsKKyAgICAgICAgcmV0dXJu
IHN0cmluZy50b0hUTUwoKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyaW5nID09IG51bGwpIHsKKyAg
ICAgICAgcmV0dXJuICcnOworICAgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CisgICAgICAgIHJl
dHVybiBzdHJpbmcgKyAnJzsKKyAgICAgIH0KKworICAgICAgLy8gRm9yY2UgYSBzdHJpbmcgY29u
dmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5k
CisgICAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhp
bmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKKyAgICAgIC8vIGFuIG9iamVjdCdzIHRv
IHN0cmluZyBoYXMgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGl0LgorICAgICAgc3RyaW5nID0gJycg
KyBzdHJpbmc7CisgICAgfQorCisgICAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKKyAg
ICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRD
aGFycywgZXNjYXBlQ2hhcik7CisgIH0KKworICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7Cisg
ICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAg
fSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHsKKyAgICAg
IHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICB9CisKKyAgZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHsKKyAgICBwYXJhbXMu
cGF0aCA9IGlkczsKKyAgICByZXR1cm4gcGFyYW1zOworICB9CisKKyAgZnVuY3Rpb24gYXBwZW5k
Q29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7CisgICAgcmV0dXJuIChjb250ZXh0UGF0aCA/
IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFy
cy11dGlsL21vcnBoLXV0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
IC8qZ2xvYmFscyBjb25zb2xlKi8KKworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy52aXNp
dENoaWxkcmVuID0gdmlzaXRDaGlsZHJlbjsKKyAgZXhwb3J0cy52YWxpZGF0ZUNoaWxkTW9ycGhz
ID0gdmFsaWRhdGVDaGlsZE1vcnBoczsKKyAgZXhwb3J0cy5saW5rUGFyYW1zID0gbGlua1BhcmFt
czsKKyAgZXhwb3J0cy5kdW1wID0gZHVtcDsKKworICBmdW5jdGlvbiB2aXNpdENoaWxkcmVuKG5v
ZGVzLCBjYWxsYmFjaykgeworICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZXMgPSBub2Rlcy5zbGljZSgpOworCisg
ICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkgeworICAgICAgdmFyIG5vZGUgPSBub2Rlcy5wb3AoKTsK
KyAgICAgIGNhbGxiYWNrKG5vZGUpOworCisgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7Cisg
ICAgICAgIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIG5vZGUuY2hpbGROb2Rlcyk7CisgICAgICB9
IGVsc2UgaWYgKG5vZGUuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICAgIHZhciBjdXJyZW50ID0g
bm9kZS5maXJzdENoaWxkTW9ycGg7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAg
ICAgICBub2Rlcy5wdXNoKGN1cnJlbnQpOworICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5l
eHRNb3JwaDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChub2RlLm1vcnBoTGlzdCkgewor
ICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUubW9ycGhMaXN0LmZpcnN0Q2hpbGRNb3JwaDsKKwor
ICAgICAgICB3aGlsZSAoY3VycmVudCkgeworICAgICAgICAgIG5vZGVzLnB1c2goY3VycmVudCk7
CisgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgICB9CisgICAg
ICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZE1vcnBocyhlbnYsIG1v
cnBoLCB2aXNpdG9yKSB7CisgICAgdmFyIG1vcnBoTGlzdCA9IG1vcnBoLm1vcnBoTGlzdDsKKyAg
ICBpZiAobW9ycGgubW9ycGhMaXN0KSB7CisgICAgICB2YXIgY3VycmVudCA9IG1vcnBoTGlzdC5m
aXJzdENoaWxkTW9ycGg7CisKKyAgICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICAgIHZhciBu
ZXh0ID0gY3VycmVudC5uZXh0TW9ycGg7CisgICAgICAgIHZhbGlkYXRlQ2hpbGRNb3JwaHMoZW52
LCBjdXJyZW50LCB2aXNpdG9yKTsKKyAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICB9Cisg
ICAgfSBlbHNlIGlmIChtb3JwaC5sYXN0UmVzdWx0KSB7CisgICAgICBtb3JwaC5sYXN0UmVzdWx0
LnJldmFsaWRhdGVXaXRoKGVudiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdmlz
aXRvcik7CisgICAgfSBlbHNlIGlmIChtb3JwaC5jaGlsZE5vZGVzKSB7CisgICAgICAvLyBUaGlz
IG1lYW5zIHRoYXQgdGhlIGNoaWxkTm9kZXMgd2VyZSB3aXJlZCB1cCBtYW51YWxseQorICAgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBtb3JwaC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykg
eworICAgICAgICB2YWxpZGF0ZUNoaWxkTW9ycGhzKGVudiwgbW9ycGguY2hpbGROb2Rlc1tpXSwg
dmlzaXRvcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbGlua1BhcmFtcyhl
bnYsIHNjb3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgaWYgKG1vcnBoLmxp
bmtlZFBhcmFtcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlbnYuaG9va3Mu
bGlua1JlbmRlck5vZGUobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCkpIHsK
KyAgICAgIG1vcnBoLmxpbmtlZFBhcmFtcyA9IHsgcGFyYW1zOiBwYXJhbXMsIGhhc2g6IGhhc2gg
fTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkdW1wKG5vZGUpIHsKKyAgICBjb25zb2xlLmdy
b3VwKG5vZGUsIG5vZGUuaXNEaXJ0eSk7CisKKyAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7Cisg
ICAgICBtYXAobm9kZS5jaGlsZE5vZGVzLCBkdW1wKTsKKyAgICB9IGVsc2UgaWYgKG5vZGUuZmly
c3RDaGlsZE1vcnBoKSB7CisgICAgICB2YXIgY3VycmVudCA9IG5vZGUuZmlyc3RDaGlsZE1vcnBo
OworCisgICAgICB3aGlsZSAoY3VycmVudCkgeworICAgICAgICBkdW1wKGN1cnJlbnQpOworICAg
ICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0TW9ycGg7CisgICAgICB9CisgICAgfSBlbHNlIGlm
IChub2RlLm1vcnBoTGlzdCkgeworICAgICAgZHVtcChub2RlLm1vcnBoTGlzdCk7CisgICAgfQor
CisgICAgY29uc29sZS5ncm91cEVuZCgpOworICB9CisKKyAgZnVuY3Rpb24gbWFwKG5vZGVzLCBj
YikgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICBjYihub2Rlc1tpXSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnaHRtbGJhcnMt
dXRpbC9uYW1lc3BhY2VzJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8v
IHJlZiBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjLUxDL25hbWVzcGFjZXMuaHRtbAorICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRBdHRyTmFtZXNwYWNlID0gZ2V0QXR0ck5hbWVz
cGFjZTsKKyAgdmFyIGRlZmF1bHROYW1lc3BhY2VzID0geworICAgIGh0bWw6ICdodHRwOi8vd3d3
LnczLm9yZy8xOTk5L3hodG1sJywKKyAgICBtYXRobWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4
L01hdGgvTWF0aE1MJywKKyAgICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsCisg
ICAgeGxpbms6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywKKyAgICB4bWw6ICdodHRw
Oi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnCisgIH07CisKKyAgZnVuY3Rpb24gZ2V0
QXR0ck5hbWVzcGFjZShhdHRyTmFtZSwgZGV0ZWN0ZWROYW1lc3BhY2UpIHsKKyAgICBpZiAoZGV0
ZWN0ZWROYW1lc3BhY2UpIHsKKyAgICAgIHJldHVybiBkZXRlY3RlZE5hbWVzcGFjZTsKKyAgICB9
CisKKyAgICB2YXIgbmFtZXNwYWNlOworCisgICAgdmFyIGNvbG9uSW5kZXggPSBhdHRyTmFtZS5p
bmRleE9mKCc6Jyk7CisgICAgaWYgKGNvbG9uSW5kZXggIT09IC0xKSB7CisgICAgICB2YXIgcHJl
Zml4ID0gYXR0ck5hbWUuc2xpY2UoMCwgY29sb25JbmRleCk7CisgICAgICBuYW1lc3BhY2UgPSBk
ZWZhdWx0TmFtZXNwYWNlc1twcmVmaXhdOworICAgIH0KKworICAgIHJldHVybiBuYW1lc3BhY2Ug
fHwgbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImh0bWxiYXJzLXV0aWwvb2JqZWN0LXV0aWxzIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLm1lcmdlID0gbWVyZ2U7CisgIGV4cG9ydHMuc2hhbGxvd0NvcHkgPSBzaGFsbG93Q29w
eTsKKyAgZXhwb3J0cy5rZXlTZXQgPSBrZXlTZXQ7CisgIGV4cG9ydHMua2V5TGVuZ3RoID0ga2V5
TGVuZ3RoOworCisgIGZ1bmN0aW9uIG1lcmdlKG9wdGlvbnMsIGRlZmF1bHRzKSB7CisgICAgZm9y
ICh2YXIgcHJvcCBpbiBkZWZhdWx0cykgeworICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVy
dHkocHJvcCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBvcHRpb25zW3By
b3BdID0gZGVmYXVsdHNbcHJvcF07CisgICAgfQorICAgIHJldHVybiBvcHRpb25zOworICB9CisK
KyAgZnVuY3Rpb24gc2hhbGxvd0NvcHkob2JqKSB7CisgICAgcmV0dXJuIG1lcmdlKHt9LCBvYmop
OworICB9CisKKyAgZnVuY3Rpb24ga2V5U2V0KG9iaikgeworICAgIHZhciBzZXQgPSB7fTsKKwor
ICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CisgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5
KHByb3ApKSB7CisgICAgICAgIHNldFtwcm9wXSA9IHRydWU7CisgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIHNldDsKKyAgfQorCisgIGZ1bmN0aW9uIGtleUxlbmd0aChvYmopIHsKKyAgICB2
YXIgY291bnQgPSAwOworCisgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICAgIGlmIChv
YmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gY291bnQ7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFycy11dGls
L3F1b3RpbmciLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJp
Y3QiOworCisgIGV4cG9ydHMuaGFzaCA9IGhhc2g7CisgIGV4cG9ydHMucmVwZWF0ID0gcmVwZWF0
OworICBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CisgICAgc3RyID0gc3RyLnJlcGxhY2Uo
L1xcL2csICJcXFxcIik7CisgICAgc3RyID0gc3RyLnJlcGxhY2UoLyIvZywgJ1xcIicpOworICAg
IHN0ciA9IHN0ci5yZXBsYWNlKC9cbi9nLCAiXFxuIik7CisgICAgcmV0dXJuIHN0cjsKKyAgfQor
CisgIGV4cG9ydHMuZXNjYXBlU3RyaW5nID0gZXNjYXBlU3RyaW5nOworCisgIGZ1bmN0aW9uIHN0
cmluZyhzdHIpIHsKKyAgICByZXR1cm4gJyInICsgZXNjYXBlU3RyaW5nKHN0cikgKyAnIic7Cisg
IH0KKworICBleHBvcnRzLnN0cmluZyA9IHN0cmluZzsKKworICBmdW5jdGlvbiBhcnJheShhKSB7
CisgICAgcmV0dXJuICJbIiArIGEgKyAiXSI7CisgIH0KKworICBleHBvcnRzLmFycmF5ID0gYXJy
YXk7CisKKyAgZnVuY3Rpb24gaGFzaChwYWlycykgeworICAgIHJldHVybiAieyIgKyBwYWlycy5q
b2luKCIsICIpICsgIn0iOworICB9CisKKyAgZnVuY3Rpb24gcmVwZWF0KGNoYXJzLCB0aW1lcykg
eworICAgIHZhciBzdHIgPSAiIjsKKyAgICB3aGlsZSAodGltZXMtLSkgeworICAgICAgc3RyICs9
IGNoYXJzOworICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9Cit9KTsKK2VuaWZlZCgnaHRtbGJh
cnMtdXRpbC9zYWZlLXN0cmluZycsIFsnZXhwb3J0cycsICdodG1sYmFycy11dGlsL2hhbmRsZWJh
cnMvc2FmZS1zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9odG1sYmFyc1V0aWxIYW5kbGVi
YXJzU2FmZVN0cmluZykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
X2h0bWxiYXJzVXRpbEhhbmRsZWJhcnNTYWZlU3RyaW5nLmRlZmF1bHQ7Cit9KTsKK2VuaWZlZCgi
aHRtbGJhcnMtdXRpbC90ZW1wbGF0ZS11dGlscyIsIFsiZXhwb3J0cyIsICJodG1sYmFycy11dGls
L21vcnBoLXV0aWxzIiwgImh0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyIl0sIGZ1bmN0aW9uIChleHBv
cnRzLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzUnVudGltZVJlbmRlcikgewor
ICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5SZW5kZXJTdGF0ZSA9IFJlbmRlclN0YXRlOwor
ICBleHBvcnRzLmJsb2NrRm9yID0gYmxvY2tGb3I7CisgIGV4cG9ydHMucmVuZGVyQW5kQ2xlYW51
cCA9IHJlbmRlckFuZENsZWFudXA7CisgIGV4cG9ydHMuY2xlYXJNb3JwaCA9IGNsZWFyTW9ycGg7
CisgIGV4cG9ydHMuY2xlYXJNb3JwaExpc3QgPSBjbGVhck1vcnBoTGlzdDsKKworICBmdW5jdGlv
biBSZW5kZXJTdGF0ZShyZW5kZXJOb2RlLCBtb3JwaExpc3QpIHsKKyAgICAvLyBUaGUgbW9ycGgg
bGlzdCB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIGNhbiBiZQorICAgIC8vIGRlc3Ryb3ll
ZC4KKyAgICB0aGlzLm1vcnBoTGlzdFRvQ2xlYXIgPSBtb3JwaExpc3Q7CisKKyAgICAvLyBUaGUg
bW9ycGggbGlzdCB0aGF0IG5lZWRzIHRvIGJlIHBydW5lZCBvZiBhbnkgaXRlbXMKKyAgICAvLyB0
aGF0IHdlcmUgbm90IHlpZWxkZWQgb24gYSBzdWJzZXF1ZW50IHJlbmRlci4KKyAgICB0aGlzLm1v
cnBoTGlzdFRvUHJ1bmUgPSBudWxsOworCisgICAgLy8gQSBtYXAgb2YgbW9ycGhzIGZvciBlYWNo
IGl0ZW0geWllbGRlZCBpbiBkdXJpbmcgdGhpcworICAgIC8vIHJlbmRlcmluZyBwYXNzLiBBbnkg
bW9ycGhzIGluIHRoZSBET00gYnV0IG5vdCBpbiB0aGlzIG1hcAorICAgIC8vIHdpbGwgYmUgcHJ1
bmVkIGR1cmluZyBjbGVhbnVwLgorICAgIHRoaXMuaGFuZGxlZE1vcnBocyA9IHt9OworICAgIHRo
aXMuY29sbGlzaW9ucyA9IHVuZGVmaW5lZDsKKworICAgIC8vIFRoZSBtb3JwaCB0byBjbGVhciBv
bmNlIHJlbmRlcmluZyBpcyBjb21wbGV0ZS4gQnkKKyAgICAvLyBkZWZhdWx0LCB3ZSBzZXQgdGhp
cyB0byB0aGUgcHJldmlvdXMgbW9ycGggKHRvIGNhdGNoCisgICAgLy8gdGhlIGNhc2Ugd2hlcmUg
bm90aGluZyBpcyB5aWVsZGVkOyBpbiB0aGF0IGNhc2UsIHdlCisgICAgLy8gc2hvdWxkIGp1c3Qg
Y2xlYXIgdGhlIG1vcnBoKS4gT3RoZXJ3aXNlIHRoaXMgZ2V0cyBzZXQKKyAgICAvLyB0byBudWxs
IGlmIGFueXRoaW5nIGlzIHJlbmRlcmVkLgorICAgIHRoaXMubW9ycGhUb0NsZWFyID0gcmVuZGVy
Tm9kZTsKKworICAgIHRoaXMuc2hhZG93T3B0aW9ucyA9IG51bGw7CisgIH0KKworICBmdW5jdGlv
biBCbG9jayhyZW5kZXIsIHRlbXBsYXRlLCBibG9ja09wdGlvbnMpIHsKKyAgICB0aGlzLnJlbmRl
ciA9IHJlbmRlcjsKKyAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CisgICAgdGhpcy5ibG9j
a09wdGlvbnMgPSBibG9ja09wdGlvbnM7CisgICAgdGhpcy5hcml0eSA9IHRlbXBsYXRlLmFyaXR5
OworICB9CisKKyAgQmxvY2sucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChlbnYsIGJsb2Nr
QXJndW1lbnRzLCBfc2VsZiwgcmVuZGVyTm9kZSwgcGFyZW50U2NvcGUsIHZpc2l0b3IpIHsKKyAg
ICBpZiAocmVuZGVyTm9kZS5sYXN0UmVzdWx0KSB7CisgICAgICByZW5kZXJOb2RlLmxhc3RSZXN1
bHQucmV2YWxpZGF0ZVdpdGgoZW52LCB1bmRlZmluZWQsIF9zZWxmLCBibG9ja0FyZ3VtZW50cywg
dmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2ZpcnN0UmVuZGVyKGVudiwgYmxv
Y2tBcmd1bWVudHMsIF9zZWxmLCByZW5kZXJOb2RlLCBwYXJlbnRTY29wZSk7CisgICAgfQorICB9
OworCisgIEJsb2NrLnByb3RvdHlwZS5fZmlyc3RSZW5kZXIgPSBmdW5jdGlvbiAoZW52LCBibG9j
a0FyZ3VtZW50cywgX3NlbGYsIHJlbmRlck5vZGUsIHBhcmVudFNjb3BlKSB7CisgICAgdmFyIG9w
dGlvbnMgPSB7IHJlbmRlclN0YXRlOiBuZXcgUmVuZGVyU3RhdGUocmVuZGVyTm9kZSkgfTsKKyAg
ICB2YXIgcmVuZGVyID0gdGhpcy5yZW5kZXI7CisgICAgdmFyIHRlbXBsYXRlID0gdGhpcy50ZW1w
bGF0ZTsKKyAgICB2YXIgc2NvcGUgPSB0aGlzLmJsb2NrT3B0aW9ucy5zY29wZTsKKworICAgIHZh
ciBzaGFkb3dTY29wZSA9IHNjb3BlID8gZW52Lmhvb2tzLmNyZWF0ZUNoaWxkU2NvcGUoc2NvcGUp
IDogZW52Lmhvb2tzLmNyZWF0ZUZyZXNoU2NvcGUoKTsKKworICAgIGVudi5ob29rcy5iaW5kU2hh
ZG93U2NvcGUoZW52LCBwYXJlbnRTY29wZSwgc2hhZG93U2NvcGUsIHRoaXMuYmxvY2tPcHRpb25z
Lm9wdGlvbnMpOworCisgICAgaWYgKF9zZWxmICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGVudi5o
b29rcy5iaW5kU2VsZihlbnYsIHNoYWRvd1Njb3BlLCBfc2VsZik7CisgICAgfSBlbHNlIGlmICh0
aGlzLmJsb2NrT3B0aW9ucy5zZWxmICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGVudi5ob29rcy5i
aW5kU2VsZihlbnYsIHNoYWRvd1Njb3BlLCB0aGlzLmJsb2NrT3B0aW9ucy5zZWxmKTsKKyAgICB9
CisKKyAgICBiaW5kQmxvY2tzKGVudiwgc2hhZG93U2NvcGUsIHRoaXMuYmxvY2tPcHRpb25zLnlp
ZWxkVG8pOworCisgICAgcmVuZGVyQW5kQ2xlYW51cChyZW5kZXJOb2RlLCBlbnYsIG9wdGlvbnMs
IG51bGwsIGZ1bmN0aW9uICgpIHsKKyAgICAgIG9wdGlvbnMucmVuZGVyU3RhdGUubW9ycGhUb0Ns
ZWFyID0gbnVsbDsKKyAgICAgIHZhciByZW5kZXJPcHRpb25zID0gbmV3IF9odG1sYmFyc1J1bnRp
bWVSZW5kZXIuUmVuZGVyT3B0aW9ucyhyZW5kZXJOb2RlLCB1bmRlZmluZWQsIGJsb2NrQXJndW1l
bnRzKTsKKyAgICAgIHJlbmRlcih0ZW1wbGF0ZSwgZW52LCBzaGFkb3dTY29wZSwgcmVuZGVyT3B0
aW9ucyk7CisgICAgfSk7CisgIH07CisKKyAgZnVuY3Rpb24gYmxvY2tGb3IocmVuZGVyLCB0ZW1w
bGF0ZSwgYmxvY2tPcHRpb25zKSB7CisgICAgcmV0dXJuIG5ldyBCbG9jayhyZW5kZXIsIHRlbXBs
YXRlLCBibG9ja09wdGlvbnMpOworICB9CisKKyAgZnVuY3Rpb24gYmluZEJsb2NrcyhlbnYsIHNo
YWRvd1Njb3BlLCBibG9ja3MpIHsKKyAgICBpZiAoIWJsb2NrcykgeworICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBpZiAoYmxvY2tzIGluc3RhbmNlb2YgQmxvY2spIHsKKyAgICAgIGVudi5ob29r
cy5iaW5kQmxvY2soZW52LCBzaGFkb3dTY29wZSwgYmxvY2tzKTsKKyAgICB9IGVsc2UgeworICAg
ICAgZm9yICh2YXIgbmFtZSBpbiBibG9ja3MpIHsKKyAgICAgICAgaWYgKGJsb2Nrcy5oYXNPd25Q
cm9wZXJ0eShuYW1lKSkgeworICAgICAgICAgIGVudi5ob29rcy5iaW5kQmxvY2soZW52LCBzaGFk
b3dTY29wZSwgYmxvY2tzW25hbWVdLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0K
KyAgfQorCisgIGZ1bmN0aW9uIHJlbmRlckFuZENsZWFudXAobW9ycGgsIGVudiwgb3B0aW9ucywg
c2hhZG93T3B0aW9ucywgY2FsbGJhY2spIHsKKyAgICAvLyBUaGUgUmVuZGVyU3RhdGUgb2JqZWN0
IGlzIHVzZWQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoZQorICAgIC8vIGhl
bHBlciBvciBob29rIGJlaW5nIGludm9rZWQgaGFzIHlpZWxkZWQuIE9uY2UgaXQgaGFzIGZpbmlz
aGVkIGVpdGhlcgorICAgIC8vIHlpZWxkaW5nIG11bHRpcGxlIGl0ZW1zICh2aWEgeWllbGRJdGVt
KSBvciBhIHNpbmdsZSB0ZW1wbGF0ZSAodmlhCisgICAgLy8geWllbGRUZW1wbGF0ZSksIHdlIGRl
dGVjdCB3aGF0IHdhcyByZW5kZXJlZCBhbmQgaG93IGl0IGRpZmZlcnMgZnJvbQorICAgIC8vIHRo
ZSBwcmV2aW91cyByZW5kZXIsIGNsZWFuaW5nIHVwIG9sZCBzdGF0ZSBpbiBET00gYXMgYXBwcm9w
cmlhdGUuCisgICAgdmFyIHJlbmRlclN0YXRlID0gb3B0aW9ucy5yZW5kZXJTdGF0ZTsKKyAgICBy
ZW5kZXJTdGF0ZS5jb2xsaXNpb25zID0gdW5kZWZpbmVkOworICAgIHJlbmRlclN0YXRlLnNoYWRv
d09wdGlvbnMgPSBzaGFkb3dPcHRpb25zOworCisgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjaywg
aW5zdHJ1Y3RpbmcgaXQgdG8gc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGl0CisgICAgLy8g
cmVuZGVycyBpbnRvIFJlbmRlclN0YXRlLgorICAgIHZhciByZXN1bHQgPSBjYWxsYmFjayhvcHRp
b25zKTsKKworICAgIC8vIFRoZSBob29rIGNhbiBvcHQtb3V0IG9mIGNsZWFudXAgaWYgaXQgaGFu
ZGxlZCBjbGVhbnVwIGl0c2VsZi4KKyAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5oYW5kbGVkKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG1vcnBoTWFwID0gbW9ycGgubW9ycGhN
YXA7CisKKyAgICAvLyBXYWxrIHRoZSBtb3JwaCBsaXN0LCBjbGVhcmluZyBhbnkgaXRlbXMgdGhh
dCB3ZXJlIHlpZWxkZWQgaW4gYSBwcmV2aW91cworICAgIC8vIHJlbmRlciBidXQgd2VyZSBub3Qg
eWllbGRlZCBkdXJpbmcgdGhpcyByZW5kZXIuCisgICAgdmFyIG1vcnBoTGlzdCA9IHJlbmRlclN0
YXRlLm1vcnBoTGlzdFRvUHJ1bmU7CisgICAgaWYgKG1vcnBoTGlzdCkgeworICAgICAgdmFyIGhh
bmRsZWRNb3JwaHMgPSByZW5kZXJTdGF0ZS5oYW5kbGVkTW9ycGhzOworICAgICAgdmFyIGl0ZW0g
PSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgICB3aGlsZSAoaXRlbSkgeworICAg
ICAgICB2YXIgbmV4dCA9IGl0ZW0ubmV4dE1vcnBoOworCisgICAgICAgIC8vIElmIHdlIGRvbid0
IHNlZSB0aGUga2V5IGluIGhhbmRsZWRNb3JwaHMsIGl0IHdhc24ndAorICAgICAgICAvLyB5aWVs
ZGVkIGluIGFuZCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBpdCBmcm9tIERPTS4KKyAgICAgICAgaWYg
KCEoaXRlbS5rZXkgaW4gaGFuZGxlZE1vcnBocykpIHsKKyAgICAgICAgICBtb3JwaE1hcFtpdGVt
LmtleV0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgY2xlYXJNb3JwaChpdGVtLCBlbnYsIHRydWUp
OworICAgICAgICAgIGl0ZW0uZGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlbSA9
IG5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgbW9ycGhMaXN0ID0gcmVuZGVyU3RhdGUubW9y
cGhMaXN0VG9DbGVhcjsKKyAgICBpZiAobW9ycGhMaXN0KSB7CisgICAgICBjbGVhck1vcnBoTGlz
dChtb3JwaExpc3QsIG1vcnBoLCBlbnYpOworICAgIH0KKworICAgIHZhciB0b0NsZWFyID0gcmVu
ZGVyU3RhdGUubW9ycGhUb0NsZWFyOworICAgIGlmICh0b0NsZWFyKSB7CisgICAgICBjbGVhck1v
cnBoKHRvQ2xlYXIsIGVudik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY2xlYXJNb3JwaCht
b3JwaCwgZW52LCBkZXN0cm95U2VsZikgeworICAgIHZhciBjbGVhbnVwID0gZW52Lmhvb2tzLmNs
ZWFudXBSZW5kZXJOb2RlOworICAgIHZhciBkZXN0cm95ID0gZW52Lmhvb2tzLmRlc3Ryb3lSZW5k
ZXJOb2RlOworICAgIHZhciB3aWxsQ2xlYW51cCA9IGVudi5ob29rcy53aWxsQ2xlYW51cFRyZWU7
CisgICAgdmFyIGRpZENsZWFudXAgPSBlbnYuaG9va3MuZGlkQ2xlYW51cFRyZWU7CisKKyAgICBm
dW5jdGlvbiBkZXN0cm95Tm9kZShub2RlKSB7CisgICAgICBpZiAoY2xlYW51cCkgeworICAgICAg
ICBjbGVhbnVwKG5vZGUpOworICAgICAgfQorICAgICAgaWYgKGRlc3Ryb3kpIHsKKyAgICAgICAg
ZGVzdHJveShub2RlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2lsbENsZWFudXApIHsK
KyAgICAgIHdpbGxDbGVhbnVwKGVudiwgbW9ycGgsIGRlc3Ryb3lTZWxmKTsKKyAgICB9CisgICAg
aWYgKGNsZWFudXApIHsKKyAgICAgIGNsZWFudXAobW9ycGgpOworICAgIH0KKyAgICBpZiAoZGVz
dHJveVNlbGYgJiYgZGVzdHJveSkgeworICAgICAgZGVzdHJveShtb3JwaCk7CisgICAgfQorCisg
ICAgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMudmlzaXRDaGlsZHJlbihtb3JwaC5jaGlsZE5vZGVz
LCBkZXN0cm95Tm9kZSk7CisKKyAgICAvLyBUT0RPOiBEZWFsIHdpdGggbG9naWNhbCBjaGlsZHJl
biB0aGF0IGFyZSBub3QgaW4gdGhlIERPTSB0cmVlCisgICAgbW9ycGguY2xlYXIoKTsKKyAgICBp
ZiAoZGlkQ2xlYW51cCkgeworICAgICAgZGlkQ2xlYW51cChlbnYsIG1vcnBoLCBkZXN0cm95U2Vs
Zik7CisgICAgfQorCisgICAgbW9ycGgubGFzdFJlc3VsdCA9IG51bGw7CisgICAgbW9ycGgubGFz
dFlpZWxkZWQgPSBudWxsOworICAgIG1vcnBoLmNoaWxkTm9kZXMgPSBudWxsOworICB9CisKKyAg
ZnVuY3Rpb24gY2xlYXJNb3JwaExpc3QobW9ycGhMaXN0LCBtb3JwaCwgZW52KSB7CisgICAgdmFy
IGl0ZW0gPSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgd2hpbGUgKGl0ZW0pIHsK
KyAgICAgIHZhciBuZXh0ID0gaXRlbS5uZXh0TW9ycGg7CisgICAgICBtb3JwaC5tb3JwaE1hcFtp
dGVtLmtleV0gPSB1bmRlZmluZWQ7CisgICAgICBjbGVhck1vcnBoKGl0ZW0sIGVudiwgdHJ1ZSk7
CisgICAgICBpdGVtLmRlc3Ryb3koKTsKKworICAgICAgaXRlbSA9IG5leHQ7CisgICAgfQorCisg
ICAgLy8gUmVtb3ZlIHRoZSBNb3JwaExpc3QgZnJvbSB0aGUgbW9ycGguCisgICAgbW9ycGhMaXN0
LmNsZWFyKCk7CisgICAgbW9ycGgubW9ycGhMaXN0ID0gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQo
Imh0bWxiYXJzLXV0aWwvdm9pZC10YWctbmFtZXMiLCBbImV4cG9ydHMiLCAiaHRtbGJhcnMtdXRp
bC9hcnJheS11dGlscyJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2h0bWxiYXJzVXRpbEFycmF5VXRp
bHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIC8vIFRoZSBIVE1MIGVsZW1lbnRzIGluIHRoaXMg
bGlzdCBhcmUgc3BlY2VkIGJ5CisgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtbWFya3Vw
L3N5bnRheC5odG1sI3N5bnRheC1lbGVtZW50cywKKyAgLy8gYW5kIHdpbGwgYmUgZm9yY2VkIHRv
IGNsb3NlIHJlZ2FyZGxlc3Mgb2YgaWYgdGhleSBoYXZlIGEKKyAgLy8gc2VsZi1jbG9zaW5nIC8+
IGF0IHRoZSBlbmQuCisgIHZhciB2b2lkVGFnTmFtZXMgPSAiYXJlYSBiYXNlIGJyIGNvbCBjb21t
YW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFj
ayB3YnIiOworICB2YXIgdm9pZE1hcCA9IHt9OworCisgIF9odG1sYmFyc1V0aWxBcnJheVV0aWxz
LmZvckVhY2godm9pZFRhZ05hbWVzLnNwbGl0KCIgIiksIGZ1bmN0aW9uICh0YWdOYW1lKSB7Cisg
ICAgdm9pZE1hcFt0YWdOYW1lXSA9IHRydWU7CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IHZvaWRNYXA7Cit9KTsKK2VuaWZlZCgibW9ycGgtYXR0ciIsIFsiZXhwb3J0cyIsICJtb3JwaC1h
dHRyL3Nhbml0aXplLWF0dHJpYnV0ZS12YWx1ZSIsICJkb20taGVscGVyL3Byb3AiLCAiZG9tLWhl
bHBlci9idWlsZC1odG1sLWRvbSIsICJodG1sYmFycy11dGlsIl0sIGZ1bmN0aW9uIChleHBvcnRz
LCBfbW9ycGhBdHRyU2FuaXRpemVBdHRyaWJ1dGVWYWx1ZSwgX2RvbUhlbHBlclByb3AsIF9kb21I
ZWxwZXJCdWlsZEh0bWxEb20sIF9odG1sYmFyc1V0aWwpIHsKKyAgInVzZSBzdHJpY3QiOworCisg
IGZ1bmN0aW9uIGdldFByb3BlcnR5KCkgeworICAgIHJldHVybiB0aGlzLmRvbUhlbHBlci5nZXRQ
cm9wZXJ0eVN0cmljdCh0aGlzLmVsZW1lbnQsIHRoaXMuYXR0ck5hbWUpOworICB9CisKKyAgZnVu
Y3Rpb24gdXBkYXRlUHJvcGVydHkodmFsdWUpIHsKKyAgICBpZiAodGhpcy5fcmVuZGVyZWRJbml0
aWFsbHkgPT09IHRydWUgfHwgIV9kb21IZWxwZXJQcm9wLmlzQXR0clJlbW92YWxWYWx1ZSh2YWx1
ZSkpIHsKKyAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50OworICAgICAgdmFyIGF0dHJO
YW1lID0gdGhpcy5hdHRyTmFtZTsKKworICAgICAgaWYgKGF0dHJOYW1lID09PSAndmFsdWUnICYm
IGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBlbGVtZW50LnZhbHVlID09PSB2YWx1ZSkg
eworICAgICAgICAvLyBEbyBub3RoaW5nLiBBdHRlbXB0cyB0byBhdm9pZCBhY2NpZGVudGx5IGNo
YW5naW5nIHRoZSBpbnB1dCBjdXJzb3IgbG9jYXRpb24uCisgICAgICAgIC8vIFNlZSBodHRwczov
L2dpdGh1Yi5jb20vdGlsZGVpby9odG1sYmFycy9wdWxsLzQ0NyBmb3IgbW9yZSBkZXRhaWxzLgor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBkbyBub3QgcmVuZGVyIGlmIGluaXRpYWwgdmFs
dWUgaXMgdW5kZWZpbmVkIG9yIG51bGwKKyAgICAgICAgICB0aGlzLmRvbUhlbHBlci5zZXRQcm9w
ZXJ0eVN0cmljdChlbGVtZW50LCBhdHRyTmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQor
CisgICAgdGhpcy5fcmVuZGVyZWRJbml0aWFsbHkgPSB0cnVlOworICB9CisKKyAgZnVuY3Rpb24g
Z2V0QXR0cmlidXRlKCkgeworICAgIHJldHVybiB0aGlzLmRvbUhlbHBlci5nZXRBdHRyaWJ1dGUo
dGhpcy5lbGVtZW50LCB0aGlzLmF0dHJOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUF0
dHJpYnV0ZSh2YWx1ZSkgeworICAgIGlmIChfZG9tSGVscGVyUHJvcC5pc0F0dHJSZW1vdmFsVmFs
dWUodmFsdWUpKSB7CisgICAgICB0aGlzLmRvbUhlbHBlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5l
bGVtZW50LCB0aGlzLmF0dHJOYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5kb21IZWxw
ZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgdGhpcy5hdHRyTmFtZSwgdmFsdWUpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5TKCkgeworICAgIHJldHVybiB0aGlz
LmRvbUhlbHBlci5nZXRBdHRyaWJ1dGVOUyh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZXNwYWNlLCB0
aGlzLmF0dHJOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZU5TKHZhbHVl
KSB7CisgICAgaWYgKF9kb21IZWxwZXJQcm9wLmlzQXR0clJlbW92YWxWYWx1ZSh2YWx1ZSkpIHsK
KyAgICAgIHRoaXMuZG9tSGVscGVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsIHRoaXMu
YXR0ck5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmRvbUhlbHBlci5zZXRBdHRyaWJ1
dGVOUyh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZXNwYWNlLCB0aGlzLmF0dHJOYW1lLCB2YWx1ZSk7
CisgICAgfQorICB9CisKKyAgdmFyIFVOU0VUID0geyB1bnNldDogdHJ1ZSB9OworCisgIHZhciBn
dWlkID0gMTsKKworICBBdHRyTW9ycGguY3JlYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGF0dHJO
YW1lLCBkb21IZWxwZXIsIG5hbWVzcGFjZSkgeworICAgIHZhciBucyA9IF9odG1sYmFyc1V0aWwu
Z2V0QXR0ck5hbWVzcGFjZShhdHRyTmFtZSwgbmFtZXNwYWNlKTsKKworICAgIGlmIChucykgewor
ICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVOU0F0dHJNb3JwaChlbGVtZW50LCBhdHRyTmFtZSwg
ZG9tSGVscGVyLCBucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjcmVhdGVOb25OYW1l
c3BhY2VkQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpOworICAgIH0KKyAg
fTsKKworICBmdW5jdGlvbiBjcmVhdGVOb25OYW1lc3BhY2VkQXR0ck1vcnBoKGVsZW1lbnQsIGF0
dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB2YXIgX25vcm1hbGl6ZVByb3BlcnR5ID0gX2RvbUhl
bHBlclByb3Aubm9ybWFsaXplUHJvcGVydHkoZWxlbWVudCwgYXR0ck5hbWUpOworCisgICAgdmFy
IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplUHJvcGVydHkubm9ybWFsaXplZDsKKyAgICB2YXIgdHlw
ZSA9IF9ub3JtYWxpemVQcm9wZXJ0eS50eXBlOworCisgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNl
VVJJID09PSBfZG9tSGVscGVyQnVpbGRIdG1sRG9tLnN2Z05hbWVzcGFjZSB8fCBhdHRyTmFtZSA9
PT0gJ3N0eWxlJyB8fCB0eXBlID09PSAnYXR0cicpIHsKKyAgICAgIHJldHVybiBuZXcgQXR0cmli
dXRlQXR0ck1vcnBoKGVsZW1lbnQsIG5vcm1hbGl6ZWQsIGRvbUhlbHBlcik7CisgICAgfSBlbHNl
IHsKKyAgICAgIHJldHVybiBuZXcgUHJvcGVydHlBdHRyTW9ycGgoZWxlbWVudCwgbm9ybWFsaXpl
ZCwgZG9tSGVscGVyKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBBdHRyTW9ycGgoZWxlbWVu
dCwgYXR0ck5hbWUsIGRvbUhlbHBlcikgeworICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Cisg
ICAgdGhpcy5kb21IZWxwZXIgPSBkb21IZWxwZXI7CisgICAgdGhpcy5hdHRyTmFtZSA9IGF0dHJO
YW1lOworICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkOworICAgIHRoaXMuaXNEaXJ0eSA9IGZh
bHNlOworICAgIHRoaXMuaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAgICB0aGlzLmVzY2FwZWQg
PSB0cnVlOworICAgIHRoaXMubGFzdFZhbHVlID0gVU5TRVQ7CisgICAgdGhpcy5sYXN0UmVzdWx0
ID0gbnVsbDsKKyAgICB0aGlzLmxhc3RZaWVsZGVkID0gbnVsbDsKKyAgICB0aGlzLmNoaWxkTm9k
ZXMgPSBudWxsOworICAgIHRoaXMubGlua2VkUGFyYW1zID0gbnVsbDsKKyAgICB0aGlzLmxpbmtl
ZFJlc3VsdCA9IG51bGw7CisgICAgdGhpcy5ndWlkID0gImF0dHIiICsgZ3VpZCsrOworICAgIHRo
aXMuc2VlbiA9IGZhbHNlOworICAgIHRoaXMub3duZXJOb2RlID0gbnVsbDsKKyAgICB0aGlzLnJl
bmRlcmVkID0gZmFsc2U7CisgICAgdGhpcy5fcmVuZGVyZWRJbml0aWFsbHkgPSBmYWxzZTsKKyAg
ICB0aGlzLm5hbWVzcGFjZSA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLmRpZEluaXQoKTsKKyAgfQor
CisgIEF0dHJNb3JwaC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYg
KCF0aGlzLl9zdGF0ZSkgeworICAgICAgdGhpcy5fc3RhdGUgPSB7fTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGhpcy5fc3RhdGU7CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS5zZXRTdGF0
ZSA9IGZ1bmN0aW9uIChuZXdTdGF0ZSkgeworICAgIC8qanNoaW50IC1XMDkzICovCisKKyAgICBy
ZXR1cm4gdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTsKKyAgfTsKKworICBBdHRyTW9ycGgucHJvdG90
eXBlLmRpZEluaXQgPSBmdW5jdGlvbiAoKSB7fTsKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS53aWxs
U2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHt9OworCisgIEF0dHJNb3JwaC5wcm90b3R5cGUuc2V0
Q29udGVudCA9IGZ1bmN0aW9uICh2YWx1ZSkgeworICAgIHRoaXMud2lsbFNldENvbnRlbnQodmFs
dWUpOworCisgICAgaWYgKHRoaXMubGFzdFZhbHVlID09PSB2YWx1ZSkgeworICAgICAgcmV0dXJu
OworICAgIH0KKyAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOworCisgICAgaWYgKHRoaXMuZXNj
YXBlZCkgeworICAgICAgdmFyIHNhbml0aXplZCA9IF9tb3JwaEF0dHJTYW5pdGl6ZUF0dHJpYnV0
ZVZhbHVlLnNhbml0aXplQXR0cmlidXRlVmFsdWUodGhpcy5kb21IZWxwZXIsIHRoaXMuZWxlbWVu
dCwgdGhpcy5hdHRyTmFtZSwgdmFsdWUpOworICAgICAgdGhpcy5fdXBkYXRlKHNhbml0aXplZCwg
dGhpcy5uYW1lc3BhY2UpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl91cGRhdGUodmFsdWUs
IHRoaXMubmFtZXNwYWNlKTsKKyAgICB9CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS5n
ZXRDb250ZW50ID0gZnVuY3Rpb24gKCkgeworICAgIHZhciB2YWx1ZSA9IHRoaXMubGFzdFZhbHVl
ID0gdGhpcy5fZ2V0KCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIC8vIHJlbmRlckFu
ZENsZWFudXAgY2FsbHMgYGNsZWFyYCBvbiBhbGwgaXRlbXMgaW4gdGhlIG1vcnBoIG1hcAorICAv
LyBqdXN0IGJlZm9yZSBjYWxsaW5nIGBkZXN0cm95YCBvbiB0aGUgbW9ycGguCisgIC8vCisgIC8v
IEFzIGEgZnV0dXJlIHJlZmFjdG9yIHRoaXMgY291bGQgYmUgY2hhbmdlZCB0byBzZXQgdGhlIHBy
b3BlcnR5CisgIC8vIGJhY2sgdG8gaXRzIG9yaWdpbmFsL2RlZmF1bHQgdmFsdWUuCisgIEF0dHJN
b3JwaC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7fTsKKworICBBdHRyTW9ycGgucHJv
dG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5lbGVtZW50ID0gbnVsbDsK
KyAgICB0aGlzLmRvbUhlbHBlciA9IG51bGw7CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlw
ZS5fJHN1cGVyQXR0ck1vcnBoID0gQXR0ck1vcnBoOworCisgIGZ1bmN0aW9uIFByb3BlcnR5QXR0
ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB0aGlzLl8kc3VwZXJB
dHRyTW9ycGgoZWxlbWVudCwgYXR0ck5hbWUsIGRvbUhlbHBlcik7CisgIH0KKworICBQcm9wZXJ0
eUF0dHJNb3JwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0dHJNb3JwaC5wcm90b3R5cGUp
OworICBQcm9wZXJ0eUF0dHJNb3JwaC5wcm90b3R5cGUuX3VwZGF0ZSA9IHVwZGF0ZVByb3BlcnR5
OworICBQcm9wZXJ0eUF0dHJNb3JwaC5wcm90b3R5cGUuX2dldCA9IGdldFByb3BlcnR5OworCisg
IGZ1bmN0aW9uIEF0dHJpYnV0ZU5TQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxw
ZXIsIG5hbWVzcGFjZSkgeworICAgIHRoaXMuXyRzdXBlckF0dHJNb3JwaChlbGVtZW50LCBhdHRy
TmFtZSwgZG9tSGVscGVyKTsKKyAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKyAgfQor
CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXR0ck1v
cnBoLnByb3RvdHlwZSk7CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZS5fdXBkYXRl
ID0gdXBkYXRlQXR0cmlidXRlTlM7CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZS5f
Z2V0ID0gZ2V0QXR0cmlidXRlTlM7CisKKyAgZnVuY3Rpb24gQXR0cmlidXRlQXR0ck1vcnBoKGVs
ZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB0aGlzLl8kc3VwZXJBdHRyTW9ycGgo
ZWxlbWVudCwgYXR0ck5hbWUsIGRvbUhlbHBlcik7CisgIH0KKworICBBdHRyaWJ1dGVBdHRyTW9y
cGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdHRyTW9ycGgucHJvdG90eXBlKTsKKyAgQXR0
cmlidXRlQXR0ck1vcnBoLnByb3RvdHlwZS5fdXBkYXRlID0gdXBkYXRlQXR0cmlidXRlOworICBB
dHRyaWJ1dGVBdHRyTW9ycGgucHJvdG90eXBlLl9nZXQgPSBnZXRBdHRyaWJ1dGU7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gQXR0ck1vcnBoOworICBleHBvcnRzLnNhbml0aXplQXR0cmlidXRlVmFs
dWUgPSBfbW9ycGhBdHRyU2FuaXRpemVBdHRyaWJ1dGVWYWx1ZS5zYW5pdGl6ZUF0dHJpYnV0ZVZh
bHVlOworfSk7CitlbmlmZWQoJ21vcnBoLWF0dHIvc2FuaXRpemUtYXR0cmlidXRlLXZhbHVlJywg
WydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qIGpzaGludCBzY3JpcHR1cmw6
dHJ1ZSAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnNhbml0aXplQXR0cmlidXRl
VmFsdWUgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlOworICB2YXIgYmFkUHJvdG9jb2xzID0gewor
ICAgICdqYXZhc2NyaXB0Oic6IHRydWUsCisgICAgJ3Zic2NyaXB0Oic6IHRydWUKKyAgfTsKKwor
ICB2YXIgYmFkVGFncyA9IHsKKyAgICAnQSc6IHRydWUsCisgICAgJ0JPRFknOiB0cnVlLAorICAg
ICdMSU5LJzogdHJ1ZSwKKyAgICAnSU1HJzogdHJ1ZSwKKyAgICAnSUZSQU1FJzogdHJ1ZSwKKyAg
ICAnQkFTRSc6IHRydWUsCisgICAgJ0ZPUk0nOiB0cnVlCisgIH07CisKKyAgdmFyIGJhZFRhZ3NG
b3JEYXRhVVJJID0geworICAgICdFTUJFRCc6IHRydWUKKyAgfTsKKworICB2YXIgYmFkQXR0cmli
dXRlcyA9IHsKKyAgICAnaHJlZic6IHRydWUsCisgICAgJ3NyYyc6IHRydWUsCisgICAgJ2JhY2tn
cm91bmQnOiB0cnVlLAorICAgICdhY3Rpb24nOiB0cnVlCisgIH07CisKKyAgZXhwb3J0cy5iYWRB
dHRyaWJ1dGVzID0gYmFkQXR0cmlidXRlczsKKyAgdmFyIGJhZEF0dHJpYnV0ZXNGb3JEYXRhVVJJ
ID0geworICAgICdzcmMnOiB0cnVlCisgIH07CisKKyAgZnVuY3Rpb24gc2FuaXRpemVBdHRyaWJ1
dGVWYWx1ZShkb20sIGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHsKKyAgICB2YXIgdGFnTmFt
ZTsKKworICAgIGlmICghZWxlbWVudCkgeworICAgICAgdGFnTmFtZSA9IG51bGw7CisgICAgfSBl
bHNlIHsKKyAgICAgIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAg
ICB9CisKKyAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9IVE1MKSB7CisgICAgICByZXR1cm4gdmFs
dWUudG9IVE1MKCk7CisgICAgfQorCisgICAgaWYgKCh0YWdOYW1lID09PSBudWxsIHx8IGJhZFRh
Z3NbdGFnTmFtZV0pICYmIGJhZEF0dHJpYnV0ZXNbYXR0cmlidXRlXSkgeworICAgICAgdmFyIHBy
b3RvY29sID0gZG9tLnByb3RvY29sRm9yVVJMKHZhbHVlKTsKKyAgICAgIGlmIChiYWRQcm90b2Nv
bHNbcHJvdG9jb2xdID09PSB0cnVlKSB7CisgICAgICAgIHJldHVybiAndW5zYWZlOicgKyB2YWx1
ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFkVGFnc0ZvckRhdGFVUklbdGFnTmFtZV0g
JiYgYmFkQXR0cmlidXRlc0ZvckRhdGFVUklbYXR0cmlidXRlXSkgeworICAgICAgcmV0dXJuICd1
bnNhZmU6JyArIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfSk7Citl
bmlmZWQoJ21vcnBoLXJhbmdlJywgWydleHBvcnRzJywgJ21vcnBoLXJhbmdlL3V0aWxzJ10sIGZ1
bmN0aW9uIChleHBvcnRzLCBfbW9ycGhSYW5nZVV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvLyBjb25zdHJ1Y3RvciBqdXN0IGluaXRpYWxpemVzIHRoZSBmaWVsZHMKKyAgLy8gdXNlIG9u
ZSBvZiB0aGUgc3RhdGljIGluaXRpYWxpemVycyB0byBjcmVhdGUgYSB2YWxpZCBtb3JwaC4KKyAg
ZnVuY3Rpb24gTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMu
ZG9tSGVscGVyID0gZG9tSGVscGVyOworICAgIC8vIGNvbnRleHQgaWYgY29udGVudCBpZiBjdXJy
ZW50IGNvbnRlbnQgaXMgZGV0YWNoZWQKKyAgICB0aGlzLmNvbnRleHR1YWxFbGVtZW50ID0gY29u
dGV4dHVhbEVsZW1lbnQ7CisgICAgLy8gaW5jbHVzaXZlIHJhbmdlIG9mIG1vcnBoCisgICAgLy8g
dGhlc2Ugc2hvdWxkIGJlIG5vZGVUeXBlIDEsIDMsIG9yIDgKKyAgICB0aGlzLmZpcnN0Tm9kZSA9
IG51bGw7CisgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7CisKKyAgICAvLyBmbGFnIHRvIGZvcmNl
IHRleHQgdG8gc2V0Q29udGVudCB0byBiZSB0cmVhdGVkIGFzIGh0bWwKKyAgICB0aGlzLnBhcnNl
VGV4dEFzSFRNTCA9IGZhbHNlOworCisgICAgLy8gbW9ycGggbGlzdCBncmFwaAorICAgIHRoaXMu
cGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICB0aGlzLnByZXZpb3VzTW9ycGggPSBudWxsOwor
ICAgIHRoaXMubmV4dE1vcnBoID0gbnVsbDsKKyAgfQorCisgIE1vcnBoLmVtcHR5ID0gZnVuY3Rp
b24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgbW9ycGggPSBuZXcg
TW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguY2xlYXIoKTsK
KyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgTW9ycGguY3JlYXRlID0gZnVuY3Rpb24gKGRv
bUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQsIG5vZGUpIHsKKyAgICB2YXIgbW9ycGggPSBuZXcg
TW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguc2V0Tm9kZShu
b2RlKTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgTW9ycGguYXR0YWNoID0gZnVuY3Rp
b24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQsIGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsK
KyAgICB2YXIgbW9ycGggPSBuZXcgTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7
CisgICAgbW9ycGguc2V0UmFuZ2UoZmlyc3ROb2RlLCBsYXN0Tm9kZSk7CisgICAgcmV0dXJuIG1v
cnBoOworICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24gTW9y
cGgkc2V0Q29udGVudChjb250ZW50KSB7CisgICAgaWYgKGNvbnRlbnQgPT09IG51bGwgfHwgY29u
dGVudCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdGhpcy5jbGVhcigpOworICAgIH0K
KworICAgIHZhciB0eXBlID0gdHlwZW9mIGNvbnRlbnQ7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgICBjYXNlICdzdHJpbmcnOgorICAgICAgICBpZiAodGhpcy5wYXJzZVRleHRBc0hUTUwpIHsK
KyAgICAgICAgICByZXR1cm4gdGhpcy5kb21IZWxwZXIuc2V0TW9ycGhIVE1MKHRoaXMsIGNvbnRl
bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnNldFRleHQoY29udGVudCk7Cisg
ICAgICBjYXNlICdvYmplY3QnOgorICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQubm9kZVR5cGUg
PT09ICdudW1iZXInKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Tm9kZShjb250ZW50KTsK
KyAgICAgICAgfQorICAgICAgICAvKiBIYW5kbGViYXJzLlNhZmVTdHJpbmcgKi8KKyAgICAgICAg
aWYgKHR5cGVvZiBjb250ZW50LnRvSFRNTCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHJl
dHVybiB0aGlzLnNldEhUTUwoY29udGVudC50b0hUTUwoKSk7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHRoaXMucGFyc2VUZXh0QXNIVE1MKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0SFRN
TChjb250ZW50LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAvKiBmYWxscyB0aHJvdWdo
ICovCisgICAgICBjYXNlICdib29sZWFuJzoKKyAgICAgIGNhc2UgJ251bWJlcic6CisgICAgICAg
IHJldHVybiB0aGlzLnNldFRleHQoY29udGVudC50b1N0cmluZygpKTsKKyAgICAgIGNhc2UgJ2Z1
bmN0aW9uJzoKKyAgICAgICAgcmFpc2VDYW5ub3RCaW5kVG9GdW5jdGlvbihjb250ZW50KTsKKyAg
ICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vuc3VwcG9ydGVkIGNv
bnRlbnQnKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gcmFpc2VDYW5ub3RCaW5kVG9GdW5j
dGlvbihjb250ZW50KSB7CisgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGNvbnRlbnQubmFtZTsKKyAg
ICB2YXIgbWVzc2FnZTsKKworICAgIGlmIChmdW5jdGlvbk5hbWUpIHsKKyAgICAgIG1lc3NhZ2Ug
PSAnVW5zdXBwb3J0ZWQgQ29udGVudDogQ2Fubm90IGJpbmQgdG8gZnVuY3Rpb24gYCcgKyBmdW5j
dGlvbk5hbWUgKyAnYCc7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UgPSAnVW5zdXBwb3J0
ZWQgQ29udGVudDogQ2Fubm90IGJpbmQgdG8gZnVuY3Rpb24nOworICAgIH0KKworICAgIHRocm93
IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7CisgIH0KKworICBNb3JwaC5wcm90b3R5cGUuY2xlYXIg
PSBmdW5jdGlvbiBNb3JwaCRjbGVhcigpIHsKKyAgICB2YXIgbm9kZSA9IHRoaXMuc2V0Tm9kZSh0
aGlzLmRvbUhlbHBlci5jcmVhdGVDb21tZW50KCcnKSk7CisgICAgcmV0dXJuIG5vZGU7CisgIH07
CisKKyAgTW9ycGgucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiBNb3JwaCRzZXRUZXh0KHRl
eHQpIHsKKyAgICB2YXIgZmlyc3ROb2RlID0gdGhpcy5maXJzdE5vZGU7CisgICAgdmFyIGxhc3RO
b2RlID0gdGhpcy5sYXN0Tm9kZTsKKworICAgIGlmIChmaXJzdE5vZGUgJiYgbGFzdE5vZGUgPT09
IGZpcnN0Tm9kZSAmJiBmaXJzdE5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgIGZpcnN0Tm9k
ZS5ub2RlVmFsdWUgPSB0ZXh0OworICAgICAgcmV0dXJuIGZpcnN0Tm9kZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdGhpcy5zZXROb2RlKHRleHQgPyB0aGlzLmRvbUhlbHBlci5jcmVhdGVUZXh0Tm9k
ZSh0ZXh0KSA6IHRoaXMuZG9tSGVscGVyLmNyZWF0ZUNvbW1lbnQoJycpKTsKKyAgfTsKKworICBN
b3JwaC5wcm90b3R5cGUuc2V0Tm9kZSA9IGZ1bmN0aW9uIE1vcnBoJHNldE5vZGUobmV3Tm9kZSkg
eworICAgIHZhciBmaXJzdE5vZGUsIGxhc3ROb2RlOworICAgIHN3aXRjaCAobmV3Tm9kZS5ub2Rl
VHlwZSkgeworICAgICAgY2FzZSAzOgorICAgICAgICBmaXJzdE5vZGUgPSBuZXdOb2RlOworICAg
ICAgICBsYXN0Tm9kZSA9IG5ld05vZGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMToK
KyAgICAgICAgZmlyc3ROb2RlID0gbmV3Tm9kZS5maXJzdENoaWxkOworICAgICAgICBsYXN0Tm9k
ZSA9IG5ld05vZGUubGFzdENoaWxkOworICAgICAgICBpZiAoZmlyc3ROb2RlID09PSBudWxsKSB7
CisgICAgICAgICAgZmlyc3ROb2RlID0gdGhpcy5kb21IZWxwZXIuY3JlYXRlQ29tbWVudCgnJyk7
CisgICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChmaXJzdE5vZGUpOworICAgICAgICAgIGxh
c3ROb2RlID0gZmlyc3ROb2RlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVm
YXVsdDoKKyAgICAgICAgZmlyc3ROb2RlID0gbmV3Tm9kZTsKKyAgICAgICAgbGFzdE5vZGUgPSBu
ZXdOb2RlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB0aGlzLnNldFJhbmdlKGZpcnN0
Tm9kZSwgbGFzdE5vZGUpOworCisgICAgcmV0dXJuIG5ld05vZGU7CisgIH07CisKKyAgTW9ycGgu
cHJvdG90eXBlLnNldFJhbmdlID0gZnVuY3Rpb24gKGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsKKyAg
ICB2YXIgcHJldmlvdXNGaXJzdE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKyAgICBpZiAocHJldmlv
dXNGaXJzdE5vZGUgIT09IG51bGwpIHsKKworICAgICAgdmFyIHBhcmVudE5vZGUgPSBwcmV2aW91
c0ZpcnN0Tm9kZS5wYXJlbnROb2RlOworICAgICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHsK
KyAgICAgICAgX21vcnBoUmFuZ2VVdGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgZmlyc3RO
b2RlLCBsYXN0Tm9kZSwgcHJldmlvdXNGaXJzdE5vZGUpOworICAgICAgICBfbW9ycGhSYW5nZVV0
aWxzLmNsZWFyKHBhcmVudE5vZGUsIHByZXZpb3VzRmlyc3ROb2RlLCB0aGlzLmxhc3ROb2RlKTsK
KyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmZpcnN0Tm9kZSA9IGZpcnN0Tm9kZTsKKyAgICB0
aGlzLmxhc3ROb2RlID0gbGFzdE5vZGU7CisKKyAgICBpZiAodGhpcy5wYXJlbnRNb3JwaExpc3Qp
IHsKKyAgICAgIHRoaXMuX3N5bmNGaXJzdE5vZGUoKTsKKyAgICAgIHRoaXMuX3N5bmNMYXN0Tm9k
ZSgpOworICAgIH0KKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9u
IE1vcnBoJGRlc3Ryb3koKSB7CisgICAgdGhpcy51bmxpbmsoKTsKKworICAgIHZhciBmaXJzdE5v
ZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKyAgICB2YXIgbGFzdE5vZGUgPSB0aGlzLmxhc3ROb2RlOwor
ICAgIHZhciBwYXJlbnROb2RlID0gZmlyc3ROb2RlICYmIGZpcnN0Tm9kZS5wYXJlbnROb2RlOwor
CisgICAgdGhpcy5maXJzdE5vZGUgPSBudWxsOworICAgIHRoaXMubGFzdE5vZGUgPSBudWxsOwor
CisgICAgX21vcnBoUmFuZ2VVdGlscy5jbGVhcihwYXJlbnROb2RlLCBmaXJzdE5vZGUsIGxhc3RO
b2RlKTsKKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUudW5saW5rID0gZnVuY3Rpb24gTW9ycGgk
dW5saW5rKCkgeworICAgIHZhciBwYXJlbnRNb3JwaExpc3QgPSB0aGlzLnBhcmVudE1vcnBoTGlz
dDsKKyAgICB2YXIgcHJldmlvdXNNb3JwaCA9IHRoaXMucHJldmlvdXNNb3JwaDsKKyAgICB2YXIg
bmV4dE1vcnBoID0gdGhpcy5uZXh0TW9ycGg7CisKKyAgICBpZiAocHJldmlvdXNNb3JwaCkgewor
ICAgICAgaWYgKG5leHRNb3JwaCkgeworICAgICAgICBwcmV2aW91c01vcnBoLm5leHRNb3JwaCA9
IG5leHRNb3JwaDsKKyAgICAgICAgbmV4dE1vcnBoLnByZXZpb3VzTW9ycGggPSBwcmV2aW91c01v
cnBoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlvdXNNb3JwaC5uZXh0TW9ycGggPSBu
dWxsOworICAgICAgICBwYXJlbnRNb3JwaExpc3QubGFzdENoaWxkTW9ycGggPSBwcmV2aW91c01v
cnBoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobmV4dE1vcnBoKSB7CisgICAg
ICAgIG5leHRNb3JwaC5wcmV2aW91c01vcnBoID0gbnVsbDsKKyAgICAgICAgcGFyZW50TW9ycGhM
aXN0LmZpcnN0Q2hpbGRNb3JwaCA9IG5leHRNb3JwaDsKKyAgICAgIH0gZWxzZSBpZiAocGFyZW50
TW9ycGhMaXN0KSB7CisgICAgICAgIHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaCA9IHBh
cmVudE1vcnBoTGlzdC5maXJzdENoaWxkTW9ycGggPSBudWxsOworICAgICAgfQorICAgIH0KKwor
ICAgIHRoaXMucGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICB0aGlzLm5leHRNb3JwaCA9IG51
bGw7CisgICAgdGhpcy5wcmV2aW91c01vcnBoID0gbnVsbDsKKworICAgIGlmIChwYXJlbnRNb3Jw
aExpc3QgJiYgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaCkgeworICAgICAgaWYgKCFwYXJl
bnRNb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICAgIC8vIGxpc3QgaXMgZW1wdHkK
KyAgICAgICAgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5jbGVhcigpOworICAgICAgICBy
ZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJlbnRNb3JwaExpc3QuZmlyc3RDaGls
ZE1vcnBoLl9zeW5jRmlyc3ROb2RlKCk7CisgICAgICAgIHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hp
bGRNb3JwaC5fc3luY0xhc3ROb2RlKCk7CisgICAgICB9CisgICAgfQorICB9OworCisgIE1vcnBo
LnByb3RvdHlwZS5zZXRIVE1MID0gZnVuY3Rpb24gKHRleHQpIHsKKyAgICB2YXIgZnJhZ21lbnQg
PSB0aGlzLmRvbUhlbHBlci5wYXJzZUhUTUwodGV4dCwgdGhpcy5jb250ZXh0dWFsRWxlbWVudCk7
CisgICAgcmV0dXJuIHRoaXMuc2V0Tm9kZShmcmFnbWVudCk7CisgIH07CisKKyAgTW9ycGgucHJv
dG90eXBlLnNldE1vcnBoTGlzdCA9IGZ1bmN0aW9uIE1vcnBoJGFwcGVuZE1vcnBoTGlzdChtb3Jw
aExpc3QpIHsKKyAgICBtb3JwaExpc3QubW91bnRlZE1vcnBoID0gdGhpczsKKyAgICB0aGlzLmNs
ZWFyKCk7CisKKyAgICB2YXIgb3JpZ2luYWxGaXJzdE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKwor
ICAgIGlmIChtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICB0aGlzLmZpcnN0Tm9k
ZSA9IG1vcnBoTGlzdC5maXJzdENoaWxkTW9ycGguZmlyc3ROb2RlOworICAgICAgdGhpcy5sYXN0
Tm9kZSA9IG1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaC5sYXN0Tm9kZTsKKworICAgICAgdmFyIGN1
cnJlbnQgPSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgICB3aGlsZSAoY3VycmVu
dCkgeworICAgICAgICB2YXIgbmV4dCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgICBjdXJy
ZW50Lmluc2VydEJlZm9yZU5vZGUob3JpZ2luYWxGaXJzdE5vZGUsIG51bGwpOworICAgICAgICBj
dXJyZW50ID0gbmV4dDsKKyAgICAgIH0KKyAgICAgIG9yaWdpbmFsRmlyc3ROb2RlLnBhcmVudE5v
ZGUucmVtb3ZlQ2hpbGQob3JpZ2luYWxGaXJzdE5vZGUpOworICAgIH0KKyAgfTsKKworICBNb3Jw
aC5wcm90b3R5cGUuX3N5bmNGaXJzdE5vZGUgPSBmdW5jdGlvbiBNb3JwaCRzeW5jRmlyc3ROb2Rl
KCkgeworICAgIHZhciBtb3JwaCA9IHRoaXM7CisgICAgdmFyIHBhcmVudE1vcnBoTGlzdDsKKyAg
ICB3aGlsZSAocGFyZW50TW9ycGhMaXN0ID0gbW9ycGgucGFyZW50TW9ycGhMaXN0KSB7CisgICAg
ICBpZiAocGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaCA9PT0gbnVsbCkgeworICAgICAgICBi
cmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaCAhPT0gcGFyZW50TW9ycGhMaXN0LmZpcnN0
Q2hpbGRNb3JwaCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaC5m
aXJzdE5vZGUgPT09IHBhcmVudE1vcnBoTGlzdC5tb3VudGVkTW9ycGguZmlyc3ROb2RlKSB7Cisg
ICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwYXJlbnRNb3JwaExpc3QubW91bnRlZE1v
cnBoLmZpcnN0Tm9kZSA9IG1vcnBoLmZpcnN0Tm9kZTsKKworICAgICAgbW9ycGggPSBwYXJlbnRN
b3JwaExpc3QubW91bnRlZE1vcnBoOworICAgIH0KKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUu
X3N5bmNMYXN0Tm9kZSA9IGZ1bmN0aW9uIE1vcnBoJHN5bmNMYXN0Tm9kZSgpIHsKKyAgICB2YXIg
bW9ycGggPSB0aGlzOworICAgIHZhciBwYXJlbnRNb3JwaExpc3Q7CisgICAgd2hpbGUgKHBhcmVu
dE1vcnBoTGlzdCA9IG1vcnBoLnBhcmVudE1vcnBoTGlzdCkgeworICAgICAgaWYgKHBhcmVudE1v
cnBoTGlzdC5tb3VudGVkTW9ycGggPT09IG51bGwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9
CisgICAgICBpZiAobW9ycGggIT09IHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaCkgewor
ICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaC5sYXN0Tm9kZSA9PT0gcGFy
ZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5sYXN0Tm9kZSkgeworICAgICAgICBicmVhazsKKyAg
ICAgIH0KKworICAgICAgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5sYXN0Tm9kZSA9IG1v
cnBoLmxhc3ROb2RlOworCisgICAgICBtb3JwaCA9IHBhcmVudE1vcnBoTGlzdC5tb3VudGVkTW9y
cGg7CisgICAgfQorICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5pbnNlcnRCZWZvcmVOb2RlID0g
ZnVuY3Rpb24gTW9ycGgkaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnROb2RlLCByZWZOb2RlKSB7Cisg
ICAgX21vcnBoUmFuZ2VVdGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgdGhpcy5maXJzdE5v
ZGUsIHRoaXMubGFzdE5vZGUsIHJlZk5vZGUpOworICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5h
cHBlbmRUb05vZGUgPSBmdW5jdGlvbiBNb3JwaCRhcHBlbmRUb05vZGUocGFyZW50Tm9kZSkgewor
ICAgIF9tb3JwaFJhbmdlVXRpbHMuaW5zZXJ0QmVmb3JlKHBhcmVudE5vZGUsIHRoaXMuZmlyc3RO
b2RlLCB0aGlzLmxhc3ROb2RlLCBudWxsKTsKKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBN
b3JwaDsKK30pOworZW5pZmVkKCdtb3JwaC1yYW5nZS9tb3JwaC1saXN0JywgWydleHBvcnRzJywg
J21vcnBoLXJhbmdlL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfbW9ycGhSYW5nZVV0aWxz
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBNb3JwaExpc3QoKSB7CisgICAgLy8g
bW9ycGggZ3JhcGgKKyAgICB0aGlzLmZpcnN0Q2hpbGRNb3JwaCA9IG51bGw7CisgICAgdGhpcy5s
YXN0Q2hpbGRNb3JwaCA9IG51bGw7CisKKyAgICB0aGlzLm1vdW50ZWRNb3JwaCA9IG51bGw7Cisg
IH0KKworICB2YXIgcHJvdG90eXBlID0gTW9ycGhMaXN0LnByb3RvdHlwZTsKKworICBwcm90b3R5
cGUuY2xlYXIgPSBmdW5jdGlvbiBNb3JwaExpc3QkY2xlYXIoKSB7CisgICAgdmFyIGN1cnJlbnQg
PSB0aGlzLmZpcnN0Q2hpbGRNb3JwaDsKKworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICB2
YXIgbmV4dCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgY3VycmVudC5wcmV2aW91c01vcnBo
ID0gbnVsbDsKKyAgICAgIGN1cnJlbnQubmV4dE1vcnBoID0gbnVsbDsKKyAgICAgIGN1cnJlbnQu
cGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0KKwor
ICAgIHRoaXMuZmlyc3RDaGlsZE1vcnBoID0gdGhpcy5sYXN0Q2hpbGRNb3JwaCA9IG51bGw7Cisg
IH07CisKKyAgcHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBNb3JwaExpc3QkZGVzdHJveSgp
IHt9OworCisgIHByb3RvdHlwZS5hcHBlbmRNb3JwaCA9IGZ1bmN0aW9uIE1vcnBoTGlzdCRhcHBl
bmRNb3JwaChtb3JwaCkgeworICAgIHRoaXMuaW5zZXJ0QmVmb3JlTW9ycGgobW9ycGgsIG51bGwp
OworICB9OworCisgIHByb3RvdHlwZS5pbnNlcnRCZWZvcmVNb3JwaCA9IGZ1bmN0aW9uIE1vcnBo
TGlzdCRpbnNlcnRCZWZvcmVNb3JwaChtb3JwaCwgcmVmZXJlbmNlTW9ycGgpIHsKKyAgICBpZiAo
bW9ycGgucGFyZW50TW9ycGhMaXN0ICE9PSBudWxsKSB7CisgICAgICBtb3JwaC51bmxpbmsoKTsK
KyAgICB9CisgICAgaWYgKHJlZmVyZW5jZU1vcnBoICYmIHJlZmVyZW5jZU1vcnBoLnBhcmVudE1v
cnBoTGlzdCAhPT0gdGhpcykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbW9ycGggYmVm
b3JlIHdoaWNoIHRoZSBuZXcgbW9ycGggaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQg
b2YgdGhpcyBtb3JwaC4nKTsKKyAgICB9CisKKyAgICB2YXIgbW91bnRlZE1vcnBoID0gdGhpcy5t
b3VudGVkTW9ycGg7CisKKyAgICBpZiAobW91bnRlZE1vcnBoKSB7CisKKyAgICAgIHZhciBwYXJl
bnROb2RlID0gbW91bnRlZE1vcnBoLmZpcnN0Tm9kZS5wYXJlbnROb2RlOworICAgICAgdmFyIHJl
ZmVyZW5jZU5vZGUgPSByZWZlcmVuY2VNb3JwaCA/IHJlZmVyZW5jZU1vcnBoLmZpcnN0Tm9kZSA6
IG1vdW50ZWRNb3JwaC5sYXN0Tm9kZS5uZXh0U2libGluZzsKKworICAgICAgX21vcnBoUmFuZ2VV
dGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgbW9ycGguZmlyc3ROb2RlLCBtb3JwaC5sYXN0
Tm9kZSwgcmVmZXJlbmNlTm9kZSk7CisKKyAgICAgIC8vIHdhcyBub3QgaW4gbGlzdCBtb2RlIHJl
cGxhY2UgY3VycmVudCBjb250ZW50CisgICAgICBpZiAoIXRoaXMuZmlyc3RDaGlsZE1vcnBoKSB7
CisgICAgICAgIF9tb3JwaFJhbmdlVXRpbHMuY2xlYXIodGhpcy5tb3VudGVkTW9ycGguZmlyc3RO
b2RlLnBhcmVudE5vZGUsIHRoaXMubW91bnRlZE1vcnBoLmZpcnN0Tm9kZSwgdGhpcy5tb3VudGVk
TW9ycGgubGFzdE5vZGUpOworICAgICAgfQorICAgIH0KKworICAgIG1vcnBoLnBhcmVudE1vcnBo
TGlzdCA9IHRoaXM7CisKKyAgICB2YXIgcHJldmlvdXNNb3JwaCA9IHJlZmVyZW5jZU1vcnBoID8g
cmVmZXJlbmNlTW9ycGgucHJldmlvdXNNb3JwaCA6IHRoaXMubGFzdENoaWxkTW9ycGg7CisgICAg
aWYgKHByZXZpb3VzTW9ycGgpIHsKKyAgICAgIHByZXZpb3VzTW9ycGgubmV4dE1vcnBoID0gbW9y
cGg7CisgICAgICBtb3JwaC5wcmV2aW91c01vcnBoID0gcHJldmlvdXNNb3JwaDsKKyAgICB9IGVs
c2UgeworICAgICAgdGhpcy5maXJzdENoaWxkTW9ycGggPSBtb3JwaDsKKyAgICB9CisKKyAgICBp
ZiAocmVmZXJlbmNlTW9ycGgpIHsKKyAgICAgIHJlZmVyZW5jZU1vcnBoLnByZXZpb3VzTW9ycGgg
PSBtb3JwaDsKKyAgICAgIG1vcnBoLm5leHRNb3JwaCA9IHJlZmVyZW5jZU1vcnBoOworICAgIH0g
ZWxzZSB7CisgICAgICB0aGlzLmxhc3RDaGlsZE1vcnBoID0gbW9ycGg7CisgICAgfQorCisgICAg
dGhpcy5maXJzdENoaWxkTW9ycGguX3N5bmNGaXJzdE5vZGUoKTsKKyAgICB0aGlzLmxhc3RDaGls
ZE1vcnBoLl9zeW5jTGFzdE5vZGUoKTsKKyAgfTsKKworICBwcm90b3R5cGUucmVtb3ZlQ2hpbGRN
b3JwaCA9IGZ1bmN0aW9uIE1vcnBoTGlzdCRyZW1vdmVDaGlsZE1vcnBoKG1vcnBoKSB7CisgICAg
aWYgKG1vcnBoLnBhcmVudE1vcnBoTGlzdCAhPT0gdGhpcykgeworICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJDYW5ub3QgcmVtb3ZlIGEgbW9ycGggZnJvbSBhIHBhcmVudCBpdCBpcyBub3QgaW5zaWRl
IG9mIik7CisgICAgfQorCisgICAgbW9ycGguZGVzdHJveSgpOworICB9OworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IE1vcnBoTGlzdDsKK30pOworZW5pZmVkKCdtb3JwaC1yYW5nZS9tb3JwaC1saXN0
LnVtZCcsIFsnZXhwb3J0cycsICdtb3JwaC1yYW5nZS9tb3JwaC1saXN0J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfbW9ycGhSYW5nZU1vcnBoTGlzdCkgeworICAndXNlIHN0cmljdCc7CisKKyAgKGZ1
bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CisgICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5j
dGlvbicgJiYgZGVmaW5lLmFtZCkgeworICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTsKKyAgICB9
IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgeworICAgICAgbW9kdWxlLmV4
cG9ydHMgPSBmYWN0b3J5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJvb3QuTW9ycGhMaXN0ID0g
ZmFjdG9yeSgpOworICAgIH0KKyAgfSkodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7CisgICAgcmV0
dXJuIF9tb3JwaFJhbmdlTW9ycGhMaXN0LmRlZmF1bHQ7CisgIH0pOworfSk7CitlbmlmZWQoIm1v
cnBoLXJhbmdlL3V0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8v
IGluY2x1c2l2ZSBvZiBib3RoIG5vZGVzCisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmNs
ZWFyID0gY2xlYXI7CisgIGV4cG9ydHMuaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlOworCisg
IGZ1bmN0aW9uIGNsZWFyKHBhcmVudE5vZGUsIGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsKKyAgICBp
ZiAoIXBhcmVudE5vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbm9kZSA9
IGZpcnN0Tm9kZTsKKyAgICB2YXIgbmV4dE5vZGU7CisgICAgZG8geworICAgICAgbmV4dE5vZGUg
PSBub2RlLm5leHRTaWJsaW5nOworICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsK
KyAgICAgIGlmIChub2RlID09PSBsYXN0Tm9kZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0K
KyAgICAgIG5vZGUgPSBuZXh0Tm9kZTsKKyAgICB9IHdoaWxlIChub2RlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBmaXJzdE5vZGUsIGxhc3ROb2RlLCByZWZO
b2RlKSB7CisgICAgdmFyIG5vZGUgPSBmaXJzdE5vZGU7CisgICAgdmFyIG5leHROb2RlOworICAg
IGRvIHsKKyAgICAgIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgIHBhcmVudE5v
ZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpOworICAgICAgaWYgKG5vZGUgPT09IGxhc3RO
b2RlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbm9kZSA9IG5leHROb2RlOwor
ICAgIH0gd2hpbGUgKG5vZGUpOworICB9Cit9KTsKK2VuaWZlZCgncm91dGUtcmVjb2duaXplcics
IFsnZXhwb3J0cycsICdyb3V0ZS1yZWNvZ25pemVyL2RzbCddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X3JvdXRlUmVjb2duaXplckRzbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIHNwZWNpYWxz
ID0gWycvJywgJy4nLCAnKicsICcrJywgJz8nLCAnfCcsICcoJywgJyknLCAnWycsICddJywgJ3sn
LCAnfScsICdcXCddOworCisgIHZhciBlc2NhcGVSZWdleCA9IG5ldyBSZWdFeHAoJyhcXCcgKyBz
cGVjaWFscy5qb2luKCd8XFwnKSArICcpJywgJ2cnKTsKKworICBmdW5jdGlvbiBpc0FycmF5KHRl
c3QpIHsKKyAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRlc3QpID09
PSAiW29iamVjdCBBcnJheV0iOworICB9CisKKyAgLy8gQSBTZWdtZW50IHJlcHJlc2VudHMgYSBz
ZWdtZW50IGluIHRoZSBvcmlnaW5hbCByb3V0ZSBkZXNjcmlwdGlvbi4KKyAgLy8gRWFjaCBTZWdt
ZW50IHR5cGUgcHJvdmlkZXMgYW4gYGVhY2hDaGFyYCBhbmQgYHJlZ2V4YCBtZXRob2QuCisgIC8v
CisgIC8vIFRoZSBgZWFjaENoYXJgIG1ldGhvZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIG9u
ZSBvciBtb3JlIGNoYXJhY3RlcgorICAvLyBzcGVjaWZpY2F0aW9ucy4gQSBjaGFyYWN0ZXIgc3Bl
Y2lmaWNhdGlvbiBjb25zdW1lcyBvbmUgb3IgbW9yZSBpbnB1dAorICAvLyBjaGFyYWN0ZXJzLgor
ICAvLworICAvLyBUaGUgYHJlZ2V4YCBtZXRob2QgcmV0dXJucyBhIHJlZ2V4IGZyYWdtZW50IGZv
ciB0aGUgc2VnbWVudC4gSWYgdGhlCisgIC8vIHNlZ21lbnQgaXMgYSBkeW5hbWljIG9mIHN0YXIg
c2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFsc28gaW5jbHVkZXMKKyAgLy8gYSBjYXB0dXJl
LgorICAvLworICAvLyBBIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgorICAvLwor
ICAvLyAqIGB2YWxpZENoYXJzYDogYSBTdHJpbmcgd2l0aCBhIGxpc3Qgb2YgYWxsIHZhbGlkIGNo
YXJhY3RlcnMsIG9yCisgIC8vICogYGludmFsaWRDaGFyc2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0
IG9mIGFsbCBpbnZhbGlkIGNoYXJhY3RlcnMKKyAgLy8gKiBgcmVwZWF0YDogdHJ1ZSBpZiB0aGUg
Y2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY2FuIHJlcGVhdAorCisgIGZ1bmN0aW9uIFN0YXRpY1Nl
Z21lbnQoc3RyaW5nKSB7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KKyAgU3RhdGlj
U2VnbWVudC5wcm90b3R5cGUgPSB7CisgICAgZWFjaENoYXI6IGZ1bmN0aW9uIChjYWxsYmFjaykg
eworICAgICAgdmFyIHN0cmluZyA9IHRoaXMuc3RyaW5nLAorICAgICAgICAgIGNoOworCisgICAg
ICBmb3IgKHZhciBpID0gMCwgbCA9IHN0cmluZy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAg
ICAgY2ggPSBzdHJpbmcuY2hhckF0KGkpOworICAgICAgICBjYWxsYmFjayh7IHZhbGlkQ2hhcnM6
IGNoIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICByZWdleDogZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIHRoaXMuc3RyaW5nLnJlcGxhY2UoZXNjYXBlUmVnZXgsICdcXCQxJyk7CisgICAg
fSwKKworICAgIGdlbmVyYXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdHJp
bmc7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIER5bmFtaWNTZWdtZW50KG5hbWUpIHsKKyAg
ICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisgIER5bmFtaWNTZWdtZW50LnByb3RvdHlwZSA9IHsK
KyAgICBlYWNoQ2hhcjogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjayh7IGlu
dmFsaWRDaGFyczogIi8iLCByZXBlYXQ6IHRydWUgfSk7CisgICAgfSwKKworICAgIHJlZ2V4OiBm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gIihbXi9dKykiOworICAgIH0sCisKKyAgICBnZW5l
cmF0ZTogZnVuY3Rpb24gKHBhcmFtcykgeworICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVd
OworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7CisgICAgdGhp
cy5uYW1lID0gbmFtZTsKKyAgfQorICBTdGFyU2VnbWVudC5wcm90b3R5cGUgPSB7CisgICAgZWFj
aENoYXI6IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2soeyBpbnZhbGlkQ2hh
cnM6ICIiLCByZXBlYXQ6IHRydWUgfSk7CisgICAgfSwKKworICAgIHJlZ2V4OiBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gIiguKykiOworICAgIH0sCisKKyAgICBnZW5lcmF0ZTogZnVuY3Rp
b24gKHBhcmFtcykgeworICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOworICAgIH0KKyAg
fTsKKworICBmdW5jdGlvbiBFcHNpbG9uU2VnbWVudCgpIHt9CisgIEVwc2lsb25TZWdtZW50LnBy
b3RvdHlwZSA9IHsKKyAgICBlYWNoQ2hhcjogZnVuY3Rpb24gKCkge30sCisgICAgcmVnZXg6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9LAorICAgIGdlbmVyYXRlOiBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIHBh
cnNlKHJvdXRlLCBuYW1lcywgdHlwZXMpIHsKKyAgICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90
IHN0YXJ0aW5nIHdpdGggYSAiLyIuIFJlY29nbml0aW9uIHdpbGwKKyAgICAvLyBhbHNvIG5vcm1h
bGl6ZS4KKyAgICBpZiAocm91dGUuY2hhckF0KDApID09PSAiLyIpIHsKKyAgICAgIHJvdXRlID0g
cm91dGUuc3Vic3RyKDEpOworICAgIH0KKworICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNwbGl0
KCIvIiksCisgICAgICAgIHJlc3VsdHMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0g
c2VnbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgc2VnbWVudCA9IHNlZ21l
bnRzW2ldLAorICAgICAgICAgIG1hdGNoOworCisgICAgICBpZiAobWF0Y2ggPSBzZWdtZW50Lm1h
dGNoKC9eOihbXlwvXSspJC8pKSB7CisgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRHluYW1pY1Nl
Z21lbnQobWF0Y2hbMV0pKTsKKyAgICAgICAgbmFtZXMucHVzaChtYXRjaFsxXSk7CisgICAgICAg
IHR5cGVzLmR5bmFtaWNzKys7CisgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gc2VnbWVudC5tYXRj
aCgvXlwqKFteXC9dKykkLykpIHsKKyAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGFyU2VnbWVu
dChtYXRjaFsxXSkpOworICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFdKTsKKyAgICAgICAgdHlw
ZXMuc3RhcnMrKzsKKyAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gIiIpIHsKKyAgICAgICAg
cmVzdWx0cy5wdXNoKG5ldyBFcHNpbG9uU2VnbWVudCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJlc3VsdHMucHVzaChuZXcgU3RhdGljU2VnbWVudChzZWdtZW50KSk7CisgICAgICAgIHR5
cGVzLnN0YXRpY3MrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKKyAg
fQorCisgIC8vIEEgU3RhdGUgaGFzIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYW5kIChgY2hh
clNwZWNgKSBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlCisgIC8vIHN1YnNlcXVlbnQgc3RhdGVzIChg
bmV4dFN0YXRlc2ApLgorICAvLworICAvLyBJZiBhIFN0YXRlIGlzIGFuIGFjY2VwdGluZyBzdGF0
ZSwgaXQgd2lsbCBhbHNvIGhhdmUgc2V2ZXJhbCBhZGRpdGlvbmFsCisgIC8vIHByb3BlcnRpZXM6
CisgIC8vCisgIC8vICogYHJlZ2V4YDogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2Vk
IHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIHBhdGhzCisgIC8vICAgdGhhdCByZWFjaGVkIHRo
aXMgYWNjZXB0aW5nIHN0YXRlLgorICAvLyAqIGBoYW5kbGVyc2A6IEluZm9ybWF0aW9uIG9uIGhv
dyB0byBjb252ZXJ0IHRoZSBsaXN0IG9mIGNhcHR1cmVzIGludG8gY2FsbHMKKyAgLy8gICB0byBy
ZWdpc3RlcmVkIGhhbmRsZXJzIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgIC8vICog
YHR5cGVzYDogSG93IG1hbnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVudHMgaW4gdGhp
cyByb3V0ZS4gVXNlZCB0bworICAvLyAgIGRlY2lkZSB3aGljaCByb3V0ZSB0byB1c2UgaWYgbXVs
dGlwbGUgcmVnaXN0ZXJlZCByb3V0ZXMgbWF0Y2ggYSBwYXRoLgorICAvLworICAvLyBDdXJyZW50
bHksIFN0YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBuZXh0U3Rh
dGVzYCBhbmQKKyAgLy8gY29tcGFyaW5nIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYWdhaW5z
dCBhIGNoYXJhY3Rlci4gQSBtb3JlIGVmZmljaWVudAorICAvLyBpbXBsZW1lbnRhdGlvbiB3b3Vs
ZCB1c2UgYSBoYXNoIG9mIGtleXMgcG9pbnRpbmcgYXQgb25lIG9yIG1vcmUgbmV4dCBzdGF0ZXMu
CisKKyAgZnVuY3Rpb24gU3RhdGUoY2hhclNwZWMpIHsKKyAgICB0aGlzLmNoYXJTcGVjID0gY2hh
clNwZWM7CisgICAgdGhpcy5uZXh0U3RhdGVzID0gW107CisgIH0KKworICBTdGF0ZS5wcm90b3R5
cGUgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiAoY2hhclNwZWMpIHsKKyAgICAgIHZhciBuZXh0U3Rh
dGVzID0gdGhpcy5uZXh0U3RhdGVzOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5leHRT
dGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhciBjaGlsZCA9IG5leHRTdGF0
ZXNbaV07CisKKyAgICAgICAgdmFyIGlzRXF1YWwgPSBjaGlsZC5jaGFyU3BlYy52YWxpZENoYXJz
ID09PSBjaGFyU3BlYy52YWxpZENoYXJzOworICAgICAgICBpc0VxdWFsID0gaXNFcXVhbCAmJiBj
aGlsZC5jaGFyU3BlYy5pbnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLmludmFsaWRDaGFyczsKKwor
ICAgICAgICBpZiAoaXNFcXVhbCkgeworICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAg
fQorICAgICAgfQorICAgIH0sCisKKyAgICBwdXQ6IGZ1bmN0aW9uIChjaGFyU3BlYykgeworICAg
ICAgdmFyIHN0YXRlOworCisgICAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24g
YWxyZWFkeSBleGlzdHMgaW4gYSBjaGlsZCBvZiB0aGUgY3VycmVudAorICAgICAgLy8gc3RhdGUs
IGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCisgICAgICBpZiAoc3RhdGUgPSB0aGlzLmdldChjaGFy
U3BlYykpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgfQorCisgICAgICAvLyBNYWtl
IGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFjdGVyIHNwZWMKKyAgICAgIHN0YXRlID0gbmV3IFN0
YXRlKGNoYXJTcGVjKTsKKworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGls
ZCBvZiB0aGUgY3VycmVudCBzdGF0ZQorICAgICAgdGhpcy5uZXh0U3RhdGVzLnB1c2goc3RhdGUp
OworCisgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIHJlcGVhdHMsIGlu
c2VydCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hpbGQKKyAgICAgIC8vIG9mIGl0c2VsZi4gTm90ZSB0
aGF0IHRoaXMgd2lsbCBub3QgdHJpZ2dlciBhbiBpbmZpbml0ZSBsb29wIGJlY2F1c2UgZWFjaAor
ICAgICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVjb2duaXRpb24gY29uc3VtZXMgYSBjaGFyYWN0
ZXIuCisgICAgICBpZiAoY2hhclNwZWMucmVwZWF0KSB7CisgICAgICAgIHN0YXRlLm5leHRTdGF0
ZXMucHVzaChzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybiB0aGUgbmV3IHN0YXRl
CisgICAgICByZXR1cm4gc3RhdGU7CisgICAgfSwKKworICAgIC8vIEZpbmQgYSBsaXN0IG9mIGNo
aWxkIHN0YXRlcyBtYXRjaGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIKKyAgICBtYXRjaDogZnVuY3Rp
b24gKGNoKSB7CisgICAgICAvLyBERUJVRyAiUHJvY2Vzc2luZyBgIiArIGNoICsgImA6IgorICAg
ICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXMsCisgICAgICAgICAgY2hpbGQsCisg
ICAgICAgICAgY2hhclNwZWMsCisgICAgICAgICAgY2hhcnM7CisKKyAgICAgIC8vIERFQlVHICIg
ICIgKyBkZWJ1Z1N0YXRlKHRoaXMpCisgICAgICB2YXIgcmV0dXJuZWQgPSBbXTsKKworICAgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBuZXh0U3RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgICBjaGlsZCA9IG5leHRTdGF0ZXNbaV07CisKKyAgICAgICAgY2hhclNwZWMgPSBjaGlsZC5j
aGFyU3BlYzsKKworICAgICAgICBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hh
cnMpICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoKSAh
PT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybmVkLnB1c2goY2hpbGQpOworICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hhclNwZWMuaW52YWxpZENoYXJz
KSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICBpZiAoY2hhcnMuaW5kZXhPZihjaCkgPT09
IC0xKSB7CisgICAgICAgICAgICByZXR1cm5lZC5wdXNoKGNoaWxkKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJldHVybmVkOworICAgIH0KKworICAg
IC8qKiBJRiBERUJVRworICAgICwgZGVidWc6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNoYXJT
cGVjID0gdGhpcy5jaGFyU3BlYywKKyAgICAgICAgICBkZWJ1ZyA9ICJbIiwKKyAgICAgICAgICBj
aGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMgfHwgY2hhclNwZWMuaW52YWxpZENoYXJzOworICAg
ICAgIGlmIChjaGFyU3BlYy5pbnZhbGlkQ2hhcnMpIHsgZGVidWcgKz0gIl4iOyB9CisgICAgICBk
ZWJ1ZyArPSBjaGFyczsKKyAgICAgIGRlYnVnICs9ICJdIjsKKyAgICAgICBpZiAoY2hhclNwZWMu
cmVwZWF0KSB7IGRlYnVnICs9ICIrIjsgfQorICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9Cisg
ICAgRU5EIElGICoqLworICB9OworCisgIC8qKiBJRiBERUJVRworICBmdW5jdGlvbiBkZWJ1Zyhs
b2cpIHsKKyAgICBjb25zb2xlLmxvZyhsb2cpOworICB9CisgIAorICBmdW5jdGlvbiBkZWJ1Z1N0
YXRlKHN0YXRlKSB7CisgICAgcmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKG4p
IHsKKyAgICAgIGlmIChuLm5leHRTdGF0ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiAiKCAiICsg
bi5kZWJ1ZygpICsgIiBbYWNjZXB0aW5nXSApIjsgfQorICAgICAgcmV0dXJuICIoICIgKyBuLmRl
YnVnKCkgKyAiIDx0aGVuPiAiICsgbi5uZXh0U3RhdGVzLm1hcChmdW5jdGlvbihzKSB7IHJldHVy
biBzLmRlYnVnKCkgfSkuam9pbigiIG9yICIpICsgIiApIjsKKyAgICB9KS5qb2luKCIsICIpCisg
IH0KKyAgRU5EIElGICoqLworCisgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBuYWl2ZSBzdHJhdGVn
eSwgYnV0IHNob3VsZCB3b3JrIGluIGEgbG90IG9mIGNhc2VzCisgIC8vIEEgYmV0dGVyIHN0cmF0
ZWd5IHdvdWxkIHByb3Blcmx5IHJlc29sdmUgL3Bvc3RzLzppZC9uZXcgYW5kIC9wb3N0cy9lZGl0
LzppZC4KKyAgLy8KKyAgLy8gVGhpcyBzdHJhdGVneSBnZW5lcmFsbHkgcHJlZmVycyBtb3JlIHN0
YXRpYyBhbmQgbGVzcyBkeW5hbWljIG1hdGNoaW5nLgorICAvLyBTcGVjaWZpY2FsbHksIGl0Cisg
IC8vCisgIC8vICAqIHByZWZlcnMgZmV3ZXIgc3RhcnMgdG8gbW9yZSwgdGhlbgorICAvLyAgKiBw
cmVmZXJzIHVzaW5nIHN0YXJzIGZvciBsZXNzIG9mIHRoZSBtYXRjaCB0byBtb3JlLCB0aGVuCisg
IC8vICAqIHByZWZlcnMgZmV3ZXIgZHluYW1pYyBzZWdtZW50cyB0byBtb3JlLCB0aGVuCisgIC8v
ICAqIHByZWZlcnMgbW9yZSBzdGF0aWMgc2VnbWVudHMgdG8gbW9yZQorICBmdW5jdGlvbiBzb3J0
U29sdXRpb25zKHN0YXRlcykgeworICAgIHJldHVybiBzdGF0ZXMuc29ydChmdW5jdGlvbiAoYSwg
YikgeworICAgICAgaWYgKGEudHlwZXMuc3RhcnMgIT09IGIudHlwZXMuc3RhcnMpIHsKKyAgICAg
ICAgcmV0dXJuIGEudHlwZXMuc3RhcnMgLSBiLnR5cGVzLnN0YXJzOworICAgICAgfQorCisgICAg
ICBpZiAoYS50eXBlcy5zdGFycykgeworICAgICAgICBpZiAoYS50eXBlcy5zdGF0aWNzICE9PSBi
LnR5cGVzLnN0YXRpY3MpIHsKKyAgICAgICAgICByZXR1cm4gYi50eXBlcy5zdGF0aWNzIC0gYS50
eXBlcy5zdGF0aWNzOworICAgICAgICB9CisgICAgICAgIGlmIChhLnR5cGVzLmR5bmFtaWNzICE9
PSBiLnR5cGVzLmR5bmFtaWNzKSB7CisgICAgICAgICAgcmV0dXJuIGIudHlwZXMuZHluYW1pY3Mg
LSBhLnR5cGVzLmR5bmFtaWNzOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChhLnR5
cGVzLmR5bmFtaWNzICE9PSBiLnR5cGVzLmR5bmFtaWNzKSB7CisgICAgICAgIHJldHVybiBhLnR5
cGVzLmR5bmFtaWNzIC0gYi50eXBlcy5keW5hbWljczsKKyAgICAgIH0KKyAgICAgIGlmIChhLnR5
cGVzLnN0YXRpY3MgIT09IGIudHlwZXMuc3RhdGljcykgeworICAgICAgICByZXR1cm4gYi50eXBl
cy5zdGF0aWNzIC0gYS50eXBlcy5zdGF0aWNzOworICAgICAgfQorCisgICAgICByZXR1cm4gMDsK
KyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3RhdGVzLCBjaCkgewor
ICAgIHZhciBuZXh0U3RhdGVzID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHN0YXRl
cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHZhciBzdGF0ZSA9IHN0YXRlc1tpXTsKKwor
ICAgICAgbmV4dFN0YXRlcyA9IG5leHRTdGF0ZXMuY29uY2F0KHN0YXRlLm1hdGNoKGNoKSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG5leHRTdGF0ZXM7CisgIH0KKworICB2YXIgb0NyZWF0ZSA9IE9i
amVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKHByb3RvKSB7CisgICAgZnVuY3Rpb24gRigpIHt9Cisg
ICAgRi5wcm90b3R5cGUgPSBwcm90bzsKKyAgICByZXR1cm4gbmV3IEYoKTsKKyAgfTsKKworICBm
dW5jdGlvbiBSZWNvZ25pemVSZXN1bHRzKHF1ZXJ5UGFyYW1zKSB7CisgICAgdGhpcy5xdWVyeVBh
cmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9OworICB9CisgIFJlY29nbml6ZVJlc3VsdHMucHJvdG90
eXBlID0gb0NyZWF0ZSh7CisgICAgc3BsaWNlOiBBcnJheS5wcm90b3R5cGUuc3BsaWNlLAorICAg
IHNsaWNlOiBBcnJheS5wcm90b3R5cGUuc2xpY2UsCisgICAgcHVzaDogQXJyYXkucHJvdG90eXBl
LnB1c2gsCisgICAgbGVuZ3RoOiAwLAorICAgIHF1ZXJ5UGFyYW1zOiBudWxsCisgIH0pOworCisg
IGZ1bmN0aW9uIGZpbmRIYW5kbGVyKHN0YXRlLCBwYXRoLCBxdWVyeVBhcmFtcykgeworICAgIHZh
ciBoYW5kbGVycyA9IHN0YXRlLmhhbmRsZXJzLAorICAgICAgICByZWdleCA9IHN0YXRlLnJlZ2V4
OworICAgIHZhciBjYXB0dXJlcyA9IHBhdGgubWF0Y2gocmVnZXgpLAorICAgICAgICBjdXJyZW50
Q2FwdHVyZSA9IDE7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBSZWNvZ25pemVSZXN1bHRzKHF1ZXJ5
UGFyYW1zKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLAorICAgICAgICAgIG5h
bWVzID0gaGFuZGxlci5uYW1lcywKKyAgICAgICAgICBwYXJhbXMgPSB7fTsKKworICAgICAgZm9y
ICh2YXIgaiA9IDAsIG0gPSBuYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICAgICAgcGFy
YW1zW25hbWVzW2pdXSA9IGNhcHR1cmVzW2N1cnJlbnRDYXB0dXJlKytdOworICAgICAgfQorCisg
ICAgICByZXN1bHQucHVzaCh7IGhhbmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFyYW1zOiBwYXJh
bXMsIGlzRHluYW1pYzogISFuYW1lcy5sZW5ndGggfSk7CisgICAgfQorCisgICAgcmV0dXJuIHJl
c3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50
KSB7CisgICAgc2VnbWVudC5lYWNoQ2hhcihmdW5jdGlvbiAoY2gpIHsKKyAgICAgIHZhciBzdGF0
ZTsKKworICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dChjaCk7CisgICAgfSk7
CisKKyAgICByZXR1cm4gY3VycmVudFN0YXRlOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlUXVl
cnlQYXJhbVBhcnQocGFydCkgeworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEv
aW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQorICAgIHBhcnQgPSBwYXJ0LnJlcGxhY2Uo
L1wrL2dtLCAnJTIwJyk7CisgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTsKKyAg
fQorCisgIC8vIFRoZSBtYWluIGludGVyZmFjZQorCisgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBm
dW5jdGlvbiAoKSB7CisgICAgdGhpcy5yb290U3RhdGUgPSBuZXcgU3RhdGUoKTsKKyAgICB0aGlz
Lm5hbWVzID0ge307CisgIH07CisKKyAgUm91dGVSZWNvZ25pemVyLnByb3RvdHlwZSA9IHsKKyAg
ICBhZGQ6IGZ1bmN0aW9uIChyb3V0ZXMsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBjdXJyZW50U3Rh
dGUgPSB0aGlzLnJvb3RTdGF0ZSwKKyAgICAgICAgICByZWdleCA9ICJeIiwKKyAgICAgICAgICB0
eXBlcyA9IHsgc3RhdGljczogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0sCisgICAgICAgICAg
aGFuZGxlcnMgPSBbXSwKKyAgICAgICAgICBhbGxTZWdtZW50cyA9IFtdLAorICAgICAgICAgIG5h
bWU7CisKKyAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsKKworICAgICAgZm9yICh2YXIgaSA9IDAs
IGwgPSByb3V0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhciByb3V0ZSA9IHJv
dXRlc1tpXSwKKyAgICAgICAgICAgIG5hbWVzID0gW107CisKKyAgICAgICAgdmFyIHNlZ21lbnRz
ID0gcGFyc2Uocm91dGUucGF0aCwgbmFtZXMsIHR5cGVzKTsKKworICAgICAgICBhbGxTZWdtZW50
cyA9IGFsbFNlZ21lbnRzLmNvbmNhdChzZWdtZW50cyk7CisKKyAgICAgICAgZm9yICh2YXIgaiA9
IDAsIG0gPSBzZWdtZW50cy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICAgICAgICB2YXIgc2Vn
bWVudCA9IHNlZ21lbnRzW2pdOworCisgICAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBF
cHNpbG9uU2VnbWVudCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisg
ICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOworCisgICAgICAgICAgLy8gQWRkIGEgIi8iIGZvciB0
aGUgbmV3IHNlZ21lbnQKKyAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0
KHsgdmFsaWRDaGFyczogIi8iIH0pOworICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKKworICAgICAg
ICAgIC8vIEFkZCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWdtZW50IHRvIHRoZSBORkEgYW5k
IHJlZ2V4CisgICAgICAgICAgY3VycmVudFN0YXRlID0gYWRkU2VnbWVudChjdXJyZW50U3RhdGUs
IHNlZ21lbnQpOworICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZhciBoYW5kbGVyID0geyBoYW5kbGVyOiByb3V0ZS5oYW5kbGVyLCBuYW1l
czogbmFtZXMgfTsKKyAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKGlzRW1wdHkpIHsKKyAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRl
LnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsKKyAgICAgICAgcmVnZXggKz0gIi8iOworICAgICAg
fQorCisgICAgICBjdXJyZW50U3RhdGUuaGFuZGxlcnMgPSBoYW5kbGVyczsKKyAgICAgIGN1cnJl
bnRTdGF0ZS5yZWdleCA9IG5ldyBSZWdFeHAocmVnZXggKyAiJCIpOworICAgICAgY3VycmVudFN0
YXRlLnR5cGVzID0gdHlwZXM7CisKKyAgICAgIGlmIChuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25z
LmFzKSB7CisgICAgICAgIHRoaXMubmFtZXNbbmFtZV0gPSB7CisgICAgICAgICAgc2VnbWVudHM6
IGFsbFNlZ21lbnRzLAorICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycworICAgICAgICB9Owor
ICAgICAgfQorICAgIH0sCisKKyAgICBoYW5kbGVyc0ZvcjogZnVuY3Rpb24gKG5hbWUpIHsKKyAg
ICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0sCisgICAgICAgICAgcmVzdWx0ID0gW107
CisgICAgICBpZiAoIXJvdXRlKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMg
bm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0g
MCwgbCA9IHJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICByZXN1
bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfSwKKworICAgIGhhc1JvdXRlOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0
dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKKyAgICB9LAorCisgICAgZ2VuZXJhdGU6IGZ1bmN0aW9u
IChuYW1lLCBwYXJhbXMpIHsKKyAgICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0sCisg
ICAgICAgICAgb3V0cHV0ID0gIiI7CisgICAgICBpZiAoIXJvdXRlKSB7CisgICAgICAgIHRocm93
IG5ldyBFcnJvcigiVGhlcmUgaXMgbm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOworICAgICAgfQor
CisgICAgICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zZWdtZW50czsKKworICAgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgdmFyIHNl
Z21lbnQgPSBzZWdtZW50c1tpXTsKKworICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVw
c2lsb25TZWdtZW50KSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAg
ICBvdXRwdXQgKz0gIi8iOworICAgICAgICBvdXRwdXQgKz0gc2VnbWVudC5nZW5lcmF0ZShwYXJh
bXMpOworICAgICAgfQorCisgICAgICBpZiAob3V0cHV0LmNoYXJBdCgwKSAhPT0gJy8nKSB7Cisg
ICAgICAgIG91dHB1dCA9ICcvJyArIG91dHB1dDsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFt
cyAmJiBwYXJhbXMucXVlcnlQYXJhbXMpIHsKKyAgICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJh
dGVRdWVyeVN0cmluZyhwYXJhbXMucXVlcnlQYXJhbXMsIHJvdXRlLmhhbmRsZXJzKTsKKyAgICAg
IH0KKworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9LAorCisgICAgZ2VuZXJhdGVRdWVyeVN0
cmluZzogZnVuY3Rpb24gKHBhcmFtcywgaGFuZGxlcnMpIHsKKyAgICAgIHZhciBwYWlycyA9IFtd
OworICAgICAgdmFyIGtleXMgPSBbXTsKKyAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHsK
KyAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAga2V5
cy5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGtleXMuc29ydCgpOworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAg
ICAgICAga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1zW2tleV07Cisg
ICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTsKKyAgICAgICAg
aWYgKGlzQXJyYXkodmFsdWUpKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGwgPSB2YWx1
ZS5sZW5ndGg7IGogPCBsOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBhcnJheVBhaXIgPSBrZXkg
KyAnW10nICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKTsKKyAgICAgICAgICAg
IHBhaXJzLnB1c2goYXJyYXlQYWlyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgcGFpciArPSAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworICAgICAg
ICAgIHBhaXJzLnB1c2gocGFpcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHBh
aXJzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisKKyAgICAg
IHJldHVybiAiPyIgKyBwYWlycy5qb2luKCImIik7CisgICAgfSwKKworICAgIHBhcnNlUXVlcnlT
dHJpbmc6IGZ1bmN0aW9uIChxdWVyeVN0cmluZykgeworICAgICAgdmFyIHBhaXJzID0gcXVlcnlT
dHJpbmcuc3BsaXQoIiYiKSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgcGFpciA9
IHBhaXJzW2ldLnNwbGl0KCc9JyksCisgICAgICAgICAgICBrZXkgPSBkZWNvZGVRdWVyeVBhcmFt
UGFydChwYWlyWzBdKSwKKyAgICAgICAgICAgIGtleUxlbmd0aCA9IGtleS5sZW5ndGgsCisgICAg
ICAgICAgICBpc0FycmF5ID0gZmFsc2UsCisgICAgICAgICAgICB2YWx1ZTsKKyAgICAgICAgaWYg
KHBhaXIubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgdmFsdWUgPSAndHJ1ZSc7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgLy9IYW5kbGUgYXJyYXlzCisgICAgICAgICAgaWYgKGtleUxl
bmd0aCA+IDIgJiYga2V5LnNsaWNlKGtleUxlbmd0aCAtIDIpID09PSAnW10nKSB7CisgICAgICAg
ICAgICBpc0FycmF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGtleSA9IGtleS5zbGljZSgwLCBrZXlM
ZW5ndGggLSAyKTsKKyAgICAgICAgICAgIGlmICghcXVlcnlQYXJhbXNba2V5XSkgeworICAgICAg
ICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gW107CisgICAgICAgICAgICB9CisgICAgICAgICAg
fQorICAgICAgICAgIHZhbHVlID0gcGFpclsxXSA/IGRlY29kZVF1ZXJ5UGFyYW1QYXJ0KHBhaXJb
MV0pIDogJyc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQXJyYXkpIHsKKyAgICAgICAgICBx
dWVyeVBhcmFtc1trZXldLnB1c2godmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0
dXJuIHF1ZXJ5UGFyYW1zOworICAgIH0sCisKKyAgICByZWNvZ25pemU6IGZ1bmN0aW9uIChwYXRo
KSB7CisgICAgICB2YXIgc3RhdGVzID0gW3RoaXMucm9vdFN0YXRlXSwKKyAgICAgICAgICBwYXRo
TGVuLAorICAgICAgICAgIGksCisgICAgICAgICAgbCwKKyAgICAgICAgICBxdWVyeVN0YXJ0LAor
ICAgICAgICAgIHF1ZXJ5UGFyYW1zID0ge30sCisgICAgICAgICAgaXNTbGFzaERyb3BwZWQgPSBm
YWxzZTsKKworICAgICAgcXVlcnlTdGFydCA9IHBhdGguaW5kZXhPZignPycpOworICAgICAgaWYg
KHF1ZXJ5U3RhcnQgIT09IC0xKSB7CisgICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHBhdGguc3Vi
c3RyKHF1ZXJ5U3RhcnQgKyAxLCBwYXRoLmxlbmd0aCk7CisgICAgICAgIHBhdGggPSBwYXRoLnN1
YnN0cigwLCBxdWVyeVN0YXJ0KTsKKyAgICAgICAgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlUXVl
cnlTdHJpbmcocXVlcnlTdHJpbmcpOworICAgICAgfQorCisgICAgICBwYXRoID0gZGVjb2RlVVJJ
KHBhdGgpOworCisgICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCisKKyAgICAgIGlmIChwYXRoLmNo
YXJBdCgwKSAhPT0gIi8iKSB7CisgICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOworICAgICAgfQor
CisgICAgICBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CisgICAgICBpZiAocGF0aExlbiA+IDEgJiYg
cGF0aC5jaGFyQXQocGF0aExlbiAtIDEpID09PSAiLyIpIHsKKyAgICAgICAgcGF0aCA9IHBhdGgu
c3Vic3RyKDAsIHBhdGhMZW4gLSAxKTsKKyAgICAgICAgaXNTbGFzaERyb3BwZWQgPSB0cnVlOwor
ICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKKyAgICAgICAgc3RhdGVzID0gcmVjb2duaXplQ2hhcihzdGF0ZXMsIHBhdGguY2hhckF0KGkp
KTsKKyAgICAgICAgaWYgKCFzdGF0ZXMubGVuZ3RoKSB7CisgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRU5EIERFQlVHIEdST1VQCisKKyAgICAgIHZhciBz
b2x1dGlvbnMgPSBbXTsKKyAgICAgIGZvciAoaSA9IDAsIGwgPSBzdGF0ZXMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICAgIGlmIChzdGF0ZXNbaV0uaGFuZGxlcnMpIHsKKyAgICAgICAgICBz
b2x1dGlvbnMucHVzaChzdGF0ZXNbaV0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0
YXRlcyA9IHNvcnRTb2x1dGlvbnMoc29sdXRpb25zKTsKKworICAgICAgdmFyIHN0YXRlID0gc29s
dXRpb25zWzBdOworCisgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKKyAgICAg
ICAgLy8gaWYgYSB0cmFpbGluZyBzbGFzaCB3YXMgZHJvcHBlZCBhbmQgYSBzdGFyIHNlZ21lbnQg
aXMgdGhlIGxhc3Qgc2VnbWVudAorICAgICAgICAvLyBzcGVjaWZpZWQsIHB1dCB0aGUgdHJhaWxp
bmcgc2xhc2ggYmFjaworICAgICAgICBpZiAoaXNTbGFzaERyb3BwZWQgJiYgc3RhdGUucmVnZXgu
c291cmNlLnNsaWNlKC01KSA9PT0gIiguKykkIikgeworICAgICAgICAgIHBhdGggPSBwYXRoICsg
Ii8iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5kSGFuZGxlcihzdGF0ZSwgcGF0aCwg
cXVlcnlQYXJhbXMpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBSb3V0ZVJlY29nbml6ZXIu
cHJvdG90eXBlLm1hcCA9IF9yb3V0ZVJlY29nbml6ZXJEc2wuZGVmYXVsdDsKKworICBSb3V0ZVJl
Y29nbml6ZXIuVkVSU0lPTiA9ICcwLjEuNSc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUm91dGVS
ZWNvZ25pemVyOworfSk7CitlbmlmZWQoInJvdXRlLXJlY29nbml6ZXIvZHNsIiwgWyJleHBvcnRz
Il0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBmdW5jdGlvbiBU
YXJnZXQocGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKKyAgICB0aGlzLnBhdGggPSBwYXRoOwor
ICAgIHRoaXMubWF0Y2hlciA9IG1hdGNoZXI7CisgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRl
OworICB9CisKKyAgVGFyZ2V0LnByb3RvdHlwZSA9IHsKKyAgICB0bzogZnVuY3Rpb24gKHRhcmdl
dCwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBkZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisKKyAg
ICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS53aWxsQWRkUm91dGUpIHsKKyAgICAgICAgdGFy
Z2V0ID0gZGVsZWdhdGUud2lsbEFkZFJvdXRlKHRoaXMubWF0Y2hlci50YXJnZXQsIHRhcmdldCk7
CisgICAgICB9CisKKyAgICAgIHRoaXMubWF0Y2hlci5hZGQodGhpcy5wYXRoLCB0YXJnZXQpOwor
CisgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0g
MCkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IG11c3QgaGF2ZSBhbiBhcmd1bWVu
dCBpbiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIGB0b2AiKTsKKyAgICAgICAgfQorICAgICAgICB0
aGlzLm1hdGNoZXIuYWRkQ2hpbGQodGhpcy5wYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCB0aGlzLmRl
bGVnYXRlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfTsKKworICBm
dW5jdGlvbiBNYXRjaGVyKHRhcmdldCkgeworICAgIHRoaXMucm91dGVzID0ge307CisgICAgdGhp
cy5jaGlsZHJlbiA9IHt9OworICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICB9CisKKyAgTWF0
Y2hlci5wcm90b3R5cGUgPSB7CisgICAgYWRkOiBmdW5jdGlvbiAocGF0aCwgaGFuZGxlcikgewor
ICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOworICAgIH0sCisKKyAgICBhZGRDaGls
ZDogZnVuY3Rpb24gKHBhdGgsIHRhcmdldCwgY2FsbGJhY2ssIGRlbGVnYXRlKSB7CisgICAgICB2
YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7CisgICAgICB0aGlzLmNoaWxkcmVuW3Bh
dGhdID0gbWF0Y2hlcjsKKworICAgICAgdmFyIG1hdGNoID0gZ2VuZXJhdGVNYXRjaChwYXRoLCBt
YXRjaGVyLCBkZWxlZ2F0ZSk7CisKKyAgICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5jb250
ZXh0RW50ZXJlZCkgeworICAgICAgICBkZWxlZ2F0ZS5jb250ZXh0RW50ZXJlZCh0YXJnZXQsIG1h
dGNoKTsKKyAgICAgIH0KKworICAgICAgY2FsbGJhY2sobWF0Y2gpOworICAgIH0KKyAgfTsKKwor
ICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUp
IHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKHBhdGgsIG5lc3RlZENhbGxiYWNrKSB7CisgICAgICB2
YXIgZnVsbFBhdGggPSBzdGFydGluZ1BhdGggKyBwYXRoOworCisgICAgICBpZiAobmVzdGVkQ2Fs
bGJhY2spIHsKKyAgICAgICAgbmVzdGVkQ2FsbGJhY2soZ2VuZXJhdGVNYXRjaChmdWxsUGF0aCwg
bWF0Y2hlciwgZGVsZWdhdGUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcg
VGFyZ2V0KHN0YXJ0aW5nUGF0aCArIHBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKTsKKyAgICAgIH0K
KyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYWRkUm91dGUocm91dGVBcnJheSwgcGF0aCwgaGFu
ZGxlcikgeworICAgIHZhciBsZW4gPSAwOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gcm91dGVB
cnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGxlbiArPSByb3V0ZUFycmF5W2ldLnBh
dGgubGVuZ3RoOworICAgIH0KKworICAgIHBhdGggPSBwYXRoLnN1YnN0cihsZW4pOworICAgIHZh
ciByb3V0ZSA9IHsgcGF0aDogcGF0aCwgaGFuZGxlcjogaGFuZGxlciB9OworICAgIHJvdXRlQXJy
YXkucHVzaChyb3V0ZSk7CisgIH0KKworICBmdW5jdGlvbiBlYWNoUm91dGUoYmFzZVJvdXRlLCBt
YXRjaGVyLCBjYWxsYmFjaywgYmluZGluZykgeworICAgIHZhciByb3V0ZXMgPSBtYXRjaGVyLnJv
dXRlczsKKworICAgIGZvciAodmFyIHBhdGggaW4gcm91dGVzKSB7CisgICAgICBpZiAocm91dGVz
Lmhhc093blByb3BlcnR5KHBhdGgpKSB7CisgICAgICAgIHZhciByb3V0ZUFycmF5ID0gYmFzZVJv
dXRlLnNsaWNlKCk7CisgICAgICAgIGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIHJvdXRlc1tw
YXRoXSk7CisKKyAgICAgICAgaWYgKG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0pIHsKKyAgICAgICAg
ICBlYWNoUm91dGUocm91dGVBcnJheSwgbWF0Y2hlci5jaGlsZHJlbltwYXRoXSwgY2FsbGJhY2ss
IGJpbmRpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmlu
ZGluZywgcm91dGVBcnJheSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBl
eHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFkZFJvdXRlQ2FsbGJhY2spIHsK
KyAgICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKCk7CisKKyAgICBjYWxsYmFjayhnZW5lcmF0
ZU1hdGNoKCIiLCBtYXRjaGVyLCB0aGlzLmRlbGVnYXRlKSk7CisKKyAgICBlYWNoUm91dGUoW10s
IG1hdGNoZXIsIGZ1bmN0aW9uIChyb3V0ZSkgeworICAgICAgaWYgKGFkZFJvdXRlQ2FsbGJhY2sp
IHsKKyAgICAgICAgYWRkUm91dGVDYWxsYmFjayh0aGlzLCByb3V0ZSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICB0aGlzLmFkZChyb3V0ZSk7CisgICAgICB9CisgICAgfSwgdGhpcyk7CisgIH07
Cit9KTsKK2VuaWZlZCgncm91dGVyJywgWydleHBvcnRzJywgJ3JvdXRlci9yb3V0ZXInXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJSb3V0ZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IF9yb3V0ZXJSb3V0ZXIuZGVmYXVsdDsKK30pOworZW5pZmVkKCdyb3V0
ZXIvaGFuZGxlci1pbmZvJywgWydleHBvcnRzJywgJ3JvdXRlci91dGlscycsICdyc3ZwL3Byb21p
c2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJVdGlscywgX3JzdnBQcm9taXNlKSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBIYW5kbGVySW5mbyhfcHJvcHMpIHsKKyAgICB2
YXIgcHJvcHMgPSBfcHJvcHMgfHwge307CisgICAgX3JvdXRlclV0aWxzLm1lcmdlKHRoaXMsIHBy
b3BzKTsKKyAgICB0aGlzLmluaXRpYWxpemUocHJvcHMpOworICB9CisKKyAgSGFuZGxlckluZm8u
cHJvdG90eXBlID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFuZGxlcjogbnVsbCwKKyAgICBw
YXJhbXM6IG51bGwsCisgICAgY29udGV4dDogbnVsbCwKKworICAgIC8vIEluamVjdGVkIGJ5IHRo
ZSBoYW5kbGVyIGluZm8gZmFjdG9yeS4KKyAgICBmYWN0b3J5OiBudWxsLAorCisgICAgaW5pdGlh
bGl6ZTogZnVuY3Rpb24gKCkge30sCisKKyAgICBsb2c6IGZ1bmN0aW9uIChwYXlsb2FkLCBtZXNz
YWdlKSB7CisgICAgICBpZiAocGF5bG9hZC5sb2cpIHsKKyAgICAgICAgcGF5bG9hZC5sb2codGhp
cy5uYW1lICsgJzogJyArIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0sCisKKyAgICBwcm9taXNl
TGFiZWw6IGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgcmV0dXJuIF9yb3V0ZXJVdGlscy5wcm9t
aXNlTGFiZWwoIiciICsgdGhpcy5uYW1lICsgIicgIiArIGxhYmVsKTsKKyAgICB9LAorCisgICAg
Z2V0VW5yZXNvbHZlZDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwK
KworICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMucGFyYW1z
IHx8IHt9OworICAgIH0sCisKKyAgICByZXNvbHZlOiBmdW5jdGlvbiAoc2hvdWxkQ29udGludWUs
IHBheWxvYWQpIHsKKyAgICAgIHZhciBjaGVja0ZvckFib3J0ID0gX3JvdXRlclV0aWxzLmJpbmQo
dGhpcywgdGhpcy5jaGVja0ZvckFib3J0LCBzaG91bGRDb250aW51ZSksCisgICAgICAgICAgYmVm
b3JlTW9kZWwgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0aGlzLnJ1bkJlZm9yZU1vZGVsSG9v
aywgcGF5bG9hZCksCisgICAgICAgICAgbW9kZWwgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0
aGlzLmdldE1vZGVsLCBwYXlsb2FkKSwKKyAgICAgICAgICBhZnRlck1vZGVsID0gX3JvdXRlclV0
aWxzLmJpbmQodGhpcywgdGhpcy5ydW5BZnRlck1vZGVsSG9vaywgcGF5bG9hZCksCisgICAgICAg
ICAgYmVjb21lUmVzb2x2ZWQgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0aGlzLmJlY29tZVJl
c29sdmVkLCBwYXlsb2FkKTsKKworICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJl
c29sdmUodW5kZWZpbmVkLCB0aGlzLnByb21pc2VMYWJlbCgiU3RhcnQgaGFuZGxlciIpKS50aGVu
KGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBmb3IgYWJvcnQi
KSkudGhlbihiZWZvcmVNb2RlbCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkJlZm9yZSBtb2Rl
bCIpKS50aGVuKGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBp
ZiBhYm9ydGVkIGR1cmluZyAnYmVmb3JlTW9kZWwnIGhvb2siKSkudGhlbihtb2RlbCwgbnVsbCwg
dGhpcy5wcm9taXNlTGFiZWwoIk1vZGVsIikpLnRoZW4oY2hlY2tGb3JBYm9ydCwgbnVsbCwgdGhp
cy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQgaW4gJ21vZGVsJyBob29rIikpLnRoZW4o
YWZ0ZXJNb2RlbCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkFmdGVyIG1vZGVsIikpLnRoZW4o
Y2hlY2tGb3JBYm9ydCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQg
aW4gJ2FmdGVyTW9kZWwnIGhvb2siKSkudGhlbihiZWNvbWVSZXNvbHZlZCwgbnVsbCwgdGhpcy5w
cm9taXNlTGFiZWwoIkJlY29tZSByZXNvbHZlZCIpKTsKKyAgICB9LAorCisgICAgcnVuQmVmb3Jl
TW9kZWxIb29rOiBmdW5jdGlvbiAocGF5bG9hZCkgeworICAgICAgaWYgKHBheWxvYWQudHJpZ2dl
cikgeworICAgICAgICBwYXlsb2FkLnRyaWdnZXIodHJ1ZSwgJ3dpbGxSZXNvbHZlTW9kZWwnLCBw
YXlsb2FkLCB0aGlzLmhhbmRsZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMucnVuU2hh
cmVkTW9kZWxIb29rKHBheWxvYWQsICdiZWZvcmVNb2RlbCcsIFtdKTsKKyAgICB9LAorCisgICAg
cnVuQWZ0ZXJNb2RlbEhvb2s6IGZ1bmN0aW9uIChwYXlsb2FkLCByZXNvbHZlZE1vZGVsKSB7Cisg
ICAgICAvLyBTdGFzaCB0aGUgcmVzb2x2ZWQgbW9kZWwgb24gdGhlIHBheWxvYWQuCisgICAgICAv
LyBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycyB0byBzd2FwIG91dAorICAgICAgLy8g
dGhlIHJlc29sdmVkIG1vZGVsIGluIGFmdGVyTW9kZWwuCisgICAgICB2YXIgbmFtZSA9IHRoaXMu
bmFtZTsKKyAgICAgIHRoaXMuc3Rhc2hSZXNvbHZlZE1vZGVsKHBheWxvYWQsIHJlc29sdmVkTW9k
ZWwpOworCisgICAgICByZXR1cm4gdGhpcy5ydW5TaGFyZWRNb2RlbEhvb2socGF5bG9hZCwgJ2Fm
dGVyTW9kZWwnLCBbcmVzb2x2ZWRNb2RlbF0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAv
LyBJZ25vcmUgdGhlIGZ1bGZpbGxlZCB2YWx1ZSByZXR1cm5lZCBmcm9tIGFmdGVyTW9kZWwuCisg
ICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgc3Rhc2hlZCBpbiByZXNvbHZlZE1vZGVscywgd2hp
Y2gKKyAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIHN3YXBwZWQgb3V0IGluIGFmdGVyTW9kZWwu
CisgICAgICAgIHJldHVybiBwYXlsb2FkLnJlc29sdmVkTW9kZWxzW25hbWVdOworICAgICAgfSwg
bnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgcmV0
dXJuIG1vZGVsIHZhbHVlIikpOworICAgIH0sCisKKyAgICBydW5TaGFyZWRNb2RlbEhvb2s6IGZ1
bmN0aW9uIChwYXlsb2FkLCBob29rTmFtZSwgYXJncykgeworICAgICAgdGhpcy5sb2cocGF5bG9h
ZCwgImNhbGxpbmcgIiArIGhvb2tOYW1lICsgIiBob29rIik7CisKKyAgICAgIGlmICh0aGlzLnF1
ZXJ5UGFyYW1zKSB7CisgICAgICAgIGFyZ3MucHVzaCh0aGlzLnF1ZXJ5UGFyYW1zKTsKKyAgICAg
IH0KKyAgICAgIGFyZ3MucHVzaChwYXlsb2FkKTsKKworICAgICAgdmFyIHJlc3VsdCA9IF9yb3V0
ZXJVdGlscy5hcHBseUhvb2sodGhpcy5oYW5kbGVyLCBob29rTmFtZSwgYXJncyk7CisKKyAgICAg
IGlmIChyZXN1bHQgJiYgcmVzdWx0LmlzVHJhbnNpdGlvbikgeworICAgICAgICByZXN1bHQgPSBu
dWxsOworICAgICAgfQorCisgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2
ZShyZXN1bHQsIHRoaXMucHJvbWlzZUxhYmVsKCJSZXNvbHZlIHZhbHVlIHJldHVybmVkIGZyb20g
b25lIG9mIHRoZSBtb2RlbCBob29rcyIpKTsKKyAgICB9LAorCisgICAgLy8gb3ZlcnJpZGRlbiBi
eSBzdWJjbGFzc2VzCisgICAgZ2V0TW9kZWw6IG51bGwsCisKKyAgICBjaGVja0ZvckFib3J0OiBm
dW5jdGlvbiAoc2hvdWxkQ29udGludWUsIHByb21pc2VWYWx1ZSkgeworICAgICAgcmV0dXJuIF9y
c3ZwUHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoc2hvdWxkQ29udGludWUoKSwgdGhpcy5wcm9taXNl
TGFiZWwoIkNoZWNrIGZvciBhYm9ydCIpKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgLy8g
V2UgZG9uJ3QgY2FyZSBhYm91dCBzaG91bGRDb250aW51ZSdzIHJlc29sdmUgdmFsdWU7CisgICAg
ICAgIC8vIHBhc3MgYWxvbmcgdGhlIG9yaWdpbmFsIHZhbHVlIHBhc3NlZCB0byB0aGlzIGZuLgor
ICAgICAgICByZXR1cm4gcHJvbWlzZVZhbHVlOworICAgICAgfSwgbnVsbCwgdGhpcy5wcm9taXNl
TGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgY29udGludWUiKSk7CisgICAgfSwK
KworICAgIHN0YXNoUmVzb2x2ZWRNb2RlbDogZnVuY3Rpb24gKHBheWxvYWQsIHJlc29sdmVkTW9k
ZWwpIHsKKyAgICAgIHBheWxvYWQucmVzb2x2ZWRNb2RlbHMgPSBwYXlsb2FkLnJlc29sdmVkTW9k
ZWxzIHx8IHt9OworICAgICAgcGF5bG9hZC5yZXNvbHZlZE1vZGVsc1t0aGlzLm5hbWVdID0gcmVz
b2x2ZWRNb2RlbDsKKyAgICB9LAorCisgICAgYmVjb21lUmVzb2x2ZWQ6IGZ1bmN0aW9uIChwYXls
b2FkLCByZXNvbHZlZENvbnRleHQpIHsKKyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnNlcmlhbGl6
ZShyZXNvbHZlZENvbnRleHQpOworCisgICAgICBpZiAocGF5bG9hZCkgeworICAgICAgICB0aGlz
LnN0YXNoUmVzb2x2ZWRNb2RlbChwYXlsb2FkLCByZXNvbHZlZENvbnRleHQpOworICAgICAgICBw
YXlsb2FkLnBhcmFtcyA9IHBheWxvYWQucGFyYW1zIHx8IHt9OworICAgICAgICBwYXlsb2FkLnBh
cmFtc1t0aGlzLm5hbWVdID0gcGFyYW1zOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5m
YWN0b3J5KCdyZXNvbHZlZCcsIHsKKyAgICAgICAgY29udGV4dDogcmVzb2x2ZWRDb250ZXh0LAor
ICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCisgICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlciwK
KyAgICAgICAgcGFyYW1zOiBwYXJhbXMKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBzaG91bGRT
dXBlcmNlZGU6IGZ1bmN0aW9uIChvdGhlcikgeworICAgICAgLy8gUHJlZmVyIHRoaXMgbmV3ZXIg
aGFuZGxlckluZm8gb3ZlciBgb3RoZXJgIGlmOgorICAgICAgLy8gMSkgVGhlIG90aGVyIG9uZSBk
b2Vzbid0IGV4aXN0CisgICAgICAvLyAyKSBUaGUgbmFtZXMgZG9uJ3QgbWF0Y2gKKyAgICAgIC8v
IDMpIFRoaXMgaGFuZGxlciBoYXMgYSBjb250ZXh0IHRoYXQgZG9lc24ndCBtYXRjaAorICAgICAg
Ly8gICAgdGhlIG90aGVyIG9uZSAob3IgdGhlIG90aGVyIG9uZSBkb2Vzbid0IGhhdmUgb25lKS4K
KyAgICAgIC8vIDQpIFRoaXMgaGFuZGxlciBoYXMgcGFyYW1ldGVycyB0aGF0IGRvbid0IG1hdGNo
IHRoZSBvdGhlci4KKyAgICAgIGlmICghb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICB9CisKKyAgICAgIHZhciBjb250ZXh0c01hdGNoID0gb3RoZXIuY29udGV4dCA9PT0gdGhp
cy5jb250ZXh0OworICAgICAgcmV0dXJuIG90aGVyLm5hbWUgIT09IHRoaXMubmFtZSB8fCB0aGlz
Lmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgIWNvbnRleHRzTWF0Y2ggfHwgdGhpcy5oYXNP
d25Qcm9wZXJ0eSgncGFyYW1zJykgJiYgIXBhcmFtc01hdGNoKHRoaXMucGFyYW1zLCBvdGhlci5w
YXJhbXMpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBwYXJhbXNNYXRjaChhLCBiKSB7Cisg
ICAgaWYgKCFhIF4gIWIpIHsKKyAgICAgIC8vIE9ubHkgb25lIGlzIG51bGwuCisgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFhKSB7CisgICAgICAvLyBCb3RoIG11c3QgYmUg
bnVsbC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE5vdGU6IHRoaXMgYXNz
dW1lcyB0aGF0IGJvdGggcGFyYW1zIGhhdmUgdGhlIHNhbWUKKyAgICAvLyBudW1iZXIgb2Yga2V5
cywgYnV0IHNpbmNlIHdlJ3JlIGNvbXBhcmluZyB0aGUKKyAgICAvLyBzYW1lIGhhbmRsZXJzLCB0
aGV5IHNob3VsZC4KKyAgICBmb3IgKHZhciBrIGluIGEpIHsKKyAgICAgIGlmIChhLmhhc093blBy
b3BlcnR5KGspICYmIGFba10gIT09IGJba10pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9
IEhhbmRsZXJJbmZvOworfSk7CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScs
IFsnZXhwb3J0cycsICdyb3V0ZXIvaGFuZGxlci1pbmZvL3Jlc29sdmVkLWhhbmRsZXItaW5mbycs
ICdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQtaGFuZGxlci1pbmZvLWJ5LW9iamVjdCcs
ICdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQtaGFuZGxlci1pbmZvLWJ5LXBhcmFtJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfcm91dGVySGFuZGxlckluZm9SZXNvbHZlZEhhbmRsZXJJbmZv
LCBfcm91dGVySGFuZGxlckluZm9VbnJlc29sdmVkSGFuZGxlckluZm9CeU9iamVjdCwgX3JvdXRl
ckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJhbSkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgaGFuZGxlckluZm9GYWN0b3J5LmtsYXNzZXMgPSB7CisgICAgcmVzb2x2ZWQ6IF9y
b3V0ZXJIYW5kbGVySW5mb1Jlc29sdmVkSGFuZGxlckluZm8uZGVmYXVsdCwKKyAgICBwYXJhbTog
X3JvdXRlckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJhbS5kZWZhdWx0LAor
ICAgIG9iamVjdDogX3JvdXRlckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlPYmpl
Y3QuZGVmYXVsdAorICB9OworCisgIGZ1bmN0aW9uIGhhbmRsZXJJbmZvRmFjdG9yeShuYW1lLCBw
cm9wcykgeworICAgIHZhciBDdG9yID0gaGFuZGxlckluZm9GYWN0b3J5LmtsYXNzZXNbbmFtZV0s
CisgICAgICAgIGhhbmRsZXJJbmZvID0gbmV3IEN0b3IocHJvcHMgfHwge30pOworICAgIGhhbmRs
ZXJJbmZvLmZhY3RvcnkgPSBoYW5kbGVySW5mb0ZhY3Rvcnk7CisgICAgcmV0dXJuIGhhbmRsZXJJ
bmZvOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaGFuZGxlckluZm9GYWN0b3J5OworfSk7
CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vcmVzb2x2ZWQtaGFuZGxlci1pbmZvJywgWydl
eHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91dGVyL3V0aWxzJywgJ3JzdnAvcHJv
bWlzZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlckhhbmRsZXJJbmZvLCBfcm91dGVyVXRp
bHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFJlc29sdmVkSGFu
ZGxlckluZm8gPSBfcm91dGVyVXRpbHMuc3ViY2xhc3MoX3JvdXRlckhhbmRsZXJJbmZvLmRlZmF1
bHQsIHsKKyAgICByZXNvbHZlOiBmdW5jdGlvbiAoc2hvdWxkQ29udGludWUsIHBheWxvYWQpIHsK
KyAgICAgIC8vIEEgUmVzb2x2ZWRIYW5kbGVySW5mbyBqdXN0IHJlc29sdmVkIHdpdGggaXRzZWxm
LgorICAgICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5yZXNvbHZlZE1vZGVscykgeworICAgICAg
ICBwYXlsb2FkLnJlc29sdmVkTW9kZWxzW3RoaXMubmFtZV0gPSB0aGlzLmNvbnRleHQ7CisgICAg
ICB9CisgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0aGlzLCB0aGlz
LnByb21pc2VMYWJlbCgiUmVzb2x2ZSIpKTsKKyAgICB9LAorCisgICAgZ2V0VW5yZXNvbHZlZDog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeSgncGFyYW0nLCB7CisgICAg
ICAgIG5hbWU6IHRoaXMubmFtZSwKKyAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLAorICAg
ICAgICBwYXJhbXM6IHRoaXMucGFyYW1zCisgICAgICB9KTsKKyAgICB9LAorCisgICAgaXNSZXNv
bHZlZDogdHJ1ZQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBSZXNvbHZlZEhhbmRsZXJJ
bmZvOworfSk7CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vdW5yZXNvbHZlZC1oYW5kbGVy
LWluZm8tYnktb2JqZWN0JywgWydleHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91
dGVyL3V0aWxzJywgJ3JzdnAvcHJvbWlzZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlckhh
bmRsZXJJbmZvLCBfcm91dGVyVXRpbHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0cmljdCc7
CisKKyAgdmFyIFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5T2JqZWN0ID0gX3JvdXRlclV0aWxzLnN1
YmNsYXNzKF9yb3V0ZXJIYW5kbGVySW5mby5kZWZhdWx0LCB7CisgICAgZ2V0TW9kZWw6IGZ1bmN0
aW9uIChwYXlsb2FkKSB7CisgICAgICB0aGlzLmxvZyhwYXlsb2FkLCB0aGlzLm5hbWUgKyAiOiBy
ZXNvbHZpbmcgcHJvdmlkZWQgbW9kZWwiKTsKKyAgICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVm
YXVsdC5yZXNvbHZlKHRoaXMuY29udGV4dCk7CisgICAgfSwKKworICAgIGluaXRpYWxpemU6IGZ1
bmN0aW9uIChwcm9wcykgeworICAgICAgdGhpcy5uYW1lcyA9IHByb3BzLm5hbWVzIHx8IFtdOwor
ICAgICAgdGhpcy5jb250ZXh0ID0gcHJvcHMuY29udGV4dDsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFNlcmlhbGl6ZXMgYSBoYW5kbGVyIHVzaW5nIGl0cyBjdXN0
b20gYHNlcmlhbGl6ZWAgbWV0aG9kIG9yCisgICAgICBieSBhIGRlZmF1bHQgdGhhdCBsb29rcyB1
cCB0aGUgZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSBmcm9tCisgICAgICB0aGUgZHluYW1pYyBzZWdt
ZW50LgorICAgICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgbW9kZWwgdG8gYmUgc2VyaWFs
aXplZCBmb3IgdGhpcyBoYW5kbGVyCisgICAgKi8KKyAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIChf
bW9kZWwpIHsKKyAgICAgIHZhciBtb2RlbCA9IF9tb2RlbCB8fCB0aGlzLmNvbnRleHQsCisgICAg
ICAgICAgbmFtZXMgPSB0aGlzLm5hbWVzLAorICAgICAgICAgIGhhbmRsZXIgPSB0aGlzLmhhbmRs
ZXI7CisKKyAgICAgIHZhciBvYmplY3QgPSB7fTsKKyAgICAgIGlmIChfcm91dGVyVXRpbHMuaXNQ
YXJhbShtb2RlbCkpIHsKKyAgICAgICAgb2JqZWN0W25hbWVzWzBdXSA9IG1vZGVsOworICAgICAg
ICByZXR1cm4gb2JqZWN0OworICAgICAgfQorCisgICAgICAvLyBVc2UgY3VzdG9tIHNlcmlhbGl6
ZSBpZiBpdCBleGlzdHMuCisgICAgICBpZiAoaGFuZGxlci5zZXJpYWxpemUpIHsKKyAgICAgICAg
cmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKG1vZGVsLCBuYW1lcyk7CisgICAgICB9CisKKyAgICAg
IGlmIChuYW1lcy5sZW5ndGggIT09IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisg
ICAgICB2YXIgbmFtZSA9IG5hbWVzWzBdOworCisgICAgICBpZiAoL19pZCQvLnRlc3QobmFtZSkp
IHsKKyAgICAgICAgb2JqZWN0W25hbWVdID0gbW9kZWwuaWQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBvYmplY3RbbmFtZV0gPSBtb2RlbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvYmplY3Q7
CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBVbnJlc29sdmVkSGFuZGxlcklu
Zm9CeU9iamVjdDsKK30pOworZW5pZmVkKCdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQt
aGFuZGxlci1pbmZvLWJ5LXBhcmFtJywgWydleHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8n
LCAncm91dGVyL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcm91dGVySGFuZGxlckluZm8s
IF9yb3V0ZXJVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gR2VuZXJhdGVkIGJ5IFVS
TCB0cmFuc2l0aW9ucyBhbmQgbm9uLWR5bmFtaWMgcm91dGUgc2VnbWVudHMgaW4gbmFtZWQgVHJh
bnNpdGlvbnMuCisgIHZhciBVbnJlc29sdmVkSGFuZGxlckluZm9CeVBhcmFtID0gX3JvdXRlclV0
aWxzLnN1YmNsYXNzKF9yb3V0ZXJIYW5kbGVySW5mby5kZWZhdWx0LCB7CisgICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24gKHByb3BzKSB7CisgICAgICB0aGlzLnBhcmFtcyA9IHByb3BzLnBhcmFtcyB8
fCB7fTsKKyAgICB9LAorCisgICAgZ2V0TW9kZWw6IGZ1bmN0aW9uIChwYXlsb2FkKSB7CisgICAg
ICB2YXIgZnVsbFBhcmFtcyA9IHRoaXMucGFyYW1zOworICAgICAgaWYgKHBheWxvYWQgJiYgcGF5
bG9hZC5xdWVyeVBhcmFtcykgeworICAgICAgICBmdWxsUGFyYW1zID0ge307CisgICAgICAgIF9y
b3V0ZXJVdGlscy5tZXJnZShmdWxsUGFyYW1zLCB0aGlzLnBhcmFtcyk7CisgICAgICAgIGZ1bGxQ
YXJhbXMucXVlcnlQYXJhbXMgPSBwYXlsb2FkLnF1ZXJ5UGFyYW1zOworICAgICAgfQorCisgICAg
ICB2YXIgaGFuZGxlciA9IHRoaXMuaGFuZGxlcjsKKyAgICAgIHZhciBob29rTmFtZSA9IF9yb3V0
ZXJVdGlscy5yZXNvbHZlSG9vayhoYW5kbGVyLCAnZGVzZXJpYWxpemUnKSB8fCBfcm91dGVyVXRp
bHMucmVzb2x2ZUhvb2soaGFuZGxlciwgJ21vZGVsJyk7CisKKyAgICAgIHJldHVybiB0aGlzLnJ1
blNoYXJlZE1vZGVsSG9vayhwYXlsb2FkLCBob29rTmFtZSwgW2Z1bGxQYXJhbXNdKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFy
YW07Cit9KTsKK2VuaWZlZCgncm91dGVyL3JvdXRlcicsIFsnZXhwb3J0cycsICdyb3V0ZS1yZWNv
Z25pemVyJywgJ3JzdnAvcHJvbWlzZScsICdyb3V0ZXIvdXRpbHMnLCAncm91dGVyL3RyYW5zaXRp
b24tc3RhdGUnLCAncm91dGVyL3RyYW5zaXRpb24nLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50
L25hbWVkLXRyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFuc2l0aW9uLWludGVudC91cmwt
dHJhbnNpdGlvbi1pbnRlbnQnLCAncm91dGVyL2hhbmRsZXItaW5mbyddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX3JvdXRlUmVjb2duaXplciwgX3JzdnBQcm9taXNlLCBfcm91dGVyVXRpbHMsIF9yb3V0
ZXJUcmFuc2l0aW9uU3RhdGUsIF9yb3V0ZXJUcmFuc2l0aW9uLCBfcm91dGVyVHJhbnNpdGlvbklu
dGVudE5hbWVkVHJhbnNpdGlvbkludGVudCwgX3JvdXRlclRyYW5zaXRpb25JbnRlbnRVcmxUcmFu
c2l0aW9uSW50ZW50LCBfcm91dGVySGFuZGxlckluZm8pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBwb3AgPSBBcnJheS5wcm90b3R5cGUucG9wOworCisgIGZ1bmN0aW9uIFJvdXRlcihfb3B0
aW9ucykgeworICAgIHZhciBvcHRpb25zID0gX29wdGlvbnMgfHwge307CisgICAgdGhpcy5nZXRI
YW5kbGVyID0gb3B0aW9ucy5nZXRIYW5kbGVyIHx8IHRoaXMuZ2V0SGFuZGxlcjsKKyAgICB0aGlz
LnVwZGF0ZVVSTCA9IG9wdGlvbnMudXBkYXRlVVJMIHx8IHRoaXMudXBkYXRlVVJMOworICAgIHRo
aXMucmVwbGFjZVVSTCA9IG9wdGlvbnMucmVwbGFjZVVSTCB8fCB0aGlzLnJlcGxhY2VVUkw7Cisg
ICAgdGhpcy5kaWRUcmFuc2l0aW9uID0gb3B0aW9ucy5kaWRUcmFuc2l0aW9uIHx8IHRoaXMuZGlk
VHJhbnNpdGlvbjsKKyAgICB0aGlzLndpbGxUcmFuc2l0aW9uID0gb3B0aW9ucy53aWxsVHJhbnNp
dGlvbiB8fCB0aGlzLndpbGxUcmFuc2l0aW9uOworICAgIHRoaXMuZGVsZWdhdGUgPSBvcHRpb25z
LmRlbGVnYXRlIHx8IHRoaXMuZGVsZWdhdGU7CisgICAgdGhpcy50cmlnZ2VyRXZlbnQgPSBvcHRp
b25zLnRyaWdnZXJFdmVudCB8fCB0aGlzLnRyaWdnZXJFdmVudDsKKyAgICB0aGlzLmxvZyA9IG9w
dGlvbnMubG9nIHx8IHRoaXMubG9nOworCisgICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IF9yb3V0
ZVJlY29nbml6ZXIuZGVmYXVsdCgpOworICAgIHRoaXMucmVzZXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGdldFRyYW5zaXRpb25CeUludGVudChpbnRlbnQsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAg
dmFyIHdhc1RyYW5zaXRpb25pbmcgPSAhIXRoaXMuYWN0aXZlVHJhbnNpdGlvbjsKKyAgICB2YXIg
b2xkU3RhdGUgPSB3YXNUcmFuc2l0aW9uaW5nID8gdGhpcy5hY3RpdmVUcmFuc2l0aW9uLnN0YXRl
IDogdGhpcy5zdGF0ZTsKKyAgICB2YXIgbmV3VHJhbnNpdGlvbjsKKworICAgIHZhciBuZXdTdGF0
ZSA9IGludGVudC5hcHBseVRvU3RhdGUob2xkU3RhdGUsIHRoaXMucmVjb2duaXplciwgdGhpcy5n
ZXRIYW5kbGVyLCBpc0ludGVybWVkaWF0ZSk7CisgICAgdmFyIHF1ZXJ5UGFyYW1DaGFuZ2VsaXN0
ID0gX3JvdXRlclV0aWxzLmdldENoYW5nZWxpc3Qob2xkU3RhdGUucXVlcnlQYXJhbXMsIG5ld1N0
YXRlLnF1ZXJ5UGFyYW1zKTsKKworICAgIGlmIChoYW5kbGVySW5mb3NFcXVhbChuZXdTdGF0ZS5o
YW5kbGVySW5mb3MsIG9sZFN0YXRlLmhhbmRsZXJJbmZvcykpIHsKKworICAgICAgLy8gVGhpcyBp
cyBhIG5vLW9wIHRyYW5zaXRpb24uIFNlZSBpZiBxdWVyeSBwYXJhbXMgY2hhbmdlZC4KKyAgICAg
IGlmIChxdWVyeVBhcmFtQ2hhbmdlbGlzdCkgeworICAgICAgICBuZXdUcmFuc2l0aW9uID0gdGhp
cy5xdWVyeVBhcmFtc1RyYW5zaXRpb24ocXVlcnlQYXJhbUNoYW5nZWxpc3QsIHdhc1RyYW5zaXRp
b25pbmcsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7CisgICAgICAgIGlmIChuZXdUcmFuc2l0aW9uKSB7
CisgICAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgIH0KKwor
ICAgICAgLy8gTm8tb3AuIE5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHRyYW5zaXRpb24uCisgICAg
ICByZXR1cm4gdGhpcy5hY3RpdmVUcmFuc2l0aW9uIHx8IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5U
cmFuc2l0aW9uKHRoaXMpOworICAgIH0KKworICAgIGlmIChpc0ludGVybWVkaWF0ZSkgeworICAg
ICAgc2V0dXBDb250ZXh0cyh0aGlzLCBuZXdTdGF0ZSk7CisgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQ3JlYXRlIGEgbmV3IHRyYW5zaXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uIHJvdXRl
LgorICAgIG5ld1RyYW5zaXRpb24gPSBuZXcgX3JvdXRlclRyYW5zaXRpb24uVHJhbnNpdGlvbih0
aGlzLCBpbnRlbnQsIG5ld1N0YXRlKTsKKworICAgIC8vIEFib3J0IGFuZCB1c3VycCBhbnkgcHJl
dmlvdXNseSBhY3RpdmUgdHJhbnNpdGlvbi4KKyAgICBpZiAodGhpcy5hY3RpdmVUcmFuc2l0aW9u
KSB7CisgICAgICB0aGlzLmFjdGl2ZVRyYW5zaXRpb24uYWJvcnQoKTsKKyAgICB9CisgICAgdGhp
cy5hY3RpdmVUcmFuc2l0aW9uID0gbmV3VHJhbnNpdGlvbjsKKworICAgIC8vIFRyYW5zaXRpb24g
cHJvbWlzZXMgYnkgZGVmYXVsdCByZXNvbHZlIHdpdGggcmVzb2x2ZWQgc3RhdGUuCisgICAgLy8g
Rm9yIG91ciBwdXJwb3Nlcywgc3dhcCBvdXQgdGhlIHByb21pc2UgdG8gcmVzb2x2ZQorICAgIC8v
IGFmdGVyIHRoZSB0cmFuc2l0aW9uIGhhcyBiZWVuIGZpbmFsaXplZC4KKyAgICBuZXdUcmFuc2l0
aW9uLnByb21pc2UgPSBuZXdUcmFuc2l0aW9uLnByb21pc2UudGhlbihmdW5jdGlvbiAocmVzdWx0
KSB7CisgICAgICByZXR1cm4gZmluYWxpemVUcmFuc2l0aW9uKG5ld1RyYW5zaXRpb24sIHJlc3Vs
dC5zdGF0ZSk7CisgICAgfSwgbnVsbCwgX3JvdXRlclV0aWxzLnByb21pc2VMYWJlbCgiU2V0dGxl
IHRyYW5zaXRpb24gcHJvbWlzZSB3aGVuIHRyYW5zaXRpb24gaXMgZmluYWxpemVkIikpOworCisg
ICAgaWYgKCF3YXNUcmFuc2l0aW9uaW5nKSB7CisgICAgICBub3RpZnlFeGlzdGluZ0hhbmRsZXJz
KHRoaXMsIG5ld1N0YXRlLCBuZXdUcmFuc2l0aW9uKTsKKyAgICB9CisKKyAgICBmaXJlUXVlcnlQ
YXJhbURpZENoYW5nZSh0aGlzLCBuZXdTdGF0ZSwgcXVlcnlQYXJhbUNoYW5nZWxpc3QpOworCisg
ICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgIH0KKworICBSb3V0ZXIucHJvdG90eXBlID0gewor
CisgICAgLyoqCisgICAgICBUaGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSByb3V0ZXIuIFRo
ZSBBUEkgaXMgZXNzZW50aWFsbHkKKyAgICAgIHRoZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2Qg
aW4gYHJvdXRlLXJlY29nbml6ZXJgLgorICAgICAgIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBT
dHJpbmcgaGFuZGxlciBhdCB0aGUgbGFzdCBgLnRvKClgCisgICAgICBjYWxsIGFuZCB1c2VzIGl0
IGFzIHRoZSBuYW1lIG9mIHRoZSB3aG9sZSByb3V0ZS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBjYWxsYmFjaworICAgICovCisgICAgbWFwOiBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAg
IHRoaXMucmVjb2duaXplci5kZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisKKyAgICAgIHRoaXMu
cmVjb2duaXplci5tYXAoY2FsbGJhY2ssIGZ1bmN0aW9uIChyZWNvZ25pemVyLCByb3V0ZXMpIHsK
KyAgICAgICAgZm9yICh2YXIgaSA9IHJvdXRlcy5sZW5ndGggLSAxLCBwcm9jZWVkID0gdHJ1ZTsg
aSA+PSAwICYmIHByb2NlZWQ7IC0taSkgeworICAgICAgICAgIHZhciByb3V0ZSA9IHJvdXRlc1tp
XTsKKyAgICAgICAgICByZWNvZ25pemVyLmFkZChyb3V0ZXMsIHsgYXM6IHJvdXRlLmhhbmRsZXIg
fSk7CisgICAgICAgICAgcHJvY2VlZCA9IHJvdXRlLnBhdGggPT09ICcvJyB8fCByb3V0ZS5wYXRo
ID09PSAnJyB8fCByb3V0ZS5oYW5kbGVyLnNsaWNlKC02KSA9PT0gJy5pbmRleCc7CisgICAgICAg
IH0KKyAgICAgIH0pOworICAgIH0sCisKKyAgICBoYXNSb3V0ZTogZnVuY3Rpb24gKHJvdXRlKSB7
CisgICAgICByZXR1cm4gdGhpcy5yZWNvZ25pemVyLmhhc1JvdXRlKHJvdXRlKTsKKyAgICB9LAor
CisgICAgZ2V0SGFuZGxlcjogZnVuY3Rpb24gKCkge30sCisKKyAgICBxdWVyeVBhcmFtc1RyYW5z
aXRpb246IGZ1bmN0aW9uIChjaGFuZ2VsaXN0LCB3YXNUcmFuc2l0aW9uaW5nLCBvbGRTdGF0ZSwg
bmV3U3RhdGUpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzOworCisgICAgICBmaXJlUXVlcnlQ
YXJhbURpZENoYW5nZSh0aGlzLCBuZXdTdGF0ZSwgY2hhbmdlbGlzdCk7CisKKyAgICAgIGlmICgh
d2FzVHJhbnNpdGlvbmluZyAmJiB0aGlzLmFjdGl2ZVRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8g
T25lIG9mIHRoZSBoYW5kbGVycyBpbiBxdWVyeVBhcmFtc0RpZENoYW5nZQorICAgICAgICAvLyBj
YXVzZWQgYSB0cmFuc2l0aW9uLiBKdXN0IHJldHVybiB0aGF0IHRyYW5zaXRpb24uCisgICAgICAg
IHJldHVybiB0aGlzLmFjdGl2ZVRyYW5zaXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICAv
LyBSdW5uaW5nIHF1ZXJ5UGFyYW1zRGlkQ2hhbmdlIGRpZG4ndCBjaGFuZ2UgYW55dGhpbmcuCisg
ICAgICAgIC8vIEp1c3QgdXBkYXRlIHF1ZXJ5IHBhcmFtcyBhbmQgYmUgb24gb3VyIHdheS4KKwor
ICAgICAgICAvLyBXZSBoYXZlIHRvIHJldHVybiBhIG5vb3AgdHJhbnNpdGlvbiB0aGF0IHdpbGwK
KyAgICAgICAgLy8gcGVyZm9ybSBhIFVSTCB1cGRhdGUgYXQgdGhlIGVuZC4gVGhpcyBnaXZlcwor
ICAgICAgICAvLyB0aGUgdXNlciB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIHVybCB1cGRhdGUKKyAg
ICAgICAgLy8gbWV0aG9kIChkZWZhdWx0IGlzIHJlcGxhY2VTdGF0ZSkuCisgICAgICAgIHZhciBu
ZXdUcmFuc2l0aW9uID0gbmV3IF9yb3V0ZXJUcmFuc2l0aW9uLlRyYW5zaXRpb24odGhpcyk7Cisg
ICAgICAgIG5ld1RyYW5zaXRpb24ucXVlcnlQYXJhbXNPbmx5ID0gdHJ1ZTsKKworICAgICAgICBv
bGRTdGF0ZS5xdWVyeVBhcmFtcyA9IGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZSh0aGlzLCBuZXdT
dGF0ZS5oYW5kbGVySW5mb3MsIG5ld1N0YXRlLnF1ZXJ5UGFyYW1zLCBuZXdUcmFuc2l0aW9uKTsK
KworICAgICAgICBuZXdUcmFuc2l0aW9uLnByb21pc2UgPSBuZXdUcmFuc2l0aW9uLnByb21pc2Uu
dGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgICAgdXBkYXRlVVJMKG5ld1RyYW5zaXRp
b24sIG9sZFN0YXRlLCB0cnVlKTsKKyAgICAgICAgICBpZiAocm91dGVyLmRpZFRyYW5zaXRpb24p
IHsKKyAgICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uKHJvdXRlci5jdXJyZW50SGFuZGxl
ckluZm9zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAg
fSwgbnVsbCwgX3JvdXRlclV0aWxzLnByb21pc2VMYWJlbCgiVHJhbnNpdGlvbiBjb21wbGV0ZSIp
KTsKKyAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgICAgICB9CisgICAgfSwKKworICAg
IC8vIE5PVEU6IHRoaXMgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBoZXJlCisgICAg
Ly8gaXQgc2hhbGwgcmVtYWluIHVudGlsIG91ciBFUzYgdHJhbnNwaWxlciBjYW4KKyAgICAvLyBo
YW5kbGUgY3ljbGljYWwgZGVwcy4KKyAgICB0cmFuc2l0aW9uQnlJbnRlbnQ6IGZ1bmN0aW9uIChp
bnRlbnQsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gZ2V0
VHJhbnNpdGlvbkJ5SW50ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9IGNhdGNo
IChlKSB7CisgICAgICAgIHJldHVybiBuZXcgX3JvdXRlclRyYW5zaXRpb24uVHJhbnNpdGlvbih0
aGlzLCBpbnRlbnQsIG51bGwsIGUpOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAg
IENsZWFycyB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IHJvdXRlIGhhbmRsZXJzIGFuZCB0cmlnZ2Vy
cyBleGl0CisgICAgICBvbiBlYWNoIG9mIHRoZW0gc3RhcnRpbmcgYXQgdGhlIGxlYWYgYW5kIHRy
YXZlcnNpbmcgdXAgdGhyb3VnaAorICAgICAgaXRzIGFuY2VzdG9ycy4KKyAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5zdGF0ZSkgeworICAgICAgICBfcm91
dGVyVXRpbHMuZm9yRWFjaCh0aGlzLnN0YXRlLmhhbmRsZXJJbmZvcy5zbGljZSgpLnJldmVyc2Uo
KSwgZnVuY3Rpb24gKGhhbmRsZXJJbmZvKSB7CisgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5k
bGVySW5mby5oYW5kbGVyOworICAgICAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVy
LCAnZXhpdCcpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGF0ZSA9IG5l
dyBfcm91dGVyVHJhbnNpdGlvblN0YXRlLmRlZmF1bHQoKTsKKyAgICAgIHRoaXMuY3VycmVudEhh
bmRsZXJJbmZvcyA9IG51bGw7CisgICAgfSwKKworICAgIGFjdGl2ZVRyYW5zaXRpb246IG51bGws
CisKKyAgICAvKioKKyAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlcjsKKyAg
ICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1
YWxseQorICAgICAgdmlhIHRoZSBiYWNrIGFuZCBmb3J3YXJkIGJ1dHRvbikuCisgICAgICAgUmV0
dXJucyBhbiBBcnJheSBvZiBoYW5kbGVycyBhbmQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZAor
ICAgICAgd2l0aCB0aG9zZSBwYXJhbWV0ZXJzLgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwg
YSBVUkwgdG8gcHJvY2VzcworICAgICAgIEByZXR1cm4ge0FycmF5fSBhbiBBcnJheSBvZiBgW2hh
bmRsZXIsIHBhcmFtZXRlcl1gIHR1cGxlcworICAgICovCisgICAgaGFuZGxlVVJMOiBmdW5jdGlv
biAodXJsKSB7CisgICAgICAvLyBQZXJmb3JtIGEgVVJMLWJhc2VkIHRyYW5zaXRpb24sIGJ1dCBk
b24ndCBjaGFuZ2UKKyAgICAgIC8vIHRoZSBVUkwgYWZ0ZXJ3YXJkLCBzaW5jZSBpdCBhbHJlYWR5
IGhhcHBlbmVkLgorICAgICAgdmFyIGFyZ3MgPSBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1
bWVudHMpOworICAgICAgaWYgKHVybC5jaGFyQXQoMCkgIT09ICcvJykgeworICAgICAgICBhcmdz
WzBdID0gJy8nICsgdXJsOworICAgICAgfQorCisgICAgICByZXR1cm4gZG9UcmFuc2l0aW9uKHRo
aXMsIGFyZ3MpLm1ldGhvZChudWxsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBIb29rIHBv
aW50IGZvciB1cGRhdGluZyB0aGUgVVJMLgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBV
UkwgdG8gdXBkYXRlIHRvCisgICAgKi8KKyAgICB1cGRhdGVVUkw6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxhY2luZyB0aGUgY3VycmVu
dCBVUkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKKyAgICAgICBCeSBkZWZhdWx0IHRoaXMgYmVo
YXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwg
YSBVUkwgdG8gdXBkYXRlIHRvCisgICAgKi8KKyAgICByZXBsYWNlVVJMOiBmdW5jdGlvbiAodXJs
KSB7CisgICAgICB0aGlzLnVwZGF0ZVVSTCh1cmwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IFRyYW5zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIG5hbWVkIHJvdXRlLgorICAgICAgIElmIG5l
Y2Vzc2FyeSwgdHJpZ2dlciB0aGUgZXhpdCBjYWxsYmFjayBvbiBhbnkgaGFuZGxlcnMKKyAgICAg
IHRoYXQgYXJlIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGUgdGFyZ2V0IHJvdXRlLgorICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgICovCisg
ICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIGRvVHJhbnNp
dGlvbih0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBpbnRlcm1lZGlhdGVUcmFuc2l0
aW9uVG86IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4gZG9UcmFuc2l0aW9uKHRoaXMs
IGFyZ3VtZW50cywgdHJ1ZSk7CisgICAgfSwKKworICAgIHJlZnJlc2g6IGZ1bmN0aW9uIChwaXZv
dEhhbmRsZXIpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHRoaXMuYWN0aXZlVHJhbnNpdGlvbiA/IHRo
aXMuYWN0aXZlVHJhbnNpdGlvbi5zdGF0ZSA6IHRoaXMuc3RhdGU7CisgICAgICB2YXIgaGFuZGxl
ckluZm9zID0gc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgdmFyIHBhcmFtcyA9IHt9OworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsr
aSkgeworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV07CisgICAgICAg
IHBhcmFtc1toYW5kbGVySW5mby5uYW1lXSA9IGhhbmRsZXJJbmZvLnBhcmFtcyB8fCB7fTsKKyAg
ICAgIH0KKworICAgICAgX3JvdXRlclV0aWxzLmxvZyh0aGlzLCAiU3RhcnRpbmcgYSByZWZyZXNo
IHRyYW5zaXRpb24iKTsKKyAgICAgIHZhciBpbnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25J
bnRlbnROYW1lZFRyYW5zaXRpb25JbnRlbnQuZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGhhbmRs
ZXJJbmZvc1toYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSwKKyAgICAgICAgcGl2b3RIYW5k
bGVyOiBwaXZvdEhhbmRsZXIgfHwgaGFuZGxlckluZm9zWzBdLmhhbmRsZXIsCisgICAgICAgIGNv
bnRleHRzOiBbXSwgLy8gVE9ETyBjb2xsZWN0IGNvbnRleHRzLi4uPworICAgICAgICBxdWVyeVBh
cmFtczogdGhpcy5fY2hhbmdlZFF1ZXJ5UGFyYW1zIHx8IHN0YXRlLnF1ZXJ5UGFyYW1zIHx8IHt9
CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvbkJ5SW50ZW50KGludGVu
dCwgZmFsc2UpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIElkZW50aWNhbCB0byBgdHJhbnNp
dGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAorICAg
ICAgaWYgcG9zc2libGUuCisgICAgICAgVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgcHJpbWFyaWx5
IGZvciB1c2Ugd2l0aCBgcmVwbGFjZVN0YXRlYC4KKyAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICAqLworICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlv
biAobmFtZSkgeworICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMpLm1l
dGhvZCgncmVwbGFjZScpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRha2UgYSBuYW1lZCBy
b3V0ZSBhbmQgY29udGV4dCBvYmplY3RzIGFuZCBnZW5lcmF0ZSBhCisgICAgICBVUkwuCisgICAg
ICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIHRvIGdlbmVyYXRl
CisgICAgICAgIGEgVVJMIGZvcgorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHMgYSBs
aXN0IG9mIG9iamVjdHMgdG8gc2VyaWFsaXplCisgICAgICAgQHJldHVybiB7U3RyaW5nfSBhIFVS
TAorICAgICovCisgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uIChoYW5kbGVyTmFtZSkgeworCisgICAg
ICB2YXIgcGFydGl0aW9uZWRBcmdzID0gX3JvdXRlclV0aWxzLmV4dHJhY3RRdWVyeVBhcmFtcyhf
cm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSwKKyAgICAgICAgICBzdXBwbGll
ZFBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1swXSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBh
cnRpdGlvbmVkQXJnc1sxXTsKKworICAgICAgLy8gQ29uc3RydWN0IGEgVHJhbnNpdGlvbkludGVu
dCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbXMKKyAgICAgIC8vIGFuZCBhcHBseSBpdCB0byB0aGUg
cHJlc2VudCBzdGF0ZSBvZiB0aGUgcm91dGVyLgorICAgICAgdmFyIGludGVudCA9IG5ldyBfcm91
dGVyVHJhbnNpdGlvbkludGVudE5hbWVkVHJhbnNpdGlvbkludGVudC5kZWZhdWx0KHsgbmFtZTog
aGFuZGxlck5hbWUsIGNvbnRleHRzOiBzdXBwbGllZFBhcmFtcyB9KTsKKyAgICAgIHZhciBzdGF0
ZSA9IGludGVudC5hcHBseVRvU3RhdGUodGhpcy5zdGF0ZSwgdGhpcy5yZWNvZ25pemVyLCB0aGlz
LmdldEhhbmRsZXIpOworICAgICAgdmFyIHBhcmFtcyA9IHt9OworCisgICAgICBmb3IgKHZhciBp
ID0gMCwgbGVuID0gc3RhdGUuaGFuZGxlckluZm9zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7Cisg
ICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHN0YXRlLmhhbmRsZXJJbmZvc1tpXTsKKyAgICAgICAg
dmFyIGhhbmRsZXJQYXJhbXMgPSBoYW5kbGVySW5mby5zZXJpYWxpemUoKTsKKyAgICAgICAgX3Jv
dXRlclV0aWxzLm1lcmdlKHBhcmFtcywgaGFuZGxlclBhcmFtcyk7CisgICAgICB9CisgICAgICBw
YXJhbXMucXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtczsKKworICAgICAgcmV0dXJuIHRoaXMucmVj
b2duaXplci5nZW5lcmF0ZShoYW5kbGVyTmFtZSwgcGFyYW1zKTsKKyAgICB9LAorCisgICAgYXBw
bHlJbnRlbnQ6IGZ1bmN0aW9uIChoYW5kbGVyTmFtZSwgY29udGV4dHMpIHsKKyAgICAgIHZhciBp
bnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25JbnRlbnROYW1lZFRyYW5zaXRpb25JbnRlbnQu
ZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGhhbmRsZXJOYW1lLAorICAgICAgICBjb250ZXh0czog
Y29udGV4dHMKKyAgICAgIH0pOworCisgICAgICB2YXIgc3RhdGUgPSB0aGlzLmFjdGl2ZVRyYW5z
aXRpb24gJiYgdGhpcy5hY3RpdmVUcmFuc2l0aW9uLnN0YXRlIHx8IHRoaXMuc3RhdGU7CisgICAg
ICByZXR1cm4gaW50ZW50LmFwcGx5VG9TdGF0ZShzdGF0ZSwgdGhpcy5yZWNvZ25pemVyLCB0aGlz
LmdldEhhbmRsZXIpOworICAgIH0sCisKKyAgICBpc0FjdGl2ZUludGVudDogZnVuY3Rpb24gKGhh
bmRsZXJOYW1lLCBjb250ZXh0cywgcXVlcnlQYXJhbXMsIF9zdGF0ZSkgeworICAgICAgdmFyIHN0
YXRlID0gX3N0YXRlIHx8IHRoaXMuc3RhdGUsCisgICAgICAgICAgdGFyZ2V0SGFuZGxlckluZm9z
ID0gc3RhdGUuaGFuZGxlckluZm9zLAorICAgICAgICAgIGZvdW5kID0gZmFsc2UsCisgICAgICAg
ICAgbmFtZXMsCisgICAgICAgICAgb2JqZWN0LAorICAgICAgICAgIGhhbmRsZXJJbmZvLAorICAg
ICAgICAgIGhhbmRsZXJPYmosCisgICAgICAgICAgaSwKKyAgICAgICAgICBsZW47CisKKyAgICAg
IGlmICghdGFyZ2V0SGFuZGxlckluZm9zLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICB9CisKKyAgICAgIHZhciB0YXJnZXRIYW5kbGVyID0gdGFyZ2V0SGFuZGxlckluZm9z
W3RhcmdldEhhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lOworICAgICAgdmFyIHJlY29nSGFu
ZGxlcnMgPSB0aGlzLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGFyZ2V0SGFuZGxlcik7CisKKyAg
ICAgIHZhciBpbmRleCA9IDA7CisgICAgICBmb3IgKGxlbiA9IHJlY29nSGFuZGxlcnMubGVuZ3Ro
OyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgICAgICBoYW5kbGVySW5mbyA9IHRhcmdldEhh
bmRsZXJJbmZvc1tpbmRleF07CisgICAgICAgIGlmIChoYW5kbGVySW5mby5uYW1lID09PSBoYW5k
bGVyTmFtZSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAg
IGlmIChpbmRleCA9PT0gcmVjb2dIYW5kbGVycy5sZW5ndGgpIHsKKyAgICAgICAgLy8gVGhlIHBy
b3ZpZGVkIHJvdXRlIG5hbWUgaXNuJ3QgZXZlbiBpbiB0aGUgcm91dGUgaGllcmFyY2h5LgorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciB0ZXN0U3RhdGUgPSBuZXcg
X3JvdXRlclRyYW5zaXRpb25TdGF0ZS5kZWZhdWx0KCk7CisgICAgICB0ZXN0U3RhdGUuaGFuZGxl
ckluZm9zID0gdGFyZ2V0SGFuZGxlckluZm9zLnNsaWNlKDAsIGluZGV4ICsgMSk7CisgICAgICBy
ZWNvZ0hhbmRsZXJzID0gcmVjb2dIYW5kbGVycy5zbGljZSgwLCBpbmRleCArIDEpOworCisgICAg
ICB2YXIgaW50ZW50ID0gbmV3IF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50TmFtZWRUcmFuc2l0aW9u
SW50ZW50LmRlZmF1bHQoeworICAgICAgICBuYW1lOiB0YXJnZXRIYW5kbGVyLAorICAgICAgICBj
b250ZXh0czogY29udGV4dHMKKyAgICAgIH0pOworCisgICAgICB2YXIgbmV3U3RhdGUgPSBpbnRl
bnQuYXBwbHlUb0hhbmRsZXJzKHRlc3RTdGF0ZSwgcmVjb2dIYW5kbGVycywgdGhpcy5nZXRIYW5k
bGVyLCB0YXJnZXRIYW5kbGVyLCB0cnVlLCB0cnVlKTsKKworICAgICAgdmFyIGhhbmRsZXJzRXF1
YWwgPSBoYW5kbGVySW5mb3NFcXVhbChuZXdTdGF0ZS5oYW5kbGVySW5mb3MsIHRlc3RTdGF0ZS5o
YW5kbGVySW5mb3MpOworICAgICAgaWYgKCFxdWVyeVBhcmFtcyB8fCAhaGFuZGxlcnNFcXVhbCkg
eworICAgICAgICByZXR1cm4gaGFuZGxlcnNFcXVhbDsKKyAgICAgIH0KKworICAgICAgLy8gR2V0
IGEgaGFzaCBvZiBRUHMgdGhhdCB3aWxsIHN0aWxsIGJlIGFjdGl2ZSBvbiBuZXcgcm91dGUKKyAg
ICAgIHZhciBhY3RpdmVRUHNPbk5ld0hhbmRsZXIgPSB7fTsKKyAgICAgIF9yb3V0ZXJVdGlscy5t
ZXJnZShhY3RpdmVRUHNPbk5ld0hhbmRsZXIsIHF1ZXJ5UGFyYW1zKTsKKworICAgICAgdmFyIGFj
dGl2ZVF1ZXJ5UGFyYW1zID0gc3RhdGUucXVlcnlQYXJhbXM7CisgICAgICBmb3IgKHZhciBrZXkg
aW4gYWN0aXZlUXVlcnlQYXJhbXMpIHsKKyAgICAgICAgaWYgKGFjdGl2ZVF1ZXJ5UGFyYW1zLmhh
c093blByb3BlcnR5KGtleSkgJiYgYWN0aXZlUVBzT25OZXdIYW5kbGVyLmhhc093blByb3BlcnR5
KGtleSkpIHsKKyAgICAgICAgICBhY3RpdmVRUHNPbk5ld0hhbmRsZXJba2V5XSA9IGFjdGl2ZVF1
ZXJ5UGFyYW1zW2tleV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGhhbmRs
ZXJzRXF1YWwgJiYgIV9yb3V0ZXJVdGlscy5nZXRDaGFuZ2VsaXN0KGFjdGl2ZVFQc09uTmV3SGFu
ZGxlciwgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBpc0FjdGl2ZTogZnVuY3Rpb24gKGhh
bmRsZXJOYW1lKSB7CisgICAgICB2YXIgcGFydGl0aW9uZWRBcmdzID0gX3JvdXRlclV0aWxzLmV4
dHJhY3RRdWVyeVBhcmFtcyhfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsK
KyAgICAgIHJldHVybiB0aGlzLmlzQWN0aXZlSW50ZW50KGhhbmRsZXJOYW1lLCBwYXJ0aXRpb25l
ZEFyZ3NbMF0sIHBhcnRpdGlvbmVkQXJnc1sxXSk7CisgICAgfSwKKworICAgIHRyaWdnZXI6IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgYXJncyA9IF9yb3V0ZXJVdGlscy5zbGljZS5jYWxs
KGFyZ3VtZW50cyk7CisgICAgICBfcm91dGVyVXRpbHMudHJpZ2dlcih0aGlzLCB0aGlzLmN1cnJl
bnRIYW5kbGVySW5mb3MsIGZhbHNlLCBhcmdzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBI
b29rIHBvaW50IGZvciBsb2dnaW5nIHRyYW5zaXRpb24gc3RhdHVzIHVwZGF0ZXMuCisgICAgICAg
QHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nLgorICAgICovCisgICAg
bG9nOiBudWxsCisgIH07CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgRmlyZXMgcXVl
cnlQYXJhbXNEaWRDaGFuZ2UgZXZlbnQKKyAgKi8KKyAgZnVuY3Rpb24gZmlyZVF1ZXJ5UGFyYW1E
aWRDaGFuZ2Uocm91dGVyLCBuZXdTdGF0ZSwgcXVlcnlQYXJhbUNoYW5nZWxpc3QpIHsKKyAgICAv
LyBJZiBxdWVyeVBhcmFtcyBjaGFuZ2VkIHRyaWdnZXIgZXZlbnQKKyAgICBpZiAocXVlcnlQYXJh
bUNoYW5nZWxpc3QpIHsKKworICAgICAgLy8gVGhpcyBpcyBhIGxpdHRsZSBoYWNreSBidXQgd2Ug
bmVlZCBzb21lIHdheSBvZiBzdG9yaW5nCisgICAgICAvLyBjaGFuZ2VkIHF1ZXJ5IHBhcmFtcyBn
aXZlbiB0aGF0IG5vIGFjdGl2ZVRyYW5zaXRpb24KKyAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8g
aGF2ZSBvY2N1cnJlZC4KKyAgICAgIHJvdXRlci5fY2hhbmdlZFF1ZXJ5UGFyYW1zID0gcXVlcnlQ
YXJhbUNoYW5nZWxpc3QuYWxsOworICAgICAgX3JvdXRlclV0aWxzLnRyaWdnZXIocm91dGVyLCBu
ZXdTdGF0ZS5oYW5kbGVySW5mb3MsIHRydWUsIFsncXVlcnlQYXJhbXNEaWRDaGFuZ2UnLCBxdWVy
eVBhcmFtQ2hhbmdlbGlzdC5jaGFuZ2VkLCBxdWVyeVBhcmFtQ2hhbmdlbGlzdC5hbGwsIHF1ZXJ5
UGFyYW1DaGFuZ2VsaXN0LnJlbW92ZWRdKTsKKyAgICAgIHJvdXRlci5fY2hhbmdlZFF1ZXJ5UGFy
YW1zID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBU
YWtlcyBhbiBBcnJheSBvZiBgSGFuZGxlckluZm9gcywgZmlndXJlcyBvdXQgd2hpY2ggb25lcyBh
cmUKKyAgICBleGl0aW5nLCBlbnRlcmluZywgb3IgY2hhbmdpbmcgY29udGV4dHMsIGFuZCBjYWxs
cyB0aGUKKyAgICBwcm9wZXIgaGFuZGxlciBob29rcy4KKyAgCisgICAgRm9yIGV4YW1wbGUsIGNv
bnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJlZSBvZiBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIGlzCisg
ICAgZm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0IGhhbmRsZXMuCisgIAorICAgIGBgYAor
ICAgIHx+aW5kZXggKCIvIikKKyAgICB8IHx+cG9zdHMgKCIvcG9zdHMiKQorICAgIHwgfCB8LXNo
b3dQb3N0ICgiLzppZCIpCisgICAgfCB8IHwtbmV3UG9zdCAoIi9uZXciKQorICAgIHwgfCB8LWVk
aXRQb3N0ICgiL2VkaXQiKQorICAgIHwgfH5hYm91dCAoIi9hYm91dC86aWQiKQorICAgIGBgYAor
ICAKKyAgICBDb25zaWRlciB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb25zOgorICAKKyAgICAxLiBB
IFVSTCB0cmFuc2l0aW9uIHRvIGAvcG9zdHMvMWAuCisgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGAq
bW9kZWxgIGNhbGxiYWNrcyBvbiB0aGUKKyAgICAgICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQg
YHNob3dQb3N0YCBoYW5kbGVycworICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgZW50ZXJgIGNhbGxi
YWNrIG9uIHRoZSBzYW1lCisgICAgICAgMy4gVHJpZ2dlcnMgdGhlIGBzZXR1cGAgY2FsbGJhY2sg
b24gdGhlIHNhbWUKKyAgICAyLiBBIGRpcmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAorICAg
ICAgIDEuIFRyaWdnZXJzIHRoZSBgZXhpdGAgY2FsbGJhY2sgb24gYHNob3dQb3N0YAorICAgICAg
IDIuIFRyaWdnZXJzIHRoZSBgZW50ZXJgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAgICAgIDMu
IFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAgIDMuIEEgZGly
ZWN0IHRyYW5zaXRpb24gdG8gYGFib3V0YCB3aXRoIGEgc3BlY2lmaWVkCisgICAgICAgY29udGV4
dCBvYmplY3QKKyAgICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQ
b3N0YAorICAgICAgICAgIGFuZCBgcG9zdHNgCisgICAgICAgMi4gVHJpZ2dlcnMgdGhlIGBzZXJp
YWxpemVgIGNhbGxiYWNrIG9uIGBhYm91dGAKKyAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVy
YCBjYWxsYmFjayBvbiBgYWJvdXRgCisgICAgICAgNC4gVHJpZ2dlcnMgdGhlIGBzZXR1cGAgY2Fs
bGJhY2sgb24gYGFib3V0YAorICAKKyAgICBAcGFyYW0ge1JvdXRlcn0gdHJhbnNpdGlvbgorICAg
IEBwYXJhbSB7VHJhbnNpdGlvblN0YXRlfSBuZXdTdGF0ZQorICAqLworICBmdW5jdGlvbiBzZXR1
cENvbnRleHRzKHJvdXRlciwgbmV3U3RhdGUsIHRyYW5zaXRpb24pIHsKKyAgICB2YXIgcGFydGl0
aW9uID0gcGFydGl0aW9uSGFuZGxlcnMocm91dGVyLnN0YXRlLCBuZXdTdGF0ZSk7CisgICAgdmFy
IGksIGwsIGhhbmRsZXI7CisKKyAgICBmb3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLmV4aXRlZC5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGhhbmRsZXIgPSBwYXJ0aXRpb24uZXhpdGVkW2ld
LmhhbmRsZXI7CisgICAgICBkZWxldGUgaGFuZGxlci5jb250ZXh0OworCisgICAgICBfcm91dGVy
VXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ3Jlc2V0JywgdHJ1ZSwgdHJhbnNpdGlvbik7CisgICAg
ICBfcm91dGVyVXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ2V4aXQnLCB0cmFuc2l0aW9uKTsKKyAg
ICB9CisKKyAgICB2YXIgb2xkU3RhdGUgPSByb3V0ZXIub2xkU3RhdGUgPSByb3V0ZXIuc3RhdGU7
CisgICAgcm91dGVyLnN0YXRlID0gbmV3U3RhdGU7CisgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5m
b3MgPSByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyA9IHBhcnRpdGlvbi51bmNoYW5nZWQuc2xp
Y2UoKTsKKworICAgIHRyeSB7CisgICAgICBmb3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLnJlc2V0
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBoYW5kbGVyID0gcGFydGl0aW9uLnJlc2V0
W2ldLmhhbmRsZXI7CisgICAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVyLCAncmVz
ZXQnLCBmYWxzZSwgdHJhbnNpdGlvbik7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDAsIGwg
PSBwYXJ0aXRpb24udXBkYXRlZENvbnRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAg
IGhhbmRsZXJFbnRlcmVkT3JVcGRhdGVkKGN1cnJlbnRIYW5kbGVySW5mb3MsIHBhcnRpdGlvbi51
cGRhdGVkQ29udGV4dFtpXSwgZmFsc2UsIHRyYW5zaXRpb24pOworICAgICAgfQorCisgICAgICBm
b3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLmVudGVyZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Cisg
ICAgICAgIGhhbmRsZXJFbnRlcmVkT3JVcGRhdGVkKGN1cnJlbnRIYW5kbGVySW5mb3MsIHBhcnRp
dGlvbi5lbnRlcmVkW2ldLCB0cnVlLCB0cmFuc2l0aW9uKTsKKyAgICAgIH0KKyAgICB9IGNhdGNo
IChlKSB7CisgICAgICByb3V0ZXIuc3RhdGUgPSBvbGRTdGF0ZTsKKyAgICAgIHJvdXRlci5jdXJy
ZW50SGFuZGxlckluZm9zID0gb2xkU3RhdGUuaGFuZGxlckluZm9zOworICAgICAgdGhyb3cgZTsK
KyAgICB9CisKKyAgICByb3V0ZXIuc3RhdGUucXVlcnlQYXJhbXMgPSBmaW5hbGl6ZVF1ZXJ5UGFy
YW1DaGFuZ2Uocm91dGVyLCBjdXJyZW50SGFuZGxlckluZm9zLCBuZXdTdGF0ZS5xdWVyeVBhcmFt
cywgdHJhbnNpdGlvbik7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBIZWxw
ZXIgbWV0aG9kIHVzZWQgYnkgc2V0dXBDb250ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVkaXJl
Y3RzCisgICAgdGhhdCBtYXkgaGFwcGVuIGluIGVudGVyL3NldHVwLgorICAqLworICBmdW5jdGlv
biBoYW5kbGVyRW50ZXJlZE9yVXBkYXRlZChjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVySW5m
bywgZW50ZXIsIHRyYW5zaXRpb24pIHsKKworICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8u
aGFuZGxlciwKKyAgICAgICAgY29udGV4dCA9IGhhbmRsZXJJbmZvLmNvbnRleHQ7CisKKyAgICBp
ZiAoZW50ZXIpIHsKKyAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVyLCAnZW50ZXIn
LCB0cmFuc2l0aW9uKTsKKyAgICB9CisgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5p
c0Fib3J0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5UcmFuc2l0aW9u
QWJvcnRlZCgpOworICAgIH0KKworICAgIGhhbmRsZXIuY29udGV4dCA9IGNvbnRleHQ7CisgICAg
X3JvdXRlclV0aWxzLmNhbGxIb29rKGhhbmRsZXIsICdjb250ZXh0RGlkQ2hhbmdlJyk7CisKKyAg
ICBfcm91dGVyVXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ3NldHVwJywgY29udGV4dCwgdHJhbnNp
dGlvbik7CisgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKKyAg
ICAgIHRocm93IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5UcmFuc2l0aW9uQWJvcnRlZCgpOworICAg
IH0KKworICAgIGN1cnJlbnRIYW5kbGVySW5mb3MucHVzaChoYW5kbGVySW5mbyk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIG9uZSBVUkwgdG8KKyAgICBh
bm90aGVyIHRvIGRldGVybWluZSB3aGljaCBoYW5kbGVycyBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSwK
KyAgICB3aGljaCBoYW5kbGVycyBhcmUgbmV3bHkgYWN0aXZlLCBhbmQgd2hpY2ggaGFuZGxlcnMg
cmVtYWluCisgICAgYWN0aXZlIGJ1dCBoYXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4KKyAgCisg
ICAgVGFrZSBhIGxpc3Qgb2Ygb2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5kIHBhcnRp
dGlvbgorICAgIHRoZW0gaW50byBmb3VyIGJ1Y2tldHM6CisgIAorICAgICogdW5jaGFuZ2VkOiB0
aGUgaGFuZGxlciB3YXMgYWN0aXZlIGluIGJvdGggdGhlIG9sZCBhbmQKKyAgICAgIG5ldyBVUkws
IGFuZCBpdHMgY29udGV4dCByZW1haW5zIHRoZSBzYW1lCisgICAgKiB1cGRhdGVkIGNvbnRleHQ6
IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUKKyAgICAgIG9sZCBhbmQgbmV3IFVS
TCwgYnV0IGl0cyBjb250ZXh0IGNoYW5nZWQuIFRoZSBoYW5kbGVyJ3MKKyAgICAgIGBzZXR1cGAg
bWV0aG9kLCBpZiBhbnksIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG5ldworICAgICAgY29udGV4
dC4KKyAgICAqIGV4aXRlZDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiB0aGUgb2xkIFVSTCwg
YnV0IGlzCisgICAgICBubyBsb25nZXIgYWN0aXZlLgorICAgICogZW50ZXJlZDogdGhlIGhhbmRs
ZXIgd2FzIG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dAorICAgICAgaXMgbm93IGFjdGl2
ZS4KKyAgCisgICAgVGhlIFBhcnRpdGlvbmVkSGFuZGxlcnMgc3RydWN0dXJlIGhhcyBmb3VyIGZp
ZWxkczoKKyAgCisgICAgKiBgdXBkYXRlZENvbnRleHRgOiBhIGxpc3Qgb2YgYEhhbmRsZXJJbmZv
YCBvYmplY3RzIHRoYXQKKyAgICAgIHJlcHJlc2VudCBoYW5kbGVycyB0aGF0IHJlbWFpbiBhY3Rp
dmUgYnV0IGhhdmUgYSBjaGFuZ2VkCisgICAgICBjb250ZXh0CisgICAgKiBgZW50ZXJlZGA6IGEg
bGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKyAgICAgIGhhbmRs
ZXJzIHRoYXQgYXJlIG5ld2x5IGFjdGl2ZQorICAgICogYGV4aXRlZGA6IGEgbGlzdCBvZiBgSGFu
ZGxlckluZm9gIG9iamVjdHMgdGhhdCBhcmUgbm8KKyAgICAgIGxvbmdlciBhY3RpdmUuCisgICAg
KiBgdW5jaGFuZ2VkYDogYSBsaXN0IG9mIGBIYW5kZXJJbmZvYCBvYmplY3RzIHRoYXQgcmVtYWlu
IGFjdGl2ZS4KKyAgCisgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG9sZEhhbmRsZXJz
IGEgbGlzdCBvZiB0aGUgaGFuZGxlcgorICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91
cyBVUkwgKG9yIGBbXWAgaWYgdGhpcyBpcyB0aGUKKyAgICAgIGZpcnN0IGhhbmRsZWQgdHJhbnNp
dGlvbikKKyAgICBAcGFyYW0ge0FycmF5W0hhbmRsZXJJbmZvXX0gbmV3SGFuZGxlcnMgYSBsaXN0
IG9mIHRoZSBoYW5kbGVyCisgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBVUkwKKyAgCisg
ICAgQHJldHVybiB7UGFydGl0aW9ufQorICAqLworICBmdW5jdGlvbiBwYXJ0aXRpb25IYW5kbGVy
cyhvbGRTdGF0ZSwgbmV3U3RhdGUpIHsKKyAgICB2YXIgb2xkSGFuZGxlcnMgPSBvbGRTdGF0ZS5o
YW5kbGVySW5mb3M7CisgICAgdmFyIG5ld0hhbmRsZXJzID0gbmV3U3RhdGUuaGFuZGxlckluZm9z
OworCisgICAgdmFyIGhhbmRsZXJzID0geworICAgICAgdXBkYXRlZENvbnRleHQ6IFtdLAorICAg
ICAgZXhpdGVkOiBbXSwKKyAgICAgIGVudGVyZWQ6IFtdLAorICAgICAgdW5jaGFuZ2VkOiBbXQor
ICAgIH07CisKKyAgICB2YXIgaGFuZGxlckNoYW5nZWQsCisgICAgICAgIGNvbnRleHRDaGFuZ2Vk
ID0gZmFsc2UsCisgICAgICAgIGksCisgICAgICAgIGw7CisKKyAgICBmb3IgKGkgPSAwLCBsID0g
bmV3SGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgb2xkSGFuZGxlciA9
IG9sZEhhbmRsZXJzW2ldLAorICAgICAgICAgIG5ld0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsK
KworICAgICAgaWYgKCFvbGRIYW5kbGVyIHx8IG9sZEhhbmRsZXIuaGFuZGxlciAhPT0gbmV3SGFu
ZGxlci5oYW5kbGVyKSB7CisgICAgICAgIGhhbmRsZXJDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0K
KworICAgICAgaWYgKGhhbmRsZXJDaGFuZ2VkKSB7CisgICAgICAgIGhhbmRsZXJzLmVudGVyZWQu
cHVzaChuZXdIYW5kbGVyKTsKKyAgICAgICAgaWYgKG9sZEhhbmRsZXIpIHsKKyAgICAgICAgICBo
YW5kbGVycy5leGl0ZWQudW5zaGlmdChvbGRIYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgfSBl
bHNlIGlmIChjb250ZXh0Q2hhbmdlZCB8fCBvbGRIYW5kbGVyLmNvbnRleHQgIT09IG5ld0hhbmRs
ZXIuY29udGV4dCkgeworICAgICAgICBjb250ZXh0Q2hhbmdlZCA9IHRydWU7CisgICAgICAgIGhh
bmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2gobmV3SGFuZGxlcik7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBoYW5kbGVycy51bmNoYW5nZWQucHVzaChvbGRIYW5kbGVyKTsKKyAgICAgIH0KKyAg
ICB9CisKKyAgICBmb3IgKGkgPSBuZXdIYW5kbGVycy5sZW5ndGgsIGwgPSBvbGRIYW5kbGVycy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhh
bmRsZXJzW2ldKTsKKyAgICB9CisKKyAgICBoYW5kbGVycy5yZXNldCA9IGhhbmRsZXJzLnVwZGF0
ZWRDb250ZXh0LnNsaWNlKCk7CisgICAgaGFuZGxlcnMucmVzZXQucmV2ZXJzZSgpOworCisgICAg
cmV0dXJuIGhhbmRsZXJzOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlVVJMKHRyYW5zaXRpb24s
IHN0YXRlLCBpbnB1dFVybCkgeworICAgIHZhciB1cmxNZXRob2QgPSB0cmFuc2l0aW9uLnVybE1l
dGhvZDsKKworICAgIGlmICghdXJsTWV0aG9kKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgdmFyIHJvdXRlciA9IHRyYW5zaXRpb24ucm91dGVyLAorICAgICAgICBoYW5kbGVySW5mb3Mg
PSBzdGF0ZS5oYW5kbGVySW5mb3MsCisgICAgICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm9z
W2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lLAorICAgICAgICBwYXJhbXMgPSB7fTsKKwor
ICAgIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsK
KyAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKKyAgICAgIF9yb3V0ZXJV
dGlscy5tZXJnZShwYXJhbXMsIGhhbmRsZXJJbmZvLnBhcmFtcyk7CisgICAgICBpZiAoaGFuZGxl
ckluZm8uaGFuZGxlci5pbmFjY2Vzc2libGVCeVVSTCkgeworICAgICAgICB1cmxNZXRob2QgPSBu
dWxsOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1cmxNZXRob2QpIHsKKyAgICAgIHBhcmFt
cy5xdWVyeVBhcmFtcyA9IHRyYW5zaXRpb24uX3Zpc2libGVRdWVyeVBhcmFtcyB8fCBzdGF0ZS5x
dWVyeVBhcmFtczsKKyAgICAgIHZhciB1cmwgPSByb3V0ZXIucmVjb2duaXplci5nZW5lcmF0ZSho
YW5kbGVyTmFtZSwgcGFyYW1zKTsKKworICAgICAgaWYgKHVybE1ldGhvZCA9PT0gJ3JlcGxhY2Un
KSB7CisgICAgICAgIHJvdXRlci5yZXBsYWNlVVJMKHVybCk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICByb3V0ZXIudXBkYXRlVVJMKHVybCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoq
CisgICAgQHByaXZhdGUKKyAgCisgICAgVXBkYXRlcyB0aGUgVVJMIChpZiBuZWNlc3NhcnkpIGFu
ZCBjYWxscyBgc2V0dXBDb250ZXh0c2AKKyAgICB0byB1cGRhdGUgdGhlIHJvdXRlcidzIGFycmF5
IG9mIGBjdXJyZW50SGFuZGxlckluZm9zYC4KKyAgICovCisgIGZ1bmN0aW9uIGZpbmFsaXplVHJh
bnNpdGlvbih0cmFuc2l0aW9uLCBuZXdTdGF0ZSkgeworCisgICAgdHJ5IHsKKyAgICAgIF9yb3V0
ZXJVdGlscy5sb2codHJhbnNpdGlvbi5yb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJSZXNv
bHZlZCBhbGwgbW9kZWxzIG9uIGRlc3RpbmF0aW9uIHJvdXRlOyBmaW5hbGl6aW5nIHRyYW5zaXRp
b24uIik7CisKKyAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKKyAgICAgICAg
ICBoYW5kbGVySW5mb3MgPSBuZXdTdGF0ZS5oYW5kbGVySW5mb3MsCisgICAgICAgICAgc2VxID0g
dHJhbnNpdGlvbi5zZXF1ZW5jZTsKKworICAgICAgLy8gUnVuIGFsbCB0aGUgbmVjZXNzYXJ5IGVu
dGVyL3NldHVwL2V4aXQgaG9va3MKKyAgICAgIHNldHVwQ29udGV4dHMocm91dGVyLCBuZXdTdGF0
ZSwgdHJhbnNpdGlvbik7CisKKyAgICAgIC8vIENoZWNrIGlmIGEgcmVkaXJlY3Qgb2NjdXJyZWQg
aW4gZW50ZXIvc2V0dXAKKyAgICAgIGlmICh0cmFuc2l0aW9uLmlzQWJvcnRlZCkgeworICAgICAg
ICAvLyBUT0RPOiBjbGVhbmVyIHdheT8gZGlzdGluZ3Vpc2ggYi93IHRhcmdldEhhbmRsZXJJbmZv
cz8KKyAgICAgICAgcm91dGVyLnN0YXRlLmhhbmRsZXJJbmZvcyA9IHJvdXRlci5jdXJyZW50SGFu
ZGxlckluZm9zOworICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KF9y
b3V0ZXJUcmFuc2l0aW9uLmxvZ0Fib3J0KHRyYW5zaXRpb24pKTsKKyAgICAgIH0KKworICAgICAg
dXBkYXRlVVJMKHRyYW5zaXRpb24sIG5ld1N0YXRlLCB0cmFuc2l0aW9uLmludGVudC51cmwpOwor
CisgICAgICB0cmFuc2l0aW9uLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICByb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbiA9IG51bGw7CisKKyAgICAgIF9yb3V0ZXJVdGlscy50cmlnZ2VyKHJvdXRlciwg
cm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUsIFsnZGlkVHJhbnNpdGlvbiddKTsKKwor
ICAgICAgaWYgKHJvdXRlci5kaWRUcmFuc2l0aW9uKSB7CisgICAgICAgIHJvdXRlci5kaWRUcmFu
c2l0aW9uKHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zKTsKKyAgICAgIH0KKworICAgICAgX3Jv
dXRlclV0aWxzLmxvZyhyb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJUUkFOU0lUSU9OIENP
TVBMRVRFLiIpOworCisgICAgICAvLyBSZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhhbmRsZXIuCisg
ICAgICByZXR1cm4gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVy
OworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBfcm91dGVyVHJh
bnNpdGlvbi5UcmFuc2l0aW9uQWJvcnRlZCkpIHsKKyAgICAgICAgLy92YXIgZXJyb25lb3VzSGFu
ZGxlciA9IGhhbmRsZXJJbmZvcy5wb3AoKTsKKyAgICAgICAgdmFyIGluZm9zID0gdHJhbnNpdGlv
bi5zdGF0ZS5oYW5kbGVySW5mb3M7CisgICAgICAgIHRyYW5zaXRpb24udHJpZ2dlcih0cnVlLCAn
ZXJyb3InLCBlLCB0cmFuc2l0aW9uLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVyKTsK
KyAgICAgICAgdHJhbnNpdGlvbi5hYm9ydCgpOworICAgICAgfQorCisgICAgICB0aHJvdyBlOwor
ICAgIH0KKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIEJlZ2lucyBhbmQgcmV0
dXJucyBhIFRyYW5zaXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkCisgICAgYXJndW1lbnRzLiBB
Y2NlcHRzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSBvZiBib3RoIFVSTAorICAgIHRyYW5zaXRpb25z
IGFuZCBuYW1lZCB0cmFuc2l0aW9ucy4KKyAgCisgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgor
ICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gYXJncyBhcmd1bWVudHMgcGFzc2VkIHRvIHRyYW5z
aXRpb25UbywKKyAgICAgIHJlcGxhY2VXaXRoLCBvciBoYW5kbGVVUkwKKyAgKi8KKyAgZnVuY3Rp
b24gZG9UcmFuc2l0aW9uKHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlhdGUpIHsKKyAgICAvLyBO
b3JtYWxpemUgYmxhbmsgdHJhbnNpdGlvbnMgdG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCisgICAg
dmFyIG5hbWUgPSBhcmdzWzBdIHx8ICcvJzsKKworICAgIHZhciBsYXN0QXJnID0gYXJnc1thcmdz
Lmxlbmd0aCAtIDFdOworICAgIHZhciBxdWVyeVBhcmFtcyA9IHt9OworICAgIGlmIChsYXN0QXJn
ICYmIGxhc3RBcmcuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFyYW1zJykpIHsKKyAgICAgIHF1ZXJ5
UGFyYW1zID0gcG9wLmNhbGwoYXJncykucXVlcnlQYXJhbXM7CisgICAgfQorCisgICAgdmFyIGlu
dGVudDsKKyAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHsKKworICAgICAgX3JvdXRlclV0aWxz
LmxvZyhyb3V0ZXIsICJVcGRhdGluZyBxdWVyeSBwYXJhbXMiKTsKKworICAgICAgLy8gQSBxdWVy
eSBwYXJhbSB1cGRhdGUgaXMgcmVhbGx5IGp1c3QgYSB0cmFuc2l0aW9uCisgICAgICAvLyBpbnRv
IHRoZSByb3V0ZSB5b3UncmUgYWxyZWFkeSBvbi4KKyAgICAgIHZhciBoYW5kbGVySW5mb3MgPSBy
b3V0ZXIuc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgaW50ZW50ID0gbmV3IF9yb3V0ZXJUcmFu
c2l0aW9uSW50ZW50TmFtZWRUcmFuc2l0aW9uSW50ZW50LmRlZmF1bHQoeworICAgICAgICBuYW1l
OiBoYW5kbGVySW5mb3NbaGFuZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWUsCisgICAgICAgIGNv
bnRleHRzOiBbXSwKKyAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zCisgICAgICB9KTsK
KyAgICB9IGVsc2UgaWYgKG5hbWUuY2hhckF0KDApID09PSAnLycpIHsKKworICAgICAgX3JvdXRl
clV0aWxzLmxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0cmFuc2l0aW9uIHRvICIgKyBuYW1l
KTsKKyAgICAgIGludGVudCA9IG5ldyBfcm91dGVyVHJhbnNpdGlvbkludGVudFVybFRyYW5zaXRp
b25JbnRlbnQuZGVmYXVsdCh7IHVybDogbmFtZSB9KTsKKyAgICB9IGVsc2UgeworCisgICAgICBf
cm91dGVyVXRpbHMubG9nKHJvdXRlciwgIkF0dGVtcHRpbmcgdHJhbnNpdGlvbiB0byAiICsgbmFt
ZSk7CisgICAgICBpbnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25JbnRlbnROYW1lZFRyYW5z
aXRpb25JbnRlbnQuZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGFyZ3NbMF0sCisgICAgICAgIGNv
bnRleHRzOiBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmdzLCAxKSwKKyAgICAgICAgcXVlcnlQ
YXJhbXM6IHF1ZXJ5UGFyYW1zCisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gcm91dGVy
LnRyYW5zaXRpb25CeUludGVudChpbnRlbnQsIGlzSW50ZXJtZWRpYXRlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGhhbmRsZXJJbmZvc0VxdWFsKGhhbmRsZXJJbmZvcywgb3RoZXJIYW5kbGVySW5mb3Mp
IHsKKyAgICBpZiAoaGFuZGxlckluZm9zLmxlbmd0aCAhPT0gb3RoZXJIYW5kbGVySW5mb3MubGVu
Z3RoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAs
IGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgaWYgKGhh
bmRsZXJJbmZvc1tpXSAhPT0gb3RoZXJIYW5kbGVySW5mb3NbaV0pIHsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZShyb3V0ZXIsIHJlc29sdmVkSGFuZGxlcnMsIG5l
d1F1ZXJ5UGFyYW1zLCB0cmFuc2l0aW9uKSB7CisgICAgLy8gV2UgZmlyZSBhIGZpbmFsaXplUXVl
cnlQYXJhbUNoYW5nZSBldmVudCB3aGljaAorICAgIC8vIGdpdmVzIHRoZSBuZXcgcm91dGUgaGll
cmFyY2h5IGEgY2hhbmNlIHRvIHRlbGwKKyAgICAvLyB1cyB3aGljaCBxdWVyeSBwYXJhbXMgaXQn
cyBjb25zdW1pbmcgYW5kIHdoYXQKKyAgICAvLyB0aGVpciBmaW5hbCB2YWx1ZXMgYXJlLiBJZiBh
IHF1ZXJ5IHBhcmFtIGlzCisgICAgLy8gbm8gbG9uZ2VyIGNvbnN1bWVkIGluIHRoZSBmaW5hbCBy
b3V0ZSBoaWVyYXJjaHksCisgICAgLy8gaXRzIHNlcmlhbGl6ZWQgc2VnbWVudCB3aWxsIGJlIHJl
bW92ZWQKKyAgICAvLyBmcm9tIHRoZSBVUkwuCisKKyAgICBmb3IgKHZhciBrIGluIG5ld1F1ZXJ5
UGFyYW1zKSB7CisgICAgICBpZiAobmV3UXVlcnlQYXJhbXMuaGFzT3duUHJvcGVydHkoaykgJiYg
bmV3UXVlcnlQYXJhbXNba10gPT09IG51bGwpIHsKKyAgICAgICAgZGVsZXRlIG5ld1F1ZXJ5UGFy
YW1zW2tdOworICAgICAgfQorICAgIH0KKworICAgIHZhciBmaW5hbFF1ZXJ5UGFyYW1zQXJyYXkg
PSBbXTsKKyAgICBfcm91dGVyVXRpbHMudHJpZ2dlcihyb3V0ZXIsIHJlc29sdmVkSGFuZGxlcnMs
IHRydWUsIFsnZmluYWxpemVRdWVyeVBhcmFtQ2hhbmdlJywgbmV3UXVlcnlQYXJhbXMsIGZpbmFs
UXVlcnlQYXJhbXNBcnJheSwgdHJhbnNpdGlvbl0pOworCisgICAgaWYgKHRyYW5zaXRpb24pIHsK
KyAgICAgIHRyYW5zaXRpb24uX3Zpc2libGVRdWVyeVBhcmFtcyA9IHt9OworICAgIH0KKworICAg
IHZhciBmaW5hbFF1ZXJ5UGFyYW1zID0ge307CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZp
bmFsUXVlcnlQYXJhbXNBcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgdmFyIHFw
ID0gZmluYWxRdWVyeVBhcmFtc0FycmF5W2ldOworICAgICAgZmluYWxRdWVyeVBhcmFtc1txcC5r
ZXldID0gcXAudmFsdWU7CisgICAgICBpZiAodHJhbnNpdGlvbiAmJiBxcC52aXNpYmxlICE9PSBm
YWxzZSkgeworICAgICAgICB0cmFuc2l0aW9uLl92aXNpYmxlUXVlcnlQYXJhbXNbcXAua2V5XSA9
IHFwLnZhbHVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmluYWxRdWVyeVBhcmFtczsK
KyAgfQorCisgIGZ1bmN0aW9uIG5vdGlmeUV4aXN0aW5nSGFuZGxlcnMocm91dGVyLCBuZXdTdGF0
ZSwgbmV3VHJhbnNpdGlvbikgeworICAgIHZhciBvbGRIYW5kbGVycyA9IHJvdXRlci5zdGF0ZS5o
YW5kbGVySW5mb3MsCisgICAgICAgIGNoYW5naW5nID0gW10sCisgICAgICAgIGxlYXZpbmdJbmRl
eCA9IG51bGwsCisgICAgICAgIGxlYXZpbmcsCisgICAgICAgIGxlYXZpbmdDaGVja2VyLAorICAg
ICAgICBpLAorICAgICAgICBvbGRIYW5kbGVyTGVuLAorICAgICAgICBvbGRIYW5kbGVyLAorICAg
ICAgICBuZXdIYW5kbGVyOworCisgICAgb2xkSGFuZGxlckxlbiA9IG9sZEhhbmRsZXJzLmxlbmd0
aDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2xkSGFuZGxlckxlbjsgaSsrKSB7CisgICAgICBvbGRI
YW5kbGVyID0gb2xkSGFuZGxlcnNbaV07CisgICAgICBuZXdIYW5kbGVyID0gbmV3U3RhdGUuaGFu
ZGxlckluZm9zW2ldOworCisgICAgICBpZiAoIW5ld0hhbmRsZXIgfHwgb2xkSGFuZGxlci5uYW1l
ICE9PSBuZXdIYW5kbGVyLm5hbWUpIHsKKyAgICAgICAgbGVhdmluZ0luZGV4ID0gaTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghbmV3SGFuZGxlci5pc1Jlc29sdmVkKSB7
CisgICAgICAgIGNoYW5naW5nLnB1c2gob2xkSGFuZGxlcik7CisgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGxlYXZpbmdJbmRleCAhPT0gbnVsbCkgeworICAgICAgbGVhdmluZyA9IG9sZEhhbmRs
ZXJzLnNsaWNlKGxlYXZpbmdJbmRleCwgb2xkSGFuZGxlckxlbik7CisgICAgICBsZWF2aW5nQ2hl
Y2tlciA9IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgIGZvciAodmFyIGggPSAwLCBsZW4gPSBs
ZWF2aW5nLmxlbmd0aDsgaCA8IGxlbjsgaCsrKSB7CisgICAgICAgICAgaWYgKGxlYXZpbmdbaF0u
bmFtZSA9PT0gbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH07CisgICAgfQorCisgICAg
X3JvdXRlclV0aWxzLnRyaWdnZXIocm91dGVyLCBvbGRIYW5kbGVycywgdHJ1ZSwgWyd3aWxsVHJh
bnNpdGlvbicsIG5ld1RyYW5zaXRpb25dKTsKKworICAgIGlmIChyb3V0ZXIud2lsbFRyYW5zaXRp
b24pIHsKKyAgICAgIHJvdXRlci53aWxsVHJhbnNpdGlvbihvbGRIYW5kbGVycywgbmV3U3RhdGUu
aGFuZGxlckluZm9zLCBuZXdUcmFuc2l0aW9uKTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBSb3V0ZXI7Cit9KTsKK2VuaWZlZCgncm91dGVyL3RyYW5zaXRpb24taW50ZW50Jywg
WydleHBvcnRzJywgJ3JvdXRlci91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlclV0
aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBUcmFuc2l0aW9uSW50ZW50KHBy
b3BzKSB7CisgICAgdGhpcy5pbml0aWFsaXplKHByb3BzKTsKKworICAgIC8vIFRPRE86IHdhdAor
ICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YSB8fCB7fTsKKyAgfQorCisgIFRyYW5zaXRpb25JbnRl
bnQucHJvdG90eXBlID0geworICAgIGluaXRpYWxpemU6IG51bGwsCisgICAgYXBwbHlUb1N0YXRl
OiBudWxsCisgIH07CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNpdGlvbkludGVudDsKK30p
OworZW5pZmVkKCdyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQvbmFtZWQtdHJhbnNpdGlvbi1pbnRl
bnQnLCBbJ2V4cG9ydHMnLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFu
c2l0aW9uLXN0YXRlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScsICdyb3V0ZXIvdXRp
bHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50LCBfcm91dGVy
VHJhbnNpdGlvblN0YXRlLCBfcm91dGVySGFuZGxlckluZm9GYWN0b3J5LCBfcm91dGVyVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9yb3V0ZXJVdGlscy5z
dWJjbGFzcyhfcm91dGVyVHJhbnNpdGlvbkludGVudC5kZWZhdWx0LCB7CisgICAgbmFtZTogbnVs
bCwKKyAgICBwaXZvdEhhbmRsZXI6IG51bGwsCisgICAgY29udGV4dHM6IG51bGwsCisgICAgcXVl
cnlQYXJhbXM6IG51bGwsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAg
ICAgIHRoaXMubmFtZSA9IHByb3BzLm5hbWU7CisgICAgICB0aGlzLnBpdm90SGFuZGxlciA9IHBy
b3BzLnBpdm90SGFuZGxlcjsKKyAgICAgIHRoaXMuY29udGV4dHMgPSBwcm9wcy5jb250ZXh0cyB8
fCBbXTsKKyAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSBwcm9wcy5xdWVyeVBhcmFtczsKKyAgICB9
LAorCisgICAgYXBwbHlUb1N0YXRlOiBmdW5jdGlvbiAob2xkU3RhdGUsIHJlY29nbml6ZXIsIGdl
dEhhbmRsZXIsIGlzSW50ZXJtZWRpYXRlKSB7CisKKyAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3Mg
PSBfcm91dGVyVXRpbHMuZXh0cmFjdFF1ZXJ5UGFyYW1zKFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlz
LmNvbnRleHRzKSksCisgICAgICAgICAgcHVyZUFyZ3MgPSBwYXJ0aXRpb25lZEFyZ3NbMF0sCisg
ICAgICAgICAgcXVlcnlQYXJhbXMgPSBwYXJ0aXRpb25lZEFyZ3NbMV0sCisgICAgICAgICAgaGFu
ZGxlcnMgPSByZWNvZ25pemVyLmhhbmRsZXJzRm9yKHB1cmVBcmdzWzBdKTsKKworICAgICAgdmFy
IHRhcmdldFJvdXRlTmFtZSA9IGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXI7
CisKKyAgICAgIHJldHVybiB0aGlzLmFwcGx5VG9IYW5kbGVycyhvbGRTdGF0ZSwgaGFuZGxlcnMs
IGdldEhhbmRsZXIsIHRhcmdldFJvdXRlTmFtZSwgaXNJbnRlcm1lZGlhdGUpOworICAgIH0sCisK
KyAgICBhcHBseVRvSGFuZGxlcnM6IGZ1bmN0aW9uIChvbGRTdGF0ZSwgaGFuZGxlcnMsIGdldEhh
bmRsZXIsIHRhcmdldFJvdXRlTmFtZSwgaXNJbnRlcm1lZGlhdGUsIGNoZWNraW5nSWZBY3RpdmUp
IHsKKworICAgICAgdmFyIGksIGxlbjsKKyAgICAgIHZhciBuZXdTdGF0ZSA9IG5ldyBfcm91dGVy
VHJhbnNpdGlvblN0YXRlLmRlZmF1bHQoKTsKKyAgICAgIHZhciBvYmplY3RzID0gdGhpcy5jb250
ZXh0cy5zbGljZSgwKTsKKworICAgICAgdmFyIGludmFsaWRhdGVJbmRleCA9IGhhbmRsZXJzLmxl
bmd0aDsKKworICAgICAgLy8gUGl2b3QgaGFuZGxlcnMgYXJlIHByb3ZpZGVkIGZvciByZWZyZXNo
IHRyYW5zaXRpb25zCisgICAgICBpZiAodGhpcy5waXZvdEhhbmRsZXIpIHsKKyAgICAgICAgZm9y
IChpID0gMCwgbGVuID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAg
ICBpZiAoZ2V0SGFuZGxlcihoYW5kbGVyc1tpXS5oYW5kbGVyKSA9PT0gdGhpcy5waXZvdEhhbmRs
ZXIpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVJbmRleCA9IGk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHBpdm90SGFu
ZGxlckZvdW5kID0gIXRoaXMucGl2b3RIYW5kbGVyOworCisgICAgICBmb3IgKGkgPSBoYW5kbGVy
cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICB2YXIgcmVzdWx0ID0gaGFuZGxl
cnNbaV07CisgICAgICAgIHZhciBuYW1lID0gcmVzdWx0LmhhbmRsZXI7CisgICAgICAgIHZhciBo
YW5kbGVyID0gZ2V0SGFuZGxlcihuYW1lKTsKKworICAgICAgICB2YXIgb2xkSGFuZGxlckluZm8g
PSBvbGRTdGF0ZS5oYW5kbGVySW5mb3NbaV07CisgICAgICAgIHZhciBuZXdIYW5kbGVySW5mbyA9
IG51bGw7CisKKyAgICAgICAgaWYgKHJlc3VsdC5uYW1lcy5sZW5ndGggPiAwKSB7CisgICAgICAg
ICAgaWYgKGkgPj0gaW52YWxpZGF0ZUluZGV4KSB7CisgICAgICAgICAgICBuZXdIYW5kbGVySW5m
byA9IHRoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5mbyhuYW1lLCBoYW5kbGVyLCByZXN1bHQubmFt
ZXMsIG9iamVjdHMsIG9sZEhhbmRsZXJJbmZvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgbmV3SGFuZGxlckluZm8gPSB0aGlzLmdldEhhbmRsZXJJbmZvRm9yRHluYW1pY1NlZ21l
bnQobmFtZSwgaGFuZGxlciwgcmVzdWx0Lm5hbWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5mbywg
dGFyZ2V0Um91dGVOYW1lLCBpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgLy8gVGhpcyByb3V0ZSBoYXMgbm8gZHluYW1pYyBzZWdtZW50LgorICAgICAgICAgIC8v
IFRoZXJlZm9yZSB0cmVhdCBhcyBhIHBhcmFtLWJhc2VkIGhhbmRsZXJJbmZvCisgICAgICAgICAg
Ly8gd2l0aCBlbXB0eSBwYXJhbXMuIFRoaXMgd2lsbCBjYXVzZSB0aGUgYG1vZGVsYAorICAgICAg
ICAgIC8vIGhvb2sgdG8gYmUgY2FsbGVkIHdpdGggZW1wdHkgcGFyYW1zLCB3aGljaCBpcyBkZXNp
cmFibGUuCisgICAgICAgICAgbmV3SGFuZGxlckluZm8gPSB0aGlzLmNyZWF0ZVBhcmFtSGFuZGxl
ckluZm8obmFtZSwgaGFuZGxlciwgcmVzdWx0Lm5hbWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5m
byk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hlY2tpbmdJZkFjdGl2ZSkgeworICAgICAg
ICAgIC8vIElmIHdlJ3JlIHBlcmZvcm1pbmcgYW4gaXNBY3RpdmUgY2hlY2ssIHdlIHdhbnQgdG8K
KyAgICAgICAgICAvLyBzZXJpYWxpemUgVVJMIHBhcmFtcyB3aXRoIHRoZSBwcm92aWRlZCBjb250
ZXh0LCBidXQKKyAgICAgICAgICAvLyBpZ25vcmUgbWlzbWF0Y2hlcyBiZXR3ZWVuIG9sZCBhbmQg
bmV3IGNvbnRleHQuCisgICAgICAgICAgbmV3SGFuZGxlckluZm8gPSBuZXdIYW5kbGVySW5mby5i
ZWNvbWVSZXNvbHZlZChudWxsLCBuZXdIYW5kbGVySW5mby5jb250ZXh0KTsKKyAgICAgICAgICB2
YXIgb2xkQ29udGV4dCA9IG9sZEhhbmRsZXJJbmZvICYmIG9sZEhhbmRsZXJJbmZvLmNvbnRleHQ7
CisgICAgICAgICAgaWYgKHJlc3VsdC5uYW1lcy5sZW5ndGggPiAwICYmIG5ld0hhbmRsZXJJbmZv
LmNvbnRleHQgPT09IG9sZENvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIElmIGNvbnRleHRzIG1h
dGNoIGluIGlzQWN0aXZlIHRlc3QsIGFzc3VtZSBwYXJhbXMgYWxzbyBtYXRjaC4KKyAgICAgICAg
ICAgIC8vIFRoaXMgYWxsb3dzIGZvciBmbGV4aWJpbGl0eSBpbiBub3QgcmVxdWlyaW5nIHRoYXQg
ZXZlcnkgbGFzdAorICAgICAgICAgICAgLy8gaGFuZGxlciBwcm92aWRlIGEgYHNlcmlhbGl6ZWAg
bWV0aG9kCisgICAgICAgICAgICBuZXdIYW5kbGVySW5mby5wYXJhbXMgPSBvbGRIYW5kbGVySW5m
byAmJiBvbGRIYW5kbGVySW5mby5wYXJhbXM7CisgICAgICAgICAgfQorICAgICAgICAgIG5ld0hh
bmRsZXJJbmZvLmNvbnRleHQgPSBvbGRDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgdmFy
IGhhbmRsZXJUb1VzZSA9IG9sZEhhbmRsZXJJbmZvOworICAgICAgICBpZiAoaSA+PSBpbnZhbGlk
YXRlSW5kZXggfHwgbmV3SGFuZGxlckluZm8uc2hvdWxkU3VwZXJjZWRlKG9sZEhhbmRsZXJJbmZv
KSkgeworICAgICAgICAgIGludmFsaWRhdGVJbmRleCA9IE1hdGgubWluKGksIGludmFsaWRhdGVJ
bmRleCk7CisgICAgICAgICAgaGFuZGxlclRvVXNlID0gbmV3SGFuZGxlckluZm87CisgICAgICAg
IH0KKworICAgICAgICBpZiAoaXNJbnRlcm1lZGlhdGUgJiYgIWNoZWNraW5nSWZBY3RpdmUpIHsK
KyAgICAgICAgICBoYW5kbGVyVG9Vc2UgPSBoYW5kbGVyVG9Vc2UuYmVjb21lUmVzb2x2ZWQobnVs
bCwgaGFuZGxlclRvVXNlLmNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgbmV3U3RhdGUu
aGFuZGxlckluZm9zLnVuc2hpZnQoaGFuZGxlclRvVXNlKTsKKyAgICAgIH0KKworICAgICAgaWYg
KG9iamVjdHMubGVuZ3RoID4gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk1vcmUgY29u
dGV4dCBvYmplY3RzIHdlcmUgcGFzc2VkIHRoYW4gdGhlcmUgYXJlIGR5bmFtaWMgc2VnbWVudHMg
Zm9yIHRoZSByb3V0ZTogIiArIHRhcmdldFJvdXRlTmFtZSk7CisgICAgICB9CisKKyAgICAgIGlm
ICghaXNJbnRlcm1lZGlhdGUpIHsKKyAgICAgICAgdGhpcy5pbnZhbGlkYXRlQ2hpbGRyZW4obmV3
U3RhdGUuaGFuZGxlckluZm9zLCBpbnZhbGlkYXRlSW5kZXgpOworICAgICAgfQorCisgICAgICBf
cm91dGVyVXRpbHMubWVyZ2UobmV3U3RhdGUucXVlcnlQYXJhbXMsIHRoaXMucXVlcnlQYXJhbXMg
fHwge30pOworCisgICAgICByZXR1cm4gbmV3U3RhdGU7CisgICAgfSwKKworICAgIGludmFsaWRh
dGVDaGlsZHJlbjogZnVuY3Rpb24gKGhhbmRsZXJJbmZvcywgaW52YWxpZGF0ZUluZGV4KSB7Cisg
ICAgICBmb3IgKHZhciBpID0gaW52YWxpZGF0ZUluZGV4LCBsID0gaGFuZGxlckluZm9zLmxlbmd0
aDsgaSA8IGw7ICsraSkgeworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3Nb
aV07CisgICAgICAgIGhhbmRsZXJJbmZvc1tpXSA9IGhhbmRsZXJJbmZvc1tpXS5nZXRVbnJlc29s
dmVkKCk7CisgICAgICB9CisgICAgfSwKKworICAgIGdldEhhbmRsZXJJbmZvRm9yRHluYW1pY1Nl
Z21lbnQ6IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyLCBuYW1lcywgb2JqZWN0cywgb2xkSGFuZGxl
ckluZm8sIHRhcmdldFJvdXRlTmFtZSwgaSkgeworCisgICAgICB2YXIgbnVtTmFtZXMgPSBuYW1l
cy5sZW5ndGg7CisgICAgICB2YXIgb2JqZWN0VG9Vc2U7CisgICAgICBpZiAob2JqZWN0cy5sZW5n
dGggPiAwKSB7CisKKyAgICAgICAgLy8gVXNlIHRoZSBvYmplY3RzIHByb3ZpZGVkIGZvciB0aGlz
IHRyYW5zaXRpb24uCisgICAgICAgIG9iamVjdFRvVXNlID0gb2JqZWN0c1tvYmplY3RzLmxlbmd0
aCAtIDFdOworICAgICAgICBpZiAoX3JvdXRlclV0aWxzLmlzUGFyYW0ob2JqZWN0VG9Vc2UpKSB7
CisgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5mbyhuYW1lLCBoYW5k
bGVyLCBuYW1lcywgb2JqZWN0cywgb2xkSGFuZGxlckluZm8pOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgIG9iamVjdHMucG9wKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob2xk
SGFuZGxlckluZm8gJiYgb2xkSGFuZGxlckluZm8ubmFtZSA9PT0gbmFtZSkgeworICAgICAgICAv
LyBSZXVzZSB0aGUgbWF0Y2hpbmcgb2xkSGFuZGxlckluZm8KKyAgICAgICAgcmV0dXJuIG9sZEhh
bmRsZXJJbmZvOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRoaXMucHJlVHJhbnNpdGlv
blN0YXRlKSB7CisgICAgICAgICAgdmFyIHByZVRyYW5zaXRpb25IYW5kbGVySW5mbyA9IHRoaXMu
cHJlVHJhbnNpdGlvblN0YXRlLmhhbmRsZXJJbmZvc1tpXTsKKyAgICAgICAgICBvYmplY3RUb1Vz
ZSA9IHByZVRyYW5zaXRpb25IYW5kbGVySW5mbyAmJiBwcmVUcmFuc2l0aW9uSGFuZGxlckluZm8u
Y29udGV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJZGVhbGx5IHdlIHNob3Vs
ZCB0aHJvdyB0aGlzIGVycm9yIHRvIHByb3ZpZGUgbWF4aW1hbAorICAgICAgICAgIC8vIGluZm9y
bWF0aW9uIHRvIHRoZSB1c2VyIHRoYXQgbm90IGVub3VnaCBjb250ZXh0IG9iamVjdHMKKyAgICAg
ICAgICAvLyB3ZXJlIHByb3ZpZGVkLCBidXQgdGhpcyBwcm92ZXMgdG9vIGN1bWJlcnNvbWUgaW4g
RW1iZXIKKyAgICAgICAgICAvLyBpbiBjYXNlcyB3aGVyZSBpbm5lciB0ZW1wbGF0ZSBoZWxwZXJz
IGFyZSBldmFsdWF0ZWQKKyAgICAgICAgICAvLyBiZWZvcmUgcGFyZW50IGhlbHBlcnMgdW4tcmVu
ZGVyLCBpbiB3aGljaCBjYXNlcyB0aGlzCisgICAgICAgICAgLy8gZXJyb3Igc29tZXdoYXQgcHJl
bWF0dXJlbHkgZmlyZXMuCisgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoIk5vdCBlbm91Z2gg
Y29udGV4dCBvYmplY3RzIHdlcmUgcHJvdmlkZWQgdG8gY29tcGxldGUgYSB0cmFuc2l0aW9uIHRv
ICIgKyB0YXJnZXRSb3V0ZU5hbWUgKyAiLiBTcGVjaWZpY2FsbHksIHRoZSAiICsgbmFtZSArICIg
cm91dGUgbmVlZHMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgaW50byBpdHMgZHlu
YW1pYyBVUkwgc2VnbWVudHMgWyIgKyBuYW1lcy5qb2luKCcsICcpICsgIl0iKTsKKyAgICAgICAg
ICByZXR1cm4gb2xkSGFuZGxlckluZm87CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0
dXJuIF9yb3V0ZXJIYW5kbGVySW5mb0ZhY3RvcnkuZGVmYXVsdCgnb2JqZWN0JywgeworICAgICAg
ICBuYW1lOiBuYW1lLAorICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgICAgICBjb250ZXh0
OiBvYmplY3RUb1VzZSwKKyAgICAgICAgbmFtZXM6IG5hbWVzCisgICAgICB9KTsKKyAgICB9LAor
CisgICAgY3JlYXRlUGFyYW1IYW5kbGVySW5mbzogZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIsIG5h
bWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5mbykgeworICAgICAgdmFyIHBhcmFtcyA9IHt9Owor
CisgICAgICAvLyBTb2FrIHVwIGFsbCB0aGUgcHJvdmlkZWQgc3RyaW5nL251bWJlcnMKKyAgICAg
IHZhciBudW1OYW1lcyA9IG5hbWVzLmxlbmd0aDsKKyAgICAgIHdoaWxlIChudW1OYW1lcy0tKSB7
CisKKyAgICAgICAgLy8gT25seSB1c2Ugb2xkIHBhcmFtcyBpZiB0aGUgbmFtZXMgbWF0Y2ggd2l0
aCB0aGUgbmV3IGhhbmRsZXIKKyAgICAgICAgdmFyIG9sZFBhcmFtcyA9IG9sZEhhbmRsZXJJbmZv
ICYmIG5hbWUgPT09IG9sZEhhbmRsZXJJbmZvLm5hbWUgJiYgb2xkSGFuZGxlckluZm8ucGFyYW1z
IHx8IHt9OworCisgICAgICAgIHZhciBwZWVrID0gb2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFd
OworICAgICAgICB2YXIgcGFyYW1OYW1lID0gbmFtZXNbbnVtTmFtZXNdOworICAgICAgICBpZiAo
X3JvdXRlclV0aWxzLmlzUGFyYW0ocGVlaykpIHsKKyAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1l
XSA9ICIiICsgb2JqZWN0cy5wb3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJ
ZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIG9ubHkgc29tZSBvZiB0aGUgcGFyYW1zCisgICAgICAg
ICAgLy8gd2VyZSBzdHJpbmcvbnVtYmVyIHBhcmFtcywgc28gdHJ5IGFuZCB1c2UgYSBwYXJhbQor
ICAgICAgICAgIC8vIHZhbHVlIGZyb20gYSBwcmV2aW91cyBoYW5kbGVyLgorICAgICAgICAgIGlm
IChvbGRQYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSkgeworICAgICAgICAgICAgcGFy
YW1zW3BhcmFtTmFtZV0gPSBvbGRQYXJhbXNbcGFyYW1OYW1lXTsKKyAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3UgZGlkbid0IHByb3ZpZGUgZW5vdWdo
IHN0cmluZy9udW1lcmljIHBhcmFtZXRlcnMgdG8gc2F0aXNmeSBhbGwgb2YgdGhlIGR5bmFtaWMg
c2VnbWVudHMgZm9yIHJvdXRlICIgKyBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIF9yb3V0ZXJIYW5kbGVySW5mb0ZhY3RvcnkuZGVmYXVsdCgn
cGFyYW0nLCB7CisgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIs
CisgICAgICAgIHBhcmFtczogcGFyYW1zCisgICAgICB9KTsKKyAgICB9CisgIH0pOworfSk7Citl
bmlmZWQoJ3JvdXRlci90cmFuc2l0aW9uLWludGVudC91cmwtdHJhbnNpdGlvbi1pbnRlbnQnLCBb
J2V4cG9ydHMnLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFuc2l0aW9u
LXN0YXRlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScsICdyb3V0ZXIvdXRpbHMnLCAn
cm91dGVyL3VucmVjb2duaXplZC11cmwtZXJyb3InXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0
ZXJUcmFuc2l0aW9uSW50ZW50LCBfcm91dGVyVHJhbnNpdGlvblN0YXRlLCBfcm91dGVySGFuZGxl
ckluZm9GYWN0b3J5LCBfcm91dGVyVXRpbHMsIF9yb3V0ZXJVbnJlY29nbml6ZWRVcmxFcnJvcikg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX3JvdXRlclV0aWxzLnN1
YmNsYXNzKF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50LmRlZmF1bHQsIHsKKyAgICB1cmw6IG51bGws
CisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAgICAgIHRoaXMudXJsID0g
cHJvcHMudXJsOworICAgIH0sCisKKyAgICBhcHBseVRvU3RhdGU6IGZ1bmN0aW9uIChvbGRTdGF0
ZSwgcmVjb2duaXplciwgZ2V0SGFuZGxlcikgeworICAgICAgdmFyIG5ld1N0YXRlID0gbmV3IF9y
b3V0ZXJUcmFuc2l0aW9uU3RhdGUuZGVmYXVsdCgpOworCisgICAgICB2YXIgcmVzdWx0cyA9IHJl
Y29nbml6ZXIucmVjb2duaXplKHRoaXMudXJsKSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHt9
LAorICAgICAgICAgIGksCisgICAgICAgICAgbGVuOworCisgICAgICBpZiAoIXJlc3VsdHMpIHsK
KyAgICAgICAgdGhyb3cgbmV3IF9yb3V0ZXJVbnJlY29nbml6ZWRVcmxFcnJvci5kZWZhdWx0KHRo
aXMudXJsKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN0YXRlc0RpZmZlciA9IGZhbHNlOworCisg
ICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7Cisg
ICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzW2ldOworICAgICAgICB2YXIgbmFtZSA9IHJlc3Vs
dC5oYW5kbGVyOworICAgICAgICB2YXIgaGFuZGxlciA9IGdldEhhbmRsZXIobmFtZSk7CisKKyAg
ICAgICAgaWYgKGhhbmRsZXIuaW5hY2Nlc3NpYmxlQnlVUkwpIHsKKyAgICAgICAgICB0aHJvdyBu
ZXcgX3JvdXRlclVucmVjb2duaXplZFVybEVycm9yLmRlZmF1bHQodGhpcy51cmwpOworICAgICAg
ICB9CisKKyAgICAgICAgdmFyIG5ld0hhbmRsZXJJbmZvID0gX3JvdXRlckhhbmRsZXJJbmZvRmFj
dG9yeS5kZWZhdWx0KCdwYXJhbScsIHsKKyAgICAgICAgICBuYW1lOiBuYW1lLAorICAgICAgICAg
IGhhbmRsZXI6IGhhbmRsZXIsCisgICAgICAgICAgcGFyYW1zOiByZXN1bHQucGFyYW1zCisgICAg
ICAgIH0pOworCisgICAgICAgIHZhciBvbGRIYW5kbGVySW5mbyA9IG9sZFN0YXRlLmhhbmRsZXJJ
bmZvc1tpXTsKKyAgICAgICAgaWYgKHN0YXRlc0RpZmZlciB8fCBuZXdIYW5kbGVySW5mby5zaG91
bGRTdXBlcmNlZGUob2xkSGFuZGxlckluZm8pKSB7CisgICAgICAgICAgc3RhdGVzRGlmZmVyID0g
dHJ1ZTsKKyAgICAgICAgICBuZXdTdGF0ZS5oYW5kbGVySW5mb3NbaV0gPSBuZXdIYW5kbGVySW5m
bzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXdTdGF0ZS5oYW5kbGVySW5mb3NbaV0g
PSBvbGRIYW5kbGVySW5mbzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBfcm91dGVyVXRp
bHMubWVyZ2UobmV3U3RhdGUucXVlcnlQYXJhbXMsIHJlc3VsdHMucXVlcnlQYXJhbXMpOworCisg
ICAgICByZXR1cm4gbmV3U3RhdGU7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdyb3V0ZXIv
dHJhbnNpdGlvbi1zdGF0ZScsIFsnZXhwb3J0cycsICdyb3V0ZXIvaGFuZGxlci1pbmZvJywgJ3Jv
dXRlci91dGlscycsICdyc3ZwL3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJI
YW5kbGVySW5mbywgX3JvdXRlclV0aWxzLCBfcnN2cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGZ1bmN0aW9uIFRyYW5zaXRpb25TdGF0ZShvdGhlcikgeworICAgIHRoaXMuaGFuZGxl
ckluZm9zID0gW107CisgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9OworICAgIHRoaXMucGFyYW1z
ID0ge307CisgIH0KKworICBUcmFuc2l0aW9uU3RhdGUucHJvdG90eXBlID0geworICAgIGhhbmRs
ZXJJbmZvczogbnVsbCwKKyAgICBxdWVyeVBhcmFtczogbnVsbCwKKyAgICBwYXJhbXM6IG51bGws
CisKKyAgICBwcm9taXNlTGFiZWw6IGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgdmFyIHRhcmdl
dE5hbWUgPSAnJzsKKyAgICAgIF9yb3V0ZXJVdGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlckluZm9z
LCBmdW5jdGlvbiAoaGFuZGxlckluZm8pIHsKKyAgICAgICAgaWYgKHRhcmdldE5hbWUgIT09ICcn
KSB7CisgICAgICAgICAgdGFyZ2V0TmFtZSArPSAnLic7CisgICAgICAgIH0KKyAgICAgICAgdGFy
Z2V0TmFtZSArPSBoYW5kbGVySW5mby5uYW1lOworICAgICAgfSk7CisgICAgICByZXR1cm4gX3Jv
dXRlclV0aWxzLnByb21pc2VMYWJlbCgiJyIgKyB0YXJnZXROYW1lICsgIic6ICIgKyBsYWJlbCk7
CisgICAgfSwKKworICAgIHJlc29sdmU6IGZ1bmN0aW9uIChzaG91bGRDb250aW51ZSwgcGF5bG9h
ZCkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgLy8gRmlyc3QsIGNhbGN1bGF0ZSBw
YXJhbXMgZm9yIHRoaXMgc3RhdGUuIFRoaXMgaXMgdXNlZnVsCisgICAgICAvLyBpbmZvcm1hdGlv
biB0byBwcm92aWRlIHRvIHRoZSB2YXJpb3VzIHJvdXRlIGhvb2tzLgorICAgICAgdmFyIHBhcmFt
cyA9IHRoaXMucGFyYW1zOworICAgICAgX3JvdXRlclV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVy
SW5mb3MsIGZ1bmN0aW9uIChoYW5kbGVySW5mbykgeworICAgICAgICBwYXJhbXNbaGFuZGxlcklu
Zm8ubmFtZV0gPSBoYW5kbGVySW5mby5wYXJhbXMgfHwge307CisgICAgICB9KTsKKworICAgICAg
cGF5bG9hZCA9IHBheWxvYWQgfHwge307CisgICAgICBwYXlsb2FkLnJlc29sdmVJbmRleCA9IDA7
CisKKyAgICAgIHZhciBjdXJyZW50U3RhdGUgPSB0aGlzOworICAgICAgdmFyIHdhc0Fib3J0ZWQg
PSBmYWxzZTsKKworICAgICAgLy8gVGhlIHByZWx1ZGUgUlNWUC5yZXNvbHZlKCkgYXN5bmNzIHVz
IGludG8gdGhlIHByb21pc2UgbGFuZC4KKyAgICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVmYXVs
dC5yZXNvbHZlKG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJTdGFydCB0cmFuc2l0aW9uIikpLnRo
ZW4ocmVzb2x2ZU9uZUhhbmRsZXJJbmZvLCBudWxsLCB0aGlzLnByb21pc2VMYWJlbCgnUmVzb2x2
ZSBoYW5kbGVyJykpWydjYXRjaCddKGhhbmRsZUVycm9yLCB0aGlzLnByb21pc2VMYWJlbCgnSGFu
ZGxlIGVycm9yJykpOworCisgICAgICBmdW5jdGlvbiBpbm5lclNob3VsZENvbnRpbnVlKCkgewor
ICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2ZShzaG91bGRDb250aW51
ZSgpLCBjdXJyZW50U3RhdGUucHJvbWlzZUxhYmVsKCJDaGVjayBpZiBzaG91bGQgY29udGludWUi
KSlbJ2NhdGNoJ10oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIC8vIFdlIGRpc3Rpbmd1
aXNoIGJldHdlZW4gZXJyb3JzIHRoYXQgb2NjdXJyZWQKKyAgICAgICAgICAvLyBkdXJpbmcgcmVz
b2x1dGlvbiAoZS5nLiBiZWZvcmVNb2RlbC9tb2RlbC9hZnRlck1vZGVsKSwKKyAgICAgICAgICAv
LyBhbmQgYWJvcnRzIGR1ZSB0byBhIHJlamVjdGluZyBwcm9taXNlIGZyb20gc2hvdWxkQ29udGlu
dWUoKS4KKyAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gX3Jz
dnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KHJlYXNvbik7CisgICAgICAgIH0sIGN1cnJlbnRTdGF0
ZS5wcm9taXNlTGFiZWwoIkhhbmRsZSBhYm9ydCIpKTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rp
b24gaGFuZGxlRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwb3Nz
aWJsZQorICAgICAgICAvLyByZWplY3QgdmFsdWUgb2YgVHJhbnNpdGlvblN0YXRlI3Jlc29sdmUK
KyAgICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IGN1cnJlbnRTdGF0ZS5oYW5kbGVySW5mb3M7Cisg
ICAgICAgIHZhciBlcnJvckhhbmRsZXJJbmRleCA9IHBheWxvYWQucmVzb2x2ZUluZGV4ID49IGhh
bmRsZXJJbmZvcy5sZW5ndGggPyBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMSA6IHBheWxvYWQucmVz
b2x2ZUluZGV4OworICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KHsK
KyAgICAgICAgICBlcnJvcjogZXJyb3IsCisgICAgICAgICAgaGFuZGxlcldpdGhFcnJvcjogY3Vy
cmVudFN0YXRlLmhhbmRsZXJJbmZvc1tlcnJvckhhbmRsZXJJbmRleF0uaGFuZGxlciwKKyAgICAg
ICAgICB3YXNBYm9ydGVkOiB3YXNBYm9ydGVkLAorICAgICAgICAgIHN0YXRlOiBjdXJyZW50U3Rh
dGUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHByb2NlZWQocmVzb2x2
ZWRIYW5kbGVySW5mbykgeworICAgICAgICB2YXIgd2FzQWxyZWFkeVJlc29sdmVkID0gY3VycmVu
dFN0YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleF0uaXNSZXNvbHZlZDsKKwor
ICAgICAgICAvLyBTd2FwIHRoZSBwcmV2aW91c2x5IHVucmVzb2x2ZWQgaGFuZGxlckluZm8gd2l0
aAorICAgICAgICAvLyB0aGUgcmVzb2x2ZWQgaGFuZGxlckluZm8KKyAgICAgICAgY3VycmVudFN0
YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleCsrXSA9IHJlc29sdmVkSGFuZGxl
ckluZm87CisKKyAgICAgICAgaWYgKCF3YXNBbHJlYWR5UmVzb2x2ZWQpIHsKKyAgICAgICAgICAv
LyBDYWxsIHRoZSByZWRpcmVjdCBob29rLiBUaGUgcmVhc29uIHdlIGNhbGwgaXQgaGVyZQorICAg
ICAgICAgIC8vIHZzLiBhZnRlck1vZGVsIGlzIHNvIHRoYXQgcmVkaXJlY3RzIGludG8gY2hpbGQK
KyAgICAgICAgICAvLyByb3V0ZXMgZG9uJ3QgcmUtcnVuIHRoZSBtb2RlbCBob29rcyBmb3IgdGhp
cworICAgICAgICAgIC8vIGFscmVhZHktcmVzb2x2ZWQgcm91dGUuCisgICAgICAgICAgdmFyIGhh
bmRsZXIgPSByZXNvbHZlZEhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAgICAgICAgX3JvdXRlclV0
aWxzLmNhbGxIb29rKGhhbmRsZXIsICdyZWRpcmVjdCcsIHJlc29sdmVkSGFuZGxlckluZm8uY29u
dGV4dCwgcGF5bG9hZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIGFmdGVyIGVu
c3VyaW5nIHRoYXQgdGhlIHJlZGlyZWN0IGhvb2sKKyAgICAgICAgLy8gZGlkbid0IGFib3J0IHRo
aXMgdHJhbnNpdGlvbiBieSB0cmFuc2l0aW9uaW5nIGVsc2V3aGVyZS4KKyAgICAgICAgcmV0dXJu
IGlubmVyU2hvdWxkQ29udGludWUoKS50aGVuKHJlc29sdmVPbmVIYW5kbGVySW5mbywgbnVsbCwg
Y3VycmVudFN0YXRlLnByb21pc2VMYWJlbCgnUmVzb2x2ZSBoYW5kbGVyJykpOworICAgICAgfQor
CisgICAgICBmdW5jdGlvbiByZXNvbHZlT25lSGFuZGxlckluZm8oKSB7CisgICAgICAgIGlmIChw
YXlsb2FkLnJlc29sdmVJbmRleCA9PT0gY3VycmVudFN0YXRlLmhhbmRsZXJJbmZvcy5sZW5ndGgp
IHsKKyAgICAgICAgICAvLyBUaGlzIGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlCisgICAgICAgICAg
Ly8gZnVsZmlsbCB2YWx1ZSBvZiBUcmFuc2l0aW9uU3RhdGUjcmVzb2x2ZQorICAgICAgICAgIHJl
dHVybiB7CisgICAgICAgICAgICBlcnJvcjogbnVsbCwKKyAgICAgICAgICAgIHN0YXRlOiBjdXJy
ZW50U3RhdGUKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXJJ
bmZvID0gY3VycmVudFN0YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleF07CisK
KyAgICAgICAgcmV0dXJuIGhhbmRsZXJJbmZvLnJlc29sdmUoaW5uZXJTaG91bGRDb250aW51ZSwg
cGF5bG9hZCkudGhlbihwcm9jZWVkLCBudWxsLCBjdXJyZW50U3RhdGUucHJvbWlzZUxhYmVsKCdQ
cm9jZWVkJykpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBU
cmFuc2l0aW9uU3RhdGU7Cit9KTsKK2VuaWZlZCgncm91dGVyL3RyYW5zaXRpb24nLCBbJ2V4cG9y
dHMnLCAncnN2cC9wcm9taXNlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91dGVyL3V0aWxz
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yb3V0ZXJIYW5kbGVySW5mbywg
X3JvdXRlclV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBBIFRyYW5zaXRp
b24gaXMgYSB0aGVubmFibGUgKGEgcHJvbWlzZS1saWtlIG9iamVjdCkgdGhhdCByZXByZXNlbnRz
CisgICAgYW4gYXR0ZW1wdCB0byB0cmFuc2l0aW9uIHRvIGFub3RoZXIgcm91dGUuIEl0IGNhbiBi
ZSBhYm9ydGVkLCBlaXRoZXIKKyAgICBleHBsaWNpdGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVt
cHRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxlIGEKKyAgICBwcmV2aW91cyBvbmUgaXMgc3Rp
bGwgdW5kZXJ3YXkuIEFuIGFib3J0ZWQgdHJhbnNpdGlvbiBjYW4gYWxzbworICAgIGJlIGByZXRy
eSgpYGQgbGF0ZXIuCisgIAorICAgIEBjbGFzcyBUcmFuc2l0aW9uCisgICAgQGNvbnN0cnVjdG9y
CisgICAgQHBhcmFtIHtPYmplY3R9IHJvdXRlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBpbnRlbnQK
KyAgICBAcGFyYW0ge09iamVjdH0gc3RhdGUKKyAgICBAcGFyYW0ge09iamVjdH0gZXJyb3IKKyAg
ICBAcHJpdmF0ZQorICAgKi8KKyAgZnVuY3Rpb24gVHJhbnNpdGlvbihyb3V0ZXIsIGludGVudCwg
c3RhdGUsIGVycm9yKSB7CisgICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzOworICAgIHRoaXMuc3Rh
dGUgPSBzdGF0ZSB8fCByb3V0ZXIuc3RhdGU7CisgICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7Cisg
ICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXI7CisgICAgdGhpcy5kYXRhID0gdGhpcy5pbnRlbnQgJiYg
dGhpcy5pbnRlbnQuZGF0YSB8fCB7fTsKKyAgICB0aGlzLnJlc29sdmVkTW9kZWxzID0ge307Cisg
ICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9OworCisgICAgaWYgKGVycm9yKSB7CisgICAgICB0aGlz
LnByb21pc2UgPSBfcnN2cFByb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpOworICAgICAgdGhp
cy5lcnJvciA9IGVycm9yOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZSkg
eworICAgICAgdGhpcy5wYXJhbXMgPSBzdGF0ZS5wYXJhbXM7CisgICAgICB0aGlzLnF1ZXJ5UGFy
YW1zID0gc3RhdGUucXVlcnlQYXJhbXM7CisgICAgICB0aGlzLmhhbmRsZXJJbmZvcyA9IHN0YXRl
LmhhbmRsZXJJbmZvczsKKworICAgICAgdmFyIGxlbiA9IHN0YXRlLmhhbmRsZXJJbmZvcy5sZW5n
dGg7CisgICAgICBpZiAobGVuKSB7CisgICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHN0YXRlLmhh
bmRsZXJJbmZvc1tsZW4gLSAxXS5uYW1lOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHN0YXRlLmhhbmRs
ZXJJbmZvc1tpXTsKKworICAgICAgICAvLyBUT0RPOiB0aGlzIGFsbCBzZWVtcyBoYWNreQorICAg
ICAgICBpZiAoIWhhbmRsZXJJbmZvLmlzUmVzb2x2ZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICB0aGlzLnBpdm90SGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7
CisgICAgICB9CisKKyAgICAgIHRoaXMuc2VxdWVuY2UgPSBUcmFuc2l0aW9uLmN1cnJlbnRTZXF1
ZW5jZSsrOworICAgICAgdGhpcy5wcm9taXNlID0gc3RhdGUucmVzb2x2ZShjaGVja0ZvckFib3J0
LCB0aGlzKVsnY2F0Y2gnXShmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQu
d2FzQWJvcnRlZCB8fCB0cmFuc2l0aW9uLmlzQWJvcnRlZCkgeworICAgICAgICAgIHJldHVybiBf
cnN2cFByb21pc2UuZGVmYXVsdC5yZWplY3QobG9nQWJvcnQodHJhbnNpdGlvbikpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zaXRpb24udHJpZ2dlcignZXJyb3InLCByZXN1bHQu
ZXJyb3IsIHRyYW5zaXRpb24sIHJlc3VsdC5oYW5kbGVyV2l0aEVycm9yKTsKKyAgICAgICAgICB0
cmFuc2l0aW9uLmFib3J0KCk7CisgICAgICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0
LnJlamVjdChyZXN1bHQuZXJyb3IpOworICAgICAgICB9CisgICAgICB9LCBfcm91dGVyVXRpbHMu
cHJvbWlzZUxhYmVsKCdIYW5kbGUgQWJvcnQnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMu
cHJvbWlzZSA9IF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGhpcy5zdGF0ZSk7CisgICAg
ICB0aGlzLnBhcmFtcyA9IHt9OworICAgIH0KKworICAgIGZ1bmN0aW9uIGNoZWNrRm9yQWJvcnQo
KSB7CisgICAgICBpZiAodHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIF9y
c3ZwUHJvbWlzZS5kZWZhdWx0LnJlamVjdCh1bmRlZmluZWQsIF9yb3V0ZXJVdGlscy5wcm9taXNl
TGFiZWwoIlRyYW5zaXRpb24gYWJvcnRlZCAtIHJlamVjdCIpKTsKKyAgICAgIH0KKyAgICB9Cisg
IH0KKworICBUcmFuc2l0aW9uLmN1cnJlbnRTZXF1ZW5jZSA9IDA7CisKKyAgVHJhbnNpdGlvbi5w
cm90b3R5cGUgPSB7CisgICAgdGFyZ2V0TmFtZTogbnVsbCwKKyAgICB1cmxNZXRob2Q6ICd1cGRh
dGUnLAorICAgIGludGVudDogbnVsbCwKKyAgICBwYXJhbXM6IG51bGwsCisgICAgcGl2b3RIYW5k
bGVyOiBudWxsLAorICAgIHJlc29sdmVJbmRleDogMCwKKyAgICBoYW5kbGVySW5mb3M6IG51bGws
CisgICAgcmVzb2x2ZWRNb2RlbHM6IG51bGwsCisgICAgaXNBY3RpdmU6IHRydWUsCisgICAgc3Rh
dGU6IG51bGwsCisgICAgcXVlcnlQYXJhbXNPbmx5OiBmYWxzZSwKKworICAgIGlzVHJhbnNpdGlv
bjogdHJ1ZSwKKworICAgIGlzRXhpdGluZzogZnVuY3Rpb24gKGhhbmRsZXIpIHsKKyAgICAgIHZh
ciBoYW5kbGVySW5mb3MgPSB0aGlzLmhhbmRsZXJJbmZvczsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCBsZW4gPSBoYW5kbGVySW5mb3MubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgdmFy
IGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgICBpZiAoaGFuZGxlckluZm8u
bmFtZSA9PT0gaGFuZGxlciB8fCBoYW5kbGVySW5mby5oYW5kbGVyID09PSBoYW5kbGVyKSB7Cisg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGUgVHJhbnNpdGlvbidzIGludGVybmFs
IHByb21pc2UuIENhbGxpbmcgYC50aGVuYCBvbiB0aGlzIHByb3BlcnR5CisgICAgICBpcyB0aGF0
IHNhbWUgYXMgY2FsbGluZyBgLnRoZW5gIG9uIHRoZSBUcmFuc2l0aW9uIG9iamVjdCBpdHNlbGYs
IGJ1dAorICAgICAgdGhpcyBwcm9wZXJ0eSBpcyBleHBvc2VkIGZvciB3aGVuIHlvdSB3YW50IHRv
IHBhc3MgYXJvdW5kIGEKKyAgICAgIFRyYW5zaXRpb24ncyBwcm9taXNlLCBidXQgbm90IHRoZSBU
cmFuc2l0aW9uIG9iamVjdCBpdHNlbGYsIHNpbmNlCisgICAgICBUcmFuc2l0aW9uIG9iamVjdCBj
YW4gYmUgZXh0ZXJuYWxseSBgYWJvcnRgZWQsIHdoaWxlIHRoZSBwcm9taXNlCisgICAgICBjYW5u
b3QuCisgICAgICAgQHByb3BlcnR5IHByb21pc2UKKyAgICAgIEB0eXBlIHtPYmplY3R9CisgICAg
ICBAcHVibGljCisgICAgICovCisgICAgcHJvbWlzZTogbnVsbCwKKworICAgIC8qKgorICAgICAg
Q3VzdG9tIHN0YXRlIGNhbiBiZSBzdG9yZWQgb24gYSBUcmFuc2l0aW9uJ3MgYGRhdGFgIG9iamVj
dC4KKyAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVjb3JhdGluZyBhIFRyYW5zaXRpb24g
d2l0aGluIGFuIGVhcmxpZXIKKyAgICAgIGhvb2sgYW5kIHNoYXJlZCB3aXRoIGEgbGF0ZXIgaG9v
ay4gUHJvcGVydGllcyBzZXQgb24gYGRhdGFgIHdpbGwKKyAgICAgIGJlIGNvcGllZCB0byBuZXcg
dHJhbnNpdGlvbnMgZ2VuZXJhdGVkIGJ5IGNhbGxpbmcgYHJldHJ5YCBvbiB0aGlzCisgICAgICB0
cmFuc2l0aW9uLgorICAgICAKKyAgICAgIEBwcm9wZXJ0eSBkYXRhCisgICAgICBAdHlwZSB7T2Jq
ZWN0fQorICAgICAgQHB1YmxpYworICAgICAqLworICAgIGRhdGE6IG51bGwsCisKKyAgICAvKioK
KyAgICAgIEEgc3RhbmRhcmQgcHJvbWlzZSBob29rIHRoYXQgcmVzb2x2ZXMgaWYgdGhlIHRyYW5z
aXRpb24KKyAgICAgIHN1Y2NlZWRzIGFuZCByZWplY3RzIGlmIGl0IGZhaWxzL3JlZGlyZWN0cy9h
Ym9ydHMuCisgICAgICAgRm9yd2FyZHMgdG8gdGhlIGludGVybmFsIGBwcm9taXNlYCBwcm9wZXJ0
eSB3aGljaCB5b3UgY2FuCisgICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0
byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKKyAgICAgIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24g
aXRzZWxmLgorICAgICAgIEBtZXRob2QgdGhlbgorICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25G
dWxmaWxsZWQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWQKKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNl
LgorICAgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAg
ICAgIEBwdWJsaWMKKyAgICAgKi8KKyAgICB0aGVuOiBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9u
UmVqZWN0ZWQsIGxhYmVsKSB7CisgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25GdWxm
aWxsZWQsIG9uUmVqZWN0ZWQsIGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgRm9y
d2FyZHMgdG8gdGhlIGludGVybmFsIGBwcm9taXNlYCBwcm9wZXJ0eSB3aGljaCB5b3UgY2FuCisg
ICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRo
ZW5uYWJsZSwKKyAgICAgIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24gaXRzZWxmLgorICAgICAgIEBt
ZXRob2QgY2F0Y2gKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCisgICAgICBA
cGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJv
bWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAgIEByZXR1cm4ge1Byb21pc2V9
CisgICAgICBAcHVibGljCisgICAgICovCisgICAgY2F0Y2g6IGZ1bmN0aW9uIChvblJlamVjdGlv
biwgbGFiZWwpIHsKKyAgICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2gob25SZWplY3Rpb24s
IGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgRm9yd2FyZHMgdG8gdGhlIGludGVy
bmFsIGBwcm9taXNlYCBwcm9wZXJ0eSB3aGljaCB5b3UgY2FuCisgICAgICB1c2UgaW4gc2l0dWF0
aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKKyAgICAgIGJ1
dCBub3QgdGhlIFRyYW5zaXRpb24gaXRzZWxmLgorICAgICAgIEBtZXRob2QgZmluYWxseQorICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJl
bCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAgICAgVXNlZnVs
IGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgICAgIEBwdWJsaWMKKyAg
ICAgKi8KKyAgICBmaW5hbGx5OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGxhYmVsKSB7CisgICAgICBy
ZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoY2FsbGJhY2ssIGxhYmVsKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBBYm9ydHMgdGhlIFRyYW5zaXRpb24uIE5vdGUgeW91IGNhbiBhbHNvIGlt
cGxpY2l0bHkgYWJvcnQgYSB0cmFuc2l0aW9uCisgICAgICBieSBpbml0aWF0aW5nIGFub3RoZXIg
dHJhbnNpdGlvbiB3aGlsZSBhIHByZXZpb3VzIG9uZSBpcyB1bmRlcndheS4KKyAgICAgICBAbWV0
aG9kIGFib3J0CisgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KKyAg
ICAgIEBwdWJsaWMKKyAgICAgKi8KKyAgICBhYm9ydDogZnVuY3Rpb24gKCkgeworICAgICAgaWYg
KHRoaXMuaXNBYm9ydGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAg
X3JvdXRlclV0aWxzLmxvZyh0aGlzLnJvdXRlciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJnZXRO
YW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJvcnRlZCIpOworICAgICAgdGhpcy5pbnRlbnQucHJl
VHJhbnNpdGlvblN0YXRlID0gdGhpcy5yb3V0ZXIuc3RhdGU7CisgICAgICB0aGlzLmlzQWJvcnRl
ZCA9IHRydWU7CisgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICB0aGlzLnJvdXRl
ci5hY3RpdmVUcmFuc2l0aW9uID0gbnVsbDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgICBSZXRyaWVzIGEgcHJldmlvdXNseS1hYm9ydGVkIHRyYW5zaXRpb24g
KG1ha2luZyBzdXJlIHRvIGFib3J0IHRoZQorICAgICAgdHJhbnNpdGlvbiBpZiBpdCdzIHN0aWxs
IGFjdGl2ZSkuIFJldHVybnMgYSBuZXcgdHJhbnNpdGlvbiB0aGF0CisgICAgICByZXByZXNlbnRz
IHRoZSBuZXcgYXR0ZW1wdCB0byB0cmFuc2l0aW9uLgorICAgICAgIEBtZXRob2QgcmV0cnkKKyAg
ICAgIEByZXR1cm4ge1RyYW5zaXRpb259IG5ldyB0cmFuc2l0aW9uCisgICAgICBAcHVibGljCisg
ICAgICovCisgICAgcmV0cnk6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0
cyBmb3IgbWVyZ2VkIHN0YXRlIHJldHJ5KClzCisgICAgICB0aGlzLmFib3J0KCk7CisgICAgICBy
ZXR1cm4gdGhpcy5yb3V0ZXIudHJhbnNpdGlvbkJ5SW50ZW50KHRoaXMuaW50ZW50LCBmYWxzZSk7
CisgICAgfSwKKworICAgIC8qKgorICAgICAgIFNldHMgdGhlIFVSTC1jaGFuZ2luZyBtZXRob2Qg
dG8gYmUgZW1wbG95ZWQgYXQgdGhlIGVuZCBvZiBhCisgICAgICBzdWNjZXNzZnVsIHRyYW5zaXRp
b24uIEJ5IGRlZmF1bHQsIGEgbmV3IFRyYW5zaXRpb24gd2lsbCBqdXN0CisgICAgICB1c2UgYHVw
ZGF0ZVVSTGAsIGJ1dCBwYXNzaW5nICdyZXBsYWNlJyB0byB0aGlzIG1ldGhvZCB3aWxsCisgICAg
ICBjYXVzZSB0aGUgVVJMIHRvIHVwZGF0ZSB1c2luZyAncmVwbGFjZVdpdGgnIGluc3RlYWQuIE9t
aXR0aW5nCisgICAgICBhIHBhcmFtZXRlciB3aWxsIGRpc2FibGUgdGhlIFVSTCBjaGFuZ2UsIGFs
bG93aW5nIGZvciB0cmFuc2l0aW9ucworICAgICAgdGhhdCBkb24ndCB1cGRhdGUgdGhlIFVSTCBh
dCBjb21wbGV0aW9uICh0aGlzIGlzIGFsc28gdXNlZCBmb3IKKyAgICAgIGhhbmRsZVVSTCwgc2lu
Y2UgdGhlIFVSTCBoYXMgYWxyZWFkeSBjaGFuZ2VkIGJlZm9yZSB0aGUKKyAgICAgIHRyYW5zaXRp
b24gdG9vayBwbGFjZSkuCisgICAgICAgQG1ldGhvZCBtZXRob2QKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtZXRob2QgdGhlIHR5cGUgb2YgVVJMLWNoYW5naW5nIG1ldGhvZCB0byB1c2UKKyAgICAg
ICAgYXQgdGhlIGVuZCBvZiBhIHRyYW5zaXRpb24uIEFjY2VwdGVkIHZhbHVlcyBhcmUgJ3JlcGxh
Y2UnLAorICAgICAgICBmYWxzeSB2YWx1ZXMsIG9yIGFueSBvdGhlciBub24tZmFsc3kgdmFsdWUg
KHdoaWNoIGlzCisgICAgICAgIGludGVycHJldGVkIGFzIGFuIHVwZGF0ZVVSTCB0cmFuc2l0aW9u
KS4KKyAgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KKyAgICAgIEBw
dWJsaWMKKyAgICAgKi8KKyAgICBtZXRob2Q6IGZ1bmN0aW9uIChtZXRob2QpIHsKKyAgICAgIHRo
aXMudXJsTWV0aG9kID0gbWV0aG9kOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgIEZpcmVzIGFuIGV2ZW50IG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb2x2
ZWQvcmVzb2x2aW5nCisgICAgICBoYW5kbGVycyB3aXRoaW4gdGhpcyB0cmFuc2l0aW9uLiBVc2Vm
dWwgZm9yIGZpcmluZyBldmVudHMKKyAgICAgIG9uIHJvdXRlIGhpZXJhcmNoaWVzIHRoYXQgaGF2
ZW4ndCBmdWxseSBiZWVuIGVudGVyZWQgeWV0LgorICAgICAgIE5vdGU6IFRoaXMgbWV0aG9kIGlz
IGFsc28gYWxpYXNlZCBhcyBgc2VuZGAKKyAgICAgICBAbWV0aG9kIHRyaWdnZXIKKyAgICAgIEBw
YXJhbSB7Qm9vbGVhbn0gW2lnbm9yZUZhaWx1cmU9ZmFsc2VdIGEgYm9vbGVhbiBzcGVjaWZ5aW5n
IHdoZXRoZXIgdW5oYW5kbGVkIGV2ZW50cyB0aHJvdyBhbiBlcnJvcgorICAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKKyAgICAgIEBwdWJsaWMK
KyAgICAgKi8KKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoaWdub3JlRmFpbHVyZSkgeworICAgICAg
dmFyIGFyZ3MgPSBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMpOworICAgICAgaWYg
KHR5cGVvZiBpZ25vcmVGYWlsdXJlID09PSAnYm9vbGVhbicpIHsKKyAgICAgICAgYXJncy5zaGlm
dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhyb3cgZXJyb3JzIG9uIHVuaGFuZGxl
ZCB0cmlnZ2VyIGV2ZW50cyBieSBkZWZhdWx0CisgICAgICAgIGlnbm9yZUZhaWx1cmUgPSBmYWxz
ZTsKKyAgICAgIH0KKyAgICAgIF9yb3V0ZXJVdGlscy50cmlnZ2VyKHRoaXMucm91dGVyLCB0aGlz
LnN0YXRlLmhhbmRsZXJJbmZvcy5zbGljZSgwLCB0aGlzLnJlc29sdmVJbmRleCArIDEpLCBpZ25v
cmVGYWlsdXJlLCBhcmdzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUcmFuc2l0aW9ucyBh
cmUgYWJvcnRlZCBhbmQgdGhlaXIgcHJvbWlzZXMgcmVqZWN0ZWQKKyAgICAgIHdoZW4gcmVkaXJl
Y3RzIG9jY3VyOyB0aGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZQorICAgICAgdGhhdCB3aWxs
IGZvbGxvdyBhbnkgcmVkaXJlY3RzIHRoYXQgb2NjdXIgYW5kIGZ1bGZpbGwKKyAgICAgIHdpdGgg
dGhlIHZhbHVlIGZ1bGZpbGxlZCBieSBhbnkgcmVkaXJlY3RpbmcgdHJhbnNpdGlvbnMKKyAgICAg
IHRoYXQgb2NjdXIuCisgICAgICAgQG1ldGhvZCBmb2xsb3dSZWRpcmVjdHMKKyAgICAgIEByZXR1
cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHNhbWUKKyAgICAg
ICAgdmFsdWUgdGhhdCB0aGUgZmluYWwgcmVkaXJlY3RpbmcgdHJhbnNpdGlvbiBmdWxmaWxscyB3
aXRoCisgICAgICBAcHVibGljCisgICAgICovCisgICAgZm9sbG93UmVkaXJlY3RzOiBmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByZXR1cm4gdGhp
cy5wcm9taXNlWydjYXRjaCddKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgaWYgKHJvdXRl
ci5hY3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHJvdXRlci5hY3RpdmVUcmFu
c2l0aW9uLmZvbGxvd1JlZGlyZWN0cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcnN2
cFByb21pc2UuZGVmYXVsdC5yZWplY3QocmVhc29uKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAg
ICB0b1N0cmluZzogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuICJUcmFuc2l0aW9uIChzZXF1
ZW5jZSAiICsgdGhpcy5zZXF1ZW5jZSArICIpIjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBA
cHJpdmF0ZQorICAgICAqLworICAgIGxvZzogZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKyAgICAgIF9y
b3V0ZXJVdGlscy5sb2codGhpcy5yb3V0ZXIsIHRoaXMuc2VxdWVuY2UsIG1lc3NhZ2UpOworICAg
IH0KKyAgfTsKKworICAvLyBBbGlhcyAndHJpZ2dlcicgYXMgJ3NlbmQnCisgIFRyYW5zaXRpb24u
cHJvdG90eXBlLnNlbmQgPSBUcmFuc2l0aW9uLnByb3RvdHlwZS50cmlnZ2VyOworCisgIC8qKgor
ICAgIEBwcml2YXRlCisgIAorICAgIExvZ3MgYW5kIHJldHVybnMgYSBUcmFuc2l0aW9uQWJvcnRl
ZCBlcnJvci4KKyAgICovCisgIGZ1bmN0aW9uIGxvZ0Fib3J0KHRyYW5zaXRpb24pIHsKKyAgICBf
cm91dGVyVXRpbHMubG9nKHRyYW5zaXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAi
ZGV0ZWN0ZWQgYWJvcnQuIik7CisgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uQWJvcnRlZCgpOwor
ICB9CisKKyAgZnVuY3Rpb24gVHJhbnNpdGlvbkFib3J0ZWQobWVzc2FnZSkgeworICAgIHRoaXMu
bWVzc2FnZSA9IG1lc3NhZ2UgfHwgIlRyYW5zaXRpb25BYm9ydGVkIjsKKyAgICB0aGlzLm5hbWUg
PSAiVHJhbnNpdGlvbkFib3J0ZWQiOworICB9CisKKyAgZXhwb3J0cy5UcmFuc2l0aW9uID0gVHJh
bnNpdGlvbjsKKyAgZXhwb3J0cy5sb2dBYm9ydCA9IGxvZ0Fib3J0OworICBleHBvcnRzLlRyYW5z
aXRpb25BYm9ydGVkID0gVHJhbnNpdGlvbkFib3J0ZWQ7Cit9KTsKK2VuaWZlZCgicm91dGVyL3Vu
cmVjb2duaXplZC11cmwtZXJyb3IiLCBbImV4cG9ydHMiLCAicm91dGVyL3V0aWxzIl0sIGZ1bmN0
aW9uIChleHBvcnRzLCBfcm91dGVyVXRpbHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIC8qKgor
ICAgIFByb21pc2UgcmVqZWN0IHJlYXNvbnMgcGFzc2VkIHRvIHByb21pc2UgcmVqZWN0aW9uCisg
ICAgaGFuZGxlcnMgZm9yIGZhaWxlZCB0cmFuc2l0aW9ucy4KKyAgICovCisgIGZ1bmN0aW9uIFVu
cmVjb2duaXplZFVSTEVycm9yKG1lc3NhZ2UpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdl
IHx8ICJVbnJlY29nbml6ZWRVUkxFcnJvciI7CisgICAgdGhpcy5uYW1lID0gIlVucmVjb2duaXpl
ZFVSTEVycm9yIjsKKyAgICBFcnJvci5jYWxsKHRoaXMpOworICB9CisKKyAgVW5yZWNvZ25pemVk
VVJMRXJyb3IucHJvdG90eXBlID0gX3JvdXRlclV0aWxzLm9DcmVhdGUoRXJyb3IucHJvdG90eXBl
KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBVbnJlY29nbml6ZWRVUkxFcnJvcjsKK30pOworZW5p
ZmVkKCdyb3V0ZXIvdXRpbHMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZXh0cmFjdFF1ZXJ5UGFyYW1zID0gZXh0cmFjdFF1
ZXJ5UGFyYW1zOworICBleHBvcnRzLmxvZyA9IGxvZzsKKyAgZXhwb3J0cy5iaW5kID0gYmluZDsK
KyAgZXhwb3J0cy5mb3JFYWNoID0gZm9yRWFjaDsKKyAgZXhwb3J0cy50cmlnZ2VyID0gdHJpZ2dl
cjsKKyAgZXhwb3J0cy5nZXRDaGFuZ2VsaXN0ID0gZ2V0Q2hhbmdlbGlzdDsKKyAgZXhwb3J0cy5w
cm9taXNlTGFiZWwgPSBwcm9taXNlTGFiZWw7CisgIGV4cG9ydHMuc3ViY2xhc3MgPSBzdWJjbGFz
czsKKyAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOworCisgIHZhciBfaXNBcnJh
eTsKKyAgaWYgKCFBcnJheS5pc0FycmF5KSB7CisgICAgX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkg
eworICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gIltv
YmplY3QgQXJyYXldIjsKKyAgICB9OworICB9IGVsc2UgeworICAgIF9pc0FycmF5ID0gQXJyYXku
aXNBcnJheTsKKyAgfQorCisgIHZhciBpc0FycmF5ID0gX2lzQXJyYXk7CisKKyAgZXhwb3J0cy5p
c0FycmF5ID0gaXNBcnJheTsKKyAgZnVuY3Rpb24gbWVyZ2UoaGFzaCwgb3RoZXIpIHsKKyAgICBm
b3IgKHZhciBwcm9wIGluIG90aGVyKSB7CisgICAgICBpZiAob3RoZXIuaGFzT3duUHJvcGVydHko
cHJvcCkpIHsKKyAgICAgICAgaGFzaFtwcm9wXSA9IG90aGVyW3Byb3BdOworICAgICAgfQorICAg
IH0KKyAgfQorCisgIHZhciBvQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJv
dG8pIHsKKyAgICBmdW5jdGlvbiBGKCkge30KKyAgICBGLnByb3RvdHlwZSA9IHByb3RvOworICAg
IHJldHVybiBuZXcgRigpOworICB9OworCisgIGV4cG9ydHMub0NyZWF0ZSA9IG9DcmVhdGU7Cisg
IC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIEV4dHJhY3RzIHF1ZXJ5IHBhcmFtcyBmcm9tIHRo
ZSBlbmQgb2YgYW4gYXJyYXkKKyAgKiovCisKKyAgZnVuY3Rpb24gZXh0cmFjdFF1ZXJ5UGFyYW1z
KGFycmF5KSB7CisgICAgdmFyIGxlbiA9IGFycmF5ICYmIGFycmF5Lmxlbmd0aCwKKyAgICAgICAg
aGVhZCwKKyAgICAgICAgcXVlcnlQYXJhbXM7CisKKyAgICBpZiAobGVuICYmIGxlbiA+IDAgJiYg
YXJyYXlbbGVuIC0gMV0gJiYgYXJyYXlbbGVuIC0gMV0uaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFy
YW1zJykpIHsKKyAgICAgIHF1ZXJ5UGFyYW1zID0gYXJyYXlbbGVuIC0gMV0ucXVlcnlQYXJhbXM7
CisgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJheSwgMCwgbGVuIC0gMSk7CisgICAgICByZXR1
cm4gW2hlYWQsIHF1ZXJ5UGFyYW1zXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFthcnJh
eSwgbnVsbF07CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgQ29l
cmNlcyBxdWVyeSBwYXJhbSBwcm9wZXJ0aWVzIGFuZCBhcnJheSBlbGVtZW50cyBpbnRvIHN0cmlu
Z3MuCisgICoqLworICBmdW5jdGlvbiBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nKHF1ZXJ5UGFy
YW1zKSB7CisgICAgZm9yICh2YXIga2V5IGluIHF1ZXJ5UGFyYW1zKSB7CisgICAgICBpZiAodHlw
ZW9mIHF1ZXJ5UGFyYW1zW2tleV0gPT09ICdudW1iZXInKSB7CisgICAgICAgIHF1ZXJ5UGFyYW1z
W2tleV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV07CisgICAgICB9IGVsc2UgaWYgKGlzQXJyYXko
cXVlcnlQYXJhbXNba2V5XSkpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBxdWVyeVBh
cmFtc1trZXldLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tl
eV1baV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV1baV07CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9CisgIH0KKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICovCisKKyAgZnVuY3Rpb24gbG9nKHJv
dXRlciwgc2VxdWVuY2UsIG1zZykgeworICAgIGlmICghcm91dGVyLmxvZykgeworICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7CisgICAgICBy
b3V0ZXIubG9nKCJUcmFuc2l0aW9uICMiICsgc2VxdWVuY2UgKyAiOiAiICsgbXNnKTsKKyAgICB9
IGVsc2UgeworICAgICAgbXNnID0gc2VxdWVuY2U7CisgICAgICByb3V0ZXIubG9nKG1zZyk7Cisg
ICAgfQorICB9CisKKyAgZnVuY3Rpb24gYmluZChjb250ZXh0LCBmbikgeworICAgIHZhciBib3Vu
ZEFyZ3MgPSBhcmd1bWVudHM7CisgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAg
dmFyIGFyZ3MgPSBzbGljZS5jYWxsKGJvdW5kQXJncywgMik7CisgICAgICBhcmdzLnB1c2godmFs
dWUpOworICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOworICAgIH07CisgIH0K
KworICBmdW5jdGlvbiBpc1BhcmFtKG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0
ID09PSAic3RyaW5nIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIG9iamVj
dCA9PT0gIm51bWJlciIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyOworICB9CisKKyAgZnVu
Y3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9
IGFycmF5Lmxlbmd0aDsgaSA8IGwgJiYgZmFsc2UgIT09IGNhbGxiYWNrKGFycmF5W2ldKTsgaSsr
KSB7fQorICB9CisKKyAgZnVuY3Rpb24gdHJpZ2dlcihyb3V0ZXIsIGhhbmRsZXJJbmZvcywgaWdu
b3JlRmFpbHVyZSwgYXJncykgeworICAgIGlmIChyb3V0ZXIudHJpZ2dlckV2ZW50KSB7CisgICAg
ICByb3V0ZXIudHJpZ2dlckV2ZW50KGhhbmRsZXJJbmZvcywgaWdub3JlRmFpbHVyZSwgYXJncyk7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7CisK
KyAgICBpZiAoIWhhbmRsZXJJbmZvcykgeworICAgICAgaWYgKGlnbm9yZUZhaWx1cmUpIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3Qg
dHJpZ2dlciBldmVudCAnIiArIG5hbWUgKyAiJy4gVGhlcmUgYXJlIG5vIGFjdGl2ZSBoYW5kbGVy
cyIpOworICAgIH0KKworICAgIHZhciBldmVudFdhc0hhbmRsZWQgPSBmYWxzZTsKKworICAgIGZv
ciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAg
IHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKKyAgICAgICAgICBoYW5kbGVyID0g
aGFuZGxlckluZm8uaGFuZGxlcjsKKworICAgICAgaWYgKGhhbmRsZXIuZXZlbnRzICYmIGhhbmRs
ZXIuZXZlbnRzW25hbWVdKSB7CisgICAgICAgIGlmIChoYW5kbGVyLmV2ZW50c1tuYW1lXS5hcHBs
eShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1ZSkgeworICAgICAgICAgIGV2ZW50V2FzSGFuZGxlZCA9
IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfQorCisgICAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYgIWlnbm9yZUZhaWx1
cmUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiTm90aGluZyBoYW5kbGVkIHRoZSBldmVudCAn
IiArIG5hbWUgKyAiJy4iKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRDaGFuZ2VsaXN0
KG9sZE9iamVjdCwgbmV3T2JqZWN0KSB7CisgICAgdmFyIGtleTsKKyAgICB2YXIgcmVzdWx0cyA9
IHsKKyAgICAgIGFsbDoge30sCisgICAgICBjaGFuZ2VkOiB7fSwKKyAgICAgIHJlbW92ZWQ6IHt9
CisgICAgfTsKKworICAgIG1lcmdlKHJlc3VsdHMuYWxsLCBuZXdPYmplY3QpOworCisgICAgdmFy
IGRpZENoYW5nZSA9IGZhbHNlOworICAgIGNvZXJjZVF1ZXJ5UGFyYW1zVG9TdHJpbmcob2xkT2Jq
ZWN0KTsKKyAgICBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nKG5ld09iamVjdCk7CisKKyAgICAv
LyBDYWxjdWxhdGUgcmVtb3ZhbHMKKyAgICBmb3IgKGtleSBpbiBvbGRPYmplY3QpIHsKKyAgICAg
IGlmIChvbGRPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICBpZiAoIW5ld09i
amVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTsK
KyAgICAgICAgICByZXN1bHRzLnJlbW92ZWRba2V5XSA9IG9sZE9iamVjdFtrZXldOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGNoYW5nZXMKKyAgICBmb3Ig
KGtleSBpbiBuZXdPYmplY3QpIHsKKyAgICAgIGlmIChuZXdPYmplY3QuaGFzT3duUHJvcGVydHko
a2V5KSkgeworICAgICAgICBpZiAoaXNBcnJheShvbGRPYmplY3Rba2V5XSkgJiYgaXNBcnJheShu
ZXdPYmplY3Rba2V5XSkpIHsKKyAgICAgICAgICBpZiAob2xkT2JqZWN0W2tleV0ubGVuZ3RoICE9
PSBuZXdPYmplY3Rba2V5XS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuY2hhbmdlZFtr
ZXldID0gbmV3T2JqZWN0W2tleV07CisgICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9sZE9iamVj
dFtrZXldLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgICBpZiAob2xkT2JqZWN0
W2tleV1baV0gIT09IG5ld09iamVjdFtrZXldW2ldKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0
cy5jaGFuZ2VkW2tleV0gPSBuZXdPYmplY3Rba2V5XTsKKyAgICAgICAgICAgICAgICBkaWRDaGFu
Z2UgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChvbGRPYmplY3Rba2V5XSAhPT0gbmV3T2Jq
ZWN0W2tleV0pIHsKKyAgICAgICAgICAgIHJlc3VsdHMuY2hhbmdlZFtrZXldID0gbmV3T2JqZWN0
W2tleV07CisgICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkaWRDaGFuZ2UgJiYgcmVzdWx0czsK
KyAgfQorCisgIGZ1bmN0aW9uIHByb21pc2VMYWJlbChsYWJlbCkgeworICAgIHJldHVybiAnUm91
dGVyOiAnICsgbGFiZWw7CisgIH0KKworICBmdW5jdGlvbiBzdWJjbGFzcyhwYXJlbnRDb25zdHJ1
Y3RvciwgcHJvdG8pIHsKKyAgICBmdW5jdGlvbiBDKHByb3BzKSB7CisgICAgICBwYXJlbnRDb25z
dHJ1Y3Rvci5jYWxsKHRoaXMsIHByb3BzIHx8IHt9KTsKKyAgICB9CisgICAgQy5wcm90b3R5cGUg
PSBvQ3JlYXRlKHBhcmVudENvbnN0cnVjdG9yLnByb3RvdHlwZSk7CisgICAgbWVyZ2UoQy5wcm90
b3R5cGUsIHByb3RvKTsKKyAgICByZXR1cm4gQzsKKyAgfQorCisgIGZ1bmN0aW9uIHJlc29sdmVI
b29rKG9iaiwgaG9va05hbWUpIHsKKyAgICBpZiAoIW9iaikgeworICAgICAgcmV0dXJuOworICAg
IH0KKyAgICB2YXIgdW5kZXJzY29yZWQgPSAiXyIgKyBob29rTmFtZTsKKyAgICByZXR1cm4gb2Jq
W3VuZGVyc2NvcmVkXSAmJiB1bmRlcnNjb3JlZCB8fCBvYmpbaG9va05hbWVdICYmIGhvb2tOYW1l
OworICB9CisKKyAgZnVuY3Rpb24gY2FsbEhvb2sob2JqLCBfaG9va05hbWUsIGFyZzEsIGFyZzIp
IHsKKyAgICB2YXIgaG9va05hbWUgPSByZXNvbHZlSG9vayhvYmosIF9ob29rTmFtZSk7CisgICAg
cmV0dXJuIGhvb2tOYW1lICYmIG9ialtob29rTmFtZV0uY2FsbChvYmosIGFyZzEsIGFyZzIpOwor
ICB9CisKKyAgZnVuY3Rpb24gYXBwbHlIb29rKG9iaiwgX2hvb2tOYW1lLCBhcmdzKSB7CisgICAg
dmFyIGhvb2tOYW1lID0gcmVzb2x2ZUhvb2sob2JqLCBfaG9va05hbWUpOworICAgIGlmIChob29r
TmFtZSkgeworICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiBv
YmpbaG9va05hbWVdLmNhbGwob2JqKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09
IDEpIHsKKyAgICAgICAgcmV0dXJuIG9ialtob29rTmFtZV0uY2FsbChvYmosIGFyZ3NbMF0pOwor
ICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikgeworICAgICAgICByZXR1cm4gb2Jq
W2hvb2tOYW1lXS5jYWxsKG9iaiwgYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gb2JqW2hvb2tOYW1lXS5hcHBseShvYmosIGFyZ3MpOworICAgICAgfQor
ICAgIH0KKyAgfQorCisgIGV4cG9ydHMubWVyZ2UgPSBtZXJnZTsKKyAgZXhwb3J0cy5zbGljZSA9
IHNsaWNlOworICBleHBvcnRzLmlzUGFyYW0gPSBpc1BhcmFtOworICBleHBvcnRzLmNvZXJjZVF1
ZXJ5UGFyYW1zVG9TdHJpbmcgPSBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nOworICBleHBvcnRz
LmNhbGxIb29rID0gY2FsbEhvb2s7CisgIGV4cG9ydHMucmVzb2x2ZUhvb2sgPSByZXNvbHZlSG9v
azsKKyAgZXhwb3J0cy5hcHBseUhvb2sgPSBhcHBseUhvb2s7Cit9KTsKK2VuaWZlZCgncnN2cCcs
IFsnZXhwb3J0cycsICdyc3ZwL3Byb21pc2UnLCAncnN2cC9ldmVudHMnLCAncnN2cC9ub2RlJywg
J3JzdnAvYWxsJywgJ3JzdnAvYWxsLXNldHRsZWQnLCAncnN2cC9yYWNlJywgJ3JzdnAvaGFzaCcs
ICdyc3ZwL2hhc2gtc2V0dGxlZCcsICdyc3ZwL3JldGhyb3cnLCAncnN2cC9kZWZlcicsICdyc3Zw
L2NvbmZpZycsICdyc3ZwL21hcCcsICdyc3ZwL3Jlc29sdmUnLCAncnN2cC9yZWplY3QnLCAncnN2
cC9maWx0ZXInLCAncnN2cC9hc2FwJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2Us
IF9yc3ZwRXZlbnRzLCBfcnN2cE5vZGUsIF9yc3ZwQWxsLCBfcnN2cEFsbFNldHRsZWQsIF9yc3Zw
UmFjZSwgX3JzdnBIYXNoLCBfcnN2cEhhc2hTZXR0bGVkLCBfcnN2cFJldGhyb3csIF9yc3ZwRGVm
ZXIsIF9yc3ZwQ29uZmlnLCBfcnN2cE1hcCwgX3JzdnBSZXNvbHZlLCBfcnN2cFJlamVjdCwgX3Jz
dnBGaWx0ZXIsIF9yc3ZwQXNhcCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gZGVmYXVsdHMK
KyAgX3JzdnBDb25maWcuY29uZmlnLmFzeW5jID0gX3JzdnBBc2FwLmRlZmF1bHQ7CisgIF9yc3Zw
Q29uZmlnLmNvbmZpZy5hZnRlciA9IGZ1bmN0aW9uIChjYikgeworICAgIHNldFRpbWVvdXQoY2Is
IDApOworICB9OworICB2YXIgY2FzdCA9IF9yc3ZwUmVzb2x2ZS5kZWZhdWx0OworICBmdW5jdGlv
biBhc3luYyhjYWxsYmFjaywgYXJnKSB7CisgICAgX3JzdnBDb25maWcuY29uZmlnLmFzeW5jKGNh
bGxiYWNrLCBhcmcpOworICB9CisKKyAgZnVuY3Rpb24gb24oKSB7CisgICAgX3JzdnBDb25maWcu
Y29uZmlnWydvbiddLmFwcGx5KF9yc3ZwQ29uZmlnLmNvbmZpZywgYXJndW1lbnRzKTsKKyAgfQor
CisgIGZ1bmN0aW9uIG9mZigpIHsKKyAgICBfcnN2cENvbmZpZy5jb25maWdbJ29mZiddLmFwcGx5
KF9yc3ZwQ29uZmlnLmNvbmZpZywgYXJndW1lbnRzKTsKKyAgfQorCisgIC8vIFNldCB1cCBpbnN0
cnVtZW50YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJPTUlTRV9JTlRSVU1FTlRBVElPTl9fYAor
ICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvd1snX19Q
Uk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fJ10gPT09ICdvYmplY3QnKSB7CisgICAgdmFyIGNhbGxi
YWNrcyA9IHdpbmRvd1snX19QUk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fJ107CisgICAgX3JzdnBD
b25maWcuY29uZmlndXJlKCdpbnN0cnVtZW50JywgdHJ1ZSk7CisgICAgZm9yICh2YXIgZXZlbnRO
YW1lIGluIGNhbGxiYWNrcykgeworICAgICAgaWYgKGNhbGxiYWNrcy5oYXNPd25Qcm9wZXJ0eShl
dmVudE5hbWUpKSB7CisgICAgICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2tzW2V2ZW50TmFtZV0p
OworICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHMuY2FzdCA9IGNhc3Q7CisgIGV4cG9y
dHMuUHJvbWlzZSA9IF9yc3ZwUHJvbWlzZS5kZWZhdWx0OworICBleHBvcnRzLkV2ZW50VGFyZ2V0
ID0gX3JzdnBFdmVudHMuZGVmYXVsdDsKKyAgZXhwb3J0cy5hbGwgPSBfcnN2cEFsbC5kZWZhdWx0
OworICBleHBvcnRzLmFsbFNldHRsZWQgPSBfcnN2cEFsbFNldHRsZWQuZGVmYXVsdDsKKyAgZXhw
b3J0cy5yYWNlID0gX3JzdnBSYWNlLmRlZmF1bHQ7CisgIGV4cG9ydHMuaGFzaCA9IF9yc3ZwSGFz
aC5kZWZhdWx0OworICBleHBvcnRzLmhhc2hTZXR0bGVkID0gX3JzdnBIYXNoU2V0dGxlZC5kZWZh
dWx0OworICBleHBvcnRzLnJldGhyb3cgPSBfcnN2cFJldGhyb3cuZGVmYXVsdDsKKyAgZXhwb3J0
cy5kZWZlciA9IF9yc3ZwRGVmZXIuZGVmYXVsdDsKKyAgZXhwb3J0cy5kZW5vZGVpZnkgPSBfcnN2
cE5vZGUuZGVmYXVsdDsKKyAgZXhwb3J0cy5jb25maWd1cmUgPSBfcnN2cENvbmZpZy5jb25maWd1
cmU7CisgIGV4cG9ydHMub24gPSBvbjsKKyAgZXhwb3J0cy5vZmYgPSBvZmY7CisgIGV4cG9ydHMu
cmVzb2x2ZSA9IF9yc3ZwUmVzb2x2ZS5kZWZhdWx0OworICBleHBvcnRzLnJlamVjdCA9IF9yc3Zw
UmVqZWN0LmRlZmF1bHQ7CisgIGV4cG9ydHMuYXN5bmMgPSBhc3luYzsKKyAgZXhwb3J0cy5tYXAg
PSBfcnN2cE1hcC5kZWZhdWx0OworICBleHBvcnRzLmZpbHRlciA9IF9yc3ZwRmlsdGVyLmRlZmF1
bHQ7Cit9KTsKK2VuaWZlZCgncnN2cC51bWQnLCBbJ2V4cG9ydHMnLCAncnN2cC9wbGF0Zm9ybScs
ICdyc3ZwJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFBsYXRmb3JtLCBfcnN2cCkgeworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIFJTVlAgPSB7CisgICAgJ3JhY2UnOiBfcnN2cC5yYWNlLAor
ICAgICdQcm9taXNlJzogX3JzdnAuUHJvbWlzZSwKKyAgICAnYWxsU2V0dGxlZCc6IF9yc3ZwLmFs
bFNldHRsZWQsCisgICAgJ2hhc2gnOiBfcnN2cC5oYXNoLAorICAgICdoYXNoU2V0dGxlZCc6IF9y
c3ZwLmhhc2hTZXR0bGVkLAorICAgICdkZW5vZGVpZnknOiBfcnN2cC5kZW5vZGVpZnksCisgICAg
J29uJzogX3JzdnAub24sCisgICAgJ29mZic6IF9yc3ZwLm9mZiwKKyAgICAnbWFwJzogX3JzdnAu
bWFwLAorICAgICdmaWx0ZXInOiBfcnN2cC5maWx0ZXIsCisgICAgJ3Jlc29sdmUnOiBfcnN2cC5y
ZXNvbHZlLAorICAgICdyZWplY3QnOiBfcnN2cC5yZWplY3QsCisgICAgJ2FsbCc6IF9yc3ZwLmFs
bCwKKyAgICAncmV0aHJvdyc6IF9yc3ZwLnJldGhyb3csCisgICAgJ2RlZmVyJzogX3JzdnAuZGVm
ZXIsCisgICAgJ0V2ZW50VGFyZ2V0JzogX3JzdnAuRXZlbnRUYXJnZXQsCisgICAgJ2NvbmZpZ3Vy
ZSc6IF9yc3ZwLmNvbmZpZ3VyZSwKKyAgICAnYXN5bmMnOiBfcnN2cC5hc3luYworICB9OworCisg
IC8qIGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi8KKyAgaWYg
KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkgeworICAgIGRl
ZmluZShmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUlNWUDsKKyAgICB9KTsKKyAgfSBlbHNl
IGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkg
eworICAgIG1vZHVsZVsnZXhwb3J0cyddID0gUlNWUDsKKyAgfSBlbHNlIGlmICh0eXBlb2YgX3Jz
dnBQbGF0Zm9ybS5kZWZhdWx0ICE9PSAndW5kZWZpbmVkJykgeworICAgIF9yc3ZwUGxhdGZvcm0u
ZGVmYXVsdFsnUlNWUCddID0gUlNWUDsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvLWludGVybmFs
JywgWydleHBvcnRzJywgJ3JzdnAvdXRpbHMnLCAncnN2cC9pbnN0cnVtZW50JywgJ3JzdnAvY29u
ZmlnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFV0aWxzLCBfcnN2cEluc3RydW1lbnQsIF9y
c3ZwQ29uZmlnKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiB3aXRoT3duUHJvbWlz
ZSgpIHsKKyAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5u
b3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpOworICB9CisKKyAgZnVuY3Rpb24gbm9vcCgp
IHt9CisKKyAgdmFyIFBFTkRJTkcgPSB2b2lkIDA7CisgIHZhciBGVUxGSUxMRUQgPSAxOworICB2
YXIgUkVKRUNURUQgPSAyOworCisgIHZhciBHRVRfVEhFTl9FUlJPUiA9IG5ldyBFcnJvck9iamVj
dCgpOworCisgIGZ1bmN0aW9uIGdldFRoZW4ocHJvbWlzZSkgeworICAgIHRyeSB7CisgICAgICBy
ZXR1cm4gcHJvbWlzZS50aGVuOworICAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgICBHRVRfVEhF
Tl9FUlJPUi5lcnJvciA9IGVycm9yOworICAgICAgcmV0dXJuIEdFVF9USEVOX0VSUk9SOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyeVRoZW4odGhlbiwgdmFsdWUsIGZ1bGZpbGxtZW50SGFu
ZGxlciwgcmVqZWN0aW9uSGFuZGxlcikgeworICAgIHRyeSB7CisgICAgICB0aGVuLmNhbGwodmFs
dWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7CisgICAgfSBjYXRjaCAo
ZSkgeworICAgICAgcmV0dXJuIGU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gaGFuZGxlRm9y
ZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7CisgICAgX3JzdnBDb25maWcu
Y29uZmlnLmFzeW5jKGZ1bmN0aW9uIChwcm9taXNlKSB7CisgICAgICB2YXIgc2VhbGVkID0gZmFs
c2U7CisgICAgICB2YXIgZXJyb3IgPSB0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbiAo
dmFsdWUpIHsKKyAgICAgICAgaWYgKHNlYWxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICBzZWFsZWQgPSB0cnVlOworICAgICAgICBpZiAodGhlbmFibGUgIT09IHZh
bHVlKSB7CisgICAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAg
IH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgaWYgKHNlYWxlZCkgeworICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZWFsZWQgPSB0cnVlOworCisgICAgICAgIHJl
amVjdChwcm9taXNlLCByZWFzb24pOworICAgICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9s
YWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTsKKworICAgICAgaWYgKCFzZWFsZWQgJiYgZXJy
b3IpIHsKKyAgICAgICAgc2VhbGVkID0gdHJ1ZTsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIGVy
cm9yKTsKKyAgICAgIH0KKyAgICB9LCBwcm9taXNlKTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRs
ZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7CisgICAgaWYgKHRoZW5hYmxlLl9zdGF0
ZSA9PT0gRlVMRklMTEVEKSB7CisgICAgICBmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1
bHQpOworICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBSRUpFQ1RFRCkgeworICAg
ICAgdGhlbmFibGUuX29uRXJyb3IgPSBudWxsOworICAgICAgcmVqZWN0KHByb21pc2UsIHRoZW5h
YmxlLl9yZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVu
ZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFs
dWUpIHsKKyAgICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAg
fSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTsK
KyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZU1heWJlVGhlbmFibGUo
cHJvbWlzZSwgbWF5YmVUaGVuYWJsZSkgeworICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVj
dG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yKSB7CisgICAgICBoYW5kbGVPd25UaGVuYWJsZShw
cm9taXNlLCBtYXliZVRoZW5hYmxlKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHRoZW4gPSBn
ZXRUaGVuKG1heWJlVGhlbmFibGUpOworCisgICAgICBpZiAodGhlbiA9PT0gR0VUX1RIRU5fRVJS
T1IpIHsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIEdFVF9USEVOX0VSUk9SLmVycm9yKTsKKyAg
ICAgIH0gZWxzZSBpZiAodGhlbiA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGZ1bGZpbGwocHJv
bWlzZSwgbWF5YmVUaGVuYWJsZSk7CisgICAgICB9IGVsc2UgaWYgKF9yc3ZwVXRpbHMuaXNGdW5j
dGlvbih0aGVuKSkgeworICAgICAgICBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5
YmVUaGVuYWJsZSwgdGhlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmdWxmaWxsKHByb21p
c2UsIG1heWJlVGhlbmFibGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJl
c29sdmUocHJvbWlzZSwgdmFsdWUpIHsKKyAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHsKKyAg
ICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpOworICAgIH0gZWxzZSBpZiAoX3JzdnBVdGlscy5v
YmplY3RPckZ1bmN0aW9uKHZhbHVlKSkgeworICAgICAgaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9t
aXNlLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUp
OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSkgewor
ICAgIGlmIChwcm9taXNlLl9vbkVycm9yKSB7CisgICAgICBwcm9taXNlLl9vbkVycm9yKHByb21p
c2UuX3Jlc3VsdCk7CisgICAgfQorCisgICAgcHVibGlzaChwcm9taXNlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpIHsKKyAgICBpZiAocHJvbWlzZS5fc3RhdGUg
IT09IFBFTkRJTkcpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9taXNlLl9yZXN1
bHQgPSB2YWx1ZTsKKyAgICBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRDsKKworICAgIGlmIChw
cm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHsKKyAgICAgIGlmIChfcnN2cENvbmZp
Zy5jb25maWcuaW5zdHJ1bWVudCkgeworICAgICAgICBfcnN2cEluc3RydW1lbnQuZGVmYXVsdCgn
ZnVsZmlsbGVkJywgcHJvbWlzZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9yc3Zw
Q29uZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNoLCBwcm9taXNlKTsKKyAgICB9CisgIH0KKworICBm
dW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7CisgICAgaWYgKHByb21pc2UuX3N0YXRl
ICE9PSBQRU5ESU5HKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHByb21pc2UuX3N0YXRl
ID0gUkVKRUNURUQ7CisgICAgcHJvbWlzZS5fcmVzdWx0ID0gcmVhc29uOworICAgIF9yc3ZwQ29u
ZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlv
bikgeworICAgIHZhciBzdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7CisgICAgdmFy
IGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDsKKworICAgIHBhcmVudC5fb25FcnJvciA9IG51
bGw7CisKKyAgICBzdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7CisgICAgc3Vic2NyaWJlcnNb
bGVuZ3RoICsgRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7CisgICAgc3Vic2NyaWJlcnNbbGVu
Z3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247CisKKyAgICBpZiAobGVuZ3RoID09PSAwICYm
IHBhcmVudC5fc3RhdGUpIHsKKyAgICAgIF9yc3ZwQ29uZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNo
LCBwYXJlbnQpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkgewor
ICAgIHZhciBzdWJzY3JpYmVycyA9IHByb21pc2UuX3N1YnNjcmliZXJzOworICAgIHZhciBzZXR0
bGVkID0gcHJvbWlzZS5fc3RhdGU7CisKKyAgICBpZiAoX3JzdnBDb25maWcuY29uZmlnLmluc3Ry
dW1lbnQpIHsKKyAgICAgIF9yc3ZwSW5zdHJ1bWVudC5kZWZhdWx0KHNldHRsZWQgPT09IEZVTEZJ
TExFRCA/ICdmdWxmaWxsZWQnIDogJ3JlamVjdGVkJywgcHJvbWlzZSk7CisgICAgfQorCisgICAg
aWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIHZhciBjaGlsZCwKKyAgICAgICAgY2FsbGJhY2ssCisgICAgICAgIGRldGFpbCA9IHByb21p
c2UuX3Jlc3VsdDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3Ro
OyBpICs9IDMpIHsKKyAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07CisgICAgICBjYWxsYmFj
ayA9IHN1YnNjcmliZXJzW2kgKyBzZXR0bGVkXTsKKworICAgICAgaWYgKGNoaWxkKSB7CisgICAg
ICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7CisgICAgICB9CisgICAgfQor
CisgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDsKKyAgfQorCisgIGZ1bmN0aW9u
IEVycm9yT2JqZWN0KCkgeworICAgIHRoaXMuZXJyb3IgPSBudWxsOworICB9CisKKyAgdmFyIFRS
WV9DQVRDSF9FUlJPUiA9IG5ldyBFcnJvck9iamVjdCgpOworCisgIGZ1bmN0aW9uIHRyeUNhdGNo
KGNhbGxiYWNrLCBkZXRhaWwpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNhbGxiYWNrKGRl
dGFpbCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgVFJZX0NBVENIX0VSUk9SLmVycm9yID0g
ZTsKKyAgICAgIHJldHVybiBUUllfQ0FUQ0hfRVJST1I7CisgICAgfQorICB9CisKKyAgZnVuY3Rp
b24gaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkgewor
ICAgIHZhciBoYXNDYWxsYmFjayA9IF9yc3ZwVXRpbHMuaXNGdW5jdGlvbihjYWxsYmFjayksCisg
ICAgICAgIHZhbHVlLAorICAgICAgICBlcnJvciwKKyAgICAgICAgc3VjY2VlZGVkLAorICAgICAg
ICBmYWlsZWQ7CisKKyAgICBpZiAoaGFzQ2FsbGJhY2spIHsKKyAgICAgIHZhbHVlID0gdHJ5Q2F0
Y2goY2FsbGJhY2ssIGRldGFpbCk7CisKKyAgICAgIGlmICh2YWx1ZSA9PT0gVFJZX0NBVENIX0VS
Uk9SKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIGVycm9yID0gdmFsdWUuZXJy
b3I7CisgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nl
ZWRlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgewor
ICAgICAgICByZWplY3QocHJvbWlzZSwgd2l0aE93blByb21pc2UoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFsdWUgPSBkZXRhaWw7CisgICAgICBz
dWNjZWVkZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVO
RElORykgeworICAgICAgLy8gbm9vcAorICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3Vj
Y2VlZGVkKSB7CisgICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpOworICAgICAgfSBlbHNl
IGlmIChmYWlsZWQpIHsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIGVycm9yKTsKKyAgICAgIH0g
ZWxzZSBpZiAoc2V0dGxlZCA9PT0gRlVMRklMTEVEKSB7CisgICAgICAgIGZ1bGZpbGwocHJvbWlz
ZSwgdmFsdWUpOworICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBSRUpFQ1RFRCkgeworICAg
ICAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpOworICAgICAgfQorICB9CisKKyAgZnVuY3Rpb24g
aW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHsKKyAgICB2YXIgcmVzb2x2ZWQg
PSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21p
c2UodmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc29sdmVkKSB7CisgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKKyAgICAgICAgcmVzb2x2ZShwcm9t
aXNlLCB2YWx1ZSk7CisgICAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikgewor
ICAgICAgICBpZiAocmVzb2x2ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgcmVzb2x2ZWQgPSB0cnVlOworICAgICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTsK
KyAgICAgIH0pOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJlamVjdChwcm9taXNlLCBlKTsK
KyAgICB9CisgIH0KKworICBleHBvcnRzLm5vb3AgPSBub29wOworICBleHBvcnRzLnJlc29sdmUg
PSByZXNvbHZlOworICBleHBvcnRzLnJlamVjdCA9IHJlamVjdDsKKyAgZXhwb3J0cy5mdWxmaWxs
ID0gZnVsZmlsbDsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7CisgIGV4cG9ydHMu
cHVibGlzaCA9IHB1Ymxpc2g7CisgIGV4cG9ydHMucHVibGlzaFJlamVjdGlvbiA9IHB1Ymxpc2hS
ZWplY3Rpb247CisgIGV4cG9ydHMuaW5pdGlhbGl6ZVByb21pc2UgPSBpbml0aWFsaXplUHJvbWlz
ZTsKKyAgZXhwb3J0cy5pbnZva2VDYWxsYmFjayA9IGludm9rZUNhbGxiYWNrOworICBleHBvcnRz
LkZVTEZJTExFRCA9IEZVTEZJTExFRDsKKyAgZXhwb3J0cy5SRUpFQ1RFRCA9IFJFSkVDVEVEOwor
ICBleHBvcnRzLlBFTkRJTkcgPSBQRU5ESU5HOworfSk7CitlbmlmZWQoJ3JzdnAvYWxsLXNldHRs
ZWQnLCBbJ2V4cG9ydHMnLCAncnN2cC9lbnVtZXJhdG9yJywgJ3JzdnAvcHJvbWlzZScsICdyc3Zw
L3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cEVudW1lcmF0b3IsIF9yc3ZwUHJvbWlz
ZSwgX3JzdnBVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
YWxsU2V0dGxlZDsKKworICBmdW5jdGlvbiBBbGxTZXR0bGVkKENvbnN0cnVjdG9yLCBlbnRyaWVz
LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3IoQ29uc3RydWN0b3IsIGVudHJp
ZXMsIGZhbHNlLCAvKiBkb24ndCBhYm9ydCBvbiByZWplY3QgKi9sYWJlbCk7CisgIH0KKworICBB
bGxTZXR0bGVkLnByb3RvdHlwZSA9IF9yc3ZwVXRpbHMub19jcmVhdGUoX3JzdnBFbnVtZXJhdG9y
LmRlZmF1bHQucHJvdG90eXBlKTsKKyAgQWxsU2V0dGxlZC5wcm90b3R5cGUuX3N1cGVyQ29uc3Ry
dWN0b3IgPSBfcnN2cEVudW1lcmF0b3IuZGVmYXVsdDsKKyAgQWxsU2V0dGxlZC5wcm90b3R5cGUu
X21ha2VSZXN1bHQgPSBfcnN2cEVudW1lcmF0b3IubWFrZVNldHRsZWRSZXN1bHQ7CisgIEFsbFNl
dHRsZWQucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0
dXJuIG5ldyBFcnJvcignYWxsU2V0dGxlZCBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5Jyk7
CisgIH07CisKKyAgLyoqCisgICAgYFJTVlAuYWxsU2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNW
UC5hbGxgLCBidXQgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKKyAgICBhIGZhaWwtZmFzdCBtZXRo
b2QsIGl0IHdhaXRzIHVudGlsIGFsbCB0aGUgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQKKyAg
ICBzaG93cyB5b3UgYWxsIHRoZSByZXN1bHRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0
byBoYW5kbGUgbXVsdGlwbGUKKyAgICBwcm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIg
YXMgYSBzZXQuCisgIAorICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdo
ZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KKyAgICBzZXR0bGVkLiBUaGUgcmV0
dXJuIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgdGhlIHN0YXRlcyBvZgor
ICAgIHRoZSBwcm9taXNlcyBwYXNzZWQgaW50byB0aGUgYHByb21pc2VzYCBhcnJheSBhcmd1bWVu
dC4KKyAgCisgICAgRWFjaCBzdGF0ZSBvYmplY3Qgd2lsbCBlaXRoZXIgaW5kaWNhdGUgZnVsZmls
bG1lbnQgb3IgcmVqZWN0aW9uLCBhbmQKKyAgICBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIHZh
bHVlIG9yIHJlYXNvbi4gVGhlIHN0YXRlcyB3aWxsIHRha2Ugb25lIG9mCisgICAgdGhlIGZvbGxv
d2luZyBmb3JtYXRzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeyBzdGF0ZTogJ2Z1bGZp
bGxlZCcsIHZhbHVlOiB2YWx1ZSB9CisgICAgICBvcgorICAgIHsgc3RhdGU6ICdyZWplY3RlZCcs
IHJlYXNvbjogcmVhc29uIH0KKyAgICBgYGAKKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwor
ICAgIHZhciBwcm9taXNlMiA9IFJTVlAuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCcyJykpOwor
ICAgIHZhciBwcm9taXNlMyA9IFJTVlAuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCczJykpOwor
ICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAK
KyAgICBSU1ZQLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpeworICAg
ICAgLy8gYXJyYXkgPT0gWworICAgICAgLy8gICB7IHN0YXRlOiAnZnVsZmlsbGVkJywgdmFsdWU6
IDEgfSwKKyAgICAgIC8vICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJvciB9LAor
ICAgICAgLy8gICB7IHN0YXRlOiAncmVqZWN0ZWQnLCByZWFzb246IEVycm9yIH0KKyAgICAgIC8v
IF0KKyAgICAgIC8vIE5vdGUgdGhhdCBmb3IgdGhlIHNlY29uZCBpdGVtLCByZWFzb24ubWVzc2Fn
ZSB3aWxsIGJlICcyJywgYW5kIGZvciB0aGUKKyAgICAgIC8vIHRoaXJkIGl0ZW0sIHJlYXNvbi5t
ZXNzYWdlIHdpbGwgYmUgJzMnLgorICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAvLyBO
b3QgcnVuLiAoVGhpcyBibG9jayB3b3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhbGxTZXR0bGVkIGhh
ZCBmYWlsZWQsCisgICAgICAvLyBmb3IgaW5zdGFuY2UgaWYgcGFzc2VkIGFuIGluY29ycmVjdCBh
cmd1bWVudCB0eXBlLikKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhbGxTZXR0
bGVkCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9IGVudHJp
ZXMKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNj
cmliZXMgdGhlIHByb21pc2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4g
e1Byb21pc2V9IHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiB0aGUg
c2V0dGxlZAorICAgIHN0YXRlcyBvZiB0aGUgY29uc3RpdHVlbnQgcHJvbWlzZXMuCisgICovCisK
KyAgZnVuY3Rpb24gYWxsU2V0dGxlZChlbnRyaWVzLCBsYWJlbCkgeworICAgIHJldHVybiBuZXcg
QWxsU2V0dGxlZChfcnN2cFByb21pc2UuZGVmYXVsdCwgZW50cmllcywgbGFiZWwpLnByb21pc2U7
CisgIH0KK30pOworZW5pZmVkKCJyc3ZwL2FsbCIsIFsiZXhwb3J0cyIsICJyc3ZwL3Byb21pc2Ui
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkgeworICAidXNlIHN0cmljdCI7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gYWxsOworCisgIC8qKgorICAgIFRoaXMgaXMgYSBjb252ZW5p
ZW50IGFsaWFzIGZvciBgUlNWUC5Qcm9taXNlLmFsbGAuCisgIAorICAgIEBtZXRob2QgYWxsCisg
ICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFycmF5
IG9mIHByb21pc2VzLgorICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBbiBvcHRpb25hbCBsYWJl
bC4gVGhpcyBpcyB1c2VmdWwKKyAgICBmb3IgdG9vbGluZy4KKyAgKi8KKworICBmdW5jdGlvbiBh
bGwoYXJyYXksIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LmFsbChh
cnJheSwgbGFiZWwpOworICB9Cit9KTsKK2VuaWZlZCgncnN2cC9hc2FwJywgWydleHBvcnRzJ10s
IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBhc2FwOworICB2YXIgbGVuID0gMDsKKyAgdmFyIHRvU3RyaW5nID0gKHt9KS50b1N0cmlu
ZzsKKyAgdmFyIHZlcnR4TmV4dDsKKworICBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHsK
KyAgICBxdWV1ZVtsZW5dID0gY2FsbGJhY2s7CisgICAgcXVldWVbbGVuICsgMV0gPSBhcmc7Cisg
ICAgbGVuICs9IDI7CisgICAgaWYgKGxlbiA9PT0gMikgeworICAgICAgLy8gSWYgbGVuIGlzIDEs
IHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLgorICAg
ICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVl
IGlzIGZsdXNoZWQsIHRoZXkKKyAgICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1
c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy4KKyAgICAgIHNjaGVkdWxlRmx1c2goKTsKKyAgICB9
CisgIH0KKworICB2YXIgYnJvd3NlcldpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmlu
ZWQnID8gd2luZG93IDogdW5kZWZpbmVkOworICB2YXIgYnJvd3Nlckdsb2JhbCA9IGJyb3dzZXJX
aW5kb3cgfHwge307CisgIHZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGJyb3dzZXJHbG9i
YWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2
ZXI7CisgIHZhciBpc05vZGUgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyAmJiB0eXBl
b2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHt9KS50b1N0cmluZy5jYWxsKHByb2Nlc3Mp
ID09PSAnW29iamVjdCBwcm9jZXNzXSc7CisKKyAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQg
bm90IGluIElFMTAKKyAgdmFyIGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9
PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiYg
dHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJzsKKworICAvLyBub2RlCisgIGZ1
bmN0aW9uIHVzZU5leHRUaWNrKCkgeworICAgIHZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRp
Y2s7CisgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdh
cm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5CisgICAgLy8gc2V0SW1tZWRp
YXRlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgaW5zdGVhZAorICAgIHZhciB2ZXJzaW9uID0gcHJv
Y2Vzcy52ZXJzaW9ucy5ub2RlLm1hdGNoKC9eKD86KFxkKylcLik/KD86KFxkKylcLik/KFwqfFxk
KykkLyk7CisgICAgaWYgKEFycmF5LmlzQXJyYXkodmVyc2lvbikgJiYgdmVyc2lvblsxXSA9PT0g
JzAnICYmIHZlcnNpb25bMl0gPT09ICcxMCcpIHsKKyAgICAgIG5leHRUaWNrID0gc2V0SW1tZWRp
YXRlOworICAgIH0KKyAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgbmV4dFRpY2soZmx1
c2gpOworICAgIH07CisgIH0KKworICAvLyB2ZXJ0eAorICBmdW5jdGlvbiB1c2VWZXJ0eFRpbWVy
KCkgeworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICB2ZXJ0eE5leHQoZmx1c2gpOwor
ICAgIH07CisgIH0KKworICBmdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKCkgeworICAgIHZh
ciBpdGVyYXRpb25zID0gMDsKKyAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9u
T2JzZXJ2ZXIoZmx1c2gpOworICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUo
JycpOworICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0p
OworCisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIG5vZGUuZGF0YSA9IGl0ZXJhdGlv
bnMgPSArK2l0ZXJhdGlvbnMgJSAyOworICAgIH07CisgIH0KKworICAvLyB3ZWIgd29ya2VyCisg
IGZ1bmN0aW9uIHVzZU1lc3NhZ2VDaGFubmVsKCkgeworICAgIHZhciBjaGFubmVsID0gbmV3IE1l
c3NhZ2VDaGFubmVsKCk7CisgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmbHVzaDsKKyAg
ICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgw
KTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gdXNlU2V0VGltZW91dCgpIHsKKyAgICByZXR1
cm4gZnVuY3Rpb24gKCkgeworICAgICAgc2V0VGltZW91dChmbHVzaCwgMSk7CisgICAgfTsKKyAg
fQorCisgIHZhciBxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTsKKyAgZnVuY3Rpb24gZmx1c2goKSB7
CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgdmFyIGNhbGxi
YWNrID0gcXVldWVbaV07CisgICAgICB2YXIgYXJnID0gcXVldWVbaSArIDFdOworCisgICAgICBj
YWxsYmFjayhhcmcpOworCisgICAgICBxdWV1ZVtpXSA9IHVuZGVmaW5lZDsKKyAgICAgIHF1ZXVl
W2kgKyAxXSA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBsZW4gPSAwOworICB9CisKKyAgZnVu
Y3Rpb24gYXR0ZW1wdFZlcnRleCgpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHIgPSByZXF1aXJl
OworICAgICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTsKKyAgICAgIHZlcnR4TmV4dCA9IHZlcnR4
LnJ1bk9uTG9vcCB8fCB2ZXJ0eC5ydW5PbkNvbnRleHQ7CisgICAgICByZXR1cm4gdXNlVmVydHhU
aW1lcigpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJldHVybiB1c2VTZXRUaW1lb3V0KCk7
CisgICAgfQorICB9CisKKyAgdmFyIHNjaGVkdWxlRmx1c2g7CisgIC8vIERlY2lkZSB3aGF0IGFz
eW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxs
YmFja3M6CisgIGlmIChpc05vZGUpIHsKKyAgICBzY2hlZHVsZUZsdXNoID0gdXNlTmV4dFRpY2so
KTsKKyAgfSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikgeworICAgIHNjaGVkdWxl
Rmx1c2ggPSB1c2VNdXRhdGlvbk9ic2VydmVyKCk7CisgIH0gZWxzZSBpZiAoaXNXb3JrZXIpIHsK
KyAgICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTsKKyAgfSBlbHNlIGlmIChi
cm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlv
bicpIHsKKyAgICBzY2hlZHVsZUZsdXNoID0gYXR0ZW1wdFZlcnRleCgpOworICB9IGVsc2Ugewor
ICAgIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7CisgIH0KK30pOworZW5pZmVkKCdy
c3ZwL2NvbmZpZycsIFsnZXhwb3J0cycsICdyc3ZwL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX3JzdnBFdmVudHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBjb25maWcgPSB7Cisg
ICAgaW5zdHJ1bWVudDogZmFsc2UKKyAgfTsKKworICBfcnN2cEV2ZW50cy5kZWZhdWx0WydtaXhp
biddKGNvbmZpZyk7CisKKyAgZnVuY3Rpb24gY29uZmlndXJlKG5hbWUsIHZhbHVlKSB7CisgICAg
aWYgKG5hbWUgPT09ICdvbmVycm9yJykgeworICAgICAgLy8gaGFuZGxlIGZvciBsZWdhY3kgdXNl
cnMgdGhhdCBleHBlY3QgdGhlIGFjdHVhbAorICAgICAgLy8gZXJyb3IgdG8gYmUgcGFzc2VkIHRv
IHRoZWlyIGZ1bmN0aW9uIGFkZGVkIHZpYQorICAgICAgLy8gYFJTVlAuY29uZmlndXJlKCdvbmVy
cm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAorICAgICAgY29uZmlnWydvbiddKCdlcnJvcicsIHZh
bHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9
PT0gMikgeworICAgICAgY29uZmlnW25hbWVdID0gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAg
IHJldHVybiBjb25maWdbbmFtZV07CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5jb25maWcgPSBj
b25maWc7CisgIGV4cG9ydHMuY29uZmlndXJlID0gY29uZmlndXJlOworfSk7CitlbmlmZWQoJ3Jz
dnAvZGVmZXInLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJ10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfcnN2cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IGRlZmVyOworCisgIC8qKgorICAgIGBSU1ZQLmRlZmVyYCByZXR1cm5zIGFuIG9iamVjdCBzaW1p
bGFyIHRvIGpRdWVyeSdzIGAkLkRlZmVycmVkYC4KKyAgICBgUlNWUC5kZWZlcmAgc2hvdWxkIGJl
IHVzZWQgd2hlbiBwb3J0aW5nIG92ZXIgY29kZSByZWxpYW50IG9uIGAkLkRlZmVycmVkYCdzCisg
ICAgaW50ZXJmYWNlLiBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBgUlNWUC5Qcm9taXNlYCBjb25z
dHJ1Y3RvciBpbnN0ZWFkLgorICAKKyAgICBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gYFJTVlAu
ZGVmZXJgIGlzIGEgcGxhaW4gb2JqZWN0IHdpdGggdGhyZWUgcHJvcGVydGllczoKKyAgCisgICAg
KiBwcm9taXNlIC0gYW4gYFJTVlAuUHJvbWlzZWAuCisgICAgKiByZWplY3QgLSBhIGZ1bmN0aW9u
IHRoYXQgY2F1c2VzIHRoZSBgcHJvbWlzZWAgcHJvcGVydHkgb24gdGhpcyBvYmplY3QgdG8KKyAg
ICAgIGJlY29tZSByZWplY3RlZAorICAgICogcmVzb2x2ZSAtIGEgZnVuY3Rpb24gdGhhdCBjYXVz
ZXMgdGhlIGBwcm9taXNlYCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCB0bworICAgICAgYmVjb21l
IGZ1bGZpbGxlZC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgdmFyIGRlZmVycmVkID0gUlNWUC5kZWZlcigpOworICAKKyAgICAgZGVmZXJyZWQucmVzb2x2
ZSgiU3VjY2VzcyEiKTsKKyAgCisgICAgIGRlZmVycmVkLnByb21pc2UudGhlbihmdW5jdGlvbih2
YWx1ZSl7CisgICAgICAgLy8gdmFsdWUgaGVyZSBpcyAiU3VjY2VzcyEiCisgICAgIH0pOworICAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBkZWZlcgorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAK
KyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0
aGUgcHJvbWlzZS4KKyAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7T2JqZWN0
fQorICAgKi8KKworICBmdW5jdGlvbiBkZWZlcihsYWJlbCkgeworICAgIHZhciBkZWZlcnJlZCA9
IHt9OworCisgICAgZGVmZXJyZWRbJ3Byb21pc2UnXSA9IG5ldyBfcnN2cFByb21pc2UuZGVmYXVs
dChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBkZWZlcnJlZFsncmVzb2x2ZSdd
ID0gcmVzb2x2ZTsKKyAgICAgIGRlZmVycmVkWydyZWplY3QnXSA9IHJlamVjdDsKKyAgICB9LCBs
YWJlbCk7CisKKyAgICByZXR1cm4gZGVmZXJyZWQ7CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL2Vu
dW1lcmF0b3InLCBbJ2V4cG9ydHMnLCAncnN2cC91dGlscycsICdyc3ZwLy1pbnRlcm5hbCddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX3JzdnBVdGlscywgX3JzdnBJbnRlcm5hbCkgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5tYWtlU2V0dGxlZFJlc3VsdCA9IG1ha2VTZXR0bGVkUmVzdWx0
OworCisgIGZ1bmN0aW9uIG1ha2VTZXR0bGVkUmVzdWx0KHN0YXRlLCBwb3NpdGlvbiwgdmFsdWUp
IHsKKyAgICBpZiAoc3RhdGUgPT09IF9yc3ZwSW50ZXJuYWwuRlVMRklMTEVEKSB7CisgICAgICBy
ZXR1cm4geworICAgICAgICBzdGF0ZTogJ2Z1bGZpbGxlZCcsCisgICAgICAgIHZhbHVlOiB2YWx1
ZQorICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgc3RhdGU6
ICdyZWplY3RlZCcsCisgICAgICAgIHJlYXNvbjogdmFsdWUKKyAgICAgIH07CisgICAgfQorICB9
CisKKyAgZnVuY3Rpb24gRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQsIGFib3J0T25SZWpl
Y3QsIGxhYmVsKSB7CisgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzOworCisgICAgZW51bWVyYXRv
ci5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yOworICAgIGVudW1lcmF0b3IucHJv
bWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsKKyAgICBl
bnVtZXJhdG9yLl9hYm9ydE9uUmVqZWN0ID0gYWJvcnRPblJlamVjdDsKKworICAgIGlmIChlbnVt
ZXJhdG9yLl92YWxpZGF0ZUlucHV0KGlucHV0KSkgeworICAgICAgZW51bWVyYXRvci5faW5wdXQg
PSBpbnB1dDsKKyAgICAgIGVudW1lcmF0b3IubGVuZ3RoID0gaW5wdXQubGVuZ3RoOworICAgICAg
ZW51bWVyYXRvci5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoOworCisgICAgICBlbnVtZXJhdG9y
Ll9pbml0KCk7CisKKyAgICAgIGlmIChlbnVtZXJhdG9yLmxlbmd0aCA9PT0gMCkgeworICAgICAg
ICBfcnN2cEludGVybmFsLmZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9y
ZXN1bHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bWVyYXRvci5sZW5ndGggPSBlbnVt
ZXJhdG9yLmxlbmd0aCB8fCAwOworICAgICAgICBlbnVtZXJhdG9yLl9lbnVtZXJhdGUoKTsKKyAg
ICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkgeworICAgICAgICAgIF9yc3Zw
SW50ZXJuYWwuZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX3JzdnBJbnRlcm5hbC5y
ZWplY3QoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl92YWxpZGF0aW9uRXJyb3IoKSk7
CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW51bWVyYXRvcjsKKworICBFbnVt
ZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVJbnB1dCA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAg
IHJldHVybiBfcnN2cFV0aWxzLmlzQXJyYXkoaW5wdXQpOworICB9OworCisgIEVudW1lcmF0b3Iu
cHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIG5l
dyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7CisgIH07
CisKKyAgRW51bWVyYXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhp
cy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKKyAgfTsKKworICBFbnVtZXJhdG9y
LnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBlbnVtZXJhdG9y
ID0gdGhpczsKKyAgICB2YXIgbGVuZ3RoID0gZW51bWVyYXRvci5sZW5ndGg7CisgICAgdmFyIHBy
b21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7CisgICAgdmFyIGlucHV0ID0gZW51bWVyYXRvci5f
aW5wdXQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50
ZXJuYWwuUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGVudW1lcmF0b3IuX2Vh
Y2hFbnRyeShpbnB1dFtpXSwgaSk7CisgICAgfQorICB9OworCisgIEVudW1lcmF0b3IucHJvdG90
eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbiAoZW50cnksIGkpIHsKKyAgICB2YXIgZW51bWVyYXRv
ciA9IHRoaXM7CisgICAgdmFyIGMgPSBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yOwor
ICAgIGlmIChfcnN2cFV0aWxzLmlzTWF5YmVUaGVuYWJsZShlbnRyeSkpIHsKKyAgICAgIGlmIChl
bnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09IF9yc3ZwSW50ZXJuYWwu
UEVORElORykgeworICAgICAgICBlbnRyeS5fb25FcnJvciA9IG51bGw7CisgICAgICAgIGVudW1l
cmF0b3IuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgZW51bWVyYXRvci5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRy
eSksIGkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnVtZXJhdG9yLl9yZW1haW5p
bmctLTsKKyAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudW1lcmF0b3IuX21ha2VSZXN1
bHQoX3JzdnBJbnRlcm5hbC5GVUxGSUxMRUQsIGksIGVudHJ5KTsKKyAgICB9CisgIH07CisKKyAg
RW51bWVyYXRvci5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uIChzdGF0ZSwgaSwgdmFs
dWUpIHsKKyAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7CisgICAgdmFyIHByb21pc2UgPSBlbnVt
ZXJhdG9yLnByb21pc2U7CisKKyAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50ZXJu
YWwuUEVORElORykgeworICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07CisKKyAgICAgIGlm
IChlbnVtZXJhdG9yLl9hYm9ydE9uUmVqZWN0ICYmIHN0YXRlID09PSBfcnN2cEludGVybmFsLlJF
SkVDVEVEKSB7CisgICAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIHZhbHVlKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudW1lcmF0
b3IuX21ha2VSZXN1bHQoc3RhdGUsIGksIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7CisgICAgICBfcnN2cEludGVybmFsLmZ1
bGZpbGwocHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTsKKyAgICB9CisgIH07CisKKyAgRW51
bWVyYXRvci5wcm90b3R5cGUuX21ha2VSZXN1bHQgPSBmdW5jdGlvbiAoc3RhdGUsIGksIHZhbHVl
KSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIEVudW1lcmF0b3IucHJvdG90eXBlLl93
aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiAocHJvbWlzZSwgaSkgeworICAgIHZhciBlbnVtZXJhdG9y
ID0gdGhpczsKKworICAgIF9yc3ZwSW50ZXJuYWwuc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5l
ZCwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoX3JzdnBJ
bnRlcm5hbC5GVUxGSUxMRUQsIGksIHZhbHVlKTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7
CisgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoX3JzdnBJbnRlcm5hbC5SRUpFQ1RFRCwgaSwg
cmVhc29uKTsKKyAgICB9KTsKKyAgfTsKK30pOworZW5pZmVkKCdyc3ZwL2V2ZW50cycsIFsnZXhw
b3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rp
b24gaW5kZXhPZihjYWxsYmFja3MsIGNhbGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGwg
PSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBpZiAoY2FsbGJhY2tzW2ld
ID09PSBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gLTE7CisgIH0KKworICBmdW5jdGlvbiBjYWxsYmFja3NGb3Iob2JqZWN0KSB7Cisg
ICAgdmFyIGNhbGxiYWNrcyA9IG9iamVjdC5fcHJvbWlzZUNhbGxiYWNrczsKKworICAgIGlmICgh
Y2FsbGJhY2tzKSB7CisgICAgICBjYWxsYmFja3MgPSBvYmplY3QuX3Byb21pc2VDYWxsYmFja3Mg
PSB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FsbGJhY2tzOworICB9CisKKyAgLyoqCisgICAg
QGNsYXNzIFJTVlAuRXZlbnRUYXJnZXQKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0geworCisg
ICAgLyoqCisgICAgICBgUlNWUC5FdmVudFRhcmdldC5taXhpbmAgZXh0ZW5kcyBhbiBvYmplY3Qg
d2l0aCBFdmVudFRhcmdldCBtZXRob2RzLiBGb3IKKyAgICAgIEV4YW1wbGU6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgdmFyIG9iamVjdCA9IHt9OworICAgICAgIFJTVlAuRXZlbnRUYXJn
ZXQubWl4aW4ob2JqZWN0KTsKKyAgICAgICBvYmplY3Qub24oJ2ZpbmlzaGVkJywgZnVuY3Rpb24o
ZXZlbnQpIHsKKyAgICAgICAgLy8gaGFuZGxlIGV2ZW50CisgICAgICB9KTsKKyAgICAgICBvYmpl
Y3QudHJpZ2dlcignZmluaXNoZWQnLCB7IGRldGFpbDogdmFsdWUgfSk7CisgICAgICBgYGAKKyAg
ICAgICBgRXZlbnRUYXJnZXQubWl4aW5gIGFsc28gd29ya3Mgd2l0aCBwcm90b3R5cGVzOgorICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBQZXJzb24gPSBmdW5jdGlvbigpIHt9OworICAg
ICAgUlNWUC5FdmVudFRhcmdldC5taXhpbihQZXJzb24ucHJvdG90eXBlKTsKKyAgICAgICB2YXIg
eWVodWRhID0gbmV3IFBlcnNvbigpOworICAgICAgdmFyIHRvbSA9IG5ldyBQZXJzb24oKTsKKyAg
ICAgICB5ZWh1ZGEub24oJ3Bva2UnLCBmdW5jdGlvbihldmVudCkgeworICAgICAgICBjb25zb2xl
LmxvZygnWWVodWRhIHNheXMgT1cnKTsKKyAgICAgIH0pOworICAgICAgIHRvbS5vbigncG9rZScs
IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCdUb20gc2F5cyBPVycpOwor
ICAgICAgfSk7CisgICAgICAgeWVodWRhLnRyaWdnZXIoJ3Bva2UnKTsKKyAgICAgIHRvbS50cmln
Z2VyKCdwb2tlJyk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIG1peGluCisgICAgICBAZm9y
IFJTVlAuRXZlbnRUYXJnZXQKKyAgICAgIEBwcml2YXRlCisgICAgICBAcGFyYW0ge09iamVjdH0g
b2JqZWN0IG9iamVjdCB0byBleHRlbmQgd2l0aCBFdmVudFRhcmdldCBtZXRob2RzCisgICAgKi8K
KyAgICAnbWl4aW4nOiBmdW5jdGlvbiAob2JqZWN0KSB7CisgICAgICBvYmplY3RbJ29uJ10gPSB0
aGlzWydvbiddOworICAgICAgb2JqZWN0WydvZmYnXSA9IHRoaXNbJ29mZiddOworICAgICAgb2Jq
ZWN0Wyd0cmlnZ2VyJ10gPSB0aGlzWyd0cmlnZ2VyJ107CisgICAgICBvYmplY3QuX3Byb21pc2VD
YWxsYmFja3MgPSB1bmRlZmluZWQ7CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYGV2
ZW50TmFtZWAgaXMgdHJpZ2dlcmVkCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgb2JqZWN0
Lm9uKCdldmVudCcsIGZ1bmN0aW9uKGV2ZW50SW5mbyl7CisgICAgICAgIC8vIGhhbmRsZSB0aGUg
ZXZlbnQKKyAgICAgIH0pOworICAgICAgIG9iamVjdC50cmlnZ2VyKCdldmVudCcpOworICAgICAg
YGBgCisgICAgICAgQG1ldGhvZCBvbgorICAgICAgQGZvciBSU1ZQLkV2ZW50VGFyZ2V0CisgICAg
ICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBuYW1lIG9mIHRoZSBl
dmVudCB0byBsaXN0ZW4gZm9yCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBmdW5j
dGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICovCisg
ICAgJ29uJzogZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKKyAgICAgIGlmICh0eXBl
b2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJv
cignQ2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7CisgICAgICB9CisKKyAgICAgIHZhciBh
bGxDYWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAgY2FsbGJhY2tzOwor
CisgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXTsKKworICAgICAgaWYg
KCFjYWxsYmFja3MpIHsKKyAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFt
ZV0gPSBbXTsKKyAgICAgIH0KKworICAgICAgaWYgKGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFj
aykgPT09IC0xKSB7CisgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBZb3UgY2FuIHVzZSBgb2ZmYCB0byBzdG9wIGZpcmlu
ZyBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgZm9yIGFuIGV2ZW50OgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIGZ1bmN0aW9uIGRvU3R1ZmYoKSB7IC8vIGRvIHN0dWZmISB9CisgICAgICBvYmpl
Y3Qub24oJ3N0dWZmJywgZG9TdHVmZik7CisgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7
IC8vIGRvU3R1ZmYgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAvLyBVbnJlZ2lzdGVyIE9OTFkgdGhl
IGRvU3R1ZmYgY2FsbGJhY2sKKyAgICAgIG9iamVjdC5vZmYoJ3N0dWZmJywgZG9TdHVmZik7Cisg
ICAgICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIE5PVCBiZSBjYWxs
ZWQKKyAgICAgIGBgYAorICAgICAgIElmIHlvdSBkb24ndCBwYXNzIGEgYGNhbGxiYWNrYCBhcmd1
bWVudCB0byBgb2ZmYCwgQUxMIGNhbGxiYWNrcyBmb3IgdGhlCisgICAgICBldmVudCB3aWxsIG5v
dCBiZSBleGVjdXRlZCB3aGVuIHRoZSBldmVudCBmaXJlcy4gRm9yIGV4YW1wbGU6CisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNhbGxiYWNrMSA9IGZ1bmN0aW9uKCl7fTsKKyAgICAg
IHZhciBjYWxsYmFjazIgPSBmdW5jdGlvbigpe307CisgICAgICAgb2JqZWN0Lm9uKCdzdHVmZics
IGNhbGxiYWNrMSk7CisgICAgICBvYmplY3Qub24oJ3N0dWZmJywgY2FsbGJhY2syKTsKKyAgICAg
ICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gY2FsbGJhY2sxIGFuZCBjYWxsYmFjazIgd2ls
bCBiZSBleGVjdXRlZC4KKyAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicpOworICAgICAgb2JqZWN0
LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2syIHdpbGwgbm90IGJl
IGV4ZWN1dGVkIQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBvZmYKKyAgICAgIEBmb3IgUlNW
UC5FdmVudFRhcmdldAorICAgICAgQHByaXZhdGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBldmVu
dE5hbWUgZXZlbnQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8KKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3VtZW50LiBJZiBnaXZlbiwgb25seSB0aGUgZnVuY3Rpb24K
KyAgICAgIGdpdmVuIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBldmVudCdzIGNhbGxiYWNrIHF1
ZXVlLiBJZiBubyBgY2FsbGJhY2tgCisgICAgICBhcmd1bWVudCBpcyBnaXZlbiwgYWxsIGNhbGxi
YWNrcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQncyBjYWxsYmFjaworICAgICAgcXVl
dWUuCisgICAgKi8KKyAgICAnb2ZmJzogZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsK
KyAgICAgIHZhciBhbGxDYWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAg
Y2FsbGJhY2tzLAorICAgICAgICAgIGluZGV4OworCisgICAgICBpZiAoIWNhbGxiYWNrKSB7Cisg
ICAgICAgIGFsbENhbGxiYWNrc1tldmVudE5hbWVdID0gW107CisgICAgICAgIHJldHVybjsKKyAg
ICAgIH0KKworICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV07CisKKyAg
ICAgIGluZGV4ID0gaW5kZXhPZihjYWxsYmFja3MsIGNhbGxiYWNrKTsKKworICAgICAgaWYgKGlu
ZGV4ICE9PSAtMSkgeworICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTsKKyAgICAg
IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBVc2UgYHRyaWdnZXJgIHRvIGZpcmUgY3VzdG9t
IGV2ZW50cy4gRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgb2JqZWN0
Lm9uKCdmb28nLCBmdW5jdGlvbigpeworICAgICAgICBjb25zb2xlLmxvZygnZm9vIGV2ZW50IGhh
cHBlbmVkIScpOworICAgICAgfSk7CisgICAgICBvYmplY3QudHJpZ2dlcignZm9vJyk7CisgICAg
ICAvLyAnZm9vIGV2ZW50IGhhcHBlbmVkIScgbG9nZ2VkIHRvIHRoZSBjb25zb2xlCisgICAgICBg
YGAKKyAgICAgICBZb3UgY2FuIGFsc28gcGFzcyBhIHZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50
IHRvIGB0cmlnZ2VyYCB0aGF0IHdpbGwgYmUKKyAgICAgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0
byBhbGwgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQ6CisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgb2JqZWN0Lm9uKCdmb28nLCBmdW5jdGlvbih2YWx1ZSl7CisgICAgICAgIGNvbnNv
bGUubG9nKHZhbHVlLm5hbWUpOworICAgICAgfSk7CisgICAgICAgb2JqZWN0LnRyaWdnZXIoJ2Zv
bycsIHsgbmFtZTogJ2JhcicgfSk7CisgICAgICAvLyAnYmFyJyBsb2dnZWQgdG8gdGhlIGNvbnNv
bGUKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgdHJpZ2dlcgorICAgICAgQGZvciBSU1ZQLkV2
ZW50VGFyZ2V0CisgICAgICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFt
ZSBuYW1lIG9mIHRoZSBldmVudCB0byBiZSB0cmlnZ2VyZWQKKyAgICAgIEBwYXJhbSB7Kn0gb3B0
aW9ucyBvcHRpb25hbCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gYW55IGV2ZW50IGhhbmRsZXJzIGZv
cgorICAgICAgdGhlIGdpdmVuIGBldmVudE5hbWVgCisgICAgKi8KKyAgICAndHJpZ2dlcic6IGZ1
bmN0aW9uIChldmVudE5hbWUsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBhbGxDYWxsYmFja3MgPSBj
YWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAgY2FsbGJhY2tzLAorICAgICAgICAgIGNhbGxi
YWNrOworCisgICAgICBpZiAoY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0pIHsK
KyAgICAgICAgLy8gRG9uJ3QgY2FjaGUgdGhlIGNhbGxiYWNrcy5sZW5ndGggc2luY2UgaXQgbWF5
IGdyb3cKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTsKKworICAgICAgICAgIGNhbGxi
YWNrKG9wdGlvbnMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7Citlbmlm
ZWQoJ3JzdnAvZmlsdGVyJywgWydleHBvcnRzJywgJ3JzdnAvcHJvbWlzZScsICdyc3ZwL3V0aWxz
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGZpbHRlcjsKKworICAvKioKKyAgIGBS
U1ZQLmZpbHRlcmAgaXMgc2ltaWxhciB0byBKYXZhU2NyaXB0J3MgbmF0aXZlIGBmaWx0ZXJgIG1l
dGhvZCwgZXhjZXB0IHRoYXQgaXQKKyAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29t
ZSBmdWxmaWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBmaWx0ZXJGbmAgb24KKyAgICBlYWNoIGl0
ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAuZmlsdGVyYCByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHdpbGwKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBydW5u
aW5nIGBmaWx0ZXJGbmAgb24gdGhlIHZhbHVlcyB0aGUKKyAgICBwcm9taXNlcyBiZWNvbWUgZnVs
ZmlsbGVkIHdpdGguCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgIAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlz
ZTIgPSBSU1ZQLnJlc29sdmUoMik7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMp
OworICAKKyAgICB2YXIgcHJvbWlzZXMgPSBbcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlM107
CisgIAorICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0peworICAgICAgcmV0dXJuIGl0
ZW0gPiAxOworICAgIH07CisgIAorICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbiku
dGhlbihmdW5jdGlvbihyZXN1bHQpeworICAgICAgLy8gcmVzdWx0IGlzIFsgMiwgMyBdCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBg
UlNWUC5maWx0ZXJgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0IHByb21pc2UKKyAgICB0aGF0IGlz
IHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHBy
b21pc2UncworICAgIHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIg
cHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3IoJzInKSk7CisgICAgdmFyIHByb21pc2Uz
ID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCczJykpOworICAgIHZhciBwcm9taXNlcyA9IFsgcHJv
bWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAKKyAgICB2YXIgZmlsdGVyRm4gPSBmdW5j
dGlvbihpdGVtKXsKKyAgICAgIHJldHVybiBpdGVtID4gMTsKKyAgICB9OworICAKKyAgICBSU1ZQ
LmZpbHRlcihwcm9taXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24oYXJyYXkpeworICAgICAg
Ly8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlz
ZXMhCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAvLyByZWFzb24ubWVzc2FnZSA9
PT0gJzInCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBSU1ZQLmZpbHRlcmAgd2lsbCBhbHNv
IHdhaXQgZm9yIGFueSBwcm9taXNlcyByZXR1cm5lZCBmcm9tIGBmaWx0ZXJGbmAuCisgICAgRm9y
IGluc3RhbmNlLCB5b3UgbWF5IHdhbnQgdG8gZmV0Y2ggYSBsaXN0IG9mIHVzZXJzIHRoZW4gcmV0
dXJuIGEgc3Vic2V0CisgICAgb2YgdGhvc2UgdXNlcnMgYmFzZWQgb24gc29tZSBhc3luY2hyb25v
dXMgb3BlcmF0aW9uOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgIAorICAgIHZhciBhbGljZSA9
IHsgbmFtZTogJ2FsaWNlJyB9OworICAgIHZhciBib2IgICA9IHsgbmFtZTogJ2JvYicgfTsKKyAg
ICB2YXIgdXNlcnMgPSBbIGFsaWNlLCBib2IgXTsKKyAgCisgICAgdmFyIHByb21pc2VzID0gdXNl
cnMubWFwKGZ1bmN0aW9uKHVzZXIpeworICAgICAgcmV0dXJuIFJTVlAucmVzb2x2ZSh1c2VyKTsK
KyAgICB9KTsKKyAgCisgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24odXNlcil7CisgICAgICAv
LyBIZXJlLCBBbGljZSBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGEgYmxvZyBwb3N0LCBidXQg
Qm9iIGRvZXMgbm90LgorICAgICAgcmV0dXJuIGdldFByaXZpbGVnZXNGb3JVc2VyKHVzZXIpLnRo
ZW4oZnVuY3Rpb24ocHJpdnMpeworICAgICAgICByZXR1cm4gcHJpdnMuY2FuX2NyZWF0ZV9ibG9n
X3Bvc3QgPT09IHRydWU7CisgICAgICB9KTsKKyAgICB9OworICAgIFJTVlAuZmlsdGVyKHByb21p
c2VzLCBmaWx0ZXJGbikudGhlbihmdW5jdGlvbih1c2Vycyl7CisgICAgICAvLyB0cnVlLCBiZWNh
dXNlIHRoZSBzZXJ2ZXIgdG9sZCB1cyBvbmx5IEFsaWNlIGNhbiBjcmVhdGUgYSBibG9nIHBvc3Qu
CisgICAgICB1c2Vycy5sZW5ndGggPT09IDE7CisgICAgICAvLyBmYWxzZSwgYmVjYXVzZSBBbGlj
ZSBpcyB0aGUgb25seSB1c2VyIHByZXNlbnQgaW4gYHVzZXJzYAorICAgICAgdXNlcnNbMF0gPT09
IGJvYjsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBmaWx0ZXIKKyAgICBAc3Rh
dGljCisgICAgQGZvciBSU1ZQCisgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKKyAgICBAcGFy
YW0ge0Z1bmN0aW9ufSBmaWx0ZXJGbiAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIHJl
c29sdmVkIHZhbHVlIHRvCisgICAgZmlsdGVyIHRoZSBmaW5hbCByZXN1bHRzLgorICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4g
VXNlZnVsIGZvcgorICAgIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgKi8KKwor
ICBmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkgeworICAgIHJldHVy
biBfcnN2cFByb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMsIGxhYmVsKS50aGVuKGZ1bmN0aW9u
ICh2YWx1ZXMpIHsKKyAgICAgIGlmICghX3JzdnBVdGlscy5pc0Z1bmN0aW9uKGZpbHRlckZuKSkg
eworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24g
YXMgZmlsdGVyJ3Mgc2Vjb25kIGFyZ3VtZW50LiIpOworICAgICAgfQorCisgICAgICB2YXIgbGVu
Z3RoID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgIHZhciBmaWx0ZXJlZCA9IG5ldyBBcnJheShsZW5n
dGgpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAg
IGZpbHRlcmVkW2ldID0gZmlsdGVyRm4odmFsdWVzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LmFsbChmaWx0ZXJlZCwgbGFiZWwpLnRoZW4oZnVuY3Rp
b24gKGZpbHRlcmVkKSB7CisgICAgICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7
CisgICAgICAgIHZhciBuZXdMZW5ndGggPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoZmlsdGVyZWRbaV0pIHsKKyAgICAgICAg
ICAgIHJlc3VsdHNbbmV3TGVuZ3RoXSA9IHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG5ld0xlbmd0
aCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdHMubGVuZ3RoID0g
bmV3TGVuZ3RoOworCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgfSk7CisgICAgfSk7
CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL2hhc2gtc2V0dGxlZCcsIFsnZXhwb3J0cycsICdyc3Zw
L3Byb21pc2UnLCAncnN2cC9lbnVtZXJhdG9yJywgJ3JzdnAvcHJvbWlzZS1oYXNoJywgJ3JzdnAv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSwgX3JzdnBFbnVtZXJhdG9y
LCBfcnN2cFByb21pc2VIYXNoLCBfcnN2cFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBoYXNoU2V0dGxlZDsKKworICBmdW5jdGlvbiBIYXNoU2V0dGxlZChD
b25zdHJ1Y3Rvciwgb2JqZWN0LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3Io
Q29uc3RydWN0b3IsIG9iamVjdCwgZmFsc2UsIGxhYmVsKTsKKyAgfQorCisgIEhhc2hTZXR0bGVk
LnByb3RvdHlwZSA9IF9yc3ZwVXRpbHMub19jcmVhdGUoX3JzdnBQcm9taXNlSGFzaC5kZWZhdWx0
LnByb3RvdHlwZSk7CisgIEhhc2hTZXR0bGVkLnByb3RvdHlwZS5fc3VwZXJDb25zdHJ1Y3RvciA9
IF9yc3ZwRW51bWVyYXRvci5kZWZhdWx0OworICBIYXNoU2V0dGxlZC5wcm90b3R5cGUuX21ha2VS
ZXN1bHQgPSBfcnN2cEVudW1lcmF0b3IubWFrZVNldHRsZWRSZXN1bHQ7CisKKyAgSGFzaFNldHRs
ZWQucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJu
IG5ldyBFcnJvcignaGFzaFNldHRsZWQgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QnKTsK
KyAgfTsKKworICAvKioKKyAgICBgUlNWUC5oYXNoU2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNW
UC5hbGxTZXR0bGVkYCwgYnV0IHRha2VzIGFuIG9iamVjdAorICAgIGluc3RlYWQgb2YgYW4gYXJy
YXkgZm9yIGl0cyBgcHJvbWlzZXNgIGFyZ3VtZW50LgorICAKKyAgICBVbmxpa2UgYFJTVlAuYWxs
YCBvciBgUlNWUC5oYXNoYCwgd2hpY2ggaW1wbGVtZW50IGEgZmFpbC1mYXN0IG1ldGhvZCwKKyAg
ICBidXQgbGlrZSBgUlNWUC5hbGxTZXR0bGVkYCwgYGhhc2hTZXR0bGVkYCB3YWl0cyB1bnRpbCBh
bGwgdGhlCisgICAgY29uc3RpdHVlbnQgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQgdGhlbiBz
aG93cyB5b3UgYWxsIHRoZSByZXN1bHRzCisgICAgd2l0aCB0aGVpciBzdGF0ZXMgYW5kIHZhbHVl
cy9yZWFzb25zLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworICAgIGhhbmRsZSBtdWx0
aXBsZSBwcm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIgYXMgYSBzZXQuCisgIAorICAg
IFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBw
cm9taXNlcyBoYXZlIGJlZW4KKyAgICBzZXR0bGVkLCBvciByZWplY3RlZCBpZiB0aGUgcGFzc2Vk
IHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgIAorICAgIFRoZSByZXR1cm5lZCBwcm9taXNlIGlz
IGZ1bGZpbGxlZCB3aXRoIGEgaGFzaCB0aGF0IGhhcyB0aGUgc2FtZSBrZXkgbmFtZXMgYXMKKyAg
ICB0aGUgYHByb21pc2VzYCBvYmplY3QgYXJndW1lbnQuIElmIGFueSBvZiB0aGUgdmFsdWVzIGlu
IHRoZSBvYmplY3QgYXJlIG5vdAorICAgIHByb21pc2VzLCB0aGV5IHdpbGwgYmUgY29waWVkIG92
ZXIgdG8gdGhlIGZ1bGZpbGxlZCBvYmplY3QgYW5kIG1hcmtlZCB3aXRoIHN0YXRlCisgICAgJ2Z1
bGZpbGxlZCcuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2
YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEp
LAorICAgICAgeW91clByb21pc2U6IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDIpLAorICAgICAgdGhl
aXJQcm9taXNlOiBSU1ZQLlByb21pc2UucmVzb2x2ZSgzKSwKKyAgICAgIG5vdEFQcm9taXNlOiA0
CisgICAgfTsKKyAgCisgICAgUlNWUC5oYXNoU2V0dGxlZChwcm9taXNlcykudGhlbihmdW5jdGlv
bihoYXNoKXsKKyAgICAgIC8vIGhhc2ggaGVyZSBpcyBhbiBvYmplY3QgdGhhdCBsb29rcyBsaWtl
OgorICAgICAgLy8geworICAgICAgLy8gICBteVByb21pc2U6IHsgc3RhdGU6ICdmdWxmaWxsZWQn
LCB2YWx1ZTogMSB9LAorICAgICAgLy8gICB5b3VyUHJvbWlzZTogeyBzdGF0ZTogJ2Z1bGZpbGxl
ZCcsIHZhbHVlOiAyIH0sCisgICAgICAvLyAgIHRoZWlyUHJvbWlzZTogeyBzdGF0ZTogJ2Z1bGZp
bGxlZCcsIHZhbHVlOiAzIH0sCisgICAgICAvLyAgIG5vdEFQcm9taXNlOiB7IHN0YXRlOiAnZnVs
ZmlsbGVkJywgdmFsdWU6IDQgfQorICAgICAgLy8gfQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJlamVj
dGVkLCB0aGUgc3RhdGUgd2lsbAorICAgIGJlIHNldCB0byAncmVqZWN0ZWQnIGFuZCB0aGUgcmVh
c29uIGZvciByZWplY3Rpb24gcHJvdmlkZWQuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJTVlAu
UHJvbWlzZS5yZXNvbHZlKDEpLAorICAgICAgcmVqZWN0ZWRQcm9taXNlOiBSU1ZQLlByb21pc2Uu
cmVqZWN0KG5ldyBFcnJvcigncmVqZWN0aW9uJykpLAorICAgICAgYW5vdGhlclJlamVjdGVkUHJv
bWlzZTogUlNWUC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ21vcmUgcmVqZWN0aW9uJykpLAor
ICAgIH07CisgIAorICAgIFJTVlAuaGFzaFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24o
aGFzaCl7CisgICAgICAvLyBoYXNoIGhlcmUgaXMgYW4gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToK
KyAgICAgIC8vIHsKKyAgICAgIC8vICAgbXlQcm9taXNlOiAgICAgICAgICAgICAgeyBzdGF0ZTog
J2Z1bGZpbGxlZCcsIHZhbHVlOiAxIH0sCisgICAgICAvLyAgIHJlamVjdGVkUHJvbWlzZTogICAg
ICAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJlYXNvbjogRXJyb3IgfSwKKyAgICAgIC8vICAgYW5v
dGhlclJlamVjdGVkUHJvbWlzZTogeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJvciB9
LAorICAgICAgLy8gfQorICAgICAgLy8gTm90ZSB0aGF0IGZvciByZWplY3RlZFByb21pc2UsIHJl
YXNvbi5tZXNzYWdlID09ICdyZWplY3Rpb24nLAorICAgICAgLy8gYW5kIGZvciBhbm90aGVyUmVq
ZWN0ZWRQcm9taXNlLCByZWFzb24ubWVzc2FnZSA9PSAnbW9yZSByZWplY3Rpb24nLgorICAgIH0p
OworICAgIGBgYAorICAKKyAgICBBbiBpbXBvcnRhbnQgbm90ZTogYFJTVlAuaGFzaFNldHRsZWRg
IGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMgdGhhdAorICAgIGFyZSBq
dXN0IGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcy4gYFJTVlAuaGFzaFNldHRsZWRgIHdpbGwgTk9U
IHByZXNlcnZlIHByb3RvdHlwZQorICAgIGNoYWlucy4KKyAgCisgICAgRXhhbXBsZToKKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXsKKyAgICAgIHRo
aXMuZXhhbXBsZSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKCdFeGFtcGxlJyk7CisgICAgfQorICAK
KyAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHsKKyAgICAgIHByb3RvUHJvcGVydHk6IFJT
VlAuUHJvbWlzZS5yZXNvbHZlKCdQcm90byBQcm9wZXJ0eScpCisgICAgfTsKKyAgCisgICAgdmFy
IG15T2JqZWN0ID0gbmV3IE15Q29uc3RydWN0b3IoKTsKKyAgCisgICAgUlNWUC5oYXNoU2V0dGxl
ZChteU9iamVjdCkudGhlbihmdW5jdGlvbihoYXNoKXsKKyAgICAgIC8vIHByb3RvUHJvcGVydHkg
d2lsbCBub3QgYmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUgYW4KKyAgICAg
IC8vIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6CisgICAgICAvLyB7CisgICAgICAvLyAgIGV4YW1w
bGU6IHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogJ0V4YW1wbGUnIH0KKyAgICAgIC8vIH0K
KyAgICAgIC8vCisgICAgICAvLyBoYXNoLmhhc093blByb3BlcnR5KCdwcm90b1Byb3BlcnR5Jyk7
IC8vIGZhbHNlCisgICAgICAvLyAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGhhc2gucHJvdG9Qcm9w
ZXJ0eQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGhhc2hTZXR0bGVkCisgICAg
QGZvciBSU1ZQCisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdAorICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHByb21pc2UuCisgICAg
VXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBp
cyBmdWxmaWxsZWQgd2hlbiB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKKyAgICBo
YXZlIGJlZW4gc2V0dGxlZC4KKyAgICBAc3RhdGljCisgICovCisKKyAgZnVuY3Rpb24gaGFzaFNl
dHRsZWQob2JqZWN0LCBsYWJlbCkgeworICAgIHJldHVybiBuZXcgSGFzaFNldHRsZWQoX3JzdnBQ
cm9taXNlLmRlZmF1bHQsIG9iamVjdCwgbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5pZmVk
KCdyc3ZwL2hhc2gnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJywgJ3JzdnAvcHJvbWlzZS1o
YXNoJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwUHJvbWlzZUhhc2gp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGhhc2g7CisKKyAgLyoq
CisgICAgYFJTVlAuaGFzaGAgaXMgc2ltaWxhciB0byBgUlNWUC5hbGxgLCBidXQgdGFrZXMgYW4g
b2JqZWN0IGluc3RlYWQgb2YgYW4gYXJyYXkKKyAgICBmb3IgaXRzIGBwcm9taXNlc2AgYXJndW1l
bnQuCisgIAorICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxs
IHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KKyAgICBmdWxmaWxsZWQsIG9yIHJlamVjdGVk
IGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC4gVGhlIHJldHVybmVkIHByb21pc2UKKyAg
ICBpcyBmdWxmaWxsZWQgd2l0aCBhIGhhc2ggdGhhdCBoYXMgdGhlIHNhbWUga2V5IG5hbWVzIGFz
IHRoZSBgcHJvbWlzZXNgIG9iamVjdAorICAgIGFyZ3VtZW50LiBJZiBhbnkgb2YgdGhlIHZhbHVl
cyBpbiB0aGUgb2JqZWN0IGFyZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAorICAgIHNpbXBseSBi
ZSBjb3BpZWQgb3ZlciB0byB0aGUgZnVsZmlsbGVkIG9iamVjdC4KKyAgCisgICAgRXhhbXBsZToK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlcyA9IHsKKyAgICAgIG15UHJv
bWlzZTogUlNWUC5yZXNvbHZlKDEpLAorICAgICAgeW91clByb21pc2U6IFJTVlAucmVzb2x2ZSgy
KSwKKyAgICAgIHRoZWlyUHJvbWlzZTogUlNWUC5yZXNvbHZlKDMpLAorICAgICAgbm90QVByb21p
c2U6IDQKKyAgICB9OworICAKKyAgICBSU1ZQLmhhc2gocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24o
aGFzaCl7CisgICAgICAvLyBoYXNoIGhlcmUgaXMgYW4gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToK
KyAgICAgIC8vIHsKKyAgICAgIC8vICAgbXlQcm9taXNlOiAxLAorICAgICAgLy8gICB5b3VyUHJv
bWlzZTogMiwKKyAgICAgIC8vICAgdGhlaXJQcm9taXNlOiAzLAorICAgICAgLy8gICBub3RBUHJv
bWlzZTogNAorICAgICAgLy8gfQorICAgIH0pOworICAgIGBgYGAKKyAgCisgICAgSWYgYW55IG9m
IHRoZSBgcHJvbWlzZXNgIGdpdmVuIHRvIGBSU1ZQLmhhc2hgIGFyZSByZWplY3RlZCwgdGhlIGZp
cnN0IHByb21pc2UKKyAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgdGhlIHJl
YXNvbiB0byB0aGUgcmVqZWN0aW9uIGhhbmRsZXIuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJT
VlAucmVzb2x2ZSgxKSwKKyAgICAgIHJlamVjdGVkUHJvbWlzZTogUlNWUC5yZWplY3QobmV3IEVy
cm9yKCdyZWplY3RlZFByb21pc2UnKSksCisgICAgICBhbm90aGVyUmVqZWN0ZWRQcm9taXNlOiBS
U1ZQLnJlamVjdChuZXcgRXJyb3IoJ2Fub3RoZXJSZWplY3RlZFByb21pc2UnKSksCisgICAgfTsK
KyAgCisgICAgUlNWUC5oYXNoKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGhhc2gpeworICAgICAg
Ly8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlz
ZXMhCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAvLyByZWFzb24ubWVzc2FnZSA9
PT0gJ3JlamVjdGVkUHJvbWlzZScKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQW4gaW1wb3J0
YW50IG5vdGU6IGBSU1ZQLmhhc2hgIGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9i
amVjdHMgdGhhdAorICAgIGFyZSBqdXN0IGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcy4gYFJTVlAu
aGFzaGAgd2lsbCBOT1QgcHJlc2VydmUgcHJvdG90eXBlCisgICAgY2hhaW5zLgorICAKKyAgICBF
eGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gTXlDb25zdHJ1Y3Rv
cigpeworICAgICAgdGhpcy5leGFtcGxlID0gUlNWUC5yZXNvbHZlKCdFeGFtcGxlJyk7CisgICAg
fQorICAKKyAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHsKKyAgICAgIHByb3RvUHJvcGVy
dHk6IFJTVlAucmVzb2x2ZSgnUHJvdG8gUHJvcGVydHknKQorICAgIH07CisgIAorICAgIHZhciBt
eU9iamVjdCA9IG5ldyBNeUNvbnN0cnVjdG9yKCk7CisgIAorICAgIFJTVlAuaGFzaChteU9iamVj
dCkudGhlbihmdW5jdGlvbihoYXNoKXsKKyAgICAgIC8vIHByb3RvUHJvcGVydHkgd2lsbCBub3Qg
YmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUgYW4KKyAgICAgIC8vIG9iamVj
dCB0aGF0IGxvb2tzIGxpa2U6CisgICAgICAvLyB7CisgICAgICAvLyAgIGV4YW1wbGU6ICdFeGFt
cGxlJworICAgICAgLy8gfQorICAgICAgLy8KKyAgICAgIC8vIGhhc2guaGFzT3duUHJvcGVydHko
J3Byb3RvUHJvcGVydHknKTsgLy8gZmFsc2UKKyAgICAgIC8vICd1bmRlZmluZWQnID09PSB0eXBl
b2YgaGFzaC5wcm90b1Byb3BlcnR5CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2Qg
aGFzaAorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyB0aGF0IGRlc2Ny
aWJlcyB0aGUgcHJvbWlzZS4KKyAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7
UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9m
IGBwcm9taXNlc2AKKyAgICBoYXZlIGJlZW4gZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkg
b2YgdGhlbSBiZWNvbWUgcmVqZWN0ZWQuCisgICovCisKKyAgZnVuY3Rpb24gaGFzaChvYmplY3Qs
IGxhYmVsKSB7CisgICAgcmV0dXJuIG5ldyBfcnN2cFByb21pc2VIYXNoLmRlZmF1bHQoX3JzdnBQ
cm9taXNlLmRlZmF1bHQsIG9iamVjdCwgbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5pZmVk
KCdyc3ZwL2luc3RydW1lbnQnLCBbJ2V4cG9ydHMnLCAncnN2cC9jb25maWcnLCAncnN2cC91dGls
cyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBDb25maWcsIF9yc3ZwVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGluc3RydW1lbnQ7CisKKyAgdmFyIHF1
ZXVlID0gW107CisKKyAgZnVuY3Rpb24gc2NoZWR1bGVGbHVzaCgpIHsKKyAgICBzZXRUaW1lb3V0
KGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBlbnRyeTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcXVldWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSBxdWV1ZVtpXTsKKworICAg
ICAgICB2YXIgcGF5bG9hZCA9IGVudHJ5LnBheWxvYWQ7CisKKyAgICAgICAgcGF5bG9hZC5ndWlk
ID0gcGF5bG9hZC5rZXkgKyBwYXlsb2FkLmlkOworICAgICAgICBwYXlsb2FkLmNoaWxkR3VpZCA9
IHBheWxvYWQua2V5ICsgcGF5bG9hZC5jaGlsZElkOworICAgICAgICBpZiAocGF5bG9hZC5lcnJv
cikgeworICAgICAgICAgIHBheWxvYWQuc3RhY2sgPSBwYXlsb2FkLmVycm9yLnN0YWNrOworICAg
ICAgICB9CisKKyAgICAgICAgX3JzdnBDb25maWcuY29uZmlnWyd0cmlnZ2VyJ10oZW50cnkubmFt
ZSwgZW50cnkucGF5bG9hZCk7CisgICAgICB9CisgICAgICBxdWV1ZS5sZW5ndGggPSAwOworICAg
IH0sIDUwKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluc3RydW1lbnQoZXZlbnROYW1lLCBwcm9taXNl
LCBjaGlsZCkgeworICAgIGlmICgxID09PSBxdWV1ZS5wdXNoKHsKKyAgICAgIG5hbWU6IGV2ZW50
TmFtZSwKKyAgICAgIHBheWxvYWQ6IHsKKyAgICAgICAga2V5OiBwcm9taXNlLl9ndWlkS2V5LAor
ICAgICAgICBpZDogcHJvbWlzZS5faWQsCisgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAor
ICAgICAgICBkZXRhaWw6IHByb21pc2UuX3Jlc3VsdCwKKyAgICAgICAgY2hpbGRJZDogY2hpbGQg
JiYgY2hpbGQuX2lkLAorICAgICAgICBsYWJlbDogcHJvbWlzZS5fbGFiZWwsCisgICAgICAgIHRp
bWVTdGFtcDogX3JzdnBVdGlscy5ub3coKSwKKyAgICAgICAgZXJyb3I6IF9yc3ZwQ29uZmlnLmNv
bmZpZ1siaW5zdHJ1bWVudC13aXRoLXN0YWNrIl0gPyBuZXcgRXJyb3IocHJvbWlzZS5fbGFiZWwp
IDogbnVsbAorICAgICAgfSB9KSkgeworICAgICAgc2NoZWR1bGVGbHVzaCgpOworICAgIH0KKyAg
fQorfSk7CitlbmlmZWQoJ3JzdnAvbWFwJywgWydleHBvcnRzJywgJ3JzdnAvcHJvbWlzZScsICdy
c3ZwL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IG1hcDsKKworICAvKioK
KyAgIGBSU1ZQLm1hcGAgaXMgc2ltaWxhciB0byBKYXZhU2NyaXB0J3MgbmF0aXZlIGBtYXBgIG1l
dGhvZCwgZXhjZXB0IHRoYXQgaXQKKyAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29t
ZSBmdWxmaWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBtYXBGbmAgb24KKyAgICBlYWNoIGl0ZW0g
aW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAubWFwYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0
IHdpbGwKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGBt
YXBGbmAgb24gdGhlIHZhbHVlcyB0aGUgcHJvbWlzZXMKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdp
dGguCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgIAorICAg
IHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQ
LnJlc29sdmUoMik7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMpOworICAgIHZh
ciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAKKyAgICB2
YXIgbWFwRm4gPSBmdW5jdGlvbihpdGVtKXsKKyAgICAgIHJldHVybiBpdGVtICsgMTsKKyAgICB9
OworICAKKyAgICBSU1ZQLm1hcChwcm9taXNlcywgbWFwRm4pLnRoZW4oZnVuY3Rpb24ocmVzdWx0
KXsKKyAgICAgIC8vIHJlc3VsdCBpcyBbIDIsIDMsIDQgXQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAubWFwYCBhcmUgcmVq
ZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCisgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJlIGdp
dmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSByZXR1cm5lZCBwcm9taXNlJ3MKKyAgICByZWplY3Rp
b24gaGFuZGxlci4gRm9yIGV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIg
cHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7CisgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZWpl
Y3QobmV3IEVycm9yKCcyJykpOworICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0KG5ldyBF
cnJvcignMycpKTsKKyAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJv
bWlzZTMgXTsKKyAgCisgICAgdmFyIG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7CisgICAgICByZXR1
cm4gaXRlbSArIDE7CisgICAgfTsKKyAgCisgICAgUlNWUC5tYXAocHJvbWlzZXMsIG1hcEZuKS50
aGVuKGZ1bmN0aW9uKGFycmF5KXsKKyAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1
c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQorICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikg
eworICAgICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICcyJworICAgIH0pOworICAgIGBgYAorICAK
KyAgICBgUlNWUC5tYXBgIHdpbGwgYWxzbyB3YWl0IGlmIGEgcHJvbWlzZSBpcyByZXR1cm5lZCBm
cm9tIGBtYXBGbmAuIEZvciBleGFtcGxlLAorICAgIHNheSB5b3Ugd2FudCB0byBnZXQgYWxsIGNv
bW1lbnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywgYnV0IHlvdSBuZWVkCisgICAgdGhlIGJs
b2cgcG9zdHMgZmlyc3QgYmVjYXVzZSB0aGV5IGNvbnRhaW4gYSB1cmwgdG8gdGhvc2UgY29tbWVu
dHMuCisgIAorICAgIGBgYGphdnNjcmlwdAorICAKKyAgICB2YXIgbWFwRm4gPSBmdW5jdGlvbihi
bG9nUG9zdCl7CisgICAgICAvLyBnZXRDb21tZW50cyBkb2VzIHNvbWUgYWpheCBhbmQgcmV0dXJu
cyBhbiBSU1ZQLlByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQKKyAgICAgIC8vIHdpdGggc29tZSBj
b21tZW50cyBkYXRhCisgICAgICByZXR1cm4gZ2V0Q29tbWVudHMoYmxvZ1Bvc3QuY29tbWVudHNf
dXJsKTsKKyAgICB9OworICAKKyAgICAvLyBnZXRCbG9nUG9zdHMgZG9lcyBzb21lIGFqYXggYW5k
IHJldHVybnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkCisgICAgLy8gd2l0aCBz
b21lIGJsb2cgcG9zdCBkYXRhCisgICAgUlNWUC5tYXAoZ2V0QmxvZ1Bvc3RzKCksIG1hcEZuKS50
aGVuKGZ1bmN0aW9uKGNvbW1lbnRzKXsKKyAgICAgIC8vIGNvbW1lbnRzIGlzIHRoZSByZXN1bHQg
b2YgYXNraW5nIHRoZSBzZXJ2ZXIgZm9yIHRoZSBjb21tZW50cworICAgICAgLy8gb2YgYWxsIGJs
b2cgcG9zdHMgcmV0dXJuZWQgZnJvbSBnZXRCbG9nUG9zdHMoKQorICAgIH0pOworICAgIGBgYAor
ICAKKyAgICBAbWV0aG9kIG1hcAorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBAcGFy
YW0ge0FycmF5fSBwcm9taXNlcworICAgIEBwYXJhbSB7RnVuY3Rpb259IG1hcEZuIGZ1bmN0aW9u
IHRvIGJlIGNhbGxlZCBvbiBlYWNoIGZ1bGZpbGxlZCBwcm9taXNlLgorICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAg
IFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQg
aXMgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisgICAgYG1hcEZuYCBvbiBl
YWNoIGZ1bGZpbGxlZCBwcm9taXNlIG9yIHZhbHVlIHdoZW4gdGhleSBiZWNvbWUgZnVsZmlsbGVk
LgorICAgICBUaGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIGlmIGFueSBvZiB0aGUgZ2l2ZW4g
YHByb21pc2VzYCBiZWNvbWUgcmVqZWN0ZWQuCisgICAgQHN0YXRpYworICAqLworCisgIGZ1bmN0
aW9uIG1hcChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlz
ZS5kZWZhdWx0LmFsbChwcm9taXNlcywgbGFiZWwpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykgewor
ICAgICAgaWYgKCFfcnN2cFV0aWxzLmlzRnVuY3Rpb24obWFwRm4pKSB7CisgICAgICAgIHRocm93
IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBtYXAncyBzZWNvbmQg
YXJndW1lbnQuIik7CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSB2YWx1ZXMubGVuZ3Ro
OworICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICByZXN1bHRzW2ldID0gbWFwRm4o
dmFsdWVzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0
LmFsbChyZXN1bHRzLCBsYWJlbCk7CisgICAgfSk7CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL25v
ZGUnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJywgJ3JzdnAvLWludGVybmFsJywgJ3JzdnAv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSwgX3JzdnBJbnRlcm5hbCwg
X3JzdnBVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGVu
b2RlaWZ5OworCisgIGZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlz
ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsg
aSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9i
amVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAm
JiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3Qu
ZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH0KKworICBm
dW5jdGlvbiBSZXN1bHQoKSB7CisgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKKyAgfQorCisg
IHZhciBFUlJPUiA9IG5ldyBSZXN1bHQoKTsKKyAgdmFyIEdFVF9USEVOX0VSUk9SID0gbmV3IFJl
c3VsdCgpOworCisgIGZ1bmN0aW9uIGdldFRoZW4ob2JqKSB7CisgICAgdHJ5IHsKKyAgICAgIHJl
dHVybiBvYmoudGhlbjsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgRVJST1IudmFsdWUg
PSBlcnJvcjsKKyAgICAgIHJldHVybiBFUlJPUjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiB0
cnlBcHBseShmLCBzLCBhKSB7CisgICAgdHJ5IHsKKyAgICAgIGYuYXBwbHkocywgYSk7CisgICAg
fSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIEVSUk9SLnZhbHVlID0gZXJyb3I7CisgICAgICByZXR1
cm4gRVJST1I7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbWFrZU9iamVjdChfLCBhcmd1bWVu
dE5hbWVzKSB7CisgICAgdmFyIG9iaiA9IHt9OworICAgIHZhciBuYW1lOworICAgIHZhciBpOwor
ICAgIHZhciBsZW5ndGggPSBfLmxlbmd0aDsKKyAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW5n
dGgpOworCisgICAgZm9yICh2YXIgeCA9IDA7IHggPCBsZW5ndGg7IHgrKykgeworICAgICAgYXJn
c1t4XSA9IF9beF07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50TmFtZXMu
bGVuZ3RoOyBpKyspIHsKKyAgICAgIG5hbWUgPSBhcmd1bWVudE5hbWVzW2ldOworICAgICAgb2Jq
W25hbWVdID0gYXJnc1tpICsgMV07CisgICAgfQorCisgICAgcmV0dXJuIG9iajsKKyAgfQorCisg
IGZ1bmN0aW9uIGFycmF5UmVzdWx0KF8pIHsKKyAgICB2YXIgbGVuZ3RoID0gXy5sZW5ndGg7Cisg
ICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMSk7CisKKyAgICBmb3IgKHZhciBpID0g
MTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBhcmdzW2kgLSAxXSA9IF9baV07CisgICAgfQor
CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKworICBmdW5jdGlvbiB3cmFwVGhlbmFibGUodGhlbiwg
cHJvbWlzZSkgeworICAgIHJldHVybiB7CisgICAgICB0aGVuOiBmdW5jdGlvbiAob25GdWxGaWxs
bWVudCwgb25SZWplY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHRoZW4uY2FsbChwcm9taXNlLCBv
bkZ1bEZpbGxtZW50LCBvblJlamVjdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8q
KgorICAgIGBSU1ZQLmRlbm9kZWlmeWAgdGFrZXMgYSAnbm9kZS1zdHlsZScgZnVuY3Rpb24gYW5k
IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0CisgICAgd2lsbCByZXR1cm4gYW4gYFJTVlAuUHJvbWlz
ZWAuIFlvdSBjYW4gdXNlIGBkZW5vZGVpZnlgIGluIE5vZGUuanMgb3IgdGhlCisgICAgYnJvd3Nl
ciB3aGVuIHlvdSdkIHByZWZlciB0byB1c2UgcHJvbWlzZXMgb3ZlciB1c2luZyBjYWxsYmFja3Mu
IEZvciBleGFtcGxlLAorICAgIGBkZW5vZGVpZnlgIHRyYW5zZm9ybXMgdGhlIGZvbGxvd2luZzoK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgIAor
ICAgIGZzLnJlYWRGaWxlKCdteWZpbGUudHh0JywgZnVuY3Rpb24oZXJyLCBkYXRhKXsKKyAgICAg
IGlmIChlcnIpIHJldHVybiBoYW5kbGVFcnJvcihlcnIpOworICAgICAgaGFuZGxlRGF0YShkYXRh
KTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgaW50bzoKKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgICAgdmFyIHJlYWRGaWxlID0gUlNWUC5k
ZW5vZGVpZnkoZnMucmVhZEZpbGUpOworICAKKyAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcpLnRo
ZW4oaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IpOworICAgIGBgYAorICAKKyAgICBJZiB0aGUgbm9k
ZSBmdW5jdGlvbiBoYXMgbXVsdGlwbGUgc3VjY2VzcyBwYXJhbWV0ZXJzLCB0aGVuIGBkZW5vZGVp
ZnlgCisgICAganVzdCByZXR1cm5zIHRoZSBmaXJzdCBvbmU6CisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgcmVxdWVzdCA9IFJTVlAuZGVub2RlaWZ5KHJlcXVpcmUoJ3JlcXVlc3QnKSk7
CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24ocmVz
KSB7CisgICAgICAvLyAuLi4KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSG93ZXZlciwgaWYg
eW91IG5lZWQgYWxsIHN1Y2Nlc3MgcGFyYW1ldGVycywgc2V0dGluZyBgZGVub2RlaWZ5YCdzCisg
ICAgc2Vjb25kIHBhcmFtZXRlciB0byBgdHJ1ZWAgY2F1c2VzIGl0IHRvIHJldHVybiBhbGwgc3Vj
Y2VzcyBwYXJhbWV0ZXJzCisgICAgYXMgYW4gYXJyYXk6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICB2YXIgcmVxdWVzdCA9IFJTVlAuZGVub2RlaWZ5KHJlcXVpcmUoJ3JlcXVlc3QnKSwgdHJ1
ZSk7CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24o
cmVzdWx0KSB7CisgICAgICAvLyByZXN1bHRbMF0gLT4gcmVzCisgICAgICAvLyByZXN1bHRbMV0g
LT4gYm9keQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBPciBpZiB5b3UgcGFzcyBpdCBhbiBh
cnJheSB3aXRoIG5hbWVzIGl0IHJldHVybnMgdGhlIHBhcmFtZXRlcnMgYXMgYSBoYXNoOgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHJlcXVlc3QgPSBSU1ZQLmRlbm9kZWlmeShyZXF1
aXJlKCdyZXF1ZXN0JyksIFsncmVzJywgJ2JvZHknXSk7CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6
Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAvLyByZXN1bHQu
cmVzCisgICAgICAvLyByZXN1bHQuYm9keQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBTb21l
dGltZXMgeW91IG5lZWQgdG8gcmV0YWluIHRoZSBgdGhpc2A6CisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgYXBwID0gcmVxdWlyZSgnZXhwcmVzcycpKCk7CisgICAgdmFyIHJlbmRlciA9
IFJTVlAuZGVub2RlaWZ5KGFwcC5yZW5kZXIuYmluZChhcHApKTsKKyAgICBgYGAKKyAgCisgICAg
VGhlIGRlbm9kaWZpZWQgZnVuY3Rpb24gaW5oZXJpdHMgZnJvbSB0aGUgb3JpZ2luYWwgZnVuY3Rp
b24uIEl0IHdvcmtzIGluIGFsbAorICAgIGVudmlyb25tZW50cywgZXhjZXB0IElFIDEwIGFuZCBi
ZWxvdy4gQ29uc2VxdWVudGx5IGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbAorICAgIGZ1
bmN0aW9uIGFyZSBhdmFpbGFibGUgdG8geW91LiBIb3dldmVyLCBhbnkgcHJvcGVydGllcyB5b3Ug
Y2hhbmdlIG9uIHRoZQorICAgIGRlbm9kZWlmaWVkIGZ1bmN0aW9uIHdvbid0IGJlIGNoYW5nZWQg
b24gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgdmFyIHJlcXVlc3QgPSBSU1ZQLmRlbm9kZWlmeShyZXF1aXJlKCdyZXF1ZXN0JykpLAor
ICAgICAgICBjb29raWVKYXIgPSByZXF1ZXN0LmphcigpOyAvLyA8LSBJbmhlcml0YW5jZSBpcyB1
c2VkIGhlcmUKKyAgCisgICAgcmVxdWVzdCgnaHR0cDovL2V4YW1wbGUuY29tJywge2phcjogY29v
a2llSmFyfSkudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIC8vIGNvb2tpZUphci5jb29raWVz
IGhvbGRzIG5vdyB0aGUgY29va2llcyByZXR1cm5lZCBieSBleGFtcGxlLmNvbQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBVc2luZyBgZGVub2RlaWZ5YCBtYWtlcyBpdCBlYXNpZXIgdG8gY29t
cG9zZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbnN0ZWFkCisgICAgb2YgdXNpbmcgY2FsbGJh
Y2tzLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgIAorICAgIGZzLnJlYWRGaWxlKCdteWZpbGUudHh0
JywgZnVuY3Rpb24oZXJyLCBkYXRhKXsKKyAgICAgIGlmIChlcnIpIHsgLi4uIH0gLy8gSGFuZGxl
IGVycm9yCisgICAgICBmcy53cml0ZUZpbGUoJ215ZmlsZTIudHh0JywgZGF0YSwgZnVuY3Rpb24o
ZXJyKXsKKyAgICAgICAgaWYgKGVycikgeyAuLi4gfSAvLyBIYW5kbGUgZXJyb3IKKyAgICAgICAg
Y29uc29sZS5sb2coJ2RvbmUnKQorICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IHlvdSBjYW4gY2hhaW4gdGhlIG9wZXJhdGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20g
dGhlIHJldHVybmVkIHByb21pc2U6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgZnMg
PSByZXF1aXJlKCdmcycpOworICAgIHZhciByZWFkRmlsZSA9IFJTVlAuZGVub2RlaWZ5KGZzLnJl
YWRGaWxlKTsKKyAgICB2YXIgd3JpdGVGaWxlID0gUlNWUC5kZW5vZGVpZnkoZnMud3JpdGVGaWxl
KTsKKyAgCisgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0aW9uKGRhdGEpewor
ICAgICAgcmV0dXJuIHdyaXRlRmlsZSgnbXlmaWxlMi50eHQnLCBkYXRhKTsKKyAgICB9KS50aGVu
KGZ1bmN0aW9uKCl7CisgICAgICBjb25zb2xlLmxvZygnZG9uZScpCisgICAgfSkuY2F0Y2goZnVu
Y3Rpb24oZXJyb3IpeworICAgICAgLy8gSGFuZGxlIGVycm9yCisgICAgfSk7CisgICAgYGBgCisg
IAorICAgIEBtZXRob2QgZGVub2RlaWZ5CisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAg
IEBwYXJhbSB7RnVuY3Rpb259IG5vZGVGdW5jIGEgJ25vZGUtc3R5bGUnIGZ1bmN0aW9uIHRoYXQg
dGFrZXMgYSBjYWxsYmFjayBhcworICAgIGl0cyBsYXN0IGFyZ3VtZW50LiBUaGUgY2FsbGJhY2sg
ZXhwZWN0cyBhbiBlcnJvciB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0CisgICAgYXJndW1lbnQg
KGlmIGFuIGVycm9yIG9jY3VycmVkLCBvdGhlcndpc2UgbnVsbCksIGFuZCB0aGUgdmFsdWUgZnJv
bSB0aGUKKyAgICBvcGVyYXRpb24gYXMgaXRzIHNlY29uZCBhcmd1bWVudCAoJ2Z1bmN0aW9uKGVy
ciwgdmFsdWUpeyB9JykuCisgICAgQHBhcmFtIHtCb29sZWFufEFycmF5fSBbb3B0aW9uc10gQW4g
b3B0aW9uYWwgcGFyYW10ZXIgdGhhdCBpZiBzZXQKKyAgICB0byBgdHJ1ZWAgY2F1c2VzIHRoZSBw
cm9taXNlIHRvIGZ1bGZpbGwgd2l0aCB0aGUgY2FsbGJhY2sncyBzdWNjZXNzIGFyZ3VtZW50cwor
ICAgIGFzIGFuIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgbm9kZSBmdW5jdGlvbiBoYXMg
bXVsdGlwbGUgc3VjY2VzcworICAgIHBhcmFtdGVycy4gSWYgeW91IHNldCB0aGlzIHBhcmFtdGVy
IHRvIGFuIGFycmF5IHdpdGggbmFtZXMsIHRoZSBwcm9taXNlIHdpbGwKKyAgICBmdWxmaWxsIHdp
dGggYSBoYXNoIHdpdGggdGhlc2UgbmFtZXMgYXMga2V5cyBhbmQgdGhlIHN1Y2Nlc3MgcGFyYW1l
dGVycyBhcworICAgIHZhbHVlcy4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0
aGF0IHdyYXBzIGBub2RlRnVuY2AgdG8gcmV0dXJuIGFuCisgICAgYFJTVlAuUHJvbWlzZWAKKyAg
ICBAc3RhdGljCisgICovCisKKyAgZnVuY3Rpb24gZGVub2RlaWZ5KG5vZGVGdW5jLCBvcHRpb25z
KSB7CisgICAgdmFyIGZuID0gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOwor
ICAgICAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoOworICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJy
YXkobCArIDEpOworICAgICAgdmFyIGFyZzsKKyAgICAgIHZhciBwcm9taXNlSW5wdXQgPSBmYWxz
ZTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHsKKyAgICAgICAgYXJnID0g
YXJndW1lbnRzW2ldOworCisgICAgICAgIGlmICghcHJvbWlzZUlucHV0KSB7CisgICAgICAgICAg
Ly8gVE9ETzogY2xlYW4gdGhpcyB1cAorICAgICAgICAgIHByb21pc2VJbnB1dCA9IG5lZWRzUHJv
bWlzZUlucHV0KGFyZyk7CisgICAgICAgICAgaWYgKHByb21pc2VJbnB1dCA9PT0gR0VUX1RIRU5f
RVJST1IpIHsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IF9yc3ZwUHJvbWlzZS5kZWZhdWx0KF9y
c3ZwSW50ZXJuYWwubm9vcCk7CisgICAgICAgICAgICBfcnN2cEludGVybmFsLnJlamVjdChwLCBH
RVRfVEhFTl9FUlJPUi52YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICB9
IGVsc2UgaWYgKHByb21pc2VJbnB1dCAmJiBwcm9taXNlSW5wdXQgIT09IHRydWUpIHsKKyAgICAg
ICAgICAgIGFyZyA9IHdyYXBUaGVuYWJsZShwcm9taXNlSW5wdXQsIGFyZyk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIGFyZ3NbaV0gPSBhcmc7CisgICAgICB9CisKKyAgICAgIHZh
ciBwcm9taXNlID0gbmV3IF9yc3ZwUHJvbWlzZS5kZWZhdWx0KF9yc3ZwSW50ZXJuYWwubm9vcCk7
CisKKyAgICAgIGFyZ3NbbF0gPSBmdW5jdGlvbiAoZXJyLCB2YWwpIHsKKyAgICAgICAgaWYgKGVy
cikgX3JzdnBJbnRlcm5hbC5yZWplY3QocHJvbWlzZSwgZXJyKTtlbHNlIGlmIChvcHRpb25zID09
PSB1bmRlZmluZWQpIF9yc3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCB2YWwpO2Vsc2UgaWYg
KG9wdGlvbnMgPT09IHRydWUpIF9yc3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCBhcnJheVJl
c3VsdChhcmd1bWVudHMpKTtlbHNlIGlmIChfcnN2cFV0aWxzLmlzQXJyYXkob3B0aW9ucykpIF9y
c3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCBtYWtlT2JqZWN0KGFyZ3VtZW50cywgb3B0aW9u
cykpO2Vsc2UgX3JzdnBJbnRlcm5hbC5yZXNvbHZlKHByb21pc2UsIHZhbCk7CisgICAgICB9Owor
CisgICAgICBpZiAocHJvbWlzZUlucHV0KSB7CisgICAgICAgIHJldHVybiBoYW5kbGVQcm9taXNl
SW5wdXQocHJvbWlzZSwgYXJncywgbm9kZUZ1bmMsIHNlbGYpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmV0dXJuIGhhbmRsZVZhbHVlSW5wdXQocHJvbWlzZSwgYXJncywgbm9kZUZ1bmMsIHNl
bGYpOworICAgICAgfQorICAgIH07CisKKyAgICBfZGVmYXVsdHMoZm4sIG5vZGVGdW5jKTsKKwor
ICAgIHJldHVybiBmbjsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVZhbHVlSW5wdXQocHJvbWlz
ZSwgYXJncywgbm9kZUZ1bmMsIHNlbGYpIHsKKyAgICB2YXIgcmVzdWx0ID0gdHJ5QXBwbHkobm9k
ZUZ1bmMsIHNlbGYsIGFyZ3MpOworICAgIGlmIChyZXN1bHQgPT09IEVSUk9SKSB7CisgICAgICBf
cnN2cEludGVybmFsLnJlamVjdChwcm9taXNlLCByZXN1bHQudmFsdWUpOworICAgIH0KKyAgICBy
ZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVByb21pc2VJbnB1dChwcm9t
aXNlLCBhcmdzLCBub2RlRnVuYywgc2VsZikgeworICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVm
YXVsdC5hbGwoYXJncykudGhlbihmdW5jdGlvbiAoYXJncykgeworICAgICAgdmFyIHJlc3VsdCA9
IHRyeUFwcGx5KG5vZGVGdW5jLCBzZWxmLCBhcmdzKTsKKyAgICAgIGlmIChyZXN1bHQgPT09IEVS
Uk9SKSB7CisgICAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIHJlc3VsdC52YWx1
ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICB9KTsKKyAgfQorCisgIGZ1
bmN0aW9uIG5lZWRzUHJvbWlzZUlucHV0KGFyZykgeworICAgIGlmIChhcmcgJiYgdHlwZW9mIGFy
ZyA9PT0gJ29iamVjdCcpIHsKKyAgICAgIGlmIChhcmcuY29uc3RydWN0b3IgPT09IF9yc3ZwUHJv
bWlzZS5kZWZhdWx0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmV0dXJuIGdldFRoZW4oYXJnKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcGxhdGZvcm0nLCBb
J2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZh
ciBwbGF0Zm9ybTsKKworICAvKiBnbG9iYWwgc2VsZiAqLworICBpZiAodHlwZW9mIHNlbGYgPT09
ICdvYmplY3QnKSB7CisgICAgcGxhdGZvcm0gPSBzZWxmOworCisgICAgLyogZ2xvYmFsIGdsb2Jh
bCAqLworICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnKSB7CisgICAgICBw
bGF0Zm9ybSA9IGdsb2JhbDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdu
byBnbG9iYWw6IGBzZWxmYCBvciBgZ2xvYmFsYCBmb3VuZCcpOworICAgIH0KKworICBleHBvcnRz
LmRlZmF1bHQgPSBwbGF0Zm9ybTsKK30pOworZW5pZmVkKCdyc3ZwL3Byb21pc2UtaGFzaCcsIFsn
ZXhwb3J0cycsICdyc3ZwL2VudW1lcmF0b3InLCAncnN2cC8taW50ZXJuYWwnLCAncnN2cC91dGls
cyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBFbnVtZXJhdG9yLCBfcnN2cEludGVybmFsLCBf
cnN2cFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBQcm9taXNlSGFzaChD
b25zdHJ1Y3Rvciwgb2JqZWN0LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3Io
Q29uc3RydWN0b3IsIG9iamVjdCwgdHJ1ZSwgbGFiZWwpOworICB9CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gUHJvbWlzZUhhc2g7CisKKyAgUHJvbWlzZUhhc2gucHJvdG90eXBlID0gX3JzdnBVdGls
cy5vX2NyZWF0ZShfcnN2cEVudW1lcmF0b3IuZGVmYXVsdC5wcm90b3R5cGUpOworICBQcm9taXNl
SGFzaC5wcm90b3R5cGUuX3N1cGVyQ29uc3RydWN0b3IgPSBfcnN2cEVudW1lcmF0b3IuZGVmYXVs
dDsKKyAgUHJvbWlzZUhhc2gucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKCkgeworICAgIHRo
aXMuX3Jlc3VsdCA9IHt9OworICB9OworCisgIFByb21pc2VIYXNoLnByb3RvdHlwZS5fdmFsaWRh
dGVJbnB1dCA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2Yg
aW5wdXQgPT09ICdvYmplY3QnOworICB9OworCisgIFByb21pc2VIYXNoLnByb3RvdHlwZS5fdmFs
aWRhdGlvbkVycm9yID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBuZXcgRXJyb3IoJ1Byb21p
c2UuaGFzaCBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIG9iamVjdCcpOworICB9OworCisgIFByb21p
c2VIYXNoLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBlbnVt
ZXJhdG9yID0gdGhpczsKKyAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTsKKyAg
ICB2YXIgaW5wdXQgPSBlbnVtZXJhdG9yLl9pbnB1dDsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOwor
CisgICAgZm9yICh2YXIga2V5IGluIGlucHV0KSB7CisgICAgICBpZiAocHJvbWlzZS5fc3RhdGUg
PT09IF9yc3ZwSW50ZXJuYWwuUEVORElORyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3Bl
cnR5LmNhbGwoaW5wdXQsIGtleSkpIHsKKyAgICAgICAgcmVzdWx0cy5wdXNoKHsKKyAgICAgICAg
ICBwb3NpdGlvbjoga2V5LAorICAgICAgICAgIGVudHJ5OiBpbnB1dFtrZXldCisgICAgICAgIH0p
OworICAgICAgfQorICAgIH0KKworICAgIHZhciBsZW5ndGggPSByZXN1bHRzLmxlbmd0aDsKKyAg
ICBlbnVtZXJhdG9yLl9yZW1haW5pbmcgPSBsZW5ndGg7CisgICAgdmFyIHJlc3VsdDsKKworICAg
IGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gX3JzdnBJbnRlcm5hbC5QRU5ESU5H
ICYmIGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTsKKyAgICAg
IGVudW1lcmF0b3IuX2VhY2hFbnRyeShyZXN1bHQuZW50cnksIHJlc3VsdC5wb3NpdGlvbik7Cisg
ICAgfQorICB9OworfSk7CitlbmlmZWQoJ3JzdnAvcHJvbWlzZScsIFsnZXhwb3J0cycsICdyc3Zw
L2NvbmZpZycsICdyc3ZwL2luc3RydW1lbnQnLCAncnN2cC91dGlscycsICdyc3ZwLy1pbnRlcm5h
bCcsICdyc3ZwL3Byb21pc2UvYWxsJywgJ3JzdnAvcHJvbWlzZS9yYWNlJywgJ3JzdnAvcHJvbWlz
ZS9yZXNvbHZlJywgJ3JzdnAvcHJvbWlzZS9yZWplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9y
c3ZwQ29uZmlnLCBfcnN2cEluc3RydW1lbnQsIF9yc3ZwVXRpbHMsIF9yc3ZwSW50ZXJuYWwsIF9y
c3ZwUHJvbWlzZUFsbCwgX3JzdnBQcm9taXNlUmFjZSwgX3JzdnBQcm9taXNlUmVzb2x2ZSwgX3Jz
dnBQcm9taXNlUmVqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBQcm9taXNlOworCisgIHZhciBndWlkS2V5ID0gJ3JzdnBfJyArIF9yc3ZwVXRpbHMubm93KCkg
KyAnLSc7CisgIHZhciBjb3VudGVyID0gMDsKKworICBmdW5jdGlvbiBuZWVkc1Jlc29sdmVyKCkg
eworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5j
dGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTsK
KyAgfQorCisgIGZ1bmN0aW9uIG5lZWRzTmV3KCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
IkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVy
YXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0
aW9uLiIpOworICB9CisKKyAgLyoqCisgICAgUHJvbWlzZSBvYmplY3RzIHJlcHJlc2VudCB0aGUg
ZXZlbnR1YWwgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoZQorICAgIHBy
aW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0
aGVuYCBtZXRob2QsIHdoaWNoCisgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVp
dGhlciBhIHByb21pc2XigJlzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb24KKyAgICB3aHkg
dGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC4KKyAgCisgICAgVGVybWlub2xvZ3kKKyAg
ICAtLS0tLS0tLS0tLQorICAKKyAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rp
b24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBz
cGVjaWZpY2F0aW9uLgorICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24g
dGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC4KKyAgICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2Fs
IEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEg
cHJvbWlzZSkuCisgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVz
aW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCisgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQg
aW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLgorICAgIC0gYHNldHRsZWRgIHRo
ZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVk
LgorICAKKyAgICBBIHByb21pc2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6IHBlbmRp
bmcsIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQuCisgIAorICAgIFByb21pc2VzIHRoYXQgYXJlIGZ1
bGZpbGxlZCBoYXZlIGEgZnVsZmlsbG1lbnQgdmFsdWUgYW5kIGFyZSBpbiB0aGUgZnVsZmlsbGVk
CisgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9u
IHJlYXNvbiBhbmQgYXJlIGluIHRoZQorICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVu
dCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLgorICAKKyAgICBQcm9taXNlcyBjYW4gYWxzbyBi
ZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGEKKyAg
ICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxs
IG1hdGNoIHRoZSB2YWx1ZSdzCisgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0
ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsCisgICAgaXRzZWxmIHJlamVj
dCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMg
d2lsbAorICAgIGl0c2VsZiBmdWxmaWxsLgorICAKKyAgCisgICAgQmFzaWMgVXNhZ2U6CisgICAg
LS0tLS0tLS0tLS0tCisgIAorICAgIGBgYGpzCisgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIC8vIG9uIHN1Y2Nlc3MKKyAgICAg
IHJlc29sdmUodmFsdWUpOworICAKKyAgICAgIC8vIG9uIGZhaWx1cmUKKyAgICAgIHJlamVjdChy
ZWFzb24pOworICAgIH0pOworICAKKyAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsK
KyAgICAgIC8vIG9uIGZ1bGZpbGxtZW50CisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAg
ICAvLyBvbiByZWplY3Rpb24KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQWR2YW5jZWQgVXNh
Z2U6CisgICAgLS0tLS0tLS0tLS0tLS0tCisgIAorICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJz
dHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXMKKyAgICBgWE1M
SHR0cFJlcXVlc3Rgcy4KKyAgCisgICAgYGBganMKKyAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkg
eworICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Cisg
ICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgCisgICAgICAgIHhoci5v
cGVuKCdHRVQnLCB1cmwpOworICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxl
cjsKKyAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJzsKKyAgICAgICAgeGhyLnNldFJl
cXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7CisgICAgICAgIHhoci5z
ZW5kKCk7CisgIAorICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkgeworICAgICAgICAgIGlmICh0
aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkgeworICAgICAgICAgICAgaWYgKHRoaXMuc3Rh
dHVzID09PSAyMDApIHsKKyAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2dldEpT
T046IGAnICsgdXJsICsgJ2AgZmFpbGVkIHdpdGggc3RhdHVzOiBbJyArIHRoaXMuc3RhdHVzICsg
J10nKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSk7
CisgICAgfQorICAKKyAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNv
bikgeworICAgICAgLy8gb24gZnVsZmlsbG1lbnQKKyAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsK
KyAgICAgIC8vIG9uIHJlamVjdGlvbgorICAgIH0pOworICAgIGBgYAorICAKKyAgICBVbmxpa2Ug
Y2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLgorICAK
KyAgICBgYGBqcworICAgIFByb21pc2UuYWxsKFsKKyAgICAgIGdldEpTT04oJy9wb3N0cycpLAor
ICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJykKKyAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7
CisgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OCisgICAgICB2YWx1ZXNbMV0gLy8gPT4g
Y29tbWVudHNKU09OCisgIAorICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9KTsKKyAgICBgYGAK
KyAgCisgICAgQGNsYXNzIFJTVlAuUHJvbWlzZQorICAgIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29s
dmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxp
bmcgdGhlIHByb21pc2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEBjb25zdHJ1Y3Rv
cgorICAqLworCisgIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIsIGxhYmVsKSB7CisgICAgdmFy
IHByb21pc2UgPSB0aGlzOworCisgICAgcHJvbWlzZS5faWQgPSBjb3VudGVyKys7CisgICAgcHJv
bWlzZS5fbGFiZWwgPSBsYWJlbDsKKyAgICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDsKKyAg
ICBwcm9taXNlLl9yZXN1bHQgPSB1bmRlZmluZWQ7CisgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMg
PSBbXTsKKworICAgIGlmIChfcnN2cENvbmZpZy5jb25maWcuaW5zdHJ1bWVudCkgeworICAgICAg
X3JzdnBJbnN0cnVtZW50LmRlZmF1bHQoJ2NyZWF0ZWQnLCBwcm9taXNlKTsKKyAgICB9CisKKyAg
ICBpZiAoX3JzdnBJbnRlcm5hbC5ub29wICE9PSByZXNvbHZlcikgeworICAgICAgaWYgKCFfcnN2
cFV0aWxzLmlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7CisgICAgICAgIG5lZWRzUmVzb2x2ZXIoKTsK
KyAgICAgIH0KKworICAgICAgaWYgKCEocHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7Cisg
ICAgICAgIG5lZWRzTmV3KCk7CisgICAgICB9CisKKyAgICAgIF9yc3ZwSW50ZXJuYWwuaW5pdGlh
bGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpOworICAgIH0KKyAgfQorCisgIFByb21pc2Uu
Y2FzdCA9IF9yc3ZwUHJvbWlzZVJlc29sdmUuZGVmYXVsdDsgLy8gZGVwcmVjYXRlZAorICBQcm9t
aXNlLmFsbCA9IF9yc3ZwUHJvbWlzZUFsbC5kZWZhdWx0OworICBQcm9taXNlLnJhY2UgPSBfcnN2
cFByb21pc2VSYWNlLmRlZmF1bHQ7CisgIFByb21pc2UucmVzb2x2ZSA9IF9yc3ZwUHJvbWlzZVJl
c29sdmUuZGVmYXVsdDsKKyAgUHJvbWlzZS5yZWplY3QgPSBfcnN2cFByb21pc2VSZWplY3QuZGVm
YXVsdDsKKworICBQcm9taXNlLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogUHJvbWlz
ZSwKKworICAgIF9ndWlkS2V5OiBndWlkS2V5LAorCisgICAgX29uRXJyb3I6IGZ1bmN0aW9uIChy
ZWFzb24pIHsKKyAgICAgIHZhciBwcm9taXNlID0gdGhpczsKKyAgICAgIF9yc3ZwQ29uZmlnLmNv
bmZpZy5hZnRlcihmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChwcm9taXNlLl9vbkVycm9yKSB7
CisgICAgICAgICAgX3JzdnBDb25maWcuY29uZmlnWyd0cmlnZ2VyJ10oJ2Vycm9yJywgcmVhc29u
KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhlIHBy
aW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0
aGVuYCBtZXRob2QsCisgICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUg
ZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZQorICAgICAgcmVhc29uIHdo
eSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLgorICAgIAorICAgICAgYGBganMKKyAg
ICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXsKKyAgICAgICAgLy8gdXNlciBpcyBh
dmFpbGFibGUKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8vIHVzZXIgaXMg
dW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgIAorICAgICAgQ2hhaW5pbmcKKyAgICAgIC0tLS0tLS0tCisgICAgCisg
ICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhp
cyBzZWNvbmQsICdkb3duc3RyZWFtJworICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRo
ZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudAorICAgICAg
b3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBh
biBleGNlcHRpb24uCisgICAgCisgICAgICBgYGBqcworICAgICAgZmluZFVzZXIoKS50aGVuKGZ1
bmN0aW9uICh1c2VyKSB7CisgICAgICAgIHJldHVybiB1c2VyLm5hbWU7CisgICAgICB9LCBmdW5j
dGlvbiAocmVhc29uKSB7CisgICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJzsKKyAgICAgIH0p
LnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7CisgICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVs
ZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXQK
KyAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgCisgICAgICB9KTsKKyAgICAKKyAg
ICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikgeworICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7CisgICAgICB9LCBmdW5jdGlv
biAocmVhc29uKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3Rl
ZCBhbmQgd2UncmUgdW5oYXBweScpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsK
KyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAorICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewor
ICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91
bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLgorICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJl
amVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1
bmhhcHB5Jy4KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICBJZiB0aGUgZG93bnN0cmVhbSBw
cm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJl
YXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS4KKyAgICAKKyAgICAg
IGBgYGpzCisgICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKKyAgICAgICAg
dGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpOworICAgICAg
fSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAorICAg
ICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAor
ICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFs
RXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZQorICAgICAg
fSk7CisgICAgICBgYGAKKyAgICAKKyAgICAgIEFzc2ltaWxhdGlvbgorICAgICAgLS0tLS0tLS0t
LS0tCisgICAgCisgICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0
ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZQorICAgICAgcmV0cmlldmVkIGFz
eW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNl
IGluIHRoZQorICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3du
c3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmcKKyAgICAgIHVudGlsIHRoZSByZXR1
cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLgor
ICAgIAorICAgICAgYGBganMKKyAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikg
eworICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7CisgICAgICB9KS50
aGVuKGZ1bmN0aW9uIChjb21tZW50cykgeworICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRz
IGFyZSBub3cgYXZhaWxhYmxlCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAorICAgICAgSWYg
dGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9t
aXNlIHdpbGwgYWxzbyByZWplY3QuCisgICAgCisgICAgICBgYGBqcworICAgICAgZmluZFVzZXIo
KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CisgICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1
dGhvcih1c2VyKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7CisgICAgICAg
IC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZh
bHVlIGhlcmUKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgLy8gSWYgYGZp
bmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZQor
ICAgICAgfSk7CisgICAgICBgYGAKKyAgICAKKyAgICAgIFNpbXBsZSBFeGFtcGxlCisgICAgICAt
LS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgU3luY2hyb25vdXMgRXhhbXBsZQorICAgIAorICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHJlc3VsdDsKKyAgICAKKyAgICAgIHRyeSB7Cisg
ICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAg
fSBjYXRjaChyZWFzb24pIHsKKyAgICAgICAgLy8gZmFpbHVyZQorICAgICAgfQorICAgICAgYGBg
CisgICAgCisgICAgICBFcnJiYWNrIEV4YW1wbGUKKyAgICAKKyAgICAgIGBgYGpzCisgICAgICBm
aW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXsKKyAgICAgICAgaWYgKGVycikgeworICAg
ICAgICAgIC8vIGZhaWx1cmUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBzdWNjZXNz
CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgCisgICAgICBQcm9taXNlIEV4
YW1wbGU7CisgICAgCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmaW5kUmVzdWx0KCkudGhl
bihmdW5jdGlvbihyZXN1bHQpeworICAgICAgICAvLyBzdWNjZXNzCisgICAgICB9LCBmdW5jdGlv
bihyZWFzb24peworICAgICAgICAvLyBmYWlsdXJlCisgICAgICB9KTsKKyAgICAgIGBgYAorICAg
IAorICAgICAgQWR2YW5jZWQgRXhhbXBsZQorICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAKKyAg
ICAgIFN5bmNocm9ub3VzIEV4YW1wbGUKKyAgICAKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IHZhciBhdXRob3IsIGJvb2tzOworICAgIAorICAgICAgdHJ5IHsKKyAgICAgICAgYXV0aG9yID0g
ZmluZEF1dGhvcigpOworICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3Ip
OworICAgICAgICAvLyBzdWNjZXNzCisgICAgICB9IGNhdGNoKHJlYXNvbikgeworICAgICAgICAv
LyBmYWlsdXJlCisgICAgICB9CisgICAgICBgYGAKKyAgICAKKyAgICAgIEVycmJhY2sgRXhhbXBs
ZQorICAgIAorICAgICAgYGBganMKKyAgICAKKyAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9v
a3MpIHsKKyAgICAKKyAgICAgIH0KKyAgICAKKyAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29u
KSB7CisgICAgCisgICAgICB9CisgICAgCisgICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhv
ciwgZXJyKXsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIGZhaWx1cmUoZXJyKTsKKyAg
ICAgICAgICAvLyBmYWlsdXJlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJ5IHsKKyAg
ICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIp
IHsKKyAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJy
KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAg
ICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChy
ZWFzb24pIHsKKyAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0gY2F0
Y2goZXJyb3IpIHsKKyAgICAgICAgICAgIGZhaWx1cmUoZXJyKTsKKyAgICAgICAgICB9CisgICAg
ICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAor
ICAgICAgUHJvbWlzZSBFeGFtcGxlOworICAgIAorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
ZmluZEF1dGhvcigpLgorICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS4KKyAgICAgICAg
dGhlbihmdW5jdGlvbihib29rcyl7CisgICAgICAgICAgLy8gZm91bmQgYm9va3MKKyAgICAgIH0p
LmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25n
CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAorICAgICAgQG1ldGhvZCB0aGVuCisgICAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxtZW50CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBv
blJlamVjdGlvbgorICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBm
b3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAg
ICBAcmV0dXJuIHtQcm9taXNlfQorICAgICovCisgICAgdGhlbjogZnVuY3Rpb24gKG9uRnVsZmls
bG1lbnQsIG9uUmVqZWN0aW9uLCBsYWJlbCkgeworICAgICAgdmFyIHBhcmVudCA9IHRoaXM7Cisg
ICAgICB2YXIgc3RhdGUgPSBwYXJlbnQuX3N0YXRlOworCisgICAgICBpZiAoc3RhdGUgPT09IF9y
c3ZwSW50ZXJuYWwuRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBfcnN2
cEludGVybmFsLlJFSkVDVEVEICYmICFvblJlamVjdGlvbikgeworICAgICAgICBpZiAoX3JzdnBD
b25maWcuY29uZmlnLmluc3RydW1lbnQpIHsKKyAgICAgICAgICBfcnN2cEluc3RydW1lbnQuZGVm
YXVsdCgnY2hhaW5lZCcsIHBhcmVudCwgcGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gcGFyZW50OworICAgICAgfQorCisgICAgICBwYXJlbnQuX29uRXJyb3IgPSBudWxsOworCisg
ICAgICB2YXIgY2hpbGQgPSBuZXcgcGFyZW50LmNvbnN0cnVjdG9yKF9yc3ZwSW50ZXJuYWwubm9v
cCwgbGFiZWwpOworICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0OworCisgICAgICBp
ZiAoX3JzdnBDb25maWcuY29uZmlnLmluc3RydW1lbnQpIHsKKyAgICAgICAgX3JzdnBJbnN0cnVt
ZW50LmRlZmF1bHQoJ2NoYWluZWQnLCBwYXJlbnQsIGNoaWxkKTsKKyAgICAgIH0KKworICAgICAg
aWYgKHN0YXRlKSB7CisgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tzdGF0ZSAtIDFd
OworICAgICAgICBfcnN2cENvbmZpZy5jb25maWcuYXN5bmMoZnVuY3Rpb24gKCkgeworICAgICAg
ICAgIF9yc3ZwSW50ZXJuYWwuaW52b2tlQ2FsbGJhY2soc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywg
cmVzdWx0KTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfcnN2cEludGVy
bmFsLnN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7
CisgICAgICB9CisKKyAgICAgIHJldHVybiBjaGlsZDsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlv
bilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lCisgICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2Yg
YSB0cnkvY2F0Y2ggc3RhdGVtZW50LgorICAgIAorICAgICAgYGBganMKKyAgICAgIGZ1bmN0aW9u
IGZpbmRBdXRob3IoKXsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRo
YXQgYXV0aG9yJyk7CisgICAgICB9CisgICAgCisgICAgICAvLyBzeW5jaHJvbm91cworICAgICAg
dHJ5IHsKKyAgICAgICAgZmluZEF1dGhvcigpOworICAgICAgfSBjYXRjaChyZWFzb24pIHsKKyAg
ICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgIH0KKyAgICAKKyAgICAgIC8vIGFz
eW5jIHdpdGggcHJvbWlzZXMKKyAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFz
b24peworICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZworICAgICAgfSk7CisgICAgICBg
YGAKKyAgICAKKyAgICAgIEBtZXRob2QgY2F0Y2gKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9u
UmVqZWN0aW9uCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZv
ciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8KKyAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWpl
Y3Rpb24sIGxhYmVsKSB7CisgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWpl
Y3Rpb24sIGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBgZmluYWxseWAgd2lsbCBi
ZSBpbnZva2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb21pc2UncyBmYXRlIGp1c3QgYXMgbmF0aXZl
CisgICAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzCisgICAgCisgICAgICBTeW5jaHJvbm91
cyBleGFtcGxlOgorICAgIAorICAgICAgYGBganMKKyAgICAgIGZpbmRBdXRob3IoKSB7CisgICAg
ICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBdXRob3IoKTsKKyAgICAgIH0KKyAg
ICAKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBmaW5kQXV0aG9yKCk7IC8vIHN1Y2NlZWQg
b3IgZmFpbAorICAgICAgfSBjYXRjaChlcnJvcikgeworICAgICAgICByZXR1cm4gZmluZE90aGVy
QXV0aGVyKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAvLyBhbHdheXMgcnVucworICAg
ICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICB9CisgICAgICBg
YGAKKyAgICAKKyAgICAgIEFzeW5jaHJvbm91cyBleGFtcGxlOgorICAgIAorICAgICAgYGBganMK
KyAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24peworICAgICAgICByZXR1
cm4gZmluZE90aGVyQXV0aGVyKCk7CisgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCl7CisgICAg
ICAgIC8vIGF1dGhvciB3YXMgZWl0aGVyIGZvdW5kLCBvciBub3QKKyAgICAgIH0pOworICAgICAg
YGBgCisgICAgCisgICAgICBAbWV0aG9kIGZpbmFsbHkKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IGNhbGxiYWNrCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZv
ciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8KKyAgICAnZmluYWxseSc6IGZ1bmN0aW9uIChjYWxs
YmFjaywgbGFiZWwpIHsKKyAgICAgIHZhciBwcm9taXNlID0gdGhpczsKKyAgICAgIHZhciBjb25z
dHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3I7CisKKyAgICAgIHJldHVybiBwcm9taXNlLnRo
ZW4oZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZl
KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICAgICAgfSk7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIHJldHVy
biBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAg
ICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgfSk7CisgICAgICB9LCBsYWJlbCk7CisgICAg
fQorICB9OworfSk7CitlbmlmZWQoJ3JzdnAvcHJvbWlzZS9hbGwnLCBbJ2V4cG9ydHMnLCAncnN2
cC9lbnVtZXJhdG9yJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cEVudW1lcmF0b3IpIHsKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGFsbDsKKworICAvKioKKyAgICBg
UlNWUC5Qcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVy
bnMgYSBuZXcgcHJvbWlzZSB3aGljaAorICAgIGlzIGZ1bGZpbGxlZCB3aXRoIGFuIGFycmF5IG9m
IGZ1bGZpbGxtZW50IHZhbHVlcyBmb3IgdGhlIHBhc3NlZCBwcm9taXNlcywgb3IKKyAgICByZWpl
Y3RlZCB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIGJlIHJl
amVjdGVkLiBJdCBjYXN0cyBhbGwKKyAgICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxl
IHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCisgIAorICAgIEV4YW1wbGU6
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUo
MSk7CisgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZXNvbHZlKDIpOworICAgIHZhciBwcm9taXNl
MyA9IFJTVlAucmVzb2x2ZSgzKTsKKyAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9t
aXNlMiwgcHJvbWlzZTMgXTsKKyAgCisgICAgUlNWUC5Qcm9taXNlLmFsbChwcm9taXNlcykudGhl
bihmdW5jdGlvbihhcnJheSl7CisgICAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEs
IDIsIDMgXTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSWYgYW55IG9mIHRoZSBgcHJvbWlz
ZXNgIGdpdmVuIHRvIGBSU1ZQLmFsbGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQor
ICAgIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUg
cmV0dXJuZWQgcHJvbWlzZXMncworICAgIHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToK
KyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNl
MSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcg
RXJyb3IoIjIiKSk7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIz
IikpOworICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBd
OworICAKKyAgICBSU1ZQLlByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5
KXsKKyAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVj
dGVkIHByb21pc2VzIQorICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAvLyBlcnJvci5t
ZXNzYWdlID09PSAiMiIKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhbGwKKyAg
ICBAc3RhdGljCisgICAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlcwor
ICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRo
ZSBwcm9taXNlLgorICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICBAcmV0dXJuIHtQcm9taXNl
fSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVu
CisgICAgZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkgb2YgdGhlbSBiZWNvbWUgcmVqZWN0
ZWQuCisgICAgQHN0YXRpYworICAqLworCisgIGZ1bmN0aW9uIGFsbChlbnRyaWVzLCBsYWJlbCkg
eworICAgIHJldHVybiBuZXcgX3JzdnBFbnVtZXJhdG9yLmRlZmF1bHQodGhpcywgZW50cmllcywg
dHJ1ZSwgLyogYWJvcnQgb24gcmVqZWN0ICovbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5p
ZmVkKCdyc3ZwL3Byb21pc2UvcmFjZScsIFsnZXhwb3J0cycsICdyc3ZwL3V0aWxzJywgJ3JzdnAv
LWludGVybmFsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFV0aWxzLCBfcnN2cEludGVybmFs
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSByYWNlOworCisgIC8q
KgorICAgIGBSU1ZQLlByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlz
IHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZQorICAgIGZpcnN0IHBhc3NlZCBwcm9taXNl
IHRvIHNldHRsZS4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBwcm9taXNlMSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0
KXsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgcmVzb2x2ZSgncHJvbWlz
ZSAxJyk7CisgICAgICB9LCAyMDApOworICAgIH0pOworICAKKyAgICB2YXIgcHJvbWlzZTIgPSBu
ZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CisgICAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7CisgICAgICAgIHJlc29sdmUoJ3Byb21pc2UgMicpOworICAgICAgfSwg
MTAwKTsKKyAgICB9KTsKKyAgCisgICAgUlNWUC5Qcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9t
aXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXsKKyAgICAgIC8vIHJlc3VsdCA9PT0gJ3Byb21p
c2UgMicgYmVjYXVzZSBpdCB3YXMgcmVzb2x2ZWQgYmVmb3JlIHByb21pc2UxCisgICAgICAvLyB3
YXMgcmVzb2x2ZWQuCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBSU1ZQLlByb21pc2UucmFj
ZWAgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0aGF0IG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdAor
ICAgIHNldHRsZWQgcHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBsZSwgZXZlbiBpZiBvdGhlciBw
cm9taXNlcyBnaXZlbiB0byB0aGUKKyAgICBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50IGFyZSBy
ZXNvbHZlZCwgYnV0IHRoZSBmaXJzdCBzZXR0bGVkIHByb21pc2UgaGFzCisgICAgYmVjb21lIHJl
amVjdGVkIGJlZm9yZSB0aGUgb3RoZXIgcHJvbWlzZXMgYmVjYW1lIGZ1bGZpbGxlZCwgdGhlIHJl
dHVybmVkCisgICAgcHJvbWlzZSB3aWxsIGJlY29tZSByZWplY3RlZDoKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVz
b2x2ZSwgcmVqZWN0KXsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgcmVz
b2x2ZSgncHJvbWlzZSAxJyk7CisgICAgICB9LCAyMDApOworICAgIH0pOworICAKKyAgICB2YXIg
cHJvbWlzZTIgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Cisg
ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3By
b21pc2UgMicpKTsKKyAgICAgIH0sIDEwMCk7CisgICAgfSk7CisgIAorICAgIFJTVlAuUHJvbWlz
ZS5yYWNlKFtwcm9taXNlMSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CisgICAg
ICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVucworICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAg
ICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ3Byb21pc2UgMicgYmVjYXVzZSBwcm9taXNlIDIgYmVj
YW1lIHJlamVjdGVkIGJlZm9yZQorICAgICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWQK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQW4gZXhhbXBsZSByZWFsLXdvcmxkIHVzZSBjYXNl
IGlzIGltcGxlbWVudGluZyB0aW1lb3V0czoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFJT
VlAuUHJvbWlzZS5yYWNlKFthamF4KCdmb28uanNvbicpLCB0aW1lb3V0KDUwMDApXSkKKyAgICBg
YGAKKyAgCisgICAgQG1ldGhvZCByYWNlCisgICAgQHN0YXRpYworICAgIEBwYXJhbSB7QXJyYXl9
IGVudHJpZXMgYXJyYXkgb2YgcHJvbWlzZXMgdG8gb2JzZXJ2ZQorICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGRlc2NyaWJpbmcgdGhlIHByb21pc2UgcmV0dXJu
ZWQuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJv
bWlzZSB3aGljaCBzZXR0bGVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgZmlyc3QgcGFzc2VkCisg
ICAgcHJvbWlzZSB0byBzZXR0bGUuCisgICovCisKKyAgZnVuY3Rpb24gcmFjZShlbnRyaWVzLCBs
YWJlbCkgeworICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovCisgICAgdmFyIENvbnN0cnVj
dG9yID0gdGhpczsKKworICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKF9yc3ZwSW50
ZXJuYWwubm9vcCwgbGFiZWwpOworCisgICAgaWYgKCFfcnN2cFV0aWxzLmlzQXJyYXkoZW50cmll
cykpIHsKKyAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3Io
J1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7CisgICAgICByZXR1cm4gcHJvbWlz
ZTsKKyAgICB9CisKKyAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7CisKKyAgICBmdW5j
dGlvbiBvbkZ1bGZpbGxtZW50KHZhbHVlKSB7CisgICAgICBfcnN2cEludGVybmFsLnJlc29sdmUo
cHJvbWlzZSwgdmFsdWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNv
bikgeworICAgICAgX3JzdnBJbnRlcm5hbC5yZWplY3QocHJvbWlzZSwgcmVhc29uKTsKKyAgICB9
CisKKyAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50ZXJuYWwu
UEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIF9yc3ZwSW50ZXJuYWwuc3Vic2Ny
aWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxs
bWVudCwgb25SZWplY3Rpb24pOworICAgIH0KKworICAgIHJldHVybiBwcm9taXNlOworICB9Cit9
KTsKK2VuaWZlZCgncnN2cC9wcm9taXNlL3JlamVjdCcsIFsnZXhwb3J0cycsICdyc3ZwLy1pbnRl
cm5hbCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBJbnRlcm5hbCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmVqZWN0OworCisgIC8qKgorICAgIGBSU1ZQLlBy
b21pc2UucmVqZWN0YCByZXR1cm5zIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBwYXNzZWQg
YHJlYXNvbmAuCisgICAgSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOgorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHByb21pc2UgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0
aW9uKHJlc29sdmUsIHJlamVjdCl7CisgICAgICByZWplY3QobmV3IEVycm9yKCdXSE9PUFMnKSk7
CisgICAgfSk7CisgIAorICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7CisgICAgICAv
LyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCEK
KyAgICB9LCBmdW5jdGlvbihyZWFzb24peworICAgICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICdX
SE9PUFMnCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUg
YWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gUlNWUC5Qcm9taXNlLnJlamVjdChu
ZXcgRXJyb3IoJ1dIT09QUycpKTsKKyAgCisgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVl
KXsKKyAgICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlz
IHJlamVjdGVkIQorICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAvLyByZWFzb24ubWVz
c2FnZSA9PT0gJ1dIT09QUycKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZWpl
Y3QKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIHsqfSByZWFzb24gdmFsdWUgdGhhdCB0aGUgcmV0
dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGguCisgICAgQHBhcmFtIHtTdHJpbmd9
IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHByb21p
c2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJv
bWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC4KKyAgKi8KKworICBmdW5jdGlv
biByZWplY3QocmVhc29uLCBsYWJlbCkgeworICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICov
CisgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsKKyAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25z
dHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsKKyAgICBfcnN2cEludGVybmFsLnJl
amVjdChwcm9taXNlLCByZWFzb24pOworICAgIHJldHVybiBwcm9taXNlOworICB9Cit9KTsKK2Vu
aWZlZCgncnN2cC9wcm9taXNlL3Jlc29sdmUnLCBbJ2V4cG9ydHMnLCAncnN2cC8taW50ZXJuYWwn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwSW50ZXJuYWwpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IHJlc29sdmU7CisKKyAgLyoqCisgICAgYFJTVlAuUHJvbWlz
ZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdp
dGggdGhlCisgICAgcGFzc2VkIGB2YWx1ZWAuIEl0IGlzIHNob3J0aGFuZCBmb3IgdGhlIGZvbGxv
d2luZzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAu
UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpeworICAgICAgcmVzb2x2ZSgxKTsKKyAg
ICB9KTsKKyAgCisgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKKyAgICAgIC8vIHZh
bHVlID09PSAxCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0
aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gUlNWUC5Qcm9taXNlLnJlc29s
dmUoMSk7CisgIAorICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7CisgICAgICAvLyB2
YWx1ZSA9PT0gMQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIHJlc29sdmUKKyAg
ICBAc3RhdGljCisgICAgQHBhcmFtIHsqfSBvYmplY3QgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQg
cHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGgKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAg
ICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRo
YXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCisgICAgYHZhbHVlYAorICAq
LworCisgIGZ1bmN0aW9uIHJlc29sdmUob2JqZWN0LCBsYWJlbCkgeworICAgIC8qanNoaW50IHZh
bGlkdGhpczp0cnVlICovCisgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsKKworICAgIGlmIChv
YmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9y
ID09PSBDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICB2
YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsK
KyAgICBfcnN2cEludGVybmFsLnJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTsKKyAgICByZXR1cm4g
cHJvbWlzZTsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcmFjZScsIFsnZXhwb3J0cycsICdyc3Zw
L3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmFjZTsKKworICAvKioKKyAgICBUaGlzIGlz
IGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5yYWNlYC4KKyAgCisgICAgQG1l
dGhvZCByYWNlCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9
IGFycmF5IEFycmF5IG9mIHByb21pc2VzLgorICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBbiBv
cHRpb25hbCBsYWJlbC4gVGhpcyBpcyB1c2VmdWwKKyAgICBmb3IgdG9vbGluZy4KKyAgICovCisK
KyAgZnVuY3Rpb24gcmFjZShhcnJheSwgbGFiZWwpIHsKKyAgICByZXR1cm4gX3JzdnBQcm9taXNl
LmRlZmF1bHQucmFjZShhcnJheSwgbGFiZWwpOworICB9Cit9KTsKK2VuaWZlZCgncnN2cC9yZWpl
Y3QnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2
cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHJlamVj
dDsKKworICAvKioKKyAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJv
bWlzZS5yZWplY3RgLgorICAKKyAgICBAbWV0aG9kIHJlamVjdAorICAgIEBzdGF0aWMKKyAgICBA
Zm9yIFJTVlAKKyAgICBAcGFyYW0geyp9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBw
cm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC4KKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAg
ICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHJl
amVjdGVkIHdpdGggdGhlIGdpdmVuIGByZWFzb25gLgorICAqLworCisgIGZ1bmN0aW9uIHJlamVj
dChyZWFzb24sIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJlamVj
dChyZWFzb24sIGxhYmVsKTsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcmVzb2x2ZScsIFsnZXhw
b3J0cycsICdyc3ZwL3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmVzb2x2ZTsKKworICAv
KioKKyAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5yZXNv
bHZlYC4KKyAgCisgICAgQG1ldGhvZCByZXNvbHZlCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNW
UAorICAgIEBwYXJhbSB7Kn0gdmFsdWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3
aWxsIGJlIHJlc29sdmVkIHdpdGgKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwg
c3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAgICBVc2VmdWwg
Zm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBi
ZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCisgICAgYHZhbHVlYAorICAqLworCisgIGZ1
bmN0aW9uIHJlc29sdmUodmFsdWUsIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5k
ZWZhdWx0LnJlc29sdmUodmFsdWUsIGxhYmVsKTsKKyAgfQorfSk7CitlbmlmZWQoInJzdnAvcmV0
aHJvdyIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgICBgUlNW
UC5yZXRocm93YCB3aWxsIHJldGhyb3cgYW4gZXJyb3Igb24gdGhlIG5leHQgdHVybiBvZiB0aGUg
SmF2YVNjcmlwdCBldmVudAorICAgIGxvb3AgaW4gb3JkZXIgdG8gYWlkIGRlYnVnZ2luZy4KKyAg
CisgICAgUHJvbWlzZXMgQSsgc3BlY2lmaWVzIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBvY2N1
ciB3aXRoIGEgcHJvbWlzZSBtdXN0IGJlCisgICAgY2F1Z2h0IGJ5IHRoZSBwcm9taXNlcyBpbXBs
ZW1lbnRhdGlvbiBhbmQgYnViYmxlZCB0byB0aGUgbGFzdCBoYW5kbGVyLiBGb3IKKyAgICB0aGlz
IHJlYXNvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzIHNwZWNpZnkgYSBzZWNv
bmQgcmVqZWN0aW9uCisgICAgaGFuZGxlciBmdW5jdGlvbiB0byBgdGhlbmAuIEhvd2V2ZXIsIGBS
U1ZQLnJldGhyb3dgIHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgIG91dHNpZGUgb2YgdGhl
IHByb21pc2UsIHNvIGl0IGJ1YmJsZXMgdXAgdG8geW91ciBjb25zb2xlIGlmIGluIHRoZSBicm93
c2VyLAorICAgIG9yIGRvbWFpbi9jYXVzZSB1bmNhdWdodCBleGNlcHRpb24gaW4gTm9kZS4gYHJl
dGhyb3dgIHdpbGwgYWxzbyB0aHJvdyB0aGUKKyAgICBlcnJvciBhZ2FpbiBzbyB0aGUgZXJyb3Ig
Y2FuIGJlIGhhbmRsZWQgYnkgdGhlIHByb21pc2UgcGVyIHRoZSBzcGVjLgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgZnVuY3Rpb24gdGhyb3dzKCl7CisgICAgICB0aHJvdyBuZXcgRXJyb3Io
J1dob29wcyEnKTsKKyAgICB9CisgIAorICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpeworICAgICAgdGhyb3dzKCk7CisgICAgfSk7Cisg
IAorICAgIHByb21pc2UuY2F0Y2goUlNWUC5yZXRocm93KS50aGVuKGZ1bmN0aW9uKCl7CisgICAg
ICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBiZWNhbWUgcmVq
ZWN0ZWQgZHVlIHRvIGFuCisgICAgICAvLyBlcnJvciEKKyAgICB9LCBmdW5jdGlvbiAoZXJyKXsK
KyAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IgaGVyZQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBUaGUgJ1dob29wcycgZXJyb3Igd2lsbCBiZSB0aHJvd24gb24gdGhlIG5leHQgdHVybiBvZiB0
aGUgZXZlbnQgbG9vcAorICAgIGFuZCB5b3UgY2FuIHdhdGNoIGZvciBpdCBpbiB5b3VyIGNvbnNv
bGUuIFlvdSBjYW4gYWxzbyBoYW5kbGUgaXQgdXNpbmcgYQorICAgIHJlamVjdGlvbiBoYW5kbGVy
IGdpdmVuIHRvIGAudGhlbmAgb3IgYC5jYXRjaGAgb24gdGhlIHJldHVybmVkIHByb21pc2UuCisg
IAorICAgIEBtZXRob2QgcmV0aHJvdworICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBA
cGFyYW0ge0Vycm9yfSByZWFzb24gcmVhc29uIHRoZSBwcm9taXNlIGJlY2FtZSByZWplY3RlZC4K
KyAgICBAdGhyb3dzIEVycm9yCisgICAgQHN0YXRpYworICAqLworICAidXNlIHN0cmljdCI7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gcmV0aHJvdzsKKworICBmdW5jdGlvbiByZXRocm93KHJlYXNv
bikgeworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgdGhyb3cgcmVhc29uOwor
ICAgIH0pOworICAgIHRocm93IHJlYXNvbjsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvdXRpbHMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMub2JqZWN0T3JGdW5jdGlvbiA9IG9iamVjdE9yRnVuY3Rpb247CisgIGV4cG9ydHMu
aXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CisgIGV4cG9ydHMuaXNNYXliZVRoZW5hYmxlID0gaXNN
YXliZVRoZW5hYmxlOworCisgIGZ1bmN0aW9uIG9iamVjdE9yRnVuY3Rpb24oeCkgeworICAgIHJl
dHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYg
eCAhPT0gbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oeCkgeworICAgIHJldHVy
biB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlzTWF5YmVUaGVu
YWJsZSh4KSB7CisgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxs
OworICB9CisKKyAgdmFyIF9pc0FycmF5OworICBpZiAoIUFycmF5LmlzQXJyYXkpIHsKKyAgICBf
aXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7CisgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50
b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nOworICAgIH07CisgIH0gZWxzZSB7
CisgICAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5OworICB9CisKKyAgdmFyIGlzQXJyYXkgPSBf
aXNBcnJheTsKKworICBleHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5OworICAvLyBEYXRlLm5vdyBp
cyBub3QgYXZhaWxhYmxlIGluIGJyb3dzZXJzIDwgSUU5CisgIC8vIGh0dHBzOi8vZGV2ZWxvcGVy
Lm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9P
YmplY3RzL0RhdGUvbm93I0NvbXBhdGliaWxpdHkKKyAgdmFyIG5vdyA9IERhdGUubm93IHx8IGZ1
bmN0aW9uICgpIHsKKyAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgIH07CisKKyAg
ZXhwb3J0cy5ub3cgPSBub3c7CisgIGZ1bmN0aW9uIEYoKSB7fQorCisgIHZhciBvX2NyZWF0ZSA9
IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKG8pIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0
aCA+IDEpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kIGFyZ3VtZW50IG5vdCBzdXBw
b3J0ZWQnKTsKKyAgICB9CisgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JykgeworICAgICAg
dGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QnKTsKKyAgICB9
CisgICAgRi5wcm90b3R5cGUgPSBvOworICAgIHJldHVybiBuZXcgRigpOworICB9OworICBleHBv
cnRzLm9fY3JlYXRlID0gb19jcmVhdGU7Cit9KTsKK2VuaWZlZCgidmVydGV4IiwgWyJleHBvcnRz
Il0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgKiBEQUcgVmVydGV4CisgICAqCisg
ICAqIEBjbGFzcyBWZXJ0ZXgKKyAgICogQGNvbnN0cnVjdG9yCisgICAqLworCisgICJ1c2Ugc3Ry
aWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBWZXJ0ZXg7CisKKyAgZnVuY3Rpb24gVmVydGV4
KG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuaW5jb21pbmcgPSB7fTsK
KyAgICB0aGlzLmluY29taW5nTmFtZXMgPSBbXTsKKyAgICB0aGlzLmhhc091dGdvaW5nID0gZmFs
c2U7CisgICAgdGhpcy52YWx1ZSA9IG51bGw7CisgIH0KK30pOworZW5pZmVkKCJ2aXNpdCIsIFsi
ZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gdmlzaXQ7CisKKyAgZnVuY3Rpb24gdmlzaXQodmVydGV4LCBmbiwgdmlz
aXRlZCwgcGF0aCkgeworICAgIHZhciBuYW1lID0gdmVydGV4Lm5hbWU7CisgICAgdmFyIHZlcnRp
Y2VzID0gdmVydGV4LmluY29taW5nOworICAgIHZhciBuYW1lcyA9IHZlcnRleC5pbmNvbWluZ05h
bWVzOworICAgIHZhciBsZW4gPSBuYW1lcy5sZW5ndGg7CisgICAgdmFyIGk7CisKKyAgICBpZiAo
IXZpc2l0ZWQpIHsKKyAgICAgIHZpc2l0ZWQgPSB7fTsKKyAgICB9CisgICAgaWYgKCFwYXRoKSB7
CisgICAgICBwYXRoID0gW107CisgICAgfQorICAgIGlmICh2aXNpdGVkLmhhc093blByb3BlcnR5
KG5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHBhdGgucHVzaChuYW1lKTsKKyAg
ICB2aXNpdGVkW25hbWVdID0gdHJ1ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIHZpc2l0KHZlcnRpY2VzW25hbWVzW2ldXSwgZm4sIHZpc2l0ZWQsIHBhdGgpOworICAg
IH0KKyAgICBmbih2ZXJ0ZXgsIHBhdGgpOworICAgIHBhdGgucG9wKCk7CisgIH0KK30pOworcmVx
dWlyZU1vZHVsZSgiZW1iZXIiKTsKKworfSgpKTsKKworOyhmdW5jdGlvbigpIHsKKy8qIGdsb2Jh
bHMgZGVmaW5lLCBFbWJlciwgalF1ZXJ5ICovCisKKyAgZnVuY3Rpb24gcHJvY2Vzc0VtYmVyU2hp
bXMoKSB7CisgICAgdmFyIHNoaW1zID0geworICAgICAgJ2VtYmVyJzogeworICAgICAgICAnZGVm
YXVsdCc6IEVtYmVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLWFwcGxpY2F0aW9uJzogeworICAg
ICAgICAnZGVmYXVsdCc6IEVtYmVyLkFwcGxpY2F0aW9uCisgICAgICB9LAorICAgICAgJ2VtYmVy
LWFycmF5JzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkFycmF5CisgICAgICB9LAorICAg
ICAgJ2VtYmVyLWFycmF5L211dGFibGUnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuTXV0
YWJsZUFycmF5CisgICAgICB9LAorICAgICAgJ2VtYmVyLWFycmF5L3V0aWxzJzogeworICAgICAg
ICAnQSc6ICAgICAgICAgICAgRW1iZXIuQSwKKyAgICAgICAgJ2lzRW1iZXJBcnJheSc6IEVtYmVy
LmlzQXJyYXksCisgICAgICAgICd3cmFwJzogICAgICAgICBFbWJlci5tYWtlQXJyYXkKKyAgICAg
IH0sCisgICAgICAnZW1iZXItY29tcG9uZW50JzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVy
LkNvbXBvbmVudAorICAgICAgfSwKKyAgICAgICdlbWJlci1jb21wb25lbnRzL2NoZWNrYm94Jzog
eworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkNoZWNrYm94CisgICAgICB9LAorICAgICAgJ2Vt
YmVyLWNvbXBvbmVudHMvdGV4dC1hcmVhJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlRl
eHRBcmVhCisgICAgICB9LAorICAgICAgJ2VtYmVyLWNvbXBvbmVudHMvdGV4dC1maWVsZCc6IHsK
KyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5UZXh0RmllbGQKKyAgICAgIH0sCisgICAgICAnZW1i
ZXItY29udHJvbGxlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5Db250cm9sbGVyCisg
ICAgICB9LAorICAgICAgJ2VtYmVyLWNvbnRyb2xsZXIvaW5qZWN0JzogeworICAgICAgICAnZGVm
YXVsdCc6IEVtYmVyLmluamVjdC5jb250cm9sbGVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLWNv
bnRyb2xsZXIvcHJveHknOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuQXJyYXlQcm94eQor
ICAgICAgfSwKKyAgICAgICdlbWJlci1jb250cm9sbGVycy9zb3J0YWJsZSc6IHsKKyAgICAgICAg
J2RlZmF1bHQnOiBFbWJlci5Tb3J0YWJsZU1peGluCisgICAgICB9LAorICAgICAgJ2VtYmVyLWRl
YnVnJzogeworICAgICAgICAnbG9nJzogICAgICBFbWJlci5kZWJ1ZywKKyAgICAgICAgJ2luc3Bl
Y3QnOiAgRW1iZXIuaW5zcGVjdCwKKyAgICAgICAgJ3J1bic6ICAgICAgRW1iZXIucnVuSW5EZWJ1
ZywKKyAgICAgICAgJ3dhcm4nOiAgICAgRW1iZXIud2FybgorICAgICAgfSwKKyAgICAgICdlbWJl
ci1kZWJ1Zy9jb250YWluZXItZGVidWctYWRhcHRlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBF
bWJlci5Db250YWluZXJEZWJ1Z0FkYXB0ZXIKKyAgICAgIH0sCisgICAgICAnZW1iZXItZGVidWcv
ZGF0YS1hZGFwdGVyJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkRhdGFBZGFwdGVyCisg
ICAgICB9LAorICAgICAgJ2VtYmVyLWRlcHJlY2F0aW9ucyc6IHsKKyAgICAgICAgJ2RlcHJlY2F0
ZSc6ICAgICAgRW1iZXIuZGVwcmVjYXRlLAorICAgICAgICAnZGVwcmVjYXRlRnVuYyc6ICBFbWJl
ci5kZXByZWNhdGVGdW5jCisgICAgICB9LAorICAgICAgJ2VtYmVyLWVudW1lcmFibGUnOiB7Cisg
ICAgICAgICdkZWZhdWx0JzogRW1iZXIuRW51bWVyYWJsZQorICAgICAgfSwKKyAgICAgICdlbWJl
ci1ldmVudGVkJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkV2ZW50ZWQKKyAgICAgIH0s
CisgICAgICAnZW1iZXItZXZlbnRlZC9vbic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5v
bgorICAgICAgfSwKKyAgICAgICdlbWJlci1nbG9iYWxzLXJlc29sdmVyJzogeworICAgICAgICAn
ZGVmYXVsdCc6IEVtYmVyLkRlZmF1bHRSZXNvbHZlcgorICAgICAgfSwKKyAgICAgICdlbWJlci1o
ZWxwZXInOiB7CisgICAgICAgICdkZWZhdWx0JzogIEVtYmVyLkhlbHBlciwKKyAgICAgICAgJ2hl
bHBlcic6ICAgRW1iZXIuSGVscGVyICYmIEVtYmVyLkhlbHBlci5oZWxwZXIKKyAgICAgIH0sCisg
ICAgICAnZW1iZXItaW5zdHJ1bWVudGF0aW9uJzogeworICAgICAgICAnaW5zdHJ1bWVudCc6ICAg
RW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQsCisgICAgICAgICdyZXNldCc6ICAgICAg
ICBFbWJlci5JbnN0cnVtZW50YXRpb24ucmVzZXQsCisgICAgICAgICdzdWJzY3JpYmUnOiAgICBF
bWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlLAorICAgICAgICAndW5zdWJzY3JpYmUnOiAg
RW1iZXIuSW5zdHJ1bWVudGF0aW9uLnVuc3Vic2NyaWJlCisgICAgICB9LAorICAgICAgJ2VtYmVy
LWxvY2F0aW9ucy9oYXNoJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkhhc2hMb2NhdGlv
bgorICAgICAgfSwKKyAgICAgICdlbWJlci1sb2NhdGlvbnMvaGlzdG9yeSc6IHsKKyAgICAgICAg
J2RlZmF1bHQnOiBFbWJlci5IaXN0b3J5TG9jYXRpb24KKyAgICAgIH0sCisgICAgICAnZW1iZXIt
bG9jYXRpb25zL25vbmUnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuTm9uZUxvY2F0aW9u
CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1hcCc6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiAgICAg
IEVtYmVyLk1hcCwKKyAgICAgICAgJ3dpdGhEZWZhdWx0JzogIEVtYmVyLk1hcFdpdGhEZWZhdWx0
CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1ldGFsL2Rlc3Ryb3knOiB7CisgICAgICAgICdkZWZh
dWx0JzogRW1iZXIuZGVzdHJveQorICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9ldmVudHMn
OiB7CisgICAgICAgICdhZGRMaXN0ZW5lcic6ICAgIEVtYmVyLmFkZExpc3RlbmVyLAorICAgICAg
ICAncmVtb3ZlTGlzdGVuZXInOiBFbWJlci5yZW1vdmVMaXN0ZW5lciwKKyAgICAgICAgJ3NlbmQn
OiAgICAgICAgICAgRW1iZXIuc2VuZEV2ZW50CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1ldGFs
L2dldCc6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5nZXQsCisgICAgICAgICdnZXRQcm9w
ZXJ0aWVzJzogRW1iZXIuZ2V0UHJvcGVydGllcworICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRh
bC9taXhpbic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5NaXhpbgorICAgICAgfSwKKyAg
ICAgICdlbWJlci1tZXRhbC9vYnNlcnZlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiAgICAgICAg
RW1iZXIub2JzZXJ2ZXIsCisgICAgICAgICdhZGRPYnNlcnZlcic6ICAgIEVtYmVyLmFkZE9ic2Vy
dmVyLAorICAgICAgICAncmVtb3ZlT2JzZXJ2ZXInOiBFbWJlci5yZW1vdmVPYnNlcnZlcgorICAg
ICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9vbi1sb2FkJzogeworICAgICAgICAnZGVmYXVsdCc6
ICBFbWJlci5vbkxvYWQsCisgICAgICAgICdydW4nOiAgICAgIEVtYmVyLnJ1bkxvYWRIb29rcwor
ICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9zZXQnOiB7CisgICAgICAgICdkZWZhdWx0Jzog
ICAgICAgIEVtYmVyLnNldCwKKyAgICAgICAgJ3NldFByb3BlcnRpZXMnOiAgRW1iZXIuc2V0UHJv
cGVydGllcywKKyAgICAgICAgJ3RyeVNldCc6ICAgICAgICAgRW1iZXIudHJ5U2V0CisgICAgICB9
LAorICAgICAgJ2VtYmVyLW1ldGFsL3V0aWxzJzogeworICAgICAgICAnYWxpYXNNZXRob2QnOiAg
RW1iZXIuYWxpYXNNZXRob2QsCisgICAgICAgICdhc3NlcnQnOiAgICAgICBFbWJlci5hc3NlcnQs
CisgICAgICAgICdjYWNoZUZvcic6ICAgICBFbWJlci5jYWNoZUZvciwKKyAgICAgICAgJ2NvcHkn
OiAgICAgICAgIEVtYmVyLmNvcHksCisgICAgICAgICdndWlkRm9yJzogICAgICBFbWJlci5ndWlk
Rm9yCisgICAgICB9LAorICAgICAgJ2VtYmVyLW9iamVjdCc6IHsKKyAgICAgICAgJ2RlZmF1bHQn
OiBFbWJlci5PYmplY3QKKyAgICAgIH0sCisgICAgICAnZW1iZXItcGxhdGZvcm0nOiB7CisgICAg
ICAgICdhc3NpZ24nOiAgICAgICAgIEVtYmVyLm1lcmdlLAorICAgICAgICAnY3JlYXRlJzogICAg
ICAgICBFbWJlci5jcmVhdGUsCisgICAgICAgICdkZWZpbmVQcm9wZXJ0eSc6IEVtYmVyLnBsYXRm
b3JtLmRlZmluZVByb3BlcnR5LAorICAgICAgICAnaGFzQWNjZXNzb3JzJzogICBFbWJlci5wbGF0
Zm9ybS5oYXNQcm9wZXJ0eUFjY2Vzc29ycywKKyAgICAgICAgJ2tleXMnOiAgICAgICAgICAgRW1i
ZXIua2V5cworICAgICAgfSwKKyAgICAgICdlbWJlci1yb3V0ZSc6IHsKKyAgICAgICAgJ2RlZmF1
bHQnOiBFbWJlci5Sb3V0ZQorICAgICAgfSwKKyAgICAgICdlbWJlci1yb3V0ZXInOiB7CisgICAg
ICAgICdkZWZhdWx0JzogRW1iZXIuUm91dGVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLXJ1bmxv
b3AnOiB7CisgICAgICAgICdkZWZhdWx0JzogICAgICBFbWJlci5ydW4sCisgICAgICAgICdiZWdp
bic6ICAgICAgICBFbWJlci5ydW4uYmVnaW4sCisgICAgICAgICdiaW5kJzogICAgICAgICBFbWJl
ci5ydW4uYmluZCwKKyAgICAgICAgJ2NhbmNlbCc6ICAgICAgIEVtYmVyLnJ1bi5jYW5jZWwsCisg
ICAgICAgICdkZWJvdW5jZSc6ICAgICBFbWJlci5ydW4uZGVib3VuY2UsCisgICAgICAgICdlbmQn
OiAgICAgICAgICBFbWJlci5ydW4uZW5kLAorICAgICAgICAnam9pbic6ICAgICAgICAgRW1iZXIu
cnVuLmpvaW4sCisgICAgICAgICdsYXRlcic6ICAgICAgICBFbWJlci5ydW4ubGF0ZXIsCisgICAg
ICAgICduZXh0JzogICAgICAgICBFbWJlci5ydW4ubmV4dCwKKyAgICAgICAgJ29uY2UnOiAgICAg
ICAgIEVtYmVyLnJ1bi5vbmNlLAorICAgICAgICAnc2NoZWR1bGUnOiAgICAgRW1iZXIucnVuLnNj
aGVkdWxlLAorICAgICAgICAnc2NoZWR1bGVPbmNlJzogRW1iZXIucnVuLnNjaGVkdWxlT25jZSwK
KyAgICAgICAgJ3Rocm90dGxlJzogICAgIEVtYmVyLnJ1bi50aHJvdHRsZQorICAgICAgfSwKKyAg
ICAgICdlbWJlci1zZXJ2aWNlJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlNlcnZpY2UK
KyAgICAgIH0sCisgICAgICAnZW1iZXItc2VydmljZS9pbmplY3QnOiB7CisgICAgICAgICdkZWZh
dWx0JzogRW1iZXIuaW5qZWN0LnNlcnZpY2UKKyAgICAgIH0sCisgICAgICAnZW1iZXItc2V0L29y
ZGVyZWQnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuT3JkZXJlZFNldAorICAgICAgfSwK
KyAgICAgICdlbWJlci1zdHJpbmcnOiB7CisgICAgICAgICdjYW1lbGl6ZSc6ICAgICBFbWJlci5T
dHJpbmcuY2FtZWxpemUsCisgICAgICAgICdjYXBpdGFsaXplJzogICBFbWJlci5TdHJpbmcuY2Fw
aXRhbGl6ZSwKKyAgICAgICAgJ2NsYXNzaWZ5JzogICAgIEVtYmVyLlN0cmluZy5jbGFzc2lmeSwK
KyAgICAgICAgJ2Rhc2hlcml6ZSc6ICAgIEVtYmVyLlN0cmluZy5kYXNoZXJpemUsCisgICAgICAg
ICdkZWNhbWVsaXplJzogICBFbWJlci5TdHJpbmcuZGVjYW1lbGl6ZSwKKyAgICAgICAgJ2ZtdCc6
ICAgICAgICAgIEVtYmVyLlN0cmluZy5mbXQsCisgICAgICAgICdodG1sU2FmZSc6ICAgICBFbWJl
ci5TdHJpbmcuaHRtbFNhZmUsCisgICAgICAgICdsb2MnOiAgICAgICAgICBFbWJlci5TdHJpbmcu
bG9jLAorICAgICAgICAndW5kZXJzY29yZSc6ICAgRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUsCisg
ICAgICAgICd3JzogICAgICAgICAgICBFbWJlci5TdHJpbmcudworICAgICAgfSwKKyAgICAgICdl
bWJlci11dGlscyc6IHsKKyAgICAgICAgJ2lzQmxhbmsnOiAgICBFbWJlci5pc0JsYW5rLAorICAg
ICAgICAnaXNFbXB0eSc6ICAgIEVtYmVyLmlzRW1wdHksCisgICAgICAgICdpc05vbmUnOiAgICAg
RW1iZXIuaXNOb25lLAorICAgICAgICAnaXNQcmVzZW50JzogIEVtYmVyLmlzUHJlc2VudCwKKyAg
ICAgICAgJ3RyeUludm9rZSc6ICBFbWJlci50cnlJbnZva2UsCisgICAgICAgICd0eXBlT2YnOiAg
ICAgRW1iZXIudHlwZU9mCisgICAgICB9CisgICAgfTsKKworICAgIC8vIHBvcHVsYXRlIGBlbWJl
ci9jb21wdXRlZGAgbmFtZWQgZXhwb3J0cworICAgIHNoaW1zWydlbWJlci1jb21wdXRlZCddID0g
eworICAgICAgJ2RlZmF1bHQnOiBFbWJlci5jb21wdXRlZAorICAgIH07CisgICAgdmFyIGNvbXB1
dGVkTWFjcm9zID0gWworICAgICAgImVtcHR5Iiwibm90RW1wdHkiLCAibm9uZSIsICJub3QiLCAi
Ym9vbCIsICJtYXRjaCIsCisgICAgICAiZXF1YWwiLCAiZ3QiLCAiZ3RlIiwgImx0IiwgImx0ZSIs
ICJhbGlhcyIsICJvbmVXYXkiLAorICAgICAgInJlYWRzIiwgInJlYWRPbmx5IiwgImRlcHJlY2F0
aW5nQWxpYXMiLAorICAgICAgImFuZCIsICJvciIsICJjb2xsZWN0IiwgInN1bSIsICJtaW4iLCAi
bWF4IiwKKyAgICAgICJtYXAiLCAic29ydCIsICJzZXREaWZmIiwgIm1hcEJ5IiwgIm1hcFByb3Bl
cnR5IiwKKyAgICAgICJmaWx0ZXIiLCAiZmlsdGVyQnkiLCAiZmlsdGVyUHJvcGVydHkiLCAidW5p
cSIsCisgICAgICAidW5pb24iLCAiaW50ZXJzZWN0IgorICAgIF07CisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjb21wdXRlZE1hY3Jvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHZhciBr
ZXkgPSBjb21wdXRlZE1hY3Jvc1tpXTsKKyAgICAgIHNoaW1zWydlbWJlci1jb21wdXRlZCddW2tl
eV0gPSBFbWJlci5jb21wdXRlZFtrZXldOworICAgIH0KKworICAgIGZvciAodmFyIG1vZHVsZU5h
bWUgaW4gc2hpbXMpIHsKKyAgICAgIGdlbmVyYXRlTW9kdWxlKG1vZHVsZU5hbWUsIHNoaW1zW21v
ZHVsZU5hbWVdKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzVGVzdFNoaW1zKCkg
eworICAgIGlmIChFbWJlci5UZXN0KSB7CisgICAgICB2YXIgdGVzdFNoaW1zID0geworICAgICAg
ICAnZW1iZXItdGVzdCc6IHsKKyAgICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlRlc3QKKyAgICAg
ICAgfSwKKyAgICAgICAgJ2VtYmVyLXRlc3QvYWRhcHRlcic6IHsKKyAgICAgICAgICAnZGVmYXVs
dCc6IEVtYmVyLlRlc3QuQWRhcHRlcgorICAgICAgICB9LAorICAgICAgICAnZW1iZXItdGVzdC9x
dW5pdC1hZGFwdGVyJzogeworICAgICAgICAgICdkZWZhdWx0JzogRW1iZXIuVGVzdC5RVW5pdEFk
YXB0ZXIKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgZm9yICh2YXIgbW9kdWxlTmFtZSBp
biB0ZXN0U2hpbXMpIHsKKyAgICAgICAgZ2VuZXJhdGVNb2R1bGUobW9kdWxlTmFtZSwgdGVzdFNo
aW1zW21vZHVsZU5hbWVdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZW5l
cmF0ZU1vZHVsZShuYW1lLCB2YWx1ZXMpIHsKKyAgICBkZWZpbmUobmFtZSwgW10sIGZ1bmN0aW9u
KCkgeworICAgICAgJ3VzZSBzdHJpY3QnOworCisgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0p
OworICB9CisKKyAgcHJvY2Vzc0VtYmVyU2hpbXMoKTsKKyAgcHJvY2Vzc1Rlc3RTaGltcygpOwor
ICBnZW5lcmF0ZU1vZHVsZSgnanF1ZXJ5JywgeyAnZGVmYXVsdCc6IHNlbGYualF1ZXJ5IH0pOwor
ICBnZW5lcmF0ZU1vZHVsZSgncnN2cCcsIHsgJ2RlZmF1bHQnOiBFbWJlci5SU1ZQIH0pOworfSko
KTsKKworOy8qIGdsb2JhbHMgZGVmaW5lICovCitkZWZpbmUoJ2VtYmVyL2xvYWQtaW5pdGlhbGl6
ZXJzJywgWydleHBvcnRzJywgJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJywgJ2VtYmVyJ10sIGZ1
bmN0aW9uKGV4cG9ydHMsIGxvYWRJbml0aWFsaXplcnMsIEVtYmVyKSB7CisgIEVtYmVyWydkZWZh
dWx0J10uZGVwcmVjYXRlKAorICAgICdVc2FnZSBvZiBgJyArICdlbWJlci9sb2FkLWluaXRpYWxp
emVycycgKyAnYCBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVwZGF0ZSB0byBgZW1iZXIt
bG9hZC1pbml0aWFsaXplcnNgLicsCisgICAgZmFsc2UsCisgICAgeyBpZDogJ2VtYmVyLWxvYWQt
aW5pdGlhbGl6ZXJzLmxlZ2FjeS1zaGltcycsIHVudGlsOiAnMy4wLjAnIH0KKyAgKTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSBsb2FkSW5pdGlhbGl6ZXJzWydkZWZhdWx0J107Cit9KTsKKwor
Oy8qIGdsb2JhbHMgZGVmaW5lICovCisKK2Z1bmN0aW9uIGNyZWF0ZURlcHJlY2F0ZWRNb2R1bGUo
bW9kdWxlSWQpIHsKKyAgZGVmaW5lKG1vZHVsZUlkLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2
ZXIvcmVzb2x2ZXInLCAnZW1iZXInXSwgZnVuY3Rpb24oZXhwb3J0cywgUmVzb2x2ZXIsIEVtYmVy
KSB7CisgICAgRW1iZXJbJ2RlZmF1bHQnXS5kZXByZWNhdGUoCisgICAgICAnVXNhZ2Ugb2YgYCcg
KyBtb2R1bGVJZCArICdgIG1vZHVsZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXBkYXRlIHRvIGBl
bWJlci1yZXNvbHZlcmAuJywKKyAgICAgIGZhbHNlLAorICAgICAgeyBpZDogJ2VtYmVyLXJlc29s
dmVyLmxlZ2FjeS1zaGltcycsIHVudGlsOiAnMy4wLjAnIH0KKyAgICApOworCisgICAgZXhwb3J0
c1snZGVmYXVsdCddID0gUmVzb2x2ZXJbJ2RlZmF1bHQnXTsKKyAgfSk7Cit9CisKK2NyZWF0ZURl
cHJlY2F0ZWRNb2R1bGUoJ2VtYmVyL3Jlc29sdmVyJyk7CitjcmVhdGVEZXByZWNhdGVkTW9kdWxl
KCdyZXNvbHZlcicpOworCis7ZGVmaW5lKCdlbWJlci1hamF4L2Vycm9ycycsIFsnZXhwb3J0cycs
ICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLkFqYXhFcnJvciA9IEFqYXhFcnJvcjsKKyAgZXhwb3J0cy5JbnZhbGlkRXJy
b3IgPSBJbnZhbGlkRXJyb3I7CisgIGV4cG9ydHMuVW5hdXRob3JpemVkRXJyb3IgPSBVbmF1dGhv
cml6ZWRFcnJvcjsKKyAgZXhwb3J0cy5Gb3JiaWRkZW5FcnJvciA9IEZvcmJpZGRlbkVycm9yOwor
CisgIHZhciBFbWJlckVycm9yID0gX2VtYmVyWydkZWZhdWx0J10uRXJyb3I7CisKKyAgLyoqCisg
ICAgQGNsYXNzIEFqYXhFcnJvcgorICAgIEBuYW1lc3BhY2UgRFMKKyAgKi8KKworICBmdW5jdGlv
biBBamF4RXJyb3IoZXJyb3JzKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHMubGVuZ3Ro
IDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnQWpheCBvcGVyYXRpb24gZmFp
bGVkJyA6IGFyZ3VtZW50c1sxXTsKKworICAgIEVtYmVyRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdl
KTsKKworICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzIHx8IFt7CisgICAgICB0aXRsZTogJ0FqYXgg
RXJyb3InLAorICAgICAgZGV0YWlsOiBtZXNzYWdlCisgICAgfV07CisgIH0KKworICBBamF4RXJy
b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFbWJlckVycm9yLnByb3RvdHlwZSk7CisKKyAg
ZnVuY3Rpb24gSW52YWxpZEVycm9yKGVycm9ycykgeworICAgIEFqYXhFcnJvci5jYWxsKHRoaXMs
IGVycm9ycywgJ1JlcXVlc3Qgd2FzIHJlamVjdGVkIGJlY2F1c2UgaXQgd2FzIGludmFsaWQnKTsK
KyAgfQorCisgIEludmFsaWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFqYXhFcnJv
ci5wcm90b3R5cGUpOworCisgIGZ1bmN0aW9uIFVuYXV0aG9yaXplZEVycm9yKGVycm9ycykgewor
ICAgIEFqYXhFcnJvci5jYWxsKHRoaXMsIGVycm9ycywgJ0FqYXggYXV0aG9yaXphdGlvbiBmYWls
ZWQnKTsKKyAgfQorCisgIFVuYXV0aG9yaXplZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoQWpheEVycm9yLnByb3RvdHlwZSk7CisKKyAgZnVuY3Rpb24gRm9yYmlkZGVuRXJyb3IoZXJy
b3JzKSB7CisgICAgQWpheEVycm9yLmNhbGwodGhpcywgZXJyb3JzLCAnUmVxdWVzdCB3YXMgcmVq
ZWN0ZWQgYmVjYXVzZSB1c2VyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJh
dGlvbi4nKTsKKyAgfQorCisgIEZvcmJpZGRlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoQWpheEVycm9yLnByb3RvdHlwZSk7Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9pbmRleCcs
IFsnZXhwb3J0cycsICdlbWJlci1hamF4L3JlcXVlc3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlckFqYXhSZXF1ZXN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBPYmplY3QuZGVmaW5lUHJv
cGVydHkoZXhwb3J0cywgJ2RlZmF1bHQnLCB7CisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBn
ZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJBamF4UmVxdWVzdFsnZGVm
YXVsdCddOworICAgIH0KKyAgfSk7Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9tYWtlLXByb21p
c2UnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlcikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gbWFrZVByb21pc2U7CisK
KyAgdmFyIHJ1biA9IF9lbWJlclsnZGVmYXVsdCddLnJ1bjsKKyAgdmFyIFJTVlAgPSBfZW1iZXJb
J2RlZmF1bHQnXS5SU1ZQOworCisgIGZ1bmN0aW9uIG1ha2VQcm9taXNlKHNldHRpbmdzKSB7Cisg
ICAgdmFyIHR5cGUgPSBzZXR0aW5ncy50eXBlIHx8ICdHRVQnOworICAgIHJldHVybiBuZXcgUlNW
UC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHNldHRpbmdzLnN1
Y2Nlc3MgPSBtYWtlU3VjY2VzcyhyZXNvbHZlKTsKKyAgICAgIHNldHRpbmdzLmVycm9yID0gbWFr
ZUVycm9yKHJlamVjdCk7CisgICAgICBfZW1iZXJbJ2RlZmF1bHQnXS4kLmFqYXgoc2V0dGluZ3Mp
OworICAgIH0sICdlbWJlci1hamF4OiAnICsgdHlwZSArICcgdG8gJyArIHNldHRpbmdzLnVybCk7
CisgIH0KKworICBmdW5jdGlvbiBtYWtlU3VjY2VzcyhyZXNvbHZlKSB7CisgICAgcmV0dXJuIGZ1
bmN0aW9uIHN1Y2Nlc3MocmVzcG9uc2UsIHRleHRTdGF0dXMsIGpxWEhSKSB7CisgICAgICBydW4o
bnVsbCwgcmVzb2x2ZSwgeworICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCisgICAgICAgIHRl
eHRTdGF0dXM6IHRleHRTdGF0dXMsCisgICAgICAgIGpxWEhSOiBqcVhIUgorICAgICAgfSk7Cisg
ICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIG1ha2VFcnJvcihyZWplY3QpIHsKKyAgICByZXR1cm4g
ZnVuY3Rpb24gZXJyb3IoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CisgICAgICBy
dW4obnVsbCwgcmVqZWN0LCB7CisgICAgICAgIGpxWEhSOiBqcVhIUiwKKyAgICAgICAgdGV4dFN0
YXR1czogdGV4dFN0YXR1cywKKyAgICAgICAgZXJyb3JUaHJvd246IGVycm9yVGhyb3duCisgICAg
ICB9KTsKKyAgICB9OworICB9Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9yYXcnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItYWpheC9tYWtlLXByb21pc2UnLCAnZW1iZXItYWpheC91dGlscy9wYXJzZS1h
cmdzJywgJ2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJBamF4TWFrZVByb21pc2Us
IF9lbWJlckFqYXhVdGlsc1BhcnNlQXJncywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICB2YXIgX3NsaWNlZFRvQXJyYXkgPSAoZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIHNsaWNl
SXRlcmF0b3IoYXJyLCBpKSB7CisgICAgICB2YXIgX2FyciA9IFtdO3ZhciBfbiA9IHRydWU7dmFy
IF9kID0gZmFsc2U7dmFyIF9lID0gdW5kZWZpbmVkO3RyeSB7CisgICAgICAgIGZvciAodmFyIF9p
ID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRv
bmUpOyBfbiA9IHRydWUpIHsKKyAgICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO2lmIChpICYm
IF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJy
KSB7CisgICAgICAgIF9kID0gdHJ1ZTtfZSA9IGVycjsKKyAgICAgIH0gZmluYWxseSB7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgaWYgKCFfbiAmJiBfaVsncmV0dXJuJ10pIF9pWydyZXR1cm4n
XSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChfZCkgdGhyb3cgX2U7Cisg
ICAgICAgIH0KKyAgICAgIH1yZXR1cm4gX2FycjsKKyAgICB9cmV0dXJuIGZ1bmN0aW9uIChhcnIs
IGkpIHsKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKKyAgICAgICAgcmV0dXJuIGFy
cjsKKyAgICAgIH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7Cisg
ICAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUg
bm9uLWl0ZXJhYmxlIGluc3RhbmNlJyk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSByYXc7CisKKyAgdmFyIGRlcHJlY2F0ZSA9IF9lbWJlclsnZGVm
YXVsdCddLmRlcHJlY2F0ZTsKKworICAvKgorICAgKiBTYW1lIGFzIGByZXF1ZXN0YCBleGNlcHQg
aXQgcmVzb2x2ZXMgYW4gb2JqZWN0IHdpdGggYHtyZXNwb25zZSwgdGV4dFN0YXR1cywKKyAgICog
anFYSFJ9YCwgdXNlZnVsIGlmIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUganFYSFIgb2JqZWN0IGZv
ciBoZWFkZXJzLCBldGMuCisgICAqLworICBmdW5jdGlvbiByYXcoKSB7CisgICAgZGVwcmVjYXRl
KCdlbWJlci1hamF4L3JhdyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZW1i
ZXItYWpheEAyLjAuMCcsIGZhbHNlLCB7IGlkOiAnZW1iZXItYWpheC5yYXcnIH0pOworCisgICAg
dmFyIF9wYXJzZUFyZ3MkYXBwbHkgPSBfZW1iZXJBamF4VXRpbHNQYXJzZUFyZ3NbJ2RlZmF1bHQn
XS5hcHBseShudWxsLCBhcmd1bWVudHMpOworCisgICAgdmFyIF9wYXJzZUFyZ3MkYXBwbHkyID0g
X3NsaWNlZFRvQXJyYXkoX3BhcnNlQXJncyRhcHBseSwgMyk7CisKKyAgICB2YXIgdXJsID0gX3Bh
cnNlQXJncyRhcHBseTJbMF07CisgICAgdmFyIHR5cGUgPSBfcGFyc2VBcmdzJGFwcGx5MlsxXTsK
KyAgICB2YXIgc2V0dGluZ3MgPSBfcGFyc2VBcmdzJGFwcGx5MlsyXTsKKworICAgIGlmICghc2V0
dGluZ3MpIHsKKyAgICAgIHNldHRpbmdzID0ge307CisgICAgfQorICAgIHNldHRpbmdzLnVybCA9
IHVybDsKKyAgICBzZXR0aW5ncy50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gKDAsIF9lbWJlckFq
YXhNYWtlUHJvbWlzZVsnZGVmYXVsdCddKShzZXR0aW5ncyk7CisgIH0KK30pOworZGVmaW5lKCdl
bWJlci1hamF4L3JlcXVlc3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItYWpheC9yYXcnLCAnZW1iZXIn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckFqYXhSYXcsIF9lbWJlcikgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gcmVxdWVzdDsKKworICB2YXIgZGVwcmVj
YXRlID0gX2VtYmVyWydkZWZhdWx0J10uZGVwcmVjYXRlOworCisgIC8qCisgICAqIGpRdWVyeS5h
amF4IHdyYXBwZXIsIHN1cHBvcnRzIHRoZSBzYW1lIHNpZ25hdHVyZSBleGNlcHQgcHJvdmlkaW5n
CisgICAqIGBzdWNjZXNzYCBhbmQgYGVycm9yYCBoYW5kbGVycyB3aWxsIHRocm93IGFuIGVycm9y
ICh1c2UgcHJvbWlzZXMgaW5zdGVhZCkKKyAgICogYW5kIGl0IHJlc29sdmVzIG9ubHkgdGhlIHJl
c3BvbnNlIChubyBhY2Nlc3MgdG8ganFYSFIgb3IgdGV4dFN0YXR1cykuCisgICAqLworICBmdW5j
dGlvbiByZXF1ZXN0KCkgeworICAgIGRlcHJlY2F0ZSgnZW1iZXItYWpheC9yZXF1ZXN0IGlzIGRl
cHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBlbWJlci1hamF4QDIuMC4wJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1hamF4LnJhdycgfSk7CisgICAgcmV0dXJuIF9lbWJlckFqYXhSYXdbJ2Rl
ZmF1bHQnXS5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbiAocmVzdWx0
KSB7CisgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlOworICAgIH0sIG51bGwsICdlbWJlci1h
amF4OiB1bndyYXAgcmF3IGFqYXggcmVzcG9uc2UnKTsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVy
LWFqYXgvc2VydmljZXMvYWpheCcsIFsnZXhwb3J0cycsICdlbWJlcicsICdlbWJlci1hamF4L2Vy
cm9ycycsICdlbWJlci1hamF4L3V0aWxzL3BhcnNlLXJlc3BvbnNlLWhlYWRlcnMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlciwgX2VtYmVyQWpheEVycm9ycywgX2VtYmVyQWpheFV0aWxzUGFy
c2VSZXNwb25zZUhlYWRlcnMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBkZXByZWNhdGUg
PSBfZW1iZXJbJ2RlZmF1bHQnXS5kZXByZWNhdGU7CisgIHZhciBnZXQgPSBfZW1iZXJbJ2RlZmF1
bHQnXS5nZXQ7CisgIHZhciBpc0JsYW5rID0gX2VtYmVyWydkZWZhdWx0J10uaXNCbGFuazsKKwor
ICAvKioKKyAgICAjIyMgSGVhZGVycyBjdXN0b21pemF0aW9uCisgIAorICAgIFNvbWUgQVBJcyBy
ZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBwcm92aWRlIGFuIEFQSSBrZXkuIEFyYml0cmFy
eQorICAgIGhlYWRlcnMgY2FuIGJlIHNldCBhcyBrZXkvdmFsdWUgcGFpcnMgb24gdGhlIGBSRVNU
QWRhcHRlcmAncyBgaGVhZGVyc2AKKyAgICBvYmplY3QgYW5kIEVtYmVyIERhdGEgd2lsbCBzZW5k
IHRoZW0gYWxvbmcgd2l0aCBlYWNoIGFqYXggcmVxdWVzdC4KKyAgCisgICAgYGBgYXBwL3NlcnZp
Y2VzL2FqYXgKKyAgICBpbXBvcnQgQWpheFNlcnZpY2UgZnJvbSAnZW1iZXItYWpheC9zZXJ2aWNl
cy9hamF4JzsKKyAgCisgICAgZXhwb3J0IGRlZmF1bHQgQWpheFNlcnZpY2UuZXh0ZW5kKHsKKyAg
ICAgIGhlYWRlcnM6IHsKKyAgICAgICAgIkFQSV9LRVkiOiAic2VjcmV0IGtleSIsCisgICAgICAg
ICJBTk9USEVSX0hFQURFUiI6ICJTb21lIGhlYWRlciB2YWx1ZSIKKyAgICAgIH0KKyAgICB9KTsK
KyAgICBgYGAKKyAgCisgICAgYGhlYWRlcnNgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjb21wdXRl
ZCBwcm9wZXJ0eSB0byBzdXBwb3J0IGR5bmFtaWMKKyAgICBoZWFkZXJzLgorICAKKyAgICBgYGBh
cHAvc2VydmljZXMvYWpheC5qcworICAgIGltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisgICAg
aW1wb3J0IEFqYXhTZXJ2aWNlIGZyb20gJ2VtYmVyLWFqYXgvc2VydmljZXMvYWpheCc7CisgIAor
ICAgIGV4cG9ydCBkZWZhdWx0IEFqYXhTZXJ2aWNlLmV4dGVuZCh7CisgICAgICBzZXNzaW9uOiBF
bWJlci5pbmplY3Quc2VydmljZSgpLAorICAgICAgaGVhZGVyczogRW1iZXIuY29tcHV0ZWQoInNl
c3Npb24uYXV0aFRva2VuIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAg
ICAgIkFQSV9LRVkiOiB0aGlzLmdldCgic2Vzc2lvbi5hdXRoVG9rZW4iKSwKKyAgICAgICAgICAi
QU5PVEhFUl9IRUFERVIiOiAiU29tZSBoZWFkZXIgdmFsdWUiCisgICAgICAgIH07CisgICAgICB9
KQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBJbiBzb21lIGNhc2VzLCB5b3VyIGR5bmFtaWMg
aGVhZGVycyBtYXkgcmVxdWlyZSBkYXRhIGZyb20gc29tZQorICAgIG9iamVjdCBvdXRzaWRlIG9m
IEVtYmVyJ3Mgb2JzZXJ2ZXIgc3lzdGVtIChmb3IgZXhhbXBsZQorICAgIGBkb2N1bWVudC5jb29r
aWVgKS4gWW91IGNhbiB1c2UgdGhlCisgICAgW3ZvbGF0aWxlXSgvYXBpL2NsYXNzZXMvRW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eS5odG1sI21ldGhvZF92b2xhdGlsZSkKKyAgICBmdW5jdGlvbiB0byBz
ZXQgdGhlIHByb3BlcnR5IGludG8gYSBub24tY2FjaGVkIG1vZGUgY2F1c2luZyB0aGUgaGVhZGVy
cyB0bworICAgIGJlIHJlY29tcHV0ZWQgd2l0aCBldmVyeSByZXF1ZXN0LgorICAKKyAgICBgYGBh
cHAvc2VydmljZXMvYWpheC5qcworICAgIGltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisgICAg
aW1wb3J0IEFqYXhTZXJ2aWNlIGZyb20gJ2VtYmVyLWFqYXgvc2VydmljZXMvYWpheCc7CisgIAor
ICAgIGV4cG9ydCBkZWZhdWx0IEFqYXhTZXJ2aWNlLmV4dGVuZCh7CisgICAgICBzZXNzaW9uOiBF
bWJlci5pbmplY3Quc2VydmljZSgpLAorICAgICAgaGVhZGVyczogRW1iZXIuY29tcHV0ZWQoInNl
c3Npb24uYXV0aFRva2VuIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAg
ICAgIkFQSV9LRVkiOiBFbWJlci5nZXQoZG9jdW1lbnQuY29va2llLm1hdGNoKC9hcGlLZXlcPShb
XjtdKikvKSwgIjEiKSwKKyAgICAgICAgICAiQU5PVEhFUl9IRUFERVIiOiAiU29tZSBoZWFkZXIg
dmFsdWUiCisgICAgICAgIH07CisgICAgICB9KS52b2xhdGlsZSgpCisgICAgfSk7CisgICAgYGBg
CisgIAorICAqKi8KKyAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uU2Vy
dmljZS5leHRlbmQoeworCisgICAgcmVxdWVzdDogZnVuY3Rpb24gcmVxdWVzdCh1cmwsIG9wdGlv
bnMpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBvcHRzOworCisgICAg
ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcn
KSB7CisgICAgICAgIGRlcHJlY2F0ZSgnZW1iZXItYWpheC9hamF4I3JlcXVlc3QgY2FsbGluZyBy
ZXF1ZXN0IHdpdGggYHR5cGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBl
bWJlci1hamF4QDEuMC4wLiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgdHlwZSBwYXNzIGFuIG9i
amVjdCBsaWtlIHt0eXBlOiBcJ0RFTEVURVwnfScsIGZhbHNlLCB7IGlkOiAnZW1iZXItYWpheC5z
ZXJ2aWNlLnJlcXVlc3QnIH0pOworCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikg
eworICAgICAgICAgIG9wdHMgPSBhcmd1bWVudHNbMl07CisgICAgICAgICAgb3B0cy50eXBlID0g
b3B0aW9uczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvcHRzID0geyB0eXBlOiBvcHRp
b25zIH07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9wdHMgPSBvcHRpb25z
OworICAgICAgfQorCisgICAgICB2YXIgaGFzaCA9IHRoaXMub3B0aW9ucyh1cmwsIG9wdHMpOwor
CisgICAgICByZXR1cm4gbmV3IF9lbWJlclsnZGVmYXVsdCddLlJTVlAuUHJvbWlzZShmdW5jdGlv
biAocmVzb2x2ZSwgcmVqZWN0KSB7CisKKyAgICAgICAgaGFzaC5zdWNjZXNzID0gZnVuY3Rpb24g
KHBheWxvYWQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CisgICAgICAgICAgdmFyIHJlc3BvbnNlID0g
X3RoaXMuaGFuZGxlUmVzcG9uc2UoanFYSFIuc3RhdHVzLCAoMCwgX2VtYmVyQWpheFV0aWxzUGFy
c2VSZXNwb25zZUhlYWRlcnNbJ2RlZmF1bHQnXSkoanFYSFIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJz
KCkpLCBwYXlsb2FkKTsKKworICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIF9lbWJl
ckFqYXhFcnJvcnMuQWpheEVycm9yKSB7CisgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpOwor
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAg
ICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uIChqcVhI
UiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKKyAgICAgICAgICB2YXIgZXJyb3IgPSB1bmRl
ZmluZWQ7CisKKyAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkgeworICAg
ICAgICAgICAgaWYgKGVycm9yVGhyb3duIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAg
ICAgZXJyb3IgPSBlcnJvclRocm93bjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgIGVycm9yID0gX3RoaXMuaGFuZGxlUmVzcG9uc2UoanFYSFIuc3RhdHVzLCAoMCwgX2VtYmVy
QWpheFV0aWxzUGFyc2VSZXNwb25zZUhlYWRlcnNbJ2RlZmF1bHQnXSkoanFYSFIuZ2V0QWxsUmVz
cG9uc2VIZWFkZXJzKCkpLCBfdGhpcy5wYXJzZUVycm9yUmVzcG9uc2UoanFYSFIucmVzcG9uc2VU
ZXh0KSB8fCBlcnJvclRocm93bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAg
ICAgIHJlamVjdChlcnJvcik7CisgICAgICAgIH07CisKKyAgICAgICAgX2VtYmVyWydkZWZhdWx0
J10uJC5hamF4KGhhc2gpOworICAgICAgfSwgJ2VtYmVyLWFqYXg6ICcgKyBoYXNoLnR5cGUgKyAn
IHRvICcgKyB1cmwpOworICAgIH0sCisKKyAgICAvLyBjYWxscyBgcmVxdWVzdCgpYCBidXQgZm9y
Y2VzIGBvcHRpb25zLnR5cGVgIHRvIGBQT1NUYAorICAgIHBvc3Q6IGZ1bmN0aW9uIHBvc3QodXJs
LCBvcHRpb25zKSB7CisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgdGhpcy5fYWRkVHlw
ZVRvT3B0aW9uc0ZvcihvcHRpb25zLCAnUE9TVCcpKTsKKyAgICB9LAorCisgICAgLy8gY2FsbHMg
YHJlcXVlc3QoKWAgYnV0IGZvcmNlcyBgb3B0aW9ucy50eXBlYCB0byBgUFVUYAorICAgIHB1dDog
ZnVuY3Rpb24gcHV0KHVybCwgb3B0aW9ucykgeworICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1
cmwsIHRoaXMuX2FkZFR5cGVUb09wdGlvbnNGb3Iob3B0aW9ucywgJ1BVVCcpKTsKKyAgICB9LAor
CisgICAgLy8gY2FsbHMgYHJlcXVlc3QoKWAgYnV0IGZvcmNlcyBgb3B0aW9ucy50eXBlYCB0byBg
UEFUQ0hgCisgICAgcGF0Y2g6IGZ1bmN0aW9uIHBhdGNoKHVybCwgb3B0aW9ucykgeworICAgICAg
cmV0dXJuIHRoaXMucmVxdWVzdCh1cmwsIHRoaXMuX2FkZFR5cGVUb09wdGlvbnNGb3Iob3B0aW9u
cywgJ1BBVENIJykpOworICAgIH0sCisKKyAgICAvLyBjYWxscyBgcmVxdWVzdCgpYCBidXQgZm9y
Y2VzIGBvcHRpb25zLnR5cGVgIHRvIGBERUxFVEVgCisgICAgZGVsOiBmdW5jdGlvbiBkZWwodXJs
LCBvcHRpb25zKSB7CisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgdGhpcy5fYWRkVHlw
ZVRvT3B0aW9uc0ZvcihvcHRpb25zLCAnREVMRVRFJykpOworICAgIH0sCisKKyAgICAvLyBmb3Jj
aWJseSBtYW5pcHVsYXRlcyB0aGUgb3B0aW9ucyBoYXNoIHRvIGluY2x1ZGUgdGhlIEhUVFAgbWV0
aG9kIG9uIHRoZSB0eXBlIGtleQorICAgIF9hZGRUeXBlVG9PcHRpb25zRm9yOiBmdW5jdGlvbiBf
YWRkVHlwZVRvT3B0aW9uc0ZvcihvcHRpb25zLCBtZXRob2QpIHsKKyAgICAgIG9wdGlvbnMgPSBv
cHRpb25zIHx8IHt9OworICAgICAgb3B0aW9ucy50eXBlID0gbWV0aG9kOworICAgICAgcmV0dXJu
IG9wdGlvbnM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCBvcHRpb25zCisgICAg
ICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHVybAorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9wdGlvbnMKKyAgICAgIEByZXR1cm4ge09iamVjdH0KKyAgICAqLworICAgIG9wdGlvbnM6
IGZ1bmN0aW9uIG9wdGlvbnModXJsLCBfb3B0aW9ucykgeworICAgICAgdmFyIGhhc2ggPSBfb3B0
aW9ucyB8fCB7fTsKKyAgICAgIGhhc2gudXJsID0gdGhpcy5fYnVpbGRVUkwodXJsKTsKKyAgICAg
IGhhc2gudHlwZSA9IGhhc2gudHlwZSB8fCAnR0VUJzsKKyAgICAgIGhhc2guZGF0YVR5cGUgPSBo
YXNoLmRhdGFUeXBlIHx8ICdqc29uJzsKKyAgICAgIGhhc2guY29udGV4dCA9IHRoaXM7CisKKyAg
ICAgIHZhciBoZWFkZXJzID0gZ2V0KHRoaXMsICdoZWFkZXJzJyk7CisgICAgICBpZiAoaGVhZGVy
cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGhhc2guYmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4
aHIpIHsKKyAgICAgICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChr
ZXkpIHsKKyAgICAgICAgICAgIHJldHVybiB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRl
cnNba2V5XSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBoYXNoOworICAgIH0sCisKKyAgICBfYnVpbGRVUkw6IGZ1bmN0aW9uIF9idWlsZFVSTCh1
cmwpIHsKKyAgICAgIHZhciBob3N0ID0gZ2V0KHRoaXMsICdob3N0Jyk7CisgICAgICBpZiAoaXNC
bGFuayhob3N0KSkgeworICAgICAgICByZXR1cm4gdXJsOworICAgICAgfQorICAgICAgdmFyIHN0
YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHNlYXJj
aFN0cmluZywgcG9zaXRpb24pIHsKKyAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiB8fCAwOwor
ICAgICAgICByZXR1cm4gdGhpcy5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pID09PSBw
b3NpdGlvbjsKKyAgICAgIH07CisgICAgICBpZiAoc3RhcnRzV2l0aC5jYWxsKHVybCwgJy8nKSkg
eworICAgICAgICByZXR1cm4gJycgKyBob3N0ICsgdXJsOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIGhvc3QgKyAnLycgKyB1cmw7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgor
ICAgICBUYWtlcyBhbiBhamF4IHJlc3BvbnNlLCBhbmQgcmV0dXJucyB0aGUganNvbiBwYXlsb2Fk
IG9yIGFuIGVycm9yLgorICAgICAgQnkgZGVmYXVsdCB0aGlzIGhvb2sganVzdCByZXR1cm5zIHRo
ZSBqc29uIHBheWxvYWQgcGFzc2VkIHRvIGl0LgorICAgICBZb3UgbWlnaHQgd2FudCB0byBvdmVy
cmlkZSBpdCBpbiB0d28gY2FzZXM6CisgICAgICAxLiBZb3VyIEFQSSBtaWdodCByZXR1cm4gdXNl
ZnVsIHJlc3VsdHMgaW4gdGhlIHJlc3BvbnNlIGhlYWRlcnMuCisgICAgIFJlc3BvbnNlIGhlYWRl
cnMgYXJlIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAgMi4gWW91ciBB
UEkgbWlnaHQgcmV0dXJuIGVycm9ycyBhcyBzdWNjZXNzZnVsIHJlc3BvbnNlcyB3aXRoIHN0YXR1
cyBjb2RlCisgICAgIDIwMCBhbmQgYW4gRXJyb3JzIHRleHQgb3Igb2JqZWN0LgorICAgICBAbWV0
aG9kIGhhbmRsZVJlc3BvbnNlCisgICAgIEBwYXJhbSAge051bWJlcn0gc3RhdHVzCisgICAgIEBw
YXJhbSAge09iamVjdH0gaGVhZGVycworICAgICBAcGFyYW0gIHtPYmplY3R9IHBheWxvYWQKKyAg
ICAgQHJldHVybiB7T2JqZWN0IHwgRFMuQWRhcHRlckVycm9yfSByZXNwb25zZQorICAgICovCisg
ICAgaGFuZGxlUmVzcG9uc2U6IGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHN0YXR1cywgaGVhZGVy
cywgcGF5bG9hZCkgeworICAgICAgaWYgKHRoaXMuaXNTdWNjZXNzKHN0YXR1cywgaGVhZGVycywg
cGF5bG9hZCkpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgICB9IGVsc2UgaWYgKHRo
aXMuaXNVbmF1dGhvcml6ZWQoc3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSkgeworICAgICAgICBy
ZXR1cm4gbmV3IF9lbWJlckFqYXhFcnJvcnMuVW5hdXRob3JpemVkRXJyb3IocGF5bG9hZC5lcnJv
cnMpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRm9yYmlkZGVuKHN0YXR1cywgaGVhZGVycywg
cGF5bG9hZCkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBfZW1iZXJBamF4RXJyb3JzLkZvcmJpZGRl
bkVycm9yKHBheWxvYWQuZXJyb3JzKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ludmFsaWQo
c3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSkgeworICAgICAgICByZXR1cm4gbmV3IF9lbWJlckFq
YXhFcnJvcnMuSW52YWxpZEVycm9yKHBheWxvYWQuZXJyb3JzKTsKKyAgICAgIH0KKworICAgICAg
dmFyIGVycm9ycyA9IHRoaXMubm9ybWFsaXplRXJyb3JSZXNwb25zZShzdGF0dXMsIGhlYWRlcnMs
IHBheWxvYWQpOworCisgICAgICByZXR1cm4gbmV3IF9lbWJlckFqYXhFcnJvcnMuQWpheEVycm9y
KGVycm9ycyk7CisgICAgfSwKKworICAgIC8qKgorICAgICBEZWZhdWx0IGBoYW5kbGVSZXNwb25z
ZWAgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAgICBy
ZXNwb25zZSBpcyBhIGFuIGF1dGhvcml6ZWQgZXJyb3IuCisgICAgIEBtZXRob2QgaXNVbmF1dGhv
cml6ZWQKKyAgICAgQHBhcmFtICB7TnVtYmVyfSBzdGF0dXMKKyAgICAgQHBhcmFtICB7T2JqZWN0
fSBoZWFkZXJzCisgICAgIEBwYXJhbSAge09iamVjdH0gcGF5bG9hZAorICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICovCisgICAgaXNVbmF1dGhvcml6ZWQ6IGZ1bmN0aW9uIGlzVW5hdXRob3Jp
emVkKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAqLykgeworICAgICAgcmV0dXJuIHN0YXR1
cyA9PT0gNDAxOworICAgIH0sCisKKyAgICAvKioKKyAgICAgICBEZWZhdWx0IGBoYW5kbGVSZXNw
b25zZWAgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAg
ICAgIHJlc3BvbnNlIGlzIGEgZm9yYmlkZGVuIGVycm9yLgorICAgICAgIEBtZXRob2QgaXNGb3Ji
aWRkZW4KKyAgICAgICBAcGFyYW0gIHtOdW1iZXJ9IHN0YXR1cworICAgICAgIEBwYXJhbSAge09i
amVjdH0gaGVhZGVycworICAgICAgIEBwYXJhbSAge09iamVjdH0gcGF5bG9hZAorICAgICAgIEBy
ZXR1cm4ge0Jvb2xlYW59CisgICAgICovCisgICAgaXNGb3JiaWRkZW46IGZ1bmN0aW9uIGlzRm9y
YmlkZGVuKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAqLykgeworICAgICAgcmV0dXJuIHN0
YXR1cyA9PT0gNDAzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIERlZmF1bHQgYGhhbmRsZVJl
c3BvbnNlYCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoaXMgaG9vayB0byBkZWNpZGUgaWYgdGhlCisg
ICAgICByZXNwb25zZSBpcyBhIGFuIGludmFsaWQgZXJyb3IuCisgICAgICBAbWV0aG9kIGlzSW52
YWxpZAorICAgICAgQHBhcmFtICB7TnVtYmVyfSBzdGF0dXMKKyAgICAgIEBwYXJhbSAge09iamVj
dH0gaGVhZGVycworICAgICAgQHBhcmFtICB7T2JqZWN0fSBwYXlsb2FkCisgICAgICBAcmV0dXJu
IHtCb29sZWFufQorICAgICovCisgICAgaXNJbnZhbGlkOiBmdW5jdGlvbiBpc0ludmFsaWQoc3Rh
dHVzIC8qLCBoZWFkZXJzLCBwYXlsb2FkICovKSB7CisgICAgICByZXR1cm4gc3RhdHVzID09PSA0
MjI7CisgICAgfSwKKworICAgIC8qKgorICAgICBEZWZhdWx0IGBoYW5kbGVSZXNwb25zZWAgaW1w
bGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAgICByZXNwb25z
ZSBpcyBhIHN1Y2Nlc3MuCisgICAgIEBtZXRob2QgaXNTdWNjZXNzCisgICAgIEBwYXJhbSAge051
bWJlcn0gc3RhdHVzCisgICAgIEBwYXJhbSAge09iamVjdH0gaGVhZGVycworICAgICBAcGFyYW0g
IHtPYmplY3R9IHBheWxvYWQKKyAgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICAqLworICAgIGlz
U3VjY2VzczogZnVuY3Rpb24gaXNTdWNjZXNzKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAq
LykgeworICAgICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1
cyA9PT0gMzA0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgcGFyc2VFcnJvclJl
c3BvbnNlCisgICAgICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHJlc3BvbnNlVGV4
dAorICAgICAgQHJldHVybiB7T2JqZWN0fQorICAgICovCisgICAgcGFyc2VFcnJvclJlc3BvbnNl
OiBmdW5jdGlvbiBwYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2VUZXh0KSB7CisgICAgICB2YXIg
anNvbiA9IHJlc3BvbnNlVGV4dDsKKworICAgICAgdHJ5IHsKKyAgICAgICAganNvbiA9IF9lbWJl
clsnZGVmYXVsdCddLiQucGFyc2VKU09OKHJlc3BvbnNlVGV4dCk7CisgICAgICB9IGNhdGNoIChl
KSB7fQorCisgICAgICByZXR1cm4ganNvbjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0
aG9kIG5vcm1hbGl6ZUVycm9yUmVzcG9uc2UKKyAgICAgIEBwcml2YXRlCisgICAgICBAcGFyYW0g
IHtOdW1iZXJ9IHN0YXR1cworICAgICAgQHBhcmFtICB7T2JqZWN0fSBoZWFkZXJzCisgICAgICBA
cGFyYW0gIHtPYmplY3R9IHBheWxvYWQKKyAgICAgIEByZXR1cm4ge09iamVjdH0gZXJyb3JzIHBh
eWxvYWQKKyAgICAqLworICAgIG5vcm1hbGl6ZUVycm9yUmVzcG9uc2U6IGZ1bmN0aW9uIG5vcm1h
bGl6ZUVycm9yUmVzcG9uc2Uoc3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSB7CisgICAgICBpZiAo
cGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgcGF5bG9hZC5lcnJvcnMp
IHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQuZXJyb3JzOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIFt7CisgICAgICAgICAgc3RhdHVzOiAnJyArIHN0YXR1cywKKyAgICAgICAgICB0
aXRsZTogIlRoZSBiYWNrZW5kIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIiwKKyAgICAgICAgICBk
ZXRhaWw6ICcnICsgcGF5bG9hZAorICAgICAgICB9XTsKKyAgICAgIH0KKyAgICB9CisgIH0pOwor
fSk7CitkZWZpbmUoImVtYmVyLWFqYXgvdXRpbHMvcGFyc2UtYXJncyIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgdmFyIF9zbGljZWRUb0Fy
cmF5ID0gKGZ1bmN0aW9uICgpIHsKKyAgICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkg
eworICAgICAgdmFyIF9hcnIgPSBbXTt2YXIgX24gPSB0cnVlO3ZhciBfZCA9IGZhbHNlO3ZhciBf
ZSA9IHVuZGVmaW5lZDt0cnkgeworICAgICAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRl
cmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7
CisgICAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0g
aSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfZCA9
IHRydWU7X2UgPSBlcnI7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgIGlmICghX24gJiYgX2lbInJldHVybiJdKSBfaVsicmV0dXJuIl0oKTsKKyAgICAgICAgfSBm
aW5hbGx5IHsKKyAgICAgICAgICBpZiAoX2QpIHRocm93IF9lOworICAgICAgICB9CisgICAgICB9
cmV0dXJuIF9hcnI7CisgICAgfXJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7CisgICAgICBpZiAo
QXJyYXkuaXNBcnJheShhcnIpKSB7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgICB9IGVsc2Ug
aWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeworICAgICAgICByZXR1cm4gc2xp
Y2VJdGVyYXRvcihhcnIsIGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5
cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0
YW5jZSIpOworICAgICAgfQorICAgIH07CisgIH0pKCk7CisKKyAgZXhwb3J0c1siZGVmYXVsdCJd
ID0gcGFyc2VBcmdzOworCisgIGZ1bmN0aW9uIHBhcnNlQXJncygpIHsKKyAgICB2YXIgYXJncyA9
IFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyk7CisgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7
CisgICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICJzdHJpbmciKSB7CisgICAgICAgIHZhciBf
YXJncyA9IF9zbGljZWRUb0FycmF5KGFyZ3MsIDEpOworCisgICAgICAgIHZhciB1cmwgPSBfYXJn
c1swXTsKKworICAgICAgICByZXR1cm4gW3VybF07CisgICAgICB9IGVsc2UgeworICAgICAgICB2
YXIgX2FyZ3MyID0gX3NsaWNlZFRvQXJyYXkoYXJncywgMSk7CisKKyAgICAgICAgdmFyIG9wdGlv
bnMgPSBfYXJnczJbMF07CisgICAgICAgIHZhciB1cmwgPSBvcHRpb25zLnVybDsKKworICAgICAg
ICBkZWxldGUgb3B0aW9ucy51cmw7CisgICAgICAgIHZhciB0eXBlID0gb3B0aW9ucy50eXBlIHx8
IG9wdGlvbnMubWV0aG9kOworICAgICAgICBkZWxldGUgb3B0aW9ucy50eXBlOworICAgICAgICBk
ZWxldGUgb3B0aW9ucy5tZXRob2Q7CisgICAgICAgIHJldHVybiBbdXJsLCB0eXBlLCBvcHRpb25z
XTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7CisgICAgICB2
YXIgX2FyZ3MzID0gX3NsaWNlZFRvQXJyYXkoYXJncywgMSk7CisKKyAgICAgIHZhciB1cmwgPSBf
YXJnczNbMF07CisKKyAgICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ29iamVjdCcpIHsKKyAg
ICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzWzFdOworICAgICAgICB2YXIgdHlwZSA9IG9wdGlvbnMu
dHlwZSB8fCBvcHRpb25zLm1ldGhvZDsKKyAgICAgICAgZGVsZXRlIG9wdGlvbnMudHlwZTsKKyAg
ICAgICAgZGVsZXRlIG9wdGlvbnMubWV0aG9kOworICAgICAgICByZXR1cm4gW3VybCwgdHlwZSwg
b3B0aW9uc107CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdHlwZSA9IGFyZ3NbMV07Cisg
ICAgICAgIHJldHVybiBbdXJsLCB0eXBlXTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFy
Z3M7CisgIH0KK30pOworZGVmaW5lKCdlbWJlci1hamF4L3V0aWxzL3BhcnNlLXJlc3BvbnNlLWhl
YWRlcnMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHBhcnNlUmVzcG9uc2VIZWFkZXJzOworCisgIGZ1
bmN0aW9uIHBhcnNlUmVzcG9uc2VIZWFkZXJzKGhlYWRlclN0cikgeworICAgIHZhciBoZWFkZXJz
ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBpZiAoIWhlYWRlclN0cikgeworICAgICAgcmV0
dXJuIGhlYWRlcnM7CisgICAgfQorCisgICAgdmFyIGhlYWRlclBhaXJzID0gaGVhZGVyU3RyLnNw
bGl0KCdcclxuJyk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJQYWlycy5sZW5ndGg7
IGkrKykgeworICAgICAgdmFyIGhlYWRlclBhaXIgPSBoZWFkZXJQYWlyc1tpXTsKKyAgICAgIC8v
IENhbid0IHVzZSBzcGxpdCgpIGhlcmUgYmVjYXVzZSBpdCBkb2VzIHRoZSB3cm9uZyB0aGluZwor
ICAgICAgLy8gaWYgdGhlIGhlYWRlciB2YWx1ZSBoYXMgdGhlIHN0cmluZyAiOiAiIGluIGl0Lgor
ICAgICAgdmFyIGluZGV4ID0gaGVhZGVyUGFpci5pbmRleE9mKCc6ICcpOworICAgICAgaWYgKGlu
ZGV4ID4gMCkgeworICAgICAgICB2YXIga2V5ID0gaGVhZGVyUGFpci5zdWJzdHJpbmcoMCwgaW5k
ZXgpOworICAgICAgICB2YXIgdmFsID0gaGVhZGVyUGFpci5zdWJzdHJpbmcoaW5kZXggKyAyKTsK
KyAgICAgICAgaGVhZGVyc1trZXldID0gdmFsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVy
biBoZWFkZXJzOworICB9Cit9KTsKK2RlZmluZSgnZW1iZXItY2xpLWFwcC12ZXJzaW9uL2NvbXBv
bmVudHMvYXBwLXZlcnNpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXInLCAnZW1iZXItY2xpLWFwcC12
ZXJzaW9uL3RlbXBsYXRlcy9hcHAtdmVyc2lvbiddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
LCBfZW1iZXJDbGlBcHBWZXJzaW9uVGVtcGxhdGVzQXBwVmVyc2lvbikgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uQ29tcG9uZW50
LmV4dGVuZCh7CisgICAgdGFnTmFtZTogJ3NwYW4nLAorICAgIGxheW91dDogX2VtYmVyQ2xpQXBw
VmVyc2lvblRlbXBsYXRlc0FwcFZlcnNpb25bJ2RlZmF1bHQnXQorICB9KTsKK30pOworZGVmaW5l
KCdlbWJlci1jbGktYXBwLXZlcnNpb24vaW5pdGlhbGl6ZXItZmFjdG9yeScsIFsnZXhwb3J0cycs
ICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzWydkZWZhdWx0J10gPSBpbml0aWFsaXplckZhY3Rvcnk7CisKKyAgdmFyIGNs
YXNzaWZ5ID0gX2VtYmVyWydkZWZhdWx0J10uU3RyaW5nLmNsYXNzaWZ5OworCisgIGZ1bmN0aW9u
IGluaXRpYWxpemVyRmFjdG9yeShuYW1lLCB2ZXJzaW9uKSB7CisgICAgdmFyIHJlZ2lzdGVyZWQg
PSBmYWxzZTsKKworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoIXJlZ2lzdGVy
ZWQgJiYgbmFtZSAmJiB2ZXJzaW9uKSB7CisgICAgICAgIHZhciBhcHBOYW1lID0gY2xhc3NpZnko
bmFtZSk7CisgICAgICAgIF9lbWJlclsnZGVmYXVsdCddLmxpYnJhcmllcy5yZWdpc3RlcihhcHBO
YW1lLCB2ZXJzaW9uKTsKKyAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICB9CisgICAg
fTsKKyAgfQorfSk7CitkZWZpbmUoImVtYmVyLWNsaS1hcHAtdmVyc2lvbi90ZW1wbGF0ZXMvYXBw
LXZlcnNpb24iLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJp
Y3QiOworCisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChm
dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdt
ZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1lIjogIm1pc3Npbmctd3JhcHBlciIsCisgICAg
ICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJl
dmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291
cmNlIjogbnVsbCwKKyAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEs
CisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6
IHsKKyAgICAgICAgICAgICJsaW5lIjogMiwKKyAgICAgICAgICAgICJjb2x1bW4iOiAwCisgICAg
ICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibW9kdWxlTmFtZSI6ICJtb2R1bGVzL2VtYmVy
LWNsaS1hcHAtdmVyc2lvbi90ZW1wbGF0ZXMvYXBwLXZlcnNpb24uaGJzIgorICAgICAgfSwKKyAg
ICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVu
dDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6
IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3Jl
YXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1l
bnQoIiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQo
ZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwKKyAgICAgIGJ1aWxkUmVu
ZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFnbWVudCwgY29udGV4
dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAg
ICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1
YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAg
ICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJjb250
ZW50IiwgInZlcnNpb24iLCBbImxvYyIsIFtudWxsLCBbMSwgMF0sIFsxLCAxMV1dXV1dLAorICAg
ICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9OworICB9KSgpKTsKK30p
OworZGVmaW5lKCJlbWJlci1pbmZsZWN0b3IvaW5kZXgiLCBbImV4cG9ydHMiLCAiZW1iZXIiLCAi
ZW1iZXItaW5mbGVjdG9yL2xpYi9zeXN0ZW0iLCAiZW1iZXItaW5mbGVjdG9yL2xpYi9leHQvc3Ry
aW5nIl0sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIsIF9lbWJlckluZmxlY3RvckxpYlN5c3Rl
bSwgX2VtYmVySW5mbGVjdG9yTGliRXh0U3RyaW5nKSB7CisgIC8qIGdsb2JhbCBkZWZpbmUsIG1v
ZHVsZSAqLworCisgICJ1c2Ugc3RyaWN0IjsKKworICBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0u
SW5mbGVjdG9yLmRlZmF1bHRSdWxlcyA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5kZWZhdWx0
UnVsZXM7CisgIF9lbWJlclsiZGVmYXVsdCJdLkluZmxlY3RvciA9IF9lbWJlckluZmxlY3Rvckxp
YlN5c3RlbS5JbmZsZWN0b3I7CisKKyAgX2VtYmVyWyJkZWZhdWx0Il0uU3RyaW5nLnBsdXJhbGl6
ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5wbHVyYWxpemU7CisgIF9lbWJlclsiZGVmYXVs
dCJdLlN0cmluZy5zaW5ndWxhcml6ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5zaW5ndWxh
cml6ZTtleHBvcnRzWyJkZWZhdWx0Il0gPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0uSW5mbGVj
dG9yOworICBleHBvcnRzLnBsdXJhbGl6ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5wbHVy
YWxpemU7CisgIGV4cG9ydHMuc2luZ3VsYXJpemUgPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0u
c2luZ3VsYXJpemU7CisgIGV4cG9ydHMuZGVmYXVsdFJ1bGVzID0gX2VtYmVySW5mbGVjdG9yTGli
U3lzdGVtLmRlZmF1bHRSdWxlczsKKworICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5l
ZCcgJiYgZGVmaW5lLmFtZCkgeworICAgIGRlZmluZSgnZW1iZXItaW5mbGVjdG9yJywgWydleHBv
cnRzJ10sIGZ1bmN0aW9uIChfX2V4cG9ydHNfXykgeworICAgICAgX19leHBvcnRzX19bJ2RlZmF1
bHQnXSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5JbmZsZWN0b3I7CisgICAgICByZXR1cm4g
X2VtYmVySW5mbGVjdG9yTGliU3lzdGVtLkluZmxlY3RvcjsKKyAgICB9KTsKKyAgfSBlbHNlIGlm
ICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkgewor
ICAgIG1vZHVsZVsnZXhwb3J0cyddID0gX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtLkluZmxlY3Rv
cjsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvZXh0L3N0cmluZycsIFsn
ZXhwb3J0cycsICdlbWJlcicsICdlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9zdHJpbmcnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlciwgX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtU3RyaW5n
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBpZiAoX2VtYmVyWydkZWZhdWx0J10uRVhURU5EX1BS
T1RPVFlQRVMgPT09IHRydWUgfHwgX2VtYmVyWydkZWZhdWx0J10uRVhURU5EX1BST1RPVFlQRVMu
U3RyaW5nKSB7CisgICAgLyoqCisgICAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcv
cGx1cmFsaXplIn19e3svY3Jvc3NMaW5rfX0KKyAgICAgICBAbWV0aG9kIHBsdXJhbGl6ZQorICAg
ICAgQGZvciBTdHJpbmcKKyAgICAqLworICAgIFN0cmluZy5wcm90b3R5cGUucGx1cmFsaXplID0g
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuICgwLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1T
dHJpbmcucGx1cmFsaXplKSh0aGlzKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICBTZWUge3sj
Y3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvc2luZ3VsYXJpemUifX17ey9jcm9zc0xpbmt9fQorICAg
ICAgIEBtZXRob2Qgc2luZ3VsYXJpemUKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgKi8KKyAgICBT
dHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXplID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJu
ICgwLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1TdHJpbmcuc2luZ3VsYXJpemUpKHRoaXMpOwor
ICAgIH07CisgIH0KK30pOworZGVmaW5lKCdlbWJlci1pbmZsZWN0b3IvbGliL2hlbHBlcnMvcGx1
cmFsaXplJywgWydleHBvcnRzJywgJ2VtYmVyLWluZmxlY3RvcicsICdlbWJlci1pbmZsZWN0b3Iv
bGliL3V0aWxzL21ha2UtaGVscGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJJbmZsZWN0
b3IsIF9lbWJlckluZmxlY3RvckxpYlV0aWxzTWFrZUhlbHBlcikgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgICAqCisgICAqIElmIHlvdSBoYXZlIEVtYmVyIEluZmxlY3RvciAoc3VjaCBh
cyBpZiBFbWJlciBEYXRhIGlzIHByZXNlbnQpLAorICAgKiBwbHVyYWxpemUgYSB3b3JkLiBGb3Ig
ZXhhbXBsZSwgdHVybiAib3giIGludG8gIm94ZW4iLgorICAgKgorICAgKiBFeGFtcGxlOgorICAg
KgorICAgKiB7e3BsdXJhbGl6ZSBjb3VudCBteVByb3BlcnR5fX0KKyAgICoge3twbHVyYWxpemUg
MSAib3hlbiJ9fQorICAgKiB7e3BsdXJhbGl6ZSBteVByb3BlcnR5fX0KKyAgICoge3twbHVyYWxp
emUgIm94In19CisgICAqCisgICAqIEBmb3IgRW1iZXIuSFRNTEJhcnMuaGVscGVycworICAgKiBA
bWV0aG9kIHBsdXJhbGl6ZQorICAgKiBAcGFyYW0ge051bWJlcnxQcm9wZXJ0eX0gW2NvdW50XSBj
b3VudCBvZiBvYmplY3RzCisgICAqIEBwYXJhbSB7U3RyaW5nfFByb3BlcnR5fSB3b3JkIHdvcmQg
dG8gcGx1cmFsaXplCisgICovCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfZW1iZXJJbmZs
ZWN0b3JMaWJVdGlsc01ha2VIZWxwZXJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKHBhcmFtcykgewor
ICAgIHZhciBjb3VudCA9IHVuZGVmaW5lZCwKKyAgICAgICAgd29yZCA9IHVuZGVmaW5lZDsKKwor
ICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAxKSB7CisgICAgICB3b3JkID0gcGFyYW1zWzBdOwor
ICAgICAgcmV0dXJuICgwLCBfZW1iZXJJbmZsZWN0b3IucGx1cmFsaXplKSh3b3JkKTsKKyAgICB9
IGVsc2UgeworICAgICAgY291bnQgPSBwYXJhbXNbMF07CisgICAgICB3b3JkID0gcGFyYW1zWzFd
OworCisgICAgICBpZiAocGFyc2VGbG9hdChjb3VudCkgIT09IDEpIHsKKyAgICAgICAgd29yZCA9
ICgwLCBfZW1iZXJJbmZsZWN0b3IucGx1cmFsaXplKSh3b3JkKTsKKyAgICAgIH0KKworICAgICAg
cmV0dXJuIGNvdW50ICsgIiAiICsgd29yZDsKKyAgICB9CisgIH0pOworfSk7CitkZWZpbmUoJ2Vt
YmVyLWluZmxlY3Rvci9saWIvaGVscGVycy9zaW5ndWxhcml6ZScsIFsnZXhwb3J0cycsICdlbWJl
ci1pbmZsZWN0b3InLCAnZW1iZXItaW5mbGVjdG9yL2xpYi91dGlscy9tYWtlLWhlbHBlciddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySW5mbGVjdG9yLCBfZW1iZXJJbmZsZWN0b3JMaWJVdGls
c01ha2VIZWxwZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgKgorICAgKiBJZiB5
b3UgaGF2ZSBFbWJlciBJbmZsZWN0b3IgKHN1Y2ggYXMgaWYgRW1iZXIgRGF0YSBpcyBwcmVzZW50
KSwKKyAgICogc2luZ3VsYXJpemUgYSB3b3JkLiBGb3IgZXhhbXBsZSwgdHVybiAib3hlbiIgaW50
byAib3giLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiB7e3Npbmd1bGFyaXplIG15
UHJvcGVydHl9fQorICAgKiB7e3Npbmd1bGFyaXplICJveGVuIn19CisgICAqCisgICAqIEBmb3Ig
RW1iZXIuSFRNTEJhcnMuaGVscGVycworICAgKiBAbWV0aG9kIHNpbmd1bGFyaXplCisgICAqIEBw
YXJhbSB7U3RyaW5nfFByb3BlcnR5fSB3b3JkIHdvcmQgdG8gc2luZ3VsYXJpemUKKyAgKi8KKyAg
ZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9lbWJlckluZmxlY3RvckxpYlV0aWxzTWFrZUhlbHBl
clsnZGVmYXVsdCddKShmdW5jdGlvbiAocGFyYW1zKSB7CisgICAgcmV0dXJuICgwLCBfZW1iZXJJ
bmZsZWN0b3Iuc2luZ3VsYXJpemUpKHBhcmFtc1swXSk7CisgIH0pOworfSk7CitkZWZpbmUoImVt
YmVyLWluZmxlY3Rvci9saWIvc3lzdGVtIiwgWyJleHBvcnRzIiwgImVtYmVyLWluZmxlY3Rvci9s
aWIvc3lzdGVtL2luZmxlY3RvciIsICJlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9zdHJpbmci
LCAiZW1iZXItaW5mbGVjdG9yL2xpYi9zeXN0ZW0vaW5mbGVjdGlvbnMiXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3RvciwgX2VtYmVySW5mbGVjdG9y
TGliU3lzdGVtU3RyaW5nLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1JbmZsZWN0aW9ucykgewor
ICAidXNlIHN0cmljdCI7CisKKyAgX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtSW5mbGVjdG9yWyJk
ZWZhdWx0Il0uaW5mbGVjdG9yID0gbmV3IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3Rv
clsiZGVmYXVsdCJdKF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3Rpb25zWyJkZWZhdWx0
Il0pOworCisgIGV4cG9ydHMuSW5mbGVjdG9yID0gX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtSW5m
bGVjdG9yWyJkZWZhdWx0Il07CisgIGV4cG9ydHMuc2luZ3VsYXJpemUgPSBfZW1iZXJJbmZsZWN0
b3JMaWJTeXN0ZW1TdHJpbmcuc2luZ3VsYXJpemU7CisgIGV4cG9ydHMucGx1cmFsaXplID0gX2Vt
YmVySW5mbGVjdG9yTGliU3lzdGVtU3RyaW5nLnBsdXJhbGl6ZTsKKyAgZXhwb3J0cy5kZWZhdWx0
UnVsZXMgPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1JbmZsZWN0aW9uc1siZGVmYXVsdCJdOwor
fSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL2luZmxlY3Rpb25zJywgWydl
eHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzWydkZWZhdWx0J10gPSB7CisgICAgcGx1cmFsczogW1svJC8sICdzJ10sIFsvcyQvaSwgJ3Mn
XSwgWy9eKGF4fHRlc3QpaXMkL2ksICckMWVzJ10sIFsvKG9jdG9wfHZpcil1cyQvaSwgJyQxaSdd
LCBbLyhvY3RvcHx2aXIpaSQvaSwgJyQxaSddLCBbLyhhbGlhc3xzdGF0dXMpJC9pLCAnJDFlcydd
LCBbLyhidSlzJC9pLCAnJDFzZXMnXSwgWy8oYnVmZmFsfHRvbWF0KW8kL2ksICckMW9lcyddLCBb
LyhbdGldKXVtJC9pLCAnJDFhJ10sIFsvKFt0aV0pYSQvaSwgJyQxYSddLCBbL3NpcyQvaSwgJ3Nl
cyddLCBbLyg/OihbXmZdKWZlfChbbHJdKWYpJC9pLCAnJDEkMnZlcyddLCBbLyhoaXZlKSQvaSwg
JyQxcyddLCBbLyhbXmFlaW91eV18cXUpeSQvaSwgJyQxaWVzJ10sIFsvKHh8Y2h8c3N8c2gpJC9p
LCAnJDFlcyddLCBbLyhtYXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQvaSwgJyQxaWNlcyddLCBbL14o
bXxsKW91c2UkL2ksICckMWljZSddLCBbL14obXxsKWljZSQvaSwgJyQxaWNlJ10sIFsvXihveCkk
L2ksICckMWVuJ10sIFsvXihveGVuKSQvaSwgJyQxJ10sIFsvKHF1aXopJC9pLCAnJDF6ZXMnXV0s
CisKKyAgICBzaW5ndWxhcjogW1svcyQvaSwgJyddLCBbLyhzcykkL2ksICckMSddLCBbLyhuKWV3
cyQvaSwgJyQxZXdzJ10sIFsvKFt0aV0pYSQvaSwgJyQxdW0nXSwgWy8oKGEpbmFseXwoYilhfChk
KWlhZ25vfChwKWFyZW50aGV8KHApcm9nbm98KHMpeW5vcHwodCloZSkoc2lzfHNlcykkL2ksICck
MXNpcyddLCBbLyheYW5hbHkpKHNpc3xzZXMpJC9pLCAnJDFzaXMnXSwgWy8oW15mXSl2ZXMkL2ks
ICckMWZlJ10sIFsvKGhpdmUpcyQvaSwgJyQxJ10sIFsvKHRpdmUpcyQvaSwgJyQxJ10sIFsvKFts
cl0pdmVzJC9pLCAnJDFmJ10sIFsvKFteYWVpb3V5XXxxdSlpZXMkL2ksICckMXknXSwgWy8ocyll
cmllcyQvaSwgJyQxZXJpZXMnXSwgWy8obSlvdmllcyQvaSwgJyQxb3ZpZSddLCBbLyh4fGNofHNz
fHNoKWVzJC9pLCAnJDEnXSwgWy9eKG18bClpY2UkL2ksICckMW91c2UnXSwgWy8oYnVzKShlcyk/
JC9pLCAnJDEnXSwgWy8obyllcyQvaSwgJyQxJ10sIFsvKHNob2UpcyQvaSwgJyQxJ10sIFsvKGNy
aXN8dGVzdCkoaXN8ZXMpJC9pLCAnJDFpcyddLCBbL14oYSl4W2llXXMkL2ksICckMXhpcyddLCBb
LyhvY3RvcHx2aXIpKHVzfGkpJC9pLCAnJDF1cyddLCBbLyhhbGlhc3xzdGF0dXMpKGVzKT8kL2ks
ICckMSddLCBbL14ob3gpZW4vaSwgJyQxJ10sIFsvKHZlcnR8aW5kKWljZXMkL2ksICckMWV4J10s
IFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwgWy8ocXVpeil6ZXMkL2ksICckMSddLCBbLyhkYXRh
YmFzZSlzJC9pLCAnJDEnXV0sCisKKyAgICBpcnJlZ3VsYXJQYWlyczogW1sncGVyc29uJywgJ3Bl
b3BsZSddLCBbJ21hbicsICdtZW4nXSwgWydjaGlsZCcsICdjaGlsZHJlbiddLCBbJ3NleCcsICdz
ZXhlcyddLCBbJ21vdmUnLCAnbW92ZXMnXSwgWydjb3cnLCAna2luZSddLCBbJ3pvbWJpZScsICd6
b21iaWVzJ11dLAorCisgICAgdW5jb3VudGFibGU6IFsnZXF1aXBtZW50JywgJ2luZm9ybWF0aW9u
JywgJ3JpY2UnLCAnbW9uZXknLCAnc3BlY2llcycsICdzZXJpZXMnLCAnZmlzaCcsICdzaGVlcCcs
ICdqZWFucycsICdwb2xpY2UnXQorICB9OworfSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9s
aWIvc3lzdGVtL2luZmxlY3RvcicsIFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgY2FwaXRhbGl6ZSA9IF9l
bWJlclsnZGVmYXVsdCddLlN0cmluZy5jYXBpdGFsaXplOworCisgIHZhciBCTEFOS19SRUdFWCA9
IC9eXHMqJC87CisgIHZhciBMQVNUX1dPUkRfREFTSEVEX1JFR0VYID0gLyhbXHcvLV0rW18vXHMt
XSkoW2EtelxkXSskKS87CisgIHZhciBMQVNUX1dPUkRfQ0FNRUxJWkVEX1JFR0VYID0gLyhbXHcv
XHMtXSspKFtBLVpdW2EtelxkXSokKS87CisgIHZhciBDQU1FTElaRURfUkVHRVggPSAvW0EtWl1b
YS16XGRdKiQvOworCisgIGZ1bmN0aW9uIGxvYWRVbmNvdW50YWJsZShydWxlcywgdW5jb3VudGFi
bGUpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdW5jb3VudGFibGUubGVuZ3RoOyBp
IDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHJ1bGVzLnVuY291bnRhYmxlW3VuY291bnRhYmxlW2ld
LnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBsb2FkSXJy
ZWd1bGFyKHJ1bGVzLCBpcnJlZ3VsYXJQYWlycykgeworICAgIHZhciBwYWlyOworCisgICAgZm9y
ICh2YXIgaSA9IDAsIGxlbmd0aCA9IGlycmVndWxhclBhaXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICBwYWlyID0gaXJyZWd1bGFyUGFpcnNbaV07CisKKyAgICAgIC8vcGx1cmFs
aXppbmcKKyAgICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFp
clsxXTsKKyAgICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzFdLnRvTG93ZXJDYXNlKCldID0gcGFp
clsxXTsKKworICAgICAgLy9zaW5ndWxhcml6aW5nCisgICAgICBydWxlcy5pcnJlZ3VsYXJJbnZl
cnNlW3BhaXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOworICAgICAgcnVsZXMuaXJyZWd1
bGFySW52ZXJzZVtwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFpclswXTsKKyAgICB9CisgIH0K
KworICAvKioKKyAgICBJbmZsZWN0b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHN1
cHBseWluZyBpbmZsZWN0aW9uIHJ1bGVzIGZvciB5b3VyCisgICAgYXBwbGljYXRpb24uIEVtYmVy
IGluY2x1ZGVzIGEgZGVmYXVsdCBzZXQgb2YgaW5mbGVjdGlvbiBydWxlcywgYW5kIHByb3ZpZGVz
IGFuCisgICAgQVBJIGZvciBwcm92aWRpbmcgYWRkaXRpb25hbCBydWxlcy4KKyAgCisgICAgRXhh
bXBsZXM6CisgIAorICAgIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIG5vIHJ1bGVzLgorICAK
KyAgICBgYGBqcworICAgIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5mbGVjdG9yKCk7Cisg
ICAgYGBgCisgIAorICAgIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIHRoZSBkZWZhdWx0IGVt
YmVyIHJ1bGVzZXQuCisgIAorICAgIGBgYGpzCisgICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJl
ci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7CisgIAorICAgIGluZmxl
Y3Rvci5wbHVyYWxpemUoJ2NvdycpOyAvLz0+ICdraW5lJworICAgIGluZmxlY3Rvci5zaW5ndWxh
cml6ZSgna2luZScpOyAvLz0+ICdjb3cnCisgICAgYGBgCisgIAorICAgIENyZWF0aW5nIGFuIGlu
ZmxlY3RvciBhbmQgYWRkaW5nIHJ1bGVzIGxhdGVyLgorICAKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIGluZmxlY3RvciA9IEVtYmVyLkluZmxlY3Rvci5pbmZsZWN0b3I7CisgIAorICAgIGlu
ZmxlY3Rvci5wbHVyYWxpemUoJ2FkdmljZScpOyAvLyA9PiAnYWR2aWNlcycKKyAgICBpbmZsZWN0
b3IudW5jb3VudGFibGUoJ2FkdmljZScpOworICAgIGluZmxlY3Rvci5wbHVyYWxpemUoJ2Fkdmlj
ZScpOyAvLyA9PiAnYWR2aWNlJworICAKKyAgICBpbmZsZWN0b3IucGx1cmFsaXplKCdmb3JtdWxh
Jyk7IC8vID0+ICdmb3JtdWxhcycKKyAgICBpbmZsZWN0b3IuaXJyZWd1bGFyKCdmb3JtdWxhJywg
J2Zvcm11bGFlJyk7CisgICAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnZm9ybXVsYScpOyAvLyA9PiAn
Zm9ybXVsYWUnCisgIAorICAgIC8vIHlvdSB3b3VsZCBub3QgbmVlZCB0byBhZGQgdGhlc2UgYXMg
dGhleSBhcmUgdGhlIGRlZmF1bHQgcnVsZXMKKyAgICBpbmZsZWN0b3IucGx1cmFsKC8kLywgJ3Mn
KTsKKyAgICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKKyAgICBgYGAKKyAgCisgICAg
Q3JlYXRpbmcgYW4gaW5mbGVjdG9yIHdpdGggYSBub25kZWZhdWx0IHJ1bGVzZXQuCisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcnVsZXMgPSB7CisgICAgICBwbHVyYWxzOiAgWyAvJC8s
ICdzJyBdLAorICAgICAgc2luZ3VsYXI6IFsgL1xzJC8sICcnIF0sCisgICAgICBpcnJlZ3VsYXJQ
YWlyczogWworICAgICAgICBbICdjb3cnLCAna2luZScgXQorICAgICAgXSwKKyAgICAgIHVuY291
bnRhYmxlOiBbICdmaXNoJyBdCisgICAgfTsKKyAgCisgICAgdmFyIGluZmxlY3RvciA9IG5ldyBF
bWJlci5JbmZsZWN0b3IocnVsZXMpOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgSW5mbGVjdG9y
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAqLworICBmdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNl
dCkgeworICAgIHJ1bGVTZXQgPSBydWxlU2V0IHx8IHt9OworICAgIHJ1bGVTZXQudW5jb3VudGFi
bGUgPSBydWxlU2V0LnVuY291bnRhYmxlIHx8IG1ha2VEaWN0aW9uYXJ5KCk7CisgICAgcnVsZVNl
dC5pcnJlZ3VsYXJQYWlycyA9IHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgfHwgbWFrZURpY3Rpb25h
cnkoKTsKKworICAgIHZhciBydWxlcyA9IHRoaXMucnVsZXMgPSB7CisgICAgICBwbHVyYWxzOiBy
dWxlU2V0LnBsdXJhbHMgfHwgW10sCisgICAgICBzaW5ndWxhcjogcnVsZVNldC5zaW5ndWxhciB8
fCBbXSwKKyAgICAgIGlycmVndWxhcjogbWFrZURpY3Rpb25hcnkoKSwKKyAgICAgIGlycmVndWxh
ckludmVyc2U6IG1ha2VEaWN0aW9uYXJ5KCksCisgICAgICB1bmNvdW50YWJsZTogbWFrZURpY3Rp
b25hcnkoKQorICAgIH07CisKKyAgICBsb2FkVW5jb3VudGFibGUocnVsZXMsIHJ1bGVTZXQudW5j
b3VudGFibGUpOworICAgIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQuaXJyZWd1bGFyUGFp
cnMpOworCisgICAgdGhpcy5lbmFibGVDYWNoZSgpOworICB9CisKKyAgaWYgKCFPYmplY3QuY3Jl
YXRlICYmICFPYmplY3QuY3JlYXRlKG51bGwpLmhhc093blByb3BlcnR5KSB7CisgICAgdGhyb3cg
bmV3IEVycm9yKCJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QuY3JlYXRlKG51
bGwpLCBwbGVhc2UgcG9seWZpbCB3aXRoIGVzNS1zaGFtOiBodHRwOi8vZ2l0LmlvL3lCVTJyZyIp
OworICB9CisKKyAgZnVuY3Rpb24gbWFrZURpY3Rpb25hcnkoKSB7CisgICAgdmFyIGNhY2hlID0g
T2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBjYWNoZVsnX2RpY3QnXSA9IG51bGw7CisgICAgZGVs
ZXRlIGNhY2hlWydfZGljdCddOworICAgIHJldHVybiBjYWNoZTsKKyAgfQorCisgIEluZmxlY3Rv
ci5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICBAcHVibGljCisgICAgICAgQXMgaW5mbGVj
dGlvbnMgY2FuIGJlIGNvc3RseSwgYW5kIGNvbW1vbmx5IHRoZSBzYW1lIHN1YnNldCBvZiB3b3Jk
cyBhcmUgcmVwZWF0ZWRseQorICAgICAgaW5mbGVjdGVkIGFuIG9wdGlvbmFsIGNhY2hlIGlzIHBy
b3ZpZGVkLgorICAgICAgIEBtZXRob2QgZW5hYmxlQ2FjaGUKKyAgICAqLworICAgIGVuYWJsZUNh
Y2hlOiBmdW5jdGlvbiBlbmFibGVDYWNoZSgpIHsKKyAgICAgIHRoaXMucHVyZ2VDYWNoZSgpOwor
CisgICAgICB0aGlzLnNpbmd1bGFyaXplID0gZnVuY3Rpb24gKHdvcmQpIHsKKyAgICAgICAgdGhp
cy5fY2FjaGVVc2VkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3NDYWNoZVt3b3JkXSB8
fCAodGhpcy5fc0NhY2hlW3dvcmRdID0gdGhpcy5fc2luZ3VsYXJpemUod29yZCkpOworICAgICAg
fTsKKworICAgICAgdGhpcy5wbHVyYWxpemUgPSBmdW5jdGlvbiAod29yZCkgeworICAgICAgICB0
aGlzLl9jYWNoZVVzZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdGhpcy5fcENhY2hlW3dvcmRd
IHx8ICh0aGlzLl9wQ2FjaGVbd29yZF0gPSB0aGlzLl9wbHVyYWxpemUod29yZCkpOworICAgICAg
fTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHVibGljCisgICAgICAgQG1ldGhvZCBwdXJn
ZWRDYWNoZQorICAgICovCisgICAgcHVyZ2VDYWNoZTogZnVuY3Rpb24gcHVyZ2VDYWNoZSgpIHsK
KyAgICAgIHRoaXMuX2NhY2hlVXNlZCA9IGZhbHNlOworICAgICAgdGhpcy5fc0NhY2hlID0gbWFr
ZURpY3Rpb25hcnkoKTsKKyAgICAgIHRoaXMuX3BDYWNoZSA9IG1ha2VEaWN0aW9uYXJ5KCk7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQHB1YmxpYworICAgICAgZGlzYWJsZSBjYWNoaW5nCisg
ICAgICAgQG1ldGhvZCBkaXNhYmxlQ2FjaGU7CisgICAgKi8KKyAgICBkaXNhYmxlQ2FjaGU6IGZ1
bmN0aW9uIGRpc2FibGVDYWNoZSgpIHsKKyAgICAgIHRoaXMuX3NDYWNoZSA9IG51bGw7CisgICAg
ICB0aGlzLl9wQ2FjaGUgPSBudWxsOworICAgICAgdGhpcy5zaW5ndWxhcml6ZSA9IGZ1bmN0aW9u
ICh3b3JkKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9zaW5ndWxhcml6ZSh3b3JkKTsKKyAgICAg
IH07CisKKyAgICAgIHRoaXMucGx1cmFsaXplID0gZnVuY3Rpb24gKHdvcmQpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX3BsdXJhbGl6ZSh3b3JkKTsKKyAgICAgIH07CisgICAgfSwKKworICAgIC8q
KgorICAgICAgQG1ldGhvZCBwbHVyYWwKKyAgICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAorICAg
ICAgQHBhcmFtIHtTdHJpbmd9IHN0cmluZworICAgICovCisgICAgcGx1cmFsOiBmdW5jdGlvbiBw
bHVyYWwocmVnZXgsIHN0cmluZykgeworICAgICAgaWYgKHRoaXMuX2NhY2hlVXNlZCkgeworICAg
ICAgICB0aGlzLnB1cmdlQ2FjaGUoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucnVsZXMucGx1cmFs
cy5wdXNoKFtyZWdleCwgc3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBAbWV0aG9kIHNpbmd1bGFyCisgICAgICBAcGFyYW0ge1JlZ0V4cH0gcmVnZXgKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcKKyAgICAqLworICAgIHNpbmd1bGFyOiBmdW5jdGlv
biBzaW5ndWxhcihyZWdleCwgc3RyaW5nKSB7CisgICAgICBpZiAodGhpcy5fY2FjaGVVc2VkKSB7
CisgICAgICAgIHRoaXMucHVyZ2VDYWNoZSgpOworICAgICAgfQorICAgICAgdGhpcy5ydWxlcy5z
aW5ndWxhci5wdXNoKFtyZWdleCwgc3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBAbWV0aG9kIHVuY291bnRhYmxlCisgICAgICBAcGFyYW0ge1N0cmluZ30g
cmVnZXgKKyAgICAqLworICAgIHVuY291bnRhYmxlOiBmdW5jdGlvbiB1bmNvdW50YWJsZShzdHJp
bmcpIHsKKyAgICAgIGlmICh0aGlzLl9jYWNoZVVzZWQpIHsKKyAgICAgICAgdGhpcy5wdXJnZUNh
Y2hlKCk7CisgICAgICB9CisgICAgICBsb2FkVW5jb3VudGFibGUodGhpcy5ydWxlcywgW3N0cmlu
Zy50b0xvd2VyQ2FzZSgpXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCBpcnJl
Z3VsYXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5ndWxhcgorICAgICAgQHBhcmFtIHtTdHJp
bmd9IHBsdXJhbAorICAgICovCisgICAgaXJyZWd1bGFyOiBmdW5jdGlvbiBpcnJlZ3VsYXIoc2lu
Z3VsYXIsIHBsdXJhbCkgeworICAgICAgaWYgKHRoaXMuX2NhY2hlVXNlZCkgeworICAgICAgICB0
aGlzLnB1cmdlQ2FjaGUoKTsKKyAgICAgIH0KKyAgICAgIGxvYWRJcnJlZ3VsYXIodGhpcy5ydWxl
cywgW1tzaW5ndWxhciwgcGx1cmFsXV0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRo
b2QgcGx1cmFsaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gd29yZAorICAgICovCisgICAgcGx1
cmFsaXplOiBmdW5jdGlvbiBwbHVyYWxpemUod29yZCkgeworICAgICAgcmV0dXJuIHRoaXMuX3Bs
dXJhbGl6ZSh3b3JkKTsKKyAgICB9LAorCisgICAgX3BsdXJhbGl6ZTogZnVuY3Rpb24gX3BsdXJh
bGl6ZSh3b3JkKSB7CisgICAgICByZXR1cm4gdGhpcy5pbmZsZWN0KHdvcmQsIHRoaXMucnVsZXMu
cGx1cmFscywgdGhpcy5ydWxlcy5pcnJlZ3VsYXIpOworICAgIH0sCisgICAgLyoqCisgICAgICBA
bWV0aG9kIHNpbmd1bGFyaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gd29yZAorICAgICovCisg
ICAgc2luZ3VsYXJpemU6IGZ1bmN0aW9uIHNpbmd1bGFyaXplKHdvcmQpIHsKKyAgICAgIHJldHVy
biB0aGlzLl9zaW5ndWxhcml6ZSh3b3JkKTsKKyAgICB9LAorCisgICAgX3Npbmd1bGFyaXplOiBm
dW5jdGlvbiBfc2luZ3VsYXJpemUod29yZCkgeworICAgICAgcmV0dXJuIHRoaXMuaW5mbGVjdCh3
b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCB0aGlzLnJ1bGVzLmlycmVndWxhckludmVyc2UpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcm90ZWN0ZWQKKyAgICAgICBAbWV0aG9kIGluZmxl
Y3QKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCisgICAgICBAcGFyYW0ge09iamVjdH0gdHlw
ZVJ1bGVzCisgICAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFyCisgICAgKi8KKyAgICBpbmZs
ZWN0OiBmdW5jdGlvbiBpbmZsZWN0KHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7CisgICAg
ICB2YXIgaW5mbGVjdGlvbiwgc3Vic3RpdHV0aW9uLCByZXN1bHQsIGxvd2VyY2FzZSwgd29yZFNw
bGl0LCBmaXJzdFBocmFzZSwgbGFzdFdvcmQsIGlzQmxhbmssIGlzQ2FtZWxpemVkLCBydWxlLCBp
c1VuY291bnRhYmxlOworCisgICAgICBpc0JsYW5rID0gIXdvcmQgfHwgQkxBTktfUkVHRVgudGVz
dCh3b3JkKTsKKworICAgICAgaXNDYW1lbGl6ZWQgPSBDQU1FTElaRURfUkVHRVgudGVzdCh3b3Jk
KTsKKyAgICAgIGZpcnN0UGhyYXNlID0gIiI7CisKKyAgICAgIGlmIChpc0JsYW5rKSB7CisgICAg
ICAgIHJldHVybiB3b3JkOworICAgICAgfQorCisgICAgICBsb3dlcmNhc2UgPSB3b3JkLnRvTG93
ZXJDYXNlKCk7CisgICAgICB3b3JkU3BsaXQgPSBMQVNUX1dPUkRfREFTSEVEX1JFR0VYLmV4ZWMo
d29yZCkgfHwgTEFTVF9XT1JEX0NBTUVMSVpFRF9SRUdFWC5leGVjKHdvcmQpOworCisgICAgICBp
ZiAod29yZFNwbGl0KSB7CisgICAgICAgIGZpcnN0UGhyYXNlID0gd29yZFNwbGl0WzFdOworICAg
ICAgICBsYXN0V29yZCA9IHdvcmRTcGxpdFsyXS50b0xvd2VyQ2FzZSgpOworICAgICAgfQorCisg
ICAgICBpc1VuY291bnRhYmxlID0gdGhpcy5ydWxlcy51bmNvdW50YWJsZVtsb3dlcmNhc2VdIHx8
IHRoaXMucnVsZXMudW5jb3VudGFibGVbbGFzdFdvcmRdOworCisgICAgICBpZiAoaXNVbmNvdW50
YWJsZSkgeworICAgICAgICByZXR1cm4gd29yZDsKKyAgICAgIH0KKworICAgICAgZm9yIChydWxl
IGluIHRoaXMucnVsZXMuaXJyZWd1bGFyKSB7CisgICAgICAgIGlmIChsb3dlcmNhc2UubWF0Y2go
cnVsZSArICIkIikpIHsKKyAgICAgICAgICBzdWJzdGl0dXRpb24gPSBpcnJlZ3VsYXJbcnVsZV07
CisKKyAgICAgICAgICBpZiAoaXNDYW1lbGl6ZWQgJiYgaXJyZWd1bGFyW2xhc3RXb3JkXSkgewor
ICAgICAgICAgICAgc3Vic3RpdHV0aW9uID0gY2FwaXRhbGl6ZShzdWJzdGl0dXRpb24pOworICAg
ICAgICAgICAgcnVsZSA9IGNhcGl0YWxpemUocnVsZSk7CisgICAgICAgICAgfQorCisgICAgICAg
ICAgcmV0dXJuIHdvcmQucmVwbGFjZShydWxlLCBzdWJzdGl0dXRpb24pOworICAgICAgICB9Cisg
ICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSB0eXBlUnVsZXMubGVuZ3RoLCBtaW4gPSAwOyBp
ID4gbWluOyBpLS0pIHsKKyAgICAgICAgaW5mbGVjdGlvbiA9IHR5cGVSdWxlc1tpIC0gMV07Cisg
ICAgICAgIHJ1bGUgPSBpbmZsZWN0aW9uWzBdOworCisgICAgICAgIGlmIChydWxlLnRlc3Qod29y
ZCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmZs
ZWN0aW9uID0gaW5mbGVjdGlvbiB8fCBbXTsKKworICAgICAgcnVsZSA9IGluZmxlY3Rpb25bMF07
CisgICAgICBzdWJzdGl0dXRpb24gPSBpbmZsZWN0aW9uWzFdOworCisgICAgICByZXN1bHQgPSB3
b3JkLnJlcGxhY2UocnVsZSwgc3Vic3RpdHV0aW9uKTsKKworICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgIH07CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gSW5mbGVjdG9yOworfSk7Citk
ZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL3N0cmluZycsIFsnZXhwb3J0cycsICdl
bWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9pbmZsZWN0b3InXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3RvcikgeworICAndXNlIHN0cmljdCc7CisK
KyAgZnVuY3Rpb24gcGx1cmFsaXplKHdvcmQpIHsKKyAgICByZXR1cm4gX2VtYmVySW5mbGVjdG9y
TGliU3lzdGVtSW5mbGVjdG9yWydkZWZhdWx0J10uaW5mbGVjdG9yLnBsdXJhbGl6ZSh3b3JkKTsK
KyAgfQorCisgIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHdvcmQpIHsKKyAgICByZXR1cm4gX2VtYmVy
SW5mbGVjdG9yTGliU3lzdGVtSW5mbGVjdG9yWydkZWZhdWx0J10uaW5mbGVjdG9yLnNpbmd1bGFy
aXplKHdvcmQpOworICB9CisKKyAgZXhwb3J0cy5wbHVyYWxpemUgPSBwbHVyYWxpemU7CisgIGV4
cG9ydHMuc2luZ3VsYXJpemUgPSBzaW5ndWxhcml6ZTsKK30pOworZGVmaW5lKCdlbWJlci1pbmZs
ZWN0b3IvbGliL3V0aWxzL21ha2UtaGVscGVyJywgWydleHBvcnRzJywgJ2VtYmVyJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHNbJ2Rl
ZmF1bHQnXSA9IG1ha2VIZWxwZXI7CisKKyAgZnVuY3Rpb24gbWFrZUhlbHBlcihoZWxwZXJGdW5j
dGlvbikgeworICAgIGlmIChfZW1iZXJbJ2RlZmF1bHQnXS5IZWxwZXIpIHsKKyAgICAgIHJldHVy
biBfZW1iZXJbJ2RlZmF1bHQnXS5IZWxwZXIuaGVscGVyKGhlbHBlckZ1bmN0aW9uKTsKKyAgICB9
CisgICAgaWYgKF9lbWJlclsnZGVmYXVsdCddLkhUTUxCYXJzKSB7CisgICAgICByZXR1cm4gX2Vt
YmVyWydkZWZhdWx0J10uSFRNTEJhcnMubWFrZUJvdW5kSGVscGVyKGhlbHBlckZ1bmN0aW9uKTsK
KyAgICB9CisgICAgcmV0dXJuIF9lbWJlclsnZGVmYXVsdCddLkhhbmRsZWJhcnMubWFrZUJvdW5k
SGVscGVyKGhlbHBlckZ1bmN0aW9uKTsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVyLWxvYWQtaW5p
dGlhbGl6ZXJzL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1
bmN0aW9uIChhcHAsIHByZWZpeCkgeworICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsg
cHJlZml4ICsgJ1wvKCg/Omluc3RhbmNlLSk/aW5pdGlhbGl6ZXJzKVwvJyk7CisgICAgdmFyIGdl
dEtleXMgPSBPYmplY3Qua2V5cyB8fCBfZW1iZXJbJ2RlZmF1bHQnXS5rZXlzOworCisgICAgZ2V0
S2V5cyhyZXF1aXJlanMuX2Vha19zZWVuKS5tYXAoZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKKyAg
ICAgIHJldHVybiB7CisgICAgICAgIG1vZHVsZU5hbWU6IG1vZHVsZU5hbWUsCisgICAgICAgIG1h
dGNoZXM6IHJlZ2V4LmV4ZWMobW9kdWxlTmFtZSkKKyAgICAgIH07CisgICAgfSkuZmlsdGVyKGZ1
bmN0aW9uIChkZXApIHsKKyAgICAgIHJldHVybiBkZXAubWF0Y2hlcyAmJiBkZXAubWF0Y2hlcy5s
ZW5ndGggPT09IDI7CisgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7CisgICAgICB2YXIg
bW9kdWxlTmFtZSA9IGRlcC5tb2R1bGVOYW1lOworCisgICAgICB2YXIgbW9kdWxlID0gcmVxdWly
ZShtb2R1bGVOYW1lLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgIGlmICghbW9kdWxlKSB7Cisg
ICAgICAgIHRocm93IG5ldyBFcnJvcihtb2R1bGVOYW1lICsgJyBtdXN0IGV4cG9ydCBhbiBpbml0
aWFsaXplci4nKTsKKyAgICAgIH0KKworICAgICAgdmFyIGluaXRpYWxpemVyVHlwZSA9IF9lbWJl
clsnZGVmYXVsdCddLlN0cmluZy5jYW1lbGl6ZShkZXAubWF0Y2hlc1sxXS5zdWJzdHJpbmcoMCwg
ZGVwLm1hdGNoZXNbMV0ubGVuZ3RoIC0gMSkpOworICAgICAgdmFyIGluaXRpYWxpemVyID0gbW9k
dWxlWydkZWZhdWx0J107CisgICAgICBpZiAoIWluaXRpYWxpemVyLm5hbWUpIHsKKyAgICAgICAg
dmFyIGluaXRpYWxpemVyTmFtZSA9IG1vZHVsZU5hbWUubWF0Y2goL1teXC9dK1wvPyQvKVswXTsK
KyAgICAgICAgaW5pdGlhbGl6ZXIubmFtZSA9IGluaXRpYWxpemVyTmFtZTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKGFwcFtpbml0aWFsaXplclR5cGVdKSB7CisgICAgICAgIGFwcFtpbml0aWFsaXpl
clR5cGVdKGluaXRpYWxpemVyKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfTsKK30pOworZGVmaW5l
KCdlbWJlci1yZXNvbHZlci9jb250YWluZXItZGVidWctYWRhcHRlcicsIFsnZXhwb3J0cycsICdl
bWJlcicsICdlbWJlci1yZXNvbHZlci91dGlscy9tb2R1bGUtcmVnaXN0cnknXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlciwgX2VtYmVyUmVzb2x2ZXJVdGlsc01vZHVsZVJlZ2lzdHJ5KSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICB2YXIgQ29udGFpbmVyRGVidWdBZGFwdGVyID0gX2VtYmVyWydk
ZWZhdWx0J10uQ29udGFpbmVyRGVidWdBZGFwdGVyOworCisgIHZhciBNb2R1bGVzQ29udGFpbmVy
RGVidWdBZGFwdGVyID0gbnVsbDsKKworICBmdW5jdGlvbiBnZXRQb2QodHlwZSwga2V5LCBwcmVm
aXgpIHsKKyAgICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2gobmV3IFJlZ0V4cCgnXi8/JyArIHByZWZp
eCArICcvKC4rKS8nICsgdHlwZSArICckJykpOworICAgIGlmIChtYXRjaCkgeworICAgICAgcmV0
dXJuIG1hdGNoWzFdOworICAgIH0KKyAgfQorCisgIC8vIFN1cHBvcnQgRW1iZXIgPCAxLjUtYmV0
YS40CisgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGFmdGVyIDEuNS4wIGlzIHJlbGVhc2VkCisgIGlm
ICh0eXBlb2YgQ29udGFpbmVyRGVidWdBZGFwdGVyICE9PSAndW5kZWZpbmVkJykgeworCisgICAg
LyoKKyAgICAgKiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgc3ViY2xhc3Mgb2YgRW1iZXIuQ29udGFp
bmVyRGVidWdBZGFwdGVyIHRoYXQgYWRkcyB0d28KKyAgICAgKiBpbXBvcnRhbnQgZmVhdHVyZXM6
CisgICAgICoKKyAgICAgKiAgMSkgaXMgYWJsZSBwcm92aWRlIGluamVjdGlvbnMgdG8gY2xhc3Nl
cyB0aGF0IGltcGxlbWVudCBgZXh0ZW5kYAorICAgICAqICAgICAoYXMgaXMgdHlwaWNhbCB3aXRo
IEVtYmVyKS4KKyAgICAgKi8KKworICAgIE1vZHVsZXNDb250YWluZXJEZWJ1Z0FkYXB0ZXIgPSBD
b250YWluZXJEZWJ1Z0FkYXB0ZXIuZXh0ZW5kKHsKKyAgICAgIF9tb2R1bGVSZWdpc3RyeTogbnVs
bCwKKworICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHsKKyAgICAgICAgdGhpcy5fc3VwZXIu
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgICBpZiAoIXRoaXMuX21vZHVsZVJlZ2lz
dHJ5KSB7CisgICAgICAgICAgdGhpcy5fbW9kdWxlUmVnaXN0cnkgPSBuZXcgX2VtYmVyUmVzb2x2
ZXJVdGlsc01vZHVsZVJlZ2lzdHJ5WydkZWZhdWx0J10oKTsKKyAgICAgICAgfQorICAgICAgfSwK
KworICAgICAgLyoqCisgICAgICAgIFRoZSBjb250YWluZXIgb2YgdGhlIGFwcGxpY2F0aW9uIGJl
aW5nIGRlYnVnZ2VkLgorICAgICAgICBUaGlzIHByb3BlcnR5IHdpbGwgYmUgaW5qZWN0ZWQKKyAg
ICAgICAgb24gY3JlYXRpb24uCisgICAgICAgICBAcHJvcGVydHkgY29udGFpbmVyCisgICAgICAg
IEBkZWZhdWx0IG51bGwKKyAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICBUaGUgcmVzb2x2
ZXIgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIGJlaW5nIGRlYnVnZ2VkLiBU
aGlzIHByb3BlcnR5IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICAgICAgb24gY3JlYXRpb24uCisgICAg
ICAgICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgKi8K
KworICAgICAgLyoqCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBj
YXRhbG9nIGEgbGlzdCBvZiBhdmFpbGFibGUKKyAgICAgICAgY2xhc3NlcyBpbiB0aGUgcmVzb2x2
ZXIgZm9yIGEgZ2l2ZW4gdHlwZS4KKyAgICAgICAgIEBtZXRob2QgY2FuQ2F0YWxvZ0VudHJpZXNC
eVR5cGUKKyAgICAgICAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUuIGUuZy4gIm1vZGVs
IiwgImNvbnRyb2xsZXIiLCAicm91dGUiCisgICAgICAgIEByZXR1cm4ge2Jvb2xlYW59IHdoZXRo
ZXIgYSBsaXN0IGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlLgorICAgICAgKi8KKyAgICAgIGNh
bkNhdGFsb2dFbnRyaWVzQnlUeXBlOiBmdW5jdGlvbiBjYW5DYXRhbG9nRW50cmllc0J5VHlwZSgp
IC8qIHR5cGUgKi97CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKworICAgICAgLyoq
CisgICAgICAgIFJldHVybnMgdGhlIGF2YWlsYWJsZSBjbGFzc2VzIGEgZ2l2ZW4gdHlwZS4KKyAg
ICAgICAgIEBtZXRob2QgY2F0YWxvZ0VudHJpZXNCeVR5cGUKKyAgICAgICAgQHBhcmFtIHtzdHJp
bmd9IHR5cGUgVGhlIHR5cGUuIGUuZy4gIm1vZGVsIiwgImNvbnRyb2xsZXIiLCAicm91dGUiCisg
ICAgICAgIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjbGFzc2VzLgorICAgICAgKi8KKyAg
ICAgIGNhdGFsb2dFbnRyaWVzQnlUeXBlOiBmdW5jdGlvbiBjYXRhbG9nRW50cmllc0J5VHlwZSh0
eXBlKSB7CisgICAgICAgIHZhciBtb2R1bGVOYW1lcyA9IHRoaXMuX21vZHVsZVJlZ2lzdHJ5Lm1v
ZHVsZU5hbWVzKCk7CisgICAgICAgIHZhciB0eXBlcyA9IF9lbWJlclsnZGVmYXVsdCddLkEoKTsK
KworICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5uYW1lc3BhY2UubW9kdWxlUHJlZml4OworCisg
ICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9kdWxlTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICAgICAgdmFyIGtleSA9IG1vZHVsZU5hbWVzW2ldOworCisgICAgICAgICAgaWYg
KGtleS5pbmRleE9mKHR5cGUpICE9PSAtMSkgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQn
cyBhIHBvZCBtb2R1bGUKKyAgICAgICAgICAgIHZhciBuYW1lID0gZ2V0UG9kKHR5cGUsIGtleSwg
dGhpcy5uYW1lc3BhY2UucG9kTW9kdWxlUHJlZml4IHx8IHByZWZpeCk7CisgICAgICAgICAgICBp
ZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgLy8gTm90IHBvZAorICAgICAgICAgICAgICBuYW1l
ID0ga2V5LnNwbGl0KHR5cGUgKyAncy8nKS5wb3AoKTsKKworICAgICAgICAgICAgICAvLyBTdXBw
b3J0IGZvciBkaWZmZXJlbnQgcHJlZml4IChzdWNoIGFzIGVtYmVyLWNsaSBhZGRvbnMpLgorICAg
ICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhlIGNvZGUgYmVsb3cgd2hlbgorICAgICAgICAgICAg
ICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1iZXItY2xpL2VtYmVyLXJlc29sdmVyL3B1bGwvODAg
aXMgbWVyZ2VkLgorCisgICAgICAgICAgICAgIC8vdmFyIG1hdGNoID0ga2V5Lm1hdGNoKCdeLz8o
LispLycgKyB0eXBlKTsKKyAgICAgICAgICAgICAgLy9pZiAobWF0Y2ggJiYgbWF0Y2hbMV0gIT09
IHByZWZpeCkgeworICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgcHJlZml4IHN1Y2ggYXMgYW4g
YWRkb24KKyAgICAgICAgICAgICAgLy9uYW1lID0gbWF0Y2hbMV0gKyAnQCcgKyBuYW1lOworICAg
ICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGVzLmFkZE9iamVj
dChuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVzOwor
ICAgICAgfQorICAgIH0pOworICB9CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gTW9kdWxlc0Nv
bnRhaW5lckRlYnVnQWRhcHRlcjsKK30pOworZGVmaW5lKCdlbWJlci1yZXNvbHZlci9pbmRleCcs
IFsnZXhwb3J0cycsICdlbWJlci1yZXNvbHZlci9yZXNvbHZlciddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyUmVzb2x2ZXJSZXNvbHZlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgT2JqZWN0
LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdkZWZhdWx0JywgeworICAgIGVudW1lcmFibGU6IHRy
dWUsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUmVzb2x2
ZXJSZXNvbHZlclsnZGVmYXVsdCddOworICAgIH0KKyAgfSk7Cit9KTsKK2RlZmluZSgnZW1iZXIt
cmVzb2x2ZXIvcmVzb2x2ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXInLCAnZW1iZXItcmVzb2x2ZXIv
dXRpbHMvbW9kdWxlLXJlZ2lzdHJ5JywgJ2VtYmVyLXJlc29sdmVyL3V0aWxzL2NsYXNzLWZhY3Rv
cnknLCAnZW1iZXItcmVzb2x2ZXIvdXRpbHMvbWFrZS1kaWN0aW9uYXJ5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXIsIF9lbWJlclJlc29sdmVyVXRpbHNNb2R1bGVSZWdpc3RyeSwgX2VtYmVy
UmVzb2x2ZXJVdGlsc0NsYXNzRmFjdG9yeSwgX2VtYmVyUmVzb2x2ZXJVdGlsc01ha2VEaWN0aW9u
YXJ5KSB7CisgIC8qZ2xvYmFscyByZXF1aXJlICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
CisgICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBzdWJjbGFzcyBvZiBFbWJlci5EZWZhdWx0UmVz
b2x2ZXIgdGhhdCBhZGRzIHR3bworICAgKiBpbXBvcnRhbnQgZmVhdHVyZXM6CisgICAqCisgICAq
ICAxKSBUaGUgcmVzb2x2ZXIgbWFrZXMgdGhlIGNvbnRhaW5lciBhd2FyZSBvZiBlczYgbW9kdWxl
cyB2aWEgdGhlIEFNRAorICAgKiAgICAgb3V0cHV0LiBUaGUgbG9hZGVyJ3MgX21vZHVsZUVudHJp
ZXMgaXMgY29uc3VsdGVkIHNvIHRoYXQgY2xhc3NlcyBjYW4gYmUKKyAgICogICAgIHJlc29sdmVk
IGRpcmVjdGx5IHZpYSB0aGUgbW9kdWxlIGxvYWRlciwgd2l0aG91dCBuZWVkaW5nIGEgbWFudWFs
CisgICAqICAgICBgaW1wb3J0YC4KKyAgICogIDIpIGlzIGFibGUgdG8gcHJvdmlkZSBpbmplY3Rp
b25zIHRvIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYGV4dGVuZGAKKyAgICogICAgIChhcyBpcyB0
eXBpY2FsIHdpdGggRW1iZXIpLgorICAgKi8KKworICB2YXIgX0VtYmVyJFN0cmluZyA9IF9lbWJl
clsnZGVmYXVsdCddLlN0cmluZzsKKyAgdmFyIHVuZGVyc2NvcmUgPSBfRW1iZXIkU3RyaW5nLnVu
ZGVyc2NvcmU7CisgIHZhciBjbGFzc2lmeSA9IF9FbWJlciRTdHJpbmcuY2xhc3NpZnk7CisgIHZh
ciBkYXNoZXJpemUgPSBfRW1iZXIkU3RyaW5nLmRhc2hlcml6ZTsKKyAgdmFyIGdldCA9IF9lbWJl
clsnZGVmYXVsdCddLmdldDsKKyAgdmFyIERlZmF1bHRSZXNvbHZlciA9IF9lbWJlclsnZGVmYXVs
dCddLkRlZmF1bHRSZXNvbHZlcjsKKworICBmdW5jdGlvbiBwYXJzZU5hbWUoZnVsbE5hbWUpIHsK
KyAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLworCisgICAgaWYgKGZ1bGxOYW1lLnBhcnNl
ZE5hbWUgPT09IHRydWUpIHsKKyAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICB9CisKKyAgICB2
YXIgcHJlZml4LCB0eXBlLCBuYW1lOworICAgIHZhciBmdWxsTmFtZVBhcnRzID0gZnVsbE5hbWUu
c3BsaXQoJ0AnKTsKKworICAgIC8vIEhUTUxCYXJzIHVzZXMgaGVscGVyOkBjb250ZW50LWhlbHBl
ciB3aGljaCBjb2xsaWRlcworICAgIC8vIHdpdGggZW1iZXItY2xpIG5hbWVzcGFjZSBkZXRlY3Rp
b24uCisgICAgLy8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSBvZiBI
VE1MQmFycy4KKyAgICBpZiAoZnVsbE5hbWUgIT09ICdoZWxwZXI6QGNvbnRlbnQtaGVscGVyJyAm
JiBmdWxsTmFtZVBhcnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgdmFyIHByZWZpeFBhcnRzID0g
ZnVsbE5hbWVQYXJ0c1swXS5zcGxpdCgnOicpOworCisgICAgICBpZiAocHJlZml4UGFydHMubGVu
Z3RoID09PSAyKSB7CisgICAgICAgIHByZWZpeCA9IHByZWZpeFBhcnRzWzFdOworICAgICAgICB0
eXBlID0gcHJlZml4UGFydHNbMF07CisgICAgICAgIG5hbWUgPSBmdWxsTmFtZVBhcnRzWzFdOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IGZ1bGxOYW1lUGFydHNbMV0u
c3BsaXQoJzonKTsKKworICAgICAgICBwcmVmaXggPSBmdWxsTmFtZVBhcnRzWzBdOworICAgICAg
ICB0eXBlID0gbmFtZVBhcnRzWzBdOworICAgICAgICBuYW1lID0gbmFtZVBhcnRzWzFdOworICAg
ICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmdWxsTmFtZVBhcnRzID0gZnVsbE5hbWUuc3BsaXQo
JzonKTsKKyAgICAgIHR5cGUgPSBmdWxsTmFtZVBhcnRzWzBdOworICAgICAgbmFtZSA9IGZ1bGxO
YW1lUGFydHNbMV07CisgICAgfQorCisgICAgdmFyIGZ1bGxOYW1lV2l0aG91dFR5cGUgPSBuYW1l
OworICAgIHZhciBuYW1lc3BhY2UgPSBnZXQodGhpcywgJ25hbWVzcGFjZScpOworICAgIHZhciBy
b290ID0gbmFtZXNwYWNlOworCisgICAgcmV0dXJuIHsKKyAgICAgIHBhcnNlZE5hbWU6IHRydWUs
CisgICAgICBmdWxsTmFtZTogZnVsbE5hbWUsCisgICAgICBwcmVmaXg6IHByZWZpeCB8fCB0aGlz
LnByZWZpeCh7IHR5cGU6IHR5cGUgfSksCisgICAgICB0eXBlOiB0eXBlLAorICAgICAgZnVsbE5h
bWVXaXRob3V0VHlwZTogZnVsbE5hbWVXaXRob3V0VHlwZSwKKyAgICAgIG5hbWU6IG5hbWUsCisg
ICAgICByb290OiByb290LAorICAgICAgcmVzb2x2ZU1ldGhvZE5hbWU6ICJyZXNvbHZlIiArIGNs
YXNzaWZ5KHR5cGUpCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlc29sdmVPdGhlcihwYXJz
ZWROYW1lKSB7CisgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KKworICAgIF9lbWJlclsn
ZGVmYXVsdCddLmFzc2VydCgnYG1vZHVsZVByZWZpeGAgbXVzdCBiZSBkZWZpbmVkJywgdGhpcy5u
YW1lc3BhY2UubW9kdWxlUHJlZml4KTsKKworICAgIHZhciBub3JtYWxpemVkTW9kdWxlTmFtZSA9
IHRoaXMuZmluZE1vZHVsZU5hbWUocGFyc2VkTmFtZSk7CisKKyAgICBpZiAobm9ybWFsaXplZE1v
ZHVsZU5hbWUpIHsKKyAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gdGhpcy5fZXh0cmFjdERlZmF1
bHRFeHBvcnQobm9ybWFsaXplZE1vZHVsZU5hbWUsIHBhcnNlZE5hbWUpOworCisgICAgICBpZiAo
ZGVmYXVsdEV4cG9ydCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
IEV4cGVjdGVkIHRvIGZpbmQ6ICciICsgcGFyc2VkTmFtZS5mdWxsTmFtZSArICInIHdpdGhpbiAn
IiArIG5vcm1hbGl6ZWRNb2R1bGVOYW1lICsgIicgYnV0IGdvdCAndW5kZWZpbmVkJy4gRGlkIHlv
dSBmb3JnZXQgdG8gYGV4cG9ydCBkZWZhdWx0YCB3aXRoaW4gJyIgKyBub3JtYWxpemVkTW9kdWxl
TmFtZSArICInPyIpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5zaG91bGRXcmFwSW5DbGFz
c0ZhY3RvcnkoZGVmYXVsdEV4cG9ydCwgcGFyc2VkTmFtZSkpIHsKKyAgICAgICAgZGVmYXVsdEV4
cG9ydCA9ICgwLCBfZW1iZXJSZXNvbHZlclV0aWxzQ2xhc3NGYWN0b3J5WydkZWZhdWx0J10pKGRl
ZmF1bHRFeHBvcnQpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVmYXVsdEV4cG9ydDsKKyAg
ICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHBhcnNlZE5hbWUpOworICAgIH0K
KyAgfQorCisgIC8vIEVtYmVyLkRlZmF1bHRSZXNvbHZlciBkb2NzOgorICAvLyAgIGh0dHBzOi8v
Z2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2VtYmVyLWFw
cGxpY2F0aW9uL2xpYi9zeXN0ZW0vcmVzb2x2ZXIuanMKKyAgdmFyIFJlc29sdmVyID0gRGVmYXVs
dFJlc29sdmVyLmV4dGVuZCh7CisgICAgcmVzb2x2ZU90aGVyOiByZXNvbHZlT3RoZXIsCisgICAg
cGFyc2VOYW1lOiBwYXJzZU5hbWUsCisgICAgcmVzb2x2ZVRlbXBsYXRlOiByZXNvbHZlT3RoZXIs
CisgICAgcGx1cmFsaXplZFR5cGVzOiBudWxsLAorICAgIG1vZHVsZVJlZ2lzdHJ5OiBudWxsLAor
CisgICAgbWFrZVRvU3RyaW5nOiBmdW5jdGlvbiBtYWtlVG9TdHJpbmcoZmFjdG9yeSwgZnVsbE5h
bWUpIHsKKyAgICAgIHJldHVybiAnJyArIHRoaXMubmFtZXNwYWNlLm1vZHVsZVByZWZpeCArICdA
JyArIGZ1bGxOYW1lICsgJzonOworICAgIH0sCisKKyAgICBzaG91bGRXcmFwSW5DbGFzc0ZhY3Rv
cnk6IGZ1bmN0aW9uIHNob3VsZFdyYXBJbkNsYXNzRmFjdG9yeSgpIC8qIG1vZHVsZSwgcGFyc2Vk
TmFtZSAqL3sKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgaW5pdDogZnVuY3Rp
b24gaW5pdCgpIHsKKyAgICAgIHRoaXMuX3N1cGVyKCk7CisgICAgICB0aGlzLm1vZHVsZUJhc2Vk
UmVzb2x2ZXIgPSB0cnVlOworCisgICAgICBpZiAoIXRoaXMuX21vZHVsZVJlZ2lzdHJ5KSB7Cisg
ICAgICAgIHRoaXMuX21vZHVsZVJlZ2lzdHJ5ID0gbmV3IF9lbWJlclJlc29sdmVyVXRpbHNNb2R1
bGVSZWdpc3RyeVsnZGVmYXVsdCddKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX25vcm1hbGl6
ZUNhY2hlID0gKDAsIF9lbWJlclJlc29sdmVyVXRpbHNNYWtlRGljdGlvbmFyeVsnZGVmYXVsdCdd
KSgpOworCisgICAgICB0aGlzLnBsdXJhbGl6ZWRUeXBlcyA9IHRoaXMucGx1cmFsaXplZFR5cGVz
IHx8ICgwLCBfZW1iZXJSZXNvbHZlclV0aWxzTWFrZURpY3Rpb25hcnlbJ2RlZmF1bHQnXSkoKTsK
KworICAgICAgaWYgKCF0aGlzLnBsdXJhbGl6ZWRUeXBlcy5jb25maWcpIHsKKyAgICAgICAgdGhp
cy5wbHVyYWxpemVkVHlwZXMuY29uZmlnID0gJ2NvbmZpZyc7CisgICAgICB9CisgICAgICB0aGlz
Ll9kZXByZWNhdGVkUG9kTW9kdWxlUHJlZml4ID0gZmFsc2U7CisgICAgfSwKKworICAgIG5vcm1h
bGl6ZTogZnVuY3Rpb24gbm9ybWFsaXplKGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5f
bm9ybWFsaXplQ2FjaGVbZnVsbE5hbWVdIHx8ICh0aGlzLl9ub3JtYWxpemVDYWNoZVtmdWxsTmFt
ZV0gPSB0aGlzLl9ub3JtYWxpemUoZnVsbE5hbWUpKTsKKyAgICB9LAorCisgICAgX25vcm1hbGl6
ZTogZnVuY3Rpb24gX25vcm1hbGl6ZShmdWxsTmFtZSkgeworICAgICAgLy8gQSkgQ29udmVydCB1
bmRlcnNjb3JlcyB0byBkYXNoZXMKKyAgICAgIC8vIEIpIENvbnZlcnQgY2FtZWxDYXNlIHRvIGRh
c2gtY2FzZSwgZXhjZXB0IGZvciBoZWxwZXJzIHdoZXJlIHdlIHdhbnQgdG8gYXZvaWQgc2hhZG93
aW5nIGNhbWVsQ2FzZSBleHByZXNzaW9ucworICAgICAgLy8gQykgcmVwbGFjZSBgLmAgd2l0aCBg
L2AgaW4gb3JkZXIgdG8gbWFrZSBuZXN0ZWQgY29udHJvbGxlcnMgd29yayBpbiB0aGUgZm9sbG93
aW5nIGNhc2VzCisgICAgICAvLyAgICAgIDEuIGBuZWVkczogWydwb3N0cy9wb3N0J11gCisgICAg
ICAvLyAgICAgIDIuIGB7e3JlbmRlciAicG9zdHMvcG9zdCJ9fWAKKyAgICAgIC8vICAgICAgMy4g
YHRoaXMucmVuZGVyKCdwb3N0cy9wb3N0JylgIGZyb20gUm91dGUKKworICAgICAgdmFyIHNwbGl0
ID0gZnVsbE5hbWUuc3BsaXQoJzonKTsKKyAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7Cisg
ICAgICAgIGlmIChzcGxpdFswXSA9PT0gJ2hlbHBlcicpIHsKKyAgICAgICAgICByZXR1cm4gc3Bs
aXRbMF0gKyAnOicgKyBzcGxpdFsxXS5yZXBsYWNlKC9fL2csICctJyk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgcmV0dXJuIHNwbGl0WzBdICsgJzonICsgZGFzaGVyaXplKHNwbGl0WzFd
LnJlcGxhY2UoL1wuL2csICcvJykpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4gZnVsbE5hbWU7CisgICAgICB9CisgICAgfSwKKworICAgIHBsdXJhbGl6ZTogZnVu
Y3Rpb24gcGx1cmFsaXplKHR5cGUpIHsKKyAgICAgIHJldHVybiB0aGlzLnBsdXJhbGl6ZWRUeXBl
c1t0eXBlXSB8fCAodGhpcy5wbHVyYWxpemVkVHlwZXNbdHlwZV0gPSB0eXBlICsgJ3MnKTsKKyAg
ICB9LAorCisgICAgcG9kQmFzZWRMb29rdXBXaXRoUHJlZml4OiBmdW5jdGlvbiBwb2RCYXNlZExv
b2t1cFdpdGhQcmVmaXgocG9kUHJlZml4LCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgZnVsbE5h
bWVXaXRob3V0VHlwZSA9IHBhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZTsKKworICAgICAg
aWYgKHBhcnNlZE5hbWUudHlwZSA9PT0gJ3RlbXBsYXRlJykgeworICAgICAgICBmdWxsTmFtZVdp
dGhvdXRUeXBlID0gZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9eY29tcG9uZW50c1wvLywg
JycpOworICAgICAgfQorCisgICAgICByZXR1cm4gcG9kUHJlZml4ICsgJy8nICsgZnVsbE5hbWVX
aXRob3V0VHlwZSArICcvJyArIHBhcnNlZE5hbWUudHlwZTsKKyAgICB9LAorCisgICAgcG9kQmFz
ZWRNb2R1bGVOYW1lOiBmdW5jdGlvbiBwb2RCYXNlZE1vZHVsZU5hbWUocGFyc2VkTmFtZSkgewor
ICAgICAgdmFyIHBvZFByZWZpeCA9IHRoaXMubmFtZXNwYWNlLnBvZE1vZHVsZVByZWZpeCB8fCB0
aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7CisKKyAgICAgIHJldHVybiB0aGlzLnBvZEJhc2Vk
TG9va3VwV2l0aFByZWZpeChwb2RQcmVmaXgsIHBhcnNlZE5hbWUpOworICAgIH0sCisKKyAgICBw
b2RCYXNlZENvbXBvbmVudHNJblN1YmRpcjogZnVuY3Rpb24gcG9kQmFzZWRDb21wb25lbnRzSW5T
dWJkaXIocGFyc2VkTmFtZSkgeworICAgICAgdmFyIHBvZFByZWZpeCA9IHRoaXMubmFtZXNwYWNl
LnBvZE1vZHVsZVByZWZpeCB8fCB0aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7CisgICAgICBw
b2RQcmVmaXggPSBwb2RQcmVmaXggKyAnL2NvbXBvbmVudHMnOworCisgICAgICBpZiAocGFyc2Vk
TmFtZS50eXBlID09PSAnY29tcG9uZW50JyB8fCBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5
cGUubWF0Y2goL15jb21wb25lbnRzLykpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucG9kQmFzZWRM
b29rdXBXaXRoUHJlZml4KHBvZFByZWZpeCwgcGFyc2VkTmFtZSk7CisgICAgICB9CisgICAgfSwK
KworICAgIHJlc29sdmVFbmdpbmU6IGZ1bmN0aW9uIHJlc29sdmVFbmdpbmUocGFyc2VkTmFtZSkg
eworICAgICAgdmFyIGVuZ2luZU5hbWUgPSBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5cGU7
CisgICAgICB2YXIgZW5naW5lTW9kdWxlID0gZW5naW5lTmFtZSArICcvZW5naW5lJzsKKworICAg
ICAgaWYgKHRoaXMuX21vZHVsZVJlZ2lzdHJ5LmhhcyhlbmdpbmVNb2R1bGUpKSB7CisgICAgICAg
IHJldHVybiB0aGlzLl9leHRyYWN0RGVmYXVsdEV4cG9ydChlbmdpbmVNb2R1bGUpOworICAgICAg
fQorICAgIH0sCisKKyAgICByZXNvbHZlUm91dGVNYXA6IGZ1bmN0aW9uIHJlc29sdmVSb3V0ZU1h
cChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgZW5naW5lTmFtZSA9IHBhcnNlZE5hbWUuZnVsbE5h
bWVXaXRob3V0VHlwZTsKKyAgICAgIHZhciBlbmdpbmVSb3V0ZXNNb2R1bGUgPSBlbmdpbmVOYW1l
ICsgJy9yb3V0ZXMnOworCisgICAgICBpZiAodGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKGVuZ2lu
ZVJvdXRlc01vZHVsZSkpIHsKKyAgICAgICAgdmFyIHJvdXRlTWFwID0gdGhpcy5fZXh0cmFjdERl
ZmF1bHRFeHBvcnQoZW5naW5lUm91dGVzTW9kdWxlKTsKKworICAgICAgICBfZW1iZXJbJ2RlZmF1
bHQnXS5hc3NlcnQoJ1RoZSByb3V0ZSBtYXAgZm9yICcgKyBlbmdpbmVOYW1lICsgJyBzaG91bGQg
YmUgd3JhcHBlZCBieSBcJ2J1aWxkUm91dGVzXCcgYmVmb3JlIGV4cG9ydGluZy4nLCByb3V0ZU1h
cC5pc1JvdXRlTWFwKTsKKworICAgICAgICByZXR1cm4gcm91dGVNYXA7CisgICAgICB9CisgICAg
fSwKKworICAgIG1haW5Nb2R1bGVOYW1lOiBmdW5jdGlvbiBtYWluTW9kdWxlTmFtZShwYXJzZWRO
YW1lKSB7CisgICAgICAvLyBpZiByb3V0ZXI6bWFpbiBvciBhZGFwdGVyOm1haW4gbG9vayBmb3Ig
YSBtb2R1bGUgd2l0aCBqdXN0IHRoZSB0eXBlIGZpcnN0CisgICAgICB2YXIgdG1wTW9kdWxlTmFt
ZSA9IHBhcnNlZE5hbWUucHJlZml4ICsgJy8nICsgcGFyc2VkTmFtZS50eXBlOworCisgICAgICBp
ZiAocGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlID09PSAnbWFpbicpIHsKKyAgICAgICAg
cmV0dXJuIHRtcE1vZHVsZU5hbWU7CisgICAgICB9CisgICAgfSwKKworICAgIGRlZmF1bHRNb2R1
bGVOYW1lOiBmdW5jdGlvbiBkZWZhdWx0TW9kdWxlTmFtZShwYXJzZWROYW1lKSB7CisgICAgICBy
ZXR1cm4gcGFyc2VkTmFtZS5wcmVmaXggKyAnLycgKyB0aGlzLnBsdXJhbGl6ZShwYXJzZWROYW1l
LnR5cGUpICsgJy8nICsgcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlOworICAgIH0sCisK
KyAgICBwcmVmaXg6IGZ1bmN0aW9uIHByZWZpeChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgdG1w
UHJlZml4ID0gdGhpcy5uYW1lc3BhY2UubW9kdWxlUHJlZml4OworCisgICAgICBpZiAodGhpcy5u
YW1lc3BhY2VbcGFyc2VkTmFtZS50eXBlICsgJ1ByZWZpeCddKSB7CisgICAgICAgIHRtcFByZWZp
eCA9IHRoaXMubmFtZXNwYWNlW3BhcnNlZE5hbWUudHlwZSArICdQcmVmaXgnXTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHRtcFByZWZpeDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBIGxp
c3Rpbmcgb2YgZnVuY3Rpb25zIHRvIHRlc3QgZm9yIG1vZHVsZU5hbWUncyBiYXNlZCBvbiB0aGUg
cHJvdmlkZWQKKyAgICAgYHBhcnNlZE5hbWVgLiBUaGlzIGFsbG93cyBlYXN5IGN1c3RvbWl6YXRp
b24gb2YgYWRkaXRpb25hbCBtb2R1bGUgYmFzZWQKKyAgICAgbG9va3VwIHBhdHRlcm5zLgorICAg
ICAgQHByb3BlcnR5IG1vZHVsZU5hbWVMb29rdXBQYXR0ZXJucworICAgICBAcmV0dXJucyB7RW1i
ZXIuQXJyYXl9CisgICAgICovCisgICAgbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zOiBfZW1iZXJb
J2RlZmF1bHQnXS5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gW3RoaXMucG9k
QmFzZWRNb2R1bGVOYW1lLCB0aGlzLnBvZEJhc2VkQ29tcG9uZW50c0luU3ViZGlyLCB0aGlzLm1h
aW5Nb2R1bGVOYW1lLCB0aGlzLmRlZmF1bHRNb2R1bGVOYW1lXTsKKyAgICB9KSwKKworICAgIGZp
bmRNb2R1bGVOYW1lOiBmdW5jdGlvbiBmaW5kTW9kdWxlTmFtZShwYXJzZWROYW1lLCBsb2dnaW5n
RGlzYWJsZWQpIHsKKyAgICAgIHZhciBtb2R1bGVOYW1lTG9va3VwUGF0dGVybnMgPSB0aGlzLmdl
dCgnbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zJyk7CisgICAgICB2YXIgbW9kdWxlTmFtZTsKKwor
ICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBfbGVuZ3RoID0gbW9kdWxlTmFtZUxvb2t1cFBhdHRl
cm5zLmxlbmd0aDsgaW5kZXggPCBfbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgIHZhciBpdGVt
ID0gbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zW2luZGV4XTsKKworICAgICAgICB2YXIgdG1wTW9k
dWxlTmFtZSA9IGl0ZW0uY2FsbCh0aGlzLCBwYXJzZWROYW1lKTsKKworICAgICAgICAvLyBhbGxv
dyB0cmVhdCBhbGwgZGFzaGVkIGFuZCBhbGwgdW5kZXJzY29yZWQgYXMgdGhlIHNhbWUgdGhpbmcK
KyAgICAgICAgLy8gc3VwcG9ydHMgY29tcG9uZW50cyB3aXRoIGRhc2hlcyBhbmQgb3RoZXIgc3R1
ZmYgd2l0aCB1bmRlcnNjb3Jlcy4KKyAgICAgICAgaWYgKHRtcE1vZHVsZU5hbWUpIHsKKyAgICAg
ICAgICB0bXBNb2R1bGVOYW1lID0gdGhpcy5jaG9vc2VNb2R1bGVOYW1lKHRtcE1vZHVsZU5hbWUs
IHBhcnNlZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRtcE1vZHVsZU5hbWUgJiYg
dGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKHRtcE1vZHVsZU5hbWUpKSB7CisgICAgICAgICAgbW9k
dWxlTmFtZSA9IHRtcE1vZHVsZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxvZ2dp
bmdEaXNhYmxlZCkgeworICAgICAgICAgIHRoaXMuX2xvZ0xvb2t1cChtb2R1bGVOYW1lLCBwYXJz
ZWROYW1lLCB0bXBNb2R1bGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2R1bGVO
YW1lKSB7CisgICAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWU7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9LAorCisgICAgY2hvb3NlTW9kdWxlTmFtZTogZnVuY3Rpb24gY2hvb3NlTW9kdWxlTmFt
ZShtb2R1bGVOYW1lLCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisg
ICAgICB2YXIgdW5kZXJzY29yZWRNb2R1bGVOYW1lID0gdW5kZXJzY29yZShtb2R1bGVOYW1lKTsK
KworICAgICAgaWYgKG1vZHVsZU5hbWUgIT09IHVuZGVyc2NvcmVkTW9kdWxlTmFtZSAmJiB0aGlz
Ll9tb2R1bGVSZWdpc3RyeS5oYXMobW9kdWxlTmFtZSkgJiYgdGhpcy5fbW9kdWxlUmVnaXN0cnku
aGFzKHVuZGVyc2NvcmVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJv
cigiQW1iaWd1b3VzIG1vZHVsZSBuYW1lczogYCIgKyBtb2R1bGVOYW1lICsgImAgYW5kIGAiICsg
dW5kZXJzY29yZWRNb2R1bGVOYW1lICsgImAiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMu
X21vZHVsZVJlZ2lzdHJ5Lmhhcyhtb2R1bGVOYW1lKSkgeworICAgICAgICByZXR1cm4gbW9kdWxl
TmFtZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKHVuZGVyc2Nv
cmVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVyc2NvcmVkTW9kdWxlTmFtZTsK
KyAgICAgIH0KKyAgICAgIC8vIHdvcmthcm91bmQgZm9yIGRhc2hlcml6ZWQgcGFydGlhbHM6Cisg
ICAgICAvLyBzb21ldGhpbmcvc29tZXRoaW5nLy1zb21ldGhpbmcgPT4gc29tZXRoaW5nL3NvbWV0
aGluZy9fc29tZXRoaW5nCisgICAgICB2YXIgcGFydGlhbGl6ZWRNb2R1bGVOYW1lID0gbW9kdWxl
TmFtZS5yZXBsYWNlKC9cLy0oW15cL10qKSQvLCAnL18kMScpOworCisgICAgICBpZiAodGhpcy5f
bW9kdWxlUmVnaXN0cnkuaGFzKHBhcnRpYWxpemVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgX2Vt
YmVyWydkZWZhdWx0J10uZGVwcmVjYXRlKCdNb2R1bGVzIHNob3VsZCBub3QgY29udGFpbiB1bmRl
cnNjb3Jlcy4gJyArICdBdHRlbXB0ZWQgdG8gbG9va3VwICInICsgbW9kdWxlTmFtZSArICciIHdo
aWNoICcgKyAnd2FzIG5vdCBmb3VuZC4gUGxlYXNlIHJlbmFtZSAiJyArIHBhcnRpYWxpemVkTW9k
dWxlTmFtZSArICciICcgKyAndG8gIicgKyBtb2R1bGVOYW1lICsgJyIgaW5zdGVhZC4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLXJlc29sdmVyLnVuZGVyc2NvcmVkLW1vZHVsZXMnLCB1bnRpbDogJzMu
MC4wJyB9KTsKKworICAgICAgICByZXR1cm4gcGFydGlhbGl6ZWRNb2R1bGVOYW1lOworICAgICAg
fQorICAgICAgX2VtYmVyWydkZWZhdWx0J10ucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAg
ICAgIHZhciBpc0NhbWVsQ2FzZUhlbHBlciA9IHBhcnNlZE5hbWUudHlwZSA9PT0gJ2hlbHBlcicg
JiYgISFtb2R1bGVOYW1lLm1hdGNoKC9bYS16XStbQS1aXSsvKTsKKyAgICAgICAgaWYgKGlzQ2Ft
ZWxDYXNlSGVscGVyKSB7CisgICAgICAgICAgX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5h
bWVzID0gX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5hbWVzIHx8IFtdOworICAgICAgICAg
IHZhciBhbHJlYWR5V2FybmVkID0gX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5hbWVzLmlu
ZGV4T2YocGFyc2VkTmFtZS5mdWxsTmFtZSkgPiAtMTsKKyAgICAgICAgICBpZiAoIWFscmVhZHlX
YXJuZWQgJiYgX3RoaXMuX21vZHVsZVJlZ2lzdHJ5LmhhcyhkYXNoZXJpemUobW9kdWxlTmFtZSkp
KSB7CisgICAgICAgICAgICBfdGhpcy5fY2FtZWxDYXNlSGVscGVyV2FybmVkTmFtZXMucHVzaChw
YXJzZWROYW1lLmZ1bGxOYW1lKTsKKyAgICAgICAgICAgIF9lbWJlclsnZGVmYXVsdCddLndhcm4o
J0F0dGVtcHRlZCB0byBsb29rdXAgIicgKyBwYXJzZWROYW1lLmZ1bGxOYW1lICsgJyIgd2hpY2gg
JyArICd3YXMgbm90IGZvdW5kLiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBlbWJlci1yZXNvbHZl
ciwgYSBidWcgd291bGQgaGF2ZSAnICsgJ2NhdXNlZCB0aGUgbW9kdWxlIGF0ICInICsgZGFzaGVy
aXplKG1vZHVsZU5hbWUpICsgJyIgdG8gYmUgJyArICdyZXR1cm5lZCBmb3IgdGhpcyBjYW1lbCBj
YXNlIGhlbHBlciBuYW1lLiBUaGlzIGhhcyBiZWVuIGZpeGVkLiAnICsgJ1VzZSB0aGUgZGFzaGVy
aXplZCBuYW1lIHRvIHJlc29sdmUgdGhlIG1vZHVsZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiAnICsg
J3JldHVybmVkIGluIHByZXZpb3VzIHZlcnNpb25zLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItcmVz
b2x2ZXIuY2FtZWxjYXNlLWhlbHBlci1uYW1lcycsIHVudGlsOiAnMy4wLjAnIH0pOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIHVzZWQgYnkgRW1i
ZXIuRGVmYXVsdFJlc29sdmVyLnByb3RvdHlwZS5fbG9nTG9va3VwCisgICAgbG9va3VwRGVzY3Jp
cHRpb246IGZ1bmN0aW9uIGxvb2t1cERlc2NyaXB0aW9uKGZ1bGxOYW1lKSB7CisgICAgICB2YXIg
cGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxOYW1lKTsKKworICAgICAgdmFyIG1vZHVs
ZU5hbWUgPSB0aGlzLmZpbmRNb2R1bGVOYW1lKHBhcnNlZE5hbWUsIHRydWUpOworCisgICAgICBy
ZXR1cm4gbW9kdWxlTmFtZTsKKyAgICB9LAorCisgICAgLy8gb25seSBuZWVkZWQgdW50aWwgMS42
LjAtYmV0YS4yIGNhbiBiZSByZXF1aXJlZAorICAgIF9sb2dMb29rdXA6IGZ1bmN0aW9uIF9sb2dM
b29rdXAoZm91bmQsIHBhcnNlZE5hbWUsIGRlc2NyaXB0aW9uKSB7CisgICAgICBpZiAoIV9lbWJl
clsnZGVmYXVsdCddLkVOVi5MT0dfTU9EVUxFX1JFU09MVkVSICYmICFwYXJzZWROYW1lLnJvb3Qu
TE9HX1JFU09MVkVSKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN5
bWJvbCwgcGFkZGluZzsKKworICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIHN5bWJvbCA9ICdb
4pyTXSc7CisgICAgICB9IGVsc2UgeworICAgICAgICBzeW1ib2wgPSAnWyBdJzsKKyAgICAgIH0K
KworICAgICAgaWYgKHBhcnNlZE5hbWUuZnVsbE5hbWUubGVuZ3RoID4gNjApIHsKKyAgICAgICAg
cGFkZGluZyA9ICcuJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhZGRpbmcgPSBuZXcgQXJy
YXkoNjAgLSBwYXJzZWROYW1lLmZ1bGxOYW1lLmxlbmd0aCkuam9pbignLicpOworICAgICAgfQor
CisgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5s
b29rdXBEZXNjcmlwdGlvbihwYXJzZWROYW1lKTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyWydk
ZWZhdWx0J10uTG9nZ2VyLmluZm8oc3ltYm9sLCBwYXJzZWROYW1lLmZ1bGxOYW1lLCBwYWRkaW5n
LCBkZXNjcmlwdGlvbik7CisgICAgfSwKKworICAgIGtub3duRm9yVHlwZTogZnVuY3Rpb24ga25v
d25Gb3JUeXBlKHR5cGUpIHsKKyAgICAgIHZhciBtb2R1bGVLZXlzID0gdGhpcy5fbW9kdWxlUmVn
aXN0cnkubW9kdWxlTmFtZXMoKTsKKworICAgICAgdmFyIGl0ZW1zID0gKDAsIF9lbWJlclJlc29s
dmVyVXRpbHNNYWtlRGljdGlvbmFyeVsnZGVmYXVsdCddKSgpOworICAgICAgZm9yICh2YXIgaW5k
ZXggPSAwLCBsZW5ndGggPSBtb2R1bGVLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4
KyspIHsKKyAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtb2R1bGVLZXlzW2luZGV4XTsKKyAgICAg
ICAgdmFyIGZ1bGxuYW1lID0gdGhpcy50cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKHR5cGUs
IG1vZHVsZU5hbWUpOworCisgICAgICAgIGlmIChmdWxsbmFtZSkgeworICAgICAgICAgIGl0ZW1z
W2Z1bGxuYW1lXSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGl0
ZW1zOworICAgIH0sCisKKyAgICB0cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lOiBmdW5jdGlv
biB0cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKHR5cGUsIG1vZHVsZU5hbWUpIHsKKyAgICAg
IHZhciBwcmVmaXggPSB0aGlzLnByZWZpeCh7IHR5cGU6IHR5cGUgfSk7CisKKyAgICAgIC8vIE5v
dGU6IHVzaW5nIHN0cmluZyBtYW5pcHVsYXRpb24gaGVyZSByYXRoZXIgdGhhbiByZWdleGVzIGZv
ciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAvLyBwb2QgbW9kdWxlcworICAgICAgLy8gJ14n
ICsgcHJlZml4ICsgJy8oLispLycgKyB0eXBlICsgJyQnCisgICAgICB2YXIgcG9kUHJlZml4ID0g
cHJlZml4ICsgJy8nOworICAgICAgdmFyIHBvZFN1ZmZpeCA9ICcvJyArIHR5cGU7CisgICAgICB2
YXIgc3RhcnQgPSBtb2R1bGVOYW1lLmluZGV4T2YocG9kUHJlZml4KTsKKyAgICAgIHZhciBlbmQg
PSBtb2R1bGVOYW1lLmluZGV4T2YocG9kU3VmZml4KTsKKworICAgICAgaWYgKHN0YXJ0ID09PSAw
ICYmIGVuZCA9PT0gbW9kdWxlTmFtZS5sZW5ndGggLSBwb2RTdWZmaXgubGVuZ3RoICYmIG1vZHVs
ZU5hbWUubGVuZ3RoID4gcG9kUHJlZml4Lmxlbmd0aCArIHBvZFN1ZmZpeC5sZW5ndGgpIHsKKyAg
ICAgICAgcmV0dXJuIHR5cGUgKyAnOicgKyBtb2R1bGVOYW1lLnNsaWNlKHN0YXJ0ICsgcG9kUHJl
Zml4Lmxlbmd0aCwgZW5kKTsKKyAgICAgIH0KKworICAgICAgLy8gbm9uLXBvZCBtb2R1bGVzCisg
ICAgICAvLyAnXicgKyBwcmVmaXggKyAnLycgKyBwbHVyYWxpemVkVHlwZSArICcvKC4rKSQnCisg
ICAgICB2YXIgcGx1cmFsaXplZFR5cGUgPSB0aGlzLnBsdXJhbGl6ZSh0eXBlKTsKKyAgICAgIHZh
ciBub25Qb2RQcmVmaXggPSBwcmVmaXggKyAnLycgKyBwbHVyYWxpemVkVHlwZSArICcvJzsKKwor
ICAgICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZihub25Qb2RQcmVmaXgpID09PSAwICYmIG1vZHVs
ZU5hbWUubGVuZ3RoID4gbm9uUG9kUHJlZml4Lmxlbmd0aCkgeworICAgICAgICByZXR1cm4gdHlw
ZSArICc6JyArIG1vZHVsZU5hbWUuc2xpY2Uobm9uUG9kUHJlZml4Lmxlbmd0aCk7CisgICAgICB9
CisgICAgfSwKKworICAgIF9leHRyYWN0RGVmYXVsdEV4cG9ydDogZnVuY3Rpb24gX2V4dHJhY3RE
ZWZhdWx0RXhwb3J0KG5vcm1hbGl6ZWRNb2R1bGVOYW1lKSB7CisgICAgICB2YXIgbW9kdWxlID0g
cmVxdWlyZShub3JtYWxpemVkTW9kdWxlTmFtZSwgbnVsbCwgbnVsbCwgdHJ1ZSAvKiBmb3JjZSBz
eW5jICovKTsKKworICAgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGVbJ2RlZmF1bHQnXSkgeworICAg
ICAgICBtb2R1bGUgPSBtb2R1bGVbJ2RlZmF1bHQnXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJu
IG1vZHVsZTsKKyAgICB9CisgIH0pOworCisgIFJlc29sdmVyLnJlb3BlbkNsYXNzKHsKKyAgICBt
b2R1bGVCYXNlZFJlc29sdmVyOiB0cnVlCisgIH0pOworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9
IFJlc29sdmVyOworfSk7CitkZWZpbmUoJ2VtYmVyLXJlc29sdmVyL3V0aWxzL2NsYXNzLWZhY3Rv
cnknLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNsYXNzRmFjdG9yeTsKKworICBmdW5jdGlvbiBjbGFz
c0ZhY3Rvcnkoa2xhc3MpIHsKKyAgICByZXR1cm4geworICAgICAgY3JlYXRlOiBmdW5jdGlvbiBj
cmVhdGUoaW5qZWN0aW9ucykgeworICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmV4dGVuZCA9PT0g
J2Z1bmN0aW9uJykgeworICAgICAgICAgIHJldHVybiBrbGFzcy5leHRlbmQoaW5qZWN0aW9ucyk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGtsYXNzOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfTsKKyAgfQorfSk7CitkZWZpbmUoImVtYmVyLXJlc29sdmVyL3V0aWxzL2Ny
ZWF0ZSIsIFsiZXhwb3J0cyIsICJlbWJlciJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7
CisgICJ1c2Ugc3RyaWN0IjsKKworICB2YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBfZW1i
ZXJbImRlZmF1bHQiXS5jcmVhdGU7CisgIGlmICghKGNyZWF0ZSAmJiAhY3JlYXRlKG51bGwpLmhh
c093blByb3BlcnR5KSkgeworICAgIHRocm93IG5ldyBFcnJvcigiVGhpcyBicm93c2VyIGRvZXMg
bm90IHN1cHBvcnQgT2JqZWN0LmNyZWF0ZShudWxsKSwgcGxlYXNlIHBvbHlmaWwgd2l0aCBlczUt
c2hhbTogaHR0cDovL2dpdC5pby95QlUycmciKTsKKyAgfQorCisgIGV4cG9ydHNbImRlZmF1bHQi
XSA9IGNyZWF0ZTsKK30pOworZGVmaW5lKCdlbWJlci1yZXNvbHZlci91dGlscy9tYWtlLWRpY3Rp
b25hcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXIvdXRpbHMvY3JlYXRlJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJSZXNvbHZlclV0aWxzQ3JlYXRlKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzWydkZWZhdWx0J10gPSBtYWtlRGljdGlvbmFyeTsKKworICBmdW5jdGlv
biBtYWtlRGljdGlvbmFyeSgpIHsKKyAgICB2YXIgY2FjaGUgPSAoMCwgX2VtYmVyUmVzb2x2ZXJV
dGlsc0NyZWF0ZVsnZGVmYXVsdCddKShudWxsKTsKKyAgICBjYWNoZVsnX2RpY3QnXSA9IG51bGw7
CisgICAgZGVsZXRlIGNhY2hlWydfZGljdCddOworICAgIHJldHVybiBjYWNoZTsKKyAgfQorfSk7
CitkZWZpbmUoJ2VtYmVyLXJlc29sdmVyL3V0aWxzL21vZHVsZS1yZWdpc3RyeScsIFsnZXhwb3J0
cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgIC8qZ2xvYmFscyBy
ZXF1aXJlanMsIHJlcXVpcmUgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgaWYgKHR5cGVvZiBy
ZXF1aXJlanMuZW50cmllcyA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICByZXF1aXJlanMuZW50cmll
cyA9IHJlcXVpcmVqcy5fZWFrX3NlZW47CisgIH0KKworICBmdW5jdGlvbiBNb2R1bGVSZWdpc3Ry
eShlbnRyaWVzKSB7CisgICAgdGhpcy5fZW50cmllcyA9IGVudHJpZXMgfHwgcmVxdWlyZWpzLmVu
dHJpZXM7CisgIH0KKworICBNb2R1bGVSZWdpc3RyeS5wcm90b3R5cGUubW9kdWxlTmFtZXMgPSBm
dW5jdGlvbiBNb2R1bGVSZWdpc3RyeV9tb2R1bGVOYW1lcygpIHsKKyAgICByZXR1cm4gKE9iamVj
dC5rZXlzIHx8IF9lbWJlclsnZGVmYXVsdCddLmtleXMpKHRoaXMuX2VudHJpZXMpOworICB9Owor
CisgIE1vZHVsZVJlZ2lzdHJ5LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBNb2R1bGVSZWdpc3Ry
eV9oYXMobW9kdWxlTmFtZSkgeworICAgIHJldHVybiBtb2R1bGVOYW1lIGluIHRoaXMuX2VudHJp
ZXM7CisgIH07CisKKyAgTW9kdWxlUmVnaXN0cnkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIE1v
ZHVsZVJlZ2lzdHJ5X2dldChtb2R1bGVOYW1lKSB7CisgICAgdmFyIGV4cG9ydE5hbWUgPSBhcmd1
bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnZGVmYXVs
dCcgOiBhcmd1bWVudHNbMV07CisKKyAgICB2YXIgbW9kdWxlID0gcmVxdWlyZShtb2R1bGVOYW1l
KTsKKyAgICByZXR1cm4gbW9kdWxlICYmIG1vZHVsZVtleHBvcnROYW1lXTsKKyAgfTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSBNb2R1bGVSZWdpc3RyeTsKK30pOworOy8qIGpzaGludCBpZ25v
cmU6c3RhcnQgKi8KKworCisKKy8qIGpzaGludCBpZ25vcmU6ZW5kICovCisvLyMgc291cmNlTWFw
cGluZ1VSTD12ZW5kb3IubWFwCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
Lmpzb24gYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGU5OWU0OTgyMmFmMDViNjRlOTZhMTMwZTk5ODcxYjQwOTk4OTA4Y2YuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9ib3dlci5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotewotICAi
bmFtZSI6ICJ0b2RvbXZjLWVtYmVyanMiLAotICAidmVyc2lvbiI6ICIwLjAuMCIsCi0gICJkZXBl
bmRlbmNpZXMiOiB7Ci0gICAgInRvZG9tdmMtY29tbW9uIjogIn4wLjEuNCIsCi0gICAgImpxdWVy
eSI6ICJ+Mi4xLjAiLAotICAgICJoYW5kbGViYXJzIjogIn4xLjMuMCIsCi0gICAgImVtYmVyIjog
In4xLjMuMSIsCi0gICAgImVtYmVyLWRhdGEiOiAiMS4wLjAtYmV0YS42IiwKLSAgICAiZW1iZXIt
bG9jYWxzdG9yYWdlLWFkYXB0ZXIiOiAibGF0ZXN0IgotICB9Ci19CmRpZmYgLS1naXQgYS9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpz
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWRhdGEvZW1iZXIt
ZGF0YS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYTlkNzc5NWJhZGY2NDAy
ZDAzNmViYjU5MDkzMTBkNGViMzZjMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXIt
ZGF0YS9lbWJlci1kYXRhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MjAgKzAsMCBAQAotLyoh
Ci0gKiBAb3ZlcnZpZXcgIEVtYmVyIERhdGEKLSAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEt
MjAxNCBUaWxkZSBJbmMuIGFuZCBjb250cmlidXRvcnMuCi0gKiAgICAgICAgICAgIFBvcnRpb25z
IENvcHlyaWdodCAyMDExIExpdmluZ1NvY2lhbCBJbmMuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2Vk
IHVuZGVyIE1JVCBsaWNlbnNlIChzZWUgbGljZW5zZS5qcykKLSAqIEB2ZXJzaW9uICAgMS4wLjAt
YmV0YS42Ci0gKi8KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZGVmaW5lLCByZXF1aXJlTW9kdWxl
OwotCi0oZnVuY3Rpb24oKSB7Ci0gIHZhciByZWdpc3RyeSA9IHt9LCBzZWVuID0ge307Ci0KLSAg
ZGVmaW5lID0gZnVuY3Rpb24obmFtZSwgZGVwcywgY2FsbGJhY2spIHsKLSAgICByZWdpc3RyeVtu
YW1lXSA9IHsgZGVwczogZGVwcywgY2FsbGJhY2s6IGNhbGxiYWNrIH07Ci0gIH07Ci0KLSAgcmVx
dWlyZU1vZHVsZSA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1
cm4gc2VlbltuYW1lXTsgfQotICAgIHNlZW5bbmFtZV0gPSB7fTsKLQotICAgIHZhciBtb2QsIGRl
cHMsIGNhbGxiYWNrLCByZWlmaWVkICwgZXhwb3J0czsKLQotICAgIG1vZCA9IHJlZ2lzdHJ5W25h
bWVdOwotCi0gICAgaWYgKCFtb2QpIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcigiTW9kdWxlICci
ICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKLSAgICB9Ci0KLSAgICBkZXBzID0gbW9kLmRlcHM7
Ci0gICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2s7Ci0gICAgcmVpZmllZCA9IFtdOwotICAgIGV4
cG9ydHM7Ci0KLSAgICBmb3IgKHZhciBpPTAsIGw9ZGVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICBpZiAoZGVwc1tpXSA9PT0gJ2V4cG9ydHMnKSB7Ci0gICAgICAgIHJlaWZpZWQucHVzaChl
eHBvcnRzID0ge30pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVpZmllZC5wdXNoKHJlcXVp
cmVNb2R1bGUoZGVwc1tpXSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHZhciB2YWx1ZSA9IGNh
bGxiYWNrLmFwcGx5KHRoaXMsIHJlaWZpZWQpOwotICAgIHJldHVybiBzZWVuW25hbWVdID0gZXhw
b3J0cyB8fCB2YWx1ZTsKLSAgfTsKLX0pKCk7Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVs
ZSBlbWJlci1kYXRhCi0qLwotCi0vKioKLSAgQWxsIEVtYmVyIERhdGEgbWV0aG9kcyBhbmQgZnVu
Y3Rpb25zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiB0aGlzIG5hbWVzcGFjZS4KLQotICBAY2xhc3Mg
RFMKLSAgQHN0YXRpYwotKi8KLXZhciBEUzsKLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIERT
KSB7Ci0gIC8qKgotICAgIEBwcm9wZXJ0eSBWRVJTSU9OCi0gICAgQHR5cGUgU3RyaW5nCi0gICAg
QGRlZmF1bHQgJzEuMC4wLWJldGEuNicKLSAgICBAc3RhdGljCi0gICovCi0gIERTID0gRW1iZXIu
TmFtZXNwYWNlLmNyZWF0ZSh7Ci0gICAgVkVSU0lPTjogJzEuMC4wLWJldGEuNicKLSAgfSk7Ci0K
LSAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93KSB7Ci0gICAgd2luZG93LkRTID0g
RFM7Ci0gIH0KLQotICBpZiAoRW1iZXIubGlicmFyaWVzKSB7Ci0gICAgRW1iZXIubGlicmFyaWVz
LnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyIERhdGEnLCBEUy5WRVJTSU9OKTsKLSAgfQotfQot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIFRoaXMgaXMgdXNlZCBpbnRlcm5h
bGx5IHRvIGVuYWJsZSBkZXByZWNhdGlvbiBvZiBjb250YWluZXIgcGF0aHMgYW5kIHByb3ZpZGUK
LSAgYSBkZWNlbnQgbWVzc2FnZSB0byB0aGUgdXNlciBpbmRpY2F0aW5nIGhvdyB0byBmaXggdGhl
IGlzc3VlLgotCi0gIEBjbGFzcyBDb250YWluZXJQcm94eQotICBAbmFtZXNwYWNlIERTCi0gIEBw
cml2YXRlCi0qLwotdmFyIENvbnRhaW5lclByb3h5ID0gZnVuY3Rpb24gKGNvbnRhaW5lcil7Ci0g
IHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotfTsKLQotQ29udGFpbmVyUHJveHkucHJvdG90
eXBlLmFsaWFzZWRGYWN0b3J5ID0gZnVuY3Rpb24ocGF0aCwgcHJlTG9va3VwKSB7Ci0gIHZhciBf
dGhpcyA9IHRoaXM7Ci0KLSAgcmV0dXJuIHtjcmVhdGU6IGZ1bmN0aW9uKCl7IAotICAgIGlmIChw
cmVMb29rdXApIHsgcHJlTG9va3VwKCk7IH0KLQotICAgIHJldHVybiBfdGhpcy5jb250YWluZXIu
bG9va3VwKHBhdGgpOyAKLSAgfX07Ci19OwotCi1Db250YWluZXJQcm94eS5wcm90b3R5cGUucmVn
aXN0ZXJBbGlhcyA9IGZ1bmN0aW9uKHNvdXJjZSwgZGVzdCwgcHJlTG9va3VwKSB7Ci0gIHZhciBm
YWN0b3J5ID0gdGhpcy5hbGlhc2VkRmFjdG9yeShkZXN0LCBwcmVMb29rdXApOwotCi0gIHJldHVy
biB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcihzb3VyY2UsIGZhY3RvcnkpOwotfTsKLQotQ29udGFp
bmVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyRGVwcmVjYXRpb24gPSBmdW5jdGlvbihkZXByZWNh
dGVkLCB2YWxpZCkgewotICB2YXIgcHJlTG9va3VwQ2FsbGJhY2sgPSBmdW5jdGlvbigpewotICAg
IEVtYmVyLmRlcHJlY2F0ZSgiWW91IHRyaWVkIHRvIGxvb2sgdXAgJyIgKyBkZXByZWNhdGVkICsg
IicsICIgKwotICAgICAgICAgICAgICAgICAgICAiYnV0IHRoaXMgaGFzIGJlZW4gZGVwcmVjYXRl
ZCBpbiBmYXZvciBvZiAnIiArIHZhbGlkICsgIicuIiwgZmFsc2UpOwotICB9OwotCi0gIHJldHVy
biB0aGlzLnJlZ2lzdGVyQWxpYXMoZGVwcmVjYXRlZCwgdmFsaWQsIHByZUxvb2t1cENhbGxiYWNr
KTsKLX07Ci0KLUNvbnRhaW5lclByb3h5LnByb3RvdHlwZS5yZWdpc3RlckRlcHJlY2F0aW9ucyA9
IGZ1bmN0aW9uKHByb3h5UGFpcnMpIHsKLSAgZm9yICh2YXIgaSA9IHByb3h5UGFpcnMubGVuZ3Ro
OyBpID4gMDsgaS0tKSB7Ci0gICAgdmFyIHByb3h5UGFpciA9IHByb3h5UGFpcnNbaSAtIDFdLAot
ICAgICAgICBkZXByZWNhdGVkID0gcHJveHlQYWlyWydkZXByZWNhdGVkJ10sCi0gICAgICAgIHZh
bGlkID0gcHJveHlQYWlyWyd2YWxpZCddOwotCi0gICAgdGhpcy5yZWdpc3RlckRlcHJlY2F0aW9u
KGRlcHJlY2F0ZWQsIHZhbGlkKTsKLSAgfQotfTsKLQotRFMuQ29udGFpbmVyUHJveHkgPSBDb250
YWluZXJQcm94eTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIuaXNOb25lOwotCi0vLyBTaW1w
bGUgZGlzcGF0Y2hlciB0byBzdXBwb3J0IG92ZXJyaWRpbmcgdGhlIGFsaWFzZWQKLS8vIG1ldGhv
ZCBpbiBzdWJjbGFzc2VzLgotZnVuY3Rpb24gYWxpYXNNZXRob2QobWV0aG9kTmFtZSkgewotICBy
ZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKLSAgfTsKLX0KLQotLyoqCi0gIEluIEVtYmVyIERhdGEgYSBTZXJpYWxp
emVyIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICByZWNvcmRzIHdoZW4g
dGhleSBhcmUgdHJhbnNmZXJyZWQgaW4gYW5kIG91dCBvZiBhbiBleHRlcm5hbCBzb3VyY2UuCi0g
IFRoaXMgcHJvY2VzcyBpbnZvbHZlcyBub3JtYWxpemluZyBwcm9wZXJ0eSBuYW1lcywgdHJhbnNm
b3JtaW5nCi0gIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIHNlcmlhbGl6aW5nIHJlbGF0aW9uc2hpcHMu
Ci0KLSAgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgRW1iZXIgRGF0YSByZWNvbW1lbmRzIHlvdSB1
c2UgdGhlCi0gIFtSRVNUU2VyaWFsaXplcl0oRFMuUkVTVFNlcmlhbGl6ZXIuaHRtbCkgb3Igb25l
IG9mIGl0cyBzdWJjbGFzc2VzLgotCi0gIGBKU09OU2VyaWFsaXplcmAgaXMgdXNlZnVsIGZvciBz
aW1wbGVyIG9yIGxlZ2FjeSBiYWNrZW5kcyB0aGF0IG1heQotICBub3Qgc3VwcG9ydCB0aGUgaHR0
cDovL2pzb25hcGkub3JnLyBzcGVjLgotCi0gIEBjbGFzcyBKU09OU2VyaWFsaXplcgotICBAbmFt
ZXNwYWNlIERTCi0qLwotRFMuSlNPTlNlcmlhbGl6ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
LSAgLyoqCi0gICAgVGhlIHByaW1hcnlLZXkgaXMgdXNlZCB3aGVuIHNlcmlhbGl6aW5nIGFuZCBk
ZXNlcmlhbGl6aW5nCi0gICAgZGF0YS4gRW1iZXIgRGF0YSBhbHdheXMgdXNlcyB0aGUgYGlkYCBw
cm9wZXJ0eSB0byBzdG9yZSB0aGUgaWQgb2YKLSAgICB0aGUgcmVjb3JkLiBUaGUgZXh0ZXJuYWwg
c291cmNlIG1heSBub3QgYWx3YXlzIGZvbGxvdyB0aGlzCi0gICAgY29udmVudGlvbi4gSW4gdGhl
c2UgY2FzZXMgaXQgaXMgdXNlZnVsIHRvIG92ZXJyaWRlIHRoZQotICAgIHByaW1hcnlLZXkgcHJv
cGVydHkgdG8gbWF0Y2ggdGhlIHByaW1hcnlLZXkgb2YgeW91ciBleHRlcm5hbAotICAgIHN0b3Jl
LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlv
blNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgcHJpbWFyeUtl
eTogJ19pZCcKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBwcmltYXJ5S2V5Ci0g
ICAgQHR5cGUge1N0cmluZ30KLSAgICBAZGVmYXVsdCAnaWQnCi0gICovCi0gIHByaW1hcnlLZXk6
ICdpZCcsCi0KLSAgLyoqCi0gICBHaXZlbiBhIHN1YmNsYXNzIG9mIGBEUy5Nb2RlbGAgYW5kIGEg
SlNPTiBvYmplY3QgdGhpcyBtZXRob2Qgd2lsbAotICAgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggYXR0
cmlidXRlIG9mIHRoZSBgRFMuTW9kZWxgIGFuZCBpbnZva2UgdGhlCi0gICBgRFMuVHJhbnNmb3Jt
I2Rlc2VyaWFsaXplYCBtZXRob2Qgb24gdGhlIG1hdGNoaW5nIHByb3BlcnR5IG9mIHRoZQotICAg
SlNPTiBvYmplY3QuICBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGFmdGVyIHRoZQot
ICAgc2VyaWFsaXplcidzIGBub3JtYWxpemVgIG1ldGhvZC4KLQotICAgQG1ldGhvZCBhcHBseVRy
YW5zZm9ybXMKLSAgIEBwcml2YXRlCi0gICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0
eXBlCi0gICBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSB0byB0cmFuc2Zvcm0KLSAgIEBy
ZXR1cm4ge09iamVjdH0gZGF0YSBUaGUgdHJhbnNmb3JtZWQgZGF0YSBvYmplY3QKLSAgKi8KLSAg
YXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7Ci0gICAgdHlwZS5lYWNoVHJh
bnNmb3JtZWRBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5LCB0eXBlKSB7Ci0gICAgICB2YXIgdHJhbnNm
b3JtID0gdGhpcy50cmFuc2Zvcm1Gb3IodHlwZSk7Ci0gICAgICBkYXRhW2tleV0gPSB0cmFuc2Zv
cm0uZGVzZXJpYWxpemUoZGF0YVtrZXldKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBk
YXRhOwotICB9LAotCi0gIC8qKgotICAgIE5vcm1hbGl6ZXMgYSBwYXJ0IG9mIHRoZSBKU09OIHBh
eWxvYWQgcmV0dXJuZWQgYnkKLSAgICB0aGUgc2VydmVyLiBZb3Ugc2hvdWxkIG92ZXJyaWRlIHRo
aXMgbWV0aG9kLCBtdW5nZSB0aGUgaGFzaAotICAgIGFuZCBjYWxsIHN1cGVyIGlmIHlvdSBoYXZl
IGdlbmVyaWMgbm9ybWFsaXphdGlvbiB0byBkby4KLQotICAgIEl0IHRha2VzIHRoZSB0eXBlIG9m
IHRoZSByZWNvcmQgdGhhdCBpcyBiZWluZyBub3JtYWxpemVkCi0gICAgKGFzIGEgRFMuTW9kZWwg
Y2xhc3MpLCB0aGUgcHJvcGVydHkgd2hlcmUgdGhlIGhhc2ggd2FzCi0gICAgb3JpZ2luYWxseSBm
b3VuZCwgYW5kIHRoZSBoYXNoIHRvIG5vcm1hbGl6ZS4KLQotICAgIFlvdSBjYW4gdXNlIHRoaXMg
bWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gbm9ybWFsaXplIHVuZGVyc2NvcmVkIGtleXMgdG8gY2Ft
ZWxpemVkCi0gICAgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIG5vcm1hbGl6YXRpb25zLgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlh
bGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgbm9ybWFsaXplOiBmdW5j
dGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgICAgIHZhciBmaWVsZHMgPSBFbWJlci5nZXQodHlwZSwg
J2ZpZWxkcycpOwotICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkgewotICAg
ICAgICAgIHZhciBwYXlsb2FkRmllbGQgPSBFbWJlci5TdHJpbmcudW5kZXJzY29yZShmaWVsZCk7
Ci0gICAgICAgICAgaWYgKGZpZWxkID09PSBwYXlsb2FkRmllbGQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICAgICAgICBoYXNoW2ZpZWxkXSA9IGhhc2hbcGF5bG9hZEZpZWxkXTsKLSAgICAgICAgICBkZWxl
dGUgaGFzaFtwYXlsb2FkRmllbGRdOwotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBg
Ci0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gaGFzaAotICAgIEByZXR1cm4ge09iamVjdH0K
LSAgKi8KLSAgbm9ybWFsaXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgaWYgKCFoYXNo
KSB7IHJldHVybiBoYXNoOyB9Ci0KLSAgICB0aGlzLmFwcGx5VHJhbnNmb3Jtcyh0eXBlLCBoYXNo
KTsKLSAgICByZXR1cm4gaGFzaDsKLSAgfSwKLQotICAvLyBTRVJJQUxJWkUKLSAgLyoqCi0gICAg
Q2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgc2F2ZWQgaW4gb3JkZXIgdG8gY29udmVydCB0aGUKLSAg
ICByZWNvcmQgaW50byBKU09OLgotCi0gICAgQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIEpTT04g
b2JqZWN0IHdpdGggYSBrZXkgZm9yCi0gICAgZWFjaCBhdHRyaWJ1dGUgYW5kIGJlbG9uZ3NUbyBy
ZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBtb2RlbDoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgICB0aXRsZTogRFMuYXR0cigpLAotICAgICAgYm9keTogRFMuYXR0cigpLAotCi0gICAgICBh
dXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUg
ZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAgICAgInRpdGxlIjogIlJhaWxzIGlzIHVuYWdp
IiwKLSAgICAgICJib2R5IjogIlJhaWxzPyBPbWFrYXNlPyBPX08iLAotICAgICAgImF1dGhvciI6
IDEyCi0gICAgfQotICAgIGBgYAotCi0gICAgQnkgZGVmYXVsdCwgYXR0cmlidXRlcyBhcmUgcGFz
c2VkIHRocm91Z2ggYXMtaXMsIHVubGVzcwotICAgIHlvdSBzcGVjaWZpZWQgYW4gYXR0cmlidXRl
IHR5cGUgKGBEUy5hdHRyKCdkYXRlJylgKS4gSWYKLSAgICB5b3Ugc3BlY2lmeSBhIHRyYW5zZm9y
bSwgdGhlIEphdmFTY3JpcHQgdmFsdWUgd2lsbCBiZQotICAgIHNlcmlhbGl6ZWQgd2hlbiBpbnNl
cnRlZCBpbnRvIHRoZSBKU09OIGhhc2guCi0KLSAgICBCeSBkZWZhdWx0LCBiZWxvbmdzLXRvIHJl
bGF0aW9uc2hpcHMgYXJlIGNvbnZlcnRlZCBpbnRvCi0gICAgSURzIHdoZW4gaW5zZXJ0ZWQgaW50
byB0aGUgSlNPTiBoYXNoLgotCi0gICAgIyMgSURzCi0KLSAgICBgc2VyaWFsaXplYCB0YWtlcyBh
biBvcHRpb25zIGhhc2ggd2l0aCBhIHNpbmdsZSBvcHRpb246Ci0gICAgYGluY2x1ZGVJZGAuIElm
IHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgYHNlcmlhbGl6ZWAgd2lsbCwKLSAgICBieSBkZWZhdWx0
IGluY2x1ZGUgdGhlIElEIGluIHRoZSBKU09OIG9iamVjdCBpdCBidWlsZHMuCi0KLSAgICBUaGUg
YWRhcHRlciBwYXNzZXMgaW4gYGluY2x1ZGVJZDogdHJ1ZWAgd2hlbiBzZXJpYWxpemluZwotICAg
IGEgcmVjb3JkIGZvciBgY3JlYXRlUmVjb3JkYCwgYnV0IG5vdCBmb3IgYHVwZGF0ZVJlY29yZGAu
Ci0KLSAgICAjIyBDdXN0b21pemF0aW9uCi0KLSAgICBZb3VyIHNlcnZlciBtYXkgZXhwZWN0IGEg
ZGlmZmVyZW50IEpTT04gZm9ybWF0IHRoYW4gdGhlCi0gICAgYnVpbHQtaW4gc2VyaWFsaXphdGlv
biBmb3JtYXQuCi0KLSAgICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gaW1wbGVtZW50IGBzZXJpYWxp
emVgIHlvdXJzZWxmIGFuZAotICAgIHJldHVybiBhIEpTT04gaGFzaCBvZiB5b3VyIGNob29zaW5n
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05T
ZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHBvc3QsIG9wdGlv
bnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7Ci0gICAgICAgICAgUE9TVF9UVEw6IHBvc3QuZ2V0
KCd0aXRsZScpLAotICAgICAgICAgIFBPU1RfQkRZOiBwb3N0LmdldCgnYm9keScpLAotICAgICAg
ICAgIFBPU1RfQ01TOiBwb3N0LmdldCgnY29tbWVudHMnKS5tYXBQcm9wZXJ0eSgnaWQnKQotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUlkKSB7Ci0gICAgICAgICAganNv
bi5QT1NUX0lEXyA9IHBvc3QuZ2V0KCdpZCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJu
IGpzb247Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICAjIyBDdXN0b21pemluZyBh
biBBcHAtV2lkZSBTZXJpYWxpemVyCi0KLSAgICBJZiB5b3Ugd2FudCB0byBkZWZpbmUgYSBzZXJp
YWxpemVyIGZvciB5b3VyIGVudGlyZQotICAgIGFwcGxpY2F0aW9uLCB5b3UnbGwgcHJvYmFibHkg
d2FudCB0byB1c2UgYGVhY2hBdHRyaWJ1dGVgCi0gICAgYW5kIGBlYWNoUmVsYXRpb25zaGlwYCBv
biB0aGUgcmVjb3JkLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNl
cmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplOiBm
dW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7fTsKLQotICAg
ICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgICAganNv
bltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSk7Ci0gICAgICAg
IH0pCi0KLSAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVs
YXRpb25zaGlwKSB7Ci0gICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFu
eScpIHsKLSAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUobmFtZSldID0gcmVjb3Jk
LmdldChuYW1lKS5tYXBCeSgnaWQnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAg
ICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewotICAgICAgICAgIGpzb24uSURfID0gcmVjb3Jk
LmdldCgnaWQnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqc29uOwotICAgICAgfQot
ICAgIH0pOwotCi0gICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFtZShhdHRyaWJ1dGUpIHsK
LSAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAg
fQotCi0gICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgewotICAgICAgcmV0dXJu
IHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSArICJfSURTIjsKLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBKU09OIHRoYXQg
bG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHsKLSAgICAgICJUSVRM
RSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICJCT0RZIjogIlllcC4gT21ha2FzZS4iLAot
ICAgICAgIkNPTU1FTlRfSURTIjogWyAxLCAyLCAzIF0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICAj
IyBUd2Vha2luZyB0aGUgRGVmYXVsdCBKU09OCi0KLSAgICBJZiB5b3UganVzdCB3YW50IHRvIGRv
IHNvbWUgc21hbGwgdHdlYWtzIG9uIHRoZSBkZWZhdWx0IEpTT04sCi0gICAgeW91IGNhbiBjYWxs
IHN1cGVyIGZpcnN0IGFuZCBtYWtlIHRoZSB0d2Vha3Mgb24gdGhlIHJldHVybmVkCi0gICAgSlNP
Ti4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09O
U2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9w
dGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOwotCi0gICAgICAgIGpzb24uc3ViamVjdCA9IGpzb24udGl0bGU7Ci0gICAgICAgIGRl
bGV0ZSBqc29uLnRpdGxlOwotCi0gICAgICAgIHJldHVybiBqc29uOwotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEBy
ZXR1cm4ge09iamVjdH0ganNvbgotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
b3B0aW9ucykgewotICAgIHZhciBqc29uID0ge307Ci0KLSAgICBpZiAob3B0aW9ucyAmJiBvcHRp
b25zLmluY2x1ZGVJZCkgewotICAgICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0KLSAg
ICAgIGlmIChpZCkgewotICAgICAgICBqc29uW2dldCh0aGlzLCAncHJpbWFyeUtleScpXSA9IGlk
OwotICAgICAgfQotICAgIH0KLQotICAgIHJlY29yZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtl
eSwgYXR0cmlidXRlKSB7Ci0gICAgICB0aGlzLnNlcmlhbGl6ZUF0dHJpYnV0ZShyZWNvcmQsIGpz
b24sIGtleSwgYXR0cmlidXRlKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJlY29yZC5lYWNoUmVs
YXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBpZiAocmVsYXRp
b25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0gICAgICAgIHRoaXMuc2VyaWFsaXplQmVs
b25nc1RvKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKTsKLSAgICAgIH0gZWxzZSBpZiAocmVs
YXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55JykgewotICAgICAgICB0aGlzLnNlcmlhbGl6ZUhh
c01hbnkocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApOwotICAgICAgfQotICAgIH0sIHRoaXMp
OwotCi0gICAgcmV0dXJuIGpzb247Ci0gIH0sCi0KLSAgLyoqCi0gICBgc2VyaWFsaXplQXR0cmli
dXRlYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgaG93IGBEUy5hdHRyYAotICAgcHJvcGVydGll
cyBhcmUgc2VyaWFsaXplZAotCi0gICBGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudGVkIHRvIGVuc3Vy
ZSBhbGwgeW91IGF0dHJpYnV0ZXMgd2VyZSBhbHdheXMKLSAgIHNlcmlhbGl6ZWQgYXMgcHJvcGVy
dGllcyBvbiBhbiBgYXR0cmlidXRlc2Agb2JqZWN0IHlvdSBjb3VsZAotICAgd3JpdGU6Ci0KLSAg
IGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2Vy
aWFsaXplci5leHRlbmQoewotICAgICBzZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0aW9uKHJlY29y
ZCwganNvbiwga2V5LCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAganNvbi5hdHRyaWJ1dGVzID0ganNv
bi5hdHRyaWJ1dGVzIHx8IHt9OwotICAgICAgIHRoaXMuX3N1cGVyKHJlY29yZCwganNvbi5hdHRy
aWJ1dGVzLCBrZXksIGF0dHJpYnV0ZXMpOwotICAgICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBA
bWV0aG9kIHNlcmlhbGl6ZUF0dHJpYnV0ZQotICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0g
ICBAcGFyYW0ge09iamVjdH0ganNvbgotICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgQHBhcmFt
IHtPYmplY3R9IGF0dHJpYnV0ZQotICAqLwotICBzZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0aW9u
KHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGUpIHsKLSAgICB2YXIgYXR0cnMgPSBnZXQodGhp
cywgJ2F0dHJzJyk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KSwgdHlwZSA9IGF0
dHJpYnV0ZS50eXBlOwotCi0gICAgaWYgKHR5cGUpIHsKLSAgICAgIHZhciB0cmFuc2Zvcm0gPSB0
aGlzLnRyYW5zZm9ybUZvcih0eXBlKTsKLSAgICAgIHZhbHVlID0gdHJhbnNmb3JtLnNlcmlhbGl6
ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gaWYgcHJvdmlkZWQsIHVzZSB0aGUgbWFwcGluZyBw
cm92aWRlZCBieSBgYXR0cnNgIGluCi0gICAgLy8gdGhlIHNlcmlhbGl6ZXIKLSAgICBrZXkgPSBh
dHRycyAmJiBhdHRyc1trZXldIHx8ICh0aGlzLmtleUZvckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9y
QXR0cmlidXRlKGtleSkgOiBrZXkpOwotCi0gICAganNvbltrZXldID0gdmFsdWU7Ci0gIH0sCi0K
LSAgLyoqCi0gICBgc2VyaWFsaXplQmVsb25nc1RvYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUg
aG93IGBEUy5iZWxvbmdzVG9gCi0gICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkLgotCi0gICBF
eGFtcGxlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpT
T05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgIHNlcmlhbGl6ZUJlbG9uZ3NUbzogZnVuY3Rpb24o
cmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsKLSAgICAgICB2YXIga2V5ID0gcmVsYXRpb25z
aGlwLmtleTsKLQotICAgICAgIHZhciBiZWxvbmdzVG8gPSBnZXQocmVjb3JkLCBrZXkpOwotCi0g
ICAgICAga2V5ID0gdGhpcy5rZXlGb3JSZWxhdGlvbnNoaXAgPyB0aGlzLmtleUZvclJlbGF0aW9u
c2hpcChrZXksICJiZWxvbmdzVG8iKSA6IGtleTsKLQotICAgICAgIGpzb25ba2V5XSA9IEVtYmVy
LmlzTm9uZShiZWxvbmdzVG8pID8gYmVsb25nc1RvIDogYmVsb25nc1RvLnRvSlNPTigpOwotICAg
ICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBAbWV0aG9kIHNlcmlhbGl6ZUJlbG9uZ3NUbwotICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICBAcGFyYW0ge09iamVjdH0ganNvbgotICAgQHBh
cmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcAotICAqLwotICBzZXJpYWxpemVCZWxvbmdzVG86IGZ1
bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtleSA9IHJlbGF0
aW9uc2hpcC5rZXk7Ci0KLSAgICB2YXIgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLQot
ICAgIGtleSA9IHRoaXMua2V5Rm9yUmVsYXRpb25zaGlwID8gdGhpcy5rZXlGb3JSZWxhdGlvbnNo
aXAoa2V5LCAiYmVsb25nc1RvIikgOiBrZXk7Ci0KLSAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykp
IHsKLSAgICAgIGpzb25ba2V5XSA9IGJlbG9uZ3NUbzsKLSAgICB9IGVsc2UgewotICAgICAganNv
bltrZXldID0gZ2V0KGJlbG9uZ3NUbywgJ2lkJyk7Ci0gICAgfQotCi0gICAgaWYgKHJlbGF0aW9u
c2hpcC5vcHRpb25zLnBvbHltb3JwaGljKSB7Ci0gICAgICB0aGlzLnNlcmlhbGl6ZVBvbHltb3Jw
aGljVHlwZShyZWNvcmQsIGpzb24sIHJlbGF0aW9uc2hpcCk7Ci0gICAgfQotICB9LAotCi0gIC8q
KgotICAgYHNlcmlhbGl6ZUhhc01hbnlgIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBob3cgYERT
Lmhhc01hbnlgCi0gICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkLgotCi0gICBFeGFtcGxlCi0K
LSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxp
emVyLmV4dGVuZCh7Ci0gICAgIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNv
biwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0g
ICAgICAgaWYgKGtleSA9PT0gJ2NvbW1lbnRzJykgewotICAgICAgICAgcmV0dXJuOwotICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwot
ICAgICAgIH0KLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgQG1ldGhvZCBzZXJpYWxpemVI
YXNNYW55Ci0gICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgIEBwYXJhbSB7T2JqZWN0fSBq
c29uCi0gICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNlcmlhbGl6ZUhh
c01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtl
eSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0KLSAgICB2YXIgcmVsYXRpb25zaGlwVHlwZSA9IERTLlJl
bGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlKHJlY29yZC5jb25zdHJ1
Y3RvciwgcmVsYXRpb25zaGlwKTsKLQotICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlID09PSAnbWFu
eVRvTm9uZScgfHwgcmVsYXRpb25zaGlwVHlwZSA9PT0gJ21hbnlUb01hbnknKSB7Ci0gICAgICBq
c29uW2tleV0gPSBnZXQocmVjb3JkLCBrZXkpLm1hcEJ5KCdpZCcpOwotICAgICAgLy8gVE9ETyBz
dXBwb3J0IGZvciBwb2x5bW9ycGhpYyBtYW55VG9Ob25lIGFuZCBtYW55VG9NYW55IHJlbGF0aW9u
c2hpcHMKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2Qg
dG8gY3VzdG9taXplIGhvdyBwb2x5bW9ycGhpYyBvYmplY3RzIGFyZQotICAgIHNlcmlhbGl6ZWQu
IE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcG9seW1vcnBoaWMgaWYKLSAgICBge3BvbHlt
b3JwaGljOiB0cnVlfWAgaXMgcGFzcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZQotICAg
IGBEUy5iZWxvbmdzVG9gIGZ1bmN0aW9uLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5Db21tZW50U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVu
ZCh7Ci0gICAgICBzZXJpYWxpemVQb2x5bW9ycGhpY1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNv
biwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHZhciBrZXkgPSByZWxhdGlvbnNoaXAua2V5LAot
ICAgICAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICAgICAga2V5ID0g
dGhpcy5rZXlGb3JBdHRyaWJ1dGUgPyB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpIDoga2V5Owot
ICAgICAgICBqc29uW2tleSArICJfdHlwZSJdID0gYmVsb25nc1RvLmNvbnN0cnVjdG9yLnR5cGVL
ZXk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICBgYGAKLQotICAgIEBtZXRob2Qgc2VyaWFsaXplUG9s
eW1vcnBoaWNUeXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtP
YmplY3R9IGpzb24KLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNl
cmlhbGl6ZVBvbHltb3JwaGljVHlwZTogRW1iZXIuSywKLQotICAvLyBFWFRSQUNUCi0KLSAgLyoq
Ci0gICAgVGhlIGBleHRyYWN0YCBtZXRob2QgaXMgdXNlZCB0byBkZXNlcmlhbGl6ZSBwYXlsb2Fk
IGRhdGEgZnJvbSB0aGUKLSAgICBzZXJ2ZXIuIEJ5IGRlZmF1bHQgdGhlIGBKU09OU2VyaWFsaXpl
cmAgZG9lcyBub3QgcHVzaCB0aGUgcmVjb3JkcwotICAgIGludG8gdGhlIHN0b3JlLiBIb3dldmVy
IHJlY29yZHMgdGhhdCBzdWJjbGFzcyBgSlNPTlNlcmlhbGl6ZXJgCi0gICAgc3VjaCBhcyB0aGUg
YFJFU1RTZXJpYWxpemVyYCBtYXkgcHVzaCByZWNvcmRzIGludG8gdGhlIHN0b3JlIGFzCi0gICAg
cGFydCBvZiB0aGUgZXh0cmFjdCBjYWxsLgotCi0gICAgVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRv
IGEgbW9yZSBzcGVjaWZpYyBleHRyYWN0IG1ldGhvZCBiYXNlZCBvbgotICAgIHRoZSBgcmVxdWVz
dFR5cGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBnZXQg
PSBFbWJlci5nZXQ7Ci0gICAgc29ja2V0Lm9uKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkg
ewotICAgICAgdmFyIG1vZGVsTmFtZSA9IG1lc3NhZ2UubW9kZWw7Ci0gICAgICB2YXIgZGF0YSA9
IG1lc3NhZ2UuZGF0YTsKLSAgICAgIHZhciB0eXBlID0gc3RvcmUubW9kZWxGb3IobW9kZWxOYW1l
KTsKLSAgICAgIHZhciBzZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVL
ZXkpOwotICAgICAgdmFyIHJlY29yZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwg
ZGF0YSwgZ2V0KGRhdGEsICdpZCcpLCAnc2luZ2xlJyk7Ci0gICAgICBzdG9yZS5wdXNoKG1vZGVs
TmFtZSwgcmVjb3JkKTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXh0cmFjdAot
ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHBhcmFtIHtTdHJp
bmcgb3IgTnVtYmVyfSBpZAotICAgIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VHlwZQotICAgIEBy
ZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0
cmFjdDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSkgewot
ICAgIHRoaXMuZXh0cmFjdE1ldGEoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwotCi0gICAgdmFyIHNw
ZWNpZmljRXh0cmFjdCA9ICJleHRyYWN0IiArIHJlcXVlc3RUeXBlLmNoYXJBdCgwKS50b1VwcGVy
Q2FzZSgpICsgcmVxdWVzdFR5cGUuc3Vic3RyKDEpOwotICAgIHJldHVybiB0aGlzW3NwZWNpZmlj
RXh0cmFjdF0oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kQWxsYCBpcyBhIGhvb2sgaW50byB0aGUgZXh0cmFjdCBt
ZXRob2QgdXNlZCB3aGVuIGEKLSAgICBjYWxsIGlzIG1hZGUgdG8gYERTLlN0b3JlI2ZpbmRBbGxg
LiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCi0gICAgYWxpYXMgZm9yIFtleHRyYWN0QXJy
YXldKCNtZXRob2RfZXh0cmFjdEFycmF5KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmRBbGwK
LSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0Fy
cmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRy
YWN0RmluZEFsbDogYWxpYXNNZXRob2QoJ2V4dHJhY3RBcnJheScpLAotICAvKioKLSAgICBgZXh0
cmFjdEZpbmRRdWVyeWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hl
biBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kUXVlcnlgLiBCeSBkZWZhdWx0
IHRoaXMgbWV0aG9kIGlzIGFuCi0gICAgYWxpYXMgZm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2Rf
ZXh0cmFjdEFycmF5KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmRRdWVyeQotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7QXJyYXl9IGFycmF5
IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCi0gICovCi0gIGV4dHJhY3RGaW5kUXVl
cnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5k
TWFueWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAg
Y2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kTWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRo
b2QgaXMKLSAgICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkp
LgotCi0gICAgQG1ldGhvZCBleHRyYWN0RmluZE1hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBk
ZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0RmluZE1hbnk6IGFsaWFzTWV0aG9k
KCdleHRyYWN0QXJyYXknKSwKLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kSGFzTWFueWAgaXMgYSBo
b29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRl
IHRvIGBEUy5TdG9yZSNmaW5kSGFzTWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMKLSAg
ICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkpLgotCi0gICAg
QG1ldGhvZCBleHRyYWN0RmluZEhhc01hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlh
bGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0RmluZEhhc01hbnk6IGFsaWFzTWV0aG9kKCdl
eHRyYWN0QXJyYXknKSwKLQotICAvKioKLSAgICBgZXh0cmFjdENyZWF0ZVJlY29yZGAgaXMgYSBo
b29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRl
IHRvIGBEUy5TdG9yZSNjcmVhdGVSZWNvcmRgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzCi0g
ICAgYWxpYXMgZm9yIFtleHRyYWN0U2F2ZV0oI21ldGhvZF9leHRyYWN0U2F2ZSkuCi0KLSAgICBA
bWV0aG9kIGV4dHJhY3RDcmVhdGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBh
eWxvYWQKLSAgKi8KLSAgZXh0cmFjdENyZWF0ZVJlY29yZDogYWxpYXNNZXRob2QoJ2V4dHJhY3RT
YXZlJyksCi0gIC8qKgotICAgIGBleHRyYWN0VXBkYXRlUmVjb3JkYCBpcyBhIGhvb2sgaW50byB0
aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuCi0gICAgYSBjYWxsIGlzIG1hZGUgdG8gYERTLlN0
b3JlI3VwZGF0ZWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMgYWxpYXMKLSAgICBmb3IgW2V4
dHJhY3RTYXZlXSgjbWV0aG9kX2V4dHJhY3RTYXZlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdFVw
ZGF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAg
QHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9hZAotICAqLwotICBl
eHRyYWN0VXBkYXRlUmVjb3JkOiBhbGlhc01ldGhvZCgnZXh0cmFjdFNhdmUnKSwKLSAgLyoqCi0g
ICAgYGV4dHJhY3REZWxldGVSZWNvcmRgIGlzIGEgaG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhv
ZCB1c2VkIHdoZW4KLSAgICBhIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZGVsZXRlUmVjb3Jk
YC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNhdmVd
KCNtZXRob2RfZXh0cmFjdFNhdmUpLgotCi0gICAgQG1ldGhvZCBleHRyYWN0RGVsZXRlUmVjb3Jk
Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKLSAgICBAcmV0dXJuIHtP
YmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2FkCi0gICovCi0gIGV4dHJhY3REZWxl
dGVSZWNvcmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2F2ZScpLAotCi0gIC8qKgotICAgIGBleHRy
YWN0RmluZGAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAg
IGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhv
ZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xl
KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y
ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09i
amVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVk
IHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdEZpbmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xl
JyksCi0gIC8qKgotICAgIGBleHRyYWN0RmluZEJlbG9uZ3NUb2AgaXMgYSBob29rIGludG8gdGhl
IGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAgIGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9y
ZSNmaW5kQmVsb25nc1RvYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZv
ciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2Qg
ZXh0cmFjdEZpbmRCZWxvbmdzVG8KLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBw
YXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5
bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQK
LSAgKi8KLSAgZXh0cmFjdEZpbmRCZWxvbmdzVG86IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xl
JyksCi0gIC8qKgotICAgIGBleHRyYWN0U2F2ZWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3Qg
bWV0aG9kIHVzZWQgd2hlbiBhIGNhbGwKLSAgICBpcyBtYWRlIHRvIGBEUy5Nb2RlbCNzYXZlYC4g
QnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyBhbGlhcwotICAgIGZvciBbZXh0cmFjdFNpbmdsZV0o
I21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdFNhdmUKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0g
anNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdFNhdmU6IGFsaWFz
TWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCi0KLSAgLyoqCi0gICAgYGV4dHJhY3RTaW5nbGVgIGlz
IHVzZWQgdG8gZGVzZXJpYWxpemUgYSBzaW5nbGUgcmVjb3JkIHJldHVybmVkCi0gICAgZnJvbSB0
aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAu
UG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgZXh0cmFj
dFNpbmdsZTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICAgICAgcGF5bG9h
ZC5jb21tZW50cyA9IHBheWxvYWQuX2VtYmVkZGVkLmNvbW1lbnQ7Ci0gICAgICAgIGRlbGV0ZSBw
YXlsb2FkLl9lbWJlZGRlZDsKLQotICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5
cGUsIHBheWxvYWQpOwotICAgICAgfSwKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
ZXh0cmFjdFNpbmdsZQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtz
dWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0g
ICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9hZAotICAqLwot
ICBleHRyYWN0U2luZ2xlOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewotICAgIHJl
dHVybiB0aGlzLm5vcm1hbGl6ZSh0eXBlLCBwYXlsb2FkKTsKLSAgfSwKLQotICAvKioKLSAgICBg
ZXh0cmFjdEFycmF5YCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFuIGFycmF5IG9mIHJlY29yZHMK
LSAgICByZXR1cm5lZCBmcm9tIHRoZSBhZGFwdGVyLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBg
amF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4
dGVuZCh7Ci0gICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2Fk
KSB7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkLm1hcChmdW5jdGlvbihqc29uKSB7Ci0gICAgICAg
ICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNpbmdsZShqc29uKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RBcnJheQotICAg
IEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2Rl
bH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7QXJyYXl9
IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCi0gICovCi0gIGV4dHJhY3RB
cnJheTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICByZXR1cm4gdGhpcy5u
b3JtYWxpemUodHlwZSwgcGF5bG9hZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgYGV4dHJhY3RNZXRh
YCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFueSBtZXRhIGluZm9ybWF0aW9uIGluIHRoZQotICAg
IGFkYXB0ZXIgcGF5bG9hZC4gQnkgZGVmYXVsdCBFbWJlciBEYXRhIGV4cGVjdHMgbWV0YSBpbmZv
cm1hdGlvbiB0bwotICAgIGJlIGxvY2F0ZWQgb24gdGhlIGBtZXRhYCBwcm9wZXJ0eSBvZiB0aGUg
cGF5bG9hZCBvYmplY3QuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
QXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIGV4
dHJhY3RNZXRhOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewotICAgICAgICBpZiAo
cGF5bG9hZCAmJiBwYXlsb2FkLl9wYWdpbmF0aW9uKSB7Ci0gICAgICAgICAgc3RvcmUubWV0YUZv
clR5cGUodHlwZSwgcGF5bG9hZC5fcGFnaW5hdGlvbik7Ci0gICAgICAgICAgZGVsZXRlIHBheWxv
YWQuX3BhZ2luYXRpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIEBtZXRob2QgZXh0cmFjdE1ldGEKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAg
IEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0g
cGF5bG9hZAotICAqLwotICBleHRyYWN0TWV0YTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxv
YWQpIHsKLSAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLm1ldGEpIHsKLSAgICAgIHN0b3JlLm1l
dGFGb3JUeXBlKHR5cGUsIHBheWxvYWQubWV0YSk7Ci0gICAgICBkZWxldGUgcGF5bG9hZC5tZXRh
OwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgIGBrZXlGb3JBdHRyaWJ1dGVgIGNhbiBiZSB1c2Vk
IHRvIGRlZmluZSBydWxlcyBmb3IgaG93IHRvIGNvbnZlcnQgYW4KLSAgIGF0dHJpYnV0ZSBuYW1l
IGluIHlvdXIgbW9kZWwgdG8gYSBrZXkgaW4geW91ciBKU09OLgotCi0gICBFeGFtcGxlCi0KLSAg
IGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2Vy
aWFsaXplci5leHRlbmQoewotICAgICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIpIHsK
LSAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2Uo
KTsKLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgQG1ldGhvZCBrZXlGb3JBdHRyaWJ1dGUK
LSAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgIEByZXR1cm4ge1N0cmluZ30gbm9ybWFsaXplZCBr
ZXkKLSAgKi8KLQotCi0gIC8qKgotICAgYGtleUZvclJlbGF0aW9uc2hpcGAgY2FuIGJlIHVzZWQg
dG8gZGVmaW5lIGEgY3VzdG9tIGtleSB3aGVuCi0gICBzZXJpYWxpemluZyByZWxhdGlvbnNoaXAg
cHJvcGVydGllcy4gQnkgZGVmYXVsdCBgSlNPTlNlcmlhbGl6ZXJgCi0gICBkb2VzIG5vdCBwcm92
aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgotCi0gICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6
ZXIuZXh0ZW5kKHsKLSAgICAgIGtleUZvclJlbGF0aW9uc2hpcDogZnVuY3Rpb24oa2V5LCByZWxh
dGlvbnNoaXApIHsKLSAgICAgICAgIHJldHVybiAncmVsXycgKyBFbWJlci5TdHJpbmcudW5kZXJz
Y29yZShrZXkpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICBAbWV0aG9kIGtleUZv
clJlbGF0aW9uc2hpcAotICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgQHBhcmFtIHtTdHJpbmd9
IHJlbGF0aW9uc2hpcCB0eXBlCi0gICBAcmV0dXJuIHtTdHJpbmd9IG5vcm1hbGl6ZWQga2V5Ci0g
ICovCi0KLSAgLy8gSEVMUEVSUwotCi0gIC8qKgotICAgQG1ldGhvZCB0cmFuc2Zvcm1Gb3IKLSAg
IEBwcml2YXRlCi0gICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlVHlwZQotICAgQHBhcmFtIHtC
b29sZWFufSBza2lwQXNzZXJ0aW9uCi0gICBAcmV0dXJuIHtEUy5UcmFuc2Zvcm19IHRyYW5zZm9y
bQotICAqLwotICB0cmFuc2Zvcm1Gb3I6IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUsIHNraXBBc3Nl
cnRpb24pIHsKLSAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5jb250YWluZXIubG9va3VwKCd0cmFu
c2Zvcm06JyArIGF0dHJpYnV0ZVR5cGUpOwotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZp
bmQgdHJhbnNmb3JtIGZvciAnIiArIGF0dHJpYnV0ZVR5cGUgKyAiJyIsIHNraXBBc3NlcnRpb24g
fHwgISF0cmFuc2Zvcm0pOwotICAgIHJldHVybiB0cmFuc2Zvcm07Ci0gIH0KLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLXZh
ciBnZXQgPSBFbWJlci5nZXQsIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwg
dW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLCBEUyA9IHdpbmRvdy5EUyA7Ci0K
LS8qKgotICBFeHRlbmQgYEVtYmVyLkRhdGFBZGFwdGVyYCB3aXRoIEVEIHNwZWNpZmljIGNvZGUu
Ci0KLSAgQGNsYXNzIERlYnVnQWRhcHRlcgotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVt
YmVyLkRhdGFBZGFwdGVyCi0gIEBwcml2YXRlCi0qLwotRFMuRGVidWdBZGFwdGVyID0gRW1iZXIu
RGF0YUFkYXB0ZXIuZXh0ZW5kKHsKLSAgZ2V0RmlsdGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0
dXJuIFsKLSAgICAgIHsgbmFtZTogJ2lzTmV3JywgZGVzYzogJ05ldycgfSwKLSAgICAgIHsgbmFt
ZTogJ2lzTW9kaWZpZWQnLCBkZXNjOiAnTW9kaWZpZWQnIH0sCi0gICAgICB7IG5hbWU6ICdpc0Ns
ZWFuJywgZGVzYzogJ0NsZWFuJyB9Ci0gICAgXTsKLSAgfSwKLQotICBkZXRlY3Q6IGZ1bmN0aW9u
KGtsYXNzKSB7Ci0gICAgcmV0dXJuIGtsYXNzICE9PSBEUy5Nb2RlbCAmJiBEUy5Nb2RlbC5kZXRl
Y3Qoa2xhc3MpOwotICB9LAotCi0gIGNvbHVtbnNGb3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7Ci0g
ICAgdmFyIGNvbHVtbnMgPSBbeyBuYW1lOiAnaWQnLCBkZXNjOiAnSWQnIH1dLCBjb3VudCA9IDAs
IHNlbGYgPSB0aGlzOwotICAgIGdldCh0eXBlLCAnYXR0cmlidXRlcycpLmZvckVhY2goZnVuY3Rp
b24obmFtZSwgbWV0YSkgewotICAgICAgICBpZiAoY291bnQrKyA+IHNlbGYuYXR0cmlidXRlTGlt
aXQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIHZhciBkZXNjID0gY2FwaXRhbGl6ZSh1bmRl
cnNjb3JlKG5hbWUpLnJlcGxhY2UoJ18nLCAnICcpKTsKLSAgICAgICAgY29sdW1ucy5wdXNoKHsg
bmFtZTogbmFtZSwgZGVzYzogZGVzYyB9KTsKLSAgICB9KTsKLSAgICByZXR1cm4gY29sdW1uczsK
LSAgfSwKLQotICBnZXRSZWNvcmRzOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgcmV0dXJuIHRoaXMu
Z2V0KCdzdG9yZScpLmFsbCh0eXBlKTsKLSAgfSwKLQotICBnZXRSZWNvcmRDb2x1bW5WYWx1ZXM6
IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciBzZWxmID0gdGhpcywgY291bnQgPSAwLAotICAg
ICAgICBjb2x1bW5WYWx1ZXMgPSB7IGlkOiBnZXQocmVjb3JkLCAnaWQnKSB9OwotCi0gICAgcmVj
b3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBpZiAoY291bnQrKyA+IHNl
bGYuYXR0cmlidXRlTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAg
ICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICAgIGNvbHVtblZhbHVlc1trZXld
ID0gdmFsdWU7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIGNvbHVtblZhbHVlczsKLSAgfSwKLQotICBn
ZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFyIGtleXdvcmRzID0g
W10sIGtleXMgPSBFbWJlci5BKFsnaWQnXSk7Ci0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVu
Y3Rpb24oa2V5KSB7Ci0gICAgICBrZXlzLnB1c2goa2V5KTsKLSAgICB9KTsKLSAgICBrZXlzLmZv
ckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBrZXl3b3Jkcy5wdXNoKGdldChyZWNvcmQsIGtl
eSkpOwotICAgIH0pOwotICAgIHJldHVybiBrZXl3b3JkczsKLSAgfSwKLQotICBnZXRSZWNvcmRG
aWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJldHVybiB7Ci0gICAgICBpc05l
dzogcmVjb3JkLmdldCgnaXNOZXcnKSwKLSAgICAgIGlzTW9kaWZpZWQ6IHJlY29yZC5nZXQoJ2lz
RGlydHknKSAmJiAhcmVjb3JkLmdldCgnaXNOZXcnKSwKLSAgICAgIGlzQ2xlYW46ICFyZWNvcmQu
Z2V0KCdpc0RpcnR5JykKLSAgICB9OwotICB9LAotCi0gIGdldFJlY29yZENvbG9yOiBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICB2YXIgY29sb3IgPSAnYmxhY2snOwotICAgIGlmIChyZWNvcmQuZ2V0
KCdpc05ldycpKSB7Ci0gICAgICBjb2xvciA9ICdncmVlbic7Ci0gICAgfSBlbHNlIGlmIChyZWNv
cmQuZ2V0KCdpc0RpcnR5JykpIHsKLSAgICAgIGNvbG9yID0gJ2JsdWUnOwotICAgIH0KLSAgICBy
ZXR1cm4gY29sb3I7Ci0gIH0sCi0KLSAgb2JzZXJ2ZVJlY29yZDogZnVuY3Rpb24ocmVjb3JkLCBy
ZWNvcmRVcGRhdGVkKSB7Ci0gICAgdmFyIHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgpLCBzZWxm
ID0gdGhpcywKLSAgICAgICAga2V5c1RvT2JzZXJ2ZSA9IEVtYmVyLkEoWydpZCcsICdpc05ldycs
ICdpc0RpcnR5J10pOwotCi0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7
Ci0gICAgICBrZXlzVG9PYnNlcnZlLnB1c2goa2V5KTsKLSAgICB9KTsKLQotICAgIGtleXNUb09i
c2VydmUuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKLSAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rp
b24oKSB7Ci0gICAgICAgIHJlY29yZFVwZGF0ZWQoc2VsZi53cmFwUmVjb3JkKHJlY29yZCkpOwot
ICAgICAgfTsKLSAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsK
LSAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJl
bW92ZU9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsKLSAgICAgIH0pOwotICAgIH0pOwot
Ci0gICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigpIHsKLSAgICAgIHJlbGVhc2VNZXRob2RzLmZv
ckVhY2goZnVuY3Rpb24oZm4pIHsgZm4oKTsgfSApOwotICAgIH07Ci0KLSAgICByZXR1cm4gcmVs
ZWFzZTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBU
aGUgYERTLlRyYW5zZm9ybWAgY2xhc3MgaXMgdXNlZCB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFs
aXplIG1vZGVsCi0gIGF0dHJpYnV0ZXMgd2hlbiB0aGV5IGFyZSBzYXZlZCBvciBsb2FkZWQgZnJv
bSBhbgotICBhZGFwdGVyLiBTdWJjbGFzc2luZyBgRFMuVHJhbnNmb3JtYCBpcyB1c2VmdWwgZm9y
IGNyZWF0aW5nIGN1c3RvbQotICBhdHRyaWJ1dGVzLiBBbGwgc3ViY2xhc3NlcyBvZiBgRFMuVHJh
bnNmb3JtYCBtdXN0IGltcGxlbWVudCBhCi0gIGBzZXJpYWxpemVgIGFuZCBhIGBkZXNlcmlhbGl6
ZWAgbWV0aG9kLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5SYXdUcmFu
c2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24o
c2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSwKLSAgICBzZXJp
YWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIGRlc2VyaWFsaXpl
ZDsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBVc2FnZQotCi0gIGBgYGphdmFzY3JpcHQKLSAg
dmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuUmVxdWlyZW1lbnQgPSBEUy5Nb2RlbC5leHRlbmQo
ewotICAgIG5hbWU6IGF0dHIoJ3N0cmluZycpLAotICAgIG9wdGlvbnNBcnJheTogYXR0cigncmF3
JykKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBUcmFuc2Zvcm0KLSAgQG5hbWVzcGFjZSBEUwot
ICovCi1EUy5UcmFuc2Zvcm0gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgLyoqCi0gICAgV2hl
biBnaXZlbiBhIGRlc2VyaWFsaXplZCB2YWx1ZSBmcm9tIGEgcmVjb3JkIGF0dHJpYnV0ZSB0aGlz
Ci0gICAgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzZXJpYWxpemVkIHZhbHVlLgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJp
YWxpemVkKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuaXNFbXB0eShkZXNlcmlhbGl6ZWQpID8gbnVs
bCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICAgIH0KLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
c2VyaWFsaXplCi0gICAgQHBhcmFtIGRlc2VyaWFsaXplZCBUaGUgZGVzZXJpYWxpemVkIHZhbHVl
Ci0gICAgQHJldHVybiBUaGUgc2VyaWFsaXplZCB2YWx1ZQotICAqLwotICBzZXJpYWxpemU6IEVt
YmVyLnJlcXVpcmVkKCksCi0KLSAgLyoqCi0gICAgV2hlbiBnaXZlbiBhIHNlcmlhbGl6ZSB2YWx1
ZSBmcm9tIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRob2QgbXVzdAotICAgIHJldHVybiB0aGUgZGVz
ZXJpYWxpemVkIHZhbHVlIGZvciB0aGUgcmVjb3JkIGF0dHJpYnV0ZS4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXpl
ZCkgewotICAgICAgcmV0dXJuIGVtcHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJp
YWxpemVkKTsKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRlc2VyaWFsaXplCi0gICAg
QHBhcmFtIHNlcmlhbGl6ZWQgVGhlIHNlcmlhbGl6ZWQgdmFsdWUKLSAgICBAcmV0dXJuIFRoZSBk
ZXNlcmlhbGl6ZWQgdmFsdWUKLSAgKi8KLSAgZGVzZXJpYWxpemU6IEVtYmVyLnJlcXVpcmVkKCkK
LQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLS8qKgotICBUaGUgYERTLkJv
b2xlYW5UcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6
ZQotICBib29sZWFuIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0YSByZWNvcmQgb2JqZWN0cy4gVGhp
cyB0cmFuc2Zvcm0gaXMKLSAgdXNlZCB3aGVuIGBib29sZWFuYCBpcyBwYXNzZWQgYXMgdGhlIHR5
cGUgcGFyYW1ldGVyIHRvIHRoZQotICBbRFMuYXR0cl0oLi4vLi4vZGF0YSNtZXRob2RfYXR0cikg
ZnVuY3Rpb24uCi0KLSAgVXNhZ2UKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBhdHRyID0gRFMu
YXR0cjsKLSAgQXBwLlVzZXIgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIGlzQWRtaW46IGF0dHIo
J2Jvb2xlYW4nKSwKLSAgICBuYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICBlbWFpbDogYXR0cign
c3RyaW5nJykKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBCb29sZWFuVHJhbnNmb3JtCi0gIEBl
eHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNlIERTCi0gKi8KLURTLkJvb2xlYW5UcmFu
c2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKLSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNl
cmlhbGl6ZWQpIHsKLSAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwotCi0gICAgaWYg
KHR5cGUgPT09ICJib29sZWFuIikgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSBl
bHNlIGlmICh0eXBlID09PSAic3RyaW5nIikgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQubWF0
Y2goL150cnVlJHxedCR8XjEkL2kpICE9PSBudWxsOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PT0g
Im51bWJlciIpIHsKLSAgICAgIHJldHVybiBzZXJpYWxpemVkID09PSAxOwotICAgIH0gZWxzZSB7
Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9LAotCi0gIHNlcmlhbGl6ZTogZnVuY3Rp
b24oZGVzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIEJvb2xlYW4oZGVzZXJpYWxpemVkKTsKLSAg
fQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgVGhlIGBEUy5EYXRl
VHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKLSAg
ZGF0ZSBhdHRyaWJ1dGVzIG9uIEVtYmVyIERhdGEgcmVjb3JkIG9iamVjdHMuIFRoaXMgdHJhbnNm
b3JtIGlzIHVzZWQKLSAgd2hlbiBgZGF0ZWAgaXMgcGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRl
ciB0byB0aGUKLSAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuU2NvcmUgPSBE
Uy5Nb2RlbC5leHRlbmQoewotICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKLSAgICBwbGF5ZXI6
IERTLmJlbG9uZ3NUbygncGxheWVyJyksCi0gICAgZGF0ZTogYXR0cignZGF0ZScpCi0gIH0pOwot
ICBgYGAKLQotICBAY2xhc3MgRGF0ZVRyYW5zZm9ybQotICBAZXh0ZW5kcyBEUy5UcmFuc2Zvcm0K
LSAgQG5hbWVzcGFjZSBEUwotICovCi1EUy5EYXRlVHJhbnNmb3JtID0gRFMuVHJhbnNmb3JtLmV4
dGVuZCh7Ci0KLSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKLSAgICB2YXIg
dHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwotCi0gICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKSB7
Ci0gICAgICByZXR1cm4gbmV3IERhdGUoRW1iZXIuRGF0ZS5wYXJzZShzZXJpYWxpemVkKSk7Ci0g
ICAgfSBlbHNlIGlmICh0eXBlID09PSAibnVtYmVyIikgewotICAgICAgcmV0dXJuIG5ldyBEYXRl
KHNlcmlhbGl6ZWQpOwotICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCB8fCBzZXJp
YWxpemVkID09PSB1bmRlZmluZWQpIHsKLSAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJl
c2VudCBpbiB0aGUgZGF0YSwKLSAgICAgIC8vIHJldHVybiB1bmRlZmluZWQsIG5vdCBudWxsLgot
ICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxs
OwotICAgIH0KLSAgfSwKLQotICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRhdGUpIHsKLSAgICBpZiAo
ZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAgIC8vIFNlcmlhbGl6ZSBpdCBhcyBhIG51bWJl
ciB0byBtYWludGFpbiBtaWxsaXNlY29uZCBwcmVjaXNpb24KLSAgICAgIHJldHVybiBOdW1iZXIo
ZGF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi19
KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBlbXB0eSA9IEVtYmVyLmlzRW1w
dHk7Ci0vKioKLSAgVGhlIGBEUy5OdW1iZXJUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2Vy
aWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICBudW1lcmljIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0
YSByZWNvcmQgb2JqZWN0cy4gVGhpcyB0cmFuc2Zvcm0gaXMKLSAgdXNlZCB3aGVuIGBudW1iZXJg
IGlzIHBhc3NlZCBhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgdG8gdGhlCi0gIFtEUy5hdHRyXSguLi8u
Li9kYXRhI21ldGhvZF9hdHRyKSBmdW5jdGlvbi4KLQotICBVc2FnZQotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuU2NvcmUgPSBEUy5Nb2RlbC5leHRlbmQo
ewotICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKLSAgICBwbGF5ZXI6IERTLmJlbG9uZ3NUbygn
cGxheWVyJyksCi0gICAgZGF0ZTogYXR0cignZGF0ZScpCi0gIH0pOwotICBgYGAKLQotICBAY2xh
c3MgTnVtYmVyVHJhbnNmb3JtCi0gIEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNl
IERTCi0gKi8KLURTLk51bWJlclRyYW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQoewotCi0g
IGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIGVtcHR5KHNl
cmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsKLSAgfSwKLQotICBzZXJpYWxp
emU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgewotICAgIHJldHVybiBlbXB0eShkZXNlcmlhbGl6
ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLXZhciBub25lID0gRW1iZXIuaXNOb25lOwotCi0vKioKLSAgVGhl
IGBEUy5TdHJpbmdUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNl
cmlhbGl6ZQotICBzdHJpbmcgYXR0cmlidXRlcyBvbiBFbWJlciBEYXRhIHJlY29yZCBvYmplY3Rz
LiBUaGlzIHRyYW5zZm9ybSBpcwotICB1c2VkIHdoZW4gYHN0cmluZ2AgaXMgcGFzc2VkIGFzIHRo
ZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKLSAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0
dHIpIGZ1bmN0aW9uLgotCi0gIFVzYWdlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgYXR0ciA9
IERTLmF0dHI7Ci0gIEFwcC5Vc2VyID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBpc0FkbWluOiBh
dHRyKCdib29sZWFuJyksCi0gICAgbmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgZW1haWw6IGF0
dHIoJ3N0cmluZycpCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgU3RyaW5nVHJhbnNmb3JtCi0g
IEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNlIERTCi0gKi8KLURTLlN0cmluZ1Ry
YW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQoewotCi0gIGRlc2VyaWFsaXplOiBmdW5jdGlv
bihzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIG5vbmUoc2VyaWFsaXplZCkgPyBudWxsIDogU3Ry
aW5nKHNlcmlhbGl6ZWQpOwotICB9LAotCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxp
emVkKSB7Ci0gICAgcmV0dXJuIG5vbmUoZGVzZXJpYWxpemVkKSA/IG51bGwgOiBTdHJpbmcoZGVz
ZXJpYWxpemVkKTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSov
Ci0KLXZhciBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qCi0gIFRoaXMgY29kZSByZWdpc3RlcnMgYW4g
aW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlvbi4KLQotICBJZiBhbiBFbWJlci5qcyBkZXZl
bG9wZXIgZGVmaW5lcyBhIHN1YmNsYXNzIG9mIERTLlN0b3JlIG9uIHRoZWlyIGFwcGxpY2F0aW9u
LAotICB0aGlzIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlIGl0IGFuZCBtYWtl
IGl0IGF2YWlsYWJsZSBvbiB0aGUKLSAgcm91dGVyLgotCi0gIEFkZGl0aW9uYWxseSwgYWZ0ZXIg
YW4gYXBwbGljYXRpb24ncyBjb250cm9sbGVycyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHRoZXkgd2ls
bAotICBlYWNoIGhhdmUgdGhlIHN0b3JlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZW0uCi0KLSAgRm9y
IGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93
aW5nIGNsYXNzZXM6Ci0KLSAgQXBwLlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKHsKLSAgICBhZGFw
dGVyOiAnY3VzdG9tJwotICB9KTsKLQotICBBcHAuUG9zdHNDb250cm9sbGVyID0gRW1iZXIuQXJy
YXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgLy8gLi4uCi0gIH0pOwotCi0gIFdoZW4gdGhlIGFw
cGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLCBgQXBwLlN0b3JlYCB3aWxsIGF1dG9tYXRpY2FsbHkg
YmUKLSAgaW5zdGFudGlhdGVkLCBhbmQgdGhlIGluc3RhbmNlIG9mIGBBcHAuUG9zdHNDb250cm9s
bGVyYCB3aWxsIGhhdmUgaXRzIGBzdG9yZWAKLSAgcHJvcGVydHkgc2V0IHRvIHRoYXQgaW5zdGFu
Y2UuCi0KLSAgTm90ZSB0aGF0IHRoaXMgY29kZSB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBgZW1i
ZXItYXBwbGljYXRpb25gIHBhY2thZ2UgaXMKLSAgbG9hZGVkLiBJZiBFbWJlciBEYXRhIGlzIGJl
aW5nIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgb3RoZXIgdGhhbiBhCi0gIHR5cGljYWwgYXBwbGlj
YXRpb24gKGUuZy4sIG5vZGUuanMgd2hlcmUgb25seSBgZW1iZXItcnVudGltZWAgaXMgYXZhaWxh
YmxlKSwKLSAgdGhpcyBjb2RlIHdpbGwgYmUgaWdub3JlZC4KLSovCi0KLUVtYmVyLm9uTG9hZCgn
RW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewotICBBcHBsaWNhdGlv
bi5pbml0aWFsaXplcih7Ci0gICAgbmFtZTogInN0b3JlIiwKLQotICAgIGluaXRpYWxpemU6IGZ1
bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lz
dGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRpb24uU3RvcmUgfHwgRFMuU3RvcmUpOwotCi0gICAg
ICAvLyBhbGxvdyBvbGRlciBuYW1lcyB0byBiZSBsb29rZWQgdXAKLQotICAgICAgdmFyIHByb3h5
ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7Ci0gICAgICBwcm94eS5yZWdpc3Rl
ckRlcHJlY2F0aW9ucyhbCi0gICAgICAgIHtkZXByZWNhdGVkOiAnc2VyaWFsaXplcjpfZGVmYXVs
dCcsICB2YWxpZDogJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnfSwKLSAgICAgICAge2RlcHJlY2F0ZWQ6
ICdzZXJpYWxpemVyOl9yZXN0JywgICAgIHZhbGlkOiAnc2VyaWFsaXplcjotcmVzdCd9LAotICAg
ICAgICB7ZGVwcmVjYXRlZDogJ2FkYXB0ZXI6X3Jlc3QnLCAgICAgICAgdmFsaWQ6ICdhZGFwdGVy
Oi1yZXN0J30KLSAgICAgIF0pOwotCi0gICAgICAvLyBuZXcgZ28gZm9yd2FyZCBwYXRocwotICAg
ICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnLCBEUy5KU09OU2Vy
aWFsaXplcik7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjotcmVzdCcs
IERTLlJFU1RTZXJpYWxpemVyKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVy
Oi1yZXN0JywgRFMuUkVTVEFkYXB0ZXIpOwotCi0gICAgICAvLyBFYWdlcmx5IGdlbmVyYXRlIHRo
ZSBzdG9yZSBzbyBkZWZhdWx0U3RvcmUgaXMgcG9wdWxhdGVkLgotICAgICAgLy8gVE9ETzogRG8g
dGhpcyBpbiBhIGZpbmlzaGVyIGhvb2sKLSAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3N0b3JlOm1h
aW4nKTsKLSAgICB9Ci0gIH0pOwotCi0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBu
YW1lOiAidHJhbnNmb3JtcyIsCi0gICAgYmVmb3JlOiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgYXBwbGljYXRpb24u
cmVnaXN0ZXIoJ3RyYW5zZm9ybTpib29sZWFuJywgRFMuQm9vbGVhblRyYW5zZm9ybSk7Ci0gICAg
ICBhcHBsaWNhdGlvbi5yZWdpc3RlcigndHJhbnNmb3JtOmRhdGUnLCBEUy5EYXRlVHJhbnNmb3Jt
KTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06bnVtYmVyJywgRFMuTnVt
YmVyVHJhbnNmb3JtKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06c3Ry
aW5nJywgRFMuU3RyaW5nVHJhbnNmb3JtKTsKLSAgICB9Ci0gIH0pOwotCi0gIEFwcGxpY2F0aW9u
LmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAiZGF0YS1hZGFwdGVyIiwKLSAgICBiZWZvcmU6ICJz
dG9yZSIsCi0KLSAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9u
KSB7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YS1hZGFwdGVyOm1haW4nLCBEUy5E
ZWJ1Z0FkYXB0ZXIpOwotICAgIH0KLSAgfSk7Ci0KLSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIo
ewotICAgIG5hbWU6ICJpbmplY3RTdG9yZSIsCi0gICAgYmVmb3JlOiAic3RvcmUiLAotCi0gICAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgYXBw
bGljYXRpb24uaW5qZWN0KCdjb250cm9sbGVyJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAg
ICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91dGUnLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwot
ICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdzZXJpYWxpemVyJywgJ3N0b3JlJywgJ3N0b3JlOm1h
aW4nKTsKLSAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgnZGF0YS1hZGFwdGVyJywgJ3N0b3JlJywg
J3N0b3JlOm1haW4nKTsKLSAgICB9Ci0gIH0pOwotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLS8qKgotICBEYXRlLnBh
cnNlIHdpdGggcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQgZm9yIElTTyA4NjAxIDxodHRwczovL2dp
dGh1Yi5jb20vY3Nub3Zlci9qcy1pc284NjAxPgotCi0gIMKpIDIwMTEgQ29saW4gU25vdmVyIDxo
dHRwOi8vemV0YWZsZWV0LmNvbT4KLQotICBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS4KLQot
ICBAY2xhc3MgRGF0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBzdGF0aWMKLSovCi1FbWJlci5E
YXRlID0gRW1iZXIuRGF0ZSB8fCB7fTsKLQotdmFyIG9yaWdQYXJzZSA9IERhdGUucGFyc2UsIG51
bWVyaWNLZXlzID0gWyAxLCA0LCA1LCA2LCA3LCAxMCwgMTEgXTsKLQotLyoqCi0gIEBtZXRob2Qg
cGFyc2UKLSAgQHBhcmFtIGRhdGUKLSovCi1FbWJlci5EYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRh
dGUpIHsKLSAgICB2YXIgdGltZXN0YW1wLCBzdHJ1Y3QsIG1pbnV0ZXNPZmZzZXQgPSAwOwotCi0g
ICAgLy8gRVM1IMKnMTUuOS40LjIgc3RhdGVzIHRoYXQgdGhlIHN0cmluZyBzaG91bGQgYXR0ZW1w
dCB0byBiZSBwYXJzZWQgYXMgYSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdCBzdHJpbmcKLSAgICAv
LyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGFueSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRl
IHBhcnNpbmcsIHNvIHRoYXTigJlzIHdoYXQgd2UgZG8sIGV2ZW4gaWYgbmF0aXZlCi0gICAgLy8g
aW1wbGVtZW50YXRpb25zIGNvdWxkIGJlIGZhc3RlcgotICAgIC8vICAgICAgICAgICAgICAxIFlZ
WVkgICAgICAgICAgICAgICAgMiBNTSAgICAgICAzIEREICAgICAgICAgICA0IEhIICAgIDUgbW0g
ICAgICAgNiBzcyAgICAgICAgNyBtc2VjICAgICAgICA4IFogOSDCsSAgICAxMCB0ekhIICAgIDEx
IHR6bW0KLSAgICBpZiAoKHN0cnVjdCA9IC9eKFxkezR9fFsrXC1dXGR7Nn0pKD86LShcZHsyfSko
PzotKFxkezJ9KSk/KT8oPzpUKFxkezJ9KTooXGR7Mn0pKD86OihcZHsyfSkoPzpcLihcZHszfSkp
Pyk/KD86KFopfChbK1wtXSkoXGR7Mn0pKD86OihcZHsyfSkpPyk/KT8kLy5leGVjKGRhdGUpKSkg
ewotICAgICAgICAvLyBhdm9pZCBOYU4gdGltZXN0YW1wcyBjYXVzZWQgYnkg4oCcdW5kZWZpbmVk
4oCdIHZhbHVlcyBiZWluZyBwYXNzZWQgdG8gRGF0ZS5VVEMKLSAgICAgICAgZm9yICh2YXIgaSA9
IDAsIGs7IChrID0gbnVtZXJpY0tleXNbaV0pOyArK2kpIHsKLSAgICAgICAgICAgIHN0cnVjdFtr
XSA9ICtzdHJ1Y3Rba10gfHwgMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFsbG93IHVuZGVm
aW5lZCBkYXlzIGFuZCBtb250aHMKLSAgICAgICAgc3RydWN0WzJdID0gKCtzdHJ1Y3RbMl0gfHwg
MSkgLSAxOwotICAgICAgICBzdHJ1Y3RbM10gPSArc3RydWN0WzNdIHx8IDE7Ci0KLSAgICAgICAg
aWYgKHN0cnVjdFs4XSAhPT0gJ1onICYmIHN0cnVjdFs5XSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAg
ICAgICAgICBtaW51dGVzT2Zmc2V0ID0gc3RydWN0WzEwXSAqIDYwICsgc3RydWN0WzExXTsKLQot
ICAgICAgICAgICAgaWYgKHN0cnVjdFs5XSA9PT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgbWlu
dXRlc09mZnNldCA9IDAgLSBtaW51dGVzT2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5VVEMoc3RydWN0WzFdLCBzdHJ1Y3RbMl0sIHN0
cnVjdFszXSwgc3RydWN0WzRdLCBzdHJ1Y3RbNV0gKyBtaW51dGVzT2Zmc2V0LCBzdHJ1Y3RbNl0s
IHN0cnVjdFs3XSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB0aW1lc3RhbXAgPSBvcmln
UGFyc2UgPyBvcmlnUGFyc2UoZGF0ZSkgOiBOYU47Ci0gICAgfQotCi0gICAgcmV0dXJuIHRpbWVz
dGFtcDsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5EYXRlKSB7Ci0gIERhdGUucGFyc2UgPSBFbWJlci5EYXRlLnBh
cnNlOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQSByZWNvcmQgYXJyYXkgaXMgYW4g
YXJyYXkgdGhhdCBjb250YWlucyByZWNvcmRzIG9mIGEgY2VydGFpbiB0eXBlLiBUaGUgcmVjb3Jk
Ci0gIGFycmF5IG1hdGVyaWFsaXplcyByZWNvcmRzIGFzIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHJl
dHJpZXZlZCBmb3IgdGhlIGZpcnN0Ci0gIHRpbWUuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSByZWNv
cmQgYXJyYXlzIHlvdXJzZWxmLiBJbnN0ZWFkLCBhbiBpbnN0YW5jZSBvZgotICBgRFMuUmVjb3Jk
QXJyYXlgIG9yIGl0cyBzdWJjbGFzc2VzIHdpbGwgYmUgcmV0dXJuZWQgYnkgeW91ciBhcHBsaWNh
dGlvbidzIHN0b3JlCi0gIGluIHJlc3BvbnNlIHRvIHF1ZXJpZXMuCi0KLSAgQGNsYXNzIFJlY29y
ZEFycmF5Ci0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIuQXJyYXlQcm94eQotICBA
dXNlcyBFbWJlci5FdmVudGVkCi0qLwotCi1EUy5SZWNvcmRBcnJheSA9IEVtYmVyLkFycmF5UHJv
eHkuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLSAgLyoqCi0gICAgVGhlIG1vZGVsIHR5cGUgY29u
dGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5LgotCi0gICAgQHByb3BlcnR5IHR5cGUKLSAgICBA
dHlwZSBEUy5Nb2RlbAotICAqLwotICB0eXBlOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBhcnJh
eSBvZiBjbGllbnQgaWRzIGJhY2tpbmcgdGhlIHJlY29yZCBhcnJheS4gV2hlbiBhCi0gICAgcmVj
b3JkIGlzIHJlcXVlc3RlZCBmcm9tIHRoZSByZWNvcmQgYXJyYXksIHRoZSByZWNvcmQKLSAgICBm
b3IgdGhlIGNsaWVudCBpZCBhdCB0aGUgc2FtZSBpbmRleCBpcyBtYXRlcmlhbGl6ZWQsIGlmCi0g
ICAgbmVjZXNzYXJ5LCBieSB0aGUgc3RvcmUuCi0KLSAgICBAcHJvcGVydHkgY29udGVudAotICAg
IEBwcml2YXRlCi0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAgKi8KLSAgY29udGVudDogbnVsbCwK
LQotICAvKioKLSAgICBUaGUgZmxhZyB0byBzaWduYWwgYSBgUmVjb3JkQXJyYXlgIGlzIGN1cnJl
bnRseSBsb2FkaW5nIGRhdGEuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIHBlb3BsZSA9IHN0b3JlLmFsbChBcHAuUGVyc29uKTsKLSAgICBwZW9wbGUuZ2V0KCdp
c0xvYWRlZCcpOyAvLyB0cnVlCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkZWQKLSAg
ICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGlzTG9hZGVkOiBmYWxzZSwKLSAgLyoqCi0gICAgVGhl
IGZsYWcgdG8gc2lnbmFsIGEgYFJlY29yZEFycmF5YCBpcyBjdXJyZW50bHkgbG9hZGluZyBkYXRh
LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwZW9wbGUgPSBz
dG9yZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBm
YWxzZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7
IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBpc1VwZGF0aW5nCi0gICAgQHR5cGUg
Qm9vbGVhbgotICAqLwotICBpc1VwZGF0aW5nOiBmYWxzZSwKLQotICAvKioKLSAgICBUaGUgc3Rv
cmUgdGhhdCBjcmVhdGVkIHRoaXMgcmVjb3JkIGFycmF5LgotCi0gICAgQHByb3BlcnR5IHN0b3Jl
Ci0gICAgQHByaXZhdGUKLSAgICBAdHlwZSBEUy5TdG9yZQotICAqLwotICBzdG9yZTogbnVsbCwK
LQotICAvKioKLSAgICBSZXRyaWV2ZXMgYW4gb2JqZWN0IGZyb20gdGhlIGNvbnRlbnQgYnkgaW5k
ZXguCi0KLSAgICBAbWV0aG9kIG9iamVjdEF0Q29udGVudAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtOdW1iZXJ9IGluZGV4Ci0gICAgQHJldHVybiB7RFMuTW9kZWx9IHJlY29yZAotICAqLwot
ICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBn
ZXQodGhpcywgJ2NvbnRlbnQnKTsKLQotICAgIHJldHVybiBjb250ZW50Lm9iamVjdEF0KGluZGV4
KTsKLSAgfSwKLQotICAvKioKLSAgICBVc2VkIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2Yg
YWxsIG9mIHRoZSByZWNvcmRzIGluIHRoaXMgYXJyYXkKLSAgICBmcm9tIHRoZSBhZGFwdGVyLgot
Ci0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwZW9wbGUgPSBzdG9y
ZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBmYWxz
ZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7IC8v
IHRydWUKLSAgICBgYGAKLQotICAgIEBtZXRob2QgdXBkYXRlCi0gICovCi0gIHVwZGF0ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNVcGRhdGluZycpKSB7IHJldHVybjsgfQot
Ci0gICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLAotICAgICAgICB0eXBlID0gZ2V0
KHRoaXMsICd0eXBlJyk7Ci0KLSAgICByZXR1cm4gc3RvcmUuZmV0Y2hBbGwodHlwZSwgdGhpcyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBhIHJlY29yZCB0byB0aGUgYFJlY29yZEFycmF5YC4K
LQotICAgIEBtZXRob2QgYWRkUmVjb3JkCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQKLSAgKi8KLSAgYWRkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICBn
ZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3QocmVjb3JkKTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZW1vdmVzIGEgcmVjb3JkIHRvIHRoZSBgUmVjb3JkQXJyYXlgLgotCi0gICAgQG1ldGhvZCBy
ZW1vdmVSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAot
ICAqLwotICByZW1vdmVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGdldCh0aGlzLCAn
Y29udGVudCcpLnJlbW92ZU9iamVjdChyZWNvcmQpOwotICB9LAotCi0gIC8qKgotICAgIFNhdmVz
IGFsbCBvZiB0aGUgcmVjb3JkcyBpbiB0aGUgYFJlY29yZEFycmF5YC4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgbWVzc2FnZXMgPSBzdG9yZS5hbGwoQXBwLk1l
c3NhZ2UpOwotICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgewotICAgICAg
bWVzc2FnZS5zZXQoJ2hhc0JlZW5TZWVuJywgdHJ1ZSk7Ci0gICAgfSk7Ci0gICAgbWVzc2FnZXMu
c2F2ZSgpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzYXZlCi0gICAgQHJldHVybiB7RFMuUHJv
bWlzZUFycmF5fSBwcm9taXNlCi0gICovCi0gIHNhdmU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBw
cm9taXNlTGFiZWwgPSAiRFM6IFJlY29yZEFycmF5I3NhdmUgIiArIGdldCh0aGlzLCAndHlwZScp
OwotICAgIHZhciBwcm9taXNlID0gRW1iZXIuUlNWUC5hbGwodGhpcy5pbnZva2UoInNhdmUiKSwg
cHJvbWlzZUxhYmVsKS50aGVuKGZ1bmN0aW9uKGFycmF5KSB7Ci0gICAgICByZXR1cm4gRW1iZXIu
QShhcnJheSk7Ci0gICAgfSwgbnVsbCwgIkRTOiBSZWNvcmRBcnJheSNzYXZlIGFwcGx5IEVtYmVy
Lk5hdGl2ZUFycmF5Iik7Ci0KLSAgICByZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHBy
b21pc2U6IHByb21pc2UgfSk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldDsK
LQotLyoqCi0gIFJlcHJlc2VudHMgYSBsaXN0IG9mIHJlY29yZHMgd2hvc2UgbWVtYmVyc2hpcCBp
cyBkZXRlcm1pbmVkIGJ5IHRoZQotICBzdG9yZS4gQXMgcmVjb3JkcyBhcmUgY3JlYXRlZCwgbG9h
ZGVkLCBvciBtb2RpZmllZCwgdGhlIHN0b3JlCi0gIGV2YWx1YXRlcyB0aGVtIHRvIGRldGVybWlu
ZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQKLSAgYXJyYXkuCi0KLSAgQGNs
YXNzIEZpbHRlcmVkUmVjb3JkQXJyYXkKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5S
ZWNvcmRBcnJheQotKi8KLURTLkZpbHRlcmVkUmVjb3JkQXJyYXkgPSBEUy5SZWNvcmRBcnJheS5l
eHRlbmQoewotICAvKioKLSAgICBUaGUgZmlsdGVyRnVuY3Rpb24gaXMgYSBmdW5jdGlvbiB1c2Vk
IHRvIHRlc3QgcmVjb3JkcyBmcm9tIHRoZSBzdG9yZSB0bwotICAgIGRldGVybWluZSBpZiB0aGV5
IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQgYXJyYXkuCi0KLSAgICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFsbFBlb3BsZSA9IHN0b3JlLmFsbCgncGVyc29uJyk7
Ci0gICAgYWxsUGVvcGxlLm1hcEJ5KCduYW1lJyk7IC8vIFsiVG9tIERhbGUiLCAiWWVodWRhIEth
dHoiLCAiVHJlayBHbG93YWNraSJdCi0KLSAgICB2YXIgcGVvcGxlID0gc3RvcmUuZmlsdGVyKCdw
ZXJzb24nLCBmdW5jdGlvbihwZXJzb24pIHsKLSAgICAgIGlmIChwZXJzb24uZ2V0KCduYW1lJyku
bWF0Y2goL0thdHokLykpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB9KTsKLSAgICBwZW9wbGUubWFw
QnkoJ25hbWUnKTsgLy8gWyJZZWh1ZGEgS2F0eiJdCi0KLSAgICB2YXIgbm90S2F0ekZpbHRlciA9
IGZ1bmN0aW9uKHBlcnNvbikgewotICAgICAgcmV0dXJuICFwZXJzb24uZ2V0KCduYW1lJykubWF0
Y2goL0thdHokLyk7Ci0gICAgfTsKLSAgICBwZW9wbGUuc2V0KCdmaWx0ZXJGdW5jdGlvbicsIG5v
dEthdHpGaWx0ZXIpOwotICAgIHBlb3BsZS5tYXBCeSgnbmFtZScpOyAvLyBbIlRvbSBEYWxlIiwg
IlRyZWsgR2xvd2Fja2kiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBmaWx0ZXJGdW5jdGlvbgot
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVl
YCBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbiB0aGUgYXJyYXkKLSAgKi8KLSAgZmlsdGVyRnVu
Y3Rpb246IG51bGwsCi0gIGlzTG9hZGVkOiB0cnVlLAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKCkg
ewotICAgIHZhciB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJykudG9TdHJpbmcoKTsKLSAgICB0aHJv
dyBuZXcgRXJyb3IoIlRoZSByZXN1bHQgb2YgYSBjbGllbnQtc2lkZSBmaWx0ZXIgKG9uICIgKyB0
eXBlICsgIikgaXMgaW1tdXRhYmxlLiIpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdXBk
YXRlRmlsdGVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgdXBkYXRlRmlsdGVyOiBFbWJlci5vYnNl
cnZlcihmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFuYWdlciA9IGdldCh0aGlzLCAnbWFuYWdlcicp
OwotICAgIG1hbmFnZXIudXBkYXRlRmlsdGVyKHRoaXMsIGdldCh0aGlzLCAndHlwZScpLCBnZXQo
dGhpcywgJ2ZpbHRlckZ1bmN0aW9uJykpOwotICB9LCAnZmlsdGVyRnVuY3Rpb24nKQotfSk7Ci0K
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBSZXBy
ZXNlbnRzIGFuIG9yZGVyZWQgbGlzdCBvZiByZWNvcmRzIHdob3NlIG9yZGVyIGFuZCBtZW1iZXJz
aGlwIGlzCi0gIGRldGVybWluZWQgYnkgdGhlIGFkYXB0ZXIuIEZvciBleGFtcGxlLCBhIHF1ZXJ5
IHNlbnQgdG8gdGhlIGFkYXB0ZXIKLSAgbWF5IHRyaWdnZXIgYSBzZWFyY2ggb24gdGhlIHNlcnZl
ciwgd2hvc2UgcmVzdWx0cyB3b3VsZCBiZSBsb2FkZWQKLSAgaW50byBhbiBpbnN0YW5jZSBvZiB0
aGUgYEFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheWAuCi0KLSAgQGNsYXNzIEFkYXB0ZXJQb3B1
bGF0ZWRSZWNvcmRBcnJheQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIERTLlJlY29yZEFy
cmF5Ci0qLwotRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5ID0gRFMuUmVjb3JkQXJyYXku
ZXh0ZW5kKHsKLSAgcXVlcnk6IG51bGwsCi0KLSAgcmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmluZygpOwotICAgIHRocm93IG5ldyBF
cnJvcigiVGhlIHJlc3VsdCBvZiBhIHNlcnZlciBxdWVyeSAob24gIiArIHR5cGUgKyAiKSBpcyBp
bW11dGFibGUuIik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkCi0gICAgQHByaXZh
dGUKLSAgICBAcGFyYW0ge0FycmF5fSBkYXRhCi0gICovCi0gIGxvYWQ6IGZ1bmN0aW9uKGRhdGEp
IHsKLSAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAgIHR5cGUgPSBn
ZXQodGhpcywgJ3R5cGUnKSwKLSAgICAgICAgcmVjb3JkcyA9IHN0b3JlLnB1c2hNYW55KHR5cGUs
IGRhdGEpLAotICAgICAgICBtZXRhID0gc3RvcmUubWV0YWRhdGFGb3IodHlwZSk7Ci0KLSAgICB0
aGlzLnNldFByb3BlcnRpZXMoewotICAgICAgY29udGVudDogRW1iZXIuQShyZWNvcmRzKSwKLSAg
ICAgIGlzTG9hZGVkOiB0cnVlLAotICAgICAgbWV0YTogbWV0YQotICAgIH0pOwotCi0gICAgLy8g
VE9ETzogZG9lcyB0cmlnZ2VyaW5nIGRpZExvYWQgZXZlbnQgc2hvdWxkIGJlIHRoZSBsYXN0IGFj
dGlvbiBvZiB0aGUgcnVuTG9vcD8KLSAgICBFbWJlci5ydW4ub25jZSh0aGlzLCAndHJpZ2dlcics
ICdkaWRMb2FkJyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoq
Ci0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g
RW1iZXIuc2V0OwotdmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Ci0KLS8qKgot
ICBBIGBNYW55QXJyYXlgIGlzIGEgYFJlY29yZEFycmF5YCB0aGF0IHJlcHJlc2VudHMgdGhlIGNv
bnRlbnRzIG9mIGEgaGFzLW1hbnkKLSAgcmVsYXRpb25zaGlwLgotCi0gIFRoZSBgTWFueUFycmF5
YCBpcyBpbnN0YW50aWF0ZWQgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIHRoZSByZWxhdGlvbnNoaXAg
aXMKLSAgcmVxdWVzdGVkLgotCi0gICMjIyBJbnZlcnNlcwotCi0gIE9mdGVuLCB0aGUgcmVsYXRp
b25zaGlwcyBpbiBFbWJlciBEYXRhIGFwcGxpY2F0aW9ucyB3aWxsIGhhdmUKLSAgYW4gaW52ZXJz
ZS4gRm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyBtb2RlbHMgYXJlCi0gIGRlZmlu
ZWQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUG9zdCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgY29tbWVudHM6IERTLmhhc01hbnkoJ2NvbW1lbnQnKQotICB9KTsKLQotICBBcHAuQ29tbWVu
dCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgcG9zdDogRFMuYmVsb25nc1RvKCdwb3N0JykKLSAg
fSk7Ci0gIGBgYAotCi0gIElmIHlvdSBjcmVhdGVkIGEgbmV3IGluc3RhbmNlIG9mIGBBcHAuUG9z
dGAgYW5kIGFkZGVkCi0gIGEgYEFwcC5Db21tZW50YCByZWNvcmQgdG8gaXRzIGBjb21tZW50c2Ag
aGFzLW1hbnkKLSAgcmVsYXRpb25zaGlwLCB5b3Ugd291bGQgZXhwZWN0IHRoZSBjb21tZW50J3Mg
YHBvc3RgCi0gIHByb3BlcnR5IHRvIGJlIHNldCB0byB0aGUgcG9zdCB0aGF0IGNvbnRhaW5lZAot
ICB0aGUgaGFzLW1hbnkuCi0KLSAgV2UgY2FsbCB0aGUgcmVjb3JkIHRvIHdoaWNoIGEgcmVsYXRp
b25zaGlwIGJlbG9uZ3MgdGhlCi0gIHJlbGF0aW9uc2hpcCdzIF9vd25lcl8uCi0KLSAgQGNsYXNz
IE1hbnlBcnJheQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIERTLlJlY29yZEFycmF5Ci0q
LwotRFMuTWFueUFycmF5ID0gRFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jID0gRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgfSwKLQotICAv
KioKLSAgICBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0KLSAgICBAcHJv
cGVydHkge1N0cmluZ30gbmFtZQotICAgIEBwcml2YXRlCi0gICovCi0gIG5hbWU6IG51bGwsCi0K
LSAgLyoqCi0gICAgVGhlIHJlY29yZCB0byB3aGljaCB0aGlzIHJlbGF0aW9uc2hpcCBiZWxvbmdz
LgotCi0gICAgQHByb3BlcnR5IHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcHJpdmF0ZQotICAqLwot
ICBvd25lcjogbnVsbCwKLQotICAvKioKLSAgICBgdHJ1ZWAgaWYgdGhlIHJlbGF0aW9uc2hpcCBp
cyBwb2x5bW9ycGhpYywgYGZhbHNlYCBvdGhlcndpc2UuCi0KLSAgICBAcHJvcGVydHkge0Jvb2xl
YW59IGlzUG9seW1vcnBoaWMKLSAgICBAcHJpdmF0ZQotICAqLwotICBpc1BvbHltb3JwaGljOiBm
YWxzZSwKLQotICAvLyBMT0FESU5HIFNUQVRFCi0KLSAgaXNMb2FkZWQ6IGZhbHNlLAotCi0gIC8q
KgotICAgIFVzZWQgZm9yIGFzeW5jIGBoYXNNYW55YCBhcnJheXMKLSAgICB0byBrZWVwIHRyYWNr
IG9mIHdoZW4gdGhleSB3aWxsIHJlc29sdmUuCi0KLSAgICBAcHJvcGVydHkge0VtYmVyLlJTVlAu
UHJvbWlzZX0gcHJvbWlzZQotICAgIEBwcml2YXRlCi0gICovCi0gIHByb21pc2U6IG51bGwsCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkaW5nUmVjb3Jkc0NvdW50Ci0gICAgQHBhcmFtIHtOdW1i
ZXJ9IGNvdW50Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgbG9hZGluZ1JlY29yZHNDb3VudDogZnVu
Y3Rpb24oY291bnQpIHsKLSAgICB0aGlzLmxvYWRpbmdSZWNvcmRzQ291bnQgPSBjb3VudDsKLSAg
fSwKLQotICAvKioKLSAgICBAbWV0aG9kIGxvYWRlZFJlY29yZAotICAgIEBwcml2YXRlCi0gICov
Ci0gIGxvYWRlZFJlY29yZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sb2FkaW5nUmVjb3Jkc0Nv
dW50LS07Ci0gICAgaWYgKHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9PT0gMCkgewotICAgICAg
c2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOwotICAgICAgdGhpcy50cmlnZ2VyKCdkaWRMb2Fk
Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmV0Y2gKLSAgICBAcHJpdmF0
ZQotICAqLwotICBmZXRjaDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlY29yZHMgPSBnZXQodGhp
cywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAg
ICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICByZXNvbHZlciA9IEVtYmVy
LlJTVlAuZGVmZXIoIkRTOiBNYW55QXJyYXkjZmV0Y2ggIiArIGdldCh0aGlzLCAndHlwZScpKTsK
LQotICAgIHZhciB1bmxvYWRlZFJlY29yZHMgPSByZWNvcmRzLmZpbHRlclByb3BlcnR5KCdpc0Vt
cHR5JywgdHJ1ZSk7Ci0gICAgc3RvcmUuZmV0Y2hNYW55KHVubG9hZGVkUmVjb3Jkcywgb3duZXIs
IHJlc29sdmVyKTsKLSAgfSwKLQotICAvLyBPdmVycmlkZXMgRW1iZXIuQXJyYXkncyByZXBsYWNl
IG1ldGhvZCB0byBpbXBsZW1lbnQKLSAgcmVwbGFjZUNvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4LCBy
ZW1vdmVkLCBhZGRlZCkgewotICAgIC8vIE1hcCB0aGUgYXJyYXkgb2YgcmVjb3JkIG9iamVjdHMg
aW50byBhbiBhcnJheSBvZiAgY2xpZW50IGlkcy4KLSAgICBhZGRlZCA9IG1hcChhZGRlZCwgZnVu
Y3Rpb24ocmVjb3JkKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgYWRkICciICsg
cmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcmVsYXRpb25z
aGlwIChvbmx5ICciICsgdGhpcy50eXBlLnR5cGVLZXkgKyAiJyBhbGxvd2VkKSIsICF0aGlzLnR5
cGUgfHwgcmVjb3JkIGluc3RhbmNlb2YgdGhpcy50eXBlKTsKLSAgICAgIHJldHVybiByZWNvcmQ7
Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB0aGlzLl9zdXBlcihpbmRleCwgcmVtb3ZlZCwgYWRkZWQp
OwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAg
RW1iZXIucnVuLm9uY2UodGhpcywgJ2ZldGNoJyk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50V2ls
bENoYW5nZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZWQsIGFkZGVkKSB7Ci0gICAgdmFyIG93bmVy
ID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyk7
Ci0KLSAgICBpZiAoIW93bmVyLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAvLyBU
aGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2YgY29kZSB0aGF0IGNvbnRpbnVlcyBpbnNpZGUK
LSAgICAgIC8vIG9mIGFycmF5Q29udGVudERpZENoYW5nZS4gSXQgZ2V0cyBvciBjcmVhdGVzIGEg
Y2hhbmdlIGZyb20KLSAgICAgIC8vIHRoZSBjaGlsZCBvYmplY3QsIGFkZHMgdGhlIGN1cnJlbnQg
b3duZXIgYXMgdGhlIG9sZAotICAgICAgLy8gcGFyZW50IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRp
bWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAotICAgICAgLy8gZnJvbSBhIE1hbnlBcnJheSwgYW5k
IHNldHMgYG5ld1BhcmVudGAgdG8gbnVsbC4KLSAgICAgIC8vCi0gICAgICAvLyBMYXRlciwgaWYg
dGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVyIE1hbnlBcnJheSwKLSAgICAgIC8vIHRoZSBg
YXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3aWxsIHNldCBgbmV3UGFyZW50YCBvbgotICAgICAgLy8g
dGhlIGNoYW5nZS4KLSAgICAgIGZvciAodmFyIGk9aW5kZXg7IGk8aW5kZXgrcmVtb3ZlZDsgaSsr
KSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChp
KTsKLQotICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNo
YW5nZShvd25lciwgcmVjb3JkLCBnZXQodGhpcywgJ3N0b3JlJyksIHsKLSAgICAgICAgICBwYXJl
bnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwKLSAgICAgICAgICBjaGFuZ2VUeXBlOiAicmVtb3Zl
IiwKLSAgICAgICAgICBraW5kOiAiaGFzTWFueSIsCi0gICAgICAgICAga2V5OiBuYW1lCi0gICAg
ICAgIH0pOwotCi0gICAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuYWRkKGNoYW5nZSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihpbmRleCwgcmVt
b3ZlZCwgYWRkZWQpIHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwot
Ci0gICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICBuYW1lID0gZ2V0
KHRoaXMsICduYW1lJyksCi0gICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOwotCi0g
ICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcykgewotICAgICAgLy8gVGhpcyBj
b2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBjb2RlIHRoYXQgc3RhcnRlZCBpbgotICAgICAgLy8g
YGFycmF5Q29udGVudFdpbGxDaGFuZ2VgLiBJdCBnZXRzIG9yIGNyZWF0ZXMgYSBjaGFuZ2UKLSAg
ICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwgYW5kIGFkZHMgdGhlIGN1cnJlbnQgb3duZXIg
YXMKLSAgICAgIC8vIHRoZSBuZXcgcGFyZW50LgotICAgICAgZm9yICh2YXIgaT1pbmRleDsgaTxp
bmRleCthZGRlZDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRl
bnQnKS5vYmplY3RBdChpKTsKLQotICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlw
Q2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lciwgcmVjb3JkLCBzdG9yZSwgewotICAgICAgICAgIHBh
cmVudFR5cGU6IG93bmVyLmNvbnN0cnVjdG9yLAotICAgICAgICAgIGNoYW5nZVR5cGU6ICJhZGQi
LAotICAgICAgICAgIGtpbmQ6Imhhc01hbnkiLAotICAgICAgICAgIGtleTogbmFtZQotICAgICAg
ICB9KTsKLSAgICAgICAgY2hhbmdlLmhhc01hbnlOYW1lID0gbmFtZTsKLQotICAgICAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2UpOwotICAgICAgfQotCi0gICAgICAvLyBXZSB3YWl0
IHVudGlsIHRoZSBhcnJheSBoYXMgZmluaXNoZWQgYmVpbmcKLSAgICAgIC8vIG11dGF0ZWQgYmVm
b3JlIHN5bmNpbmcgdGhlIE9uZVRvTWFueUNoYW5nZXMgY3JlYXRlZAotICAgICAgLy8gaW4gYXJy
YXlDb250ZW50V2lsbENoYW5nZSwgc28gdGhhdCB0aGUgYXJyYXkKLSAgICAgIC8vIG1lbWJlcnNo
aXAgdGVzdCBpbiB0aGUgc3luYygpIGxvZ2ljIG9wZXJhdGVzCi0gICAgICAvLyBvbiB0aGUgZmlu
YWwgcmVzdWx0cy4KLSAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuZm9yRWFjaChmdW5jdGlvbihj
aGFuZ2UpIHsKLSAgICAgICAgY2hhbmdlLnN5bmMoKTsKLSAgICAgIH0pOwotCi0gICAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIENyZWF0
ZSBhIGNoaWxkIHJlY29yZCB3aXRoaW4gdGhlIG93bmVyCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJl
Y29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgICBAcmV0dXJu
IHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24oaGFzaCkg
ewotICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKSwKLSAgICAgICAgc3RvcmUgPSBn
ZXQob3duZXIsICdzdG9yZScpLAotICAgICAgICB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJyksCi0g
ICAgICAgIHJlY29yZDsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBhZGQgJyIgKyB0
eXBlLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcG9seW1vcnBoaWMgcmVsYXRpb25zaGlw
LiIsICFnZXQodGhpcywgJ2lzUG9seW1vcnBoaWMnKSk7Ci0KLSAgICByZWNvcmQgPSBzdG9yZS5j
cmVhdGVSZWNvcmQuY2FsbChzdG9yZSwgdHlwZSwgaGFzaCk7Ci0gICAgdGhpcy5wdXNoT2JqZWN0
KHJlY29yZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9Ci0KLX0pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBFbWJlciovCi0vKmpzaGludCBlcW51bGw6
dHJ1ZSovCi0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgb25jZSA9IEVtYmVyLnJ1bi5vbmNlOwotdmFyIGlz
Tm9uZSA9IEVtYmVyLmlzTm9uZTsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2g7Ci12YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOwot
dmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Ci12YXIgcmVzb2x2ZSA9IEVtYmVy
LlJTVlAucmVzb2x2ZTsKLXZhciBjb3B5ID0gRW1iZXIuY29weTsKLQotLy8gSW1wbGVtZW50b3Jz
IE5vdGU6Ci0vLwotLy8gICBUaGUgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBhcmUgY29uc2lzdGVu
dGx5IG5hbWVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCi0vLyAgIHNjaGVtZToKLS8vCi0v
LyAgICogK2lkKyBtZWFucyBhbiBpZGVudGlmaWVyIG1hbmFnZWQgYnkgYW4gZXh0ZXJuYWwgc291
cmNlLCBwcm92aWRlZCBpbnNpZGUKLS8vICAgICB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGF0IHNv
dXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJlIHN0cmluZ3MKLS8vICAgICBiZWZv
cmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LgotLy8gICAqICtjbGllbnRJZCsgbWVhbnMgYSB0cmFu
c2llbnQgbnVtZXJpY2FsIGlkZW50aWZpZXIgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkKLS8vICAg
ICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50IHByaW1hcmlseSBiZWNhdXNlIG5ld2x5
IGNyZWF0ZWQgb2JqZWN0cyBtYXkKLS8vICAgICBub3QgeWV0IGhhdmUgYW4gZXh0ZXJuYWxseSBn
ZW5lcmF0ZWQgaWQuCi0vLyAgICogK3JlZmVyZW5jZSsgbWVhbnMgYSByZWNvcmQgcmVmZXJlbmNl
IG9iamVjdCwgd2hpY2ggaG9sZHMgbWV0YWRhdGEgYWJvdXQgYQotLy8gICAgIHJlY29yZCwgZXZl
biBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IG1hdGVyaWFsaXplZC4KLS8vICAgKiArdHlw
ZSsgbWVhbnMgYSBzdWJjbGFzcyBvZiBEUy5Nb2RlbC4KLQotLy8gVXNlZCBieSB0aGUgc3RvcmUg
dG8gbm9ybWFsaXplIElEcyBlbnRlcmluZyB0aGUgc3RvcmUuICBEZXNwaXRlIHRoZSBmYWN0Ci0v
LyB0aGF0IGRldmVsb3BlcnMgbWF5IHByb3ZpZGUgSURzIGFzIG51bWJlcnMgKGUuZy4sIGBzdG9y
ZS5maW5kKFBlcnNvbiwgMSlgKSwKLS8vIGl0IGlzIGltcG9ydGFudCB0aGF0IGludGVybmFsbHkg
d2UgdXNlIHN0cmluZ3MsIHNpbmNlIElEcyBtYXkgYmUgc2VyaWFsaXplZAotLy8gYW5kIGxvc2Ug
dHlwZSBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBFbWJlcidzIHJvdXRlciBtYXkgcHV0IGEg
cmVjb3JkJ3MKLS8vIElEIGludG8gdGhlIFVSTCwgYW5kIGlmIHdlIGxhdGVyIHRyeSB0byBkZXNl
cmlhbGl6ZSB0aGF0IFVSTCBhbmQgZmluZCB0aGUKLS8vIGNvcnJlc3BvbmRpbmcgcmVjb3JkLCB3
ZSB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGEgc3RyaW5nIG9yIGEgbnVtYmVyLgotdmFyIGNvZXJj
ZUlkID0gZnVuY3Rpb24oaWQpIHsKLSAgcmV0dXJuIGlkID09IG51bGwgPyBudWxsIDogaWQrJyc7
Ci19OwotCi0vKioKLSAgVGhlIHN0b3JlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSBmb3IgcmVj
b3JkcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgotICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZv
ciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYERTLk1vZGVsYCB0aGF0IHdyYXAKLSAgdGhlIGluZGl2
aWR1YWwgZGF0YSBmb3IgYSByZWNvcmQsIHNvIHRoYXQgdGhleSBjYW4gYmUgYm91bmQgdG8gaW4g
eW91cgotICBIYW5kbGViYXJzIHRlbXBsYXRlcy4KLQotICBEZWZpbmUgeW91ciBhcHBsaWNhdGlv
bidzIHN0b3JlIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIE15QXBwLlN0b3JlID0g
RFMuU3RvcmUuZXh0ZW5kKCk7Ci0gIGBgYAotCi0gIE1vc3QgRW1iZXIuanMgYXBwbGljYXRpb25z
IHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIGBEUy5TdG9yZWAgdGhhdCBpcwotICBhdXRvbWF0aWNh
bGx5IGNyZWF0ZWQgYnkgdGhlaXIgYEVtYmVyLkFwcGxpY2F0aW9uYC4KLQotICBZb3UgY2FuIHJl
dHJpZXZlIG1vZGVscyBmcm9tIHRoZSBzdG9yZSBpbiBzZXZlcmFsIHdheXMuIFRvIHJldHJpZXZl
IGEgcmVjb3JkCi0gIGZvciBhIHNwZWNpZmljIGlkLCB1c2UgYERTLlN0b3JlYCdzIGBmaW5kKClg
IG1ldGhvZDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBwZXJzb24gPSBzdG9yZS5maW5kKCdw
ZXJzb24nLCAxMjMpOwotICBgYGAKLQotICBJZiB5b3VyIGFwcGxpY2F0aW9uIGhhcyBtdWx0aXBs
ZSBgRFMuU3RvcmVgIGluc3RhbmNlcyAoYW4gdW51c3VhbCBjYXNlKSwgeW91IGNhbgotICBzcGVj
aWZ5IHdoaWNoIHN0b3JlIHNob3VsZCBiZSB1c2VkOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IHBlcnNvbiA9IHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgMTIzKTsKLSAgYGBgCi0KLSAgQnkgZGVm
YXVsdCwgdGhlIHN0b3JlIHdpbGwgdGFsayB0byB5b3VyIGJhY2tlbmQgdXNpbmcgYSBzdGFuZGFy
ZAotICBSRVNUIG1lY2hhbmlzbS4gWW91IGNhbiBjdXN0b21pemUgaG93IHRoZSBzdG9yZSB0YWxr
cyB0byB5b3VyCi0gIGJhY2tlbmQgYnkgc3BlY2lmeWluZyBhIGN1c3RvbSBhZGFwdGVyOgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgIE15QXBwLnN0b3JlID0gRFMuU3RvcmUuY3JlYXRlKHsKLSAgICAg
YWRhcHRlcjogJ015QXBwLkN1c3RvbUFkYXB0ZXInCi0gICB9KTsKLSAgIGBgYAotCi0gIFlvdSBj
YW4gbGVhcm4gbW9yZSBhYm91dCB3cml0aW5nIGEgY3VzdG9tIGFkYXB0ZXIgYnkgcmVhZGluZyB0
aGUgYERTLkFkYXB0ZXJgCi0gIGRvY3VtZW50YXRpb24uCi0KLSAgQGNsYXNzIFN0b3JlCi0gIEBu
YW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotRFMuU3RvcmUgPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAgICBAbWV0aG9kIGluaXQKLSAgICBAcHJpdmF0
ZQotICAqLwotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICAvLyBpbnRlcm5hbCBib29ra2VlcGlu
Zzsgbm90IG9ic2VydmFibGUKLSAgICB0aGlzLnR5cGVNYXBzID0ge307Ci0gICAgdGhpcy5yZWNv
cmRBcnJheU1hbmFnZXIgPSBEUy5SZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlKHsKLSAgICAgIHN0
b3JlOiB0aGlzCi0gICAgfSk7Ci0gICAgdGhpcy5fcmVsYXRpb25zaGlwQ2hhbmdlcyA9IHt9Owot
ICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGFkYXB0
ZXIgdG8gdXNlIHRvIGNvbW11bmljYXRlIHRvIGEgYmFja2VuZCBzZXJ2ZXIgb3Igb3RoZXIgcGVy
c2lzdGVuY2UgbGF5ZXIuCi0KLSAgICBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gaW5zdGFu
Y2UsIGNsYXNzLCBvciBzdHJpbmcuCi0KLSAgICBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGBBcHAu
Q3VzdG9tQWRhcHRlcmAgYXMgYSBzdHJpbmcsIGRvOgotCi0gICAgYGBganMKLSAgICBhZGFwdGVy
OiAnY3VzdG9tJwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGFkYXB0ZXIKLSAgICBAZGVmYXVs
dCBEUy5SRVNUQWRhcHRlcgotICAgIEB0eXBlIHtEUy5BZGFwdGVyfFN0cmluZ30KLSAgKi8KLSAg
YWRhcHRlcjogJy1yZXN0JywKLQotICAvKioKLSAgICBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRh
dGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIGEgY3VzdG9tCi0gICAgdHlwZS1zcGVjaWZpYyBzZXJp
YWxpemVyLCBpZiBvbmUgZXhpc3RzLgotCi0gICAgVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZToK
LQotICAgICogYGluY2x1ZGVJZGA6IGB0cnVlYCBpZiB0aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJl
IGluY2x1ZGVkIGluCi0gICAgICB0aGUgSlNPTiByZXByZXNlbnRhdGlvbgotCi0gICAgQG1ldGhv
ZCBzZXJpYWxpemUKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0
aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGFuIG9w
dGlvbnMgaGFzaAotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykg
ewotICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXJGb3IocmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVL
ZXkpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMg
cHJvcGVydHkgcmV0dXJucyB0aGUgYWRhcHRlciwgYWZ0ZXIgcmVzb2x2aW5nIGEgcG9zc2libGUK
LSAgICBzdHJpbmcga2V5LgotCi0gICAgSWYgdGhlIHN1cHBsaWVkIGBhZGFwdGVyYCB3YXMgYSBj
bGFzcywgb3IgYSBTdHJpbmcgcHJvcGVydHkKLSAgICBwYXRoIHJlc29sdmVkIHRvIGEgY2xhc3Ms
IHRoaXMgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZSB0aGUKLSAgICBjbGFzcy4KLQotICAgIFRo
aXMgcHJvcGVydHkgaXMgY2FjaGVhYmxlLCBzbyB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhIHNwZWNp
ZmllZAotICAgIGFkYXB0ZXIgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBsaWZldGltZSBv
ZiB0aGUgc3RvcmUuCi0KLSAgICBAcHJvcGVydHkgZGVmYXVsdEFkYXB0ZXIKLSAgICBAcHJpdmF0
ZQotICAgIEByZXR1cm5zIERTLkFkYXB0ZXIKLSAgKi8KLSAgZGVmYXVsdEFkYXB0ZXI6IEVtYmVy
LmNvbXB1dGVkKCdhZGFwdGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFkYXB0ZXIgPSBnZXQo
dGhpcywgJ2FkYXB0ZXInKTsKLQotICAgIEVtYmVyLmFzc2VydCgnWW91IHRyaWVkIHRvIHNldCBg
YWRhcHRlcmAgcHJvcGVydHkgdG8gYW4gaW5zdGFuY2Ugb2YgYERTLkFkYXB0ZXJgLCB3aGVyZSBp
dCBzaG91bGQgYmUgYSBuYW1lIG9yIGEgZmFjdG9yeScsICEoYWRhcHRlciBpbnN0YW5jZW9mIERT
LkFkYXB0ZXIpKTsKLQotICAgIGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ3N0cmluZycpIHsKLSAg
ICAgIGFkYXB0ZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyArIGFkYXB0ZXIp
IHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicpIHx8IHRoaXMu
Y29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjotcmVzdCcpOwotICAgIH0KLQotICAgIGlmIChEUy5B
ZGFwdGVyLmRldGVjdChhZGFwdGVyKSkgewotICAgICAgYWRhcHRlciA9IGFkYXB0ZXIuY3JlYXRl
KHsgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWRh
cHRlcjsKLSAgfSksCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gQ1JFQVRF
IE5FVyBSRUNPUkQgLgotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4KLQotICAvKioKLSAgICBD
cmVhdGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJyZW50IHN0b3JlLiBUaGUgcHJvcGVydGllcyBw
YXNzZWQKLSAgICB0byB0aGlzIG1ldGhvZCBhcmUgc2V0IG9uIHRoZSBuZXdseSBjcmVhdGVkIHJl
Y29yZC4KLQotICAgIFRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBgQXBwLlBvc3RgOgotCi0g
ICAgYGBganMKLSAgICBzdG9yZS5jcmVhdGVSZWNvcmQoJ3Bvc3QnLCB7Ci0gICAgICB0aXRsZTog
IlJhaWxzIGlzIG9tYWthc2UiCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNyZWF0
ZVJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHBy
b3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZQotICAgICAgbmV3bHkg
Y3JlYXRlZCByZWNvcmQuCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAg
Y3JlYXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0aWVzKSB7Ci0gICAgdHlwZSA9IHRo
aXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICBwcm9wZXJ0aWVzID0gY29weShwcm9wZXJ0aWVzKSB8
fCB7fTsKLQotICAgIC8vIElmIHRoZSBwYXNzZWQgcHJvcGVydGllcyBkbyBub3QgaW5jbHVkZSBh
IHByaW1hcnkga2V5LAotICAgIC8vIGdpdmUgdGhlIGFkYXB0ZXIgYW4gb3Bwb3J0dW5pdHkgdG8g
Z2VuZXJhdGUgb25lLiBUeXBpY2FsbHksCi0gICAgLy8gY2xpZW50LXNpZGUgSUQgZ2VuZXJhdG9y
cyB3aWxsIHVzZSBzb21ldGhpbmcgbGlrZSB1dWlkLmpzCi0gICAgLy8gdG8gYXZvaWQgY29uZmxp
Y3RzLgotCi0gICAgaWYgKGlzTm9uZShwcm9wZXJ0aWVzLmlkKSkgewotICAgICAgcHJvcGVydGll
cy5pZCA9IHRoaXMuX2dlbmVyYXRlSWQodHlwZSk7Ci0gICAgfQotCi0gICAgLy8gQ29lcmNlIElE
IHRvIGEgc3RyaW5nCi0gICAgcHJvcGVydGllcy5pZCA9IGNvZXJjZUlkKHByb3BlcnRpZXMuaWQp
OwotCi0gICAgdmFyIHJlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQodHlwZSwgcHJvcGVydGllcy5p
ZCk7Ci0KLSAgICAvLyBNb3ZlIHRoZSByZWNvcmQgb3V0IG9mIGl0cyBpbml0aWFsIGBlbXB0eWAg
c3RhdGUgaW50bwotICAgIC8vIHRoZSBgbG9hZGVkYCBzdGF0ZS4KLSAgICByZWNvcmQubG9hZGVk
RGF0YSgpOwotCi0gICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBvbiB0aGUgcmVj
b3JkLgotICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0gICAgcmV0dXJu
IHJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBJZiBwb3NzaWJsZSwgdGhpcyBtZXRob2QgYXNr
cyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBhbiBJRCBmb3IKLSAgICBhIG5ld2x5IGNyZWF0ZWQg
cmVjb3JkLgotCi0gICAgQG1ldGhvZCBfZ2VuZXJhdGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJucyB7U3RyaW5nfSBpZiB0aGUgYWRhcHRlciBj
YW4gZ2VuZXJhdGUgb25lLCBhbiBJRAotICAqLwotICBfZ2VuZXJhdGVJZDogZnVuY3Rpb24odHlw
ZSkgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgaWYg
KGFkYXB0ZXIgJiYgYWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKSB7Ci0gICAgICByZXR1cm4g
YWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiBu
dWxsOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gREVMRVRFIFJFQ09S
RCAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBh
IHJlY29yZCBjYW4gYmUgZGVsZXRlZCB2aWEgdGhlIHN0b3JlLgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwb3N0ID0gc3RvcmUuY3JlYXRlUmVjb3JkKCdwb3N0
JywgewotICAgICAgdGl0bGU6ICJSYWlscyBpcyBvbWFrYXNlIgotICAgIH0pOwotCi0gICAgc3Rv
cmUuZGVsZXRlUmVjb3JkKHBvc3QpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBkZWxldGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBm
dW5jdGlvbihyZWNvcmQpIHsKLSAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgdW5sb2FkZWQgdmlhIHRoZSBz
dG9yZS4gT25seQotICAgIG5vbi1kaXJ0eSByZWNvcmRzIGNhbiBiZSB1bmxvYWRlZC4KLQotICAg
IEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS5maW5kKCdwb3N0JywgMSku
dGhlbihmdW5jdGlvbihwb3N0KSB7Ci0gICAgICBzdG9yZS51bmxvYWRSZWNvcmQocG9zdCk7Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVubG9hZFJlY29yZAotICAgIEBwYXJhbSB7
RFMuTW9kZWx9IHJlY29yZAotICAqLwotICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkg
ewotICAgIHJlY29yZC51bmxvYWRSZWNvcmQoKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4u
Li4uCi0gIC8vIC4gRklORCBSRUNPUkRTIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLgotCi0gIC8q
KgotICAgIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byBmaW5kaW5nIHJlY29yZHMu
IFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8KLSAgICB0aGlzIG1ldGhvZCBpcyB0aGUgbW9kZWwncyBu
YW1lIGFzIGEgc3RyaW5nLgotCi0gICAgLS0tCi0KLSAgICBUbyBmaW5kIGEgcmVjb3JkIGJ5IElE
LCBwYXNzIHRoZSBgaWRgIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNvbicsIDEpOwotICAgIGBgYAotCi0gICAgVGhlIGBm
aW5kYCBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGEgKipwcm9taXNlKiogdGhhdCB3aWxsIGJl
IHJlc29sdmVkCi0gICAgd2l0aCB0aGUgcmVjb3JkLiBJZiB0aGUgcmVjb3JkIHdhcyBhbHJlYWR5
IGluIHRoZSBzdG9yZSwgdGhlIHByb21pc2Ugd2lsbAotICAgIGJlIHJlc29sdmVkIGltbWVkaWF0
ZWx5LiBPdGhlcndpc2UsIHRoZSBzdG9yZSB3aWxsIGFzayB0aGUgYWRhcHRlcidzIGBmaW5kYAot
ICAgIG1ldGhvZCB0byBmaW5kIHRoZSBuZWNlc3NhcnkgZGF0YS4KLQotICAgIFRoZSBgZmluZGAg
bWV0aG9kIHdpbGwgYWx3YXlzIHJlc29sdmUgaXRzIHByb21pc2Ugd2l0aCB0aGUgc2FtZSBvYmpl
Y3QgZm9yCi0gICAgYSBnaXZlbiB0eXBlIGFuZCBgaWRgLgotCi0gICAgLS0tCi0KLSAgICBUbyBm
aW5kIGFsbCByZWNvcmRzIGZvciBhIHR5cGUsIGNhbGwgYGZpbmRgIHdpdGggbm8gYWRkaXRpb25h
bCBwYXJhbWV0ZXJzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNv
bicpOwotICAgIGBgYAotCi0gICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRlcidzIGBmaW5kQWxs
YCBtZXRob2QgdG8gZmluZCB0aGUgcmVjb3JkcyBmb3IgdGhlCi0gICAgZ2l2ZW4gdHlwZSwgYW5k
IHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhlIHNlcnZlcgot
ICAgIHJldHVybnMgdGhlIHZhbHVlcy4KLQotICAgIC0tLQotCi0gICAgVG8gZmluZCBhIHJlY29y
ZCBieSBhIHF1ZXJ5LCBjYWxsIGBmaW5kYCB3aXRoIGEgaGFzaCBhcyB0aGUgc2Vjb25kCi0gICAg
cGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbmQoQXBwLlBlcnNv
biwgeyBwYWdlOiAxIH0pOwotICAgIGBgYAotCi0gICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRl
cidzIGBmaW5kUXVlcnlgIG1ldGhvZCB0byBmaW5kIHRoZSByZWNvcmRzIGZvcgotICAgIHRoZSBx
dWVyeSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhl
IHNlcnZlcgotICAgIHJlc3BvbmRzLgotCi0gICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtT
dHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdHxT
dHJpbmd8SW50ZWdlcnxudWxsfSBpZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAg
Ki8KLSAgZmluZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICBpZiAoaWQgPT09IHVuZGVmaW5l
ZCkgewotICAgICAgcmV0dXJuIHRoaXMuZmluZEFsbCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvLyBX
ZSBhcmUgcGFzc2VkIGEgcXVlcnkgaW5zdGVhZCBvZiBhbiBpZC4KLSAgICBpZiAoRW1iZXIudHlw
ZU9mKGlkKSA9PT0gJ29iamVjdCcpIHsKLSAgICAgIHJldHVybiB0aGlzLmZpbmRRdWVyeSh0eXBl
LCBpZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuZmluZEJ5SWQodHlwZSwgY29lcmNlSWQo
aWQpKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVjb3JkIGZv
ciBhIGdpdmVuIHR5cGUgYW5kIGlkIGNvbWJpbmF0aW9uLgotCi0gICAgQG1ldGhvZCBmaW5kQnlJ
ZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBpZAotICAgIEByZXR1cm4ge1By
b21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEJ5SWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0g
ICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgcmVjb3JkID0gdGhpcy5y
ZWNvcmRGb3JJZCh0eXBlLCBpZCk7Ci0KLSAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZmV0Y2hSZWNv
cmQocmVjb3JkKSB8fCByZXNvbHZlKHJlY29yZCwgIkRTOiBTdG9yZSNmaW5kQnlJZCAiICsgdHlw
ZSArICIgd2l0aCBpZDogIiArIGlkKTsKLSAgICByZXR1cm4gcHJvbWlzZU9iamVjdChwcm9taXNl
KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBtYWtlcyBhIHNlcmllcyBvZiByZXF1
ZXN0cyB0byB0aGUgYWRhcHRlcidzIGBmaW5kYCBtZXRob2QKLSAgICBhbmQgcmV0dXJucyBhIHBy
b21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZXkgYXJlIGFsbCBsb2FkZWQuCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2QgZmluZEJ5SWRzCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAg
ICBAcGFyYW0ge0FycmF5fSBpZHMKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBmaW5kQnlJZHM6IGZ1bmN0aW9uKHR5cGUsIGlkcykgewotICAgIHZhciBzdG9yZSA9IHRo
aXM7Ci0gICAgdmFyIHByb21pc2VMYWJlbCA9ICJEUzogU3RvcmUjZmluZEJ5SWRzICIgKyB0eXBl
OwotICAgIHJldHVybiBwcm9taXNlQXJyYXkoRW1iZXIuUlNWUC5hbGwobWFwKGlkcywgZnVuY3Rp
b24oaWQpIHsKLSAgICAgIHJldHVybiBzdG9yZS5maW5kQnlJZCh0eXBlLCBpZCk7Ci0gICAgfSkp
LnRoZW4oRW1iZXIuQSwgbnVsbCwgIkRTOiBTdG9yZSNmaW5kQnlJZHMgb2YgIiArIHR5cGUgKyAi
IGNvbXBsZXRlIikpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBi
eSBgZmluZEJ5SWRgIGlmIGl0IGRpc2NvdmVycyB0aGF0IGEgcGFydGljdWxhcgotICAgIHR5cGUv
aWQgcGFpciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0IHRvIGtpY2sgb2ZmIGEgcmVxdWVzdCB0byB0
aGUKLSAgICBhZGFwdGVyLgotCi0gICAgQG1ldGhvZCBmZXRjaFJlY29yZAotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHBy
b21pc2UKLSAgKi8KLSAgZmV0Y2hSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGlmIChp
c05vbmUocmVjb3JkKSkgeyByZXR1cm4gbnVsbDsgfQotICAgIGlmIChyZWNvcmQuX2xvYWRpbmdQ
cm9taXNlKSB7IHJldHVybiByZWNvcmQuX2xvYWRpbmdQcm9taXNlOyB9Ci0gICAgaWYgKCFnZXQo
cmVjb3JkLCAnaXNFbXB0eScpKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgdHlwZSA9IHJl
Y29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAnaWQnKTsKLQotICAg
IHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgRW1iZXIuYXNzZXJ0
KCJZb3UgdHJpZWQgdG8gZmluZCBhIHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9y
ICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0
byBmaW5kIGEgcmVjb3JkIGJ1dCB5b3VyIGFkYXB0ZXIgKGZvciAiICsgdHlwZSArICIpIGRvZXMg
bm90IGltcGxlbWVudCAnZmluZCciLCBhZGFwdGVyLmZpbmQpOwotCi0gICAgdmFyIHByb21pc2Ug
PSBfZmluZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBpZCk7Ci0gICAgcmVjb3JkLmxvYWRpbmdEYXRh
KHByb21pc2UpOwotICAgIHJldHVybiBwcm9taXNlOwotICB9LAotCi0gIC8qKgotICAgIEdldCBh
IHJlY29yZCBieSBhIGdpdmVuIHR5cGUgYW5kIElEIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGZldGNo
LgotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCBzeW5jaHJvbm91c2x5IHJldHVybiB0aGUgcmVjb3Jk
IGlmIGl0J3MgYXZhaWxhYmxlLgotICAgIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gbnVsbC4K
LQotICAgIGBgYGpzCi0gICAgdmFyIHBvc3QgPSBzdG9yZS5nZXRCeUlkKCdwb3N0JywgMSk7Ci0g
ICAgYGBgCi0KLSAgICBAbWV0aG9kIGdldEJ5SWQKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGlkCi0g
ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGdldEJ5SWQ6IGZ1bmN0aW9uKHR5
cGUsIGlkKSB7Ci0gICAgaWYgKHRoaXMuaGFzUmVjb3JkRm9ySWQodHlwZSwgaWQpKSB7Ci0gICAg
ICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0eXBlLCBpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
IHJldHVybiBudWxsOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBj
YWxsZWQgYnkgdGhlIHJlY29yZCdzIGByZWxvYWRgIG1ldGhvZC4KLQotICAgIFRoaXMgbWV0aG9k
IGNhbGxzIHRoZSBhZGFwdGVyJ3MgYGZpbmRgIG1ldGhvZCwgd2hpY2ggcmV0dXJucyBhIHByb21p
c2UuIFdoZW4KLSAgICAqKnRoYXQqKiBwcm9taXNlIHJlc29sdmVzLCBgcmVsb2FkUmVjb3JkYCB3
aWxsIHJlc29sdmUgdGhlIHByb21pc2UgcmV0dXJuZWQKLSAgICBieSB0aGUgcmVjb3JkJ3MgYHJl
bG9hZGAuCi0KLSAgICBAbWV0aG9kIHJlbG9hZFJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciB0eXBlID0gcmVj
b3JkLmNvbnN0cnVjdG9yLAotICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUp
LAotICAgICAgICBpZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZ
b3UgY2Fubm90IHJlbG9hZCBhIHJlY29yZCB3aXRob3V0IGFuIElEIiwgaWQpOwotICAgIEVtYmVy
LmFzc2VydCgiWW91IHRyaWVkIHRvIHJlbG9hZCBhIHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRh
cHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllv
dSB0cmllZCB0byByZWxvYWQgYSByZWNvcmQgYnV0IHlvdXIgYWRhcHRlciBkb2VzIG5vdCBpbXBs
ZW1lbnQgYGZpbmRgIiwgYWRhcHRlci5maW5kKTsKLQotICAgIHJldHVybiBfZmluZChhZGFwdGVy
LCB0aGlzLCB0eXBlLCBpZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgdGFrZXMg
YSBsaXN0IG9mIHJlY29yZHMsIGdyb3VwcyB0aGUgcmVjb3JkcyBieSB0eXBlLAotICAgIGNvbnZl
cnRzIHRoZSByZWNvcmRzIGludG8gSURzLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBhZGFwdGVyJ3Mg
YGZpbmRNYW55YAotICAgIG1ldGhvZC4KLQotICAgIFRoZSByZWNvcmRzIGFyZSBncm91cGVkIGJ5
IHR5cGUgdG8gaW52b2tlIGBmaW5kTWFueWAgb24gYWRhcHRlcnMKLSAgICBmb3IgZWFjaCB1bmlx
dWUgdHlwZSBpbiByZWNvcmRzLgotCi0gICAgSXQgaXMgdXNlZCBib3RoIGJ5IGEgYnJhbmQgbmV3
IHJlbGF0aW9uc2hpcCAodmlhIHRoZSBgZmluZE1hbnlgCi0gICAgbWV0aG9kKSBvciB3aGVuIHRo
ZSBkYXRhIHVuZGVybHlpbmcgYW4gZXhpc3RpbmcgcmVsYXRpb25zaGlwCi0gICAgY2hhbmdlcy4K
LQotICAgIEBtZXRob2QgZmV0Y2hNYW55Ci0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0FycmF5
fSByZWNvcmRzCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge1Jlc29s
dmVyfSByZXNvbHZlcgotICAqLwotICBmZXRjaE1hbnk6IGZ1bmN0aW9uKHJlY29yZHMsIG93bmVy
LCByZXNvbHZlcikgewotICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHsgcmV0dXJuOyB9Ci0KLSAg
ICAvLyBHcm91cCBCeSBUeXBlCi0gICAgdmFyIHJlY29yZHNCeVR5cGVNYXAgPSBFbWJlci5NYXBX
aXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0
dXJuIEVtYmVyLkEoKTsgfQotICAgIH0pOwotCi0gICAgZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICAgIHJlY29yZHNCeVR5cGVNYXAuZ2V0KHJlY29yZC5jb25zdHJ1Y3Rv
cikucHVzaChyZWNvcmQpOwotICAgIH0pOwotCi0gICAgZm9yRWFjaChyZWNvcmRzQnlUeXBlTWFw
LCBmdW5jdGlvbih0eXBlLCByZWNvcmRzKSB7Ci0gICAgICB2YXIgaWRzID0gcmVjb3Jkcy5tYXBQ
cm9wZXJ0eSgnaWQnKSwKLSAgICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUp
OwotCi0gICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIG1hbnkgcmVjb3JkcyBi
dXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAg
ICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgbWFueSByZWNvcmRzIGJ1dCB5b3Vy
IGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5kTWFueWAiLCBhZGFwdGVyLmZpbmRNYW55
KTsKLQotICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZE1hbnkoYWRhcHRlciwgdGhpcywgdHlw
ZSwgaWRzLCBvd25lcikpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVy
bnMgdHJ1ZSBpZiBhIHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJRCBpcyBhbHJlYWR5IGxv
YWRlZC4KLQotICAgIEBtZXRob2QgaGFzUmVjb3JkRm9ySWQKLSAgICBAcGFyYW0ge1N0cmluZyBv
ciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9
IGlkCi0gICAgQHJldHVybnMge0Jvb2xlYW59Ci0gICovCi0gIGhhc1JlY29yZEZvcklkOiBmdW5j
dGlvbih0eXBlLCBpZCkgewotICAgIGlkID0gY29lcmNlSWQoaWQpOwotICAgIHR5cGUgPSB0aGlz
Lm1vZGVsRm9yKHR5cGUpOwotICAgIHJldHVybiAhIXRoaXMudHlwZU1hcEZvcih0eXBlKS5pZFRv
UmVjb3JkW2lkXTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGlkIHJlY29yZCBmb3IgYSBn
aXZlbiB0eXBlIGFuZCBJRC4gSWYgb25lIGlzbid0IGFscmVhZHkgbG9hZGVkLAotICAgIGl0IGJ1
aWxkcyBhIG5ldyByZWNvcmQgYW5kIGxlYXZlcyBpdCBpbiB0aGUgYGVtcHR5YCBzdGF0ZS4KLQot
ICAgIEBtZXRob2QgcmVjb3JkRm9ySWQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5n
IG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd8SW50ZWdl
cn0gaWQKLSAgICBAcmV0dXJucyB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICByZWNvcmRGb3JJ
ZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsK
LQotICAgIGlkID0gY29lcmNlSWQoaWQpOwotCi0gICAgdmFyIHJlY29yZCA9IHRoaXMudHlwZU1h
cEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKLQotICAgIGlmICghcmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKHR5cGUsIGlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
cmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmluZE1hbnkKLSAgICBAcHJpdmF0
ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IG93bmVyCi0gICAgQHBhcmFtIHtBcnJheX0gcmVjb3Jk
cwotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAg
QHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9IHJl
Y29yZHMKLSAgKi8KLSAgZmluZE1hbnk6IGZ1bmN0aW9uKG93bmVyLCByZWNvcmRzLCB0eXBlLCBy
ZXNvbHZlcikgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotCi0gICAgcmVjb3Jk
cyA9IEVtYmVyLkEocmVjb3Jkcyk7Ci0KLSAgICB2YXIgdW5sb2FkZWRSZWNvcmRzID0gcmVjb3Jk
cy5maWx0ZXJQcm9wZXJ0eSgnaXNFbXB0eScsIHRydWUpLAotICAgICAgICBtYW55QXJyYXkgPSB0
aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVNYW55QXJyYXkodHlwZSwgcmVjb3Jkcyk7Ci0K
LSAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQubG9hZGluZ0RhdGEoKTsKLSAgICB9KTsKLQotICAgIG1hbnlBcnJheS5sb2FkaW5nUmVj
b3Jkc0NvdW50ID0gdW5sb2FkZWRSZWNvcmRzLmxlbmd0aDsKLQotICAgIGlmICh1bmxvYWRlZFJl
Y29yZHMubGVuZ3RoKSB7Ci0gICAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24o
cmVjb3JkKSB7Ci0gICAgICAgIHRoaXMucmVjb3JkQXJyYXlNYW5hZ2VyLnJlZ2lzdGVyV2FpdGlu
Z1JlY29yZEFycmF5KHJlY29yZCwgbWFueUFycmF5KTsKLSAgICAgIH0sIHRoaXMpOwotCi0gICAg
ICB0aGlzLmZldGNoTWFueSh1bmxvYWRlZFJlY29yZHMsIG93bmVyLCByZXNvbHZlcik7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIGlmIChyZXNvbHZlcikgeyByZXNvbHZlci5yZXNvbHZlKCk7IH0KLSAg
ICAgIG1hbnlBcnJheS5zZXQoJ2lzTG9hZGVkJywgdHJ1ZSk7Ci0gICAgICBFbWJlci5ydW4ub25j
ZShtYW55QXJyYXksICd0cmlnZ2VyJywgJ2RpZExvYWQnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
bWFueUFycmF5OwotICB9LAotCi0gIC8qKgotICAgIElmIGEgcmVsYXRpb25zaGlwIHdhcyBvcmln
aW5hbGx5IHBvcHVsYXRlZCBieSB0aGUgYWRhcHRlciBhcyBhIGxpbmsKLSAgICAoYXMgb3Bwb3Nl
ZCB0byBhIGxpc3Qgb2YgSURzKSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0gICAg
cmVsYXRpb25zaGlwIGlzIGZldGNoZWQuCi0KLSAgICBUaGUgbGluayAod2hpY2ggaXMgdXN1YWxs
eSBhIFVSTCkgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCBzbyB0aGUKLSAgICBhZGFwdGVy
IGNhbiBtYWtlIHdoYXRldmVyIHJlcXVlc3QgaXQgd2FudHMuCi0KLSAgICBUaGUgdXN1YWwgdXNl
LWNhc2UgaXMgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVnaXN0ZXIgYSBVUkwgYXMgYSBsaW5rLCBhbmQK
LSAgICB0aGVuIHVzZSB0aGF0IFVSTCBpbiB0aGUgZnV0dXJlIHRvIG1ha2UgYSByZXF1ZXN0IGZv
ciB0aGUgcmVsYXRpb25zaGlwLgotCi0gICAgQG1ldGhvZCBmaW5kSGFzTWFueQotICAgIEBwcml2
YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge2FueX0gbGluawot
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBh
cmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9Ci0gICov
Ci0gIGZpbmRIYXNNYW55OiBmdW5jdGlvbihvd25lciwgbGluaywgcmVsYXRpb25zaGlwLCByZXNv
bHZlcikgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVj
dG9yKTsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBoYXNNYW55IHJl
bGF0aW9uc2hpcCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyBvd25lci5jb25zdHJ1
Y3RvciArICIpIiwgYWRhcHRlcik7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9h
ZCBhIGhhc01hbnkgcmVsYXRpb25zaGlwIGZyb20gYSBzcGVjaWZpZWQgYGxpbmtgIGluIHRoZSBv
cmlnaW5hbCBwYXlsb2FkIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5k
SGFzTWFueWAiLCBhZGFwdGVyLmZpbmRIYXNNYW55KTsKLQotICAgIHZhciByZWNvcmRzID0gdGhp
cy5yZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlTWFueUFycmF5KHJlbGF0aW9uc2hpcC50eXBlLCBF
bWJlci5BKFtdKSk7Ci0gICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEhhc01hbnkoYWRhcHRlciwg
dGhpcywgb3duZXIsIGxpbmssIHJlbGF0aW9uc2hpcCkpOwotICAgIHJldHVybiByZWNvcmRzOwot
ICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmluZEJlbG9uZ3NUbwotICAgIEBwcml2YXRlCi0g
ICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge2FueX0gbGluawotICAgIEBw
YXJhbSB7UmVsYXRpb25zaGlwfSByZWxhdGlvbnNoaXAKLSAgICBAcGFyYW0ge1Jlc29sdmVyfSBy
ZXNvbHZlcgotICAqLwotICBmaW5kQmVsb25nc1RvOiBmdW5jdGlvbihvd25lciwgbGluaywgcmVs
YXRpb25zaGlwLCByZXNvbHZlcikgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9y
KG93bmVyLmNvbnN0cnVjdG9yKTsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxv
YWQgYSBiZWxvbmdzVG8gcmVsYXRpb25zaGlwIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3Ig
IiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQo
IllvdSB0cmllZCB0byBsb2FkIGEgYmVsb25nc1RvIHJlbGF0aW9uc2hpcCBmcm9tIGEgc3BlY2lm
aWVkIGBsaW5rYCBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZCBidXQgeW91ciBhZGFwdGVyIGRvZXMg
bm90IGltcGxlbWVudCBgZmluZEJlbG9uZ3NUb2AiLCBhZGFwdGVyLmZpbmRCZWxvbmdzVG8pOwot
Ci0gICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEJlbG9uZ3NUbyhhZGFwdGVyLCB0aGlzLCBvd25l
ciwgbGluaywgcmVsYXRpb25zaGlwKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2Qg
ZGVsZWdhdGVzIGEgcXVlcnkgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3
aGVyZQotICAgIGFkYXB0ZXItbGV2ZWwgc2VtYW50aWNzIGFyZSBleHBvc2VkIHRvIHRoZSBhcHBs
aWNhdGlvbi4KLQotICAgIEV4cG9zaW5nIHF1ZXJpZXMgdGhpcyB3YXkgc2VlbXMgcHJlZmVyYWJs
ZSB0byBjcmVhdGluZyBhbiBhYnN0cmFjdCBxdWVyeQotICAgIGxhbmd1YWdlIGZvciBhbGwgc2Vy
dmVyLXNpZGUgcXVlcmllcywgYW5kIHRoZW4gcmVxdWlyZSBhbGwgYWRhcHRlcnMgdG8KLSAgICBp
bXBsZW1lbnQgdGhlbS4KLQotICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlLCB3aGlj
aCBpcyByZXNvbHZlZCB3aXRoIGEgYFJlY29yZEFycmF5YAotICAgIG9uY2UgdGhlIHNlcnZlciBy
ZXR1cm5zLgotCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHthbnl9
IHF1ZXJ5IGFuIG9wYXF1ZSBxdWVyeSB0byBiZSB1c2VkIGJ5IHRoZSBhZGFwdGVyCi0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHR5cGUs
IHF1ZXJ5KSB7Ci0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgYXJy
YXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgotICAgICAgLmNyZWF0ZUFkYXB0ZXJQb3B1bGF0
ZWRSZWNvcmRBcnJheSh0eXBlLCBxdWVyeSk7Ci0KLSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRh
cHRlckZvcih0eXBlKSwKLSAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBTdG9yZSNmaW5kUXVl
cnkgIiArIHR5cGUsCi0gICAgICAgIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNl
TGFiZWwpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBhIHF1ZXJ5IGJ1
dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwotICAg
IEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBxdWVyeSBidXQgeW91ciBhZGFwdGVy
IGRvZXMgbm90IGltcGxlbWVudCBgZmluZFF1ZXJ5YCIsIGFkYXB0ZXIuZmluZFF1ZXJ5KTsKLQot
ICAgIHJlc29sdmVyLnJlc29sdmUoX2ZpbmRRdWVyeShhZGFwdGVyLCB0aGlzLCB0eXBlLCBxdWVy
eSwgYXJyYXkpKTsKLQotICAgIHJldHVybiBwcm9taXNlQXJyYXkocmVzb2x2ZXIucHJvbWlzZSk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwg
cmVjb3JkcyBhZGFwdGVyIGNhbiBmaW5kLgotICAgIEl0IHRyaWdnZXJzIHRoZSBhZGFwdGVyJ3Mg
YGZpbmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFuIG9wcG9ydHVuaXR5IHRvIHBvcHVsYXRlCi0g
ICAgdGhlIGFycmF5IHdpdGggcmVjb3JkcyBvZiB0aGF0IHR5cGUuCi0KLSAgICBAbWV0aG9kIGZp
bmRBbGwKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5
fQotICAqLwotICBmaW5kQWxsOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdHlwZSA9IHRoaXMubW9k
ZWxGb3IodHlwZSk7Ci0KLSAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCh0eXBlLCB0aGlzLmFsbCh0
eXBlKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBmZXRjaEFsbAotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuUmVjb3JkQXJyYXl9
IGFycmF5Ci0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmV0Y2hBbGw6
IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7Ci0gICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJG
b3IodHlwZSksCi0gICAgICAgIHNpbmNlVG9rZW4gPSB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0
YWRhdGEuc2luY2U7Ci0KLSAgICBzZXQoYXJyYXksICdpc1VwZGF0aW5nJywgdHJ1ZSk7Ci0KLSAg
ICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGFsbCByZWNvcmRzIGJ1dCB5b3UgaGF2
ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwotICAgIEVtYmVyLmFz
c2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYWxsIHJlY29yZHMgYnV0IHlvdXIgYWRhcHRlciBkb2Vz
IG5vdCBpbXBsZW1lbnQgYGZpbmRBbGxgIiwgYWRhcHRlci5maW5kQWxsKTsKLQotICAgIHJldHVy
biBwcm9taXNlQXJyYXkoX2ZpbmRBbGwoYWRhcHRlciwgdGhpcywgdHlwZSwgc2luY2VUb2tlbikp
OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZGlkVXBkYXRlQWxsCi0gICAgQHBhcmFtIHtE
Uy5Nb2RlbH0gdHlwZQotICAqLwotICBkaWRVcGRhdGVBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICB2YXIgZmluZEFsbENhY2hlID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLmZpbmRBbGxDYWNoZTsK
LSAgICBzZXQoZmluZEFsbENhY2hlLCAnaXNVcGRhdGluZycsIGZhbHNlKTsKLSAgfSwKLQotICAv
KioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZmlsdGVyZWQgYXJyYXkgdGhhdCBjb250YWlu
cyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMKLSAgICBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAg
Tm90ZSB0aGF0IGJlY2F1c2UgaXQncyBqdXN0IGEgZmlsdGVyLCBpdCB3aWxsIGhhdmUgYW55IGxv
Y2FsbHkKLSAgICBjcmVhdGVkIHJlY29yZHMgb2YgdGhlIHR5cGUuCi0KLSAgICBBbHNvIG5vdGUg
dGhhdCBtdWx0aXBsZSBjYWxscyB0byBgYWxsYCBmb3IgYSBnaXZlbiB0eXBlIHdpbGwgYWx3YXlz
Ci0gICAgcmV0dXJuIHRoZSBzYW1lIFJlY29yZEFycmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBsb2NhbF9wb3N0cyA9IHN0b3JlLmFsbChBcHAuUG9zdCk7
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFsbAotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9Ci0gICov
Ci0gIGFsbDogZnVuY3Rpb24odHlwZSkgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUp
OwotCi0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGZp
bmRBbGxDYWNoZSA9IHR5cGVNYXAuZmluZEFsbENhY2hlOwotCi0gICAgaWYgKGZpbmRBbGxDYWNo
ZSkgeyByZXR1cm4gZmluZEFsbENhY2hlOyB9Ci0KLSAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29y
ZEFycmF5TWFuYWdlci5jcmVhdGVSZWNvcmRBcnJheSh0eXBlKTsKLQotICAgIHR5cGVNYXAuZmlu
ZEFsbENhY2hlID0gYXJyYXk7Ci0gICAgcmV0dXJuIGFycmF5OwotICB9LAotCi0KLSAgLyoqCi0g
ICAgVGhpcyBtZXRob2QgdW5sb2FkcyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMgZm9yIGEgZ2l2
ZW4gdHlwZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS51bmxvYWRBbGwoQXBwLlBv
c3QpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1bmxvYWRBbGwKLSAgICBAcGFyYW0ge1N0cmlu
ZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAqLwotICB1bmxvYWRBbGw6IGZ1bmN0
aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKLQotICAgIHZhciB0
eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAotICAgICAgICByZWNvcmRzID0gdHlwZU1h
cC5yZWNvcmRzLnNwbGljZSgwKSwgcmVjb3JkOwotCi0gICAgd2hpbGUocmVjb3JkID0gcmVjb3Jk
cy5wb3AoKSkgewotICAgICAgcmVjb3JkLnVubG9hZFJlY29yZCgpOwotICAgIH0KLQotICAgIHR5
cGVNYXAuZmluZEFsbENhY2hlID0gbnVsbDsKLSAgfSwKLQotICAvKioKLSAgICBUYWtlcyBhIHR5
cGUgYW5kIGZpbHRlciBmdW5jdGlvbiwgYW5kIHJldHVybnMgYSBsaXZlIFJlY29yZEFycmF5IHRo
YXQKLSAgICByZW1haW5zIHVwIHRvIGRhdGUgYXMgbmV3IHJlY29yZHMgYXJlIGxvYWRlZCBpbnRv
IHRoZSBzdG9yZSBvciBjcmVhdGVkCi0gICAgbG9jYWxseS4KLQotICAgIFRoZSBjYWxsYmFjayBm
dW5jdGlvbiB0YWtlcyBhIG1hdGVyaWFsaXplZCByZWNvcmQsIGFuZCByZXR1cm5zIHRydWUKLSAg
ICBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVyIGFuZCBmYWxz
ZSBpZiBpdCBzaG91bGQKLSAgICBub3QuCi0KLSAgICBUaGUgZmlsdGVyIGZ1bmN0aW9uIGlzIGNh
bGxlZCBvbmNlIG9uIGFsbCByZWNvcmRzIGZvciB0aGUgdHlwZSB3aGVuCi0gICAgaXQgaXMgY3Jl
YXRlZCwgYW5kIHRoZW4gb25jZSBvbiBlYWNoIG5ld2x5IGxvYWRlZCBvciBjcmVhdGVkIHJlY29y
ZC4KLQotICAgIElmIGFueSBvZiBhIHJlY29yZCdzIHByb3BlcnRpZXMgY2hhbmdlLCBvciBpZiBp
dCBjaGFuZ2VzIHN0YXRlLCB0aGUKLSAgICBmaWx0ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2Vk
IGFnYWluIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZAotICAgIHN0aWxsIGJlIGluIHRo
ZSBhcnJheS4KLQotICAgIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgcXVlcnkgd2hpY2ggd2ls
bCBiZSB0cmlnZ2VyZWQgYXQgZmlyc3QuIFRoZQotICAgIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhl
IHNlcnZlciBjb3VsZCB0aGVuIGFwcGVhciBpbiB0aGUgZmlsdGVyIGlmIHRoZXkKLSAgICBtYXRj
aCB0aGUgZmlsdGVyIGZ1bmN0aW9uLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIHN0b3JlLmZpbHRlcihBcHAuUG9zdCwge3VucmVhZDogdHJ1ZX0sIGZ1bmN0aW9uKHBv
c3QpIHsKLSAgICAgIHJldHVybiBwb3N0LmdldCgndW5yZWFkJyk7Ci0gICAgfSkudGhlbihmdW5j
dGlvbih1bnJlYWRQb3N0cykgewotICAgICAgdW5yZWFkUG9zdHMuZ2V0KCdsZW5ndGgnKTsgLy8g
NQotICAgICAgdmFyIHVucmVhZFBvc3QgPSB1bnJlYWRQb3N0cy5vYmplY3RBdCgwKTsKLSAgICAg
IHVucmVhZFBvc3Quc2V0KCd1bnJlYWQnLCBmYWxzZSk7Ci0gICAgICB1bnJlYWRQb3N0cy5nZXQo
J2xlbmd0aCcpOyAvLyA0Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGZpbHRlcgot
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBh
cmFtIHtPYmplY3R9IHF1ZXJ5IG9wdGlvbmFsIHF1ZXJ5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0g
ZmlsdGVyCi0gICAgQHJldHVybiB7RFMuUHJvbWlzZUFycmF5fQotICAqLwotICBmaWx0ZXI6IGZ1
bmN0aW9uKHR5cGUsIHF1ZXJ5LCBmaWx0ZXIpIHsKLSAgICB2YXIgcHJvbWlzZTsKLQotICAgIC8v
IGFsbG93IGFuIG9wdGlvbmFsIHNlcnZlciBxdWVyeQotICAgIGlmIChhcmd1bWVudHMubGVuZ3Ro
ID09PSAzKSB7Ci0gICAgICBwcm9taXNlID0gdGhpcy5maW5kUXVlcnkodHlwZSwgcXVlcnkpOwot
ICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgZmlsdGVyID0g
cXVlcnk7Ci0gICAgfQotCi0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2
YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgotICAgICAgLmNyZWF0ZUZpbHRlcmVk
UmVjb3JkQXJyYXkodHlwZSwgZmlsdGVyKTsKLSAgICBwcm9taXNlID0gcHJvbWlzZSB8fCByZXNv
bHZlKGFycmF5KTsKLQotICAgIHJldHVybiBwcm9taXNlQXJyYXkocHJvbWlzZS50aGVuKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0sIG51bGwsICJEUzogU3RvcmUjZmls
dGVyIG9mICIgKyB0eXBlKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgcmV0dXJu
cyBpZiBhIGNlcnRhaW4gcmVjb3JkIGlzIGFscmVhZHkgbG9hZGVkCi0gICAgaW4gdGhlIHN0b3Jl
LiBVc2UgdGhpcyBmdW5jdGlvbiB0byBrbm93IGJlZm9yZWhhbmQgaWYgYSBmaW5kKCkKLSAgICB3
aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhhdCBpdCB3aWxsIGJlIGEgY2FjaGUgaGl0Lgot
Ci0gICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS5yZWNvcmRJc0xv
YWRlZChBcHAuUG9zdCwgMSk7IC8vIGZhbHNlCi0gICAgc3RvcmUuZmluZChBcHAuUG9zdCwgMSku
dGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHN0b3JlLnJlY29yZElzTG9hZGVkKEFwcC5Qb3N0LCAx
KTsgLy8gdHJ1ZQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCByZWNvcmRJc0xvYWRl
ZAotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAg
QHBhcmFtIHtzdHJpbmd9IGlkCi0gICAgQHJldHVybiB7Ym9vbGVhbn0KLSAgKi8KLSAgcmVjb3Jk
SXNMb2FkZWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgaWYgKCF0aGlzLmhhc1JlY29yZEZv
cklkKHR5cGUsIGlkKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICByZXR1cm4gIWdldCh0aGlzLnJl
Y29yZEZvcklkKHR5cGUsIGlkKSwgJ2lzRW1wdHknKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlz
IG1ldGhvZCByZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyB0eXBlLgotCi0gICAg
QG1ldGhvZCBtZXRhZGF0YUZvcgotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7b2JqZWN0fQotICAqLwotICBtZXRhZGF0YUZvcjog
ZnVuY3Rpb24odHlwZSkgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotICAgIHJl
dHVybiB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0YWRhdGE7Ci0gIH0sCi0KLSAgLy8gLi4uLi4u
Li4uLi4uCi0gIC8vIC4gVVBEQVRJTkcgLgotICAvLyAuLi4uLi4uLi4uLi4KLQotICAvKioKLSAg
ICBJZiB0aGUgYWRhcHRlciB1cGRhdGVzIGF0dHJpYnV0ZXMgb3IgYWNrbm93bGVkZ2VzIGNyZWF0
aW9uCi0gICAgb3IgZGVsZXRpb24sIHRoZSByZWNvcmQgd2lsbCBub3RpZnkgdGhlIHN0b3JlIHRv
IHVwZGF0ZSBpdHMKLSAgICBtZW1iZXJzaGlwIGluIGFueSBmaWx0ZXJzLgotICAgIFRvIGF2b2lk
IHRocmFzaGluZywgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5IG9uY2UgcGVyCi0KLSAgICBy
dW4gbG9vcCBwZXIgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBkYXRhV2FzVXBkYXRlZAotICAgIEBw
cml2YXRlCi0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJl
Y29yZAotICAqLwotICBkYXRhV2FzVXBkYXRlZDogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7Ci0g
ICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBQRVJTSVNUSU5HIC4KLSAgLy8gLi4uLi4u
Li4uLi4uLi4KLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYHJlY29yZC5z
YXZlYCwgYW5kIGdldHMgcGFzc2VkIGEKLSAgICByZXNvbHZlciBmb3IgdGhlIHByb21pc2UgdGhh
dCBgcmVjb3JkLnNhdmVgIHJldHVybnMuCi0KLSAgICBJdCBzY2hlZHVsZXMgc2F2aW5nIHRvIGhh
cHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcC4KLQotICAgIEBtZXRob2Qgc2NoZWR1bGVT
YXZlCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFy
YW0ge1Jlc29sdmVyfSByZXNvbHZlcgotICAqLwotICBzY2hlZHVsZVNhdmU6IGZ1bmN0aW9uKHJl
Y29yZCwgcmVzb2x2ZXIpIHsKLSAgICByZWNvcmQuYWRhcHRlcldpbGxDb21taXQoKTsKLSAgICB0
aGlzLl9wZW5kaW5nU2F2ZS5wdXNoKFtyZWNvcmQsIHJlc29sdmVyXSk7Ci0gICAgb25jZSh0aGlz
LCAnZmx1c2hQZW5kaW5nU2F2ZScpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlz
IGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcCwgYW5kCi0gICAgZmx1c2hlcyBhbnkg
cmVjb3JkcyBwYXNzZWQgaW50byBgc2NoZWR1bGVTYXZlYAotCi0gICAgQG1ldGhvZCBmbHVzaFBl
bmRpbmdTYXZlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgZmx1c2hQZW5kaW5nU2F2ZTogZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nU2F2ZS5zbGljZSgpOwotICAg
IHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0KLSAgICBmb3JFYWNoKHBlbmRpbmcsIGZ1bmN0aW9u
KHR1cGxlKSB7Ci0gICAgICB2YXIgcmVjb3JkID0gdHVwbGVbMF0sIHJlc29sdmVyID0gdHVwbGVb
MV0sCi0gICAgICAgICAgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcihyZWNvcmQuY29uc3RydWN0
b3IpLAotICAgICAgICAgIG9wZXJhdGlvbjsKLQotICAgICAgaWYgKGdldChyZWNvcmQsICdpc05l
dycpKSB7Ci0gICAgICAgIG9wZXJhdGlvbiA9ICdjcmVhdGVSZWNvcmQnOwotICAgICAgfSBlbHNl
IGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsKLSAgICAgICAgb3BlcmF0aW9uID0gJ2Rl
bGV0ZVJlY29yZCc7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvcGVyYXRpb24gPSAndXBkYXRl
UmVjb3JkJzsKLSAgICAgIH0KLQotICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfY29tbWl0KGFkYXB0
ZXIsIHRoaXMsIG9wZXJhdGlvbiwgcmVjb3JkKSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgdGhlIHByb21pc2UgcmV0dXJuZWQg
YnkgYW4KLSAgICBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBk
ZWxldGVSZWNvcmRgCi0gICAgaXMgcmVzb2x2ZWQuCi0KLSAgICBJZiB0aGUgZGF0YSBwcm92aWRl
cyBhIHNlcnZlci1nZW5lcmF0ZWQgSUQsIGl0IHdpbGwKLSAgICB1cGRhdGUgdGhlIHJlY29yZCBh
bmQgdGhlIHN0b3JlJ3MgaW5kZXhlcy4KLQotICAgIEBtZXRob2QgZGlkU2F2ZVJlY29yZAotICAg
IEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSBpbi1mbGlnaHQgcmVj
b3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEgb3B0aW9uYWwgZGF0YSAoc2VlIGFib3ZlKQot
ICAqLwotICBkaWRTYXZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIGRhdGEpIHsKLSAgICBpZiAo
ZGF0YSkgewotICAgICAgLy8gbm9ybWFsaXplIHJlbGF0aW9uc2hpcCBJRHMgaW50byByZWNvcmRz
Ci0gICAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlwcyh0aGlzLCByZWNvcmQuY29uc3Ry
dWN0b3IsIGRhdGEsIHJlY29yZCk7Ci0KLSAgICAgIHRoaXMudXBkYXRlSWQocmVjb3JkLCBkYXRh
KTsKLSAgICB9Ci0KLSAgICByZWNvcmQuYWRhcHRlckRpZENvbW1pdChkYXRhKTsKLSAgfSwKLQot
ICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5l
ZCBieSBhbgotICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3Ig
YGRlbGV0ZVJlY29yZGAKLSAgICBpcyByZWplY3RlZCB3aXRoIGEgYERTLkludmFsaWRFcnJvcmAu
Ci0KLSAgICBAbWV0aG9kIHJlY29yZFdhc0ludmFsaWQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBlcnJvcnMKLSAgKi8KLSAg
cmVjb3JkV2FzSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkLCBlcnJvcnMpIHsKLSAgICByZWNvcmQu
YWRhcHRlckRpZEludmFsaWRhdGUoZXJyb3JzKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhbgotICAgIGFkYXB0
ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKLSAg
ICBpcyByZWplY3RlZCAod2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGEgYERTLkludmFsaWRFcnJv
cmApLgotCi0gICAgQG1ldGhvZCByZWNvcmRXYXNFcnJvcgotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIHJlY29yZFdhc0Vycm9yOiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICByZWNvcmQuYWRhcHRlckRpZEVycm9yKCk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgV2hlbiBhbiBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBk
ZWxldGVSZWNvcmRgCi0gICAgcmVzb2x2ZXMgd2l0aCBkYXRhLCB0aGlzIG1ldGhvZCBleHRyYWN0
cyB0aGUgSUQgZnJvbSB0aGUgc3VwcGxpZWQKLSAgICBkYXRhLgotCi0gICAgQG1ldGhvZCB1cGRh
dGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBh
cmFtIHtPYmplY3R9IGRhdGEKLSAgKi8KLSAgdXBkYXRlSWQ6IGZ1bmN0aW9uKHJlY29yZCwgZGF0
YSkgewotICAgIHZhciBvbGRJZCA9IGdldChyZWNvcmQsICdpZCcpLAotICAgICAgICBpZCA9IGNv
ZXJjZUlkKGRhdGEuaWQpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJBbiBhZGFwdGVyIGNhbm5vdCBh
c3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5IGhhcyBhbiBpZC4gIiArIHJl
Y29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3UgdHJpZWQgdG8gdXBkYXRlIGl0
IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkgaGFwcGVuZWQgYmVjYXVzZSB5b3VyIHNlcnZl
ciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRvIGEgZmluZCBvciB1cGRhdGUgdGhhdCBoYWQg
YSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIsIG9sZElkID09PSBudWxsIHx8
IGlkID09PSBvbGRJZCk7Ci0KLSAgICB0aGlzLnR5cGVNYXBGb3IocmVjb3JkLmNvbnN0cnVjdG9y
KS5pZFRvUmVjb3JkW2lkXSA9IHJlY29yZDsKLQotICAgIHNldChyZWNvcmQsICdpZCcsIGlkKTsK
LSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEgbWFwIG9mIElEcyB0byBjbGllbnQgSURzIGZv
ciBhIGdpdmVuIHR5cGUuCi0KLSAgICBAbWV0aG9kIHR5cGVNYXBGb3IKLSAgICBAcHJpdmF0ZQot
ICAgIEBwYXJhbSB0eXBlCi0gICAgQHJldHVybiB7T2JqZWN0fSB0eXBlTWFwCi0gICovCi0gIHR5
cGVNYXBGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB2YXIgdHlwZU1hcHMgPSBnZXQodGhpcywg
J3R5cGVNYXBzJyksCi0gICAgICAgIGd1aWQgPSBFbWJlci5ndWlkRm9yKHR5cGUpLAotICAgICAg
ICB0eXBlTWFwOwotCi0gICAgdHlwZU1hcCA9IHR5cGVNYXBzW2d1aWRdOwotCi0gICAgaWYgKHR5
cGVNYXApIHsgcmV0dXJuIHR5cGVNYXA7IH0KLQotICAgIHR5cGVNYXAgPSB7Ci0gICAgICBpZFRv
UmVjb3JkOiB7fSwKLSAgICAgIHJlY29yZHM6IFtdLAotICAgICAgbWV0YWRhdGE6IHt9Ci0gICAg
fTsKLQotICAgIHR5cGVNYXBzW2d1aWRdID0gdHlwZU1hcDsKLQotICAgIHJldHVybiB0eXBlTWFw
OwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBMT0FESU5HIERBVEEgLgot
ICAvLyAuLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgVGhpcyBpbnRlcm5hbCBtZXRob2Qg
aXMgdXNlZCBieSBgcHVzaGAuCi0KLSAgICBAbWV0aG9kIF9sb2FkCi0gICAgQHByaXZhdGUKLSAg
ICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7T2JqZWN0fSBkYXRhCi0gICAgQHBhcmFtIHtCb29sZWFufSBwYXJ0aWFsIHRoZSBkYXRhIHNo
b3VsZCBiZSBtZXJnZWQgaW50bwotICAgICAgdGhlIGV4aXN0aW5nIGRhdGEsIG5vdCByZXBsYWNl
IGl0LgotICAqLwotICBfbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgcGFydGlhbCkgewotICAg
IHZhciBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpLAotICAgICAgICByZWNvcmQgPSB0aGlzLnJlY29y
ZEZvcklkKHR5cGUsIGlkKTsKLQotICAgIHJlY29yZC5zZXR1cERhdGEoZGF0YSwgcGFydGlhbCk7
Ci0gICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0K
LSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYSBtb2RlbCBj
bGFzcyBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gVXNlZCBieQotICAgIG1ldGhvZHMgdGhhdCB0YWtl
IGEgdHlwZSBrZXkgKGxpa2UgYGZpbmRgLCBgY3JlYXRlUmVjb3JkYCwKLSAgICBldGMuKQotCi0g
ICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSBrZXkKLSAgICBAcmV0dXJucyB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9Ci0gICovCi0g
IG1vZGVsRm9yOiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgZmFjdG9yeTsKLQotCi0gICAgaWYg
KHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB2YXIgbm9ybWFsaXplZEtleSA9IHRo
aXMuY29udGFpbmVyLm5vcm1hbGl6ZSgnbW9kZWw6JyArIGtleSk7Ci0KLSAgICAgIGZhY3Rvcnkg
PSB0aGlzLmNvbnRhaW5lci5sb29rdXBGYWN0b3J5KG5vcm1hbGl6ZWRLZXkpOwotICAgICAgaWYg
KCFmYWN0b3J5KSB7IHRocm93IG5ldyBFbWJlci5FcnJvcigiTm8gbW9kZWwgd2FzIGZvdW5kIGZv
ciAnIiArIGtleSArICInIik7IH0KLSAgICAgIGZhY3RvcnkudHlwZUtleSA9IG5vcm1hbGl6ZWRL
ZXkuc3BsaXQoJzonLCAyKVsxXTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gQSBmYWN0b3J5IGFs
cmVhZHkgc3VwcGxpZWQuCi0gICAgICBmYWN0b3J5ID0ga2V5OwotICAgIH0KLQotICAgIGZhY3Rv
cnkuc3RvcmUgPSB0aGlzOwotICAgIHJldHVybiBmYWN0b3J5OwotICB9LAotCi0gIC8qKgotICAg
IFB1c2ggc29tZSBkYXRhIGZvciBhIGdpdmVuIHR5cGUgaW50byB0aGUgc3RvcmUuCi0KLSAgICBU
aGlzIG1ldGhvZCBleHBlY3RzIG5vcm1hbGl6ZWQgZGF0YToKLQotICAgICogVGhlIElEIGlzIGEg
a2V5IG5hbWVkIGBpZGAgKGFuIElEIGlzIG1hbmRhdG9yeSkKLSAgICAqIFRoZSBuYW1lcyBvZiBh
dHRyaWJ1dGVzIGFyZSB0aGUgb25lcyB5b3UgdXNlZCBpbgotICAgICAgeW91ciBtb2RlbCdzIGBE
Uy5hdHRyYHMuCi0gICAgKiBZb3VyIHJlbGF0aW9uc2hpcHMgbXVzdCBiZToKLSAgICAgICogcmVw
cmVzZW50ZWQgYXMgSURzIG9yIEFycmF5cyBvZiBJRHMKLSAgICAgICogcmVwcmVzZW50ZWQgYXMg
bW9kZWwgaW5zdGFuY2VzCi0gICAgICAqIHJlcHJlc2VudGVkIGFzIFVSTHMsIHVuZGVyIHRoZSBg
bGlua3NgIGtleQotCi0gICAgRm9yIHRoaXMgbW9kZWw6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Q
ZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1lOiBEUy5hdHRyKCksCi0g
ICAgICBsYXN0TmFtZTogRFMuYXR0cigpLAotCi0gICAgICBjaGlsZHJlbjogRFMuaGFzTWFueSgn
cGVyc29uJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRvIHJlcHJlc2VudCB0aGUgY2hpbGRy
ZW4gYXMgSURzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICBpZDogMSwKLSAgICAgIGZpcnN0
TmFtZTogIlRvbSIsCi0gICAgICBsYXN0TmFtZTogIkRhbGUiLAotICAgICAgY2hpbGRyZW46IFsx
LCAyLCAzXQotICAgIH0KLSAgICBgYGAKLQotICAgIFRvIHJlcHJlc2VudCB0aGUgY2hpbGRyZW4g
cmVsYXRpb25zaGlwIGFzIGEgVVJMOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICBpZDogMSwK
LSAgICAgIGZpcnN0TmFtZTogIlRvbSIsCi0gICAgICBsYXN0TmFtZTogIkRhbGUiLAotICAgICAg
bGlua3M6IHsKLSAgICAgICAgY2hpbGRyZW46ICIvcGVvcGxlLzEvY2hpbGRyZW4iCi0gICAgICB9
Ci0gICAgfQotICAgIGBgYAotCi0gICAgSWYgeW91J3JlIHN0cmVhbWluZyBkYXRhIG9yIGltcGxl
bWVudGluZyBhbiBhZGFwdGVyLAotICAgIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGNvbnZlcnRl
ZCB0aGUgaW5jb21pbmcgZGF0YQotICAgIGludG8gdGhpcyBmb3JtLgotCi0gICAgVGhpcyBtZXRo
b2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldwotICAgIHJlY29yZHMsIGFz
IHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCi0KLSAgICBAbWV0aG9kIHB1c2gK
LSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBw
YXJhbSB7T2JqZWN0fSBkYXRhCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRo
YXQgd2FzIGNyZWF0ZWQgb3IKLSAgICAgIHVwZGF0ZWQuCi0gICovCi0gIHB1c2g6IGZ1bmN0aW9u
KHR5cGUsIGRhdGEsIF9wYXJ0aWFsKSB7Ci0gICAgLy8gX3BhcnRpYWwgaXMgYW4gaW50ZXJuYWwg
cGFyYW0gdXNlZCBieSBgdXBkYXRlYC4KLSAgICAvLyBJZiBwYXNzZWQsIGl0IG1lYW5zIHRoYXQg
dGhlIGRhdGEgc2hvdWxkIGJlCi0gICAgLy8gbWVyZ2VkIGludG8gdGhlIGV4aXN0aW5nIGRhdGEs
IG5vdCByZXBsYWNlIGl0LgotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBpbmNsdWRlIGFu
IGBpZGAgaW4gYSBoYXNoIHBhc3NlZCB0byBgcHVzaGAiLCBkYXRhLmlkICE9IG51bGwpOwotCi0g
ICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICAvLyBub3JtYWxpemUgcmVsYXRp
b25zaGlwIElEcyBpbnRvIHJlY29yZHMKLSAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlw
cyh0aGlzLCB0eXBlLCBkYXRhKTsKLQotICAgIHRoaXMuX2xvYWQodHlwZSwgZGF0YSwgX3BhcnRp
YWwpOwotCi0gICAgcmV0dXJuIHRoaXMucmVjb3JkRm9ySWQodHlwZSwgZGF0YS5pZCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUHVzaCBzb21lIHJhdyBkYXRhIGludG8gdGhlIHN0b3JlLgotCi0gICAg
VGhlIGRhdGEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlc2VyaWFsaXplZCB1c2luZyB0aGUKLSAg
ICBzZXJpYWxpemVyIGZvciB0aGUgYHR5cGVgIHBhcmFtLgotCi0gICAgVGhpcyBtZXRob2QgY2Fu
IGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldwotICAgIHJlY29yZHMsIGFzIHdlbGwg
YXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCi0KLSAgICBZb3UgY2FuIHB1c2ggaW4gbW9y
ZSB0aGFuIG9uZSB0eXBlIG9mIG9iamVjdCBhdCBvbmNlLgotICAgIEFsbCBvYmplY3RzIHNob3Vs
ZCBiZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZQotICAgIHNlcmlhbGl6ZXIuCi0KLSAg
ICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2RlbFNl
cmlhbGl6ZXI7Ci0KLSAgICB2YXIgcHVzaERhdGEgPSB7Ci0gICAgICBwb3N0czogWwotICAgICAg
ICB7aWQ6IDEsIHBvc3RfdGl0bGU6ICJHcmVhdCBwb3N0IiwgY29tbWVudF9pZHM6IFsyXX0KLSAg
ICAgIF0sCi0gICAgICBjb21tZW50czogWwotICAgICAgICB7aWQ6IDIsIGNvbW1lbnRfYm9keTog
Ikluc2lnaHRmdWwgY29tbWVudCJ9Ci0gICAgICBdCi0gICAgfQotCi0gICAgc3RvcmUucHVzaFBh
eWxvYWQoJ3Bvc3QnLCBwdXNoRGF0YSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHB1c2hQYXls
b2FkCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9h
ZAotICAgIEByZXR1cm4ge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRoYXQgd2FzIGNyZWF0ZWQgb3Ig
dXBkYXRlZC4KLSAgKi8KLSAgcHVzaFBheWxvYWQ6IGZ1bmN0aW9uICh0eXBlLCBwYXlsb2FkKSB7
Ci0gICAgdmFyIHNlcmlhbGl6ZXI7Ci0gICAgaWYgKCFwYXlsb2FkKSB7Ci0gICAgICBwYXlsb2Fk
ID0gdHlwZTsKLSAgICAgIHNlcmlhbGl6ZXIgPSBkZWZhdWx0U2VyaWFsaXplcih0aGlzLmNvbnRh
aW5lcik7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgdXNlIGBzdG9yZSNwdXNoUGF5
bG9hZGAgd2l0aG91dCBhIHR5cGUgdW5sZXNzIHlvdXIgZGVmYXVsdCBzZXJpYWxpemVyIGRlZmlu
ZXMgYHB1c2hQYXlsb2FkYCIsIHNlcmlhbGl6ZXIucHVzaFBheWxvYWQpOwotICAgIH0gZWxzZSB7
Ci0gICAgICBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKHR5cGUpOwotICAgIH0KLSAg
ICBzZXJpYWxpemVyLnB1c2hQYXlsb2FkKHRoaXMsIHBheWxvYWQpOwotICB9LAotCi0gIHVwZGF0
ZTogZnVuY3Rpb24odHlwZSwgZGF0YSkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgaW5j
bHVkZSBhbiBgaWRgIGluIGEgaGFzaCBwYXNzZWQgdG8gYHVwZGF0ZWAiLCBkYXRhLmlkICE9IG51
bGwpOwotCi0gICAgcmV0dXJuIHRoaXMucHVzaCh0eXBlLCBkYXRhLCB0cnVlKTsKLSAgfSwKLQot
ICAvKioKLSAgICBJZiB5b3UgaGF2ZSBhbiBBcnJheSBvZiBub3JtYWxpemVkIGRhdGEgdG8gcHVz
aCwKLSAgICB5b3UgY2FuIGNhbGwgYHB1c2hNYW55YCB3aXRoIHRoZSBBcnJheSwgYW5kIGl0IHdp
bGwKLSAgICBjYWxsIGBwdXNoYCByZXBlYXRlZGx5IGZvciB5b3UuCi0KLSAgICBAbWV0aG9kIHB1
c2hNYW55Ci0gICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUK
LSAgICBAcGFyYW0ge0FycmF5fSBkYXRhcwotICAgIEByZXR1cm4ge0FycmF5fQotICAqLwotICBw
dXNoTWFueTogZnVuY3Rpb24odHlwZSwgZGF0YXMpIHsKLSAgICByZXR1cm4gbWFwKGRhdGFzLCBm
dW5jdGlvbihkYXRhKSB7Ci0gICAgICByZXR1cm4gdGhpcy5wdXNoKHR5cGUsIGRhdGEpOwotICAg
IH0sIHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIElmIHlvdSBoYXZlIHNvbWUgbWV0YWRhdGEg
dG8gc2V0IGZvciBhIHR5cGUKLSAgICB5b3UgY2FuIGNhbGwgYG1ldGFGb3JUeXBlYC4KLQotICAg
IEBtZXRob2QgbWV0YUZvclR5cGUKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBE
Uy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBtZXRhZGF0YQotICAqLwotICBtZXRh
Rm9yVHlwZTogZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEpIHsKLSAgICB0eXBlID0gdGhpcy5tb2Rl
bEZvcih0eXBlKTsKLQotICAgIEVtYmVyLm1lcmdlKHRoaXMudHlwZU1hcEZvcih0eXBlKS5tZXRh
ZGF0YSwgbWV0YWRhdGEpOwotICB9LAotCi0gIC8qKgotICAgIEJ1aWxkIGEgYnJhbmQgbmV3IHJl
Y29yZCBmb3IgYSBnaXZlbiB0eXBlLCBJRCwgYW5kCi0gICAgaW5pdGlhbCBkYXRhLgotCi0gICAg
QG1ldGhvZCBidWlsZFJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBkYXRhCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgYnVpbGRS
ZWNvcmQ6IGZ1bmN0aW9uKHR5cGUsIGlkLCBkYXRhKSB7Ci0gICAgdmFyIHR5cGVNYXAgPSB0aGlz
LnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGlkVG9SZWNvcmQgPSB0eXBlTWFwLmlkVG9SZWNv
cmQ7Ci0KLSAgICBFbWJlci5hc3NlcnQoJ1RoZSBpZCAnICsgaWQgKyAnIGhhcyBhbHJlYWR5IGJl
ZW4gdXNlZCB3aXRoIGFub3RoZXIgcmVjb3JkIG9mIHR5cGUgJyArIHR5cGUudG9TdHJpbmcoKSAr
ICcuJywgIWlkIHx8ICFpZFRvUmVjb3JkW2lkXSk7Ci0KLSAgICAvLyBsb29rdXBGYWN0b3J5IHNo
b3VsZCByZWFsbHkgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNyZWF0ZXMKLSAgICAvLyBpbnN0YW5j
ZXMgd2l0aCB0aGUgaW5qZWN0aW9ucyBhcHBsaWVkCi0gICAgdmFyIHJlY29yZCA9IHR5cGUuX2Ny
ZWF0ZSh7Ci0gICAgICBpZDogaWQsCi0gICAgICBzdG9yZTogdGhpcywKLSAgICAgIGNvbnRhaW5l
cjogdGhpcy5jb250YWluZXIKLSAgICB9KTsKLQotICAgIGlmIChkYXRhKSB7Ci0gICAgICByZWNv
cmQuc2V0dXBEYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8vIGlmIHdlJ3JlIGNyZWF0aW5nIGFu
IGl0ZW0sIHRoaXMgcHJvY2VzcyB3aWxsIGJlIGRvbmUKLSAgICAvLyBsYXRlciwgb25jZSB0aGUg
b2JqZWN0IGhhcyBiZWVuIHBlcnNpc3RlZC4KLSAgICBpZiAoaWQpIHsKLSAgICAgIGlkVG9SZWNv
cmRbaWRdID0gcmVjb3JkOwotICAgIH0KLQotICAgIHR5cGVNYXAucmVjb3Jkcy5wdXNoKHJlY29y
ZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLgot
ICAvLyAuIERFU1RSVUNUSU9OIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAg
V2hlbiBhIHJlY29yZCBpcyBkZXN0cm95ZWQsIHRoaXMgdW4taW5kZXhlcyBpdCBhbmQKLSAgICBy
ZW1vdmVzIGl0IGZyb20gYW55IHJlY29yZCBhcnJheXMgc28gaXQgY2FuIGJlIEdDZWQuCi0KLSAg
ICBAbWV0aG9kIGRlbWF0ZXJpYWxpemVSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7
RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBkZW1hdGVyaWFsaXplUmVjb3JkOiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgdHlw
ZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKLSAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAn
aWQnKTsKLQotICAgIHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKLQotICAgIGlmIChpZCkg
ewotICAgICAgZGVsZXRlIHR5cGVNYXAuaWRUb1JlY29yZFtpZF07Ci0gICAgfQotCi0gICAgdmFy
IGxvYyA9IGluZGV4T2YodHlwZU1hcC5yZWNvcmRzLCByZWNvcmQpOwotICAgIHR5cGVNYXAucmVj
b3Jkcy5zcGxpY2UobG9jLCAxKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4KLSAgLy8gLiBSRUxBVElPTlNISVAgQ0hBTkdFUyAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgotCi0gIGFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcjogZnVuY3Rpb24oY2hpbGRSZWNv
cmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBhcmVudEtleSwgY2hhbmdlKSB7Ci0gICAgdmFy
IGNsaWVudElkID0gY2hpbGRSZWNvcmQuY2xpZW50SWQsCi0gICAgICAgIHBhcmVudENsaWVudElk
ID0gcGFyZW50UmVjb3JkID8gcGFyZW50UmVjb3JkIDogcGFyZW50UmVjb3JkOwotICAgIHZhciBr
ZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKLSAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX3JlbGF0
aW9uc2hpcENoYW5nZXM7Ci0gICAgaWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykpIHsKLSAgICAg
IGNoYW5nZXNbY2xpZW50SWRdID0ge307Ci0gICAgfQotICAgIGlmICghKHBhcmVudENsaWVudElk
IGluIGNoYW5nZXNbY2xpZW50SWRdKSkgewotICAgICAgY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50
Q2xpZW50SWRdID0ge307Ci0gICAgfQotICAgIGlmICghKGtleSBpbiBjaGFuZ2VzW2NsaWVudElk
XVtwYXJlbnRDbGllbnRJZF0pKSB7Ci0gICAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGll
bnRJZF1ba2V5XSA9IHt9OwotICAgIH0KLSAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGll
bnRJZF1ba2V5XVtjaGFuZ2UuY2hhbmdlVHlwZV0gPSBjaGFuZ2U7Ci0gIH0sCi0KLSAgcmVtb3Zl
UmVsYXRpb25zaGlwQ2hhbmdlRm9yOiBmdW5jdGlvbihjbGllbnRSZWNvcmQsIGNoaWxkS2V5LCBw
YXJlbnRSZWNvcmQsIHBhcmVudEtleSwgdHlwZSkgewotICAgIHZhciBjbGllbnRJZCA9IGNsaWVu
dFJlY29yZC5jbGllbnRJZCwKLSAgICAgICAgcGFyZW50Q2xpZW50SWQgPSBwYXJlbnRSZWNvcmQg
PyBwYXJlbnRSZWNvcmQuY2xpZW50SWQgOiBwYXJlbnRSZWNvcmQ7Ci0gICAgdmFyIGNoYW5nZXMg
PSB0aGlzLl9yZWxhdGlvbnNoaXBDaGFuZ2VzOwotICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBh
cmVudEtleTsKLSAgICBpZiAoIShjbGllbnRJZCBpbiBjaGFuZ2VzKSB8fCAhKHBhcmVudENsaWVu
dElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSB8fCAhKGtleSBpbiBjaGFuZ2VzW2NsaWVudElkXVtw
YXJlbnRDbGllbnRJZF0pKXsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGVsZXRlIGNoYW5n
ZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtrZXldW3R5cGVdOwotICB9LAotCi0gIHJlbGF0
aW9uc2hpcENoYW5nZVBhaXJzRm9yOiBmdW5jdGlvbihyZWNvcmQpewotICAgIHZhciB0b1JldHVy
biA9IFtdOwotCi0gICAgaWYoICFyZWNvcmQgKSB7IHJldHVybiB0b1JldHVybjsgfQotCi0gICAg
Ly9UT0RPKElnb3IpIFdoYXQgYWJvdXQgdGhlIG90aGVyIHNpZGUKLSAgICB2YXIgY2hhbmdlc09i
amVjdCA9IHRoaXMuX3JlbGF0aW9uc2hpcENoYW5nZXNbcmVjb3JkLmNsaWVudElkXTsKLSAgICBm
b3IgKHZhciBvYmpLZXkgaW4gY2hhbmdlc09iamVjdCl7Ci0gICAgICBpZihjaGFuZ2VzT2JqZWN0
Lmhhc093blByb3BlcnR5KG9iaktleSkpewotICAgICAgICBmb3IgKHZhciBjaGFuZ2VLZXkgaW4g
Y2hhbmdlc09iamVjdFtvYmpLZXldKXsKLSAgICAgICAgICBpZihjaGFuZ2VzT2JqZWN0W29iaktl
eV0uaGFzT3duUHJvcGVydHkoY2hhbmdlS2V5KSl7Ci0gICAgICAgICAgICB0b1JldHVybi5wdXNo
KGNoYW5nZXNPYmplY3Rbb2JqS2V5XVtjaGFuZ2VLZXldKTsKLSAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvUmV0dXJuOwotICB9LAotCi0gIC8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBQRVItVFlQRSBBREFQVEVSUwotICAvLyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgYWRhcHRlciBmb3Ig
YSBnaXZlbiB0eXBlLgotCi0gICAgQG1ldGhvZCBhZGFwdGVyRm9yCi0gICAgQHByaXZhdGUKLSAg
ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybnMgRFMuQWRh
cHRlcgotICAqLwotICBhZGFwdGVyRm9yOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGNvbnRh
aW5lciA9IHRoaXMuY29udGFpbmVyLCBhZGFwdGVyOwotCi0gICAgaWYgKGNvbnRhaW5lcikgewot
ICAgICAgYWRhcHRlciA9IGNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyArIHR5cGUudHlwZUtl
eSkgfHwgY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicpOwotICAgIH0KLQot
ICAgIHJldHVybiBhZGFwdGVyIHx8IGdldCh0aGlzLCAnZGVmYXVsdEFkYXB0ZXInKTsKLSAgfSwK
LQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBSRUNPUkQgQ0hB
TkdFIE5PVElGSUNBVElPTiAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgot
Ci0gIC8qKgotICAgIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcmlhbGl6ZXIgZm9yIGEg
Z2l2ZW4gdHlwZS4gRm9yCi0gICAgZXhhbXBsZSwgYHNlcmlhbGl6ZXJGb3IoJ3BlcnNvbicpYCB3
aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgotICAgIGBBcHAuUGVyc29uU2VyaWFsaXplcmAuCi0K
LSAgICBJZiBubyBgQXBwLlBlcnNvblNlcmlhbGl6ZXJgIGlzIGZvdW5kLCB0aGlzIG1ldGhvZCB3
aWxsIGxvb2sKLSAgICBmb3IgYW4gYEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXJgICh0aGUgZGVm
YXVsdCBzZXJpYWxpemVyIGZvcgotICAgIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uKS4KLQotICAg
IElmIG5vIGBBcHAuQXBwbGljYXRpb25TZXJpYWxpemVyYCBpcyBmb3VuZCwgaXQgd2lsbCBmYWxs
IGJhY2sKLSAgICB0byBhbiBpbnN0YW5jZSBvZiBgRFMuSlNPTlNlcmlhbGl6ZXJgLgotCi0gICAg
QG1ldGhvZCBzZXJpYWxpemVyRm9yCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
dHlwZSB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEByZXR1cm4ge0RTLlNlcmlhbGl6ZXJ9
Ci0gICovCi0gIHNlcmlhbGl6ZXJGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhp
cy5tb2RlbEZvcih0eXBlKTsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcih0eXBl
KTsKLQotICAgIHJldHVybiBzZXJpYWxpemVyRm9yKHRoaXMuY29udGFpbmVyLCB0eXBlLnR5cGVL
ZXksIGFkYXB0ZXIgJiYgYWRhcHRlci5kZWZhdWx0U2VyaWFsaXplcik7Ci0gIH0KLX0pOwotCi1m
dW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbnNoaXBzKHN0b3JlLCB0eXBlLCBkYXRhLCByZWNvcmQp
IHsKLSAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7
Ci0gICAgLy8gQSBsaW5rICh1c3VhbGx5IGEgVVJMKSB3YXMgYWxyZWFkeSBwcm92aWRlZCBpbgot
ICAgIC8vIG5vcm1hbGl6ZWQgZm9ybQotICAgIGlmIChkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nb
a2V5XSkgewotICAgICAgaWYgKHJlY29yZCAmJiByZWxhdGlvbnNoaXAub3B0aW9ucy5hc3luYykg
eyByZWNvcmQuX3JlbGF0aW9uc2hpcHNba2V5XSA9IG51bGw7IH0KLSAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICB2YXIga2luZCA9IHJlbGF0aW9uc2hpcC5raW5kLAotICAgICAgICB2YWx1ZSA9
IGRhdGFba2V5XTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7IHJldHVybjsgfQotCi0gICAg
aWYgKGtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0gICAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0
b3JlLCBkYXRhLCBrZXksIHJlbGF0aW9uc2hpcCwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAoa2lu
ZCA9PT0gJ2hhc01hbnknKSB7Ci0gICAgICBkZXNlcmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0
YSwga2V5LCByZWxhdGlvbnNoaXAsIHZhbHVlKTsKLSAgICAgIGFkZFVuc2F2ZWRSZWNvcmRzKHJl
Y29yZCwga2V5LCB2YWx1ZSk7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQot
ZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRJZChzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNo
aXAsIGlkKSB7Ci0gIGlmIChpc05vbmUoaWQpIHx8IGlkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsK
LSAgICByZXR1cm47Ci0gIH0KLQotICB2YXIgdHlwZTsKLQotICBpZiAodHlwZW9mIGlkID09PSAn
bnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7Ci0gICAgdHlwZSA9IHR5cGVGb3Io
cmVsYXRpb25zaGlwLCBrZXksIGRhdGEpOwotICAgIGRhdGFba2V5XSA9IHN0b3JlLnJlY29yZEZv
cklkKHR5cGUsIGlkKTsKLSAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7Ci0g
ICAgLy8gcG9seW1vcnBoaWMKLSAgICBkYXRhW2tleV0gPSBzdG9yZS5yZWNvcmRGb3JJZChpZC50
eXBlLCBpZC5pZCk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gdHlwZUZvcihyZWxhdGlvbnNoaXAsIGtl
eSwgZGF0YSkgewotICBpZiAocmVsYXRpb25zaGlwLm9wdGlvbnMucG9seW1vcnBoaWMpIHsKLSAg
ICByZXR1cm4gZGF0YVtrZXkgKyAiVHlwZSJdOwotICB9IGVsc2UgewotICAgIHJldHVybiByZWxh
dGlvbnNoaXAudHlwZTsKLSAgfQotfQotCi1mdW5jdGlvbiBkZXNlcmlhbGl6ZVJlY29yZElkcyhz
dG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIGlkcykgewotICBmb3IgKHZhciBpPTAsIGw9
aWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0b3JlLCBp
ZHMsIGksIHJlbGF0aW9uc2hpcCwgaWRzW2ldKTsKLSAgfQotfQotCi0vLyBJZiB0aGVyZSBhcmUg
YW55IHVuc2F2ZWQgcmVjb3JkcyB0aGF0IGFyZSBpbiBhIGhhc01hbnkgdGhleSB3b24ndCBiZQot
Ly8gaW4gdGhlIHBheWxvYWQsIHNvIGFkZCB0aGVtIGJhY2sgaW4gbWFudWFsbHkuCi1mdW5jdGlv
biBhZGRVbnNhdmVkUmVjb3JkcyhyZWNvcmQsIGtleSwgZGF0YSkgewotICBpZihyZWNvcmQpIHsK
LSAgICBkYXRhLnB1c2hPYmplY3RzKHJlY29yZC5nZXQoa2V5KS5maWx0ZXJCeSgnaXNOZXcnKSk7
Ci0gIH0KLX0KLQotLy8gRGVsZWdhdGlvbiB0byB0aGUgYWRhcHRlciBhbmQgcHJvbWlzZSBtYW5h
Z2VtZW50Ci0vKioKLSAgQSBgUHJvbWlzZUFycmF5YCBpcyBhbiBvYmplY3QgdGhhdCBhY3RzIGxp
a2UgYm90aCBhbiBgRW1iZXIuQXJyYXlgCi0gIGFuZCBhIHByb21pc2UuIFdoZW4gdGhlIHByb21p
c2UgaXMgcmVzb2x2ZWQgdGhlIHRoZSByZXN1bHRpbmcgdmFsdWUKLSAgd2lsbCBiZSBzZXQgdG8g
dGhlIGBQcm9taXNlQXJyYXlgJ3MgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2VzCi0gIGl0
IGVhc3kgdG8gY3JlYXRlIGRhdGEgYmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VBcnJheWAgdGhh
dCB3aWxsIGJlCi0gIHVwZGF0ZWQgd2hlbiB0aGUgcHJvbWlzZSByZXNvbHZlcy4KLQotICBGb3Ig
bW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIFtFbWJlci5Qcm9taXNlUHJveHlNaXhpbgotICBkb2N1
bWVudGF0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4uaHRtbCkuCi0K
LSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHByb21pc2VBcnJheSA9IERTLlBy
b21pc2VBcnJheS5jcmVhdGUoewotICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3Rl
L2RhdGEuanNvbicpCi0gIH0pOwotCi0gIHByb21pc2VBcnJheS5nZXQoJ2xlbmd0aCcpOyAvLyAw
Ci0KLSAgcHJvbWlzZUFycmF5LnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgcHJvbWlzZUFycmF5Lmdl
dCgnbGVuZ3RoJyk7IC8vIDEwMAotICB9KTsKLSAgYGBgCi0KLSAgQGNsYXNzIFByb21pc2VBcnJh
eQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLkFycmF5UHJveHkKLSAgQHVzZXMg
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KLSovCi1EUy5Qcm9taXNlQXJyYXkgPSBFbWJlci5BcnJh
eVByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7Ci0vKioKLSAgQSBgUHJvbWlz
ZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBsaWtlIGJvdGggYW4gYEVtYmVyLk9iamVj
dGAKLSAgYW5kIGEgcHJvbWlzZS4gV2hlbiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB0aGUgdGhl
IHJlc3VsdGluZyB2YWx1ZQotICB3aWxsIGJlIHNldCB0byB0aGUgYFByb21pc2VPYmplY3RgJ3Mg
YGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2VzCi0gIGl0IGVhc3kgdG8gY3JlYXRlIGRhdGEg
YmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VPYmplY3RgIHRoYXQgd2lsbAotICBiZSB1cGRhdGVk
IHdoZW4gdGhlIHByb21pc2UgcmVzb2x2ZXMuCi0KLSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2Vl
IHRoZSBbRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KLSAgZG9jdW1lbnRhdGlvbl0oL2FwaS9jbGFz
c2VzL0VtYmVyLlByb21pc2VQcm94eU1peGluLmh0bWwpLgotCi0gIEV4YW1wbGUKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBwcm9taXNlT2JqZWN0ID0gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUo
ewotICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3RlL2RhdGEuanNvbicpCi0gIH0p
OwotCi0gIHByb21pc2VPYmplY3QuZ2V0KCduYW1lJyk7IC8vIG51bGwKLQotICBwcm9taXNlT2Jq
ZWN0LnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgcHJvbWlzZU9iamVjdC5nZXQoJ25hbWUnKTsgLy8g
J1RvbXN0ZXInCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgUHJvbWlzZU9iamVjdAotICBAbmFt
ZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdFByb3h5Ci0gIEB1c2VzIEVtYmVyLlBy
b21pc2VQcm94eU1peGluCi0qLwotRFMuUHJvbWlzZU9iamVjdCA9IEVtYmVyLk9iamVjdFByb3h5
LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7Ci0KLWZ1bmN0aW9uIHByb21pc2VPYmpl
Y3QocHJvbWlzZSkgewotICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNl
OiBwcm9taXNlIH0pOwotfQotCi1mdW5jdGlvbiBwcm9taXNlQXJyYXkocHJvbWlzZSkgewotICBy
ZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2UgfSk7Ci19Ci0K
LWZ1bmN0aW9uIGlzVGhlbmFibGUob2JqZWN0KSB7Ci0gIHJldHVybiBvYmplY3QgJiYgdHlwZW9m
IG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nOwotfQotCi1mdW5jdGlvbiBzZXJpYWxpemVyRm9y
KGNvbnRhaW5lciwgdHlwZSwgZGVmYXVsdFNlcmlhbGl6ZXIpIHsKLSAgcmV0dXJuIGNvbnRhaW5l
ci5sb29rdXAoJ3NlcmlhbGl6ZXI6Jyt0eXBlKSB8fAotICAgICAgICAgICAgICAgICBjb250YWlu
ZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKLSAgICAgICAgICAgICAgICAg
Y29udGFpbmVyLmxvb2t1cCgnc2VyaWFsaXplcjonICsgZGVmYXVsdFNlcmlhbGl6ZXIpIHx8Ci0g
ICAgICAgICAgICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsK
LX0KLQotZnVuY3Rpb24gZGVmYXVsdFNlcmlhbGl6ZXIoY29udGFpbmVyKSB7Ci0gIHJldHVybiBj
b250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKLSAgICAgICAgIGNv
bnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsKLX0KLQotZnVuY3Rpb24gc2Vy
aWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSkgewotICB2YXIgc2VyaWFsaXplciA9IGFk
YXB0ZXIuc2VyaWFsaXplciwKLSAgICAgIGRlZmF1bHRTZXJpYWxpemVyID0gYWRhcHRlci5kZWZh
dWx0U2VyaWFsaXplciwKLSAgICAgIGNvbnRhaW5lciA9IGFkYXB0ZXIuY29udGFpbmVyOwotCi0g
IGlmIChjb250YWluZXIgJiYgc2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgc2VyaWFs
aXplciA9IHNlcmlhbGl6ZXJGb3IoY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGRlZmF1bHRTZXJp
YWxpemVyKTsKLSAgfQotCi0gIGlmIChzZXJpYWxpemVyID09PSBudWxsIHx8IHNlcmlhbGl6ZXIg
PT09IHVuZGVmaW5lZCkgewotICAgIHNlcmlhbGl6ZXIgPSB7Ci0gICAgICBleHRyYWN0OiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeyByZXR1cm4gcGF5bG9hZDsgfQotICAgIH07Ci0g
IH0KLQotICByZXR1cm4gc2VyaWFsaXplcjsKLX0KLQotZnVuY3Rpb24gX2ZpbmQoYWRhcHRlciwg
c3RvcmUsIHR5cGUsIGlkKSB7Ci0gIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5kKHN0b3JlLCB0
eXBlLCBpZCksCi0gICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRl
ciwgdHlwZSk7Ci0KLSAgcmV0dXJuIHJlc29sdmUocHJvbWlzZSwgIkRTOiBIYW5kbGUgQWRhcHRl
ciNmaW5kIG9mICIgKyB0eXBlICsgIiB3aXRoIGlkOiAiICsgaWQpLnRoZW4oZnVuY3Rpb24ocGF5
bG9hZCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG1hZGUgYSByZXF1ZXN0IGZvciBhICIgKyB0
eXBlLnR5cGVLZXkgKyAiIHdpdGggaWQgIiArIGlkICsgIiwgYnV0IHRoZSBhZGFwdGVyJ3MgcmVz
cG9uc2UgZGlkIG5vdCBoYXZlIGFueSBkYXRhIiwgcGF5bG9hZCk7Ci0gICAgcGF5bG9hZCA9IHNl
cmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgaWQsICdmaW5kJyk7Ci0KLSAg
ICByZXR1cm4gc3RvcmUucHVzaCh0eXBlLCBwYXlsb2FkKTsKLSAgfSwgZnVuY3Rpb24oZXJyb3Ip
IHsKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuZ2V0QnlJZCh0eXBlLCBpZCk7Ci0gICAgcmVjb3Jk
Lm5vdEZvdW5kKCk7Ci0gICAgdGhyb3cgZXJyb3I7Ci0gIH0sICJEUzogRXh0cmFjdCBwYXlsb2Fk
IG9mICciICsgdHlwZSArICInIik7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kTWFueShhZGFwdGVyLCBz
dG9yZSwgdHlwZSwgaWRzLCBvd25lcikgewotICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZE1h
bnkoc3RvcmUsIHR5cGUsIGlkcywgb3duZXIpLAotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6
ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2Us
ICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZE1hbnkgb2YgIiArIHR5cGUpLnRoZW4oZnVuY3Rpb24o
cGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUs
IHBheWxvYWQsIG51bGwsICdmaW5kTWFueScpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgcmVz
cG9uc2UgZnJvbSBhIGZpbmRNYW55IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5z
cGVjdChwYXlsb2FkKSwgRW1iZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXknKTsKLQotICAg
IHN0b3JlLnB1c2hNYW55KHR5cGUsIHBheWxvYWQpOwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3Qg
cGF5bG9hZCBvZiAiICsgdHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kSGFzTWFueShhZGFwdGVy
LCBzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApIHsKLSAgdmFyIHByb21pc2UgPSBh
ZGFwdGVyLmZpbmRIYXNNYW55KHN0b3JlLCByZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCksCi0g
ICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgcmVsYXRpb25z
aGlwLnR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0
ZXIjZmluZEhhc01hbnkgb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUp
LnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJh
Y3Qoc3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZEhhc01hbnkn
KTsKLQotICAgIEVtYmVyLmFzc2VydCgiVGhlIHJlc3BvbnNlIGZyb20gYSBmaW5kSGFzTWFueSBt
dXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5
cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7Ci0KLSAgICB2YXIgcmVjb3JkcyA9IHN0b3JlLnB1
c2hNYW55KHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkKTsKLSAgICByZWNvcmQudXBkYXRlSGFz
TWFueShyZWxhdGlvbnNoaXAua2V5LCByZWNvcmRzKTsKLSAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0
IHBheWxvYWQgb2YgIiArIHJlY29yZCArICIgOiBoYXNNYW55ICIgKyByZWxhdGlvbnNoaXAudHlw
ZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQmVsb25nc1RvKGFkYXB0ZXIsIHN0b3JlLCByZWNvcmQs
IGxpbmssIHJlbGF0aW9uc2hpcCkgewotICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZEJlbG9u
Z3NUbyhzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApLAotICAgICAgc2VyaWFsaXpl
ciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHJlbGF0aW9uc2hpcC50eXBlKTsKLQot
ICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRCZWxvbmdz
VG8gb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUpLnRoZW4oZnVuY3Rp
b24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHJl
bGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZEJlbG9uZ3NUbycpOwotCi0gICAg
dmFyIHJlY29yZCA9IHN0b3JlLnB1c2gocmVsYXRpb25zaGlwLnR5cGUsIHBheWxvYWQpOwotICAg
IHJlY29yZC51cGRhdGVCZWxvbmdzVG8ocmVsYXRpb25zaGlwLmtleSwgcmVjb3JkKTsKLSAgICBy
ZXR1cm4gcmVjb3JkOwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgcmVj
b3JkICsgIiA6ICIgKyByZWxhdGlvbnNoaXAudHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQWxs
KGFkYXB0ZXIsIHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7Ci0gIHZhciBwcm9taXNlID0gYWRh
cHRlci5maW5kQWxsKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSwKLSAgICAgIHNlcmlhbGl6ZXIg
PSBzZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVyLCB0eXBlKTsKLQotICByZXR1cm4gcmVzb2x2
ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRBbGwgb2YgIiArIHR5cGUpLnRoZW4o
ZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3Rv
cmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5kQWxsJyk7Ci0KLSAgICBFbWJlci5hc3NlcnQo
IlRoZSByZXNwb25zZSBmcm9tIGEgZmluZEFsbCBtdXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVt
YmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7
Ci0KLSAgICBzdG9yZS5wdXNoTWFueSh0eXBlLCBwYXlsb2FkKTsKLSAgICBzdG9yZS5kaWRVcGRh
dGVBbGwodHlwZSk7Ci0gICAgcmV0dXJuIHN0b3JlLmFsbCh0eXBlKTsKLSAgfSwgbnVsbCwgIkRT
OiBFeHRyYWN0IHBheWxvYWQgb2YgZmluZEFsbCAiICsgdHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9m
aW5kUXVlcnkoYWRhcHRlciwgc3RvcmUsIHR5cGUsIHF1ZXJ5LCByZWNvcmRBcnJheSkgewotICB2
YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZFF1ZXJ5KHN0b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3Jk
QXJyYXkpLAotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIs
IHR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIj
ZmluZFF1ZXJ5IG9mICIgKyB0eXBlKS50aGVuKGZ1bmN0aW9uKHBheWxvYWQpIHsKLSAgICBwYXls
b2FkID0gc2VyaWFsaXplci5leHRyYWN0KHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBudWxsLCAnZmlu
ZFF1ZXJ5Jyk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9tIGEgZmluZFF1
ZXJ5IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5zcGVjdChwYXlsb2FkKSwgRW1i
ZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXknKTsKLQotICAgIHJlY29yZEFycmF5LmxvYWQo
cGF5bG9hZCk7Ci0gICAgcmV0dXJuIHJlY29yZEFycmF5OwotICB9LCBudWxsLCAiRFM6IEV4dHJh
Y3QgcGF5bG9hZCBvZiBmaW5kUXVlcnkgIiArIHR5cGUpOwotfQotCi1mdW5jdGlvbiBfY29tbWl0
KGFkYXB0ZXIsIHN0b3JlLCBvcGVyYXRpb24sIHJlY29yZCkgewotICB2YXIgdHlwZSA9IHJlY29y
ZC5jb25zdHJ1Y3RvciwKLSAgICAgIHByb21pc2UgPSBhZGFwdGVyW29wZXJhdGlvbl0oc3RvcmUs
IHR5cGUsIHJlY29yZCksCi0gICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIo
YWRhcHRlciwgdHlwZSk7Ci0KLSAgRW1iZXIuYXNzZXJ0KCJZb3VyIGFkYXB0ZXIncyAnIiArIG9w
ZXJhdGlvbiArICInIG1ldGhvZCBtdXN0IHJldHVybiBhIHByb21pc2UsIGJ1dCBpdCByZXR1cm5l
ZCAiICsgcHJvbWlzZSwgaXNUaGVuYWJsZShwcm9taXNlKSk7Ci0KLSAgcmV0dXJuIHByb21pc2Uu
dGhlbihmdW5jdGlvbihwYXlsb2FkKSB7Ci0gICAgaWYgKHBheWxvYWQpIHsgcGF5bG9hZCA9IHNl
cmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgZ2V0KHJlY29yZCwgJ2lkJyks
IG9wZXJhdGlvbik7IH0KLSAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29yZCwgcGF5bG9hZCk7
Ci0gICAgcmV0dXJuIHJlY29yZDsKLSAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgaWYgKHJl
YXNvbiBpbnN0YW5jZW9mIERTLkludmFsaWRFcnJvcikgewotICAgICAgc3RvcmUucmVjb3JkV2Fz
SW52YWxpZChyZWNvcmQsIHJlYXNvbi5lcnJvcnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdG9y
ZS5yZWNvcmRXYXNFcnJvcihyZWNvcmQsIHJlYXNvbik7Ci0gICAgfQotCi0gICAgdGhyb3cgcmVh
c29uOwotICB9LCAiRFM6IEV4dHJhY3QgYW5kIG5vdGlmeSBhYm91dCAiICsgb3BlcmF0aW9uICsg
IiBjb21wbGV0aW9uIG9mICIgKyByZWNvcmQpOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0OwotLyoKLSAgVGhpcyBmaWxlIGVuY2Fwc3VsYXRlcyB0aGUgdmFy
aW91cyBzdGF0ZXMgdGhhdCBhIHJlY29yZCBjYW4gdHJhbnNpdGlvbgotICB0aHJvdWdoIGR1cmlu
ZyBpdHMgbGlmZWN5Y2xlLgotKi8KLS8qKgotICAjIyMgU3RhdGUKLQotICBFYWNoIHJlY29yZCBo
YXMgYSBgY3VycmVudFN0YXRlYCBwcm9wZXJ0eSB0aGF0IGV4cGxpY2l0bHkgdHJhY2tzIHdoYXQK
LSAgc3RhdGUgYSByZWNvcmQgaXMgaW4gYXQgYW55IGdpdmVuIHRpbWUuIEZvciBpbnN0YW5jZSwg
aWYgYSByZWNvcmQgaXMKLSAgbmV3bHkgY3JlYXRlZCBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBzZW50
IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLAotICBpdCB3b3VsZCBiZSBpbiB0aGUgYHJvb3Qu
bG9hZGVkLmNyZWF0ZWQudW5jb21taXR0ZWRgIHN0YXRlLiAgSWYgYQotICByZWNvcmQgaGFzIGhh
ZCBsb2NhbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gaXQgdGhhdCBhcmUgaW4gdGhlCi0gIHByb2Nl
c3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSByZWNvcmQgd291bGQgYmUgaW4gdGhlCi0gIGByb290Lmxv
YWRlZC51cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4gKFRoZXNlIHN0YXRlIHBhdGhzIHdpbGwgYmUK
LSAgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LikKLQotICBFdmVudHMgYXJlIHNlbnQg
YnkgdGhlIHJlY29yZCBvciBpdHMgc3RvcmUgdG8gdGhlIHJlY29yZCdzCi0gIGBjdXJyZW50U3Rh
dGVgIHByb3BlcnR5LiBIb3cgdGhlIHN0YXRlIHJlYWN0cyB0byB0aGVzZSBldmVudHMgaXMKLSAg
ZGVwZW5kZW50IG9uIHdoaWNoIHN0YXRlIGl0IGlzIGluLiBJbiBzb21lIHN0YXRlcywgY2VydGFp
biBldmVudHMKLSAgd2lsbCBiZSBpbnZhbGlkIGFuZCB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0
byBiZSByYWlzZWQuCi0KLSAgU3RhdGVzIGFyZSBoaWVyYXJjaGljYWwgYW5kIGV2ZXJ5IHN0YXRl
IGlzIGEgc3Vic3RhdGUgb2YgdGhlCi0gIGBSb290U3RhdGVgLiBGb3IgZXhhbXBsZSwgYSByZWNv
cmQgY2FuIGJlIGluIHRoZQotICBgcm9vdC5kZWxldGVkLnVuY29tbWl0dGVkYCBzdGF0ZSwgdGhl
biB0cmFuc2l0aW9uIGludG8gdGhlCi0gIGByb290LmRlbGV0ZWQuaW5GbGlnaHRgIHN0YXRlLiBJ
ZiBhIGNoaWxkIHN0YXRlIGRvZXMgbm90IGltcGxlbWVudAotICBhbiBldmVudCBoYW5kbGVyLCB0
aGUgc3RhdGUgbWFuYWdlciB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBldmVudAotICBvbiBh
bGwgcGFyZW50IHN0YXRlcyB1bnRpbCB0aGUgcm9vdCBzdGF0ZSBpcyByZWFjaGVkLiBUaGUgc3Rh
dGUKLSAgaGllcmFyY2h5IG9mIGEgcmVjb3JkIGlzIGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBhIHBh
dGggc3RyaW5nLiBZb3UKLSAgY2FuIGRldGVybWluZSBhIHJlY29yZCdzIGN1cnJlbnQgc3RhdGUg
YnkgZ2V0dGluZyB0aGUgc3RhdGUncwotICBgc3RhdGVOYW1lYCBwcm9wZXJ0eToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHJlY29yZC5nZXQoJ2N1cnJlbnRTdGF0ZS5zdGF0ZU5hbWUnKTsKLSAgLy89
PiAicm9vdC5jcmVhdGVkLnVuY29tbWl0dGVkIgotICAgYGBgCi0KLSAgVGhlIGhpZXJhcmNoeSBv
ZiB2YWxpZCBzdGF0ZXMgdGhhdCBzaGlwIHdpdGggZW1iZXIgZGF0YSBsb29rcyBsaWtlCi0gIHRo
aXM6Ci0KLSAgYGBgdGV4dAotICAqIHJvb3QKLSAgICAqIGRlbGV0ZWQKLSAgICAgICogc2F2ZWQK
LSAgICAgICogdW5jb21taXR0ZWQKLSAgICAgICogaW5GbGlnaHQKLSAgICAqIGVtcHR5Ci0gICAg
KiBsb2FkZWQKLSAgICAgICogY3JlYXRlZAotICAgICAgICAqIHVuY29tbWl0dGVkCi0gICAgICAg
ICogaW5GbGlnaHQKLSAgICAgICogc2F2ZWQKLSAgICAgICogdXBkYXRlZAotICAgICAgICAqIHVu
Y29tbWl0dGVkCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAqIGxvYWRpbmcKLSAgYGBgCi0KLSAg
VGhlIGBEUy5Nb2RlbGAgc3RhdGVzIGFyZSB0aGVtc2VsdmVzIHN0YXRlbGVzcy4gV2hhdCB3ZSBt
ZWFuIGlzCi0gIHRoYXQsIHRoZSBoaWVyYXJjaGljYWwgc3RhdGVzIHRoYXQgZWFjaCBvZiAqdGhv
c2UqIHBvaW50cyB0byBpcyBhCi0gIHNoYXJlZCBkYXRhIHN0cnVjdHVyZS4gRm9yIHBlcmZvcm1h
bmNlIHJlYXNvbnMsIGluc3RlYWQgb2YgZWFjaAotICByZWNvcmQgZ2V0dGluZyBpdHMgb3duIGNv
cHkgb2YgdGhlIGhpZXJhcmNoeSBvZiBzdGF0ZXMsIGVhY2ggcmVjb3JkCi0gIHBvaW50cyB0byB0
aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBpbnN0YW5jZS4gSG93IGRvZXMgYSBzdGF0ZQot
ICBrbm93IHdoaWNoIHJlY29yZCBpdCBzaG91bGQgYmUgYWN0aW5nIG9uPyBXZSBwYXNzIHRoZSBy
ZWNvcmQKLSAgaW5zdGFuY2UgaW50byB0aGUgc3RhdGUncyBldmVudCBoYW5kbGVycyBhcyB0aGUg
Zmlyc3QgYXJndW1lbnQuCi0KLSAgVGhlIHJlY29yZCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFt
ZXRlciBpcyB3aGVyZSB5b3Ugc2hvdWxkIHN0YXNoCi0gIHN0YXRlIGFib3V0IHRoZSByZWNvcmQg
aWYgbmVlZGVkOyB5b3Ugc2hvdWxkIG5ldmVyIHN0b3JlIGRhdGEgb24gdGhlIHN0YXRlCi0gIG9i
amVjdCBpdHNlbGYuCi0KLSAgIyMjIEV2ZW50cyBhbmQgRmxhZ3MKLQotICBBIHN0YXRlIG1heSBp
bXBsZW1lbnQgemVybyBvciBtb3JlIGV2ZW50cyBhbmQgZmxhZ3MuCi0KLSAgIyMjIyBFdmVudHMK
LQotICBFdmVudHMgYXJlIG5hbWVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnZva2VkIHdoZW4gc2Vu
dCB0byBhIHJlY29yZC4gVGhlCi0gIHJlY29yZCB3aWxsIGZpcnN0IGxvb2sgZm9yIGEgbWV0aG9k
IHdpdGggdGhlIGdpdmVuIG5hbWUgb24gdGhlCi0gIGN1cnJlbnQgc3RhdGUuIElmIG5vIG1ldGhv
ZCBpcyBmb3VuZCwgaXQgd2lsbCBzZWFyY2ggdGhlIGN1cnJlbnQKLSAgc3RhdGUncyBwYXJlbnQs
IGFuZCB0aGVuIGl0cyBncmFuZHBhcmVudCwgYW5kIHNvIG9uIHVudGlsIHJlYWNoaW5nCi0gIHRo
ZSB0b3Agb2YgdGhlIGhpZXJhcmNoeS4gSWYgdGhlIHJvb3QgaXMgcmVhY2hlZCB3aXRob3V0IGFu
IGV2ZW50Ci0gIGhhbmRsZXIgYmVpbmcgZm91bmQsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNl
ZC4gVGhpcyBjYW4gYmUgdmVyeQotICBoZWxwZnVsIHdoZW4gZGVidWdnaW5nIG5ldyBmZWF0dXJl
cy4KLQotICBIZXJlJ3MgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHN0YXRlIHdpdGgg
YSBgbXlFdmVudGAgZXZlbnQgaGFuZGxlcjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIGFTdGF0ZTog
RFMuU3RhdGUuY3JlYXRlKHsKLSAgICBteUV2ZW50OiBmdW5jdGlvbihtYW5hZ2VyLCBwYXJhbSkg
ewotICAgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIG15RXZlbnQgd2l0aCIsIHBhcmFtKTsKLSAg
ICB9Ci0gIH0pCi0gIGBgYAotCi0gIFRvIHRyaWdnZXIgdGhpcyBldmVudDoKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIHJlY29yZC5zZW5kKCdteUV2ZW50JywgJ2ZvbycpOwotICAvLz0+ICJSZWNlaXZl
ZCBteUV2ZW50IHdpdGggZm9vIgotICBgYGAKLQotICBOb3RlIHRoYXQgYW4gb3B0aW9uYWwgcGFy
YW1ldGVyIGNhbiBiZSBzZW50IHRvIGEgcmVjb3JkJ3MgYHNlbmQoKWAgbWV0aG9kLAotICB3aGlj
aCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byB0aGUgZXZlbnQgaGFu
ZGxlci4KLQotICBFdmVudHMgc2hvdWxkIHRyYW5zaXRpb24gdG8gYSBkaWZmZXJlbnQgc3RhdGUg
aWYgYXBwcm9wcmlhdGUuIFRoaXMgY2FuIGJlCi0gIGRvbmUgYnkgY2FsbGluZyB0aGUgcmVjb3Jk
J3MgYHRyYW5zaXRpb25UbygpYCBtZXRob2Qgd2l0aCBhIHBhdGggdG8gdGhlCi0gIGRlc2lyZWQg
c3RhdGUuIFRoZSBzdGF0ZSBtYW5hZ2VyIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzdGF0
ZSBwYXRoCi0gIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlLiBJZiBubyBzdGF0ZSBpcyBm
b3VuZCBhdCB0aGF0IHBhdGgsIGl0IHdpbGwKLSAgYXR0ZW1wdCB0byByZXNvbHZlIGl0IHJlbGF0
aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlJ3MgcGFyZW50LCBhbmQgdGhlbiBpdHMKLSAgcGFyZW50
LCBhbmQgc28gb24gdW50aWwgdGhlIHJvb3QgaXMgcmVhY2hlZC4gRm9yIGV4YW1wbGUsIGltYWdp
bmUgYSBoaWVyYXJjaHkKLSAgbGlrZSB0aGlzOgotCi0gICAgICAqIGNyZWF0ZWQKLSAgICAgICAg
KiB1bmNvbW1pdHRlZCA8LS0gY3VycmVudFN0YXRlCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAg
ICogdXBkYXRlZAotICAgICAgICAqIGluRmxpZ2h0Ci0KLSAgSWYgd2UgYXJlIGN1cnJlbnRseSBp
biB0aGUgYHVuY29tbWl0dGVkYCBzdGF0ZSwgY2FsbGluZwotICBgdHJhbnNpdGlvblRvKCdpbkZs
aWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvIHRoZSBgY3JlYXRlZC5pbkZsaWdodGAgc3RhdGUs
Ci0gIHdoaWxlIGNhbGxpbmcgYHRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpYCB3b3Vs
ZCB0cmFuc2l0aW9uIHRvCi0gIHRoZSBgdXBkYXRlZC5pbkZsaWdodGAgc3RhdGUuCi0KLSAgUmVt
ZW1iZXIgdGhhdCAqb25seSBldmVudHMqIHNob3VsZCBldmVyIGNhdXNlIGEgc3RhdGUgdHJhbnNp
dGlvbi4gWW91IHNob3VsZAotICBuZXZlciBjYWxsIGB0cmFuc2l0aW9uVG8oKWAgZnJvbSBvdXRz
aWRlIGEgc3RhdGUncyBldmVudCBoYW5kbGVyLiBJZiB5b3UgYXJlCi0gIHRlbXB0ZWQgdG8gZG8g
c28sIGNyZWF0ZSBhIG5ldyBldmVudCBhbmQgc2VuZCB0aGF0IHRvIHRoZSBzdGF0ZSBtYW5hZ2Vy
LgotCi0gICMjIyMgRmxhZ3MKLQotICBGbGFncyBhcmUgQm9vbGVhbiB2YWx1ZXMgdGhhdCBjYW4g
YmUgdXNlZCB0byBpbnRyb3NwZWN0IGEgcmVjb3JkJ3MgY3VycmVudAotICBzdGF0ZSBpbiBhIG1v
cmUgdXNlci1mcmllbmRseSB3YXkgdGhhbiBleGFtaW5pbmcgaXRzIHN0YXRlIHBhdGguIEZvciBl
eGFtcGxlLAotICBpbnN0ZWFkIG9mIGRvaW5nIHRoaXM6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2
YXIgc3RhdGVQYXRoID0gcmVjb3JkLmdldCgnc3RhdGVNYW5hZ2VyLmN1cnJlbnRQYXRoJyk7Ci0g
IGlmIChzdGF0ZVBhdGggPT09ICdjcmVhdGVkLmluRmxpZ2h0JykgewotICAgIGRvU29tZXRoaW5n
KCk7Ci0gIH0KLSAgYGBgCi0KLSAgWW91IGNhbiBzYXk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBp
ZiAocmVjb3JkLmdldCgnaXNOZXcnKSAmJiByZWNvcmQuZ2V0KCdpc1NhdmluZycpKSB7Ci0gICAg
ZG9Tb21ldGhpbmcoKTsKLSAgfQotICBgYGAKLQotICBJZiB5b3VyIHN0YXRlIGRvZXMgbm90IHNl
dCBhIHZhbHVlIGZvciBhIGdpdmVuIGZsYWcsIHRoZSB2YWx1ZSB3aWxsCi0gIGJlIGluaGVyaXRl
ZCBmcm9tIGl0cyBwYXJlbnQgKG9yIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgc3RhdGUgaGllcmFy
Y2h5Ci0gIHdoZXJlIGl0IGlzIGRlZmluZWQpLgotCi0gIFRoZSBjdXJyZW50IHNldCBvZiBmbGFn
cyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IGZsYWcsCi0gIGlu
IGFkZGl0aW9uIHRvIHRoZSBhcmVhIGJlbG93LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGVjbGFy
ZSBpdCBpbiB0aGUKLSAgYERTLk1vZGVsYCBjbGFzcy4KLQotCi0gICAqIFtpc0VtcHR5XShEUy5N
b2RlbC5odG1sI3Byb3BlcnR5X2lzRW1wdHkpCi0gICAqIFtpc0xvYWRpbmddKERTLk1vZGVsLmh0
bWwjcHJvcGVydHlfaXNMb2FkaW5nKQotICAgKiBbaXNMb2FkZWRdKERTLk1vZGVsLmh0bWwjcHJv
cGVydHlfaXNMb2FkZWQpCi0gICAqIFtpc0RpcnR5XShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lz
RGlydHkpCi0gICAqIFtpc1NhdmluZ10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc1NhdmluZykK
LSAgICogW2lzRGVsZXRlZF0oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc0RlbGV0ZWQpCi0gICAq
IFtpc05ld10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc05ldykKLSAgICogW2lzVmFsaWRdKERT
Lk1vZGVsLmh0bWwjcHJvcGVydHlfaXNWYWxpZCkKLQotICBAbmFtZXNwYWNlIERTCi0gIEBjbGFz
cyBSb290U3RhdGUKLSovCi0KLXZhciBoYXNEZWZpbmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG9i
amVjdCkgewotICAvLyBJZ25vcmUgaW50ZXJuYWwgcHJvcGVydHkgZGVmaW5lZCBieSBzaW11bGF0
ZWQgYEVtYmVyLmNyZWF0ZWAuCi0gIHZhciBuYW1lcyA9IEVtYmVyLmtleXMob2JqZWN0KTsKLSAg
dmFyIGksIGwsIG5hbWU7Ci0gIGZvciAoaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7Ci0gICAgbmFtZSA9IG5hbWVzW2ldOwotICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVy
dHkobmFtZSkgJiYgb2JqZWN0W25hbWVdKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICByZXR1
cm4gZmFsc2U7Ci19OwotCi12YXIgZGlkU2V0UHJvcGVydHkgPSBmdW5jdGlvbihyZWNvcmQsIGNv
bnRleHQpIHsKLSAgaWYgKGNvbnRleHQudmFsdWUgPT09IGNvbnRleHQub3JpZ2luYWxWYWx1ZSkg
ewotICAgIGRlbGV0ZSByZWNvcmQuX2F0dHJpYnV0ZXNbY29udGV4dC5uYW1lXTsKLSAgICByZWNv
cmQuc2VuZCgncHJvcGVydHlXYXNSZXNldCcsIGNvbnRleHQubmFtZSk7Ci0gIH0gZWxzZSBpZiAo
Y29udGV4dC52YWx1ZSAhPT0gY29udGV4dC5vbGRWYWx1ZSkgewotICAgIHJlY29yZC5zZW5kKCdi
ZWNvbWVEaXJ0eScpOwotICB9Ci0KLSAgcmVjb3JkLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7
Ci19OwotCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vCi0vLyBFYWNoIHN0YXRlIGhhcyBh
IGJvb2xlYW4gdmFsdWUgZm9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotLy8KLS8vICog
aXNMb2FkZWQ6IFRoZSByZWNvcmQgaGFzIGEgcG9wdWxhdGVkIGBkYXRhYCBwcm9wZXJ0eS4gV2hl
biBhCi0vLyAgIHJlY29yZCBpcyBsb2FkZWQgdmlhIGBzdG9yZS5maW5kYCwgYGlzTG9hZGVkYCBp
cyBmYWxzZQotLy8gICB1bnRpbCB0aGUgYWRhcHRlciBzZXRzIGl0LiBXaGVuIGEgcmVjb3JkIGlz
IGNyZWF0ZWQgbG9jYWxseSwKLS8vICAgaXRzIGBpc0xvYWRlZGAgcHJvcGVydHkgaXMgYWx3YXlz
IHRydWUuCi0vLyAqIGlzRGlydHk6IFRoZSByZWNvcmQgaGFzIGxvY2FsIGNoYW5nZXMgdGhhdCBo
YXZlIG5vdCB5ZXQgYmVlbgotLy8gICBzYXZlZCBieSB0aGUgYWRhcHRlci4gVGhpcyBpbmNsdWRl
cyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCi0vLyAgIGNyZWF0ZWQgKGJ1dCBub3QgeWV0IHNhdmVk
KSBvciBkZWxldGVkLgotLy8gKiBpc1NhdmluZzogVGhlIHJlY29yZCBoYXMgYmVlbiBjb21taXR0
ZWQsIGJ1dAotLy8gICB0aGUgYWRhcHRlciBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgdGhhdCB0
aGUgY2hhbmdlcyBoYXZlCi0vLyAgIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBiYWNrZW5kLgotLy8g
KiBpc0RlbGV0ZWQ6IFRoZSByZWNvcmQgd2FzIG1hcmtlZCBmb3IgZGVsZXRpb24uIFdoZW4gYGlz
RGVsZXRlZGAKLS8vICAgaXMgdHJ1ZSBhbmQgYGlzRGlydHlgIGlzIHRydWUsIHRoZSByZWNvcmQg
aXMgZGVsZXRlZCBsb2NhbGx5Ci0vLyAgIGJ1dCB0aGUgZGVsZXRpb24gd2FzIG5vdCB5ZXQgcGVy
c2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMKLS8vICAgdHJ1ZSwgdGhlIGNoYW5nZSBpcyBpbi1m
bGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0eWAgYW5kCi0vLyAgIGBpc1NhdmluZ2AgYXJlIGZhbHNl
LCB0aGUgY2hhbmdlIGhhcyBwZXJzaXN0ZWQuCi0vLyAqIGlzRXJyb3I6IFRoZSBhZGFwdGVyIHJl
cG9ydGVkIHRoYXQgaXQgd2FzIHVuYWJsZSB0byBzYXZlCi0vLyAgIGxvY2FsIGNoYW5nZXMgdG8g
dGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZQotLy8gICByZWNvcmQgaGF2
aW5nIGl0cyBgaXNWYWxpZGAgcHJvcGVydHkgYmVjb21lIGZhbHNlIGlmIHRoZQotLy8gICBhZGFw
dGVyIHJlcG9ydGVkIHRoYXQgc2VydmVyLXNpZGUgdmFsaWRhdGlvbnMgZmFpbGVkLgotLy8gKiBp
c05ldzogVGhlIHJlY29yZCB3YXMgY3JlYXRlZCBvbiB0aGUgY2xpZW50IGFuZCB0aGUgYWRhcHRl
cgotLy8gICBkaWQgbm90IHlldCByZXBvcnQgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVk
LgotLy8gKiBpc1ZhbGlkOiBObyBjbGllbnQtc2lkZSB2YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCBh
bmQgdGhlCi0vLyAgIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55IHNlcnZlci1zaWRlIHZhbGlk
YXRpb24gZmFpbHVyZXMuCi0KLS8vIFRoZSBkaXJ0eSBzdGF0ZSBpcyBhIGFic3RyYWN0IHN0YXRl
IHdob3NlIGZ1bmN0aW9uYWxpdHkgaXMKLS8vIHNoYXJlZCBiZXR3ZWVuIHRoZSBgY3JlYXRlZGAg
YW5kIGB1cGRhdGVkYCBzdGF0ZXMuCi0vLwotLy8gVGhlIGRlbGV0ZWQgc3RhdGUgc2hhcmVzIHRo
ZSBgaXNEaXJ0eWAgZmxhZyB3aXRoIHRoZQotLy8gc3ViY2xhc3NlcyBvZiBgRGlydHlTdGF0ZWAs
IGJ1dCB3aXRoIGEgdmVyeSBkaWZmZXJlbnQKLS8vIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIERp
cnR5IHN0YXRlcyBoYXZlIHRocmVlIGNoaWxkIHN0YXRlczoKLS8vCi0vLyBgdW5jb21taXR0ZWRg
OiB0aGUgc3RvcmUgaGFzIG5vdCB5ZXQgaGFuZGVkIG9mZiB0aGUgcmVjb3JkCi0vLyAgIHRvIGJl
IHNhdmVkLgotLy8gYGluRmxpZ2h0YDogdGhlIHN0b3JlIGhhcyBoYW5kZWQgb2ZmIHRoZSByZWNv
cmQgdG8gYmUgc2F2ZWQsCi0vLyAgIGJ1dCB0aGUgYWRhcHRlciBoYXMgbm90IHlldCBhY2tub3ds
ZWRnZWQgc3VjY2Vzcy4KLS8vIGBpbnZhbGlkYDogdGhlIHJlY29yZCBoYXMgaW52YWxpZCBpbmZv
cm1hdGlvbiBhbmQgY2Fubm90IGJlCi0vLyAgIHNlbmQgdG8gdGhlIGFkYXB0ZXIgeWV0LgotdmFy
IERpcnR5U3RhdGUgPSB7Ci0gIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKLQotICAvLyBG
TEFHUwotICBpc0RpcnR5OiB0cnVlLAotCi0gIC8vIFNVQlNUQVRFUwotCi0gIC8vIFdoZW4gYSBy
ZWNvcmQgZmlyc3QgYmVjb21lcyBkaXJ0eSwgaXQgaXMgYHVuY29tbWl0dGVkYC4KLSAgLy8gVGhp
cyBtZWFucyB0aGF0IHRoZXJlIGFyZSBsb2NhbCBwZW5kaW5nIGNoYW5nZXMsIGJ1dCB0aGV5Ci0g
IC8vIGhhdmUgbm90IHlldCBiZWd1biB0byBiZSBzYXZlZCwgYW5kIGFyZSBub3QgaW52YWxpZC4K
LSAgdW5jb21taXR0ZWQ6IHsKLSAgICAvLyBFVkVOVFMKLSAgICBkaWRTZXRQcm9wZXJ0eTogZGlk
U2V0UHJvcGVydHksCi0KLSAgICBwcm9wZXJ0eVdhc1Jlc2V0OiBmdW5jdGlvbihyZWNvcmQsIG5h
bWUpIHsKLSAgICAgIHZhciBzdGlsbERpcnR5ID0gZmFsc2U7Ci0KLSAgICAgIGZvciAodmFyIHBy
b3AgaW4gcmVjb3JkLl9hdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHN0aWxsRGlydHkgPSB0cnVlOwot
ICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFzdGlsbERpcnR5KSB7IHJlY29y
ZC5zZW5kKCdyb2xsZWRCYWNrJyk7IH0KLSAgICB9LAotCi0gICAgcHVzaGVkRGF0YTogRW1iZXIu
SywKLQotICAgIGJlY29tZURpcnR5OiBFbWJlci5LLAotCi0gICAgd2lsbENvbW1pdDogZnVuY3Rp
b24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbkZsaWdodCcpOwotICAg
IH0sCi0KLSAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCwgcmVzb2x2ZSkgewotICAg
ICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0g
ICAgfSwKLQotICAgIHJvbGxlZEJhY2s6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3Jk
LnRyYW5zaXRpb25UbygnbG9hZGVkLnNhdmVkJyk7Ci0gICAgfSwKLQotICAgIGJlY2FtZUludmFs
aWQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnaW52YWxp
ZCcpOwotICAgIH0sCi0KLSAgICByb2xsYmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQucm9sbGJhY2soKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gT25jZSBhIHJlY29yZCBoYXMg
YmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBhZGFwdGVyIHRvIGJlCi0gIC8vIHNhdmVkLCBpdCBpcyBp
biB0aGUgJ2luIGZsaWdodCcgc3RhdGUuIENoYW5nZXMgdG8gdGhlCi0gIC8vIHJlY29yZCBjYW5u
b3QgYmUgbWFkZSBkdXJpbmcgdGhpcyB3aW5kb3cuCi0gIGluRmxpZ2h0OiB7Ci0gICAgLy8gRkxB
R1MKLSAgICBpc1NhdmluZzogdHJ1ZSwKLQotICAgIC8vIEVWRU5UUwotICAgIGRpZFNldFByb3Bl
cnR5OiBkaWRTZXRQcm9wZXJ0eSwKLSAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLSAgICBwdXNo
ZWREYXRhOiBFbWJlci5LLAotCi0gICAgLy8gVE9ETzogTW9yZSByb2J1c3Qgc2VtYW50aWNzIGFy
b3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAotICAgIHdpbGxDb21taXQ6IEVtYmVyLkssCi0KLSAg
ICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgdmFyIGRpcnR5VHlwZSA9IGdl
dCh0aGlzLCAnZGlydHlUeXBlJyk7Ci0KLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVk
Jyk7Ci0gICAgICByZWNvcmQuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJywgZGlydHlU
eXBlKTsKLSAgICB9LAotCi0gICAgYmVjYW1lSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0g
ICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbnZhbGlkJyk7Ci0gICAgICByZWNvcmQuc2VuZCgn
aW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJyk7Ci0gICAgfSwKLQotICAgIGJlY2FtZUVycm9yOiBm
dW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3VuY29tbWl0dGVk
Jyk7Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0g
ICAgfQotICB9LAotCi0gIC8vIEEgcmVjb3JkIGlzIGluIHRoZSBgaW52YWxpZGAgc3RhdGUgd2hl
biBpdHMgY2xpZW50LXNpZGUKLSAgLy8gaW52YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCwgb3IgaWYg
dGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZAotICAvLyB0aGUgdGhlIHJlY29yZCBmYWlsZWQgc2Vy
dmVyLXNpZGUgaW52YWxpZGF0aW9ucy4KLSAgaW52YWxpZDogewotICAgIC8vIEZMQUdTCi0gICAg
aXNWYWxpZDogZmFsc2UsCi0KLSAgICAvLyBFVkVOVFMKLSAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRlZC51bmNvbW1p
dHRlZCcpOwotICAgICAgcmVjb3JkLmNsZWFyUmVsYXRpb25zaGlwcygpOwotICAgIH0sCi0KLSAg
ICBkaWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24ocmVjb3JkLCBjb250ZXh0KSB7Ci0gICAgICBnZXQo
cmVjb3JkLCAnZXJyb3JzJykucmVtb3ZlKGNvbnRleHQubmFtZSk7Ci0KLSAgICAgIGRpZFNldFBy
b3BlcnR5KHJlY29yZCwgY29udGV4dCk7Ci0gICAgfSwKLQotICAgIGJlY29tZURpcnR5OiBFbWJl
ci5LLAotCi0gICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBnZXQocmVj
b3JkLCAnZXJyb3JzJykuY2xlYXIoKTsKLSAgICB9LAotCi0gICAgYmVjYW1lVmFsaWQ6IGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndW5jb21taXR0ZWQnKTsK
LSAgICB9LAotCi0gICAgaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihyZWNvcmQp
IHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2JlY2FtZUludmFsaWQnLCByZWNvcmQpOwot
ICAgIH0KLSAgfQotfTsKLQotLy8gVGhlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQgc3RhdGVzIGFyZSBj
cmVhdGVkIG91dHNpZGUgdGhlIHN0YXRlCi0vLyBjaGFydCBzbyB3ZSBjYW4gcmVvcGVuIHRoZWly
IHN1YnN0YXRlcyBhbmQgYWRkIG1peGlucyBhcwotLy8gbmVjZXNzYXJ5LgotCi1mdW5jdGlvbiBk
ZWVwQ2xvbmUob2JqZWN0KSB7Ci0gIHZhciBjbG9uZSA9IHt9LCB2YWx1ZTsKLQotICBmb3IgKHZh
ciBwcm9wIGluIG9iamVjdCkgewotICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwotICAgIGlmICh2
YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7Ci0gICAgICBjbG9uZVtwcm9wXSA9
IGRlZXBDbG9uZSh2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNsb25lW3Byb3BdID0gdmFs
dWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNsb25lOwotfQotCi1mdW5jdGlvbiBtaXhpbihv
cmlnaW5hbCwgaGFzaCkgewotICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICBvcmlnaW5h
bFtwcm9wXSA9IGhhc2hbcHJvcF07Ci0gIH0KLQotICByZXR1cm4gb3JpZ2luYWw7Ci19Ci0KLWZ1
bmN0aW9uIGRpcnR5U3RhdGUob3B0aW9ucykgewotICB2YXIgbmV3U3RhdGUgPSBkZWVwQ2xvbmUo
RGlydHlTdGF0ZSk7Ci0gIHJldHVybiBtaXhpbihuZXdTdGF0ZSwgb3B0aW9ucyk7Ci19Ci0KLXZh
ciBjcmVhdGVkU3RhdGUgPSBkaXJ0eVN0YXRlKHsKLSAgZGlydHlUeXBlOiAnY3JlYXRlZCcsCi0K
LSAgLy8gRkxBR1MKLSAgaXNOZXc6IHRydWUKLX0pOwotCi1jcmVhdGVkU3RhdGUudW5jb21taXR0
ZWQucm9sbGVkQmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNvcmQudHJhbnNpdGlvblRv
KCdkZWxldGVkLnNhdmVkJyk7Ci19OwotCi12YXIgdXBkYXRlZFN0YXRlID0gZGlydHlTdGF0ZSh7
Ci0gIGRpcnR5VHlwZTogJ3VwZGF0ZWQnCi19KTsKLQotY3JlYXRlZFN0YXRlLnVuY29tbWl0dGVk
LmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNvcmQuY2xlYXJSZWxhdGlv
bnNoaXBzKCk7Ci0gIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLX07Ci0K
LWNyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5yb2xsYmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgewot
ICBEaXJ0eVN0YXRlLnVuY29tbWl0dGVkLnJvbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
Ci0gIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLX07Ci0KLWNyZWF0ZWRT
dGF0ZS51bmNvbW1pdHRlZC5wcm9wZXJ0eVdhc1Jlc2V0ID0gRW1iZXIuSzsKLQotdXBkYXRlZFN0
YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNv
cmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7Ci0gIHJlY29yZC5jbGVhclJl
bGF0aW9uc2hpcHMoKTsKLX07Ci0KLXZhciBSb290U3RhdGUgPSB7Ci0gIC8vIEZMQUdTCi0gIGlz
RW1wdHk6IGZhbHNlLAotICBpc0xvYWRpbmc6IGZhbHNlLAotICBpc0xvYWRlZDogZmFsc2UsCi0g
IGlzRGlydHk6IGZhbHNlLAotICBpc1NhdmluZzogZmFsc2UsCi0gIGlzRGVsZXRlZDogZmFsc2Us
Ci0gIGlzTmV3OiBmYWxzZSwKLSAgaXNWYWxpZDogdHJ1ZSwKLQotICAvLyBERUZBVUxUIEVWRU5U
UwotCi0gIC8vIFRyeWluZyB0byByb2xsIGJhY2sgaWYgeW91J3JlIG5vdCBpbiB0aGUgZGlydHkg
c3RhdGUKLSAgLy8gZG9lc24ndCBjaGFuZ2UgeW91ciBzdGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlv
dSdyZSBpbiB0aGUKLSAgLy8gaW4tZmxpZ2h0IHN0YXRlLCByb2xsaW5nIGJhY2sgdGhlIHJlY29y
ZCBkb2Vzbid0IG1vdmUKLSAgLy8geW91IG91dCBvZiB0aGUgaW4tZmxpZ2h0IHN0YXRlLgotICBy
b2xsZWRCYWNrOiBFbWJlci5LLAotCi0gIHByb3BlcnR5V2FzUmVzZXQ6IEVtYmVyLkssCi0KLSAg
Ly8gU1VCU1RBVEVTCi0KLSAgLy8gQSByZWNvcmQgYmVnaW5zIGl0cyBsaWZlY3ljbGUgaW4gdGhl
IGBlbXB0eWAgc3RhdGUuCi0gIC8vIElmIGl0cyBkYXRhIHdpbGwgY29tZSBmcm9tIHRoZSBhZGFw
dGVyLCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGxvYWRpbmdgIHN0YXRlLiBP
dGhlcndpc2UsIGlmCi0gIC8vIHRoZSByZWNvcmQgaXMgYmVpbmcgY3JlYXRlZCBvbiB0aGUgY2xp
ZW50LCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGNyZWF0ZWRgIHN0YXRlLgot
ICBlbXB0eTogewotICAgIGlzRW1wdHk6IHRydWUsCi0KLSAgICAvLyBFVkVOVFMKLSAgICBsb2Fk
aW5nRGF0YTogZnVuY3Rpb24ocmVjb3JkLCBwcm9taXNlKSB7Ci0gICAgICByZWNvcmQuX2xvYWRp
bmdQcm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2xvYWRpbmcn
KTsKLSAgICB9LAotCi0gICAgbG9hZGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuY3JlYXRlZC51bmNvbW1pdHRlZCcpOwotCi0gICAg
ICByZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAg
ICAgcmVjb3JkLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7Ci0gICAgICB9KTsKLSAgICB9
LAotCi0gICAgcHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJh
bnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2Rp
ZExvYWQnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gQSByZWNvcmQgZW50ZXJzIHRoaXMgc3RhdGUg
d2hlbiB0aGUgc3RvcmUgYXNrcwotICAvLyB0aGUgYWRhcHRlciBmb3IgaXRzIGRhdGEuIEl0IHJl
bWFpbnMgaW4gdGhpcyBzdGF0ZQotICAvLyB1bnRpbCB0aGUgYWRhcHRlciBwcm92aWRlcyB0aGUg
cmVxdWVzdGVkIGRhdGEuCi0gIC8vCi0gIC8vIFVzdWFsbHksIHRoaXMgcHJvY2VzcyBpcyBhc3lu
Y2hyb25vdXMsIHVzaW5nIGFuCi0gIC8vIFhIUiB0byByZXRyaWV2ZSB0aGUgZGF0YS4KLSAgbG9h
ZGluZzogewotICAgIC8vIEZMQUdTCi0gICAgaXNMb2FkaW5nOiB0cnVlLAotCi0gICAgZXhpdDog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQuX2xvYWRpbmdQcm9taXNlID0gbnVsbDsK
LSAgICB9LAotCi0gICAgLy8gRVZFTlRTCi0gICAgcHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3Jk
KSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKLSAgICAgIHJl
Y29yZC50cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKLSAgICAgIHNldChyZWNvcmQsICdpc0Vycm9y
JywgZmFsc2UpOwotICAgIH0sCi0KLSAgICBiZWNhbWVFcnJvcjogZnVuY3Rpb24ocmVjb3JkKSB7
Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0gICAg
fSwKLQotICAgIG5vdEZvdW5kOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmFu
c2l0aW9uVG8oJ2VtcHR5Jyk7Ci0gICAgfQotICB9LAotCi0gIC8vIEEgcmVjb3JkIGVudGVycyB0
aGlzIHN0YXRlIHdoZW4gaXRzIGRhdGEgaXMgcG9wdWxhdGVkLgotICAvLyBNb3N0IG9mIGEgcmVj
b3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMKLSAgLy8gb2YgdGhlIGBs
b2FkZWRgIHN0YXRlLgotICBsb2FkZWQ6IHsKLSAgICBpbml0aWFsU3RhdGU6ICdzYXZlZCcsCi0K
LSAgICAvLyBGTEFHUwotICAgIGlzTG9hZGVkOiB0cnVlLAotCi0gICAgLy8gU1VCU1RBVEVTCi0K
LSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwgY2hhbmdlcyB0byBhIHJlY29yZCwgaXQgcmVt
YWlucwotICAgIC8vIGluIHRoZSBgc2F2ZWRgIHN0YXRlLgotICAgIHNhdmVkOiB7Ci0gICAgICBz
ZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHZhciBhdHRycyA9IHJlY29yZC5fYXR0
cmlidXRlcywKLSAgICAgICAgICAgIGlzRGlydHkgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKHZh
ciBwcm9wIGluIGF0dHJzKSB7Ci0gICAgICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KHBy
b3ApKSB7Ci0gICAgICAgICAgICBpc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0RpcnR5KSB7Ci0gICAgICAg
ICAgcmVjb3JkLmFkYXB0ZXJEaWREaXJ0eSgpOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAg
ICAvLyBFVkVOVFMKLSAgICAgIGRpZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0eSwKLQotICAg
ICAgcHVzaGVkRGF0YTogRW1iZXIuSywKLQotICAgICAgYmVjb21lRGlydHk6IGZ1bmN0aW9uKHJl
Y29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1cGRhdGVkLnVuY29tbWl0dGVk
Jyk7Ci0gICAgICB9LAotCi0gICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAg
ICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpOwotICAgICAgfSwK
LQotICAgICAgcmVsb2FkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlc29sdmUpIHsKLSAgICAg
ICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0g
ICAgICB9LAotCi0gICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAg
ICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7Ci0gICAgICAgIHJl
Y29yZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKLSAgICAgIH0sCi0KLSAgICAgIHVubG9hZFJlY29y
ZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIC8vIGNsZWFyIHJlbGF0aW9uc2hpcHMgYmVm
b3JlIG1vdmluZyB0byBkZWxldGVkIHN0YXRlCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBmYWls
cwotICAgICAgICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIHJlY29yZC50
cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLSAgICAgIH0sCi0KLSAgICAgIGRpZENvbW1p
dDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC5zZW5kKCdpbnZva2VMaWZlY3lj
bGVDYWxsYmFja3MnLCBnZXQocmVjb3JkLCAnbGFzdERpcnR5VHlwZScpKTsKLSAgICAgIH0sCi0K
LSAgICAgIC8vIGxvYWRlZC5zYXZlZC5ub3RGb3VuZCB3b3VsZCBiZSB0cmlnZ2VyZWQgYnkgYSBm
YWlsZWQKLSAgICAgIC8vIGByZWxvYWQoKWAgb24gYW4gdW5jaGFuZ2VkIHJlY29yZAotICAgICAg
bm90Rm91bmQ6IEVtYmVyLksKLQotICAgIH0sCi0KLSAgICAvLyBBIHJlY29yZCBpcyBpbiB0aGlz
IHN0YXRlIGFmdGVyIGl0IGhhcyBiZWVuIGxvY2FsbHkKLSAgICAvLyBjcmVhdGVkIGJ1dCBiZWZv
cmUgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZCB0aGF0Ci0gICAgLy8gaXQgaGFzIGJlZW4gc2F2
ZWQuCi0gICAgY3JlYXRlZDogY3JlYXRlZFN0YXRlLAotCi0gICAgLy8gQSByZWNvcmQgaXMgaW4g
dGhpcyBzdGF0ZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gICAgLy8gc2F2ZWQgdG8gdGhlIHNl
cnZlciwgYnV0IHRoZXJlIGFyZSBuZXcgbG9jYWwgY2hhbmdlcwotICAgIC8vIHRoYXQgaGF2ZSBu
b3QgeWV0IGJlZW4gc2F2ZWQuCi0gICAgdXBkYXRlZDogdXBkYXRlZFN0YXRlCi0gIH0sCi0KLSAg
Ly8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCB3YXMgZGVsZXRlZCBmcm9tIHRoZSBz
dG9yZS4KLSAgZGVsZXRlZDogewotICAgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKLSAg
ICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKLQotICAgIC8vIEZMQUdTCi0gICAgaXNEZWxldGVkOiB0
cnVlLAotICAgIGlzTG9hZGVkOiB0cnVlLAotICAgIGlzRGlydHk6IHRydWUsCi0KLSAgICAvLyBU
UkFOU0lUSU9OUwotICAgIHNldHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC51
cGRhdGVSZWNvcmRBcnJheXMoKTsKLSAgICB9LAotCi0gICAgLy8gU1VCU1RBVEVTCi0KLSAgICAv
LyBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0ZWQsIGl0IGVudGVycyB0aGUgYHN0YXJ0YAotICAgIC8v
IHN0YXRlLiBJdCB3aWxsIGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSByZWNvcmQKLSAgICAvLyBz
dGFydHMgdG8gY29tbWl0LgotICAgIHVuY29tbWl0dGVkOiB7Ci0KLSAgICAgIC8vIEVWRU5UUwot
Ci0gICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnRy
YW5zaXRpb25UbygnaW5GbGlnaHQnKTsKLSAgICAgIH0sCi0KLSAgICAgIHJvbGxiYWNrOiBmdW5j
dGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnJvbGxiYWNrKCk7Ci0gICAgICB9LAotCi0g
ICAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLSAgICAgIGRlbGV0ZVJlY29yZDogRW1iZXIuSywK
LQotICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC50
cmFuc2l0aW9uVG8oJ2xvYWRlZC5zYXZlZCcpOwotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBB
ZnRlciBhIHJlY29yZCBzdGFydHMgY29tbWl0dGluZywgYnV0Ci0gICAgLy8gYmVmb3JlIHRoZSBh
ZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZSBkZWxldGlvbgotICAgIC8vIGhhcyBzYXZlZCB0byB0
aGUgc2VydmVyLCBhIHJlY29yZCBpcyBpbiB0aGUKLSAgICAvLyBgaW5GbGlnaHRgIHN1YnN0YXRl
IG9mIGBkZWxldGVkYC4KLSAgICBpbkZsaWdodDogewotICAgICAgLy8gRkxBR1MKLSAgICAgIGlz
U2F2aW5nOiB0cnVlLAotCi0gICAgICAvLyBFVkVOVFMKLQotICAgICAgLy8gVE9ETzogTW9yZSBy
b2J1c3Qgc2VtYW50aWNzIGFyb3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAotICAgICAgd2lsbENv
bW1pdDogRW1iZXIuSywKLSAgICAgIGRpZENvbW1pdDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAg
ICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVkJyk7Ci0KLSAgICAgICAgcmVjb3JkLnNlbmQo
J2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOwotICAgICAgfSwKLQotICAgICAgYmVjYW1lRXJy
b3I6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1bmNv
bW1pdHRlZCcpOwotICAgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJl
Y29yZCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8vIE9uY2UgdGhlIGFkYXB0ZXIgaW5kaWNh
dGVzIHRoYXQgdGhlIGRlbGV0aW9uIGhhcwotICAgIC8vIGJlZW4gc2F2ZWQsIHRoZSByZWNvcmQg
ZW50ZXJzIHRoZSBgc2F2ZWRgIHN1YnN0YXRlCi0gICAgLy8gb2YgYGRlbGV0ZWRgLgotICAgIHNh
dmVkOiB7Ci0gICAgICAvLyBGTEFHUwotICAgICAgaXNEaXJ0eTogZmFsc2UsCi0KLSAgICAgIHNl
dHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgdmFyIHN0b3JlID0gZ2V0KHJlY29yZCwg
J3N0b3JlJyk7Ci0gICAgICAgIHN0b3JlLmRlbWF0ZXJpYWxpemVSZWNvcmQocmVjb3JkKTsKLSAg
ICAgIH0sCi0KLSAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rpb24ocmVjb3Jk
KSB7Ci0gICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZERlbGV0ZScsIHJlY29yZCk7Ci0g
ICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENvbW1pdCcsIHJlY29yZCk7Ci0gICAgICB9
Ci0gICAgfQotICB9LAotCi0gIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rpb24ocmVj
b3JkLCBkaXJ0eVR5cGUpIHsKLSAgICBpZiAoZGlydHlUeXBlID09PSAnY3JlYXRlZCcpIHsKLSAg
ICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENyZWF0ZScsIHJlY29yZCk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZFVwZGF0ZScsIHJlY29yZCk7Ci0gICAg
fQotCi0gICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlkQ29tbWl0JywgcmVjb3JkKTsKLSAgfQot
fTsKLQotZnVuY3Rpb24gd2lyZVN0YXRlKG9iamVjdCwgcGFyZW50LCBuYW1lKSB7Ci0gIC8qanNo
aW50IHByb3RvOnRydWUqLwotICAvLyBUT0RPOiBVc2UgT2JqZWN0LmNyZWF0ZSBhbmQgY29weSBp
bnN0ZWFkCi0gIG9iamVjdCA9IG1peGluKHBhcmVudCA/IEVtYmVyLmNyZWF0ZShwYXJlbnQpIDog
e30sIG9iamVjdCk7Ci0gIG9iamVjdC5wYXJlbnRTdGF0ZSA9IHBhcmVudDsKLSAgb2JqZWN0LnN0
YXRlTmFtZSA9IG5hbWU7Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHsKLSAgICBpZiAo
IW9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBwcm9wID09PSAncGFyZW50U3RhdGUnIHx8
IHByb3AgPT09ICdzdGF0ZU5hbWUnKSB7IGNvbnRpbnVlOyB9Ci0gICAgaWYgKHR5cGVvZiBvYmpl
Y3RbcHJvcF0gPT09ICdvYmplY3QnKSB7Ci0gICAgICBvYmplY3RbcHJvcF0gPSB3aXJlU3RhdGUo
b2JqZWN0W3Byb3BdLCBvYmplY3QsIG5hbWUgKyAiLiIgKyBwcm9wKTsKLSAgICB9Ci0gIH0KLQot
ICByZXR1cm4gb2JqZWN0OwotfQotCi1Sb290U3RhdGUgPSB3aXJlU3RhdGUoUm9vdFN0YXRlLCBu
dWxsLCAicm9vdCIpOwotCi1EUy5Sb290U3RhdGUgPSBSb290U3RhdGU7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpc0VtcHR5ID0gRW1iZXIuaXNF
bXB0eTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLS8qKgotICBIb2xkcyB2YWxp
ZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiByZWNvcmQgb3JnYW5pemVkIGJ5IGF0dHJpYnV0ZSBu
YW1lcy4KLQotICBAY2xhc3MgRXJyb3JzCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1i
ZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLkVudW1lcmFibGUKLSAgQHVzZXMgRW1iZXIuRXZlbnRl
ZAotICovCi1EUy5FcnJvcnMgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkVudW1lcmFibGUs
IEVtYmVyLkV2ZW50ZWQsIHsKLSAgLyoqCi0gICAgUmVnaXN0ZXIgd2l0aCB0YXJnZXQgaGFuZGxl
cgotCi0gICAgQG1ldGhvZCByZWdpc3RlckhhbmRsZXJzCi0gICAgQHBhcmFtIHtPYmplY3R9IHRh
cmdldAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGJlY2FtZUludmFsaWQKLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSBiZWNhbWVWYWxpZAotICAqLwotICByZWdpc3RlckhhbmRsZXJzOiBmdW5jdGlvbih0
YXJnZXQsIGJlY2FtZUludmFsaWQsIGJlY2FtZVZhbGlkKSB7Ci0gICAgdGhpcy5vbignYmVjYW1l
SW52YWxpZCcsIHRhcmdldCwgYmVjYW1lSW52YWxpZCk7Ci0gICAgdGhpcy5vbignYmVjYW1lVmFs
aWQnLCB0YXJnZXQsIGJlY2FtZVZhbGlkKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJvcGVydHkg
ZXJyb3JzQnlBdHRyaWJ1dGVOYW1lCi0gICAgQHR5cGUge0VtYmVyLk1hcFdpdGhEZWZhdWx0fQot
ICAgIEBwcml2YXRlCi0gICovCi0gIGVycm9yc0J5QXR0cmlidXRlTmFtZTogRW1iZXIucmVkdWNl
Q29tcHV0ZWQoImNvbnRlbnQiLCB7Ci0gICAgaW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHsKLSAg
ICAgIHJldHVybiBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgICBkZWZhdWx0
VmFsdWU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHJldHVybiBFbWJlci5BKCk7Ci0gICAgICAg
IH0KLSAgICAgIH0pOwotICAgIH0sCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywg
ZXJyb3IpIHsKLSAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmlidXRlKS5wdXNoT2JqZWN0KGVy
cm9yKTsKLQotICAgICAgcmV0dXJuIGVycm9yczsKLSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06
IGZ1bmN0aW9uKGVycm9ycywgZXJyb3IpIHsKLSAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmli
dXRlKS5yZW1vdmVPYmplY3QoZXJyb3IpOwotCi0gICAgICByZXR1cm4gZXJyb3JzOwotICAgIH0K
LSAgfSksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBlcnJvcnMgZm9yIGEgZ2l2ZW4gYXR0cmlidXRl
Ci0KLSAgICBAbWV0aG9kIGVycm9yc0ZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUK
LSAgICBAcmV0dXJucyB7QXJyYXl9Ci0gICovCi0gIGVycm9yc0ZvcjogZnVuY3Rpb24oYXR0cmli
dXRlKSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3JzQnlBdHRyaWJ1dGVOYW1lJykuZ2V0
KGF0dHJpYnV0ZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICovCi0gIG1lc3NhZ2VzOiBFbWJlci5jb21w
dXRlZC5tYXBCeSgnY29udGVudCcsICdtZXNzYWdlJyksCi0KLSAgLyoqCi0gICAgQHByb3BlcnR5
IGNvbnRlbnQKLSAgICBAdHlwZSB7QXJyYXl9Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgY29udGVu
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAg
fSksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1bmtub3duUHJvcGVydHkKLSAgICBAcHJpdmF0ZQot
ICAqLwotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSkgewotICAgIHZhciBl
cnJvcnMgPSB0aGlzLmVycm9yc0ZvcihhdHRyaWJ1dGUpOwotICAgIGlmIChpc0VtcHR5KGVycm9y
cykpIHsgcmV0dXJuIG51bGw7IH0KLSAgICByZXR1cm4gZXJyb3JzOwotICB9LAotCi0gIC8qKgot
ICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBwcml2YXRlCi0gICovCi0gIG5leHRPYmplY3Q6
IGZ1bmN0aW9uKGluZGV4LCBwcmV2aW91c09iamVjdCwgY29udGV4dCkgewotICAgIHJldHVybiBn
ZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpbmRleCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
VG90YWwgbnVtYmVyIG9mIGVycm9ycy4KLQotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlw
ZSB7TnVtYmVyfQotICAgIEByZWFkT25seQotICAqLwotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVk
Lm9uZVdheSgnY29udGVudC5sZW5ndGgnKS5yZWFkT25seSgpLAotCi0gIC8qKgotICAgIEBwcm9w
ZXJ0eSBpc0VtcHR5Ci0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0g
IGlzRW1wdHk6IEVtYmVyLmNvbXB1dGVkLm5vdCgnbGVuZ3RoJykucmVhZE9ubHkoKSwKLQotICAv
KioKLSAgICBBZGRzIGVycm9yIG1lc3NhZ2VzIHRvIGEgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5k
cwotICAgIGBiZWNhbWVJbnZhbGlkYCBldmVudCB0byB0aGUgcmVjb3JkLgotCi0gICAgQG1ldGhv
ZCBhZGQKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCi0gICAgQHBhcmFtIHtBcnJheXxT
dHJpbmd9IG1lc3NhZ2VzCi0gICovCi0gIGFkZDogZnVuY3Rpb24oYXR0cmlidXRlLCBtZXNzYWdl
cykgewotICAgIHZhciB3YXNFbXB0eSA9IGdldCh0aGlzLCAnaXNFbXB0eScpOwotCi0gICAgbWVz
c2FnZXMgPSB0aGlzLl9maW5kT3JDcmVhdGVNZXNzYWdlcyhhdHRyaWJ1dGUsIG1lc3NhZ2VzKTsK
LSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3RzKG1lc3NhZ2VzKTsKLQotICAgIHRo
aXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlKTsKLSAgICB0aGlzLmVudW1lcmFibGVD
b250ZW50RGlkQ2hhbmdlKCk7Ci0KLSAgICBpZiAod2FzRW1wdHkgJiYgIWdldCh0aGlzLCAnaXNF
bXB0eScpKSB7Ci0gICAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUludmFsaWQnKTsKLSAgICB9Ci0g
IH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBfZmluZE9yQ3JlYXRlTWVzc2FnZXMKLSAgICBAcHJp
dmF0ZQotICAqLwotICBfZmluZE9yQ3JlYXRlTWVzc2FnZXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZSwg
bWVzc2FnZXMpIHsKLSAgICB2YXIgZXJyb3JzID0gdGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKTsK
LQotICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXkobWVzc2FnZXMpLm1hcChmdW5jdGlvbihtZXNz
YWdlKSB7Ci0gICAgICByZXR1cm4gZXJyb3JzLmZpbmRCeSgnbWVzc2FnZScsIG1lc3NhZ2UpIHx8
IHsKLSAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGUsCi0gICAgICAgIG1lc3NhZ2U6IG1lc3Nh
Z2UKLSAgICAgIH07Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgZXJy
b3IgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5kcwotICAgIGBiZWNh
bWVWYWxpZGAgZXZlbnQgdG8gdGhlIHJlY29yZCBpZiB0aGVyZSBubyBtb3JlIGVycm9ycyBsZWZ0
LgotCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCi0g
ICovCi0gIHJlbW92ZTogZnVuY3Rpb24oYXR0cmlidXRlKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAn
aXNFbXB0eScpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2Nv
bnRlbnQnKS5yZWplY3RCeSgnYXR0cmlidXRlJywgYXR0cmlidXRlKTsKLSAgICBnZXQodGhpcywg
J2NvbnRlbnQnKS5zZXRPYmplY3RzKGNvbnRlbnQpOwotCi0gICAgdGhpcy5ub3RpZnlQcm9wZXJ0
eUNoYW5nZShhdHRyaWJ1dGUpOwotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2Uo
KTsKLQotICAgIGlmIChnZXQodGhpcywgJ2lzRW1wdHknKSkgewotICAgICAgdGhpcy50cmlnZ2Vy
KCdiZWNhbWVWYWxpZCcpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGFsbCBl
cnJvciBtZXNzYWdlcyBhbmQgc2VuZHMgYGJlY2FtZVZhbGlkYCBldmVudAotICAgIHRvIHRoZSBy
ZWNvcmQuCi0KLSAgICBAbWV0aG9kIGNsZWFyCi0gICovCi0gIGNsZWFyOiBmdW5jdGlvbigpIHsK
LSAgICBpZiAoZ2V0KHRoaXMsICdpc0VtcHR5JykpIHsgcmV0dXJuOyB9Ci0KLSAgICBnZXQodGhp
cywgJ2NvbnRlbnQnKS5jbGVhcigpOwotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFu
Z2UoKTsKLQotICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmFsaWQnKTsKLSAgfSwKLQotICAvKioK
LSAgICBDaGVja3MgaWYgdGhlcmUgaXMgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBnaXZlbiBhdHRy
aWJ1dGUuCi0KLSAgICBAbWV0aG9kIGhhcwotICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUK
LSAgICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGVyZSBzb21lIGVycm9ycyBvbiBnaXZl
biBhdHRyaWJ1dGUKLSAgKi8KLSAgaGFzOiBmdW5jdGlvbihhdHRyaWJ1dGUpIHsKLSAgICByZXR1
cm4gIWlzRW1wdHkodGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKSk7Ci0gIH0KLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAotICAgIG1lcmdlID0gRW1iZXIu
bWVyZ2U7Ci0KLXZhciByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUgPSBFbWJlci5jb21wdXRlZCgn
Y3VycmVudFN0YXRlJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICByZXR1cm4gZ2V0KGdldCh0
aGlzLCAnY3VycmVudFN0YXRlJyksIGtleSk7Ci19KS5yZWFkT25seSgpOwotCi0vKioKLQotICBU
aGUgbW9kZWwgY2xhc3MgdGhhdCBhbGwgRW1iZXIgRGF0YSByZWNvcmRzIGRlc2NlbmQgZnJvbS4K
LQotICBAY2xhc3MgTW9kZWwKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBFbWJlci5PYmpl
Y3QKLSAgQHVzZXMgRW1iZXIuRXZlbnRlZAotKi8KLURTLk1vZGVsID0gRW1iZXIuT2JqZWN0LmV4
dGVuZChFbWJlci5FdmVudGVkLCB7Ci0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRy
dWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBlbXB0eWAKLSAgICBzdGF0ZS4gRW1wdHkgaXMgdGhl
IGZpcnN0IHN0YXRlIGFsbCByZWNvcmRzIGVudGVyIGFmdGVyIHRoZXkgaGF2ZQotICAgIGJlZW4g
Y3JlYXRlZC4gTW9zdCByZWNvcmRzIGNyZWF0ZWQgYnkgdGhlIHN0b3JlIHdpbGwgcXVpY2tseQot
ICAgIHRyYW5zaXRpb24gdG8gdGhlIGBsb2FkaW5nYCBzdGF0ZSBpZiBkYXRhIG5lZWRzIHRvIGJl
IGZldGNoZWQgZnJvbQotICAgIHRoZSBzZXJ2ZXIgb3IgdGhlIGBjcmVhdGVkYCBzdGF0ZSBpZiB0
aGUgcmVjb3JkIGlzIGNyZWF0ZWQgb24gdGhlCi0gICAgY2xpZW50LiBBIHJlY29yZCBjYW4gYWxz
byBlbnRlciB0aGUgZW1wdHkgc3RhdGUgaWYgdGhlIGFkYXB0ZXIgaXMKLSAgICB1bmFibGUgdG8g
bG9jYXRlIHRoZSByZWNvcmQuCi0KLSAgICBAcHJvcGVydHkgaXNFbXB0eQotICAgIEB0eXBlIHtC
b29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBpc0VtcHR5OiByZXRyaWV2ZUZyb21DdXJy
ZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNv
cmQgaXMgaW4gdGhlIGBsb2FkaW5nYCBzdGF0ZS4gQQotICAgIHJlY29yZCBlbnRlcnMgdGhpcyBz
dGF0ZSB3aGVuIHRoZSBzdG9yZSBhc2tzIHRoZSBhZGFwdGVyIGZvciBpdHMKLSAgICBkYXRhLiBJ
dCByZW1haW5zIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIGFkYXB0ZXIgcHJvdmlkZXMgdGhlCi0g
ICAgcmVxdWVzdGVkIGRhdGEuCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkaW5nCi0gICAgQHR5cGUg
e0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzTG9hZGluZzogcmV0cmlldmVGcm9t
Q3VycmVudFN0YXRlLAotICAvKioKLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUg
cmVjb3JkIGlzIGluIHRoZSBgbG9hZGVkYCBzdGF0ZS4gQQotICAgIHJlY29yZCBlbnRlcnMgdGhp
cyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlzIHBvcHVsYXRlZC4gTW9zdCBvZiBhCi0gICAgcmVjb3Jk
J3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMgb2YgdGhlIGBsb2FkZWRgCi0g
ICAgc3RhdGUuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHJl
Y29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOwotICAgIHJlY29yZC5nZXQoJ2lz
TG9hZGVkJyk7IC8vIHRydWUKLQotICAgIHN0b3JlLmZpbmQoJ21vZGVsJywgMSkudGhlbihmdW5j
dGlvbihtb2RlbCkgewotICAgICAgbW9kZWwuZ2V0KCdpc0xvYWRlZCcpOyAvLyB0cnVlCi0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkZWQKLSAgICBAdHlwZSB7Qm9vbGVh
bn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNMb2FkZWQ6IHJldHJpZXZlRnJvbUN1cnJlbnRT
dGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBp
cyBpbiB0aGUgYGRpcnR5YCBzdGF0ZS4gVGhlCi0gICAgcmVjb3JkIGhhcyBsb2NhbCBjaGFuZ2Vz
IHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQgYnkgdGhlCi0gICAgYWRhcHRlci4gVGhpcyBp
bmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgKGJ1dCBub3QgeWV0Ci0gICAg
c2F2ZWQpIG9yIGRlbGV0ZWQuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOwotICAgIHJlY29y
ZC5nZXQoJ2lzRGlydHknKTsgLy8gdHJ1ZQotCi0gICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50
aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lzRGlydHknKTsgLy8gZmFs
c2UKLSAgICAgIG1vZGVsLnNldCgnZm9vJywgJ3NvbWUgdmFsdWUnKTsKLSAgICAgIG1vZGVsLnNl
dCgnaXNEaXJ0eScpOyAvLyB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkg
aXNEaXJ0eQotICAgIEB0eXBlIHtCb29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBpc0Rp
cnR5OiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVy
dHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBzYXZpbmdgIHN0YXRlLiBBCi0gICAg
cmVjb3JkIGVudGVycyB0aGUgc2F2aW5nIHN0YXRlIHdoZW4gYHNhdmVgIGlzIGNhbGxlZCwgYnV0
IHRoZQotICAgIGFkYXB0ZXIgaGFzIG5vdCB5ZXQgYWNrbm93bGVkZ2VkIHRoYXQgdGhlIGNoYW5n
ZXMgaGF2ZSBiZWVuCi0gICAgcGVyc2lzdGVkIHRvIHRoZSBiYWNrZW5kLgotCi0gICAgRXhhbXBs
ZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNv
cmQoQXBwLk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycpOyAvLyBmYWxzZQotICAg
IHZhciBwcm9taXNlID0gcmVjb3JkLnNhdmUoKTsKLSAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycp
OyAvLyB0cnVlCi0gICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgcmVjb3JkLmdl
dCgnaXNTYXZpbmcnKTsgLy8gZmFsc2UKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0
eSBpc1NhdmluZwotICAgIEB0eXBlIHtCb29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBp
c1NhdmluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotICAvKioKLSAgICBJZiB0aGlzIHBy
b3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgZGVsZXRlZGAgc3RhdGUKLSAg
ICBhbmQgaGFzIGJlZW4gbWFya2VkIGZvciBkZWxldGlvbi4gV2hlbiBgaXNEZWxldGVkYCBpcyB0
cnVlIGFuZAotICAgIGBpc0RpcnR5YCBpcyB0cnVlLCB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQgbG9j
YWxseSBidXQgdGhlIGRlbGV0aW9uCi0gICAgd2FzIG5vdCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBp
c1NhdmluZ2AgaXMgdHJ1ZSwgdGhlIGNoYW5nZSBpcwotICAgIGluLWZsaWdodC4gV2hlbiBib3Ro
IGBpc0RpcnR5YCBhbmQgYGlzU2F2aW5nYCBhcmUgZmFsc2UsIHRoZQotICAgIGNoYW5nZSBoYXMg
cGVyc2lzdGVkLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBy
ZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBwLk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0KCdp
c0RlbGV0ZWQnKTsgLy8gZmFsc2UKLSAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7Ci0gICAgcmVj
b3JkLmdldCgnaXNEZWxldGVkJyk7IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBp
c0RlbGV0ZWQKLSAgICBAdHlwZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNE
ZWxldGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJv
cGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBuZXdgIHN0YXRlLiBBCi0gICAg
cmVjb3JkIHdpbGwgYmUgaW4gdGhlIGBuZXdgIHN0YXRlIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRl
ZCBvbiB0aGUKLSAgICBjbGllbnQgYW5kIHRoZSBhZGFwdGVyIGhhcyBub3QgeWV0IHJlcG9ydCB0
aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkKLSAgICBzYXZlZC4KLQotICAgIEV4YW1wbGUKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5N
b2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnaXNOZXcnKTsgLy8gdHJ1ZQotCi0gICAgcmVjb3JkLnNh
dmUoKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lzTmV3Jyk7IC8v
IGZhbHNlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNOZXcKLSAgICBAdHlw
ZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNOZXc6IHJldHJpZXZlRnJvbUN1
cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJl
Y29yZCBpcyBpbiB0aGUgYHZhbGlkYCBzdGF0ZS4gQQotICAgIHJlY29yZCB3aWxsIGJlIGluIHRo
ZSBgdmFsaWRgIHN0YXRlIHdoZW4gbm8gY2xpZW50LXNpZGUKLSAgICB2YWxpZGF0aW9ucyBoYXZl
IGZhaWxlZCBhbmQgdGhlIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55Ci0gICAgc2VydmVyLXNp
ZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KLQotICAgIEBwcm9wZXJ0eSBpc1ZhbGlkCi0gICAgQHR5
cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzVmFsaWQ6IHJldHJpZXZlRnJv
bUN1cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhlIHJlY29yZCBpcyBpbiB0aGUgZGlydHkg
c3RhdGUgdGhpcyBwcm9wZXJ0eSB3aWxsIHJlcG9ydCB3aGF0Ci0gICAga2luZCBvZiBjaGFuZ2Ug
aGFzIGNhdXNlZCBpdCB0byBtb3ZlIGludG8gdGhlIGRpcnR5Ci0gICAgc3RhdGUuIFBvc3NpYmxl
IHZhbHVlcyBhcmU6Ci0KLSAgICAtIGBjcmVhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIGNyZWF0
ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KLSAgICAt
IGB1cGRhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGNsaWVudCBhbmQg
bm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KLSAgICAtIGBkZWxldGVkYCBUaGUgcmVjb3Jk
IGhhcyBiZWVuIGRlbGV0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUg
YWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVj
b3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnZGly
dHlUeXBlJyk7IC8vICdjcmVhdGVkJwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGRpcnR5VHlw
ZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGRpcnR5VHlwZTog
cmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotCi0gIC8qKgotICAgIElmIGB0cnVlYCB0aGUgYWRh
cHRlciByZXBvcnRlZCB0aGF0IGl0IHdhcyB1bmFibGUgdG8gc2F2ZSBsb2NhbAotICAgIGNoYW5n
ZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZSByZWNvcmQgaGF2
aW5nCi0gICAgaXRzIGBpc1ZhbGlkYCBwcm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYgdGhlIGFkYXB0
ZXIgcmVwb3J0ZWQgdGhhdAotICAgIHNlcnZlci1zaWRlIHZhbGlkYXRpb25zIGZhaWxlZC4KLQot
ICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0KCdpc0Vycm9y
Jyk7IC8vIGZhbHNlCi0gICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFsdWUnKTsKLSAg
ICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICByZWNvcmQuZ2V0
KCdpc0Vycm9yJyk7IC8vIHRydWUKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBp
c0Vycm9yCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzRXJy
b3I6IGZhbHNlLAotICAvKioKLSAgICBJZiBgdHJ1ZWAgdGhlIHN0b3JlIGlzIGF0dGVtcHRpbmcg
dG8gcmVsb2FkIHRoZSByZWNvcmQgZm9ybSB0aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycpOyAvLyBmYWxz
ZQotICAgIHJlY29yZC5yZWxvYWQoKTsKLSAgICByZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycpOyAv
LyB0cnVlCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNSZWxvYWRpbmcKLSAgICBAdHlwZSB7
Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNSZWxvYWRpbmc6IGZhbHNlLAotCi0g
IC8qKgotICAgIFRoZSBgY2xpZW50SWRgIHByb3BlcnR5IGlzIGEgdHJhbnNpZW50IG51bWVyaWNh
bCBpZGVudGlmaWVyCi0gICAgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkgdGhlIGRhdGEgc3RvcmUu
IEl0IGlzIGltcG9ydGFudAotICAgIHByaW1hcmlseSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2Jq
ZWN0cyBtYXkgbm90IHlldCBoYXZlIGFuCi0gICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCi0K
LSAgICBAcHJvcGVydHkgY2xpZW50SWQKLSAgICBAcHJpdmF0ZQotICAgIEB0eXBlIHtOdW1iZXJ8
U3RyaW5nfQotICAqLwotICBjbGllbnRJZDogbnVsbCwKLSAgLyoqCi0gICAgQWxsIGVtYmVyIG1v
ZGVscyBoYXZlIGFuIGlkIHByb3BlcnR5LiBUaGlzIGlzIGFuIGlkZW50aWZpZXIKLSAgICBtYW5h
Z2VkIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJl
Ci0gICAgc3RyaW5ncyBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LiBOb3RlIHdoZW4gZGVj
bGFyaW5nIHRoZQotICAgIGF0dHJpYnV0ZXMgZm9yIGEgbW9kZWwgaXQgaXMgYW4gZXJyb3IgdG8g
ZGVjbGFyZSBhbiBpZAotICAgIGF0dHJpYnV0ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdl
dCgnaWQnKTsgLy8gbnVsbAotCi0gICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50aGVuKGZ1bmN0
aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lkJyk7IC8vICcxJwotICAgIH0pOwotICAg
IGBgYAotCi0gICAgQHByb3BlcnR5IGlkCi0gICAgQHR5cGUge1N0cmluZ30KLSAgKi8KLSAgaWQ6
IG51bGwsCi0gIHRyYW5zYWN0aW9uOiBudWxsLAotICAvKioKLSAgICBAcHJvcGVydHkgY3VycmVu
dFN0YXRlCi0gICAgQHByaXZhdGUKLSAgICBAdHlwZSB7T2JqZWN0fQotICAqLwotICBjdXJyZW50
U3RhdGU6IG51bGwsCi0gIC8qKgotICAgIFdoZW4gdGhlIHJlY29yZCBpcyBpbiB0aGUgYGludmFs
aWRgIHN0YXRlIHRoaXMgb2JqZWN0IHdpbGwgY29udGFpbgotICAgIGFueSBlcnJvcnMgcmV0dXJu
ZWQgYnkgdGhlIGFkYXB0ZXIuIFdoZW4gcHJlc2VudCB0aGUgZXJyb3JzIGhhc2gKLSAgICB0eXBp
Y2FsbHkgY29udGFpbnMga2V5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnZhbGlkIHByb3BlcnR5
IG5hbWVzCi0gICAgYW5kIHZhbHVlcyB3aGljaCBhcmUgYW4gYXJyYXkgb2YgZXJyb3IgbWVzc2Fn
ZXMuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLmdldCgnZXJyb3JzLmxlbmd0aCcp
OyAvLyAwCi0gICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFsdWUnKTsKLSAgICByZWNv
cmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICByZWNvcmQuZ2V0KCdlcnJv
cnMnKS5nZXQoJ2ZvbycpOyAvLyBbJ2ZvbyBzaG91bGQgYmUgYSBudW1iZXIuJ10KLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBlcnJvcnMKLSAgICBAdHlwZSB7T2JqZWN0fQotICAq
LwotICBlcnJvcnM6IG51bGwsCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgSlNPTiByZXByZXNlbnRh
dGlvbiBvZiB0aGUgcmVjb3JkLCB1c2luZyB0aGUgc2VyaWFsaXphdGlvbgotICAgIHN0cmF0ZWd5
IG9mIHRoZSBzdG9yZSdzIGFkYXB0ZXIuCi0KLSAgIGBzZXJpYWxpemVgIHRha2VzIGFuIG9wdGlv
bmFsIGhhc2ggYXMgYSBwYXJhbWV0ZXIsIGN1cnJlbnRseQotICAgIHN1cHBvcnRlZCBvcHRpb25z
IGFyZToKLQotICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91
bGQgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICBKU09OIHJlcHJlc2VudGF0aW9uLgotCi0gICAg
QG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1
cm5zIHtPYmplY3R9IGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2ZSBKU09OIHZh
bHVlcyBvbmx5Ci0gICovCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZh
ciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKLSAgICByZXR1cm4gc3RvcmUuc2VyaWFsaXpl
KHRoaXMsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFVzZSBbRFMuSlNPTlNlcmlhbGl6
ZXJdKERTLkpTT05TZXJpYWxpemVyLmh0bWwpIHRvCi0gICAgZ2V0IHRoZSBKU09OIHJlcHJlc2Vu
dGF0aW9uIG9mIGEgcmVjb3JkLgotCi0gICAgYHRvSlNPTmAgdGFrZXMgYW4gb3B0aW9uYWwgaGFz
aCBhcyBhIHBhcmFtZXRlciwgY3VycmVudGx5Ci0gICAgc3VwcG9ydGVkIG9wdGlvbnMgYXJlOgot
Ci0gICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91bGQgYmUg
aW5jbHVkZWQgaW4gdGhlCi0gICAgICBKU09OIHJlcHJlc2VudGF0aW9uLgotCi0gICAgQG1ldGhv
ZCB0b0pTT04KLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm5zIHtPYmpl
Y3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgotICAqLwotICB0b0pTT046
IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgICAvLyBjb250YWluZXIgaXMgZm9yIGxhenkgdHJhbnNm
b3JtIGxvb2t1cHMKLSAgICB2YXIgc2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmNyZWF0
ZSh7IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIgfSk7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZXIu
c2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIEZpcmVkIHdoZW4g
dGhlIHJlY29yZCBpcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgotCi0gICAgQGV2ZW50IGRpZExv
YWQKLSAgKi8KLSAgZGlkTG9hZDogRW1iZXIuSywKLQotICAvKioKLSAgICBGaXJlZCB3aGVuIHRo
ZSByZWNvcmQgaXMgdXBkYXRlZC4KLQotICAgIEBldmVudCBkaWRVcGRhdGUKLSAgKi8KLSAgZGlk
VXBkYXRlOiBFbWJlci5LLAotCi0gIC8qKgotICAgIEZpcmVkIHdoZW4gdGhlIHJlY29yZCBpcyBj
cmVhdGVkLgotCi0gICAgQGV2ZW50IGRpZENyZWF0ZQotICAqLwotICBkaWRDcmVhdGU6IEVtYmVy
LkssCi0KLSAgLyoqCi0gICAgRmlyZWQgd2hlbiB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQuCi0KLSAg
ICBAZXZlbnQgZGlkRGVsZXRlCi0gICovCi0gIGRpZERlbGV0ZTogRW1iZXIuSywKLQotICAvKioK
LSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgYmVjb21lcyBpbnZhbGlkLgotCi0gICAgQGV2ZW50
IGJlY2FtZUludmFsaWQKLSAgKi8KLSAgYmVjYW1lSW52YWxpZDogRW1iZXIuSywKLQotICAvKioK
LSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgZW50ZXJzIHRoZSBlcnJvciBzdGF0ZS4KLQotICAg
IEBldmVudCBiZWNhbWVFcnJvcgotICAqLwotICBiZWNhbWVFcnJvcjogRW1iZXIuSywKLQotICAv
KioKLSAgICBAcHJvcGVydHkgZGF0YQotICAgIEBwcml2YXRlCi0gICAgQHR5cGUge09iamVjdH0K
LSAgKi8KLSAgZGF0YTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fZGF0
YSA9IHRoaXMuX2RhdGEgfHwge307Ci0gICAgcmV0dXJuIHRoaXMuX2RhdGE7Ci0gIH0pLnByb3Bl
cnR5KCksCi0KLSAgX2RhdGE6IG51bGwsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgc2V0
KHRoaXMsICdjdXJyZW50U3RhdGUnLCBEUy5Sb290U3RhdGUuZW1wdHkpOwotICAgIHZhciBlcnJv
cnMgPSBEUy5FcnJvcnMuY3JlYXRlKCk7Ci0gICAgZXJyb3JzLnJlZ2lzdGVySGFuZGxlcnModGhp
cywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnNlbmQoJ2JlY2FtZUludmFsaWQnKTsKLSAgICB9
LCBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2VuZCgnYmVjYW1lVmFsaWQnKTsKLSAgICB9KTsK
LSAgICBzZXQodGhpcywgJ2Vycm9ycycsIGVycm9ycyk7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAg
ICB0aGlzLl9zZXR1cCgpOwotICB9LAotCi0gIF9zZXR1cDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fY2hhbmdlc1RvU3luYyA9IHt9OwotICAgIHRoaXMuX2RlZmVycmVkVHJpZ2dlcnMgPSBbXTsK
LSAgICB0aGlzLl9kYXRhID0ge307Ci0gICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9OwotICAgIHRo
aXMuX2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9OwotICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7
fTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHNlbmQKLSAgICBAcHJpdmF0ZQotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lCi0gICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQKLSAgKi8KLSAg
c2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHZhciBjdXJyZW50U3RhdGUgPSBn
ZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpOwotCi0gICAgaWYgKCFjdXJyZW50U3RhdGVbbmFtZV0p
IHsKLSAgICAgIHRoaXMuX3VuaGFuZGxlZEV2ZW50KGN1cnJlbnRTdGF0ZSwgbmFtZSwgY29udGV4
dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZVtuYW1lXSh0aGlzLCBjb250ZXh0
KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHRyYW5zaXRpb25UbwotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgKi8KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlv
bihuYW1lKSB7Ci0gICAgLy8gUE9TU0lCTEUgVE9ETzogUmVtb3ZlIHRoaXMgY29kZSBhbmQgcmVw
bGFjZSB3aXRoCi0gICAgLy8gYWx3YXlzIGhhdmluZyBkaXJlY3QgcmVmZXJlbmNlcyB0byBzdGF0
ZSBvYmplY3RzCi0KLSAgICB2YXIgcGl2b3ROYW1lID0gbmFtZS5zcGxpdCgiLiIsIDEpLAotICAg
ICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpLAotICAgICAgICBz
dGF0ZSA9IGN1cnJlbnRTdGF0ZTsKLQotICAgIGRvIHsKLSAgICAgIGlmIChzdGF0ZS5leGl0KSB7
IHN0YXRlLmV4aXQodGhpcyk7IH0KLSAgICAgIHN0YXRlID0gc3RhdGUucGFyZW50U3RhdGU7Ci0g
ICAgfSB3aGlsZSAoIXN0YXRlLmhhc093blByb3BlcnR5KHBpdm90TmFtZSkpOwotCi0gICAgdmFy
IHBhdGggPSBuYW1lLnNwbGl0KCIuIik7Ci0KLSAgICB2YXIgc2V0dXBzID0gW10sIGVudGVycyA9
IFtdLCBpLCBsOwotCi0gICAgZm9yIChpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICBzdGF0ZSA9IHN0YXRlW3BhdGhbaV1dOwotCi0gICAgICBpZiAoc3RhdGUuZW50ZXIpIHsg
ZW50ZXJzLnB1c2goc3RhdGUpOyB9Ci0gICAgICBpZiAoc3RhdGUuc2V0dXApIHsgc2V0dXBzLnB1
c2goc3RhdGUpOyB9Ci0gICAgfQotCi0gICAgZm9yIChpPTAsIGw9ZW50ZXJzLmxlbmd0aDsgaTxs
OyBpKyspIHsKLSAgICAgIGVudGVyc1tpXS5lbnRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBzZXQo
dGhpcywgJ2N1cnJlbnRTdGF0ZScsIHN0YXRlKTsKLQotICAgIGZvciAoaT0wLCBsPXNldHVwcy5s
ZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBzZXR1cHNbaV0uc2V0dXAodGhpcyk7Ci0gICAgfQot
Ci0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICB9LAotCi0gIF91bmhhbmRs
ZWRFdmVudDogZnVuY3Rpb24oc3RhdGUsIG5hbWUsIGNvbnRleHQpIHsKLSAgICB2YXIgZXJyb3JN
ZXNzYWdlID0gIkF0dGVtcHRlZCB0byBoYW5kbGUgZXZlbnQgYCIgKyBuYW1lICsgImAgIjsKLSAg
ICBlcnJvck1lc3NhZ2UgICAgKz0gIm9uICIgKyBTdHJpbmcodGhpcykgKyAiIHdoaWxlIGluIHN0
YXRlICI7Ci0gICAgZXJyb3JNZXNzYWdlICAgICs9IHN0YXRlLnN0YXRlTmFtZSArICIuICI7Ci0K
LSAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICBlcnJvck1lc3NhZ2UgICs9
ICJDYWxsZWQgd2l0aCAiICsgRW1iZXIuaW5zcGVjdChjb250ZXh0KSArICIuIjsKLSAgICB9Ci0K
LSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJyb3JNZXNzYWdlKTsKLSAgfSwKLQotICB3aXRo
VHJhbnNhY3Rpb246IGZ1bmN0aW9uKGZuKSB7Ci0gICAgdmFyIHRyYW5zYWN0aW9uID0gZ2V0KHRo
aXMsICd0cmFuc2FjdGlvbicpOwotICAgIGlmICh0cmFuc2FjdGlvbikgeyBmbih0cmFuc2FjdGlv
bik7IH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGxvYWRpbmdEYXRhCi0gICAgQHByaXZh
dGUKLSAgICBAcGFyYW0ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgbG9hZGluZ0RhdGE6IGZ1
bmN0aW9uKHByb21pc2UpIHsKLSAgICB0aGlzLnNlbmQoJ2xvYWRpbmdEYXRhJywgcHJvbWlzZSk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkZWREYXRhCi0gICAgQHByaXZhdGUKLSAg
Ki8KLSAgbG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdsb2FkZWREYXRh
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3RGb3VuZAotICAgIEBwcml2YXRlCi0g
ICovCi0gIG5vdEZvdW5kOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ25vdEZvdW5kJyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBwdXNoZWREYXRhCi0gICAgQHByaXZhdGUKLSAg
Ki8KLSAgcHVzaGVkRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdwdXNoZWREYXRh
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTWFya3MgdGhlIHJlY29yZCBhcyBkZWxldGVkIGJ1dCBk
b2VzIG5vdCBzYXZlIGl0LiBZb3UgbXVzdCBjYWxsCi0gICAgYHNhdmVgIGFmdGVyd2FyZHMgaWYg
eW91IHdhbnQgdG8gcGVyc2lzdCBpdC4gWW91IG1pZ2h0IHVzZSB0aGlzCi0gICAgbWV0aG9kIGlm
IHlvdSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHN0aWxsIGByb2xsYmFjaygpYCBhCi0gICAg
ZGVsZXRlIGFmdGVyIGl0IHdhcyBtYWRlLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAg
ICAgIGFjdGlvbnM6IHsKLSAgICAgICAgc29mdERlbGV0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgdGhpcy5nZXQoJ21vZGVsJykuZGVsZXRlUmVjb3JkKCk7Ci0gICAgICAgIH0sCi0gICAgICAg
IGNvbmZpcm06IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnNhdmUo
KTsKLSAgICAgICAgfSwKLSAgICAgICAgdW5kbzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhp
cy5nZXQoJ21vZGVsJykucm9sbGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKLSAgKi8KLSAgZGVsZXRlUmVjb3Jk
OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2RlbGV0ZVJlY29yZCcpOwotICB9LAotCi0g
IC8qKgotICAgIFNhbWUgYXMgYGRlbGV0ZVJlY29yZGAsIGJ1dCBzYXZlcyB0aGUgcmVjb3JkIGlt
bWVkaWF0ZWx5LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5N
b2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsK
LSAgICAgICAgZGVsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgY29udHJvbGxlciA9
IHRoaXMuY29udHJvbGxlcjsKLSAgICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5kZXN0cm95UmVj
b3JkKCkudGhlbihmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIudHJhbnNpdGlv
blRvUm91dGUoJ21vZGVsLmluZGV4Jyk7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGVzdHJveVJlY29yZAotICAgIEBy
ZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUg
YWRhcHRlciByZXR1cm5zCi0gICAgc3VjY2Vzc2Z1bGx5IG9yIHJlamVjdGVkIGlmIHRoZSBhZGFw
dGVyIHJldHVybnMgd2l0aCBhbiBlcnJvci4KLSAgKi8KLSAgZGVzdHJveVJlY29yZDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5kZWxldGVSZWNvcmQoKTsKLSAgICByZXR1cm4gdGhpcy5zYXZlKCk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1bmxvYWRSZWNvcmQKLSAgICBAcHJpdmF0ZQot
ICAqLwotICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91
IGNhbiBvbmx5IHVubG9hZCBhIGxvYWRlZCwgbm9uLWRpcnR5IHJlY29yZC4iLCAhZ2V0KHRoaXMs
ICdpc0RpcnR5JykpOwotCi0gICAgdGhpcy5zZW5kKCd1bmxvYWRSZWNvcmQnKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAbWV0aG9kIGNsZWFyUmVsYXRpb25zaGlwcwotICAgIEBwcml2YXRlCi0gICov
Ci0gIGNsZWFyUmVsYXRpb25zaGlwczogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lYWNoUmVsYXRp
b25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgaWYgKHJlbGF0aW9u
c2hpcC5raW5kID09PSAnYmVsb25nc1RvJykgewotICAgICAgICBzZXQodGhpcywgbmFtZSwgbnVs
bCk7Ci0gICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsK
LSAgICAgICAgdmFyIGhhc01hbnkgPSB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcC5u
YW1lXTsKLSAgICAgICAgaWYgKGhhc01hbnkpIHsgaGFzTWFueS5jbGVhcigpOyB9Ci0gICAgICB9
Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmRB
cnJheXMKLSAgICBAcHJpdmF0ZQotICAqLwotICB1cGRhdGVSZWNvcmRBcnJheXM6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMuX3VwZGF0aW5nUmVjb3JkQXJyYXlzTGF0ZXIgPSBmYWxzZTsKLSAgICBn
ZXQodGhpcywgJ3N0b3JlJykuZGF0YVdhc1VwZGF0ZWQodGhpcy5jb25zdHJ1Y3RvciwgdGhpcyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhbiBvYmplY3QsIHdob3NlIGtleXMgYXJlIGNo
YW5nZWQgcHJvcGVydGllcywgYW5kIHZhbHVlIGlzCi0gICAgYW4gW29sZFByb3AsIG5ld1Byb3Bd
IGFycmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5NYXNj
b3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgbmFtZTogYXR0cignc3RyaW5nJykKLSAgICB9
KTsKLQotICAgIHZhciBwZXJzb24gPSBzdG9yZS5jcmVhdGVSZWNvcmQoJ3BlcnNvbicpOwotICAg
IHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7fQotICAgIHBlcnNvbi5zZXQoJ25hbWUn
LCAnVG9tc3RlcicpOwotICAgIHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7bmFtZTog
W3VuZGVmaW5lZCwgJ1RvbXN0ZXInXX0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2hhbmdlZEF0
dHJpYnV0ZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9IGFuIG9iamVjdCwgd2hvc2Uga2V5cyBhcmUg
Y2hhbmdlZCBwcm9wZXJ0aWVzLAotICAgICAgYW5kIHZhbHVlIGlzIGFuIFtvbGRQcm9wLCBuZXdQ
cm9wXSBhcnJheS4KLSAgKi8KLSAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKCkgewotICAg
IHZhciBvbGREYXRhID0gZ2V0KHRoaXMsICdfZGF0YScpLAotICAgICAgICBuZXdEYXRhID0gZ2V0
KHRoaXMsICdfYXR0cmlidXRlcycpLAotICAgICAgICBkaWZmRGF0YSA9IHt9LAotICAgICAgICBw
cm9wOwotCi0gICAgZm9yIChwcm9wIGluIG5ld0RhdGEpIHsKLSAgICAgIGRpZmZEYXRhW3Byb3Bd
ID0gW29sZERhdGFbcHJvcF0sIG5ld0RhdGFbcHJvcF1dOwotICAgIH0KLQotICAgIHJldHVybiBk
aWZmRGF0YTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGFkYXB0ZXJXaWxsQ29tbWl0Ci0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgYWRhcHRlcldpbGxDb21taXQ6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuc2VuZCgnd2lsbENvbW1pdCcpOwotICB9LAotCi0gIC8qKgotICAgIElmIHRoZSBhZGFw
dGVyIGRpZCBub3QgcmV0dXJuIGEgaGFzaCBpbiByZXNwb25zZSB0byBhIGNvbW1pdCwKLSAgICBt
ZXJnZSB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGludG8gdGhlIGV4
aXN0aW5nCi0gICAgc2F2ZWQgZGF0YS4KLQotICAgIEBtZXRob2QgYWRhcHRlckRpZENvbW1pdAot
ICAqLwotICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgc2V0KHRoaXMs
ICdpc0Vycm9yJywgZmFsc2UpOwotCi0gICAgaWYgKGRhdGEpIHsKLSAgICAgIHRoaXMuX2RhdGEg
PSBkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5taXhpbih0aGlzLl9kYXRhLCB0aGlz
Ll9pbkZsaWdodEF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIHRoaXMuX2luRmxpZ2h0QXR0cmli
dXRlcyA9IHt9OwotCi0gICAgdGhpcy5zZW5kKCdkaWRDb21taXQnKTsKLSAgICB0aGlzLnVwZGF0
ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0KLSAgICBpZiAoIWRhdGEpIHsgcmV0dXJuOyB9Ci0KLSAg
ICB0aGlzLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICB0
aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCBhZGFwdGVyRGlkRGlydHkKLSAgICBAcHJpdmF0ZQotICAqLwotICBhZGFw
dGVyRGlkRGlydHk6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2VuZCgnYmVjb21lRGlydHknKTsK
LSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0gIH0sCi0KLSAgZGF0YURpZENo
YW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yZWxvYWRIYXNNYW55
cygpOwotICB9LCAnZGF0YScpLAotCi0gIHJlbG9hZEhhc01hbnlzOiBmdW5jdGlvbigpIHsKLSAg
ICB2YXIgcmVsYXRpb25zaGlwcyA9IGdldCh0aGlzLmNvbnN0cnVjdG9yLCAncmVsYXRpb25zaGlw
c0J5TmFtZScpOwotICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXIoKTsKLSAgICByZWxh
dGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBp
ZiAodGhpcy5fZGF0YS5saW5rcyAmJiB0aGlzLl9kYXRhLmxpbmtzW25hbWVdKSB7IHJldHVybjsg
fQotICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAg
dGhpcy5oYXNNYW55RGlkQ2hhbmdlKHJlbGF0aW9uc2hpcC5rZXkpOwotICAgICAgfQotICAgIH0s
IHRoaXMpOwotICB9LAotCi0gIGhhc01hbnlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleSkgewotICAg
IHZhciBoYXNNYW55ID0gdGhpcy5fcmVsYXRpb25zaGlwc1trZXldOwotCi0gICAgaWYgKGhhc01h
bnkpIHsKLSAgICAgIHZhciByZWNvcmRzID0gdGhpcy5fZGF0YVtrZXldIHx8IFtdOwotCi0gICAg
ICBzZXQoaGFzTWFueSwgJ2NvbnRlbnQnLCBFbWJlci5BKHJlY29yZHMpKTsKLSAgICAgIHNldCho
YXNNYW55LCAnaXNMb2FkZWQnLCB0cnVlKTsKLSAgICAgIGhhc01hbnkudHJpZ2dlcignZGlkTG9h
ZCcpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5
c0xhdGVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgdXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6IGZ1
bmN0aW9uKCkgewotICAgIC8vIHF1aWNrIGhhY2sgKHNvbWV0aGluZyBsaWtlIHRoaXMgY291bGQg
YmUgcHVzaGVkIGludG8gcnVuLm9uY2UKLSAgICBpZiAodGhpcy5fdXBkYXRpbmdSZWNvcmRBcnJh
eXNMYXRlcikgeyByZXR1cm47IH0KLSAgICB0aGlzLl91cGRhdGluZ1JlY29yZEFycmF5c0xhdGVy
ID0gdHJ1ZTsKLQotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMu
dXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHNldHVwRGF0
YQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEKLSAgICBAcGFyYW0ge0Jv
b2xlYW59IHBhcnRpYWwgdGhlIGRhdGEgc2hvdWxkIGJlIG1lcmdlZCBpbnRvCi0gICAgICB0aGUg
ZXhpc3RpbmcgZGF0YSwgbm90IHJlcGxhY2UgaXQuCi0gICovCi0gIHNldHVwRGF0YTogZnVuY3Rp
b24oZGF0YSwgcGFydGlhbCkgewotICAgIGlmIChwYXJ0aWFsKSB7Ci0gICAgICBFbWJlci5tZXJn
ZSh0aGlzLl9kYXRhLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5fZGF0YSA9IGRh
dGE7Ci0gICAgfQotCi0gICAgdmFyIHJlbGF0aW9uc2hpcHMgPSB0aGlzLl9yZWxhdGlvbnNoaXBz
OwotCi0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbCkgewotICAg
ICAgaWYgKGRhdGEubGlua3MgJiYgZGF0YS5saW5rc1tuYW1lXSkgeyByZXR1cm47IH0KLSAgICAg
IGlmIChyZWwub3B0aW9ucy5hc3luYykgeyByZWxhdGlvbnNoaXBzW25hbWVdID0gbnVsbDsgfQot
ICAgIH0pOwotCi0gICAgaWYgKGRhdGEpIHsgdGhpcy5wdXNoZWREYXRhKCk7IH0KLQotICAgIHRo
aXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMu
bm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsKLSAgICB9KTsKLSAgfSwKLQotICBtYXRlcmlh
bGl6ZUlkOiBmdW5jdGlvbihpZCkgewotICAgIHNldCh0aGlzLCAnaWQnLCBpZCk7Ci0gIH0sCi0K
LSAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7Ci0gICAgRW1i
ZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBoYXNoIG9mIGF0dHJpYnV0ZXMgdG8gbWF0ZXJpYWxpemVB
dHRyaWJ1dGVzIiwgISFhdHRyaWJ1dGVzKTsKLSAgICBtZXJnZSh0aGlzLl9kYXRhLCBhdHRyaWJ1
dGVzKTsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSwgdmFs
dWUpIHsKLSAgICB0aGlzLl9kYXRhW25hbWVdID0gdmFsdWU7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QG1ldGhvZCB1cGRhdGVIYXNNYW55Ci0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlY29yZHMKLSAgKi8KLSAgdXBkYXRlSGFzTWFueTog
ZnVuY3Rpb24obmFtZSwgcmVjb3JkcykgewotICAgIHRoaXMuX2RhdGFbbmFtZV0gPSByZWNvcmRz
OwotICAgIHRoaXMuaGFzTWFueURpZENoYW5nZShuYW1lKTsKLSAgfSwKLQotICAvKioKLSAgICBA
bWV0aG9kIHVwZGF0ZUJlbG9uZ3NUbwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9
IG5hbWUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgdXBkYXRlQmVsb25n
c1RvOiBmdW5jdGlvbihuYW1lLCByZWNvcmQpIHsKLSAgICB0aGlzLl9kYXRhW25hbWVdID0gcmVj
b3JkOwotICB9LAotCi0gIC8qKgotICAgIElmIHRoZSBtb2RlbCBgaXNEaXJ0eWAgdGhpcyBmdW5j
dGlvbiB3aWxsIGRpc2NhcmQgYW55IHVuc2F2ZWQKLSAgICBjaGFuZ2VzCi0KLSAgICBFeGFtcGxl
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLmdldCgnbmFtZScpOyAvLyAnVW50aXRs
ZWQgRG9jdW1lbnQnCi0gICAgcmVjb3JkLnNldCgnbmFtZScsICdEb2MgMScpOwotICAgIHJlY29y
ZC5nZXQoJ25hbWUnKTsgLy8gJ0RvYyAxJwotICAgIHJlY29yZC5yb2xsYmFjaygpOwotICAgIHJl
Y29yZC5nZXQoJ25hbWUnKTsgLy8gJ1VudGl0bGVkIERvY3VtZW50JwotICAgIGBgYAotCi0gICAg
QG1ldGhvZCByb2xsYmFjawotICAqLwotICByb2xsYmFjazogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fYXR0cmlidXRlcyA9IHt9OwotCi0gICAgaWYgKGdldCh0aGlzLCAnaXNFcnJvcicpKSB7Ci0g
ICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKLSAgICAgIHNldCh0aGlzLCAnaXNF
cnJvcicsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoIWdldCh0aGlzLCAnaXNWYWxpZCcpKSB7
Ci0gICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKLSAgICB9Ci0KLSAgICB0aGlz
LnNlbmQoJ3JvbGxlZEJhY2snKTsKLQotICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2Vy
dmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEn
KTsKLSAgICB9KTsKLSAgfSwKLQotICB0b1N0cmluZ0V4dGVuc2lvbjogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIGdldCh0aGlzLCAnaWQnKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGUgZ29hbCBv
ZiB0aGlzIG1ldGhvZCBpcyB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHNwZWNpZmljIG9ic2VydmVy
cwotICAgIHRoYXQgdGFrZSBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gYXBwbGljYXRpb24gY2hhbmdl
cy4KLQotICAgIFRoaXMgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gbWFrZSBjaGFuZ2VzIChzdWNoIGFz
IG1hdGVyaWFsaXphdGlvbiBhbmQKLSAgICByb2xsYmFjaykgdGhhdCBzaG91bGQgbm90IHRyaWdn
ZXIgc2Vjb25kYXJ5IGJlaGF2aW9yIChzdWNoIGFzIHNldHRpbmcgYW4KLSAgICBpbnZlcnNlIHJl
bGF0aW9uc2hpcCBvciBtYXJraW5nIHJlY29yZHMgYXMgZGlydHkpLgotCi0gICAgVGhlIHNwZWNp
ZmljIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IGNoYW5nZSBhcyBFbWJlciBwcm9wZXIgcHJv
dmlkZXMKLSAgICBiZXR0ZXIgaW5mcmFzdHJ1Y3R1cmUgZm9yIHN1c3BlbmRpbmcgZ3JvdXBzIG9m
IG9ic2VydmVycywgYW5kIGlmIEFycmF5Ci0gICAgb2JzZXJ2YXRpb24gYmVjb21lcyBtb3JlIHVu
aWZpZWQgd2l0aCByZWd1bGFyIG9ic2VydmVycy4KLQotICAgIEBtZXRob2Qgc3VzcGVuZFJlbGF0
aW9uc2hpcE9ic2VydmVycwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIGNhbGxiYWNrCi0gICAg
QHBhcmFtIGJpbmRpbmcKLSAgKi8KLSAgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVyczogZnVu
Y3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB2YXIgb2JzZXJ2ZXJzID0gZ2V0KHRoaXMu
Y29uc3RydWN0b3IsICdyZWxhdGlvbnNoaXBOYW1lcycpLmJlbG9uZ3NUbzsKLSAgICB2YXIgc2Vs
ZiA9IHRoaXM7Ci0KLSAgICB0cnkgewotICAgICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlw
cyA9IHRydWU7Ci0gICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVycyhzZWxmLCBvYnNlcnZlcnMs
IG51bGwsICdiZWxvbmdzVG9EaWRDaGFuZ2UnLCBmdW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIu
X3N1c3BlbmRCZWZvcmVPYnNlcnZlcnMoc2VsZiwgb2JzZXJ2ZXJzLCBudWxsLCAnYmVsb25nc1Rv
V2lsbENoYW5nZScsIGZ1bmN0aW9uKCkgewotICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGlu
ZyB8fCBzZWxmKTsKLSAgICAgICAgfSk7Ci0gICAgICB9KTsKLSAgICB9IGZpbmFsbHkgewotICAg
ICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IGZhbHNlOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgICBTYXZlIHRoZSByZWNvcmQgYW5kIHBlcnNpc3QgYW55IGNoYW5nZXMgdG8gdGhl
IHJlY29yZCB0byBhbgotICAgIGV4dGVuYWwgc291cmNlIHZpYSB0aGUgYWRhcHRlci4KLQotICAg
IEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuc2V0KCduYW1lJywgJ1Rv
bXN0ZXInKTsKLSAgICByZWNvcmQuc2F2ZSgpLnRoZW4oZnVuY3Rpb24oKXsKLSAgICAgIC8vIFN1
Y2Nlc3MgY2FsbGJhY2sKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEVycm9yIGNhbGxi
YWNrCi0gICAgfSk7Ci0gICAgYGBgCi0gICAgQG1ldGhvZCBzYXZlCi0gICAgQHJldHVybiB7UHJv
bWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBhZGFwdGVyIHJl
dHVybnMKLSAgICBzdWNjZXNzZnVsbHkgb3IgcmVqZWN0ZWQgaWYgdGhlIGFkYXB0ZXIgcmV0dXJu
cyB3aXRoIGFuIGVycm9yLgotICAqLwotICBzYXZlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcHJv
bWlzZUxhYmVsID0gIkRTOiBNb2RlbCNzYXZlICIgKyB0aGlzOwotICAgIHZhciByZXNvbHZlciA9
IEVtYmVyLlJTVlAuZGVmZXIocHJvbWlzZUxhYmVsKTsKLQotICAgIHRoaXMuZ2V0KCdzdG9yZScp
LnNjaGVkdWxlU2F2ZSh0aGlzLCByZXNvbHZlcik7Ci0gICAgdGhpcy5faW5GbGlnaHRBdHRyaWJ1
dGVzID0gdGhpcy5fYXR0cmlidXRlczsKLSAgICB0aGlzLl9hdHRyaWJ1dGVzID0ge307Ci0KLSAg
ICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9t
aXNlIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJlbG9hZCB0aGUgcmVjb3JkIGZyb20gdGhlIGFk
YXB0ZXIuCi0KLSAgICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSByZWNvcmQgaGFzIGFscmVh
ZHkgZmluaXNoZWQgbG9hZGluZwotICAgIGFuZCBoYXMgbm90IHlldCBiZWVuIG1vZGlmaWVkIChg
aXNMb2FkZWRgIGJ1dCBub3QgYGlzRGlydHlgLAotICAgIG9yIGBpc1NhdmluZ2ApLgotCi0gICAg
RXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Nb2RlbFZpZXdSb3V0ZSA9IEVt
YmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHJlbG9hZDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykucmVsb2FkKCk7Ci0gICAgICAg
IH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVsb2FkCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRo
ZSByZWNvcmQgd2hlbiB0aGUKLSAgICBhZGFwdGVyIHJldHVybnMgc3VjY2Vzc2Z1bGx5IG9yIHJl
amVjdGVkIGlmIHRoZSBhZGFwdGVyIHJldHVybnMKLSAgICB3aXRoIGFuIGVycm9yLgotICAqLwot
ICByZWxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAnaXNSZWxvYWRpbmcnLCB0cnVl
KTsKLQotICAgIHZhciAgcmVjb3JkID0gdGhpczsKLQotICAgIHZhciBwcm9taXNlTGFiZWwgPSAi
RFM6IE1vZGVsI3JlbG9hZCBvZiAiICsgdGhpczsKLSAgICB2YXIgcHJvbWlzZSA9IG5ldyBFbWJl
ci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSl7Ci0gICAgICAgcmVjb3JkLnNlbmQoJ3Jl
bG9hZFJlY29yZCcsIHJlc29sdmUpOwotICAgIH0sIHByb21pc2VMYWJlbCkudGhlbihmdW5jdGlv
bigpIHsKLSAgICAgIHJlY29yZC5zZXQoJ2lzUmVsb2FkaW5nJywgZmFsc2UpOwotICAgICAgcmVj
b3JkLnNldCgnaXNFcnJvcicsIGZhbHNlKTsKLSAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgfSwg
ZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICByZWNvcmQuc2V0KCdpc0Vycm9yJywgdHJ1ZSk7Ci0g
ICAgICB0aHJvdyByZWFzb247Ci0gICAgfSwgIkRTOiBNb2RlbCNyZWxvYWQgY29tcGxldGUsIHVw
ZGF0ZSBmbGFncyIpOwotCi0gICAgcmV0dXJuIERTLlByb21pc2VPYmplY3QuY3JlYXRlKHsgcHJv
bWlzZTogcHJvbWlzZSB9KTsKLSAgfSwKLQotICAvLyBGT1IgVVNFIERVUklORyBDT01NSVQgUFJP
Q0VTUwotCi0gIGFkYXB0ZXJEaWRVcGRhdGVBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZU5h
bWUsIHZhbHVlKSB7Ci0KLSAgICAvLyBJZiBhIHZhbHVlIGlzIHBhc3NlZCBpbiwgdXBkYXRlIHRo
ZSBpbnRlcm5hbCBhdHRyaWJ1dGVzIGFuZCBjbGVhcgotICAgIC8vIHRoZSBhdHRyaWJ1dGUgY2Fj
aGUgc28gaXQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZS4gT3RoZXJ3aXNlLAotICAgIC8vIGNvbGxh
cHNlIHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGludGVybmFsIGF0dHJpYnV0ZXMgYmVjYXVz
ZQotICAgIC8vIHRoZSBhZGFwdGVyIGhhcyBhY2tub3dsZWRnZWQgaXQuCi0gICAgaWYgKHZhbHVl
ICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFtZV0gPSB2YWx1
ZTsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlTmFtZSk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFtZV0gPSB0aGlzLl9pbkZsaWdo
dEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07Ci0gICAgfQotCi0gICAgdGhpcy51cGRhdGVSZWNv
cmRBcnJheXNMYXRlcigpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgYWRhcHRlckRpZElu
dmFsaWRhdGUKLSAgICBAcHJpdmF0ZQotICAqLwotICBhZGFwdGVyRGlkSW52YWxpZGF0ZTogZnVu
Y3Rpb24oZXJyb3JzKSB7Ci0gICAgdmFyIHJlY29yZEVycm9ycyA9IGdldCh0aGlzLCAnZXJyb3Jz
Jyk7Ci0gICAgZnVuY3Rpb24gYWRkRXJyb3IobmFtZSkgewotICAgICAgaWYgKGVycm9yc1tuYW1l
XSkgewotICAgICAgICByZWNvcmRFcnJvcnMuYWRkKG5hbWUsIGVycm9yc1tuYW1lXSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgdGhpcy5lYWNoQXR0cmlidXRlKGFkZEVycm9yKTsKLSAgICB0aGlz
LmVhY2hSZWxhdGlvbnNoaXAoYWRkRXJyb3IpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2Qg
YWRhcHRlckRpZEVycm9yCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgYWRhcHRlckRpZEVycm9yOiBm
dW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2JlY2FtZUVycm9yJyk7Ci0gICAgc2V0KHRoaXMs
ICdpc0Vycm9yJywgdHJ1ZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT3ZlcnJpZGUgdGhlIGRlZmF1
bHQgZXZlbnQgZmlyaW5nIGZyb20gRW1iZXIuRXZlbnRlZCB0bwotICAgIGFsc28gY2FsbCBtZXRo
b2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0KLSAgICBAbWV0aG9kIHRyaWdnZXIKLSAgICBAcHJp
dmF0ZQotICAgIEBwYXJhbSBuYW1lCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICBFbWJlci50cnlJbnZva2UodGhpcywgbmFtZSwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMs
IDEpKTsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0g
IHRyaWdnZXJMYXRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX2RlZmVycmVkVHJpZ2dl
cnMucHVzaChhcmd1bWVudHMpICE9PSAxKSB7IHJldHVybjsgfQotICAgIEVtYmVyLnJ1bi5zY2hl
ZHVsZSgnYWN0aW9ucycsIHRoaXMsICdfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnMnKTsKLSAgfSwK
LQotICBfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnM6IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFy
IGk9MCwgbD10aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
IHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCB0aGlzLl9kZWZlcnJlZFRyaWdnZXJzW2ldKTsKLSAg
ICB9Ci0KLSAgICB0aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aCA9IDA7Ci0gIH0KLX0pOwot
Ci1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0KLSAgLyoqCi0gICAgQWxpYXMgRFMuTW9kZWwncyBg
Y3JlYXRlYCBtZXRob2QgdG8gYF9jcmVhdGVgLiBUaGlzIGFsbG93cyB1cyB0byBjcmVhdGUgRFMu
TW9kZWwKLSAgICBpbnN0YW5jZXMgZnJvbSB3aXRoaW4gdGhlIHN0b3JlLCBidXQgaWYgZW5kIHVz
ZXJzIGFjY2lkZW50YWxseSBjYWxsIGBjcmVhdGUoKWAKLSAgICAoaW5zdGVhZCBvZiBgY3JlYXRl
UmVjb3JkKClgKSwgd2UgY2FuIHJhaXNlIGFuIGVycm9yLgotCi0gICAgQG1ldGhvZCBfY3JlYXRl
Ci0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0gICovCi0gIF9jcmVhdGU6IERTLk1vZGVsLmNy
ZWF0ZSwKLQotICAvKioKLSAgICBPdmVycmlkZSB0aGUgY2xhc3MnIGBjcmVhdGUoKWAgbWV0aG9k
IHRvIHJhaXNlIGFuIGVycm9yLiBUaGlzCi0gICAgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gaW5h
ZHZlcnRlbnRseSBjYWxsaW5nIGBjcmVhdGUoKWAgaW5zdGVhZAotICAgIG9mIGBjcmVhdGVSZWNv
cmQoKWAuIFRoZSBzdG9yZSBpcyBzdGlsbCBhYmxlIHRvIGNyZWF0ZSBpbnN0YW5jZXMKLSAgICBi
eSBjYWxsaW5nIHRoZSBgX2NyZWF0ZSgpYCBtZXRob2QuIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBv
ZiBhCi0gICAgYERTLk1vZGVsYCB1c2UgW3N0b3JlLmNyZWF0ZVJlY29yZF0oRFMuU3RvcmUuaHRt
bCNtZXRob2RfY3JlYXRlUmVjb3JkKS4KLQotICAgIEBtZXRob2QgY3JlYXRlCi0gICAgQHByaXZh
dGUKLSAgICBAc3RhdGljCi0gICovCi0gIGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCJZb3Ugc2hvdWxkIG5vdCBjYWxsIGBjcmVhdGVgIG9uIGEgbW9kZWwu
IEluc3RlYWQsIGNhbGwgYHN0b3JlLmNyZWF0ZVJlY29yZGAgd2l0aCB0aGUgYXR0cmlidXRlcyB5
b3Ugd291bGQgbGlrZSB0byBzZXQuIik7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVy
LmdldDsKLQotLyoqCi0gIEBjbGFzcyBNb2RlbAotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuTW9k
ZWwucmVvcGVuQ2xhc3MoewotICAvKioKLSAgICBBIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0
cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKLSAgICBkZXNjcmliZWQgYnkgRFMuYXR0
cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUKLSAgICBwcm9w
ZXJ0eS4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLQotICAgIEFwcC5QZXJz
b24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwK
LSAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICAgIGJpcnRoZGF5OiBhdHRyKCdk
YXRlJykKLSAgICB9KTsKLQotICAgIHZhciBhdHRyaWJ1dGVzID0gRW1iZXIuZ2V0KEFwcC5QZXJz
b24sICdhdHRyaWJ1dGVzJykKLQotICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbihuYW1l
LCBtZXRhKSB7Ci0gICAgICBjb25zb2xlLmxvZyhuYW1lLCBtZXRhKTsKLSAgICB9KTsKLQotICAg
IC8vIHByaW50czoKLSAgICAvLyBmaXJzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0
ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImZp
cnN0TmFtZSJ9Ci0gICAgLy8gbGFzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTog
dHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImxhc3RO
YW1lIn0KLSAgICAvLyBiaXJ0aGRheSB7dHlwZTogImRhdGUiLCBpc0F0dHJpYnV0ZTogdHJ1ZSwg
b3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImJpcnRoZGF5In0K
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVzCi0gICAgQHN0YXRpYwotICAgIEB0
eXBlIHtFbWJlci5NYXB9Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGF0dHJpYnV0ZXM6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7
Ci0KLSAgICB0aGlzLmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsK
LSAgICAgIGlmIChtZXRhLmlzQXR0cmlidXRlKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiWW91
IG1heSBub3Qgc2V0IGBpZGAgYXMgYW4gYXR0cmlidXRlIG9uIHlvdXIgbW9kZWwuIFBsZWFzZSBy
ZW1vdmUgYW55IGxpbmVzIHRoYXQgbG9vayBsaWtlOiBgaWQ6IERTLmF0dHIoJzx0eXBlPicpYCBm
cm9tICIgKyB0aGlzLnRvU3RyaW5nKCksIG5hbWUgIT09ICdpZCcpOwotCi0gICAgICAgIG1ldGEu
bmFtZSA9IG5hbWU7Ci0gICAgICAgIG1hcC5zZXQobmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0KLSAgICByZXR1cm4gbWFwOwotICB9KSwKLQotICAvKioKLSAgICBBIG1hcCB3aG9zZSBr
ZXlzIGFyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKLSAgICBkZXNj
cmliZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdHlwZSBvZiB0cmFuc2Zvcm1h
dGlvbgotICAgIGFwcGxpZWQgdG8gZWFjaCBhdHRyaWJ1dGUuIFRoaXMgbWFwIGRvZXMgbm90IGlu
Y2x1ZGUgYW55Ci0gICAgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0
aW9uIHR5cGUuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBl
cnNvbiA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6IGF0dHIoKSwKLSAgICAg
IGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICAgIGJpcnRoZGF5OiBhdHRyKCdkYXRlJykK
LSAgICB9KTsKLQotICAgIHZhciB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMgPSBFbWJlci5nZXQoQXBw
LlBlcnNvbiwgJ3RyYW5zZm9ybWVkQXR0cmlidXRlcycpCi0KLSAgICB0cmFuc2Zvcm1lZEF0dHJp
YnV0ZXMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgdHlwZSkgewotICAgICAgY29uc29sZS5sb2co
ZmllbGQsIHR5cGUpOwotICAgIH0pOwotCi0gICAgLy8gcHJpbnRzOgotICAgIC8vIGxhc3ROYW1l
IHN0cmluZwotICAgIC8vIGJpcnRoZGF5IGRhdGUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSB0
cmFuc2Zvcm1lZEF0dHJpYnV0ZXMKLSAgICBAc3RhdGljCi0gICAgQHR5cGUge0VtYmVyLk1hcH0K
LSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgdHJhbnNmb3JtZWRBdHRyaWJ1dGVzOiBFbWJlci5jb21w
dXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0g
ICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSwgbWV0YSkgewotICAgICAgaWYgKG1l
dGEudHlwZSkgewotICAgICAgICBtYXAuc2V0KGtleSwgbWV0YS50eXBlKTsKLSAgICAgIH0KLSAg
ICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0pLAotCi0gIC8qKgotICAgIEl0ZXJhdGVzIHRo
cm91Z2ggdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG1vZGVsLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVu
Y3Rpb24gb24gZWFjaAotICAgIGF0dHJpYnV0ZS4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAg
IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5j
dGlvbihuYW1lLCBtZXRhKTsKLSAgICBgYGAKLQotICAgIC0gYG5hbWVgIHRoZSBuYW1lIG9mIHRo
ZSBjdXJyZW50IHByb3BlcnR5IGluIHRoZSBpdGVyYXRpb24KLSAgICAtIGBtZXRhYCB0aGUgbWV0
YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgcHJvcGVydHkgaW4gdGhlIGl0ZXJhdGlvbgotCi0g
ICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNz
IGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlz
YCBvbiB0aGUgY29udGV4dC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIGZpcnN0TmFtZTogYXR0cign
c3RyaW5nJyksCi0gICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRh
eTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAgICBBcHAuUGVyc29uLmVhY2hBdHRyaWJ1dGUo
ZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgY29uc29sZS5sb2cobmFtZSwgbWV0YSk7Ci0g
ICAgfSk7Ci0KLSAgICAvLyBwcmludHM6Ci0gICAgLy8gZmlyc3ROYW1lIHt0eXBlOiAic3RyaW5n
IiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rp
b24sIG5hbWU6ICJmaXJzdE5hbWUifQotICAgIC8vIGxhc3ROYW1lIHt0eXBlOiAic3RyaW5nIiwg
aXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24s
IG5hbWU6ICJsYXN0TmFtZSJ9Ci0gICAgLy8gYmlydGhkYXkge3R5cGU6ICJkYXRlIiwgaXNBdHRy
aWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24sIG5hbWU6
ICJiaXJ0aGRheSJ9Ci0gICBgYGAKLQotICAgIEBtZXRob2QgZWFjaEF0dHJpYnV0ZQotICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEBzdGF0
aWMKLSAgKi8KLSAgZWFjaEF0dHJpYnV0ZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsK
LSAgICBnZXQodGhpcywgJ2F0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIG1ldGEp
IHsKLSAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgbWV0YSk7Ci0gICAgfSwgYmlu
ZGluZyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdHJhbnNmb3Jt
ZWRBdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCwgY2FsbGluZwotICAgIHRoZSBwYXNzZWQgZnVuY3Rp
b24gb24gZWFjaCBhdHRyaWJ1dGUuIE5vdGUgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlCi0gICAg
Y2FsbGVkIGZvciBhbnkgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0
aW9uIHR5cGUuCi0KLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRp
b25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24obmFtZSwgdHlwZSk7Ci0g
ICAgYGBgCi0KLSAgICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBp
biB0aGUgaXRlcmF0aW9uCi0gICAgLSBgdHlwZWAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFt
ZSBvZiB0aGUgdHlwZSBvZiB0cmFuc2Zvcm1lZAotICAgICAgYXBwbGllZCB0byB0aGUgYXR0cmli
dXRlCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1l
OiBhdHRyKCksCi0gICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRh
eTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAgICBBcHAuUGVyc29uLmVhY2hUcmFuc2Zvcm1l
ZEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lLCB0eXBlKSB7Ci0gICAgICBjb25zb2xlLmxvZyhuYW1l
LCB0eXBlKTsKLSAgICB9KTsKLQotICAgIC8vIHByaW50czoKLSAgICAvLyBsYXN0TmFtZSBzdHJp
bmcKLSAgICAvLyBiaXJ0aGRheSBkYXRlCi0gICBgYGAKLQotICAgIEBtZXRob2QgZWFjaFRyYW5z
Zm9ybWVkQXR0cmlidXRlCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxi
YWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBv
YmplY3QgdG8gdXNlCi0gICAgQHN0YXRpYwotICAqLwotICBlYWNoVHJhbnNmb3JtZWRBdHRyaWJ1
dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgZ2V0KHRoaXMsICd0cmFuc2Zv
cm1lZEF0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKLSAgICAgIGNh
bGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgdHlwZSk7Ci0gICAgfSk7Ci0gIH0KLX0pOwotCi0K
LURTLk1vZGVsLnJlb3Blbih7Ci0gIGVhY2hBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBi
aW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoQXR0cmlidXRlKGNhbGxiYWNrLCBi
aW5kaW5nKTsKLSAgfQotfSk7Ci0KLWZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShyZWNvcmQsIG9w
dGlvbnMsIGtleSkgewotICBpZiAodHlwZW9mIG9wdGlvbnMuZGVmYXVsdFZhbHVlID09PSAiZnVu
Y3Rpb24iKSB7Ci0gICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlKCk7Ci0gIH0gZWxzZSB7
Ci0gICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGhh
c1ZhbHVlKHJlY29yZCwga2V5KSB7Ci0gIHJldHVybiByZWNvcmQuX2F0dHJpYnV0ZXMuaGFzT3du
UHJvcGVydHkoa2V5KSB8fAotICAgICAgICAgcmVjb3JkLl9pbkZsaWdodEF0dHJpYnV0ZXMuaGFz
T3duUHJvcGVydHkoa2V5KSB8fAotICAgICAgICAgcmVjb3JkLl9kYXRhLmhhc093blByb3BlcnR5
KGtleSk7Ci19Ci0KLWZ1bmN0aW9uIGdldFZhbHVlKHJlY29yZCwga2V5KSB7Ci0gIGlmIChyZWNv
cmQuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAgIHJldHVybiByZWNvcmQu
X2F0dHJpYnV0ZXNba2V5XTsKLSAgfSBlbHNlIGlmIChyZWNvcmQuX2luRmxpZ2h0QXR0cmlidXRl
cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgcmV0dXJuIHJlY29yZC5faW5GbGlnaHRBdHRy
aWJ1dGVzW2tleV07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlY29yZC5fZGF0YVtrZXldOwot
ICB9Ci19Ci0KLS8qKgotICBgRFMuYXR0cmAgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgb24gYSBbRFMu
TW9kZWxdKERTLk1vZGVsLmh0bWwpLgotICBCeSBkZWZhdWx0LCBhdHRyaWJ1dGVzIGFyZSBwYXNz
ZWQgdGhyb3VnaCBhcy1pcywgaG93ZXZlciB5b3UgY2FuIHNwZWNpZnkgYW4KLSAgb3B0aW9uYWwg
dHlwZSB0byBoYXZlIHRoZSB2YWx1ZSBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkLgotICBFbWJl
ciBEYXRhIHNoaXBzIHdpdGggZm91ciBiYXNpYyB0cmFuc2Zvcm0gdHlwZXM6IGBzdHJpbmdgLCBg
bnVtYmVyYCwKLSAgYGJvb2xlYW5gIGFuZCBgZGF0ZWAuIFlvdSBjYW4gZGVmaW5lIHlvdXIgb3du
IHRyYW5zZm9ybXMgYnkgc3ViY2xhc3NpbmcKLSAgW0RTLlRyYW5zZm9ybV0oRFMuVHJhbnNmb3Jt
Lmh0bWwpLgotCi0gIGBEUy5hdHRyYCB0YWtlcyBhbiBvcHRpb25hbCBoYXNoIGFzIGEgc2Vjb25k
IHBhcmFtZXRlciwgY3VycmVudGx5Ci0gIHN1cHBvcnRlZCBvcHRpb25zIGFyZToKLQotICAtIGBk
ZWZhdWx0VmFsdWVgOiBQYXNzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRv
IHNldCB0aGUgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIHRvIGEgZGVmYXVsdCB2YWx1
ZSBpZiBub25lIGlzIHN1cHBsaWVkLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IHZhciBhdHRyID0gRFMuYXR0cjsKLQotICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgdXNlcm5hbWU6IGF0dHIoJ3N0cmluZycpLAotICAgIGVtYWlsOiBhdHRyKCdzdHJpbmcnKSwK
LSAgICB2ZXJpZmllZDogYXR0cignYm9vbGVhbicsIHtkZWZhdWx0VmFsdWU6IGZhbHNlfSkKLSAg
fSk7Ci0gIGBgYAotCi0gIEBuYW1lc3BhY2UKLSAgQG1ldGhvZCBhdHRyCi0gIEBmb3IgRFMKLSAg
QHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIGF0dHJpYnV0ZSB0eXBlCi0gIEBwYXJhbSB7T2JqZWN0
fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCi0gIEByZXR1cm4ge0F0dHJpYnV0ZX0KLSovCi0K
LURTLmF0dHIgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25z
IHx8IHt9OwotCi0gIHZhciBtZXRhID0gewotICAgIHR5cGU6IHR5cGUsCi0gICAgaXNBdHRyaWJ1
dGU6IHRydWUsCi0gICAgb3B0aW9uczogb3B0aW9ucwotICB9OwotCi0gIHJldHVybiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PiAxKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkgbm90IHNldCBgaWRgIGFzIGFuIGF0
dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2UgcmVtb3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sg
bGlrZTogYGlkOiBEUy5hdHRyKCc8dHlwZT4nKWAgZnJvbSAiICsgdGhpcy5jb25zdHJ1Y3Rvci50
b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOwotICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fYXR0
cmlidXRlc1trZXldIHx8IHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlc1trZXldIHx8IHRoaXMuX2Rh
dGFba2V5XTsKLQotICAgICAgdGhpcy5zZW5kKCdkaWRTZXRQcm9wZXJ0eScsIHsKLSAgICAgICAg
bmFtZToga2V5LAotICAgICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsCi0gICAgICAgIG9yaWdpbmFs
VmFsdWU6IHRoaXMuX2RhdGFba2V5XSwKLSAgICAgICAgdmFsdWU6IHZhbHVlCi0gICAgICB9KTsK
LQotICAgICAgdGhpcy5fYXR0cmlidXRlc1trZXldID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdmFs
dWU7Ci0gICAgfSBlbHNlIGlmIChoYXNWYWx1ZSh0aGlzLCBrZXkpKSB7Ci0gICAgICByZXR1cm4g
Z2V0VmFsdWUodGhpcywga2V5KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldERlZmF1
bHRWYWx1ZSh0aGlzLCBvcHRpb25zLCBrZXkpOwotICAgIH0KLQotICAvLyBgZGF0YWAgaXMgbmV2
ZXIgc2V0IGRpcmVjdGx5LiBIb3dldmVyLCBpdCBtYXkgYmUKLSAgLy8gaW52YWxpZGF0ZWQgZnJv
bSB0aGUgc3RhdGUgbWFuYWdlcidzIHNldERhdGEKLSAgLy8gZXZlbnQuCi0gIH0pLnByb3BlcnR5
KCdkYXRhJykubWV0YShtZXRhKTsKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi0vKioKLSAgQW4gQXR0cmlidXRl
Q2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHdoZW5ldmVyIGEgcmVjb3JkJ3MKLSAgYXR0cmlidXRl
IGNoYW5nZXMgdmFsdWUuIEl0IGlzIHVzZWQgdG8gdHJhY2sgY2hhbmdlcyB0byBhCi0gIHJlY29y
ZCBiZXR3ZWVuIHRyYW5zYWN0aW9uIGNvbW1pdHMuCi0KLSAgQGNsYXNzIEF0dHJpYnV0ZUNoYW5n
ZQotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRlCi0gIEBjb25zdHJ1Y3RvcgotKi8KLXZhciBB
dHRyaWJ1dGVDaGFuZ2UgPSBEUy5BdHRyaWJ1dGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7
Ci0gIHRoaXMucmVjb3JkID0gb3B0aW9ucy5yZWNvcmQ7Ci0gIHRoaXMuc3RvcmUgPSBvcHRpb25z
LnN0b3JlOwotICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7Ci0gIHRoaXMudmFsdWUgPSBvcHRp
b25zLnZhbHVlOwotICB0aGlzLm9sZFZhbHVlID0gb3B0aW9ucy5vbGRWYWx1ZTsKLX07Ci0KLUF0
dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHJldHVy
biBuZXcgQXR0cmlidXRlQ2hhbmdlKG9wdGlvbnMpOwotfTsKLQotQXR0cmlidXRlQ2hhbmdlLnBy
b3RvdHlwZSA9IHsKLSAgc3luYzogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMudmFsdWUgIT09
IHRoaXMub2xkVmFsdWUpIHsKLSAgICAgIHRoaXMucmVjb3JkLnNlbmQoJ2JlY29tZURpcnR5Jyk7
Ci0gICAgICB0aGlzLnJlY29yZC51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICAgIH0KLQot
ICAgIC8vIFRPRE86IFVzZSB0aGlzIG9iamVjdCBpbiB0aGUgY29tbWl0IHByb2Nlc3MKLSAgICB0
aGlzLmRlc3Ryb3koKTsKLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGUgQXR0cmlidXRlQ2hhbmdl
IGlzIGRlc3Ryb3llZCAoZWl0aGVyIGJ5IGJlaW5nIHJvbGxlZCBiYWNrCi0gICAgb3IgYmVpbmcg
Y29tbWl0dGVkKSwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgcGVuZGluZyBjaGFuZ2VzCi0g
ICAgb24gdGhlIHJlY29yZC4KLQotICAgIEBtZXRob2QgZGVzdHJveQotICAqLwotICBkZXN0cm95
OiBmdW5jdGlvbigpIHsKLSAgICBkZWxldGUgdGhpcy5yZWNvcmQuX2NoYW5nZXNUb1N5bmNbdGhp
cy5uYW1lXTsKLSAgfQotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBA
bW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci0KLS8q
KgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlCi0gIEBuYW1lc3BhY2UgRFMKLSAgQHByaXZh
dGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlID0gZnVuY3Rpb24o
b3B0aW9ucykgewotICB0aGlzLnBhcmVudFJlY29yZCA9IG9wdGlvbnMucGFyZW50UmVjb3JkOwot
ICB0aGlzLmNoaWxkUmVjb3JkID0gb3B0aW9ucy5jaGlsZFJlY29yZDsKLSAgdGhpcy5maXJzdFJl
Y29yZCA9IG9wdGlvbnMuZmlyc3RSZWNvcmQ7Ci0gIHRoaXMuZmlyc3RSZWNvcmRLaW5kID0gb3B0
aW9ucy5maXJzdFJlY29yZEtpbmQ7Ci0gIHRoaXMuZmlyc3RSZWNvcmROYW1lID0gb3B0aW9ucy5m
aXJzdFJlY29yZE5hbWU7Ci0gIHRoaXMuc2Vjb25kUmVjb3JkID0gb3B0aW9ucy5zZWNvbmRSZWNv
cmQ7Ci0gIHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9IG9wdGlvbnMuc2Vjb25kUmVjb3JkS2luZDsK
LSAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gb3B0aW9ucy5zZWNvbmRSZWNvcmROYW1lOwotICB0
aGlzLmNoYW5nZVR5cGUgPSBvcHRpb25zLmNoYW5nZVR5cGU7Ci0gIHRoaXMuc3RvcmUgPSBvcHRp
b25zLnN0b3JlOwotCi0gIHRoaXMuY29tbWl0dGVkID0ge307Ci19OwotCi0vKioKLSAgQGNsYXNz
IFJlbGF0aW9uc2hpcENoYW5nZUFkZAotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRlCi0gIEBj
b25zdHJ1Y3RvcgotKi8KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFkZCA9IGZ1bmN0aW9uKG9wdGlv
bnMpewotICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY2FsbCh0aGlzLCBvcHRpb25zKTsKLX07Ci0K
LS8qKgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlCi0gIEBuYW1lc3BhY2UgRFMK
LSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVt
b3ZlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIERTLlJlbGF0aW9uc2hpcENoYW5nZS5jYWxsKHRo
aXMsIG9wdGlvbnMpOwotfTsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZSA9IGZ1bmN0
aW9uKG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBEUy5SZWxhdGlvbnNoaXBDaGFuZ2Uob3B0aW9u
cyk7Ci19OwotCi1EUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlID0gZnVuY3Rpb24ob3B0
aW9ucykgewotICByZXR1cm4gbmV3IERTLlJlbGF0aW9uc2hpcENoYW5nZUFkZChvcHRpb25zKTsK
LX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRp
b25zKSB7Ci0gIHJldHVybiBuZXcgRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlKG9wdGlvbnMp
OwotfTsKLQotRFMuT25lVG9NYW55Q2hhbmdlID0ge307Ci1EUy5PbmVUb05vbmVDaGFuZ2UgPSB7
fTsKLURTLk1hbnlUb05vbmVDaGFuZ2UgPSB7fTsKLURTLk9uZVRvT25lQ2hhbmdlID0ge307Ci1E
Uy5NYW55VG9NYW55Q2hhbmdlID0ge307Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRl
Q2hhbmdlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0g
ImFkZCIpewotICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlKG9wdGlv
bnMpOwotICB9Ci0gIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gInJlbW92ZSIpewotICAgIHJl
dHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmUuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci19
OwotCi0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlID0g
ZnVuY3Rpb24ocmVjb3JkVHlwZSwga25vd25TaWRlKXsKLSAgdmFyIGtub3duS2V5ID0ga25vd25T
aWRlLmtleSwga2V5LCBvdGhlcktpbmQ7Ci0gIHZhciBrbm93bktpbmQgPSBrbm93blNpZGUua2lu
ZDsKLQotICB2YXIgaW52ZXJzZSA9IHJlY29yZFR5cGUuaW52ZXJzZUZvcihrbm93bktleSk7Ci0K
LSAgaWYgKGludmVyc2UpewotICAgIGtleSA9IGludmVyc2UubmFtZTsKLSAgICBvdGhlcktpbmQg
PSBpbnZlcnNlLmtpbmQ7Ci0gIH0KLQotICBpZiAoIWludmVyc2UpewotICAgIHJldHVybiBrbm93
bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvTm9uZSIgOiAibWFueVRvTm9uZSI7Ci0gIH0K
LSAgZWxzZXsKLSAgICBpZihvdGhlcktpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIHJldHVy
biBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvT25lIiA6ICJtYW55VG9PbmUiOwot
ICAgIH0KLSAgICBlbHNlewotICAgICAgcmV0dXJuIGtub3duS2luZCA9PT0gImJlbG9uZ3NUbyIg
PyAib25lVG9NYW55IiA6ICJtYW55VG9NYW55IjsKLSAgICB9Ci0gIH0KLQotfTsKLQotRFMuUmVs
YXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGZpcnN0UmVjb3JkLCBzZWNv
bmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKXsKLSAgLy8gR2V0IHRoZSB0eXBlIG9mIHRoZSBjaGls
ZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKLSAgdmFyIGZpcnN0UmVjb3JkVHlwZSA9
IGZpcnN0UmVjb3JkLmNvbnN0cnVjdG9yLCBjaGFuZ2VUeXBlOwotICBjaGFuZ2VUeXBlID0gRFMu
UmVsYXRpb25zaGlwQ2hhbmdlLmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUoZmlyc3RSZWNvcmRU
eXBlLCBvcHRpb25zKTsKLSAgaWYgKGNoYW5nZVR5cGUgPT09ICJvbmVUb01hbnkiKXsKLSAgICBy
ZXR1cm4gRFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25k
UmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7Ci0gIH0KLSAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0g
Im1hbnlUb09uZSIpewotICAgIHJldHVybiBEUy5PbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdl
KHNlY29uZFJlY29yZCwgZmlyc3RSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNl
IGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9Ob25lIil7Ci0gICAgcmV0dXJuIERTLk9uZVRvTm9u
ZUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmQsIHNlY29uZFJlY29yZCwgc3RvcmUsIG9w
dGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJtYW55VG9Ob25lIil7Ci0g
ICAgcmV0dXJuIERTLk1hbnlUb05vbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBz
ZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNlIGlmIChjaGFuZ2VUeXBl
ID09PSAib25lVG9PbmUiKXsKLSAgICByZXR1cm4gRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hh
bmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBl
bHNlIGlmIChjaGFuZ2VUeXBlID09PSAibWFueVRvTWFueSIpewotICAgIHJldHVybiBEUy5NYW55
VG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25kUmVjb3JkLCBzdG9y
ZSwgb3B0aW9ucyk7Ci0gIH0KLX07Ci0KLURTLk9uZVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2Ug
PSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50UmVjb3JkLCBzdG9yZSwgb3B0aW9ucykgewot
ICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7Ci0gIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBD
aGFuZ2UuX2NyZWF0ZUNoYW5nZSh7Ci0gICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwK
LSAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkOiBjaGls
ZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMu
Y2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0UmVjb3JkTmFtZToga2V5LAotICAgICAgZmlyc3RSZWNv
cmRLaW5kOiAiYmVsb25nc1RvIgotICB9KTsKLQotICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFu
Z2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBudWxsLCBjaGFuZ2UpOwotCi0g
IHJldHVybiBjaGFuZ2U7Ci19OwotCi1EUy5NYW55VG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9
IGZ1bmN0aW9uKGNoaWxkUmVjb3JkLCBwYXJlbnRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKSB7Ci0g
IHZhciBrZXkgPSBvcHRpb25zLmtleTsKLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENo
YW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBhcmVudFJlY29yZDogY2hpbGRSZWNvcmQsCi0g
ICAgICBjaGlsZFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgc2Vjb25kUmVjb3JkOiBjaGls
ZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMu
Y2hhbmdlVHlwZSwKLSAgICAgIHNlY29uZFJlY29yZE5hbWU6IG9wdGlvbnMua2V5LAotICAgICAg
c2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiCi0gIH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9u
c2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5n
ZSk7Ci0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi0KLURTLk1hbnlUb01hbnlDaGFuZ2UuY3JlYXRl
Q2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlv
bnMpIHsKLSAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRlIG9mIHRoZSByZWxh
dGlvbnNoaXAgaXMgc3BlY2lmaWVkLAotICAvLyB1c2UgdGhhdAotICAvLyBJZiB0aGUgdHlwZSBv
ZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBvbiB0aGUgY2hpbGQncyB0eXBl
Ci0gIC8vIGRlZmluaXRpb24uCi0gIHZhciBrZXkgPSBvcHRpb25zLmtleTsKLQotICB2YXIgY2hh
bmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoewotICAgICAgcGFyZW50
UmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBjaGlsZFJlY29yZDogY2hpbGRSZWNvcmQsCi0g
ICAgICBmaXJzdFJlY29yZDogY2hpbGRSZWNvcmQsCi0gICAgICBzZWNvbmRSZWNvcmQ6IHBhcmVu
dFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkS2luZDogImhhc01hbnkiLAotICAgICAgc2Vjb25k
UmVjb3JkS2luZDogImhhc01hbnkiLAotICAgICAgc3RvcmU6IHN0b3JlLAotICAgICAgY2hhbmdl
VHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAotICAgICAgZmlyc3RSZWNvcmROYW1lOiAga2V5Ci0g
IH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5
LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7Ci0KLQotICByZXR1cm4gY2hhbmdlOwotfTsK
LQotRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQs
IHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKLSAgdmFyIGtleTsKLQotICAvLyBJZiB0
aGUgbmFtZSBvZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVj
aWZpZWQsCi0gIC8vIHVzZSB0aGF0Ci0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMg
c3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKLSAgLy8gZGVmaW5pdGlv
bi4KLSAgaWYgKG9wdGlvbnMucGFyZW50VHlwZSkgewotICAgIGtleSA9IG9wdGlvbnMucGFyZW50
VHlwZS5pbnZlcnNlRm9yKG9wdGlvbnMua2V5KS5uYW1lOwotICB9IGVsc2UgaWYgKG9wdGlvbnMu
a2V5KSB7Ci0gICAga2V5ID0gb3B0aW9ucy5rZXk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHBhcmVudFR5cGUgb3IgYmVsb25nc1RvTmFtZSBv
cHRpb24gdG8gT25lVG9NYW55Q2hhbmdlLmZvckNoaWxkQW5kUGFyZW50IiwgZmFsc2UpOwotICB9
Ci0KLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsK
LSAgICAgIHBhcmVudFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgY2hpbGRSZWNvcmQ6IGNo
aWxkUmVjb3JkLAotICAgICAgZmlyc3RSZWNvcmQ6IGNoaWxkUmVjb3JkLAotICAgICAgc2Vjb25k
UmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBmaXJzdFJlY29yZEtpbmQ6ICJiZWxvbmdzVG8i
LAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImJlbG9uZ3NUbyIsCi0gICAgICBzdG9yZTogc3Rv
cmUsCi0gICAgICBjaGFuZ2VUeXBlOiBvcHRpb25zLmNoYW5nZVR5cGUsCi0gICAgICBmaXJzdFJl
Y29yZE5hbWU6ICBrZXkKLSAgfSk7Ci0KLSAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9y
KGNoaWxkUmVjb3JkLCBrZXksIHBhcmVudFJlY29yZCwgbnVsbCwgY2hhbmdlKTsKLQotCi0gIHJl
dHVybiBjaGFuZ2U7Ci19OwotCi1EUy5PbmVUb09uZUNoYW5nZS5tYWludGFpbkludmFyaWFudCA9
IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlY29yZCwga2V5KXsKLSAgaWYgKG9wdGlv
bnMuY2hhbmdlVHlwZSA9PT0gImFkZCIgJiYgc3RvcmUucmVjb3JkSXNNYXRlcmlhbGl6ZWQoY2hp
bGRSZWNvcmQpKSB7Ci0gICAgdmFyIG9sZFBhcmVudCA9IGdldChjaGlsZFJlY29yZCwga2V5KTsK
LSAgICBpZiAob2xkUGFyZW50KXsKLSAgICAgIHZhciBjb3JyZXNwb25kaW5nQ2hhbmdlID0gRFMu
T25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNoaWxkUmVjb3JkLCBvbGRQYXJlbnQsIHN0b3Jl
LCB7Ci0gICAgICAgICAgcGFyZW50VHlwZTogb3B0aW9ucy5wYXJlbnRUeXBlLAotICAgICAgICAg
IGhhc01hbnlOYW1lOiBvcHRpb25zLmhhc01hbnlOYW1lLAotICAgICAgICAgIGNoYW5nZVR5cGU6
ICJyZW1vdmUiLAotICAgICAgICAgIGtleTogb3B0aW9ucy5rZXkKLSAgICAgICAgfSk7Ci0gICAg
ICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgb3B0aW9u
cy5wYXJlbnRSZWNvcmQgLCBudWxsLCBjb3JyZXNwb25kaW5nQ2hhbmdlKTsKLSAgICAgY29ycmVz
cG9uZGluZ0NoYW5nZS5zeW5jKCk7Ci0gICAgfQotICB9Ci19OwotCi1EUy5PbmVUb01hbnlDaGFu
Z2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3Rv
cmUsIG9wdGlvbnMpIHsKLSAgdmFyIGtleTsKLQotICAvLyBJZiB0aGUgbmFtZSBvZiB0aGUgYmVs
b25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVjaWZpZWQsCi0gIC8vIHVzZSB0
aGF0Ci0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0
IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKLSAgLy8gZGVmaW5pdGlvbi4KLSAgaWYgKG9wdGlvbnMu
cGFyZW50VHlwZSkgewotICAgIGtleSA9IG9wdGlvbnMucGFyZW50VHlwZS5pbnZlcnNlRm9yKG9w
dGlvbnMua2V5KS5uYW1lOwotICAgIERTLk9uZVRvTWFueUNoYW5nZS5tYWludGFpbkludmFyaWFu
dCggb3B0aW9ucywgc3RvcmUsIGNoaWxkUmVjb3JkLCBrZXkgKTsKLSAgfSBlbHNlIGlmIChvcHRp
b25zLmtleSkgewotICAgIGtleSA9IG9wdGlvbnMua2V5OwotICB9IGVsc2UgewotICAgIEVtYmVy
LmFzc2VydCgiWW91IG11c3QgcGFzcyBlaXRoZXIgYSBwYXJlbnRUeXBlIG9yIGJlbG9uZ3NUb05h
bWUgb3B0aW9uIHRvIE9uZVRvTWFueUNoYW5nZS5mb3JDaGlsZEFuZFBhcmVudCIsIGZhbHNlKTsK
LSAgfQotCi0gIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5n
ZSh7Ci0gICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwKLSAgICAgIGNoaWxkUmVjb3Jk
OiBjaGlsZFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIHNl
Y29uZFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVsb25n
c1RvIiwKLSAgICAgIHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKLSAgICAgIHN0b3JlOiBz
dG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0
UmVjb3JkTmFtZTogIGtleQotICB9KTsKLQotICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VG
b3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBjaGFuZ2UuZ2V0U2Vjb25kUmVjb3Jk
TmFtZSgpLCBjaGFuZ2UpOwotCi0KLSAgcmV0dXJuIGNoYW5nZTsKLX07Ci0KLQotRFMuT25lVG9N
YW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50ID0gZnVuY3Rpb24ob3B0aW9ucywgc3RvcmUsIGNo
aWxkUmVjb3JkLCBrZXkpewotICBpZiAob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAiYWRkIiAmJiBj
aGlsZFJlY29yZCkgewotICAgIHZhciBvbGRQYXJlbnQgPSBnZXQoY2hpbGRSZWNvcmQsIGtleSk7
Ci0gICAgaWYgKG9sZFBhcmVudCl7Ci0gICAgICB2YXIgY29ycmVzcG9uZGluZ0NoYW5nZSA9IERT
Lk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWNvcmQsIG9sZFBhcmVudCwgc3Rv
cmUsIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBvcHRpb25zLnBhcmVudFR5cGUsCi0gICAgICAg
ICAgaGFzTWFueU5hbWU6IG9wdGlvbnMuaGFzTWFueU5hbWUsCi0gICAgICAgICAgY2hhbmdlVHlw
ZTogInJlbW92ZSIsCi0gICAgICAgICAga2V5OiBvcHRpb25zLmtleQotICAgICAgICB9KTsKLSAg
ICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBvcHRp
b25zLnBhcmVudFJlY29yZCwgY29ycmVzcG9uZGluZ0NoYW5nZS5nZXRTZWNvbmRSZWNvcmROYW1l
KCksIGNvcnJlc3BvbmRpbmdDaGFuZ2UpOwotICAgICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5j
KCk7Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZQot
ICBAbmFtZXNwYWNlIERTCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlLnByb3RvdHlwZSA9IHsK
LQotICBnZXRTZWNvbmRSZWNvcmROYW1lOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZSA9IHRo
aXMuc2Vjb25kUmVjb3JkTmFtZSwgcGFyZW50OwotCi0gICAgaWYgKCFuYW1lKSB7Ci0gICAgICBw
YXJlbnQgPSB0aGlzLnNlY29uZFJlY29yZDsKLSAgICAgIGlmICghcGFyZW50KSB7IHJldHVybjsg
fQotCi0gICAgICB2YXIgY2hpbGRUeXBlID0gdGhpcy5maXJzdFJlY29yZC5jb25zdHJ1Y3RvcjsK
LSAgICAgIHZhciBpbnZlcnNlID0gY2hpbGRUeXBlLmludmVyc2VGb3IodGhpcy5maXJzdFJlY29y
ZE5hbWUpOwotICAgICAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gaW52ZXJzZS5uYW1lOwotICAg
IH0KLQotICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZE5hbWU7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgR2V0IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgb24gdGhlIGJlbG9uZ3NUbyBzaWRl
LgotCi0gICAgQG1ldGhvZCBnZXRGaXJzdFJlY29yZE5hbWUKLSAgICBAcmV0dXJuIHtTdHJpbmd9
Ci0gICovCi0gIGdldEZpcnN0UmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWUg
PSB0aGlzLmZpcnN0UmVjb3JkTmFtZTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfSwKLQotICAvKioK
LSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICBAcHJpdmF0ZQotICAqLwotICBkZXN0cm95OiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgY2hpbGRSZWNvcmQgPSB0aGlzLmNoaWxkUmVjb3JkLAotICAgICAg
ICBiZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwKLSAgICAgICAgaGFz
TWFueU5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKLSAgICAgICAgc3RvcmUgPSB0
aGlzLnN0b3JlOwotCi0gICAgc3RvcmUucmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxk
UmVjb3JkLCBiZWxvbmdzVG9OYW1lLCB0aGlzLnBhcmVudFJlY29yZCwgaGFzTWFueU5hbWUsIHRo
aXMuY2hhbmdlVHlwZSk7Ci0gIH0sCi0KLSAgZ2V0U2Vjb25kUmVjb3JkOiBmdW5jdGlvbigpewot
ICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IGdldEZpcnN0UmVjb3JkCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgZ2V0Rmlyc3RSZWNvcmQ6IGZ1
bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmZpcnN0UmVjb3JkOwotICB9LAotCi0gIGNvYWxl
c2NlOiBmdW5jdGlvbigpewotICAgIHZhciByZWxhdGlvbnNoaXBQYWlycyA9IHRoaXMuc3RvcmUu
cmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IodGhpcy5maXJzdFJlY29yZCk7Ci0gICAgZm9yRWFj
aChyZWxhdGlvbnNoaXBQYWlycywgZnVuY3Rpb24ocGFpcil7Ci0gICAgICB2YXIgYWRkZWRDaGFu
Z2UgPSBwYWlyWyJhZGQiXTsKLSAgICAgIHZhciByZW1vdmVkQ2hhbmdlID0gcGFpclsicmVtb3Zl
Il07Ci0gICAgICBpZihhZGRlZENoYW5nZSAmJiByZW1vdmVkQ2hhbmdlKSB7Ci0gICAgICAgIGFk
ZGVkQ2hhbmdlLmRlc3Ryb3koKTsKLSAgICAgICAgcmVtb3ZlZENoYW5nZS5kZXN0cm95KCk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFkZC5wcm90
b3R5cGUgPSBFbWJlci5jcmVhdGUoRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZSh7fSkpOwot
RFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShEUy5S
ZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7Ci0KLS8vIHRoZSBvYmplY3QgaXMgYSB2YWx1
ZSwgYW5kIG5vdCBhIHByb21pc2UKLWZ1bmN0aW9uIGlzVmFsdWUob2JqZWN0KSB7Ci0gIHJldHVy
biB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiAoIW9iamVjdC50aGVuIHx8IHR5cGVvZiBv
YmplY3QudGhlbiAhPT0gJ2Z1bmN0aW9uJyk7Ci19Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFk
ZC5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJhZGQiOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRk
LnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzZWNvbmRSZWNvcmROYW1lID0g
dGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlz
LmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0
UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwot
Ci0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlO
YW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVu
dCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lm
eSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NU
b05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiAr
IGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQg
bm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChu
ZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0
b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgaWYgKHNlY29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1v
ZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsKLSAgICBpZih0aGlzLnNl
Y29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIHNlY29uZFJlY29yZC5zdXNw
ZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7Ci0gICAgICAgIHNldChzZWNvbmRS
ZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIGZpcnN0UmVjb3JkKTsKLSAgICAgIH0pOwotCi0gICAg
IH0KLSAgICAgZWxzZSBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJoYXNNYW55Iil7Ci0g
ICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigp
ewotICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVj
b3JkTmFtZSk7Ci0gICAgICAgIGlmIChpc1ZhbHVlKHJlbGF0aW9uc2hpcCkpIHsgcmVsYXRpb25z
aGlwLmFkZE9iamVjdChmaXJzdFJlY29yZCk7IH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0g
IGlmIChmaXJzdFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIHNlY29uZFJlY29yZCBpbnN0
YW5jZW9mIERTLk1vZGVsICYmIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKSAhPT0g
c2Vjb25kUmVjb3JkKSB7Ci0gICAgaWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdz
VG8iKXsKLSAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVu
Y3Rpb24oKXsKLSAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUsIHNlY29u
ZFJlY29yZCk7Ci0gICAgICB9KTsKLSAgICB9Ci0gICAgZWxzZSBpZih0aGlzLmZpcnN0UmVjb3Jk
S2luZCA9PT0gImhhc01hbnkiKXsKLSAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNo
aXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChm
aXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKTsKLSAgICAgICAgaWYgKGlzVmFsdWUocmVsYXRp
b25zaGlwKSkgeyByZWxhdGlvbnNoaXAuYWRkT2JqZWN0KHNlY29uZFJlY29yZCk7IH0KLSAgICAg
IH0pOwotICAgIH0KLSAgfQotCi0gIHRoaXMuY29hbGVzY2UoKTsKLX07Ci0KLURTLlJlbGF0aW9u
c2hpcENoYW5nZVJlbW92ZS5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJyZW1vdmUiOwotRFMuUmVs
YXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZh
ciBzZWNvbmRSZWNvcmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBm
aXJzdFJlY29yZE5hbWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RS
ZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlz
LmdldFNlY29uZFJlY29yZCgpOwotCi0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEg
aGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAo
bmV3UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSAr
ICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQu
Y29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNp
ZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29u
c3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIg
KyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBh
cmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgaWYgKHNlY29uZFJl
Y29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9k
ZWwpIHsKLSAgICBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAg
ICAgIHNlY29uZFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7
Ci0gICAgICAgIHNldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIG51bGwpOwotICAg
ICAgfSk7Ci0gICAgfQotICAgIGVsc2UgaWYodGhpcy5zZWNvbmRSZWNvcmRLaW5kID09PSAiaGFz
TWFueSIpewotICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMo
ZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChzZWNvbmRSZWNvcmQs
IHNlY29uZFJlY29yZE5hbWUpOwotICAgICAgICBpZiAoaXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7
IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3QoZmlyc3RSZWNvcmQpOyB9Ci0gICAgICB9KTsKLSAg
ICB9Ci0gIH0KLQotICBpZiAoZmlyc3RSZWNvcmQgaW5zdGFuY2VvZiBEUy5Nb2RlbCAmJiBnZXQo
Zmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSkpIHsKLSAgICBpZih0aGlzLmZpcnN0UmVjb3Jk
S2luZCA9PT0gImJlbG9uZ3NUbyIpewotICAgICAgZmlyc3RSZWNvcmQuc3VzcGVuZFJlbGF0aW9u
c2hpcE9ic2VydmVycyhmdW5jdGlvbigpewotICAgICAgICBzZXQoZmlyc3RSZWNvcmQsIGZpcnN0
UmVjb3JkTmFtZSwgbnVsbCk7Ci0gICAgICB9KTsKLSAgICAgfQotICAgICBlbHNlIGlmKHRoaXMu
Zmlyc3RSZWNvcmRLaW5kID09PSAiaGFzTWFueSIpewotICAgICAgIGZpcnN0UmVjb3JkLnN1c3Bl
bmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgIHZhciByZWxhdGlv
bnNoaXAgPSBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSk7Ci0gICAgICAgICBpZiAo
aXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3Qoc2Vjb25k
UmVjb3JkKTsgfQotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAgdGhpcy5jb2FsZXNjZSgpOwot
fTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRh
dGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsCi0gICAgaXNOb25lID0gRW1iZXIuaXNOb25lOwotCi0vKioKLSAg
QG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi1mdW5jdGlvbiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBv
cHRpb25zLCBtZXRhKSB7Ci0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZh
bHVlKSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKLSAgICAgICAgc3RvcmUg
PSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAgIHByb21pc2VMYWJlbCA9ICJEUzogQXN5bmMg
YmVsb25nc1RvICIgKyB0aGlzICsgIiA6ICIgKyBrZXk7Ci0KLSAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA9PT0gMikgewotICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgYWRkIGEgJyIg
KyB0eXBlICsgIicgcmVjb3JkIHRvIHRoaXMgcmVsYXRpb25zaGlwIiwgIXZhbHVlIHx8IHZhbHVl
IGluc3RhbmNlb2Ygc3RvcmUubW9kZWxGb3IodHlwZSkpOwotICAgICAgcmV0dXJuIHZhbHVlID09
PSB1bmRlZmluZWQgPyBudWxsIDogRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBF
bWJlci5SU1ZQLnJlc29sdmUodmFsdWUsIHByb21pc2VMYWJlbCkgfSk7Ci0gICAgfQotCi0gICAg
dmFyIGxpbmsgPSBkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nba2V5XSwKLSAgICAgICAgYmVsb25n
c1RvID0gZGF0YVtrZXldOwotCi0gICAgaWYoIWlzTm9uZShiZWxvbmdzVG8pKSB7Ci0gICAgICB2
YXIgcHJvbWlzZSA9IHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbykgfHwgRW1iZXIuUlNWUC5y
ZXNvbHZlKGJlbG9uZ3NUbywgcHJvbWlzZUxhYmVsKTsKLSAgICAgIHJldHVybiBEUy5Qcm9taXNl
T2JqZWN0LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2V9KTsKLSAgICB9IGVsc2UgaWYgKGxpbmsp
IHsKLSAgICAgIHZhciByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBBc3luYyBiZWxv
bmdzVG8gKGxpbmspICIgKyB0aGlzICsgIiA6ICIgKyBrZXkpOwotICAgICAgc3RvcmUuZmluZEJl
bG9uZ3NUbyh0aGlzLCBsaW5rLCBtZXRhLCByZXNvbHZlcik7Ci0gICAgICByZXR1cm4gRFMuUHJv
bWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9taXNlIH0pOwotICAgIH0g
ZWxzZSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0pLnByb3BlcnR5KCdkYXRhJyku
bWV0YShtZXRhKTsKLX0KLQotLyoqCi0gIGBEUy5iZWxvbmdzVG9gIGlzIHVzZWQgdG8gZGVmaW5l
IE9uZS1Uby1PbmUgYW5kIE9uZS1Uby1NYW55Ci0gIHJlbGF0aW9uc2hpcHMgb24gYSBbRFMuTW9k
ZWxdKERTLk1vZGVsLmh0bWwpLgotCi0KLSAgYERTLmJlbG9uZ3NUb2AgdGFrZXMgYW4gb3B0aW9u
YWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRseQotICBzdXBwb3J0ZWQgb3B0
aW9ucyBhcmU6Ci0KLSAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFsdWUgdXNlZCB0byBleHBsaWNp
dGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlvbnNoaXAuCi0gIC0gYGludmVy
c2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9uIGEK
LSAgICByZWxhdGVkIG1vZGVsIGluIGEgT25lLVRvLU1hbnkgcmVsYXRpb25zaGlwLiBTZWUgW0V4
cGxpY2l0IEludmVyc2VzXSgjdG9jX2V4cGxpY2l0LWludmVyc2VzKQotCi0gICMjIyMgT25lLVRv
LU9uZQotICBUbyBkZWNsYXJlIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28g
bW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2A6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
VXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgcHJvZmlsZTogRFMuYmVsb25nc1RvKCdwcm9m
aWxlJykKLSAgfSk7Ci0KLSAgQXBwLlByb2ZpbGUgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHVz
ZXI6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gIH0pOwotICBgYGAKLQotICAjIyMjIE9uZS1Uby1N
YW55Ci0gIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28g
bW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0aCBgRFMuaGFz
TWFueWAsIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Qb3N0ID0gRFMuTW9k
ZWwuZXh0ZW5kKHsKLSAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCi0gIH0pOwot
Ci0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBwb3N0OiBEUy5iZWxvbmdz
VG8oJ3Bvc3QnKQotICB9KTsKLSAgYGBgCi0KLSAgQG5hbWVzcGFjZQotICBAbWV0aG9kIGJlbG9u
Z3NUbwotICBAZm9yIERTCi0gIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1vZGVsfSB0eXBlIHRoZSBt
b2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMg
YSBoYXNoIG9mIG9wdGlvbnMKLSAgQHJldHVybiB7RW1iZXIuY29tcHV0ZWR9IHJlbGF0aW9uc2hp
cAotKi8KLURTLmJlbG9uZ3NUbyA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAgaWYgKHR5
cGVvZiB0eXBlID09PSAnb2JqZWN0JykgewotICAgIG9wdGlvbnMgPSB0eXBlOwotICAgIHR5cGUg
PSB1bmRlZmluZWQ7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgZmlyc3QgYXJn
dW1lbnQgRFMuYmVsb25nc1RvIG11c3QgYmUgYSBtb2RlbCB0eXBlIG9yIHN0cmluZywgbGlrZSBE
Uy5iZWxvbmdzVG8oQXBwLlBlcnNvbikiLCAhIXR5cGUgJiYgKHR5cGVvZiB0eXBlID09PSAnc3Ry
aW5nJyB8fCBEUy5Nb2RlbC5kZXRlY3QodHlwZSkpKTsKLSAgfQotCi0gIG9wdGlvbnMgPSBvcHRp
b25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0aW9uc2hpcDog
dHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2JlbG9uZ3NUbycgfTsKLQotICBpZiAob3B0
aW9ucy5hc3luYykgewotICAgIHJldHVybiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBvcHRpb25zLCBt
ZXRhKTsKLSAgfQotCi0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVl
KSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKLSAgICAgICAgc3RvcmUgPSBn
ZXQodGhpcywgJ3N0b3JlJyksIGJlbG9uZ3NUbywgdHlwZUNsYXNzOwotCi0gICAgaWYgKHR5cGVv
ZiB0eXBlID09PSAnc3RyaW5nJykgewotICAgICAgdHlwZUNsYXNzID0gc3RvcmUubW9kZWxGb3Io
dHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cGVDbGFzcyA9IHR5cGU7Ci0gICAgfQotCi0g
ICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91
IGNhbiBvbmx5IGFkZCBhICciICsgdHlwZSArICInIHJlY29yZCB0byB0aGlzIHJlbGF0aW9uc2hp
cCIsICF2YWx1ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIHR5cGVDbGFzcyk7Ci0gICAgICByZXR1cm4g
dmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBiZWxvbmdz
VG8gPSBkYXRhW2tleV07Ci0KLSAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykpIHsgcmV0dXJuIG51
bGw7IH0KLQotICAgIHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbyk7Ci0KLSAgICByZXR1cm4g
YmVsb25nc1RvOwotICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Ci19OwotCi0vKioK
LSAgVGhlc2Ugb2JzZXJ2ZXJzIG9ic2VydmUgYWxsIGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcHMg
b24gdGhlIHJlY29yZC4gU2VlCi0gIGByZWxhdGlvbnNoaXBzL2V4dGAgdG8gc2VlIGhvdyB0aGVz
ZSBvYnNlcnZlcnMgZ2V0IHRoZWlyIGRlcGVuZGVuY2llcy4KLQotICBAY2xhc3MgTW9kZWwKLSAg
QG5hbWVzcGFjZSBEUwotKi8KLURTLk1vZGVsLnJlb3Blbih7Ci0KLSAgLyoqCi0gICAgQG1ldGhv
ZCBiZWxvbmdzVG9XaWxsQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0gICAgQHBh
cmFtIHJlY29yZAotICAgIEBwYXJhbSBrZXkKLSAgKi8KLSAgYmVsb25nc1RvV2lsbENoYW5nZTog
RW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKLSAgICBpZiAoZ2V0
KHJlY29yZCwgJ2lzTG9hZGVkJykpIHsKLSAgICAgIHZhciBvbGRQYXJlbnQgPSBnZXQocmVjb3Jk
LCBrZXkpOwotCi0gICAgICBpZiAob2xkUGFyZW50KSB7Ci0gICAgICAgIHZhciBzdG9yZSA9IGdl
dChyZWNvcmQsICdzdG9yZScpLAotICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlw
Q2hhbmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG9sZFBhcmVudCwgc3RvcmUsIHsga2V5OiBrZXks
IGtpbmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBlOiAicmVtb3ZlIiB9KTsKLQotICAgICAgICBj
aGFuZ2Uuc3luYygpOwotICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0gPSBjaGFuZ2U7
Ci0gICAgICB9Ci0gICAgfQotICB9KSwKLQotICAvKioKLSAgICBAbWV0aG9kIGJlbG9uZ3NUb0Rp
ZENoYW5nZQotICAgIEBwcml2YXRlCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSByZWNvcmQKLSAg
ICBAcGFyYW0ga2V5Ci0gICovCi0gIGJlbG9uZ3NUb0RpZENoYW5nZTogRW1iZXIuaW1tZWRpYXRl
T2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKLSAgICBpZiAoZ2V0KHJlY29yZCwgJ2lz
TG9hZGVkJykpIHsKLSAgICAgIHZhciBuZXdQYXJlbnQgPSBnZXQocmVjb3JkLCBrZXkpOwotCi0g
ICAgICBpZiAobmV3UGFyZW50KSB7Ci0gICAgICAgIHZhciBzdG9yZSA9IGdldChyZWNvcmQsICdz
dG9yZScpLAotICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0
ZUNoYW5nZShyZWNvcmQsIG5ld1BhcmVudCwgc3RvcmUsIHsga2V5OiBrZXksIGtpbmQ6ICJiZWxv
bmdzVG8iLCBjaGFuZ2VUeXBlOiAiYWRkIiB9KTsKLQotICAgICAgICBjaGFuZ2Uuc3luYygpOwot
ICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZSB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV07Ci0g
IH0pCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVt
YmVyLWRhdGEKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgc2V0
UHJvcGVydGllcyA9IEVtYmVyLnNldFByb3BlcnRpZXM7Ci0KLWZ1bmN0aW9uIGFzeW5jSGFzTWFu
eSh0eXBlLCBvcHRpb25zLCBtZXRhKSB7Ci0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIHJlbGF0aW9uc2hpcCA9IHRoaXMuX3JlbGF0aW9uc2hp
cHNba2V5XSwKLSAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBBc3luYyBoYXNNYW55ICIgKyB0
aGlzICsgIiA6ICIgKyBrZXk7Ci0KLSAgICBpZiAoIXJlbGF0aW9uc2hpcCkgewotICAgICAgdmFy
IHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNlTGFiZWwpOwotICAgICAgcmVsYXRp
b25zaGlwID0gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBmdW5jdGlvbihz
dG9yZSwgZGF0YSkgewotICAgICAgICB2YXIgbGluayA9IGRhdGEubGlua3MgJiYgZGF0YS5saW5r
c1trZXldOwotICAgICAgICB2YXIgcmVsOwotICAgICAgICBpZiAobGluaykgewotICAgICAgICAg
IHJlbCA9IHN0b3JlLmZpbmRIYXNNYW55KHRoaXMsIGxpbmssIG1ldGEsIHJlc29sdmVyKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWwgPSBzdG9yZS5maW5kTWFueSh0aGlzLCBkYXRh
W2tleV0sIG1ldGEudHlwZSwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhY2hl
IHRoZSBwcm9taXNlIHNvIHdlIGNhbiB1c2UgaXQKLSAgICAgICAgLy8gd2hlbiB3ZSBjb21lIGJh
Y2sgYW5kIGRvbid0IG5lZWQgdG8gcmVidWlsZAotICAgICAgICAvLyB0aGUgcmVsYXRpb25zaGlw
LgotICAgICAgICBzZXQocmVsLCAncHJvbWlzZScsIHJlc29sdmVyLnByb21pc2UpOwotICAgICAg
ICByZXR1cm4gcmVsOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgdmFyIHByb21pc2UgPSByZWxh
dGlvbnNoaXAuZ2V0KCdwcm9taXNlJykudGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBy
ZWxhdGlvbnNoaXA7Ci0gICAgfSwgbnVsbCwgIkRTOiBBc3luYyBoYXNNYW55IHJlY29yZHMgcmVj
ZWl2ZWQiKTsKLQotICAgIHJldHVybiBEUy5Qcm9taXNlQXJyYXkuY3JlYXRlKHsgcHJvbWlzZTog
cHJvbWlzZSB9KTsKLSAgfSkucHJvcGVydHkoJ2RhdGEnKS5tZXRhKG1ldGEpOwotfQotCi1mdW5j
dGlvbiBidWlsZFJlbGF0aW9uc2hpcChyZWNvcmQsIGtleSwgb3B0aW9ucywgY2FsbGJhY2spIHsK
LSAgdmFyIHJlbHMgPSByZWNvcmQuX3JlbGF0aW9uc2hpcHM7Ci0KLSAgaWYgKHJlbHNba2V5XSkg
eyByZXR1cm4gcmVsc1trZXldOyB9Ci0KLSAgdmFyIGRhdGEgPSBnZXQocmVjb3JkLCAnZGF0YScp
LAotICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLQotICB2YXIgcmVsYXRpb25z
aGlwID0gcmVsc1trZXldID0gY2FsbGJhY2suY2FsbChyZWNvcmQsIHN0b3JlLCBkYXRhKTsKLQot
ICByZXR1cm4gc2V0UHJvcGVydGllcyhyZWxhdGlvbnNoaXAsIHsKLSAgICBvd25lcjogcmVjb3Jk
LCBuYW1lOiBrZXksIGlzUG9seW1vcnBoaWM6IG9wdGlvbnMucG9seW1vcnBoaWMKLSAgfSk7Ci19
Ci0KLWZ1bmN0aW9uIGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMg
PSBvcHRpb25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0aW9u
c2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2hhc01hbnknIH07Ci0KLSAgaWYg
KG9wdGlvbnMuYXN5bmMpIHsKLSAgICByZXR1cm4gYXN5bmNIYXNNYW55KHR5cGUsIG9wdGlvbnMs
IG1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFs
dWUpIHsKLSAgICByZXR1cm4gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBm
dW5jdGlvbihzdG9yZSwgZGF0YSkgewotICAgICAgdmFyIHJlY29yZHMgPSBkYXRhW2tleV07Ci0g
ICAgICBFbWJlci5hc3NlcnQoIllvdSBsb29rZWQgdXAgdGhlICciICsga2V5ICsgIicgcmVsYXRp
b25zaGlwIG9uICciICsgdGhpcyArICInIGJ1dCBzb21lIG9mIHRoZSBhc3NvY2lhdGVkIHJlY29y
ZHMgd2VyZSBub3QgbG9hZGVkLiBFaXRoZXIgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCBsb2FkZWQg
dG9nZXRoZXIgd2l0aCB0aGUgcGFyZW50IHJlY29yZCwgb3Igc3BlY2lmeSB0aGF0IHRoZSByZWxh
dGlvbnNoaXAgaXMgYXN5bmMgKGBEUy5oYXNNYW55KHsgYXN5bmM6IHRydWUgfSlgKSIsIEVtYmVy
LkEocmVjb3JkcykuZXZlcnlQcm9wZXJ0eSgnaXNFbXB0eScsIGZhbHNlKSk7Ci0gICAgICByZXR1
cm4gc3RvcmUuZmluZE1hbnkodGhpcywgZGF0YVtrZXldLCBtZXRhLnR5cGUpOwotICAgIH0pOwot
ICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Ci19Ci0KLS8qKgotICBgRFMuaGFzTWFu
eWAgaXMgdXNlZCB0byBkZWZpbmUgT25lLVRvLU1hbnkgYW5kIE1hbnktVG8tTWFueQotICByZWxh
dGlvbnNoaXBzIG9uIGEgW0RTLk1vZGVsXShEUy5Nb2RlbC5odG1sKS4KLQotICBgRFMuaGFzTWFu
eWAgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRs
eQotICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6Ci0KLSAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFs
dWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlv
bnNoaXAuCi0gIC0gYGludmVyc2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZl
cnNlIHByb3BlcnR5IG9uIGEgcmVsYXRlZCBtb2RlbC4KLQotICAjIyMjIE9uZS1Uby1NYW55Ci0g
IFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxz
LCB1c2UKLSAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0aCBgRFMuaGFzTWFueWAs
IGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCi0gIH0pOwotCi0gIEFw
cC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ3Bv
c3QnKQotICB9KTsKLSAgYGBgCi0KLSAgIyMjIyBNYW55LVRvLU1hbnkKLSAgVG8gZGVjbGFyZSBh
IG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERT
Lmhhc01hbnlgOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRl
bmQoewotICAgIHRhZ3M6IERTLmhhc01hbnkoJ3RhZycpCi0gIH0pOwotCi0gIEFwcC5UYWcgPSBE
Uy5Nb2RlbC5leHRlbmQoewotICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgfSk7Ci0g
IGBgYAotCi0gICMjIyMgRXhwbGljaXQgSW52ZXJzZXMKLQotICBFbWJlciBEYXRhIHdpbGwgZG8g
aXRzIGJlc3QgdG8gZGlzY292ZXIgd2hpY2ggcmVsYXRpb25zaGlwcyBtYXAgdG8KLSAgb25lIGFu
b3RoZXIuIEluIHRoZSBvbmUtdG8tbWFueSBjb2RlIGFib3ZlLCBmb3IgZXhhbXBsZSwgRW1iZXIg
RGF0YQotICBjYW4gZmlndXJlIG91dCB0aGF0IGNoYW5naW5nIHRoZSBgY29tbWVudHNgIHJlbGF0
aW9uc2hpcCBzaG91bGQgdXBkYXRlCi0gIHRoZSBgcG9zdGAgcmVsYXRpb25zaGlwIG9uIHRoZSBp
bnZlcnNlIGJlY2F1c2UgcG9zdCBpcyB0aGUgb25seQotICByZWxhdGlvbnNoaXAgdG8gdGhhdCBt
b2RlbC4KLQotICBIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSBoYXZlIG11bHRpcGxlIGBiZWxv
bmdzVG9gL2BoYXNNYW55c2AgZm9yIHRoZQotICBzYW1lIHR5cGUuIFlvdSBjYW4gc3BlY2lmeSB3
aGljaCBwcm9wZXJ0eSBvbiB0aGUgcmVsYXRlZCBtb2RlbCBpcwotICB0aGUgaW52ZXJzZSB1c2lu
ZyBgRFMuaGFzTWFueWAncyBgaW52ZXJzZWAgb3B0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
dmFyIGJlbG9uZ3NUbyA9IERTLmJlbG9uZ3NUbywKLSAgICAgIGhhc01hbnkgPSBEUy5oYXNNYW55
OwotCi0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBvbmVQb3N0OiBiZWxv
bmdzVG8oJ3Bvc3QnKSwKLSAgICB0d29Qb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICByZWRQ
b3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICBibHVlUG9zdDogYmVsb25nc1RvKCdwb3N0JykK
LSAgfSk7Ci0KLSAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIGNvbW1lbnRzOiBo
YXNNYW55KCdjb21tZW50JywgewotICAgICAgaW52ZXJzZTogJ3JlZFBvc3QnCi0gICAgfSkKLSAg
fSk7Ci0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGludmVyc2Ugb24gYSBgYmVs
b25nc1RvYCwgd2hpY2ggd29ya3MgaG93Ci0gIHlvdSdkIGV4cGVjdC4KLQotICBAbmFtZXNwYWNl
Ci0gIEBtZXRob2QgaGFzTWFueQotICBAZm9yIERTCi0gIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1v
ZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgQHBhcmFtIHtP
YmplY3R9IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlvbnMKLSAgQHJldHVybiB7RW1iZXIuY29tcHV0
ZWR9IHJlbGF0aW9uc2hpcAotKi8KLURTLmhhc01hbnkgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25z
KSB7Ci0gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHsKLSAgICBvcHRpb25zID0gdHlw
ZTsKLSAgICB0eXBlID0gdW5kZWZpbmVkOwotICB9Ci0gIHJldHVybiBoYXNSZWxhdGlvbnNoaXAo
dHlwZSwgb3B0aW9ucyk7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQG1vZHVsZSBlbWJlci1k
YXRhCi0qLwotCi0vKgotICBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIGV4dGVuc2lvbnMgdG8g
dGhlIGJhc2UgYERTLk1vZGVsYCBjbGFzcyB0aGF0Ci0gIGFkZCBzdXBwb3J0IGZvciBvbmUtdG8t
bWFueSByZWxhdGlvbnNoaXBzLgotKi8KLQotLyoqCi0gIEBjbGFzcyBNb2RlbAotICBAbmFtZXNw
YWNlIERTCi0qLwotRFMuTW9kZWwucmVvcGVuKHsKLQotICAvKioKLSAgICBUaGlzIEVtYmVyLmpz
IGhvb2sgYWxsb3dzIGFuIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGEgcHJvcGVydHkKLSAg
ICBpcyBkZWZpbmVkLgotCi0gICAgSW4gdGhpcyBjYXNlLCB3ZSB1c2UgaXQgdG8gYmUgbm90aWZp
ZWQgd2hlbiBhbiBFbWJlciBEYXRhIHVzZXIgZGVmaW5lcyBhCi0gICAgYmVsb25ncy10byByZWxh
dGlvbnNoaXAuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBzZXQgdXAgb2JzZXJ2ZXJzIGZvcgot
ICAgIGVhY2ggb25lLCBhbGxvd2luZyB1cyB0byB0cmFjayByZWxhdGlvbnNoaXAgY2hhbmdlcyBh
bmQgYXV0b21hdGljYWxseQotICAgIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgaW52ZXJzZSBoYXMt
bWFueSBhcnJheS4KLQotICAgIFRoaXMgaG9vayBwYXNzZXMgdGhlIGNsYXNzIGJlaW5nIHNldCB1
cCwgYXMgd2VsbCBhcyB0aGUga2V5IGFuZCB2YWx1ZQotICAgIGJlaW5nIGRlZmluZWQuIFNvLCBm
b3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlciBkb2VzIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHBhcmVudDogRFMuYmVsb25nc1RvKCd1c2Vy
JykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoaXMgaG9vayB3b3VsZCBiZSBjYWxsZWQgd2l0
aCAicGFyZW50IiBhcyB0aGUga2V5IGFuZCB0aGUgY29tcHV0ZWQKLSAgICBwcm9wZXJ0eSByZXR1
cm5lZCBieSBgRFMuYmVsb25nc1RvYCBhcyB0aGUgdmFsdWUuCi0KLSAgICBAbWV0aG9kIGRpZERl
ZmluZVByb3BlcnR5Ci0gICAgQHBhcmFtIHByb3RvCi0gICAgQHBhcmFtIGtleQotICAgIEBwYXJh
bSB2YWx1ZQotICAqLwotICBkaWREZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24ocHJvdG8sIGtleSwg
dmFsdWUpIHsKLSAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgYmVpbmcgc2V0IGlzIGEgY29tcHV0
ZWQgcHJvcGVydHkuCi0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikg
ewotCi0gICAgICAvLyBJZiBpdCBpcywgZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIHJlbGF0aW9u
c2hpcC4gVGhpcyBpcwotICAgICAgLy8gcG9wdWxhdGVkIGJ5IHRoZSBgRFMuYmVsb25nc1RvYCBo
ZWxwZXIgd2hlbiBpdCBpcyBjcmVhdGluZwotICAgICAgLy8gdGhlIGNvbXB1dGVkIHByb3BlcnR5
LgotICAgICAgdmFyIG1ldGEgPSB2YWx1ZS5tZXRhKCk7Ci0KLSAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwICYmIG1ldGEua2luZCA9PT0gJ2JlbG9uZ3NUbycpIHsKLSAgICAgICAgRW1iZXIu
YWRkT2JzZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2JlbG9uZ3NUb0RpZENoYW5nZScpOwotICAg
ICAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcihwcm90bywga2V5LCBudWxsLCAnYmVsb25nc1Rv
V2lsbENoYW5nZScpOwotICAgICAgfQotCi0gICAgICBtZXRhLnBhcmVudFR5cGUgPSBwcm90by5j
b25zdHJ1Y3RvcjsKLSAgICB9Ci0gIH0KLX0pOwotCi0vKgotICBUaGVzZSBEUy5Nb2RlbCBleHRl
bnNpb25zIGFkZCBjbGFzcyBtZXRob2RzIHRoYXQgcHJvdmlkZSByZWxhdGlvbnNoaXAKLSAgaW50
cm9zcGVjdGlvbiBhYmlsaXRpZXMgYWJvdXQgcmVsYXRpb25zaGlwcy4KLQotICBBIG5vdGUgYWJv
dXQgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgY29udGFpbmVkIGhlcmU6Ci0KLSAgKipUaGVzZSBw
cm9wZXJ0aWVzIGFyZSBlZmZlY3RpdmVseSBzZWFsZWQgb25jZSBjYWxsZWQgZm9yIHRoZSBmaXJz
dCB0aW1lLioqCi0gIFRvIGF2b2lkIHJlcGVhdGVkbHkgZG9pbmcgZXhwZW5zaXZlIGl0ZXJhdGlv
biBvdmVyIGEgbW9kZWwncyBmaWVsZHMsIHRoZXNlCi0gIHZhbHVlcyBhcmUgY29tcHV0ZWQgb25j
ZSBhbmQgdGhlbiBjYWNoZWQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJ1bnRpbWUgb2YKLSAg
eW91ciBhcHBsaWNhdGlvbi4KLQotICBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1vZGlm
eSBhIGNsYXNzIGFmdGVyIGl0cyBpbml0aWFsIGRlZmluaXRpb24KLSAgKGZvciBleGFtcGxlLCB1
c2luZyBgcmVvcGVuKClgIHRvIGFkZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMpLCBtYWtlIHN1cmUg
eW91Ci0gIGRvIGl0IGJlZm9yZSB1c2luZyB5b3VyIG1vZGVsIHdpdGggdGhlIHN0b3JlLCB3aGlj
aCB1c2VzIHRoZXNlIHByb3BlcnRpZXMKLSAgZXh0ZW5zaXZlbHkuCi0qLwotCi1EUy5Nb2RlbC5y
ZW9wZW5DbGFzcyh7Ci0gIC8qKgotICAgIEZvciBhIGdpdmVuIHJlbGF0aW9uc2hpcCBuYW1lLCBy
ZXR1cm5zIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhh
bXBsZSwgaWYgeW91IGRlZmluZSBhIG1vZGVsIGxpa2UgdGhpczoKLQotICAgYGBgamF2YXNjcmlw
dAotICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIGNvbW1lbnRzOiBEUy5o
YXNNYW55KCdjb21tZW50JykKLSAgICB9KTsKLSAgIGBgYAotCi0gICAgQ2FsbGluZyBgQXBwLlBv
c3QudHlwZUZvclJlbGF0aW9uc2hpcCgnY29tbWVudHMnKWAgd2lsbCByZXR1cm4gYEFwcC5Db21t
ZW50YC4KLQotICAgIEBtZXRob2QgdHlwZUZvclJlbGF0aW9uc2hpcAotICAgIEBzdGF0aWMKLSAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0gICAg
QHJldHVybiB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHRoZSB0eXBlIG9mIHRoZSByZWxhdGlvbnNo
aXAsIG9yIHVuZGVmaW5lZAotICAqLwotICB0eXBlRm9yUmVsYXRpb25zaGlwOiBmdW5jdGlvbihu
YW1lKSB7Ci0gICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5
TmFtZScpLmdldChuYW1lKTsKLSAgICByZXR1cm4gcmVsYXRpb25zaGlwICYmIHJlbGF0aW9uc2hp
cC50eXBlOwotICB9LAotCi0gIGludmVyc2VGb3I6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIg
aW52ZXJzZVR5cGUgPSB0aGlzLnR5cGVGb3JSZWxhdGlvbnNoaXAobmFtZSk7Ci0KLSAgICBpZiAo
IWludmVyc2VUeXBlKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgb3B0aW9ucyA9IHRoaXMu
bWV0YUZvclByb3BlcnR5KG5hbWUpLm9wdGlvbnM7Ci0KLSAgICBpZiAob3B0aW9ucy5pbnZlcnNl
ID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgaW52ZXJzZU5hbWUsIGludmVy
c2VLaW5kOwotCi0gICAgaWYgKG9wdGlvbnMuaW52ZXJzZSkgewotICAgICAgaW52ZXJzZU5hbWUg
PSBvcHRpb25zLmludmVyc2U7Ci0gICAgICBpbnZlcnNlS2luZCA9IEVtYmVyLmdldChpbnZlcnNl
VHlwZSwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5nZXQoaW52ZXJzZU5hbWUpLmtpbmQ7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHZhciBwb3NzaWJsZVJlbGF0aW9uc2hpcHMgPSBmaW5kUG9zc2libGVJ
bnZlcnNlcyh0aGlzLCBpbnZlcnNlVHlwZSk7Ci0KLSAgICAgIGlmIChwb3NzaWJsZVJlbGF0aW9u
c2hpcHMubGVuZ3RoID09PSAwKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICAgIEVtYmVyLmFzc2Vy
dCgiWW91IGRlZmluZWQgdGhlICciICsgbmFtZSArICInIHJlbGF0aW9uc2hpcCBvbiAiICsgdGhp
cyArICIsIGJ1dCBtdWx0aXBsZSBwb3NzaWJsZSBpbnZlcnNlIHJlbGF0aW9uc2hpcHMgb2YgdHlw
ZSAiICsgdGhpcyArICIgd2VyZSBmb3VuZCBvbiAiICsgaW52ZXJzZVR5cGUgKyAiLiBMb29rIGF0
IGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvbW9kZWxzL2RlZmluaW5nLW1vZGVscy8jdG9jX2V4
cGxpY2l0LWludmVyc2VzIGZvciBob3cgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGludmVyc2VzIiwg
cG9zc2libGVSZWxhdGlvbnNoaXBzLmxlbmd0aCA9PT0gMSk7Ci0KLSAgICAgIGludmVyc2VOYW1l
ID0gcG9zc2libGVSZWxhdGlvbnNoaXBzWzBdLm5hbWU7Ci0gICAgICBpbnZlcnNlS2luZCA9IHBv
c3NpYmxlUmVsYXRpb25zaGlwc1swXS5raW5kOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZpbmRQ
b3NzaWJsZUludmVyc2VzKHR5cGUsIGludmVyc2VUeXBlLCBwb3NzaWJsZVJlbGF0aW9uc2hpcHMp
IHsKLSAgICAgIHBvc3NpYmxlUmVsYXRpb25zaGlwcyA9IHBvc3NpYmxlUmVsYXRpb25zaGlwcyB8
fCBbXTsKLQotICAgICAgdmFyIHJlbGF0aW9uc2hpcE1hcCA9IGdldChpbnZlcnNlVHlwZSwgJ3Jl
bGF0aW9uc2hpcHMnKTsKLSAgICAgIGlmICghcmVsYXRpb25zaGlwTWFwKSB7IHJldHVybjsgfQot
Ci0gICAgICB2YXIgcmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcE1hcC5nZXQodHlwZSk7Ci0g
ICAgICBpZiAocmVsYXRpb25zaGlwcykgewotICAgICAgICBwb3NzaWJsZVJlbGF0aW9uc2hpcHMu
cHVzaC5hcHBseShwb3NzaWJsZVJlbGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcE1hcC5nZXQodHlw
ZSkpOwotICAgICAgfQotCi0gICAgICBpZiAodHlwZS5zdXBlcmNsYXNzKSB7Ci0gICAgICAgIGZp
bmRQb3NzaWJsZUludmVyc2VzKHR5cGUuc3VwZXJjbGFzcywgaW52ZXJzZVR5cGUsIHBvc3NpYmxl
UmVsYXRpb25zaGlwcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwb3NzaWJsZVJlbGF0aW9u
c2hpcHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHsKLSAgICAgIHR5cGU6IGludmVyc2VUeXBlLAot
ICAgICAgbmFtZTogaW52ZXJzZU5hbWUsCi0gICAgICBraW5kOiBpbnZlcnNlS2luZAotICAgIH07
Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIG1vZGVsJ3MgcmVsYXRpb25zaGlwcyBhcyBhIG1hcCwg
a2V5ZWQgb24gdGhlIHR5cGUgb2YgdGhlCi0gICAgcmVsYXRpb25zaGlwLiBUaGUgdmFsdWUgb2Yg
ZWFjaCBlbnRyeSBpcyBhbiBhcnJheSBjb250YWluaW5nIGEgZGVzY3JpcHRvcgotICAgIGZvciBl
YWNoIHJlbGF0aW9uc2hpcCB3aXRoIHRoYXQgdHlwZSwgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0
aGUgcmVsYXRpb25zaGlwCi0gICAgYXMgd2VsbCBhcyB0aGUgdHlwZS4KLQotICAgIEZvciBleGFt
cGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1vZGVsIGRlZmluaXRpb246Ci0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgdXNlcnM6IERT
Lmhhc01hbnkoJ3VzZXInKSwKLSAgICAgIG93bmVyOiBEUy5iZWxvbmdzVG8oJ3VzZXInKSwKLSAg
ICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgd291bGQgcmV0dXJuIGEgbWFwIGRlc2NyaWJpbmcgdGhlc2UK
LSAgICByZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
dmFyIHJlbGF0aW9uc2hpcHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdyZWxhdGlvbnNoaXBzJyk7
Ci0gICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlVzZXIpOwotICAgIC8vPT4gWyB7IG5hbWU6ICd1
c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAotICAgIC8vICAgICB7IG5hbWU6ICdvd25lcicsIGtp
bmQ6ICdiZWxvbmdzVG8nIH0gXQotICAgIHJlbGF0aW9uc2hpcHMuZ2V0KEFwcC5Qb3N0KTsKLSAg
ICAvLz0+IFsgeyBuYW1lOiAncG9zdHMnLCBraW5kOiAnaGFzTWFueScgfSBdCi0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwcwotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBFbWJl
ci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwczogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9IG5ldyBFbWJlci5NYXBXaXRoRGVmYXVsdCh7
Ci0gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0KLSAgICB9KTsK
LQotICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGNvbXB1dGVkIHByb3BlcnR5IG9uIHRoZSBjbGFz
cwotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewot
Ci0gICAgICAvLyBJZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgYSByZWxhdGlvbnNoaXAsIGFk
ZAotICAgICAgLy8gaXQgdG8gdGhlIG1hcC4KLSAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlw
KSB7Ci0gICAgICAgIGlmICh0eXBlb2YgbWV0YS50eXBlID09PSAnc3RyaW5nJykgewotICAgICAg
ICAgIG1ldGEudHlwZSA9IHRoaXMuc3RvcmUubW9kZWxGb3IobWV0YS50eXBlKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHZhciByZWxhdGlvbnNoaXBzRm9yVHlwZSA9IG1hcC5nZXQobWV0YS50eXBl
KTsKLQotICAgICAgICByZWxhdGlvbnNoaXBzRm9yVHlwZS5wdXNoKHsgbmFtZTogbmFtZSwga2lu
ZDogbWV0YS5raW5kIH0pOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG1hcDsKLSAg
fSksCi0KLSAgLyoqCi0gICAgQSBoYXNoIGNvbnRhaW5pbmcgbGlzdHMgb2YgdGhlIG1vZGVsJ3Mg
cmVsYXRpb25zaGlwcywgZ3JvdXBlZAotICAgIGJ5IHRoZSByZWxhdGlvbnNoaXAga2luZC4gRm9y
IGV4YW1wbGUsIGdpdmVuIGEgbW9kZWwgd2l0aCB0aGlzCi0gICAgZGVmaW5pdGlvbjoKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1
c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygndXNl
cicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCi0gICAgfSk7Ci0gICAgYGBg
Ci0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVsYXRpb25zaGlwTmFtZXMgPSBFbWJlci5nZXQoQXBw
LkJsb2csICdyZWxhdGlvbnNoaXBOYW1lcycpOwotICAgIHJlbGF0aW9uc2hpcE5hbWVzLmhhc01h
bnk7Ci0gICAgLy89PiBbJ3VzZXJzJywgJ3Bvc3RzJ10KLSAgICByZWxhdGlvbnNoaXBOYW1lcy5i
ZWxvbmdzVG87Ci0gICAgLy89PiBbJ293bmVyJ10KLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBy
ZWxhdGlvbnNoaXBOYW1lcwotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBPYmplY3QKLSAgICBAcmVh
ZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwTmFtZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgewotICAgIHZhciBuYW1lcyA9IHsgaGFzTWFueTogW10sIGJlbG9uZ3NUbzogW10gfTsKLQot
ICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAg
ICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgbmFtZXNbbWV0YS5raW5kXS5w
dXNoKG5hbWUpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG5hbWVzOwotICB9KSwK
LQotICAvKioKLSAgICBBbiBhcnJheSBvZiB0eXBlcyBkaXJlY3RseSByZWxhdGVkIHRvIGEgbW9k
ZWwuIEVhY2ggdHlwZSB3aWxsIGJlCi0gICAgaW5jbHVkZWQgb25jZSwgcmVnYXJkbGVzcyBvZiB0
aGUgbnVtYmVyIG9mIHJlbGF0aW9uc2hpcHMgaXQgaGFzIHdpdGgKLSAgICB0aGUgbW9kZWwuCi0K
LSAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMgZGVmaW5pdGlvbjoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAg
ICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygn
dXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCi0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVsYXRlZFR5cGVzID0gRW1iZXIuZ2V0KEFwcC5C
bG9nLCAncmVsYXRlZFR5cGVzJyk7Ci0gICAgLy89PiBbIEFwcC5Vc2VyLCBBcHAuUG9zdCBdCi0g
ICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRlZFR5cGVzCi0gICAgQHN0YXRpYwotICAgIEB0
eXBlIEVtYmVyLkFycmF5Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIHJlbGF0ZWRUeXBlczogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHR5cGUsCi0gICAgICAgIHR5cGVzID0g
RW1iZXIuQSgpOwotCi0gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkg
b24gdGhlIGNsYXNzLAotICAgIC8vIGFuZCBjcmVhdGUgYW4gYXJyYXkgb2YgdGhlIHVuaXF1ZSB0
eXBlcyBpbnZvbHZlZAotICAgIC8vIGluIHJlbGF0aW9uc2hpcHMKLSAgICB0aGlzLmVhY2hDb21w
dXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKLSAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwKSB7Ci0gICAgICAgIHR5cGUgPSBtZXRhLnR5cGU7Ci0KLSAgICAgICAgaWYgKHR5
cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIHR5cGUgPSBnZXQodGhpcywgdHlw
ZSwgZmFsc2UpIHx8IHRoaXMuc3RvcmUubW9kZWxGb3IodHlwZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgYSBoYXNNYW55ICgiICsgbWV0YS50eXBl
ICsgIikgb24gIiArIG1ldGEucGFyZW50VHlwZSArICIgYnV0ICIgKyBtZXRhLnR5cGUgKyAiIHdh
cyBub3QgZm91bmQuIiwgIHR5cGUpOwotCi0gICAgICAgIGlmICghdHlwZXMuY29udGFpbnModHlw
ZSkpIHsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoIlRyeWluZyB0byBzaWRlbG9hZCAiICsgbmFt
ZSArICIgb24gIiArIHRoaXMudG9TdHJpbmcoKSArICIgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgZXhp
c3QuIiwgISF0eXBlKTsKLSAgICAgICAgICB0eXBlcy5wdXNoKHR5cGUpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0pLAotCi0gIC8qKgotICAg
IEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSByZWxhdGlvbnNoaXBzIG9mIGEgbW9kZWwgYW5kIHdo
b3NlIHZhbHVlcyBhcmUKLSAgICByZWxhdGlvbnNoaXAgZGVzY3JpcHRvcnMuCi0KLSAgICBGb3Ig
ZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMKLSAgICBkZWZpbml0aW9uOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVz
ZXJzOiBEUy5oYXNNYW55KCd1c2VyJyksCi0gICAgICBvd25lcjogRFMuYmVsb25nc1RvKCd1c2Vy
JyksCi0KLSAgICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgICB9KTsKLSAgICBgYGAK
LQotICAgIFRoaXMgcHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciByZWxhdGlvbnNoaXBzQnlOYW1lID0gRW1iZXIuZ2V0KEFw
cC5CbG9nLCAncmVsYXRpb25zaGlwc0J5TmFtZScpOwotICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUu
Z2V0KCd1c2VycycpOwotICAgIC8vPT4geyBrZXk6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55Jywg
dHlwZTogQXBwLlVzZXIgfQotICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCdvd25lcicpOwot
ICAgIC8vPT4geyBrZXk6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nLCB0eXBlOiBBcHAuVXNl
ciB9Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwc0J5TmFtZQotICAgIEBz
dGF0aWMKLSAgICBAdHlwZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRp
b25zaGlwc0J5TmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9
IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKLQotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVy
dHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXAp
IHsKLSAgICAgICAgbWV0YS5rZXkgPSBuYW1lOwotICAgICAgICB0eXBlID0gbWV0YS50eXBlOwot
Ci0gICAgICAgIGlmICghdHlwZSAmJiBtZXRhLmtpbmQgPT09ICdoYXNNYW55JykgewotICAgICAg
ICAgIHR5cGUgPSBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUobmFtZSk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAoIXR5cGUpIHsKLSAgICAgICAgICB0eXBlID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICBtZXRhLnR5cGUg
PSB0aGlzLnN0b3JlLm1vZGVsRm9yKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwLnNl
dChuYW1lLCBtZXRhKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0p
LAotCi0gIC8qKgotICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIG1v
ZGVsIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHN0cmluZ3MKLSAgICBkZXNjcmliaW5nIHRoZSBraW5k
IG9mIHRoZSBmaWVsZC4gQSBtb2RlbCdzIGZpZWxkcyBhcmUgdGhlIHVuaW9uIG9mIGFsbCBvZiBp
dHMKLSAgICBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzLgotCi0gICAgRm9yIGV4YW1wbGU6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7
Ci0gICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9u
Z3NUbygndXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpLAotCi0gICAg
ICB0aXRsZTogRFMuYXR0cignc3RyaW5nJykKLSAgICB9KTsKLQotICAgIHZhciBmaWVsZHMgPSBF
bWJlci5nZXQoQXBwLkJsb2csICdmaWVsZHMnKTsKLSAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlv
bihmaWVsZCwga2luZCkgewotICAgICAgY29uc29sZS5sb2coZmllbGQsIGtpbmQpOwotICAgIH0p
OwotCi0gICAgLy8gcHJpbnRzOgotICAgIC8vIHVzZXJzLCBoYXNNYW55Ci0gICAgLy8gb3duZXIs
IGJlbG9uZ3NUbwotICAgIC8vIHBvc3RzLCBoYXNNYW55Ci0gICAgLy8gdGl0bGUsIGF0dHJpYnV0
ZQotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGZpZWxkcwotICAgIEBzdGF0aWMKLSAgICBAdHlw
ZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgZmllbGRzOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0gICAg
dGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBp
ZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgewotICAgICAgICBtYXAuc2V0KG5hbWUsIG1ldGEua2lu
ZCk7Ci0gICAgICB9IGVsc2UgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsKLSAgICAgICAgbWFwLnNl
dChuYW1lLCAnYXR0cmlidXRlJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gbWFw
OwotICB9KSwKLQotICAvKioKLSAgICBHaXZlbiBhIGNhbGxiYWNrLCBpdGVyYXRlcyBvdmVyIGVh
Y2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIG1vZGVsLAotICAgIGludm9raW5nIHRoZSBj
YWxsYmFjayB3aXRoIHRoZSBuYW1lIG9mIGVhY2ggcmVsYXRpb25zaGlwIGFuZCBpdHMgcmVsYXRp
b25zaGlwCi0gICAgZGVzY3JpcHRvci4KLQotICAgIEBtZXRob2QgZWFjaFJlbGF0aW9uc2hpcAot
ICAgIEBzdGF0aWMKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgY2FsbGJhY2sg
dG8gaW52b2tlCi0gICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRo
ZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKLSAgKi8KLSAgZWFjaFJlbGF0aW9u
c2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhpcywgJ3JlbGF0
aW9uc2hpcHNCeU5hbWUnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewot
ICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBuYW1lLCByZWxhdGlvbnNoaXApOwotICAgIH0p
OwotICB9LAotCi0gIC8qKgotICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFj
aCBvZiB0aGUgdHlwZXMgcmVsYXRlZCB0byBhIG1vZGVsLAotICAgIGludm9raW5nIHRoZSBjYWxs
YmFjayB3aXRoIHRoZSByZWxhdGVkIHR5cGUncyBjbGFzcy4gRWFjaCB0eXBlIHdpbGwgYmUKLSAg
ICByZXR1cm5lZCBqdXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZGlmZmVyZW50IHJl
bGF0aW9uc2hpcHMgaXQgaGFzCi0gICAgd2l0aCBhIG1vZGVsLgotCi0gICAgQG1ldGhvZCBlYWNo
UmVsYXRlZFR5cGUKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sg
dGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1
ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0g
IGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQo
dGhpcywgJ3JlbGF0ZWRUeXBlcycpLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewotICAgICAgY2Fs
bGJhY2suY2FsbChiaW5kaW5nLCB0eXBlKTsKLSAgICB9KTsKLSAgfQotfSk7Ci0KLURTLk1vZGVs
LnJlb3Blbih7Ci0gIC8qKgotICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFj
aCBvZiB0aGUgcmVsYXRpb25zaGlwcyBpbiB0aGUgbW9kZWwsCi0gICAgaW52b2tpbmcgdGhlIGNh
bGxiYWNrIHdpdGggdGhlIG5hbWUgb2YgZWFjaCByZWxhdGlvbnNoaXAgYW5kIGl0cyByZWxhdGlv
bnNoaXAKLSAgICBkZXNjcmlwdG9yLgotCi0gICAgQG1ldGhvZCBlYWNoUmVsYXRpb25zaGlwCi0g
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAg
IEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBg
dGhpc2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0gIGVhY2hSZWxhdGlvbnNoaXA6IGZ1bmN0aW9u
KGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoUmVsYXRpb25z
aGlwKGNhbGxiYWNrLCBiaW5kaW5nKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMuZm9yRWFjaDsKLQotLyoqCi0gIEBjbGFzcyBSZWNvcmRBcnJheU1hbmFnZXIKLSAgQG5h
bWVzcGFjZSBEUwotICBAcHJpdmF0ZQotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1EUy5S
ZWNvcmRBcnJheU1hbmFnZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5maWx0ZXJlZFJlY29yZEFycmF5cyA9IEVtYmVyLk1hcFdpdGhEZWZh
dWx0LmNyZWF0ZSh7Ci0gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107
IH0KLSAgICB9KTsKLQotICAgIHRoaXMuY2hhbmdlZFJlY29yZHMgPSBbXTsKLSAgfSwKLQotICBy
ZWNvcmREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGlmICh0aGlzLmNoYW5nZWRS
ZWNvcmRzLnB1c2gocmVjb3JkKSAhPT0gMSkgeyByZXR1cm47IH0KLQotICAgIEVtYmVyLnJ1bi5z
Y2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwK
LQotICByZWNvcmRBcnJheXNGb3JSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJlY29y
ZC5fcmVjb3JkQXJyYXlzID0gcmVjb3JkLl9yZWNvcmRBcnJheXMgfHwgRW1iZXIuT3JkZXJlZFNl
dC5jcmVhdGUoKTsKLSAgICByZXR1cm4gcmVjb3JkLl9yZWNvcmRBcnJheXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuZXZlciBkYXRhIGlzIGxvYWRlZCBp
bnRvIHRoZSBzdG9yZSBieSB0aGUKLSAgICBhZGFwdGVyIG9yIHVwZGF0ZWQgYnkgdGhlIGFkYXB0
ZXIsIG9yIHdoZW4gYSByZWNvcmQgaGFzIGNoYW5nZWQuCi0KLSAgICBJdCB1cGRhdGVzIGFsbCBy
ZWNvcmQgYXJyYXlzIHRoYXQgYSByZWNvcmQgYmVsb25ncyB0by4KLQotICAgIFRvIGF2b2lkIHRo
cmFzaGluZywgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZSBwZXIgcnVuIGxvb3AuCi0KLSAgICBA
bWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5cwotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBA
cGFyYW0ge051bWJlcnxTdHJpbmd9IGNsaWVudElkCi0gICovCi0gIHVwZGF0ZVJlY29yZEFycmF5
czogZnVuY3Rpb24oKSB7Ci0gICAgZm9yRWFjaCh0aGlzLmNoYW5nZWRSZWNvcmRzLCBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICAgIGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsKLSAgICAg
ICAgdGhpcy5fcmVjb3JkV2FzRGVsZXRlZChyZWNvcmQpOwotICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhpcy5fcmVjb3JkV2FzQ2hhbmdlZChyZWNvcmQpOwotICAgICAgfQotICAgIH0sIHRoaXMp
OwotCi0gICAgdGhpcy5jaGFuZ2VkUmVjb3Jkcy5sZW5ndGggPSAwOwotICB9LAotCi0gIF9yZWNv
cmRXYXNEZWxldGVkOiBmdW5jdGlvbiAocmVjb3JkKSB7Ci0gICAgdmFyIHJlY29yZEFycmF5cyA9
IHJlY29yZC5fcmVjb3JkQXJyYXlzOwotCi0gICAgaWYgKCFyZWNvcmRBcnJheXMpIHsgcmV0dXJu
OyB9Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAg
IGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwotICAgIH0pOwotICB9LAotCi0gIF9yZWNvcmRX
YXNDaGFuZ2VkOiBmdW5jdGlvbiAocmVjb3JkKSB7Ci0gICAgdmFyIHR5cGUgPSByZWNvcmQuY29u
c3RydWN0b3IsCi0gICAgICAgIHJlY29yZEFycmF5cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJh
eXMuZ2V0KHR5cGUpLAotICAgICAgICBmaWx0ZXI7Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5
cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAgIGZpbHRlciA9IGdldChhcnJheSwgJ2ZpbHRlckZ1
bmN0aW9uJyk7Ci0gICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBmaWx0ZXIsIHR5
cGUsIHJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICAvLyBsb29wIHRocm91Z2ggYWxsIG1h
bnlBcnJheXMgY29udGFpbmluZyBhbiB1bmxvYWRlZCBjb3B5IG9mIHRoaXMKLSAgICAvLyBjbGll
bnRJZCBhbmQgbm90aWZ5IHRoZW0gdGhhdCB0aGUgcmVjb3JkIHdhcyBsb2FkZWQuCi0gICAgdmFy
IG1hbnlBcnJheXMgPSByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXM7Ci0KLSAgICBpZiAobWFu
eUFycmF5cykgewotICAgICAgZm9yICh2YXIgaT0wLCBsPW1hbnlBcnJheXMubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgICAgICBtYW55QXJyYXlzW2ldLmxvYWRlZFJlY29yZCgpOwotICAgICAgfQot
Ci0gICAgICByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXMgPSBbXTsKLSAgICB9Ci0gIH0sCi0K
LSAgLyoqCi0gICAgVXBkYXRlIGFuIGluZGl2aWR1YWwgZmlsdGVyLgotCi0gICAgQG1ldGhvZCB1
cGRhdGVSZWNvcmRBcnJheQotICAgIEBwYXJhbSB7RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0gYXJy
YXkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBl
Ci0gICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJZAotICAqLwotICB1cGRhdGVSZWNv
cmRBcnJheTogZnVuY3Rpb24oYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFy
IHNob3VsZEJlSW5BcnJheTsKLQotICAgIGlmICghZmlsdGVyKSB7Ci0gICAgICBzaG91bGRCZUlu
QXJyYXkgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzaG91bGRCZUluQXJyYXkgPSBmaWx0
ZXIocmVjb3JkKTsKLSAgICB9Ci0KLSAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy5yZWNvcmRB
cnJheXNGb3JSZWNvcmQocmVjb3JkKTsKLQotICAgIGlmIChzaG91bGRCZUluQXJyYXkpIHsKLSAg
ICAgIHJlY29yZEFycmF5cy5hZGQoYXJyYXkpOwotICAgICAgYXJyYXkuYWRkUmVjb3JkKHJlY29y
ZCk7Ci0gICAgfSBlbHNlIGlmICghc2hvdWxkQmVJbkFycmF5KSB7Ci0gICAgICByZWNvcmRBcnJh
eXMucmVtb3ZlKGFycmF5KTsKLSAgICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwotICAg
IH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGlmIHRoZSBgZmls
dGVyRnVuY3Rpb25gIHByb3BlcnR5IGlzCi0gICAgY2hhbmdlZCBvbiBhIGBEUy5GaWx0ZXJlZFJl
Y29yZEFycmF5YC4KLQotICAgIEl0IGVzc2VudGlhbGx5IHJlLXJ1bnMgdGhlIGZpbHRlciBmcm9t
IHNjcmF0Y2guIFRoaXMgc2FtZQotICAgIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIGZpbHRl
ciBpcyBjcmVhdGVkIGluIHRoIGZpcnN0IHBsYWNlLgotCi0gICAgQG1ldGhvZCB1cGRhdGVGaWx0
ZXIKLSAgICBAcGFyYW0gYXJyYXkKLSAgICBAcGFyYW0gdHlwZQotICAgIEBwYXJhbSBmaWx0ZXIK
LSAgKi8KLSAgdXBkYXRlRmlsdGVyOiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0g
ICAgdmFyIHR5cGVNYXAgPSB0aGlzLnN0b3JlLnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIHJl
Y29yZHMgPSB0eXBlTWFwLnJlY29yZHMsIHJlY29yZDsKLQotICAgIGZvciAodmFyIGk9MCwgbD1y
ZWNvcmRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIHJlY29yZCA9IHJlY29yZHNbaV07Ci0K
LSAgICAgIGlmICghZ2V0KHJlY29yZCwgJ2lzRGVsZXRlZCcpICYmICFnZXQocmVjb3JkLCAnaXNF
bXB0eScpKSB7Ci0gICAgICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXkoYXJyYXksIGZpbHRlciwg
dHlwZSwgcmVjb3JkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRl
IGEgYERTLk1hbnlBcnJheWAgZm9yIGEgdHlwZSBhbmQgbGlzdCBvZiByZWNvcmQgcmVmZXJlbmNl
cywgYW5kIGluZGV4Ci0gICAgdGhlIGBNYW55QXJyYXlgIHVuZGVyIGVhY2ggcmVmZXJlbmNlLiBU
aGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSByZW1vdmUKLSAgICByZWNvcmRzIGZyb20gYE1h
bnlBcnJheWBzIHdoZW4gdGhleSBhcmUgZGVsZXRlZC4KLQotICAgIEBtZXRob2QgY3JlYXRlTWFu
eUFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlZmVy
ZW5jZXMKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9Ci0gICovCi0gIGNyZWF0ZU1hbnlBcnJh
eTogZnVuY3Rpb24odHlwZSwgcmVjb3JkcykgewotICAgIHZhciBtYW55QXJyYXkgPSBEUy5NYW55
QXJyYXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiByZWNvcmRz
LAotICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAgICB9KTsKLQotICAgIGZvckVhY2gocmVjb3Jk
cywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICB2YXIgYXJyYXlzID0gdGhpcy5yZWNvcmRBcnJh
eXNGb3JSZWNvcmQocmVjb3JkKTsKLSAgICAgIGFycmF5cy5hZGQobWFueUFycmF5KTsKLSAgICB9
LCB0aGlzKTsKLQotICAgIHJldHVybiBtYW55QXJyYXk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3Jl
YXRlIGEgYERTLlJlY29yZEFycmF5YCBmb3IgYSB0eXBlIGFuZCByZWdpc3RlciBpdCBmb3IgdXBk
YXRlcy4KLQotICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkQXJyYXkKLSAgICBAcGFyYW0ge0NsYXNz
fSB0eXBlCi0gICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZVJlY29y
ZEFycmF5OiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGFycmF5ID0gRFMuUmVjb3JkQXJyYXku
Y3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiBFbWJlci5BKCksCi0g
ICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAgICAgIGlzTG9hZGVkOiB0cnVlCi0gICAgfSk7Ci0K
LSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSk7Ci0KLSAg
ICByZXR1cm4gYXJyYXk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgYERTLkZpbHRlcmVk
UmVjb3JkQXJyYXlgIGZvciBhIHR5cGUgYW5kIHJlZ2lzdGVyIGl0IGZvciB1cGRhdGVzLgotCi0g
ICAgQG1ldGhvZCBjcmVhdGVGaWx0ZXJlZFJlY29yZEFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30g
dHlwZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgotICAgIEByZXR1cm4ge0RTLkZpbHRl
cmVkUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZUZpbHRlcmVkUmVjb3JkQXJyYXk6IGZ1bmN0
aW9uKHR5cGUsIGZpbHRlcikgewotICAgIHZhciBhcnJheSA9IERTLkZpbHRlcmVkUmVjb3JkQXJy
YXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiBFbWJlci5BKCks
Ci0gICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAgICAgIG1hbmFnZXI6IHRoaXMsCi0gICAgICBm
aWx0ZXJGdW5jdGlvbjogZmlsdGVyCi0gICAgfSk7Ci0KLSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVy
ZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSwgZmlsdGVyKTsKLQotICAgIHJldHVybiBhcnJheTsK
LSAgfSwKLQotICAvKioKLSAgICBDcmVhdGUgYSBgRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFy
cmF5YCBmb3IgYSB0eXBlIHdpdGggZ2l2ZW4gcXVlcnkuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZUFk
YXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBA
cGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcmV0dXJuIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVj
b3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheTogZnVu
Y3Rpb24odHlwZSwgcXVlcnkpIHsKLSAgICByZXR1cm4gRFMuQWRhcHRlclBvcHVsYXRlZFJlY29y
ZEFycmF5LmNyZWF0ZSh7Ci0gICAgICB0eXBlOiB0eXBlLAotICAgICAgcXVlcnk6IHF1ZXJ5LAot
ICAgICAgY29udGVudDogRW1iZXIuQSgpLAotICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAgICB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZWdpc3RlciBhIFJlY29yZEFycmF5IGZvciBhIGdpdmVu
IHR5cGUgdG8gYmUgYmFja2VkIGJ5Ci0gICAgYSBmaWx0ZXIgZnVuY3Rpb24uIFRoaXMgd2lsbCBj
YXVzZSB0aGUgYXJyYXkgdG8gdXBkYXRlCi0gICAgYXV0b21hdGljYWxseSB3aGVuIHJlY29yZHMg
b2YgdGhhdCB0eXBlIGNoYW5nZSBhdHRyaWJ1dGUKLSAgICB2YWx1ZXMgb3Igc3RhdGVzLgotCi0g
ICAgQG1ldGhvZCByZWdpc3RlckZpbHRlcmVkUmVjb3JkQXJyYXkKLSAgICBAcGFyYW0ge0RTLlJl
Y29yZEFycmF5fSBhcnJheQotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSBmaWx0ZXIKLSAgKi8KLSAgcmVnaXN0ZXJGaWx0ZXJlZFJlY29yZEFycmF5OiBmdW5j
dGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0gICAgdmFyIHJlY29yZEFycmF5cyA9IHRoaXMu
ZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUpOwotICAgIHJlY29yZEFycmF5cy5wdXNoKGFy
cmF5KTsKLQotICAgIHRoaXMudXBkYXRlRmlsdGVyKGFycmF5LCB0eXBlLCBmaWx0ZXIpOwotICB9
LAotCi0gIC8vIEludGVybmFsbHksIHdlIG1haW50YWluIGEgbWFwIG9mIGFsbCB1bmxvYWRlZCBJ
RHMgcmVxdWVzdGVkIGJ5Ci0gIC8vIGEgTWFueUFycmF5LiBBcyB0aGUgYWRhcHRlciBsb2FkcyBk
YXRhIGludG8gdGhlIHN0b3JlLCB0aGUKLSAgLy8gc3RvcmUgbm90aWZpZXMgYW55IGludGVyZXN0
ZWQgTWFueUFycmF5cy4gV2hlbiB0aGUgTWFueUFycmF5J3MKLSAgLy8gdG90YWwgbnVtYmVyIG9m
IGxvYWRpbmcgcmVjb3JkcyBkcm9wcyB0byB6ZXJvLCBpdCBiZWNvbWVzCi0gIC8vIGBpc0xvYWRl
ZGAgYW5kIGZpcmVzIGEgYGRpZExvYWRgIGV2ZW50LgotICByZWdpc3RlcldhaXRpbmdSZWNvcmRB
cnJheTogZnVuY3Rpb24ocmVjb3JkLCBhcnJheSkgewotICAgIHZhciBsb2FkaW5nUmVjb3JkQXJy
YXlzID0gcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzIHx8IFtdOwotICAgIGxvYWRpbmdSZWNv
cmRBcnJheXMucHVzaChhcnJheSk7Ci0gICAgcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzID0g
bG9hZGluZ1JlY29yZEFycmF5czsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgbWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwOwot
Ci12YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJl
cicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107Ci0KLS8qKgotICBBIGBE
Uy5JbnZhbGlkRXJyb3JgIGlzIHVzZWQgYnkgYW4gYWRhcHRlciB0byBzaWduYWwgdGhlIGV4dGVy
bmFsIEFQSQotICB3YXMgdW5hYmxlIHRvIHByb2Nlc3MgYSByZXF1ZXN0IGJlY2F1c2UgdGhlIGNv
bnRlbnQgd2FzIG5vdAotICBzZW1hbnRpY2FsbHkgY29ycmVjdCBvciBtZWFuaW5nZnVsIHBlciB0
aGUgQVBJLiBVc3VhbGx5IHRoaXMgbWVhbnMgYQotICByZWNvcmQgZmFpbGVkIHNvbWUgZm9ybSBv
ZiBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uLiBXaGVuIGEgcHJvbWlzZQotICBmcm9tIGFuIGFkYXB0
ZXIgaXMgcmVqZWN0ZWQgd2l0aCBhIGBEUy5JbnZhbGlkRXJyb3JgIHRoZSByZWNvcmQgd2lsbAot
ICB0cmFuc2l0aW9uIHRvIHRoZSBgaW52YWxpZGAgc3RhdGUgYW5kIHRoZSBlcnJvcnMgd2lsbCBi
ZSBzZXQgdG8gdGhlCi0gIGBlcnJvcnNgIHByb3BlcnR5IG9uIHRoZSByZWNvcmQuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJF
U1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAgYWpheEVycm9yOiBmdW5jdGlvbihqcVhIUikgewotICAg
ICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOwotCi0gICAgICBpZiAoanFYSFIgJiYg
anFYSFIuc3RhdHVzID09PSA0MjIpIHsKLSAgICAgICAgdmFyIGpzb25FcnJvcnMgPSBFbWJlci4k
LnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQpWyJlcnJvcnMiXTsKLSAgICAgICAgcmV0dXJu
IG5ldyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9ycyk7Ci0gICAgICB9IGVsc2UgewotICAgICAg
ICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQGNsYXNz
IEludmFsaWRFcnJvcgotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuSW52YWxpZEVycm9yID0gZnVu
Y3Rpb24oZXJyb3JzKSB7Ci0gIHZhciB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3Iu
Y2FsbCh0aGlzLCAiVGhlIGJhY2tlbmQgcmVqZWN0ZWQgdGhlIGNvbW1pdCBiZWNhdXNlIGl0IHdh
cyBpbnZhbGlkOiAiICsgRW1iZXIuaW5zcGVjdChlcnJvcnMpKTsKLSAgdGhpcy5lcnJvcnMgPSBl
cnJvcnM7Ci0KLSAgZm9yICh2YXIgaT0wLCBsPWVycm9yUHJvcHMubGVuZ3RoOyBpPGw7IGkrKykg
ewotICAgIHRoaXNbZXJyb3JQcm9wc1tpXV0gPSB0bXBbZXJyb3JQcm9wc1tpXV07Ci0gIH0KLX07
Ci1EUy5JbnZhbGlkRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9yLnByb3RvdHlw
ZSk7Ci0KLS8qKgotICBBbiBhZGFwdGVyIGlzIGFuIG9iamVjdCB0aGF0IHJlY2VpdmVzIHJlcXVl
c3RzIGZyb20gYSBzdG9yZSBhbmQKLSAgdHJhbnNsYXRlcyB0aGVtIGludG8gdGhlIGFwcHJvcHJp
YXRlIGFjdGlvbiB0byB0YWtlIGFnYWluc3QgeW91cgotICBwZXJzaXN0ZW5jZSBsYXllci4gVGhl
IHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkgYW4gSFRUUCBBUEksIGJ1dAotICBtYXkgYmUg
YW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlLiBUeXBpY2FsbHkg
dGhlCi0gIGFkYXB0ZXIgaXMgbm90IGludm9rZWQgZGlyZWN0bHkgaW5zdGVhZCBpdHMgZnVuY3Rp
b25hbGl0eSBpcyBhY2Nlc3NlZAotICB0aHJvdWdoIHRoZSBgc3RvcmVgLgotCi0gICMjIyBDcmVh
dGluZyBhbiBBZGFwdGVyCi0KLSAgRmlyc3QsIGNyZWF0ZSBhIG5ldyBzdWJjbGFzcyBvZiBgRFMu
QWRhcHRlcmA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuTXlBZGFwdGVyID0gRFMuQWRhcHRl
ci5leHRlbmQoewotICAgIC8vIC4uLnlvdXIgY29kZSBoZXJlCi0gIH0pOwotICBgYGAKLQotICBU
byB0ZWxsIHlvdXIgc3RvcmUgd2hpY2ggYWRhcHRlciB0byB1c2UsIHNldCBpdHMgYGFkYXB0ZXJg
IHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLnN0b3JlID0gRFMuU3RvcmUuY3Jl
YXRlKHsKLSAgICBhZGFwdGVyOiAnTXlBZGFwdGVyJwotICB9KTsKLSAgYGBgCi0KLSAgYERTLkFk
YXB0ZXJgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCB5b3Ugc2hvdWxkIG92ZXJyaWRl
IGluIHlvdXIKLSAgYXBwbGljYXRpb24gdG8gY3VzdG9taXplIGl0IGZvciB5b3VyIGJhY2tlbmQu
IFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCi0gIHRoYXQgeW91IHNob3VsZCBpbXBsZW1lbnQg
aXM6Ci0KLSAgICAqIGBmaW5kKClgCi0gICAgKiBgY3JlYXRlUmVjb3JkKClgCi0gICAgKiBgdXBk
YXRlUmVjb3JkKClgCi0gICAgKiBgZGVsZXRlUmVjb3JkKClgCi0gICAgKiBgZmluZEFsbCgpYAot
ICAgICogYGZpbmRRdWVyeSgpYAotCi0gIFRvIGltcHJvdmUgdGhlIG5ldHdvcmsgcGVyZm9ybWFu
Y2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiBvcHRpbWl6ZQotICB5b3VyIGFkYXB0ZXIg
Ynkgb3ZlcnJpZGluZyB0aGVzZSBsb3dlci1sZXZlbCBtZXRob2RzOgotCi0gICAgKiBgZmluZE1h
bnkoKWAKLQotCi0gIEZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uLCBzZWUgYERTLlJFU1RB
ZGFwdGVyYCwgdGhlCi0gIGluY2x1ZGVkIFJFU1QgYWRhcHRlci4KLQotICBAY2xhc3MgQWRhcHRl
cgotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLQotRFMuQWRh
cHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotCi0gIC8qKgotICAgIElmIHlvdSB3b3VsZCBs
aWtlIHlvdXIgYWRhcHRlciB0byB1c2UgYSBjdXN0b20gc2VyaWFsaXplciB5b3UgY2FuCi0gICAg
c2V0IHRoZSBgZGVmYXVsdFNlcmlhbGl6ZXJgIHByb3BlcnR5IHRvIGJlIHRoZSBuYW1lIG9mIHRo
ZSBjdXN0b20KLSAgICBzZXJpYWxpemVyLgotCi0gICAgTm90ZSB0aGUgYGRlZmF1bHRTZXJpYWxp
emVyYCBzZXJpYWxpemVyIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoZW4KLSAgICBhIG1vZGVsIHNw
ZWNpZmljIHNlcmlhbGl6ZXIgKGkuZS4gYFBvc3RTZXJpYWxpemVyYCkgb3IgdGhlCi0gICAgYGFw
cGxpY2F0aW9uYCBzZXJpYWxpemVyLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBEamFu
Z29BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAgICAgZGVmYXVsdFNlcmlhbGl6ZXI6
ICdkamFuZ28nCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgZGVmYXVsdFNlcmlh
bGl6ZXIKLSAgICBAdHlwZSB7U3RyaW5nfQotICAqLwotCi0gIC8qKgotICAgIFRoZSBgZmluZCgp
YCBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzdG9yZSBpcyBhc2tlZCBmb3IgYSByZWNvcmQg
dGhhdAotICAgIGhhcyBub3QgcHJldmlvdXNseSBiZWVuIGxvYWRlZC4gSW4gcmVzcG9uc2UgdG8g
YGZpbmQoKWAgYmVpbmcgY2FsbGVkLCB5b3UKLSAgICBzaG91bGQgcXVlcnkgeW91ciBwZXJzaXN0
ZW5jZSBsYXllciBmb3IgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQuIE9uY2UKLSAgICBmb3Vu
ZCwgeW91IGNhbiBhc3luY2hyb25vdXNseSBjYWxsIHRoZSBzdG9yZSdzIGBwdXNoKClgIG1ldGhv
ZCB0byBwdXNoCi0gICAgdGhlIHJlY29yZCBpbnRvIHRoZSBzdG9yZS4KLQotICAgIEhlcmUgaXMg
YW4gZXhhbXBsZSBgZmluZGAgaW1wbGVtZW50YXRpb246Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZp
bmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgewotICAgICAgICB2YXIgdXJsID0gW3R5cGUs
IGlkXS5qb2luKCcvJyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2Uo
ZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmdldEpTT04odXJs
KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNv
bHZlLCBkYXRhKTsKLSAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewotICAgICAgICAgICAg
anFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2Vz
Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7Ci0gICAgICAgICAg
fSk7Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBmaW5kCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQHJldHVybiB7
UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiks
Ci0KLSAgLyoqCi0gICAgVGhlIGBmaW5kQWxsKClgIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB5b3Ug
Y2FsbCBgZmluZGAgb24gdGhlIHN0b3JlCi0gICAgd2l0aG91dCBhbiBJRCAoaS5lLiBgc3RvcmUu
ZmluZCgncG9zdCcpYCkuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
QXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmRB
bGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7Ci0gICAgICAgIHZhciB1cmwg
PSB0eXBlOwotICAgICAgICB2YXIgcXVlcnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0gICAg
ICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVj
dCkgewotICAgICAgICAgIGpRdWVyeS5nZXRKU09OKHVybCwgcXVlcnkpLnRoZW4oZnVuY3Rpb24o
ZGF0YSkgewotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAg
ICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVs
bDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVt
YmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
ZmluZEFsbAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kQWxsOiBudWxsLAotCi0gIC8q
KgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHlvdSBjYWxsIGBmaW5kYCBvbiB0aGUg
c3RvcmUgd2l0aCBhCi0gICAgcXVlcnkgb2JqZWN0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIChp
LmUuIGBzdG9yZS5maW5kKCdwZXJzb24nLCB7Ci0gICAgcGFnZTogMSB9KWApLgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBE
Uy5BZGFwdGVyLmV4dGVuZCh7Ci0gICAgICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCBxdWVyeSkgewotICAgICAgICB2YXIgdXJsID0gdHlwZTsKLSAgICAgICAgcmV0dXJuIG5ldyBF
bWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAg
alF1ZXJ5LmdldEpTT04odXJsLCBxdWVyeSkudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAg
ICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7Ci0gICAgICAgICAgfSwgZnVuY3Rp
b24oanFYSFIpIHsKLSAgICAgICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVy
eSdzIGlsbCBtYW5uZXJlZCBwcm9taXNlcwotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJl
amVjdCwganFYSFIpOwotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9
KTsKLSAgICBgYGAKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcGFyYW0ge0RTLkFkYXB0ZXJQ
b3B1bGF0ZWRSZWNvcmRBcnJheX0gcmVjb3JkQXJyYXkKLSAgICBAcmV0dXJuIHtQcm9taXNlfSBw
cm9taXNlCi0gICovCi0gIGZpbmRRdWVyeTogbnVsbCwKLQotICAvKioKLSAgICBJZiB0aGUgZ2xv
YmFsbHkgdW5pcXVlIElEcyBmb3IgeW91ciByZWNvcmRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb24g
dGhlIGNsaWVudCwKLSAgICBpbXBsZW1lbnQgdGhlIGBnZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1l
dGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gICAgZWFjaCB0aW1lIHlvdSBjcmVh
dGUgYSBuZXcgcmVjb3JkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gaXQgd2lsbCBiZQot
ICAgIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQncyBgcHJpbWFyeUtleWAuCi0KLSAgICBNb3N0IHRy
YWRpdGlvbmFsIFJFU1QtbGlrZSBIVFRQIEFQSXMgd2lsbCBub3QgdXNlIHRoaXMgbWV0aG9kLiBJ
bnN0ZWFkLCB0aGUgSUQKLSAgICBvZiB0aGUgcmVjb3JkIHdpbGwgYmUgc2V0IGJ5IHRoZSBzZXJ2
ZXIsIGFuZCB5b3VyIGFkYXB0ZXIgd2lsbCB1cGRhdGUgdGhlIHN0b3JlCi0gICAgd2l0aCB0aGUg
bmV3IElEIHdoZW4gaXQgY2FsbHMgYGRpZENyZWF0ZVJlY29yZCgpYC4gT25seSBpbXBsZW1lbnQg
dGhpcyBtZXRob2QgaWYKLSAgICB5b3UgaW50ZW5kIHRvIGdlbmVyYXRlIHJlY29yZCBJRHMgb24g
dGhlIGNsaWVudC1zaWRlLgotCi0gICAgVGhlIGBnZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1ldGhv
ZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmVxdWVzdGluZyBzdG9yZSBhcwotICAgIHRoZSBm
aXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSBuZXdseSBjcmVhdGVkIHJlY29yZCBhcyB0aGUgc2Vjb25k
IHBhcmFtZXRlcjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBnZW5lcmF0ZUlkRm9yUmVjb3Jk
OiBmdW5jdGlvbihzdG9yZSwgcmVjb3JkKSB7Ci0gICAgICB2YXIgdXVpZCA9IEFwcC5nZW5lcmF0
ZVVVSURXaXRoU3RhdGlzdGljYWxseUxvd09kZHNPZkNvbGxpc2lvbigpOwotICAgICAgcmV0dXJu
IHV1aWQ7Ci0gICAgfQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3Jk
Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNv
cmQKLSAgICBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfSBpZAotICAqLwotICBnZW5lcmF0ZUlkRm9y
UmVjb3JkOiBudWxsLAotCi0gIC8qKgotICAgIFByb3hpZXMgdG8gdGhlIHNlcmlhbGl6ZXIncyBg
c2VyaWFsaXplYCBtZXRob2QuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGNy
ZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIg
ZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAg
ICAgIHZhciB1cmwgPSB0eXBlOwotCi0gICAgICAgIC8vIC4uLgotICAgICAgfQotICAgIH0pOwot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zCi0gICAgQHJldHVybiB7T2JqZWN0
fSBzZXJpYWxpemVkIHJlY29yZAotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
b3B0aW9ucykgewotICAgIHJldHVybiBnZXQocmVjb3JkLCAnc3RvcmUnKS5zZXJpYWxpemVyRm9y
KHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5KS5zZXJpYWxpemUocmVjb3JkLCBvcHRpb25zKTsK
LSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyB0
byBoYW5kbGUgdGhlIGNyZWF0aW9uIG9mCi0gICAgbmV3IHJlY29yZHMuCi0KLSAgICBTZXJpYWxp
emVzIHRoZSByZWNvcmQgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRpb25BZGFwdGVyID0gRFMuQWRh
cHRlci5leHRlbmQoewotICAgICAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg
cmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCB7IGlu
Y2x1ZGVJZDogdHJ1ZSB9KTsKLSAgICAgICAgdmFyIHVybCA9IHR5cGU7Ci0KLSAgICAgICAgcmV0
dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0g
ICAgICAgICAgalF1ZXJ5LmFqYXgoewotICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAotICAgICAg
ICAgICAgdXJsOiB1cmwsCi0gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAotICAgICAgICAg
ICAgZGF0YTogZGF0YQotICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewotICAgICAg
ICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAgICAgICAgIH0sIGZ1bmN0
aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVl
cnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCBy
ZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMu
U3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZSAgIHRo
ZSBEUy5Nb2RlbCBjbGFzcyBvZiB0aGUgcmVjb3JkCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVj
b3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6
IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBt
ZXRob2QgaW4gYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlIHVwZGF0aW5nIG9mCi0gICAgYSByZWNv
cmQuCi0KLSAgICBTZXJpYWxpemVzIHRoZSByZWNvcmQgdXBkYXRlIGFuZCBzZW5kIGl0IHRvIHRo
ZSBzZXJ2ZXIuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFw
cGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIHVwZGF0ZVJlY29y
ZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIgZGF0YSA9IHRo
aXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHZhciBp
ZCA9IHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgICAgIHZhciB1cmwgPSBbdHlwZSwgaWRdLmpvaW4o
Jy8nKTsKLQotICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBqUXVlcnkuYWpheCh7Ci0gICAgICAgICAgICB0
eXBlOiAnUFVUJywKLSAgICAgICAgICAgIHVybDogdXJsLAotICAgICAgICAgICAgZGF0YVR5cGU6
ICdqc29uJywKLSAgICAgICAgICAgIGRhdGE6IGRhdGEKLSAgICAgICAgICB9KS50aGVuKGZ1bmN0
aW9uKGRhdGEpIHsKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCBkYXRhKTsK
LSAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewotICAgICAgICAgICAganFYSFIudGhlbiA9
IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2VzCi0gICAgICAgICAg
ICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7Ci0gICAgICAgICAgfSk7Ci0gICAgICAg
IH0pOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUgICB0aGUgRFMuTW9kZWwgY2xhc3Mgb2YgdGhlIHJlY29yZAotICAgIEBw
YXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAg
Ki8KLSAgdXBkYXRlUmVjb3JkOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCi0KLSAgLyoqCi0g
ICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gaGFuZGxlIHRoZSBkZWxl
dGlvbiBvZgotICAgIGEgcmVjb3JkLgotCi0gICAgU2VuZHMgYSBkZWxldGUgcmVxdWVzdCBmb3Ig
dGhlIHJlY29yZCB0byB0aGUgc2VydmVyLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0g
ICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICAg
ICAgdmFyIGRhdGEgPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0p
OwotICAgICAgICB2YXIgaWQgPSByZWNvcmQuZ2V0KCdpZCcpOwotICAgICAgICB2YXIgdXJsID0g
W3R5cGUsIGlkXS5qb2luKCcvJyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlBy
b21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmFqYXgo
ewotICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsCi0gICAgICAgICAgICB1cmw6IHVybCwKLSAg
ICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCi0gICAgICAgICAgICBkYXRhOiBkYXRhCi0gICAg
ICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVs
bCwgcmVzb2x2ZSwgZGF0YSk7Ci0gICAgICAgICAgfSwgZnVuY3Rpb24oanFYSFIpIHsKLSAgICAg
ICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBw
cm9taXNlcwotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVjdCwganFYSFIpOwotICAg
ICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IEBtZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBA
cGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9m
IHRoZSByZWNvcmQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtQ
cm9taXNlfSBwcm9taXNlCi0gICovCi0gIGRlbGV0ZVJlY29yZDogRW1iZXIucmVxdWlyZWQoRnVu
Y3Rpb24pLAotCi0gIC8qKgotICAgIEZpbmQgbXVsdGlwbGUgcmVjb3JkcyBhdCBvbmNlLgotCi0g
ICAgQnkgZGVmYXVsdCwgaXQgbG9vcHMgb3ZlciB0aGUgcHJvdmlkZWQgaWRzIGFuZCBjYWxscyBg
ZmluZGAgb24gZWFjaC4KLSAgICBNYXkgYmUgb3ZlcndyaXR0ZW4gdG8gaW1wcm92ZSBwZXJmb3Jt
YW5jZSBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YKLSAgICBzZXJ2ZXIgcmVxdWVzdHMuCi0KLSAg
ICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRl
ciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgaWRzKSB7Ci0gICAgICAgIHZhciB1cmwgPSB0eXBlOwotICAgICAgICByZXR1cm4gbmV3
IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAg
ICBqUXVlcnkuZ2V0SlNPTih1cmwsIHtpZHM6IGlkc30pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewot
ICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAgICAgICAgIH0s
IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFt
ZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihu
dWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGZpbmRNYW55Ci0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAg
dGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNvcmRzCi0gICAgQHBhcmFtIHtBcnJheX0gICAg
aWRzCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kTWFueTogZnVu
Y3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgewotICAgIHZhciBwcm9taXNlcyA9IG1hcC5jYWxsKGlk
cywgZnVuY3Rpb24oaWQpIHsKLSAgICAgIHJldHVybiB0aGlzLmZpbmQoc3RvcmUsIHR5cGUsIGlk
KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBFbWJlci5SU1ZQLmFsbChwcm9taXNlcyk7
Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUg
ZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgZm10ID0gRW1iZXIuU3RyaW5n
LmZtdCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLXZh
ciBjb3VudGVyID0gMDsKLQotLyoqCi0gIGBEUy5GaXh0dXJlQWRhcHRlcmAgaXMgYW4gYWRhcHRl
ciB0aGF0IGxvYWRzIHJlY29yZHMgZnJvbSBtZW1vcnkuCi0gIEl0cyBwcmltYXJpbHkgdXNlZCBm
b3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuIFlvdSBjYW4gYWxzbyB1c2UKLSAgYERTLkZpeHR1
cmVBZGFwdGVyYCB3aGlsZSB3b3JraW5nIG9uIHRoZSBBUEkgYnV0IGFyZSBub3QgcmVhZHkgdG8K
LSAgaW50ZWdyYXRlIHlldC4gSXQgaXMgYSBmdWxseSBmdW5jdGlvbmluZyBhZGFwdGVyLiBBbGwg
Q1JVRCBtZXRob2RzCi0gIGFyZSBpbXBsZW1lbnRlZC4gWW91IGNhbiBhbHNvIGltcGxlbWVudCBx
dWVyeSBsb2dpYyB0aGF0IGEgcmVtb3RlCi0gIHN5c3RlbSB3b3VsZCBkby4gSXRzIHBvc3NpYmxl
IHRvIGRvIGRldmVsb3AgeW91ciBlbnRpcmUgYXBwbGljYXRpb24KLSAgd2l0aCBgRFMuRml4dHVy
ZUFkYXB0ZXJgLgotCi0gIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBgRml4dHVy
ZUFkYXB0ZXJgIGluIHlvdXIKLSAgYXBwbGljYXRpb24gcGxlYXNlIHNlZSB0aGUgW0ZpeHR1cmVB
ZGFwdGVyCi0gIGd1aWRlXSgvZ3VpZGVzL21vZGVscy90aGUtZml4dHVyZS1hZGFwdGVyLykuCi0K
LSAgQGNsYXNzIEZpeHR1cmVBZGFwdGVyCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRFMu
QWRhcHRlcgotKi8KLURTLkZpeHR1cmVBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAv
LyBieSBkZWZhdWx0LCBmaXh0dXJlcyBhcmUgYWxyZWFkeSBpbiBub3JtYWxpemVkIGZvcm0KLSAg
c2VyaWFsaXplcjogbnVsbCwKLQotICAvKioKLSAgICBJZiBgc2ltdWxhdGVSZW1vdGVSZXNwb25z
ZWAgaXMgYHRydWVgIHRoZSBgRml4dHVyZUFkYXB0ZXJgIHdpbGwKLSAgICB3YWl0IGEgbnVtYmVy
IG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGggdGhlCi0gICAg
Zml4dHVyZSB2YWx1ZXMuIFRoZSB3YWl0IHRpbWUgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBg
bGF0ZW5jeWAKLSAgICBwcm9wZXJ0eS4KLQotICAgIEBwcm9wZXJ0eSBzaW11bGF0ZVJlbW90ZVJl
c3BvbnNlCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQGRlZmF1bHQgdHJ1ZQotICAqLwotICBz
aW11bGF0ZVJlbW90ZVJlc3BvbnNlOiB0cnVlLAotCi0gIC8qKgotICAgIEJ5IGRlZmF1bHQgdGhl
IGBGaXh0dXJlQWRhcHRlcmAgd2lsbCBzaW11bGF0ZSBhIHdhaXQgb2YgdGhlCi0gICAgYGxhdGVu
Y3lgIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGggdGhlIGZpeHR1
cmUKLSAgICB2YWx1ZXMuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHR1cm5lZCBvZmYgdmlhIHRoZQot
ICAgIGBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlYCBwcm9wZXJ0eS4KLQotICAgIEBwcm9wZXJ0eSBs
YXRlbmN5Ci0gICAgQHR5cGUge051bWJlcn0KLSAgICBAZGVmYXVsdCA1MAotICAqLwotICBsYXRl
bmN5OiA1MCwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8g
cHJvdmlkZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUKLQotICAgIEBtZXRob2QgZml4dHVy
ZXNGb3JUeXBlCi0gICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBy
ZXR1cm4ge0FycmF5fQotICAqLwotICBmaXh0dXJlc0ZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsK
LSAgICBpZiAodHlwZS5GSVhUVVJFUykgewotICAgICAgdmFyIGZpeHR1cmVzID0gRW1iZXIuQSh0
eXBlLkZJWFRVUkVTKTsKLSAgICAgIHJldHVybiBmaXh0dXJlcy5tYXAoZnVuY3Rpb24oZml4dHVy
ZSl7Ci0gICAgICAgIHZhciBmaXh0dXJlSWRUeXBlID0gdHlwZW9mIGZpeHR1cmUuaWQ7Ci0gICAg
ICAgIGlmKGZpeHR1cmVJZFR5cGUgIT09ICJudW1iZXIiICYmIGZpeHR1cmVJZFR5cGUgIT09ICJz
dHJpbmciKXsKLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZm10KCd0aGUgaWQgcHJvcGVydHkg
bXVzdCBiZSBkZWZpbmVkIGFzIGEgbnVtYmVyIG9yIHN0cmluZyBmb3IgZml4dHVyZSAlQCcsIFtm
aXh0dXJlXSkpOwotICAgICAgICB9Ci0gICAgICAgIGZpeHR1cmUuaWQgPSBmaXh0dXJlLmlkICsg
Jyc7Ci0gICAgICAgIHJldHVybiBmaXh0dXJlOwotICAgICAgfSk7Ci0gICAgfQotICAgIHJldHVy
biBudWxsOwotICB9LAotCi0gIC8qKgotICAgIEltcGxlbWVudCB0aGlzIG1ldGhvZCBpbiBvcmRl
ciB0byBxdWVyeSBmaXh0dXJlcyBkYXRhCi0KLSAgICBAbWV0aG9kIHF1ZXJ5Rml4dHVyZXMKLSAg
ICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAg
QHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEByZXR1cm4ge1Byb21pc2V8
QXJyYXl9Ci0gICovCi0gIHF1ZXJ5Rml4dHVyZXM6IGZ1bmN0aW9uKGZpeHR1cmVzLCBxdWVyeSwg
dHlwZSkgewotICAgIEVtYmVyLmFzc2VydCgnTm90IGltcGxlbWVudGVkOiBZb3UgbXVzdCBvdmVy
cmlkZSB0aGUgRFMuRml4dHVyZUFkYXB0ZXI6OnF1ZXJ5Rml4dHVyZXMgbWV0aG9kIHRvIHN1cHBv
cnQgcXVlcnlpbmcgdGhlIGZpeHR1cmUgc3RvcmUuJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCB1cGRhdGVGaXh0dXJlcwotICAgIEBwYXJhbSB7U3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5
cGUKLSAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCi0gICovCi0gIHVwZGF0ZUZpeHR1cmVzOiBm
dW5jdGlvbih0eXBlLCBmaXh0dXJlKSB7Ci0gICAgaWYoIXR5cGUuRklYVFVSRVMpIHsKLSAgICAg
IHR5cGUuRklYVFVSRVMgPSBbXTsKLSAgICB9Ci0KLSAgICB2YXIgZml4dHVyZXMgPSB0eXBlLkZJ
WFRVUkVTOwotCi0gICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOwot
Ci0gICAgZml4dHVyZXMucHVzaChmaXh0dXJlKTsKLSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1l
bnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBqc29uIGZvciBDUlVEIG1ldGhvZHMK
LQotICAgIEBtZXRob2QgbW9ja0pTT04KLSAgICBAcGFyYW0ge1N1YmNsYXNzIG9mIERTLk1vZGVs
fSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIG1vY2tKU09OOiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgcmV0dXJuIHN0b3JlLnNlcmlhbGl6
ZXJGb3IodHlwZSkuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3JkCi0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJu
IHtTdHJpbmd9IGlkCi0gICovCi0gIGdlbmVyYXRlSWRGb3JSZWNvcmQ6IGZ1bmN0aW9uKHN0b3Jl
KSB7Ci0gICAgcmV0dXJuICJmaXh0dXJlLSIgKyBjb3VudGVyKys7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0g
e3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgaWQpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBl
KSwKLSAgICAgICAgZml4dHVyZTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQg
Zml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQot
ICAgIGlmIChmaXh0dXJlcykgewotICAgICAgZml4dHVyZSA9IEVtYmVyLkEoZml4dHVyZXMpLmZp
bmRQcm9wZXJ0eSgnaWQnLCBpZCk7Ci0gICAgfQotCi0gICAgaWYgKGZpeHR1cmUpIHsKLSAgICAg
IHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0
dXJuIGZpeHR1cmU7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IGlkcwotICAg
IEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCBpZHMpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlw
ZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9y
IG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGlmIChmaXh0
dXJlcykgewotICAgICAgZml4dHVyZXMgPSBmaXh0dXJlcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkg
ewotICAgICAgICByZXR1cm4gaW5kZXhPZihpZHMsIGl0ZW0uaWQpICE9PSAtMTsKLSAgICAgIH0p
OwotICAgIH0KLQotICAgIGlmIChmaXh0dXJlcykgewotICAgICAgcmV0dXJuIHRoaXMuc2ltdWxh
dGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gZml4dHVyZXM7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIGZpbmRBbGwKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30gc2luY2VUb2tlbgot
ICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEFsbDogZnVuY3Rpb24o
c3RvcmUsIHR5cGUpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0
eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1v
ZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIHJldHVybiB0aGlz
LnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBmaXh0dXJlczsK
LSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
ZmluZFF1ZXJ5Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAgQHBh
cmFtIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9IHJlY29yZEFycmF5Ci0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3Jl
LCB0eXBlLCBxdWVyeSwgYXJyYXkpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVz
Rm9yVHlwZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVy
ZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGZp
eHR1cmVzID0gdGhpcy5xdWVyeUZpeHR1cmVzKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSk7Ci0KLSAg
ICBpZiAoZml4dHVyZXMpIHsKLSAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChm
dW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpeHR1cmVzOwotICAgICAgfSwgdGhpcyk7Ci0g
ICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkCi0gICAgQHBhcmFt
IHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQp
IHsKLSAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9ja0pTT04oc3RvcmUsIHR5cGUsIHJlY29yZCk7
Ci0KLSAgICB0aGlzLnVwZGF0ZUZpeHR1cmVzKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0dXJu
IHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGZpeHR1
cmU7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJu
IHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUs
IHR5cGUsIHJlY29yZCkgewotICAgIHZhciBmaXh0dXJlID0gdGhpcy5tb2NrSlNPTihzdG9yZSwg
dHlwZSwgcmVjb3JkKTsKLQotICAgIHRoaXMudXBkYXRlRml4dHVyZXModHlwZSwgZml4dHVyZSk7
Ci0KLSAgICByZXR1cm4gdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24oKSB7Ci0gICAg
ICByZXR1cm4gZml4dHVyZTsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0
aG9kIGRlbGV0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y
ZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1v
Y2tKU09OKHN0b3JlLCB0eXBlLCByZWNvcmQpOwotCi0gICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0
dXJlKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxs
KGZ1bmN0aW9uKCkgewotICAgICAgLy8gbm8gcGF5bG9hZCBpbiBhIGRlbGV0aW9uCi0gICAgICBy
ZXR1cm4gbnVsbDsKLSAgICB9KTsKLSAgfSwKLQotICAvKgotICAgIEBtZXRob2QgZGVsZXRlTG9h
ZGVkRml4dHVyZQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHR5cGUKLSAgICBAcGFyYW0gcmVj
b3JkCi0gICovCi0gIGRlbGV0ZUxvYWRlZEZpeHR1cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkg
ewotICAgIHZhciBleGlzdGluZ0ZpeHR1cmUgPSB0aGlzLmZpbmRFeGlzdGluZ0ZpeHR1cmUodHlw
ZSwgcmVjb3JkKTsKLQotICAgIGlmKGV4aXN0aW5nRml4dHVyZSkgewotICAgICAgdmFyIGluZGV4
ID0gaW5kZXhPZih0eXBlLkZJWFRVUkVTLCBleGlzdGluZ0ZpeHR1cmUpOwotICAgICAgdHlwZS5G
SVhUVVJFUy5zcGxpY2UoaW5kZXgsIDEpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9
LAotCi0gIC8qCi0gICAgQG1ldGhvZCBmaW5kRXhpc3RpbmdGaXh0dXJlCi0gICAgQHByaXZhdGUK
LSAgICBAcGFyYW0gdHlwZQotICAgIEBwYXJhbSByZWNvcmQKLSAgKi8KLSAgZmluZEV4aXN0aW5n
Rml4dHVyZTogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGZpeHR1cmVzID0gdGhp
cy5maXh0dXJlc0ZvclR5cGUodHlwZSk7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7
Ci0KLSAgICByZXR1cm4gdGhpcy5maW5kRml4dHVyZUJ5SWQoZml4dHVyZXMsIGlkKTsKLSAgfSwK
LQotICAvKgotICAgIEBtZXRob2QgZmluZEZpeHR1cmVCeUlkCi0gICAgQHByaXZhdGUKLSAgICBA
cGFyYW0gZml4dHVyZXMKLSAgICBAcGFyYW0gaWQKLSAgKi8KLSAgZmluZEZpeHR1cmVCeUlkOiBm
dW5jdGlvbihmaXh0dXJlcywgaWQpIHsKLSAgICByZXR1cm4gRW1iZXIuQShmaXh0dXJlcykuZmlu
ZChmdW5jdGlvbihyKSB7Ci0gICAgICBpZignJytnZXQociwgJ2lkJykgPT09ICcnK2lkKSB7Ci0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIC8qCi0gICAgQG1ldGhvZCBzaW11bGF0ZVJl
bW90ZUNhbGwKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSBjYWxsYmFjawotICAgIEBwYXJhbSBj
b250ZXh0Ci0gICovCi0gIHNpbXVsYXRlUmVtb3RlQ2FsbDogZnVuY3Rpb24oY2FsbGJhY2ssIGNv
bnRleHQpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVy
LlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7Ci0gICAgICBpZiAoZ2V0KGFkYXB0ZXIs
ICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsKLSAgICAgICAgLy8gU2NoZWR1bGUgd2l0aCBz
ZXRUaW1lb3V0Ci0gICAgICAgIEVtYmVyLnJ1bi5sYXRlcihmdW5jdGlvbigpIHsKLSAgICAgICAg
ICByZXNvbHZlKGNhbGxiYWNrLmNhbGwoY29udGV4dCkpOwotICAgICAgICB9LCBnZXQoYWRhcHRl
ciwgJ2xhdGVuY3knKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBBc3luY2hyb25vdXMs
IGJ1dCBhdCB0aGUgb2YgdGhlIHJ1bmxvb3Agd2l0aCB6ZXJvIGxhdGVuY3kKLSAgICAgICAgRW1i
ZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgbnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
cmVzb2x2ZShjYWxsYmFjay5jYWxsKGNvbnRleHQpKTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0g
ICAgfSwgIkRTOiBGaXh0dXJlQWRhcHRlciNzaW11bGF0ZVJlbW90ZUNhbGwiKTsKLSAgfQotfSk7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRh
Ci0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFj
aCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Ci12YXIgbWFwID0gRW1iZXIuQXJyYXlQ
b2x5ZmlsbHMubWFwOwotCi1mdW5jdGlvbiBjb2VyY2VJZChpZCkgewotICByZXR1cm4gaWQgPT0g
bnVsbCA/IG51bGwgOiBpZCsnJzsKLX0KLQotLyoqCi0gIE5vcm1hbGx5LCBhcHBsaWNhdGlvbnMg
d2lsbCB1c2UgdGhlIGBSRVNUU2VyaWFsaXplcmAgYnkgaW1wbGVtZW50aW5nCi0gIHRoZSBgbm9y
bWFsaXplYCBtZXRob2QgYW5kIGluZGl2aWR1YWwgbm9ybWFsaXphdGlvbnMgdW5kZXIKLSAgYG5v
cm1hbGl6ZUhhc2hgLgotCi0gIFRoaXMgYWxsb3dzIHlvdSB0byBkbyB3aGF0ZXZlciBraW5kIG9m
IG11bmdpbmcgeW91IG5lZWQsIGFuZCBpcwotICBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3VyIHNl
cnZlciBpcyBpbmNvbnNpc3RlbnQgYW5kIHlvdSBuZWVkIHRvCi0gIGRvIG11bmdpbmcgZGlmZmVy
ZW50bHkgZm9yIG1hbnkgZGlmZmVyZW50IGtpbmRzIG9mIHJlc3BvbnNlcy4KLQotICBTZWUgdGhl
IGBub3JtYWxpemVgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIyMg
QWNyb3NzIHRoZSBCb2FyZCBOb3JtYWxpemF0aW9uCi0KLSAgVGhlcmUgYXJlIGFsc28gYSBudW1i
ZXIgb2YgaG9va3MgdGhhdCB5b3UgbWlnaHQgZmluZCB1c2VmdWwgdG8gZGVmaW5lZAotICBhY3Jv
c3MtdGhlLWJvYXJkIHJ1bGVzIGZvciB5b3VyIHBheWxvYWQuIFRoZXNlIHJ1bGVzIHdpbGwgYmUg
dXNlZnVsCi0gIGlmIHlvdXIgc2VydmVyIGlzIGNvbnNpc3RlbnQsIG9yIGlmIHlvdSdyZSBidWls
ZGluZyBhbiBhZGFwdGVyIGZvcgotICBhbiBpbmZyYXN0cnVjdHVyZSBzZXJ2aWNlLCBsaWtlIFBh
cnNlLCBhbmQgd2FudCB0byBlbmNvZGUgc2VydmljZQotICBjb252ZW50aW9ucy4KLQotICBGb3Ig
ZXhhbXBsZSwgaWYgYWxsIG9mIHlvdXIga2V5cyBhcmUgdW5kZXJzY29yZWQgYW5kIGFsbC1jYXBz
LCBidXQKLSAgb3RoZXJ3aXNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgbmFtZXMgeW91IHVzZSBpbiB5
b3VyIG1vZGVscywgeW91Ci0gIGNhbiBpbXBsZW1lbnQgYWNyb3NzLXRoZS1ib2FyZCBydWxlcyBm
b3IgaG93IHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlCi0gIG5hbWUgaW4geW91ciBtb2RlbCB0byBh
IGtleSBpbiB5b3VyIEpTT04uCi0KLSAgYGBganMKLSAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXpl
ciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAga2V5Rm9yQXR0cmlidXRlOiBmdW5j
dGlvbihhdHRyKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0ciku
dG9VcHBlckNhc2UoKTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBZb3UgY2FuIGFsc28gaW1w
bGVtZW50IGBrZXlGb3JSZWxhdGlvbnNoaXBgLCB3aGljaCB0YWtlcyB0aGUgbmFtZQotICBvZiB0
aGUgcmVsYXRpb25zaGlwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFuZCB0aGUga2luZCBvZgot
ICByZWxhdGlvbnNoaXAgKGBoYXNNYW55YCBvciBgYmVsb25nc1RvYCkgYXMgdGhlIHNlY29uZCBw
YXJhbWV0ZXIuCi0KLSAgQGNsYXNzIFJFU1RTZXJpYWxpemVyCi0gIEBuYW1lc3BhY2UgRFMKLSAg
QGV4dGVuZHMgRFMuSlNPTlNlcmlhbGl6ZXIKLSovCi1EUy5SRVNUU2VyaWFsaXplciA9IERTLkpT
T05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gIC8qKgotICAgIElmIHlvdSB3YW50IHRvIGRvIG5vcm1h
bGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwgeW91Ci0gICAg
Y2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hgLgotCi0gICAgRm9yIGV4YW1w
bGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcganNvbiB3aGVyZSB0aGUgdGhlIGBJRHNgIHVuZGVyCi0g
ICAgYCJjb21tZW50cyJgIGFyZSBwcm92aWRlZCBhcyBgX2lkYCBpbnN0ZWFkIG9mIGBpZGAuCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAgICAgInBvc3QiOiB7Ci0gICAgICAgICJpZCI6
IDEsCi0gICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICAgImNvbW1l
bnRzIjogWyAxLCAyIF0KLSAgICAgIH0sCi0gICAgICAiY29tbWVudHMiOiBbewotICAgICAgICAi
X2lkIjogMSwKLSAgICAgICAgImJvZHkiOiAiRklSU1QiCi0gICAgICB9LCB7Ci0gICAgICAgICJf
aWQiOiAyLAotICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgIH1dCi0gICAg
fQotICAgIGBgYAotCi0gICAgWW91IHVzZSBgbm9ybWFsaXplSGFzaGAgdG8gbm9ybWFsaXplIGp1
c3QgdGhlIGNvbW1lbnRzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFs
aXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBub3JtYWxpemVIYXNoOiB7
Ci0gICAgICAgIGNvbW1lbnRzOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgICAgaGFzaC5pZCA9
IGhhc2guX2lkOwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICByZXR1cm4g
aGFzaDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhlIGtl
eSB1bmRlciBgbm9ybWFsaXplSGFzaGAgaXMgdXN1YWxseSBqdXN0IHRoZSBvcmlnaW5hbCBrZXkK
LSAgICB0aGF0IHdhcyBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZC4gSG93ZXZlciwga2V5IG5hbWVz
IHdpbGwgYmUKLSAgICBpbXBhY3RlZCBieSBhbnkgbW9kaWZpY2F0aW9ucyBkb25lIGluIHRoZSBg
bm9ybWFsaXplUGF5bG9hZGAKLSAgICBtZXRob2QuIFRoZSBgRFMuUkVTVFNlcmlhbGl6ZXJgJ3Mg
ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBubwotICAgIGNoYW5nZXMgdG8gdGhlIHBheWxv
YWQga2V5cy4KLQotICAgIEBwcm9wZXJ0eSBub3JtYWxpemVIYXNoCi0gICAgQHR5cGUge09iamVj
dH0KLSAgICBAZGVmYXVsdCB1bmRlZmluZWQKLSAgKi8KLQotICAvKioKLSAgICBOb3JtYWxpemVz
IGEgcGFydCBvZiB0aGUgSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5Ci0gICAgdGhlIHNlcnZlci4g
WW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgbXVuZ2UgdGhlIGhhc2gKLSAgICBhbmQg
Y2FsbCBzdXBlciBpZiB5b3UgaGF2ZSBnZW5lcmljIG5vcm1hbGl6YXRpb24gdG8gZG8uCi0KLSAg
ICBJdCB0YWtlcyB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHRoYXQgaXMgYmVpbmcgbm9ybWFsaXpl
ZAotICAgIChhcyBhIERTLk1vZGVsIGNsYXNzKSwgdGhlIHByb3BlcnR5IHdoZXJlIHRoZSBoYXNo
IHdhcwotICAgIG9yaWdpbmFsbHkgZm91bmQsIGFuZCB0aGUgaGFzaCB0byBub3JtYWxpemUuCi0K
LSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXlsb2FkIHRoYXQgbG9va3MgbGlrZSB0
aGlzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAicG9zdCI6IHsKLSAgICAgICAgImlkIjog
MSwKLSAgICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAotICAgICAgICAiY29tbWVu
dHMiOiBbIDEsIDIgXQotICAgICAgfSwKLSAgICAgICJjb21tZW50cyI6IFt7Ci0gICAgICAgICJp
ZCI6IDEsCi0gICAgICAgICJib2R5IjogIkZJUlNUIgotICAgICAgfSwgewotICAgICAgICAiaWQi
OiAyLAotICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgIH1dCi0gICAgfQot
ICAgIGBgYAotCi0gICAgVGhlIGBub3JtYWxpemVgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aHJl
ZSB0aW1lczoKLQotICAgICogV2l0aCBgQXBwLlBvc3RgLCBgInBvc3RzImAgYW5kIGB7IGlkOiAx
LCB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiLCAuLi4gfWAKLSAgICAqIFdpdGggYEFwcC5Db21t
ZW50YCwgYCJjb21tZW50cyJgIGFuZCBgeyBpZDogMSwgYm9keTogIkZJUlNUIiB9YAotICAgICog
V2l0aCBgQXBwLkNvbW1lbnRgLCBgImNvbW1lbnRzImAgYW5kIGB7IGlkOiAyLCBib2R5OiAiUmFp
bHMgaXMgdW5hZ2kiIH1gCi0KLSAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCwgZm9yIGV4YW1w
bGUsIHRvIG5vcm1hbGl6ZSB1bmRlcnNjb3JlZCBrZXlzIHRvIGNhbWVsaXplZAotICAgIG9yIG90
aGVyIGdlbmVyYWwtcHVycG9zZSBub3JtYWxpemF0aW9ucy4KLQotICAgIElmIHlvdSB3YW50IHRv
IGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwg
eW91Ci0gICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hgLgotCi0gICAg
Rm9yIGV4YW1wbGUsIGlmIHRoZSBgSURzYCB1bmRlciBgImNvbW1lbnRzImAgYXJlIHByb3ZpZGVk
IGFzIGBfaWRgIGluc3RlYWQgb2YKLSAgICBgaWRgLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRvIG5v
cm1hbGl6ZSBqdXN0IHRoZSBjb21tZW50czoKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJp
YWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIG5vcm1hbGl6ZUhhc2g6
IHsKLSAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICAgICAgICBoYXNoLmlk
ID0gaGFzaC5faWQ7Ci0gICAgICAgICAgZGVsZXRlIGhhc2guX2lkOwotICAgICAgICAgIHJldHVy
biBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUg
a2V5IHVuZGVyIGBub3JtYWxpemVIYXNoYCBpcyBqdXN0IHRoZSBvcmlnaW5hbCBrZXkgdGhhdCB3
YXMgaW4gdGhlIG9yaWdpbmFsCi0gICAgcGF5bG9hZC4KLQotICAgIEBtZXRob2Qgbm9ybWFsaXpl
Ci0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtTdHJpbmd9IHByb3AKLSAgICBAcmV0dXJucyB7T2JqZWN0
fQotICAqLwotICBub3JtYWxpemU6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIHByb3ApIHsKLSAgICB0
aGlzLm5vcm1hbGl6ZUlkKGhhc2gpOwotICAgIHRoaXMubm9ybWFsaXplQXR0cmlidXRlcyh0eXBl
LCBoYXNoKTsKLSAgICB0aGlzLm5vcm1hbGl6ZVJlbGF0aW9uc2hpcHModHlwZSwgaGFzaCk7Ci0K
LSAgICB0aGlzLm5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nKHR5cGUsIGhhc2gpOwotCi0g
ICAgaWYgKHRoaXMubm9ybWFsaXplSGFzaCAmJiB0aGlzLm5vcm1hbGl6ZUhhc2hbcHJvcF0pIHsK
LSAgICAgIHRoaXMubm9ybWFsaXplSGFzaFtwcm9wXShoYXNoKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdGhpcy5fc3VwZXIodHlwZSwgaGFzaCwgcHJvcCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91
IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm9ybWFsaXplIGFsbCBwYXlsb2FkcywgcmVnYXJkbGVz
cyBvZiB3aGV0aGVyIHRoZXkKLSAgICByZXByZXNlbnQgc2luZ2xlIHJlY29yZHMgb3IgYW4gYXJy
YXkuCi0KLSAgICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcmVtb3ZlIHNvbWUgZXh0
cmFuZW91cyBkYXRhIGZyb20gdGhlIHBheWxvYWQ6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBs
aWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICAgbm9y
bWFsaXplUGF5bG9hZDogZnVuY3Rpb24odHlwZSwgcGF5bG9hZCkgewotICAgICAgICBkZWxldGUg
cGF5bG9hZC52ZXJzaW9uOwotICAgICAgICBkZWxldGUgcGF5bG9hZC5zdGF0dXM7Ci0gICAgICAg
IHJldHVybiBwYXlsb2FkOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBub3JtYWxpemVQYXlsb2FkCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHJldHVybnMge09iamVjdH0gdGhlIG5v
cm1hbGl6ZWQgcGF5bG9hZAotICAqLwotICBub3JtYWxpemVQYXlsb2FkOiBmdW5jdGlvbih0eXBl
LCBwYXlsb2FkKSB7Ci0gICAgcmV0dXJuIHBheWxvYWQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCBub3JtYWxpemVJZAotICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6ZUlkOiBmdW5j
dGlvbihoYXNoKSB7Ci0gICAgdmFyIHByaW1hcnlLZXkgPSBnZXQodGhpcywgJ3ByaW1hcnlLZXkn
KTsKLQotICAgIGlmIChwcmltYXJ5S2V5ID09PSAnaWQnKSB7IHJldHVybjsgfQotCi0gICAgaGFz
aC5pZCA9IGhhc2hbcHJpbWFyeUtleV07Ci0gICAgZGVsZXRlIGhhc2hbcHJpbWFyeUtleV07Ci0g
IH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3JtYWxpemVVc2luZ0RlY2xhcmVkTWFwcGluZwot
ICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nOiBmdW5j
dGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIGF0dHJzID0gZ2V0KHRoaXMsICdhdHRycycpLCBw
YXlsb2FkS2V5LCBrZXk7Ci0KLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAoa2V5IGluIGF0
dHJzKSB7Ci0gICAgICAgIHBheWxvYWRLZXkgPSBhdHRyc1trZXldOwotICAgICAgICBpZiAocGF5
bG9hZEtleSAmJiBwYXlsb2FkS2V5LmtleSkgewotICAgICAgICAgIHBheWxvYWRLZXkgPSBwYXls
b2FkS2V5LmtleTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZW9mIHBheWxvYWRLZXkgPT09
ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgaGFzaFtrZXldID0gaGFzaFtwYXlsb2FkS2V5XTsKLSAg
ICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgICAgfQotICAgICAgfQotICAg
IH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIG5vcm1hbGl6ZUF0dHJpYnV0ZXMKLSAgICBA
cHJpdmF0ZQotICAqLwotICBub3JtYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbih0eXBlLCBoYXNo
KSB7Ci0gICAgdmFyIHBheWxvYWRLZXksIGtleTsKLQotICAgIGlmICh0aGlzLmtleUZvckF0dHJp
YnV0ZSkgewotICAgICAgdHlwZS5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSkgewotICAgICAg
ICBwYXlsb2FkS2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICAgICAgaWYgKGtl
eSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KLQotICAgICAgICBoYXNoW2tleV0gPSBoYXNo
W3BheWxvYWRLZXldOwotICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgIH0s
IHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIG5vcm1hbGl6ZVJlbGF0
aW9uc2hpcHMKLSAgICBAcHJpdmF0ZQotICAqLwotICBub3JtYWxpemVSZWxhdGlvbnNoaXBzOiBm
dW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIHBheWxvYWRLZXksIGtleTsKLQotICAgIGlm
ICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgewotICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlw
KGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHBheWxvYWRLZXkgPSB0aGlz
LmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKLSAgICAgICAgaWYg
KGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KLQotICAgICAgICBoYXNoW2tleV0gPSBo
YXNoW3BheWxvYWRLZXldOwotICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAg
IH0sIHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0aGUgc2Vy
dmVyIGhhcyByZXR1cm5lZCBhIHBheWxvYWQgcmVwcmVzZW50aW5nCi0gICAgYSBzaW5nbGUgcmVj
b3JkLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRgIG9yIGBzYXZlYC4KLQotICAgIEl0
IGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdXAgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGlu
dG8gdGhlIG5vcm1hbGl6ZWQKLSAgICBmb3JtIGV4cGVjdGVkIGJ5IEVtYmVyIERhdGEuCi0KLSAg
ICBJZiB5b3Ugd2FudCwgeW91IGNhbiBqdXN0IHJlc3RydWN0dXJlIHRoZSB0b3AtbGV2ZWwgb2Yg
eW91ciBwYXlsb2FkLCBhbmQKLSAgICBkbyBtb3JlIGZpbmUtZ3JhaW5lZCBub3JtYWxpemF0aW9u
IGluIHRoZSBgbm9ybWFsaXplYCBtZXRob2QuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhh
dmUgYSBwYXlsb2FkIGxpa2UgdGhpcyBpbiByZXNwb25zZSB0byBhIHJlcXVlc3QgZm9yCi0gICAg
cG9zdCAxOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAiaWQiOiAxLAotICAgICAgInRpdGxl
IjogIlJhaWxzIGlzIG9tYWthc2UiLAotCi0gICAgICAiX2VtYmVkZGVkIjogewotICAgICAgICAi
Y29tbWVudCI6IFt7Ci0gICAgICAgICAgIl9pZCI6IDEsCi0gICAgICAgICAgImNvbW1lbnRfdGl0
bGUiOiAiRklSU1QiCi0gICAgICAgIH0sIHsKLSAgICAgICAgICAiX2lkIjogMiwKLSAgICAgICAg
ICAiY29tbWVudF90aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgICAgfV0KLSAgICAgIH0K
LSAgICB9Ci0gICAgYGBgCi0KLSAgICBZb3UgY291bGQgaW1wbGVtZW50IGEgc2VyaWFsaXplciB0
aGF0IGxvb2tzIGxpa2UgdGhpcyB0byBnZXQgeW91ciBwYXlsb2FkCi0gICAgaW50byBzaGFwZToK
LQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIu
ZXh0ZW5kKHsKLSAgICAgIC8vIEZpcnN0LCByZXN0cnVjdHVyZSB0aGUgdG9wLWxldmVsIHNvIGl0
J3Mgb3JnYW5pemVkIGJ5IHR5cGUKLSAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3Jl
LCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsKLSAgICAgICAgdmFyIGNvbW1lbnRz
ID0gcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudDsKLSAgICAgICAgZGVsZXRlIHBheWxvYWQuX2Vt
YmVkZGVkOwotCi0gICAgICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdDog
cGF5bG9hZCB9OwotICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxv
YWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gICAgICB9LAotCi0gICAgICBub3JtYWxpemVIYXNoOiB7
Ci0gICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAo
YWZ0ZXIgYGV4dHJhY3RgKQotICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1l
bnRzYAotICAgICAgICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgewotICAgICAgICAgIGhhc2gu
aWQgPSBoYXNoLl9pZDsKLSAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxl
OwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICBkZWxldGUgaGFzaC5jb21t
ZW50X3RpdGxlOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSkKLSAgICBgYGAKLQotICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBp
bXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdFNpbmdsZWAsIHRoZQotICAgIGJ1aWx0LWluIGltcGxl
bWVudGF0aW9uIHdpbGwgZmluZCB0aGUgcHJpbWFyeSByZWNvcmQgaW4geW91ciBub3JtYWxpemVk
Ci0gICAgcGF5bG9hZCBhbmQgcHVzaCB0aGUgcmVtYWluaW5nIHJlY29yZHMgaW50byB0aGUgc3Rv
cmUuCi0KLSAgICBUaGUgcHJpbWFyeSByZWNvcmQgaXMgdGhlIHNpbmdsZSBoYXNoIGZvdW5kIHVu
ZGVyIGBwb3N0YCBvciB0aGUgZmlyc3QKLSAgICBlbGVtZW50IG9mIHRoZSBgcG9zdHNgIGFycmF5
LgotCi0gICAgVGhlIHByaW1hcnkgcmVjb3JkIGhhcyBzcGVjaWFsIG1lYW5pbmcgd2hlbiB0aGUg
cmVjb3JkIGlzIGJlaW5nIGNyZWF0ZWQKLSAgICBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgdXBkYXRl
ZCAoYGNyZWF0ZVJlY29yZGAgb3IgYHVwZGF0ZVJlY29yZGApLiBJbgotICAgIHBhcnRpY3VsYXIs
IGl0IHdpbGwgdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZWNvcmQgdGhhdCB3YXMgc2F2
ZWQuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RTaW5nbGUKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcGF5bG9hZAotICAgIEBwYXJhbSB7U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7J2Zp
bmQnfCdjcmVhdGVSZWNvcmQnfCd1cGRhdGVSZWNvcmQnfCdkZWxldGVSZWNvcmQnfSByZXF1ZXN0
VHlwZQotICAgIEByZXR1cm5zIHtPYmplY3R9IHRoZSBwcmltYXJ5IHJlc3BvbnNlIHRvIHRoZSBv
cmlnaW5hbCByZXF1ZXN0Ci0gICovCi0gIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBw
cmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7Ci0gICAgcGF5bG9h
ZCA9IHRoaXMubm9ybWFsaXplUGF5bG9hZChwcmltYXJ5VHlwZSwgcGF5bG9hZCk7Ci0KLSAgICB2
YXIgcHJpbWFyeVR5cGVOYW1lID0gcHJpbWFyeVR5cGUudHlwZUtleSwKLSAgICAgICAgcHJpbWFy
eVJlY29yZDsKLQotICAgIGZvciAodmFyIHByb3AgaW4gcGF5bG9hZCkgewotICAgICAgdmFyIHR5
cGVOYW1lICA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCi0gICAgICAgICAgdHlwZSA9IHN0b3Jl
Lm1vZGVsRm9yKHR5cGVOYW1lKSwKLSAgICAgICAgICBpc1ByaW1hcnkgPSB0eXBlLnR5cGVLZXkg
PT09IHByaW1hcnlUeXBlTmFtZTsKLQotICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIHNpbmd1
bGFyIHJlc291cmNlcwotICAgICAgaWYgKGlzUHJpbWFyeSAmJiBFbWJlci50eXBlT2YocGF5bG9h
ZFtwcm9wXSkgIT09ICJhcnJheSIgKSB7Ci0gICAgICAgIHByaW1hcnlSZWNvcmQgPSB0aGlzLm5v
cm1hbGl6ZShwcmltYXJ5VHlwZSwgcGF5bG9hZFtwcm9wXSwgcHJvcCk7Ci0gICAgICAgIGNvbnRp
bnVlOwotICAgICAgfQotCi0gICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KLSAgICAgIGZv
ckVhY2guY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgIHZhciB0
eXBlTmFtZSA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCi0gICAgICAgICAgICB0eXBlID0gc3Rv
cmUubW9kZWxGb3IodHlwZU5hbWUpLAotICAgICAgICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9y
ZS5zZXJpYWxpemVyRm9yKHR5cGUpOwotCi0gICAgICAgIGhhc2ggPSB0eXBlU2VyaWFsaXplci5u
b3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0KLSAgICAgICAgdmFyIGlzRmlyc3RDcmVhdGVk
UmVjb3JkID0gaXNQcmltYXJ5ICYmICFyZWNvcmRJZCAmJiAhcHJpbWFyeVJlY29yZCwKLSAgICAg
ICAgICAgIGlzVXBkYXRlZFJlY29yZCA9IGlzUHJpbWFyeSAmJiBjb2VyY2VJZChoYXNoLmlkKSA9
PT0gcmVjb3JkSWQ7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgcHJpbWFyeSByZWNvcmQuCi0gICAg
ICAgIC8vCi0gICAgICAgIC8vIEl0J3MgZWl0aGVyOgotICAgICAgICAvLyAqIHRoZSByZWNvcmQg
d2l0aCB0aGUgc2FtZSBJRCBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdAotICAgICAgICAvLyAqIGlu
IHRoZSBjYXNlIG9mIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgdGhhdCBkaWRuJ3QgaGF2ZSBhbiBJ
RCwgdGhlIGZpcnN0Ci0gICAgICAgIC8vICAgcmVjb3JkIGluIHRoZSBBcnJheQotICAgICAgICBp
ZiAoaXNGaXJzdENyZWF0ZWRSZWNvcmQgfHwgaXNVcGRhdGVkUmVjb3JkKSB7Ci0gICAgICAgICAg
cHJpbWFyeVJlY29yZCA9IGhhc2g7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RvcmUu
cHVzaCh0eXBlTmFtZSwgaGFzaCk7Ci0gICAgICAgIH0KLSAgICAgIH0sIHRoaXMpOwotICAgIH0K
LQotICAgIHJldHVybiBwcmltYXJ5UmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3
aGVuIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkIGEgcGF5bG9hZCByZXByZXNlbnRpbmcKLSAgICBt
dWx0aXBsZSByZWNvcmRzLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRBbGxgIG9yIGBm
aW5kUXVlcnlgLgotCi0gICAgSXQgaXMgeW91ciBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCB0aGUg
c2VydmVyJ3MgcmVzcG9uc2UgaW50byB0aGUgbm9ybWFsaXplZAotICAgIGZvcm0gZXhwZWN0ZWQg
YnkgRW1iZXIgRGF0YS4KLQotICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGp1c3QgcmVzdHJ1Y3R1
cmUgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIHBheWxvYWQsIGFuZAotICAgIGRvIG1vcmUgZmluZS1n
cmFpbmVkIG5vcm1hbGl6YXRpb24gaW4gdGhlIGBub3JtYWxpemVgIG1ldGhvZC4KLQotICAgIEZv
ciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBheWxvYWQgbGlrZSB0aGlzIGluIHJlc3BvbnNlIHRv
IGEgcmVxdWVzdCBmb3IKLSAgICBhbGwgcG9zdHM6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAg
ICJfZW1iZWRkZWQiOiB7Ci0gICAgICAgICJwb3N0IjogW3sKLSAgICAgICAgICAiaWQiOiAxLAot
ICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIgotICAgICAgICB9LCB7Ci0gICAg
ICAgICAgImlkIjogMiwKLSAgICAgICAgICAidGl0bGUiOiAiVGhlIFBhcmxleSBMZXR0ZXIiCi0g
ICAgICAgIH1dLAotICAgICAgICAiY29tbWVudCI6IFt7Ci0gICAgICAgICAgIl9pZCI6IDEsCi0g
ICAgICAgICAgImNvbW1lbnRfdGl0bGUiOiAiUmFpbHMgaXMgdW5hZ2kiCi0gICAgICAgICAgInBv
c3RfaWQiOiAxCi0gICAgICAgIH0sIHsKLSAgICAgICAgICAiX2lkIjogMiwKLSAgICAgICAgICAi
Y29tbWVudF90aXRsZSI6ICJEb24ndCB0cmVhZCBvbiBtZSIsCi0gICAgICAgICAgInBvc3RfaWQi
OiAyCi0gICAgICAgIH1dCi0gICAgICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgWW91IGNvdWxk
IGltcGxlbWVudCBhIHNlcmlhbGl6ZXIgdGhhdCBsb29rcyBsaWtlIHRoaXMgdG8gZ2V0IHlvdXIg
cGF5bG9hZAotICAgIGludG8gc2hhcGU6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0U2VyaWFs
aXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICAvLyBGaXJzdCwgcmVzdHJ1
Y3R1cmUgdGhlIHRvcC1sZXZlbCBzbyBpdCdzIG9yZ2FuaXplZCBieSB0eXBlCi0gICAgICAvLyBh
bmQgdGhlIGNvbW1lbnRzIGFyZSBsaXN0ZWQgdW5kZXIgYSBwb3N0J3MgYGNvbW1lbnRzYCBrZXku
Ci0gICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwg
cmVxdWVzdFR5cGUpIHsKLSAgICAgICAgdmFyIHBvc3RzID0gcGF5bG9hZC5fZW1iZWRkZWQucG9z
dDsKLSAgICAgICAgdmFyIGNvbW1lbnRzID0gW107Ci0gICAgICAgIHZhciBwb3N0Q2FjaGUgPSB7
fTsKLQotICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1bmN0aW9uKHBvc3QpIHsKLSAgICAgICAgICBw
b3N0LmNvbW1lbnRzID0gW107Ci0gICAgICAgICAgcG9zdENhY2hlW3Bvc3QuaWRdID0gcG9zdDsK
LSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudC5mb3JFYWNo
KGZ1bmN0aW9uKGNvbW1lbnQpIHsKLSAgICAgICAgICBjb21tZW50cy5wdXNoKGNvbW1lbnQpOwot
ICAgICAgICAgIHBvc3RDYWNoZVtjb21tZW50LnBvc3RfaWRdLmNvbW1lbnRzLnB1c2goY29tbWVu
dCk7Ci0gICAgICAgICAgZGVsZXRlIGNvbW1lbnQucG9zdF9pZDsKLSAgICAgICAgfQotCi0gICAg
ICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdHM6IHBheWxvYWQgfTsKLQot
ICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1
ZXN0VHlwZSk7Ci0gICAgICB9LAotCi0gICAgICBub3JtYWxpemVIYXNoOiB7Ci0gICAgICAgIC8v
IE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAoYWZ0ZXIgYGV4dHJh
Y3RgKQotICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1lbnRzYAotICAgICAg
ICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgewotICAgICAgICAgIGhhc2guaWQgPSBoYXNoLl9p
ZDsKLSAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxlOwotICAgICAgICAg
IGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICBkZWxldGUgaGFzaC5jb21tZW50X3RpdGxlOwot
ICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSkKLSAgICBg
YGAKLQotICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBpbXBsZW1lbnRhdGlv
biBvZiBgZXh0cmFjdEFycmF5YCwgdGhlCi0gICAgYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gd2ls
bCBmaW5kIHRoZSBwcmltYXJ5IGFycmF5IGluIHlvdXIgbm9ybWFsaXplZAotICAgIHBheWxvYWQg
YW5kIHB1c2ggdGhlIHJlbWFpbmluZyByZWNvcmRzIGludG8gdGhlIHN0b3JlLgotCi0gICAgVGhl
IHByaW1hcnkgYXJyYXkgaXMgdGhlIGFycmF5IGZvdW5kIHVuZGVyIGBwb3N0c2AuCi0KLSAgICBU
aGUgcHJpbWFyeSByZWNvcmQgaGFzIHNwZWNpYWwgbWVhbmluZyB3aGVuIHJlc3BvbmRpbmcgdG8g
YGZpbmRRdWVyeWAKLSAgICBvciBgZmluZEhhc01hbnlgLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJp
bWFyeSBhcnJheSB3aWxsIGJlY29tZSB0aGUKLSAgICBsaXN0IG9mIHJlY29yZHMgaW4gdGhlIHJl
Y29yZCBhcnJheSB0aGF0IGtpY2tlZCBvZmYgdGhlIHJlcXVlc3QuCi0KLSAgICBJZiB5b3VyIHBy
aW1hcnkgYXJyYXkgY29udGFpbnMgc2Vjb25kYXJ5IChlbWJlZGRlZCkgcmVjb3JkcyBvZiB0aGUg
c2FtZSB0eXBlLAotICAgIHlvdSBjYW5ub3QgcGxhY2UgdGhlc2UgaW50byB0aGUgcHJpbWFyeSBh
cnJheSBgcG9zdHNgLiBJbnN0ZWFkLCBwbGFjZSB0aGUKLSAgICBzZWNvbmRhcnkgaXRlbXMgaW50
byBhbiB1bmRlcnNjb3JlIHByZWZpeGVkIHByb3BlcnR5IGBfcG9zdHNgLCB3aGljaCB3aWxsCi0g
ICAgcHVzaCB0aGVzZSBpdGVtcyBpbnRvIHRoZSBzdG9yZSBhbmQgd2lsbCBub3QgYWZmZWN0IHRo
ZSByZXN1bHRpbmcgcXVlcnkuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RBcnJheQotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHBhcmFtIHsnZmluZEFsbCd8J2Zp
bmRNYW55J3wnZmluZEhhc01hbnknfCdmaW5kUXVlcnknfSByZXF1ZXN0VHlwZQotICAgIEByZXR1
cm5zIHtBcnJheX0gVGhlIHByaW1hcnkgYXJyYXkgdGhhdCB3YXMgcmV0dXJuZWQgaW4gcmVzcG9u
c2UKLSAgICAgIHRvIHRoZSBvcmlnaW5hbCBxdWVyeS4KLSAgKi8KLSAgZXh0cmFjdEFycmF5OiBm
dW5jdGlvbihzdG9yZSwgcHJpbWFyeVR5cGUsIHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0gdGhp
cy5ub3JtYWxpemVQYXlsb2FkKHByaW1hcnlUeXBlLCBwYXlsb2FkKTsKLQotICAgIHZhciBwcmlt
YXJ5VHlwZU5hbWUgPSBwcmltYXJ5VHlwZS50eXBlS2V5LAotICAgICAgICBwcmltYXJ5QXJyYXk7
Ci0KLSAgICBmb3IgKHZhciBwcm9wIGluIHBheWxvYWQpIHsKLSAgICAgIHZhciB0eXBlS2V5ID0g
cHJvcCwKLSAgICAgICAgICBmb3JjZWRTZWNvbmRhcnkgPSBmYWxzZTsKLQotICAgICAgaWYgKHBy
b3AuY2hhckF0KDApID09PSAnXycpIHsKLSAgICAgICAgZm9yY2VkU2Vjb25kYXJ5ID0gdHJ1ZTsK
LSAgICAgICAgdHlwZUtleSA9IHByb3Auc3Vic3RyKDEpOwotICAgICAgfQotCi0gICAgICB2YXIg
dHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHR5cGVLZXkpLAotICAgICAgICAgIHR5cGUgPSBz
dG9yZS5tb2RlbEZvcih0eXBlTmFtZSksCi0gICAgICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9y
ZS5zZXJpYWxpemVyRm9yKHR5cGUpLAotICAgICAgICAgIGlzUHJpbWFyeSA9ICghZm9yY2VkU2Vj
b25kYXJ5ICYmICh0eXBlLnR5cGVLZXkgPT09IHByaW1hcnlUeXBlTmFtZSkpOwotCi0gICAgICAv
KmpzaGludCBsb29wZnVuYzp0cnVlKi8KLSAgICAgIHZhciBub3JtYWxpemVkQXJyYXkgPSBtYXAu
Y2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgIHJldHVybiB0eXBl
U2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0gICAgICB9LCB0aGlzKTsK
LQotICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICBwcmltYXJ5QXJyYXkgPSBub3JtYWxp
emVkQXJyYXk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdG9yZS5wdXNoTWFueSh0eXBlTmFt
ZSwgbm9ybWFsaXplZEFycmF5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcHJpbWFy
eUFycmF5OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gcHVz
aCBhIHBheWxvYWQgY29udGFpbmluZyB0b3AtbGV2ZWwKLSAgICBjb2xsZWN0aW9ucyBvZiByZWNv
cmRzIG9yZ2FuaXplZCBwZXIgdHlwZS4KLQotICAgIGBgYGpzCi0gICAgewotICAgICAgInBvc3Rz
IjogW3sKLSAgICAgICAgImlkIjogIjEiLAotICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21h
a2FzZSIsCi0gICAgICAgICJhdXRob3IiLCAiMSIsCi0gICAgICAgICJjb21tZW50cyI6IFsgIjEi
IF0KLSAgICAgIH1dLAotICAgICAgImNvbW1lbnRzIjogW3sKLSAgICAgICAgImlkIjogIjEiLAot
ICAgICAgICAiYm9keSI6ICJGSVJTVCIKLSAgICAgIH1dLAotICAgICAgInVzZXJzIjogW3sKLSAg
ICAgICAgImlkIjogIjEiLAotICAgICAgICAibmFtZSI6ICJAZDJoIgotICAgICAgfV0KLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBJdCB3aWxsIGZpcnN0IG5vcm1hbGl6ZSB0aGUgcGF5bG9hZCwgc28g
eW91IGNhbiB1c2UgdGhpcyB0byBwdXNoCi0gICAgaW4gZGF0YSBzdHJlYW1pbmcgaW4gZnJvbSB5
b3VyIHNlcnZlciBzdHJ1Y3R1cmVkIHRoZSBzYW1lIHdheQotICAgIHRoYXQgZmV0Y2hlcyBhbmQg
c2F2ZXMgYXJlIHN0cnVjdHVyZWQuCi0KLSAgICBAbWV0aG9kIHB1c2hQYXlsb2FkCi0gICAgQHBh
cmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAqLwot
ICBwdXNoUGF5bG9hZDogZnVuY3Rpb24oc3RvcmUsIHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0g
dGhpcy5ub3JtYWxpemVQYXlsb2FkKG51bGwsIHBheWxvYWQpOwotCi0gICAgZm9yICh2YXIgcHJv
cCBpbiBwYXlsb2FkKSB7Ci0gICAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHBy
b3ApLAotICAgICAgICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSk7Ci0KLSAgICAg
IC8qanNoaW50IGxvb3BmdW5jOnRydWUqLwotICAgICAgdmFyIG5vcm1hbGl6ZWRBcnJheSA9IG1h
cC5jYWxsKEVtYmVyLm1ha2VBcnJheShwYXlsb2FkW3Byb3BdKSwgZnVuY3Rpb24oaGFzaCkgewot
ICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0gICAgICB9
LCB0aGlzKTsKLQotICAgICAgc3RvcmUucHVzaE1hbnkodHlwZU5hbWUsIG5vcm1hbGl6ZWRBcnJh
eSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRv
IG5vcm1hbGl6ZSB0aGUgSlNPTiByb290IGtleXMgcmV0dXJuZWQKLSAgICBpbnRvIHRoZSBtb2Rl
bCB0eXBlIGV4cGVjdGVkIGJ5IHlvdXIgc3RvcmUuCi0KLSAgICBGb3IgZXhhbXBsZSwgeW91ciBz
ZXJ2ZXIgbWF5IHJldHVybiB1bmRlcnNjb3JlZCByb290IGtleXMgcmF0aGVyIHRoYW4KLSAgICB0
aGUgZXhwZWN0ZWQgY2FtZWxjYXNlZCB2ZXJzaW9ucy4KLQotICAgIGBgYGpzCi0gICAgQXBwLkFw
cGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICB0
eXBlRm9yUm9vdDogZnVuY3Rpb24ocm9vdCkgewotICAgICAgICB2YXIgY2FtZWxpemVkID0gRW1i
ZXIuU3RyaW5nLmNhbWVsaXplKHJvb3QpOwotICAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnNp
bmd1bGFyaXplKGNhbWVsaXplZCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHR5cGVGb3JSb290Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHJvb3QKLSAgICBAcmV0dXJu
cyB7U3RyaW5nfSB0aGUgbW9kZWwncyB0eXBlS2V5Ci0gICovCi0gIHR5cGVGb3JSb290OiBmdW5j
dGlvbihyb290KSB7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZShyb290KTsK
LSAgfSwKLQotICAvLyBTRVJJQUxJWkUKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiBhIHJlY29y
ZCBpcyBzYXZlZCBpbiBvcmRlciB0byBjb252ZXJ0IHRoZQotICAgIHJlY29yZCBpbnRvIEpTT04u
Ci0KLSAgICBCeSBkZWZhdWx0LCBpdCBjcmVhdGVzIGEgSlNPTiBvYmplY3Qgd2l0aCBhIGtleSBm
b3IKLSAgICBlYWNoIGF0dHJpYnV0ZSBhbmQgYmVsb25nc1RvIHJlbGF0aW9uc2hpcC4KLQotICAg
IEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIG1vZGVsOgotCi0gICAgYGBganMKLSAgICBBcHAu
Q29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB0aXRsZTogRFMuYXR0cigpLAotICAg
ICAgYm9keTogRFMuYXR0cigpLAotCi0gICAgICBhdXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicp
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxk
IGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJ0
aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIsCi0gICAgICAiYm9keSI6ICJSYWlscz8gT21ha2FzZT8g
T19PIiwKLSAgICAgICJhdXRob3IiOiAxMgotICAgIH0KLSAgICBgYGAKLQotICAgIEJ5IGRlZmF1
bHQsIGF0dHJpYnV0ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzLCB1bmxlc3MKLSAgICB5b3Ug
c3BlY2lmaWVkIGFuIGF0dHJpYnV0ZSB0eXBlIChgRFMuYXR0cignZGF0ZScpYCkuIElmCi0gICAg
eW91IHNwZWNpZnkgYSB0cmFuc2Zvcm0sIHRoZSBKYXZhU2NyaXB0IHZhbHVlIHdpbGwgYmUKLSAg
ICBzZXJpYWxpemVkIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgotCi0gICAgQnkg
ZGVmYXVsdCwgYmVsb25ncy10byByZWxhdGlvbnNoaXBzIGFyZSBjb252ZXJ0ZWQgaW50bwotICAg
IElEcyB3aGVuIGluc2VydGVkIGludG8gdGhlIEpTT04gaGFzaC4KLQotICAgICMjIElEcwotCi0g
ICAgYHNlcmlhbGl6ZWAgdGFrZXMgYW4gb3B0aW9ucyBoYXNoIHdpdGggYSBzaW5nbGUgb3B0aW9u
OgotICAgIGBpbmNsdWRlSWRgLiBJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIGBzZXJpYWxpemVg
IHdpbGwsCi0gICAgYnkgZGVmYXVsdCBpbmNsdWRlIHRoZSBJRCBpbiB0aGUgSlNPTiBvYmplY3Qg
aXQgYnVpbGRzLgotCi0gICAgVGhlIGFkYXB0ZXIgcGFzc2VzIGluIGBpbmNsdWRlSWQ6IHRydWVg
IHdoZW4gc2VyaWFsaXppbmcKLSAgICBhIHJlY29yZCBmb3IgYGNyZWF0ZVJlY29yZGAsIGJ1dCBu
b3QgZm9yIGB1cGRhdGVSZWNvcmRgLgotCi0gICAgIyMgQ3VzdG9taXphdGlvbgotCi0gICAgWW91
ciBzZXJ2ZXIgbWF5IGV4cGVjdCBhIGRpZmZlcmVudCBKU09OIGZvcm1hdCB0aGFuIHRoZQotICAg
IGJ1aWx0LWluIHNlcmlhbGl6YXRpb24gZm9ybWF0LgotCi0gICAgSW4gdGhhdCBjYXNlLCB5b3Ug
Y2FuIGltcGxlbWVudCBgc2VyaWFsaXplYCB5b3Vyc2VsZiBhbmQKLSAgICByZXR1cm4gYSBKU09O
IGhhc2ggb2YgeW91ciBjaG9vc2luZy4KLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxp
emVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIHNlcmlhbGl6ZTogZnVuY3Rp
b24ocG9zdCwgb3B0aW9ucykgewotICAgICAgICB2YXIganNvbiA9IHsKLSAgICAgICAgICBQT1NU
X1RUTDogcG9zdC5nZXQoJ3RpdGxlJyksCi0gICAgICAgICAgUE9TVF9CRFk6IHBvc3QuZ2V0KCdi
b2R5JyksCi0gICAgICAgICAgUE9TVF9DTVM6IHBvc3QuZ2V0KCdjb21tZW50cycpLm1hcFByb3Bl
cnR5KCdpZCcpCi0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSWQpIHsK
LSAgICAgICAgICBqc29uLlBPU1RfSURfID0gcG9zdC5nZXQoJ2lkJyk7Ci0gICAgICAgIH0KLQot
ICAgICAgICByZXR1cm4ganNvbjsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgICMj
IEN1c3RvbWl6aW5nIGFuIEFwcC1XaWRlIFNlcmlhbGl6ZXIKLQotICAgIElmIHlvdSB3YW50IHRv
IGRlZmluZSBhIHNlcmlhbGl6ZXIgZm9yIHlvdXIgZW50aXJlCi0gICAgYXBwbGljYXRpb24sIHlv
dSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSBgZWFjaEF0dHJpYnV0ZWAKLSAgICBhbmQgYGVhY2hS
ZWxhdGlvbnNoaXBgIG9uIHRoZSByZWNvcmQuCi0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNh
dGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFs
aXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7fTsK
LQotICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAg
ICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSk7Ci0g
ICAgICAgIH0pCi0KLSAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFt
ZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAn
aGFzTWFueScpIHsKLSAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUobmFtZSldID0g
cmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwot
Ci0gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewotICAgICAgICAgIGpzb24uSURfID0g
cmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqc29uOwotICAg
ICAgfQotICAgIH0pOwotCi0gICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFtZShhdHRyaWJ1
dGUpIHsKLSAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBwZXJDYXNlKCk7
Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgewotICAgICAg
cmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSArICJfSURTIjsK
LSAgICB9Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBKU09O
IHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAiVElUTEUi
OiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAiQk9EWSI6ICJZZXAuIE9tYWthc2UuIiwKLSAg
ICAgICJDT01NRU5UX0lEUyI6IFsgMSwgMiwgMyBdCi0gICAgfQotICAgIGBgYAotCi0gICAgIyMg
VHdlYWtpbmcgdGhlIERlZmF1bHQgSlNPTgotCi0gICAgSWYgeW91IGp1c3Qgd2FudCB0byBkbyBz
b21lIHNtYWxsIHR3ZWFrcyBvbiB0aGUgZGVmYXVsdCBKU09OLAotICAgIHlvdSBjYW4gY2FsbCBz
dXBlciBmaXJzdCBhbmQgbWFrZSB0aGUgdHdlYWtzIG9uIHRoZSByZXR1cm5lZAotICAgIEpTT04u
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVy
LmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewot
ICAgICAgICB2YXIganNvbiA9IHRoaXMuX3N1cGVyKHJlY29yZCwgb3B0aW9ucyk7Ci0KLSAgICAg
ICAganNvbi5zdWJqZWN0ID0ganNvbi50aXRsZTsKLSAgICAgICAgZGVsZXRlIGpzb24udGl0bGU7
Ci0KLSAgICAgICAgcmV0dXJuIGpzb247Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIHNlcmlhbGl6ZQotICAgIEBwYXJhbSByZWNvcmQKLSAgICBAcGFyYW0gb3B0aW9u
cwotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgIHJl
dHVybiB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgot
ICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgcm9vdCBrZXlzIHNl
cmlhbGl6ZWQgaW50byB0aGUgSlNPTi4KLSAgICBCeSBkZWZhdWx0IHRoZSBSRVNUIFNlcmlhbGl6
ZXIgc2VuZHMgY2FtZWxpemVkIHJvb3Qga2V5cy4KLSAgICBGb3IgZXhhbXBsZSwgeW91ciBzZXJ2
ZXIgbWF5IGV4cGVjdCB1bmRlcnNjb3JlZCByb290IG9iamVjdHMuCi0KLSAgICBgYGBqcwotICAg
IEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewot
ICAgICAgc2VyaWFsaXplSW50b0hhc2g6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJlY29yZCwgb3B0
aW9ucykgewotICAgICAgICB2YXIgcm9vdCA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplKHR5cGUu
dHlwZUtleSk7Ci0gICAgICAgIGRhdGFbcm9vdF0gPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIG9w
dGlvbnMpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxp
emVJbnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0gIHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlv
bihoYXNoLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMpIHsKLSAgICB2YXIgcm9vdCA9IEVtYmVyLlN0
cmluZy5jYW1lbGl6ZSh0eXBlLnR5cGVLZXkpOwotICAgIGhhc2hbcm9vdF0gPSB0aGlzLnNlcmlh
bGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRo
aXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBob3cgcG9seW1vcnBoaWMgb2JqZWN0cyBhcmUgc2VyaWFs
aXplZC4KLSAgICBCeSBkZWZhdWx0IHRoZSBKU09OIFNlcmlhbGl6ZXIgY3JlYXRlcyB0aGUga2V5
IGJ5IGFwcGVuZGluZyBgVHlwZWAgdG8KLSAgICB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSBmcm9t
IHRoZSBtb2RlbCdzIGNhbWVsY2FzZWQgbW9kZWwgbmFtZS4KLQotICAgIEBtZXRob2Qgc2VyaWFs
aXplUG9seW1vcnBoaWNUeXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBh
cmFtIHtPYmplY3R9IGpzb24KLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICov
Ci0gIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxh
dGlvbnNoaXApIHsKLSAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleSwKLSAgICAgICAgYmVs
b25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICBrZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0
ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXk7Ci0gICAganNvbltrZXkgKyAiVHlw
ZSJdID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKGJlbG9uZ3NUby5jb25zdHJ1Y3Rvci50eXBlS2V5
KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVs
ZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Ci0KLS8qKgotICBU
aGUgUkVTVCBhZGFwdGVyIGFsbG93cyB5b3VyIHN0b3JlIHRvIGNvbW11bmljYXRlIHdpdGggYW4g
SFRUUCBzZXJ2ZXIgYnkKLSAgdHJhbnNtaXR0aW5nIEpTT04gdmlhIFhIUi4gTW9zdCBFbWJlci5q
cyBhcHBzIHRoYXQgY29uc3VtZSBhIEpTT04gQVBJCi0gIHNob3VsZCB1c2UgdGhlIFJFU1QgYWRh
cHRlci4KLQotICBUaGlzIGFkYXB0ZXIgaXMgZGVzaWduZWQgYXJvdW5kIHRoZSBpZGVhIHRoYXQg
dGhlIEpTT04gZXhjaGFuZ2VkIHdpdGgKLSAgdGhlIHNlcnZlciBzaG91bGQgYmUgY29udmVudGlv
bmFsLgotCi0gICMjIEpTT04gU3RydWN0dXJlCi0KLSAgVGhlIFJFU1QgYWRhcHRlciBleHBlY3Rz
IHRoZSBKU09OIHJldHVybmVkIGZyb20geW91ciBzZXJ2ZXIgdG8gZm9sbG93Ci0gIHRoZXNlIGNv
bnZlbnRpb25zLgotCi0gICMjIyBPYmplY3QgUm9vdAotCi0gIFRoZSBKU09OIHBheWxvYWQgc2hv
dWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZWNvcmQgaW5zaWRlIGEKLSAgcm9v
dCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGluIHJlc3BvbnNlIHRvIGEgYEdFVGAgcmVxdWVzdCBm
b3IKLSAgYC9wb3N0cy8xYCwgdGhlIEpTT04gc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBg
YGpzCi0gIHsKLSAgICAicG9zdCI6IHsKLSAgICAgICJ0aXRsZSI6ICJJJ20gUnVubmluZyB0byBS
ZWZvcm0gdGhlIFczQydzIFRhZyIsCi0gICAgICAiYXV0aG9yIjogIlllaHVkYSBLYXR6IgotICAg
IH0KLSAgfQotICBgYGAKLQotICAjIyMgQ29udmVudGlvbmFsIE5hbWVzCi0KLSAgQXR0cmlidXRl
IG5hbWVzIGluIHlvdXIgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSB0aGUgY2FtZWxDYXNlZCB2ZXJz
aW9ucyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBG
b3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVyc29uYCBtb2RlbDoKLQotICBgYGBqcwotICBB
cHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0
cmluZycpLAotICAgIGxhc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9u
OiBEUy5hdHRyKCdzdHJpbmcnKQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQg
c2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAicGVyc29uIjogewot
ICAgICAgImZpcnN0TmFtZSI6ICJCYXJhY2siLAotICAgICAgImxhc3ROYW1lIjogIk9iYW1hIiwK
LSAgICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKLSAgICB9Ci0gIH0KLSAgYGBgCi0KLSAg
IyMgQ3VzdG9taXphdGlvbgotCi0gICMjIyBFbmRwb2ludCBwYXRoIGN1c3RvbWl6YXRpb24KLQot
ICBFbmRwb2ludCBwYXRocyBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIGBuYW1lc3BhY2VgIGJ5IHNl
dHRpbmcgdGhlIG5hbWVzcGFjZQotICBwcm9wZXJ0eSBvbiB0aGUgYWRhcHRlcjoKLQotICBgYGBq
cwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIG5hbWVzcGFjZTogJ2FwaS8xJwotICB9
KTsKLSAgYGBgCi0gIFJlcXVlc3RzIGZvciBgQXBwLlBlcnNvbmAgd291bGQgbm93IHRhcmdldCBg
L2FwaS8xL3Blb3BsZS8xYC4KLQotICAjIyMgSG9zdCBjdXN0b21pemF0aW9uCi0KLSAgQW4gYWRh
cHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0
eS4KLQotICBgYGBqcwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIGhvc3Q6ICdodHRw
czovL2FwaS5leGFtcGxlLmNvbScKLSAgfSk7Ci0gIGBgYAotCi0gICMjIyBIZWFkZXJzIGN1c3Rv
bWl6YXRpb24KLQotICBTb21lIEFQSXMgcmVxdWlyZSBIVFRQIGhlYWRlcnMsIGUuZy4gdG8gcHJv
dmlkZSBhbiBBUEkga2V5LiBBbiBhcnJheSBvZgotICBoZWFkZXJzIGNhbiBiZSBhZGRlZCB0byB0
aGUgYWRhcHRlciB3aGljaCBhcmUgcGFzc2VkIHdpdGggZXZlcnkgcmVxdWVzdDoKLQotICBgYGBq
cwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIGhlYWRlcnM6IHsKLSAgICAgICJBUElf
S0VZIjogInNlY3JldCBrZXkiLAotICAgICAgIkFOT1RIRVJfSEVBREVSIjogIlNvbWUgaGVhZGVy
IHZhbHVlIgotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBSRVNUQWRhcHRlcgotICBA
Y29uc3RydWN0b3IKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5BZGFwdGVyCi0qLwot
RFMuUkVTVEFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0gIGRlZmF1bHRTZXJpYWxpemVy
OiAnLXJlc3QnLAotCi0KLSAgLyoqCi0gICAgRW5kcG9pbnQgcGF0aHMgY2FuIGJlIHByZWZpeGVk
IHdpdGggYSBgbmFtZXNwYWNlYCBieSBzZXR0aW5nIHRoZSBuYW1lc3BhY2UKLSAgICBwcm9wZXJ0
eSBvbiB0aGUgYWRhcHRlcjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBEUy5SRVNUQWRhcHRl
ci5yZW9wZW4oewotICAgICAgbmFtZXNwYWNlOiAnYXBpLzEnCi0gICAgfSk7Ci0gICAgYGBgCi0K
LSAgICBSZXF1ZXN0cyBmb3IgYEFwcC5Qb3N0YCB3b3VsZCBub3cgdGFyZ2V0IGAvYXBpLzEvcG9z
dC9gLgotCi0gICAgQHByb3BlcnR5IG5hbWVzcGFjZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICov
Ci0KLSAgLyoqCi0gICAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRp
bmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBEUy5SRVNU
QWRhcHRlci5yZW9wZW4oewotICAgICAgaG9zdDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJwot
ICAgIH0pOwotICAgIGBgYAotCi0gICAgUmVxdWVzdHMgZm9yIGBBcHAuUG9zdGAgd291bGQgbm93
IHRhcmdldCBgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vcG9zdC9gLgotCi0gICAgQHByb3BlcnR5
IGhvc3QKLSAgICBAdHlwZSB7U3RyaW5nfQotICAqLwotCi0gIC8qKgotICAgIFNvbWUgQVBJcyBy
ZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBwcm92aWRlIGFuIEFQSSBrZXkuIEFuIGFycmF5
IG9mCi0gICAgaGVhZGVycyBjYW4gYmUgYWRkZWQgdG8gdGhlIGFkYXB0ZXIgd2hpY2ggYXJlIHBh
c3NlZCB3aXRoIGV2ZXJ5IHJlcXVlc3Q6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRFMuUkVT
VEFkYXB0ZXIucmVvcGVuKHsKLSAgICAgIGhlYWRlcnM6IHsKLSAgICAgICAgIkFQSV9LRVkiOiAi
c2VjcmV0IGtleSIsCi0gICAgICAgICJBTk9USEVSX0hFQURFUiI6ICJTb21lIGhlYWRlciB2YWx1
ZSIKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBoZWFkZXJzCi0g
ICAgQHR5cGUge09iamVjdH0KLSAgKi8KLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3Jl
IGluIG9yZGVyIHRvIGZldGNoIHRoZSBKU09OIGZvciBhIGdpdmVuCi0gICAgdHlwZSBhbmQgSUQu
Ci0KLSAgICBUaGUgYGZpbmRgIG1ldGhvZCBtYWtlcyBhbiBBamF4IHJlcXVlc3QgdG8gYSBVUkwg
Y29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwgYW5kIHJldHVybnMgYQotICAgIHByb21pc2UgZm9yIHRo
ZSByZXN1bHRpbmcgcGF5bG9hZC4KLQotICAgIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGFuIEhUVFAg
YEdFVGAgcmVxdWVzdCB3aXRoIHRoZSBpZCBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBz
dHJpbmcuCi0KLSAgICBAbWV0aG9kIGZpbmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmlu
Z30gaWQKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgaWQpIHsKLSAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRV
UkwodHlwZS50eXBlS2V5LCBpZCksICdHRVQnKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQg
YnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IgYWxsCi0gICAg
b2YgdGhlIHJlY29yZHMgZm9yIGEgZ2l2ZW4gdHlwZS4KLQotICAgIFRoZSBgZmluZEFsbGAgbWV0
aG9kIG1ha2VzIGFuIEFqYXggKEhUVFAgR0VUKSByZXF1ZXN0IHRvIGEgVVJMIGNvbXB1dGVkIGJ5
IGBidWlsZFVSTGAsIGFuZCByZXR1cm5zIGEKLSAgICBwcm9taXNlIGZvciB0aGUgcmVzdWx0aW5n
IHBheWxvYWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZmluZEFsbAotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCi0gICAgQHJldHVybnMge1Byb21pc2V9
IHByb21pc2UKLSAgKi8KLSAgZmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHNpbmNlVG9r
ZW4pIHsKLSAgICB2YXIgcXVlcnk7Ci0KLSAgICBpZiAoc2luY2VUb2tlbikgewotICAgICAgcXVl
cnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuYWph
eCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHF1ZXJ5IH0pOwot
ICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgaW4gb3JkZXIgdG8gZmV0Y2gg
YSBKU09OIGFycmF5IGZvcgotICAgIHRoZSByZWNvcmRzIHRoYXQgbWF0Y2ggYSBwYXJ0aWN1bGFy
IHF1ZXJ5LgotCi0gICAgVGhlIGBmaW5kUXVlcnlgIG1ldGhvZCBtYWtlcyBhbiBBamF4IChIVFRQ
IEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBhbmQgcmV0dXJu
cyBhCi0gICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXlsb2FkLgotCi0gICAgVGhlIGBx
dWVyeWAgYXJndW1lbnQgaXMgYSBzaW1wbGUgSmF2YVNjcmlwdCBvYmplY3QgdGhhdCB3aWxsIGJl
IHBhc3NlZCBkaXJlY3RseQotICAgIHRvIHRoZSBzZXJ2ZXIgYXMgcGFyYW1ldGVycy4KLQotICAg
IEBwcml2YXRlCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcXVlcnkKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBm
aW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSkgewotICAgIHJldHVybiB0aGlz
LmFqYXgodGhpcy5idWlsZFVSTCh0eXBlLnR5cGVLZXkpLCAnR0VUJywgeyBkYXRhOiBxdWVyeSB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZl
dGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1t
YW55IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQotICAgIHNwZWNpZmllZCBhcyBJ
RHMuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIG9yaWdpbmFsIHBheWxvYWQgbG9va3MgbGlr
ZToKLQotICAgIGBgYGpzCi0gICAgewotICAgICAgImlkIjogMSwKLSAgICAgICJ0aXRsZSI6ICJS
YWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICJjb21tZW50cyI6IFsgMSwgMiwgMyBdCi0gICAgfQot
ICAgIGBgYAotCi0gICAgVGhlIElEcyB3aWxsIGJlIHBhc3NlZCBhcyBhIFVSTC1lbmNvZGVkIEFy
cmF5IG9mIElEcywgaW4gdGhpcyBmb3JtOgotCi0gICAgYGBgCi0gICAgaWRzW109MSZpZHNbXT0y
Jmlkc1tdPTMKLSAgICBgYGAKLQotICAgIE1hbnkgc2VydmVycywgc3VjaCBhcyBSYWlscyBhbmQg
UEhQLCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCB0aGlzIFVSTC1lbmNvZGVkIGFycmF5Ci0g
ICAgaW50byBhbiBBcnJheSBmb3IgeW91IG9uIHRoZSBzZXJ2ZXItc2lkZS4gSWYgeW91IHdhbnQg
dG8gZW5jb2RlIHRoZQotICAgIElEcywgZGlmZmVyZW50bHksIGp1c3Qgb3ZlcnJpZGUgdGhpcyAo
b25lLWxpbmUpIG1ldGhvZC4KLQotICAgIFRoZSBgZmluZE1hbnlgIG1ldGhvZCBtYWtlcyBhbiBB
amF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBh
bmQgcmV0dXJucyBhCi0gICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXlsb2FkLgotCi0g
ICAgQG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBh
cmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IGlkcwot
ICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIGZpbmRNYW55OiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgaWRzKSB7Ci0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJM
KHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHsgaWRzOiBpZHMgfSB9KTsKLSAgfSwKLQot
ICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBh
cnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1tYW55IHJlbGF0aW9u
c2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQotICAgIHNwZWNpZmllZCBhcyBhIFVSTCAoaW5zaWRl
IG9mIGBsaW5rc2ApLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgb3JpZ2luYWwgcGF5bG9h
ZCBsb29rcyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJwb3N0Ijogewot
ICAgICAgICAiaWQiOiAxLAotICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0g
ICAgICAgICJsaW5rcyI6IHsgImNvbW1lbnRzIjogIi9wb3N0cy8xL2NvbW1lbnRzIiB9Ci0gICAg
ICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0
aCB0aGUgcGFyZW50IHJlY29yZCBhbmQgYC9wb3N0cy8xL2NvbW1lbnRzYC4KLQotICAgIFRoZSBg
ZmluZEhhc01hbnlgIG1ldGhvZCB3aWxsIG1ha2UgYW4gQWpheCAoSFRUUCBHRVQpIHJlcXVlc3Qg
dG8gdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIFVSTC4KLSAgICBJZiB0aGUgVVJMIGlzIGhvc3Qt
cmVsYXRpdmUgKHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgc2xhc2gpLCB0aGUKLSAgICByZXF1ZXN0
IHdpbGwgdXNlIHRoZSBob3N0IHNwZWNpZmllZCBvbiB0aGUgYWRhcHRlciAoaWYgYW55KS4KLQot
ICAgIEBtZXRob2QgZmluZEhhc01hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwKLSAgICBA
cmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kSGFzTWFueTogZnVuY3Rpb24o
c3RvcmUsIHJlY29yZCwgdXJsKSB7Ci0gICAgdmFyIGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwK
LSAgICAgICAgaWQgICA9IGdldChyZWNvcmQsICdpZCcpLAotICAgICAgICB0eXBlID0gcmVjb3Jk
LmNvbnN0cnVjdG9yLnR5cGVLZXk7Ci0KLSAgICBpZiAoaG9zdCAmJiB1cmwuY2hhckF0KDApID09
PSAnLycgJiYgdXJsLmNoYXJBdCgxKSAhPT0gJy8nKSB7Ci0gICAgICB1cmwgPSBob3N0ICsgdXJs
OwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLmFqYXgodGhpcy51cmxQcmVmaXgodXJsLCB0aGlz
LmJ1aWxkVVJMKHR5cGUsIGlkKSksICdHRVQnKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQg
YnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUg
dW5sb2FkZWQgcmVjb3JkcyBpbiBhIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwIHRoYXQgd2VyZSBv
cmlnaW5hbGx5Ci0gICAgc3BlY2lmaWVkIGFzIGEgVVJMIChpbnNpZGUgb2YgYGxpbmtzYCkuCi0K
LSAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBvcmlnaW5hbCBwYXlsb2FkIGxvb2tzIGxpa2UgdGhp
czoKLQotICAgIGBgYGpzCi0gICAgewotICAgICAgInBlcnNvbiI6IHsKLSAgICAgICAgImlkIjog
MSwKLSAgICAgICAgIm5hbWUiOiAiVG9tIERhbGUiLAotICAgICAgICAibGlua3MiOiB7ICJncm91
cCI6ICIvcGVvcGxlLzEvZ3JvdXAiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBU
aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJlbnQgcmVjb3JkIGFuZCBgL3Bl
b3BsZS8xL2dyb3VwYC4KLQotICAgIFRoZSBgZmluZEJlbG9uZ3NUb2AgbWV0aG9kIHdpbGwgbWFr
ZSBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byB0aGUgb3JpZ2luYWxseSBzcGVjaWZpZWQg
VVJMLgotCi0gICAgQG1ldGhvZCBmaW5kQmVsb25nc1RvCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0g
c3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge1N0cmluZ30g
dXJsCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEJlbG9uZ3NU
bzogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJsKSB7Ci0gICAgdmFyIGlkICAgPSBnZXQocmVj
b3JkLCAnaWQnKSwKLSAgICAgICAgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5Owot
Ci0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLnVybFByZWZpeCh1cmwsIHRoaXMuYnVpbGRVUkwo
dHlwZSwgaWQpKSwgJ0dFVCcpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3Rv
cmUgd2hlbiBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIGlzCi0gICAgc2F2ZWQgdmlhIHRoZSBgc2F2
ZWAgbWV0aG9kIG9uIGEgbW9kZWwgcmVjb3JkIGluc3RhbmNlLgotCi0gICAgVGhlIGBjcmVhdGVS
ZWNvcmRgIG1ldGhvZCBzZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIG1ha2VzIGFuIEFqYXggKEhU
VFAgUE9TVCkgcmVxdWVzdAotICAgIHRvIGEgVVJMIGNvbXB1dGVkIGJ5IGBidWlsZFVSTGAuCi0K
LSAgICBTZWUgYHNlcmlhbGl6ZWAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjdXN0b21pemUg
dGhlIHNlcmlhbGl6ZWQgZm9ybQotICAgIG9mIGEgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBjcmVh
dGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xh
c3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBA
cmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9u
KHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICB2YXIgZGF0YSA9IHt9OwotICAgIHZhciBzZXJp
YWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVLZXkpOwotCi0gICAgc2VyaWFs
aXplci5zZXJpYWxpemVJbnRvSGFzaChkYXRhLCB0eXBlLCByZWNvcmQsIHsgaW5jbHVkZUlkOiB0
cnVlIH0pOwotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtl
eSksICJQT1NUIiwgeyBkYXRhOiBkYXRhIH0pOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBi
eSB0aGUgc3RvcmUgd2hlbiBhbiBleGlzdGluZyByZWNvcmQgaXMgc2F2ZWQKLSAgICB2aWEgdGhl
IGBzYXZlYCBtZXRob2Qgb24gYSBtb2RlbCByZWNvcmQgaW5zdGFuY2UuCi0KLSAgICBUaGUgYHVw
ZGF0ZVJlY29yZGAgbWV0aG9kIHNlcmlhbGl6ZXMgdGhlIHJlY29yZCBhbmQgbWFrZXMgYW4gQWph
eCAoSFRUUCBQVVQpIHJlcXVlc3QKLSAgICB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxg
LgotCi0gICAgU2VlIGBzZXJpYWxpemVgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3VzdG9t
aXplIHRoZSBzZXJpYWxpemVkIGZvcm0KLSAgICBvZiBhIHJlY29yZC4KLQotICAgIEBtZXRob2Qg
dXBkYXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1
YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0g
ICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgdXBkYXRlUmVjb3JkOiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGRhdGEgPSB7fTsKLSAgICB2YXIg
c2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IodHlwZS50eXBlS2V5KTsKLQotICAgIHNl
cmlhbGl6ZXIuc2VyaWFsaXplSW50b0hhc2goZGF0YSwgdHlwZSwgcmVjb3JkKTsKLQotICAgIHZh
ciBpZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1
aWxkVVJMKHR5cGUudHlwZUtleSwgaWQpLCAiUFVUIiwgeyBkYXRhOiBkYXRhIH0pOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhIHJlY29yZCBpcyBkZWxldGVk
LgotCi0gICAgVGhlIGBkZWxldGVSZWNvcmRgIG1ldGhvZCAgbWFrZXMgYW4gQWpheCAoSFRUUCBE
RUxFVEUpIHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYC4KLQotICAgIEBt
ZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFy
YW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVj
b3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZGVsZXRlUmVjb3Jk
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29y
ZCwgJ2lkJyk7Ci0KLSAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwodHlwZS50eXBl
S2V5LCBpZCksICJERUxFVEUiKTsKLSAgfSwKLQotICAvKioKLSAgICBCdWlsZHMgYSBVUkwgZm9y
IGEgZ2l2ZW4gdHlwZSBhbmQgb3B0aW9uYWwgSUQuCi0KLSAgICBCeSBkZWZhdWx0LCBpdCBwbHVy
YWxpemVzIHRoZSB0eXBlJ3MgbmFtZSAoZm9yIGV4YW1wbGUsICdwb3N0JwotICAgIGJlY29tZXMg
J3Bvc3RzJyBhbmQgJ3BlcnNvbicgYmVjb21lcyAncGVvcGxlJykuIFRvIG92ZXJyaWRlIHRoZQot
ICAgIHBsdXJhbGl6YXRpb24gc2VlIFtwYXRoRm9yVHlwZV0oI21ldGhvZF9wYXRoRm9yVHlwZSku
Ci0KLSAgICBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIGl0IGFkZHMgdGhlIElEIHRvIHRoZSBwYXRo
IGdlbmVyYXRlZAotICAgIGZvciB0aGUgdHlwZSwgc2VwYXJhdGVkIGJ5IGEgYC9gLgotCi0gICAg
QG1ldGhvZCBidWlsZFVSTAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gICAgQHBhcmFtIHtT
dHJpbmd9IGlkCi0gICAgQHJldHVybnMge1N0cmluZ30gdXJsCi0gICovCi0gIGJ1aWxkVVJMOiBm
dW5jdGlvbih0eXBlLCBpZCkgewotICAgIHZhciB1cmwgPSBbXSwKLSAgICAgICAgaG9zdCA9IGdl
dCh0aGlzLCAnaG9zdCcpLAotICAgICAgICBwcmVmaXggPSB0aGlzLnVybFByZWZpeCgpOwotCi0g
ICAgaWYgKHR5cGUpIHsgdXJsLnB1c2godGhpcy5wYXRoRm9yVHlwZSh0eXBlKSk7IH0KLSAgICBp
ZiAoaWQpIHsgdXJsLnB1c2goaWQpOyB9Ci0KLSAgICBpZiAocHJlZml4KSB7IHVybC51bnNoaWZ0
KHByZWZpeCk7IH0KLQotICAgIHVybCA9IHVybC5qb2luKCcvJyk7Ci0gICAgaWYgKCFob3N0ICYm
IHVybCkgeyB1cmwgPSAnLycgKyB1cmw7IH0KLQotICAgIHJldHVybiB1cmw7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQG1ldGhvZCB1cmxQcmVmaXgKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoCi0gICAgQHBhcmFtIHtTdHJpbmd9IHBhcmVudFVybAotICAgIEByZXR1cm4ge1N0
cmluZ30gdXJsUHJlZml4Ci0gICovCi0gIHVybFByZWZpeDogZnVuY3Rpb24ocGF0aCwgcGFyZW50
VVJMKSB7Ci0gICAgdmFyIGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwKLSAgICAgICAgbmFtZXNw
YWNlID0gZ2V0KHRoaXMsICduYW1lc3BhY2UnKSwKLSAgICAgICAgdXJsID0gW107Ci0KLSAgICBp
ZiAocGF0aCkgewotICAgICAgLy8gQWJzb2x1dGUgcGF0aAotICAgICAgaWYgKHBhdGguY2hhckF0
KDApID09PSAnLycpIHsKLSAgICAgICAgaWYgKGhvc3QpIHsKLSAgICAgICAgICBwYXRoID0gcGF0
aC5zbGljZSgxKTsKLSAgICAgICAgICB1cmwucHVzaChob3N0KTsKLSAgICAgICAgfQotICAgICAg
Ly8gUmVsYXRpdmUgcGF0aAotICAgICAgfSBlbHNlIGlmICghL15odHRwKHMpPzpcL1wvLy50ZXN0
KHBhdGgpKSB7Ci0gICAgICAgIHVybC5wdXNoKHBhcmVudFVSTCk7Ci0gICAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAgIGlmIChob3N0KSB7IHVybC5wdXNoKGhvc3QpOyB9Ci0gICAgICBpZiAobmFt
ZXNwYWNlKSB7IHVybC5wdXNoKG5hbWVzcGFjZSk7IH0KLSAgICB9Ci0KLSAgICBpZiAocGF0aCkg
ewotICAgICAgdXJsLnB1c2gocGF0aCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHVybC5qb2luKCcv
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRGV0ZXJtaW5lcyB0aGUgcGF0aG5hbWUgZm9yIGEgZ2l2
ZW4gdHlwZS4KLQotICAgIEJ5IGRlZmF1bHQsIGl0IHBsdXJhbGl6ZXMgdGhlIHR5cGUncyBuYW1l
IChmb3IgZXhhbXBsZSwKLSAgICAncG9zdCcgYmVjb21lcyAncG9zdHMnIGFuZCAncGVyc29uJyBi
ZWNvbWVzICdwZW9wbGUnKS4KLQotICAgICMjIyBQYXRobmFtZSBjdXN0b21pemF0aW9uCi0KLSAg
ICBGb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBvYmplY3QgTGluZUl0ZW0gd2l0aCBhbgotICAg
IGVuZHBvaW50IG9mICIvbGluZV9pdGVtcy8iLgotCi0gICAgYGBganMKLSAgICBEUy5SRVNUQWRh
cHRlci5yZW9wZW4oewotICAgICAgcGF0aEZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICAg
ICAgdmFyIGRlY2FtZWxpemVkID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUodHlwZSk7Ci0gICAg
ICAgIHJldHVybiBFbWJlci5TdHJpbmcucGx1cmFsaXplKGRlY2FtZWxpemVkKTsKLSAgICAgIH07
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHBhdGhGb3JUeXBlCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJucyB7U3RyaW5nfSBwYXRoCi0gICoqLwotICBwYXRo
Rm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHZhciBjYW1lbGl6ZWQgPSBFbWJlci5TdHJp
bmcuY2FtZWxpemUodHlwZSk7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxpemUoY2Ft
ZWxpemVkKTsKLSAgfSwKLQotICAvKioKLSAgICBUYWtlcyBhbiBhamF4IHJlc3BvbnNlLCBhbmQg
cmV0dXJucyBhIHJlbGV2YW50IGVycm9yLgotCi0gICAgUmV0dXJuaW5nIGEgYERTLkludmFsaWRF
cnJvcmAgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIHRoZQotICAgIHJlY29yZCB0byB0cmFu
c2l0aW9uIGludG8gdGhlIGBpbnZhbGlkYCBzdGF0ZSBhbmQgbWFrZSB0aGUKLSAgICBgZXJyb3Jz
YCBvYmplY3QgYXZhaWxhYmxlIG9uIHRoZSByZWNvcmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJFU1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAg
ICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgIHZhciBlcnJvciA9IHRoaXMu
X3N1cGVyKGpxWEhSKTsKLQotICAgICAgICBpZiAoanFYSFIgJiYganFYSFIuc3RhdHVzID09PSA0
MjIpIHsKLSAgICAgICAgICB2YXIganNvbkVycm9ycyA9IEVtYmVyLiQucGFyc2VKU09OKGpxWEhS
LnJlc3BvbnNlVGV4dClbImVycm9ycyJdOwotCi0gICAgICAgICAgcmV0dXJuIG5ldyBEUy5JbnZh
bGlkRXJyb3IoanNvbkVycm9ycyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJu
IGVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBOb3Rl
OiBBcyBhIGNvcnJlY3RuZXNzIG9wdGltaXphdGlvbiwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRp
b24gb2YKLSAgICB0aGUgYGFqYXhFcnJvcmAgbWV0aG9kIHN0cmlwcyBvdXQgdGhlIGB0aGVuYCBt
ZXRob2QgZnJvbSBqcXVlcnkncwotICAgIGFqYXggcmVzcG9uc2UgKGpxWEhSKS4gVGhpcyBpcyBp
bXBvcnRhbnQgYmVjYXVzZSB0aGUganFYSFIncwotICAgIGB0aGVuYCBtZXRob2QgZnVsZmlsbHMg
dGhlIHByb21pc2Ugd2l0aCBpdHNlbGYgcmVzdWx0aW5nIGluIGEKLSAgICBjaXJjdWxhciAidGhl
bmFibGUiIGNoYWluIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZQotICAgIHByb21p
c2UgbGlicmFyaWVzLgotCi0gICAgQG1ldGhvZCBhamF4RXJyb3IKLSAgICBAcGFyYW0gIHtPYmpl
Y3R9IGpxWEhSCi0gICAgQHJldHVybiB7T2JqZWN0fSBqcVhIUgotICAqLwotICBhamF4RXJyb3I6
IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgaWYgKGpxWEhSKSB7Ci0gICAgICBqcVhIUi50aGVuID0g
bnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4ganFYSFI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGFr
ZXMgYSBVUkwsIGFuIEhUVFAgbWV0aG9kIGFuZCBhIGhhc2ggb2YgZGF0YSwgYW5kIG1ha2VzIGFu
Ci0gICAgSFRUUCByZXF1ZXN0LgotCi0gICAgV2hlbiB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGgg
YSBwYXlsb2FkLCBFbWJlciBEYXRhIHdpbGwgY2FsbCBpbnRvIGBleHRyYWN0U2luZ2xlYAotICAg
IG9yIGBleHRyYWN0QXJyYXlgIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgb3JpZ2luYWwgcXVl
cnkgd2FzIGZvciBvbmUgcmVjb3JkIG9yCi0gICAgbWFueSByZWNvcmRzKS4KLQotICAgIEJ5IGRl
ZmF1bHQsIGBhamF4YCBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6Ci0KLSAgICAq
IEl0IHNldHMgdGhlIHJlc3BvbnNlIGBkYXRhVHlwZWAgdG8gYCJqc29uImAKLSAgICAqIElmIHRo
ZSBIVFRQIG1ldGhvZCBpcyBub3QgYCJHRVQiYCwgaXQgc2V0cyB0aGUgYENvbnRlbnQtVHlwZWAg
dG8gYmUKLSAgICAgIGBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04YAotICAgICogSWYg
dGhlIEhUVFAgbWV0aG9kIGlzIG5vdCBgIkdFVCJgLCBpdCBzdHJpbmdpZmllcyB0aGUgZGF0YSBw
YXNzZWQgaW4uIFRoZQotICAgICAgZGF0YSBpcyB0aGUgc2VyaWFsaXplZCByZWNvcmQgaW4gdGhl
IGNhc2Ugb2YgYSBzYXZlLgotICAgICogUmVnaXN0ZXJzIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgaGFu
ZGxlcnMuCi0KLSAgICBAbWV0aG9kIGFqYXgKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3Ry
aW5nfSB1cmwKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgcmVxdWVzdCB0eXBlIEdFVCwg
UE9TVCwgUFVULCBERUxFVEUgZXRjLgotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBhamF4OiBmdW5jdGlvbih1cmwsIHR5cGUs
IGhhc2gpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVy
LlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgIGhhc2ggPSBh
ZGFwdGVyLmFqYXhPcHRpb25zKHVybCwgdHlwZSwgaGFzaCk7Ci0KLSAgICAgIGhhc2guc3VjY2Vz
cyA9IGZ1bmN0aW9uKGpzb24pIHsKLSAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGpz
b24pOwotICAgICAgfTsKLQotICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0
U3RhdHVzLCBlcnJvclRocm93bikgewotICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBh
ZGFwdGVyLmFqYXhFcnJvcihqcVhIUikpOwotICAgICAgfTsKLQotICAgICAgRW1iZXIuJC5hamF4
KGhhc2gpOwotICAgIH0sICJEUzogUmVzdEFkYXB0ZXIjYWpheCAiICsgdHlwZSArICIgdG8gIiAr
IHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBhamF4T3B0aW9ucwotICAgIEBwcml2
YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHVybAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRo
ZSByZXF1ZXN0IHR5cGUgR0VULCBQT1NULCBQVVQsIERFTEVURSBldGMuCi0gICAgQHBhcmFtIHtP
YmplY3R9IGhhc2gKLSAgICBAcmV0dXJuIHtPYmplY3R9IGhhc2gKLSAgKi8KLSAgYWpheE9wdGlv
bnM6IGZ1bmN0aW9uKHVybCwgdHlwZSwgaGFzaCkgewotICAgIGhhc2ggPSBoYXNoIHx8IHt9Owot
ICAgIGhhc2gudXJsID0gdXJsOwotICAgIGhhc2gudHlwZSA9IHR5cGU7Ci0gICAgaGFzaC5kYXRh
VHlwZSA9ICdqc29uJzsKLSAgICBoYXNoLmNvbnRleHQgPSB0aGlzOwotCi0gICAgaWYgKGhhc2gu
ZGF0YSAmJiB0eXBlICE9PSAnR0VUJykgewotICAgICAgaGFzaC5jb250ZW50VHlwZSA9ICdhcHBs
aWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JzsKLSAgICAgIGhhc2guZGF0YSA9IEpTT04uc3Ry
aW5naWZ5KGhhc2guZGF0YSk7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMuaGVhZGVycyAhPT0gdW5k
ZWZpbmVkKSB7Ci0gICAgICB2YXIgaGVhZGVycyA9IHRoaXMuaGVhZGVyczsKLSAgICAgIGhhc2gu
YmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4aHIpIHsKLSAgICAgICAgZm9yRWFjaC5jYWxsKEVtYmVy
LmtleXMoaGVhZGVycyksIGZ1bmN0aW9uKGtleSkgewotICAgICAgICAgIHhoci5zZXRSZXF1ZXN0
SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTsKLSAgICAgICAgfSk7Ci0gICAgICB9OwotICAgIH0K
LQotCi0gICAgcmV0dXJuIGhhc2g7Ci0gIH0KLQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotRFMuTW9kZWwucmVvcGVuKHsKLQotICAvKioKLSAgICBQcm92aWRlcyBpbmZv
IGFib3V0IHRoZSBtb2RlbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0gICAgYnkgZ3JvdXBpbmcg
dGhlIHByb3BlcnRpZXMgaW50byBtb3JlIHNlbWFudGljIGdyb3Vwcy4KLQotICAgIE1lYW50IHRv
IGJlIHVzZWQgYnkgZGVidWdnaW5nIHRvb2xzIHN1Y2ggYXMgdGhlIENocm9tZSBFbWJlciBFeHRl
bnNpb24uCi0KLSAgICAtIEdyb3VwcyBhbGwgYXR0cmlidXRlcyBpbiAiQXR0cmlidXRlcyIgZ3Jv
dXAuCi0gICAgLSBHcm91cHMgYWxsIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXBzIGluICJCZWxvbmdz
IFRvIiBncm91cC4KLSAgICAtIEdyb3VwcyBhbGwgaGFzTWFueSByZWxhdGlvbnNoaXBzIGluICJI
YXMgTWFueSIgZ3JvdXAuCi0gICAgLSBHcm91cHMgYWxsIGZsYWdzIGluICJGbGFncyIgZ3JvdXAu
Ci0gICAgLSBGbGFncyByZWxhdGlvbnNoaXAgQ1BzIGFzIGV4cGVuc2l2ZSBwcm9wZXJ0aWVzLgot
Ci0gICAgQG1ldGhvZCBfZGVidWdJbmZvCi0gICAgQGZvciBEUy5Nb2RlbAotICAgIEBwcml2YXRl
Ci0gICovCi0gIF9kZWJ1Z0luZm86IGZ1bmN0aW9uKCkgewotICAgIHZhciBhdHRyaWJ1dGVzID0g
WydpZCddLAotICAgICAgICByZWxhdGlvbnNoaXBzID0geyBiZWxvbmdzVG86IFtdLCBoYXNNYW55
OiBbXSB9LAotICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzID0gW107Ci0KLSAgICB0aGlzLmVh
Y2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgYXR0cmlidXRlcy5wdXNo
KG5hbWUpOwotICAgIH0sIHRoaXMpOwotCi0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0
aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNo
aXAua2luZF0ucHVzaChuYW1lKTsKLSAgICAgIGV4cGVuc2l2ZVByb3BlcnRpZXMucHVzaChuYW1l
KTsKLSAgICB9KTsKLQotICAgIHZhciBncm91cHMgPSBbCi0gICAgICB7Ci0gICAgICAgIG5hbWU6
ICdBdHRyaWJ1dGVzJywKLSAgICAgICAgcHJvcGVydGllczogYXR0cmlidXRlcywKLSAgICAgICAg
ZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAgewotICAgICAgICBuYW1lOiAnQmVsb25ncyBU
bycsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuYmVsb25nc1RvLAotICAgICAg
ICBleHBhbmQ6IHRydWUKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIG5hbWU6ICdIYXMgTWFu
eScsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuaGFzTWFueSwKLSAgICAgICAg
ZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAgewotICAgICAgICBuYW1lOiAnRmxhZ3MnLAot
ICAgICAgICBwcm9wZXJ0aWVzOiBbJ2lzTG9hZGVkJywgJ2lzRGlydHknLCAnaXNTYXZpbmcnLCAn
aXNEZWxldGVkJywgJ2lzRXJyb3InLCAnaXNOZXcnLCAnaXNWYWxpZCddCi0gICAgICB9Ci0gICAg
XTsKLQotICAgIHJldHVybiB7Ci0gICAgICBwcm9wZXJ0eUluZm86IHsKLSAgICAgICAgLy8gaW5j
bHVkZSBhbGwgb3RoZXIgbWl4aW5zIC8gcHJvcGVydGllcyAobm90IGp1c3QgdGhlIGdyb3VwZWQg
b25lcykKLSAgICAgICAgaW5jbHVkZU90aGVyUHJvcGVydGllczogdHJ1ZSwKLSAgICAgICAgZ3Jv
dXBzOiBncm91cHMsCi0gICAgICAgIC8vIGRvbid0IHByZS1jYWxjdWxhdGUgdW5sZXNzIGNhY2hl
ZAotICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzOiBleHBlbnNpdmVQcm9wZXJ0aWVzCi0gICAg
ICB9Ci0gICAgfTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci0vKioKLSAgRW1iZXIgRGF0YQotCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotICBAbWFpbiBlbWJl
ci1kYXRhCi0qLwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5TdHJpbmcucGx1cmFs
aXplID0gZnVuY3Rpb24od29yZCkgewotICByZXR1cm4gRW1iZXIuSW5mbGVjdG9yLmluZmxlY3Rv
ci5wbHVyYWxpemUod29yZCk7Ci19OwotCi1FbWJlci5TdHJpbmcuc2luZ3VsYXJpemUgPSBmdW5j
dGlvbih3b3JkKSB7Ci0gIHJldHVybiBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yLnNpbmd1bGFy
aXplKHdvcmQpOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBCTEFOS19S
RUdFWCA9IC9eXHMqJC87Ci0KLWZ1bmN0aW9uIGxvYWRVbmNvdW50YWJsZShydWxlcywgdW5jb3Vu
dGFibGUpIHsKLSAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHVuY291bnRhYmxlLmxlbmd0aDsg
aSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgcnVsZXMudW5jb3VudGFibGVbdW5jb3VudGFibGVbaV0u
dG9Mb3dlckNhc2UoKV0gPSB0cnVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGxvYWRJcnJlZ3VsYXIo
cnVsZXMsIGlycmVndWxhclBhaXJzKSB7Ci0gIHZhciBwYWlyOwotCi0gIGZvciAodmFyIGkgPSAw
LCBsZW5ndGggPSBpcnJlZ3VsYXJQYWlycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAg
IHBhaXIgPSBpcnJlZ3VsYXJQYWlyc1tpXTsKLQotICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzBd
LnRvTG93ZXJDYXNlKCldID0gcGFpclsxXTsKLSAgICBydWxlcy5pcnJlZ3VsYXJJbnZlcnNlW3Bh
aXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOwotICB9Ci19Ci0KLS8qKgotICBJbmZsZWN0
b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHN1cHBseWluZyBpbmZsZWN0aW9uIHJ1
bGVzIGZvciB5b3VyCi0gIGFwcGxpY2F0aW9uLiBFbWJlciBpbmNsdWRlcyBhIGRlZmF1bHQgc2V0
IG9mIGluZmxlY3Rpb24gcnVsZXMsIGFuZCBwcm92aWRlcyBhbgotICBBUEkgZm9yIHByb3ZpZGlu
ZyBhZGRpdGlvbmFsIHJ1bGVzLgotCi0gIEV4YW1wbGVzOgotCi0gIENyZWF0aW5nIGFuIGluZmxl
Y3RvciB3aXRoIG5vIHJ1bGVzLgotCi0gIGBgYGpzCi0gIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1i
ZXIuSW5mbGVjdG9yKCk7Ci0gIGBgYAotCi0gIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIHRo
ZSBkZWZhdWx0IGVtYmVyIHJ1bGVzZXQuCi0KLSAgYGBganMKLSAgdmFyIGluZmxlY3RvciA9IG5l
dyBFbWJlci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7Ci0KLSAgaW5m
bGVjdG9yLnBsdXJhbGl6ZSgnY293JykgLy89PiAna2luZScKLSAgaW5mbGVjdG9yLnNpbmd1bGFy
aXplKCdraW5lJykgLy89PiAnY293JwotICBgYGAKLQotICBDcmVhdGluZyBhbiBpbmZsZWN0b3Ig
YW5kIGFkZGluZyBydWxlcyBsYXRlci4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBpbmZsZWN0
b3IgPSBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yOwotCi0gIGluZmxlY3Rvci5wbHVyYWxpemUo
J2FkdmljZScpIC8vID0+ICdhZHZpY2VzJwotICBpbmZsZWN0b3IudW5jb3VudGFibGUoJ2Fkdmlj
ZScpOwotICBpbmZsZWN0b3IucGx1cmFsaXplKCdhZHZpY2UnKSAvLyA9PiAnYWR2aWNlJwotCi0g
IGluZmxlY3Rvci5wbHVyYWxpemUoJ2Zvcm11bGEnKSAvLyA9PiAnZm9ybXVsYXMnCi0gIGluZmxl
Y3Rvci5pcnJlZ3VsYXIoJ2Zvcm11bGEnLCAnZm9ybXVsYWUnKTsKLSAgaW5mbGVjdG9yLnBsdXJh
bGl6ZSgnZm9ybXVsYScpIC8vID0+ICdmb3JtdWxhZScKLQotICAvLyB5b3Ugd291bGQgbm90IG5l
ZWQgdG8gYWRkIHRoZXNlIGFzIHRoZXkgYXJlIHRoZSBkZWZhdWx0IHJ1bGVzCi0gIGluZmxlY3Rv
ci5wbHVyYWwoLyQvLCAncycpOwotICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKLSAg
YGBgCi0KLSAgQ3JlYXRpbmcgYW4gaW5mbGVjdG9yIHdpdGggYSBub25kZWZhdWx0IHJ1bGVzZXQu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcnVsZXMgPSB7Ci0gICAgcGx1cmFsczogIFsgLyQv
LCAncycgXSwKLSAgICBzaW5ndWxhcjogWyAvXHMkLywgJycgXSwKLSAgICBpcnJlZ3VsYXJQYWly
czogWwotICAgICAgWyAnY293JywgJ2tpbmUnIF0KLSAgICBdLAotICAgIHVuY291bnRhYmxlOiBb
ICdmaXNoJyBdCi0gIH07Ci0KLSAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3Io
cnVsZXMpOwotICBgYGAKLQotICBAY2xhc3MgSW5mbGVjdG9yCi0gIEBuYW1lc3BhY2UgRW1iZXIK
LSovCi1mdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNldCkgewotICBydWxlU2V0ID0gcnVsZVNldCB8
fCB7fTsKLSAgcnVsZVNldC51bmNvdW50YWJsZSA9IHJ1bGVTZXQudW5jb3VudGFibGUgfHwge307
Ci0gIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgPSBydWxlU2V0LmlycmVndWxhclBhaXJzIHx8IHt9
OwotCi0gIHZhciBydWxlcyA9IHRoaXMucnVsZXMgPSB7Ci0gICAgcGx1cmFsczogIHJ1bGVTZXQu
cGx1cmFscyB8fCBbXSwKLSAgICBzaW5ndWxhcjogcnVsZVNldC5zaW5ndWxhciB8fCBbXSwKLSAg
ICBpcnJlZ3VsYXI6IHt9LAotICAgIGlycmVndWxhckludmVyc2U6IHt9LAotICAgIHVuY291bnRh
YmxlOiB7fQotICB9OwotCi0gIGxvYWRVbmNvdW50YWJsZShydWxlcywgcnVsZVNldC51bmNvdW50
YWJsZSk7Ci0gIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMpOwot
fQotCi1JbmZsZWN0b3IucHJvdG90eXBlID0gewotICAvKioKLSAgICBAbWV0aG9kIHBsdXJhbAot
ICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcKLSAg
Ki8KLSAgcGx1cmFsOiBmdW5jdGlvbihyZWdleCwgc3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5w
bHVyYWxzLnB1c2goW3JlZ2V4LCBzdHJpbmcudG9Mb3dlckNhc2UoKV0pOwotICB9LAotCi0gIC8q
KgotICAgIEBtZXRob2Qgc2luZ3VsYXIKLSAgICBAcGFyYW0ge1JlZ0V4cH0gcmVnZXgKLSAgICBA
cGFyYW0ge1N0cmluZ30gc3RyaW5nCi0gICovCi0gIHNpbmd1bGFyOiBmdW5jdGlvbihyZWdleCwg
c3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5zaW5ndWxhci5wdXNoKFtyZWdleCwgc3RyaW5nLnRv
TG93ZXJDYXNlKCldKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHVuY291bnRhYmxlCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IHJlZ2V4Ci0gICovCi0gIHVuY291bnRhYmxlOiBmdW5jdGlvbihz
dHJpbmcpIHsKLSAgICBsb2FkVW5jb3VudGFibGUodGhpcy5ydWxlcywgW3N0cmluZy50b0xvd2Vy
Q2FzZSgpXSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBpcnJlZ3VsYXIKLSAgICBAcGFy
YW0ge1N0cmluZ30gc2luZ3VsYXIKLSAgICBAcGFyYW0ge1N0cmluZ30gcGx1cmFsCi0gICovCi0g
IGlycmVndWxhcjogZnVuY3Rpb24gKHNpbmd1bGFyLCBwbHVyYWwpIHsKLSAgICBsb2FkSXJyZWd1
bGFyKHRoaXMucnVsZXMsIFtbc2luZ3VsYXIsIHBsdXJhbF1dKTsKLSAgfSwKLQotICAvKioKLSAg
ICBAbWV0aG9kIHBsdXJhbGl6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCi0gICovCi0gIHBs
dXJhbGl6ZTogZnVuY3Rpb24od29yZCkgewotICAgIHJldHVybiB0aGlzLmluZmxlY3Qod29yZCwg
dGhpcy5ydWxlcy5wbHVyYWxzLCB0aGlzLnJ1bGVzLmlycmVndWxhcik7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCBzaW5ndWxhcml6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCi0gICov
Ci0gIHNpbmd1bGFyaXplOiBmdW5jdGlvbih3b3JkKSB7Ci0gICAgcmV0dXJuIHRoaXMuaW5mbGVj
dCh3b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCAgdGhpcy5ydWxlcy5pcnJlZ3VsYXJJbnZlcnNl
KTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJvdGVjdGVkCi0KLSAgICBAbWV0aG9kIGluZmxlY3QK
LSAgICBAcGFyYW0ge1N0cmluZ30gd29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSB0eXBlUnVsZXMK
LSAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFyCi0gICovCi0gIGluZmxlY3Q6IGZ1bmN0aW9u
KHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7Ci0gICAgdmFyIGluZmxlY3Rpb24sIHN1YnN0
aXR1dGlvbiwgcmVzdWx0LCBsb3dlcmNhc2UsIGlzQmxhbmssCi0gICAgaXNVbmNvdW50YWJsZSwg
aXNJcnJlZ3VsYXIsIGlzSXJyZWd1bGFySW52ZXJzZSwgcnVsZTsKLQotICAgIGlzQmxhbmsgPSBC
TEFOS19SRUdFWC50ZXN0KHdvcmQpOwotCi0gICAgaWYgKGlzQmxhbmspIHsKLSAgICAgIHJldHVy
biB3b3JkOwotICAgIH0KLQotICAgIGxvd2VyY2FzZSA9IHdvcmQudG9Mb3dlckNhc2UoKTsKLQot
ICAgIGlzVW5jb3VudGFibGUgPSB0aGlzLnJ1bGVzLnVuY291bnRhYmxlW2xvd2VyY2FzZV07Ci0K
LSAgICBpZiAoaXNVbmNvdW50YWJsZSkgewotICAgICAgcmV0dXJuIHdvcmQ7Ci0gICAgfQotCi0g
ICAgaXNJcnJlZ3VsYXIgPSBpcnJlZ3VsYXIgJiYgaXJyZWd1bGFyW2xvd2VyY2FzZV07Ci0KLSAg
ICBpZiAoaXNJcnJlZ3VsYXIpIHsKLSAgICAgIHJldHVybiBpc0lycmVndWxhcjsKLSAgICB9Ci0K
LSAgICBmb3IgKHZhciBpID0gdHlwZVJ1bGVzLmxlbmd0aCwgbWluID0gMDsgaSA+IG1pbjsgaS0t
KSB7Ci0gICAgICAgaW5mbGVjdGlvbiA9IHR5cGVSdWxlc1tpLTFdOwotICAgICAgIHJ1bGUgPSBp
bmZsZWN0aW9uWzBdOwotCi0gICAgICBpZiAocnVsZS50ZXN0KHdvcmQpKSB7Ci0gICAgICAgIGJy
ZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGluZmxlY3Rpb24gPSBpbmZsZWN0aW9uIHx8IFtd
OwotCi0gICAgcnVsZSA9IGluZmxlY3Rpb25bMF07Ci0gICAgc3Vic3RpdHV0aW9uID0gaW5mbGVj
dGlvblsxXTsKLQotICAgIHJlc3VsdCA9IHdvcmQucmVwbGFjZShydWxlLCBzdWJzdGl0dXRpb24p
OwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfTsKLQotRW1iZXIuSW5mbGVjdG9yID0gSW5m
bGVjdG9yOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1iZXIuSW5mbGVjdG9yLmRl
ZmF1bHRSdWxlcyA9IHsKLSAgcGx1cmFsczogWwotICAgIFsvJC8sICdzJ10sCi0gICAgWy9zJC9p
LCAncyddLAotICAgIFsvXihheHx0ZXN0KWlzJC9pLCAnJDFlcyddLAotICAgIFsvKG9jdG9wfHZp
cil1cyQvaSwgJyQxaSddLAotICAgIFsvKG9jdG9wfHZpcilpJC9pLCAnJDFpJ10sCi0gICAgWy8o
YWxpYXN8c3RhdHVzKSQvaSwgJyQxZXMnXSwKLSAgICBbLyhidSlzJC9pLCAnJDFzZXMnXSwKLSAg
ICBbLyhidWZmYWx8dG9tYXQpbyQvaSwgJyQxb2VzJ10sCi0gICAgWy8oW3RpXSl1bSQvaSwgJyQx
YSddLAotICAgIFsvKFt0aV0pYSQvaSwgJyQxYSddLAotICAgIFsvc2lzJC9pLCAnc2VzJ10sCi0g
ICAgWy8oPzooW15mXSlmZXwoW2xyXSlmKSQvaSwgJyQxJDJ2ZXMnXSwKLSAgICBbLyhoaXZlKSQv
aSwgJyQxcyddLAotICAgIFsvKFteYWVpb3V5XXxxdSl5JC9pLCAnJDFpZXMnXSwKLSAgICBbLyh4
fGNofHNzfHNoKSQvaSwgJyQxZXMnXSwKLSAgICBbLyhtYXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQv
aSwgJyQxaWNlcyddLAotICAgIFsvXihtfGwpb3VzZSQvaSwgJyQxaWNlJ10sCi0gICAgWy9eKG18
bClpY2UkL2ksICckMWljZSddLAotICAgIFsvXihveCkkL2ksICckMWVuJ10sCi0gICAgWy9eKG94
ZW4pJC9pLCAnJDEnXSwKLSAgICBbLyhxdWl6KSQvaSwgJyQxemVzJ10KLSAgXSwKLQotICBzaW5n
dWxhcjogWwotICAgIFsvcyQvaSwgJyddLAotICAgIFsvKHNzKSQvaSwgJyQxJ10sCi0gICAgWy8o
billd3MkL2ksICckMWV3cyddLAotICAgIFsvKFt0aV0pYSQvaSwgJyQxdW0nXSwKLSAgICBbLygo
YSluYWx5fChiKWF8KGQpaWFnbm98KHApYXJlbnRoZXwocClyb2dub3wocyl5bm9wfCh0KWhlKShz
aXN8c2VzKSQvaSwgJyQxc2lzJ10sCi0gICAgWy8oXmFuYWx5KShzaXN8c2VzKSQvaSwgJyQxc2lz
J10sCi0gICAgWy8oW15mXSl2ZXMkL2ksICckMWZlJ10sCi0gICAgWy8oaGl2ZSlzJC9pLCAnJDEn
XSwKLSAgICBbLyh0aXZlKXMkL2ksICckMSddLAotICAgIFsvKFtscl0pdmVzJC9pLCAnJDFmJ10s
Ci0gICAgWy8oW15hZWlvdXldfHF1KWllcyQvaSwgJyQxeSddLAotICAgIFsvKHMpZXJpZXMkL2ks
ICckMWVyaWVzJ10sCi0gICAgWy8obSlvdmllcyQvaSwgJyQxb3ZpZSddLAotICAgIFsvKHh8Y2h8
c3N8c2gpZXMkL2ksICckMSddLAotICAgIFsvXihtfGwpaWNlJC9pLCAnJDFvdXNlJ10sCi0gICAg
Wy8oYnVzKShlcyk/JC9pLCAnJDEnXSwKLSAgICBbLyhvKWVzJC9pLCAnJDEnXSwKLSAgICBbLyhz
aG9lKXMkL2ksICckMSddLAotICAgIFsvKGNyaXN8dGVzdCkoaXN8ZXMpJC9pLCAnJDFpcyddLAot
ICAgIFsvXihhKXhbaWVdcyQvaSwgJyQxeGlzJ10sCi0gICAgWy8ob2N0b3B8dmlyKSh1c3xpKSQv
aSwgJyQxdXMnXSwKLSAgICBbLyhhbGlhc3xzdGF0dXMpKGVzKT8kL2ksICckMSddLAotICAgIFsv
XihveCllbi9pLCAnJDEnXSwKLSAgICBbLyh2ZXJ0fGluZClpY2VzJC9pLCAnJDFleCddLAotICAg
IFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwKLSAgICBbLyhxdWl6KXplcyQvaSwgJyQxJ10sCi0g
ICAgWy8oZGF0YWJhc2UpcyQvaSwgJyQxJ10KLSAgXSwKLQotICBpcnJlZ3VsYXJQYWlyczogWwot
ICAgIFsncGVyc29uJywgJ3Blb3BsZSddLAotICAgIFsnbWFuJywgJ21lbiddLAotICAgIFsnY2hp
bGQnLCAnY2hpbGRyZW4nXSwKLSAgICBbJ3NleCcsICdzZXhlcyddLAotICAgIFsnbW92ZScsICdt
b3ZlcyddLAotICAgIFsnY293JywgJ2tpbmUnXSwKLSAgICBbJ3pvbWJpZScsICd6b21iaWVzJ10K
LSAgXSwKLQotICB1bmNvdW50YWJsZTogWwotICAgICdlcXVpcG1lbnQnLAotICAgICdpbmZvcm1h
dGlvbicsCi0gICAgJ3JpY2UnLAotICAgICdtb25leScsCi0gICAgJ3NwZWNpZXMnLAotICAgICdz
ZXJpZXMnLAotICAgICdmaXNoJywKLSAgICAnc2hlZXAnLAotICAgICdqZWFucycsCi0gICAgJ3Bv
bGljZScKLSAgXQotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLWlmIChFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJp
bmcpIHsKLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3BsdXJhbGl6
ZSJ9fXt7L2Nyb3NzTGlua319Ci0KLSAgICBAbWV0aG9kIHBsdXJhbGl6ZQotICAgIEBmb3IgU3Ry
aW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUucGx1cmFsaXplID0gZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxpemUodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0g
ICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3Npbmd1bGFyaXplIn19e3svY3Jvc3NM
aW5rfX0KLQotICAgIEBtZXRob2Qgc2luZ3VsYXJpemUKLSAgICBAZm9yIFN0cmluZwotICAqLwot
ICBTdHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZSh0aGlzKTsKLSAgfTsKLX0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLUVtYmVyLkluZmxlY3Rvci5pbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5m
bGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0UnVsZXMpOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJl
ci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIGZvckVhY2ggPSBFbWJlci5F
bnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKLSAgICBjYW1lbGl6ZSA9ICAgRW1iZXIuU3RyaW5nLmNh
bWVsaXplLAotICAgIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwKLSAgICBk
ZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgc2luZ3VsYXJpemUgPSBF
bWJlci5TdHJpbmcuc2luZ3VsYXJpemUsCi0gICAgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51
bmRlcnNjb3JlOwotCi1EUy5BY3RpdmVNb2RlbFNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXpl
ci5leHRlbmQoewotICAvLyBTRVJJQUxJWkUKLQotICAvKioKLSAgICBDb252ZXJ0cyBjYW1lbGNh
c2VkIGF0dHJpYnV0ZXMgdG8gdW5kZXJzY29yZWQgd2hlbiBzZXJpYWxpemluZy4KLQotICAgIEBt
ZXRob2Qga2V5Rm9yQXR0cmlidXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGF0dHJpYnV0ZQotICAg
IEByZXR1cm5zIFN0cmluZwotICAqLwotICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIp
IHsKLSAgICByZXR1cm4gZGVjYW1lbGl6ZShhdHRyKTsKLSAgfSwKLQotICAvKioKLSAgICBVbmRl
cnNjb3JlcyByZWxhdGlvbnNoaXAgbmFtZXMgYW5kIGFwcGVuZHMgIl9pZCIgb3IgIl9pZHMiIHdo
ZW4gc2VyaWFsaXppbmcKLSAgICByZWxhdGlvbnNoaXAga2V5cy4KLQotICAgIEBtZXRob2Qga2V5
Rm9yUmVsYXRpb25zaGlwCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBraW5kCi0gICAgQHJldHVybnMgU3RyaW5nCi0gICovCi0gIGtleUZvclJlbGF0aW9uc2hp
cDogZnVuY3Rpb24oa2V5LCBraW5kKSB7Ci0gICAga2V5ID0gZGVjYW1lbGl6ZShrZXkpOwotICAg
IGlmIChraW5kID09PSAiYmVsb25nc1RvIikgewotICAgICAgcmV0dXJuIGtleSArICJfaWQiOwot
ICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImhhc01hbnkiKSB7Ci0gICAgICByZXR1cm4gc2luZ3Vs
YXJpemUoa2V5KSArICJfaWRzIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGtleTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgRG9lcyBub3Qgc2VyaWFsaXplIGhhc01hbnkgcmVsYXRp
b25zaGlwcyBieSBkZWZhdWx0LgotICAqLwotICBzZXJpYWxpemVIYXNNYW55OiBFbWJlci5LLAot
Ci0gIC8qKgotICAgIFVuZGVyc2NvcmVzIHRoZSBKU09OIHJvb3Qga2V5cyB3aGVuIHNlcmlhbGl6
aW5nLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVJbnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0
fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0g
IHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMp
IHsKLSAgICB2YXIgcm9vdCA9IHVuZGVyc2NvcmUoZGVjYW1lbGl6ZSh0eXBlLnR5cGVLZXkpKTsK
LSAgICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCBvcHRpb25zKTsKLSAgfSwK
LQotICAvKioKLSAgICBTZXJpYWxpemVzIGEgcG9seW1vcnBoaWMgdHlwZSBhcyBhIGZ1bGx5IGNh
cGl0YWxpemVkIG1vZGVsIG5hbWUuCi0KLSAgICBAbWV0aG9kIHNlcmlhbGl6ZVBvbHltb3JwaGlj
VHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBq
c29uCi0gICAgQHBhcmFtIHJlbGF0aW9uc2hpcAotICAqLwotICBzZXJpYWxpemVQb2x5bW9ycGhp
Y1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtl
eSA9IHJlbGF0aW9uc2hpcC5rZXksCi0gICAgICAgIGJlbG9uZ3NUbyA9IGdldChyZWNvcmQsIGtl
eSk7Ci0gICAga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICBqc29uW2tleSAr
ICJfdHlwZSJdID0gY2FwaXRhbGl6ZShjYW1lbGl6ZShiZWxvbmdzVG8uY29uc3RydWN0b3IudHlw
ZUtleSkpOwotICB9LAotCi0gIC8vIEVYVFJBQ1QKLQotICAvKioKLSAgICBFeHRyYWN0cyB0aGUg
bW9kZWwgdHlwZUtleSBmcm9tIHVuZGVyc2NvcmVkIHJvb3Qgb2JqZWN0cy4KLQotICAgIEBtZXRo
b2QgdHlwZUZvclJvb3QKLSAgICBAcGFyYW0ge1N0cmluZ30gcm9vdAotICAgIEByZXR1cm5zIFN0
cmluZyB0aGUgbW9kZWwncyB0eXBlS2V5Ci0gICovCi0gIHR5cGVGb3JSb290OiBmdW5jdGlvbihy
b290KSB7Ci0gICAgdmFyIGNhbWVsaXplZCA9IGNhbWVsaXplKHJvb3QpOwotICAgIHJldHVybiBz
aW5ndWxhcml6ZShjYW1lbGl6ZWQpOwotICB9LAotCi0gIC8qKgotICAgIEFkZCBleHRyYSBzdGVw
IHRvIGBEUy5SRVNUU2VyaWFsaXplci5ub3JtYWxpemVgIHNvIGxpbmtzIGFyZQotICAgIG5vcm1h
bGl6ZWQuCi0KLSAgICBJZiB5b3VyIHBheWxvYWQgbG9va3MgbGlrZSB0aGlzCi0KLSAgICBgYGBq
cwotICAgIHsKLSAgICAgICJwb3N0IjogewotICAgICAgICAiaWQiOiAxLAotICAgICAgICAidGl0
bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAgICJsaW5rcyI6IHsgImZsYWdnZWRfY29t
bWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBg
Ci0gICAgVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiB3b3VsZCBsb29rIGxpa2UgdGhpcwotCi0gICAg
YGBganMKLSAgICB7Ci0gICAgICAicG9zdCI6IHsKLSAgICAgICAgImlkIjogMSwKLSAgICAgICAg
InRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAotICAgICAgICAibGlua3MiOiB7ICJmbGFnZ2Vk
Q29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAg
YGBgCi0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gaGFzaAotICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wCi0gICAgQHJldHVybnMgT2JqZWN0Ci0gICovCi0KLSAgbm9ybWFsaXplOiBmdW5jdGlv
bih0eXBlLCBoYXNoLCBwcm9wKSB7Ci0gICAgdGhpcy5ub3JtYWxpemVMaW5rcyhoYXNoKTsKLQot
ICAgIHJldHVybiB0aGlzLl9zdXBlcih0eXBlLCBoYXNoLCBwcm9wKTsKLSAgfSwKLQotICAvKioK
LSAgICBDb252ZXJ0IGBzbmFrZV9jYXNlZGAgbGlua3MgIHRvIGBjYW1lbENhc2VgCi0KLSAgICBA
bWV0aG9kIG5vcm1hbGl6ZUxpbmtzCi0gICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgKi8KLQot
ICBub3JtYWxpemVMaW5rczogZnVuY3Rpb24oZGF0YSl7Ci0gICAgaWYgKGRhdGEubGlua3MpIHsK
LSAgICAgIHZhciBsaW5rcyA9IGRhdGEubGlua3M7Ci0KLSAgICAgIGZvciAodmFyIGxpbmsgaW4g
bGlua3MpIHsKLSAgICAgICAgdmFyIGNhbWVsaXplZExpbmsgPSBjYW1lbGl6ZShsaW5rKTsKLQot
ICAgICAgICBpZiAoY2FtZWxpemVkTGluayAhPT0gbGluaykgewotICAgICAgICAgIGxpbmtzW2Nh
bWVsaXplZExpbmtdID0gbGlua3NbbGlua107Ci0gICAgICAgICAgZGVsZXRlIGxpbmtzW2xpbmtd
OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIE5vcm1hbGl6
ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSBmcm9tIHRoZSBKU09OLgotCi0gICAgTm9ybWFsaXplOgot
ICAgIGBgYGpzCi0gICAgICB7Ci0gICAgICAgIGlkOiAiMSIKLSAgICAgICAgbWluaW9uOiB7IHR5
cGU6ICJldmlsX21pbmlvbiIsIGlkOiAiMTIifQotICAgICAgfQotICAgIGBgYAotCi0gICAgVG86
Ci0gICAgYGBganMKLSAgICAgIHsKLSAgICAgICAgaWQ6ICIxIgotICAgICAgICBtaW5pb246IHsg
dHlwZTogImV2aWxNaW5pb24iLCBpZDogIjEyIn0KLSAgICAgIH0KLSAgICBgYGAKLQotICAgIEBt
ZXRob2Qgbm9ybWFsaXplUmVsYXRpb25zaGlwcwotICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1h
bGl6ZVJlbGF0aW9uc2hpcHM6IGZ1bmN0aW9uKHR5cGUsIGhhc2gpIHsKLSAgICB2YXIgcGF5bG9h
ZEtleSwgcGF5bG9hZDsKLQotICAgIGlmICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgewotICAg
ICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0g
ICAgICAgIGlmIChyZWxhdGlvbnNoaXAub3B0aW9ucy5wb2x5bW9ycGhpYykgewotICAgICAgICAg
IHBheWxvYWRLZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpOwotICAgICAgICAgIHBheWxv
YWQgPSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWQu
dHlwZSkgewotICAgICAgICAgICAgcGF5bG9hZC50eXBlID0gdGhpcy50eXBlRm9yUm9vdChwYXls
b2FkLnR5cGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiByZWxhdGlvbnNoaXAu
a2luZCA9PT0gImhhc01hbnkiKSB7Ci0gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAg
ICAgICAgICBmb3JFYWNoKHBheWxvYWQsIGZ1bmN0aW9uKHNpbmdsZSkgewotICAgICAgICAgICAg
ICBzaW5nbGUudHlwZSA9IHNlbGYudHlwZUZvclJvb3Qoc2luZ2xlLnR5cGUpOwotICAgICAgICAg
ICAgfSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBheWxvYWRL
ZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKLSAg
ICAgICAgICBwYXlsb2FkID0gaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgICAgfQotCi0gICAgICAg
IGhhc2hba2V5XSA9IHBheWxvYWQ7Ci0KLSAgICAgICAgaWYgKGtleSAhPT0gcGF5bG9hZEtleSkg
ewotICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICB9Ci0gICAgICB9
LCB0aGlzKTsKLSAgICB9Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIGdldCA9IEVtYmVyLmdldDsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2g7Ci0KLS8qKgotICBUaGUgRW1iZWRkZWRSZWNvcmRzTWl4aW4gYWxsb3dzIHlvdSB0
byBhZGQgZW1iZWRkZWQgcmVjb3JkIHN1cHBvcnQgdG8geW91cgotICBzZXJpYWxpemVycy4KLSAg
VG8gc2V0IHVwIGVtYmVkZGVkIHJlY29yZHMsIHlvdSBpbmNsdWRlIHRoZSBtaXhpbiBpbnRvIHRo
ZSBzZXJpYWxpemVyIGFuZCB0aGVuCi0gIGRlZmluZSB5b3VyIGVtYmVkZGVkIHJlbGF0aW9ucy4K
LQotICBgYGBqcwotICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2RlbFNlcmlhbGl6
ZXIuZXh0ZW5kKERTLkVtYmVkZGVkUmVjb3Jkc01peGluLCB7Ci0gICAgYXR0cnM6IHsKLSAgICAg
IGNvbW1lbnRzOiB7ZW1iZWRkZWQ6ICdhbHdheXMnfQotICAgIH0KLSAgfSkKLSAgYGBgCi0KLSAg
Q3VycmVudGx5IG9ubHkgYHtlbWJlZGRlZDogJ2Fsd2F5cyd9YCByZWNvcmRzIGFyZSBzdXBwb3J0
ZWQuCi0KLSAgQGNsYXNzIEVtYmVkZGVkUmVjb3Jkc01peGluCi0gIEBuYW1lc3BhY2UgRFMKLSov
Ci1EUy5FbWJlZGRlZFJlY29yZHNNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0KLSAgLyoq
Ci0gICAgU2VyaWFsaXplIGhhcy1tYXkgcmVsYXRpb25zaGlwIHdoZW4gaXQgaXMgY29uZmlndXJl
ZCBhcyBlbWJlZGRlZCBvYmplY3RzLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVIYXNNYW55Ci0g
ICovCi0gIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25z
aGlwKSB7Ci0gICAgdmFyIGtleSAgID0gcmVsYXRpb25zaGlwLmtleSwKLSAgICAgICAgYXR0cnMg
PSBnZXQodGhpcywgJ2F0dHJzJyksCi0gICAgICAgIGVtYmVkID0gYXR0cnMgJiYgYXR0cnNba2V5
XSAmJiBhdHRyc1trZXldLmVtYmVkZGVkID09PSAnYWx3YXlzJzsKLQotICAgIGlmIChlbWJlZCkg
ewotICAgICAganNvblt0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpXSA9IGdldChyZWNvcmQsIGtl
eSkubWFwKGZ1bmN0aW9uKHJlbGF0aW9uKSB7Ci0gICAgICAgIHZhciBkYXRhID0gcmVsYXRpb24u
c2VyaWFsaXplKCksCi0gICAgICAgICAgICBwcmltYXJ5S2V5ID0gZ2V0KHRoaXMsICdwcmltYXJ5
S2V5Jyk7Ci0KLSAgICAgICAgZGF0YVtwcmltYXJ5S2V5XSA9IGdldChyZWxhdGlvbiwgcHJpbWFy
eUtleSk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0g
IH0sCi0KLSAgLyoqCi0gICAgRXh0cmFjdCBlbWJlZGRlZCBvYmplY3RzIG91dCBvZiB0aGUgcGF5
bG9hZCBmb3IgYSBzaW5nbGUgb2JqZWN0Ci0gICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQg
b2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1ldGhvZCBleHRyYWN0U2luZ2xlCi0gICovCi0gIGV4
dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBwcmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3Jk
SWQsIHJlcXVlc3RUeXBlKSB7Ci0gICAgdmFyIHJvb3QgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShw
cmltYXJ5VHlwZS50eXBlS2V5KSwKLSAgICAgICAgcGFydGlhbCA9IHBheWxvYWRbcm9vdF07Ci0K
LSAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCB0aGlzLCBwcmltYXJ5VHlwZSwg
cGFydGlhbCwgcGF5bG9hZCk7Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHByaW1h
cnlUeXBlLCBwYXlsb2FkLCByZWNvcmRJZCwgcmVxdWVzdFR5cGUpOwotICB9LAotCi0gIC8qKgot
ICAgIEV4dHJhY3QgZW1iZWRkZWQgb2JqZWN0cyBvdXQgb2YgYSBzdGFuZGFyZCBwYXlsb2FkCi0g
ICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1l
dGhvZCBleHRyYWN0QXJyYXkKLSAgKi8KLSAgZXh0cmFjdEFycmF5OiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgcGF5bG9hZCkgewotICAgIHZhciByb290ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUodHlw
ZS50eXBlS2V5KSwKLSAgICAgICAgcGFydGlhbHMgPSBwYXlsb2FkW0VtYmVyLlN0cmluZy5wbHVy
YWxpemUocm9vdCldOwotCi0gICAgZm9yRWFjaChwYXJ0aWFscywgZnVuY3Rpb24ocGFydGlhbCkg
ewotICAgICAgdXBkYXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgdGhpcywgdHlwZSwgcGFy
dGlhbCwgcGF5bG9hZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIo
c3RvcmUsIHR5cGUsIHBheWxvYWQpOwotICB9Ci19KTsKLQotZnVuY3Rpb24gdXBkYXRlUGF5bG9h
ZFdpdGhFbWJlZGRlZChzdG9yZSwgc2VyaWFsaXplciwgdHlwZSwgcGFydGlhbCwgcGF5bG9hZCkg
ewotICB2YXIgYXR0cnMgPSBnZXQoc2VyaWFsaXplciwgJ2F0dHJzJyk7Ci0KLSAgaWYgKCFhdHRy
cykgewotICAgIHJldHVybjsKLSAgfQotCi0gIHR5cGUuZWFjaFJlbGF0aW9uc2hpcChmdW5jdGlv
bihrZXksIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBleHBhbmRlZEtleSwgZW1iZWRkZWRUeXBl
S2V5LCBhdHRyaWJ1dGUsIGlkcywKLSAgICAgICAgY29uZmlnID0gYXR0cnNba2V5XSwKLSAgICAg
ICAgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IocmVsYXRpb25zaGlwLnR5cGUudHlw
ZUtleSksCi0gICAgICAgIHByaW1hcnlLZXkgPSBnZXQoc2VyaWFsaXplciwgInByaW1hcnlLZXki
KTsKLQotICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCAhPT0gImhhc01hbnkiKSB7Ci0gICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNvbmZpZyAmJiAoY29uZmlnLmVtYmVkZGVkID09PSAn
YWx3YXlzJyB8fCBjb25maWcuZW1iZWRkZWQgPT09ICdsb2FkJykpIHsKLSAgICAgIC8vIHVuZGVy
c2NvcmUgZm9yY2VzIHRoZSBlbWJlZGRlZCByZWNvcmRzIHRvIGJlIHNpZGUgbG9hZGVkLgotICAg
ICAgLy8gaXQgaXMgbmVlZGVkIHdoZW4gbWFpbiB0eXBlID09PSByZWxhdGlvbnNoaXAudHlwZQot
ICAgICAgZW1iZWRkZWRUeXBlS2V5ID0gJ18nICsgRW1iZXIuU3RyaW5nLnBsdXJhbGl6ZShyZWxh
dGlvbnNoaXAudHlwZS50eXBlS2V5KTsKLSAgICAgIGV4cGFuZGVkS2V5ID0gdGhpcy5rZXlGb3JS
ZWxhdGlvbnNoaXAoa2V5LCByZWxhdGlvbnNoaXAua2luZCk7Ci0gICAgICBhdHRyaWJ1dGUgID0g
dGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICAgIGlkcyA9IFtdOwotCi0gICAgICBpZiAo
IXBhcnRpYWxbYXR0cmlidXRlXSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAg
IHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSA9IHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSB8fCBb
XTsKLQotICAgICAgZm9yRWFjaChwYXJ0aWFsW2F0dHJpYnV0ZV0sIGZ1bmN0aW9uKGRhdGEpIHsK
LSAgICAgICAgdmFyIGVtYmVkZGVkVHlwZSA9IHN0b3JlLm1vZGVsRm9yKHJlbGF0aW9uc2hpcC50
eXBlLnR5cGVLZXkpOwotICAgICAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCBz
ZXJpYWxpemVyLCBlbWJlZGRlZFR5cGUsIGRhdGEsIHBheWxvYWQpOwotICAgICAgICBpZHMucHVz
aChkYXRhW3ByaW1hcnlLZXldKTsKLSAgICAgICAgcGF5bG9hZFtlbWJlZGRlZFR5cGVLZXldLnB1
c2goZGF0YSk7Ci0gICAgICB9KTsKLQotICAgICAgcGFydGlhbFtleHBhbmRlZEtleV0gPSBpZHM7
Ci0gICAgICBkZWxldGUgcGFydGlhbFthdHRyaWJ1dGVdOwotICAgIH0KLSAgfSwgc2VyaWFsaXpl
cik7Ci19Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXIt
ZGF0YQotKi8KLQotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsK
LXZhciBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgdW5kZXJzY29y
ZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLAotICAgIHBsdXJhbGl6ZSAgPSBFbWJlci5TdHJp
bmcucGx1cmFsaXplOwotCi0vKioKLSAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBpcyBhIHN1YmNs
YXNzIG9mIHRoZSBSRVNUQWRhcHRlciBkZXNpZ25lZCB0byBpbnRlZ3JhdGUKLSAgd2l0aCBhIEpT
T04gQVBJIHRoYXQgdXNlcyBhbiB1bmRlcnNjb3JlZCBuYW1pbmcgY29udmVudGlvbiBpbnN0ZWFk
IG9mIGNhbWVsY2FzaW5nLgotICBJdCBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrIG91dCBvZiB0
aGUgYm94IHdpdGggdGhlCi0gIFthY3RpdmVfbW9kZWxfc2VyaWFsaXplcnNdKGh0dHA6Ly9naXRo
dWIuY29tL3JhaWxzLWFwaS9hY3RpdmVfbW9kZWxfc2VyaWFsaXplcnMpCi0gIFJ1YnkgZ2VtLgot
Ci0gIFRoaXMgYWRhcHRlciBleHRlbmRzIHRoZSBEUy5SRVNUQWRhcHRlciBieSBtYWtpbmcgY29u
c2lzdGVudCB1c2Ugb2YgdGhlIGNhbWVsaXphdGlvbiwKLSAgZGVjYW1lbGl6YXRpb24gYW5kIHBs
dXJhbGl6YXRpb24gbWV0aG9kcyB0byBub3JtYWxpemUgdGhlIHNlcmlhbGl6ZWQgSlNPTiBpbnRv
IGEKLSAgZm9ybWF0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGEgY29udmVudGlvbmFsIFJhaWxz
IGJhY2tlbmQgYW5kIEVtYmVyIERhdGEuCi0KLSAgIyMgSlNPTiBTdHJ1Y3R1cmUKLQotICBUaGUg
QWN0aXZlTW9kZWxBZGFwdGVyIGV4cGVjdHMgdGhlIEpTT04gcmV0dXJuZWQgZnJvbSB5b3VyIHNl
cnZlciB0byBmb2xsb3cKLSAgdGhlIFJFU1QgYWRhcHRlciBjb252ZW50aW9ucyBzdWJzdGl0dXRp
bmcgdW5kZXJzY29yZWQga2V5cyBmb3IgY2FtZWxjYXNlZCBvbmVzLgotCi0gICMjIyBDb252ZW50
aW9uYWwgTmFtZXMKLQotICBBdHRyaWJ1dGUgbmFtZXMgaW4geW91ciBKU09OIHBheWxvYWQgc2hv
dWxkIGJlIHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9ucyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5
b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVy
c29uYCBtb2RlbDoKLQotICBgYGBqcwotICBBcHAuRmFtb3VzUGVyc29uID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGxhc3ROYW1lOiBE
Uy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQotICB9
KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgot
Ci0gIGBgYGpzCi0gIHsKLSAgICAiZmFtb3VzX3BlcnNvbiI6IHsKLSAgICAgICJmaXJzdF9uYW1l
IjogIkJhcmFjayIsCi0gICAgICAibGFzdF9uYW1lIjogIk9iYW1hIiwKLSAgICAgICJvY2N1cGF0
aW9uIjogIlByZXNpZGVudCIKLSAgICB9Ci0gIH0KLSAgYGBgCi0KLSAgQGNsYXNzIEFjdGl2ZU1v
ZGVsQWRhcHRlcgotICBAY29uc3RydWN0b3IKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBE
Uy5BZGFwdGVyCi0qKi8KLQotRFMuQWN0aXZlTW9kZWxBZGFwdGVyID0gRFMuUkVTVEFkYXB0ZXIu
ZXh0ZW5kKHsKLSAgZGVmYXVsdFNlcmlhbGl6ZXI6ICctYWN0aXZlLW1vZGVsJywKLSAgLyoqCi0g
ICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBwYXRoRm9yVHlwZWAgbWV0
aG9kIHRvIGJ1aWxkCi0gICAgdW5kZXJzY29yZWQgVVJMcyBieSBkZWNhbWVsaXppbmcgYW5kIHBs
dXJhbGl6aW5nIHRoZSBvYmplY3QgdHlwZSBuYW1lLgotCi0gICAgYGBganMKLSAgICAgIHRoaXMu
cGF0aEZvclR5cGUoImZhbW91c1BlcnNvbiIpOwotICAgICAgLy89PiAiZmFtb3VzX3Blb3BsZSIK
LSAgICBgYGAKLQotICAgIEBtZXRob2QgcGF0aEZvclR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
dHlwZQotICAgIEByZXR1cm5zIFN0cmluZwotICAqLwotICBwYXRoRm9yVHlwZTogZnVuY3Rpb24o
dHlwZSkgewotICAgIHZhciBkZWNhbWVsaXplZCA9IGRlY2FtZWxpemUodHlwZSk7Ci0gICAgdmFy
IHVuZGVyc2NvcmVkID0gdW5kZXJzY29yZShkZWNhbWVsaXplZCk7Ci0gICAgcmV0dXJuIHBsdXJh
bGl6ZSh1bmRlcnNjb3JlZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIEFjdGl2ZU1vZGVsQWRh
cHRlciBvdmVycmlkZXMgdGhlIGBhamF4RXJyb3JgIG1ldGhvZAotICAgIHRvIHJldHVybiBhIERT
LkludmFsaWRFcnJvciBmb3IgYWxsIDQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eQotICAgIHJlc3Bv
bnNlcy4KLQotICAgIEEgNDIyIEhUVFAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGdlbmVyYWxs
eSBpbXBsaWVzIHRoYXQgdGhlIHJlcXVlc3QKLSAgICB3YXMgd2VsbCBmb3JtZWQgYnV0IHRoZSBB
UEkgd2FzIHVuYWJsZSB0byBwcm9jZXNzIGl0IGJlY2F1c2UgdGhlCi0gICAgY29udGVudCB3YXMg
bm90IHNlbWFudGljYWxseSBjb3JyZWN0IG9yIG1lYW5pbmdmdWwgcGVyIHRoZSBBUEkuCi0KLSAg
ICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiA0MjIgSFRUUCBFcnJvciBjb2RlIHNlZSAxMS4yIFdl
YkRBViBSRkMgNDkxOAotICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0OTE4I3Nl
Y3Rpb24tMTEuMgotCi0gICAgQG1ldGhvZCBhamF4RXJyb3IKLSAgICBAcGFyYW0ganFYSFIKLSAg
ICBAcmV0dXJucyBlcnJvcgotICAqLwotICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0g
ICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOwotCi0gICAgaWYgKGpxWEhSICYmIGpx
WEhSLnN0YXR1cyA9PT0gNDIyKSB7Ci0gICAgICB2YXIgcmVzcG9uc2UgPSBFbWJlci4kLnBhcnNl
SlNPTihqcVhIUi5yZXNwb25zZVRleHQpLAotICAgICAgICAgIGVycm9ycyA9IHt9OwotCi0gICAg
ICBpZiAocmVzcG9uc2UuZXJyb3JzICE9PSB1bmRlZmluZWQpIHsKLSAgICAgICAgdmFyIGpzb25F
cnJvcnMgPSByZXNwb25zZS5lcnJvcnM7Ci0KLSAgICAgICAgZm9yRWFjaChFbWJlci5rZXlzKGpz
b25FcnJvcnMpLCBmdW5jdGlvbihrZXkpIHsKLSAgICAgICAgICBlcnJvcnNbRW1iZXIuU3RyaW5n
LmNhbWVsaXplKGtleSldID0ganNvbkVycm9yc1trZXldOwotICAgICAgICB9KTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoZXJyb3JzKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5vbkxvYWQo
J0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24oQXBwbGljYXRpb24pIHsKLSAgQXBwbGljYXRp
b24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJhY3RpdmVNb2RlbEFkYXB0ZXIiLAotCi0gICAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgdmFy
IHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7Ci0gICAgICBwcm94eS5y
ZWdpc3RlckRlcHJlY2F0aW9ucyhbCi0gICAgICAgIHtkZXByZWNhdGVkOiAnc2VyaWFsaXplcjpf
YW1zJywgIHZhbGlkOiAnc2VyaWFsaXplcjotYWN0aXZlLW1vZGVsJ30sCi0gICAgICAgIHtkZXBy
ZWNhdGVkOiAnYWRhcHRlcjpfYW1zJywgICAgIHZhbGlkOiAnYWRhcHRlcjotYWN0aXZlLW1vZGVs
J30KLSAgICAgIF0pOwotCi0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjot
YWN0aXZlLW1vZGVsJywgRFMuQWN0aXZlTW9kZWxTZXJpYWxpemVyKTsKLSAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1hY3RpdmUtbW9kZWwnLCBEUy5BY3RpdmVNb2RlbEFkYXB0
ZXIpOwotICAgIH0KLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi19KSgpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9j
b21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVy
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3Rv
cmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCA5YTkxOTI2NGU0ZDcyMDkwOTFiNzU4YTc2NjdiODJiYzFlY2UxODkwLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0
b3JhZ2VfYWRhcHRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKmdsb2Jh
bCBFbWJlciovCi0vKmdsb2JhbCBEUyovCi0ndXNlIHN0cmljdCc7Ci0KLURTLkxTQWRhcHRlciA9
IERTLkFkYXB0ZXIuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLQotICAgIGluaXQ6IGZ1bmN0aW9u
ICgpIHsKLSAgICAgICAgdGhpcy5fbG9hZERhdGEoKTsKLSAgICB9LAotCi0gICAgZ2VuZXJhdGVJ
ZEZvclJlY29yZDogZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50
b1N0cmluZygzMikuc2xpY2UoMikuc3Vic3RyKDAsIDUpOwotICAgIH0sCi0KLSAgICBmaW5kOiBm
dW5jdGlvbiAoc3RvcmUsIHR5cGUsIGlkKSB7Ci0gICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlz
Ll9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNv
bHZlKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7Ci0gICAgfSwKLQotICAgIGZp
bmRNYW55OiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIGlkcykgewotICAgICAgICB2YXIgbmFtZXNw
YWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdmFyIHJlc3VsdHMg
PSBbXTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLSAg
ICAgICAgICAgIHJlc3VsdHMucHVzaChFbWJlci5jb3B5KG5hbWVzcGFjZS5yZWNvcmRzW2lkc1tp
XV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKHJlc3Vs
dHMpOwotICAgIH0sCi0KLSAgLy8gU3VwcG9ydHMgcXVlcmllcyB0aGF0IGxvb2sgbGlrZSB0aGlz
OgotICAvLwotICAvLyAgIHsKLSAgLy8gICAgIDxwcm9wZXJ0eSB0byBxdWVyeT46IDx2YWx1ZSBv
ciByZWdleCAoZm9yIHN0cmluZ3MpIHRvIG1hdGNoPiwKLSAgLy8gICAgIC4uLgotICAvLyAgIH0K
LSAgLy8KLSAgLy8gRXZlcnkgcHJvcGVydHkgYWRkZWQgdG8gdGhlIHF1ZXJ5IGlzIGFuICJBTkQi
IHF1ZXJ5LCBub3QgIk9SIgotICAvLwotICAvLyBFeGFtcGxlOgotICAvLwotICAvLyAgbWF0Y2gg
cmVjb3JkcyB3aXRoICJjb21wbGV0ZTogdHJ1ZSIgYW5kIHRoZSBuYW1lICJmb28iIG9yICJiYXIi
Ci0gIC8vCi0gIC8vICAgIHsgY29tcGxldGU6IHRydWUsIG5hbWU6IC9mb298YmFyLyB9Ci0gICAg
ZmluZFF1ZXJ5OiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHF1ZXJ5LCByZWNvcmRBcnJheSkgewot
ICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAg
ICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnF1ZXJ5KG5hbWVzcGFjZS5yZWNvcmRzLCBxdWVyeSk7
Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUocmVzdWx0cyk7Ci0gICAgfSwKLQot
ICAgIHF1ZXJ5OiBmdW5jdGlvbiAocmVjb3JkcywgcXVlcnkpIHsKLSAgICAgICAgdmFyIHJlc3Vs
dHMgPSBbXTsKLSAgICAgICAgdmFyIGlkLCByZWNvcmQsIHByb3BlcnR5LCB0ZXN0LCBwdXNoOwot
ICAgICAgICBmb3IgKGlkIGluIHJlY29yZHMpIHsKLSAgICAgICAgICAgIHJlY29yZCA9IHJlY29y
ZHNbaWRdOwotICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBxdWVyeSkgewotICAgICAgICAg
ICAgICAgIHRlc3QgPSBxdWVyeVtwcm9wZXJ0eV07Ci0gICAgICAgICAgICAgICAgcHVzaCA9IGZh
bHNlOwotICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
dGVzdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1c2gg
PSB0ZXN0LnRlc3QocmVjb3JkW3Byb3BlcnR5XSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAgICAgcHVzaCA9IHJlY29yZFtwcm9wZXJ0eV0gPT09IHRlc3Q7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHB1c2gpIHsK
LSAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9LAotCi0gICAgZmluZEFsbDog
ZnVuY3Rpb24gKHN0b3JlLCB0eXBlKSB7Ci0gICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9u
YW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgICAg
ICBmb3IgKHZhciBpZCBpbiBuYW1lc3BhY2UucmVjb3JkcykgewotICAgICAgICAgICAgcmVzdWx0
cy5wdXNoKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVzb2x2ZShyZXN1bHRzKTsKLSAgICB9LAotCi0gICAg
Y3JlYXRlUmVjb3JkOiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2
YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdGhp
cy5fYWRkUmVjb3JkVG9OYW1lc3BhY2UobmFtZXNwYWNlLCByZWNvcmQpOwotICAgICAgICB0aGlz
Ll9zYXZlRGF0YSgpOwotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKCk7Ci0gICAg
fSwKLQotICAgIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24gKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsK
LSAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7Ci0g
ICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNv
cmRzW2lkXSA9IHJlY29yZC50b0pTT04oeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHRo
aXMuX3NhdmVEYXRhKCk7Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUoKTsKLSAg
ICB9LAotCi0gICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkg
ewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsK
LSAgICAgICAgdmFyIGlkID0gcmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgZGVsZXRlIG5hbWVz
cGFjZS5yZWNvcmRzW2lkXTsKLSAgICAgICAgdGhpcy5fc2F2ZURhdGEoKTsKLSAgICAgICAgcmV0
dXJuIEVtYmVyLlJTVlAucmVzb2x2ZSgpOwotICAgIH0sCi0KLSAgLy8gcHJpdmF0ZQotCi0gICAg
X2dldE5hbWVzcGFjZTogZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3Bh
Y2UgfHwgJ0RTLkxTQWRhcHRlcic7Ci0gICAgfSwKLQotICAgIF9sb2FkRGF0YTogZnVuY3Rpb24g
KCkgewotICAgICAgICB0aGlzLl9kYXRhID0ge307Ci0gICAgfSwKLQotICAgIF9zYXZlRGF0YTog
ZnVuY3Rpb24gKCkgewotICAgIH0sCi0KLSAgICBfbmFtZXNwYWNlRm9yVHlwZTogZnVuY3Rpb24g
KHR5cGUpIHsKLSAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHR5cGUudXJsIHx8IHR5cGUudG9TdHJp
bmcoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZXNwYWNlXSB8fCAoCi0gICAgICAg
ICAgICB0aGlzLl9kYXRhW25hbWVzcGFjZV0gPSB7cmVjb3Jkczoge319Ci0gICAgICAgICk7Ci0g
ICAgfSwKLQotICAgIF9hZGRSZWNvcmRUb05hbWVzcGFjZTogZnVuY3Rpb24gKG5hbWVzcGFjZSwg
cmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0gcmVjb3JkLnNlcmlhbGl6ZSh7aW5jbHVkZUlk
OiB0cnVlfSk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNvcmRzW2RhdGEuaWRdID0gZGF0YTsKLSAg
ICB9Ci19KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50
cy9lbWJlci9lbWJlci5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9l
bWJlci9lbWJlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1NjcxMWE4Yzg2
NjFkNmU4NDRiZDYwZDFlYTJjYmYyNzI3ODVjNy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMv
ZW1iZXIvZW1iZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDU4MyArMCwwIEBACi0vKiEKLSAq
IEBvdmVydmlldyAgRW1iZXIgLSBKYXZhU2NyaXB0IEFwcGxpY2F0aW9uIEZyYW1ld29yawotICog
QGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMS0yMDE0IFRpbGRlIEluYy4gYW5kIGNvbnRyaWJ1dG9y
cwotICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNi0yMDExIFN0cm9iZSBJbmMu
Ci0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA4LTIwMTEgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGlj
ZW5zZQotICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9lbWJlcmpzL2Vt
YmVyLmpzL21hc3Rlci9MSUNFTlNFCi0gKiBAdmVyc2lvbiAgIDEuMy4xCi0gKi8KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0vKmdsb2JhbCBfX2ZhaWxfXyovCi0KLS8qKgotRW1iZXIgRGVidWcKLQotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1kZWJ1ZwotKi8KLQotLyoqCi1AY2xhc3MgRW1i
ZXIKLSovCi0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyKSB7Ci0gIEVtYmVyID0g
e307Ci0KLSAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93KSB7Ci0gICAgd2luZG93
LkVtID0gd2luZG93LkVtYmVyID0gRW0gPSBFbWJlcjsKLSAgfQotfQotCi0vLyBUaGlzIG5lZWRz
IHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2dpYyBpbgotLy8gYHBhY2thZ2VzL2VtYmVy
LW1ldGFsL2xpYi9jb3JlLmpzYC4KLS8vCi0vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgaGVyZSB0byBl
bnN1cmUgdGhhdCBgRW1iZXIuRU5WYAotLy8gaXMgc2V0dXAgZXZlbiBpZiBgRW1iZXJgIGlzIG5v
dCBsb2FkZWQgeWV0LgotaWYgKEVtYmVyLkVOVikgewotICAvLyBkbyBub3RoaW5nIGlmIEVtYmVy
LkVOViBpcyBhbHJlYWR5IHNldHVwCi19IGVsc2UgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Yg
RW1iZXJFTlYpIHsKLSAgRW1iZXIuRU5WID0gRW1iZXJFTlY7Ci19IGVsc2UgaWYoJ3VuZGVmaW5l
ZCcgIT09IHR5cGVvZiBFTlYpIHsKLSAgRW1iZXIuRU5WID0gRU5WOwotfSBlbHNlIHsKLSAgRW1i
ZXIuRU5WID0ge307Ci19Ci0KLWlmICghKCdNQU5EQVRPUllfU0VUVEVSJyBpbiBFbWJlci5FTlYp
KSB7Ci0gIEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSID0gdHJ1ZTsgLy8gZGVmYXVsdCB0byB0
cnVlIGZvciBkZWJ1ZyBkaXN0Ci19Ci0KLS8qKgotICBEZWZpbmUgYW4gYXNzZXJ0aW9uIHRoYXQg
d2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QKLSAgbWV0LiBF
bWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8gYEVtYmVyLmFzc2VydCgp
YCB3aGVuCi0gIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4gRXhhbXBsZToKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIC8vIFRlc3QgZm9yIHRydXRoaW5lc3MKLSAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBh
c3MgYSB2YWxpZCBvYmplY3QnLCBvYmopOwotICAvLyBGYWlsIHVuY29uZGl0aW9uYWxseQotICBF
bWJlci5hc3NlcnQoJ1RoaXMgY29kZSBwYXRoIHNob3VsZCBuZXZlciBiZSBydW4nKQotICBgYGAK
LQotICBAbWV0aG9kIGFzc2VydAotICBAcGFyYW0ge1N0cmluZ30gZGVzYyBBIGRlc2NyaXB0aW9u
IG9mIHRoZSBhc3NlcnRpb24uIFRoaXMgd2lsbCBiZWNvbWUKLSAgICB0aGUgdGV4dCBvZiB0aGUg
RXJyb3IgdGhyb3duIGlmIHRoZSBhc3NlcnRpb24gZmFpbHMuCi0gIEBwYXJhbSB7Qm9vbGVhbn0g
dGVzdCBNdXN0IGJlIHRydXRoeSBmb3IgdGhlIGFzc2VydGlvbiB0byBwYXNzLiBJZgotICAgIGZh
bHN5LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0qLwotRW1iZXIuYXNzZXJ0ID0gZnVu
Y3Rpb24oZGVzYywgdGVzdCkgewotICBpZiAoIXRlc3QpIHsKLSAgICBFbWJlci5Mb2dnZXIuYXNz
ZXJ0KHRlc3QsIGRlc2MpOwotICB9Ci0KLSAgaWYgKEVtYmVyLnRlc3RpbmcgJiYgIXRlc3QpIHsK
LSAgICAvLyB3aGVuIHRlc3RpbmcsIGVuc3VyZSB0ZXN0IGZhaWx1cmVzIHdoZW4gYXNzZXJ0aW9u
cyBmYWlsCi0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJBc3NlcnRpb24gRmFpbGVkOiAiICsg
ZGVzYyk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gIERpc3BsYXkgYSB3YXJuaW5nIHdpdGggdGhlIHBy
b3ZpZGVkIG1lc3NhZ2UuIEVtYmVyIGJ1aWxkIHRvb2xzIHdpbGwKLSAgcmVtb3ZlIGFueSBjYWxs
cyB0byBgRW1iZXIud2FybigpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBA
bWV0aG9kIHdhcm4KLSAgQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSB3YXJuaW5nIHRvIGRpc3Bs
YXkuCi0gIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdCBBbiBvcHRpb25hbCBib29sZWFuLiBJZiBmYWxz
eSwgdGhlIHdhcm5pbmcKLSAgICB3aWxsIGJlIGRpc3BsYXllZC4KLSovCi1FbWJlci53YXJuID0g
ZnVuY3Rpb24obWVzc2FnZSwgdGVzdCkgewotICBpZiAoIXRlc3QpIHsKLSAgICBFbWJlci5Mb2dn
ZXIud2FybigiV0FSTklORzogIittZXNzYWdlKTsKLSAgICBpZiAoJ3RyYWNlJyBpbiBFbWJlci5M
b2dnZXIpIEVtYmVyLkxvZ2dlci50cmFjZSgpOwotICB9Ci19OwotCi0vKioKLSAgRGlzcGxheSBh
IGRlYnVnIG5vdGljZS4gRW1iZXIgYnVpbGQgdG9vbHMgd2lsbCByZW1vdmUgYW55IGNhbGxzIHRv
Ci0gIGBFbWJlci5kZWJ1ZygpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBg
YGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmRlYnVnKCJJJ20gYSBkZWJ1ZyBub3RpY2UhIik7Ci0gIGBg
YAotCi0gIEBtZXRob2QgZGVidWcKLSAgQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSBkZWJ1ZyBt
ZXNzYWdlIHRvIGRpc3BsYXkuCi0qLwotRW1iZXIuZGVidWcgPSBmdW5jdGlvbihtZXNzYWdlKSB7
Ci0gIEVtYmVyLkxvZ2dlci5kZWJ1ZygiREVCVUc6ICIrbWVzc2FnZSk7Ci19OwotCi0vKioKLSAg
RGlzcGxheSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBh
bmQgYSBzdGFjayB0cmFjZQotICAoQ2hyb21lIGFuZCBGaXJlZm94IG9ubHkpLiBFbWJlciBidWls
ZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8KLSAgYEVtYmVyLmRlcHJlY2F0ZSgpYCB3
aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBAbWV0aG9kIGRlcHJlY2F0ZQotICBA
cGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4K
LSAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IEFuIG9wdGlvbmFsIGJvb2xlYW4uIElmIGZhbHN5LCB0
aGUgZGVwcmVjYXRpb24KLSAgICB3aWxsIGJlIGRpc3BsYXllZC4KLSovCi1FbWJlci5kZXByZWNh
dGUgPSBmdW5jdGlvbihtZXNzYWdlLCB0ZXN0KSB7Ci0gIGlmIChFbWJlci5URVNUSU5HX0RFUFJF
Q0FUSU9OKSB7IHJldHVybjsgfQotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7IHRl
c3QgPSBmYWxzZTsgfQotICBpZiAodGVzdCkgeyByZXR1cm47IH0KLQotICBpZiAoRW1iZXIuRU5W
LlJBSVNFX09OX0RFUFJFQ0FUSU9OKSB7IHRocm93IG5ldyBFbWJlci5FcnJvcihtZXNzYWdlKTsg
fQotCi0gIHZhciBlcnJvcjsKLQotICAvLyBXaGVuIHVzaW5nIG5ldyBFcnJvciwgd2UgY2FuJ3Qg
ZG8gdGhlIGFyZ3VtZW50cyBjaGVjayBmb3IgQ2hyb21lLiBBbHRlcm5hdGl2ZXMgYXJlIHdlbGNv
bWUKLSAgdHJ5IHsgX19mYWlsX18uZmFpbCgpOyB9IGNhdGNoIChlKSB7IGVycm9yID0gZTsgfQot
Ci0gIGlmIChFbWJlci5MT0dfU1RBQ0tUUkFDRV9PTl9ERVBSRUNBVElPTiAmJiBlcnJvci5zdGFj
aykgewotICAgIHZhciBzdGFjaywgc3RhY2tTdHIgPSAnJzsKLSAgICBpZiAoZXJyb3JbJ2FyZ3Vt
ZW50cyddKSB7Ci0gICAgICAvLyBDaHJvbWUKLSAgICAgIHN0YWNrID0gZXJyb3Iuc3RhY2sucmVw
bGFjZSgvXlxzK2F0XHMrL2dtLCAnJykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxh
Y2UoL14oW15cKF0rPykoW1xuJF0pL2dtLCAne2Fub255bW91c30oJDEpJDInKS4KLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxzKlwoKFteXCld
KylcKS9nbSwgJ3thbm9ueW1vdXN9KCQxKScpLnNwbGl0KCdcbicpOwotICAgICAgc3RhY2suc2hp
ZnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRmlyZWZveAotICAgICAgc3RhY2sgPSBlcnJv
ci5zdGFjay5yZXBsYWNlKC8oPzpcbkA6MCk/XHMrJC9tLCAnJykuCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlcGxhY2UoL15cKC9nbSwgJ3thbm9ueW1vdXN9KCcpLnNwbGl0KCdcbicpOwot
ICAgIH0KLQotICAgIHN0YWNrU3RyID0gIlxuICAgICIgKyBzdGFjay5zbGljZSgyKS5qb2luKCJc
biAgICAiKTsKLSAgICBtZXNzYWdlID0gbWVzc2FnZSArIHN0YWNrU3RyOwotICB9Ci0KLSAgRW1i
ZXIuTG9nZ2VyLndhcm4oIkRFUFJFQ0FUSU9OOiAiK21lc3NhZ2UpOwotfTsKLQotCi0KLS8qKgot
ICBBbGlhcyBhbiBvbGQsIGRlcHJlY2F0ZWQgbWV0aG9kIHdpdGggaXRzIG5ldyBjb3VudGVycGFy
dC4KLQotICBEaXNwbGF5IGEgZGVwcmVjYXRpb24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBt
ZXNzYWdlIGFuZCBhIHN0YWNrIHRyYWNlCi0gIChDaHJvbWUgYW5kIEZpcmVmb3ggb25seSkgd2hl
biB0aGUgYXNzaWduZWQgbWV0aG9kIGlzIGNhbGxlZC4KLQotICBFbWJlciBidWlsZCB0b29scyB3
aWxsIG5vdCByZW1vdmUgY2FsbHMgdG8gYEVtYmVyLmRlcHJlY2F0ZUZ1bmMoKWAsIHRob3VnaAot
ICBubyB3YXJuaW5ncyB3aWxsIGJlIHNob3duIGluIHByb2R1Y3Rpb24uCi0KLSAgYGBgamF2YXNj
cmlwdAotICBFbWJlci5vbGRNZXRob2QgPSBFbWJlci5kZXByZWNhdGVGdW5jKCJQbGVhc2UgdXNl
IHRoZSBuZXcsIHVwZGF0ZWQgbWV0aG9kIiwgRW1iZXIubmV3TWV0aG9kKTsKLSAgYGBgCi0KLSAg
QG1ldGhvZCBkZXByZWNhdGVGdW5jCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIEEgZGVzY3Jp
cHRpb24gb2YgdGhlIGRlcHJlY2F0aW9uLgotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBu
ZXcgZnVuY3Rpb24gY2FsbGVkIHRvIHJlcGxhY2UgaXRzIGRlcHJlY2F0ZWQgY291bnRlcnBhcnQu
Ci0gIEByZXR1cm4ge0Z1bmN0aW9ufSBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBwZWQgdGhlIG9y
aWdpbmFsIGZ1bmN0aW9uIHdpdGggYSBkZXByZWNhdGlvbiB3YXJuaW5nCi0qLwotRW1iZXIuZGVw
cmVjYXRlRnVuYyA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZ1bmMpIHsKLSAgcmV0dXJuIGZ1bmN0aW9u
KCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZShtZXNzYWdlKTsKLSAgICByZXR1cm4gZnVuYy5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOwotICB9OwotfTsKLQotCi0vLyBJbmZvcm0gdGhlIGRldmVsb3Bl
ciBhYm91dCB0aGUgRW1iZXIgSW5zcGVjdG9yIGlmIG5vdCBpbnN0YWxsZWQuCi1pZiAoIUVtYmVy
LnRlc3RpbmcpIHsKLSAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRv
dy5jaHJvbWUgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKLSAgICB3aW5kb3cuYWRkRXZl
bnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCkgewotICAgICAgaWYgKGRvY3VtZW50LmJvZHkg
JiYgZG9jdW1lbnQuYm9keS5kYXRhc2V0ICYmICFkb2N1bWVudC5ib2R5LmRhdGFzZXQuZW1iZXJF
eHRlbnNpb24pIHsKLSAgICAgICAgRW1iZXIuZGVidWcoJ0ZvciBtb3JlIGFkdmFuY2VkIGRlYnVn
Z2luZywgaW5zdGFsbCB0aGUgRW1iZXIgSW5zcGVjdG9yIGZyb20gaHR0cHM6Ly9jaHJvbWUuZ29v
Z2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvZW1iZXItaW5zcGVjdG9yL2JtZGJsbmNlZ2tlbmthY2ll
aWhmaHBqZnBwb2NvbmhpJyk7Ci0gICAgICB9Ci0gICAgfSwgZmFsc2UpOwotICB9Ci19Ci0KLX0p
KCk7Ci0KLS8qIQotICogQG92ZXJ2aWV3ICBFbWJlciAtIEphdmFTY3JpcHQgQXBwbGljYXRpb24g
RnJhbWV3b3JrCi0gKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDExLTIwMTQgVGlsZGUgSW5jLiBh
bmQgY29udHJpYnV0b3JzCi0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA2LTIw
MTEgU3Ryb2JlIEluYy4KLSAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDgtMjAx
MSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2Vk
IHVuZGVyIE1JVCBsaWNlbnNlCi0gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWIu
Y29tL2VtYmVyanMvZW1iZXIuanMvbWFzdGVyL0xJQ0VOU0UKLSAqIEB2ZXJzaW9uICAgMS4zLjEK
LSAqLwotCi0KLShmdW5jdGlvbigpIHsKLXZhciBkZWZpbmUsIHJlcXVpcmVNb2R1bGUsIHJlcXVp
cmUsIHJlcXVpcmVqczsKLQotKGZ1bmN0aW9uKCkgewotICB2YXIgcmVnaXN0cnkgPSB7fSwgc2Vl
biA9IHt9OwotCi0gIGRlZmluZSA9IGZ1bmN0aW9uKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7Ci0g
ICAgcmVnaXN0cnlbbmFtZV0gPSB7IGRlcHM6IGRlcHMsIGNhbGxiYWNrOiBjYWxsYmFjayB9Owot
ICB9OwotCi0gIHJlcXVpcmVqcyA9IHJlcXVpcmUgPSByZXF1aXJlTW9kdWxlID0gZnVuY3Rpb24o
bmFtZSkgewotICByZXF1aXJlanMuX2Vha19zZWVuID0gcmVnaXN0cnk7Ci0KLSAgICBpZiAoc2Vl
bltuYW1lXSkgeyByZXR1cm4gc2VlbltuYW1lXTsgfQotICAgIHNlZW5bbmFtZV0gPSB7fTsKLQot
ICAgIGlmICghcmVnaXN0cnlbbmFtZV0pIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQg
bm90IGZpbmQgbW9kdWxlICIgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICB2YXIgbW9kID0gcmVnaXN0
cnlbbmFtZV0sCi0gICAgICAgIGRlcHMgPSBtb2QuZGVwcywKLSAgICAgICAgY2FsbGJhY2sgPSBt
b2QuY2FsbGJhY2ssCi0gICAgICAgIHJlaWZpZWQgPSBbXSwKLSAgICAgICAgZXhwb3J0czsKLQot
ICAgIGZvciAodmFyIGk9MCwgbD1kZXBzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGlmIChk
ZXBzW2ldID09PSAnZXhwb3J0cycpIHsKLSAgICAgICAgcmVpZmllZC5wdXNoKGV4cG9ydHMgPSB7
fSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShy
ZXNvbHZlKGRlcHNbaV0pKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdmFyIHZhbHVlID0gY2Fs
bGJhY2suYXBwbHkodGhpcywgcmVpZmllZCk7Ci0gICAgcmV0dXJuIHNlZW5bbmFtZV0gPSBleHBv
cnRzIHx8IHZhbHVlOwotCi0gICAgZnVuY3Rpb24gcmVzb2x2ZShjaGlsZCkgewotICAgICAgaWYg
KGNoaWxkLmNoYXJBdCgwKSAhPT0gJy4nKSB7IHJldHVybiBjaGlsZDsgfQotICAgICAgdmFyIHBh
cnRzID0gY2hpbGQuc3BsaXQoIi8iKTsKLSAgICAgIHZhciBwYXJlbnRCYXNlID0gbmFtZS5zcGxp
dCgiLyIpLnNsaWNlKDAsIC0xKTsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKLQotICAgICAgICBp
ZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNlLnBvcCgpOyB9Ci0gICAgICAgIGVsc2UgaWYg
KHBhcnQgPT09ICcuJykgeyBjb250aW51ZTsgfQotICAgICAgICBlbHNlIHsgcGFyZW50QmFzZS5w
dXNoKHBhcnQpOyB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwYXJlbnRCYXNlLmpvaW4oIi8i
KTsKLSAgICB9Ci0gIH07Ci19KSgpOwotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEVtOnRydWUg
RU5WIEVtYmVyRU5WIE1ldGFtb3JwaEVOVjp0cnVlICovCi0KLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotLyoqCi0gIEFsbCBFbWJlciBtZXRob2RzIGFu
ZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW5zaWRlIG9mIHRoaXMgbmFtZXNwYWNlLiBZb3UKLSAg
Z2VuZXJhbGx5IHNob3VsZCBub3QgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXMgbmFtZXNwYWNl
IGFzIGl0IG1heSBiZQotICBvdmVyd3JpdHRlbiBieSBmdXR1cmUgdmVyc2lvbnMgb2YgRW1iZXIu
Ci0KLSAgWW91IGNhbiBhbHNvIHVzZSB0aGUgc2hvcnRoYW5kIGBFbWAgaW5zdGVhZCBvZiBgRW1i
ZXJgLgotCi0gIEVtYmVyLVJ1bnRpbWUgaXMgYSBmcmFtZXdvcmsgdGhhdCBwcm92aWRlcyBjb3Jl
IGZ1bmN0aW9ucyBmb3IgRW1iZXIgaW5jbHVkaW5nCi0gIGNyb3NzLXBsYXRmb3JtIGZ1bmN0aW9u
cywgc3VwcG9ydCBmb3IgcHJvcGVydHkgb2JzZXJ2aW5nIGFuZCBvYmplY3RzLiBJdHMKLSAgZm9j
dXMgaXMgb24gc21hbGwgc2l6ZSBhbmQgcGVyZm9ybWFuY2UuIFlvdSBjYW4gdXNlIHRoaXMgaW4g
cGxhY2Ugb2Ygb3IKLSAgYWxvbmctc2lkZSBvdGhlciBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJpZXMg
c3VjaCBhcyBqUXVlcnkuCi0KLSAgVGhlIGNvcmUgUnVudGltZSBmcmFtZXdvcmsgaXMgYmFzZWQg
b24gdGhlIGpRdWVyeSBBUEkgd2l0aCBhIG51bWJlciBvZgotICBwZXJmb3JtYW5jZSBvcHRpbWl6
YXRpb25zLgotCi0gIEBjbGFzcyBFbWJlcgotICBAc3RhdGljCi0gIEB2ZXJzaW9uIDEuMy4xCi0q
LwotCi1pZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlcikgewotICAvLyBDcmVhdGUgY29y
ZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2UgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNwYWNl
IHNvIHRoYXQKLSAgLy8gb2JqZWN0cyBhc3NpZ25lZCB0byBpdCBhcmUgZ2l2ZW4gYSBzYW5lIHN0
cmluZyByZXByZXNlbnRhdGlvbi4KLSAgRW1iZXIgPSB7fTsKLX0KLQotLy8gRGVmYXVsdCBpbXBv
cnRzLCBleHBvcnRzIGFuZCBsb29rdXAgdG8gdGhlIGdsb2JhbCBvYmplY3Q7Ci12YXIgaW1wb3J0
cyA9IEVtYmVyLmltcG9ydHMgPSBFbWJlci5pbXBvcnRzIHx8IHRoaXM7Ci12YXIgZXhwb3J0cyA9
IEVtYmVyLmV4cG9ydHMgPSBFbWJlci5leHBvcnRzIHx8IHRoaXM7Ci12YXIgbG9va3VwICA9IEVt
YmVyLmxvb2t1cCAgPSBFbWJlci5sb29rdXAgIHx8IHRoaXM7Ci0KLS8vIGFsaWFzZXMgbmVlZGVk
IHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3ZpbmcgdGhlIGdsb2JhbCBjb250ZXh0Ci1leHBv
cnRzLkVtID0gZXhwb3J0cy5FbWJlciA9IEVtID0gRW1iZXI7Ci0KLS8vIE1ha2Ugc3VyZSB0aGVz
ZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFscmVhZHkgZGVmaW5lZCBvciBub3QKLQotRW1i
ZXIuaXNOYW1lc3BhY2UgPSB0cnVlOwotCi1FbWJlci50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyBy
ZXR1cm4gIkVtYmVyIjsgfTsKLQotCi0vKioKLSAgQHByb3BlcnR5IFZFUlNJT04KLSAgQHR5cGUg
U3RyaW5nCi0gIEBkZWZhdWx0ICcxLjMuMScKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlZFUlNJT04g
PSAnMS4zLjEnOwotCi0vKioKLSAgU3RhbmRhcmQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMuIFlv
dSBjYW4gZGVmaW5lIHRoZXNlIGluIGEgZ2xvYmFsIGBFbWJlckVOVmAKLSAgdmFyaWFibGUgYmVm
b3JlIGxvYWRpbmcgRW1iZXIgdG8gY29udHJvbCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGlu
Z3MuCi0KLSAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9u
cyBvZiBFbWJlciB0aGUgZ2xvYmFsIGBFTlZgCi0gIHZhcmlhYmxlIHdpbGwgYmUgdXNlZCBpZiBg
RW1iZXJFTlZgIGlzIG5vdCBkZWZpbmVkLgotCi0gIEBwcm9wZXJ0eSBFTlYKLSAgQHR5cGUgSGFz
aAotKi8KLQotLy8gVGhpcyBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbG9naWMg
aW4KLS8vIGBwYWNrYWdlcy9lbWJlci1kZWJ1Zy9saWIvbWFpbi5qc2AuCi1pZiAoRW1iZXIuRU5W
KSB7Ci0gIC8vIGRvIG5vdGhpbmcgaWYgRW1iZXIuRU5WIGlzIGFscmVhZHkgc2V0dXAKLX0gZWxz
ZSBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFbWJlckVOVikgewotICBFbWJlci5FTlYgPSBF
bWJlckVOVjsKLX0gZWxzZSBpZigndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEVOVikgewotICBFbWJl
ci5FTlYgPSBFTlY7Ci19IGVsc2UgewotICBFbWJlci5FTlYgPSB7fTsKLX0KLQotRW1iZXIuY29u
ZmlnID0gRW1iZXIuY29uZmlnIHx8IHt9OwotCi0vLyBXZSBkaXNhYmxlIHRoZSBSQU5HRSBBUEkg
YnkgZGVmYXVsdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwotaWYgKCd1bmRlZmluZWQnID09PSB0
eXBlb2YgRW1iZXIuRU5WLkRJU0FCTEVfUkFOR0VfQVBJKSB7Ci0gIEVtYmVyLkVOVi5ESVNBQkxF
X1JBTkdFX0FQSSA9IHRydWU7Ci19Ci0KLWlmICgidW5kZWZpbmVkIiA9PT0gdHlwZW9mIE1ldGFt
b3JwaEVOVikgewotICBleHBvcnRzLk1ldGFtb3JwaEVOViA9IHt9OwotfQotCi1NZXRhbW9ycGhF
TlYuRElTQUJMRV9SQU5HRV9BUEkgPSBFbWJlci5FTlYuRElTQUJMRV9SQU5HRV9BUEk7Ci0KLS8q
KgotICBIYXNoIG9mIGVuYWJsZWQgQ2FuYXJ5IGZlYXR1cmVzLiBBZGQgdG8gYmVmb3JlIGNyZWF0
aW5nIHlvdXIgYXBwbGljYXRpb24uCi0KLSAgWW91IGNhbiBhbHNvIGRlZmluZSBgRU5WLkZFQVRV
UkVTYCBpZiB5b3UgbmVlZCB0byBlbmFibGUgZmVhdHVyZXMgZmxhZ2dlZCBhdCBydW50aW1lLgot
Ci0gIEBwcm9wZXJ0eSBGRUFUVVJFUwotICBAdHlwZSBIYXNoCi0qLwotCi1FbWJlci5GRUFUVVJF
UyA9IEVtYmVyLkVOVi5GRUFUVVJFUyB8fCB7fTsKLQotLyoqCi0gIFRlc3QgdGhhdCBhIGZlYXR1
cmUgaXMgZW5hYmxlZC4gUGFyc2VkIGJ5IEVtYmVyJ3MgYnVpbGQgdG9vbHMgdG8gbGVhdmUKLSAg
ZXhwZXJpbWVudGFsIGZlYXR1cmVzIG91dCBvZiBiZXRhL3N0YWJsZSBidWlsZHMuCi0KLSAgWW91
IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6Ci0KLSAgKiBg
RU5WLkVOQUJMRV9BTExfRkVBVFVSRVNgIC0gZm9yY2UgYWxsIGZlYXR1cmVzIHRvIGJlIGVuYWJs
ZWQuCi0gICogYEVOVi5FTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVNgIC0gZW5hYmxlIGFueSBmZWF0
dXJlcyB0aGF0IGhhdmUgbm90IGJlZW4gZXhwbGljaXRseQotICAgIGVuYWJsZWQvZGlzYWJsZWQu
Ci0KLSAgQG1ldGhvZCBpc0VuYWJsZWQKLSAgQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUKLSovCi0K
LUVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKGZlYXR1cmUpIHsKLSAgdmFyIGZl
YXR1cmVWYWx1ZSA9IEVtYmVyLkZFQVRVUkVTW2ZlYXR1cmVdOwotCi0gIGlmIChFbWJlci5FTlYu
RU5BQkxFX0FMTF9GRUFUVVJFUykgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKGZl
YXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFsdWUgPT09IGZhbHNlIHx8IGZlYXR1cmVW
YWx1ZSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTsKLSAgfSBlbHNl
IGlmIChFbWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZFQVRVUkVTKSB7Ci0gICAgcmV0dXJuIHRy
dWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi0vLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBC
T09UU1RSQVAKLS8vCi0KLS8qKgotICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGVu
aGFuY2VzIHNvbWUgYnVpbHQtaW4gb2JqZWN0IHByb3RvdHlwZXMgdG8KLSAgcHJvdmlkZSBhIG1v
cmUgZnJpZW5kbHkgQVBJLiBJZiBlbmFibGVkLCBhIGZldyBtZXRob2RzIHdpbGwgYmUgYWRkZWQg
dG8KLSAgYEZ1bmN0aW9uYCwgYFN0cmluZ2AsIGFuZCBgQXJyYXlgLiBgT2JqZWN0LnByb3RvdHlw
ZWAgd2lsbCBub3QgYmUgZW5oYW5jZWQsCi0gIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBjYXVzZXMg
bW9zdCB0cm91YmxlIGZvciBwZW9wbGUuCi0KLSAgSW4gZ2VuZXJhbCB3ZSByZWNvbW1lbmQgbGVh
dmluZyB0aGlzIG9wdGlvbiBzZXQgdG8gdHJ1ZSBzaW5jZSBpdCByYXJlbHkKLSAgY29uZmxpY3Rz
IHdpdGggb3RoZXIgY29kZS4gSWYgeW91IG5lZWQgdG8gdHVybiBpdCBvZmYgaG93ZXZlciwgeW91
IGNhbgotICBkZWZpbmUgYW4gYEVOVi5FWFRFTkRfUFJPVE9UWVBFU2AgY29uZmlnIHRvIGRpc2Fi
bGUgaXQuCi0KLSAgQHByb3BlcnR5IEVYVEVORF9QUk9UT1RZUEVTCi0gIEB0eXBlIEJvb2xlYW4K
LSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID0gRW1iZXIuRU5W
LkVYVEVORF9QUk9UT1RZUEVTOwotCi1pZiAodHlwZW9mIEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT
ID09PSAndW5kZWZpbmVkJykgewotICBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9IHRydWU7Ci19
Ci0KLS8qKgotICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgbG9ncyBhIGZ1bGwgc3RhY2sgdHJh
Y2UgZHVyaW5nIGRlcHJlY2F0aW9uIHdhcm5pbmdzCi0KLSAgQHByb3BlcnR5IExPR19TVEFDS1RS
QUNFX09OX0RFUFJFQ0FUSU9OCi0gIEB0eXBlIEJvb2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8K
LUVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OID0gKEVtYmVyLkVOVi5MT0dfU1RB
Q0tUUkFDRV9PTl9ERVBSRUNBVElPTiAhPT0gZmFsc2UpOwotCi0vKioKLSAgRGV0ZXJtaW5lcyB3
aGV0aGVyIEVtYmVyIHNob3VsZCBhZGQgRUNNQVNjcmlwdCA1IHNoaW1zIHRvIG9sZGVyIGJyb3dz
ZXJzLgotCi0gIEBwcm9wZXJ0eSBTSElNX0VTNQotICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0
IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTCi0qLwotRW1iZXIuU0hJTV9FUzUgPSAoRW1iZXIuRU5W
LlNISU1fRVM1ID09PSBmYWxzZSkgPyBmYWxzZSA6IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTOwot
Ci0vKioKLSAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVtYmVyIGxvZ3MgaW5mbyBhYm91dCB2ZXJzaW9u
IG9mIHVzZWQgbGlicmFyaWVzCi0KLSAgQHByb3BlcnR5IExPR19WRVJTSU9OCi0gIEB0eXBlIEJv
b2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkxPR19WRVJTSU9OID0gKEVtYmVyLkVO
Vi5MT0dfVkVSU0lPTiA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOwotCi0vKioKLSAgRW1wdHkg
ZnVuY3Rpb24uIFVzZWZ1bCBmb3Igc29tZSBvcGVyYXRpb25zLiBBbHdheXMgcmV0dXJucyBgdGhp
c2AuCi0KLSAgQG1ldGhvZCBLCi0gIEBwcml2YXRlCi0gIEByZXR1cm4ge09iamVjdH0KLSovCi1F
bWJlci5LID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9OwotCi0KLS8vIFN0dWIgb3V0IHRo
ZSBtZXRob2RzIGRlZmluZWQgYnkgdGhlIGVtYmVyLWRlYnVnIHBhY2thZ2UgaW4gY2FzZSBpdCdz
IG5vdCBsb2FkZWQKLQotaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuYXNzZXJ0KSB7
IEVtYmVyLmFzc2VydCA9IEVtYmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVt
YmVyLndhcm4pIHsgRW1iZXIud2FybiA9IEVtYmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0g
dHlwZW9mIEVtYmVyLmRlYnVnKSB7IEVtYmVyLmRlYnVnID0gRW1iZXIuSzsgfQotaWYgKCd1bmRl
ZmluZWQnID09PSB0eXBlb2YgRW1iZXIuZGVwcmVjYXRlKSB7IEVtYmVyLmRlcHJlY2F0ZSA9IEVt
YmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyLmRlcHJlY2F0ZUZ1bmMp
IHsKLSAgRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGZ1bmN0aW9uKF8sIGZ1bmMpIHsgcmV0dXJuIGZ1
bmM7IH07Ci19Ci0KLS8qKgotICBQcmV2aW91c2x5IHdlIHVzZWQgYEVtYmVyLiQudXVpZGAsIGhv
d2V2ZXIgYCQudXVpZGAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCi0gIGpRdWVyeSBtYXN0ZXIuIFdl
J2xsIGp1c3QgYm9vdHN0cmFwIG91ciBvd24gdXVpZCBub3cuCi0KLSAgQHByb3BlcnR5IHV1aWQK
LSAgQHR5cGUgTnVtYmVyCi0gIEBwcml2YXRlCi0qLwotRW1iZXIudXVpZCA9IDA7Ci0KLS8qKgot
ICBNZXJnZSB0aGUgY29udGVudHMgb2YgdHdvIG9iamVjdHMgdG9nZXRoZXIgaW50byB0aGUgZmly
c3Qgb2JqZWN0LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIubWVyZ2Uoe2ZpcnN0OiAnVG9t
J30sIHtsYXN0OiAnRGFsZSd9KTsgLy8ge2ZpcnN0OiAnVG9tJywgbGFzdDogJ0RhbGUnfQotICB2
YXIgYSA9IHtmaXJzdDogJ1llaHVkYSd9LCBiID0ge2xhc3Q6ICdLYXR6J307Ci0gIEVtYmVyLm1l
cmdlKGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1llaHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0g
e2xhc3Q6ICdLYXR6J30KLSAgYGBgCi0KLSAgQG1ldGhvZCBtZXJnZQotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5hbCBUaGUgb2JqZWN0IHRvIG1lcmdlIGludG8KLSAgQHBh
cmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbQot
ICBAcmV0dXJuIHtPYmplY3R9Ci0qLwotRW1iZXIubWVyZ2UgPSBmdW5jdGlvbihvcmlnaW5hbCwg
dXBkYXRlcykgewotICBmb3IgKHZhciBwcm9wIGluIHVwZGF0ZXMpIHsKLSAgICBpZiAoIXVwZGF0
ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAgICBvcmlnaW5hbFtwcm9w
XSA9IHVwZGF0ZXNbcHJvcF07Ci0gIH0KLSAgcmV0dXJuIG9yaWdpbmFsOwotfTsKLQotLyoqCi0g
IFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMKLSAgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcgYWJvdXQgdXNlIG9m
ID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkKLSAgY29uZnVzaW5nLgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgRW1iZXIuaXNOb25lKCk7ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlz
Tm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQotICBFbWJlci5pc05vbmUodW5kZWZpbmVkKTsg
ICAgIC8vIHRydWUKLSAgRW1iZXIuaXNOb25lKCcnKTsgICAgICAgICAgICAvLyBmYWxzZQotICBF
bWJlci5pc05vbmUoW10pOyAgICAgICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlzTm9uZShmdW5j
dGlvbigpIHt9KTsgIC8vIGZhbHNlCi0gIGBgYAotCi0gIEBtZXRob2QgaXNOb25lCi0gIEBmb3Ig
RW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0ZXN0Ci0gIEByZXR1cm4ge0Jv
b2xlYW59Ci0qLwotRW1iZXIuaXNOb25lID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVybiBvYmog
PT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7Ci19OwotRW1iZXIubm9uZSA9IEVtYmVyLmRl
cHJlY2F0ZUZ1bmMoIkVtYmVyLm5vbmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5p
c05vbmUgaW5zdGVhZC4iLCBFbWJlci5pc05vbmUpOwotCi0vKioKLSAgVmVyaWZpZXMgdGhhdCBh
IHZhbHVlIGlzIGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcsIGVtcHR5IGFycmF5LAotICBvciBl
bXB0eSBmdW5jdGlvbi4KLQotICBDb25zdHJhaW5zIHRoZSBydWxlcyBvbiBgRW1iZXIuaXNOb25l
YCBieSByZXR1cm5pbmcgZmFsc2UgZm9yIGVtcHR5Ci0gIHN0cmluZyBhbmQgZW1wdHkgYXJyYXlz
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuaXNFbXB0eSgpOyAgICAgICAgICAgICAgICAv
LyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkobnVsbCk7ICAgICAgICAgICAgLy8gdHJ1ZQotICBFbWJl
ci5pc0VtcHR5KHVuZGVmaW5lZCk7ICAgICAgIC8vIHRydWUKLSAgRW1iZXIuaXNFbXB0eSgnJyk7
ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkoW10pOyAgICAgICAgICAgICAg
Ly8gdHJ1ZQotICBFbWJlci5pc0VtcHR5KCdBZGFtIEhhd2tpbnMnKTsgIC8vIGZhbHNlCi0gIEVt
YmVyLmlzRW1wdHkoWzAsMSwyXSk7ICAgICAgICAgLy8gZmFsc2UKLSAgYGBgCi0KLSAgQG1ldGhv
ZCBpc0VtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0
ZXN0Ci0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1iZXIuaXNFbXB0eSA9IGZ1bmN0aW9uKG9i
aikgewotICByZXR1cm4gRW1iZXIuaXNOb25lKG9iaikgfHwgKG9iai5sZW5ndGggPT09IDAgJiYg
dHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYm
IEVtYmVyLmdldChvYmosICdsZW5ndGgnKSA9PT0gMCk7Ci19OwotRW1iZXIuZW1wdHkgPSBFbWJl
ci5kZXByZWNhdGVGdW5jKCJFbWJlci5lbXB0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVt
YmVyLmlzRW1wdHkgaW5zdGVhZC4iLCBFbWJlci5pc0VtcHR5KSA7Ci0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBOb2RlICovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0
YWwKLSovCi0KLS8qKgotICBQbGF0Zm9ybSBzcGVjaWZpYyBtZXRob2RzIGFuZCBmZWF0dXJlIGRl
dGVjdG9ycyBuZWVkZWQgYnkgdGhlIGZyYW1ld29yay4KLQotICBAY2xhc3MgcGxhdGZvcm0KLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotdmFyIHBsYXRmb3JtID0gRW1iZXIucGxh
dGZvcm0gPSB7fTsKLQotCi0vKioKLSAgSWRlbnRpY2FsIHRvIGBPYmplY3QuY3JlYXRlKClgLiBJ
bXBsZW1lbnRzIGlmIG5vdCBhdmFpbGFibGUgbmF0aXZlbHkuCi0KLSAgQG1ldGhvZCBjcmVhdGUK
LSAgQGZvciBFbWJlcgotKi8KLUVtYmVyLmNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7Ci0KLS8vIElF
OCBoYXMgT2JqZWN0LmNyZWF0ZSBidXQgaXQgY291bGRuJ3QgdHJlYXQgcHJvcGVydHkgZGVzY3Jp
cHRvcnMuCi1pZiAoRW1iZXIuY3JlYXRlKSB7Ci0gIGlmIChFbWJlci5jcmVhdGUoe2E6IDF9LCB7
YToge3ZhbHVlOiAyfX0pLmEgIT09IDIpIHsKLSAgICBFbWJlci5jcmVhdGUgPSBudWxsOwotICB9
Ci19Ci0KLS8vIFNUVUJfT0JKRUNUX0NSRUFURSBhbGxvd3MgdXMgdG8gb3ZlcnJpZGUgb3RoZXIg
bGlicmFyaWVzIHRoYXQgc3R1YgotLy8gT2JqZWN0LmNyZWF0ZSBkaWZmZXJlbnQgdGhhbiB3ZSB3
b3VsZCBwcmVmZXIKLWlmICghRW1iZXIuY3JlYXRlIHx8IEVtYmVyLkVOVi5TVFVCX09CSkVDVF9D
UkVBVEUpIHsKLSAgdmFyIEsgPSBmdW5jdGlvbigpIHt9OwotCi0gIEVtYmVyLmNyZWF0ZSA9IGZ1
bmN0aW9uKG9iaiwgcHJvcHMpIHsKLSAgICBLLnByb3RvdHlwZSA9IG9iajsKLSAgICBvYmogPSBu
ZXcgSygpOwotICAgIGlmIChwcm9wcykgewotICAgICAgSy5wcm90b3R5cGUgPSBvYmo7Ci0gICAg
ICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7Ci0gICAgICAgIEsucHJvdG90eXBlW3Byb3BdID0g
cHJvcHNbcHJvcF0udmFsdWU7Ci0gICAgICB9Ci0gICAgICBvYmogPSBuZXcgSygpOwotICAgIH0K
LSAgICBLLnByb3RvdHlwZSA9IG51bGw7Ci0KLSAgICByZXR1cm4gb2JqOwotICB9OwotCi0gIEVt
YmVyLmNyZWF0ZS5pc1NpbXVsYXRlZCA9IHRydWU7Ci19Ci0KLXZhciBkZWZpbmVQcm9wZXJ0eSA9
IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKLXZhciBjYW5SZWRlZmluZVByb3BlcnRpZXMsIGNhbkRl
ZmluZVByb3BlcnR5T25ET007Ci0KLS8vIENhdGNoIElFOCB3aGVyZSBPYmplY3QuZGVmaW5lUHJv
cGVydHkgZXhpc3RzIGJ1dCBvbmx5IHdvcmtzIG9uIERPTSBlbGVtZW50cwotaWYgKGRlZmluZVBy
b3BlcnR5KSB7Ci0gIHRyeSB7Ci0gICAgZGVmaW5lUHJvcGVydHkoe30sICdhJyx7Z2V0OmZ1bmN0
aW9uKCkge319KTsKLSAgfSBjYXRjaCAoZSkgewotICAgIGRlZmluZVByb3BlcnR5ID0gbnVsbDsK
LSAgfQotfQotCi1pZiAoZGVmaW5lUHJvcGVydHkpIHsKLSAgLy8gRGV0ZWN0cyBhIGJ1ZyBpbiBB
bmRyb2lkIDwzLjIgd2hlcmUgeW91IGNhbm5vdCByZWRlZmluZSBhIHByb3BlcnR5IHVzaW5nCi0g
IC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBvbmNlIGFjY2Vzc29ycyBoYXZlIGFscmVhZHkgYmVl
biBzZXQuCi0gIGNhblJlZGVmaW5lUHJvcGVydGllcyA9IChmdW5jdGlvbigpIHsKLSAgICB2YXIg
b2JqID0ge307Ci0KLSAgICBkZWZpbmVQcm9wZXJ0eShvYmosICdhJywgewotICAgICAgY29uZmln
dXJhYmxlOiB0cnVlLAotICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgIGdldDogZnVuY3Rp
b24oKSB7IH0sCi0gICAgICBzZXQ6IGZ1bmN0aW9uKCkgeyB9Ci0gICAgfSk7Ci0KLSAgICBkZWZp
bmVQcm9wZXJ0eShvYmosICdhJywgewotICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAg
ZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgIHdyaXRhYmxlOiB0cnVlLAotICAgICAgdmFsdWU6IHRy
dWUKLSAgICB9KTsKLQotICAgIHJldHVybiBvYmouYSA9PT0gdHJ1ZTsKLSAgfSkoKTsKLQotICAv
LyBUaGlzIGlzIGZvciBTYWZhcmkgNS4wLCB3aGljaCBzdXBwb3J0cyBPYmplY3QuZGVmaW5lUHJv
cGVydHksIGJ1dCBub3QKLSAgLy8gb24gRE9NIG5vZGVzLgotICBjYW5EZWZpbmVQcm9wZXJ0eU9u
RE9NID0gKGZ1bmN0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICBkZWZpbmVQcm9wZXJ0eShkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2RlZmluZVByb3BlcnR5T25ET00nLCB7fSk7Ci0g
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGNhdGNoKGUpIHsgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotICB9KSgpOwotCi0gIGlmICghY2FuUmVkZWZpbmVQcm9wZXJ0aWVzKSB7Ci0gICAgZGVmaW5l
UHJvcGVydHkgPSBudWxsOwotICB9IGVsc2UgaWYgKCFjYW5EZWZpbmVQcm9wZXJ0eU9uRE9NKSB7
Ci0gICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIGRlc2MpIHsKLSAg
ICAgIHZhciBpc05vZGU7Ci0KLSAgICAgIGlmICh0eXBlb2YgTm9kZSA9PT0gIm9iamVjdCIpIHsK
LSAgICAgICAgaXNOb2RlID0gb2JqIGluc3RhbmNlb2YgTm9kZTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIGlzTm9kZSA9IHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmIHR5cGVvZiBvYmoubm9k
ZVR5cGUgPT09ICJudW1iZXIiICYmIHR5cGVvZiBvYmoubm9kZU5hbWUgPT09ICJzdHJpbmciOwot
ICAgICAgfQotCi0gICAgICBpZiAoaXNOb2RlKSB7Ci0gICAgICAgIC8vIFRPRE86IFNob3VsZCB3
ZSBoYXZlIGEgd2FybmluZyBoZXJlPwotICAgICAgICByZXR1cm4gKG9ialtrZXlOYW1lXSA9IGRl
c2MudmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQ
cm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MpOwotICAgICAgfQotICAgIH07Ci0gIH0KLX0KLQot
LyoqCi1AY2xhc3MgcGxhdGZvcm0KLUBuYW1lc3BhY2UgRW1iZXIKLSovCi0KLS8qKgotICBJZGVu
dGljYWwgdG8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYC4gSW1wbGVtZW50cyBhcyBtdWNoIGZ1
bmN0aW9uYWxpdHkKLSAgYXMgcG9zc2libGUgaWYgbm90IGF2YWlsYWJsZSBuYXRpdmVseS4KLQot
ICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Ci0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVj
dCB0byBtb2RpZnkKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgcHJvcGVydHkgbmFtZSB0byBt
b2RpZnkKLSAgQHBhcmFtIHtPYmplY3R9IGRlc2MgZGVzY3JpcHRvciBoYXNoCi0gIEByZXR1cm4g
e3ZvaWR9Ci0qLwotcGxhdGZvcm0uZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsKLQot
LyoqCi0gIFNldCB0byB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBuYXRpdmUgZ2V0dGVy
cyBhbmQgc2V0dGVycy4KLQotICBAcHJvcGVydHkgaGFzUHJvcGVydHlBY2Nlc3NvcnMKLSAgQGZp
bmFsCi0qLwotcGxhdGZvcm0uaGFzUHJvcGVydHlBY2Nlc3NvcnMgPSB0cnVlOwotCi1pZiAoIXBs
YXRmb3JtLmRlZmluZVByb3BlcnR5KSB7Ci0gIHBsYXRmb3JtLmhhc1Byb3BlcnR5QWNjZXNzb3Jz
ID0gZmFsc2U7Ci0KLSAgcGxhdGZvcm0uZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIGtl
eU5hbWUsIGRlc2MpIHsKLSAgICBpZiAoIWRlc2MuZ2V0KSB7IG9ialtrZXlOYW1lXSA9IGRlc2Mu
dmFsdWU7IH0KLSAgfTsKLQotICBwbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eS5pc1NpbXVsYXRlZCA9
IHRydWU7Ci19Ci0KLWlmIChFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUiAmJiAhcGxhdGZvcm0u
aGFzUHJvcGVydHlBY2Nlc3NvcnMpIHsKLSAgRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIgPSBm
YWxzZTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qanNoaW50IG5ld2NhcDpm
YWxzZSovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLS8vIE5PVEU6IFRoZXJlIGlz
IGEgYnVnIGluIGpzaGludCB0aGF0IGRvZXNuJ3QgcmVjb2duaXplIGBPYmplY3QoKWAgd2l0aG91
dCBgbmV3YAotLy8gYXMgYmVpbmcgb2sgdW5sZXNzIGJvdGggYG5ld2NhcDpmYWxzZWAgYW5kIG5v
dCBgdXNlIHN0cmljdGAuCi0vLyBodHRwczovL2dpdGh1Yi5jb20vanNoaW50L2pzaGludC9pc3N1
ZXMvMzkyCi0KLS8vIFRlc3RpbmcgdGhpcyBpcyBub3QgaWRlYWwsIGJ1dCB3ZSB3YW50IHRvIHVz
ZSBuYXRpdmUgZnVuY3Rpb25zCi0vLyBpZiBhdmFpbGFibGUsIGJ1dCBub3QgdG8gdXNlIHZlcnNp
b25zIGNyZWF0ZWQgYnkgbGlicmFyaWVzIGxpa2UgUHJvdG90eXBlCi12YXIgaXNOYXRpdmVGdW5j
ID0gZnVuY3Rpb24oZnVuYykgewotICAvLyBUaGlzIHNob3VsZCBwcm9iYWJseSB3b3JrIGluIGFs
bCBicm93c2VycyBsaWtlbHkgdG8gaGF2ZSBFUzUgYXJyYXkgbWV0aG9kcwotICByZXR1cm4gZnVu
YyAmJiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKS5pbmRleE9mKCdbbmF0
aXZlIGNvZGVdJykgPiAtMTsKLX07Ci0KLS8vIEZyb206IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemls
bGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L21hcAot
dmFyIGFycmF5TWFwID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5tYXApID8gQXJyYXku
cHJvdG90eXBlLm1hcCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0
cmljdCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKSB7Ci0gICAg
dGhyb3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0KLSAgdmFyIHQgPSBPYmplY3QodGhpcyk7Ci0g
IHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAgaWYgKHR5cGVvZiBmdW4gIT09ICJmdW5jdGlv
biIpIHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7Ci0gIH0KLQotICB2YXIgcmVzID0gbmV3
IEFycmF5KGxlbik7Ci0gIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKLSAgZm9yICh2YXIgaSA9
IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChpIGluIHQpIHsKLSAgICAgIHJlc1tpXSA9IGZ1
bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzOwot
fTsKLQotLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlw
dC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yZWFjaAotdmFyIGFycmF5Rm9yRWFj
aCA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgPyBBcnJheS5wcm90b3R5
cGUuZm9yRWFjaCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0cmlj
dCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKSB7Ci0gICAgdGhy
b3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0KLSAgdmFyIHQgPSBPYmplY3QodGhpcyk7Ci0gIHZh
ciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAgaWYgKHR5cGVvZiBmdW4gIT09ICJmdW5jdGlvbiIp
IHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7Ci0gIH0KLQotICB2YXIgdGhpc3AgPSBhcmd1
bWVudHNbMV07Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBpZiAoaSBp
biB0KSB7Ci0gICAgICBmdW4uY2FsbCh0aGlzcCwgdFtpXSwgaSwgdCk7Ci0gICAgfQotICB9Ci19
OwotCi12YXIgYXJyYXlJbmRleE9mID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5pbmRl
eE9mKSA/IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIDogZnVuY3Rpb24gKG9iaiwgZnJvbUluZGV4
KSB7Ci0gIGlmIChmcm9tSW5kZXggPT09IG51bGwgfHwgZnJvbUluZGV4ID09PSB1bmRlZmluZWQp
IHsgZnJvbUluZGV4ID0gMDsgfQotICBlbHNlIGlmIChmcm9tSW5kZXggPCAwKSB7IGZyb21JbmRl
eCA9IE1hdGgubWF4KDAsIHRoaXMubGVuZ3RoICsgZnJvbUluZGV4KTsgfQotICBmb3IgKHZhciBp
ID0gZnJvbUluZGV4LCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKLSAgICBpZiAodGhp
c1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9Ci0gIH0KLSAgcmV0dXJuIC0xOwotfTsKLQotLyoq
Ci0gIEFycmF5IHBvbHlmaWxscyB0byBzdXBwb3J0IEVTNSBmZWF0dXJlcyBpbiBvbGRlciBicm93
c2Vycy4KLQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwcm9wZXJ0eSBBcnJheVBvbHlmaWxscwot
Ki8KLUVtYmVyLkFycmF5UG9seWZpbGxzID0gewotICBtYXA6IGFycmF5TWFwLAotICBmb3JFYWNo
OiBhcnJheUZvckVhY2gsCi0gIGluZGV4T2Y6IGFycmF5SW5kZXhPZgotfTsKLQotaWYgKEVtYmVy
LlNISU1fRVM1KSB7Ci0gIGlmICghQXJyYXkucHJvdG90eXBlLm1hcCkgewotICAgIEFycmF5LnBy
b3RvdHlwZS5tYXAgPSBhcnJheU1hcDsKLSAgfQotCi0gIGlmICghQXJyYXkucHJvdG90eXBlLmZv
ckVhY2gpIHsKLSAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGFycmF5Rm9yRWFjaDsKLSAg
fQotCi0gIGlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHsKLSAgICBBcnJheS5wcm90b3R5
cGUuaW5kZXhPZiA9IGFycmF5SW5kZXhPZjsKLSAgfQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xp
bmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwotCi0vKioK
LSAgQSBzdWJjbGFzcyBvZiB0aGUgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QgZm9yIHVzZSBpbiBF
bWJlci4KLQotICBAY2xhc3MgRXJyb3IKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
cnJvcgotICBAY29uc3RydWN0b3IKLSovCi1FbWJlci5FcnJvciA9IGZ1bmN0aW9uKCkgewotICB2
YXIgdG1wID0gRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLQotICAvLyBBZGRzIGEgYHN0
YWNrYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gZXJyb3Igb2JqZWN0IHRoYXQgd2lsbCB5aWVsZCB0
aGUKLSAgLy8gc3RhY2sgdHJhY2UgYXQgdGhlIHRpbWUgY2FwdHVyZVN0YWNrVHJhY2Ugd2FzIGNh
bGxlZC4KLSAgLy8gV2hlbiBjb2xsZWN0aW5nIHRoZSBzdGFjayB0cmFjZSBhbGwgZnJhbWVzIGFi
b3ZlIHRoZSB0b3Btb3N0IGNhbGwKLSAgLy8gdG8gdGhpcyBmdW5jdGlvbiwgaW5jbHVkaW5nIHRo
YXQgY2FsbCwgd2lsbCBiZSBsZWZ0IG91dCBvZiB0aGUKLSAgLy8gc3RhY2sgdHJhY2UuCi0gIC8v
IFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugd2UgY2FuIGhpZGUgRW1iZXIgaW1wbGVtZW50YXRpb24g
ZGV0YWlscwotICAvLyB0aGF0IGFyZSBub3QgdmVyeSBoZWxwZnVsIGZvciB0aGUgdXNlci4KLSAg
aWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7Ci0gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJh
Y2UodGhpcywgRW1iZXIuRXJyb3IpOwotICB9Ci0gIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFy
ZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRt
cGAgZG9lc24ndCB3b3JrLgotICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxl
bmd0aDsgaWR4KyspIHsKLSAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9w
c1tpZHhdXTsKLSAgfQotfTsKLQotRW1iZXIuRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRl
KEVycm9yLnByb3RvdHlwZSk7Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEVSUk9SIEhBTkRMSU5HCi0vLwotCi0vKioK
LSAgQSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gYEVtYmVyLm9uZXJyb3JgIHRvIGJlIGNh
bGxlZCB3aGVuIEVtYmVyCi0gIGludGVybmFscyBlbmNvdW50ZXIgYW4gZXJyb3IuIFRoaXMgaXMg
dXNlZnVsIGZvciBzcGVjaWFsaXplZCBlcnJvciBoYW5kbGluZwotICBhbmQgcmVwb3J0aW5nIGNv
ZGUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3Ip
IHsKLSAgICBFbS4kLmFqYXgoJy9yZXBvcnQtZXJyb3InLCAnUE9TVCcsIHsKLSAgICAgIHN0YWNr
OiBlcnJvci5zdGFjaywKLSAgICAgIG90aGVySW5mb3JtYXRpb246ICd3aGF0ZXZlciBhcHAgc3Rh
dGUgeW91IHdhbnQgdG8gcHJvdmlkZScKLSAgICB9KTsKLSAgfTsKLSAgYGBgCi0KLSAgQGV2ZW50
IG9uZXJyb3IKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0V4Y2VwdGlvbn0gZXJyb3IgdGhlIGVy
cm9yIG9iamVjdAotKi8KLUVtYmVyLm9uZXJyb3IgPSBudWxsOwotCi0vKioKLSAgV3JhcCBjb2Rl
IGJsb2NrIGluIGEgdHJ5L2NhdGNoIGlmIGBFbWJlci5vbmVycm9yYCBpcyBzZXQuCi0KLSAgQHBy
aXZhdGUKLSAgQG1ldGhvZCBoYW5kbGVFcnJvcnMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1
bmN0aW9ufSBmdW5jCi0gIEBwYXJhbSBbY29udGV4dF0KLSovCi1FbWJlci5oYW5kbGVFcnJvcnMg
PSBmdW5jdGlvbihmdW5jLCBjb250ZXh0KSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHkgaW4gc29tZSBi
cm93c2VycyB3ZSBsb3NlIHRoZSBiYWNrdHJhY2UgaWYgd2UgcmV0aHJvdyB0aGUgZXhpc3Rpbmcg
ZXJyb3IsCi0gIC8vIHNvIGluIHRoZSBldmVudCB0aGF0IHdlIGRvbid0IGhhdmUgYW4gYG9uZXJy
b3JgIGhhbmRsZXIgd2UgZG9uJ3Qgd3JhcCBpbiBhIHRyeS9jYXRjaAotICBpZiAoJ2Z1bmN0aW9u
JyA9PT0gdHlwZW9mIEVtYmVyLm9uZXJyb3IpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGZ1
bmMuY2FsbChjb250ZXh0IHx8IHRoaXMpOwotICAgIH0gY2F0Y2ggKGVycm9yKSB7Ci0gICAgICBF
bWJlci5vbmVycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZ1bmMu
Y2FsbChjb250ZXh0IHx8IHRoaXMpOwotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0qLwotCi0vKioKLSAgUHJlZml4IHVzZWQg
Zm9yIGd1aWRzIHRocm91Z2ggb3V0IEVtYmVyLgotICBAcHJpdmF0ZQotKi8KLUVtYmVyLkdVSURf
UFJFRklYID0gJ2VtYmVyJzsKLQotCi12YXIgb19kZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRm
b3JtLmRlZmluZVByb3BlcnR5LAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIC8v
IFVzZWQgZm9yIGd1aWQgZ2VuZXJhdGlvbi4uLgotICAgIEdVSURfS0VZID0gJ19fZW1iZXInKyAo
KyBuZXcgRGF0ZSgpKSwKLSAgICB1dWlkICAgICAgICAgPSAwLAotICAgIG51bWJlckNhY2hlICA9
IFtdLAotICAgIHN0cmluZ0NhY2hlICA9IHt9OwotCi12YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVt
YmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSOwotCi0vKioKLSAgQSB1bmlxdWUga2V5IHVzZWQgdG8g
YXNzaWduIGd1aWRzIGFuZCBvdGhlciBwcml2YXRlIG1ldGFkYXRhIHRvIG9iamVjdHMuCi0gIElm
IHlvdSBpbnNwZWN0IGFuIG9iamVjdCBpbiB5b3VyIGJyb3dzZXIgZGVidWdnZXIgeW91IHdpbGwg
b2Z0ZW4gc2VlIHRoZXNlLgotICBUaGV5IGNhbiBiZSBzYWZlbHkgaWdub3JlZC4KLQotICBPbiBi
cm93c2VycyB0aGF0IHN1cHBvcnQgaXQsIHRoZXNlIHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGgg
ZW51bWVyYXRpb24KLSAgZGlzYWJsZWQgc28gdGhleSB3b24ndCBzaG93IHVwIHdoZW4geW91IGl0
ZXJhdGUgb3ZlciB5b3VyIHByb3BlcnRpZXMuCi0KLSAgQHByaXZhdGUKLSAgQHByb3BlcnR5IEdV
SURfS0VZCi0gIEBmb3IgRW1iZXIKLSAgQHR5cGUgU3RyaW5nCi0gIEBmaW5hbAotKi8KLUVtYmVy
LkdVSURfS0VZID0gR1VJRF9LRVk7Ci0KLXZhciBHVUlEX0RFU0MgPSB7Ci0gIHdyaXRhYmxlOiAg
ICBmYWxzZSwKLSAgY29uZmlndXJhYmxlOiBmYWxzZSwKLSAgZW51bWVyYWJsZTogIGZhbHNlLAot
ICB2YWx1ZTogbnVsbAotfTsKLQotLyoqCi0gIEdlbmVyYXRlcyBhIG5ldyBndWlkLCBvcHRpb25h
bGx5IHNhdmluZyB0aGUgZ3VpZCB0byB0aGUgb2JqZWN0IHRoYXQgeW91Ci0gIHBhc3MgaW4uIFlv
dSB3aWxsIHJhcmVseSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCB5b3Ugc2hvdWxk
Ci0gIGNhbGwgYEVtYmVyLmd1aWRGb3Iob2JqKWAsIHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBn
dWlkIGlmIGF2YWlsYWJsZS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGdlbmVyYXRlR3VpZAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBbb2JqXSBPYmplY3QgdGhlIGd1aWQgd2ls
bCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0aGUgZ3VpZCB3aWxsCi0gICAgYmUgc2F2ZWQg
b24gdGhlIG9iamVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlvdSBwYXNzIHRoZSBzYW1lIG9iamVj
dAotICAgIGFnYWluLgotCi0gICAgSWYgbm8gb2JqZWN0IGlzIHBhc3NlZCwganVzdCBnZW5lcmF0
ZSBhIG5ldyBndWlkLgotICBAcGFyYW0ge1N0cmluZ30gW3ByZWZpeF0gUHJlZml4IHRvIHBsYWNl
IGluIGZyb250IG9mIHRoZSBndWlkLiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0bwotICAgIHNlcGFy
YXRlIHRoZSBndWlkIGludG8gc2VwYXJhdGUgbmFtZXNwYWNlcy4KLSAgQHJldHVybiB7U3RyaW5n
fSB0aGUgZ3VpZAotKi8KLUVtYmVyLmdlbmVyYXRlR3VpZCA9IGZ1bmN0aW9uIGdlbmVyYXRlR3Vp
ZChvYmosIHByZWZpeCkgewotICBpZiAoIXByZWZpeCkgcHJlZml4ID0gRW1iZXIuR1VJRF9QUkVG
SVg7Ci0gIHZhciByZXQgPSAocHJlZml4ICsgKHV1aWQrKykpOwotICBpZiAob2JqKSB7Ci0gICAg
R1VJRF9ERVNDLnZhbHVlID0gcmV0OwotICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tF
WSwgR1VJRF9ERVNDKTsKLSAgfQotICByZXR1cm4gcmV0OwotfTsKLQotLyoqCi0gIFJldHVybnMg
YSB1bmlxdWUgaWQgZm9yIHRoZSBvYmplY3QuIElmIHRoZSBvYmplY3QgZG9lcyBub3QgeWV0IGhh
dmUgYSBndWlkLAotICBvbmUgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4gWW91IGNhbiBjYWxsIHRo
aXMgb24gYW55IG9iamVjdCwKLSAgYEVtYmVyLk9iamVjdGAtYmFzZWQgb3Igbm90LCBidXQgYmUg
YXdhcmUgdGhhdCBpdCB3aWxsIGFkZCBhIGBfZ3VpZGAKLSAgcHJvcGVydHkuCi0KLSAgWW91IGNh
biBhbHNvIHVzZSB0aGlzIG1ldGhvZCBvbiBET00gRWxlbWVudCBvYmplY3RzLgotCi0gIEBwcml2
YXRlCi0gIEBtZXRob2QgZ3VpZEZvcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBv
YmogYW55IG9iamVjdCwgc3RyaW5nLCBudW1iZXIsIEVsZW1lbnQsIG9yIHByaW1pdGl2ZQotICBA
cmV0dXJuIHtTdHJpbmd9IHRoZSB1bmlxdWUgZ3VpZCBmb3IgdGhpcyBpbnN0YW5jZS4KLSovCi1F
bWJlci5ndWlkRm9yID0gZnVuY3Rpb24gZ3VpZEZvcihvYmopIHsKLQotICAvLyBzcGVjaWFsIGNh
c2VzIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gYWRkIGEga2V5IHRvIG9iamVjdAotICBpZiAob2Jq
ID09PSB1bmRlZmluZWQpIHJldHVybiAiKHVuZGVmaW5lZCkiOwotICBpZiAob2JqID09PSBudWxs
KSByZXR1cm4gIihudWxsKSI7Ci0KLSAgdmFyIHJldDsKLSAgdmFyIHR5cGUgPSB0eXBlb2Ygb2Jq
OwotCi0gIC8vIERvbid0IGFsbG93IHByb3RvdHlwZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRv
IGNoYW5nZSB0aGUgZ3VpZEZvcgotICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgJ251bWJlcic6
Ci0gICAgICByZXQgPSBudW1iZXJDYWNoZVtvYmpdOwotICAgICAgaWYgKCFyZXQpIHJldCA9IG51
bWJlckNhY2hlW29ial0gPSAnbnUnK29iajsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNl
ICdzdHJpbmcnOgotICAgICAgcmV0ID0gc3RyaW5nQ2FjaGVbb2JqXTsKLSAgICAgIGlmICghcmV0
KSByZXQgPSBzdHJpbmdDYWNoZVtvYmpdID0gJ3N0JysodXVpZCsrKTsKLSAgICAgIHJldHVybiBy
ZXQ7Ci0KLSAgICBjYXNlICdib29sZWFuJzoKLSAgICAgIHJldHVybiBvYmogPyAnKHRydWUpJyA6
ICcoZmFsc2UpJzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob2JqW0dVSURfS0VZXSkgcmV0
dXJuIG9ialtHVUlEX0tFWV07Ci0gICAgICBpZiAob2JqID09PSBPYmplY3QpIHJldHVybiAnKE9i
amVjdCknOwotICAgICAgaWYgKG9iaiA9PT0gQXJyYXkpICByZXR1cm4gJyhBcnJheSknOwotICAg
ICAgcmV0ID0gJ2VtYmVyJysodXVpZCsrKTsKLSAgICAgIEdVSURfREVTQy52YWx1ZSA9IHJldDsK
LSAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJRF9ERVNDKTsKLSAgICAg
IHJldHVybiByZXQ7Ci0gIH0KLX07Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIE1FVEEKLS8vCi0KLXZhciBNRVRBX0RF
U0MgPSB7Ci0gIHdyaXRhYmxlOiAgICB0cnVlLAotICBjb25maWd1cmFibGU6IGZhbHNlLAotICBl
bnVtZXJhYmxlOiAgZmFsc2UsCi0gIHZhbHVlOiBudWxsCi19OwotCi12YXIgTUVUQV9LRVkgPSBF
bWJlci5HVUlEX0tFWSsnX21ldGEnOwotCi0vKioKLSAgVGhlIGtleSB1c2VkIHRvIHN0b3JlIG1l
dGEgaW5mb3JtYXRpb24gb24gb2JqZWN0IGZvciBwcm9wZXJ0eSBvYnNlcnZpbmcuCi0KLSAgQHBy
b3BlcnR5IE1FVEFfS0VZCi0gIEBmb3IgRW1iZXIKLSAgQHByaXZhdGUKLSAgQGZpbmFsCi0gIEB0
eXBlIFN0cmluZwotKi8KLUVtYmVyLk1FVEFfS0VZID0gTUVUQV9LRVk7Ci0KLXZhciBpc0RlZmlu
ZVByb3BlcnR5U2ltdWxhdGVkID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHkuaXNTaW11
bGF0ZWQ7Ci0KLWZ1bmN0aW9uIE1ldGEob2JqKSB7Ci0gIHRoaXMuZGVzY3MgPSB7fTsKLSAgdGhp
cy53YXRjaGluZyA9IHt9OwotICB0aGlzLmNhY2hlID0ge307Ci0gIHRoaXMuc291cmNlID0gb2Jq
OwotfQotCi1NZXRhLnByb3RvdHlwZSA9IHsKLSAgZGVzY3M6IG51bGwsCi0gIGRlcHM6IG51bGws
Ci0gIHdhdGNoaW5nOiBudWxsLAotICBsaXN0ZW5lcnM6IG51bGwsCi0gIGNhY2hlOiBudWxsLAot
ICBzb3VyY2U6IG51bGwsCi0gIG1peGluczogbnVsbCwKLSAgYmluZGluZ3M6IG51bGwsCi0gIGNo
YWluczogbnVsbCwKLSAgY2hhaW5XYXRjaGVyczogbnVsbCwKLSAgdmFsdWVzOiBudWxsCi19Owot
Ci1pZiAoaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCkgewotICAvLyBvbiBwbGF0Zm9ybXMgdGhh
dCBkb24ndCBzdXBwb3J0IGVudW1lcmFibGUgZmFsc2UKLSAgLy8gbWFrZSBtZXRhIGZhaWwgalF1
ZXJ5LmlzUGxhaW5PYmplY3QoKSB0byBoaWRlIGZyb20KLSAgLy8galF1ZXJ5LmV4dGVuZCgpIGJ5
IGhhdmluZyBhIHByb3BlcnR5IHRoYXQgZmFpbHMKLSAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2su
Ci0gIE1ldGEucHJvdG90eXBlLl9fcHJldmVudFBsYWluT2JqZWN0X18gPSB0cnVlOwotCi0gIC8v
IFdpdGhvdXQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcywgbWV0YSBvYmplY3RzIHdpbGwgYmUg
b3V0cHV0IGluIEpTT04KLSAgLy8gdW5sZXNzIGV4cGxpY2l0bHkgc3VwcHJlc3NlZAotICBNZXRh
LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7IH07Ci19Ci0KLS8vIFBsYWNlaG9sZGVy
IGZvciBub24td3JpdGFibGUgbWV0YXMuCi12YXIgRU1QVFlfTUVUQSA9IG5ldyBNZXRhKG51bGwp
OwotCi1pZiAoTUFOREFUT1JZX1NFVFRFUikgeyBFTVBUWV9NRVRBLnZhbHVlcyA9IHt9OyB9Ci0K
LUVtYmVyLkVNUFRZX01FVEEgPSBFTVBUWV9NRVRBOwotCi0vKioKLSAgUmV0cmlldmVzIHRoZSBt
ZXRhIGhhc2ggZm9yIGFuIG9iamVjdC4gSWYgYHdyaXRhYmxlYCBpcyB0cnVlIGVuc3VyZXMgdGhl
Ci0gIGhhc2ggaXMgd3JpdGFibGUgZm9yIHRoaXMgb2JqZWN0IGFzIHdlbGwuCi0KLSAgVGhlIG1l
dGEgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGNvbXB1dGVkIHByb3BlcnR5IGRl
c2NyaXB0b3JzIGFzCi0gIHdlbGwgYXMgYW55IHdhdGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIg
aW5mb3JtYXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbAotICBub3QgYWNjZXNzIHRoaXMgaW5mb3Jt
YXRpb24gZGlyZWN0bHkgYnV0IGluc3RlYWQgd29yayB3aXRoIGhpZ2hlciBsZXZlbAotICBtZXRo
b2RzIHRoYXQgbWFuaXB1bGF0ZSB0aGlzIGhhc2ggaW5kaXJlY3RseS4KLQotICBAbWV0aG9kIG1l
dGEKLSAgQGZvciBFbWJlcgotICBAcHJpdmF0ZQotCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl
IG9iamVjdCB0byByZXRyaWV2ZSBtZXRhIGZvcgotICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJs
ZT10cnVlXSBQYXNzIGBmYWxzZWAgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gbW9kaWZ5Ci0gICAg
dGhlIG1ldGEgaGFzaCwgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBhdm9pZCBtYWtpbmcgYW4gdW5u
ZWNlc3NhcnkgY29weS4KLSAgQHJldHVybiB7T2JqZWN0fSB0aGUgbWV0YSBoYXNoIGZvciBhbiBv
YmplY3QKLSovCi1FbWJlci5tZXRhID0gZnVuY3Rpb24gbWV0YShvYmosIHdyaXRhYmxlKSB7Ci0K
LSAgdmFyIHJldCA9IG9ialtNRVRBX0tFWV07Ci0gIGlmICh3cml0YWJsZT09PWZhbHNlKSByZXR1
cm4gcmV0IHx8IEVNUFRZX01FVEE7Ci0KLSAgaWYgKCFyZXQpIHsKLSAgICBpZiAoIWlzRGVmaW5l
UHJvcGVydHlTaW11bGF0ZWQpIG9fZGVmaW5lUHJvcGVydHkob2JqLCBNRVRBX0tFWSwgTUVUQV9E
RVNDKTsKLQotICAgIHJldCA9IG5ldyBNZXRhKG9iaik7Ci0KLSAgICBpZiAoTUFOREFUT1JZX1NF
VFRFUikgeyByZXQudmFsdWVzID0ge307IH0KLQotICAgIG9ialtNRVRBX0tFWV0gPSByZXQ7Ci0K
LSAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHRyeSB0byBjcmVhdGUgY29u
c3RydWN0b3IgbGlrZSBkZXNjCi0gICAgcmV0LmRlc2NzLmNvbnN0cnVjdG9yID0gbnVsbDsKLQot
ICB9IGVsc2UgaWYgKHJldC5zb3VyY2UgIT09IG9iaikgewotICAgIGlmICghaXNEZWZpbmVQcm9w
ZXJ0eVNpbXVsYXRlZCkgb19kZWZpbmVQcm9wZXJ0eShvYmosIE1FVEFfS0VZLCBNRVRBX0RFU0Mp
OwotCi0gICAgcmV0ID0gb19jcmVhdGUocmV0KTsKLSAgICByZXQuZGVzY3MgICAgPSBvX2NyZWF0
ZShyZXQuZGVzY3MpOwotICAgIHJldC53YXRjaGluZyA9IG9fY3JlYXRlKHJldC53YXRjaGluZyk7
Ci0gICAgcmV0LmNhY2hlICAgID0ge307Ci0gICAgcmV0LnNvdXJjZSAgID0gb2JqOwotCi0gICAg
aWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgcmV0LnZhbHVlcyA9IG9fY3JlYXRlKHJldC52YWx1ZXMp
OyB9Ci0KLSAgICBvYmpbTUVUQV9LRVldID0gcmV0OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Owot
Ci1FbWJlci5nZXRNZXRhID0gZnVuY3Rpb24gZ2V0TWV0YShvYmosIHByb3BlcnR5KSB7Ci0gIHZh
ciBtZXRhID0gRW1iZXIubWV0YShvYmosIGZhbHNlKTsKLSAgcmV0dXJuIG1ldGFbcHJvcGVydHld
OwotfTsKLQotRW1iZXIuc2V0TWV0YSA9IGZ1bmN0aW9uIHNldE1ldGEob2JqLCBwcm9wZXJ0eSwg
dmFsdWUpIHsKLSAgdmFyIG1ldGEgPSBFbWJlci5tZXRhKG9iaiwgdHJ1ZSk7Ci0gIG1ldGFbcHJv
cGVydHldID0gdmFsdWU7Ci0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLS8qKgotICBAZGVwcmVjYXRl
ZAotICBAcHJpdmF0ZQotCi0gIEluIG9yZGVyIHRvIHN0b3JlIGRlZmF1bHRzIGZvciBhIGNsYXNz
LCBhIHByb3RvdHlwZSBtYXkgbmVlZCB0byBjcmVhdGUKLSAgYSBkZWZhdWx0IG1ldGEgb2JqZWN0
LCB3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieSBhbnkgb2JqZWN0cyBpbnN0YW50aWF0ZWQKLSAg
ZnJvbSB0aGUgY2xhc3MncyBjb25zdHJ1Y3Rvci4KLQotICBIb3dldmVyLCB0aGUgcHJvcGVydGll
cyBvZiB0aGF0IG1ldGEgb2JqZWN0IGFyZSBvbmx5IHNoYWxsb3ctY2xvbmVkLAotICBzbyBpZiBh
IHByb3BlcnR5IGlzIGEgaGFzaCAobGlrZSB0aGUgZXZlbnQgc3lzdGVtJ3MgYGxpc3RlbmVyc2Ag
aGFzaCksCi0gIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5j
ZXMgb2YgdGhhdCBjbGFzcy4KLQotICBUaGlzIG1ldGhvZCBhbGxvd3MgZXh0ZW5zaW9ucyB0byBk
ZWVwbHkgY2xvbmUgYSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyBvcgotICBvdGhlciBjb21wbGV4
IG9iamVjdHMuIEZvciBpbnN0YW5jZSwgdGhlIGV2ZW50IHN5c3RlbSBtaWdodCBwYXNzCi0gIGBb
J2xpc3RlbmVycycsICdmb286Y2hhbmdlJywgJ2VtYmVyMTU3J11gIHRvIGBwcmVwYXJlTWV0YVBh
dGhgLCB3aGljaCB3aWxsCi0gIHdhbGsgZG93biB0aGUga2V5cyBwcm92aWRlZC4KLQotICBGb3Ig
ZWFjaCBrZXksIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIElmIGl0
IGFscmVhZHkKLSAgZXhpc3RzIGFuZCBpdCB3YXMgaW5oZXJpdGVkIGZyb20gaXRzIGNvbnN0cnVj
dG9yLCB0aGUgY29uc3RydWN0b3IncwotICBrZXkgaXMgY2xvbmVkLgotCi0gIFlvdSBjYW4gYWxz
byBwYXNzIGZhbHNlIGZvciBgd3JpdGFibGVgLCB3aGljaCB3aWxsIHNpbXBseSByZXR1cm4KLSAg
dW5kZWZpbmVkIGlmIGBwcmVwYXJlTWV0YVBhdGhgIGRpc2NvdmVycyBhbnkgcGFydCBvZiB0aGUg
cGF0aCB0aGF0Ci0gIHNoYXJlZCBvciB1bmRlZmluZWQuCi0KLSAgQG1ldGhvZCBtZXRhUGF0aAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB3aG9zZSBtZXRh
IHdlIGFyZSBleGFtaW5pbmcKLSAgQHBhcmFtIHtBcnJheX0gcGF0aCBBbiBhcnJheSBvZiBrZXlz
IHRvIHdhbGsgZG93bgotICBAcGFyYW0ge0Jvb2xlYW59IHdyaXRhYmxlIHdoZXRoZXIgb3Igbm90
IHRvIGNyZWF0ZSBhIG5ldyBtZXRhCi0gICAgKG9yIG1ldGEgcHJvcGVydHkpIGlmIG9uZSBkb2Vz
IG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmIGl0J3MKLSAgICBzaGFyZWQgd2l0aCBpdHMgY29uc3Ry
dWN0b3IKLSovCi1FbWJlci5tZXRhUGF0aCA9IGZ1bmN0aW9uIG1ldGFQYXRoKG9iaiwgcGF0aCwg
d3JpdGFibGUpIHsKLSAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5tZXRhUGF0aCBpcyBkZXByZWNh
dGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMuIik7Ci0gIHZhciBt
ZXRhID0gRW1iZXIubWV0YShvYmosIHdyaXRhYmxlKSwga2V5TmFtZSwgdmFsdWU7Ci0KLSAgZm9y
ICh2YXIgaT0wLCBsPXBhdGgubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGtleU5hbWUgPSBwYXRo
W2ldOwotICAgIHZhbHVlID0gbWV0YVtrZXlOYW1lXTsKLQotICAgIGlmICghdmFsdWUpIHsKLSAg
ICAgIGlmICghd3JpdGFibGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQotICAgICAgdmFsdWUgPSBt
ZXRhW2tleU5hbWVdID0geyBfX2VtYmVyX3NvdXJjZV9fOiBvYmogfTsKLSAgICB9IGVsc2UgaWYg
KHZhbHVlLl9fZW1iZXJfc291cmNlX18gIT09IG9iaikgewotICAgICAgaWYgKCF3cml0YWJsZSkg
eyByZXR1cm4gdW5kZWZpbmVkOyB9Ci0gICAgICB2YWx1ZSA9IG1ldGFba2V5TmFtZV0gPSBvX2Ny
ZWF0ZSh2YWx1ZSk7Ci0gICAgICB2YWx1ZS5fX2VtYmVyX3NvdXJjZV9fID0gb2JqOwotICAgIH0K
LQotICAgIG1ldGEgPSB2YWx1ZTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLS8qKgot
ICBXcmFwcyB0aGUgcGFzc2VkIGZ1bmN0aW9uIHNvIHRoYXQgYHRoaXMuX3N1cGVyYCB3aWxsIHBv
aW50IHRvIHRoZSBzdXBlckZ1bmMKLSAgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhp
cyBpcyB0aGUgcHJpbWl0aXZlIHdlIHVzZSB0byBpbXBsZW1lbnQKLSAgY2FsbHMgdG8gc3VwZXIu
Ci0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCB3cmFwCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FsbAotICBAcGFyYW0ge0Z1bmN0aW9ufSBz
dXBlckZ1bmMgVGhlIHN1cGVyIGZ1bmN0aW9uLgotICBAcmV0dXJuIHtGdW5jdGlvbn0gd3JhcHBl
ZCBmdW5jdGlvbi4KLSovCi1FbWJlci53cmFwID0gZnVuY3Rpb24oZnVuYywgc3VwZXJGdW5jKSB7
Ci0gIGZ1bmN0aW9uIEsoKSB7fQotCi0gIGZ1bmN0aW9uIHN1cGVyV3JhcHBlcigpIHsKLSAgICB2
YXIgcmV0LCBzdXAgPSB0aGlzLl9zdXBlcjsKLSAgICB0aGlzLl9zdXBlciA9IHN1cGVyRnVuYyB8
fCBLOwotICAgIHJldCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlzLl9z
dXBlciA9IHN1cDsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc3VwZXJXcmFwcGVyLndyYXBw
ZWRGdW5jdGlvbiA9IGZ1bmM7Ci0gIHN1cGVyV3JhcHBlci5fX2VtYmVyX29ic2VydmVzX18gPSBm
dW5jLl9fZW1iZXJfb2JzZXJ2ZXNfXzsKLSAgc3VwZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNC
ZWZvcmVfXyA9IGZ1bmMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fOwotICBzdXBlcldyYXBwZXIu
X19lbWJlcl9saXN0ZW5zX18gPSBmdW5jLl9fZW1iZXJfbGlzdGVuc19fOwotCi0gIHJldHVybiBz
dXBlcldyYXBwZXI7Ci19OwotCi0vKioKLSAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgb2Jq
ZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UuCi0KLSAgRW1iZXIgQXJyYXkgUHJvdG9jb2w6
Ci0KLSAgICAtIHRoZSBvYmplY3QgaGFzIGFuIG9iamVjdEF0IHByb3BlcnR5Ci0gICAgLSB0aGUg
b2JqZWN0IGlzIGEgbmF0aXZlIEFycmF5Ci0gICAgLSB0aGUgb2JqZWN0IGlzIGFuIE9iamVjdCwg
YW5kIGhhcyBhIGxlbmd0aCBwcm9wZXJ0eQotCi0gIFVubGlrZSBgRW1iZXIudHlwZU9mYCB0aGlz
IG1ldGhvZCByZXR1cm5zIHRydWUgZXZlbiBpZiB0aGUgcGFzc2VkIG9iamVjdCBpcwotICBub3Qg
Zm9ybWFsbHkgYXJyYXkgYnV0IGFwcGVhcnMgdG8gYmUgYXJyYXktbGlrZSAoaS5lLiBpbXBsZW1l
bnRzIGBFbWJlci5BcnJheWApCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5pc0FycmF5KCk7
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQotICBF
bWJlci5pc0FycmF5KFtdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyB0cnVlCi0gIEVtYmVyLmlzQXJyYXkoIEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsgY29u
dGVudDogW10gfSkgKTsgIC8vIHRydWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBpc0FycmF5Ci0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHRlc3QKLSAgQHJl
dHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhbiBhcnJheSBvciBB
cnJheS1saWtlCi0qLwotRW1iZXIuaXNBcnJheSA9IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9i
aiB8fCBvYmouc2V0SW50ZXJ2YWwpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGlmIChBcnJheS5pc0Fy
cmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeyByZXR1cm4gdHJ1ZTsgfQotICBpZiAoRW1iZXIu
QXJyYXkgJiYgRW1iZXIuQXJyYXkuZGV0ZWN0KG9iaikpIHsgcmV0dXJuIHRydWU7IH0KLSAgaWYg
KChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpICYmICdvYmplY3QnPT09dHlwZW9mIG9iaikgeyBy
ZXR1cm4gdHJ1ZTsgfQotICByZXR1cm4gZmFsc2U7Ci19OwotCi0vKioKLSAgRm9yY2VzIHRoZSBw
YXNzZWQgb2JqZWN0IHRvIGJlIHBhcnQgb2YgYW4gYXJyYXkuIElmIHRoZSBvYmplY3QgaXMgYWxy
ZWFkeQotICBhbiBhcnJheSBvciBhcnJheS1saWtlLCByZXR1cm5zIHRoZSBvYmplY3QuIE90aGVy
d2lzZSBhZGRzIHRoZSBvYmplY3QgdG8KLSAgYW4gYXJyYXkuIElmIG9iaiBpcyBgbnVsbGAgb3Ig
YHVuZGVmaW5lZGAsIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBFbWJlci5tYWtlQXJyYXkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbXQotICBF
bWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbXQotICBFbWJl
ci5tYWtlQXJyYXkodW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAvLyBbXQotICBFbWJlci5t
YWtlQXJyYXkoJ2xpbmRzYXknKTsgICAgICAgICAgICAgICAgICAvLyBbJ2xpbmRzYXknXQotICBF
bWJlci5tYWtlQXJyYXkoWzEsMiw0Ml0pOyAgICAgICAgICAgICAgICAgICAvLyBbMSwyLDQyXQot
Ci0gIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5jcmVhdGUoeyBjb250ZW50OiBb
XSB9KTsKLSAgRW1iZXIubWFrZUFycmF5KGNvbnRyb2xsZXIpID09PSBjb250cm9sbGVyOyAgLy8g
dHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIG1ha2VBcnJheQotICBAZm9yIEVtYmVyCi0gIEBwYXJh
bSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdAotICBAcmV0dXJuIHtBcnJheX0KLSovCi1FbWJlci5t
YWtlQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKLSAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09
IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH0KLSAgcmV0dXJuIEVtYmVyLmlzQXJyYXkob2JqKSA/
IG9iaiA6IFtvYmpdOwotfTsKLQotZnVuY3Rpb24gY2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkg
ewotICByZXR1cm4gISEob2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlv
bicpOwotfQotCi0vKioKLSAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYG1ldGhvZE5hbWVgIGV4aXN0
cyBvbiB0aGUgYG9iamAuCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgZm9vID0ge2JhcjogRW1i
ZXIuSywgYmF6OiBudWxsfTsKLSAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JhcicpOyAvLyB0cnVl
Ci0gIEVtYmVyLmNhbkludm9rZShmb28sICdiYXonKTsgLy8gZmFsc2UKLSAgRW1iZXIuY2FuSW52
b2tlKGZvbywgJ2JhdCcpOyAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGNhbkludm9rZQot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjaGVjayBm
b3IgdGhlIG1ldGhvZAotICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5h
bWUgdG8gY2hlY2sgZm9yCi0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1iZXIuY2FuSW52b2tl
ID0gY2FuSW52b2tlOwotCi0vKioKLSAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYG1ldGhvZE5hbWVg
IGV4aXN0cyBvbiB0aGUgYG9iamAsCi0gIGFuZCBpZiBpdCBkb2VzLCBpbnZva2VzIGl0IHdpdGgg
dGhlIGFyZ3VtZW50cyBwYXNzZWQuCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgZCA9IG5ldyBE
YXRlKCcwMy8xNS8yMDEzJyk7Ci0gIEVtYmVyLnRyeUludm9rZShkLCAnZ2V0VGltZScpOyAvLyAx
MzYzMzIwMDAwMDAwCi0gIEVtYmVyLnRyeUludm9rZShkLCAnc2V0RnVsbFllYXInLCBbMjAxNF0p
OyAvLyAxMzk0ODU2MDAwMDAwCi0gIEVtYmVyLnRyeUludm9rZShkLCAnbm9TdWNoTWV0aG9kJywg
WzIwMTRdKTsgLy8gdW5kZWZpbmVkCi0gIGBgYAotCi0gIEBtZXRob2QgdHJ5SW52b2tlCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0
aGUgbWV0aG9kCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0
byBjaGVjayBmb3IKLSAgQHBhcmFtIHtBcnJheX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFz
cyB0byB0aGUgbWV0aG9kCi0gIEByZXR1cm4geyp9IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGlu
dm9rZWQgbWV0aG9kIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgaW52b2tlZAotKi8KLUVt
YmVyLnRyeUludm9rZSA9IGZ1bmN0aW9uKG9iaiwgbWV0aG9kTmFtZSwgYXJncykgewotICBpZiAo
Y2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkpIHsKLSAgICByZXR1cm4gb2JqW21ldGhvZE5hbWVd
LmFwcGx5KG9iaiwgYXJncyB8fCBbXSk7Ci0gIH0KLX07Ci0KLS8vIGh0dHBzOi8vZ2l0aHViLmNv
bS9lbWJlcmpzL2VtYmVyLmpzL3B1bGwvMTYxNwotdmFyIG5lZWRzRmluYWxseUZpeCA9IChmdW5j
dGlvbigpIHsKLSAgdmFyIGNvdW50ID0gMDsKLSAgdHJ5ewotICAgIHRyeSB7IH0KLSAgICBmaW5h
bGx5IHsKLSAgICAgIGNvdW50Kys7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWRzRmluYWxs
eUZpeFRlc3QnKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKGUpIHt9Ci0KLSAgcmV0dXJuIGNvdW50ICE9
PSAxOwotfSkoKTsKLQotLyoqCi0gIFByb3ZpZGVzIHRyeSB7IH0gZmluYWxseSB7IH0gZnVuY3Rp
b25hbGl0eSwgd2hpbGUgd29ya2luZwotICBhcm91bmQgU2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkg
YnVnLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHRyeWFibGUgPSBmdW5jdGlvbigpIHsKLSAg
ICBzb21lUmVzb3VyY2UubG9jaygpOwotICAgIHJ1bkNhbGxiYWNrKCk7IC8vIE1heSB0aHJvdyBl
cnJvci4KLSAgfTsKLSAgdmFyIGZpbmFsaXplciA9IGZ1bmN0aW9uKCkgewotICAgIHNvbWVSZXNv
dXJjZS51bmxvY2soKTsKLSAgfTsKLSAgRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6
ZXIpOwotICBgYGAKLQotICBAbWV0aG9kIHRyeUZpbmFsbHkKLSAgQGZvciBFbWJlcgotICBAcGFy
YW0ge0Z1bmN0aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIHRyeSBjYWxsYmFj
awotICBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5hbGl6ZXIgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUg
ZmluYWxseSBjYWxsYmFjawotICBAcGFyYW0ge09iamVjdH0gW2JpbmRpbmddIFRoZSBvcHRpb25h
bCBjYWxsaW5nIG9iamVjdC4gRGVmYXVsdHMgdG8gJ3RoaXMnCi0gIEByZXR1cm4geyp9IFRoZSBy
ZXR1cm4gdmFsdWUgaXMgdGhlIHRoYXQgb2YgdGhlIGZpbmFsaXplciwKLSAgdW5sZXNzIHRoYXQg
dmFsdWUgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUK
LSAgb2YgdGhlIHRyeWFibGUKLSovCi0KLWlmIChuZWVkc0ZpbmFsbHlGaXgpIHsKLSAgRW1iZXIu
dHJ5RmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGZpbmFsaXplciwgYmluZGluZykgewotICAg
IHZhciByZXN1bHQsIGZpbmFsUmVzdWx0LCBmaW5hbEVycm9yOwotCi0gICAgYmluZGluZyA9IGJp
bmRpbmcgfHwgdGhpczsKLQotICAgIHRyeSB7Ci0gICAgICByZXN1bHQgPSB0cnlhYmxlLmNhbGwo
YmluZGluZyk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsUmVz
dWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAg
ICAgIGZpbmFsRXJyb3IgPSBlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5hbEVycm9y
KSB7IHRocm93IGZpbmFsRXJyb3I7IH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVu
ZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0gZWxzZSB7Ci0gIEVtYmVy
LnRyeUZpbmFsbHkgPSBmdW5jdGlvbih0cnlhYmxlLCBmaW5hbGl6ZXIsIGJpbmRpbmcpIHsKLSAg
ICB2YXIgcmVzdWx0LCBmaW5hbFJlc3VsdDsKLQotICAgIGJpbmRpbmcgPSBiaW5kaW5nIHx8IHRo
aXM7Ci0KLSAgICB0cnkgewotICAgICAgcmVzdWx0ID0gdHJ5YWJsZS5jYWxsKGJpbmRpbmcpOwot
ICAgIH0gZmluYWxseSB7Ci0gICAgICBmaW5hbFJlc3VsdCA9IGZpbmFsaXplci5jYWxsKGJpbmRp
bmcpOwotICAgIH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyBy
ZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0KLQotLyoqCi0gIFByb3ZpZGVzIHRyeSB7IH0g
Y2F0Y2ggZmluYWxseSB7IH0gZnVuY3Rpb25hbGl0eSwgd2hpbGUgd29ya2luZwotICBhcm91bmQg
U2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkgYnVnLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHRy
eWFibGUgPSBmdW5jdGlvbigpIHsKLSAgICBmb3IgKGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBp
PGw7IGkrKykgewotICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICBiZWZvcmVW
YWx1ZXNbaV0gPSBsaXN0ZW5lci5iZWZvcmUobmFtZSwgdGltZSgpLCBwYXlsb2FkKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKLSAgfTsKLQotICB2YXIgY2F0
Y2hhYmxlID0gZnVuY3Rpb24oZSkgewotICAgIHBheWxvYWQgPSBwYXlsb2FkIHx8IHt9OwotICAg
IHBheWxvYWQuZXhjZXB0aW9uID0gZTsKLSAgfTsKLQotICB2YXIgZmluYWxpemVyID0gZnVuY3Rp
b24oKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFtZSwg
dGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNbaV0pOwotICAgIH0KLSAgfTsKLSAgRW1iZXIu
dHJ5Q2F0Y2hGaW5hbGx5KHRyeWFibGUsIGNhdGNoYWJsZSwgZmluYWxpemVyKTsKLSAgYGBgCi0K
LSAgQG1ldGhvZCB0cnlDYXRjaEZpbmFsbHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0
aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIHRyeSBjYWxsYmFjawotICBAcGFy
YW0ge0Z1bmN0aW9ufSBjYXRjaGFibGUgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgY2F0Y2hhYmxl
IGNhbGxiYWNrCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZpbmFsaXplciBUaGUgZnVuY3Rpb24gdG8g
cnVuIHRoZSBmaW5hbGx5IGNhbGxiYWNrCi0gIEBwYXJhbSB7T2JqZWN0fSBbYmluZGluZ10gVGhl
IG9wdGlvbmFsIGNhbGxpbmcgb2JqZWN0LiBEZWZhdWx0cyB0byAndGhpcycKLSAgQHJldHVybiB7
Kn0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGhhdCBvZiB0aGUgZmluYWxpemVyLAotICB1bmxl
c3MgdGhhdCB2YWx1ZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHJldHVy
biB2YWx1ZQotICBvZiB0aGUgdHJ5YWJsZS4KLSovCi1pZiAobmVlZHNGaW5hbGx5Rml4KSB7Ci0g
IEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmlu
YWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFyIHJlc3VsdCwgZmluYWxSZXN1bHQsIGZpbmFsRXJy
b3I7Ci0KLSAgICBiaW5kaW5nID0gYmluZGluZyB8fCB0aGlzOwotCi0gICAgdHJ5IHsKLSAgICAg
IHJlc3VsdCA9IHRyeWFibGUuY2FsbChiaW5kaW5nKTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0g
ICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBlcnJvcik7Ci0gICAgfSBmaW5h
bGx5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwo
YmluZGluZyk7Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICAgIGZpbmFsRXJyb3IgPSBlOwot
ICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5hbEVycm9yKSB7IHRocm93IGZpbmFsRXJyb3I7
IH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBm
aW5hbFJlc3VsdDsKLSAgfTsKLX0gZWxzZSB7Ci0gIEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1
bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmluYWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFy
IHJlc3VsdCwgZmluYWxSZXN1bHQ7Ci0KLSAgICBiaW5kaW5nID0gYmluZGluZyB8fCB0aGlzOwot
Ci0gICAgdHJ5IHsKLSAgICAgIHJlc3VsdCA9IHRyeWFibGUuY2FsbChiaW5kaW5nKTsKLSAgICB9
IGNhdGNoKGVycm9yKSB7Ci0gICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBl
cnJvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNh
bGwoYmluZGluZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZp
bmVkKSA/IHJlc3VsdCA6IGZpbmFsUmVzdWx0OwotICB9OwotfQotCi0vLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBUWVBJTkcgJiBBUlJBWSBNRVNTQUdJTkcK
LS8vCi0KLXZhciBUWVBFX01BUCA9IHt9OwotdmFyIHQgPSAiQm9vbGVhbiBOdW1iZXIgU3RyaW5n
IEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKTsKLUVtYmVyLkFy
cmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBmdW5jdGlvbihuYW1lKSB7Ci0gIFRZUEVfTUFQ
WyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotfSk7Ci0K
LXZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Ci0KLS8qKgotICBSZXR1
cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIGl0ZW0uCi0KLSAgVXNlIHRoaXMg
aW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBlIG9mIGFuIGl0
ZW0uCi0gIEl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhY3Jvc3MgYWxsIGJyb3dzZXJz
IGFuZCBpbmNsdWRlcyBhIGJpdAotICBtb3JlIGRldGFpbC4gSGVyZSBpcyB3aGF0IHdpbGwgYmUg
cmV0dXJuZWQ6Ci0KLSAgICAgIHwgUmV0dXJuIFZhbHVlICB8IE1lYW5pbmcgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfC0tLS0tLS0tLS0tLS0t
LXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18
Ci0gICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0aXZlIG9yIFN0cmluZyBvYmpl
Y3QuICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ251bWJlcicgICAgICB8IE51bWJlciBw
cmltaXRpdmUgb3IgTnVtYmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAn
Ym9vbGVhbicgICAgIHwgQm9vbGVhbiBwcmltaXRpdmUgb3IgQm9vbGVhbiBvYmplY3QuICAgICAg
ICAgICAgICAgICB8Ci0gICAgICB8ICdudWxsJyAgICAgICAgfCBOdWxsIHZhbHVlICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ3VuZGVmaW5lZCcg
ICB8IFVuZGVmaW5lZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fAotICAgICAgfCAnZnVuY3Rpb24nICAgIHwgQSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0
YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwg
J3JlZ2V4cCcgICAgICB8IEFuIGluc3RhbmNlIG9mIFJlZ0V4cCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAotICAgICAgfCAnZGF0ZScgICAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgRGF0
ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdjbGFzcycgICAg
ICAgfCBBbiBFbWJlciBjbGFzcyAoY3JlYXRlZCB1c2luZyBFbWJlci5PYmplY3QuZXh0ZW5kKCkp
IHwKLSAgICAgIHwgJ2luc3RhbmNlJyAgICB8IEFuIEVtYmVyIG9iamVjdCBpbnN0YW5jZSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAnZXJyb3InICAgICAgIHwgQW4gaW5z
dGFuY2Ugb2YgdGhlIEVycm9yIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8
ICdvYmplY3QnICAgICAgfCBBIEphdmFTY3JpcHQgb2JqZWN0IG5vdCBpbmhlcml0aW5nIGZyb20g
RW1iZXIuT2JqZWN0IHwKLQotICBFeGFtcGxlczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVy
LnR5cGVPZigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3VuZGVmaW5lZCcKLSAgRW1iZXIu
dHlwZU9mKG51bGwpOyAgICAgICAgICAgICAgICAgICAvLyAnbnVsbCcKLSAgRW1iZXIudHlwZU9m
KHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAvLyAndW5kZWZpbmVkJwotICBFbWJlci50eXBlT2Yo
J21pY2hhZWwnKTsgICAgICAgICAgICAgIC8vICdzdHJpbmcnCi0gIEVtYmVyLnR5cGVPZihuZXcg
U3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmluZycKLSAgRW1iZXIudHlwZU9mKDEwMSk7ICAg
ICAgICAgICAgICAgICAgICAvLyAnbnVtYmVyJwotICBFbWJlci50eXBlT2YobmV3IE51bWJlcigx
MDEpKTsgICAgICAgIC8vICdudW1iZXInCi0gIEVtYmVyLnR5cGVPZih0cnVlKTsgICAgICAgICAg
ICAgICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVyLnR5cGVPZihuZXcgQm9vbGVhbih0cnVlKSk7
ICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVyLnR5cGVPZihFbWJlci5tYWtlQXJyYXkpOyAgICAg
ICAgLy8gJ2Z1bmN0aW9uJwotICBFbWJlci50eXBlT2YoWzEsMiw5MF0pOyAgICAgICAgICAgICAg
IC8vICdhcnJheScKLSAgRW1iZXIudHlwZU9mKC9hYmMvKTsgICAgICAgICAgICAgICAgICAvLyAn
cmVnZXhwJwotICBFbWJlci50eXBlT2YobmV3IERhdGUoKSk7ICAgICAgICAgICAgIC8vICdkYXRl
JwotICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmV4dGVuZCgpKTsgIC8vICdjbGFzcycKLSAg
RW1iZXIudHlwZU9mKEVtYmVyLk9iamVjdC5jcmVhdGUoKSk7ICAvLyAnaW5zdGFuY2UnCi0gIEVt
YmVyLnR5cGVPZihuZXcgRXJyb3IoJ3RlYW1vY2lsJykpOyAgLy8gJ2Vycm9yJwotCi0gIC8vICJu
b3JtYWwiIEphdmFTY3JpcHQgb2JqZWN0Ci0gIEVtYmVyLnR5cGVPZih7YTogJ2InfSk7ICAgICAg
ICAgICAgICAvLyAnb2JqZWN0JwotICBgYGAKLQotICBAbWV0aG9kIHR5cGVPZgotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrCi0gIEByZXR1cm4g
e1N0cmluZ30gdGhlIHR5cGUKLSovCi1FbWJlci50eXBlT2YgPSBmdW5jdGlvbihpdGVtKSB7Ci0g
IHZhciByZXQ7Ci0KLSAgcmV0ID0gKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVk
KSA/IFN0cmluZyhpdGVtKSA6IFRZUEVfTUFQW3RvU3RyaW5nLmNhbGwoaXRlbSldIHx8ICdvYmpl
Y3QnOwotCi0gIGlmIChyZXQgPT09ICdmdW5jdGlvbicpIHsKLSAgICBpZiAoRW1iZXIuT2JqZWN0
ICYmIEVtYmVyLk9iamVjdC5kZXRlY3QoaXRlbSkpIHJldCA9ICdjbGFzcyc7Ci0gIH0gZWxzZSBp
ZiAocmV0ID09PSAnb2JqZWN0JykgewotICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHJl
dCA9ICdlcnJvcic7Ci0gICAgZWxzZSBpZiAoRW1iZXIuT2JqZWN0ICYmIGl0ZW0gaW5zdGFuY2Vv
ZiBFbWJlci5PYmplY3QpIHJldCA9ICdpbnN0YW5jZSc7Ci0gICAgZWxzZSBpZiAoaXRlbSBpbnN0
YW5jZW9mIERhdGUpIHJldCA9ICdkYXRlJzsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19OwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gRW1iZXIudHJ5Q2F0Y2hGaW5hbGx5Ci0KLS8q
KgotICBUaGUgcHVycG9zZSBvZiB0aGUgRW1iZXIgSW5zdHJ1bWVudGF0aW9uIG1vZHVsZSBpcwot
ICB0byBwcm92aWRlIGVmZmljaWVudCwgZ2VuZXJhbC1wdXJwb3NlIGluc3RydW1lbnRhdGlvbgot
ICBmb3IgRW1iZXIuCi0KLSAgU3Vic2NyaWJlIHRvIGEgbGlzdGVuZXIgYnkgdXNpbmcgYEVtYmVy
LnN1YnNjcmliZWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5zdWJzY3JpYmUoInJlbmRl
ciIsIHsKLSAgICBiZWZvcmU6IGZ1bmN0aW9uKG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgewot
Ci0gICAgfSwKLQotICAgIGFmdGVyOiBmdW5jdGlvbihuYW1lLCB0aW1lc3RhbXAsIHBheWxvYWQp
IHsKLQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIElmIHlvdSByZXR1cm4gYSB2YWx1ZSBmcm9t
IHRoZSBgYmVmb3JlYCBjYWxsYmFjaywgdGhhdCBzYW1lCi0gIHZhbHVlIHdpbGwgYmUgcGFzc2Vk
IGFzIGEgZm91cnRoIHBhcmFtZXRlciB0byB0aGUgYGFmdGVyYAotICBjYWxsYmFjay4KLQotICBJ
bnN0cnVtZW50IGEgYmxvY2sgb2YgY29kZSBieSB1c2luZyBgRW1iZXIuaW5zdHJ1bWVudGA6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5pbnN0cnVtZW50KCJyZW5kZXIuaGFuZGxlYmFycyIs
IHBheWxvYWQsIGZ1bmN0aW9uKCkgewotICAgIC8vIHJlbmRlcmluZyBsb2dpYwotICB9LCBiaW5k
aW5nKTsKLSAgYGBgCi0KLSAgRXZlbnQgbmFtZXMgcGFzc2VkIHRvIGBFbWJlci5pbnN0cnVtZW50
YCBhcmUgbmFtZXNwYWNlZAotICBieSBwZXJpb2RzLCBmcm9tIG1vcmUgZ2VuZXJhbCB0byBtb3Jl
IHNwZWNpZmljLiBTdWJzY3JpYmVycwotICBjYW4gbGlzdGVuIGZvciBldmVudHMgYnkgd2hhdGV2
ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQotICBhcmUgaW50ZXJlc3RlZCBpbi4KLQotICBJ
biB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50IGlzIGByZW5kZXIuaGFuZGxlYmFyc2AsCi0g
IGFuZCB0aGUgc3Vic2NyaWJlciBsaXN0ZW5lZCBmb3IgYWxsIGV2ZW50cyBiZWdpbm5pbmcgd2l0
aAotICBgcmVuZGVyYC4gSXQgd291bGQgcmVjZWl2ZSBjYWxsYmFja3MgZm9yIGV2ZW50cyBuYW1l
ZAotICBgcmVuZGVyYCwgYHJlbmRlci5oYW5kbGViYXJzYCwgYHJlbmRlci5jb250YWluZXJgLCBv
cgotICBldmVuIGByZW5kZXIuaGFuZGxlYmFycy5sYXlvdXRgLgotCi0gIEBjbGFzcyBJbnN0cnVt
ZW50YXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotRW1iZXIuSW5zdHJ1
bWVudGF0aW9uID0ge307Ci0KLXZhciBzdWJzY3JpYmVycyA9IFtdLCBjYWNoZSA9IHt9OwotCi12
YXIgcG9wdWxhdGVMaXN0ZW5lcnMgPSBmdW5jdGlvbihuYW1lKSB7Ci0gIHZhciBsaXN0ZW5lcnMg
PSBbXSwgc3Vic2NyaWJlcjsKLQotICBmb3IgKHZhciBpPTAsIGw9c3Vic2NyaWJlcnMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgIHN1YnNjcmliZXIgPSBzdWJzY3JpYmVyc1tpXTsKLSAgICBpZiAo
c3Vic2NyaWJlci5yZWdleC50ZXN0KG5hbWUpKSB7Ci0gICAgICBsaXN0ZW5lcnMucHVzaChzdWJz
Y3JpYmVyLm9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgY2FjaGVbbmFtZV0gPSBsaXN0ZW5lcnM7
Ci0gIHJldHVybiBsaXN0ZW5lcnM7Ci19OwotCi12YXIgdGltZSA9IChmdW5jdGlvbigpIHsKLSAg
dmFyIHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdy5wZXJmb3Jt
YW5jZSB8fCB7fSA6IHt9OwotICB2YXIgZm4gPSBwZXJmLm5vdyB8fCBwZXJmLm1vek5vdyB8fCBw
ZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdzsKLSAgLy8gZm4uYmluZCB3
aWxsIGJlIGF2YWlsYWJsZSBpbiBhbGwgdGhlIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0aGUgYWR2
YW5jZWQgd2luZG93LnBlcmZvcm1hbmNlLi4uIDstKQotICByZXR1cm4gZm4gPyBmbi5iaW5kKHBl
cmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3IERhdGUoKTsgfTsKLX0pKCk7Ci0KLS8qKgot
ICBOb3RpZmllcyBldmVudCdzIHN1YnNjcmliZXJzLCBjYWxscyBgYmVmb3JlYCBhbmQgYGFmdGVy
YCBob29rcy4KLQotICBAbWV0aG9kIGluc3RydW1lbnQKLSAgQG5hbWVzcGFjZSBFbWJlci5JbnN0
cnVtZW50YXRpb24KLQotICBAcGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFjZWQgZXZlbnQg
bmFtZS4KLSAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs
bGJhY2sgRnVuY3Rpb24gdGhhdCB5b3UncmUgaW5zdHJ1bWVudGluZy4KLSAgQHBhcmFtIHtPYmpl
Y3R9IGJpbmRpbmcgQ29udGV4dCB0aGF0IGluc3RydW1lbnQgZnVuY3Rpb24gaXMgY2FsbGVkIHdp
dGguCi0qLwotRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQgPSBmdW5jdGlvbihuYW1l
LCBwYXlsb2FkLCBjYWxsYmFjaywgYmluZGluZykgewotICB2YXIgbGlzdGVuZXJzID0gY2FjaGVb
bmFtZV0sIHRpbWVOYW1lLCByZXQ7Ci0KLSAgaWYgKEVtYmVyLlNUUlVDVFVSRURfUFJPRklMRSkg
ewotICAgIHRpbWVOYW1lID0gbmFtZSArICI6ICIgKyBwYXlsb2FkLm9iamVjdDsKLSAgICBjb25z
b2xlLnRpbWUodGltZU5hbWUpOwotICB9Ci0KLSAgaWYgKCFsaXN0ZW5lcnMpIHsKLSAgICBsaXN0
ZW5lcnMgPSBwb3B1bGF0ZUxpc3RlbmVycyhuYW1lKTsKLSAgfQotCi0gIGlmIChsaXN0ZW5lcnMu
bGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0ID0gY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKLSAgICBp
ZiAoRW1iZXIuU1RSVUNUVVJFRF9QUk9GSUxFKSB7IGNvbnNvbGUudGltZUVuZCh0aW1lTmFtZSk7
IH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdmFyIGJlZm9yZVZhbHVlcyA9IFtdLCBsaXN0
ZW5lciwgaSwgbDsKLQotICBmdW5jdGlvbiB0cnlhYmxlKCkgewotICAgIGZvciAoaT0wLCBsPWxp
c3RlbmVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tp
XTsKLSAgICAgIGJlZm9yZVZhbHVlc1tpXSA9IGxpc3RlbmVyLmJlZm9yZShuYW1lLCB0aW1lKCks
IHBheWxvYWQpOwotICAgIH0KLQotICAgIHJldHVybiBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOwot
ICB9Ci0KLSAgZnVuY3Rpb24gY2F0Y2hhYmxlKGUpIHsKLSAgICBwYXlsb2FkID0gcGF5bG9hZCB8
fCB7fTsKLSAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7Ci0gIH0KLQotICBmdW5jdGlvbiBmaW5h
bGl6ZXIoKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsK
LSAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFt
ZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNbaV0pOwotICAgIH0KLQotICAgIGlmIChF
bWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsKLSAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTmFt
ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLnRyeUNhdGNoRmluYWxseSh0cnlhYmxl
LCBjYXRjaGFibGUsIGZpbmFsaXplcik7Ci19OwotCi0vKioKLSAgU3Vic2NyaWJlcyB0byBhIHBh
cnRpY3VsYXIgZXZlbnQgb3IgaW5zdHJ1bWVudGVkIGJsb2NrIG9mIGNvZGUuCi0KLSAgQG1ldGhv
ZCBzdWJzY3JpYmUKLSAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24KLQotICBAcGFy
YW0ge1N0cmluZ30gW3BhdHRlcm5dIE5hbWVzcGFjZWQgZXZlbnQgbmFtZS4KLSAgQHBhcmFtIHtP
YmplY3R9IFtvYmplY3RdIEJlZm9yZSBhbmQgQWZ0ZXIgaG9va3MuCi0KLSAgQHJldHVybiB7U3Vi
c2NyaWJlcn0KLSovCi1FbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlID0gZnVuY3Rpb24o
cGF0dGVybiwgb2JqZWN0KSB7Ci0gIHZhciBwYXRocyA9IHBhdHRlcm4uc3BsaXQoIi4iKSwgcGF0
aCwgcmVnZXggPSBbXTsKLQotICBmb3IgKHZhciBpPTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkr
KykgewotICAgIHBhdGggPSBwYXRoc1tpXTsKLSAgICBpZiAocGF0aCA9PT0gIioiKSB7Ci0gICAg
ICByZWdleC5wdXNoKCJbXlxcLl0qIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlZ2V4LnB1c2go
cGF0aCk7Ci0gICAgfQotICB9Ci0KLSAgcmVnZXggPSByZWdleC5qb2luKCJcXC4iKTsKLSAgcmVn
ZXggPSByZWdleCArICIoXFwuLiopPyI7Ci0KLSAgdmFyIHN1YnNjcmliZXIgPSB7Ci0gICAgcGF0
dGVybjogcGF0dGVybiwKLSAgICByZWdleDogbmV3IFJlZ0V4cCgiXiIgKyByZWdleCArICIkIiks
Ci0gICAgb2JqZWN0OiBvYmplY3QKLSAgfTsKLQotICBzdWJzY3JpYmVycy5wdXNoKHN1YnNjcmli
ZXIpOwotICBjYWNoZSA9IHt9OwotCi0gIHJldHVybiBzdWJzY3JpYmVyOwotfTsKLQotLyoqCi0g
IFVuc3Vic2NyaWJlcyBmcm9tIGEgcGFydGljdWxhciBldmVudCBvciBpbnN0cnVtZW50ZWQgYmxv
Y2sgb2YgY29kZS4KLQotICBAbWV0aG9kIHVuc3Vic2NyaWJlCi0gIEBuYW1lc3BhY2UgRW1iZXIu
SW5zdHJ1bWVudGF0aW9uCi0KLSAgQHBhcmFtIHtPYmplY3R9IFtzdWJzY3JpYmVyXQotKi8KLUVt
YmVyLkluc3RydW1lbnRhdGlvbi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsK
LSAgdmFyIGluZGV4OwotCi0gIGZvciAodmFyIGk9MCwgbD1zdWJzY3JpYmVycy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgaWYgKHN1YnNjcmliZXJzW2ldID09PSBzdWJzY3JpYmVyKSB7Ci0gICAg
ICBpbmRleCA9IGk7Ci0gICAgfQotICB9Ci0KLSAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAx
KTsKLSAgY2FjaGUgPSB7fTsKLX07Ci0KLS8qKgotICBSZXNldHMgYEVtYmVyLkluc3RydW1lbnRh
dGlvbmAgYnkgZmx1c2hpbmcgbGlzdCBvZiBzdWJzY3JpYmVycy4KLQotICBAbWV0aG9kIHJlc2V0
Ci0gIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1bWVudGF0aW9uCi0qLwotRW1iZXIuSW5zdHJ1bWVu
dGF0aW9uLnJlc2V0ID0gZnVuY3Rpb24oKSB7Ci0gIHN1YnNjcmliZXJzID0gW107Ci0gIGNhY2hl
ID0ge307Ci19OwotCi1FbWJlci5pbnN0cnVtZW50ID0gRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmlu
c3RydW1lbnQ7Ci1FbWJlci5zdWJzY3JpYmUgPSBFbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2Ny
aWJlOwotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBtYXAsIGZvckVhY2gsIGluZGV4
T2YsIHNwbGljZTsKLW1hcCAgICAgPSBBcnJheS5wcm90b3R5cGUubWFwICAgICB8fCBFbWJlci5B
cnJheVBvbHlmaWxscy5tYXA7Ci1mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggfHwg
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKLWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUu
aW5kZXhPZiB8fCBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotc3BsaWNlID0gQXJyYXku
cHJvdG90eXBlLnNwbGljZTsKLQotdmFyIHV0aWxzID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzID0g
ewotICBtYXA6IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKLSAgICByZXR1cm4g
b2JqLm1hcCA/IG9iai5tYXAuY2FsbChvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSA6IG1hcC5jYWxs
KG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwotICB9LAotCi0gIGZvckVhY2g6IGZ1bmN0aW9uKG9i
aiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKLSAgICByZXR1cm4gb2JqLmZvckVhY2ggPyBvYmouZm9y
RWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIDogZm9yRWFjaC5jYWxsKG9iaiwgY2Fs
bGJhY2ssIHRoaXNBcmcpOwotICB9LAotCi0gIGluZGV4T2Y6IGZ1bmN0aW9uKG9iaiwgZWxlbWVu
dCwgaW5kZXgpIHsKLSAgICByZXR1cm4gb2JqLmluZGV4T2YgPyBvYmouaW5kZXhPZi5jYWxsKG9i
aiwgZWxlbWVudCwgaW5kZXgpIDogaW5kZXhPZi5jYWxsKG9iaiwgZWxlbWVudCwgaW5kZXgpOwot
ICB9LAotCi0gIGluZGV4ZXNPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50cykgewotICAgIHJldHVy
biBlbGVtZW50cyA9PT0gdW5kZWZpbmVkID8gW10gOiB1dGlscy5tYXAoZWxlbWVudHMsIGZ1bmN0
aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB1dGlscy5pbmRleE9mKG9iaiwgaXRlbSk7Ci0gICAg
fSk7Ci0gIH0sCi0KLSAgYWRkT2JqZWN0OiBmdW5jdGlvbihhcnJheSwgaXRlbSkgewotICAgIHZh
ciBpbmRleCA9IHV0aWxzLmluZGV4T2YoYXJyYXksIGl0ZW0pOwotICAgIGlmIChpbmRleCA9PT0g
LTEpIHsgYXJyYXkucHVzaChpdGVtKTsgfQotICB9LAotCi0gIHJlbW92ZU9iamVjdDogZnVuY3Rp
b24oYXJyYXksIGl0ZW0pIHsKLSAgICB2YXIgaW5kZXggPSB1dGlscy5pbmRleE9mKGFycmF5LCBp
dGVtKTsKLSAgICBpZiAoaW5kZXggIT09IC0xKSB7IGFycmF5LnNwbGljZShpbmRleCwgMSk7IH0K
LSAgfSwKLQotICBfcmVwbGFjZTogZnVuY3Rpb24oYXJyYXksIGlkeCwgYW10LCBvYmplY3RzKSB7
Ci0gICAgdmFyIGFyZ3MgPSBbXS5jb25jYXQob2JqZWN0cyksIGNodW5rLCByZXQgPSBbXSwKLSAg
ICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWls
P2lkPTU2NTg4Ci0gICAgICAgIHNpemUgPSA2MDAwMCwgc3RhcnQgPSBpZHgsIGVuZHMgPSBhbXQs
IGNvdW50OwotCi0gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7Ci0gICAgICBjb3VudCA9IGVuZHMg
PiBzaXplID8gc2l6ZSA6IGVuZHM7Ci0gICAgICBpZiAoY291bnQgPD0gMCkgeyBjb3VudCA9IDA7
IH0KLQotICAgICAgY2h1bmsgPSBhcmdzLnNwbGljZSgwLCBzaXplKTsKLSAgICAgIGNodW5rID0g
W3N0YXJ0LCBjb3VudF0uY29uY2F0KGNodW5rKTsKLQotICAgICAgc3RhcnQgKz0gc2l6ZTsKLSAg
ICAgIGVuZHMgLT0gY291bnQ7Ci0KLSAgICAgIHJldCA9IHJldC5jb25jYXQoc3BsaWNlLmFwcGx5
KGFycmF5LCBjaHVuaykpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIHJlcGxh
Y2U6IGZ1bmN0aW9uKGFycmF5LCBpZHgsIGFtdCwgb2JqZWN0cykgewotICAgIGlmIChhcnJheS5y
ZXBsYWNlKSB7Ci0gICAgICByZXR1cm4gYXJyYXkucmVwbGFjZShpZHgsIGFtdCwgb2JqZWN0cyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1dGlscy5fcmVwbGFjZShhcnJheSwgaWR4LCBh
bXQsIG9iamVjdHMpOwotICAgIH0KLSAgfSwKLQotICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uKGFy
cmF5MSwgYXJyYXkyKSB7Ci0gICAgdmFyIGludGVyc2VjdGlvbiA9IFtdOwotCi0gICAgdXRpbHMu
Zm9yRWFjaChhcnJheTEsIGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICAgIGlmICh1dGlscy5pbmRl
eE9mKGFycmF5MiwgZWxlbWVudCkgPj0gMCkgewotICAgICAgICBpbnRlcnNlY3Rpb24ucHVzaChl
bGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBpbnRlcnNlY3Rpb247Ci0g
IH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIt
bWV0YWwKLSovCi0KLXZhciBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZLCBnZXQ7Ci0KLXZhciBN
QU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVI7Ci0KLXZhciBJU19H
TE9CQUxfUEFUSCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS4qW1wuXCpdLzsKLXZhciBIQVNf
VEhJUyAgPSAvXnRoaXNbXC5cKl0vOwotdmFyIEZJUlNUX0tFWSA9IC9eKFteXC5cKl0rKS87Ci0K
LS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4KLS8vIEdFVCBBTkQgU0VUCi0vLwotLy8gSWYgd2UgYXJlIG9uIGEgcGxhdGZvcm0gdGhh
dCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIHVzZSB0aG9zZS4KLS8vIE90aGVyd2lzZSBzaW11
bGF0ZSBhY2Nlc3NvcnMgYnkgbG9va2luZyB1cCB0aGUgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhl
Ci0vLyBvYmplY3QuCi0KLS8qKgotICBHZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9uIGFu
IG9iamVjdC4gSWYgdGhlIHByb3BlcnR5IGlzIGNvbXB1dGVkLAotICB0aGUgZnVuY3Rpb24gd2ls
bCBiZSBpbnZva2VkLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgYnV0IHRoZQotICBv
YmplY3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Qcm9wZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3
aWxsIGJlIGludm9rZWQuCi0KLSAgSWYgeW91IHBsYW4gdG8gcnVuIG9uIElFOCBhbmQgb2xkZXIg
YnJvd3NlcnMgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGlzCi0gIG1ldGhvZCBhbnl0aW1lIHlvdSB3
YW50IHRvIHJldHJpZXZlIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0Ci0g
IGtub3cgZm9yIHN1cmUgaXMgcHJpdmF0ZS4gKFByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggYW4g
dW5kZXJzY29yZSAnXycKLSAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4pCi0KLSAgT24gYWxsIG5l
d2VyIGJyb3dzZXJzLCB5b3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZCB0byByZXRyaWV2
ZQotICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBtaWdodCBub3QgYmUgZGVmaW5lZCBvbiB0
aGUgb2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5
YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAg
Tm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRlZmluZWRgLCB0aGlzIG1ldGhv
ZCB3aWxsIHRocm93Ci0gIGFuIGVycm9yLgotCi0gIEBtZXRob2QgZ2V0Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIGZyb20uCi0gIEBw
YXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmV0cmlldmUKLSAgQHJl
dHVybiB7T2JqZWN0fSB0aGUgcHJvcGVydHkgdmFsdWUgb3IgYG51bGxgLgotKi8KLWdldCA9IGZ1
bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKLSAgLy8gSGVscGVycyB0aGF0IG9wZXJhdGUgd2l0
aCAndGhpcycgd2l0aGluIGFuICNlYWNoCi0gIGlmIChrZXlOYW1lID09PSAnJykgewotICAgIHJl
dHVybiBvYmo7Ci0gIH0KLQotICBpZiAoIWtleU5hbWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2Jq
KSB7Ci0gICAga2V5TmFtZSA9IG9iajsKLSAgICBvYmogPSBudWxsOwotICB9Ci0KLSAgRW1iZXIu
YXNzZXJ0KCJDYW5ub3QgY2FsbCBnZXQgd2l0aCAiKyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5h
bWUpOwotICBFbWJlci5hc3NlcnQoIkNhbm5vdCBjYWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsi
JyBvbiBhbiB1bmRlZmluZWQgb2JqZWN0LiIsIG9iaiAhPT0gdW5kZWZpbmVkKTsKLQotICBpZiAo
b2JqID09PSBudWxsIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgewotICAgIHJldHVy
biBnZXRQYXRoKG9iaiwga2V5TmFtZSk7Ci0gIH0KLQotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tF
WV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nba2V5TmFtZV0sIHJldDsKLSAgaWYgKGRlc2Mp
IHsKLSAgICByZXR1cm4gZGVzYy5nZXQob2JqLCBrZXlOYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBtZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5TmFtZV0gPiAw
KSB7Ci0gICAgICByZXQgPSBtZXRhLnZhbHVlc1trZXlOYW1lXTsKLSAgICB9IGVsc2UgewotICAg
ICAgcmV0ID0gb2JqW2tleU5hbWVdOwotICAgIH0KLQotICAgIGlmIChyZXQgPT09IHVuZGVmaW5l
ZCAmJgotICAgICAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4gb2Jq
KSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnVua25vd25Qcm9wZXJ0eSkgewotICAgICAg
cmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IHJldDsKLSAgfQotfTsKLQotLy8gQ3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRl
c3RzCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKSB7Ci0gIEVtYmVyLmdldCA9
IGdldDsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIGdldCA9IEVtYmVy
LmdldDsKLX0KLQotLyoqCi0gIE5vcm1hbGl6ZXMgYSB0YXJnZXQvcGF0aCBwYWlyIHRvIHJlZmxl
Y3QgdGhhdCBhY3R1YWwgdGFyZ2V0L3BhdGggdGhhdCBzaG91bGQKLSAgYmUgb2JzZXJ2ZWQsIGV0
Yy4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgcGFzc2luZyBpbiBnbG9iYWwgcHJvcGVydHkKLSAg
cGF0aHMgKGkuZS4gYSBwYXRoIGJlZ2lubmluZyB3aXRoIGEgY2FwdGlhbCBsZXR0ZXIgbm90IGRl
ZmluZWQgb24gdGhlCi0gIHRhcmdldCkgYW5kICogc2VwYXJhdG9ycy4KLQotICBAcHJpdmF0ZQot
ICBAbWV0aG9kIG5vcm1hbGl6ZVR1cGxlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9
IHRhcmdldCBUaGUgY3VycmVudCB0YXJnZXQuIE1heSBiZSBgbnVsbGAuCi0gIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoIEEgcGF0aCBvbiB0aGUgdGFyZ2V0IG9yIGEgZ2xvYmFsIHByb3BlcnR5IHBhdGgu
Ci0gIEByZXR1cm4ge0FycmF5fSBhIHRlbXBvcmFyeSBhcnJheSB3aXRoIHRoZSBub3JtYWxpemVk
IHRhcmdldC9wYXRoIHBhaXIuCi0qLwotdmFyIG5vcm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFs
aXplVHVwbGUgPSBmdW5jdGlvbih0YXJnZXQsIHBhdGgpIHsKLSAgdmFyIGhhc1RoaXMgID0gSEFT
X1RISVMudGVzdChwYXRoKSwKLSAgICAgIGlzR2xvYmFsID0gIWhhc1RoaXMgJiYgSVNfR0xPQkFM
X1BBVEgudGVzdChwYXRoKSwKLSAgICAgIGtleTsKLQotICBpZiAoIXRhcmdldCB8fCBpc0dsb2Jh
bCkgdGFyZ2V0ID0gRW1iZXIubG9va3VwOwotICBpZiAoaGFzVGhpcykgcGF0aCA9IHBhdGguc2xp
Y2UoNSk7Ci0KLSAgaWYgKHRhcmdldCA9PT0gRW1iZXIubG9va3VwKSB7Ci0gICAga2V5ID0gcGF0
aC5tYXRjaChGSVJTVF9LRVkpWzBdOwotICAgIHRhcmdldCA9IGdldCh0YXJnZXQsIGtleSk7Ci0g
ICAgcGF0aCAgID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICB9Ci0KLSAgLy8gbXVzdCBy
ZXR1cm4gc29tZSBraW5kIG9mIHBhdGggdG8gYmUgdmFsaWQgZWxzZSBvdGhlciB0aGluZ3Mgd2ls
bCBicmVhay4KLSAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoPT09MCkgdGhyb3cgbmV3IEVtYmVy
LkVycm9yKCdJbnZhbGlkIFBhdGgnKTsKLQotICByZXR1cm4gWyB0YXJnZXQsIHBhdGggXTsKLX07
Ci0KLXZhciBnZXRQYXRoID0gRW1iZXIuX2dldFBhdGggPSBmdW5jdGlvbihyb290LCBwYXRoKSB7
Ci0gIHZhciBoYXNUaGlzLCBwYXJ0cywgdHVwbGUsIGlkeCwgbGVuOwotCi0gIC8vIElmIHRoZXJl
IGlzIG5vIHJvb3QgYW5kIHBhdGggaXMgYSBrZXkgbmFtZSwgcmV0dXJuIHRoYXQKLSAgLy8gcHJv
cGVydHkgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KLSAgLy8gRS5nLiBnZXQoJ0VtYmVyJykgLT4g
RW1iZXIKLSAgaWYgKHJvb3QgPT09IG51bGwgJiYgcGF0aC5pbmRleE9mKCcuJykgPT09IC0xKSB7
IHJldHVybiBnZXQoRW1iZXIubG9va3VwLCBwYXRoKTsgfQotCi0gIC8vIGRldGVjdCBjb21wbGlj
YXRlZCBwYXRocyBhbmQgbm9ybWFsaXplIHRoZW0KLSAgaGFzVGhpcyAgPSBIQVNfVEhJUy50ZXN0
KHBhdGgpOwotCi0gIGlmICghcm9vdCB8fCBoYXNUaGlzKSB7Ci0gICAgdHVwbGUgPSBub3JtYWxp
emVUdXBsZShyb290LCBwYXRoKTsKLSAgICByb290ID0gdHVwbGVbMF07Ci0gICAgcGF0aCA9IHR1
cGxlWzFdOwotICAgIHR1cGxlLmxlbmd0aCA9IDA7Ci0gIH0KLQotICBwYXJ0cyA9IHBhdGguc3Bs
aXQoIi4iKTsKLSAgbGVuID0gcGFydHMubGVuZ3RoOwotICBmb3IgKGlkeCA9IDA7IHJvb3QgIT0g
bnVsbCAmJiBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgcm9vdCA9IGdldChyb290LCBwYXJ0c1tp
ZHhdLCB0cnVlKTsKLSAgICBpZiAocm9vdCAmJiByb290LmlzRGVzdHJveWVkKSB7IHJldHVybiB1
bmRlZmluZWQ7IH0KLSAgfQotICByZXR1cm4gcm9vdDsKLX07Ci0KLUVtYmVyLmdldFdpdGhEZWZh
dWx0ID0gZnVuY3Rpb24ocm9vdCwga2V5LCBkZWZhdWx0VmFsdWUpIHsKLSAgdmFyIHZhbHVlID0g
Z2V0KHJvb3QsIGtleSk7Ci0KLSAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRl
ZmF1bHRWYWx1ZTsgfQotICByZXR1cm4gdmFsdWU7Ci19OwotCi0KLUVtYmVyLmdldCA9IGdldDsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAot
Ki8KLQotdmFyIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG1ldGFGb3IgPSBFbWJlci5t
ZXRhLAotICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgYV9zbGljZSA9IFtdLnNs
aWNlLAotICAgIC8qIGxpc3RlbmVyIGZsYWdzICovCi0gICAgT05DRSA9IDEsIFNVU1BFTkRFRCA9
IDI7Ci0KLS8qCi0gIFRoZSBldmVudCBzeXN0ZW0gdXNlcyBhIHNlcmllcyBvZiBuZXN0ZWQgaGFz
aGVzIHRvIHN0b3JlIGxpc3RlbmVycyBvbiBhbgotICBvYmplY3QuIFdoZW4gYSBsaXN0ZW5lciBp
cyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50IGFycml2ZXMsIHRoZXNlCi0gIGhhc2hlcyBh
cmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGljaCB0YXJnZXQgYW5kIGFjdGlvbiBwYWlyIHRv
IGludm9rZS4KLQotICBUaGUgaGFzaGVzIGFyZSBzdG9yZWQgaW4gdGhlIG9iamVjdCdzIG1ldGEg
aGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAvLyBPYmplY3QncyBtZXRhIGhhc2gK
LSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJzOiB7ICAgICAgIC8vIHZhcmlhYmxlIG5hbWU6IGBs
aXN0ZW5lclNldGAKLSAgICAgICAgICAiZm9vOmNoYW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5hbWU6
IGBhY3Rpb25zYAotICAgICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGZsYWdzCi0gICAgICAgICAg
XQotICAgICAgICB9Ci0gICAgICB9Ci0KLSovCi0KLWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHRh
cmdldCwgbWV0aG9kKSB7Ci0gIHZhciBpbmRleCA9IC0xOwotICBmb3IgKHZhciBpID0gMCwgbCA9
IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMykgewotICAgIGlmICh0YXJnZXQgPT09IGFycmF5
W2ldICYmIG1ldGhvZCA9PT0gYXJyYXlbaSsxXSkgeyBpbmRleCA9IGk7IGJyZWFrOyB9Ci0gIH0K
LSAgcmV0dXJuIGluZGV4OwotfQotCi1mdW5jdGlvbiBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1l
KSB7Ci0gIHZhciBtZXRhID0gbWV0YUZvcihvYmosIHRydWUpLAotICAgICAgYWN0aW9uczsKLQot
ICBpZiAoIW1ldGEubGlzdGVuZXJzKSB7IG1ldGEubGlzdGVuZXJzID0ge307IH0KLQotICBpZiAo
IW1ldGEuaGFzT3duUHJvcGVydHkoJ2xpc3RlbmVycycpKSB7Ci0gICAgLy8gc2V0dXAgaW5oZXJp
dGVkIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBvYmplY3QKLSAgICBtZXRhLmxpc3RlbmVycyA9IG9f
Y3JlYXRlKG1ldGEubGlzdGVuZXJzKTsKLSAgfQotCi0gIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVy
c1tldmVudE5hbWVdOwotCi0gIC8vIGlmIHRoZXJlIGFyZSBhY3Rpb25zLCBidXQgdGhlIGV2ZW50
TmFtZSBkb2Vzbid0IGV4aXN0IGluIG91ciBsaXN0ZW5lcnMsIHRoZW4gY29weSB0aGVtIGZyb20g
dGhlIHByb3RvdHlwZQotICBpZiAoYWN0aW9ucyAmJiAhbWV0YS5saXN0ZW5lcnMuaGFzT3duUHJv
cGVydHkoZXZlbnROYW1lKSkgewotICAgIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVyc1tldmVudE5h
bWVdID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXS5zbGljZSgpOwotICB9IGVsc2UgaWYgKCFh
Y3Rpb25zKSB7Ci0gICAgYWN0aW9ucyA9IG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTsK
LSAgfQotCi0gIHJldHVybiBhY3Rpb25zOwotfQotCi1mdW5jdGlvbiBhY3Rpb25zVW5pb24ob2Jq
LCBldmVudE5hbWUsIG90aGVyQWN0aW9ucykgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0s
Ci0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVy
c1tldmVudE5hbWVdOwotCi0gIGlmICghYWN0aW9ucykgeyByZXR1cm47IH0KLSAgZm9yICh2YXIg
aSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKLSAgICB2YXIgdGFyZ2V0
ID0gYWN0aW9uc1tpXSwKLSAgICAgICAgbWV0aG9kID0gYWN0aW9uc1tpKzFdLAotICAgICAgICBm
bGFncyA9IGFjdGlvbnNbaSsyXSwKLSAgICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKG90aGVy
QWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0gICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkg
ewotICAgICAgb3RoZXJBY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdzKTsKLSAgICB9
Ci0gIH0KLX0KLQotZnVuY3Rpb24gYWN0aW9uc0RpZmYob2JqLCBldmVudE5hbWUsIG90aGVyQWN0
aW9ucykgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCi0gICAgICBhY3Rpb25zID0gbWV0
YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdLAotICAgICAg
ZGlmZkFjdGlvbnMgPSBbXTsKLQotICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gIGZvciAo
dmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7Ci0gICAgdmFyIHRh
cmdldCA9IGFjdGlvbnNbaV0sCi0gICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaSsxXSwKLSAgICAg
ICAgZmxhZ3MgPSBhY3Rpb25zW2krMl0sCi0gICAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihv
dGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKLQotICAgIGlmIChhY3Rpb25JbmRleCAhPT0g
LTEpIHsgY29udGludWU7IH0KLQotICAgIG90aGVyQWN0aW9ucy5wdXNoKHRhcmdldCwgbWV0aG9k
LCBmbGFncyk7Ci0gICAgZGlmZkFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3MpOwot
ICB9Ci0KLSAgcmV0dXJuIGRpZmZBY3Rpb25zOwotfQotCi0vKioKLSAgQWRkIGFuIGV2ZW50IGxp
c3RlbmVyCi0KLSAgQG1ldGhvZCBhZGRMaXN0ZW5lcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBv
YmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBAcGFyYW0ge09iamVjdHxGdW5jdGlv
bn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFt
IHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVu
Y3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCi0gIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBB
IGZsYWcgd2hldGhlciBhIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCi0qLwot
ZnVuY3Rpb24gYWRkTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBvbmNl
KSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5k
IGV2ZW50IG5hbWUgdG8gRW1iZXIuYWRkTGlzdGVuZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7
Ci0KLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgewotICAg
IG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxsOwotICB9Ci0KLSAgdmFyIGFjdGlv
bnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgIGFjdGlvbkluZGV4ID0gaW5k
ZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCksCi0gICAgICBmbGFncyA9IDA7Ci0KLSAgaWYg
KG9uY2UpIGZsYWdzIHw9IE9OQ0U7Ci0KLSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgeyByZXR1
cm47IH0KLQotICBhY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdzKTsKLQotICBpZiAo
J2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRBZGRMaXN0ZW5lcikgewotICAgIG9iai5kaWRB
ZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKLSAgfQotfQotCi0vKioKLSAg
UmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyCi0KLSAgQXJndW1lbnRzIHNob3VsZCBtYXRjaCB0aG9z
ZSBwYXNzZWQgdG8gYEVtYmVyLmFkZExpc3RlbmVyYC4KLQotICBAbWV0aG9kIHJlbW92ZUxpc3Rl
bmVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30gZXZlbnRO
YW1lCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZCBBIHRhcmdldCBv
YmplY3Qgb3IgYSBmdW5jdGlvbgotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEg
ZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdl
dGAKLSovCi1mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihvYmosIGV2ZW50TmFtZSwgdGFyZ2V0LCBt
ZXRob2QpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGF0IGxlYXN0IGFuIG9iamVj
dCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5yZW1vdmVMaXN0ZW5lciIsICEhb2JqICYmICEhZXZl
bnROYW1lKTsKLQotICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0
KSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICBm
dW5jdGlvbiBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpIHsKLSAgICB2YXIgYWN0aW9u
cyA9IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpLAotICAgICAgICBhY3Rpb25JbmRleCA9IGlu
ZGV4T2YoYWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0gICAgLy8gYWN0aW9uIGRvZXNuJ3Qg
ZXhpc3QsIGdpdmUgdXAgc2lsZW50bHkKLSAgICBpZiAoYWN0aW9uSW5kZXggPT09IC0xKSB7IHJl
dHVybjsgfQotCi0gICAgYWN0aW9ucy5zcGxpY2UoYWN0aW9uSW5kZXgsIDMpOwotCi0gICAgaWYg
KCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkUmVtb3ZlTGlzdGVuZXIpIHsKLSAgICAgIG9i
ai5kaWRSZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKLSAgICB9Ci0g
IH0KLQotICBpZiAobWV0aG9kKSB7Ci0gICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9k
KTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCi0gICAgICAgIGFj
dGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFt
ZV07Ci0KLSAgICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gICAgZm9yICh2YXIgaSA9IGFj
dGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKLSAgICAgIF9yZW1vdmVMaXN0ZW5l
cihhY3Rpb25zW2ldLCBhY3Rpb25zW2krMV0pOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAgU3Vz
cGVuZCBsaXN0ZW5lciBkdXJpbmcgY2FsbGJhY2suCi0KLSAgVGhpcyBzaG91bGQgb25seSBiZSB1
c2VkIGJ5IHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCi0gIHdoZW4gaXQgaXMgdGFr
aW5nIGFuIGFjdGlvbiB0aGF0IHdvdWxkIGNhdXNlIHRoZSBldmVudCwgZS5nLgotICBhbiBvYmpl
Y3QgbWlnaHQgc3VzcGVuZCBpdHMgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHdoaWxlIGl0IGlz
Ci0gIHNldHRpbmcgdGhhdCBwcm9wZXJ0eS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1c3Bl
bmRMaXN0ZW5lcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0
YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1l
dGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9u
IGB0YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0qLwotZnVuY3Rpb24gc3Vz
cGVuZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsK
LSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgewotICAgIG1l
dGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxsOwotICB9Ci0KLSAgdmFyIGFjdGlvbnMg
PSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhP
ZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkg
ewotICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gfD0gU1VTUEVOREVEOyAvLyBtYXJrIHRoZSBh
Y3Rpb24gYXMgc3VzcGVuZGVkCi0gIH0KLQotICBmdW5jdGlvbiB0cnlhYmxlKCkgICB7IHJldHVy
biBjYWxsYmFjay5jYWxsKHRhcmdldCk7IH0KLSAgZnVuY3Rpb24gZmluYWxpemVyKCkgeyBpZiAo
YWN0aW9uSW5kZXggIT09IC0xKSB7IGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRF
RDsgfSB9Ci0KLSAgcmV0dXJuIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsK
LX0KLQotLyoqCi0gIFN1c3BlbmRzIG11bHRpcGxlIGxpc3RlbmVycyBkdXJpbmcgYSBjYWxsYmFj
ay4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1c3BlbmRMaXN0ZW5lcnMKLSAgQGZvciBFbWJl
cgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7QXJyYXl9IGV2ZW50TmFtZSBBcnJheSBvZiBldmVu
dCBuYW1lcwotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJn
ZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhv
ZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0
YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0qLwotZnVuY3Rpb24gc3VzcGVu
ZExpc3RlbmVycyhvYmosIGV2ZW50TmFtZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewot
ICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgbWV0
aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICB2YXIgc3VzcGVuZGVk
QWN0aW9ucyA9IFtdLAotICAgICAgYWN0aW9uc0xpc3QgPSBbXSwKLSAgICAgIGV2ZW50TmFtZSwg
YWN0aW9ucywgaSwgbDsKLQotICBmb3IgKGk9MCwgbD1ldmVudE5hbWVzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICBldmVudE5hbWUgPSBldmVudE5hbWVzW2ldOwotICAgIGFjdGlvbnMgPSBhY3Rp
b25zRm9yKG9iaiwgZXZlbnROYW1lKTsKLSAgICB2YXIgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFj
dGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKLQotICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsK
LSAgICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gfD0gU1VTUEVOREVEOwotICAgICAgc3VzcGVu
ZGVkQWN0aW9ucy5wdXNoKGFjdGlvbkluZGV4KTsKLSAgICAgIGFjdGlvbnNMaXN0LnB1c2goYWN0
aW9ucyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gdHJ5YWJsZSgpIHsgcmV0dXJuIGNhbGxi
YWNrLmNhbGwodGFyZ2V0KTsgfQotCi0gIGZ1bmN0aW9uIGZpbmFsaXplcigpIHsKLSAgICBmb3Ig
KHZhciBpID0gMCwgbCA9IHN1c3BlbmRlZEFjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0g
ICAgICB2YXIgYWN0aW9uSW5kZXggPSBzdXNwZW5kZWRBY3Rpb25zW2ldOwotICAgICAgYWN0aW9u
c0xpc3RbaV1bYWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRFRDsKLSAgICB9Ci0gIH0KLQotICBy
ZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6ZXIpOwotfQotCi0vKioKLSAg
UmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50bHkgd2F0Y2hlZCBldmVudHMKLQotICBAcHJpdmF0ZQot
ICBAbWV0aG9kIHdhdGNoZWRFdmVudHMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0qLwot
ZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsKLSAgdmFyIGxpc3RlbmVycyA9IG9ialtNRVRB
X0tFWV0ubGlzdGVuZXJzLCByZXQgPSBbXTsKLQotICBpZiAobGlzdGVuZXJzKSB7Ci0gICAgZm9y
KHZhciBldmVudE5hbWUgaW4gbGlzdGVuZXJzKSB7Ci0gICAgICBpZiAobGlzdGVuZXJzW2V2ZW50
TmFtZV0pIHsgcmV0LnB1c2goZXZlbnROYW1lKTsgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmV0
OwotfQotCi0vKioKLSAgU2VuZCBhbiBldmVudC4gVGhlIGV4ZWN1dGlvbiBvZiBzdXNwZW5kZWQg
bGlzdGVuZXJzCi0gIGlzIHNraXBwZWQsIGFuZCBvbmNlIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4g
QSBsaXN0ZW5lciB3aXRob3V0Ci0gIGEgdGFyZ2V0IGlzIGV4ZWN1dGVkIG9uIHRoZSBwYXNzZWQg
b2JqZWN0LiBJZiBhbiBhcnJheSBvZiBhY3Rpb25zCi0gIGlzIG5vdCBwYXNzZWQsIHRoZSBhY3Rp
b25zIHN0b3JlZCBvbiB0aGUgcGFzc2VkIG9iamVjdCBhcmUgaW52b2tlZC4KLQotICBAbWV0aG9k
IHNlbmRFdmVudAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQotICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBm
b3IgZWFjaCBsaXN0ZW5lci4KLSAgQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBPcHRpb25hbCBhcnJh
eSBvZiBhY3Rpb25zIChsaXN0ZW5lcnMpLgotICBAcmV0dXJuIHRydWUKLSovCi1mdW5jdGlvbiBz
ZW5kRXZlbnQob2JqLCBldmVudE5hbWUsIHBhcmFtcywgYWN0aW9ucykgewotICAvLyBmaXJzdCBn
aXZlIG9iamVjdCBhIGNoYW5jZSB0byBoYW5kbGUgaXQKLSAgaWYgKG9iaiAhPT0gRW1iZXIgJiYg
J2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZW5kRXZlbnQpIHsKLSAgICBvYmouc2VuZEV2ZW50
KGV2ZW50TmFtZSwgcGFyYW1zKTsKLSAgfQotCi0gIGlmICghYWN0aW9ucykgewotICAgIHZhciBt
ZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVy
cyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotICB9Ci0KLSAgaWYgKCFhY3Rpb25zKSB7
IHJldHVybjsgfQotCi0gIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsg
aSAtPSAzKSB7IC8vIGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKLSAgICB2
YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXSwgbWV0aG9kID0gYWN0aW9uc1tpKzFdLCBmbGFncyA9IGFj
dGlvbnNbaSsyXTsKLSAgICBpZiAoIW1ldGhvZCkgeyBjb250aW51ZTsgfQotICAgIGlmIChmbGFn
cyAmIFNVU1BFTkRFRCkgeyBjb250aW51ZTsgfQotICAgIGlmIChmbGFncyAmIE9OQ0UpIHsgcmVt
b3ZlTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsgfQotICAgIGlmICgh
dGFyZ2V0KSB7IHRhcmdldCA9IG9iajsgfQotICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1l
dGhvZCkgeyBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsgfQotICAgIGlmIChwYXJhbXMpIHsKLSAg
ICAgIG1ldGhvZC5hcHBseSh0YXJnZXQsIHBhcmFtcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1l
dGhvZC5jYWxsKHRhcmdldCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioK
LSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoYXNMaXN0ZW5lcnMKLSAgQGZvciBFbWJlcgotICBAcGFy
YW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKLSovCi1mdW5jdGlvbiBoYXNMaXN0
ZW5lcnMob2JqLCBldmVudE5hbWUpIHsKLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAotICAg
ICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0YS5saXN0ZW5lcnNbZXZl
bnROYW1lXTsKLQotICByZXR1cm4gISEoYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCk7Ci19Ci0K
LS8qKgotICBAcHJpdmF0ZQotICBAbWV0aG9kIGxpc3RlbmVyc0ZvcgotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotKi8KLWZ1bmN0aW9uIGxp
c3RlbmVyc0ZvcihvYmosIGV2ZW50TmFtZSkgewotICB2YXIgcmV0ID0gW107Ci0gIHZhciBtZXRh
ID0gb2JqW01FVEFfS0VZXSwKLSAgICAgIGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJz
ICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07Ci0KLSAgaWYgKCFhY3Rpb25zKSB7IHJldHVy
biByZXQ7IH0KLQotICBmb3IgKHZhciBpID0gMCwgbCA9IGFjdGlvbnMubGVuZ3RoOyBpIDwgbDsg
aSArPSAzKSB7Ci0gICAgdmFyIHRhcmdldCA9IGFjdGlvbnNbaV0sCi0gICAgICAgIG1ldGhvZCA9
IGFjdGlvbnNbaSsxXTsKLSAgICByZXQucHVzaChbdGFyZ2V0LCBtZXRob2RdKTsKLSAgfQotCi0g
IHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBEZWZpbmUgYSBwcm9wZXJ0eSBhcyBhIGZ1bmN0aW9u
IHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4KLSAgYSBzcGVjaWZpZWQgZXZlbnQgb3IgZXZl
bnRzIGFyZSB0cmlnZ2VyZWQuCi0KLQotICBgYGAgamF2YXNjcmlwdAotICB2YXIgSm9iID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbG9nQ29tcGxldGVkOiBFbWJlci5vbignY29tcGxldGVk
JywgZnVuY3Rpb24oKXsKLSAgICAgIGNvbnNvbGUubG9nKCdKb2IgY29tcGxldGVkIScpOwotICAg
IH0pCi0gIH0pOwotICB2YXIgam9iID0gSm9iLmNyZWF0ZSgpOwotICBFbWJlci5zZW5kRXZlbnQo
am9iLCAnY29tcGxldGVkJyk7IC8vIExvZ3MgIkpvYiBjb21wbGV0ZWQhIgotIGBgYAotCi0gIEBt
ZXRob2Qgb24KLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lcyoKLSAg
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0dXJuIGZ1bmMKLSovCi1FbWJlci5vbiA9IGZ1
bmN0aW9uKCl7Ci0gIHZhciBmdW5jID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAot
ICAgICAgZXZlbnRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpOwotICBmdW5jLl9f
ZW1iZXJfbGlzdGVuc19fID0gZXZlbnRzOwotICByZXR1cm4gZnVuYzsKLX07Ci0KLUVtYmVyLmFk
ZExpc3RlbmVyID0gYWRkTGlzdGVuZXI7Ci1FbWJlci5yZW1vdmVMaXN0ZW5lciA9IHJlbW92ZUxp
c3RlbmVyOwotRW1iZXIuX3N1c3BlbmRMaXN0ZW5lciA9IHN1c3BlbmRMaXN0ZW5lcjsKLUVtYmVy
Ll9zdXNwZW5kTGlzdGVuZXJzID0gc3VzcGVuZExpc3RlbmVyczsKLUVtYmVyLnNlbmRFdmVudCA9
IHNlbmRFdmVudDsKLUVtYmVyLmhhc0xpc3RlbmVycyA9IGhhc0xpc3RlbmVyczsKLUVtYmVyLndh
dGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRzOwotRW1iZXIubGlzdGVuZXJzRm9yID0gbGlzdGVu
ZXJzRm9yOwotRW1iZXIubGlzdGVuZXJzRGlmZiA9IGFjdGlvbnNEaWZmOwotRW1iZXIubGlzdGVu
ZXJzVW5pb24gPSBhY3Rpb25zVW5pb247Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12
YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2
ZW50OwotCi0vKgotICB0aGlzLm9ic2VydmVyU2V0ID0gewotICAgIFtzZW5kZXJHdWlkXTogeyAv
LyB2YXJpYWJsZSBuYW1lOiBga2V5U2V0YAotICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKLSAg
ICB9Ci0gIH0sCi0gIHRoaXMub2JzZXJ2ZXJzID0gWwotICAgIHsKLSAgICAgIHNlbmRlcjogb2Jq
LAotICAgICAga2V5TmFtZToga2V5TmFtZSwKLSAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAot
ICAgICAgbGlzdGVuZXJzOiBbCi0gICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgZmxhZ3NdCi0gICAg
ICBdCi0gICAgfSwKLSAgICAuLi4KLSAgXQotKi8KLXZhciBPYnNlcnZlclNldCA9IEVtYmVyLl9P
YnNlcnZlclNldCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmNsZWFyKCk7Ci19OwotCi1PYnNlcnZl
clNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oc2VuZGVyLCBrZXlOYW1lLCBldmVudE5hbWUp
IHsKLSAgdmFyIG9ic2VydmVyU2V0ID0gdGhpcy5vYnNlcnZlclNldCwKLSAgICAgIG9ic2VydmVy
cyA9IHRoaXMub2JzZXJ2ZXJzLAotICAgICAgc2VuZGVyR3VpZCA9IGd1aWRGb3Ioc2VuZGVyKSwK
LSAgICAgIGtleVNldCA9IG9ic2VydmVyU2V0W3NlbmRlckd1aWRdLAotICAgICAgaW5kZXg7Ci0K
LSAgaWYgKCFrZXlTZXQpIHsKLSAgICBvYnNlcnZlclNldFtzZW5kZXJHdWlkXSA9IGtleVNldCA9
IHt9OwotICB9Ci0gIGluZGV4ID0ga2V5U2V0W2tleU5hbWVdOwotICBpZiAoaW5kZXggPT09IHVu
ZGVmaW5lZCkgewotICAgIGluZGV4ID0gb2JzZXJ2ZXJzLnB1c2goewotICAgICAgc2VuZGVyOiBz
ZW5kZXIsCi0gICAgICBrZXlOYW1lOiBrZXlOYW1lLAotICAgICAgZXZlbnROYW1lOiBldmVudE5h
bWUsCi0gICAgICBsaXN0ZW5lcnM6IFtdCi0gICAgfSkgLSAxOwotICAgIGtleVNldFtrZXlOYW1l
XSA9IGluZGV4OwotICB9Ci0gIHJldHVybiBvYnNlcnZlcnNbaW5kZXhdLmxpc3RlbmVyczsKLX07
Ci0KLU9ic2VydmVyU2V0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICB2YXIgb2Jz
ZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMsIGksIGxlbiwgb2JzZXJ2ZXIsIHNlbmRlcjsKLSAgdGhp
cy5jbGVhcigpOwotICBmb3IgKGk9MCwgbGVuPW9ic2VydmVycy5sZW5ndGg7IGkgPCBsZW47ICsr
aSkgewotICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJzW2ldOwotICAgIHNlbmRlciA9IG9ic2VydmVy
LnNlbmRlcjsKLSAgICBpZiAoc2VuZGVyLmlzRGVzdHJveWluZyB8fCBzZW5kZXIuaXNEZXN0cm95
ZWQpIHsgY29udGludWU7IH0KLSAgICBzZW5kRXZlbnQoc2VuZGVyLCBvYnNlcnZlci5ldmVudE5h
bWUsIFtzZW5kZXIsIG9ic2VydmVyLmtleU5hbWVdLCBvYnNlcnZlci5saXN0ZW5lcnMpOwotICB9
Ci19OwotCi1PYnNlcnZlclNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKLSAgdGhp
cy5vYnNlcnZlclNldCA9IHt9OwotICB0aGlzLm9ic2VydmVycyA9IFtdOwotfTsKLX0pKCk7Ci0K
LQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgZ3VpZEZv
ciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgdHJ5RmluYWxseSA9IEVtYmVyLnRyeUZpbmFsbHksCi0g
ICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50LAotICAgIGxpc3RlbmVyc1VuaW9uID0gRW1i
ZXIubGlzdGVuZXJzVW5pb24sCi0gICAgbGlzdGVuZXJzRGlmZiA9IEVtYmVyLmxpc3RlbmVyc0Rp
ZmYsCi0gICAgT2JzZXJ2ZXJTZXQgPSBFbWJlci5fT2JzZXJ2ZXJTZXQsCi0gICAgYmVmb3JlT2Jz
ZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2ZXJTZXQoKSwKLSAgICBvYnNlcnZlclNldCA9IG5ldyBPYnNl
cnZlclNldCgpLAotICAgIGRlZmVycmVkID0gMDsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gUFJPUEVSVFkgQ0hBTkdF
UwotLy8KLQotLyoqCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGFuIG9i
amVjdCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UuCi0gIEl0IHdpbGwgbm90aWZ5IGFueSBi
ZWZvcmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJlIGNhY2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCi0K
LSAgTm9ybWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3Rs
eSBidXQgaWYgZm9yIHNvbWUKLSAgcmVhc29uIHlvdSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHBy
b3BlcnR5IHlvdSBjYW4gaW52b2tlIHRoaXMgbWV0aG9kCi0gIG1hbnVhbGx5IGFsb25nIHdpdGgg
YEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKClgIHdoaWNoIHlvdSBzaG91bGQgY2FsbCBqdXN0Ci0g
IGFmdGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzLgotCi0gIEBtZXRob2QgcHJvcGVydHlX
aWxsQ2hhbmdlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0
IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtl
eU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJl
dHVybiB7dm9pZH0KLSovCi1mdW5jdGlvbiBwcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1l
KSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmosIGZhbHNlKSwKLSAgICAgIHdhdGNoaW5nID0gbS53
YXRjaGluZ1trZXlOYW1lXSA+IDAgfHwga2V5TmFtZSA9PT0gJ2xlbmd0aCcsCi0gICAgICBwcm90
byA9IG0ucHJvdG8sCi0gICAgICBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsKLQotICBpZiAoIXdh
dGNoaW5nKSB7IHJldHVybjsgfQotICBpZiAocHJvdG8gPT09IG9iaikgeyByZXR1cm47IH0KLSAg
aWYgKGRlc2MgJiYgZGVzYy53aWxsQ2hhbmdlKSB7IGRlc2Mud2lsbENoYW5nZShvYmosIGtleU5h
bWUpOyB9Ci0gIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7Ci0gIGNo
YWluc1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKLSAgbm90aWZ5QmVmb3JlT2JzZXJ2ZXJz
KG9iaiwga2V5TmFtZSk7Ci19Ci1FbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UgPSBwcm9wZXJ0eVdp
bGxDaGFuZ2U7Ci0KLS8qKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFu
IG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAgSXQgd2lsbCBub3RpZnkgYW55IG9ic2Vy
dmVycyBhbmQgY2xlYXIgY2FjaGVzIGFtb25nIG90aGVyIHRoaW5ncy4KLQotICBOb3JtYWxseSB5
b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Ig
c29tZQotICByZWFzb24geW91IGNhbid0IGRpcmVjdGx5IHdhdGNoIGEgcHJvcGVydHkgeW91IGNh
biBpbnZva2UgdGhpcyBtZXRob2QKLSAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVy
dHlXaWxsQ2hhbmdlKClgIHdoaWNoIHlvdSBzaG91bGQgY2FsbCBqdXN0Ci0gIGJlZm9yZSB0aGUg
cHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KLQotICBAbWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdlCi0g
IEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHBy
b3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHBy
b3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJldHVybiB7dm9pZH0K
LSovCi1mdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpIHsKLSAgdmFyIG0g
PSBtZXRhRm9yKG9iaiwgZmFsc2UpLAotICAgICAgd2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tleU5h
bWVdID4gMCB8fCBrZXlOYW1lID09PSAnbGVuZ3RoJywKLSAgICAgIHByb3RvID0gbS5wcm90bywK
LSAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOwotCi0gIGlmIChwcm90byA9PT0gb2JqKSB7
IHJldHVybjsgfQotCi0gIC8vIHNob3VsZG4ndCB0aGlzIG1lYW4gdGhhdCB3ZSdyZSB3YXRjaGlu
ZyB0aGlzIGtleT8KLSAgaWYgKGRlc2MgJiYgZGVzYy5kaWRDaGFuZ2UpIHsgZGVzYy5kaWRDaGFu
Z2Uob2JqLCBrZXlOYW1lKTsgfQotICBpZiAoIXdhdGNoaW5nICYmIGtleU5hbWUgIT09ICdsZW5n
dGgnKSB7IHJldHVybjsgfQotCi0gIGRlcGVuZGVudEtleXNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1l
LCBtKTsKLSAgY2hhaW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSwgZmFsc2UpOwotICBub3Rp
ZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKLX0KLUVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlID0g
cHJvcGVydHlEaWRDaGFuZ2U7Ci0KLXZhciBXSUxMX1NFRU4sIERJRF9TRUVOOwotCi0vLyBjYWxs
ZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNh
Y2hlIG9mIGFueSBkZXBlbmRlbnQga2V5cyAoYW5kIG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9m
IGNoYW5nZXMsIGV0Yy4uLikKLWZ1bmN0aW9uIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwg
ZGVwS2V5LCBtZXRhKSB7Ci0gIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQotCi0g
IHZhciBzZWVuID0gV0lMTF9TRUVOLCB0b3AgPSAhc2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0g
V0lMTF9TRUVOID0ge307IH0KLSAgaXRlckRlcHMocHJvcGVydHlXaWxsQ2hhbmdlLCBvYmosIGRl
cEtleSwgc2VlbiwgbWV0YSk7Ci0gIGlmICh0b3ApIHsgV0lMTF9TRUVOID0gbnVsbDsgfQotfQot
Ci0vLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBoYXMganVzdCBjaGFuZ2VkIHRvIHVwZGF0
ZSBkZXBlbmRlbnQga2V5cwotZnVuY3Rpb24gZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRl
cEtleSwgbWV0YSkgewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICB2
YXIgc2VlbiA9IERJRF9TRUVOLCB0b3AgPSAhc2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0gRElE
X1NFRU4gPSB7fTsgfQotICBpdGVyRGVwcyhwcm9wZXJ0eURpZENoYW5nZSwgb2JqLCBkZXBLZXks
IHNlZW4sIG1ldGEpOwotICBpZiAodG9wKSB7IERJRF9TRUVOID0gbnVsbDsgfQotfQotCi1mdW5j
dGlvbiBpdGVyRGVwcyhtZXRob2QsIG9iaiwgZGVwS2V5LCBzZWVuLCBtZXRhKSB7Ci0gIHZhciBn
dWlkID0gZ3VpZEZvcihvYmopOwotICBpZiAoIXNlZW5bZ3VpZF0pIHNlZW5bZ3VpZF0gPSB7fTsK
LSAgaWYgKHNlZW5bZ3VpZF1bZGVwS2V5XSkgcmV0dXJuOwotICBzZWVuW2d1aWRdW2RlcEtleV0g
PSB0cnVlOwotCi0gIHZhciBkZXBzID0gbWV0YS5kZXBzOwotICBkZXBzID0gZGVwcyAmJiBkZXBz
W2RlcEtleV07Ci0gIGlmIChkZXBzKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gZGVwcykgewotICAg
ICAgdmFyIGRlc2MgPSBtZXRhLmRlc2NzW2tleV07Ci0gICAgICBpZiAoZGVzYyAmJiBkZXNjLl9z
dXNwZW5kZWQgPT09IG9iaikgY29udGludWU7Ci0gICAgICBtZXRob2Qob2JqLCBrZXkpOwotICAg
IH0KLSAgfQotfQotCi1mdW5jdGlvbiBjaGFpbnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSkg
ewotICBpZiAoIShtLmhhc093blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYKLSAgICAgICAg
bS5jaGFpbldhdGNoZXJzW2tleU5hbWVdKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBu
b2RlcyA9IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1lXSwKLSAgICAgIGV2ZW50cyA9IFtdLAotICAg
ICAgaSwgbDsKLQotICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
LSAgICBub2Rlc1tpXS53aWxsQ2hhbmdlKGV2ZW50cyk7Ci0gIH0KLQotICBmb3IgKGkgPSAwLCBs
ID0gZXZlbnRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewotICAgIHByb3BlcnR5V2lsbENoYW5n
ZShldmVudHNbaV0sIGV2ZW50c1tpKzFdKTsKLSAgfQotfQotCi1mdW5jdGlvbiBjaGFpbnNEaWRD
aGFuZ2Uob2JqLCBrZXlOYW1lLCBtLCBzdXBwcmVzc0V2ZW50cykgewotICBpZiAoIShtLmhhc093
blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYKLSAgICAgICAgbS5jaGFpbldhdGNoZXJzW2tl
eU5hbWVdKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRj
aGVyc1trZXlOYW1lXSwKLSAgICAgIGV2ZW50cyA9IHN1cHByZXNzRXZlbnRzID8gbnVsbCA6IFtd
LAotICAgICAgaSwgbDsKLQotICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBp
KyspIHsKLSAgICBub2Rlc1tpXS5kaWRDaGFuZ2UoZXZlbnRzKTsKLSAgfQotCi0gIGlmIChzdXBw
cmVzc0V2ZW50cykgewotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoaSA9IDAsIGwgPSBldmVu
dHMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Ci0gICAgcHJvcGVydHlEaWRDaGFuZ2UoZXZlbnRz
W2ldLCBldmVudHNbaSsxXSk7Ci0gIH0KLX0KLQotRW1iZXIub3ZlcnJpZGVDaGFpbnMgPSBmdW5j
dGlvbihvYmosIGtleU5hbWUsIG0pIHsKLSAgY2hhaW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwg
bSwgdHJ1ZSk7Ci19OwotCi0vKioKLSAgQG1ldGhvZCBiZWdpblByb3BlcnR5Q2hhbmdlcwotICBA
Y2hhaW5hYmxlCi0gIEBwcml2YXRlCi0qLwotZnVuY3Rpb24gYmVnaW5Qcm9wZXJ0eUNoYW5nZXMo
KSB7Ci0gIGRlZmVycmVkKys7Ci19Ci0KLUVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVn
aW5Qcm9wZXJ0eUNoYW5nZXM7Ci0KLS8qKgotICBAbWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcwot
ICBAcHJpdmF0ZQotKi8KLWZ1bmN0aW9uIGVuZFByb3BlcnR5Q2hhbmdlcygpIHsKLSAgZGVmZXJy
ZWQtLTsKLSAgaWYgKGRlZmVycmVkPD0wKSB7Ci0gICAgYmVmb3JlT2JzZXJ2ZXJTZXQuY2xlYXIo
KTsKLSAgICBvYnNlcnZlclNldC5mbHVzaCgpOwotICB9Ci19Ci0KLUVtYmVyLmVuZFByb3BlcnR5
Q2hhbmdlcyA9IGVuZFByb3BlcnR5Q2hhbmdlczsKLQotLyoqCi0gIE1ha2UgYSBzZXJpZXMgb2Yg
cHJvcGVydHkgY2hhbmdlcyB0b2dldGhlciBpbiBhbgotICBleGNlcHRpb24tc2FmZSB3YXkuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgewot
ICAgIG9iajEuc2V0KCdmb28nLCBtYXlCbG93VXBXaGVuU2V0KTsKLSAgICBvYmoyLnNldCgnYmFy
JywgYmF6KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRob2QgY2hhbmdlUHJvcGVydGllcwotICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBAcGFyYW0gW2JpbmRpbmddCi0qLwotRW1iZXIu
Y2hhbmdlUHJvcGVydGllcyA9IGZ1bmN0aW9uKGNiLCBiaW5kaW5nKSB7Ci0gIGJlZ2luUHJvcGVy
dHlDaGFuZ2VzKCk7Ci0gIHRyeUZpbmFsbHkoY2IsIGVuZFByb3BlcnR5Q2hhbmdlcywgYmluZGlu
Zyk7Ci19OwotCi1mdW5jdGlvbiBub3RpZnlCZWZvcmVPYnNlcnZlcnMob2JqLCBrZXlOYW1lKSB7
Ci0gIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQotCi0gIHZhciBldmVudE5hbWUg
PSBrZXlOYW1lICsgJzpiZWZvcmUnLCBsaXN0ZW5lcnMsIGRpZmY7Ci0gIGlmIChkZWZlcnJlZCkg
ewotICAgIGxpc3RlbmVycyA9IGJlZm9yZU9ic2VydmVyU2V0LmFkZChvYmosIGtleU5hbWUsIGV2
ZW50TmFtZSk7Ci0gICAgZGlmZiA9IGxpc3RlbmVyc0RpZmYob2JqLCBldmVudE5hbWUsIGxpc3Rl
bmVycyk7Ci0gICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlOYW1lXSwgZGlm
Zik7Ci0gIH0gZWxzZSB7Ci0gICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlO
YW1lXSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSkg
ewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICB2YXIgZXZlbnROYW1l
ID0ga2V5TmFtZSArICc6Y2hhbmdlJywgbGlzdGVuZXJzOwotICBpZiAoZGVmZXJyZWQpIHsKLSAg
ICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNldC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOwot
ICAgIGxpc3RlbmVyc1VuaW9uKG9iaiwgZXZlbnROYW1lLCBsaXN0ZW5lcnMpOwotICB9IGVsc2Ug
ewotICAgIHNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFtZV0pOwotICB9Ci19
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vLyBNRVRBX0tFWQotLy8gX2dldFBhdGgK
LS8vIHByb3BlcnR5V2lsbENoYW5nZSwgcHJvcGVydHlEaWRDaGFuZ2UKLQotdmFyIE1FVEFfS0VZ
ID0gRW1iZXIuTUVUQV9LRVksCi0gICAgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5E
QVRPUllfU0VUVEVSLAotICAgIElTX0dMT0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS8s
Ci0gICAgZ2V0UGF0aCA9IEVtYmVyLl9nZXRQYXRoOwotCi0vKioKLSAgU2V0cyB0aGUgdmFsdWUg
b2YgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QsIHJlc3BlY3RpbmcgY29tcHV0ZWQgcHJvcGVydGll
cwotICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBhbmQgb3RoZXIgbGlzdGVuZXJzIG9mIHRoZSBj
aGFuZ2UuIElmIHRoZQotICBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBidXQgdGhlIG9iamVjdCBp
bXBsZW1lbnRzIHRoZSBgc2V0VW5rbm93blByb3BlcnR5YAotICBtZXRob2QgdGhlbiB0aGF0IHdp
bGwgYmUgaW52b2tlZCBhcyB3ZWxsLgotCi0gIElmIHlvdSBwbGFuIHRvIHJ1biBvbiBJRTggYW5k
IG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcwotICBtZXRob2QgYW55dGlt
ZSB5b3Ugd2FudCB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QgdGhhdCB5b3UgZG9uJ3QK
LSAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRlLiAoUHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBh
biB1bmRlcnNjb3JlICdfJwotICBhcmUgY29uc2lkZXJlZCBwcml2YXRlLikKLQotICBPbiBhbGwg
bmV3ZXIgYnJvd3NlcnMsIHlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgbWV0aG9kIHRvIHNldAot
ICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBtaWdodCBub3QgYmUgZGVmaW5lZCBvbiB0aGUg
b2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNwZWN0IHRoZSBgc2V0VW5rbm93blByb3BlcnR5
YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAg
QG1ldGhvZCBzZXQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmpl
Y3QgdG8gbW9kaWZ5LgotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5
IHRvIHNldAotICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICBAcmV0
dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgdmFsdWUuCi0qLwotdmFyIHNldCA9IGZ1bmN0aW9uIHNl
dChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFudCkgewotICBpZiAodHlwZW9mIG9iaiA9PT0g
J3N0cmluZycpIHsKLSAgICBFbWJlci5hc3NlcnQoIlBhdGggJyIgKyBvYmogKyAiJyBtdXN0IGJl
IGdsb2JhbCBpZiBubyBvYmogaXMgZ2l2ZW4uIiwgSVNfR0xPQkFMLnRlc3Qob2JqKSk7Ci0gICAg
dmFsdWUgPSBrZXlOYW1lOwotICAgIGtleU5hbWUgPSBvYmo7Ci0gICAgb2JqID0gbnVsbDsKLSAg
fQotCi0gIEVtYmVyLmFzc2VydCgiQ2Fubm90IGNhbGwgc2V0IHdpdGggIisga2V5TmFtZSArIiBr
ZXkuIiwgISFrZXlOYW1lKTsKLQotICBpZiAoIW9iaiB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAh
PT0gLTEpIHsKLSAgICByZXR1cm4gc2V0UGF0aChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFu
dCk7Ci0gIH0KLQotICBFbWJlci5hc3NlcnQoIllvdSBuZWVkIHRvIHByb3ZpZGUgYW4gb2JqZWN0
IGFuZCBrZXkgdG8gYHNldGAuIiwgISFvYmogJiYga2V5TmFtZSAhPT0gdW5kZWZpbmVkKTsKLSAg
RW1iZXIuYXNzZXJ0KCdjYWxsaW5nIHNldCBvbiBkZXN0cm95ZWQgb2JqZWN0JywgIW9iai5pc0Rl
c3Ryb3llZCk7Ci0KLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLCBkZXNjID0gbWV0YSAmJiBt
ZXRhLmRlc2NzW2tleU5hbWVdLAotICAgICAgaXNVbmtub3duLCBjdXJyZW50VmFsdWU7Ci0gIGlm
IChkZXNjKSB7Ci0gICAgZGVzYy5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7
Ci0gICAgaXNVbmtub3duID0gJ29iamVjdCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGlu
IG9iaik7Ci0KLSAgICAvLyBzZXRVbmtub3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlz
IGFuIG9iamVjdCwKLSAgICAvLyB0aGUgcHJvcGVydHkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwg
YW5kIHRoZQotICAgIC8vIGBzZXRVbmtub3duUHJvcGVydHlgIG1ldGhvZCBleGlzdHMgb24gdGhl
IG9iamVjdAotICAgIGlmIChpc1Vua25vd24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5z
ZXRVbmtub3duUHJvcGVydHkpIHsKLSAgICAgIG9iai5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFt
ZSwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAobWV0YSAmJiBtZXRhLndhdGNoaW5nW2tleU5hbWVd
ID4gMCkgewotICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgY3VycmVudFZh
bHVlID0gbWV0YS52YWx1ZXNba2V5TmFtZV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJy
ZW50VmFsdWUgPSBvYmpba2V5TmFtZV07Ci0gICAgICB9Ci0gICAgICAvLyBvbmx5IHRyaWdnZXIg
YSBjaGFuZ2UgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkCi0gICAgICBpZiAodmFsdWUgIT09IGN1
cnJlbnRWYWx1ZSkgewotICAgICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlO
YW1lKTsKLSAgICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgICBpZiAoKGN1
cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5TmFtZSBpbiBvYmopKSB8fCAhb2JqLnBy
b3BlcnR5SXNFbnVtZXJhYmxlKGtleU5hbWUpKSB7Ci0gICAgICAgICAgICBFbWJlci5kZWZpbmVQ
cm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIHZhbHVlKTsgLy8gc2V0dXAgbWFuZGF0b3J5IHNl
dHRlcgotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRhLnZhbHVlc1trZXlOYW1l
XSA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvYmpb
a2V5TmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBFbWJlci5wcm9wZXJ0eURpZENo
YW5nZShvYmosIGtleU5hbWUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBvYmpba2V5
TmFtZV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfTsKLQotLy8gQ3Vy
cmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRlc3RzCi1pZiAoRW1iZXIuY29uZmlnLm92
ZXJyaWRlQWNjZXNzb3JzKSB7Ci0gIEVtYmVyLnNldCA9IHNldDsKLSAgRW1iZXIuY29uZmlnLm92
ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIHNldCA9IEVtYmVyLnNldDsKLX0KLQotZnVuY3Rpb24gc2V0
UGF0aChyb290LCBwYXRoLCB2YWx1ZSwgdG9sZXJhbnQpIHsKLSAgdmFyIGtleU5hbWU7Ci0KLSAg
Ly8gZ2V0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHBhdGgKLSAga2V5TmFtZSA9IHBhdGguc2xpY2Uo
cGF0aC5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0KLSAgLy8gZ2V0IHRoZSBmaXJzdCBwYXJ0IG9m
IHRoZSBwYXJ0Ci0gIHBhdGggICAgPSAocGF0aCA9PT0ga2V5TmFtZSkgPyBrZXlOYW1lIDogcGF0
aC5zbGljZSgwLCBwYXRoLmxlbmd0aC0oa2V5TmFtZS5sZW5ndGgrMSkpOwotCi0gIC8vIHVubGVz
cyB0aGUgcGF0aCBpcyB0aGlzLCBsb29rIHVwIHRoZSBmaXJzdCBwYXJ0IHRvCi0gIC8vIGdldCB0
aGUgcm9vdAotICBpZiAocGF0aCAhPT0gJ3RoaXMnKSB7Ci0gICAgcm9vdCA9IGdldFBhdGgocm9v
dCwgcGF0aCk7Ci0gIH0KLQotICBpZiAoIWtleU5hbWUgfHwga2V5TmFtZS5sZW5ndGggPT09IDAp
IHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1Byb3BlcnR5IHNldCBmYWlsZWQ6IFlvdSBw
YXNzZWQgYW4gZW1wdHkgcGF0aCcpOwotICB9Ci0KLSAgaWYgKCFyb290KSB7Ci0gICAgaWYgKHRv
bGVyYW50KSB7IHJldHVybjsgfQotICAgIGVsc2UgeyB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1By
b3BlcnR5IHNldCBmYWlsZWQ6IG9iamVjdCBpbiBwYXRoICInK3BhdGgrJyIgY291bGQgbm90IGJl
IGZvdW5kIG9yIHdhcyBkZXN0cm95ZWQuJyk7IH0KLSAgfQotCi0gIHJldHVybiBzZXQocm9vdCwg
a2V5TmFtZSwgdmFsdWUpOwotfQotCi1FbWJlci5zZXQgPSBzZXQ7Ci0KLS8qKgotICBFcnJvci10
b2xlcmFudCBmb3JtIG9mIGBFbWJlci5zZXRgLiBXaWxsIG5vdCBibG93IHVwIGlmIGFueSBwYXJ0
IG9mIHRoZQotICBjaGFpbiBpcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBvciBkZXN0cm95ZWQuCi0K
LSAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1h
eSB0cnkgdG8gdXBkYXRlIGFmdGVyCi0gIGFuIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCi0K
LSAgQG1ldGhvZCB0cnlTZXQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRo
ZSBvYmplY3QgdG8gbW9kaWZ5LgotICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkg
cGF0aCB0byBzZXQKLSAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSov
Ci1FbWJlci50cnlTZXQgPSBmdW5jdGlvbihyb290LCBwYXRoLCB2YWx1ZSkgewotICByZXR1cm4g
c2V0KHJvb3QsIHBhdGgsIHZhbHVlLCB0cnVlKTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLS8qCi0gIEphdmFTY3JpcHQg
KGJlZm9yZSBFUzYpIGRvZXMgbm90IGhhdmUgYSBNYXAgaW1wbGVtZW50YXRpb24uIE9iamVjdHMs
Ci0gIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGFzIGRpY3Rpb25hcmllcywgbWF5IG9ubHkgaGF2ZSBT
dHJpbmdzIGFzIGtleXMuCi0KLSAgQmVjYXVzZSBFbWJlciBoYXMgYSB3YXkgdG8gZ2V0IGEgdW5p
cXVlIGlkZW50aWZpZXIgZm9yIGV2ZXJ5IG9iamVjdAotICB2aWEgYEVtYmVyLmd1aWRGb3JgLCB3
ZSBjYW4gaW1wbGVtZW50IGEgcGVyZm9ybWFudCBNYXAgd2l0aCBhcmJpdHJhcnkKLSAga2V5cy4g
QmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIGluIGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFw
IGlzCi0gIGltcGxlbWVudGVkIGFzIGEgcHVyZSBKYXZhU2NyaXB0IG9iamVjdCBmb3IgcGVyZm9y
bWFuY2UuCi0KLSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJh
dGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgotICBtYXBzIChodHRwOi8vd2lraS5lY21hc2Ny
aXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnNpbXBsZV9tYXBzX2FuZF9zZXRzKSwKLSAgd2l0
aCB0d28gZXhjZXB0aW9ucy4gRmlyc3QsIGJlY2F1c2Ugd2UgbmVlZCBvdXIgaW1wbGVtZW50YXRp
b24gdG8gYmUgcGxlYXNhbnQKLSAgb24gb2xkZXIgYnJvd3NlcnMsIHdlIGRvIG5vdCB1c2UgdGhl
IGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVgIGluc3RlYWQpLgotICBTZWNvbmQsIGFzIHdl
IGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4tVk0gaXRlcmF0aW9uLCB3ZSBpbXBsZW1lbnQg
YQotICBmb3JFYWNoIG1ldGhvZCBmb3IgaXRlcmF0aW9uLgotCi0gIE1hcCBpcyBtb2NrZWQgb3V0
IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3QsIHNvIHlvdSBjYW4gZG8KLSAgYEVtYmVyLk1h
cC5jcmVhdGUoKWAgZm9yIHN5bW1ldHJ5IHdpdGggb3RoZXIgRW1iZXIgY2xhc3Nlcy4KLSovCi12
YXIgc2V0ID0gRW1iZXIuc2V0LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAgIGlu
ZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotCi12YXIgY29weSA9IGZ1bmN0
aW9uKG9iaikgewotICB2YXIgb3V0cHV0ID0ge307Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBvYmop
IHsKLSAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7IG91dHB1dFtwcm9wXSA9IG9i
altwcm9wXTsgfQotICB9Ci0KLSAgcmV0dXJuIG91dHB1dDsKLX07Ci0KLXZhciBjb3B5TWFwID0g
ZnVuY3Rpb24ob3JpZ2luYWwsIG5ld09iamVjdCkgewotICB2YXIga2V5cyA9IG9yaWdpbmFsLmtl
eXMuY29weSgpLAotICAgICAgdmFsdWVzID0gY29weShvcmlnaW5hbC52YWx1ZXMpOwotCi0gIG5l
d09iamVjdC5rZXlzID0ga2V5czsKLSAgbmV3T2JqZWN0LnZhbHVlcyA9IHZhbHVlczsKLSAgbmV3
T2JqZWN0Lmxlbmd0aCA9IG9yaWdpbmFsLmxlbmd0aDsKLQotICByZXR1cm4gbmV3T2JqZWN0Owot
fTsKLQotLyoqCi0gIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEVtYmVyIGFuZCBF
bWJlciBEYXRhLgotICBQbGVhc2UgZG8gbm90IHVzZSBpdCBhdCB0aGlzIHRpbWUuIFdlIHBsYW4g
dG8gY2xlYW4gaXQgdXAKLSAgYW5kIGFkZCBtYW55IHRlc3RzIHNvb24uCi0KLSAgQGNsYXNzIE9y
ZGVyZWRTZXQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAY29uc3RydWN0b3IKLSAgQHByaXZhdGUK
LSovCi12YXIgT3JkZXJlZFNldCA9IEVtYmVyLk9yZGVyZWRTZXQgPSBmdW5jdGlvbigpIHsKLSAg
dGhpcy5jbGVhcigpOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY3JlYXRlCi0gIEBzdGF0aWMKLSAg
QHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSovCi1PcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0
aW9uKCkgewotICByZXR1cm4gbmV3IE9yZGVyZWRTZXQoKTsKLX07Ci0KLQotT3JkZXJlZFNldC5w
cm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIEBtZXRob2QgY2xlYXIKLSAgKi8KLSAgY2xlYXI6IGZ1
bmN0aW9uKCkgewotICAgIHRoaXMucHJlc2VuY2VTZXQgPSB7fTsKLSAgICB0aGlzLmxpc3QgPSBb
XTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGFkZAotICAgIEBwYXJhbSBvYmoKLSAgKi8K
LSAgYWRkOiBmdW5jdGlvbihvYmopIHsKLSAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAg
ICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0LAotICAgICAgICBsaXN0ID0gdGhp
cy5saXN0OwotCi0gICAgaWYgKGd1aWQgaW4gcHJlc2VuY2VTZXQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICBwcmVzZW5jZVNldFtndWlkXSA9IHRydWU7Ci0gICAgbGlzdC5wdXNoKG9iaik7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBAcGFyYW0gb2JqCi0gICovCi0gIHJlbW92
ZTogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAg
IHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldCwKLSAgICAgICAgbGlzdCA9IHRoaXMubGlz
dDsKLQotICAgIGRlbGV0ZSBwcmVzZW5jZVNldFtndWlkXTsKLQotICAgIHZhciBpbmRleCA9IGlu
ZGV4T2YuY2FsbChsaXN0LCBvYmopOwotICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICBsaXN0
LnNwbGljZShpbmRleCwgMSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgaXNF
bXB0eQotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGlzRW1wdHk6IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoID09PSAwOwotICB9LAotCi0gIC8qKgotICAg
IEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIG9iagotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICov
Ci0gIGhhczogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCi0g
ICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldDsKLQotICAgIHJldHVybiBndWlk
IGluIHByZXNlbmNlU2V0OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZm9yRWFjaAotICAg
IEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gICAgQHBhcmFtIHNlbGYKLSAgKi8KLSAgZm9yRWFjaDog
ZnVuY3Rpb24oZm4sIHNlbGYpIHsKLSAgICAvLyBhbGxvdyBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0
aW9uCi0gICAgdmFyIGxpc3QgPSB0aGlzLnRvQXJyYXkoKTsKLQotICAgIGZvciAodmFyIGkgPSAw
LCBqID0gbGlzdC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKLSAgICAgIGZuLmNhbGwoc2VsZiwgbGlz
dFtpXSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdG9BcnJheQotICAgIEBy
ZXR1cm4ge0FycmF5fQotICAqLwotICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy5saXN0LnNsaWNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBjb3B5Ci0gICAg
QHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSAgKi8KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIHNldCA9IG5ldyBPcmRlcmVkU2V0KCk7Ci0KLSAgICBzZXQucHJlc2VuY2VTZXQgPSBj
b3B5KHRoaXMucHJlc2VuY2VTZXQpOwotICAgIHNldC5saXN0ID0gdGhpcy50b0FycmF5KCk7Ci0K
LSAgICByZXR1cm4gc2V0OwotICB9Ci19OwotCi0vKioKLSAgQSBNYXAgc3RvcmVzIHZhbHVlcyBp
bmRleGVkIGJ5IGtleXMuIFVubGlrZSBKYXZhU2NyaXB0J3MKLSAgZGVmYXVsdCBPYmplY3RzLCB0
aGUga2V5cyBvZiBhIE1hcCBjYW4gYmUgYW55IEphdmFTY3JpcHQKLSAgb2JqZWN0LgotCi0gIElu
dGVybmFsbHksIGEgTWFwIGhhcyB0d28gZGF0YSBzdHJ1Y3R1cmVzOgotCi0gIDEuIGBrZXlzYDog
YW4gT3JkZXJlZFNldCBvZiBhbGwgb2YgdGhlIGV4aXN0aW5nIGtleXMKLSAgMi4gYHZhbHVlc2A6
IGEgSmF2YVNjcmlwdCBPYmplY3QgaW5kZXhlZCBieSB0aGUgYEVtYmVyLmd1aWRGb3Ioa2V5KWAK
LQotICBXaGVuIGEga2V5L3ZhbHVlIHBhaXIgaXMgYWRkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB3
ZQotICBhZGQgdGhlIGtleSB0byB0aGUgYGtleXNgIE9yZGVyZWRTZXQsIGFuZCBjcmVhdGUgb3IK
LSAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVzYC4gV2hlbiBhbiBlbnRyeSBpcyBkZWxldGVk
LAotICB3ZSBkZWxldGUgaXRzIGVudHJ5IGluIGBrZXlzYCBhbmQgYHZhbHVlc2AuCi0KLSAgQGNs
YXNzIE1hcAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwcml2YXRlCi0gIEBjb25zdHJ1Y3Rvcgot
Ki8KLXZhciBNYXAgPSBFbWJlci5NYXAgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5rZXlzID0gRW1i
ZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgdGhpcy52YWx1ZXMgPSB7fTsKLX07Ci0KLS8qKgot
ICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0qLwotTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uKCkg
ewotICByZXR1cm4gbmV3IE1hcCgpOwotfTsKLQotTWFwLnByb3RvdHlwZSA9IHsKLSAgLyoqCi0g
ICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNoYW5nZSBhcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4g
dGhlIG1hcCBjaGFuZ2VzLgotICAgCi0gICAgQHByb3BlcnR5IGxlbmd0aAotICAgIEB0eXBlIG51
bWJlcgotICAgIEBkZWZhdWx0IDAKLSAgKi8KLSAgbGVuZ3RoOiAwLAotICAgIAotICAgIAotICAv
KioKLSAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5Lgot
Ci0gICAgQG1ldGhvZCBnZXQKLSAgICBAcGFyYW0geyp9IGtleQotICAgIEByZXR1cm4geyp9IHRo
ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgYHVuZGVmaW5lZGAKLSAgKi8KLSAg
Z2V0OiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsCi0gICAg
ICAgIGd1aWQgPSBndWlkRm9yKGtleSk7Ci0KLSAgICByZXR1cm4gdmFsdWVzW2d1aWRdOwotICB9
LAotCi0gIC8qKgotICAgIEFkZHMgYSB2YWx1ZSB0byB0aGUgbWFwLiBJZiBhIHZhbHVlIGZvciB0
aGUgZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGJlZW4KLSAgICBwcm92aWRlZCwgdGhlIG5ldyB2YWx1
ZSB3aWxsIHJlcGxhY2UgdGhlIG9sZCB2YWx1ZS4KLQotICAgIEBtZXRob2Qgc2V0Ci0gICAgQHBh
cmFtIHsqfSBrZXkKLSAgICBAcGFyYW0geyp9IHZhbHVlCi0gICovCi0gIHNldDogZnVuY3Rpb24o
a2V5LCB2YWx1ZSkgewotICAgIHZhciBrZXlzID0gdGhpcy5rZXlzLAotICAgICAgICB2YWx1ZXMg
PSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLQotICAgIGtleXMu
YWRkKGtleSk7Ci0gICAgdmFsdWVzW2d1aWRdID0gdmFsdWU7Ci0gICAgc2V0KHRoaXMsICdsZW5n
dGgnLCBrZXlzLmxpc3QubGVuZ3RoKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGEgdmFs
dWUgZnJvbSB0aGUgbWFwIGZvciBhbiBhc3NvY2lhdGVkIGtleS4KLQotICAgIEBtZXRob2QgcmVt
b3ZlCi0gICAgQHBhcmFtIHsqfSBrZXkKLSAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFu
IGl0ZW0gd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZQotICAqLwotICByZW1vdmU6IGZ1bmN0
aW9uKGtleSkgewotICAgIC8vIGRvbid0IHVzZSBFUzYgImRlbGV0ZSIgYmVjYXVzZSBpdCB3aWxs
IGJlIGFubm95aW5nCi0gICAgLy8gdG8gdXNlIGluIGJyb3dzZXJzIHRoYXQgYXJlIG5vdCBFUzYg
ZnJpZW5kbHk7Ci0gICAgdmFyIGtleXMgPSB0aGlzLmtleXMsCi0gICAgICAgIHZhbHVlcyA9IHRo
aXMudmFsdWVzLAotICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOwotCi0gICAgaWYgKHZhbHVl
cy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgewotICAgICAga2V5cy5yZW1vdmUoa2V5KTsKLSAgICAg
IGRlbGV0ZSB2YWx1ZXNbZ3VpZF07Ci0gICAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGtleXMubGlz
dC5sZW5ndGgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2hlY2sgd2hldGhlciBhIGtleSBp
cyBwcmVzZW50LgotCi0gICAgQG1ldGhvZCBoYXMKLSAgICBAcGFyYW0geyp9IGtleQotICAgIEBy
ZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gd2FzIHByZXNlbnQsIGZhbHNlIG90aGVy
d2lzZQotICAqLwotICBoYXM6IGZ1bmN0aW9uKGtleSkgewotICAgIHZhciB2YWx1ZXMgPSB0aGlz
LnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLQotICAgIHJldHVybiB2YWx1
ZXMuaGFzT3duUHJvcGVydHkoZ3VpZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVy
IGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzLiBDYWxscyB0aGUgZnVuY3Rpb24gb25jZQotICAgIGZv
ciBlYWNoIGtleSwgcGFzc2luZyBpbiB0aGUga2V5IGFuZCB2YWx1ZSwgaW4gdGhhdCBvcmRlci4K
LQotICAgIFRoZSBrZXlzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGl0ZXJhdGVkIG92ZXIgaW4gaW5z
ZXJ0aW9uIG9yZGVyLgotCi0gICAgQG1ldGhvZCBmb3JFYWNoCi0gICAgQHBhcmFtIHtGdW5jdGlv
bn0gY2FsbGJhY2sKLSAgICBAcGFyYW0geyp9IHNlbGYgaWYgcGFzc2VkLCB0aGUgYHRoaXNgIHZh
bHVlIGluc2lkZSB0aGUKLSAgICAgIGNhbGxiYWNrLiBCeSBkZWZhdWx0LCBgdGhpc2AgaXMgdGhl
IG1hcC4KLSAgKi8KLSAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHNlbGYpIHsKLSAgICB2
YXIga2V5cyA9IHRoaXMua2V5cywKLSAgICAgICAgdmFsdWVzID0gdGhpcy52YWx1ZXM7Ci0KLSAg
ICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3Io
a2V5KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZiwga2V5LCB2YWx1ZXNbZ3VpZF0pOwotICAg
IH0pOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgY29weQotICAgIEByZXR1cm4ge0VtYmVy
Lk1hcH0KLSAgKi8KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGNvcHlNYXAodGhp
cywgbmV3IE1hcCgpKTsKLSAgfQotfTsKLQotLyoqCi0gIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAot
ICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1hcAotICBAcHJpdmF0ZQotICBA
Y29uc3RydWN0b3IKLSAgQHBhcmFtIFtvcHRpb25zXQotICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMu
ZGVmYXVsdFZhbHVlXQotKi8KLXZhciBNYXBXaXRoRGVmYXVsdCA9IEVtYmVyLk1hcFdpdGhEZWZh
dWx0ID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBNYXAuY2FsbCh0aGlzKTsKLSAgdGhpcy5kZWZh
dWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTsKLX07Ci0KLS8qKgotICBAbWV0aG9kIGNy
ZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBbb3B0aW9uc10KLSAgICBAcGFyYW0geyp9IFtvcHRp
b25zLmRlZmF1bHRWYWx1ZV0KLSAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIu
TWFwfSBJZiBvcHRpb25zIGFyZSBwYXNzZWQsIHJldHVybnMKLSAgICBgRW1iZXIuTWFwV2l0aERl
ZmF1bHRgIG90aGVyd2lzZSByZXR1cm5zIGBFbWJlci5NYXBgCi0qLwotTWFwV2l0aERlZmF1bHQu
Y3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBpZiAob3B0aW9ucykgewotICAgIHJldHVy
biBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5l
dyBNYXAoKTsKLSAgfQotfTsKLQotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3Jl
YXRlKE1hcC5wcm90b3R5cGUpOwotCi0vKioKLSAgUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCBhIGdpdmVuIGtleS4KLQotICBAbWV0aG9kIGdldAotICBAcGFyYW0geyp9IGtleQot
ICBAcmV0dXJuIHsqfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIHRoZSBk
ZWZhdWx0IHZhbHVlCi0qLwotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9u
KGtleSkgewotICB2YXIgaGFzVmFsdWUgPSB0aGlzLmhhcyhrZXkpOwotCi0gIGlmIChoYXNWYWx1
ZSkgewotICAgIHJldHVybiBNYXAucHJvdG90eXBlLmdldC5jYWxsKHRoaXMsIGtleSk7Ci0gIH0g
ZWxzZSB7Ci0gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlKGtleSk7Ci0g
ICAgdGhpcy5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpOwotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7
Ci0gIH0KLX07Ci0KLS8qKgotICBAbWV0aG9kIGNvcHkKLSAgQHJldHVybiB7RW1iZXIuTWFwV2l0
aERlZmF1bHR9Ci0qLwotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigp
IHsKLSAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IE1hcFdpdGhEZWZhdWx0KHsKLSAgICBkZWZh
dWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlCi0gIH0pKTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci1mdW5jdGlvbiBjb25zb2xlTWV0aG9kKG5hbWUpIHsKLSAgdmFyIGNvbnNv
bGVPYmosIGxvZ1RvQ29uc29sZTsKLSAgaWYgKEVtYmVyLmltcG9ydHMuY29uc29sZSkgewotICAg
IGNvbnNvbGVPYmogPSBFbWJlci5pbXBvcnRzLmNvbnNvbGU7Ci0gIH0gZWxzZSBpZiAodHlwZW9m
IGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgY29uc29sZU9iaiA9IGNvbnNvbGU7Ci0g
IH0KLQotICB2YXIgbWV0aG9kID0gdHlwZW9mIGNvbnNvbGVPYmogPT09ICdvYmplY3QnID8gY29u
c29sZU9ialtuYW1lXSA6IG51bGw7Ci0KLSAgaWYgKG1ldGhvZCkgewotICAgIC8vIE9sZGVyIElF
IGRvZXNuJ3Qgc3VwcG9ydCBhcHBseSwgYnV0IENocm9tZSBuZWVkcyBpdAotICAgIGlmIChtZXRo
b2QuYXBwbHkpIHsKLSAgICAgIGxvZ1RvQ29uc29sZSA9IGZ1bmN0aW9uKCkgewotICAgICAgICBt
ZXRob2QuYXBwbHkoY29uc29sZU9iaiwgYXJndW1lbnRzKTsKLSAgICAgIH07Ci0gICAgICBsb2dU
b0NvbnNvbGUuZGlzcGxheU5hbWUgPSAnY29uc29sZS4nICsgbmFtZTsKLSAgICAgIHJldHVybiBs
b2dUb0NvbnNvbGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgdmFyIG1lc3NhZ2UgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywg
JywgJyk7Ci0gICAgICAgIG1ldGhvZChtZXNzYWdlKTsKLSAgICAgIH07Ci0gICAgfQotICB9Ci19
Ci0KLWZ1bmN0aW9uIGFzc2VydFBvbHlmaWxsKHRlc3QsIG1lc3NhZ2UpIHsKLSAgaWYgKCF0ZXN0
KSB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIGF0dGVtcHQgdG8gcHJlc2VydmUgdGhlIHN0YWNrCi0g
ICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdl
KTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewot
ICAgICAgICB0aHJvdyBlcnJvcjsKLSAgICAgIH0sIDApOwotICAgIH0KLSAgfQotfQotCi0vKioK
LSAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1wbHkgdXNlcyB0aGUgbWV0aG9kcyBmcm9tIGBpbXBv
cnRzLmNvbnNvbGVgLgotICBPdmVycmlkZSB0aGlzIHRvIHByb3ZpZGUgbW9yZSByb2J1c3QgbG9n
Z2luZyBmdW5jdGlvbmFsaXR5LgotCi0gIEBjbGFzcyBMb2dnZXIKLSAgQG5hbWVzcGFjZSBFbWJl
cgotKi8KLUVtYmVyLkxvZ2dlciA9IHsKLSAgLyoqCi0gICBMb2dzIHRoZSBhcmd1bWVudHMgdG8g
dGhlIGNvbnNvbGUuCi0gICBZb3UgY2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdh
bnQgYW5kIHRoZXkgd2lsbCBiZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNlLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBmb28gPSAxOwotICAgIEVtYmVyLkxvZ2dlci5sb2coJ2xv
ZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBmb286IDEiIHdpbGwgYmUg
cHJpbnRlZCB0byB0aGUgY29uc29sZQotICAgIGBgYAotCi0gICBAbWV0aG9kIGxvZwotICAgQGZv
ciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIGxvZzogICBj
b25zb2xlTWV0aG9kKCdsb2cnKSAgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBQcmludHMgdGhl
IGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRoIGEgd2FybmluZyBpY29uLgotICAgWW91IGNh
biBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9p
bmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJl
ci5Mb2dnZXIud2FybignU29tZXRoaW5nIGhhcHBlbmVkIScpOyAvLyAiU29tZXRoaW5nIGhhcHBl
bmVkISIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlIHdpdGggYSB3YXJuaW5nIGljb24u
Ci0gICAgYGBgCi0KLSAgIEBtZXRob2Qgd2FybgotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBw
YXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIHdhcm46ICBjb25zb2xlTWV0aG9kKCd3YXJuJykg
IHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBQcmludHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29u
c29sZSB3aXRoIGFuIGVycm9yIGljb24sIHJlZCB0ZXh0IGFuZCBhIHN0YWNrIHRyYWNlLgotICAg
WW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwg
YmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0RhbmdlciEgRGFuZ2VyIScpOyAvLyAiRGFuZ2VyISBEYW5n
ZXIhIiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgaW4gcmVkIHRleHQuCi0gICAgYGBg
Ci0KLSAgIEBtZXRob2QgZXJyb3IKLSAgIEBmb3IgRW1iZXIuTG9nZ2VyCi0gICBAcGFyYW0geyp9
IGFyZ3VtZW50cwotICAqLwotICBlcnJvcjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBFbWJl
ci5LLAotCi0gIC8qKgotICAgTG9ncyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zb2xlLgotICAg
WW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwg
YmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dnZXIuaW5mbygnbG9nIHZhbHVlIG9mIGZvbzon
LCBmb28pOyAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBj
b25zb2xlCi0gICAgYGBgCi0KLSAgIEBtZXRob2QgaW5mbwotICAgQGZvciBFbWJlci5Mb2dnZXIK
LSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIGluZm86ICBjb25zb2xlTWV0aG9kKCdp
bmZvJykgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhl
IGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgotICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRz
IGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFj
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dn
ZXIuZGVidWcoJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBmb286
IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZQotICAgIGBgYAotCi0gICBAbWV0aG9k
IGRlYnVnCi0gICBAZm9yIEVtYmVyLkxvZ2dlcgotICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKLSAg
Ki8KLSAgZGVidWc6IGNvbnNvbGVNZXRob2QoJ2RlYnVnJykgfHwgY29uc29sZU1ldGhvZCgnaW5m
bycpIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBJZiB0aGUgdmFsdWUgcGFzc2VkIGludG8gYEVt
YmVyLkxvZ2dlci5hc3NlcnRgIGlzIG5vdCB0cnV0aHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3
aXRoIGEgc3RhY2sgdHJhY2UuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuTG9nZ2Vy
LmFzc2VydCh0cnVlKTsgLy8gdW5kZWZpbmVkCi0gICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVl
ID09PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVycm9yLgotICAgIGBg
YAotCi0gICBAbWV0aG9kIGFzc2VydAotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7
Qm9vbGVhbn0gYm9vbCBWYWx1ZSB0byB0ZXN0Ci0gICovCi0gIGFzc2VydDogY29uc29sZU1ldGhv
ZCgnYXNzZXJ0JykgfHwgYXNzZXJ0UG9seWZpbGwKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIE1FVEFfS0VZID0g
RW1iZXIuTUVUQV9LRVksCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgb2JqZWN0RGVm
aW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eTsKLQotdmFyIE1BTkRB
VE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUjsKLQotLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVT
Q1JJUFRPUgotLy8KLQotLyoqCi0gIE9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQg
YW4gaW50ZXJmYWNlIHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgdG8KLSAgZ2V0IGFuZCBzZXQuIFRo
ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgc2ltcGxlIHByb3BlcnRpZXMuCi0KLSAg
WW91IGdlbmVyYWxseSB3b24ndCBuZWVkIHRvIGNyZWF0ZSBvciBzdWJjbGFzcyB0aGlzIGRpcmVj
dGx5LgotCi0gIEBjbGFzcyBEZXNjcmlwdG9yCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZh
dGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRW1iZXIuRGVzY3JpcHRvciA9IGZ1bmN0aW9uKCkge307
Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLS8vIERFRklOSU5HIFBST1BFUlRJRVMgQVBJCi0vLwotCi12YXIgTUFOREFUT1JZ
X1NFVFRFUl9GVU5DVElPTiA9IEVtYmVyLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04gPSBmdW5j
dGlvbih2YWx1ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0
byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSAob2YgIiArIHRoaXMgKyAiKSIsIGZhbHNlKTsKLX07Ci0K
LXZhciBERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNU
SU9OID0gZnVuY3Rpb24obmFtZSkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1l
dGEgPSB0aGlzW01FVEFfS0VZXTsKLSAgICByZXR1cm4gbWV0YSAmJiBtZXRhLnZhbHVlc1tuYW1l
XTsKLSAgfTsKLX07Ci0KLS8qKgotICBOT1RFOiBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCB1
c2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZSBBUEkuIFlvdSBhbG1vc3QKLSAgbmV2ZXIgd2FudCB0
byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlCi0gIGBF
bWJlci5taXhpbigpYCB0byBkZWZpbmUgbmV3IHByb3BlcnRpZXMuCi0KLSAgRGVmaW5lcyBhIHBy
b3BlcnR5IG9uIGFuIG9iamVjdC4gVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBFUzUK
LSAgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBtZXRob2QgZXhjZXB0IHRoYXQgaXQgY2FuIGFs
c28gYWNjZXB0IGNvbXB1dGVkCi0gIHByb3BlcnRpZXMgYW5kIG90aGVyIHNwZWNpYWwgZGVzY3Jp
cHRvcnMuCi0KLSAgTm9ybWFsbHkgdGhpcyBtZXRob2QgdGFrZXMgb25seSB0aHJlZSBwYXJhbWV0
ZXJzLiBIb3dldmVyIGlmIHlvdSBwYXNzIGFuCi0gIGluc3RhbmNlIG9mIGBFbWJlci5EZXNjcmlw
dG9yYCBhcyB0aGUgdGhpcmQgcGFyYW0gdGhlbiB5b3UgY2FuIHBhc3MgYW4KLSAgb3B0aW9uYWwg
dmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZpY2ll
bnQgdGhhbgotICBjcmVhdGluZyBuZXcgZGVzY3JpcHRvciBoYXNoZXMgZm9yIGVhY2ggcHJvcGVy
dHkuCi0KLSAgIyMgRXhhbXBsZXMKLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEVTNSBjb21wYXRp
YmxlIG1vZGUKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2ZpcnN0TmFtZScsIHsK
LSAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICBjb25maWd1cmFibGU6IGZhbHNlLAotICAgIGVudW1l
cmFibGU6IHRydWUsCi0gICAgdmFsdWU6ICdDaGFybGVzJwotICB9KTsKLQotICAvLyBkZWZpbmUg
YSBzaW1wbGUgcHJvcGVydHkKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2xhc3RO
YW1lJywgdW5kZWZpbmVkLCAnSm9sbGV5Jyk7Ci0KLSAgLy8gZGVmaW5lIGEgY29tcHV0ZWQgcHJv
cGVydHkKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1lJywgRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlz
Lmxhc3ROYW1lOwotICB9KS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykpOwotICBg
YGAKLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtPYmplY3R9IG9iaiB0aGUgb2JqZWN0IHRvIGRlZmluZSB0aGlzIHByb3BlcnR5
IG9uLiBUaGlzIG1heSBiZSBhIHByb3RvdHlwZS4KLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUg
dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gIEBwYXJhbSB7RW1iZXIuRGVzY3JpcHRvcn0gW2Rl
c2NdIGFuIGluc3RhbmNlIG9mIGBFbWJlci5EZXNjcmlwdG9yYCAodHlwaWNhbGx5IGEKLSAgICBj
b21wdXRlZCBwcm9wZXJ0eSkgb3IgYW4gRVM1IGRlc2NyaXB0b3IuCi0gICAgWW91IG11c3QgcHJv
dmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJvdGguCi0gIEBwYXJhbSB7Kn0gW2RhdGFdIHNv
bWV0aGluZyBvdGhlciB0aGFuIGEgZGVzY3JpcHRvciwgdGhhdCB3aWxsCi0gICAgYmVjb21lIHRo
ZSBleHBsaWNpdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotKi8KLUVtYmVyLmRlZmluZVByb3Bl
cnR5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBkZXNjLCBkYXRhLCBtZXRhKSB7Ci0gIHZhciBk
ZXNjcywgZXhpc3RpbmdEZXNjLCB3YXRjaGluZywgdmFsdWU7Ci0KLSAgaWYgKCFtZXRhKSBtZXRh
ID0gbWV0YUZvcihvYmopOwotICBkZXNjcyA9IG1ldGEuZGVzY3M7Ci0gIGV4aXN0aW5nRGVzYyA9
IG1ldGEuZGVzY3Nba2V5TmFtZV07Ci0gIHdhdGNoaW5nID0gbWV0YS53YXRjaGluZ1trZXlOYW1l
XSA+IDA7Ci0KLSAgaWYgKGV4aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3Ip
IHsKLSAgICBleGlzdGluZ0Rlc2MudGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKLSAgfQotCi0gIGlm
IChkZXNjIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikgewotICAgIHZhbHVlID0gZGVzYzsK
LQotICAgIGRlc2NzW2tleU5hbWVdID0gZGVzYzsKLSAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAm
JiB3YXRjaGluZykgewotICAgICAgb2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7
Ci0gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKLSAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwK
LSAgICAgICAgd3JpdGFibGU6IHRydWUsCi0gICAgICAgIHZhbHVlOiB1bmRlZmluZWQgLy8gbWFr
ZSBlbnVtZXJhYmxlCi0gICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqW2tleU5hbWVd
ID0gdW5kZWZpbmVkOyAvLyBtYWtlIGVudW1lcmFibGUKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAg
ZGVzY3Nba2V5TmFtZV0gPSB1bmRlZmluZWQ7IC8vIHNoYWRvdyBkZXNjcmlwdG9yIGluIHByb3Rv
Ci0gICAgaWYgKGRlc2MgPT0gbnVsbCkgewotICAgICAgdmFsdWUgPSBkYXRhOwotCi0gICAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRjaGluZykgewotICAgICAgICBtZXRhLnZhbHVlc1tr
ZXlOYW1lXSA9IGRhdGE7Ci0gICAgICAgIG9iamVjdERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFt
ZSwgewotICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKLSAgICAgICAgICBlbnVtZXJhYmxl
OiB0cnVlLAotICAgICAgICAgIHNldDogTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTiwKLSAgICAg
ICAgICBnZXQ6IERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUpCi0gICAgICAgIH0pOwot
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2JqW2tleU5hbWVdID0gZGF0YTsKLSAgICAgIH0KLSAg
ICB9IGVsc2UgewotICAgICAgdmFsdWUgPSBkZXNjOwotCi0gICAgICAvLyBjb21wYXRpYmlsaXR5
IHdpdGggRVM1Ci0gICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2Mp
OwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGtleSBpcyBiZWluZyB3YXRjaGVkLCBvdmVycmlkZSBj
aGFpbnMgdGhhdAotICAvLyB3ZXJlIGluaXRpYWxpemVkIHdpdGggdGhlIHByb3RvdHlwZQotICBp
ZiAod2F0Y2hpbmcpIHsgRW1iZXIub3ZlcnJpZGVDaGFpbnMob2JqLCBrZXlOYW1lLCBtZXRhKTsg
fQotCi0gIC8vIFRoZSBgdmFsdWVgIHBhc3NlZCB0byB0aGUgYGRpZERlZmluZVByb3BlcnR5YCBo
b29rIGlzCi0gIC8vIGVpdGhlciB0aGUgZGVzY3JpcHRvciBvciBkYXRhLCB3aGljaGV2ZXIgd2Fz
IHBhc3NlZC4KLSAgaWYgKG9iai5kaWREZWZpbmVQcm9wZXJ0eSkgeyBvYmouZGlkRGVmaW5lUHJv
cGVydHkob2JqLCBrZXlOYW1lLCB2YWx1ZSk7IH0KLQotICByZXR1cm4gdGhpczsKLX07Ci0KLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgot
ICBUbyBnZXQgbXVsdGlwbGUgcHJvcGVydGllcyBhdCBvbmNlLCBjYWxsIGBFbWJlci5nZXRQcm9w
ZXJ0aWVzYAotICB3aXRoIGFuIG9iamVjdCBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygc3RyaW5ncyBv
ciBhbiBhcnJheToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmdldFByb3BlcnRpZXMocmVj
b3JkLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1l
OiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0gIGBgYAotCi0g
IGlzIGVxdWl2YWxlbnQgdG86Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5nZXRQcm9wZXJ0
aWVzKHJlY29yZCwgWydmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZSddKTsgIC8vIHsg
Zmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0g
IGBgYAotCi0gIEBtZXRob2QgZ2V0UHJvcGVydGllcwotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7
U3RyaW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMgdG8gZ2V0Ci0gIEByZXR1cm4ge0hhc2h9Ci0q
LwotRW1iZXIuZ2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgcmV0ID0ge30s
Ci0gICAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzLAotICAgICAgaSA9IDE7Ci0KLSAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgRW1iZXIudHlwZU9mKGFyZ3VtZW50c1sxXSkgPT09
ICdhcnJheScpIHsKLSAgICBpID0gMDsKLSAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFd
OwotICB9Ci0gIGZvcih2YXIgbGVuID0gcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkr
KykgewotICAgIHJldFtwcm9wZXJ0eU5hbWVzW2ldXSA9IGdldChvYmosIHByb3BlcnR5TmFtZXNb
aV0pOwotICB9Ci0gIHJldHVybiByZXQ7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotdmFyIGNoYW5nZVByb3BlcnRpZXMgPSBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzLAotICAgIHNl
dCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFNldCBhIGxpc3Qgb2YgcHJvcGVydGllcyBvbiBhbiBv
YmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUKLSAgYSBzaW5nbGUgYGJlZ2lu
UHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gIG9i
c2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgYW5PYmplY3Qu
c2V0UHJvcGVydGllcyh7Ci0gICAgZmlyc3ROYW1lOiAiU3RhbmxleSIsCi0gICAgbGFzdE5hbWU6
ICJTdHVhcnQiLAotICAgIGFnZTogIjIxIgotICB9KQotICBgYGAKLQotICBAbWV0aG9kIHNldFBy
b3BlcnRpZXMKLSAgQHBhcmFtIHNlbGYKLSAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgQHJldHVy
biBzZWxmCi0qLwotRW1iZXIuc2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKHNlbGYsIGhhc2gpIHsK
LSAgY2hhbmdlUHJvcGVydGllcyhmdW5jdGlvbigpIHsKLSAgICBmb3IodmFyIHByb3AgaW4gaGFz
aCkgewotICAgICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHkocHJvcCkpIHsgc2V0KHNlbGYsIHBy
b3AsIGhhc2hbcHJvcF0pOyB9Ci0gICAgfQotICB9KTsKLSAgcmV0dXJuIHNlbGY7Ci19OwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIG1ldGFGb3IgPSBFbWJlci5tZXRhLCAvLyB1
dGlscy5qcwotICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZiwgLy8gdXRpbHMuanMKLSAgICBNQU5E
QVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIsCi0gICAgb19kZWZpbmVQ
cm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5OwotCi1FbWJlci53YXRjaEtl
eSA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24g
QXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChrZXlOYW1lID09PSAnbGVuZ3RoJyAmJiB0
eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0KLQotICB2YXIgbSA9IG1ldGFGb3Io
b2JqKSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nOwotCi0gIC8vIGFjdGl2YXRlIHdhdGNoaW5nIGZp
cnN0IHRpbWUKLSAgaWYgKCF3YXRjaGluZ1trZXlOYW1lXSkgewotICAgIHdhdGNoaW5nW2tleU5h
bWVdID0gMTsKLQotICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLndpbGxXYXRjaFBy
b3BlcnR5KSB7Ci0gICAgICBvYmoud2lsbFdhdGNoUHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgfQot
Ci0gICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYga2V5TmFtZSBpbiBvYmopIHsKLSAgICAgIG0u
dmFsdWVzW2tleU5hbWVdID0gb2JqW2tleU5hbWVdOwotICAgICAgb19kZWZpbmVQcm9wZXJ0eShv
YmosIGtleU5hbWUsIHsKLSAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgICBlbnVt
ZXJhYmxlOiBvYmoucHJvcGVydHlJc0VudW1lcmFibGUoa2V5TmFtZSksCi0gICAgICAgIHNldDog
RW1iZXIuTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTiwKLSAgICAgICAgZ2V0OiBFbWJlci5ERUZB
VUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1lKQotICAgICAgfSk7Ci0gICAgfQotICB9IGVsc2Ug
ewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gKHdhdGNoaW5nW2tleU5hbWVdIHx8IDApICsgMTsK
LSAgfQotfTsKLQotCi1FbWJlci51bndhdGNoS2V5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7
Ci0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYg
KHdhdGNoaW5nW2tleU5hbWVdID09PSAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5TmFtZV0gPSAwOwot
Ci0gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkVW53YXRjaFByb3BlcnR5KSB7
Ci0gICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5KGtleU5hbWUpOwotICAgIH0KLQotICAgIGlm
IChNQU5EQVRPUllfU0VUVEVSICYmIGtleU5hbWUgaW4gb2JqKSB7Ci0gICAgICBvX2RlZmluZVBy
b3BlcnR5KG9iaiwga2V5TmFtZSwgewotICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCi0gICAg
ICAgIGVudW1lcmFibGU6IG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXlOYW1lKSwKLSAgICAg
ICAgc2V0OiBmdW5jdGlvbih2YWwpIHsKLSAgICAgICAgICAvLyByZWRlZmluZSB0byBzZXQgYXMg
ZW51bWVyYWJsZQotICAgICAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7Ci0g
ICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCi0gICAgICAgICAgICB3cml0YWJsZTogdHJ1
ZSwKLSAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCi0gICAgICAgICAgICB2YWx1ZTogdmFs
Ci0gICAgICAgICAgfSk7Ci0gICAgICAgICAgZGVsZXRlIG0udmFsdWVzW2tleU5hbWVdOwotICAg
ICAgICB9LAotICAgICAgICBnZXQ6IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5h
bWUpCi0gICAgICB9KTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAod2F0Y2hpbmdba2V5TmFtZV0gPiAx
KSB7Ci0gICAgd2F0Y2hpbmdba2V5TmFtZV0tLTsKLSAgfQotfTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLXZhciBtZXRhRm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMuanMKLSAgICBn
ZXQgPSBFbWJlci5nZXQsIC8vIHByb3BlcnR5X2dldC5qcwotICAgIG5vcm1hbGl6ZVR1cGxlID0g
RW1iZXIubm9ybWFsaXplVHVwbGUsIC8vIHByb3BlcnR5X2dldC5qcwotICAgIGZvckVhY2ggPSBF
bWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLCAvLyBhcnJheS5qcwotICAgIHdhcm4gPSBFbWJl
ci53YXJuLAotICAgIHdhdGNoS2V5ID0gRW1iZXIud2F0Y2hLZXksCi0gICAgdW53YXRjaEtleSA9
IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgRklSU1RfS0VZID0gL14oW15cLlwqXSspLzsKLQotZnVu
Y3Rpb24gZmlyc3RLZXkocGF0aCkgewotICByZXR1cm4gcGF0aC5tYXRjaChGSVJTVF9LRVkpWzBd
OwotfQotCi12YXIgcGVuZGluZ1F1ZXVlID0gW107Ci0KLS8vIGF0dGVtcHRzIHRvIGFkZCB0aGUg
cGVuZGluZ1F1ZXVlIGNoYWlucyBhZ2Fpbi4gSWYgc29tZSBvZiB0aGVtIGVuZCB1cAotLy8gYmFj
ayBpbiB0aGUgcXVldWUgYW5kIHJlc2NoZWR1bGUgaXMgdHJ1ZSwgc2NoZWR1bGVzIGEgdGltZW91
dCB0byB0cnkKLS8vIGFnYWluLgotRW1iZXIuZmx1c2hQZW5kaW5nQ2hhaW5zID0gZnVuY3Rpb24o
KSB7Ci0gIGlmIChwZW5kaW5nUXVldWUubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfSAvLyBub3Ro
aW5nIHRvIGRvCi0KLSAgdmFyIHF1ZXVlID0gcGVuZGluZ1F1ZXVlOwotICBwZW5kaW5nUXVldWUg
PSBbXTsKLQotICBmb3JFYWNoLmNhbGwocXVldWUsIGZ1bmN0aW9uKHEpIHsgcVswXS5hZGQocVsx
XSk7IH0pOwotCi0gIHdhcm4oJ1dhdGNoaW5nIGFuIHVuZGVmaW5lZCBnbG9iYWwsIEVtYmVyIGV4
cGVjdHMgd2F0Y2hlZCBnbG9iYWxzIHRvIGJlIHNldHVwIGJ5IHRoZSB0aW1lIHRoZSBydW4gbG9v
cCBpcyBmbHVzaGVkLCBjaGVjayBmb3IgdHlwb3MnLCBwZW5kaW5nUXVldWUubGVuZ3RoID09PSAw
KTsKLX07Ci0KLQotZnVuY3Rpb24gYWRkQ2hhaW5XYXRjaGVyKG9iaiwga2V5TmFtZSwgbm9kZSkg
ewotICBpZiAoIW9iaiB8fCAoJ29iamVjdCcgIT09IHR5cGVvZiBvYmopKSB7IHJldHVybjsgfSAv
LyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiksIG5vZGVzID0gbS5jaGFp
bldhdGNoZXJzOwotCi0gIGlmICghbS5oYXNPd25Qcm9wZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7
Ci0gICAgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnMgPSB7fTsKLSAgfQotCi0gIGlmICghbm9kZXNb
a2V5TmFtZV0pIHsgbm9kZXNba2V5TmFtZV0gPSBbXTsgfQotICBub2Rlc1trZXlOYW1lXS5wdXNo
KG5vZGUpOwotICB3YXRjaEtleShvYmosIGtleU5hbWUpOwotfQotCi12YXIgcmVtb3ZlQ2hhaW5X
YXRjaGVyID0gRW1iZXIucmVtb3ZlQ2hhaW5XYXRjaGVyID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1l
LCBub2RlKSB7Ci0gIGlmICghb2JqIHx8ICdvYmplY3QnICE9PSB0eXBlb2Ygb2JqKSB7IHJldHVy
bjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpOwot
ICBpZiAoIW0uaGFzT3duUHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8g
bm90aGluZyB0byBkbwotCi0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyczsKLQotICBpZiAo
bm9kZXNba2V5TmFtZV0pIHsKLSAgICBub2RlcyA9IG5vZGVzW2tleU5hbWVdOwotICAgIGZvciAo
dmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBpZiAobm9k
ZXNbaV0gPT09IG5vZGUpIHsgbm9kZXMuc3BsaWNlKGksIDEpOyB9Ci0gICAgfQotICB9Ci0gIHVu
d2F0Y2hLZXkob2JqLCBrZXlOYW1lKTsKLX07Ci0KLS8vIEEgQ2hhaW5Ob2RlIHdhdGNoZXMgYSBz
aW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBzdGFydGluZwotLy8gdmFs
dWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3b24ndCBhY3R1YWxseSB3YXRjaCBpdC4gRm9y
IGEgcm9vdCBub2RlCi0vLyBwYXNzIG51bGwgZm9yIHBhcmVudCBhbmQga2V5IGFuZCBvYmplY3Qg
Zm9yIHZhbHVlLgotdmFyIENoYWluTm9kZSA9IEVtYmVyLl9DaGFpbk5vZGUgPSBmdW5jdGlvbihw
YXJlbnQsIGtleSwgdmFsdWUpIHsKLSAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwotICB0aGlzLl9r
ZXkgICAgPSBrZXk7Ci0KLSAgLy8gX3dhdGNoaW5nIGlzIHRydWUgd2hlbiBjYWxsaW5nIGdldCh0
aGlzLl9wYXJlbnQsIHRoaXMuX2tleSkgd2lsbAotICAvLyByZXR1cm4gdGhlIHZhbHVlIG9mIHRo
aXMgbm9kZS4KLSAgLy8KLSAgLy8gSXQgaXMgZmFsc2UgZm9yIHRoZSByb290IG9mIGEgY2hhaW4g
KGJlY2F1c2Ugd2UgaGF2ZSBubyBwYXJlbnQpCi0gIC8vIGFuZCBmb3IgZ2xvYmFsIHBhdGhzIChi
ZWNhdXNlIHRoZSBwYXJlbnQgbm9kZSBpcyB0aGUgb2JqZWN0IHdpdGgKLSAgLy8gdGhlIG9ic2Vy
dmVyIG9uIGl0KQotICB0aGlzLl93YXRjaGluZyA9IHZhbHVlPT09dW5kZWZpbmVkOwotCi0gIHRo
aXMuX3ZhbHVlICA9IHZhbHVlOwotICB0aGlzLl9wYXRocyA9IHt9OwotICBpZiAodGhpcy5fd2F0
Y2hpbmcpIHsKLSAgICB0aGlzLl9vYmplY3QgPSBwYXJlbnQudmFsdWUoKTsKLSAgICBpZiAodGhp
cy5fb2JqZWN0KSB7IGFkZENoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhp
cyk7IH0KLSAgfQotCi0gIC8vIFNwZWNpYWwtY2FzZTogdGhlIEVhY2hQcm94eSByZWxpZXMgb24g
aW1tZWRpYXRlIGV2YWx1YXRpb24gdG8KLSAgLy8gZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCi0g
IC8vCi0gIC8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGFuIGVmZmljaWVudCBjYWxsYmFjayB0
aGF0IHRoZSBFYWNoUHJveHkKLSAgLy8gY2FuIGltcGxlbWVudC4KLSAgaWYgKHRoaXMuX3BhcmVu
dCAmJiB0aGlzLl9wYXJlbnQuX2tleSA9PT0gJ0BlYWNoJykgewotICAgIHRoaXMudmFsdWUoKTsK
LSAgfQotfTsKLQotdmFyIENoYWluTm9kZVByb3RvdHlwZSA9IENoYWluTm9kZS5wcm90b3R5cGU7
Ci0KLWZ1bmN0aW9uIGxhenlHZXQob2JqLCBrZXkpIHsKLSAgaWYgKCFvYmopIHJldHVybiB1bmRl
ZmluZWQ7Ci0KLSAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaiwgZmFsc2UpOwotICAvLyBjaGVjayBp
ZiBvYmplY3QgbWVhbnQgb25seSB0byBiZSBhIHByb3RvdHlwZQotICBpZiAobWV0YS5wcm90byA9
PT0gb2JqKSByZXR1cm4gdW5kZWZpbmVkOwotCi0gIGlmIChrZXkgPT09ICJAZWFjaCIpIHJldHVy
biBnZXQob2JqLCBrZXkpOwotCi0gIC8vIGlmIGEgQ1Agb25seSByZXR1cm4gY2FjaGVkIHZhbHVl
Ci0gIHZhciBkZXNjID0gbWV0YS5kZXNjc1trZXldOwotICBpZiAoZGVzYyAmJiBkZXNjLl9jYWNo
ZWFibGUpIHsKLSAgICBpZiAoa2V5IGluIG1ldGEuY2FjaGUpIHsKLSAgICAgIHJldHVybiBtZXRh
LmNhY2hlW2tleV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAg
fQotICB9Ci0KLSAgcmV0dXJuIGdldChvYmosIGtleSk7Ci19Ci0KLUNoYWluTm9kZVByb3RvdHlw
ZS52YWx1ZSA9IGZ1bmN0aW9uKCkgewotICBpZiAodGhpcy5fdmFsdWUgPT09IHVuZGVmaW5lZCAm
JiB0aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9wYXJlbnQudmFsdWUoKTsK
LSAgICB0aGlzLl92YWx1ZSA9IGxhenlHZXQob2JqLCB0aGlzLl9rZXkpOwotICB9Ci0gIHJldHVy
biB0aGlzLl92YWx1ZTsKLX07Ci0KLUNoYWluTm9kZVByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rp
b24oKSB7Ci0gIGlmICh0aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9vYmpl
Y3Q7Ci0gICAgaWYgKG9iaikgeyByZW1vdmVDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRo
aXMpOyB9Ci0gICAgdGhpcy5fd2F0Y2hpbmcgPSBmYWxzZTsgLy8gc28gZnV0dXJlIGNhbGxzIGRv
IG5vdGhpbmcKLSAgfQotfTsKLQotLy8gY29waWVzIGEgdG9wIGxldmVsIG9iamVjdCBvbmx5Ci1D
aGFpbk5vZGVQcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgcmV0ID0gbmV3
IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopLAotICAgICAgcGF0aHMgPSB0aGlzLl9wYXRocywg
cGF0aDsKLSAgZm9yIChwYXRoIGluIHBhdGhzKSB7Ci0gICAgaWYgKHBhdGhzW3BhdGhdIDw9IDAp
IHsgY29udGludWU7IH0gLy8gdGhpcyBjaGVjayB3aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2
YWxzLgotICAgIHJldC5hZGQocGF0aCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX07Ci0KLS8vIGNh
bGxlZCBvbiB0aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8gc2V0dXAgd2F0Y2hlcnMgb24gdGhl
IHNwZWNpZmllZAotLy8gcGF0aC4KLUNoYWluTm9kZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihw
YXRoKSB7Ci0gIHZhciBvYmosIHR1cGxlLCBrZXksIHNyYywgcGF0aHM7Ci0KLSAgcGF0aHMgPSB0
aGlzLl9wYXRoczsKLSAgcGF0aHNbcGF0aF0gPSAocGF0aHNbcGF0aF0gfHwgMCkgKyAxOwotCi0g
IG9iaiA9IHRoaXMudmFsdWUoKTsKLSAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgp
OwotCi0gIC8vIHRoZSBwYXRoIHdhcyBhIGxvY2FsIHBhdGgKLSAgaWYgKHR1cGxlWzBdICYmIHR1
cGxlWzBdID09PSBvYmopIHsKLSAgICBwYXRoID0gdHVwbGVbMV07Ci0gICAga2V5ICA9IGZpcnN0
S2V5KHBhdGgpOwotICAgIHBhdGggPSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Ci0KLSAgLy8g
Z2xvYmFsIHBhdGgsIGJ1dCBvYmplY3QgZG9lcyBub3QgZXhpc3QgeWV0LgotICAvLyBwdXQgaW50
byBhIHF1ZXVlIGFuZCB0cnkgdG8gY29ubmVjdCBsYXRlci4KLSAgfSBlbHNlIGlmICghdHVwbGVb
MF0pIHsKLSAgICBwZW5kaW5nUXVldWUucHVzaChbdGhpcywgcGF0aF0pOwotICAgIHR1cGxlLmxl
bmd0aCA9IDA7Ci0gICAgcmV0dXJuOwotCi0gIC8vIGdsb2JhbCBwYXRoLCBhbmQgb2JqZWN0IGFs
cmVhZHkgZXhpc3RzCi0gIH0gZWxzZSB7Ci0gICAgc3JjICA9IHR1cGxlWzBdOwotICAgIGtleSAg
PSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7Ci0gICAgcGF0aCA9IHR1cGxl
WzFdOwotICB9Ci0KLSAgdHVwbGUubGVuZ3RoID0gMDsKLSAgdGhpcy5jaGFpbihrZXksIHBhdGgs
IHNyYyk7Ci19OwotCi0vLyBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZSBvZiBhIGNoYWluIHRvIHRl
YXJkb3duIHdhdGNoZXIgb24gdGhlIHNwZWNpZmllZAotLy8gcGF0aAotQ2hhaW5Ob2RlUHJvdG90
eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgdmFyIG9iaiwgdHVwbGUsIGtleSwgc3Jj
LCBwYXRoczsKLQotICBwYXRocyA9IHRoaXMuX3BhdGhzOwotICBpZiAocGF0aHNbcGF0aF0gPiAw
KSB7IHBhdGhzW3BhdGhdLS07IH0KLQotICBvYmogPSB0aGlzLnZhbHVlKCk7Ci0gIHR1cGxlID0g
bm9ybWFsaXplVHVwbGUob2JqLCBwYXRoKTsKLSAgaWYgKHR1cGxlWzBdID09PSBvYmopIHsKLSAg
ICBwYXRoID0gdHVwbGVbMV07Ci0gICAga2V5ICA9IGZpcnN0S2V5KHBhdGgpOwotICAgIHBhdGgg
PSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JjICA9IHR1cGxl
WzBdOwotICAgIGtleSAgPSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7Ci0g
ICAgcGF0aCA9IHR1cGxlWzFdOwotICB9Ci0KLSAgdHVwbGUubGVuZ3RoID0gMDsKLSAgdGhpcy51
bmNoYWluKGtleSwgcGF0aCk7Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUuY291bnQgPSAwOwot
Ci1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihrZXksIHBhdGgsIHNyYykgewot
ICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zLCBub2RlOwotICBpZiAoIWNoYWlucykgeyBjaGFp
bnMgPSB0aGlzLl9jaGFpbnMgPSB7fTsgfQotCi0gIG5vZGUgPSBjaGFpbnNba2V5XTsKLSAgaWYg
KCFub2RlKSB7IG5vZGUgPSBjaGFpbnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCBz
cmMpOyB9Ci0gIG5vZGUuY291bnQrKzsgLy8gY291bnQgY2hhaW5zLi4uCi0KLSAgLy8gY2hhaW4g
cmVzdCBvZiBwYXRoIGlmIHRoZXJlIGlzIG9uZQotICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aD4w
KSB7Ci0gICAga2V5ID0gZmlyc3RLZXkocGF0aCk7Ci0gICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5
Lmxlbmd0aCsxKTsKLSAgICBub2RlLmNoYWluKGtleSwgcGF0aCk7IC8vIE5PVEU6IG5vIHNyYyBt
ZWFucyBpdCB3aWxsIG9ic2VydmUgY2hhbmdlcy4uLgotICB9Ci19OwotCi1DaGFpbk5vZGVQcm90
b3R5cGUudW5jaGFpbiA9IGZ1bmN0aW9uKGtleSwgcGF0aCkgewotICB2YXIgY2hhaW5zID0gdGhp
cy5fY2hhaW5zLCBub2RlID0gY2hhaW5zW2tleV07Ci0KLSAgLy8gdW5jaGFpbiByZXN0IG9mIHBh
dGggZmlyc3QuLi4KLSAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGg+MSkgewotICAgIGtleSAgPSBm
aXJzdEtleShwYXRoKTsKLSAgICBwYXRoID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICAg
IG5vZGUudW5jaGFpbihrZXksIHBhdGgpOwotICB9Ci0KLSAgLy8gZGVsZXRlIG5vZGUgaWYgbmVl
ZGVkLgotICBub2RlLmNvdW50LS07Ci0gIGlmIChub2RlLmNvdW50PD0wKSB7Ci0gICAgZGVsZXRl
IGNoYWluc1tub2RlLl9rZXldOwotICAgIG5vZGUuZGVzdHJveSgpOwotICB9Ci0KLX07Ci0KLUNo
YWluTm9kZVByb3RvdHlwZS53aWxsQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnRzKSB7Ci0gIHZhciBj
aGFpbnMgPSB0aGlzLl9jaGFpbnM7Ci0gIGlmIChjaGFpbnMpIHsKLSAgICBmb3IodmFyIGtleSBp
biBjaGFpbnMpIHsKLSAgICAgIGlmICghY2hhaW5zLmhhc093blByb3BlcnR5KGtleSkpIHsgY29u
dGludWU7IH0KLSAgICAgIGNoYWluc1trZXldLndpbGxDaGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0g
IH0KLQotICBpZiAodGhpcy5fcGFyZW50KSB7IHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2Uo
dGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUu
Y2hhaW5XaWxsQ2hhbmdlID0gZnVuY3Rpb24oY2hhaW4sIHBhdGgsIGRlcHRoLCBldmVudHMpIHsK
LSAgaWYgKHRoaXMuX2tleSkgeyBwYXRoID0gdGhpcy5fa2V5ICsgJy4nICsgcGF0aDsgfQotCi0g
IGlmICh0aGlzLl9wYXJlbnQpIHsKLSAgICB0aGlzLl9wYXJlbnQuY2hhaW5XaWxsQ2hhbmdlKHRo
aXMsIHBhdGgsIGRlcHRoKzEsIGV2ZW50cyk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGRlcHRoID4g
MSkgewotICAgICAgZXZlbnRzLnB1c2godGhpcy52YWx1ZSgpLCBwYXRoKTsKLSAgICB9Ci0gICAg
cGF0aCA9ICd0aGlzLicgKyBwYXRoOwotICAgIGlmICh0aGlzLl9wYXRoc1twYXRoXSA+IDApIHsK
LSAgICAgIGV2ZW50cy5wdXNoKHRoaXMudmFsdWUoKSwgcGF0aCk7Ci0gICAgfQotICB9Ci19Owot
Ci1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5EaWRDaGFuZ2UgPSBmdW5jdGlvbihjaGFpbiwgcGF0
aCwgZGVwdGgsIGV2ZW50cykgewotICBpZiAodGhpcy5fa2V5KSB7IHBhdGggPSB0aGlzLl9rZXkg
KyAnLicgKyBwYXRoOyB9Ci0gIGlmICh0aGlzLl9wYXJlbnQpIHsKLSAgICB0aGlzLl9wYXJlbnQu
Y2hhaW5EaWRDaGFuZ2UodGhpcywgcGF0aCwgZGVwdGgrMSwgZXZlbnRzKTsKLSAgfSBlbHNlIHsK
LSAgICBpZiAoZGVwdGggPiAxKSB7Ci0gICAgICBldmVudHMucHVzaCh0aGlzLnZhbHVlKCksIHBh
dGgpOwotICAgIH0KLSAgICBwYXRoID0gJ3RoaXMuJyArIHBhdGg7Ci0gICAgaWYgKHRoaXMuX3Bh
dGhzW3BhdGhdID4gMCkgewotICAgICAgZXZlbnRzLnB1c2godGhpcy52YWx1ZSgpLCBwYXRoKTsK
LSAgICB9Ci0gIH0KLX07Ci0KLUNoYWluTm9kZVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlv
bihldmVudHMpIHsKLSAgLy8gaW52YWxpZGF0ZSBteSBvd24gdmFsdWUgZmlyc3QuCi0gIGlmICh0
aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9wYXJlbnQudmFsdWUoKTsKLSAg
ICBpZiAob2JqICE9PSB0aGlzLl9vYmplY3QpIHsKLSAgICAgIHJlbW92ZUNoYWluV2F0Y2hlcih0
aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7Ci0gICAgICB0aGlzLl9vYmplY3QgPSBvYmo7
Ci0gICAgICBhZGRDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRoaXMpOwotICAgIH0KLSAg
ICB0aGlzLl92YWx1ZSAgPSB1bmRlZmluZWQ7Ci0KLSAgICAvLyBTcGVjaWFsLWNhc2U6IHRoZSBF
YWNoUHJveHkgcmVsaWVzIG9uIGltbWVkaWF0ZSBldmFsdWF0aW9uIHRvCi0gICAgLy8gZXN0YWJs
aXNoIGl0cyBvYnNlcnZlcnMuCi0gICAgaWYgKHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQu
X2tleSA9PT0gJ0BlYWNoJykKLSAgICAgIHRoaXMudmFsdWUoKTsKLSAgfQotCi0gIC8vIHRoZW4g
bm90aWZ5IGNoYWlucy4uLgotICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zOwotICBpZiAoY2hh
aW5zKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gY2hhaW5zKSB7Ci0gICAgICBpZiAoIWNoYWlucy5o
YXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9Ci0gICAgICBjaGFpbnNba2V5XS5kaWRD
aGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiBubyBldmVudHMgYXJlIHBhc3Nl
ZCBpbiB0aGVuIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgYWJvdmUgd2lyaW5nIHVwZGF0ZQotICBp
ZiAoZXZlbnRzID09PSBudWxsKSB7IHJldHVybjsgfQotCi0gIC8vIGFuZCBmaW5hbGx5IHRlbGwg
cGFyZW50IGFib3V0IG15IHBhdGggY2hhbmdpbmcuLi4KLSAgaWYgKHRoaXMuX3BhcmVudCkgeyB0
aGlzLl9wYXJlbnQuY2hhaW5EaWRDaGFuZ2UodGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9
Ci19OwotCi1FbWJlci5maW5pc2hDaGFpbnMgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG0gPSBt
ZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBtLmNoYWluczsKLSAgaWYgKGNoYWlucykgewot
ICAgIGlmIChjaGFpbnMudmFsdWUoKSAhPT0gb2JqKSB7Ci0gICAgICBtLmNoYWlucyA9IGNoYWlu
cyA9IGNoYWlucy5jb3B5KG9iaik7Ci0gICAgfQotICAgIGNoYWlucy5kaWRDaGFuZ2UobnVsbCk7
Ci0gIH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsIC8vIHV0aWxzLmpzCi0gICAg
dHlwZU9mID0gRW1iZXIudHlwZU9mLCAvLyB1dGlscy5qcwotICAgIENoYWluTm9kZSA9IEVtYmVy
Ll9DaGFpbk5vZGU7IC8vIGNoYWlucy5qcwotCi0vLyBnZXQgdGhlIGNoYWlucyBmb3IgdGhlIGN1
cnJlbnQgb2JqZWN0LiBJZiB0aGUgY3VycmVudCBvYmplY3QgaGFzCi0vLyBjaGFpbnMgaW5oZXJp
dGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBiZSBjbG9uZWQgYW5kIHJlY29uZmlndXJlZCBm
b3IKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLWZ1bmN0aW9uIGNoYWluc0ZvcihvYmopIHsKLSAg
dmFyIG0gPSBtZXRhRm9yKG9iaiksIHJldCA9IG0uY2hhaW5zOwotICBpZiAoIXJldCkgewotICAg
IHJldCA9IG0uY2hhaW5zID0gbmV3IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopOwotICB9IGVs
c2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmopIHsKLSAgICByZXQgPSBtLmNoYWlucyA9IHJldC5j
b3B5KG9iaik7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotRW1iZXIud2F0Y2hQYXRoID0gZnVu
Y3Rpb24ob2JqLCBrZXlQYXRoKSB7Ci0gIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBBcnJheSAt
IGl0IGlzIHNwZWNpYWwuLi4KLSAgaWYgKGtleVBhdGggPT09ICdsZW5ndGgnICYmIHR5cGVPZihv
YmopID09PSAnYXJyYXknKSB7IHJldHVybjsgfQotCi0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3
YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYgKCF3YXRjaGluZ1trZXlQYXRoXSkgeyAvLyBh
Y3RpdmF0ZSB3YXRjaGluZyBmaXJzdCB0aW1lCi0gICAgd2F0Y2hpbmdba2V5UGF0aF0gPSAxOwot
ICAgIGNoYWluc0ZvcihvYmopLmFkZChrZXlQYXRoKTsKLSAgfSBlbHNlIHsKLSAgICB3YXRjaGlu
Z1trZXlQYXRoXSA9ICh3YXRjaGluZ1trZXlQYXRoXSB8fCAwKSArIDE7Ci0gIH0KLX07Ci0KLUVt
YmVyLnVud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2JqLCBrZXlQYXRoKSB7Ci0gIHZhciBtID0gbWV0
YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYgKHdhdGNoaW5nW2tleVBh
dGhdID09PSAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5UGF0aF0gPSAwOwotICAgIGNoYWluc0Zvcihv
YmopLnJlbW92ZShrZXlQYXRoKTsKLSAgfSBlbHNlIGlmICh3YXRjaGluZ1trZXlQYXRoXSA+IDEp
IHsKLSAgICB3YXRjaGluZ1trZXlQYXRoXS0tOwotICB9Ci19OwotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIG1ldGFGb3IgPSBF
bWJlci5tZXRhLCAvLyB1dGlscy5qcwotICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9LRVksIC8v
IHV0aWxzLmpzCi0gICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwgLy8gdXRpbHMuanMKLSAg
ICByZW1vdmVDaGFpbldhdGNoZXIgPSBFbWJlci5yZW1vdmVDaGFpbldhdGNoZXIsCi0gICAgd2F0
Y2hLZXkgPSBFbWJlci53YXRjaEtleSwgLy8gd2F0Y2hfa2V5LmpzCi0gICAgdW53YXRjaEtleSA9
IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgd2F0Y2hQYXRoID0gRW1iZXIud2F0Y2hQYXRoLCAvLyB3
YXRjaF9wYXRoLmpzCi0gICAgdW53YXRjaFBhdGggPSBFbWJlci51bndhdGNoUGF0aCwKLSAgICB0
eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxzLmpzCi0gICAgZ2VuZXJhdGVHdWlkID0gRW1i
ZXIuZ2VuZXJhdGVHdWlkLAotICAgIElTX1BBVEggPSAvW1wuXCpdLzsKLQotLy8gcmV0dXJucyB0
cnVlIGlmIHRoZSBwYXNzZWQgcGF0aCBpcyBqdXN0IGEga2V5TmFtZQotZnVuY3Rpb24gaXNLZXlO
YW1lKHBhdGgpIHsKLSAgcmV0dXJuIHBhdGg9PT0nKicgfHwgIUlTX1BBVEgudGVzdChwYXRoKTsK
LX0KLQotLyoqCi0gIFN0YXJ0cyB3YXRjaGluZyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gV2hl
bmV2ZXIgdGhlIHByb3BlcnR5IGNoYW5nZXMsCi0gIGludm9rZXMgYEVtYmVyLnByb3BlcnR5V2ls
bENoYW5nZWAgYW5kIGBFbWJlci5wcm9wZXJ0eURpZENoYW5nZWAuIFRoaXMgaXMgdGhlCi0gIHBy
aW1pdGl2ZSB1c2VkIGJ5IG9ic2VydmVycyBhbmQgZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91
IHdpbGwgbmV2ZXIgY2FsbAotICB0aGlzIG1ldGhvZCBkaXJlY3RseSBidXQgaW5zdGVhZCB1c2Ug
aGlnaGVyIGxldmVsIG1ldGhvZHMgbGlrZQotICBgRW1iZXIuYWRkT2JzZXJ2ZXIoKWAKLQotICBA
cHJpdmF0ZQotICBAbWV0aG9kIHdhdGNoCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBA
cGFyYW0ge1N0cmluZ30ga2V5TmFtZQotKi8KLUVtYmVyLndhdGNoID0gZnVuY3Rpb24ob2JqLCBf
a2V5UGF0aCkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVj
aWFsLi4uCi0gIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9mKG9iaikgPT09ICdh
cnJheScpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsKLSAgICB3
YXRjaEtleShvYmosIF9rZXlQYXRoKTsKLSAgfSBlbHNlIHsKLSAgICB3YXRjaFBhdGgob2JqLCBf
a2V5UGF0aCk7Ci0gIH0KLX07Ci0KLUVtYmVyLmlzV2F0Y2hpbmcgPSBmdW5jdGlvbiBpc1dhdGNo
aW5nKG9iaiwga2V5KSB7Ci0gIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgcmV0dXJuICht
ZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5XSkgPiAwOwotfTsKLQotRW1iZXIud2F0Y2guZmx1c2hQ
ZW5kaW5nID0gRW1iZXIuZmx1c2hQZW5kaW5nQ2hhaW5zOwotCi1FbWJlci51bndhdGNoID0gZnVu
Y3Rpb24ob2JqLCBfa2V5UGF0aCkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkg
LSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9m
KG9iaikgPT09ICdhcnJheScpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKGlzS2V5TmFtZShfa2V5UGF0
aCkpIHsKLSAgICB1bndhdGNoS2V5KG9iaiwgX2tleVBhdGgpOwotICB9IGVsc2UgewotICAgIHVu
d2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgpOwotICB9Ci19OwotCi0vKioKLSAgQ2FsbCBvbiBhbiBv
YmplY3Qgd2hlbiB5b3UgZmlyc3QgYmVnZXQgaXQgZnJvbSBhbm90aGVyIG9iamVjdC4gVGhpcyB3
aWxsCi0gIHNldHVwIGFueSBjaGFpbmVkIHdhdGNoZXJzIG9uIHRoZSBvYmplY3QgaW5zdGFuY2Ug
YXMgbmVlZGVkLiBUaGlzIG1ldGhvZCBpcwotICBzYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMu
Ci0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCByZXdhdGNoCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IG9iagotKi8KLUVtYmVyLnJld2F0Y2ggPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG0gPSBtZXRh
Rm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBtLmNoYWluczsKLQotICAvLyBtYWtlIHN1cmUgdGhl
IG9iamVjdCBoYXMgaXRzIG93biBndWlkLgotICBpZiAoR1VJRF9LRVkgaW4gb2JqICYmICFvYmou
aGFzT3duUHJvcGVydHkoR1VJRF9LRVkpKSB7Ci0gICAgZ2VuZXJhdGVHdWlkKG9iaik7Ci0gIH0K
LQotICAvLyBtYWtlIHN1cmUgYW55IGNoYWluZWQgd2F0Y2hlcnMgdXBkYXRlLgotICBpZiAoY2hh
aW5zICYmIGNoYWlucy52YWx1ZSgpICE9PSBvYmopIHsKLSAgICBtLmNoYWlucyA9IGNoYWlucy5j
b3B5KG9iaik7Ci0gIH0KLX07Ci0KLXZhciBOT0RFX1NUQUNLID0gW107Ci0KLS8qKgotICBUZWFy
cyBkb3duIHRoZSBtZXRhIG9uIGFuIG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBnYXJiYWdlIGNv
bGxlY3RlZC4KLSAgTXVsdGlwbGUgY2FsbHMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQotICBAbWV0
aG9kIGRlc3Ryb3kKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqICB0aGUgb2Jq
ZWN0IHRvIGRlc3Ryb3kKLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5kZXN0cm95ID0gZnVu
Y3Rpb24gKG9iaikgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sIG5vZGUsIG5vZGVzLCBr
ZXksIG5vZGVPYmplY3Q7Ci0gIGlmIChtZXRhKSB7Ci0gICAgb2JqW01FVEFfS0VZXSA9IG51bGw7
Ci0gICAgLy8gcmVtb3ZlIGNoYWluV2F0Y2hlcnMgdG8gcmVtb3ZlIGNpcmN1bGFyIHJlZmVyZW5j
ZXMgdGhhdCB3b3VsZCBwcmV2ZW50IEdDCi0gICAgbm9kZSA9IG1ldGEuY2hhaW5zOwotICAgIGlm
IChub2RlKSB7Ci0gICAgICBOT0RFX1NUQUNLLnB1c2gobm9kZSk7Ci0gICAgICAvLyBwcm9jZXNz
IHRyZWUKLSAgICAgIHdoaWxlIChOT0RFX1NUQUNLLmxlbmd0aCA+IDApIHsKLSAgICAgICAgbm9k
ZSA9IE5PREVfU1RBQ0sucG9wKCk7Ci0gICAgICAgIC8vIHB1c2ggY2hpbGRyZW4KLSAgICAgICAg
bm9kZXMgPSBub2RlLl9jaGFpbnM7Ci0gICAgICAgIGlmIChub2RlcykgewotICAgICAgICAgIGZv
ciAoa2V5IGluIG5vZGVzKSB7Ci0gICAgICAgICAgICBpZiAobm9kZXMuaGFzT3duUHJvcGVydHko
a2V5KSkgewotICAgICAgICAgICAgICBOT0RFX1NUQUNLLnB1c2gobm9kZXNba2V5XSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbW92ZSBjaGFp
bldhdGNoZXIgaW4gbm9kZSBvYmplY3QKLSAgICAgICAgaWYgKG5vZGUuX3dhdGNoaW5nKSB7Ci0g
ICAgICAgICAgbm9kZU9iamVjdCA9IG5vZGUuX29iamVjdDsKLSAgICAgICAgICBpZiAobm9kZU9i
amVjdCkgewotICAgICAgICAgICAgcmVtb3ZlQ2hhaW5XYXRjaGVyKG5vZGVPYmplY3QsIG5vZGUu
X2tleSwgbm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9
Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1l
dGFsCi0qLwotCi1FbWJlci53YXJuKCJUaGUgQ1BfREVGQVVMVF9DQUNIRUFCTEUgZmxhZyBoYXMg
YmVlbiByZW1vdmVkIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgY2FjaGVkIGJ5
IGRlZmF1bHQuIFVzZSBgdm9sYXRpbGVgIGlmIHlvdSBkb24ndCB3YW50IGNhY2hpbmcuIiwgRW1i
ZXIuRU5WLkNQX0RFRkFVTFRfQ0FDSEVBQkxFICE9PSBmYWxzZSk7Ci0KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEs
Ci0gICAgYV9zbGljZSA9IFtdLnNsaWNlLAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAot
ICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgd2F0Y2ggPSBFbWJlci53YXRjaCwK
LSAgICB1bndhdGNoID0gRW1iZXIudW53YXRjaDsKLQotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBERVBFTkRFTlQgS0VZ
UwotLy8KLQotLy8gZGF0YSBzdHJ1Y3R1cmU6Ci0vLyAgbWV0YS5kZXBzID0gewotLy8gICAnZGVw
S2V5JzogewotLy8gICAgICdrZXlOYW1lJzogY291bnQsCi0vLyAgIH0KLS8vICB9Ci0KLS8qCi0g
IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hcCBvZiB1bmlxdWUgZGVwZW5kZW5jaWVzIGZvciBh
Ci0gIGdpdmVuIG9iamVjdCBhbmQga2V5LgotKi8KLWZ1bmN0aW9uIGtleXNGb3JEZXAoZGVwc01l
dGEsIGRlcEtleSkgewotICB2YXIga2V5cyA9IGRlcHNNZXRhW2RlcEtleV07Ci0gIGlmICgha2V5
cykgewotICAgIC8vIGlmIHRoZXJlIGFyZSBubyBkZXBlbmRlbmNpZXMgeWV0IGZvciBhIHRoZSBn
aXZlbiBrZXkKLSAgICAvLyBjcmVhdGUgYSBuZXcgZW1wdHkgbGlzdCBvZiBkZXBlbmRlbmNpZXMg
Zm9yIHRoZSBrZXkKLSAgICBrZXlzID0gZGVwc01ldGFbZGVwS2V5XSA9IHt9OwotICB9IGVsc2Ug
aWYgKCFkZXBzTWV0YS5oYXNPd25Qcm9wZXJ0eShkZXBLZXkpKSB7Ci0gICAgLy8gb3RoZXJ3aXNl
IGlmIHRoZSBkZXBlbmRlbmN5IGxpc3QgaXMgaW5oZXJpdGVkIGZyb20KLSAgICAvLyBhIHN1cGVy
Y2xhc3MsIGNsb25lIHRoZSBoYXNoCi0gICAga2V5cyA9IGRlcHNNZXRhW2RlcEtleV0gPSBvX2Ny
ZWF0ZShrZXlzKTsKLSAgfQotICByZXR1cm4ga2V5czsKLX0KLQotZnVuY3Rpb24gbWV0YUZvckRl
cHMobWV0YSkgewotICByZXR1cm4ga2V5c0ZvckRlcChtZXRhLCAnZGVwcycpOwotfQotCi1mdW5j
dGlvbiBhZGREZXBlbmRlbnRLZXlzKGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgewotICAvLyB0
aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRlcGVuZGVudCBrZXlzLCBzbwotICAvLyBhZGQg
YWxsIG9mIGl0cyBkZXBlbmRlbnQga2V5cy4KLSAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRl
bnRLZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4sIGRlcEtleSwga2V5czsKLSAgaWYgKCFkZXBLZXlz
KSByZXR1cm47Ci0KLSAgZGVwc01ldGEgPSBtZXRhRm9yRGVwcyhtZXRhKTsKLQotICBmb3IoaWR4
ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBkZXBL
ZXkgPSBkZXBLZXlzW2lkeF07Ci0gICAgLy8gTG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5Ci0g
ICAga2V5cyA9IGtleXNGb3JEZXAoZGVwc01ldGEsIGRlcEtleSk7Ci0gICAgLy8gSW5jcmVtZW50
IHRoZSBudW1iZXIgb2YgdGltZXMgZGVwS2V5IGRlcGVuZHMgb24ga2V5TmFtZS4KLSAgICBrZXlz
W2tleU5hbWVdID0gKGtleXNba2V5TmFtZV0gfHwgMCkgKyAxOwotICAgIC8vIFdhdGNoIHRoZSBk
ZXBLZXkKLSAgICB3YXRjaChvYmosIGRlcEtleSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gcmVtb3Zl
RGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5hbWUsIG1ldGEpIHsKLSAgLy8gdGhlIGRlc2Ny
aXB0b3IgaGFzIGEgbGlzdCBvZiBkZXBlbmRlbnQga2V5cywgc28KLSAgLy8gYWRkIGFsbCBvZiBp
dHMgZGVwZW5kZW50IGtleXMuCi0gIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5cywg
ZGVwc01ldGEsIGlkeCwgbGVuLCBkZXBLZXksIGtleXM7Ci0gIGlmICghZGVwS2V5cykgcmV0dXJu
OwotCi0gIGRlcHNNZXRhID0gbWV0YUZvckRlcHMobWV0YSk7Ci0KLSAgZm9yKGlkeCA9IDAsIGxl
biA9IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgZGVwS2V5ID0gZGVw
S2V5c1tpZHhdOwotICAgIC8vIExvb2t1cCBrZXlzIG1ldGEgZm9yIGRlcEtleQotICAgIGtleXMg
PSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkpOwotICAgIC8vIEluY3JlbWVudCB0aGUgbnVt
YmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9uIGtleU5hbWUuCi0gICAga2V5c1trZXlOYW1l
XSA9IChrZXlzW2tleU5hbWVdIHx8IDApIC0gMTsKLSAgICAvLyBXYXRjaCB0aGUgZGVwS2V5Ci0g
ICAgdW53YXRjaChvYmosIGRlcEtleSk7Ci0gIH0KLX0KLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQ09NUFVURUQgUFJP
UEVSVFkKLS8vCi0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRyYW5zZm9ybXMgYW4gb2Jq
ZWN0cyBmdW5jdGlvbiBpbnRvIGEgcHJvcGVydHkuCi0KLSAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rp
b24gYmFja2luZyB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGNhbGxlZAotICBv
bmNlIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLiBZb3UgY2FuIHNwZWNpZnkgdmFyaW91
cyBwcm9wZXJ0aWVzCi0gIHRoYXQgeW91ciBjb21wdXRlZCBwcm9wZXJ0eSBpcyBkZXBlbmRlbnQg
b24uIFRoaXMgd2lsbCBmb3JjZSB0aGUgY2FjaGVkCi0gIHJlc3VsdCB0byBiZSByZWNvbXB1dGVk
IGlmIHRoZSBkZXBlbmRlbmNpZXMgYXJlIG1vZGlmaWVkLgotCi0gIEluIHRoZSBmb2xsb3dpbmcg
ZXhhbXBsZSB3ZSBkZWNsYXJlIGEgY29tcHV0ZWQgcHJvcGVydHkgKGJ5IGNhbGxpbmcKLSAgYC5w
cm9wZXJ0eSgpYCBvbiB0aGUgZnVsbE5hbWUgZnVuY3Rpb24pIGFuZCBzZXR1cCB0aGUgcHJvcGVy
dGllcwotICBkZXBlbmRlbmNpZXMgKGRlcGVuZGluZyBvbiBmaXJzdE5hbWUgYW5kIGxhc3ROYW1l
KS4gVGhlIGZ1bGxOYW1lIGZ1bmN0aW9uCi0gIHdpbGwgYmUgY2FsbGVkIG9uY2UgKHJlZ2FyZGxl
c3Mgb2YgaG93IG1hbnkgdGltZXMgaXQgaXMgYWNjZXNzZWQpIGFzIGxvbmcKLSAgYXMgaXQncyBk
ZXBlbmRlbmNpZXMgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkLiBPbmNlIGZpcnN0TmFtZSBvciBsYXN0
TmFtZSBhcmUgdXBkYXRlZAotICBhbnkgZnV0dXJlIGNhbGxzIChvciBhbnl0aGluZyBib3VuZCkg
dG8gZnVsbE5hbWUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgbmV3Ci0gIHZhbHVlcy4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIC8vIHRoZXNl
IHdpbGwgYmUgc3VwcGxpZWQgYnkgYGNyZWF0ZWAKLSAgICBmaXJzdE5hbWU6IG51bGwsCi0gICAg
bGFzdE5hbWU6IG51bGwsCi0KLSAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIg
Zmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOwotICAgICAgdmFyIGxhc3ROYW1lID0g
dGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxh
c3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwot
Ci0gIHZhciB0b20gPSBQZXJzb24uY3JlYXRlKHsKLSAgICBmaXJzdE5hbWU6ICJUb20iLAotICAg
IGxhc3ROYW1lOiAiRGFsZSIKLSAgfSk7Ci0KLSAgdG9tLmdldCgnZnVsbE5hbWUnKSAvLyAiVG9t
IERhbGUiCi0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBkZWZpbmUgd2hhdCBFbWJlciBzaG91bGQg
ZG8gd2hlbiBzZXR0aW5nIGEgY29tcHV0ZWQgcHJvcGVydHkuCi0gIElmIHlvdSB0cnkgdG8gc2V0
IGEgY29tcHV0ZWQgcHJvcGVydHksIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBrZXkgYW5k
Ci0gIHZhbHVlIHlvdSB3YW50IHRvIHNldCBpdCB0by4gWW91IGNhbiBhbHNvIGFjY2VwdCB0aGUg
cHJldmlvdXMgdmFsdWUgYXMgdGhlCi0gIHRoaXJkIHBhcmFtZXRlci4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0KLSBQZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICAvLyB0aGVzZSB3aWxs
IGJlIHN1cHBsaWVkIGJ5IGBjcmVhdGVgCi0gICAgZmlyc3ROYW1lOiBudWxsLAotICAgIGxhc3RO
YW1lOiBudWxsLAotCi0gICAgZnVsbE5hbWU6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIG9sZFZhbHVl
KSB7Ci0gICAgICAvLyBnZXR0ZXIKLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7
Ci0gICAgICAgIHZhciBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7Ci0gICAgICAg
IHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwotCi0gICAgICAgIHJldHVybiBm
aXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTsKLQotICAgICAgLy8gc2V0dGVyCi0gICAgICB9IGVs
c2UgewotICAgICAgICB2YXIgbmFtZSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0KLSAgICAgICAgdGhp
cy5zZXQoJ2ZpcnN0TmFtZScsIG5hbWVbMF0pOwotICAgICAgICB0aGlzLnNldCgnbGFzdE5hbWUn
LCBuYW1lWzFdKTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgfS5wcm9w
ZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKLSAgfSk7Ci0KLSAgdmFyIHBlcnNvbiA9IFBl
cnNvbi5jcmVhdGUoKTsKLSAgcGVyc29uLnNldCgnZnVsbE5hbWUnLCAiUGV0ZXIgV2FnZW5ldCIp
OwotICBwZXJzb24uZ2V0KCdmaXJzdE5hbWUnKSAvLyBQZXRlcgotICBwZXJzb24uZ2V0KCdsYXN0
TmFtZScpIC8vIFdhZ2VuZXQKLSAgYGBgCi0KLSAgQGNsYXNzIENvbXB1dGVkUHJvcGVydHkKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5EZXNjcmlwdG9yCi0gIEBjb25zdHJ1
Y3RvcgotKi8KLWZ1bmN0aW9uIENvbXB1dGVkUHJvcGVydHkoZnVuYywgb3B0cykgewotICB0aGlz
LmZ1bmMgPSBmdW5jOwotCi0gIHRoaXMuX2NhY2hlYWJsZSA9IChvcHRzICYmIG9wdHMuY2FjaGVh
YmxlICE9PSB1bmRlZmluZWQpID8gb3B0cy5jYWNoZWFibGUgOiB0cnVlOwotICB0aGlzLl9kZXBl
bmRlbnRLZXlzID0gb3B0cyAmJiBvcHRzLmRlcGVuZGVudEtleXM7Ci0gIHRoaXMuX3JlYWRPbmx5
ID0gb3B0cyAmJiAob3B0cy5yZWFkT25seSAhPT0gdW5kZWZpbmVkIHx8ICEhb3B0cy5yZWFkT25s
eSk7Ci19Ci0KLUVtYmVyLkNvbXB1dGVkUHJvcGVydHkgPSBDb21wdXRlZFByb3BlcnR5OwotQ29t
cHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwotCi12YXIg
Q29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZSA9IENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlOwot
Ci0vKioKLSAgUHJvcGVydGllcyBhcmUgY2FjaGVhYmxlIGJ5IGRlZmF1bHQuIENvbXB1dGVkIHBy
b3BlcnR5IHdpbGwgYXV0b21hdGljYWxseQotICBjYWNoZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHlv
dXIgZnVuY3Rpb24gdW50aWwgb25lIG9mIHRoZSBkZXBlbmRlbnQga2V5cyBjaGFuZ2VzLgotCi0g
IENhbGwgYHZvbGF0aWxlKClgIHRvIHNldCBpdCBpbnRvIG5vbi1jYWNoZWQgbW9kZS4gV2hlbiBp
biB0aGlzIG1vZGUKLSAgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdpbGwgbm90IGF1dG9tYXRpY2Fs
bHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KLQotICBIb3dldmVyLCBpZiBhIHByb3BlcnR5IGlz
IHByb3Blcmx5IG9ic2VydmFibGUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkaXNhYmxlCi0gIGNh
Y2hpbmcuCi0KLSAgQG1ldGhvZCBjYWNoZWFibGUKLSAgQHBhcmFtIHtCb29sZWFufSBhRmxhZyBv
cHRpb25hbCBzZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGNhY2hpbmcKLSAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gdGhpcwotICBAY2hhaW5hYmxlCi0qLwotQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5jYWNoZWFibGUgPSBmdW5jdGlvbihhRmxhZykgewotICB0aGlzLl9jYWNo
ZWFibGUgPSBhRmxhZyAhPT0gZmFsc2U7Ci0gIHJldHVybiB0aGlzOwotfTsKLQotLyoqCi0gIENh
bGwgb24gYSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUu
IFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG5vdCBhdXRv
bWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1cm4gdmFsdWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBN
eUFwcC5vdXRzaWRlU2VydmljZSA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHZhbHVlOiBm
dW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBPdXRzaWRlU2VydmljZS5nZXRWYWx1ZSgpOwotICAg
IH0ucHJvcGVydHkoKS52b2xhdGlsZSgpCi0gIH0pLmNyZWF0ZSgpOwotICBgYGAKLQotICBAbWV0
aG9kIHZvbGF0aWxlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKLSAg
QGNoYWluYWJsZQotKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUudm9sYXRpbGUgPSBmdW5j
dGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuY2FjaGVhYmxlKGZhbHNlKTsKLX07Ci0KLS8qKgotICBD
YWxsIG9uIGEgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0IGl0IGludG8gcmVhZC1vbmx5IG1vZGUu
IFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIHRocm93IGFu
IGVycm9yIHdoZW4gc2V0LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAuUGVyc29uID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgZ3VpZDogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4g
J2d1aWQtZ3VpZC1ndWlkJzsKLSAgICB9LnByb3BlcnR5KCkucmVhZE9ubHkoKQotICB9KTsKLQot
ICBNeUFwcC5wZXJzb24gPSBNeUFwcC5QZXJzb24uY3JlYXRlKCk7Ci0KLSAgTXlBcHAucGVyc29u
LnNldCgnZ3VpZCcsICduZXctZ3VpZCcpOyAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgotICBg
YGAKLQotICBAbWV0aG9kIHJlYWRPbmx5Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVy
dHl9IHRoaXMKLSAgQGNoYWluYWJsZQotKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUucmVh
ZE9ubHkgPSBmdW5jdGlvbihyZWFkT25seSkgewotICB0aGlzLl9yZWFkT25seSA9IHJlYWRPbmx5
ID09PSB1bmRlZmluZWQgfHwgISFyZWFkT25seTsKLSAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioK
LSAgU2V0cyB0aGUgZGVwZW5kZW50IGtleXMgb24gdGhpcyBjb21wdXRlZCBwcm9wZXJ0eS4gUGFz
cyBhbnkgbnVtYmVyIG9mCi0gIGFyZ3VtZW50cyBjb250YWluaW5nIGtleSBwYXRocyB0aGF0IHRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbi4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIE15
QXBwLlByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGZ1bGxOYW1lOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1l
JykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKLQotICAgICAgLy8gVGVsbCBFbWJlciB0
aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5hbWUKLSAgICAgIC8v
IGFuZCBsYXN0TmFtZQotICAgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQot
ICB9KTsKLQotICBNeUFwcC5wcmVzaWRlbnQgPSBNeUFwcC5QcmVzaWRlbnQuY3JlYXRlKHsKLSAg
ICBmaXJzdE5hbWU6ICdCYXJhY2snLAotICAgIGxhc3ROYW1lOiAnT2JhbWEnLAotICB9KTsKLSAg
TXlBcHAucHJlc2lkZW50LmdldCgnZnVsbE5hbWUnKTsgLy8gQmFyYWNrIE9iYW1hCi0gIGBgYAot
Ci0gIEBtZXRob2QgcHJvcGVydHkKLSAgQHBhcmFtIHtTdHJpbmd9IHBhdGgqIHplcm8gb3IgbW9y
ZSBwcm9wZXJ0eSBwYXRocwotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlz
Ci0gIEBjaGFpbmFibGUKLSovCi1Db21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnByb3BlcnR5ID0g
ZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzOwotCi0gIAotICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzKTsKLSAgCi0KLSAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IGFyZ3M7Ci0gIHJldHVy
biB0aGlzOwotfTsKLQotLyoqCi0gIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBhbm5v
dGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGggYWRkaXRpb25hbAotICBtZXRhZGF0YSBhYm91
dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJhdGUgb24uIEZvciBl
eGFtcGxlLAotICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgdmFy
aWFibGVzIHRoYXQgYXJlIHRoZW4gbm8gbG9uZ2VyCi0gIGF2YWlsYWJsZSBmb3IgaW50cm9zcGVj
dGlvbi4KLQotICBZb3UgY2FuIHBhc3MgYSBoYXNoIG9mIHRoZXNlIHZhbHVlcyB0byBhIGNvbXB1
dGVkIHByb3BlcnR5IGxpa2UgdGhpczoKLQotICBgYGAKLSAgcGVyc29uOiBmdW5jdGlvbigpIHsK
LSAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsKLSAgICByZXR1cm4gQXBw
LlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7Ci0gIH0ucHJvcGVydHkoKS5tZXRhKHsg
dHlwZTogQXBwLlBlcnNvbiB9KQotICBgYGAKLQotICBUaGUgaGFzaCB0aGF0IHlvdSBwYXNzIHRv
IHRoZSBgbWV0YSgpYCBmdW5jdGlvbiB3aWxsIGJlIHNhdmVkIG9uIHRoZQotICBjb21wdXRlZCBw
cm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4gRW1iZXIgcnVudGltZQot
ICBleHBvc2VzIGEgcHVibGljIEFQSSBmb3IgcmV0cmlldmluZyB0aGVzZSB2YWx1ZXMgZnJvbSBj
bGFzc2VzLAotICB2aWEgdGhlIGBtZXRhRm9yUHJvcGVydHkoKWAgZnVuY3Rpb24uCi0KLSAgQG1l
dGhvZCBtZXRhCi0gIEBwYXJhbSB7SGFzaH0gbWV0YQotICBAY2hhaW5hYmxlCi0qLwotCi1Db21w
dXRlZFByb3BlcnR5UHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbihtZXRhKSB7Ci0gIGlmIChhcmd1
bWVudHMubGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0dXJuIHRoaXMuX21ldGEgfHwge307Ci0gIH0g
ZWxzZSB7Ci0gICAgdGhpcy5fbWV0YSA9IG1ldGE7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX07
Ci0KLS8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUu
ZGlkQ2hhbmdlID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gIC8vIF9zdXNwZW5kZWQgaXMg
c2V0IHZpYSBhIENQLnNldCB0byBlbnN1cmUgd2UgZG9uJ3QgY2xlYXIKLSAgLy8gdGhlIGNhY2hl
ZCB2YWx1ZSBzZXQgYnkgdGhlIHNldHRlcgotICBpZiAodGhpcy5fY2FjaGVhYmxlICYmIHRoaXMu
X3N1c3BlbmRlZCAhPT0gb2JqKSB7Ci0gICAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7Ci0gICAg
aWYgKGtleU5hbWUgaW4gbWV0YS5jYWNoZSkgewotICAgICAgZGVsZXRlIG1ldGEuY2FjaGVba2V5
TmFtZV07Ci0gICAgICByZW1vdmVEZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0
YSk7Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlvbiBmaW5pc2hDaGFpbnMoY2hhaW5Ob2RlcykK
LXsKLSAgZm9yICh2YXIgaT0wLCBsPWNoYWluTm9kZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAg
IGNoYWluTm9kZXNbaV0uZGlkQ2hhbmdlKG51bGwpOwotICB9Ci19Ci0KLS8qKgotICBBY2Nlc3Mg
dGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBiYWNraW5nIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4K
LSAgSWYgdGhpcyBwcm9wZXJ0eSBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCwgcmV0dXJuIHRoZSBj
YWNoZWQgcmVzdWx0LgotICBPdGhlcndpc2UsIGNhbGwgdGhlIGZ1bmN0aW9uIHBhc3NpbmcgdGhl
IHByb3BlcnR5IG5hbWUgYXMgYW4gYXJndW1lbnQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBQZXJz
b24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBmdWxsTmFtZTogZnVuY3Rpb24oa2V5TmFt
ZSkgewotICAgICAgLy8gdGhlIGtleU5hbWUgcGFyYW1ldGVyIGlzICdmdWxsTmFtZScgaW4gdGhp
cyBjYXNlLgotCi0gICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhp
cy5nZXQoJ2xhc3ROYW1lJyk7Ci0gICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1l
JykKLSAgfSk7Ci0KLQotICB2YXIgdG9tID0gUGVyc29uLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1l
OiAiVG9tIiwKLSAgICBsYXN0TmFtZTogIkRhbGUiCi0gIH0pOwotCi0gIHRvbS5nZXQoJ2Z1bGxO
YW1lJykgLy8gIlRvbSBEYWxlIgotICBgYGAKLQotICBAbWV0aG9kIGdldAotICBAcGFyYW0ge1N0
cmluZ30ga2V5TmFtZSBUaGUga2V5IGJlaW5nIGFjY2Vzc2VkLgotICBAcmV0dXJuIHtPYmplY3R9
IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGJhY2tpbmcgdGhlIENQLgotKi8KLUNv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0g
IHZhciByZXQsIGNhY2hlLCBtZXRhLCBjaGFpbk5vZGVzOwotICBpZiAodGhpcy5fY2FjaGVhYmxl
KSB7Ci0gICAgbWV0YSA9IG1ldGFGb3Iob2JqKTsKLSAgICBjYWNoZSA9IG1ldGEuY2FjaGU7Ci0g
ICAgaWYgKGtleU5hbWUgaW4gY2FjaGUpIHsgcmV0dXJuIGNhY2hlW2tleU5hbWVdOyB9Ci0gICAg
cmV0ID0gY2FjaGVba2V5TmFtZV0gPSB0aGlzLmZ1bmMuY2FsbChvYmosIGtleU5hbWUpOwotICAg
IGNoYWluTm9kZXMgPSBtZXRhLmNoYWluV2F0Y2hlcnMgJiYgbWV0YS5jaGFpbldhdGNoZXJzW2tl
eU5hbWVdOwotICAgIGlmIChjaGFpbk5vZGVzKSB7IGZpbmlzaENoYWlucyhjaGFpbk5vZGVzKTsg
fQotICAgIGFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRhKTsKLSAgfSBl
bHNlIHsKLSAgICByZXQgPSB0aGlzLmZ1bmMuY2FsbChvYmosIGtleU5hbWUpOwotICB9Ci0gIHJl
dHVybiByZXQ7Ci19OwotCi0vKioKLSAgU2V0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3Bl
cnR5LiBJZiB0aGUgZnVuY3Rpb24gdGhhdCBiYWNrcyB5b3VyCi0gIGNvbXB1dGVkIHByb3BlcnR5
IGRvZXMgbm90IGFjY2VwdCBhcmd1bWVudHMgdGhlbiB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yCi0g
IHNldHRpbmcgd291bGQgYmUgdG8gZGVmaW5lIHRoZSBwcm9wZXJ0eSBvbiB0aGUgY3VycmVudCBv
YmplY3QsIGFuZCBzZXQKLSAgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUg
YmVpbmcgc2V0LgotCi0gIEdlbmVyYWxseSBzcGVha2luZyBpZiB5b3UgaW50ZW5kIGZvciB5b3Vy
IGNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIHNldAotICB5b3VyIGJhY2tpbmcgZnVuY3Rpb24gc2hv
dWxkIGFjY2VwdCBlaXRoZXIgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy4KLQotICBAbWV0aG9kIHNl
dAotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUga2V5IGJlaW5nIGFjY2Vzc2VkLgotICBA
cGFyYW0ge09iamVjdH0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBiZWluZyBhc3NpZ25lZC4KLSAg
QHBhcmFtIHtTdHJpbmd9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgYmVpbmcgcmVwbGFjZWQuCi0g
IEByZXR1cm4ge09iamVjdH0gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYmFja2lu
ZyB0aGUgQ1AuCi0qLwotQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihv
YmosIGtleU5hbWUsIHZhbHVlKSB7Ci0gIHZhciBjYWNoZWFibGUgPSB0aGlzLl9jYWNoZWFibGUs
Ci0gICAgICBmdW5jID0gdGhpcy5mdW5jLAotICAgICAgbWV0YSA9IG1ldGFGb3Iob2JqLCBjYWNo
ZWFibGUpLAotICAgICAgd2F0Y2hlZCA9IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0sCi0gICAgICBv
bGRTdXNwZW5kZWQgPSB0aGlzLl9zdXNwZW5kZWQsCi0gICAgICBoYWRDYWNoZWRWYWx1ZSA9IGZh
bHNlLAotICAgICAgY2FjaGUgPSBtZXRhLmNhY2hlLAotICAgICAgZnVuY0FyZ0xlbmd0aCwgY2Fj
aGVkVmFsdWUsIHJldDsKLQotICBpZiAodGhpcy5fcmVhZE9ubHkpIHsKLSAgICB0aHJvdyBuZXcg
RW1iZXIuRXJyb3IoJ0Nhbm5vdCBTZXQ6ICcgKyBrZXlOYW1lICsgJyBvbjogJyArIG9iai50b1N0
cmluZygpICk7Ci0gIH0KLQotICB0aGlzLl9zdXNwZW5kZWQgPSBvYmo7Ci0KLSAgdHJ5IHsKLQot
ICAgIGlmIChjYWNoZWFibGUgJiYgY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5TmFtZSkpIHsKLSAg
ICAgIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5TmFtZV07Ci0gICAgICBoYWRDYWNoZWRWYWx1ZSA9
IHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIENQIGhhcyBiZWVuIHdyYXBwZWQu
IElmIGlmIGhhcywgdXNlIHRoZQotICAgIC8vIGxlbmd0aCBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0
aW9uLgotICAgIGZ1bmNBcmdMZW5ndGggPSAoZnVuYy53cmFwcGVkRnVuY3Rpb24gPyBmdW5jLndy
YXBwZWRGdW5jdGlvbi5sZW5ndGggOiBmdW5jLmxlbmd0aCk7Ci0KLSAgICAvLyBGb3IgYmFja3dh
cmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21wdXRlZCBwcm9wZXJ0aWVzCi0gICAgLy8gdGhhdCBj
aGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiB0byBkZXRlcm1pbmUgaWYKLSAgICAvLyB0
aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBvbmx5IHBhc3MgdGhlIG9sZCBjYWNoZWQKLSAgICAv
LyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgb3B0cyBpbnRvIGEgdGhpcmQKLSAgICAv
LyBhcmd1bWVudC4KLSAgICBpZiAoZnVuY0FyZ0xlbmd0aCA9PT0gMykgewotICAgICAgcmV0ID0g
ZnVuYy5jYWxsKG9iaiwga2V5TmFtZSwgdmFsdWUsIGNhY2hlZFZhbHVlKTsKLSAgICB9IGVsc2Ug
aWYgKGZ1bmNBcmdMZW5ndGggPT09IDIpIHsKLSAgICAgIHJldCA9IGZ1bmMuY2FsbChvYmosIGtl
eU5hbWUsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgRW1iZXIuZGVmaW5lUHJvcGVydHko
b2JqLCBrZXlOYW1lLCBudWxsLCBjYWNoZWRWYWx1ZSk7Ci0gICAgICBFbWJlci5zZXQob2JqLCBr
ZXlOYW1lLCB2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGhhZENhY2hl
ZFZhbHVlICYmIGNhY2hlZFZhbHVlID09PSByZXQpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAod2F0
Y2hlZCkgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsgfQotCi0gICAg
aWYgKGhhZENhY2hlZFZhbHVlKSB7Ci0gICAgICBkZWxldGUgY2FjaGVba2V5TmFtZV07Ci0gICAg
fQotCi0gICAgaWYgKGNhY2hlYWJsZSkgewotICAgICAgaWYgKCFoYWRDYWNoZWRWYWx1ZSkgewot
ICAgICAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7Ci0gICAg
ICB9Ci0gICAgICBjYWNoZVtrZXlOYW1lXSA9IHJldDsKLSAgICB9Ci0KLSAgICBpZiAod2F0Y2hl
ZCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpOyB9Ci0gIH0gZmluYWxs
eSB7Ci0gICAgdGhpcy5fc3VzcGVuZGVkID0gb2xkU3VzcGVuZGVkOwotICB9Ci0gIHJldHVybiBy
ZXQ7Ci19OwotCi0vKiBjYWxsZWQgYmVmb3JlIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4gKi8KLUNv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbihvYmosIGtleU5hbWUp
IHsKLSAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7Ci0KLSAgaWYgKGtleU5hbWUgaW4gbWV0YS5j
YWNoZSkgewotICAgIHJlbW92ZURlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRh
KTsKLSAgfQotCi0gIGlmICh0aGlzLl9jYWNoZWFibGUpIHsgZGVsZXRlIG1ldGEuY2FjaGVba2V5
TmFtZV07IH0KLQotICByZXR1cm4gbnVsbDsgLy8gbm8gdmFsdWUgdG8gcmVzdG9yZQotfTsKLQot
Ci0vKioKLSAgVGhpcyBoZWxwZXIgcmV0dXJucyBhIG5ldyBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRo
YXQgd3JhcHMgdGhlIHBhc3NlZAotICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbi4gWW91IGNh
biB1c2UgdGhpcyBoZWxwZXIgdG8gZGVmaW5lIHByb3BlcnRpZXMKLSAgd2l0aCBtaXhpbnMgb3Ig
dmlhIGBFbWJlci5kZWZpbmVQcm9wZXJ0eSgpYC4KLQotICBUaGUgZnVuY3Rpb24geW91IHBhc3Mg
d2lsbCBiZSB1c2VkIHRvIGJvdGggZ2V0IGFuZCBzZXQgcHJvcGVydHkgdmFsdWVzLgotICBUaGUg
ZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCB0d28gcGFyYW1ldGVycywga2V5IGFuZCB2YWx1ZS4gSWYg
dmFsdWUgaXMgbm90Ci0gIHVuZGVmaW5lZCB5b3Ugc2hvdWxkIHNldCB0aGUgdmFsdWUgZmlyc3Qu
IEluIGVpdGhlciBjYXNlIHJldHVybiB0aGUKLSAgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVy
dHkuCi0gIEBtZXRob2QgY29tcHV0ZWQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbi4KLSAgQHJldHVybiB7RW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eX0gcHJvcGVydHkgZGVzY3JpcHRvciBpbnN0YW5jZQotKi8KLUVtYmVy
LmNvbXB1dGVkID0gZnVuY3Rpb24oZnVuYykgewotICB2YXIgYXJnczsKLQotICBpZiAoYXJndW1l
bnRzLmxlbmd0aCA+IDEpIHsKLSAgICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwg
LTEpOwotICAgIGZ1bmMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF07Ci0gIH0KLQot
ICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIu
RXJyb3IoIkNvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYSBwcm9wZXJ0eSBmdW5j
dGlvbiIpOwotICB9Ci0KLSAgdmFyIGNwID0gbmV3IENvbXB1dGVkUHJvcGVydHkoZnVuYyk7Ci0K
LSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5hcHBseShjcCwgYXJncyk7Ci0gIH0KLQot
ICByZXR1cm4gY3A7Ci19OwotCi0vKioKLSAgUmV0dXJucyB0aGUgY2FjaGVkIHZhbHVlIGZvciBh
IHByb3BlcnR5LCBpZiBvbmUgZXhpc3RzLgotICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHBlZWtp
bmcgYXQgdGhlIHZhbHVlIG9mIGEgY29tcHV0ZWQKLSAgcHJvcGVydHkgdGhhdCBpcyBnZW5lcmF0
ZWQgbGF6aWx5LCB3aXRob3V0IGFjY2lkZW50YWxseSBjYXVzaW5nCi0gIGl0IHRvIGJlIGNyZWF0
ZWQuCi0KLSAgQG1ldGhvZCBjYWNoZUZvcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBvYmogdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB5b3Ugd2FudCB0byBjaGVjawotICBAcGFy
YW0ge1N0cmluZ30ga2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBjYWNoZWQgdmFs
dWUgeW91IHdhbnQKLSAgICB0byByZXR1cm4KLSAgQHJldHVybiB7T2JqZWN0fSB0aGUgY2FjaGVk
IHZhbHVlCi0qLwotRW1iZXIuY2FjaGVGb3IgPSBmdW5jdGlvbiBjYWNoZUZvcihvYmosIGtleSkg
ewotICB2YXIgY2FjaGUgPSBtZXRhRm9yKG9iaiwgZmFsc2UpLmNhY2hlOwotCi0gIGlmIChjYWNo
ZSAmJiBrZXkgaW4gY2FjaGUpIHsKLSAgICByZXR1cm4gY2FjaGVba2V5XTsKLSAgfQotfTsKLQot
ZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhzZWxmLCBwcm9wZXJ0eU5hbWVzKSB7Ci0gIHZhciByZXQg
PSB7fTsKLSAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsK
LSAgICByZXRbcHJvcGVydHlOYW1lc1tpXV0gPSBnZXQoc2VsZiwgcHJvcGVydHlOYW1lc1tpXSk7
Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVuY3Rpb24gcmVnaXN0ZXJDb21wdXRlZChuYW1l
LCBtYWNybykgewotICBFbWJlci5jb21wdXRlZFtuYW1lXSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtl
eSkgewotICAgIHZhciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gICAgcmV0dXJu
IEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4g
bWFjcm8uYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfSk7Ci0gIH07Ci19Ci0KLWZ1bmN0aW9uIHJl
Z2lzdGVyQ29tcHV0ZWRXaXRoUHJvcGVydGllcyhuYW1lLCBtYWNybykgewotICBFbWJlci5jb21w
dXRlZFtuYW1lXSA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBwcm9wZXJ0aWVzID0gYV9zbGljZS5j
YWxsKGFyZ3VtZW50cyk7Ci0KLSAgICB2YXIgY29tcHV0ZWQgPSBFbWJlci5jb21wdXRlZChmdW5j
dGlvbigpIHsKLSAgICAgIHJldHVybiBtYWNyby5hcHBseSh0aGlzLCBbZ2V0UHJvcGVydGllcyh0
aGlzLCBwcm9wZXJ0aWVzKV0pOwotICAgIH0pOwotCi0gICAgcmV0dXJuIGNvbXB1dGVkLnByb3Bl
cnR5LmFwcGx5KGNvbXB1dGVkLCBwcm9wZXJ0aWVzKTsKLSAgfTsKLX0KLQotLyoqCi0gIEEgY29t
cHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXBl
bmRlbnQKLSAgcHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwg
b3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQu
ZW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bwotICB1c2UgdGhlIGBhcnJheS5b
XWAgc3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRpb25zCi0g
IGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRlcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2
YXNjcmlwdAotICB2YXIgVG9Eb0xpc3QgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBkb25l
OiBFbWJlci5jb21wdXRlZC5lbXB0eSgndG9kb3MuW10nKSAvLyBkZXRlY3QgYXJyYXkgY2hhbmdl
cwotICB9KTsKLSAgdmFyIHRvZG9MaXN0ID0gVG9Eb0xpc3QuY3JlYXRlKHt0b2RvczogWydVbml0
IFRlc3QnLCAnRG9jdW1lbnRhdGlvbicsICdSZWxlYXNlJ119KTsKLSAgdG9kb0xpc3QuZ2V0KCdk
b25lJyk7IC8vIGZhbHNlCi0gIHRvZG9MaXN0LmdldCgndG9kb3MnKS5jbGVhcigpOyAvLyBbXQot
ICB0b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1
dGVkLmVtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQot
ICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGlj
aCBuZWdhdGUKLSAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eQotKi8KLXJlZ2lzdGVy
Q29tcHV0ZWQoJ2VtcHR5JywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVybiBFbWJl
ci5pc0VtcHR5KGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKLX0pOwotCi0vKioKLSAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGRlcGVu
ZGVudAotICBwcm9wZXJ0eSBpcyBOT1QgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJh
eSwgb3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0
ZWQubm90RW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bwotICB1c2UgdGhlIGBh
cnJheS5bXWAgc3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRp
b25zCi0gIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRlcy4KLQotICBFeGFtcGxlCi0KLSAg
YGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAg
IGhhc1N0dWZmOiBFbWJlci5jb21wdXRlZC5ub3RFbXB0eSgnYmFja3BhY2suW10nKQotICB9KTsK
LSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7YmFja3BhY2s6IFsnRm9vZCcsICdTbGVl
cGluZyBCYWcnLCAnVGVudCddfSk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAvLyB0cnVl
Ci0gIGhhbXN0ZXIuZ2V0KCdiYWNrcGFjaycpLmNsZWFyKCk7IC8vIFtdCi0gIGhhbXN0ZXIuZ2V0
KCdoYXNTdHVmZicpOyAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLm5vdEVt
cHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1
cm5zIHRydWUgaWYKLSAgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4K
LSovCi1yZWdpc3RlckNvbXB1dGVkKCdub3RFbXB0eScsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkg
ewotICByZXR1cm4gIUVtYmVyLmlzRW1wdHkoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOwotfSk7
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2
YWx1ZSBvZiB0aGUgZGVwZW5kZW50Ci0gIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcKLSAgYWJvdXQgdXNlIG9m
ID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkgY29uZnVzaW5nLgotCi0gIEV4YW1wbGUKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0g
ICAgaXNIdW5ncnk6IEVtYmVyLmNvbXB1dGVkLm5vbmUoJ2Zvb2QnKQotICB9KTsKLSAgdmFyIGhh
bXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8g
dHJ1ZQotICBoYW1zdGVyLnNldCgnZm9vZCcsICdCYW5hbmEnKTsKLSAgaGFtc3Rlci5nZXQoJ2lz
SHVuZ3J5Jyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdmb29kJywgbnVsbCk7Ci0gIGhhbXN0
ZXIuZ2V0KCdpc0h1bmdyeScpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQu
bm9uZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKLSAg
cmV0dXJucyB0cnVlIGlmIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBudWxsIG9yIHVu
ZGVmaW5lZC4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdub25lJywgZnVuY3Rpb24oZGVwZW5kZW50
S2V5KSB7Ci0gIHJldHVybiBFbWJlci5pc05vbmUoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOwot
fSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgaW52ZXJz
ZSBib29sZWFuIHZhbHVlCi0gIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlIGRlcGVuZGVu
dCBwcm9wZXJ0eS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgVXNlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGlzQW5vbnltb3VzOiBFbWJlci5jb21wdXRlZC5u
b3QoJ2xvZ2dlZEluJykKLSAgfSk7Ci0gIHZhciB1c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZElu
OiBmYWxzZX0pOwotICB1c2VyLmdldCgnaXNBbm9ueW1vdXMnKTsgLy8gdHJ1ZQotICB1c2VyLnNl
dCgnbG9nZ2VkSW4nLCB0cnVlKTsKLSAgdXNlci5nZXQoJ2lzQW5vbnltb3VzJyk7IC8vIGZhbHNl
Ci0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubm90Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zCi0gIGludmVyc2Ugb2YgdGhlIG9yaWdp
bmFsIHZhbHVlIGZvciBwcm9wZXJ0eQotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ25vdCcsIGZ1bmN0
aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwot
fSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY29udmVydHMgdGhlIHByb3Zp
ZGVkIGRlcGVuZGVudCBwcm9wZXJ0eQotICBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFz
QmFuYW5hczogRW1iZXIuY29tcHV0ZWQuYm9vbCgnbnVtQmFuYW5hcycpCi0gIH0pOwotICB2YXIg
aGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7
IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMCk7Ci0gIGhhbXN0ZXIuZ2V0
KCdoYXNCYW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMSk7
Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIHRydWUKLSAgaGFtc3Rlci5zZXQoJ251
bUJhbmFuYXMnLCBudWxsKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UK
LSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5ib29sCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjb252ZXJ0cwotICB0byBib29sZWFuIHRoZSBvcmln
aW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkKLSovCi1yZWdpc3RlckNvbXB1dGVkKCdib29sJywgZnVu
Y3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVybiAhIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkp
OwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG1hdGNoZXMgdGhlIG9y
aWdpbmFsIHZhbHVlIGZvciB0aGUKLSAgZGVwZW5kZW50IHByb3BlcnR5IGFnYWluc3QgYSBnaXZl
biBSZWdFeHAsIHJldHVybmluZyBgdHJ1ZWAKLSAgaWYgdGhleSB2YWx1ZXMgbWF0Y2hlcyB0aGUg
UmVnRXhwIGFuZCBgZmFsc2VgIGlmIGl0IGRvZXMgbm90LgotCi0gIEV4YW1wbGUKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFzVmFs
aWRFbWFpbDogRW1iZXIuY29tcHV0ZWQubWF0Y2goJ2VtYWlsJywgL14uK0AuK1wuLiskLykKLSAg
fSk7Ci0gIHZhciB1c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0pOwotICB1c2Vy
LmdldCgnaGFzVmFsaWRFbWFpbCcpOyAvLyBmYWxzZQotICB1c2VyLnNldCgnZW1haWwnLCAnJyk7
Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCi0gIHVzZXIuc2V0KCdlbWFp
bCcsICdlbWJlcl9oYW1zdGVyQGV4YW1wbGUuY29tJyk7Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVt
YWlsJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5tYXRjaAotICBAZm9y
IEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtSZWdFeHB9
IHJlZ2V4cAotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9w
ZXJ0eSB3aGljaCBtYXRjaAotICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGFnYWlu
c3QgYSBnaXZlbiBSZWdFeHAKLSovCi1yZWdpc3RlckNvbXB1dGVkKCdtYXRjaCcsIGZ1bmN0aW9u
KGRlcGVuZGVudEtleSwgcmVnZXhwKSB7Ci0gIHZhciB2YWx1ZSA9IGdldCh0aGlzLCBkZXBlbmRl
bnRLZXkpOwotICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHJlZ2V4cC50ZXN0
KHZhbHVlKSA6IGZhbHNlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQg
cmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgZXF1
YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFwVGltZTogRW1iZXIu
Y29tcHV0ZWQuZXF1YWwoJ3N0YXRlJywgJ3NsZWVweScpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9
IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0g
IGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdzbGVlcHknKTsKLSAgaGFtc3Rlci5nZXQoJ25hcFRpbWUn
KTsgLy8gdHJ1ZQotICBoYW1zdGVyLnNldCgnc3RhdGUnLCAnaHVuZ3J5Jyk7Ci0gIGhhbXN0ZXIu
Z2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZXF1
YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJh
bSB7U3RyaW5nfE51bWJlcnxPYmplY3R9IHZhbHVlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUg
b3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4K
LSovCi1yZWdpc3RlckNvbXB1dGVkKCdlcXVhbCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFs
dWUpIHsKLSAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID09PSB2YWx1ZTsKLX0pOwot
Ci0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJv
dmllZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2
YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc1Rvb01hbnlCYW5hbmFzOiBFbWJlci5jb21wdXRl
ZC5ndCgnbnVtQmFuYW5hcycsIDEwKQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNy
ZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAg
aGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlC
YW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMTEpOwotICBo
YW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0
aG9kIGNvbXB1dGVkLmd0Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleQotICBAcGFyYW0ge051bWJlcn0gdmFsdWUKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCi0gIHRoZSBv
cmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciB0aGVuIGdpdmVuIHZhbHVlLgot
Ki8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2d0JywgZnVuY3Rpb24oZGVwZW5kZW50S2V5LCB2YWx1ZSkg
ewotICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkgPiB2YWx1ZTsKLX0pOwotCi0vKioK
LSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQg
ZGVwZW5kZW50IHByb3BlcnR5Ci0gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJv
dmlkZWQgdmFsdWUuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0
ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBoYXNUb29NYW55QmFuYW5hczogRW1iZXIu
Y29tcHV0ZWQuZ3RlKCdudW1CYW5hbmFzJywgMTApCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhh
bXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBm
YWxzZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDMpOwotICBoYW1zdGVyLmdldCgnaGFz
VG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAx
MCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyB0cnVlCi0gIGBgYAot
Ci0gIEBtZXRob2QgY29tcHV0ZWQuZ3RlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9
IGRlcGVuZGVudEtleQotICBAcGFyYW0ge051bWJlcn0gdmFsdWUKLSAgQHJldHVybiB7RW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlm
Ci0gIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciBvciBlcXVhbCB0
aGVuIGdpdmVuIHZhbHVlLgotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2d0ZScsIGZ1bmN0aW9uKGRl
cGVuZGVudEtleSwgdmFsdWUpIHsKLSAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID49
IHZhbHVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0
cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgbGVzcyB0aGFuIHRo
ZSBwcm92aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIg
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVt
YmVyLmNvbXB1dGVkLmx0KCdudW1CYW5hbmFzJywgMykKLSAgfSk7Ci0gIHZhciBoYW1zdGVyID0g
SGFtc3Rlci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8g
dHJ1ZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDMpOwotICBoYW1zdGVyLmdldCgnbmVl
ZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDIp
OwotICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyB0cnVlCi0gIGBgYAotCi0g
IEBtZXRob2QgY29tcHV0ZWQubHQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5Ci0gIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKLSAg
dGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBsZXNzIHRoZW4gZ2l2ZW4gdmFsdWUu
Ci0qLwotcmVnaXN0ZXJDb21wdXRlZCgnbHQnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHZhbHVl
KSB7Ci0gIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA8IHZhbHVlOwotfSk7Ci0KLS8q
KgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRl
ZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92
aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3Rl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVtYmVyLmNv
bXB1dGVkLmx0ZSgnbnVtQmFuYW5hcycsIDMpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0
ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCduZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRydWUK
LSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCA1KTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9y
ZUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKLSAg
aGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0
aG9kIGNvbXB1dGVkLmx0ZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl
bnRLZXkKLSAgQHBhcmFtIHtOdW1iZXJ9IHZhbHVlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUg
b3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGxlc3Mgb3IgZXF1YWwgdGhlbiBnaXZlbiB2
YWx1ZS4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdsdGUnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXks
IHZhbHVlKSB7Ci0gIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA8PSB2YWx1ZTsKLX0p
OwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHBlcmZvcm1zIGEgbG9naWNhbCBg
YW5kYCBvbiB0aGUKLSAgb3JpZ2luYWwgdmFsdWVzIGZvciB0aGUgcHJvdmlkZWQgZGVwZW5kZW50
IHByb3BlcnRpZXMuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0
ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICByZWFkeUZvckNhbXA6IEVtYmVyLmNvbXB1
dGVkLmFuZCgnaGFzVGVudCcsICdoYXNCYWNrcGFjaycpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9
IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdyZWFkeUZvckNhbXAnKTsgLy8gZmFs
c2UKLSAgaGFtc3Rlci5zZXQoJ2hhc1RlbnQnLCB0cnVlKTsKLSAgaGFtc3Rlci5nZXQoJ3JlYWR5
Rm9yQ2FtcCcpOyAvLyBmYWxzZQotICBoYW1zdGVyLnNldCgnaGFzQmFja3BhY2snLCB0cnVlKTsK
LSAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRo
b2QgY29tcHV0ZWQuYW5kCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVy
dHkgd2hpY2ggcGVyZm9ybXMKLSAgYSBsb2dpY2FsIGBhbmRgIG9uIHRoZSB2YWx1ZXMgb2YgYWxs
IHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRl
ZFdpdGhQcm9wZXJ0aWVzKCdhbmQnLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFy
IGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHko
a2V5KSAmJiAhcHJvcGVydGllc1trZXldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICB9Ci0gIHJldHVybiB0cnVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdo
aWNoIHBlcmZvcm1zIGEgbG9naWNhbCBgb3JgIG9uIHRoZQotICBvcmlnaW5hbCB2YWx1ZXMgZm9y
IHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGllcy4KLQotICBFeGFtcGxlCi0KLSAgYGBg
amF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHJl
YWR5Rm9yUmFpbjogRW1iZXIuY29tcHV0ZWQub3IoJ2hhc0phY2tldCcsICdoYXNVbWJyZWxsYScp
Ci0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0
KCdyZWFkeUZvclJhaW4nKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ2hhc0phY2tldCcsIHRy
dWUpOwotICBoYW1zdGVyLmdldCgncmVhZHlGb3JSYWluJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAg
QG1ldGhvZCBjb21wdXRlZC5vcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBl
bmRlbnRLZXkqCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHBy
b3BlcnR5IHdoaWNoIHBlcmZvcm1zCi0gIGEgbG9naWNhbCBgb3JgIG9uIHRoZSB2YWx1ZXMgb2Yg
YWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21w
dXRlZFdpdGhQcm9wZXJ0aWVzKCdvcicsIGZ1bmN0aW9uKHByb3BlcnRpZXMpIHsKLSAgZm9yICh2
YXIga2V5IGluIHByb3BlcnRpZXMpIHsKLSAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0
eShrZXkpICYmIHByb3BlcnRpZXNba2V5XSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
ICB9Ci0gIHJldHVybiBmYWxzZTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0
aGF0IHJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZQotICBmcm9tIGEgbGlzdCBvZiBkZXBl
bmRlbnQgcHJvcGVydGllcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIg
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc0Nsb3RoZXM6IEVtYmVyLmNv
bXB1dGVkLmFueSgnaGF0JywgJ3NoaXJ0JykKLSAgfSk7Ci0gIHZhciBoYW1zdGVyID0gSGFtc3Rl
ci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0Nsb3RoZXMnKTsgLy8gbnVsbAotICBoYW1z
dGVyLnNldCgnc2hpcnQnLCAnSGF3YWlpYW4gU2hpcnQnKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0Ns
b3RoZXMnKTsgLy8gJ0hhd2FpaWFuIFNoaXJ0JwotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVk
LmFueQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkqCi0gIEBy
ZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJl
dHVybnMKLSAgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSBvZiBnaXZlbiBsaXN0IG9mIHByb3BlcnRp
ZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdhbnknLCBmdW5jdGlvbihw
cm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHBy
b3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwcm9wZXJ0aWVzW2tleV0pIHsKLSAgICAg
IHJldHVybiBwcm9wZXJ0aWVzW2tleV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotfSk7
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgYXJyYXkgb2Yg
dmFsdWVzCi0gIGZvciB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnRpZXMuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKLSAgICBjbG90aGVzOiBFbWJlci5jb21wdXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQn
KQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdl
dCgnY2xvdGhlcycpOyAvLyBbbnVsbCwgbnVsbF0KLSAgaGFtc3Rlci5zZXQoJ2hhdCcsICdDYW1w
IEhhdCcpOwotICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGlydCcpOwotICBoYW1zdGVy
LmdldCgnY2xvdGhlcycpOyAvLyBbJ0NhbXAgSGF0JywgJ0NhbXAgU2hpcnQnXQotICBgYGAKLQot
ICBAbWV0aG9kIGNvbXB1dGVkLmNvbGxlY3QKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmlu
Z30gZGVwZW5kZW50S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21w
dXRlZCBwcm9wZXJ0eSB3aGljaCBtYXBzCi0gIHZhbHVlcyBvZiBhbGwgcGFzc2VkIHByb3BlcnRp
ZXMgaW4gdG8gYW4gYXJyYXkuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdj
b2xsZWN0JywgZnVuY3Rpb24ocHJvcGVydGllcykgewotICB2YXIgcmVzID0gW107Ci0gIGZvciAo
dmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVy
dHkoa2V5KSkgewotICAgICAgaWYgKEVtYmVyLmlzTm9uZShwcm9wZXJ0aWVzW2tleV0pKSB7Ci0g
ICAgICAgIHJlcy5wdXNoKG51bGwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzLnB1c2go
cHJvcGVydGllc1trZXldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0p
OwotCi0vKioKLSAgQ3JlYXRlcyBhIG5ldyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFsaWFzIGZvciBh
bm90aGVyIHByb3BlcnR5Ci0gIG9uIGFuIG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAg
dGhpcyBwcm9wZXJ0eSBiZWhhdmUgYXMKLSAgdGhvdWdoIHRoZXkgd2VyZSBjYWxsZWQgb24gdGhl
IG9yaWdpbmFsIHByb3BlcnR5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgUGVyc29uID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFtZTogJ0FsZXggTWF0Y2huZWVyJywKLSAgICBub21lbjog
RW1iZXIuY29tcHV0ZWQuYWxpYXMoJ25hbWUnKQotICB9KTsKLQotICBhbGV4ID0gUGVyc29uLmNy
ZWF0ZSgpOwotICBhbGV4LmdldCgnbm9tZW4nKTsgLy8gJ0FsZXggTWF0Y2huZWVyJwotICBhbGV4
LmdldCgnbmFtZScpOyAgLy8gJ0FsZXggTWF0Y2huZWVyJwotCi0gIGFsZXguc2V0KCdub21lbics
ICdAbWFjaHR5Jyk7Ci0gIGFsZXguZ2V0KCduYW1lJyk7ICAvLyAnQG1hY2h0eScKLSAgYGBgCi0g
IEBtZXRob2QgY29tcHV0ZWQuYWxpYXMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30g
ZGVwZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVk
IHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KLSAgYWxpYXMgdG8gdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eS4KLSovCi1FbWJlci5jb21wdXRlZC5hbGlhcyA9IGZ1bmN0aW9uKGRlcGVu
ZGVudEtleSkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlv
bihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICBz
ZXQodGhpcywgZGVwZW5kZW50S2V5LCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KTsKLSAgICB9Ci0g
IH0pOwotfTsKLQotLyoqCi0gIFdoZXJlIGBjb21wdXRlZC5hbGlhc2AgYWxpYXNlcyBgZ2V0YCBh
bmQgYHNldGAsIGFuZCBhbGxvd3MgZm9yIGJpZGlyZWN0aW9uYWwKLSAgZGF0YSBmbG93LCBgY29t
cHV0ZWQub25lV2F5YCBvbmx5IHByb3ZpZGVzIGFuIGFsaWFzZWQgYGdldGAuIFRoZSBgc2V0YCB3
aWxsCi0gIG5vdCBtdXRhdGUgdGhlIHVwc3RyZWFtIHByb3BlcnR5LCByYXRoZXIgY2F1c2VzIHRo
ZSBjdXJyZW50IHByb3BlcnR5IHRvCi0gIGJlY29tZSB0aGUgdmFsdWUgc2V0LiBUaGlzIGNhdXNl
cyB0aGUgZG93bnN0cmVhbSBwcm9wZXJ0eSB0byBwZXJtZW50YW50bHkKLSAgZGl2ZXJnZSBmcm9t
IHRoZSB1cHN0cmVhbSBwcm9wZXJ0eS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgZmlyc3ROYW1lOiBudWxsLAotICAg
IGxhc3ROYW1lOiBudWxsLAotICAgIG5pY2tOYW1lOiBFbWJlci5jb21wdXRlZC5vbmVXYXkoJ2Zp
cnN0TmFtZScpCi0gIH0pOwotCi0gIHVzZXIgPSBVc2VyLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1l
OiAnVGVkZHknLAotICAgIGxhc3ROYW1lOiAgJ1plZW5ueScKLSAgfSk7Ci0KLSAgdXNlci5nZXQo
J25pY2tOYW1lJyk7Ci0gICMgJ1RlZGR5JwotCi0gIHVzZXIuc2V0KCduaWNrTmFtZScsICdUZWRk
eUJlYXInKTsKLSAgIyAnVGVkZHlCZWFyJwotCi0gIHVzZXIuZ2V0KCdmaXJzdE5hbWUnKTsKLSAg
IyAnVGVkZHknCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQub25lV2F5Ci0gIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjcmVhdGVzIGEKLSAgb25lIHdh
eSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5Lgot
Ki8KLUVtYmVyLmNvbXB1dGVkLm9uZVdheSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICBy
ZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7Ci0gIH0pOwotfTsKLQotCi0vKioKLSAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IGFjdHMgbGlrZSBhIHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVy
LAotICBidXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHByb3ZpZGVkIGBkZWZhdWx0UGF0aGAg
aWYgdGhlCi0gIHByb3BlcnR5IGl0c2VsZiBoYXMgbm90IGJlZW4gc2V0IHRvIGEgdmFsdWUKLQot
ICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotICAgIHdpc2hMaXN0OiBFbWJlci5jb21wdXRlZC5kZWZhdWx0VG8oJ2Zhdm9y
aXRlRm9vZCcpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKHtmYXZvcml0
ZUZvb2Q6ICdCYW5hbmEnfSk7Ci0gIGhhbXN0ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnQmFuYW5h
JwotICBoYW1zdGVyLnNldCgnd2lzaExpc3QnLCAnTW9yZSBVbml0IFRlc3RzJyk7Ci0gIGhhbXN0
ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnTW9yZSBVbml0IFRlc3RzJwotICBoYW1zdGVyLmdldCgn
ZmF2b3JpdGVGb29kJyk7IC8vICdCYW5hbmEnCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQu
ZGVmYXVsdFRvCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlZmF1bHRQYXRoCi0g
IEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNo
IGFjdHMgbGlrZQotICBhIHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVyLCBidXQgZGVmYXVsdHMg
dG8gdGhlIHZhbHVlIGZyb20gYGRlZmF1bHRQYXRoYC4KLSovCi1FbWJlci5jb21wdXRlZC5kZWZh
dWx0VG8gPSBmdW5jdGlvbihkZWZhdWx0UGF0aCkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5LCBuZXdWYWx1ZSwgY2FjaGVkVmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMSkgewotICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlICE9IG51bGwgPyBjYWNo
ZWRWYWx1ZSA6IGdldCh0aGlzLCBkZWZhdWx0UGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBuZXdW
YWx1ZSAhPSBudWxsID8gbmV3VmFsdWUgOiBnZXQodGhpcywgZGVmYXVsdFBhdGgpOwotICB9KTsK
LX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8vIEVtYmVyLnRyeUZpbmFsbHkK
LS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIEFGVEVSX09CU0VSVkVSUyA9ICc6
Y2hhbmdlJywKLSAgICBCRUZPUkVfT0JTRVJWRVJTID0gJzpiZWZvcmUnOwotCi1mdW5jdGlvbiBj
aGFuZ2VFdmVudChrZXlOYW1lKSB7Ci0gIHJldHVybiBrZXlOYW1lK0FGVEVSX09CU0VSVkVSUzsK
LX0KLQotZnVuY3Rpb24gYmVmb3JlRXZlbnQoa2V5TmFtZSkgewotICByZXR1cm4ga2V5TmFtZStC
RUZPUkVfT0JTRVJWRVJTOwotfQotCi0vKioKLSAgQG1ldGhvZCBhZGRPYnNlcnZlcgotICBAcGFy
YW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9u
fSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSov
Ci1FbWJlci5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9k
KSB7Ci0gIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQs
IG1ldGhvZCk7Ci0gIEVtYmVyLndhdGNoKG9iaiwgX3BhdGgpOwotCi0gIHJldHVybiB0aGlzOwot
fTsKLQotRW1iZXIub2JzZXJ2ZXJzRm9yID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVy
biBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBjaGFuZ2VFdmVudChwYXRoKSk7Ci19OwotCi0vKioK
LSAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5n
fSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFy
YW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5yZW1vdmVPYnNlcnZlciA9
IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLnVud2F0Y2go
b2JqLCBfcGF0aCk7Ci0gIEVtYmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3Bh
dGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioKLSAgQG1l
dGhvZCBhZGRCZWZvcmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBw
YXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0g
e0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5hZGRCZWZvcmVPYnNlcnZlciA9
IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLmFkZExpc3Rl
bmVyKG9iaiwgYmVmb3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0gIEVtYmVyLndh
dGNoKG9iaiwgX3BhdGgpOwotCi0gIHJldHVybiB0aGlzOwotfTsKLQotLy8gU3VzcGVuZCBvYnNl
cnZlciBkdXJpbmcgY2FsbGJhY2suCi0vLwotLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5
IHRoZSB0YXJnZXQgb2YgdGhlIG9ic2VydmVyCi0vLyB3aGlsZSBpdCBpcyBzZXR0aW5nIHRoZSBv
YnNlcnZlZCBwYXRoLgotRW1iZXIuX3N1c3BlbmRCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9i
aiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7Ci0gIHJldHVybiBFbWJlci5fc3Vz
cGVuZExpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kLCBjYWxs
YmFjayk7Ci19OwotCi1FbWJlci5fc3VzcGVuZE9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRo
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlz
dGVuZXIob2JqLCBjaGFuZ2VFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsK
LX07Ci0KLXZhciBtYXAgPSBFbWJlci5BcnJheVBvbHlmaWxscy5tYXA7Ci0KLUVtYmVyLl9zdXNw
ZW5kQmVmb3JlT2JzZXJ2ZXJzID0gZnVuY3Rpb24ob2JqLCBwYXRocywgdGFyZ2V0LCBtZXRob2Qs
IGNhbGxiYWNrKSB7Ci0gIHZhciBldmVudHMgPSBtYXAuY2FsbChwYXRocywgYmVmb3JlRXZlbnQp
OwotICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudHMsIHRhcmdldCwg
bWV0aG9kLCBjYWxsYmFjayk7Ci19OwotCi1FbWJlci5fc3VzcGVuZE9ic2VydmVycyA9IGZ1bmN0
aW9uKG9iaiwgcGF0aHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewotICB2YXIgZXZlbnRz
ID0gbWFwLmNhbGwocGF0aHMsIGNoYW5nZUV2ZW50KTsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5k
TGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOwotfTsKLQot
RW1iZXIuYmVmb3JlT2JzZXJ2ZXJzRm9yID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVy
biBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBiZWZvcmVFdmVudChwYXRoKSk7Ci19OwotCi0vKioK
LSAgQG1ldGhvZCByZW1vdmVCZWZvcmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7
U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAot
ICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5yZW1vdmVCZWZv
cmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVt
YmVyLnVud2F0Y2gob2JqLCBfcGF0aCk7Ci0gIEVtYmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwgYmVm
b3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotZGVmaW5lKCJiYWNrYnVybmVyL3F1ZXVlIiwK
LSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJp
Y3QiOwotICAgIGZ1bmN0aW9uIFF1ZXVlKGRhcSwgbmFtZSwgb3B0aW9ucykgewotICAgICAgdGhp
cy5kYXEgPSBkYXE7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKLSAgICAgIHRoaXMuX3F1ZXVlID0gW107Ci0gICAgfQotCi0gICAgUXVldWUu
cHJvdG90eXBlID0gewotICAgICAgZGFxOiBudWxsLAotICAgICAgbmFtZTogbnVsbCwKLSAgICAg
IG9wdGlvbnM6IG51bGwsCi0gICAgICBfcXVldWU6IG51bGwsCi0KLSAgICAgIHB1c2g6IGZ1bmN0
aW9uKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgewotICAgICAgICB2YXIgcXVldWUgPSB0
aGlzLl9xdWV1ZTsKLSAgICAgICAgcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3Rh
Y2spOwotICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9k
OiBtZXRob2R9OwotICAgICAgfSwKLQotICAgICAgcHVzaFVuaXF1ZTogZnVuY3Rpb24odGFyZ2V0
LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7Ci0gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVl
LCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0aG9kLCBpLCBsOwotCi0gICAgICAgIGZvciAoaSA9
IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKLSAgICAgICAgICBjdXJyZW50
VGFyZ2V0ID0gcXVldWVbaV07Ci0gICAgICAgICAgY3VycmVudE1ldGhvZCA9IHF1ZXVlW2krMV07
Ci0KLSAgICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PT0gdGFyZ2V0ICYmIGN1cnJlbnRNZXRo
b2QgPT09IG1ldGhvZCkgewotICAgICAgICAgICAgcXVldWVbaSsyXSA9IGFyZ3M7IC8vIHJlcGxh
Y2UgYXJncwotICAgICAgICAgICAgcXVldWVbaSszXSA9IHN0YWNrOyAvLyByZXBsYWNlIHN0YWNr
Ci0gICAgICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9k
OiBtZXRob2R9OyAvLyBUT0RPOiB0ZXN0IHRoaXMgY29kZSBwYXRoCi0gICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgdGhpcy5fcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywg
c3RhY2spOwotICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0
aG9kOiBtZXRob2R9OwotICAgICAgfSwKLQotICAgICAgLy8gVE9ETzogcmVtb3ZlIG1lLCBvbmx5
IGJlaW5nIHVzZWQgZm9yIEVtYmVyLnJ1bi5zeW5jCi0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLAotICAgICAgICAgICAgb3B0aW9ucyA9
IHRoaXMub3B0aW9ucywKLSAgICAgICAgICAgIGJlZm9yZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5i
ZWZvcmUsCi0gICAgICAgICAgICBhZnRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hZnRlciwKLSAg
ICAgICAgICAgIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaywgaSwgbCA9IHF1ZXVlLmxlbmd0
aDsKLQotICAgICAgICBpZiAobCAmJiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KLSAgICAgICAgZm9y
IChpID0gMDsgaSA8IGw7IGkgKz0gNCkgewotICAgICAgICAgIHRhcmdldCA9IHF1ZXVlW2ldOwot
ICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlW2krMV07Ci0gICAgICAgICAgYXJncyAgID0gcXVldWVb
aSsyXTsKLSAgICAgICAgICBzdGFjayAgPSBxdWV1ZVtpKzNdOyAvLyBEZWJ1Z2dpbmcgYXNzaXN0
YW5jZQotCi0gICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcKLSAgICAgICAgICBpZiAo
YXJncyAmJiBhcmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIG1ldGhvZC5hcHBseSh0YXJn
ZXQsIGFyZ3MpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRob2QuY2FsbCh0
YXJnZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobCAmJiBhZnRlcikg
eyBhZnRlcigpOyB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgbmV3IGl0ZW1zIGhhdmUgYmVlbiBh
ZGRlZAotICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gbCkgewotICAgICAgICAgIHRoaXMuX3F1
ZXVlID0gcXVldWUuc2xpY2UobCk7Ci0gICAgICAgICAgdGhpcy5mbHVzaCgpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAg
ICAgIH0sCi0KLSAgICAgIGNhbmNlbDogZnVuY3Rpb24oYWN0aW9uVG9DYW5jZWwpIHsKLSAgICAg
ICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWUsIGN1cnJlbnRUYXJnZXQsIGN1cnJlbnRNZXRob2Qs
IGksIGw7Ci0KLSAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkg
Kz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBj
dXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQotICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0
ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9D
YW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICBxdWV1ZS5zcGxpY2UoaSwgNCk7Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBp
ZiBub3QgZm91bmQgaW4gY3VycmVudCBxdWV1ZQotICAgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUg
cXVldWUgdGhhdCBpcyBiZWluZyBmbHVzaGVkCi0gICAgICAgIHF1ZXVlID0gdGhpcy5fcXVldWVC
ZWluZ0ZsdXNoZWQ7Ci0gICAgICAgIGlmICghcXVldWUpIHsKLSAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkg
Kz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBj
dXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQotICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0
ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9D
YW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBtZXNzIHdpdGggYXJyYXkgZHVy
aW5nIGZsdXNoCi0gICAgICAgICAgICAvLyBqdXN0IG51bGxpZnkgdGhlIG1ldGhvZAotICAgICAg
ICAgICAgcXVldWVbaSsxXSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0KLSAgICBfX2V4cG9ydHNfXy5R
dWV1ZSA9IFF1ZXVlOwotICB9KTsKLQotZGVmaW5lKCJiYWNrYnVybmVyL2RlZmVycmVkX2FjdGlv
bl9xdWV1ZXMiLAotICBbImJhY2tidXJuZXIvcXVldWUiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9u
KF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAg
dmFyIFF1ZXVlID0gX19kZXBlbmRlbmN5MV9fLlF1ZXVlOwotCi0gICAgZnVuY3Rpb24gRGVmZXJy
ZWRBY3Rpb25RdWV1ZXMocXVldWVOYW1lcywgb3B0aW9ucykgewotICAgICAgdmFyIHF1ZXVlcyA9
IHRoaXMucXVldWVzID0ge307Ci0gICAgICB0aGlzLnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzID0g
cXVldWVOYW1lcyB8fCBbXTsKLQotICAgICAgdmFyIHF1ZXVlTmFtZTsKLSAgICAgIGZvciAodmFy
IGkgPSAwLCBsID0gcXVldWVOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgcXVl
dWVOYW1lID0gcXVldWVOYW1lc1tpXTsKLSAgICAgICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcg
UXVldWUodGhpcywgcXVldWVOYW1lLCBvcHRpb25zW3F1ZXVlTmFtZV0pOwotICAgICAgfQotICAg
IH0KLQotICAgIERlZmVycmVkQWN0aW9uUXVldWVzLnByb3RvdHlwZSA9IHsKLSAgICAgIHF1ZXVl
TmFtZXM6IG51bGwsCi0gICAgICBxdWV1ZXM6IG51bGwsCi0KLSAgICAgIHNjaGVkdWxlOiBmdW5j
dGlvbihxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBvbmNlRmxhZywgc3RhY2spIHsK
LSAgICAgICAgdmFyIHF1ZXVlcyA9IHRoaXMucXVldWVzLAotICAgICAgICAgICAgcXVldWUgPSBx
dWV1ZXNbcXVldWVOYW1lXTsKLQotICAgICAgICBpZiAoIXF1ZXVlKSB7IHRocm93IG5ldyBFcnJv
cigiWW91IGF0dGVtcHRlZCB0byBzY2hlZHVsZSBhbiBhY3Rpb24gaW4gYSBxdWV1ZSAoIiArIHF1
ZXVlTmFtZSArICIpIHRoYXQgZG9lc24ndCBleGlzdCIpOyB9Ci0KLSAgICAgICAgaWYgKG9uY2VG
bGFnKSB7Ci0gICAgICAgICAgcmV0dXJuIHF1ZXVlLnB1c2hVbmlxdWUodGFyZ2V0LCBtZXRob2Qs
IGFyZ3MsIHN0YWNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gcXVldWUu
cHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOwotICAgICAgICB9Ci0gICAgICB9LAot
Ci0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBxdWV1ZXMgPSB0aGlzLnF1
ZXVlcywKLSAgICAgICAgICAgIHF1ZXVlTmFtZXMgPSB0aGlzLnF1ZXVlTmFtZXMsCi0gICAgICAg
ICAgICBxdWV1ZU5hbWUsIHF1ZXVlLCBxdWV1ZUl0ZW1zLCBwcmlvclF1ZXVlTmFtZUluZGV4LAot
ICAgICAgICAgICAgcXVldWVOYW1lSW5kZXggPSAwLCBudW1iZXJPZlF1ZXVlcyA9IHF1ZXVlTmFt
ZXMubGVuZ3RoOwotCi0gICAgICAgIG91dGVybG9vcDoKLSAgICAgICAgd2hpbGUgKHF1ZXVlTmFt
ZUluZGV4IDwgbnVtYmVyT2ZRdWV1ZXMpIHsKLSAgICAgICAgICBxdWV1ZU5hbWUgPSBxdWV1ZU5h
bWVzW3F1ZXVlTmFtZUluZGV4XTsKLSAgICAgICAgICBxdWV1ZSA9IHF1ZXVlc1txdWV1ZU5hbWVd
OwotICAgICAgICAgIHF1ZXVlSXRlbXMgPSBxdWV1ZS5fcXVldWVCZWluZ0ZsdXNoZWQgPSBxdWV1
ZS5fcXVldWUuc2xpY2UoKTsKLSAgICAgICAgICBxdWV1ZS5fcXVldWUgPSBbXTsKLQotICAgICAg
ICAgIHZhciBvcHRpb25zID0gcXVldWUub3B0aW9ucywKLSAgICAgICAgICAgICAgYmVmb3JlID0g
b3B0aW9ucyAmJiBvcHRpb25zLmJlZm9yZSwKLSAgICAgICAgICAgICAgYWZ0ZXIgPSBvcHRpb25z
ICYmIG9wdGlvbnMuYWZ0ZXIsCi0gICAgICAgICAgICAgIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBz
dGFjaywKLSAgICAgICAgICAgICAgcXVldWVJbmRleCA9IDAsIG51bWJlck9mUXVldWVJdGVtcyA9
IHF1ZXVlSXRlbXMubGVuZ3RoOwotCi0gICAgICAgICAgaWYgKG51bWJlck9mUXVldWVJdGVtcyAm
JiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KLSAgICAgICAgICB3aGlsZSAocXVldWVJbmRleCA8IG51
bWJlck9mUXVldWVJdGVtcykgewotICAgICAgICAgICAgdGFyZ2V0ID0gcXVldWVJdGVtc1txdWV1
ZUluZGV4XTsKLSAgICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCsxXTsK
LSAgICAgICAgICAgIGFyZ3MgICA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCsyXTsKLSAgICAgICAg
ICAgIHN0YWNrICA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCszXTsgLy8gRGVidWdnaW5nIGFzc2lz
dGFuY2UKLQotICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7IG1l
dGhvZCA9IHRhcmdldFttZXRob2RdOyB9Ci0KLSAgICAgICAgICAgIC8vIG1ldGhvZCBjb3VsZCBo
YXZlIGJlZW4gbnVsbGlmaWVkIC8gY2FuY2VsZWQgZHVyaW5nIGZsdXNoCi0gICAgICAgICAgICBp
ZiAobWV0aG9kKSB7Ci0gICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nCi0gICAg
ICAgICAgICAgIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAg
IG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRhcmdldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgcXVldWVJbmRleCArPSA0OwotICAgICAgICAgIH0KLSAg
ICAgICAgICBxdWV1ZS5fcXVldWVCZWluZ0ZsdXNoZWQgPSBudWxsOwotICAgICAgICAgIGlmIChu
dW1iZXJPZlF1ZXVlSXRlbXMgJiYgYWZ0ZXIpIHsgYWZ0ZXIoKTsgfQotCi0gICAgICAgICAgaWYg
KChwcmlvclF1ZXVlTmFtZUluZGV4ID0gaW5kZXhPZlByaW9yUXVldWVXaXRoQWN0aW9ucyh0aGlz
LCBxdWV1ZU5hbWVJbmRleCkpICE9PSAtMSkgewotICAgICAgICAgICAgcXVldWVOYW1lSW5kZXgg
PSBwcmlvclF1ZXVlTmFtZUluZGV4OwotICAgICAgICAgICAgY29udGludWUgb3V0ZXJsb29wOwot
ICAgICAgICAgIH0KLQotICAgICAgICAgIHF1ZXVlTmFtZUluZGV4Kys7Ci0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24gaW5kZXhPZlByaW9yUXVldWVXaXRoQWN0aW9u
cyhkYXEsIGN1cnJlbnRRdWV1ZUluZGV4KSB7Ci0gICAgICB2YXIgcXVldWVOYW1lLCBxdWV1ZTsK
LQotICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXJyZW50UXVldWVJbmRleDsgaSA8PSBsOyBp
KyspIHsKLSAgICAgICAgcXVldWVOYW1lID0gZGFxLnF1ZXVlTmFtZXNbaV07Ci0gICAgICAgIHF1
ZXVlID0gZGFxLnF1ZXVlc1txdWV1ZU5hbWVdOwotICAgICAgICBpZiAocXVldWUuX3F1ZXVlLmxl
bmd0aCkgeyByZXR1cm4gaTsgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQot
Ci0KLSAgICBfX2V4cG9ydHNfXy5EZWZlcnJlZEFjdGlvblF1ZXVlcyA9IERlZmVycmVkQWN0aW9u
UXVldWVzOwotICB9KTsKLQotZGVmaW5lKCJiYWNrYnVybmVyIiwKLSAgWyJiYWNrYnVybmVyL2Rl
ZmVycmVkX2FjdGlvbl9xdWV1ZXMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5j
eTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIERlZmVycmVk
QWN0aW9uUXVldWVzID0gX19kZXBlbmRlbmN5MV9fLkRlZmVycmVkQWN0aW9uUXVldWVzOwotCi0g
ICAgdmFyIHNsaWNlID0gW10uc2xpY2UsCi0gICAgICAgIHBvcCA9IFtdLnBvcCwKLSAgICAgICAg
dGhyb3R0bGVycyA9IFtdLAotICAgICAgICBkZWJvdW5jZWVzID0gW10sCi0gICAgICAgIHRpbWVy
cyA9IFtdLAotICAgICAgICBhdXRvcnVuLCBsYXRlclRpbWVyLCBsYXRlclRpbWVyRXhwaXJlc0F0
LAotICAgICAgICBnbG9iYWwgPSB0aGlzLAotICAgICAgICBOVU1CRVIgPSAvXGQrLzsKLQotICAg
IGZ1bmN0aW9uIGlzQ29lcmNhYmxlTnVtYmVyKG51bWJlcikgewotICAgICAgcmV0dXJuIHR5cGVv
ZiBudW1iZXIgPT09ICdudW1iZXInIHx8IE5VTUJFUi50ZXN0KG51bWJlcik7Ci0gICAgfQotCi0g
ICAgZnVuY3Rpb24gQmFja2J1cm5lcihxdWV1ZU5hbWVzLCBvcHRpb25zKSB7Ci0gICAgICB0aGlz
LnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzOwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKLSAgICAgIGlmICghdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZSkgewotICAgICAgICB0
aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlID0gcXVldWVOYW1lc1swXTsKLSAgICAgIH0KLSAgICAg
IHRoaXMuaW5zdGFuY2VTdGFjayA9IFtdOwotICAgIH0KLQotICAgIEJhY2tidXJuZXIucHJvdG90
eXBlID0gewotICAgICAgcXVldWVOYW1lczogbnVsbCwKLSAgICAgIG9wdGlvbnM6IG51bGwsCi0g
ICAgICBjdXJyZW50SW5zdGFuY2U6IG51bGwsCi0gICAgICBpbnN0YW5jZVN0YWNrOiBudWxsLAot
Ci0gICAgICBiZWdpbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBvbkJlZ2luID0gdGhpcy5v
cHRpb25zICYmIHRoaXMub3B0aW9ucy5vbkJlZ2luLAotICAgICAgICAgICAgcHJldmlvdXNJbnN0
YW5jZSA9IHRoaXMuY3VycmVudEluc3RhbmNlOwotCi0gICAgICAgIGlmIChwcmV2aW91c0luc3Rh
bmNlKSB7Ci0gICAgICAgICAgdGhpcy5pbnN0YW5jZVN0YWNrLnB1c2gocHJldmlvdXNJbnN0YW5j
ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG5ldyBEZWZl
cnJlZEFjdGlvblF1ZXVlcyh0aGlzLnF1ZXVlTmFtZXMsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAg
IGlmIChvbkJlZ2luKSB7Ci0gICAgICAgICAgb25CZWdpbih0aGlzLmN1cnJlbnRJbnN0YW5jZSwg
cHJldmlvdXNJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIGVuZDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIHZhciBvbkVuZCA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlv
bnMub25FbmQsCi0gICAgICAgICAgICBjdXJyZW50SW5zdGFuY2UgPSB0aGlzLmN1cnJlbnRJbnN0
YW5jZSwKLSAgICAgICAgICAgIG5leHRJbnN0YW5jZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsK
LSAgICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1c2goKTsKLSAgICAgICAgfSBmaW5hbGx5IHsK
LSAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG51bGw7Ci0KLSAgICAgICAgICBpZiAo
dGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCkgewotICAgICAgICAgICAgbmV4dEluc3RhbmNlID0g
dGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5zdGFu
Y2UgPSBuZXh0SW5zdGFuY2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG9uRW5kKSB7
Ci0gICAgICAgICAgICBvbkVuZChjdXJyZW50SW5zdGFuY2UsIG5leHRJbnN0YW5jZSk7Ci0gICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICBydW46IGZ1bmN0aW9uKHRhcmdl
dCwgbWV0aG9kIC8qLCBhcmdzICovKSB7Ci0gICAgICAgIHZhciByZXQ7Ci0gICAgICAgIHRoaXMu
YmVnaW4oKTsKLQotICAgICAgICBpZiAoIW1ldGhvZCkgewotICAgICAgICAgIG1ldGhvZCA9IHRh
cmdldDsKLSAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0
W21ldGhvZF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmV2ZW50IFNhZmFyaSBkb3VibGUt
ZmluYWxseS4KLSAgICAgICAgdmFyIGZpbmFsbHlBbHJlYWR5Q2FsbGVkID0gZmFsc2U7Ci0gICAg
ICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAg
ICAgICByZXQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikp
OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBtZXRob2QuY2FsbCh0YXJn
ZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoIWZp
bmFsbHlBbHJlYWR5Q2FsbGVkKSB7Ci0gICAgICAgICAgICBmaW5hbGx5QWxyZWFkeUNhbGxlZCA9
IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmVuZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfSwKLQotICAgICAgZGVmZXI6IGZ1bmN0aW9uKHF1
ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QgLyogLCBhcmdzICovKSB7Ci0gICAgICAgIGlmICghbWV0
aG9kKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0OwotICAgICAgICAgIHRhcmdldCA9IG51
bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycp
IHsKLSAgICAgICAgICBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBuZXcgRXJyb3IoKSA6IHVuZGVmaW5lZCwKLSAg
ICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1l
bnRzLCAzKSA6IHVuZGVmaW5lZDsKLSAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkg
eyBjcmVhdGVBdXRvcnVuKHRoaXMpOyB9Ci0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbnN0
YW5jZS5zY2hlZHVsZShxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBmYWxzZSwgc3Rh
Y2spOwotICAgICAgfSwKLQotICAgICAgZGVmZXJPbmNlOiBmdW5jdGlvbihxdWV1ZU5hbWUsIHRh
cmdldCwgbWV0aG9kIC8qICwgYXJncyAqLykgewotICAgICAgICBpZiAoIW1ldGhvZCkgewotICAg
ICAgICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAg
ICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgc3Rh
Y2sgPSB0aGlzLkRFQlVHID8gbmV3IEVycm9yKCkgOiB1bmRlZmluZWQsCi0gICAgICAgICAgICBh
cmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiB1
bmRlZmluZWQ7Ci0gICAgICAgIGlmICghdGhpcy5jdXJyZW50SW5zdGFuY2UpIHsgY3JlYXRlQXV0
b3J1bih0aGlzKTsgfQotICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2Uuc2NoZWR1
bGUocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgdHJ1ZSwgc3RhY2spOwotICAgICAg
fSwKLQotICAgICAgc2V0VGltZW91dDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBhcmdzID0g
c2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICB2YXIgbGVuZ3RoID0gYXJncy5sZW5ndGg7
Ci0gICAgICAgIHZhciBtZXRob2QsIHdhaXQsIHRhcmdldDsKLSAgICAgICAgdmFyIHNlbGYgPSB0
aGlzOwotICAgICAgICB2YXIgbWV0aG9kT3JUYXJnZXQsIG1ldGhvZE9yV2FpdCwgbWV0aG9kT3JB
cmdzOwotCi0gICAgICAgIGlmIChsZW5ndGggPT09IDApIHsKLSAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7Ci0gICAgICAgICAgbWV0aG9kID0gYXJn
cy5zaGlmdCgpOwotICAgICAgICAgIHdhaXQgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGxlbmd0
aCA9PT0gMikgewotICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJnc1swXTsKLSAgICAgICAg
ICBtZXRob2RPcldhaXQgPSBhcmdzWzFdOwotCi0gICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2RP
cldhaXQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mICBtZXRob2RPclRhcmdldFttZXRob2RPcldh
aXRdID09PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7
Ci0gICAgICAgICAgICBtZXRob2QgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgICB3YWl0ID0g
MDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29lcmNhYmxlTnVtYmVyKG1ldGhvZE9yV2FpdCkp
IHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIHdhaXQg
PSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGhvZCA9
IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIHdhaXQgPSAgMDsKLSAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07
Ci0KLSAgICAgICAgICBpZiAoaXNDb2VyY2FibGVOdW1iZXIobGFzdCkpIHsKLSAgICAgICAgICAg
IHdhaXQgPSBhcmdzLnBvcCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1ldGhvZE9yVGFy
Z2V0ID0gYXJnc1swXTsKLSAgICAgICAgICBtZXRob2RPckFyZ3MgPSBhcmdzWzFdOwotCi0gICAg
ICAgICAgaWYgKHR5cGVvZiBtZXRob2RPckFyZ3MgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBt
ZXRob2RPckFyZ3MgPT09ICdzdHJpbmcnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ICE9PSBudWxsICYmCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE9y
QXJncyBpbiBtZXRob2RPclRhcmdldCkpIHsKLSAgICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hp
ZnQoKTsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOwotICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIHZhciBleGVjdXRlQXQgPSAoK25ldyBEYXRlKCkpICsgcGFyc2VJ
bnQod2FpdCwgMTApOwotCi0gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykg
ewotICAgICAgICAgIG1ldGhvZCA9IHRhcmdldFttZXRob2RdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZnVuY3Rpb24gZm4oKSB7Ci0gICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHBvc2l0aW9uIHRvIGluc2VydCAtIFRPRE86
IGJpbmFyeSBzZWFyY2gKLSAgICAgICAgdmFyIGksIGw7Ci0gICAgICAgIGZvciAoaSA9IDAsIGwg
PSB0aW1lcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Ci0gICAgICAgICAgaWYgKGV4ZWN1dGVB
dCA8IHRpbWVyc1tpXSkgeyBicmVhazsgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGltZXJzLnNw
bGljZShpLCAwLCBleGVjdXRlQXQsIGZuKTsKLQotICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNl
bGYsIGV4ZWN1dGVBdCwgd2FpdCk7Ci0KLSAgICAgICAgcmV0dXJuIGZuOwotICAgICAgfSwKLQot
ICAgICAgdGhyb3R0bGU6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywgd2FpdCAq
LykgewotICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCi0gICAgICAgICAgICBhcmdzID0gYXJndW1l
bnRzLAotICAgICAgICAgICAgd2FpdCA9IHBhcnNlSW50KHBvcC5jYWxsKGFyZ3MpLCAxMCksCi0g
ICAgICAgICAgICB0aHJvdHRsZXIsCi0gICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgIHRp
bWVyOwotCi0gICAgICAgIGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCk7Ci0g
ICAgICAgIGlmIChpbmRleCA+IC0xKSB7IHJldHVybiB0aHJvdHRsZXJzW2luZGV4XTsgfSAvLyB0
aHJvdHRsZWQKLQotICAgICAgICB0aW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkg
ewotICAgICAgICAgIHNlbGYucnVuLmFwcGx5KHNlbGYsIGFyZ3MpOwotCi0gICAgICAgICAgdmFy
IGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCk7Ci0gICAgICAgICAgaWYgKGlu
ZGV4ID4gLTEpIHsgdGhyb3R0bGVycy5zcGxpY2UoaW5kZXgsIDEpOyB9Ci0gICAgICAgIH0sIHdh
aXQpOwotCi0gICAgICAgIHRocm90dGxlciA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOwotCi0g
ICAgICAgIHRocm90dGxlcnMucHVzaCh0aHJvdHRsZXIpOwotCi0gICAgICAgIHJldHVybiB0aHJv
dHRsZXI7Ci0gICAgICB9LAotCi0gICAgICBkZWJvdW5jZTogZnVuY3Rpb24odGFyZ2V0LCBtZXRo
b2QgLyogLCBhcmdzLCB3YWl0LCBbaW1tZWRpYXRlXSAqLykgewotICAgICAgICB2YXIgc2VsZiA9
IHRoaXMsCi0gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAotICAgICAgICAgICAgaW1tZWRp
YXRlID0gcG9wLmNhbGwoYXJncyksCi0gICAgICAgICAgICB3YWl0LAotICAgICAgICAgICAgaW5k
ZXgsCi0gICAgICAgICAgICBkZWJvdW5jZWUsCi0gICAgICAgICAgICB0aW1lcjsKLQotICAgICAg
ICBpZiAodHlwZW9mIGltbWVkaWF0ZSA9PT0gIm51bWJlciIgfHwgdHlwZW9mIGltbWVkaWF0ZSA9
PT0gInN0cmluZyIpIHsKLSAgICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOwotICAgICAgICAgIGlt
bWVkaWF0ZSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdhaXQgPSBwb3Au
Y2FsbChhcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAx
MCk7Ci0gICAgICAgIC8vIFJlbW92ZSBkZWJvdW5jZWUKLSAgICAgICAgaW5kZXggPSBmaW5kRGVi
b3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKLQotICAgICAgICBpZiAoaW5kZXggPiAtMSkgewotICAg
ICAgICAgIGRlYm91bmNlZSA9IGRlYm91bmNlZXNbaW5kZXhdOwotICAgICAgICAgIGRlYm91bmNl
ZXMuc3BsaWNlKGluZGV4LCAxKTsKLSAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VlWzJd
KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHsKLSAgICAgICAgICAgIHNlbGYucnVu
LmFwcGx5KHNlbGYsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICB2YXIgaW5kZXggPSBm
aW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKLSAgICAgICAgICBpZiAoaW5kZXggPiAtMSkg
ewotICAgICAgICAgICAgZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOwotICAgICAgICAgIH0K
LSAgICAgICAgfSwgd2FpdCk7Ci0KLSAgICAgICAgaWYgKGltbWVkaWF0ZSAmJiBpbmRleCA9PT0g
LTEpIHsKLSAgICAgICAgICBzZWxmLnJ1bi5hcHBseShzZWxmLCBhcmdzKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOwotCi0gICAgICAg
IGRlYm91bmNlZXMucHVzaChkZWJvdW5jZWUpOwotCi0gICAgICAgIHJldHVybiBkZWJvdW5jZWU7
Ci0gICAgICB9LAotCi0gICAgICBjYW5jZWxUaW1lcnM6IGZ1bmN0aW9uKCkgewotICAgICAgICB2
YXIgaSwgbGVuOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRocm90dGxlcnMubGVuZ3Ro
OyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICBjbGVhclRpbWVvdXQodGhyb3R0bGVyc1tpXVsy
XSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3R0bGVycyA9IFtdOwotCi0gICAgICAgIGZvciAo
aSA9IDAsIGxlbiA9IGRlYm91bmNlZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAg
ICBjbGVhclRpbWVvdXQoZGVib3VuY2Vlc1tpXVsyXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVi
b3VuY2VlcyA9IFtdOwotCi0gICAgICAgIGlmIChsYXRlclRpbWVyKSB7Ci0gICAgICAgICAgY2xl
YXJUaW1lb3V0KGxhdGVyVGltZXIpOwotICAgICAgICAgIGxhdGVyVGltZXIgPSBudWxsOwotICAg
ICAgICB9Ci0gICAgICAgIHRpbWVycyA9IFtdOwotCi0gICAgICAgIGlmIChhdXRvcnVuKSB7Ci0g
ICAgICAgICAgY2xlYXJUaW1lb3V0KGF1dG9ydW4pOwotICAgICAgICAgIGF1dG9ydW4gPSBudWxs
OwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICBoYXNUaW1lcnM6IGZ1bmN0aW9uKCkgewot
ICAgICAgICByZXR1cm4gISF0aW1lcnMubGVuZ3RoIHx8IGF1dG9ydW47Ci0gICAgICB9LAotCi0g
ICAgICBjYW5jZWw6IGZ1bmN0aW9uKHRpbWVyKSB7Ci0gICAgICAgIHZhciB0aW1lclR5cGUgPSB0
eXBlb2YgdGltZXI7Ci0KLSAgICAgICAgaWYgKHRpbWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVj
dCcgJiYgdGltZXIucXVldWUgJiYgdGltZXIubWV0aG9kKSB7IC8vIHdlJ3JlIGNhbmNlbGxpbmcg
YSBkZWZlck9uY2UKLSAgICAgICAgICByZXR1cm4gdGltZXIucXVldWUuY2FuY2VsKHRpbWVyKTsK
LSAgICAgICAgfSBlbHNlIGlmICh0aW1lclR5cGUgPT09ICdmdW5jdGlvbicpIHsgLy8gd2UncmUg
Y2FuY2VsbGluZyBhIHNldFRpbWVvdXQKLSAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRp
bWVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGlmICh0aW1lcnNbaSAr
IDFdID09PSB0aW1lcikgewotICAgICAgICAgICAgICB0aW1lcnMuc3BsaWNlKGksIDIpOyAvLyBy
ZW1vdmUgdGhlIHR3byBlbGVtZW50cwotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2luZG93LnRvU3RyaW5n
LmNhbGwodGltZXIpID09PSAiW29iamVjdCBBcnJheV0iKXsgLy8gd2UncmUgY2FuY2VsbGluZyBh
IHRocm90dGxlIG9yIGRlYm91bmNlCi0gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNlbEl0ZW0o
ZmluZFRocm90dGxlciwgdGhyb3R0bGVycywgdGltZXIpIHx8IAotICAgICAgICAgICAgICAgICAg
IHRoaXMuX2NhbmNlbEl0ZW0oZmluZERlYm91bmNlZSwgZGVib3VuY2VlcywgdGltZXIpOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybjsgLy8gdGltZXIgd2FzIG51bGwgb3Igbm90
IGEgdGltZXIKLSAgICAgICAgfQotICAgICAgfSwKLQotICAgICAgX2NhbmNlbEl0ZW06IGZ1bmN0
aW9uKGZpbmRNZXRob2QsIGFycmF5LCB0aW1lcil7Ci0gICAgICAgIHZhciBpdGVtLAotICAgICAg
ICAgICAgaW5kZXg7Ci0KLSAgICAgICAgaWYgKHRpbWVyLmxlbmd0aCA8IDMpIHsgcmV0dXJuIGZh
bHNlOyB9Ci0KLSAgICAgICAgaW5kZXggPSBmaW5kTWV0aG9kKHRpbWVyWzBdLCB0aW1lclsxXSk7
Ci0KLSAgICAgICAgaWYoaW5kZXggPiAtMSkgewotCi0gICAgICAgICAgaXRlbSA9IGFycmF5W2lu
ZGV4XTsKLQotICAgICAgICAgIGlmKGl0ZW1bMl0gPT09IHRpbWVyWzJdKXsKLSAgICAgICAgICAg
IGFycmF5LnNwbGljZShpbmRleCwgMSk7Ci0gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJb
Ml0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfTsKLQotICAgIEJhY2tidXJu
ZXIucHJvdG90eXBlLnNjaGVkdWxlID0gQmFja2J1cm5lci5wcm90b3R5cGUuZGVmZXI7Ci0gICAg
QmFja2J1cm5lci5wcm90b3R5cGUuc2NoZWR1bGVPbmNlID0gQmFja2J1cm5lci5wcm90b3R5cGUu
ZGVmZXJPbmNlOwotICAgIEJhY2tidXJuZXIucHJvdG90eXBlLmxhdGVyID0gQmFja2J1cm5lci5w
cm90b3R5cGUuc2V0VGltZW91dDsKLQotICAgIGZ1bmN0aW9uIGNyZWF0ZUF1dG9ydW4oYmFja2J1
cm5lcikgewotICAgICAgYmFja2J1cm5lci5iZWdpbigpOwotICAgICAgYXV0b3J1biA9IGdsb2Jh
bC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICBhdXRvcnVuID0gbnVsbDsKLSAgICAg
ICAgYmFja2J1cm5lci5lbmQoKTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHVw
ZGF0ZUxhdGVyVGltZXIoc2VsZiwgZXhlY3V0ZUF0LCB3YWl0KSB7Ci0gICAgICBpZiAoIWxhdGVy
VGltZXIgfHwgZXhlY3V0ZUF0IDwgbGF0ZXJUaW1lckV4cGlyZXNBdCkgewotICAgICAgICBpZiAo
bGF0ZXJUaW1lcikgewotICAgICAgICAgIGNsZWFyVGltZW91dChsYXRlclRpbWVyKTsKLSAgICAg
ICAgfQotICAgICAgICBsYXRlclRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgbGF0ZXJUaW1lciA9IG51bGw7Ci0gICAgICAgICAgbGF0ZXJUaW1lckV4cGly
ZXNBdCA9IG51bGw7Ci0gICAgICAgICAgZXhlY3V0ZVRpbWVycyhzZWxmKTsKLSAgICAgICAgfSwg
d2FpdCk7Ci0gICAgICAgIGxhdGVyVGltZXJFeHBpcmVzQXQgPSBleGVjdXRlQXQ7Ci0gICAgICB9
Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZXhlY3V0ZVRpbWVycyhzZWxmKSB7Ci0gICAgICB2YXIg
bm93ID0gK25ldyBEYXRlKCksCi0gICAgICAgICAgdGltZSwgZm5zLCBpLCBsOwotCi0gICAgICBz
ZWxmLnJ1bihmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gVE9ETzogYmluYXJ5IHNlYXJjaAotICAg
ICAgICBmb3IgKGkgPSAwLCBsID0gdGltZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewotICAg
ICAgICAgIHRpbWUgPSB0aW1lcnNbaV07Ci0gICAgICAgICAgaWYgKHRpbWUgPiBub3cpIHsgYnJl
YWs7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGZucyA9IHRpbWVycy5zcGxpY2UoMCwgaSk7Ci0K
LSAgICAgICAgZm9yIChpID0gMSwgbCA9IGZucy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKLSAg
ICAgICAgICBzZWxmLnNjaGVkdWxlKHNlbGYub3B0aW9ucy5kZWZhdWx0UXVldWUsIG51bGwsIGZu
c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBpZiAodGltZXJzLmxlbmd0aCkg
ewotICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNlbGYsIHRpbWVyc1swXSwgdGltZXJzWzBdIC0g
bm93KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmaW5kRGVib3VuY2VlKHRhcmdl
dCwgbWV0aG9kKSB7Ci0gICAgICB2YXIgZGVib3VuY2VlLAotICAgICAgICAgIGluZGV4ID0gLTE7
Ci0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVib3VuY2Vlcy5sZW5ndGg7IGkgPCBsOyBp
KyspIHsKLSAgICAgICAgZGVib3VuY2VlID0gZGVib3VuY2Vlc1tpXTsKLSAgICAgICAgaWYgKGRl
Ym91bmNlZVswXSA9PT0gdGFyZ2V0ICYmIGRlYm91bmNlZVsxXSA9PT0gbWV0aG9kKSB7Ci0gICAg
ICAgICAgaW5kZXggPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0K
LSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmaW5kVGhyb3R0bGVy
KHRhcmdldCwgbWV0aG9kKSB7Ci0gICAgICB2YXIgdGhyb3R0bGVyLAotICAgICAgICAgIGluZGV4
ID0gLTE7Ci0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhyb3R0bGVycy5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKLSAgICAgICAgdGhyb3R0bGVyID0gdGhyb3R0bGVyc1tpXTsKLSAgICAgICAg
aWYgKHRocm90dGxlclswXSA9PT0gdGFyZ2V0ICYmIHRocm90dGxlclsxXSA9PT0gbWV0aG9kKSB7
Ci0gICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICB9Ci0KLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLQotICAgIF9fZXhwb3J0c19fLkJh
Y2tidXJuZXIgPSBCYWNrYnVybmVyOwotICB9KTsKLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci12YXIgb25CZWdpbiA9IGZ1bmN0aW9uKGN1cnJlbnQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRS
dW5Mb29wID0gY3VycmVudDsKLX07Ci0KLXZhciBvbkVuZCA9IGZ1bmN0aW9uKGN1cnJlbnQsIG5l
eHQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gbmV4dDsKLX07Ci0KLXZhciBCYWNr
YnVybmVyID0gcmVxdWlyZU1vZHVsZSgnYmFja2J1cm5lcicpLkJhY2tidXJuZXIsCi0gICAgYmFj
a2J1cm5lciA9IG5ldyBCYWNrYnVybmVyKFsnc3luYycsICdhY3Rpb25zJywgJ2Rlc3Ryb3knXSwg
ewotICAgICAgc3luYzogewotICAgICAgICBiZWZvcmU6IEVtYmVyLmJlZ2luUHJvcGVydHlDaGFu
Z2VzLAotICAgICAgICBhZnRlcjogRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzCi0gICAgICB9LAot
ICAgICAgZGVmYXVsdFF1ZXVlOiAnYWN0aW9ucycsCi0gICAgICBvbkJlZ2luOiBvbkJlZ2luLAot
ICAgICAgb25FbmQ6IG9uRW5kCi0gICAgfSksCi0gICAgc2xpY2UgPSBbXS5zbGljZTsKLQotLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotLy8gRW1iZXIucnVuIC0gdGhpcyBpcyBpZGVhbGx5IHRoZSBvbmx5IHB1YmxpYyBBUEkgdGhl
IGRldiBzZWVzCi0vLwotCi0vKioKLSAgUnVucyB0aGUgcGFzc2VkIHRhcmdldCBhbmQgbWV0aG9k
IGluc2lkZSBvZiBhIFJ1bkxvb3AsIGVuc3VyaW5nIGFueQotICBkZWZlcnJlZCBhY3Rpb25zIGlu
Y2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBkYXRlcyBhcmUgZmx1c2hlZCBhdCB0aGUKLSAg
ZW5kLgotCi0gIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQgdG8gaW52b2tlIHRoaXMgbWV0
aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCi0gIHlvdSBhcmUgaW1wbGVtZW50aW5nIHJhdyBldmVu
dCBoYW5kbGVycyB3aGVuIGludGVyZmFjaW5nIHdpdGggb3RoZXIKLSAgbGlicmFyaWVzIG9yIHBs
dWdpbnMsIHlvdSBzaG91bGQgcHJvYmFibHkgd3JhcCBhbGwgb2YgeW91ciBjb2RlIGluc2lkZSB0
aGlzCi0gIGNhbGwuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7
Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3AKLSAgfSk7Ci0gIGBg
YAotCi0gIEBjbGFzcyBydW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0gIEBjb25z
dHJ1Y3RvcgotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBj
YWxsCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGludm9rZS4K
LSAgICBNYXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcK
LSAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgotICBA
cGFyYW0ge09iamVjdH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgeW91IHdpc2gg
dG8gcGFzcyB0byB0aGUgbWV0aG9kLgotICBAcmV0dXJuIHtPYmplY3R9IHJldHVybiB2YWx1ZSBm
cm9tIGludm9raW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24uCi0qLwotRW1iZXIucnVuID0gZnVuY3Rp
b24odGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIHJldDsKLQotICBpZiAoRW1iZXIub25lcnJvcikg
ewotICAgIHRyeSB7Ci0gICAgICByZXQgPSBiYWNrYnVybmVyLnJ1bi5hcHBseShiYWNrYnVybmVy
LCBhcmd1bWVudHMpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIEVtYmVyLm9uZXJyb3IoZSk7
Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldCA9IGJhY2tidXJuZXIucnVuLmFwcGx5KGJhY2ti
dXJuZXIsIGFyZ3VtZW50cyk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfTsKLQotLyoqCi0gIElm
IG5vIHJ1bi1sb29wIGlzIHByZXNlbnQsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBJZiBhIHJ1biBs
b29wIGlzCi0gIHByZXNlbnQgaXQgd2lsbCBxdWV1ZSBpdHNlbGYgdG8gcnVuIG9uIHRoZSBleGlz
dGluZyBydW4tbG9vcHMgYWN0aW9uCi0gIHF1ZXVlLgotCi0gIFBsZWFzZSBub3RlOiBUaGlzIGlz
IG5vdCBmb3Igbm9ybWFsIHVzYWdlLCBhbmQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi0g
IElmIGludm9rZWQgd2hlbiBub3Qgd2l0aGluIGEgcnVuIGxvb3A6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5ydW4uam9pbihmdW5jdGlvbigpIHsKLSAgICAvLyBjcmVhdGVzIGEgbmV3IHJ1
bi1sb29wCi0gIH0pOwotICBgYGAKLQotICBBbHRlcm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGlu
IGFuIGV4aXN0aW5nIHJ1biBsb29wOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVuKGZ1
bmN0aW9uKCkgewotICAgIC8vIGNyZWF0ZXMgYSBuZXcgcnVuLWxvb3AKLSAgICBFbWJlci5ydW4u
am9pbihmdW5jdGlvbigpIHsKLSAgICAgIC8vIGpvaW5zIHdpdGggdGhlIGV4aXN0aW5nIHJ1bi1s
b29wLCBhbmQgcXVldWVzIGZvciBpbnZvY2F0aW9uIG9uCi0gICAgICAvLyB0aGUgZXhpc3Rpbmcg
cnVuLWxvb3BzIGFjdGlvbiBxdWV1ZS4KLSAgICB9KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRo
b2Qgam9pbgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0
YXJnZXQgb2YgbWV0aG9kIHRvIGNhbGwKLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhv
ZCBNZXRob2QgdG8gaW52b2tlLgotICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJ
ZiB5b3UgcGFzcyBhIHN0cmluZwotICAgIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhl
IHBhc3NlZCB0YXJnZXQuCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFs
IGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCi0gIEByZXR1cm4ge09i
amVjdH0gUmV0dXJuIHZhbHVlIGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4gUGxl
YXNlIG5vdGUsCi0gIHdoZW4gY2FsbGVkIHdpdGhpbiBhbiBleGlzdGluZyBsb29wLCBubyByZXR1
cm4gdmFsdWUgaXMgcG9zc2libGUuCi0qLwotRW1iZXIucnVuLmpvaW4gPSBmdW5jdGlvbih0YXJn
ZXQsIG1ldGhvZCkgewotICBpZiAoIUVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCkgewotICAgIHJl
dHVybiBFbWJlci5ydW4uYXBwbHkoRW1iZXIucnVuLCBhcmd1bWVudHMpOwotICB9Ci0KLSAgdmFy
IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3MudW5zaGlmdCgnYWN0aW9ucycp
OwotICBFbWJlci5ydW4uc2NoZWR1bGUuYXBwbHkoRW1iZXIucnVuLCBhcmdzKTsKLX07Ci0KLUVt
YmVyLnJ1bi5iYWNrYnVybmVyID0gYmFja2J1cm5lcjsKLQotdmFyIHJ1biA9IEVtYmVyLnJ1bjsK
LQotRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gbnVsbDsKLQotRW1iZXIucnVuLnF1ZXVlcyA9
IGJhY2tidXJuZXIucXVldWVOYW1lczsKLQotLyoqCi0gIEJlZ2lucyBhIG5ldyBSdW5Mb29wLiBB
bnkgZGVmZXJyZWQgYWN0aW9ucyBpbnZva2VkIGFmdGVyIHRoZSBiZWdpbiB3aWxsCi0gIGJlIGJ1
ZmZlcmVkIHVudGlsIHlvdSBpbnZva2UgYSBtYXRjaGluZyBjYWxsIHRvIGBFbWJlci5ydW4uZW5k
KClgLiBUaGlzIGlzCi0gIGEgbG93ZXItbGV2ZWwgd2F5IHRvIHVzZSBhIFJ1bkxvb3AgaW5zdGVh
ZCBvZiB1c2luZyBgRW1iZXIucnVuKClgLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVu
LmJlZ2luKCk7Ci0gIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wCi0gIEVt
YmVyLnJ1bi5lbmQoKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBiZWdpbgotICBAcmV0dXJuIHt2b2lk
fQotKi8KLUVtYmVyLnJ1bi5iZWdpbiA9IGZ1bmN0aW9uKCkgewotICBiYWNrYnVybmVyLmJlZ2lu
KCk7Ci19OwotCi0vKioKLSAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBjYWxsZWQgc29t
ZXRpbWUgYWZ0ZXIgeW91IGNhbGwKLSAgYEVtYmVyLnJ1bi5iZWdpbigpYCB0byBmbHVzaCBhbnkg
ZGVmZXJyZWQgYWN0aW9ucy4gVGhpcyBpcyBhIGxvd2VyLWxldmVsIHdheQotICB0byB1c2UgYSBS
dW5Mb29wIGluc3RlYWQgb2YgdXNpbmcgYEVtYmVyLnJ1bigpYC4KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLnJ1bi5iZWdpbigpOwotICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGUgd2l0aGluIGEg
UnVuTG9vcAotICBFbWJlci5ydW4uZW5kKCk7Ci0gIGBgYAotCi0gIEBtZXRob2QgZW5kCi0gIEBy
ZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLmVuZCA9IGZ1bmN0aW9uKCkgewotICBiYWNrYnVy
bmVyLmVuZCgpOwotfTsKLQotLyoqCi0gIEFycmF5IG9mIG5hbWVkIHF1ZXVlcy4gVGhpcyBhcnJh
eSBkZXRlcm1pbmVzIHRoZSBvcmRlciBpbiB3aGljaCBxdWV1ZXMKLSAgYXJlIGZsdXNoZWQgYXQg
dGhlIGVuZCBvZiB0aGUgUnVuTG9vcC4gWW91IGNhbiBkZWZpbmUgeW91ciBvd24gcXVldWVzIGJ5
Ci0gIHNpbXBseSBhZGRpbmcgdGhlIHF1ZXVlIG5hbWUgdG8gdGhpcyBhcnJheS4gTm9ybWFsbHkg
eW91IHNob3VsZCBub3QgbmVlZAotICB0byBpbnNwZWN0IG9yIG1vZGlmeSB0aGlzIHByb3BlcnR5
LgotCi0gIEBwcm9wZXJ0eSBxdWV1ZXMKLSAgQHR5cGUgQXJyYXkKLSAgQGRlZmF1bHQgWydzeW5j
JywgJ2FjdGlvbnMnLCAnZGVzdHJveSddCi0qLwotCi0vKioKLSAgQWRkcyB0aGUgcGFzc2VkIHRh
cmdldC9tZXRob2QgYW5kIGFueSBvcHRpb25hbCBhcmd1bWVudHMgdG8gdGhlIG5hbWVkCi0gIHF1
ZXVlIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhlIFJ1bkxvb3AuIElmIHlvdSBoYXZl
IG5vdCBhbHJlYWR5Ci0gIHN0YXJ0ZWQgYSBSdW5Mb29wIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhv
ZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UKLSAgYXV0b21hdGljYWxseS4KLQotICBBdCB0
aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMgc2NoZWR1bGVkIGluIHRoaXMgd2F5IHdp
bGwgYmUgaW52b2tlZC4KLSAgTWV0aG9kcyB3aWxsIGJlIGludm9rZWQgaW4gYW4gb3JkZXIgbWF0
Y2hpbmcgdGhlIG5hbWVkIHF1ZXVlcyBkZWZpbmVkIGluCi0gIHRoZSBgRW1iZXIucnVuLnF1ZXVl
c2AgcHJvcGVydHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4uc2NoZWR1bGUoJ3N5
bmMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgaW4g
dGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4gYmluZGluZ3MgYXJlIHN5bmNlZAotICAgIGNv
bnNvbGUubG9nKCJzY2hlZHVsZWQgb24gc3luYyBxdWV1ZSIpOwotICB9KTsKLQotICBFbWJlci5y
dW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAvLyB0aGlzIHdp
bGwgYmUgZXhlY3V0ZWQgaW4gdGhlICdhY3Rpb25zJyBxdWV1ZSwgYWZ0ZXIgYmluZGluZ3MgaGF2
ZSBzeW5jZWQuCi0gICAgY29uc29sZS5sb2coInNjaGVkdWxlZCBvbiBhY3Rpb25zIHF1ZXVlIik7
Ci0gIH0pOwotCi0gIC8vIE5vdGUgdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBi
YXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4KLSAgLy8gT3V0cHV0IHdvdWxkIGJlOgotICAv
LyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlCi0gIC8vICAgc2NoZWR1bGVkIG9uIGFjdGlvbnMg
cXVldWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBzY2hlZHVsZQotICBAcGFyYW0ge1N0cmluZ30gcXVl
dWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIHNjaGVkdWxlIGFnYWluc3QuCi0gICAgRGVmYXVs
dCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlvbnMnCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFy
Z2V0XSB0YXJnZXQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgY29udGV4dCB3aGVuIGludm9raW5nIGEg
bWV0aG9kLgotICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBtZXRob2QgdG8g
aW52b2tlLiBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdAotICAgIHdpbGwgYmUgcmVzb2x2ZWQgb24g
dGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIHRpbWUgdGhlIHNjaGVkdWxlZCBpdGVtIGlzCi0gICAg
aW52b2tlZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZnVuY3Rpb24uCi0gIEBw
YXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3Nl
ZCB0byB0aGUgcXVldWVkIG1ldGhvZC4KLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5ydW4u
c2NoZWR1bGUgPSBmdW5jdGlvbihxdWV1ZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgY2hlY2tBdXRv
UnVuKCk7Ci0gIGJhY2tidXJuZXIuc2NoZWR1bGUuYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRz
KTsKLX07Ci0KLS8vIFVzZWQgYnkgZ2xvYmFsIHRlc3QgdGVhcmRvd24KLUVtYmVyLnJ1bi5oYXNT
Y2hlZHVsZWRUaW1lcnMgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIGJhY2tidXJuZXIuaGFzVGlt
ZXJzKCk7Ci19OwotCi0vLyBVc2VkIGJ5IGdsb2JhbCB0ZXN0IHRlYXJkb3duCi1FbWJlci5ydW4u
Y2FuY2VsVGltZXJzID0gZnVuY3Rpb24gKCkgewotICBiYWNrYnVybmVyLmNhbmNlbFRpbWVycygp
OwotfTsKLQotLyoqCi0gIEltbWVkaWF0ZWx5IGZsdXNoZXMgYW55IGV2ZW50cyBzY2hlZHVsZWQg
aW4gdGhlICdzeW5jJyBxdWV1ZS4gQmluZGluZ3MKLSAgdXNlIHRoaXMgcXVldWUgc28gdGhpcyBt
ZXRob2QgaXMgYSB1c2VmdWwgd2F5IHRvIGltbWVkaWF0ZWx5IGZvcmNlIGFsbAotICBiaW5kaW5n
cyBpbiB0aGUgYXBwbGljYXRpb24gdG8gc3luYy4KLQotICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBt
ZXRob2QgYW55dGltZSB5b3UgbmVlZCBhbnkgY2hhbmdlZCBzdGF0ZSB0byBwcm9wYWdhdGUKLSAg
dGhyb3VnaG91dCB0aGUgYXBwIGltbWVkaWF0ZWx5IHdpdGhvdXQgcmVwYWludGluZyB0aGUgVUkg
KHdoaWNoIGhhcHBlbnMKLSAgaW4gdGhlIGxhdGVyICdyZW5kZXInIHF1ZXVlIGFkZGVkIGJ5IHRo
ZSBgZW1iZXItdmlld3NgIHBhY2thZ2UpLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVu
LnN5bmMoKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBzeW5jCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwot
RW1iZXIucnVuLnN5bmMgPSBmdW5jdGlvbigpIHsKLSAgaWYgKGJhY2tidXJuZXIuY3VycmVudElu
c3RhbmNlKSB7Ci0gICAgYmFja2J1cm5lci5jdXJyZW50SW5zdGFuY2UucXVldWVzLnN5bmMuZmx1
c2goKTsKLSAgfQotfTsKLQotLyoqCi0gIEludm9rZXMgdGhlIHBhc3NlZCB0YXJnZXQvbWV0aG9k
IGFuZCBvcHRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgYSBzcGVjaWZpZWQKLSAgcGVyaW9kIGlmIHRp
bWUuIFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBhIG51
bWJlcgotICBvZiBtaWxsaXNlY29uZHMuCi0KLSAgWW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qg
d2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUgYWN0aW9uIGFmdGVyIGEKLSAgcGVyaW9kIG9m
IHRpbWUgaW5zdGVhZCBvZiB1c2luZyBgc2V0VGltZW91dCgpYC4gVGhpcyBtZXRob2Qgd2lsbCBl
bnN1cmUgdGhhdAotICBpdGVtcyB0aGF0IGV4cGlyZSBkdXJpbmcgdGhlIHNhbWUgc2NyaXB0IGV4
ZWN1dGlvbiBjeWNsZSBhbGwgZXhlY3V0ZQotICB0b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9y
ZSBlZmZpY2llbnQgdGhhbiB1c2luZyBhIHJlYWwgc2V0VGltZW91dC4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEVtYmVyLnJ1bi5sYXRlcihteUNvbnRleHQsIGZ1bmN0aW9uKCkgewotICAgIC8vIGNv
ZGUgaGVyZSB3aWxsIGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcCBpbiBhYm91dCA1MDBtcyB3aXRo
IHRoaXMgPT0gbXlDb250ZXh0Ci0gIH0sIDUwMCk7Ci0gIGBgYAotCi0gIEBtZXRob2QgbGF0ZXIK
LSAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCi0g
IEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCi0g
ICAgSWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKLSAgICB0
YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgotICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAg
QHBhcmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBA
cmV0dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHlvdSBjYW4gdXNlIHRvIGNhbmNlbCB0aGUgdGltZXIg
aW4KLSAgICBgRW1iZXIucnVuLmNhbmNlbGAgbGF0ZXIuCi0qLwotRW1iZXIucnVuLmxhdGVyID0g
ZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBw
bHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBTY2hlZHVsZSBhIGZ1bmN0
aW9uIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhlIGN1cnJlbnQgUnVuTG9vcC4gVGhpcyBpcyBl
cXVpdmFsZW50Ci0gIHRvIGNhbGxpbmcgYHNjaGVkdWxlT25jZWAgd2l0aCB0aGUgImFjdGlvbnMi
IHF1ZXVlLgotCi0gIEBtZXRob2Qgb25jZQotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhl
IHRhcmdldCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJp
bmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBJZiB5b3UgcGFzcyBhIHN0cmlu
ZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQotICAgIHRhcmdldCBhdCB0aGUgdGltZSB0aGUg
bWV0aG9kIGlzIGludm9rZWQuCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFy
Z3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgotICBAcmV0dXJuIHtPYmplY3R9IHRpbWVy
Ci0qLwotRW1iZXIucnVuLm9uY2UgPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgewotICBjaGVj
a0F1dG9SdW4oKTsKLSAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3Mu
dW5zaGlmdCgnYWN0aW9ucycpOwotICByZXR1cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2UuYXBw
bHkoYmFja2J1cm5lciwgYXJncyk7Ci19OwotCi0vKioKLSAgU2NoZWR1bGVzIGEgZnVuY3Rpb24g
dG8gcnVuIG9uZSB0aW1lIGluIGEgZ2l2ZW4gcXVldWUgb2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4K
LSAgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHF1ZXVlL3RhcmdldC9tZXRob2Qg
Y29tYmluYXRpb24gd2lsbCBoYXZlCi0gIG5vIGVmZmVjdCAocGFzdCB0aGUgaW5pdGlhbCBjYWxs
KS4KLQotICBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IGNhbiBwYXNzIG9wdGlvbmFsIGFyZ3VtZW50
cyB0aGVzZSB3aWxsIG5vdCBiZQotICBjb25zaWRlcmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGlj
YXRlcy4gTmV3IGFyZ3VtZW50cyB3aWxsIHJlcGxhY2UgcHJldmlvdXMKLSAgY2FsbHMuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNheUhpID0g
ZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdoaScpOyB9Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxl
T25jZSgnYWZ0ZXJSZW5kZXInLCBteUNvbnRleHQsIHNheUhpKTsKLSAgICBFbWJlci5ydW4uc2No
ZWR1bGVPbmNlKCdhZnRlclJlbmRlcicsIG15Q29udGV4dCwgc2F5SGkpOwotICAgIC8vIHNheUhp
IHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlLCBpbiB0aGUgYWZ0ZXJSZW5kZXIgcXVldWUgb2Yg
dGhlIFJ1bkxvb3AKLSAgfSk7Ci0gIGBgYAotCi0gIEFsc28gbm90ZSB0aGF0IHBhc3NpbmcgYW4g
YW5vbnltb3VzIGZ1bmN0aW9uIHRvIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNlYCB3aWxsCi0gIG5v
dCBwcmV2ZW50IGFkZGl0aW9uYWwgY2FsbHMgd2l0aCBhbiBpZGVudGljYWwgYW5vbnltb3VzIGZ1
bmN0aW9uIGZyb20KLSAgc2NoZWR1bGluZyB0aGUgaXRlbXMgbXVsdGlwbGUgdGltZXMsIGUuZy46
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBmdW5jdGlvbiBzY2hlZHVsZUl0KCkgewotICAgIEVtYmVy
LnJ1bi5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCBteUNvbnRleHQsIGZ1bmN0aW9uKCkgeyBjb25z
b2xlLmxvZygiQ2xvc3VyZSIpOyB9KTsKLSAgfQotICBzY2hlZHVsZUl0KCk7Ci0gIHNjaGVkdWxl
SXQoKTsKLSAgLy8gIkNsb3N1cmUiIHdpbGwgcHJpbnQgdHdpY2UsIGV2ZW4gdGhvdWdoIHdlJ3Jl
IHVzaW5nIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNlYCwKLSAgLy8gYmVjYXVzZSB0aGUgZnVuY3Rp
b24gd2UgcGFzcyB0byBpdCBpcyBhbm9ueW1vdXMgYW5kIHdvbid0IG1hdGNoIHRoZQotICAvLyBw
cmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24uCi0gIGBgYAotCi0gIEF2YWlsYWJsZSBxdWV1
ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZvdW5kIGF0IGBFbWJlci5ydW4ucXVldWVzYAot
Ci0gIEBtZXRob2Qgc2NoZWR1bGVPbmNlCi0gIEBwYXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBu
YW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBhZ2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUg
J3N5bmMnIGFuZCAnYWN0aW9ucycuCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFy
Z2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30g
bWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0
IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRo
b2QgaXMgaW52b2tlZC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1l
bnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0gdGltZXIKLSov
Ci1FbWJlci5ydW4uc2NoZWR1bGVPbmNlID0gZnVuY3Rpb24ocXVldWUsIHRhcmdldCwgbWV0aG9k
KSB7Ci0gIGNoZWNrQXV0b1J1bigpOwotICByZXR1cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2Uu
YXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBTY2hlZHVsZXMgYW4g
aXRlbSB0byBydW4gZnJvbSB3aXRoaW4gYSBzZXBhcmF0ZSBydW4gbG9vcCwgYWZ0ZXIKLSAgY29u
dHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiBUaGlzIGlzIGVxdWl2YWxlbnQg
dG8gY2FsbGluZwotICBgRW1iZXIucnVuLmxhdGVyYCB3aXRoIGEgd2FpdCB0aW1lIG9mIDFtcy4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bi5uZXh0KG15Q29udGV4dCwgZnVuY3Rpb24o
KSB7Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlZCBpbiB0aGUgbmV4dCBydW4gbG9vcCwKLSAg
ICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3VycmVudCBvbmUKLSAgfSk7
Ci0gIGBgYAotCi0gIE11bHRpcGxlIG9wZXJhdGlvbnMgc2NoZWR1bGVkIHdpdGggYEVtYmVyLnJ1
bi5uZXh0YCB3aWxsIGNvYWxlc2NlCi0gIGludG8gdGhlIHNhbWUgbGF0ZXIgcnVuIGxvb3AsIGFs
b25nIHdpdGggYW55IG90aGVyIG9wZXJhdGlvbnMKLSAgc2NoZWR1bGVkIGJ5IGBFbWJlci5ydW4u
bGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQotICB0aW1lIHRoYXQgYEVt
YmVyLnJ1bi5uZXh0YCBvcGVyYXRpb25zIHdpbGwgZmlyZS4KLQotICBOb3RlIHRoYXQgdGhlcmUg
YXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0byB1c2luZyBgRW1iZXIucnVuLm5leHRgLgotICBGb3Ig
aW5zdGFuY2UsIGlmIHlvdSdkIGxpa2UgdG8gc2NoZWR1bGUgYW4gb3BlcmF0aW9uIHRvIGhhcHBl
bgotICBhZnRlciBhbGwgRE9NIGVsZW1lbnQgb3BlcmF0aW9ucyBoYXZlIGNvbXBsZXRlZCB3aXRo
aW4gdGhlIGN1cnJlbnQKLSAgcnVuIGxvb3AsIHlvdSBjYW4gbWFrZSB1c2Ugb2YgdGhlIGBhZnRl
clJlbmRlcmAgcnVuIGxvb3AgcXVldWUgKGFkZGVkCi0gIGJ5IHRoZSBgZW1iZXItdmlld3NgIHBh
Y2thZ2UsIGFsb25nIHdpdGggdGhlIHByZWNlZGluZyBgcmVuZGVyYCBxdWV1ZQotICB3aGVyZSBh
bGwgdGhlIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGFwcGVuKS4gRXhhbXBsZToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIEFwcC5NeUNvbGxlY3Rpb25WaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcu
ZXh0ZW5kKHsKLSAgICBkaWRJbnNlcnRFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVy
LnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgdGhpcywgJ3Byb2Nlc3NDaGlsZEVsZW1l
bnRzJyk7Ci0gICAgfSwKLSAgICBwcm9jZXNzQ2hpbGRFbGVtZW50czogZnVuY3Rpb24oKSB7Ci0g
ICAgICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGggY29sbGVjdGlvblZpZXcncyBjaGlsZCB2aWV3
Ci0gICAgICAvLyBlbGVtZW50cyBhZnRlciB0aGV5J3ZlIGZpbmlzaGVkIHJlbmRlcmluZywgd2hp
Y2gKLSAgICAgIC8vIGNhbid0IGJlIGRvbmUgd2l0aGluIHRoZSBDb2xsZWN0aW9uVmlldydzCi0g
ICAgICAvLyBgZGlkSW5zZXJ0RWxlbWVudGAgaG9vayBiZWNhdXNlIHRoYXQgZ2V0cyBydW4KLSAg
ICAgIC8vIGJlZm9yZSB0aGUgY2hpbGQgZWxlbWVudHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBE
T00uCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgT25lIGJlbmVmaXQgb2YgdGhlIGFib3ZlIGFw
cHJvYWNoIGNvbXBhcmVkIHRvIHVzaW5nIGBFbWJlci5ydW4ubmV4dGAgaXMKLSAgdGhhdCB5b3Ug
d2lsbCBiZSBhYmxlIHRvIHBlcmZvcm0gRE9NL0NTUyBvcGVyYXRpb25zIGJlZm9yZSB1bnByb2Nl
c3NlZAotICBlbGVtZW50cyBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlbiwgd2hpY2ggbWF5IHBy
ZXZlbnQgZmxpY2tlcmluZyBvcgotICBvdGhlciBhcnRpZmFjdHMgY2F1c2VkIGJ5IGRlbGF5aW5n
IHByb2Nlc3NpbmcgdW50aWwgYWZ0ZXIgcmVuZGVyaW5nLgotCi0gIFRoZSBvdGhlciBtYWpvciBi
ZW5lZml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0IGBFbWJlci5ydW4ubmV4dGAKLSAg
aW50cm9kdWNlcyBhbiBlbGVtZW50IG9mIG5vbi1kZXRlcm1pbmlzbSwgd2hpY2ggY2FuIG1ha2Ug
dGhpbmdzIG11Y2gKLSAgaGFyZGVyIHRvIHRlc3QsIGR1ZSB0byBpdHMgcmVsaWFuY2Ugb24gYHNl
dFRpbWVvdXRgOyBpdCdzIG11Y2ggaGFyZGVyCi0gIHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Yg
c2NoZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBzY2hlZHVsZWQKLSAgb3V0c2lkZSBv
ZiB0aGUgY3VycmVudCBydW4gbG9vcCwgaS5lLiB3aXRoIGBFbWJlci5ydW4ubmV4dGAuCi0KLSAg
QG1ldGhvZCBuZXh0Ci0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9k
IHRvIGludm9rZQotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2Qg
dG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQg
b24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KLSAg
QHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhl
IHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0gdGltZXIKLSovCi1FbWJlci5ydW4ubmV4dCA9
IGZ1bmN0aW9uKCkgewotICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgYXJn
cy5wdXNoKDEpOwotICByZXR1cm4gYmFja2J1cm5lci5sYXRlci5hcHBseShiYWNrYnVybmVyLCBh
cmdzKTsKLX07Ci0KLS8qKgotICBDYW5jZWxzIGEgc2NoZWR1bGVkIGl0ZW0uIE11c3QgYmUgYSB2
YWx1ZSByZXR1cm5lZCBieSBgRW1iZXIucnVuLmxhdGVyKClgLAotICBgRW1iZXIucnVuLm9uY2Uo
KWAsIG9yIGBFbWJlci5ydW4ubmV4dCgpYC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBydW5O
ZXh0ID0gRW1iZXIucnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKLSAgICAvLyB3aWxs
IG5vdCBiZSBleGVjdXRlZAotICB9KTsKLSAgRW1iZXIucnVuLmNhbmNlbChydW5OZXh0KTsKLQot
ICB2YXIgcnVuTGF0ZXIgPSBFbWJlci5ydW4ubGF0ZXIobXlDb250ZXh0LCBmdW5jdGlvbigpIHsK
LSAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAotICB9LCA1MDApOwotICBFbWJlci5ydW4uY2Fu
Y2VsKHJ1bkxhdGVyKTsKLQotICB2YXIgcnVuT25jZSA9IEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4
dCwgZnVuY3Rpb24oKSB7Ci0gICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKLSAgfSk7Ci0gIEVt
YmVyLnJ1bi5jYW5jZWwocnVuT25jZSk7Ci0gIGBgYAotCi0gIEBtZXRob2QgY2FuY2VsCi0gIEBw
YXJhbSB7T2JqZWN0fSB0aW1lciBUaW1lciBvYmplY3QgdG8gY2FuY2VsCi0gIEByZXR1cm4ge3Zv
aWR9Ci0qLwotRW1iZXIucnVuLmNhbmNlbCA9IGZ1bmN0aW9uKHRpbWVyKSB7Ci0gIHJldHVybiBi
YWNrYnVybmVyLmNhbmNlbCh0aW1lcik7Ci19OwotCi0vKioKLSAgRGVsYXkgY2FsbGluZyB0aGUg
dGFyZ2V0IG1ldGhvZCB1bnRpbCB0aGUgZGVib3VuY2UgcGVyaW9kIGhhcyBlbGFwc2VkCi0gIHdp
dGggbm8gYWRkaXRpb25hbCBkZWJvdW5jZSBjYWxscy4gSWYgYGRlYm91bmNlYCBpcyBjYWxsZWQg
YWdhaW4gYmVmb3JlCi0gIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwgdGhlIHRpbWVy
IGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBlcmlvZAotICBtdXN0IHBhc3MgYWdhaW4gYmVmb3Jl
IHRoZSB0YXJnZXQgbWV0aG9kIGlzIGNhbGxlZC4KLQotICBUaGlzIG1ldGhvZCBzaG91bGQgYmUg
dXNlZCB3aGVuIGFuIGV2ZW50IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKLSAgYnV0IHRo
ZSBhY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgZXZlbnQgaXMgZG9u
ZSBmaXJpbmcuCi0gIEEgY29tbW9uIGV4YW1wbGUgaXMgZm9yIHNjcm9sbCBldmVudHMgd2hlcmUg
eW91IG9ubHkgd2FudCB1cGRhdGVzIHRvCi0gIGhhcHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vh
c2VkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNv
bnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OwotICAgIHZhciBteUNvbnRleHQgPSB7
bmFtZTogJ2RlYm91bmNlJ307Ci0KLSAgICBFbWJlci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBt
eUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyBsZXNzIHRoYW4gMTUwbXMgcGFzc2VzCi0KLSAgICBFbWJl
ci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyAxNTBtcyBw
YXNzZXMKLSAgICAvLyBteUZ1bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0Ci0g
ICAgLy8gY29uc29sZSBsb2dzICdkZWJvdW5jZSByYW4uJyBvbmUgdGltZS4KLSAgYGBgCi0KLSAg
QG1ldGhvZCBkZWJvdW5jZQotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1l
dGhvZCB0byBpbnZva2UKLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0
aG9kIHRvIGludm9rZS4KLSAgICBNYXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91
IHBhc3MgYSBzdHJpbmcKLSAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNz
ZWQgdGFyZ2V0LgotICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMg
dG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAgQHBhcmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9m
IG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZSBUcmln
Z2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGluZyBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZyBl
ZGdlIG9mIHRoZSB3YWl0IGludGVydmFsLgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1
bi5kZWJvdW5jZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gYmFja2J1cm5lci5kZWJvdW5jZS5h
cHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwotfTsKLQotLyoqCi0gIEVuc3VyZSB0aGF0IHRo
ZSB0YXJnZXQgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbgotICB0
aGUgc3BlY2lmaWVkIHNwYWNpbmcgcGVyaW9kLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgICB2YXIg
bXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9
OwotICAgIHZhciBteUNvbnRleHQgPSB7bmFtZTogJ3Rocm90dGxlJ307Ci0KLSAgICBFbWJlci5y
dW4udGhyb3R0bGUobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyA1MG1zIHBhc3Nl
cwotICAgIEVtYmVyLnJ1bi50aHJvdHRsZShteUNvbnRleHQsIG15RnVuYywgMTUwKTsKLQotICAg
IC8vIDUwbXMgcGFzc2VzCi0gICAgRW1iZXIucnVuLnRocm90dGxlKG15Q29udGV4dCwgbXlGdW5j
LCAxNTApOwotCi0gICAgLy8gNTBtcyBwYXNzZXMKLSAgICBFbWJlci5ydW4udGhyb3R0bGUobXlD
b250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyAxNTBtcyBwYXNzZXMKLSAgICAvLyBteUZ1
bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0Ci0gICAgLy8gY29uc29sZSBsb2dz
ICd0aHJvdHRsZSByYW4uJyB0d2ljZSwgMTUwbXMgYXBhcnQuCi0gIGBgYAotCi0gIEBtZXRob2Qg
dGhyb3R0bGUKLSAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8g
aW52b2tlCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBp
bnZva2UuCi0gICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEg
c3RyaW5nCi0gICAgdGhlbiBpdCB3aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdl
dC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3Mg
dG8gdGhlIHRpbWVvdXQuCi0gIEBwYXJhbSB7TnVtYmVyfSBzcGFjaW5nIE51bWJlciBvZiBtaWxs
aXNlY29uZHMgdG8gc3BhY2Ugb3V0IHJlcXVlc3RzLgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVt
YmVyLnJ1bi50aHJvdHRsZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gYmFja2J1cm5lci50aHJv
dHRsZS5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwotfTsKLQotLy8gTWFrZSBzdXJlIGl0
J3Mgbm90IGFuIGF1dG9ydW4gZHVyaW5nIHRlc3RpbmcKLWZ1bmN0aW9uIGNoZWNrQXV0b1J1bigp
IHsKLSAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1bkxvb3ApIHsKLSAgICBFbWJlci5hc3NlcnQo
IllvdSBoYXZlIHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4t
bG9vcCdzIGF1dG9ydW4uIFlvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5j
aHJvbm91cyBzaWRlLWVmZmVjdHMgaW4gYW4gRW1iZXIucnVuIiwgIUVtYmVyLnRlc3RpbmcpOwot
ICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vLyBFbWJlci5Mb2dnZXIKLS8v
IGdldAotLy8gc2V0Ci0vLyBndWlkRm9yLCBtZXRhCi0vLyBhZGRPYnNlcnZlciwgcmVtb3ZlT2Jz
ZXJ2ZXIKLS8vIEVtYmVyLnJ1bi5zY2hlZHVsZQotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0q
LwotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8vCi0KLS8qKgotICBEZWJ1ZyBwYXJhbWV0ZXIgeW91
IGNhbiB0dXJuIG9uLiBUaGlzIHdpbGwgbG9nIGFsbCBiaW5kaW5ncyB0aGF0IGZpcmUgdG8KLSAg
dGhlIGNvbnNvbGUuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gY29kZS4g
Tm90ZSB0aGF0IHlvdQotICBjYW4gYWxzbyBlbmFibGUgdGhpcyBmcm9tIHRoZSBjb25zb2xlIG9y
IHRlbXBvcmFyaWx5LgotCi0gIEBwcm9wZXJ0eSBMT0dfQklORElOR1MKLSAgQGZvciBFbWJlcgot
ICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0IGZhbHNlCi0qLwotRW1iZXIuTE9HX0JJTkRJTkdT
ID0gZmFsc2UgfHwgISFFbWJlci5FTlYuTE9HX0JJTkRJTkdTOwotCi12YXIgZ2V0ICAgICA9IEVt
YmVyLmdldCwKLSAgICBzZXQgICAgID0gRW1iZXIuc2V0LAotICAgIGd1aWRGb3IgPSBFbWJlci5n
dWlkRm9yLAotICAgIElTX0dMT0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS87Ci0KLS8q
KgotICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcuLCBg
TXlBcHAuZm9vQ29udHJvbGxlci5iYXJgKQotICBpbnN0ZWFkIG9mIGxvY2FsIChgZm9vLmJhci5i
YXpgKS4KLQotICBAbWV0aG9kIGlzR2xvYmFsUGF0aAotICBAZm9yIEVtYmVyCi0gIEBwcml2YXRl
Ci0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEByZXR1cm4gQm9vbGVhbgotKi8KLXZhciBpc0ds
b2JhbFBhdGggPSBFbWJlci5pc0dsb2JhbFBhdGggPSBmdW5jdGlvbihwYXRoKSB7Ci0gIHJldHVy
biBJU19HTE9CQUwudGVzdChwYXRoKTsKLX07Ci0KLWZ1bmN0aW9uIGdldFdpdGhHbG9iYWxzKG9i
aiwgcGF0aCkgewotICByZXR1cm4gZ2V0KGlzR2xvYmFsUGF0aChwYXRoKSA/IEVtYmVyLmxvb2t1
cCA6IG9iaiwgcGF0aCk7Ci19Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEJJTkRJTkcKLS8vCi0KLXZhciBCaW5kaW5n
ID0gZnVuY3Rpb24odG9QYXRoLCBmcm9tUGF0aCkgewotICB0aGlzLl9kaXJlY3Rpb24gPSAnZndk
JzsKLSAgdGhpcy5fZnJvbSA9IGZyb21QYXRoOwotICB0aGlzLl90byAgID0gdG9QYXRoOwotICB0
aGlzLl9kaXJlY3Rpb25NYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7Ci19OwotCi0vKioKLUBjbGFz
cyBCaW5kaW5nCi1AbmFtZXNwYWNlIEVtYmVyCi0qLwotCi1CaW5kaW5nLnByb3RvdHlwZSA9IHsK
LSAgLyoqCi0gICAgVGhpcyBjb3BpZXMgdGhlIEJpbmRpbmcgc28gaXQgY2FuIGJlIGNvbm5lY3Rl
ZCB0byBhbm90aGVyIG9iamVjdC4KLQotICAgIEBtZXRob2QgY29weQotICAgIEByZXR1cm4ge0Vt
YmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBjb3B5OiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFy
IGNvcHkgPSBuZXcgQmluZGluZyh0aGlzLl90bywgdGhpcy5fZnJvbSk7Ci0gICAgaWYgKHRoaXMu
X29uZVdheSkgeyBjb3B5Ll9vbmVXYXkgPSB0cnVlOyB9Ci0gICAgcmV0dXJuIGNvcHk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyBDT05GSUcKLSAgLy8KLQotICAvKioKLSAgICBUaGlzIHdpbGwgc2V0
IGBmcm9tYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIEl0IHdpbGwgbm90
Ci0gICAgYXR0ZW1wdCB0byByZXNvbHZlIHRoaXMgcHJvcGVydHkgcGF0aCB0byBhbiBhY3R1YWwg
b2JqZWN0IHVudGlsIHlvdQotICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCi0KLSAgICBUaGUgYmlu
ZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBhdGggc3RhcnRpbmcgYXQgdGhlIHJv
b3Qgb2JqZWN0Ci0gICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRpbmcu
IEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKLSAgICBgZ2V0KClgIC0gc2VlIHRoYXQgbWV0
aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgQG1ldGhvZCBmcm9tCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHBhdGggdGhlIHByb3BlcnR5IHBhdGggdG8gY29ubmVjdCB0bwotICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBmcm9tOiBmdW5jdGlvbihwYXRoKSB7
Ci0gICAgdGhpcy5fZnJvbSA9IHBhdGg7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgVGhpcyB3aWxsIHNldCB0aGUgYHRvYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZp
ZWQgdmFsdWUuIEl0IHdpbGwgbm90Ci0gICAgYXR0ZW1wdCB0byByZXNvbHZlIHRoaXMgcHJvcGVy
dHkgcGF0aCB0byBhbiBhY3R1YWwgb2JqZWN0IHVudGlsIHlvdQotICAgIGNvbm5lY3QgdGhlIGJp
bmRpbmcuCi0KLSAgICBUaGUgYmluZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBh
dGggc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2JqZWN0Ci0gICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNv
bm5lY3QoKWAgdGhlIGJpbmRpbmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKLSAgICBg
Z2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgQG1l
dGhvZCB0bwotICAgIEBwYXJhbSB7U3RyaW5nfFR1cGxlfSBwYXRoIEEgcHJvcGVydHkgcGF0aCBv
ciB0dXBsZQotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICB0bzog
ZnVuY3Rpb24ocGF0aCkgewotICAgIHRoaXMuX3RvID0gcGF0aDsKLSAgICByZXR1cm4gdGhpczsK
LSAgfSwKLQotICAvKioKLSAgICBDb25maWd1cmVzIHRoZSBiaW5kaW5nIGFzIG9uZSB3YXkuIEEg
b25lLXdheSBiaW5kaW5nIHdpbGwgcmVsYXkgY2hhbmdlcwotICAgIG9uIHRoZSBgZnJvbWAgc2lk
ZSB0byB0aGUgYHRvYCBzaWRlLCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGlzCi0g
ICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hhbmdlIHRoZSBgdG9gIHNpZGUgZGlyZWN0bHksIHRoZSBg
ZnJvbWAgc2lkZSBtYXkgaGF2ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgotCi0gICAgQG1ldGhv
ZCBvbmVXYXkKLSAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgb25l
V2F5OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9vbmVXYXkgPSB0cnVlOwotICAgIHJldHVybiB0
aGlzOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdG9TdHJpbmcKLSAgICBAcmV0dXJuIHtT
dHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBiaW5kaW5nCi0gICovCi0gIHRvU3RyaW5n
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb25lV2F5ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXld
JyA6ICcnOwotICAgIHJldHVybiAiRW1iZXIuQmluZGluZzwiICsgZ3VpZEZvcih0aGlzKSArICI+
KCIgKyB0aGlzLl9mcm9tICsgIiAtPiAiICsgdGhpcy5fdG8gKyAiKSIgKyBvbmVXYXk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyBDT05ORUNUIEFORCBTWU5DCi0gIC8vCi0KLSAgLyoqCi0gICAgQXR0
ZW1wdHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVj
ZWl2ZSBhbmQgcmVsYXkKLSAgICBjaGFuZ2VzLiBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4
Y2VwdGlvbiBpZiB5b3UgaGF2ZSBub3Qgc2V0IHRoZQotICAgIGZyb20vdG8gcHJvcGVydGllcyB5
ZXQuCi0KLSAgICBAbWV0aG9kIGNvbm5lY3QKLSAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBy
b290IG9iamVjdCBmb3IgdGhpcyBiaW5kaW5nLgotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9
IGB0aGlzYAotICAqLwotICBjb25uZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICBFbWJlci5hc3Nl
cnQoJ011c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScs
ICEhb2JqKTsKLQotICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMu
X3RvOwotICAgIEVtYmVyLnRyeVNldChvYmosIHRvUGF0aCwgZ2V0V2l0aEdsb2JhbHMob2JqLCBm
cm9tUGF0aCkpOwotCi0gICAgLy8gYWRkIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3QgdG8gYmUg
bm90aWZpZWQgd2hlbiB0aGUgYmluZGluZyBzaG91bGQgYmUgdXBkYXRlZAotICAgIEVtYmVyLmFk
ZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgsIHRoaXMsIHRoaXMuZnJvbURpZENoYW5nZSk7Ci0KLSAg
ICAvLyBpZiB0aGUgYmluZGluZyBpcyBhIHR3by13YXkgYmluZGluZywgYWxzbyBzZXQgdXAgYW4g
b2JzZXJ2ZXIgb24gdGhlIHRhcmdldAotICAgIGlmICghdGhpcy5fb25lV2F5KSB7IEVtYmVyLmFk
ZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlkQ2hhbmdlKTsgfQotCi0gICAg
dGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRGlzY29ubmVjdHMgdGhlIGJpbmRpbmcgaW5zdGFuY2UuIENoYW5nZXMgd2lsbCBu
byBsb25nZXIgYmUgcmVsYXllZC4gWW91Ci0gICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNh
bGwgdGhpcyBtZXRob2QuCi0KLSAgICBAbWV0aG9kIGRpc2Nvbm5lY3QKLSAgICBAcGFyYW0ge09i
amVjdH0gb2JqIFRoZSByb290IG9iamVjdCB5b3UgcGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUg
YmluZGluZy4KLSAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgZGlz
Y29ubmVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBhc3MgYSB2
YWxpZCBvYmplY3QgdG8gRW1iZXIuQmluZGluZy5kaXNjb25uZWN0KCknLCAhIW9iaik7Ci0KLSAg
ICB2YXIgdHdvV2F5ID0gIXRoaXMuX29uZVdheTsKLQotICAgIC8vIHJlbW92ZSBhbiBvYnNlcnZl
ciBvbiB0aGUgb2JqZWN0IHNvIHdlJ3JlIG5vIGxvbmdlciBub3RpZmllZCBvZgotICAgIC8vIGNo
YW5nZXMgdGhhdCBzaG91bGQgdXBkYXRlIGJpbmRpbmdzLgotICAgIEVtYmVyLnJlbW92ZU9ic2Vy
dmVyKG9iaiwgdGhpcy5fZnJvbSwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlKTsKLQotICAgIC8v
IGlmIHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2JzZXJ2ZXIgZnJvbSB0aGUg
dGFyZ2V0IGFzIHdlbGwKLSAgICBpZiAodHdvV2F5KSB7IEVtYmVyLnJlbW92ZU9ic2VydmVyKG9i
aiwgdGhpcy5fdG8sIHRoaXMsIHRoaXMudG9EaWRDaGFuZ2UpOyB9Ci0KLSAgICB0aGlzLl9yZWFk
eVRvU3luYyA9IGZhbHNlOyAvLyBkaXNhYmxlIHNjaGVkdWxlZCBzeW5jcy4uLgotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gUFJJVkFURQotICAvLwotCi0gIC8qIGNhbGxl
ZCB3aGVuIHRoZSBmcm9tIHNpZGUgY2hhbmdlcyAqLwotICBmcm9tRGlkQ2hhbmdlOiBmdW5jdGlv
bih0YXJnZXQpIHsKLSAgICB0aGlzLl9zY2hlZHVsZVN5bmModGFyZ2V0LCAnZndkJyk7Ci0gIH0s
Ci0KLSAgLyogY2FsbGVkIHdoZW4gdGhlIHRvIHNpZGUgY2hhbmdlcyAqLwotICB0b0RpZENoYW5n
ZTogZnVuY3Rpb24odGFyZ2V0KSB7Ci0gICAgdGhpcy5fc2NoZWR1bGVTeW5jKHRhcmdldCwgJ2Jh
Y2snKTsKLSAgfSwKLQotICBfc2NoZWR1bGVTeW5jOiBmdW5jdGlvbihvYmosIGRpcikgewotICAg
IHZhciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7Ci0gICAgdmFyIGV4aXN0aW5n
RGlyID0gZGlyZWN0aW9uTWFwLmdldChvYmopOwotCi0gICAgLy8gaWYgd2UgaGF2ZW4ndCBzY2hl
ZHVsZWQgdGhlIGJpbmRpbmcgeWV0LCBzY2hlZHVsZSBpdAotICAgIGlmICghZXhpc3RpbmdEaXIp
IHsKLSAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnc3luYycsIHRoaXMsIHRoaXMuX3N5bmMsIG9i
aik7Ci0gICAgICBkaXJlY3Rpb25NYXAuc2V0KG9iaiwgZGlyKTsKLSAgICB9Ci0KLSAgICAvLyBJ
ZiBib3RoIGEgJ2JhY2snIGFuZCAnZndkJyBzeW5jIGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhl
IHNhbWUgb2JqZWN0LAotICAgIC8vIGRlZmF1bHQgdG8gYSAnZndkJyBzeW5jIHNvIHRoYXQgaXQg
cmVtYWlucyBkZXRlcm1pbmlzdGljLgotICAgIGlmIChleGlzdGluZ0RpciA9PT0gJ2JhY2snICYm
IGRpciA9PT0gJ2Z3ZCcpIHsKLSAgICAgIGRpcmVjdGlvbk1hcC5zZXQob2JqLCAnZndkJyk7Ci0g
ICAgfQotICB9LAotCi0gIF9zeW5jOiBmdW5jdGlvbihvYmopIHsKLSAgICB2YXIgbG9nID0gRW1i
ZXIuTE9HX0JJTkRJTkdTOwotCi0gICAgLy8gZG9uJ3Qgc3luY2hyb25pemUgZGVzdHJveWVkIG9i
amVjdHMgb3IgZGlzY29ubmVjdGVkIGJpbmRpbmdzCi0gICAgaWYgKG9iai5pc0Rlc3Ryb3llZCB8
fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBnZXQgdGhlIGRpcmVj
dGlvbiBvZiB0aGUgYmluZGluZyBmb3IgdGhlIG9iamVjdCB3ZSBhcmUKLSAgICAvLyBzeW5jaHJv
bml6aW5nIGZyb20KLSAgICB2YXIgZGlyZWN0aW9uTWFwID0gdGhpcy5fZGlyZWN0aW9uTWFwOwot
ICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25NYXAuZ2V0KG9iaik7Ci0KLSAgICB2YXIgZnJv
bVBhdGggPSB0aGlzLl9mcm9tLCB0b1BhdGggPSB0aGlzLl90bzsKLQotICAgIGRpcmVjdGlvbk1h
cC5yZW1vdmUob2JqKTsKLQotICAgIC8vIGlmIHdlJ3JlIHN5bmNocm9uaXppbmcgZnJvbSB0aGUg
cmVtb3RlIG9iamVjdC4uLgotICAgIGlmIChkaXJlY3Rpb24gPT09ICdmd2QnKSB7Ci0gICAgICB2
YXIgZnJvbVZhbHVlID0gZ2V0V2l0aEdsb2JhbHMob2JqLCB0aGlzLl9mcm9tKTsKLSAgICAgIGlm
IChsb2cpIHsKLSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwg
Jy0+JywgZnJvbVZhbHVlLCBvYmopOwotICAgICAgfQotICAgICAgaWYgKHRoaXMuX29uZVdheSkg
ewotICAgICAgICBFbWJlci50cnlTZXQob2JqLCB0b1BhdGgsIGZyb21WYWx1ZSk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlz
LCB0aGlzLnRvRGlkQ2hhbmdlLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgRW1iZXIudHJ5U2V0
KG9iaiwgdG9QYXRoLCBmcm9tVmFsdWUpOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICAvLyBp
ZiB3ZSdyZSBzeW5jaHJvbml6aW5nICp0byogdGhlIHJlbW90ZSBvYmplY3QKLSAgICB9IGVsc2Ug
aWYgKGRpcmVjdGlvbiA9PT0gJ2JhY2snKSB7Ci0gICAgICB2YXIgdG9WYWx1ZSA9IGdldChvYmos
IHRoaXMuX3RvKTsKLSAgICAgIGlmIChsb2cpIHsKLSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygn
ICcsIHRoaXMudG9TdHJpbmcoKSwgJzwtJywgdG9WYWx1ZSwgb2JqKTsKLSAgICAgIH0KLSAgICAg
IEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXIob2JqLCBmcm9tUGF0aCwgdGhpcywgdGhpcy5mcm9tRGlk
Q2hhbmdlLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIEVtYmVyLnRyeVNldChFbWJlci5pc0dsb2Jh
bFBhdGgoZnJvbVBhdGgpID8gRW1iZXIubG9va3VwIDogb2JqLCBmcm9tUGF0aCwgdG9WYWx1ZSk7
Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotfTsKLQotZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVz
KHRvLCBmcm9tKSB7Ci0gIGZvciAodmFyIGtleSBpbiBmcm9tKSB7Ci0gICAgaWYgKGZyb20uaGFz
T3duUHJvcGVydHkoa2V5KSkgewotICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKLSAgICB9Ci0g
IH0KLX0KLQotbWl4aW5Qcm9wZXJ0aWVzKEJpbmRpbmcsIHsKLQotICAvKgotICAgIFNlZSBgRW1i
ZXIuQmluZGluZy5mcm9tYC4KLQotICAgIEBtZXRob2QgZnJvbQotICAgIEBzdGF0aWMKLSAgKi8K
LSAgZnJvbTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzLCBiaW5kaW5nID0gbmV3IEMo
KTsKLSAgICByZXR1cm4gYmluZGluZy5mcm9tLmFwcGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7Ci0g
IH0sCi0KLSAgLyoKLSAgICBTZWUgYEVtYmVyLkJpbmRpbmcudG9gLgotCi0gICAgQG1ldGhvZCB0
bwotICAgIEBzdGF0aWMKLSAgKi8KLSAgdG86IGZ1bmN0aW9uKCkgewotICAgIHZhciBDID0gdGhp
cywgYmluZGluZyA9IG5ldyBDKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmcudG8uYXBwbHkoYmluZGlu
ZywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBDcmVhdGVzIGEgbmV3IEJpbmRpbmcg
aW5zdGFuY2UgYW5kIG1ha2VzIGl0IGFwcGx5IGluIGEgc2luZ2xlIGRpcmVjdGlvbi4KLSAgICBB
IG9uZS13YXkgYmluZGluZyB3aWxsIHJlbGF5IGNoYW5nZXMgb24gdGhlIGBmcm9tYCBzaWRlIG9i
amVjdCAoc3VwcGxpZWQKLSAgICBhcyB0aGUgYGZyb21gIGFyZ3VtZW50KSB0aGUgYHRvYCBzaWRl
LCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgotICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5
b3UgY2hhbmdlIHRoZSAidG8iIHNpZGUgZGlyZWN0bHksIHRoZSAiZnJvbSIgc2lkZSBtYXkgaGF2
ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgotCi0gICAgU2VlIGBCaW5kaW5nLm9uZVdheWAuCi0K
LSAgICBAbWV0aG9kIG9uZVdheQotICAgIEBwYXJhbSB7U3RyaW5nfSBmcm9tIGZyb20gcGF0aC4K
LSAgICBAcGFyYW0ge0Jvb2xlYW59IFtmbGFnXSAoT3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBo
ZXJlIHdpbGwgbWFrZSB0aGUKLSAgICAgIGJpbmRpbmcgYG9uZVdheWAuIFlvdSBjYW4gaW5zdGVh
ZCBwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBgb25lV2F5YCwgbWFraW5nIHRoZQotICAgICAgYmlu
ZGluZyB0d28gd2F5IGFnYWluLgotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAot
ICAqLwotICBvbmVXYXk6IGZ1bmN0aW9uKGZyb20sIGZsYWcpIHsKLSAgICB2YXIgQyA9IHRoaXMs
IGJpbmRpbmcgPSBuZXcgQyhudWxsLCBmcm9tKTsKLSAgICByZXR1cm4gYmluZGluZy5vbmVXYXko
ZmxhZyk7Ci0gIH0KLQotfSk7Ci0KLS8qKgotICBBbiBgRW1iZXIuQmluZGluZ2AgY29ubmVjdHMg
dGhlIHByb3BlcnRpZXMgb2YgdHdvIG9iamVjdHMgc28gdGhhdCB3aGVuZXZlcgotICB0aGUgdmFs
dWUgb2Ygb25lIHByb3BlcnR5IGNoYW5nZXMsIHRoZSBvdGhlciBwcm9wZXJ0eSB3aWxsIGJlIGNo
YW5nZWQgYWxzby4KLQotICAjIyBBdXRvbWF0aWMgQ3JlYXRpb24gb2YgQmluZGluZ3Mgd2l0aCBg
L14qQmluZGluZy9gLW5hbWVkIFByb3BlcnRpZXMKLQotICBZb3UgZG8gbm90IHVzdWFsbHkgY3Jl
YXRlIEJpbmRpbmcgb2JqZWN0cyBkaXJlY3RseSBidXQgaW5zdGVhZCBkZXNjcmliZQotICBiaW5k
aW5ncyBpbiB5b3VyIGNsYXNzIG9yIG9iamVjdCBkZWZpbml0aW9uIHVzaW5nIGF1dG9tYXRpYyBi
aW5kaW5nCi0gIGRldGVjdGlvbi4KLQotICBQcm9wZXJ0aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5n
YCBzdWZmaXggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYEVtYmVyLkJpbmRpbmdgCi0gIGluc3RhbmNl
cy4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nIHJlcHJlc2Vu
dGluZyBhIHBhdGgKLSAgdG8gYW5vdGhlciBvYmplY3Qgb3IgYSBjdXN0b20gYmluZGluZyBpbnN0
YW5jZWQgY3JlYXRlZCB1c2luZyBCaW5kaW5nIGhlbHBlcnMKLSAgKHNlZSAiT25lIFdheSBCaW5k
aW5ncyIpOgotCi0gIGBgYAotICB2YWx1ZUJpbmRpbmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci50
aXRsZSIKLSAgYGBgCi0KLSAgVGhpcyB3aWxsIGNyZWF0ZSBhIGJpbmRpbmcgZnJvbSBgTXlBcHAu
c29tZUNvbnRyb2xsZXIudGl0bGVgIHRvIHRoZSBgdmFsdWVgCi0gIHByb3BlcnR5IG9mIHlvdXIg
b2JqZWN0IGluc3RhbmNlIGF1dG9tYXRpY2FsbHkuIE5vdyB0aGUgdHdvIHZhbHVlcyB3aWxsIGJl
Ci0gIGtlcHQgaW4gc3luYy4KLQotICAjIyBPbmUgV2F5IEJpbmRpbmdzCi0KLSAgT25lIGVzcGVj
aWFsbHkgdXNlZnVsIGJpbmRpbmcgY3VzdG9taXphdGlvbiB5b3UgY2FuIHVzZSBpcyB0aGUgYG9u
ZVdheSgpYAotICBoZWxwZXIuIFRoaXMgaGVscGVyIHRlbGxzIEVtYmVyIHRoYXQgeW91IGFyZSBv
bmx5IGludGVyZXN0ZWQgaW4KLSAgcmVjZWl2aW5nIGNoYW5nZXMgb24gdGhlIG9iamVjdCB5b3Ug
YXJlIGJpbmRpbmcgZnJvbS4gRm9yIGV4YW1wbGUsIGlmIHlvdQotICBhcmUgYmluZGluZyB0byBh
IHByZWZlcmVuY2UgYW5kIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIGlmIHRoZSBwcmVmZXJlbmNl
Ci0gIGhhcyBjaGFuZ2VkLCBidXQgeW91ciBvYmplY3Qgd2lsbCBub3QgYmUgY2hhbmdpbmcgdGhl
IHByZWZlcmVuY2UgaXRzZWxmLCB5b3UKLSAgY291bGQgZG86Ci0KLSAgYGBgCi0gIGJpZ1RpdGxl
c0JpbmRpbmc6IEVtYmVyLkJpbmRpbmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xs
ZXIuYmlnVGl0bGVzIikKLSAgYGBgCi0KLSAgVGhpcyB3YXkgaWYgdGhlIHZhbHVlIG9mIGBNeUFw
cC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzYCBjaGFuZ2VzIHRoZQotICBgYmlnVGl0
bGVzYCBwcm9wZXJ0eSBvZiB5b3VyIG9iamVjdCB3aWxsIGNoYW5nZSBhbHNvLiBIb3dldmVyLCBp
ZiB5b3UKLSAgY2hhbmdlIHRoZSB2YWx1ZSBvZiB5b3VyIGBiaWdUaXRsZXNgIHByb3BlcnR5LCBp
dCB3aWxsIG5vdCB1cGRhdGUgdGhlCi0gIGBwcmVmZXJlbmNlc0NvbnRyb2xsZXJgLgotCi0gIE9u
ZSB3YXkgYmluZGluZ3MgYXJlIGFsbW9zdCB0d2ljZSBhcyBmYXN0IHRvIHNldHVwIGFuZCB0d2lj
ZSBhcyBmYXN0IHRvCi0gIGV4ZWN1dGUgYmVjYXVzZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3
b3JyeSBhYm91dCBjaGFuZ2VzIHRvIG9uZSBzaWRlLgotCi0gIFlvdSBzaG91bGQgY29uc2lkZXIg
dXNpbmcgb25lIHdheSBiaW5kaW5ncyBhbnl0aW1lIHlvdSBoYXZlIGFuIG9iamVjdCB0aGF0Ci0g
IG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5kIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNoYW5n
ZSBhIHByb3BlcnR5OyBvbmx5Ci0gIHRvIG1vbml0b3IgaXQgZm9yIGNoYW5nZXMgKHN1Y2ggYXMg
aW4gdGhlIGV4YW1wbGUgYWJvdmUpLgotCi0gICMjIEFkZGluZyBCaW5kaW5ncyBNYW51YWxseQot
Ci0gIEFsbCBvZiB0aGUgZXhhbXBsZXMgYWJvdmUgc2hvdyB5b3UgaG93IHRvIGNvbmZpZ3VyZSBh
IGN1c3RvbSBiaW5kaW5nLCBidXQgdGhlCi0gIHJlc3VsdCBvZiB0aGVzZSBjdXN0b21pemF0aW9u
cyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkgYWN0aXZlCi0gIEJpbmRp
bmcgaW5zdGFuY2UuIFRoZSBiaW5kaW5nIHdpbGwgYWN0dWFsbHkgYmVjb21lIGFjdGl2ZSBvbmx5
IHdoZW4geW91Ci0gIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgdGhlIGJpbmRpbmcgYmVsb25ncyB0
by4gSXQgaXMgdXNlZnVsIGhvd2V2ZXIsIHRvCi0gIHVuZGVyc3RhbmQgd2hhdCBhY3R1YWxseSBo
YXBwZW5zIHdoZW4gdGhlIGJpbmRpbmcgaXMgYWN0aXZhdGVkLgotCi0gIEZvciBhIGJpbmRpbmcg
dG8gZnVuY3Rpb24gaXQgbXVzdCBoYXZlIGF0IGxlYXN0IGEgYGZyb21gIHByb3BlcnR5IGFuZCBh
IGB0b2AKLSAgcHJvcGVydHkuIFRoZSBgZnJvbWAgcHJvcGVydHkgcGF0aCBwb2ludHMgdG8gdGhl
IG9iamVjdC9rZXkgdGhhdCB5b3Ugd2FudCB0bwotICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2Ag
cGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9rZXkgeW91IHdhbnQgdG8gYmluZCB0by4KLQotICBX
aGVuIHlvdSBkZWZpbmUgYSBjdXN0b20gYmluZGluZywgeW91IGFyZSB1c3VhbGx5IGRlc2NyaWJp
bmcgdGhlIHByb3BlcnR5Ci0gIHlvdSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAu
c29tZUNvbnRyb2xsZXIudmFsdWVgIGluIHRoZSBleGFtcGxlcwotICBhYm92ZSkuIFdoZW4geW91
ciBvYmplY3QgaXMgY3JlYXRlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgdmFs
dWUKLSAgeW91IHdhbnQgdG8gYmluZCBgdG9gIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHlvdXIgYmlu
ZGluZyBrZXkuIEluIHRoZQotICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9i
amVjdHMgd2lsbCBlZmZlY3RpdmVseSBjYWxsCi0gIHNvbWV0aGluZyBsaWtlIHRoaXMgb24geW91
ciBiaW5kaW5nOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcu
ZnJvbSh0aGlzLnZhbHVlQmluZGluZykudG8oInZhbHVlIik7Ci0gIGBgYAotCi0gIFRoaXMgY3Jl
YXRlcyBhIG5ldyBiaW5kaW5nIGluc3RhbmNlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSB5b3UgcHJv
dmlkZSwgYW5kCi0gIHNldHMgdGhlIHRvIHBhdGggdG8gdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2Yg
dGhlIG5ldyBvYmplY3QuIE5vdyB0aGF0IHRoZQotICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3Vy
ZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBpdCBzaW1wbHkgbmVlZHMgdG8gYmUKLSAgY29u
bmVjdGVkIHRvIGJlY29tZSBhY3RpdmUuIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBgY29ubmVj
dCgpYCBtZXRob2Q6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7
Ci0gIGBgYAotCi0gIE5vdGUgdGhhdCB3aGVuIHlvdSBjb25uZWN0IGEgYmluZGluZyB5b3UgcGFz
cyB0aGUgb2JqZWN0IHlvdSB3YW50IGl0IHRvIGJlCi0gIGNvbm5lY3RlZCB0by4gVGhpcyBvYmpl
Y3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IGZvciBib3RoIHRoZSBmcm9tIGFuZAotICB0byBz
aWRlIG9mIHRoZSBiaW5kaW5nIHdoZW4gaW5zcGVjdGluZyByZWxhdGl2ZSBwYXRocy4gVGhpcyBh
bGxvd3MgdGhlCi0gIGJpbmRpbmcgdG8gYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYnkgc3Vi
Y2xhc3NlZCBvYmplY3RzIGFzIHdlbGwuCi0KLSAgTm93IHRoYXQgdGhlIGJpbmRpbmcgaXMgY29u
bmVjdGVkLCBpdCB3aWxsIG9ic2VydmUgYm90aCB0aGUgZnJvbSBhbmQgdG8gc2lkZQotICBhbmQg
cmVsYXkgY2hhbmdlcy4KLQotICBJZiB5b3UgZXZlciBuZWVkZWQgdG8gZG8gc28gKHlvdSBhbG1v
c3QgbmV2ZXIgd2lsbCwgYnV0IGl0IGlzIHVzZWZ1bCB0bwotICB1bmRlcnN0YW5kIHRoaXMgYW55
d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBhY3RpdmUgYmluZGluZyBieQotICB1
c2luZyB0aGUgYEVtYmVyLmJpbmQoKWAgaGVscGVyIG1ldGhvZC4gKFRoaXMgaXMgdGhlIHNhbWUg
bWV0aG9kIHVzZWQgYnkKLSAgdG8gc2V0dXAgeW91ciBiaW5kaW5ncyBvbiBvYmplY3RzKToKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmJpbmQoTXlBcHAuYW5vdGhlck9iamVjdCwgInZhbHVl
IiwgIk15QXBwLnNvbWVDb250cm9sbGVyLnZhbHVlIik7Ci0gIGBgYAotCi0gIEJvdGggb2YgdGhl
c2UgY29kZSBmcmFnbWVudHMgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgZG9pbmcgdGhlIG1vc3Qg
ZnJpZW5kbHkKLSAgZm9ybSBvZiBiaW5kaW5nIGNyZWF0aW9uIGxpa2Ugc286Ci0KLSAgYGBgamF2
YXNjcmlwdAotICBNeUFwcC5hbm90aGVyT2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0g
ICAgdmFsdWVCaW5kaW5nOiAiTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWUiLAotCi0gICAgLy8g
T1RIRVIgQ09ERSBGT1IgVEhJUyBPQkpFQ1QuLi4KLSAgfSk7Ci0gIGBgYAotCi0gIEVtYmVyJ3Mg
YnVpbHQgaW4gYmluZGluZyBjcmVhdGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBhdXRvbWF0
aWNhbGx5Ci0gIGNyZWF0ZSBiaW5kaW5ncyBmb3IgeW91LiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2Ug
dGhlIGhpZ2hlc3QtbGV2ZWwgQVBJcwotICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVuZGVyc3Rh
bmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCi0KLSAgQGNsYXNzIEJpbmRpbmcKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAc2luY2UgRW1iZXIgMC45Ci0qLwotRW1iZXIuQmluZGluZyA9IEJpbmRp
bmc7Ci0KLQotLyoqCi0gIEdsb2JhbCBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBiaW5k
aW5nLiBKdXN0IHBhc3MgdGhlIHJvb3Qgb2JqZWN0Ci0gIGFsb25nIHdpdGggYSBgdG9gIGFuZCBg
ZnJvbWAgcGF0aCB0byBjcmVhdGUgYW5kIGNvbm5lY3QgdGhlIGJpbmRpbmcuCi0KLSAgQG1ldGhv
ZCBiaW5kCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmpl
Y3Qgb2YgdGhlIHRyYW5zZm9ybS4KLSAgQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRvIHRo
ZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCi0gICAgTXVzdCBiZSByZWxhdGl2ZSB0byBvYmou
Ci0gIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBwYXRoIHRvIHRoZSAnZnJvbScgc2lkZSBvZiB0
aGUgYmluZGluZy4KLSAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iaiBvciBhIGdsb2JhbCBwYXRo
LgotICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBiaW5kaW5nIGluc3RhbmNlCi0qLwotRW1iZXIu
YmluZCA9IGZ1bmN0aW9uKG9iaiwgdG8sIGZyb20pIHsKLSAgcmV0dXJuIG5ldyBFbWJlci5CaW5k
aW5nKHRvLCBmcm9tKS5jb25uZWN0KG9iaik7Ci19OwotCi0vKioKLSAgQG1ldGhvZCBvbmVXYXkK
LSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCBvZiB0
aGUgdHJhbnNmb3JtLgotICBAcGFyYW0ge1N0cmluZ30gdG8gVGhlIHBhdGggdG8gdGhlICd0bycg
c2lkZSBvZiB0aGUgYmluZGluZy4KLSAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iai4KLSAgQHBh
cmFtIHtTdHJpbmd9IGZyb20gVGhlIHBhdGggdG8gdGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5k
aW5nLgotICAgIE11c3QgYmUgcmVsYXRpdmUgdG8gb2JqIG9yIGEgZ2xvYmFsIHBhdGguCi0gIEBy
ZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGJpbmRpbmcgaW5zdGFuY2UKLSovCi1FbWJlci5vbmVXYXkg
PSBmdW5jdGlvbihvYmosIHRvLCBmcm9tKSB7Ci0gIHJldHVybiBuZXcgRW1iZXIuQmluZGluZyh0
bywgZnJvbSkub25lV2F5KCkuY29ubmVjdChvYmopOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8K
LQotdmFyIE1peGluLCBSRVFVSVJFRCwgQWxpYXMsCi0gICAgYV9tYXAgPSBFbWJlci5BcnJheVBv
bHlmaWxscy5tYXAsCi0gICAgYV9pbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhP
ZiwKLSAgICBhX2ZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLAotICAgIGFf
c2xpY2UgPSBbXS5zbGljZSwKLSAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKLSAgICBkZWZp
bmVQcm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3BlcnR5LAotICAgIGd1aWRGb3IgPSBFbWJlci5n
dWlkRm9yOwotCi0KLWZ1bmN0aW9uIG1peGluc01ldGEob2JqKSB7Ci0gIHZhciBtID0gRW1iZXIu
bWV0YShvYmosIHRydWUpLCByZXQgPSBtLm1peGluczsKLSAgaWYgKCFyZXQpIHsKLSAgICByZXQg
PSBtLm1peGlucyA9IHt9OwotICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdtaXhpbnMn
KSkgewotICAgIHJldCA9IG0ubWl4aW5zID0gb19jcmVhdGUocmV0KTsKLSAgfQotICByZXR1cm4g
cmV0OwotfQotCi1mdW5jdGlvbiBpbml0TWl4aW4obWl4aW4sIGFyZ3MpIHsKLSAgaWYgKGFyZ3Mg
JiYgYXJncy5sZW5ndGggPiAwKSB7Ci0gICAgbWl4aW4ubWl4aW5zID0gYV9tYXAuY2FsbChhcmdz
LCBmdW5jdGlvbih4KSB7Ci0gICAgICBpZiAoeCBpbnN0YW5jZW9mIE1peGluKSB7IHJldHVybiB4
OyB9Ci0KLSAgICAgIC8vIE5vdGU6IE1hbnVhbGx5IHNldHVwIGEgcHJpbWl0aXZlIG1peGluIGhl
cmUuIFRoaXMgaXMgdGhlIG9ubHkKLSAgICAgIC8vIHdheSB0byBhY3R1YWxseSBnZXQgYSBwcmlt
aXRpdmUgbWl4aW4uIFRoaXMgd2F5IG5vcm1hbCBjcmVhdGlvbgotICAgICAgLy8gb2YgbWl4aW5z
IHdpbGwgZ2l2ZSB5b3UgY29tYmluZWQgbWl4aW5zLi4uCi0gICAgICB2YXIgbWl4aW4gPSBuZXcg
TWl4aW4oKTsKLSAgICAgIG1peGluLnByb3BlcnRpZXMgPSB4OwotICAgICAgcmV0dXJuIG1peGlu
OwotICAgIH0pOwotICB9Ci0gIHJldHVybiBtaXhpbjsKLX0KLQotZnVuY3Rpb24gaXNNZXRob2Qo
b2JqKSB7Ci0gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqICYmCi0gICAgICAgICBv
YmouaXNNZXRob2QgIT09IGZhbHNlICYmCi0gICAgICAgICBvYmogIT09IEJvb2xlYW4gJiYgb2Jq
ICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBBcnJheSAmJiBvYmogIT09
IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Ci19Ci0KLXZhciBDT05USU5VRSA9IHt9OwotCi1mdW5j
dGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwgbWl4aW4pIHsKLSAgdmFyIGd1aWQ7Ci0K
LSAgaWYgKG1peGluIGluc3RhbmNlb2YgTWl4aW4pIHsKLSAgICBndWlkID0gZ3VpZEZvcihtaXhp
bik7Ci0gICAgaWYgKG1peGluc01ldGFbZ3VpZF0pIHsgcmV0dXJuIENPTlRJTlVFOyB9Ci0gICAg
bWl4aW5zTWV0YVtndWlkXSA9IG1peGluOwotICAgIHJldHVybiBtaXhpbi5wcm9wZXJ0aWVzOwot
ICB9IGVsc2UgewotICAgIHJldHVybiBtaXhpbjsgLy8gYXBwbHkgYW5vbnltb3VzIG1peGluIHBy
b3BlcnRpZXMKLSAgfQotfQotCi1mdW5jdGlvbiBjb25jYXRlbmF0ZWRNaXhpblByb3BlcnRpZXMo
Y29uY2F0UHJvcCwgcHJvcHMsIHZhbHVlcywgYmFzZSkgewotICB2YXIgY29uY2F0czsKLQotICAv
LyByZXNldCBiZWZvcmUgYWRkaW5nIGVhY2ggbmV3IG1peGluIHRvIHBpY2t1cCBjb25jYXRzIGZy
b20gcHJldmlvdXMKLSAgY29uY2F0cyA9IHZhbHVlc1tjb25jYXRQcm9wXSB8fCBiYXNlW2NvbmNh
dFByb3BdOwotICBpZiAocHJvcHNbY29uY2F0UHJvcF0pIHsKLSAgICBjb25jYXRzID0gY29uY2F0
cyA/IGNvbmNhdHMuY29uY2F0KHByb3BzW2NvbmNhdFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3Bd
OwotICB9Ci0KLSAgcmV0dXJuIGNvbmNhdHM7Ci19Ci0KLWZ1bmN0aW9uIGdpdmVEZXNjcmlwdG9y
U3VwZXIobWV0YSwga2V5LCBwcm9wZXJ0eSwgdmFsdWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJQ
cm9wZXJ0eTsKLQotICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJyaWRlIG1ldGhvZHMsIGFu
ZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCi0gIGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZp
bmVkKSB7Ci0gICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBpbiBhIHBhcmVudCBt
aXhpbgotICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOwotICB9Ci0KLSAgLy8gSWYgd2Ug
ZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgaW4gYSBwYXJlbnQgbWl4aW4sIGZp
bmQKLSAgLy8gaXQgb24gdGhlIG9yaWdpbmFsIG9iamVjdC4KLSAgc3VwZXJQcm9wZXJ0eSA9IHN1
cGVyUHJvcGVydHkgfHwgbWV0YS5kZXNjc1trZXldOwotCi0gIGlmICghc3VwZXJQcm9wZXJ0eSB8
fCAhKHN1cGVyUHJvcGVydHkgaW5zdGFuY2VvZiBFbWJlci5Db21wdXRlZFByb3BlcnR5KSkgewot
ICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgfQotCi0gIC8vIFNpbmNlIG11bHRpcGxlIG1peGlucyBt
YXkgaW5oZXJpdCBmcm9tIHRoZSBzYW1lIHBhcmVudCwgd2UgbmVlZAotICAvLyB0byBjbG9uZSB0
aGUgY29tcHV0ZWQgcHJvcGVydHkgc28gdGhhdCBvdGhlciBtaXhpbnMgZG8gbm90IHJlY2VpdmUK
LSAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KLSAgcHJvcGVydHkgPSBvX2NyZWF0ZShwcm9wZXJ0
eSk7Ci0gIHByb3BlcnR5LmZ1bmMgPSBFbWJlci53cmFwKHByb3BlcnR5LmZ1bmMsIHN1cGVyUHJv
cGVydHkuZnVuYyk7Ci0KLSAgcmV0dXJuIHByb3BlcnR5OwotfQotCi1mdW5jdGlvbiBnaXZlTWV0
aG9kU3VwZXIob2JqLCBrZXksIG1ldGhvZCwgdmFsdWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJN
ZXRob2Q7Ci0KLSAgLy8gTWV0aG9kcyBvdmVyd3JpdGUgY29tcHV0ZWQgcHJvcGVydGllcywgYW5k
IGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCi0gIGlmIChkZXNjc1trZXldID09PSB1bmRlZmlu
ZWQpIHsKLSAgICAvLyBGaW5kIHRoZSBvcmlnaW5hbCBtZXRob2QgaW4gYSBwYXJlbnQgbWl4aW4K
LSAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXldOwotICB9Ci0KLSAgLy8gSWYgd2UgZGlkbid0
IGZpbmQgdGhlIG9yaWdpbmFsIHZhbHVlIGluIGEgcGFyZW50IG1peGluLCBmaW5kIGl0IGluCi0g
IC8vIHRoZSBvcmlnaW5hbCBvYmplY3QKLSAgc3VwZXJNZXRob2QgPSBzdXBlck1ldGhvZCB8fCBv
Ympba2V5XTsKLQotICAvLyBPbmx5IHdyYXAgdGhlIG5ldyBtZXRob2QgaWYgdGhlIG9yaWdpbmFs
IG1ldGhvZCB3YXMgYSBmdW5jdGlvbgotICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHN1cGVy
TWV0aG9kKSB7Ci0gICAgcmV0dXJuIG1ldGhvZDsKLSAgfQotCi0gIHJldHVybiBFbWJlci53cmFw
KG1ldGhvZCwgc3VwZXJNZXRob2QpOwotfQotCi1mdW5jdGlvbiBhcHBseUNvbmNhdGVuYXRlZFBy
b3BlcnRpZXMob2JqLCBrZXksIHZhbHVlLCB2YWx1ZXMpIHsKLSAgdmFyIGJhc2VWYWx1ZSA9IHZh
bHVlc1trZXldIHx8IG9ialtrZXldOwotCi0gIGlmIChiYXNlVmFsdWUpIHsKLSAgICBpZiAoJ2Z1
bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VWYWx1ZS5jb25jYXQpIHsKLSAgICAgIHJldHVybiBiYXNl
VmFsdWUuY29uY2F0KHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEVtYmVyLm1h
a2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAg
IHJldHVybiBFbWJlci5tYWtlQXJyYXkodmFsdWUpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5
TWVyZ2VkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZhbHVlcykgewotICB2YXIgYmFzZVZh
bHVlID0gdmFsdWVzW2tleV0gfHwgb2JqW2tleV07Ci0KLSAgaWYgKCFiYXNlVmFsdWUpIHsgcmV0
dXJuIHZhbHVlOyB9Ci0KLSAgdmFyIG5ld0Jhc2UgPSBFbWJlci5tZXJnZSh7fSwgYmFzZVZhbHVl
KTsKLSAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkgewotICAgIGlmICghdmFsdWUuaGFzT3duUHJv
cGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLQotICAgIHZhciBwcm9wVmFsdWUgPSB2YWx1ZVtw
cm9wXTsKLSAgICBpZiAoaXNNZXRob2QocHJvcFZhbHVlKSkgewotICAgICAgLy8gVE9ETzogc3Vw
cG9ydCBmb3IgQ29tcHV0ZWQgUHJvcGVydGllcywgZXRjPwotICAgICAgbmV3QmFzZVtwcm9wXSA9
IGdpdmVNZXRob2RTdXBlcihvYmosIHByb3AsIHByb3BWYWx1ZSwgYmFzZVZhbHVlLCB7fSk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIG5ld0Jhc2VbcHJvcF0gPSBwcm9wVmFsdWU7Ci0gICAgfQotICB9
Ci0KLSAgcmV0dXJuIG5ld0Jhc2U7Ci19Ci0KLWZ1bmN0aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0
eShiYXNlLCBrZXksIHZhbHVlLCBtZXRhLCBkZXNjcywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5n
cykgewotICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yKSB7Ci0gICAgaWYg
KHZhbHVlID09PSBSRVFVSVJFRCAmJiBkZXNjc1trZXldKSB7IHJldHVybiBDT05USU5VRTsgfQot
Ci0gICAgLy8gV3JhcCBkZXNjcmlwdG9yIGZ1bmN0aW9uIHRvIGltcGxlbWVudAotICAgIC8vIF9z
dXBlcigpIGlmIG5lZWRlZAotICAgIGlmICh2YWx1ZS5mdW5jKSB7Ci0gICAgICB2YWx1ZSA9IGdp
dmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCB2YWx1ZSwgdmFsdWVzLCBkZXNjcyk7Ci0gICAg
fQotCi0gICAgZGVzY3Nba2V5XSAgPSB2YWx1ZTsKLSAgICB2YWx1ZXNba2V5XSA9IHVuZGVmaW5l
ZDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKGNvbmNhdHMgJiYgYV9pbmRleE9mLmNhbGwoY29uY2F0
cywga2V5KSA+PSAwKSB8fAotICAgICAgICAgICAgICAgIGtleSA9PT0gJ2NvbmNhdGVuYXRlZFBy
b3BlcnRpZXMnIHx8Ci0gICAgICAgICAgICAgICAga2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycp
IHsKLSAgICAgIHZhbHVlID0gYXBwbHlDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwg
dmFsdWUsIHZhbHVlcyk7Ci0gICAgfSBlbHNlIGlmICgobWVyZ2luZ3MgJiYgYV9pbmRleE9mLmNh
bGwobWVyZ2luZ3MsIGtleSkgPj0gMCkpIHsKLSAgICAgIHZhbHVlID0gYXBwbHlNZXJnZWRQcm9w
ZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7Ci0gICAgfSBlbHNlIGlmIChpc01ldGhv
ZCh2YWx1ZSkpIHsKLSAgICAgIHZhbHVlID0gZ2l2ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFs
dWUsIHZhbHVlcywgZGVzY3MpOwotICAgIH0KLQotICAgIGRlc2NzW2tleV0gPSB1bmRlZmluZWQ7
Ci0gICAgdmFsdWVzW2tleV0gPSB2YWx1ZTsKLSAgfQotfQotCi1mdW5jdGlvbiBtZXJnZU1peGlu
cyhtaXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UsIGtleXMpIHsKLSAgdmFyIG1peGluLCBw
cm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywgbWV0YTsKLQotICBmdW5jdGlvbiByZW1vdmVL
ZXlzKGtleU5hbWUpIHsKLSAgICBkZWxldGUgZGVzY3Nba2V5TmFtZV07Ci0gICAgZGVsZXRlIHZh
bHVlc1trZXlOYW1lXTsKLSAgfQotCi0gIGZvcih2YXIgaT0wLCBsPW1peGlucy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgbWl4aW4gPSBtaXhpbnNbaV07Ci0gICAgRW1iZXIuYXNzZXJ0KCdFeHBl
Y3RlZCBoYXNoIG9yIE1peGluIGluc3RhbmNlLCBnb3QgJyArIE9iamVjdC5wcm90b3R5cGUudG9T
dHJpbmcuY2FsbChtaXhpbiksCi0gICAgICAgICAgICAgICAgIHR5cGVvZiBtaXhpbiA9PT0gJ29i
amVjdCcgJiYgbWl4aW4gIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxs
KG1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7Ci0KLSAgICBwcm9wcyA9IG1peGluUHJvcGVy
dGllcyhtLCBtaXhpbik7Ci0gICAgaWYgKHByb3BzID09PSBDT05USU5VRSkgeyBjb250aW51ZTsg
fQotCi0gICAgaWYgKHByb3BzKSB7Ci0gICAgICBtZXRhID0gRW1iZXIubWV0YShiYXNlKTsKLSAg
ICAgIGlmIChiYXNlLndpbGxNZXJnZU1peGluKSB7IGJhc2Uud2lsbE1lcmdlTWl4aW4ocHJvcHMp
OyB9Ci0gICAgICBjb25jYXRzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdjb25jYXRl
bmF0ZWRQcm9wZXJ0aWVzJywgcHJvcHMsIHZhbHVlcywgYmFzZSk7Ci0gICAgICBtZXJnaW5ncyA9
IGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcygnbWVyZ2VkUHJvcGVydGllcycsIHByb3BzLCB2
YWx1ZXMsIGJhc2UpOwotCi0gICAgICBmb3IgKGtleSBpbiBwcm9wcykgewotICAgICAgICBpZiAo
IXByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgICAga2V5cy5w
dXNoKGtleSk7Ci0gICAgICAgIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHByb3Bz
W2tleV0sIG1ldGEsIGRlc2NzLCB2YWx1ZXMsIGNvbmNhdHMsIG1lcmdpbmdzKTsKLSAgICAgIH0K
LQotICAgICAgLy8gbWFudWFsbHkgY29weSB0b1N0cmluZygpIGJlY2F1c2Ugc29tZSBKUyBlbmdp
bmVzIGRvIG5vdCBlbnVtZXJhdGUgaXQKLSAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgn
dG9TdHJpbmcnKSkgeyBiYXNlLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7IH0KLSAgICB9IGVs
c2UgaWYgKG1peGluLm1peGlucykgewotICAgICAgbWVyZ2VNaXhpbnMobWl4aW4ubWl4aW5zLCBt
LCBkZXNjcywgdmFsdWVzLCBiYXNlLCBrZXlzKTsKLSAgICAgIGlmIChtaXhpbi5fd2l0aG91dCkg
eyBhX2ZvckVhY2guY2FsbChtaXhpbi5fd2l0aG91dCwgcmVtb3ZlS2V5cyk7IH0KLSAgICB9Ci0g
IH0KLX0KLQotdmFyIElTX0JJTkRJTkcgPSBFbWJlci5JU19CSU5ESU5HID0gL14uK0JpbmRpbmck
LzsKLQotZnVuY3Rpb24gZGV0ZWN0QmluZGluZyhvYmosIGtleSwgdmFsdWUsIG0pIHsKLSAgaWYg
KElTX0JJTkRJTkcudGVzdChrZXkpKSB7Ci0gICAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsK
LSAgICBpZiAoIWJpbmRpbmdzKSB7Ci0gICAgICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsK
LSAgICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICBi
aW5kaW5ncyA9IG0uYmluZGluZ3MgPSBvX2NyZWF0ZShtLmJpbmRpbmdzKTsKLSAgICB9Ci0gICAg
YmluZGluZ3Nba2V5XSA9IHZhbHVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGNvbm5lY3RCaW5kaW5n
cyhvYmosIG0pIHsKLSAgLy8gVE9ETyBNaXhpbi5hcHBseShpbnN0YW5jZSkgc2hvdWxkIGRpc2Nv
bm5lY3QgYmluZGluZyBpZiBleGlzdHMKLSAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5ncywga2V5
LCBiaW5kaW5nLCB0bzsKLSAgaWYgKGJpbmRpbmdzKSB7Ci0gICAgZm9yIChrZXkgaW4gYmluZGlu
Z3MpIHsKLSAgICAgIGJpbmRpbmcgPSBiaW5kaW5nc1trZXldOwotICAgICAgaWYgKGJpbmRpbmcp
IHsKLSAgICAgICAgdG8gPSBrZXkuc2xpY2UoMCwgLTcpOyAvLyBzdHJpcCBCaW5kaW5nIG9mZiBl
bmQKLSAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBFbWJlci5CaW5kaW5nKSB7Ci0gICAg
ICAgICAgYmluZGluZyA9IGJpbmRpbmcuY29weSgpOyAvLyBjb3B5IHByb3RvdHlwZXMnIGluc3Rh
bmNlCi0gICAgICAgICAgYmluZGluZy50byh0byk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIGJpbmRp
bmcgaXMgc3RyaW5nIHBhdGgKLSAgICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmco
dG8sIGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRpbmcuY29ubmVjdChvYmopOwot
ICAgICAgICBvYmpba2V5XSA9IGJpbmRpbmc7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG1hcmsg
YXMgYXBwbGllZAotICAgIG0uYmluZGluZ3MgPSB7fTsKLSAgfQotfQotCi1mdW5jdGlvbiBmaW5p
c2hQYXJ0aWFsKG9iaiwgbSkgewotICBjb25uZWN0QmluZGluZ3Mob2JqLCBtIHx8IEVtYmVyLm1l
dGEob2JqKSk7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLWZ1bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwg
ZGVzYywgbSwgZGVzY3MsIHZhbHVlcykgewotICB2YXIgYWx0S2V5ID0gZGVzYy5tZXRob2ROYW1l
LCB2YWx1ZTsKLSAgaWYgKGRlc2NzW2FsdEtleV0gfHwgdmFsdWVzW2FsdEtleV0pIHsKLSAgICB2
YWx1ZSA9IHZhbHVlc1thbHRLZXldOwotICAgIGRlc2MgID0gZGVzY3NbYWx0S2V5XTsKLSAgfSBl
bHNlIGlmIChtLmRlc2NzW2FsdEtleV0pIHsKLSAgICBkZXNjICA9IG0uZGVzY3NbYWx0S2V5XTsK
LSAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKLSAgfSBlbHNlIHsKLSAgICBkZXNjID0gdW5kZWZpbmVk
OwotICAgIHZhbHVlID0gb2JqW2FsdEtleV07Ci0gIH0KLQotICByZXR1cm4geyBkZXNjOiBkZXNj
LCB2YWx1ZTogdmFsdWUgfTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVu
ZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsIHBhdGhzS2V5LCB1cGRhdGVNZXRob2Qp
IHsKLSAgdmFyIHBhdGhzID0gb2JzZXJ2ZXJPckxpc3RlbmVyW3BhdGhzS2V5XTsKLQotICBpZiAo
cGF0aHMpIHsKLSAgICBmb3IgKHZhciBpPTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgICAgRW1iZXJbdXBkYXRlTWV0aG9kXShvYmosIHBhdGhzW2ldLCBudWxsLCBrZXkpOwotICAg
IH0KLSAgfQotfQotCi1mdW5jdGlvbiByZXBsYWNlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwg
a2V5LCBvYnNlcnZlck9yTGlzdGVuZXIpIHsKLSAgdmFyIHByZXYgPSBvYmpba2V5XTsKLQotICBp
ZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHByZXYpIHsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRM
aXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVzQmVmb3JlX18nLCAncmVt
b3ZlQmVmb3JlT2JzZXJ2ZXInKTsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2Jq
LCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVzX18nLCAncmVtb3ZlT2JzZXJ2ZXInKTsKLSAg
ICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2VtYmVyX2xp
c3RlbnNfXycsICdyZW1vdmVMaXN0ZW5lcicpOwotICB9Ci0KLSAgaWYgKCdmdW5jdGlvbicgPT09
IHR5cGVvZiBvYnNlcnZlck9yTGlzdGVuZXIpIHsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0
ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lciwgJ19fZW1iZXJfb2JzZXJ2ZXNCZWZv
cmVfXycsICdhZGRCZWZvcmVPYnNlcnZlcicpOwotICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3Rl
bmVycyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc19fJywg
J2FkZE9ic2VydmVyJyk7Ci0gICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5
LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVyX2xpc3RlbnNfXycsICdhZGRMaXN0ZW5lcicp
OwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5TWl4aW4ob2JqLCBtaXhpbnMsIHBhcnRpYWwpIHsK
LSAgdmFyIGRlc2NzID0ge30sIHZhbHVlcyA9IHt9LCBtID0gRW1iZXIubWV0YShvYmopLAotICAg
ICAga2V5LCB2YWx1ZSwgZGVzYywga2V5cyA9IFtdOwotCi0gIC8vIEdvIHRocm91Z2ggYWxsIG1p
eGlucyBhbmQgaGFzaGVzIHBhc3NlZCBpbiwgYW5kOgotICAvLwotICAvLyAqIEhhbmRsZSBjb25j
YXRlbmF0ZWQgcHJvcGVydGllcwotICAvLyAqIEhhbmRsZSBtZXJnZWQgcHJvcGVydGllcwotICAv
LyAqIFNldCB1cCBfc3VwZXIgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5Ci0gIC8vICogU2V0IHVwIGNv
bXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCi0gIC8vICogQ29weWluZyBgdG9TdHJpbmdgIGlu
IGJyb2tlbiBicm93c2VycwotICBtZXJnZU1peGlucyhtaXhpbnMsIG1peGluc01ldGEob2JqKSwg
ZGVzY3MsIHZhbHVlcywgb2JqLCBrZXlzKTsKLQotICBmb3IodmFyIGkgPSAwLCBsID0ga2V5cy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBrZXkgPSBrZXlzW2ldOwotICAgIGlmIChrZXkgPT09
ICdjb25zdHJ1Y3RvcicgfHwgIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVl
OyB9Ci0KLSAgICBkZXNjID0gZGVzY3Nba2V5XTsKLSAgICB2YWx1ZSA9IHZhbHVlc1trZXldOwot
Ci0gICAgaWYgKGRlc2MgPT09IFJFUVVJUkVEKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICB3aGlsZSAo
ZGVzYyAmJiBkZXNjIGluc3RhbmNlb2YgQWxpYXMpIHsKLSAgICAgIHZhciBmb2xsb3dlZCA9IGZv
bGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcyk7Ci0gICAgICBkZXNjID0gZm9s
bG93ZWQuZGVzYzsKLSAgICAgIHZhbHVlID0gZm9sbG93ZWQudmFsdWU7Ci0gICAgfQotCi0gICAg
aWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IGNvbnRpbnVl
OyB9Ci0KLSAgICByZXBsYWNlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCB2YWx1ZSk7
Ci0gICAgZGV0ZWN0QmluZGluZyhvYmosIGtleSwgdmFsdWUsIG0pOwotICAgIGRlZmluZVByb3Bl
cnR5KG9iaiwga2V5LCBkZXNjLCB2YWx1ZSwgbSk7Ci0gIH0KLQotICBpZiAoIXBhcnRpYWwpIHsg
Ly8gZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBlCi0gICAgZmluaXNoUGFydGlhbChvYmosIG0pOwot
ICB9Ci0KLSAgcmV0dXJuIG9iajsKLX0KLQotLyoqCi0gIEBtZXRob2QgbWl4aW4KLSAgQGZvciBF
bWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSBtaXhpbnMqCi0gIEByZXR1cm4gb2JqCi0qLwot
RW1iZXIubWl4aW4gPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKTsKLSAgYXBwbHlNaXhpbihvYmosIGFyZ3MsIGZhbHNlKTsKLSAgcmV0dXJu
IG9iajsKLX07Ci0KLS8qKgotICBUaGUgYEVtYmVyLk1peGluYCBjbGFzcyBhbGxvd3MgeW91IHRv
IGNyZWF0ZSBtaXhpbnMsIHdob3NlIHByb3BlcnRpZXMgY2FuIGJlCi0gIGFkZGVkIHRvIG90aGVy
IGNsYXNzZXMuIEZvciBpbnN0YW5jZSwKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5FZGl0YWJs
ZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAgZWRpdDogZnVuY3Rpb24oKSB7Ci0gICAgICBj
b25zb2xlLmxvZygnc3RhcnRpbmcgdG8gZWRpdCcpOwotICAgICAgdGhpcy5zZXQoJ2lzRWRpdGlu
ZycsIHRydWUpOwotICAgIH0sCi0gICAgaXNFZGl0aW5nOiBmYWxzZQotICB9KTsKLQotICAvLyBN
aXggbWl4aW5zIGludG8gY2xhc3NlcyBieSBwYXNzaW5nIHRoZW0gYXMgdGhlIGZpcnN0IGFyZ3Vt
ZW50cyB0bwotICAvLyAuZXh0ZW5kLgotICBBcHAuQ29tbWVudFZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZChBcHAuRWRpdGFibGUsIHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCd7eyNpZiB2aWV3LmlzRWRpdGluZ319Li4ue3tlbHNlfX0uLi57ey9pZn19JykKLSAgfSk7
Ci0KLSAgY29tbWVudFZpZXcgPSBBcHAuQ29tbWVudFZpZXcuY3JlYXRlKCk7Ci0gIGNvbW1lbnRW
aWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRpbmcgdG8gZWRpdCcKLSAgYGBgCi0KLSAgTm90
ZSB0aGF0IE1peGlucyBhcmUgY3JlYXRlZCB3aXRoIGBFbWJlci5NaXhpbi5jcmVhdGVgLCBub3QK
LSAgYEVtYmVyLk1peGluLmV4dGVuZGAuCi0KLSAgTm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBj
b25zdHJ1Y3RvcidzIHByb3RvdHlwZSBzbyBhcnJheXMgYW5kIG9iamVjdCBsaXRlcmFscwotICBk
ZWZpbmVkIGFzIHByb3BlcnRpZXMgd2lsbCBiZSBzaGFyZWQgYW1vbmdzdCBvYmplY3RzIHRoYXQg
aW1wbGVtZW50IHRoZSBtaXhpbi4KLSAgSWYgeW91IHdhbnQgdG8gZGVmaW5lIGFuIHByb3BlcnR5
IGluIGEgbWl4aW4gdGhhdCBpcyBub3Qgc2hhcmVkLCB5b3UgY2FuIGRlZmluZQotICBpdCBlaXRo
ZXIgYXMgYSBjb21wdXRlZCBwcm9wZXJ0eSBvciBoYXZlIGl0IGJlIGNyZWF0ZWQgb24gaW5pdGlh
bGl6YXRpb24gb2YgdGhlIG9iamVjdC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vZmlsdGVycyBh
cnJheSB3aWxsIGJlIHNoYXJlZCBhbW9uZ3N0IGFueSBvYmplY3QgaW1wbGVtZW50aW5nIG1peGlu
Ci0gIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICBmaWx0ZXJzOiBF
bWJlci5BKCkKLSAgfSk7Ci0KLSAgLy9maWx0ZXJzIHdpbGwgYmUgYSBzZXBhcmF0ZSAgYXJyYXkg
Zm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1peGluCi0gIEFwcC5GaWx0ZXJhYmxl
ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICBmaWx0ZXJzOiBFbWJlci5jb21wdXRlZChmdW5j
dGlvbigpe3JldHVybiBFbWJlci5BKCk7fSkKLSAgfSk7Ci0KLSAgLy9maWx0ZXJzIHdpbGwgYmUg
Y3JlYXRlZCBhcyBhIHNlcGFyYXRlIGFycmF5IGR1cmluZyB0aGUgb2JqZWN0J3MgaW5pdGlhbGl6
YXRpb24KLSAgQXBwLkZpbHRlcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAgIGluaXQ6
IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5fc3VwZXIoKTsKLSAgICAgIHRoaXMuc2V0KCJmaWx0
ZXJzIiwgRW1iZXIuQSgpKTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgTWl4aW4K
LSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLk1peGluID0gZnVuY3Rpb24oKSB7IHJldHVy
biBpbml0TWl4aW4odGhpcywgYXJndW1lbnRzKTsgfTsKLQotTWl4aW4gPSBFbWJlci5NaXhpbjsK
LQotTWl4aW4ucHJvdG90eXBlID0gewotICBwcm9wZXJ0aWVzOiBudWxsLAotICBtaXhpbnM6IG51
bGwsCi0gIG93bmVyQ29uc3RydWN0b3I6IG51bGwKLX07Ci0KLU1peGluLl9hcHBseSA9IGFwcGx5
TWl4aW47Ci0KLU1peGluLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgYXJn
cyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotICByZXR1cm4gYXBwbHlNaXhpbihvYmos
IGFyZ3MsIHRydWUpOwotfTsKLQotTWl4aW4uZmluaXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7
Ci0KLUVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7Ci0KLS8qKgotICBAbWV0aG9k
IGNyZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBhcmd1bWVudHMqCi0qLwotTWl4aW4uY3JlYXRl
ID0gZnVuY3Rpb24oKSB7Ci0gIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gdHJ1ZTsKLSAg
dmFyIE0gPSB0aGlzOwotICByZXR1cm4gaW5pdE1peGluKG5ldyBNKCksIGFyZ3VtZW50cyk7Ci19
OwotCi12YXIgTWl4aW5Qcm90b3R5cGUgPSBNaXhpbi5wcm90b3R5cGU7Ci0KLS8qKgotICBAbWV0
aG9kIHJlb3BlbgotICBAcGFyYW0gYXJndW1lbnRzKgotKi8KLU1peGluUHJvdG90eXBlLnJlb3Bl
biA9IGZ1bmN0aW9uKCkgewotICB2YXIgbWl4aW4sIHRtcDsKLQotICBpZiAodGhpcy5wcm9wZXJ0
aWVzKSB7Ci0gICAgbWl4aW4gPSBNaXhpbi5jcmVhdGUoKTsKLSAgICBtaXhpbi5wcm9wZXJ0aWVz
ID0gdGhpcy5wcm9wZXJ0aWVzOwotICAgIGRlbGV0ZSB0aGlzLnByb3BlcnRpZXM7Ci0gICAgdGhp
cy5taXhpbnMgPSBbbWl4aW5dOwotICB9IGVsc2UgaWYgKCF0aGlzLm1peGlucykgewotICAgIHRo
aXMubWl4aW5zID0gW107Ci0gIH0KLQotICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWl4
aW5zID0gdGhpcy5taXhpbnMsIGlkeDsKLQotICBmb3IoaWR4PTA7IGlkeCA8IGxlbjsgaWR4Kysp
IHsKLSAgICBtaXhpbiA9IGFyZ3VtZW50c1tpZHhdOwotICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0
ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3Ry
aW5nLmNhbGwobWl4aW4pLAotICAgICAgICAgICAgICAgICB0eXBlb2YgbWl4aW4gPT09ICdvYmpl
Y3QnICYmIG1peGluICE9PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCht
aXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOwotCi0gICAgaWYgKG1peGluIGluc3RhbmNlb2Yg
TWl4aW4pIHsKLSAgICAgIG1peGlucy5wdXNoKG1peGluKTsKLSAgICB9IGVsc2UgewotICAgICAg
dG1wID0gTWl4aW4uY3JlYXRlKCk7Ci0gICAgICB0bXAucHJvcGVydGllcyA9IG1peGluOwotICAg
ICAgbWl4aW5zLnB1c2godG1wKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdGhpczsKLX07Ci0K
LS8qKgotICBAbWV0aG9kIGFwcGx5Ci0gIEBwYXJhbSBvYmoKLSAgQHJldHVybiBhcHBsaWVkIG9i
amVjdAotKi8KLU1peGluUHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVy
biBhcHBseU1peGluKG9iaiwgW3RoaXNdLCBmYWxzZSk7Ci19OwotCi1NaXhpblByb3RvdHlwZS5h
cHBseVBhcnRpYWwgPSBmdW5jdGlvbihvYmopIHsKLSAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBb
dGhpc10sIHRydWUpOwotfTsKLQotZnVuY3Rpb24gX2RldGVjdChjdXJNaXhpbiwgdGFyZ2V0TWl4
aW4sIHNlZW4pIHsKLSAgdmFyIGd1aWQgPSBndWlkRm9yKGN1ck1peGluKTsKLQotICBpZiAoc2Vl
bltndWlkXSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgc2VlbltndWlkXSA9IHRydWU7Ci0KLSAgaWYg
KGN1ck1peGluID09PSB0YXJnZXRNaXhpbikgeyByZXR1cm4gdHJ1ZTsgfQotICB2YXIgbWl4aW5z
ID0gY3VyTWl4aW4ubWl4aW5zLCBsb2MgPSBtaXhpbnMgPyBtaXhpbnMubGVuZ3RoIDogMDsKLSAg
d2hpbGUgKC0tbG9jID49IDApIHsKLSAgICBpZiAoX2RldGVjdChtaXhpbnNbbG9jXSwgdGFyZ2V0
TWl4aW4sIHNlZW4pKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQot
Ci0vKioKLSAgQG1ldGhvZCBkZXRlY3QKLSAgQHBhcmFtIG9iagotICBAcmV0dXJuIHtCb29sZWFu
fQotKi8KLU1peGluUHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9i
aikgeyByZXR1cm4gZmFsc2U7IH0KLSAgaWYgKG9iaiBpbnN0YW5jZW9mIE1peGluKSB7IHJldHVy
biBfZGV0ZWN0KG9iaiwgdGhpcywge30pOyB9Ci0gIHZhciBtaXhpbnMgPSBFbWJlci5tZXRhKG9i
aiwgZmFsc2UpLm1peGluczsKLSAgaWYgKG1peGlucykgewotICAgIHJldHVybiAhIW1peGluc1tn
dWlkRm9yKHRoaXMpXTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19OwotCi1NaXhpblByb3RvdHlw
ZS53aXRob3V0ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciByZXQgPSBuZXcgTWl4aW4odGhpcyk7Ci0g
IHJldC5fd2l0aG91dCA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICByZXR1cm4gcmV0Owot
fTsKLQotZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgewotICBpZiAoc2VlbltndWlk
Rm9yKG1peGluKV0pIHsgcmV0dXJuOyB9Ci0gIHNlZW5bZ3VpZEZvcihtaXhpbildID0gdHJ1ZTsK
LQotICBpZiAobWl4aW4ucHJvcGVydGllcykgewotICAgIHZhciBwcm9wcyA9IG1peGluLnByb3Bl
cnRpZXM7Ci0gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7Ci0gICAgICBpZiAocHJvcHMuaGFz
T3duUHJvcGVydHkoa2V5KSkgeyByZXRba2V5XSA9IHRydWU7IH0KLSAgICB9Ci0gIH0gZWxzZSBp
ZiAobWl4aW4ubWl4aW5zKSB7Ci0gICAgYV9mb3JFYWNoLmNhbGwobWl4aW4ubWl4aW5zLCBmdW5j
dGlvbih4KSB7IF9rZXlzKHJldCwgeCwgc2Vlbik7IH0pOwotICB9Ci19Ci0KLU1peGluUHJvdG90
eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGtleXMgPSB7fSwgc2VlbiA9IHt9LCByZXQg
PSBbXTsKLSAgX2tleXMoa2V5cywgdGhpcywgc2Vlbik7Ci0gIGZvcih2YXIga2V5IGluIGtleXMp
IHsKLSAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldC5wdXNoKGtleSk7IH0K
LSAgfQotICByZXR1cm4gcmV0OwotfTsKLQotLy8gcmV0dXJucyB0aGUgbWl4aW5zIGN1cnJlbnRs
eSBhcHBsaWVkIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0vLyBUT0RPOiBNYWtlIEVtYmVyLm1p
eGluCi1NaXhpbi5taXhpbnMgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG1peGlucyA9IEVtYmVy
Lm1ldGEob2JqLCBmYWxzZSkubWl4aW5zLCByZXQgPSBbXTsKLQotICBpZiAoIW1peGlucykgeyBy
ZXR1cm4gcmV0OyB9Ci0KLSAgZm9yICh2YXIga2V5IGluIG1peGlucykgewotICAgIHZhciBtaXhp
biA9IG1peGluc1trZXldOwotCi0gICAgLy8gc2tpcCBwcmltaXRpdmUgbWl4aW5zIHNpbmNlIHRo
ZXNlIGFyZSBhbHdheXMgYW5vbnltb3VzCi0gICAgaWYgKCFtaXhpbi5wcm9wZXJ0aWVzKSB7IHJl
dC5wdXNoKG1peGluKTsgfQotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX07Ci0KLVJFUVVJUkVEID0g
bmV3IEVtYmVyLkRlc2NyaXB0b3IoKTsKLVJFUVVJUkVELnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7
IHJldHVybiAnKFJlcXVpcmVkIFByb3BlcnR5KSc7IH07Ci0KLS8qKgotICBEZW5vdGVzIGEgcmVx
dWlyZWQgcHJvcGVydHkgZm9yIGEgbWl4aW4KLQotICBAbWV0aG9kIHJlcXVpcmVkCi0gIEBmb3Ig
RW1iZXIKLSovCi1FbWJlci5yZXF1aXJlZCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gUkVRVUlS
RUQ7Ci19OwotCi1BbGlhcyA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgdGhpcy5tZXRob2RO
YW1lID0gbWV0aG9kTmFtZTsKLX07Ci1BbGlhcy5wcm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3Jp
cHRvcigpOwotCi0vKioKLSAgTWFrZXMgYSBwcm9wZXJ0eSBvciBtZXRob2QgYXZhaWxhYmxlIHZp
YSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGFpbnRTYW1w
bGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBjb2xvcjogJ3JlZCcsCi0gICAgY29sb3Vy
OiBFbWJlci5hbGlhcygnY29sb3InKSwKLSAgICBuYW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJl
dHVybiAiWmVkIjsKLSAgICB9LAotICAgIG1vbmlrZXI6IEVtYmVyLmFsaWFzKCJuYW1lIikKLSAg
fSk7Ci0KLSAgdmFyIHBhaW50U2FtcGxlID0gQXBwLlBhaW50U2FtcGxlLmNyZWF0ZSgpCi0gIHBh
aW50U2FtcGxlLmdldCgnY29sb3VyJyk7ICAvLyAncmVkJwotICBwYWludFNhbXBsZS5tb25pa2Vy
KCk7ICAgICAgLy8gJ1plZCcKLSAgYGBgCi0KLSAgQG1ldGhvZCBhbGlhcwotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCBvciBwcm9w
ZXJ0eSB0byBhbGlhcwotICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotICBAZGVwcmVjYXRl
ZCBVc2UgYEVtYmVyLmFsaWFzTWV0aG9kYCBvciBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgIGluc3Rl
YWQKLSovCi1FbWJlci5hbGlhcyA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgRW1iZXIuZGVw
cmVjYXRlKCJFbWJlci5hbGlhcyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLmFsaWFz
TWV0aG9kIG9yIEVtYmVyLmNvbXB1dGVkLmFsaWFzIGluc3RlYWQuIik7Ci0gIHJldHVybiBuZXcg
QWxpYXMobWV0aG9kTmFtZSk7Ci19OwotCi0vKioKLSAgTWFrZXMgYSBtZXRob2QgYXZhaWxhYmxl
IHZpYSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29u
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICBy
ZXR1cm4gJ1RvbWh1ZGEgS2F0emRhbGUnOwotICAgIH0sCi0gICAgbW9uaWtlcjogRW1iZXIuYWxp
YXNNZXRob2QoJ25hbWUnKQotICB9KTsKLQotICB2YXIgZ29vZEd1eSA9IEFwcC5QZXJzb24uY3Jl
YXRlKCkKLSAgYGBgCi0KLSAgQG1ldGhvZCBhbGlhc01ldGhvZAotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBhbGlhcwotICBA
cmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotKi8KLUVtYmVyLmFsaWFzTWV0aG9kID0gZnVuY3Rp
b24obWV0aG9kTmFtZSkgewotICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOwotfTsKLQot
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgotLy8gT0JTRVJWRVIgSEVMUEVSCi0vLwotCi0vKioKLSAgU3BlY2lmeSBhIG1ldGhvZCB0
aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgICB2YWx1ZU9ic2VydmVyOiBFbWJlci5vYnNlcnZlcigndmFs
dWUnLCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUi
IHByb3BlcnR5IGNoYW5nZXMKLSAgICB9KQotICB9KTsKLSAgYGBgCi0KLSAgSW4gdGhlIGZ1dHVy
ZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4gSWYgeW91IHdhbnQgdG8gZW5z
dXJlCi0gIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1c2UgYGltbWVkaWF0ZU9ic2VydmVyYC4KLQot
ICBBbHNvIGF2YWlsYWJsZSBhcyBgRnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzYCBpZiBwcm90
b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAgZW5hYmxlZC4KLQotICBAbWV0aG9kIG9ic2VydmVyCi0g
IEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCi0gIEBwYXJhbSB7
RnVuY3Rpb259IGZ1bmMKLSAgQHJldHVybiBmdW5jCi0qLwotRW1iZXIub2JzZXJ2ZXIgPSBmdW5j
dGlvbigpIHsKLSAgdmFyIGZ1bmMgID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdOwot
ICB2YXIgcGF0aHM7Ci0KLSAgCi0gICAgcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAw
LCAtMSk7Ci0KLSAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKLSAgICAgIC8v
IHJldmVydCB0byBvbGQsIHNvZnQtZGVwcmVjYXRlZCBhcmd1bWVudCBvcmRlcmluZwotCi0gICAg
ICBmdW5jICA9IGFyZ3VtZW50c1swXTsKLSAgICAgIHBhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSk7Ci0gICAgfQotICAKLQotICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIp
IHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVtYmVyLm9ic2VydmVyIGNhbGxlZCB3aXRo
b3V0IGEgZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZ1bmMuX19lbWJlcl9vYnNlcnZlc19fID0gcGF0
aHM7Ci0gIHJldHVybiBmdW5jOwotfTsKLQotLyoqCi0gIFNwZWNpZnkgYSBtZXRob2QgdGhhdCBv
YnNlcnZlcyBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuT2Jq
ZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNlcnZlcjogRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIo
J3ZhbHVlJywgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZh
bHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEluIHRoZSBm
dXR1cmUsIGBFbWJlci5vYnNlcnZlcmAgbWF5IGJlY29tZSBhc3luY2hyb25vdXMuIEluIHRoaXMg
ZXZlbnQsCi0gIGBFbWJlci5pbW1lZGlhdGVPYnNlcnZlcmAgd2lsbCBtYWludGFpbiB0aGUgc3lu
Y2hyb25vdXMgYmVoYXZpb3IuCi0KLSAgQWxzbyBhdmFpbGFibGUgYXMgYEZ1bmN0aW9uLnByb3Rv
dHlwZS5vYnNlcnZlc0ltbWVkaWF0ZWx5YCBpZiBwcm90b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAg
ZW5hYmxlZC4KLQotICBAbWV0aG9kIGltbWVkaWF0ZU9ic2VydmVyCi0gIEBmb3IgRW1iZXIKLSAg
QHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMK
LSAgQHJldHVybiBmdW5jCi0qLwotRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIgPSBmdW5jdGlvbigp
IHsKLSAgZm9yICh2YXIgaT0wLCBsPWFyZ3VtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKLSAgICBFbWJlci5hc3NlcnQoIkltbWVkaWF0ZSBvYnNl
cnZlcnMgbXVzdCBvYnNlcnZlIGludGVybmFsIHByb3BlcnRpZXMgb25seSwgbm90IHByb3BlcnRp
ZXMgb24gb3RoZXIgb2JqZWN0cy4iLCB0eXBlb2YgYXJnICE9PSAic3RyaW5nIiB8fCBhcmcuaW5k
ZXhPZignLicpID09PSAtMSk7Ci0gIH0KLQotICByZXR1cm4gRW1iZXIub2JzZXJ2ZXIuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5
IGFyZSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzIGBvYmpgLCBga2V5TmFtZWAuCi0KLSAgTm90
ZSwgYEBlYWNoLnByb3BlcnR5YCBvYnNlcnZlciBpcyBjYWxsZWQgcGVyIGVhY2ggYWRkIG9yIHJl
cGxhY2Ugb2YgYW4gZWxlbWVudAotICBhbmQgaXQncyBub3QgY2FsbGVkIHdpdGggYSBzcGVjaWZp
YyBlbnVtZXJhdGlvbiBpdGVtLgotCi0gIEEgYGJlZm9yZU9ic2VydmVyYCBmaXJlcyBiZWZvcmUg
YSBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIEEgYGJlZm9yZU9ic2VydmVyYCBpcyBhbiBhbHRlcm5h
dGl2ZSBmb3JtIG9mIGAub2JzZXJ2ZXNCZWZvcmUoKWAuCi0KLSAgYGBgamF2YXNjcmlwdAotICBB
cHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLQotICAgIGZyaWVuZHM6IFt7IG5h
bWU6ICdUb20nIH0sIHsgbmFtZTogJ1N0ZWZhbicgfSwgeyBuYW1lOiAnS3JpcycgfV0sCi0KLSAg
ICB2YWx1ZVdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50LnZhbHVlJywg
ZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gICAgICB0aGlzLmNoYW5naW5nRnJvbSA9IG9iai5n
ZXQoa2V5TmFtZSk7Ci0gICAgfSksCi0KLSAgICB2YWx1ZURpZENoYW5nZTogRW1iZXIub2JzZXJ2
ZXIoJ2NvbnRlbnQudmFsdWUnLCBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgICAgICAgLy8g
b25seSBydW4gaWYgdXBkYXRpbmcgYSB2YWx1ZSBhbHJlYWR5IGluIHRoZSBET00KLSAgICAgICAg
aWYgKHRoaXMuZ2V0KCdzdGF0ZScpID09PSAnaW5ET00nKSB7Ci0gICAgICAgICAgdmFyIGNvbG9y
ID0gb2JqLmdldChrZXlOYW1lKSA+IHRoaXMuY2hhbmdpbmdGcm9tID8gJ2dyZWVuJyA6ICdyZWQn
OwotICAgICAgICAgIC8vIGxvZ2ljCi0gICAgICAgIH0KLSAgICB9KSwKLQotICAgIGZyaWVuZHNE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdmcmllbmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKLSAgICAgIC8vIHNvbWUgbG9naWMKLSAgICAgIC8vIG9iai5nZXQoa2V5
TmFtZSkgcmV0dXJucyBmcmllbmRzIGFycmF5Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEFs
c28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNCZWZvcmVgIGlmIHBy
b3RvdHlwZSBleHRlbnNpb25zIGFyZQotICBlbmFibGVkLgotCi0gIEBtZXRob2QgYmVmb3JlT2Jz
ZXJ2ZXIKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lcyoKLSAg
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0dXJuIGZ1bmMKLSovCi1FbWJlci5iZWZvcmVP
YnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICB2YXIgZnVuYyAgPSBhX3NsaWNlLmNhbGwoYXJndW1l
bnRzLCAtMSlbMF07Ci0gIHZhciBwYXRoczsKLQotICAKLSAgICBwYXRocyA9IGFfc2xpY2UuY2Fs
bChhcmd1bWVudHMsIDAsIC0xKTsKLQotICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9u
IikgewotICAgICAgLy8gcmV2ZXJ0IHRvIG9sZCwgc29mdC1kZXByZWNhdGVkIGFyZ3VtZW50IG9y
ZGVyaW5nCi0KLSAgICAgIGZ1bmMgID0gYXJndW1lbnRzWzBdOwotICAgICAgcGF0aHMgPSBhX3Ns
aWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICB9Ci0gIAotCi0gIGlmICh0eXBlb2YgZnVuYyAh
PT0gImZ1bmN0aW9uIikgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiRW1iZXIuYmVmb3Jl
T2JzZXJ2ZXIgY2FsbGVkIHdpdGhvdXQgYSBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZnVuYy5fX2Vt
YmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsKLSAgcmV0dXJuIGZ1bmM7Ci19OwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gUHJvdmlkZXMgYSB3YXkgdG8gcmVnaXN0ZXIgbGli
cmFyeSB2ZXJzaW9ucyB3aXRoIGVtYmVyLgotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMuZm9yRWFjaCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4
T2Y7Ci0KLUVtYmVyLmxpYnJhcmllcyA9IGZ1bmN0aW9uKCkgewotICB2YXIgbGlicmFyaWVzICAg
ID0gW107Ci0gIHZhciBjb3JlTGliSW5kZXggPSAwOwotCi0gIHZhciBnZXRMaWJyYXJ5ID0gZnVu
Y3Rpb24obmFtZSkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsg
aSsrKSB7Ci0gICAgICBpZiAobGlicmFyaWVzW2ldLm5hbWUgPT09IG5hbWUpIHsKLSAgICAgICAg
cmV0dXJuIGxpYnJhcmllc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0KLSAgbGlicmFyaWVz
LnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgdmVyc2lvbikgewotICAgIGlmICghZ2V0TGlicmFy
eShuYW1lKSkgewotICAgICAgbGlicmFyaWVzLnB1c2goe25hbWU6IG5hbWUsIHZlcnNpb246IHZl
cnNpb259KTsKLSAgICB9Ci0gIH07Ci0KLSAgbGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkg
PSBmdW5jdGlvbihuYW1lLCB2ZXJzaW9uKSB7Ci0gICAgaWYgKCFnZXRMaWJyYXJ5KG5hbWUpKSB7
Ci0gICAgICBsaWJyYXJpZXMuc3BsaWNlKGNvcmVMaWJJbmRleCsrLCAwLCB7bmFtZTogbmFtZSwg
dmVyc2lvbjogdmVyc2lvbn0pOwotICAgIH0KLSAgfTsKLQotICBsaWJyYXJpZXMuZGVSZWdpc3Rl
ciA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgbGliID0gZ2V0TGlicmFyeShuYW1lKTsKLSAg
ICBpZiAobGliKSBsaWJyYXJpZXMuc3BsaWNlKGluZGV4T2YobGlicmFyaWVzLCBsaWIpLCAxKTsK
LSAgfTsKLQotICBsaWJyYXJpZXMuZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewotICAgIGZv
ckVhY2gobGlicmFyaWVzLCBmdW5jdGlvbihsaWIpIHsKLSAgICAgIGNhbGxiYWNrKGxpYi5uYW1l
LCBsaWIudmVyc2lvbik7Ci0gICAgfSk7Ci0gIH07Ci0KLSAgcmV0dXJuIGxpYnJhcmllczsKLX0o
KTsKLQotRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyJywgRW1iZXIu
VkVSU0lPTik7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIE1ldGFs
Ci0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLX0pKCk7Ci0K
LShmdW5jdGlvbigpIHsKLS8qKgotICBAY2xhc3MgUlNWUAotICBAbW9kdWxlIFJTVlAKLSAgKi8K
LWRlZmluZSgicnN2cC9hbGwiLCAKLSAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0
aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0g
ICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIC8qKgot
ICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIGBSU1ZQLlByb21pc2UuYWxsYC4K
LQotICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJh
eX0gYXJyYXkgQXJyYXkgb2YgcHJvbWlzZXMuCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
QW4gb3B0aW9uYWwgbGFiZWwuIFRoaXMgaXMgdXNlZnVsCi0gICAgICBmb3IgdG9vbGluZy4KLSAg
ICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlv
biBhbGwoYXJyYXksIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXJyYXksIGxh
YmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9hbGxfc2V0dGxlZCIsIAotICBbIi4v
cHJvbWlzZSIsIi4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFf
XywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAg
ICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBpc0Fy
cmF5ID0gX19kZXBlbmRlbmN5Ml9fLmlzQXJyYXk7Ci0gICAgdmFyIGlzTm9uVGhlbmFibGUgPSBf
X2RlcGVuZGVuY3kyX18uaXNOb25UaGVuYWJsZTsKLQotICAgIC8qKgotICAgICAgYFJTVlAuYWxs
U2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNWUC5hbGxgLCBidXQgaW5zdGVhZCBvZiBpbXBsZW1l
bnRpbmcKLSAgICAgIGEgZmFpbC1mYXN0IG1ldGhvZCwgaXQgd2FpdHMgdW50aWwgYWxsIHRoZSBw
cm9taXNlcyBoYXZlIHJldHVybmVkIGFuZAotICAgICAgc2hvd3MgeW91IGFsbCB0aGUgcmVzdWx0
cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gaGFuZGxlIG11bHRpcGxlCi0gICAgICBw
cm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIgYXMgYSBzZXQuCi0KLSAgICAgIFJldHVy
bnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNl
cyBoYXZlIGJlZW4KLSAgICAgIHNldHRsZWQuIFRoZSByZXR1cm4gcHJvbWlzZSBpcyBmdWxmaWxs
ZWQgd2l0aCBhbiBhcnJheSBvZiB0aGUgc3RhdGVzIG9mCi0gICAgICB0aGUgcHJvbWlzZXMgcGFz
c2VkIGludG8gdGhlIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQuCi0KLSAgICAgIEVhY2ggc3Rh
dGUgb2JqZWN0IHdpbGwgZWl0aGVyIGluZGljYXRlIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiwg
YW5kCi0gICAgICBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9yIHJlYXNvbi4gVGhl
IHN0YXRlcyB3aWxsIHRha2Ugb25lIG9mCi0gICAgICB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTog
dmFsdWUgfQotICAgICAgICBvcgotICAgICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBy
ZWFzb24gfQotICAgICAgYGBgCi0KLSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwotICAgICAg
dmFyIHByb21pc2UyID0gUlNWUC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJzInKSk7Ci0gICAg
ICB2YXIgcHJvbWlzZTMgPSBSU1ZQLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcignMycpKTsKLSAg
ICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0g
ICAgICBSU1ZQLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpewotICAg
ICAgICAvLyBhcnJheSA9PSBbCi0gICAgICAgIC8vICAgeyBzdGF0ZTogJ2Z1bGZpbGxlZCcsIHZh
bHVlOiAxIH0sCi0gICAgICAgIC8vICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJv
ciB9LAotICAgICAgICAvLyAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJlYXNvbjogRXJyb3IgfQot
ICAgICAgICAvLyBdCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgdGhlIHNlY29uZCBpdGVtLCBy
ZWFzb24ubWVzc2FnZSB3aWxsIGJlICIyIiwgYW5kIGZvciB0aGUKLSAgICAgICAgLy8gdGhpcmQg
aXRlbSwgcmVhc29uLm1lc3NhZ2Ugd2lsbCBiZSAiMyIuCi0gICAgICB9LCBmdW5jdGlvbihlcnJv
cikgewotICAgICAgICAvLyBOb3QgcnVuLiAoVGhpcyBibG9jayB3b3VsZCBvbmx5IGJlIGNhbGxl
ZCBpZiBhbGxTZXR0bGVkIGhhZCBmYWlsZWQsCi0gICAgICAgIC8vIGZvciBpbnN0YW5jZSBpZiBw
YXNzZWQgYW4gaW5jb3JyZWN0IGFyZ3VtZW50IHR5cGUuKQotICAgICAgfSk7Ci0gICAgICBgYGAK
LQotICAgICAgQG1ldGhvZCBhbGxTZXR0bGVkCi0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJh
bSB7QXJyYXl9IHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25h
bCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRv
b2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVk
IHdpdGggYW4gYXJyYXkgb2YgdGhlIHNldHRsZWQKLSAgICAgIHN0YXRlcyBvZiB0aGUgY29uc3Rp
dHVlbnQgcHJvbWlzZXMuCi0gICAgICBAc3RhdGljCi0gICAgKi8KLQotICAgIF9fZXhwb3J0c19f
WyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBhbGxTZXR0bGVkKGVudHJpZXMsIGxhYmVsKSB7Ci0gICAg
ICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAg
IGlmICghaXNBcnJheShlbnRyaWVzKSkgewotICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
J1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gYWxsU2V0dGxlZC4nKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHZhciByZW1haW5pbmcgPSBlbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgdmFyIGVudHJ5
OwotCi0gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHsKLSAgICAgICAgICByZXNvbHZlKFtd
KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcmVzdWx0cyA9
IG5ldyBBcnJheShyZW1haW5pbmcpOwotCi0gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZFJlc29s
dmVyKGluZGV4KSB7Ci0gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAg
ICAgICByZXNvbHZlQWxsKGluZGV4LCBmdWxmaWxsZWQodmFsdWUpKTsKLSAgICAgICAgICB9Owot
ICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWRSZXNvbHZlcihpbmRleCkgewot
ICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAgICAgIHJlc29sdmVB
bGwoaW5kZXgsIHJlamVjdGVkKHJlYXNvbikpOwotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQot
ICAgICAgICBmdW5jdGlvbiByZXNvbHZlQWxsKGluZGV4LCB2YWx1ZSkgewotICAgICAgICAgIHJl
c3VsdHNbaW5kZXhdID0gdmFsdWU7Ci0gICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7
Ci0gICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5k
ZXgrKykgewotICAgICAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleF07Ci0KLSAgICAgICAgICBp
ZiAoaXNOb25UaGVuYWJsZShlbnRyeSkpIHsKLSAgICAgICAgICAgIHJlc29sdmVBbGwoaW5kZXgs
IGZ1bGZpbGxlZChlbnRyeSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQcm9t
aXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkUmVzb2x2ZXIoaW5kZXgpLCByZWplY3RlZFJl
c29sdmVyKGluZGV4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9LCBsYWJlbCk7
Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgewotICAgICAgcmV0dXJu
IHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTsKLSAgICB9Ci0KLSAgICBmdW5j
dGlvbiByZWplY3RlZChyZWFzb24pIHsKLSAgICAgIHJldHVybiB7IHN0YXRlOiAncmVqZWN0ZWQn
LCByZWFzb246IHJlYXNvbiB9OwotICAgIH0KLSAgfSk7Ci1kZWZpbmUoInJzdnAvY29uZmlnIiwg
Ci0gIFsiLi9ldmVudHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywg
X19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0g
X19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0KLSAgICB2YXIgY29uZmlnID0gewotICAgICAg
aW5zdHJ1bWVudDogZmFsc2UKLSAgICB9OwotCi0gICAgRXZlbnRUYXJnZXQubWl4aW4oY29uZmln
KTsKLQotICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZShuYW1lLCB2YWx1ZSkgewotICAgICAgaWYgKG5h
bWUgPT09ICdvbmVycm9yJykgewotICAgICAgICAvLyBoYW5kbGUgZm9yIGxlZ2FjeSB1c2VycyB0
aGF0IGV4cGVjdCB0aGUgYWN0dWFsCi0gICAgICAgIC8vIGVycm9yIHRvIGJlIHBhc3NlZCB0byB0
aGVpciBmdW5jdGlvbiBhZGRlZCB2aWEKLSAgICAgICAgLy8gYFJTVlAuY29uZmlndXJlKCdvbmVy
cm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAotICAgICAgICBjb25maWcub24oJ2Vycm9yJywgdmFs
dWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhcmd1bWVudHMubGVu
Z3RoID09PSAyKSB7Ci0gICAgICAgIGNvbmZpZ1tuYW1lXSA9IHZhbHVlOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1tuYW1lXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBf
X2V4cG9ydHNfXy5jb25maWcgPSBjb25maWc7Ci0gICAgX19leHBvcnRzX18uY29uZmlndXJlID0g
Y29uZmlndXJlOwotICB9KTsKLWRlZmluZSgicnN2cC9kZWZlciIsIAotICBbIi4vcHJvbWlzZSIs
ImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVm
YXVsdCJdOwotCi0gICAgLyoqCi0gICAgICBgUlNWUC5kZWZlcmAgcmV0dXJucyBhbiBvYmplY3Qg
c2ltaWxhciB0byBqUXVlcnkncyBgJC5EZWZlcnJlZGAuCi0gICAgICBgUlNWUC5kZWZlcmAgc2hv
dWxkIGJlIHVzZWQgd2hlbiBwb3J0aW5nIG92ZXIgY29kZSByZWxpYW50IG9uIGAkLkRlZmVycmVk
YCdzCi0gICAgICBpbnRlcmZhY2UuIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIGBSU1ZQLlByb21p
c2VgIGNvbnN0cnVjdG9yIGluc3RlYWQuCi0KLSAgICAgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJv
bSBgUlNWUC5kZWZlcmAgaXMgYSBwbGFpbiBvYmplY3Qgd2l0aCB0aHJlZSBwcm9wZXJ0aWVzOgot
Ci0gICAgICAqIHByb21pc2UgLSBhbiBgUlNWUC5Qcm9taXNlYC4KLSAgICAgICogcmVqZWN0IC0g
YSBmdW5jdGlvbiB0aGF0IGNhdXNlcyB0aGUgYHByb21pc2VgIHByb3BlcnR5IG9uIHRoaXMgb2Jq
ZWN0IHRvCi0gICAgICAgIGJlY29tZSByZWplY3RlZAotICAgICAgKiByZXNvbHZlIC0gYSBmdW5j
dGlvbiB0aGF0IGNhdXNlcyB0aGUgYHByb21pc2VgIHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IHRv
Ci0gICAgICAgIGJlY29tZSBmdWxmaWxsZWQuCi0KLSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgICAgdmFyIGRlZmVycmVkID0gUlNWUC5kZWZlcigpOwotCi0gICAg
ICAgZGVmZXJyZWQucmVzb2x2ZSgiU3VjY2VzcyEiKTsKLQotICAgICAgIGRlZmVyZWQucHJvbWlz
ZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKLSAgICAgICAgIC8vIHZhbHVlIGhlcmUgaXMgIlN1Y2Nl
c3MhIgotICAgICAgIH0pOwotICAgICAgIGBgYAotCi0gICAgICBAbWV0aG9kIGRlZmVyCi0gICAg
ICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
Zm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7T2JqZWN0fQotICAgICAqLwotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQi
XSA9IGZ1bmN0aW9uIGRlZmVyKGxhYmVsKSB7Ci0gICAgICB2YXIgZGVmZXJyZWQgPSB7IH07Ci0K
LSAgICAgIGRlZmVycmVkLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpIHsKLSAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSA9IHJlc29sdmU7Ci0gICAgICAgIGRl
ZmVycmVkLnJlamVjdCA9IHJlamVjdDsKLSAgICAgIH0sIGxhYmVsKTsKLQotICAgICAgcmV0dXJu
IGRlZmVycmVkOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL2V2ZW50cyIsIAotICBbImV4
cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0g
ICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbihjYWxsYmFja3MsIGNhbGxiYWNrKSB7Ci0gICAgICBm
b3IgKHZhciBpPTAsIGw9Y2FsbGJhY2tzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgaWYg
KGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2spIHsgcmV0dXJuIGk7IH0KLSAgICAgIH0KLQotICAg
ICAgcmV0dXJuIC0xOwotICAgIH07Ci0KLSAgICB2YXIgY2FsbGJhY2tzRm9yID0gZnVuY3Rpb24o
b2JqZWN0KSB7Ci0gICAgICB2YXIgY2FsbGJhY2tzID0gb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tz
OwotCi0gICAgICBpZiAoIWNhbGxiYWNrcykgewotICAgICAgICBjYWxsYmFja3MgPSBvYmplY3Qu
X3Byb21pc2VDYWxsYmFja3MgPSB7fTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGNhbGxiYWNr
czsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICBAY2xhc3MgUlNWUC5FdmVudFRhcmdldAotICAg
ICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IHsKLQotICAgICAgLyoqCi0gICAgICAg
IGBSU1ZQLkV2ZW50VGFyZ2V0Lm1peGluYCBleHRlbmRzIGFuIG9iamVjdCB3aXRoIEV2ZW50VGFy
Z2V0IG1ldGhvZHMuIEZvcgotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgICAgdmFyIG9iamVjdCA9IHt9OwotCi0gICAgICAgIFJTVlAuRXZlbnRUYXJnZXQu
bWl4aW4ob2JqZWN0KTsKLQotICAgICAgICBvYmplY3Qub24oImZpbmlzaGVkIiwgZnVuY3Rpb24o
ZXZlbnQpIHsKLSAgICAgICAgICAvLyBoYW5kbGUgZXZlbnQKLSAgICAgICAgfSk7Ci0KLSAgICAg
ICAgb2JqZWN0LnRyaWdnZXIoImZpbmlzaGVkIiwgeyBkZXRhaWw6IHZhbHVlIH0pOwotICAgICAg
ICBgYGAKLQotICAgICAgICBgRXZlbnRUYXJnZXQubWl4aW5gIGFsc28gd29ya3Mgd2l0aCBwcm90
b3R5cGVzOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIFBlcnNvbiA9IGZ1
bmN0aW9uKCkge307Ci0gICAgICAgIFJTVlAuRXZlbnRUYXJnZXQubWl4aW4oUGVyc29uLnByb3Rv
dHlwZSk7Ci0KLSAgICAgICAgdmFyIHllaHVkYSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgdmFy
IHRvbSA9IG5ldyBQZXJzb24oKTsKLQotICAgICAgICB5ZWh1ZGEub24oInBva2UiLCBmdW5jdGlv
bihldmVudCkgewotICAgICAgICAgIGNvbnNvbGUubG9nKCJZZWh1ZGEgc2F5cyBPVyIpOwotICAg
ICAgICB9KTsKLQotICAgICAgICB0b20ub24oInBva2UiLCBmdW5jdGlvbihldmVudCkgewotICAg
ICAgICAgIGNvbnNvbGUubG9nKCJUb20gc2F5cyBPVyIpOwotICAgICAgICB9KTsKLQotICAgICAg
ICB5ZWh1ZGEudHJpZ2dlcigicG9rZSIpOwotICAgICAgICB0b20udHJpZ2dlcigicG9rZSIpOwot
ICAgICAgICBgYGAKLQotICAgICAgICBAbWV0aG9kIG1peGluCi0gICAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBvYmplY3Qgb2JqZWN0IHRvIGV4dGVuZCB3aXRoIEV2ZW50VGFyZ2V0IG1ldGhvZHMKLSAg
ICAgICAgQHByaXZhdGUKLSAgICAgICovCi0gICAgICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0KSB7
Ci0gICAgICAgIG9iamVjdC5vbiA9IHRoaXMub247Ci0gICAgICAgIG9iamVjdC5vZmYgPSB0aGlz
Lm9mZjsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIgPSB0aGlzLnRyaWdnZXI7Ci0gICAgICAgIG9i
amVjdC5fcHJvbWlzZUNhbGxiYWNrcyA9IHVuZGVmaW5lZDsKLSAgICAgICAgcmV0dXJuIG9iamVj
dDsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBSZWdpc3RlcnMgYSBjYWxsYmFjayB0
byBiZSBleGVjdXRlZCB3aGVuIGBldmVudE5hbWVgIGlzIHRyaWdnZXJlZAotCi0gICAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9uKCdldmVudCcsIGZ1bmN0aW9uKGV2ZW50SW5m
byl7Ci0gICAgICAgICAgLy8gaGFuZGxlIHRoZSBldmVudAotICAgICAgICB9KTsKLQotICAgICAg
ICBvYmplY3QudHJpZ2dlcignZXZlbnQnKTsKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhv
ZCBvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIG5hbWUgb2YgdGhlIGV2ZW50
IHRvIGxpc3RlbiBmb3IKLSAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rp
b24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KLSAgICAgICAgQHBy
aXZhdGUKLSAgICAgICovCi0gICAgICBvbjogZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykg
ewotICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0gY2FsbGJhY2tzRm9yKHRoaXMpLCBjYWxsYmFj
a3M7Ci0KLSAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV07Ci0KLSAg
ICAgICAgaWYgKCFjYWxsYmFja3MpIHsKLSAgICAgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFj
a3NbZXZlbnROYW1lXSA9IFtdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4T2YoY2Fs
bGJhY2tzLCBjYWxsYmFjaykgPT09IC0xKSB7Ci0gICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2Fs
bGJhY2spOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgWW91IGNh
biB1c2UgYG9mZmAgdG8gc3RvcCBmaXJpbmcgYSBwYXJ0aWN1bGFyIGNhbGxiYWNrIGZvciBhbiBl
dmVudDoKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIGZ1bmN0aW9uIGRvU3R1ZmYo
KSB7IC8vIGRvIHN0dWZmISB9Ci0gICAgICAgIG9iamVjdC5vbignc3R1ZmYnLCBkb1N0dWZmKTsK
LQotICAgICAgICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIGJlIGNh
bGxlZAotCi0gICAgICAgIC8vIFVucmVnaXN0ZXIgT05MWSB0aGUgZG9TdHVmZiBjYWxsYmFjawot
ICAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicsIGRvU3R1ZmYpOwotICAgICAgICBvYmplY3QudHJp
Z2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIE5PVCBiZSBjYWxsZWQKLSAgICAgICAgYGBg
Ci0KLSAgICAgICAgSWYgeW91IGRvbid0IHBhc3MgYSBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGBv
ZmZgLCBBTEwgY2FsbGJhY2tzIGZvciB0aGUKLSAgICAgICAgZXZlbnQgd2lsbCBub3QgYmUgZXhl
Y3V0ZWQgd2hlbiB0aGUgZXZlbnQgZmlyZXMuIEZvciBleGFtcGxlOgotCi0gICAgICAgIGBgYGph
dmFzY3JpcHQKLSAgICAgICAgdmFyIGNhbGxiYWNrMSA9IGZ1bmN0aW9uKCl7fTsKLSAgICAgICAg
dmFyIGNhbGxiYWNrMiA9IGZ1bmN0aW9uKCl7fTsKLQotICAgICAgICBvYmplY3Qub24oJ3N0dWZm
JywgY2FsbGJhY2sxKTsKLSAgICAgICAgb2JqZWN0Lm9uKCdzdHVmZicsIGNhbGxiYWNrMik7Ci0K
LSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJh
Y2syIHdpbGwgYmUgZXhlY3V0ZWQuCi0KLSAgICAgICAgb2JqZWN0Lm9mZignc3R1ZmYnKTsKLSAg
ICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2sy
IHdpbGwgbm90IGJlIGV4ZWN1dGVkIQotICAgICAgICBgYGAKLQotICAgICAgICBAbWV0aG9kIG9m
ZgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIGV2ZW50IHRvIHN0b3AgbGlzdGVu
aW5nIHRvCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3Vt
ZW50LiBJZiBnaXZlbiwgb25seSB0aGUgZnVuY3Rpb24KLSAgICAgICAgZ2l2ZW4gd2lsbCBiZSBy
ZW1vdmVkIGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sgcXVldWUuIElmIG5vIGBjYWxsYmFja2AK
LSAgICAgICAgYXJndW1lbnQgaXMgZ2l2ZW4sIGFsbCBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVk
IGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sKLSAgICAgICAgcXVldWUuCi0gICAgICAgIEBwcml2
YXRlCi0KLSAgICAgICovCi0gICAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2sp
IHsKLSAgICAgICAgdmFyIGFsbENhbGxiYWNrcyA9IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJh
Y2tzLCBpbmRleDsKLQotICAgICAgICBpZiAoIWNhbGxiYWNrKSB7Ci0gICAgICAgICAgYWxsQ2Fs
bGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXTsKLQotICAgICAgICBp
bmRleCA9IGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgaWYgKGluZGV4
ICE9PSAtMSkgeyBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTsgfQotICAgICAgfSwKLQotICAg
ICAgLyoqCi0gICAgICAgIFVzZSBgdHJpZ2dlcmAgdG8gZmlyZSBjdXN0b20gZXZlbnRzLiBGb3Ig
ZXhhbXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIG9iamVjdC5vbignZm9v
JywgZnVuY3Rpb24oKXsKLSAgICAgICAgICBjb25zb2xlLmxvZygnZm9vIGV2ZW50IGhhcHBlbmVk
IScpOwotICAgICAgICB9KTsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ2ZvbycpOwotICAgICAg
ICAvLyAnZm9vIGV2ZW50IGhhcHBlbmVkIScgbG9nZ2VkIHRvIHRoZSBjb25zb2xlCi0gICAgICAg
IGBgYAotCi0gICAgICAgIFlvdSBjYW4gYWxzbyBwYXNzIGEgdmFsdWUgYXMgYSBzZWNvbmQgYXJn
dW1lbnQgdG8gYHRyaWdnZXJgIHRoYXQgd2lsbCBiZQotICAgICAgICBwYXNzZWQgYXMgYW4gYXJn
dW1lbnQgdG8gYWxsIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50OgotCi0gICAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9uKCdmb28nLCBmdW5jdGlvbih2YWx1ZSl7Ci0g
ICAgICAgICAgY29uc29sZS5sb2codmFsdWUubmFtZSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAg
IG9iamVjdC50cmlnZ2VyKCdmb28nLCB7IG5hbWU6ICdiYXInIH0pOwotICAgICAgICAvLyAnYmFy
JyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCB0
cmlnZ2VyCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgbmFtZSBvZiB0aGUgZXZl
bnQgdG8gYmUgdHJpZ2dlcmVkCi0gICAgICAgIEBwYXJhbSB7QW55fSBvcHRpb25zIG9wdGlvbmFs
IHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbnkgZXZlbnQgaGFuZGxlcnMgZm9yCi0gICAgICAgIHRo
ZSBnaXZlbiBgZXZlbnROYW1lYAotICAgICAgICBAcHJpdmF0ZQotICAgICAgKi8KLSAgICAgIHRy
aWdnZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgb3B0aW9ucykgewotICAgICAgICB2YXIgYWxsQ2Fs
bGJhY2tzID0gY2FsbGJhY2tzRm9yKHRoaXMpLAotICAgICAgICAgICAgY2FsbGJhY2tzLCBjYWxs
YmFja1R1cGxlLCBjYWxsYmFjaywgYmluZGluZzsKLQotICAgICAgICBpZiAoY2FsbGJhY2tzID0g
YWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0pIHsKLSAgICAgICAgICAvLyBEb24ndCBjYWNoZSB0aGUg
Y2FsbGJhY2tzLmxlbmd0aCBzaW5jZSBpdCBtYXkgZ3JvdwotICAgICAgICAgIGZvciAodmFyIGk9
MDsgaTxjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNhbGxiYWNrID0gY2Fs
bGJhY2tzW2ldOwotCi0gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTsKLSAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9maWx0ZXIi
LCAKLSAgWyIuL2FsbCIsIi4vbWFwIiwiLi91dGlscyIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24o
X19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19leHBv
cnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTFf
X1siZGVmYXVsdCJdOwotICAgIHZhciBtYXAgPSBfX2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsK
LSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5kZW5jeTNfXy5pc0Z1bmN0aW9uOwotICAgIHZh
ciBpc0FycmF5ID0gX19kZXBlbmRlbmN5M19fLmlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgYFJT
VlAuZmlsdGVyYCBpcyBzaW1pbGFyIHRvIEphdmFTY3JpcHQncyBuYXRpdmUgYGZpbHRlcmAgbWV0
aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAgd2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBiZWNv
bWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRoZSBgZmlsdGVyRm5gIG9uCi0gICAgICBlYWNo
IGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAuZmlsdGVyYCByZXR1cm5zIGEgcHJv
bWlzZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9m
IHJ1bm5pbmcgYGZpbHRlckZuYCBvbiB0aGUgdmFsdWVzIHRoZQotICAgICAgcHJvbWlzZXMgYmVj
b21lIGZ1bGZpbGxlZCB3aXRoLgotCi0gICAgICBGb3IgZXhhbXBsZToKLQotICAgICAgYGBgamF2
YXNjcmlwdAotCi0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2
YXIgcHJvbWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQ
LnJlc29sdmUoMyk7Ci0KLSAgICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0pewotICAg
ICAgICByZXR1cm4gaXRlbSA+IDE7Ci0gICAgICB9OwotCi0gICAgICBSU1ZQLmZpbHRlcihwcm9t
aXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICAgLy8gcmVzdWx0
IGlzIFsgMiwgMyBdCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhl
IGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuZmlsdGVyYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJz
dCBwcm9taXNlCi0gICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJn
dW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2UncwotICAgICAgcmVqZWN0aW9uIGhhbmRsZXIu
IEZvciBleGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZTEg
PSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcg
RXJyb3IoIjIiKSk7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3Io
IjMiKSk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlz
ZTMgXTsKLQotICAgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24oaXRlbSl7Ci0gICAgICAgIHJl
dHVybiBpdGVtID4gMTsKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBm
aWx0ZXJGbikudGhlbihmdW5jdGlvbihhcnJheSl7Ci0gICAgICAgIC8vIENvZGUgaGVyZSBuZXZl
ciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQotICAgICAgfSwgZnVu
Y3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAiMiIKLSAgICAg
IH0pOwotICAgICAgYGBgCi0KLSAgICAgIGBSU1ZQLmZpbHRlcmAgd2lsbCBhbHNvIHdhaXQgZm9y
IGFueSBwcm9taXNlcyByZXR1cm5lZCBmcm9tIGBmaWx0ZXJGbmAuCi0gICAgICBGb3IgaW5zdGFu
Y2UsIHlvdSBtYXkgd2FudCB0byBmZXRjaCBhIGxpc3Qgb2YgdXNlcnMgdGhlbiByZXR1cm4gYSBz
dWJzZXQKLSAgICAgIG9mIHRob3NlIHVzZXJzIGJhc2VkIG9uIHNvbWUgYXN5bmNocm9ub3VzIG9w
ZXJhdGlvbjoKLQotICAgICAgYGBgamF2YXNjcmlwdAotCi0gICAgICB2YXIgYWxpY2UgPSB7IG5h
bWU6ICdhbGljZScgfTsKLSAgICAgIHZhciBib2IgICA9IHsgbmFtZTogJ2JvYicgfTsKLSAgICAg
IHZhciB1c2VycyA9IFsgYWxpY2UsIGJvYiBdOwotCi0gICAgICB2YXIgcHJvbWlzZXMgPSB1c2Vy
cy5tYXAoZnVuY3Rpb24odXNlcil7Ci0gICAgICAgIHJldHVybiBSU1ZQLnJlc29sdmUodXNlcik7
Ci0gICAgICB9KTsKLQotICAgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24odXNlcil7Ci0gICAg
ICAgIC8vIEhlcmUsIEFsaWNlIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYSBibG9nIHBvc3Qs
IGJ1dCBCb2IgZG9lcyBub3QuCi0gICAgICAgIHJldHVybiBnZXRQcml2aWxlZ2VzRm9yVXNlcih1
c2VyKS50aGVuKGZ1bmN0aW9uKHByaXZzKXsKLSAgICAgICAgICByZXR1cm4gcHJpdnMuY2FuX2Ny
ZWF0ZV9ibG9nX3Bvc3QgPT09IHRydWU7Ci0gICAgICAgIH0pOwotICAgICAgfTsKLSAgICAgIFJT
VlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbikudGhlbihmdW5jdGlvbih1c2Vycyl7Ci0gICAg
ICAgIC8vIHRydWUsIGJlY2F1c2UgdGhlIHNlcnZlciB0b2xkIHVzIG9ubHkgQWxpY2UgY2FuIGNy
ZWF0ZSBhIGJsb2cgcG9zdC4KLSAgICAgICAgdXNlcnMubGVuZ3RoID09PSAxOwotICAgICAgICAv
LyBmYWxzZSwgYmVjYXVzZSBBbGljZSBpcyB0aGUgb25seSB1c2VyIHByZXNlbnQgaW4gYHVzZXJz
YAotICAgICAgICB1c2Vyc1swXSA9PT0gYm9iOwotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAg
ICAgQG1ldGhvZCBmaWx0ZXIKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJheX0g
cHJvbWlzZXMKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlckZuIC0gZnVuY3Rpb24gdG8g
YmUgY2FsbGVkIG9uIGVhY2ggcmVzb2x2ZWQgdmFsdWUgdG8KLSAgICAgIGZpbHRlciB0aGUgZmlu
YWwgcmVzdWx0cy4KLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
ZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4gVXNlZnVsIGZvcgotICAgICAgdG9vbGluZy4KLSAgICAg
IEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICBmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMs
IGZpbHRlckZuLCBsYWJlbCkgewotICAgICAgcmV0dXJuIGFsbChwcm9taXNlcywgbGFiZWwpLnRo
ZW4oZnVuY3Rpb24odmFsdWVzKXsKLSAgICAgICAgaWYgKCFpc0FycmF5KHByb21pc2VzKSkgewot
ICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8g
ZmlsdGVyLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZpbHRlckZu
KSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1bmN0
aW9uIHRvIGZpbHRlcidzIHNlY29uZCBhcmd1bWVudC4iKTsKLSAgICAgICAgfQotCi0gICAgICAg
IHJldHVybiBtYXAocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkudGhlbihmdW5jdGlvbihmaWx0
ZXJSZXN1bHRzKXsKLSAgICAgICAgICAgdmFyIGksCi0gICAgICAgICAgICAgICB2YWx1ZXNMZW4g
PSB2YWx1ZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBbXTsKLQotICAgICAg
ICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzTGVuOyBpKyspewotICAgICAgICAgICAgIGlmKGZp
bHRlclJlc3VsdHNbaV0pIGZpbHRlcmVkLnB1c2godmFsdWVzW2ldKTsKLSAgICAgICAgICAgfQot
ICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7Ci0gICAgICAgIH0pOwotICAgICAgfSk7Ci0gICAg
fQotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZpbHRlcjsKLSAgfSk7Ci1kZWZpbmUo
InJzdnAvaGFzaCIsIAotICBbIi4vcHJvbWlzZSIsIi4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVm
YXVsdCJdOwotICAgIHZhciBpc05vblRoZW5hYmxlID0gX19kZXBlbmRlbmN5Ml9fLmlzTm9uVGhl
bmFibGU7Ci0gICAgdmFyIGtleXNPZiA9IF9fZGVwZW5kZW5jeTJfXy5rZXlzT2Y7Ci0KLSAgICAv
KioKLSAgICAgIGBSU1ZQLmhhc2hgIGlzIHNpbWlsYXIgdG8gYFJTVlAuYWxsYCwgYnV0IHRha2Vz
IGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5Ci0gICAgICBmb3IgaXRzIGBwcm9taXNlc2Ag
YXJndW1lbnQuCi0KLSAgICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdo
ZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KLSAgICAgIGZ1bGZpbGxlZCwgb3Ig
cmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLiBUaGUgcmV0dXJuZWQgcHJv
bWlzZQotICAgICAgaXMgZnVsZmlsbGVkIHdpdGggYSBoYXNoIHRoYXQgaGFzIHRoZSBzYW1lIGtl
eSBuYW1lcyBhcyB0aGUgYHByb21pc2VzYCBvYmplY3QKLSAgICAgIGFyZ3VtZW50LiBJZiBhbnkg
b2YgdGhlIHZhbHVlcyBpbiB0aGUgb2JqZWN0IGFyZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAot
ICAgICAgc2ltcGx5IGJlIGNvcGllZCBvdmVyIHRvIHRoZSBmdWxmaWxsZWQgb2JqZWN0LgotCi0g
ICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZXMg
PSB7Ci0gICAgICAgIG15UHJvbWlzZTogUlNWUC5yZXNvbHZlKDEpLAotICAgICAgICB5b3VyUHJv
bWlzZTogUlNWUC5yZXNvbHZlKDIpLAotICAgICAgICB0aGVpclByb21pc2U6IFJTVlAucmVzb2x2
ZSgzKSwKLSAgICAgICAgbm90QVByb21pc2U6IDQKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAuaGFz
aChwcm9taXNlcykudGhlbihmdW5jdGlvbihoYXNoKXsKLSAgICAgICAgLy8gaGFzaCBoZXJlIGlz
IGFuIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6Ci0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gICBt
eVByb21pc2U6IDEsCi0gICAgICAgIC8vICAgeW91clByb21pc2U6IDIsCi0gICAgICAgIC8vICAg
dGhlaXJQcm9taXNlOiAzLAotICAgICAgICAvLyAgIG5vdEFQcm9taXNlOiA0Ci0gICAgICAgIC8v
IH0KLSAgICAgIH0pOwotICAgICAgYGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNl
c2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQot
ICAgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJlIGdpdmVuIGFzIHRoZSByZWFzb24gdG8gdGhl
IHJlamVjdGlvbiBoYW5kbGVyLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICB2YXIgcHJvbWlzZXMgPSB7Ci0gICAgICAgIG15UHJvbWlzZTogUlNWUC5yZXNv
bHZlKDEpLAotICAgICAgICByZWplY3RlZFByb21pc2U6IFJTVlAucmVqZWN0KG5ldyBFcnJvcigi
cmVqZWN0ZWRQcm9taXNlIikpLAotICAgICAgICBhbm90aGVyUmVqZWN0ZWRQcm9taXNlOiBSU1ZQ
LnJlamVjdChuZXcgRXJyb3IoImFub3RoZXJSZWplY3RlZFByb21pc2UiKSksCi0gICAgICB9Owot
Ci0gICAgICBSU1ZQLmhhc2gocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oaGFzaCl7Ci0gICAgICAg
IC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21p
c2VzIQotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNz
YWdlID09PSAicmVqZWN0ZWRQcm9taXNlIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
QW4gaW1wb3J0YW50IG5vdGU6IGBSU1ZQLmhhc2hgIGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZh
U2NyaXB0IG9iamVjdHMgdGhhdAotICAgICAgYXJlIGp1c3QgYSBzZXQgb2Yga2V5cyBhbmQgdmFs
dWVzLiBgUlNWUC5oYXNoYCB3aWxsIE5PVCBwcmVzZXJ2ZSBwcm90b3R5cGUKLSAgICAgIGNoYWlu
cy4KLQotICAgICAgRXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgZnVuY3Rp
b24gTXlDb25zdHJ1Y3RvcigpewotICAgICAgICB0aGlzLmV4YW1wbGUgPSBSU1ZQLnJlc29sdmUo
IkV4YW1wbGUiKTsKLSAgICAgIH0KLQotICAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSB7
Ci0gICAgICAgIHByb3RvUHJvcGVydHk6IFJTVlAucmVzb2x2ZSgiUHJvdG8gUHJvcGVydHkiKQot
ICAgICAgfTsKLQotICAgICAgdmFyIG15T2JqZWN0ID0gbmV3IE15Q29uc3RydWN0b3IoKTsKLQot
ICAgICAgUlNWUC5oYXNoKG15T2JqZWN0KS50aGVuKGZ1bmN0aW9uKGhhc2gpewotICAgICAgICAv
LyBwcm90b1Byb3BlcnR5IHdpbGwgbm90IGJlIHByZXNlbnQsIGluc3RlYWQgeW91IHdpbGwganVz
dCBoYXZlIGFuCi0gICAgICAgIC8vIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6Ci0gICAgICAgIC8v
IHsKLSAgICAgICAgLy8gICBleGFtcGxlOiAiRXhhbXBsZSIKLSAgICAgICAgLy8gfQotICAgICAg
ICAvLwotICAgICAgICAvLyBoYXNoLmhhc093blByb3BlcnR5KCdwcm90b1Byb3BlcnR5Jyk7IC8v
IGZhbHNlCi0gICAgICAgIC8vICd1bmRlZmluZWQnID09PSB0eXBlb2YgaGFzaC5wcm90b1Byb3Bl
cnR5Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBAbWV0aG9kIGhhc2gKLSAgICAgIEBm
b3IgUlNWUAotICAgICAgQHBhcmFtIHtPYmplY3R9IHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0
cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9taXNlLgot
ICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlz
ZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKLSAg
ICAgIGhhdmUgYmVlbiBmdWxmaWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29t
ZSByZWplY3RlZC4KLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZh
dWx0Il0gPSBmdW5jdGlvbiBoYXNoKG9iamVjdCwgbGFiZWwpIHsKLSAgICAgIHJldHVybiBuZXcg
UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICB2YXIgcmVzdWx0cyA9
IHt9OwotICAgICAgICB2YXIga2V5cyA9IGtleXNPZihvYmplY3QpOwotICAgICAgICB2YXIgcmVt
YWluaW5nID0ga2V5cy5sZW5ndGg7Ci0gICAgICAgIHZhciBlbnRyeSwgcHJvcGVydHk7Ci0KLSAg
ICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7
Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICBmdW5jdGlvbiBmdWxmaWxs
ZWRUbyhwcm9wZXJ0eSkgewotICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewotICAg
ICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIGlmICgtLXJl
bWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBvblJl
amVjdGlvbihyZWFzb24pIHsKLSAgICAgICAgICByZW1haW5pbmcgPSAwOwotICAgICAgICAgIHJl
amVjdChyZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBr
ZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgcHJvcGVydHkgPSBrZXlzW2ldOwotICAgICAg
ICAgIGVudHJ5ID0gb2JqZWN0W3Byb3BlcnR5XTsKLQotICAgICAgICAgIGlmIChpc05vblRoZW5h
YmxlKGVudHJ5KSkgewotICAgICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSBlbnRyeTsKLSAg
ICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZl
KHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkVG8ocHJvcGVydHkpLCBvblJlamVj
dGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9OwotICB9KTsK
LWRlZmluZSgicnN2cC9pbnN0cnVtZW50IiwgCi0gIFsiLi9jb25maWciLCIuL3V0aWxzIiwiZXhw
b3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19l
eHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGNvbmZpZyA9IF9fZGVwZW5k
ZW5jeTFfXy5jb25maWc7Ci0gICAgdmFyIG5vdyA9IF9fZGVwZW5kZW5jeTJfXy5ub3c7Ci0KLSAg
ICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gaW5zdHJ1bWVudChldmVudE5hbWUs
IHByb21pc2UsIGNoaWxkKSB7Ci0gICAgICAvLyBpbnN0cnVtZW50YXRpb24gc2hvdWxkIG5vdCBk
aXNydXB0IG5vcm1hbCB1c2FnZS4KLSAgICAgIHRyeSB7Ci0gICAgICAgIGNvbmZpZy50cmlnZ2Vy
KGV2ZW50TmFtZSwgewotICAgICAgICAgIGd1aWQ6IHByb21pc2UuX2d1aWRLZXkgKyBwcm9taXNl
Ll9pZCwKLSAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKLSAgICAgICAgICBkZXRhaWw6
IHByb21pc2UuX2RldGFpbCwKLSAgICAgICAgICBjaGlsZEd1aWQ6IGNoaWxkICYmIHByb21pc2Uu
X2d1aWRLZXkgKyBjaGlsZC5faWQsCi0gICAgICAgICAgbGFiZWw6IHByb21pc2UuX2xhYmVsLAot
ICAgICAgICAgIHRpbWVTdGFtcDogbm93KCksCi0gICAgICAgICAgc3RhY2s6IG5ldyBFcnJvcihw
cm9taXNlLl9sYWJlbCkuc3RhY2sKLSAgICAgICAgfSk7Ci0gICAgICB9IGNhdGNoKGVycm9yKSB7
Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICB0aHJvdyBlcnJvcjsK
LSAgICAgICAgfSwgMCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvbWFw
IiwgCi0gIFsiLi9wcm9taXNlIiwiLi9hbGwiLCIuL3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5j
dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBf
X2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVw
ZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3kyX19bImRl
ZmF1bHQiXTsKLSAgICB2YXIgaXNBcnJheSA9IF9fZGVwZW5kZW5jeTNfXy5pc0FycmF5OwotICAg
IHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5M19fLmlzRnVuY3Rpb247Ci0KLSAgICAvKioK
LSAgICAgYFJTVlAubWFwYCBpcyBzaW1pbGFyIHRvIEphdmFTY3JpcHQncyBuYXRpdmUgYG1hcGAg
bWV0aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAgd2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBi
ZWNvbWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRoZSBgbWFwRm5gIG9uCi0gICAgICBlYWNo
IGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAubWFwYCByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1
bm5pbmcgYG1hcEZuYCBvbiB0aGUgdmFsdWVzIHRoZSBwcm9taXNlcwotICAgICAgYmVjb21lIGZ1
bGZpbGxlZCB3aXRoLgotCi0gICAgICBGb3IgZXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlw
dAotCi0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJv
bWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlc29s
dmUoMyk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlz
ZTMgXTsKLQotICAgICAgdmFyIG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7Ci0gICAgICAgIHJldHVy
biBpdGVtICsgMTsKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAubWFwKHByb21pc2VzLCBtYXBGbiku
dGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyByZXN1bHQgaXMgWyAyLCAzLCA0IF0K
LSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBn
aXZlbiB0byBgUlNWUC5tYXBgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0IHByb21pc2UKLSAgICAg
IHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0
dXJuZWQgcHJvbWlzZSdzCi0gICAgICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgx
KTsKLSAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigiMiIpKTsKLSAg
ICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigiMyIpKTsKLSAgICAgIHZh
ciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0gICAgICB2
YXIgbWFwRm4gPSBmdW5jdGlvbihpdGVtKXsKLSAgICAgICAgcmV0dXJuIGl0ZW0gKyAxOwotICAg
ICAgfTsKLQotICAgICAgUlNWUC5tYXAocHJvbWlzZXMsIG1hcEZuKS50aGVuKGZ1bmN0aW9uKGFy
cmF5KXsKLSAgICAgICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUg
cmVqZWN0ZWQgcHJvbWlzZXMhCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAg
Ly8gcmVhc29uLm1lc3NhZ2UgPT09ICIyIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
YFJTVlAubWFwYCB3aWxsIGFsc28gd2FpdCBpZiBhIHByb21pc2UgaXMgcmV0dXJuZWQgZnJvbSBg
bWFwRm5gLiBGb3IgZXhhbXBsZSwKLSAgICAgIHNheSB5b3Ugd2FudCB0byBnZXQgYWxsIGNvbW1l
bnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywgYnV0IHlvdSBuZWVkCi0gICAgICB0aGUgYmxv
ZyBwb3N0cyBmaXJzdCBiZWN1YXNlIHRoZXkgY29udGFpbiBhIHVybCB0byB0aG9zZSBjb21tZW50
cy4KLQotICAgICAgYGBgamF2c2NyaXB0Ci0KLSAgICAgIHZhciBtYXBGbiA9IGZ1bmN0aW9uKGJs
b2dQb3N0KXsKLSAgICAgICAgLy8gZ2V0Q29tbWVudHMgZG9lcyBzb21lIGFqYXggYW5kIHJldHVy
bnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkCi0gICAgICAgIC8vIHdpdGggc29t
ZSBjb21tZW50cyBkYXRhCi0gICAgICAgIHJldHVybiBnZXRDb21tZW50cyhibG9nUG9zdC5jb21t
ZW50c191cmwpOwotICAgICAgfTsKLQotICAgICAgLy8gZ2V0QmxvZ1Bvc3RzIGRvZXMgc29tZSBh
amF4IGFuZCByZXR1cm5zIGFuIFJTVlAuUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZAotICAgICAg
Ly8gd2l0aCBzb21lIGJsb2cgcG9zdCBkYXRhCi0gICAgICBSU1ZQLm1hcChnZXRCbG9nUG9zdHMo
KSwgbWFwRm4pLnRoZW4oZnVuY3Rpb24oY29tbWVudHMpewotICAgICAgICAvLyBjb21tZW50cyBp
cyB0aGUgcmVzdWx0IG9mIGFza2luZyB0aGUgc2VydmVyIGZvciB0aGUgY29tbWVudHMKLSAgICAg
ICAgLy8gb2YgYWxsIGJsb2cgcG9zdHMgcmV0dXJuZWQgZnJvbSBnZXRCbG9nUG9zdHMoKQotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBtYXAKLSAgICAgIEBmb3IgUlNWUAot
ICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG1h
cEZuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIGZ1bGZpbGxlZCBwcm9taXNlLgotICAg
ICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhl
IHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9t
aXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBjYWxsaW5n
Ci0gICAgICBgbWFwRm5gIG9uIGVhY2ggZnVsZmlsbGVkIHByb21pc2Ugb3IgdmFsdWUgd2hlbiB0
aGV5IGJlY29tZSBmdWxmaWxsZWQuCi0gICAgICAgVGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3Rl
ZCBpZiBhbnkgb2YgdGhlIGdpdmVuIGBwcm9taXNlc2AgYmVjb21lIHJlamVjdGVkLgotICAgICAg
QHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIG1h
cChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gYWxsKHByb21pc2VzLCBs
YWJlbCkudGhlbihmdW5jdGlvbihyZXN1bHRzKXsKLSAgICAgICAgaWYgKCFpc0FycmF5KHByb21p
c2VzKSkgewotICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4g
YXJyYXkgdG8gbWFwLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKG1h
cEZuKSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1
bmN0aW9uIHRvIG1hcCdzIHNlY29uZCBhcmd1bWVudC4iKTsKLSAgICAgICAgfQotCi0KLSAgICAg
ICAgdmFyIHJlc3VsdExlbiA9IHJlc3VsdHMubGVuZ3RoLAotICAgICAgICAgICAgbWFwcGVkUmVz
dWx0cyA9IFtdLAotICAgICAgICAgICAgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVz
dWx0TGVuOyBpKyspewotICAgICAgICAgIG1hcHBlZFJlc3VsdHMucHVzaChtYXBGbihyZXN1bHRz
W2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWxsKG1hcHBlZFJlc3VsdHMsIGxh
YmVsKTsKLSAgICAgIH0pOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL25vZGUiLCAKLSAg
WyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19l
eHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVu
ZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5z
bGljZTsKLQotICAgIGZ1bmN0aW9uIG1ha2VOb2RlQ2FsbGJhY2tGb3IocmVzb2x2ZSwgcmVqZWN0
KSB7Ci0gICAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCB2YWx1ZSkgewotICAgICAgICBpZiAo
ZXJyb3IpIHsKLSAgICAgICAgICByZWplY3QoZXJyb3IpOwotICAgICAgICB9IGVsc2UgaWYgKGFy
Z3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgcmVzb2x2ZShzbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc29sdmUodmFsdWUpOwot
ICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAgYFJTVlAuZGVub2Rl
aWZ5YCB0YWtlcyBhICJub2RlLXN0eWxlIiBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIGZ1bmN0aW9u
IHRoYXQKLSAgICAgIHdpbGwgcmV0dXJuIGFuIGBSU1ZQLlByb21pc2VgLiBZb3UgY2FuIHVzZSBg
ZGVub2RlaWZ5YCBpbiBOb2RlLmpzIG9yIHRoZQotICAgICAgYnJvd3NlciB3aGVuIHlvdSdkIHBy
ZWZlciB0byB1c2UgcHJvbWlzZXMgb3ZlciB1c2luZyBjYWxsYmFja3MuIEZvciBleGFtcGxlLAot
ICAgICAgYGRlbm9kZWlmeWAgdHJhbnNmb3JtcyB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpOwotCi0gICAgICBmcy5yZWFk
RmlsZSgnbXlmaWxlLnR4dCcsIGZ1bmN0aW9uKGVyciwgZGF0YSl7Ci0gICAgICAgIGlmIChlcnIp
IHJldHVybiBoYW5kbGVFcnJvcihlcnIpOwotICAgICAgICBoYW5kbGVEYXRhKGRhdGEpOwotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgaW50bzoKLQotICAgICAgYGBgamF2YXNjcmlwdAot
ICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKLQotICAgICAgdmFyIHJlYWRGaWxlID0gUlNW
UC5kZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotCi0gICAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcp
LnRoZW4oaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IpOwotICAgICAgYGBgCi0KLSAgICAgIFVzaW5n
IGBkZW5vZGVpZnlgIG1ha2VzIGl0IGVhc2llciB0byBjb21wb3NlIGFzeW5jaHJvbm91cyBvcGVy
YXRpb25zIGluc3RlYWQKLSAgICAgIG9mIHVzaW5nIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIGlu
c3RlYWQgb2Y6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBmcyA9IHJlcXVpcmUo
J2ZzJyk7Ci0gICAgICB2YXIgbG9nID0gcmVxdWlyZSgnc29tZS1hc3luYy1sb2dnZXInKTsKLQot
ICAgICAgZnMucmVhZEZpbGUoJ215ZmlsZS50eHQnLCBmdW5jdGlvbihlcnIsIGRhdGEpewotICAg
ICAgICBpZiAoZXJyKSByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgICAgZnMud3JpdGVG
aWxlKCdteWZpbGUyLnR4dCcsIGRhdGEsIGZ1bmN0aW9uKGVycil7Ci0gICAgICAgICAgaWYgKGVy
cikgdGhyb3cgZXJyOwotICAgICAgICAgIGxvZygnc3VjY2VzcycsIGZ1bmN0aW9uKGVycikgewot
ICAgICAgICAgICAgaWYgKGVycikgdGhyb3cgZXJyOwotICAgICAgICAgIH0pOwotICAgICAgICB9
KTsKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIFlvdSBjYW4gY2hhaW4gdGhlIG9wZXJh
dGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20gdGhlIHJldHVybmVkIHByb21pc2U6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci0gICAg
ICB2YXIgZGVub2RlaWZ5ID0gUlNWUC5kZW5vZGVpZnk7Ci0gICAgICB2YXIgcmVhZEZpbGUgPSBk
ZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotICAgICAgdmFyIHdyaXRlRmlsZSA9IGRlbm9kZWlmeShm
cy53cml0ZUZpbGUpOwotICAgICAgdmFyIGxvZyA9IGRlbm9kZWlmeShyZXF1aXJlKCdzb21lLWFz
eW5jLWxvZ2dlcicpKTsKLQotICAgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0
aW9uKGRhdGEpewotICAgICAgICByZXR1cm4gd3JpdGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEp
OwotICAgICAgfSkudGhlbihmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gbG9nKCdTVUNDRVNT
Jyk7Ci0gICAgICB9KS50aGVuKGZ1bmN0aW9uKCl7Ci0gICAgICAgIC8vIHN1Y2Nlc3MgaGFuZGxl
cgotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gcmVqZWN0aW9uIGhhbmRs
ZXIKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgZGVub2RlaWZ5Ci0gICAg
ICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG5vZGVGdW5jIGEgIm5vZGUtc3R5
bGUiIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjYWxsYmFjayBhcwotICAgICAgaXRzIGxhc3QgYXJn
dW1lbnQuIFRoZSBjYWxsYmFjayBleHBlY3RzIGFuIGVycm9yIHRvIGJlIHBhc3NlZCBhcyBpdHMg
Zmlyc3QKLSAgICAgIGFyZ3VtZW50IChpZiBhbiBlcnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIG51
bGwpLCBhbmQgdGhlIHZhbHVlIGZyb20gdGhlCi0gICAgICBvcGVyYXRpb24gYXMgaXRzIHNlY29u
ZCBhcmd1bWVudCAoImZ1bmN0aW9uKGVyciwgdmFsdWUpeyB9IikuCi0gICAgICBAcGFyYW0ge0Fu
eX0gYmluZGluZyBvcHRpb25hbCBhcmd1bWVudCBmb3IgYmluZGluZyB0aGUgInRoaXMiIHZhbHVl
IHdoZW4KLSAgICAgIGNhbGxpbmcgdGhlIGBub2RlRnVuY2AgZnVuY3Rpb24uCi0gICAgICBAcmV0
dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBub2RlRnVuY2AgdG8gcmV0dXJu
IGFuCi0gICAgICBgUlNWUC5Qcm9taXNlYAotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19l
eHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGRlbm9kZWlmeShub2RlRnVuYywgYmluZGlu
ZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgIHsKLSAgICAgICAgdmFyIG5vZGVBcmdzID0g
c2xpY2UuY2FsbChhcmd1bWVudHMpLCByZXNvbHZlLCByZWplY3Q7Ci0gICAgICAgIHZhciB0aGlz
QXJnID0gdGhpcyB8fCBiaW5kaW5nOwotCi0gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5j
dGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBQcm9taXNlLmFsbChub2RlQXJncyku
dGhlbihmdW5jdGlvbihub2RlQXJncykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAg
ICAgbm9kZUFyZ3MucHVzaChtYWtlTm9kZUNhbGxiYWNrRm9yKHJlc29sdmUsIHJlamVjdCkpOwot
ICAgICAgICAgICAgICBub2RlRnVuYy5hcHBseSh0aGlzQXJnLCBub2RlQXJncyk7Ci0gICAgICAg
ICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICAgICAgcmVqZWN0KGUpOwotICAgICAgICAgICAg
fQotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH07Ci0gICAgfTsKLSAgfSk7Ci1k
ZWZpbmUoInJzdnAvcHJvbWlzZSIsIAotICBbIi4vY29uZmlnIiwiLi9ldmVudHMiLCIuL2luc3Ry
dW1lbnQiLCIuL3V0aWxzIiwiLi9wcm9taXNlL2Nhc3QiLCIuL3Byb21pc2UvYWxsIiwiLi9wcm9t
aXNlL3JhY2UiLCIuL3Byb21pc2UvcmVzb2x2ZSIsIi4vcHJvbWlzZS9yZWplY3QiLCJleHBvcnRz
Il0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVu
ZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2
X18sIF9fZGVwZW5kZW5jeTdfXywgX19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9f
ZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBjb25maWcgPSBfX2RlcGVu
ZGVuY3kxX18uY29uZmlnOwotICAgIHZhciBFdmVudFRhcmdldCA9IF9fZGVwZW5kZW5jeTJfX1si
ZGVmYXVsdCJdOwotICAgIHZhciBpbnN0cnVtZW50ID0gX19kZXBlbmRlbmN5M19fWyJkZWZhdWx0
Il07Ci0gICAgdmFyIG9iamVjdE9yRnVuY3Rpb24gPSBfX2RlcGVuZGVuY3k0X18ub2JqZWN0T3JG
dW5jdGlvbjsKLSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5kZW5jeTRfXy5pc0Z1bmN0aW9u
OwotICAgIHZhciBub3cgPSBfX2RlcGVuZGVuY3k0X18ubm93OwotICAgIHZhciBjYXN0ID0gX19k
ZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTZfX1si
ZGVmYXVsdCJdOwotICAgIHZhciByYWNlID0gX19kZXBlbmRlbmN5N19fWyJkZWZhdWx0Il07Ci0g
ICAgdmFyIFJlc29sdmUgPSBfX2RlcGVuZGVuY3k4X19bImRlZmF1bHQiXTsKLSAgICB2YXIgUmVq
ZWN0ID0gX19kZXBlbmRlbmN5OV9fWyJkZWZhdWx0Il07Ci0KLSAgICB2YXIgZ3VpZEtleSA9ICdy
c3ZwXycgKyBub3coKSArICctJzsKLSAgICB2YXIgY291bnRlciA9IDA7Ci0KLSAgICBmdW5jdGlv
biBub29wKCkge30KLQotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBQcm9taXNlOwotCi0K
LSAgICAvKioKLSAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJl
c3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGUKLSAgICAgIHByaW1hcnkgd2F5
IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRo
b2QsIHdoaWNoCi0gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEg
cHJvbWlzZeKAmXMgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvbgotICAgICAgd2h5IHRoZSBw
cm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuCi0KLSAgICAgIFRlcm1pbm9sb2d5Ci0gICAgICAt
LS0tLS0tLS0tLQotCi0gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24g
d2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVj
aWZpY2F0aW9uLgotICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0
aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLgotICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdh
bCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBh
IHByb21pc2UpLgotICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3du
IHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCi0gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUg
dGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuCi0gICAgICAtIGBzZXR0
bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciBy
ZWplY3RlZC4KLQotICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVz
OiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLgotCi0gICAgICBQcm9taXNlcyB0aGF0
IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1
bGZpbGxlZAotICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEg
cmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZQotICAgICAgcmVqZWN0ZWQgc3RhdGUuICBB
IGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuICBTaW1pbGFybHksIGEKLSAg
ICAgIHJlamVjdGlvbiByZWFzb24gaXMgbmV2ZXIgYSB0aGVuYWJsZS4KLQotICAgICAgUHJvbWlz
ZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUg
aXMgYWxzbyBhCi0gICAgICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0
dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzCi0gICAgICBzZXR0bGVkIHN0YXRlLiAg
U28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGwK
LSAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJv
bWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGwKLSAgICAgIGl0c2VsZiBmdWxmaWxsLgotCi0KLSAgICAg
IEJhc2ljIFVzYWdlOgotICAgICAgLS0tLS0tLS0tLS0tCi0KLSAgICAgIGBgYGpzCi0gICAgICB2
YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewotICAg
ICAgICAvLyBvbiBzdWNjZXNzCi0gICAgICAgIHJlc29sdmUodmFsdWUpOwotCi0gICAgICAgIC8v
IG9uIGZhaWx1cmUKLSAgICAgICAgcmVqZWN0KHJlYXNvbik7Ci0gICAgICB9KTsKLQotICAgICAg
cHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50
Ci0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAgLy8gb24gcmVqZWN0aW9uCi0g
ICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBBZHZhbmNlZCBVc2FnZToKLSAgICAgIC0tLS0t
LS0tLS0tLS0tLQotCi0gICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkg
YXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzCi0gICAgICBgWE1MSHR0cFJlcXVlc3Rg
cy4KLQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7Ci0gICAgICAg
IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICAg
IHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLQotICAgICAgICAgIHhoci5vcGVuKCdH
RVQnLCB1cmwpOwotICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyOwot
ICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7Ci0gICAgICAgICAgeGhyLnNldFJl
cXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7Ci0gICAgICAgICAgeGhy
LnNlbmQoKTsKLQotICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBp
ZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHsKLSAgICAgICAgICAgICAgaWYgKHRo
aXMuc3RhdHVzID09PSAyMDApIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9u
c2UpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlamVjdChuZXcg
RXJyb3IoImdldEpTT046IGAiICsgdXJsICsgImAgZmFpbGVkIHdpdGggc3RhdHVzOiBbIiArIHRo
aXMuc3RhdHVzICsgIl0iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgIH07Ci0gICAgICAgIH0pOwotICAgICAgfQotCi0gICAgICBnZXRKU09OKCcvcG9zdHMuanNv
bicpLnRoZW4oZnVuY3Rpb24oanNvbikgewotICAgICAgICAvLyBvbiBmdWxmaWxsbWVudAotICAg
ICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIG9uIHJlamVjdGlvbgotICAgICAg
fSk7Ci0gICAgICBgYGAKLQotICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdy
ZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy4KLQotICAgICAgYGBganMKLSAgICAgIFByb21pc2Uu
YWxsKFsKLSAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksCi0gICAgICAgIGdldEpTT04oJy9jb21t
ZW50cycpCi0gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7Ci0gICAgICAgIHZhbHVlc1sw
XSAvLyA9PiBwb3N0c0pTT04KLSAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTgot
Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBA
Y2xhc3MgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFyYW0ge2Z1bmN0aW9ufQotICAgICAgQHBhcmFt
IHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2Uu
Ci0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAY29uc3RydWN0b3IKLSAgICAqLwot
ICAgIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIsIGxhYmVsKSB7Ci0gICAgICBpZiAoIWlzRnVu
Y3Rpb24ocmVzb2x2ZXIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0
IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHBy
b21pc2UgY29uc3RydWN0b3InKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCEodGhpcyBpbnN0YW5j
ZW9mIFByb21pc2UpKSB7Ci0gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBj
b25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBv
YmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLiIpOwotICAg
ICAgfQotCi0gICAgICB0aGlzLl9pZCA9IGNvdW50ZXIrKzsKLSAgICAgIHRoaXMuX2xhYmVsID0g
bGFiZWw7Ci0gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdOwotCi0gICAgICBpZiAoY29uZmln
Lmluc3RydW1lbnQpIHsKLSAgICAgICAgaW5zdHJ1bWVudCgnY3JlYXRlZCcsIHRoaXMpOwotICAg
ICAgfQotCi0gICAgICBpZiAobm9vcCAhPT0gcmVzb2x2ZXIpIHsKLSAgICAgICAgaW52b2tlUmVz
b2x2ZXIocmVzb2x2ZXIsIHRoaXMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGlu
dm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNlKSB7Ci0gICAgICBmdW5jdGlvbiByZXNvbHZl
UHJvbWlzZSh2YWx1ZSkgewotICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsKLSAgICAg
IH0KLQotICAgICAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHsKLSAgICAgICAgcmVq
ZWN0KHByb21pc2UsIHJlYXNvbik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJl
c29sdmVyKHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlKTsKLSAgICAgIH0gY2F0Y2goZSkg
ewotICAgICAgICByZWplY3RQcm9taXNlKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIFByb21p
c2UuY2FzdCA9IGNhc3Q7Ci0gICAgUHJvbWlzZS5hbGwgPSBhbGw7Ci0gICAgUHJvbWlzZS5yYWNl
ID0gcmFjZTsKLSAgICBQcm9taXNlLnJlc29sdmUgPSBSZXNvbHZlOwotICAgIFByb21pc2UucmVq
ZWN0ID0gUmVqZWN0OwotCi0gICAgdmFyIFBFTkRJTkcgICA9IHZvaWQgMDsKLSAgICB2YXIgU0VB
TEVEICAgID0gMDsKLSAgICB2YXIgRlVMRklMTEVEID0gMTsKLSAgICB2YXIgUkVKRUNURUQgID0g
MjsKLQotICAgIGZ1bmN0aW9uIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50
LCBvblJlamVjdGlvbikgewotICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3Jp
YmVyczsKLSAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7Ci0KLSAgICAgIHN1
YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDsKLSAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIEZV
TEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50OwotICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVK
RUNURURdICA9IG9uUmVqZWN0aW9uOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHB1Ymxpc2gocHJv
bWlzZSwgc2V0dGxlZCkgewotICAgICAgdmFyIGNoaWxkLCBjYWxsYmFjaywgc3Vic2NyaWJlcnMg
PSBwcm9taXNlLl9zdWJzY3JpYmVycywgZGV0YWlsID0gcHJvbWlzZS5fZGV0YWlsOwotCi0gICAg
ICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAgICAgaW5zdHJ1bWVudChzZXR0bGVkID09
PSBGVUxGSUxMRUQgPyAnZnVsZmlsbGVkJyA6ICdyZWplY3RlZCcsIHByb21pc2UpOwotICAgICAg
fQotCi0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAz
KSB7Ci0gICAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07Ci0gICAgICAgIGNhbGxiYWNrID0g
c3Vic2NyaWJlcnNbaSArIHNldHRsZWRdOwotCi0gICAgICAgIGludm9rZUNhbGxiYWNrKHNldHRs
ZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTsKLSAgICAgIH0KLQotICAgICAgcHJvbWlzZS5f
c3Vic2NyaWJlcnMgPSBudWxsOwotICAgIH0KLQotICAgIFByb21pc2UucHJvdG90eXBlID0gewot
ICAgICAgY29uc3RydWN0b3I6IFByb21pc2UsCi0KLSAgICAgIF9pZDogdW5kZWZpbmVkLAotICAg
ICAgX2d1aWRLZXk6IGd1aWRLZXksCi0gICAgICBfbGFiZWw6IHVuZGVmaW5lZCwKLQotICAgICAg
X3N0YXRlOiB1bmRlZmluZWQsCi0gICAgICBfZGV0YWlsOiB1bmRlZmluZWQsCi0gICAgICBfc3Vi
c2NyaWJlcnM6IHVuZGVmaW5lZCwKLQotICAgICAgX29uZXJyb3I6IGZ1bmN0aW9uIChyZWFzb24p
IHsKLSAgICAgICAgY29uZmlnLnRyaWdnZXIoJ2Vycm9yJywgcmVhc29uKTsKLSAgICAgIH0sCi0K
LSAgICAvKioKLSAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJv
bWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLAotICAgICAgd2hpY2ggcmVnaXN0ZXJz
IGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBv
ciB0aGUKLSAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC4K
LQotICAgICAgYGBganMKLSAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXsKLSAg
ICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGUKLSAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7Ci0g
ICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFz
b24gd2h5Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBDaGFpbmluZwotICAgICAgLS0t
LS0tLS0KLQotICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJv
bWlzZS4gIFRoaXMgc2Vjb25kLCAiZG93bnN0cmVhbSIKLSAgICAgIHByb21pc2UgaXMgcmVzb2x2
ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1l
bnQKLSAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxl
ciB0aHJvd3MgYW4gZXhjZXB0aW9uLgotCi0gICAgICBgYGBqcwotICAgICAgZmluZFVzZXIoKS50
aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHJldHVybiB1c2VyLm5hbWU7Ci0gICAgICB9
LCBmdW5jdGlvbiAocmVhc29uKSB7Ci0gICAgICAgIHJldHVybiAiZGVmYXVsdCBuYW1lIjsKLSAg
ICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7Ci0gICAgICAgIC8vIElmIGBmaW5kVXNl
cmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndp
c2UgaXQKLSAgICAgICAgLy8gd2lsbCBiZSBgImRlZmF1bHQgbmFtZSJgCi0gICAgICB9KTsKLQot
ICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHRocm93IG5l
dyBFcnJvcigiRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHkiKTsKLSAgICAgIH0sIGZ1bmN0
aW9uIChyZWFzb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZmluZFVzZXJgIHJlamVj
dGVkIGFuZCB3ZSdyZSB1bmhhcHB5Iik7Ci0gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkg
ewotICAgICAgICAvLyBuZXZlciByZWFjaGVkCi0gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7
Ci0gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICJG
b3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweSIuCi0gICAgICAgIC8vIElmIGBmaW5kVXNlcmAg
cmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgImBmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3Jl
IHVuaGFwcHkiLgotICAgICAgfSk7Ci0gICAgICBgYGAKLSAgICAgIElmIHRoZSBkb3duc3RyZWFt
IHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24g
cmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLgotCi0gICAgICBg
YGBqcwotICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHRo
cm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbigiVXBzdHJlYW0gZXJyb3IiKTsKLSAgICAgIH0p
LnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0gICAgICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAgICAg
IH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0gICAgICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAg
ICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKLSAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4
Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmUKLSAgICAgIH0p
OwotICAgICAgYGBgCi0KLSAgICAgIEFzc2ltaWxhdGlvbgotICAgICAgLS0tLS0tLS0tLS0tCi0K
LSAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93
bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlCi0gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3Vz
bHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlCi0g
ICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJv
bWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZwotICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21p
c2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouCi0KLSAgICAgIGBg
YGpzCi0gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKLSAgICAgICAgcmV0
dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpOwotICAgICAgfSkudGhlbihmdW5jdGlvbiAo
Y29tbWVudHMpIHsKLSAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWls
YWJsZQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHBy
b21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWpl
Y3QuCi0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIp
IHsKLSAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpOwotICAgICAgfSku
dGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKLSAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5
QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZQotICAgICAgfSwgZnVu
Y3Rpb24gKHJlYXNvbikgewotICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJl
amVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBTaW1wbGUgRXhhbXBsZQotICAgICAgLS0tLS0tLS0tLS0tLS0KLQotICAgICAgU3lu
Y2hyb25vdXMgRXhhbXBsZQotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcmVzdWx0
OwotCi0gICAgICB0cnkgewotICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7Ci0gICAgICAg
IC8vIHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgIC8vIGZhaWx1cmUK
LSAgICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBFcnJiYWNrIEV4YW1wbGUKLQotICAgICAgYGBg
anMKLSAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpewotICAgICAgICBpZiAo
ZXJyKSB7Ci0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgUHJv
bWlzZSBFeGFtcGxlOwotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBmaW5kUmVzdWx0KCku
dGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyBzdWNjZXNzCi0gICAgICB9LCBmdW5j
dGlvbihyZWFzb24pewotICAgICAgICAvLyBmYWlsdXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBBZHZhbmNlZCBFeGFtcGxlCi0gICAgICAtLS0tLS0tLS0tLS0tLQotCi0gICAgICBT
eW5jaHJvbm91cyBFeGFtcGxlCi0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBhdXRo
b3IsIGJvb2tzOwotCi0gICAgICB0cnkgewotICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7
Ci0gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7Ci0gICAgICAgIC8v
IHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgIC8vIGZhaWx1cmUKLSAg
ICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBFcnJiYWNrIEV4YW1wbGUKLQotICAgICAgYGBganMK
LQotICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykgewotCi0gICAgICB9Ci0KLSAgICAg
IGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7Ci0KLSAgICAgIH0KLQotICAgICAgZmluZEF1dGhv
cihmdW5jdGlvbihhdXRob3IsIGVycil7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICBm
YWlsdXJlKGVycik7Ci0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5j
dGlvbihib29rcywgZXJyKSB7Ci0gICAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAg
ICAgICBmYWlsdXJlKGVycik7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpOwotICAgICAgICAg
ICAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNv
bik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsK
LSAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICAgICAgICBmYWlsdXJlKGVycik7Ci0g
ICAgICAgICAgfQotICAgICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgUHJvbWlzZSBFeGFtcGxlOwotCi0gICAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgICBmaW5kQXV0aG9yKCkuCi0gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLgot
ICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXsKLSAgICAgICAgICAvLyBmb3VuZCBib29rcwot
ICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gc29tZXRoaW5nIHdl
bnQgd3JvbmcKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgdGhlbgotICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWQKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IG9uUmVqZWN0ZWQKLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
Zm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7UHJvbWlzZX0KLSAgICAqLwotICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxm
aWxsbWVudCwgb25SZWplY3Rpb24sIGxhYmVsKSB7Ci0gICAgICAgIHZhciBwcm9taXNlID0gdGhp
czsKLSAgICAgICAgdGhpcy5fb25lcnJvciA9IG51bGw7Ci0KLSAgICAgICAgdmFyIHRoZW5Qcm9t
aXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCwgbGFiZWwpOwotCi0gICAgICAgIGlmICh0
aGlzLl9zdGF0ZSkgewotICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBhcmd1bWVudHM7Ci0gICAg
ICAgICAgY29uZmlnLmFzeW5jKGZ1bmN0aW9uIGludm9rZVByb21pc2VDYWxsYmFjaygpIHsKLSAg
ICAgICAgICAgIGludm9rZUNhbGxiYWNrKHByb21pc2UuX3N0YXRlLCB0aGVuUHJvbWlzZSwgY2Fs
bGJhY2tzW3Byb21pc2UuX3N0YXRlIC0gMV0sIHByb21pc2UuX2RldGFpbCk7Ci0gICAgICAgICAg
fSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3Vic2NyaWJlKHRoaXMsIHRoZW5Qcm9t
aXNlLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAgICAgICBpbnN0cnVtZW50KCdjaGFpbmVkJywg
cHJvbWlzZSwgdGhlblByb21pc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW5Q
cm9taXNlOwotICAgICAgfSwKLQotICAgIC8qKgotICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3Vn
YXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUg
c2FtZQotICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC4K
LQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXsKLSAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yIik7Ci0gICAgICB9Ci0KLSAg
ICAgIC8vIHN5bmNocm9ub3VzCi0gICAgICB0cnkgewotICAgICAgICBmaW5kQXV0aG9yKCk7Ci0g
ICAgICB9IGNhdGNoKHJlYXNvbikgewotICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZwot
ICAgICAgfQotCi0gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzCi0gICAgICBmaW5kQXV0aG9y
KCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3Jv
bmcKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgY2F0Y2gKLSAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBm
b3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICAgICdjYXRj
aCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uLCBsYWJlbCkgewotICAgICAgICByZXR1cm4gdGhpcy50
aGVuKG51bGwsIG9uUmVqZWN0aW9uLCBsYWJlbCk7Ci0gICAgICB9LAotCi0gICAgLyoqCi0gICAg
ICBgZmluYWxseWAgd2lsbCBiZSBpbnZva2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb21pc2UncyBm
YXRlIGp1c3QgYXMgbmF0aXZlCi0gICAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzCi0KLSAg
ICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6Ci0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kQXV0aG9y
KCkgewotICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDAuNSkgewotICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQXV0aG9yKCk7Ci0g
ICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJldHVybiBmaW5kQXV0aG9yKCk7IC8vIHN1
Y2NlZWQgb3IgZmFpbAotICAgICAgfSBjYXRjaChlcnJvcikgewotICAgICAgICByZXR1cm4gZmlu
ZE90aGVyQXV0aGVyKCk7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICAvLyBhbHdheXMgcnVu
cwotICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICB9Ci0g
ICAgICBgYGAKLQotICAgICAgQXN5bmNocm9ub3VzIGV4YW1wbGU6Ci0KLSAgICAgIGBgYGpzCi0g
ICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgcmV0dXJu
IGZpbmRPdGhlckF1dGhlcigpOwotICAgICAgfSkuZmluYWxseShmdW5jdGlvbigpewotICAgICAg
ICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwgb3Igbm90Ci0gICAgICB9KTsKLSAgICAgIGBg
YAotCi0gICAgICBAbWV0aG9kIGZpbmFsbHkKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxi
YWNrCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJl
bGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1
cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICAgICdmaW5hbGx5JzogZnVuY3Rpb24oY2FsbGJhY2ss
IGxhYmVsKSB7Ci0gICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7Ci0K
LSAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICAgIHJl
dHVybiBjb25zdHJ1Y3Rvci5jYXN0KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKXsKLSAgICAg
ICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSwgZnVuY3Rpb24o
cmVhc29uKSB7Ci0gICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmNhc3QoY2FsbGJhY2soKSku
dGhlbihmdW5jdGlvbigpewotICAgICAgICAgICAgdGhyb3cgcmVhc29uOwotICAgICAgICAgIH0p
OwotICAgICAgICB9LCBsYWJlbCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGlu
dm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHsKLSAgICAg
IHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLAotICAgICAgICAgIHZhbHVl
LCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7Ci0KLSAgICAgIGlmIChoYXNDYWxsYmFjaykgewot
ICAgICAgICB0cnkgewotICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soZGV0YWlsKTsKLSAgICAg
ICAgICBzdWNjZWVkZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICBm
YWlsZWQgPSB0cnVlOwotICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgfQotICAgICAgfSBl
bHNlIHsKLSAgICAgICAgdmFsdWUgPSBkZXRhaWw7Ci0gICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7
Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpIHsK
LSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVk
ZWQpIHsKLSAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYg
KGZhaWxlZCkgewotICAgICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpOwotICAgICAgfSBlbHNl
IGlmIChzZXR0bGVkID09PSBGVUxGSUxMRUQpIHsKLSAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2
YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKSB7Ci0gICAgICAg
IHJlamVjdChwcm9taXNlLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24g
aGFuZGxlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpIHsKLSAgICAgIHZhciB0aGVuID0gbnVsbCwK
LSAgICAgIHJlc29sdmVkOwotCi0gICAgICB0cnkgewotICAgICAgICBpZiAocHJvbWlzZSA9PT0g
dmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxi
YWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuIik7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHsKLSAgICAgICAgICB0aGVuID0gdmFs
dWUudGhlbjsKLQotICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoZW4pKSB7Ci0gICAgICAgICAg
ICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZhbCkgewotICAgICAgICAgICAgICBpZiAocmVz
b2x2ZWQpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOwot
Ci0gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsKSB7Ci0gICAgICAgICAgICAgICAgcmVz
b2x2ZShwcm9taXNlLCB2YWwpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fSwgZnVuY3Rpb24odmFsKSB7Ci0gICAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4g
dHJ1ZTsgfQotICAgICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAg
cmVqZWN0KHByb21pc2UsIHZhbCk7Ci0gICAgICAgICAgICB9LCAnZGVyaXZlZCBmcm9tOiAnICsg
KHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpOwotCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKGVycm9y
KSB7Ci0gICAgICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICByZWpl
Y3QocHJvbWlzZSwgZXJyb3IpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwg
dmFsdWUpIHsKLSAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgewotICAgICAgICBmdWxmaWxs
KHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0gZWxzZSBpZiAoIWhhbmRsZVRoZW5hYmxlKHByb21p
c2UsIHZhbHVlKSkgewotICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0K
LSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7Ci0gICAgICBp
ZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9Ci0gICAgICBwcm9taXNl
Ll9zdGF0ZSA9IFNFQUxFRDsKLSAgICAgIHByb21pc2UuX2RldGFpbCA9IHZhbHVlOwotCi0gICAg
ICBjb25maWcuYXN5bmMocHVibGlzaEZ1bGZpbGxtZW50LCBwcm9taXNlKTsKLSAgICB9Ci0KLSAg
ICBmdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7Ci0gICAgICBpZiAocHJvbWlzZS5f
c3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9Ci0gICAgICBwcm9taXNlLl9zdGF0ZSA9IFNF
QUxFRDsKLSAgICAgIHByb21pc2UuX2RldGFpbCA9IHJlYXNvbjsKLQotICAgICAgY29uZmlnLmFz
eW5jKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHB1
Ymxpc2hGdWxmaWxsbWVudChwcm9taXNlKSB7Ci0gICAgICBwdWJsaXNoKHByb21pc2UsIHByb21p
c2UuX3N0YXRlID0gRlVMRklMTEVEKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBwdWJsaXNoUmVq
ZWN0aW9uKHByb21pc2UpIHsKLSAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7Ci0gICAgICAg
IHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fZGV0YWlsKTsKLSAgICAgIH0KLQotICAgICAgcHVi
bGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9IFJFSkVDVEVEKTsKLSAgICB9Ci0gIH0pOwot
ZGVmaW5lKCJyc3ZwL3Byb21pc2UvYWxsIiwgCi0gIFsiLi4vdXRpbHMiLCJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmlj
dCI7Ci0gICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKLSAgICB2YXIg
aXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFfXy5pc05vblRoZW5hYmxlOwotCi0gICAgLyoq
Ci0gICAgICBgUlNWUC5Qcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywg
YW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaAotICAgICAgaXMgZnVsZmlsbGVkIHdpdGgg
YW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVzIGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBv
cgotICAgICAgcmVqZWN0ZWQgd2l0aCB0aGUgcmVhc29uIG9mIHRoZSBmaXJzdCBwYXNzZWQgcHJv
bWlzZSB0byBiZSByZWplY3RlZC4gSXQgY2FzdHMgYWxsCi0gICAgICBlbGVtZW50cyBvZiB0aGUg
cGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCi0K
LSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNl
MSA9IFJTVlAucmVzb2x2ZSgxKTsKLSAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVzb2x2ZSgy
KTsKLSAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVzb2x2ZSgzKTsKLSAgICAgIHZhciBwcm9t
aXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0gICAgICBSU1ZQLlBy
b21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXsKLSAgICAgICAgLy8gVGhl
IGFycmF5IGhlcmUgd291bGQgYmUgWyAxLCAyLCAzIF07Ci0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuYWxsYCBhcmUg
cmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCi0gICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwg
YmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2VzJ3MKLSAgICAg
IHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToKLQotICAgICAgRXhhbXBsZToKLQotICAg
ICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOwot
ICAgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIyIikpOwotICAgICAg
dmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIzIikpOwotICAgICAgdmFyIHBy
b21pc2VzID0gWyBwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07Ci0KLSAgICAgIFJTVlAu
UHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpewotICAgICAgICAvLyBD
b2RlIGhlcmUgbmV2ZXIgcnVucyBiZWNhdXNlIHRoZXJlIGFyZSByZWplY3RlZCBwcm9taXNlcyEK
LSAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7Ci0gICAgICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09
ICIyIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBm
b3IgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFyYW0ge0FycmF5fSBlbnRyaWVzIGFycmF5IG9mIHBy
b21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBs
YWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEBy
ZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBhbGwgYHByb21p
c2VzYCBoYXZlIGJlZW4KLSAgICAgIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRo
ZW0gYmVjb21lIHJlamVjdGVkLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGFsbChlbnRyaWVzLCBsYWJlbCkgewotCi0gICAgICAv
KmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwotICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsK
LQotICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qp
IHsKLSAgICAgICAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3
IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byBhbGwuJyk7Ci0gICAgICAgIH0K
LQotICAgICAgICB2YXIgcmVtYWluaW5nID0gZW50cmllcy5sZW5ndGg7Ci0gICAgICAgIHZhciBy
ZXN1bHRzID0gbmV3IEFycmF5KHJlbWFpbmluZyk7Ci0gICAgICAgIHZhciBlbnRyeSwgcGVuZGlu
ZyA9IHRydWU7Ci0KLSAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgIHJl
c29sdmUocmVzdWx0cyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAg
ZnVuY3Rpb24gZnVsZmlsbG1lbnRBdChpbmRleCkgewotICAgICAgICAgIHJldHVybiBmdW5jdGlv
bih2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2YWx1ZTsKLSAgICAgICAg
ICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZlKHJlc3Vs
dHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBm
dW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHsKLSAgICAgICAgICByZW1haW5pbmcgPSAwOwot
ICAgICAgICAgIHJlamVjdChyZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIg
aW5kZXggPSAwOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAg
ZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKLSAgICAgICAgICBpZiAoaXNOb25UaGVuYWJsZShlbnRy
eSkpIHsKLSAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZW50cnk7Ci0gICAgICAgICAgICBp
ZiAoLS1yZW1haW5pbmcgPT09IDApIHsKLSAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29uc3RydWN0
b3IuY2FzdChlbnRyeSkudGhlbihmdWxmaWxsbWVudEF0KGluZGV4KSwgb25SZWplY3Rpb24pOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwot
ZGVmaW5lKCJyc3ZwL3Byb21pc2UvY2FzdCIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24o
X19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgLyoqCi0gICAgICBgUlNWUC5Q
cm9taXNlLmNhc3RgIGNvZXJjZXMgaXRzIGFyZ3VtZW50IHRvIGEgcHJvbWlzZSwgb3IgcmV0dXJu
cyB0aGUKLSAgICAgIGFyZ3VtZW50IGlmIGl0IGlzIGFscmVhZHkgYSBwcm9taXNlIHdoaWNoIHNo
YXJlcyBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNhc3Rlci4KLQotICAgICAgRXhhbXBsZToKLQot
ICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVz
b2x2ZSgxKTsKLSAgICAgIHZhciBjYXN0ZWQgPSBSU1ZQLlByb21pc2UuY2FzdChwcm9taXNlKTsK
LQotICAgICAgY29uc29sZS5sb2cocHJvbWlzZSA9PT0gY2FzdGVkKTsgLy8gdHJ1ZQotICAgICAg
YGBgCi0KLSAgICAgIEluIHRoZSBjYXNlIG9mIGEgcHJvbWlzZSB3aG9zZSBjb25zdHJ1Y3RvciBk
b2VzIG5vdCBtYXRjaCwgaXQgaXMgYXNzaW1pbGF0ZWQuCi0gICAgICBUaGUgcmVzdWx0aW5nIHBy
b21pc2Ugd2lsbCBmdWxmaWxsIG9yIHJlamVjdCBiYXNlZCBvbiB0aGUgb3V0Y29tZSBvZiB0aGUK
LSAgICAgIHByb21pc2UgYmVpbmcgY2FzdGVkLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgdGhlbm5hYmxlID0gJC5nZXRKU09OKCcvYXBpL2Zvbycp
OwotICAgICAgdmFyIGNhc3RlZCA9IFJTVlAuUHJvbWlzZS5jYXN0KHRoZW5uYWJsZSk7Ci0KLSAg
ICAgIGNvbnNvbGUubG9nKHRoZW5uYWJsZSA9PT0gY2FzdGVkKTsgLy8gZmFsc2UKLSAgICAgIGNv
bnNvbGUubG9nKGNhc3RlZCBpbnN0YW5jZW9mIFJTVlAuUHJvbWlzZSkgLy8gdHJ1ZQotCi0gICAg
ICBjYXN0ZWQudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgIC8vIGRhdGEgaXMgdGhlIHZh
bHVlIGdldEpTT04gZnVsZmlsbHMgd2l0aAotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
SW4gdGhlIGNhc2Ugb2YgYSBub24tcHJvbWlzZSwgYSBwcm9taXNlIHdoaWNoIHdpbGwgZnVsZmls
bCB3aXRoIHRoYXQgdmFsdWUgaXMKLSAgICAgIHJldHVybmVkLgotCi0gICAgICBFeGFtcGxlOgot
Ci0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgdmFsdWUgPSAxOyAvLyBjb3VsZCBiZSBh
IG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCB1bmRlZmluZWQuLi4KLSAgICAgIHZhciBjYXN0ZWQg
PSBSU1ZQLlByb21pc2UuY2FzdCh2YWx1ZSk7Ci0KLSAgICAgIGNvbnNvbGUubG9nKHZhbHVlID09
PSBjYXN0ZWQpOyAvLyBmYWxzZQotICAgICAgY29uc29sZS5sb2coY2FzdGVkIGluc3RhbmNlb2Yg
UlNWUC5Qcm9taXNlKSAvLyB0cnVlCi0KLSAgICAgIGNhc3RlZC50aGVuKGZ1bmN0aW9uKHZhbCkg
ewotICAgICAgICB2YWwgPT09IHZhbHVlIC8vID0+IHRydWUKLSAgICAgIH0pOwotICAgICAgYGBg
Ci0KLSAgICAgIGBSU1ZQLlByb21pc2UuY2FzdGAgaXMgc2ltaWxhciB0byBgUlNWUC5Qcm9taXNl
LnJlc29sdmVgLCBidXQgYFJTVlAuUHJvbWlzZS5jYXN0YCBkaWZmZXJzIGluIHRoZQotICAgICAg
Zm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICogYFJTVlAuUHJvbWlzZS5jYXN0YCBzZXJ2ZXMgYXMg
YSBtZW1vcnktZWZmaWNpZW50IHdheSBvZiBnZXR0aW5nIGEgcHJvbWlzZSwgd2hlbiB5b3UKLSAg
ICAgIGhhdmUgc29tZXRoaW5nIHRoYXQgY291bGQgZWl0aGVyIGJlIGEgcHJvbWlzZSBvciBhIHZh
bHVlLiBSU1ZQLnJlc29sdmUKLSAgICAgIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYnV0IHdp
bGwgY3JlYXRlIGEgbmV3IHByb21pc2Ugd3JhcHBlciBpZiB0aGUKLSAgICAgIGFyZ3VtZW50IGlz
IGEgcHJvbWlzZS4KLSAgICAgICogYFJTVlAuUHJvbWlzZS5jYXN0YCBpcyBhIHdheSBvZiBjYXN0
aW5nIGluY29taW5nIHRoZW5hYmxlcyBvciBwcm9taXNlIHN1YmNsYXNzZXMgdG8KLSAgICAgIHBy
b21pc2VzIG9mIHRoZSBleGFjdCBjbGFzcyBzcGVjaWZpZWQsIHNvIHRoYXQgdGhlIHJlc3VsdGlu
ZyBvYmplY3QncyBgdGhlbmAgaXMKLSAgICAgIGVuc3VyZWQgdG8gaGF2ZSB0aGUgYmVoYXZpb3Ig
b2YgdGhlIGNvbnN0cnVjdG9yIHlvdSBhcmUgY2FsbGluZyBjYXN0IG9uIChpLmUuLCBSU1ZQLlBy
b21pc2UpLgotCi0gICAgICBAbWV0aG9kIGNhc3QKLSAgICAgIEBwYXJhbSB7T2JqZWN0fSBvYmpl
Y3QgdG8gYmUgY2FzdGVkCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3Ry
aW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4K
LSAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgICAgIEBzdGF0aWMKLSAgICAqLwot
Ci0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGNhc3Qob2JqZWN0LCBsYWJl
bCkgewotICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KLSAgICAgIHZhciBDb25zdHJ1
Y3RvciA9IHRoaXM7Ci0KLSAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29i
amVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3RvcikgewotICAgICAgICBy
ZXR1cm4gb2JqZWN0OwotICAgICAgfQotCi0gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1
bmN0aW9uKHJlc29sdmUpIHsKLSAgICAgICAgcmVzb2x2ZShvYmplY3QpOwotICAgICAgfSwgbGFi
ZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvcmFjZSIsIAotICBbIi4u
L3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0
c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIC8qIGdsb2JhbCB0b1N0cmluZyAqLwotCi0g
ICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKLSAgICB2YXIgaXNGdW5j
dGlvbiA9IF9fZGVwZW5kZW5jeTFfXy5pc0Z1bmN0aW9uOwotICAgIHZhciBpc05vblRoZW5hYmxl
ID0gX19kZXBlbmRlbmN5MV9fLmlzTm9uVGhlbmFibGU7Ci0KLSAgICAvKioKLSAgICAgIGBSU1ZQ
LlByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4g
dGhlIHNhbWUgd2F5IGFzIHRoZQotICAgICAgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gc2V0dGxl
LgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJv
bWlzZTEgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Ci0gICAg
ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICByZXNvbHZlKCJwcm9taXNlIDEi
KTsKLSAgICAgICAgfSwgMjAwKTsKLSAgICAgIH0pOwotCi0gICAgICB2YXIgcHJvbWlzZTIgPSBu
ZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Ci0gICAgICAgIHNldFRp
bWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICByZXNvbHZlKCJwcm9taXNlIDIiKTsKLSAgICAg
ICAgfSwgMTAwKTsKLSAgICAgIH0pOwotCi0gICAgICBSU1ZQLlByb21pc2UucmFjZShbcHJvbWlz
ZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyByZXN1bHQg
PT09ICJwcm9taXNlIDIiIGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMQot
ICAgICAgICAvLyB3YXMgcmVzb2x2ZWQuCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBg
UlNWUC5Qcm9taXNlLnJhY2VgIGlzIGRldGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0
ZSBvZiB0aGUgZmlyc3QKLSAgICAgIHNldHRsZWQgcHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBs
ZSwgZXZlbiBpZiBvdGhlciBwcm9taXNlcyBnaXZlbiB0byB0aGUKLSAgICAgIGBwcm9taXNlc2Ag
YXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlz
ZSBoYXMKLSAgICAgIGJlY29tZSByZWplY3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJl
Y2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZAotICAgICAgcHJvbWlzZSB3aWxsIGJlY29tZSBy
ZWplY3RlZDoKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UxID0gbmV3
IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgcmVzb2x2ZSgicHJvbWlzZSAxIik7Ci0gICAgICAg
IH0sIDIwMCk7Ci0gICAgICB9KTsKLQotICAgICAgdmFyIHByb21pc2UyID0gbmV3IFJTVlAuUHJv
bWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0
aW9uKCl7Ci0gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigicHJvbWlzZSAyIikpOwotICAgICAg
ICB9LCAxMDApOwotICAgICAgfSk7Ci0KLSAgICAgIFJTVlAuUHJvbWlzZS5yYWNlKFtwcm9taXNl
MSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgIC8vIENvZGUgaGVy
ZSBuZXZlciBydW5zCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pewotICAgICAgICAvLyByZWFz
b24ubWVzc2FnZSA9PT0gInByb21pc2UyIiBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0
ZWQgYmVmb3JlCi0gICAgICAgIC8vIHByb21pc2UgMSBiZWNhbWUgZnVsZmlsbGVkCi0gICAgICB9
KTsKLSAgICAgIGBgYAotCi0gICAgICBBbiBleGFtcGxlIHJlYWwtd29ybGQgdXNlIGNhc2UgaXMg
aW1wbGVtZW50aW5nIHRpbWVvdXRzOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBSU1ZQ
LlByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24nKSwgdGltZW91dCg1MDAwKV0pCi0gICAgICBg
YGAKLQotICAgICAgQG1ldGhvZCByYWNlCi0gICAgICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBh
cnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBkZXNjcmliaW5nIHRoZSBwcm9taXNlIHJldHVybmVkLgotICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNl
IHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWQKLSAgICAg
IHByb21pc2UgdG8gc2V0dGxlLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJhY2UoZW50cmllcywgbGFiZWwpIHsKLSAgICAgIC8q
anNoaW50IHZhbGlkdGhpczp0cnVlICovCi0gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLCBl
bnRyeTsKLQotICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpIHsKLSAgICAgICAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7Ci0gICAgICAgICAgdGhy
b3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgdmFyIHBlbmRpbmcgPSB0cnVlOwotCi0gICAgICAgIGZ1bmN0aW9u
IG9uRnVsZmlsbG1lbnQodmFsdWUpIHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyBy
ZXNvbHZlKHZhbHVlKTsgfSB9Ci0gICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikg
IHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyByZWplY3QocmVhc29uKTsgfSB9Ci0K
LSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAg
ICAgICAgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVu
dHJ5KSkgewotICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgcmVzb2x2
ZShlbnRyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIENvbnN0cnVjdG9yLmNhc3QoZW50cnkpLnRoZW4ob25GdWxmaWxsbWVudCwgb25SZWpl
Y3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgbGFiZWwpOwotICAgIH07
Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvcmVqZWN0IiwgCi0gIFsiZXhwb3J0cyJdLAot
ICBmdW5jdGlvbihfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAg
ICAgIGBSU1ZQLlByb21pc2UucmVqZWN0YCByZXR1cm5zIGEgcHJvbWlzZSByZWplY3RlZCB3aXRo
IHRoZSBwYXNzZWQgYHJlYXNvbmAuCi0gICAgICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xs
b3dpbmc6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlID0gbmV3IFJT
VlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICByZWplY3QobmV3
IEVycm9yKCdXSE9PUFMnKSk7Ci0gICAgICB9KTsKLQotICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0
aW9uKHZhbHVlKXsKLSAgICAgICAgLy8gQ29kZSBoZXJlIGRvZXNuJ3QgcnVuIGJlY2F1c2UgdGhl
IHByb21pc2UgaXMgcmVqZWN0ZWQhCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pewotICAgICAg
ICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUycKLSAgICAgIH0pOwotICAgICAgYGBgCi0K
LSAgICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5
IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFy
IHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpOwotCi0g
ICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAvLyBDb2RlIGhlcmUg
ZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCEKLSAgICAgIH0sIGZ1
bmN0aW9uKHJlYXNvbil7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJwot
ICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByZWplY3QKLSAgICAgIEBwYXJh
bSB7QW55fSByZWFzb24gdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJl
amVjdGVkIHdpdGguCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5n
IGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3Ig
dG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRo
IHRoZSBnaXZlbiBgcmVhc29uYC4KLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0
c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiByZWplY3QocmVhc29uLCBsYWJlbCkgewotICAgICAg
Lypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KLSAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7
Ci0KLSAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVj
dCkgewotICAgICAgICByZWplY3QocmVhc29uKTsKLSAgICAgIH0sIGxhYmVsKTsKLSAgICB9Owot
ICB9KTsKLWRlZmluZSgicnN2cC9wcm9taXNlL3Jlc29sdmUiLCAKLSAgWyJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIC8qKgotICAg
ICAgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVj
b21lIHJlc29sdmVkIHdpdGggdGhlCi0gICAgICBwYXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRo
YW5kIGZvciB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIg
cHJvbWlzZSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKLSAg
ICAgICAgcmVzb2x2ZSgxKTsKLSAgICAgIH0pOwotCi0gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rp
b24odmFsdWUpewotICAgICAgICAvLyB2YWx1ZSA9PT0gMQotICAgICAgfSk7Ci0gICAgICBgYGAK
LQotICAgICAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1w
bHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2
YXIgcHJvbWlzZSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwotCi0gICAgICBwcm9taXNlLnRo
ZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAvLyB2YWx1ZSA9PT0gMQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByZXNvbHZlCi0gICAgICBAcGFyYW0ge0FueX0gdmFs
dWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGgK
LSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGlkZW50aWZ5
aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVk
IHdpdGggdGhlIGdpdmVuCi0gICAgICBgdmFsdWVgCi0gICAgICBAc3RhdGljCi0gICAgKi8KLSAg
ICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSwgbGFiZWwp
IHsKLSAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovCi0gICAgICB2YXIgQ29uc3RydWN0
b3IgPSB0aGlzOwotCi0gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29s
dmUsIHJlamVjdCkgewotICAgICAgICByZXNvbHZlKHZhbHVlKTsKLSAgICAgIH0sIGxhYmVsKTsK
LSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9yYWNlIiwgCi0gIFsiLi9wcm9taXNlIiwiZXhw
b3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7Ci0gICAg
InVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0
Il07Ci0KLSAgICAvKioKLSAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW50IGFsaWFzIGZvciBgUlNW
UC5Qcm9taXNlLnJhY2VgLgotCi0gICAgICBAbWV0aG9kIHJhY2UKLSAgICAgIEBwYXJhbSB7QXJy
YXl9IGFycmF5IEFycmF5IG9mIHByb21pc2VzLgotICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVs
IEFuIG9wdGlvbmFsIGxhYmVsLiBUaGlzIGlzIHVzZWZ1bAotICAgICAgZm9yIHRvb2xpbmcuCi0g
ICAgICBAc3RhdGljCi0gICAgKi8KLSAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rp
b24gcmFjZShhcnJheSwgbGFiZWwpIHsKLSAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoYXJyYXks
IGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9yZWplY3QiLCAKLSAgWyIuL3By
b21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRz
X18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kx
X19bImRlZmF1bHQiXTsKLQotICAgIC8qKgotICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxp
YXMgZm9yIGBSU1ZQLlByb21pc2UucmVqZWN0YC4KLQotICAgICAgQG1ldGhvZCByZWplY3QKLSAg
ICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBbnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSBy
ZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC4KLSAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGlkZW50aWZ5aW5nIHRoZSByZXR1cm5lZCBw
cm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlz
ZX0gYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhlIGdpdmVuIGByZWFzb25gLgotICAgICAgQHN0
YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJlamVj
dChyZWFzb24sIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uLCBs
YWJlbCk7Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvcmVzb2x2ZSIsIAotICBbIi4vcHJv
bWlzZSIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNf
XykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFf
X1siZGVmYXVsdCJdOwotCi0gICAgLyoqCi0gICAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlh
cyBmb3IgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYC4KLQotICAgICAgQG1ldGhvZCByZXNvbHZlCi0g
ICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSBy
ZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aAotICAgICAgQHBhcmFtIHtTdHJp
bmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHBy
b21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNl
fSBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgZ2l2ZW4KLSAg
ICAgIGB2YWx1ZWAKLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZh
dWx0Il0gPSBmdW5jdGlvbiByZXNvbHZlKHZhbHVlLCBsYWJlbCkgewotICAgICAgcmV0dXJuIFBy
b21pc2UucmVzb2x2ZSh2YWx1ZSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3Zw
L3JldGhyb3ciLCAKLSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0g
ICAgInVzZSBzdHJpY3QiOwotICAgIC8qKgotICAgICAgYFJTVlAucmV0aHJvd2Agd2lsbCByZXRo
cm93IGFuIGVycm9yIG9uIHRoZSBuZXh0IHR1cm4gb2YgdGhlIEphdmFTY3JpcHQgZXZlbnQKLSAg
ICAgIGxvb3AgaW4gb3JkZXIgdG8gYWlkIGRlYnVnZ2luZy4KLQotICAgICAgUHJvbWlzZXMgQSsg
c3BlY2lmaWVzIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciB3aXRoIGEgcHJvbWlzZSBt
dXN0IGJlCi0gICAgICBjYXVnaHQgYnkgdGhlIHByb21pc2VzIGltcGxlbWVudGF0aW9uIGFuZCBi
dWJibGVkIHRvIHRoZSBsYXN0IGhhbmRsZXIuIEZvcgotICAgICAgdGhpcyByZWFzb24sIGl0IGlz
IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cyBzcGVjaWZ5IGEgc2Vjb25kIHJlamVjdGlvbgot
ICAgICAgaGFuZGxlciBmdW5jdGlvbiB0byBgdGhlbmAuIEhvd2V2ZXIsIGBSU1ZQLnJldGhyb3dg
IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAgICAgb3V0c2lkZSBvZiB0aGUgcHJvbWlzZSwg
c28gaXQgYnViYmxlcyB1cCB0byB5b3VyIGNvbnNvbGUgaWYgaW4gdGhlIGJyb3dzZXIsCi0gICAg
ICBvciBkb21haW4vY2F1c2UgdW5jYXVnaHQgZXhjZXB0aW9uIGluIE5vZGUuIGByZXRocm93YCB3
aWxsIGFsc28gdGhyb3cgdGhlCi0gICAgICBlcnJvciBhZ2FpbiBzbyB0aGUgZXJyb3IgY2FuIGJl
IGhhbmRsZWQgYnkgdGhlIHByb21pc2UgcGVyIHRoZSBzcGVjLgotCi0gICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICBmdW5jdGlvbiB0aHJvd3MoKXsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdX
aG9vcHMhJyk7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICB0aHJvd3MoKTsKLSAgICAgIH0p
OwotCi0gICAgICBwcm9taXNlLmNhdGNoKFJTVlAucmV0aHJvdykudGhlbihmdW5jdGlvbigpewot
ICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBiZWNh
bWUgcmVqZWN0ZWQgZHVlIHRvIGFuCi0gICAgICAgIC8vIGVycm9yIQotICAgICAgfSwgZnVuY3Rp
b24gKGVycil7Ci0gICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IgaGVyZQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgVGhlICdXaG9vcHMnIGVycm9yIHdpbGwgYmUgdGhyb3duIG9uIHRo
ZSBuZXh0IHR1cm4gb2YgdGhlIGV2ZW50IGxvb3AKLSAgICAgIGFuZCB5b3UgY2FuIHdhdGNoIGZv
ciBpdCBpbiB5b3VyIGNvbnNvbGUuIFlvdSBjYW4gYWxzbyBoYW5kbGUgaXQgdXNpbmcgYQotICAg
ICAgcmVqZWN0aW9uIGhhbmRsZXIgZ2l2ZW4gdG8gYC50aGVuYCBvciBgLmNhdGNoYCBvbiB0aGUg
cmV0dXJuZWQgcHJvbWlzZS4KLQotICAgICAgQG1ldGhvZCByZXRocm93Ci0gICAgICBAZm9yIFJT
VlAKLSAgICAgIEBwYXJhbSB7RXJyb3J9IHJlYXNvbiByZWFzb24gdGhlIHByb21pc2UgYmVjYW1l
IHJlamVjdGVkLgotICAgICAgQHRocm93cyBFcnJvcgotICAgICAgQHN0YXRpYwotICAgICovCi0g
ICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJldGhyb3cocmVhc29uKSB7Ci0g
ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICB0aHJvdyByZWFzb247Ci0gICAg
ICB9KTsKLSAgICAgIHRocm93IHJlYXNvbjsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC91
dGlscyIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAi
dXNlIHN0cmljdCI7Ci0gICAgZnVuY3Rpb24gb2JqZWN0T3JGdW5jdGlvbih4KSB7Ci0gICAgICBy
ZXR1cm4gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgfHwgKHR5cGVvZiB4ID09PSAib2JqZWN0IiAm
JiB4ICE9PSBudWxsKTsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5vYmplY3RPckZ1bmN0aW9u
ID0gb2JqZWN0T3JGdW5jdGlvbjtmdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHsKLSAgICAgIHJldHVy
biB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIjsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc0Z1
bmN0aW9uID0gaXNGdW5jdGlvbjtmdW5jdGlvbiBpc05vblRoZW5hYmxlKHgpIHsKLSAgICAgIHJl
dHVybiAhb2JqZWN0T3JGdW5jdGlvbih4KTsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc05v
blRoZW5hYmxlID0gaXNOb25UaGVuYWJsZTtmdW5jdGlvbiBpc0FycmF5KHgpIHsKLSAgICAgIHJl
dHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICJbb2JqZWN0IEFycmF5
XSI7Ci0gICAgfQotCi0gICAgX19leHBvcnRzX18uaXNBcnJheSA9IGlzQXJyYXk7Ly8gRGF0ZS5u
b3cgaXMgbm90IGF2YWlsYWJsZSBpbiBicm93c2VycyA8IElFOQotICAgIC8vIGh0dHBzOi8vZGV2
ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0ds
b2JhbF9PYmplY3RzL0RhdGUvbm93I0NvbXBhdGliaWxpdHkKLSAgICB2YXIgbm93ID0gRGF0ZS5u
b3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTsKLSAgICBf
X2V4cG9ydHNfXy5ub3cgPSBub3c7Ci0gICAgdmFyIGtleXNPZiA9IE9iamVjdC5rZXlzIHx8IGZ1
bmN0aW9uKG9iamVjdCkgewotICAgICAgdmFyIHJlc3VsdCA9IFtdOwotCi0gICAgICBmb3IgKHZh
ciBwcm9wIGluIG9iamVjdCkgewotICAgICAgICByZXN1bHQucHVzaChwcm9wKTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9OwotICAgIF9fZXhwb3J0c19fLmtleXNPZiA9
IGtleXNPZjsKLSAgfSk7Ci1kZWZpbmUoInJzdnAiLCAKLSAgWyIuL3JzdnAvcHJvbWlzZSIsIi4v
cnN2cC9ldmVudHMiLCIuL3JzdnAvbm9kZSIsIi4vcnN2cC9hbGwiLCIuL3JzdnAvYWxsX3NldHRs
ZWQiLCIuL3JzdnAvcmFjZSIsIi4vcnN2cC9oYXNoIiwiLi9yc3ZwL3JldGhyb3ciLCIuL3JzdnAv
ZGVmZXIiLCIuL3JzdnAvY29uZmlnIiwiLi9yc3ZwL21hcCIsIi4vcnN2cC9yZXNvbHZlIiwiLi9y
c3ZwL3JlamVjdCIsIi4vcnN2cC9maWx0ZXIiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVw
ZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5j
eTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2X18sIF9fZGVwZW5kZW5jeTdfXywg
X19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9fZGVwZW5kZW5jeTEwX18sIF9fZGVw
ZW5kZW5jeTExX18sIF9fZGVwZW5kZW5jeTEyX18sIF9fZGVwZW5kZW5jeTEzX18sIF9fZGVwZW5k
ZW5jeTE0X18sIF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9t
aXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0g
X19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGRlbm9kZWlmeSA9IF9fZGVwZW5k
ZW5jeTNfX1siZGVmYXVsdCJdOwotICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3k0X19bImRlZmF1
bHQiXTsKLSAgICB2YXIgYWxsU2V0dGxlZCA9IF9fZGVwZW5kZW5jeTVfX1siZGVmYXVsdCJdOwot
ICAgIHZhciByYWNlID0gX19kZXBlbmRlbmN5Nl9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGhhc2gg
PSBfX2RlcGVuZGVuY3k3X19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmV0aHJvdyA9IF9fZGVwZW5k
ZW5jeThfX1siZGVmYXVsdCJdOwotICAgIHZhciBkZWZlciA9IF9fZGVwZW5kZW5jeTlfX1siZGVm
YXVsdCJdOwotICAgIHZhciBjb25maWcgPSBfX2RlcGVuZGVuY3kxMF9fLmNvbmZpZzsKLSAgICB2
YXIgY29uZmlndXJlID0gX19kZXBlbmRlbmN5MTBfXy5jb25maWd1cmU7Ci0gICAgdmFyIG1hcCA9
IF9fZGVwZW5kZW5jeTExX19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmVzb2x2ZSA9IF9fZGVwZW5k
ZW5jeTEyX19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmVqZWN0ID0gX19kZXBlbmRlbmN5MTNfX1si
ZGVmYXVsdCJdOwotICAgIHZhciBmaWx0ZXIgPSBfX2RlcGVuZGVuY3kxNF9fWyJkZWZhdWx0Il07
Ci0KLSAgICBmdW5jdGlvbiBhc3luYyhjYWxsYmFjaywgYXJnKSB7Ci0gICAgICBjb25maWcuYXN5
bmMoY2FsbGJhY2ssIGFyZyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gb24oKSB7Ci0gICAgICBj
b25maWcub24uYXBwbHkoY29uZmlnLCBhcmd1bWVudHMpOwotICAgIH0KLQotICAgIGZ1bmN0aW9u
IG9mZigpIHsKLSAgICAgIGNvbmZpZy5vZmYuYXBwbHkoY29uZmlnLCBhcmd1bWVudHMpOwotICAg
IH0KLQotICAgIC8vIFNldCB1cCBpbnN0cnVtZW50YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJP
TUlTRV9JTlRSVU1FTlRBVElPTl9fYAotICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZp
bmVkJyAmJiB0eXBlb2Ygd2luZG93Ll9fUFJPTUlTRV9JTlNUUlVNRU5UQVRJT05fXyA9PT0gJ29i
amVjdCcpIHsKLSAgICAgIHZhciBjYWxsYmFja3MgPSB3aW5kb3cuX19QUk9NSVNFX0lOU1RSVU1F
TlRBVElPTl9fOwotICAgICAgY29uZmlndXJlKCdpbnN0cnVtZW50JywgdHJ1ZSk7Ci0gICAgICBm
b3IgKHZhciBldmVudE5hbWUgaW4gY2FsbGJhY2tzKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3Mu
aGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkgewotICAgICAgICAgIG9uKGV2ZW50TmFtZSwgY2Fs
bGJhY2tzW2V2ZW50TmFtZV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX19l
eHBvcnRzX18uUHJvbWlzZSA9IFByb21pc2U7Ci0gICAgX19leHBvcnRzX18uRXZlbnRUYXJnZXQg
PSBFdmVudFRhcmdldDsKLSAgICBfX2V4cG9ydHNfXy5hbGwgPSBhbGw7Ci0gICAgX19leHBvcnRz
X18uYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7Ci0gICAgX19leHBvcnRzX18ucmFjZSA9IHJhY2U7
Ci0gICAgX19leHBvcnRzX18uaGFzaCA9IGhhc2g7Ci0gICAgX19leHBvcnRzX18ucmV0aHJvdyA9
IHJldGhyb3c7Ci0gICAgX19leHBvcnRzX18uZGVmZXIgPSBkZWZlcjsKLSAgICBfX2V4cG9ydHNf
Xy5kZW5vZGVpZnkgPSBkZW5vZGVpZnk7Ci0gICAgX19leHBvcnRzX18uY29uZmlndXJlID0gY29u
ZmlndXJlOwotICAgIF9fZXhwb3J0c19fLm9uID0gb247Ci0gICAgX19leHBvcnRzX18ub2ZmID0g
b2ZmOwotICAgIF9fZXhwb3J0c19fLnJlc29sdmUgPSByZXNvbHZlOwotICAgIF9fZXhwb3J0c19f
LnJlamVjdCA9IHJlamVjdDsKLSAgICBfX2V4cG9ydHNfXy5hc3luYyA9IGFzeW5jOwotICAgIF9f
ZXhwb3J0c19fLm1hcCA9IG1hcDsKLSAgICBfX2V4cG9ydHNfXy5maWx0ZXIgPSBmaWx0ZXI7Ci0g
IH0pOwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLVB1YmxpYyBhcGkgZm9yIHRoZSBj
b250YWluZXIgaXMgc3RpbGwgaW4gZmx1eC4KLVRoZSBwdWJsaWMgYXBpLCBzcGVjaWZpZWQgb24g
dGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgc3RhYmxl
IGFwaS4KLS8vIEBtb2R1bGUgY29udGFpbmVyCi0gIEBwcml2YXRlCi0qLwotCi0vKgotIEZsYWcg
dG8gZW5hYmxlL2Rpc2FibGUgbW9kZWwgZmFjdG9yeSBpbmplY3Rpb25zIChkaXNhYmxlZCBieSBk
ZWZhdWx0KQotIElmIG1vZGVsIGZhY3RvcnkgaW5qZWN0aW9ucyBhcmUgZW5hYmxlZCwgbW9kZWxz
IHNob3VsZCBub3QgYmUKLSBhY2Nlc3NlZCBnbG9iYWxseSAob25seSB0aHJvdWdoIGBjb250YWlu
ZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6bW9kZWxOYW1lJykpYCk7Ci0qLwotRW1iZXIuTU9ERUxf
RkFDVE9SWV9JTkpFQ1RJT05TID0gZmFsc2UgfHwgISFFbWJlci5FTlYuTU9ERUxfRkFDVE9SWV9J
TkpFQ1RJT05TOwotCi1kZWZpbmUoImNvbnRhaW5lciIsCi0gIFtdLAotICBmdW5jdGlvbigpIHsK
LQotICAgIC8vIEEgc2FmZSBhbmQgc2ltcGxlIGluaGVyaXRpbmcgb2JqZWN0LgotICAgIGZ1bmN0
aW9uIEluaGVyaXRpbmdEaWN0KHBhcmVudCkgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7
Ci0gICAgICB0aGlzLmRpY3QgPSB7fTsKLSAgICB9Ci0KLSAgICBJbmhlcml0aW5nRGljdC5wcm90
b3R5cGUgPSB7Ci0KLSAgICAgIC8qKgotICAgICAgICBAcHJvcGVydHkgcGFyZW50Ci0gICAgICAg
IEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAgICovCi0K
LSAgICAgIHBhcmVudDogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIE9iamVjdCB1c2VkIHRv
IHN0b3JlIHRoZSBjdXJyZW50IG5vZGVzIGRhdGEuCi0KLSAgICAgICAgQHByb3BlcnR5IGRpY3QK
LSAgICAgICAgQHR5cGUgT2JqZWN0Ci0gICAgICAgIEBkZWZhdWx0IE9iamVjdAotICAgICAgKi8K
LSAgICAgIGRpY3Q6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICBSZXRyaWV2ZSB0aGUgdmFs
dWUgZ2l2ZW4gYSBrZXksIGlmIHRoZSB2YWx1ZSBpcyBwcmVzZW50IGF0IHRoZSBjdXJyZW50Ci0g
ICAgICAgIGxldmVsIHVzZSBpdCwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJj
aHkgYW5kIHRyeSBhZ2Fpbi4gSWYKLSAgICAgICAgbm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5kLCBy
ZXR1cm4gdW5kZWZpbmVkLgotCi0gICAgICAgIEBtZXRob2QgZ2V0Ci0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBrZXkKLSAgICAgICAgQHJldHVybiB7YW55fQotICAgICAgKi8KLSAgICAgIGdldDog
ZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhpcy5kaWN0OwotCi0gICAgICAg
IGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAgICAgICByZXR1cm4gZGljdFtr
ZXldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7Ci0gICAgICAgICAg
cmV0dXJuIHRoaXMucGFyZW50LmdldChrZXkpOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAg
ICAvKioKLSAgICAgICAgU2V0IHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgYXQg
dGhlIGN1cnJlbnQgbGV2ZWwuCi0KLSAgICAgICAgQG1ldGhvZCBzZXQKLSAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IGtleQotICAgICAgICBAcGFyYW0ge0FueX0gdmFsdWUKLSAgICAgICovCi0gICAg
ICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5kaWN0W2tleV0gPSB2
YWx1ZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBEZWxldGUgdGhlIGdpdmVuIGtl
eQotCi0gICAgICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkK
LSAgICAgICovCi0gICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewotICAgICAgICBkZWxldGUg
dGhpcy5kaWN0W2tleV07Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQ2hlY2sgZm9y
IHRoZSBleGlzdGVuY2Ugb2YgZ2l2ZW4gYSBrZXksIGlmIHRoZSBrZXkgaXMgcHJlc2VudCBhdCB0
aGUgY3VycmVudAotICAgICAgICBsZXZlbCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHdhbGsgdXAg
dGhlIHBhcmVudCBoaWVyYXJjaHkgYW5kIHRyeSBhZ2Fpbi4gSWYKLSAgICAgICAgbm8gbWF0Y2hp
bmcga2V5IGlzIGZvdW5kLCByZXR1cm4gZmFsc2UuCi0KLSAgICAgICAgQG1ldGhvZCBoYXMKLSAg
ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgICAgICBAcmV0dXJuIHtCb29sZWFufQotICAg
ICAgKi8KLSAgICAgIGhhczogZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhp
cy5kaWN0OwotCi0gICAgICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLnBhcmVudCkg
ewotICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5oYXMoa2V5KTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBJdGVy
YXRlIGFuZCBpbnZva2UgYSBjYWxsYmFjayBmb3IgZWFjaCBsb2NhbCBrZXktdmFsdWUgcGFpci4K
LQotICAgICAgICBAbWV0aG9kIGVhY2hMb2NhbAotICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBj
YWxsYmFjawotICAgICAgICBAcGFyYW0ge09iamVjdH0gYmluZGluZwotICAgICAgKi8KLSAgICAg
IGVhY2hMb2NhbDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICAgICAgdmFyIGRp
Y3QgPSB0aGlzLmRpY3Q7Ci0KLSAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBkaWN0KSB7Ci0gICAg
ICAgICAgaWYgKGRpY3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICAgIGNhbGxi
YWNrLmNhbGwoYmluZGluZywgcHJvcCwgZGljdFtwcm9wXSk7Ci0gICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfTsKLQotCi0gICAgLy8gQSBsaWdodHdlaWdodCBjb250YWluZXIg
dGhhdCBoZWxwcyB0byBhc3NlbWJsZSBhbmQgZGVjb3VwbGUgY29tcG9uZW50cy4KLSAgICAvLyBQ
dWJsaWMgYXBpIGZvciB0aGUgY29udGFpbmVyIGlzIHN0aWxsIGluIGZsdXguCi0gICAgLy8gVGhl
IHB1YmxpYyBhcGksIHNwZWNpZmllZCBvbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHNob3Vs
ZCBiZSBjb25zaWRlcmVkIHRoZSBzdGFibGUgYXBpLgotICAgIGZ1bmN0aW9uIENvbnRhaW5lcihw
YXJlbnQpIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jaGlsZHJl
biA9IFtdOwotCi0gICAgICB0aGlzLnJlc29sdmVyID0gcGFyZW50ICYmIHBhcmVudC5yZXNvbHZl
ciB8fCBmdW5jdGlvbigpIHt9OwotCi0gICAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IEluaGVyaXRp
bmdEaWN0KHBhcmVudCAmJiBwYXJlbnQucmVnaXN0cnkpOwotICAgICAgdGhpcy5jYWNoZSA9IG5l
dyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LmNhY2hlKTsKLSAgICAgIHRoaXMuZmFj
dG9yeUNhY2hlID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQuY2FjaGUpOwot
ICAgICAgdGhpcy50eXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYg
cGFyZW50LnR5cGVJbmplY3Rpb25zKTsKLSAgICAgIHRoaXMuaW5qZWN0aW9ucyA9IHt9OwotCi0g
ICAgICB0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJl
bnQgJiYgcGFyZW50LmZhY3RvcnlUeXBlSW5qZWN0aW9ucyk7Ci0gICAgICB0aGlzLmZhY3RvcnlJ
bmplY3Rpb25zID0ge307Ci0KLSAgICAgIHRoaXMuX29wdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0Rp
Y3QocGFyZW50ICYmIHBhcmVudC5fb3B0aW9ucyk7Ci0gICAgICB0aGlzLl90eXBlT3B0aW9ucyA9
IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50Ll90eXBlT3B0aW9ucyk7Ci0gICAg
fQotCi0gICAgQ29udGFpbmVyLnByb3RvdHlwZSA9IHsKLQotICAgICAgLyoqCi0gICAgICAgIEBw
cm9wZXJ0eSBwYXJlbnQKLSAgICAgICAgQHR5cGUgQ29udGFpbmVyCi0gICAgICAgIEBkZWZhdWx0
IG51bGwKLSAgICAgICovCi0gICAgICBwYXJlbnQ6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAg
ICBAcHJvcGVydHkgY2hpbGRyZW4KLSAgICAgICAgQHR5cGUgQXJyYXkKLSAgICAgICAgQGRlZmF1
bHQgW10KLSAgICAgICovCi0gICAgICBjaGlsZHJlbjogbnVsbCwKLQotICAgICAgLyoqCi0gICAg
ICAgIEBwcm9wZXJ0eSByZXNvbHZlcgotICAgICAgICBAdHlwZSBmdW5jdGlvbgotICAgICAgKi8K
LSAgICAgIHJlc29sdmVyOiBudWxsLAotCi0gICAgICAvKioKLSAgICAgICAgQHByb3BlcnR5IHJl
Z2lzdHJ5Ci0gICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAqLwotICAgICAgcmVn
aXN0cnk6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICBAcHJvcGVydHkgY2FjaGUKLSAgICAg
ICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKLSAgICAgICovCi0gICAgICBjYWNoZTogbnVsbCwKLQot
ICAgICAgLyoqCi0gICAgICAgIEBwcm9wZXJ0eSB0eXBlSW5qZWN0aW9ucwotICAgICAgICBAdHlw
ZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8KLSAgICAgIHR5cGVJbmplY3Rpb25zOiBudWxsLAot
Ci0gICAgICAvKioKLSAgICAgICAgQHByb3BlcnR5IGluamVjdGlvbnMKLSAgICAgICAgQHR5cGUg
T2JqZWN0Ci0gICAgICAgIEBkZWZhdWx0IHt9Ci0gICAgICAqLwotICAgICAgaW5qZWN0aW9uczog
bnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBwcml2YXRlCi0KLSAgICAgICAgQHByb3BlcnR5
IF9vcHRpb25zCi0gICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAgIEBkZWZhdWx0
IG51bGwKLSAgICAgICovCi0gICAgICBfb3B0aW9uczogbnVsbCwKLQotICAgICAgLyoqCi0gICAg
ICAgIEBwcml2YXRlCi0KLSAgICAgICAgQHByb3BlcnR5IF90eXBlT3B0aW9ucwotICAgICAgICBA
dHlwZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8KLSAgICAgIF90eXBlT3B0aW9uczogbnVsbCwK
LQotICAgICAgLyoqCi0gICAgICAgIFJldHVybnMgYSBuZXcgY2hpbGQgb2YgdGhlIGN1cnJlbnQg
Y29udGFpbmVyLiBUaGVzZSBjaGlsZHJlbiBhcmUgY29uZmlndXJlZAotICAgICAgICB0byBjb3Jy
ZWN0bHkgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50IGNvbnRhaW5lci4KLQotICAgICAgICBAbWV0
aG9kIGNoaWxkCi0gICAgICAgIEByZXR1cm4ge0NvbnRhaW5lcn0KLSAgICAgICovCi0gICAgICBj
aGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVy
KHRoaXMpOwotICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY29udGFpbmVyKTsKLSAgICAgICAg
cmV0dXJuIGNvbnRhaW5lcjsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBTZXRzIGEg
a2V5LXZhbHVlIHBhaXIgb24gdGhlIGN1cnJlbnQgY29udGFpbmVyLiBJZiBhIHBhcmVudCBjb250
YWluZXIsCi0gICAgICAgIGhhcyB0aGUgc2FtZSBrZXksIG9uY2Ugc2V0IG9uIGEgY2hpbGQsIHRo
ZSBwYXJlbnQgYW5kIGNoaWxkIHdpbGwgZGl2ZXJnZQotICAgICAgICBhcyBleHBlY3RlZC4KLQot
ICAgICAgICBAbWV0aG9kIHNldAotICAgICAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0Ci0gICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgICAgICAgQHBhcmFtIHthbnl9IHZhbHVlCi0gICAg
ICAqLwotICAgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKLSAgICAgICAg
b2JqZWN0W2tleV0gPSB2YWx1ZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBSZWdp
c3RlcnMgYSBmYWN0b3J5IGZvciBsYXRlciBpbmplY3Rpb24uCi0KLSAgICAgICAgRXhhbXBsZToK
LQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29u
dGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgUGVy
c29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdm
cnVpdDpmYXZvcml0ZScsIE9yYW5nZSk7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29t
bXVuaWNhdGlvbjptYWluJywgRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7Ci0gICAgICAgIGBg
YAotCi0gICAgICAgIEBtZXRob2QgcmVnaXN0ZXIKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1
bGxOYW1lCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkKLSAgICAgICAgQHBhcmFt
IHtPYmplY3R9IG9wdGlvbnMKLSAgICAgICovCi0gICAgICByZWdpc3RlcjogZnVuY3Rpb24oZnVs
bE5hbWUsIGZhY3RvcnksIG9wdGlvbnMpIHsKLSAgICAgICAgaWYgKGZ1bGxOYW1lLmluZGV4T2Yo
JzonKSA9PT0gLTEpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtYWxmb3JtZWQg
ZnVsbE5hbWUsIGV4cGVjdGVkOiBgdHlwZTpuYW1lYCBnb3Q6ICIgKyBmdWxsTmFtZSArICIiKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKLSAgICAg
ICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGFuIHVua25v
d24gZmFjdG9yeTogYCcgKyBmdWxsTmFtZSArICdgJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2
YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7Ci0KLSAgICAgICAg
aWYgKHRoaXMuY2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkgewotICAgICAgICAgIHRocm93IG5l
dyBFcnJvcignQ2Fubm90IHJlLXJlZ2lzdGVyOiBgJyArIGZ1bGxOYW1lICsnYCwgYXMgaXQgaGFz
IGFscmVhZHkgYmVlbiBsb29rZWQgdXAuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJl
Z2lzdHJ5LnNldChub3JtYWxpemVkTmFtZSwgZmFjdG9yeSk7Ci0gICAgICAgIHRoaXMuX29wdGlv
bnMuc2V0KG5vcm1hbGl6ZWROYW1lLCBvcHRpb25zIHx8IHt9KTsKLSAgICAgIH0sCi0KLSAgICAg
IC8qKgotICAgICAgICBVbnJlZ2lzdGVyIGEgZnVsbE5hbWUKLQotICAgICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7Ci0gICAgICAgIGNv
bnRhaW5lci5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOwotCi0gICAgICAgIGNvbnRhaW5l
ci5sb29rdXAoJ21vZGVsOnVzZXInKSBpbnN0YW5jZW9mIFVzZXIgLy89PiB0cnVlCi0KLSAgICAg
ICAgY29udGFpbmVyLnVucmVnaXN0ZXIoJ21vZGVsOnVzZXInKQotICAgICAgICBjb250YWluZXIu
bG9va3VwKCdtb2RlbDp1c2VyJykgPT09IHVuZGVmaW5lZCAvLz0+IHRydWUKLSAgICAgICAgYGBg
Ci0KLSAgICAgICAgQG1ldGhvZCB1bnJlZ2lzdGVyCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBm
dWxsTmFtZQotICAgICAgICovCi0gICAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihmdWxsTmFtZSkg
ewotICAgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7
Ci0KLSAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1vdmUobm9ybWFsaXplZE5hbWUpOwotICAgICAg
ICB0aGlzLmNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7Ci0gICAgICAgIHRoaXMuZmFjdG9y
eUNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7Ci0gICAgICAgIHRoaXMuX29wdGlvbnMucmVt
b3ZlKG5vcm1hbGl6ZWROYW1lKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBHaXZl
biBhIGZ1bGxOYW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgotCi0gICAgICAg
IEJ5IGRlZmF1bHQgYHJlc29sdmVgIHdpbGwgcmV0cmlldmUgdGhlIGZhY3RvcnkgZnJvbQotICAg
ICAgICBpdHMgY29udGFpbmVyJ3MgcmVnaXN0cnkuCi0KLSAgICAgICAgYGBgamF2YXNjcmlwdAot
ICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdpdHRlcik7Ci0KLSAgICAgICAgY29udGFpbmVy
LnJlc29sdmUoJ2FwaTp0d2l0dGVyJykgLy8gPT4gVHdpdHRlcgotICAgICAgICBgYGAKLQotICAg
ICAgICBPcHRpb25hbGx5IHRoZSBjb250YWluZXIgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBjdXN0
b20gcmVzb2x2ZXIuCi0gICAgICAgIElmIHByb3ZpZGVkLCBgcmVzb2x2ZWAgd2lsbCBmaXJzdCBw
cm92aWRlIHRoZSBjdXN0b20gcmVzb2x2ZXIKLSAgICAgICAgdGhlIG9wcGVydHVuaXR5IHRvIHJl
c29sdmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjawotICAgICAgICB0
byB0aGUgcmVnaXN0cnkuCi0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29u
dGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAgICAgICBjb250YWluZXIucmVzb2x2ZXIgPSBm
dW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBz
eXN0ZW0gb2YgY2hvaWNlCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gdGhlIHR3aXR0ZXIgZmFj
dG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxlIHN5c3RlbQotICAgICAgICBjb250YWluZXIucmVz
b2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0dGVyCi0gICAgICAgIGBgYAotCi0gICAgICAg
IEBtZXRob2QgcmVzb2x2ZQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKLSAgICAg
ICAgQHJldHVybiB7RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9yeQotICAgICAgKi8KLSAgICAg
IHJlc29sdmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc29s
dmVyKGZ1bGxOYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChmdWxsTmFtZSk7Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgQSBob29rIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUg
aG93IHRoZSByZXNvbHZlciB3aWxsCi0gICAgICAgIGF0dGVtcHQgdG8gZmluZCB0aGUgZmFjdG9y
eS4KLQotICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgRW1iZXIgYC5kZXNjcmliZWAg
cmV0dXJucyB0aGUgZnVsbAotICAgICAgICBjbGFzcyBuYW1lIChpbmNsdWRpbmcgbmFtZXNwYWNl
KSB3aGVyZSBFbWJlcidzIHJlc29sdmVyIGV4cGVjdHMKLSAgICAgICAgdG8gZmluZCB0aGUgYGZ1
bGxOYW1lYC4KLQotICAgICAgICBAbWV0aG9kIGRlc2NyaWJlCi0gICAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBmdWxsTmFtZQotICAgICAgICBAcmV0dXJuIHtzdHJpbmd9IGRlc2NyaWJlZCBmdWxsTmFt
ZQotICAgICAgKi8KLSAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAg
ICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQSBob29r
IHRvIGVuYWJsZSBjdXN0b20gZnVsbE5hbWUgbm9ybWFsaXphdGlvbiBiZWhhdmlvdXIKLQotICAg
ICAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUK
LSAgICAgICAgQHJldHVybiB7c3RyaW5nfSBub3JtYWxpemVkIGZ1bGxOYW1lCi0gICAgICAqLwot
ICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICByZXR1cm4gZnVs
bE5hbWU7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQG1ldGhvZCBtYWtlVG9TdHJp
bmcKLQotICAgICAgICBAcGFyYW0ge2FueX0gZmFjdG9yeQotICAgICAgICBAcGFyYW0ge3N0cmlu
Z30gZnVsbE5hbWUKLSAgICAgICAgQHJldHVybiB7ZnVuY3Rpb259IHRvU3RyaW5nIGZ1bmN0aW9u
Ci0gICAgICAqLwotICAgICAgbWFrZVRvU3RyaW5nOiBmdW5jdGlvbihmYWN0b3J5LCBmdWxsTmFt
ZSkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS50b1N0cmluZygpOwotICAgICAgfSwKLQotICAg
ICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBp
bnN0YW5jZS4KLQotICAgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgZm9yIGxvb2t1cCB0
byByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICAgIFRoZSBzaW5nbGV0b24gaXMg
c2NvcGVkIHRvIHRoZSBjb250YWluZXIsIGFsbG93aW5nIG11bHRpcGxlIGNvbnRhaW5lcnMKLSAg
ICAgICAgdG8gYWxsIGhhdmUgdGhlaXIgb3duIGxvY2FsbHkgc2NvcGVkIHNpbmdsZXRvbnMuCi0K
LSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRh
aW5lcigpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdpdHRl
cik7Ci0KLSAgICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicpOwotCi0gICAgICAgIHR3aXR0ZXIgaW5zdGFuY2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCi0K
LSAgICAgICAgLy8gYnkgZGVmYXVsdCB0aGUgY29udGFpbmVyIHdpbGwgcmV0dXJuIHNpbmdsZXRv
bnMKLSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXIn
KTsKLSAgICAgICAgdHdpdHRlciBpbnN0YW5jZW9mIFR3aXR0ZXI7IC8vID0+IHRydWUKLQotICAg
ICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsgLy89PiB0cnVlCi0gICAgICAgIGBgYAotCi0gICAg
ICAgIElmIHNpbmdsZXRvbnMgYXJlIG5vdCB3YW50ZWQgYW4gb3B0aW9uYWwgZmxhZyBjYW4gYmUg
cHJvdmlkZWQgYXQgbG9va3VwLgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFy
IGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVy
KCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwotCi0gICAgICAgIHZhciB0d2l0dGVyID0gY29udGFp
bmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0gICAgICAg
IHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJywgeyBzaW5nbGV0
b246IGZhbHNlIH0pOwotCi0gICAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IGZhbHNl
Ci0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2QgbG9va3VwCi0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgICAg
ICBAcmV0dXJuIHthbnl9Ci0gICAgICAqLwotICAgICAgbG9va3VwOiBmdW5jdGlvbihmdWxsTmFt
ZSwgb3B0aW9ucykgewotICAgICAgICBmdWxsTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1l
KTsKLQotICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgICAgICBpZiAodGhp
cy5jYWNoZS5oYXMoZnVsbE5hbWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBmYWxzZSkgewot
ICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChmdWxsTmFtZSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICB2YXIgdmFsdWUgPSBpbnN0YW50aWF0ZSh0aGlzLCBmdWxsTmFtZSk7Ci0KLSAgICAg
ICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgaWYgKGlz
U2luZ2xldG9uKHRoaXMsIGZ1bGxOYW1lKSAmJiBvcHRpb25zLnNpbmdsZXRvbiAhPT0gZmFsc2Up
IHsKLSAgICAgICAgICB0aGlzLmNhY2hlLnNldChmdWxsTmFtZSwgdmFsdWUpOwotICAgICAgICB9
Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAg
IEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZhY3RvcnkuCi0KLSAg
ICAgICAgQG1ldGhvZCBsb29rdXBGYWN0b3J5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxs
TmFtZQotICAgICAgICBAcmV0dXJuIHthbnl9Ci0gICAgICAqLwotICAgICAgbG9va3VwRmFjdG9y
eTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGb3IodGhpcywg
ZnVsbE5hbWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5h
bWUgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBhd2FyZSBvZiBpdHMgZmFjdG9yeQotICAgICAg
ICBvciBzaW5nbGV0b24gaW5zdGFuY2UuCi0KLSAgICAgICAgQG1ldGhvZCBoYXMKLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCi0gICAgICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAg
ICAqLwotICAgICAgaGFzOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICBpZiAodGhpcy5j
YWNoZS5oYXMoZnVsbE5hbWUpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICByZXR1cm4gISF0aGlzLnJlc29sdmUoZnVsbE5hbWUpOwotICAgICAgfSwKLQot
ICAgICAgLyoqCi0gICAgICAgIEFsbG93IHJlZ2lzdGVyaW5nIG9wdGlvbnMgZm9yIGFsbCBmYWN0
b3JpZXMgb2YgYSB0eXBlLgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNv
bnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLQotICAgICAgICAvLyBpZiBhbGwgb2YgdHlwZSBg
Y29ubmVjdGlvbmAgbXVzdCBub3QgYmUgc2luZ2xldG9ucwotICAgICAgICBjb250YWluZXIub3B0
aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0KLSAgICAg
ICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb25uZWN0aW9uOnR3aXR0ZXInLCBUd2l0dGVyQ29ubmVj
dGlvbik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29ubmVjdGlvbjpmYWNlYm9vaycs
IEZhY2Vib29rQ29ubmVjdGlvbik7Ci0KLSAgICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIu
bG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsKLSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29u
dGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7Ci0KLSAgICAgICAgdHdpdHRlciA9
PT0gdHdpdHRlcjI7IC8vID0+IGZhbHNlCi0KLSAgICAgICAgdmFyIGZhY2Vib29rID0gY29udGFp
bmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOwotICAgICAgICB2YXIgZmFjZWJvb2sy
ID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOwotCi0gICAgICAgIGZh
Y2Vib29rID09PSBmYWNlYm9vazI7IC8vID0+IGZhbHNlCi0gICAgICAgIGBgYAotCi0gICAgICAg
IEBtZXRob2Qgb3B0aW9uc0ZvclR5cGUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAg
ICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKLSAgICAgICovCi0gICAgICBvcHRpb25zRm9y
VHlwZTogZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewotICAgICAgICBpZiAodGhpcy5wYXJlbnQp
IHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdvcHRpb25zRm9yVHlwZScpOyB9Ci0KLSAgICAgICAg
dGhpcy5fdHlwZU9wdGlvbnMuc2V0KHR5cGUsIG9wdGlvbnMpOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEBtZXRob2Qgb3B0aW9ucwotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlw
ZQotICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgICAgKi8KLSAgICAgIG9wdGlv
bnM6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zRm9yVHlw
ZSh0eXBlLCBvcHRpb25zKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBVc2VkIG9u
bHkgdmlhIGBpbmplY3Rpb25gLgotCi0gICAgICAgIFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgZm9y
bSBvZiBpbmplY3Rpb24sIHNwZWNpZmljYWxseSBlbmFibGluZwotICAgICAgICBhbGwgb2JqZWN0
cyBvZiBvbmUgdHlwZSB0byBiZSBpbmplY3RlZCB3aXRoIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIK
LSAgICAgICAgb2JqZWN0LgotCi0gICAgICAgIEZvciBleGFtcGxlLCBwcm92aWRlZCBlYWNoIG9i
amVjdCBvZiB0eXBlIGBjb250cm9sbGVyYCBuZWVkZWQgYSBgcm91dGVyYC4KLSAgICAgICAgb25l
IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAg
ICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotCi0gICAgICAgIGNvbnRhaW5lci5y
ZWdpc3Rlcigncm91dGVyOm1haW4nLCBSb3V0ZXIpOwotICAgICAgICBjb250YWluZXIucmVnaXN0
ZXIoJ2NvbnRyb2xsZXI6dXNlcicsIFVzZXJDb250cm9sbGVyKTsKLSAgICAgICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdjb250cm9sbGVyOnBvc3QnLCBQb3N0Q29udHJvbGxlcik7Ci0KLSAgICAgICAg
Y29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAncm91dGVyJywgJ3JvdXRlcjpt
YWluJyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBjb250YWluZXIubG9va3VwKCdjb250cm9sbGVy
OnVzZXInKTsKLSAgICAgICAgdmFyIHBvc3QgPSBjb250YWluZXIubG9va3VwKCdjb250cm9sbGVy
OnBvc3QnKTsKLQotICAgICAgICB1c2VyLnJvdXRlciBpbnN0YW5jZW9mIFJvdXRlcjsgLy89PiB0
cnVlCi0gICAgICAgIHBvc3Qucm91dGVyIGluc3RhbmNlb2YgUm91dGVyOyAvLz0+IHRydWUKLQot
ICAgICAgICAvLyBib3RoIGNvbnRyb2xsZXJzIHNoYXJlIHRoZSBzYW1lIHJvdXRlcgotICAgICAg
ICB1c2VyLnJvdXRlciA9PT0gcG9zdC5yb3V0ZXI7IC8vPT4gdHJ1ZQotICAgICAgICBgYGAKLQot
ICAgICAgICBAcHJpdmF0ZQotICAgICAgICBAbWV0aG9kIHR5cGVJbmplY3Rpb24KLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0g
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgKi8KLSAgICAgIHR5cGVJbmpl
Y3Rpb246IGZ1bmN0aW9uKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewotICAgICAgICBpZiAo
dGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCd0eXBlSW5qZWN0aW9uJyk7IH0K
LQotICAgICAgICBhZGRUeXBlSW5qZWN0aW9uKHRoaXMudHlwZUluamVjdGlvbnMsIHR5cGUsIHBy
b3BlcnR5LCBmdWxsTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgRGVmaW5l
cyBpbmplY3Rpb24gcnVsZXMuCi0KLSAgICAgICAgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gaW5q
ZWN0IGRlcGVuZGVuY2llcyBvbnRvIG9iamVjdHMgd2hlbiB0aGV5Ci0gICAgICAgIGFyZSBpbnN0
YW50aWF0ZWQuCi0KLSAgICAgICAgVHdvIGZvcm1zIG9mIGluamVjdGlvbnMgYXJlIHBvc3NpYmxl
OgotCi0gICAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1l
Ci0gICAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhIHR5cGUKLQotICAgICAgICBF
eGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9
IG5ldyBDb250YWluZXIoKTsKLQotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3NvdXJjZTpt
YWluJywgU291cmNlKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywg
VXNlcik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOwot
Ci0gICAgICAgIC8vIGluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQot
ICAgICAgICAvLyBlZy4gZWFjaCB1c2VyIG1vZGVsIGdldHMgYSBwb3N0IG1vZGVsCi0gICAgICAg
IGNvbnRhaW5lci5pbmplY3Rpb24oJ21vZGVsOnVzZXInLCAncG9zdCcsICdtb2RlbDpwb3N0Jyk7
Ci0KLSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKLSAg
ICAgICAgY29udGFpbmVyLmluamVjdGlvbignbW9kZWwnLCAnc291cmNlJywgJ3NvdXJjZTptYWlu
Jyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBjb250YWluZXIubG9va3VwKCdtb2RlbDp1c2VyJyk7
Ci0gICAgICAgIHZhciBwb3N0ID0gY29udGFpbmVyLmxvb2t1cCgnbW9kZWw6cG9zdCcpOwotCi0g
ICAgICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2YgU291cmNlOyAvLz0+IHRydWUKLSAgICAgICAg
cG9zdC5zb3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQotCi0gICAgICAgIHVzZXIu
cG9zdCBpbnN0YW5jZW9mIFBvc3Q7IC8vPT4gdHJ1ZQotCi0gICAgICAgIC8vIGFuZCBib3RoIG1v
ZGVscyBzaGFyZSB0aGUgc2FtZSBzb3VyY2UKLSAgICAgICAgdXNlci5zb3VyY2UgPT09IHBvc3Qu
c291cmNlOyAvLz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCBpbmplY3Rp
b24KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZhY3RvcnlOYW1lCi0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBwcm9wZXJ0eQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gaW5qZWN0aW9uTmFtZQot
ICAgICAgKi8KLSAgICAgIGluamVjdGlvbjogZnVuY3Rpb24oZmFjdG9yeU5hbWUsIHByb3BlcnR5
LCBpbmplY3Rpb25OYW1lKSB7Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hp
bGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9Ci0KLSAgICAgICAgaWYgKGZhY3RvcnlOYW1lLmlu
ZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAgICByZXR1cm4gdGhpcy50eXBlSW5qZWN0aW9u
KGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBhZGRJbmplY3Rpb24odGhpcy5pbmplY3Rpb25zLCBmYWN0b3J5TmFtZSwgcHJvcGVydHks
IGluamVjdGlvbk5hbWUpOwotICAgICAgfSwKLQotCi0gICAgICAvKioKLSAgICAgICAgVXNlZCBv
bmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCi0KLSAgICAgICAgUHJvdmlkZXMgYSBzcGVjaWFs
aXplZCBmb3JtIG9mIGluamVjdGlvbiwgc3BlY2lmaWNhbGx5IGVuYWJsaW5nCi0gICAgICAgIGFs
bCBmYWN0b3J5IG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGggYSByZWZlcmVuY2UgdG8g
YW5vdGhlcgotICAgICAgICBvYmplY3QuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHByb3ZpZGVk
IGVhY2ggZmFjdG9yeSBvZiB0eXBlIGBtb2RlbGAgbmVlZGVkIGEgYHN0b3JlYC4KLSAgICAgICAg
b25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAg
ICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotCi0gICAgICAgIGNvbnRhaW5l
ci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFNvbWVTdG9yZSk7Ci0KLSAgICAgICAgY29udGFpbmVy
LmZhY3RvcnlUeXBlSW5qZWN0aW9uKCdtb2RlbCcsICdzdG9yZScsICdzdG9yZTptYWluJyk7Ci0K
LSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwotICAg
ICAgICB2YXIgVXNlckZhY3RvcnkgPSBjb250YWluZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6dXNl
cicpOwotCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU29tZVN0b3JlOyAv
Lz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQHByaXZhdGUKLSAgICAgICAgQG1ldGhv
ZCBmYWN0b3J5VHlwZUluamVjdGlvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQotICAg
ICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1
bGxOYW1lCi0gICAgICAqLwotICAgICAgZmFjdG9yeVR5cGVJbmplY3Rpb246IGZ1bmN0aW9uKHR5
cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewotICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxs
ZWdhbENoaWxkT3BlcmF0aW9uKCdmYWN0b3J5VHlwZUluamVjdGlvbicpOyB9Ci0KLSAgICAgICAg
YWRkVHlwZUluamVjdGlvbih0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9ucywgdHlwZSwgcHJvcGVy
dHksIGZ1bGxOYW1lKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBEZWZpbmVzIGZh
Y3RvcnkgaW5qZWN0aW9uIHJ1bGVzLgotCi0gICAgICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmpl
Y3Rpb24gcnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWluc3QgZmFjdG9yaWVzLCB2aWEKLSAgICAgICAg
YENvbnRhaW5lciNsb29rdXBGYWN0b3J5YC4KLQotICAgICAgICBUaGVzZSBydWxlcyBhcmUgdXNl
ZCB0byBpbmplY3Qgb2JqZWN0cyBvbnRvIGZhY3RvcmllcyB3aGVuIHRoZXkKLSAgICAgICAgYXJl
IGxvb2tlZCB1cC4KLQotICAgICAgICBUd28gZm9ybXMgb2YgaW5qZWN0aW9ucyBhcmUgcG9zc2li
bGU6Ci0KLSAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1l
Ci0gICAgICAqIEluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYSB0eXBlCi0KLSAgICAgICAgRXhh
bXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBu
ZXcgQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdzdG9yZTptYWlu
JywgU3RvcmUpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3JlOnNlY29uZGFyeScs
IE90aGVyU3RvcmUpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBV
c2VyKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDpwb3N0JywgUG9zdCk7Ci0K
LSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKLSAgICAg
ICAgY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb24oJ21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1h
aW4nKTsKLQotICAgICAgICAvLyBpbmplY3Rpbmcgb25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVs
bE5hbWUKLSAgICAgICAgY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb24oJ21vZGVsOnBvc3QnLCAn
c2Vjb25kYXJ5U3RvcmUnLCAnc3RvcmU6c2Vjb25kYXJ5Jyk7Ci0KLSAgICAgICAgdmFyIFVzZXJG
YWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOnVzZXInKTsKLSAgICAgICAg
dmFyIFBvc3RGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOnBvc3QnKTsK
LSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwotCi0g
ICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU3RvcmU7IC8vPT4gdHJ1ZQotICAg
ICAgICBVc2VyRmFjdG9yeS5zZWNvbmRhcnlTdG9yZSBpbnN0YW5jZW9mIE90aGVyU3RvcmU7IC8v
PT4gZmFsc2UKLQotICAgICAgICBQb3N0RmFjdG9yeS5zdG9yZSBpbnN0YW5jZW9mIFN0b3JlOyAv
Lz0+IHRydWUKLSAgICAgICAgUG9zdEZhY3Rvcnkuc2Vjb25kYXJ5U3RvcmUgaW5zdGFuY2VvZiBP
dGhlclN0b3JlOyAvLz0+IHRydWUKLQotICAgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUg
dGhlIHNhbWUgc291cmNlIGluc3RhbmNlCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQ
b3N0RmFjdG9yeS5zdG9yZTsgLy89PiB0cnVlCi0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRo
b2QgZmFjdG9yeUluamVjdGlvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZmFjdG9yeU5hbWUK
LSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5n
fSBpbmplY3Rpb25OYW1lCi0gICAgICAqLwotICAgICAgZmFjdG9yeUluamVjdGlvbjogZnVuY3Rp
b24oZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7Ci0gICAgICAgIGlmICh0
aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9Ci0KLSAg
ICAgICAgaWYgKGZhY3RvcnlOYW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAgICBy
ZXR1cm4gdGhpcy5mYWN0b3J5VHlwZUluamVjdGlvbihmYWN0b3J5TmFtZSwgcHJvcGVydHksIGlu
amVjdGlvbk5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkSW5qZWN0aW9uKHRoaXMuZmFj
dG9yeUluamVjdGlvbnMsIGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSk7Ci0g
ICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGRl
c3Ryb3lpbmcgdGhlIGNvbnRhaW5lciwgaXRzIGRlc2NlbmRhbnQgY29udGFpbmVycyBhbmQgYWxs
Ci0gICAgICAgIHRoZWlyIG1hbmFnZWQgb2JqZWN0cy4KLQotICAgICAgICBAbWV0aG9kIGRlc3Ry
b3kKLSAgICAgICovCi0gICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLQotICAgICAgICBmb3Ig
KHZhciBpPTAsIGw9dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAg
dGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNo
aWxkcmVuID0gW107Ci0KLSAgICAgICAgZWFjaERlc3Ryb3lhYmxlKHRoaXMsIGZ1bmN0aW9uKGl0
ZW0pIHsKLSAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAg
dGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7Ci0gICAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVl
OwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEBtZXRob2QgcmVzZXQKLSAgICAgICov
Ci0gICAgICByZXNldDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlz
LmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICByZXNldENhY2hlKHRoaXMu
Y2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgICAgIHJlc2V0Q2FjaGUodGhpcyk7Ci0gICAg
ICB9Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGlsbGVnYWxDaGlsZE9wZXJhdGlvbihvcGVyYXRp
b24pIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcihvcGVyYXRpb24gKyAiIGlzIG5vdCBjdXJyZW50
bHkgc3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5lcnMiKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlv
biBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxOYW1lKSB7Ci0gICAgICB2YXIgc2luZ2xldG9u
ID0gb3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdzaW5nbGV0b24nKTsKLQotICAgICAgcmV0
dXJuIHNpbmdsZXRvbiAhPT0gZmFsc2U7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYnVpbGRJbmpl
Y3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucykgewotICAgICAgdmFyIGhhc2ggPSB7fTsKLQot
ICAgICAgaWYgKCFpbmplY3Rpb25zKSB7IHJldHVybiBoYXNoOyB9Ci0KLSAgICAgIHZhciBpbmpl
Y3Rpb24sIGxvb2t1cDsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPWluamVjdGlvbnMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgICAgICBpbmplY3Rpb24gPSBpbmplY3Rpb25zW2ldOwotICAgICAg
ICBsb29rdXAgPSBjb250YWluZXIubG9va3VwKGluamVjdGlvbi5mdWxsTmFtZSk7Ci0KLSAgICAg
ICAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgaGFzaFtpbmplY3Rpb24u
cHJvcGVydHldID0gbG9va3VwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5l
dyBFcnJvcignQXR0ZW1wdGluZyB0byBpbmplY3QgYW4gdW5rbm93biBpbmplY3Rpb246IGAnICsg
aW5qZWN0aW9uLmZ1bGxOYW1lICsgJ2AnKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBy
ZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBvcHRpb24oY29udGFpbmVyLCBmdWxs
TmFtZSwgb3B0aW9uTmFtZSkgewotICAgICAgdmFyIG9wdGlvbnMgPSBjb250YWluZXIuX29wdGlv
bnMuZ2V0KGZ1bGxOYW1lKTsKLQotICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRpb25O
YW1lXSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVd
OwotICAgICAgfQotCi0gICAgICB2YXIgdHlwZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IilbMF07Ci0g
ICAgICBvcHRpb25zID0gY29udGFpbmVyLl90eXBlT3B0aW9ucy5nZXQodHlwZSk7Ci0KLSAgICAg
IGlmIChvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdOwotICAg
ICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZhY3RvcnlGb3IoY29udGFpbmVyLCBmdWxsTmFt
ZSkgewotICAgICAgdmFyIG5hbWUgPSBjb250YWluZXIubm9ybWFsaXplKGZ1bGxOYW1lKTsKLSAg
ICAgIHZhciBmYWN0b3J5ID0gY29udGFpbmVyLnJlc29sdmUobmFtZSk7Ci0gICAgICB2YXIgaW5q
ZWN0ZWRGYWN0b3J5OwotICAgICAgdmFyIGNhY2hlID0gY29udGFpbmVyLmZhY3RvcnlDYWNoZTsK
LSAgICAgIHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoIjoiKVswXTsKLQotICAgICAgaWYgKGZh
Y3RvcnkgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47IH0KLQotICAgICAgaWYgKGNhY2hlLmhhcyhm
dWxsTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlLmdldChmdWxsTmFtZSk7Ci0gICAgICB9
Ci0KLSAgICAgIGlmICghZmFjdG9yeSB8fCB0eXBlb2YgZmFjdG9yeS5leHRlbmQgIT09ICdmdW5j
dGlvbicgfHwgKCFFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMgJiYgdHlwZSA9PT0gJ21v
ZGVsJykpIHsKLSAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgYSAnc2FmZScgbWVyZ2Ugc3R5
bGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIGZvciBub3cganVzdCBmYWxsYmFjayB0byBjcmVhdGUg
dGltZSBpbmplY3Rpb24KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgICB9IGVsc2Ugewot
Ci0gICAgICAgIHZhciBpbmplY3Rpb25zICAgICAgICA9IGluamVjdGlvbnNGb3IoY29udGFpbmVy
LCBmdWxsTmFtZSk7Ci0gICAgICAgIHZhciBmYWN0b3J5SW5qZWN0aW9ucyA9IGZhY3RvcnlJbmpl
Y3Rpb25zRm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpOwotCi0gICAgICAgIGZhY3RvcnlJbmplY3Rp
b25zLl90b1N0cmluZyA9IGNvbnRhaW5lci5tYWtlVG9TdHJpbmcoZmFjdG9yeSwgZnVsbE5hbWUp
OwotCi0gICAgICAgIGluamVjdGVkRmFjdG9yeSA9IGZhY3RvcnkuZXh0ZW5kKGluamVjdGlvbnMp
OwotICAgICAgICBpbmplY3RlZEZhY3RvcnkucmVvcGVuQ2xhc3MoZmFjdG9yeUluamVjdGlvbnMp
OwotCi0gICAgICAgIGNhY2hlLnNldChmdWxsTmFtZSwgaW5qZWN0ZWRGYWN0b3J5KTsKLQotICAg
ICAgICByZXR1cm4gaW5qZWN0ZWRGYWN0b3J5OwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0
aW9uIGluamVjdGlvbnNGb3IoY29udGFpbmVyICxmdWxsTmFtZSkgewotICAgICAgdmFyIHNwbGl0
TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0gICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0s
Ci0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLQotICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlv
bnMuY29uY2F0KGNvbnRhaW5lci50eXBlSW5qZWN0aW9ucy5nZXQodHlwZSkgfHwgW10pOwotICAg
ICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci5pbmplY3Rpb25zW2Z1
bGxOYW1lXSB8fCBbXSk7Ci0KLSAgICAgIGluamVjdGlvbnMgPSBidWlsZEluamVjdGlvbnMoY29u
dGFpbmVyLCBpbmplY3Rpb25zKTsKLSAgICAgIGluamVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5
ID0gZnVsbE5hbWU7Ci0gICAgICBpbmplY3Rpb25zLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQot
ICAgICAgcmV0dXJuIGluamVjdGlvbnM7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZmFjdG9yeUlu
amVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSkgewotICAgICAgdmFyIHNwbGl0TmFtZSA9
IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0gICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0sCi0gICAg
ICAgIGZhY3RvcnlJbmplY3Rpb25zID0gW107Ci0KLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0g
ZmFjdG9yeUluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci5mYWN0b3J5VHlwZUluamVjdGlvbnMu
Z2V0KHR5cGUpIHx8IFtdKTsKLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVj
dGlvbnMuY29uY2F0KGNvbnRhaW5lci5mYWN0b3J5SW5qZWN0aW9uc1tmdWxsTmFtZV0gfHwgW10p
OwotCi0gICAgICBmYWN0b3J5SW5qZWN0aW9ucyA9IGJ1aWxkSW5qZWN0aW9ucyhjb250YWluZXIs
IGZhY3RvcnlJbmplY3Rpb25zKTsKLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zLl9kZWJ1Z0NvbnRh
aW5lcktleSA9IGZ1bGxOYW1lOwotCi0gICAgICByZXR1cm4gZmFjdG9yeUluamVjdGlvbnM7Ci0g
ICAgfQotCi0gICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxsTmFtZSkgewot
ICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3J5Rm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpOwotCi0g
ICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBm
YWxzZSkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZh
Y3RvcnkpIHsKLSAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5LmV4dGVuZCA9PT0gJ2Z1bmN0aW9u
JykgewotICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0ZW5kYWJsZSBhbmQg
aXMgYWxyZWFkeSBpbmplY3RlZAotICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZSgpOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0
ZW5kYWJsZQotICAgICAgICAgIC8vIHRvIGNyZWF0ZSB0aW1lIGluamVjdGlvbnMKLSAgICAgICAg
ICAvLyBUT0RPOiBzdXBwb3J0IG5ldydpbmcgZm9yIGluc3RhbnRpYXRpb24gYW5kIG1lcmdlIGlu
amVjdGlvbnMgZm9yIHB1cmUgSlMgRnVuY3Rpb25zCi0gICAgICAgICAgcmV0dXJuIGZhY3Rvcnku
Y3JlYXRlKGluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSkpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZWFjaERlc3Ryb3lhYmxlKGNvbnRhaW5lciwg
Y2FsbGJhY2spIHsKLSAgICAgIGNvbnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5
LCB2YWx1ZSkgewotICAgICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlh
dGUnKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9Ci0gICAgICAgIGNhbGxiYWNrKHZhbHVlKTsKLSAg
ICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlc2V0Q2FjaGUoY29udGFpbmVyKSB7Ci0g
ICAgICBjb250YWluZXIuY2FjaGUuZWFjaExvY2FsKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAg
ICAgICAgaWYgKG9wdGlvbihjb250YWluZXIsIGtleSwgJ2luc3RhbnRpYXRlJykgPT09IGZhbHNl
KSB7IHJldHVybjsgfQotICAgICAgICB2YWx1ZS5kZXN0cm95KCk7Ci0gICAgICB9KTsKLSAgICAg
IGNvbnRhaW5lci5jYWNoZS5kaWN0ID0ge307Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYWRkVHlw
ZUluamVjdGlvbihydWxlcywgdHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKSB7Ci0gICAgICB2YXIg
aW5qZWN0aW9ucyA9IHJ1bGVzLmdldCh0eXBlKTsKLQotICAgICAgaWYgKCFpbmplY3Rpb25zKSB7
Ci0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLSAgICAgICAgcnVsZXMuc2V0KHR5cGUsIGluamVj
dGlvbnMpOwotICAgICAgfQotCi0gICAgICBpbmplY3Rpb25zLnB1c2goewotICAgICAgICBwcm9w
ZXJ0eTogcHJvcGVydHksCi0gICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZQotICAgICAgfSk7Ci0g
ICAgfQotCi0gICAgZnVuY3Rpb24gYWRkSW5qZWN0aW9uKHJ1bGVzLCBmYWN0b3J5TmFtZSwgcHJv
cGVydHksIGluamVjdGlvbk5hbWUpIHsKLSAgICAgIHZhciBpbmplY3Rpb25zID0gcnVsZXNbZmFj
dG9yeU5hbWVdID0gcnVsZXNbZmFjdG9yeU5hbWVdIHx8IFtdOwotICAgICAgaW5qZWN0aW9ucy5w
dXNoKHsgcHJvcGVydHk6IHByb3BlcnR5LCBmdWxsTmFtZTogaW5qZWN0aW9uTmFtZSB9KTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gQ29udGFpbmVyOwotfSk7Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigp
IHsKLS8qZ2xvYmFscyBFTlYgKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci1ydW50aW1lCi0qLwotCi12YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRl
eE9mOwotCi0vKioKLSBUaGlzIHdpbGwgY29tcGFyZSB0d28gamF2YXNjcmlwdCB2YWx1ZXMgb2Yg
cG9zc2libHkgZGlmZmVyZW50IHR5cGVzLgotIEl0IHdpbGwgdGVsbCB5b3Ugd2hpY2ggb25lIGlz
IGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgYnkgcmV0dXJuaW5nOgotCi0gIC0gLTEgaWYgdGhlIGZp
cnN0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25kLAotICAtIDAgaWYgYm90aCBhcmUgZXF1YWws
Ci0gIC0gMSBpZiB0aGUgZmlyc3QgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCi0KLSBUaGUg
b3JkZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBgRW1iZXIuT1JERVJfREVGSU5JVElPTmAsIGlm
IHR5cGVzIGFyZSBkaWZmZXJlbnQuCi0gSW4gY2FzZSB0aGV5IGhhdmUgdGhlIHNhbWUgdHlwZSBh
biBhcHByb3ByaWF0ZSBjb21wYXJpc29uIGZvciB0aGlzIHR5cGUgaXMgbWFkZS4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywgJ2hlbGxvJyk7ICAvLyAwCi0gIEVt
YmVyLmNvbXBhcmUoJ2FiYycsICdkZmcnKTsgICAgICAvLyAtMQotICBFbWJlci5jb21wYXJlKDIs
IDEpOyAgICAgICAgICAgICAgLy8gMQotICBgYGAKLQotIEBtZXRob2QgY29tcGFyZQotIEBmb3Ig
RW1iZXIKLSBAcGFyYW0ge09iamVjdH0gdiBGaXJzdCB2YWx1ZSB0byBjb21wYXJlCi0gQHBhcmFt
IHtPYmplY3R9IHcgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUKLSBAcmV0dXJuIHtOdW1iZXJ9IC0x
IGlmIHYgPCB3LCAwIGlmIHYgPSB3IGFuZCAxIGlmIHYgPiB3LgotKi8KLUVtYmVyLmNvbXBhcmUg
PSBmdW5jdGlvbiBjb21wYXJlKHYsIHcpIHsKLSAgaWYgKHYgPT09IHcpIHsgcmV0dXJuIDA7IH0K
LQotICB2YXIgdHlwZTEgPSBFbWJlci50eXBlT2Yodik7Ci0gIHZhciB0eXBlMiA9IEVtYmVyLnR5
cGVPZih3KTsKLQotICB2YXIgQ29tcGFyYWJsZSA9IEVtYmVyLkNvbXBhcmFibGU7Ci0gIGlmIChD
b21wYXJhYmxlKSB7Ci0gICAgaWYgKHR5cGUxPT09J2luc3RhbmNlJyAmJiBDb21wYXJhYmxlLmRl
dGVjdCh2LmNvbnN0cnVjdG9yKSkgewotICAgICAgcmV0dXJuIHYuY29uc3RydWN0b3IuY29tcGFy
ZSh2LCB3KTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZTIgPT09ICdpbnN0YW5jZScgJiYgQ29tcGFy
YWJsZS5kZXRlY3Qody5jb25zdHJ1Y3RvcikpIHsKLSAgICAgIHJldHVybiAxLXcuY29uc3RydWN0
b3IuY29tcGFyZSh3LCB2KTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB3ZSBoYXZlbid0IHlldCBn
ZW5lcmF0ZWQgYSByZXZlcnNlLW1hcHBpbmcgb2YgRW1iZXIuT1JERVJfREVGSU5JVElPTiwKLSAg
Ly8gZG8gc28gbm93LgotICB2YXIgbWFwcGluZyA9IEVtYmVyLk9SREVSX0RFRklOSVRJT05fTUFQ
UElORzsKLSAgaWYgKCFtYXBwaW5nKSB7Ci0gICAgdmFyIG9yZGVyID0gRW1iZXIuT1JERVJfREVG
SU5JVElPTjsKLSAgICBtYXBwaW5nID0gRW1iZXIuT1JERVJfREVGSU5JVElPTl9NQVBQSU5HID0g
e307Ci0gICAgdmFyIGlkeCwgbGVuOwotICAgIGZvciAoaWR4ID0gMCwgbGVuID0gb3JkZXIubGVu
Z3RoOyBpZHggPCBsZW47ICArK2lkeCkgewotICAgICAgbWFwcGluZ1tvcmRlcltpZHhdXSA9IGlk
eDsKLSAgICB9Ci0KLSAgICAvLyBXZSBubyBsb25nZXIgbmVlZCBFbWJlci5PUkRFUl9ERUZJTklU
SU9OLgotICAgIGRlbGV0ZSBFbWJlci5PUkRFUl9ERUZJTklUSU9OOwotICB9Ci0KLSAgdmFyIHR5
cGUxSW5kZXggPSBtYXBwaW5nW3R5cGUxXTsKLSAgdmFyIHR5cGUySW5kZXggPSBtYXBwaW5nW3R5
cGUyXTsKLQotICBpZiAodHlwZTFJbmRleCA8IHR5cGUySW5kZXgpIHsgcmV0dXJuIC0xOyB9Ci0g
IGlmICh0eXBlMUluZGV4ID4gdHlwZTJJbmRleCkgeyByZXR1cm4gMTsgfQotCi0gIC8vIHR5cGVz
IGFyZSBlcXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5vdwotICBzd2l0Y2ggKHR5
cGUxKSB7Ci0gICAgY2FzZSAnYm9vbGVhbic6Ci0gICAgY2FzZSAnbnVtYmVyJzoKLSAgICAgIGlm
ICh2IDwgdykgeyByZXR1cm4gLTE7IH0KLSAgICAgIGlmICh2ID4gdykgeyByZXR1cm4gMTsgfQot
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICdzdHJpbmcnOgotICAgICAgdmFyIGNvbXAgPSB2
LmxvY2FsZUNvbXBhcmUodyk7Ci0gICAgICBpZiAoY29tcCA8IDApIHsgcmV0dXJuIC0xOyB9Ci0g
ICAgICBpZiAoY29tcCA+IDApIHsgcmV0dXJuIDE7IH0KLSAgICAgIHJldHVybiAwOwotCi0gICAg
Y2FzZSAnYXJyYXknOgotICAgICAgdmFyIHZMZW4gPSB2Lmxlbmd0aDsKLSAgICAgIHZhciB3TGVu
ID0gdy5sZW5ndGg7Ci0gICAgICB2YXIgbCA9IE1hdGgubWluKHZMZW4sIHdMZW4pOwotICAgICAg
dmFyIHIgPSAwOwotICAgICAgdmFyIGkgPSAwOwotICAgICAgd2hpbGUgKHIgPT09IDAgJiYgaSA8
IGwpIHsKLSAgICAgICAgciA9IGNvbXBhcmUodltpXSx3W2ldKTsKLSAgICAgICAgaSsrOwotICAg
ICAgfQotICAgICAgaWYgKHIgIT09IDApIHsgcmV0dXJuIHI7IH0KLQotICAgICAgLy8gYWxsIGVs
ZW1lbnRzIGFyZSBlcXVhbCBub3cKLSAgICAgIC8vIHNob3J0ZXIgYXJyYXkgc2hvdWxkIGJlIG9y
ZGVyZWQgZmlyc3QKLSAgICAgIGlmICh2TGVuIDwgd0xlbikgeyByZXR1cm4gLTE7IH0KLSAgICAg
IGlmICh2TGVuID4gd0xlbikgeyByZXR1cm4gMTsgfQotICAgICAgLy8gYXJyYXlzIGFyZSBlcXVh
bCBub3cKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnaW5zdGFuY2UnOgotICAgICAgaWYg
KEVtYmVyLkNvbXBhcmFibGUgJiYgRW1iZXIuQ29tcGFyYWJsZS5kZXRlY3QodikpIHsKLSAgICAg
ICAgcmV0dXJuIHYuY29tcGFyZSh2LCB3KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotCi0g
ICAgY2FzZSAnZGF0ZSc6Ci0gICAgICB2YXIgdk51bSA9IHYuZ2V0VGltZSgpOwotICAgICAgdmFy
IHdOdW0gPSB3LmdldFRpbWUoKTsKLSAgICAgIGlmICh2TnVtIDwgd051bSkgeyByZXR1cm4gLTE7
IH0KLSAgICAgIGlmICh2TnVtID4gd051bSkgeyByZXR1cm4gMTsgfQotICAgICAgcmV0dXJuIDA7
Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIF9j
b3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7Ci0gIHZhciByZXQsIGxvYywga2V5OwotCi0g
IC8vIHByaW1pdGl2ZSBkYXRhIHR5cGVzIGFyZSBpbW11dGFibGUsIGp1c3QgcmV0dXJuIHRoZW0u
Ci0gIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1cm4gb2Jq
OwotCi0gIC8vIGF2b2lkIGN5Y2xpY2FsIGxvb3BzCi0gIGlmIChkZWVwICYmIChsb2M9aW5kZXhP
ZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGllc1tsb2NdOwotCi0gIEVtYmVyLmFzc2VydCgn
Q2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBFbWJl
ci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2YgRW1iZXIuT2JqZWN0KSB8fCAoRW1iZXIuQ29w
eWFibGUgJiYgRW1iZXIuQ29weWFibGUuZGV0ZWN0KG9iaikpKTsKLQotICAvLyBJTVBPUlRBTlQ6
IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVjdCBhIG5hdGl2ZSBhcnJheSBvbmx5LiBBbnkg
b3RoZXIKLSAgLy8gb2JqZWN0IHdpbGwgbmVlZCB0byBpbXBsZW1lbnQgQ29weWFibGUuCi0gIGlm
IChFbWJlci50eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgewotICAgIHJldCA9IG9iai5zbGljZSgp
OwotICAgIGlmIChkZWVwKSB7Ci0gICAgICBsb2MgPSByZXQubGVuZ3RoOwotICAgICAgd2hpbGUo
LS1sb2M+PTApIHJldFtsb2NdID0gX2NvcHkocmV0W2xvY10sIGRlZXAsIHNlZW4sIGNvcGllcyk7
Ci0gICAgfQotICB9IGVsc2UgaWYgKEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRl
dGVjdChvYmopKSB7Ci0gICAgcmV0ID0gb2JqLmNvcHkoZGVlcCwgc2VlbiwgY29waWVzKTsKLSAg
fSBlbHNlIHsKLSAgICByZXQgPSB7fTsKLSAgICBmb3Ioa2V5IGluIG9iaikgewotICAgICAgaWYg
KCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7Ci0KLSAgICAgIC8vIFByZXZlbnRz
IGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCi0gICAg
ICAvLyBjb3B5aW5nIGludGVybmFsIEVtYmVyIHByb3BlcnRpZXMKLSAgICAgIGlmIChrZXkuc3Vi
c3RyaW5nKDAsMikgPT09ICdfXycpIGNvbnRpbnVlOwotCi0gICAgICByZXRba2V5XSA9IGRlZXAg
PyBfY29weShvYmpba2V5XSwgZGVlcCwgc2VlbiwgY29waWVzKSA6IG9ialtrZXldOwotICAgIH0K
LSAgfQotCi0gIGlmIChkZWVwKSB7Ci0gICAgc2Vlbi5wdXNoKG9iaik7Ci0gICAgY29waWVzLnB1
c2gocmV0KTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBDcmVhdGVzIGEgY2xv
bmUgb2YgdGhlIHBhc3NlZCBvYmplY3QuIFRoaXMgZnVuY3Rpb24gY2FuIHRha2UganVzdCBhYm91
dAotICBhbnkgdHlwZSBvZiBvYmplY3QgYW5kIGNyZWF0ZSBhIGNsb25lIG9mIGl0LCBpbmNsdWRp
bmcgcHJpbWl0aXZlIHZhbHVlcwotICAod2hpY2ggYXJlIG5vdCBhY3R1YWxseSBjbG9uZWQgYmVj
YXVzZSB0aGV5IGFyZSBpbW11dGFibGUpLgotCi0gIElmIHRoZSBwYXNzZWQgb2JqZWN0IGltcGxl
bWVudHMgdGhlIGBjbG9uZSgpYCBtZXRob2QsIHRoZW4gdGhpcyBmdW5jdGlvbgotICB3aWxsIHNp
bXBseSBjYWxsIHRoYXQgbWV0aG9kIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQotICBAbWV0aG9k
IGNvcHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8g
Y2xvbmUKLSAgQHBhcmFtIHtCb29sZWFufSBkZWVwIElmIHRydWUsIGEgZGVlcCBjb3B5IG9mIHRo
ZSBvYmplY3QgaXMgbWFkZQotICBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZWQgb2JqZWN0Ci0q
LwotRW1iZXIuY29weSA9IGZ1bmN0aW9uKG9iaiwgZGVlcCkgewotICAvLyBmYXN0IHBhdGhzCi0g
IGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1cm4gb2JqOyAv
LyBjYW4ndCBjb3B5IHByaW1pdGl2ZXMKLSAgaWYgKEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNv
cHlhYmxlLmRldGVjdChvYmopKSByZXR1cm4gb2JqLmNvcHkoZGVlcCk7Ci0gIHJldHVybiBfY29w
eShvYmosIGRlZXAsIGRlZXAgPyBbXSA6IG51bGwsIGRlZXAgPyBbXSA6IG51bGwpOwotfTsKLQot
LyoqCi0gIENvbnZlbmllbmNlIG1ldGhvZCB0byBpbnNwZWN0IGFuIG9iamVjdC4gVGhpcyBtZXRo
b2Qgd2lsbCBhdHRlbXB0IHRvCi0gIGNvbnZlcnQgdGhlIG9iamVjdCBpbnRvIGEgdXNlZnVsIHN0
cmluZyBkZXNjcmlwdGlvbi4KLQotICBJdCBpcyBhIHByZXR0eSBzaW1wbGUgaW1wbGVtZW50YXRp
b24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBtb3JlIHJvYnVzdCwKLSAgdXNlIHNvbWV0aGluZyBs
aWtlIEpTRHVtcDogaHR0cHM6Ly9naXRodWIuY29tL05WL2pzRHVtcAotCi0gIEBtZXRob2QgaW5z
cGVjdAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB5b3Ug
d2FudCB0byBpbnNwZWN0LgotICBAcmV0dXJuIHtTdHJpbmd9IEEgZGVzY3JpcHRpb24gb2YgdGhl
IG9iamVjdAotKi8KLUVtYmVyLmluc3BlY3QgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIHR5cGUg
PSBFbWJlci50eXBlT2Yob2JqKTsKLSAgaWYgKHR5cGUgPT09ICdhcnJheScpIHsKLSAgICByZXR1
cm4gJ1snICsgb2JqICsgJ10nOwotICB9Ci0gIGlmICh0eXBlICE9PSAnb2JqZWN0JykgewotICAg
IHJldHVybiBvYmogKyAnJzsKLSAgfQotCi0gIHZhciB2LCByZXQgPSBbXTsKLSAgZm9yKHZhciBr
ZXkgaW4gb2JqKSB7Ci0gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICB2
ID0gb2JqW2tleV07Ci0gICAgICBpZiAodiA9PT0gJ3RvU3RyaW5nJykgeyBjb250aW51ZTsgfSAv
LyBpZ25vcmUgdXNlbGVzcyBpdGVtcwotICAgICAgaWYgKEVtYmVyLnR5cGVPZih2KSA9PT0gJ2Z1
bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkgeyAuLi4gfSI7IH0KLSAgICAgIHJldC5wdXNoKGtl
eSArICI6ICIgKyB2KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICJ7IiArIHJldC5qb2luKCIsICIp
ICsgIn0iOwotfTsKLQotLyoqCi0gIENvbXBhcmVzIHR3byBvYmplY3RzLCByZXR1cm5pbmcgdHJ1
ZSBpZiB0aGV5IGFyZSBsb2dpY2FsbHkgZXF1YWwuIFRoaXMgaXMKLSAgYSBkZWVwZXIgY29tcGFy
aXNvbiB0aGFuIGEgc2ltcGxlIHRyaXBsZSBlcXVhbC4gRm9yIHNldHMgaXQgd2lsbCBjb21wYXJl
IHRoZQotICBpbnRlcm5hbCBvYmplY3RzLiBGb3IgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxl
bWVudHMgYGlzRXF1YWwoKWAgaXQgd2lsbAotICByZXNwZWN0IHRoYXQgbWV0aG9kLgotCi0gIGBg
YGphdmFzY3JpcHQKLSAgRW1iZXIuaXNFcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRydWUK
LSAgRW1iZXIuaXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlz
RXF1YWwoWzQsMl0sIFs0LDJdKTsgICAgICAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGlz
RXF1YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gYSBmaXJzdCBvYmplY3QgdG8g
Y29tcGFyZQotICBAcGFyYW0ge09iamVjdH0gYiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKLSAg
QHJldHVybiB7Qm9vbGVhbn0KLSovCi1FbWJlci5pc0VxdWFsID0gZnVuY3Rpb24oYSwgYikgewot
ICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9mIGEuaXNFcXVhbCkgcmV0dXJuIGEuaXNFcXVh
bChiKTsKLSAgcmV0dXJuIGEgPT09IGI7Ci19OwotCi0vLyBVc2VkIGJ5IEVtYmVyLmNvbXBhcmUK
LUVtYmVyLk9SREVSX0RFRklOSVRJT04gPSBFbWJlci5FTlYuT1JERVJfREVGSU5JVElPTiB8fCBb
Ci0gICd1bmRlZmluZWQnLAotICAnbnVsbCcsCi0gICdib29sZWFuJywKLSAgJ251bWJlcicsCi0g
ICdzdHJpbmcnLAotICAnYXJyYXknLAotICAnb2JqZWN0JywKLSAgJ2luc3RhbmNlJywKLSAgJ2Z1
bmN0aW9uJywKLSAgJ2NsYXNzJywKLSAgJ2RhdGUnCi1dOwotCi0vKioKLSAgUmV0dXJucyBhbGwg
b2YgdGhlIGtleXMgZGVmaW5lZCBvbiBhbiBvYmplY3Qgb3IgaGFzaC4gVGhpcyBpcyB1c2VmdWwK
LSAgd2hlbiBpbnNwZWN0aW5nIG9iamVjdHMgZm9yIGRlYnVnZ2luZy4gT24gYnJvd3NlcnMgdGhh
dCBzdXBwb3J0IGl0LCB0aGlzCi0gIHVzZXMgdGhlIG5hdGl2ZSBgT2JqZWN0LmtleXNgIGltcGxl
bWVudGF0aW9uLgotCi0gIEBtZXRob2Qga2V5cwotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2Jq
ZWN0fSBvYmoKLSAgQHJldHVybiB7QXJyYXl9IEFycmF5IGNvbnRhaW5pbmcga2V5cyBvZiBvYmoK
LSovCi1FbWJlci5rZXlzID0gT2JqZWN0LmtleXM7Ci0KLWlmICghRW1iZXIua2V5cyB8fCBFbWJl
ci5jcmVhdGUuaXNTaW11bGF0ZWQpIHsKLSAgdmFyIHByb3RvdHlwZVByb3BlcnRpZXMgPSBbCi0g
ICAgJ2NvbnN0cnVjdG9yJywKLSAgICAnaGFzT3duUHJvcGVydHknLAotICAgICdpc1Byb3RvdHlw
ZU9mJywKLSAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLAotICAgICd2YWx1ZU9mJywKLSAgICAn
dG9Mb2NhbGVTdHJpbmcnLAotICAgICd0b1N0cmluZycKLSAgXSwKLSAgcHVzaFByb3BlcnR5TmFt
ZSA9IGZ1bmN0aW9uKG9iaiwgYXJyYXksIGtleSkgewotICAgIC8vIFByZXZlbnRzIGJyb3dzZXJz
IHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCi0gICAgLy8gY29weWlu
ZyBpbnRlcm5hbCBFbWJlciBwcm9wZXJ0aWVzCi0gICAgaWYgKGtleS5zdWJzdHJpbmcoMCwyKSA9
PT0gJ19fJykgcmV0dXJuOwotICAgIGlmIChrZXkgPT09ICdfc3VwZXInKSByZXR1cm47Ci0gICAg
aWYgKGluZGV4T2YoYXJyYXksIGtleSkgPj0gMCkgcmV0dXJuOwotICAgIGlmICghb2JqLmhhc093
blByb3BlcnR5KGtleSkpIHJldHVybjsKLQotICAgIGFycmF5LnB1c2goa2V5KTsKLSAgfTsKLQot
ICBFbWJlci5rZXlzID0gZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIHJldCA9IFtdLCBrZXk7Ci0g
ICAgZm9yIChrZXkgaW4gb2JqKSB7Ci0gICAgICBwdXNoUHJvcGVydHlOYW1lKG9iaiwgcmV0LCBr
ZXkpOwotICAgIH0KLQotICAgIC8vIElFOCBkb2Vzbid0IGVudW1lcmF0ZSBwcm9wZXJ0eSB0aGF0
IG5hbWVkIHRoZSBzYW1lIGFzIHByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICAgIGZvciAodmFyIGkg
PSAwLCBsID0gcHJvdG90eXBlUHJvcGVydGllcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAg
IGtleSA9IHByb3RvdHlwZVByb3BlcnRpZXNbaV07Ci0KLSAgICAgIHB1c2hQcm9wZXJ0eU5hbWUo
b2JqLCByZXQsIGtleSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfTsKLX0KLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCi0qLwotCi12YXIgU1RSSU5HX0RBU0hFUklaRV9SRUdFWFAgPSAoL1sgX10v
Zyk7Ci12YXIgU1RSSU5HX0RBU0hFUklaRV9DQUNIRSA9IHt9OwotdmFyIFNUUklOR19ERUNBTUVM
SVpFX1JFR0VYUCA9ICgvKFthLXpcZF0pKFtBLVpdKS9nKTsKLXZhciBTVFJJTkdfQ0FNRUxJWkVf
UkVHRVhQID0gKC8oXC18X3xcLnxccykrKC4pPy9nKTsKLXZhciBTVFJJTkdfVU5ERVJTQ09SRV9S
RUdFWFBfMSA9ICgvKFthLXpcZF0pKFtBLVpdKykvZyk7Ci12YXIgU1RSSU5HX1VOREVSU0NPUkVf
UkVHRVhQXzIgPSAoL1wtfFxzKy9nKTsKLQotLyoqCi0gIERlZmluZXMgdGhlIGhhc2ggb2YgbG9j
YWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLiBVc2VkIGJ5Ci0gIHRoZSBg
RW1iZXIuU3RyaW5nLmxvYygpYCBoZWxwZXIuIFRvIGxvY2FsaXplLCBhZGQgc3RyaW5nIHZhbHVl
cyB0byB0aGlzCi0gIGhhc2guCi0KLSAgQHByb3BlcnR5IFNUUklOR1MKLSAgQGZvciBFbWJlcgot
ICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuU1RSSU5HUyA9IHt9OwotCi0vKioKLSAgRGVmaW5lcyBz
dHJpbmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5nIHN0cmluZyBmb3JtYXR0aW5nIGFuZCBsb2Nh
bGl6YXRpb24uCi0gIFVubGVzcyBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nYCBpcyBg
ZmFsc2VgIHRoZXNlIG1ldGhvZHMgd2lsbCBhbHNvIGJlCi0gIGFkZGVkIHRvIHRoZSBgU3RyaW5n
LnByb3RvdHlwZWAgYXMgd2VsbC4KLQotICBAY2xhc3MgU3RyaW5nCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlN0cmluZyA9IHsKLQotICAvKioKLSAgICBBcHBseSBm
b3JtYXR0aW5nIG9wdGlvbnMgdG8gdGhlIHN0cmluZy4gVGhpcyB3aWxsIGxvb2sgZm9yIG9jY3Vy
cmVuY2VzCi0gICAgb2YgIiVAIiBpbiB5b3VyIHN0cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdp
dGggdGhlIGFyZ3VtZW50cyB5b3UgcGFzcyBpbnRvCi0gICAgdGhpcyBtZXRob2QuIElmIHlvdSB3
YW50IHRvIGNvbnRyb2wgdGhlIHNwZWNpZmljIG9yZGVyIG9mIHJlcGxhY2VtZW50LAotICAgIHlv
dSBjYW4gYWRkIGEgbnVtYmVyIGFmdGVyIHRoZSBrZXkgYXMgd2VsbCB0byBpbmRpY2F0ZSB3aGlj
aCBhcmd1bWVudAotICAgIHlvdSB3YW50IHRvIGluc2VydC4KLQotICAgIE9yZGVyZWQgaW5zZXJ0
aW9ucyBhcmUgbW9zdCB1c2VmdWwgd2hlbiBidWlsZGluZyBsb2Mgc3RyaW5ncyB3aGVyZSB2YWx1
ZXMKLSAgICB5b3UgbmVlZCB0byBpbnNlcnQgbWF5IGFwcGVhciBpbiBkaWZmZXJlbnQgb3JkZXJz
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICJIZWxsbyAlQCAlQCIuZm10KCdKb2huJywgJ0Rv
ZScpOyAgICAgLy8gIkhlbGxvIEpvaG4gRG9lIgotICAgICJIZWxsbyAlQDIsICVAMSIuZm10KCdK
b2huJywgJ0RvZScpOyAgLy8gIkhlbGxvIERvZSwgSm9obiIKLSAgICBgYGAKLQotICAgIEBtZXRo
b2QgZm10Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAotICAg
IEBwYXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBv
bGF0ZSBpbnRvIHN0cmluZy4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcK
LSAgKi8KLSAgZm10OiBmdW5jdGlvbihzdHIsIGZvcm1hdHMpIHsKLSAgICAvLyBmaXJzdCwgcmVw
bGFjZSBhbnkgT1JERVJFRCByZXBsYWNlbWVudHMuCi0gICAgdmFyIGlkeCAgPSAwOyAvLyB0aGUg
Y3VycmVudCBpbmRleCBmb3Igbm9uLW51bWVyaWNhbCByZXBsYWNlbWVudHMKLSAgICByZXR1cm4g
c3RyLnJlcGxhY2UoLyVAKFswLTldKyk/L2csIGZ1bmN0aW9uKHMsIGFyZ0luZGV4KSB7Ci0gICAg
ICBhcmdJbmRleCA9IChhcmdJbmRleCkgPyBwYXJzZUludChhcmdJbmRleCwgMTApIC0gMSA6IGlk
eCsrOwotICAgICAgcyA9IGZvcm1hdHNbYXJnSW5kZXhdOwotICAgICAgcmV0dXJuIChzID09PSBu
dWxsKSA/ICcobnVsbCknIDogKHMgPT09IHVuZGVmaW5lZCkgPyAnJyA6IEVtYmVyLmluc3BlY3Qo
cyk7Ci0gICAgfSkgOwotICB9LAotCi0gIC8qKgotICAgIEZvcm1hdHMgdGhlIHBhc3NlZCBzdHJp
bmcsIGJ1dCBmaXJzdCBsb29rcyB1cCB0aGUgc3RyaW5nIGluIHRoZSBsb2NhbGl6ZWQKLSAgICBz
dHJpbmdzIGhhc2guIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBT
ZWUKLSAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmb3Jt
YXR0aW5nLgotCi0gICAgTm90ZSB0aGF0IGl0IGlzIHRyYWRpdGlvbmFsIGJ1dCBub3QgcmVxdWly
ZWQgdG8gcHJlZml4IGxvY2FsaXplZCBzdHJpbmcKLSAgICBrZXlzIHdpdGggYW4gdW5kZXJzY29y
ZSBvciBvdGhlciBjaGFyYWN0ZXIgc28geW91IGNhbiBlYXNpbHkgaWRlbnRpZnkKLSAgICBsb2Nh
bGl6ZWQgc3RyaW5ncy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5TVFJJTkdTID0g
ewotICAgICAgJ19IZWxsbyBXb3JsZCc6ICdCb25qb3VyIGxlIG1vbmRlJywKLSAgICAgICdfSGVs
bG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcKLSAgICB9OwotCi0gICAgRW1iZXIuU3RyaW5nLmxv
YygiX0hlbGxvIFdvcmxkIik7ICAvLyAnQm9uam91ciBsZSBtb25kZSc7Ci0gICAgRW1iZXIuU3Ry
aW5nLmxvYygiX0hlbGxvICVAICVAIiwgWyJKb2huIiwgIlNtaXRoIl0pOyAgLy8gIkJvbmpvdXIg
Sm9obiBTbWl0aCI7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGxvYwotICAgIEBwYXJhbSB7U3Ry
aW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKLSAgICBAcGFyYW0ge0FycmF5fSBmb3JtYXRz
IE9wdGlvbmFsIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gaW50ZXJwb2xhdGUgaW50byBzdHJpbmcu
Ci0gICAgQHJldHVybiB7U3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nCi0gICovCi0gIGxvYzogZnVu
Y3Rpb24oc3RyLCBmb3JtYXRzKSB7Ci0gICAgc3RyID0gRW1iZXIuU1RSSU5HU1tzdHJdIHx8IHN0
cjsKLSAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmZtdChzdHIsIGZvcm1hdHMpIDsKLSAgfSwKLQot
ICAvKioKLSAgICBTcGxpdHMgYSBzdHJpbmcgaW50byBzZXBhcmF0ZSB1bml0cyBzZXBhcmF0ZWQg
Ynkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKLSAgICBlbXB0eSBzdHJpbmdzIGluIHRoZSBwcm9j
ZXNzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzcGxpdCB0aGF0Ci0gICAgaXMg
bW9zdGx5IHVzZWZ1bCB3aGVuIGFwcGxpZWQgdG8gdGhlIGBTdHJpbmcucHJvdG90eXBlYC4KLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5TdHJpbmcudygiYWxwaGEgYmV0YSBnYW1tYSIp
LmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBjb25zb2xlLmxvZyhrZXkpOwotICAgIH0p
OwotCi0gICAgLy8gPiBhbHBoYQotICAgIC8vID4gYmV0YQotICAgIC8vID4gZ2FtbWEKLSAgICBg
YGAKLQotICAgIEBtZXRob2QgdwotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0
byBzcGxpdAotICAgIEByZXR1cm4ge1N0cmluZ30gc3BsaXQgc3RyaW5nCi0gICovCi0gIHc6IGZ1
bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnNwbGl0KC9ccysvKTsgfSwKLQotICAvKioKLSAgICBD
b252ZXJ0cyBhIGNhbWVsaXplZCBzdHJpbmcgaW50byBhbGwgbG93ZXIgY2FzZSBzZXBhcmF0ZWQg
YnkgdW5kZXJzY29yZXMuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgJ2lubmVySFRNTCcuZGVj
YW1lbGl6ZSgpOyAgICAgICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy5k
ZWNhbWVsaXplKCk7ICAgICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1l
Jy5kZWNhbWVsaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCi0gICAgJ215IGZhdm9yaXRl
IGl0ZW1zJy5kZWNhbWVsaXplKCk7ICAvLyAnbXkgZmF2b3JpdGUgaXRlbXMnCi0gICAgYGBgCi0K
LSAgICBAbWV0aG9kIGRlY2FtZWxpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJp
bmcgdG8gZGVjYW1lbGl6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBz
dHJpbmcuCi0gICovCi0gIGRlY2FtZWxpemU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBz
dHIucmVwbGFjZShTVFJJTkdfREVDQU1FTElaRV9SRUdFWFAsICckMV8kMicpLnRvTG93ZXJDYXNl
KCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVwbGFjZXMgdW5kZXJzY29yZXMsIHNwYWNlcywgb3Ig
Y2FtZWxDYXNlIHdpdGggZGFzaGVzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhU
TUwnLmRhc2hlcml6ZSgpOyAgICAgICAgICAvLyAnaW5uZXItaHRtbCcKLSAgICAnYWN0aW9uX25h
bWUnLmRhc2hlcml6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbi1uYW1lJwotICAgICdjc3MtY2xhc3Mt
bmFtZScuZGFzaGVyaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCi0gICAgJ215IGZhdm9y
aXRlIGl0ZW1zJy5kYXNoZXJpemUoKTsgIC8vICdteS1mYXZvcml0ZS1pdGVtcycKLSAgICBgYGAK
LQotICAgIEBtZXRob2QgZGFzaGVyaXplCi0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3Ry
aW5nIHRvIGRhc2hlcml6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkYXNoZXJpemVkIHN0
cmluZy4KLSAgKi8KLSAgZGFzaGVyaXplOiBmdW5jdGlvbihzdHIpIHsKLSAgICB2YXIgY2FjaGUg
PSBTVFJJTkdfREFTSEVSSVpFX0NBQ0hFLAotICAgICAgICBoaXQgICA9IGNhY2hlLmhhc093blBy
b3BlcnR5KHN0ciksCi0gICAgICAgIHJldDsKLQotICAgIGlmIChoaXQpIHsKLSAgICAgIHJldHVy
biBjYWNoZVtzdHJdOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSBFbWJlci5TdHJpbmcuZGVj
YW1lbGl6ZShzdHIpLnJlcGxhY2UoU1RSSU5HX0RBU0hFUklaRV9SRUdFWFAsJy0nKTsKLSAgICAg
IGNhY2hlW3N0cl0gPSByZXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAv
KioKLSAgICBSZXR1cm5zIHRoZSBsb3dlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmNhbWVsaXplKCk7ICAgICAgICAgIC8v
ICdpbm5lckhUTUwnCi0gICAgJ2FjdGlvbl9uYW1lJy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2Fj
dGlvbk5hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1lJy5jYW1lbGl6ZSgpOyAgICAgLy8gJ2Nzc0Ns
YXNzTmFtZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhbWVsaXplKCk7ICAvLyAnbXlGYXZv
cml0ZUl0ZW1zJwotICAgICdNeSBGYXZvcml0ZSBJdGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZh
dm9yaXRlSXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNhbWVsaXplCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNhbWVsaXplLgotICAgIEByZXR1cm4ge1N0cmlu
Z30gdGhlIGNhbWVsaXplZCBzdHJpbmcuCi0gICovCi0gIGNhbWVsaXplOiBmdW5jdGlvbihzdHIp
IHsKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0NBTUVMSVpFX1JFR0VYUCwgZnVuY3Rp
b24obWF0Y2gsIHNlcGFyYXRvciwgY2hyKSB7Ci0gICAgICByZXR1cm4gY2hyID8gY2hyLnRvVXBw
ZXJDYXNlKCkgOiAnJzsKLSAgICB9KS5yZXBsYWNlKC9eKFtBLVpdKS8sIGZ1bmN0aW9uKG1hdGNo
LCBzZXBhcmF0b3IsIGNocikgewotICAgICAgcmV0dXJuIG1hdGNoLnRvTG93ZXJDYXNlKCk7Ci0g
ICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgVXBwZXJDYW1lbENhc2UgZm9y
bSBvZiBhIHN0cmluZy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICAnaW5uZXJIVE1MJy5jbGFz
c2lmeSgpOyAgICAgICAgICAvLyAnSW5uZXJIVE1MJwotICAgICdhY3Rpb25fbmFtZScuY2xhc3Np
ZnkoKTsgICAgICAgIC8vICdBY3Rpb25OYW1lJwotICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3Np
ZnkoKTsgICAgIC8vICdDc3NDbGFzc05hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jbGFz
c2lmeSgpOyAgLy8gJ015RmF2b3JpdGVJdGVtcycKLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2xh
c3NpZnkKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY2xhc3NpZnkKLSAg
ICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lmaWVkIHN0cmluZwotICAqLwotICBjbGFzc2lm
eTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCIuIiksCi0gICAg
ICAgIG91dCA9IFtdOwotCi0gICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICAgIHZhciBjYW1lbGl6ZWQgPSBFbWJlci5TdHJpbmcuY2FtZWxpemUocGFydHNb
aV0pOwotICAgICAgb3V0LnB1c2goY2FtZWxpemVkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsg
Y2FtZWxpemVkLnN1YnN0cigxKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5qb2luKCIuIik7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgTW9yZSBnZW5lcmFsIHRoYW4gZGVjYW1lbGl6ZS4gUmV0dXJu
cyB0aGUgbG93ZXJcX2Nhc2VcX2FuZFxfdW5kZXJzY29yZWQKLSAgICBmb3JtIG9mIGEgc3RyaW5n
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLnVuZGVyc2NvcmUoKTsgICAg
ICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAg
ICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1lJy51bmRlcnNjb3JlKCk7
ICAgICAvLyAnY3NzX2NsYXNzX25hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy51bmRlcnNj
b3JlKCk7ICAvLyAnbXlfZmF2b3JpdGVfaXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVu
ZGVyc2NvcmUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gdW5kZXJzY29y
ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmRlcnNjb3JlZCBzdHJpbmcuCi0gICovCi0g
IHVuZGVyc2NvcmU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJ
TkdfVU5ERVJTQ09SRV9SRUdFWFBfMSwgJyQxXyQyJykuCi0gICAgICByZXBsYWNlKFNUUklOR19V
TkRFUlNDT1JFX1JFR0VYUF8yLCAnXycpLnRvTG93ZXJDYXNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQgZm9ybSBvZiBhIHN0cmluZwotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmNhcGl0YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhU
TUwnCi0gICAgJ2FjdGlvbl9uYW1lJy5jYXBpdGFsaXplKCkgICAgICAgLy8gJ0FjdGlvbl9uYW1l
JwotICAgICdjc3MtY2xhc3MtbmFtZScuY2FwaXRhbGl6ZSgpICAgIC8vICdDc3MtY2xhc3MtbmFt
ZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhcGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUg
aXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNhcGl0YWxpemUKLSAgICBAcGFyYW0ge1N0
cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9
IFRoZSBjYXBpdGFsaXplZCBzdHJpbmcuCi0gICovCi0gIGNhcGl0YWxpemU6IGZ1bmN0aW9uKHN0
cikgewotICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3Ry
KDEpOwotICB9Ci19OwotCi0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0KLQotdmFyIGZtdCA9
IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgdyAgID0gRW1iZXIuU3RyaW5nLncsCi0gICAgbG9jID0g
RW1iZXIuU3RyaW5nLmxvYywKLSAgICBjYW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSwK
LSAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgZGFzaGVyaXpl
ID0gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZSwKLSAgICB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5n
LnVuZGVyc2NvcmUsCi0gICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBpdGFsaXplLAot
ICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNsYXNzaWZ5OwotCi0KLWlmIChFbWJlci5FWFRF
TkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcp
IHsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5mbXRdKC9hcGkvY2xhc3Nlcy9FbWJl
ci5TdHJpbmcuaHRtbCNtZXRob2RfZm10KS4KLQotICAgIEBtZXRob2QgZm10Ci0gICAgQGZvciBT
dHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5mbXQgPSBmdW5jdGlvbigpIHsKLSAgICBy
ZXR1cm4gZm10KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJl
ci5TdHJpbmcud10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF93KS4KLQot
ICAgIEBtZXRob2QgdwotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUu
dyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB3KHRoaXMpOwotICB9OwotCi0gIC8qKgotICAg
IFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21l
dGhvZF9sb2MpLgotCi0gICAgQG1ldGhvZCBsb2MKLSAgICBAZm9yIFN0cmluZwotICAqLwotICBT
dHJpbmcucHJvdG90eXBlLmxvYyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBsb2ModGhpcywg
YXJndW1lbnRzKTsKLSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5jYW1lbGl6
ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYW1lbGl6ZSkuCi0KLSAg
ICBAbWV0aG9kIGNhbWVsaXplCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3Rv
dHlwZS5jYW1lbGl6ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjYW1lbGl6ZSh0aGlzKTsK
LSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5kZWNhbWVsaXplXSgvYXBpL2Ns
YXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2RlY2FtZWxpemUpLgotCi0gICAgQG1ldGhv
ZCBkZWNhbWVsaXplCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5k
ZWNhbWVsaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGRlY2FtZWxpemUodGhpcyk7Ci0g
IH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNz
ZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rhc2hlcml6ZSkuCi0KLSAgICBAbWV0aG9kIGRh
c2hlcml6ZQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuZGFzaGVy
aXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGRhc2hlcml6ZSh0aGlzKTsKLSAgfTsKLQot
ICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy51bmRlcnNjb3JlXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX3VuZGVyc2NvcmUpLgotCi0gICAgQG1ldGhvZCB1bmRlcnNj
b3JlCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS51bmRlcnNjb3Jl
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHVuZGVyc2NvcmUodGhpcyk7Ci0gIH07Ci0KLSAg
LyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuY2xhc3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5T
dHJpbmcuaHRtbCNtZXRob2RfY2xhc3NpZnkpLgotCi0gICAgQG1ldGhvZCBjbGFzc2lmeQotICAg
IEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuY2xhc3NpZnkgPSBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gY2xhc3NpZnkodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2Vl
IFtFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1s
I21ldGhvZF9jYXBpdGFsaXplKS4KLQotICAgIEBtZXRob2QgY2FwaXRhbGl6ZQotICAgIEBmb3Ig
U3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMpOwotICB9OwotCi0gIAotfQotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5z
ZXQsCi0gICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCi0gICAgZ2V0UHJvcGVydGll
cyA9IEVtYmVyLmdldFByb3BlcnRpZXM7Ci0KLS8qKgotICAjIyBPdmVydmlldwotCi0gIFRoaXMg
bWl4aW4gcHJvdmlkZXMgcHJvcGVydGllcyBhbmQgcHJvcGVydHkgb2JzZXJ2aW5nIGZ1bmN0aW9u
YWxpdHksIGNvcmUKLSAgZmVhdHVyZXMgb2YgdGhlIEVtYmVyIG9iamVjdCBtb2RlbC4KLQotICBQ
cm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMgYWxsb3cgb25lIG9iamVjdCB0byBvYnNlcnZlIGNoYW5n
ZXMgdG8gYQotICBwcm9wZXJ0eSBvbiBhbm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhl
IGZ1bmRhbWVudGFsIHdheXMgdGhhdAotICBtb2RlbHMsIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyBj
b21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgaW4gYW4gRW1iZXIKLSAgYXBwbGljYXRpb24uCi0K
LSAgQW55IG9iamVjdCB0aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4g
b2JzZXJ2ZXIKLSAgb3BlcmF0aW9ucy4gVGhhdCBpbmNsdWRlcyBgRW1iZXIuT2JqZWN0YCBhbmQg
bW9zdCBvYmplY3RzIHlvdSB3aWxsCi0gIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIg
RW1iZXIgYXBwbGljYXRpb24uCi0KLSAgTm90ZSB0aGF0IHlvdSB3aWxsIG5vdCBnZW5lcmFsbHkg
YXBwbHkgdGhpcyBtaXhpbiB0byBjbGFzc2VzIHlvdXJzZWxmLAotICBidXQgeW91IHdpbGwgdXNl
IHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBzbyBpdAot
ICBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBob3cgdG8gdXNlIGl0LgotCi0gICMjIFVzaW5n
IGBnZXQoKWAgYW5kIGBzZXQoKWAKLQotICBCZWNhdXNlIG9mIEVtYmVyJ3Mgc3VwcG9ydCBmb3Ig
YmluZGluZ3MgYW5kIG9ic2VydmVycywgeW91IHdpbGwgYWx3YXlzCi0gIGFjY2VzcyBwcm9wZXJ0
aWVzIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCBhbmQgc2V0IHByb3BlcnRpZXMgdXNpbmcgdGhlCi0g
IHNldCBtZXRob2QuIFRoaXMgYWxsb3dzIHRoZSBvYnNlcnZpbmcgb2JqZWN0cyB0byBiZSBub3Rp
ZmllZCBhbmQKLSAgY29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSBoYW5kbGVkIHByb3Blcmx5Lgot
Ci0gIE1vcmUgZG9jdW1lbnRhdGlvbiBhYm91dCBgZ2V0YCBhbmQgYHNldGAgYXJlIGJlbG93Lgot
Ci0gICMjIE9ic2VydmluZyBQcm9wZXJ0eSBDaGFuZ2VzCi0KLSAgWW91IHR5cGljYWxseSBvYnNl
cnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAotICBj
YWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhh
dCB5b3Ugd3JpdGUuCi0gIEZvciBleGFtcGxlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIu
T2JqZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAv
LyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfS5v
YnNlcnZlcygndmFsdWUnKQotICB9KTsKLSAgYGBgCi0KLSAgQWx0aG91Z2ggdGhpcyBpcyB0aGUg
bW9zdCBjb21tb24gd2F5IHRvIGFkZCBhbiBvYnNlcnZlciwgdGhpcyBjYXBhYmlsaXR5Ci0gIGlz
IGFjdHVhbGx5IGJ1aWx0IGludG8gdGhlIGBFbWJlci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0
d28gbWV0aG9kcwotICBkZWZpbmVkIGluIHRoaXMgbWl4aW46IGBhZGRPYnNlcnZlcmAgYW5kIGBy
ZW1vdmVPYnNlcnZlcmAuIFlvdSBjYW4gdXNlCi0gIHRoZXNlIHR3byBtZXRob2RzIHRvIGFkZCBh
bmQgcmVtb3ZlIG9ic2VydmVycyB5b3Vyc2VsZiBpZiB5b3UgbmVlZCB0bwotICBkbyBzbyBhdCBy
dW50aW1lLgotCi0gIFRvIGFkZCBhbiBvYnNlcnZlciBmb3IgYSBwcm9wZXJ0eSwgY2FsbDoKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIG9iamVjdC5hZGRPYnNlcnZlcigncHJvcGVydHlLZXknLCB0YXJn
ZXRPYmplY3QsIHRhcmdldEFjdGlvbikKLSAgYGBgCi0KLSAgVGhpcyB3aWxsIGNhbGwgdGhlIGB0
YXJnZXRBY3Rpb25gIG1ldGhvZCBvbiB0aGUgYHRhcmdldE9iamVjdGAgd2hlbmV2ZXIKLSAgdGhl
IHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNoYW5nZXMuCi0KLSAgTm90ZSB0aGF0IGlmIGBw
cm9wZXJ0eUtleWAgaXMgYSBjb21wdXRlZCBwcm9wZXJ0eSwgdGhlIG9ic2VydmVyIHdpbGwgYmUK
LSAgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBwcm9wZXJ0eSBkZXBlbmRlbmNpZXMgYXJlIGNoYW5n
ZWQsIGV2ZW4gaWYgdGhlCi0gIHJlc3VsdGluZyB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVy
dHkgaXMgdW5jaGFuZ2VkLiBUaGlzIGlzIG5lY2Vzc2FyeQotICBiZWNhdXNlIGNvbXB1dGVkIHBy
b3BlcnRpZXMgYXJlIG5vdCBjb21wdXRlZCB1bnRpbCBgZ2V0YCBpcyBjYWxsZWQuCi0KLSAgQGNs
YXNzIE9ic2VydmFibGUKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLk9ic2VydmFibGUg
PSBFbWJlci5NaXhpbi5jcmVhdGUoewotCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUg
b2YgYSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3QuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyB1c3Vh
bGx5IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtrZXlOYW1lXWAgb3IgYG9iamVjdC5rZXlOYW1l
YCwKLSAgICBob3dldmVyIGl0IHN1cHBvcnRzIGJvdGggY29tcHV0ZWQgcHJvcGVydGllcyBhbmQg
dGhlIHVua25vd25Qcm9wZXJ0eQotICAgIGhhbmRsZXIuCi0KLSAgICBCZWNhdXNlIGBnZXRgIHVu
aWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5nIGFsbCB0aGVzZSBraW5kcwotICAgIG9mIHBy
b3BlcnRpZXMsIGl0IGNhbiBtYWtlIG1hbnkgcmVmYWN0b3JpbmdzIGVhc2llciwgc3VjaCBhcyBy
ZXBsYWNpbmcgYQotICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJvcGVydHks
IG9yIHZpY2UgdmVyc2EuCi0KLSAgICAjIyMgQ29tcHV0ZWQgUHJvcGVydGllcwotCi0gICAgQ29t
cHV0ZWQgcHJvcGVydGllcyBhcmUgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBwcm9wZXJ0eWAg
bW9kaWZpZXIKLSAgICBkZWNsYXJlZCBhdCB0aGUgZW5kLCBzdWNoIGFzOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIGZ1bGxOYW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdl
dCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKLSAgICB9LnByb3Bl
cnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAgIGBgYAotCi0gICAgV2hlbiB5b3UgY2Fs
bCBgZ2V0YCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5LCB0aGUgZnVuY3Rpb24gd2lsbCBiZQotICAg
IGNhbGxlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2Yg
dGhlIGZ1bmN0aW9uCi0gICAgaXRzZWxmLgotCi0gICAgIyMjIFVua25vd24gUHJvcGVydGllcwot
Ci0gICAgTGlrZXdpc2UsIGlmIHlvdSB0cnkgdG8gY2FsbCBgZ2V0YCBvbiBhIHByb3BlcnR5IHdo
b3NlIHZhbHVlIGlzCi0gICAgYHVuZGVmaW5lZGAsIHRoZSBgdW5rbm93blByb3BlcnR5KClgIG1l
dGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgb2JqZWN0LgotICAgIElmIHRoaXMgbWV0aG9kIHJl
dHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4gYHVuZGVmaW5lZGAsIGl0IHdpbGwgYmUgcmV0dXJu
ZWQKLSAgICBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gaW1wbGVtZW50ICJ2aXJ0dWFsIiBw
cm9wZXJ0aWVzIHRoYXQgYXJlCi0gICAgbm90IGRlZmluZWQgdXBmcm9udC4KLQotICAgIEBtZXRo
b2QgZ2V0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IHRvIHJldHJp
ZXZlCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdW5kZWZpbmVk
LgotICAqLwotICBnZXQ6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMs
IGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVz
IGF0IG9uY2UsIGNhbGwgYGdldFByb3BlcnRpZXNgCi0gICAgd2l0aCBhIGxpc3Qgb2Ygc3RyaW5n
cyBvciBhbiBhcnJheToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0UHJvcGVy
dGllcygnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1l
OiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0gICAgYGBgCi0K
LSAgICBpcyBlcXVpdmFsZW50IHRvOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHJlY29yZC5n
ZXRQcm9wZXJ0aWVzKFsnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnXSk7ICAvLyB7
IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIHppcENvZGU6ICcxMDAxMScgfQot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZXRQcm9wZXJ0aWVzCi0gICAgQHBhcmFtIHtTdHJpbmcu
Li58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKLSAgICBAcmV0dXJuIHtIYXNofQotICAqLwot
ICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gZ2V0UHJvcGVydGllcy5h
cHBseShudWxsLCBbdGhpc10uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwotICB9LAot
Ci0gIC8qKgotICAgIFNldHMgdGhlIHByb3ZpZGVkIGtleSBvciBwYXRoIHRvIHRoZSB2YWx1ZS4K
LQotICAgIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSB2ZXJ5IHNpbWlsYXIgdG8gY2FsbGluZyBg
b2JqZWN0W2tleV0gPSB2YWx1ZWAgb3IKLSAgICBgb2JqZWN0LmtleSA9IHZhbHVlYCwgZXhjZXB0
IHRoYXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgY29tcHV0ZWQKLSAgICBwcm9wZXJ0aWVzLCB0
aGUgYHNldFVua25vd25Qcm9wZXJ0eSgpYCBtZXRob2QgYW5kIHByb3BlcnR5IG9ic2VydmVycy4K
LQotICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVzCi0KLSAgICBJZiB5b3UgdHJ5IHRvIHNldCBh
IHZhbHVlIG9uIGEga2V5IHRoYXQgaGFzIGEgY29tcHV0ZWQgcHJvcGVydHkgaGFuZGxlcgotICAg
IGRlZmluZWQgKHNlZSB0aGUgYGdldCgpYCBtZXRob2QgZm9yIGFuIGV4YW1wbGUpLCB0aGVuIGBz
ZXQoKWAgd2lsbCBjYWxsCi0gICAgdGhhdCBtZXRob2QsIHBhc3NpbmcgYm90aCB0aGUgdmFsdWUg
YW5kIGtleSBpbnN0ZWFkIG9mIHNpbXBseSBjaGFuZ2luZwotICAgIHRoZSB2YWx1ZSBpdHNlbGYu
IFRoaXMgaXMgdXNlZnVsIGZvciB0aG9zZSB0aW1lcyB3aGVuIHlvdSBuZWVkIHRvCi0gICAgaW1w
bGVtZW50IGEgcHJvcGVydHkgdGhhdCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBtZW1iZXIK
LSAgICBwcm9wZXJ0aWVzLgotCi0gICAgIyMjIFVua25vd24gUHJvcGVydGllcwotCi0gICAgSWYg
eW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGlzIHVuZGVmaW5lZCBpbiB0aGUg
dGFyZ2V0Ci0gICAgb2JqZWN0LCB0aGVuIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClgIGhhbmRs
ZXIgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZC4gVGhpcwotICAgIGdpdmVzIHlvdSBhbiBvcHBvcnR1
bml0eSB0byBpbXBsZW1lbnQgY29tcGxleCAidmlydHVhbCIgcHJvcGVydGllcyB0aGF0Ci0gICAg
YXJlIG5vdCBwcmVkZWZpbmVkIG9uIHRoZSBvYmplY3QuIElmIGBzZXRVbmtub3duUHJvcGVydHko
KWAgcmV0dXJucwotICAgIHVuZGVmaW5lZCwgdGhlbiBgc2V0KClgIHdpbGwgc2ltcGx5IHNldCB0
aGUgdmFsdWUgb24gdGhlIG9iamVjdC4KLQotICAgICMjIyBQcm9wZXJ0eSBPYnNlcnZlcnMKLQot
ICAgIEluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBwcm9wZXJ0eSwgYHNldCgpYCB3aWxsIGFs
c28gcmVnaXN0ZXIgYSBwcm9wZXJ0eQotICAgIGNoYW5nZSB3aXRoIHRoZSBvYmplY3QuIFVubGVz
cyB5b3UgaGF2ZSBwbGFjZWQgdGhpcyBjYWxsIGluc2lkZSBvZiBhCi0gICAgYGJlZ2luUHJvcGVy
dHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxvY2FsIiBvYnNl
cnZlcnMKLSAgICAoaS5lLiBvYnNlcnZlciBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBzYW1lIG9i
amVjdCksIHdpbGwgYmUgY2FsbGVkCi0gICAgaW1tZWRpYXRlbHkuIEFueSAicmVtb3RlIiBvYnNl
cnZlcnMgKGkuZS4gb2JzZXJ2ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbgotICAgIGFub3RoZXIgb2Jq
ZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBsYXRlciB0aW1l
IGluIGEKLSAgICBjb2FsZXNjZWQgbWFubmVyLgotCi0gICAgIyMjIENoYWluaW5nCi0KLSAgICBJ
biBhZGRpdGlvbiB0byBwcm9wZXJ0eSBjaGFuZ2VzLCBgc2V0KClgIHJldHVybnMgdGhlIHZhbHVl
IG9mIHRoZSBvYmplY3QKLSAgICBpdHNlbGYgc28geW91IGNhbiBkbyBjaGFpbmluZyBsaWtlIHRo
aXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLnNldCgnZmlyc3ROYW1lJywgJ0No
YXJsZXMnKS5zZXQoJ2xhc3ROYW1lJywgJ0pvbGxleScpOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBzZXQKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkgdG8gc2V0Ci0g
ICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgb3IgYG51bGxgLgotICAg
IEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9Ci0gICovCi0gIHNldDogZnVuY3Rpb24oa2V5TmFt
ZSwgdmFsdWUpIHsKLSAgICBzZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOwotICAgIHJldHVybiB0
aGlzOwotICB9LAotCi0KLSAgLyoqCi0gICAgU2V0cyBhIGxpc3Qgb2YgcHJvcGVydGllcyBhdCBv
bmNlLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgaW5zaWRlCi0gICAgYSBzaW5nbGUgYGJlZ2lu
UHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gICAg
b2JzZXJ2ZXJzIHdpbGwgYmUgYnVmZmVyZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVj
b3JkLnNldFByb3BlcnRpZXMoeyBmaXJzdE5hbWU6ICdDaGFybGVzJywgbGFzdE5hbWU6ICdKb2xs
ZXknIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCi0gICAgQHBhcmFt
IHtIYXNofSBoYXNoIHRoZSBoYXNoIG9mIGtleXMgYW5kIHZhbHVlcyB0byBzZXQKLSAgICBAcmV0
dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwotICBzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiho
YXNoKSB7Ci0gICAgcmV0dXJuIEVtYmVyLnNldFByb3BlcnRpZXModGhpcywgaGFzaCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQmVnaW5zIGEgZ3JvdXBpbmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KLQot
ICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNoYW5nZXMgc28g
dGhhdCBub3RpZmljYXRpb25zCi0gICAgd2lsbCBub3QgYmUgc2VudCB1bnRpbCB0aGUgY2hhbmdl
cyBhcmUgZmluaXNoZWQuIElmIHlvdSBwbGFuIHRvIG1ha2UgYQotICAgIGxhcmdlIG51bWJlciBv
ZiBjaGFuZ2VzIHRvIGFuIG9iamVjdCBhdCBvbmUgdGltZSwgeW91IHNob3VsZCBjYWxsIHRoaXMK
LSAgICBtZXRob2QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhbmdlcyB0byBiZWdpbiBkZWZl
cnJpbmcgY2hhbmdlCi0gICAgbm90aWZpY2F0aW9ucy4gV2hlbiB5b3UgYXJlIGRvbmUgbWFraW5n
IGNoYW5nZXMsIGNhbGwKLSAgICBgZW5kUHJvcGVydHlDaGFuZ2VzKClgIHRvIGRlbGl2ZXIgdGhl
IGRlZmVycmVkIGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCBlbmQKLSAgICBkZWZlcnJpbmcuCi0K
LSAgICBAbWV0aG9kIGJlZ2luUHJvcGVydHlDaGFuZ2VzCi0gICAgQHJldHVybiB7RW1iZXIuT2Jz
ZXJ2YWJsZX0KLSAgKi8KLSAgYmVnaW5Qcm9wZXJ0eUNoYW5nZXM6IGZ1bmN0aW9uKCkgewotICAg
IEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgRW5kcyBhIGdyb3VwaW5nIG9mIHByb3BlcnR5IGNoYW5nZXMuCi0KLSAgICBZ
b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBncm91cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQg
bm90aWZpY2F0aW9ucwotICAgIHdpbGwgbm90IGJlIHNlbnQgdW50aWwgdGhlIGNoYW5nZXMgYXJl
IGZpbmlzaGVkLiBJZiB5b3UgcGxhbiB0byBtYWtlIGEKLSAgICBsYXJnZSBudW1iZXIgb2YgY2hh
bmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91bGQgY2FsbAotICAgIGBiZWdp
blByb3BlcnR5Q2hhbmdlcygpYCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGRl
ZmVyIGNoYW5nZQotICAgIG5vdGlmaWNhdGlvbnMuIFdoZW4geW91IGFyZSBkb25lIG1ha2luZyBj
aGFuZ2VzLCBjYWxsIHRoaXMgbWV0aG9kIHRvCi0gICAgZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hh
bmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZCBkZWZlcnJpbmcuCi0KLSAgICBAbWV0aG9kIGVuZFBy
b3BlcnR5Q2hhbmdlcwotICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9Ci0gICovCi0gIGVu
ZFByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFu
Z2VzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTm90aWZ5IHRoZSBv
YnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZS4KLQotICAg
IFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2UgYSB2YWx1ZSBkaXJlY3RseSBvciBpbmRpcmVj
dGx5IHdpdGhvdXQKLSAgICBhY3R1YWxseSBjYWxsaW5nIGBnZXQoKWAgb3IgYHNldCgpYCBvbiBp
dC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSB0aGlzCi0gICAgbWV0aG9kIGFuZCBgcHJvcGVy
dHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28gbWV0aG9kcwotICAgIHRv
Z2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBv
dGVudGlhbGx5Ci0gICAgY2hhbmdlZCB2YWx1ZS4KLQotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBh
bHdheXMgY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAot
ICAgIGFzIGEgcGFpci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hh
bmdlIGdyb3VwcyBvdXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBi
ZSBkZWxpdmVyZWQgbW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAgIGxpa2UuCi0KLSAgICBA
bWV0aG9kIHByb3BlcnR5V2lsbENoYW5nZQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRo
ZSBwcm9wZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0byBjaGFuZ2UuCi0gICAgQHJldHVybiB7RW1i
ZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgcHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbihrZXlO
YW1lKSB7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwotICAg
IHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lz
dGVtIHRoYXQgYSBwcm9wZXJ0eSBoYXMganVzdCBjaGFuZ2VkLgotCi0gICAgU29tZXRpbWVzIHlv
dSBuZWVkIHRvIGNoYW5nZSBhIHZhbHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAot
ICAgIGFjdHVhbGx5IGNhbGxpbmcgYGdldCgpYCBvciBgc2V0KClgIG9uIGl0LiBJbiB0aGlzIGNh
c2UsIHlvdSBjYW4gdXNlIHRoaXMKLSAgICBtZXRob2QgYW5kIGBwcm9wZXJ0eVdpbGxDaGFuZ2Uo
KWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28gbWV0aG9kcwotICAgIHRvZ2V0aGVyIHdpbGwg
bm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5Ci0g
ICAgY2hhbmdlZCB2YWx1ZS4KLQotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBg
cHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAotICAgIGFzIGEgcGFp
ci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBv
dXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQg
bW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAgIGxpa2UuCi0KLSAgICBAbWV0aG9kIHByb3Bl
cnR5RGlkQ2hhbmdlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtl
eSB0aGF0IGhhcyBqdXN0IGNoYW5nZWQuCi0gICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0K
LSAgKi8KLSAgcHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICBFbWJl
ci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKLSAgICByZXR1cm4gdGhpczsKLSAg
fSwKLQotICAvKioKLSAgICBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxs
Q2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYCBpbgotICAgIHN1Y2Nlc3Npb24uCi0KLSAg
ICBAbWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5h
bWUgVGhlIHByb3BlcnR5IGtleSB0byBiZSBub3RpZmllZCBhYm91dC4KLSAgICBAcmV0dXJuIHtF
bWJlci5PYnNlcnZhYmxlfQotICAqLwotICBub3RpZnlQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24o
a2V5TmFtZSkgewotICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGtleU5hbWUpOwotICAgIHRo
aXMucHJvcGVydHlEaWRDaGFuZ2Uoa2V5TmFtZSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgYWRkQmVmb3JlT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAg
ICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdldCwgbWV0aG9kKTsKLSAg
fSwKLQotICAvKioKLSAgICBBZGRzIGFuIG9ic2VydmVyIG9uIGEgcHJvcGVydHkuCi0KLSAgICBU
aGlzIGlzIHRoZSBjb3JlIG1ldGhvZCB1c2VkIHRvIHJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBh
IHByb3BlcnR5LgotCi0gICAgT25jZSB5b3UgY2FsbCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhl
IGtleSdzIHZhbHVlIGlzIHNldCwgeW91ciBvYnNlcnZlcgotICAgIHdpbGwgYmUgbm90aWZpZWQu
IE5vdGUgdGhhdCB0aGUgb2JzZXJ2ZXJzIGFyZSB0cmlnZ2VyZWQgYW55IHRpbWUgdGhlCi0gICAg
dmFsdWUgaXMgc2V0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFzIGFjdHVhbGx5IGNoYW5n
ZWQuIFlvdXIKLSAgICBvYnNlcnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQu
Ci0KLSAgICBZb3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCBjb250ZXh0IHBhcmFtZXRlciB0
byB0aGlzIG1ldGhvZC4gVGhlCi0gICAgY29udGV4dCB3aWxsIGJlIHBhc3NlZCB0byB5b3VyIG9i
c2VydmVyIG1ldGhvZCB3aGVuZXZlciBpdCBpcyB0cmlnZ2VyZWQuCi0gICAgTm90ZSB0aGF0IGlm
IHlvdSBhZGQgdGhlIHNhbWUgdGFyZ2V0L21ldGhvZCBwYWlyIG9uIGEga2V5IG11bHRpcGxlIHRp
bWVzCi0gICAgd2l0aCBkaWZmZXJlbnQgY29udGV4dCBwYXJhbWV0ZXJzLCB5b3VyIG9ic2VydmVy
IHdpbGwgb25seSBiZSBjYWxsZWQgb25jZQotICAgIHdpdGggdGhlIGxhc3QgY29udGV4dCB5b3Ug
cGFzc2VkLgotCi0gICAgIyMjIE9ic2VydmVyIE1ldGhvZHMKLQotICAgIE9ic2VydmVyIG1ldGhv
ZHMgeW91IHBhc3Mgc2hvdWxkIGdlbmVyYWxseSBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJl
IGlmCi0gICAgeW91IGRvIG5vdCBwYXNzIGEgYGNvbnRleHRgIHBhcmFtZXRlcjoKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBmb29EaWRDaGFuZ2U6IGZ1bmN0aW9uKHNlbmRlciwga2V5LCB2YWx1
ZSwgcmV2KSB7IH07Ci0gICAgYGBgCi0KLSAgICBUaGUgc2VuZGVyIGlzIHRoZSBvYmplY3QgdGhh
dCBjaGFuZ2VkLiBUaGUga2V5IGlzIHRoZSBwcm9wZXJ0eSB0aGF0Ci0gICAgY2hhbmdlcy4gVGhl
IHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUgcmV2
Ci0gICAgaXMgdGhlIGxhc3QgcHJvcGVydHkgcmV2aXNpb24gb2YgdGhlIG9iamVjdCB3aGVuIGl0
IGNoYW5nZWQsIHdoaWNoIHlvdSBjYW4KLSAgICB1c2UgdG8gZGV0ZWN0IGlmIHRoZSBrZXkgdmFs
dWUgaGFzIHJlYWxseSBjaGFuZ2VkIG9yIG5vdC4KLQotICAgIElmIHlvdSBwYXNzIGEgYGNvbnRl
eHRgIHBhcmFtZXRlciwgdGhlIGNvbnRleHQgd2lsbCBiZSBwYXNzZWQgYmVmb3JlIHRoZQotICAg
IHJldmlzaW9uIGxpa2Ugc286Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZm9vRGlkQ2hhbmdl
OiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIGNvbnRleHQsIHJldikgeyB9OwotICAgIGBg
YAotCi0gICAgVXN1YWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0aGUgdmFsdWUsIGNvbnRleHQgb3Ig
cmV2aXNpb24gcGFyYW1ldGVycyBhdAotICAgIHRoZSBlbmQuIEluIHRoaXMgY2FzZSwgaXQgaXMg
Y29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0YWtlCi0gICAgb25seSBhIHNl
bmRlciBhbmQga2V5IHZhbHVlIGFzIHBhcmFtZXRlcnMgb3IsIGlmIHlvdSBhcmVuJ3QgaW50ZXJl
c3RlZCBpbgotICAgIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRvIHdyaXRlIGFuIG9ic2VydmVyIHRo
YXQgaGFzIG5vIHBhcmFtZXRlcnMgYXQgYWxsLgotCi0gICAgQG1ldGhvZCBhZGRPYnNlcnZlcgot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgotICAgIEBwYXJhbSB7
T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCi0gICAgQHBhcmFtIHtT
dHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBAcmV0dXJu
IHtFbWJlci5PYmplY3R9IHNlbGYKLSAgKi8KLSAgYWRkT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwg
dGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdl
dCwgbWV0aG9kKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmUgYW4gb2JzZXJ2ZXIgeW91IGhh
dmUgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIHRoaXMgb2JqZWN0LiBQYXNzCi0gICAgdGhlIHNh
bWUga2V5LCB0YXJnZXQsIGFuZCBtZXRob2QgeW91IHBhc3NlZCB0byBgYWRkT2JzZXJ2ZXIoKWAg
YW5kIHlvdXIKLSAgICB0YXJnZXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25z
LgotCi0gICAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkg
VGhlIGtleSB0byBvYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdl
dCBvYmplY3QgdG8gaW52b2tlCi0gICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBU
aGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfSByZWNl
aXZlcgotICAqLwotICByZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIG1ldGhv
ZCkgewotICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2Qp
OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3QgY3VycmVu
dGx5IGhhcyBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgYQotICAgIHBhcnRpY3VsYXIga2V5LiBZ
b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBwb3RlbnRpYWxseSBkZWZlciBwZXJmb3JtaW5nCi0g
ICAgYW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBzb21lb25lIGJlZ2lucyBvYnNlcnZpbmcgYSBw
YXJ0aWN1bGFyIHByb3BlcnR5Ci0gICAgb24gdGhlIG9iamVjdC4KLQotICAgIEBtZXRob2QgaGFz
T2JzZXJ2ZXJGb3IKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBjaGVjawotICAgIEBy
ZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhc09ic2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsK
LSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIGtleSsnOmNoYW5nZScpOwotICB9
LAotCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgb3IgYSBk
ZWZhdWx0IHZhbHVlIGluIHRoZSBjYXNlIHRoYXQgdGhlCi0gICAgcHJvcGVydHkgcmV0dXJucyBg
dW5kZWZpbmVkYC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBwZXJzb24uZ2V0V2l0aERlZmF1
bHQoJ2xhc3ROYW1lJywgJ0RvZScpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZXRXaXRoRGVm
YXVsdAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0
eSB0byByZXRyaWV2ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVl
IHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdW5kZWZpbmVkCi0gICAgQHJldHVy
biB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHRWYWx1ZS4KLSAgKi8K
LSAgZ2V0V2l0aERlZmF1bHQ6IGZ1bmN0aW9uKGtleU5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAg
IHJldHVybiBFbWJlci5nZXRXaXRoRGVmYXVsdCh0aGlzLCBrZXlOYW1lLCBkZWZhdWx0VmFsdWUp
OwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0byB0aGUg
Y3VycmVudCB2YWx1ZSBwbHVzIHNvbWUgYW1vdW50LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IHBlcnNvbi5pbmNyZW1lbnRQcm9wZXJ0eSgnYWdlJyk7Ci0gICAgdGVhbS5pbmNyZW1lbnRQcm9w
ZXJ0eSgnc2NvcmUnLCAyKTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgaW5jcmVtZW50UHJvcGVy
dHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkg
dG8gaW5jcmVtZW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGluY3JlbWVudCBUaGUgYW1vdW50IHRv
IGluY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQotICAgIEByZXR1cm4ge051bWJlcn0gVGhlIG5l
dyBwcm9wZXJ0eSB2YWx1ZQotICAqLwotICBpbmNyZW1lbnRQcm9wZXJ0eTogZnVuY3Rpb24oa2V5
TmFtZSwgaW5jcmVtZW50KSB7Ci0gICAgaWYgKEVtYmVyLmlzTm9uZShpbmNyZW1lbnQpKSB7IGlu
Y3JlbWVudCA9IDE7IH0KLSAgICBFbWJlci5hc3NlcnQoIk11c3QgcGFzcyBhIG51bWVyaWMgdmFs
dWUgdG8gaW5jcmVtZW50UHJvcGVydHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoaW5jcmVtZW50KSkg
JiYgaXNGaW5pdGUoaW5jcmVtZW50KSkpOwotICAgIHNldCh0aGlzLCBrZXlOYW1lLCAoZ2V0KHRo
aXMsIGtleU5hbWUpIHx8IDApICsgaW5jcmVtZW50KTsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGtl
eU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0
byB0aGUgY3VycmVudCB2YWx1ZSBtaW51cyBzb21lIGFtb3VudC4KLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBwbGF5ZXIuZGVjcmVtZW50UHJvcGVydHkoJ2xpdmVzJyk7Ci0gICAgb3JjLmRlY3Jl
bWVudFByb3BlcnR5KCdoZWFsdGgnLCA1KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGVjcmVt
ZW50UHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUg
cHJvcGVydHkgdG8gZGVjcmVtZW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGRlY3JlbWVudCBUaGUg
YW1vdW50IHRvIGRlY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQotICAgIEByZXR1cm4ge051bWJl
cn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQotICAqLwotICBkZWNyZW1lbnRQcm9wZXJ0eTogZnVu
Y3Rpb24oa2V5TmFtZSwgZGVjcmVtZW50KSB7Ci0gICAgaWYgKEVtYmVyLmlzTm9uZShkZWNyZW1l
bnQpKSB7IGRlY3JlbWVudCA9IDE7IH0KLSAgICBFbWJlci5hc3NlcnQoIk11c3QgcGFzcyBhIG51
bWVyaWMgdmFsdWUgdG8gZGVjcmVtZW50UHJvcGVydHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoZGVj
cmVtZW50KSkgJiYgaXNGaW5pdGUoZGVjcmVtZW50KSkpOwotICAgIHNldCh0aGlzLCBrZXlOYW1l
LCAoZ2V0KHRoaXMsIGtleU5hbWUpIHx8IDApIC0gZGVjcmVtZW50KTsKLSAgICByZXR1cm4gZ2V0
KHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBi
b29sZWFuIHByb3BlcnR5IHRvIHRoZSBvcHBvc2l0ZSBvZiBpdCdzCi0gICAgY3VycmVudCB2YWx1
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2Fy
cERyaXZlRW5nYWdlZCcpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB0b2dnbGVQcm9wZXJ0eQot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB0
b2dnbGUKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKLSAgKi8K
LSAgdG9nZ2xlUHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICBzZXQodGhpcywga2V5
TmFtZSwgIWdldCh0aGlzLCBrZXlOYW1lKSk7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCBrZXlOYW1l
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUgb2YgYSBjb21w
dXRlZCBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLgotICAgIFRoaXMgYWxsb3dzIHlvdSB0byBpbnNw
ZWN0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgd2l0aG91dCBhY2NpZGVu
dGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAgICBnZW5lcmF0ZWQg
bGF6aWx5LgotCi0gICAgQG1ldGhvZCBjYWNoZUZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlO
YW1lCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSBjb21wdXRl
ZCBwcm9wZXJ0eSwgaWYgYW55Ci0gICovCi0gIGNhY2hlRm9yOiBmdW5jdGlvbihrZXlOYW1lKSB7
Ci0gICAgcmV0dXJuIEVtYmVyLmNhY2hlRm9yKHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8v
IGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKLSAgb2JzZXJ2ZXJzRm9yS2V5OiBmdW5j
dGlvbihrZXlOYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLm9ic2VydmVyc0Zvcih0aGlzLCBrZXlO
YW1lKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1v
ZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLQotLy8gTk9URTog
dGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIGJlIGluY2x1ZGVkIGRpcmVjdGx5LiBJbnN0ZWFkIHVz
ZSBgRW1iZXIuT2JqZWN0YC4KLS8vIFdlIG9ubHkgZGVmaW5lIHRoaXMgc2VwYXJhdGVseSBzbyB0
aGF0IGBFbWJlci5TZXRgIGNhbiBkZXBlbmQgb24gaXQuCi0KLQotdmFyIHNldCA9IEVtYmVyLnNl
dCwgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG9f
ZGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwKLSAgICBHVUlE
X0tFWSA9IEVtYmVyLkdVSURfS0VZLAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAg
IGdlbmVyYXRlR3VpZCA9IEVtYmVyLmdlbmVyYXRlR3VpZCwKLSAgICBtZXRhID0gRW1iZXIubWV0
YSwKLSAgICByZXdhdGNoID0gRW1iZXIucmV3YXRjaCwKLSAgICBmaW5pc2hDaGFpbnMgPSBFbWJl
ci5maW5pc2hDaGFpbnMsCi0gICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50LAotICAgIGRl
c3Ryb3kgPSBFbWJlci5kZXN0cm95LAotICAgIHNjaGVkdWxlID0gRW1iZXIucnVuLnNjaGVkdWxl
LAotICAgIE1peGluID0gRW1iZXIuTWl4aW4sCi0gICAgYXBwbHlNaXhpbiA9IE1peGluLl9hcHBs
eSwKLSAgICBmaW5pc2hQYXJ0aWFsID0gTWl4aW4uZmluaXNoUGFydGlhbCwKLSAgICByZW9wZW4g
PSBNaXhpbi5wcm90b3R5cGUucmVvcGVuLAotICAgIE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5F
TlYuTUFOREFUT1JZX1NFVFRFUiwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmluZGV4T2Y7Ci0KLXZhciB1bmRlZmluZWREZXNjcmlwdG9yID0gewotICBjb25maWd1cmFibGU6
IHRydWUsCi0gIHdyaXRhYmxlOiB0cnVlLAotICBlbnVtZXJhYmxlOiBmYWxzZSwKLSAgdmFsdWU6
IHVuZGVmaW5lZAotfTsKLQotZnVuY3Rpb24gbWFrZUN0b3IoKSB7Ci0KLSAgLy8gTm90ZTogYXZv
aWQgYWNjZXNzaW5nIGFueSBwcm9wZXJ0aWVzIG9uIHRoZSBvYmplY3Qgc2luY2UgaXQgbWFrZXMg
dGhlCi0gIC8vIG1ldGhvZCBhIGxvdCBmYXN0ZXIuIFRoaXMgaXMgZ2x1ZSBjb2RlIHNvIHdlIHdh
bnQgaXQgdG8gYmUgYXMgZmFzdCBhcwotICAvLyBwb3NzaWJsZS4KLQotICB2YXIgd2FzQXBwbGll
ZCA9IGZhbHNlLCBpbml0TWl4aW5zLCBpbml0UHJvcGVydGllczsKLQotICB2YXIgQ2xhc3MgPSBm
dW5jdGlvbigpIHsKLSAgICBpZiAoIXdhc0FwcGxpZWQpIHsKLSAgICAgIENsYXNzLnByb3RvKCk7
IC8vIHByZXBhcmUgcHJvdG90eXBlLi4uCi0gICAgfQotICAgIG9fZGVmaW5lUHJvcGVydHkodGhp
cywgR1VJRF9LRVksIHVuZGVmaW5lZERlc2NyaXB0b3IpOwotICAgIG9fZGVmaW5lUHJvcGVydHko
dGhpcywgJ19zdXBlcicsIHVuZGVmaW5lZERlc2NyaXB0b3IpOwotICAgIHZhciBtID0gbWV0YSh0
aGlzKSwgcHJvdG8gPSBtLnByb3RvOwotICAgIG0ucHJvdG8gPSB0aGlzOwotICAgIGlmIChpbml0
TWl4aW5zKSB7Ci0gICAgICAvLyBjYXB0dXJlIGxvY2FsbHkgc28gd2UgY2FuIGNsZWFyIHRoZSBj
bG9zZWQgb3ZlciB2YXJpYWJsZQotICAgICAgdmFyIG1peGlucyA9IGluaXRNaXhpbnM7Ci0gICAg
ICBpbml0TWl4aW5zID0gbnVsbDsKLSAgICAgIHRoaXMucmVvcGVuLmFwcGx5KHRoaXMsIG1peGlu
cyk7Ci0gICAgfQotICAgIGlmIChpbml0UHJvcGVydGllcykgewotICAgICAgLy8gY2FwdHVyZSBs
b2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUgY2xvc2VkIG92ZXIgdmFyaWFibGUKLSAgICAgIHZh
ciBwcm9wcyA9IGluaXRQcm9wZXJ0aWVzOwotICAgICAgaW5pdFByb3BlcnRpZXMgPSBudWxsOwot
Ci0gICAgICB2YXIgY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJv
cGVydGllczsKLQotICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBs
OyBpKyspIHsKLSAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tpXTsKLQotICAgICAgICBF
bWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIG1peGlu
ZyBpbiBvdGhlciBkZWZpbml0aW9ucywgdXNlIGNyZWF0ZVdpdGhNaXhpbnMgaW5zdGVhZC4iLCAh
KHByb3BlcnRpZXMgaW5zdGFuY2VvZiBFbWJlci5NaXhpbikpOwotCi0gICAgICAgIGlmICh0eXBl
b2YgcHJvcGVydGllcyAhPT0gJ29iamVjdCcgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7
Ci0gICAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJFbWJlci5PYmplY3QuY3JlYXRlIG9u
bHkgYWNjZXB0cyBvYmplY3RzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwcm9wZXJ0
aWVzKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgdmFyIGtleU5hbWVzID0gRW1iZXIua2V5cyhw
cm9wZXJ0aWVzKTsKLQotICAgICAgICBmb3IgKHZhciBqID0gMCwgbGwgPSBrZXlOYW1lcy5sZW5n
dGg7IGogPCBsbDsgaisrKSB7Ci0gICAgICAgICAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1tqXTsK
LSAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5TmFtZSkpIHsgY29u
dGludWU7IH0KLQotICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BlcnRpZXNba2V5TmFtZV0sCi0g
ICAgICAgICAgICAgIElTX0JJTkRJTkcgPSBFbWJlci5JU19CSU5ESU5HOwotCi0gICAgICAgICAg
aWYgKElTX0JJTkRJTkcudGVzdChrZXlOYW1lKSkgewotICAgICAgICAgICAgdmFyIGJpbmRpbmdz
ID0gbS5iaW5kaW5nczsKLSAgICAgICAgICAgIGlmICghYmluZGluZ3MpIHsKLSAgICAgICAgICAg
ICAgYmluZGluZ3MgPSBtLmJpbmRpbmdzID0ge307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFt
Lmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICAgICAgICAgIGJpbmRpbmdzID0g
bS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3MpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgYmluZGluZ3Nba2V5TmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAg
ICB2YXIgZGVzYyA9IG0uZGVzY3Nba2V5TmFtZV07Ci0KLSAgICAgICAgICBFbWJlci5hc3NlcnQo
IkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIGRlZmluaW5nIGNvbXB1dGVk
IHByb3BlcnRpZXMuIiwgISh2YWx1ZSBpbnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkp
KTsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2Vy
IHN1cHBvcnRzIGRlZmluaW5nIG1ldGhvZHMgdGhhdCBjYWxsIF9zdXBlci4iLCAhKHR5cGVvZiB2
YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS50b1N0cmluZygpLmluZGV4T2YoJy5fc3VwZXIn
KSAhPT0gLTEpKTsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoImBhY3Rpb25zYCBtdXN0IGJlIHBy
b3ZpZGVkIGF0IGV4dGVuZCB0aW1lLCBub3QgYXQgY3JlYXRlICIgKwotICAgICAgICAgICAgICAg
ICAgICAgICAidGltZSwgd2hlbiBFbWJlci5BY3Rpb25IYW5kbGVyIGlzIHVzZWQgKGkuZS4gdmll
d3MsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbGxlcnMgJiByb3V0ZXMpLiIs
ICEoKGtleU5hbWUgPT09ICdhY3Rpb25zJykgJiYgRW1iZXIuQWN0aW9uSGFuZGxlci5kZXRlY3Qo
dGhpcykpKTsKLQotICAgICAgICAgIGlmIChjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzICYmIGluZGV4
T2YoY29uY2F0ZW5hdGVkUHJvcGVydGllcywga2V5TmFtZSkgPj0gMCkgewotICAgICAgICAgICAg
dmFyIGJhc2VWYWx1ZSA9IHRoaXNba2V5TmFtZV07Ci0KLSAgICAgICAgICAgIGlmIChiYXNlVmFs
dWUpIHsKLSAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBiYXNlVmFsdWUu
Y29uY2F0KSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBiYXNlVmFsdWUuY29uY2F0KHZhbHVl
KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEVtYmVy
Lm1ha2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHZhbHVlID0gRW1iZXIubWFrZUFycmF5
KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZGVz
YykgewotICAgICAgICAgICAgZGVzYy5zZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOwotICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0VW5rbm93blByb3Bl
cnR5ID09PSAnZnVuY3Rpb24nICYmICEoa2V5TmFtZSBpbiB0aGlzKSkgewotICAgICAgICAgICAg
ICB0aGlzLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9
IGVsc2UgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgICAgICAgRW1iZXIuZGVmaW5l
UHJvcGVydHkodGhpcywga2V5TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkg
c2V0dGVyCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0aGlzW2tleU5hbWVd
ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9
Ci0gICAgfQotICAgIGZpbmlzaFBhcnRpYWwodGhpcywgbSk7Ci0gICAgdGhpcy5pbml0LmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgbS5wcm90byA9IHByb3RvOwotICAgIGZpbmlzaENoYWlu
cyh0aGlzKTsKLSAgICBzZW5kRXZlbnQodGhpcywgImluaXQiKTsKLSAgfTsKLQotICBDbGFzcy50
b1N0cmluZyA9IE1peGluLnByb3RvdHlwZS50b1N0cmluZzsKLSAgQ2xhc3Mud2lsbFJlb3BlbiA9
IGZ1bmN0aW9uKCkgewotICAgIGlmICh3YXNBcHBsaWVkKSB7Ci0gICAgICBDbGFzcy5Qcm90b3R5
cGVNaXhpbiA9IE1peGluLmNyZWF0ZShDbGFzcy5Qcm90b3R5cGVNaXhpbik7Ci0gICAgfQotCi0g
ICAgd2FzQXBwbGllZCA9IGZhbHNlOwotICB9OwotICBDbGFzcy5faW5pdE1peGlucyA9IGZ1bmN0
aW9uKGFyZ3MpIHsgaW5pdE1peGlucyA9IGFyZ3M7IH07Ci0gIENsYXNzLl9pbml0UHJvcGVydGll
cyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdFByb3BlcnRpZXMgPSBhcmdzOyB9OwotCi0gIENsYXNz
LnByb3RvID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN1cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNs
YXNzOwotICAgIGlmIChzdXBlcmNsYXNzKSB7IHN1cGVyY2xhc3MucHJvdG8oKTsgfQotCi0gICAg
aWYgKCF3YXNBcHBsaWVkKSB7Ci0gICAgICB3YXNBcHBsaWVkID0gdHJ1ZTsKLSAgICAgIENsYXNz
LlByb3RvdHlwZU1peGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOwotICAgICAgcmV3
YXRjaChDbGFzcy5wcm90b3R5cGUpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLnByb3RvdHlw
ZTsKLSAgfTsKLQotICByZXR1cm4gQ2xhc3M7Ci0KLX0KLQotLyoqCi0gIEBjbGFzcyBDb3JlT2Jq
ZWN0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi12YXIgQ29yZU9iamVjdCA9IG1ha2VDdG9yKCk7
Ci1Db3JlT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuQ29yZU9i
amVjdCI7IH07Ci0KLUNvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4gPSBNaXhpbi5jcmVhdGUoewot
ICByZW9wZW46IGZ1bmN0aW9uKCkgewotICAgIGFwcGx5TWl4aW4odGhpcywgYXJndW1lbnRzLCB0
cnVlKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBBbiBvdmVycmlkYWJs
ZSBtZXRob2QgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLiBCeSBkZWZhdWx0
LAotICAgIGRvZXMgbm90aGluZyB1bmxlc3MgaXQgaXMgb3ZlcnJpZGRlbiBkdXJpbmcgY2xhc3Mg
ZGVmaW5pdGlvbi4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBw
LlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgaW5pdDogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIGFsZXJ0KCdOYW1lIGlzICcgKyB0aGlzLmdldCgnbmFtZScpKTsKLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIHZhciBzdGV2ZSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgIG5h
bWU6ICJTdGV2ZSIKLSAgICB9KTsKLQotICAgIC8vIGFsZXJ0cyAnTmFtZSBpcyBTdGV2ZScuCi0g
ICAgYGBgCi0KLSAgICBOT1RFOiBJZiB5b3UgZG8gb3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1l
d29yayBjbGFzcyBsaWtlIGBFbWJlci5WaWV3YCBvcgotICAgIGBFbWJlci5BcnJheUNvbnRyb2xs
ZXJgLCBiZSBzdXJlIHRvIGNhbGwgYHRoaXMuX3N1cGVyKClgIGluIHlvdXIKLSAgICBgaW5pdGAg
ZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVu
aXR5IHRvCi0gICAgZG8gaW1wb3J0YW50IHNldHVwIHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFu
Z2UgYmVoYXZpb3IgaW4geW91cgotICAgIGFwcGxpY2F0aW9uLgotCi0gICAgQG1ldGhvZCBpbml0
Ci0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkge30sCi0KLSAgLyoqCi0gICAgRGVmaW5lcyB0aGUg
cHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MK
LSAgICAoaW5zdGVhZCBvZiBvdmVycmlkZGVuKS4KLQotICAgIEJ5IGRlZmF1bHQsIHdoZW4geW91
IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3BlcnR5IGRlZmluZWQgaW4KLSAgICB0aGUgc3Vi
Y2xhc3Mgb3ZlcnJpZGVzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQgaXMgZGVm
aW5lZAotICAgIGluIHRoZSBzdXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNl
cyB3aGVyZSBpdCBpcyBwcmVmZXJhYmxlCi0gICAgdG8gYnVpbGQgdXAgYSBwcm9wZXJ0eSdzIHZh
bHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFzcycgcHJvcGVydHkKLSAgICB2YWx1ZSB3aXRo
IHRoZSBzdWJjbGFzcycgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ugd2l0aGluIEVt
YmVyCi0gICAgaXMgdGhlIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIuVmlld2AuCi0K
LSAgICBIZXJlIGlzIHNvbWUgc2FtcGxlIGNvZGUgc2hvd2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3
ZWVuIGEgY29uY2F0ZW5hdGVkCi0gICAgcHJvcGVydHkgYW5kIGEgbm9ybWFsIG9uZToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmFyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAg
ICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydiYXInXSwKLSAgICAgIGNsYXNzTmFt
ZXM6IFsnYmFyJ10KLSAgICB9KTsKLQotICAgIEFwcC5Gb29CYXJWaWV3ID0gQXBwLkJhclZpZXcu
ZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydmb28nXSwKLSAg
ICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCi0gICAgfSk7Ci0KLSAgICB2YXIgZm9vQmFyVmlldyA9
IEFwcC5Gb29CYXJWaWV3LmNyZWF0ZSgpOwotICAgIGZvb0JhclZpZXcuZ2V0KCdzb21lTm9uQ29u
Y2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydmb28nXQotICAgIGZvb0JhclZpZXcuZ2V0KCdjbGFz
c05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJ10KLSAgICBgYGAKLQotICAg
IFRoaXMgYmVoYXZpb3IgZXh0ZW5kcyB0byBvYmplY3QgY3JlYXRpb24gYXMgd2VsbC4gQ29udGlu
dWluZyB0aGUKLSAgICBhYm92ZSBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZh
ciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0
ZWRQcm9wZXJ0eTogWydiYXonXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnYmF6J10KLSAgICB9KQot
ICAgIHZpZXcuZ2V0KCdzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydiYXonXQot
ICAgIHZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9v
JywgJ2JheiddCi0gICAgYGBgCi0gICAgQWRkaW5nIGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgaXMg
bm90IGFuIGFycmF5IHdpbGwganVzdCBhZGQgaXQgaW4gdGhlIGFycmF5OgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIGNs
YXNzTmFtZXM6ICdiYXonCi0gICAgfSkKLSAgICB2aWV3LmdldCgnY2xhc3NOYW1lcycpOyAvLyBb
J2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbycsICdiYXonXQotICAgIGBgYAotCi0gICAgVXNpbmcg
dGhlIGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2UgY2FuIHRlbGwgdG8gRW1i
ZXIgdGhhdCBtaXgKLSAgICB0aGUgY29udGVudCBvZiB0aGUgcHJvcGVydGllcy4KLQotICAgIElu
IGBFbWJlci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJpbmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJpbmRp
bmdzYCBwcm9wZXJ0aWVzCi0gICAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlvbiB0
byBgY2xhc3NOYW1lc2AuCi0KLSAgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3Ug
dG8gdXNlIHRocm91Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKLSAgICBhbHRob3VnaCB0
eXBpY2FsIGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGluZnJlcXVlbnRseS4g
U2luY2UKLSAgICBpdCBjaGFuZ2VzIGV4cGVjdGF0aW9ucyBhYm91dCBiZWhhdmlvciBvZiBwcm9w
ZXJ0aWVzLCB5b3Ugc2hvdWxkIHByb3Blcmx5Ci0gICAgZG9jdW1lbnQgaXRzIHVzYWdlIGluIGVh
Y2ggaW5kaXZpZHVhbCBjb25jYXRlbmF0ZWQgcHJvcGVydHkgKHRvIG5vdAotICAgIG1pc2xlYWQg
eW91ciB1c2VycyB0byB0aGluayB0aGV5IGNhbiBvdmVycmlkZSB0aGUgcHJvcGVydHkgaW4gYSBz
dWJjbGFzcykuCi0KLSAgICBAcHJvcGVydHkgY29uY2F0ZW5hdGVkUHJvcGVydGllcwotICAgIEB0
eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb25jYXRlbmF0ZWRQcm9wZXJ0
aWVzOiBudWxsLAotCi0gIC8qKgotICAgIERlc3Ryb3llZCBvYmplY3QgcHJvcGVydHkgZmxhZy4K
LQotICAgIGlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSBvYnNlcnZlcnMgYW5kIGJpbmRp
bmdzIHdlcmUgYWxyZWFkeQotICAgIHJlbW92ZWQgYnkgdGhlIGVmZmVjdCBvZiBjYWxsaW5nIHRo
ZSBgZGVzdHJveSgpYCBtZXRob2QuCi0KLSAgICBAcHJvcGVydHkgaXNEZXN0cm95ZWQKLSAgICBA
ZGVmYXVsdCBmYWxzZQotICAqLwotICBpc0Rlc3Ryb3llZDogZmFsc2UsCi0KLSAgLyoqCi0gICAg
RGVzdHJ1Y3Rpb24gc2NoZWR1bGVkIGZsYWcuIFRoZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJl
ZW4gY2FsbGVkLgotCi0gICAgVGhlIG9iamVjdCBzdGF5cyBpbnRhY3QgdW50aWwgdGhlIGVuZCBv
ZiB0aGUgcnVuIGxvb3AgYXQgd2hpY2ggcG9pbnQKLSAgICB0aGUgYGlzRGVzdHJveWVkYCBmbGFn
IGlzIHNldC4KLQotICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3lpbmcKLSAgICBAZGVmYXVsdCBmYWxz
ZQotICAqLwotICBpc0Rlc3Ryb3lpbmc6IGZhbHNlLAotCi0gIC8qKgotICAgIERlc3Ryb3lzIGFu
IG9iamVjdCBieSBzZXR0aW5nIHRoZSBgaXNEZXN0cm95ZWRgIGZsYWcgYW5kIHJlbW92aW5nIGl0
cwotICAgIG1ldGFkYXRhLCB3aGljaCBlZmZlY3RpdmVseSBkZXN0cm95cyBvYnNlcnZlcnMgYW5k
IGJpbmRpbmdzLgotCi0gICAgSWYgeW91IHRyeSB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhIGRlc3Ry
b3llZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCi0gICAgcmFpc2VkLgotCi0gICAgTm90
ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGVuZCBvZiB0aGUgcnVuIGxv
b3AgYW5kIGRvZXMgbm90Ci0gICAgaGFwcGVuIGltbWVkaWF0ZWx5LiAgSXQgd2lsbCBzZXQgYW4g
aXNEZXN0cm95aW5nIGZsYWcgaW1tZWRpYXRlbHkuCi0KLSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAg
ICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0
aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLSAgICB0aGlz
LmlzRGVzdHJveWluZyA9IHRydWU7Ci0KLSAgICBzY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRo
aXMud2lsbERlc3Ryb3kpOwotICAgIHNjaGVkdWxlKCdkZXN0cm95JywgdGhpcywgdGhpcy5fc2No
ZWR1bGVkRGVzdHJveSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT3Zl
cnJpZGUgdG8gaW1wbGVtZW50IHRlYXJkb3duLgotCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQot
ICAgKi8KLSAgd2lsbERlc3Ryb3k6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgSW52b2tlZCBieSB0
aGUgcnVuIGxvb3AgdG8gYWN0dWFsbHkgZGVzdHJveSB0aGUgb2JqZWN0LiBUaGlzIGlzCi0gICAg
c2NoZWR1bGVkIGZvciBleGVjdXRpb24gYnkgdGhlIGBkZXN0cm95YCBtZXRob2QuCi0KLSAgICBA
cHJpdmF0ZQotICAgIEBtZXRob2QgX3NjaGVkdWxlZERlc3Ryb3kKLSAgKi8KLSAgX3NjaGVkdWxl
ZERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7IHJldHVy
bjsgfQotICAgIGRlc3Ryb3kodGhpcyk7Ci0gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7Ci0g
IH0sCi0KLSAgYmluZDogZnVuY3Rpb24odG8sIGZyb20pIHsKLSAgICBpZiAoIShmcm9tIGluc3Rh
bmNlb2YgRW1iZXIuQmluZGluZykpIHsgZnJvbSA9IEVtYmVyLkJpbmRpbmcuZnJvbShmcm9tKTsg
fQotICAgIGZyb20udG8odG8pLmNvbm5lY3QodGhpcyk7Ci0gICAgcmV0dXJuIGZyb207Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGljaCBhdHRl
bXB0cyB0byBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24KLSAgICB0aGFuIEphdmFzY3JpcHQncyBg
dG9TdHJpbmdgIHR5cGljYWxseSBkb2VzLCBpbiBhIGdlbmVyaWMgd2F5IGZvciBhbGwgRW1iZXIK
LSAgICBvYmplY3RzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5QZXJzb24gPSBFbS5P
YmplY3QuZXh0ZW5kKCkKLSAgICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCi0gICAgcGVy
c29uLnRvU3RyaW5nKCkgLy89PiAiPEFwcC5QZXJzb246ZW1iZXIxMDI0PiIKLSAgICBgYGAKLQot
ICAgIElmIHRoZSBvYmplY3QncyBjbGFzcyBpcyBub3QgZGVmaW5lZCBvbiBhbiBFbWJlciBuYW1l
c3BhY2UsIGl0IHdpbGwKLSAgICBpbmRpY2F0ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdp
c3RlcmVkIHN1cGVyY2xhc3M6Ci0KLSAgIGBgYGphdmFzY3JpcHQKLSAgICBTdHVkZW50ID0gQXBw
LlBlcnNvbi5leHRlbmQoKQotICAgIHN0dWRlbnQgPSBTdHVkZW50LmNyZWF0ZSgpCi0gICAgc3R1
ZGVudC50b1N0cmluZygpIC8vPT4gIjwoc3ViY2xhc3Mgb2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1
PiIKLSAgICBgYGAKLQotICAgIElmIHRoZSBtZXRob2QgYHRvU3RyaW5nRXh0ZW5zaW9uYCBpcyBk
ZWZpbmVkLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUKLSAgICBpbmNsdWRlZCBpbiB0aGUgb3V0
cHV0LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5l
eHRlbmQoewotICAgICAgdG9TdHJpbmdFeHRlbnNpb246IGZ1bmN0aW9uKCkgewotICAgICAgICBy
ZXR1cm4gdGhpcy5nZXQoJ2Z1bGxOYW1lJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgdGVhY2hl
ciA9IEFwcC5UZWFjaGVyLmNyZWF0ZSgpCi0gICAgdGVhY2hlci50b1N0cmluZygpOyAvLz0+ICI8
QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxlPiIKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
dG9TdHJpbmcKLSAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbgotICAq
LwotICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7Ci0gICAgdmFyIGhhc1RvU3RyaW5n
RXh0ZW5zaW9uID0gdHlwZW9mIHRoaXMudG9TdHJpbmdFeHRlbnNpb24gPT09ICdmdW5jdGlvbics
Ci0gICAgICAgIGV4dGVuc2lvbiA9IGhhc1RvU3RyaW5nRXh0ZW5zaW9uID8gIjoiICsgdGhpcy50
b1N0cmluZ0V4dGVuc2lvbigpIDogJyc7Ci0gICAgdmFyIHJldCA9ICc8Jyt0aGlzLmNvbnN0cnVj
dG9yLnRvU3RyaW5nKCkrJzonK2d1aWRGb3IodGhpcykrZXh0ZW5zaW9uKyc+JzsKLSAgICB0aGlz
LnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfSk7
Ci0KLUNvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmpl
Y3Q7Ci0KLWZ1bmN0aW9uIG1ha2VUb1N0cmluZyhyZXQpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkg
eyByZXR1cm4gcmV0OyB9OwotfQotCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBl
TWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBlTWl4aW4oQ29yZU9iamVj
dC5Qcm90b3R5cGVNaXhpbik7Ci19Ci0KLUNvcmVPYmplY3QuX19zdXBlcl9fID0gbnVsbDsKLQot
dmFyIENsYXNzTWl4aW4gPSBNaXhpbi5jcmVhdGUoewotCi0gIENsYXNzTWl4aW46IEVtYmVyLnJl
cXVpcmVkKCksCi0KLSAgUHJvdG90eXBlTWl4aW46IEVtYmVyLnJlcXVpcmVkKCksCi0KLSAgaXND
bGFzczogdHJ1ZSwKLQotICBpc01ldGhvZDogZmFsc2UsCi0KLSAgLyoqCi0gICAgQ3JlYXRlcyBh
IG5ldyBzdWJjbGFzcy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUGVyc29uID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBzYXk6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgICAg
IGFsZXJ0KHRoaW5nKTsKLSAgICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGRl
ZmluZXMgYSBuZXcgc3ViY2xhc3Mgb2YgRW1iZXIuT2JqZWN0OiBgQXBwLlBlcnNvbmAuIEl0IGNv
bnRhaW5zIG9uZSBtZXRob2Q6IGBzYXkoKWAuCi0KLSAgICBZb3UgY2FuIGFsc28gY3JlYXRlIGEg
c3ViY2xhc3MgZnJvbSBhbnkgZXhpc3RpbmcgY2xhc3MgYnkgY2FsbGluZyBpdHMgYGV4dGVuZCgp
YCAgbWV0aG9kLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc3ViY2xh
c3Mgb2YgRW1iZXIncyBidWlsdC1pbiBgRW1iZXIuVmlld2AgY2xhc3M6Ci0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLlBlcnNvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0
YWdOYW1lOiAnbGknLAotICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNBZG1pbmlzdHJhdG9y
J10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFdoZW4gZGVmaW5pbmcgYSBzdWJjbGFzcywgeW91
IGNhbiBvdmVycmlkZSBtZXRob2RzIGJ1dCBzdGlsbCBhY2Nlc3MgdGhlIGltcGxlbWVudGF0aW9u
IG9mIHlvdXIgcGFyZW50IGNsYXNzIGJ5IGNhbGxpbmcgdGhlIHNwZWNpYWwgYF9zdXBlcigpYCBt
ZXRob2Q6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgewotICAgICAgICB2YXIgbmFt
ZSA9IHRoaXMuZ2V0KCduYW1lJyk7Ci0gICAgICAgIGFsZXJ0KG5hbWUgKyAnIHNheXM6ICcgKyB0
aGluZyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBBcHAuU29sZGllciA9IEFwcC5QZXJzb24u
ZXh0ZW5kKHsKLSAgICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKLSAgICAgICAgdGhpcy5fc3Vw
ZXIodGhpbmcgKyAiLCBzaXIhIik7Ci0gICAgICB9LAotICAgICAgbWFyY2g6IGZ1bmN0aW9uKG51
bWJlck9mSG91cnMpIHsKLSAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgbWFyY2hl
cyBmb3IgJyArIG51bWJlck9mSG91cnMgKyAnIGhvdXJzLicpCi0gICAgICB9Ci0gICAgfSk7Ci0K
LSAgICB2YXIgeWVodWRhID0gQXBwLlNvbGRpZXIuY3JlYXRlKHsKLSAgICAgIG5hbWU6ICJZZWh1
ZGEgS2F0eiIKLSAgICB9KTsKLQotICAgIHllaHVkYS5zYXkoIlllcyIpOyAgLy8gYWxlcnRzICJZ
ZWh1ZGEgS2F0eiBzYXlzOiBZZXMsIHNpciEiCi0gICAgYGBgCi0KLSAgICBUaGUgYGNyZWF0ZSgp
YCBvbiBsaW5lICMxNyBjcmVhdGVzIGFuICppbnN0YW5jZSogb2YgdGhlIGBBcHAuU29sZGllcmAg
Y2xhc3MuIFRoZSBgZXh0ZW5kKClgIG9uIGxpbmUgIzggY3JlYXRlcyBhICpzdWJjbGFzcyogb2Yg
YEFwcC5QZXJzb25gLiBBbnkgaW5zdGFuY2Ugb2YgdGhlIGBBcHAuUGVyc29uYCBjbGFzcyB3aWxs
ICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRob2QuCi0KLSAgICBZb3UgY2FuIGFsc28gcGFz
cyBgRW1iZXIuTWl4aW5gIGNsYXNzZXMgdG8gYWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0
aGUgc3ViY2xhc3MuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoewotICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgewotICAgICAgICBh
bGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBzYXlzOiAnICsgdGhpbmcpOwotICAgICAgfQotICAg
IH0pOwotCi0gICAgQXBwLlNpbmdpbmdNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAg
ICBzaW5nOiBmdW5jdGlvbih0aGluZyl7Ci0gICAgICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykg
KyAnIHNpbmdzOiBsYSBsYSBsYSAnICsgdGhpbmcpOwotICAgICAgfQotICAgIH0pOwotCi0gICAg
QXBwLkJyb2Fkd2F5U3RhciA9IEFwcC5QZXJzb24uZXh0ZW5kKEFwcC5TaW5naW5nTWl4aW4sIHsK
LSAgICAgIGRhbmNlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUn
KSArICcgZGFuY2VzOiB0YXAgdGFwIHRhcCB0YXAgJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBUaGUgYEFwcC5Ccm9hZHdheVN0YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1l
dGhvZHM6IGBzYXkoKWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClgLgotCi0gICAgQG1ldGhvZCBl
eHRlbmQKLSAgICBAc3RhdGljCi0KLSAgICBAcGFyYW0ge0VtYmVyLk1peGlufSBbbWl4aW5zXSog
T25lIG9yIG1vcmUgRW1iZXIuTWl4aW4gY2xhc3NlcwotICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJn
dW1lbnRzXSogT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBj
bGFzcwotICAqLwotICBleHRlbmQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBDbGFzcyA9IG1ha2VD
dG9yKCksIHByb3RvOwotICAgIENsYXNzLkNsYXNzTWl4aW4gPSBNaXhpbi5jcmVhdGUodGhpcy5D
bGFzc01peGluKTsKLSAgICBDbGFzcy5Qcm90b3R5cGVNaXhpbiA9IE1peGluLmNyZWF0ZSh0aGlz
LlByb3RvdHlwZU1peGluKTsKLQotICAgIENsYXNzLkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3Rv
ciA9IENsYXNzOwotICAgIENsYXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBD
bGFzczsKLQotICAgIHJlb3Blbi5hcHBseShDbGFzcy5Qcm90b3R5cGVNaXhpbiwgYXJndW1lbnRz
KTsKLQotICAgIENsYXNzLnN1cGVyY2xhc3MgPSB0aGlzOwotICAgIENsYXNzLl9fc3VwZXJfXyAg
PSB0aGlzLnByb3RvdHlwZTsKLQotICAgIHByb3RvID0gQ2xhc3MucHJvdG90eXBlID0gb19jcmVh
dGUodGhpcy5wcm90b3R5cGUpOwotICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQ2xhc3M7Ci0gICAg
Z2VuZXJhdGVHdWlkKHByb3RvKTsKLSAgICBtZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0
aGlzIHdpbGwgZGlzYWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCi0KLSAgICBDbGFzcy5DbGFz
c01peGluLmFwcGx5KENsYXNzKTsKLSAgICByZXR1cm4gQ2xhc3M7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgRXF1aXZhbGVudCB0byBkb2luZyBgZXh0ZW5kKGFyZ3VtZW50cykuY3JlYXRlKClgLgotICAg
IElmIHBvc3NpYmxlIHVzZSB0aGUgbm9ybWFsIGBjcmVhdGVgIG1ldGhvZCBpbnN0ZWFkLgotCi0g
ICAgQG1ldGhvZCBjcmVhdGVXaXRoTWl4aW5zCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSBbYXJn
dW1lbnRzXSoKLSAgKi8KLSAgY3JlYXRlV2l0aE1peGluczogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdE1peGlu
cyhhcmd1bWVudHMpOyB9Ci0gICAgcmV0dXJuIG5ldyBDKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
Q3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLiBBY2NlcHRzIGVpdGhlciBubyBhcmd1bWVu
dHMsIG9yIGFuIG9iamVjdAotICAgIGNvbnRhaW5pbmcgdmFsdWVzIHRvIGluaXRpYWxpemUgdGhl
IG5ld2x5IGluc3RhbnRpYXRlZCBvYmplY3Qgd2l0aC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBoZWxsb1dvcmxkOiBm
dW5jdGlvbigpIHsKLSAgICAgICAgYWxlcnQoIkhpLCBteSBuYW1lIGlzICIgKyB0aGlzLmdldCgn
bmFtZScpKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHZhciB0b20gPSBBcHAuUGVyc29uLmNy
ZWF0ZSh7Ci0gICAgICBuYW1lOiAnVG9tIERhbGUnCi0gICAgfSk7Ci0KLSAgICB0b20uaGVsbG9X
b3JsZCgpOyAvLyBhbGVydHMgIkhpLCBteSBuYW1lIGlzIFRvbSBEYWxlIi4KLSAgICBgYGAKLQot
ICAgIGBjcmVhdGVgIHdpbGwgY2FsbCB0aGUgYGluaXRgIGZ1bmN0aW9uIGlmIGRlZmluZWQgZHVy
aW5nCi0gICAgYEVtYmVyLkFueU9iamVjdC5leHRlbmRgCi0KLSAgICBJZiBubyBhcmd1bWVudHMg
YXJlIHBhc3NlZCB0byBgY3JlYXRlYCwgaXQgd2lsbCBub3Qgc2V0IHZhbHVlcyB0byB0aGUgbmV3
Ci0gICAgaW5zdGFuY2UgZHVyaW5nIGluaXRpYWxpemF0aW9uOgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIHZhciBub05hbWUgPSBBcHAuUGVyc29uLmNyZWF0ZSgpOwotICAgIG5vTmFtZS5oZWxs
b1dvcmxkKCk7IC8vIGFsZXJ0cyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIE5PVEU6IEZvciBw
ZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgY2Fubm90IGRlY2xhcmUgbWV0aG9kcyBvciBjb21wdXRl
ZAotICAgIHByb3BlcnRpZXMgZHVyaW5nIGBjcmVhdGVgLiBZb3Ugc2hvdWxkIGluc3RlYWQgZGVj
bGFyZSBtZXRob2RzIGFuZCBjb21wdXRlZAotICAgIHByb3BlcnRpZXMgd2hlbiB1c2luZyBgZXh0
ZW5kYCBvciB1c2UgdGhlIGBjcmVhdGVXaXRoTWl4aW5zYCBzaG9ydGhhbmQuCi0KLSAgICBAbWV0
aG9kIGNyZWF0ZQotICAgIEBzdGF0aWMKLSAgICBAcGFyYW0gW2FyZ3VtZW50c10qCi0gICovCi0g
IGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdFByb3BlcnRpZXMoYXJndW1lbnRzKTsgfQotICAgIHJl
dHVybiBuZXcgQygpOwotICB9LAotCi0gIC8qKgotICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3In
cyBwcm90b3R5cGUgd2l0aCBhZGRpdGlvbmFsCi0gICAgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25z
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0JwotICAgIH0pOwotCi0gICAgbyA9IE15T2JqZWN0
LmNyZWF0ZSgpOwotICAgIG8uZ2V0KCduYW1lJyk7IC8vICdhbiBvYmplY3QnCi0KLSAgICBNeU9i
amVjdC5yZW9wZW4oewotICAgICAgc2F5OiBmdW5jdGlvbihtc2cpewotICAgICAgICBjb25zb2xl
LmxvZyhtc2cpOwotICAgICAgfQotICAgIH0pCi0KLSAgICBvMiA9IE15T2JqZWN0LmNyZWF0ZSgp
OwotICAgIG8yLnNheSgiaGVsbG8iKTsgLy8gbG9ncyAiaGVsbG8iCi0KLSAgICBvLnNheSgiZ29v
ZGJ5ZSIpOyAvLyBsb2dzICJnb29kYnllIgotICAgIGBgYAotCi0gICAgVG8gYWRkIGZ1bmN0aW9u
cyBhbmQgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0b3IgaXRzZWxmLAotICAgIHNlZSBgcmVv
cGVuQ2xhc3NgCi0KLSAgICBAbWV0aG9kIHJlb3BlbgotICAqLwotICByZW9wZW46IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMud2lsbFJlb3BlbigpOwotICAgIHJlb3Blbi5hcHBseSh0aGlzLlByb3Rv
dHlwZU1peGluLCBhcmd1bWVudHMpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgot
ICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3IncyBvd24gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25z
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0JwotICAgIH0pOwotCi0gICAgTXlPYmplY3QucmVv
cGVuQ2xhc3MoewotICAgICAgY2FuQnVpbGQ6IGZhbHNlCi0gICAgfSk7Ci0KLSAgICBNeU9iamVj
dC5jYW5CdWlsZDsgLy8gZmFsc2UKLSAgICBvID0gTXlPYmplY3QuY3JlYXRlKCk7Ci0gICAgYGBg
Ci0KLSAgICBJbiBvdGhlciB3b3JkcywgdGhpcyBjcmVhdGVzIHN0YXRpYyBwcm9wZXJ0aWVzIGFu
ZCBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcy4gVGhlc2UgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIHRo
ZSBjbGFzcwotICAgIGFuZCBub3Qgb24gYW55IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewot
ICAgICAgbmFtZSA6ICIiLAotICAgICAgc2F5SGVsbG8gOiBmdW5jdGlvbigpewotICAgICAgICBh
bGVydCgiSGVsbG8uIE15IG5hbWUgaXMgIiArIHRoaXMuZ2V0KCduYW1lJykpOwotICAgICAgfQot
ICAgIH0pOwotCi0gICAgQXBwLlBlcnNvbi5yZW9wZW5DbGFzcyh7Ci0gICAgICBzcGVjaWVzIDog
IkhvbW8gc2FwaWVucyIsCi0gICAgICBjcmVhdGVQZXJzb246IGZ1bmN0aW9uKG5ld1BlcnNvbnNO
YW1lKXsKLSAgICAgICAgcmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgICAgICBuYW1l
Om5ld1BlcnNvbnNOYW1lCi0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotCi0gICAgdmFy
IHRvbSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgIG5hbWUgOiAiVG9tIERhbGUiCi0gICAg
fSk7Ci0gICAgdmFyIHllaHVkYSA9IEFwcC5QZXJzb24uY3JlYXRlUGVyc29uKCJZZWh1ZGEgS2F0
eiIpOwotCi0gICAgdG9tLnNheUhlbGxvKCk7IC8vICJIZWxsby4gTXkgbmFtZSBpcyBUb20gRGFs
ZSIKLSAgICB5ZWh1ZGEuc2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBL
YXR6IgotICAgIGFsZXJ0KEFwcC5QZXJzb24uc3BlY2llcyk7IC8vICJIb21vIHNhcGllbnMiCi0g
ICAgYGBgCi0KLSAgICBOb3RlIHRoYXQgYHNwZWNpZXNgIGFuZCBgY3JlYXRlUGVyc29uYCBhcmUg
Km5vdCogdmFsaWQgb24gdGhlIGB0b21gIGFuZCBgeWVodWRhYAotICAgIHZhcmlhYmxlcy4gVGhl
eSBhcmUgb25seSB2YWxpZCBvbiBgQXBwLlBlcnNvbmAuCi0KLSAgICBUbyBhZGQgZnVuY3Rpb25z
IGFuZCBwcm9wZXJ0aWVzIHRvIGluc3RhbmNlcyBvZgotICAgIGEgY29uc3RydWN0b3IgYnkgZXh0
ZW5kaW5nIHRoZSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZQotICAgIHNlZSBgcmVvcGVuYAotCi0g
ICAgQG1ldGhvZCByZW9wZW5DbGFzcwotICAqLwotICByZW9wZW5DbGFzczogZnVuY3Rpb24oKSB7
Ci0gICAgcmVvcGVuLmFwcGx5KHRoaXMuQ2xhc3NNaXhpbiwgYXJndW1lbnRzKTsKLSAgICBhcHBs
eU1peGluKHRoaXMsIGFyZ3VtZW50cywgZmFsc2UpOwotICAgIHJldHVybiB0aGlzOwotICB9LAot
Ci0gIGRldGVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVv
ZiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgd2hpbGUob2JqKSB7Ci0gICAgICBpZiAob2Jq
PT09dGhpcykgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgb2JqID0gb2JqLnN1cGVyY2xhc3M7Ci0g
ICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLQotICBkZXRlY3RJbnN0YW5jZTogZnVuY3Rp
b24ob2JqKSB7Ci0gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHRoaXM7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHBy
b3BlcnRpZXMgd2l0aCBhZGRpdGlvbmFsCi0gICAgbWV0YWRhdGEgYWJvdXQgaG93IHRoZXkgZnVu
Y3Rpb24gb3Igd2hhdCB2YWx1ZXMgdGhleSBvcGVyYXRlIG9uLiBGb3IKLSAgICBleGFtcGxlLCBj
b21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgdmFyaWFibGVzIHRoYXQg
YXJlIHRoZW4KLSAgICBubyBsb25nZXIgYXZhaWxhYmxlIGZvciBpbnRyb3NwZWN0aW9uLgotCi0g
ICAgWW91IGNhbiBwYXNzIGEgaGFzaCBvZiB0aGVzZSB2YWx1ZXMgdG8gYSBjb21wdXRlZCBwcm9w
ZXJ0eSBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uOiBmdW5jdGlv
bigpIHsKLSAgICAgIHZhciBwZXJzb25JZCA9IHRoaXMuZ2V0KCdwZXJzb25JZCcpOwotICAgICAg
cmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsgaWQ6IHBlcnNvbklkIH0pOwotICAgIH0ucHJvcGVy
dHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNvbiB9KQotICAgIGBgYAotCi0gICAgT25jZSB5b3Un
dmUgZG9uZSB0aGlzLCB5b3UgY2FuIHJldHJpZXZlIHRoZSB2YWx1ZXMgc2F2ZWQgdG8gdGhlIGNv
bXB1dGVkCi0gICAgcHJvcGVydHkgZnJvbSB5b3VyIGNsYXNzIGxpa2UgdGhpczoKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBNeUNsYXNzLm1ldGFGb3JQcm9wZXJ0eSgncGVyc29uJyk7Ci0gICAg
YGBgCi0KLSAgICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBoYXNoIHRoYXQgd2FzIHBh
c3NlZCB0byBgbWV0YSgpYC4KLQotICAgIEBtZXRob2QgbWV0YUZvclByb3BlcnR5Ci0gICAgQHBh
cmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lCi0gICovCi0gIG1ldGFGb3JQcm9wZXJ0eTog
ZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIGRlc2MgPSBtZXRhKHRoaXMucHJvdG8oKSwgZmFsc2Up
LmRlc2NzW2tleV07Ci0KLSAgICBFbWJlci5hc3NlcnQoIm1ldGFGb3JQcm9wZXJ0eSgpIGNvdWxk
IG5vdCBmaW5kIGEgY29tcHV0ZWQgcHJvcGVydHkgd2l0aCBrZXkgJyIra2V5KyInLiIsICEhZGVz
YyAmJiBkZXNjIGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSk7Ci0gICAgcmV0dXJu
IGRlc2MuX21ldGEgfHwge307Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVyIGVhY2gg
Y29tcHV0ZWQgcHJvcGVydHkgZm9yIHRoZSBjbGFzcywgcGFzc2luZyBpdHMgbmFtZQotICAgIGFu
ZCBhbnkgYXNzb2NpYXRlZCBtZXRhZGF0YSAoc2VlIGBtZXRhRm9yUHJvcGVydHlgKSB0byB0aGUg
Y2FsbGJhY2suCi0KLSAgICBAbWV0aG9kIGVhY2hDb21wdXRlZFByb3BlcnR5Ci0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcGFyYW0ge09iamVjdH0gYmluZGluZwotICAqLwot
ICBlYWNoQ29tcHV0ZWRQcm9wZXJ0eTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAg
ICB2YXIgcHJvdG8gPSB0aGlzLnByb3RvKCksCi0gICAgICAgIGRlc2NzID0gbWV0YShwcm90byku
ZGVzY3MsCi0gICAgICAgIGVtcHR5ID0ge30sCi0gICAgICAgIHByb3BlcnR5OwotCi0gICAgZm9y
ICh2YXIgbmFtZSBpbiBkZXNjcykgewotICAgICAgcHJvcGVydHkgPSBkZXNjc1tuYW1lXTsKLQot
ICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkgewot
ICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcgfHwgdGhpcywgbmFtZSwgcHJvcGVydHkuX21l
dGEgfHwgZW1wdHkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi19KTsKLQotQ2xhc3NNaXhpbi5v
d25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsKLQotaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlk
ZUNsYXNzTWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQ2xhc3NNaXhpbihDbGFzc01p
eGluKTsKLX0KLQotQ29yZU9iamVjdC5DbGFzc01peGluID0gQ2xhc3NNaXhpbjsKLUNsYXNzTWl4
aW4uYXBwbHkoQ29yZU9iamVjdCk7Ci0KLUVtYmVyLkNvcmVPYmplY3QgPSBDb3JlT2JqZWN0Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLS8qKgotICBgRW1iZXIuT2JqZWN0YCBpcyB0aGUgbWFp
biBiYXNlIGNsYXNzIGZvciBhbGwgRW1iZXIgb2JqZWN0cy4gSXQgaXMgYSBzdWJjbGFzcwotICBv
ZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0aCB0aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFw
cGxpZWQuIEZvciBkZXRhaWxzLAotICBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggb2Yg
dGhlc2UuCi0KLSAgQGNsYXNzIE9iamVjdAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRz
IEVtYmVyLkNvcmVPYmplY3QKLSAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQotKi8KLUVtYmVyLk9i
amVjdCA9IEVtYmVyLkNvcmVPYmplY3QuZXh0ZW5kKEVtYmVyLk9ic2VydmFibGUpOwotRW1iZXIu
T2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuT2JqZWN0IjsgfTsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpbmRleE9mID0g
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKLQotLyoqCi0gIEEgTmFtZXNwYWNlIGlzIGFu
IG9iamVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFpbiBvdGhlciBvYmplY3RzIG9yIG1ldGhvZHMK
LSAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFtZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFj
ZSBhbnl0aW1lIHlvdSB3YW50Ci0gIHRvIGRlZmluZSBvbmUgb2YgdGhlc2UgbmV3IGNvbnRhaW5l
cnMuCi0KLSAgIyBFeGFtcGxlIFVzYWdlCi0KLSAgYGBgamF2YXNjcmlwdAotICBNeUZyYW1ld29y
ayA9IEVtYmVyLk5hbWVzcGFjZS5jcmVhdGUoewotICAgIFZFUlNJT046ICcxLjAuMCcKLSAgfSk7
Ci0gIGBgYAotCi0gIEBjbGFzcyBOYW1lc3BhY2UKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKLSovCi12YXIgTmFtZXNwYWNlID0gRW1iZXIuTmFtZXNwYWNlID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gIGlzTmFtZXNwYWNlOiB0cnVlLAotCi0gIGluaXQ6IGZ1
bmN0aW9uKCkgewotICAgIEVtYmVyLk5hbWVzcGFjZS5OQU1FU1BBQ0VTLnB1c2godGhpcyk7Ci0g
ICAgRW1iZXIuTmFtZXNwYWNlLlBST0NFU1NFRCA9IGZhbHNlOwotICB9LAotCi0gIHRvU3RyaW5n
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOwotICAgIGlm
IChuYW1lKSB7IHJldHVybiBuYW1lOyB9Ci0KLSAgICBmaW5kTmFtZXNwYWNlcygpOwotICAgIHJl
dHVybiB0aGlzW0VtYmVyLkdVSURfS0VZKydfbmFtZSddOwotICB9LAotCi0gIG5hbWVDbGFzc2Vz
OiBmdW5jdGlvbigpIHsKLSAgICBwcm9jZXNzTmFtZXNwYWNlKFt0aGlzLnRvU3RyaW5nKCldLCB0
aGlzLCB7fSk7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWVz
cGFjZXMgPSBFbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUzsKLSAgICBFbWJlci5sb29rdXBbdGhp
cy50b1N0cmluZygpXSA9IHVuZGVmaW5lZDsKLSAgICBuYW1lc3BhY2VzLnNwbGljZShpbmRleE9m
LmNhbGwobmFtZXNwYWNlcywgdGhpcyksIDEpOwotICAgIHRoaXMuX3N1cGVyKCk7Ci0gIH0KLX0p
OwotCi1OYW1lc3BhY2UucmVvcGVuQ2xhc3MoewotICBOQU1FU1BBQ0VTOiBbRW1iZXJdLAotICBO
QU1FU1BBQ0VTX0JZX0lEOiB7fSwKLSAgUFJPQ0VTU0VEOiBmYWxzZSwKLSAgcHJvY2Vzc0FsbDog
cHJvY2Vzc0FsbE5hbWVzcGFjZXMsCi0gIGJ5TmFtZTogZnVuY3Rpb24obmFtZSkgewotICAgIGlm
ICghRW1iZXIuQk9PVEVEKSB7Ci0gICAgICBwcm9jZXNzQWxsTmFtZXNwYWNlcygpOwotICAgIH0K
LQotICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lEW25hbWVdOwotICB9Ci19KTsKLQotdmFyIE5B
TUVTUEFDRVNfQllfSUQgPSBOYW1lc3BhY2UuTkFNRVNQQUNFU19CWV9JRDsKLQotdmFyIGhhc093
blByb3AgPSAoe30pLmhhc093blByb3BlcnR5LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9y
OwotCi1mdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCByb290LCBzZWVuKSB7Ci0gIHZh
ciBpZHggPSBwYXRocy5sZW5ndGg7Ci0KLSAgTkFNRVNQQUNFU19CWV9JRFtwYXRocy5qb2luKCcu
JyldID0gcm9vdDsKLQotICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1l
c3BhY2UsIGxvb2tpbmcgZm9yIGNsYXNzZXMKLSAgZm9yKHZhciBrZXkgaW4gcm9vdCkgewotICAg
IGlmICghaGFzT3duUHJvcC5jYWxsKHJvb3QsIGtleSkpIHsgY29udGludWU7IH0KLSAgICB2YXIg
b2JqID0gcm9vdFtrZXldOwotCi0gICAgLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGBFbWJl
cmAgbmFtZXNwYWNlLCBmb3IgZXhhbXBsZSwgdGhlCi0gICAgLy8gYHBhdGhzYCB3aWxsIHN0YXJ0
IHdpdGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJhdGlvbiB0aHJvdWdoCi0gICAgLy8gdGhlIGxv
b3Agd2lsbCB1cGRhdGUgdGhlICoqc2Vjb25kKiogZWxlbWVudCBvZiB0aGlzIGxpc3Qgd2l0aAot
ICAgIC8vIHRoZSBrZXksIHNvIHByb2Nlc3NpbmcgYEVtYmVyLlZpZXdgIHdpbGwgbWFrZSB0aGUg
QXJyYXkKLSAgICAvLyBgWydFbWJlcicsICdWaWV3J11gLgotICAgIHBhdGhzW2lkeF0gPSBrZXk7
Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGZvdW5kIGFuIHVucHJvY2Vzc2VkIGNsYXNzCi0gICAgaWYg
KG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcpIHsKLSAgICAgIC8vIFJlcGxh
Y2UgdGhlIGNsYXNzJyBgdG9TdHJpbmdgIHdpdGggdGhlIGRvdC1zZXBhcmF0ZWQgcGF0aAotICAg
ICAgLy8gYW5kIHNldCBpdHMgYE5BTUVfS0VZYAotICAgICAgb2JqLnRvU3RyaW5nID0gbWFrZVRv
U3RyaW5nKHBhdGhzLmpvaW4oJy4nKSk7Ci0gICAgICBvYmpbTkFNRV9LRVldID0gcGF0aHMuam9p
bignLicpOwotCi0gICAgLy8gU3VwcG9ydCBuZXN0ZWQgbmFtZXNwYWNlcwotICAgIH0gZWxzZSBp
ZiAob2JqICYmIG9iai5pc05hbWVzcGFjZSkgewotICAgICAgLy8gU2tpcCBhbGlhc2VkIG5hbWVz
cGFjZXMKLSAgICAgIGlmIChzZWVuW2d1aWRGb3Iob2JqKV0pIHsgY29udGludWU7IH0KLSAgICAg
IHNlZW5bZ3VpZEZvcihvYmopXSA9IHRydWU7Ci0KLSAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxk
IG5hbWVzcGFjZQotICAgICAgcHJvY2Vzc05hbWVzcGFjZShwYXRocywgb2JqLCBzZWVuKTsKLSAg
ICB9Ci0gIH0KLQotICBwYXRocy5sZW5ndGggPSBpZHg7IC8vIGN1dCBvdXQgbGFzdCBpdGVtCi19
Ci0KLWZ1bmN0aW9uIGZpbmROYW1lc3BhY2VzKCkgewotICB2YXIgTmFtZXNwYWNlID0gRW1iZXIu
TmFtZXNwYWNlLCBsb29rdXAgPSBFbWJlci5sb29rdXAsIG9iaiwgaXNOYW1lc3BhY2U7Ci0KLSAg
aWYgKE5hbWVzcGFjZS5QUk9DRVNTRUQpIHsgcmV0dXJuOyB9Ci0KLSAgZm9yICh2YXIgcHJvcCBp
biBsb29rdXApIHsKLSAgICAvLyBUaGVzZSBkb24ndCByYWlzZSBleGNlcHRpb25zIGJ1dCBjYW4g
Y2F1c2Ugd2FybmluZ3MKLSAgICBpZiAocHJvcCA9PT0gInBhcmVudCIgfHwgcHJvcCA9PT0gInRv
cCIgfHwgcHJvcCA9PT0gImZyYW1lRWxlbWVudCIgfHwgcHJvcCA9PT0gIndlYmtpdFN0b3JhZ2VJ
bmZvIikgeyBjb250aW51ZTsgfQotCi0gICAgLy8gIGdldCh3aW5kb3cuZ2xvYmFsU3RvcmFnZSwg
J2lzTmFtZXNwYWNlJykgd291bGQgdHJ5IHRvIHJlYWQgdGhlIHN0b3JhZ2UgZm9yIGRvbWFpbiBp
c05hbWVzcGFjZSBhbmQgY2F1c2UgZXhjZXB0aW9uIGluIEZpcmVmb3guCi0gICAgLy8gZ2xvYmFs
U3RvcmFnZSBpcyBhIHN0b3JhZ2Ugb2Jzb2xldGVkIGJ5IHRoZSBXaGF0V0cgc3RvcmFnZSBzcGVj
aWZpY2F0aW9uLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL1N0b3Jh
Z2UjZ2xvYmFsU3RvcmFnZQotICAgIGlmIChwcm9wID09PSAiZ2xvYmFsU3RvcmFnZSIgJiYgbG9v
a3VwLlN0b3JhZ2VMaXN0ICYmIGxvb2t1cC5nbG9iYWxTdG9yYWdlIGluc3RhbmNlb2YgbG9va3Vw
LlN0b3JhZ2VMaXN0KSB7IGNvbnRpbnVlOyB9Ci0gICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZSB2
ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eQotICAgIGlm
IChsb29rdXAuaGFzT3duUHJvcGVydHkgJiYgIWxvb2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkg
eyBjb250aW51ZTsgfQotCi0gICAgLy8gQXQgdGltZXMgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFj
Y2VzcyBjZXJ0YWluIHByb3BlcnRpZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi0gICAgLy8gVGhl
cmUgYXJlIGFsc28gdGltZXMgd2hlcmUgZXZlbiBpZiB3ZSBjYW4gYWNjZXNzIHRoZW0sIHdlIGFy
ZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlaXIgcHJvcGVydGllcy4KLSAgICB0cnkgewotICAg
ICAgb2JqID0gRW1iZXIubG9va3VwW3Byb3BdOwotICAgICAgaXNOYW1lc3BhY2UgPSBvYmogJiYg
b2JqLmlzTmFtZXNwYWNlOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAg
IH0KLQotICAgIGlmIChpc05hbWVzcGFjZSkgewotICAgICAgRW1iZXIuZGVwcmVjYXRlKCJOYW1l
c3BhY2VzIHNob3VsZCBub3QgYmVnaW4gd2l0aCBsb3dlcmNhc2UuIiwgL15bQS1aXS8udGVzdChw
cm9wKSk7Ci0gICAgICBvYmpbTkFNRV9LRVldID0gcHJvcDsKLSAgICB9Ci0gIH0KLX0KLQotdmFy
IE5BTUVfS0VZID0gRW1iZXIuTkFNRV9LRVkgPSBFbWJlci5HVUlEX0tFWSArICdfbmFtZSc7Ci0K
LWZ1bmN0aW9uIHN1cGVyQ2xhc3NTdHJpbmcobWl4aW4pIHsKLSAgdmFyIHN1cGVyY2xhc3MgPSBt
aXhpbi5zdXBlcmNsYXNzOwotICBpZiAoc3VwZXJjbGFzcykgewotICAgIGlmIChzdXBlcmNsYXNz
W05BTUVfS0VZXSkgeyByZXR1cm4gc3VwZXJjbGFzc1tOQU1FX0tFWV07IH0KLSAgICBlbHNlIHsg
cmV0dXJuIHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7IH0KLSAgfSBlbHNlIHsKLSAgICBy
ZXR1cm47Ci0gIH0KLX0KLQotZnVuY3Rpb24gY2xhc3NUb1N0cmluZygpIHsKLSAgaWYgKCFFbWJl
ci5CT09URUQgJiYgIXRoaXNbTkFNRV9LRVldKSB7Ci0gICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMo
KTsKLSAgfQotCi0gIHZhciByZXQ7Ci0KLSAgaWYgKHRoaXNbTkFNRV9LRVldKSB7Ci0gICAgcmV0
ID0gdGhpc1tOQU1FX0tFWV07Ci0gIH0gZWxzZSBpZiAodGhpcy5fdG9TdHJpbmcpIHsKLSAgICBy
ZXQgPSB0aGlzLl90b1N0cmluZzsgCi0gIH0gZWxzZSB7Ci0gICAgdmFyIHN0ciA9IHN1cGVyQ2xh
c3NTdHJpbmcodGhpcyk7Ci0gICAgaWYgKHN0cikgewotICAgICAgcmV0ID0gIihzdWJjbGFzcyBv
ZiAiICsgc3RyICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSAiKHVua25vd24gbWl4
aW4pIjsKLSAgICB9Ci0gICAgdGhpcy50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOwotICB9
Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVuY3Rpb24gcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKSB7
Ci0gIHZhciB1bnByb2Nlc3NlZE5hbWVzcGFjZXMgPSAhTmFtZXNwYWNlLlBST0NFU1NFRCwKLSAg
ICAgIHVucHJvY2Vzc2VkTWl4aW5zID0gRW1iZXIuYW55VW5wcm9jZXNzZWRNaXhpbnM7Ci0KLSAg
aWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcykgewotICAgIGZpbmROYW1lc3BhY2VzKCk7Ci0gICAg
TmFtZXNwYWNlLlBST0NFU1NFRCA9IHRydWU7Ci0gIH0KLQotICBpZiAodW5wcm9jZXNzZWROYW1l
c3BhY2VzIHx8IHVucHJvY2Vzc2VkTWl4aW5zKSB7Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1l
c3BhY2UuTkFNRVNQQUNFUywgbmFtZXNwYWNlOwotICAgIGZvciAodmFyIGk9MCwgbD1uYW1lc3Bh
Y2VzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbaV07
Ci0gICAgICBwcm9jZXNzTmFtZXNwYWNlKFtuYW1lc3BhY2UudG9TdHJpbmcoKV0sIG5hbWVzcGFj
ZSwge30pOwotICAgIH0KLQotICAgIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7
Ci0gIH0KLX0KLQotZnVuY3Rpb24gbWFrZVRvU3RyaW5nKHJldCkgewotICByZXR1cm4gZnVuY3Rp
b24oKSB7IHJldHVybiByZXQ7IH07Ci19Ci0KLUVtYmVyLk1peGluLnByb3RvdHlwZS50b1N0cmlu
ZyA9IGNsYXNzVG9TdHJpbmc7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBt
b2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgZm10ID0gRW1iZXIuU3RyaW5nLmZt
dCwKLSAgICBhZGRCZWZvcmVPYnNlcnZlciA9IEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyLAotICAg
IGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCi0gICAgcmVtb3ZlQmVmb3JlT2JzZXJ2
ZXIgPSBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlciwKLSAgICByZW1vdmVPYnNlcnZlciA9IEVt
YmVyLnJlbW92ZU9ic2VydmVyLAotICAgIHByb3BlcnR5V2lsbENoYW5nZSA9IEVtYmVyLnByb3Bl
cnR5V2lsbENoYW5nZSwKLSAgICBwcm9wZXJ0eURpZENoYW5nZSA9IEVtYmVyLnByb3BlcnR5RGlk
Q2hhbmdlLAotICAgIG1ldGEgPSBFbWJlci5tZXRhLAotICAgIGRlZmluZVByb3BlcnR5ID0gRW1i
ZXIuZGVmaW5lUHJvcGVydHk7Ci0KLWZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Uo
Y29udGVudCwgY29udGVudEtleSkgewotICB2YXIga2V5ID0gY29udGVudEtleS5zbGljZSg4KTsg
Ly8gcmVtb3ZlICJjb250ZW50LiIKLSAgaWYgKGtleSBpbiB0aGlzKSB7IHJldHVybjsgfSAgLy8g
aWYgc2hhZG93ZWQgaW4gcHJveHkKLSAgcHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7Ci19
Ci0KLWZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZShjb250ZW50LCBjb250ZW50S2V5
KSB7Ci0gIHZhciBrZXkgPSBjb250ZW50S2V5LnNsaWNlKDgpOyAvLyByZW1vdmUgImNvbnRlbnQu
IgotICBpZiAoa2V5IGluIHRoaXMpIHsgcmV0dXJuOyB9IC8vIGlmIHNoYWRvd2VkIGluIHByb3h5
Ci0gIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleSk7Ci19Ci0KLS8qKgotICBgRW1iZXIuT2Jq
ZWN0UHJveHlgIGZvcndhcmRzIGFsbCBwcm9wZXJ0aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94
eSBpdHNlbGYKLSAgdG8gYSBwcm94aWVkIGBjb250ZW50YCBvYmplY3QuCi0KLSAgYGBgamF2YXNj
cmlwdAotICBvYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICBuYW1lOiAnRm9vJwot
ICB9KTsKLQotICBwcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7Ci0gICAgY29udGVu
dDogb2JqZWN0Ci0gIH0pOwotCi0gIC8vIEFjY2VzcyBhbmQgY2hhbmdlIGV4aXN0aW5nIHByb3Bl
cnRpZXMKLSAgcHJveHkuZ2V0KCduYW1lJykgICAgICAgICAgLy8gJ0ZvbycKLSAgcHJveHkuc2V0
KCduYW1lJywgJ0JhcicpOwotICBvYmplY3QuZ2V0KCduYW1lJykgICAgICAgICAvLyAnQmFyJwot
Ci0gIC8vIENyZWF0ZSBuZXcgJ2Rlc2NyaXB0aW9uJyBwcm9wZXJ0eSBvbiBgb2JqZWN0YAotICBw
cm94eS5zZXQoJ2Rlc2NyaXB0aW9uJywgJ0ZvbyBpcyBhIHdoaXpib28gYmF6Jyk7Ci0gIG9iamVj
dC5nZXQoJ2Rlc2NyaXB0aW9uJykgIC8vICdGb28gaXMgYSB3aGl6Ym9vIGJheicKLSAgYGBgCi0K
LSAgV2hpbGUgYGNvbnRlbnRgIGlzIHVuc2V0LCBzZXR0aW5nIGEgcHJvcGVydHkgdG8gYmUgZGVs
ZWdhdGVkIHdpbGwgdGhyb3cgYW4KLSAgRXJyb3IuCi0KLSAgYGBgamF2YXNjcmlwdAotICBwcm94
eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7Ci0gICAgY29udGVudDogbnVsbCwKLSAgICBm
bGFnOiBudWxsCi0gIH0pOwotICBwcm94eS5zZXQoJ2ZsYWcnLCB0cnVlKTsKLSAgcHJveHkuZ2V0
KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQotICBwcm94eS5nZXQoJ2ZvbycpOyAgICAgICAgICAv
LyB1bmRlZmluZWQKLSAgcHJveHkuc2V0KCdmb28nLCAnZGF0YScpOyAgLy8gdGhyb3dzIEVycm9y
Ci0gIGBgYAotCi0gIERlbGVnYXRlZCBwcm9wZXJ0aWVzIGNhbiBiZSBib3VuZCB0byBhbmQgd2ls
bCBjaGFuZ2Ugd2hlbiBjb250ZW50IGlzIHVwZGF0ZWQuCi0KLSAgQ29tcHV0ZWQgcHJvcGVydGll
cyBvbiB0aGUgcHJveHkgaXRzZWxmIGNhbiBkZXBlbmQgb24gZGVsZWdhdGVkIHByb3BlcnRpZXMu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBQcm94eVdpdGhDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIu
T2JqZWN0UHJveHkuZXh0ZW5kKHsKLSAgICBmdWxsTmFtZTogZnVuY3Rpb24gKCkgewotICAgICAg
dmFyIGZpcnN0TmFtZSA9IHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSwKLSAgICAgICAgICBsYXN0TmFt
ZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwotICAgICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFt
ZSkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgJyAnICsgbGFzdE5hbWU7Ci0gICAgICB9
Ci0gICAgICByZXR1cm4gZmlyc3ROYW1lIHx8IGxhc3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2Zp
cnN0TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwotCi0gIHByb3h5ID0gUHJveHlXaXRoQ29tcHV0
ZWRQcm9wZXJ0eS5jcmVhdGUoKTsKLQotICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyB1bmRl
ZmluZWQKLSAgcHJveHkuc2V0KCdjb250ZW50JywgewotICAgIGZpcnN0TmFtZTogJ1RvbScsIGxh
c3ROYW1lOiAnRGFsZScKLSAgfSk7IC8vIHRyaWdnZXJzIHByb3BlcnR5IGNoYW5nZSBmb3IgZnVs
bE5hbWUgb24gcHJveHkKLQotICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyAnVG9tIERhbGUn
Ci0gIGBgYAotCi0gIEBjbGFzcyBPYmplY3RQcm94eQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBl
eHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLk9iamVjdFByb3h5ID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7Ci0gIC8qKgotICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJl
IGZvcndhcmRlZC4KLQotICAgIEBwcm9wZXJ0eSBjb250ZW50Ci0gICAgQHR5cGUgRW1iZXIuT2Jq
ZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBudWxsLAotICBfY29udGVu
dERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbigpIHsKLSAgICBF
bWJlci5hc3NlcnQoIkNhbid0IHNldCBPYmplY3RQcm94eSdzIGNvbnRlbnQgdG8gaXRzZWxmIiwg
dGhpcy5nZXQoJ2NvbnRlbnQnKSAhPT0gdGhpcyk7Ci0gIH0pLAotCi0gIGlzVHJ1dGh5OiBFbWJl
ci5jb21wdXRlZC5ib29sKCdjb250ZW50JyksCi0KLSAgX2RlYnVnQ29udGFpbmVyS2V5OiBudWxs
LAotCi0gIHdpbGxXYXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNvbnRl
bnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIGFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGNv
bnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOwotICAgIGFkZE9ic2Vy
dmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7Ci0g
IH0sCi0KLSAgZGlkVW53YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNv
bnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIHJlbW92ZUJlZm9yZU9ic2VydmVyKHRo
aXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOwotICAgIHJl
bW92ZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENo
YW5nZSk7Ci0gIH0sCi0KLSAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAg
dmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLSAgICBpZiAoY29udGVudCkgewot
ICAgICAgcmV0dXJuIGdldChjb250ZW50LCBrZXkpOwotICAgIH0KLSAgfSwKLQotICBzZXRVbmtu
b3duUHJvcGVydHk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgdmFyIG0gPSBtZXRhKHRo
aXMpOwotICAgIGlmIChtLnByb3RvID09PSB0aGlzKSB7Ci0gICAgICAvLyBpZiBtYXJrZWQgYXMg
cHJvdG90eXBlIHRoZW4ganVzdCBkZWZpbmVQcm9wZXJ0eQotICAgICAgLy8gcmF0aGVyIHRoYW4g
ZGVsZWdhdGUKLSAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgbnVsbCwgdmFsdWUpOwot
ICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMs
ICdjb250ZW50Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiQ2Fubm90IGRlbGVnYXRlIHNldCgn
JUAnLCAlQCkgdG8gdGhlICdjb250ZW50JyBwcm9wZXJ0eSBvZiBvYmplY3QgcHJveHkgJUA6IGl0
cyAnY29udGVudCcgaXMgdW5kZWZpbmVkLiIsIFtrZXksIHZhbHVlLCB0aGlzXSksIGNvbnRlbnQp
OwotICAgIHJldHVybiBzZXQoY29udGVudCwga2V5LCB2YWx1ZSk7Ci0gIH0KLQotfSk7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQotKi8KLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gSEVMUEVSUwotLy8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUu
c2xpY2U7Ci12YXIgYV9pbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0K
LXZhciBjb250ZXh0cyA9IFtdOwotCi1mdW5jdGlvbiBwb3BDdHgoKSB7Ci0gIHJldHVybiBjb250
ZXh0cy5sZW5ndGg9PT0wID8ge30gOiBjb250ZXh0cy5wb3AoKTsKLX0KLQotZnVuY3Rpb24gcHVz
aEN0eChjdHgpIHsKLSAgY29udGV4dHMucHVzaChjdHgpOwotICByZXR1cm4gbnVsbDsKLX0KLQot
ZnVuY3Rpb24gaXRlcihrZXksIHZhbHVlKSB7Ci0gIHZhciB2YWx1ZVByb3ZpZGVkID0gYXJndW1l
bnRzLmxlbmd0aCA9PT0gMjsKLQotICBmdW5jdGlvbiBpKGl0ZW0pIHsKLSAgICB2YXIgY3VyID0g
Z2V0KGl0ZW0sIGtleSk7Ci0gICAgcmV0dXJuIHZhbHVlUHJvdmlkZWQgPyB2YWx1ZT09PWN1ciA6
ICEhY3VyOwotICB9Ci0gIHJldHVybiBpIDsKLX0KLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5l
cyB0aGUgY29tbW9uIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBlbnVtZXJhYmxlIG9iamVjdHMK
LSAgaW4gRW1iZXIuIE1vc3Qgb2YgdGhlc2UgbWV0aG9kcyBmb2xsb3cgdGhlIHN0YW5kYXJkIEFy
cmF5IGl0ZXJhdGlvbgotICBBUEkgZGVmaW5lZCB1cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVk
aW5nIGxhbmd1YWdlLXNwZWNpZmljIGZlYXR1cmVzIHRoYXQKLSAgY2Fubm90IGJlIGVtdWxhdGVk
IGluIG9sZGVyIHZlcnNpb25zIG9mIEphdmFTY3JpcHQpLgotCi0gIFRoaXMgbWl4aW4gaXMgYXBw
bGllZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBBcnJheSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlv
dQotICBjYW4gdXNlIGFueSBvZiB0aGVzZSBtZXRob2RzIG9uIHNpbXBsZSBhcnJheXMuIElmIEFy
cmF5IGFscmVhZHkgaW1wbGVtZW50cwotICBvbmUgb2YgdGhlc2UgbWV0aG9kcywgdGhlIG1peGlu
IHdpbGwgbm90IG92ZXJyaWRlIHRoZW0uCi0KLSAgIyMgV3JpdGluZyBZb3VyIE93biBFbnVtZXJh
YmxlCi0KLSAgVG8gbWFrZSB5b3VyIG93biBjdXN0b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5l
ZWQgdHdvIGl0ZW1zOgotCi0gIDEuIFlvdSBtdXN0IGhhdmUgYSBsZW5ndGggcHJvcGVydHkuIFRo
aXMgcHJvcGVydHkgc2hvdWxkIGNoYW5nZSB3aGVuZXZlcgotICAgICB0aGUgbnVtYmVyIG9mIGl0
ZW1zIGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdlcy4gSWYgeW91IHVzaW5nIHRoaXMK
LSAgICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFzcywgeW91IHNob3VsZCBiZSBzdXJl
IHRvIGNoYW5nZSB0aGUgbGVuZ3RoCi0gICAgIHByb3BlcnR5IHVzaW5nIGBzZXQoKS5gCi0KLSAg
Mi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9jdW1lbnRhdGlvbi4K
LQotICBPbmNlIHlvdSBoYXZlIHRoZXNlIHR3byBtZXRob2RzIGltcGxlbWVudCwgYXBwbHkgdGhl
IGBFbWJlci5FbnVtZXJhYmxlYCBtaXhpbgotICB0byB5b3VyIGNsYXNzIGFuZCB5b3Ugd2lsbCBi
ZSBhYmxlIHRvIGVudW1lcmF0ZSB0aGUgY29udGVudHMgb2YgeW91ciBvYmplY3QKLSAgbGlrZSBh
bnkgb3RoZXIgY29sbGVjdGlvbi4KLQotICAjIyBVc2luZyBFbWJlciBFbnVtZXJhdGlvbiB3aXRo
IE90aGVyIExpYnJhcmllcwotCi0gIE1hbnkgb3RoZXIgbGlicmFyaWVzIHByb3ZpZGUgc29tZSBr
aW5kIG9mIGl0ZXJhdG9yIG9yIGVudW1lcmF0aW9uIGxpa2UKLSAgZmFjaWxpdHkuIFRoaXMgaXMg
b2Z0ZW4gd2hlcmUgdGhlIG1vc3QgY29tbW9uIEFQSSBjb25mbGljdHMgb2NjdXIuCi0gIEVtYmVy
J3MgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGFzIGZyaWVuZGx5IGFzIHBvc3NpYmxlIHdpdGggb3Ro
ZXIKLSAgbGlicmFyaWVzIGJ5IGltcGxlbWVudGluZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkg
Y29ycmVzcG9uZCB0byB0aGUKLSAgSmF2YVNjcmlwdCAxLjggQVBJLgotCi0gIEBjbGFzcyBFbnVt
ZXJhYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVy
LkVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotCi0gIC8qKgotICAgIEltcGxlbWVu
dCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xhc3MgZW51bWVyYWJsZS4KLQotICAgIFRoaXMg
bWV0aG9kIHdpbGwgYmUgY2FsbCByZXBlYXRlZGx5IGR1cmluZyBlbnVtZXJhdGlvbi4gVGhlIGlu
ZGV4IHZhbHVlCi0gICAgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9u
b3RvbmljYWxseS4gWW91IGRvbid0IGhhdmUgdG8KLSAgICByZWx5IG9uIHRoZSBpbmRleCB2YWx1
ZSB0byBkZXRlcm1pbmUgd2hhdCBvYmplY3QgdG8gcmV0dXJuLCBidXQgeW91IHNob3VsZAotICAg
IGFsd2F5cyBjaGVjayB0aGUgdmFsdWUgYW5kIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB3aGVu
IHlvdSBzZWUgdGhlCi0gICAgcmVxdWVzdGVkIGluZGV4IGlzIDAuCi0KLSAgICBUaGUgYHByZXZp
b3VzT2JqZWN0YCBpcyB0aGUgb2JqZWN0IHRoYXQgd2FzIHJldHVybmVkIGZyb20gdGhlIGxhc3Qg
Y2FsbAotICAgIHRvIGBuZXh0T2JqZWN0YCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLiBUaGlz
IGlzIGEgdXNlZnVsIHdheSB0bwotICAgIG1hbmFnZSBpdGVyYXRpb24gaWYgeW91IGFyZSB0cmFj
aW5nIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxlLgotCi0gICAgRmluYWxseSB0aGUgY29udGV4
dCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKLSAg
ICBhICJzY3JhdGNocGFkIiB0byBtYWludGFpbiBhbnkgb3RoZXIgc3RhdGUgeW91IG5lZWQgaW4g
b3JkZXIgdG8gaXRlcmF0ZQotICAgIHByb3Blcmx5LiBUaGUgY29udGV4dCBvYmplY3QgaXMgcmV1
c2VkIGFuZCBpcyBub3QgcmVzZXQgYmV0d2VlbgotICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJl
IHlvdSBzZXR1cCB0aGUgY29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKLSAgICB0
aGUgaW5kZXggcGFyYW1ldGVyIGlzIDAuCi0KLSAgICBHZW5lcmFsbHkgaXRlcmF0b3JzIHdpbGwg
Y29udGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhlIGluZGV4Ci0gICAgcmVhY2hl
cyB0aGUgeW91ciBjdXJyZW50IGxlbmd0aC0xLiBJZiB5b3UgcnVuIG91dCBvZiBkYXRhIGJlZm9y
ZSB0aGlzCi0gICAgdGltZSBmb3Igc29tZSByZWFzb24sIHlvdSBzaG91bGQgc2ltcGx5IHJldHVy
biB1bmRlZmluZWQuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1l
dGhvZCBzaW1wbHkgbG9va3MgdXAgdGhlIGluZGV4LgotICAgIFRoaXMgd29ya3MgZ3JlYXQgb24g
YW55IEFycmF5LWxpa2Ugb2JqZWN0cy4KLQotICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBw
YXJhbSB7TnVtYmVyfSBpbmRleCB0aGUgY3VycmVudCBpbmRleCBvZiB0aGUgaXRlcmF0aW9uCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHByZXZpb3VzT2JqZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0
aGUgbGFzdCBjYWxsIHRvCi0gICAgICBgbmV4dE9iamVjdGAuCi0gICAgQHBhcmFtIHtPYmplY3R9
IGNvbnRleHQgYSBjb250ZXh0IG9iamVjdCB5b3UgY2FuIHVzZSB0byBtYWludGFpbiBzdGF0ZS4K
LSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uIG9y
IHVuZGVmaW5lZAotICAqLwotICBuZXh0T2JqZWN0OiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiks
Ci0KLSAgLyoqCi0gICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBvYmplY3QgZnJv
bSBhIGNvbGxlY3Rpb24uIFRoaXMgaXMgdXN1YWxseQotICAgIHVzZWQgYnkgYmluZGluZ3MgYW5k
IG90aGVyIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsgdG8gZXh0cmFjdCBhIHNpbmdsZQotICAgIG9i
amVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250YWlucyBvbmx5IG9uZSBpdGVtLgotCi0gICAgSWYg
eW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBpdCBzbyB0aGF0
IGl0IHdpbGwKLSAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGVhY2ggdGltZSBpdCBp
cyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQotICAgIGNvbnRhaW5zIG9ubHkgb25lIG9iamVj
dCwgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhhdCBvYmplY3QuCi0gICAgSWYg
eW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB1bmRl
ZmluZWRgLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJj
Il07Ci0gICAgYXJyLmdldCgnZmlyc3RPYmplY3QnKTsgIC8vICJhIgotCi0gICAgdmFyIGFyciA9
IFtdOwotICAgIGFyci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKLSAgICBgYGAK
LQotICAgIEBwcm9wZXJ0eSBmaXJzdE9iamVjdAotICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG9i
amVjdCBvciB1bmRlZmluZWQKLSAgKi8KLSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2xlbmd0aCcpPT09MCkgcmV0dXJuIHVuZGVm
aW5lZCA7Ci0KLSAgICAvLyBoYW5kbGUgZ2VuZXJpYyBlbnVtZXJhYmxlcwotICAgIHZhciBjb250
ZXh0ID0gcG9wQ3R4KCksIHJldDsKLSAgICByZXQgPSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwg
Y29udGV4dCk7Ci0gICAgcHVzaEN0eChjb250ZXh0KTsKLSAgICByZXR1cm4gcmV0IDsKLSAgfSku
cHJvcGVydHkoJ1tdJyksCi0KLSAgLyoqCi0gICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBs
YXN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gSWYgeW91ciBlbnVtZXJhYmxlCi0gICAgY29u
dGFpbnMgb25seSBvbmUgb2JqZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0
aGF0IG9iamVjdC4KLSAgICBJZiB5b3VyIGVudW1lcmFibGUgaXMgZW1wdHksIHRoaXMgbWV0aG9k
IHNob3VsZCByZXR1cm4gYHVuZGVmaW5lZGAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFy
IGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAi
YyIKLQotICAgIHZhciBhcnIgPSBbXTsKLSAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1
bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0Ci0gICAgQHJldHVy
biB7T2JqZWN0fSB0aGUgbGFzdCBvYmplY3Qgb3IgdW5kZWZpbmVkCi0gICovCi0gIGxhc3RPYmpl
Y3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBsZW4gPSBnZXQodGhpcywg
J2xlbmd0aCcpOwotICAgIGlmIChsZW49PT0wKSByZXR1cm4gdW5kZWZpbmVkIDsKLSAgICB2YXIg
Y29udGV4dCA9IHBvcEN0eCgpLCBpZHg9MCwgY3VyLCBsYXN0ID0gbnVsbDsKLSAgICBkbyB7Ci0g
ICAgICBsYXN0ID0gY3VyOwotICAgICAgY3VyID0gdGhpcy5uZXh0T2JqZWN0KGlkeCsrLCBsYXN0
LCBjb250ZXh0KTsKLSAgICB9IHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCk7Ci0gICAgcHVzaEN0
eChjb250ZXh0KTsKLSAgICByZXR1cm4gbGFzdDsKLSAgfSkucHJvcGVydHkoJ1tdJyksCi0KLSAg
LyoqCi0gICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBvYmplY3QgY2FuIGJlIGZvdW5k
IGluIHRoZSByZWNlaXZlci4gVGhlCi0gICAgZGVmYXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0
aHJvdWdoIHRoZSBlbnVtZXJhYmxlIHVudGlsIHRoZSBvYmplY3QKLSAgICBpcyBmb3VuZC4gWW91
IG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgd2l0aCBhIG1vcmUgZWZmaWNpZW50IHZlcnNpb24u
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAg
ICBhcnIuY29udGFpbnMoImEiKTsgLy8gdHJ1ZQotICAgIGFyci5jb250YWlucygieiIpOyAvLyBm
YWxzZQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBjb250YWlucwotICAgIEBwYXJhbSB7T2JqZWN0
fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0
cnVlYCBpZiBvYmplY3QgaXMgZm91bmQgaW4gZW51bWVyYWJsZS4KLSAgKi8KLSAgY29udGFpbnM6
IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24oaXRlbSkgeyBy
ZXR1cm4gaXRlbT09PW9iajsgfSkgIT09IHVuZGVmaW5lZDsKLSAgfSwKLQotICAvKioKLSAgICBJ
dGVyYXRlcyB0aHJvdWdoIHRoZSBlbnVtZXJhYmxlLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rp
b24gb24gZWFjaAotICAgIGl0ZW0uIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBgZm9y
RWFjaCgpYCBtZXRob2QgZGVmaW5lZCBpbgotICAgIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhl
IGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAK
LQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAg
ICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAt
IGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgTm90
ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9w
dGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0
aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9y
IGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBAbWV0aG9kIGZv
ckVhY2gKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhl
Y3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1
c2UKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGZvckVhY2g6IGZ1bmN0
aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVu
Y3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkgOwotICAgIHZhciBsZW4gPSBnZXQodGhpcywg
J2xlbmd0aCcpLCBsYXN0ID0gbnVsbCwgY29udGV4dCA9IHBvcEN0eCgpOwotCi0gICAgaWYgKHRh
cmdldCA9PT0gdW5kZWZpbmVkKSB0YXJnZXQgPSBudWxsOwotCi0gICAgZm9yKHZhciBpZHg9MDtp
ZHg8bGVuO2lkeCsrKSB7Ci0gICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxh
c3QsIGNvbnRleHQpIDsKLSAgICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRo
aXMpOwotICAgICAgbGFzdCA9IG5leHQgOwotICAgIH0KLSAgICBsYXN0ID0gbnVsbCA7Ci0gICAg
Y29udGV4dCA9IHB1c2hDdHgoY29udGV4dCk7Ci0gICAgcmV0dXJuIHRoaXMgOwotICB9LAotCi0g
IC8qKgotICAgIEFsaWFzIGZvciBgbWFwQnlgCi0KLSAgICBAbWV0aG9kIGdldEVhY2gKLSAgICBA
cGFyYW0ge1N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgQHJldHVybiB7QXJy
YXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0gICovCi0gIGdldEVhY2g6IGZ1bmN0aW9uKGtleSkgewot
ICAgIHJldHVybiB0aGlzLm1hcEJ5KGtleSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUg
dmFsdWUgb24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlci4gVGhpcyBpcyBtb3Jl
Ci0gICAgZWZmaWNpZW50IHRoYW4gdXNpbmcgb3RoZXIgbWV0aG9kcyBkZWZpbmVkIG9uIHRoaXMg
aGVscGVyLiBJZiB0aGUgb2JqZWN0Ci0gICAgaW1wbGVtZW50cyBFbWJlci5PYnNlcnZhYmxlLCB0
aGUgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIHRvIGBzZXQoKSxgIG90aGVyd2lzZQotICAgIGl0IHdp
bGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0cyBhcmUgc2tpcHBlZC4KLQotICAgIEBt
ZXRob2Qgc2V0RWFjaAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQKLSAg
ICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIG9iamVjdCB0byBzZXQKLSAgICBAcmV0dXJuIHtP
YmplY3R9IHJlY2VpdmVyCi0gICovCi0gIHNldEVhY2g6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
LSAgICByZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHNldChpdGVt
LCBrZXksIHZhbHVlKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBNYXBzIGFsbCBvZiB0
aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHRvIGFub3RoZXIgdmFsdWUsIHJldHVybmluZwot
ICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFwKClgIGRlZmlu
ZWQgaW4gSmF2YVNjcmlwdCAxLjYuCi0KLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92
aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0
ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRl
bSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAotCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1
cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVu
dCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVt
ZXJhYmxlIG9iamVjdCBpdHNlbGYuCi0KLSAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBtYXBwZWQg
dmFsdWUuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIEBtZXRob2QgbWFwCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNh
bGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdl
dCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0g
ICovCi0gIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewotICAgIHZhciByZXQgPSBF
bWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAg
cmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LGkpOwotICAgIH0pOwotICAg
IHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFNpbWlsYXIgdG8gbWFwLCB0aGlzIHNw
ZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZAotICAgIHBy
b3BlcnR5IG9uIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYXRpb24uCi0KLSAgICBAbWV0aG9kIG1h
cEJ5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEBy
ZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFycmF5LgotICAqLwotICBtYXBCeTogZnVuY3Rpb24o
a2V5KSB7Ci0gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG5leHQpIHsKLSAgICAgIHJldHVy
biBnZXQobmV4dCwga2V5KTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBTaW1pbGFyIHRv
IG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUg
bmFtZWQKLSAgICBwcm9wZXJ0eSBvbiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uLgotCi0g
ICAgQG1ldGhvZCBtYXBQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgbmFtZSBvZiB0
aGUgcHJvcGVydHkKLSAgICBAcmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4KLSAgICBA
ZGVwcmVjYXRlZCBVc2UgYG1hcEJ5YCBpbnN0ZWFkCi0gICovCi0KLSAgbWFwUHJvcGVydHk6IEVt
YmVyLmFsaWFzTWV0aG9kKCdtYXBCeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkg
d2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB0aGF0IHRoZSBwYXNzZWQK
LSAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yLiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0
byBgZmlsdGVyKClgIGRlZmluZWQgaW4KLSAgICBKYXZhU2NyaXB0IDEuNi4KLQotICAgIFRoZSBj
YWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWdu
YXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0K
LSAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAg
LSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBg
ZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNo
b3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRz
LCBgZmFsc2VgCi0gICAgb3RoZXJ3aXNlLgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRv
IGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9i
amVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBh
IGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0
aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBAbWV0aG9kIGZpbHRlcgotICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge0FycmF5
fSBBIGZpbHRlcmVkIGFycmF5LgotICAqLwotICBmaWx0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0
YXJnZXQpIHsKLSAgICB2YXIgcmV0ID0gRW1iZXIuQSgpOwotICAgIHRoaXMuZm9yRWFjaChmdW5j
dGlvbih4LCBpZHgsIGkpIHsKLSAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4
LCBpKSkgcmV0LnB1c2goeCk7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGVu
dW1lcmF0aW9uIHdoZXJlIHRoZSBwYXNzZWQKLSAgICBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZv
ci4gVGhpcyBtZXRob2QgaXMgdGhlIGludmVyc2Ugb2YgZmlsdGVyKCkuCi0KLSAgICBUaGUgY2Fs
bGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0
dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAotCi0g
ICAgLSAqaXRlbSogaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0g
KmluZGV4KiBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uCi0gICAgLSAqZW51
bWVyYWJsZSogaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3Vs
ZCByZXR1cm4gdGhlIGEgZmFsc2V5IHZhbHVlIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJl
c3VsdHMuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgInRoaXMiIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIEBtZXRob2QgcmVqZWN0Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhl
IGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRh
cmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7QXJyYXl9IEEgcmVqZWN0ZWQgYXJyYXku
Ci0gICAqLwotICByZWplY3Q6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICByZXR1
cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gIShjYWxsYmFjay5hcHBs
eSh0YXJnZXQsIGFyZ3VtZW50cykpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJldHVy
bnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBpdGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5
LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUg
dGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5
IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQotICAgIEBtZXRob2QgZmlsdGVyQnkKLSAgICBA
cGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJp
bmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4g
e0FycmF5fSBmaWx0ZXJlZCBhcnJheQotICAqLwotICBmaWx0ZXJCeTogZnVuY3Rpb24oa2V5LCB2
YWx1ZSkgewotICAgIHJldHVybiB0aGlzLmZpbHRlcihpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cykpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBp
dGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRp
b25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAg
ICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4K
LQotICAgIEBtZXRob2QgZmlsdGVyUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwg
dmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0FycmF5fSBmaWx0ZXJlZCBhcnJh
eQotICAgIEBkZXByZWNhdGVkIFVzZSBgZmlsdGVyQnlgIGluc3RlYWQKLSAgKi8KLSAgZmlsdGVy
UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdmaWx0ZXJCeScpLAotCi0gIC8qKgotICAgIFJl
dHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0aHkgdmFs
dWVzIGZvcgotICAgIGtleS4gIFlvdSBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1l
bnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNo
IGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxzZS4KLQotICAgIEBtZXRob2QgcmVq
ZWN0QnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAg
QHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Lgot
ICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBhcnJheQotICAqLwotICByZWplY3RCeTogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBleGFjdFZhbHVlID0gZnVuY3Rpb24oaXRlbSkg
eyByZXR1cm4gZ2V0KGl0ZW0sIGtleSkgPT09IHZhbHVlOyB9LAotICAgICAgICBoYXNWYWx1ZSA9
IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuICEhZ2V0KGl0ZW0sIGtleSk7IH0sCi0gICAgICAgIHVz
ZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAyID8gZXhhY3RWYWx1ZSA6IGhhc1ZhbHVlKTsKLQot
ICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMg
YW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0aHkgdmFsdWVzIGZv
cgotICAgIGtleS4gIFlvdSBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0
aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBw
cm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxzZS4KLQotICAgIEBtZXRob2QgcmVqZWN0UHJv
cGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAg
QHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Lgot
ICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBhcnJheQotICAgIEBkZXByZWNhdGVkIFVzZSBg
cmVqZWN0QnlgIGluc3RlYWQKLSAgKi8KLSAgcmVqZWN0UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0
aG9kKCdyZWplY3RCeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4g
dGhlIGFycmF5IGZvciB3aGljaCB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgotICAgIFRoaXMg
bWV0aG9kIHdvcmtzIHNpbWlsYXIgdG8gdGhlIGBmaWx0ZXIoKWAgbWV0aG9kIGRlZmluZWQgaW4g
SmF2YVNjcmlwdCAxLjYKLSAgICBleGNlcHQgdGhhdCBpdCB3aWxsIHN0b3Agd29ya2luZyBvbiB0
aGUgYXJyYXkgb25jZSBhIG1hdGNoIGlzIGZvdW5kLgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhv
ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0g
ICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1
bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1g
IGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMg
dGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBp
cyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0
aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAg
ICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywg
eW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2ls
bCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAg
ICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9i
amVjdC4KLQotICAgIEBtZXRob2QgZmluZAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr
IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRo
ZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge09iamVjdH0gRm91bmQgaXRlbSBv
ciBgdW5kZWZpbmVkYC4KLSAgKi8KLSAgZmluZDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkg
ewotICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpIDsKLSAgICBpZiAodGFyZ2V0ID09
PSB1bmRlZmluZWQpIHRhcmdldCA9IG51bGw7Ci0KLSAgICB2YXIgbGFzdCA9IG51bGwsIG5leHQs
IGZvdW5kID0gZmFsc2UsIHJldCA7Ci0gICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKLSAgICBm
b3IodmFyIGlkeD0wO2lkeDxsZW4gJiYgIWZvdW5kO2lkeCsrKSB7Ci0gICAgICBuZXh0ID0gdGhp
cy5uZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29udGV4dCkgOwotICAgICAgaWYgKGZvdW5kID0gY2Fs
bGJhY2suY2FsbCh0YXJnZXQsIG5leHQsIGlkeCwgdGhpcykpIHJldCA9IG5leHQgOwotICAgICAg
bGFzdCA9IG5leHQgOwotICAgIH0KLSAgICBuZXh0ID0gbGFzdCA9IG51bGwgOwotICAgIGNvbnRl
eHQgPSBwdXNoQ3R4KGNvbnRleHQpOwotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgot
ICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gd2l0aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBw
YXNzZWQgdmFsdWUuIFlvdQotICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVu
dCB3aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVyd2lzZQotICAgIHRoaXMgd2lsbCBtYXRjaCBh
bnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gYHRydWVgLgotCi0gICAgVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBtb3JlIGdlbmVyaWMgYGZpbmQoKWAgbWV0aG9kLgotCi0gICAg
QG1ldGhvZCBmaW5kQnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0
ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBh
Z2FpbnN0LgotICAgIEByZXR1cm4ge09iamVjdH0gZm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYAot
ICAqLwotICBmaW5kQnk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpcy5m
aW5kKGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0
dXJucyB0aGUgZmlyc3QgaXRlbSB3aXRoIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2
YWx1ZS4gWW91Ci0gICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGgg
dGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9w
ZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCi0KLSAgICBUaGlzIG1ldGhvZCB3b3JrcyBt
dWNoIGxpa2UgdGhlIG1vcmUgZ2VuZXJpYyBgZmluZCgpYCBtZXRob2QuCi0KLSAgICBAbWV0aG9k
IGZpbmRQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRl
c3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFn
YWluc3QuCi0gICAgQHJldHVybiB7T2JqZWN0fSBmb3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgCi0g
ICAgQGRlcHJlY2F0ZWQgVXNlIGBmaW5kQnlgIGluc3RlYWQKLSAgKi8KLSAgZmluZFByb3BlcnR5
OiBFbWJlci5hbGlhc01ldGhvZCgnZmluZEJ5JyksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBgdHJ1
ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5IGl0ZW0gaW4g
dGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYGV2ZXJ5KClg
IG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91
IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBh
cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlv
bihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgZW51bWVyYWJsZWAgaXMgdGhl
IGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0
cnVlYCBvciBgZmFsc2VgLgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJh
Y2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0
IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5
Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVu
dCBvYmplY3QuCi0KLSAgICBFeGFtcGxlIFVzYWdlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IGlmIChwZW9wbGUuZXZlcnkoaXNFbmdpbmVlcikpIHsgUGF5Y2hlY2tzLmFkZEJpZ0JvbnVzKCk7
IH0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXZlcnkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBj
YWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFy
Z2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtCb29sZWFufQotICAq
LwotICBldmVyeTogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewotICAgIHJldHVybiAhdGhp
cy5maW5kKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0dXJuICFjYWxsYmFjay5jYWxs
KHRhcmdldCwgeCwgaWR4LCBpKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IGV2ZXJ5QnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0g
ICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0
LgotICAgIEBkZXByZWNhdGVkIFVzZSBgaXNFdmVyeWAgaW5zdGVhZAotICAgIEByZXR1cm4ge0Jv
b2xlYW59Ci0gICovCi0gIGV2ZXJ5Qnk6IEVtYmVyLmFsaWFzTWV0aG9kKCdpc0V2ZXJ5JyksCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCBldmVyeVByb3BlcnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtl
eSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlv
bmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBAZGVwcmVjYXRlZCBVc2UgYGlzRXZlcnlg
IGluc3RlYWQKLSAgICBAcmV0dXJuIHtCb29sZWFufQotICAqLwotICBldmVyeVByb3BlcnR5OiBF
bWJlci5hbGlhc01ldGhvZCgnaXNFdmVyeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVg
IGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gYHRydWVgIGZvciBhbGwgaXRlbXMg
aW4KLSAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0
ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgotCi0gICAgQG1ldGhvZCBpc0V2ZXJ5Ci0gICAgQHBh
cmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5n
fSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBAcmV0dXJuIHtC
b29sZWFufQotICAqLwotICBpc0V2ZXJ5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0
dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKLSAgfSwKLQotICAv
KioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1
ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMg
d2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNh
bGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h
dHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQot
ICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAt
IGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBl
bnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hv
dWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMs
IGBmYWxzZWAKLSAgICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8g
YSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2Jq
ZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEg
Z29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRo
ZSBjdXJyZW50IG9iamVjdC4KLQotICAgIFVzYWdlIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgaWYgKHBlb3BsZS5hbnkoaXNNYW5hZ2VyKSkgeyBQYXljaGVja3MuYWRkQmlnZ2Vy
Qm9udXMoKTsgfQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBhbnkKLSAgICBAcGFyYW0ge0Z1bmN0
aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0
fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtCb29sZWFu
fSBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0
ZW0KLSAgKi8KLSAgYW55OiBmdW5jdGlvbihjYWxsYmFjaywgdGFyZ2V0KSB7Ci0gICAgdmFyIGZv
dW5kID0gdGhpcy5maW5kKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0dXJuICEhY2Fs
bGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlw
ZW9mIGZvdW5kICE9PSAndW5kZWZpbmVkJzsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0
cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4g
dGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAg
bWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3Ug
cHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFy
YW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9u
KGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRo
ZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1
cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUg
ZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRy
dWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAgICBvdGhl
cndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIFVzYWdlIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgaWYgKHBlb3Bs
ZS5zb21lKGlzTWFuYWdlcikpIHsgUGF5Y2hlY2tzLmFkZEJpZ2dlckJvbnVzKCk7IH0KLSAgICBg
YGAKLQotICAgIEBtZXRob2Qgc29tZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRo
ZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0
YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUg
cGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQotICAgIEBkZXByZWNh
dGVkIFVzZSBgYW55YCBpbnN0ZWFkCi0gICovCi0gIHNvbWU6IEVtYmVyLmFsaWFzTWV0aG9kKCdh
bnknKSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIHByb3BlcnR5
IHJlc29sdmVzIHRvIGB0cnVlYCBmb3IgYW55IGl0ZW0gaW4KLSAgICB0aGUgZW51bWVyYWJsZS4g
VGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNr
LgotCi0gICAgQG1ldGhvZCBpc0FueQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3Bl
cnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0
byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNz
ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGFueSBpdGVtCi0gICovCi0gIGlzQW55OiBm
dW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRoaXMuYW55KGl0ZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBhbnlCeQotICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmlu
Z30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7
Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9y
IGFueSBpdGVtCi0gICAgQGRlcHJlY2F0ZWQgVXNlIGBpc0FueWAgaW5zdGVhZAotICAqLwotICBh
bnlCeTogRW1iZXIuYWxpYXNNZXRob2QoJ2lzQW55JyksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBz
b21lUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2Fp
bnN0LgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9u
IHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQotICAgIEBkZXByZWNhdGVkIFVzZSBgaXNBbnlg
IGluc3RlYWQKLSAgKi8KLSAgc29tZVByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnaXNBbnkn
KSwKLQotICAvKioKLSAgICBUaGlzIHdpbGwgY29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVt
ZXJhdG9yIGludG8gYSBzaW5nbGUgdmFsdWUuIEl0Ci0gICAgaXMgYSB1c2VmdWwgd2F5IHRvIGNv
bGxlY3QgYSBzdW1tYXJ5IHZhbHVlIGZyb20gYW4gZW51bWVyYXRpb24uIFRoaXMKLSAgICBjb3Jy
ZXNwb25kcyB0byB0aGUgYHJlZHVjZSgpYCBtZXRob2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEu
OC4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhl
IGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihwcmV2aW91c1ZhbHVlLCBpdGVtLCBp
bmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBwcmV2aW91c1ZhbHVlYCBpcyB0
aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0byB0aGUgaXRlcmF0b3IuCi0gICAg
LSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGlu
ZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1l
cmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCi0KLSAgICBSZXR1cm4gdGhl
IG5ldyBjdW11bGF0aXZlIHZhbHVlLgotCi0gICAgSW4gYWRkaXRpb24gdG8gdGhlIGNhbGxiYWNr
IHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFsVmFsdWVgLiBBbiBlcnJvcgotICAgIHdpbGwg
YmUgcmFpc2VkIGlmIHlvdSBkbyBub3QgcGFzcyBhbiBpbml0aWFsIHZhbHVlIGFuZCB0aGUgZW51
bWVyYXRvciBpcwotICAgIGVtcHR5LgotCi0gICAgTm90ZSB0aGF0IHVubGlrZSB0aGUgb3RoZXIg
bWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgYWxsb3cgeW91IHRvCi0gICAgcGFzcyBhIHRh
cmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9yIHRoZSBjYWxsYmFjay4gSXQncyBwYXJ0IG9m
IHRoZQotICAgIHNwZWMuIFNvcnJ5LgotCi0gICAgQG1ldGhvZCByZWR1Y2UKLSAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7
T2JqZWN0fSBpbml0aWFsVmFsdWUgSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHJlZHVjZQotICAgIEBw
YXJhbSB7U3RyaW5nfSByZWR1Y2VyUHJvcGVydHkgaW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgQHJl
dHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1ZS4KLSAgKi8KLSAgcmVkdWNlOiBmdW5jdGlv
bihjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCByZWR1Y2VyUHJvcGVydHkpIHsKLSAgICBpZiAodHlw
ZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoKTsgfQot
Ci0gICAgdmFyIHJldCA9IGluaXRpYWxWYWx1ZTsKLQotICAgIHRoaXMuZm9yRWFjaChmdW5jdGlv
bihpdGVtLCBpKSB7Ci0gICAgICByZXQgPSBjYWxsYmFjay5jYWxsKG51bGwsIHJldCwgaXRlbSwg
aSwgdGhpcywgcmVkdWNlclByb3BlcnR5KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBy
ZXQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSW52b2tlcyB0aGUgbmFtZWQgbWV0aG9kIG9uIGV2ZXJ5
IG9iamVjdCBpbiB0aGUgcmVjZWl2ZXIgdGhhdAotICAgIGltcGxlbWVudHMgaXQuIFRoaXMgbWV0
aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpbgotICAgIFByb3RvdHlwZSAx
LjYuCi0KLSAgICBAbWV0aG9kIGludm9rZQotICAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1l
IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICBAcGFyYW0ge09iamVjdC4uLn0gYXJncyBvcHRp
b25hbCBhcmd1bWVudHMgdG8gcGFzcyBhcyB3ZWxsLgotICAgIEByZXR1cm4ge0FycmF5fSByZXR1
cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZva2UuCi0gICovCi0gIGludm9rZTogZnVuY3Rpb24o
bWV0aG9kTmFtZSkgewotICAgIHZhciBhcmdzLCByZXQgPSBFbWJlci5BKCk7Ci0gICAgaWYgKGFy
Z3VtZW50cy5sZW5ndGg+MSkgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0g
ICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCkgewotICAgICAgdmFyIG1ldGhvZCA9IHgg
JiYgeFttZXRob2ROYW1lXTsKLSAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgbWV0aG9k
KSB7Ci0gICAgICAgIHJldFtpZHhdID0gYXJncyA/IG1ldGhvZC5hcHBseSh4LCBhcmdzKSA6IG1l
dGhvZC5jYWxsKHgpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwotCi0gICAgcmV0dXJuIHJldDsK
LSAgfSwKLQotICAvKioKLSAgICBTaW1wbHkgY29udmVydHMgdGhlIGVudW1lcmFibGUgaW50byBh
IGdlbnVpbmUgYXJyYXkuIFRoZSBvcmRlciBpcyBub3QKLSAgICBndWFyYW50ZWVkLiBDb3JyZXNw
b25kcyB0byB0aGUgbWV0aG9kIGltcGxlbWVudGVkIGJ5IFByb3RvdHlwZS4KLQotICAgIEBtZXRo
b2QgdG9BcnJheQotICAgIEByZXR1cm4ge0FycmF5fSB0aGUgZW51bWVyYWJsZSBhcyBhbiBhcnJh
eS4KLSAgKi8KLSAgdG9BcnJheTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldCA9IEVtYmVyLkEo
KTsKLSAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24obywgaWR4KSB7IHJldFtpZHhdID0gbzsgfSk7
Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIGNvcHkgb2Yg
dGhlIGFycmF5IHdpdGggYWxsIG51bGwgYW5kIHVuZGVmaW5lZCBlbGVtZW50cyByZW1vdmVkLgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCBudWxsLCAiYyIsIHVuZGVm
aW5lZF07Ci0gICAgYXJyLmNvbXBhY3QoKTsgIC8vIFsiYSIsICJjIl0KLSAgICBgYGAKLQotICAg
IEBtZXRob2QgY29tcGFjdAotICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91dCBu
dWxsIGFuZCB1bmRlZmluZWQgZWxlbWVudHMuCi0gICovCi0gIGNvbXBhY3Q6IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUg
IT0gbnVsbDsgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxl
IHRoYXQgZXhjbHVkZXMgdGhlIHBhc3NlZCB2YWx1ZS4gVGhlIGRlZmF1bHQKLSAgICBpbXBsZW1l
bnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJlZ2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUg
dW5sZXNzCi0gICAgdGhlIHJlY2VpdmVyIGRvZXMgbm90IGNvbnRhaW4gdGhlIHZhbHVlLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJhIiwgImMiXTsKLSAg
ICBhcnIud2l0aG91dCgiYSIpOyAgLy8gWyJiIiwgImMiXQotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCB3aXRob3V0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCi0gICAgQHJldHVybiB7RW1iZXIu
RW51bWVyYWJsZX0KLSAgKi8KLSAgd2l0aG91dDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBpZiAo
IXRoaXMuY29udGFpbnModmFsdWUpKSByZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotICAg
IHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKLSAg
ICAgIGlmIChrICE9PSB2YWx1ZSkgcmV0W3JldC5sZW5ndGhdID0gazsKLSAgICB9KSA7Ci0gICAg
cmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxl
IHRoYXQgY29udGFpbnMgb25seSB1bmlxdWUgdmFsdWVzLiBUaGUgZGVmYXVsdAotICAgIGltcGxl
bWVudGF0aW9uIHJldHVybnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlw
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgYXJyID0gWyJhIiwgImEiLCAiYiIsICJi
Il07Ci0gICAgYXJyLnVuaXEoKTsgIC8vIFsiYSIsICJiIl0KLSAgICBgYGAKLQotICAgIEBtZXRo
b2QgdW5pcQotICAgIEByZXR1cm4ge0VtYmVyLkVudW1lcmFibGV9Ci0gICovCi0gIHVuaXE6IGZ1
bmN0aW9uKCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1
bmN0aW9uKGspIHsKLSAgICAgIGlmIChhX2luZGV4T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsK
LSAgICB9KTsKLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVy
dHkgd2lsbCB0cmlnZ2VyIGFueXRpbWUgdGhlIGVudW1lcmFibGUncyBjb250ZW50IGNoYW5nZXMu
Ci0gICAgWW91IGNhbiBvYnNlcnZlIHRoaXMgcHJvcGVydHkgdG8gYmUgbm90aWZpZWQgb2YgY2hh
bmdlcyB0byB0aGUgZW51bWVyYWJsZXMKLSAgICBjb250ZW50LgotCi0gICAgRm9yIHBsYWluIGVu
dW1lcmFibGVzLCB0aGlzIHByb3BlcnR5IGlzIHJlYWQgb25seS4gYEVtYmVyLkFycmF5YCBvdmVy
cmlkZXMKLSAgICB0aGlzIG1ldGhvZC4KLQotICAgIEBwcm9wZXJ0eSBbXQotICAgIEB0eXBlIEVt
YmVyLkFycmF5Ci0gICAgQHJldHVybiB0aGlzCi0gICovCi0gICdbXSc6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfSksCi0KLSAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotICAvLyBFTlVNRVJBQkxFIE9CU0VSVkVSUwotICAvLwotCi0gIC8qKgotICAgIFJlZ2lzdGVy
cyBhbiBlbnVtZXJhYmxlIG9ic2VydmVyLiBNdXN0IGltcGxlbWVudCBgRW1iZXIuRW51bWVyYWJs
ZU9ic2VydmVyYAotICAgIG1peGluLgotCi0gICAgQG1ldGhvZCBhZGRFbnVtZXJhYmxlT2JzZXJ2
ZXIKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0Ci0gICAgQHBhcmFtIHtIYXNofSBbb3B0c10K
LSAgICBAcmV0dXJuIHRoaXMKLSAgKi8KLSAgYWRkRW51bWVyYWJsZU9ic2VydmVyOiBmdW5jdGlv
bih0YXJnZXQsIG9wdHMpIHsKLSAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2ls
bENoYW5nZSkgfHwgJ2VudW1lcmFibGVXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlICA9
IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnZW51bWVyYWJsZURpZENoYW5nZSc7Ci0KLSAg
ICB2YXIgaGFzT2JzZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7
Ci0gICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAn
aGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdA
ZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLmFkZExp
c3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0g
ICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNF
bnVtZXJhYmxlT2JzZXJ2ZXJzJyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlcyBhIHJlZ2lzdGVyZWQgZW51bWVyYWJsZSBvYnNlcnZlci4KLQotICAgIEBtZXRo
b2QgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyCi0gICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAot
ICAgIEBwYXJhbSB7SGFzaH0gW29wdHNdCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0gIHJlbW92
ZUVudW1lcmFibGVPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7Ci0gICAgdmFyIHdp
bGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdlbnVtZXJhYmxlV2lsbENo
YW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5nZSkgfHwg
J2VudW1lcmFibGVEaWRDaGFuZ2UnOwotCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlz
LCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVy
LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAg
IEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQs
IHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJs
ZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0gICAgaWYgKGhhc09ic2VydmVycykgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKLSAg
ICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIg
dGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAgICBv
biB0aGUgYXJyYXkuCi0KLSAgICBAcHJvcGVydHkgaGFzRW51bWVyYWJsZU9ic2VydmVycwotICAg
IEB0eXBlIEJvb2xlYW4KLSAgKi8KLSAgaGFzRW51bWVyYWJsZU9ic2VydmVyczogRW1iZXIuY29t
cHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAn
QGVudW1lcmFibGU6Y2hhbmdlJykgfHwgRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAZW51bWVy
YWJsZTpiZWZvcmUnKTsKLSAgfSksCi0KLQotICAvKioKLSAgICBJbnZva2UgdGhpcyBtZXRob2Qg
anVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZW51bWVyYWJsZSB3aWxsCi0gICAgY2hh
bmdlLiBZb3UgY2FuIGVpdGhlciBvbWl0IHRoZSBwYXJhbWV0ZXJzIGNvbXBsZXRlbHkgb3IgcGFz
cyB0aGUgb2JqZWN0cwotICAgIHRvIGJlIHJlbW92ZWQgb3IgYWRkZWQgaWYgYXZhaWxhYmxlIG9y
IGp1c3QgYSBjb3VudC4KLQotICAgIEBtZXRob2QgZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdl
Ci0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVy
YWJsZSBvZiB0aGUgb2JqZWN0cyB0bwotICAgICAgYmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9m
IGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJl
cn0gYWRkaW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8gYmUKLSAgICAgIGFkZGVk
IG9yIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgYWRkZWQuCi0gICAgQGNoYWluYWJsZQotICAq
LwotICBlbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBhZGRp
bmcpIHsKLQotICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVsdGE7Ci0KLSAgICBpZiAo
J251bWJlcicgPT09IHR5cGVvZiByZW1vdmluZykgcmVtb3ZlQ250ID0gcmVtb3Zpbmc7Ci0gICAg
ZWxzZSBpZiAocmVtb3ZpbmcpIHJlbW92ZUNudCA9IGdldChyZW1vdmluZywgJ2xlbmd0aCcpOwot
ICAgIGVsc2UgcmVtb3ZlQ250ID0gcmVtb3ZpbmcgPSAtMTsKLQotICAgIGlmICgnbnVtYmVyJyA9
PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRkaW5nOwotICAgIGVsc2UgaWYgKGFkZGluZykg
YWRkQ250ID0gZ2V0KGFkZGluZywnbGVuZ3RoJyk7Ci0gICAgZWxzZSBhZGRDbnQgPSBhZGRpbmcg
PSAtMTsKLQotICAgIGhhc0RlbHRhID0gYWRkQ250PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250
LXJlbW92ZUNudCE9PTA7Ci0KLSAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSByZW1vdmluZyA9IG51
bGw7Ci0gICAgaWYgKGFkZGluZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOwotCi0gICAgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdbXScpOwotICAgIGlmIChoYXNEZWx0YSkgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsZW5ndGgnKTsKLSAgICBFbWJlci5zZW5kRXZl
bnQodGhpcywgJ0BlbnVtZXJhYmxlOmJlZm9yZScsIFt0aGlzLCByZW1vdmluZywgYWRkaW5nXSk7
Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBJbnZva2UgdGhpcyBtZXRo
b2Qgd2hlbiB0aGUgY29udGVudHMgb2YgeW91ciBlbnVtZXJhYmxlIGhhcyBjaGFuZ2VkLgotICAg
IFRoaXMgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyB3YXRjaGluZyBmb3IgY29udGVudCBjaGFu
Z2VzLiBJZiB5b3VyIGFyZQotICAgIGltcGxlbWVudGluZyBhbiBvcmRlcmVkIGVudW1lcmFibGUg
KHN1Y2ggYXMgYW4gYXJyYXkpLCBhbHNvIHBhc3MgdGhlCi0gICAgc3RhcnQgYW5kIGVuZCB2YWx1
ZXMgd2hlcmUgdGhlIGNvbnRlbnQgY2hhbmdlZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvCi0g
ICAgbm90aWZ5IHJhbmdlIG9ic2VydmVycy4KLQotICAgIEBtZXRob2QgZW51bWVyYWJsZUNvbnRl
bnREaWRDaGFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gW3N0YXJ0XSBvcHRpb25hbCBzdGFydCBv
ZmZzZXQgZm9yIHRoZSBjb250ZW50IGNoYW5nZS4KLSAgICAgIEZvciB1bm9yZGVyZWQgZW51bWVy
YWJsZXMsIHlvdSBzaG91bGQgYWx3YXlzIHBhc3MgLTEuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVt
ZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0bwot
ICAgICAgYmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0g
ICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gYWRkaW5nICBBbiBlbnVtZXJhYmxl
IG9mIHRoZSBvYmplY3RzIHRvCi0gICAgICBiZSBhZGRlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1z
IHRvIGJlIGFkZGVkLgotICAgIEBjaGFpbmFibGUKLSAgKi8KLSAgZW51bWVyYWJsZUNvbnRlbnRE
aWRDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBhZGRpbmcpIHsKLSAgICB2YXIgcmVtb3ZlQ250
LCBhZGRDbnQsIGhhc0RlbHRhOwotCi0gICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgcmVtb3Zp
bmcpIHJlbW92ZUNudCA9IHJlbW92aW5nOwotICAgIGVsc2UgaWYgKHJlbW92aW5nKSByZW1vdmVD
bnQgPSBnZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKLSAgICBlbHNlIHJlbW92ZUNudCA9IHJlbW92
aW5nID0gLTE7Ci0KLSAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBhZGRpbmcpIGFkZENudCA9
IGFkZGluZzsKLSAgICBlbHNlIGlmIChhZGRpbmcpIGFkZENudCA9IGdldChhZGRpbmcsICdsZW5n
dGgnKTsKLSAgICBlbHNlIGFkZENudCA9IGFkZGluZyA9IC0xOwotCi0gICAgaGFzRGVsdGEgPSBh
ZGRDbnQ8MCB8fCByZW1vdmVDbnQ8MCB8fCBhZGRDbnQtcmVtb3ZlQ250IT09MDsKLQotICAgIGlm
IChyZW1vdmluZyA9PT0gLTEpIHJlbW92aW5nID0gbnVsbDsKLSAgICBpZiAoYWRkaW5nICAgPT09
IC0xKSBhZGRpbmcgICA9IG51bGw7Ci0KLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BlbnVt
ZXJhYmxlOmNoYW5nZScsIFt0aGlzLCByZW1vdmluZywgYWRkaW5nXSk7Ci0gICAgaWYgKGhhc0Rl
bHRhKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgRW1iZXIu
cHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ1tdJyk7Ci0KLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQ29udmVydHMgdGhlIGVudW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQg
c29ydHMgYnkgdGhlIGtleXMKLSAgICBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50LgotCi0gICAg
WW91IG1heSBwcm92aWRlIG11bHRpcGxlIGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHBy
b3BlcnRpZXMuCi0KLSAgICBAbWV0aG9kIHNvcnRCeQotICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9w
ZXJ0eSBuYW1lKHMpIHRvIHNvcnQgb24KLSAgICBAcmV0dXJuIHtBcnJheX0gVGhlIHNvcnRlZCBh
cnJheS4KLSAgICAqLwotICBzb3J0Qnk6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzb3J0S2V5cyA9
IGFyZ3VtZW50czsKLSAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuc29ydChmdW5jdGlvbihhLCBi
KXsKLSAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzb3J0S2V5cy5sZW5ndGg7IGkrKykgewotICAg
ICAgICB2YXIga2V5ID0gc29ydEtleXNbaV0sCi0gICAgICAgIHByb3BBID0gZ2V0KGEsIGtleSks
Ci0gICAgICAgIHByb3BCID0gZ2V0KGIsIGtleSk7Ci0gICAgICAgIC8vIHJldHVybiAxIG9yIC0x
IGVsc2UgY29udGludWUgdG8gdGhlIG5leHQgc29ydEtleQotICAgICAgICB2YXIgY29tcGFyZVZh
bHVlID0gRW1iZXIuY29tcGFyZShwcm9wQSwgcHJvcEIpOwotICAgICAgICBpZiAoY29tcGFyZVZh
bHVlKSB7IHJldHVybiBjb21wYXJlVmFsdWU7IH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwot
ICAgIH0pOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBIRUxQ
RVJTCi0vLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGlzTm9uZSA9
IEVtYmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwgY2FjaGVGb3Ig
PSBFbWJlci5jYWNoZUZvcjsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQVJSQVkKLS8vCi0vKioKLSAgVGhpcyBtb2R1
bGUgaW1wbGVtZW50cyBPYnNlcnZlci1mcmllbmRseSBBcnJheS1saWtlIGJlaGF2aW9yLiBUaGlz
IG1peGluIGlzCi0gIHBpY2tlZCB1cCBieSB0aGUgQXJyYXkgY2xhc3MgYXMgd2VsbCBhcyBvdGhl
ciBjb250cm9sbGVycywgZXRjLiB0aGF0IHdhbnQgdG8KLSAgYXBwZWFyIHRvIGJlIGFycmF5cy4K
LQotICBVbmxpa2UgYEVtYmVyLkVudW1lcmFibGUsYCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9k
cyBzcGVjaWZpY2FsbHkgZm9yCi0gIGNvbGxlY3Rpb25zIHRoYXQgcHJvdmlkZSBpbmRleC1vcmRl
cmVkIGFjY2VzcyB0byB0aGVpciBjb250ZW50cy4gV2hlbiB5b3UKLSAgYXJlIGRlc2lnbmluZyBj
b2RlIHRoYXQgbmVlZHMgdG8gYWNjZXB0IGFueSBraW5kIG9mIEFycmF5LWxpa2Ugb2JqZWN0LCB5
b3UKLSAgc2hvdWxkIHVzZSB0aGVzZSBtZXRob2RzIGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZl
cyBiZWNhdXNlIHRoZXNlIHdpbGwKLSAgcHJvcGVybHkgbm90aWZ5IG9ic2VydmVycyBvZiBjaGFu
Z2VzIHRvIHRoZSBhcnJheS4KLQotICBBbHRob3VnaCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2ll
bnQsIHRoZXkgZG8gYWRkIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gdG8KLSAgeW91ciBhcHBsaWNh
dGlvbiBzbyBpdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgdGhlbSBvbmx5IHdoZW4geW91IG5lZWQg
dGhlCi0gIGZsZXhpYmlsaXR5IG9mIHVzaW5nIGJvdGggdHJ1ZSBKYXZhU2NyaXB0IGFycmF5cyBh
bmQgInZpcnR1YWwiIGFycmF5cyBzdWNoCi0gIGFzIGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9u
cy4KLQotICBZb3UgY2FuIHVzZSB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRv
IGFjY2VzcyBhbmQgbW9kaWZ5IGFycmF5Ci0gIGNvbnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5IHdh
eS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotICBtZW1iZXJzaGlwIG9m
IGFuIGFycmF5IGNoYW5nZXMgYnkgY2hhbmdpbmcgdGhlIHN5bnRheCBvZiB0aGUgcHJvcGVydHkg
dG8KLSAgYC5vYnNlcnZlcygnKm15UHJvcGVydHkuW10nKWAuCi0KLSAgVG8gc3VwcG9ydCBgRW1i
ZXIuQXJyYXlgIGluIHlvdXIgb3duIGNsYXNzLCB5b3UgbXVzdCBvdmVycmlkZSB0d28KLSAgcHJp
bWl0aXZlcyB0byB1c2UgaXQ6IGByZXBsYWNlKClgIGFuZCBgb2JqZWN0QXQoKWAuCi0KLSAgTm90
ZSB0aGF0IHRoZSBFbWJlci5BcnJheSBtaXhpbiBhbHNvIGluY29ycG9yYXRlcyB0aGUgYEVtYmVy
LkVudW1lcmFibGVgCi0gIG1peGluLiBBbGwgYEVtYmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJl
IGFsc28gZW51bWVyYWJsZS4KLQotICBAY2xhc3MgQXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0gIEBzaW5jZSBFbWJlciAwLjkuMAotKi8KLUVtYmVy
LkFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkVudW1lcmFibGUsIHsKLQotICAvKioK
LSAgICBZb3VyIGFycmF5IG11c3Qgc3VwcG9ydCB0aGUgYGxlbmd0aGAgcHJvcGVydHkuIFlvdXIg
cmVwbGFjZSBtZXRob2RzIHNob3VsZAotICAgIHNldCB0aGlzIHByb3BlcnR5IHdoZW5ldmVyIGl0
IGNoYW5nZXMuCi0KLSAgICBAcHJvcGVydHkge051bWJlcn0gbGVuZ3RoCi0gICovCi0gIGxlbmd0
aDogRW1iZXIucmVxdWlyZWQoKSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBvYmplY3QgYXQg
dGhlIGdpdmVuIGBpbmRleGAuIElmIHRoZSBnaXZlbiBgaW5kZXhgIGlzIG5lZ2F0aXZlCi0gICAg
b3IgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBhcnJheSBsZW5ndGgsIHJldHVybnMgYHVu
ZGVmaW5lZGAuCi0KLSAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBp
bXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIElmIHlvdXIgb2JqZWN0IHN1
cHBvcnRzIHJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgp
YAotICAgIChpLmUuIGBteUFycmF5LmdldCgwKWApLCB0aGVuIHlvdSBkbyBub3QgbmVlZCB0byBp
bXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICB5b3Vyc2VsZi4KLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycsICdkJ107Ci0gICAgYXJyLm9iamVjdEF0KDAp
OyAgIC8vICJhIgotICAgIGFyci5vYmplY3RBdCgzKTsgICAvLyAiZCIKLSAgICBhcnIub2JqZWN0
QXQoLTEpOyAgLy8gdW5kZWZpbmVkCi0gICAgYXJyLm9iamVjdEF0KDQpOyAgIC8vIHVuZGVmaW5l
ZAotICAgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBt
ZXRob2Qgb2JqZWN0QXQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCBvZiB0aGUg
aXRlbSB0byByZXR1cm4uCi0gICAgQHJldHVybiB7Kn0gaXRlbSBhdCBpbmRleCBvciB1bmRlZmlu
ZWQKLSAgKi8KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIGlmICgoaWR4IDwgMCkg
fHwgKGlkeD49Z2V0KHRoaXMsICdsZW5ndGgnKSkpIHJldHVybiB1bmRlZmluZWQgOwotICAgIHJl
dHVybiBnZXQodGhpcywgaWR4KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIHJldHVybnMgdGhl
IG9iamVjdHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzLCB1c2luZyBgb2JqZWN0QXRgLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107Ci0g
ICAgYXJyLm9iamVjdHNBdChbMCwgMSwgMl0pOyAgLy8gWyJhIiwgImIiLCAiYyJdCi0gICAgYXJy
Lm9iamVjdHNBdChbMiwgMywgNF0pOyAgLy8gWyJjIiwgImQiLCB1bmRlZmluZWRdCi0gICAgYGBg
Ci0KLSAgICBAbWV0aG9kIG9iamVjdHNBdAotICAgIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgQW4g
YXJyYXkgb2YgaW5kZXhlcyBvZiBpdGVtcyB0byByZXR1cm4uCi0gICAgQHJldHVybiB7QXJyYXl9
Ci0gICAqLwotICBvYmplY3RzQXQ6IGZ1bmN0aW9uKGluZGV4ZXMpIHsKLSAgICB2YXIgc2VsZiA9
IHRoaXM7Ci0gICAgcmV0dXJuIG1hcChpbmRleGVzLCBmdW5jdGlvbihpZHgpIHsgcmV0dXJuIHNl
bGYub2JqZWN0QXQoaWR4KTsgfSk7Ci0gIH0sCi0KLSAgLy8gb3ZlcnJpZGVzIEVtYmVyLkVudW1l
cmFibGUgdmVyc2lvbgotICBuZXh0T2JqZWN0OiBmdW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4g
dGhpcy5vYmplY3RBdChpZHgpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgaXMgdGhlIGhhbmRs
ZXIgZm9yIHRoZSBzcGVjaWFsIGFycmF5IGNvbnRlbnQgcHJvcGVydHkuIElmIHlvdSBnZXQKLSAg
ICB0aGlzIHByb3BlcnR5LCBpdCB3aWxsIHJldHVybiB0aGlzLiBJZiB5b3Ugc2V0IHRoaXMgcHJv
cGVydHkgaXQgYSBuZXcKLSAgICBhcnJheSwgaXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGNv
bnRlbnQuCi0KLSAgICBUaGlzIHByb3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0
eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxlYC4KLQotICAgIEBwcm9wZXJ0eSBbXQotICAg
IEByZXR1cm4gdGhpcwotICAqLwotICAnW10nOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXks
IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMucmVwbGFjZSgwLCBn
ZXQodGhpcywgJ2xlbmd0aCcpLCB2YWx1ZSkgOwotICAgIHJldHVybiB0aGlzIDsKLSAgfSksCi0K
LSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0
aGlzLm9iamVjdEF0KDApOwotICB9KSwKLQotICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5vYmplY3RBdChnZXQodGhpcywgJ2xlbmd0aCcp
LTEpOwotICB9KSwKLQotICAvLyBvcHRpbWl6ZWQgdmVyc2lvbiBmcm9tIEVudW1lcmFibGUKLSAg
Y29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0aGlzLmluZGV4T2Yob2JqKSA+
PSAwOwotICB9LAotCi0gIC8vIEFkZCBhbnkgZXh0cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0
aGF0IGFyZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWluIEFycmF5LgotICAvKioKLSAgICBSZXR1cm5z
IGEgbmV3IGFycmF5IHRoYXQgaXMgYSBzbGljZSBvZiB0aGUgcmVjZWl2ZXIuIFRoaXMgaW1wbGVt
ZW50YXRpb24KLSAgICB1c2VzIHRoZSBvYnNlcnZhYmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmll
dmUgdGhlIG9iamVjdHMgZm9yIHRoZSBuZXcKLSAgICBzbGljZS4KLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICB2YXIgYXJyID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddOwotICAgIGFyci5zbGlj
ZSgwKTsgICAgICAgLy8gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddCi0gICAgYXJyLnNsaWNlKDAs
IDIpOyAgICAvLyBbJ3JlZCcsICdncmVlbiddCi0gICAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBb
J2dyZWVuJywgJ2JsdWUnXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzbGljZQotICAgIEBwYXJh
bSB7SW50ZWdlcn0gYmVnaW5JbmRleCAoT3B0aW9uYWwpIGluZGV4IHRvIGJlZ2luIHNsaWNpbmcg
ZnJvbS4KLSAgICBAcGFyYW0ge0ludGVnZXJ9IGVuZEluZGV4IChPcHRpb25hbCkgaW5kZXggdG8g
ZW5kIHRoZSBzbGljZSBhdC4KLSAgICBAcmV0dXJuIHtBcnJheX0gTmV3IGFycmF5IHdpdGggc3Bl
Y2lmaWVkIHNsaWNlCi0gICovCi0gIHNsaWNlOiBmdW5jdGlvbihiZWdpbkluZGV4LCBlbmRJbmRl
eCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdmFyIGxlbmd0aCA9IGdldCh0aGlz
LCAnbGVuZ3RoJykgOwotICAgIGlmIChpc05vbmUoYmVnaW5JbmRleCkpIGJlZ2luSW5kZXggPSAw
IDsKLSAgICBpZiAoaXNOb25lKGVuZEluZGV4KSB8fCAoZW5kSW5kZXggPiBsZW5ndGgpKSBlbmRJ
bmRleCA9IGxlbmd0aCA7Ci0KLSAgICBpZiAoYmVnaW5JbmRleCA8IDApIGJlZ2luSW5kZXggPSBs
ZW5ndGggKyBiZWdpbkluZGV4OwotICAgIGlmIChlbmRJbmRleCA8IDApIGVuZEluZGV4ID0gbGVu
Z3RoICsgZW5kSW5kZXg7Ci0KLSAgICB3aGlsZShiZWdpbkluZGV4IDwgZW5kSW5kZXgpIHsKLSAg
ICAgIHJldFtyZXQubGVuZ3RoXSA9IHRoaXMub2JqZWN0QXQoYmVnaW5JbmRleCsrKSA7Ci0gICAg
fQotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGluZGV4
IG9mIHRoZSBnaXZlbiBvYmplY3QncyBmaXJzdCBvY2N1cnJlbmNlLgotICAgIElmIG5vIGBzdGFy
dEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIHRvCi0gICAgc2Vh
cmNoIGlzIDAuIElmIGl0J3MgbmVnYXRpdmUsIHdpbGwgY291bnQgYmFja3dhcmQgZnJvbQotICAg
IHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJjIiwgImQiLCAi
YSJdOwotICAgIGFyci5pbmRleE9mKCJhIik7ICAgICAgIC8vICAwCi0gICAgYXJyLmluZGV4T2Yo
InoiKTsgICAgICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDIpOyAgICAvLyAgNAotICAg
IGFyci5pbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0Ci0gICAgYXJyLmluZGV4T2YoImIiLCAzKTsg
ICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDEwMCk7ICAvLyAtMQotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCBpbmRleE9mCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0
byBzZWFyY2ggZm9yCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRp
bmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKLSAgICBAcmV0dXJuIHtOdW1iZXJ9IGlu
ZGV4IG9yIC0xIGlmIG5vdCBmb3VuZAotICAqLwotICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3Qs
IHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotCi0g
ICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgc3RhcnRBdCA9IDA7Ci0gICAgaWYgKHN0YXJ0
QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKLQotICAgIGZvcihpZHg9c3RhcnRBdDtpZHg8bGVuO2lk
eCsrKSB7Ci0gICAgICBpZiAodGhpcy5vYmplY3RBdChpZHgpID09PSBvYmplY3QpIHJldHVybiBp
ZHggOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0
aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCdzIGxhc3Qgb2NjdXJyZW5jZS4KLSAgICBJZiBu
byBgc3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBzZWFyY2ggc3RhcnRzIGZyb20KLSAg
ICB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgaXQncyBuZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNrd2Fy
ZAotICAgIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIFJldHVybnMgLTEgaWYgbm8gbWF0Y2gg
aXMgZm91bmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwg
ImMiLCAiZCIsICJhIl07Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJhIik7ICAgICAgIC8vICA0Ci0g
ICAgYXJyLmxhc3RJbmRleE9mKCJ6Iik7ICAgICAgIC8vIC0xCi0gICAgYXJyLmxhc3RJbmRleE9m
KCJhIiwgMik7ICAgIC8vICAwCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0
Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJiIiwgMyk7ICAgIC8vICAxCi0gICAgYXJyLmxhc3RJbmRl
eE9mKCJhIiwgMTAwKTsgIC8vICA0Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGxhc3RJbmRleE9m
Ci0gICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yCi0gICAg
QHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2Vh
cmNoLCBkZWZhdWx0IDAKLSAgICBAcmV0dXJuIHtOdW1iZXJ9IGluZGV4IG9yIC0xIGlmIG5vdCBm
b3VuZAotICAqLwotICBsYXN0SW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0KSB7Ci0g
ICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLQotICAgIGlmIChzdGFydEF0
ID09PSB1bmRlZmluZWQgfHwgc3RhcnRBdCA+PSBsZW4pIHN0YXJ0QXQgPSBsZW4tMTsKLSAgICBp
ZiAoc3RhcnRBdCA8IDApIHN0YXJ0QXQgKz0gbGVuOwotCi0gICAgZm9yKGlkeD1zdGFydEF0O2lk
eD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXMub2JqZWN0QXQoaWR4KSA9PT0gb2JqZWN0KSBy
ZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8g
QVJSQVkgT0JTRVJWRVJTCi0gIC8vCi0KLSAgLyoqCi0gICAgQWRkcyBhbiBhcnJheSBvYnNlcnZl
ciB0byB0aGUgcmVjZWl2aW5nIGFycmF5LiBUaGUgYXJyYXkgb2JzZXJ2ZXIgb2JqZWN0Ci0gICAg
bm9ybWFsbHkgbXVzdCBpbXBsZW1lbnQgdHdvIG1ldGhvZHM6Ci0KLSAgICAqIGBhcnJheVdpbGxD
aGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMg
bWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgaXMgbW9k
aWZpZWQuCi0gICAgKiBgYXJyYXlEaWRDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVD
b3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0
IGFmdGVyIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KLQotICAgIEJvdGggY2FsbGJhY2tzIHdpbGwg
YmUgcGFzc2VkIHRoZSBvYnNlcnZlZCBvYmplY3QsIHN0YXJ0aW5nIGluZGV4IG9mIHRoZQotICAg
IGNoYW5nZSBhcyB3ZWxsIGEgYSBjb3VudCBvZiB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQg
YWRkZWQuIFlvdSBjYW4gdXNlCi0gICAgdGhlc2UgY2FsbGJhY2tzIHRvIG9wdGlvbmFsbHkgaW5z
cGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFuZ2UsIGNsZWFyCi0gICAgY2FjaGVzLCBvciBk
byBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNzYXJ5LgotCi0gICAgSW4gYWRkaXRpb24gdG8g
cGFzc2luZyBhIHRhcmdldCwgeW91IGNhbiBhbHNvIGluY2x1ZGUgYW4gb3B0aW9ucyBoYXNoCi0g
ICAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdp
bGwgYmUgaW52b2tlZCBvbiB0aGUKLSAgICB0YXJnZXQuCi0KLSAgICBAbWV0aG9kIGFkZEFycmF5
T2JzZXJ2ZXIKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSBvYnNlcnZlciBvYmplY3Qu
Ci0gICAgQHBhcmFtIHtIYXNofSBvcHRzIE9wdGlvbmFsIGhhc2ggb2YgY29uZmlndXJhdGlvbiBv
cHRpb25zIGluY2x1ZGluZwotICAgICAgYHdpbGxDaGFuZ2VgIGFuZCBgZGlkQ2hhbmdlYCBvcHRp
b24uCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICovCi0gIGFkZEFycmF5
T2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgewotICAgIHZhciB3aWxsQ2hhbmdlID0g
KG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnYXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAg
ZGlkQ2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnYXJyYXlEaWRDaGFuZ2Un
OwotCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMn
KTsKLSAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMs
ICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdAYXJy
YXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0
aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKLSAgICBpZiAoIWhhc09i
c2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJz
Jyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbiBhcnJh
eSBvYnNlcnZlciBmcm9tIHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKLSAg
ICByZWdpc3RlcmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIHdpdGggdGhl
IHNhbWUgb2JqZWN0IHdpbGwKLSAgICBoYXZlIG5vIGVmZmVjdC4KLQotICAgIEBtZXRob2QgcmVt
b3ZlQXJyYXlPYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBv
YnNlcnZpbmcgdGhlIGFycmF5LgotICAgIEBwYXJhbSB7SGFzaH0gb3B0cyBPcHRpb25hbCBoYXNo
IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcKLSAgICAgIGB3aWxsQ2hhbmdlYCBh
bmQgYGRpZENoYW5nZWAgb3B0aW9uLgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgotICAqLwotICByZW1vdmVBcnJheU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsK
LSAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2FycmF5
V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5n
ZSkgfHwgJ2FycmF5RGlkQ2hhbmdlJzsKLQotICAgIHZhciBoYXNPYnNlcnZlcnMgPSBnZXQodGhp
cywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7Ci0gICAgaWYgKGhhc09ic2VydmVycykgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVtYmVyLnJl
bW92ZUxpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsK
LSAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwg
ZGlkQ2hhbmdlKTsKLSAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5n
ZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQot
ICAvKioKLSAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMg
b2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAgICBvbiB0aGUgYXJyYXkuCi0KLSAgICBAcHJv
cGVydHkgQm9vbGVhbgotICAqLwotICBoYXNBcnJheU9ic2VydmVyczogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGFycmF5
OmNoYW5nZScpIHx8IEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGFycmF5OmJlZm9yZScpOwot
ICB9KSwKLQotICAvKioKLSAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhbiBvYmplY3QgdGhh
dCBzdXBwb3J0cyBgRW1iZXIuQXJyYXlgLCBjYWxsIHRoaXMKLSAgICBtZXRob2QganVzdCBiZWZv
cmUgdGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0byBub3RpZnkgYW55IG9ic2VydmVycyBhbmQK
LSAgICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5n
IGluZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3Vu
dHMgdG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlCi0gICAg
QHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4IFRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkg
dGhhdCB3aWxsIGNoYW5nZS4KLSAgICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1i
ZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHlvdQotICAgICAgcGFzcyBgbnVs
bGAgYXNzdW1lcyAwCi0gICAgQHBhcmFtIHtOdW1iZXJ9IGFkZEFtdCBUaGUgbnVtYmVyIG9mIGl0
ZW1zIHRoYXQgd2lsbCBiZSBhZGRlZC4gSWYgeW91Ci0gICAgICBwYXNzIGBudWxsYCBhc3N1bWVz
IDAuCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICovCi0gIGFycmF5Q29u
dGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgewot
Ci0gICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMK
LSAgICBpZiAoc3RhcnRJZHg9PT11bmRlZmluZWQpIHsKLSAgICAgIHN0YXJ0SWR4ID0gMDsKLSAg
ICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocmVt
b3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKLSAgICAgIGlmIChhZGRBbXQgICAg
PT09IHVuZGVmaW5lZCkgYWRkQW10PS0xOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUg
QGVhY2ggcHJveHkgaXMgc2V0IHVwIGlmIGFueW9uZSBpcyBvYnNlcnZpbmcgQGVhY2gKLSAgICBp
ZiAoRW1iZXIuaXNXYXRjaGluZyh0aGlzLCAnQGVhY2gnKSkgeyBnZXQodGhpcywgJ0BlYWNoJyk7
IH0KLQotICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmJlZm9yZScsIFt0aGlzLCBz
dGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXRdKTsKLQotICAgIHZhciByZW1vdmluZywgbGltOwot
ICAgIGlmIChzdGFydElkeD49MCAmJiByZW1vdmVBbXQ+PTAgJiYgZ2V0KHRoaXMsICdoYXNFbnVt
ZXJhYmxlT2JzZXJ2ZXJzJykpIHsKLSAgICAgIHJlbW92aW5nID0gW107Ci0gICAgICBsaW0gPSBz
dGFydElkeCtyZW1vdmVBbXQ7Ci0gICAgICBmb3IodmFyIGlkeD1zdGFydElkeDtpZHg8bGltO2lk
eCsrKSByZW1vdmluZy5wdXNoKHRoaXMub2JqZWN0QXQoaWR4KSk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIHJlbW92aW5nID0gcmVtb3ZlQW10OwotICAgIH0KLQotICAgIHRoaXMuZW51bWVyYWJsZUNv
bnRlbnRXaWxsQ2hhbmdlKHJlbW92aW5nLCBhZGRBbXQpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQg
c3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCi0gICAgbWV0aG9kIGp1c3QgYWZ0ZXIg
dGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0byBub3RpZnkgYW55IG9ic2VydmVycyBhbmQKLSAg
ICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5nIGlu
ZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMg
dG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBhcnJheUNvbnRlbnREaWRDaGFuZ2UKLSAgICBAcGFy
YW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSB0aGF0
IGRpZCBjaGFuZ2UuCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZUFtdCBUaGUgbnVtYmVyIG9m
IGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLiBJZiB5b3UKLSAgICAgIHBhc3MgYG51bGxgIGFzc3Vt
ZXMgMAotICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0
IHdlcmUgYWRkZWQuIElmIHlvdQotICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwLgotICAgIEBy
ZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgotICAqLwotICBhcnJheUNvbnRlbnREaWRDaGFu
Z2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgewotCi0gICAgLy8gaWYg
bm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMKLSAgICBpZiAoc3Rh
cnRJZHg9PT11bmRlZmluZWQpIHsKLSAgICAgIHN0YXJ0SWR4ID0gMDsKLSAgICAgIHJlbW92ZUFt
dCA9IGFkZEFtdCA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocmVtb3ZlQW10ID09PSB1
bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKLSAgICAgIGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5l
ZCkgYWRkQW10PS0xOwotICAgIH0KLQotICAgIHZhciBhZGRpbmcsIGxpbTsKLSAgICBpZiAoc3Rh
cnRJZHg+PTAgJiYgYWRkQW10Pj0wICYmIGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVy
cycpKSB7Ci0gICAgICBhZGRpbmcgPSBbXTsKLSAgICAgIGxpbSA9IHN0YXJ0SWR4K2FkZEFtdDsK
LSAgICAgIGZvcih2YXIgaWR4PXN0YXJ0SWR4O2lkeDxsaW07aWR4KyspIGFkZGluZy5wdXNoKHRo
aXMub2JqZWN0QXQoaWR4KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFkZGluZyA9IGFkZEFtdDsK
LSAgICB9Ci0KLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKHJlbW92ZUFtdCwg
YWRkaW5nKTsKLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BhcnJheTpjaGFuZ2UnLCBbdGhp
cywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10XSk7Ci0KLSAgICB2YXIgbGVuZ3RoICAgICAg
PSBnZXQodGhpcywgJ2xlbmd0aCcpLAotICAgICAgICBjYWNoZWRGaXJzdCA9IGNhY2hlRm9yKHRo
aXMsICdmaXJzdE9iamVjdCcpLAotICAgICAgICBjYWNoZWRMYXN0ICA9IGNhY2hlRm9yKHRoaXMs
ICdsYXN0T2JqZWN0Jyk7Ci0gICAgaWYgKHRoaXMub2JqZWN0QXQoMCkgIT09IGNhY2hlZEZpcnN0
KSB7Ci0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7
Ci0gICAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKLSAg
ICB9Ci0gICAgaWYgKHRoaXMub2JqZWN0QXQobGVuZ3RoLTEpICE9PSBjYWNoZWRMYXN0KSB7Ci0g
ICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICAg
IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBFTlVNRVJBVEVEIFBST1BFUlRJ
RVMKLSAgLy8KLQotICAvKioKLSAgICBSZXR1cm5zIGEgc3BlY2lhbCBvYmplY3QgdGhhdCBjYW4g
YmUgdXNlZCB0byBvYnNlcnZlIGluZGl2aWR1YWwgcHJvcGVydGllcwotICAgIG9uIHRoZSBhcnJh
eS4gSnVzdCBnZXQgYW4gZXF1aXZhbGVudCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCBhbmQgaXQg
d2lsbAotICAgIHJldHVybiBhbiBlbnVtZXJhYmxlIHRoYXQgbWFwcyBhdXRvbWF0aWNhbGx5IHRv
IHRoZSBuYW1lZCBrZXkgb24gdGhlCi0gICAgbWVtYmVyIG9iamVjdHMuCi0KLSAgICBJZiB5b3Ug
bWVyZWx5IHdhbnQgdG8gd2F0Y2ggZm9yIGFueSBpdGVtcyBiZWluZyBhZGRlZCBvciByZW1vdmVk
IHRvIHRoZSBhcnJheSwKLSAgICB1c2UgdGhlIGBbXWAgcHJvcGVydHkgaW5zdGVhZCBvZiBgQGVh
Y2hgLgotCi0gICAgQHByb3BlcnR5IEBlYWNoCi0gICovCi0gICdAZWFjaCc6IEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5fX2VhY2gpIHRoaXMuX19lYWNoID0gbmV3
IEVtYmVyLkVhY2hQcm94eSh0aGlzKTsKLSAgICByZXR1cm4gdGhpcy5fX2VhY2g7Ci0gIH0pCi0K
LX0pIDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBlX2dldCA9IEVtYmVyLmdl
dCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0g
ICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgcHJvcGVydHlXaWxsQ2hhbmdlID0gRW1iZXIu
cHJvcGVydHlXaWxsQ2hhbmdlLAotICAgIHByb3BlcnR5RGlkQ2hhbmdlID0gRW1iZXIucHJvcGVy
dHlEaWRDaGFuZ2UsCi0gICAgYWRkQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5hZGRCZWZvcmVPYnNl
cnZlciwKLSAgICByZW1vdmVCZWZvcmVPYnNlcnZlciA9IEVtYmVyLnJlbW92ZUJlZm9yZU9ic2Vy
dmVyLAotICAgIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCi0gICAgcmVtb3ZlT2Jz
ZXJ2ZXIgPSBFbWJlci5yZW1vdmVPYnNlcnZlciwKLSAgICBDb21wdXRlZFByb3BlcnR5ID0gRW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eSwKLSAgICBhX3NsaWNlID0gW10uc2xpY2UsCi0gICAgb19jcmVh
dGUgPSBFbWJlci5jcmVhdGUsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5m
b3JFYWNoLAotICAgIC8vIEhlcmUgd2UgZXhwbGljaXRseSBkb24ndCBhbGxvdyBgQGVhY2guZm9v
YDsgaXQgd291bGQgcmVxdWlyZSBzb21lIHNwZWNpYWwKLSAgICAvLyB0ZXN0aW5nLCBidXQgdGhl
cmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgaXQgc2hvdWxkIGJlIGRpc2FsbG93ZWQuCi0g
ICAgZWFjaFByb3BlcnR5UGF0dGVybiA9IC9eKC4qKVwuQGVhY2hcLiguKikvLAotICAgIGRvdWJs
ZUVhY2hQcm9wZXJ0eVBhdHRlcm4gPSAvKC4qXC5AZWFjaCl7Mix9LywKLSAgICBhcnJheUJyYWNr
ZXRQYXR0ZXJuID0gL1wuXFtcXSQvOwotCi0KLWZ1bmN0aW9uIGdldChvYmosIGtleSkgewotICBp
ZiAoa2V5ID09PSAnQHRoaXMnKSB7Ci0gICAgcmV0dXJuIG9iajsKLSAgfQotCi0gIHJldHVybiBl
X2dldChvYmosIGtleSk7Ci19Ci0KLS8qCi0gIFRyYWNrcyBjaGFuZ2VzIHRvIGRlcGVuZGVudCBh
cnJheXMsIGFzIHdlbGwgYXMgdG8gcHJvcGVydGllcyBvZiBpdGVtcyBpbgotICBkZXBlbmRlbnQg
YXJyYXlzLgotCi0gIEBjbGFzcyBEZXBlbmRlbnRBcnJheXNPYnNlcnZlcgotKi8KLWZ1bmN0aW9u
IERlcGVuZGVudEFycmF5c09ic2VydmVyKGNhbGxiYWNrcywgY3AsIGluc3RhbmNlTWV0YSwgY29u
dGV4dCwgcHJvcGVydHlOYW1lLCBzdWdhck1ldGEpIHsKLSAgLy8gdXNlciBzcGVjaWZpZWQgY2Fs
bGJhY2tzIGZvciBgYWRkZWRJdGVtYCBhbmQgYHJlbW92ZWRJdGVtYAotICB0aGlzLmNhbGxiYWNr
cyA9IGNhbGxiYWNrczsKLQotICAvLyB0aGUgY29tcHV0ZWQgcHJvcGVydHk6IHJlbWVtYmVyIHRo
ZXNlIGFyZSBzaGFyZWQgYWNyb3NzIGluc3RhbmNlcwotICB0aGlzLmNwID0gY3A7Ci0KLSAgLy8g
dGhlIFJlZHVjZUNvbXB1dGVkUHJvcGVydHlJbnN0YW5jZU1ldGEgdGhpcyBEZXBlbmRlbnRBcnJh
eXNPYnNlcnZlciBpcwotICAvLyBhc3NvY2lhdGVkIHdpdGgKLSAgdGhpcy5pbnN0YW5jZU1ldGEg
PSBpbnN0YW5jZU1ldGE7Ci0KLSAgLy8gQSBtYXAgb2YgYXJyYXkgZ3VpZHMgdG8gZGVwZW5kZW50
S2V5cywgZm9yIHRoZSBnaXZlbiBjb250ZXh0LiAgV2UgdHJhY2sKLSAgLy8gdGhpcyBiZWNhdXNl
IHdlIHdhbnQgdG8gc2V0IHVwIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBwb3RlbnRpYWxseSBiZWZv
cmUgdGhlCi0gIC8vIGRlcGVuZGVudCBhcnJheSBldmVuIGV4aXN0cywgYnV0IHdoZW4gdGhlIGFy
cmF5IG9ic2VydmVyIGZpcmVzLCB3ZSBsYWNrCi0gIC8vIGVub3VnaCBjb250ZXh0IHRvIGtub3cg
d2hhdCB0byB1cGRhdGU6IHdlIGNhbiByZWNvdmVyIHRoYXQgY29udGV4dCBieQotICAvLyBnZXR0
aW5nIHRoZSBkZXBlbmRlbnRLZXkuCi0gIHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZCA9IHt9Owot
Ci0gIC8vIGEgbWFwIG9mIGRlcGVuZGVudCBhcnJheSBndWlkcyAtPiBFbWJlci5UcmFja2VkQXJy
YXkgaW5zdGFuY2VzLiAgV2UgdXNlCi0gIC8vIHRoaXMgdG8gbGF6aWx5IHJlY29tcHV0ZSBpbmRl
eGVzIGZvciBpdGVtIHByb3BlcnR5IG9ic2VydmVycy4KLSAgdGhpcy50cmFja2VkQXJyYXlzQnlH
dWlkID0ge307Ci0KLSAgLy8gV2Ugc3VzcGVuZCBvYnNlcnZlcnMgdG8gaWdub3JlIHJlcGxhY2Vt
ZW50cyBmcm9tIGByZXNldGAgd2hlbiB0b3RhbGx5Ci0gIC8vIHJlY29tcHV0aW5nLiAgVW5mb3J0
dW5hdGVseSB3ZSBjYW5ub3QgcHJvcGVybHkgc3VzcGVuZCB0aGUgb2JzZXJ2ZXJzCi0gIC8vIGJl
Y2F1c2Ugd2Ugb25seSBoYXZlIHRoZSBrZXk7IGluc3RlYWQgd2UgbWFrZSB0aGUgb2JzZXJ2ZXJz
IG5vLW9wcwotICB0aGlzLnN1c3BlbmRlZCA9IGZhbHNlOwotCi0gIC8vIFRoaXMgaXMgdXNlZCB0
byBjb2FsZXNjZSBpdGVtIGNoYW5nZXMgZnJvbSBwcm9wZXJ0eSBvYnNlcnZlcnMuCi0gIHRoaXMu
Y2hhbmdlZEl0ZW1zID0ge307Ci19Ci0KLWZ1bmN0aW9uIEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29u
dGV4dCAoZGVwZW5kZW50QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsKLSAgRW1iZXIuYXNz
ZXJ0KCJJbnRlcm5hbCBlcnJvcjogdHJhY2tlZEFycmF5IGlzIG51bGwgb3IgdW5kZWZpbmVkIiwg
dHJhY2tlZEFycmF5KTsKLQotICB0aGlzLmRlcGVuZGVudEFycmF5ID0gZGVwZW5kZW50QXJyYXk7
Ci0gIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgdGhpcy5pdGVtID0gZGVwZW5kZW50QXJyYXkub2Jq
ZWN0QXQoaW5kZXgpOwotICB0aGlzLnRyYWNrZWRBcnJheSA9IHRyYWNrZWRBcnJheTsKLSAgdGhp
cy5iZWZvcmVPYnNlcnZlciA9IG51bGw7Ci0gIHRoaXMub2JzZXJ2ZXIgPSBudWxsOwotCi0gIHRo
aXMuZGVzdHJveWVkID0gZmFsc2U7Ci19Ci0KLURlcGVuZGVudEFycmF5c09ic2VydmVyLnByb3Rv
dHlwZSA9IHsKLSAgc2V0VmFsdWU6IGZ1bmN0aW9uIChuZXdWYWx1ZSkgewotICAgIHRoaXMuaW5z
dGFuY2VNZXRhLnNldFZhbHVlKG5ld1ZhbHVlLCB0cnVlKTsKLSAgfSwKLSAgZ2V0VmFsdWU6IGZ1
bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhpcy5pbnN0YW5jZU1ldGEuZ2V0VmFsdWUoKTsKLSAg
fSwKLQotICBzZXR1cE9ic2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRl
bnRLZXkpIHsKLSAgICBFbWJlci5hc3NlcnQoImRlcGVuZGVudCBhcnJheSBtdXN0IGJlIGFuIGBF
bWJlci5BcnJheWAiLCBFbWJlci5BcnJheS5kZXRlY3QoZGVwZW5kZW50QXJyYXkpKTsKLQotICAg
IHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtndWlkRm9yKGRlcGVuZGVudEFycmF5KV0gPSBkZXBl
bmRlbnRLZXk7Ci0KLSAgICBkZXBlbmRlbnRBcnJheS5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsK
LSAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFuZ2UnLAotICAgICAgZGlk
Q2hhbmdlOiAnZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0KLSAgICBpZiAodGhp
cy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldKSB7Ci0gICAgICB0aGlzLnNldHVw
UHJvcGVydHlPYnNlcnZlcnMoZGVwZW5kZW50S2V5LCB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlz
W2RlcGVuZGVudEtleV0pOwotICAgIH0KLSAgfSwKLQotICB0ZWFyZG93bk9ic2VydmVyczogZnVu
Y3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpIHsKLSAgICB2YXIgaXRlbVByb3Bl
cnR5S2V5cyA9IHRoaXMuY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSB8fCBbXTsK
LQotICAgIGRlbGV0ZSB0aGlzLmRlcGVuZGVudEtleXNCeUd1aWRbZ3VpZEZvcihkZXBlbmRlbnRB
cnJheSldOwotCi0gICAgdGhpcy50ZWFyZG93blByb3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtl
eSwgaXRlbVByb3BlcnR5S2V5cyk7Ci0KLSAgICBkZXBlbmRlbnRBcnJheS5yZW1vdmVBcnJheU9i
c2VydmVyKHRoaXMsIHsKLSAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFu
Z2UnLAotICAgICAgZGlkQ2hhbmdlOiAnZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7
Ci0gIH0sCi0KLSAgc3VzcGVuZEFycmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGJp
bmRpbmcpIHsKLSAgICB2YXIgb2xkU3VzcGVuZGVkID0gdGhpcy5zdXNwZW5kZWQ7Ci0gICAgdGhp
cy5zdXNwZW5kZWQgPSB0cnVlOwotICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyk7Ci0gICAgdGhp
cy5zdXNwZW5kZWQgPSBvbGRTdXNwZW5kZWQ7Ci0gIH0sCi0KLSAgc2V0dXBQcm9wZXJ0eU9ic2Vy
dmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaXRlbVByb3BlcnR5S2V5cykgewotICAgIHZh
ciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlzLmluc3RhbmNlTWV0YS5jb250ZXh0LCBkZXBlbmRl
bnRLZXkpLAotICAgICAgICBsZW5ndGggPSBnZXQoZGVwZW5kZW50QXJyYXksICdsZW5ndGgnKSwK
LSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBBcnJheShsZW5ndGgpOwotCi0gICAgdGhp
cy5yZXNldFRyYW5zZm9ybWF0aW9ucyhkZXBlbmRlbnRLZXksIG9ic2VydmVyQ29udGV4dHMpOwot
Ci0gICAgZm9yRWFjaChkZXBlbmRlbnRBcnJheSwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7Ci0g
ICAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVyQ29u
dGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBl
bmRlbnRLZXldKTsKLSAgICAgIG9ic2VydmVyQ29udGV4dHNbaW5kZXhdID0gb2JzZXJ2ZXJDb250
ZXh0OwotCi0gICAgICBmb3JFYWNoKGl0ZW1Qcm9wZXJ0eUtleXMsIGZ1bmN0aW9uIChwcm9wZXJ0
eUtleSkgewotICAgICAgICBhZGRCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhp
cywgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyKTsKLSAgICAgICAgYWRkT2JzZXJ2ZXIo
aXRlbSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcik7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICB0ZWFyZG93blByb3BlcnR5T2Jz
ZXJ2ZXJzOiBmdW5jdGlvbiAoZGVwZW5kZW50S2V5LCBpdGVtUHJvcGVydHlLZXlzKSB7Ci0gICAg
dmFyIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIgPSB0aGlzLAotICAgICAgICB0cmFja2VkQXJyYXkg
PSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5XSwKLSAgICAgICAgYmVmb3Jl
T2JzZXJ2ZXIsCi0gICAgICAgIG9ic2VydmVyLAotICAgICAgICBpdGVtOwotCi0gICAgaWYgKCF0
cmFja2VkQXJyYXkpIHsgcmV0dXJuOyB9Ci0KLSAgICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rp
b24gKG9ic2VydmVyQ29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7Ci0gICAgICBpZiAob3Bl
cmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFKSB7IHJldHVybjsgfQotCi0gICAg
ICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1bmN0aW9uIChvYnNlcnZlckNvbnRleHQpIHsK
LSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0LmRlc3Ryb3llZCA9IHRydWU7Ci0gICAgICAgIGJlZm9y
ZU9ic2VydmVyID0gb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyOwotICAgICAgICBvYnNl
cnZlciA9IG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcjsKLSAgICAgICAgaXRlbSA9IG9ic2VydmVy
Q29udGV4dC5pdGVtOwotCi0gICAgICAgIGZvckVhY2goaXRlbVByb3BlcnR5S2V5cywgZnVuY3Rp
b24gKHByb3BlcnR5S2V5KSB7Ci0gICAgICAgICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwg
cHJvcGVydHlLZXksIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIsIGJlZm9yZU9ic2VydmVyKTsKLSAg
ICAgICAgICByZW1vdmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgZGVwZW5kZW50QXJyYXlP
YnNlcnZlciwgb2JzZXJ2ZXIpOwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAgIH0pOwotICB9
LAotCi0gIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXJDb250ZXh0OiBmdW5jdGlvbiAoZGVwZW5kZW50
QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsKLSAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0g
bmV3IEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29udGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRy
YWNrZWRBcnJheSk7Ci0KLSAgICB0aGlzLmNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIob2JzZXJ2ZXJD
b250ZXh0KTsKLQotICAgIHJldHVybiBvYnNlcnZlckNvbnRleHQ7Ci0gIH0sCi0KLSAgY3JlYXRl
UHJvcGVydHlPYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dCkgewotICAgIHZhciBk
ZXBlbmRlbnRBcnJheU9ic2VydmVyID0gdGhpczsKLQotICAgIG9ic2VydmVyQ29udGV4dC5iZWZv
cmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKLSAgICAgIHJldHVybiBkZXBl
bmRlbnRBcnJheU9ic2VydmVyLml0ZW1Qcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBv
YnNlcnZlckNvbnRleHQuZGVwZW5kZW50QXJyYXksIG9ic2VydmVyQ29udGV4dCk7Ci0gICAgfTsK
LSAgICBvYnNlcnZlckNvbnRleHQub2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7
Ci0gICAgICByZXR1cm4gZGVwZW5kZW50QXJyYXlPYnNlcnZlci5pdGVtUHJvcGVydHlEaWRDaGFu
Z2Uob2JqLCBrZXlOYW1lLCBvYnNlcnZlckNvbnRleHQuZGVwZW5kZW50QXJyYXksIG9ic2VydmVy
Q29udGV4dCk7Ci0gICAgfTsKLSAgfSwKLQotICByZXNldFRyYW5zZm9ybWF0aW9uczogZnVuY3Rp
b24gKGRlcGVuZGVudEtleSwgb2JzZXJ2ZXJDb250ZXh0cykgewotICAgIHRoaXMudHJhY2tlZEFy
cmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldID0gbmV3IEVtYmVyLlRyYWNrZWRBcnJheShvYnNlcnZl
ckNvbnRleHRzKTsKLSAgfSwKLQotICB0cmFja0FkZDogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwg
aW5kZXgsIG5ld0l0ZW1zKSB7Ci0gICAgdmFyIHRyYWNrZWRBcnJheSA9IHRoaXMudHJhY2tlZEFy
cmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldOwotICAgIGlmICh0cmFja2VkQXJyYXkpIHsKLSAgICAg
IHRyYWNrZWRBcnJheS5hZGRJdGVtcyhpbmRleCwgbmV3SXRlbXMpOwotICAgIH0KLSAgfSwKLQot
ICB0cmFja1JlbW92ZTogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaW5kZXgsIHJlbW92ZWRDb3Vu
dCkgewotICAgIHZhciB0cmFja2VkQXJyYXkgPSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVw
ZW5kZW50S2V5XTsKLQotICAgIGlmICh0cmFja2VkQXJyYXkpIHsKLSAgICAgIHJldHVybiB0cmFj
a2VkQXJyYXkucmVtb3ZlSXRlbXMoaW5kZXgsIHJlbW92ZWRDb3VudCk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIFtdOwotICB9LAotCi0gIHVwZGF0ZUluZGV4ZXM6IGZ1bmN0aW9uICh0cmFja2VkQXJy
YXksIGFycmF5KSB7Ci0gICAgdmFyIGxlbmd0aCA9IGdldChhcnJheSwgJ2xlbmd0aCcpOwotICAg
IC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzdG9wIHVwZGF0aW5nIG9uY2Ugd2UgaGl0IHRoZSBvYmpl
Y3Qgd2hvc2Ugb2JzZXJ2ZXIKLSAgICAvLyBmaXJlZDsgaWUgcGFydGlhbGx5IGFwcGx5IHRoZSB0
cmFuc2Zvcm1hdGlvbnMKLSAgICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVy
Q29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7Ci0gICAgICAvLyB3ZSBkb24ndCBldmVuIGhh
dmUgb2JzZXJ2ZXIgY29udGV4dHMgZm9yIHJlbW92ZWQgaXRlbXMsIGV2ZW4gaWYgd2UgZGlkLAot
ICAgICAgLy8gdGhleSBubyBsb25nZXIgaGF2ZSBhbnkgaW5kZXggaW4gdGhlIGFycmF5Ci0gICAg
ICBpZiAob3BlcmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFKSB7IHJldHVybjsg
fQotICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gRW1iZXIuVHJhY2tlZEFycmF5LlJFVEFJTiAmJiBv
YnNlcnZlckNvbnRleHRzLmxlbmd0aCA9PT0gbGVuZ3RoICYmIG9mZnNldCA9PT0gMCkgewotICAg
ICAgICAvLyBJZiB3ZSB1cGRhdGUgbWFueSBpdGVtcyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhl
IGFycmF5IGVhY2ggdGltZTogd2UKLSAgICAgICAgLy8gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUg
aW5kZXhlcyBhdCBtb3N0IG9uY2UgcGVyIHJ1biBsb29wLgotICAgICAgICByZXR1cm47Ci0gICAg
ICB9Ci0KLSAgICAgIGZvckVhY2gob2JzZXJ2ZXJDb250ZXh0cywgZnVuY3Rpb24gKGNvbnRleHQs
IGluZGV4KSB7Ci0gICAgICAgIGNvbnRleHQuaW5kZXggPSBpbmRleCArIG9mZnNldDsKLSAgICAg
IH0pOwotICAgIH0pOwotICB9LAotCi0gIGRlcGVuZGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rp
b24gKGRlcGVuZGVudEFycmF5LCBpbmRleCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0g
ICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7IHJldHVybjsgfQotCi0gICAgdmFyIHJlbW92ZWRJdGVt
ID0gdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0sCi0gICAgICAgIGNoYW5nZU1ldGEsCi0gICAg
ICAgIGd1aWQgPSBndWlkRm9yKGRlcGVuZGVudEFycmF5KSwKLSAgICAgICAgZGVwZW5kZW50S2V5
ID0gdGhpcy5kZXBlbmRlbnRLZXlzQnlHdWlkW2d1aWRdLAotICAgICAgICBpdGVtUHJvcGVydHlL
ZXlzID0gdGhpcy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldIHx8IFtdLAotICAg
ICAgICBsZW5ndGggPSBnZXQoZGVwZW5kZW50QXJyYXksICdsZW5ndGgnKSwKLSAgICAgICAgbm9y
bWFsaXplZEluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgsIGxlbmd0aCwgMCksCi0gICAgICAg
IG5vcm1hbGl6ZWRSZW1vdmVDb3VudCA9IG5vcm1hbGl6ZVJlbW92ZUNvdW50KG5vcm1hbGl6ZWRJ
bmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpLAotICAgICAgICBpdGVtLAotICAgICAgICBpdGVt
SW5kZXgsCi0gICAgICAgIHNsaWNlSW5kZXgsCi0gICAgICAgIG9ic2VydmVyQ29udGV4dHM7Ci0K
LSAgICBvYnNlcnZlckNvbnRleHRzID0gdGhpcy50cmFja1JlbW92ZShkZXBlbmRlbnRLZXksIG5v
cm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZFJlbW92ZUNvdW50KTsKLQotICAgIGZ1bmN0aW9uIHJl
bW92ZU9ic2VydmVycyhwcm9wZXJ0eUtleSkgewotICAgICAgb2JzZXJ2ZXJDb250ZXh0c1tzbGlj
ZUluZGV4XS5kZXN0cm95ZWQgPSB0cnVlOwotICAgICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRl
bSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0uYmVmb3Jl
T2JzZXJ2ZXIpOwotICAgICAgcmVtb3ZlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIHRoaXMs
IG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0ub2JzZXJ2ZXIpOwotICAgIH0KLQotICAgIGZv
ciAoc2xpY2VJbmRleCA9IG5vcm1hbGl6ZWRSZW1vdmVDb3VudCAtIDE7IHNsaWNlSW5kZXggPj0g
MDsgLS1zbGljZUluZGV4KSB7Ci0gICAgICBpdGVtSW5kZXggPSBub3JtYWxpemVkSW5kZXggKyBz
bGljZUluZGV4OwotICAgICAgaWYgKGl0ZW1JbmRleCA+PSBsZW5ndGgpIHsgYnJlYWs7IH0KLQot
ICAgICAgaXRlbSA9IGRlcGVuZGVudEFycmF5Lm9iamVjdEF0KGl0ZW1JbmRleCk7Ci0KLSAgICAg
IGZvckVhY2goaXRlbVByb3BlcnR5S2V5cywgcmVtb3ZlT2JzZXJ2ZXJzLCB0aGlzKTsKLQotICAg
ICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGl0
ZW1JbmRleCwgdGhpcy5pbnN0YW5jZU1ldGEucHJvcGVydHlOYW1lLCB0aGlzLmNwKTsKLSAgICAg
IHRoaXMuc2V0VmFsdWUoIHJlbW92ZWRJdGVtLmNhbGwoCi0gICAgICAgIHRoaXMuaW5zdGFuY2VN
ZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0
YW5jZU1ldGEuc3VnYXJNZXRhKSk7Ci0gICAgfQotICB9LAotCi0gIGRlcGVuZGVudEFycmF5RGlk
Q2hhbmdlOiBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXksIGluZGV4LCByZW1vdmVkQ291bnQsIGFk
ZGVkQ291bnQpIHsKLSAgICBpZiAodGhpcy5zdXNwZW5kZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICB2
YXIgYWRkZWRJdGVtID0gdGhpcy5jYWxsYmFja3MuYWRkZWRJdGVtLAotICAgICAgICBndWlkID0g
Z3VpZEZvcihkZXBlbmRlbnRBcnJheSksCi0gICAgICAgIGRlcGVuZGVudEtleSA9IHRoaXMuZGVw
ZW5kZW50S2V5c0J5R3VpZFtndWlkXSwKLSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBB
cnJheShhZGRlZENvdW50KSwKLSAgICAgICAgaXRlbVByb3BlcnR5S2V5cyA9IHRoaXMuY3AuX2l0
ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSwKLSAgICAgICAgbGVuZ3RoID0gZ2V0KGRlcGVu
ZGVudEFycmF5LCAnbGVuZ3RoJyksCi0gICAgICAgIG5vcm1hbGl6ZWRJbmRleCA9IG5vcm1hbGl6
ZUluZGV4KGluZGV4LCBsZW5ndGgsIGFkZGVkQ291bnQpLAotICAgICAgICBjaGFuZ2VNZXRhLAot
ICAgICAgICBvYnNlcnZlckNvbnRleHQ7Ci0KLSAgICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LnNs
aWNlKG5vcm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZEluZGV4ICsgYWRkZWRDb3VudCksIGZ1bmN0
aW9uIChpdGVtLCBzbGljZUluZGV4KSB7Ci0gICAgICBpZiAoaXRlbVByb3BlcnR5S2V5cykgewot
ICAgICAgICBvYnNlcnZlckNvbnRleHQgPQotICAgICAgICAgIG9ic2VydmVyQ29udGV4dHNbc2xp
Y2VJbmRleF0gPQotICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlckNvbnRleHQo
ZGVwZW5kZW50QXJyYXksIG5vcm1hbGl6ZWRJbmRleCArIHNsaWNlSW5kZXgsIHRoaXMudHJhY2tl
ZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsKLSAgICAgICAgZm9yRWFjaChpdGVtUHJvcGVy
dHlLZXlzLCBmdW5jdGlvbiAocHJvcGVydHlLZXkpIHsKLSAgICAgICAgICBhZGRCZWZvcmVPYnNl
cnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2Vy
dmVyKTsKLSAgICAgICAgICBhZGRPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2Jz
ZXJ2ZXJDb250ZXh0Lm9ic2VydmVyKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9Ci0KLSAg
ICAgIGNoYW5nZU1ldGEgPSBjcmVhdGVDaGFuZ2VNZXRhKGRlcGVuZGVudEFycmF5LCBpdGVtLCBu
b3JtYWxpemVkSW5kZXggKyBzbGljZUluZGV4LCB0aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5h
bWUsIHRoaXMuY3ApOwotICAgICAgdGhpcy5zZXRWYWx1ZSggYWRkZWRJdGVtLmNhbGwoCi0gICAg
ICAgIHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hh
bmdlTWV0YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRhKSk7Ci0gICAgfSwgdGhpcyk7Ci0K
LSAgICB0aGlzLnRyYWNrQWRkKGRlcGVuZGVudEtleSwgbm9ybWFsaXplZEluZGV4LCBvYnNlcnZl
ckNvbnRleHRzKTsKLSAgfSwKLQotICBpdGVtUHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAo
b2JqLCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgdmFyIGd1aWQgPSBn
dWlkRm9yKG9iaik7Ci0KLSAgICBpZiAoIXRoaXMuY2hhbmdlZEl0ZW1zW2d1aWRdKSB7Ci0gICAg
ICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXSA9IHsKLSAgICAgICAgYXJyYXk6ICAgICAgICAgICAg
YXJyYXksCi0gICAgICAgIG9ic2VydmVyQ29udGV4dDogIG9ic2VydmVyQ29udGV4dCwKLSAgICAg
ICAgb2JqOiAgICAgICAgICAgICAgb2JqLAotICAgICAgICBwcmV2aW91c1ZhbHVlczogICB7fQot
ICAgICAgfTsKLSAgICB9Ci0KLSAgICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXS5wcmV2aW91c1Zh
bHVlc1trZXlOYW1lXSA9IGdldChvYmosIGtleU5hbWUpOwotICB9LAotCi0gIGl0ZW1Qcm9wZXJ0
eURpZENoYW5nZTogZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0
KSB7Ci0gICAgdGhpcy5mbHVzaENoYW5nZXMoKTsKLSAgfSwKLQotICBmbHVzaENoYW5nZXM6IGZ1
bmN0aW9uKCkgewotICAgIHZhciBjaGFuZ2VkSXRlbXMgPSB0aGlzLmNoYW5nZWRJdGVtcywga2V5
LCBjLCBjaGFuZ2VNZXRhOwotCi0gICAgZm9yIChrZXkgaW4gY2hhbmdlZEl0ZW1zKSB7Ci0gICAg
ICBjID0gY2hhbmdlZEl0ZW1zW2tleV07Ci0gICAgICBpZiAoYy5vYnNlcnZlckNvbnRleHQuZGVz
dHJveWVkKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgIHRoaXMudXBkYXRlSW5kZXhlcyhjLm9ic2Vy
dmVyQ29udGV4dC50cmFja2VkQXJyYXksIGMub2JzZXJ2ZXJDb250ZXh0LmRlcGVuZGVudEFycmF5
KTsKLQotICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoYy5hcnJheSwgYy5vYmos
IGMub2JzZXJ2ZXJDb250ZXh0LmluZGV4LCB0aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUs
IHRoaXMuY3AsIGMucHJldmlvdXNWYWx1ZXMpOwotICAgICAgdGhpcy5zZXRWYWx1ZSgKLSAgICAg
ICAgdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0uY2FsbCh0aGlzLmluc3RhbmNlTWV0YS5jb250
ZXh0LCB0aGlzLmdldFZhbHVlKCksIGMub2JqLCBjaGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0
YS5zdWdhck1ldGEpKTsKLSAgICAgIHRoaXMuc2V0VmFsdWUoCi0gICAgICAgIHRoaXMuY2FsbGJh
Y2tzLmFkZGVkSXRlbS5jYWxsKHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFs
dWUoKSwgYy5vYmosIGNoYW5nZU1ldGEsIHRoaXMuaW5zdGFuY2VNZXRhLnN1Z2FyTWV0YSkpOwot
ICAgIH0KLSAgICB0aGlzLmNoYW5nZWRJdGVtcyA9IHt9OwotICB9Ci19OwotCi1mdW5jdGlvbiBu
b3JtYWxpemVJbmRleChpbmRleCwgbGVuZ3RoLCBuZXdJdGVtc09mZnNldCkgewotICBpZiAoaW5k
ZXggPCAwKSB7Ci0gICAgcmV0dXJuIE1hdGgubWF4KDAsIGxlbmd0aCArIGluZGV4KTsKLSAgfSBl
bHNlIGlmIChpbmRleCA8IGxlbmd0aCkgewotICAgIHJldHVybiBpbmRleDsKLSAgfSBlbHNlIC8q
IGluZGV4ID4gbGVuZ3RoICovIHsKLSAgICByZXR1cm4gTWF0aC5taW4obGVuZ3RoIC0gbmV3SXRl
bXNPZmZzZXQsIGluZGV4KTsKLSAgfQotfQotCi1mdW5jdGlvbiBub3JtYWxpemVSZW1vdmVDb3Vu
dChpbmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpIHsKLSAgcmV0dXJuIE1hdGgubWluKHJlbW92
ZWRDb3VudCwgbGVuZ3RoIC0gaW5kZXgpOwotfQotCi1mdW5jdGlvbiBjcmVhdGVDaGFuZ2VNZXRh
KGRlcGVuZGVudEFycmF5LCBpdGVtLCBpbmRleCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eSwgcHJl
dmlvdXNWYWx1ZXMpIHsKLSAgdmFyIG1ldGEgPSB7Ci0gICAgYXJyYXlDaGFuZ2VkOiBkZXBlbmRl
bnRBcnJheSwKLSAgICBpbmRleDogaW5kZXgsCi0gICAgaXRlbTogaXRlbSwKLSAgICBwcm9wZXJ0
eU5hbWU6IHByb3BlcnR5TmFtZSwKLSAgICBwcm9wZXJ0eTogcHJvcGVydHkKLSAgfTsKLQotICBp
ZiAocHJldmlvdXNWYWx1ZXMpIHsKLSAgICAvLyBwcmV2aW91cyB2YWx1ZXMgb25seSBhdmFpbGFi
bGUgZm9yIGl0ZW0gcHJvcGVydHkgY2hhbmdlcwotICAgIG1ldGEucHJldmlvdXNWYWx1ZXMgPSBw
cmV2aW91c1ZhbHVlczsKLSAgfQotCi0gIHJldHVybiBtZXRhOwotfQotCi1mdW5jdGlvbiBhZGRJ
dGVtcyAoZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSkg
ewotICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKLSAg
ICBtZXRhLnNldFZhbHVlKCBjYWxsYmFja3MuYWRkZWRJdGVtLmNhbGwoCi0gICAgICB0aGlzLCBt
ZXRhLmdldFZhbHVlKCksIGl0ZW0sIGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0
ZW0sIGluZGV4LCBwcm9wZXJ0eU5hbWUsIGNwKSwgbWV0YS5zdWdhck1ldGEpKTsKLSAgfSwgdGhp
cyk7Ci19Ci0KLWZ1bmN0aW9uIHJlc2V0KGNwLCBwcm9wZXJ0eU5hbWUpIHsKLSAgdmFyIGNhbGxi
YWNrcyA9IGNwLl9jYWxsYmFja3MoKSwKLSAgICAgIG1ldGE7Ci0KLSAgaWYgKGNwLl9oYXNJbnN0
YW5jZU1ldGEodGhpcywgcHJvcGVydHlOYW1lKSkgewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gICAgbWV0YS5zZXRWYWx1ZShjcC5yZXNldFZhbHVl
KG1ldGEuZ2V0VmFsdWUoKSkpOwotICB9IGVsc2UgewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICBpZiAoY3Aub3B0aW9ucy5pbml0aWFs
aXplKSB7Ci0gICAgY3Aub3B0aW9ucy5pbml0aWFsaXplLmNhbGwodGhpcywgbWV0YS5nZXRWYWx1
ZSgpLCB7IHByb3BlcnR5OiBjcCwgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUgfSwgbWV0YS5z
dWdhck1ldGEpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHBhcnRpYWxseVJlY29tcHV0ZUZvcihvYmos
IGRlcGVuZGVudEtleSkgewotICBpZiAoYXJyYXlCcmFja2V0UGF0dGVybi50ZXN0KGRlcGVuZGVu
dEtleSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2YXIgdmFsdWUgPSBnZXQob2Jq
LCBkZXBlbmRlbnRLZXkpOwotICByZXR1cm4gRW1iZXIuQXJyYXkuZGV0ZWN0KHZhbHVlKTsKLX0K
LQotZnVuY3Rpb24gUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBw
cm9wZXJ0eU5hbWUsIGluaXRpYWxWYWx1ZSkgewotICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Owot
ICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgdGhpcy5jYWNoZSA9IG1ldGFG
b3IoY29udGV4dCkuY2FjaGU7Ci0KLSAgdGhpcy5kZXBlbmRlbnRBcnJheXMgPSB7fTsKLSAgdGhp
cy5zdWdhck1ldGEgPSB7fTsKLQotICB0aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsK
LX0KLQotUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YS5wcm90b3R5cGUgPSB7Ci0g
IGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7Ci0gICAgaWYgKHRoaXMucHJvcGVydHlOYW1lIGluIHRo
aXMuY2FjaGUpIHsKLSAgICAgIHJldHVybiB0aGlzLmNhY2hlW3RoaXMucHJvcGVydHlOYW1lXTsK
LSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotICAgIH0KLSAg
fSwKLQotICBzZXRWYWx1ZTogZnVuY3Rpb24obmV3VmFsdWUsIHRyaWdnZXJPYnNlcnZlcnMpIHsK
LSAgICAvLyBUaGlzIGxldHMgc3VnYXJzIGZvcmNlIGEgcmVjb21wdXRhdGlvbiwgaGFuZHkgZm9y
IHZlcnkgc2ltcGxlCi0gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGVnIG1heC4KLSAgICBpZiAo
bmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgewotICAgICAgdmFyIGZpcmVPYnNlcnZlcnMgPSB0cmln
Z2VyT2JzZXJ2ZXJzICYmIChuZXdWYWx1ZSAhPT0gdGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFt
ZV0pOwotCi0gICAgICBpZiAoZmlyZU9ic2VydmVycykgewotICAgICAgICBwcm9wZXJ0eVdpbGxD
aGFuZ2UodGhpcy5jb250ZXh0LCB0aGlzLnByb3BlcnR5TmFtZSk7Ci0gICAgICB9Ci0KLSAgICAg
IHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVdID0gbmV3VmFsdWU7Ci0KLSAgICAgIGlmIChm
aXJlT2JzZXJ2ZXJzKSB7Ci0gICAgICAgIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMuY29udGV4dCwg
dGhpcy5wcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBkZWxldGUg
dGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV07Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB3aG9zZSBkZXBlbmRlbnQga2V5cyBhcmUgYXJyYXlzIGFuZCB3
aGljaCBpcyB1cGRhdGVkIHdpdGgKLSAgIm9uZSBhdCBhIHRpbWUiIHNlbWFudGljcy4KLQotICBA
Y2xhc3MgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRl
bmRzIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkKLSAgQGNvbnN0cnVjdG9yCi0qLwotZnVuY3Rpb24g
UmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eShvcHRpb25zKSB7Ci0gIHZhciBjcCA9IHRoaXM7Ci0KLSAg
dGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgdGhpcy5faW5zdGFuY2VNZXRhcyA9IHt9OwotCi0g
IHRoaXMuX2RlcGVuZGVudEtleXMgPSBudWxsOwotICAvLyBBIG1hcCBvZiBkZXBlbmRlbnRLZXkg
LT4gW2l0ZW1Qcm9wZXJ0eSwgLi4uXSB0aGF0IHRyYWNrcyB3aGF0IHByb3BlcnRpZXMgb2YKLSAg
Ly8gaXRlbXMgaW4gdGhlIGFycmF5IHdlIG11c3QgdHJhY2sgdG8gdXBkYXRlIHRoaXMgcHJvcGVy
dHkuCi0gIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXMgPSB7fTsKLSAgdGhpcy5fcHJldmlvdXNJdGVt
UHJvcGVydHlLZXlzID0ge307Ci0KLSAgdGhpcy5yZWFkT25seSgpOwotICB0aGlzLmNhY2hlYWJs
ZSgpOwotCi0gIHRoaXMucmVjb21wdXRlT25jZSA9IGZ1bmN0aW9uKHByb3BlcnR5TmFtZSkgewot
ICAgIC8vIFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaXMgY29hbGVzY2UgYnkgPGNwLCBwcm9w
ZXJ0eU5hbWU+LgotICAgIC8vIFdlIG5lZWQgYSBmb3JtIG9mIGBzY2hlZHVsZU9uY2VgIHRoYXQg
YWNjZXB0cyBhbiBhcmJpdHJhcnkgdG9rZW4gdG8KLSAgICAvLyBjb2FsZXNjZSBieSwgaW4gYWRk
aXRpb24gdG8gdGhlIHRhcmdldCBhbmQgbWV0aG9kLgotICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMs
IHJlY29tcHV0ZSwgcHJvcGVydHlOYW1lKTsKLSAgfTsKLSAgdmFyIHJlY29tcHV0ZSA9IGZ1bmN0
aW9uKHByb3BlcnR5TmFtZSkgewotICAgIHZhciBkZXBlbmRlbnRLZXlzID0gY3AuX2RlcGVuZGVu
dEtleXMsCi0gICAgICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFt
ZSksCi0gICAgICAgIGNhbGxiYWNrcyA9IGNwLl9jYWxsYmFja3MoKTsKLQotICAgIHJlc2V0LmNh
bGwodGhpcywgY3AsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICBtZXRhLmRlcGVuZGVudEFycmF5c09i
c2VydmVyLnN1c3BlbmRBcnJheU9ic2VydmVycyhmdW5jdGlvbiAoKSB7Ci0gICAgICBmb3JFYWNo
KGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0gICAgICAgIGlm
ICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsgcmV0dXJuOyB9
Ci0KLSAgICAgICAgdmFyIGRlcGVuZGVudEFycmF5ID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSks
Ci0gICAgICAgICAgICBwcmV2aW91c0RlcGVuZGVudEFycmF5ID0gbWV0YS5kZXBlbmRlbnRBcnJh
eXNbZGVwZW5kZW50S2V5XTsKLQotICAgICAgICBpZiAoZGVwZW5kZW50QXJyYXkgPT09IHByZXZp
b3VzRGVwZW5kZW50QXJyYXkpIHsKLSAgICAgICAgICAvLyBUaGUgYXJyYXkgbWF5IGJlIHRoZSBz
YW1lLCBidXQgb3VyIGl0ZW0gcHJvcGVydHkga2V5cyBtYXkgaGF2ZQotICAgICAgICAgIC8vIGNo
YW5nZWQsIHNvIHdlIHNldCB0aGVtIHVwIGFnYWluLiAgV2UgY2FuJ3QgZWFzaWx5IHRlbGwgaWYg
dGhleSd2ZQotICAgICAgICAgIC8vIGNoYW5nZWQ6IHRoZSBhcnJheSBtYXkgYmUgdGhlIHNhbWUg
b2JqZWN0LCBidXQgd2l0aCBkaWZmZXJlbnQKLSAgICAgICAgICAvLyBjb250ZW50cy4KLSAgICAg
ICAgICBpZiAoY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldKSB7Ci0g
ICAgICAgICAgICBkZWxldGUgY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRL
ZXldOwotICAgICAgICAgICAgbWV0YS5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zZXR1cFByb3Bl
cnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50
S2V5XSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1ldGEuZGVw
ZW5kZW50QXJyYXlzW2RlcGVuZGVudEtleV0gPSBkZXBlbmRlbnRBcnJheTsKLQotICAgICAgICAg
IGlmIChwcmV2aW91c0RlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgICAgICBtZXRhLmRlcGVuZGVu
dEFycmF5c09ic2VydmVyLnRlYXJkb3duT2JzZXJ2ZXJzKHByZXZpb3VzRGVwZW5kZW50QXJyYXks
IGRlcGVuZGVudEtleSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGRlcGVuZGVudEFy
cmF5KSB7Ci0gICAgICAgICAgICBtZXRhLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnNldHVwT2Jz
ZXJ2ZXJzKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICBmb3JFYWNoKGNwLl9k
ZXBlbmRlbnRLZXlzLCBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKLSAgICAgIGlmICghcGFydGlh
bGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsgcmV0dXJuOyB9Ci0KLSAgICAg
IHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwotICAgICAgaWYg
KGRlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgIGFkZEl0ZW1zLmNhbGwodGhpcywgZGVwZW5kZW50
QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAg
fSwgdGhpcyk7Ci0gIH07Ci0KLSAgdGhpcy5mdW5jID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkg
ewotICAgIEVtYmVyLmFzc2VydCgiQ29tcHV0ZWQgcmVkdWNlIHZhbHVlcyByZXF1aXJlIGF0IGxl
YXN0IG9uZSBkZXBlbmRlbnQga2V5IiwgY3AuX2RlcGVuZGVudEtleXMpOwotCi0gICAgcmVjb21w
dXRlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKLQotICAgIHJldHVybiBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkuZ2V0VmFsdWUoKTsKLSAgfTsKLX0KLQotRW1iZXIuUmVk
dWNlQ29tcHV0ZWRQcm9wZXJ0eSA9IFJlZHVjZUNvbXB1dGVkUHJvcGVydHk7Ci1SZWR1Y2VDb21w
dXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9fY3JlYXRlKENvbXB1dGVkUHJvcGVydHkucHJvdG90
eXBlKTsKLQotZnVuY3Rpb24gZGVmYXVsdENhbGxiYWNrKGNvbXB1dGVkVmFsdWUpIHsKLSAgcmV0
dXJuIGNvbXB1dGVkVmFsdWU7Ci19Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBl
Ll9jYWxsYmFja3MgPSBmdW5jdGlvbiAoKSB7Ci0gIGlmICghdGhpcy5jYWxsYmFja3MpIHsKLSAg
ICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKLSAgICB0aGlzLmNhbGxiYWNrcyA9IHsKLSAg
ICAgIHJlbW92ZWRJdGVtOiBvcHRpb25zLnJlbW92ZWRJdGVtIHx8IGRlZmF1bHRDYWxsYmFjaywK
LSAgICAgIGFkZGVkSXRlbTogb3B0aW9ucy5hZGRlZEl0ZW0gfHwgZGVmYXVsdENhbGxiYWNrCi0g
ICAgfTsKLSAgfQotICByZXR1cm4gdGhpcy5jYWxsYmFja3M7Ci19OwotCi1SZWR1Y2VDb21wdXRl
ZFByb3BlcnR5LnByb3RvdHlwZS5faGFzSW5zdGFuY2VNZXRhID0gZnVuY3Rpb24gKGNvbnRleHQs
IHByb3BlcnR5TmFtZSkgewotICB2YXIgZ3VpZCA9IGd1aWRGb3IoY29udGV4dCksCi0gICAgICBr
ZXkgPSBndWlkICsgJzonICsgcHJvcGVydHlOYW1lOwotCi0gIHJldHVybiAhIXRoaXMuX2luc3Rh
bmNlTWV0YXNba2V5XTsKLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9p
bnN0YW5jZU1ldGEgPSBmdW5jdGlvbiAoY29udGV4dCwgcHJvcGVydHlOYW1lKSB7Ci0gIHZhciBn
dWlkID0gZ3VpZEZvcihjb250ZXh0KSwKLSAgICAgIGtleSA9IGd1aWQgKyAnOicgKyBwcm9wZXJ0
eU5hbWUsCi0gICAgICBtZXRhID0gdGhpcy5faW5zdGFuY2VNZXRhc1trZXldOwotCi0gIGlmICgh
bWV0YSkgewotICAgIG1ldGEgPSB0aGlzLl9pbnN0YW5jZU1ldGFzW2tleV0gPSBuZXcgUmVkdWNl
Q29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBwcm9wZXJ0eU5hbWUsIHRoaXMu
aW5pdGlhbFZhbHVlKCkpOwotICAgIG1ldGEuZGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIgPSBuZXcg
RGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIodGhpcy5fY2FsbGJhY2tzKCksIHRoaXMsIG1ldGEsIGNv
bnRleHQsIHByb3BlcnR5TmFtZSwgbWV0YS5zdWdhck1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIG1l
dGE7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pbml0aWFsVmFsdWUg
PSBmdW5jdGlvbiAoKSB7Ci0gIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSA9
PT0gJ2Z1bmN0aW9uJykgewotICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKCk7
Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbml0aWFsVmFsdWU7Ci0g
IH0KLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnJlc2V0VmFsdWUgPSBm
dW5jdGlvbiAodmFsdWUpIHsKLSAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlKCk7Ci19OwotCi1S
ZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pdGVtUHJvcGVydHlLZXkgPSBmdW5jdGlv
biAoZGVwZW5kZW50QXJyYXlLZXksIGl0ZW1Qcm9wZXJ0eUtleSkgewotICB0aGlzLl9pdGVtUHJv
cGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVw
ZW5kZW50QXJyYXlLZXldIHx8IFtdOwotICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVu
dEFycmF5S2V5XS5wdXNoKGl0ZW1Qcm9wZXJ0eUtleSk7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFBy
b3BlcnR5LnByb3RvdHlwZS5jbGVhckl0ZW1Qcm9wZXJ0eUtleXMgPSBmdW5jdGlvbiAoZGVwZW5k
ZW50QXJyYXlLZXkpIHsKLSAgaWYgKHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJy
YXlLZXldKSB7Ci0gICAgdGhpcy5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFy
cmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldOwotICAg
IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldID0gW107Ci0gIH0KLX07
Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24g
KCkgewotICB2YXIgY3AgPSB0aGlzLAotICAgICAgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMpLAotICAgICAgcHJvcGVydHlBcmdzID0gbmV3IEVtYmVyLlNldCgpLAotICAgICAgbWF0Y2gs
Ci0gICAgICBkZXBlbmRlbnRBcnJheUtleSwKLSAgICAgIGl0ZW1Qcm9wZXJ0eUtleTsKLQotICBm
b3JFYWNoKGFfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7
Ci0gICAgaWYgKGRvdWJsZUVhY2hQcm9wZXJ0eVBhdHRlcm4udGVzdChkZXBlbmRlbnRLZXkpKSB7
Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIk5lc3RlZCBAZWFjaCBwcm9wZXJ0aWVzIG5v
dCBzdXBwb3J0ZWQ6ICIgKyBkZXBlbmRlbnRLZXkpOwotICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBl
YWNoUHJvcGVydHlQYXR0ZXJuLmV4ZWMoZGVwZW5kZW50S2V5KSkgewotICAgICAgZGVwZW5kZW50
QXJyYXlLZXkgPSBtYXRjaFsxXTsKLQotICAgICAgCi0gICAgICAgIGl0ZW1Qcm9wZXJ0eUtleSA9
IG1hdGNoWzJdOwotICAgICAgICBjcC5pdGVtUHJvcGVydHlLZXkoZGVwZW5kZW50QXJyYXlLZXks
IGl0ZW1Qcm9wZXJ0eUtleSk7Ci0gICAgICAKLSAgICAgIHByb3BlcnR5QXJncy5hZGQoZGVwZW5k
ZW50QXJyYXlLZXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcm9wZXJ0eUFyZ3MuYWRkKGRlcGVu
ZGVudEtleSk7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gQ29tcHV0ZWRQcm9wZXJ0eS5wcm90
b3R5cGUucHJvcGVydHkuYXBwbHkodGhpcywgcHJvcGVydHlBcmdzLnRvQXJyYXkoKSk7Ci0KLX07
Ci0KLS8qKgotICBDcmVhdGVzIGEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggb3BlcmF0ZXMgb24g
ZGVwZW5kZW50IGFycmF5cyBhbmQKLSAgaXMgdXBkYXRlZCB3aXRoICJvbmUgYXQgYSB0aW1lIiBz
ZW1hbnRpY3MuIFdoZW4gaXRlbXMgYXJlIGFkZGVkIG9yCi0gIHJlbW92ZWQgZnJvbSB0aGUgZGVw
ZW5kZW50IGFycmF5KHMpIGEgcmVkdWNlIGNvbXB1dGVkIG9ubHkgb3BlcmF0ZXMKLSAgb24gdGhl
IGNoYW5nZSBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRpbmcgdGhlIGVudGlyZSBhcnJheS4KLQotICBJ
ZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudHMgdGhlIGZpcnN0IGFyZ3VtZW50cyBh
cmUKLSAgY29uc2lkZXJlZCB0byBiZSBkZXBlbmRlbnQgcHJvcGVydHkga2V5cy4gVGhlIGxhc3Qg
YXJndW1lbnQgaXMKLSAgcmVxdWlyZWQgdG8gYmUgYW4gb3B0aW9ucyBvYmplY3QuIFRoZSBvcHRp
b25zIG9iamVjdCBjYW4gaGF2ZSB0aGUKLSAgZm9sbG93aW5nIGZvdXIgcHJvcGVydGllczoKLQot
ICBgaW5pdGlhbFZhbHVlYCAtIEEgdmFsdWUgb3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQg
YXMgdGhlIGluaXRpYWwKLSAgdmFsdWUgZm9yIHRoZSBjb21wdXRlZC4gSWYgdGhpcyBwcm9wZXJ0
eSBpcyBhIGZ1bmN0aW9uIHRoZSByZXN1bHQgb2YgY2FsbGluZwotICB0aGUgZnVuY3Rpb24gd2ls
bCBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVlLiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVk
LgotCi0gIGBpbml0aWFsaXplYCAtIEFuIG9wdGlvbmFsIGluaXRpYWxpemUgZnVuY3Rpb24uIFR5
cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAotICB0byBzZXQgdXAgc3RhdGUgb24gdGhlIGluc3Rh
bmNlTWV0YSBvYmplY3QuCi0KLSAgYHJlbW92ZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBj
YWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZAotICBmcm9tIHRoZSBhcnJheS4K
LQotICBgYWRkZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFu
IGVsZW1lbnQgaXMgYWRkZWQgdG8KLSAgdGhlIGFycmF5LgotCi0KLSAgVGhlIGBpbml0aWFsaXpl
YCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICAgZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQot
ICBgYGAKLQotICBgaW5pdGlhbFZhbHVlYCAtIFRoZSB2YWx1ZSBvZiB0aGUgYGluaXRpYWxWYWx1
ZWAgcHJvcGVydHkgZnJvbSB0aGUKLSAgb3B0aW9ucyBvYmplY3QuCi0KLSAgYGNoYW5nZU1ldGFg
IC0gQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0g
IGNvbXB1dGVkLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0KLSAgICAg
LSBgcHJvcGVydHlgIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQotICAgICAtIGBwcm9wZXJ0eU5hbWVg
IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0Ci0KLSAgYGluc3RhbmNlTWV0
YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCi0gIGluZm9ybWF0
aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQot
ICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0
aW1lcyBhIGdpdmVuCi0gIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4K
LQotCi0gIFRoZSBgcmVtb3ZlZEl0ZW1gIGFuZCBgYWRkZWRJdGVtYCBmdW5jdGlvbnMgYm90aCBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgZnVuY3Rp
b24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKLSAg
YGBgCi0KLSAgYGFjY3VtdWxhdGVkVmFsdWVgIC0gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhl
IGxhc3QgdGltZQotICBgcmVtb3ZlZEl0ZW1gIG9yIGBhZGRlZEl0ZW1gIHdhcyBjYWxsZWQgb3Ig
YGluaXRpYWxWYWx1ZWAuCi0KLSAgYGl0ZW1gIC0gdGhlIGVsZW1lbnQgYWRkZWQgb3IgcmVtb3Zl
ZCBmcm9tIHRoZSBhcnJheQotCi0gIGBjaGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250
YWlucyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICBjaGFuZ2UuIEl0IGNvbnRhaW5zIHRo
ZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLQotICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQg
cHJvcGVydHkKLSAgICAtIGBwcm9wZXJ0eU5hbWVgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBv
biB0aGUgb2JqZWN0Ci0gICAgLSBgaW5kZXhgIHRoZSBpbmRleCBvZiB0aGUgYWRkZWQgb3IgcmVt
b3ZlZCBpdGVtCi0gICAgLSBgaXRlbWAgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbTogdGhpcyBp
cyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICAgICB0aGUgc2Vjb25kIGFyZwotICAgIC0gYGFycmF5
Q2hhbmdlZGAgdGhlIGFycmF5IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuIENhbiBiZQotICAg
ICAgdXNlZnVsIHdoZW4gZGVwZW5kaW5nIG9uIG11bHRpcGxlIGFycmF5cy4KLQotICBGb3IgcHJv
cGVydHkgY2hhbmdlcyB0cmlnZ2VyZWQgb24gYW4gaXRlbSBwcm9wZXJ0eSBjaGFuZ2UgKHdoZW4K
LSAgZGVwS2V5IGlzIHNvbWV0aGluZyBsaWtlIGBzb21lQXJyYXkuQGVhY2guc29tZVByb3BlcnR5
YCksCi0gIGBjaGFuZ2VNZXRhYCB3aWxsIGFsc28gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3Bl
cnR5OgotCi0gICAgLSBgcHJldmlvdXNWYWx1ZXNgIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0
aGUgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgb24KLSAgICB0aGUgaXRlbSwgYW5kIHdob3NlIHZh
bHVlcyBhcmUgdGhlIGl0ZW0ncyBwcmV2aW91cyB2YWx1ZXMuCi0KLSAgYHByZXZpb3VzVmFsdWVz
YCBpcyBpbXBvcnRhbnQgRW1iZXIgY29hbGVzY2VzIGl0ZW0gcHJvcGVydHkgY2hhbmdlcyB2aWEK
LSAgRW1iZXIucnVuLm9uY2UuIFRoaXMgbWVhbnMgdGhhdCBieSB0aGUgdGltZSByZW1vdmVkSXRl
bSBnZXRzIGNhbGxlZCwgaXRlbSBoYXMKLSAgdGhlIG5ldyB2YWx1ZXMsIGJ1dCB5b3UgbWF5IG5l
ZWQgdGhlIHByZXZpb3VzIHZhbHVlIChlZyBmb3Igc29ydGluZyAmCi0gIGZpbHRlcmluZykuCi0K
LSAgYGluc3RhbmNlTWV0YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBt
ZXRhCi0gIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4g
Rm9yIGV4YW1wbGUgYQotICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUg
dGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCi0gIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRl
cGVuZGVudCBhcnJheS4KLQotICBUaGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVu
Y3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIGFjY3VtdWxhdGVkCi0gIHZhbHVlLiBJdCBpcyBhY2Nl
cHRhYmxlIHRvIG5vdCByZXR1cm4gYW55dGhpbmcgKGllIHJldHVybiB1bmRlZmluZWQpCi0gIHRv
IGludmFsaWRhdGUgdGhlIGNvbXB1dGF0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgYSBnb29k
IGlkZWEgZm9yCi0gIGFycmF5Q29tcHV0ZWQgYnV0IGl0J3MgdXNlZCBpbiBlZyBtYXggYW5kIG1p
bi4KLQotICBOb3RlIHRoYXQgb2JzZXJ2ZXJzIHdpbGwgYmUgZmlyZWQgaWYgZWl0aGVyIG9mIHRo
ZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZQotICB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgYWNj
dW11bGF0ZWQgdmFsdWUuICBXaGVuIHJldHVybmluZyBhbiBvYmplY3QgdGhhdAotICBtdXRhdGVz
IGluIHJlc3BvbnNlIHRvIGFycmF5IGNoYW5nZXMsIGZvciBleGFtcGxlIGFuIGFycmF5IHRoYXQg
bWFwcwotICBldmVyeXRoaW5nIGZyb20gc29tZSBvdGhlciBhcnJheSAoc2VlIGBFbWJlci5jb21w
dXRlZC5tYXBgKSwgaXQgaXMgdXN1YWxseQotICBpbXBvcnRhbnQgdGhhdCB0aGUgKnNhbWUqIGFy
cmF5IGJlIHJldHVybmVkIHRvIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIG9ic2VydmVy
cy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5jb21wdXRlZC5tYXgg
PSBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0gICAgcmV0dXJuIEVtYmVyLnJlZHVjZUNvbXB1
dGVkLmNhbGwobnVsbCwgZGVwZW5kZW50S2V5LCB7Ci0gICAgICBpbml0aWFsVmFsdWU6IC1JbmZp
bml0eSwKLQotICAgICAgYWRkZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRl
bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChh
Y2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsKLSAgICAgIH0sCi0KLSAgICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICAgIGlmIChpdGVtIDwgYWNjdW11bGF0ZWRWYWx1ZSkgewotICAgICAgICAgIHJl
dHVybiBhY2N1bXVsYXRlZFZhbHVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH07
Ci0gIGBgYAotCi0gIERlcGVuZGVudCBrZXlzIG1heSByZWZlciB0byBgQHRoaXNgIHRvIG9ic2Vy
dmUgY2hhbmdlcyB0byB0aGUgb2JqZWN0IGl0c2VsZiwKLSAgd2hpY2ggbXVzdCBiZSBhcnJheS1s
aWtlLCByYXRoZXIgdGhhbiBhIHByb3BlcnR5IG9mIHRoZSBvYmplY3QuICBUaGlzIGlzCi0gIG1v
c3RseSB1c2VmdWwgZm9yIGFycmF5IHByb3hpZXMsIHRvIGVuc3VyZSBvYmplY3RzIGFyZSByZXRy
aWV2ZWQgdmlhCi0gIGBvYmplY3RBdENvbnRlbnRgLiAgVGhpcyBpcyBob3cgeW91IGNvdWxkIHNv
cnQgaXRlbXMgYnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIGFuIGl0ZW0gY29udHJvbGxlci4KLQot
ICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVvcGxlQ29udHJvbGxlciA9IEVt
YmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGl0ZW1Db250cm9sbGVyOiAncGVyc29u
JywKLQotICAgIHNvcnRlZFBlb3BsZTogRW1iZXIuY29tcHV0ZWQuc29ydCgnQHRoaXMuQGVhY2gu
cmV2ZXJzZWROYW1lJywgZnVuY3Rpb24ocGVyc29uQSwgcGVyc29uQikgewotICAgICAgLy8gYHJl
dmVyc2VkTmFtZWAgaXNuJ3QgZGVmaW5lZCBvbiBQZXJzb24sIGJ1dCB3ZSBoYXZlIGFjY2VzcyB0
byBpdCB2aWEKLSAgICAgIC8vIHRoZSBpdGVtIGNvbnRyb2xsZXIgQXBwLlBlcnNvbkNvbnRyb2xs
ZXIuICBJZiB3ZSdkIHVzZWQKLSAgICAgIC8vIGBjb250ZW50LkBlYWNoLnJldmVyc2VkTmFtZWAg
YWJvdmUsIHdlIHdvdWxkIGJlIGdldHRpbmcgdGhlIG9iamVjdHMKLSAgICAgIC8vIGRpcmVjdGx5
IGFuZCBub3QgaGF2ZSBhY2Nlc3MgdG8gYHJldmVyc2VkTmFtZWAuCi0gICAgICAvLwotICAgICAg
dmFyIHJldmVyc2VkTmFtZUEgPSBnZXQocGVyc29uQSwgJ3JldmVyc2VkTmFtZScpLAotICAgICAg
ICAgIHJldmVyc2VkTmFtZUIgPSBnZXQocGVyc29uQiwgJ3JldmVyc2VkTmFtZScpOwotCi0gICAg
ICByZXR1cm4gRW1iZXIuY29tcGFyZShyZXZlcnNlZE5hbWVBLCByZXZlcnNlZE5hbWVCKTsKLSAg
ICB9KQotICB9KTsKLQotICBBcHAuUGVyc29uQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRy
b2xsZXIuZXh0ZW5kKHsKLSAgICByZXZlcnNlZE5hbWU6IGZ1bmN0aW9uICgpIHsKLSAgICAgIHJl
dHVybiByZXZlcnNlKGdldCh0aGlzLCAnbmFtZScpKTsKLSAgICB9LnByb3BlcnR5KCduYW1lJykK
LSAgfSkKLSAgYGBgCi0KLSAgRGVwZW5kZW50IGtleXMgd2hvc2UgdmFsdWVzIGFyZSBub3QgYXJy
YXlzIGFyZSB0cmVhdGVkIGFzIHJlZ3VsYXIKLSAgZGVwZW5kZW5jaWVzOiB3aGVuIHRoZXkgY2hh
bmdlLCB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgY29tcGxldGVseQotICByZWNhbGN1bGF0ZWQu
ICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhhdmUgZGVwZW5kZW50IGFycmF5cyB3aXRoIHNp
bWlsYXIKLSAgc2VtYW50aWNzLiAgRGVwZW5kZW50IGtleXMgd2hpY2ggZW5kIGluIGAuW11gIGRv
IG5vdCB1c2UgIm9uZSBhdCBhIHRpbWUiCi0gIHNlbWFudGljcy4gIFdoZW4gYW4gaXRlbSBpcyBh
ZGRlZCBvciByZW1vdmVkIGZyb20gc3VjaCBhIGRlcGVuZGVuY3ksIHRoZQotICBjb21wdXRlZCBw
cm9wZXJ0eSBpcyBjb21wbGV0ZWx5IHJlY29tcHV0ZWQuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGph
dmFzY3JpcHQKLSAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgLy8gV2hlbiBgc3RyaW5nYCBp
cyBjaGFuZ2VkLCBgY29tcHV0ZWRgIGlzIGNvbXBsZXRlbHkgcmVjb21wdXRlZC4KLSAgICBzdHJp
bmc6ICdhIHN0cmluZycsCi0KLSAgICAvLyBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYGFycmF5
YCwgYGFkZGVkSXRlbWAgaXMgY2FsbGVkLgotICAgIGFycmF5OiBbXSwKLQotICAgIC8vIFdoZW4g
YW4gaXRlbSBpcyBhZGRlZCB0byBgYW5vdGhlckFycmF5YCwgYGNvbXB1dGVkYCBpcyBjb21wbGV0
ZWx5Ci0gICAgLy8gcmVjb21wdXRlZC4KLSAgICBhbm90aGVyQXJyYXk6IFtdLAotCi0gICAgY29t
cHV0ZWQ6IEVtYmVyLnJlZHVjZUNvbXB1dGVkKCdzdHJpbmcnLCAnYXJyYXknLCAnYW5vdGhlckFy
cmF5LltdJywgewotICAgICAgYWRkZWRJdGVtOiBhZGRlZEl0ZW1DYWxsYmFjaywKLSAgICAgIHJl
bW92ZWRJdGVtOiByZW1vdmVkSXRlbUNhbGxiYWNrCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0g
IEBtZXRob2QgcmVkdWNlQ29tcHV0ZWQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30g
W2RlcGVuZGVudEtleXMqXQotICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICBAcmV0dXJuIHtF
bWJlci5Db21wdXRlZFByb3BlcnR5fQotKi8KLUVtYmVyLnJlZHVjZUNvbXB1dGVkID0gZnVuY3Rp
b24gKG9wdGlvbnMpIHsKLSAgdmFyIGFyZ3M7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAx
KSB7Ci0gICAgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKTsKLSAgICBvcHRp
b25zID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdOwotICB9Ci0KLSAgaWYgKHR5cGVv
ZiBvcHRpb25zICE9PSAib2JqZWN0IikgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiUmVk
dWNlIENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7
Ci0gIH0KLQotICBpZiAoISgnaW5pdGlhbFZhbHVlJyBpbiBvcHRpb25zKSkgewotICAgIHRocm93
IG5ldyBFbWJlci5FcnJvcigiUmVkdWNlIENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhv
dXQgYW4gaW5pdGlhbCB2YWx1ZSIpOwotICB9Ci0KLSAgdmFyIGNwID0gbmV3IFJlZHVjZUNvbXB1
dGVkUHJvcGVydHkob3B0aW9ucyk7Ci0KLSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5h
cHBseShjcCwgYXJncyk7Ci0gIH0KLQotICByZXR1cm4gY3A7Ci19OwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotdmFyIFJlZHVjZUNvbXB1dGVkUHJvcGVydHkgPSBFbWJlci5SZWR1Y2VD
b21wdXRlZFByb3BlcnR5LAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAgICBvX2NyZWF0ZSA9
IEVtYmVyLmNyZWF0ZSwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVh
Y2g7Ci0KLWZ1bmN0aW9uIEFycmF5Q29tcHV0ZWRQcm9wZXJ0eSgpIHsKLSAgdmFyIGNwID0gdGhp
czsKLQotICBSZWR1Y2VDb21wdXRlZFByb3BlcnR5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0K
LSAgdGhpcy5mdW5jID0gKGZ1bmN0aW9uKHJlZHVjZUZ1bmMpIHsKLSAgICByZXR1cm4gZnVuY3Rp
b24gKHByb3BlcnR5TmFtZSkgewotICAgICAgaWYgKCFjcC5faGFzSW5zdGFuY2VNZXRhKHRoaXMs
IHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgLy8gV2hlbiB3ZSByZWNvbXB1dGUgYW4gYXJyYXkg
Y29tcHV0ZWQgcHJvcGVydHksIHdlIG5lZWQgYWxyZWFkeQotICAgICAgICAvLyByZXRyaWV2ZWQg
YXJyYXlzIHRvIGJlIHVwZGF0ZWQ7IHdlIGNhbid0IHNpbXBseSBlbXB0eSB0aGUgY2FjaGUgYW5k
Ci0gICAgICAgIC8vIGhvcGUgdGhlIGFycmF5IGlzIHJlLXJldHJpZXZlZC4KLSAgICAgICAgZm9y
RWFjaChjcC5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gICAgICAg
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgIGNwLnJlY29tcHV0ZU9uY2UuY2FsbCh0aGlzLCBwcm9wZXJ0eU5hbWUpOwotICAg
ICAgICAgIH0pOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJl
ZHVjZUZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB9OwotICB9KSh0aGlzLmZ1bmMp
OwotCi0gIHJldHVybiB0aGlzOwotfQotRW1iZXIuQXJyYXlDb21wdXRlZFByb3BlcnR5ID0gQXJy
YXlDb21wdXRlZFByb3BlcnR5OwotQXJyYXlDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9f
Y3JlYXRlKFJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlKTsKLUFycmF5Q29tcHV0ZWRQ
cm9wZXJ0eS5wcm90b3R5cGUuaW5pdGlhbFZhbHVlID0gZnVuY3Rpb24gKCkgewotICByZXR1cm4g
RW1iZXIuQSgpOwotfTsKLUFycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUucmVzZXRWYWx1
ZSA9IGZ1bmN0aW9uIChhcnJheSkgewotICBhcnJheS5jbGVhcigpOwotICByZXR1cm4gYXJyYXk7
Ci19OwotCi0vLyBUaGlzIGlzIGEgc3RvcGdhcCB0byBrZWVwIHRoZSByZWZlcmVuY2UgY291bnRz
IGNvcnJlY3Qgd2l0aCBsYXp5IENQcy4KLUFycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUu
ZGlkQ2hhbmdlID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgewotICByZXR1cm47Ci19OwotCi0v
KioKLSAgQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG9wZXJhdGVzIG9uIGRlcGVu
ZGVudCBhcnJheXMgYW5kCi0gIGlzIHVwZGF0ZWQgd2l0aCAib25lIGF0IGEgdGltZSIgc2VtYW50
aWNzLiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCBvcgotICByZW1vdmVkIGZyb20gdGhlIGRlcGVuZGVu
dCBhcnJheShzKSBhbiBhcnJheSBjb21wdXRlZCBvbmx5IG9wZXJhdGVzCi0gIG9uIHRoZSBjaGFu
Z2UgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nIHRoZSBlbnRpcmUgYXJyYXkuIFRoaXMgc2hvdWxk
Ci0gIHJldHVybiBhbiBhcnJheSwgaWYgeW91J2QgbGlrZSB0byB1c2UgIm9uZSBhdCBhIHRpbWUi
IHNlbWFudGljcyBhbmQKLSAgY29tcHV0ZSBzb21lIHZhbHVlIG90aGVyIHRoZW4gYW4gYXJyYXkg
bG9vayBhdAotICBgRW1iZXIucmVkdWNlQ29tcHV0ZWRgLgotCi0gIElmIHRoZXJlIGFyZSBtb3Jl
IHRoYW4gb25lIGFyZ3VtZW50cyB0aGUgZmlyc3QgYXJndW1lbnRzIGFyZQotICBjb25zaWRlcmVk
IHRvIGJlIGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlzLiBUaGUgbGFzdCBhcmd1bWVudCBpcwotICBy
ZXF1aXJlZCB0byBiZSBhbiBvcHRpb25zIG9iamVjdC4gVGhlIG9wdGlvbnMgb2JqZWN0IGNhbiBo
YXZlIHRoZQotICBmb2xsb3dpbmcgdGhyZWUgcHJvcGVydGllcy4KLQotICBgaW5pdGlhbGl6ZWAg
LSBBbiBvcHRpb25hbCBpbml0aWFsaXplIGZ1bmN0aW9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJl
IHVzZWQKLSAgdG8gc2V0IHVwIHN0YXRlIG9uIHRoZSBpbnN0YW5jZU1ldGEgb2JqZWN0LgotCi0g
IGByZW1vdmVkSXRlbWAgLSBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBl
bGVtZW50IGlzCi0gIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuCi0KLSAgYGFkZGVkSXRlbWAgLSBB
IGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBlbGVtZW50IGlzCi0gIGFkZGVk
IHRvIHRoZSBhcnJheS4KLQotCi0gIFRoZSBgaW5pdGlhbGl6ZWAgZnVuY3Rpb24gaGFzIHRoZSBm
b2xsb3dpbmcgc2lnbmF0dXJlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgIGZ1bmN0aW9uIChhcnJh
eSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQotICBgYGAKLQotICBgYXJyYXlgIC0gVGhlIGlu
aXRpYWwgdmFsdWUgb2YgdGhlIGFycmF5Q29tcHV0ZWQsIGFuIGVtcHR5IGFycmF5LgotCi0gIGBj
aGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIGFi
b3V0IHRoZQotICBjb21wdXRlZC4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVz
OgotCi0gICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQgcHJvcGVydHkKLSAgICAgLSBgcHJv
cGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdAotCi0gIGBp
bnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgbWV0YQot
ICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQuIEZvciBl
eGFtcGxlIGEKLSAgdW5pcXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlzIHRvIHN0b3JlIHRoZSBu
dW1iZXIgb2YgdGltZXMgYSBnaXZlbgotICBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBkZXBlbmRl
bnQgYXJyYXkuCi0KLQotICBUaGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rp
b25zIGJvdGggaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5j
ZU1ldGEpCi0gIGBgYAotCi0gIGBhY2N1bXVsYXRlZFZhbHVlYCAtIFRoZSB2YWx1ZSByZXR1cm5l
ZCBmcm9tIHRoZSBsYXN0IHRpbWUKLSAgYHJlbW92ZWRJdGVtYCBvciBgYWRkZWRJdGVtYCB3YXMg
Y2FsbGVkIG9yIGFuIGVtcHR5IGFycmF5LgotCi0gIGBpdGVtYCAtIHRoZSBlbGVtZW50IGFkZGVk
IG9yIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkKLQotICBgY2hhbmdlTWV0YWAgLSBBbiBvYmplY3Qg
d2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgY2hhbmdlLiBJdCBj
b250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0KLSAgICAtIGBwcm9wZXJ0eWAgdGhl
IGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgLSBgcHJvcGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUg
cHJvcGVydHkgb24gdGhlIG9iamVjdAotICAgIC0gYGluZGV4YCB0aGUgaW5kZXggb2YgdGhlIGFk
ZGVkIG9yIHJlbW92ZWQgaXRlbQotICAgIC0gYGl0ZW1gIHRoZSBhZGRlZCBvciByZW1vdmVkIGl0
ZW06IHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcwotICAgICAgdGhlIHNlY29uZCBhcmcKLSAg
ICAtIGBhcnJheUNoYW5nZWRgIHRoZSBhcnJheSB0aGF0IHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBD
YW4gYmUKLSAgICAgIHVzZWZ1bCB3aGVuIGRlcGVuZGluZyBvbiBtdWx0aXBsZSBhcnJheXMuCi0K
LSAgRm9yIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVkIG9uIGFuIGl0ZW0gcHJvcGVydHkgY2hh
bmdlICh3aGVuCi0gIGRlcEtleSBpcyBzb21ldGhpbmcgbGlrZSBgc29tZUFycmF5LkBlYWNoLnNv
bWVQcm9wZXJ0eWApLAotICBgY2hhbmdlTWV0YWAgd2lsbCBhbHNvIGNvbnRhaW4gdGhlIGZvbGxv
d2luZyBwcm9wZXJ0eToKLQotICAgIC0gYHByZXZpb3VzVmFsdWVzYCBhbiBvYmplY3Qgd2hvc2Ug
a2V5cyBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VkIG9uCi0gICAgdGhlIGl0ZW0sIGFu
ZCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBpdGVtJ3MgcHJldmlvdXMgdmFsdWVzLgotCi0gIGBwcmV2
aW91c1ZhbHVlc2AgaXMgaW1wb3J0YW50IEVtYmVyIGNvYWxlc2NlcyBpdGVtIHByb3BlcnR5IGNo
YW5nZXMgdmlhCi0gIEVtYmVyLnJ1bi5vbmNlLiBUaGlzIG1lYW5zIHRoYXQgYnkgdGhlIHRpbWUg
cmVtb3ZlZEl0ZW0gZ2V0cyBjYWxsZWQsIGl0ZW0gaGFzCi0gIHRoZSBuZXcgdmFsdWVzLCBidXQg
eW91IG1heSBuZWVkIHRoZSBwcmV2aW91cyB2YWx1ZSAoZWcgZm9yIHNvcnRpbmcgJgotICBmaWx0
ZXJpbmcpLgotCi0gIGBpbnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQg
dG8gc3RvcmUgbWV0YQotICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIg
Y29tcHV0ZWQuIEZvciBleGFtcGxlIGEKLSAgdW5pcXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlz
IHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnaXZlbgotICBlbGVtZW50IGlzIGZvdW5k
IGluIHRoZSBkZXBlbmRlbnQgYXJyYXkuCi0KLSAgVGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRl
ZEl0ZW1gIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBhY2N1bXVsYXRlZAotICB2YWx1ZS4g
SXQgaXMgYWNjZXB0YWJsZSB0byBub3QgcmV0dXJuIGFueXRoaW5nIChpZSByZXR1cm4gdW5kZWZp
bmVkKQotICB0byBpbnZhbGlkYXRlIHRoZSBjb21wdXRhdGlvbi4gVGhpcyBpcyBnZW5lcmFsbHkg
bm90IGEgZ29vZCBpZGVhIGZvcgotICBhcnJheUNvbXB1dGVkIGJ1dCBpdCdzIHVzZWQgaW4gZWcg
bWF4IGFuZCBtaW4uCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuY29t
cHV0ZWQubWFwID0gZnVuY3Rpb24oZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgewotICAgIHZhciBv
cHRpb25zID0gewotICAgICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdl
TWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIHZhciBtYXBwZWQgPSBjYWxsYmFjayhpdGVt
KTsKLSAgICAgICAgYXJyYXkuaW5zZXJ0QXQoY2hhbmdlTWV0YS5pbmRleCwgbWFwcGVkKTsKLSAg
ICAgICAgcmV0dXJuIGFycmF5OwotICAgICAgfSwKLSAgICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlv
bihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIGFycmF5
LnJlbW92ZUF0KGNoYW5nZU1ldGEuaW5kZXgsIDEpOwotICAgICAgICByZXR1cm4gYXJyYXk7Ci0g
ICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVkKGRlcGVuZGVu
dEtleSwgb3B0aW9ucyk7Ci0gIH07Ci0gIGBgYAotCi0gIEBtZXRob2QgYXJyYXlDb21wdXRlZAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBbZGVwZW5kZW50S2V5cypdCi0gIEBwYXJh
bSB7T2JqZWN0fSBvcHRpb25zCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9Ci0q
LwotRW1iZXIuYXJyYXlDb21wdXRlZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7Ci0gIHZhciBhcmdz
OwotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewotICAgIGFyZ3MgPSBhX3NsaWNlLmNh
bGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0gICAgb3B0aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMsIC0xKVswXTsKLSAgfQotCi0gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gIm9iamVjdCIpIHsK
LSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkFycmF5IENvbXB1dGVkIFByb3BlcnR5IGRlY2xh
cmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7Ci0gIH0KLQotICB2YXIgY3AgPSBuZXcgQXJy
YXlDb21wdXRlZFByb3BlcnR5KG9wdGlvbnMpOwotCi0gIGlmIChhcmdzKSB7Ci0gICAgY3AucHJv
cGVydHkuYXBwbHkoY3AsIGFyZ3MpOwotICB9Ci0KLSAgcmV0dXJuIGNwOwotfTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci1ydW50aW1lCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHNldCA9IEVtYmVyLnNl
dCwKLSAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwKLSAgICBtZXJnZSA9IEVtYmVyLm1lcmdl
LAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJs
ZVV0aWxzLmZvckVhY2gsCi0gICAgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwKLSAg
ICBTZWFyY2hQcm94eTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxjdWxh
dGVzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZQotICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2ls
bCByZXR1cm4gYC1JbmZpbml0eWAgd2hlbiB0aGUgZGVwZW5kZW50Ci0gIGFycmF5IGlzIGVtcHR5
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewotICAgIGNoaWxkQWdlczogRW1iZXIuY29tcHV0ZWQubWFwQnkoJ2NoaWxkcmVuJywgJ2FnZScp
LAotICAgIG1heENoaWxkQWdlOiBFbWJlci5jb21wdXRlZC5tYXgoJ2NoaWxkQWdlcycpCi0gIH0p
OwotCi0gIHZhciBsb3JkQnlyb24gPSBBcHAuUGVyc29uLmNyZWF0ZSh7Y2hpbGRyZW46IFtdfSk7
Ci0gIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIC1JbmZpbml0eQotICBsb3JkQnly
b24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3QoewotICAgIG5hbWU6ICdBdWd1c3RhIEFkYSBC
eXJvbicsIGFnZTogNwotICB9KTsKLSAgbG9yZEJ5cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8g
NwotICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7Ci0gICAgbmFtZTog
J0FsbGVncmEgQnlyb24nLAotICAgIGFnZTogNQotICB9LCB7Ci0gICAgbmFtZTogJ0VsaXphYmV0
aCBNZWRvcmEgTGVpZ2gnLAotICAgIGFnZTogOAotICB9XSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21h
eENoaWxkQWdlJyk7IC8vIDgKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5tYXgKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRoZSBsYXJnZXN0IHZhbHVlIGluIHRoZSBkZXBl
bmRlbnRLZXkncyBhcnJheQotKi8KLUVtYmVyLmNvbXB1dGVkLm1heCA9IGZ1bmN0aW9uIChkZXBl
bmRlbnRLZXkpIHsKLSAgcmV0dXJuIEVtYmVyLnJlZHVjZUNvbXB1dGVkLmNhbGwobnVsbCwgZGVw
ZW5kZW50S2V5LCB7Ci0gICAgaW5pdGlhbFZhbHVlOiAtSW5maW5pdHksCi0KLSAgICBhZGRlZEl0
ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5j
ZU1ldGEpIHsKLSAgICAgIHJldHVybiBNYXRoLm1heChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsK
LSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBp
dGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIGlmIChpdGVtIDwgYWNjdW11
bGF0ZWRWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWRWYWx1ZTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0pOwotfTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxj
dWxhdGVzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZQotICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMg
d2lsbCByZXR1cm4gYEluZmluaXR5YCB3aGVuIHRoZSBkZXBlbmRlbnQKLSAgYXJyYXkgaXMgZW1w
dHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdl
JyksCi0gICAgbWluQ2hpbGRBZ2U6IEVtYmVyLmNvbXB1dGVkLm1pbignY2hpbGRBZ2VzJykKLSAg
fSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjogW119
KTsKLSAgbG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRBZ2UnKTsgLy8gSW5maW5pdHkKLSAgbG9yZEJ5
cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0KHsKLSAgICBuYW1lOiAnQXVndXN0YSBBZGEg
Qnlyb24nLCBhZ2U6IDcKLSAgfSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21pbkNoaWxkQWdlJyk7IC8v
IDcKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbewotICAgIG5hbWU6
ICdBbGxlZ3JhIEJ5cm9uJywKLSAgICBhZ2U6IDUKLSAgfSwgewotICAgIG5hbWU6ICdFbGl6YWJl
dGggTWVkb3JhIExlaWdoJywKLSAgICBhZ2U6IDgKLSAgfV0pOwotICBsb3JkQnlyb24uZ2V0KCdt
aW5DaGlsZEFnZScpOyAvLyA1Ci0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubWluCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gdGhlIGRl
cGVuZGVudEtleSdzIGFycmF5Ci0qLwotRW1iZXIuY29tcHV0ZWQubWluID0gZnVuY3Rpb24gKGRl
cGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIucmVkdWNlQ29tcHV0ZWQuY2FsbChudWxsLCBk
ZXBlbmRlbnRLZXksIHsKLSAgICBpbml0aWFsVmFsdWU6IEluZmluaXR5LAotCi0gICAgYWRkZWRJ
dGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFu
Y2VNZXRhKSB7Ci0gICAgICByZXR1cm4gTWF0aC5taW4oYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSk7
Ci0gICAgfSwKLQotICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwg
aXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpZiAoaXRlbSA+IGFjY3Vt
dWxhdGVkVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkVmFsdWU7Ci0gICAgICB9
Ci0gICAgfQotICB9KTsKLX07Ci0KLS8qKgotICBSZXR1cm5zIGFuIGFycmF5IG1hcHBlZCB2aWEg
dGhlIGNhbGxiYWNrCi0KLSAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQg
aGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4KLSAgYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0
ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIGZ1bmN0aW9uKGl0ZW0p
OwotICBgYGAKLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGV4Y2l0aW5nQ2hvcmVzOiBFbWJlci5jb21wdXRl
ZC5tYXAoJ2Nob3JlcycsIGZ1bmN0aW9uKGNob3JlKSB7Ci0gICAgICByZXR1cm4gY2hvcmUudG9V
cHBlckNhc2UoKSArICchJzsKLSAgICB9KQotICB9KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5I
YW1zdGVyLmNyZWF0ZSh7Ci0gICAgY2hvcmVzOiBbJ2NsZWFuJywgJ3dyaXRlIG1vcmUgdW5pdCB0
ZXN0cyddCi0gIH0pOwotICBoYW1zdGVyLmdldCgnZXhjaXRpbmdDaG9yZXMnKTsgLy8gWydDTEVB
TiEnLCAnV1JJVEUgTU9SRSBVTklUIFRFU1RTISddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0
ZWQubWFwCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl
cnR5fSBhbiBhcnJheSBtYXBwZWQgdmlhIHRoZSBjYWxsYmFjawotKi8KLUVtYmVyLmNvbXB1dGVk
Lm1hcCA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgY2FsbGJhY2spIHsKLSAgdmFyIG9wdGlvbnMg
PSB7Ci0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5z
dGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgbWFwcGVkID0gY2FsbGJhY2suY2FsbCh0aGlzLCBpdGVt
KTsKLSAgICAgIGFycmF5Lmluc2VydEF0KGNoYW5nZU1ldGEuaW5kZXgsIG1hcHBlZCk7Ci0gICAg
ICByZXR1cm4gYXJyYXk7Ci0gICAgfSwKLSAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24oYXJyYXks
IGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewotICAgICAgYXJyYXkucmVtb3ZlQXQo
Y2hhbmdlTWV0YS5pbmRleCwgMSk7Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICB9Owot
Ci0gIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVkKGRlcGVuZGVudEtleSwgb3B0aW9ucyk7Ci19
OwotCi0vKioKLSAgUmV0dXJucyBhbiBhcnJheSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXku
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7
Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJykK
LSAgfSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjog
W119KTsKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRBZ2VzJyk7IC8vIFtdCi0gIGxvcmRCeXJvbi5n
ZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7bmFtZTogJ0F1Z3VzdGEgQWRhIEJ5cm9uJywgYWdl
OiA3fSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbN10KLSAgbG9yZEJ5cm9u
LmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbewotICAgIG5hbWU6ICdBbGxlZ3JhIEJ5cm9u
JywKLSAgICBhZ2U6IDUKLSAgfSwgewotICAgIG5hbWU6ICdFbGl6YWJldGggTWVkb3JhIExlaWdo
JywKLSAgICBhZ2U6IDgKLSAgfV0pOwotICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsgLy8g
WzcsIDUsIDhdCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubWFwQnkKLSAgQGZvciBFbWJl
cgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSBwcm9w
ZXJ0eUtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBw
ZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkKLSovCi1FbWJlci5jb21wdXRlZC5tYXBCeSA9IGZ1bmN0
aW9uKGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKLSAgdmFyIGNhbGxiYWNrID0gZnVuY3Rp
b24oaXRlbSkgeyByZXR1cm4gZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsgfTsKLSAgcmV0dXJuIEVt
YmVyLmNvbXB1dGVkLm1hcChkZXBlbmRlbnRLZXkgKyAnLkBlYWNoLicgKyBwcm9wZXJ0eUtleSwg
Y2FsbGJhY2spOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY29tcHV0ZWQubWFwUHJvcGVydHkKLSAg
QGZvciBFbWJlcgotICBAZGVwcmVjYXRlZCBVc2UgYEVtYmVyLmNvbXB1dGVkLm1hcEJ5YCBpbnN0
ZWFkCi0gIEBwYXJhbSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHByb3BlcnR5S2V5Ci0qLwotRW1i
ZXIuY29tcHV0ZWQubWFwUHJvcGVydHkgPSBFbWJlci5jb21wdXRlZC5tYXBCeTsKLQotLyoqCi0g
IEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBjYWxsYmFjay4KLQotICBUaGUgY2FsbGJhY2sgbWV0
aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlLgotICBg
aXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgZnVuY3Rpb24oaXRlbSk7Ci0gIGBgYAotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
LkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICByZW1haW5pbmdDaG9yZXM6IEVt
YmVyLmNvbXB1dGVkLmZpbHRlcignY2hvcmVzJywgZnVuY3Rpb24oY2hvcmUpIHsKLSAgICAgIHJl
dHVybiAhY2hvcmUuZG9uZTsKLSAgICB9KQotICB9KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5I
YW1zdGVyLmNyZWF0ZSh7Y2hvcmVzOiBbCi0gICAge25hbWU6ICdjb29rJywgZG9uZTogdHJ1ZX0s
Ci0gICAge25hbWU6ICdjbGVhbicsIGRvbmU6IHRydWV9LAotICAgIHtuYW1lOiAnd3JpdGUgbW9y
ZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2V9Ci0gIF19KTsKLSAgaGFtc3Rlci5nZXQoJ3JlbWFp
bmluZ0Nob3JlcycpOyAvLyBbe25hbWU6ICd3cml0ZSBtb3JlIHVuaXQgdGVzdHMnLCBkb25lOiBm
YWxzZX1dCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZmlsdGVyCi0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs
YmFjawotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJy
YXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0ZXIgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIGNh
bGxiYWNrKSB7Ci0gIHZhciBvcHRpb25zID0gewotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChh
cnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0YW5jZU1ldGEuZmls
dGVyZWRBcnJheUluZGV4ZXMgPSBuZXcgRW1iZXIuU3ViQXJyYXkoKTsKLSAgICB9LAotCi0gICAg
YWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICB2YXIgbWF0Y2ggPSAhIWNhbGxiYWNrLmNhbGwodGhpcywgaXRlbSksCi0gICAg
ICAgICAgZmlsdGVySW5kZXggPSBpbnN0YW5jZU1ldGEuZmlsdGVyZWRBcnJheUluZGV4ZXMuYWRk
SXRlbShjaGFuZ2VNZXRhLmluZGV4LCBtYXRjaCk7Ci0KLSAgICAgIGlmIChtYXRjaCkgewotICAg
ICAgICBhcnJheS5pbnNlcnRBdChmaWx0ZXJJbmRleCwgaXRlbSk7Ci0gICAgICB9Ci0KLSAgICAg
IHJldHVybiBhcnJheTsKLSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGFycmF5
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBmaWx0ZXJJbmRl
eCA9IGluc3RhbmNlTWV0YS5maWx0ZXJlZEFycmF5SW5kZXhlcy5yZW1vdmVJdGVtKGNoYW5nZU1l
dGEuaW5kZXgpOwotCi0gICAgICBpZiAoZmlsdGVySW5kZXggPiAtMSkgewotICAgICAgICBhcnJh
eS5yZW1vdmVBdChmaWx0ZXJJbmRleCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9Ci0gIH07Ci0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50S2V5
LCBvcHRpb25zKTsKLX07Ci0KLS8qKgotICBGaWx0ZXJzIHRoZSBhcnJheSBieSB0aGUgcHJvcGVy
dHkgYW5kIHZhbHVlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9i
amVjdC5leHRlbmQoewotICAgIHJlbWFpbmluZ0Nob3JlczogRW1iZXIuY29tcHV0ZWQuZmlsdGVy
QnkoJ2Nob3JlcycsICdkb25lJywgZmFsc2UpCi0gIH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBw
LkhhbXN0ZXIuY3JlYXRlKHtjaG9yZXM6IFsKLSAgICB7bmFtZTogJ2Nvb2snLCBkb25lOiB0cnVl
fSwKLSAgICB7bmFtZTogJ2NsZWFuJywgZG9uZTogdHJ1ZX0sCi0gICAge25hbWU6ICd3cml0ZSBt
b3JlIHVuaXQgdGVzdHMnLCBkb25lOiBmYWxzZX0KLSAgXX0pOwotICBoYW1zdGVyLmdldCgncmVt
YWluaW5nQ2hvcmVzJyk7IC8vIFt7bmFtZTogJ3dyaXRlIG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6
IGZhbHNlfV0KLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5maWx0ZXJCeQotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtTdHJpbmd9IHBy
b3BlcnR5S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0
ZXJCeSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXksIHZhbHVlKSB7Ci0gIHZh
ciBjYWxsYmFjazsKLQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgIGNhbGxi
YWNrID0gZnVuY3Rpb24oaXRlbSkgewotICAgICAgcmV0dXJuIGdldChpdGVtLCBwcm9wZXJ0eUtl
eSk7Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsK
LSAgICAgIHJldHVybiBnZXQoaXRlbSwgcHJvcGVydHlLZXkpID09PSB2YWx1ZTsKLSAgICB9Owot
ICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkLmZpbHRlcihkZXBlbmRlbnRLZXkgKyAnLkBl
YWNoLicgKyBwcm9wZXJ0eUtleSwgY2FsbGJhY2spOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY29t
cHV0ZWQuZmlsdGVyUHJvcGVydHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gZGVwZW5kZW50S2V5
Ci0gIEBwYXJhbSBwcm9wZXJ0eUtleQotICBAcGFyYW0gdmFsdWUKLSAgQGRlcHJlY2F0ZWQgVXNl
IGBFbWJlci5jb21wdXRlZC5maWx0ZXJCeWAgaW5zdGVhZAotKi8KLUVtYmVyLmNvbXB1dGVkLmZp
bHRlclByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnk7Ci0KLS8qKgotICBBIGNvbXB1
dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlIHVuaXF1
ZQotICBlbGVtZW50cyBmcm9tIG9uZSBvciBtb3JlIGRlcGVuZGVudCBhcnJheXMuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKLSAgICB1bmlxdWVGcnVpdHM6IEVtYmVyLmNvbXB1dGVkLnVuaXEoJ2ZydWl0cycpCi0g
IH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHtmcnVpdHM6IFsKLSAg
ICAnYmFuYW5hJywKLSAgICAnZ3JhcGUnLAotICAgICdrYWxlJywKLSAgICAnYmFuYW5hJwotICBd
fSk7Ci0gIGhhbXN0ZXIuZ2V0KCd1bmlxdWVGcnVpdHMnKTsgLy8gWydiYW5hbmEnLCAnZ3JhcGUn
LCAna2FsZSddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQudW5pcQotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtleSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0
ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlCi0gIHVuaXF1ZSBl
bGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC51bmlx
ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0g
IGFyZ3MucHVzaCh7Ci0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXJyYXksIGNoYW5nZU1ldGEs
IGluc3RhbmNlTWV0YSkgewotICAgICAgaW5zdGFuY2VNZXRhLml0ZW1Db3VudHMgPSB7fTsKLSAg
ICB9LAotCi0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwg
aW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3IoaXRlbSk7Ci0KLSAgICAg
IGlmICghaW5zdGFuY2VNZXRhLml0ZW1Db3VudHNbZ3VpZF0pIHsKLSAgICAgICAgaW5zdGFuY2VN
ZXRhLml0ZW1Db3VudHNbZ3VpZF0gPSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKytpbnN0
YW5jZU1ldGEuaXRlbUNvdW50c1tndWlkXTsKLSAgICAgIH0KLSAgICAgIGFycmF5LmFkZE9iamVj
dChpdGVtKTsKLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbihhcnJheSwgaXRlbSwgXywgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgZ3VpZCA9
IGd1aWRGb3IoaXRlbSksCi0gICAgICAgICAgaXRlbUNvdW50cyA9IGluc3RhbmNlTWV0YS5pdGVt
Q291bnRzOwotCi0gICAgICBpZiAoLS1pdGVtQ291bnRzW2d1aWRdID09PSAwKSB7Ci0gICAgICAg
IGFycmF5LnJlbW92ZU9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9Ci0gIH0pOwotICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBh
cmdzKTsKLX07Ci0KLS8qKgotICBBbGlhcyBmb3IgW0VtYmVyLmNvbXB1dGVkLnVuaXFdKC9hcGkv
I21ldGhvZF9jb21wdXRlZF91bmlxKS4KLQotICBAbWV0aG9kIGNvbXB1dGVkLnVuaW9uCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5KgotICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKLSAg
dW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVuZGVudCBhcnJheQotKi8KLUVtYmVyLmNvbXB1
dGVkLnVuaW9uID0gRW1iZXIuY29tcHV0ZWQudW5pcTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJv
cGVydHkgd2hpY2ggcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgZHVwbGljYXRlZAot
ICBlbGVtZW50cyBmcm9tIHR3byBvciBtb3JlIGRlcGVuZGVueSBhcnJheXMuCi0KLSAgRXhhbXBs
ZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIG9iaiA9IEVtYmVyLk9iamVjdC5jcmVhdGVXaXRo
TWl4aW5zKHsKLSAgICBhZGFGcmllbmRzOiBbJ0NoYXJsZXMgQmFiYmFnZScsICdKb2huIEhvYmhv
dXNlJywgJ1dpbGxpYW0gS2luZycsICdNYXJ5IFNvbWVydmlsbGUnXSwKLSAgICBjaGFybGVzRnJp
ZW5kczogWydXaWxsaWFtIEtpbmcnLCAnTWFyeSBTb21lcnZpbGxlJywgJ0FkYSBMb3ZlbGFjZScs
ICdHZW9yZ2UgUGVhY29jayddLAotICAgIGZyaWVuZHNJbkNvbW1vbjogRW1iZXIuY29tcHV0ZWQu
aW50ZXJzZWN0KCdhZGFGcmllbmRzJywgJ2NoYXJsZXNGcmllbmRzJykKLSAgfSk7Ci0KLSAgb2Jq
LmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsnV2lsbGlhbSBLaW5nJywgJ01hcnkgU29tZXJ2
aWxsZSddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuaW50ZXJzZWN0Ci0gIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKLSAgZHVwbGlj
YXRlZCBlbGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXlzCi0qLwotRW1iZXIuY29tcHV0
ZWQuaW50ZXJzZWN0ID0gZnVuY3Rpb24gKCkgewotICB2YXIgZ2V0RGVwZW5kZW50S2V5R3VpZHMg
PSBmdW5jdGlvbiAoY2hhbmdlTWV0YSkgewotICAgIHJldHVybiBtYXAoY2hhbmdlTWV0YS5wcm9w
ZXJ0eS5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24gKGRlcGVuZGVudEtleSkgewotICAgICAgcmV0
dXJuIGd1aWRGb3IoZGVwZW5kZW50S2V5KTsKLSAgICB9KTsKLSAgfTsKLQotICB2YXIgYXJncyA9
IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICBhcmdzLnB1c2goewotICAgIGluaXRpYWxpemU6
IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0
YW5jZU1ldGEuaXRlbUNvdW50cyA9IHt9OwotICAgIH0sCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0
aW9uKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBp
dGVtR3VpZCA9IGd1aWRGb3IoaXRlbSksCi0gICAgICAgICAgZGVwZW5kZW50R3VpZHMgPSBnZXRE
ZXBlbmRlbnRLZXlHdWlkcyhjaGFuZ2VNZXRhKSwKLSAgICAgICAgICBkZXBlbmRlbnRHdWlkID0g
Z3VpZEZvcihjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCksCi0gICAgICAgICAgbnVtYmVyT2ZEZXBl
bmRlbnRBcnJheXMgPSBjaGFuZ2VNZXRhLnByb3BlcnR5Ll9kZXBlbmRlbnRLZXlzLmxlbmd0aCwK
LSAgICAgICAgICBpdGVtQ291bnRzID0gaW5zdGFuY2VNZXRhLml0ZW1Db3VudHM7Ci0KLSAgICAg
IGlmICghaXRlbUNvdW50c1tpdGVtR3VpZF0pIHsgaXRlbUNvdW50c1tpdGVtR3VpZF0gPSB7fTsg
fQotICAgICAgaWYgKGl0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRl
ZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9Ci0KLSAg
ICAgIGlmICgrK2l0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSAxICYmCi0g
ICAgICAgICAgbnVtYmVyT2ZEZXBlbmRlbnRBcnJheXMgPT09IEVtYmVyLmtleXMoaXRlbUNvdW50
c1tpdGVtR3VpZF0pLmxlbmd0aCkgewotCi0gICAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsK
LSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2
YXIgaXRlbUd1aWQgPSBndWlkRm9yKGl0ZW0pLAotICAgICAgICAgIGRlcGVuZGVudEd1aWRzID0g
Z2V0RGVwZW5kZW50S2V5R3VpZHMoY2hhbmdlTWV0YSksCi0gICAgICAgICAgZGVwZW5kZW50R3Vp
ZCA9IGd1aWRGb3IoY2hhbmdlTWV0YS5hcnJheUNoYW5nZWQpLAotICAgICAgICAgIG51bWJlck9m
RGVwZW5kZW50QXJyYXlzID0gY2hhbmdlTWV0YS5wcm9wZXJ0eS5fZGVwZW5kZW50S2V5cy5sZW5n
dGgsCi0gICAgICAgICAgbnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luLAotICAgICAgICAgIGl0
ZW1Db3VudHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNvdW50czsKLQotICAgICAgaWYgKGl0ZW1Db3Vu
dHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tp
dGVtR3VpZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9Ci0gICAgICBpZiAoLS1pdGVtQ291bnRzW2l0
ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9PT0gMCkgewotICAgICAgICBkZWxldGUgaXRlbUNvdW50
c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF07Ci0gICAgICAgIG51bWJlck9mQXJyYXlzSXRlbUFw
cGVhcnNJbiA9IEVtYmVyLmtleXMoaXRlbUNvdW50c1tpdGVtR3VpZF0pLmxlbmd0aDsKLQotICAg
ICAgICBpZiAobnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luID09PSAwKSB7Ci0gICAgICAgICAg
ZGVsZXRlIGl0ZW1Db3VudHNbaXRlbUd1aWRdOwotICAgICAgICB9Ci0gICAgICAgIGFycmF5LnJl
bW92ZU9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0g
IH0pOwotICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBhcmdzKTsKLX07
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkg
d2l0aCBhbGwgdGhlCi0gIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVwZW5kZW50IGFycmF5
IHRoYXQgYXJlIG5vdCBpbiB0aGUgc2Vjb25kCi0gIGRlcGVuZGVudCBhcnJheS4KLQotICBFeGFt
cGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRl
bmQoewotICAgIGxpa2VzOiBbJ2JhbmFuYScsICdncmFwZScsICdrYWxlJ10sCi0gICAgd2FudHM6
IEVtYmVyLmNvbXB1dGVkLnNldERpZmYoJ2xpa2VzJywgJ2ZydWl0cycpCi0gIH0pOwotCi0gIHZh
ciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHtmcnVpdHM6IFsKLSAgICAnZ3JhcGUnLAot
ICAgICdrYWxlJywKLSAgXX0pOwotICBoYW1zdGVyLmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEn
XQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLnNldERpZmYKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0ge1N0cmluZ30gc2V0QVByb3BlcnR5Ci0gIEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVy
dHkKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJy
YXkgd2l0aCBhbGwgdGhlCi0gIGl0ZW1zIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0
aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZAotICBkZXBlbmRlbnQgYXJyYXkKLSovCi1FbWJlci5j
b21wdXRlZC5zZXREaWZmID0gZnVuY3Rpb24gKHNldEFQcm9wZXJ0eSwgc2V0QlByb3BlcnR5KSB7
Ci0gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAyKSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKCJzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkgdHdvIGRlcGVuZGVudCBhcnJheXMuIik7Ci0g
IH0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQuY2FsbChudWxsLCBzZXRBUHJvcGVydHks
IHNldEJQcm9wZXJ0eSwgewotICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBj
aGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBzZXRBID0gZ2V0KHRoaXMsIHNl
dEFQcm9wZXJ0eSksCi0gICAgICAgICAgc2V0QiA9IGdldCh0aGlzLCBzZXRCUHJvcGVydHkpOwot
Ci0gICAgICBpZiAoY2hhbmdlTWV0YS5hcnJheUNoYW5nZWQgPT09IHNldEEpIHsKLSAgICAgICAg
aWYgKCFzZXRCLmNvbnRhaW5zKGl0ZW0pKSB7Ci0gICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KGl0
ZW0pOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcnJheS5yZW1vdmVPYmpl
Y3QoaXRlbSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfSwKLQotICAgIHJl
bW92ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0
YSkgewotICAgICAgdmFyIHNldEEgPSBnZXQodGhpcywgc2V0QVByb3BlcnR5KSwKLSAgICAgICAg
ICBzZXRCID0gZ2V0KHRoaXMsIHNldEJQcm9wZXJ0eSk7Ci0KLSAgICAgIGlmIChjaGFuZ2VNZXRh
LmFycmF5Q2hhbmdlZCA9PT0gc2V0QikgewotICAgICAgICBpZiAoc2V0QS5jb250YWlucyhpdGVt
KSkgewotICAgICAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKLSAgICAgICAgfQotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgYXJyYXkucmVtb3ZlT2JqZWN0KGl0ZW0pOwotICAgICAgfQotICAg
ICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgfSk7Ci19OwotCi1mdW5jdGlvbiBiaW5hcnlTZWFy
Y2goYXJyYXksIGl0ZW0sIGxvdywgaGlnaCkgewotICB2YXIgbWlkLCBtaWRJdGVtLCByZXMsIGd1
aWRNaWQsIGd1aWRJdGVtOwotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgeyBoaWdoID0g
Z2V0KGFycmF5LCAnbGVuZ3RoJyk7IH0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7IGxv
dyA9IDA7IH0KLQotICBpZiAobG93ID09PSBoaWdoKSB7Ci0gICAgcmV0dXJuIGxvdzsKLSAgfQot
Ci0gIG1pZCA9IGxvdyArIE1hdGguZmxvb3IoKGhpZ2ggLSBsb3cpIC8gMik7Ci0gIG1pZEl0ZW0g
PSBhcnJheS5vYmplY3RBdChtaWQpOwotCi0gIGd1aWRNaWQgPSBfZ3VpZEZvcihtaWRJdGVtKTsK
LSAgZ3VpZEl0ZW0gPSBfZ3VpZEZvcihpdGVtKTsKLQotICBpZiAoZ3VpZE1pZCA9PT0gZ3VpZEl0
ZW0pIHsKLSAgICByZXR1cm4gbWlkOwotICB9Ci0KLSAgcmVzID0gdGhpcy5vcmRlcihtaWRJdGVt
LCBpdGVtKTsKLSAgaWYgKHJlcyA9PT0gMCkgewotICAgIHJlcyA9IGd1aWRNaWQgPCBndWlkSXRl
bSA/IC0xIDogMTsKLSAgfQotCi0KLSAgaWYgKHJlcyA8IDApIHsKLSAgICByZXR1cm4gdGhpcy5i
aW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgfSBlbHNlIGlmIChyZXMg
PiAwKSB7Ci0gICAgcmV0dXJuIHRoaXMuYmluYXJ5U2VhcmNoKGFycmF5LCBpdGVtLCBsb3csIG1p
ZCk7Ci0gIH0KLQotICByZXR1cm4gbWlkOwotCi0gIGZ1bmN0aW9uIF9ndWlkRm9yKGl0ZW0pIHsK
LSAgICBpZiAoU2VhcmNoUHJveHkuZGV0ZWN0SW5zdGFuY2UoaXRlbSkpIHsKLSAgICAgIHJldHVy
biBndWlkRm9yKGdldChpdGVtLCAnY29udGVudCcpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGd1aWRG
b3IoaXRlbSk7Ci0gIH0KLX0KLQotCi1TZWFyY2hQcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmV4
dGVuZCgpOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3
IGFycmF5IHdpdGggYWxsIHRoZQotICBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVu
dCBhcnJheSBzb3J0ZWQgYmFzZWQgb24gYSBwcm9wZXJ0eQotICBvciBzb3J0IGZ1bmN0aW9uLgot
Ci0gIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxv
d2luZyBzaWduYXR1cmU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBmdW5jdGlvbihpdGVtQSwgaXRl
bUIpOwotICBgYGAKLQotICAtIGBpdGVtQWAgdGhlIGZpcnN0IGl0ZW0gdG8gY29tcGFyZS4KLSAg
LSBgaXRlbUJgIHRoZSBzZWNvbmQgaXRlbSB0byBjb21wYXJlLgotCi0gIFRoaXMgZnVuY3Rpb24g
c2hvdWxkIHJldHVybiBgLTFgIHdoZW4gYGl0ZW1BYCBzaG91bGQgY29tZSBiZWZvcmUKLSAgYGl0
ZW1CYC4gSXQgc2hvdWxkIHJldHVybiBgMWAgd2hlbiBgaXRlbUFgIHNob3VsZCBjb21lIGFmdGVy
Ci0gIGBpdGVtQmAuIElmIHRoZSBgaXRlbUFgIGFuZCBgaXRlbUJgIGFyZSBlcXVhbCB0aGlzIGZ1
bmN0aW9uIHNob3VsZCByZXR1cm4gYDBgLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIHZhciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHRvZG9zU29ydGlu
ZzogWyduYW1lJ10sCi0gICAgc29ydGVkVG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9z
JywgJ3RvZG9zU29ydGluZycpLAotICAgIHByaW9yaXR5VG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNv
cnQoJ3RvZG9zJywgZnVuY3Rpb24oYSwgYil7Ci0gICAgICBpZiAoYS5wcmlvcml0eSA+IGIucHJp
b3JpdHkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9IGVsc2UgaWYgKGEucHJpb3JpdHkg
PCBiLnByaW9yaXR5KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIHJldHVy
biAwOwotICAgIH0pLAotICB9KTsKLSAgdmFyIHRvZG9MaXN0ID0gVG9Eb0xpc3QuY3JlYXRlKHt0
b2RvczogWwotICAgIHtuYW1lOiAnVW5pdCBUZXN0JywgcHJpb3JpdHk6IDJ9LAotICAgIHtuYW1l
OiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5OiAzfSwKLSAgICB7bmFtZTogJ1JlbGVhc2UnLCBw
cmlvcml0eTogMX0KLSAgXX0pOwotCi0gIHRvZG9MaXN0LmdldCgnc29ydGVkVG9kb3MnKTsgLy8g
W3tuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3JpdHk6M30sIHtuYW1lOidSZWxlYXNlJywgcHJp
b3JpdHk6MX0sIHtuYW1lOidVbml0IFRlc3QnLCBwcmlvcml0eToyfV0KLSAgdG9kb0xpc3QuZ2V0
KCdwcmlvcml0eVRvZG9zJyk7IC8vIFt7bmFtZTonUmVsZWFzZScsIHByaW9yaXR5OjF9LCB7bmFt
ZTonVW5pdCBUZXN0JywgcHJpb3JpdHk6Mn0sIHtuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3Jp
dHk6M31dCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuc29ydAotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtTdHJpbmcgb3IgRnVuY3Rp
b259IHNvcnREZWZpbml0aW9uIGEgZGVwZW5kZW50IGtleSB0byBhbgotICBhcnJheSBvZiBzb3J0
IHByb3BlcnRpZXMgb3IgYSBmdW5jdGlvbiB0byB1c2Ugd2hlbiBzb3J0aW5nCi0gIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IHNvcnRlZCBhcnJheSBiYXNl
ZAotICBvbiB0aGUgc29ydCBwcm9wZXJ0eSBhcnJheSBvciBjYWxsYmFjayBmdW5jdGlvbgotKi8K
LUVtYmVyLmNvbXB1dGVkLnNvcnQgPSBmdW5jdGlvbiAoaXRlbXNLZXksIHNvcnREZWZpbml0aW9u
KSB7Ci0gIEVtYmVyLmFzc2VydCgiRW1iZXIuY29tcHV0ZWQuc29ydCByZXF1aXJlcyB0d28gYXJn
dW1lbnRzOiBhbiBhcnJheSBrZXkgdG8gc29ydCBhbmQgZWl0aGVyIGEgc29ydCBwcm9wZXJ0aWVz
IGtleSBvciBzb3J0IGZ1bmN0aW9uIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0KLSAgdmFy
IGluaXRGbiwgc29ydFByb3BlcnRpZXNLZXk7Ci0KLSAgaWYgKHR5cGVvZiBzb3J0RGVmaW5pdGlv
biA9PT0gJ2Z1bmN0aW9uJykgewotICAgIGluaXRGbiA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdl
TWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0YW5jZU1ldGEub3JkZXIgPSBzb3J0RGVm
aW5pdGlvbjsKLSAgICAgIGluc3RhbmNlTWV0YS5iaW5hcnlTZWFyY2ggPSBiaW5hcnlTZWFyY2g7
Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBzb3J0UHJvcGVydGllc0tleSA9IHNvcnREZWZpbml0
aW9uOwotICAgIGluaXRGbiA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VN
ZXRhKSB7Ci0gICAgICBmdW5jdGlvbiBzZXR1cFNvcnRQcm9wZXJ0aWVzKCkgewotICAgICAgICB2
YXIgc29ydFByb3BlcnR5RGVmaW5pdGlvbnMgPSBnZXQodGhpcywgc29ydFByb3BlcnRpZXNLZXkp
LAotICAgICAgICAgICAgc29ydFByb3BlcnR5LAotICAgICAgICAgICAgc29ydFByb3BlcnRpZXMg
PSBpbnN0YW5jZU1ldGEuc29ydFByb3BlcnRpZXMgPSBbXSwKLSAgICAgICAgICAgIHNvcnRQcm9w
ZXJ0eUFzY2VuZGluZyA9IGluc3RhbmNlTWV0YS5zb3J0UHJvcGVydHlBc2NlbmRpbmcgPSB7fSwK
LSAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgIGFzYzsKLQotICAgICAgICBFbWJlci5hc3Nl
cnQoIkNhbm5vdCBzb3J0OiAnIiArIHNvcnRQcm9wZXJ0aWVzS2V5ICsgIicgaXMgbm90IGFuIGFy
cmF5LiIsIEVtYmVyLmlzQXJyYXkoc29ydFByb3BlcnR5RGVmaW5pdGlvbnMpKTsKLQotICAgICAg
ICBjaGFuZ2VNZXRhLnByb3BlcnR5LmNsZWFySXRlbVByb3BlcnR5S2V5cyhpdGVtc0tleSk7Ci0K
LSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydHlEZWZpbml0aW9ucywgZnVuY3Rpb24gKHNvcnRQ
cm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgICBpZiAoKGlkeCA9IHNvcnRQcm9wZXJ0eURl
ZmluaXRpb24uaW5kZXhPZignOicpKSAhPT0gLTEpIHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0
eSA9IHNvcnRQcm9wZXJ0eURlZmluaXRpb24uc3Vic3RyaW5nKDAsIGlkeCk7Ci0gICAgICAgICAg
ICBhc2MgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9uLnN1YnN0cmluZyhpZHgrMSkudG9Mb3dlckNh
c2UoKSAhPT0gJ2Rlc2MnOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb3J0UHJv
cGVydHkgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgYXNjID0gdHJ1ZTsK
LSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzb3J0UHJvcGVydGllcy5wdXNoKHNvcnRQcm9wZXJ0
eSk7Ci0gICAgICAgICAgc29ydFByb3BlcnR5QXNjZW5kaW5nW3NvcnRQcm9wZXJ0eV0gPSBhc2M7
Ci0gICAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5pdGVtUHJvcGVydHlLZXkoaXRlbXNLZXks
IHNvcnRQcm9wZXJ0eSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNvcnRQcm9wZXJ0eURlZmlu
aXRpb25zLmFkZE9ic2VydmVyKCdAZWFjaCcsIHRoaXMsIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25j
ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSgp
IHsKLSAgICAgICAgRW1iZXIucnVuLm9uY2UodGhpcywgdXBkYXRlU29ydFByb3BlcnRpZXMsIGNo
YW5nZU1ldGEucHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gdXBkYXRl
U29ydFByb3BlcnRpZXMocHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHNldHVwU29ydFByb3BlcnRp
ZXMuY2FsbCh0aGlzKTsKLSAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5yZWNvbXB1dGVPbmNl
LmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuYWRkT2Jz
ZXJ2ZXIodGhpcywgc29ydFByb3BlcnRpZXNLZXksIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7
Ci0KLSAgICAgIHNldHVwU29ydFByb3BlcnRpZXMuY2FsbCh0aGlzKTsKLQotCi0gICAgICBpbnN0
YW5jZU1ldGEub3JkZXIgPSBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7Ci0gICAgICAgIHZhciBz
b3J0UHJvcGVydHksIHJlc3VsdCwgYXNjOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRo
aXMuc29ydFByb3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICBzb3J0UHJvcGVydHkg
PSB0aGlzLnNvcnRQcm9wZXJ0aWVzW2ldOwotICAgICAgICAgIHJlc3VsdCA9IEVtYmVyLmNvbXBh
cmUoZ2V0KGl0ZW1BLCBzb3J0UHJvcGVydHkpLCBnZXQoaXRlbUIsIHNvcnRQcm9wZXJ0eSkpOwot
Ci0gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkgewotICAgICAgICAgICAgYXNjID0gdGhpcy5z
b3J0UHJvcGVydHlBc2NlbmRpbmdbc29ydFByb3BlcnR5XTsKLSAgICAgICAgICAgIHJldHVybiBh
c2MgPyByZXN1bHQgOiAoLTEgKiByZXN1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiAwOwotICAgICAgfTsKLQotICAgICAgaW5zdGFuY2VNZXRhLmJpbmFyeVNl
YXJjaCA9IGJpbmFyeVNlYXJjaDsKLSAgICB9OwotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmFycmF5
Q29tcHV0ZWQuY2FsbChudWxsLCBpdGVtc0tleSwgewotICAgIGluaXRpYWxpemU6IGluaXRGbiwK
LQotICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0
YW5jZU1ldGEpIHsKLSAgICAgIHZhciBpbmRleCA9IGluc3RhbmNlTWV0YS5iaW5hcnlTZWFyY2go
YXJyYXksIGl0ZW0pOwotICAgICAgYXJyYXkuaW5zZXJ0QXQoaW5kZXgsIGl0ZW0pOwotICAgICAg
cmV0dXJuIGFycmF5OwotICAgIH0sCi0KLSAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24gKGFycmF5
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBwcm94eVByb3Bl
cnRpZXMsIGluZGV4LCBzZWFyY2hJdGVtOwotCi0gICAgICBpZiAoY2hhbmdlTWV0YS5wcmV2aW91
c1ZhbHVlcykgewotICAgICAgICBwcm94eVByb3BlcnRpZXMgPSBtZXJnZSh7IGNvbnRlbnQ6IGl0
ZW0gfSwgY2hhbmdlTWV0YS5wcmV2aW91c1ZhbHVlcyk7Ci0KLSAgICAgICAgc2VhcmNoSXRlbSA9
IFNlYXJjaFByb3h5LmNyZWF0ZShwcm94eVByb3BlcnRpZXMpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgc2VhcmNoSXRlbSA9IGl0ZW07Ci0gICAgICB9Ci0KLSAgICAgIGluZGV4ID0gaW5zdGFu
Y2VNZXRhLmJpbmFyeVNlYXJjaChhcnJheSwgc2VhcmNoSXRlbSk7Ci0gICAgICBhcnJheS5yZW1v
dmVBdChpbmRleCk7Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICB9KTsKLX07Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5SU1ZQID0gcmVxdWlyZU1vZHVsZSgncnN2
cCcpOwotCi1FbWJlci5SU1ZQLm9uZXJyb3JEZWZhdWx0ID0gZnVuY3Rpb24oZXJyb3IpIHsKLSAg
aWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsKLSAgICBpZiAoRW1iZXIudGVzdGluZykgewot
ICAgICAgaWYgKEVtYmVyLlRlc3QgJiYgRW1iZXIuVGVzdC5hZGFwdGVyKSB7Ci0gICAgICAgIEVt
YmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb24oZXJyb3IpOwotICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhyb3cgZXJyb3I7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVtYmVyLkxvZ2dl
ci5lcnJvcihlcnJvci5zdGFjayk7Ci0gICAgICBFbWJlci5hc3NlcnQoZXJyb3IsIGZhbHNlKTsK
LSAgICB9Ci0gIH0KLX07Ci0KLUVtYmVyLlJTVlAub24oJ2Vycm9yJywgRW1iZXIuUlNWUC5vbmVy
cm9yRGVmYXVsdCk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGFfc2xpY2UgPSBBcnJh
eS5wcm90b3R5cGUuc2xpY2U7Ci0KLQotaWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0
cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uKSB7Ci0KLSAgLyoqCi0gICAg
VGhlIGBwcm9wZXJ0eWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5
cGUgaXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBF
bWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMKLSAgICBgdHJ1ZWAsIHdoaWNoIGlz
IHRoZSBkZWZhdWx0LgotCi0gICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJl
YXQgYSBmdW5jdGlvbiBsaWtlIGEgcHJvcGVydHk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
TXlBcHAuUHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6
ICcnLAotICAgICAgbGFzdE5hbWU6ICAnJywKLQotICAgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkg
ewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQo
J2xhc3ROYW1lJyk7Ci0KLSAgICAgICAgLy8gQ2FsbCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVu
Y3Rpb24gYXMgYSBwcm9wZXJ0eQotICAgICAgfS5wcm9wZXJ0eSgpCi0gICAgfSk7Ci0KLSAgICB2
YXIgcHJlc2lkZW50ID0gTXlBcHAuUHJlc2lkZW50LmNyZWF0ZSh7Ci0gICAgICBmaXJzdE5hbWU6
ICJCYXJhY2siLAotICAgICAgbGFzdE5hbWU6ICJPYmFtYSIKLSAgICB9KTsKLQotICAgIHByZXNp
ZGVudC5nZXQoJ2Z1bGxOYW1lJyk7ICAgIC8vICJCYXJhY2sgT2JhbWEiCi0gICAgYGBgCi0KLSAg
ICBUcmVhdGluZyBhIGZ1bmN0aW9uIGxpa2UgYSBwcm9wZXJ0eSBpcyB1c2VmdWwgYmVjYXVzZSB0
aGV5IGNhbiB3b3JrIHdpdGgKLSAgICBiaW5kaW5ncywganVzdCBsaWtlIGFueSBvdGhlciBwcm9w
ZXJ0eS4KLQotICAgIE1hbnkgY29tcHV0ZWQgcHJvcGVydGllcyBoYXZlIGRlcGVuZGVuY2llcyBv
biBvdGhlciBwcm9wZXJ0aWVzLiBGb3IKLSAgICBleGFtcGxlLCBpbiB0aGUgYWJvdmUgZXhhbXBs
ZSwgdGhlIGBmdWxsTmFtZWAgcHJvcGVydHkgZGVwZW5kcyBvbgotICAgIGBmaXJzdE5hbWVgIGFu
ZCBgbGFzdE5hbWVgIHRvIGRldGVybWluZSBpdHMgdmFsdWUuIFlvdSBjYW4gdGVsbCBFbWJlcgot
ICAgIGFib3V0IHRoZXNlIGRlcGVuZGVuY2llcyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgTXlBcHAuUHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBm
aXJzdE5hbWU6ICcnLAotICAgICAgbGFzdE5hbWU6ICAnJywKLQotICAgICAgZnVsbE5hbWU6IGZ1
bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsg
dGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgICAgLy8gVGVsbCBFbWJlci5qcyB0aGF0IHRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5hbWUKLSAgICAgICAgLy8gYW5k
IGxhc3ROYW1lCi0gICAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgTWFrZSBzdXJlIHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2ll
cyBzbyBFbWJlciBrbm93cyB3aGVuIHRvIHVwZGF0ZQotICAgIGJpbmRpbmdzIHRoYXQgY29ubmVj
dCB0byBhIGNvbXB1dGVkIHByb3BlcnR5LiBDaGFuZ2luZyBhIGRlcGVuZGVuY3kKLSAgICB3aWxs
IG5vdCBpbW1lZGlhdGVseSB0cmlnZ2VyIGFuIHVwZGF0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVy
dHksIGJ1dAotICAgIHdpbGwgaW5zdGVhZCBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1
cGRhdGVkIHdoZW4gdGhlIG5leHQgYGdldGAKLSAgICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5
LgotCi0gICAgU2VlIFtFbWJlci5Db21wdXRlZFByb3BlcnR5XSgvYXBpL2NsYXNzZXMvRW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eS5odG1sKSwgW0VtYmVyLmNvbXB1dGVkXSgvYXBpLyNtZXRob2RfY29t
cHV0ZWQpLgotCi0gICAgQG1ldGhvZCBwcm9wZXJ0eQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8K
LSAgRnVuY3Rpb24ucHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJl
dCA9IEVtYmVyLmNvbXB1dGVkKHRoaXMpOwotICAgIC8vIENvbXB1dGVkUHJvcGVydHkucHJvdG90
eXBlLnByb3BlcnR5IGV4cGFuZHMgcHJvcGVydGllczsgbm8gbmVlZCBmb3IgdXMgdG8KLSAgICAv
LyBkbyBzbyBoZXJlLgotICAgIHJldHVybiByZXQucHJvcGVydHkuYXBwbHkocmV0LCBhcmd1bWVu
dHMpOwotICB9OwotCi0gIC8qKgotICAgIFRoZSBgb2JzZXJ2ZXNgIGV4dGVuc2lvbiBvZiBKYXZh
c2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzIGF2YWlsYWJsZQotICAgIHdoZW4gYEVtYmVy
LkVYVEVORF9QUk9UT1RZUEVTYCBvciBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb25g
IGlzCi0gICAgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9ic2Vy
dmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNgCi0gICAg
Y2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRo
YXQgeW91IHdyaXRlLgotICAgIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgdmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5n
ZXMKLSAgICAgIH0ub2JzZXJ2ZXMoJ3ZhbHVlJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElu
IHRoZSBmdXR1cmUgdGhpcyBtZXRob2QgbWF5IGJlY29tZSBhc3luY2hyb25vdXMuIElmIHlvdSB3
YW50IHRvIGVuc3VyZQotICAgIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1c2UgYG9ic2VydmVzSW1t
ZWRpYXRlbHlgLgotCi0gICAgU2VlIGBFbWJlci5vYnNlcnZlcmAuCi0KLSAgICBAbWV0aG9kIG9i
c2VydmVzCi0gICAgQGZvciBGdW5jdGlvbgotICAqLwotICBGdW5jdGlvbi5wcm90b3R5cGUub2Jz
ZXJ2ZXMgPSBmdW5jdGlvbigpIHsKLSAgICAKLSAgICAgIHRoaXMuX19lbWJlcl9vYnNlcnZlc19f
ID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gICAgCi0KLSAgICByZXR1cm4gdGhpczsKLSAg
fTsKLQotICAvKioKLSAgICBUaGUgYG9ic2VydmVzSW1tZWRpYXRlbHlgIGV4dGVuc2lvbiBvZiBK
YXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzCi0gICAgYXZhaWxhYmxlIHdoZW4gYEVt
YmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvcgotICAgIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5G
dW5jdGlvbmAgaXMgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9i
c2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNJbW1l
ZGlhdGVseWAKLSAgICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25z
IGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICB2YWx1ZU9ic2VydmVy
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhl
ICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcwotICAgICAgfS5vYnNlcnZlc0ltbWVkaWF0ZWx5KCd2
YWx1ZScpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBJbiB0aGUgZnV0dXJlLCBgb2JzZXJ2ZXNg
IG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0aGlzIGV2ZW50LAotICAgIGBvYnNlcnZlc0lt
bWVkaWF0ZWx5YCB3aWxsIG1haW50YWluIHRoZSBzeW5jaHJvbm91cyBiZWhhdmlvci4KLQotICAg
IFNlZSBgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXJgLgotCi0gICAgQG1ldGhvZCBvYnNlcnZlc0lt
bWVkaWF0ZWx5Ci0gICAgQGZvciBGdW5jdGlvbgotICAqLwotICBGdW5jdGlvbi5wcm90b3R5cGUu
b2JzZXJ2ZXNJbW1lZGlhdGVseSA9IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIGk9MCwgbD1h
cmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tp
XTsKLSAgICAgIEVtYmVyLmFzc2VydCgiSW1tZWRpYXRlIG9ic2VydmVycyBtdXN0IG9ic2VydmUg
aW50ZXJuYWwgcHJvcGVydGllcyBvbmx5LCBub3QgcHJvcGVydGllcyBvbiBvdGhlciBvYmplY3Rz
LiIsIGFyZy5pbmRleE9mKCcuJykgPT09IC0xKTsKLSAgICB9Ci0KLSAgICAvLyBvYnNlcnZlcyBo
YW5kbGVzIHByb3BlcnR5IGV4cGFuc2lvbgotICAgIHJldHVybiB0aGlzLm9ic2VydmVzLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgVGhlIGBvYnNlcnZlc0JlZm9y
ZWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMKLSAgICBh
dmFpbGFibGUgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yCi0gICAgYEVtYmVyLkVY
VEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcyB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4K
LQotICAgIFlvdSBjYW4gZ2V0IG5vdGlmaWVkIHdoZW4gYSBwcm9wZXJ0eSBjaGFuZ2UgaXMgYWJv
dXQgdG8gaGFwcGVuIGJ5Ci0gICAgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNCZWZvcmVgIGNhbGwg
dG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZAotICAgIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRo
YXQgeW91IHdyaXRlLiBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgewotICAg
ICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBpcyBhYm91dCB0
byBjaGFuZ2UKLSAgICAgIH0ub2JzZXJ2ZXNCZWZvcmUoJ3ZhbHVlJykKLSAgICB9KTsKLSAgICBg
YGAKLQotICAgIFNlZSBgRW1iZXIuYmVmb3JlT2JzZXJ2ZXJgLgotCi0gICAgQG1ldGhvZCBvYnNl
cnZlc0JlZm9yZQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8KLSAgRnVuY3Rpb24ucHJvdG90eXBl
Lm9ic2VydmVzQmVmb3JlID0gZnVuY3Rpb24oKSB7Ci0gICAgCi0gICAgICB0aGlzLl9fZW1iZXJf
b2JzZXJ2ZXNCZWZvcmVfXyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgIAotCi0gICAg
cmV0dXJuIHRoaXM7Ci0gIH07Ci0KLSAgLyoqCi0gICAgVGhlIGBvbmAgZXh0ZW5zaW9uIG9mIEph
dmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1i
ZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlv
bmAgaXMKLSAgICB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLQotICAgIFlvdSBjYW4gbGlz
dGVuIGZvciBldmVudHMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9uYCBjYWxsIHRvIHRoZSBlbmQg
b2YKLSAgICB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyBvciBtaXhpbnMgdGhh
dCB5b3Ugd3JpdGUuIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVy
Lk1peGluLmNyZWF0ZSh7Ci0gICAgICBkb1NvbWV0aGluZ1dpdGhFbGVtZW50OiBmdW5jdGlvbigp
IHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJkaWRJbnNlcnRFbGVtZW50IiBl
dmVudCBmaXJlcwotICAgICAgfS5vbignZGlkSW5zZXJ0RWxlbWVudCcpCi0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBTZWUgYEVtYmVyLm9uYC4KLQotICAgIEBtZXRob2Qgb24KLSAgICBAZm9yIEZ1
bmN0aW9uCi0gICovCi0gIEZ1bmN0aW9uLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkgewotICAg
IHZhciBldmVudHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICB0aGlzLl9fZW1iZXJf
bGlzdGVuc19fID0gZXZlbnRzOwotICAgIHJldHVybiB0aGlzOwotICB9OwotfQotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi0vKioKLSAg
SW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvbXBhcmluZyBvYmplY3RzLiBB
ZGQgdGhpcyBtaXhpbiB0bwotICBhbnkgY2xhc3MgeW91IGNyZWF0ZSB0aGF0IGNhbiBjb21wYXJl
IGl0cyBpbnN0YW5jZXMuCi0KLSAgWW91IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBjb21wYXJlKClg
IG1ldGhvZC4KLQotICBAY2xhc3MgQ29tcGFyYWJsZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBz
aW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5Db21wYXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKLQotICAvKioKLSAgICBPdmVycmlkZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29t
cGFyaXNvbiBvZiB0aGUgdHdvIHBhcmFtZXRlcnMuIFRoZQotICAgIGNvbXBhcmUgbWV0aG9kIHNo
b3VsZCByZXR1cm46Ci0KLSAgICAtIGAtMWAgaWYgYGEgPCBiYAotICAgIC0gYDBgIGlmIGBhID09
IGJgCi0gICAgLSBgMWAgaWYgYGEgPiBiYAotCi0gICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBy
YWlzZXMgYW4gZXhjZXB0aW9uLgotCi0gICAgQG1ldGhvZCBjb21wYXJlCi0gICAgQHBhcmFtIGEg
e09iamVjdH0gdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgQHBhcmFtIGIge09iamVj
dH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQotICAgIEByZXR1cm4ge0ludGVnZXJ9IHRo
ZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KLSAgKi8KLSAgY29tcGFyZTogRW1iZXIucmVxdWly
ZWQoRnVuY3Rpb24pCi0KLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEltcGxlbWVudHMgc29t
ZSBzdGFuZGFyZCBtZXRob2RzIGZvciBjb3B5aW5nIGFuIG9iamVjdC4gQWRkIHRoaXMgbWl4aW4g
dG8KLSAgYW55IG9iamVjdCB5b3UgY3JlYXRlIHRoYXQgY2FuIGNyZWF0ZSBhIGNvcHkgb2YgaXRz
ZWxmLiBUaGlzIG1peGluIGlzCi0gIGFkZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGJ1aWx0LWlu
IGFycmF5LgotCi0gIFlvdSBzaG91bGQgZ2VuZXJhbGx5IGltcGxlbWVudCB0aGUgYGNvcHkoKWAg
bWV0aG9kIHRvIHJldHVybiBhIGNvcHkgb2YgdGhlCi0gIHJlY2VpdmVyLgotCi0gIE5vdGUgdGhh
dCBgZnJvemVuQ29weSgpYCB3aWxsIG9ubHkgd29yayBpZiB5b3UgYWxzbyBpbXBsZW1lbnQKLSAg
YEVtYmVyLkZyZWV6YWJsZWAuCi0KLSAgQGNsYXNzIENvcHlhYmxlCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVyLkNvcHlhYmxlID0gRW1iZXIuTWl4aW4u
Y3JlYXRlKHsKLQotICAvKioKLSAgICBPdmVycmlkZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBy
ZWNlaXZlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByYWlzZXMKLSAgICBhbiBleGNlcHRpb24u
Ci0KLSAgICBAbWV0aG9kIGNvcHkKLSAgICBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgaWYgYHRydWVg
LCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IHNob3VsZCBiZSBtYWRlCi0gICAgQHJldHVybiB7
T2JqZWN0fSBjb3B5IG9mIHJlY2VpdmVyCi0gICovCi0gIGNvcHk6IEVtYmVyLnJlcXVpcmVkKEZ1
bmN0aW9uKSwKLQotICAvKioKLSAgICBJZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgYEVtYmVyLkZy
ZWV6YWJsZWAsIHRoZW4gdGhpcyB3aWxsIHJldHVybiBhIG5ldwotICAgIGNvcHkgaWYgdGhlIG9i
amVjdCBpcyBub3QgZnJvemVuIGFuZCB0aGUgcmVjZWl2ZXIgaWYgdGhlIG9iamVjdCBpcyBmcm96
ZW4uCi0KLSAgICBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHlvdSB0cnkgdG8gY2FsbCB0aGlzIG1l
dGhvZCBvbiBhIG9iamVjdCB0aGF0IGRvZXMKLSAgICBub3Qgc3VwcG9ydCBmcmVlemluZy4KLQot
ICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHdoZW5ldmVyIHlvdSB3YW50IGEgY29weSBv
ZiBhIGZyZWV6YWJsZSBvYmplY3QKLSAgICBzaW5jZSBhIGZyZWV6YWJsZSBvYmplY3QgY2FuIHNp
bXBseSByZXR1cm4gaXRzZWxmIHdpdGhvdXQgYWN0dWFsbHkKLSAgICBjb25zdW1pbmcgbW9yZSBt
ZW1vcnkuCi0KLSAgICBAbWV0aG9kIGZyb3plbkNvcHkKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNv
cHkgb2YgcmVjZWl2ZXIgb3IgcmVjZWl2ZXIKLSAgKi8KLSAgZnJvemVuQ29weTogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKEVtYmVyLkZyZWV6YWJsZSAmJiBFbWJlci5GcmVlemFibGUuZGV0ZWN0KHRo
aXMpKSB7Ci0gICAgICByZXR1cm4gZ2V0KHRoaXMsICdpc0Zyb3plbicpID8gdGhpcyA6IHRoaXMu
Y29weSgpLmZyZWV6ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoRW1iZXIuU3RyaW5nLmZtdCgiJUAgZG9lcyBub3Qgc3VwcG9ydCBmcmVlemluZyIsIFt0aGlz
XSkpOwotICAgIH0KLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi12YXIgZ2V0
ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBUaGUgYEVtYmVyLkZyZWV6
YWJsZWAgbWl4aW4gaW1wbGVtZW50cyBzb21lIGJhc2ljIG1ldGhvZHMgZm9yIG1hcmtpbmcgYW4K
LSAgb2JqZWN0IGFzIGZyb3plbi4gT25jZSBhbiBvYmplY3QgaXMgZnJvemVuIGl0IHNob3VsZCBi
ZSByZWFkIG9ubHkuIE5vIGNoYW5nZXMKLSAgbWF5IGJlIG1hZGUgdGhlIGludGVybmFsIHN0YXRl
IG9mIHRoZSBvYmplY3QuCi0KLSAgIyMgRW5mb3JjZW1lbnQKLQotICBUbyBmdWxseSBzdXBwb3J0
IGZyZWV6aW5nIGluIHlvdXIgc3ViY2xhc3MsIHlvdSBtdXN0IGluY2x1ZGUgdGhpcyBtaXhpbiBh
bmQKLSAgb3ZlcnJpZGUgYW55IG1ldGhvZCB0aGF0IG1pZ2h0IGFsdGVyIGFueSBwcm9wZXJ0eSBv
biB0aGUgb2JqZWN0IHRvIGluc3RlYWQKLSAgcmFpc2UgYW4gZXhjZXB0aW9uLiBZb3UgY2FuIGNo
ZWNrIHRoZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkgY2hlY2tpbmcgdGhlCi0gIGBpc0Zyb3plbmAg
cHJvcGVydHkuCi0KLSAgQWx0aG91Z2ggZnV0dXJlIHZlcnNpb25zIG9mIEphdmFTY3JpcHQgbWF5
IHN1cHBvcnQgbGFuZ3VhZ2UtbGV2ZWwgZnJlZXppbmcKLSAgb2JqZWN0IG9iamVjdHMsIHRoYXQg
aXMgbm90IHRoZSBjYXNlIHRvZGF5LiBFdmVuIGlmIGFuIG9iamVjdCBpcyBmcmVlemFibGUsCi0g
IGl0IGlzIHN0aWxsIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgb2JqZWN0LCBl
dmVuIHRob3VnaCBpdCBjb3VsZAotICBicmVhayBvdGhlciBwYXJ0cyBvZiB5b3VyIGFwcGxpY2F0
aW9uIHRoYXQgZG8gbm90IGV4cGVjdCBhIGZyb3plbiBvYmplY3QgdG8KLSAgY2hhbmdlLiBJdCBp
cywgdGhlcmVmb3JlLCB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdSBhbHdheXMgcmVzcGVjdCB0aGUK
LSAgYGlzRnJvemVuYCBwcm9wZXJ0eSBvbiBhbGwgZnJlZXphYmxlIG9iamVjdHMuCi0KLSAgIyMg
RXhhbXBsZSBVc2FnZQotCi0gIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGEgc2ltcGxlIG9iamVj
dCB0aGF0IGltcGxlbWVudCB0aGUgYEVtYmVyLkZyZWV6YWJsZWAKLSAgcHJvdG9jb2wuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBDb250YWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5GcmVl
emFibGUsIHsKLSAgICBmaXJzdE5hbWU6IG51bGwsCi0gICAgbGFzdE5hbWU6IG51bGwsCi0KLSAg
ICAvLyBzd2FwcyB0aGUgbmFtZXMKLSAgICBzd2FwTmFtZXM6IGZ1bmN0aW9uKCkgewotICAgICAg
aWYgKHRoaXMuZ2V0KCdpc0Zyb3plbicpKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7Ci0gICAg
ICB2YXIgdG1wID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOwotICAgICAgdGhpcy5zZXQoJ2ZpcnN0
TmFtZScsIHRoaXMuZ2V0KCdsYXN0TmFtZScpKTsKLSAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScs
IHRtcCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgfSk7Ci0KLSAgYyA9IENvbnRh
Y3QuY3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIsIGxhc3ROYW1lOiAiRG9lIiB9KTsKLSAgYy5z
d2FwTmFtZXMoKTsgIC8vIHJldHVybnMgYwotICBjLmZyZWV6ZSgpOwotICBjLnN3YXBOYW1lcygp
OyAgLy8gRVhDRVBUSU9OCi0gIGBgYAotCi0gICMjIENvcHlpbmcKLQotICBVc3VhbGx5IHRoZSBg
RW1iZXIuRnJlZXphYmxlYCBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBpbiBjb29wZXJhdGlvbiB3
aXRoIHRoZQotICBgRW1iZXIuQ29weWFibGVgIHByb3RvY29sLCB3aGljaCBkZWZpbmVzIGEgYGZy
b3plbkNvcHkoKWAgbWV0aG9kIHRoYXQgd2lsbAotICByZXR1cm4gYSBmcm96ZW4gb2JqZWN0LCBp
ZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhpcyBtZXRob2QgYXMgd2VsbC4KLQotICBAY2xhc3Mg
RnJlZXphYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVt
YmVyLkZyZWV6YWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0KLSAgLyoqCi0gICAgU2V0IHRv
IGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgZnJvemVuLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBk
ZXRlY3QKLSAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZyb3plbiBvciBub3QuCi0KLSAgICBA
cHJvcGVydHkgaXNGcm96ZW4KLSAgICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGlzRnJvemVuOiBm
YWxzZSwKLQotICAvKioKLSAgICBGcmVlemVzIHRoZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2Qg
aGFzIGJlZW4gY2FsbGVkIHRoZSBvYmplY3Qgc2hvdWxkCi0gICAgbm8gbG9uZ2VyIGFsbG93IGFu
eSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZC4KLQotICAgIEBtZXRob2QgZnJlZXplCi0gICAgQHJl
dHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAqLwotICBmcmVlemU6IGZ1bmN0aW9uKCkgewotICAg
IGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHJldHVybiB0aGlzOwotICAgIHNldCh0aGlzLCAn
aXNGcm96ZW4nLCB0cnVlKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi19KTsKLQotRW1iZXIu
RlJPWkVOX0VSUk9SID0gIkZyb3plbiBvYmplY3QgY2Fubm90IGJlIG1vZGlmaWVkLiI7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQotKi8KLQotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
Zm9yRWFjaDsKLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlp
bmcgZ2VuZXJpYyBlbnVtZXJhYmxlcy4gVGhlc2UgbWV0aG9kcwotICBjYW4gYmUgYXBwbGllZCB0
byBhbiBvYmplY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIG9yZGVyZWQgb3IKLSAgdW5v
cmRlcmVkLgotCi0gIE5vdGUgdGhhdCBhbiBFbnVtZXJhYmxlIGNhbiBjaGFuZ2UgZXZlbiBpZiBp
dCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhpbi4KLSAgRm9yIGV4YW1wbGUsIGEgTWFwcGVk
RW51bWVyYWJsZSBjYW5ub3QgYmUgZGlyZWN0bHkgbW9kaWZpZWQgYnV0IGlmIGl0cwotICB1bmRl
cmx5aW5nIGVudW1lcmFibGUgY2hhbmdlcywgaXQgd2lsbCBjaGFuZ2UgYWxzby4KLQotICAjIyBB
ZGRpbmcgT2JqZWN0cwotCi0gIFRvIGFkZCBhbiBvYmplY3QgdG8gYW4gZW51bWVyYWJsZSwgdXNl
IHRoZSBgYWRkT2JqZWN0KClgIG1ldGhvZC4gVGhpcwotICBtZXRob2Qgd2lsbCBvbmx5IGFkZCB0
aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJhYmxlIGlmIHRoZSBvYmplY3QgaXMgbm90Ci0gIGFscmVh
ZHkgcHJlc2VudCBhbmQgaXMgb2YgYSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgZW51bWVyYWJsZS4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIHNldC5hZGRPYmplY3QoY29udGFjdCk7Ci0gIGBgYAotCi0g
ICMjIFJlbW92aW5nIE9iamVjdHMKLQotICBUbyByZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gZW51
bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0KClgIG1ldGhvZC4gVGhpcwotICB3aWxsIG9u
bHkgcmVtb3ZlIHRoZSBvYmplY3QgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgZW51bWVyYWJsZSwg
b3RoZXJ3aXNlCi0gIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBzZXQucmVtb3ZlT2JqZWN0KGNvbnRhY3QpOwotICBgYGAKLQotICAjIyBJbXBsZW1lbnRp
bmcgSW4gWW91ciBPd24gQ29kZQotCi0gIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGFuIG9iamVj
dCBhbmQgd2FudCB0byBzdXBwb3J0IHRoaXMgQVBJLCBqdXN0IGluY2x1ZGUKLSAgdGhpcyBtaXhp
biBpbiB5b3VyIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIHJlcXVpcmVkIG1ldGhvZHMuIEluIHlv
dXIgdW5pdAotICB0ZXN0cywgYmUgc3VyZSB0byBhcHBseSB0aGUgRW1iZXIuTXV0YWJsZUVudW1l
cmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KLQotICBAY2xhc3MgTXV0YWJsZUVudW1lcmFibGUK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0qLwotRW1iZXIu
TXV0YWJsZUVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwg
ewotCi0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0
aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAgICBBdHRlbXB0cyB0byBhZGQgdGhlIHBhc3Nl
ZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgbm90Ci0gICAgYWxyZWFk
eSBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJZiB0aGUgb2JqZWN0IGlzIHByZXNlbnQsIHRo
aXMgbWV0aG9kCi0gICAgaGFzIG5vIGVmZmVjdC4KLQotICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0
IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwKLSAgICB0aGVuIHRo
aXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgICBAbWV0aG9kIGFkZE9i
amVjdAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBhZGQgdG8gdGhl
IGVudW1lcmFibGUuCi0gICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIG9iamVjdAotICAq
LwotICBhZGRPYmplY3Q6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBB
ZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSB0byB0aGUgcmVjZWl2ZXIu
Ci0KLSAgICBAbWV0aG9kIGFkZE9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9
IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgotICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2
ZXIKLSAgKi8KLSAgYWRkT2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykgewotICAgIEVtYmVyLmJl
Z2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICAgIGZvckVhY2gob2JqZWN0cywgZnVuY3Rpb24o
b2JqKSB7IHRoaXMuYWRkT2JqZWN0KG9iaik7IH0sIHRoaXMpOwotICAgIEVtYmVyLmVuZFByb3Bl
cnR5Q2hhbmdlcyh0aGlzKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBf
X1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlz
IG1peGluLgotCi0gICAgQXR0ZW1wdHMgdG8gcmVtb3ZlIHRoZSBwYXNzZWQgb2JqZWN0IGZyb20g
dGhlIHJlY2VpdmVyIGNvbGxlY3Rpb24gaWYgdGhlCi0gICAgb2JqZWN0IGlzIHByZXNlbnQgaW4g
dGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMgbm90IHByZXNlbnQsCi0gICAgdGhpcyBt
ZXRob2QgaGFzIG5vIGVmZmVjdC4KLQotICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEg
dHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwKLSAgICB0aGVuIHRoaXMgbWV0aG9k
IHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgICBAbWV0aG9kIHJlbW92ZU9iamVjdAot
ICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGUg
ZW51bWVyYWJsZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgb2JqZWN0Ci0gICov
Ci0gIHJlbW92ZU9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAotCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFibGUgZnJvbSB0aGUg
cmVjZWl2ZXIuCi0KLSAgICBAbWV0aG9kIHJlbW92ZU9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVy
LkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gcmVtb3ZlCi0gICAgQHJldHVybiB7
T2JqZWN0fSByZWNlaXZlcgotICAqLwotICByZW1vdmVPYmplY3RzOiBmdW5jdGlvbihvYmplY3Rz
KSB7Ci0gICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXModGhpcyk7Ci0gICAgZm9yRWFjaChv
YmplY3RzLCBmdW5jdGlvbihvYmopIHsgdGhpcy5yZW1vdmVPYmplY3Qob2JqKTsgfSwgdGhpcyk7
Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICAgIHJldHVybiB0aGlzOwot
ICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8v
Ci0KLXZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gIkluZGV4IG91dCBvZiByYW5nZSIgOwot
dmFyIEVNUFRZID0gW107Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEhFTFBFUlMKLS8vCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUg
QVBJIGZvciBtb2RpZnlpbmcgYXJyYXktbGlrZSBvYmplY3RzLiBUaGVzZSBtZXRob2RzCi0gIGNh
biBiZSBhcHBsaWVkIG9ubHkgdG8gYSBjb2xsZWN0aW9uIHRoYXQga2VlcHMgaXRzIGl0ZW1zIGlu
IGFuIG9yZGVyZWQgc2V0LgotCi0gIE5vdGUgdGhhdCBhbiBBcnJheSBjYW4gY2hhbmdlIGV2ZW4g
aWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCi0gIEZvciBleGFtcGxlLCBvbmUg
bWlnaHQgaW1wbGVtZW50IGEgU3BhcnNlQXJyYXkgdGhhdCBjYW5ub3QgYmUgZGlyZWN0bHkKLSAg
bW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWluZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdp
bGwgY2hhbmdlIGFsc28uCi0KLSAgQGNsYXNzIE11dGFibGVBcnJheQotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEB1c2VzIEVtYmVyLkFycmF5Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVFbnVtZXJhYmxl
Ci0qLwotRW1iZXIuTXV0YWJsZUFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFycmF5
LCBFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwgewotCi0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18g
WW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAg
ICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3Vw
cG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIFlvdSBzaG91bGQgcmVwbGFjZSBhbXQgb2JqZWN0cyBz
dGFydGVkIGF0IGlkeCB3aXRoIHRoZSBvYmplY3RzIGluIHRoZQotICAgIHBhc3NlZCBhcnJheS4g
WW91IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAK
LQotICAgIEBtZXRob2QgcmVwbGFjZQotICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggU3RhcnRpbmcg
aW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElmCi0gICAgICBpZHggPj0gbGVuZ3RoLCB0
aGVuIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheS4KLSAgICBAcGFyYW0ge051bWJlcn0g
YW10IE51bWJlciBvZiBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20KLSAgICAg
IHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCouCi0gICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0
cyBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQotICAgICAg
aW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoKLSAgKi8KLSAgcmVwbGFjZTogRW1iZXIu
cmVxdWlyZWQoKSwKLQotICAvKioKLSAgICBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gc2VsZi4g
VGhpcyBpcyB1c2VmdWwgaWYgeW91Ci0gICAgd2FudCB0byByZXVzZSBhbiBleGlzdGluZyBhcnJh
eSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBpdC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdOwotICAgIGNvbG9yLmxlbmd0
aCgpOyAgIC8vICAzCi0gICAgY29sb3JzLmNsZWFyKCk7ICAgLy8gIFtdCi0gICAgY29sb3JzLmxl
bmd0aCgpOyAgLy8gIDAKLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2xlYXIKLSAgICBAcmV0dXJu
IHtFbWJlci5BcnJheX0gQW4gZW1wdHkgQXJyYXkuCi0gICovCi0gIGNsZWFyOiBmdW5jdGlvbiAo
KSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYgKGxlbiA9PT0g
MCkgcmV0dXJuIHRoaXM7Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgRU1QVFkpOwotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgd2lsbCB1c2UgdGhlIHByaW1pdGl2
ZSBgcmVwbGFjZSgpYCBtZXRob2QgdG8gaW5zZXJ0IGFuIG9iamVjdCBhdCB0aGUKLSAgICBzcGVj
aWZpZWQgaW5kZXguCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvcnMuaW5zZXJ0QXQoMiwgInllbGxvdyIpOyAg
Ly8gWyJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiXQotICAgIGNvbG9ycy5pbnNlcnRB
dCg1LCAib3JhbmdlIik7ICAvLyBFcnJvcjogSW5kZXggb3V0IG9mIHJhbmdlCi0gICAgYGBgCi0K
LSAgICBAbWV0aG9kIGluc2VydEF0Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGlkeCBpbmRleCBvZiBp
bnNlcnQgdGhlIG9iamVjdCBhdC4KLSAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9iamVjdCB0
byBpbnNlcnQKLSAgICBAcmV0dXJuIHRoaXMKLSAgKi8KLSAgaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlk
eCwgb2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnbGVuZ3RoJykpIHRocm93IG5l
dyBFbWJlci5FcnJvcihPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OKSA7Ci0gICAgdGhpcy5yZXBsYWNl
KGlkeCwgMCwgW29iamVjdF0pIDsKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlIGFuIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHVzaW5nIHRoZSBgcmVw
bGFjZSgpYCBwcmltaXRpdmUKLSAgICBtZXRob2QuIFlvdSBjYW4gcGFzcyBlaXRoZXIgYSBzaW5n
bGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgotCi0gICAgSWYgeW91IHBhc3MgYSBz
dGFydCBhbmQgbGVuZ3RoIHRoYXQgaXMgYmV5b25kIHRoZQotICAgIGxlbmd0aCB0aGlzIG1ldGhv
ZCB3aWxsIHRocm93IGFuIGBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OYC4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ci
LCAib3JhbmdlIl07Ci0gICAgY29sb3JzLnJlbW92ZUF0KDApOyAgICAgLy8gWyJncmVlbiIsICJi
bHVlIiwgInllbGxvdyIsICJvcmFuZ2UiXQotICAgIGNvbG9ycy5yZW1vdmVBdCgyLCAyKTsgIC8v
IFsiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgY29sb3JzLnJlbW92ZUF0KDQsIDIpOyAgLy8gRXJyb3I6
IEluZGV4IG91dCBvZiByYW5nZQotICAgIGBgYAotCi0gICAgQG1ldGhvZCByZW1vdmVBdAotICAg
IEBwYXJhbSB7TnVtYmVyfSBzdGFydCBpbmRleCwgc3RhcnQgb2YgcmFuZ2UKLSAgICBAcGFyYW0g
e051bWJlcn0gbGVuIGxlbmd0aCBvZiBwYXNzaW5nIHJhbmdlCi0gICAgQHJldHVybiB7T2JqZWN0
fSByZWNlaXZlcgotICAqLwotICByZW1vdmVBdDogZnVuY3Rpb24oc3RhcnQsIGxlbikgewotICAg
IGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHN0YXJ0KSB7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAw
KSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgICAgfQotCi0gICAgICAv
LyBmYXN0IGNhc2UKLSAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgbGVuID0gMTsKLSAgICAg
IHRoaXMucmVwbGFjZShzdGFydCwgbGVuLCBFTVBUWSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRo
aXMgOwotICB9LAotCi0gIC8qKgotICAgIFB1c2ggdGhlIG9iamVjdCBvbnRvIHRoZSBlbmQgb2Yg
dGhlIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHB1c2goKWAgYnV0IGl0Ci0gICAgaXMgS1ZPLWNv
bXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAi
Z3JlZW4iXTsKLSAgICBjb2xvcnMucHVzaE9iamVjdCgiYmxhY2siKTsgICAgIC8vIFsicmVkIiwg
ImdyZWVuIiwgImJsYWNrIl0KLSAgICBjb2xvcnMucHVzaE9iamVjdChbInllbGxvdyJdKTsgIC8v
IFsicmVkIiwgImdyZWVuIiwgWyJ5ZWxsb3ciXV0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgcHVz
aE9iamVjdAotICAgIEBwYXJhbSB7Kn0gb2JqIG9iamVjdCB0byBwdXNoCi0gICAgQHJldHVybiBU
aGUgc2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCi0gICovCi0gIHB1c2hPYmplY3Q6IGZ1bmN0aW9u
KG9iaikgewotICAgIHRoaXMuaW5zZXJ0QXQoZ2V0KHRoaXMsICdsZW5ndGgnKSwgb2JqKSA7Ci0g
ICAgcmV0dXJuIG9iajsKLSAgfSwKLQotICAvKioKLSAgICBBZGQgdGhlIG9iamVjdHMgaW4gdGhl
IHBhc3NlZCBudW1lcmFibGUgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIERlZmVycwotICAgIG5v
dGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRk
ZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIl07Ci0gICAg
Y29sb3JzLnB1c2hPYmplY3RzKFsieWVsbG93IiwgIm9yYW5nZSJdKTsgIC8vIFsicmVkIiwgInll
bGxvdyIsICJvcmFuZ2UiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBwdXNoT2JqZWN0cwotICAg
IEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKLSAg
ICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgcHVzaE9iamVjdHM6IGZ1
bmN0aW9uKG9iamVjdHMpIHsKLSAgICBpZiAoIShFbWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmpl
Y3RzKSB8fCBFbWJlci5pc0FycmF5KG9iamVjdHMpKSkgewotICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcigiTXVzdCBwYXNzIEVtYmVyLkVudW1lcmFibGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1
c2hPYmplY3RzIik7Ci0gICAgfQotICAgIHRoaXMucmVwbGFjZShnZXQodGhpcywgJ2xlbmd0aCcp
LCAwLCBvYmplY3RzKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBQb3Ag
b2JqZWN0IGZyb20gYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxlZnQuIFdvcmtzIGp1c3QgbGlr
ZSBgcG9wKClgIGJ1dAotICAgIGl0IGlzIEtWTy1jb21wbGlhbnQuCi0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xv
cnMucG9wT2JqZWN0KCk7ICAgLy8gImJsdWUiCi0gICAgY29uc29sZS5sb2coY29sb3JzKTsgIC8v
IFsicmVkIiwgImdyZWVuIl0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgcG9wT2JqZWN0Ci0gICAg
QHJldHVybiBvYmplY3QKLSAgKi8KLSAgcG9wT2JqZWN0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7Ci0gICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIG51
bGwgOwotCi0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQobGVuLTEpIDsKLSAgICB0aGlzLnJl
bW92ZUF0KGxlbi0xLCAxKSA7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
U2hpZnQgYW4gb2JqZWN0IGZyb20gc3RhcnQgb2YgYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxl
ZnQuIFdvcmtzIGp1c3QKLSAgICBsaWtlIGBzaGlmdCgpYCBidXQgaXQgaXMgS1ZPLWNvbXBsaWFu
dC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4i
LCAiYmx1ZSJdOwotICAgIGNvbG9ycy5zaGlmdE9iamVjdCgpOyAgLy8gInJlZCIKLSAgICBjb25z
b2xlLmxvZyhjb2xvcnMpOyAgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHNoaWZ0T2JqZWN0Ci0gICAgQHJldHVybiBvYmplY3QKLSAgKi8KLSAgc2hpZnRPYmpl
Y3Q6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2xlbmd0aCcpID09PSAwKSByZXR1
cm4gbnVsbCA7Ci0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQoMCkgOwotICAgIHRoaXMucmVt
b3ZlQXQoMCkgOwotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFVuc2hpZnQg
YW4gb2JqZWN0IHRvIHN0YXJ0IG9mIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHVuc2hpZnQoKWAg
YnV0IGl0IGlzCi0gICAgS1ZPLWNvbXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgY29sb3JzID0gWyJyZWQiXTsKLSAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgieWVsbG93Iik7
ICAgIC8vIFsieWVsbG93IiwgInJlZCJdCi0gICAgY29sb3JzLnVuc2hpZnRPYmplY3QoWyJibGFj
ayJdKTsgICAvLyBbWyJibGFjayJdLCAieWVsbG93IiwgInJlZCJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHVuc2hpZnRPYmplY3QKLSAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gdW5zaGlm
dAotICAgIEByZXR1cm4gVGhlIHNhbWUgb2JqIHBhc3NlZCBhcyBwYXJhbQotICAqLwotICB1bnNo
aWZ0T2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLmluc2VydEF0KDAsIG9iaikgOwot
ICAgIHJldHVybiBvYmogOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgdGhlIG5hbWVkIG9iamVj
dHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIERlZmVycyBub3RpZnlpbmcKLSAgICBv
YnNlcnZlcnMgdW50aWwgYWxsIG9iamVjdHMgaGF2ZSBiZWVuIGFkZGVkLgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJlZCJdOwotICAgIGNvbG9ycy51bnNoaWZ0T2Jq
ZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8vIFsiYmxhY2siLCAid2hpdGUiLCAicmVkIl0K
LSAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoInllbGxvdyIpOyAvLyBUeXBlIEVycm9yOiAndW5k
ZWZpbmVkJyBpcyBub3QgYSBmdW5jdGlvbgotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1bnNoaWZ0
T2JqZWN0cwotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0
cyB0byBhZGQKLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgdW5z
aGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICB0aGlzLnJlcGxhY2UoMCwgMCwg
b2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV2ZXJzZSBv
YmplY3RzIGluIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGByZXZlcnNlKClgIGJ1dCBpdCBp
cwotICAgIEtWTy1jb21wbGlhbnQuCi0KLSAgICBAbWV0aG9kIHJldmVyc2VPYmplY3RzCi0gICAg
QHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICAqLwotICByZXZlcnNlT2JqZWN0czog
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYg
KGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7Ci0gICAgdmFyIG9iamVjdHMgPSB0aGlzLnRvQXJyYXko
KS5yZXZlcnNlKCk7Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0
dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVwbGFjZSBhbGwgdGhlIHRoZSByZWNlaXZl
cidzIGNvbnRlbnQgd2l0aCBjb250ZW50IG9mIHRoZSBhcmd1bWVudC4KLSAgICBJZiBhcmd1bWVu
dCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3aWxsIGJlIGNsZWFyZWQuCi0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAg
ICBjb2xvcnMuc2V0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgLy8gWyJibGFjayIsICJ3
aGl0ZSJdCi0gICAgY29sb3JzLnNldE9iamVjdHMoW10pOyAgICAgICAgICAgICAgICAgIC8vIFtd
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNldE9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkFy
cmF5fSBvYmplY3RzIGFycmF5IHdob3NlIGNvbnRlbnQgd2lsbCBiZSB1c2VkIGZvciByZXBsYWNp
bmcKLSAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCi0gICAgQHJldHVybiB7RW1i
ZXIuQXJyYXl9IHJlY2VpdmVyIHdpdGggdGhlIG5ldyBjb250ZW50Ci0gICAqLwotICBzZXRPYmpl
Y3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSBy
ZXR1cm4gdGhpcy5jbGVhcigpOwotCi0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7
Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgotICAvLyBJTVBMRU1FTlQgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAg
Ly8KLQotICByZW1vdmVPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIHZhciBsb2MgPSBnZXQo
dGhpcywgJ2xlbmd0aCcpIHx8IDA7Ci0gICAgd2hpbGUoLS1sb2MgPj0gMCkgewotICAgICAgdmFy
IGN1ck9iamVjdCA9IHRoaXMub2JqZWN0QXQobG9jKSA7Ci0gICAgICBpZiAoY3VyT2JqZWN0ID09
PSBvYmopIHRoaXMucmVtb3ZlQXQobG9jKSA7Ci0gICAgfQotICAgIHJldHVybiB0aGlzIDsKLSAg
fSwKLQotICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIGlmICghdGhpcy5jb250YWlu
cyhvYmopKSB0aGlzLnB1c2hPYmplY3Qob2JqKTsKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0KLQot
fSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBz
dWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g
RW1iZXIuc2V0OwotCi0vKioKLWBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGlu
IHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xhc3MKLXRvIGFkZCBhIGB0cmlnZ2VyQWN0aW9u
YCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mgc2ltaWxhciB0byB0aGUgSGFuZGxlYmFycwotYHt7YWN0
aW9ufX1gIGhlbHBlci4gSW4gbm9ybWFsIEVtYmVyIHVzYWdlLCB0aGUgYHt7YWN0aW9ufX1gIGhl
bHBlciBpcwotdXN1YWxseSB0aGUgYmVzdCBjaG9pY2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRl
biB1c2VmdWwgd2hlbiB5b3UgYXJlCi1kb2luZyBtb3JlIGNvbXBsZXggZXZlbnQgaGFuZGxpbmcg
aW4gVmlldyBvYmplY3RzLgotCi1TZWUgYWxzbyBgRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBv
cnRgLCB3aGljaCBoYXMKLXZpZXctYXdhcmUgZGVmYXVsdHMgZm9yIHRhcmdldCBhbmQgYWN0aW9u
Q29udGV4dC4KLQotQGNsYXNzIFRhcmdldEFjdGlvblN1cHBvcnQKLUBuYW1lc3BhY2UgRW1iZXIK
LUBleHRlbmRzIEVtYmVyLk1peGluCi0qLwotRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IEVt
YmVyLk1peGluLmNyZWF0ZSh7Ci0gIHRhcmdldDogbnVsbCwKLSAgYWN0aW9uOiBudWxsLAotICBh
Y3Rpb25Db250ZXh0OiBudWxsLAotCi0gIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0Jyk7Ci0KLSAgICBp
ZiAoRW1iZXIudHlwZU9mKHRhcmdldCkgPT09ICJzdHJpbmciKSB7Ci0gICAgICB2YXIgdmFsdWUg
PSBnZXQodGhpcywgdGFyZ2V0KTsKLSAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZh
bHVlID0gZ2V0KEVtYmVyLmxvb2t1cCwgdGFyZ2V0KTsgfQotICAgICAgcmV0dXJuIHZhbHVlOwot
ICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLSAgfSkucHJvcGVydHko
J3RhcmdldCcpLAotCi0gIGFjdGlvbkNvbnRleHRPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgIHZhciBhY3Rpb25Db250ZXh0ID0gZ2V0KHRoaXMsICdhY3Rpb25Db250ZXh0
Jyk7Ci0KLSAgICBpZiAoRW1iZXIudHlwZU9mKGFjdGlvbkNvbnRleHQpID09PSAic3RyaW5nIikg
ewotICAgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIGFjdGlvbkNvbnRleHQpOwotICAgICAgaWYg
KHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBnZXQoRW1iZXIubG9va3VwLCBhY3Rpb25D
b250ZXh0KTsgfQotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1
cm4gYWN0aW9uQ29udGV4dDsKLSAgICB9Ci0gIH0pLnByb3BlcnR5KCdhY3Rpb25Db250ZXh0Jyks
Ci0KLSAgLyoqCi0gIFNlbmQgYW4gImFjdGlvbiIgd2l0aCBhbiAiYWN0aW9uQ29udGV4dCIgdG8g
YSAidGFyZ2V0Ii4gVGhlIGFjdGlvbiwgYWN0aW9uQ29udGV4dAotICBhbmQgdGFyZ2V0IHdpbGwg
YmUgcmV0cmlldmVkIGZyb20gcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LiBGb3IgZXhhbXBsZToK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgICB0YXJnZXQ6IEVtYmVyLmNvbXB1
dGVkLmFsaWFzKCdjb250cm9sbGVyJyksCi0gICAgYWN0aW9uOiAnc2F2ZScsCi0gICAgYWN0aW9u
Q29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRleHQnKSwKLSAgICBjbGljazogZnVu
Y3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsgLy8gU2VuZHMgdGhlIGBzYXZl
YCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIKLSAgICB9Ci0gIH0pOwot
ICBgYGAKLQotICBUaGUgYHRhcmdldGAsIGBhY3Rpb25gLCBhbmQgYGFjdGlvbkNvbnRleHRgIGNh
biBiZSBwcm92aWRlZCBhcyBwcm9wZXJ0aWVzIG9mCi0gIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1
bWVudCB0byBgdHJpZ2dlckFjdGlvbmAgYXMgd2VsbC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFw
cC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1
cHBvcnQsIHsKLSAgICBjbGljazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rp
b24oewotICAgICAgICBhY3Rpb246ICdzYXZlJywKLSAgICAgICAgdGFyZ2V0OiB0aGlzLmdldCgn
Y29udHJvbGxlcicpLAotICAgICAgICBhY3Rpb25Db250ZXh0OiB0aGlzLmdldCgnY29udGV4dCcp
LAotICAgICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBj
dXJyZW50IGNvbnRleHQKLSAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0g
ICAgfQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIGBhY3Rpb25Db250ZXh0YCBkZWZhdWx0cyB0byB0
aGUgb2JqZWN0IHlvdSBtaXhpbmcgYFRhcmdldEFjdGlvblN1cHBvcnRgIGludG8uCi0gIEJ1dCBg
dGFyZ2V0YCBhbmQgYGFjdGlvbmAgbXVzdCBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIHByb3BlcnRp
ZXMgb3Igd2l0aCB0aGUgYXJndW1lbnQKLSAgdG8gYHRyaWdnZXJBY3Rpb25gLCBvciBhIGNvbWJp
bmF0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIu
Vmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCwgewotICAgIHRhcmdldDogRW1i
ZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKLSAgICBjbGljazogZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAgICBhY3Rpb246ICdzYXZlJwotICAg
ICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIGEgcmVmZXJlbmNl
IHRvIGB0aGlzYCwKLSAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0gICAg
fQotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCB0cmlnZ2VyQWN0aW9uCi0gIEBwYXJhbSBvcHRz
IHtIYXNofSAob3B0aW9uYWwsIHdpdGggdGhlIG9wdGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQg
YW5kL29yIGFjdGlvbkNvbnRleHQpCi0gIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFj
dGlvbiB3YXMgc2VudCBzdWNjZXNzZnVsbHkgYW5kIGRpZCBub3QgcmV0dXJuIGZhbHNlCi0gICov
Ci0gIHRyaWdnZXJBY3Rpb246IGZ1bmN0aW9uKG9wdHMpIHsKLSAgICBvcHRzID0gb3B0cyB8fCB7
fTsKLSAgICB2YXIgYWN0aW9uID0gb3B0cy5hY3Rpb24gfHwgZ2V0KHRoaXMsICdhY3Rpb24nKSwK
LSAgICAgICAgdGFyZ2V0ID0gb3B0cy50YXJnZXQgfHwgZ2V0KHRoaXMsICd0YXJnZXRPYmplY3Qn
KSwKLSAgICAgICAgYWN0aW9uQ29udGV4dCA9IG9wdHMuYWN0aW9uQ29udGV4dDsKLQotICAgIGZ1
bmN0aW9uIGFyZ3Mob3B0aW9ucywgYWN0aW9uTmFtZSkgewotICAgICAgdmFyIHJldCA9IFtdOwot
ICAgICAgaWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KLQotICAgICAg
cmV0dXJuIHJldC5jb25jYXQob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVvZiBhY3Rp
b25Db250ZXh0ID09PSAndW5kZWZpbmVkJykgewotICAgICAgYWN0aW9uQ29udGV4dCA9IGdldCh0
aGlzLCAnYWN0aW9uQ29udGV4dE9iamVjdCcpIHx8IHRoaXM7Ci0gICAgfQotCi0gICAgaWYgKHRh
cmdldCAmJiBhY3Rpb24pIHsKLSAgICAgIHZhciByZXQ7Ci0KLSAgICAgIGlmICh0YXJnZXQuc2Vu
ZCkgewotICAgICAgICByZXQgPSB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIGFyZ3MoYWN0aW9u
Q29udGV4dCwgYWN0aW9uKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFbWJlci5hc3NlcnQo
IlRoZSBhY3Rpb24gJyIgKyBhY3Rpb24gKyAiJyBkaWQgbm90IGV4aXN0IG9uICIgKyB0YXJnZXQs
IHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICAgIHJldCA9IHRh
cmdldFthY3Rpb25dLmFwcGx5KHRhcmdldCwgYXJncyhhY3Rpb25Db250ZXh0KSk7Ci0gICAgICB9
Ci0KLSAgICAgIGlmIChyZXQgIT09IGZhbHNlKSByZXQgPSB0cnVlOwotCi0gICAgICByZXR1cm4g
cmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19KTsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioKLSAgVGhpcyBtaXhpbiBhbGxvd3MgZm9yIEVt
YmVyIG9iamVjdHMgdG8gc3Vic2NyaWJlIHRvIGFuZCBlbWl0IGV2ZW50cy4KLQotICBgYGBqYXZh
c2NyaXB0Ci0gIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQs
IHsKLSAgICBncmVldDogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyAuLi4KLSAgICAgIHRoaXMudHJp
Z2dlcignZ3JlZXQnKTsKLSAgICB9Ci0gIH0pOwotCi0gIHZhciBwZXJzb24gPSBBcHAuUGVyc29u
LmNyZWF0ZSgpOwotCi0gIHBlcnNvbi5vbignZ3JlZXQnLCBmdW5jdGlvbigpIHsKLSAgICBjb25z
b2xlLmxvZygnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcpOwotICB9KTsKLQotICBwZXJzb24uZ3Jl
ZXQoKTsKLQotICAvLyBvdXRwdXRzOiAnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcKLSAgYGBgCi0K
LSAgWW91IGNhbiBhbHNvIGNoYWluIG11bHRpcGxlIGV2ZW50IHN1YnNjcmlwdGlvbnM6Ci0KLSAg
YGBgamF2YXNjcmlwdAotICBwZXJzb24ub24oJ2dyZWV0JywgZnVuY3Rpb24oKSB7Ci0gICAgY29u
c29sZS5sb2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKLSAgfSkub25lKCdncmVldCcsIGZ1
bmN0aW9uKCkgewotICAgIGNvbnNvbGUubG9nKCdPZmZlciBvbmUtdGltZSBzcGVjaWFsJyk7Ci0g
IH0pLm9mZignZXZlbnQnLCB0aGlzLCBmb3JnZXRUaGlzKTsKLSAgYGBgCi0KLSAgQGNsYXNzIEV2
ZW50ZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICovCi1FbWJlci5FdmVudGVkID0gRW1iZXIuTWl4
aW4uY3JlYXRlKHsKLQotICAvKioKLSAgIFN1YnNjcmliZXMgdG8gYSBuYW1lZCBldmVudCB3aXRo
IGdpdmVuIGZ1bmN0aW9uLgotCi0gICBgYGBqYXZhc2NyaXB0Ci0gICBwZXJzb24ub24oJ2RpZExv
YWQnLCBmdW5jdGlvbigpIHsKLSAgICAgLy8gZmlyZWQgb25jZSB0aGUgcGVyc29uIGhhcyBsb2Fk
ZWQKLSAgIH0pOwotICAgYGBgCi0KLSAgIEFuIG9wdGlvbmFsIHRhcmdldCBjYW4gYmUgcGFzc2Vk
IGluIGFzIHRoZSAybmQgYXJndW1lbnQgdGhhdCB3aWxsCi0gICBiZSBzZXQgYXMgdGhlICJ0aGlz
IiBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3VyCi0gICBm
dW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0cmlnZ2VyaW5nIHRoZSBldmVudC4gV2hlbiB0
aGUgdGFyZ2V0Ci0gICBwYXJhbWV0ZXIgaXMgdXNlZCB0aGUgY2FsbGJhY2sgYmVjb21lcyB0aGUg
dGhpcmQgYXJndW1lbnQuCi0KLSAgIEBtZXRob2Qgb24KLSAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAi
dGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCi0gICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRo
b2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgIEByZXR1cm4gdGhpcwotICAqLwotICBvbjog
ZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0
aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgU3Vic2NyaWJlcyBhIGZ1bmN0aW9uIHRvIGEgbmFtZWQgZXZlbnQgYW5kIHRoZW4g
Y2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uCi0gICAgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGV2
ZW50IGlzIHRyaWdnZXJlZC4gSXQgaXMgZ29vZCB0byB1c2UgYGBvbmVgYCB3aGVuCi0gICAgeW91
IG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgdGltZSBhbiBldmVudCBoYXMgdGFrZW4gcGxhY2Uu
Ci0KLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIG9wdGlvbmFsIDJuZCBhcmd1bWVudCB0aGF0
IHdpbGwgYmVjb21lIHRoZSAidGhpcyIKLSAgICB2YWx1ZSBmb3IgdGhlIGNhbGxiYWNrLiBJZiB0
aGlzIGFyZ3VtZW50IGlzIHBhc3NlZCB0aGVuIHRoZSAzcmQgYXJndW1lbnQKLSAgICBiZWNvbWVz
IHRoZSBmdW5jdGlvbi4KLQotICAgIEBtZXRob2Qgb25lCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50Ci0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRo
ZSAidGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0g
bWV0aG9kIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0g
IG9uZTogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBpZiAoIW1ldGhvZCkg
ewotICAgICAgbWV0aG9kID0gdGFyZ2V0OwotICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICB9Ci0K
LSAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCwgdHJ1ZSk7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVHJpZ2dlcnMgYSBuYW1lZCBl
dmVudCBmb3IgdGhlIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gICAgd2lsbCBi
ZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIHN1YnNjcmli
ZWQgdG8gdGhlCi0gICAgZXZlbnQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uLm9u
KCdkaWRFYXQnLCBmdW5jdGlvbihmb29kKSB7Ci0gICAgICBjb25zb2xlLmxvZygncGVyc29uIGF0
ZSBzb21lICcgKyBmb29kKTsKLSAgICB9KTsKLQotICAgIHBlcnNvbi50cmlnZ2VyKCdkaWRFYXQn
LCAnYnJvY2NvbGknKTsKLQotICAgIC8vIG91dHB1dHM6IHBlcnNvbiBhdGUgc29tZSBicm9jY29s
aQotICAgIGBgYAotICAgIEBtZXRob2QgdHJpZ2dlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlv
bmFsIGFyZ3VtZW50cyB0byBwYXNzIG9uCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKLSAgICB2YXIgYXJncyA9IFtdLCBpLCBsOwotICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVu
dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsK
LSAgICB9Ci0gICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsIG5hbWUsIGFyZ3MpOwotICB9LAotCi0g
IC8qKgotICAgIENhbmNlbHMgc3Vic2NyaXB0aW9uIGZvciBnaXZlbiBuYW1lLCB0YXJnZXQsIGFu
ZCBtZXRob2QuCi0KLSAgICBAbWV0aG9kIG9mZgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRo
ZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdl
dCBvZiB0aGUgc3Vic2NyaXB0aW9uCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBm
dW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0aW9uCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0gIG9m
ZjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5yZW1vdmVMaXN0
ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQ2hlY2tzIHRvIHNlZSBpZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRp
b25zIGZvciBuYW1lZCBldmVudC4KLQotICAgIEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIHtTdHJp
bmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50Ci0gICAgQHJldHVybiB7Qm9vbGVhbn0gZG9l
cyB0aGUgb2JqZWN0IGhhdmUgYSBzdWJzY3JpcHRpb24gZm9yIGV2ZW50Ci0gICAqLwotICBoYXM6
IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIG5h
bWUpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBSU1ZQID0g
cmVxdWlyZU1vZHVsZSgicnN2cCIpOwotCi1SU1ZQLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlv
bihjYWxsYmFjaywgcHJvbWlzZSkgewotICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBw
cm9taXNlLCBjYWxsYmFjaywgcHJvbWlzZSk7Ci19KTsKLQotUlNWUC5Qcm9taXNlLnByb3RvdHlw
ZS5mYWlsID0gZnVuY3Rpb24oY2FsbGJhY2ssIGxhYmVsKXsKLSAgRW1iZXIuZGVwcmVjYXRlKCdS
U1ZQLlByb21pc2UuZmFpbCBoYXMgYmVlbiByZW5hbWVkIGFzIFJTVlAuUHJvbWlzZS5jYXRjaCcp
OwotICByZXR1cm4gdGhpc1snY2F0Y2gnXShjYWxsYmFjaywgbGFiZWwpOwotfTsKLQotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQ7Ci0KLS8qKgotICBAY2xhc3MgRGVmZXJyZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICovCi1FbWJlci5EZWZlcnJlZE1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgLyoqCi0g
ICAgQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgaXMg
cmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCi0KLSAgICBAbWV0aG9kIHRoZW4KLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSByZXNvbHZlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZG9u
ZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBi
ZSBjYWxsZWQgd2hlbiBmYWlsZWQKLSAgKi8KLSAgdGhlbjogZnVuY3Rpb24ocmVzb2x2ZSwgcmVq
ZWN0LCBsYWJlbCkgewotICAgIHZhciBkZWZlcnJlZCwgcHJvbWlzZSwgZW50aXR5OwotCi0gICAg
ZW50aXR5ID0gdGhpczsKLSAgICBkZWZlcnJlZCA9IGdldCh0aGlzLCAnX2RlZmVycmVkJyk7Ci0g
ICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxsbWVu
dEhhbmRsZXIoZnVsZmlsbG1lbnQpIHsKLSAgICAgIGlmIChmdWxmaWxsbWVudCA9PT0gcHJvbWlz
ZSkgewotICAgICAgICByZXR1cm4gcmVzb2x2ZShlbnRpdHkpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgcmV0dXJuIHJlc29sdmUoZnVsZmlsbG1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiBwcm9taXNlLnRoZW4ocmVzb2x2ZSAmJiBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVj
dCwgbGFiZWwpOwotICB9LAotCi0gIC8qKgotICAgIFJlc29sdmUgYSBEZWZlcnJlZCBvYmplY3Qg
YW5kIGNhbGwgYW55IGBkb25lQ2FsbGJhY2tzYCB3aXRoIHRoZSBnaXZlbiBhcmdzLgotCi0gICAg
QG1ldGhvZCByZXNvbHZlCi0gICovCi0gIHJlc29sdmU6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAg
dmFyIGRlZmVycmVkLCBwcm9taXNlOwotCi0gICAgZGVmZXJyZWQgPSBnZXQodGhpcywgJ19kZWZl
cnJlZCcpOwotICAgIHByb21pc2UgPSBkZWZlcnJlZC5wcm9taXNlOwotCi0gICAgaWYgKHZhbHVl
ID09PSB0aGlzKSB7Ci0gICAgICBkZWZlcnJlZC5yZXNvbHZlKHByb21pc2UpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgUmVqZWN0IGEgRGVmZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBgZmFpbENhbGxiYWNr
c2Agd2l0aCB0aGUgZ2l2ZW4gYXJncy4KLQotICAgIEBtZXRob2QgcmVqZWN0Ci0gICovCi0gIHJl
amVjdDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBnZXQodGhpcywgJ19kZWZlcnJlZCcpLnJlamVj
dCh2YWx1ZSk7Ci0gIH0sCi0KLSAgX2RlZmVycmVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gUlNWUC5kZWZlcignRW1iZXI6IERlZmVycmVkTWl4aW4gLSAnICsgdGhp
cyk7Ci0gIH0pCi19KTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHR5cGVPZiA9IEVtYmVyLnR5cGVPZjsKLQotLyoqCi0gIFRoZSBgRW1iZXIuQWN0aW9u
SGFuZGxlcmAgbWl4aW4gaW1wbGVtZW50cyBzdXBwb3J0IGZvciBtb3ZpbmcgYW4gYGFjdGlvbnNg
Ci0gIHByb3BlcnR5IHRvIGFuIGBfYWN0aW9uc2AgcHJvcGVydHkgYXQgZXh0ZW5kIHRpbWUsIGFu
ZCBhZGRpbmcgYF9hY3Rpb25zYAotICB0byB0aGUgb2JqZWN0J3MgbWVyZ2VkUHJvcGVydGllcyBs
aXN0LgotCi0gIGBFbWJlci5BY3Rpb25IYW5kbGVyYCBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1i
ZXIgaW4gIGBFbWJlci5WaWV3YCwKLSAgYEVtYmVyLkNvbnRyb2xsZXJgLCBhbmQgYEVtYmVyLlJv
dXRlYC4KLQotICBAY2xhc3MgQWN0aW9uSGFuZGxlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwot
RW1iZXIuQWN0aW9uSGFuZGxlciA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIG1lcmdlZFByb3Bl
cnRpZXM6IFsnX2FjdGlvbnMnXSwKLQotICAvKioKLSAgICBUaGUgY29sbGVjdGlvbiBvZiBmdW5j
dGlvbnMsIGtleWVkIGJ5IG5hbWUsIGF2YWlsYWJsZSBvbiB0aGlzCi0gICAgYEFjdGlvbkhhbmRs
ZXJgIGFzIGFjdGlvbiB0YXJnZXRzLgotCi0gICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52
b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20g
d2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMg
dGhpcyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVy
IHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24KLSAgICB2aWEgYEFjdGlvbkhhbmRsZXIjc2VuZGAu
Ci0KLSAgICBUaGUgYGFjdGlvbnNgIGhhc2ggd2lsbCBpbmhlcml0IGFjdGlvbiBoYW5kbGVycyBm
cm9tCi0gICAgdGhlIGBhY3Rpb25zYCBoYXNoIGRlZmluZWQgb24gZXh0ZW5kZWQgcGFyZW50IGNs
YXNzZXMKLSAgICBvciBtaXhpbnMgcmF0aGVyIHRoYW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUg
aGFzaCwgZS5nLjoKLQotICAgIGBgYGpzCi0gICAgQXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJl
ci5NaXhpbi5jcmVhdGUoewotICAgICAgYWN0aW9uczogewotICAgICAgICBkaXNwbGF5QmFubmVy
OiBmdW5jdGlvbihtc2cpIHsKLSAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgfQot
ICAgIH0pOwotCi0gICAgQXBwLldlbGNvbWVSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZChBcHAu
Q2FuRGlzcGxheUJhbm5lciwgewotICAgICAgYWN0aW9uczogewotICAgICAgICBwbGF5TXVzaWM6
IGZ1bmN0aW9uKCkgewotICAgICAgICAgIC8vIC4uLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0KLSAgICAvLyBgV2VsY29tZVJvdXRlYCwgd2hlbiBhY3RpdmUsIHdpbGwgYmUgYWJsZSB0
byByZXNwb25kCi0gICAgLy8gdG8gYm90aCBhY3Rpb25zLCBzaW5jZSB0aGUgYWN0aW9ucyBoYXNo
IGlzIG1lcmdlZCByYXRoZXIKLSAgICAvLyB0aGVuIHJlcGxhY2VkIHdoZW4gZXh0ZW5kaW5nIG1p
eGlucyAvIHBhcmVudCBjbGFzc2VzLgotICAgIHRoaXMuc2VuZCgnZGlzcGxheUJhbm5lcicpOwot
ICAgIHRoaXMuc2VuZCgncGxheU11c2ljJyk7Ci0gICAgYGBgCi0KLSAgICBXaXRoaW4gYSBDb250
cm9sbGVyLCBSb3V0ZSwgVmlldyBvciBDb21wb25lbnQncyBhY3Rpb24gaGFuZGxlciwKLSAgICB0
aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0IGlzIHRoZSBDb250cm9sbGVyLCBSb3V0ZSwg
VmlldyBvcgotICAgIENvbXBvbmVudCBvYmplY3Q6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Tb25n
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBt
eUFjdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCJzb25n
Iik7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oIm90aGVyLnJvdXRlIik7Ci0gICAgICAg
ICAgLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEl0IGlz
IGFsc28gcG9zc2libGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KLSAg
ICBhY3Rpb24gaGFuZGxlciBpZiBpdCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBw
YXJlbnQKLSAgICBjbGFzcyBvciBtaXhpbjoKLQotICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZv
bGxvd2luZyByb3V0ZXM6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5EZWJ1Z1JvdXRlID0gRW1iZXIu
TWl4aW4uY3JlYXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9y
bWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICBjb25zb2xlLmRlYnVnKCJ0cm9sb2xvIik7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91
dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVnUm91dGUsIHsKLSAgICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAu
RGVidWdSb3V0ZQotICAgICAgICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICAgICAgICAvLyBzaG93
IGFkZGl0aW9uYWwgYW5ub3lhbmNlCi0gICAgICAgICAgd2luZG93LmFsZXJ0KC4uLik7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgICMjIEJ1YmJsaW5nCi0KLSAg
ICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVy
IGRlZmluZWQKLSAgICBvbiB0aGUgYGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8gY29udGlu
dWUgYnViYmxpbmcgdGhlIGFjdGlvbiwKLSAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVgIGZyb20g
dGhlIGhhbmRsZXI6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkg
ewotICAgICAgdGhpcy5yZXNvdXJjZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhp
cy5yb3V0ZSgic29uZyIpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuQWxidW1Sb3V0
ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0
UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAg
IEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25z
OiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgLy8gLi4u
Ci0KLSAgICAgICAgICBpZiAoYWN0aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRSb3V0
ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgYWN0aW9ucwotICAgIEB0
eXBlIEhhc2gKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0KLSAgLyoqCi0gICAgTW92ZXMgYGFj
dGlvbnNgIHRvIGBfYWN0aW9uc2AgYXQgZXh0ZW5kIHRpbWUuIE5vdGUgdGhhdCB0aGlzIGN1cnJl
bnRseQotICAgIG1vZGlmaWVzIHRoZSBtaXhpbiB0aGVtc2VsdmVzLCB3aGljaCBpcyB0ZWNobmlj
YWxseSBkdWJpb3VzIGJ1dAotICAgIGlzIHByYWN0aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5j
ZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgd2lsbE1lcmdlTWl4aW4KLSAgKi8KLSAgd2lsbE1lcmdlTWl4aW46IGZ1bmN0aW9uKHBy
b3BzKSB7Ci0gICAgdmFyIGhhc2hOYW1lOwotCi0gICAgaWYgKCFwcm9wcy5fYWN0aW9ucykgewot
ICAgICAgaWYgKHR5cGVPZihwcm9wcy5hY3Rpb25zKSA9PT0gJ29iamVjdCcpIHsKLSAgICAgICAg
aGFzaE5hbWUgPSAnYWN0aW9ucyc7Ci0gICAgICB9IGVsc2UgaWYgKHR5cGVPZihwcm9wcy5ldmVu
dHMpID09PSAnb2JqZWN0JykgewotICAgICAgICBFbWJlci5kZXByZWNhdGUoJ0FjdGlvbiBoYW5k
bGVycyBjb250YWluZWQgaW4gYW4gYGV2ZW50c2Agb2JqZWN0IGFyZSBkZXByZWNhdGVkIGluIGZh
dm9yIG9mIHB1dHRpbmcgdGhlbSBpbiBhbiBgYWN0aW9uc2Agb2JqZWN0JywgZmFsc2UpOwotICAg
ICAgICBoYXNoTmFtZSA9ICdldmVudHMnOwotICAgICAgfQotCi0gICAgICBpZiAoaGFzaE5hbWUp
IHsKLSAgICAgICAgcHJvcHMuX2FjdGlvbnMgPSBFbWJlci5tZXJnZShwcm9wcy5fYWN0aW9ucyB8
fCB7fSwgcHJvcHNbaGFzaE5hbWVdKTsKLSAgICAgIH0KLQotICAgICAgZGVsZXRlIHByb3BzW2hh
c2hOYW1lXTsKLSAgICB9Ci0gIH0sCi0KLSAgc2VuZDogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewot
ICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCB0YXJnZXQ7Ci0KLSAg
ICBpZiAodGhpcy5fYWN0aW9ucyAmJiB0aGlzLl9hY3Rpb25zW2FjdGlvbk5hbWVdKSB7Ci0gICAg
ICBpZiAodGhpcy5fYWN0aW9uc1thY3Rpb25OYW1lXS5hcHBseSh0aGlzLCBhcmdzKSA9PT0gdHJ1
ZSkgewotICAgICAgICAvLyBoYW5kbGVyIHJldHVybmVkIHRydWUsIHNvIHRoaXMgYWN0aW9uIHdp
bGwgYnViYmxlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAg
fSBlbHNlIGlmICh0aGlzLmRlcHJlY2F0ZWRTZW5kICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5k
bGVzICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5kbGVzKGFjdGlvbk5hbWUpKSB7Ci0gICAgICBp
ZiAodGhpcy5kZXByZWNhdGVkU2VuZC5hcHBseSh0aGlzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50
cykpID09PSB0cnVlKSB7Ci0gICAgICAgIC8vIGhhbmRsZXIgcmV0dXJuIHRydWUsIHNvIHRoaXMg
YWN0aW9uIHdpbGwgYnViYmxlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JykpIHsKLSAg
ICAgIEVtYmVyLmFzc2VydCgiVGhlIGB0YXJnZXRgIGZvciAiICsgdGhpcyArICIgKCIgKyB0YXJn
ZXQgKyAiKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRgIG1ldGhvZCIsIHR5cGVvZiB0YXJnZXQuc2Vu
ZCA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIGFyZ3Vt
ZW50cyk7Ci0gICAgfQotICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHJlc29sdmUgPSBFbWJl
ci5SU1ZQLnJlc29sdmUsCi0gICAgcmV0aHJvdyA9IEVtYmVyLlJTVlAucmV0aHJvdywKLSAgICBu
b3QgPSBFbWJlci5jb21wdXRlZC5ub3QsCi0gICAgb3IgPSBFbWJlci5jb21wdXRlZC5vcjsKLQot
LyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0gKi8KLQot
ZnVuY3Rpb24gb2JzZXJ2ZVByb21pc2UocHJveHksIHByb21pc2UpIHsKLSAgcHJvbWlzZS50aGVu
KGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgc2V0KHByb3h5LCAnaXNGdWxmaWxsZWQnLCB0cnVlKTsK
LSAgICBzZXQocHJveHksICdjb250ZW50JywgdmFsdWUpOwotICB9LCBmdW5jdGlvbihyZWFzb24p
IHsKLSAgICBzZXQocHJveHksICdpc1JlamVjdGVkJywgdHJ1ZSk7Ci0gICAgc2V0KHByb3h5LCAn
cmVhc29uJywgcmVhc29uKTsKLSAgICAvLyBkb24ndCByZS10aHJvdywgYXMgd2UgYXJlIG1lcmVs
eSBvYnNlcnZpbmcKLSAgfSwgIkVtYmVyOiBQcm9taXNlUHJveHkiKTsKLX0KLQotLyoqCi0gIEEg
bG93IGxldmVsIG1peGluIG1ha2luZyBPYmplY3RQcm94eSwgT2JqZWN0Q29udHJvbGxlciBvciBB
cnJheUNvbnRyb2xsZXIncyBwcm9taXNlIGF3YXJlLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IE9iamVjdFByb21pc2VDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQo
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4pOwotCi0gIHZhciBjb250cm9sbGVyID0gT2JqZWN0UHJv
bWlzZUNvbnRyb2xsZXIuY3JlYXRlKHsKLSAgICBwcm9taXNlOiAkLmdldEpTT04oJy9zb21lL3Jl
bW90ZS9kYXRhLmpzb24nKQotICB9KTsKLQotICBjb250cm9sbGVyLnRoZW4oZnVuY3Rpb24oanNv
bil7Ci0gICAgIC8vIHRoZSBqc29uCi0gIH0sIGZ1bmN0aW9uKHJlYXNvbikgewotICAgICAvLyB0
aGUgcmVhc29uIHdoeSB5b3UgaGF2ZSBubyBqc29uCi0gIH0pOwotICBgYGAKLQotICB0aGUgY29u
dHJvbGxlciBoYXMgYmluZGFibGUgYXR0cmlidXRlcyB3aGljaAotICB0cmFjayB0aGUgcHJvbWlz
ZXMgbGlmZSBjeWNsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgY29udHJvbGxlci5nZXQoJ2lzUGVu
ZGluZycpICAgLy89PiB0cnVlCi0gIGNvbnRyb2xsZXIuZ2V0KCdpc1NldHRsZWQnKSAgLy89PiBm
YWxzZQotICBjb250cm9sbGVyLmdldCgnaXNSZWplY3RlZCcpICAvLz0+IGZhbHNlCi0gIGNvbnRy
b2xsZXIuZ2V0KCdpc0Z1bGZpbGxlZCcpIC8vPT4gZmFsc2UKLSAgYGBgCi0KLSAgV2hlbiB0aGUg
dGhlICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKLSAg
d2l0aCBqc29uLCB0aGUgbGlmZSBjeWNsZSBhdHRyaWJ1dGVzIHdpbGwgdXBkYXRlIGFjY29yZGlu
Z2x5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgY29udHJvbGxlci5nZXQoJ2lzUGVuZGluZycpICAg
Ly89PiBmYWxzZQotICBjb250cm9sbGVyLmdldCgnaXNTZXR0bGVkJykgICAvLz0+IHRydWUKLSAg
Y29udHJvbGxlci5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQotICBjb250cm9sbGVyLmdl
dCgnaXNGdWxmaWxsZWQnKSAvLz0+IHRydWUKLSAgYGBgCi0KLSAgQXMgdGhlIGNvbnRyb2xsZXIg
aXMgYW4gT2JqZWN0Q29udHJvbGxlciwgYW5kIHRoZSBqc29uIG5vdyBpdHMgY29udGVudCwKLSAg
YWxsIHRoZSBqc29uIHByb3BlcnRpZXMgd2lsbCBiZSBhdmFpbGFibGUgZGlyZWN0bHkgZnJvbSB0
aGUgY29udHJvbGxlci4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEFzc3VtaW5nIHRoZSBmb2xs
b3dpbmcganNvbjoKLSAgewotICAgIGZpcnN0TmFtZTogJ1N0ZWZhbicsCi0gICAgbGFzdE5hbWU6
ICdQZW5uZXInCi0gIH0KLQotICAvLyBib3RoIHByb3BlcnRpZXMgd2lsbCBhY2Nlc3NpYmxlIG9u
IHRoZSBjb250cm9sbGVyCi0gIGNvbnRyb2xsZXIuZ2V0KCdmaXJzdE5hbWUnKSAvLz0+ICdTdGVm
YW4nCi0gIGNvbnRyb2xsZXIuZ2V0KCdsYXN0TmFtZScpICAvLz0+ICdQZW5uZXInCi0gIGBgYAot
Ci0gIElmIHRoZSBjb250cm9sbGVyIGlzIGJhY2tpbmcgYSB0ZW1wbGF0ZSwgdGhlIGF0dHJpYnV0
ZXMgYXJlCi0gIGJpbmRhYmxlIGZyb20gd2l0aGluIHRoYXQgdGVtcGxhdGUKLQotICBgYGBoYW5k
bGViYXJzCi0gIHt7I2lmIGlzUGVuZGluZ319Ci0gICAgbG9hZGluZy4uLgotICB7e2Vsc2V9fQot
ICAgIGZpcnN0TmFtZToge3tmaXJzdE5hbWV9fQotICAgIGxhc3ROYW1lOiB7e2xhc3ROYW1lfX0K
LSAge3svaWZ9fQotICBgYGAKLSAgQGNsYXNzIEVtYmVyLlByb21pc2VQcm94eU1peGluCi0qLwot
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAvKioKLSAg
ICBJZiB0aGUgcHJveGllZCBwcm9taXNlIGlzIHJlamVjdGVkIHRoaXMgd2lsbCBjb250YWluIHRo
ZSByZWFzb24KLSAgICBwcm92aWRlZC4KLQotICAgIEBwcm9wZXJ0eSByZWFzb24KLSAgICBAZGVm
YXVsdCBudWxsCi0gICovCi0gIHJlYXNvbjogICAgbnVsbCwKLQotICAvKioKLSAgICBPbmNlIHRo
ZSBwcm94aWVkIHByb21pc2UgaGFzIHNldHRsZWQgdGhpcyB3aWxsIGJlY29tZSBgZmFsc2VgLgot
Ci0gICAgQHByb3BlcnR5IGlzUGVuZGluZwotICAgIEBkZWZhdWx0IHRydWUKLSAgKi8KLSAgaXNQ
ZW5kaW5nOiAgbm90KCdpc1NldHRsZWQnKS5yZWFkT25seSgpLAotCi0gIC8qKgotICAgIE9uY2Ug
dGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxlZCB0aGlzIHdpbGwgYmVjb21lIGB0cnVlYC4K
LQotICAgIEBwcm9wZXJ0eSBpc1NldHRsZWQKLSAgICBAZGVmYXVsdCBmYWxzZQotICAqLwotICBp
c1NldHRsZWQ6ICBvcignaXNSZWplY3RlZCcsICdpc0Z1bGZpbGxlZCcpLnJlYWRPbmx5KCksCi0K
LSAgLyoqCi0gICAgV2lsbCBiZWNvbWUgYHRydWVgIGlmIHRoZSBwcm94aWVkIHByb21pc2UgaXMg
cmVqZWN0ZWQuCi0KLSAgICBAcHJvcGVydHkgaXNSZWplY3RlZAotICAgIEBkZWZhdWx0IGZhbHNl
Ci0gICovCi0gIGlzUmVqZWN0ZWQ6ICBmYWxzZSwKLQotICAvKioKLSAgICBXaWxsIGJlY29tZSBg
dHJ1ZWAgaWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyBmdWxmaWxsZWQuCi0KLSAgICBAcHJvcGVy
dHkgaXNGdWxsZmlsbGVkCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgaXNGdWxmaWxsZWQ6
IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBwcm9taXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVl
IGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmplY3QuCi0KLSAgICBUaGlzIHByb3BlcnR5IG11
c3QgYmUgc3BlY2lmaWVkIHVwb24gY3JlYXRpb24sIGFuZCBzaG91bGQgbm90IGJlCi0gICAgY2hh
bmdlZCBvbmNlIGNyZWF0ZWQuCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKEVtYmVyLlByb21pc2VQcm94eU1peGlu
KS5jcmVhdGUoewotICAgICAgcHJvbWlzZTogPHRoZW5hYmxlPgotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQHByb3BlcnR5IHByb21pc2UKLSAgKi8KLSAgcHJvbWlzZTogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5LCBwcm9taXNlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIp
IHsKLSAgICAgIHByb21pc2UgPSByZXNvbHZlKHByb21pc2UpOwotICAgICAgb2JzZXJ2ZVByb21p
c2UodGhpcywgcHJvbWlzZSk7Ci0gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCk7IC8vIGZvcmsg
dGhlIHByb21pc2UuCi0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigi
UHJvbWlzZVByb3h5J3MgcHJvbWlzZSBtdXN0IGJlIHNldCIpOwotICAgIH0KLSAgfSksCi0KLSAg
LyoqCi0gICAgQW4gYWxpYXMgdG8gdGhlIHByb3hpZWQgcHJvbWlzZSdzIGB0aGVuYC4KLQotICAg
IFNlZSBSU1ZQLlByb21pc2UudGhlbi4KLQotICAgIEBtZXRob2QgdGhlbgotICAgIEBwYXJhbSB7
RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQotICAqLwotICB0
aGVuOiBwcm9taXNlQWxpYXMoJ3RoZW4nKSwKLQotICAvKioKLSAgICBBbiBhbGlhcyB0byB0aGUg
cHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KLQotICAgIFNlZSBSU1ZQLlByb21pc2UuY2F0Y2gu
Ci0KLSAgICBAbWV0aG9kIGNhdGNoCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAg
ICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Ci0gICovCi0gICdjYXRjaCc6IHByb21pc2VBbGlhcygn
Y2F0Y2gnKSwKLQotICAvKioKLSAgICBBbiBhbGlhcyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3Mg
YGZpbmFsbHlgLgotCi0gICAgU2VlIFJTVlAuUHJvbWlzZS5maW5hbGx5LgotCi0gICAgQG1ldGhv
ZCBmaW5hbGx5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcmV0dXJuIHtS
U1ZQLlByb21pc2V9Ci0gICovCi0gICdmaW5hbGx5JzogcHJvbWlzZUFsaWFzKCdmaW5hbGx5JykK
LQotfSk7Ci0KLWZ1bmN0aW9uIHByb21pc2VBbGlhcyhuYW1lKSB7Ci0gIHJldHVybiBmdW5jdGlv
biAoKSB7Ci0gICAgdmFyIHByb21pc2UgPSBnZXQodGhpcywgJ3Byb21pc2UnKTsKLSAgICByZXR1
cm4gcHJvbWlzZVtuYW1lXS5hcHBseShwcm9taXNlLCBhcmd1bWVudHMpOwotICB9OwotfQotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2gsCi0gICAgUkVUQUlOID0gJ3InLAotICAgIElOU0VSVCA9ICdpJywKLSAgICBERUxF
VEUgPSAnZCc7Ci0KLS8qKgotICBBbiBgRW1iZXIuVHJhY2tlZEFycmF5YCB0cmFja3MgYXJyYXkg
b3BlcmF0aW9ucy4gIEl0J3MgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8KLSAgbGF6aWx5IGNvbXB1
dGUgdGhlIGluZGV4ZXMgb2YgaXRlbXMgaW4gYW4gYXJyYXkgYWZ0ZXIgdGhleSd2ZSBiZWVuIHNo
aWZ0ZWQgYnkKLSAgc3Vic2VxdWVudCBvcGVyYXRpb25zLgotCi0gIEBjbGFzcyBUcmFja2VkQXJy
YXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAcGFyYW0ge2FycmF5fSBbaXRlbXM9W11dIFRoZSBh
cnJheSB0byBiZSB0cmFja2VkLiAgVGhpcyBpcyB1c2VkIGp1c3QgdG8gZ2V0Ci0gIHRoZSBpbml0
aWFsIGl0ZW1zIGZvciB0aGUgc3RhcnRpbmcgc3RhdGUgb2YgcmV0YWluOm4uCi0qLwotRW1iZXIu
VHJhY2tlZEFycmF5ID0gZnVuY3Rpb24gKGl0ZW1zKSB7Ci0gIGlmIChhcmd1bWVudHMubGVuZ3Ro
IDwgMSkgeyBpdGVtcyA9IFtdOyB9Ci0KLSAgdmFyIGxlbmd0aCA9IGdldChpdGVtcywgJ2xlbmd0
aCcpOwotCi0gIGlmIChsZW5ndGgpIHsKLSAgICB0aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJh
eU9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCwgaXRlbXMpXTsKLSAgfSBlbHNlIHsKLSAgICB0aGlz
Ll9vcGVyYXRpb25zID0gW107Ci0gIH0KLX07Ci0KLUVtYmVyLlRyYWNrZWRBcnJheS5SRVRBSU4g
PSBSRVRBSU47Ci1FbWJlci5UcmFja2VkQXJyYXkuSU5TRVJUID0gSU5TRVJUOwotRW1iZXIuVHJh
Y2tlZEFycmF5LkRFTEVURSA9IERFTEVURTsKLQotRW1iZXIuVHJhY2tlZEFycmF5LnByb3RvdHlw
ZSA9IHsKLQotICAvKioKLSAgICBUcmFjayB0aGF0IGBuZXdJdGVtc2Agd2VyZSBhZGRlZCB0byB0
aGUgdHJhY2tlZCBhcnJheSBhdCBgaW5kZXhgLgotCi0gICAgQG1ldGhvZCBhZGRJdGVtcwotICAg
IEBwYXJhbSBpbmRleAotICAgIEBwYXJhbSBuZXdJdGVtcwotICAqLwotICBhZGRJdGVtczogZnVu
Y3Rpb24gKGluZGV4LCBuZXdJdGVtcykgewotICAgIHZhciBjb3VudCA9IGdldChuZXdJdGVtcywg
J2xlbmd0aCcpOwotICAgIGlmIChjb3VudCA8IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0
Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRpb24oaW5kZXgpLAotICAgICAgICBhcnJheU9wZXJh
dGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAgICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1h
dGNoLmluZGV4LAotICAgICAgICBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5n
ZVN0YXJ0LAotICAgICAgICBjb21wb3NlSW5kZXgsCi0gICAgICAgIHNwbGl0SW5kZXgsCi0gICAg
ICAgIHNwbGl0SXRlbXMsCi0gICAgICAgIHNwbGl0QXJyYXlPcGVyYXRpb24sCi0gICAgICAgIG5l
d0FycmF5T3BlcmF0aW9uOwotCi0gICAgbmV3QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVy
YXRpb24oSU5TRVJULCBjb3VudCwgbmV3SXRlbXMpOwotCi0gICAgaWYgKGFycmF5T3BlcmF0aW9u
KSB7Ci0gICAgICBpZiAoIW1hdGNoLnNwbGl0KSB7Ci0gICAgICAgIC8vIGluc2VydCBsZWZ0IG9m
IGFycmF5T3BlcmF0aW9uCi0gICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3Bl
cmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0aW9uKTsKLSAgICAgICAgY29tcG9zZUluZGV4
ID0gYXJyYXlPcGVyYXRpb25JbmRleDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuX3Nw
bGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0
LCBuZXdBcnJheU9wZXJhdGlvbik7Ci0gICAgICAgIGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0
aW9uSW5kZXggKyAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpbnNlcnQgYXQg
ZW5kCi0gICAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2gobmV3QXJyYXlPcGVyYXRpb24pOwotICAg
ICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVyYXRpb25JbmRleDsKLSAgICB9Ci0KLSAgICB0aGlz
Ll9jb21wb3NlSW5zZXJ0KGNvbXBvc2VJbmRleCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVHJhY2sg
dGhhdCBgY291bnRgIGl0ZW1zIHdlcmUgcmVtb3ZlZCBhdCBgaW5kZXhgLgotCi0gICAgQG1ldGhv
ZCByZW1vdmVJdGVtcwotICAgIEBwYXJhbSBpbmRleAotICAgIEBwYXJhbSBjb3VudAotICAqLwot
ICByZW1vdmVJdGVtczogZnVuY3Rpb24gKGluZGV4LCBjb3VudCkgewotICAgIGlmIChjb3VudCA8
IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRp
b24oaW5kZXgpLAotICAgICAgICBhcnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAg
ICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1hdGNoLmluZGV4LAotICAgICAgICBhcnJheU9w
ZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5nZVN0YXJ0LAotICAgICAgICBuZXdBcnJheU9w
ZXJhdGlvbiwKLSAgICAgICAgY29tcG9zZUluZGV4OwotCi0gICAgbmV3QXJyYXlPcGVyYXRpb24g
PSBuZXcgQXJyYXlPcGVyYXRpb24oREVMRVRFLCBjb3VudCk7Ci0gICAgaWYgKCFtYXRjaC5zcGxp
dCkgewotICAgICAgLy8gaW5zZXJ0IGxlZnQgb2YgYXJyYXlPcGVyYXRpb24KLSAgICAgIHRoaXMu
X29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0
aW9uKTsKLSAgICAgIGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXg7Ci0gICAgfSBl
bHNlIHsKLSAgICAgIHRoaXMuX3NwbGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJy
YXlPcGVyYXRpb25SYW5nZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7Ci0gICAgICBjb21wb3Nl
SW5kZXggPSBhcnJheU9wZXJhdGlvbkluZGV4ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhp
cy5fY29tcG9zZURlbGV0ZShjb21wb3NlSW5kZXgpOwotICB9LAotCi0gIC8qKgotICAgIEFwcGx5
IGFsbCBvcGVyYXRpb25zLCByZWR1Y2luZyB0aGVtIHRvIHJldGFpbjpuLCBmb3IgYG5gLCB0aGUg
bnVtYmVyIG9mCi0gICAgaXRlbXMgaW4gdGhlIGFycmF5LgotCi0gICAgYGNhbGxiYWNrYCB3aWxs
IGJlIGNhbGxlZCBmb3IgZWFjaCBvcGVyYXRpb24gYW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBmb2xs
b3dpbmcgYXJndW1lbnRzOgotCi0gICAgKiB7YXJyYXl9IGl0ZW1zIFRoZSBpdGVtcyBmb3IgdGhl
IGdpdmVuIG9wZXJhdGlvbgotICAgICoge251bWJlcn0gb2Zmc2V0IFRoZSBjb21wdXRlZCBvZmZz
ZXQgb2YgdGhlIGl0ZW1zLCBpZSB0aGUgaW5kZXggaW4gdGhlCi0gICAgYXJyYXkgb2YgdGhlIGZp
cnN0IGl0ZW0gZm9yIHRoaXMgb3BlcmF0aW9uLgotICAgICoge3N0cmluZ30gb3BlcmF0aW9uIFRo
ZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUgb2YKLSAgICBgRW1iZXIuVHJhY2tlZEFycmF5
LntSRVRBSU4sIERFTEVURSwgSU5TRVJUfWAKLQotICAgIEBtZXRob2QgYXBwbHkKLSAgICBAcGFy
YW0ge2Z1bmN0aW9ufSBjYWxsYmFjawotICAqLwotICBhcHBseTogZnVuY3Rpb24gKGNhbGxiYWNr
KSB7Ci0gICAgdmFyIGl0ZW1zID0gW10sCi0gICAgICAgIG9mZnNldCA9IDA7Ci0KLSAgICBmb3JF
YWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0aW9uIChhcnJheU9wZXJhdGlvbikgewotICAgICAg
Y2FsbGJhY2soYXJyYXlPcGVyYXRpb24uaXRlbXMsIG9mZnNldCwgYXJyYXlPcGVyYXRpb24udHlw
ZSk7Ci0KLSAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50eXBlICE9PSBERUxFVEUpIHsKLSAgICAg
ICAgb2Zmc2V0ICs9IGFycmF5T3BlcmF0aW9uLmNvdW50OwotICAgICAgICBpdGVtcyA9IGl0ZW1z
LmNvbmNhdChhcnJheU9wZXJhdGlvbi5pdGVtcyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0
aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJheU9wZXJhdGlvbihSRVRBSU4sIGl0ZW1zLmxlbmd0
aCwgaXRlbXMpXTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm4gYW4gYEFycmF5T3BlcmF0aW9u
TWF0Y2hgIGZvciB0aGUgb3BlcmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIGl0ZW0gYXQgYGluZGV4
YC4KLQotICAgIEBtZXRob2QgX2ZpbmRBcnJheU9wZXJhdGlvbgotCi0gICAgQHBhcmFtIHtudW1i
ZXJ9IGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aG9zZSBvcGVyYXRpb24gaW5mb3JtYXRp
b24KLSAgICBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2ZpbmRB
cnJheU9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4KSB7Ci0gICAgdmFyIGFycmF5T3BlcmF0aW9u
SW5kZXgsCi0gICAgICAgIGxlbiwKLSAgICAgICAgc3BsaXQgPSBmYWxzZSwKLSAgICAgICAgYXJy
YXlPcGVyYXRpb24sCi0gICAgICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCwKLSAgICAgICAg
YXJyYXlPcGVyYXRpb25SYW5nZUVuZDsKLQotICAgIC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzZWFy
Y2ggdGhlc2UgZmFzdGVyIGlmIHdlIGtlcHQgYSBiYWxhbmNlZCB0cmVlLgotICAgIC8vIGZpbmQg
bGVmdG1vc3QgYXJyYXlPcGVyYXRpb24gdG8gdGhlIHJpZ2h0IG9mIGBpbmRleGAKLSAgICBmb3Ig
KGFycmF5T3BlcmF0aW9uSW5kZXggPSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSAwLCBsZW4g
PSB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgYXJyYXlPcGVyYXRpb25JbmRleCA8IGxlbjsgKyth
cnJheU9wZXJhdGlvbkluZGV4KSB7Ci0gICAgICBhcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJh
dGlvbnNbYXJyYXlPcGVyYXRpb25JbmRleF07Ci0KLSAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50
eXBlID09PSBERUxFVEUpIHsgY29udGludWU7IH0KLQotICAgICAgYXJyYXlPcGVyYXRpb25SYW5n
ZUVuZCA9IGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCArIGFycmF5T3BlcmF0aW9uLmNvdW50IC0g
MTsKLQotICAgICAgaWYgKGluZGV4ID09PSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQpIHsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKGluZGV4ID4gYXJyYXlPcGVyYXRpb25SYW5n
ZVN0YXJ0ICYmIGluZGV4IDw9IGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQpIHsKLSAgICAgICAgc3Bs
aXQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFycmF5
T3BlcmF0aW9uUmFuZ2VTdGFydCA9IGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQgKyAxOwotICAgICAg
fQotICAgIH0KLQotICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYXRpb25NYXRjaChhcnJheU9wZXJh
dGlvbiwgYXJyYXlPcGVyYXRpb25JbmRleCwgc3BsaXQsIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFy
dCk7Ci0gIH0sCi0KLSAgX3NwbGl0OiBmdW5jdGlvbiAoYXJyYXlPcGVyYXRpb25JbmRleCwgc3Bs
aXRJbmRleCwgbmV3QXJyYXlPcGVyYXRpb24pIHsKLSAgICB2YXIgYXJyYXlPcGVyYXRpb24gPSB0
aGlzLl9vcGVyYXRpb25zW2FycmF5T3BlcmF0aW9uSW5kZXhdLAotICAgICAgICBzcGxpdEl0ZW1z
ID0gYXJyYXlPcGVyYXRpb24uaXRlbXMuc2xpY2Uoc3BsaXRJbmRleCksCi0gICAgICAgIHNwbGl0
QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24oYXJyYXlPcGVyYXRpb24udHlwZSwg
c3BsaXRJdGVtcy5sZW5ndGgsIHNwbGl0SXRlbXMpOwotCi0gICAgLy8gdHJ1bmNhdGUgTEhTCi0g
ICAgYXJyYXlPcGVyYXRpb24uY291bnQgPSBzcGxpdEluZGV4OwotICAgIGFycmF5T3BlcmF0aW9u
Lml0ZW1zID0gYXJyYXlPcGVyYXRpb24uaXRlbXMuc2xpY2UoMCwgc3BsaXRJbmRleCk7Ci0KLSAg
ICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShhcnJheU9wZXJhdGlvbkluZGV4ICsgMSwgMCwgbmV3
QXJyYXlPcGVyYXRpb24sIHNwbGl0QXJyYXlPcGVyYXRpb24pOwotICB9LAotCi0gIC8vIHNlZSBT
dWJBcnJheSBmb3IgYSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uCi0gIF9jb21wb3NlSW5zZXJ0OiBm
dW5jdGlvbiAoaW5kZXgpIHsKLSAgICB2YXIgbmV3QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVy
YXRpb25zW2luZGV4XSwKLSAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0
aW9uc1tpbmRleC0xXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAotICAgICAgICByaWdodEFycmF5T3Bl
cmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleCsxXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAot
ICAgICAgICBsZWZ0T3AgPSBsZWZ0QXJyYXlPcGVyYXRpb24gJiYgbGVmdEFycmF5T3BlcmF0aW9u
LnR5cGUsCi0gICAgICAgIHJpZ2h0T3AgPSByaWdodEFycmF5T3BlcmF0aW9uICYmIHJpZ2h0QXJy
YXlPcGVyYXRpb24udHlwZTsKLQotICAgIGlmIChsZWZ0T3AgPT09IElOU0VSVCkgewotICAgICAg
ICAvLyBtZXJnZSBsZWZ0Ci0gICAgICAgIGxlZnRBcnJheU9wZXJhdGlvbi5jb3VudCArPSBuZXdB
cnJheU9wZXJhdGlvbi5jb3VudDsKLSAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zID0g
bGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zLmNvbmNhdChuZXdBcnJheU9wZXJhdGlvbi5pdGVtcyk7
Ci0KLSAgICAgIGlmIChyaWdodE9wID09PSBJTlNFUlQpIHsKLSAgICAgICAgLy8gYWxzbyBtZXJn
ZSByaWdodCAod2UgaGF2ZSBzcGxpdCBhbiBpbnNlcnQgd2l0aCBhbiBpbnNlcnQpCi0gICAgICAg
IGxlZnRBcnJheU9wZXJhdGlvbi5jb3VudCArPSByaWdodEFycmF5T3BlcmF0aW9uLmNvdW50Owot
ICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24uaXRlbXMgPSBsZWZ0QXJyYXlPcGVyYXRpb24uaXRl
bXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRpb24uaXRlbXMpOwotICAgICAgICB0aGlzLl9vcGVy
YXRpb25zLnNwbGljZShpbmRleCwgMik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBvbmx5
IG1lcmdlIGxlZnQKLSAgICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwot
ICAgICAgfQotICAgIH0gZWxzZSBpZiAocmlnaHRPcCA9PT0gSU5TRVJUKSB7Ci0gICAgICAvLyBt
ZXJnZSByaWdodAotICAgICAgbmV3QXJyYXlPcGVyYXRpb24uY291bnQgKz0gcmlnaHRBcnJheU9w
ZXJhdGlvbi5jb3VudDsKLSAgICAgIG5ld0FycmF5T3BlcmF0aW9uLml0ZW1zID0gbmV3QXJyYXlP
cGVyYXRpb24uaXRlbXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRpb24uaXRlbXMpOwotICAgICAg
dGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXggKyAxLCAxKTsKLSAgICB9Ci0gIH0sCi0KLSAg
X2NvbXBvc2VEZWxldGU6IGZ1bmN0aW9uIChpbmRleCkgewotICAgIHZhciBhcnJheU9wZXJhdGlv
biA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXhdLAotICAgICAgICBkZWxldGVzVG9HbyA9IGFycmF5
T3BlcmF0aW9uLmNvdW50LAotICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVy
YXRpb25zW2luZGV4LTFdLCAvLyBtYXkgYmUgdW5kZWZpbmVkCi0gICAgICAgIGxlZnRPcCA9IGxl
ZnRBcnJheU9wZXJhdGlvbiAmJiBsZWZ0QXJyYXlPcGVyYXRpb24udHlwZSwKLSAgICAgICAgbmV4
dEFycmF5T3BlcmF0aW9uLAotICAgICAgICBuZXh0T3AsCi0gICAgICAgIG5leHRDb3VudCwKLSAg
ICAgICAgcmVtb3ZlTmV3QW5kTmV4dE9wID0gZmFsc2UsCi0gICAgICAgIHJlbW92ZWRJdGVtcyA9
IFtdOwotCi0gICAgaWYgKGxlZnRPcCA9PT0gREVMRVRFKSB7Ci0gICAgICBhcnJheU9wZXJhdGlv
biA9IGxlZnRBcnJheU9wZXJhdGlvbjsKLSAgICAgIGluZGV4IC09IDE7Ci0gICAgfQotCi0gICAg
Zm9yICh2YXIgaSA9IGluZGV4ICsgMTsgZGVsZXRlc1RvR28gPiAwOyArK2kpIHsKLSAgICAgIG5l
eHRBcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbaV07Ci0gICAgICBuZXh0T3AgPSBu
ZXh0QXJyYXlPcGVyYXRpb24udHlwZTsKLSAgICAgIG5leHRDb3VudCA9IG5leHRBcnJheU9wZXJh
dGlvbi5jb3VudDsKLQotICAgICAgaWYgKG5leHRPcCA9PT0gREVMRVRFKSB7Ci0gICAgICAgIGFy
cmF5T3BlcmF0aW9uLmNvdW50ICs9IG5leHRDb3VudDsKLSAgICAgICAgY29udGludWU7Ci0gICAg
ICB9Ci0KLSAgICAgIGlmIChuZXh0Q291bnQgPiBkZWxldGVzVG9HbykgewotICAgICAgICAvLyBk
OjIge3IsaX06NSAgd2UgcmVkdWNlIHRoZSByZXRhaW4gb3IgaW5zZXJ0LCBidXQgaXQgc3RheXMK
LSAgICAgICAgcmVtb3ZlZEl0ZW1zID0gcmVtb3ZlZEl0ZW1zLmNvbmNhdChuZXh0QXJyYXlPcGVy
YXRpb24uaXRlbXMuc3BsaWNlKDAsIGRlbGV0ZXNUb0dvKSk7Ci0gICAgICAgIG5leHRBcnJheU9w
ZXJhdGlvbi5jb3VudCAtPSBkZWxldGVzVG9HbzsKLQotICAgICAgICAvLyBJbiB0aGUgY2FzZSB3
aGVyZSB3ZSB0cnVuY2F0ZSB0aGUgbGFzdCBhcnJheU9wZXJhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0
bwotICAgICAgICAvLyByZW1vdmUgaXQ7IGFsc28gdGhlIGRlbGV0ZXNUb0dvIHJlZHVjdGlvbiBp
cyBub3QgdGhlIGVudGlyZXR5IG9mCi0gICAgICAgIC8vIG5leHRDb3VudAotICAgICAgICBpIC09
IDE7Ci0gICAgICAgIG5leHRDb3VudCA9IGRlbGV0ZXNUb0dvOwotCi0gICAgICAgIGRlbGV0ZXNU
b0dvID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChuZXh0Q291bnQgPT09IGRlbGV0
ZXNUb0dvKSB7Ci0gICAgICAgICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSBvZiBkOjIgaToyIGluIHdo
aWNoIGNhc2UgYm90aCBvcGVyYXRpb25zIGdvIGF3YXkKLSAgICAgICAgICAvLyBkdXJpbmcgY29t
cG9zaXRpb24uCi0gICAgICAgICAgcmVtb3ZlTmV3QW5kTmV4dE9wID0gdHJ1ZTsKLSAgICAgICAg
fQotICAgICAgICByZW1vdmVkSXRlbXMgPSByZW1vdmVkSXRlbXMuY29uY2F0KG5leHRBcnJheU9w
ZXJhdGlvbi5pdGVtcyk7Ci0gICAgICAgIGRlbGV0ZXNUb0dvIC09IG5leHRDb3VudDsKLSAgICAg
IH0KLQotICAgICAgaWYgKG5leHRPcCA9PT0gSU5TRVJUKSB7Ci0gICAgICAgIC8vIGQ6MiBpOjMg
d2lsbCByZXN1bHQgaW4gZGVsZXRlIGdvaW5nIGF3YXkKLSAgICAgICAgYXJyYXlPcGVyYXRpb24u
Y291bnQgLT0gbmV4dENvdW50OwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhcnJheU9wZXJh
dGlvbi5jb3VudCA+IDApIHsKLSAgICAgIC8vIGNvbXBvc2Ugb3VyIG5ldyBkZWxldGUgd2l0aCBw
b3NzaWJseSBzZXZlcmFsIG9wZXJhdGlvbnMgdG8gdGhlIHJpZ2h0IG9mCi0gICAgICAvLyBkaXNw
YXJhdGUgdHlwZXMKLSAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGluZGV4KzEsIGktMS1p
bmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBkZWxldGUgb3BlcmF0aW9uIGNhbiBn
byBhd2F5OyBpdCBoYXMgbWVyZWx5IHJlZHVjZWQgc29tZSBvdGhlcgotICAgICAgLy8gb3BlcmF0
aW9uLCBhcyBpbiBkOjMgaTo0OyBpdCBtYXkgYWxzbyBoYXZlIGVsaW1pbmF0ZWQgdGhhdCBvcGVy
YXRpb24sCi0gICAgICAvLyBhcyBpbiBkOjMgaTozLgotICAgICAgdGhpcy5fb3BlcmF0aW9ucy5z
cGxpY2UoaW5kZXgsIHJlbW92ZU5ld0FuZE5leHRPcCA/IDIgOiAxKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gcmVtb3ZlZEl0ZW1zOwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7Ci0g
ICAgdmFyIHN0ciA9ICIiOwotICAgIGZvckVhY2godGhpcy5fb3BlcmF0aW9ucywgZnVuY3Rpb24g
KG9wZXJhdGlvbikgewotICAgICAgc3RyICs9ICIgIiArIG9wZXJhdGlvbi50eXBlICsgIjoiICsg
b3BlcmF0aW9uLmNvdW50OwotICAgIH0pOwotICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpOwot
ICB9Ci19OwotCi0vKioKLSAgSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFu
IGFycmF5IG9wZXJhdGlvbi4KLQotICBAbWV0aG9kIEFycmF5T3BlcmF0aW9uCi0gIEBwcml2YXRl
Ci0gIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUg
b2YKLSAgYEVtYmVyLlRyYWNrZWRBcnJheS57UkVUQUlOLCBJTlNFUlQsIERFTEVURX1gCi0gIEBw
YXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgb3BlcmF0aW9u
LgotICBAcGFyYW0ge2FycmF5fSBpdGVtcyBUaGUgaXRlbXMgb2YgdGhlIG9wZXJhdGlvbiwgaWYg
aW5jbHVkZWQuICBSRVRBSU4gYW5kCi0gIElOU0VSVCBpbmNsdWRlIHRoZWlyIGl0ZW1zLCBERUxF
VEUgZG9lcyBub3QuCi0qLwotZnVuY3Rpb24gQXJyYXlPcGVyYXRpb24gKG9wZXJhdGlvbiwgY291
bnQsIGl0ZW1zKSB7Ci0gIHRoaXMudHlwZSA9IG9wZXJhdGlvbjsgLy8gUkVUQUlOIHwgSU5TRVJU
IHwgREVMRVRFCi0gIHRoaXMuY291bnQgPSBjb3VudDsKLSAgdGhpcy5pdGVtcyA9IGl0ZW1zOwot
fQotCi0vKioKLSAgSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBpbmNsdWRlIGluZm9y
bWF0aW9uIHdoZW4gbG9va2luZyB1cCBvcGVyYXRpb25zCi0gIGJ5IGl0ZW0gaW5kZXguCi0KLSAg
QG1ldGhvZCBBcnJheU9wZXJhdGlvbk1hdGNoCi0gIEBwcml2YXRlCi0gIEBwYXJhbSB7QXJyYXlP
cGVyYXRpb259IG9wZXJhdGlvbgotICBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9m
IGBvcGVyYXRpb25gIGluIHRoZSBhcnJheSBvZiBvcGVyYXRpb25zLgotICBAcGFyYW0ge2Jvb2xl
YW59IHNwbGl0IFdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIGluZGV4IHNlYXJjaGVkIGZvciB3b3Vs
ZAotICByZXF1aXJlIGEgc3BsaXQgZm9yIGEgbmV3IG9wZXJhdGlvbiB0eXBlLgotICBAcGFyYW0g
e251bWJlcn0gcmFuZ2VTdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG9w
ZXJhdGlvbiwKLSAgd2l0aCByZXNwZWN0IHRvIHRoZSB0cmFja2VkIGFycmF5LiAgVGhlIGluZGV4
IG9mIHRoZSBsYXN0IGl0ZW0gY2FuIGJlIGNvbXB1dGVkCi0gIGZyb20gYHJhbmdlU3RhcnRgIGFu
ZCBgb3BlcmF0aW9uLmNvdW50YC4KLSovCi1mdW5jdGlvbiBBcnJheU9wZXJhdGlvbk1hdGNoKG9w
ZXJhdGlvbiwgaW5kZXgsIHNwbGl0LCByYW5nZVN0YXJ0KSB7Ci0gIHRoaXMub3BlcmF0aW9uID0g
b3BlcmF0aW9uOwotICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gIHRoaXMuc3BsaXQgPSBzcGxpdDsK
LSAgdGhpcy5yYW5nZVN0YXJ0ID0gcmFuZ2VTdGFydDsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5mb3JFYWNoLAotICAgIFJFVEFJTiA9ICdyJywKLSAgICBGSUxURVIgPSAnZic7
Ci0KLWZ1bmN0aW9uIE9wZXJhdGlvbiAodHlwZSwgY291bnQpIHsKLSAgdGhpcy50eXBlID0gdHlw
ZTsKLSAgdGhpcy5jb3VudCA9IGNvdW50OwotfQotCi0vKioKLSAgQW4gYEVtYmVyLlN1YkFycmF5
YCB0cmFja3MgYW4gYXJyYXkgaW4gYSB3YXkgc2ltaWxhciB0bywgYnV0IG1vcmUgc3BlY2lhbGl6
ZWQKLSAgdGhhbiwgYEVtYmVyLlRyYWNrZWRBcnJheWAuICBJdCBpcyB1c2VmdWwgZm9yIGtlZXBp
bmcgdHJhY2sgb2YgdGhlIGluZGV4ZXMgb2YKLSAgaXRlbXMgd2l0aGluIGEgZmlsdGVyZWQgYXJy
YXkuCi0KLSAgQGNsYXNzIFN1YkFycmF5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5T
dWJBcnJheSA9IGZ1bmN0aW9uIChsZW5ndGgpIHsKLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAx
KSB7IGxlbmd0aCA9IDA7IH0KLQotICBpZiAobGVuZ3RoID4gMCkgewotICAgIHRoaXMuX29wZXJh
dGlvbnMgPSBbbmV3IE9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCldOwotICB9IGVsc2UgewotICAg
IHRoaXMuX29wZXJhdGlvbnMgPSBbXTsKLSAgfQotfTsKLQotRW1iZXIuU3ViQXJyYXkucHJvdG90
eXBlID0gewotICAvKioKLSAgICBUcmFjayB0aGF0IGFuIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSB0
cmFja2VkIGFycmF5LgotCi0gICAgQG1ldGhvZCBhZGRJdGVtCi0KLSAgICBAcGFyYW0ge251bWJl
cn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSB0cmFja2VkIGFycmF5LgotICAg
IEBwYXJhbSB7Ym9vbGVhbn0gbWF0Y2ggYHRydWVgIGlmZiB0aGUgaXRlbSBpcyBpbmNsdWRlZCBp
biB0aGUgc3ViYXJyYXkuCi0KLSAgICBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUg
aXRlbSBpbiB0aGUgc3ViYXJyYXkuCi0gICovCi0gIGFkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBt
YXRjaCkgewotICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAotICAgICAgICBpdGVtVHlwZSA9IG1h
dGNoID8gUkVUQUlOIDogRklMVEVSLAotICAgICAgICBzZWxmID0gdGhpczsKLQotICAgIHRoaXMu
X2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9uKG9wZXJhdGlvbiwgb3BlcmF0aW9uSW5kZXgs
IHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBzZWVuSW5TdWJBcnJheSkgewotICAgICAgdmFyIG5ld09w
ZXJhdGlvbiwgc3BsaXRPcGVyYXRpb247Ci0KLSAgICAgIGlmIChpdGVtVHlwZSA9PT0gb3BlcmF0
aW9uLnR5cGUpIHsKLSAgICAgICAgKytvcGVyYXRpb24uY291bnQ7Ci0gICAgICB9IGVsc2UgaWYg
KGluZGV4ID09PSByYW5nZVN0YXJ0KSB7Ci0gICAgICAgIC8vIGluc2VydCB0byB0aGUgbGVmdCBv
ZiBgb3BlcmF0aW9uYAotICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGljZShvcGVyYXRpb25J
bmRleCwgMCwgbmV3IE9wZXJhdGlvbihpdGVtVHlwZSwgMSkpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgbmV3T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihpdGVtVHlwZSwgMSk7Ci0gICAgICAg
IHNwbGl0T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvcGVyYXRpb24udHlwZSwgcmFuZ2VFbmQg
LSBpbmRleCArIDEpOwotICAgICAgICBvcGVyYXRpb24uY291bnQgPSBpbmRleCAtIHJhbmdlU3Rh
cnQ7Ci0KLSAgICAgICAgc2VsZi5fb3BlcmF0aW9ucy5zcGxpY2Uob3BlcmF0aW9uSW5kZXggKyAx
LCAwLCBuZXdPcGVyYXRpb24sIHNwbGl0T3BlcmF0aW9uKTsKLSAgICAgIH0KLQotICAgICAgaWYg
KG1hdGNoKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7Ci0gICAg
ICAgICAgcmV0dXJuVmFsdWUgPSBzZWVuSW5TdWJBcnJheSArIChpbmRleCAtIHJhbmdlU3RhcnQp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJy
YXk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc2VsZi5fY29tcG9zZUF0KG9wZXJhdGlv
bkluZGV4KTsKLSAgICB9LCBmdW5jdGlvbihzZWVuSW5TdWJBcnJheSkgewotICAgICAgc2VsZi5f
b3BlcmF0aW9ucy5wdXNoKG5ldyBPcGVyYXRpb24oaXRlbVR5cGUsIDEpKTsKLQotICAgICAgaWYg
KG1hdGNoKSB7Ci0gICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7Ci0gICAgICB9
Ci0KLSAgICAgIHNlbGYuX2NvbXBvc2VBdChzZWxmLl9vcGVyYXRpb25zLmxlbmd0aC0xKTsKLSAg
ICB9KTsKLQotICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFj
ayB0aGF0IGFuIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2tlZCBhcnJheS4KLQotICAg
IEBtZXRob2QgcmVtb3ZlSXRlbQotCi0gICAgQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRl
eCBvZiB0aGUgaXRlbSBpbiB0aGUgdHJhY2tlZCBhcnJheS4KLQotICAgIEByZXR1cm4ge251bWJl
cn0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBzdWJhcnJheSwgb3IgYC0xYCBpZiB0aGUg
aXRlbQotICAgIHdhcyBub3QgaW4gdGhlIHN1YmFycmF5LgotICAqLwotICByZW1vdmVJdGVtOiBm
dW5jdGlvbihpbmRleCkgewotICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAotICAgICAgICBzZWxm
ID0gdGhpczsKLQotICAgIHRoaXMuX2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9uIChvcGVy
YXRpb24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0LCByYW5nZUVuZCwgc2VlbkluU3ViQXJy
YXkpIHsKLSAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7Ci0gICAgICAgIHJl
dHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXkgKyAoaW5kZXggLSByYW5nZVN0YXJ0KTsKLSAgICAg
IH0KLQotICAgICAgaWYgKG9wZXJhdGlvbi5jb3VudCA+IDEpIHsKLSAgICAgICAgLS1vcGVyYXRp
b24uY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGlj
ZShvcGVyYXRpb25JbmRleCwgMSk7Ci0gICAgICAgIHNlbGYuX2NvbXBvc2VBdChvcGVyYXRpb25J
bmRleCk7Ci0gICAgICB9Ci0gICAgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoIkNhbid0IHJlbW92ZSBhbiBpdGVtIHRoYXQgaGFzIG5ldmVyIGJlZW4gYWRkZWQu
Iik7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gIH0sCi0KLQotICBfZmlu
ZE9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4LCBmb3VuZENhbGxiYWNrLCBub3RGb3VuZENhbGxi
YWNrKSB7Ci0gICAgdmFyIG9wZXJhdGlvbkluZGV4LAotICAgICAgICBsZW4sCi0gICAgICAgIG9w
ZXJhdGlvbiwKLSAgICAgICAgcmFuZ2VTdGFydCwKLSAgICAgICAgcmFuZ2VFbmQsCi0gICAgICAg
IHNlZW5JblN1YkFycmF5ID0gMDsKLQotICAgIC8vIE9QVElNSVpFOiBjaGFuZ2UgdG8gYmFsYW5j
ZWQgdHJlZQotICAgIC8vIGZpbmQgbGVmdG1vc3Qgb3BlcmF0aW9uIHRvIHRoZSByaWdodCBvZiBg
aW5kZXhgCi0gICAgZm9yIChvcGVyYXRpb25JbmRleCA9IHJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0
aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgb3BlcmF0aW9uSW5kZXggPCBsZW47IHJhbmdlU3RhcnQg
PSByYW5nZUVuZCArIDEsICsrb3BlcmF0aW9uSW5kZXgpIHsKLSAgICAgIG9wZXJhdGlvbiA9IHRo
aXMuX29wZXJhdGlvbnNbb3BlcmF0aW9uSW5kZXhdOwotICAgICAgcmFuZ2VFbmQgPSByYW5nZVN0
YXJ0ICsgb3BlcmF0aW9uLmNvdW50IC0gMTsKLQotICAgICAgaWYgKGluZGV4ID49IHJhbmdlU3Rh
cnQgJiYgaW5kZXggPD0gcmFuZ2VFbmQpIHsKLSAgICAgICAgZm91bmRDYWxsYmFjayhvcGVyYXRp
b24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0LCByYW5nZUVuZCwgc2VlbkluU3ViQXJyYXkp
OwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi50eXBlID09PSBS
RVRBSU4pIHsKLSAgICAgICAgc2VlbkluU3ViQXJyYXkgKz0gb3BlcmF0aW9uLmNvdW50OwotICAg
ICAgfQotICAgIH0KLQotICAgIG5vdEZvdW5kQ2FsbGJhY2soc2VlbkluU3ViQXJyYXkpOwotICB9
LAotCi0gIF9jb21wb3NlQXQ6IGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgdmFyIG9wID0gdGhpcy5f
b3BlcmF0aW9uc1tpbmRleF0sCi0gICAgICAgIG90aGVyT3A7Ci0KLSAgICBpZiAoIW9wKSB7Ci0g
ICAgICAvLyBDb21wb3Npbmcgb3V0IG9mIGJvdW5kcyBpcyBhIG5vLW9wLCBhcyB3aGVuIHJlbW92
aW5nIHRoZSBsYXN0IG9wZXJhdGlvbgotICAgICAgLy8gaW4gdGhlIGxpc3QuCi0gICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgb3RoZXJPcCA9IHRoaXMu
X29wZXJhdGlvbnNbaW5kZXgtMV07Ci0gICAgICBpZiAob3RoZXJPcC50eXBlID09PSBvcC50eXBl
KSB7Ci0gICAgICAgIG9wLmNvdW50ICs9IG90aGVyT3AuY291bnQ7Ci0gICAgICAgIHRoaXMuX29w
ZXJhdGlvbnMuc3BsaWNlKGluZGV4LTEsIDEpOwotICAgICAgICAtLWluZGV4OwotICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChpbmRleCA8IHRoaXMuX29wZXJhdGlvbnMubGVuZ3RoLTEpIHsKLSAg
ICAgIG90aGVyT3AgPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4KzFdOwotICAgICAgaWYgKG90aGVy
T3AudHlwZSA9PT0gb3AudHlwZSkgewotICAgICAgICBvcC5jb3VudCArPSBvdGhlck9wLmNvdW50
OwotICAgICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRleCsxLCAxKTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0sCi0KLSAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgc3RyID0g
IiI7Ci0gICAgZm9yRWFjaCh0aGlzLl9vcGVyYXRpb25zLCBmdW5jdGlvbiAob3BlcmF0aW9uKSB7
Ci0gICAgICBzdHIgKz0gIiAiICsgb3BlcmF0aW9uLnR5cGUgKyAiOiIgKyBvcGVyYXRpb24uY291
bnQ7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMSk7Ci0gIH0KLX07Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5Db250YWluZXIgPSByZXF1aXJlTW9kdWxl
KCdjb250YWluZXInKTsKLUVtYmVyLkNvbnRhaW5lci5zZXQgPSBFbWJlci5zZXQ7Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5BcHBsaWNhdGlvbiA9IEVtYmVyLk5hbWVzcGFj
ZS5leHRlbmQoKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBl
bWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgT1VUX09GX1JBTkdFX0VY
Q0VQVElPTiA9ICJJbmRleCBvdXQgb2YgcmFuZ2UiOwotdmFyIEVNUFRZID0gW107Ci0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEFuIEFycmF5UHJveHkg
d3JhcHMgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQv
b3IKLSAgYEVtYmVyLk11dGFibGVBcnJheSxgIGZvcndhcmRpbmcgYWxsIHJlcXVlc3RzLiBUaGlz
IG1ha2VzIGl0IHZlcnkgdXNlZnVsIGZvcgotICBhIG51bWJlciBvZiBiaW5kaW5nIHVzZSBjYXNl
cyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKLSAgb3V0IHRoZSB1bmRl
cmx5aW5nIGFycmF5IGlzIHVzZWZ1bC4KLQotICBBIHNpbXBsZSBleGFtcGxlIG9mIHVzYWdlOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHBldHMgPSBbJ2RvZycsICdjYXQnLCAnZmlzaCddOwot
ICB2YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7IGNvbnRlbnQ6IEVtYmVyLkEocGV0
cykgfSk7Ci0KLSAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAgICAgICAg
IC8vICdkb2cnCi0gIGFwLnNldCgnY29udGVudCcsIFsnYW1vZWJhJywgJ3BhcmFtZWNpdW0nXSk7
Ci0gIGFwLmdldCgnZmlyc3RPYmplY3QnKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnYW1v
ZWJhJwotICBgYGAKLQotICBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWZ1bCBhcyBhIGxheWVy
IHRvIHRyYW5zZm9ybSB0aGUgY29udGVudHMgb2YKLSAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFj
Y2Vzc2VkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IG92ZXJyaWRpbmcKLSAgYG9iamVjdEF0Q29udGVu
dGA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcGV0cyA9IFsnZG9nJywgJ2NhdCcsICdmaXNo
J107Ci0gIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsKLSAgICAgIGNvbnRlbnQ6
IEVtYmVyLkEocGV0cyksCi0gICAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewot
ICAgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29udGVudCcpLm9iamVjdEF0KGlkeCkudG9VcHBl
ckNhc2UoKTsKLSAgICAgIH0KLSAgfSk7Ci0KLSAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyAu
ICdET0cnCi0gIGBgYAotCi0gIEBjbGFzcyBBcnJheVByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIK
LSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVBcnJheQotKi8K
LUVtYmVyLkFycmF5UHJveHkgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJh
eSwgewotCi0gIC8qKgotICAgIFRoZSBjb250ZW50IGFycmF5LiBNdXN0IGJlIGFuIG9iamVjdCB0
aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQvb3IKLSAgICBgRW1iZXIuTXV0YWJsZUFy
cmF5LmAKLQotICAgIEBwcm9wZXJ0eSBjb250ZW50Ci0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAg
Ki8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioKLSAgIFRoZSBhcnJheSB0aGF0IHRoZSBwcm94
eSBwcmV0ZW5kcyB0byBiZS4gSW4gdGhlIGRlZmF1bHQgYEFycmF5UHJveHlgCi0gICBpbXBsZW1l
bnRhdGlvbiwgdGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBg
QXJyYXlQcm94eWAKLSAgIGNhbiBvdmVycmlkZSB0aGlzIHByb3BlcnR5IHRvIHByb3ZpZGUgdGhp
bmdzIGxpa2Ugc29ydGluZyBhbmQgZmlsdGVyaW5nLgotCi0gICBAcHJvcGVydHkgYXJyYW5nZWRD
b250ZW50Ci0gICovCi0gIGFycmFuZ2VkQ29udGVudDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2Nv
bnRlbnQnKSwKLQotICAvKioKLSAgICBTaG91bGQgYWN0dWFsbHkgcmV0cmlldmUgdGhlIG9iamVj
dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlCi0gICAgY29udGVudC4gWW91IGNhbiBv
dmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHRyYW5zZm9ybSB0aGUKLSAgICBj
b250ZW50IGl0ZW0gdG8gc29tZXRoaW5nIG5ldy4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgb25s
eSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgotCi0gICAgQG1ldGhvZCBvYmpl
Y3RBdENvbnRlbnQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byByZXRyaWV2
ZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm9uZSBm
b3VuZAotICAqLwotICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVy
biBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpLm9iamVjdEF0KGlkeCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgU2hvdWxkIGFjdHVhbGx5IHJlcGxhY2UgdGhlIHNwZWNpZmllZCBvYmplY3RzIG9u
IHRoZSBjb250ZW50IGFycmF5LgotICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4g
c3ViY2xhc3NlcyB0byB0cmFuc2Zvcm0gdGhlIGNvbnRlbnQgaXRlbQotICAgIGludG8gc29tZXRo
aW5nIG5ldy4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVu
dCBpcyBub24tYG51bGxgLgotCi0gICAgQG1ldGhvZCByZXBsYWNlQ29udGVudAotICAgIEBwYXJh
bSB7TnVtYmVyfSBpZHggVGhlIHN0YXJ0aW5nIGluZGV4Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGFt
dCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBjb250ZW50LgotICAgIEBw
YXJhbSB7QXJyYXl9IG9iamVjdHMgT3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnQg
b3IgbnVsbCBpZiBubwotICAgICAgb2JqZWN0cy4KLSAgICBAcmV0dXJuIHt2b2lkfQotICAqLwot
ICByZXBsYWNlQ29udGVudDogZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKLSAgICBnZXQo
dGhpcywgJ2NvbnRlbnQnKS5yZXBsYWNlKGlkeCwgYW10LCBvYmplY3RzKTsKLSAgfSwKLQotICAv
KioKLSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh
bmdlLiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCB0aGUKLSAgICBlbnRpcmUgYXJyYXkgY29udGVu
dCB3aWxsIGNoYW5nZS4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfY29udGVudFdpbGxD
aGFuZ2UKLSAgKi8KLSAgX2NvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcign
Y29udGVudCcsIGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9
KSwKLQotICBfdGVhcmRvd25Db250ZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9
IGdldCh0aGlzLCAnY29udGVudCcpOwotCi0gICAgaWYgKGNvbnRlbnQpIHsKLSAgICAgIGNvbnRl
bnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICAgIHdpbGxDaGFuZ2U6ICdjb250
ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlk
Q2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIGNvbnRlbnRBcnJheVdpbGxDaGFu
Z2U6IEVtYmVyLkssCi0gIGNvbnRlbnRBcnJheURpZENoYW5nZTogRW1iZXIuSywKLQotICAvKioK
LSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMg
b2JzZXJ2ZXJzIHRoYXQgdGhlCi0gICAgZW50aXJlIGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQu
Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2NvbnRlbnREaWRDaGFuZ2UKLSAgKi8KLSAg
X2NvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLQotICAgIEVtYmVyLmFz
c2VydCgiQ2FuJ3Qgc2V0IEFycmF5UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIGNvbnRlbnQg
IT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBDb250ZW50KCk7Ci0gIH0pLAotCi0gIF9zZXR1
cENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50Jyk7Ci0KLSAgICBpZiAoY29udGVudCkgewotICAgICAgY29udGVudC5hZGRBcnJheU9ic2Vy
dmVyKHRoaXMsIHsKLSAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFuZ2Un
LAotICAgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9KTsK
LSAgICB9Ci0gIH0sCi0KLSAgX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9y
ZU9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5n
ZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgbGVuID0g
YXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKLQot
ICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlKHRoaXMsIDAsIGxlbiwgdW5k
ZWZpbmVkKTsKLSAgICB0aGlzLmFycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2UodGhpcyk7Ci0KLSAg
ICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudChhcnJhbmdlZENvbnRlbnQpOwotICB9KSwK
LQotICBfYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignYXJyYW5nZWRD
b250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz
LCAnYXJyYW5nZWRDb250ZW50JyksCi0gICAgICAgIGxlbiA9IGFycmFuZ2VkQ29udGVudCA/IGdl
dChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0KLSAgICBFbWJlci5hc3NlcnQoIkNh
bid0IHNldCBBcnJheVByb3h5J3MgY29udGVudCB0byBpdHNlbGYiLCBhcnJhbmdlZENvbnRlbnQg
IT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKLQotICAgIHRo
aXMuYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRoaXMpOwotICAgIHRoaXMuYXJyYW5nZWRDb250
ZW50QXJyYXlEaWRDaGFuZ2UodGhpcywgMCwgdW5kZWZpbmVkLCBsZW4pOwotICB9KSwKLQotICBf
c2V0dXBBcnJhbmdlZENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBhcnJhbmdlZENvbnRl
bnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOwotCi0gICAgaWYgKGFycmFuZ2VkQ29u
dGVudCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgewot
ICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAg
ICAgICAgZGlkQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9
KTsKLSAgICB9Ci0gIH0sCi0KLSAgX3RlYXJkb3duQXJyYW5nZWRDb250ZW50OiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQn
KTsKLQotICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKLSAgICAgIGFycmFuZ2VkQ29udGVudC5y
ZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgICAgd2lsbENoYW5nZTogJ2FycmFuZ2Vk
Q29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZTogJ2FycmFuZ2VkQ29u
dGVudEFycmF5RGlkQ2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIGFycmFuZ2Vk
Q29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLkssCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTog
RW1iZXIuSywKLQotICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIGdldCh0
aGlzLCAnY29udGVudCcpICYmIHRoaXMub2JqZWN0QXRDb250ZW50KGlkeCk7Ci0gIH0sCi0KLSAg
bGVuZ3RoOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250
ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLSAgICByZXR1cm4gYXJyYW5nZWRD
b250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKLSAgICAvLyBObyBk
ZXBlbmRlbmNpZXMgc2luY2UgRW51bWVyYWJsZSBub3RpZmllcyBsZW5ndGggb2YgY2hhbmdlCi0g
IH0pLAotCi0gIF9yZXBsYWNlOiBmdW5jdGlvbihpZHgsIGFtdCwgb2JqZWN0cykgewotICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCdUaGUg
Y29udGVudCBwcm9wZXJ0eSBvZiAnKyB0aGlzLmNvbnN0cnVjdG9yICsgJyBzaG91bGQgYmUgc2V0
IGJlZm9yZSBtb2RpZnlpbmcgaXQnLCBjb250ZW50KTsKLSAgICBpZiAoY29udGVudCkgdGhpcy5y
ZXBsYWNlQ29udGVudChpZHgsIGFtdCwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgcmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnYXJyYW5nZWRD
b250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVudCcpKSB7Ci0gICAgICB0aGlzLl9yZXBsYWNl
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBF
bWJlci5FcnJvcigiVXNpbmcgcmVwbGFjZSBvbiBhbiBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5v
dCBhbGxvd2VkLiIpOwotICAgIH0KLSAgfSwKLQotICBfaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwg
b2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnY29udGVudC5sZW5ndGgnKSkgdGhy
b3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgIHRoaXMuX3Jl
cGxhY2UoaWR4LCAwLCBbb2JqZWN0XSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgaW5z
ZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnYXJyYW5n
ZWRDb250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVudCcpKSB7Ci0gICAgICByZXR1cm4gdGhp
cy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcg
RW1iZXIuRXJyb3IoIlVzaW5nIGluc2VydEF0IG9uIGFuIGFycmFuZ2VkIEFycmF5UHJveHkgaXMg
bm90IGFsbG93ZWQuIik7Ci0gICAgfQotICB9LAotCi0gIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFy
dCwgbGVuKSB7Ci0gICAgaWYgKCdudW1iZXInID09PSB0eXBlb2Ygc3RhcnQpIHsKLSAgICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgICAgYXJyYW5nZWRDb250
ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgICBpbmRpY2VzID0g
W10sIGk7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICds
ZW5ndGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9F
WENFUFRJT04pOwotICAgICAgfQotCi0gICAgICBpZiAobGVuID09PSB1bmRlZmluZWQpIGxlbiA9
IDE7Ci0KLSAgICAgIC8vIEdldCBhIGxpc3Qgb2YgaW5kaWNlcyBpbiBvcmlnaW5hbCBjb250ZW50
IHRvIHJlbW92ZQotICAgICAgZm9yIChpPXN0YXJ0OyBpPHN0YXJ0K2xlbjsgaSsrKSB7Ci0gICAg
ICAgIC8vIFVzZSBhcnJhbmdlZENvbnRlbnQgaGVyZSBzbyB3ZSBhdm9pZCBjb25mdXNpb24gd2l0
aCBvYmplY3RzIHRyYW5zZm9ybWVkIGJ5IG9iamVjdEF0Q29udGVudAotICAgICAgICBpbmRpY2Vz
LnB1c2goY29udGVudC5pbmRleE9mKGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChpKSkpOwotICAg
ICAgfQotCi0gICAgICAvLyBSZXBsYWNlIGluIHJldmVyc2Ugb3JkZXIgc2luY2UgaW5kaWNlcyB3
aWxsIGNoYW5nZQotICAgICAgaW5kaWNlcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYiAt
IGE7IH0pOwotCi0gICAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOwotICAgICAgZm9y
IChpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICB0aGlzLl9yZXBsYWNlKGlu
ZGljZXNbaV0sIDEsIEVNUFRZKTsKLSAgICAgIH0KLSAgICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hh
bmdlcygpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzIDsKLSAgfSwKLQotICBwdXNoT2JqZWN0
OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLl9pbnNlcnRBdChnZXQodGhpcywgJ2NvbnRlbnQu
bGVuZ3RoJyksIG9iaikgOwotICAgIHJldHVybiBvYmogOwotICB9LAotCi0gIHB1c2hPYmplY3Rz
OiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgaWYgKCEoRW1iZXIuRW51bWVyYWJsZS5kZXRlY3Qo
b2JqZWN0cykgfHwgRW1iZXIuaXNBcnJheShvYmplY3RzKSkpIHsKLSAgICAgIHRocm93IG5ldyBU
eXBlRXJyb3IoIk11c3QgcGFzcyBFbWJlci5FbnVtZXJhYmxlIHRvIEVtYmVyLk11dGFibGVBcnJh
eSNwdXNoT2JqZWN0cyIpOwotICAgIH0KLSAgICB0aGlzLl9yZXBsYWNlKGdldCh0aGlzLCAnbGVu
Z3RoJyksIDAsIG9iamVjdHMpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHNldE9iamVj
dHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHJl
dHVybiB0aGlzLmNsZWFyKCk7Ci0KLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsK
LSAgICB0aGlzLl9yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgdW5zaGlmdE9iamVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdGhpcy5faW5zZXJ0
QXQoMCwgb2JqKSA7Ci0gICAgcmV0dXJuIG9iaiA7Ci0gIH0sCi0KLSAgdW5zaGlmdE9iamVjdHM6
IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICB0aGlzLl9yZXBsYWNlKDAsIDAsIG9iamVjdHMpOwot
ICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHNsaWNlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
YXJyID0gdGhpcy50b0FycmF5KCk7Ci0gICAgcmV0dXJuIGFyci5zbGljZS5hcHBseShhcnIsIGFy
Z3VtZW50cyk7Ci0gIH0sCi0KLSAgYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlOiBmdW5j
dGlvbihpdGVtLCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJheUNv
bnRlbnRXaWxsQ2hhbmdlKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpOwotICB9LAotCi0gIGFy
cmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihpdGVtLCBpZHgsIHJlbW92ZWRD
bnQsIGFkZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1v
dmVkQ250LCBhZGRlZENudCk7Ci0gIH0sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fc3VwZXIoKTsKLSAgICB0aGlzLl9zZXR1cENvbnRlbnQoKTsKLSAgICB0aGlzLl9zZXR1cEFy
cmFuZ2VkQ29udGVudCgpOwotICB9LAotCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudCgpOwotICAgIHRoaXMuX3RlYXJkb3duQ29u
dGVudCgpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0KLXZhciBzZXQgPSBF
bWJlci5zZXQsIGdldCA9IEVtYmVyLmdldCwgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIg
Zm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIGluZGV4T2YgPSBF
bWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotCi12YXIgRWFjaEFycmF5ID0gRW1iZXIuT2Jq
ZWN0LmV4dGVuZChFbWJlci5BcnJheSwgewotCi0gIGluaXQ6IGZ1bmN0aW9uKGNvbnRlbnQsIGtl
eU5hbWUsIG93bmVyKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9rZXlOYW1lID0g
a2V5TmFtZTsKLSAgICB0aGlzLl9vd25lciAgID0gb3duZXI7Ci0gICAgdGhpcy5fY29udGVudCA9
IGNvbnRlbnQ7Ci0gIH0sCi0KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHZhciBp
dGVtID0gdGhpcy5fY29udGVudC5vYmplY3RBdChpZHgpOwotICAgIHJldHVybiBpdGVtICYmIGdl
dChpdGVtLCB0aGlzLl9rZXlOYW1lKTsKLSAgfSwKLQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudDsKLSAgICByZXR1
cm4gY29udGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAwOwotICB9KQotCi19KTsKLQot
dmFyIElTX09CU0VSVkVSID0gL14uKzooYmVmb3JlfGNoYW5nZSkkLzsKLQotZnVuY3Rpb24gYWRk
T2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHByb3h5LCBpZHgsIGxvYykg
ewotICB2YXIgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzLCBndWlkOwotICBpZiAoIW9iamVjdHMp
IG9iamVjdHMgPSBwcm94eS5fb2JqZWN0cyA9IHt9OwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsK
LSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2JqZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewot
ICAgICAgRW1iZXIuYXNzZXJ0KCdXaGVuIHVzaW5nIEBlYWNoIHRvIG9ic2VydmUgdGhlIGFycmF5
ICcgKyBjb250ZW50ICsgJywgdGhlIGFycmF5IG11c3QgcmV0dXJuIGFuIG9iamVjdCcsIEVtYmVy
LnR5cGVPZihpdGVtKSA9PT0gJ2luc3RhbmNlJyB8fCBFbWJlci50eXBlT2YoaXRlbSkgPT09ICdv
YmplY3QnKTsKLSAgICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHBy
b3h5LCAnY29udGVudEtleVdpbGxDaGFuZ2UnKTsKLSAgICAgIEVtYmVyLmFkZE9ic2VydmVyKGl0
ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOwotCi0gICAgICAvLyBr
ZWVwIHRyYWNrIG9mIHRoZSBpbmRleCBlYWNoIGl0ZW0gd2FzIGZvdW5kIGF0IHNvIHdlIGNhbiBt
YXAKLSAgICAgIC8vIGl0IGJhY2sgd2hlbiB0aGUgb2JqIGNoYW5nZXMuCi0gICAgICBndWlkID0g
Z3VpZEZvcihpdGVtKTsKLSAgICAgIGlmICghb2JqZWN0c1tndWlkXSkgb2JqZWN0c1tndWlkXSA9
IFtdOwotICAgICAgb2JqZWN0c1tndWlkXS5wdXNoKGxvYyk7Ci0gICAgfQotICB9Ci19Ci0KLWZ1
bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94
eSwgaWR4LCBsb2MpIHsKLSAgdmFyIG9iamVjdHMgPSBwcm94eS5fb2JqZWN0czsKLSAgaWYgKCFv
YmplY3RzKSBvYmplY3RzID0gcHJveHkuX29iamVjdHMgPSB7fTsKLSAgdmFyIGluZGljaWVzLCBn
dWlkOwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsKLSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2Jq
ZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewotICAgICAgRW1iZXIucmVtb3ZlQmVmb3JlT2Jz
ZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5V2lsbENoYW5nZScpOwotICAg
ICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5
RGlkQ2hhbmdlJyk7Ci0KLSAgICAgIGd1aWQgPSBndWlkRm9yKGl0ZW0pOwotICAgICAgaW5kaWNp
ZXMgPSBvYmplY3RzW2d1aWRdOwotICAgICAgaW5kaWNpZXNbaW5kZXhPZi5jYWxsKGluZGljaWVz
LCBsb2MpXSA9IG51bGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICBUaGlzIGlzIHRoZSBvYmpl
Y3QgaW5zdGFuY2UgcmV0dXJuZWQgd2hlbiB5b3UgZ2V0IHRoZSBgQGVhY2hgIHByb3BlcnR5IG9u
IGFuCi0gIGFycmF5LiBJdCB1c2VzIHRoZSB1bmtub3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRv
bWF0aWNhbGx5IGNyZWF0ZQotICBFYWNoQXJyYXkgaW5zdGFuY2VzIGZvciBwcm9wZXJ0eSBuYW1l
cy4KLQotICBAcHJpdmF0ZQotICBAY2xhc3MgRWFjaFByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIK
LSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotRW1iZXIuRWFjaFByb3h5ID0gRW1iZXIuT2Jq
ZWN0LmV4dGVuZCh7Ci0KLSAgaW5pdDogZnVuY3Rpb24oY29udGVudCkgewotICAgIHRoaXMuX3N1
cGVyKCk7Ci0gICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgY29udGVudC5hZGRBcnJh
eU9ic2VydmVyKHRoaXMpOwotCi0gICAgLy8gaW4gY2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2Jz
ZXJ2aW5nIHNvbWUga2V5cyBtYWtlIHN1cmUgdGhleSBhcmUKLSAgICAvLyBhZGRlZAotICAgIGZv
ckVhY2goRW1iZXIud2F0Y2hlZEV2ZW50cyh0aGlzKSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0g
ICAgICB0aGlzLmRpZEFkZExpc3RlbmVyKGV2ZW50TmFtZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgWW91IGNhbiBkaXJlY3RseSBhY2Nlc3MgbWFwcGVkIHByb3BlcnRpZXMg
Ynkgc2ltcGx5IHJlcXVlc3RpbmcgdGhlbS4KLSAgICBUaGUgYHVua25vd25Qcm9wZXJ0eWAgaGFu
ZGxlciB3aWxsIGdlbmVyYXRlIGFuIEVhY2hBcnJheSBvZiBlYWNoIGl0ZW0uCi0KLSAgICBAbWV0
aG9kIHVua25vd25Qcm9wZXJ0eQotICAgIEBwYXJhbSBrZXlOYW1lIHtTdHJpbmd9Ci0gICAgQHBh
cmFtIHZhbHVlIHsqfQotICAqLwotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUs
IHZhbHVlKSB7Ci0gICAgdmFyIHJldDsKLSAgICByZXQgPSBuZXcgRWFjaEFycmF5KHRoaXMuX2Nv
bnRlbnQsIGtleU5hbWUsIHRoaXMpOwotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsIGtl
eU5hbWUsIG51bGwsIHJldCk7Ci0gICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRLZXkoa2V5
TmFtZSk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIEFSUkFZIENIQU5H
RVMKLSAgLy8gSW52b2tlcyB3aGVuZXZlciB0aGUgY29udGVudCBhcnJheSBpdHNlbGYgY2hhbmdl
cy4KLQotICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQsIGlkeCwgcmVtb3ZlZENu
dCwgYWRkZWRDbnQpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMuX2tleXMsIGtleSwgbGltOwotCi0g
ICAgbGltID0gcmVtb3ZlZENudD4wID8gaWR4K3JlbW92ZWRDbnQgOiAtMTsKLSAgICBFbWJlci5i
ZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKLQotICAgIGZvcihrZXkgaW4ga2V5cykgewotICAg
ICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLQotICAgICAg
aWYgKGxpbT4wKSB7IHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXksIHRo
aXMsIGlkeCwgbGltKTsgfQotCi0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywg
a2V5KTsKLSAgICB9Ci0KLSAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcy5fY29udGVu
dCwgJ0BlYWNoJyk7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICB9LAot
Ci0gIGFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgsIHJlbW92ZWRDbnQsIGFk
ZGVkQ250KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzLCBsaW07Ci0KLSAgICBsaW0gPSBh
ZGRlZENudD4wID8gaWR4K2FkZGVkQ250IDogLTE7Ci0gICAgRW1iZXIuY2hhbmdlUHJvcGVydGll
cyhmdW5jdGlvbigpIHsKLSAgICAgIGZvcih2YXIga2V5IGluIGtleXMpIHsKLSAgICAgICAgaWYg
KCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLQotICAgICAgICBpZiAo
bGltPjApIHsgYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleSwgdGhpcywgaWR4
LCBsaW0pOyB9Ci0KLSAgICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywga2V5KTsK
LSAgICAgIH0KLQotICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcy5fY29udGVudCwg
J0BlYWNoJyk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBMSVNURU4gRk9S
IE5FVyBPQlNFUlZFUlMgQU5EIE9USEVSIEVWRU5UIExJU1RFTkVSUwotICAvLyBTdGFydCBtb25p
dG9yaW5nIGtleXMgYmFzZWQgb24gd2hvIGlzIGxpc3RlbmluZy4uLgotCi0gIGRpZEFkZExpc3Rl
bmVyOiBmdW5jdGlvbihldmVudE5hbWUpIHsKLSAgICBpZiAoSVNfT0JTRVJWRVIudGVzdChldmVu
dE5hbWUpKSB7Ci0gICAgICB0aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShldmVudE5hbWUu
c2xpY2UoMCwgLTcpKTsKLSAgICB9Ci0gIH0sCi0KLSAgZGlkUmVtb3ZlTGlzdGVuZXI6IGZ1bmN0
aW9uKGV2ZW50TmFtZSkgewotICAgIGlmIChJU19PQlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsK
LSAgICAgIHRoaXMuc3RvcE9ic2VydmluZ0NvbnRlbnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03
KSk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gQ09OVEVOVCBLRVkgT0JTRVJWSU5HCi0g
IC8vIEFjdHVhbCB3YXRjaCBrZXlzIG9uIHRoZSBzb3VyY2UgY29udGVudC4KLQotICBiZWdpbk9i
c2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICB2YXIga2V5cyA9IHRo
aXMuX2tleXM7Ci0gICAgaWYgKCFrZXlzKSBrZXlzID0gdGhpcy5fa2V5cyA9IHt9OwotICAgIGlm
ICgha2V5c1trZXlOYW1lXSkgewotICAgICAga2V5c1trZXlOYW1lXSA9IDE7Ci0gICAgICB2YXIg
Y29udGVudCA9IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVuID0gZ2V0KGNvbnRlbnQsICds
ZW5ndGgnKTsKLSAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1l
LCB0aGlzLCAwLCBsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXlzW2tleU5hbWVdKys7Ci0g
ICAgfQotICB9LAotCi0gIHN0b3BPYnNlcnZpbmdDb250ZW50S2V5OiBmdW5jdGlvbihrZXlOYW1l
KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOwotICAgIGlmIChrZXlzICYmIChrZXlzW2tl
eU5hbWVdPjApICYmICgtLWtleXNba2V5TmFtZV08PTApKSB7Ci0gICAgICB2YXIgY29udGVudCA9
IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVuICAgICA9IGdldChjb250ZW50LCAnbGVuZ3Ro
Jyk7Ci0gICAgICByZW1vdmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwg
dGhpcywgMCwgbGVuKTsKLSAgICB9Ci0gIH0sCi0KLSAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1
bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LCBrZXlOYW1lKTsKLSAgfSwKLQotICBjb250ZW50S2V5RGlkQ2hhbmdlOiBmdW5jdGlvbihvYmos
IGtleU5hbWUpIHsKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsK
LSAgfQotCi19KTsKLQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
X3JlcGxhY2U7Ci0KLS8vIEFkZCBFbWJlci5BcnJheSB0byBBcnJheS5wcm90b3R5cGUuIFJlbW92
ZSBtZXRob2RzIHdpdGggbmF0aXZlCi0vLyBpbXBsZW1lbnRhdGlvbnMgYW5kIHN1cHBseSBzb21l
IG1vcmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGdlbmVyaWMgbWV0aG9kcwotLy8gYmVjYXVzZSB0
aGV5IGFyZSBzbyBjb21tb24uCi12YXIgTmF0aXZlQXJyYXkgPSBFbWJlci5NaXhpbi5jcmVhdGUo
RW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNlcnZhYmxlLCBFbWJlci5Db3B5YWJsZSwgewot
Ci0gIC8vIGJlY2F1c2UgbGVuZ3RoIGlzIGEgYnVpbHQtaW4gcHJvcGVydHkgd2UgbmVlZCB0byBr
bm93IHRvIGp1c3QgZ2V0IHRoZQotICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KLSAgZ2V0OiBmdW5j
dGlvbihrZXkpIHsKLSAgICBpZiAoa2V5PT09J2xlbmd0aCcpIHJldHVybiB0aGlzLmxlbmd0aDsK
LSAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGtleSkgcmV0dXJuIHRoaXNba2V5XTsK
LSAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlcihrZXkpOwotICB9LAotCi0gIG9iamVjdEF0OiBm
dW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4gdGhpc1tpZHhdOwotICB9LAotCi0gIC8vIHByaW1p
dGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KLSAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCBhbXQsIG9i
amVjdHMpIHsKLQotICAgIGlmICh0aGlzLmlzRnJvemVuKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJS
T1I7Ci0KLSAgICAvLyBpZiB3ZSByZXBsYWNlZCBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBp
dGVtcywgdGhlbiBwYXNzIG9ubHkgdGhlCi0gICAgLy8gcmVwbGFjZWQgcmFuZ2UuIE90aGVyd2lz
ZSwgcGFzcyB0aGUgZnVsbCByZW1haW5pbmcgYXJyYXkgbGVuZ3RoCi0gICAgLy8gc2luY2UgZXZl
cnl0aGluZyBoYXMgc2hpZnRlZAotICAgIHZhciBsZW4gPSBvYmplY3RzID8gZ2V0KG9iamVjdHMs
ICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdlKGlkeCwgYW10
LCBsZW4pOwotCi0gICAgaWYgKGxlbiA9PT0gMCkgewotICAgICAgdGhpcy5zcGxpY2UoaWR4LCBh
bXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXBsYWNlKHRoaXMsIGlkeCwgYW10LCBvYmplY3Rz
KTsKLSAgICB9Ci0KLSAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5nZShpZHgsIGFtdCwgbGVu
KTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvLyBJZiB5b3UgYXNrIGZvciBhbiB1bmtu
b3duIHByb3BlcnR5LCB0aGVuIHRyeSB0byBjb2xsZWN0IHRoZSB2YWx1ZQotICAvLyBmcm9tIG1l
bWJlciBpdGVtcy4KLSAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0g
ICAgdmFyIHJldDsvLyA9IHRoaXMucmVkdWNlZFByb3BlcnR5KGtleSwgdmFsdWUpIDsKLSAgICBp
ZiAoKHZhbHVlICE9PSB1bmRlZmluZWQpICYmIHJldCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICBy
ZXQgPSB0aGlzW2tleV0gPSB2YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0K
LSAgLy8gSWYgYnJvd3NlciBkaWQgbm90IGltcGxlbWVudCBpbmRleE9mIG5hdGl2ZWx5LCB0aGVu
IG92ZXJyaWRlIHdpdGgKLSAgLy8gc3BlY2lhbGl6ZWQgdmVyc2lvbgotICBpbmRleE9mOiBmdW5j
dGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4gPSB0aGlzLmxlbmd0aDsK
LQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSAwOwotICAgIGVsc2Ug
c3RhcnRBdCA9IChzdGFydEF0IDwgMCkgPyBNYXRoLmNlaWwoc3RhcnRBdCkgOiBNYXRoLmZsb29y
KHN0YXJ0QXQpOwotICAgIGlmIChzdGFydEF0IDwgMCkgc3RhcnRBdCArPSBsZW47Ci0KLSAgICBm
b3IoaWR4PXN0YXJ0QXQ7aWR4PGxlbjtpZHgrKykgewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0g
b2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIGxh
c3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4g
PSB0aGlzLmxlbmd0aDsKLQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQg
PSBsZW4tMTsKLSAgICBlbHNlIHN0YXJ0QXQgPSAoc3RhcnRBdCA8IDApID8gTWF0aC5jZWlsKHN0
YXJ0QXQpIDogTWF0aC5mbG9vcihzdGFydEF0KTsKLSAgICBpZiAoc3RhcnRBdCA8IDApIHN0YXJ0
QXQgKz0gbGVuOwotCi0gICAgZm9yKGlkeD1zdGFydEF0O2lkeD49MDtpZHgtLSkgewotICAgICAg
aWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJu
IC0xOwotICB9LAotCi0gIGNvcHk6IGZ1bmN0aW9uKGRlZXApIHsKLSAgICBpZiAoZGVlcCkgewot
ICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIEVtYmVyLmNvcHko
aXRlbSwgdHJ1ZSk7IH0pOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLnNsaWNlKCk7Ci0gIH0K
LX0pOwotCi0vLyBSZW1vdmUgYW55IG1ldGhvZHMgaW1wbGVtZW50ZWQgbmF0aXZlbHkgc28gd2Ug
ZG9uJ3Qgb3ZlcnJpZGUgdGhlbQotdmFyIGlnbm9yZSA9IFsnbGVuZ3RoJ107Ci1FbWJlci5FbnVt
ZXJhYmxlVXRpbHMuZm9yRWFjaChOYXRpdmVBcnJheS5rZXlzKCksIGZ1bmN0aW9uKG1ldGhvZE5h
bWUpIHsKLSAgaWYgKEFycmF5LnByb3RvdHlwZVttZXRob2ROYW1lXSkgaWdub3JlLnB1c2gobWV0
aG9kTmFtZSk7Ci19KTsKLQotaWYgKGlnbm9yZS5sZW5ndGg+MCkgewotICBOYXRpdmVBcnJheSA9
IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHkoTmF0aXZlQXJyYXksIGlnbm9yZSk7Ci19Ci0KLS8q
KgotICBUaGUgTmF0aXZlQXJyYXkgbWl4aW4gY29udGFpbnMgdGhlIHByb3BlcnRpZXMgbmVlZGVk
IHRvIHRvIG1ha2UgdGhlIG5hdGl2ZQotICBBcnJheSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJh
eSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQgQVBJcy4gVW5sZXNzIHlvdQotICBoYXZlIGBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkFycmF5YCBz
ZXQgdG8KLSAgZmFsc2UsIHRoaXMgd2lsbCBiZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIE90aGVy
d2lzZSB5b3UgY2FuIGFwcGx5IHRoZSBtaXhpbgotICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVt
YmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlYC4KLQotICBAY2xhc3MgTmF0aXZlQXJyYXkKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5NdXRhYmxlQXJyYXkKLSAgQHVzZXMgRW1iZXIu
T2JzZXJ2YWJsZQotICBAdXNlcyBFbWJlci5Db3B5YWJsZQotKi8KLUVtYmVyLk5hdGl2ZUFycmF5
ID0gTmF0aXZlQXJyYXk7Ci0KLS8qKgotICBDcmVhdGVzIGFuIGBFbWJlci5OYXRpdmVBcnJheWAg
ZnJvbSBhbiBBcnJheSBsaWtlIG9iamVjdC4KLSAgRG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5h
bCBvYmplY3QuIEVtYmVyLkEgaXMgbm90IG5lZWRlZCBpZgotICBgRW1iZXIuRVhURU5EX1BST1RP
VFlQRVNgIGlzIGB0cnVlYCAodGhlIGRlZmF1bHQgdmFsdWUpLiBIb3dldmVyLAotICBpdCBpcyBy
ZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgRW1iZXIuQSB3aGVuIGNyZWF0aW5nIGFkZG9ucyBmb3IK
LSAgZW1iZXIgb3Igd2hlbiB5b3UgY2FuIG5vdCBndWFyYW50ZWUgdGhhdCBgRW1iZXIuRVhURU5E
X1BST1RPVFlQRVNgCi0gIHdpbGwgYmUgYHRydWVgLgotCi0gIEV4YW1wbGUKLQotICBgYGBqcwot
ICB2YXIgUGFnaW5hdGlvbiA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7Ci0gICAgdGFn
TmFtZTogJ3VsJywKLSAgICBjbGFzc05hbWVzOiBbJ3BhZ2luYXRpb24nXSwKLSAgICBpbml0OiBm
dW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgICBpZiAoIXRoaXMuZ2V0KCdj
b250ZW50JykpIHsKLSAgICAgICAgdGhpcy5zZXQoJ2NvbnRlbnQnLCBFbWJlci5BKFtdKSk7Ci0g
ICAgICB9Ci0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBBCi0gIEBmb3IgRW1iZXIK
LSAgQHJldHVybiB7RW1iZXIuTmF0aXZlQXJyYXl9Ci0qLwotRW1iZXIuQSA9IGZ1bmN0aW9uKGFy
cikgewotICBpZiAoYXJyID09PSB1bmRlZmluZWQpIHsgYXJyID0gW107IH0KLSAgcmV0dXJuIEVt
YmVyLkFycmF5LmRldGVjdChhcnIpID8gYXJyIDogRW1iZXIuTmF0aXZlQXJyYXkuYXBwbHkoYXJy
KTsKLX07Ci0KLS8qKgotICBBY3RpdmF0ZXMgdGhlIG1peGluIG9uIHRoZSBBcnJheS5wcm90b3R5
cGUgaWYgbm90IGFscmVhZHkgYXBwbGllZC4gQ2FsbGluZwotICB0aGlzIG1ldGhvZCBtb3JlIHRo
YW4gb25jZSBpcyBzYWZlLiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gZW1iZXIgaXMgbG9hZGVk
Ci0gIHVubGVzcyB5b3UgaGF2ZSBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUy5BcnJheWAKLSAgc2V0IHRvIGBmYWxzZWAuCi0KLSAgRXhhbXBsZQot
Ci0gIGBgYGpzCi0gIGlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewotICAgIEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2
YXRlKCk7Ci0gIH0KLSAgYGBgCi0KLSAgQG1ldGhvZCBhY3RpdmF0ZQotICBAZm9yIEVtYmVyLk5h
dGl2ZUFycmF5Ci0gIEBzdGF0aWMKLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5OYXRpdmVB
cnJheS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkgewotICBOYXRpdmVBcnJheS5hcHBseShBcnJheS5w
cm90b3R5cGUpOwotCi0gIEVtYmVyLkEgPSBmdW5jdGlvbihhcnIpIHsgcmV0dXJuIGFyciB8fCBb
XTsgfTsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewotICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0
ZSgpOwotfQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwg
c2V0ID0gRW1iZXIuc2V0LCBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwgaXNOb25lID0gRW1iZXIu
aXNOb25lLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwotCi0vKioKLSAgQW4gdW5vcmRlcmVkIGNv
bGxlY3Rpb24gb2Ygb2JqZWN0cy4KLQotICBBIFNldCB3b3JrcyBhIGJpdCBsaWtlIGFuIGFycmF5
IGV4Y2VwdCB0aGF0IGl0cyBpdGVtcyBhcmUgbm90IG9yZGVyZWQuIFlvdQotICBjYW4gY3JlYXRl
IGEgc2V0IHRvIGVmZmljaWVudGx5IHRlc3QgZm9yIG1lbWJlcnNoaXAgZm9yIGFuIG9iamVjdC4g
WW91IGNhbgotICBhbHNvIGl0ZXJhdGUgdGhyb3VnaCBhIHNldCBqdXN0IGxpa2UgYW4gYXJyYXks
IGV2ZW4gYWNjZXNzaW5nIG9iamVjdHMgYnkKLSAgaW5kZXgsIGhvd2V2ZXIgdGhlcmUgaXMgbm8g
Z3VhcmFudGVlIGFzIHRvIHRoZWlyIG9yZGVyLgotCi0gIEFsbCBTZXRzIGFyZSBvYnNlcnZhYmxl
IHZpYSB0aGUgRW51bWVyYWJsZSBPYnNlcnZlciBBUEkgLSB3aGljaCB3b3JrcwotICBvbiBhbnkg
ZW51bWVyYWJsZSBvYmplY3QgaW5jbHVkaW5nIGJvdGggU2V0cyBhbmQgQXJyYXlzLgotCi0gICMj
IENyZWF0aW5nIGEgU2V0Ci0KLSAgWW91IGNhbiBjcmVhdGUgYSBzZXQgbGlrZSB5b3Ugd291bGQg
bW9zdCBvYmplY3RzIHVzaW5nCi0gIGBuZXcgRW1iZXIuU2V0KClgLiBNb3N0IG5ldyBzZXRzIHlv
dSBjcmVhdGUgd2lsbCBiZSBlbXB0eSwgYnV0IHlvdSBjYW4KLSAgYWxzbyBpbml0aWFsaXplIHRo
ZSBzZXQgd2l0aCBzb21lIGNvbnRlbnQgYnkgcGFzc2luZyBhbiBhcnJheSBvciBvdGhlcgotICBl
bnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gdGhlIGNvbnN0cnVjdG9yLgotCi0gIEZpbmFsbHksIHlv
dSBjYW4gcGFzcyBpbiBhbiBleGlzdGluZyBzZXQgYW5kIHRoZSBzZXQgd2lsbCBiZSBjb3BpZWQu
IFlvdQotICBjYW4gYWxzbyBjcmVhdGUgYSBjb3B5IG9mIGEgc2V0IGJ5IGNhbGxpbmcgYEVtYmVy
LlNldCNjb3B5KClgLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgLy8gY3JlYXRlcyBhIG5ldyBlbXB0
eSBzZXQKLSAgdmFyIGZvdW5kTmFtZXMgPSBuZXcgRW1iZXIuU2V0KCk7Ci0KLSAgLy8gY3JlYXRl
cyBhIHNldCB3aXRoIGZvdXIgbmFtZXMgaW4gaXQuCi0gIHZhciBuYW1lcyA9IG5ldyBFbWJlci5T
ZXQoWyJDaGFybGVzIiwgIlRvbSIsICJKdWFuIiwgIkFsZXgiXSk7IC8vIDpQCi0KLSAgLy8gY3Jl
YXRlcyBhIGNvcHkgb2YgdGhlIG5hbWVzIHNldC4KLSAgdmFyIG5hbWVzQ29weSA9IG5ldyBFbWJl
ci5TZXQobmFtZXMpOwotCi0gIC8vIHNhbWUgYXMgYWJvdmUuCi0gIHZhciBhbm90aGVyTmFtZXND
b3B5ID0gbmFtZXMuY29weSgpOwotICBgYGAKLQotICAjIyBBZGRpbmcvUmVtb3ZpbmcgT2JqZWN0
cwotCi0gIFlvdSBnZW5lcmFsbHkgYWRkIG9yIHJlbW92ZSBvYmplY3RzIGZyb20gYSBzZXQgdXNp
bmcgYGFkZCgpYCBvcgotICBgcmVtb3ZlKClgLiBZb3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBvYmpl
Y3QgaW5jbHVkaW5nIHByaW1pdGl2ZXMgc3VjaCBhcwotICBudW1iZXJzLCBzdHJpbmdzLCBhbmQg
Ym9vbGVhbnMuCi0KLSAgVW5saWtlIGFycmF5cywgb2JqZWN0cyBjYW4gb25seSBleGlzdCBvbmUg
dGltZSBpbiBhIHNldC4gSWYgeW91IGNhbGwgYGFkZCgpYAotICBvbiBhIHNldCB3aXRoIHRoZSBz
YW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIG9iamVjdCB3aWxsIG9ubHkgYmUgYWRkZWQK
LSAgb25jZS4gTGlrZXdpc2UsIGNhbGxpbmcgYHJlbW92ZSgpYCB3aXRoIHRoZSBzYW1lIG9iamVj
dCBtdWx0aXBsZSB0aW1lcyB3aWxsCi0gIHJlbW92ZSB0aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1l
IGFuZCBoYXZlIG5vIGVmZmVjdCBvbiBmdXR1cmUgY2FsbHMgdW50aWwKLSAgeW91IGFkZCB0aGUg
b2JqZWN0IHRvIHRoZSBzZXQgYWdhaW4uCi0KLSAgTk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3Zl
IGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhIHNldC4gQW55IGF0dGVtcHQgdG8gZG8KLSAgc28g
d2lsbCBiZSBpZ25vcmVkLgotCi0gIEluIGFkZGl0aW9uIHRvIGFkZC9yZW1vdmUgeW91IGNhbiBh
bHNvIGNhbGwgYHB1c2goKWAvYHBvcCgpYC4gUHVzaCBiZWhhdmVzCi0gIGp1c3QgbGlrZSBgYWRk
KClgIGJ1dCBgcG9wKClgLCB1bmxpa2UgYHJlbW92ZSgpYCB3aWxsIHBpY2sgYW4gYXJiaXRyYXJ5
Ci0gIG9iamVjdCwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXQuIFRoaXMgaXMgYSBnb29kIHdheSB0
byB1c2UgYSBzZXQgYXMgYSBqb2IKLSAgcXVldWUgd2hlbiB5b3UgZG9uJ3QgY2FyZSB3aGljaCBv
cmRlciB0aGUgam9icyBhcmUgZXhlY3V0ZWQgaW4uCi0KLSAgIyMgVGVzdGluZyBmb3IgYW4gT2Jq
ZWN0Ci0KLSAgVG8gdGVzdCBmb3IgYW4gb2JqZWN0J3MgcHJlc2VuY2UgaW4gYSBzZXQgeW91IHNp
bXBseSBjYWxsCi0gIGBFbWJlci5TZXQjY29udGFpbnMoKWAuCi0KLSAgIyMgT2JzZXJ2aW5nIGNo
YW5nZXMKLQotICBXaGVuIHVzaW5nIGBFbWJlci5TZXRgLCB5b3UgY2FuIG9ic2VydmUgdGhlIGAi
W10iYCBwcm9wZXJ0eSB0byBiZQotICBhbGVydGVkIHdoZW5ldmVyIHRoZSBjb250ZW50IGNoYW5n
ZXMuIFlvdSBjYW4gYWxzbyBhZGQgYW4gZW51bWVyYWJsZQotICBvYnNlcnZlciB0byB0aGUgc2V0
IHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpZmljIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQgYW5kCi0g
IHJlbW92ZWQgZnJvbSB0aGUgc2V0LiBTZWUgW0VtYmVyLkVudW1lcmFibGVdKC9hcGkvY2xhc3Nl
cy9FbWJlci5FbnVtZXJhYmxlLmh0bWwpCi0gIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGVudW1l
cmFibGVzLgotCi0gIFRoaXMgaXMgb2Z0ZW4gdW5oZWxwZnVsLiBJZiB5b3UgYXJlIGZpbHRlcmlu
ZyBzZXRzIG9mIG9iamVjdHMsIGZvciBpbnN0YW5jZSwKLSAgaXQgaXMgdmVyeSBpbmVmZmljaWVu
dCB0byByZS1maWx0ZXIgYWxsIG9mIHRoZSBpdGVtcyBlYWNoIHRpbWUgdGhlIHNldAotICBjaGFu
Z2VzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91IGNvdWxkIGp1c3QgYWRqdXN0IHRoZSBmaWx0
ZXJlZCBzZXQgYmFzZWQKLSAgb24gd2hhdCB3YXMgY2hhbmdlZCBvbiB0aGUgb3JpZ2luYWwgc2V0
LiBUaGUgc2FtZSBpc3N1ZSBhcHBsaWVzIHRvIG1lcmdpbmcKLSAgc2V0cywgYXMgd2VsbC4KLQot
ICAjIyBPdGhlciBNZXRob2RzCi0KLSAgYEVtYmVyLlNldGAgcHJpbWFyeSBpbXBsZW1lbnRzIG90
aGVyIG1peGluIEFQSXMuIEZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZQotICBvbiB0aGUgbWV0aG9k
cyB5b3Ugd2lsbCB1c2Ugd2l0aCBgRW1iZXIuU2V0YCwgcGxlYXNlIGNvbnN1bHQgdGhlc2UgbWl4
aW5zLgotICBUaGUgbW9zdCB1c2VmdWwgb25lcyB3aWxsIGJlIGBFbWJlci5FbnVtZXJhYmxlYCBh
bmQKLSAgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlYCB3aGljaCBpbXBsZW1lbnQgbW9zdCBvZiB0
aGUgY29tbW9uIGl0ZXJhdG9yCi0gIG1ldGhvZHMgeW91IGFyZSB1c2VkIHRvIG9uIEFycmF5Lgot
Ci0gIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgRW1iZXIuQ29weWFibGVgIGFuZCBg
RW1iZXIuRnJlZXphYmxlYAotICBBUElzIG9uIGBFbWJlci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBz
ZXQgaXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIgYmUKLSAgbW9kaWZpZWQuIFRoZSBiZW5lZml0
IG9mIHRoaXMgaXMgdGhhdCB3aGVuIHlvdSBjYWxsIGBmcm96ZW5Db3B5KClgIG9uIGl0LAotICBF
bWJlciB3aWxsIGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIHNldC4gVGhpcyBhbGxvd3MgeW91
IHRvIHdyaXRlCi0gIGNvZGUgdGhhdCBjYW4ga25vdyB3aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1
bmRlcmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKLSAgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0KLSAg
QGNsYXNzIFNldAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNvcmVPYmpl
Y3QKLSAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAgQHVzZXMgRW1iZXIuQ29weWFi
bGUKLSAgQHVzZXMgRW1iZXIuRnJlZXphYmxlCi0gIEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJl
ci5TZXQgPSBFbWJlci5Db3JlT2JqZWN0LmV4dGVuZChFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwg
RW1iZXIuQ29weWFibGUsIEVtYmVyLkZyZWV6YWJsZSwKLSAgewotCi0gIC8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gSU1Q
TEVNRU5UIEVOVU1FUkFCTEUgQVBJUwotICAvLwotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVydHkg
d2lsbCBjaGFuZ2UgYXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzZXQgY2hhbmdlcy4K
LQotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlwZSBudW1iZXIKLSAgICBAZGVmYXVsdCAw
Ci0gICovCi0gIGxlbmd0aDogMCwKLQotICAvKioKLSAgICBDbGVhcnMgdGhlIHNldC4gVGhpcyBp
cyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmV1c2UgYW4gZXhpc3Rpbmcgc2V0Ci0gICAgd2l0aG91
dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNv
bG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xv
cnMubGVuZ3RoOyAgLy8gMwotICAgIGNvbG9ycy5jbGVhcigpOwotICAgIGNvbG9ycy5sZW5ndGg7
ICAvLyAwCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNsZWFyCi0gICAgQHJldHVybiB7RW1iZXIu
U2V0fSBBbiBlbXB0eSBTZXQKLSAgKi8KLSAgY2xlYXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0
aGlzLmlzRnJvemVuKSB7IHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1Ip
OyB9Ci0KLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICBpZiAobGVuID09
PSAwKSB7IHJldHVybiB0aGlzOyB9Ci0KLSAgICB2YXIgZ3VpZDsKLQotICAgIHRoaXMuZW51bWVy
YWJsZUNvbnRlbnRXaWxsQ2hhbmdlKGxlbiwgMCk7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hh
bmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOwotICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCAnbGFzdE9iamVjdCcpOwotCi0gICAgZm9yICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHsK
LSAgICAgIGd1aWQgPSBndWlkRm9yKHRoaXNbaV0pOwotICAgICAgZGVsZXRlIHRoaXNbZ3VpZF07
Ci0gICAgICBkZWxldGUgdGhpc1tpXTsKLSAgICB9Ci0KLSAgICBzZXQodGhpcywgJ2xlbmd0aCcs
IDApOwotCi0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7
Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0
aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKGxlbiwgMCk7Ci0KLSAgICByZXR1cm4gdGhp
czsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBvYmplY3Qg
aXMgYWxzbyBhbiBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgdGhlCi0gICAgc2FtZSBvYmplY3Rz
IGFzIHRoZSByZWNlaXZlci4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdLAotICAgICAgICBzYW1lX2NvbG9ycyA9IG5ldyBFbWJl
ci5TZXQoY29sb3JzKTsKLQotICAgIHNhbWVfY29sb3JzLmlzRXF1YWwoY29sb3JzKTsgICAgICAg
ICAgICAgICAvLyB0cnVlCi0gICAgc2FtZV9jb2xvcnMuaXNFcXVhbChbInB1cnBsZSIsICJicm93
biJdKTsgIC8vIGZhbHNlCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGlzRXF1YWwKLSAgICBAcGFy
YW0ge0VtYmVyLlNldH0gb2JqIHRoZSBvdGhlciBvYmplY3QuCi0gICAgQHJldHVybiB7Qm9vbGVh
bn0KLSAgKi8KLSAgaXNFcXVhbDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgLy8gZmFpbCBmYXN0Ci0g
ICAgaWYgKCFFbWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmopKSByZXR1cm4gZmFsc2U7Ci0KLSAg
ICB2YXIgbG9jID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICBpZiAoZ2V0KG9iaiwgJ2xlbmd0
aCcpICE9PSBsb2MpIHJldHVybiBmYWxzZTsKLQotICAgIHdoaWxlKC0tbG9jID49IDApIHsKLSAg
ICAgIGlmICghb2JqLmNvbnRhaW5zKHRoaXNbbG9jXSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQotICAvKioKLSAgICBBZGRzIGFuIG9iamVjdCB0byB0
aGUgc2V0LiBPbmx5IG5vbi1gbnVsbGAgb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gYSBzZXQKLSAg
ICBhbmQgdGhvc2UgY2FuIG9ubHkgYmUgYWRkZWQgb25jZS4gSWYgdGhlIG9iamVjdCBpcyBhbHJl
YWR5IGluIHRoZSBzZXQgb3IKLSAgICB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgdGhpcyBtZXRo
b2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJl
ci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMuYWRkKCJibHVlIik7
ICAgICAvLyBbImJsdWUiXQotICAgIGNvbG9ycy5hZGQoImJsdWUiKTsgICAgIC8vIFsiYmx1ZSJd
Ci0gICAgY29sb3JzLmFkZCgicmVkIik7ICAgICAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgY29s
b3JzLmFkZChudWxsKTsgICAgICAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgY29sb3JzLmFkZCh1
bmRlZmluZWQpOyAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFk
ZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBhZGQuCi0gICAgQHJldHVy
biB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KLSAgKi8KLSAgYWRkOiBFbWJlci5hbGlhc01l
dGhvZCgnYWRkT2JqZWN0JyksCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyB0aGUgb2JqZWN0IGZyb20g
dGhlIHNldCBpZiBpdCBpcyBmb3VuZC4gSWYgeW91IHBhc3MgYSBgbnVsbGAgdmFsdWUKLSAgICBv
ciBhbiBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG5vdCBpbiB0aGUgc2V0LCB0aGlzIG1ldGhvZCB3
aWxsIGhhdmUgbm8KLSAgICBlZmZlY3QuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRh
YmxlRW51bWVyYWJsZS5yZW1vdmVPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
dmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAg
ICBjb2xvcnMucmVtb3ZlKCJyZWQiKTsgICAgIC8vIFsiYmx1ZSIsICJncmVlbiJdCi0gICAgY29s
b3JzLnJlbW92ZSgicHVycGxlIik7ICAvLyBbImJsdWUiLCAiZ3JlZW4iXQotICAgIGNvbG9ycy5y
ZW1vdmUobnVsbCk7ICAgICAgLy8gWyJibHVlIiwgImdyZWVuIl0KLSAgICBgYGAKLQotICAgIEBt
ZXRob2QgcmVtb3ZlCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJlbW92
ZQotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICovCi0gIHJlbW92
ZTogRW1iZXIuYWxpYXNNZXRob2QoJ3JlbW92ZU9iamVjdCcpLAotCi0gIC8qKgotICAgIFJlbW92
ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9yIGBudWxs
YCBpZiBpdCdzIGVtcHR5LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBu
ZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAi
Ymx1ZSIKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAiZ3JlZW4iCi0gICAgY29sb3JzLnBvcCgpOyAg
Ly8gbnVsbAotICAgIGBgYAotCi0gICAgQG1ldGhvZCBwb3AKLSAgICBAcmV0dXJuIHtPYmplY3R9
IFRoZSByZW1vdmVkIG9iamVjdCBmcm9tIHRoZSBzZXQgb3IgbnVsbC4KLSAgKi8KLSAgcG9wOiBm
dW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICB2YXIgb2JqID0gdGhpcy5sZW5ndGgg
PiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51bGw7Ci0gICAgdGhpcy5yZW1vdmUob2JqKTsK
LSAgICByZXR1cm4gb2JqOwotICB9LAotCi0gIC8qKgotICAgIEluc2VydHMgdGhlIGdpdmVuIG9i
amVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQuIEl0IHJldHVybnMKLSAgICB0aGUgc2V0IGl0
c2VsZi4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJs
ZS5hZGRPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5l
dyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMucHVzaCgicmVkIik7ICAgLy8gWyJyZWQiXQotICAg
IGNvbG9ycy5wdXNoKCJncmVlbiIpOyAvLyBbInJlZCIsICJncmVlbiJdCi0gICAgY29sb3JzLnB1
c2goImJsdWUiKTsgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUiXQotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBwdXNoCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KLSAg
Ki8KLSAgcHVzaDogRW1iZXIuYWxpYXNNZXRob2QoJ2FkZE9iamVjdCcpLAotCi0gIC8qKgotICAg
IFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9y
IGBudWxsYCBpZiBpdCdzIGVtcHR5LgotCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBmb3IgYEVtYmVy
LlNldC5wb3AoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBF
bWJlci5TZXQoWyJncmVlbiIsICJibHVlIl0pOwotICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gImJs
dWUiCi0gICAgY29sb3JzLnNoaWZ0KCk7ICAvLyAiZ3JlZW4iCi0gICAgY29sb3JzLnNoaWZ0KCk7
ICAvLyBudWxsCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNoaWZ0Ci0gICAgQHJldHVybiB7T2Jq
ZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3QgZnJvbSB0aGUgc2V0IG9yIG51bGwuCi0gICovCi0gIHNo
aWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncG9wJyksCi0KLSAgLyoqCi0gICAgSW5zZXJ0cyB0aGUg
Z2l2ZW4gb2JqZWN0IG9uIHRvIHRoZSBlbmQgb2YgdGhlIHNldC4gSXQgcmV0dXJucwotICAgIHRo
ZSBzZXQgaXRzZWxmLgotCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBvZiBgRW1iZXIuU2V0LnB1c2go
KWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldCgp
OwotICAgIGNvbG9ycy51bnNoaWZ0KCJyZWQiKTsgICAgLy8gWyJyZWQiXQotICAgIGNvbG9ycy51
bnNoaWZ0KCJncmVlbiIpOyAgLy8gWyJyZWQiLCAiZ3JlZW4iXQotICAgIGNvbG9ycy51bnNoaWZ0
KCJibHVlIik7ICAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHVuc2hpZnQKLSAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgot
ICAqLwotICB1bnNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncHVzaCcpLAotCi0gIC8qKgotICAg
IEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxlIHRvIHRoZSBzZXQuCi0K
LSAgICBUaGlzIGlzIGFuIGFsaWFzIG9mIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmpl
Y3RzKClgCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5T
ZXQoKTsKLSAgICBjb2xvcnMuYWRkRWFjaChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOyAgLy8g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFkZEVhY2gK
LSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRk
LgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICovCi0gIGFkZEVh
Y2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmplY3RzJyksCi0KLSAgLyoqCi0gICAgUmVtb3Zl
cyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFibGUgdG8gdGhlIHNldC4KLQotICAg
IFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlLnJlbW92ZU9iamVj
dHMoKWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNl
dChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOwotICAgIGNvbG9ycy5yZW1vdmVFYWNoKFsicmVk
IiwgImJsdWUiXSk7ICAvLyAgWyJncmVlbiJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbW92
ZUVhY2gKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMg
dG8gcmVtb3ZlLgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICov
Ci0gIHJlbW92ZUVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZW1vdmVPYmplY3RzJyksCi0KLSAg
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgotICAvLyBQUklWQVRFIEVOVU1FUkFCTEUgU1VQUE9SVAotICAvLwotCi0gIGluaXQ6IGZ1
bmN0aW9uKGl0ZW1zKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICBpZiAoaXRlbXMpIHRoaXMu
YWRkT2JqZWN0cyhpdGVtcyk7Ci0gIH0sCi0KLSAgLy8gaW1wbGVtZW50IEVtYmVyLkVudW1lcmFi
bGUKLSAgbmV4dE9iamVjdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRoaXNbaWR4XTsK
LSAgfSwKLQotICAvLyBtb3JlIG9wdGltaXplZCB2ZXJzaW9uCi0gIGZpcnN0T2JqZWN0OiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhp
c1swXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0KLSAgLy8gbW9yZSBvcHRpbWl6ZWQgdmVyc2lvbgot
ICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhp
cy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0K
LSAgLy8gaW1wbGVtZW50cyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQotICBhZGRPYmplY3Q6IGZ1
bmN0aW9uKG9iaikgewotICAgIGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHRocm93IG5ldyBF
bWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1IpOwotICAgIGlmIChpc05vbmUob2JqKSkgcmV0
dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQotICAgIHZhciBndWlkID0gZ3VpZEZvcihvYmop
LAotICAgICAgICBpZHggID0gdGhpc1tndWlkXSwKLSAgICAgICAgbGVuICA9IGdldCh0aGlzLCAn
bGVuZ3RoJyksCi0gICAgICAgIGFkZGVkIDsKLQotICAgIGlmIChpZHg+PTAgJiYgaWR4PGxlbiAm
JiAodGhpc1tpZHhdID09PSBvYmopKSByZXR1cm4gdGhpczsgLy8gYWRkZWQKLQotICAgIGFkZGVk
ID0gW29ial07Ci0KLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShudWxsLCBh
ZGRlZCk7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7
Ci0KLSAgICBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIHRoaXNbZ3VpZF0gPSBsZW47
Ci0gICAgdGhpc1tsZW5dID0gb2JqOwotICAgIHNldCh0aGlzLCAnbGVuZ3RoJywgbGVuKzEpOwot
Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0
aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKG51bGwsIGFkZGVkKTsKLQotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIC8vIGltcGxlbWVudHMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUK
LSAgcmVtb3ZlT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0Zy
b3plbicpKSB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICBp
ZiAoaXNOb25lKG9iaikpIHJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCi0KLSAgICB2YXIg
Z3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAgICAgICAgaWR4ICA9IHRoaXNbZ3VpZF0sCi0gICAgICAg
IGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGlzRmlyc3QgPSBpZHggPT09IDAs
Ci0gICAgICAgIGlzTGFzdCA9IGlkeCA9PT0gbGVuLTEsCi0gICAgICAgIGxhc3QsIHJlbW92ZWQ7
Ci0KLQotICAgIGlmIChpZHg+PTAgJiYgaWR4PGxlbiAmJiAodGhpc1tpZHhdID09PSBvYmopKSB7
Ci0gICAgICByZW1vdmVkID0gW29ial07Ci0KLSAgICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRX
aWxsQ2hhbmdlKHJlbW92ZWQsIG51bGwpOwotICAgICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOyB9Ci0gICAgICBpZiAoaXNMYXN0
KSAgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsgfQotCi0g
ICAgICAvLyBzd2FwIGl0ZW1zIC0gYmFzaWNhbGx5IG1vdmUgdGhlIGl0ZW0gdG8gdGhlIGVuZCBz
byBpdCBjYW4gYmUgcmVtb3ZlZAotICAgICAgaWYgKGlkeCA8IGxlbi0xKSB7Ci0gICAgICAgIGxh
c3QgPSB0aGlzW2xlbi0xXTsKLSAgICAgICAgdGhpc1tpZHhdID0gbGFzdDsKLSAgICAgICAgdGhp
c1tndWlkRm9yKGxhc3QpXSA9IGlkeDsKLSAgICAgIH0KLQotICAgICAgZGVsZXRlIHRoaXNbZ3Vp
ZF07Ci0gICAgICBkZWxldGUgdGhpc1tsZW4tMV07Ci0gICAgICBzZXQodGhpcywgJ2xlbmd0aCcs
IGxlbi0xKTsKLQotICAgICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo
dGhpcywgJ2ZpcnN0T2JqZWN0Jyk7IH0KLSAgICAgIGlmIChpc0xhc3QpICB7IEVtYmVyLnByb3Bl
cnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7IH0KLSAgICAgIHRoaXMuZW51bWVyYWJs
ZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRo
aXM7Ci0gIH0sCi0KLSAgLy8gb3B0aW1pemVkIHZlcnNpb24KLSAgY29udGFpbnM6IGZ1bmN0aW9u
KG9iaikgewotICAgIHJldHVybiB0aGlzW2d1aWRGb3Iob2JqKV0+PTA7Ci0gIH0sCi0KLSAgY29w
eTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzLmNvbnN0cnVjdG9yLCByZXQgPSBuZXcg
QygpLCBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIHNldChyZXQsICdsZW5ndGgnLCBs
b2MpOwotICAgIHdoaWxlKC0tbG9jPj0wKSB7Ci0gICAgICByZXRbbG9jXSA9IHRoaXNbbG9jXTsK
LSAgICAgIHJldFtndWlkRm9yKHRoaXNbbG9jXSldID0gbG9jOwotICAgIH0KLSAgICByZXR1cm4g
cmV0OwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuID0gdGhp
cy5sZW5ndGgsIGlkeCwgYXJyYXkgPSBbXTsKLSAgICBmb3IoaWR4ID0gMDsgaWR4IDwgbGVuOyBp
ZHgrKykgewotICAgICAgYXJyYXlbaWR4XSA9IHRoaXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJu
IGZtdCgiRW1iZXIuU2V0PCVAPiIsIFthcnJheS5qb2luKCcsJyldKTsKLSAgfQotCi19KTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBEZWZlcnJlZE1peGluID0gRW1iZXIuRGVm
ZXJyZWRNaXhpbiwgLy8gbWl4aW5zL2RlZmVycmVkCi0gICAgZ2V0ID0gRW1iZXIuZ2V0OwotCi12
YXIgRGVmZXJyZWQgPSBFbWJlci5PYmplY3QuZXh0ZW5kKERlZmVycmVkTWl4aW4pOwotCi1EZWZl
cnJlZC5yZW9wZW5DbGFzcyh7Ci0gIHByb21pc2U6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5n
KSB7Ci0gICAgdmFyIGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7Ci0gICAgY2FsbGJhY2su
Y2FsbChiaW5kaW5nLCBkZWZlcnJlZCk7Ci0gICAgcmV0dXJuIGRlZmVycmVkOwotICB9Ci19KTsK
LQotRW1iZXIuRGVmZXJyZWQgPSBEZWZlcnJlZDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBmb3JFYWNoID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKLQotLyoqCi0g
IEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgbG9h
ZEhvb2tzID0gRW1iZXIuRU5WLkVNQkVSX0xPQURfSE9PS1MgfHwge307Ci12YXIgbG9hZGVkID0g
e307Ci0KLS8qKgotICBEZXRlY3RzIHdoZW4gYSBzcGVjaWZpYyBwYWNrYWdlIG9mIEVtYmVyIChl
LmcuICdFbWJlci5IYW5kbGViYXJzJykKLSAgaGFzIGZ1bGx5IGxvYWRlZCBhbmQgaXMgYXZhaWxh
YmxlIGZvciBleHRlbnNpb24uCi0KLSAgVGhlIHByb3ZpZGVkIGBjYWxsYmFja2Agd2lsbCBiZSBj
YWxsZWQgd2l0aCB0aGUgYG5hbWVgIHBhc3NlZAotICByZXNvbHZlZCBmcm9tIGEgc3RyaW5nIGlu
dG8gdGhlIG9iamVjdDoKLQotICBgYGAgamF2YXNjcmlwdAotICBFbWJlci5vbkxvYWQoJ0VtYmVy
LkhhbmRsZWJhcnMnIGZ1bmN0aW9uKGhiYXJzKXsKLSAgICBoYmFycy5yZWdpc3RlckhlbHBlcigu
Li4pOwotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBvbkxvYWQKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1lIG9mIGhvb2sKLSAgQHBhcmFtIGNhbGxiYWNrIHtGdW5j
dGlvbn0gY2FsbGJhY2sgdG8gYmUgY2FsbGVkCi0qLwotRW1iZXIub25Mb2FkID0gZnVuY3Rpb24o
bmFtZSwgY2FsbGJhY2spIHsKLSAgdmFyIG9iamVjdDsKLQotICBsb2FkSG9va3NbbmFtZV0gPSBs
b2FkSG9va3NbbmFtZV0gfHwgRW1iZXIuQSgpOwotICBsb2FkSG9va3NbbmFtZV0ucHVzaE9iamVj
dChjYWxsYmFjayk7Ci0KLSAgaWYgKG9iamVjdCA9IGxvYWRlZFtuYW1lXSkgewotICAgIGNhbGxi
YWNrKG9iamVjdCk7Ci0gIH0KLX07Ci0KLS8qKgotICBDYWxsZWQgd2hlbiBhbiBFbWJlci5qcyBw
YWNrYWdlIChlLmcgRW1iZXIuSGFuZGxlYmFycykgaGFzIGZpbmlzaGVkCi0gIGxvYWRpbmcuIFRy
aWdnZXJzIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBldmVudC4KLQotICBAbWV0
aG9kIHJ1bkxvYWRIb29rcwotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5h
bWUgb2YgaG9vawotICBAcGFyYW0gb2JqZWN0IHtPYmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNh
bGxiYWNrcwotKi8KLUVtYmVyLnJ1bkxvYWRIb29rcyA9IGZ1bmN0aW9uKG5hbWUsIG9iamVjdCkg
ewotICBsb2FkZWRbbmFtZV0gPSBvYmplY3Q7Ci0KLSAgaWYgKGxvYWRIb29rc1tuYW1lXSkgewot
ICAgIGZvckVhY2guY2FsbChsb2FkSG9va3NbbmFtZV0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0g
ICAgICBjYWxsYmFjayhvYmplY3QpOwotICAgIH0pOwotICB9Ci19OwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVt
YmVyLmdldDsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUK
LSovCi0KLS8qKgotICBgRW1iZXIuQ29udHJvbGxlck1peGluYCBwcm92aWRlcyBhIHN0YW5kYXJk
IGludGVyZmFjZSBmb3IgYWxsIGNsYXNzZXMgdGhhdAotICBjb21wb3NlIEVtYmVyJ3MgY29udHJv
bGxlciBsYXllcjogYEVtYmVyLkNvbnRyb2xsZXJgLAotICBgRW1iZXIuQXJyYXlDb250cm9sbGVy
YCwgYW5kIGBFbWJlci5PYmplY3RDb250cm9sbGVyYC4KLQotICBAY2xhc3MgQ29udHJvbGxlck1p
eGluCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgotKi8K
LUVtYmVyLkNvbnRyb2xsZXJNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5BY3Rpb25I
YW5kbGVyLCB7Ci0gIC8qIGR1Y2t0eXBlIGFzIGEgY29udHJvbGxlciAqLwotICBpc0NvbnRyb2xs
ZXI6IHRydWUsCi0KLSAgLyoqCi0gICAgVGhlIG9iamVjdCB0byB3aGljaCBhY3Rpb25zIGZyb20g
dGhlIHZpZXcgc2hvdWxkIGJlIHNlbnQuCi0KLSAgICBGb3IgZXhhbXBsZSwgd2hlbiBhIEhhbmRs
ZWJhcnMgdGVtcGxhdGUgdXNlcyB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciwKLSAgICBpdCB3aWxs
IGF0dGVtcHQgdG8gc2VuZCB0aGUgYWN0aW9uIHRvIHRoZSB2aWV3J3MgY29udHJvbGxlcidzIGB0
YXJnZXRgLgotCi0gICAgQnkgZGVmYXVsdCwgYSBjb250cm9sbGVyJ3MgYHRhcmdldGAgaXMgc2V0
IHRvIHRoZSByb3V0ZXIgYWZ0ZXIgaXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgYnkgYEVtYmVyLkFw
cGxpY2F0aW9uI2luaXRpYWxpemVgLgotCi0gICAgQHByb3BlcnR5IHRhcmdldAotICAgIEBkZWZh
dWx0IG51bGwKLSAgKi8KLSAgdGFyZ2V0OiBudWxsLAotCi0gIGNvbnRhaW5lcjogbnVsbCwKLQot
ICBwYXJlbnRDb250cm9sbGVyOiBudWxsLAotCi0gIHN0b3JlOiBudWxsLAotCi0gIG1vZGVsOiBF
bWJlci5jb21wdXRlZC5hbGlhcygnY29udGVudCcpLAotCi0gIGRlcHJlY2F0ZWRTZW5kSGFuZGxl
czogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHJldHVybiAhIXRoaXNbYWN0aW9uTmFtZV07
Ci0gIH0sCi0KLSAgZGVwcmVjYXRlZFNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5hbWUpIHsKLSAgICB2
YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBFbWJlci5hc3NlcnQo
JycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSArICIgYnV0IGl0IGlz
IG5vdCBhIGZ1bmN0aW9uIiwgdHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicp
OwotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGltcGxlbWVudGVkIGRpcmVj
dGx5IG9uIGNvbnRyb2xsZXJzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGFjdGlvbiBoYW5k
bGVycyBvbiBhbiBgYWN0aW9uc2Agb2JqZWN0ICgnICsgYWN0aW9uTmFtZSArICcgb24gJyArIHRo
aXMgKyAnKScsIGZhbHNlKTsKLSAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3Mp
OwotICAgIHJldHVybjsKLSAgfQotfSk7Ci0KLS8qKgotICBAY2xhc3MgQ29udHJvbGxlcgotICBA
bmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotICBAdXNlcyBFbWJlci5D
b250cm9sbGVyTWl4aW4KLSovCi1FbWJlci5Db250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZChFbWJlci5Db250cm9sbGVyTWl4aW4pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFi
bGVVdGlscy5mb3JFYWNoOwotCi0vKioKLSAgYEVtYmVyLlNvcnRhYmxlTWl4aW5gIHByb3ZpZGVz
IGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhcnJheSBwcm94aWVzCi0gIHRvIHNwZWNpZnkgYSBz
b3J0IG9yZGVyIGFuZCBtYWludGFpbiB0aGlzIHNvcnRpbmcgd2hlbiBvYmplY3RzIGFyZSBhZGRl
ZCwKLSAgcmVtb3ZlZCwgb3IgdXBkYXRlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBpbXBsaWNpdCBv
cmRlciBvZiB0aGVpciB1bmRlcmx5aW5nCi0gIGNvbnRlbnQgYXJyYXk6Ci0KLSAgYGBgamF2YXNj
cmlwdAotICBzb25ncyA9IFsKLSAgICB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGks
IE9iLUxhLURhJ30sCi0gICAge3RyYWNrTnVtYmVyOiAyLCB0aXRsZTogJ0JhY2sgaW4gdGhlIFUu
Uy5TLlIuJ30sCi0gICAge3RyYWNrTnVtYmVyOiAzLCB0aXRsZTogJ0dsYXNzIE9uaW9uJ30sCi0g
IF07Ci0KLSAgc29uZ3NDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSh7
Ci0gICAgY29udGVudDogc29uZ3MsCi0gICAgc29ydFByb3BlcnRpZXM6IFsndHJhY2tOdW1iZXIn
XSwKLSAgICBzb3J0QXNjZW5kaW5nOiB0cnVlCi0gIH0pOwotCi0gIHNvbmdzQ29udHJvbGxlci5n
ZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0
aGUgVS5TLlMuUi4nfQotCi0gIHNvbmdzQ29udHJvbGxlci5hZGRPYmplY3Qoe3RyYWNrTnVtYmVy
OiAxLCB0aXRsZTogJ0RlYXIgUHJ1ZGVuY2UnfSk7Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2Zp
cnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDEsIHRpdGxlOiAnRGVhciBQcnVkZW5jZSd9
Ci0gIGBgYAotCi0gIElmIHlvdSBhZGQgb3IgcmVtb3ZlIHRoZSBwcm9wZXJ0aWVzIHRvIHNvcnQg
Ynkgb3IgY2hhbmdlIHRoZSBzb3J0IGRpcmVjdGlvbiB0aGUgY29udGVudAotICBzb3J0IG9yZGVy
IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgc29u
Z3NDb250cm9sbGVyLnNldCgnc29ydFByb3BlcnRpZXMnLCBbJ3RpdGxlJ10pOwotICBzb25nc0Nv
bnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAn
QmFjayBpbiB0aGUgVS5TLlMuUi4nfQotCi0gIHNvbmdzQ29udHJvbGxlci50b2dnbGVQcm9wZXJ0
eSgnc29ydEFzY2VuZGluZycpOwotICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcp
OyAvLyB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGksIE9iLUxhLURhJ30KLSAgYGBg
Ci0KLSAgU29ydGFibGVNaXhpbiB3b3JrcyBieSBzb3J0aW5nIHRoZSBhcnJhbmdlZENvbnRlbnQg
YXJyYXksIHdoaWNoIGlzIHRoZSBhcnJheSB0aGF0Ci0gIGFycmF5UHJveHkgZGlzcGxheXMuIER1
ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB1bmRlcmx5aW5nICdjb250ZW50JyBhcnJheSBpcyBub3Qg
Y2hhbmdlZCwgdGhhdAotICBhcnJheSB3aWxsIG5vdCBkaXNwbGF5IHRoZSBzb3J0ZWQgbGlzdDoK
LQotICAgYGBgamF2YXNjcmlwdAotICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdjb250ZW50JykuZ2V0
KCdmaXJzdE9iamVjdCcpOyAvLyBSZXR1cm5zIHRoZSB1bnNvcnRlZCBvcmlnaW5hbCBjb250ZW50
Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7IC8vIFJldHVybnMgdGhlIHNv
cnRlZCBjb250ZW50LgotICBgYGAgCi0gIAotICBBbHRob3VnaCB0aGUgc29ydGVkIGNvbnRlbnQg
Y2FuIGFsc28gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYXJyYW5nZWRDb250ZW50IHByb3BlcnR5
LAotICBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgcHJveGllZCBjbGFzcyBhbmQgbm90IHRo
ZSBhcnJhbmdlZENvbnRlbnQgYXJyYXkgZGlyZWN0bHkuCi0KLSAgQGNsYXNzIFNvcnRhYmxlTWl4
aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQot
Ki8KLUVtYmVyLlNvcnRhYmxlTWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGUsIHsKLQotICAvKioKLSAgICBTcGVjaWZpZXMgd2hpY2ggcHJvcGVydGllcyBk
aWN0YXRlIHRoZSBhcnJhbmdlZENvbnRlbnQncyBzb3J0IG9yZGVyLgotCi0gICAgV2hlbiBzcGVj
aWZ5aW5nIG11bHRpcGxlIHByb3BlcnRpZXMgdGhlIHNvcnRpbmcgd2lsbCB1c2UgcHJvcGVydGll
cwotICAgIGZyb20gdGhlIGBzb3J0UHJvcGVydGllc2AgYXJyYXkgcHJpb3JpdGl6ZWQgZnJvbSBm
aXJzdCB0byBsYXN0LgotCi0gICAgQHByb3BlcnR5IHtBcnJheX0gc29ydFByb3BlcnRpZXMKLSAg
Ki8KLSAgc29ydFByb3BlcnRpZXM6IG51bGwsCi0KLSAgLyoqCi0gICAgU3BlY2lmaWVzIHRoZSBh
cnJhbmdlZENvbnRlbnQncyBzb3J0IGRpcmVjdGlvbgotCi0gICAgQHByb3BlcnR5IHtCb29sZWFu
fSBzb3J0QXNjZW5kaW5nCi0gICovCi0gIHNvcnRBc2NlbmRpbmc6IHRydWUsCi0KLSAgLyoqCi0g
ICAgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB0d28gdmFsdWVzLiBZb3UgY2FuIG92ZXJy
aWRlIHRoaXMgaWYgeW91Ci0gICAgd2FudCB0byBkbyBjdXN0b20gY29tcGFyaXNvbnMuIEZ1bmN0
aW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIGV4cGVjdGVkIGJ5Ci0gICAgQXJyYXkjc29ydCwgaS5l
LgotICAgICAgcmV0dXJuIDAgaWYgdGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBlcXVhbCwKLSAgICAg
IHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgc21hbGxl
ciB0aGFuIHRoZSBzZWNvbmQgb3IKLSAgICAgIHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIG90aGVy
d2lzZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbih4LHkpIHsgLy8gVGhlc2Ug
YXJlIGFzc3VtZWQgdG8gYmUgaW50ZWdlcnMKLSAgICAgIGlmICh4ID09PSB5KQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgIHJldHVybiB4IDwgeSA/IC0xIDogMTsKLSAgICB9Ci0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgc29ydEZ1bmN0aW9uCi0gICAgQHR5cGUge0Z1bmN0aW9ufQotICAgIEBk
ZWZhdWx0IEVtYmVyLmNvbXBhcmUKLSAgKi8KLSAgc29ydEZ1bmN0aW9uOiBFbWJlci5jb21wYXJl
LAotCi0gIG9yZGVyQnk6IGZ1bmN0aW9uKGl0ZW0xLCBpdGVtMikgewotICAgIHZhciByZXN1bHQg
PSAwLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMn
KSwKLSAgICAgICAgc29ydEFzY2VuZGluZyA9IGdldCh0aGlzLCAnc29ydEFzY2VuZGluZycpLAot
ICAgICAgICBzb3J0RnVuY3Rpb24gPSBnZXQodGhpcywgJ3NvcnRGdW5jdGlvbicpOwotCi0gICAg
RW1iZXIuYXNzZXJ0KCJ5b3UgbmVlZCB0byBkZWZpbmUgYHNvcnRQcm9wZXJ0aWVzYCIsICEhc29y
dFByb3BlcnRpZXMpOwotCi0gICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24ocHJv
cGVydHlOYW1lKSB7Ci0gICAgICBpZiAocmVzdWx0ID09PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9
IHNvcnRGdW5jdGlvbihnZXQoaXRlbTEsIHByb3BlcnR5TmFtZSksIGdldChpdGVtMiwgcHJvcGVy
dHlOYW1lKSk7Ci0gICAgICAgIGlmICgocmVzdWx0ICE9PSAwKSAmJiAhc29ydEFzY2VuZGluZykg
ewotICAgICAgICAgIHJlc3VsdCA9ICgtMSkgKiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAg
c29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAo
Y29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewotICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5j
dGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNv
cnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQ
cm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAg
ICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMu
X3N1cGVyKCk7Ci0gIH0sCi0KLSAgaXNTb3J0ZWQ6IEVtYmVyLmNvbXB1dGVkLmJvb2woJ3NvcnRQ
cm9wZXJ0aWVzJyksCi0KLSAgLyoqCi0gICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGFycmFuZ2Vk
Q29udGVudCBmcm9tIGFycmF5UHJveHkgaW4gb3JkZXIgdG8gc29ydCBieSBzb3J0RnVuY3Rpb24u
Ci0gICAgQWxzbyBzZXRzIHVwIG9ic2VydmVycyBmb3IgZWFjaCBzb3J0UHJvcGVydHkgb24gZWFj
aCBpdGVtIGluIHRoZSBjb250ZW50IEFycmF5LgotICAgIAotICAgIEBwcm9wZXJ0eSBhcnJhbmdl
ZENvbnRlbnQKLSAgKi8KLQotICBhcnJhbmdlZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkKCdjb250
ZW50JywgJ3NvcnRQcm9wZXJ0aWVzLkBlYWNoJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIGlzU29ydGVkID0g
Z2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlz
LCAnc29ydFByb3BlcnRpZXMnKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICBpZiAoY29u
dGVudCAmJiBpc1NvcnRlZCkgewotICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoKTsKLSAg
ICAgIGNvbnRlbnQuc29ydChmdW5jdGlvbihpdGVtMSwgaXRlbTIpIHsKLSAgICAgICAgcmV0dXJu
IHNlbGYub3JkZXJCeShpdGVtMSwgaXRlbTIpOwotICAgICAgfSk7Ci0gICAgICBmb3JFYWNoKGNv
bnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywg
ZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRl
bSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2Un
KTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICAgIHJldHVybiBFbWJl
ci5BKGNvbnRlbnQpOwotICAgIH0KLQotICAgIHJldHVybiBjb250ZW50OwotICB9KSwKLQotICBf
Y29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAg
c29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAo
Y29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewotICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5j
dGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNv
cnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQ
cm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAg
ICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotCi0gICAgdGhpcy5fc3VwZXIo
KTsKLSAgfSksCi0KLSAgc29ydEFzY2VuZGluZ1dpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2Vy
dmVyKCdzb3J0QXNjZW5kaW5nJywgZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fbGFzdFNvcnRBc2Nl
bmRpbmcgPSBnZXQodGhpcywgJ3NvcnRBc2NlbmRpbmcnKTsKLSAgfSksCi0KLSAgc29ydEFzY2Vu
ZGluZ0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ3NvcnRBc2NlbmRpbmcnLCBmdW5jdGlvbigp
IHsKLSAgICBpZiAoZ2V0KHRoaXMsICdzb3J0QXNjZW5kaW5nJykgIT09IHRoaXMuX2xhc3RTb3J0
QXNjZW5kaW5nKSB7Ci0gICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJh
bmdlZENvbnRlbnQnKTsKLSAgICAgIGFycmFuZ2VkQ29udGVudC5yZXZlcnNlT2JqZWN0cygpOwot
ICAgIH0KLSAgfSksCi0KLSAgY29udGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24oYXJyYXks
IGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgdmFyIGlzU29ydGVkID0gZ2V0
KHRoaXMsICdpc1NvcnRlZCcpOwotCi0gICAgaWYgKGlzU29ydGVkKSB7Ci0gICAgICB2YXIgYXJy
YW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLSAgICAgIHZhciBy
ZW1vdmVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlkeCwgaWR4K3JlbW92ZWRDb3VudCk7Ci0gICAg
ICB2YXIgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAg
ICAgIGZvckVhY2gocmVtb3ZlZE9iamVjdHMsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgYXJy
YW5nZWRDb250ZW50LnJlbW92ZU9iamVjdChpdGVtKTsKLQotICAgICAgICBmb3JFYWNoKHNvcnRQ
cm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKLSAgICAgICAgICBFbWJlci5yZW1v
dmVPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9w
ZXJ0eURpZENoYW5nZScpOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAgIH0sIHRoaXMpOwotICAg
IH0KLQotICAgIHJldHVybiB0aGlzLl9zdXBlcihhcnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFk
ZGVkQ291bnQpOwotICB9LAotCi0gIGNvbnRlbnRBcnJheURpZENoYW5nZTogZnVuY3Rpb24oYXJy
YXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgdmFyIGlzU29ydGVkID0g
Z2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlz
LCAnc29ydFByb3BlcnRpZXMnKTsKLQotICAgIGlmIChpc1NvcnRlZCkgewotICAgICAgdmFyIGFk
ZGVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlkeCwgaWR4K2FkZGVkQ291bnQpOwotCi0gICAgICBm
b3JFYWNoKGFkZGVkT2JqZWN0cywgZnVuY3Rpb24oaXRlbSkgewotICAgICAgICB0aGlzLmluc2Vy
dEl0ZW1Tb3J0ZWQoaXRlbSk7Ci0KLSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVu
Y3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRlbSwg
c29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2UnKTsK
LSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
dGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKLSAgfSwK
LQotICBpbnNlcnRJdGVtU29ydGVkOiBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIGFycmFuZ2Vk
Q29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7Ci0gICAgdmFyIGxlbmd0aCA9
IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKTsKLQotICAgIHZhciBpZHggPSB0aGlzLl9i
aW5hcnlTZWFyY2goaXRlbSwgMCwgbGVuZ3RoKTsKLSAgICBhcnJhbmdlZENvbnRlbnQuaW5zZXJ0
QXQoaWR4LCBpdGVtKTsKLSAgfSwKLQotICBjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5n
ZTogZnVuY3Rpb24oaXRlbSkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywg
J2FycmFuZ2VkQ29udGVudCcpLAotICAgICAgICBvbGRJbmRleCA9IGFycmFuZ2VkQ29udGVudC5p
bmRleE9mKGl0ZW0pLAotICAgICAgICBsZWZ0SXRlbSA9IGFycmFuZ2VkQ29udGVudC5vYmplY3RB
dChvbGRJbmRleCAtIDEpLAotICAgICAgICByaWdodEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2Jq
ZWN0QXQob2xkSW5kZXggKyAxKSwKLSAgICAgICAgbGVmdFJlc3VsdCA9IGxlZnRJdGVtICYmIHRo
aXMub3JkZXJCeShpdGVtLCBsZWZ0SXRlbSksCi0gICAgICAgIHJpZ2h0UmVzdWx0ID0gcmlnaHRJ
dGVtICYmIHRoaXMub3JkZXJCeShpdGVtLCByaWdodEl0ZW0pOwotCi0gICAgaWYgKGxlZnRSZXN1
bHQgPCAwIHx8IHJpZ2h0UmVzdWx0ID4gMCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92
ZU9iamVjdChpdGVtKTsKLSAgICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsKLSAgICB9
Ci0gIH0sCi0KLSAgX2JpbmFyeVNlYXJjaDogZnVuY3Rpb24oaXRlbSwgbG93LCBoaWdoKSB7Ci0g
ICAgdmFyIG1pZCwgbWlkSXRlbSwgcmVzLCBhcnJhbmdlZENvbnRlbnQ7Ci0KLSAgICBpZiAobG93
ID09PSBoaWdoKSB7Ci0gICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIGFycmFuZ2VkQ29u
dGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7Ci0KLSAgICBtaWQgPSBsb3cgKyBN
YXRoLmZsb29yKChoaWdoIC0gbG93KSAvIDIpOwotICAgIG1pZEl0ZW0gPSBhcnJhbmdlZENvbnRl
bnQub2JqZWN0QXQobWlkKTsKLQotICAgIHJlcyA9IHRoaXMub3JkZXJCeShtaWRJdGVtLCBpdGVt
KTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNo
KGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgICB9IGVsc2UgaWYgKHJlcyA+IDApIHsKLSAgICAgIHJl
dHVybiB0aGlzLl9iaW5hcnlTZWFyY2goaXRlbSwgbG93LCBtaWQpOwotICAgIH0KLQotICAgIHJl
dHVybiBtaWQ7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5mb3JFYWNoLAotICAgIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZTsK
LQotLyoqCi0gIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3Ug
dG8gcHVibGlzaCBhIGNvbGxlY3Rpb24gb2YKLSAgb2JqZWN0cyBzbyB0aGF0IHlvdSBjYW4gZWFz
aWx5IGJpbmQgdG8gdGhlIGNvbGxlY3Rpb24gZnJvbSBhIEhhbmRsZWJhcnMKLSAgYCNlYWNoYCBo
ZWxwZXIsIGFuIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIG9yIG90aGVyIGNvbnRyb2xsZXJzLgot
Ci0gIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYW4gYEFycmF5Q29udHJvbGxlcmAgaXMgdGhhdCB5
b3Ugb25seSBoYXZlIHRvIHNldCB1cAotICB5b3VyIHZpZXcgYmluZGluZ3Mgb25jZTsgdG8gY2hh
bmdlIHdoYXQncyBkaXNwbGF5ZWQsIHNpbXBseSBzd2FwIG91dCB0aGUKLSAgYGNvbnRlbnRgIHBy
b3BlcnR5IG9uIHRoZSBjb250cm9sbGVyLgotCi0gIEZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSB3
YW50ZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgaXRlbXMgZmV0Y2hlZCB2aWEgYW4gWEhSCi0gIHJl
cXVlc3QuIENyZWF0ZSBhbiBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCBhbmQgc2V0IGl0cyBgY29u
dGVudGAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5saXN0Q29udHJvbGxl
ciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVhdGUoKTsKLQotICAkLmdldCgncGVvcGxlLmpz
b24nLCBmdW5jdGlvbihkYXRhKSB7Ci0gICAgTXlBcHAubGlzdENvbnRyb2xsZXIuc2V0KCdjb250
ZW50JywgZGF0YSk7Ci0gIH0pOwotICBgYGAKLQotICBUaGVuLCBjcmVhdGUgYSB2aWV3IHRoYXQg
YmluZHMgdG8geW91ciBuZXcgY29udHJvbGxlcjoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2Vh
Y2ggTXlBcHAubGlzdENvbnRyb2xsZXJ9fQotICAgIHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19
Ci0gIHt7L2VhY2h9fQotICBgYGAKLQotICBBbHRob3VnaCB5b3UgYXJlIGJpbmRpbmcgdG8gdGhl
IGNvbnRyb2xsZXIsIHRoZSBiZWhhdmlvciBvZiB0aGlzIGNvbnRyb2xsZXIKLSAgaXMgdG8gcGFz
cyB0aHJvdWdoIGFueSBtZXRob2RzIG9yIHByb3BlcnRpZXMgdG8gdGhlIHVuZGVybHlpbmcgYXJy
YXkuIFRoaXMKLSAgY2FwYWJpbGl0eSBjb21lcyBmcm9tIGBFbWJlci5BcnJheVByb3h5YCwgd2hp
Y2ggdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tLgotCi0gIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBk
aXNwbGF5IGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aGluIHRoZSBib2R5IG9mIGFuCi0gIGAjZWFj
aGAgaGVscGVyIHRoYXQgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIGluIGBjb250ZW50
YCwgYnV0IGFyZSBub3QKLSAgcHJlc2VudCBvbiB0aG9zZSBpdGVtcy4gICBUbyBkbyB0aGlzLCBz
ZXQgYGl0ZW1Db250cm9sbGVyYCB0byB0aGUgbmFtZSBvZiBhCi0gIGNvbnRyb2xsZXIgKHByb2Jh
Ymx5IGFuIGBPYmplY3RDb250cm9sbGVyYCkgdGhhdCB3aWxsIHdyYXAgZWFjaCBpbmRpdmlkdWFs
IGl0ZW0uCi0KLSAgRm9yIGV4YW1wbGU6Ci0KLSAgYGBgaGFuZGxlYmFycwotICAgIHt7I2VhY2gg
cG9zdCBpbiBjb250cm9sbGVyfX0KLSAgICAgIDxsaT57e3RpdGxlfX0gKHt7dGl0bGVMZW5ndGh9
fSBjaGFyYWN0ZXJzKTwvbGk+Ci0gICAge3svZWFjaH19Ci0gIGBgYAotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgQXBwLlBvc3RzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQo
ewotICAgIGl0ZW1Db250cm9sbGVyOiAncG9zdCcKLSAgfSk7Ci0KLSAgQXBwLlBvc3RDb250cm9s
bGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIC8vIHRoZSBgdGl0bGVg
IHByb3BlcnR5IHdpbGwgYmUgcHJveGllZCB0byB0aGUgdW5kZXJseWluZyBwb3N0LgotCi0gICAg
dGl0bGVMZW5ndGg6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0aXRsZScp
Lmxlbmd0aDsKLSAgICB9LnByb3BlcnR5KCd0aXRsZScpCi0gIH0pOwotICBgYGAKLQotICBJbiBz
b21lIGNhc2VzIGl0IGlzIGhlbHBmdWwgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGBpdGVtQ29udHJv
bGxlcmAgZGVwZW5kaW5nCi0gIG9uIHRoZSBwYXJ0aWN1bGFyIGl0ZW0uICBTdWJjbGFzc2VzIGNh
biBkbyB0aGlzIGJ5IG92ZXJyaWRpbmcKLSAgYGxvb2t1cEl0ZW1Db250cm9sbGVyYC4KLQotICBG
b3IgZXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5NeUFycmF5Q29udHJvbGxlciA9
IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGxvb2t1cEl0ZW1Db250cm9sbGVy
OiBmdW5jdGlvbiggb2JqZWN0ICkgewotICAgICAgaWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcp
KSB7Ci0gICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xs
ZXIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAu
UmVndWxhckNvbnRyb2xsZXIKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBUaGUg
aXRlbUNvbnRyb2xsZXIgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhIGBwYXJlbnRDb250cm9sbGVyYCBw
cm9wZXJ0eSBzZXQgdG8KLSAgZWl0aGVyIHRoZSB0aGUgYHBhcmVudENvbnRyb2xsZXJgIHByb3Bl
cnR5IG9mIHRoZSBgQXJyYXlDb250cm9sbGVyYAotICBvciB0byB0aGUgYEFycmF5Q29udHJvbGxl
cmAgaW5zdGFuY2UgaXRzZWxmLgotCi0gIEBjbGFzcyBBcnJheUNvbnRyb2xsZXIKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5BcnJheVByb3h5Ci0gIEB1c2VzIEVtYmVyLlNv
cnRhYmxlTWl4aW4KLSAgQHVzZXMgRW1iZXIuQ29udHJvbGxlck1peGluCi0qLwotCi1FbWJlci5B
cnJheUNvbnRyb2xsZXIgPSBFbWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVy
TWl4aW4sCi0gIEVtYmVyLlNvcnRhYmxlTWl4aW4sIHsKLQotICAvKioKLSAgICBUaGUgY29udHJv
bGxlciB1c2VkIHRvIHdyYXAgaXRlbXMsIGlmIGFueS4KLQotICAgIEBwcm9wZXJ0eSBpdGVtQ29u
dHJvbGxlcgotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgaXRl
bUNvbnRyb2xsZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBj
b250cm9sbGVyIHRvIHdyYXAgaXRlbXMsIG9yIGBudWxsYCBpZiBpdGVtcyBzaG91bGQKLSAgICBi
ZSByZXR1cm5lZCBkaXJlY3RseS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBy
ZXR1cm5zIHRoZQotICAgIGBpdGVtQ29udHJvbGxlcmAgcHJvcGVydHksIGJ1dCBzdWJjbGFzc2Vz
IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4KLSAgICBkaWZmZXJlbnQgY29udHJv
bGxlcnMgZm9yIGRpZmZlcmVudCBvYmplY3RzLgotCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgQXBwLk15QXJyYXlDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250
cm9sbGVyLmV4dGVuZCh7Ci0gICAgICBsb29rdXBJdGVtQ29udHJvbGxlcjogZnVuY3Rpb24oIG9i
amVjdCApIHsKLSAgICAgICAgaWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcpKSB7Ci0gICAgICAg
ICAgcmV0dXJuICJzcGVjaWFsIjsgLy8gdXNlIEFwcC5TcGVjaWFsQ29udHJvbGxlcgotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxh
ckNvbnRyb2xsZXIKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBsb29rdXBJdGVtQ29udHJvbGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QK
LSAgICBAcmV0dXJuIHtTdHJpbmd9Ci0gICovCi0gIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5j
dGlvbihvYmplY3QpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtQ29udHJvbGxlcicpOwot
ICB9LAotCi0gIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgdmFyIGxlbmd0
aCA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGFycmFuZ2VkQ29udGVudCA9IGdldCh0
aGlzLCdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgb2JqZWN0ID0gYXJyYW5nZWRDb250ZW50
ICYmIGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChpZHgpOwotCi0gICAgaWYgKGlkeCA+PSAwICYm
IGlkeCA8IGxlbmd0aCkgewotICAgICAgdmFyIGNvbnRyb2xsZXJDbGFzcyA9IHRoaXMubG9va3Vw
SXRlbUNvbnRyb2xsZXIob2JqZWN0KTsKLSAgICAgIGlmIChjb250cm9sbGVyQ2xhc3MpIHsKLSAg
ICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlckF0KGlkeCwgb2JqZWN0LCBjb250cm9sbGVyQ2xh
c3MpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFdoZW4gYGNvbnRyb2xsZXJDbGFzc2AgaXMg
ZmFsc3ksIHdlIGhhdmUgbm90IG9wdGVkIGluIHRvIHVzaW5nIGl0ZW0KLSAgICAvLyBjb250cm9s
bGVycywgc28gcmV0dXJuIHRoZSBvYmplY3QgZGlyZWN0bHkuCi0KLSAgICAvLyBXaGVuIHRoZSBp
bmRleCBpcyBvdXQgb2YgcmFuZ2UsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSAib3V0IG9mIHJhbmdl
IgotICAgIC8vIHZhbHVlLCB3aGF0ZXZlciB0aGF0IG1pZ2h0IGJlLiAgUmF0aGVyIHRoYW4gbWFr
ZSBhc3N1bXB0aW9ucwotICAgIC8vIChlLmcuIGd1ZXNzaW5nIGBudWxsYCBvciBgdW5kZWZpbmVk
YCkgd2UgZGVmZXIgdGhpcyB0byBgYXJyYW5nZWRDb250ZW50YC4KLSAgICByZXR1cm4gb2JqZWN0
OwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9yZXNldFN1YkNvbnRyb2xsZXJzKCk7Ci0gIH0sCi0K
LSAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihpZHgsIHJlbW92ZWRDbnQsIGFkZGVk
Q250KSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxl
cnMnKSwKLSAgICAgICAgc3ViQ29udHJvbGxlcnNUb1JlbW92ZSA9IHN1YkNvbnRyb2xsZXJzLnNs
aWNlKGlkeCwgaWR4K3JlbW92ZWRDbnQpOwotCi0gICAgZm9yRWFjaChzdWJDb250cm9sbGVyc1Rv
UmVtb3ZlLCBmdW5jdGlvbihzdWJDb250cm9sbGVyKSB7Ci0gICAgICBpZiAoc3ViQ29udHJvbGxl
cikgeyBzdWJDb250cm9sbGVyLmRlc3Ryb3koKTsgfQotICAgIH0pOwotCi0gICAgcmVwbGFjZShz
dWJDb250cm9sbGVycywgaWR4LCByZW1vdmVkQ250LCBuZXcgQXJyYXkoYWRkZWRDbnQpKTsKLQot
ICAgIC8vIFRoZSBzaGFkb3cgYXJyYXkgb2Ygc3ViY29udHJvbGxlcnMgbXVzdCBiZSB1cGRhdGVk
IGJlZm9yZSB3ZSB0cmlnZ2VyCi0gICAgLy8gb2JzZXJ2ZXJzLCBvdGhlcndpc2Ugb2JzZXJ2ZXJz
IHdpbGwgZ2V0IHRoZSB3cm9uZyBzdWJjb250YWluZXIgd2hlbgotICAgIC8vIGNhbGxpbmcgYG9i
amVjdEF0YAotICAgIHRoaXMuX3N1cGVyKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpOwotICB9
LAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlz
LnNldCgnX3N1YkNvbnRyb2xsZXJzJywgRW1iZXIuQSgpKTsKLSAgfSwKLQotICBjb250ZW50OiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSks
Ci0KLSAgY29udHJvbGxlckF0OiBmdW5jdGlvbihpZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNz
KSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IGdldCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAg
IHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxlcnMnKSwKLSAgICAgICAg
c3ViQ29udHJvbGxlciA9IHN1YkNvbnRyb2xsZXJzW2lkeF0sCi0gICAgICAgIGZhY3RvcnksIGZ1
bGxOYW1lOwotCi0gICAgaWYgKHN1YkNvbnRyb2xsZXIpIHsgcmV0dXJuIHN1YkNvbnRyb2xsZXI7
IH0KLQotICAgIGZ1bGxOYW1lID0gImNvbnRyb2xsZXI6IiArIGNvbnRyb2xsZXJDbGFzczsKLQot
ICAgIGlmICghY29udGFpbmVyLmhhcyhmdWxsTmFtZSkpIHsKLSAgICAgIHRocm93IG5ldyBFbWJl
ci5FcnJvcignQ291bGQgbm90IHJlc29sdmUgaXRlbUNvbnRyb2xsZXI6ICInICsgY29udHJvbGxl
ckNsYXNzICsgJyInKTsKLSAgICB9Ci0KLSAgICBzdWJDb250cm9sbGVyID0gY29udGFpbmVyLmxv
b2t1cEZhY3RvcnkoZnVsbE5hbWUpLmNyZWF0ZSh7Ci0gICAgICB0YXJnZXQ6IHRoaXMsCi0gICAg
ICBwYXJlbnRDb250cm9sbGVyOiBnZXQodGhpcywgJ3BhcmVudENvbnRyb2xsZXInKSB8fCB0aGlz
LAotICAgICAgY29udGVudDogb2JqZWN0Ci0gICAgfSk7Ci0KLSAgICBzdWJDb250cm9sbGVyc1tp
ZHhdID0gc3ViQ29udHJvbGxlcjsKLQotICAgIHJldHVybiBzdWJDb250cm9sbGVyOwotICB9LAot
Ci0gIF9zdWJDb250cm9sbGVyczogbnVsbCwKLQotICBfcmVzZXRTdWJDb250cm9sbGVyczogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJv
bGxlcnMnKTsKLSAgICBpZiAoc3ViQ29udHJvbGxlcnMpIHsKLSAgICAgIGZvckVhY2goc3ViQ29u
dHJvbGxlcnMsIGZ1bmN0aW9uKHN1YkNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKHN1YkNvbnRy
b2xsZXIpIHsgc3ViQ29udHJvbGxlci5kZXN0cm95KCk7IH0KLSAgICAgIH0pOwotICAgIH0KLQot
ICAgIHRoaXMuc2V0KCdfc3ViQ29udHJvbGxlcnMnLCBFbWJlci5BKCkpOwotICB9Ci19KTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioKLSAgYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGlz
IHBhcnQgb2YgRW1iZXIncyBDb250cm9sbGVyIGxheWVyLiBJdCBpcyBpbnRlbmRlZAotICB0byB3
cmFwIGEgc2luZ2xlIG9iamVjdCwgcHJveHlpbmcgdW5oYW5kbGVkIGF0dGVtcHRzIHRvIGBnZXRg
IGFuZCBgc2V0YCB0byB0aGUgdW5kZXJseWluZwotICBjb250ZW50IG9iamVjdCwgYW5kIHRvIGZv
cndhcmQgdW5oYW5kbGVkIGFjdGlvbiBhdHRlbXB0cyB0byBpdHMgYHRhcmdldGAuCi0KLSAgYEVt
YmVyLk9iamVjdENvbnRyb2xsZXJgIGRlcml2ZXMgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gaXRz
IHN1cGVyY2xhc3MKLSAgYEVtYmVyLk9iamVjdFByb3h5YCBhbmQgdGhlIGBFbWJlci5Db250cm9s
bGVyTWl4aW5gIG1peGluLgotCi0gIEBjbGFzcyBPYmplY3RDb250cm9sbGVyCi0gIEBuYW1lc3Bh
Y2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0UHJveHkKLSAgQHVzZXMgRW1iZXIuQ29u
dHJvbGxlck1peGluCi0qKi8KLUVtYmVyLk9iamVjdENvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RQ
cm94eS5leHRlbmQoRW1iZXIuQ29udHJvbGxlck1peGluKTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotRW1iZXIgUnVudGlt
ZQotCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLUByZXF1aXJlcyBl
bWJlci1tZXRhbAotKi8KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgalF1ZXJ5ID0gdGhpcy5qUXVl
cnkgfHwgKEVtYmVyLmltcG9ydHMgJiYgRW1iZXIuaW1wb3J0cy5qUXVlcnkpOwotaWYgKCFqUXVl
cnkgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHsKLSAgalF1ZXJ5ID0gcmVxdWly
ZSgnanF1ZXJ5Jyk7Ci19Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgVmlld3MgcmVxdWlyZSBqUXVl
cnkgYmV0d2VlbiAxLjcgYW5kIDIuMSIsIGpRdWVyeSAmJiAoalF1ZXJ5KCkuanF1ZXJ5Lm1hdGNo
KC9eKCgxXC4oN3w4fDl8MTB8MTEpKXwoMlwuKDB8MSkpKShcLlxkKyk/KHByZXxyY1xkPyk/Lykg
fHwgRW1iZXIuRU5WLkZPUkNFX0pRVUVSWSkpOwotCi0vKioKLSAgQWxpYXMgZm9yIGpRdWVyeQot
Ci0gIEBtZXRob2QgJAotICBAZm9yIEVtYmVyCi0qLwotRW1iZXIuJCA9IGpRdWVyeTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci12aWV3cwotKi8KLWlmIChFbWJlci4kKSB7Ci0gIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9y
Zy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50
cwotICB2YXIgZHJhZ0V2ZW50cyA9IEVtYmVyLlN0cmluZy53KCdkcmFnc3RhcnQgZHJhZyBkcmFn
ZW50ZXIgZHJhZ2xlYXZlIGRyYWdvdmVyIGRyb3AgZHJhZ2VuZCcpOwotCi0gIC8vIENvcGllcyB0
aGUgYGRhdGFUcmFuc2ZlcmAgcHJvcGVydHkgZnJvbSBhIGJyb3dzZXIgZXZlbnQgb2JqZWN0IG9u
dG8gdGhlCi0gIC8vIGpRdWVyeSBldmVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnRz
Ci0gIEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoKGRyYWdFdmVudHMsIGZ1bmN0aW9uKGV2
ZW50TmFtZSkgewotICAgIEVtYmVyLiQuZXZlbnQuZml4SG9va3NbZXZlbnROYW1lXSA9IHsgcHJv
cHM6IFsnZGF0YVRyYW5zZmVyJ10gfTsKLSAgfSk7Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCi0K
LS8qIEJFR0lOIE1FVEFNT1JQSCBIRUxQRVJTICovCi0KLS8vIEludGVybmV0IEV4cGxvcmVyIHBy
aW9yIHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVs
ZW1lbnQKLS8vIGlzIGEgInplcm8tc2NvcGUiIGVsZW1lbnQuIFRoaXMgcHJvYmxlbSBjYW4gYmUg
d29ya2VkIGFyb3VuZCBieSBtYWtpbmcKLS8vIHRoZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0
ZXh0IG5vZGUuIFdlLCBsaWtlIE1vZGVybml6ciwgdXNlICZzaHk7Ci0KLXZhciBuZWVkc1NoeSA9
IHRoaXMuZG9jdW1lbnQgJiYgKGZ1bmN0aW9uKCkgewotICB2YXIgdGVzdEVsID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gIHRlc3RFbC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4i
OwotICB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPSAiPHNjcmlwdD48L3NjcmlwdD4iOwot
ICByZXR1cm4gdGVzdEVsLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKLX0pKCk7Ci0KLS8v
IElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNl
ZWRpbmcKLS8vIGEgc2NyaXB0IHRhZyB0byBhcHBlYXIgYWZ0ZXIgaXQuIFRoaXMgbWVhbnMgdGhh
dCB3ZSBjYW4KLS8vIGFjY2lkZW50YWxseSByZW1vdmUgd2hpdGVzcGFjZSB3aGVuIHVwZGF0aW5n
IGEgbW9ycGguCi12YXIgbW92ZXNXaGl0ZXNwYWNlID0gdGhpcy5kb2N1bWVudCAmJiAoZnVuY3Rp
b24oKSB7Ci0gIHZhciB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAg
dGVzdEVsLmlubmVySFRNTCA9ICJUZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRl
cic+PC9zY3JpcHQ+VmFsdWUiOwotICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZh
bHVlID09PSAnVGVzdDonICYmCi0gICAgICAgICAgdGVzdEVsLmNoaWxkTm9kZXNbMl0ubm9kZVZh
bHVlID09PSAnIFZhbHVlJzsKLX0pKCk7Ci0KLS8vIFVzZSB0aGlzIHRvIGZpbmQgY2hpbGRyZW4g
YnkgSUQgaW5zdGVhZCBvZiB1c2luZyBqUXVlcnkKLXZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rp
b24oZWxlbWVudCwgaWQpIHsKLSAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBp
ZCkgeyByZXR1cm4gZWxlbWVudDsgfQotCi0gIHZhciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMu
bGVuZ3RoLCBpZHgsIG5vZGUsIGZvdW5kOwotICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykg
ewotICAgIG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaWR4XTsKLSAgICBmb3VuZCA9IG5vZGUu
bm9kZVR5cGUgPT09IDEgJiYgZmluZENoaWxkQnlJZChub2RlLCBpZCk7Ci0gICAgaWYgKGZvdW5k
KSB7IHJldHVybiBmb3VuZDsgfQotICB9Ci19OwotCi12YXIgc2V0SW5uZXJIVE1MV2l0aG91dEZp
eCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKLSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAgaHRt
bCA9ICcmc2h5OycgKyBodG1sOwotICB9Ci0KLSAgdmFyIG1hdGNoZXMgPSBbXTsKLSAgaWYgKG1v
dmVzV2hpdGVzcGFjZSkgewotICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IGNoZWNrIGZvciBzY3Jp
cHQgdGFncyB3aXRoIGlkcyB3aXRoIHRoZQotICAgIC8vIGdvYWwgb2YgdGFyZ2V0aW5nIG1vcnBo
cy4KLSAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oXHMrKSg8c2NyaXB0IGlkPScoW14nXSspJykv
ZywgZnVuY3Rpb24obWF0Y2gsIHNwYWNlcywgdGFnLCBpZCkgewotICAgICAgbWF0Y2hlcy5wdXNo
KFtpZCwgc3BhY2VzXSk7Ci0gICAgICByZXR1cm4gdGFnOwotICAgIH0pOwotICB9Ci0KLSAgZWxl
bWVudC5pbm5lckhUTUwgPSBodG1sOwotCi0gIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdoaXRl
c3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cKLSAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkg
ewotICAgIHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0aCwgaWR4OwotICAgIGZvciAoaWR4PTA7IGlk
eDxsZW47IGlkeCsrKSB7Ci0gICAgICB2YXIgc2NyaXB0ID0gZmluZENoaWxkQnlJZChlbGVtZW50
LCBtYXRjaGVzW2lkeF1bMF0pLAotICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwotICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKG5vZGUsIHNjcmlwdCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAg
dmFyIHNoeUVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAgd2hpbGUgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKLSAgICAgIHNoeUVs
ZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAgfQotICAgIGlmIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1
MDBBRCIpIHsKLSAgICAgIHNoeUVsZW1lbnQubm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFs
dWUuc2xpY2UoMSk7Ci0gICAgfQotICB9Ci19OwotCi0vKiBFTkQgTUVUQU1PUlBIIEhFTFBFUlMg
Ki8KLQotCi12YXIgaW5uZXJIVE1MVGFncyA9IHt9OwotdmFyIGNhblNldElubmVySFRNTCA9IGZ1
bmN0aW9uKHRhZ05hbWUpIHsKLSAgaWYgKGlubmVySFRNTFRhZ3NbdGFnTmFtZV0gIT09IHVuZGVm
aW5lZCkgewotICAgIHJldHVybiBpbm5lckhUTUxUYWdzW3RhZ05hbWVdOwotICB9Ci0KLSAgdmFy
IGNhblNldCA9IHRydWU7Ci0KLSAgLy8gSUUgOCBhbmQgZWFybGllciBkb24ndCBhbGxvdyB1cyB0
byBkbyBpbm5lckhUTUwgb24gc2VsZWN0Ci0gIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09
ICdzZWxlY3QnKSB7Ci0gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0
Jyk7Ci0gICAgc2V0SW5uZXJIVE1MV2l0aG91dEZpeChlbCwgJzxvcHRpb24gdmFsdWU9InRlc3Qi
PlRlc3Q8L29wdGlvbj4nKTsKLSAgICBjYW5TZXQgPSBlbC5vcHRpb25zLmxlbmd0aCA9PT0gMTsK
LSAgfQotCi0gIGlubmVySFRNTFRhZ3NbdGFnTmFtZV0gPSBjYW5TZXQ7Ci0KLSAgcmV0dXJuIGNh
blNldDsKLX07Ci0KLXZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7
Ci0gIHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lOwotCi0gIGlmIChjYW5TZXRJbm5lckhU
TUwodGFnTmFtZSkpIHsKLSAgICBzZXRJbm5lckhUTUxXaXRob3V0Rml4KGVsZW1lbnQsIGh0bWwp
OwotICB9IGVsc2UgewotICAgIC8vIEZpcmVmb3ggdmVyc2lvbnMgPCAxMSBkbyBub3QgaGF2ZSBz
dXBwb3J0IGZvciBlbGVtZW50Lm91dGVySFRNTC4KLSAgICB2YXIgb3V0ZXJIVE1MID0gZWxlbWVu
dC5vdXRlckhUTUwgfHwgbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhlbGVt
ZW50KTsKLSAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBpbm5lckhUTUwgb24gIitlbGVtZW50
LnRhZ05hbWUrIiBpbiB0aGlzIGJyb3dzZXIiLCBvdXRlckhUTUwpOwotCi0gICAgdmFyIHN0YXJ0
VGFnID0gb3V0ZXJIVE1MLm1hdGNoKG5ldyBSZWdFeHAoIjwiK3RhZ05hbWUrIihbXj5dKik+Iiwg
J2knKSlbMF0sCi0gICAgICAgIGVuZFRhZyA9ICc8LycrdGFnTmFtZSsnPic7Ci0KLSAgICB2YXIg
d3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgIHNldElubmVySFRN
TFdpdGhvdXRGaXgod3JhcHBlciwgc3RhcnRUYWcgKyBodG1sICsgZW5kVGFnKTsKLSAgICBlbGVt
ZW50ID0gd3JhcHBlci5maXJzdENoaWxkOwotICAgIHdoaWxlIChlbGVtZW50LnRhZ05hbWUgIT09
IHRhZ05hbWUpIHsKLSAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotICAgIH0K
LSAgfQotCi0gIHJldHVybiBlbGVtZW50OwotfTsKLQotZnVuY3Rpb24gaXNTaW1wbGVDbGljayhl
dmVudCkgewotICB2YXIgbW9kaWZpZXIgPSBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5
IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5LAotICAgICAgc2Vjb25kYXJ5Q2xpY2sg
PSBldmVudC53aGljaCA+IDE7IC8vIElFOSBtYXkgcmV0dXJuIHVuZGVmaW5lZAotCi0gIHJldHVy
biAhbW9kaWZpZXIgJiYgIXNlY29uZGFyeUNsaWNrOwotfQotCi1FbWJlci5WaWV3VXRpbHMgPSB7
Ci0gIHNldElubmVySFRNTDogc2V0SW5uZXJIVE1MLAotICBpc1NpbXBsZUNsaWNrOiBpc1NpbXBs
ZUNsaWNrCi19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci0KLXZhciBDbGFzc1NldCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnNl
ZW4gPSB7fTsKLSAgdGhpcy5saXN0ID0gW107Ci19OwotCi1DbGFzc1NldC5wcm90b3R5cGUgPSB7
Ci0gIGFkZDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgaWYgKHN0cmluZyBpbiB0aGlzLnNlZW4p
IHsgcmV0dXJuOyB9Ci0gICAgdGhpcy5zZWVuW3N0cmluZ10gPSB0cnVlOwotCi0gICAgdGhpcy5s
aXN0LnB1c2goc3RyaW5nKTsKLSAgfSwKLQotICB0b0RPTTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0
dXJuIHRoaXMubGlzdC5qb2luKCIgIik7Ci0gIH0KLX07Ci0KLXZhciBCQURfVEFHX05BTUVfVEVT
VF9SRUdFWFAgPSAvW15hLXpBLVowLTlcLV0vOwotdmFyIEJBRF9UQUdfTkFNRV9SRVBMQUNFX1JF
R0VYUCA9IC9bXmEtekEtWjAtOVwtXS9nOwotCi1mdW5jdGlvbiBzdHJpcFRhZ05hbWUodGFnTmFt
ZSkgewotICBpZiAoIXRhZ05hbWUpIHsKLSAgICByZXR1cm4gdGFnTmFtZTsKLSAgfQotCi0gIGlm
ICghQkFEX1RBR19OQU1FX1RFU1RfUkVHRVhQLnRlc3QodGFnTmFtZSkpIHsKLSAgICByZXR1cm4g
dGFnTmFtZTsKLSAgfQotCi0gIHJldHVybiB0YWdOYW1lLnJlcGxhY2UoQkFEX1RBR19OQU1FX1JF
UExBQ0VfUkVHRVhQLCAnJyk7Ci19Ci0KLXZhciBCQURfQ0hBUlNfUkVHRVhQID0gLyYoPyFcdys7
KXxbPD4iJ2BdL2c7Ci12YXIgUE9TU0lCTEVfQ0hBUlNfUkVHRVhQID0gL1smPD4iJ2BdLzsKLQot
ZnVuY3Rpb24gZXNjYXBlQXR0cmlidXRlKHZhbHVlKSB7Ci0gIC8vIFN0b2xlbiBzaGFtZWxlc3Ns
eSBmcm9tIEhhbmRsZWJhcnMKLQotICB2YXIgZXNjYXBlID0gewotICAgICI8IjogIiZsdDsiLAot
ICAgICI+IjogIiZndDsiLAotICAgICciJzogIiZxdW90OyIsCi0gICAgIiciOiAiJiN4Mjc7IiwK
LSAgICAiYCI6ICImI3g2MDsiCi0gIH07Ci0KLSAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihj
aHIpIHsKLSAgICByZXR1cm4gZXNjYXBlW2Nocl0gfHwgIiZhbXA7IjsKLSAgfTsKLQotICB2YXIg
c3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLQotICBpZighUE9TU0lCTEVfQ0hBUlNfUkVHRVhQ
LnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9Ci0gIHJldHVybiBzdHJpbmcucmVwbGFj
ZShCQURfQ0hBUlNfUkVHRVhQLCBlc2NhcGVDaGFyKTsKLX0KLQotLy8gSUUgNi83IGhhdmUgYnVn
cyBhcm9uZCBzZXR0aW5nIG5hbWVzIG9uIGlucHV0cyBkdXJpbmcgY3JlYXRpb24uCi0vLyBGcm9t
IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9tczUzNjM4OSh2PXZz
Ljg1KS5hc3B4OgotLy8gIlRvIGluY2x1ZGUgdGhlIE5BTUUgYXR0cmlidXRlIGF0IHJ1biB0aW1l
IG9uIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBjcmVhdGVFbGVtZW50IG1ldGhvZCwgdXNlIHRo
ZSBlVGFnLiIKLXZhciBjYW5TZXROYW1lT25JbnB1dHMgPSAoZnVuY3Rpb24oKSB7Ci0gIHZhciBk
aXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKLSAgICAgIGVsID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKLQotICBlbC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnZm9v
Jyk7Ci0gIGRpdi5hcHBlbmRDaGlsZChlbCk7Ci0KLSAgcmV0dXJuICEhZGl2LmlubmVySFRNTC5t
YXRjaCgnZm9vJyk7Ci19KSgpOwotCi0vKioKLSAgYEVtYmVyLlJlbmRlckJ1ZmZlcmAgZ2F0aGVy
cyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGEgdmlldyBhbmQgZ2VuZXJhdGVzIHRoZQotICBm
aW5hbCByZXByZXNlbnRhdGlvbi4gYEVtYmVyLlJlbmRlckJ1ZmZlcmAgd2lsbCBnZW5lcmF0ZSBI
VE1MIHdoaWNoIGNhbiBiZSBwdXNoZWQKLSAgdG8gdGhlIERPTS4KLQotICAgYGBgamF2YXNjcmlw
dAotICAgdmFyIGJ1ZmZlciA9IEVtYmVyLlJlbmRlckJ1ZmZlcignZGl2Jyk7Ci0gIGBgYAotCi0g
IEBjbGFzcyBSZW5kZXJCdWZmZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAY29uc3RydWN0b3IK
LSAgQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgdGFnIG5hbWUgKHN1Y2ggYXMgJ2Rpdicgb3IgJ3An
KSB1c2VkIGZvciB0aGUgYnVmZmVyCi0qLwotRW1iZXIuUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24o
dGFnTmFtZSkgewotICByZXR1cm4gbmV3IEVtYmVyLl9SZW5kZXJCdWZmZXIodGFnTmFtZSk7Ci19
OwotCi1FbWJlci5fUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24odGFnTmFtZSkgewotICB0aGlzLnRh
Z05hbWVzID0gW3RhZ05hbWUgfHwgbnVsbF07Ci0gIHRoaXMuYnVmZmVyID0gIiI7Ci19OwotCi1F
bWJlci5fUmVuZGVyQnVmZmVyLnByb3RvdHlwZSA9IHsKLQotICAvLyBUaGUgcm9vdCB2aWV3J3Mg
ZWxlbWVudAotICBfZWxlbWVudDogbnVsbCwKLQotICBfaGFzRWxlbWVudDogdHJ1ZSwKLQotICAv
KioKLSAgICBBbiBpbnRlcm5hbCBzZXQgdXNlZCB0byBkZS1kdXBlIGNsYXNzIG5hbWVzIHdoZW4g
YGFkZENsYXNzKClgIGlzCi0gICAgdXNlZC4gQWZ0ZXIgZWFjaCBjYWxsIHRvIGBhZGRDbGFzcygp
YCwgdGhlIGBjbGFzc2VzYCBwcm9wZXJ0eQotICAgIHdpbGwgYmUgdXBkYXRlZC4KLQotICAgIEBw
cml2YXRlCi0gICAgQHByb3BlcnR5IGVsZW1lbnRDbGFzc2VzCi0gICAgQHR5cGUgQXJyYXkKLSAg
ICBAZGVmYXVsdCBbXQotICAqLwotICBlbGVtZW50Q2xhc3NlczogbnVsbCwKLQotICAvKioKLSAg
ICBBcnJheSBvZiBjbGFzcyBuYW1lcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGNsYXNz
IGF0dHJpYnV0ZS4KLQotICAgIFlvdSBjYW4gdXNlIGBzZXRDbGFzc2VzKClgIHRvIHNldCB0aGlz
IHByb3BlcnR5IGRpcmVjdGx5LiBJZiB5b3UKLSAgICB1c2UgYGFkZENsYXNzKClgLCBpdCB3aWxs
IGJlIG1haW50YWluZWQgZm9yIHlvdS4KLQotICAgIEBwcm9wZXJ0eSBjbGFzc2VzCi0gICAgQHR5
cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBbXQotICAqLwotICBjbGFzc2VzOiBudWxsLAotCi0gIC8q
KgotICAgIFRoZSBpZCBpbiBvZiB0aGUgZWxlbWVudCwgdG8gYmUgYXBwbGllZCBpbiB0aGUgaWQg
YXR0cmlidXRlLgotCi0gICAgWW91IHNob3VsZCBub3Qgc2V0IHRoaXMgcHJvcGVydHkgeW91cnNl
bGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAgICB0aGUgYGlkKClgIG1ldGhvZCBvZiBgRW1i
ZXIuUmVuZGVyQnVmZmVyYC4KLQotICAgIEBwcm9wZXJ0eSBlbGVtZW50SWQKLSAgICBAdHlwZSBT
dHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGVsZW1lbnRJZDogbnVsbCwKLQotICAv
KioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgd2hv
c2UgdmFsdWUgd2lsbCBiZQotICAgIGFwcGxpZWQgdG8gdGhhdCBhdHRyaWJ1dGUuIEZvciBleGFt
cGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAgICBgZGF0YS12aWV3PSJGb28uYmFyImAg
cHJvcGVydHkgdG8gYW4gZWxlbWVudCwgeW91IHdvdWxkIHNldCB0aGUKLSAgICBlbGVtZW50QXR0
cmlidXRlcyBoYXNoIHRvIGB7J2RhdGEtdmlldyc6J0Zvby5iYXInfWAuCi0KLSAgICBZb3Ugc2hv
dWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1
c2UKLSAgICB0aGUgYGF0dHIoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgotCi0g
ICAgQHByb3BlcnR5IGVsZW1lbnRBdHRyaWJ1dGVzCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZh
dWx0IHt9Ci0gICovCi0gIGVsZW1lbnRBdHRyaWJ1dGVzOiBudWxsLAotCi0gIC8qKgotICAgIEEg
aGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBhbmQgd2hvc2UgdmFsdWUg
d2lsbCBiZQotICAgIGFwcGxpZWQgdG8gdGhhdCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmIHlv
dSB3YW50ZWQgdG8gYXBwbHkgYQotICAgIGBjaGVja2VkPXRydWVgIHByb3BlcnR5IHRvIGFuIGVs
ZW1lbnQsIHlvdSB3b3VsZCBzZXQgdGhlCi0gICAgZWxlbWVudFByb3BlcnRpZXMgaGFzaCB0byBg
eydjaGVja2VkJzp0cnVlfWAuCi0KLSAgICBZb3Ugc2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhh
c2ggeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAgICB0aGUgYHByb3AoKWAgbWV0
aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgotCi0gICAgQHByb3BlcnR5IGVsZW1lbnRQcm9w
ZXJ0aWVzCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRQ
cm9wZXJ0aWVzOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB0YWduYW1lIG9mIHRoZSBlbGVtZW50
IGFuIGluc3RhbmNlIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgIHJlcHJlc2VudHMuCi0KLSAgICBV
c3VhbGx5LCB0aGlzIGdldHMgc2V0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYEVtYmVyLlJl
bmRlckJ1ZmZlcmAuIEZvcgotICAgIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEg
YHBgIHRhZywgdGhlbiB5b3Ugd291bGQgY2FsbAotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVt
YmVyLlJlbmRlckJ1ZmZlcigncCcpCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgZWxlbWVudFRh
ZwotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgZWxlbWVudFRh
ZzogbnVsbCwKLQotICAvKioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIHN0
eWxlIGF0dHJpYnV0ZSBhbmQgd2hvc2UgdmFsdWUgd2lsbAotICAgIGJlIGFwcGxpZWQgdG8gdGhh
dCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAgICBg
YmFja2dyb3VuZC1jb2xvcjpibGFjaztgIHN0eWxlIHRvIGFuIGVsZW1lbnQsIHlvdSB3b3VsZCBz
ZXQgdGhlCi0gICAgZWxlbWVudFN0eWxlIGhhc2ggdG8gYHsnYmFja2dyb3VuZC1jb2xvcic6J2Js
YWNrJ31gLgotCi0gICAgWW91IHNob3VsZCBub3QgbWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxm
LCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCi0gICAgdGhlIGBzdHlsZSgpYCBtZXRob2Qgb2YgYEVt
YmVyLlJlbmRlckJ1ZmZlcmAuCi0KLSAgICBAcHJvcGVydHkgZWxlbWVudFN0eWxlCi0gICAgQHR5
cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRTdHlsZTogbnVsbCwKLQot
ICAvKioKLSAgICBOZXN0ZWQgYFJlbmRlckJ1ZmZlcnNgIHdpbGwgc2V0IHRoaXMgdG8gdGhlaXIg
cGFyZW50IGBSZW5kZXJCdWZmZXJgCi0gICAgaW5zdGFuY2UuCi0KLSAgICBAcHJvcGVydHkgcGFy
ZW50QnVmZmVyCi0gICAgQHR5cGUgRW1iZXIuX1JlbmRlckJ1ZmZlcgotICAqLwotICBwYXJlbnRC
dWZmZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgQWRkcyBhIHN0cmluZyBvZiBIVE1MIHRvIHRoZSBg
UmVuZGVyQnVmZmVyYC4KLQotICAgIEBtZXRob2QgcHVzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBz
dHJpbmcgSFRNTCB0byBwdXNoIGludG8gdGhlIGJ1ZmZlcgotICAgIEBjaGFpbmFibGUKLSAgKi8K
LSAgcHVzaDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgdGhpcy5idWZmZXIgKz0gc3RyaW5nOwot
ICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYSBjbGFzcyB0byB0aGUg
YnVmZmVyLCB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUuCi0K
LSAgICBAbWV0aG9kIGFkZENsYXNzCi0gICAgQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFz
cyBuYW1lIHRvIGFkZCB0byB0aGUgYnVmZmVyCi0gICAgQGNoYWluYWJsZQotICAqLwotICBhZGRD
bGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKSB7Ci0gICAgLy8gbGF6aWx5IGNyZWF0ZSBlbGVtZW50
Q2xhc3NlcwotICAgIHRoaXMuZWxlbWVudENsYXNzZXMgPSAodGhpcy5lbGVtZW50Q2xhc3NlcyB8
fCBuZXcgQ2xhc3NTZXQoKSk7Ci0gICAgdGhpcy5lbGVtZW50Q2xhc3Nlcy5hZGQoY2xhc3NOYW1l
KTsKLSAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmVsZW1lbnRDbGFzc2VzLmxpc3Q7Ci0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKLQotICBzZXRDbGFzc2VzOiBmdW5jdGlvbihjbGFzc05hbWVzKSB7
Ci0gICAgdGhpcy5jbGFzc2VzID0gY2xhc3NOYW1lczsKLSAgfSwKLQotICAvKioKLSAgICBTZXRz
IHRoZSBlbGVtZW50SUQgdG8gYmUgdXNlZCBmb3IgdGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9k
IGlkCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQGNoYWluYWJsZQotICAqLwotICBpZDog
ZnVuY3Rpb24oaWQpIHsKLSAgICB0aGlzLmVsZW1lbnRJZCA9IGlkOwotICAgIHJldHVybiB0aGlz
OwotICB9LAotCi0gIC8vIGR1Y2sgdHlwZSBhdHRyaWJ1dGUgZnVuY3Rpb25hbGl0eSBsaWtlIGpR
dWVyeSBzbyBhIHJlbmRlciBidWZmZXIKLSAgLy8gY2FuIGJlIHVzZWQgbGlrZSBhIGpRdWVyeSBv
YmplY3QgaW4gYXR0cmlidXRlIGJpbmRpbmcgc2NlbmFyaW9zLgotCi0gIC8qKgotICAgIEFkZHMg
YW4gYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAg
ICBAbWV0aG9kIGF0dHIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUg
YXR0cmlidXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8g
dGhlIGF0dHJpYnV0ZQotICAgIEBjaGFpbmFibGUKLSAgICBAcmV0dXJuIHtFbWJlci5SZW5kZXJC
dWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZQotICAqLwot
ICBhdHRyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICAgIHZhciBhdHRyaWJ1dGVzID0gdGhp
cy5lbGVtZW50QXR0cmlidXRlcyA9ICh0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzIHx8IHt9KTsKLQot
ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICByZXR1cm4gYXR0cmlidXRl
c1tuYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAgYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlOwot
ICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZSBhbiBh
dHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIHJlbmRlci4KLQotICAgIEBt
ZXRob2QgcmVtb3ZlQXR0cgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRo
ZSBhdHRyaWJ1dGUKLSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHJlbW92ZUF0dHI6IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXM7Ci0g
ICAgaWYgKGF0dHJpYnV0ZXMpIHsgZGVsZXRlIGF0dHJpYnV0ZXNbbmFtZV07IH0KLQotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYW4gcHJvcGVydHkgd2hpY2ggd2ls
bCBiZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KLQotICAgIEBtZXRob2QgcHJvcAotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEBwYXJhbSB7
U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBwcm9wZXJ0eQotICAgIEBjaGFp
bmFibGUKLSAgICBAcmV0dXJuIHtFbWJlci5SZW5kZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRo
ZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlCi0gICovCi0gIHByb3A6IGZ1bmN0aW9uKG5hbWUsIHZh
bHVlKSB7Ci0gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gKHRo
aXMuZWxlbWVudFByb3BlcnRpZXMgfHwge30pOwotCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PT09IDEpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0aWVzW25hbWVdOwotICAgIH0gZWxzZSB7Ci0g
ICAgICBwcm9wZXJ0aWVzW25hbWVdID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXM7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlIGFuIHByb3BlcnR5IGZyb20gdGhlIGxpc3Qgb2Yg
cHJvcGVydGllcyB0byByZW5kZXIuCi0KLSAgICBAbWV0aG9kIHJlbW92ZVByb3AKLSAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICBAY2hhaW5hYmxl
Ci0gICovCi0gIHJlbW92ZVByb3A6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgcHJvcGVydGll
cyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXM7Ci0gICAgaWYgKHByb3BlcnRpZXMpIHsgZGVsZXRl
IHByb3BlcnRpZXNbbmFtZV07IH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgot
ICAgIEFkZHMgYSBzdHlsZSB0byB0aGUgc3R5bGUgYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVu
ZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9kIHN0eWxlCi0gICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgc3R5bGUKLSAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUK
LSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHN0eWxlOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewot
ICAgIHRoaXMuZWxlbWVudFN0eWxlID0gKHRoaXMuZWxlbWVudFN0eWxlIHx8IHt9KTsKLQotICAg
IHRoaXMuZWxlbWVudFN0eWxlW25hbWVdID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgYmVnaW46IGZ1bmN0aW9uKHRhZ05hbWUpIHsKLSAgICB0aGlzLnRhZ05hbWVzLnB1c2go
dGFnTmFtZSB8fCBudWxsKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBwdXNoT3Blbmlu
Z1RhZzogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRhZ05hbWUgPSB0aGlzLmN1cnJlbnRUYWdOYW1l
KCk7Ci0gICAgaWYgKCF0YWdOYW1lKSB7IHJldHVybjsgfQotCi0gICAgaWYgKHRoaXMuX2hhc0Vs
ZW1lbnQgJiYgIXRoaXMuX2VsZW1lbnQgJiYgdGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7Ci0g
ICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnQoKTsKLSAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCi0gICAgICAgIGlkID0g
dGhpcy5lbGVtZW50SWQsCi0gICAgICAgIGNsYXNzZXMgPSB0aGlzLmNsYXNzZXMsCi0gICAgICAg
IGF0dHJzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlcywKLSAgICAgICAgcHJvcHMgPSB0aGlzLmVs
ZW1lbnRQcm9wZXJ0aWVzLAotICAgICAgICBzdHlsZSA9IHRoaXMuZWxlbWVudFN0eWxlLAotICAg
ICAgICBhdHRyLCBwcm9wOwotCi0gICAgYnVmZmVyICs9ICc8JyArIHN0cmlwVGFnTmFtZSh0YWdO
YW1lKTsKLQotICAgIGlmIChpZCkgewotICAgICAgYnVmZmVyICs9ICcgaWQ9IicgKyBlc2NhcGVB
dHRyaWJ1dGUoaWQpICsgJyInOwotICAgICAgdGhpcy5lbGVtZW50SWQgPSBudWxsOwotICAgIH0K
LSAgICBpZiAoY2xhc3NlcykgewotICAgICAgYnVmZmVyICs9ICcgY2xhc3M9IicgKyBlc2NhcGVB
dHRyaWJ1dGUoY2xhc3Nlcy5qb2luKCcgJykpICsgJyInOwotICAgICAgdGhpcy5jbGFzc2VzID0g
bnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUpIHsKLSAgICAgIGJ1ZmZlciArPSAnIHN0eWxl
PSInOwotCi0gICAgICBmb3IgKHByb3AgaW4gc3R5bGUpIHsKLSAgICAgICAgaWYgKHN0eWxlLmhh
c093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgYnVmZmVyICs9IHByb3AgKyAnOicgKyBl
c2NhcGVBdHRyaWJ1dGUoc3R5bGVbcHJvcF0pICsgJzsnOwotICAgICAgICB9Ci0gICAgICB9Ci0K
LSAgICAgIGJ1ZmZlciArPSAnIic7Ci0KLSAgICAgIHRoaXMuZWxlbWVudFN0eWxlID0gbnVsbDsK
LSAgICB9Ci0KLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAoYXR0ciBpbiBhdHRycykgewot
ICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoYXR0cikpIHsKLSAgICAgICAgICBidWZm
ZXIgKz0gJyAnICsgYXR0ciArICc9IicgKyBlc2NhcGVBdHRyaWJ1dGUoYXR0cnNbYXR0cl0pICsg
JyInOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMg
PSBudWxsOwotICAgIH0KLQotICAgIGlmIChwcm9wcykgewotICAgICAgZm9yIChwcm9wIGluIHBy
b3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewotICAgICAg
ICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BdOwotICAgICAgICAgIGlmICh2YWx1ZSB8fCB0eXBl
b2YodmFsdWUpID09PSAnbnVtYmVyJykgewotICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVl
KSB7Ci0gICAgICAgICAgICAgIGJ1ZmZlciArPSAnICcgKyBwcm9wICsgJz0iJyArIHByb3AgKyAn
Iic7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBidWZmZXIgKz0gJyAnICsg
cHJvcCArICc9IicgKyBlc2NhcGVBdHRyaWJ1dGUocHJvcHNbcHJvcF0pICsgJyInOwotICAgICAg
ICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aGlzLmVs
ZW1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBidWZmZXIgKz0gJz4nOwotICAg
IHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICB9LAotCi0gIHB1c2hDbG9zaW5nVGFnOiBmdW5jdGlv
bigpIHsKLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZXMucG9wKCk7Ci0gICAgaWYgKHRh
Z05hbWUpIHsgdGhpcy5idWZmZXIgKz0gJzwvJyArIHN0cmlwVGFnTmFtZSh0YWdOYW1lKSArICc+
JzsgfQotICB9LAotCi0gIGN1cnJlbnRUYWdOYW1lOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy50YWdOYW1lc1t0aGlzLnRhZ05hbWVzLmxlbmd0aC0xXTsKLSAgfSwKLQotICBnZW5lcmF0
ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0YWdOYW1lID0gdGhpcy50YWdOYW1lcy5w
b3AoKSwgLy8gcG9wIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gY2xvc2UKLSAgICAgICAgaWQgPSB0
aGlzLmVsZW1lbnRJZCwKLSAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKLSAgICAgICAg
YXR0cnMgPSB0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAotICAgICAgICBwcm9wcyA9IHRoaXMuZWxl
bWVudFByb3BlcnRpZXMsCi0gICAgICAgIHN0eWxlID0gdGhpcy5lbGVtZW50U3R5bGUsCi0gICAg
ICAgIHN0eWxlQnVmZmVyID0gJycsIGF0dHIsIHByb3AsIHRhZ1N0cmluZzsKLQotICAgIGlmIChh
dHRycyAmJiBhdHRycy5uYW1lICYmICFjYW5TZXROYW1lT25JbnB1dHMpIHsKLSAgICAgIC8vIElF
IGFsbG93cyBwYXNzaW5nIGEgdGFnIHRvIGNyZWF0ZUVsZW1lbnQuIFNlZSBub3RlIG9uIGBjYW5T
ZXROYW1lT25JbnB1dHNgIGFib3ZlIGFzIHdlbGwuCi0gICAgICB0YWdTdHJpbmcgPSAnPCcrc3Ry
aXBUYWdOYW1lKHRhZ05hbWUpKycgbmFtZT0iJytlc2NhcGVBdHRyaWJ1dGUoYXR0cnMubmFtZSkr
JyI+JzsKLSAgICB9IGVsc2UgewotICAgICAgdGFnU3RyaW5nID0gdGFnTmFtZTsKLSAgICB9Ci0K
LSAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnU3RyaW5nKSwKLSAg
ICAgICAgJGVsZW1lbnQgPSBFbWJlci4kKGVsZW1lbnQpOwotCi0gICAgaWYgKGlkKSB7Ci0gICAg
ICAkZWxlbWVudC5hdHRyKCdpZCcsIGlkKTsKLSAgICAgIHRoaXMuZWxlbWVudElkID0gbnVsbDsK
LSAgICB9Ci0gICAgaWYgKGNsYXNzZXMpIHsKLSAgICAgICRlbGVtZW50LmF0dHIoJ2NsYXNzJywg
Y2xhc3Nlcy5qb2luKCcgJykpOwotICAgICAgdGhpcy5jbGFzc2VzID0gbnVsbDsKLSAgICB9Ci0K
LSAgICBpZiAoc3R5bGUpIHsKLSAgICAgIGZvciAocHJvcCBpbiBzdHlsZSkgewotICAgICAgICBp
ZiAoc3R5bGUuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICBzdHlsZUJ1ZmZlciAr
PSAocHJvcCArICc6JyArIHN0eWxlW3Byb3BdICsgJzsnKTsKLSAgICAgICAgfQotICAgICAgfQot
Ci0gICAgICAkZWxlbWVudC5hdHRyKCdzdHlsZScsIHN0eWxlQnVmZmVyKTsKLQotICAgICAgdGhp
cy5lbGVtZW50U3R5bGUgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChhdHRycykgewotICAgICAg
Zm9yIChhdHRyIGluIGF0dHJzKSB7Ci0gICAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShh
dHRyKSkgewotICAgICAgICAgICRlbGVtZW50LmF0dHIoYXR0ciwgYXR0cnNbYXR0cl0pOwotICAg
ICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwot
ICAgIH0KLQotICAgIGlmIChwcm9wcykgewotICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7Ci0g
ICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewotICAgICAgICAgICRlbGVt
ZW50LnByb3AocHJvcCwgcHJvcHNbcHJvcF0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAg
IHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBlbGVt
ZW50OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZWxlbWVudAotICAgIEByZXR1cm4ge0RP
TUVsZW1lbnR9IFRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBIVE1M
Ci0gICAgICBvZiB0aGlzIGJ1ZmZlcgotICAqLwotICBlbGVtZW50OiBmdW5jdGlvbigpIHsKLSAg
ICB2YXIgaHRtbCA9IHRoaXMuaW5uZXJTdHJpbmcoKTsKLQotICAgIGlmIChodG1sKSB7Ci0gICAg
ICB0aGlzLl9lbGVtZW50ID0gRW1iZXIuVmlld1V0aWxzLnNldElubmVySFRNTCh0aGlzLl9lbGVt
ZW50LCBodG1sKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fZWxlbWVudDsKLSAgfSwKLQot
ICAvKioKLSAgICBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgdGhpcyBidWZmZXIuCi0K
LSAgICBAbWV0aG9kIHN0cmluZwotICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBI
VE1MCi0gICovCi0gIHN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX2hhc0VsZW1l
bnQgJiYgdGhpcy5fZWxlbWVudCkgewotICAgICAgLy8gRmlyZWZveCB2ZXJzaW9ucyA8IDExIGRv
IG5vdCBoYXZlIHN1cHBvcnQgZm9yIGVsZW1lbnQub3V0ZXJIVE1MLgotICAgICAgdmFyIHRoaXNF
bGVtZW50ID0gdGhpcy5lbGVtZW50KCksIG91dGVySFRNTCA9IHRoaXNFbGVtZW50Lm91dGVySFRN
TDsKLSAgICAgIGlmICh0eXBlb2Ygb3V0ZXJIVE1MID09PSAndW5kZWZpbmVkJykgewotICAgICAg
ICByZXR1cm4gRW1iZXIuJCgnPGRpdi8+JykuYXBwZW5kKHRoaXNFbGVtZW50KS5odG1sKCk7Ci0g
ICAgICB9Ci0gICAgICByZXR1cm4gb3V0ZXJIVE1MOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1
cm4gdGhpcy5pbm5lclN0cmluZygpOwotICAgIH0KLSAgfSwKLQotICBpbm5lclN0cmluZzogZnVu
Y3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuYnVmZmVyOwotICB9Ci19OwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBoYW5kbGVz
IGRlbGVnYXRpbmcgYnJvd3NlciBldmVudHMgdG8gdGhlaXIKLSAgY29ycmVzcG9uZGluZyBgRW1i
ZXIuVmlld3MuYCBGb3IgZXhhbXBsZSwgd2hlbiB5b3UgY2xpY2sgb24gYSB2aWV3LAotICBgRW1i
ZXIuRXZlbnREaXNwYXRjaGVyYCBlbnN1cmVzIHRoYXQgdGhhdCB2aWV3J3MgYG1vdXNlRG93bmAg
bWV0aG9kIGdldHMKLSAgY2FsbGVkLgotCi0gIEBjbGFzcyBFdmVudERpc3BhdGNoZXIKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAcHJpdmF0ZQotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1F
bWJlci5FdmVudERpc3BhdGNoZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAg
ICBUaGUgc2V0IG9mIGV2ZW50cyBuYW1lcyAoYW5kIGFzc29jaWF0ZWQgaGFuZGxlciBmdW5jdGlv
biBuYW1lcykgdG8gYmUgc2V0dXAKLSAgICBhbmQgZGlzcGF0Y2hlZCBieSB0aGUgYEV2ZW50RGlz
cGF0Y2hlcmAuIEN1c3RvbSBldmVudHMgY2FuIGFkZGVkIHRvIHRoaXMgbGlzdCBhdCBzZXR1cAot
ICAgIHRpbWUsIGdlbmVyYWxseSB2aWEgdGhlIGBFbWJlci5BcHBsaWNhdGlvbi5jdXN0b21FdmVu
dHNgIGhhc2guIE9ubHkgb3ZlcnJpZGUgdGhpcwotICAgIGRlZmF1bHQgc2V0IHRvIHByZXZlbnQg
dGhlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIGxpc3RlbmluZyBvbiBzb21lIGV2ZW50cyBhbGwgdG9n
ZXRoZXIuCi0KLSAgICBUaGlzIHNldCB3aWxsIGJlIG1vZGlmaWVkIGJ5IGBzZXR1cGAgdG8gYWxz
byBpbmNsdWRlIGFueSBldmVudHMgYWRkZWQgYXQgdGhhdCB0aW1lLgotCi0gICAgQHByb3BlcnR5
IGV2ZW50cwotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBldmVudHM6IHsKLSAgICB0b3VjaHN0
YXJ0ICA6ICd0b3VjaFN0YXJ0JywKLSAgICB0b3VjaG1vdmUgICA6ICd0b3VjaE1vdmUnLAotICAg
IHRvdWNoZW5kICAgIDogJ3RvdWNoRW5kJywKLSAgICB0b3VjaGNhbmNlbCA6ICd0b3VjaENhbmNl
bCcsCi0gICAga2V5ZG93biAgICAgOiAna2V5RG93bicsCi0gICAga2V5dXAgICAgICAgOiAna2V5
VXAnLAotICAgIGtleXByZXNzICAgIDogJ2tleVByZXNzJywKLSAgICBtb3VzZWRvd24gICA6ICdt
b3VzZURvd24nLAotICAgIG1vdXNldXAgICAgIDogJ21vdXNlVXAnLAotICAgIGNvbnRleHRtZW51
IDogJ2NvbnRleHRNZW51JywKLSAgICBjbGljayAgICAgICA6ICdjbGljaycsCi0gICAgZGJsY2xp
Y2sgICAgOiAnZG91YmxlQ2xpY2snLAotICAgIG1vdXNlbW92ZSAgIDogJ21vdXNlTW92ZScsCi0g
ICAgZm9jdXNpbiAgICAgOiAnZm9jdXNJbicsCi0gICAgZm9jdXNvdXQgICAgOiAnZm9jdXNPdXQn
LAotICAgIG1vdXNlZW50ZXIgIDogJ21vdXNlRW50ZXInLAotICAgIG1vdXNlbGVhdmUgIDogJ21v
dXNlTGVhdmUnLAotICAgIHN1Ym1pdCAgICAgIDogJ3N1Ym1pdCcsCi0gICAgaW5wdXQgICAgICAg
OiAnaW5wdXQnLAotICAgIGNoYW5nZSAgICAgIDogJ2NoYW5nZScsCi0gICAgZHJhZ3N0YXJ0ICAg
OiAnZHJhZ1N0YXJ0JywKLSAgICBkcmFnICAgICAgICA6ICdkcmFnJywKLSAgICBkcmFnZW50ZXIg
ICA6ICdkcmFnRW50ZXInLAotICAgIGRyYWdsZWF2ZSAgIDogJ2RyYWdMZWF2ZScsCi0gICAgZHJh
Z292ZXIgICAgOiAnZHJhZ092ZXInLAotICAgIGRyb3AgICAgICAgIDogJ2Ryb3AnLAotICAgIGRy
YWdlbmQgICAgIDogJ2RyYWdFbmQnCi0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVs
ZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNob3VsZCBiZSBhdHRhY2hlZC4gRXZlbnQK
LSAgICBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQgdW5sZXNzIHRo
aXMgaXMgb3ZlcnJpZGRlbi4KLQotICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50
IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgotCi0gICAgVGhlIGRlZmF1bHQgYm9keSBpcyBhIHN0cmlu
ZyBzaW5jZSB0aGlzIG1heSBiZSBldmFsdWF0ZWQgYmVmb3JlIGRvY3VtZW50LmJvZHkKLSAgICBl
eGlzdHMgaW4gdGhlIERPTS4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IHJvb3RFbGVt
ZW50Ci0gICAgQHR5cGUgRE9NRWxlbWVudAotICAgIEBkZWZhdWx0ICdib2R5JwotICAqLwotICBy
b290RWxlbWVudDogJ2JvZHknLAotCi0gIC8qKgotICAgIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJz
IGZvciBzdGFuZGFyZCBicm93c2VyIGV2ZW50cy4KLQotICAgIFRoaXMgd2lsbCBiZSBjYWxsZWQg
YWZ0ZXIgdGhlIGJyb3dzZXIgc2VuZHMgYSBgRE9NQ29udGVudFJlYWR5YCBldmVudC4gQnkKLSAg
ICBkZWZhdWx0LCBpdCB3aWxsIHNldCB1cCBhbGwgb2YgdGhlIGxpc3RlbmVycyBvbiB0aGUgZG9j
dW1lbnQgYm9keS4gSWYgeW91Ci0gICAgd291bGQgbGlrZSB0byByZWdpc3RlciB0aGUgbGlzdGVu
ZXJzIG9uIGEgZGlmZmVyZW50IGVsZW1lbnQsIHNldCB0aGUgZXZlbnQKLSAgICBkaXNwYXRjaGVy
J3MgYHJvb3RgIHByb3BlcnR5LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0g
ICAgQHBhcmFtIGFkZGVkRXZlbnRzIHtIYXNofQotICAqLwotICBzZXR1cDogZnVuY3Rpb24oYWRk
ZWRFdmVudHMsIHJvb3RFbGVtZW50KSB7Ci0gICAgdmFyIGV2ZW50LCBldmVudHMgPSBnZXQodGhp
cywgJ2V2ZW50cycpOwotCi0gICAgRW1iZXIuJC5leHRlbmQoZXZlbnRzLCBhZGRlZEV2ZW50cyB8
fCB7fSk7Ci0KLQotICAgIGlmICghRW1iZXIuaXNOb25lKHJvb3RFbGVtZW50KSkgewotICAgICAg
c2V0KHRoaXMsICdyb290RWxlbWVudCcsIHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICByb290
RWxlbWVudCA9IEVtYmVyLiQoZ2V0KHRoaXMsICdyb290RWxlbWVudCcpKTsKLQotICAgIEVtYmVy
LmFzc2VydChmbXQoJ1lvdSBjYW5ub3QgdXNlIHRoZSBzYW1lIHJvb3QgZWxlbWVudCAoJUApIG11
bHRpcGxlIHRpbWVzIGluIGFuIEVtYmVyLkFwcGxpY2F0aW9uJywgW3Jvb3RFbGVtZW50LnNlbGVj
dG9yIHx8IHJvb3RFbGVtZW50WzBdLnRhZ05hbWVdKSwgIXJvb3RFbGVtZW50LmlzKCcuZW1iZXIt
YXBwbGljYXRpb24nKSk7Ci0gICAgRW1iZXIuYXNzZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcg
RW1iZXIuQXBwbGljYXRpb24gdXNpbmcgYSByb290IGVsZW1lbnQgdGhhdCBpcyBhIGRlc2NlbmRl
bnQgb2YgYW4gZXhpc3RpbmcgRW1iZXIuQXBwbGljYXRpb24nLCAhcm9vdEVsZW1lbnQuY2xvc2Vz
dCgnLmVtYmVyLWFwcGxpY2F0aW9uJykubGVuZ3RoKTsKLSAgICBFbWJlci5hc3NlcnQoJ1lvdSBj
YW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0
aGF0IGlzIGFuIGFuY2VzdG9yIG9mIGFuIGV4aXN0aW5nIEVtYmVyLkFwcGxpY2F0aW9uJywgIXJv
b3RFbGVtZW50LmZpbmQoJy5lbWJlci1hcHBsaWNhdGlvbicpLmxlbmd0aCk7Ci0KLSAgICByb290
RWxlbWVudC5hZGRDbGFzcygnZW1iZXItYXBwbGljYXRpb24nKTsKLQotICAgIEVtYmVyLmFzc2Vy
dCgnVW5hYmxlIHRvIGFkZCAiZW1iZXItYXBwbGljYXRpb24iIGNsYXNzIHRvIHJvb3RFbGVtZW50
LiBNYWtlIHN1cmUgeW91IHNldCByb290RWxlbWVudCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50
IGluIHRoZSBib2R5LicsIHJvb3RFbGVtZW50LmlzKCcuZW1iZXItYXBwbGljYXRpb24nKSk7Ci0K
LSAgICBmb3IgKGV2ZW50IGluIGV2ZW50cykgewotICAgICAgaWYgKGV2ZW50cy5oYXNPd25Qcm9w
ZXJ0eShldmVudCkpIHsKLSAgICAgICAgdGhpcy5zZXR1cEhhbmRsZXIocm9vdEVsZW1lbnQsIGV2
ZW50LCBldmVudHNbZXZlbnRdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
UmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBkb2N1bWVudC4gSWYgdGhlIGdpdmVu
IGV2ZW50IGlzCi0gICAgdHJpZ2dlcmVkLCB0aGUgcHJvdmlkZWQgZXZlbnQgaGFuZGxlciB3aWxs
IGJlIHRyaWdnZXJlZCBvbiB0aGUgdGFyZ2V0IHZpZXcuCi0KLSAgICBJZiB0aGUgdGFyZ2V0IHZp
ZXcgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBldmVudCBoYW5kbGVyLCBvciBpZiB0aGUgaGFuZGxl
cgotICAgIHJldHVybnMgYGZhbHNlYCwgdGhlIHBhcmVudCB2aWV3IHdpbGwgYmUgY2FsbGVkLiBU
aGUgZXZlbnQgd2lsbCBjb250aW51ZSB0bwotICAgIGJ1YmJsZSB0byBlYWNoIHN1Y2Nlc3NpdmUg
cGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0aGUgdG9wLgotCi0gICAgRm9yIGV4YW1wbGUs
IHRvIGhhdmUgdGhlIGBtb3VzZURvd25gIG1ldGhvZCBjYWxsZWQgb24gdGhlIHRhcmdldCB2aWV3
IHdoZW4KLSAgICBhIGBtb3VzZWRvd25gIGV2ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dz
ZXIsIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgc2V0dXBIYW5k
bGVyKCdtb3VzZWRvd24nLCAnbW91c2VEb3duJyk7Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQot
ICAgIEBtZXRob2Qgc2V0dXBIYW5kbGVyCi0gICAgQHBhcmFtIHtFbGVtZW50fSByb290RWxlbWVu
dAotICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudCB0aGUgYnJvd3Nlci1vcmlnaW5hdGVkIGV2ZW50
IHRvIGxpc3RlbiB0bwotICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2Yg
dGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB2aWV3Ci0gICovCi0gIHNldHVwSGFuZGxlcjogZnVu
Y3Rpb24ocm9vdEVsZW1lbnQsIGV2ZW50LCBldmVudE5hbWUpIHsKLSAgICB2YXIgc2VsZiA9IHRo
aXM7Ci0KLSAgICByb290RWxlbWVudC5vbihldmVudCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcn
LCBmdW5jdGlvbihldnQsIHRyaWdnZXJpbmdNYW5hZ2VyKSB7Ci0gICAgICByZXR1cm4gRW1iZXIu
aGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhhbmRsZVZpZXdFdmVudCgpIHsKLSAgICAgICAgdmFyIHZp
ZXcgPSBFbWJlci5WaWV3LnZpZXdzW3RoaXMuaWRdLAotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1
ZSwgbWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgbWFuYWdlciA9IHNlbGYuX2ZpbmROZWFyZXN0
RXZlbnRNYW5hZ2VyKHZpZXcsZXZlbnROYW1lKTsKLQotICAgICAgICBpZiAobWFuYWdlciAmJiBt
YW5hZ2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikgewotICAgICAgICAgIHJlc3VsdCA9IHNlbGYu
X2Rpc3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcpOwotICAgICAgICB9
IGVsc2UgaWYgKHZpZXcpIHsKLSAgICAgICAgICByZXN1bHQgPSBzZWxmLl9idWJibGVFdmVudCh2
aWV3LGV2dCxldmVudE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV2dC5zdG9w
UHJvcGFnYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9KTsKLQotICAgIHJvb3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJl
cicsICdbZGF0YS1lbWJlci1hY3Rpb25dJywgZnVuY3Rpb24oZXZ0KSB7Ci0gICAgICByZXR1cm4g
RW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhhbmRsZUFjdGlvbkV2ZW50KCkgewotICAgICAg
ICB2YXIgYWN0aW9uSWQgPSBFbWJlci4kKGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWVt
YmVyLWFjdGlvbicpLAotICAgICAgICAgICAgYWN0aW9uICAgPSBFbWJlci5IYW5kbGViYXJzLkFj
dGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07Ci0KLSAgICAgICAgLy8gV2Ug
aGF2ZSB0byBjaGVjayBmb3IgYWN0aW9uIGhlcmUgc2luY2UgaW4gc29tZSBjYXNlcywgalF1ZXJ5
IHdpbGwgdHJpZ2dlcgotICAgICAgICAvLyBhbiBldmVudCBvbiBgcmVtb3ZlQ2hpbGRgIChpLmUu
IGZvY3Vzb3V0KSBhZnRlciB3ZSd2ZSBhbHJlYWR5IHRvcm4gZG93biB0aGUKLSAgICAgICAgLy8g
YWN0aW9uIGhhbmRsZXJzIGZvciB0aGUgdmlldy4KLSAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rp
b24uZXZlbnROYW1lID09PSBldmVudE5hbWUpIHsKLSAgICAgICAgICByZXR1cm4gYWN0aW9uLmhh
bmRsZXIoZXZ0KTsKLSAgICAgICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSk7Ci0gIH0sCi0K
LSAgX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyOiBmdW5jdGlvbih2aWV3LCBldmVudE5hbWUpIHsK
LSAgICB2YXIgbWFuYWdlciA9IG51bGw7Ci0KLSAgICB3aGlsZSAodmlldykgewotICAgICAgbWFu
YWdlciA9IGdldCh2aWV3LCAnZXZlbnRNYW5hZ2VyJyk7Ci0gICAgICBpZiAobWFuYWdlciAmJiBt
YW5hZ2VyW2V2ZW50TmFtZV0pIHsgYnJlYWs7IH0KLQotICAgICAgdmlldyA9IGdldCh2aWV3LCAn
cGFyZW50VmlldycpOwotICAgIH0KLQotICAgIHJldHVybiBtYW5hZ2VyOwotICB9LAotCi0gIF9k
aXNwYXRjaEV2ZW50OiBmdW5jdGlvbihvYmplY3QsIGV2dCwgZXZlbnROYW1lLCB2aWV3KSB7Ci0g
ICAgdmFyIHJlc3VsdCA9IHRydWU7Ci0KLSAgICB2YXIgaGFuZGxlciA9IG9iamVjdFtldmVudE5h
bWVdOwotICAgIGlmIChFbWJlci50eXBlT2YoaGFuZGxlcikgPT09ICdmdW5jdGlvbicpIHsKLSAg
ICAgIHJlc3VsdCA9IEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRs
ZXIuY2FsbChvYmplY3QsIGV2dCwgdmlldyk7Ci0gICAgICB9KTsKLSAgICAgIC8vIERvIG5vdCBw
cmV2ZW50RGVmYXVsdCBpbiBldmVudE1hbmFnZXJzLgotICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlv
bigpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJlc3VsdCA9IHRoaXMuX2J1YmJsZUV2ZW50
KHZpZXcsIGV2dCwgZXZlbnROYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9
LAotCi0gIF9idWJibGVFdmVudDogZnVuY3Rpb24odmlldywgZXZ0LCBldmVudE5hbWUpIHsKLSAg
ICByZXR1cm4gRW1iZXIucnVuKGZ1bmN0aW9uIGJ1YmJsZUV2ZW50KCkgewotICAgICAgcmV0dXJu
IHZpZXcuaGFuZGxlRXZlbnQoZXZlbnROYW1lLCBldnQpOwotICAgIH0pOwotICB9LAotCi0gIGRl
c3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciByb290RWxlbWVudCA9IGdldCh0aGlzLCAncm9v
dEVsZW1lbnQnKTsKLSAgICBFbWJlci4kKHJvb3RFbGVtZW50KS5vZmYoJy5lbWJlcicsICcqKicp
LnJlbW92ZUNsYXNzKCdlbWJlci1hcHBsaWNhdGlvbicpOwotICAgIHJldHVybiB0aGlzLl9zdXBl
cigpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotLy8gQWRkIGEgbmV3IG5hbWVk
IHF1ZXVlIGZvciByZW5kZXJpbmcgdmlld3MgdGhhdCBoYXBwZW5zCi0vLyBhZnRlciBiaW5kaW5n
cyBoYXZlIHN5bmNlZCwgYW5kIGEgcXVldWUgZm9yIHNjaGVkdWxpbmcgYWN0aW9ucwotLy8gdGhh
dCB0aGF0IHNob3VsZCBvY2N1ciBhZnRlciB2aWV3IHJlbmRlcmluZy4KLXZhciBxdWV1ZXMgPSBF
bWJlci5ydW4ucXVldWVzLAotICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRl
eE9mOwotcXVldWVzLnNwbGljZShpbmRleE9mLmNhbGwocXVldWVzLCAnYWN0aW9ucycpKzEsIDAs
ICdyZW5kZXInLCAnYWZ0ZXJSZW5kZXInKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vLyBPcmlnaW5hbCBjbGFzcyBkZWNs
YXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBpbiBydW50aW1lL2xpYi9jb250cm9sbGVycy9jb250
cm9sbGVyLmpzCi0vLyBOT1RFOiBJdCBtYXkgYmUgcG9zc2libGUgd2l0aCBZVUlEb2MgdG8gY29t
YmluZSBkb2NzIGluIHR3byBsb2NhdGlvbnMKLQotLyoqCi1BZGRpdGlvbmFsIG1ldGhvZHMgZm9y
IHRoZSBDb250cm9sbGVyTWl4aW4KLQotQGNsYXNzIENvbnRyb2xsZXJNaXhpbgotQG5hbWVzcGFj
ZSBFbWJlcgotKi8KLUVtYmVyLkNvbnRyb2xsZXJNaXhpbi5yZW9wZW4oewotICB0YXJnZXQ6IG51
bGwsCi0gIG5hbWVzcGFjZTogbnVsbCwKLSAgdmlldzogbnVsbCwKLSAgY29udGFpbmVyOiBudWxs
LAotICBfY2hpbGRDb250YWluZXJzOiBudWxsLAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0KHRoaXMsICdfY2hpbGRDb250YWluZXJzJywge30pOwot
ICB9LAotCi0gIF9tb2RlbERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ21vZGVsJywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRhaW5lcnMgPSBnZXQodGhpcywgJ19jaGlsZENvbnRhaW5lcnMn
KTsKLQotICAgIGZvciAodmFyIHByb3AgaW4gY29udGFpbmVycykgewotICAgICAgaWYgKCFjb250
YWluZXJzLmhhc093blByb3BlcnR5KHByb3ApKSB7IGNvbnRpbnVlOyB9Ci0gICAgICBjb250YWlu
ZXJzW3Byb3BdLmRlc3Ryb3koKTsKLSAgICB9Ci0KLSAgICBzZXQodGhpcywgJ19jaGlsZENvbnRh
aW5lcnMnLCB7fSk7Ci0gIH0pCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBzdGF0ZXMgPSB7fTsKLQotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIg
YV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci12YXIgYV9hZGRPYmpl
Y3QgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuYWRkT2JqZWN0OwotdmFyIG1ldGEgPSBFbWJlci5t
ZXRhOwotCi12YXIgY2hpbGRWaWV3c1Byb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7Ci0gIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywgcmV0ID0gRW1iZXIuQSgp
LCB2aWV3ID0gdGhpczsKLQotICBhX2ZvckVhY2goY2hpbGRWaWV3cywgZnVuY3Rpb24odmlldykg
ewotICAgIHZhciBjdXJyZW50Q2hpbGRWaWV3czsKLSAgICBpZiAodmlldy5pc1ZpcnR1YWwpIHsK
LSAgICAgIGlmIChjdXJyZW50Q2hpbGRWaWV3cyA9IGdldCh2aWV3LCAnY2hpbGRWaWV3cycpKSB7
Ci0gICAgICAgIHJldC5wdXNoT2JqZWN0cyhjdXJyZW50Q2hpbGRWaWV3cyk7Ci0gICAgICB9Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIHJldC5wdXNoKHZpZXcpOwotICAgIH0KLSAgfSk7Ci0KLSAgcmV0
LnJlcGxhY2UgPSBmdW5jdGlvbiAoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkVmlld3MpIHsKLSAg
ICBpZiAodmlldyBpbnN0YW5jZW9mIEVtYmVyLkNvbnRhaW5lclZpZXcpIHsKLSAgICAgIEVtYmVy
LmRlcHJlY2F0ZSgiTWFuaXB1bGF0aW5nIGFuIEVtYmVyLkNvbnRhaW5lclZpZXcgdGhyb3VnaCBp
dHMgY2hpbGRWaWV3cyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBDb250
YWluZXJWaWV3IGluc3RhbmNlIGl0c2VsZiBhcyBhbiBFbWJlci5NdXRhYmxlQXJyYXkuIik7Ci0g
ICAgICByZXR1cm4gdmlldy5yZXBsYWNlKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZFZpZXdzKTsK
LSAgICB9Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJjaGlsZFZpZXdzIGlzIGltbXV0YWJs
ZSIpOwotICB9OwotCi0gIHJldHVybiByZXQ7Ci19KTsKLQotRW1iZXIud2FybigiVGhlIFZJRVdf
UFJFU0VSVkVTX0NPTlRFWFQgZmxhZyBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aGUgZnVuY3Rpb25h
bGl0eSBjYW4gbm8gbG9uZ2VyIGJlIGRpc2FibGVkLiIsIEVtYmVyLkVOVi5WSUVXX1BSRVNFUlZF
U19DT05URVhUICE9PSBmYWxzZSk7Ci0KLS8qKgotICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVt
cGxhdGVzLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0ZWQKLSAgYnkgdGhlIGJ1
aWxkIHRvb2xzIHNvIHRoYXQgeW91IGNhbiBzdG9yZSB5b3VyIEhhbmRsZWJhcnMgdGVtcGxhdGVz
IGluCi0gIHNlcGFyYXRlIGZpbGVzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIEphdmFTY3JpcHQgYXQg
YnVpbGR0aW1lLgotCi0gIEBwcm9wZXJ0eSBURU1QTEFURVMKLSAgQGZvciBFbWJlcgotICBAdHlw
ZSBIYXNoCi0qLwotRW1iZXIuVEVNUExBVEVTID0ge307Ci0KLS8qKgotICBgRW1iZXIuQ29yZVZp
ZXdgIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgZXhpc3RzIHRvIGdpdmUgdmlldy1saWtlIGJl
aGF2aW9yCi0gIHRvIGJvdGggRW1iZXIncyBtYWluIHZpZXcgY2xhc3MgYEVtYmVyLlZpZXdgIGFu
ZCBvdGhlciBjbGFzc2VzIGxpa2UKLSAgYEVtYmVyLl9TaW1wbGVNZXRhbW9ycGhWaWV3YCB0aGF0
IGRvbid0IG5lZWQgdGhlIGZ1bGx5IGZ1bmN0aW9uYWx0aXkgb2YKLSAgYEVtYmVyLlZpZXdgLgot
Ci0gIFVubGVzcyB5b3UgaGF2ZSBzcGVjaWZpYyBuZWVkcyBmb3IgYENvcmVWaWV3YCwgeW91IHdp
bGwgdXNlIGBFbWJlci5WaWV3YAotICBpbiB5b3VyIGFwcGxpY2F0aW9ucy4KLQotICBAY2xhc3Mg
Q29yZVZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSAg
QHVzZXMgRW1iZXIuRXZlbnRlZAotICBAdXNlcyBFbWJlci5BY3Rpb25IYW5kbGVyCi0qLwotCi1F
bWJlci5Db3JlVmlldyA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgRW1iZXIu
QWN0aW9uSGFuZGxlciwgewotICBpc1ZpZXc6IHRydWUsCi0KLSAgc3RhdGVzOiBzdGF0ZXMsCi0K
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLnRyYW5z
aXRpb25UbygncHJlUmVuZGVyJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYgdGhlIHZpZXcgaXMg
Y3VycmVudGx5IGluc2VydGVkIGludG8gdGhlIERPTSBvZiBhIHBhcmVudCB2aWV3LCB0aGlzCi0g
ICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUgcGFyZW50IG9mIHRoZSB2aWV3LgotCi0gICAg
QHByb3BlcnR5IHBhcmVudFZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQg
bnVsbAotICAqLwotICBwYXJlbnRWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAg
ICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50VmlldzsKLQotICAgIGlmIChwYXJlbnQgJiYgcGFy
ZW50LmlzVmlydHVhbCkgewotICAgICAgcmV0dXJuIGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotICB9KS5wcm9wZXJ0
eSgnX3BhcmVudFZpZXcnKSwKLQotICBzdGF0ZTogbnVsbCwKLQotICBfcGFyZW50VmlldzogbnVs
bCwKLQotICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgdmlldywgbm90IGluY2x1ZGluZyB2aXJ0dWFs
IHZpZXdzCi0gIGNvbmNyZXRlVmlldzogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAg
aWYgKCF0aGlzLmlzVmlydHVhbCkgeyByZXR1cm4gdGhpczsgfQotICAgIGVsc2UgeyByZXR1cm4g
Z2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7IH0KLSAgfSkucHJvcGVydHkoJ3BhcmVudFZpZXcnKSwK
LQotICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmlldycsCi0KLSAgaW5zdHJ1bWVudERldGFpbHM6
IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICBoYXNoLm9iamVjdCA9IHRoaXMudG9TdHJpbmcoKTsKLSAg
fSwKLQotICAvKioKLSAgICBJbnZva2VkIGJ5IHRoZSB2aWV3IHN5c3RlbSB3aGVuIHRoaXMgdmll
dyBuZWVkcyB0byBwcm9kdWNlIGFuIEhUTUwKLSAgICByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRo
b2Qgd2lsbCBjcmVhdGUgYSBuZXcgcmVuZGVyIGJ1ZmZlciwgaWYgbmVlZGVkLAotICAgIHRoZW4g
YXBwbHkgYW55IGRlZmF1bHQgYXR0cmlidXRlcywgc3VjaCBhcyBjbGFzcyBuYW1lcyBhbmQgdmlz
aWJpbGl0eS4KLSAgICBGaW5hbGx5LCB0aGUgYHJlbmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCwg
d2hpY2ggaXMgcmVzcG9uc2libGUgZm9yCi0gICAgZG9pbmcgdGhlIGJ1bGsgb2YgdGhlIHJlbmRl
cmluZy4KLQotICAgIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7
IGluc3RlYWQsIGltcGxlbWVudCB0aGUKLSAgICBgdGVtcGxhdGVgIHByb3BlcnR5LCBvciBpZiB5
b3UgbmVlZCBtb3JlIGNvbnRyb2wsIG92ZXJyaWRlIHRoZSBgcmVuZGVyYAotICAgIG1ldGhvZC4K
LQotICAgIEBtZXRob2QgcmVuZGVyVG9CdWZmZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1
ZmZlcn0gYnVmZmVyIHRoZSByZW5kZXIgYnVmZmVyLiBJZiBubyBidWZmZXIgaXMKLSAgICAgIHBh
c3NlZCwgYSBkZWZhdWx0IGJ1ZmZlciwgdXNpbmcgdGhlIGN1cnJlbnQgdmlldydzIGB0YWdOYW1l
YCwgd2lsbAotICAgICAgYmUgdXNlZC4KLSAgICBAcHJpdmF0ZQotICAqLwotICByZW5kZXJUb0J1
ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKLSAgICB2YXIg
bmFtZSA9ICdyZW5kZXIuJyArIHRoaXMuaW5zdHJ1bWVudE5hbWUsCi0gICAgICAgIGRldGFpbHMg
PSB7fTsKLQotICAgIHRoaXMuaW5zdHJ1bWVudERldGFpbHMoZGV0YWlscyk7Ci0KLSAgICByZXR1
cm4gRW1iZXIuaW5zdHJ1bWVudChuYW1lLCBkZXRhaWxzLCBmdW5jdGlvbiBpbnN0cnVtZW50UmVu
ZGVyVG9CdWZmZXIoKSB7Ci0gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVG9CdWZmZXIocGFyZW50
QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIF9yZW5k
ZXJUb0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKLSAg
ICAvLyBJZiB0aGlzIGlzIHRoZSB0b3AtbW9zdCB2aWV3LCBzdGFydCBhIG5ldyBidWZmZXIuIE90
aGVyd2lzZSwKLSAgICAvLyBjcmVhdGUgYSBuZXcgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBvcmln
aW5hbCB1c2luZyB0aGUKLSAgICAvLyBwcm92aWRlZCBidWZmZXIgb3BlcmF0aW9uIChmb3IgZXhh
bXBsZSwgYGluc2VydEFmdGVyYCB3aWxsCi0gICAgLy8gaW5zZXJ0IGEgbmV3IGJ1ZmZlciBhZnRl
ciB0aGUgInBhcmVudCBidWZmZXIiKS4KLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZTsK
LQotICAgIGlmICh0YWdOYW1lID09PSBudWxsIHx8IHRhZ05hbWUgPT09IHVuZGVmaW5lZCkgewot
ICAgICAgdGFnTmFtZSA9ICdkaXYnOwotICAgIH0KLQotICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1
ZmZlciA9IHBhcmVudEJ1ZmZlciAmJiBwYXJlbnRCdWZmZXIuYmVnaW4odGFnTmFtZSkgfHwgRW1i
ZXIuUmVuZGVyQnVmZmVyKHRhZ05hbWUpOwotICAgIHRoaXMudHJhbnNpdGlvblRvKCdpbkJ1ZmZl
cicsIGZhbHNlKTsKLQotICAgIHRoaXMuYmVmb3JlUmVuZGVyKGJ1ZmZlcik7Ci0gICAgdGhpcy5y
ZW5kZXIoYnVmZmVyKTsKLSAgICB0aGlzLmFmdGVyUmVuZGVyKGJ1ZmZlcik7Ci0KLSAgICByZXR1
cm4gYnVmZmVyOwotICB9LAotCi0gIC8qKgotICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGV2ZW50
IGZpcmluZyBmcm9tIGBFbWJlci5FdmVudGVkYCB0bwotICAgIGFsc28gY2FsbCBtZXRob2RzIHdp
dGggdGhlIGdpdmVuIG5hbWUuCi0KLSAgICBAbWV0aG9kIHRyaWdnZXIKLSAgICBAcGFyYW0gbmFt
ZSB7U3RyaW5nfQotICAgIEBwcml2YXRlCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgIHZhciBtZXRo
b2QgPSB0aGlzW25hbWVdOwotICAgIGlmIChtZXRob2QpIHsKLSAgICAgIHZhciBhcmdzID0gW10s
IGksIGw7Ci0gICAgICBmb3IgKGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkr
KykgewotICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIHJl
dHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotICB9LAotCi0gIGRlcHJlY2F0
ZWRTZW5kSGFuZGxlczogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHJldHVybiAhIXRoaXNb
YWN0aW9uTmFtZV07Ci0gIH0sCi0KLSAgZGVwcmVjYXRlZFNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5h
bWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBF
bWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSAr
ICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0aW9uIiwgdHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09
ICdmdW5jdGlvbicpOwotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGltcGxl
bWVudGVkIGRpcmVjdGx5IG9uIHZpZXdzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGFjdGlv
biBoYW5kbGVycyBvbiBhbiBgYWN0aW9uc2Agb2JqZWN0ICgnICsgYWN0aW9uTmFtZSArICcgb24g
JyArIHRoaXMgKyAnKScsIGZhbHNlKTsKLSAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMs
IGFyZ3MpOwotICAgIHJldHVybjsKLSAgfSwKLQotICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKLSAg
ICByZXR1cm4gRW1iZXIudHlwZU9mKHRoaXNbbmFtZV0pID09PSAnZnVuY3Rpb24nIHx8IHRoaXMu
X3N1cGVyKG5hbWUpOwotICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBw
YXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3OwotCi0gICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJl
dHVybjsgfQotCi0gICAgLy8gZGVzdHJveSB0aGUgZWxlbWVudCAtLSB0aGlzIHdpbGwgYXZvaWQg
ZWFjaCBjaGlsZCB2aWV3IGRlc3Ryb3lpbmcKLSAgICAvLyB0aGUgZWxlbWVudCBvdmVyIGFuZCBv
dmVyIGFnYWluLi4uCi0gICAgaWYgKCF0aGlzLnJlbW92ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJv
eUVsZW1lbnQoKTsgfQotCi0gICAgLy8gcmVtb3ZlIGZyb20gcGFyZW50IGlmIGZvdW5kLiBEb24n
dCBjYWxsIHJlbW92ZUZyb21QYXJlbnQsCi0gICAgLy8gYXMgcmVtb3ZlRnJvbVBhcmVudCB3aWxs
IHRyeSB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbQotICAgIC8vIHRoZSBET00gYWdhaW4uCi0g
ICAgaWYgKHBhcmVudCkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7IH0KLQotICAgIHRoaXMu
dHJhbnNpdGlvblRvKCdkZXN0cm95aW5nJywgZmFsc2UpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBFbWJlci5LLAotICB0cmlnZ2VyUmVjdXJz
aXZlbHk6IEVtYmVyLkssCi0gIGludm9rZVJlY3Vyc2l2ZWx5OiBFbWJlci5LLAotICB0cmFuc2l0
aW9uVG86IEVtYmVyLkssCi0gIGRlc3Ryb3lFbGVtZW50OiBFbWJlci5LCi19KTsKLQotdmFyIFZp
ZXdDb2xsZWN0aW9uID0gRW1iZXIuX1ZpZXdDb2xsZWN0aW9uID0gZnVuY3Rpb24oaW5pdGlhbFZp
ZXdzKSB7Ci0gIHZhciB2aWV3cyA9IHRoaXMudmlld3MgPSBpbml0aWFsVmlld3MgfHwgW107Ci0g
IHRoaXMubGVuZ3RoID0gdmlld3MubGVuZ3RoOwotfTsKLQotVmlld0NvbGxlY3Rpb24ucHJvdG90
eXBlID0gewotICBsZW5ndGg6IDAsCi0KLSAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnROYW1lKSB7
Ci0gICAgdmFyIHZpZXdzID0gdGhpcy52aWV3cywgdmlldzsKLSAgICBmb3IgKHZhciBpID0gMCwg
bCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgdmlldyA9IHZpZXdzW2ldOwot
ICAgICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAg
IH0KLSAgfSwKLQotICB0cmlnZ2VyUmVjdXJzaXZlbHk6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewot
ICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3
cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIHZpZXdzW2ldLnRyaWdnZXJSZWN1cnNpdmVs
eShldmVudE5hbWUpOwotICAgIH0KLSAgfSwKLQotICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rp
b24oZm4pIHsKLSAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzLCB2aWV3OwotCi0gICAgZm9yICh2
YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIHZpZXcgPSB2
aWV3c1tpXTsKLSAgICAgIGZuKHZpZXcpOwotICAgIH0KLSAgfSwKLQotICB0cmFuc2l0aW9uVG86
IGZ1bmN0aW9uKHN0YXRlLCBjaGlsZHJlbikgewotICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7
Ci0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAg
ICAgIHZpZXdzW2ldLnRyYW5zaXRpb25UbyhzdGF0ZSwgY2hpbGRyZW4pOwotICAgIH0KLSAgfSwK
LQotICBwdXNoOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxlbmd0aCArPSBhcmd1bWVudHMubGVu
Z3RoOwotICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0gICAgcmV0dXJuIHZpZXdzLnB1c2gu
YXBwbHkodmlld3MsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlk
eCkgewotICAgIHJldHVybiB0aGlzLnZpZXdzW2lkeF07Ci0gIH0sCi0KLSAgZm9yRWFjaDogZnVu
Y3Rpb24oY2FsbGJhY2spIHsKLSAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzOwotICAgIHJldHVy
biBhX2ZvckVhY2godmlld3MsIGNhbGxiYWNrKTsKLSAgfSwKLQotICBjbGVhcjogZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5sZW5ndGggPSAwOwotICAgIHRoaXMudmlld3MubGVuZ3RoID0gMDsKLSAg
fQotfTsKLQotdmFyIEVNUFRZX0FSUkFZID0gW107Ci0KLS8qKgotICBgRW1iZXIuVmlld2AgaXMg
dGhlIGNsYXNzIGluIEVtYmVyIHJlc3BvbnNpYmxlIGZvciBlbmNhcHN1bGF0aW5nIHRlbXBsYXRl
cyBvZgotICBIVE1MIGNvbnRlbnQsIGNvbWJpbmluZyB0ZW1wbGF0ZXMgd2l0aCBkYXRhIHRvIHJl
bmRlciBhcyBzZWN0aW9ucyBvZiBhIHBhZ2UncwotICBET00sIGFuZCByZWdpc3RlcmluZyBhbmQg
cmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBldmVudHMuCi0KLSAgIyMgSFRNTCBUYWcKLQot
ICBUaGUgZGVmYXVsdCBIVE1MIHRhZyBuYW1lIHVzZWQgZm9yIGEgdmlldydzIERPTSByZXByZXNl
bnRhdGlvbiBpcyBgZGl2YC4gVGhpcwotICBjYW4gYmUgY3VzdG9taXplZCBieSBzZXR0aW5nIHRo
ZSBgdGFnTmFtZWAgcHJvcGVydHkuIFRoZSBmb2xsb3dpbmcgdmlldwotICBjbGFzczoKLQotICBg
YGBqYXZhc2NyaXB0Ci0gIFBhcmFncmFwaFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
dGFnTmFtZTogJ2VtJwotICB9KTsKLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIGluc3RhbmNl
cyB3aXRoIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDxlbSBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyI+PC9lbT4KLSAgYGBgCi0KLSAgIyMgSFRNTCBgY2xhc3NgIEF0
dHJpYnV0ZQotCi0gIFRoZSBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIG9mIGEgdmlldydzIHRhZyBj
YW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhCi0gIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSB0aGF0IGlz
IHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAnbXkt
b3RoZXItY2xhc3MnXQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0
YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRp
diBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBteS1jbGFzcyBteS1vdGhlci1jbGFzcyI+
PC9kaXY+Ci0gIGBgYAotCi0gIGBjbGFzc2AgYXR0cmlidXRlIHZhbHVlcyBjYW4gYWxzbyBiZSBz
ZXQgYnkgcHJvdmlkaW5nIGEgYGNsYXNzTmFtZUJpbmRpbmdzYAotICBwcm9wZXJ0eSBzZXQgdG8g
YW4gYXJyYXkgb2YgcHJvcGVydGllcyBuYW1lcyBmb3IgdGhlIHZpZXcuIFRoZSByZXR1cm4gdmFs
dWUKLSAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHZh
bHVlIGZvciB0aGUgdmlldydzIGBjbGFzc2AKLSAgYXR0cmlidXRlLiBUaGVzZSBwcm9wZXJ0aWVz
IGNhbiBiZSBjb21wdXRlZCBwcm9wZXJ0aWVzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3Byb3BlcnR5
QScsICdwcm9wZXJ0eUInXSwKLSAgICBwcm9wZXJ0eUE6ICdmcm9tLWEnLAotICAgIHByb3BlcnR5
QjogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoc29tZUxvZ2ljKSB7IHJldHVybiAnZnJvbS1iJzsg
fQotICAgIH0ucHJvcGVydHkoKQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwK
LSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBmcm9tLWEgZnJvbS1iIj48L2Rp
dj4KLSAgYGBgCi0KLSAgSWYgdGhlIHZhbHVlIG9mIGEgY2xhc3MgbmFtZSBiaW5kaW5nIHJldHVy
bnMgYSBib29sZWFuIHRoZSBwcm9wZXJ0eSBuYW1lCi0gIGl0c2VsZiB3aWxsIGJlIHVzZWQgYXMg
dGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIFRoZSBjbGFzcyBuYW1lCi0g
IHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRg
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAg
IGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2hvdmVyZWQnXSwKLSAgICBob3ZlcmVkOiB0cnVlCi0gIH0p
OwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwg
cmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNz
PSJlbWJlci12aWV3IGhvdmVyZWQiPjwvZGl2PgotICBgYGAKLQotICBXaGVuIHVzaW5nIGJvb2xl
YW4gY2xhc3MgbmFtZSBiaW5kaW5ncyB5b3UgY2FuIHN1cHBseSBhIHN0cmluZyB2YWx1ZSBvdGhl
cgotICB0aGFuIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB1c2UgYXMgdGhlIGBjbGFzc2AgSFRNTCBh
dHRyaWJ1dGUgYnkgYXBwZW5kaW5nIHRoZQotICBwcmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIg
Y2hhcmFjdGVyIHdoZW4gZGVmaW5pbmcgdGhlIGJpbmRpbmc6Ci0KLSAgYGBgamF2YXNjcmlwdAot
ICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
YXdlc29tZTpzby12ZXJ5LWNvb2wnXSwKLSAgICBhd2Vzb21lOiB0cnVlCi0gIH0pOwotICBgYGAK
LQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50
YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12
aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+Ci0gIGBgYAotCi0gIEJvb2xlYW4gdmFsdWUgY2xhc3Mg
bmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBuYW1lcyBhcmUgaW4gYQotICBjYW1lbENhc2Ut
c3R5bGUgZm9ybWF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgZGFzaGVyaXplZCBmb3JtYXQ6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xh
c3NOYW1lQmluZGluZ3M6IFsnaXNVcmdlbnQnXSwKLSAgICBpc1VyZ2VudDogdHJ1ZQotICB9KTsK
LSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJl
cHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0i
ZW1iZXItdmlldyBpcy11cmdlbnQiPjwvZGl2PgotICBgYGAKLQotICBDbGFzcyBuYW1lIGJpbmRp
bmdzIGNhbiBhbHNvIHJlZmVyIHRvIG9iamVjdCB2YWx1ZXMgdGhhdCBhcmUgZm91bmQgYnkKLSAg
dHJhdmVyc2luZyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHZpZXcgaXRzZWxmOgotCi0gIGBgYGph
dmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJp
bmRpbmdzOiBbJ21lc3NhZ2VzLmVtcHR5J10KLSAgICBtZXNzYWdlczogRW1iZXIuT2JqZWN0LmNy
ZWF0ZSh7Ci0gICAgICBlbXB0eTogdHJ1ZQotICAgIH0pCi0gIH0pOwotICBgYGAKLQotICBXaWxs
IHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6
Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGVtcHR5
Ij48L2Rpdj4KLSAgYGBgCi0KLSAgSWYgeW91IHdhbnQgdG8gYWRkIGEgY2xhc3MgbmFtZSBmb3Ig
YSBwcm9wZXJ0eSB3aGljaCBldmFsdWF0ZXMgdG8gdHJ1ZSBhbmQKLSAgYW5kIGEgZGlmZmVyZW50
IGNsYXNzIG5hbWUgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCB5b3UgY2FuIHBhc3MgYSBiaW5k
aW5nCi0gIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEFwcGxpZXMgJ2VuYWJs
ZWQnIGNsYXNzIHdoZW4gaXNFbmFibGVkIGlzIHRydWUgYW5kICdkaXNhYmxlZCcgd2hlbiBpc0Vu
YWJsZWQgaXMgZmFsc2UKLSAgRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRp
bmdzOiBbJ2lzRW5hYmxlZDplbmFibGVkOmRpc2FibGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUK
LSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIg
Y2xhc3M9ImVtYmVyLXZpZXcgZW5hYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFdoZW4gaXNFbmFi
bGVkIGlzIGBmYWxzZWAsIHRoZSByZXN1bHRpbmcgSFRNTCByZXByZW5zZW50YXRpb24gbG9va3Mg
bGlrZQotICB0aGlzOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1i
ZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFRoaXMgc3ludGF4IG9mZmVycyB0
aGUgY29udmVuaWVuY2UgdG8gYWRkIGEgY2xhc3MgaWYgYSBwcm9wZXJ0eSBpcyBgZmFsc2VgOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgLy8gQXBwbGllcyBubyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBp
cyB0cnVlIGFuZCBjbGFzcyAnZGlzYWJsZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCi0gIEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0VuYWJsZWQ6OmRp
c2FibGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQot
ICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPjwvZGl2Pgot
ICBgYGAKLQotICBXaGVuIHRoZSBgaXNFbmFibGVkYCBwcm9wZXJ0eSBvbiB0aGUgdmlldyBpcyBz
ZXQgdG8gYGZhbHNlYCwgaXQgd2lsbCByZXN1bHQKLSAgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFVwZGF0ZXMg
dG8gdGhlIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBh
dXRvbWF0aWMKLSAgdXBkYXRlIG9mIHRoZSAgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBpbiB0aGUg
dmlldydzIHJlbmRlcmVkIEhUTUwKLSAgcmVwcmVzZW50YXRpb24uIElmIHRoZSB2YWx1ZSBiZWNv
bWVzIGBmYWxzZWAgb3IgYHVuZGVmaW5lZGAgdGhlIGNsYXNzIG5hbWUKLSAgd2lsbCBiZSByZW1v
dmVkLgotCi0gIEJvdGggYGNsYXNzTmFtZXNgIGFuZCBgY2xhc3NOYW1lQmluZGluZ3NgIGFyZSBj
b25jYXRlbmF0ZWQgcHJvcGVydGllcy4gU2VlCi0gIFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nl
cy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQotICBpbmZvcm1hdGlv
biBhYm91dCBjb25jYXRlbmF0ZWQgcHJvcGVydGllcy4KLQotICAjIyBIVE1MIEF0dHJpYnV0ZXMK
LQotICBUaGUgSFRNTCBhdHRyaWJ1dGUgc2VjdGlvbiBvZiBhIHZpZXcncyB0YWcgY2FuIGJlIHNl
dCBieSBwcm92aWRpbmcgYW4KLSAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8g
YW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb24gdGhlIHZpZXcuCi0gIFRoZSByZXR1cm4gdmFs
dWUgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSB2
aWV3J3MKLSAgSFRNTCBhc3NvY2lhdGVkIGF0dHJpYnV0ZToKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IEFuY2hvclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2EnLAotICAg
IGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2hyZWYnXSwKLSAgICBocmVmOiAnaHR0cDovL2dvb2dsZS5j
b20nCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8YSBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20iPjwvYT4KLSAgYGBg
Ci0KLSAgSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhbiBgYXR0cmlidXRlQmluZGluZ3NgIG1vbml0
b3JlZCBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4KLSAgdGhlIHByb3BlcnR5IHdpbGwgZm9sbG93IEhU
TUwncyBwYXR0ZXJuIG9mIHJlcGVhdGluZyB0aGUgYXR0cmlidXRlJ3MgbmFtZSBhcwotICBpdHMg
dmFsdWU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeVRleHRJbnB1dCA9IEVtYmVyLlZpZXcuZXh0
ZW5kKHsKLSAgICB0YWdOYW1lOiAnaW5wdXQnLAotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2Rp
c2FibGVkJ10sCi0gICAgZGlzYWJsZWQ6IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQot
ICBgYGBodG1sCi0gIDxpbnB1dCBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgZGlzYWJs
ZWQ9ImRpc2FibGVkIiAvPgotICBgYGAKLQotICBgYXR0cmlidXRlQmluZGluZ3NgIGNhbiByZWZl
ciB0byBjb21wdXRlZCBwcm9wZXJ0aWVzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlUZXh0SW5w
dXQgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2lucHV0JywKLSAgICBhdHRy
aWJ1dGVCaW5kaW5nczogWydkaXNhYmxlZCddLAotICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsK
LSAgICAgIGlmIChzb21lTG9naWMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfS5wcm9wZXJ0eSgpCi0g
IH0pOwotICBgYGAKLQotICBVcGRhdGVzIHRvIHRoZSB0aGUgcHJvcGVydHkgb2YgYW4gYXR0cmli
dXRlIGJpbmRpbmcgd2lsbCByZXN1bHQgaW4gYXV0b21hdGljCi0gIHVwZGF0ZSBvZiB0aGUgIEhU
TUwgYXR0cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTCByZXByZXNlbnRhdGlvbi4K
LQotICBgYXR0cmlidXRlQmluZGluZ3NgIGlzIGEgY29uY2F0ZW5hdGVkIHByb3BlcnR5LiBTZWUg
W0VtYmVyLk9iamVjdF0oL2FwaS9jbGFzc2VzL0VtYmVyLk9iamVjdC5odG1sKQotICBkb2N1bWVu
dGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVz
LgotCi0gICMjIFRlbXBsYXRlcwotCi0gIFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJl
bmRlcmVkIHJlcHJlc2VudGF0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IGl0cwotICB0ZW1wbGF0ZS4g
VGVtcGxhdGVzIGNhbiBiZSBhbnkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFuIG9wdGlvbmFsIGNv
bnRleHQKLSAgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9mIEhUTUwgdGhhdCB3aWxs
IGJlIGluc2VydGVkIHdpdGhpbiB0aGUKLSAgdmlldydzIHRhZy4gTW9zdCB0eXBpY2FsbHkgaW4g
RW1iZXIgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgY29tcGlsZWQKLSAgYEVtYmVyLkhhbmRsZWJh
cnNgIHRlbXBsYXRlLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSBhbSB0aGUg
dGVtcGxhdGUnKQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5j
ZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSBhbSB0aGUgdGVtcGxhdGU8L2Rpdj4KLSAg
YGBgCi0KLSAgV2l0aGluIGFuIEVtYmVyIGFwcGxpY2F0aW9uIGlzIG1vcmUgY29tbW9uIHRvIGRl
ZmluZSBhIEhhbmRsZWJhcnMgdGVtcGxhdGVzIGFzCi0gIHBhcnQgb2YgYSBwYWdlOgotCi0gIGBg
YGh0bWwKLSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gtaGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1u
YW1lPSdzb21lLXRlbXBsYXRlJz4KLSAgICBIZWxsbwotICA8L3NjcmlwdD4KLSAgYGBgCi0KLSAg
QW5kIGFzc29jaWF0ZSBpdCBieSBuYW1lIHVzaW5nIGEgdmlldydzIGB0ZW1wbGF0ZU5hbWVgIHBy
b3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
Ci0gICAgdGVtcGxhdGVOYW1lOiAnc29tZS10ZW1wbGF0ZScKLSAgfSk7Ci0gIGBgYAotCi0gIElm
IHlvdSBoYXZlIG5lc3RlZCByZXNvdXJjZXMsIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxs
IGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGh0bWwKLSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gtaGFu
ZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdwb3N0cy9uZXcnPgotICAgIDxoMT5OZXcgUG9z
dDwvaDE+Ci0gIDwvc2NyaXB0PgotICBgYGAKLQotICBBbmQgYHRlbXBsYXRlTmFtZWAgcHJvcGVy
dHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAg
ICB0ZW1wbGF0ZU5hbWU6ICdwb3N0cy9uZXcnCi0gIH0pOwotICBgYGAKLQotICBVc2luZyBhIHZh
bHVlIGZvciBgdGVtcGxhdGVOYW1lYCB0aGF0IGRvZXMgbm90IGhhdmUgYSBIYW5kbGViYXJzIHRl
bXBsYXRlCi0gIHdpdGggYSBtYXRjaGluZyBgZGF0YS10ZW1wbGF0ZS1uYW1lYCBhdHRyaWJ1dGUg
d2lsbCB0aHJvdyBhbiBlcnJvci4KLQotICBGb3Igdmlld3MgY2xhc3NlcyB0aGF0IG1heSBoYXZl
IGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5nLiBhcyB0aGUgYmxvY2sKLSAgcG9ydGlvbiBv
ZiBhIGB7e3ZpZXd9fWAgSGFuZGxlYmFycyBoZWxwZXIgY2FsbCBpbiBhbm90aGVyIHRlbXBsYXRl
IG9yIGluCi0gIGEgc3ViY2xhc3MpLCB5b3UgY2FuIHByb3ZpZGUgYSBgZGVmYXVsdFRlbXBsYXRl
YCBwcm9wZXJ0eSBzZXQgdG8gY29tcGlsZWQKLSAgdGVtcGxhdGUgZnVuY3Rpb24uIElmIGEgdGVt
cGxhdGUgaXMgbm90IGxhdGVyIHByb3ZpZGVkIGZvciB0aGUgdmlldyBpbnN0YW5jZQotICB0aGUg
YGRlZmF1bHRUZW1wbGF0ZWAgdmFsdWUgd2lsbCBiZSB1c2VkOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kgd2FzIHRoZSBkZWZhdWx0JyksCi0gICAgdGVtcGxhdGU6
IG51bGwsCi0gICAgdGVtcGxhdGVOYW1lOiBudWxsCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJl
c3VsdCBpbiBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBg
YGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIGRl
ZmF1bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYSBgdGVtcGxhdGVgIG9yIGB0ZW1wbGF0ZU5hbWVg
IGlzIHByb3ZpZGVkIGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKLSAgYGRlZmF1bHRUZW1w
bGF0ZWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsK
LSAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhl
IGRlZmF1bHQnKQotICB9KTsKLQotICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7Ci0gICAgdGVtcGxh
dGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhlIHRlbXBsYXRlLCBub3QgZGVm
YXVsdCcpCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhU
TUwgcmVwcmVzZW50YXRpb24gd2hlbiByZW5kZXJlZDoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9
ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkkgd2FzIHRoZSB0ZW1wbGF0ZSwgbm90IGRlZmF1
bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgIyMgVmlldyBDb250ZXh0Ci0KLSAgVGhlIGRlZmF1bHQgY29u
dGV4dCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgaXMgdGhlIHZpZXcncyBjb250cm9sbGVyOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVt
cGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSGVsbG8ge3tleGNpdGVkR3JlZXRpbmd9
fScpCi0gIH0pOwotCi0gIGFDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAg
Zmlyc3ROYW1lOiAnQmFycnknLAotICAgIGV4Y2l0ZWRHcmVldGluZzogZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gdGhpcy5nZXQoImNvbnRlbnQuZmlyc3ROYW1lIikgKyAiISEhIgotICAgIH0u
cHJvcGVydHkoKQotICB9KTsKLQotICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7Ci0gICAgY29udHJv
bGxlcjogYUNvbnRyb2xsZXIsCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiBhbiBI
VE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBj
bGFzcz0iZW1iZXItdmlldyI+SGVsbG8gQmFycnkhISE8L2Rpdj4KLSAgYGBgCi0KLSAgQSBjb250
ZXh0IGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgc3VwcGxpZWQgdGhyb3VnaCB0aGUgdmlldydzIGBj
b250ZXh0YAotICBwcm9wZXJ0eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5v
ciBgY29udHJvbGxlcmAgcHJvcGVydGllcywgdGhlCi0gIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQg
d2lsbCBiZSB1c2VkLgotCi0gICMjIExheW91dHMKLQotICBWaWV3cyBjYW4gaGF2ZSBhIHNlY29u
ZGFyeSB0ZW1wbGF0ZSB0aGF0IHdyYXBzIHRoZWlyIG1haW4gdGVtcGxhdGUuIExpa2UKLSAgcHJp
bWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0ICBhY2NlcHRz
IGFuIG9wdGlvbmFsCi0gIGNvbnRleHQgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9m
IEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluc2lkZQotICB2aWV3J3MgdGFnLiBWaWV3cyB3
aG9zZSBIVE1MIGVsZW1lbnQgaXMgc2VsZiBjbG9zaW5nIChlLmcuIGA8aW5wdXQgLz5gKQotICBj
YW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCi0K
LSAgTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgYSBsYXlvdXQgd2lsbCBiZSBhIGNvbXBpbGVkIGBF
bWJlci5IYW5kbGViYXJzYAotICB0ZW1wbGF0ZS4KLQotICBBIHZpZXcncyBsYXlvdXQgY2FuIGJl
IHNldCBkaXJlY3RseSB3aXRoIHRoZSBgbGF5b3V0YCBwcm9wZXJ0eSBvciByZWZlcmVuY2UKLSAg
YW4gZXhpc3RpbmcgSGFuZGxlYmFycyB0ZW1wbGF0ZSBieSBuYW1lIHdpdGggdGhlIGBsYXlvdXRO
YW1lYCBwcm9wZXJ0eS4KLQotICBBIHRlbXBsYXRlIHVzZWQgYXMgYSBsYXlvdXQgbXVzdCBjb250
YWluIGEgc2luZ2xlIHVzZSBvZiB0aGUgSGFuZGxlYmFycwotICBge3t5aWVsZH19YCBoZWxwZXIu
IFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJlbmRlcmVkIGB0ZW1wbGF0ZWAgd2lsbCBi
ZQotICBpbnNlcnRlZCBhdCB0aGlzIGxvY2F0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZp
ZXdXaXRoTGF5b3V0ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGxheW91dDogRW1iZXIuSGFu
ZGxlYmFycy5jb21waWxlKCI8ZGl2IGNsYXNzPSdteS1kZWNvcmF0aXZlLWNsYXNzJz57e3lpZWxk
fX08L2Rpdj4iKQotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkkgZ290
IHdyYXBwZWQiKSwKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFu
Y2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9Im15LWRlY29y
YXRpdmUtY2xhc3MiPgotICAgICAgSSBnb3Qgd3JhcHBlZAotICAgIDwvZGl2PgotICA8L2Rpdj4K
LSAgYGBgCi0KLSAgU2VlIFtFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMueWllbGRdKC9hcGkvY2xh
c3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfeWllbGQpCi0gIGZvciBt
b3JlIGluZm9ybWF0aW9uLgotCi0gICMjIFJlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMKLQot
ICBWaWV3cyBjYW4gcmVzcG9uZCB0byB1c2VyLWluaXRpYXRlZCBldmVudHMgaW4gb25lIG9mIHRo
cmVlIHdheXM6IG1ldGhvZAotICBpbXBsZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5h
Z2VyLCBhbmQgdGhyb3VnaCBge3thY3Rpb259fWAgaGVscGVyIHVzZQotICBpbiB0aGVpciB0ZW1w
bGF0ZSBvciBsYXlvdXQuCi0KLSAgIyMjIE1ldGhvZCBJbXBsZW1lbnRhdGlvbgotCi0gIFZpZXdz
IGNhbiByZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBieSBpbXBsZW1lbnRpbmcgYSBt
ZXRob2QgdGhhdAotICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9i
amVjdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUKLSAgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGlj
azogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIHdoZW4gd2hlbiBh
biBpbnN0YW5jZSdzCi0gICAgICAvLyByZW5kZXJlZCBlbGVtZW50IGlzIGNsaWNrZWQKLSAgICB9
Ci0gIH0pOwotICBgYGAKLQotICAjIyMgRXZlbnQgTWFuYWdlcnMKLQotICBWaWV3cyBjYW4gZGVm
aW5lIGFuIG9iamVjdCBhcyB0aGVpciBgZXZlbnRNYW5hZ2VyYCBwcm9wZXJ0eS4gVGhpcyBvYmpl
Y3QgY2FuCi0gIHRoZW4gaW1wbGVtZW50IG1ldGhvZHMgdGhhdCBtYXRjaCB0aGUgZGVzaXJlZCBl
dmVudCBuYW1lcy4gTWF0Y2hpbmcgZXZlbnRzCi0gIHRoYXQgb2NjdXIgb24gdGhlIHZpZXcncyBy
ZW5kZXJlZCBIVE1MIG9yIHRoZSByZW5kZXJlZCBIVE1MIG9mIGFueSBvZiBpdHMgRE9NCi0gIGRl
c2NlbmRhbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG1ldGhvZC4gQSBgalF1ZXJ5LkV2ZW50YCBvYmpl
Y3Qgd2lsbCBiZSBwYXNzZWQKLSAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBtZXRob2Qg
YW5kIGFuICBgRW1iZXIuVmlld2Agb2JqZWN0IGFzIHRoZQotICBzZWNvbmQuIFRoZSBgRW1iZXIu
Vmlld2Agd2lsbCBiZSB0aGUgdmlldyB3aG9zZSByZW5kZXJlZCBIVE1MIHdhcyBpbnRlcmFjdGVk
Ci0gIHdpdGguIFRoaXMgbWF5IGJlIHRoZSB2aWV3IHdpdGggdGhlIGBldmVudE1hbmFnZXJgIHBy
b3BlcnR5IG9yIG9uZSBvZiBpdHMKLSAgZGVzY2VuZGVudCB2aWV3cy4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGV2ZW50TWFuYWdlcjogRW1i
ZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICBkb3VibGVDbGljazogZnVuY3Rpb24oZXZlbnQsIHZp
ZXcpIHsKLSAgICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNlJ3MK
LSAgICAgICAgLy8gcmVuZGVyZWQgZWxlbWVudCBvciBhbnkgcmVuZGVyaW5nCi0gICAgICAgIC8v
IG9mIHRoaXMgdmlld3MncyBkZXNjZW5kZW50Ci0gICAgICAgIC8vIGVsZW1lbnRzIGlzIGNsaWNr
ZWQKLSAgICAgIH0KLSAgICB9KQotICB9KTsKLSAgYGBgCi0KLSAgQW4gZXZlbnQgZGVmaW5lZCBm
b3IgYW4gZXZlbnQgbWFuYWdlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXZlbnRzIG9mIHRoZQot
ICBzYW1lIG5hbWUgaGFuZGxlZCB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIHZpZXcuCi0KLSAgYGBg
amF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBtb3VzZUVudGVy
OiBmdW5jdGlvbihldmVudCkgewotICAgICAgLy8gd2lsbCBuZXZlciB0cmlnZ2VyLgotICAgIH0s
Ci0gICAgZXZlbnRNYW5hZ2VyOiBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICAgIG1vdXNlRW50
ZXI6IGZ1bmN0aW9uKGV2ZW50LCB2aWV3KSB7Ci0gICAgICAgIC8vIHRha2VzIHByZWNlZGVuY2Ug
b3ZlciBBVmlldyNtb3VzZUVudGVyCi0gICAgICB9Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0g
IFNpbWlsYXJseSBhIHZpZXcncyBldmVudCBtYW5hZ2VyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIGZv
ciBldmVudHMgb2YgYW55IHZpZXdzCi0gIHJlbmRlcmVkIGFzIGEgZGVzY2VuZGVudC4gQSBtZXRo
b2QgbmFtZSB0aGF0IG1hdGNoZXMgYW4gZXZlbnQgbmFtZSB3aWxsIG5vdAotICBiZSBjYWxsZWQg
aWYgdGhlIHZpZXcgaW5zdGFuY2Ugd2FzIHJlbmRlcmVkIGluc2lkZSB0aGUgSFRNTCByZXByZXNl
bnRhdGlvbiBvZgotICBhIHZpZXcgdGhhdCBoYXMgYW4gYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkg
ZGVmaW5lZCB0aGF0IGhhbmRsZXMgZXZlbnRzIG9mIHRoZQotICBuYW1lLiBFdmVudHMgbm90IGhh
bmRsZWQgYnkgdGhlIGV2ZW50IG1hbmFnZXIgd2lsbCBzdGlsbCB0cmlnZ2VyIG1ldGhvZCBjYWxs
cwotICBvbiB0aGUgZGVzY2VuZGVudC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIE91dGVyVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJvdXRlciB7eyN2aWV3IElubmVyVmlld319aW5uZXJ7ey92aWV3fX0gb3V0ZXIiKSwKLSAg
ICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoewotICAgICAgbW91c2VFbnRlcjog
ZnVuY3Rpb24oZXZlbnQsIHZpZXcpIHsKLSAgICAgICAgLy8gdmlldyBtaWdodCBiZSBpbnN0YW5j
ZSBvZiBlaXRoZXIKLSAgICAgICAgLy8gT3V0ZXJWaWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcg
b24KLSAgICAgICAgLy8gd2hlcmUgb24gdGhlIHBhZ2UgdGhlIHVzZXIgaW50ZXJhY3Rpb24gb2Nj
dXJlZAotICAgICAgfQotICAgIH0pCi0gIH0pOwotCi0gIElubmVyVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgIC8vIHdpbGwgYmUg
Y2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQotICAgICAgLy8gYW4gT3V0ZXJWaWV3IGJlY2F1c2Ug
T3V0ZXJWaWV3J3MKLSAgICAgIC8vIGV2ZW50TWFuYWdlciBkb2Vzbid0IGhhbmRsZSBjbGljayBl
dmVudHMKLSAgICB9LAotICAgIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICAv
LyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpZiByZW5kZXJlZCBpbnNpZGUKLSAgICAgIC8vIGFuIE91
dGVyVmlldy4KLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICAjIyMgSGFuZGxlYmFycyBge3thY3Rp
b259fWAgSGVscGVyCi0KLSAgU2VlIFtIYW5kbGViYXJzLmhlbHBlcnMuYWN0aW9uXSgvYXBpL2Ns
YXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2FjdGlvbikuCi0KLSAg
IyMjIEV2ZW50IE5hbWVzCi0KLSAgQWxsIG9mIHRoZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVz
IGRlc2NyaWJlZCBhYm92ZSByZXNwb25kIHRvIHRoZSBzYW1lIHNldAotICBvZiBldmVudHMuIFRo
ZSBuYW1lcyBvZiB0aGUgYnVpbHQtaW4gZXZlbnRzIGFyZSBsaXN0ZWQgYmVsb3cuIChUaGUgaGFz
aCBvZgotICBidWlsdC1pbiBldmVudHMgZXhpc3RzIGluIGBFbWJlci5FdmVudERpc3BhdGNoZXJg
LikgQWRkaXRpb25hbCwgY3VzdG9tIGV2ZW50cwotICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2lu
ZyBgRW1iZXIuQXBwbGljYXRpb24uY3VzdG9tRXZlbnRzYC4KLQotICBUb3VjaCBldmVudHM6Ci0K
LSAgKiBgdG91Y2hTdGFydGAKLSAgKiBgdG91Y2hNb3ZlYAotICAqIGB0b3VjaEVuZGAKLSAgKiBg
dG91Y2hDYW5jZWxgCi0KLSAgS2V5Ym9hcmQgZXZlbnRzCi0KLSAgKiBga2V5RG93bmAKLSAgKiBg
a2V5VXBgCi0gICogYGtleVByZXNzYAotCi0gIE1vdXNlIGV2ZW50cwotCi0gICogYG1vdXNlRG93
bmAKLSAgKiBgbW91c2VVcGAKLSAgKiBgY29udGV4dE1lbnVgCi0gICogYGNsaWNrYAotICAqIGBk
b3VibGVDbGlja2AKLSAgKiBgbW91c2VNb3ZlYAotICAqIGBmb2N1c0luYAotICAqIGBmb2N1c091
dGAKLSAgKiBgbW91c2VFbnRlcmAKLSAgKiBgbW91c2VMZWF2ZWAKLQotICBGb3JtIGV2ZW50czoK
LQotICAqIGBzdWJtaXRgCi0gICogYGNoYW5nZWAKLSAgKiBgZm9jdXNJbmAKLSAgKiBgZm9jdXNP
dXRgCi0gICogYGlucHV0YAotCi0gIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOgotCi0gICog
YGRyYWdTdGFydGAKLSAgKiBgZHJhZ2AKLSAgKiBgZHJhZ0VudGVyYAotICAqIGBkcmFnTGVhdmVg
Ci0gICogYGRyb3BgCi0gICogYGRyYWdFbmRgCi0KLSAgIyMgSGFuZGxlYmFycyBge3t2aWV3fX1g
IEhlbHBlcgotCi0gIE90aGVyIGBFbWJlci5WaWV3YCBpbnN0YW5jZXMgY2FuIGJlIGluY2x1ZGVk
IGFzIHBhcnQgb2YgYSB2aWV3J3MgdGVtcGxhdGUgYnkKLSAgdXNpbmcgdGhlIGB7e3ZpZXd9fWAg
SGFuZGxlYmFycyBoZWxwZXIuIFNlZSBbRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXddKC9h
cGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfdmlldykKLSAg
Zm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0KLSAgQGNsYXNzIFZpZXcKLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3JlVmlldwotKi8KLUVtYmVyLlZpZXcgPSBFbWJl
ci5Db3JlVmlldy5leHRlbmQoewotCi0gIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IFsnY2xhc3NO
YW1lcycsICdjbGFzc05hbWVCaW5kaW5ncycsICdhdHRyaWJ1dGVCaW5kaW5ncyddLAotCi0gIC8q
KgotICAgIEBwcm9wZXJ0eSBpc1ZpZXcKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQg
dHJ1ZQotICAgIEBzdGF0aWMKLSAgKi8KLSAgaXNWaWV3OiB0cnVlLAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8g
VEVNUExBVEUgU1VQUE9SVAotICAvLwotCi0gIC8qKgotICAgIFRoZSBuYW1lIG9mIHRoZSB0ZW1w
bGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUgaXMgcHJvdmlkZWQuCi0KLSAgICBCeSBkZWZh
dWx0IGBFbWJlci5WaWV3YCB3aWxsIGxvb2t1cCBhIHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGlu
Ci0gICAgYEVtYmVyLlRFTVBMQVRFU2AgKGEgc2hhcmVkIGdsb2JhbCBvYmplY3QpLgotCi0gICAg
QHByb3BlcnR5IHRlbXBsYXRlTmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51
bGwKLSAgKi8KLSAgdGVtcGxhdGVOYW1lOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBuYW1lIG9m
IHRoZSBsYXlvdXQgdG8gbG9va3VwIGlmIG5vIGxheW91dCBpcyBwcm92aWRlZC4KLQotICAgIEJ5
IGRlZmF1bHQgYEVtYmVyLlZpZXdgIHdpbGwgbG9va3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5h
bWUgaW4KLSAgICBgRW1iZXIuVEVNUExBVEVTYCAoYSBzaGFyZWQgZ2xvYmFsIG9iamVjdCkuCi0K
LSAgICBAcHJvcGVydHkgbGF5b3V0TmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0
IG51bGwKLSAgKi8KLSAgbGF5b3V0TmFtZTogbnVsbCwKLQotICAvKioKLSAgICBUaGUgdGVtcGxh
dGUgdXNlZCB0byByZW5kZXIgdGhlIHZpZXcuIFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhh
dAotICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMg
YSBzdHJpbmcgb2YgSFRNTCB0aGF0Ci0gICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00g
cmVsYXRpdmUgdG8gaXRzIHBhcmVudCB2aWV3LgotCi0gICAgSW4gZ2VuZXJhbCwgeW91IHNob3Vs
ZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnR5IGluc3RlYWQgb2Ygc2V0dGluZwotICAg
IHRoZSB0ZW1wbGF0ZSB5b3Vyc2VsZi4KLQotICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZQotICAgIEB0
eXBlIEZ1bmN0aW9uCi0gICovCi0gIHRlbXBsYXRlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgcmV0dXJuIHZhbHVl
OyB9Ci0KLSAgICB2YXIgdGVtcGxhdGVOYW1lID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwK
LSAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0
ZW1wbGF0ZScpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIHRoZSB0ZW1wbGF0
ZU5hbWUgIiArIHRlbXBsYXRlTmFtZSArICIgZm9yICIgKyB0aGlzICsgIiwgYnV0IGl0IGRpZCBu
b3QgZXhpc3QuIiwgIXRlbXBsYXRlTmFtZSB8fCB0ZW1wbGF0ZSk7Ci0KLSAgICByZXR1cm4gdGVt
cGxhdGUgfHwgZ2V0KHRoaXMsICdkZWZhdWx0VGVtcGxhdGUnKTsKLSAgfSkucHJvcGVydHkoJ3Rl
bXBsYXRlTmFtZScpLAotCi0gIC8qKgotICAgIFRoZSBjb250cm9sbGVyIG1hbmFnaW5nIHRoaXMg
dmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgYmUKLSAgICBtYWRlIGF2YWls
YWJsZSBmb3IgdXNlIGJ5IHRoZSB0ZW1wbGF0ZS4KLQotICAgIEBwcm9wZXJ0eSBjb250cm9sbGVy
Ci0gICAgQHR5cGUgT2JqZWN0Ci0gICovCi0gIGNvbnRyb2xsZXI6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKGtleSkgewotICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdfcGFyZW50Vmll
dycpOwotICAgIHJldHVybiBwYXJlbnRWaWV3ID8gZ2V0KHBhcmVudFZpZXcsICdjb250cm9sbGVy
JykgOiBudWxsOwotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKLQotICAvKioKLSAgICBB
IHZpZXcgbWF5IGNvbnRhaW4gYSBsYXlvdXQuIEEgbGF5b3V0IGlzIGEgcmVndWxhciB0ZW1wbGF0
ZSBidXQKLSAgICBzdXBlcnNlZGVzIHRoZSBgdGVtcGxhdGVgIHByb3BlcnR5IGR1cmluZyByZW5k
ZXJpbmcuIEl0IGlzIHRoZQotICAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBsYXlvdXQgdGVtcGxh
dGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBwcm9wZXJ0eSBmcm9tIHRoZSB2aWV3
IChvciBhbHRlcm5hdGl2ZWx5LCBjYWxsIGBIYW5kbGViYXJzLmhlbHBlcnMueWllbGRgLAotICAg
IGB7e3lpZWxkfX1gKSB0byByZW5kZXIgaXQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0KLSAg
ICBUaGlzIGlzIHVzZWZ1bCBmb3IgYSB2aWV3IHRoYXQgaGFzIGEgc2hhcmVkIHdyYXBwZXIsIGJ1
dCB3aGljaCBkZWxlZ2F0ZXMKLSAgICB0aGUgcmVuZGVyaW5nIG9mIHRoZSBjb250ZW50cyBvZiB0
aGUgd3JhcHBlciB0byB0aGUgYHRlbXBsYXRlYCBwcm9wZXJ0eQotICAgIG9uIGEgc3ViY2xhc3Mu
Ci0KLSAgICBAcHJvcGVydHkgbGF5b3V0Ci0gICAgQHR5cGUgRnVuY3Rpb24KLSAgKi8KLSAgbGF5
b3V0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgbGF5b3V0TmFtZSA9
IGdldCh0aGlzLCAnbGF5b3V0TmFtZScpLAotICAgICAgICBsYXlvdXQgPSB0aGlzLnRlbXBsYXRl
Rm9yTmFtZShsYXlvdXROYW1lLCAnbGF5b3V0Jyk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSBz
cGVjaWZpZWQgdGhlIGxheW91dE5hbWUgIiArIGxheW91dE5hbWUgKyAiIGZvciAiICsgdGhpcyAr
ICIsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LiIsICFsYXlvdXROYW1lIHx8IGxheW91dCk7Ci0KLSAg
ICByZXR1cm4gbGF5b3V0IHx8IGdldCh0aGlzLCAnZGVmYXVsdExheW91dCcpOwotICB9KS5wcm9w
ZXJ0eSgnbGF5b3V0TmFtZScpLAotCi0gIF95aWVsZDogZnVuY3Rpb24oY29udGV4dCwgb3B0aW9u
cykgewotICAgIHZhciB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGUnKTsKLSAgICBpZiAo
dGVtcGxhdGUpIHsgdGVtcGxhdGUoY29udGV4dCwgb3B0aW9ucyk7IH0KLSAgfSwKLQotICB0ZW1w
bGF0ZUZvck5hbWU6IGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKLSAgICBpZiAoIW5hbWUpIHsgcmV0
dXJuOyB9Ci0gICAgRW1iZXIuYXNzZXJ0KCJ0ZW1wbGF0ZU5hbWVzIGFyZSBub3QgYWxsb3dlZCB0
byBjb250YWluIHBlcmlvZHM6ICIrbmFtZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKLQot
ICAgIC8vIHRoZSBkZWZhdWx0Q29udGFpbmVyIGlzIGRlcHJlY2F0ZWQKLSAgICB2YXIgY29udGFp
bmVyID0gdGhpcy5jb250YWluZXIgfHwgKEVtYmVyLkNvbnRhaW5lciAmJiBFbWJlci5Db250YWlu
ZXIuZGVmYXVsdENvbnRhaW5lcik7Ci0gICAgcmV0dXJuIGNvbnRhaW5lciAmJiBjb250YWluZXIu
bG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIG9iamVj
dCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNjZXNzIHByb3BlcnRpZXMuCi0KLSAgICBU
aGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gZWFjaCB0
aW1lIHRoZSByZW5kZXIKLSAgICBtZXRob2QgaXMgY2FsbGVkLCBidXQgaXQgaXMgdXAgdG8gdGhl
IGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKLSAgICB0byBkbyB3aXRoIGl0Lgot
Ci0gICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSB2aWV3J3MgY29udHJvbGxlci4KLQot
ICAgIEBwcm9wZXJ0eSBjb250ZXh0Ci0gICAgQHR5cGUgT2JqZWN0Ci0gICovCi0gIGNvbnRleHQ6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMikgewotICAgICAgc2V0KHRoaXMsICdfY29udGV4dCcsIHZhbHVlKTsKLSAg
ICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCAn
X2NvbnRleHQnKTsKLSAgICB9Ci0gIH0pLnZvbGF0aWxlKCksCi0KLSAgLyoqCi0gICAgUHJpdmF0
ZSBjb3B5IG9mIHRoZSB2aWV3J3MgdGVtcGxhdGUgY29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRp
cmVjdGx5Ci0gICAgYnkgSGFuZGxlYmFycyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG9ic2VydmVy
IHRoYXQgY2F1c2VzIHRoZSB2aWV3Ci0gICAgdG8gYmUgcmUtcmVuZGVyZWQuCi0KLSAgICBUaGUg
Y29udGV4dCBvZiBhIHZpZXcgaXMgbG9va2VkIHVwIGFzIGZvbGxvd3M6Ci0KLSAgICAxLiBTdXBw
bGllZCBjb250ZXh0ICh1c3VhbGx5IGJ5IEhhbmRsZWJhcnMpCi0gICAgMi4gU3BlY2lmaWVkIGNv
bnRyb2xsZXIKLSAgICAzLiBgcGFyZW50Vmlld2AncyBjb250ZXh0IChmb3IgYSBjaGlsZCBvZiBh
IENvbnRhaW5lclZpZXcpCi0KLSAgICBUaGUgY29kZSBpbiBIYW5kbGViYXJzIHRoYXQgb3ZlcnJp
ZGVzIHRoZSBgX2NvbnRleHRgIHByb3BlcnR5IGZpcnN0Ci0gICAgY2hlY2tzIHRvIHNlZSB3aGV0
aGVyIHRoZSB2aWV3IGhhcyBhIHNwZWNpZmllZCBjb250cm9sbGVyLiBUaGlzIGlzCi0gICAgc29t
ZXRoaW5nIG9mIGEgaGFjayBhbmQgc2hvdWxkIGJlIHJldmlzaXRlZC4KLQotICAgIEBwcm9wZXJ0
eSBfY29udGV4dAotICAgIEBwcml2YXRlCi0gICovCi0gIF9jb250ZXh0OiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgcGFyZW50VmlldywgY29udHJvbGxlcjsKLQotICAg
IGlmIChjb250cm9sbGVyID0gZ2V0KHRoaXMsICdjb250cm9sbGVyJykpIHsKLSAgICAgIHJldHVy
biBjb250cm9sbGVyOwotICAgIH0KLQotICAgIHBhcmVudFZpZXcgPSB0aGlzLl9wYXJlbnRWaWV3
OwotICAgIGlmIChwYXJlbnRWaWV3KSB7Ci0gICAgICByZXR1cm4gZ2V0KHBhcmVudFZpZXcsICdf
Y29udGV4dCcpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9KSwKLQotICAvKioKLSAg
ICBJZiBhIHZhbHVlIHRoYXQgYWZmZWN0cyB0ZW1wbGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhl
IHZpZXcgc2hvdWxkIGJlCi0gICAgcmUtcmVuZGVyZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVl
LgotCi0gICAgQG1ldGhvZCBfY29udGV4dERpZENoYW5nZQotICAgIEBwcml2YXRlCi0gICovCi0g
IF9jb250ZXh0RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGV4dCcsIGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMucmVyZW5kZXIoKTsKLSAgfSksCi0KLSAgLyoqCi0gICAgSWYgYGZhbHNlYCwg
dGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVuIGluIERPTS4KLQotICAgIEBwcm9wZXJ0eSBpc1Zp
c2libGUKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBpc1Zp
c2libGU6IHRydWUsCi0KLSAgLyoqCi0gICAgQXJyYXkgb2YgY2hpbGQgdmlld3MuIFlvdSBzaG91
bGQgbmV2ZXIgZWRpdCB0aGlzIGFycmF5IGRpcmVjdGx5LgotICAgIEluc3RlYWQsIHVzZSBgYXBw
ZW5kQ2hpbGRgIGFuZCBgcmVtb3ZlRnJvbVBhcmVudGAuCi0KLSAgICBAcHJvcGVydHkgY2hpbGRW
aWV3cwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgW10KLSAgICBAcHJpdmF0ZQotICAq
LwotICBjaGlsZFZpZXdzOiBjaGlsZFZpZXdzUHJvcGVydHksCi0KLSAgX2NoaWxkVmlld3M6IEVN
UFRZX0FSUkFZLAotCi0gIC8vIFdoZW4gaXQncyBhIHZpcnR1YWwgdmlldywgd2UgbmVlZCB0byBu
b3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZWlyCi0gIC8vIGNoaWxkVmlld3Mgd2lsbCBjaGFuZ2Uu
Ci0gIF9jaGlsZFZpZXdzV2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NoaWxkVmll
d3MnLCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBw
YXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0gICAgICBpZiAocGFyZW50Vmll
dykgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UocGFyZW50VmlldywgJ2NoaWxkVmlld3MnKTsg
fQotICAgIH0KLSAgfSksCi0KLSAgLy8gV2hlbiBpdCdzIGEgdmlydHVhbCB2aWV3LCB3ZSBuZWVk
IHRvIG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlaXIKLSAgLy8gY2hpbGRWaWV3cyBkaWQgY2hh
bmdlLgotICBfY2hpbGRWaWV3c0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NoaWxkVmlld3Mn
LCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBwYXJl
bnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0gICAgICBpZiAocGFyZW50Vmlldykg
eyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3cycpOyB9Ci0g
ICAgfQotICB9KSwKLQotICAvKioKLSAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhh
dCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQKLSAgICBjbGFzcy4KLQotICAgIEBwcm9w
ZXJ0eSBuZWFyZXN0SW5zdGFuY2VPZgotICAgIEBwYXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNz
IG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIu
VmlldwotICAgIEBkZXByZWNhdGVkCi0gICovCi0gIG5lYXJlc3RJbnN0YW5jZU9mOiBmdW5jdGlv
bihrbGFzcykgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgibmVhcmVzdEluc3RhbmNlT2YgaXMgZGVw
cmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBVc2UgbmVh
cmVzdE9mVHlwZS4iKTsKLSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwot
Ci0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlmICh2aWV3IGluc3RhbmNlb2Yga2xhc3MpIHsg
cmV0dXJuIHZpZXc7IH0KLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQg
aXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkCi0gICAgY2xhc3Mgb3IgbWl4aW4uCi0KLSAg
ICBAcHJvcGVydHkgbmVhcmVzdE9mVHlwZQotICAgIEBwYXJhbSB7Q2xhc3MsTWl4aW59IGtsYXNz
IFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKSwKLSAgICAgICAg
ICAgb3IgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTWl4aW4uCi0gICAgQHJldHVybiBFbWJlci5WaWV3
Ci0gICovCi0gIG5lYXJlc3RPZlR5cGU6IGZ1bmN0aW9uKGtsYXNzKSB7Ci0gICAgdmFyIHZpZXcg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAgICAgICAgaXNPZlR5cGUgPSBrbGFzcyBpbnN0
YW5jZW9mIEVtYmVyLk1peGluID8KLSAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2aWV3KSB7
IHJldHVybiBrbGFzcy5kZXRlY3Qodmlldyk7IH0gOgotICAgICAgICAgICAgICAgICAgIGZ1bmN0
aW9uKHZpZXcpIHsgcmV0dXJuIGtsYXNzLmRldGVjdCh2aWV3LmNvbnN0cnVjdG9yKTsgfTsKLQot
ICAgIHdoaWxlICh2aWV3KSB7Ci0gICAgICBpZiAoaXNPZlR5cGUodmlldykpIHsgcmV0dXJuIHZp
ZXc7IH0KLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaGFzIGEgZ2l2
ZW4gcHJvcGVydHkuCi0KLSAgICBAZnVuY3Rpb24gbmVhcmVzdFdpdGhQcm9wZXJ0eQotICAgIEBw
YXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBBIHByb3BlcnR5IG5hbWUKLSAgICBAcmV0dXJuIEVtYmVy
LlZpZXcKLSAgKi8KLSAgbmVhcmVzdFdpdGhQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsK
LSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwotCi0gICAgd2hpbGUgKHZp
ZXcpIHsKLSAgICAgIGlmIChwcm9wZXJ0eSBpbiB2aWV3KSB7IHJldHVybiB2aWV3OyB9Ci0gICAg
ICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB3aG9zZSBwYXJlbnQgaXMgYW4gaW5zdGFu
Y2Ugb2YKLSAgICBga2xhc3NgLgotCi0gICAgQG1ldGhvZCBuZWFyZXN0Q2hpbGRPZgotICAgIEBw
YXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcg
aXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIuVmlldwotICAqLwotICBuZWFyZXN0Q2hpbGRPZjog
ZnVuY3Rpb24oa2xhc3MpIHsKLSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50Vmlldycp
OwotCi0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlmIChnZXQodmlldywgJ3BhcmVudFZpZXcn
KSBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2aWV3OyB9Ci0gICAgICB2aWV3ID0gZ2V0KHZp
ZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFdoZW4gdGhlIHBh
cmVudCB2aWV3IGNoYW5nZXMsIHJlY3Vyc2l2ZWx5IGludmFsaWRhdGUgYGNvbnRyb2xsZXJgCi0K
LSAgICBAbWV0aG9kIF9wYXJlbnRWaWV3RGlkQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAg
X3BhcmVudFZpZXdEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdfcGFyZW50VmlldycsIGZ1bmN0
aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICAgIHRo
aXMudHJpZ2dlcigncGFyZW50Vmlld0RpZENoYW5nZScpOwotCi0gICAgaWYgKGdldCh0aGlzLCAn
cGFyZW50Vmlldy5jb250cm9sbGVyJykgJiYgIWdldCh0aGlzLCAnY29udHJvbGxlcicpKSB7Ci0g
ICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdjb250cm9sbGVyJyk7Ci0gICAgfQotICB9
KSwKLQotICBfY29udHJvbGxlckRpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRyb2xsZXIn
LCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0K
LSAgICB0aGlzLnJlcmVuZGVyKCk7Ci0KLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rp
b24odmlldykgewotICAgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnY29udHJvbGxlcicpOwot
ICAgIH0pOwotICB9KSwKLQotICBjbG9uZUtleXdvcmRzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
dGVtcGxhdGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgIHZhciBrZXl3
b3JkcyA9IHRlbXBsYXRlRGF0YSA/IEVtYmVyLmNvcHkodGVtcGxhdGVEYXRhLmtleXdvcmRzKSA6
IHt9OwotICAgIHNldChrZXl3b3JkcywgJ3ZpZXcnLCBnZXQodGhpcywgJ2NvbmNyZXRlVmlldycp
KTsKLSAgICBzZXQoa2V5d29yZHMsICdfdmlldycsIHRoaXMpOwotICAgIHNldChrZXl3b3Jkcywg
J2NvbnRyb2xsZXInLCBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSk7Ci0KLSAgICByZXR1cm4ga2V5
d29yZHM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIG9uIHlvdXIgdmlldyB3aGVuIGl0IHNo
b3VsZCBwdXNoIHN0cmluZ3Mgb2YgSFRNTCBpbnRvIGEKLSAgICBgRW1iZXIuUmVuZGVyQnVmZmVy
YC4gTW9zdCB1c2VycyB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBv
ciBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCi0KLSAg
ICBCeSBkZWZhdWx0LCBgRW1iZXIuVmlld2Agd2lsbCBsb29rIGZvciBhIGZ1bmN0aW9uIGluIHRo
ZSBgdGVtcGxhdGVgCi0gICAgcHJvcGVydHkgYW5kIGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBv
ZiBgY29udGV4dGAuIFRoZSB2YWx1ZSBvZgotICAgIGBjb250ZXh0YCB3aWxsIGJlIHRoZSB2aWV3
J3MgY29udHJvbGxlciB1bmxlc3MgeW91IG92ZXJyaWRlIGl0LgotCi0gICAgQG1ldGhvZCByZW5k
ZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyIFRoZSByZW5kZXIgYnVm
ZmVyCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgLy8gSWYgdGhpcyB2
aWV3IGhhcyBhIGxheW91dCwgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotICAgIC8v
IHRoZSBsYXlvdXQgdG8gcmVuZGVyIHRoZSB2aWV3J3MgdGVtcGxhdGUuIE90aGVyd2lzZSwgcmVu
ZGVyIHRoZSB0ZW1wbGF0ZQotICAgIC8vIGRpcmVjdGx5LgotICAgIHZhciB0ZW1wbGF0ZSA9IGdl
dCh0aGlzLCAnbGF5b3V0JykgfHwgZ2V0KHRoaXMsICd0ZW1wbGF0ZScpOwotCi0gICAgaWYgKHRl
bXBsYXRlKSB7Ci0gICAgICB2YXIgY29udGV4dCA9IGdldCh0aGlzLCAnY29udGV4dCcpOwotICAg
ICAgdmFyIGtleXdvcmRzID0gdGhpcy5jbG9uZUtleXdvcmRzKCk7Ci0gICAgICB2YXIgb3V0cHV0
OwotCi0gICAgICB2YXIgZGF0YSA9IHsKLSAgICAgICAgdmlldzogdGhpcywKLSAgICAgICAgYnVm
ZmVyOiBidWZmZXIsCi0gICAgICAgIGlzUmVuZGVyRGF0YTogdHJ1ZSwKLSAgICAgICAga2V5d29y
ZHM6IGtleXdvcmRzLAotICAgICAgICBpbnNpZGVHcm91cDogZ2V0KHRoaXMsICd0ZW1wbGF0ZURh
dGEuaW5zaWRlR3JvdXAnKQotICAgICAgfTsKLQotICAgICAgLy8gSW52b2tlIHRoZSB0ZW1wbGF0
ZSB3aXRoIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSBjb250ZXh0LCB3aGljaAotICAgICAgLy8gaXMg
dGhlIHZpZXcncyBjb250cm9sbGVyIGJ5IGRlZmF1bHQuIEEgaGFzaCBvZiBkYXRhIGlzIGFsc28g
cGFzc2VkIHRoYXQgcHJvdmlkZXMKLSAgICAgIC8vIHRoZSB0ZW1wbGF0ZSB3aXRoIGFjY2VzcyB0
byB0aGUgdmlldyBhbmQgcmVuZGVyIGJ1ZmZlci4KLQotICAgICAgRW1iZXIuYXNzZXJ0KCd0ZW1w
bGF0ZSBtdXN0IGJlIGEgZnVuY3Rpb24uIERpZCB5b3UgbWVhbiB0byBjYWxsIEVtYmVyLkhhbmRs
ZWJhcnMuY29tcGlsZSgiLi4uIikgb3Igc3BlY2lmeSB0ZW1wbGF0ZU5hbWUgaW5zdGVhZD8nLCB0
eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpOwotICAgICAgLy8gVGhlIHRlbXBsYXRlIHNo
b3VsZCB3cml0ZSBkaXJlY3RseSB0byB0aGUgcmVuZGVyIGJ1ZmZlciBpbnN0ZWFkCi0gICAgICAv
LyBvZiByZXR1cm5pbmcgYSBzdHJpbmcuCi0gICAgICBvdXRwdXQgPSB0ZW1wbGF0ZShjb250ZXh0
LCB7IGRhdGE6IGRhdGEgfSk7Ci0KLSAgICAgIC8vIElmIHRoZSB0ZW1wbGF0ZSByZXR1cm5lZCBh
IHN0cmluZyBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gdGhlIGJ1ZmZlciwKLSAgICAgIC8vIHB1c2gg
dGhlIHN0cmluZyBvbnRvIHRoZSBidWZmZXIuCi0gICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmlu
ZWQpIHsgYnVmZmVyLnB1c2gob3V0cHV0KTsgfQotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBS
ZW5kZXJzIHRoZSB2aWV3IGFnYWluLiBUaGlzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHdoZXRo
ZXIgdGhlCi0gICAgdmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmll
dyBpcyBpbiB0aGUgRE9NLCB0aGUKLSAgICByZW5kZXJpbmcgcHJvY2VzcyB3aWxsIGJlIGRlZmVy
cmVkIHRvIGdpdmUgYmluZGluZ3MgYSBjaGFuY2UKLSAgICB0byBzeW5jaHJvbml6ZS4KLQotICAg
IElmIGNoaWxkcmVuIHdlcmUgYWRkZWQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2VzcyB1c2lu
ZyBgYXBwZW5kQ2hpbGRgLAotICAgIGByZXJlbmRlcmAgd2lsbCByZW1vdmUgdGhlbSwgYmVjYXVz
ZSB0aGV5IHdpbGwgYmUgYWRkZWQgYWdhaW4KLSAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJl
bmRlcmAuCi0KLSAgICBJbiBnZW5lcmFsLCBpZiB0aGUgZGlzcGxheSBvZiB5b3VyIHZpZXcgY2hh
bmdlcywgeW91IHNob3VsZCBtb2RpZnkKLSAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5z
dGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgotICAgIGJlIHNs
b3cuCi0KLSAgICBAbWV0aG9kIHJlcmVuZGVyCi0gICovCi0gIHJlcmVuZGVyOiBmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVyZW5kZXIodGhpcyk7Ci0gIH0sCi0K
LSAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuZ3RoQmVm
b3JlID0gdGhpcy5sZW5ndGhCZWZvcmVSZW5kZXIsCi0gICAgICAgIGxlbmd0aEFmdGVyICA9IHRo
aXMubGVuZ3RoQWZ0ZXJSZW5kZXI7Ci0KLSAgICAvLyBJZiB0aGVyZSB3ZXJlIGNoaWxkIHZpZXdz
IGNyZWF0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gcmVuZGVyKCksCi0gICAgLy8gcmVtb3Zl
IHRoZW0gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgcmUtY3JlYXRlZCB3
aGVuCi0gICAgLy8gd2UgcmUtcmVuZGVyLgotCi0gICAgLy8gVklFVy1UT0RPOiBVbml0IHRlc3Qg
dGhpcyBwYXRoLgotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKLSAgICBm
b3IgKHZhciBpPWxlbmd0aEFmdGVyLTE7IGk+PWxlbmd0aEJlZm9yZTsgaS0tKSB7Ci0gICAgICBp
ZiAoY2hpbGRWaWV3c1tpXSkgeyBjaGlsZFZpZXdzW2ldLmRlc3Ryb3koKTsgfQotICAgIH0KLSAg
fSwKLQotICAvKioKLSAgICBJdGVyYXRlcyBvdmVyIHRoZSB2aWV3J3MgYGNsYXNzTmFtZUJpbmRp
bmdzYCBhcnJheSwgaW5zZXJ0cyB0aGUgdmFsdWUKLSAgICBvZiB0aGUgc3BlY2lmaWVkIHByb3Bl
cnR5IGludG8gdGhlIGBjbGFzc05hbWVzYCBhcnJheSwgdGhlbiBjcmVhdGVzIGFuCi0gICAgb2Jz
ZXJ2ZXIgdG8gdXBkYXRlIHRoZSB2aWV3J3MgZWxlbWVudCBpZiB0aGUgYm91bmQgcHJvcGVydHkg
ZXZlciBjaGFuZ2VzCi0gICAgaW4gdGhlIGZ1dHVyZS4KLQotICAgIEBtZXRob2QgX2FwcGx5Q2xh
c3NOYW1lQmluZGluZ3MKLSAgICBAcHJpdmF0ZQotICAqLwotICBfYXBwbHlDbGFzc05hbWVCaW5k
aW5nczogZnVuY3Rpb24oY2xhc3NCaW5kaW5ncykgewotICAgIHZhciBjbGFzc05hbWVzID0gdGhp
cy5jbGFzc05hbWVzLAotICAgIGVsZW0sIG5ld0NsYXNzLCBkYXNoZXJpemVkQ2xhc3M7Ci0KLSAg
ICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBjb25maWd1cmVkIGJpbmRpbmdzLiBUaGVzZSB3
aWxsIGJlIGVpdGhlcgotICAgIC8vIHByb3BlcnR5IG5hbWVzICgnaXNVcmdlbnQnKSBvciBwcm9w
ZXJ0eSBwYXRocyByZWxhdGl2ZSB0byB0aGUgdmlldwotICAgIC8vICgnY29udGVudC5pc1VyZ2Vu
dCcpCi0gICAgYV9mb3JFYWNoKGNsYXNzQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLQot
ICAgICAgLy8gVmFyaWFibGUgaW4gd2hpY2ggdGhlIG9sZCBjbGFzcyB2YWx1ZSBpcyBzYXZlZC4g
VGhlIG9ic2VydmVyIGZ1bmN0aW9uCi0gICAgICAvLyBjbG9zZXMgb3ZlciB0aGlzIHZhcmlhYmxl
LCBzbyBpdCBrbm93cyB3aGljaCBzdHJpbmcgdG8gcmVtb3ZlIHdoZW4KLSAgICAgIC8vIHRoZSBw
cm9wZXJ0eSBjaGFuZ2VzLgotICAgICAgdmFyIG9sZENsYXNzOwotICAgICAgLy8gRXh0cmFjdCBq
dXN0IHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gYmluZGluZ3MgbGlrZSAnZm9vOmJhcicKLSAgICAg
IHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoYmluZGluZyk7
Ci0KLSAgICAgIC8vIFNldCB1cCBhbiBvYnNlcnZlciBvbiB0aGUgY29udGV4dC4gSWYgdGhlIHBy
b3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUKLSAgICAgIC8vIGNsYXNzIG5hbWUuCi0gICAgICB2
YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZh
bHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAgICBuZXdDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5n
Rm9yUHJvcGVydHkoYmluZGluZyk7Ci0gICAgICAgIGVsZW0gPSB0aGlzLiQoKTsKLQotICAgICAg
ICAvLyBJZiB3ZSBoYWQgcHJldmlvdXNseSBhZGRlZCBhIGNsYXNzIHRvIHRoZSBlbGVtZW50LCBy
ZW1vdmUgaXQuCi0gICAgICAgIGlmIChvbGRDbGFzcykgewotICAgICAgICAgIGVsZW0ucmVtb3Zl
Q2xhc3Mob2xkQ2xhc3MpOwotICAgICAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gY2xhc3NOYW1l
cyBzbyB0aGF0IGlmIHRoZSB2aWV3IGdldHMgcmVyZW5kZXJlZCwKLSAgICAgICAgICAvLyB0aGUg
Y2xhc3MgZG9lc24ndCBnZXQgYWRkZWQgYmFjayB0byB0aGUgRE9NLgotICAgICAgICAgIGNsYXNz
TmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElm
IG5lY2Vzc2FyeSwgYWRkIGEgbmV3IGNsYXNzLiBNYWtlIHN1cmUgd2Uga2VlcCB0cmFjayBvZiBp
dCBzbwotICAgICAgICAvLyBpdCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotICAgICAg
ICBpZiAobmV3Q2xhc3MpIHsKLSAgICAgICAgICBlbGVtLmFkZENsYXNzKG5ld0NsYXNzKTsKLSAg
ICAgICAgICBvbGRDbGFzcyA9IG5ld0NsYXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IG9sZENsYXNzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgLy8gR2V0IHRo
ZSBjbGFzcyBuYW1lIGZvciB0aGUgcHJvcGVydHkgYXQgaXRzIGN1cnJlbnQgdmFsdWUKLSAgICAg
IGRhc2hlcml6ZWRDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkoYmluZGluZyk7
Ci0KLSAgICAgIGlmIChkYXNoZXJpemVkQ2xhc3MpIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQg
aXQgZ2V0cyBpbnRvIHRoZSBjbGFzc05hbWVzIGFycmF5Ci0gICAgICAgIC8vIHNvIGl0IGlzIGRp
c3BsYXllZCB3aGVuIHdlIHJlbmRlci4KLSAgICAgICAgYV9hZGRPYmplY3QoY2xhc3NOYW1lcywg
ZGFzaGVyaXplZENsYXNzKTsKLQotICAgICAgICAvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBj
bGFzcyBuYW1lIHNvIHdlIGNhbiByZW1vdmUgaXQKLSAgICAgICAgLy8gaWYgdGhlIG9ic2VydmVy
IGZpcmVzLiBSZW1lbWJlciB0aGF0IHRoaXMgdmFyaWFibGUgaGFzCi0gICAgICAgIC8vIGJlZW4g
Y2xvc2VkIG92ZXIgYnkgdGhlIG9ic2VydmVyLgotICAgICAgICBvbGRDbGFzcyA9IGRhc2hlcml6
ZWRDbGFzczsKLSAgICAgIH0KLQotICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHBh
cnNlZFBhdGgucGF0aCwgb2JzZXJ2ZXIpOwotICAgICAgLy8gUmVtb3ZlIGNsYXNzTmFtZSBzbyB3
aGVuIHRoZSB2aWV3IGlzIHJlcmVuZGVyZWQsCi0gICAgICAvLyB0aGUgY2xhc3NOYW1lIGlzIGFk
ZGVkIGJhc2VkIG9uIGJpbmRpbmcgcmVldmFsdWF0aW9uCi0gICAgICB0aGlzLm9uZSgnd2lsbENs
ZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmIChvbGRDbGFzcykgewotICAgICAg
ICAgIGNsYXNzTmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsKLSAgICAgICAgICBvbGRDbGFz
cyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgfSwgdGhpcyk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdmlldydzIGF0dHJpYnV0ZSBiaW5kaW5n
cywgc2V0cyB1cCBvYnNlcnZlcnMgZm9yIGVhY2gsCi0gICAgdGhlbiBhcHBsaWVzIHRoZSBjdXJy
ZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBwYXNzZWQgcmVuZGVyIGJ1ZmZlci4K
LQotICAgIEBtZXRob2QgX2FwcGx5QXR0cmlidXRlQmluZGluZ3MKLSAgICBAcGFyYW0ge0VtYmVy
LlJlbmRlckJ1ZmZlcn0gYnVmZmVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2FwcGx5QXR0cmli
dXRlQmluZGluZ3M6IGZ1bmN0aW9uKGJ1ZmZlciwgYXR0cmlidXRlQmluZGluZ3MpIHsKLSAgICB2
YXIgYXR0cmlidXRlVmFsdWUsIGVsZW07Ci0KLSAgICBhX2ZvckVhY2goYXR0cmlidXRlQmluZGlu
Z3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLSAgICAgIHZhciBzcGxpdCA9IGJpbmRpbmcuc3BsaXQo
JzonKSwKLSAgICAgICAgICBwcm9wZXJ0eSA9IHNwbGl0WzBdLAotICAgICAgICAgIGF0dHJpYnV0
ZU5hbWUgPSBzcGxpdFsxXSB8fCBwcm9wZXJ0eTsKLQotICAgICAgLy8gQ3JlYXRlIGFuIG9ic2Vy
dmVyIHRvIGFkZC9yZW1vdmUvY2hhbmdlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlCi0gICAgICAvLyBK
YXZhU2NyaXB0IHByb3BlcnR5IGNoYW5nZXMuCi0gICAgICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlv
bigpIHsKLSAgICAgICAgZWxlbSA9IHRoaXMuJCgpOwotCi0gICAgICAgIGF0dHJpYnV0ZVZhbHVl
ID0gZ2V0KHRoaXMsIHByb3BlcnR5KTsKLQotICAgICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmli
dXRlQmluZGluZ3MoZWxlbSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAg
fTsKLQotICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHByb3BlcnR5LCBvYnNlcnZl
cik7Ci0KLSAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCB2YWx1ZSBhbmQgYWRkIGl0IHRv
IHRoZSByZW5kZXIgYnVmZmVyCi0gICAgICAvLyBpZiBuZWNlc3NhcnkuCi0gICAgICBhdHRyaWJ1
dGVWYWx1ZSA9IGdldCh0aGlzLCBwcm9wZXJ0eSk7Ci0gICAgICBFbWJlci5WaWV3LmFwcGx5QXR0
cmlidXRlQmluZGluZ3MoYnVmZmVyLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0g
ICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLCBy
ZXR1cm5zIGEgZGFzaGVyaXplZCB2ZXJzaW9uIG9mIHRoYXQKLSAgICBwcm9wZXJ0eSBuYW1lIGlm
IHRoZSBwcm9wZXJ0eSBldmFsdWF0ZXMgdG8gYSBub24tZmFsc3kgdmFsdWUuCi0KLSAgICBGb3Ig
ZXhhbXBsZSwgaWYgdGhlIHZpZXcgaGFzIHByb3BlcnR5IGBpc1VyZ2VudGAgdGhhdCBldmFsdWF0
ZXMgdG8gdHJ1ZSwKLSAgICBwYXNzaW5nIGBpc1VyZ2VudGAgdG8gdGhpcyBtZXRob2Qgd2lsbCBy
ZXR1cm4gYCJpcy11cmdlbnQiYC4KLQotICAgIEBtZXRob2QgX2NsYXNzU3RyaW5nRm9yUHJvcGVy
dHkKLSAgICBAcGFyYW0gcHJvcGVydHkKLSAgICBAcHJpdmF0ZQotICAqLwotICBfY2xhc3NTdHJp
bmdGb3JQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsKLSAgICB2YXIgcGFyc2VkUGF0aCA9
IEVtYmVyLlZpZXcuX3BhcnNlUHJvcGVydHlQYXRoKHByb3BlcnR5KTsKLSAgICB2YXIgcGF0aCA9
IHBhcnNlZFBhdGgucGF0aDsKLQotICAgIHZhciB2YWwgPSBnZXQodGhpcywgcGF0aCk7Ci0gICAg
aWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAg
ICAgdmFsID0gZ2V0KEVtYmVyLmxvb2t1cCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVt
YmVyLlZpZXcuX2NsYXNzU3RyaW5nRm9yVmFsdWUocGF0aCwgdmFsLCBwYXJzZWRQYXRoLmNsYXNz
TmFtZSwgcGFyc2VkUGF0aC5mYWxzeUNsYXNzTmFtZSk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBF
TEVNRU5UIFNVUFBPUlQKLSAgLy8KLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50IERP
TSBlbGVtZW50IGZvciB0aGUgdmlldy4KLQotICAgIEBwcm9wZXJ0eSBlbGVtZW50Ci0gICAgQHR5
cGUgRE9NRWxlbWVudAotICAqLwotICBlbGVtZW50OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHJldHVy
biB0aGlzLmN1cnJlbnRTdGF0ZS5zZXRFbGVtZW50KHRoaXMsIHZhbHVlKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmdldEVsZW1lbnQodGhpcyk7Ci0gICAg
fQotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEg
alF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3MgZWxlbWVudC4gSWYgeW91IHBhc3MgaW4gYSBz
ZWxlY3RvcgotICAgIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2Jq
ZWN0LCB1c2luZyB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgYXMgaXRzIGJ1ZmZlci4KLQotICAg
IEZvciBleGFtcGxlLCBjYWxsaW5nIGB2aWV3LiQoJ2xpJylgIHdpbGwgcmV0dXJuIGEgalF1ZXJ5
IG9iamVjdCBjb250YWluaW5nCi0gICAgYWxsIG9mIHRoZSBgbGlgIGVsZW1lbnRzIGluc2lkZSB0
aGUgRE9NIGVsZW1lbnQgb2YgdGhpcyB2aWV3LgotCi0gICAgQG1ldGhvZCAkCi0gICAgQHBhcmFt
IHtTdHJpbmd9IFtzZWxlY3Rvcl0gYSBqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmcK
LSAgICBAcmV0dXJuIHtqUXVlcnl9IHRoZSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgRE9NIG5vZGUK
LSAgKi8KLSAgJDogZnVuY3Rpb24oc2VsKSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRl
LiQodGhpcywgc2VsKTsKLSAgfSwKLQotICBtdXRhdGVDaGlsZFZpZXdzOiBmdW5jdGlvbihjYWxs
YmFjaykgewotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywKLSAgICAgICAg
aWR4ID0gY2hpbGRWaWV3cy5sZW5ndGgsCi0gICAgICAgIHZpZXc7Ci0KLSAgICB3aGlsZSgtLWlk
eCA+PSAwKSB7Ci0gICAgICB2aWV3ID0gY2hpbGRWaWV3c1tpZHhdOwotICAgICAgY2FsbGJhY2so
dGhpcywgdmlldywgaWR4KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBm
b3JFYWNoQ2hpbGRWaWV3OiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgIHZhciBjaGlsZFZpZXdz
ID0gdGhpcy5fY2hpbGRWaWV3czsKLQotICAgIGlmICghY2hpbGRWaWV3cykgeyByZXR1cm4gdGhp
czsgfQotCi0gICAgdmFyIGxlbiA9IGNoaWxkVmlld3MubGVuZ3RoLAotICAgICAgICB2aWV3LCBp
ZHg7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICAgIHZpZXcg
PSBjaGlsZFZpZXdzW2lkeF07Ci0gICAgICBjYWxsYmFjayh2aWV3KTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBBcHBlbmRzIHRoZSB2aWV3J3MgZWxlbWVu
dCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50LgotCi0gICAgSWYgdGhlIHZpZXcgZG9l
cyBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIHlldCwgYGNyZWF0ZUVsZW1lbnQoKWAK
LSAgICB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LgotCi0gICAgTm90ZSB0aGF0IHRoaXMg
bWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCi0g
ICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRp
bCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlzaGVkIHN5bmNocm9uaXppbmcuCi0KLSAgICBU
aGlzIGlzIG5vdCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gY2Fs
bCBkaXJlY3RseSB3aGVuCi0gICAgYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbi4gWW91IG1pZ2h0
IGNvbnNpZGVyIHVzaW5nIGBFbWJlci5Db250YWluZXJWaWV3YAotICAgIGluc3RlYWQuIElmIHlv
dSBkbyBuZWVkIHRvIHVzZSBgYXBwZW5kVG9gLCBiZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBlbGVt
ZW50Ci0gICAgeW91IGFyZSBwcm92aWRpbmcgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGBFbWJlci5B
cHBsaWNhdGlvbmAgYW5kIGRvZXMgbm90Ci0gICAgaGF2ZSBhbiBhbmNlc3RvciBlbGVtZW50IHRo
YXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVtYmVyIHZpZXcuCi0KLSAgICBAbWV0aG9kIGFwcGVu
ZFRvCi0gICAgQHBhcmFtIHtTdHJpbmd8RE9NRWxlbWVudHxqUXVlcnl9IEEgc2VsZWN0b3IsIGVs
ZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIu
Vmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgYXBwZW5kVG86IGZ1bmN0aW9uKHRhcmdldCkgewotICAg
IC8vIFNjaGVkdWxlIHRoZSBET00gZWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBhcHBlbmRlZCB0
byB0aGUgZ2l2ZW4KLSAgICAvLyBlbGVtZW50IGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2hyb25p
emVkLgotICAgIHRoaXMuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKLSAgICAgIEVt
YmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGFwcGVuZCB0byAoIiArIHRhcmdldCArICIpIGJ1dCB0
aGF0IGlzbid0IGluIHRoZSBET00iLCBFbWJlci4kKHRhcmdldCkubGVuZ3RoID4gMCk7Ci0gICAg
ICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIEVtYmVyLlZp
ZXcuIENvbnNpZGVyIHVzaW5nIEVtYmVyLkNvbnRhaW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIu
JCh0YXJnZXQpLmlzKCcuZW1iZXItdmlldycpICYmICFFbWJlci4kKHRhcmdldCkucGFyZW50cygp
LmlzKCcuZW1iZXItdmlldycpKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVuZFRvKHRhcmdldCk7Ci0g
ICAgfSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXBsYWNlcyB0
aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50IHdpdGggdGhpcyB2aWV3
J3MKLSAgICBlbGVtZW50LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVz
ZW50YXRpb24geWV0LAotICAgIGBjcmVhdGVFbGVtZW50KClgIHdpbGwgYmUgY2FsbGVkIGF1dG9t
YXRpY2FsbHkuCi0KLSAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhl
IHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00KLSAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFw
cGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCi0gICAg
ZmluaXNoZWQgc3luY2hyb25pemluZwotCi0gICAgQG1ldGhvZCByZXBsYWNlSW4KLSAgICBAcGFy
YW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0gdGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQs
IEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30g
cmVjZWl2ZWQKLSAgKi8KLSAgcmVwbGFjZUluOiBmdW5jdGlvbih0YXJnZXQpIHsKLSAgICBFbWJl
ci5hc3NlcnQoIllvdSB0cmllZCB0byByZXBsYWNlIGluICgiICsgdGFyZ2V0ICsgIikgYnV0IHRo
YXQgaXNuJ3QgaW4gdGhlIERPTSIsIEVtYmVyLiQodGFyZ2V0KS5sZW5ndGggPiAwKTsKLSAgICBF
bWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVwbGFjZSBhbiBleGlzdGluZyBFbWJlci5WaWV3LiBD
b25zaWRlciB1c2luZyBFbWJlci5Db250YWluZXJWaWV3IGluc3RlYWQuIiwgIUVtYmVyLiQodGFy
Z2V0KS5pcygnLmVtYmVyLXZpZXcnKSAmJiAhRW1iZXIuJCh0YXJnZXQpLnBhcmVudHMoKS5pcygn
LmVtYmVyLXZpZXcnKSk7Ci0KLSAgICB0aGlzLl9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24o
KSB7Ci0gICAgICBFbWJlci4kKHRhcmdldCkuZW1wdHkoKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVu
ZFRvKHRhcmdldCk7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioK
LSAgICBTY2hlZHVsZXMgYSBET00gb3BlcmF0aW9uIHRvIG9jY3VyIGR1cmluZyB0aGUgbmV4dCBy
ZW5kZXIgcGhhc2UuIFRoaXMKLSAgICBlbnN1cmVzIHRoYXQgYWxsIGJpbmRpbmdzIGhhdmUgZmlu
aXNoZWQgc3luY2hyb25pemluZyBiZWZvcmUgdGhlIHZpZXcgaXMKLSAgICByZW5kZXJlZC4KLQot
ICAgIFRvIHVzZSwgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBET00gb3BlcmF0aW9u
LgotCi0gICAgQmVmb3JlIHlvdXIgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGlzIHZpZXcgYW5kIGFs
bCBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUKLSAgICB0aGUgYHdpbGxJbnNlcnRFbGVtZW50YCBl
dmVudC4gQWZ0ZXIgeW91ciBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlzIHZpZXcKLSAgICBhbmQg
YWxsIG9mIGl0cyBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUgdGhlIGBkaWRJbnNlcnRFbGVtZW50
YCBldmVudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0
ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIHRoaXMu
JCgpLmFwcGVuZFRvKCdib2R5Jyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9p
bnNlcnRFbGVtZW50TGF0ZXIKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24g
dGhhdCBpbnNlcnRzIHRoZSBlbGVtZW50IGludG8gdGhlIERPTQotICAgIEBwcml2YXRlCi0gICov
Ci0gIF9pbnNlcnRFbGVtZW50TGF0ZXI6IGZ1bmN0aW9uKGZuKSB7Ci0gICAgdGhpcy5fc2NoZWR1
bGVkSW5zZXJ0ID0gRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgJ19pbnNl
cnRFbGVtZW50JywgZm4pOwotICB9LAotCi0gIF9pbnNlcnRFbGVtZW50OiBmdW5jdGlvbiAoZm4p
IHsKLSAgICB0aGlzLl9zY2hlZHVsZWRJbnNlcnQgPSBudWxsOwotICAgIHRoaXMuY3VycmVudFN0
YXRlLmluc2VydEVsZW1lbnQodGhpcywgZm4pOwotICB9LAotCi0gIC8qKgotICAgIEFwcGVuZHMg
dGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBkb2N1bWVudCBib2R5LiBJZiB0aGUgdmlldyBkb2Vz
Ci0gICAgbm90IGhhdmUgYW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsIGBjcmVhdGVFbGVtZW50
KClgIHdpbGwgYmUgY2FsbGVkCi0gICAgYXV0b21hdGljYWxseS4KLQotICAgIElmIHlvdXIgYXBw
bGljYXRpb24gdXNlcyB0aGUgYHJvb3RFbGVtZW50YCBwcm9wZXJ0eSwgeW91IG11c3QgYXBwZW5k
Ci0gICAgdGhlIHZpZXcgd2l0aGluIHRoYXQgZWxlbWVudC4gUmVuZGVyaW5nIHZpZXdzIG91dHNp
ZGUgb2YgdGhlIGByb290RWxlbWVudGAKLSAgICBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgTm90
ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVk
OyB0aGUgRE9NCi0gICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1l
bnQgYm9keSB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlzaGVkIHN5bmNocm9uaXpp
bmcuCi0KLSAgICBAbWV0aG9kIGFwcGVuZAotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2Vp
dmVyCi0gICovCi0gIGFwcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuYXBwZW5k
VG8oZG9jdW1lbnQuYm9keSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyB0aGUgdmlldydz
IGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB0byB3aGljaCBpdCBpcyBhdHRhY2hlZC4KLQotICAg
IEBtZXRob2QgcmVtb3ZlCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8K
LSAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKLSAgICAvLyBXaGF0IHdlIHNob3VsZCByZWFsbHkgZG8g
aGVyZSBpcyB3YWl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHJ1biBsb29wCi0gICAgLy8gdG8gZGV0
ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlLWFwcGVuZGVkIHRvIGEgZGlmZmVyZW50
Ci0gICAgLy8gZWxlbWVudC4KLSAgICAvLyBJbiB0aGUgaW50ZXJpbSwgd2Ugd2lsbCBqdXN0IHJl
LXJlbmRlciBpZiB0aGF0IGhhcHBlbnMuIEl0IGlzIG1vcmUKLSAgICAvLyBpbXBvcnRhbnQgdGhh
biBlbGVtZW50cyBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgaWYgKCF0aGlzLnJlbW92ZWRG
cm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQoKTsgfQotICAgIHRoaXMuaW52b2tlUmVjdXJz
aXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgaWYgKHZpZXcuY2xlYXJSZW5kZXJlZENoaWxk
cmVuKSB7IHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7IH0KLSAgICB9KTsKLSAgfSwKLQot
ICBlbGVtZW50SWQ6IG51bGwsCi0KLSAgLyoqCi0gICAgQXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhl
IGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVmYXVsdAotICAgIGltcGxlbWVu
dGF0aW9uIGxvb2tzIGZvciBhbiBlbGVtZW50IHdpdGggYW4gSUQgb2YgYGVsZW1lbnRJZGAgKG9y
IHRoZQotICAgIHZpZXcncyBndWlkIGlmIGBlbGVtZW50SWRgIGlzIG51bGwpLiBZb3UgY2FuIG92
ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgcHJvdmlkZSB5b3VyIG93biBmb3JtIG9mIGxvb2t1
cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRpc2NvdmVyIHlvdXIKLSAgICBlbGVtZW50
IHVzaW5nIGEgQ1NTIGNsYXNzIG5hbWUgaW5zdGVhZCBvZiBhbiBJRC4KLQotICAgIEBtZXRob2Qg
ZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQKLSAgICBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVu
dEVsZW1lbnQgVGhlIHBhcmVudCdzIERPTSBlbGVtZW50Ci0gICAgQHJldHVybiB7RE9NRWxlbWVu
dH0gVGhlIGRpc2NvdmVyZWQgZWxlbWVudAotICAqLwotICBmaW5kRWxlbWVudEluUGFyZW50RWxl
bWVudDogZnVuY3Rpb24ocGFyZW50RWxlbSkgewotICAgIHZhciBpZCA9ICIjIiArIHRoaXMuZWxl
bWVudElkOwotICAgIHJldHVybiBFbWJlci4kKGlkKVswXSB8fCBFbWJlci4kKGlkLCBwYXJlbnRF
bGVtKVswXTsKLSAgfSwKLQotICAvKioKLSAgICBDcmVhdGVzIGEgRE9NIHJlcHJlc2VudGF0aW9u
IG9mIHRoZSB2aWV3IGFuZCBhbGwgb2YgaXRzCi0gICAgY2hpbGQgdmlld3MgYnkgcmVjdXJzaXZl
bHkgY2FsbGluZyB0aGUgYHJlbmRlcigpYCBtZXRob2QuCi0KLSAgICBBZnRlciB0aGUgZWxlbWVu
dCBoYXMgYmVlbiBjcmVhdGVkLCBgZGlkSW5zZXJ0RWxlbWVudGAgd2lsbAotICAgIGJlIGNhbGxl
ZCBvbiB0aGlzIHZpZXcgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgICBAbWV0aG9k
IGNyZWF0ZUVsZW1lbnQKLSAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgotICAqLwot
ICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdlbGVtZW50
JykpIHsgcmV0dXJuIHRoaXM7IH0KLQotICAgIHZhciBidWZmZXIgPSB0aGlzLnJlbmRlclRvQnVm
ZmVyKCk7Ci0gICAgc2V0KHRoaXMsICdlbGVtZW50JywgYnVmZmVyLmVsZW1lbnQoKSk7Ci0KLSAg
ICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiBhIHZpZXcgaXMg
Z29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NLgotCi0gICAgQGV2ZW50IHdp
bGxJbnNlcnRFbGVtZW50Ci0gICovCi0gIHdpbGxJbnNlcnRFbGVtZW50OiBFbWJlci5LLAotCi0g
IC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRoZSB2aWV3IGhhcyBiZWVuIGlu
c2VydGVkIGludG8gdGhlIERPTQotICAgIG9yIGFmdGVyIHRoZSB2aWV3IHdhcyByZS1yZW5kZXJl
ZC4gT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBkbyBhbnkKLSAgICBzZXQgdXAgdGhhdCByZXF1
aXJlcyBhbiBlbGVtZW50IGluIHRoZSBkb2N1bWVudCBib2R5LgotCi0gICAgQGV2ZW50IGRpZElu
c2VydEVsZW1lbnQKLSAgKi8KLSAgZGlkSW5zZXJ0RWxlbWVudDogRW1iZXIuSywKLQotICAvKioK
LSAgICBDYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBhYm91dCB0byByZXJlbmRlciwgYnV0IGJlZm9y
ZSBhbnl0aGluZyBoYXMKLSAgICBiZWVuIHRvcm4gZG93bi4gVGhpcyBpcyBhIGdvb2Qgb3Bwb3J0
dW5pdHkgdG8gdGVhciBkb3duIGFueSBtYW51YWwKLSAgICBvYnNlcnZlcnMgeW91IGhhdmUgaW5z
dGFsbGVkIGJhc2VkIG9uIHRoZSBET00gc3RhdGUKLQotICAgIEBldmVudCB3aWxsQ2xlYXJSZW5k
ZXIKLSAgKi8KLSAgd2lsbENsZWFyUmVuZGVyOiBFbWJlci5LLAotCi0gIC8qKgotICAgIFJ1biB0
aGlzIGNhbGxiYWNrIG9uIHRoZSBjdXJyZW50IHZpZXcgKHVubGVzcyBpbmNsdWRlU2VsZiBpcyBm
YWxzZSkgYW5kIHJlY3Vyc2l2ZWx5IG9uIGNoaWxkIHZpZXdzLgotCi0gICAgQG1ldGhvZCBpbnZv
a2VSZWN1cnNpdmVseQotICAgIEBwYXJhbSBmbiB7RnVuY3Rpb259Ci0gICAgQHBhcmFtIGluY2x1
ZGVTZWxmIHtCb29sZWFufSBJbmNsdWRlcyBpdHNlbGYgaWYgdHJ1ZS4KLSAgICBAcHJpdmF0ZQot
ICAqLwotICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rpb24oZm4sIGluY2x1ZGVTZWxmKSB7Ci0g
ICAgdmFyIGNoaWxkVmlld3MgPSAoaW5jbHVkZVNlbGYgPT09IGZhbHNlKSA/IHRoaXMuX2NoaWxk
Vmlld3MgOiBbdGhpc107Ci0gICAgdmFyIGN1cnJlbnRWaWV3cywgdmlldywgY3VycmVudENoaWxk
Vmlld3M7Ci0KLSAgICB3aGlsZSAoY2hpbGRWaWV3cy5sZW5ndGgpIHsKLSAgICAgIGN1cnJlbnRW
aWV3cyA9IGNoaWxkVmlld3Muc2xpY2UoKTsKLSAgICAgIGNoaWxkVmlld3MgPSBbXTsKLQotICAg
ICAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRWaWV3cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
ICAgIHZpZXcgPSBjdXJyZW50Vmlld3NbaV07Ci0gICAgICAgIGN1cnJlbnRDaGlsZFZpZXdzID0g
dmlldy5fY2hpbGRWaWV3cyA/IHZpZXcuX2NoaWxkVmlld3Muc2xpY2UoMCkgOiBudWxsOwotICAg
ICAgICBmbih2aWV3KTsKLSAgICAgICAgaWYgKGN1cnJlbnRDaGlsZFZpZXdzKSB7Ci0gICAgICAg
ICAgY2hpbGRWaWV3cy5wdXNoLmFwcGx5KGNoaWxkVmlld3MsIGN1cnJlbnRDaGlsZFZpZXdzKTsK
LSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSwKLQotICB0cmlnZ2VyUmVjdXJzaXZlbHk6
IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIHZhciBjaGlsZFZpZXdzID0gW3RoaXNdLCBjdXJy
ZW50Vmlld3MsIHZpZXcsIGN1cnJlbnRDaGlsZFZpZXdzOwotCi0gICAgd2hpbGUgKGNoaWxkVmll
d3MubGVuZ3RoKSB7Ci0gICAgICBjdXJyZW50Vmlld3MgPSBjaGlsZFZpZXdzLnNsaWNlKCk7Ci0g
ICAgICBjaGlsZFZpZXdzID0gW107Ci0KLSAgICAgIGZvciAodmFyIGk9MCwgbD1jdXJyZW50Vmll
d3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2aWV3ID0gY3VycmVudFZpZXdzW2ldOwot
ICAgICAgICBjdXJyZW50Q2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MgPyB2aWV3Ll9jaGls
ZFZpZXdzLnNsaWNlKDApIDogbnVsbDsKLSAgICAgICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3
LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAgICAgICBpZiAoY3VycmVudENoaWxkVmlld3MpIHsK
LSAgICAgICAgICBjaGlsZFZpZXdzLnB1c2guYXBwbHkoY2hpbGRWaWV3cywgY3VycmVudENoaWxk
Vmlld3MpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgdmlld0hpZXJh
cmNoeUNvbGxlY3Rpb246IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXJyZW50Vmlldywgdmlld0Nv
bGxlY3Rpb24gPSBuZXcgVmlld0NvbGxlY3Rpb24oW3RoaXNdKTsKLQotICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgdmlld0NvbGxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLSAgICAgIGN1cnJlbnRWaWV3
ID0gdmlld0NvbGxlY3Rpb24ub2JqZWN0QXQoaSk7Ci0gICAgICBpZiAoY3VycmVudFZpZXcuX2No
aWxkVmlld3MpIHsKLSAgICAgICAgdmlld0NvbGxlY3Rpb24ucHVzaC5hcHBseSh2aWV3Q29sbGVj
dGlvbiwgY3VycmVudFZpZXcuX2NoaWxkVmlld3MpOwotICAgICAgfQotICAgIH0KLQotICAgIHJl
dHVybiB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQotICAvKioKLSAgICBEZXN0cm95cyBhbnkgZXhp
c3RpbmcgZWxlbWVudCBhbG9uZyB3aXRoIHRoZSBlbGVtZW50IGZvciBhbnkgY2hpbGQgdmlld3MK
LSAgICBhcyB3ZWxsLiBJZiB0aGUgdmlldyBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIGVsZW1l
bnQsIHRoZW4gdGhpcyBtZXRob2QKLSAgICB3aWxsIGRvIG5vdGhpbmcuCi0KLSAgICBJZiB5b3Ug
aW1wbGVtZW50IGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgb24geW91ciB2aWV3LCB0aGVuIHRoaXMg
bWV0aG9kIHdpbGwKLSAgICBiZSBpbnZva2VkIG9uIHlvdXIgdmlldyBiZWZvcmUgeW91ciBlbGVt
ZW50IGlzIGRlc3Ryb3llZCB0byBnaXZlIHlvdSBhCi0gICAgY2hhbmNlIHRvIGNsZWFuIHVwIGFu
eSBldmVudCBoYW5kbGVycywgZXRjLgotCi0gICAgSWYgeW91IHdyaXRlIGEgYHdpbGxEZXN0cm95
RWxlbWVudCgpYCBoYW5kbGVyLCB5b3UgY2FuIGFzc3VtZSB0aGF0IHlvdXIKLSAgICBgZGlkSW5z
ZXJ0RWxlbWVudCgpYCBoYW5kbGVyIHdhcyBjYWxsZWQgZWFybGllciBmb3IgdGhlIHNhbWUgZWxl
bWVudC4KLQotICAgIFlvdSBzaG91bGQgbm90IGNhbGwgb3Igb3ZlcnJpZGUgdGhpcyBtZXRob2Qg
eW91cnNlbGYsIGJ1dCB5b3UgbWF5Ci0gICAgd2FudCB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGNh
bGxiYWNrcy4KLQotICAgIEBtZXRob2QgZGVzdHJveUVsZW1lbnQKLSAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSByZWNlaXZlcgotICAqLwotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmRlc3Ryb3lFbGVtZW50KHRoaXMpOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRoZSB2aWV3IGlzIGdvaW5n
IHRvIGJlIGRlc3Ryb3llZC4gT3ZlcnJpZGUKLSAgICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0
ZWFyZG93biB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQsIGxpa2UgcmVtb3ZpbmcKLSAgICBldmVu
dCBsaXN0ZW5lcnMuCi0KLSAgICBAZXZlbnQgd2lsbERlc3Ryb3lFbGVtZW50Ci0gICovCi0gIHdp
bGxEZXN0cm95RWxlbWVudDogRW1iZXIuSywKLQotICAvKioKLSAgICBUcmlnZ2VycyB0aGUgYHdp
bGxEZXN0cm95RWxlbWVudGAgZXZlbnQgKHdoaWNoIGludm9rZXMgdGhlCi0gICAgYHdpbGxEZXN0
cm95RWxlbWVudCgpYCBtZXRob2QgaWYgaXQgZXhpc3RzKSBvbiB0aGlzIHZpZXcgYW5kIGFsbCBj
aGlsZAotICAgIHZpZXdzLgotCi0gICAgQmVmb3JlIHRyaWdnZXJpbmcgYHdpbGxEZXN0cm95RWxl
bWVudGAsIGl0IGZpcnN0IHRyaWdnZXJzIHRoZQotICAgIGB3aWxsQ2xlYXJSZW5kZXJgIGV2ZW50
IHJlY3Vyc2l2ZWx5LgotCi0gICAgQG1ldGhvZCBfbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50Ci0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudDogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9uID0gdGhpcy52aWV3SGllcmFyY2h5Q29sbGVjdGlv
bigpOwotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxDbGVhclJlbmRlcicpOwotICAg
IHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxEZXN0cm95RWxlbWVudCcpOwotICAgIHJldHVy
biB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGlzIHZpZXcncyBlbGVt
ZW50IGNoYW5nZXMsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGVzIG9mIG91cgotICAg
IGNoaWxkIHZpZXdzIHNvIHRoYXQgd2UgZG8gbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIERPTSBl
bGVtZW50cyB0aGF0IGFyZQotICAgIG5vIGxvbmdlciBuZWVkZWQuCi0KLSAgICBAbWV0aG9kIF9l
bGVtZW50RGlkQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2VsZW1lbnREaWRDaGFuZ2U6
IEVtYmVyLm9ic2VydmVyKCdlbGVtZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5mb3JFYWNo
Q2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgIGRlbGV0ZSBtZXRhKHZpZXcpLmNhY2hl
LmVsZW1lbnQ7Ci0gICAgfSk7Ci0gIH0pLAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBw
YXJlbnRWaWV3IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCi0gICAgQGV2ZW50IHBhcmVudFZpZXdE
aWRDaGFuZ2UKLSAgKi8KLSAgcGFyZW50Vmlld0RpZENoYW5nZTogRW1iZXIuSywKLQotICBpbnN0
cnVtZW50TmFtZTogJ3ZpZXcnLAotCi0gIGluc3RydW1lbnREZXRhaWxzOiBmdW5jdGlvbihoYXNo
KSB7Ci0gICAgaGFzaC50ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGVOYW1lJyk7Ci0gICAg
dGhpcy5fc3VwZXIoaGFzaCk7Ci0gIH0sCi0KLSAgX3JlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihw
YXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgewotICAgIHRoaXMubGVuZ3RoQmVmb3JlUmVu
ZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgdmFyIGJ1ZmZlciA9IHRoaXMuX3N1
cGVyKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKTsKLSAgICB0aGlzLmxlbmd0aEFmdGVy
UmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwot
ICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uIChidWZmZXIpIHsKLSAg
ICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVuZGVyVG9CdWZmZXJJZk5lZWRlZCh0aGlzLCBi
dWZmZXIpOwotICB9LAotCi0gIGJlZm9yZVJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAg
dGhpcy5hcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcihidWZmZXIpOwotICAgIGJ1ZmZlci5wdXNoT3Bl
bmluZ1RhZygpOwotICB9LAotCi0gIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAg
ICBidWZmZXIucHVzaENsb3NpbmdUYWcoKTsKLSAgfSwKLQotICBhcHBseUF0dHJpYnV0ZXNUb0J1
ZmZlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgLy8gQ3JlYXRlcyBvYnNlcnZlcnMgZm9yIGFs
bCByZWdpc3RlcmVkIGNsYXNzIG5hbWUgYW5kIGF0dHJpYnV0ZSBiaW5kaW5ncywKLSAgICAvLyB0
aGVuIGFkZHMgdGhlbSB0byB0aGUgZWxlbWVudC4KLSAgICB2YXIgY2xhc3NOYW1lQmluZGluZ3Mg
PSBnZXQodGhpcywgJ2NsYXNzTmFtZUJpbmRpbmdzJyk7Ci0gICAgaWYgKGNsYXNzTmFtZUJpbmRp
bmdzLmxlbmd0aCkgewotICAgICAgdGhpcy5fYXBwbHlDbGFzc05hbWVCaW5kaW5ncyhjbGFzc05h
bWVCaW5kaW5ncyk7Ci0gICAgfQotCi0gICAgLy8gUGFzcyB0aGUgcmVuZGVyIGJ1ZmZlciBzbyB0
aGUgbWV0aG9kIGNhbiBhcHBseSBhdHRyaWJ1dGVzIGRpcmVjdGx5LgotICAgIC8vIFRoaXMgaXNu
J3QgbmVlZGVkIGZvciBjbGFzcyBuYW1lIGJpbmRpbmdzIGJlY2F1c2UgdGhleSB1c2UgdGhlCi0g
ICAgLy8gZXhpc3RpbmcgY2xhc3NOYW1lcyBpbmZyYXN0cnVjdHVyZS4KLSAgICB2YXIgYXR0cmli
dXRlQmluZGluZ3MgPSBnZXQodGhpcywgJ2F0dHJpYnV0ZUJpbmRpbmdzJyk7Ci0gICAgaWYgKGF0
dHJpYnV0ZUJpbmRpbmdzLmxlbmd0aCkgewotICAgICAgdGhpcy5fYXBwbHlBdHRyaWJ1dGVCaW5k
aW5ncyhidWZmZXIsIGF0dHJpYnV0ZUJpbmRpbmdzKTsKLSAgICB9Ci0KLSAgICBidWZmZXIuc2V0
Q2xhc3Nlcyh0aGlzLmNsYXNzTmFtZXMpOwotICAgIGJ1ZmZlci5pZCh0aGlzLmVsZW1lbnRJZCk7
Ci0KLSAgICB2YXIgcm9sZSA9IGdldCh0aGlzLCAnYXJpYVJvbGUnKTsKLSAgICBpZiAocm9sZSkg
ewotICAgICAgYnVmZmVyLmF0dHIoJ3JvbGUnLCByb2xlKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0
KHRoaXMsICdpc1Zpc2libGUnKSA9PT0gZmFsc2UpIHsKLSAgICAgIGJ1ZmZlci5zdHlsZSgnZGlz
cGxheScsICdub25lJyk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gU1RBTkRBUkQgUkVO
REVSIFBST1BFUlRJRVMKLSAgLy8KLQotICAvKioKLSAgICBUYWcgbmFtZSBmb3IgdGhlIHZpZXcn
cyBvdXRlciBlbGVtZW50LiBUaGUgdGFnIG5hbWUgaXMgb25seSB1c2VkIHdoZW4gYW4KLSAgICBl
bGVtZW50IGlzIGZpcnN0IGNyZWF0ZWQuIElmIHlvdSBjaGFuZ2UgdGhlIGB0YWdOYW1lYCBmb3Ig
YW4gZWxlbWVudCwgeW91Ci0gICAgbXVzdCBkZXN0cm95IGFuZCByZWNyZWF0ZSB0aGUgdmlldyBl
bGVtZW50LgotCi0gICAgQnkgZGVmYXVsdCwgdGhlIHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBg
PGRpdj5gIHRhZyBmb3Igdmlld3MuCi0KLSAgICBAcHJvcGVydHkgdGFnTmFtZQotICAgIEB0eXBl
IFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLQotICAvLyBXZSBsZWF2ZSB0aGlzIG51
bGwgYnkgZGVmYXVsdCBzbyB3ZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gIC8v
IHRoZSBkZWZhdWx0IGNhc2UgYW5kIGEgdXNlci1zcGVjaWZpZWQgdGFnLgotICB0YWdOYW1lOiBu
dWxsLAotCi0gIC8qKgotICAgIFRoZSBXQUktQVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJl
c2VudGVkIGJ5IHRoaXMgdmlldy4gRm9yIGV4YW1wbGUsIGEKLSAgICBidXR0b24gbWF5IGhhdmUg
YSByb2xlIG9mIHR5cGUgJ2J1dHRvbicsIG9yIGEgcGFuZSBtYXkgaGF2ZSBhIHJvbGUgb2YKLSAg
ICB0eXBlICdhbGVydGRpYWxvZycuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBhc3Npc3RpdmUg
c29mdHdhcmUgdG8gaGVscAotICAgIHZpc3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUg
cmljaCB3ZWIgYXBwbGljYXRpb25zLgotCi0gICAgVGhlIGZ1bGwgbGlzdCBvZiB2YWxpZCBXQUkt
QVJJQSByb2xlcyBpcyBhdmFpbGFibGUgYXQ6Ci0gICAgW2h0dHA6Ly93d3cudzMub3JnL1RSL3dh
aS1hcmlhL3JvbGVzI3JvbGVzX2NhdGVnb3JpemF0aW9uXShodHRwOi8vd3d3LnczLm9yZy9UUi93
YWktYXJpYS9yb2xlcyNyb2xlc19jYXRlZ29yaXphdGlvbikKLQotICAgIEBwcm9wZXJ0eSBhcmlh
Um9sZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgYXJpYVJv
bGU6IG51bGwsCi0KLSAgLyoqCi0gICAgU3RhbmRhcmQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5
IHRvIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVudC4gVGhpcwotICAgIHByb3BlcnR5IGF1dG9tYXRp
Y2FsbHkgaW5oZXJpdHMgYW55IGNsYXNzIG5hbWVzIGRlZmluZWQgYnkgdGhlIHZpZXcncwotICAg
IHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgotCi0gICAgQHByb3BlcnR5IGNsYXNzTmFtZXMKLSAgICBA
dHlwZSBBcnJheQotICAgIEBkZWZhdWx0IFsnZW1iZXItdmlldyddCi0gICovCi0gIGNsYXNzTmFt
ZXM6IFsnZW1iZXItdmlldyddLAotCi0gIC8qKgotICAgIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9m
IHRoZSB2aWV3IHRvIGFwcGx5IGFzIGNsYXNzIG5hbWVzLiBJZiB0aGUgcHJvcGVydHkKLSAgICBp
cyBhIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVlIG9mIHRoYXQgc3RyaW5nIHdpbGwgYmUgYXBwbGll
ZCBhcyBhIGNsYXNzCi0gICAgbmFtZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICAvLyBBcHBs
aWVzIHRoZSAnaGlnaCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3ByaW9yaXR5J10KLSAgICAgIHBy
aW9yaXR5OiAnaGlnaCcKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIHRoZSB2YWx1ZSBvZiB0
aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCi0g
ICAgYWRkZWQgYXMgYSBkYXNoZXJpemVkIGNsYXNzIG5hbWUuCi0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgLy8gQXBwbGllcyB0aGUgJ2lzLXVyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVu
dAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lz
VXJnZW50J10KLSAgICAgIGlzVXJnZW50OiB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBJ
ZiB5b3Ugd291bGQgcHJlZmVyIHRvIHVzZSBhIGN1c3RvbSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBk
YXNoZXJpemVkCi0gICAgcHJvcGVydHkgbmFtZSwgeW91IGNhbiBwYXNzIGEgYmluZGluZyBsaWtl
IHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgJ3VyZ2VudCcg
Y2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAg
IGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50OnVyZ2VudCddCi0gICAgICBpc1VyZ2VudDog
dHJ1ZQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhpcyBsaXN0IG9mIHByb3BlcnRpZXMgaXMg
aW5oZXJpdGVkIGZyb20gdGhlIHZpZXcncyBzdXBlcmNsYXNzZXMgYXMgd2VsbC4KLQotICAgIEBw
cm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQg
W10KLSAgKi8KLSAgY2xhc3NOYW1lQmluZGluZ3M6IEVNUFRZX0FSUkFZLAotCi0gIC8qKgotICAg
IEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGF0dHJpYnV0ZXMu
IElmIHRoZSBwcm9wZXJ0eSBpcwotICAgIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhh
dCBzdHJpbmcgd2lsbCBiZSBhcHBsaWVkIGFzIHRoZSBhdHRyaWJ1dGUuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgdHlwZSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQK
LSAgICAvLyB3aXRoIHRoZSB2YWx1ZSAiYnV0dG9uIiwgbGlrZSA8ZGl2IHR5cGU9ImJ1dHRvbiI+
Ci0gICAgRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlw
ZSddLAotICAgICAgdHlwZTogJ2J1dHRvbicKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIHRo
ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHBy
b3BlcnR5IGlzCi0gICAgYWRkZWQgYXMgYW4gYXR0cmlidXRlLgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIC8vIFJlbmRlcnMgc29tZXRoaW5nIGxpa2UgPGRpdiBlbmFibGVkPSJlbmFibGVkIj4K
LSAgICBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydlbmFi
bGVkJ10sCi0gICAgICBlbmFibGVkOiB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJv
cGVydHkgYXR0cmlidXRlQmluZGluZ3MKLSAgKi8KLSAgYXR0cmlidXRlQmluZGluZ3M6IEVNUFRZ
X0FSUkFZLAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KLSAgLy8gQ09SRSBESVNQTEFZIE1FVEhPRFMKLSAgLy8KLQotICAvKioK
LSAgICBTZXR1cCBhIHZpZXcsIGJ1dCBkbyBub3QgZmluaXNoIHdha2luZyBpdCB1cC4KLQotICAg
ICogY29uZmlndXJlIGBjaGlsZFZpZXdzYAotICAgICogcmVnaXN0ZXIgdGhlIHZpZXcgd2l0aCB0
aGUgZ2xvYmFsIHZpZXdzIGhhc2gsIHdoaWNoIGlzIHVzZWQgZm9yIGV2ZW50Ci0gICAgICBkaXNw
YXRjaAotCi0gICAgQG1ldGhvZCBpbml0Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgaW5pdDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5lbGVtZW50SWQgPSB0aGlzLmVsZW1lbnRJZCB8fCBndWlkRm9y
KHRoaXMpOwotCi0gICAgdGhpcy5fc3VwZXIoKTsKLQotICAgIC8vIHNldHVwIGNoaWxkIHZpZXdz
LiBiZSBzdXJlIHRvIGNsb25lIHRoZSBjaGlsZCB2aWV3cyBhcnJheSBmaXJzdAotICAgIHRoaXMu
X2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLnNsaWNlKCk7Ci0KLSAgICBFbWJlci5hc3Nl
cnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZvciAnY2xhc3NOYW1lQmluZGluZ3MnIiwgRW1i
ZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lQmluZGluZ3MpID09PSAnYXJyYXknKTsKLSAgICB0aGlz
LmNsYXNzTmFtZUJpbmRpbmdzID0gRW1iZXIuQSh0aGlzLmNsYXNzTmFtZUJpbmRpbmdzLnNsaWNl
KCkpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJPbmx5IGFycmF5cyBhcmUgYWxsb3dlZCBmb3IgJ2Ns
YXNzTmFtZXMnIiwgRW1iZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lcykgPT09ICdhcnJheScpOwot
ICAgIHRoaXMuY2xhc3NOYW1lcyA9IEVtYmVyLkEodGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOwot
ICB9LAotCi0gIGFwcGVuZENoaWxkOiBmdW5jdGlvbih2aWV3LCBvcHRpb25zKSB7Ci0gICAgcmV0
dXJuIHRoaXMuY3VycmVudFN0YXRlLmFwcGVuZENoaWxkKHRoaXMsIHZpZXcsIG9wdGlvbnMpOwot
ICB9LAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgZnJvbSB0aGUgcGFyZW50
IHZpZXcuCi0KLSAgICBAbWV0aG9kIHJlbW92ZUNoaWxkCi0gICAgQHBhcmFtIHtFbWJlci5WaWV3
fSB2aWV3Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgcmVtb3Zl
Q2hpbGQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAvLyBJZiB3ZSdyZSBkZXN0cm95aW5nLCB0aGUg
ZW50aXJlIHN1YnRyZWUgd2lsbCBiZQotICAgIC8vIGZyZWVkLCBhbmQgdGhlIERPTSB3aWxsIGJl
IGhhbmRsZWQgc2VwYXJhdGVseSwKLSAgICAvLyBzbyBubyBuZWVkIHRvIG1lc3Mgd2l0aCBjaGls
ZFZpZXdzLgotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICAgIC8v
IHVwZGF0ZSBwYXJlbnQgbm9kZQotICAgIHNldCh2aWV3LCAnX3BhcmVudFZpZXcnLCBudWxsKTsK
LQotICAgIC8vIHJlbW92ZSB2aWV3IGZyb20gY2hpbGRWaWV3cyBhcnJheS4KLSAgICB2YXIgY2hp
bGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3M7Ci0KLSAgICBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
cmVtb3ZlT2JqZWN0KGNoaWxkVmlld3MsIHZpZXcpOwotCi0gICAgdGhpcy5wcm9wZXJ0eURpZENo
YW5nZSgnY2hpbGRWaWV3cycpOyAvLyBIVUg/ISB3aGF0IGhhcHBlbmVkIHRvIHdpbGwgY2hhbmdl
PwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgY2hp
bGRyZW4gZnJvbSB0aGUgYHBhcmVudFZpZXdgLgotCi0gICAgQG1ldGhvZCByZW1vdmVBbGxDaGls
ZHJlbgotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJlbW92ZUFs
bENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdz
KGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsKLSAgICAgIHBhcmVudFZpZXcucmVtb3ZlQ2hp
bGQodmlldyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgZGVzdHJveUFsbENoaWxkcmVuOiBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0aW9uKHBhcmVudFZp
ZXcsIHZpZXcpIHsKLSAgICAgIHZpZXcuZGVzdHJveSgpOwotICAgIH0pOwotICB9LAotCi0gIC8q
KgotICAgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVudFZpZXdgLCBpZiBvbmUgaXMg
Zm91bmQuIE90aGVyd2lzZQotICAgIGRvZXMgbm90aGluZy4KLQotICAgIEBtZXRob2QgcmVtb3Zl
RnJvbVBhcmVudAotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJl
bW92ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJl
bnRWaWV3OwotCi0gICAgLy8gUmVtb3ZlIERPTSBlbGVtZW50IGZyb20gcGFyZW50Ci0gICAgdGhp
cy5yZW1vdmUoKTsKLQotICAgIGlmIChwYXJlbnQpIHsgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMp
OyB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IG11c3QgY2FsbCBg
ZGVzdHJveWAgb24gYSB2aWV3IHRvIGRlc3Ryb3kgdGhlIHZpZXcgKGFuZCBhbGwgb2YgaXRzCi0g
ICAgY2hpbGQgdmlld3MpLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVu
dCBub2RlLCB0aGVuIG1ha2UKLSAgICBzdXJlIHRoYXQgdGhlIERPTSBlbGVtZW50IG1hbmFnZWQg
YnkgdGhlIHZpZXcgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZQotICAgIG1lbW9yeSBtYW5hZ2VyLgot
Ci0gICAgQG1ldGhvZCBkZXN0cm95Ci0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAg
IHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywKLSAgICAgICAgLy8gZ2V0IHBhcmVu
dFZpZXcgYmVmb3JlIGNhbGxpbmcgc3VwZXIgYmVjYXVzZSBpdCdsbCBiZSBkZXN0cm95ZWQKLSAg
ICAgICAgbm9uVmlydHVhbFBhcmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAg
ICAgICAgdmlld05hbWUgPSB0aGlzLnZpZXdOYW1lLAotICAgICAgICBjaGlsZExlbiwgaTsKLQot
ICAgIGlmICghdGhpcy5fc3VwZXIoKSkgeyByZXR1cm47IH0KLQotICAgIGNoaWxkTGVuID0gY2hp
bGRWaWV3cy5sZW5ndGg7Ci0gICAgZm9yIChpPWNoaWxkTGVuLTE7IGk+PTA7IGktLSkgewotICAg
ICAgY2hpbGRWaWV3c1tpXS5yZW1vdmVkRnJvbURPTSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8g
cmVtb3ZlIGZyb20gbm9uLXZpcnR1YWwgcGFyZW50IHZpZXcgaWYgdmlld05hbWUgd2FzIHNwZWNp
ZmllZAotICAgIGlmICh2aWV3TmFtZSAmJiBub25WaXJ0dWFsUGFyZW50VmlldykgewotICAgICAg
bm9uVmlydHVhbFBhcmVudFZpZXcuc2V0KHZpZXdOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBj
aGlsZExlbiA9IGNoaWxkVmlld3MubGVuZ3RoOwotICAgIGZvciAoaT1jaGlsZExlbi0xOyBpPj0w
OyBpLS0pIHsKLSAgICAgIGNoaWxkVmlld3NbaV0uZGVzdHJveSgpOwotICAgIH0KLQotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEluc3RhbnRpYXRlcyBhIHZpZXcgdG8gYmUg
YWRkZWQgdG8gdGhlIGNoaWxkVmlld3MgYXJyYXkgZHVyaW5nIHZpZXcKLSAgICBpbml0aWFsaXph
dGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IHVu
bGVzcwotICAgIHlvdSBhcmUgb3ZlcnJpZGluZyBgY3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0
aGF0IHRoaXMgbWV0aG9kIHdpbGwKLSAgICBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGUgY29y
cmVjdCBzZXR0aW5ncyBvbiB0aGUgbmV3IHZpZXcgaW5zdGFuY2UgdG8KLSAgICBhY3QgYXMgYSBj
aGlsZCBvZiB0aGUgcGFyZW50LgotCi0gICAgQG1ldGhvZCBjcmVhdGVDaGlsZFZpZXcKLSAgICBA
cGFyYW0ge0NsYXNzfFN0cmluZ30gdmlld0NsYXNzCi0gICAgQHBhcmFtIHtIYXNofSBbYXR0cnNd
IEF0dHJpYnV0ZXMgdG8gYWRkCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gbmV3IGluc3RhbmNl
Ci0gICovCi0gIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24odmlldywgYXR0cnMpIHsKLSAgICBp
ZiAoIXZpZXcpIHsKLSAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImNyZWF0ZUNoaWxkVmlld3Mg
Zmlyc3QgYXJndW1lbnQgbXVzdCBleGlzdCIpOwotICAgIH0KLQotICAgIGlmICh2aWV3LmlzVmll
dyAmJiB2aWV3Ll9wYXJlbnRWaWV3ID09PSB0aGlzICYmIHZpZXcuY29udGFpbmVyID09PSB0aGlz
LmNvbnRhaW5lcikgewotICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgfQotCi0gICAgYXR0cnMgPSBh
dHRycyB8fCB7fTsKLSAgICBhdHRycy5fcGFyZW50VmlldyA9IHRoaXM7Ci0KLSAgICBpZiAoRW1i
ZXIuQ29yZVZpZXcuZGV0ZWN0KHZpZXcpKSB7Ci0gICAgICBhdHRycy50ZW1wbGF0ZURhdGEgPSBh
dHRycy50ZW1wbGF0ZURhdGEgfHwgZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgICAg
YXR0cnMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7Ci0gICAgICB2aWV3ID0gdmlldy5jcmVh
dGUoYXR0cnMpOwotCi0gICAgICAvLyBkb24ndCBzZXQgdGhlIHByb3BlcnR5IG9uIGEgdmlydHVh
bCB2aWV3LCBhcyB0aGV5IGFyZSBpbnZpc2libGUgdG8KLSAgICAgIC8vIGNvbnN1bWVycyBvZiB0
aGUgdmlldyBBUEkKLSAgICAgIGlmICh2aWV3LnZpZXdOYW1lKSB7Ci0gICAgICAgIHNldChnZXQo
dGhpcywgJ2NvbmNyZXRlVmlldycpLCB2aWV3LnZpZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgdmlldykgewotICAgICAgdmFyIGZ1bGxO
YW1lID0gJ3ZpZXc6JyArIHZpZXc7Ci0gICAgICB2YXIgVmlldyA9IHRoaXMuY29udGFpbmVyLmxv
b2t1cEZhY3RvcnkoZnVsbE5hbWUpOwotCi0gICAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBm
aW5kIHZpZXc6ICciICsgZnVsbE5hbWUgKyAiJyIsICEhVmlldyk7Ci0KLSAgICAgIGF0dHJzLnRl
bXBsYXRlRGF0YSA9IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7Ci0gICAgICB2aWV3ID0gVmll
dy5jcmVhdGUoYXR0cnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5hc3NlcnQoJ1lvdSBt
dXN0IHBhc3MgaW5zdGFuY2Ugb3Igc3ViY2xhc3Mgb2YgVmlldycsIHZpZXcuaXNWaWV3KTsKLSAg
ICAgIGF0dHJzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwotCi0gICAgICBpZiAoIWdldCh2
aWV3LCAndGVtcGxhdGVEYXRhJykpIHsKLSAgICAgICAgYXR0cnMudGVtcGxhdGVEYXRhID0gZ2V0
KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuc2V0UHJvcGVy
dGllcyh2aWV3LCBhdHRycyk7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfSwKLQot
ICBiZWNhbWVWaXNpYmxlOiBFbWJlci5LLAotICBiZWNhbWVIaWRkZW46IEVtYmVyLkssCi0KLSAg
LyoqCi0gICAgV2hlbiB0aGUgdmlldydzIGBpc1Zpc2libGVgIHByb3BlcnR5IGNoYW5nZXMsIHRv
Z2dsZSB0aGUgdmlzaWJpbGl0eQotICAgIGVsZW1lbnQgb2YgdGhlIGFjdHVhbCBET00gZWxlbWVu
dC4KLQotICAgIEBtZXRob2QgX2lzVmlzaWJsZURpZENoYW5nZQotICAgIEBwcml2YXRlCi0gICov
Ci0gIF9pc1Zpc2libGVEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdpc1Zpc2libGUnLCBmdW5j
dGlvbigpIHsKLSAgICB2YXIgJGVsID0gdGhpcy4kKCk7Ci0gICAgaWYgKCEkZWwpIHsgcmV0dXJu
OyB9Ci0KLSAgICB2YXIgaXNWaXNpYmxlID0gZ2V0KHRoaXMsICdpc1Zpc2libGUnKTsKLQotICAg
ICRlbC50b2dnbGUoaXNWaXNpYmxlKTsKLQotICAgIGlmICh0aGlzLl9pc0FuY2VzdG9ySGlkZGVu
KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAoaXNWaXNpYmxlKSB7Ci0gICAgICB0aGlzLl9ub3Rp
ZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX25vdGlmeUJlY2Ft
ZUhpZGRlbigpOwotICAgIH0KLSAgfSksCi0KLSAgX25vdGlmeUJlY2FtZVZpc2libGU6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmlzaWJsZScpOwotCi0gICAgdGhpcy5m
b3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgIHZhciBpc1Zpc2libGUgPSBn
ZXQodmlldywgJ2lzVmlzaWJsZScpOwotCi0gICAgICBpZiAoaXNWaXNpYmxlIHx8IGlzVmlzaWJs
ZSA9PT0gbnVsbCkgewotICAgICAgICB2aWV3Ll9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgX25vdGlmeUJlY2FtZUhpZGRlbjogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVIaWRkZW4nKTsKLSAgICB0aGlzLmZvckVhY2hDaGls
ZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAgdmFyIGlzVmlzaWJsZSA9IGdldCh2aWV3LCAn
aXNWaXNpYmxlJyk7Ci0KLSAgICAgIGlmIChpc1Zpc2libGUgfHwgaXNWaXNpYmxlID09PSBudWxs
KSB7Ci0gICAgICAgIHZpZXcuX25vdGlmeUJlY2FtZUhpZGRlbigpOwotICAgICAgfQotICAgIH0p
OwotICB9LAotCi0gIF9pc0FuY2VzdG9ySGlkZGVuOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFy
ZW50ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0KLSAgICB3aGlsZSAocGFyZW50KSB7Ci0g
ICAgICBpZiAoZ2V0KHBhcmVudCwgJ2lzVmlzaWJsZScpID09PSBmYWxzZSkgeyByZXR1cm4gdHJ1
ZTsgfQotCi0gICAgICBwYXJlbnQgPSBnZXQocGFyZW50LCAncGFyZW50VmlldycpOwotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLQotICBjbGVhckJ1ZmZlcjogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7Ci0gICAgICB2aWV3
LmJ1ZmZlciA9IG51bGw7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlv
bihzdGF0ZSwgY2hpbGRyZW4pIHsKLSAgICB2YXIgcHJpb3JTdGF0ZSA9IHRoaXMuY3VycmVudFN0
YXRlLAotICAgICAgICBjdXJyZW50U3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuc3Rh
dGVzW3N0YXRlXTsKLSAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0KLSAgICBpZiAocHJpb3JTdGF0
ZSAmJiBwcmlvclN0YXRlLmV4aXQpIHsgcHJpb3JTdGF0ZS5leGl0KHRoaXMpOyB9Ci0gICAgaWYg
KGN1cnJlbnRTdGF0ZS5lbnRlcikgeyBjdXJyZW50U3RhdGUuZW50ZXIodGhpcyk7IH0KLSAgICBp
ZiAoc3RhdGUgPT09ICdpbkRPTScpIHsgZGVsZXRlIEVtYmVyLm1ldGEodGhpcykuY2FjaGUuZWxl
bWVudDsgfQotCi0gICAgaWYgKGNoaWxkcmVuICE9PSBmYWxzZSkgewotICAgICAgdGhpcy5mb3JF
YWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgICAgdmlldy50cmFuc2l0aW9uVG8o
c3RhdGUpOwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gRVZFTlQgSEFORExJ
TkcKLSAgLy8KLQotICAvKioKLSAgICBIYW5kbGUgZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlz
cGF0Y2hlcmAKLQotICAgIEBtZXRob2QgaGFuZGxlRXZlbnQKLSAgICBAcGFyYW0gZXZlbnROYW1l
IHtTdHJpbmd9Ci0gICAgQHBhcmFtIGV2dCB7RXZlbnR9Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAg
aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZXZ0KSB7Ci0gICAgcmV0dXJuIHRoaXMu
Y3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMsIGV2ZW50TmFtZSwgZXZ0KTsKLSAgfSwKLQot
ICByZWdpc3Rlck9ic2VydmVyOiBmdW5jdGlvbihyb290LCBwYXRoLCB0YXJnZXQsIG9ic2VydmVy
KSB7Ci0gICAgaWYgKCFvYnNlcnZlciAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7
Ci0gICAgICBvYnNlcnZlciA9IHRhcmdldDsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQot
Ci0gICAgaWYgKCFyb290IHx8IHR5cGVvZiByb290ICE9PSAnb2JqZWN0JykgewotICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIHZhciB2aWV3ID0gdGhpcywKLSAgICAgICAgc3RhdGVDaGVja2Vk
T2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICB2aWV3LmN1cnJlbnRTdGF0ZS5pbnZv
a2VPYnNlcnZlcih0aGlzLCBvYnNlcnZlcik7Ci0gICAgICAgIH0sCi0gICAgICAgIHNjaGVkdWxl
ZE9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25j
ZSgncmVuZGVyJywgdGhpcywgc3RhdGVDaGVja2VkT2JzZXJ2ZXIpOwotICAgICAgICB9OwotCi0g
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIocm9vdCwgcGF0aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZl
cik7Ci0KLSAgICB0aGlzLm9uZSgnd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAg
ICBFbWJlci5yZW1vdmVPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2Vy
dmVyKTsKLSAgICB9KTsKLSAgfQotCi19KTsKLQotLyoKLSAgRGVzY3JpYmUgaG93IHRoZSBzcGVj
aWZpZWQgYWN0aW9ucyBzaG91bGQgYmVoYXZlIGluIHRoZSB2YXJpb3VzCi0gIHN0YXRlcyB0aGF0
IGEgdmlldyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKLQotICAqIHByZVJlbmRlcjog
d2hlbiBhIHZpZXcgaXMgZmlyc3QgaW5zdGFudGlhdGVkLCBhbmQgYWZ0ZXIgaXRzCi0gICAgZWxl
bWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0aGUgcHJlUmVuZGVyIHN0YXRlCi0gICogaW5C
dWZmZXI6IG9uY2UgYSB2aWV3IGhhcyBiZWVuIHJlbmRlcmVkLCBidXQgYmVmb3JlIGl0IGhhcwot
ICAgIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBpdCBpcyBpbiB0aGUgaW5CdWZmZXIgc3Rh
dGUKLSAgKiBpbkRPTTogb25jZSBhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9N
IGl0IGlzIGluCi0gICAgdGhlIGluRE9NIHN0YXRlLiBBIHZpZXcgc3BlbmRzIHRoZSB2YXN0IG1h
am9yaXR5IG9mIGl0cwotICAgIGV4aXN0ZW5jZSBpbiB0aGlzIHN0YXRlLgotICAqIGRlc3Ryb3ll
ZDogb25jZSBhIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkICh1c2luZyB0aGUgZGVzdHJveQotICAg
IG1ldGhvZCksIGl0IGlzIGluIHRoaXMgc3RhdGUuIE5vIGZ1cnRoZXIgYWN0aW9ucyBjYW4gYmUg
aW52b2tlZAotICAgIG9uIGEgZGVzdHJveWVkIHZpZXcuCi0qLwotCi0gIC8vIGluIHRoZSBkZXN0
cm95ZWQgc3RhdGUsIGV2ZXJ5dGhpbmcgaXMgaWxsZWdhbAotCi0gIC8vIGJlZm9yZSByZW5kZXJp
bmcgaGFzIGJlZ3VuLCBhbGwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgbm9vcHMuCi0KLSAgLy8g
aW5zaWRlIHRoZSBidWZmZXIsIGxlZ2FsIG1hbmlwdWxhdGlvbnMgYXJlIGRvbmUgb24gdGhlIGJ1
ZmZlcgotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9N
LCBsZWdhbCBtYW5pcHVsYXRpb25zCi0gIC8vIGFyZSBkb25lIG9uIHRoZSBET00gZWxlbWVudC4K
LQotZnVuY3Rpb24gbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKSB7Ci0gIEVtYmVyLnJ1bi5vbmNl
KEVtYmVyLlZpZXcsICdub3RpZnlNdXRhdGlvbkxpc3RlbmVycycpOwotfQotCi12YXIgRE9NTWFu
YWdlciA9IHsKLSAgcHJlcGVuZDogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgp
LnByZXBlbmQoaHRtbCk7Ci0gICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQot
ICBhZnRlcjogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLmFmdGVyKGh0bWwp
OwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0sCi0KLSAgaHRtbDogZnVuY3Rp
b24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLmh0bWwoaHRtbCk7Ci0gICAgbm90aWZ5TXV0
YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICByZXBsYWNlOiBmdW5jdGlvbih2aWV3KSB7Ci0g
ICAgdmFyIGVsZW1lbnQgPSBnZXQodmlldywgJ2VsZW1lbnQnKTsKLQotICAgIHNldCh2aWV3LCAn
ZWxlbWVudCcsIG51bGwpOwotCi0gICAgdmlldy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9u
KCkgewotICAgICAgRW1iZXIuJChlbGVtZW50KS5yZXBsYWNlV2l0aChnZXQodmlldywgJ2VsZW1l
bnQnKSk7Ci0gICAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICAgIH0pOwotICB9LAot
Ci0gIHJlbW92ZTogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcuJCgpLnJlbW92ZSgpOwotICAg
IG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZp
ZXcpIHsKLSAgICB2aWV3LiQoKS5lbXB0eSgpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJz
KCk7Ci0gIH0KLX07Ci0KLUVtYmVyLlZpZXcucmVvcGVuKHsKLSAgZG9tTWFuYWdlcjogRE9NTWFu
YWdlcgotfSk7Ci0KLUVtYmVyLlZpZXcucmVvcGVuQ2xhc3MoewotCi0gIC8qKgotICAgIFBhcnNl
IGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xkcyB0aGUgcGFyc2VkIHByb3Bl
cnRpZXMuCi0KLSAgICBGb3IgZXhhbXBsZSBhIHBhdGggbGlrZSAiY29udGVudC5pc0VuYWJsZWQ6
ZW5hYmxlZDpkaXNhYmxlZCIgd2lsbCByZXR1cm4gdGhlCi0gICAgZm9sbG93aW5nIG9iamVjdDoK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB7Ci0gICAgICBwYXRoOiAiY29udGVudC5pc0VuYWJs
ZWQiLAotICAgICAgY2xhc3NOYW1lOiAiZW5hYmxlZCIsCi0gICAgICBmYWxzeUNsYXNzTmFtZTog
ImRpc2FibGVkIiwKLSAgICAgIGNsYXNzTmFtZXM6ICI6ZW5hYmxlZDpkaXNhYmxlZCIKLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9wYXJzZVByb3BlcnR5UGF0aAotICAgIEBzdGF0aWMK
LSAgICBAcHJpdmF0ZQotICAqLwotICBfcGFyc2VQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uKHBhdGgp
IHsKLSAgICB2YXIgc3BsaXQgPSBwYXRoLnNwbGl0KCc6JyksCi0gICAgICAgIHByb3BlcnR5UGF0
aCA9IHNwbGl0WzBdLAotICAgICAgICBjbGFzc05hbWVzID0gIiIsCi0gICAgICAgIGNsYXNzTmFt
ZSwKLSAgICAgICAgZmFsc3lDbGFzc05hbWU7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgcHJvcGVy
dHkgaXMgZGVmaW5lZCBhcyBwcm9wOmNsYXNzIG9yIHByb3A6dHJ1ZUNsYXNzOmZhbHNlQ2xhc3MK
LSAgICBpZiAoc3BsaXQubGVuZ3RoID4gMSkgewotICAgICAgY2xhc3NOYW1lID0gc3BsaXRbMV07
Ci0gICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAzKSB7IGZhbHN5Q2xhc3NOYW1lID0gc3BsaXRb
Ml07IH0KLQotICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNsYXNzTmFtZTsKLSAgICAgIGlmIChm
YWxzeUNsYXNzTmFtZSkgeyBjbGFzc05hbWVzICs9ICI6IiArIGZhbHN5Q2xhc3NOYW1lOyB9Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHsKLSAgICAgIHBhdGg6IHByb3BlcnR5UGF0aCwKLSAgICAgIGNs
YXNzTmFtZXM6IGNsYXNzTmFtZXMsCi0gICAgICBjbGFzc05hbWU6IChjbGFzc05hbWUgPT09ICcn
KSA/IHVuZGVmaW5lZCA6IGNsYXNzTmFtZSwKLSAgICAgIGZhbHN5Q2xhc3NOYW1lOiBmYWxzeUNs
YXNzTmFtZQotICAgIH07Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBjbGFzcyBuYW1lIGZv
ciBhIGdpdmVuIHZhbHVlLCBiYXNlZCBvbiB0aGUgcGF0aCwgb3B0aW9uYWwKLSAgICBgY2xhc3NO
YW1lYCBhbmQgb3B0aW9uYWwgYGZhbHN5Q2xhc3NOYW1lYC4KLQotICAgIC0gaWYgYSBgY2xhc3NO
YW1lYCBvciBgZmFsc3lDbGFzc05hbWVgIGhhcyBiZWVuIHNwZWNpZmllZDoKLSAgICAgIC0gaWYg
dGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgYGNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAot
ICAgICAgICBgY2xhc3NOYW1lYCBpcyByZXR1cm5lZAotICAgICAgLSBpZiB0aGUgdmFsdWUgaXMg
ZmFsc3kgYW5kIGBmYWxzeUNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAotICAgICAgICBg
ZmFsc3lDbGFzc05hbWVgIGlzIHJldHVybmVkCi0gICAgICAtIG90aGVyd2lzZSBgbnVsbGAgaXMg
cmV0dXJuZWQKLSAgICAtIGlmIHRoZSB2YWx1ZSBpcyBgdHJ1ZWAsIHRoZSBkYXNoZXJpemVkIGxh
c3QgcGFydCBvZiB0aGUgc3VwcGxpZWQgcGF0aAotICAgICAgaXMgcmV0dXJuZWQKLSAgICAtIGlm
IHRoZSB2YWx1ZSBpcyBub3QgYGZhbHNlYCwgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZh
bHVlYAotICAgICAgaXMgcmV0dXJuZWQKLSAgICAtIGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVz
IGFwcGx5LCBgbnVsbGAgaXMgcmV0dXJuZWQKLQotICAgIEBtZXRob2QgX2NsYXNzU3RyaW5nRm9y
VmFsdWUKLSAgICBAcGFyYW0gcGF0aAotICAgIEBwYXJhbSB2YWwKLSAgICBAcGFyYW0gY2xhc3NO
YW1lCi0gICAgQHBhcmFtIGZhbHN5Q2xhc3NOYW1lCi0gICAgQHN0YXRpYwotICAgIEBwcml2YXRl
Ci0gICovCi0gIF9jbGFzc1N0cmluZ0ZvclZhbHVlOiBmdW5jdGlvbihwYXRoLCB2YWwsIGNsYXNz
TmFtZSwgZmFsc3lDbGFzc05hbWUpIHsKLSAgICAvLyBXaGVuIHVzaW5nIHRoZSBjb2xvbiBzeW50
YXgsIGV2YWx1YXRlIHRoZSB0cnV0aGluZXNzIG9yIGZhbHNpbmVzcwotICAgIC8vIG9mIHRoZSB2
YWx1ZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhc3NOYW1lIHRvIHJldHVybgotICAgIGlmIChjbGFz
c05hbWUgfHwgZmFsc3lDbGFzc05hbWUpIHsKLSAgICAgIGlmIChjbGFzc05hbWUgJiYgISF2YWwp
IHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLQotICAgICAgfSBlbHNlIGlmIChmYWxzeUNs
YXNzTmFtZSAmJiAhdmFsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzeUNsYXNzTmFtZTsKLQotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAvLyBJZiB2
YWx1ZSBpcyBhIEJvb2xlYW4gYW5kIHRydWUsIHJldHVybiB0aGUgZGFzaGVyaXplZCBwcm9wZXJ0
eQotICAgIC8vIG5hbWUuCi0gICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIHsKLSAgICAgIC8v
IE5vcm1hbGl6ZSBwcm9wZXJ0eSBwYXRoIHRvIGJlIHN1aXRhYmxlIGZvciB1c2UKLSAgICAgIC8v
IGFzIGEgY2xhc3MgbmFtZS4gRm9yIGV4YXBsZSwgY29udGVudC5mb28uYmFyQmF6Ci0gICAgICAv
LyBiZWNvbWVzIGJhci1iYXouCi0gICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7Ci0g
ICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgtMV0p
OwotCi0gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmYWxzZSwgdW5kZWZpbmVkLCBvciBudWxs
LCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAvLyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAg
fSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZhbCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4g
dmFsOwotCi0gICAgLy8gTm90aGluZyB0byBkaXNwbGF5LiBSZXR1cm4gbnVsbCBzbyB0aGF0IHRo
ZSBvbGQgY2xhc3MgaXMgcmVtb3ZlZAotICAgIC8vIGJ1dCBubyBuZXcgY2xhc3MgaXMgYWRkZWQu
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfSk7Ci0KLXZh
ciBtdXRhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCkuY3JlYXRlKCk7
Ci0KLUVtYmVyLlZpZXcuYWRkTXV0YXRpb25MaXN0ZW5lciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7
Ci0gIG11dGF0aW9uLm9uKCdjaGFuZ2UnLCBjYWxsYmFjayk7Ci19OwotCi1FbWJlci5WaWV3LnJl
bW92ZU11dGF0aW9uTGlzdGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICBtdXRhdGlvbi5v
ZmYoJ2NoYW5nZScsIGNhbGxiYWNrKTsKLX07Ci0KLUVtYmVyLlZpZXcubm90aWZ5TXV0YXRpb25M
aXN0ZW5lcnMgPSBmdW5jdGlvbigpIHsKLSAgbXV0YXRpb24udHJpZ2dlcignY2hhbmdlJyk7Ci19
OwotCi0vKioKLSAgR2xvYmFsIHZpZXdzIGhhc2gKLQotICBAcHJvcGVydHkgdmlld3MKLSAgQHN0
YXRpYwotICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuVmlldy52aWV3cyA9IHt9OwotCi0vLyBJZiBz
b21lb25lIG92ZXJyaWRlcyB0aGUgY2hpbGQgdmlld3MgY29tcHV0ZWQgcHJvcGVydHkgd2hlbgot
Ly8gZGVmaW5pbmcgdGhlaXIgY2xhc3MsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBwcm9jZXNzIHRo
ZSB1c2VyJ3MKLS8vIHN1cHBsaWVkIGNoaWxkVmlld3MgYW5kIHRoZW4gcmVzdG9yZSB0aGUgb3Jp
Z2luYWwgY29tcHV0ZWQgcHJvcGVydHkKLS8vIGF0IHZpZXcgaW5pdGlhbGl6YXRpb24gdGltZS4g
VGhpcyBoYXBwZW5zIGluIEVtYmVyLkNvbnRhaW5lclZpZXcncyBpbml0Ci0vLyBtZXRob2QuCi1F
bWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSA9IGNoaWxkVmlld3NQcm9wZXJ0eTsKLQotRW1i
ZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzID0gZnVuY3Rpb24oZWxlbSwgbmFtZSwgdmFs
dWUpIHsKLSAgdmFyIHR5cGUgPSBFbWJlci50eXBlT2YodmFsdWUpOwotCi0gIC8vIGlmIHRoaXMg
Y2hhbmdlcywgYWxzbyBjaGFuZ2UgdGhlIGxvZ2ljIGluIGVtYmVyLWhhbmRsZWJhcnMvbGliL2hl
bHBlcnMvYmluZGluZy5qcwotICBpZiAobmFtZSAhPT0gJ3ZhbHVlJyAmJiAodHlwZSA9PT0gJ3N0
cmluZycgfHwgKHR5cGUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpKSkgewotICAgIGlm
ICh2YWx1ZSAhPT0gZWxlbS5hdHRyKG5hbWUpKSB7Ci0gICAgICBlbGVtLmF0dHIobmFtZSwgdmFs
dWUpOwotICAgIH0KLSAgfSBlbHNlIGlmIChuYW1lID09PSAndmFsdWUnIHx8IHR5cGUgPT09ICdi
b29sZWFuJykgewotICAgIC8vIFdlIGNhbid0IHNldCBwcm9wZXJ0aWVzIHRvIHVuZGVmaW5lZCBv
ciBudWxsCi0gICAgaWYgKEVtYmVyLmlzTm9uZSh2YWx1ZSkpIHsgdmFsdWUgPSAnJzsgfQotCi0g
ICAgaWYgKCF2YWx1ZSkgewotICAgICAgZWxlbS5yZW1vdmVBdHRyKG5hbWUpOwotICAgIH0KLQot
ICAgIGlmICh2YWx1ZSAhPT0gZWxlbS5wcm9wKG5hbWUpKSB7Ci0gICAgICAvLyB2YWx1ZSBhbmQg
Ym9vbGVhbnMgc2hvdWxkIGFsd2F5cyBiZSBwcm9wZXJ0aWVzCi0gICAgICBlbGVtLnByb3AobmFt
ZSwgdmFsdWUpOwotICAgIH0KLSAgfSBlbHNlIGlmICghdmFsdWUpIHsKLSAgICBlbGVtLnJlbW92
ZUF0dHIobmFtZSk7Ci0gIH0KLX07Ci0KLUVtYmVyLlZpZXcuc3RhdGVzID0gc3RhdGVzOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Ci0KLUVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0ID0gewotICAvLyBhcHBlbmRDaGlsZCBpcyBv
bmx5IGxlZ2FsIHdoaWxlIHJlbmRlcmluZyB0aGUgYnVmZmVyLgotICBhcHBlbmRDaGlsZDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhyb3cgIllvdSBjYW4ndCB1c2UgYXBwZW5kQ2hpbGQgb3V0c2lkZSBv
ZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MiOwotICB9LAotCi0gICQ6IGZ1bmN0aW9uKCkgewotICAg
IHJldHVybiB1bmRlZmluZWQ7Ci0gIH0sCi0KLSAgZ2V0RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5F
dmVudERpc3BhdGNoZXJgCi0gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dHJ1ZTsgLy8gY29udGludWUgZXZlbnQgcHJvcGFnYXRpb24KLSAgfSwKLQotICBkZXN0cm95RWxl
bWVudDogZnVuY3Rpb24odmlldykgewotICAgIHNldCh2aWV3LCAnZWxlbWVudCcsIG51bGwpOwot
ICAgIGlmICh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpIHsKLSAgICAgIEVtYmVyLnJ1bi5jYW5jZWwo
dmlldy5fc2NoZWR1bGVkSW5zZXJ0KTsKLSAgICAgIHZpZXcuX3NjaGVkdWxlZEluc2VydCA9IG51
bGw7Ci0gICAgfQotICAgIHJldHVybiB2aWV3OwotICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZO
ZWVkZWQ6IGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0KLSAgcmVyZW5k
ZXI6IEVtYmVyLkssCi0gIGludm9rZU9ic2VydmVyOiBFbWJlci5LCi19OwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgcHJlUmVuZGVyID0gRW1iZXIuVmlldy5zdGF0ZXMucHJlUmVuZGVyID0g
RW1iZXIuY3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKLQotRW1iZXIubWVyZ2Uo
cHJlUmVuZGVyLCB7Ci0gIC8vIGEgdmlldyBsZWF2ZXMgdGhlIHByZVJlbmRlciBzdGF0ZSBvbmNl
IGl0cyBlbGVtZW50IGhhcyBiZWVuCi0gIC8vIGNyZWF0ZWQgKGNyZWF0ZUVsZW1lbnQpLgotICBp
bnNlcnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBmbikgewotICAgIHZpZXcuY3JlYXRlRWxlbWVu
dCgpOwotICAgIHZhciB2aWV3Q29sbGVjdGlvbiA9IHZpZXcudmlld0hpZXJhcmNoeUNvbGxlY3Rp
b24oKTsKLQotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7
Ci0KLSAgICBmbi5jYWxsKHZpZXcpOwotCi0gICAgLy8gV2UgdHJhbnNpdGlvbiB0byBgaW5ET01g
IGlmIHRoZSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgRE9NCi0gICAgdmFyIGVsZW1lbnQgPSB2aWV3
LmdldCgnZWxlbWVudCcpOwotICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2Rl
KSB7Ci0gICAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQpIHsKLSAgICAgICAgdmlld0NvbGxl
Y3Rpb24udHJhbnNpdGlvblRvKCdpbkRPTScsIGZhbHNlKTsKLSAgICAgICAgdmlld0NvbGxlY3Rp
b24udHJpZ2dlcignZGlkSW5zZXJ0RWxlbWVudCcpOwotICAgICAgfQotICAgIH0KLQotICB9LAot
Ci0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcsIGJ1ZmZlcikgewotICAg
IHZpZXcucmVuZGVyVG9CdWZmZXIoYnVmZmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQot
ICBlbXB0eTogRW1iZXIuSywKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkg
ewotICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgewotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ2hh
c0VsZW1lbnQnKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19KTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci12aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12
YXIgaW5CdWZmZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShF
bWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7Ci0KLUVtYmVyLm1lcmdlKGluQnVmZmVyLCB7Ci0g
ICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewotICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZWxl
bWVudCB5ZXQsIHNvbWVvbmUgY2FsbGluZyB0aGlzLiQoKSBpcwotICAgIC8vIHRyeWluZyB0byB1
cGRhdGUgYW4gZWxlbWVudCB0aGF0IGlzbid0IGluIHRoZSBET00uIEluc3RlYWQsCi0gICAgLy8g
cmVyZW5kZXIgdGhlIHZpZXcgdG8gYWxsb3cgdGhlIHJlbmRlciBtZXRob2QgdG8gcmVmbGVjdCB0
aGUKLSAgICAvLyBjaGFuZ2VzLgotICAgIHZpZXcucmVyZW5kZXIoKTsKLSAgICByZXR1cm4gRW1i
ZXIuJCgpOwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVy
LCByZXJlbmRlcmluZyBpdCBzaW1wbHkKLSAgLy8gcmVwbGFjZXMgdGhlIGV4aXN0aW5nIGJ1ZmZl
ciB3aXRoIGEgbmV3IG9uZQotICByZXJlbmRlcjogZnVuY3Rpb24odmlldykgewotICAgIHRocm93
IG5ldyBFbWJlci5FcnJvcigiU29tZXRoaW5nIHlvdSBkaWQgY2F1c2VkIGEgdmlldyB0byByZS1y
ZW5kZXIgYWZ0ZXIgaXQgcmVuZGVyZWQgYnV0IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0
aGUgRE9NLiIpOwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVm
ZmVyLCBhcHBlbmRpbmcgYSBjaGlsZAotICAvLyB2aWV3IHdpbGwgcmVuZGVyIHRoYXQgdmlldyBh
bmQgYXBwZW5kIHRoZSByZXN1bHRpbmcKLSAgLy8gYnVmZmVyIGludG8gaXRzIGJ1ZmZlci4KLSAg
YXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKHZpZXcsIGNoaWxkVmlldywgb3B0aW9ucykgewotICAgIHZh
ciBidWZmZXIgPSB2aWV3LmJ1ZmZlciwgX2NoaWxkVmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzOwot
Ci0gICAgY2hpbGRWaWV3ID0gdmlldy5jcmVhdGVDaGlsZFZpZXcoY2hpbGRWaWV3LCBvcHRpb25z
KTsKLSAgICBpZiAoIV9jaGlsZFZpZXdzLmxlbmd0aCkgeyBfY2hpbGRWaWV3cyA9IHZpZXcuX2No
aWxkVmlld3MgPSBfY2hpbGRWaWV3cy5zbGljZSgpOyB9Ci0gICAgX2NoaWxkVmlld3MucHVzaChj
aGlsZFZpZXcpOwotCi0gICAgY2hpbGRWaWV3LnJlbmRlclRvQnVmZmVyKGJ1ZmZlcik7Ci0KLSAg
ICB2aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0KLSAgICByZXR1cm4gY2hp
bGRWaWV3OwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVy
LCBkZXN0cm95aW5nIHRoZQotICAvLyBlbGVtZW50IHdpbGwgc2ltcGx5IGRlc3Ryb3kgdGhlIGJ1
ZmZlciBhbmQgcHV0IHRoZQotICAvLyBzdGF0ZSBiYWNrIGludG8gdGhlIHByZVJlbmRlciBzdGF0
ZS4KLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LmNsZWFyQnVm
ZmVyKCk7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9uID0gdmlldy5fbm90aWZ5V2lsbERlc3Ryb3lF
bGVtZW50KCk7Ci0gICAgdmlld0NvbGxlY3Rpb24udHJhbnNpdGlvblRvKCdwcmVSZW5kZXInLCBm
YWxzZSk7Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfSwKLQotICBlbXB0eTogZnVuY3Rpb24oKSB7
Ci0gICAgRW1iZXIuYXNzZXJ0KCJFbXB0eWluZyBhIHZpZXcgaW4gdGhlIGluQnVmZmVyIHN0YXRl
IGlzIG5vdCBhbGxvd2VkIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgInNob3VsZCBub3QgaGFw
cGVuIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBNb3N0IGxpa2VseSAiICsKLSAgICAgICAg
ICAgICAgICAgInRoZXJlIGlzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIFRoaXMgbWF5IGJl
IGR1ZSB0byAiICsKLSAgICAgICAgICAgICAgICAgImV4Y2Vzc2l2ZSBwcm9wZXJ0eSBjaGFuZ2Ug
bm90aWZpY2F0aW9ucy4iKTsKLSAgfSwKLQotICByZW5kZXJUb0J1ZmZlcklmTmVlZGVkOiBmdW5j
dGlvbiAodmlldywgYnVmZmVyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0gIC8vIEl0
IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJlbmRlcmVkIHZpZXcgdG8gYmUgc2NoZWR1bGVk
IGZvcgotICAvLyBpbnNlcnRpb24uCi0gIGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAg
IHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVu
IHJlbmRlcmVkIjsKLSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkg
ewotICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3By
ZVJlbmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2aWV3LmNsZWFyQnVmZmVyKCk7Ci0gICAg
ICB2aWV3LnRyYW5zaXRpb25UbygnaGFzRWxlbWVudCcpOwotICAgIH0KLQotICAgIHJldHVybiB2
YWx1ZTsKLSAgfSwKLQotICBpbnZva2VPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvYnNlcnZl
cikgewotICAgIG9ic2VydmVyLmNhbGwodGFyZ2V0KTsKLSAgfQotfSk7Ci0KLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12
aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIg
aGFzRWxlbWVudCA9IEVtYmVyLlZpZXcuc3RhdGVzLmhhc0VsZW1lbnQgPSBFbWJlci5jcmVhdGUo
RW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOwotCi1FbWJlci5tZXJnZShoYXNFbGVtZW50LCB7
Ci0gICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewotICAgIHZhciBlbGVtID0gZ2V0KHZpZXcsICdl
bGVtZW50Jyk7Ci0gICAgcmV0dXJuIHNlbCA/IEVtYmVyLiQoc2VsLCBlbGVtKSA6IEVtYmVyLiQo
ZWxlbSk7Ci0gIH0sCi0KLSAgZ2V0RWxlbWVudDogZnVuY3Rpb24odmlldykgewotICAgIHZhciBw
YXJlbnQgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICBpZiAocGFyZW50KSB7IHBhcmVu
dCA9IGdldChwYXJlbnQsICdlbGVtZW50Jyk7IH0KLSAgICBpZiAocGFyZW50KSB7IHJldHVybiB2
aWV3LmZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50KHBhcmVudCk7IH0KLSAgICByZXR1cm4gRW1i
ZXIuJCgiIyIgKyBnZXQodmlldywgJ2VsZW1lbnRJZCcpKVswXTsKLSAgfSwKLQotICBzZXRFbGVt
ZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewot
ICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICB0aHJvdyAiWW91IGNhbm5vdCBzZXQgYW4gZWxlbWVudCB0byBhIG5vbi1udWxsIHZhbHVlIHdo
ZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgRE9NLiI7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHZhbHVlOwotICB9LAotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQg
aW50byB0aGUgRE9NLCByZXJlbmRlcmluZyBpcwotICAvLyBkZWZlcnJlZCB0byBhbGxvdyBiaW5k
aW5ncyB0byBzeW5jaHJvbml6ZS4KLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2
aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbENsZWFyUmVuZGVyJyk7Ci0KLSAgICB2aWV3LmNs
ZWFyUmVuZGVyZWRDaGlsZHJlbigpOwotCi0gICAgdmlldy5kb21NYW5hZ2VyLnJlcGxhY2Uodmll
dyk7Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0KLSAgLy8gb25jZSB0aGUgdmlldyBpcyBhbHJl
YWR5IGluIHRoZSBET00sIGRlc3Ryb3lpbmcgaXQgcmVtb3ZlcyBpdAotICAvLyBmcm9tIHRoZSBE
T00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8gdGhlCi0gIC8vIHBy
ZVJlbmRlciBzdGF0ZSBpZiBpbkRPTS4KLQotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmll
dykgewotICAgIHZpZXcuX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudCgpOwotICAgIHZpZXcuZG9t
TWFuYWdlci5yZW1vdmUodmlldyk7Ci0gICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7Ci0g
ICAgaWYgKHZpZXcuX3NjaGVkdWxlZEluc2VydCkgewotICAgICAgRW1iZXIucnVuLmNhbmNlbCh2
aWV3Ll9zY2hlZHVsZWRJbnNlcnQpOwotICAgICAgdmlldy5fc2NoZWR1bGVkSW5zZXJ0ID0gbnVs
bDsKLSAgICB9Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZp
ZXcpIHsKLSAgICB2YXIgX2NoaWxkVmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzLCBsZW4sIGlkeDsK
LSAgICBpZiAoX2NoaWxkVmlld3MpIHsKLSAgICAgIGxlbiA9IF9jaGlsZFZpZXdzLmxlbmd0aDsK
LSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewotICAgICAgICBfY2hpbGRW
aWV3c1tpZHhdLl9ub3RpZnlXaWxsRGVzdHJveUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0g
ICAgdmlldy5kb21NYW5hZ2VyLmVtcHR5KHZpZXcpOwotICB9LAotCi0gIC8vIEhhbmRsZSBldmVu
dHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYAotICBoYW5kbGVFdmVudDogZnVuY3Rpb24o
dmlldywgZXZlbnROYW1lLCBldnQpIHsKLSAgICBpZiAodmlldy5oYXMoZXZlbnROYW1lKSkgewot
ICAgICAgLy8gSGFuZGxlciBzaG91bGQgYmUgYWJsZSB0byByZS1kaXNwYXRjaCBldmVudHMsIHNv
IHdlIGRvbid0Ci0gICAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciBzdG9wUHJvcGFnYXRpb24uCi0g
ICAgICByZXR1cm4gdmlldy50cmlnZ2VyKGV2ZW50TmFtZSwgZXZ0KTsKLSAgICB9IGVsc2Ugewot
ICAgICAgcmV0dXJuIHRydWU7IC8vIGNvbnRpbnVlIGV2ZW50IHByb3BhZ2F0aW9uCi0gICAgfQot
ICB9LAotCi0gIGludm9rZU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9ic2VydmVyKSB7Ci0g
ICAgb2JzZXJ2ZXIuY2FsbCh0YXJnZXQpOwotICB9Ci19KTsKLQotdmFyIGluRE9NID0gRW1iZXIu
Vmlldy5zdGF0ZXMuaW5ET00gPSBFbWJlci5jcmVhdGUoaGFzRWxlbWVudCk7Ci0KLUVtYmVyLm1l
cmdlKGluRE9NLCB7Ci0gIGVudGVyOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgLy8gUmVnaXN0ZXIg
dGhlIHZpZXcgZm9yIGV2ZW50IGhhbmRsaW5nLiBUaGlzIGhhc2ggaXMgdXNlZCBieQotICAgIC8v
IEVtYmVyLkV2ZW50RGlzcGF0Y2hlciB0byBkaXNwYXRjaCBpbmNvbWluZyBldmVudHMuCi0gICAg
aWYgKCF2aWV3LmlzVmlydHVhbCkgewotICAgICAgRW1iZXIuYXNzZXJ0KCJBdHRlbXB0ZWQgdG8g
cmVnaXN0ZXIgYSB2aWV3IHdpdGggYW4gaWQgYWxyZWFkeSBpbiB1c2U6ICIrdmlldy5lbGVtZW50
SWQsICFFbWJlci5WaWV3LnZpZXdzW3ZpZXcuZWxlbWVudElkXSk7Ci0gICAgICBFbWJlci5WaWV3
LnZpZXdzW3ZpZXcuZWxlbWVudElkXSA9IHZpZXc7Ci0gICAgfQotCi0gICAgdmlldy5hZGRCZWZv
cmVPYnNlcnZlcignZWxlbWVudElkJywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoIkNoYW5naW5nIGEgdmlldydzIGVsZW1lbnRJZCBhZnRlciBjcmVhdGlvbiBpcyBu
b3QgYWxsb3dlZCIpOwotICAgIH0pOwotICB9LAotCi0gIGV4aXQ6IGZ1bmN0aW9uKHZpZXcpIHsK
LSAgICBpZiAoIXRoaXMuaXNWaXJ0dWFsKSBkZWxldGUgRW1iZXIuVmlldy52aWV3c1t2aWV3LmVs
ZW1lbnRJZF07Ci0gIH0sCi0KLSAgaW5zZXJ0RWxlbWVudDogZnVuY3Rpb24odmlldywgZm4pIHsK
LSAgICB0aHJvdyAiWW91IGNhbid0IGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlIERPTSB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQiOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwot
Ki8KLQotdmFyIGRlc3Ryb3lpbmdFcnJvciA9ICJZb3UgY2FuJ3QgY2FsbCAlQCBvbiBhIHZpZXcg
YmVpbmcgZGVzdHJveWVkIiwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKLQotdmFyIGRlc3Ryb3lp
bmcgPSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95aW5nID0gRW1iZXIuY3JlYXRlKEVtYmVyLlZp
ZXcuc3RhdGVzLl9kZWZhdWx0KTsKLQotRW1iZXIubWVyZ2UoZGVzdHJveWluZywgewotICBhcHBl
bmRDaGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWydh
cHBlbmRDaGlsZCddKTsKLSAgfSwKLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKCkgewotICAgIHRocm93
IGZtdChkZXN0cm95aW5nRXJyb3IsIFsncmVyZW5kZXInXSk7Ci0gIH0sCi0gIGRlc3Ryb3lFbGVt
ZW50OiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbJ2Rlc3Ry
b3lFbGVtZW50J10pOwotICB9LAotICBlbXB0eTogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10
KGRlc3Ryb3lpbmdFcnJvciwgWydlbXB0eSddKTsKLSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5j
dGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbInNldCgnZWxlbWVudCcs
IC4uLikiXSk7Ci0gIH0sCi0KLSAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0gIC8vIFNpbmNlIGVsZW1lbnQgaW5zZXJ0aW9u
IGlzIHNjaGVkdWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcgaWYKLSAgLy8gdGhlIHZpZXcgaGFzIGJl
ZW4gZGVzdHJveWVkIGJldHdlZW4gc2NoZWR1bGluZyBhbmQgZXhlY3V0aW9uCi0gIGluc2VydEVs
ZW1lbnQ6IEVtYmVyLksKLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJl
ci5WaWV3LmNsb25lU3RhdGVzID0gZnVuY3Rpb24oZnJvbSkgewotICB2YXIgaW50byA9IHt9Owot
Ci0gIGludG8uX2RlZmF1bHQgPSB7fTsKLSAgaW50by5wcmVSZW5kZXIgPSBFbWJlci5jcmVhdGUo
aW50by5fZGVmYXVsdCk7Ci0gIGludG8uZGVzdHJveWluZyA9IEVtYmVyLmNyZWF0ZShpbnRvLl9k
ZWZhdWx0KTsKLSAgaW50by5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsK
LSAgaW50by5oYXNFbGVtZW50ID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQpOwotICBpbnRv
LmluRE9NID0gRW1iZXIuY3JlYXRlKGludG8uaGFzRWxlbWVudCk7Ci0KLSAgZm9yICh2YXIgc3Rh
dGVOYW1lIGluIGZyb20pIHsKLSAgICBpZiAoIWZyb20uaGFzT3duUHJvcGVydHkoc3RhdGVOYW1l
KSkgeyBjb250aW51ZTsgfQotICAgIEVtYmVyLm1lcmdlKGludG9bc3RhdGVOYW1lXSwgZnJvbVtz
dGF0ZU5hbWVdKTsKLSAgfQotCi0gIHJldHVybiBpbnRvOwotfTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLXZhciBzdGF0ZXMgPSBFbWJlci5WaWV3LmNsb25lU3RhdGVzKEVtYmVyLlZp
ZXcuc3RhdGVzKTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdz
Ci0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFj
aCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwotdmFyIFZpZXdDb2xsZWN0aW9uID0g
RW1iZXIuX1ZpZXdDb2xsZWN0aW9uOwotCi0vKioKLSAgQSBgQ29udGFpbmVyVmlld2AgaXMgYW4g
YEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5
YAotICBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFuYWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3Mu
Ci0KLSAgIyMgU2V0dGluZyBJbml0aWFsIENoaWxkIFZpZXdzCi0KLSAgVGhlIGluaXRpYWwgYXJy
YXkgb2YgY2hpbGQgdmlld3MgY2FuIGJlIHNldCBpbiBvbmUgb2YgdHdvIHdheXMuIFlvdSBjYW4K
LSAgcHJvdmlkZSBhIGBjaGlsZFZpZXdzYCBwcm9wZXJ0eSBhdCBjcmVhdGlvbiB0aW1lIHRoYXQg
Y29udGFpbnMgaW5zdGFuY2Ugb2YKLSAgYEVtYmVyLlZpZXdgOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKLSAgICBjaGlsZFZp
ZXdzOiBbRW1iZXIuVmlldy5jcmVhdGUoKSwgRW1iZXIuVmlldy5jcmVhdGUoKV0KLSAgfSk7Ci0g
IGBgYAotCi0gIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB3
aG9zZSB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZgotICBgRW1iZXIuVmlld2A6Ci0KLSAgYGBgamF2
YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewotICAg
IGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcnLCAnY1ZpZXcnXSwKLSAgICBhVmlldzogRW1i
ZXIuVmlldy5jcmVhdGUoKSwKLSAgICBiVmlldzogRW1iZXIuVmlldy5jcmVhdGUoKSwKLSAgICBj
VmlldzogRW1iZXIuVmlldy5jcmVhdGUoKQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIHR3byBzdHJh
dGVnaWVzIGNhbiBiZSBjb21iaW5lZDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIGFDb250YWluZXIg
PSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7Ci0gICAgY2hpbGRWaWV3czogWydhVmlldycs
IEVtYmVyLlZpZXcuY3JlYXRlKCldLAotICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCi0g
IH0pOwotICBgYGAKLQotICBFYWNoIGNoaWxkIHZpZXcncyByZW5kZXJpbmcgd2lsbCBiZSBpbnNl
cnRlZCBpbnRvIHRoZSBjb250YWluZXIncyByZW5kZXJlZAotICBIVE1MIGluIHRoZSBzYW1lIG9y
ZGVyIGFzIGl0cyBwb3NpdGlvbiBpbiB0aGUgYGNoaWxkVmlld3NgIHByb3BlcnR5LgotCi0gICMj
IEFkZGluZyBhbmQgUmVtb3ZpbmcgQ2hpbGQgVmlld3MKLQotICBUaGUgY29udGFpbmVyIHZpZXcg
aW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5YCBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFu
YWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgVG8gcmVtb3ZlIGEgdmlldywgcGFzcyB0
aGF0IHZpZXcgaW50byBhIGByZW1vdmVPYmplY3RgIGNhbGwgb24gdGhlIGNvbnRhaW5lciB2aWV3
LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRoZSBmb2xsb3dpbmcgY29kZQotCi0gIGBg
YGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsK
LSAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWluZXInXSwKLSAgICBjaGlsZFZpZXdzOiBbJ2FW
aWV3JywgJ2JWaWV3J10sCi0gICAgYVZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkEiKQotICAgIH0pLAotICAgIGJWaWV3
OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCJCIikKLSAgICB9KQotICB9KTsKLQotICBhQ29udGFpbmVyLmFwcGVuZFRvKCdib2R5
Jyk7Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4KLSAgPC9k
aXY+Ci0gIGBgYAotCi0gIFJlbW92aW5nIGEgdmlldwotCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNv
bnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRhaW5lci5iVmll
d10KLSAgYUNvbnRhaW5lci5yZW1vdmVPYmplY3QoYUNvbnRhaW5lci5nZXQoJ2JWaWV3JykpOwot
ICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3XQotICBgYGAKLQot
ICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+QTwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgU2ltaWxhcmx5LCBhZGRpbmcgYSBj
aGlsZCB2aWV3IGlzIGFjY29tcGxpc2hlZCBieSBhZGRpbmcgYEVtYmVyLlZpZXdgIGluc3RhbmNl
cyB0byB0aGUKLSAgY29udGFpbmVyIHZpZXcuCi0KLSAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAg
dGhlIGZvbGxvd2luZyBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1i
ZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewotICAgIGNsYXNzTmFtZXM6IFsndGhlLWNvbnRhaW5l
ciddLAotICAgIGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcnXSwKLSAgICBhVmlldzogRW1i
ZXIuVmlldy5jcmVhdGUoewotICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGls
ZSgiQSIpCi0gICAgfSksCi0gICAgYlZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkIiKQotICAgIH0pCi0gIH0pOwotCi0g
IGFDb250YWluZXIuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUg
SFRNTAotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVy
Ij4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5BPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0i
ZW1iZXItdmlldyI+QjwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgQWRkaW5nIGEgdmlldwot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgQW5vdGhlclZpZXdDbGFzcyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJBbm90aGVyIHZpZXci
KQotICB9KTsKLQotICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3
LCBhQ29udGFpbmVyLmJWaWV3XQotICBhQ29udGFpbmVyLnB1c2hPYmplY3QoQW5vdGhlclZpZXdD
bGFzcy5jcmVhdGUoKSk7Ci0gIGFDb250YWluZXIudG9BcnJheSgpOyAvLyBbYUNvbnRhaW5lci5h
VmlldywgYUNvbnRhaW5lci5iVmlldywgPEFub3RoZXJWaWV3Q2xhc3MgaW5zdGFuY2U+XQotICBg
YGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwKLQotICBgYGBodG1sCi0g
IDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0i
ZW1iZXItdmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4K
LSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5Bbm90aGVyIHZpZXc8L2Rpdj4KLSAgPC9kaXY+
Ci0gIGBgYAotCi0gICMjIFRlbXBsYXRlcyBhbmQgTGF5b3V0Ci0KLSAgQSBgdGVtcGxhdGVgLCBg
dGVtcGxhdGVOYW1lYCwgYGRlZmF1bHRUZW1wbGF0ZWAsIGBsYXlvdXRgLCBgbGF5b3V0TmFtZWAg
b3IKLSAgYGRlZmF1bHRMYXlvdXRgIHByb3BlcnR5IG9uIGEgY29udGFpbmVyIHZpZXcgd2lsbCBu
b3QgcmVzdWx0IGluIHRoZSB0ZW1wbGF0ZQotICBvciBsYXlvdXQgYmVpbmcgcmVuZGVyZWQuIFRo
ZSBIVE1MIGNvbnRlbnRzIG9mIGEgYEVtYmVyLkNvbnRhaW5lclZpZXdgJ3MgRE9NCi0gIHJlcHJl
c2VudGF0aW9uIHdpbGwgb25seSBiZSB0aGUgcmVuZGVyZWQgSFRNTCBvZiBpdHMgY2hpbGQgdmll
d3MuCi0KLSAgQGNsYXNzIENvbnRhaW5lclZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ29udGFpbmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLk11dGFibGVBcnJheSwgewotICBzdGF0ZXM6IHN0YXRlcywKLQotICBpbml0OiBm
dW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotCi0gICAgdmFyIGNoaWxkVmlld3MgPSBn
ZXQodGhpcywgJ2NoaWxkVmlld3MnKTsKLQotICAgIC8vIHJlZGVmaW5lIHZpZXcncyBjaGlsZFZp
ZXdzIHByb3BlcnR5IHRoYXQgd2FzIG9ibGl0ZXJhdGVkCi0gICAgRW1iZXIuZGVmaW5lUHJvcGVy
dHkodGhpcywgJ2NoaWxkVmlld3MnLCBFbWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSk7Ci0K
LSAgICB2YXIgX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOwotCi0gICAgZm9yRWFjaChj
aGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3TmFtZSwgaWR4KSB7Ci0gICAgICB2YXIgdmlldzsKLQot
ICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygdmlld05hbWUpIHsKLSAgICAgICAgdmlldyA9
IGdldCh0aGlzLCB2aWV3TmFtZSk7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmll
dyh2aWV3KTsKLSAgICAgICAgc2V0KHRoaXMsIHZpZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3TmFtZSk7Ci0gICAg
ICB9Ci0KLSAgICAgIF9jaGlsZFZpZXdzW2lkeF0gPSB2aWV3OwotICAgIH0sIHRoaXMpOwotCi0g
ICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOwotICAgIGlmIChj
dXJyZW50VmlldykgewotICAgICAgaWYgKCFfY2hpbGRWaWV3cy5sZW5ndGgpIHsgX2NoaWxkVmll
d3MgPSB0aGlzLl9jaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cy5zbGljZSgpOyB9Ci0gICAg
ICBfY2hpbGRWaWV3cy5wdXNoKHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGN1cnJlbnRWaWV3KSk7Ci0g
ICAgfQotICB9LAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRl
ZFZpZXdzKSB7Ci0gICAgdmFyIGFkZGVkQ291bnQgPSBhZGRlZFZpZXdzID8gZ2V0KGFkZGVkVmll
d3MsICdsZW5ndGgnKSA6IDA7Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIEVtYmVyLmFzc2Vy
dCgiWW91IGNhbid0IGFkZCBhIGNoaWxkIHRvIGEgY29udGFpbmVyIHRoYXQgaXMgYWxyZWFkeSBh
IGNoaWxkIG9mIGFub3RoZXIgdmlldyIsIEVtYmVyLkEoYWRkZWRWaWV3cykuZXZlcnkoZnVuY3Rp
b24oaXRlbSkgeyByZXR1cm4gIWdldChpdGVtLCAnX3BhcmVudFZpZXcnKSB8fCBnZXQoaXRlbSwg
J19wYXJlbnRWaWV3JykgPT09IHNlbGY7IH0pKTsKLQotICAgIHRoaXMuYXJyYXlDb250ZW50V2ls
bENoYW5nZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Ci0gICAgdGhpcy5jaGlsZFZp
ZXdzV2lsbENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3VudCk7Ci0KLSAg
ICBpZiAoYWRkZWRDb3VudCA9PT0gMCkgewotICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2Uo
aWR4LCByZW1vdmVkQ291bnQpIDsKLSAgICB9IGVsc2UgewotICAgICAgdmFyIGFyZ3MgPSBbaWR4
LCByZW1vdmVkQ291bnRdLmNvbmNhdChhZGRlZFZpZXdzKTsKLSAgICAgIGlmIChhZGRlZFZpZXdz
Lmxlbmd0aCAmJiAhdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGgpIHsgdGhpcy5fY2hpbGRWaWV3cyA9
IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsgfQotICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxp
Y2UuYXBwbHkodGhpcy5fY2hpbGRWaWV3cywgYXJncyk7Ci0gICAgfQotCi0gICAgdGhpcy5hcnJh
eUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpOwotICAgIHRo
aXMuY2hpbGRWaWV3c0RpZENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3Vu
dCwgYWRkZWRDb3VudCk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBvYmplY3RBdDog
ZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRoaXMuX2NoaWxkVmlld3NbaWR4XTsKLSAgfSwK
LQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhp
cy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gIH0pLnZvbGF0aWxlKCksCi0KLSAgLyoqCi0gICAgSW5z
dHJ1Y3RzIGVhY2ggY2hpbGQgdmlldyB0byByZW5kZXIgdG8gdGhlIHBhc3NlZCByZW5kZXIgYnVm
ZmVyLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHJlbmRlcgotICAgIEBwYXJhbSB7RW1i
ZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIGJ1ZmZlciB0byByZW5kZXIgdG8KLSAgKi8KLSAg
cmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVu
Y3Rpb24odmlldykgewotICAgICAgdmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOwotICAgIH0p
OwotICB9LAotCi0gIGluc3RydW1lbnROYW1lOiAnY29udGFpbmVyJywKLQotICAvKioKLSAgICBX
aGVuIGEgY2hpbGQgdmlldyBpcyByZW1vdmVkLCBkZXN0cm95IGl0cyBlbGVtZW50IHNvIHRoYXQK
LSAgICBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4KLQotICAgIFRoZSBhcnJheSBvYnNlcnZl
ciB0aGF0IHRyaWdnZXJzIHRoaXMgYWN0aW9uIGlzIHNldCB1cCBpbiB0aGUKLSAgICBgcmVuZGVy
VG9CdWZmZXJgIG1ldGhvZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBjaGlsZFZpZXdz
V2lsbENoYW5nZQotICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBjaGlsZCB2aWV3
cyBhcnJheSBiZWZvcmUgbXV0YXRpb24KLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIHN0
YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVk
IHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAotICAqKi8KLSAgY2hpbGRWaWV3c1dp
bGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCkgewotICAgIHRoaXMucHJv
cGVydHlXaWxsQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0KLSAgICBpZiAocmVtb3ZlZCA+IDApIHsK
LSAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5zbGljZShzdGFydCwgc3RhcnQrcmVtb3Zl
ZCk7Ci0gICAgICAvLyB0cmFuc2l0aW9uIHRvIHByZVJlbmRlciBiZWZvcmUgY2xlYXJpbmcgcGFy
ZW50VmlldwotICAgICAgdGhpcy5jdXJyZW50U3RhdGUuY2hpbGRWaWV3c1dpbGxDaGFuZ2UodGhp
cywgdmlld3MsIHN0YXJ0LCByZW1vdmVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNo
YW5nZWRWaWV3cywgbnVsbCwgbnVsbCk7Ci0gICAgfQotICB9LAotCi0gIHJlbW92ZUNoaWxkOiBm
dW5jdGlvbihjaGlsZCkgewotICAgIHRoaXMucmVtb3ZlT2JqZWN0KGNoaWxkKTsKLSAgICByZXR1
cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBXaGVuIGEgY2hpbGQgdmlldyBpcyBhZGRlZCwg
bWFrZSBzdXJlIHRoZSBET00gZ2V0cyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCi0KLSAgICBJZiB0
aGUgdmlldyBoYXMgYWxyZWFkeSByZW5kZXJlZCBhbiBlbGVtZW50LCB3ZSB0ZWxsIHRoZSBjaGls
ZCB2aWV3IHRvCi0gICAgY3JlYXRlIGFuIGVsZW1lbnQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBE
T00uIElmIHRoZSBlbmNsb3NpbmcgY29udGFpbmVyCi0gICAgdmlldyBoYXMgYWxyZWFkeSB3cml0
dGVuIHRvIGEgYnVmZmVyLCBidXQgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBidWZmZXIKLSAgICBp
bnRvIGFuIGVsZW1lbnQsIHdlIGluc2VydCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRo
ZSBjaGlsZCBpbnRvIHRoZQotICAgIGFwcHJvcHJpYXRlIHBsYWNlIGluIHRoZSBidWZmZXIuCi0K
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgY2hpbGRWaWV3c0RpZENoYW5nZQotICAgIEBwYXJh
bSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBhcnJheSBvZiBjaGlsZCB2aWV3cyBhZnRlIHRoZSBt
dXRhdGlvbiBoYXMgb2NjdXJyZWQKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIHN0YXJ0
IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIHRo
ZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAotICAgIEBwYXJhbSB7TnVtYmVyfSB0aGUg
bnVtYmVyIG9mIGNoaWxkIHZpZXdzIGFkZGVkCi0gICovCi0gIGNoaWxkVmlld3NEaWRDaGFuZ2U6
IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCwgYWRkZWQpIHsKLSAgICBpZiAoYWRkZWQg
PiAwKSB7Ci0gICAgICB2YXIgY2hhbmdlZFZpZXdzID0gdmlld3Muc2xpY2Uoc3RhcnQsIHN0YXJ0
K2FkZGVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNoYW5nZWRWaWV3cywgdGhpcywg
Z2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKSk7Ci0gICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5jaGls
ZFZpZXdzRGlkQ2hhbmdlKHRoaXMsIHZpZXdzLCBzdGFydCwgYWRkZWQpOwotICAgIH0KLSAgICB0
aGlzLnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0gIH0sCi0KLSAgaW5pdGlhbGl6
ZVZpZXdzOiBmdW5jdGlvbih2aWV3cywgcGFyZW50VmlldywgdGVtcGxhdGVEYXRhKSB7Ci0gICAg
Zm9yRWFjaCh2aWV3cywgZnVuY3Rpb24odmlldykgewotICAgICAgc2V0KHZpZXcsICdfcGFyZW50
VmlldycsIHBhcmVudFZpZXcpOwotCi0gICAgICBpZiAoIXZpZXcuY29udGFpbmVyICYmIHBhcmVu
dFZpZXcpIHsKLSAgICAgICAgc2V0KHZpZXcsICdjb250YWluZXInLCBwYXJlbnRWaWV3LmNvbnRh
aW5lcik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkg
ewotICAgICAgICBzZXQodmlldywgJ3RlbXBsYXRlRGF0YScsIHRlbXBsYXRlRGF0YSk7Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgY3VycmVudFZpZXc6IG51bGwsCi0KLSAgX2N1cnJlbnRW
aWV3V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2N1cnJlbnRWaWV3JywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOwot
ICAgIGlmIChjdXJyZW50VmlldykgewotICAgICAgY3VycmVudFZpZXcuZGVzdHJveSgpOwotICAg
IH0KLSAgfSksCi0KLSAgX2N1cnJlbnRWaWV3RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY3Vy
cmVudFZpZXcnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgY3VycmVudFZpZXcgPSBnZXQodGhpcywg
J2N1cnJlbnRWaWV3Jyk7Ci0gICAgaWYgKGN1cnJlbnRWaWV3KSB7Ci0gICAgICBFbWJlci5hc3Nl
cnQoIllvdSB0cmllZCB0byBzZXQgYSBjdXJyZW50IHZpZXcgdGhhdCBhbHJlYWR5IGhhcyBhIHBh
cmVudC4gTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIG11bHRpcGxlIG91dGxldHMgaW4gdGhlIHNh
bWUgdmlldy4iLCAhZ2V0KGN1cnJlbnRWaWV3LCAnX3BhcmVudFZpZXcnKSk7Ci0gICAgICB0aGlz
LnB1c2hPYmplY3QoY3VycmVudFZpZXcpOwotICAgIH0KLSAgfSksCi0KLSAgX2Vuc3VyZUNoaWxk
cmVuQXJlSW5ET006IGZ1bmN0aW9uICgpIHsKLSAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbnN1cmVD
aGlsZHJlbkFyZUluRE9NKHRoaXMpOwotICB9Ci19KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLl9k
ZWZhdWx0LCB7Ci0gIGNoaWxkVmlld3NXaWxsQ2hhbmdlOiBFbWJlci5LLAotICBjaGlsZFZpZXdz
RGlkQ2hhbmdlOiBFbWJlci5LLAotICBlbnN1cmVDaGlsZHJlbkFyZUluRE9NOiBFbWJlci5LCi19
KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmluQnVmZmVyLCB7Ci0gIGNoaWxkVmlld3NEaWRDaGFu
Z2U6IGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXdzLCBzdGFydCwgYWRkZWQpIHsKLSAgICB0aHJv
dyBuZXcgRW1iZXIuRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGNoaWxkIHZpZXdzIHdoaWxlIGlu
IHRoZSBpbkJ1ZmZlciBzdGF0ZScpOwotICB9Ci19KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmhh
c0VsZW1lbnQsIHsKLSAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXcsIHZpZXdz
LCBzdGFydCwgcmVtb3ZlZCkgewotICAgIGZvciAodmFyIGk9c3RhcnQ7IGk8c3RhcnQrcmVtb3Zl
ZDsgaSsrKSB7Ci0gICAgICB2aWV3c1tpXS5yZW1vdmUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgY2hp
bGRWaWV3c0RpZENoYW5nZTogZnVuY3Rpb24odmlldywgdmlld3MsIHN0YXJ0LCBhZGRlZCkgewot
ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHZpZXcsICdfZW5zdXJlQ2hpbGRy
ZW5BcmVJbkRPTScpOwotICB9LAotCi0gIGVuc3VyZUNoaWxkcmVuQXJlSW5ET006IGZ1bmN0aW9u
KHZpZXcpIHsKLSAgICB2YXIgY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MsIGksIGxlbiwg
Y2hpbGRWaWV3LCBwcmV2aW91cywgYnVmZmVyLCB2aWV3Q29sbGVjdGlvbiA9IG5ldyBWaWV3Q29s
bGVjdGlvbigpOwotCi0gICAgZm9yIChpID0gMCwgbGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7IGkg
PCBsZW47IGkrKykgewotICAgICAgY2hpbGRWaWV3ID0gY2hpbGRWaWV3c1tpXTsKLQotICAgICAg
aWYgKCFidWZmZXIpIHsgYnVmZmVyID0gRW1iZXIuUmVuZGVyQnVmZmVyKCk7IGJ1ZmZlci5faGFz
RWxlbWVudCA9IGZhbHNlOyB9Ci0KLSAgICAgIGlmIChjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXJJ
Zk5lZWRlZChidWZmZXIpKSB7Ci0gICAgICAgIHZpZXdDb2xsZWN0aW9uLnB1c2goY2hpbGRWaWV3
KTsKLSAgICAgIH0gZWxzZSBpZiAodmlld0NvbGxlY3Rpb24ubGVuZ3RoKSB7Ci0gICAgICAgIGlu
c2VydFZpZXdDb2xsZWN0aW9uKHZpZXcsIHZpZXdDb2xsZWN0aW9uLCBwcmV2aW91cywgYnVmZmVy
KTsKLSAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgcHJldmlvdXMgPSBjaGlsZFZpZXc7
Ci0gICAgICAgIHZpZXdDb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAg
ICBwcmV2aW91cyA9IGNoaWxkVmlldzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmlld0Nv
bGxlY3Rpb24ubGVuZ3RoKSB7Ci0gICAgICBpbnNlcnRWaWV3Q29sbGVjdGlvbih2aWV3LCB2aWV3
Q29sbGVjdGlvbiwgcHJldmlvdXMsIGJ1ZmZlcik7Ci0gICAgfQotICB9Ci19KTsKLQotZnVuY3Rp
b24gaW5zZXJ0Vmlld0NvbGxlY3Rpb24odmlldywgdmlld0NvbGxlY3Rpb24sIHByZXZpb3VzLCBi
dWZmZXIpIHsKLSAgdmlld0NvbGxlY3Rpb24udHJpZ2dlclJlY3Vyc2l2ZWx5KCd3aWxsSW5zZXJ0
RWxlbWVudCcpOwotCi0gIGlmIChwcmV2aW91cykgewotICAgIHByZXZpb3VzLmRvbU1hbmFnZXIu
YWZ0ZXIocHJldmlvdXMsIGJ1ZmZlci5zdHJpbmcoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmlldy5k
b21NYW5hZ2VyLnByZXBlbmQodmlldywgYnVmZmVyLnN0cmluZygpKTsKLSAgfQotCi0gIHZpZXdD
b2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24odikgewotICAgIHYudHJhbnNpdGlvblRvKCdpbkRP
TScpOwotICAgIHYucHJvcGVydHlEaWRDaGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICB2LnRyaWdnZXJS
ZWN1cnNpdmVseSgnZGlkSW5zZXJ0RWxlbWVudCcpOwotICB9KTsKLX0KLQotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIGlzIGFuIGBF
bWJlci5WaWV3YCBkZXNjZW5kZW50IHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZwotICBhIGNvbGxl
Y3Rpb24gKGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBieSBtYWludGFpbmluZyBhIGNo
aWxkIHZpZXcgb2JqZWN0Ci0gIGFuZCBhc3NvY2lhdGVkIERPTSByZXByZXNlbnRhdGlvbiBmb3Ig
ZWFjaCBpdGVtIGluIHRoZSBhcnJheSBhbmQgZW5zdXJpbmcKLSAgdGhhdCBjaGlsZCB2aWV3cyBh
bmQgdGhlaXIgYXNzb2NpYXRlZCByZW5kZXJlZCBIVE1MIGFyZSB1cGRhdGVkIHdoZW4gaXRlbXMg
aW4KLSAgdGhlIGFycmF5IGFyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCi0KLSAgIyMg
U2V0dGluZyBjb250ZW50Ci0KLSAgVGhlIG1hbmFnZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGlz
IHJlZmVyZW5jZWQgYXMgdGhlIGBFbWJlci5Db2xsZWN0aW9uVmlld2AKLSAgaW5zdGFuY2UncyBg
Y29udGVudGAgcHJvcGVydHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBzb21lSXRlbXNWaWV3ID0g
RW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsKLSAgICBjb250ZW50OiBbJ0EnLCAnQicsJ0Mn
XQotICB9KQotICBgYGAKLQotICBUaGUgdmlldyBmb3IgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0
aW9uIHdpbGwgaGF2ZSBpdHMgYGNvbnRlbnRgIHByb3BlcnR5IHNldAotICB0byB0aGUgaXRlbS4K
LQotICAjIyBTcGVjaWZ5aW5nIGl0ZW1WaWV3Q2xhc3MKLQotICBCeSBkZWZhdWx0IHRoZSB2aWV3
IGNsYXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG1hbmFnZWQgY29sbGVjdGlvbiB3aWxsIGJlIGFu
Ci0gIGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YC4gWW91IGNhbiBzdXBwbHkgYSBkaWZmZXJlbnQg
Y2xhc3MgYnkgc2V0dGluZyB0aGUKLSAgYENvbGxlY3Rpb25WaWV3YCdzIGBpdGVtVmlld0NsYXNz
YCBwcm9wZXJ0eS4KLQotICBHaXZlbiBhbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2lu
ZyBjb2RlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgc29tZUl0ZW1zVmlldyA9IEVtYmVyLkNvbGxl
Y3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NOYW1lczogWydhLWNvbGxlY3Rpb24nXSwKLSAg
ICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBs
ZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAgIH0pCi0gIH0pOwotCi0gIHNvbWVJdGVtc1Zp
ZXcuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MIHN0cnVjdHVyZQotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmll
dyBhLWNvbGxlY3Rpb24iPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6
IEE8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBCPC9kaXY+
Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQzwvZGl2PgotICA8L2Rp
dj4KLSAgYGBgCi0KLSAgIyMgQXV0b21hdGljIG1hdGNoaW5nIG9mIHBhcmVudC9jaGlsZCB0YWdO
YW1lcwotCi0gIFNldHRpbmcgdGhlIGB0YWdOYW1lYCBwcm9wZXJ0eSBvZiBhIGBDb2xsZWN0aW9u
Vmlld2AgdG8gYW55IG9mCi0gICJ1bCIsICJvbCIsICJ0YWJsZSIsICJ0aGVhZCIsICJ0Ym9keSIs
ICJ0Zm9vdCIsICJ0ciIsIG9yICJzZWxlY3QiIHdpbGwgcmVzdWx0Ci0gIGluIHRoZSBpdGVtIHZp
ZXdzIHJlY2VpdmluZyBhbiBhcHByb3ByaWF0ZWx5IG1hdGNoZWQgYHRhZ05hbWVgIHByb3BlcnR5
LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIGFuZCB0aGUgZm9sbG93aW5nIGNvZGU6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBhblVuZG9yZGVyZWRMaXN0VmlldyA9IEVtYmVyLkNvbGxlY3Rp
b25WaWV3LmNyZWF0ZSh7Ci0gICAgdGFnTmFtZTogJ3VsJywKLSAgICBjb250ZW50OiBbJ0EnLCdC
JywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBsZXR0ZXI6IHt7dmlldy5jb250
ZW50fX0iKQotICAgIH0pCi0gIH0pOwotCi0gIGFuVW5kb3JkZXJlZExpc3RWaWV3LmFwcGVuZFRv
KCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmUKLQotICBgYGBodG1sCi0gIDx1bCBjbGFzcz0iZW1iZXItdmlldyBhLWNvbGxlY3Rp
b24iPgotICAgIDxsaSBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQTwvbGk+Ci0gICAg
PGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBCPC9saT4KLSAgICA8bGkgY2xhc3M9
ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEM8L2xpPgotICA8L3VsPgotICBgYGAKLQotICBBZGRp
dGlvbmFsIGB0YWdOYW1lYCBwYWlycyBjYW4gYmUgcHJvdmlkZWQgYnkgYWRkaW5nIHRvCi0gIGBF
bWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQIGAKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IEVtYmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVBbJ2FydGljbGUnXSA9ICdzZWN0aW9u
JwotICBgYGAKLQotICAjIyBQcm9ncmFtbWF0aWMgY3JlYXRpb24gb2YgY2hpbGQgdmlld3MKLQot
ICBGb3IgY2FzZXMgd2hlcmUgYWRkaXRpb25hbCBjdXN0b21pemF0aW9uIGJleW9uZCB0aGUgdXNl
IG9mIGEgc2luZ2xlCi0gIGBpdGVtVmlld0NsYXNzYCBvciBgdGFnTmFtZWAgbWF0Y2hpbmcgaXMg
cmVxdWlyZWQgQ29sbGVjdGlvblZpZXcncwotICBgY3JlYXRlQ2hpbGRWaWV3YCBtZXRob2QgY2Fu
IGJlIG92ZXJpZGRlbjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEN1c3RvbUNvbGxlY3Rpb25WaWV3
ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHsKLSAgICBjcmVhdGVDaGlsZFZpZXc6IGZ1
bmN0aW9uKHZpZXdDbGFzcywgYXR0cnMpIHsKLSAgICAgIGlmIChhdHRycy5jb250ZW50LmtpbmQg
PT0gJ2FsYnVtJykgewotICAgICAgICB2aWV3Q2xhc3MgPSBBcHAuQWxidW1WaWV3OwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgdmlld0NsYXNzID0gQXBwLlNvbmdWaWV3OwotICAgICAgfQotICAg
ICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZpZXdDbGFzcywgYXR0cnMpOwotICAgIH0KLSAgfSk7Ci0g
IGBgYAotCi0gICMjIEVtcHR5IFZpZXcKLQotICBZb3UgY2FuIHByb3ZpZGUgYW4gYEVtYmVyLlZp
ZXdgIHN1YmNsYXNzIHRvIHRoZSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgCi0gIGluc3RhbmNlIGFz
IGl0cyBgZW1wdHlWaWV3YCBwcm9wZXJ0eS4gSWYgdGhlIGBjb250ZW50YCBwcm9wZXJ0eSBvZiBh
Ci0gIGBDb2xsZWN0aW9uVmlld2AgaXMgc2V0IHRvIGBudWxsYCBvciBhbiBlbXB0eSBhcnJheSwg
YW4gaW5zdGFuY2Ugb2YgdGhpcyB2aWV3Ci0gIHdpbGwgYmUgdGhlIGBDb2xsZWN0aW9uVmlld2Bz
IG9ubHkgY2hpbGQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBhTGlzdFdpdGhOb3RoaW5nID0gRW1i
ZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsKLSAgICBjbGFzc05hbWVzOiBbJ25vdGhpbmcnXQot
ICAgIGNvbnRlbnQ6IG51bGwsCi0gICAgZW1wdHlWaWV3OiBFbWJlci5WaWV3LmV4dGVuZCh7Ci0g
ICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJUaGUgY29sbGVjdGlvbiBp
cyBlbXB0eSIpCi0gICAgfSkKLSAgfSk7Ci0KLSAgYUxpc3RXaXRoTm90aGluZy5hcHBlbmRUbygn
Ym9keScpOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3Ry
dWN0dXJlCi0KLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IG5vdGhpbmciPgot
ICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgICAgVGhlIGNvbGxlY3Rpb24gaXMgZW1w
dHkKLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gICMjIEFkZGluZyBhbmQgUmVtb3Zp
bmcgaXRlbXMKLQotICBUaGUgYGNoaWxkVmlld3NgIHByb3BlcnR5IG9mIGEgYENvbGxlY3Rpb25W
aWV3YCBzaG91bGQgbm90IGJlIGRpcmVjdGx5Ci0gIG1hbmlwdWxhdGVkLiBJbnN0ZWFkLCBhZGQs
IHJlbW92ZSwgcmVwbGFjZSBpdGVtcyBmcm9tIGl0cyBgY29udGVudGAgcHJvcGVydHkuCi0gIFRo
aXMgd2lsbCB0cmlnZ2VyIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gaXRzIHJlbmRlcmVkIEhUTUwu
Ci0KLQotICBAY2xhc3MgQ29sbGVjdGlvblZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5Db250YWluZXJWaWV3Ci0gIEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5D
b2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbnRhaW5lclZpZXcuZXh0ZW5kKHsKLQotICAvKioKLSAg
ICBBIGxpc3Qgb2YgaXRlbXMgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBgRW1iZXIuQ29sbGVjdGlv
blZpZXdgLgotCi0gICAgQHByb3BlcnR5IGNvbnRlbnQKLSAgICBAdHlwZSBFbWJlci5BcnJheQot
ICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioKLSAgICBU
aGlzIHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0IHdoYXQga2luZCBvZiBlbXB0eSB2aWV3IGNsYXNz
IHRoaXMKLSAgICBjb2xsZWN0aW9uIHdvdWxkIGxpa2UgaWYgaXQgaXMgYmVpbmcgaW5zdGFudGlh
dGVkIGZyb20gYW5vdGhlcgotICAgIHN5c3RlbSAobGlrZSBIYW5kbGViYXJzKQotCi0gICAgQHBy
aXZhdGUKLSAgICBAcHJvcGVydHkgZW1wdHlWaWV3Q2xhc3MKLSAgKi8KLSAgZW1wdHlWaWV3Q2xh
c3M6IEVtYmVyLlZpZXcsCi0KLSAgLyoqCi0gICAgQW4gb3B0aW9uYWwgdmlldyB0byBkaXNwbGF5
IGlmIGNvbnRlbnQgaXMgc2V0IHRvIGFuIGVtcHR5IGFycmF5LgotCi0gICAgQHByb3BlcnR5IGVt
cHR5VmlldwotICAgIEB0eXBlIEVtYmVyLlZpZXcKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0g
IGVtcHR5VmlldzogbnVsbCwKLQotICAvKioKLSAgICBAcHJvcGVydHkgaXRlbVZpZXdDbGFzcwot
ICAgIEB0eXBlIEVtYmVyLlZpZXcKLSAgICBAZGVmYXVsdCBFbWJlci5WaWV3Ci0gICovCi0gIGl0
ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCi0KLSAgLyoqCi0gICAgU2V0dXAgYSBDb2xsZWN0aW9u
VmlldwotCi0gICAgQG1ldGhvZCBpbml0Ci0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAg
IHZhciByZXQgPSB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMuX2NvbnRlbnREaWRDaGFuZ2UoKTsK
LSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIC8qKgotICAgIEludm9rZWQgd2hlbiB0aGUgY29u
dGVudCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UuIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0
IHRoZQotICAgIGVudGlyZSBhcnJheSBjb250ZW50IHdpbGwgY2hhbmdlLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIF9jb250ZW50V2lsbENoYW5nZQotICAqLwotICBfY29udGVudFdpbGxD
aGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIGNvbnRlbnQgPSB0aGlzLmdldCgnY29udGVudCcpOwotCi0gICAgaWYgKGNvbnRlbnQpIHsg
Y29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMpOyB9Ci0gICAgdmFyIGxlbiA9IGNvbnRl
bnQgPyBnZXQoY29udGVudCwgJ2xlbmd0aCcpIDogMDsKLSAgICB0aGlzLmFycmF5V2lsbENoYW5n
ZShjb250ZW50LCAwLCBsZW4pOwotICB9KSwKLQotICAvKioKLSAgICBDaGVjayB0byBtYWtlIHN1
cmUgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdlZCwgYW5kIGlmIHNvLAotICAgIHVwZGF0ZSB0
aGUgY2hpbGRyZW4gZGlyZWN0bHkuIFRoaXMgaXMgYWx3YXlzIHNjaGVkdWxlZAotICAgIGFzeW5j
aHJvbm91c2x5LCB0byBhbGxvdyB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkIGJlZm9yZQotICAg
IGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkIGFuZCB2aWNlIHZlcnNhLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIF9jb250ZW50RGlkQ2hhbmdlCi0gICovCi0gIF9jb250ZW50RGlkQ2hh
bmdlOiBFbWJlci5vYnNlcnZlcignY29udGVudCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250
ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAoY29udGVudCkgewotICAgICAg
dGhpcy5fYXNzZXJ0QXJyYXlMaWtlKGNvbnRlbnQpOwotICAgICAgY29udGVudC5hZGRBcnJheU9i
c2VydmVyKHRoaXMpOwotICAgIH0KLQotICAgIHZhciBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRl
bnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJheURpZENoYW5nZShjb250ZW50LCAwLCBu
dWxsLCBsZW4pOwotICB9KSwKLQotICAvKioKLSAgICBFbnN1cmUgdGhhdCB0aGUgY29udGVudCBp
bXBsZW1lbnRzIEVtYmVyLkFycmF5Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2Fzc2Vy
dEFycmF5TGlrZQotICAqLwotICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5jdGlvbihjb250ZW50KSB7
Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiYW4gRW1iZXIuQ29sbGVjdGlvblZpZXcncyBjb250ZW50
IG11c3QgaW1wbGVtZW50IEVtYmVyLkFycmF5LiBZb3UgcGFzc2VkICVAIiwgW2NvbnRlbnRdKSwg
RW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVz
IHRoZSBjb250ZW50IGFuZCBjb250ZW50IG9ic2VydmVycy4KLQotICAgIEBtZXRob2QgZGVzdHJv
eQotICAqLwotICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuX3N1cGVyKCkp
IHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpOwot
ICAgIGlmIChjb250ZW50KSB7IGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzKTsgfQot
Ci0gICAgaWYgKHRoaXMuX2NyZWF0ZWRFbXB0eVZpZXcpIHsKLSAgICAgIHRoaXMuX2NyZWF0ZWRF
bXB0eVZpZXcuZGVzdHJveSgpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0g
IC8qKgotICAgIENhbGxlZCB3aGVuIGEgbXV0YXRpb24gdG8gdGhlIHVuZGVybHlpbmcgY29udGVu
dCBhcnJheSB3aWxsIG9jY3VyLgotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgYW55IHZp
ZXdzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgdW5kZXJseWluZwotICAgIGNvbnRlbnQgYXJy
YXkuCi0KLSAgICBJbnZva2VzIHdoZW5ldmVyIHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiB3aWxs
IGNoYW5nZS4KLQotICAgIEBtZXRob2QgYXJyYXlXaWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtBcnJh
eX0gY29udGVudCB0aGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICBAcGFyYW0g
e051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjaGFuZ2VzIHdpbGwgb2NjdXJy
Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgbnVtYmVyIG9mIG9iamVjdCB0byBiZSByZW1v
dmVkIGZyb20gY29udGVudAotICAqLwotICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRl
bnQsIHN0YXJ0LCByZW1vdmVkQ291bnQpIHsKLSAgICAvLyBJZiB0aGUgY29udGVudHMgd2VyZSBl
bXB0eSBiZWZvcmUgYW5kIHRoaXMgdGVtcGxhdGUgY29sbGVjdGlvbiBoYXMgYW4KLSAgICAvLyBl
bXB0eSB2aWV3IHJlbW92ZSBpdCBub3cuCi0gICAgdmFyIGVtcHR5VmlldyA9IGdldCh0aGlzLCAn
ZW1wdHlWaWV3Jyk7Ci0gICAgaWYgKGVtcHR5VmlldyAmJiBlbXB0eVZpZXcgaW5zdGFuY2VvZiBF
bWJlci5WaWV3KSB7Ci0gICAgICBlbXB0eVZpZXcucmVtb3ZlRnJvbVBhcmVudCgpOwotICAgIH0K
LQotICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZCB2aWV3cyB0aGF0IGNvcnJlc3BvbmQgd2l0aCB0
aGUgcmVtb3ZlZCBpdGVtcy4KLSAgICAvLyBOb3RlIHRoYXQgd2UgbG9vcCBmcm9tIHRoZSBlbmQg
b2YgdGhlIGFycmF5IHRvIHRoZSBiZWdpbm5pbmcgYmVjYXVzZQotICAgIC8vIHdlIGFyZSBtdXRh
dGluZyBpdCBhcyB3ZSBnby4KLSAgICB2YXIgY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3Ms
IGNoaWxkVmlldywgaWR4LCBsZW47Ci0KLSAgICBsZW4gPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0
aDsKLQotICAgIHZhciByZW1vdmluZ0FsbCA9IHJlbW92ZWRDb3VudCA9PT0gbGVuOwotCi0gICAg
aWYgKHJlbW92aW5nQWxsKSB7Ci0gICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbXB0eSh0aGlzKTsK
LSAgICAgIHRoaXMuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgICB2
aWV3LnJlbW92ZWRGcm9tRE9NID0gdHJ1ZTsKLSAgICAgIH0sIGZhbHNlKTsKLSAgICB9Ci0KLSAg
ICBmb3IgKGlkeCA9IHN0YXJ0ICsgcmVtb3ZlZENvdW50IC0gMTsgaWR4ID49IHN0YXJ0OyBpZHgt
LSkgewotICAgICAgY2hpbGRWaWV3ID0gY2hpbGRWaWV3c1tpZHhdOwotICAgICAgY2hpbGRWaWV3
LmRlc3Ryb3koKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4gYSBtdXRh
dGlvbiB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IGFycmF5IG9jY3Vycy4KLQotICAgIFRoaXMg
bWV0aG9kIHdpbGwgcmVwbGF5IHRoYXQgbXV0YXRpb24gYWdhaW5zdCB0aGUgdmlld3MgdGhhdCBj
b21wb3NlIHRoZQotICAgIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIGVuc3VyaW5nIHRoYXQgdGhl
IHZpZXcgcmVmbGVjdHMgdGhlIG1vZGVsLgotCi0gICAgVGhpcyBhcnJheSBvYnNlcnZlciBpcyBh
ZGRlZCBpbiBgY29udGVudERpZENoYW5nZWAuCi0KLSAgICBAbWV0aG9kIGFycmF5RGlkQ2hhbmdl
Ci0gICAgQHBhcmFtIHtBcnJheX0gY29udGVudCB0aGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9i
amVjdHMKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBj
aGFuZ2VzIG9jY3VycmVkCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgbnVtYmVyIG9mIG9i
amVjdCByZW1vdmVkIGZyb20gY29udGVudAotICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRlZCBudW1i
ZXIgb2Ygb2JqZWN0IGFkZGVkIHRvIGNvbnRlbnQKLSAgKi8KLSAgYXJyYXlEaWRDaGFuZ2U6IGZ1
bmN0aW9uKGNvbnRlbnQsIHN0YXJ0LCByZW1vdmVkLCBhZGRlZCkgewotICAgIHZhciBhZGRlZFZp
ZXdzID0gW10sIHZpZXcsIGl0ZW0sIGlkeCwgbGVuLCBpdGVtVmlld0NsYXNzLAotICAgICAgZW1w
dHlWaWV3OwotCi0gICAgbGVuID0gY29udGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAw
OwotCi0gICAgaWYgKGxlbikgewotICAgICAgaXRlbVZpZXdDbGFzcyA9IGdldCh0aGlzLCAnaXRl
bVZpZXdDbGFzcycpOwotCi0gICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0Ns
YXNzKSB7Ci0gICAgICAgIGl0ZW1WaWV3Q2xhc3MgPSBnZXQoaXRlbVZpZXdDbGFzcykgfHwgaXRl
bVZpZXdDbGFzczsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiaXRlbVZpZXdD
bGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRW1iZXIuVmlldywgbm90ICVAIiwgW2l0ZW1WaWV3
Q2xhc3NdKSwgJ3N0cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0NsYXNzIHx8IEVtYmVyLlZpZXcu
ZGV0ZWN0KGl0ZW1WaWV3Q2xhc3MpKTsKLQotICAgICAgZm9yIChpZHggPSBzdGFydDsgaWR4IDwg
c3RhcnQrYWRkZWQ7IGlkeCsrKSB7Ci0gICAgICAgIGl0ZW0gPSBjb250ZW50Lm9iamVjdEF0KGlk
eCk7Ci0KLSAgICAgICAgdmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGl0ZW1WaWV3Q2xhc3Ms
IHsKLSAgICAgICAgICBjb250ZW50OiBpdGVtLAotICAgICAgICAgIGNvbnRlbnRJbmRleDogaWR4
Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZGVkVmlld3MucHVzaCh2aWV3KTsKLSAgICAgIH0K
LSAgICB9IGVsc2UgewotICAgICAgZW1wdHlWaWV3ID0gZ2V0KHRoaXMsICdlbXB0eVZpZXcnKTsK
LQotICAgICAgaWYgKCFlbXB0eVZpZXcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIGlmICgnc3RyaW5n
JyA9PT0gdHlwZW9mIGVtcHR5VmlldykgewotICAgICAgICBlbXB0eVZpZXcgPSBnZXQoZW1wdHlW
aWV3KSB8fCBlbXB0eVZpZXc7Ci0gICAgICB9Ci0KLSAgICAgIGVtcHR5VmlldyA9IHRoaXMuY3Jl
YXRlQ2hpbGRWaWV3KGVtcHR5Vmlldyk7Ci0gICAgICBhZGRlZFZpZXdzLnB1c2goZW1wdHlWaWV3
KTsKLSAgICAgIHNldCh0aGlzLCAnZW1wdHlWaWV3JywgZW1wdHlWaWV3KTsKLQotICAgICAgaWYg
KEVtYmVyLkNvcmVWaWV3LmRldGVjdChlbXB0eVZpZXcpKSB7Ci0gICAgICAgIHRoaXMuX2NyZWF0
ZWRFbXB0eVZpZXcgPSBlbXB0eVZpZXc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGhpcy5yZXBs
YWNlKHN0YXJ0LCAwLCBhZGRlZFZpZXdzKTsKLSAgfSwKLQotICAvKioKLSAgICBJbnN0YW50aWF0
ZXMgYSB2aWV3IHRvIGJlIGFkZGVkIHRvIHRoZSBjaGlsZFZpZXdzIGFycmF5IGR1cmluZyB2aWV3
Ci0gICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbCBub3QgY2FsbCB0aGlzIG1l
dGhvZCBkaXJlY3RseSB1bmxlc3MKLSAgICB5b3UgYXJlIG92ZXJyaWRpbmcgYGNyZWF0ZUNoaWxk
Vmlld3MoKWAuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsCi0gICAgYXV0b21hdGljYWxseSBj
b25maWd1cmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3Mgb24gdGhlIG5ldyB2aWV3IGluc3RhbmNlIHRv
Ci0gICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC4KLQotICAgIFRoZSB0YWcgbmFtZSBm
b3IgdGhlIHZpZXcgd2lsbCBiZSBzZXQgdG8gdGhlIHRhZ05hbWUgb2YgdGhlIHZpZXdDbGFzcwot
ICAgIHBhc3NlZCBpbi4KLQotICAgIEBtZXRob2QgY3JlYXRlQ2hpbGRWaWV3Ci0gICAgQHBhcmFt
IHtDbGFzc30gdmlld0NsYXNzCi0gICAgQHBhcmFtIHtIYXNofSBbYXR0cnNdIEF0dHJpYnV0ZXMg
dG8gYWRkCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gbmV3IGluc3RhbmNlCi0gICovCi0gIGNy
ZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24odmlldywgYXR0cnMpIHsKLSAgICB2aWV3ID0gdGhpcy5f
c3VwZXIodmlldywgYXR0cnMpOwotCi0gICAgdmFyIGl0ZW1UYWdOYW1lID0gZ2V0KHZpZXcsICd0
YWdOYW1lJyk7Ci0KLSAgICBpZiAoaXRlbVRhZ05hbWUgPT09IG51bGwgfHwgaXRlbVRhZ05hbWUg
PT09IHVuZGVmaW5lZCkgewotICAgICAgaXRlbVRhZ05hbWUgPSBFbWJlci5Db2xsZWN0aW9uVmll
dy5DT05UQUlORVJfTUFQW2dldCh0aGlzLCAndGFnTmFtZScpXTsKLSAgICAgIHNldCh2aWV3LCAn
dGFnTmFtZScsIGl0ZW1UYWdOYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfQot
fSk7Ci0KLS8qKgotICBBIG1hcCBvZiBwYXJlbnQgdGFncyB0byB0aGVpciBkZWZhdWx0IGNoaWxk
IHRhZ3MuIFlvdSBjYW4gYWRkCi0gIGFkZGl0aW9uYWwgcGFyZW50IHRhZ3MgaWYgeW91IHdhbnQg
Y29sbGVjdGlvbiB2aWV3cyB0aGF0IHVzZQotICBhIHBhcnRpY3VsYXIgcGFyZW50IHRhZyB0byBk
ZWZhdWx0IHRvIGEgY2hpbGQgdGFnLgotCi0gIEBwcm9wZXJ0eSBDT05UQUlORVJfTUFQCi0gIEB0
eXBlIEhhc2gKLSAgQHN0YXRpYwotICBAZmluYWwKLSovCi1FbWJlci5Db2xsZWN0aW9uVmlldy5D
T05UQUlORVJfTUFQID0gewotICB1bDogJ2xpJywKLSAgb2w6ICdsaScsCi0gIHRhYmxlOiAndHIn
LAotICB0aGVhZDogJ3RyJywKLSAgdGJvZHk6ICd0cicsCi0gIHRmb290OiAndHInLAotICB0cjog
J3RkJywKLSAgc2VsZWN0OiAnb3B0aW9uJwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIu
aXNOb25lLAotICAgIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Ci0KLQotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi0vKioKLSAgQW4gYEVt
YmVyLkNvbXBvbmVudGAgaXMgYSB2aWV3IHRoYXQgaXMgY29tcGxldGVseQotICBpc29sYXRlZC4g
UHJvcGVydHkgYWNjZXNzIGluIGl0cyB0ZW1wbGF0ZXMgZ28KLSAgdG8gdGhlIHZpZXcgb2JqZWN0
IGFuZCBhY3Rpb25zIGFyZSB0YXJnZXRlZCBhdAotICB0aGUgdmlldyBvYmplY3QuIFRoZXJlIGlz
IG5vIGFjY2VzcyB0byB0aGUKLSAgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250cm9s
bGVyOyBhbGwKLSAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBtdXN0IGJlIHBhc3NlZCBpbi4KLQot
ICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFuIGBFbWJlci5Db21wb25lbnRgIGlzIHZpYQot
ICBhIHRlbXBsYXRlLiBJZiB5b3UgbmFtZSBhIHRlbXBsYXRlCi0gIGBjb21wb25lbnRzL215LWZv
b2AsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlCi0gIGB7e215LWZvb319YCBpbiBvdGhlciB0ZW1w
bGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQotICBhbiBpbnN0YW5jZSBvZiB0aGUgaXNvbGF0ZWQgY29t
cG9uZW50LgotCi0gIGBgYGh0bWwKLSAge3thcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9
fQotICBgYGAKLQotICBgYGBodG1sCi0gIDwhLS0gYXBwLXByb2ZpbGUgdGVtcGxhdGUgLS0+Ci0g
IDxoMT57e3BlcnNvbi50aXRsZX19PC9oMT4KLSAgPGltZyB7e2JpbmQtYXR0ciBzcmM9cGVyc29u
LmF2YXRhcn19PgotICA8cCBjbGFzcz0nc2lnbmF0dXJlJz57e3BlcnNvbi5zaWduYXR1cmV9fTwv
cD4KLSAgYGBgCi0KLSAgWW91IGNhbiB1c2UgYHlpZWxkYCBpbnNpZGUgYSB0ZW1wbGF0ZSB0bwot
ICBpbmNsdWRlIHRoZSAqKmNvbnRlbnRzKiogb2YgYW55IGJsb2NrIGF0dGFjaGVkIHRvCi0gIHRo
ZSBjb21wb25lbnQuIFRoZSBibG9jayB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZQotICBjb250ZXh0
IG9mIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IG9yIG91dGVyIGNvbnRyb2xsZXI6Ci0KLSAgYGBg
aGFuZGxlYmFycwotICB7eyNhcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9fQotICAgIDxw
PkFkbWluIG1vZGU8L3A+Ci0gICAge3shIEV4ZWN1dGVkIGluIHRoZSBjb250cm9sbGVycyBjb250
ZXh0LiB9fQotICB7ey9hcHAtcHJvZmlsZX19Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
PCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4KLSAgPGgxPnt7cGVyc29uLnRpdGxlfX08L2gx
PgotICB7eyEgRXhlY3V0ZWQgaW4gdGhlIGNvbXBvbmVudHMgY29udGV4dC4gfX0KLSAge3t5aWVs
ZH19IHt7ISBibG9jayBjb250ZW50cyB9fQotICBgYGAKLQotICBJZiB5b3Ugd2FudCB0byBjdXN0
b21pemUgdGhlIGNvbXBvbmVudCwgaW4gb3JkZXIgdG8KLSAgaGFuZGxlIGV2ZW50cyBvciBhY3Rp
b25zLCB5b3UgaW1wbGVtZW50IGEgc3ViY2xhc3MKLSAgb2YgYEVtYmVyLkNvbXBvbmVudGAgbmFt
ZWQgYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlCi0gIGNvbXBvbmVudC4gTm90ZSB0aGF0IGBDb21wb25l
bnRgIG5lZWRzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBuYW1lIG9mCi0gIHlvdXIgc3ViY2xhc3Mg
bGlrZSBgQXBwUHJvZmlsZUNvbXBvbmVudGAuCi0KLSAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBp
bXBsZW1lbnQgdGhlIGFjdGlvbgotICBgaGVsbG9gIGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21w
b25lbnQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwUHJvZmlsZUNvbXBvbmVudCA9IEVt
YmVyLkNvbXBvbmVudC5leHRlbmQoewotICAgIGFjdGlvbnM6IHsKLSAgICAgIGhlbGxvOiBmdW5j
dGlvbihuYW1lKSB7Ci0gICAgICAgIGNvbnNvbGUubG9nKCJIZWxsbyIsIG5hbWUpOwotICAgICAg
fQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIEFuZCB0aGVuIHVzZSBpdCBpbiB0aGUgY29tcG9u
ZW50J3MgdGVtcGxhdGU6Ci0KLSAgYGBgaHRtbAotICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRl
IC0tPgotCi0gIDxoMT57e3BlcnNvbi50aXRsZX19PC9oMT4KLSAge3t5aWVsZH19IDwhLS0gYmxv
Y2sgY29udGVudHMgLS0+Ci0KLSAgPGJ1dHRvbiB7e2FjdGlvbiAnaGVsbG8nIHBlcnNvbi5uYW1l
fX0+Ci0gICAgU2F5IEhlbGxvIHRvIHt7cGVyc29uLm5hbWV9fQotICA8L2J1dHRvbj4KLSAgYGBg
Ci0KLSAgQ29tcG9uZW50cyBtdXN0IGhhdmUgYSBgLWAgaW4gdGhlaXIgbmFtZSB0byBhdm9pZAot
ICBjb25mbGljdHMgd2l0aCBidWlsdC1pbiBjb250cm9scyB0aGF0IHdyYXAgSFRNTAotICBlbGVt
ZW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHNhbWUKLSAgcmVxdWlyZW1lbnQgaW4g
d2ViIGNvbXBvbmVudHMuCi0KLSAgQGNsYXNzIENvbXBvbmVudAotICBAbmFtZXNwYWNlIEVtYmVy
Ci0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSovCi1FbWJlci5Db21wb25lbnQgPSBFbWJlci5WaWV3
LmV4dGVuZChFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7Ci0gIGluaXQ6IGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0KHRoaXMsICdjb250ZXh0JywgdGhpcyk7Ci0g
ICAgc2V0KHRoaXMsICdjb250cm9sbGVyJywgdGhpcyk7Ci0gIH0sCi0KLSAgZGVmYXVsdExheW91
dDogZnVuY3Rpb24ob3B0aW9ucyl7Ci0gICAgb3B0aW9ucy5kYXRhID0ge3ZpZXc6IG9wdGlvbnMu
X2NvbnRleHR9OwotICAgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyc1sneWllbGQnXS5hcHBseSh0
aGlzLCBbb3B0aW9uc10pOwotICB9LAotCi0gIC8vIGR1cmluZyByZW5kZXIsIGlzb2xhdGUga2V5
d29yZHMKLSAgY2xvbmVLZXl3b3JkczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHsKLSAgICAg
IHZpZXc6IHRoaXMsCi0gICAgICBjb250cm9sbGVyOiB0aGlzCi0gICAgfTsKLSAgfSwKLQotICBf
eWllbGQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICB2YXIgdmlldyA9IG9wdGlv
bnMuZGF0YS52aWV3LAotICAgICAgICBwYXJlbnRWaWV3ID0gdGhpcy5fcGFyZW50VmlldywKLSAg
ICAgICAgdGVtcGxhdGUgPSBnZXQodGhpcywgJ3RlbXBsYXRlJyk7Ci0KLSAgICBpZiAodGVtcGxh
dGUpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiQSBDb21wb25lbnQgbXVzdCBoYXZlIGEgcGFyZW50
IHZpZXcgaW4gb3JkZXIgdG8geWllbGQuIiwgcGFyZW50Vmlldyk7Ci0KLSAgICAgIHZpZXcuYXBw
ZW5kQ2hpbGQoRW1iZXIuVmlldywgewotICAgICAgICBpc1ZpcnR1YWw6IHRydWUsCi0gICAgICAg
IHRhZ05hbWU6ICcnLAotICAgICAgICBfY29udGV4dFZpZXc6IHBhcmVudFZpZXcsCi0gICAgICAg
IHRlbXBsYXRlOiB0ZW1wbGF0ZSwKLSAgICAgICAgY29udGV4dDogZ2V0KHBhcmVudFZpZXcsICdj
b250ZXh0JyksCi0gICAgICAgIGNvbnRyb2xsZXI6IGdldChwYXJlbnRWaWV3LCAnY29udHJvbGxl
cicpLAotICAgICAgICB0ZW1wbGF0ZURhdGE6IHsga2V5d29yZHM6IHBhcmVudFZpZXcuY2xvbmVL
ZXl3b3JkcygpIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGUg
Y29tcG9uZW50IGlzIGN1cnJlbnRseSBpbnNlcnRlZCBpbnRvIHRoZSBET00gb2YgYSBwYXJlbnQg
dmlldywgdGhpcwotICAgIHByb3BlcnR5IHdpbGwgcG9pbnQgdG8gdGhlIGNvbnRyb2xsZXIgb2Yg
dGhlIHBhcmVudCB2aWV3LgotCi0gICAgQHByb3BlcnR5IHRhcmdldE9iamVjdAotICAgIEB0eXBl
IEVtYmVyLkNvbnRyb2xsZXIKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHRhcmdldE9iamVj
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHBhcmVudFZpZXcgPSBn
ZXQodGhpcywgJ19wYXJlbnRWaWV3Jyk7Ci0gICAgcmV0dXJuIHBhcmVudFZpZXcgPyBnZXQocGFy
ZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7Ci0gIH0pLnByb3BlcnR5KCdfcGFyZW50Vmll
dycpLAotCi0gIC8qKgotICAgIFRyaWdnZXJzIGEgbmFtZWQgYWN0aW9uIG9uIHRoZSBjb250cm9s
bGVyIGNvbnRleHQgd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1c2VkIGlmCi0gICAgdGhpcyBjb250
cm9sbGVyIGhhcyByZWdpc3RlcmVkIGZvciBub3RpZmljYXRpb25zIG9mIHRoZSBhY3Rpb24uCi0K
LSAgICBGb3IgZXhhbXBsZSBhIGNvbXBvbmVudCBmb3IgcGxheWluZyBvciBwYXVzaW5nIG11c2lj
IG1heSB0cmFuc2xhdGUgY2xpY2sgZXZlbnRzCi0gICAgaW50byBhY3Rpb24gbm90aWZpY2F0aW9u
cyBvZiAicGxheSIgb3IgInN0b3AiIGRlcGVuZGluZyBvbiBzb21lIGludGVybmFsIHN0YXRlCi0g
ICAgb2YgdGhlIGNvbXBvbmVudDoKLQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5QbGF5
QnV0dG9uQ29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7Ci0gICAgICBjbGljazog
ZnVuY3Rpb24oKXsKLSAgICAgICAgaWYgKHRoaXMuZ2V0KCdpc1BsYXlpbmcnKSkgewotICAgICAg
ICAgIHRoaXMudHJpZ2dlckFjdGlvbigncGxheScpOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgIHRoaXMudHJpZ2dlckFjdGlvbignc3RvcCcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBXaGVuIHVzZWQgaW5zaWRlIGEgdGVtcGxhdGUgdGhlc2UgY29t
cG9uZW50IGFjdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8KLSAgICB0cmlnZ2VyIGFjdGlvbnMgaW4g
dGhlIG91dGVyIGFwcGxpY2F0aW9uIGNvbnRleHQ6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAg
e3shIGFwcGxpY2F0aW9uLmhicyB9fQotICAgIHt7cGxheS1idXR0b24gcGxheT0ibXVzaWNTdGFy
dGVkIiBzdG9wPSJtdXNpY1N0b3BwZWQifX0KLSAgICBgYGAKLQotICAgIFdoZW4gdGhlIGNvbXBv
bmVudCByZWNlaXZlcyBhIGJyb3dzZXIgYGNsaWNrYCBldmVudCBpdCB0cmFuc2xhdGUgdGhpcwot
ICAgIGludGVyYWN0aW9uIGludG8gYXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICgicGxh
eSIgb3IgInN0b3AiKSBhbmQKLSAgICB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBuYW1l
IG9uIHRoZSBjb250cm9sbGVyIGZvciB0aGUgdGVtcGxhdGUKLSAgICB3aGVyZSB0aGUgY29tcG9u
ZW50IGlzIHVzZWQ6IAotCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9u
Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsK
LSAgICAgICAgbXVzaWNTdGFydGVkOiBmdW5jdGlvbigpewotICAgICAgICAgIC8vIGNhbGxlZCB3
aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlja2VkCi0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNp
YyBzdGFydGVkIHBsYXlpbmcKLSAgICAgICAgfSwKLSAgICAgICAgbXVzaWNTdG9wcGVkOiBmdW5j
dGlvbigpewotICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlj
a2VkCi0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNpYyBzdG9wcGVkIHBsYXlpbmcKLSAgICAgICAg
fQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgSWYgbm8gYWN0aW9uIG5hbWUgaXMg
cGFzc2VkIHRvIGBzZW5kQWN0aW9uYCBhIGRlZmF1bHQgbmFtZSBvZiAiYWN0aW9uIgotICAgIGlz
IGFzc3VtZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLk5leHRCdXR0b25Db21wb25l
bnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKLSAgICAgIGNsaWNrOiBmdW5jdGlvbigpewot
ICAgICAgICB0aGlzLnNlbmRBY3Rpb24oKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIGBgYGhhbmRsZWJhcnMKLSAgICB7eyEgYXBwbGljYXRpb24uaGJzIH19Ci0gICAge3tuZXh0
LWJ1dHRvbiBhY3Rpb249InBsYXlOZXh0U29uZ0luQWxidW0ifX0KLSAgICBgYGAKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBwbGF5TmV4dFNvbmdJbkFs
YnVtOiBmdW5jdGlvbigpewotICAgICAgICAgIC4uLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNlbmRBY3Rpb24KLSAgICBAcGFyYW0gW2FjdGlv
bl0ge1N0cmluZ30gdGhlIGFjdGlvbiB0byB0cmlnZ2VyCi0gICAgQHBhcmFtIFtjb250ZXh0XSB7
Kn0gYSBjb250ZXh0IHRvIHNlbmQgd2l0aCB0aGUgYWN0aW9uCi0gICovCi0gIHNlbmRBY3Rpb246
IGZ1bmN0aW9uKGFjdGlvbikgewotICAgIHZhciBhY3Rpb25OYW1lLAotICAgICAgICBjb250ZXh0
cyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0gICAgLy8gU2VuZCB0aGUgZGVmYXVs
dCBhY3Rpb24KLSAgICBpZiAoYWN0aW9uID09PSB1bmRlZmluZWQpIHsKLSAgICAgIGFjdGlvbk5h
bWUgPSBnZXQodGhpcywgJ2FjdGlvbicpOwotICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgZGVmYXVs
dCBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUgY29tcG9uZW50ICIgKyB0aGlzLnRvU3RyaW5n
KCkgKwotICAgICAgICAgICAgICAgICAgICIsIGJ1dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rp
b25OYW1lICsgIikgd2FzIG5vdCBhIHN0cmluZy4iLAotICAgICAgICAgICAgICAgICAgIGlzTm9u
ZShhY3Rpb25OYW1lKSB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ3N0cmluZycpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICBhY3Rpb25OYW1lID0gZ2V0KHRoaXMsIGFjdGlvbik7Ci0gICAgICBFbWJl
ci5hc3NlcnQoIlRoZSAiICsgYWN0aW9uICsgIiBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUg
Y29tcG9uZW50ICIgKwotICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSArICIsIGJ1
dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rpb25OYW1lICsKLSAgICAgICAgICAgICAgICAgICAi
KSB3YXMgbm90IGEgc3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgaXNOb25lKGFjdGlvbk5h
bWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAnc3RyaW5nJyk7Ci0gICAgfQotCi0gICAgLy8g
SWYgbm8gYWN0aW9uIG5hbWUgZm9yIHRoYXQgYWN0aW9uIGNvdWxkIGJlIGZvdW5kLCBqdXN0IGFi
b3J0LgotICAgIGlmIChhY3Rpb25OYW1lID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAotICAgICAg
YWN0aW9uQ29udGV4dDogY29udGV4dHMKLSAgICB9KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLWBFbWJl
ci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydGAgaXMgYSBtaXhpbiB0aGF0IGNhbiBiZSBpbmNsdWRl
ZCBpbiBhCi12aWV3IGNsYXNzIHRvIGFkZCBhIGB0cmlnZ2VyQWN0aW9uYCBtZXRob2Qgd2l0aCBz
ZW1hbnRpY3Mgc2ltaWxhciB0bwotdGhlIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1gIGhlbHBlci4g
SXQgcHJvdmlkZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMKLWZvciB0aGUgYWN0aW9uJ3MgdGFyZ2V0
OiB0aGUgdmlldydzIGNvbnRyb2xsZXI7IGFuZCB0aGUgY29udGV4dCB0aGF0IGlzCi1zZW50IHdp
dGggdGhlIGFjdGlvbjogdGhlIHZpZXcncyBjb250ZXh0LgotCi1Ob3RlOiBJbiBub3JtYWwgRW1i
ZXIgdXNhZ2UsIHRoZSBge3thY3Rpb259fWAgaGVscGVyIGlzIHVzdWFsbHkgdGhlIGJlc3QKLWNo
b2ljZS4gVGhpcyBtaXhpbiBpcyBtb3N0IG9mdGVuIHVzZWZ1bCB3aGVuIHlvdSBhcmUgZG9pbmcg
bW9yZSBjb21wbGV4Ci1ldmVudCBoYW5kbGluZyBpbiBjdXN0b20gVmlldyBzdWJjbGFzc2VzLgot
Ci1Gb3IgZXhhbXBsZToKLQotYGBgamF2YXNjcmlwdAotQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1i
ZXIuVmlldy5leHRlbmQoRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgYWN0aW9u
OiAnc2F2ZScsCi0gIGNsaWNrOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnRyaWdnZXJBY3Rpb24o
KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29u
dGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9s
bGVyCi0gIH0KLX0pOwotYGBgCi0KLVRoZSBgYWN0aW9uYCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJv
cGVydGllcyBvZiBhbiBvcHRpb25hbCBvYmplY3QgYXJndW1lbnQKLXRvIGB0cmlnZ2VyQWN0aW9u
YCBhcyB3ZWxsLgotCi1gYGBqYXZhc2NyaXB0Ci1BcHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgewotICBjbGljazogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKLSAgICAgIGFjdGlvbjogJ3NhdmUn
Ci0gICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJy
ZW50IGNvbnRleHQKLSAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgotICB9Ci19
KTsKLWBgYAotCi1AY2xhc3MgVmlld1RhcmdldEFjdGlvblN1cHBvcnQKLUBuYW1lc3BhY2UgRW1i
ZXIKLUBleHRlbmRzIEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQKLSovCi1FbWJlci5WaWV3VGFy
Z2V0QWN0aW9uU3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5UYXJnZXRBY3Rpb25T
dXBwb3J0LCB7Ci0gIC8qKgotICBAcHJvcGVydHkgdGFyZ2V0Ci0gICovCi0gIHRhcmdldDogRW1i
ZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKLSAgLyoqCi0gIEBwcm9wZXJ0eSBhY3Rp
b25Db250ZXh0Ci0gICovCi0gIGFjdGlvbkNvbnRleHQ6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdj
b250ZXh0JykKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBWaWV3cwotCi1AbW9kdWxlIGVtYmVyCi1Ac3Vi
bW9kdWxlIGVtYmVyLXZpZXdzCi1AcmVxdWlyZXMgZW1iZXItcnVudGltZQotQG1haW4gZW1iZXIt
dmlld3MKLSovCi0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLWRlZmluZSgibWV0YW1vcnBoIiwK
LSAgW10sCi0gIGZ1bmN0aW9uKCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvLyA9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotICAgIC8vIFByb2plY3Q6ICAgbWV0YW1vcnBoCi0gICAgLy8gQ29weXJpZ2h0
OiDCqTIwMTQgVGlsZGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAvLyA9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotCi0gICAgdmFyIEsgPSBmdW5jdGlvbigpIHt9LAotICAgICAgICBndWlkID0g
MCwKLSAgICAgICAgZGlzYWJsZVJhbmdlID0gKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgaWYgKCd1
bmRlZmluZWQnICE9PSB0eXBlb2YgTWV0YW1vcnBoRU5WKSB7Ci0gICAgICAgICAgICByZXR1cm4g
TWV0YW1vcnBoRU5WLkRJU0FCTEVfUkFOR0VfQVBJOwotICAgICAgICAgIH0gZWxzZSBpZiAoJ3Vu
ZGVmaW5lZCcgIT09IEVOVikgewotICAgICAgICAgICAgcmV0dXJuIEVOVi5ESVNBQkxFX1JBTkdF
X0FQSTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgIH0KLSAgICAgICAgfSkoKSwKLQotICAgICAgICAvLyBGZWF0dXJlLWRldGVjdCB0aGUg
VzNDIHJhbmdlIEFQSSwgdGhlIGV4dGVuZGVkIGNoZWNrIGlzIGZvciBJRTkgd2hpY2ggb25seSBw
YXJ0aWFsbHkgc3VwcG9ydHMgcmFuZ2VzCi0gICAgICAgIHN1cHBvcnRzUmFuZ2UgPSAoIWRpc2Fi
bGVSYW5nZSkgJiYgZG9jdW1lbnQgJiYgKCdjcmVhdGVSYW5nZScgaW4gZG9jdW1lbnQpICYmICh0
eXBlb2YgUmFuZ2UgIT09ICd1bmRlZmluZWQnKSAmJiBSYW5nZS5wcm90b3R5cGUuY3JlYXRlQ29u
dGV4dHVhbEZyYWdtZW50LAotCi0gICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIHByaW9yIHRv
IDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1lbnQK
LSAgICAgICAgLy8gaXMgYSAiemVyby1zY29wZSIgZWxlbWVudC4gVGhpcyBwcm9ibGVtIGNhbiBi
ZSB3b3JrZWQgYXJvdW5kIGJ5IG1ha2luZwotICAgICAgICAvLyB0aGUgZmlyc3Qgbm9kZSBhbiBp
bnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBNb2Rlcm5penIsIHVzZSAmc2h5OwotICAgICAg
ICBuZWVkc1NoeSA9IGRvY3VtZW50ICYmIChmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgdGVz
dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gICAgICAgICAgdGVzdEVsLmlu
bmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7Ci0gICAgICAgICAgdGVzdEVsLmZpcnN0Q2hpbGQuaW5u
ZXJIVE1MID0gIjxzY3JpcHQ+PC9zY3JpcHQ+IjsKLSAgICAgICAgICByZXR1cm4gdGVzdEVsLmZp
cnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKLSAgICAgICAgfSkoKSwKLQotCi0gICAgICAgIC8v
IElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNl
ZWRpbmcKLSAgICAgICAgLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBt
ZWFucyB0aGF0IHdlIGNhbgotICAgICAgICAvLyBhY2NpZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3Bh
Y2Ugd2hlbiB1cGRhdGluZyBhIG1vcnBoLgotICAgICAgICBtb3Zlc1doaXRlc3BhY2UgPSBkb2N1
bWVudCAmJiAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgICAgICAgIHRlc3RFbC5pbm5lckhUTUwgPSAiVGVzdDog
PHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPjwvc2NyaXB0PlZhbHVlIjsKLSAgICAg
ICAgICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYm
Ci0gICAgICAgICAgICAgICAgICB0ZXN0RWwuY2hpbGROb2Rlc1syXS5ub2RlVmFsdWUgPT09ICcg
VmFsdWUnOwotICAgICAgICB9KSgpOwotCi0gICAgLy8gQ29uc3RydWN0b3IgdGhhdCBzdXBwb3J0
cyBlaXRoZXIgTWV0YW1vcnBoKCdmb28nKSBvciBuZXcKLSAgICAvLyBNZXRhbW9ycGgoJ2Zvbycp
OwotICAgIC8vCi0gICAgLy8gVGFrZXMgYSBzdHJpbmcgb2YgSFRNTCBhcyB0aGUgYXJndW1lbnQu
Ci0KLSAgICB2YXIgTWV0YW1vcnBoID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgdmFyIHNlbGY7
Ci0KLSAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWV0YW1vcnBoKSB7Ci0gICAgICAgIHNlbGYg
PSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VsZiA9IG5ldyBLKCk7Ci0gICAgICB9
Ci0KLSAgICAgIHNlbGYuaW5uZXJIVE1MID0gaHRtbDsKLSAgICAgIHZhciBteUd1aWQgPSAnbWV0
YW1vcnBoLScrKGd1aWQrKyk7Ci0gICAgICBzZWxmLnN0YXJ0ID0gbXlHdWlkICsgJy1zdGFydCc7
Ci0gICAgICBzZWxmLmVuZCA9IG15R3VpZCArICctZW5kJzsKLQotICAgICAgcmV0dXJuIHNlbGY7
Ci0gICAgfTsKLQotICAgIEsucHJvdG90eXBlID0gTWV0YW1vcnBoLnByb3RvdHlwZTsKLQotICAg
IHZhciByYW5nZUZvciwgaHRtbEZ1bmMsIHJlbW92ZUZ1bmMsIG91dGVySFRNTEZ1bmMsIGFwcGVu
ZFRvRnVuYywgYWZ0ZXJGdW5jLCBwcmVwZW5kRnVuYywgc3RhcnRUYWdGdW5jLCBlbmRUYWdGdW5j
OwotCi0gICAgb3V0ZXJIVE1MRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMu
c3RhcnRUYWcoKSArIHRoaXMuaW5uZXJIVE1MICsgdGhpcy5lbmRUYWcoKTsKLSAgICB9OwotCi0g
ICAgc3RhcnRUYWdGdW5jID0gZnVuY3Rpb24oKSB7Ci0gICAgICAvKgotICAgICAgICogV2UgcmVw
bGFjZSBjaGV2cm9uIGJ5IGl0cyBoZXggY29kZSBpbiBvcmRlciB0byBwcmV2ZW50IGVzY2FwaW5n
IHByb2JsZW1zLgotICAgICAgICogQ2hlY2sgdGhpcyB0aHJlYWQgZm9yIG1vcmUgZXhwbGFpbmF0
aW9uOgotICAgICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MjMxMDQ4
L3doeS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1nZW5lcmF0aW5nLWh0bWwtZnJvbS1qYXZhc2Ny
aXB0Ci0gICAgICAgKi8KLSAgICAgIHJldHVybiAiPHNjcmlwdCBpZD0nIiArIHRoaXMuc3RhcnQg
KyAiJyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQot
ICAgIGVuZFRhZ0Z1bmMgPSBmdW5jdGlvbigpIHsKLSAgICAgIC8qCi0gICAgICAgKiBXZSByZXBs
YWNlIGNoZXZyb24gYnkgaXRzIGhleCBjb2RlIGluIG9yZGVyIHRvIHByZXZlbnQgZXNjYXBpbmcg
cHJvYmxlbXMuCi0gICAgICAgKiBDaGVjayB0aGlzIHRocmVhZCBmb3IgbW9yZSBleHBsYWluYXRp
b246Ci0gICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzgyMzEwNDgv
d2h5LXVzZS14M2MtaW5zdGVhZC1vZi13aGVuLWdlbmVyYXRpbmctaHRtbC1mcm9tLWphdmFzY3Jp
cHQKLSAgICAgICAqLwotICAgICAgcmV0dXJuICI8c2NyaXB0IGlkPSciICsgdGhpcy5lbmQgKyAi
JyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQotICAg
IC8vIElmIHdlIGhhdmUgdGhlIFczQyByYW5nZSBBUEksIHRoaXMgcHJvY2VzcyBpcyByZWxhdGl2
ZWx5IHN0cmFpZ2h0IGZvcndhcmQuCi0gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHsKLQotICAgICAg
Ly8gR2V0IGEgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IG1vcnBoLiBPcHRpb25hbGx5IGluY2x1ZGUg
dGhlIHN0YXJ0aW5nIGFuZAotICAgICAgLy8gZW5kaW5nIHBsYWNlaG9sZGVycy4KLSAgICAgIHJh
bmdlRm9yID0gZnVuY3Rpb24obW9ycGgsIG91dGVyVG9vKSB7Ci0gICAgICAgIHZhciByYW5nZSA9
IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHZhciBiZWZvcmUgPSBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZChtb3JwaC5zdGFydCk7Ci0gICAgICAgIHZhciBhZnRlciA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKG1vcnBoLmVuZCk7Ci0KLSAgICAgICAgaWYgKG91dGVyVG9vKSB7Ci0g
ICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoYmVmb3JlKTsKLSAgICAgICAgICByYW5nZS5z
ZXRFbmRBZnRlcihhZnRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmFuZ2Uuc2V0
U3RhcnRBZnRlcihiZWZvcmUpOwotICAgICAgICAgIHJhbmdlLnNldEVuZEJlZm9yZShhZnRlcik7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmFuZ2U7Ci0gICAgICB9OwotCi0gICAgICBo
dG1sRnVuYyA9IGZ1bmN0aW9uKGh0bWwsIG91dGVyVG9vKSB7Ci0gICAgICAgIC8vIGdldCBhIHJh
bmdlIGZvciB0aGUgY3VycmVudCBtZXRhbW9ycGggb2JqZWN0Ci0gICAgICAgIHZhciByYW5nZSA9
IHJhbmdlRm9yKHRoaXMsIG91dGVyVG9vKTsKLQotICAgICAgICAvLyBkZWxldGUgdGhlIGNvbnRl
bnRzIG9mIHRoZSByYW5nZSwgd2hpY2ggd2lsbCBiZSB0aGUKLSAgICAgICAgLy8gbm9kZXMgYmV0
d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwbGFjZWhvbGRlci4KLSAgICAgICAgcmFuZ2Uu
ZGVsZXRlQ29udGVudHMoKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgZnJh
Z21lbnQgZm9yIHRoZSBIVE1MCi0gICAgICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNv
bnRleHR1YWxGcmFnbWVudChodG1sKTsKLQotICAgICAgICAvLyBpbnNlcnQgdGhlIGZyYWdtZW50
IGludG8gdGhlIHJhbmdlCi0gICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAg
ICAgfTsKLQotICAgICAgLyoqCi0gICAgICAqIEBwdWJsaWMKLSAgICAgICoKLSAgICAgICogUmVt
b3ZlIHRoaXMgb2JqZWN0IChpbmNsdWRpbmcgc3RhcnRpbmcgYW5kIGVuZGluZwotICAgICAgKiBw
bGFjZWhvbGRlcnMpLgotICAgICAgKgotICAgICAgKiBAbWV0aG9kIHJlbW92ZQotICAgICAgKi8K
LSAgICAgIHJlbW92ZUZ1bmMgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gZ2V0IGEgcmFuZ2Ug
Zm9yIHRoZSBjdXJyZW50IG1ldGFtb3JwaCBvYmplY3QgaW5jbHVkaW5nCi0gICAgICAgIC8vIHRo
ZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9sZGVycy4KLSAgICAgICAgdmFyIHJhbmdlID0g
cmFuZ2VGb3IodGhpcywgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBlbnRpcmUgcmFu
Z2UuCi0gICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7Ci0gICAgICB9OwotCi0gICAgICBh
cHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihub2RlKSB7Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3Vt
ZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUpOwotICAgICAg
ICByYW5nZS5jb2xsYXBzZShmYWxzZSk7Ci0gICAgICAgIHZhciBmcmFnID0gcmFuZ2UuY3JlYXRl
Q29udGV4dHVhbEZyYWdtZW50KHRoaXMub3V0ZXJIVE1MKCkpOwotICAgICAgICBub2RlLmFwcGVu
ZENoaWxkKGZyYWcpOwotICAgICAgfTsKLQotICAgICAgYWZ0ZXJGdW5jID0gZnVuY3Rpb24oaHRt
bCkgewotICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwotICAgICAg
ICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7Ci0KLSAgICAg
ICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihhZnRlcik7Ci0gICAgICAgIHJhbmdlLnNldEVuZEFmdGVy
KGFmdGVyKTsKLQotICAgICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFs
RnJhZ21lbnQoaHRtbCk7Ci0gICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAg
ICAgfTsKLQotICAgICAgcHJlcGVuZEZ1bmMgPSBmdW5jdGlvbihodG1sKSB7Ci0gICAgICAgIHZh
ciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHZhciBzdGFydCA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwotCi0gICAgICAgIHJhbmdlLnNldFN0
YXJ0QWZ0ZXIoc3RhcnQpOwotICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihzdGFydCk7Ci0KLSAg
ICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwp
OwotICAgICAgICByYW5nZS5pbnNlcnROb2RlKGZyYWdtZW50KTsKLSAgICAgIH07Ci0KLSAgICB9
IGVsc2UgewotICAgICAgLyoKLSAgICAgICAqIFRoaXMgY29kZSBpcyBtb3N0bHkgdGFrZW4gZnJv
bSBqUXVlcnksIHdpdGggb25lIGV4Y2VwdGlvbi4gSW4galF1ZXJ5J3MgY2FzZSwgd2UKLSAgICAg
ICAqIGhhdmUgc29tZSBIVE1MIGFuZCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZl
cnQgaXQgaW50byBzb21lIG5vZGVzLgotICAgICAgICoKLSAgICAgICAqIEluIHRoaXMgY2FzZSwg
alF1ZXJ5IG5lZWRzIHRvIHNjYW4gdGhlIEhUTUwgbG9va2luZyBmb3IgYW4gb3BlbmluZyB0YWcg
YW5kIHVzZQotICAgICAgICogdGhhdCBhcyB0aGUga2V5IGZvciB0aGUgd3JhcCBtYXAuIEluIG91
ciBjYXNlLCB3ZSBrbm93IHRoZSBwYXJlbnQgbm9kZSwgYW5kCi0gICAgICAgKiBjYW4gdXNlIGl0
cyB0eXBlIGFzIHRoZSBrZXkgZm9yIHRoZSB3cmFwIG1hcC4KLSAgICAgICAqKi8KLSAgICAgIHZh
ciB3cmFwTWFwID0gewotICAgICAgICBzZWxlY3Q6IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211
bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAotICAgICAgICBmaWVsZHNldDogWyAxLCAiPGZpZWxk
c2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKLSAgICAgICAgdGFibGU6IFsgMSwgIjx0YWJsZT4iLCAi
PC90YWJsZT4iIF0sCi0gICAgICAgIHRib2R5OiBbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Ri
b2R5PjwvdGFibGU+IiBdLAotICAgICAgICB0cjogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+Iiwg
IjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKLSAgICAgICAgY29sZ3JvdXA6IFsgMiwgIjx0YWJs
ZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCi0g
ICAgICAgIG1hcDogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAotICAgICAgICBfZGVmYXVsdDog
WyAwLCAiIiwgIiIgXQotICAgICAgfTsKLQotICAgICAgdmFyIGZpbmRDaGlsZEJ5SWQgPSBmdW5j
dGlvbihlbGVtZW50LCBpZCkgewotICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lk
JykgPT09IGlkKSB7IHJldHVybiBlbGVtZW50OyB9Ci0KLSAgICAgICAgdmFyIGxlbiA9IGVsZW1l
bnQuY2hpbGROb2Rlcy5sZW5ndGgsIGlkeCwgbm9kZSwgZm91bmQ7Ci0gICAgICAgIGZvciAoaWR4
PTA7IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICAgICAgbm9kZSA9IGVsZW1lbnQuY2hpbGROb2Rl
c1tpZHhdOwotICAgICAgICAgIGZvdW5kID0gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBmaW5kQ2hp
bGRCeUlkKG5vZGUsIGlkKTsKLSAgICAgICAgICBpZiAoZm91bmQpIHsgcmV0dXJuIGZvdW5kOyB9
Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIHZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlv
bihlbGVtZW50LCBodG1sKSB7Ci0gICAgICAgIHZhciBtYXRjaGVzID0gW107Ci0gICAgICAgIGlm
IChtb3Zlc1doaXRlc3BhY2UpIHsKLSAgICAgICAgICAvLyBSaWdodCBub3cgd2Ugb25seSBjaGVj
ayBmb3Igc2NyaXB0IHRhZ3Mgd2l0aCBpZHMgd2l0aCB0aGUKLSAgICAgICAgICAvLyBnb2FsIG9m
IHRhcmdldGluZyBtb3JwaHMuCi0gICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvKFxzKyko
PHNjcmlwdCBpZD0nKFteJ10rKScpL2csIGZ1bmN0aW9uKG1hdGNoLCBzcGFjZXMsIHRhZywgaWQp
IHsKLSAgICAgICAgICAgIG1hdGNoZXMucHVzaChbaWQsIHNwYWNlc10pOwotICAgICAgICAgICAg
cmV0dXJuIHRhZzsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsZW1lbnQu
aW5uZXJIVE1MID0gaHRtbDsKLQotICAgICAgICAvLyBJZiB3ZSBoYXZlIHRvIGRvIGFueSB3aGl0
ZXNwYWNlIGFkanVzdG1lbnRzIGRvIHRoZW0gbm93Ci0gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0
aCA+IDApIHsKLSAgICAgICAgICB2YXIgbGVuID0gbWF0Y2hlcy5sZW5ndGgsIGlkeDsKLSAgICAg
ICAgICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgewotICAgICAgICAgICAgdmFyIHNjcmlw
dCA9IGZpbmRDaGlsZEJ5SWQoZWxlbWVudCwgbWF0Y2hlc1tpZHhdWzBdKSwKLSAgICAgICAgICAg
ICAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWF0Y2hlc1tpZHhdWzFdKTsKLSAg
ICAgICAgICAgIHNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBzY3JpcHQpOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgLyoKLSAgICAgICAqIEdp
dmVuIGEgcGFyZW50IG5vZGUgYW5kIHNvbWUgSFRNTCwgZ2VuZXJhdGUgYSBzZXQgb2Ygbm9kZXMu
IFJldHVybiB0aGUgZmlyc3QKLSAgICAgICAqIG5vZGUsIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8g
dHJhdmVyc2UgdGhlIHJlc3QgdXNpbmcgbmV4dFNpYmxpbmcuCi0gICAgICAgKgotICAgICAgICog
V2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgaW5uZXJIVE1MIGluIElFIGRvZXMgbm90IHJlYWxs
eSBwYXJzZSB0aGUgbm9kZXMuCi0gICAgICAgKi8KLSAgICAgIHZhciBmaXJzdE5vZGVGb3IgPSBm
dW5jdGlvbihwYXJlbnROb2RlLCBodG1sKSB7Ci0gICAgICAgIHZhciBhcnIgPSB3cmFwTWFwW3Bh
cmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwotICAg
ICAgICB2YXIgZGVwdGggPSBhcnJbMF0sIHN0YXJ0ID0gYXJyWzFdLCBlbmQgPSBhcnJbMl07Ci0K
LSAgICAgICAgaWYgKG5lZWRzU2h5KSB7IGh0bWwgPSAnJnNoeTsnK2h0bWw7IH0KLQotICAgICAg
ICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotCi0gICAgICAg
IHNldElubmVySFRNTChlbGVtZW50LCBzdGFydCArIGh0bWwgKyBlbmQpOwotCi0gICAgICAgIGZv
ciAodmFyIGk9MDsgaTw9ZGVwdGg7IGkrKykgewotICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50
LmZpcnN0Q2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb29rIGZvciAmc2h5OyB0byBy
ZW1vdmUgaXQuCi0gICAgICAgIGlmIChuZWVkc1NoeSkgewotICAgICAgICAgIHZhciBzaHlFbGVt
ZW50ID0gZWxlbWVudDsKLQotICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBnZXQgbmFtZWxlc3Mg
ZWxlbWVudHMgd2l0aCB0aGUgc2h5IGluc2lkZQotICAgICAgICAgIHdoaWxlIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAxICYmICFzaHlFbGVtZW50Lm5vZGVOYW1lKSB7Ci0gICAgICAgICAgICBz
aHlFbGVtZW50ID0gc2h5RWxlbWVudC5maXJzdENoaWxkOwotICAgICAgICAgIH0KLQotICAgICAg
ICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyB0aGUgYWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgot
ICAgICAgICAgIGlmIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9k
ZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKLSAgICAgICAgICAgIHNoeUVsZW1lbnQu
bm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFsdWUuc2xpY2UoMSk7Ci0gICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICB9OwotCi0gICAgICAv
KgotICAgICAgICogSW4gc29tZSBjYXNlcywgSW50ZXJuZXQgRXhwbG9yZXIgY2FuIGNyZWF0ZSBh
biBhbm9ueW1vdXMgbm9kZSBpbgotICAgICAgICogdGhlIGhpZXJhcmNoeSB3aXRoIG5vIHRhZ05h
bWUuIFlvdSBjYW4gY3JlYXRlIHRoaXMgc2NlbmFyaW8gdmlhOgotICAgICAgICoKLSAgICAgICAq
ICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBk
aXYuaW5uZXJIVE1MID0gIjx0YWJsZT4mc2h5PHNjcmlwdD48L3NjcmlwdD48dHI+PHRkPmhpPC90
ZD48L3RyPjwvdGFibGU+IjsKLSAgICAgICAqICAgICBkaXYuZmlyc3RDaGlsZC5maXJzdENoaWxk
LnRhZ05hbWUgLy89PiAiIgotICAgICAgICoKLSAgICAgICAqIElmIG91ciBzY3JpcHQgbWFya2Vy
cyBhcmUgaW5zaWRlIHN1Y2ggYSBub2RlLCB3ZSBuZWVkIHRvIGZpbmQgdGhhdAotICAgICAgICog
bm9kZSBhbmQgdXNlICppdCogYXMgdGhlIG1hcmtlci4KLSAgICAgICAqLwotICAgICAgdmFyIHJl
YWxOb2RlID0gZnVuY3Rpb24oc3RhcnQpIHsKLSAgICAgICAgd2hpbGUgKHN0YXJ0LnBhcmVudE5v
ZGUudGFnTmFtZSA9PT0gIiIpIHsKLSAgICAgICAgICBzdGFydCA9IHN0YXJ0LnBhcmVudE5vZGU7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgICB9OwotCi0gICAgICAv
KgotICAgICAgICogV2hlbiBhdXRvbWF0aWNhbGx5IGFkZGluZyBhIHRib2R5LCBJbnRlcm5ldCBF
eHBsb3JlciBpbnNlcnRzIHRoZQotICAgICAgICogdGJvZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRo
ZSBmaXJzdCA8dHI+LiBPdGhlciBicm93c2VycyBjcmVhdGUgaXQKLSAgICAgICAqIGJlZm9yZSB0
aGUgZmlyc3Qgbm9kZSwgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKgotICAgICAgICogVGhpcyBt
ZWFucyB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICoKLSAgICAgICAqICAgICBkaXYg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBkaXYuaW5uZXJI
VE1MID0gIjx0YWJsZT48c2NyaXB0IGlkPSdmaXJzdCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+
PC90cj48c2NyaXB0IGlkPSdsYXN0Jz48L3NjcmlwdD48L3RhYmxlPgotICAgICAgICoKLSAgICAg
ICAqIEdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIERPTSBpbiBJRToKLSAgICAgICAqCi0gICAgICAg
KiAgICAgKyBkaXYKLSAgICAgICAqICAgICAgICsgdGFibGUKLSAgICAgICAqICAgICAgICAgLSBz
Y3JpcHQgaWQ9J2ZpcnN0JwotICAgICAgICogICAgICAgICArIHRib2R5Ci0gICAgICAgKiAgICAg
ICAgICAgKyB0cgotICAgICAgICogICAgICAgICAgICAgKyB0ZAotICAgICAgICogICAgICAgICAg
ICAgICAtICJoaSIKLSAgICAgICAqICAgICAgICAgICAtIHNjcmlwdCBpZD0nbGFzdCcKLSAgICAg
ICAqCi0gICAgICAgKiBXaGljaCBtZWFucyB0aGF0IHRoZSB0d28gc2NyaXB0IHRhZ3MsIGV2ZW4g
dGhvdWdoIHRoZXkgd2VyZQotICAgICAgICogaW5zZXJ0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4g
dGhlIGhpZXJhcmNoeSBpbiB0aGUgb3JpZ2luYWwKLSAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRp
ZmZlcmVudCBwYXJlbnRzLgotICAgICAgICoKLSAgICAgICAqIFRoaXMgY29kZSByZXBhcmVudHMg
dGhlIGZpcnN0IHNjcmlwdCB0YWcgYnkgbWFraW5nIGl0IHRoZSB0Ym9keSdzCi0gICAgICAgKiBm
aXJzdCBjaGlsZC4KLSAgICAgICAqCi0gICAgICAgKi8KLSAgICAgIHZhciBmaXhQYXJlbnRhZ2Ug
PSBmdW5jdGlvbihzdGFydCwgZW5kKSB7Ci0gICAgICAgIGlmIChzdGFydC5wYXJlbnROb2RlICE9
PSBlbmQucGFyZW50Tm9kZSkgewotICAgICAgICAgIGVuZC5wYXJlbnROb2RlLmluc2VydEJlZm9y
ZShzdGFydCwgZW5kLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH07
Ci0KLSAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24oaHRtbCwgb3V0ZXJUb28pIHsKLSAgICAgICAg
Ly8gZ2V0IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4K
LSAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp
cy5zdGFydCkpOwotICAgICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp
cy5lbmQpOwotICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGVuZC5wYXJlbnROb2RlOwotICAgICAg
ICB2YXIgbm9kZSwgbmV4dFNpYmxpbmcsIGxhc3Q7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRo
YXQgdGhlIHN0YXJ0IGFuZCBlbmQgbm9kZXMgc2hhcmUgdGhlIHNhbWUKLSAgICAgICAgLy8gcGFy
ZW50LiBJZiBub3QsIGZpeCBpdC4KLSAgICAgICAgZml4UGFyZW50YWdlKHN0YXJ0LCBlbmQpOwot
Ci0gICAgICAgIC8vIHJlbW92ZSBhbGwgb2YgdGhlIG5vZGVzIGFmdGVyIHRoZSBzdGFydGluZyBw
bGFjZWhvbGRlciBhbmQKLSAgICAgICAgLy8gYmVmb3JlIHRoZSBlbmRpbmcgcGxhY2Vob2xkZXIu
Ci0gICAgICAgIG5vZGUgPSBzdGFydC5uZXh0U2libGluZzsKLSAgICAgICAgd2hpbGUgKG5vZGUp
IHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAg
bGFzdCA9IG5vZGUgPT09IGVuZDsKLQotICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qg
bm9kZSwgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGFzIHdlbGwsCi0gICAgICAgICAgLy8gc2V0
IHRoZSBgZW5kYCBub2RlIHRvIHRoZSBuZXh0IHNpYmxpbmcuIFRoaXMgaXMgYmVjYXVzZQotICAg
ICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24sIHdlIGluc2VydCB0aGUgbmV3
IG5vZGVzCi0gICAgICAgICAgLy8gYmVmb3JlIHRoZSBlbmQgKG5vdGUgdGhhdCBpbnNlcnRCZWZv
cmUobm9kZSwgbnVsbCkgaXMKLSAgICAgICAgICAvLyB0aGUgc2FtZSBhcyBhcHBlbmRDaGlsZChu
b2RlKSkuCi0gICAgICAgICAgLy8KLSAgICAgICAgICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byBy
ZW1vdmUgaXQsIGp1c3QgYnJlYWsuCi0gICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAg
IGlmIChvdXRlclRvbykgeyBlbmQgPSBub2RlLm5leHRTaWJsaW5nOyB9IGVsc2UgeyBicmVhazsg
fQotICAgICAgICAgIH0KLQotICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChu
b2RlKTsKLQotICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBhbmQgd2UgZGlk
bid0IGJyZWFrIGJlZm9yZQotICAgICAgICAgIC8vIChiZWNhdXNlIHdlIHdhbnRlZCB0byByZW1v
dmUgdGhlIG91dGVyIG5vZGVzKSwgYnJlYWsKLSAgICAgICAgICAvLyBub3cuCi0gICAgICAgICAg
aWYgKGxhc3QpIHsgYnJlYWs7IH0KLQotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgZmlyc3Qgbm9kZSBmb3IgdGhlIEhUTUwgc3Ry
aW5nLCBldmVuIGluIGNhc2VzIGxpa2UKLSAgICAgICAgLy8gdGFibGVzIGFuZCBsaXN0cyB3aGVy
ZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYgd291bGQKLSAgICAgICAgLy8gc3dhbGxvdyBz
b21lIG9mIHRoZSBjb250ZW50LgotICAgICAgICBub2RlID0gZmlyc3ROb2RlRm9yKHN0YXJ0LnBh
cmVudE5vZGUsIGh0bWwpOwotCi0gICAgICAgIGlmIChvdXRlclRvbykgewotICAgICAgICAgIHN0
YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gY29weSB0aGUgbm9kZXMgZm9yIHRoZSBIVE1MIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFuZCBl
bmRpbmcKLSAgICAgICAgLy8gcGxhY2Vob2xkZXIuCi0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0g
ICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwotICAgICAgICAgIHBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVuZCk7Ci0gICAgICAgICAgbm9kZSA9IG5leHRTaWJs
aW5nOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICAvLyByZW1vdmUgdGhlIG5vZGVzIGlu
IHRoZSBET00gcmVwcmVzZW50aW5nIHRoaXMgbWV0YW1vcnBoLgotICAgICAgLy8KLSAgICAgIC8v
IHRoaXMgaW5jbHVkZXMgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcGxhY2Vob2xkZXJzLgotICAg
ICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgc3RhcnQgPSByZWFsTm9k
ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0YXJ0KSk7Ci0gICAgICAgIHZhciBlbmQg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7Ci0KLSAgICAgICAgdGhpcy5odG1s
KCcnKTsKLSAgICAgICAgc3RhcnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdGFydCk7Ci0gICAg
ICAgIGVuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVuZCk7Ci0gICAgICB9OwotCi0gICAgICBh
cHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihwYXJlbnROb2RlKSB7Ci0gICAgICAgIHZhciBub2RlID0g
Zmlyc3ROb2RlRm9yKHBhcmVudE5vZGUsIHRoaXMub3V0ZXJIVE1MKCkpOwotICAgICAgICB2YXIg
bmV4dFNpYmxpbmc7Ci0KLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2li
bGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGls
ZChub2RlKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAg
IH07Ci0KLSAgICAgIGFmdGVyRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKLSAgICAgICAgLy8gZ2V0
IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KLSAgICAg
ICAgdmFyIGVuZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKLSAgICAgICAg
dmFyIGluc2VydEJlZm9yZSA9IGVuZC5uZXh0U2libGluZzsKLSAgICAgICAgdmFyIHBhcmVudE5v
ZGUgPSBlbmQucGFyZW50Tm9kZTsKLSAgICAgICAgdmFyIG5leHRTaWJsaW5nOwotICAgICAgICB2
YXIgbm9kZTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IG5vZGUgZm9yIHRoZSBIVE1MIHN0
cmluZywgZXZlbiBpbiBjYXNlcyBsaWtlCi0gICAgICAgIC8vIHRhYmxlcyBhbmQgbGlzdHMgd2hl
cmUgYSBzaW1wbGUgaW5uZXJIVE1MIG9uIGEgZGl2IHdvdWxkCi0gICAgICAgIC8vIHN3YWxsb3cg
c29tZSBvZiB0aGUgY29udGVudC4KLSAgICAgICAgbm9kZSA9IGZpcnN0Tm9kZUZvcihwYXJlbnRO
b2RlLCBodG1sKTsKLQotICAgICAgICAvLyBjb3B5IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0
d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZwotICAgICAgICAvLyBwbGFjZWhvbGRlci4KLSAg
ICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNp
Ymxpbmc7Ci0gICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgaW5zZXJ0QmVm
b3JlKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAgIH07
Ci0KLSAgICAgIHByZXBlbmRGdW5jID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgICB2YXIgc3Rh
cnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0YXJ0KTsKLSAgICAgICAgdmFyIHBh
cmVudE5vZGUgPSBzdGFydC5wYXJlbnROb2RlOwotICAgICAgICB2YXIgbmV4dFNpYmxpbmc7Ci0g
ICAgICAgIHZhciBub2RlOwotCi0gICAgICAgIG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9k
ZSwgaHRtbCk7Ci0gICAgICAgIHZhciBpbnNlcnRCZWZvcmUgPSBzdGFydC5uZXh0U2libGluZzsK
LQotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5u
ZXh0U2libGluZzsKLSAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNl
cnRCZWZvcmUpOwotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAgfQotICAg
ICAgfTsKLSAgICB9Ci0KLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbiho
dG1sKSB7Ci0gICAgICB0aGlzLmNoZWNrUmVtb3ZlZCgpOwotICAgICAgaWYgKGh0bWwgPT09IHVu
ZGVmaW5lZCkgeyByZXR1cm4gdGhpcy5pbm5lckhUTUw7IH0KLQotICAgICAgaHRtbEZ1bmMuY2Fs
bCh0aGlzLCBodG1sKTsKLQotICAgICAgdGhpcy5pbm5lckhUTUwgPSBodG1sOwotICAgIH07Ci0K
LSAgICBNZXRhbW9ycGgucHJvdG90eXBlLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24oaHRtbCkgewot
ICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKLSAgICAgIGh0bWxGdW5jLmNhbGwodGhpcywgaHRt
bCwgdHJ1ZSk7Ci0gICAgfTsKLQotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUucmVtb3ZlID0gcmVt
b3ZlRnVuYzsKLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLm91dGVySFRNTCA9IG91dGVySFRNTEZ1
bmM7Ci0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5hcHBlbmRUbyA9IGFwcGVuZFRvRnVuYzsKLSAg
ICBNZXRhbW9ycGgucHJvdG90eXBlLmFmdGVyID0gYWZ0ZXJGdW5jOwotICAgIE1ldGFtb3JwaC5w
cm90b3R5cGUucHJlcGVuZCA9IHByZXBlbmRGdW5jOwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUu
c3RhcnRUYWcgPSBzdGFydFRhZ0Z1bmM7Ci0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5lbmRUYWcg
PSBlbmRUYWdGdW5jOwotCi0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5pc1JlbW92ZWQgPSBmdW5j
dGlvbigpIHsKLSAgICAgIHZhciBiZWZvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlz
LnN0YXJ0KTsKLSAgICAgIHZhciBhZnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMu
ZW5kKTsKLQotICAgICAgcmV0dXJuICFiZWZvcmUgfHwgIWFmdGVyOwotICAgIH07Ci0KLSAgICBN
ZXRhbW9ycGgucHJvdG90eXBlLmNoZWNrUmVtb3ZlZCA9IGZ1bmN0aW9uKCkgewotICAgICAgaWYg
KHRoaXMuaXNSZW1vdmVkKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVy
Zm9ybSBvcGVyYXRpb25zIG9uIGEgTWV0YW1vcnBoIHRoYXQgaXMgbm90IGluIHRoZSBET00uIik7
Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiBNZXRhbW9ycGg7Ci0gIH0pOwotCi19KSgp
OwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
aGFuZGxlYmFycy1jb21waWxlcgotKi8KLQotLy8gRWxpbWluYXRlIGRlcGVuZGVuY3kgb24gYW55
IEVtYmVyIHRvIHNpbXBsaWZ5IHByZWNvbXBpbGF0aW9uIHdvcmtmbG93Ci12YXIgb2JqZWN0Q3Jl
YXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbihwYXJlbnQpIHsKLSAgZnVuY3Rpb24gRigp
IHt9Ci0gIEYucHJvdG90eXBlID0gcGFyZW50OwotICByZXR1cm4gbmV3IEYoKTsKLX07Ci0KLXZh
ciBIYW5kbGViYXJzID0gKEVtYmVyLmltcG9ydHMgJiYgRW1iZXIuaW1wb3J0cy5IYW5kbGViYXJz
KSB8fCAodGhpcyAmJiB0aGlzLkhhbmRsZWJhcnMpOwotaWYgKCFIYW5kbGViYXJzICYmIHR5cGVv
ZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7Ci0gIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5k
bGViYXJzJyk7Ci19Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBI
YW5kbGViYXJzIHZlcnNpb24gMS4wIG9yIDEuMS4gSW5jbHVkZSAiICsKLSAgICAgICAgICAgICAi
YSBTQ1JJUFQgdGFnIGluIHRoZSBIVE1MIEhFQUQgbGlua2luZyB0byB0aGUgSGFuZGxlYmFycyBm
aWxlICIgKwotICAgICAgICAgICAgICJiZWZvcmUgeW91IGxpbmsgdG8gRW1iZXIuIiwgSGFuZGxl
YmFycyk7Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBIYW5kbGVi
YXJzIHZlcnNpb24gMS4wIG9yIDEuMSwgIiArCi0gICAgICAgICAgICAgIkNPTVBJTEVSX1JFVklT
SU9OIGV4cGVjdGVkOiA0LCBnb3Q6ICIgKyAgSGFuZGxlYmFycy5DT01QSUxFUl9SRVZJU0lPTiAr
Ci0gICAgICAgICAgICAgIiAtIFBsZWFzZSBub3RlOiBCdWlsZHMgb2YgbWFzdGVyIG1heSBoYXZl
IG90aGVyIENPTVBJTEVSX1JFVklTSU9OIHZhbHVlcy4iLAotICAgICAgICAgICAgIEhhbmRsZWJh
cnMuQ09NUElMRVJfUkVWSVNJT04gPT09IDQpOwotCi0vKioKLSAgUHJlcGFyZXMgdGhlIEhhbmRs
ZWJhcnMgdGVtcGxhdGluZyBsaWJyYXJ5IGZvciB1c2UgaW5zaWRlIEVtYmVyJ3MgdmlldwotICBz
eXN0ZW0uCi0KLSAgVGhlIGBFbWJlci5IYW5kbGViYXJzYCBvYmplY3QgaXMgdGhlIHN0YW5kYXJk
IEhhbmRsZWJhcnMgbGlicmFyeSwgZXh0ZW5kZWQgdG8KLSAgdXNlIEVtYmVyJ3MgYGdldCgpYCBt
ZXRob2QgaW5zdGVhZCBvZiBkaXJlY3QgcHJvcGVydHkgYWNjZXNzLCB3aGljaCBhbGxvd3MKLSAg
Y29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXMuCi0KLSAgVG8g
Y3JlYXRlIGFuIGBFbWJlci5IYW5kbGViYXJzYCB0ZW1wbGF0ZSwgY2FsbCBgRW1iZXIuSGFuZGxl
YmFycy5jb21waWxlKClgLgotICBUaGlzIHdpbGwgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4g
YmUgdXNlZCBieSBgRW1iZXIuVmlld2AgZm9yIHJlbmRlcmluZy4KLQotICBAY2xhc3MgSGFuZGxl
YmFycwotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwotRW1iZXIuSGFuZGxlYmFycyA9IG9iamVjdENy
ZWF0ZShIYW5kbGViYXJzKTsKLQotLyoqCi0gIFJlZ2lzdGVyIGEgYm91bmQgaGVscGVyIG9yIGN1
c3RvbSB2aWV3IGhlbHBlci4KLQotICAjIyBTaW1wbGUgYm91bmQgaGVscGVyIGV4YW1wbGUKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyKCdjYXBpdGFsaXplJywg
ZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKLSAgfSk7
Ci0gIGBgYAotCi0gIFRoZSBhYm92ZSBib3VuZCBoZWxwZXIgY2FuIGJlIHVzZWQgaW5zaWRlIG9m
IHRlbXBsYXRlcyBhcyBmb2xsb3dzOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tjYXBpdGFsaXpl
IG5hbWV9fQotICBgYGAKLQotICBJbiB0aGlzIGNhc2UsIHdoZW4gdGhlIGBuYW1lYCBwcm9wZXJ0
eSBvZiB0aGUgdGVtcGxhdGUncyBjb250ZXh0IGNoYW5nZXMsCi0gIHRoZSByZW5kZXJlZCB2YWx1
ZSBvZiB0aGUgaGVscGVyIHdpbGwgdXBkYXRlIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCi0KLSAg
Rm9yIG1vcmUgZXhhbXBsZXMgb2YgYm91bmQgaGVscGVycywgc2VlIGRvY3VtZW50YXRpb24gZm9y
Ci0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgLgotCi0gICMjIEN1c3Rv
bSB2aWV3IGhlbHBlciBleGFtcGxlCi0KLSAgQXNzdW1pbmcgYSB2aWV3IHN1YmNsYXNzIG5hbWVk
IGBBcHAuQ2FsZW5kYXJWaWV3YCB3ZXJlIGRlZmluZWQsIGEgaGVscGVyCi0gIGZvciByZW5kZXJp
bmcgaW5zdGFuY2VzIG9mIHRoaXMgdmlldyBjb3VsZCBiZSByZWdpc3RlcmVkIGFzIGZvbGxvd3M6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLmhlbHBlcignY2FsZW5kYXIn
LCBBcHAuQ2FsZW5kYXJWaWV3KToKLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBj
YW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6Ci0KLSAgYGBgaGFuZGxl
YmFycwotICB7e2NhbGVuZGFyfX0KLSAgYGBgCi0KLSAgV2hpY2ggaXMgZnVuY3Rpb25hbGx5IGVx
dWl2YWxlbnQgdG86Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgQXBwLkNhbGVuZGFyVmll
d319Ci0gIGBgYAotCi0gIE9wdGlvbnMgaW4gdGhlIGhlbHBlciB3aWxsIGJlIHBhc3NlZCB0byB0
aGUgdmlldyBpbiBleGFjdGx5IHRoZSBzYW1lCi0gIG1hbm5lciBhcyB3aXRoIHRoZSBgdmlld2Ag
aGVscGVyLgotCi0gIEBtZXRob2QgaGVscGVyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBA
cGFyYW0ge1N0cmluZ30gbmFtZQotICBAcGFyYW0ge0Z1bmN0aW9ufEVtYmVyLlZpZXd9IGZ1bmN0
aW9uIG9yIHZpZXcgY2xhc3MgY29uc3RydWN0b3IKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleXMqCi0qLwotRW1iZXIuSGFuZGxlYmFycy5oZWxwZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1
ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byByZWdpc3RlciBhIGNvbXBvbmVudCBu
YW1lZCAnIiArIG5hbWUgKyAiJywgYnV0IGNvbXBvbmVudCBuYW1lcyBtdXN0IGluY2x1ZGUgYSAn
LSciLCAhRW1iZXIuQ29tcG9uZW50LmRldGVjdCh2YWx1ZSkgfHwgbmFtZS5tYXRjaCgvLS8pKTsK
LQotICBpZiAoRW1iZXIuVmlldy5kZXRlY3QodmFsdWUpKSB7Ci0gICAgRW1iZXIuSGFuZGxlYmFy
cy5yZWdpc3RlckhlbHBlcihuYW1lLCBFbWJlci5IYW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKHZh
bHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5kSGVs
cGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Ci0gIH0KLX07Ci0KLS8qKgotICBSZXR1cm5zIGEg
aGVscGVyIGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgcHJvdmlkZWQgVmlld0NsYXNzLgotCi0g
IFVzZWQgaW50ZXJuYWxseSBieSBFbWJlci5IYW5kbGViYXJzLmhlbHBlciBhbmQgb3RoZXIgbWV0
aG9kcwotICBpbnZvbHZpbmcgaGVscGVyL2NvbXBvbmVudCByZWdpc3RyYXRpb24uCi0KLSAgQHBy
aXZhdGUKLSAgQG1ldGhvZCBoZWxwZXIKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gIEBwYXJh
bSB7RnVuY3Rpb259IFZpZXdDbGFzcyB2aWV3IGNsYXNzIGNvbnN0cnVjdG9yCi0qLwotRW1iZXIu
SGFuZGxlYmFycy5tYWtlVmlld0hlbHBlciA9IGZ1bmN0aW9uKFZpZXdDbGFzcykgewotICByZXR1
cm4gZnVuY3Rpb24ob3B0aW9ucykgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IHBh
c3MgYXR0cmlidXRlcyAoc3VjaCBhcyBuYW1lPXZhbHVlKSBub3QgYmFyZSB2YWx1ZXMgdG8gYSBo
ZWxwZXIgZm9yIGEgVmlldyBmb3VuZCBpbiAnIiArIFZpZXdDbGFzcy50b1N0cmluZygpICsgIici
LCBhcmd1bWVudHMubGVuZ3RoIDwgMik7Ci0gICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVs
cGVycy52aWV3LmNhbGwodGhpcywgVmlld0NsYXNzLCBvcHRpb25zKTsKLSAgfTsKLX07Ci0KLS8q
KgotQGNsYXNzIGhlbHBlcnMKLUBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycyA9IG9iamVjdENyZWF0ZShIYW5kbGViYXJzLmhlbHBlcnMpOwot
Ci0vKioKLSAgT3ZlcnJpZGUgdGhlIHRoZSBvcGNvZGUgY29tcGlsZXIgYW5kIEphdmFTY3JpcHQg
Y29tcGlsZXIgZm9yIEhhbmRsZWJhcnMuCi0KLSAgQGNsYXNzIENvbXBpbGVyCi0gIEBuYW1lc3Bh
Y2UgRW1iZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSovCi1FbWJl
ci5IYW5kbGViYXJzLkNvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKLQotLy8gSGFuZGxlYmFycy5D
b21waWxlciBkb2Vzbid0IGV4aXN0IGluIHJ1bnRpbWUtb25seQotaWYgKEhhbmRsZWJhcnMuQ29t
cGlsZXIpIHsKLSAgRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUgPSBvYmplY3RD
cmVhdGUoSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUpOwotfQotCi1FbWJlci5IYW5kbGVi
YXJzLkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlciA9IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGls
ZXI7Ci0KLS8qKgotICBAY2xhc3MgSmF2YVNjcmlwdENvbXBpbGVyCi0gIEBuYW1lc3BhY2UgRW1i
ZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSovCi1FbWJlci5IYW5k
bGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307Ci0KLS8vIEhhbmRsZWJh
cnMuSmF2YVNjcmlwdENvbXBpbGVyIGRvZXNuJ3QgZXhpc3QgaW4gcnVudGltZS1vbmx5Ci1pZiAo
SGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIpIHsKLSAgRW1iZXIuSGFuZGxlYmFycy5KYXZh
U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gb2JqZWN0Q3JlYXRlKEhhbmRsZWJhcnMuSmF2YVNj
cmlwdENvbXBpbGVyLnByb3RvdHlwZSk7Ci0gIEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENv
bXBpbGVyLnByb3RvdHlwZS5jb21waWxlciA9IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENv
bXBpbGVyOwotfQotCi0KLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3Rv
dHlwZS5uYW1lc3BhY2UgPSAiRW1iZXIuSGFuZGxlYmFycyI7Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
SmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5pbml0aWFsaXplQnVmZmVyID0gZnVuY3Rpb24o
KSB7Ci0gIHJldHVybiAiJyciOwotfTsKLQotLyoqCi0gIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1
ZmZlciBmb3IgRW1iZXIgSGFuZGxlYmFycy4gQnkgZGVmYXVsdCwgSGFuZGxlYmFycwotICBjcmVh
dGVzIGFuIGVtcHR5IFN0cmluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaW52b2NhdGlvbiBh
bmQgYXBwZW5kcyB0bwotICBpdC4gRW1iZXIncyBIYW5kbGViYXJzIG92ZXJyaWRlcyB0aGlzIHRv
IGFwcGVuZCB0byBhIHNpbmdsZSBzaGFyZWQgYnVmZmVyLgotCi0gIEBwcml2YXRlCi0gIEBtZXRo
b2QgYXBwZW5kVG9CdWZmZXIKLSAgQHBhcmFtIHN0cmluZyB7U3RyaW5nfQotKi8KLUVtYmVyLkhh
bmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5hcHBlbmRUb0J1ZmZlciA9IGZ1
bmN0aW9uKHN0cmluZykgewotICByZXR1cm4gImRhdGEuYnVmZmVyLnB1c2goIitzdHJpbmcrIik7
IjsKLX07Ci0KLS8vIEhhY2tzIGFoZWFkOgotLy8gSGFuZGxlYmFycyBwcmVzZW50bHkgaGFzIGEg
YnVnIHdoZXJlIHRoZSBgYmxvY2tIZWxwZXJNaXNzaW5nYCBob29rCi0vLyBkb2Vzbid0IGdldCBw
YXNzZWQgdGhlIG5hbWUgb2YgdGhlIG1pc3NpbmcgaGVscGVyIG5hbWUsIGJ1dCByYXRoZXIKLS8v
IGdldHMgcGFzc2VkIHRoZSB2YWx1ZSBvZiB0aGF0IG1pc3NpbmcgaGVscGVyIGV2YWx1YXRlZCBv
biB0aGUgY3VycmVudAotLy8gY29udGV4dCwgd2hpY2ggaXMgbW9zdCBsaWtlbHkgYHVuZGVmaW5l
ZGAgYW5kIHRvdGFsbHkgdXNlbGVzcy4KLS8vCi0vLyBTbyB3ZSBhbHRlciB0aGUgY29tcGlsZWQg
dGVtcGxhdGUgZnVuY3Rpb24gdG8gcGFzcyB0aGUgbmFtZSBvZiB0aGUgaGVscGVyCi0vLyBpbnN0
ZWFkLCBhcyBleHBlY3RlZC4KLS8vCi0vLyBUaGlzIGNhbiBnbyBhd2F5IG9uY2UgdGhlIGZvbGxv
d2luZyBpcyBjbG9zZWQ6Ci0vLyBodHRwczovL2dpdGh1Yi5jb20vd3ljYXRzL2hhbmRsZWJhcnMu
anMvaXNzdWVzLzYzNAotCi12YXIgRE9UX0xPT0tVUF9SRUdFWCA9IC9oZWxwZXJzXC4oLio/KVwp
LywKLSAgICBCUkFDS0VUX1NUUklOR19MT09LVVBfUkVHRVggPSAvaGVscGVyc1xbJyguKj8pJy8s
Ci0gICAgSU5WT0NBVElPTl9TUExJVFRJTkdfUkVHRVggPSAvKC4qYmxvY2tIZWxwZXJNaXNzaW5n
XC5jYWxsXCguKikoc3RhY2tbMC05XSspKCwuKikvOwotCi1FbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlci5zdHJpbmdpZnlMYXN0QmxvY2tIZWxwZXJNaXNzaW5nSW52b2NhdGlvbiA9
IGZ1bmN0aW9uKHNvdXJjZSkgewotICB2YXIgaGVscGVySW52b2NhdGlvbiA9IHNvdXJjZVtzb3Vy
Y2UubGVuZ3RoIC0gMV0sCi0gICAgICBoZWxwZXJOYW1lID0gKERPVF9MT09LVVBfUkVHRVguZXhl
YyhoZWxwZXJJbnZvY2F0aW9uKSB8fCBCUkFDS0VUX1NUUklOR19MT09LVVBfUkVHRVguZXhlYyho
ZWxwZXJJbnZvY2F0aW9uKSlbMV0sCi0gICAgICBtYXRjaGVzID0gSU5WT0NBVElPTl9TUExJVFRJ
TkdfUkVHRVguZXhlYyhoZWxwZXJJbnZvY2F0aW9uKTsKLQotICBzb3VyY2Vbc291cmNlLmxlbmd0
aCAtIDFdID0gbWF0Y2hlc1sxXSArICInIiArIGhlbHBlck5hbWUgKyAiJyIgKyBtYXRjaGVzWzNd
OwotfQotdmFyIHN0cmluZ2lmeUJsb2NrSGVscGVyTWlzc2luZyA9IEVtYmVyLkhhbmRsZWJhcnMu
SmF2YVNjcmlwdENvbXBpbGVyLnN0cmluZ2lmeUxhc3RCbG9ja0hlbHBlck1pc3NpbmdJbnZvY2F0
aW9uOwotCi12YXIgb3JpZ2luYWxCbG9ja1ZhbHVlID0gRW1iZXIuSGFuZGxlYmFycy5KYXZhU2Ny
aXB0Q29tcGlsZXIucHJvdG90eXBlLmJsb2NrVmFsdWU7Ci1FbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlci5wcm90b3R5cGUuYmxvY2tWYWx1ZSA9IGZ1bmN0aW9uKCkgewotICBvcmln
aW5hbEJsb2NrVmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgc3RyaW5naWZ5QmxvY2tI
ZWxwZXJNaXNzaW5nKHRoaXMuc291cmNlKTsKLX07Ci0KLXZhciBvcmlnaW5hbEFtYmlndW91c0Js
b2NrVmFsdWUgPSBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUu
YW1iaWd1b3VzQmxvY2tWYWx1ZTsKLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVy
LnByb3RvdHlwZS5hbWJpZ3VvdXNCbG9ja1ZhbHVlID0gZnVuY3Rpb24oKSB7Ci0gIG9yaWdpbmFs
QW1iaWd1b3VzQmxvY2tWYWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICBzdHJpbmdpZnlC
bG9ja0hlbHBlck1pc3NpbmcodGhpcy5zb3VyY2UpOwotfTsKLQotdmFyIHByZWZpeCA9ICJlbWJl
ciIgKyAoK25ldyBEYXRlKCkpLCBpbmNyID0gMTsKLQotLyoqCi0gIFJld3JpdGUgc2ltcGxlIG11
c3RhY2hlcyBmcm9tIGB7e2Zvb319YCB0byBge3tiaW5kICJmb28ifX1gLiBUaGlzIG1lYW5zIHRo
YXQKLSAgYWxsIHNpbXBsZSBtdXN0YWNoZXMgaW4gRW1iZXIncyBIYW5kbGViYXJzIHdpbGwgYWxz
byBzZXQgdXAgYW4gb2JzZXJ2ZXIgdG8KLSAga2VlcCB0aGUgRE9NIHVwIHRvIGRhdGUgd2hlbiB0
aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qg
bXVzdGFjaGUKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyCi0gIEBwYXJhbSBtdXN0
YWNoZQotKi8KLUVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlLm11c3RhY2hlID0g
ZnVuY3Rpb24obXVzdGFjaGUpIHsKLSAgaWYgKG11c3RhY2hlLmlzSGVscGVyICYmIG11c3RhY2hl
LmlkLnN0cmluZyA9PT0gJ2NvbnRyb2wnKSB7Ci0gICAgbXVzdGFjaGUuaGFzaCA9IG11c3RhY2hl
Lmhhc2ggfHwgbmV3IEhhbmRsZWJhcnMuQVNULkhhc2hOb2RlKFtdKTsKLSAgICBtdXN0YWNoZS5o
YXNoLnBhaXJzLnB1c2goWyJjb250cm9sSUQiLCBuZXcgSGFuZGxlYmFycy5BU1QuU3RyaW5nTm9k
ZShwcmVmaXggKyBpbmNyKyspXSk7Ci0gIH0gZWxzZSBpZiAobXVzdGFjaGUucGFyYW1zLmxlbmd0
aCB8fCBtdXN0YWNoZS5oYXNoKSB7Ci0gICAgLy8gbm8gY2hhbmdlcyByZXF1aXJlZAotICB9IGVs
c2UgewotICAgIHZhciBpZCA9IG5ldyBIYW5kbGViYXJzLkFTVC5JZE5vZGUoW3sgcGFydDogJ190
cmlhZ2VNdXN0YWNoZScgfV0pOwotCi0gICAgLy8gVXBkYXRlIHRoZSBtdXN0YWNoZSBub2RlIHRv
IGluY2x1ZGUgYSBoYXNoIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3JpZ2luYWwgbm9k
ZQotICAgIC8vIHdhcyBlc2NhcGVkLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gcHJvcGVybHkgZXNj
YXBlIHZhbHVlcyB3aGVuIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0gICAgLy8gY2hhbmdlcyBhbmQg
d2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIHZhbHVlLgotICAgIGlmICghbXVzdGFjaGUuZXNjYXBl
ZCkgewotICAgICAgbXVzdGFjaGUuaGFzaCA9IG11c3RhY2hlLmhhc2ggfHwgbmV3IEhhbmRsZWJh
cnMuQVNULkhhc2hOb2RlKFtdKTsKLSAgICAgIG11c3RhY2hlLmhhc2gucGFpcnMucHVzaChbInVu
ZXNjYXBlZCIsIG5ldyBIYW5kbGViYXJzLkFTVC5TdHJpbmdOb2RlKCJ0cnVlIildKTsKLSAgICB9
Ci0gICAgbXVzdGFjaGUgPSBuZXcgSGFuZGxlYmFycy5BU1QuTXVzdGFjaGVOb2RlKFtpZF0uY29u
Y2F0KFttdXN0YWNoZS5pZF0pLCBtdXN0YWNoZS5oYXNoLCAhbXVzdGFjaGUuZXNjYXBlZCk7Ci0g
IH0KLQotICByZXR1cm4gSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUubXVzdGFjaGUuY2Fs
bCh0aGlzLCBtdXN0YWNoZSk7Ci19OwotCi0vKioKLSAgVXNlZCBmb3IgcHJlY29tcGlsYXRpb24g
b2YgRW1iZXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMuIFRoaXMgd2lsbCBub3QgYmUgdXNlZAotICBk
dXJpbmcgbm9ybWFsIGFwcCBleGVjdXRpb24uCi0KLSAgQG1ldGhvZCBwcmVjb21waWxlCi0gIEBm
b3IgRW1iZXIuSGFuZGxlYmFycwotICBAc3RhdGljCi0gIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcg
VGhlIHRlbXBsYXRlIHRvIHByZWNvbXBpbGUKLSovCi1FbWJlci5IYW5kbGViYXJzLnByZWNvbXBp
bGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKLSAgdmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3Ry
aW5nKTsKLQotICB2YXIgb3B0aW9ucyA9IHsKLSAgICBrbm93bkhlbHBlcnM6IHsKLSAgICAgIGFj
dGlvbjogdHJ1ZSwKLSAgICAgIHVuYm91bmQ6IHRydWUsCi0gICAgICAnYmluZC1hdHRyJzogdHJ1
ZSwKLSAgICAgIHRlbXBsYXRlOiB0cnVlLAotICAgICAgdmlldzogdHJ1ZSwKLSAgICAgIF90cmlh
Z2VNdXN0YWNoZTogdHJ1ZQotICAgIH0sCi0gICAgZGF0YTogdHJ1ZSwKLSAgICBzdHJpbmdQYXJh
bXM6IHRydWUKLSAgfTsKLQotICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIuSGFuZGxlYmFy
cy5Db21waWxlcigpLmNvbXBpbGUoYXN0LCBvcHRpb25zKTsKLSAgcmV0dXJuIG5ldyBFbWJlci5I
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlv
bnMsIHVuZGVmaW5lZCwgdHJ1ZSk7Ci19OwotCi0vLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgZm9y
IEhhbmRsZWJhcnMgcnVudGltZS1vbmx5Ci1pZiAoSGFuZGxlYmFycy5jb21waWxlKSB7Ci0gIC8q
KgotICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgRW1iZXIgSGFuZGxlYmFycy4gVGhpcyByZXBsYWNl
cyB0aGUgZGVmYXVsdAotICAgIGBIYW5kbGViYXJzLmNvbXBpbGVgIGFuZCB0dXJucyBvbiB0ZW1w
bGF0ZS1sb2NhbCBkYXRhIGFuZCBTdHJpbmcKLSAgICBwYXJhbWV0ZXJzLgotCi0gICAgQG1ldGhv
ZCBjb21waWxlCi0gICAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gICAgQHN0YXRpYwotICAgIEBw
YXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBsYXRlIHRvIGNvbXBpbGUKLSAgICBAcmV0dXJu
IHtGdW5jdGlvbn0KLSAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5jb21waWxlID0gZnVuY3Rpb24o
c3RyaW5nKSB7Ci0gICAgdmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKLSAgICB2
YXIgb3B0aW9ucyA9IHsgZGF0YTogdHJ1ZSwgc3RyaW5nUGFyYW1zOiB0cnVlIH07Ci0gICAgdmFy
IGVudmlyb25tZW50ID0gbmV3IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFz
dCwgb3B0aW9ucyk7Ci0gICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5ldyBFbWJlci5IYW5kbGViYXJz
LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVm
aW5lZCwgdHJ1ZSk7Ci0KLSAgICB2YXIgdGVtcGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLnRlbXBs
YXRlKHRlbXBsYXRlU3BlYyk7Ci0gICAgdGVtcGxhdGUuaXNNZXRob2QgPSBmYWxzZTsgLy9NYWtl
IHN1cmUgd2UgZG9uJ3Qgd3JhcCB0ZW1wbGF0ZXMgd2l0aCAuX3N1cGVyCi0KLSAgICByZXR1cm4g
dGVtcGxhdGU7Ci0gIH07Ci19Ci0KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotdmFyIHNsaWNl
ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAotICAgIG9yaWdpbmFsVGVtcGxhdGUgPSBFbWJlci5I
YW5kbGViYXJzLnRlbXBsYXRlOwotCi0vKioKLSAgSWYgYSBwYXRoIHN0YXJ0cyB3aXRoIGEgcmVz
ZXJ2ZWQga2V5d29yZCwgcmV0dXJucyB0aGUgcm9vdAotICB0aGF0IHNob3VsZCBiZSB1c2VkLgot
Ci0gIEBwcml2YXRlCi0gIEBtZXRob2Qgbm9ybWFsaXplUGF0aAotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSByb290IHtPYmplY3R9Ci0gIEBwYXJhbSBwYXRoIHtTdHJpbmd9Ci0gIEBwYXJhbSBkYXRh
IHtIYXNofQotKi8KLXZhciBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxp
emVQYXRoID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwgZGF0YSkgewotICB2YXIga2V5d29yZHMgPSAo
ZGF0YSAmJiBkYXRhLmtleXdvcmRzKSB8fCB7fSwKLSAgICAgIGtleXdvcmQsIGlzS2V5d29yZDsK
LQotICAvLyBHZXQgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGguIEZvciBleGFtcGxlLCBp
ZiB0aGUKLSAgLy8gcGF0aCBpcyAiZm9vLmJhci5iYXoiLCByZXR1cm5zICJmb28iLgotICBrZXl3
b3JkID0gcGF0aC5zcGxpdCgnLicsIDEpWzBdOwotCi0gIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBm
aXJzdCBwYXRoIGlzIGEga2V5d29yZCB0aGF0IGhhcyBiZWVuCi0gIC8vIHBhc3NlZCBhbG9uZyBp
biB0aGUgdmlldydzIGRhdGEgaGFzaC4gSWYgc28sIHdlIHdpbGwgdHJlYXQKLSAgLy8gdGhhdCBv
YmplY3QgYXMgdGhlIG5ldyByb290LgotICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5
d29yZCkpIHsKLSAgICAvLyBMb29rIHVwIHRoZSB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUncyBkYXRh
IGhhc2guCi0gICAgcm9vdCA9IGtleXdvcmRzW2tleXdvcmRdOwotICAgIGlzS2V5d29yZCA9IHRy
dWU7Ci0KLSAgICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGVudGlyZSBwYXRoIGlzIHRoZSBy
ZXNlcnZlZAotICAgIC8vIHdvcmQuIEluIHRoYXQgY2FzZSwgcmV0dXJuIHRoZSBvYmplY3QgaXRz
ZWxmLgotICAgIGlmIChwYXRoID09PSBrZXl3b3JkKSB7Ci0gICAgICBwYXRoID0gJyc7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIC8vIFN0cmlwIHRoZSBrZXl3b3JkIGZyb20gdGhlIHBhdGggYW5kIGxv
b2sgdXAKLSAgICAgIC8vIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbmV3bHkgZm91bmQgcm9vdC4K
LSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihrZXl3b3JkLmxlbmd0aCsxKTsKLSAgICB9Ci0gIH0K
LQotICByZXR1cm4geyByb290OiByb290LCBwYXRoOiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29y
ZCB9OwotfTsKLQotCi0vKioKLSAgTG9va3VwIGJvdGggb24gcm9vdCBhbmQgb24gd2luZG93LiBJ
ZiB0aGUgcGF0aCBzdGFydHMgd2l0aAotICBhIGtleXdvcmQsIHRoZSBjb3JyZXNwb25kaW5nIG9i
amVjdCB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUKLSAgdGVtcGxhdGUncyBkYXRhIGhhc2ggYW5k
IHVzZWQgdG8gcmVzb2x2ZSB0aGUgcGF0aC4KLQotICBAbWV0aG9kIGdldAotICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMKLSAgQHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBsb29rIHVw
IHRoZSBwcm9wZXJ0eSBvbgotICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBiZSBs
b29rZWR1cAotICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgdGVtcGxhdGUncyBvcHRpb24g
aGFzaAotKi8KLXZhciBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQgPSBmdW5j
dGlvbihyb290LCBwYXRoLCBvcHRpb25zKSB7Ci0gIHZhciBkYXRhID0gb3B0aW9ucyAmJiBvcHRp
b25zLmRhdGEsCi0gICAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGgocm9vdCwgcGF0
aCwgZGF0YSksCi0gICAgICB2YWx1ZTsKLQotICAKLSAgICByb290ID0gbm9ybWFsaXplZFBhdGgu
cm9vdDsKLSAgICBwYXRoID0gbm9ybWFsaXplZFBhdGgucGF0aDsKLQotICAgIHZhbHVlID0gRW1i
ZXIuZ2V0KHJvb3QsIHBhdGgpOwotCi0gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcm9v
dCAhPT0gRW1iZXIubG9va3VwICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAgICAg
dmFsdWUgPSBFbWJlci5nZXQoRW1iZXIubG9va3VwLCBwYXRoKTsKLSAgICB9Ci0gIAotCi0gIHJl
dHVybiB2YWx1ZTsKLX07Ci0KLUVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZVBhcmFtcyA9IGZ1bmN0
aW9uKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucykgewotICB2YXIgcmVzb2x2ZWRQYXJhbXMgPSBb
XSwgdHlwZXMgPSBvcHRpb25zLnR5cGVzLCBwYXJhbSwgdHlwZTsKLQotICBmb3IgKHZhciBpPTAs
IGw9cGFyYW1zLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBwYXJhbSA9IHBhcmFtc1tpXTsKLSAg
ICB0eXBlID0gdHlwZXNbaV07Ci0KLSAgICBpZiAodHlwZSA9PT0gJ0lEJykgewotICAgICAgcmVz
b2x2ZWRQYXJhbXMucHVzaChoYW5kbGViYXJzR2V0KGNvbnRleHQsIHBhcmFtLCBvcHRpb25zKSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc29sdmVkUGFyYW1zLnB1c2gocGFyYW0pOwotICAgIH0K
LSAgfQotCi0gIHJldHVybiByZXNvbHZlZFBhcmFtczsKLX07Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
cmVzb2x2ZUhhc2ggPSBmdW5jdGlvbihjb250ZXh0LCBoYXNoLCBvcHRpb25zKSB7Ci0gIHZhciBy
ZXNvbHZlZEhhc2ggPSB7fSwgdHlwZXMgPSBvcHRpb25zLmhhc2hUeXBlcywgdHlwZTsKLQotICBm
b3IgKHZhciBrZXkgaW4gaGFzaCkgewotICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShrZXkp
KSB7IGNvbnRpbnVlOyB9Ci0KLSAgICB0eXBlID0gdHlwZXNba2V5XTsKLQotICAgIGlmICh0eXBl
ID09PSAnSUQnKSB7Ci0gICAgICByZXNvbHZlZEhhc2hba2V5XSA9IGhhbmRsZWJhcnNHZXQoY29u
dGV4dCwgaGFzaFtrZXldLCBvcHRpb25zKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzb2x2ZWRI
YXNoW2tleV0gPSBoYXNoW2tleV07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc29sdmVkSGFz
aDsKLX07Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBoZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdp
bGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdpdGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJl
IGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgK
LSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0KLSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9u
IHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJh
Y2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAg
QG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0g
IEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihwYXRo
KSB7Ci0gIHZhciBlcnJvciwgdmlldyA9ICIiOwotCi0gIHZhciBvcHRpb25zID0gYXJndW1lbnRz
W2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKLQotICB2YXIgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFy
cy5yZXNvbHZlSGVscGVyKG9wdGlvbnMuZGF0YS52aWV3LmNvbnRhaW5lciwgcGF0aCk7Ci0KLSAg
aWYgKGhlbHBlcikgewotICAgIHJldHVybiBoZWxwZXIuYXBwbHkodGhpcywgc2xpY2UuY2FsbChh
cmd1bWVudHMsIDEpKTsKLSAgfQotCi0gIGVycm9yID0gIiVAIEhhbmRsZWJhcnMgZXJyb3I6IENv
dWxkIG5vdCBmaW5kIHByb3BlcnR5ICclQCcgb24gb2JqZWN0ICVALiI7Ci0gIGlmIChvcHRpb25z
LmRhdGEpIHsKLSAgICB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7Ci0gIH0KLSAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKEVtYmVyLlN0cmluZy5mbXQoZXJyb3IsIFt2aWV3LCBwYXRoLCB0aGlzXSkp
OwotfSk7Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBoZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdp
bGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdpdGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJl
IGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgK
LSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0KLSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9u
IHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJh
Y2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAg
QG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0g
IEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9u
KHBhdGgpIHsKLQotICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0g
MV07Ci0KLSAgRW1iZXIuYXNzZXJ0KCJgYmxvY2tIZWxwZXJNaXNzaW5nYCB3YXMgaW52b2tlZCB3
aXRob3V0IGEgaGVscGVyIG5hbWUsIHdoaWNoICIgKwotICAgICAgICAgICAgICAgImlzIG1vc3Qg
bGlrZWx5IGR1ZSB0byBhIG1pc21hdGNoIGJldHdlZW4gdGhlIHZlcnNpb24gb2YgIiArCi0gICAg
ICAgICAgICAgICAiRW1iZXIuanMgeW91J3JlIHJ1bm5pbmcgbm93IGFuZCB0aGUgb25lIHVzZWQg
dG8gcHJlY29tcGlsZSB5b3VyICIgKwotICAgICAgICAgICAgICAgInRlbXBsYXRlcy4gUGxlYXNl
IG1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBvZiAiICsKLSAgICAgICAgICAgICAgICJgZW1iZXItaGFu
ZGxlYmFycy1jb21waWxlcmAgeW91J3JlIHVzaW5nIGlzIHVwIHRvIGRhdGUuIiwgcGF0aCk7Ci0K
LSAgdmFyIGhlbHBlciA9IEVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhlbHBlcihvcHRpb25zLmRh
dGEudmlldy5jb250YWluZXIsIHBhdGgpOwotCi0gIGlmIChoZWxwZXIpIHsKLSAgICByZXR1cm4g
aGVscGVyLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gIH0gZWxzZSB7
Ci0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy5oZWxwZXJNaXNzaW5nLmNhbGwodGhpcywg
cGF0aCk7Ci0gIH0KLQotICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLmJsb2NrSGVscGVyTWlz
c2luZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotfSk7Ci0KLS8qKgotICBSZWdpc3RlciBhIGJv
dW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBoZWxwZXJzIGJlaGF2ZSBzaW1pbGFybHkgdG8g
cmVndWxhcgotICBoYW5kbGViYXJzIGhlbHBlcnMsIHdpdGggdGhlIGFkZGVkIGFiaWxpdHkgdG8g
cmUtcmVuZGVyIHdoZW4gdGhlIHVuZGVybHlpbmcgZGF0YQotICBjaGFuZ2VzLgotCi0gICMjIFNp
bXBsZSBleGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lz
dGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemUnLCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVy
biB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotICB9KTsKLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGJvdW5k
IGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6Ci0KLSAg
YGBgaGFuZGxlYmFycwotICB7e2NhcGl0YWxpemUgbmFtZX19Ci0gIGBgYAotCi0gIEluIHRoaXMg
Y2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQg
Y2hhbmdlcywKLSAgdGhlIHJlbmRlcmVkIHZhbHVlIG9mIHRoZSBoZWxwZXIgd2lsbCB1cGRhdGUg
dG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KLQotICAjIyBFeGFtcGxlIHdpdGggb3B0aW9ucwotCi0g
IExpa2Ugbm9ybWFsIGhhbmRsZWJhcnMgaGVscGVycywgYm91bmQgaGVscGVycyBoYXZlIGFjY2Vz
cyB0byB0aGUgb3B0aW9ucwotICBwYXNzZWQgaW50byB0aGUgaGVscGVyIGNhbGwuCi0KLSAgYGBg
amF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ3JlcGVh
dCcsIGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7Ci0gICAgdmFyIGNvdW50ID0gb3B0aW9ucy5o
YXNoLmNvdW50OwotICAgIHZhciBhID0gW107Ci0gICAgd2hpbGUoYS5sZW5ndGggPCBjb3VudCkg
ewotICAgICAgICBhLnB1c2godmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gYS5qb2luKCcnKTsK
LSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgaGVscGVyIGNvdWxkIGJlIHVzZWQgaW4gYSB0ZW1wbGF0
ZSBhcyBmb2xsb3dzOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudD0z
fX0KLSAgYGBgCi0KLSAgIyMgRXhhbXBsZSB3aXRoIGJvdW5kIG9wdGlvbnMKLQotICBCb3VuZCBo
YXNoIG9wdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkLiBFeGFtcGxlOgotCi0gIGBgYGhhbmRsZWJh
cnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudEJpbmRpbmc9Im51bVJlcGVhdHMifX0KLSAgYGBgCi0K
LSAgSW4gdGhpcyBleGFtcGxlLCBjb3VudCB3aWxsIGJlIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZgot
ICB0aGUgYG51bVJlcGVhdHNgIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0LiBJZiB0aGF0IHByb3Bl
cnR5Ci0gIGNoYW5nZXMsIHRoZSBoZWxwZXIgd2lsbCBiZSByZS1yZW5kZXJlZC4KLQotICAjIyBF
eGFtcGxlIHdpdGggZXh0cmEgZGVwZW5kZW5jaWVzCi0KLSAgVGhlIGBFbWJlci5IYW5kbGViYXJz
LnJlZ2lzdGVyQm91bmRIZWxwZXJgIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIGxlbmd0aAotICB0
aGlyZCBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIGV4dHJhIGRlcGVuZGVuY2llcyBvbiB0aGUg
cGFzc2VkIGluIHZhbHVlLgotICBUaGlzIGFsbG93cyB0aGUgaGFuZGxlYmFycyBoZWxwZXIgdG8g
dXBkYXRlIHdoZW4gdGhlc2UgZGVwZW5kZW5jaWVzIGNoYW5nZS4KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlcignY2FwaXRhbGl6ZU5hbWUn
LCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZS5nZXQoJ25hbWUnKS50b1VwcGVy
Q2FzZSgpOwotICB9LCAnbmFtZScpOwotICBgYGAKLQotICAjIyBFeGFtcGxlIHdpdGggbXVsdGlw
bGUgYm91bmQgcHJvcGVydGllcwotCi0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRI
ZWxwZXJgIHN1cHBvcnRzIGJpbmRpbmcgdG8KLSAgbXVsdGlwbGUgcHJvcGVydGllcywgZS5nLjoK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBl
cignY29uY2F0ZW5hdGUnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgdmFsdWVzID0gQXJyYXkucHJv
dG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0gICAgcmV0dXJuIHZhbHVlcy5q
b2luKCd8fCcpOwotICB9KTsKLSAgYGBgCi0KLSAgV2hpY2ggYWxsb3dzIGZvciB0ZW1wbGF0ZSBz
eW50YXggc3VjaCBhcyBge3tjb25jYXRlbmF0ZSBwcm9wMSBwcm9wMn19YCBvcgotICBge3tjb25j
YXRlbmF0ZSBwcm9wMSBwcm9wMiBwcm9wM319YC4gSWYgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNo
YW5nZSwKLSAgdGhlIGhlbHByIHdpbGwgcmUtcmVuZGVyLiAgTm90ZSB0aGF0IGRlcGVuZGVuY3kg
a2V5cyBjYW5ub3QgYmUKLSAgdXNpbmcgaW4gY29uanVuY3Rpb24gd2l0aCBtdWx0aS1wcm9wZXJ0
eSBoZWxwZXJzLCBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMKLSAgd2hpY2ggcHJvcGVydHkgdGhlIGRl
cGVuZGVudCBrZXlzIHdvdWxkIGJlbG9uZyB0by4KLQotICAjIyBVc2Ugd2l0aCB1bmJvdW5kIGhl
bHBlcgotCi0gIFRoZSBge3t1bmJvdW5kfX1gIGhlbHBlciBjYW4gYmUgdXNlZCB3aXRoIGJvdW5k
IGhlbHBlciBpbnZvY2F0aW9ucwotICB0byByZW5kZXIgdGhlbSBpbiB0aGVpciB1bmJvdW5kIGZv
cm0sIGUuZy4KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dW5ib3VuZCBjYXBpdGFsaXplIG5hbWV9
fQotICBgYGAKLQotICBJbiB0aGlzIGV4YW1wbGUsIGlmIHRoZSBuYW1lIHByb3BlcnR5IGNoYW5n
ZXMsIHRoZSBoZWxwZXIKLSAgd2lsbCBub3QgcmUtcmVuZGVyLgotCi0gICMjIFVzZSB3aXRoIGJs
b2NrcyBub3Qgc3VwcG9ydGVkCi0KLSAgQm91bmQgaGVscGVycyBkbyBub3Qgc3VwcG9ydCB1c2Ug
d2l0aCBIYW5kbGViYXJzIGJsb2NrcyBvcgotICB0aGUgYWRkaXRpb24gb2YgY2hpbGQgdmlld3Mg
b2YgYW55IGtpbmQuCi0KLSAgQG1ldGhvZCByZWdpc3RlckJvdW5kSGVscGVyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge1N0cmluZ30gbmFtZQotICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jdGlvbgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5cyoKLSovCi1FbWJlci5I
YW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIgPSBmdW5jdGlvbihuYW1lLCBmbikgewotICB2
YXIgYm91bmRIZWxwZXJBcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLAotICAgICAgYm91
bmRGbiA9IEVtYmVyLkhhbmRsZWJhcnMubWFrZUJvdW5kSGVscGVyLmFwcGx5KHRoaXMsIGJvdW5k
SGVscGVyQXJncyk7Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIobmFtZSwgYm91
bmRGbik7Ci19OwotCi0vKioKLSAgQSAobW9zdGx5KSBwcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0
byBgcmVnaXN0ZXJCb3VuZEhlbHBlcmAuIFRha2VzIHRoZQotICBwcm92aWRlZCBIYW5kbGViYXJz
IGhlbHBlciBmdW5jdGlvbiBmbiBhbmQgcmV0dXJucyBpdCBpbiB3cmFwcGVkCi0gIGJvdW5kIGhl
bHBlciBmb3JtLgotCi0gIFRoZSBtYWluIHVzZSBjYXNlIGZvciB1c2luZyB0aGlzIG91dHNpZGUg
b2YgYHJlZ2lzdGVyQm91bmRIZWxwZXJgCi0gIGlzIGZvciByZWdpc3RlcmluZyBoZWxwZXJzIG9u
IHRoZSBjb250YWluZXI6Ci0KLSAgYGBganMKLSAgdmFyIGJvdW5kSGVscGVyRm4gPSBFbWJlci5I
YW5kbGViYXJzLm1ha2VCb3VuZEhlbHBlcihmdW5jdGlvbih3b3JkKSB7Ci0gICAgcmV0dXJuIHdv
cmQudG9VcHBlckNhc2UoKTsKLSAgfSk7Ci0KLSAgY29udGFpbmVyLnJlZ2lzdGVyKCdoZWxwZXI6
bXktYm91bmQtaGVscGVyJywgYm91bmRIZWxwZXJGbik7Ci0gIGBgYAotCi0gIEluIHRoZSBhYm92
ZSBleGFtcGxlLCBpZiB0aGUgaGVscGVyIGZ1bmN0aW9uIGhhZG4ndCBiZWVuIHdyYXBwZWQgaW4K
LSAgYG1ha2VCb3VuZEhlbHBlcmAsIHRoZSByZWdpc3RlcmVkIGhlbHBlciB3b3VsZCBiZSB1bmJv
dW5kLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgbWFrZUJvdW5kSGVscGVyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdGlvbgotICBAcGFyYW0ge1N0
cmluZ30gZGVwZW5kZW50S2V5cyoKLSovCi1FbWJlci5IYW5kbGViYXJzLm1ha2VCb3VuZEhlbHBl
ciA9IGZ1bmN0aW9uKGZuKSB7Ci0gIHZhciBkZXBlbmRlbnRLZXlzID0gc2xpY2UuY2FsbChhcmd1
bWVudHMsIDEpOwotCi0gIGZ1bmN0aW9uIGhlbHBlcigpIHsKLSAgICB2YXIgcHJvcGVydGllcyA9
IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSksCi0gICAgICBudW1Qcm9wZXJ0aWVzID0gcHJv
cGVydGllcy5sZW5ndGgsCi0gICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5n
dGggLSAxXSwKLSAgICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzID0gW10sCi0gICAgICBkYXRhID0g
b3B0aW9ucy5kYXRhLAotICAgICAgdHlwZXMgPSBkYXRhLmlzVW5ib3VuZCA/IHNsaWNlLmNhbGwo
b3B0aW9ucy50eXBlcywgMSkgOiBvcHRpb25zLnR5cGVzLAotICAgICAgaGFzaCA9IG9wdGlvbnMu
aGFzaCwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBjb250ZXh0cyA9IG9wdGlvbnMu
Y29udGV4dHMsCi0gICAgICBjdXJyZW50Q29udGV4dCA9IChjb250ZXh0cyAmJiBjb250ZXh0cy5s
ZW5ndGgpID8gY29udGV4dHNbMF0gOiB0aGlzLAotICAgICAgcHJlZml4UGF0aEZvckRlcGVuZGVu
dEtleXMgPSAnJywKLSAgICAgIGxvYywgbGVuLCBoYXNoT3B0aW9uLAotICAgICAgYm91bmRPcHRp
b24sIHByb3BlcnR5LAotICAgICAgbm9ybWFsaXplZFZhbHVlID0gRW1iZXIuX1NpbXBsZUhhbmRs
ZWJhcnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVkVmFsdWU7Ci0KLSAgICBFbWJlci5hc3NlcnQo
InJlZ2lzdGVyQm91bmRIZWxwZXItZ2VuZXJhdGVkIGhlbHBlcnMgZG8gbm90IHN1cHBvcnQgdXNl
IHdpdGggSGFuZGxlYmFycyBibG9ja3MuIiwgIW9wdGlvbnMuZm4pOwotCi0gICAgLy8gRGV0ZWN0
IGJvdW5kIG9wdGlvbnMgKGUuZy4gY291bnRCaW5kaW5nPSJvdGhlckNvdW50IikKLSAgICB2YXIg
Ym91bmRPcHRpb25zID0gaGFzaC5ib3VuZE9wdGlvbnMgPSB7fTsKLSAgICBmb3IgKGhhc2hPcHRp
b24gaW4gaGFzaCkgewotICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChoYXNoT3B0aW9u
KSkgewotICAgICAgICAvLyBMb3Agb2ZmICdCaW5kaW5nJyBzdWZmaXguCi0gICAgICAgIGJvdW5k
T3B0aW9uc1toYXNoT3B0aW9uLnNsaWNlKDAsIC03KV0gPSBoYXNoW2hhc2hPcHRpb25dOwotICAg
ICAgfQotICAgIH0KLQotICAgIC8vIEV4cG9zZSBwcm9wZXJ0eSBuYW1lcyBvbiBkYXRhLnByb3Bl
cnRpZXMgb2JqZWN0LgotICAgIHZhciB3YXRjaGVkUHJvcGVydGllcyA9IFtdOwotICAgIGRhdGEu
cHJvcGVydGllcyA9IFtdOwotICAgIGZvciAobG9jID0gMDsgbG9jIDwgbnVtUHJvcGVydGllczsg
Kytsb2MpIHsKLSAgICAgIGRhdGEucHJvcGVydGllcy5wdXNoKHByb3BlcnRpZXNbbG9jXSk7Ci0g
ICAgICBpZiAodHlwZXNbbG9jXSA9PT0gJ0lEJykgewotICAgICAgICB2YXIgbm9ybWFsaXplZFBy
b3AgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0aWVzW2xvY10sIGRhdGEp
OwotICAgICAgICBub3JtYWxpemVkUHJvcGVydGllcy5wdXNoKG5vcm1hbGl6ZWRQcm9wKTsKLSAg
ICAgICAgd2F0Y2hlZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVkUHJvcCk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICBpZihkYXRhLmlzVW5ib3VuZCkgewotICAgICAgICAgIG5vcm1hbGl6ZWRQ
cm9wZXJ0aWVzLnB1c2goe3BhdGg6IHByb3BlcnRpZXNbbG9jXX0pOwotICAgICAgICB9ZWxzZSB7
Ci0gICAgICAgICAgbm9ybWFsaXplZFByb3BlcnRpZXMucHVzaChudWxsKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gaGVscGVyIGludm9jYXRp
b24gaXMgcHJlY2VkZWQgYnkgYHVuYm91bmRgLCBlLmcuCi0gICAgLy8ge3t1bmJvdW5kIG15SGVs
cGVyIGZvb319Ci0gICAgaWYgKGRhdGEuaXNVbmJvdW5kKSB7Ci0gICAgICByZXR1cm4gZXZhbHVh
dGVVbmJvdW5kSGVscGVyKHRoaXMsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucyk7
Ci0gICAgfQotCi0gICAgdmFyIGJpbmRWaWV3ID0gbmV3IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJz
VmlldyhudWxsLCBudWxsLCAhb3B0aW9ucy5oYXNoLnVuZXNjYXBlZCwgb3B0aW9ucy5kYXRhKTsK
LQotICAgIC8vIE92ZXJyaWRlIFNpbXBsZUhhbmRsZWJhcnNWaWV3J3MgbWV0aG9kIGZvciBnZW5l
cmF0aW5nIHRoZSB2aWV3J3MgY29udGVudC4KLSAgICBiaW5kVmlldy5ub3JtYWxpemVkVmFsdWUg
PSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBhcmdzID0gW10sIGJvdW5kT3B0aW9uOwotCi0gICAg
ICAvLyBDb3B5IG92ZXIgYm91bmQgaGFzaCBvcHRpb25zLgotICAgICAgZm9yIChib3VuZE9wdGlv
biBpbiBib3VuZE9wdGlvbnMpIHsKLSAgICAgICAgaWYgKCFib3VuZE9wdGlvbnMuaGFzT3duUHJv
cGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgIHByb3BlcnR5ID0gbm9y
bWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgZGF0
YSk7Ci0gICAgICAgIGJpbmRWaWV3LnBhdGggPSBwcm9wZXJ0eS5wYXRoOwotICAgICAgICBiaW5k
Vmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7Ci0gICAgICAgIGhhc2hbYm91bmRPcHRpb25d
ID0gbm9ybWFsaXplZFZhbHVlLmNhbGwoYmluZFZpZXcpOwotICAgICAgfQotCi0gICAgICBmb3Ig
KGxvYyA9IDA7IGxvYyA8IG51bVByb3BlcnRpZXM7ICsrbG9jKSB7Ci0gICAgICAgIHByb3BlcnR5
ID0gbm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsKLSAgICAgICAgaWYgKHByb3BlcnR5KSB7Ci0g
ICAgICAgICAgYmluZFZpZXcucGF0aCA9IHByb3BlcnR5LnBhdGg7Ci0gICAgICAgICAgYmluZFZp
ZXcucGF0aFJvb3QgPSBwcm9wZXJ0eS5yb290OwotICAgICAgICAgIGFyZ3MucHVzaChub3JtYWxp
emVkVmFsdWUuY2FsbChiaW5kVmlldykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFy
Z3MucHVzaChwcm9wZXJ0aWVzW2xvY10pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhcmdz
LnB1c2gob3B0aW9ucyk7Ci0KLSAgICAgIC8vIFJ1biB0aGUgc3VwcGxpZWQgaGVscGVyIGZ1bmN0
aW9uLgotICAgICAgcmV0dXJuIGZuLmFwcGx5KGN1cnJlbnRDb250ZXh0LCBhcmdzKTsKLSAgICB9
OwotCi0gICAgdmlldy5hcHBlbmRDaGlsZChiaW5kVmlldyk7Ci0KLSAgICAvLyBBc3NlbWJsZSBs
aXN0IG9mIHdhdGNoZWQgcHJvcGVydGllcyB0aGF0J2xsIHJlLXJlbmRlciB0aGlzIGhlbHBlci4K
LSAgICBmb3IgKGJvdW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAgICAgaWYgKGJvdW5k
T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShib3VuZE9wdGlvbikpIHsKLSAgICAgICAgd2F0Y2hlZFBy
b3BlcnRpZXMucHVzaChub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBib3VuZE9wdGlvbnNb
Ym91bmRPcHRpb25dLCBkYXRhKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2JzZXJ2ZSBl
YWNoIHByb3BlcnR5LgotICAgIGZvciAobG9jID0gMCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMu
bGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7Ci0gICAgICBwcm9wZXJ0eSA9IHdhdGNoZWRQcm9w
ZXJ0aWVzW2xvY107Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocHJvcGVydHkucm9vdCwg
cHJvcGVydHkucGF0aCwgYmluZFZpZXcsIGJpbmRWaWV3LnJlcmVuZGVyKTsKLSAgICB9Ci0KLSAg
ICBpZiAodHlwZXNbMF0gIT09ICdJRCcgfHwgbm9ybWFsaXplZFByb3BlcnRpZXMubGVuZ3RoID09
PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQWRkIGRlcGVuZGVudCBrZXkg
b2JzZXJ2ZXJzIHRvIHRoZSBmaXJzdCBwYXJhbQotICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFs
aXplZFByb3BlcnRpZXNbMF0sCi0gICAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290LAot
ICAgICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoOwotCi0gICAgaWYoIUVtYmVyLmlzRW1wdHko
cGF0aCkpIHsKLSAgICAgIHByZWZpeFBhdGhGb3JEZXBlbmRlbnRLZXlzID0gcGF0aCArICcuJzsK
LSAgICB9Ci0gICAgZm9yICh2YXIgaT0wLCBsPWRlcGVuZGVudEtleXMubGVuZ3RoOyBpPGw7IGkr
KykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKHBhdGhSb290LCBwcmVmaXhQYXRoRm9y
RGVwZW5kZW50S2V5cyArIGRlcGVuZGVudEtleXNbaV0sIGJpbmRWaWV3LCBiaW5kVmlldy5yZXJl
bmRlcik7Ci0gICAgfQotICB9Ci0KLSAgaGVscGVyLl9yYXdGdW5jdGlvbiA9IGZuOwotICByZXR1
cm4gaGVscGVyOwotfTsKLQotLyoqCi0gIFJlbmRlcnMgdGhlIHVuYm91bmQgZm9ybSBvZiBhbiBv
dGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9uLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qg
ZXZhbHVhdGVVbmJvdW5kSGVscGVyCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gIEBwYXJhbSB7
T2JqZWN0fSBjb250ZXh0Ci0gIEBwYXJhbSB7QXJyYXl9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzCi0g
IEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zCi0qLwotZnVuY3Rpb24gZXZhbHVhdGVVbmJvdW5kSGVs
cGVyKGNvbnRleHQsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucykgewotICB2YXIg
YXJncyA9IFtdLAotICAgaGFzaCA9IG9wdGlvbnMuaGFzaCwKLSAgIGJvdW5kT3B0aW9ucyA9IGhh
c2guYm91bmRPcHRpb25zLAotICAgdHlwZXMgPSBzbGljZS5jYWxsKG9wdGlvbnMudHlwZXMsIDEp
LAotICAgbG9jLAotICAgbGVuLAotICAgcHJvcGVydHksCi0gICBwcm9wZXJ0eVR5cGUsCi0gICBi
b3VuZE9wdGlvbjsKLQotICBmb3IgKGJvdW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAg
IGlmICghYm91bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5kT3B0aW9uKSkgeyBjb250aW51
ZTsgfQotICAgIGhhc2hbYm91bmRPcHRpb25dID0gRW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4
dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgb3B0aW9ucyk7Ci0gIH0KLQotICBmb3IobG9j
ID0gMCwgbGVuID0gbm9ybWFsaXplZFByb3BlcnRpZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9j
KSB7Ci0gICAgcHJvcGVydHkgPSBub3JtYWxpemVkUHJvcGVydGllc1tsb2NdOwotICAgIHByb3Bl
cnR5VHlwZSA9IHR5cGVzW2xvY107Ci0gICAgaWYocHJvcGVydHlUeXBlID09PSAiSUQiKSB7Ci0g
ICAgICBhcmdzLnB1c2goRW1iZXIuSGFuZGxlYmFycy5nZXQocHJvcGVydHkucm9vdCwgcHJvcGVy
dHkucGF0aCwgb3B0aW9ucykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhcmdzLnB1c2gocHJvcGVy
dHkucGF0aCk7Ci0gICAgfQotICB9Ci0gIGFyZ3MucHVzaChvcHRpb25zKTsKLSAgcmV0dXJuIGZu
LmFwcGx5KGNvbnRleHQsIGFyZ3MpOwotfQotCi0vKioKLSAgT3ZlcnJpZGVzIEhhbmRsZWJhcnMu
dGVtcGxhdGUgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2gKLSAgdXNlci1jcmVhdGVkLCB0b3At
bGV2ZWwgdGVtcGxhdGVzIGZyb20gaW5uZXIgY29udGV4dHMuCi0KLSAgQHByaXZhdGUKLSAgQG1l
dGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKLSAgQHBhcmFtIHtTdHJpbmd9
IHNwZWMKLSovCi1FbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykgewot
ICB2YXIgdCA9IG9yaWdpbmFsVGVtcGxhdGUoc3BlYyk7Ci0gIHQuaXNUb3AgPSB0cnVlOwotICBy
ZXR1cm4gdDsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgTWFyayBh
IHN0cmluZyBhcyBzYWZlIGZvciB1bmVzY2FwZWQgb3V0cHV0IHdpdGggSGFuZGxlYmFycy4gSWYg
eW91Ci0gIHJldHVybiBIVE1MIGZyb20gYSBIYW5kbGViYXJzIGhlbHBlciwgdXNlIHRoaXMgZnVu
Y3Rpb24gdG8KLSAgZW5zdXJlIEhhbmRsZWJhcnMgZG9lcyBub3QgZXNjYXBlIHRoZSBIVE1MLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuU3RyaW5nLmh0bWxTYWZlKCc8ZGl2PnNvbWVTdHJp
bmc8L2Rpdj4nKQotICBgYGAKLQotICBAbWV0aG9kIGh0bWxTYWZlCi0gIEBmb3IgRW1iZXIuU3Ry
aW5nCi0gIEBzdGF0aWMKLSAgQHJldHVybiB7SGFuZGxlYmFycy5TYWZlU3RyaW5nfSBhIHN0cmlu
ZyB0aGF0IHdpbGwgbm90IGJlIGh0bWwgZXNjYXBlZCBieSBIYW5kbGViYXJzCi0qLwotRW1iZXIu
U3RyaW5nLmh0bWxTYWZlID0gZnVuY3Rpb24oc3RyKSB7Ci0gIHJldHVybiBuZXcgSGFuZGxlYmFy
cy5TYWZlU3RyaW5nKHN0cik7Ci19OwotCi12YXIgaHRtbFNhZmUgPSBFbWJlci5TdHJpbmcuaHRt
bFNhZmU7Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpIHsKLQotICAvKioKLSAgICBNYXJrIGEgc3RyaW5nIGFz
IGJlaW5nIHNhZmUgZm9yIHVuZXNjYXBlZCBvdXRwdXQgd2l0aCBIYW5kbGViYXJzLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgICc8ZGl2PnNvbWVTdHJpbmc8L2Rpdj4nLmh0bWxTYWZlKCkKLSAg
ICBgYGAKLQotICAgIFNlZSBbRW1iZXIuU3RyaW5nLmh0bWxTYWZlXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2h0bWxTYWZlKS4KLQotICAgIEBtZXRob2QgaHRtbFNhZmUK
LSAgICBAZm9yIFN0cmluZwotICAgIEByZXR1cm4ge0hhbmRsZWJhcnMuU2FmZVN0cmluZ30gYSBz
dHJpbmcgdGhhdCB3aWxsIG5vdCBiZSBodG1sIGVzY2FwZWQgYnkgSGFuZGxlYmFycwotICAqLwot
ICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGh0
bWxTYWZlKHRoaXMpOwotICB9OwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1i
ZXIuSGFuZGxlYmFycy5yZXNvbHZlUGF0aHMgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHZhciBy
ZXQgPSBbXSwKLSAgICAgIGNvbnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKLSAgICAgIHJvb3Rz
ID0gb3B0aW9ucy5yb290cywKLSAgICAgIGRhdGEgPSBvcHRpb25zLmRhdGE7Ci0KLSAgZm9yICh2
YXIgaT0wLCBsPWNvbnRleHRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICByZXQucHVzaCggRW1i
ZXIuSGFuZGxlYmFycy5nZXQocm9vdHNbaV0sIGNvbnRleHRzW2ldLCB7IGRhdGE6IGRhdGEgfSkg
KTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotLypqc2hpbnQgbmV3Y2FwOmZhbHNlKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgc2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJl
ci5nZXQ7Ci12YXIgTWV0YW1vcnBoID0gcmVxdWlyZU1vZHVsZSgnbWV0YW1vcnBoJyk7Ci0KLWZ1
bmN0aW9uIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCkgewotICBFbWJlci5ydW4ub25jZShFbWJl
ci5WaWV3LCAnbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMnKTsKLX0KLQotLy8gRE9NTWFuYWdlciBz
aG91bGQganVzdCBhYnN0cmFjdCBkb20gbWFuaXB1bGF0aW9uIGJldHdlZW4ganF1ZXJ5IGFuZCBt
ZXRhbW9ycGgKLXZhciBET01NYW5hZ2VyID0gewotICByZW1vdmU6IGZ1bmN0aW9uKHZpZXcpIHsK
LSAgICB2aWV3Lm1vcnBoLnJlbW92ZSgpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7
Ci0gIH0sCi0KLSAgcHJlcGVuZDogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcubW9y
cGgucHJlcGVuZChodG1sKTsKLSAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICB9LAot
Ci0gIGFmdGVyOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7Ci0gICAgdmlldy5tb3JwaC5hZnRlciho
dG1sKTsKLSAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICB9LAotCi0gIGh0bWw6IGZ1
bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3Lm1vcnBoLmh0bWwoaHRtbCk7Ci0gICAgbm90
aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICAvLyBUaGlzIGlzIG1lc3NlZCB1cC4K
LSAgcmVwbGFjZTogZnVuY3Rpb24odmlldykgewotICAgIHZhciBtb3JwaCA9IHZpZXcubW9ycGg7
Ci0KLSAgICB2aWV3LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7Ci0KLSAgICBFbWJlci5ydW4u
c2NoZWR1bGUoJ3JlbmRlcicsIHRoaXMsIGZ1bmN0aW9uIHJlbmRlck1ldGFtb3JwaFZpZXcoKSB7
Ci0gICAgICBpZiAodmlldy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIHZpZXcu
Y2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7Ci0gICAgICB2YXIgYnVmZmVyID0gdmlldy5yZW5kZXJU
b0J1ZmZlcigpOwotCi0gICAgICB2aWV3Lmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcp
IHsKLSAgICAgICAgdmlldy5wcm9wZXJ0eVdpbGxDaGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICAgIH0p
OwotICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Ci0K
LSAgICAgIG1vcnBoLnJlcGxhY2VXaXRoKGJ1ZmZlci5zdHJpbmcoKSk7Ci0gICAgICB2aWV3LnRy
YW5zaXRpb25UbygnaW5ET00nKTsKLQotICAgICAgdmlldy5pbnZva2VSZWN1cnNpdmVseShmdW5j
dGlvbih2aWV3KSB7Ci0gICAgICAgIHZpZXcucHJvcGVydHlEaWRDaGFuZ2UoJ2VsZW1lbnQnKTsK
LSAgICAgIH0pOwotICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ2RpZEluc2VydEVsZW1l
bnQnKTsKLQotICAgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgICB9KTsKLSAgfSwK
LQotICBlbXB0eTogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcubW9ycGguaHRtbCgiIik7Ci0g
ICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfQotfTsKLQotLy8gVGhlIGBtb3JwaGAg
YW5kIGBvdXRlckhUTUxgIHByb3BlcnRpZXMgYXJlIGludGVybmFsIG9ubHkKLS8vIGFuZCBub3Qg
b2JzZXJ2YWJsZS4KLQotLyoqCi0gIEBjbGFzcyBfTWV0YW1vcnBoCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHByaXZhdGUKLSovCi1FbWJlci5fTWV0YW1vcnBoID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKLSAgaXNWaXJ0dWFsOiB0cnVlLAotICB0YWdOYW1lOiAnJywKLQotICBpbnN0cnVtZW50TmFt
ZTogJ21ldGFtb3JwaCcsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIo
KTsKLSAgICB0aGlzLm1vcnBoID0gTWV0YW1vcnBoKCk7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCdT
dXBwbHlpbmcgYSB0YWdOYW1lIHRvIE1ldGFtb3JwaCB2aWV3cyBpcyB1bnJlbGlhYmxlIGFuZCBp
cyBkZXByZWNhdGVkLiBZb3UgbWF5IGJlIHNldHRpbmcgdGhlIHRhZ05hbWUgb24gYSBIYW5kbGVi
YXJzIGhlbHBlciB0aGF0IGNyZWF0ZXMgYSBNZXRhbW9ycGguJywgIXRoaXMudGFnTmFtZSk7Ci0g
IH0sCi0KLSAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICBidWZmZXIucHVz
aCh0aGlzLm1vcnBoLnN0YXJ0VGFnKCkpOwotICAgIGJ1ZmZlci5wdXNoT3BlbmluZ1RhZygpOwot
ICB9LAotCi0gIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICBidWZmZXIucHVz
aENsb3NpbmdUYWcoKTsKLSAgICBidWZmZXIucHVzaCh0aGlzLm1vcnBoLmVuZFRhZygpKTsKLSAg
fSwKLQotICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYnVmZmVyID0gdGhp
cy5yZW5kZXJUb0J1ZmZlcigpOwotICAgIHRoaXMub3V0ZXJIVE1MID0gYnVmZmVyLnN0cmluZygp
OwotICAgIHRoaXMuY2xlYXJCdWZmZXIoKTsKLSAgfSwKLQotICBkb21NYW5hZ2VyOiBET01NYW5h
Z2VyCi19KTsKLQotLyoqCi0gIEBjbGFzcyBfTWV0YW1vcnBoVmlldwotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuX01ldGFtb3JwaAotICBA
cHJpdmF0ZQotKi8KLUVtYmVyLl9NZXRhbW9ycGhWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1i
ZXIuX01ldGFtb3JwaCk7Ci0KLS8qKgotICBAY2xhc3MgX1NpbXBsZU1ldGFtb3JwaFZpZXcKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3JlVmlldwotICBAdXNlcyBFbWJl
ci5fTWV0YW1vcnBoCi0gIEBwcml2YXRlCi0qLwotRW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXcg
PSBFbWJlci5Db3JlVmlldy5leHRlbmQoRW1iZXIuX01ldGFtb3JwaCk7Ci0KLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBIYW5kbGViYXJzICovCi0vKmpzaGludCBuZXdj
YXA6ZmFsc2UqLwotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJh
cnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaGFuZGxlYmFy
c0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0OwotdmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVNb2R1
bGUoJ21ldGFtb3JwaCcpOwotZnVuY3Rpb24gU2ltcGxlSGFuZGxlYmFyc1ZpZXcocGF0aCwgcGF0
aFJvb3QsIGlzRXNjYXBlZCwgdGVtcGxhdGVEYXRhKSB7Ci0gIHRoaXMucGF0aCA9IHBhdGg7Ci0g
IHRoaXMucGF0aFJvb3QgPSBwYXRoUm9vdDsKLSAgdGhpcy5pc0VzY2FwZWQgPSBpc0VzY2FwZWQ7
Ci0gIHRoaXMudGVtcGxhdGVEYXRhID0gdGVtcGxhdGVEYXRhOwotCi0gIHRoaXMubW9ycGggPSBN
ZXRhbW9ycGgoKTsKLSAgdGhpcy5zdGF0ZSA9ICdwcmVSZW5kZXInOwotICB0aGlzLnVwZGF0ZUlk
ID0gbnVsbDsKLSAgdGhpcy5fcGFyZW50VmlldyA9IG51bGw7Ci0gIHRoaXMuYnVmZmVyID0gbnVs
bDsKLX0KLQotRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3ID0gU2ltcGxlSGFuZGxlYmFyc1Zp
ZXc7Ci0KLVNpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZSA9IHsKLSAgaXNWaXJ0dWFsOiB0
cnVlLAotICBpc1ZpZXc6IHRydWUsCi0KLSAgZGVzdHJveTogZnVuY3Rpb24gKCkgewotICAgIGlm
ICh0aGlzLnVwZGF0ZUlkKSB7Ci0gICAgICBFbWJlci5ydW4uY2FuY2VsKHRoaXMudXBkYXRlSWQp
OwotICAgICAgdGhpcy51cGRhdGVJZCA9IG51bGw7Ci0gICAgfQotICAgIGlmICh0aGlzLl9wYXJl
bnRWaWV3KSB7Ci0gICAgICB0aGlzLl9wYXJlbnRWaWV3LnJlbW92ZUNoaWxkKHRoaXMpOwotICAg
IH0KLSAgICB0aGlzLm1vcnBoID0gbnVsbDsKLSAgICB0aGlzLnN0YXRlID0gJ2Rlc3Ryb3llZCc7
Ci0gIH0sCi0KLSAgcHJvcGVydHlXaWxsQ2hhbmdlOiBFbWJlci5LLAotCi0gIHByb3BlcnR5RGlk
Q2hhbmdlOiBFbWJlci5LLAotCi0gIG5vcm1hbGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHBhdGggPSB0aGlzLnBhdGgsCi0gICAgICAgIHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwK
LSAgICAgICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7Ci0KLSAgICAvLyBVc2UgdGhlIHBhdGhSb290
IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcwotICAgIC8vIGhhcHBl
bnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgaW50bwotICAg
IC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRleHQgYW5kIGEg
cGF0aAotICAgIC8vIG9mIGAnJ2AuCi0gICAgaWYgKHBhdGggPT09ICcnKSB7Ci0gICAgICByZXN1
bHQgPSBwYXRoUm9vdDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcGxhdGVEYXRhID0gdGhpcy50
ZW1wbGF0ZURhdGE7Ci0gICAgICByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRo
LCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0Owot
ICB9LAotCi0gIHJlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB2YXIgc3Ry
aW5nID0gJyc7Ci0KLSAgICBzdHJpbmcgKz0gdGhpcy5tb3JwaC5zdGFydFRhZygpOwotICAgIHN0
cmluZyArPSB0aGlzLnJlbmRlcigpOwotICAgIHN0cmluZyArPSB0aGlzLm1vcnBoLmVuZFRhZygp
OwotCi0gICAgYnVmZmVyLnB1c2goc3RyaW5nKTsKLSAgfSwKLQotICByZW5kZXI6IGZ1bmN0aW9u
KCkgewotICAgIC8vIElmIG5vdCBpbnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNoZSAoe3t7Zm9v
fX19KSwgZXNjYXBlCi0gICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLgotICAgIHZh
ciBlc2NhcGUgPSB0aGlzLmlzRXNjYXBlZDsKLSAgICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxp
emVkVmFsdWUoKTsKLQotICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRl
ZmluZWQpIHsKLSAgICAgIHJlc3VsdCA9ICIiOwotICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgaW5z
dGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcpKSB7Ci0gICAgICByZXN1bHQgPSBTdHJpbmco
cmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMu
VXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQpOyB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAg
fSwKLQotICByZXJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAgc3dpdGNoKHRoaXMuc3RhdGUpIHsK
LSAgICAgIGNhc2UgJ3ByZVJlbmRlcic6Ci0gICAgICBjYXNlICdkZXN0cm95ZWQnOgotICAgICAg
ICBicmVhazsKLSAgICAgIGNhc2UgJ2luQnVmZmVyJzoKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVy
LkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCB0cmllZCB0byByZXBsYWNlIGFuIHt7ZXhwcmVzc2lv
bn19IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLiIpOwotICAgICAgY2FzZSAn
aGFzRWxlbWVudCc6Ci0gICAgICBjYXNlICdpbkRPTSc6Ci0gICAgICAgIHRoaXMudXBkYXRlSWQg
PSBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCAndXBkYXRlJyk7Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHVwZGF0ZTog
ZnVuY3Rpb24gKCkgewotICAgIHRoaXMudXBkYXRlSWQgPSBudWxsOwotICAgIHRoaXMubW9ycGgu
aHRtbCh0aGlzLnJlbmRlcigpKTsKLSAgfSwKLQotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0
YXRlKSB7Ci0gICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICB9Ci19OwotCi12YXIgc3RhdGVzID0g
RW1iZXIuVmlldy5jbG9uZVN0YXRlcyhFbWJlci5WaWV3LnN0YXRlcyksIG1lcmdlID0gRW1iZXIu
bWVyZ2U7Ci0KLW1lcmdlKHN0YXRlcy5fZGVmYXVsdCwgewotICByZXJlbmRlcklmTmVlZGVkOiBF
bWJlci5LCi19KTsKLQotbWVyZ2Uoc3RhdGVzLmluRE9NLCB7Ci0gIHJlcmVuZGVySWZOZWVkZWQ6
IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBpZiAodmlldy5ub3JtYWxpemVkVmFsdWUoKSAhPT0gdmll
dy5fbGFzdE5vcm1hbGl6ZWRWYWx1ZSkgewotICAgICAgdmlldy5yZXJlbmRlcigpOwotICAgIH0K
LSAgfQotfSk7Ci0KLS8qKgotICBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJp
dmF0ZSB2aWV3IGNyZWF0ZWQgYnkgdGhlIEhhbmRsZWJhcnMKLSAgYHt7YmluZH19YCBoZWxwZXJz
IHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGJvdW5kIHByb3BlcnRpZXMuCi0KLSAgRXZl
cnkgdGltZSBhIHByb3BlcnR5IGlzIGJvdW5kIHVzaW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFu
b255bW91cyBzdWJjbGFzcwotICBvZiBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGNy
ZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3ViLXRlbXBsYXRlCi0gIGFuZCBjb250ZXh0IHNl
dCB1cC4gV2hlbiB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBqdXN0IHRoZSB0ZW1w
bGF0ZQotICBmb3IgdGhpcyB2aWV3IHdpbGwgcmUtcmVuZGVyLgotCi0gIEBjbGFzcyBfSGFuZGxl
YmFyc0JvdW5kVmlldwotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLl9NZXRh
bW9ycGhWaWV3Ci0gIEBwcml2YXRlCi0qLwotRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgPSBF
bWJlci5fTWV0YW1vcnBoVmlldy5leHRlbmQoewotICBpbnN0cnVtZW50TmFtZTogJ2JvdW5kSGFu
ZGxlYmFycycsCi0gIHN0YXRlczogc3RhdGVzLAotCi0gIC8qKgotICAgIFRoZSBmdW5jdGlvbiB1
c2VkIHRvIGRldGVybWluZSBpZiB0aGUgYGRpc3BsYXlUZW1wbGF0ZWAgb3IKLSAgICBgaW52ZXJz
ZVRlbXBsYXRlYCBzaG91bGQgYmUgcmVuZGVyZWQuIFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24g
dGhhdCB0YWtlcwotICAgIGEgdmFsdWUgYW5kIHJldHVybnMgYSBCb29sZWFuLgotCi0gICAgQHBy
b3BlcnR5IHNob3VsZERpc3BsYXlGdW5jCi0gICAgQHR5cGUgRnVuY3Rpb24KLSAgICBAZGVmYXVs
dCBudWxsCi0gICovCi0gIHNob3VsZERpc3BsYXlGdW5jOiBudWxsLAotCi0gIC8qKgotICAgIFdo
ZXRoZXIgdGhlIHRlbXBsYXRlIHJlbmRlcmVkIGJ5IHRoaXMgdmlldyBnZXRzIHBhc3NlZCB0aGUg
Y29udGV4dCBvYmplY3QKLSAgICBvZiBpdHMgcGFyZW50IHRlbXBsYXRlLCBvciBnZXRzIHBhc3Nl
ZCB0aGUgdmFsdWUgb2YgcmV0cmlldmluZyBgcGF0aGAKLSAgICBmcm9tIHRoZSBgcGF0aFJvb3Rg
LgotCi0gICAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdHJ1ZSB3aGVuIHVzaW5nIHRoZSBge3sjaWZ9
fWAgaGVscGVyLCBiZWNhdXNlIHRoZQotICAgIHRlbXBsYXRlIGluc2lkZSB0aGUgaGVscGVyIHNo
b3VsZCBsb29rIHVwIHByb3BlcnRpZXMgcmVsYXRpdmUgdG8gdGhlIHNhbWUKLSAgICBvYmplY3Qg
YXMgb3V0c2lkZSB0aGUgYmxvY2suIFRoaXMgd291bGQgYmUgYGZhbHNlYCB3aGVuIHVzZWQgd2l0
aCBge3sjd2l0aAotICAgIGZvb319YCBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSBzaG91bGQgcmVjZWl2
ZSB0aGUgb2JqZWN0IGZvdW5kIGJ5IGV2YWx1YXRpbmcKLSAgICBgZm9vYC4KLQotICAgIEBwcm9w
ZXJ0eSBwcmVzZXJ2ZUNvbnRleHQKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgZmFs
c2UKLSAgKi8KLSAgcHJlc2VydmVDb250ZXh0OiBmYWxzZSwKLQotICAvKioKLSAgICBJZiBgcHJl
c2VydmVDb250ZXh0YCBpcyB0cnVlLCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVz
ZWQKLSAgICB0byByZW5kZXIgdGhlIHRlbXBsYXRlLgotCi0gICAgQHByb3BlcnR5IHByZXZpb3Vz
Q29udGV4dAotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBwcmV2aW91c0NvbnRleHQ6IG51bGws
Ci0KLSAgLyoqCi0gICAgVGhlIHRlbXBsYXRlIHRvIHJlbmRlciB3aGVuIGBzaG91bGREaXNwbGF5
RnVuY2AgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQotICAgIEBwcm9wZXJ0eSBkaXNwbGF5VGVtcGxh
dGUKLSAgICBAdHlwZSBGdW5jdGlvbgotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgZGlzcGxh
eVRlbXBsYXRlOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgd2hl
biBgc2hvdWxkRGlzcGxheUZ1bmNgIGV2YWx1YXRlcyB0byBgZmFsc2VgLgotCi0gICAgQHByb3Bl
cnR5IGludmVyc2VUZW1wbGF0ZQotICAgIEB0eXBlIEZ1bmN0aW9uCi0gICAgQGRlZmF1bHQgbnVs
bAotICAqLwotICBpbnZlcnNlVGVtcGxhdGU6IG51bGwsCi0KLQotICAvKioKLSAgICBUaGUgcGF0
aCB0byBsb29rIHVwIG9uIGBwYXRoUm9vdGAgdGhhdCBpcyBwYXNzZWQgdG8KLSAgICBgc2hvdWxk
RGlzcGxheUZ1bmNgIHRvIGRldGVybWluZSB3aGljaCB0ZW1wbGF0ZSB0byByZW5kZXIuCi0KLSAg
ICBJbiBhZGRpdGlvbiwgaWYgYHByZXNlcnZlQ29udGV4dGAgaXMgYGZhbHNlLGAgdGhlIG9iamVj
dCBhdCB0aGlzIHBhdGggd2lsbAotICAgIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgd2hlbiBy
ZW5kZXJpbmcuCi0KLSAgICBAcHJvcGVydHkgcGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBk
ZWZhdWx0IG51bGwKLSAgKi8KLSAgcGF0aDogbnVsbCwKLQotICAvKioKLSAgICBUaGUgb2JqZWN0
IGZyb20gd2hpY2ggdGhlIGBwYXRoYCB3aWxsIGJlIGxvb2tlZCB1cC4gU29tZXRpbWVzIHRoaXMg
aXMgdGhlCi0gICAgc2FtZSBhcyB0aGUgYHByZXZpb3VzQ29udGV4dGAsIGJ1dCBpbiBjYXNlcyB3
aGVyZSB0aGlzIHZpZXcgaGFzIGJlZW4KLSAgICBnZW5lcmF0ZWQgZm9yIHBhdGhzIHRoYXQgc3Rh
cnQgd2l0aCBhIGtleXdvcmQgc3VjaCBhcyBgdmlld2Agb3IKLSAgICBgY29udHJvbGxlcmAsIHRo
ZSBwYXRoIHJvb3Qgd2lsbCBiZSB0aGF0IHJlc29sdmVkIG9iamVjdC4KLQotICAgIEBwcm9wZXJ0
eSBwYXRoUm9vdAotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBwYXRoUm9vdDogbnVsbCwKLQot
ICBub3JtYWxpemVkVmFsdWU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXRoID0gZ2V0KHRoaXMs
ICdwYXRoJyksCi0gICAgICAgIHBhdGhSb290ICA9IGdldCh0aGlzLCAncGF0aFJvb3QnKSwKLSAg
ICAgICAgdmFsdWVOb3JtYWxpemVyID0gZ2V0KHRoaXMsICd2YWx1ZU5vcm1hbGl6ZXJGdW5jJyks
Ci0gICAgICAgIHJlc3VsdCwgdGVtcGxhdGVEYXRhOwotCi0gICAgLy8gVXNlIHRoZSBwYXRoUm9v
dCBhcyB0aGUgcmVzdWx0IGlmIG5vIHBhdGggaXMgcHJvdmlkZWQuIFRoaXMKLSAgICAvLyBoYXBw
ZW5zIGlmIHRoZSBwYXRoIGlzIGB0aGlzYCwgd2hpY2ggZ2V0cyBub3JtYWxpemVkIGludG8KLSAg
ICAvLyBhIGBwYXRoUm9vdGAgb2YgdGhlIGN1cnJlbnQgSGFuZGxlYmFycyBjb250ZXh0IGFuZCBh
IHBhdGgKLSAgICAvLyBvZiBgJydgLgotICAgIGlmIChwYXRoID09PSAnJykgewotICAgICAgcmVz
dWx0ID0gcGF0aFJvb3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRlbXBsYXRlRGF0YSA9IGdldCh0
aGlzLCAndGVtcGxhdGVEYXRhJyk7Ci0gICAgICByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhS
b290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
dmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3JtYWxpemVyKHJlc3VsdCkgOiByZXN1bHQ7Ci0gIH0s
Ci0KLSAgcmVyZW5kZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jdXJyZW50U3Rh
dGUucmVyZW5kZXJJZk5lZWRlZCh0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBEZXRlcm1pbmVz
IHdoaWNoIHRlbXBsYXRlIHRvIGludm9rZSwgc2V0cyB1cCB0aGUgY29ycmVjdCBzdGF0ZSBiYXNl
ZCBvbgotICAgIHRoYXQgbG9naWMsIHRoZW4gaW52b2tlcyB0aGUgZGVmYXVsdCBgRW1iZXIuVmll
d2AgYHJlbmRlcmAgaW1wbGVtZW50YXRpb24uCi0KLSAgICBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0
IGxvb2sgdXAgdGhlIGBwYXRoYCBrZXkgb24gYHBhdGhSb290YCwKLSAgICB0aGVuIHBhc3MgdGhh
dCB2YWx1ZSB0byB0aGUgYHNob3VsZERpc3BsYXlGdW5jYCBmdW5jdGlvbi4gSWYgdGhhdCByZXR1
cm5zCi0gICAgYHRydWUsYCB0aGUgYGRpc3BsYXlUZW1wbGF0ZWAgZnVuY3Rpb24gd2lsbCBiZSBy
ZW5kZXJlZCB0byBET00uIE90aGVyd2lzZSwKLSAgICBgaW52ZXJzZVRlbXBsYXRlYCwgaWYgc3Bl
Y2lmaWVkLCB3aWxsIGJlIHJlbmRlcmVkLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgYEVt
YmVyLl9IYW5kbGViYXJzQm91bmRWaWV3YCByZXByZXNlbnRlZCB0aGUgYHt7I3dpdGgKLSAgICBm
b299fWAgaGVscGVyLCBpdCB3b3VsZCBsb29rIHVwIHRoZSBgZm9vYCBwcm9wZXJ0eSBvZiBpdHMg
Y29udGV4dCwgYW5kCi0gICAgYHNob3VsZERpc3BsYXlGdW5jYCB3b3VsZCBhbHdheXMgcmV0dXJu
IHRydWUuIFRoZSBvYmplY3QgZm91bmQgYnkgbG9va2luZwotICAgIHVwIGBmb29gIHdvdWxkIGJl
IHBhc3NlZCB0byBgZGlzcGxheVRlbXBsYXRlYC4KLQotICAgIEBtZXRob2QgcmVuZGVyCi0gICAg
QHBhcmFtIHtFbWJlci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlcgotICAqLwotICByZW5kZXI6IGZ1bmN0
aW9uKGJ1ZmZlcikgewotICAgIC8vIElmIG5vdCBpbnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNo
ZSAoe3t7Zm9vfX19KSwgZXNjYXBlCi0gICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRl
LgotICAgIHZhciBlc2NhcGUgPSBnZXQodGhpcywgJ2lzRXNjYXBlZCcpOwotCi0gICAgdmFyIHNo
b3VsZERpc3BsYXkgPSBnZXQodGhpcywgJ3Nob3VsZERpc3BsYXlGdW5jJyksCi0gICAgICAgIHBy
ZXNlcnZlQ29udGV4dCA9IGdldCh0aGlzLCAncHJlc2VydmVDb250ZXh0JyksCi0gICAgICAgIGNv
bnRleHQgPSBnZXQodGhpcywgJ3ByZXZpb3VzQ29udGV4dCcpOwotCi0gICAgdmFyIGludmVyc2VU
ZW1wbGF0ZSA9IGdldCh0aGlzLCAnaW52ZXJzZVRlbXBsYXRlJyksCi0gICAgICAgIGRpc3BsYXlU
ZW1wbGF0ZSA9IGdldCh0aGlzLCAnZGlzcGxheVRlbXBsYXRlJyk7Ci0KLSAgICB2YXIgcmVzdWx0
ID0gdGhpcy5ub3JtYWxpemVkVmFsdWUoKTsKLSAgICB0aGlzLl9sYXN0Tm9ybWFsaXplZFZhbHVl
ID0gcmVzdWx0OwotCi0gICAgLy8gRmlyc3QsIHRlc3QgdGhlIGNvbmRpdGlvbmFsIHRvIHNlZSBp
ZiB3ZSBzaG91bGQKLSAgICAvLyByZW5kZXIgdGhlIHRlbXBsYXRlIG9yIG5vdC4KLSAgICBpZiAo
c2hvdWxkRGlzcGxheShyZXN1bHQpKSB7Ci0gICAgICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZGlz
cGxheVRlbXBsYXRlKTsKLQotICAgICAgLy8gSWYgd2UgYXJlIHByZXNlcnZpbmcgdGhlIGNvbnRl
eHQgKGZvciBleGFtcGxlLCBpZiB0aGlzCi0gICAgICAvLyBpcyBhbiAjaWYgYmxvY2ssIGNhbGwg
dGhlIHRlbXBsYXRlIHdpdGggdGhlIHNhbWUgb2JqZWN0LgotICAgICAgaWYgKHByZXNlcnZlQ29u
dGV4dCkgewotICAgICAgICBzZXQodGhpcywgJ19jb250ZXh0JywgY29udGV4dCk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgLy8gT3RoZXJ3aXNlLCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGJsb2Nr
IGJpbmQgb3Igbm90LgotICAgICAgLy8gSWYgc28sIHBhc3MgdGhlIHNwZWNpZmllZCBvYmplY3Qg
dG8gdGhlIHRlbXBsYXRlCi0gICAgICAgIGlmIChkaXNwbGF5VGVtcGxhdGUpIHsKLSAgICAgICAg
ICBzZXQodGhpcywgJ19jb250ZXh0JywgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgLy8gVGhpcyBpcyBub3QgYSBiaW5kIGJsb2NrLCBqdXN0IHB1c2ggdGhlIHJlc3VsdCBvZiB0
aGUKLSAgICAgICAgLy8gZXhwcmVzc2lvbiB0byB0aGUgcmVuZGVyIGNvbnRleHQgYW5kIHJldHVy
bi4KLSAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVk
KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgICAgICB9IGVsc2UgaWYgKCEocmVz
dWx0IGluc3RhbmNlb2YgSGFuZGxlYmFycy5TYWZlU3RyaW5nKSkgewotICAgICAgICAgICAgcmVz
dWx0ID0gU3RyaW5nKHJlc3VsdCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGVzY2Fw
ZSkgeyByZXN1bHQgPSBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24ocmVzdWx0KTsg
fQotICAgICAgICAgIGJ1ZmZlci5wdXNoKHJlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnZlcnNlVGVtcGxhdGUpIHsKLSAgICAg
IHNldCh0aGlzLCAndGVtcGxhdGUnLCBpbnZlcnNlVGVtcGxhdGUpOwotCi0gICAgICBpZiAocHJl
c2VydmVDb250ZXh0KSB7Ci0gICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCBjb250ZXh0KTsK
LSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOwot
ICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZnVuY3Rp
b24oKSB7IHJldHVybiAnJzsgfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuX3N1cGVyKGJ1
ZmZlcik7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKLXZhciBo
YW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQsIG5vcm1hbGl6ZVBhdGggPSBFbWJl
ci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGg7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9s
eWZpbGxzLmZvckVhY2g7Ci12YXIgb19jcmVhdGUgPSBFbWJlci5jcmVhdGU7Ci0KLXZhciBFbWJl
ckhhbmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJzLCBoZWxwZXJzID0gRW1iZXJIYW5kbGViYXJz
LmhlbHBlcnM7Ci0KLWZ1bmN0aW9uIGV4aXN0cyh2YWx1ZSkgewotICByZXR1cm4gIUVtYmVyLmlz
Tm9uZSh2YWx1ZSk7Ci19Ci0KLWZ1bmN0aW9uIHNhbml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVu
dENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSB7Ci0gIHZhciByZXN1bHQgPSBoYW5kbGViYXJz
R2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7Ci0gIGlmIChyZXN1bHQgPT09
IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKLSAgICByZXN1bHQgPSAiIjsKLSAgfSBl
bHNlIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZykpIHsKLSAg
ICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAgfQotICBpZiAoIW9wdGlvbnMuaGFzaC51bmVz
Y2FwZWQpewotICAgIHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihy
ZXN1bHQpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQmluZHMgYSBwcm9wZXJ0
eSBpbnRvIHRoZSBET00uIFRoaXMgd2lsbCBjcmVhdGUgYSBob29rIGluIERPTSB0aGF0IHRoZQot
Ly8gS1ZPIHN5c3RlbSB3aWxsIGxvb2sgZm9yIGFuZCB1cGRhdGUgaWYgdGhlIHByb3BlcnR5IGNo
YW5nZXMuCi1mdW5jdGlvbiBiaW5kKHByb3BlcnR5LCBvcHRpb25zLCBwcmVzZXJ2ZUNvbnRleHQs
IHNob3VsZERpc3BsYXksIHZhbHVlTm9ybWFsaXplciwgY2hpbGRQcm9wZXJ0aWVzKSB7Ci0gIHZh
ciBkYXRhID0gb3B0aW9ucy5kYXRhLAotICAgICAgZm4gPSBvcHRpb25zLmZuLAotICAgICAgaW52
ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBj
dXJyZW50Q29udGV4dCA9IHRoaXMsCi0gICAgICBub3JtYWxpemVkLCBvYnNlcnZlciwgaTsKLQot
ICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIGRh
dGEpOwotCi0gIC8vIFNldCB1cCBvYnNlcnZlcnMgZm9yIG9ic2VydmFibGUgb2JqZWN0cwotICBp
ZiAoJ29iamVjdCcgPT09IHR5cGVvZiB0aGlzKSB7Ci0gICAgaWYgKGRhdGEuaW5zaWRlR3JvdXAp
IHsKLSAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5vbmNl
KHZpZXcsICdyZXJlbmRlcicpOwotICAgICAgfTsKLQotICAgICAgdmFyIHRlbXBsYXRlLCBjb250
ZXh0LCByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0
aW9ucyk7Ci0KLSAgICAgIHJlc3VsdCA9IHZhbHVlTm9ybWFsaXplciA/IHZhbHVlTm9ybWFsaXpl
cihyZXN1bHQpIDogcmVzdWx0OwotCi0gICAgICBjb250ZXh0ID0gcHJlc2VydmVDb250ZXh0ID8g
Y3VycmVudENvbnRleHQgOiByZXN1bHQ7Ci0gICAgICBpZiAoc2hvdWxkRGlzcGxheShyZXN1bHQp
KSB7Ci0gICAgICAgIHRlbXBsYXRlID0gZm47Ci0gICAgICB9IGVsc2UgaWYgKGludmVyc2UpIHsK
LSAgICAgICAgdGVtcGxhdGUgPSBpbnZlcnNlOwotICAgICAgfQotCi0gICAgICB0ZW1wbGF0ZShj
b250ZXh0LCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8g
Q3JlYXRlIHRoZSB2aWV3IHRoYXQgd2lsbCB3cmFwIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZW1wbGF0
ZS9wcm9wZXJ0eQotICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgbmVhcmVzdCB2aWV3J3MgY2hp
bGRWaWV3cyBhcnJheS4KLSAgICAgIC8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBFbWJlci5f
SGFuZGxlYmFyc0JvdW5kVmlldyBmb3IgbW9yZS4KLSAgICAgIHZhciBiaW5kVmlldyA9IHZpZXcu
Y3JlYXRlQ2hpbGRWaWV3KEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3LCB7Ci0gICAgICAgIHBy
ZXNlcnZlQ29udGV4dDogcHJlc2VydmVDb250ZXh0LAotICAgICAgICBzaG91bGREaXNwbGF5RnVu
Yzogc2hvdWxkRGlzcGxheSwKLSAgICAgICAgdmFsdWVOb3JtYWxpemVyRnVuYzogdmFsdWVOb3Jt
YWxpemVyLAotICAgICAgICBkaXNwbGF5VGVtcGxhdGU6IGZuLAotICAgICAgICBpbnZlcnNlVGVt
cGxhdGU6IGludmVyc2UsCi0gICAgICAgIHBhdGg6IHByb3BlcnR5LAotICAgICAgICBwYXRoUm9v
dDogY3VycmVudENvbnRleHQsCi0gICAgICAgIHByZXZpb3VzQ29udGV4dDogY3VycmVudENvbnRl
eHQsCi0gICAgICAgIGlzRXNjYXBlZDogIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQsCi0gICAgICAg
IHRlbXBsYXRlRGF0YTogb3B0aW9ucy5kYXRhCi0gICAgICB9KTsKLQotICAgICAgdmlldy5hcHBl
bmRDaGlsZChiaW5kVmlldyk7Ci0KLSAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIGJpbmRWaWV3LCAncmVyZW5kZXJJ
Zk5lZWRlZCcpOwotICAgICAgfTsKLSAgICB9Ci0KLSAgICAvLyBPYnNlcnZlcyB0aGUgZ2l2ZW4g
cHJvcGVydHkgb24gdGhlIGNvbnRleHQgYW5kCi0gICAgLy8gdGVsbHMgdGhlIEVtYmVyLl9IYW5k
bGViYXJzQm91bmRWaWV3IHRvIHJlLXJlbmRlci4gSWYgcHJvcGVydHkKLSAgICAvLyBpcyBhbiBl
bXB0eSBzdHJpbmcsIHdlIGFyZSBwcmludGluZyB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgLy8g
b2JqZWN0ICh7e3RoaXN9fSkgc28gdXBkYXRpbmcgaXQgaXMgbm90IG91ciByZXNwb25zaWJpbGl0
eS4KLSAgICBpZiAobm9ybWFsaXplZC5wYXRoICE9PSAnJykgewotICAgICAgdmlldy5yZWdpc3Rl
ck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0g
ICAgICBpZiAoY2hpbGRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPGNoaWxkUHJv
cGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihu
b3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCsnLicrY2hpbGRQcm9wZXJ0aWVzW2ldLCBv
YnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8g
VGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAot
ICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAgICBkYXRhLmJ1ZmZlci5wdXNoKGhhbmRsZWJhcnNH
ZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSk7Ci0gIH0KLX0KLQotRW1iZXJI
YW5kbGViYXJzLmJpbmQgPSBiaW5kOwotCi1mdW5jdGlvbiBzaW1wbGVCaW5kKGN1cnJlbnRDb250
ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucykgewotICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAg
ICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBub3JtYWxpemVkLCBvYnNlcnZlciwgcGF0aFJv
b3QsIG91dHB1dDsKLQotICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4
dCwgcHJvcGVydHksIGRhdGEpOwotICBwYXRoUm9vdCA9IG5vcm1hbGl6ZWQucm9vdDsKLQotICAv
LyBTZXQgdXAgb2JzZXJ2ZXJzIGZvciBvYnNlcnZhYmxlIG9iamVjdHMKLSAgaWYgKHBhdGhSb290
ICYmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHBhdGhSb290KSkgewotICAgIGlmIChkYXRhLmluc2lk
ZUdyb3VwKSB7Ci0gICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgICBFbWJlci5y
dW4ub25jZSh2aWV3LCAncmVyZW5kZXInKTsKLSAgICAgIH07Ci0KLSAgICAgIG91dHB1dCA9IHNh
bml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKTsK
LQotICAgICAgZGF0YS5idWZmZXIucHVzaChvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2
YXIgYmluZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3KAotICAgICAgICBw
cm9wZXJ0eSwgY3VycmVudENvbnRleHQsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25z
LmRhdGEKLSAgICAgICk7Ci0KLSAgICAgIGJpbmRWaWV3Ll9wYXJlbnRWaWV3ID0gdmlldzsKLSAg
ICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOwotCi0gICAgICBvYnNlcnZlciA9IGZ1bmN0
aW9uKCkgewotICAgICAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCBiaW5kVmll
dywgJ3JlcmVuZGVyJyk7Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8vIE9ic2VydmVzIHRoZSBn
aXZlbiBwcm9wZXJ0eSBvbiB0aGUgY29udGV4dCBhbmQKLSAgICAvLyB0ZWxscyB0aGUgRW1iZXIu
X0hhbmRsZWJhcnNCb3VuZFZpZXcgdG8gcmUtcmVuZGVyLiBJZiBwcm9wZXJ0eQotICAgIC8vIGlz
IGFuIGVtcHR5IHN0cmluZywgd2UgYXJlIHByaW50aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKLSAg
ICAvLyBvYmplY3QgKHt7dGhpc319KSBzbyB1cGRhdGluZyBpdCBpcyBub3Qgb3VyIHJlc3BvbnNp
YmlsaXR5LgotICAgIGlmIChub3JtYWxpemVkLnBhdGggIT09ICcnKSB7Ci0gICAgICB2aWV3LnJl
Z2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVkLnBhdGgsIG9ic2VydmVy
KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJs
ZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAotICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAg
ICBvdXRwdXQgPSBzYW5pdGl6ZWRIYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0
eSwgb3B0aW9ucyk7Ci0KLSAgICBkYXRhLmJ1ZmZlci5wdXNoKG91dHB1dCk7Ci0gIH0KLX0KLQot
LyoqCi0gICdfdHJpYWdlTXVzdGFjaGUnIGlzIHVzZWQgaW50ZXJuYWxseSBzZWxlY3QgYmV0d2Vl
biBhIGJpbmRpbmcsIGhlbHBlciwgb3IgY29tcG9uZW50IGZvcgotICB0aGUgZ2l2ZW4gY29udGV4
dC4gVW50aWwgdGhpcyBwb2ludCwgaXQgd291bGQgYmUgaGFyZCB0byBkZXRlcm1pbmUgaWYgdGhl
Ci0gIG11c3RhY2hlIGlzIGEgcHJvcGVydHkgcmVmZXJlbmNlIG9yIGEgcmVndWxhciBoZWxwZXIg
cmVmZXJlbmNlLiBUaGlzIHRyaWFnZQotICBoZWxwZXIgcmVzb2x2ZXMgdGhhdC4KLQotICBUaGlz
IHdvdWxkIG5vdCBiZSB0eXBpY2FsbHkgaW52b2tlZCBieSBkaXJlY3RseS4KLQotICBAcHJpdmF0
ZQotICBAbWV0aG9kIF90cmlhZ2VNdXN0YWNoZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVs
cGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkvaGVscGVySUQgdG8gdHJp
YWdlCi0gIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGhhc2ggb2YgdGVtcGxhdGUvcmVuZGVyaW5n
IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxl
YmFycy5yZWdpc3RlckhlbHBlcignX3RyaWFnZU11c3RhY2hlJywgZnVuY3Rpb24ocHJvcGVydHks
IG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9u
ZSBhcmd1bWVudCB0byB0aGUgX3RyaWFnZU11c3RhY2hlIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5n
dGggPD0gMik7Ci0KLSAgaWYgKGhlbHBlcnNbcHJvcGVydHldKSB7Ci0gICAgcmV0dXJuIGhlbHBl
cnNbcHJvcGVydHldLmNhbGwodGhpcywgb3B0aW9ucyk7Ci0gIH0KLQotICB2YXIgaGVscGVyID0g
RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKG9wdGlvbnMuZGF0YS52aWV3LmNvbnRhaW5l
ciwgcHJvcGVydHkpOwotICBpZiAoaGVscGVyKSB7Ci0gICAgcmV0dXJuIGhlbHBlci5jYWxsKHRo
aXMsIG9wdGlvbnMpOwotICB9Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYmluZC5jYWxsKHRoaXMsIHBy
b3BlcnR5LCBvcHRpb25zKTsKLX0pOwotCi1FbWJlci5IYW5kbGViYXJzLnJlc29sdmVIZWxwZXIg
PSBmdW5jdGlvbihjb250YWluZXIsIG5hbWUpIHsKLQotICBpZiAoIWNvbnRhaW5lciB8fCBuYW1l
LmluZGV4T2YoJy0nKSA9PT0gLTEpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2YXIgaGVscGVy
ID0gY29udGFpbmVyLmxvb2t1cCgnaGVscGVyOicgKyBuYW1lKTsKLSAgaWYgKCFoZWxwZXIpIHsK
LSAgICB2YXIgY29tcG9uZW50TG9va3VwID0gY29udGFpbmVyLmxvb2t1cCgnY29tcG9uZW50LWxv
b2t1cDptYWluJyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCAnY29tcG9uZW50
LWxvb2t1cDptYWluJyBvbiB0aGUgcHJvdmlkZWQgY29udGFpbmVyLCB3aGljaCBpcyBuZWNlc3Nh
cnkgZm9yIHBlcmZvcm1pbmcgY29tcG9uZW50IGxvb2t1cHMiLCBjb21wb25lbnRMb29rdXApOwot
Ci0gICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudExvb2t1cC5sb29rdXBGYWN0b3J5KG5hbWUs
IGNvbnRhaW5lcik7Ci0gICAgaWYgKENvbXBvbmVudCkgewotICAgICAgaGVscGVyID0gRW1iZXJI
YW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKENvbXBvbmVudCk7Ci0gICAgICBjb250YWluZXIucmVn
aXN0ZXIoJ2hlbHBlcjonICsgbmFtZSwgaGVscGVyKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGhl
bHBlcjsKLX07Ci0KLS8qKgotICBgYmluZGAgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIHZhbHVl
LCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0Ci0gIGNoYW5nZXMuIEZvciBleGFtcGxlLCBp
ZiB5b3Ugd2FudGVkIHRvIHByaW50IHRoZSBgdGl0bGVgIHByb3BlcnR5IG9mCi0gIGBjb250ZW50
YDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7YmluZCAiY29udGVudC50aXRsZSJ9fQotICBgYGAK
LQotICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBgdGl0bGVgIHByb3BlcnR5IGFzIGEgc3RyaW5nLCB0
aGVuIGNyZWF0ZSBhIG5ldyBvYnNlcnZlcgotICBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIGl0
IGNoYW5nZXMsIGl0IHdpbGwgdXBkYXRlIHRoZSB2YWx1ZSBpbiBET00uIE5vdGUKLSAgdGhhdCBp
ZiB5b3UgbmVlZCB0byBzdXBwb3J0IElFNyBhbmQgSUU4IHlvdSBtdXN0IG1vZGlmeSB0aGUgbW9k
ZWwgb2JqZWN0cwotICBwcm9wZXJ0aWVzIHVzaW5nIGBFbWJlci5nZXQoKWAgYW5kIGBFbWJlci5z
ZXQoKWAgZm9yIHRoaXMgdG8gd29yayBhcyBpdAotICByZWxpZXMgb24gRW1iZXIncyBLVk8gc3lz
dGVtLiBGb3IgYWxsIG90aGVyIGJyb3dzZXJzIHRoaXMgd2lsbCBiZSBoYW5kbGVkIGZvcgotICB5
b3UgYXV0b21hdGljYWxseS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGJpbmQKLSAgQGZvciBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3Bl
cnR5IHRvIGJpbmQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZm4gQ29udGV4dCB0byBwcm92aWRlIGZv
ciByZW5kZXJpbmcKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFu
ZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmluZCcsIGZ1bmN0aW9uIGJpbmRIZWxwZXIocHJvcGVy
dHksIG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFu
IG9uZSBhcmd1bWVudCB0byB0aGUgYmluZCBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIp
OwotCi0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0
cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXM7Ci0KLSAgaWYgKCFvcHRpb25z
LmZuKSB7Ci0gICAgcmV0dXJuIHNpbXBsZUJpbmQoY29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMp
OwotICB9Ci0KLSAgcmV0dXJuIGJpbmQuY2FsbChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucywg
ZmFsc2UsIGV4aXN0cyk7Ci19KTsKLQotLyoqCi0gIFVzZSB0aGUgYGJvdW5kSWZgIGhlbHBlciB0
byBjcmVhdGUgYSBjb25kaXRpb25hbCB0aGF0IHJlLWV2YWx1YXRlcwotICB3aGVuZXZlciB0aGUg
dHJ1dGhpbmVzcyBvZiB0aGUgYm91bmQgdmFsdWUgY2hhbmdlcy4KLQotICBgYGBoYW5kbGViYXJz
Ci0gIHt7I2JvdW5kSWYgImNvbnRlbnQuc2hvdWxkRGlzcGxheVRpdGxlIn19Ci0gICAge3tjb250
ZW50LnRpdGxlfX0KLSAge3svYm91bmRJZn19Ci0gIGBgYAotCi0gIEBwcml2YXRlCi0gIEBtZXRo
b2QgYm91bmRJZgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0
cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gYmluZAotICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBD
b250ZXh0IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmluZwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwg
c3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdib3VuZElmJywgZnVu
Y3Rpb24gYm91bmRJZkhlbHBlcihwcm9wZXJ0eSwgZm4pIHsKLSAgdmFyIGNvbnRleHQgPSAoZm4u
Y29udGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBdIDogdGhpczsK
LSAgdmFyIGZ1bmMgPSBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICB2YXIgdHJ1dGh5ID0gcmVzdWx0
ICYmIGdldChyZXN1bHQsICdpc1RydXRoeScpOwotICAgIGlmICh0eXBlb2YgdHJ1dGh5ID09PSAn
Ym9vbGVhbicpIHsgcmV0dXJuIHRydXRoeTsgfQotCi0gICAgaWYgKEVtYmVyLmlzQXJyYXkocmVz
dWx0KSkgewotICAgICAgcmV0dXJuIGdldChyZXN1bHQsICdsZW5ndGgnKSAhPT0gMDsKLSAgICB9
IGVsc2UgewotICAgICAgcmV0dXJuICEhcmVzdWx0OwotICAgIH0KLSAgfTsKLQotICByZXR1cm4g
YmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBmbiwgdHJ1ZSwgZnVuYywgZnVuYywgWydpc1Ry
dXRoeScsICdsZW5ndGgnXSk7Ci19KTsKLQotLyoqCi0gIFVzZSB0aGUgYHt7d2l0aH19YCBoZWxw
ZXIgd2hlbiB5b3Ugd2FudCB0byBzY29wZSBjb250ZXh0LiBUYWtlIHRoZSBmb2xsb3dpbmcgY29k
ZSBhcyBhbiBleGFtcGxlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGg1Pnt7dXNlci5uYW1lfX08
L2g1PgotCi0gIDxkaXYgY2xhc3M9InJvbGUiPgotICAgIDxoNj57e3VzZXIucm9sZS5sYWJlbH19
PC9oNj4KLSAgICA8c3BhbiBjbGFzcz0icm9sZS1pZCI+e3t1c2VyLnJvbGUuaWR9fTwvc3Bhbj4K
LQotICAgIDxwIGNsYXNzPSJyb2xlLWRlc2MiPnt7dXNlci5yb2xlLmRlc2NyaXB0aW9ufX08L3A+
Ci0gIDwvZGl2PgotICBgYGAKLQotICBge3t3aXRofX1gIGNhbiBiZSBvdXIgYmVzdCBmcmllbmQg
aW4gdGhlc2UgY2FzZXMsIAotICBpbnN0ZWFkIG9mIHdyaXRpbmcgYHVzZXIucm9sZS4qYCBvdmVy
IGFuZCBvdmVyLCB3ZSB1c2UgYHt7I3dpdGggdXNlci5yb2xlfX1gLgotICBOb3cgdGhlIGNvbnRl
eHQgd2l0aGluIHRoZSBge3sjd2l0aH19IC4uIHt7L3dpdGh9fWAgYmxvY2sgaXMgYHVzZXIucm9s
ZWAgc28geW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGg1
Pnt7dXNlci5uYW1lfX08L2g1PgotCi0gIDxkaXYgY2xhc3M9InJvbGUiPgotICAgIHt7I3dpdGgg
dXNlci5yb2xlfX0KLSAgICAgIDxoNj57e2xhYmVsfX08L2g2PgotICAgICAgPHNwYW4gY2xhc3M9
InJvbGUtaWQiPnt7aWR9fTwvc3Bhbj4KLQotICAgICAgPHAgY2xhc3M9InJvbGUtZGVzYyI+e3tk
ZXNjcmlwdGlvbn19PC9wPgotICAgIHt7L3dpdGh9fQotICA8L2Rpdj4KLSAgYGBgCi0KLSAgIyMj
IGBhc2Agb3BlcmF0b3IKLQotICBUaGlzIG9wZXJhdG9yIGFsaWFzZXMgdGhlIHNjb3BlIHRvIGEg
bmV3IG5hbWUuIEl0J3MgaGVscGZ1bCBmb3Igc2VtYW50aWMgY2xhcml0eSBhbmQgdG8gcmV0YWlu
IAotICBkZWZhdWx0IHNjb3BlIG9yIHRvIHJlZmVyZW5jZSBmcm9tIGFub3RoZXIgYHt7d2l0aH19
YCBibG9jay4KLQotICBgYGBoYW5kbGViYXJzCi0gIC8vIHBvc3RzIG1pZ2h0IG5vdCBiZQotICB7
eyN3aXRoIHVzZXIucG9zdHMgYXMgYmxvZ1Bvc3RzfX0KLSAgICA8ZGl2IGNsYXNzPSJub3RpY2Ui
PgotICAgICAgVGhlcmUgYXJlIHt7YmxvZ1Bvc3RzLmxlbmd0aH19IGJsb2cgcG9zdHMgd3JpdHRl
biBieSB7e3VzZXIubmFtZX19LgotICAgIDwvZGl2PgotCi0gICAge3sjZWFjaCBwb3N0IGluIGJs
b2dQb3N0c319Ci0gICAgICA8bGk+e3twb3N0LnRpdGxlfX08L2xpPgotICAgIHt7L2VhY2h9fQot
ICB7ey93aXRofX0KLSAgYGBgCi0KLSAgV2l0aG91dCB0aGUgYGFzYCBvcGVyYXRvciwgaXQgd291
bGQgYmUgaW1wb3NzaWJsZSB0byByZWZlcmVuY2UgYHVzZXIubmFtZWAgaW4gdGhlIGV4YW1wbGUg
YWJvdmUuCi0KLSAgQG1ldGhvZCB3aXRoCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
Ci0gIEBwYXJhbSB7RnVuY3Rpb259IGNvbnRleHQKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0g
IEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKLSovCi1FbWJlckhhbmRsZWJhcnMucmVnaXN0
ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiB3aXRoSGVscGVyKGNvbnRleHQsIG9wdGlvbnMpIHsK
LSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsKLSAgICB2YXIga2V5d29yZE5hbWUsIHBh
dGgsIHJvb3RQYXRoLCBub3JtYWxpemVkLCBjb250ZXh0UGF0aDsKLQotICAgIEVtYmVyLmFzc2Vy
dCgiSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgd2l0aCBoZWxwZXIs
IGl0IG11c3QgYmUgaW4gdGhlIGZvcm0gI3dpdGggZm9vIGFzIGJhciIsIGFyZ3VtZW50c1sxXSA9
PT0gImFzIik7Ci0gICAgb3B0aW9ucyA9IGFyZ3VtZW50c1szXTsKLSAgICBrZXl3b3JkTmFtZSA9
IGFyZ3VtZW50c1syXTsKLSAgICBwYXRoID0gYXJndW1lbnRzWzBdOwotCi0gICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHdpdGggaGVscGVyIiwgb3B0aW9ucy5m
biAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOwotCi0gICAgdmFyIGxvY2Fs
aXplZE9wdGlvbnMgPSBvX2NyZWF0ZShvcHRpb25zKTsKLSAgICBsb2NhbGl6ZWRPcHRpb25zLmRh
dGEgPSBvX2NyZWF0ZShvcHRpb25zLmRhdGEpOwotICAgIGxvY2FsaXplZE9wdGlvbnMuZGF0YS5r
ZXl3b3JkcyA9IG9fY3JlYXRlKG9wdGlvbnMuZGF0YS5rZXl3b3JkcyB8fCB7fSk7Ci0KLSAgICBp
ZiAoRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7Ci0gICAgICBjb250ZXh0UGF0aCA9IHBhdGg7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKHRoaXMsIHBh
dGgsIG9wdGlvbnMuZGF0YSk7Ci0gICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoOwotICAgICAg
cm9vdFBhdGggPSBub3JtYWxpemVkLnJvb3Q7Ci0KLSAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJv
dW5kIGZvciB0aGUgZmFjdCB0aGF0IHlvdSBjYW5ub3QgYmluZCBzZXBhcmF0ZSBvYmplY3RzCi0g
ICAgICAvLyB0b2dldGhlci4gV2hlbiB3ZSBpbXBsZW1lbnQgdGhhdCBmdW5jdGlvbmFsaXR5LCB3
ZSBzaG91bGQgdXNlIGl0IGhlcmUuCi0gICAgICB2YXIgY29udGV4dEtleSA9IEVtYmVyLiQuZXhw
YW5kbyArIEVtYmVyLmd1aWRGb3Iocm9vdFBhdGgpOwotICAgICAgbG9jYWxpemVkT3B0aW9ucy5k
YXRhLmtleXdvcmRzW2NvbnRleHRLZXldID0gcm9vdFBhdGg7Ci0gICAgICAvLyBpZiB0aGUgcGF0
aCBpcyAnJyAoInRoaXMiKSwganVzdCBiaW5kIGRpcmVjdGx5IHRvIHRoZSBjdXJyZW50IGNvbnRl
eHQKLSAgICAgIGNvbnRleHRQYXRoID0gcGF0aCA/IGNvbnRleHRLZXkgKyAnLicgKyBwYXRoIDog
Y29udGV4dEtleTsKLSAgICB9Ci0KLSAgICBFbWJlci5iaW5kKGxvY2FsaXplZE9wdGlvbnMuZGF0
YS5rZXl3b3Jkcywga2V5d29yZE5hbWUsIGNvbnRleHRQYXRoKTsKLQotICAgIHJldHVybiBiaW5k
LmNhbGwodGhpcywgcGF0aCwgbG9jYWxpemVkT3B0aW9ucywgdHJ1ZSwgZXhpc3RzKTsKLSAgfSBl
bHNlIHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1l
bnQgdG8gdGhlIHdpdGggaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gICAgRW1i
ZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHdpdGggaGVscGVyIiwgb3B0
aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOwotICAgIHJldHVy
biBoZWxwZXJzLmJpbmQuY2FsbChvcHRpb25zLmNvbnRleHRzWzBdLCBjb250ZXh0LCBvcHRpb25z
KTsKLSAgfQotfSk7Ci0KLQotLyoqCi0gIFNlZSBbYm91bmRJZl0oL2FwaS9jbGFzc2VzL0VtYmVy
LkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF9ib3VuZElmKQotCi0gIEBtZXRob2QgaWYK
LSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY29u
dGV4dAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0
cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiBp
ZkhlbHBlcihjb250ZXh0LCBvcHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFz
cyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUgaWYgaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0
aCA9PT0gMik7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhIGJsb2NrIHRvIHRoZSBp
ZiBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9v
cCk7Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0s
IGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8qKgotICBAbWV0aG9kIHVubGVzcwotICBAZm9y
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBjb250ZXh0Ci0g
IEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0q
LwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbiB1bmxl
c3NIZWxwZXIoY29udGV4dCwgb3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBh
c3MgZXhhY3RseSBvbmUgYXJndW1lbnQgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBhcmd1bWVudHMu
bGVuZ3RoID09PSAyKTsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8g
dGhlIHVubGVzcyBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJh
cnMuVk0ubm9vcCk7Ci0KLSAgdmFyIGZuID0gb3B0aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMu
aW52ZXJzZTsKLQotICBvcHRpb25zLmZuID0gaW52ZXJzZTsKLSAgb3B0aW9ucy5pbnZlcnNlID0g
Zm47Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0s
IGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8qKgotICBgYmluZC1hdHRyYCBhbGxvd3MgeW91
IHRvIGNyZWF0ZSBhIGJpbmRpbmcgYmV0d2VlbiBET00gZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAot
ICBFbWJlciBvYmplY3RzLiBGb3IgZXhhbXBsZToKLQotICBgYGBoYW5kbGViYXJzCi0gIDxpbWcg
e3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVybCIgYWx0PSJpbWFnZVRpdGxlIn19PgotICBgYGAKLQot
ICBUaGUgYWJvdmUgaGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxsIGZpbGwgdGhlIGA8aW1nPmAncyBg
c3JjYCBhdHRyaWJ1dGUgd2lsbAotICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5j
ZWQgd2l0aCBgImltYWdlVXJsImAgYW5kIGl0cyBgYWx0YAotICBhdHRyaWJ1dGUgd2l0aCB0aGUg
dmFsdWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgd2l0aCBgImltYWdlVGl0bGUiYC4KLQot
ICBJZiB0aGUgcmVuZGVyaW5nIGNvbnRleHQgb2YgdGhpcyB0ZW1wbGF0ZSBpcyB0aGUgZm9sbG93
aW5nIG9iamVjdDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHsKLSAgICBpbWFnZVVybDogJ2h0dHA6
Ly9sb2xjYXRzLmluZm8vaGF6LWEtZnVubnknLAotICAgIGltYWdlVGl0bGU6ICdBIGh1bW9yb3Vz
IGltYWdlIG9mIGEgY2F0JwotICB9Ci0gIGBgYAotCi0gIFRoZSByZXN1bHRpbmcgSFRNTCBvdXRw
dXQgd2lsbCBiZToKLQotICBgYGBodG1sCi0gIDxpbWcgc3JjPSJodHRwOi8vbG9sY2F0cy5pbmZv
L2hhei1hLWZ1bm55IiBhbHQ9IkEgaHVtb3JvdXMgaW1hZ2Ugb2YgYSBjYXQiPgotICBgYGAKLQot
ICBgYmluZC1hdHRyYCBjYW5ub3QgcmVkZWNsYXJlIGV4aXN0aW5nIERPTSBlbGVtZW50IGF0dHJp
YnV0ZXMuIFRoZSB1c2Ugb2YgYHNyY2AKLSAgaW4gdGhlIGZvbGxvd2luZyBgYmluZC1hdHRyYCBl
eGFtcGxlIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIGhhcmQgY29kZWQgdmFsdWUKLSAgb2YgYHNy
Yz0iL2ZhaWx3aGFsZS5naWYiYCB3aWxsIHRha2UgcHJlY2VkZW5jZToKLQotICBgYGBoYW5kbGVi
YXJzCi0gIDxpbWcgc3JjPSIvZmFpbHdoYWxlLmdpZiIge3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVy
bCIgYWx0PSJpbWFnZVRpdGxlIn19PgotICBgYGAKLQotICAjIyMgYGJpbmQtYXR0cmAgYW5kIHRo
ZSBgY2xhc3NgIGF0dHJpYnV0ZQotCi0gIGBiaW5kLWF0dHJgIHN1cHBvcnRzIGEgc3BlY2lhbCBz
eW50YXggZm9yIGhhbmRsaW5nIGEgbnVtYmVyIG9mIGNhc2VzIHVuaXF1ZQotICB0byB0aGUgYGNs
YXNzYCBET00gZWxlbWVudCBhdHRyaWJ1dGUuIFRoZSBgY2xhc3NgIGF0dHJpYnV0ZSBjb21iaW5l
cwotICBtdWx0aXBsZSBkaXNjcmV0ZSB2YWx1ZXMgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUgYXMg
YSBzcGFjZS1kZWxpbWl0ZWQKLSAgbGlzdCBvZiBzdHJpbmdzLiBFYWNoIHN0cmluZyBjYW4gYmU6
Ci0KLSAgKiBhIHN0cmluZyByZXR1cm4gdmFsdWUgb2YgYW4gb2JqZWN0J3MgcHJvcGVydHkuCi0g
ICogYSBib29sZWFuIHJldHVybiB2YWx1ZSBvZiBhbiBvYmplY3QncyBwcm9wZXJ0eQotICAqIGEg
aGFyZC1jb2RlZCB2YWx1ZQotCi0gIEEgc3RyaW5nIHJldHVybiB2YWx1ZSB3b3JrcyBpZGVudGlj
YWxseSB0byBvdGhlciB1c2VzIG9mIGBiaW5kLWF0dHJgLiBUaGUKLSAgcmV0dXJuIHZhbHVlIG9m
IHRoZSBwcm9wZXJ0eSB3aWxsIGJlY29tZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gRm9y
Ci0gIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdmlldyBhbmQgdGVtcGxhdGU6Ci0KLSAgYGBgamF2
YXNjcmlwdAotICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgc29tZVByb3Bl
cnR5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICJhVmFsdWUiOwotICAgICAgfS5wcm9w
ZXJ0eSgpCi0gICAgfSkKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1h
dHRyIGNsYXNzPSJ2aWV3LnNvbWVQcm9wZXJ0eX19PgotICBgYGAKLQotICBSZXN1bHQgaW4gdGhl
IGZvbGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8aW1nIGNsYXNzPSJh
VmFsdWUiPgotICBgYGAKLQotICBBIGJvb2xlYW4gcmV0dXJuIHZhbHVlIHdpbGwgaW5zZXJ0IGEg
c3BlY2lmaWVkIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5Ci0gIHJldHVybnMgYHRydWVgIGFu
ZCByZW1vdmUgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IHJldHVybnMgYGZhbHNlYC4K
LQotICBBIGNsYXNzIG5hbWUgaXMgcHJvdmlkZWQgdmlhIHRoZSBzeW50YXgKLSAgYHNvbWVQcm9w
ZXJ0eU5hbWU6Y2xhc3MtbmFtZS1pZi10cnVlYC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHNvbWVCb29sOiB0cnVlCi0gIH0pCi0gIGBgYAot
Ci0gIGBgYGhhbmRsZWJhcnMKLSAgPGltZyB7e2JpbmQtYXR0ciBjbGFzcz0idmlldy5zb21lQm9v
bDpjbGFzcy1uYW1lLWlmLXRydWUifX0+Ci0gIGBgYAotCi0gIFJlc3VsdCBpbiB0aGUgZm9sbG93
aW5nIHJlbmRlcmVkIG91dHB1dDoKLQotICBgYGBodG1sCi0gIDxpbWcgY2xhc3M9ImNsYXNzLW5h
bWUtaWYtdHJ1ZSI+Ci0gIGBgYAotCi0gIEFuIGFkZGl0aW9uYWwgc2VjdGlvbiBvZiB0aGUgYmlu
ZGluZyBjYW4gYmUgcHJvdmlkZWQgaWYgeW91IHdhbnQgdG8KLSAgcmVwbGFjZSB0aGUgZXhpc3Rp
bmcgY2xhc3MgaW5zdGVhZCBvZiByZW1vdmluZyBpdCB3aGVuIHRoZSBib29sZWFuCi0gIHZhbHVl
IGNoYW5nZXM6Ci0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSJ2
aWV3LnNvbWVCb29sOmNsYXNzLW5hbWUtaWYtdHJ1ZTpjbGFzcy1uYW1lLWlmLWZhbHNlIn19Pgot
ICBgYGAKLQotICBBIGhhcmQtY29kZWQgdmFsdWUgY2FuIGJlIHVzZWQgYnkgcHJlcGVuZGluZyBg
OmAgdG8gdGhlIGRlc2lyZWQKLSAgY2xhc3MgbmFtZTogYDpjbGFzcy1uYW1lLXRvLWFsd2F5cy1h
cHBseWAuCi0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6Y2xh
c3MtbmFtZS10by1hbHdheXMtYXBwbHkifX0+Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIGZv
bGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8aW1nIGNsYXNzPSJjbGFz
cy1uYW1lLXRvLWFsd2F5cy1hcHBseSI+Ci0gIGBgYAotCi0gIEFsbCB0aHJlZSBzdHJhdGVnaWVz
IC0gc3RyaW5nIHJldHVybiB2YWx1ZSwgYm9vbGVhbiByZXR1cm4gdmFsdWUsIGFuZAotICBoYXJk
LWNvZGVkIHZhbHVlIOKAkyBjYW4gYmUgY29tYmluZWQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb246
Ci0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6Y2xhc3MtbmFt
ZS10by1hbHdheXMtYXBwbHkgdmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRydWUgdmlldy5z
b21lUHJvcGVydHkifX0+Ci0gIGBgYAotCi0gIEBtZXRob2QgYmluZC1hdHRyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJu
IHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdiaW5kLWF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhlbHBlcihvcHRpb25zKSB7Ci0KLSAgdmFy
IGF0dHJzID0gb3B0aW9ucy5oYXNoOwotCi0gIEVtYmVyLmFzc2VydCgiWW91IG11c3Qgc3BlY2lm
eSBhdCBsZWFzdCBvbmUgaGFzaCBhcmd1bWVudCB0byBiaW5kLWF0dHIiLCAhIUVtYmVyLmtleXMo
YXR0cnMpLmxlbmd0aCk7Ci0KLSAgdmFyIHZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgdmFy
IHJldCA9IFtdOwotICB2YXIgY3R4ID0gdGhpczsKLQotICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBp
ZCBmb3IgdGhpcyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYWRkZWQgYXMgYQotICAvLyBkYXRhIGF0
dHJpYnV0ZSB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIHdoZW4KLSAgLy8g
dGhlIGJvdW5kIHByb3BlcnR5IGNoYW5nZXMuCi0gIHZhciBkYXRhSWQgPSArK0VtYmVyLnV1aWQ7
Ci0KLSAgLy8gSGFuZGxlIGNsYXNzZXMgZGlmZmVyZW50bHksIGFzIHdlIGNhbiBiaW5kIG11bHRp
cGxlIGNsYXNzZXMKLSAgdmFyIGNsYXNzQmluZGluZ3MgPSBhdHRyc1snY2xhc3MnXTsKLSAgaWYg
KGNsYXNzQmluZGluZ3MgIT0gbnVsbCkgewotICAgIHZhciBjbGFzc1Jlc3VsdHMgPSBFbWJlckhh
bmRsZWJhcnMuYmluZENsYXNzZXModGhpcywgY2xhc3NCaW5kaW5ncywgdmlldywgZGF0YUlkLCBv
cHRpb25zKTsKLQotICAgIHJldC5wdXNoKCdjbGFzcz0iJyArIEhhbmRsZWJhcnMuVXRpbHMuZXNj
YXBlRXhwcmVzc2lvbihjbGFzc1Jlc3VsdHMuam9pbignICcpKSArICciJyk7Ci0gICAgZGVsZXRl
IGF0dHJzWydjbGFzcyddOwotICB9Ci0KLSAgdmFyIGF0dHJLZXlzID0gRW1iZXIua2V5cyhhdHRy
cyk7Ci0KLSAgLy8gRm9yIGVhY2ggYXR0cmlidXRlIHBhc3NlZCwgY3JlYXRlIGFuIG9ic2VydmVy
IGFuZCBlbWl0IHRoZQotICAvLyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBhbiBh
dHRyaWJ1dGUuCi0gIGZvckVhY2guY2FsbChhdHRyS2V5cywgZnVuY3Rpb24oYXR0cikgewotICAg
IHZhciBwYXRoID0gYXR0cnNbYXR0cl0sCi0gICAgICAgIG5vcm1hbGl6ZWQ7Ci0KLSAgICBFbWJl
ci5hc3NlcnQoZm10KCJZb3UgbXVzdCBwcm92aWRlIGFuIGV4cHJlc3Npb24gYXMgdGhlIHZhbHVl
IG9mIGJvdW5kIGF0dHJpYnV0ZS4gWW91IHNwZWNpZmllZDogJUA9JUAiLCBbYXR0ciwgcGF0aF0p
LCB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpOwotCi0gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6
ZVBhdGgoY3R4LCBwYXRoLCBvcHRpb25zLmRhdGEpOwotCi0gICAgdmFyIHZhbHVlID0gKHBhdGgg
PT09ICd0aGlzJykgPyBub3JtYWxpemVkLnJvb3QgOiBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwg
b3B0aW9ucyksCi0gICAgICAgIHR5cGUgPSBFbWJlci50eXBlT2YodmFsdWUpOwotCi0gICAgRW1i
ZXIuYXNzZXJ0KGZtdCgiQXR0cmlidXRlcyBtdXN0IGJlIG51bWJlcnMsIHN0cmluZ3Mgb3IgYm9v
bGVhbnMsIG5vdCAlQCIsIFt2YWx1ZV0pLCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5k
ZWZpbmVkIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUg
PT09ICdib29sZWFuJyk7Ci0KLSAgICB2YXIgb2JzZXJ2ZXIsIGludm9rZXI7Ci0KLSAgICBvYnNl
cnZlciA9IGZ1bmN0aW9uIG9ic2VydmVyKCkgewotICAgICAgdmFyIHJlc3VsdCA9IGhhbmRsZWJh
cnNHZXQoY3R4LCBwYXRoLCBvcHRpb25zKTsKLQotICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiQXR0
cmlidXRlcyBtdXN0IGJlIG51bWJlcnMsIHN0cmluZ3Mgb3IgYm9vbGVhbnMsIG5vdCAlQCIsIFty
ZXN1bHRdKSwKLSAgICAgICAgICAgICAgICAgICByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09
PSB1bmRlZmluZWQgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicgfHwKLSAgICAgICAgICAg
ICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiByZXN1bHQgPT09
ICdib29sZWFuJyk7Ci0KLSAgICAgIHZhciBlbGVtID0gdmlldy4kKCJbZGF0YS1iaW5kYXR0ci0i
ICsgZGF0YUlkICsgIj0nIiArIGRhdGFJZCArICInXSIpOwotCi0gICAgICAvLyBJZiB3ZSBhcmVu
J3QgYWJsZSB0byBmaW5kIHRoZSBlbGVtZW50LCBpdCBtZWFucyB0aGUgZWxlbWVudAotICAgICAg
Ly8gdG8gd2hpY2ggd2Ugd2VyZSBib3VuZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHZpZXcu
Ci0gICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGNhbiBhc3N1bWUgdGhlIHRlbXBsYXRlIGhhcyBi
ZWVuIHJlLXJlbmRlcmVkCi0gICAgICAvLyBhbmQgd2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgb2Jz
ZXJ2ZXIuCi0gICAgICBpZiAoIWVsZW0gfHwgZWxlbS5sZW5ndGggPT09IDApIHsKLSAgICAgICAg
RW1iZXIucmVtb3ZlT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVkLnBhdGgsIGlu
dm9rZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIEVtYmVyLlZpZXcuYXBw
bHlBdHRyaWJ1dGVCaW5kaW5ncyhlbGVtLCBhdHRyLCByZXN1bHQpOwotICAgIH07Ci0KLSAgICAv
LyBBZGQgYW4gb2JzZXJ2ZXIgdG8gdGhlIHZpZXcgZm9yIHdoZW4gdGhlIHByb3BlcnR5IGNoYW5n
ZXMuCi0gICAgLy8gV2hlbiB0aGUgb2JzZXJ2ZXIgZmlyZXMsIGZpbmQgdGhlIGVsZW1lbnQgdXNp
bmcgdGhlCi0gICAgLy8gdW5pcXVlIGRhdGEgaWQgYW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRv
IHRoZSBuZXcgdmFsdWUuCi0gICAgLy8gTm90ZTogZG9uJ3QgYWRkIG9ic2VydmVyIHdoZW4gcGF0
aCBpcyAndGhpcycgb3IgcGF0aAotICAgIC8vIGlzIHdob2xlIGtleXdvcmQgZS5nLiB7eyNlYWNo
IHggaW4gbGlzdH19IC4uLiB7e2JpbmQtYXR0ciBhdHRyPSJ4In19Ci0gICAgaWYgKHBhdGggIT09
ICd0aGlzJyAmJiAhKG5vcm1hbGl6ZWQuaXNLZXl3b3JkICYmIG5vcm1hbGl6ZWQucGF0aCA9PT0g
JycgKSkgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9y
bWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhpcyBjaGFuZ2Vz
LCBhbHNvIGNoYW5nZSB0aGUgbG9naWMgaW4gZW1iZXItdmlld3MvbGliL3ZpZXdzL3ZpZXcuanMK
LSAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8ICh0eXBlID09PSAnbnVtYmVyJyAmJiAhaXNO
YU4odmFsdWUpKSkpIHsKLSAgICAgIHJldC5wdXNoKGF0dHIgKyAnPSInICsgSGFuZGxlYmFycy5V
dGlscy5lc2NhcGVFeHByZXNzaW9uKHZhbHVlKSArICciJyk7Ci0gICAgfSBlbHNlIGlmICh2YWx1
ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHsKLSAgICAgIC8vIFRoZSBkZXZlbG9wZXIgY29udHJv
bHMgdGhlIGF0dHIgbmFtZSwgc28gaXQgc2hvdWxkIGFsd2F5cyBiZSBzYWZlCi0gICAgICByZXQu
cHVzaChhdHRyICsgJz0iJyArIGF0dHIgKyAnIicpOwotICAgIH0KLSAgfSwgdGhpcyk7Ci0KLSAg
Ly8gQWRkIHRoZSB1bmlxdWUgaWRlbnRpZmllcgotICAvLyBOT1RFOiBXZSB1c2UgYWxsIGxvd2Vy
LWNhc2Ugc2luY2UgRmlyZWZveCBoYXMgcHJvYmxlbXMgd2l0aCBtaXhlZCBjYXNlIGluIFNWRwot
ICByZXQucHVzaCgnZGF0YS1iaW5kYXR0ci0nICsgZGF0YUlkICsgJz0iJyArIGRhdGFJZCArICci
Jyk7Ci0gIHJldHVybiBuZXcgRW1iZXJIYW5kbGViYXJzLlNhZmVTdHJpbmcocmV0LmpvaW4oJyAn
KSk7Ci19KTsKLQotLyoqCi0gIFNlZSBgYmluZC1hdHRyYAotCi0gIEBtZXRob2QgYmluZEF0dHIK
LSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQGRlcHJlY2F0ZWQKLSAgQHBhcmFt
IHtGdW5jdGlvbn0gY29udGV4dAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7
U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
YmluZEF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhlbHBlcigpIHsKLSAgRW1iZXIud2FybigiVGhl
ICdiaW5kQXR0cicgdmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnYmluZC1h
dHRyJyIpOwotICByZXR1cm4gRW1iZXJIYW5kbGViYXJzLmhlbHBlcnNbJ2JpbmQtYXR0ciddLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci19KTsKLQotLyoqCi0gIEhlbHBlciB0aGF0LCBnaXZlbiBh
IHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgYW5kIGEgY29udGV4dCwK
LSAgcmV0dXJucyBhbiBhcnJheSBvZiBjbGFzcyBuYW1lcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBh
bHNvIGhhcyB0aGUgc2lkZQotICBlZmZlY3Qgb2Ygc2V0dGluZyB1cCBvYnNlcnZlcnMgYXQgdGhv
c2UgcHJvcGVydHkgcGF0aHMsIHN1Y2ggdGhhdCBpZiB0aGV5Ci0gIGNoYW5nZSwgdGhlIGNvcnJl
Y3QgY2xhc3MgbmFtZSB3aWxsIGJlIHJlYXBwbGllZCB0byB0aGUgRE9NIGVsZW1lbnQuCi0KLSAg
Rm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgImZvb0JhciIsIGl0IHdpbGwgZmly
c3QgbG9vayB1cCB0aGUKLSAgImZvb0JhciIgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoYXQg
dmFsdWUgaXMgdHJ1ZSwgaXQgd2lsbCBhZGQgdGhlCi0gICJmb28tYmFyIiBjbGFzcyB0byB0aGUg
Y3VycmVudCBlbGVtZW50IChpLmUuLCB0aGUgZGFzaGVyaXplZCBmb3JtIG9mCi0gICJmb29CYXIi
KS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGFkZCB0aGF0IHN0cmluZyBhcyB0
aGUgY2xhc3MuCi0gIE90aGVyd2lzZSwgaXQgd2lsbCBub3QgYWRkIGFueSBuZXcgY2xhc3MgbmFt
ZS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGJpbmRDbGFzc2VzCi0gIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycwotICBAcGFyYW0ge0VtYmVyLk9iamVjdH0gY29udGV4dCBUaGUgY29udGV4dCBmcm9t
IHdoaWNoIHRvIGxvb2t1cCBwcm9wZXJ0aWVzCi0gIEBwYXJhbSB7U3RyaW5nfSBjbGFzc0JpbmRp
bmdzIEEgc3RyaW5nLCBzcGFjZS1zZXBhcmF0ZWQsIG9mIGNsYXNzIGJpbmRpbmdzCi0gICAgdG8g
dXNlCi0gIEBwYXJhbSB7RW1iZXIuVmlld30gdmlldyBUaGUgdmlldyBpbiB3aGljaCBvYnNlcnZl
cnMgc2hvdWxkIGxvb2sgZm9yIHRoZQotICAgIGVsZW1lbnQgdG8gdXBkYXRlCi0gIEBwYXJhbSB7
U3J0aW5nfSBiaW5kQXR0cklkIE9wdGlvbmFsIGJpbmRBdHRyIGlkIHVzZWQgdG8gbG9va3VwIGVs
ZW1lbnRzCi0gIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjbGFzcyBuYW1lcyB0byBhZGQK
LSovCi1FbWJlckhhbmRsZWJhcnMuYmluZENsYXNzZXMgPSBmdW5jdGlvbihjb250ZXh0LCBjbGFz
c0JpbmRpbmdzLCB2aWV3LCBiaW5kQXR0cklkLCBvcHRpb25zKSB7Ci0gIHZhciByZXQgPSBbXSwg
bmV3Q2xhc3MsIHZhbHVlLCBlbGVtOwotCi0gIC8vIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUg
dGhlIHByb3BlcnR5IGZyb20gdGhlIGNvbnRleHQgYW5kCi0gIC8vIGRldGVybWluZSB3aGljaCBj
bGFzcyBzdHJpbmcgdG8gcmV0dXJuLCBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzCi0gIC8vIGEgQm9v
bGVhbiBvciBub3QuCi0gIHZhciBjbGFzc1N0cmluZ0ZvclBhdGggPSBmdW5jdGlvbihyb290LCBw
YXJzZWRQYXRoLCBvcHRpb25zKSB7Ci0gICAgdmFyIHZhbCwKLSAgICAgICAgcGF0aCA9IHBhcnNl
ZFBhdGgucGF0aDsKLQotICAgIGlmIChwYXRoID09PSAndGhpcycpIHsKLSAgICAgIHZhbCA9IHJv
b3Q7Ci0gICAgfSBlbHNlIGlmIChwYXRoID09PSAnJykgewotICAgICAgdmFsID0gdHJ1ZTsKLSAg
ICB9IGVsc2UgewotICAgICAgdmFsID0gaGFuZGxlYmFyc0dldChyb290LCBwYXRoLCBvcHRpb25z
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShw
YXRoLCB2YWwsIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1l
KTsKLSAgfTsKLQotICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSBwYXNzZWQsIGxvb3AgdGhyb3VnaCBh
bmQgc2V0dXAKLSAgLy8gYW4gb2JzZXJ2ZXIuCi0gIGZvckVhY2guY2FsbChjbGFzc0JpbmRpbmdz
LnNwbGl0KCcgJyksIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLQotICAgIC8vIFZhcmlhYmxlIGluIHdo
aWNoIHRoZSBvbGQgY2xhc3MgdmFsdWUgaXMgc2F2ZWQuIFRoZSBvYnNlcnZlciBmdW5jdGlvbgot
ICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFibGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmlu
ZyB0byByZW1vdmUgd2hlbgotICAgIC8vIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLgotICAgIHZhciBv
bGRDbGFzczsKLQotICAgIHZhciBvYnNlcnZlciwgaW52b2tlcjsKLQotICAgIHZhciBwYXJzZWRQ
YXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoYmluZGluZyksCi0gICAgICAgIHBh
dGggPSBwYXJzZWRQYXRoLnBhdGgsCi0gICAgICAgIHBhdGhSb290ID0gY29udGV4dCwKLSAgICAg
ICAgbm9ybWFsaXplZDsKLQotICAgIGlmIChwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAndGhpcycp
IHsKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRleHQsIHBhdGgsIG9wdGlv
bnMuZGF0YSk7Ci0KLSAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290OwotICAgICAgcGF0
aCA9IG5vcm1hbGl6ZWQucGF0aDsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdXAgYW4gb2JzZXJ2ZXIg
b24gdGhlIGNvbnRleHQuIElmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0b2dnbGUgdGhlCi0gICAg
Ly8gY2xhc3MgbmFtZS4KLSAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgLy8gR2V0
IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAgbmV3Q2xhc3MgPSBjbGFz
c1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFyc2VkUGF0aCwgb3B0aW9ucyk7Ci0gICAgICBlbGVt
ID0gYmluZEF0dHJJZCA/IHZpZXcuJCgiW2RhdGEtYmluZGF0dHItIiArIGJpbmRBdHRySWQgKyAi
PSciICsgYmluZEF0dHJJZCArICInXSIpIDogdmlldy4kKCk7Ci0KLSAgICAgIC8vIElmIHdlIGNh
bid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwgYSBwYXJlbnQgdGVtcGxhdGUgaGFzIGJlZW4K
LSAgICAgIC8vIHJlLXJlbmRlcmVkIGFuZCB3ZSd2ZSBiZWVuIG51a2VkLiBSZW1vdmUgdGhlIG9i
c2VydmVyLgotICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3RoID09PSAwKSB7Ci0gICAgICAg
IEVtYmVyLnJlbW92ZU9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBpbnZva2VyKTsKLSAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8g
dGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KLSAgICAgICAgaWYgKG9sZENsYXNzKSB7Ci0gICAgICAg
ICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJ
ZiBuZWNlc3NhcnksIGFkZCBhIG5ldyBjbGFzcy4gTWFrZSBzdXJlIHdlIGtlZXAgdHJhY2sgb2Yg
aXQgc28KLSAgICAgICAgLy8gaXQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAg
ICAgaWYgKG5ld0NsYXNzKSB7Ci0gICAgICAgICAgZWxlbS5hZGRDbGFzcyhuZXdDbGFzcyk7Ci0g
ICAgICAgICAgb2xkQ2xhc3MgPSBuZXdDbGFzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICBvbGRDbGFzcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0gICAgaWYg
KHBhdGggIT09ICcnICYmIHBhdGggIT09ICd0aGlzJykgewotICAgICAgdmlldy5yZWdpc3Rlck9i
c2VydmVyKHBhdGhSb290LCBwYXRoLCBvYnNlcnZlcik7Ci0gICAgfQotCi0gICAgLy8gV2UndmUg
YWxyZWFkeSBzZXR1cCB0aGUgb2JzZXJ2ZXI7IG5vdyB3ZSBqdXN0IG5lZWQgdG8gZmlndXJlIG91
dCB0aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIHJpZ2h0IG5vdyBvbiB0aGUgZmlyc3QgcGFz
cyB0aHJvdWdoLgotICAgIHZhbHVlID0gY2xhc3NTdHJpbmdGb3JQYXRoKGNvbnRleHQsIHBhcnNl
ZFBhdGgsIG9wdGlvbnMpOwotCi0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICByZXQucHVzaCh2YWx1
ZSk7Ci0KLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzYXZlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHRo
YXQgaXQgY2FuIGJlIHJlbW92ZWQgaWYgdGhlCi0gICAgICAvLyBvYnNlcnZlciBmaXJlcy4KLSAg
ICAgIG9sZENsYXNzID0gdmFsdWU7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gcmV0OwotfTsK
LQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8K
LQotLy8gVE9ETzogRG9uJ3QgcmVxdWlyZSB0aGUgZW50aXJlIG1vZHVsZQotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBFbWJlckhhbmRsZWJhcnMgPSBFbWJlci5IYW5k
bGViYXJzOwotdmFyIExPV0VSQ0FTRV9BX1ogPSAvXlthLXpdLzsKLXZhciBWSUVXX1BSRUZJWCA9
IC9edmlld1wuLzsKLQotZnVuY3Rpb24gbWFrZUJpbmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25z
KSB7Ci0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLAotICAgICAgaGFzaFR5cGUgPSBvcHRpb25z
Lmhhc2hUeXBlczsKLQotICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICBpZiAoaGFzaFR5
cGVbcHJvcF0gPT09ICdJRCcpIHsKLQotICAgICAgdmFyIHZhbHVlID0gaGFzaFtwcm9wXTsKLQot
ICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChwcm9wKSkgewotICAgICAgICBFbWJlci53
YXJuKCJZb3UncmUgYXR0ZW1wdGluZyB0byByZW5kZXIgYSB2aWV3IGJ5IHBhc3NpbmcgIiArIHBy
b3AgKyAiPSIgKyB2YWx1ZSArICIgdG8gYSB2aWV3IGhlbHBlciwgYnV0IHRoaXMgc3ludGF4IGlz
IGFtYmlndW91cy4gWW91IHNob3VsZCBlaXRoZXIgc3Vycm91bmQgIiArIHZhbHVlICsgIiBpbiBx
dW90ZXMgb3IgcmVtb3ZlIGBCaW5kaW5nYCBmcm9tICIgKyBwcm9wICsgIi4iKTsKLSAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGhhc2hbcHJvcCArICdCaW5kaW5nJ10gPSB2YWx1ZTsKLSAgICAgICAg
aGFzaFR5cGVbcHJvcCArICdCaW5kaW5nJ10gPSAnU1RSSU5HJzsKLSAgICAgICAgZGVsZXRlIGhh
c2hbcHJvcF07Ci0gICAgICAgIGRlbGV0ZSBoYXNoVHlwZVtwcm9wXTsKLSAgICAgIH0KLSAgICB9
Ci0gIH0KLQotICBpZiAoaGFzaC5oYXNPd25Qcm9wZXJ0eSgnaWRCaW5kaW5nJykpIHsKLSAgICAv
LyBpZCBjYW4ndCBiZSBib3VuZCwgc28ganVzdCBwZXJmb3JtIG9uZS10aW1lIGxvb2t1cC4KLSAg
ICBoYXNoLmlkID0gRW1iZXJIYW5kbGViYXJzLmdldCh0aGlzQ29udGV4dCwgaGFzaC5pZEJpbmRp
bmcsIG9wdGlvbnMpOwotICAgIGhhc2hUeXBlLmlkID0gJ1NUUklORyc7Ci0gICAgZGVsZXRlIGhh
c2guaWRCaW5kaW5nOwotICAgIGRlbGV0ZSBoYXNoVHlwZS5pZEJpbmRpbmc7Ci0gIH0KLX0KLQot
RW1iZXJIYW5kbGViYXJzLlZpZXdIZWxwZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKLQotICBw
cm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdmFyIGhh
c2ggPSBvcHRpb25zLmhhc2gsIGRhdGEgPSBvcHRpb25zLmRhdGE7Ci0gICAgdmFyIGV4dGVuc2lv
bnMgPSB7fSwKLSAgICAgICAgY2xhc3NlcyA9IGhhc2hbJ2NsYXNzJ10sCi0gICAgICAgIGR1cCA9
IGZhbHNlOwotCi0gICAgaWYgKGhhc2guaWQpIHsKLSAgICAgIGV4dGVuc2lvbnMuZWxlbWVudElk
ID0gaGFzaC5pZDsKLSAgICAgIGR1cCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGhhc2gudGFn
KSB7Ci0gICAgICBleHRlbnNpb25zLnRhZ05hbWUgPSBoYXNoLnRhZzsKLSAgICAgIGR1cCA9IHRy
dWU7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzZXMpIHsKLSAgICAgIGNsYXNzZXMgPSBjbGFzc2Vz
LnNwbGl0KCcgJyk7Ci0gICAgICBleHRlbnNpb25zLmNsYXNzTmFtZXMgPSBjbGFzc2VzOwotICAg
ICAgZHVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzaC5jbGFzc0JpbmRpbmcpIHsKLSAg
ICAgIGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MgPSBoYXNoLmNsYXNzQmluZGluZy5zcGxp
dCgnICcpOwotICAgICAgZHVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzaC5jbGFzc05h
bWVCaW5kaW5ncykgewotICAgICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MgPT09
IHVuZGVmaW5lZCkgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IFtdOwotICAgICAgZXh0
ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3Mu
Y29uY2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKSk7Ci0gICAgICBkdXAgPSB0
cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNoLmF0dHJpYnV0ZUJpbmRpbmdzKSB7Ci0gICAgICBF
bWJlci5hc3NlcnQoIlNldHRpbmcgJ2F0dHJpYnV0ZUJpbmRpbmdzJyB2aWEgSGFuZGxlYmFycyBp
cyBub3QgYWxsb3dlZC4gUGxlYXNlIHN1YmNsYXNzIEVtYmVyLlZpZXcgYW5kIHNldCBpdCB0aGVy
ZSBpbnN0ZWFkLiIpOwotICAgICAgZXh0ZW5zaW9ucy5hdHRyaWJ1dGVCaW5kaW5ncyA9IG51bGw7
Ci0gICAgICBkdXAgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChkdXApIHsKLSAgICAgIGhhc2gg
PSBFbWJlci4kLmV4dGVuZCh7fSwgaGFzaCk7Ci0gICAgICBkZWxldGUgaGFzaC5pZDsKLSAgICAg
IGRlbGV0ZSBoYXNoLnRhZzsKLSAgICAgIGRlbGV0ZSBoYXNoWydjbGFzcyddOwotICAgICAgZGVs
ZXRlIGhhc2guY2xhc3NCaW5kaW5nOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcHJvcGVyIGNv
bnRleHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQgdG8gdGhlIGhlbHBlci4gVGhpcyBhcHBsaWVz
IHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzCi0gICAgLy8gYXMgd2VsbCBhcyBjbGFzcyBu
YW1lIGJpbmRpbmdzLiBJZiB0aGUgYmluZGluZ3MgYXJlIGxvY2FsLCBtYWtlIHRoZW0gcmVsYXRp
dmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dAotICAgIC8vIGluc3RlYWQgb2YgdGhlIHZpZXcuCi0g
ICAgdmFyIHBhdGg7Ci0KLSAgICAvLyBFdmFsdWF0ZSB0aGUgY29udGV4dCBvZiByZWd1bGFyIGF0
dHJpYnV0ZSBiaW5kaW5nczoKLSAgICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICAgIGlm
ICghaGFzaC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZTsgfQotCi0gICAgICAvLyBU
ZXN0IGlmIHRoZSBwcm9wZXJ0eSBlbmRzIGluICJCaW5kaW5nIgotICAgICAgaWYgKEVtYmVyLklT
X0JJTkRJTkcudGVzdChwcm9wKSAmJiB0eXBlb2YgaGFzaFtwcm9wXSA9PT0gJ3N0cmluZycpIHsK
LSAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKGhhc2hbcHJvcF0s
IGRhdGEpOwotICAgICAgICBpZiAocGF0aCkgeyBoYXNoW3Byb3BdID0gcGF0aDsgfQotICAgICAg
fQotICAgIH0KLQotICAgIC8vIEV2YWx1YXRlIHRoZSBjb250ZXh0IG9mIGNsYXNzIG5hbWUgYmlu
ZGluZ3M6Ci0gICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MpIHsKLSAgICAgIGZv
ciAodmFyIGIgaW4gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncykgewotICAgICAgICB2YXIg
ZnVsbCA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3NbYl07Ci0gICAgICAgIGlmICh0eXBl
b2YgZnVsbCA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICAvLyBDb250ZXh0dWFsaXplIHRoZSBw
YXRoIG9mIGNsYXNzTmFtZUJpbmRpbmcgc28gdGhpczoKLSAgICAgICAgICAvLwotICAgICAgICAg
IC8vICAgICBjbGFzc05hbWVCaW5kaW5nPSJpc0dyZWVuOmdyZWVuIgotICAgICAgICAgIC8vCi0g
ICAgICAgICAgLy8gaXMgY29udmVydGVkIHRvIHRoaXM6Ci0gICAgICAgICAgLy8KLSAgICAgICAg
ICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0iX3BhcmVudFZpZXcuY29udGV4dC5pc0dyZWVuOmdy
ZWVuIgotICAgICAgICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0
eVBhdGgoZnVsbCk7Ci0gICAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQ
YXRoKHBhcnNlZFBhdGgucGF0aCwgZGF0YSk7Ci0gICAgICAgICAgaWYgKHBhdGgpIHsgZXh0ZW5z
aW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXSA9IHBhdGggKyBwYXJzZWRQYXRoLmNsYXNzTmFtZXM7
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBFbWJlci4kLmV4dGVu
ZChoYXNoLCBleHRlbnNpb25zKTsKLSAgfSwKLQotICAvLyBUcmFuc2Zvcm0gYmluZGluZ3MgZnJv
bSB0aGUgY3VycmVudCBjb250ZXh0IHRvIGEgY29udGV4dCB0aGF0IGNhbiBiZSBldmFsdWF0ZWQg
d2l0aGluIHRoZSB2aWV3LgotICAvLyBSZXR1cm5zIG51bGwgaWYgdGhlIHBhdGggc2hvdWxkbid0
IGJlIGNoYW5nZWQuCi0gIC8vCi0gIC8vIFRPRE86IGNvbnNpZGVyIHRoZSBhZGRpdGlvbiBvZiBh
IHByZWZpeCB0aGF0IHdvdWxkIGFsbG93IHRoaXMgbWV0aG9kIHRvIHJldHVybiBgcGF0aGAuCi0g
IGNvbnRleHR1YWxpemVCaW5kaW5nUGF0aDogZnVuY3Rpb24ocGF0aCwgZGF0YSkgewotICAgIHZh
ciBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKG51bGwsIHBhdGgs
IGRhdGEpOwotICAgIGlmIChub3JtYWxpemVkLmlzS2V5d29yZCkgewotICAgICAgcmV0dXJuICd0
ZW1wbGF0ZURhdGEua2V5d29yZHMuJyArIHBhdGg7Ci0gICAgfSBlbHNlIGlmIChFbWJlci5pc0ds
b2JhbFBhdGgocGF0aCkpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gZWxzZSBpZiAocGF0
aCA9PT0gJ3RoaXMnIHx8IHBhdGggPT09ICcnKSB7Ci0gICAgICByZXR1cm4gJ19wYXJlbnRWaWV3
LmNvbnRleHQnOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRl
eHQuJyArIHBhdGg7Ci0gICAgfQotICB9LAotCi0gIGhlbHBlcjogZnVuY3Rpb24odGhpc0NvbnRl
eHQsIHBhdGgsIG9wdGlvbnMpIHsKLSAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAgICAg
ICAgZm4gPSBvcHRpb25zLmZuLAotICAgICAgICBuZXdWaWV3OwotCi0gICAgbWFrZUJpbmRpbmdz
KHRoaXNDb250ZXh0LCBvcHRpb25zKTsKLQotICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHBh
dGgpIHsKLQotICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGxhbWUgY29uZGl0aW9uYWwsIHRoaXMg
c2hvdWxkIGxpa2VseSBjaGFuZ2UKLSAgICAgIC8vIGJ1dCBzb21ldGhpbmcgYWxvbmcgdGhlc2Ug
bGluZXMgd2lsbCBsaWtlbHkgbmVlZCB0byBiZSBhZGRlZAotICAgICAgLy8gYXMgZGVwcmVjYXRp
b24gd2FybmluZ3MKLSAgICAgIC8vCi0gICAgICBpZiAob3B0aW9ucy50eXBlc1swXSA9PT0gJ1NU
UklORycgJiYgTE9XRVJDQVNFX0FfWi50ZXN0KHBhdGgpICYmICFWSUVXX1BSRUZJWC50ZXN0KHBh
dGgpKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiVmlldyByZXF1aXJlcyBhIGNvbnRhaW5lciIs
ICEhZGF0YS52aWV3LmNvbnRhaW5lcik7Ci0gICAgICAgIG5ld1ZpZXcgPSBkYXRhLnZpZXcuY29u
dGFpbmVyLmxvb2t1cEZhY3RvcnkoJ3ZpZXc6JyArIHBhdGgpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgbmV3VmlldyA9IEVtYmVySGFuZGxlYmFycy5nZXQodGhpc0NvbnRleHQsIHBhdGgsIG9w
dGlvbnMpOwotICAgICAgfQotCi0gICAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIHZp
ZXcgYXQgcGF0aCAnIiArIHBhdGggKyAiJyIsICEhbmV3Vmlldyk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIG5ld1ZpZXcgPSBwYXRoOwotICAgIH0KLQotICAgIEVtYmVyLmFzc2VydChFbWJlci5TdHJp
bmcuZm10KCdZb3UgbXVzdCBwYXNzIGEgdmlldyB0byB0aGUgI3ZpZXcgaGVscGVyLCBub3QgJUAg
KCVAKScsIFtwYXRoLCBuZXdWaWV3XSksIEVtYmVyLlZpZXcuZGV0ZWN0KG5ld1ZpZXcpIHx8IEVt
YmVyLlZpZXcuZGV0ZWN0SW5zdGFuY2UobmV3VmlldykpOwotCi0gICAgdmFyIHZpZXdPcHRpb25z
ID0gdGhpcy5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKG9wdGlvbnMsIHRoaXNDb250ZXh0KTsK
LSAgICB2YXIgY3VycmVudFZpZXcgPSBkYXRhLnZpZXc7Ci0gICAgdmlld09wdGlvbnMudGVtcGxh
dGVEYXRhID0gZGF0YTsKLSAgICB2YXIgbmV3Vmlld1Byb3RvID0gbmV3Vmlldy5wcm90byA/IG5l
d1ZpZXcucHJvdG8oKSA6IG5ld1ZpZXc7Ci0KLSAgICBpZiAoZm4pIHsKLSAgICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbm5vdCBwcm92aWRlIGEgdGVtcGxhdGUgYmxvY2sgaWYgeW91IGFsc28gc3Bl
Y2lmaWVkIGEgdGVtcGxhdGVOYW1lIiwgIWdldCh2aWV3T3B0aW9ucywgJ3RlbXBsYXRlTmFtZScp
ICYmICFnZXQobmV3Vmlld1Byb3RvLCAndGVtcGxhdGVOYW1lJykpOwotICAgICAgdmlld09wdGlv
bnMudGVtcGxhdGUgPSBmbjsKLSAgICB9Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJp
ZGUgdGhlIGBfY29udGV4dGAgY29tcHV0ZWQgcHJvcGVydHkgaWYgdGhlcmUgaXMKLSAgICAvLyBu
byBzcGVjaWZpZWQgY29udHJvbGxlci4gU2VlIFZpZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3Jt
YXRpb24uCi0gICAgaWYgKCFuZXdWaWV3UHJvdG8uY29udHJvbGxlciAmJiAhbmV3Vmlld1Byb3Rv
LmNvbnRyb2xsZXJCaW5kaW5nICYmICF2aWV3T3B0aW9ucy5jb250cm9sbGVyICYmICF2aWV3T3B0
aW9ucy5jb250cm9sbGVyQmluZGluZykgewotICAgICAgdmlld09wdGlvbnMuX2NvbnRleHQgPSB0
aGlzQ29udGV4dDsKLSAgICB9Ci0KLSAgICBjdXJyZW50Vmlldy5hcHBlbmRDaGlsZChuZXdWaWV3
LCB2aWV3T3B0aW9ucyk7Ci0gIH0KLX0pOwotCi0vKioKLSAgYHt7dmlld319YCBpbnNlcnRzIGEg
bmV3IGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YCBpbnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMK
LSAgb3B0aW9ucyB0byB0aGUgYEVtYmVyLlZpZXdgJ3MgYGNyZWF0ZWAgbWV0aG9kIGFuZCB1c2lu
ZyB0aGUgc3VwcGxpZWQgYmxvY2sgYXMKLSAgdGhlIHZpZXcncyBvd24gdGVtcGxhdGUuCi0KLSAg
QW4gZW1wdHkgYDxib2R5PmAgYW5kIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFu
ZGxlYmFycwotICBBIHNwYW46Ci0gIHt7I3ZpZXcgdGFnTmFtZT0ic3BhbiJ9fQotICAgIGhlbGxv
LgotICB7ey92aWV3fX0KLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6
Ci0KLSAgYGBgaHRtbAotICA8Ym9keT4KLSAgICA8IS0tIE5vdGU6IHRoZSBoYW5kbGViYXJzIHRl
bXBsYXRlIHNjcmlwdAotICAgICAgICAgYWxzbyByZXN1bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIu
VmlldwotICAgICAgICAgd2hpY2ggaXMgdGhlIG91dGVyIDxkaXY+IGhlcmUgLS0+Ci0KLSAgICA8
ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgIEEgc3BhbjoKLSAgICAgIDxzcGFuIGlkPSJl
bWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgICAgSGVsbG8uCi0gICAgICA8L3NwYW4+
Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLSAgYGBgCi0KLSAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0
aW5nCi0KLSAgVGhlIGBwYXJlbnRWaWV3YCBwcm9wZXJ0eSBvZiB0aGUgbmV3IGBFbWJlci5WaWV3
YCBpbnN0YW5jZSBjcmVhdGVkIHRocm91Z2gKLSAgYHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0
aGUgYEVtYmVyLlZpZXdgIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZQotICBge3t2aWV3
fX1gIHdhcyBjYWxsZWQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBhVmlldyA9IEVtYmVyLlZpZXcu
Y3JlYXRlKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJ7eyN2aWV3
fX0gbXkgcGFyZW50OiB7e3BhcmVudFZpZXcuZWxlbWVudElkfX0ge3svdmlld319IikKLSAgfSk7
Ci0KLSAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4g
SFRNTCBzdHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJl
bWJlci12aWV3Ij4KLSAgICA8ZGl2IGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAg
ICAgIG15IHBhcmVudDogZW1iZXIxCi0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAj
IyMgU2V0dGluZyBDU1MgaWQgYW5kIGNsYXNzIGF0dHJpYnV0ZXMKLQotICBUaGUgSFRNTCBgaWRg
IGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1l
bnQgd2l0aAotICB0aGUgYGlkYCBvcHRpb24uIFRoaXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFz
c2VkIHRvIGBFbWJlci5WaWV3LmNyZWF0ZWAuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyN2aWV3
IHRhZ05hbWU9InNwYW4iIGlkPSJhLWN1c3RvbS1pZCJ9fQotICAgIGhlbGxvLgotICB7ey92aWV3
fX0KLSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlOgot
Ci0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPHNwYW4gaWQ9ImEt
Y3VzdG9tLWlkIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgICBoZWxsby4KLSAgICA8L3NwYW4+
Ci0gIDwvZGl2PgotICBgYGAKLQotICBUaGUgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUg
c2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQKLSAgd2l0aCB0aGUgYGNs
YXNzYCBvciBgY2xhc3NOYW1lQmluZGluZ3NgIG9wdGlvbnMuIFRoZSBgY2xhc3NgIG9wdGlvbiB3
aWxsCi0gIGRpcmVjdGx5IHNldCB0aGUgQ1NTIGBjbGFzc2AgYXR0cmlidXRlIGFuZCB3aWxsIG5v
dCBiZSBwYXNzZWQgdG8KLSAgYEVtYmVyLlZpZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdz
YCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRlYCBhbmQgdXNlCi0gIGBFbWJlci5WaWV3YCdzIGNs
YXNzIG5hbWUgYmluZGluZyBmdW5jdGlvbmFsaXR5OgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sj
dmlldyB0YWdOYW1lPSJzcGFuIiBjbGFzcz0iYS1jdXN0b20tY2xhc3MifX0KLSAgICBoZWxsby4K
LSAge3svdmlld319Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0
cnVjdHVyZToKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxz
cGFuIGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12aWV3IGEtY3VzdG9tLWNsYXNzIj4KLSAgICAg
IGhlbGxvLgotICAgIDwvc3Bhbj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gICMjIyBTdXBwbHlpbmcg
YSBkaWZmZXJlbnQgdmlldyBjbGFzcwotCi0gIGB7e3ZpZXd9fWAgY2FuIHRha2UgYW4gb3B0aW9u
YWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBzdXBwbGllZCBvcHRpb25zIHRvCi0gIHNwZWNp
ZnkgYSBwYXRoIHRvIGEgY3VzdG9tIHZpZXcgY2xhc3MuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7
eyN2aWV3ICJNeUFwcC5DdXN0b21WaWV3In19Ci0gICAgaGVsbG8uCi0gIHt7L3ZpZXd9fQotICBg
YGAKLQotICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoIGFj
Y2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAotICBjb250ZXh0LgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgTXlBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoe30pOwotICBNeUFwcC5PdXRlclZp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgaW5uZXJWaWV3Q2xhc3M6IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZXM6IFsnYS1jdXN0b20tdmlldy1jbGFzcy1hcy1wcm9w
ZXJ0eSddCi0gICAgfSksCi0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgn
e3sjdmlldyAidmlldy5pbm5lclZpZXdDbGFzcyJ9fSBoaSB7ey92aWV3fX0nKQotICB9KTsKLQot
ICBNeUFwcC5PdXRlclZpZXcuY3JlYXRlKCkuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAg
V2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBpZD0iZW1iZXIyIiBjbGFz
cz0iZW1iZXItdmlldyBhLWN1c3RvbS12aWV3LWNsYXNzLWFzLXByb3BlcnR5Ij4KLSAgICAgIGhp
Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMgQmxvY2tsZXNzIHVzZQotCi0g
IElmIHlvdSBzdXBwbHkgYSBjdXN0b20gYEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRoYXQgc3BlY2lm
aWVzIGl0cyBvd24gdGVtcGxhdGUKLSAgb3IgcHJvdmlkZSBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlv
biB0byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQKLSAgc3VwcGx5aW5nIGEgYmxv
Y2suIEF0dGVtcHRzIHRvIHVzZSBib3RoIGEgYHRlbXBsYXRlTmFtZWAgb3B0aW9uIGFuZCBzdXBw
bHkgYQotICBibG9jayB3aWxsIHRocm93IGFuIGVycm9yLgotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
e3t2aWV3ICJNeUFwcC5WaWV3V2l0aEFUZW1wbGF0ZURlZmluZWQifX0KLSAgYGBgCi0KLSAgIyMj
IGB2aWV3TmFtZWAgcHJvcGVydHkKLQotICBZb3UgY2FuIHN1cHBseSBhIGB2aWV3TmFtZWAgb3B0
aW9uIHRvIGB7e3ZpZXd9fWAuIFRoZSBgRW1iZXIuVmlld2AgaW5zdGFuY2UKLSAgd2lsbCBiZSBy
ZWZlcmVuY2VkIGFzIGEgcHJvcGVydHkgb2YgaXRzIHBhcmVudCB2aWV3IGJ5IHRoaXMgbmFtZS4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIGFWaWV3ID0gRW1iZXIuVmlldy5jcmVhdGUoewotICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7I3ZpZXcgdmlld05hbWU9ImFDaGls
ZEJ5TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQotICB9KTsKLQotICBhVmlldy5hcHBlbmRUbygnYm9k
eScpOwotICBhVmlldy5nZXQoJ2FDaGlsZEJ5TmFtZScpIC8vIHRoZSBpbnN0YW5jZSBvZiBFbWJl
ci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3fX0gaGVscGVyCi0gIGBgYAotCi0gIEBtZXRob2Qgdmll
dwotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcGF0
aAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmlu
ZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndmlldycsIGZ1bmN0aW9uIHZp
ZXdIZWxwZXIocGF0aCwgb3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIlRoZSB2aWV3IGhlbHBl
ciBvbmx5IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IiwgYXJndW1lbnRzLmxlbmd0aCA8PSAyKTsK
LQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlv
bnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7
Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0aCA9ICJFbWJlci5WaWV3IjsKLSAgfQotCi0g
IHJldHVybiBFbWJlckhhbmRsZWJhcnMuVmlld0hlbHBlci5oZWxwZXIodGhpcywgcGF0aCwgb3B0
aW9ucyk7Ci19KTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gVE9ETzogRG9u
J3QgcmVxdWlyZSBhbGwgb2YgdGhpcyBtb2R1bGUKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBoYW5kbGVi
YXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci0K
LS8qKgotICBge3tjb2xsZWN0aW9ufX1gIGlzIGEgYEVtYmVyLkhhbmRsZWJhcnNgIGhlbHBlciBm
b3IgYWRkaW5nIGluc3RhbmNlcyBvZgotICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIHRvIGEgdGVt
cGxhdGUuIFNlZSBbRW1iZXIuQ29sbGVjdGlvblZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5Db2xs
ZWN0aW9uVmlldy5odG1sKQotICAgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEg
YENvbGxlY3Rpb25WaWV3YCBmdW5jdGlvbnMuCi0KLSAgYHt7Y29sbGVjdGlvbn19YCdzIHByaW1h
cnkgdXNlIGlzIGFzIGEgYmxvY2sgaGVscGVyIHdpdGggYSBgY29udGVudEJpbmRpbmdgCi0gIG9w
dGlvbiBwb2ludGluZyB0b3dhcmRzIGFuIGBFbWJlci5BcnJheWAtY29tcGF0aWJsZSBvYmplY3Qu
IEFuIGBFbWJlci5WaWV3YAotICBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaXRl
bSBpbiBpdHMgYGNvbnRlbnRgIHByb3BlcnR5LiBFYWNoIHZpZXcKLSAgd2lsbCBoYXZlIGl0cyBv
d24gYGNvbnRlbnRgIHByb3BlcnR5IHNldCB0byB0aGUgYXBwcm9wcmlhdGUgaXRlbSBpbiB0aGUK
LSAgY29sbGVjdGlvbi4KLQotICBUaGUgcHJvdmlkZWQgYmxvY2sgd2lsbCBiZSBhcHBsaWVkIGFz
IHRoZSB0ZW1wbGF0ZSBmb3IgZWFjaCBpdGVtJ3Mgdmlldy4KLQotICBHaXZlbiBhbiBlbXB0eSBg
PGJvZHk+YCB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sj
Y29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNv
bnRlbnQubmFtZX19Ci0gIHt7L2NvbGxlY3Rpb259fQotICBgYGAKLQotICBBbmQgdGhlIGZvbGxv
d2luZyBhcHBsaWNhdGlvbiBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAgPSBFbWJlci5B
cHBsaWNhdGlvbi5jcmVhdGUoKQotICBBcHAuaXRlbXMgPSBbCi0gICAgRW1iZXIuT2JqZWN0LmNy
ZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01h
cnknfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKLSAgXQotICBg
YGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKLQotICBgYGBo
dG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkhpIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBNYXJ5PC9k
aXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+SGkgU2FyYTwvZGl2PgotICA8L2Rpdj4K
LSAgYGBgCi0KLSAgIyMjIEJsb2NrbGVzcyBVc2UKLQotICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRl
bVZpZXdDbGFzc2Agb3B0aW9uIHRoYXQgaGFzIGl0cyBvd24gYHRlbXBsYXRlYCB5b3UgY2FuCi0g
IG9taXQgdGhlIGJsb2NrLgotCi0gIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFu
ZGxlYmFycwotICB7e2NvbGxlY3Rpb24gY29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyIgaXRlbVZp
ZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXcifX0KLSAgYGBgCi0KLSAgQW5kIGFwcGxpY2F0aW9uIGNv
ZGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OwotICBBcHAuaXRlbXMgPSBbCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUn
fSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01hcnknfSksCi0gICAgRW1iZXIu
T2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKLSAgXTsKLQotICBBcHAuQW5JdGVtVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJHcmVldGluZ3Mge3t2aWV3LmNvbnRlbnQubmFtZX19IikKLSAgfSk7Ci0gIGBgYAotCi0g
IFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBiZWxvdwotCi0gIGBgYGh0bWwKLSAg
PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3Jl
ZXRpbmdzIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3Mg
TWFyeTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBTYXJhPC9k
aXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMgU3BlY2lmeWluZyBhIENvbGxlY3Rpb25WaWV3
IHN1YmNsYXNzCi0KLSAgQnkgZGVmYXVsdCB0aGUgYHt7Y29sbGVjdGlvbn19YCBoZWxwZXIgd2ls
bCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YC4gWW91IGNh
biBzdXBwbHkgYSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIHN1YmNsYXNzIHRvCi0gIHRoZSBoZWxw
ZXIgYnkgcGFzc2luZyBpdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQ6Ci0KLSAgYGBgaGFuZGxlYmFy
cwotICB7eyNjb2xsZWN0aW9uIEFwcC5NeUN1c3RvbUNvbGxlY3Rpb25DbGFzcyBjb250ZW50Qmlu
ZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNvbnRlbnQubmFtZX19Ci0gIHt7L2Nv
bGxlY3Rpb259fQotICBgYGAKLQotICAjIyMgRm9yd2FyZGVkIGBpdGVtLipgLW5hbWVkIE9wdGlv
bnMKLQotICBBcyB3aXRoIHRoZSBge3t2aWV3fX1gLCBoZWxwZXIgb3B0aW9ucyBwYXNzZWQgdG8g
dGhlIGB7e2NvbGxlY3Rpb259fWAgd2lsbCBiZQotICBzZXQgb24gdGhlIHJlc3VsdGluZyBgRW1i
ZXIuQ29sbGVjdGlvblZpZXdgIGFzIHByb3BlcnRpZXMuIEFkZGl0aW9uYWxseSwKLSAgb3B0aW9u
cyBwcmVmaXhlZCB3aXRoIGBpdGVtYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHZpZXdzIHJlbmRl
cmVkIGZvciBlYWNoCi0gIGl0ZW0gKG5vdGUgdGhlIGNhbWVsY2FzaW5nKToKLQotICBgYGBoYW5k
bGViYXJzCi0gIHt7I2NvbGxlY3Rpb24gY29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyIKLSAgICAg
ICAgICAgICAgICBpdGVtVGFnTmFtZT0icCIKLSAgICAgICAgICAgICAgICBpdGVtQ2xhc3NOYW1l
cz0iZ3JlZXRpbmcifX0KLSAgICBIb3dkeSB7e3ZpZXcuY29udGVudC5uYW1lfX0KLSAge3svY29s
bGVjdGlvbn19Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICA8
cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgRGF2ZTwvcD4KLSAgICA8cCBjbGFz
cz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgTWFyeTwvcD4KLSAgICA8cCBjbGFzcz0iZW1i
ZXItdmlldyBncmVldGluZyI+SG93ZHkgU2FyYTwvcD4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEBt
ZXRob2QgY29sbGVjdGlvbgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFy
YW0ge1N0cmluZ30gcGF0aAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3Ry
aW5nfSBIVE1MIHN0cmluZwotICBAZGVwcmVjYXRlZCBVc2UgYHt7ZWFjaH19YCBoZWxwZXIgaW5z
dGVhZC4KLSovCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdjb2xsZWN0aW9uJywg
ZnVuY3Rpb24gY29sbGVjdGlvbkhlbHBlcihwYXRoLCBvcHRpb25zKSB7Ci0gIEVtYmVyLmRlcHJl
Y2F0ZSgiVXNpbmcgdGhlIHt7Y29sbGVjdGlvbn19IGhlbHBlciB3aXRob3V0IHNwZWNpZnlpbmcg
YSBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIHRoZSB7e2VhY2h9fSBoZWxwZXIgbm93IHN1
cHBvcnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuIiwgcGF0aCAhPT0gJ2NvbGxlY3Rpb24nKTsK
LQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlv
bnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7
Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0aCA9IHVuZGVmaW5lZDsKLSAgICBFbWJlci5h
c3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSBjb2xs
ZWN0aW9uIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpOwotICB9IGVsc2UgewotICAg
IEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8g
dGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gIH0KLQot
ICB2YXIgZm4gPSBvcHRpb25zLmZuOwotICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTsKLSAgdmFy
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0gIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZp
ZXc7Ci0KLSAgLy8gSWYgcGFzc2VkIGEgcGF0aCBzdHJpbmcsIGNvbnZlcnQgdGhhdCBpbnRvIGFu
IG9iamVjdC4KLSAgLy8gT3RoZXJ3aXNlLCBqdXN0IGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNs
YXNzLgotICB2YXIgY29sbGVjdGlvbkNsYXNzOwotICBjb2xsZWN0aW9uQ2xhc3MgPSBwYXRoID8g
aGFuZGxlYmFyc0dldCh0aGlzLCBwYXRoLCBvcHRpb25zKSA6IEVtYmVyLkNvbGxlY3Rpb25WaWV3
OwotICBFbWJlci5hc3NlcnQoZm10KCIlQCAjY29sbGVjdGlvbjogQ291bGQgbm90IGZpbmQgY29s
bGVjdGlvbiBjbGFzcyAlQCIsIFtkYXRhLnZpZXcsIHBhdGhdKSwgISFjb2xsZWN0aW9uQ2xhc3Mp
OwotCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLCBpdGVtSGFzaCA9IHt9LCBtYXRjaDsKLQot
ICAvLyBFeHRyYWN0IGl0ZW0gdmlldyBjbGFzcyBpZiBwcm92aWRlZCBlbHNlIGRlZmF1bHQgdG8g
dGhlIHN0YW5kYXJkIGNsYXNzCi0gIHZhciBjb2xsZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlv
bkNsYXNzLnByb3RvKCksCi0gICAgICBpdGVtVmlld0NsYXNzOwotCi0gIGlmIChoYXNoLml0ZW1W
aWV3KSB7Ci0gICAgdmFyIGNvbnRyb2xsZXIgPSBkYXRhLmtleXdvcmRzLmNvbnRyb2xsZXI7Ci0g
ICAgRW1iZXIuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVkIGFuIGl0ZW1WaWV3LCBidXQgdGhlIGN1cnJl
bnQgY29udGV4dCBoYXMgbm8gJyArCi0gICAgICAgICAgICAgICAgICdjb250YWluZXIgdG8gbG9v
ayB0aGUgaXRlbVZpZXcgdXAgaW4uIFRoaXMgcHJvYmFibHkgbWVhbnMgJyArCi0gICAgICAgICAg
ICAgICAgICd0aGF0IHlvdSBjcmVhdGVkIGEgdmlldyBtYW51YWxseSwgaW5zdGVhZCBvZiB0aHJv
dWdoIHRoZSAnICsKLSAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lci4gSW5zdGVhZCwgdXNlIGNv
bnRhaW5lci5sb29rdXAoInZpZXc6dmlld05hbWUiKSwgJyArCi0gICAgICAgICAgICAgICAgICd3
aGljaCB3aWxsIHByb3Blcmx5IGluc3RhbnRpYXRlIHlvdXIgdmlldy4nLAotICAgICAgICAgICAg
ICAgICBjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuY29udGFpbmVyKTsKLSAgICB2YXIgY29udGFp
bmVyID0gY29udHJvbGxlci5jb250YWluZXI7Ci0gICAgaXRlbVZpZXdDbGFzcyA9IGNvbnRhaW5l
ci5yZXNvbHZlKCd2aWV3OicgKyBoYXNoLml0ZW1WaWV3KTsKLSAgICBFbWJlci5hc3NlcnQoJ1lv
dSBzcGVjaWZpZWQgdGhlIGl0ZW1WaWV3ICcgKyBoYXNoLml0ZW1WaWV3ICsgIiwgYnV0IGl0IHdh
cyAiICsKLSAgICAgICAgICAgICAgICAgIm5vdCBmb3VuZCBhdCAiICsgY29udGFpbmVyLmRlc2Ny
aWJlKCJ2aWV3OiIgKyBoYXNoLml0ZW1WaWV3KSArCi0gICAgICAgICAgICAgICAgICIgKGFuZCBp
dCB3YXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGNvbnRhaW5lcikiLCAhIWl0ZW1WaWV3Q2xhc3Mp
OwotICB9IGVsc2UgaWYgKGhhc2guaXRlbVZpZXdDbGFzcykgewotICAgIGl0ZW1WaWV3Q2xhc3Mg
PSBoYW5kbGViYXJzR2V0KGNvbGxlY3Rpb25Qcm90b3R5cGUsIGhhc2guaXRlbVZpZXdDbGFzcywg
b3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgaXRlbVZpZXdDbGFzcyA9IGNvbGxlY3Rpb25Qcm90
b3R5cGUuaXRlbVZpZXdDbGFzczsKLSAgfQotCi0gIEVtYmVyLmFzc2VydChmbXQoIiVAICNjb2xs
ZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVtVmlld0NsYXNzICVAIiwgW2RhdGEudmlldywgaXRl
bVZpZXdDbGFzc10pLCAhIWl0ZW1WaWV3Q2xhc3MpOwotCi0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3
Q2xhc3M7Ci0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3OwotCi0gIC8vIEdvIHRocm91Z2ggb3B0aW9u
cyBwYXNzZWQgdG8gdGhlIHt7Y29sbGVjdGlvbn19IGhlbHBlciBhbmQgZXh0cmFjdCBvcHRpb25z
Ci0gIC8vIHRoYXQgY29uZmlndXJlIGl0ZW0gdmlld3MgaW5zdGVhZCBvZiB0aGUgY29sbGVjdGlv
biBpdHNlbGYuCi0gIGZvciAodmFyIHByb3AgaW4gaGFzaCkgewotICAgIGlmIChoYXNoLmhhc093
blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICBtYXRjaCA9IHByb3AubWF0Y2goL15pdGVtKC4pKC4q
KSQvKTsKLQotICAgICAgaWYgKG1hdGNoICYmIHByb3AgIT09ICdpdGVtQ29udHJvbGxlcicpIHsK
LSAgICAgICAgLy8gQ29udmVydCBpdGVtU2hvdWxkRm9vIC0+IHNob3VsZEZvbwotICAgICAgICBp
dGVtSGFzaFttYXRjaFsxXS50b0xvd2VyQ2FzZSgpICsgbWF0Y2hbMl1dID0gaGFzaFtwcm9wXTsK
LSAgICAgICAgLy8gRGVsZXRlIGZyb20gaGFzaCBhcyB0aGlzIHdpbGwgZW5kIHVwIGdldHRpbmcg
cGFzc2VkIHRvIHRoZQotICAgICAgICAvLyB7e3ZpZXd9fSBoZWxwZXIgbWV0aG9kLgotICAgICAg
ICBkZWxldGUgaGFzaFtwcm9wXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZm4pIHsK
LSAgICBpdGVtSGFzaC50ZW1wbGF0ZSA9IGZuOwotICAgIGRlbGV0ZSBvcHRpb25zLmZuOwotICB9
Ci0KLSAgdmFyIGVtcHR5Vmlld0NsYXNzOwotICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlICE9PSBF
bWJlci5IYW5kbGViYXJzLlZNLm5vb3ApIHsKLSAgICBlbXB0eVZpZXdDbGFzcyA9IGdldChjb2xs
ZWN0aW9uUHJvdG90eXBlLCAnZW1wdHlWaWV3Q2xhc3MnKTsKLSAgICBlbXB0eVZpZXdDbGFzcyA9
IGVtcHR5Vmlld0NsYXNzLmV4dGVuZCh7Ci0gICAgICAgICAgdGVtcGxhdGU6IGludmVyc2UsCi0g
ICAgICAgICAgdGFnTmFtZTogaXRlbUhhc2gudGFnTmFtZQotICAgIH0pOwotICB9IGVsc2UgaWYg
KGhhc2guZW1wdHlWaWV3Q2xhc3MpIHsKLSAgICBlbXB0eVZpZXdDbGFzcyA9IGhhbmRsZWJhcnNH
ZXQodGhpcywgaGFzaC5lbXB0eVZpZXdDbGFzcywgb3B0aW9ucyk7Ci0gIH0KLSAgaWYgKGVtcHR5
Vmlld0NsYXNzKSB7IGhhc2guZW1wdHlWaWV3ID0gZW1wdHlWaWV3Q2xhc3M7IH0KLQotICBpZiAo
IWhhc2gua2V5d29yZCkgewotICAgIGl0ZW1IYXNoLl9jb250ZXh0ID0gRW1iZXIuY29tcHV0ZWQu
YWxpYXMoJ2NvbnRlbnQnKTsKLSAgfQotCi0gIHZhciB2aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRs
ZWJhcnMuVmlld0hlbHBlci5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKHsgZGF0YTogZGF0YSwg
aGFzaDogaXRlbUhhc2ggfSwgdGhpcyk7Ci0gIGhhc2guaXRlbVZpZXdDbGFzcyA9IGl0ZW1WaWV3
Q2xhc3MuZXh0ZW5kKHZpZXdPcHRpb25zKTsKLQotICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBjb2xsZWN0aW9uQ2xhc3MsIG9wdGlvbnMpOwotfSk7Ci0K
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBIYW5kbGViYXJzICovCi0v
KioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFy
IGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldDsKLQotLyoqCi0gIGB1bmJvdW5k
YCBhbGxvd3MgeW91IHRvIG91dHB1dCBhIHByb3BlcnR5IHdpdGhvdXQgYmluZGluZy4gKkltcG9y
dGFudDoqIFRoZQotICBvdXRwdXQgd2lsbCBub3QgYmUgdXBkYXRlZCBpZiB0aGUgcHJvcGVydHkg
Y2hhbmdlcy4gVXNlIHdpdGggY2F1dGlvbi4KLQotICBgYGBoYW5kbGViYXJzCi0gIDxkaXY+e3t1
bmJvdW5kIHNvbWVQcm9wZXJ0eVRoYXREb2VzbnRDaGFuZ2V9fTwvZGl2PgotICBgYGAKLQotICBg
dW5ib3VuZGAgY2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgYm91bmQgaGVs
cGVyIHRvCi0gIHJlbmRlciBpdCBpbiBpdHMgdW5ib3VuZCBmb3JtOgotCi0gIGBgYGhhbmRsZWJh
cnMKLSAgPGRpdj57e3VuYm91bmQgaGVscGVyTmFtZSBzb21lUHJvcGVydHlUaGF0RG9lc250Q2hh
bmdlfX08L2Rpdj4KLSAgYGBgCi0KLSAgQG1ldGhvZCB1bmJvdW5kCi0gIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQotICBAcmV0dXJuIHtT
dHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
dW5ib3VuZCcsIGZ1bmN0aW9uIHVuYm91bmRIZWxwZXIocHJvcGVydHksIGZuKSB7Ci0gIHZhciBv
cHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSwgaGVscGVyLCBjb250ZXh0
LCBvdXQ7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgLy8gVW5ib3VuZCBo
ZWxwZXIgY2FsbC4KLSAgICBvcHRpb25zLmRhdGEuaXNVbmJvdW5kID0gdHJ1ZTsKLSAgICBoZWxw
ZXIgPSBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnNbYXJndW1lbnRzWzBdXSB8fCBFbWJlci5IYW5k
bGViYXJzLmhlbHBlcnMuaGVscGVyTWlzc2luZzsKLSAgICBvdXQgPSBoZWxwZXIuYXBwbHkodGhp
cywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgZGVsZXRl
IG9wdGlvbnMuZGF0YS5pc1VuYm91bmQ7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIGNvbnRl
eHQgPSAoZm4uY29udGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBd
IDogdGhpczsKLSAgcmV0dXJuIGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcHJvcGVydHksIGZuKTsK
LX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypqc2hpbnQgZGVidWc6dHJ1ZSov
Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0
LCBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoOwotCi0vKioK
LSAgYGxvZ2AgYWxsb3dzIHlvdSB0byBvdXRwdXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgaW4g
dGhlIGN1cnJlbnQgcmVuZGVyaW5nCi0gIGNvbnRleHQuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7
e2xvZyBteVZhcmlhYmxlfX0KLSAgYGBgCi0KLSAgQG1ldGhvZCBsb2cKLSAgQGZvciBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0qLwotRW1iZXIu
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gbG9nSGVscGVyKHByb3Bl
cnR5LCBvcHRpb25zKSB7Ci0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0
aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXMsCi0gICAg
ICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucy5k
YXRhKSwKLSAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290LAotICAgICAgcGF0aCA9IG5v
cm1hbGl6ZWQucGF0aCwKLSAgICAgIHZhbHVlID0gKHBhdGggPT09ICd0aGlzJykgPyBwYXRoUm9v
dCA6IGhhbmRsZWJhcnNHZXQocGF0aFJvb3QsIHBhdGgsIG9wdGlvbnMpOwotICBFbWJlci5Mb2dn
ZXIubG9nKHZhbHVlKTsKLX0pOwotCi0vKioKLSAgRXhlY3V0ZSB0aGUgYGRlYnVnZ2VyYCBzdGF0
ZW1lbnQgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7ZGVi
dWdnZXJ9fQotICBgYGAKLQotICBCZWZvcmUgaW52b2tpbmcgdGhlIGBkZWJ1Z2dlcmAgc3RhdGVt
ZW50LCB0aGVyZQotICBhcmUgYSBmZXcgaGVscGZ1bCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUK
LSAgYm9keSBvZiB0aGlzIGhlbHBlciB0aGF0IHlvdSBjYW4gaW5zcGVjdCB3aGlsZQotICBkZWJ1
Z2dpbmcgdGhhdCBkZXNjcmliZSBob3cgYW5kIHdoZXJlIHRoaXMKLSAgaGVscGVyIHdhcyBpbnZv
a2VkOgotCi0gIC0gdGVtcGxhdGVDb250ZXh0OiB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgY29udHJv
bGxlcgotICAgIGZyb20gd2hpY2ggdGhpcyB0ZW1wbGF0ZSBsb29rcyB1cCAvIGRpc3BsYXlzIHBy
b3BlcnRpZXMKLSAgLSB0eXBlT2ZUZW1wbGF0ZUNvbnRleHQ6IGEgc3RyaW5nIGRlc2NyaXB0aW9u
IG9mCi0gICAgd2hhdCB0aGUgdGVtcGxhdGVDb250ZXh0IGlzCi0KLSAgRm9yIGV4YW1wbGUsIGlm
IHlvdSdyZSB3b25kZXJpbmcgd2h5IGEgdmFsdWUgYHt7Zm9vfX1gCi0gIGlzbid0IHJlbmRlcmlu
ZyBhcyBleHBlY3RlZCB3aXRoaW4gYSB0ZW1wbGF0ZSwgeW91Ci0gIGNvdWxkIHBsYWNlIGEgYHt7
ZGVidWdnZXJ9fWAgc3RhdGVtZW50LCBhbmQgd2hlbgotICB0aGUgYGRlYnVnZ2VyO2AgYnJlYWtw
b2ludCBpcyBoaXQsIHlvdSBjYW4gaW5zcGVjdAotICBgdGVtcGxhdGVDb250ZXh0YCwgZGV0ZXJt
aW5lIGlmIGl0J3MgdGhlIG9iamVjdCB5b3UKLSAgZXhwZWN0LCBhbmQvb3IgZXZhbHVhdGUgZXhw
cmVzc2lvbnMgaW4gdGhlIGNvbnNvbGUKLSAgdG8gcGVyZm9ybSBwcm9wZXJ0eSBsb29rdXBzIG9u
IHRoZSBgdGVtcGxhdGVDb250ZXh0YDoKLQotICBgYGAKLSAgICA+IHRlbXBsYXRlQ29udGV4dC5n
ZXQoJ2ZvbycpIC8vIC0+ICI8dmFsdWUgb2Yge3tmb299fT4iCi0gIGBgYAotCi0gIEBtZXRob2Qg
ZGVidWdnZXIKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJp
bmd9IHByb3BlcnR5Ci0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZGVidWdn
ZXInLCBmdW5jdGlvbiBkZWJ1Z2dlckhlbHBlcihvcHRpb25zKSB7Ci0KLSAgLy8gVGhlc2UgYXJl
IGhlbHBmdWwgdmFsdWVzIHlvdSBjYW4gaW5zcGVjdCB3aGlsZSBkZWJ1Z2dpbmcuCi0gIHZhciB0
ZW1wbGF0ZUNvbnRleHQgPSB0aGlzOwotICB2YXIgdHlwZU9mVGVtcGxhdGVDb250ZXh0ID0gRW1i
ZXIuaW5zcGVjdCh0ZW1wbGF0ZUNvbnRleHQpOwotCi0gIGRlYnVnZ2VyOwotfSk7Ci0KLQotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLQotRW1iZXIuSGFuZGxlYmFycy5FYWNoVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3
LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoLCB7Ci0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBpdGVtQ29udHJvbGxlciA9IGdldCh0aGlzLCAnaXRlbUNvbnRyb2xsZXInKTsKLSAgICB2YXIg
YmluZGluZzsKLQotICAgIGlmIChpdGVtQ29udHJvbGxlcikgewotICAgICAgdmFyIGNvbnRyb2xs
ZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXIuY29udGFpbmVyJykubG9va3VwRmFjdG9yeSgnY29u
dHJvbGxlcjphcnJheScpLmNyZWF0ZSh7Ci0gICAgICAgIHBhcmVudENvbnRyb2xsZXI6IGdldCh0
aGlzLCAnY29udHJvbGxlcicpLAotICAgICAgICBpdGVtQ29udHJvbGxlcjogaXRlbUNvbnRyb2xs
ZXIsCi0gICAgICAgIHRhcmdldDogZ2V0KHRoaXMsICdjb250cm9sbGVyJyksCi0gICAgICAgIF9l
YWNoVmlldzogdGhpcwotICAgICAgfSk7Ci0KLSAgICAgIHRoaXMuZGlzYWJsZUNvbnRlbnRPYnNl
cnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNldCh0aGlzLCAnY29udGVudCcsIGNvbnRyb2xs
ZXIpOwotICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnX2Vh
Y2hWaWV3LmRhdGFTb3VyY2UnKS5vbmVXYXkoKTsKLSAgICAgICAgYmluZGluZy5jb25uZWN0KGNv
bnRyb2xsZXIpOwotICAgICAgfSk7Ci0KLSAgICAgIHNldCh0aGlzLCAnX2FycmF5Q29udHJvbGxl
cicsIGNvbnRyb2xsZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmRpc2FibGVDb250ZW50
T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewotICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRp
bmcoJ2NvbnRlbnQnLCAnZGF0YVNvdXJjZScpLm9uZVdheSgpOwotICAgICAgICBiaW5kaW5nLmNv
bm5lY3QodGhpcyk7Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIo
KTsKLSAgfSwKLQotICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5jdGlvbihjb250ZW50KSB7Ci0gICAg
RW1iZXIuYXNzZXJ0KCJUaGUgdmFsdWUgdGhhdCAjZWFjaCBsb29wcyBvdmVyIG11c3QgYmUgYW4g
QXJyYXkuIFlvdSBwYXNzZWQgIiArIGNvbnRlbnQuY29uc3RydWN0b3IgKyAiLCBidXQgaXQgc2hv
dWxkIGhhdmUgYmVlbiBhbiBBcnJheUNvbnRyb2xsZXIiLCAhRW1iZXIuQ29udHJvbGxlck1peGlu
LmRldGVjdChjb250ZW50KSB8fCAoY29udGVudCAmJiBjb250ZW50LmlzR2VuZXJhdGVkKSB8fCBj
b250ZW50IGluc3RhbmNlb2YgRW1iZXIuQXJyYXlDb250cm9sbGVyKTsKLSAgICBFbWJlci5hc3Nl
cnQoIlRoZSB2YWx1ZSB0aGF0ICNlYWNoIGxvb3BzIG92ZXIgbXVzdCBiZSBhbiBBcnJheS4gWW91
IHBhc3NlZCAiICsgKChFbWJlci5Db250cm9sbGVyTWl4aW4uZGV0ZWN0KGNvbnRlbnQpICYmIGNv
bnRlbnQuZ2V0KCdtb2RlbCcpICE9PSB1bmRlZmluZWQpID8gKCIiICsgY29udGVudC5nZXQoJ21v
ZGVsJykgKyAiICh3cmFwcGVkIGluICIgKyBjb250ZW50ICsgIikiKSA6ICgiIiArIGNvbnRlbnQp
KSwgRW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsKLSAgfSwKLQotICBkaXNhYmxlQ29udGVu
dE9ic2VydmVyczogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICBFbWJlci5yZW1vdmVCZWZvcmVP
YnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVudFdpbGxDaGFuZ2UnKTsKLSAg
ICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVudERp
ZENoYW5nZScpOwotCi0gICAgY2FsbGJhY2suY2FsbCh0aGlzKTsKLQotICAgIEVtYmVyLmFkZEJl
Zm9yZU9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScp
OwotICAgIEVtYmVyLmFkZE9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50
RGlkQ2hhbmdlJyk7Ci0gIH0sCi0KLSAgaXRlbVZpZXdDbGFzczogRW1iZXIuX01ldGFtb3JwaFZp
ZXcsCi0gIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmlldywKLQotICBjcmVhdGVD
aGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7Ci0gICAgdmlldyA9IHRoaXMuX3N1cGVy
KHZpZXcsIGF0dHJzKTsKLQotICAgIC8vIEF0IHRoZSBtb21lbnQsIGlmIGEgY29udGFpbmVyIHZp
ZXcgc3ViY2xhc3Mgd2FudHMKLSAgICAvLyB0byBpbnNlcnQga2V5d29yZHMsIGl0IGlzIHJlc3Bv
bnNpYmxlIGZvciBjbG9uaW5nCi0gICAgLy8gdGhlIGtleXdvcmRzIGhhc2guIFRoaXMgd2lsbCBi
ZSBmaXhlZCBtb21lbnRhcmlseS4KLSAgICB2YXIga2V5d29yZCA9IGdldCh0aGlzLCAna2V5d29y
ZCcpOwotICAgIHZhciBjb250ZW50ID0gZ2V0KHZpZXcsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAo
a2V5d29yZCkgewotICAgICAgdmFyIGRhdGEgPSBnZXQodmlldywgJ3RlbXBsYXRlRGF0YScpOwot
Ci0gICAgICBkYXRhID0gRW1iZXIuY29weShkYXRhKTsKLSAgICAgIGRhdGEua2V5d29yZHMgPSB2
aWV3LmNsb25lS2V5d29yZHMoKTsKLSAgICAgIHNldCh2aWV3LCAndGVtcGxhdGVEYXRhJywgZGF0
YSk7Ci0KLSAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgZG8gbm90IGJpbmQsIGJlY2F1c2UgdGhl
IGBjb250ZW50YCBvZgotICAgICAgLy8gYSAjZWFjaCBpdGVtIGNhbm5vdCBjaGFuZ2UuCi0gICAg
ICBkYXRhLmtleXdvcmRzW2tleXdvcmRdID0gY29udGVudDsKLSAgICB9Ci0KLSAgICAvLyBJZiB7
eyNlYWNofX0gaXMgbG9vcGluZyBvdmVyIGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzLAotICAgIC8v
IHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVpciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCi0g
ICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNvbnRlbnQsICdpc0NvbnRyb2xsZXInKSkgewotICAgICAg
c2V0KHZpZXcsICdjb250cm9sbGVyJywgY29udGVudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZp
ZXc7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLl9zdXBl
cigpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIGFycmF5Q29udHJvbGxlciA9IGdldCh0aGlzLCAn
X2FycmF5Q29udHJvbGxlcicpOwotCi0gICAgaWYgKGFycmF5Q29udHJvbGxlcikgewotICAgICAg
YXJyYXlDb250cm9sbGVyLmRlc3Ryb3koKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAg
fQotfSk7Ci0KLXZhciBHcm91cGVkRWFjaCA9IEVtYmVyLkhhbmRsZWJhcnMuR3JvdXBlZEVhY2gg
PSBmdW5jdGlvbihjb250ZXh0LCBwYXRoLCBvcHRpb25zKSB7Ci0gIHZhciBzZWxmID0gdGhpcywK
LSAgICAgIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoY29udGV4
dCwgcGF0aCwgb3B0aW9ucy5kYXRhKTsKLQotICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICB0
aGlzLnBhdGggPSBwYXRoOwotICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICB0aGlzLnRlbXBs
YXRlID0gb3B0aW9ucy5mbjsKLSAgdGhpcy5jb250YWluaW5nVmlldyA9IG9wdGlvbnMuZGF0YS52
aWV3OwotICB0aGlzLm5vcm1hbGl6ZWRSb290ID0gbm9ybWFsaXplZC5yb290OwotICB0aGlzLm5v
cm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZC5wYXRoOwotICB0aGlzLmNvbnRlbnQgPSB0aGlzLmxv
b2t1cENvbnRlbnQoKTsKLQotICB0aGlzLmFkZENvbnRlbnRPYnNlcnZlcnMoKTsKLSAgdGhpcy5h
ZGRBcnJheU9ic2VydmVycygpOwotCi0gIHRoaXMuY29udGFpbmluZ1ZpZXcub24oJ3dpbGxDbGVh
clJlbmRlcicsIGZ1bmN0aW9uKCkgewotICAgIHNlbGYuZGVzdHJveSgpOwotICB9KTsKLX07Ci0K
LUdyb3VwZWRFYWNoLnByb3RvdHlwZSA9IHsKLSAgY29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKTsKLSAgfSwKLQotICBjb250ZW50
RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmxvb2t1cENv
bnRlbnQoKTsKLSAgICB0aGlzLmFkZEFycmF5T2JzZXJ2ZXJzKCk7Ci0gICAgdGhpcy5yZXJlbmRl
ckNvbnRhaW5pbmdWaWV3KCk7Ci0gIH0sCi0KLSAgY29udGVudEFycmF5V2lsbENoYW5nZTogRW1i
ZXIuSywKLQotICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMu
cmVyZW5kZXJDb250YWluaW5nVmlldygpOwotICB9LAotCi0gIGxvb2t1cENvbnRlbnQ6IGZ1bmN0
aW9uKCkgewotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmdldCh0aGlzLm5vcm1hbGl6ZWRS
b290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLm9wdGlvbnMpOwotICB9LAotCi0gIGFkZEFy
cmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuY29udGVudCkgeyByZXR1
cm47IH0KLQotICAgIHRoaXMuY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAg
IHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgIGRpZENoYW5nZTog
J2NvbnRlbnRBcnJheURpZENoYW5nZScKLSAgICB9KTsKLSAgfSwKLQotICByZW1vdmVBcnJheU9i
c2VydmVyczogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9
Ci0KLSAgICB0aGlzLmNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICB3
aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICBkaWRDaGFuZ2U6ICdj
b250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0gIH0sCi0KLSAgYWRkQ29udGVudE9ic2Vy
dmVyczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcy5ub3Jt
YWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50V2lsbENo
YW5nZSk7Ci0gICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5u
b3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50RGlkQ2hhbmdlKTsKLSAgfSwKLQotICBy
ZW1vdmVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAgICBFbWJlci5yZW1vdmVCZWZv
cmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlz
LmNvbnRlbnRXaWxsQ2hhbmdlKTsKLSAgICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLm5vcm1h
bGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLmNvbnRlbnREaWRDaGFuZ2UpOwot
ICB9LAotCi0gIHJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsg
cmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9IHRoaXMuY29udGVudCwKLSAgICAgICAgY29u
dGVudExlbmd0aCA9IGdldChjb250ZW50LCAnbGVuZ3RoJyksCi0gICAgICAgIGRhdGEgPSB0aGlz
Lm9wdGlvbnMuZGF0YSwKLSAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlOwotCi0gICAg
ZGF0YS5pbnNpZGVFYWNoID0gdHJ1ZTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnRM
ZW5ndGg7IGkrKykgewotICAgICAgdGVtcGxhdGUoY29udGVudC5vYmplY3RBdChpKSwgeyBkYXRh
OiBkYXRhIH0pOwotICAgIH0KLSAgfSwKLQotICByZXJlbmRlckNvbnRhaW5pbmdWaWV3OiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxlT25j
ZSgncmVuZGVyJywgdGhpcywgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBJdCdzIHBvc3NpYmxlIGl0
J3MgYmVlbiBkZXN0cm95ZWQgYWZ0ZXIgd2UgZW5xdWV1ZWQgYSByZS1yZW5kZXIgY2FsbC4KLSAg
ICAgIGlmICghc2VsZi5kZXN0cm95ZWQpIHsKLSAgICAgICAgc2VsZi5jb250YWluaW5nVmlldy5y
ZXJlbmRlcigpOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMucmVtb3ZlQ29udGVudE9ic2VydmVycygpOwotICAgIGlmICh0aGlzLmNv
bnRlbnQpIHsKLSAgICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKTsKLSAgICB9Ci0gICAg
dGhpcy5kZXN0cm95ZWQgPSB0cnVlOwotICB9Ci19OwotCi0vKioKLSAgVGhlIGB7eyNlYWNofX1g
IGhlbHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGluIGEgY29sbGVjdGlvbiwgcmVuZGVyaW5nIGl0
cwotICBibG9jayBvbmNlIGZvciBlYWNoIGl0ZW0uIEl0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUg
YmFzZSBIYW5kbGViYXJzIGB7eyNlYWNofX1gCi0gIGhlbHBlcjoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIERldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1ZGEnfSx7bmFtZTogJ1RvbSd9LCB7bmFtZTog
J1BhdWwnfV07Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBEZXZlbG9wZXJz
fX0KLSAgICB7e25hbWV9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgYHt7ZWFjaH19YCBzdXBw
b3J0cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVtZW50IG5hbWluZzoKLQotICBgYGBo
YW5kbGViYXJzCi0gIHt7I2VhY2ggcGVyc29uIGluIERldmVsb3BlcnN9fQotICAgIHt7cGVyc29u
Lm5hbWV9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgV2hlbiBsb29waW5nIG92ZXIgb2JqZWN0
cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMsIGB7e3RoaXN9fWAgY2FuIGJlIHVzZWQKLSAg
dG8gcmVuZGVyIHRoZSBvYmplY3Q6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBEZXZlbG9wZXJOYW1l
cyA9IFsnWWVodWRhJywgJ1RvbScsICdQYXVsJ10KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwot
ICB7eyNlYWNoIERldmVsb3Blck5hbWVzfX0KLSAgICB7e3RoaXN9fQotICB7ey9lYWNofX0KLSAg
YGBgCi0gICMjIyB7e2Vsc2V9fSBjb25kaXRpb24KLSAgYHt7I2VhY2h9fWAgY2FuIGhhdmUgYSBt
YXRjaGluZyBge3tlbHNlfX1gLiBUaGUgY29udGVudHMgb2YgdGhpcyBibG9jayB3aWxsIHJlbmRl
cgotICBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4KLQotICBgYGAKLSAge3sjZWFjaCBwZXJz
b24gaW4gRGV2ZWxvcGVyc319Ci0gICAge3twZXJzb24ubmFtZX19Ci0gIHt7ZWxzZX19Ci0gICAg
PHA+U29ycnksIG5vYm9keSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgdGFzay48L3A+Ci0gIHt7L2Vh
Y2h9fQotICBgYGAKLSAgIyMjIFNwZWNpZnlpbmcgYSBWaWV3IGNsYXNzIGZvciBpdGVtcwotICBJ
ZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFzc2Agb3B0aW9uIHRoYXQgcmVmZXJlbmNlcyBh
IHZpZXcgY2xhc3MKLSAgd2l0aCBpdHMgb3duIGB0ZW1wbGF0ZWAgeW91IGNhbiBvbWl0IHRoZSBi
bG9jay4KLQotICBUaGUgZm9sbG93aW5nIHRlbXBsYXRlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
e3sjdmlldyBBcHAuTXlWaWV3IH19Ci0gICAge3tlYWNoIHZpZXcuaXRlbXMgaXRlbVZpZXdDbGFz
cz0iQXBwLkFuSXRlbVZpZXcifX0KLSAge3svdmlld319Ci0gIGBgYAotCi0gIEFuZCBhcHBsaWNh
dGlvbiBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5j
cmVhdGUoewotICAgIE15VmlldzogRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgaXRlbXM6IFsK
LSAgICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgICAgIEVt
YmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdNYXJ5J30pLAotICAgICAgICBFbWJlci5PYmplY3Qu
Y3JlYXRlKHtuYW1lOiAnU2FyYSd9KQotICAgICAgXQotICAgIH0pCi0gIH0pOwotCi0gIEFwcC5B
bkl0ZW1WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoIkdyZWV0aW5ncyB7e25hbWV9fSIpCi0gIH0pOwotICBgYGAKLQotICBX
aWxsIHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKLQotICBgYGBodG1sCi0gIDxk
aXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0
aW5ncyBEYXZlPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIE1h
cnk8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgU2FyYTwvZGl2
PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYW4gYGl0ZW1WaWV3Q2xhc3NgIGlzIGRlZmluZWQg
b24gdGhlIGhlbHBlciwgYW5kIHRoZXJlZm9yZSB0aGUgaGVscGVyIGlzIG5vdAotICBiZWluZyB1
c2VkIGFzIGEgYmxvY2ssIGFuIGBlbXB0eVZpZXdDbGFzc2AgY2FuIGFsc28gYmUgcHJvdmlkZWQg
b3B0aW9uYWxseS4KLSAgVGhlIGBlbXB0eVZpZXdDbGFzc2Agd2lsbCBtYXRjaCB0aGUgYmVoYXZp
b3Igb2YgdGhlIGB7e2Vsc2V9fWAgY29uZGl0aW9uCi0gIGRlc2NyaWJlZCBhYm92ZS4gVGhhdCBp
cywgdGhlIGBlbXB0eVZpZXdDbGFzc2Agd2lsbCByZW5kZXIgaWYgdGhlIGNvbGxlY3Rpb24KLSAg
aXMgZW1wdHkuCi0KLSAgIyMjIFJlcHJlc2VudGluZyBlYWNoIGl0ZW0gd2l0aCBhIENvbnRyb2xs
ZXIuCi0gIEJ5IGRlZmF1bHQgdGhlIGNvbnRyb2xsZXIgbG9va3VwIHdpdGhpbiBhbiBge3sjZWFj
aH19YCBibG9jayB3aWxsIGJlCi0gIHRoZSBjb250cm9sbGVyIG9mIHRoZSB0ZW1wbGF0ZSB3aGVy
ZSB0aGUgYHt7I2VhY2h9fWAgd2FzIHVzZWQuIElmIGVhY2gKLSAgaXRlbSBuZWVkcyB0byBiZSBw
cmVzZW50ZWQgYnkgYSBjdXN0b20gY29udHJvbGxlciB5b3UgY2FuIHByb3ZpZGUgYQotICBgaXRl
bUNvbnRyb2xsZXJgIG9wdGlvbiB3aGljaCByZWZlcmVuY2VzIGEgY29udHJvbGxlciBieSBsb29r
dXAgbmFtZS4KLSAgRWFjaCBpdGVtIGluIHRoZSBsb29wIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBp
bnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIKLSAgYW5kIHRoZSBpdGVtIGl0c2VsZiB3aWxsIGJl
IHNldCB0byB0aGUgYGNvbnRlbnRgIHByb3BlcnR5IG9mIHRoYXQgY29udHJvbGxlci4KLQotICBU
aGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBwcm9wZXJ0aWVzIG9mIG1vZGVsIG9iamVjdHMg
bmVlZCB0cmFuc2Zvcm1hdGlvbgotICBvciBzeW50aGVzaXMgZm9yIGRpc3BsYXk6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAuRGV2ZWxvcGVyQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRy
b2xsZXIuZXh0ZW5kKHsKLSAgICBpc0F2YWlsYWJsZUZvckhpcmU6IGZ1bmN0aW9uKCkgewotICAg
ICAgcmV0dXJuICF0aGlzLmdldCgnY29udGVudC5pc0VtcGxveWVkJykgJiYgdGhpcy5nZXQoJ2Nv
bnRlbnQuaXNTZWVraW5nV29yaycpOwotICAgIH0ucHJvcGVydHkoJ2lzRW1wbG95ZWQnLCAnaXNT
ZWVraW5nV29yaycpCi0gIH0pCi0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBw
ZXJzb24gaW4gZGV2ZWxvcGVycyBpdGVtQ29udHJvbGxlcj0iZGV2ZWxvcGVyIn19Ci0gICAge3tw
ZXJzb24ubmFtZX19IHt7I2lmIHBlcnNvbi5pc0F2YWlsYWJsZUZvckhpcmV9fUhpcmUgbWUhe3sv
aWZ9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgRWFjaCBpdGVtQ29udHJvbGxlciB3aWxsIHJl
Y2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciBhcwotICBhIGBwYXJl
bnRDb250cm9sbGVyYCBwcm9wZXJ0eS4KLQotICAjIyMgKEV4cGVyaW1lbnRhbCkgR3JvdXBlZCBF
YWNoCi0KLSAgV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGV4cGVyaW1lbnRhbCBb
Z3JvdXAgaGVscGVyXShodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9ncm91cC1oZWxwZXIpLAot
ICB5b3UgY2FuIGluZm9ybSBIYW5kbGViYXJzIHRvIHJlLXJlbmRlciBhbiBlbnRpcmUgZ3JvdXAg
b2YgaXRlbXMgaW5zdGVhZCBvZgotICByZS1yZW5kZXJpbmcgdGhlbSBvbmUgYXQgYSB0aW1lIChp
biB0aGUgZXZlbnQgdGhhdCB0aGV5IGFyZSBjaGFuZ2VkIGVuIG1hc3NlCi0gIG9yIGFuIGl0ZW0g
aXMgYWRkZWQvcmVtb3ZlZCkuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNncm91cH19Ci0gICAg
e3sjZWFjaCBwZW9wbGV9fQotICAgICAge3tmaXJzdE5hbWV9fSB7e2xhc3ROYW1lfX0KLSAgICB7
ey9lYWNofX0KLSAge3svZ3JvdXB9fQotICBgYGAKLQotICBUaGlzIGNhbiBiZSBmYXN0ZXIgdGhh
biB0aGUgbm9ybWFsIHdheSB0aGF0IEhhbmRsZWJhcnMgcmUtcmVuZGVycyBpdGVtcwotICBpbiBz
b21lIGNhc2VzLgotCi0gIElmIGZvciBzb21lIHJlYXNvbiB5b3UgaGF2ZSBhIGdyb3VwIHdpdGgg
bW9yZSB0aGFuIG9uZSBgI2VhY2hgLCB5b3UgY2FuIG1ha2UKLSAgb25lIG9mIHRoZSBjb2xsZWN0
aW9ucyBiZSB1cGRhdGVkIGluIG5vcm1hbCAobm9uLWdyb3VwZWQpIGZhc2hpb24gYnkgc2V0dGlu
ZwotICB0aGUgb3B0aW9uIGBncm91cGVkUm93cz10cnVlYCAoY291bnRlci1pbnR1aXRpdmUsIEkg
a25vdykuCi0KLSAgRm9yIGV4YW1wbGUsCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e2RlYWxlcnNo
aXBOYW1lfX0KLQotICB7eyNncm91cH19Ci0gICAge3sjZWFjaCBkZWFsZXJzfX0KLSAgICAgIHt7
Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19Ci0gICAge3svZWFjaH19Ci0KLSAgICB7eyNlYWNoIGNh
ciBpbiBjYXJzIGdyb3VwZWRSb3dzPXRydWV9fQotICAgICAge3tjYXIubWFrZX19IHt7Y2FyLm1v
ZGVsfX0ge3tjYXIuY29sb3J9fQotICAgIHt7L2VhY2h9fQotICB7ey9ncm91cH19Ci0gIGBgYAot
ICBBbnkgY2hhbmdlIHRvIGBkZWFsZXJzaGlwTmFtZWAgb3IgdGhlIGBkZWFsZXJzYCBjb2xsZWN0
aW9uIHdpbGwgY2F1c2UgdGhlCi0gIGVudGlyZSBncm91cCB0byBiZSByZS1yZW5kZXJlZC4gSG93
ZXZlciwgY2hhbmdlcyB0byB0aGUgYGNhcnNgIGNvbGxlY3Rpb24KLSAgd2lsbCBiZSByZS1yZW5k
ZXJlZCBpbmRpdmlkdWFsbHkgKGFzIG5vcm1hbCkuCi0KLSAgTm90ZSB0aGF0IGBncm91cGAgYmVo
YXZpb3IgaXMgYWxzbyBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIGFuIGBpdGVtVmlld0NsYXNzYC4K
LQotICBAbWV0aG9kIGVhY2gKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBh
cmFtIFtuYW1lXSB7U3RyaW5nfSBuYW1lIGZvciBpdGVtICh1c2VkIHdpdGggYGluYCkKLSAgQHBh
cmFtIFtwYXRoXSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSBbb3B0aW9uc10ge09iamVjdH0gSGFu
ZGxlYmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0aW9ucwotICBAcGFyYW0gW29wdGlvbnMuaXRl
bVZpZXdDbGFzc10ge1N0cmluZ30gYSBwYXRoIHRvIGEgdmlldyBjbGFzcyB1c2VkIGZvciBlYWNo
IGl0ZW0KLSAgQHBhcmFtIFtvcHRpb25zLml0ZW1Db250cm9sbGVyXSB7U3RyaW5nfSBuYW1lIG9m
IGEgY29udHJvbGxlciB0byBiZSBjcmVhdGVkIGZvciBlYWNoIGl0ZW0KLSAgQHBhcmFtIFtvcHRp
b25zLmdyb3VwZWRSb3dzXSB7Ym9vbGVhbn0gZW5hYmxlIG5vcm1hbCBpdGVtLWJ5LWl0ZW0gcmVu
ZGVyaW5nIHdoZW4gaW5zaWRlIGEgYCNncm91cGAgaGVscGVyCi0qLwotRW1iZXIuSGFuZGxlYmFy
cy5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uIGVhY2hIZWxwZXIocGF0aCwgb3B0aW9u
cykgewotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkgewotICAgIEVtYmVyLmFzc2VydCgi
SWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgZWFjaCBoZWxwZXIsIGl0
IG11c3QgYmUgaW4gdGhlIGZvcm0gI2VhY2ggZm9vIGluIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0g
ImluIik7Ci0KLSAgICB2YXIga2V5d29yZE5hbWUgPSBhcmd1bWVudHNbMF07Ci0KLSAgICBvcHRp
b25zID0gYXJndW1lbnRzWzNdOwotICAgIHBhdGggPSBhcmd1bWVudHNbMl07Ci0gICAgaWYgKHBh
dGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0KLQotICAgIG9wdGlvbnMuaGFzaC5rZXl3b3Jk
ID0ga2V5d29yZE5hbWU7Ci0gIH0KLQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewot
ICAgIG9wdGlvbnMgPSBwYXRoOwotICAgIHBhdGggPSAndGhpcyc7Ci0gIH0KLQotICBvcHRpb25z
Lmhhc2guZGF0YVNvdXJjZUJpbmRpbmcgPSBwYXRoOwotICAvLyBTZXQgdXAgZW1wdHlWaWV3IGFz
IGEgbWV0YW1vcnBoIHdpdGggbm8gdGFnCi0gIC8vb3B0aW9ucy5oYXNoLmVtcHR5Vmlld0NsYXNz
ID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7Ci0KLSAgaWYgKG9wdGlvbnMuZGF0YS5pbnNpZGVHcm91
cCAmJiAhb3B0aW9ucy5oYXNoLmdyb3VwZWRSb3dzICYmICFvcHRpb25zLmhhc2guaXRlbVZpZXdD
bGFzcykgewotICAgIG5ldyBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoKHRoaXMsIHBhdGgs
IG9wdGlvbnMpLnJlbmRlcigpOwotICB9IGVsc2UgewotICAgIHJldHVybiBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMuY29sbGVjdGlvbi5jYWxsKHRoaXMsICdFbWJlci5IYW5kbGViYXJzLkVhY2hW
aWV3Jywgb3B0aW9ucyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLS8q
KgotICBgdGVtcGxhdGVgIGFsbG93cyB5b3UgdG8gcmVuZGVyIGEgdGVtcGxhdGUgZnJvbSBpbnNp
ZGUgYW5vdGhlciB0ZW1wbGF0ZS4KLSAgVGhpcyBhbGxvd3MgeW91IHRvIHJlLXVzZSB0aGUgc2Ft
ZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBwbGFjZXMuIEZvciBleGFtcGxlOgotCi0gIGBgYGh0bWwK
LSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJs
b2dnZWRfaW5fdXNlciI+Ci0gICAge3sjd2l0aCBsb2dnZWRJblVzZXJ9fQotICAgICAgTGFzdCBM
b2dpbjoge3tsYXN0TG9naW59fQotICAgICAgVXNlciBJbmZvOiB7e3RlbXBsYXRlICJ1c2VyX2lu
Zm8ifX0KLSAgICB7ey93aXRofX0KLSAgPC9zY3JpcHQ+Ci0gIGBgYAotCi0gIGBgYGh0bWwKLSAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ1c2Vy
X2luZm8iPgotICAgIE5hbWU6IDxlbT57e25hbWV9fTwvZW0+Ci0gICAgS2FybWE6IDxlbT57e2th
cm1hfX08L2VtPgotICA8L3NjcmlwdD4KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNp
ZiBpc1VzZXJ9fQotICAgIHt7dGVtcGxhdGUgInVzZXJfaW5mbyJ9fQotICB7e2Vsc2V9fQotICAg
IHt7dGVtcGxhdGUgInVubG9nZ2VkX3VzZXJfaW5mbyJ9fQotICB7ey9pZn19Ci0gIGBgYAotCi0g
IFRoaXMgaGVscGVyIGxvb2tzIGZvciB0ZW1wbGF0ZXMgaW4gdGhlIGdsb2JhbCBgRW1iZXIuVEVN
UExBVEVTYCBoYXNoLiBJZiB5b3UKLSAgYWRkIGA8c2NyaXB0PmAgdGFncyB0byB5b3VyIHBhZ2Ug
d2l0aCB0aGUgYGRhdGEtdGVtcGxhdGUtbmFtZWAgYXR0cmlidXRlIHNldCwKLSAgdGhleSB3aWxs
IGJlIGNvbXBpbGVkIGFuZCBwbGFjZWQgaW4gdGhpcyBoYXNoIGF1dG9tYXRpY2FsbHkuCi0KLSAg
WW91IGNhbiBhbHNvIG1hbnVhbGx5IHJlZ2lzdGVyIHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0
byB0aGUgaGFzaDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLlRFTVBMQVRFU1sibXlfY29v
bF90ZW1wbGF0ZSJdID0gRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8Yj57e3VzZXJ9fTwvYj4n
KTsKLSAgYGBgCi0KLSAgQGRlcHJlY2F0ZWQKLSAgQG1ldGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVt
YmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lIHRo
ZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSovCi0KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxw
ZXIoJ3RlbXBsYXRlJywgZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewotICBFbWJlci5kZXByZWNh
dGUoIlRoZSBgdGVtcGxhdGVgIGhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9m
IHRoZSBgcGFydGlhbGAgaGVscGVyLiBQbGVhc2UgdXNlIGBwYXJ0aWFsYCBpbnN0ZWFkLCB3aGlj
aCB3aWxsIHdvcmsgdGhlIHNhbWUgd2F5LiIpOwotICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLnBhcnRpYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLX0pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhh
bmRsZWJhcnMKLSovCi0KLS8qKgotICBUaGUgYHBhcnRpYWxgIGhlbHBlciByZW5kZXJzIGFub3Ro
ZXIgdGVtcGxhdGUgd2l0aG91dAotICBjaGFuZ2luZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKLQot
ICBgYGBoYW5kbGViYXJzCi0gIHt7Zm9vfX0KLSAge3twYXJ0aWFsICJuYXYifX0KLSAgYGBgCi0K
LSAgVGhlIGFib3ZlIGV4YW1wbGUgdGVtcGxhdGUgd2lsbCByZW5kZXIgYSB0ZW1wbGF0ZSBuYW1l
ZAotICAiX25hdiIsIHdoaWNoIGhhcyB0aGUgc2FtZSBjb250ZXh0IGFzIHRoZSBwYXJlbnQgdGVt
cGxhdGUKLSAgaXQncyByZW5kZXJlZCBpbnRvLCBzbyBpZiB0aGUgIl9uYXYiIHRlbXBsYXRlIGFs
c28gcmVmZXJlbmNlZAotICBge3tmb299fWAsIGl0IHdvdWxkIHByaW50IHRoZSBzYW1lIHRoaW5n
IGFzIHRoZSBge3tmb299fWAKLSAgaW4gdGhlIGFib3ZlIGV4YW1wbGUuCi0KLSAgSWYgYSAiX25h
diIgdGVtcGxhdGUgaXNuJ3QgZm91bmQsIHRoZSBgcGFydGlhbGAgaGVscGVyIHdpbGwKLSAgZmFs
bCBiYWNrIHRvIGEgdGVtcGxhdGUgbmFtZWQgIm5hdiIuCi0KLSAgIyMgQm91bmQgdGVtcGxhdGUg
bmFtZXMKLQotICBUaGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGBwYXJ0aWFsYCBjYW4gYWxzbyBi
ZSBhIHBhdGgKLSAgdG8gYSBwcm9wZXJ0eSBjb250YWluaW5nIGEgdGVtcGxhdGUgbmFtZSwgZS5n
LjoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7cGFydGlhbCBzb21lVGVtcGxhdGVOYW1lfX0KLSAg
YGBgCi0KLSAgVGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBgc29t
ZVRlbXBsYXRlTmFtZWAKLSAgb24gdGhlIHRlbXBsYXRlIGNvbnRleHQgKGUuZy4gYSBjb250cm9s
bGVyKSBhbmQgdXNlIHRoYXQKLSAgdmFsdWUgYXMgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRv
IHJlbmRlci4gSWYgdGhlIHJlc29sdmVkCi0gIHZhbHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwg
YmUgcmVuZGVyZWQuIElmIGBzb21lVGVtcGxhdGVOYW1lYAotICBjaGFuZ2VzLCB0aGUgcGFydGlh
bCB3aWxsIGJlIHJlLXJlbmRlcmVkIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGUKLSAgbmFtZS4KLQot
ICAjIyBTZXR0aW5nIHRoZSBwYXJ0aWFsJ3MgY29udGV4dCB3aXRoIGB3aXRoYAotCi0gIFRoZSBg
cGFydGlhbGAgaGVscGVyIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB3aXRo
YAotICBoZWxwZXIgdG8gc2V0IGEgY29udGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgcGFy
dGlhbDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I3dpdGggY3VycmVudFVzZXJ9fQotICAgIHt7
cGFydGlhbCAidXNlcl9pbmZvIn19Ci0gIHt7L3dpdGh9fQotICBgYGAKLQotICBAbWV0aG9kIHBh
cnRpYWwKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9
IHBhcnRpYWxOYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgbWludXMgdGhl
IGxlYWRpbmcgdW5kZXJzY29yZQotKi8KLQotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBl
cigncGFydGlhbCcsIGZ1bmN0aW9uIHBhcnRpYWxIZWxwZXIobmFtZSwgb3B0aW9ucykgewotCi0g
IHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5n
dGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXM7Ci0KLSAgaWYgKG9wdGlvbnMudHlwZXNb
MF0gPT09ICJJRCIpIHsKLSAgICAvLyBIZWxwZXIgd2FzIHBhc3NlZCBhIHByb3BlcnR5IHBhdGg7
IHdlIG5lZWQgdG8KLSAgICAvLyBjcmVhdGUgYSBiaW5kaW5nIHRoYXQgd2lsbCByZS1yZW5kZXIg
d2hlbmV2ZXIKLSAgICAvLyB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgb3B0aW9ucy5mbiA9
IGZ1bmN0aW9uKGNvbnRleHQsIGZuT3B0aW9ucykgewotICAgICAgdmFyIHBhcnRpYWxOYW1lID0g
RW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwgbmFtZSwgZm5PcHRpb25zKTsKLSAgICAgIHJl
bmRlclBhcnRpYWwoY29udGV4dCwgcGFydGlhbE5hbWUsIGZuT3B0aW9ucyk7Ci0gICAgfTsKLQot
ICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmJpbmQuY2FsbChjb250ZXh0LCBuYW1lLCBvcHRp
b25zLCB0cnVlLCBleGlzdHMpOwotICB9IGVsc2UgewotICAgIC8vIFJlbmRlciB0aGUgcGFydGlh
bCByaWdodCBpbnRvIHBhcmVudCB0ZW1wbGF0ZS4KLSAgICByZW5kZXJQYXJ0aWFsKGNvbnRleHQs
IG5hbWUsIG9wdGlvbnMpOwotICB9Ci19KTsKLQotZnVuY3Rpb24gZXhpc3RzKHZhbHVlKSB7Ci0g
IHJldHVybiAhRW1iZXIuaXNOb25lKHZhbHVlKTsKLX0KLQotZnVuY3Rpb24gcmVuZGVyUGFydGlh
bChjb250ZXh0LCBuYW1lLCBvcHRpb25zKSB7Ci0gIHZhciBuYW1lUGFydHMgPSBuYW1lLnNwbGl0
KCIvIiksCi0gICAgICBsYXN0UGFydCA9IG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV07
Ci0KLSAgbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXSA9ICJfIiArIGxhc3RQYXJ0Owot
Ci0gIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXcsCi0gICAgICB1bmRlcnNjb3JlZE5hbWUg
PSBuYW1lUGFydHMuam9pbigiLyIpLAotICAgICAgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlRm9y
TmFtZSh1bmRlcnNjb3JlZE5hbWUpLAotICAgICAgZGVwcmVjYXRlZFRlbXBsYXRlID0gIXRlbXBs
YXRlICYmIHZpZXcudGVtcGxhdGVGb3JOYW1lKG5hbWUpOwotCi0gIEVtYmVyLmFzc2VydCgiVW5h
YmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgJyIrbmFtZSsiJy4iLCB0ZW1wbGF0ZSB8fCBk
ZXByZWNhdGVkVGVtcGxhdGUpOwotCi0gIHRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZGVwcmVjYXRl
ZFRlbXBsYXRlOwotCi0gIHRlbXBsYXRlKGNvbnRleHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0p
OwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1A
c3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIGB7e3lpZWxkfX1gIGRlbm90ZXMgYW4gYXJlYSBvZiBh
IHRlbXBsYXRlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbnNpZGUKLSAgb2YgYW5vdGhlciB0ZW1w
bGF0ZS4gSXQgaGFzIHR3byBtYWluIHVzZXM6Ci0KLSAgIyMjIFVzZSB3aXRoIGBsYXlvdXRgCi0g
IFdoZW4gdXNlZCBpbiBhIEhhbmRsZWJhcnMgdGVtcGxhdGUgdGhhdCBpcyBhc3NpZ25lZCB0byBh
biBgRW1iZXIuVmlld2AKLSAgaW5zdGFuY2UncyBgbGF5b3V0YCBwcm9wZXJ0eSBFbWJlciB3aWxs
IHJlbmRlciB0aGUgbGF5b3V0IHRlbXBsYXRlIGZpcnN0LAotICBpbnNlcnRpbmcgdGhlIHZpZXcn
cyBvd24gcmVuZGVyZWQgb3V0cHV0IGF0IHRoZSBge3t5aWVsZH19YCBsb2NhdGlvbi4KLQotICBB
biBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbiBjb2RlOgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NO
YW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKLSAgICBsYXlvdXQ6IEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgnPGRpdiBjbGFzcz0id3JhcHBlciI+e3t5aWVsZH19PC9kaXY+JyksCi0gICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPHNwYW4+SSBhbSB3cmFwcGVkPC9z
cGFuPicpCi0gIH0pOwotCi0gIGFWaWV3ID0gQVZpZXcuY3JlYXRlKCk7Ci0gIGFWaWV3LmFwcGVu
ZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRN
TCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSdlbWJlci12
aWV3IGEtdmlldy13aXRoLWxheW91dCc+Ci0gICAgICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KLSAg
ICAgICAgPHNwYW4+SSBhbSB3cmFwcGVkPC9zcGFuPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+
Ci0gIDwvYm9keT4KLSAgYGBgCi0KLSAgVGhlIGB5aWVsZGAgaGVscGVyIGNhbm5vdCBiZSB1c2Vk
IG91dHNpZGUgb2YgYSB0ZW1wbGF0ZSBhc3NpZ25lZCB0byBhbgotICBgRW1iZXIuVmlld2AncyBg
bGF5b3V0YCBwcm9wZXJ0eSBhbmQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBhdHRlbXB0ZWQuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBCVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFz
c05hbWVzOiBbJ2Etdmlldy13aXRoLWxheW91dCddLAotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoJ3t7eWllbGR9fScpCi0gIH0pOwotCi0gIGJWaWV3ID0gQlZpZXcuY3Jl
YXRlKCk7Ci0gIGJWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0KLSAgLy8gdGhyb3dzCi0gIC8vIFVu
Y2F1Z2h0IEVycm9yOiBhc3NlcnRpb24gZmFpbGVkOgotICAvLyBZb3UgY2FsbGVkIHlpZWxkIGlu
IGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGEgbGF5b3V0Ci0gIGBgYAotCi0gICMjIyBVc2Ugd2l0
aCBFbWJlci5Db21wb25lbnQKLSAgV2hlbiBkZXNpZ25pbmcgY29tcG9uZW50cyBge3t5aWVsZH19
YCBpcyB1c2VkIHRvIGRlbm90ZSB3aGVyZSwgaW5zaWRlIHRoZSBjb21wb25lbnQncwotICB0ZW1w
bGF0ZSwgYW4gb3B0aW9uYWwgYmxvY2sgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQgc2hvdWxkIHJl
bmRlcjoKLQotICBgYGBoYW5kbGViYXJzCi0gIDwhLS0gYXBwbGljYXRpb24uaGJzIC0tPgotICB7
eyNsYWJlbGVkLXRleHRmaWVsZCB2YWx1ZT1zb21lUHJvcGVydHl9fQotICAgIEZpcnN0IG5hbWU6
Ci0gIHt7L2xhYmVsZWQtdGV4dGZpZWxkfX0KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICA8
IS0tIGNvbXBvbmVudHMvbGFiZWxlZC10ZXh0ZmllbGQuaGJzIC0tPgotICA8bGFiZWw+Ci0gICAg
e3t5aWVsZH19IHt7aW5wdXQgdmFsdWU9dmFsdWV9fQotICA8L2xhYmVsPgotICBgYGAKLQotICBS
ZXN1bHQ6Ci0KLSAgYGBgaHRtbAotICA8bGFiZWw+Ci0gICAgRmlyc3QgbmFtZTogPGlucHV0IHR5
cGU9InRleHQiIC8+Ci0gIDxsYWJlbD4KLSAgYGBgCi0KLSAgQG1ldGhvZCB5aWVsZAotICBAZm9y
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJl
dHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJI
ZWxwZXIoJ3lpZWxkJywgZnVuY3Rpb24geWllbGRIZWxwZXIob3B0aW9ucykgewotICB2YXIgdmll
dyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0gIHdoaWxlICh2aWV3ICYmICFnZXQodmlldywgJ2xh
eW91dCcpKSB7Ci0gICAgaWYgKHZpZXcuX2NvbnRleHRWaWV3KSB7Ci0gICAgICB2aWV3ID0gdmll
dy5fY29udGV4dFZpZXc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3Bh
cmVudFZpZXcnKTsKLSAgICB9Ci0gIH0KLQotICBFbWJlci5hc3NlcnQoIllvdSBjYWxsZWQgeWll
bGQgaW4gYSB0ZW1wbGF0ZSB0aGF0IHdhcyBub3QgYSBsYXlvdXQiLCAhIXZpZXcpOwotCi0gIHZp
ZXcuX3lpZWxkKHRoaXMsIG9wdGlvbnMpOwotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8K
LQotLyoqCi0gIGBsb2NgIGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhlIGxvY2FsaXplZCBzdHJp
bmdzIGhhc2guCi0gIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBG
b3IgZXhhbXBsZToKLQotICBgYGBodG1sCi0gIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJh
cnMiIGRhdGEtdGVtcGxhdGUtbmFtZT0iaG9tZSI+Ci0gICAge3tsb2MgIndlbGNvbWUifX0KLSAg
PC9zY3JpcHQ+Ci0gIGBgYAotCi0gIFRha2Ugbm90ZSB0aGF0IGAid2VsY29tZSJgIGlzIGEgc3Ry
aW5nIGFuZCBub3QgYW4gb2JqZWN0Ci0gIHJlZmVyZW5jZS4KLQotICBAbWV0aG9kIGxvYwotICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBz
dHJpbmcgdG8gZm9ybWF0Ci0qLwotCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCds
b2MnLCBmdW5jdGlvbiBsb2NIZWxwZXIoc3RyKSB7Ci0gIHJldHVybiBFbWJlci5TdHJpbmcubG9j
KHN0cik7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgc2V0ID0gRW1i
ZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNl
ZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5wdXR9fWAKLSAgaGVscGVyIGlz
IHVzZWQgd2l0aCBgdHlwZWAgb2YgYGNoZWNrYm94YC4KLQotICBTZWUgW2hhbmRsZWJhcnMuaGVs
cGVycy5pbnB1dF0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21l
dGhvZF9pbnB1dCkgIGZvciB1c2FnZSBkZXRhaWxzLgotCi0gICMjIERpcmVjdCBtYW5pcHVsYXRp
b24gb2YgYGNoZWNrZWRgCi0KLSAgVGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUgb2YgYW4gYEVtYmVy
LkNoZWNrYm94YCBvYmplY3Qgc2hvdWxkIGFsd2F5cyBiZSBzZXQKLSAgdGhyb3VnaCB0aGUgRW1i
ZXIgb2JqZWN0IG9yIGJ5IGludGVyYWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKLSAg
cmVwcmVzZW50YXRpb24gdmlhIHRoZSBtb3VzZSwga2V5Ym9hcmQsIG9yIHRvdWNoLiBVcGRhdGlu
ZyB0aGUgdmFsdWUgb2YgdGhlCi0gIGNoZWNrYm94IHZpYSBqUXVlcnkgd2lsbCByZXN1bHQgaW4g
dGhlIGNoZWNrZWQgdmFsdWUgb2YgdGhlIG9iamVjdCBhbmQgaXRzCi0gIGVsZW1lbnQgbG9zaW5n
IHN5bmNocm9uaXphdGlvbi4KLQotICAjIyBMYXlvdXQgYW5kIExheW91dE5hbWUgcHJvcGVydGll
cwotCi0gIEJlY2F1c2UgSFRNTCBgaW5wdXRgIGVsZW1lbnRzIGFyZSBzZWxmIGNsb3NpbmcgYGxh
eW91dGAgYW5kIGBsYXlvdXROYW1lYAotICBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQu
IFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncwotICBsYXlv
dXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBAY2xhc3MgQ2hlY2tib3gKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ2hlY2ti
b3ggPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gIGNsYXNzTmFtZXM6IFsnZW1iZXItY2hlY2tib3gn
XSwKLQotICB0YWdOYW1lOiAnaW5wdXQnLAotCi0gIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5cGUn
LCAnY2hlY2tlZCcsICdpbmRldGVybWluYXRlJywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4JywgJ25h
bWUnXSwKLQotICB0eXBlOiAiY2hlY2tib3giLAotICBjaGVja2VkOiBmYWxzZSwKLSAgZGlzYWJs
ZWQ6IGZhbHNlLAotICBpbmRldGVybWluYXRlOiBmYWxzZSwKLQotICBpbml0OiBmdW5jdGlvbigp
IHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMu
X3VwZGF0ZUVsZW1lbnRWYWx1ZSk7Ci0gIH0sCi0KLSAgZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLmdldCgnZWxlbWVudCcpLmluZGV0
ZXJtaW5hdGUgPSAhIXRoaXMuZ2V0KCdpbmRldGVybWluYXRlJyk7Ci0gIH0sCi0KLSAgX3VwZGF0
ZUVsZW1lbnRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgc2V0KHRoaXMsICdjaGVja2VkJywgdGhp
cy4kKCkucHJvcCgnY2hlY2tlZCcpKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwot
Ki8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgU2hh
cmVkIG1peGluIHVzZWQgYnkgYEVtYmVyLlRleHRGaWVsZGAgYW5kIGBFbWJlci5UZXh0QXJlYWAu
Ci0KLSAgQGNsYXNzIFRleHRTdXBwb3J0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUK
LSovCi1FbWJlci5UZXh0U3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIHZhbHVlOiAi
IiwKLQotICBhdHRyaWJ1dGVCaW5kaW5nczogWydwbGFjZWhvbGRlcicsICdkaXNhYmxlZCcsICdt
YXhsZW5ndGgnLCAndGFiaW5kZXgnLCAncmVhZG9ubHknXSwKLSAgcGxhY2Vob2xkZXI6IG51bGws
Ci0gIGRpc2FibGVkOiBmYWxzZSwKLSAgbWF4bGVuZ3RoOiBudWxsLAotCi0gIGluaXQ6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5vbigiZm9jdXNPdXQiLCB0aGlz
LCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImNoYW5nZSIsIHRo
aXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigicGFzdGUiLCB0
aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImN1dCIsIHRo
aXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigiaW5wdXQiLCB0
aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImtleVVwIiwg
dGhpcywgdGhpcy5pbnRlcnByZXRLZXlFdmVudHMpOwotICB9LAotCi0gIC8qKgotICAgIFRoZSBh
Y3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHJldHVybiBrZXkuCi0K
LSAgICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBm
aXJlZCB3aGVuCi0gICAgdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSB3aGVuIGVkaXRp
bmcgYSB0ZXh0IGZpZWxkLCBhbmQgc2VuZHMKLSAgICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGFz
IHRoZSBjb250ZXh0LgotCi0gICAgQHByb3BlcnR5IGFjdGlvbgotICAgIEB0eXBlIFN0cmluZwot
ICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgYWN0aW9uOiBudWxsLAotCi0gIC8qKgotICAgIFRo
ZSBldmVudCB0aGF0IHNob3VsZCBzZW5kIHRoZSBhY3Rpb24uCi0KLSAgICBPcHRpb25zIGFyZToK
LQotICAgICogYGVudGVyYDogdGhlIHVzZXIgcHJlc3NlZCBlbnRlcgotICAgICogYGtleVByZXNz
YDogdGhlIHVzZXIgcHJlc3NlZCBhIGtleQotCi0gICAgQHByb3BlcnR5IG9uRXZlbnQKLSAgICBA
dHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBlbnRlcgotICAqLwotICBvbkV2ZW50OiAnZW50ZXIn
LAotCi0gIC8qKgotICAgIFdoZXRoZXIgdGhleSBga2V5VXBgIGV2ZW50IHRoYXQgdHJpZ2dlcnMg
YW4gYGFjdGlvbmAgdG8gYmUgc2VudCBjb250aW51ZXMKLSAgICBwcm9wYWdhdGluZyB0byBvdGhl
ciB2aWV3cy4KLQotICAgIEJ5IGRlZmF1bHQsIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0
dXJuIGtleSBvbiB0aGVpciBrZXlib2FyZCBhbmQKLSAgICB0aGUgdGV4dCBmaWVsZCBoYXMgYW4g
YGFjdGlvbmAgc2V0LCB0aGUgYWN0aW9uIHdpbGwgYmUgc2VudCB0byB0aGUgdmlldydzCi0gICAg
Y29udHJvbGxlciBhbmQgdGhlIGtleSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcuCi0KLSAg
ICBJZiB5b3Ugd291bGQgbGlrZSBwYXJlbnQgdmlld3MgdG8gcmVjZWl2ZSB0aGUgYGtleVVwYCBl
dmVudCBldmVuIGFmdGVyIGFuCi0gICAgYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQsIHNldCBg
YnViYmxlc2AgdG8gdHJ1ZS4KLQotICAgIEBwcm9wZXJ0eSBidWJibGVzCi0gICAgQHR5cGUgQm9v
bGVhbgotICAgIEBkZWZhdWx0IGZhbHNlCi0gICovCi0gIGJ1YmJsZXM6IGZhbHNlLAotCi0gIGlu
dGVycHJldEtleUV2ZW50czogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIu
VGV4dFN1cHBvcnQuS0VZX0VWRU5UUzsKLSAgICB2YXIgbWV0aG9kID0gbWFwW2V2ZW50LmtleUNv
ZGVdOwotCi0gICAgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKCk7Ci0gICAgaWYgKG1ldGhv
ZCkgeyByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50KTsgfQotICB9LAotCi0gIF9lbGVtZW50VmFs
dWVEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAndmFsdWUnLCB0aGlzLiQo
KS52YWwoKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdoZW4g
dGhlIHVzZXIgaW5zZXJ0cyBhIG5ldyBsaW5lLgotCi0gICAgQ2FsbGVkIGJ5IHRoZSBgRW1iZXIu
VGV4dFN1cHBvcnRgIG1peGluIG9uIGtleVVwIGlmIGtleWNvZGUgbWF0Y2hlcyAxMy4KLSAgICBV
c2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGVudGVyYCBhY3Rpb24gdG8gdGhlIGNvbnRyb2xs
ZXIuCi0KLSAgICBAbWV0aG9kIGluc2VydE5ld2xpbmUKLSAgICBAcGFyYW0ge0V2ZW50fSBldmVu
dAotICAqLwotICBpbnNlcnROZXdsaW5lOiBmdW5jdGlvbihldmVudCkgewotICAgIHNlbmRBY3Rp
b24oJ2VudGVyJywgdGhpcywgZXZlbnQpOwotICAgIHNlbmRBY3Rpb24oJ2luc2VydC1uZXdsaW5l
JywgdGhpcywgZXZlbnQpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSB1c2Vy
IGhpdHMgZXNjYXBlLgotCi0gICAgQ2FsbGVkIGJ5IHRoZSBgRW1iZXIuVGV4dFN1cHBvcnRgIG1p
eGluIG9uIGtleVVwIGlmIGtleWNvZGUgbWF0Y2hlcyAyNy4KLSAgICBVc2VzIHNlbmRBY3Rpb24g
dG8gc2VuZCB0aGUgYGVzY2FwZS1wcmVzc2AgYWN0aW9uIHRvIHRoZSBjb250cm9sbGVyLgotCi0g
ICAgQG1ldGhvZCBjYW5jZWwKLSAgICBAcGFyYW0ge0V2ZW50fSBldmVudAotICAqLwotICBjYW5j
ZWw6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbignZXNjYXBlLXByZXNzJywgdGhp
cywgZXZlbnQpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSB0ZXh0IGFyZWEg
aXMgZm9jdXNlZC4KLQotICAgIEBtZXRob2QgZm9jdXNJbgotICAgIEBwYXJhbSB7RXZlbnR9IGV2
ZW50Ci0gICovCi0gIGZvY3VzSW46IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbign
Zm9jdXMtaW4nLCB0aGlzLCBldmVudCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4g
dGhlIHRleHQgYXJlYSBpcyBibHVycmVkLgotCi0gICAgQG1ldGhvZCBmb2N1c091dAotICAgIEBw
YXJhbSB7RXZlbnR9IGV2ZW50Ci0gICovCi0gIGZvY3VzT3V0OiBmdW5jdGlvbihldmVudCkgewot
ICAgIHNlbmRBY3Rpb24oJ2ZvY3VzLW91dCcsIHRoaXMsIGV2ZW50KTsKLSAgfSwKLQotICAvKioK
LSAgICBUaGUgYWN0aW9uIHRvIGJlIHNlbnQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEga2V5LiBF
bmFibGVkIGJ5IHNldHRpbmcKLSAgICB0aGUgYG9uRXZlbnRgIHByb3BlcnR5IHRvIGBrZXlQcmVz
c2AuCi0KLSAgICBVc2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGtleVByZXNzYCBhY3Rpb24g
dG8gdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBAbWV0aG9kIGtleVByZXNzCi0gICAgQHBhcmFtIHtF
dmVudH0gZXZlbnQKLSAgKi8KLSAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2Vu
ZEFjdGlvbigna2V5LXByZXNzJywgdGhpcywgZXZlbnQpOwotICB9Ci0KLX0pOwotCi1FbWJlci5U
ZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0gewotICAxMzogJ2luc2VydE5ld2xpbmUnLAotICAyNzog
J2NhbmNlbCcKLX07Ci0KLS8vIEluIHByaW5jaXBsZSwgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNz
YXJ5LCBidXQgdGhlIGxlZ2FjeQotLy8gc2VjdGlvbkFjdGlvbiBzZW1hbnRpY3MgZm9yIFRleHRG
aWVsZCBhcmUgZGlmZmVyZW50IGZyb20KLS8vIHRoZSBjb21wb25lbnQgc2VtYW50aWNzIHNvIHRo
aXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlbS4KLWZ1bmN0aW9uIHNlbmRBY3Rpb24oZXZlbnROYW1l
LCB2aWV3LCBldmVudCkgewotICB2YXIgYWN0aW9uID0gZ2V0KHZpZXcsIGV2ZW50TmFtZSksCi0g
ICAgICBvbiA9IGdldCh2aWV3LCAnb25FdmVudCcpLAotICAgICAgdmFsdWUgPSBnZXQodmlldywg
J3ZhbHVlJyk7Ci0KLSAgLy8gYmFjay1jb21wYXQgc3VwcG9ydCBmb3Iga2V5UHJlc3MgYXMgYW4g
ZXZlbnQgbmFtZSBldmVuIHRob3VnaAotICAvLyBpdCdzIGFsc28gYSBtZXRob2QgbmFtZSB0aGF0
IGNvbnN1bWVzIHRoZSBldmVudCAoYW5kIHRoZXJlZm9yZQotICAvLyBpbmNvbXBhdGlibGUgd2l0
aCBzZW5kQWN0aW9uIHNlbWFudGljcykuCi0gIGlmIChvbiA9PT0gZXZlbnROYW1lIHx8IChvbiA9
PT0gJ2tleVByZXNzJyAmJiBldmVudE5hbWUgPT09ICdrZXktcHJlc3MnKSkgewotICAgIHZpZXcu
c2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOwotICB9Ci0KLSAgdmlldy5zZW5kQWN0aW9uKGV2
ZW50TmFtZSwgdmFsdWUpOwotCi0gIGlmIChhY3Rpb24gfHwgb24gPT09IGV2ZW50TmFtZSkgewot
ICAgIGlmKCFnZXQodmlldywgJ2J1YmJsZXMnKSkgewotICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0
aW9uKCk7Ci0gICAgfQotICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLQotICBUaGUgaW50ZXJuYWwg
Y2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5wdXR9fWAKLSAg
aGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2YgYHRleHRgLgotCi0gIFNlZSBbSGFuZGxlYmFy
cy5oZWxwZXJzLmlucHV0XSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0
bWwjbWV0aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRldGFpbHMuCi0KLSAgIyMgTGF5b3V0IGFuZCBM
YXlvdXROYW1lIHByb3BlcnRpZXMKLQotICBCZWNhdXNlIEhUTUwgYGlucHV0YCBlbGVtZW50cyBh
cmUgc2VsZiBjbG9zaW5nIGBsYXlvdXRgIGFuZCBgbGF5b3V0TmFtZWAKLSAgcHJvcGVydGllcyB3
aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5W
aWV3Lmh0bWwpJ3MKLSAgbGF5b3V0IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAg
QGNsYXNzIFRleHRGaWVsZAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNv
bXBvbmVudAotICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAotKi8KLUVtYmVyLlRleHRGaWVsZCA9
IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIuVGV4dFN1cHBvcnQsIHsKLQotICBjbGFzc05h
bWVzOiBbJ2VtYmVyLXRleHQtZmllbGQnXSwKLSAgdGFnTmFtZTogImlucHV0IiwKLSAgYXR0cmli
dXRlQmluZGluZ3M6IFsndHlwZScsICd2YWx1ZScsICdzaXplJywgJ3BhdHRlcm4nLCAnbmFtZSdd
LAotCi0gIC8qKgotICAgIFRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVu
dC4gQXMgdGhlIHVzZXIgaW5wdXRzIHRleHQsIHRoaXMKLSAgICBwcm9wZXJ0eSBpcyB1cGRhdGVk
IGxpdmUuCi0KLSAgICBAcHJvcGVydHkgdmFsdWUKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVm
YXVsdCAiIgotICAqLwotICB2YWx1ZTogIiIsCi0KLSAgLyoqCi0gICAgVGhlIGB0eXBlYCBhdHRy
aWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCi0KLSAgICBAcHJvcGVydHkgdHlwZQotICAgIEB0
eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICJ0ZXh0IgotICAqLwotICB0eXBlOiAidGV4dCIsCi0K
LSAgLyoqCi0gICAgVGhlIGBzaXplYCBvZiB0aGUgdGV4dCBmaWVsZCBpbiBjaGFyYWN0ZXJzLgot
Ci0gICAgQHByb3BlcnR5IHNpemUKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxs
Ci0gICovCi0gIHNpemU6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIGBwYXR0ZXJuYCB0aGUgcGF0
dGVybiBhdHRyaWJ1dGUgb2YgaW5wdXQgZWxlbWVudC4KLQotICAgIEBwcm9wZXJ0eSBwYXR0ZXJu
Ci0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBwYXR0ZXJuOiBu
dWxsCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qCi1AbW9kdWxlIGVtYmVy
Ci1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldDsKLQotLyoKLSAgQGNsYXNzIEJ1dHRvbgotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuVGFyZ2V0QWN0aW9uU3Vw
cG9ydAotICBAZGVwcmVjYXRlZAotKi8KLUVtYmVyLkJ1dHRvbiA9IEVtYmVyLlZpZXcuZXh0ZW5k
KEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczogWydlbWJlci1idXR0
b24nXSwKLSAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNBY3RpdmUnXSwKLQotICB0YWdOYW1lOiAn
YnV0dG9uJywKLQotICBwcm9wYWdhdGVFdmVudHM6IGZhbHNlLAotCi0gIGF0dHJpYnV0ZUJpbmRp
bmdzOiBbJ3R5cGUnLCAnZGlzYWJsZWQnLCAnaHJlZicsICd0YWJpbmRleCddLAotCi0gIC8qCi0g
ICAgQHByaXZhdGUKLQotICAgIE92ZXJyaWRlcyBgVGFyZ2V0QWN0aW9uU3VwcG9ydGAncyBgdGFy
Z2V0T2JqZWN0YCBjb21wdXRlZAotICAgIHByb3BlcnR5IHRvIHVzZSBIYW5kbGViYXJzLXNwZWNp
ZmljIHBhdGggcmVzb2x1dGlvbi4KLQotICAgIEBwcm9wZXJ0eSB0YXJnZXRPYmplY3QKLSAgKi8K
LSAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgdGFy
Z2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAgICAgICAgcm9vdCA9IGdldCh0aGlzLCAnY29u
dGV4dCcpLAotICAgICAgICBkYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAg
IGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJykgeyByZXR1cm4gdGFyZ2V0OyB9Ci0KLSAg
ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXQocm9vdCwgdGFyZ2V0LCB7IGRhdGE6IGRhdGEg
fSk7Ci0gIH0pLnByb3BlcnR5KCd0YXJnZXQnKSwKLQotICAvLyBEZWZhdWx0cyB0byAnYnV0dG9u
JyBpZiB0YWdOYW1lIGlzICdpbnB1dCcgb3IgJ2J1dHRvbicKLSAgdHlwZTogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWU7Ci0gICAg
aWYgKHRhZ05hbWUgPT09ICdpbnB1dCcgfHwgdGFnTmFtZSA9PT0gJ2J1dHRvbicpIHsgcmV0dXJu
ICdidXR0b24nOyB9Ci0gIH0pLAotCi0gIGRpc2FibGVkOiBmYWxzZSwKLQotICAvLyBBbGxvdyAn
YScgdGFncyB0byBhY3QgbGlrZSBidXR0b25zCi0gIGhyZWY6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgIHJldHVybiB0aGlzLnRhZ05hbWUgPT09ICdhJyA/ICcjJyA6IG51bGw7Ci0g
IH0pLAotCi0gIG1vdXNlRG93bjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCFnZXQodGhpcywgJ2Rp
c2FibGVkJykpIHsKLSAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCB0cnVlKTsKLSAgICAgIHRo
aXMuX21vdXNlRG93biA9IHRydWU7Ci0gICAgICB0aGlzLl9tb3VzZUVudGVyZWQgPSB0cnVlOwot
ICAgIH0KLSAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9wYWdhdGVFdmVudHMnKTsKLSAgfSwKLQot
ICBtb3VzZUxlYXZlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5fbW91c2VEb3duKSB7Ci0g
ICAgICBzZXQodGhpcywgJ2lzQWN0aXZlJywgZmFsc2UpOwotICAgICAgdGhpcy5fbW91c2VFbnRl
cmVkID0gZmFsc2U7Ci0gICAgfQotICB9LAotCi0gIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKCkgewot
ICAgIGlmICh0aGlzLl9tb3VzZURvd24pIHsKLSAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCB0
cnVlKTsKLSAgICAgIHRoaXMuX21vdXNlRW50ZXJlZCA9IHRydWU7Ci0gICAgfQotICB9LAotCi0g
IG1vdXNlVXA6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNBY3RpdmUn
KSkgewotICAgICAgLy8gQWN0dWFsbHkgaW52b2tlIHRoZSBidXR0b24ncyB0YXJnZXQgYW5kIGFj
dGlvbi4KLSAgICAgIC8vIFRoaXMgbWV0aG9kIGNvbWVzIGZyb20gdGhlIEVtYmVyLlRhcmdldEFj
dGlvblN1cHBvcnQgbWl4aW4uCi0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsKLSAgICAgIHNl
dCh0aGlzLCAnaXNBY3RpdmUnLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgdGhpcy5fbW91c2VEb3du
ID0gZmFsc2U7Ci0gICAgdGhpcy5fbW91c2VFbnRlcmVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGdl
dCh0aGlzLCAncHJvcGFnYXRlRXZlbnRzJyk7Ci0gIH0sCi0KLSAga2V5RG93bjogZnVuY3Rpb24o
ZXZlbnQpIHsKLSAgICAvLyBIYW5kbGUgc3BhY2Ugb3IgZW50ZXIKLSAgICBpZiAoZXZlbnQua2V5
Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzIpIHsKLSAgICAgIHRoaXMubW91c2VE
b3duKCk7Ci0gICAgfQotICB9LAotCi0gIGtleVVwOiBmdW5jdGlvbihldmVudCkgewotICAgIC8v
IEhhbmRsZSBzcGFjZSBvciBlbnRlcgotICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMyB8fCBl
dmVudC5rZXlDb2RlID09PSAzMikgewotICAgICAgdGhpcy5tb3VzZVVwKCk7Ci0gICAgfQotICB9
LAotCi0gIC8vIFRPRE86IEhhbmRsZSBwcm9wZXIgdG91Y2ggYmVoYXZpb3IuIEluY2x1ZGluZyBz
aG91bGQgbWFrZSBpbmFjdGl2ZSB3aGVuCi0gIC8vIGZpbmdlciBtb3ZlcyBtb3JlIHRoYW4gMjB4
IG91dHNpZGUgb2YgdGhlIGVkZ2Ugb2YgdGhlIGJ1dHRvbiAodnMgbW91c2UKLSAgLy8gd2hpY2gg
Z29lcyBpbmFjdGl2ZSBhcyBzb29uIGFzIG1vdXNlIGdvZXMgb3V0IG9mIGVkZ2VzLikKLQotICB0
b3VjaFN0YXJ0OiBmdW5jdGlvbih0b3VjaCkgewotICAgIHJldHVybiB0aGlzLm1vdXNlRG93bih0
b3VjaCk7Ci0gIH0sCi0KLSAgdG91Y2hFbmQ6IGZ1bmN0aW9uKHRvdWNoKSB7Ci0gICAgcmV0dXJu
IHRoaXMubW91c2VVcCh0b3VjaCk7Ci0gIH0sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAg
RW1iZXIuZGVwcmVjYXRlKCJFbWJlci5CdXR0b24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBy
ZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBDb25zaWRlciB1c2luZyB0aGUgYHt7YWN0aW9u
fX1gIGhlbHBlci4iKTsKLSAgICB0aGlzLl9zdXBlcigpOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1o
YW5kbGViYXJzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0K
LS8qKgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dGFyZWEgZWxlbWVu
dCB3aGVuIHRoZSBge3t0ZXh0YXJlYX19YAotICBoZWxwZXIgaXMgdXNlZC4KLQotICBTZWUgW2hh
bmRsZWJhcnMuaGVscGVycy50ZXh0YXJlYV0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMu
aGVscGVycy5odG1sI21ldGhvZF90ZXh0YXJlYSkgIGZvciB1c2FnZSBkZXRhaWxzLgotCi0gICMj
IExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCi0KLSAgQmVjYXVzZSBIVE1MIGB0ZXh0
YXJlYWAgZWxlbWVudHMgZG8gbm90IGNvbnRhaW4gaW5uZXIgSFRNTCB0aGUgYGxheW91dGAgYW5k
Ci0gIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1i
ZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncwotICBsYXlvdXQgc2VjdGlv
biBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBAY2xhc3MgVGV4dEFyZWEKLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db21wb25lbnQKLSAgQHVzZXMgRW1iZXIuVGV4dFN1
cHBvcnQKLSovCi1FbWJlci5UZXh0QXJlYSA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIu
VGV4dFN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczogWydlbWJlci10ZXh0LWFyZWEnXSwKLQotICB0
YWdOYW1lOiAidGV4dGFyZWEiLAotICBhdHRyaWJ1dGVCaW5kaW5nczogWydyb3dzJywgJ2NvbHMn
LCAnbmFtZSddLAotICByb3dzOiBudWxsLAotICBjb2xzOiBudWxsLAotCi0gIF91cGRhdGVFbGVt
ZW50VmFsdWU6IEVtYmVyLm9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgewotICAgIC8vIFdl
IGRvIHRoaXMgY2hlY2sgc28gY3Vyc29yIHBvc2l0aW9uIGRvZXNuJ3QgZ2V0IGFmZmVjdGVkIGlu
IElFCi0gICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAotICAgICAgICAkZWwgPSB0
aGlzLiQoKTsKLSAgICBpZiAoJGVsICYmIHZhbHVlICE9PSAkZWwudmFsKCkpIHsKLSAgICAgICRl
bC52YWwodmFsdWUpOwotICAgIH0KLSAgfSksCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLm9uKCJkaWRJbnNlcnRFbGVtZW50IiwgdGhpcywgdGhp
cy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qanNoaW50IGVxZXFlcTpmYWxzZSAqLwotCi0vKioKLUBtb2R1bGUgZW1iZXIK
LUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIHNldCA9IEVtYmVyLnNldCwK
LSAgICBnZXQgPSBFbWJlci5nZXQsCi0gICAgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5pbmRleE9mLAotICAgIGluZGV4ZXNPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleGVz
T2YsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIHJl
cGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZSwKLSAgICBpc0FycmF5ID0gRW1i
ZXIuaXNBcnJheSwKLSAgICBwcmVjb21waWxlVGVtcGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLmNv
bXBpbGU7Ci0KLUVtYmVyLlNlbGVjdE9wdGlvbiA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgdGFn
TmFtZTogJ29wdGlvbicsCi0gIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3ZhbHVlJywgJ3NlbGVjdGVk
J10sCi0KLSAgZGVmYXVsdFRlbXBsYXRlOiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0g
ICAgb3B0aW9ucyA9IHsgZGF0YTogb3B0aW9ucy5kYXRhLCBoYXNoOiB7fSB9OwotICAgIEVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycy5iaW5kLmNhbGwoY29udGV4dCwgInZpZXcubGFiZWwiLCBvcHRp
b25zKTsKLSAgfSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxhYmVsUGF0aERp
ZENoYW5nZSgpOwotICAgIHRoaXMudmFsdWVQYXRoRGlkQ2hhbmdlKCk7Ci0KLSAgICB0aGlzLl9z
dXBlcigpOwotICB9LAotCi0gIHNlbGVjdGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsK
LSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBzZWxlY3Rp
b24gPSBnZXQodGhpcywgJ3BhcmVudFZpZXcuc2VsZWN0aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlz
LCAncGFyZW50Vmlldy5tdWx0aXBsZScpKSB7Ci0gICAgICByZXR1cm4gc2VsZWN0aW9uICYmIGlu
ZGV4T2Yoc2VsZWN0aW9uLCBjb250ZW50LnZhbHVlT2YoKSkgPiAtMTsKLSAgICB9IGVsc2Ugewot
ICAgICAgLy8gUHJpbWl0aXZlcyBnZXQgcGFzc2VkIHRocm91Z2ggYmluZGluZ3MgYXMgb2JqZWN0
cy4uLiBzaW5jZQotICAgICAgLy8gYG5ldyBOdW1iZXIoNCkgIT09IDRgLCB3ZSB1c2UgYD09YCBi
ZWxvdwotICAgICAgcmV0dXJuIGNvbnRlbnQgPT0gc2VsZWN0aW9uOwotICAgIH0KLSAgfSkucHJv
cGVydHkoJ2NvbnRlbnQnLCAncGFyZW50Vmlldy5zZWxlY3Rpb24nKSwKLQotICBsYWJlbFBhdGhE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdwYXJlbnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcsIGZ1
bmN0aW9uKCkgewotICAgIHZhciBsYWJlbFBhdGggPSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0
aW9uTGFiZWxQYXRoJyk7Ci0KLSAgICBpZiAoIWxhYmVsUGF0aCkgeyByZXR1cm47IH0KLQotICAg
IEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICdsYWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCBsYWJlbFBhdGgpOwotICAgIH0pLnByb3Bl
cnR5KGxhYmVsUGF0aCkpOwotICB9KSwKLQotICB2YWx1ZVBhdGhEaWRDaGFuZ2U6IEVtYmVyLm9i
c2VydmVyKCdwYXJlbnRWaWV3Lm9wdGlvblZhbHVlUGF0aCcsIGZ1bmN0aW9uKCkgewotICAgIHZh
ciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0aW9uVmFsdWVQYXRoJyk7Ci0K
LSAgICBpZiAoIXZhbHVlUGF0aCkgeyByZXR1cm47IH0KLQotICAgIEVtYmVyLmRlZmluZVByb3Bl
cnR5KHRoaXMsICd2YWx1ZScsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0
dXJuIGdldCh0aGlzLCB2YWx1ZVBhdGgpOwotICAgIH0pLnByb3BlcnR5KHZhbHVlUGF0aCkpOwot
ICB9KQotfSk7Ci0KLUVtYmVyLlNlbGVjdE9wdGdyb3VwID0gRW1iZXIuQ29sbGVjdGlvblZpZXcu
ZXh0ZW5kKHsKLSAgdGFnTmFtZTogJ29wdGdyb3VwJywKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsn
bGFiZWwnXSwKLQotICBzZWxlY3Rpb25CaW5kaW5nOiAncGFyZW50Vmlldy5zZWxlY3Rpb24nLAot
ICBtdWx0aXBsZUJpbmRpbmc6ICdwYXJlbnRWaWV3Lm11bHRpcGxlJywKLSAgb3B0aW9uTGFiZWxQ
YXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uTGFiZWxQYXRoJywKLSAgb3B0aW9uVmFsdWVQ
YXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uVmFsdWVQYXRoJywKLQotICBpdGVtVmlld0Ns
YXNzQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uVmlldycKLX0pOwotCi0vKioKLSAgVGhlIGBF
bWJlci5TZWxlY3RgIHZpZXcgY2xhc3MgcmVuZGVycyBhCi0gIFtzZWxlY3RdKGh0dHBzOi8vZGV2
ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxlbWVudC9zZWxlY3QpIEhUTUwgZWxlbWVudCwK
LSAgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hvb3NlIGZyb20gYSBsaXN0IG9mIG9wdGlvbnMuCi0K
LSAgVGhlIHRleHQgYW5kIGB2YWx1ZWAgcHJvcGVydHkgb2YgZWFjaCBgPG9wdGlvbj5gIGVsZW1l
bnQgd2l0aGluIHRoZQotICBgPHNlbGVjdD5gIGVsZW1lbnQgYXJlIHBvcHVsYXRlZCBmcm9tIHRo
ZSBvYmplY3RzIGluIHRoZSBgRWxlbWVudC5TZWxlY3RgJ3MKLSAgYGNvbnRlbnRgIHByb3BlcnR5
LiBUaGUgdW5kZXJseWluZyBkYXRhIG9iamVjdCBvZiB0aGUgc2VsZWN0ZWQgYDxvcHRpb24+YCBp
cwotICBzdG9yZWQgaW4gdGhlIGBFbGVtZW50LlNlbGVjdGAncyBgdmFsdWVgIHByb3BlcnR5Lgot
Ci0gICMjIFRoZSBDb250ZW50IFByb3BlcnR5IChhcnJheSBvZiBzdHJpbmdzKQotCi0gIFRoZSBz
aW1wbGVzdCB2ZXJzaW9uIG9mIGFuIGBFbWJlci5TZWxlY3RgIHRha2VzIGFuIGFycmF5IG9mIHN0
cmluZ3MgYXMgaXRzCi0gIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHN0cmluZyB3aWxsIGJlIHVz
ZWQgYXMgYm90aCB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBhbmQKLSAgdGhlIGlubmVyIHRleHQgb2Yg
ZWFjaCBgPG9wdGlvbj5gIGVsZW1lbnQgaW5zaWRlIHRoZSByZW5kZXJlZCBgPHNlbGVjdD5gLgot
Ci0gIEV4YW1wbGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9s
bGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIG5hbWVzOiBbIlllaHVkYSIsICJU
b20iXQotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2Vs
ZWN0IGNvbnRlbnQ9bmFtZXN9fQotICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4K
LSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24g
dmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKLQotICBZb3UgY2Fu
IGNvbnRyb2wgd2hpY2ggYDxvcHRpb24+YCBpcyBzZWxlY3RlZCB0aHJvdWdoIHRoZSBgRW1iZXIu
U2VsZWN0YCdzCi0gIGB2YWx1ZWAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHNl
bGVjdGVkTmFtZTogJ1RvbScsCi0gICAgbmFtZXM6IFsiWWVodWRhIiwgIlRvbSJdCi0gIH0pOwot
ICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAg
IGNvbnRlbnQ9bmFtZXMKLSAgICAgICAgIHZhbHVlPXNlbGVjdGVkTmFtZQotICB9fQotICBgYGAK
LQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHdpdGggdGhlIGA8b3B0aW9u
PmAgZm9yICdUb20nIHNlbGVjdGVkOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1i
ZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgot
ICAgIDxvcHRpb24gdmFsdWU9IlRvbSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4K
LSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEEgdXNlciBpbnRlcmFjdGluZyB3aXRoIHRoZSByZW5k
ZXJlZCBgPHNlbGVjdD5gIHRvIGNob29zZSAiWWVodWRhIiB3b3VsZAotICB1cGRhdGUgdGhlIHZh
bHVlIG9mIGBzZWxlY3RlZE5hbWVgIHRvICJZZWh1ZGEiLgotCi0gICMjIFRoZSBDb250ZW50IFBy
b3BlcnR5IChhcnJheSBvZiBPYmplY3RzKQotCi0gIEFuIGBFbWJlci5TZWxlY3RgIGNhbiBhbHNv
IHRha2UgYW4gYXJyYXkgb2YgSmF2YVNjcmlwdCBvciBFbWJlciBvYmplY3RzIGFzCi0gIGl0cyBg
Y29udGVudGAgcHJvcGVydHkuCi0KLSAgV2hlbiB1c2luZyBvYmplY3RzIHlvdSBuZWVkIHRvIHRl
bGwgdGhlIGBFbWJlci5TZWxlY3RgIHdoaWNoIHByb3BlcnR5IHNob3VsZAotICBiZSBhY2Nlc3Nl
ZCBvbiBlYWNoIG9iamVjdCB0byBzdXBwbHkgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBg
PG9wdGlvbj5gCi0gIGFuZCB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkg
dGhlIGVsZW1lbnQgdGV4dC4KLQotICBUaGUgYG9wdGlvblZhbHVlUGF0aGAgb3B0aW9uIGlzIHVz
ZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCBvbiBlYWNoIG9iamVjdCB0bwotICB0aGUgZGVzaXJlZCBw
cm9wZXJ0eSBmb3IgdGhlIGB2YWx1ZWAgYXR0cmlidXRlLiBUaGUgYG9wdGlvbkxhYmVsUGF0aGAK
LSAgc3BlY2lmaWVzIHRoZSBwYXRoIG9uIGVhY2ggb2JqZWN0IHRvIHRoZSBkZXNpcmVkIHByb3Bl
cnR5IGZvciB0aGUKLSAgZWxlbWVudCdzIHRleHQuIEJvdGggcGF0aHMgbXVzdCByZWZlcmVuY2Ug
ZWFjaCBvYmplY3QgaXRzZWxmIGFzIGBjb250ZW50YDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFw
cC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7Ci0gICAg
cHJvZ3JhbW1lcnM6IFsKLSAgICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0sCi0gICAg
ICB7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9Ci0gICAgXQotICB9KTsKLSAgYGBgCi0KLSAg
YGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2VsZWN0Ci0gICAgICAgICBjb250ZW50PXBy
b2dyYW1tZXJzCi0gICAgICAgICBvcHRpb25WYWx1ZVBhdGg9ImNvbnRlbnQuaWQiCi0gICAgICAg
ICBvcHRpb25MYWJlbFBhdGg9ImNvbnRlbnQuZmlyc3ROYW1lIn19Ci0gIGBgYAotCi0gIFdvdWxk
IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6Ci0KLSAgYGBgaHRtbAotICA8c2VsZWN0IGNs
YXNzPSJlbWJlci1zZWxlY3QiPgotICAgIDxvcHRpb24gdmFsdWU9IjEiPlllaHVkYTwvb3B0aW9u
PgotICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwvb3B0aW9uPgotICA8L3NlbGVjdD4KLSAgYGBg
Ci0KLSAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCBgPG9wdGlvbj5gIHdp
dGhpbiBhbiBgRW1iZXIuU2VsZWN0YAotICBjYW4gYmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBvbiBh
bm90aGVyIG9iamVjdDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5BcHBsaWNhdGlvbkNvbnRy
b2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7Ci0gICAgcHJvZ3JhbW1lcnM6IFsKLSAg
ICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0sCi0gICAgICB7Zmlyc3ROYW1lOiAiVG9t
IiwgICAgaWQ6IDJ9Ci0gICAgXSwKLSAgICBjdXJyZW50UHJvZ3JhbW1lcjogewotICAgICAgaWQ6
IDIKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJl
ci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIG9wdGlvblZh
bHVlUGF0aD0iY29udGVudC5pZCIKLSAgICAgICAgIG9wdGlvbkxhYmVsUGF0aD0iY29udGVudC5m
aXJzdE5hbWUiCi0gICAgICAgICB2YWx1ZT1jdXJyZW50UHJvZ3JhbW1lci5pZH19Ci0gIGBgYAot
Ci0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0aCBhIHNlbGVjdGVkIG9w
dGlvbjoKLQotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAg
PG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMiIg
c2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0g
IEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1lbnQgYnkgc2VsZWN0aW5nIHRoZSBm
aXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxsIHVwZGF0ZSB0aGUgYGlkYCBvZiBgY3VycmVu
dFByb2dyYW1tZXJgCi0gIHRvIG1hdGNoIHRoZSBgdmFsdWVgIHByb3BlcnR5IG9mIHRoZSBuZXds
eSBzZWxlY3RlZCBgPG9wdGlvbj5gLgotCi0gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29udHJv
bCBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgdW5kZXJseWluZyBvYmplY3RzCi0gIHVzZWQgdG8gcmVu
ZGVyIGVhY2ggb2JqZWN0IGJ5IGJpbmRpbmcgdGhlIGBzZWxlY3Rpb25gIG9wdGlvbi4gV2hlbiB0
aGUgc2VsZWN0ZWQKLSAgYDxvcHRpb24+YCBpcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgcGF0aCBw
cm92aWRlZCB0byBgc2VsZWN0aW9uYAotICB3aWxsIGJlIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNv
bnRlbnQgb2JqZWN0IG9mIHRoZSByZW5kZXJlZCBgPG9wdGlvbj5gCi0gIGVsZW1lbnQ6Ci0KLSAg
YGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkUGVyc29uOiBudWxsLAotICAgIHByb2dyYW1tZXJz
OiBbCi0gICAgICB7Zmlyc3ROYW1lOiAiWWVodWRhIiwgaWQ6IDF9LAotICAgICAge2ZpcnN0TmFt
ZTogIlRvbSIsICAgIGlkOiAyfQotICAgIF0KLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJh
cnMKLSAge3t2aWV3IEVtYmVyLlNlbGVjdAotICAgICAgICAgY29udGVudD1wcm9ncmFtbWVycwot
ICAgICAgICAgb3B0aW9uVmFsdWVQYXRoPSJjb250ZW50LmlkIgotICAgICAgICAgb3B0aW9uTGFi
ZWxQYXRoPSJjb250ZW50LmZpcnN0TmFtZSIKLSAgICAgICAgIHNlbGVjdGlvbj1zZWxlY3RlZFBl
cnNvbn19Ci0gIGBgYAotCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0
aCBhIHNlbGVjdGVkIG9wdGlvbjoKLQotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVy
LXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9w
dGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxl
Y3Q+Ci0gIGBgYAotCi0gIEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1lbnQgYnkg
c2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxsIHVwZGF0ZSB0aGUg
YHNlbGVjdGVkUGVyc29uYCB0byBtYXRjaCB0aGUgb2JqZWN0IG9mCi0gIHRoZSBuZXdseSBzZWxl
Y3RlZCBgPG9wdGlvbj5gLiBJbiB0aGlzIGNhc2UgaXQgaXMgdGhlIGZpcnN0IG9iamVjdAotICBp
biB0aGUgYHByb2dyYW1tZXJzYAotCi0gICMjIFN1cHBseWluZyBhIFByb21wdAotCi0gIEEgYG51
bGxgIHZhbHVlIGZvciB0aGUgYEVtYmVyLlNlbGVjdGAncyBgdmFsdWVgIG9yIGBzZWxlY3Rpb25g
IHByb3BlcnR5Ci0gIHJlc3VsdHMgaW4gdGhlcmUgYmVpbmcgbm8gYDxvcHRpb24+YCB3aXRoIGEg
YHNlbGVjdGVkYCBhdHRyaWJ1dGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkUHJv
Z3JhbW1lcjogbnVsbCwKLSAgICBwcm9ncmFtbWVyczogWwotICAgICAgIlllaHVkYSIsCi0gICAg
ICAiVG9tIgotICAgIF0KLSAgfSk7Ci0gIGBgYAotCi0gIGBgYCBoYW5kbGViYXJzCi0gIHt7dmll
dyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIHZh
bHVlPXNlbGVjdGVkUHJvZ3JhbW1lcgotICB9fQotICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4g
dGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXIt
c2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAg
IDxvcHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKLQot
ICBBbHRob3VnaCBgc2VsZWN0ZWRQcm9ncmFtbWVyYCBpcyBgbnVsbGAgYW5kIG5vIGA8b3B0aW9u
PmAKLSAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgdGhlIHJlbmRlcmVkIEhUTUwgd2lsbCBk
aXNwbGF5IHRoZQotICBmaXJzdCBpdGVtIGFzIHRob3VnaCBpdCB3ZXJlIHNlbGVjdGVkLiBZb3Ug
Y2FuIHN1cHBseSBhIHN0cmluZwotICB2YWx1ZSBmb3IgdGhlIGBFbWJlci5TZWxlY3RgIHRvIGRp
c3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rpb24KLSAgd2l0aCB0aGUgYHByb21wdGAgb3B0
aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVt
YmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBzZWxlY3RlZFByb2dyYW1tZXI6IG51bGwsCi0g
ICAgcHJvZ3JhbW1lcnM6IFsKLSAgICAgICJZZWh1ZGEiLAotICAgICAgIlRvbSIKLSAgICBdCi0g
IH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAg
ICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIHZhbHVlPXNlbGVjdGVkUHJvZ3Jh
bW1lcgotICAgICAgICAgcHJvbXB0PSJQbGVhc2Ugc2VsZWN0IGEgbmFtZSIKLSAgfX0KLSAgYGBg
Ci0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0g
IDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbj5QbGVhc2Ugc2VsZWN0
IGEgbmFtZTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlllaHVkYSI+WWVodWRhPC9vcHRp
b24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iVG9tIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0g
IGBgYAotCi0gIEBjbGFzcyBTZWxlY3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
bWJlci5WaWV3Ci0qLwotRW1iZXIuU2VsZWN0ID0gRW1iZXIuVmlldy5leHRlbmQoewotICB0YWdO
YW1lOiAnc2VsZWN0JywKLSAgY2xhc3NOYW1lczogWydlbWJlci1zZWxlY3QnXSwKLSAgZGVmYXVs
dFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9uIGFub255bW91cyhI
YW5kbGViYXJzLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKLXRoaXMuY29tcGlsZXJJ
bmZvID0gWzQsJz49IDEuMC4wJ107Ci1oZWxwZXJzID0gdGhpcy5tZXJnZShoZWxwZXJzLCBFbWJl
ci5IYW5kbGViYXJzLmhlbHBlcnMpOyBkYXRhID0gZGF0YSB8fCB7fTsKLSAgdmFyIGJ1ZmZlciA9
ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFzaENvbnRleHRzLCBlc2NhcGVFeHByZXNzaW9uPXRo
aXMuZXNjYXBlRXhwcmVzc2lvbiwgc2VsZj10aGlzOwotCi1mdW5jdGlvbiBwcm9ncmFtMShkZXB0
aDAsZGF0YSkgewotICAKLSAgdmFyIGJ1ZmZlciA9ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFz
aENvbnRleHRzOwotICBkYXRhLmJ1ZmZlci5wdXNoKCI8b3B0aW9uIHZhbHVlPVwiXCI+Iik7Ci0g
IGhhc2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVy
cy5fdHJpYWdlTXVzdGFjaGUuY2FsbChkZXB0aDAsICJ2aWV3LnByb21wdCIsIHtoYXNoOnt9LGNv
bnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhh
c2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09
IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9Ci0gIGRhdGEuYnVmZmVyLnB1c2goIjwv
b3B0aW9uPiIpOwotICByZXR1cm4gYnVmZmVyOwotICB9Ci0KLWZ1bmN0aW9uIHByb2dyYW0zKGRl
cHRoMCxkYXRhKSB7Ci0gIAotICB2YXIgc3RhY2sxLCBoYXNoVHlwZXMsIGhhc2hDb250ZXh0czsK
LSAgaGFzaFR5cGVzID0ge307Ci0gIGhhc2hDb250ZXh0cyA9IHt9OwotICBzdGFjazEgPSBoZWxw
ZXJzLmVhY2guY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3VwZWRDb250ZW50Iiwge2hhc2g6e30saW52
ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFtKDQsIHByb2dyYW00LCBkYXRhKSxjb250ZXh0
czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlw
ZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7
IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQotICBlbHNlIHsgZGF0YS5idWZmZXIucHVzaCgn
Jyk7IH0KLSAgfQotZnVuY3Rpb24gcHJvZ3JhbTQoZGVwdGgwLGRhdGEpIHsKLSAgCi0gIHZhciBo
YXNoQ29udGV4dHMsIGhhc2hUeXBlczsKLSAgaGFzaENvbnRleHRzID0geydjb250ZW50JzogZGVw
dGgwLCdsYWJlbCc6IGRlcHRoMH07Ci0gIGhhc2hUeXBlcyA9IHsnY29udGVudCc6ICJJRCIsJ2xh
YmVsJzogIklEIn07Ci0gIGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhwcmVzc2lvbihoZWxwZXJz
LnZpZXcuY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3VwVmlldyIsIHtoYXNoOnsKLSAgICAnY29udGVu
dCc6ICgiY29udGVudCIpLAotICAgICdsYWJlbCc6ICgibGFiZWwiKQotICB9LGNvbnRleHRzOltk
ZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpo
YXNoVHlwZXMsZGF0YTpkYXRhfSkpKTsKLSAgfQotCi1mdW5jdGlvbiBwcm9ncmFtNihkZXB0aDAs
ZGF0YSkgewotICAKLSAgdmFyIHN0YWNrMSwgaGFzaFR5cGVzLCBoYXNoQ29udGV4dHM7Ci0gIGhh
c2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVycy5l
YWNoLmNhbGwoZGVwdGgwLCAidmlldy5jb250ZW50Iiwge2hhc2g6e30saW52ZXJzZTpzZWxmLm5v
b3AsZm46c2VsZi5wcm9ncmFtKDcsIHByb2dyYW03LCBkYXRhKSxjb250ZXh0czpbZGVwdGgwXSx0
eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlwZXM6aGFzaFR5cGVz
LGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVy
LnB1c2goc3RhY2sxKTsgfQotICBlbHNlIHsgZGF0YS5idWZmZXIucHVzaCgnJyk7IH0KLSAgfQot
ZnVuY3Rpb24gcHJvZ3JhbTcoZGVwdGgwLGRhdGEpIHsKLSAgCi0gIHZhciBoYXNoQ29udGV4dHMs
IGhhc2hUeXBlczsKLSAgaGFzaENvbnRleHRzID0geydjb250ZW50JzogZGVwdGgwfTsKLSAgaGFz
aFR5cGVzID0geydjb250ZW50JzogIklEIn07Ci0gIGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhw
cmVzc2lvbihoZWxwZXJzLnZpZXcuY2FsbChkZXB0aDAsICJ2aWV3Lm9wdGlvblZpZXciLCB7aGFz
aDp7Ci0gICAgJ2NvbnRlbnQnOiAoIiIpCi0gIH0sY29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJ
RCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFzaFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRh
dGF9KSkpOwotICB9Ci0KLSAgaGFzaFR5cGVzID0ge307Ci0gIGhhc2hDb250ZXh0cyA9IHt9Owot
ICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAidmlldy5wcm9tcHQiLCB7aGFz
aDp7fSxpbnZlcnNlOnNlbGYubm9vcCxmbjpzZWxmLnByb2dyYW0oMSwgcHJvZ3JhbTEsIGRhdGEp
LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRz
LGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEg
PT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9Ci0gIGhhc2hUeXBlcyA9IHt9Owot
ICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRo
MCwgInZpZXcub3B0aW9uR3JvdXBQYXRoIiwge2hhc2g6e30saW52ZXJzZTpzZWxmLnByb2dyYW0o
NiwgcHJvZ3JhbTYsIGRhdGEpLGZuOnNlbGYucHJvZ3JhbSgzLCBwcm9ncmFtMywgZGF0YSksY29u
dGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFz
aFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRhdGF9KTsKLSAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0g
MCkgeyBkYXRhLmJ1ZmZlci5wdXNoKHN0YWNrMSk7IH0KLSAgcmV0dXJuIGJ1ZmZlcjsKLSAgCi19
KSwKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsnbXVsdGlwbGUnLCAnZGlzYWJsZWQnLCAndGFiaW5k
ZXgnLCAnbmFtZSddLAotCi0gIC8qKgotICAgIFRoZSBgbXVsdGlwbGVgIGF0dHJpYnV0ZSBvZiB0
aGUgc2VsZWN0IGVsZW1lbnQuIEluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlCi0gICAgb3B0aW9u
cyBjYW4gYmUgc2VsZWN0ZWQuCi0KLSAgICBAcHJvcGVydHkgbXVsdGlwbGUKLSAgICBAdHlwZSBC
b29sZWFuCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgbXVsdGlwbGU6IGZhbHNlLAotCi0g
IC8qKgotICAgIFRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQu
IEluZGljYXRlcyB3aGV0aGVyCi0gICAgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgZnJvbSBpbnRl
cmFjdGlvbnMuCi0KLSAgICBAcHJvcGVydHkgZGlzYWJsZWQKLSAgICBAdHlwZSBCb29sZWFuCi0g
ICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgZGlzYWJsZWQ6IGZhbHNlLAotCi0gIC8qKgotICAg
IFRoZSBsaXN0IG9mIG9wdGlvbnMuCi0KLSAgICBJZiBgb3B0aW9uTGFiZWxQYXRoYCBhbmQgYG9w
dGlvblZhbHVlUGF0aGAgYXJlIG5vdCBvdmVycmlkZGVuLCB0aGlzIHNob3VsZAotICAgIGJlIGEg
bGlzdCBvZiBzdHJpbmdzLCB3aGljaCB3aWxsIHNlcnZlIHNpbXVsdGFuZW91c2x5IGFzIGxhYmVs
cyBhbmQgdmFsdWVzLgotCi0gICAgT3RoZXJ3aXNlLCB0aGlzIHNob3VsZCBiZSBhIGxpc3Qgb2Yg
b2JqZWN0cy4gRm9yIGluc3RhbmNlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlNl
bGVjdC5jcmVhdGUoewotICAgICAgY29udGVudDogRW1iZXIuQShbCi0gICAgICAgICAgeyBpZDog
MSwgZmlyc3ROYW1lOiAnWWVodWRhJyB9LAotICAgICAgICAgIHsgaWQ6IDIsIGZpcnN0TmFtZTog
J1RvbScgfQotICAgICAgICBdKSwKLSAgICAgIG9wdGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQuZmly
c3ROYW1lJywKLSAgICAgIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQuaWQnCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAcHJvcGVydHkgY29udGVudAotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRl
ZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBudWxsLAotCi0gIC8qKgotICAgIFdoZW4gYG11
bHRpcGxlYCBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCBvZiBgY29udGVudGAgdGhhdCBpcyBjdXJy
ZW50bHkKLSAgICBzZWxlY3RlZCwgaWYgYW55LgotCi0gICAgV2hlbiBgbXVsdGlwbGVgIGlzIGB0
cnVlYCwgYW4gYXJyYXkgb2Ygc3VjaCBlbGVtZW50cy4KLQotICAgIEBwcm9wZXJ0eSBzZWxlY3Rp
b24KLSAgICBAdHlwZSBPYmplY3Qgb3IgQXJyYXkKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0g
IHNlbGVjdGlvbjogbnVsbCwKLQotICAvKioKLSAgICBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUg
KHdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2VgKSwgdmFsdWUgY2FuIGJlIHVzZWQgdG8KLSAgICBn
ZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgdmFsdWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkg
aXQncyB2YWx1ZS4KLQotICAgIEl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG11bHRp
cGxlIHNlbGVjdGlvbiBtb2RlLgotCi0gICAgQHByb3BlcnR5IHZhbHVlCi0gICAgQHR5cGUgU3Ry
aW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICB2YWx1ZTogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IHJl
dHVybiB2YWx1ZTsgfQotICAgIHZhciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVl
UGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/LywgJycpOwotICAgIHJldHVybiB2YWx1ZVBhdGgg
PyBnZXQodGhpcywgJ3NlbGVjdGlvbi4nICsgdmFsdWVQYXRoKSA6IGdldCh0aGlzLCAnc2VsZWN0
aW9uJyk7Ci0gIH0pLnByb3BlcnR5KCdzZWxlY3Rpb24nKSwKLQotICAvKioKLSAgICBJZiBnaXZl
biwgYSB0b3AtbW9zdCBkdW1teSBvcHRpb24gd2lsbCBiZSByZW5kZXJlZCB0byBzZXJ2ZSBhcyBh
IHVzZXIKLSAgICBwcm9tcHQuCi0KLSAgICBAcHJvcGVydHkgcHJvbXB0Ci0gICAgQHR5cGUgU3Ry
aW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBwcm9tcHQ6IG51bGwsCi0KLSAgLyoqCi0g
ICAgVGhlIHBhdGggb2YgdGhlIG9wdGlvbiBsYWJlbHMuIFNlZSBbY29udGVudF0oL2FwaS9jbGFz
c2VzL0VtYmVyLlNlbGVjdC5odG1sI3Byb3BlcnR5X2NvbnRlbnQpLgotCi0gICAgQHByb3BlcnR5
IG9wdGlvbkxhYmVsUGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICdjb250ZW50
JwotICAqLwotICBvcHRpb25MYWJlbFBhdGg6ICdjb250ZW50JywKLQotICAvKioKLSAgICBUaGUg
cGF0aCBvZiB0aGUgb3B0aW9uIHZhbHVlcy4gU2VlIFtjb250ZW50XSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU2VsZWN0Lmh0bWwjcHJvcGVydHlfY29udGVudCkuCi0KLSAgICBAcHJvcGVydHkgb3B0aW9u
VmFsdWVQYXRoCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgJ2NvbnRlbnQnCi0gICov
Ci0gIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQnLAotCi0gIC8qKgotICAgIFRoZSBwYXRoIG9m
IHRoZSBvcHRpb24gZ3JvdXAuCi0gICAgV2hlbiB0aGlzIHByb3BlcnR5IGlzIHVzZWQsIGBjb250
ZW50YCBzaG91bGQgYmUgc29ydGVkIGJ5IGBvcHRpb25Hcm91cFBhdGhgLgotCi0gICAgQHByb3Bl
cnR5IG9wdGlvbkdyb3VwUGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwK
LSAgKi8KLSAgb3B0aW9uR3JvdXBQYXRoOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB2aWV3IGNs
YXNzIGZvciBvcHRncm91cC4KLQotICAgIEBwcm9wZXJ0eSBncm91cFZpZXcKLSAgICBAdHlwZSBF
bWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIuU2VsZWN0T3B0Z3JvdXAKLSAgKi8KLSAgZ3Jv
dXBWaWV3OiBFbWJlci5TZWxlY3RPcHRncm91cCwKLQotICBncm91cGVkQ29udGVudDogRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGdyb3VwUGF0aCA9IGdldCh0aGlzLCAnb3B0
aW9uR3JvdXBQYXRoJyk7Ci0gICAgdmFyIGdyb3VwZWRDb250ZW50ID0gRW1iZXIuQSgpOwotICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JykgfHwgW107Ci0KLSAgICBmb3JFYWNo
KGNvbnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHZhciBsYWJlbCA9IGdldChpdGVtLCBn
cm91cFBhdGgpOwotCi0gICAgICBpZiAoZ2V0KGdyb3VwZWRDb250ZW50LCAnbGFzdE9iamVjdC5s
YWJlbCcpICE9PSBsYWJlbCkgewotICAgICAgICBncm91cGVkQ29udGVudC5wdXNoT2JqZWN0KHsK
LSAgICAgICAgICBsYWJlbDogbGFiZWwsCi0gICAgICAgICAgY29udGVudDogRW1iZXIuQSgpCi0g
ICAgICAgIH0pOwotICAgICAgfQotCi0gICAgICBnZXQoZ3JvdXBlZENvbnRlbnQsICdsYXN0T2Jq
ZWN0LmNvbnRlbnQnKS5wdXNoKGl0ZW0pOwotICAgIH0pOwotCi0gICAgcmV0dXJuIGdyb3VwZWRD
b250ZW50OwotICB9KS5wcm9wZXJ0eSgnb3B0aW9uR3JvdXBQYXRoJywgJ2NvbnRlbnQuQGVhY2gn
KSwKLQotICAvKioKLSAgICBUaGUgdmlldyBjbGFzcyBmb3Igb3B0aW9uLgotCi0gICAgQHByb3Bl
cnR5IG9wdGlvblZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIu
U2VsZWN0T3B0aW9uCi0gICovCi0gIG9wdGlvblZpZXc6IEVtYmVyLlNlbGVjdE9wdGlvbiwKLQot
ICBfY2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdtdWx0aXBsZScpKSB7
Ci0gICAgICB0aGlzLl9jaGFuZ2VNdWx0aXBsZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlz
Ll9jaGFuZ2VTaW5nbGUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgc2VsZWN0aW9uRGlkQ2hhbmdlOiBF
bWJlci5vYnNlcnZlcignc2VsZWN0aW9uLkBlYWNoJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNl
bGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlzLCAnbXVs
dGlwbGUnKSkgewotICAgICAgaWYgKCFpc0FycmF5KHNlbGVjdGlvbikpIHsKLSAgICAgICAgc2V0
KHRoaXMsICdzZWxlY3Rpb24nLCBFbWJlci5BKFtzZWxlY3Rpb25dKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICAgIH0KLSAgICAgIHRoaXMuX3NlbGVjdGlvbkRpZENoYW5nZU11bHRpcGxlKCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX3NlbGVjdGlvbkRpZENoYW5nZVNpbmdsZSgpOwotICAg
IH0KLSAgfSksCi0KLSAgdmFsdWVEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCd2YWx1ZScsIGZ1
bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAg
ICAgIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAotICAgICAgICB2YWx1ZVBhdGggPSBnZXQo
dGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/LywgJycpLAotICAg
ICAgICBzZWxlY3RlZFZhbHVlID0gKHZhbHVlUGF0aCA/IGdldCh0aGlzLCAnc2VsZWN0aW9uLicg
KyB2YWx1ZVBhdGgpIDogZ2V0KHRoaXMsICdzZWxlY3Rpb24nKSksCi0gICAgICAgIHNlbGVjdGlv
bjsKLQotICAgIGlmICh2YWx1ZSAhPT0gc2VsZWN0ZWRWYWx1ZSkgewotICAgICAgc2VsZWN0aW9u
ID0gY29udGVudCA/IGNvbnRlbnQuZmluZChmdW5jdGlvbihvYmopIHsKLSAgICAgICAgcmV0dXJu
IHZhbHVlID09PSAodmFsdWVQYXRoID8gZ2V0KG9iaiwgdmFsdWVQYXRoKSA6IG9iaik7Ci0gICAg
ICB9KSA6IG51bGw7Ci0KLSAgICAgIHRoaXMuc2V0KCdzZWxlY3Rpb24nLCBzZWxlY3Rpb24pOwot
ICAgIH0KLSAgfSksCi0KLQotICBfdHJpZ2dlckNoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0
KHRoaXMsICd2YWx1ZScpOwotCi0gICAgaWYgKCFFbWJlci5pc05vbmUoc2VsZWN0aW9uKSkgeyB0
aGlzLnNlbGVjdGlvbkRpZENoYW5nZSgpOyB9Ci0gICAgaWYgKCFFbWJlci5pc05vbmUodmFsdWUp
KSB7IHRoaXMudmFsdWVEaWRDaGFuZ2UoKTsgfQotCi0gICAgdGhpcy5fY2hhbmdlKCk7Ci0gIH0s
Ci0KLSAgX2NoYW5nZVNpbmdsZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNlbGVjdGVkSW5kZXgg
PSB0aGlzLiQoKVswXS5zZWxlY3RlZEluZGV4LAotICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMs
ICdjb250ZW50JyksCi0gICAgICAgIHByb21wdCA9IGdldCh0aGlzLCAncHJvbXB0Jyk7Ci0KLSAg
ICBpZiAoIWNvbnRlbnQgfHwgIWdldChjb250ZW50LCAnbGVuZ3RoJykpIHsgcmV0dXJuOyB9Ci0g
ICAgaWYgKHByb21wdCAmJiBzZWxlY3RlZEluZGV4ID09PSAwKSB7IHNldCh0aGlzLCAnc2VsZWN0
aW9uJywgbnVsbCk7IHJldHVybjsgfQotCi0gICAgaWYgKHByb21wdCkgeyBzZWxlY3RlZEluZGV4
IC09IDE7IH0KLSAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIGNvbnRlbnQub2JqZWN0QXQoc2Vs
ZWN0ZWRJbmRleCkpOwotICB9LAotCi0KLSAgX2NoYW5nZU11bHRpcGxlOiBmdW5jdGlvbigpIHsK
LSAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJCgnb3B0aW9uOnNlbGVjdGVkJyksCi0gICAgICAgIHBy
b21wdCA9IGdldCh0aGlzLCAncHJvbXB0JyksCi0gICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEg
OiAwLAotICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHNl
bGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0KLSAgICBpZiAoIWNvbnRlbnQpIHsg
cmV0dXJuOyB9Ci0gICAgaWYgKG9wdGlvbnMpIHsKLSAgICAgIHZhciBzZWxlY3RlZEluZGV4ZXMg
PSBvcHRpb25zLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBv
ZmZzZXQ7Ci0gICAgICB9KS50b0FycmF5KCk7Ci0gICAgICB2YXIgbmV3U2VsZWN0aW9uID0gY29u
dGVudC5vYmplY3RzQXQoc2VsZWN0ZWRJbmRleGVzKTsKLQotICAgICAgaWYgKGlzQXJyYXkoc2Vs
ZWN0aW9uKSkgewotICAgICAgICByZXBsYWNlKHNlbGVjdGlvbiwgMCwgZ2V0KHNlbGVjdGlvbiwg
J2xlbmd0aCcpLCBuZXdTZWxlY3Rpb24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2V0KHRo
aXMsICdzZWxlY3Rpb24nLCBuZXdTZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfSwKLQot
ICBfc2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgZWwgPSB0
aGlzLmdldCgnZWxlbWVudCcpOwotICAgIGlmICghZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIg
Y29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQo
dGhpcywgJ3NlbGVjdGlvbicpLAotICAgICAgICBzZWxlY3Rpb25JbmRleCA9IGNvbnRlbnQgPyBp
bmRleE9mKGNvbnRlbnQsIHNlbGVjdGlvbikgOiAtMSwKLSAgICAgICAgcHJvbXB0ID0gZ2V0KHRo
aXMsICdwcm9tcHQnKTsKLQotICAgIGlmIChwcm9tcHQpIHsgc2VsZWN0aW9uSW5kZXggKz0gMTsg
fQotICAgIGlmIChlbCkgeyBlbC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0aW9uSW5kZXg7IH0KLSAg
fSwKLQotICBfc2VsZWN0aW9uRGlkQ2hhbmdlTXVsdGlwbGU6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHNlbGVjdGlvbiA9IGdl
dCh0aGlzLCAnc2VsZWN0aW9uJyksCi0gICAgICAgIHNlbGVjdGVkSW5kZXhlcyA9IGNvbnRlbnQg
PyBpbmRleGVzT2YoY29udGVudCwgc2VsZWN0aW9uKSA6IFstMV0sCi0gICAgICAgIHByb21wdCA9
IGdldCh0aGlzLCAncHJvbXB0JyksCi0gICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAot
ICAgICAgICBvcHRpb25zID0gdGhpcy4kKCdvcHRpb24nKSwKLSAgICAgICAgYWRqdXN0ZWQ7Ci0K
LSAgICBpZiAob3B0aW9ucykgewotICAgICAgb3B0aW9ucy5lYWNoKGZ1bmN0aW9uKCkgewotICAg
ICAgICBhZGp1c3RlZCA9IHRoaXMuaW5kZXggPiAtMSA/IHRoaXMuaW5kZXggLSBvZmZzZXQgOiAt
MTsKLSAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGluZGV4T2Yoc2VsZWN0ZWRJbmRleGVzLCBhZGp1
c3RlZCkgPiAtMTsKLSAgICAgIH0pOwotICAgIH0KLSAgfSwKLQotICBpbml0OiBmdW5jdGlvbigp
IHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0
aGlzLCB0aGlzLl90cmlnZ2VyQ2hhbmdlKTsKLSAgICB0aGlzLm9uKCJjaGFuZ2UiLCB0aGlzLCB0
aGlzLl9jaGFuZ2UpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzLWNvbXBpbGVyCi0q
LwotCi0vKioKLQotICBUaGUgYHt7aW5wdXR9fWAgaGVscGVyIGluc2VydHMgYW4gSFRNTCBgPGlu
cHV0PmAgdGFnIGludG8gdGhlIHRlbXBsYXRlLAotICB3aXRoIGEgYHR5cGVgIHZhbHVlIG9mIGVp
dGhlciBgdGV4dGAgb3IgYGNoZWNrYm94YC4gSWYgbm8gYHR5cGVgIGlzIHByb3ZpZGVkLAotICBg
dGV4dGAgd2lsbCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSBhcHBsaWVkLiBUaGUgYXR0cmlidXRlcyBv
ZiBge3tpbnB1dH19YAotICBtYXRjaCB0aG9zZSBvZiB0aGUgbmF0aXZlIEhUTUwgdGFnIGFzIGNs
b3NlbHkgYXMgcG9zc2libGUgZm9yIHRoZXNlIHR3byB0eXBlcy4KLQotICAjIyBVc2UgYXMgdGV4
dCBmaWVsZAotICBBbiBge3tpbnB1dH19YCB3aXRoIG5vIGB0eXBlYCBvciBhIGB0eXBlYCBvZiBg
dGV4dGAgd2lsbCByZW5kZXIgYW4gSFRNTCB0ZXh0IGlucHV0LgotICBUaGUgZm9sbG93aW5nIEhU
TUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0aGUgaGVscGVyOgotCi0qIGB2YWx1ZWAKLSog
YHNpemVgCi0qIGBuYW1lYAotKiBgcGF0dGVybmAKLSogYHBsYWNlaG9sZGVyYAotKiBgZGlzYWJs
ZWRgCi0qIGBtYXhsZW5ndGhgCi0qIGB0YWJpbmRleGAKLQotCi0gIFdoZW4gc2V0IHRvIGEgcXVv
dGVkIHN0cmluZywgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUg
SFRNTAotICBlbGVtZW50LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJl
IGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCi0gIHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJp
bmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4KLQotICAj
IyBVbmJvdW5kOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tpbnB1dCB2YWx1ZT0iaHR0cDovL3d3
dy5mYWNlYm9vay5jb20ifX0KLSAgYGBgCi0KLQotICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJ0
ZXh0IiB2YWx1ZT0iaHR0cDovL3d3dy5mYWNlYm9vay5jb20iLz4KLSAgYGBgCi0KLSAgIyMgQm91
bmQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1i
ZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIGZpcnN0TmFtZTogIlN0YW5sZXkiLAotICAgIGVu
dHJ5Tm90QWxsb3dlZDogdHJ1ZQotICB9KTsKLSAgYGBgCi0KLQotICBgYGBoYW5kbGViYXJzCi0g
IHt7aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Zmlyc3ROYW1lIGRpc2FibGVkPWVudHJ5Tm90QWxs
b3dlZCBzaXplPSI1MCJ9fQotICBgYGAKLQotCi0gIGBgYGh0bWwKLSAgPGlucHV0IHR5cGU9InRl
eHQiIHZhbHVlPSJTdGFubGV5IiBkaXNhYmxlZD0iZGlzYWJsZWQiIHNpemU9IjUwIi8+Ci0gIGBg
YAotCi0gICMjIEV4dGVuc2lvbgotCi0gIEludGVybmFsbHksIGB7e2lucHV0IHR5cGU9InRleHQi
fX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRleHRGaWVsZGAsIHBhc3NpbmcKLSAg
YXJndW1lbnRzIGZyb20gdGhlIGhlbHBlciB0byBgRW1iZXIuVGV4dEZpZWxkYCdzIGBjcmVhdGVg
IG1ldGhvZC4gWW91IGNhbiBleHRlbmQgdGhlCi0gIGNhcGFibGlsdGllcyBvZiB0ZXh0IGlucHV0
cyBpbiB5b3VyIGFwcGxpY2F0aW9ucyBieSByZW9wZW5pbmcgdGhpcyBjbGFzcy4gRm9yIGV4YW1w
bGUsCi0gIGlmIHlvdSBhcmUgZGVwbG95aW5nIHRvIGJyb3dzZXJzIHdoZXJlIHRoZSBgcmVxdWly
ZWRgIGF0dHJpYnV0ZSBpcyB1c2VkLCB5b3UKLSAgY2FuIGFkZCB0aGlzIHRvIHRoZSBgVGV4dEZp
ZWxkYCdzIGBhdHRyaWJ1dGVCaW5kaW5nc2AgcHJvcGVydHk6Ci0KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLlRleHRGaWVsZC5yZW9wZW4oewotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3Jl
cXVpcmVkJ10KLSAgfSk7Ci0gIGBgYAotCi0gIEtlZXAgaW4gbWluZCB3aGVuIHdyaXRpbmcgYEVt
YmVyLlRleHRGaWVsZGAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0RmllbGRgCi0gIGl0c2Vs
ZiBleHRlbmRzIGBFbWJlci5Db21wb25lbnRgLCBtZWFuaW5nIHRoYXQgaXQgZG9lcyBOT1QgaW5o
ZXJpdAotICB0aGUgYGNvbnRyb2xsZXJgIG9mIHRoZSBwYXJlbnQgdmlldy4KLQotICBTZWUgbW9y
ZSBhYm91dCBbRW1iZXIgY29tcG9uZW50c10oYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0
bWwpCi0KLQotICAjIyBVc2UgYXMgY2hlY2tib3gKLQotICBBbiBge3tpbnB1dH19YCB3aXRoIGEg
YHR5cGVgIG9mIGBjaGVja2JveGAgd2lsbCByZW5kZXIgYW4gSFRNTCBjaGVja2JveCBpbnB1dC4K
LSAgVGhlIGZvbGxvd2luZyBIVE1MIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCB2aWEgdGhlIGhlbHBl
cjoKLQotKiBgY2hlY2tlZGAKLSogYGRpc2FibGVkYAotKiBgdGFiaW5kZXhgCi0qIGBpbmRldGVy
bWluYXRlYAotKiBgbmFtZWAKLQotCi0gIFdoZW4gc2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhl
c2UgdmFsdWVzIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAotICBlbGVtZW50
LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGJvdW5kIHRvIGEgcHJv
cGVydHkgb24gdGhlCi0gIHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCAobW9z
dCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4KLQotICAjIyBVbmJvdW5kOgotCi0g
IGBgYGhhbmRsZWJhcnMKLSAge3tpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNBZG1pbiJ9
fQotICBgYGAKLQotICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNB
ZG1pbiIgLz4KLSAgYGBgCi0KLSAgIyMgQm91bmQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIGlz
QWRtaW46IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e2lucHV0
IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPWlzQWRtaW4gfX0KLSAgYGBgCi0KLQotICBgYGBodG1s
Ci0gIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIgLz4KLSAgYGBgCi0K
LSAgIyMgRXh0ZW5zaW9uCi0KLSAgSW50ZXJuYWxseSwgYHt7aW5wdXQgdHlwZT0iY2hlY2tib3gi
fX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkNoZWNrYm94YCwgcGFzc2luZwotICBh
cmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5DaGVja2JveGAncyBgY3JlYXRlYCBt
ZXRob2QuIFlvdSBjYW4gZXh0ZW5kIHRoZQotICBjYXBhYmxpbHRpZXMgb2YgY2hlY2tib3ggaW5w
dXRzIGluIHlvdXIgYXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0aGlzIGNsYXNzLiBGb3IgZXhh
bXBsZSwKLSAgaWYgeW91IHdhbnRlZCB0byBhZGQgYSBjc3MgY2xhc3MgdG8gYWxsIGNoZWNrYm94
ZXMgaW4geW91ciBhcHBsaWNhdGlvbjoKLQotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuQ2hl
Y2tib3gucmVvcGVuKHsKLSAgICBjbGFzc05hbWVzOiBbJ215LWFwcC1jaGVja2JveCddCi0gIH0p
OwotICBgYGAKLQotCi0gIEBtZXRob2QgaW5wdXQKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhl
bHBlcnMKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignaW5wdXQnLCBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgn
WW91IGNhbiBvbmx5IHBhc3MgYXR0cmlidXRlcyB0byB0aGUgYGlucHV0YCBoZWxwZXIsIG5vdCBh
cmd1bWVudHMnLCBhcmd1bWVudHMubGVuZ3RoIDwgMik7Ci0KLSAgdmFyIGhhc2ggPSBvcHRpb25z
Lmhhc2gsCi0gICAgICB0eXBlcyA9IG9wdGlvbnMuaGFzaFR5cGVzLAotICAgICAgaW5wdXRUeXBl
ID0gaGFzaC50eXBlLAotICAgICAgb25FdmVudCA9IGhhc2gub247Ci0KLSAgZGVsZXRlIGhhc2gu
dHlwZTsKLSAgZGVsZXRlIGhhc2gub247Ci0KLSAgaWYgKGlucHV0VHlwZSA9PT0gJ2NoZWNrYm94
JykgewotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMs
IEVtYmVyLkNoZWNrYm94LCBvcHRpb25zKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaW5wdXRUeXBl
KSB7IGhhc2gudHlwZSA9IGlucHV0VHlwZTsgfQotICAgIGhhc2gub25FdmVudCA9IG9uRXZlbnQg
fHwgJ2VudGVyJzsKLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs
bCh0aGlzLCBFbWJlci5UZXh0RmllbGQsIG9wdGlvbnMpOwotICB9Ci19KTsKLQotLyoqCi0gIGB7
e3RleHRhcmVhfX1gIGluc2VydHMgYSBuZXcgaW5zdGFuY2Ugb2YgYDx0ZXh0YXJlYT5gIHRhZyBp
bnRvIHRoZSB0ZW1wbGF0ZS4KLSAgVGhlIGF0dHJpYnV0ZXMgb2YgYHt7dGV4dGFyZWF9fWAgbWF0
Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRhZ3MgYXMKLSAgY2xvc2VseSBhcyBwb3NzaWJs
ZS4KLQotICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0OgotCi0gICAg
KiBgdmFsdWVgCi0gICAgKiBgbmFtZWAKLSAgICAqIGByb3dzYAotICAgICogYGNvbHNgCi0gICAg
KiBgcGxhY2Vob2xkZXJgCi0gICAgKiBgZGlzYWJsZWRgCi0gICAgKiBgbWF4bGVuZ3RoYAotICAg
ICogYHRhYmluZGV4YAotCi0gIFdoZW4gc2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhlc2UgdmFs
dWUgd2lsbCBiZSBkaXJlY3RseSBhcHBsaWVkIHRvIHRoZSBIVE1MCi0gIGVsZW1lbnQuIFdoZW4g
bGVmdCB1bnF1b3RlZCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBv
biB0aGUKLSAgdGVtcGxhdGUncyBjdXJyZW50IHJlbmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGlj
YWxseSBhIGNvbnRyb2xsZXIgaW5zdGFuY2UpLgotCi0gIFVuYm91bmQ6Ci0KLSAgYGBgaGFuZGxl
YmFycwotICB7e3RleHRhcmVhIHZhbHVlPSJMb3RzIG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1Qg
Ym91bmQifX0KLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoK
LQotICBgYGBodG1sCi0gIDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KLSAgICBM
b3RzIG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1QgYm91bmQKLSAgPC90ZXh0YXJlYT4KLSAgYGBg
Ci0KLSAgQm91bmQ6Ci0KLSAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgYHdyaXR0ZW5X
b3Jkc2AgcHJvcGVydHkgb24gYEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXJgCi0gIHdpbGwgYmUg
dXBkYXRlZCBsaXZlIGFzIHRoZSB1c2VyIHR5cGVzICdMb3RzIG9mIHRleHQgdGhhdCBJUyBib3Vu
ZCcgaW50bwotICB0aGUgdGV4dCBhcmVhIG9mIHRoZWlyIGJyb3dzZXIncyB3aW5kb3cuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgIHdyaXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJv
dW5kIgotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e3RleHRhcmVhIHZhbHVl
PXdyaXR0ZW5Xb3Jkc319Ci0gIGBgYAotCi0gICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2lu
ZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHRleHRhcmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEi
PgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBgYAot
Ci0gIElmIHlvdSB3YW50ZWQgYSBvbmUgd2F5IGJpbmRpbmcgYmV0d2VlbiB0aGUgdGV4dCBhcmVh
IGFuZCBhIGRpdiB0YWcKLSAgc29tZXdoZXJlIGVsc2Ugb24geW91ciBzY3JlZW4sIHlvdSBjb3Vs
ZCB1c2UgYEVtYmVyLmNvbXB1dGVkLm9uZVdheWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHdy
aXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kIiwKLSAgICBvdXRwdXRXcml0
dGVuV29yZHM6IEVtYmVyLmNvbXB1dGVkLm9uZVdheSgid3JpdHRlbldvcmRzIikKLSAgfSk7Ci0g
IGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t0ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9
fQotCi0gIDxkaXY+Ci0gICAge3tvdXRwdXRXcml0dGVuV29yZHN9fQotICA8L2Rpdj4KLSAgYGBg
Ci0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0g
IDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KLSAgICBMb3RzIG9mIHRleHQgdGhh
dCBJUyBib3VuZAotICA8L3RleHRhcmVhPgotCi0gIDwtLSB0aGUgZm9sbG93aW5nIGRpdiB3aWxs
IGJlIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGFzIHlvdSB0eXBlIC0tPgotCi0gIDxkaXY+Ci0gICAg
TG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQKLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEZpbmFsbHks
IHRoaXMgZXhhbXBsZSByZWFsbHkgc2hvd3MgdGhlIHBvd2VyIGFuZCBlYXNlIG9mIEVtYmVyIHdo
ZW4gdHdvCi0gIHByb3BlcnRpZXMgYXJlIGJvdW5kIHRvIGVhY2hvdGhlciB2aWEgYEVtYmVyLmNv
bXB1dGVkLmFsaWFzYC4gVHlwZSBpbnRvCi0gIGVpdGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5
J2xsIGJvdGggc3RheSBpbiBzeW5jLiBOb3RlIHRoYXQKLSAgYEVtYmVyLmNvbXB1dGVkLmFsaWFz
YCBjb3N0cyBtb3JlIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlLCBzbyBvbmx5IHVzZSBpdCB3aGVu
Ci0gIHlvdXIgcmVhbGx5IGJpbmRpbmcgaW4gYm90aCBkaXJlY3Rpb25zOgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0
ZW5kKHsKLSAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCIsCi0g
ICAgdHdvV2F5V3JpdHRlbldvcmRzOiBFbWJlci5jb21wdXRlZC5hbGlhcygid3JpdHRlbldvcmRz
IikKLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t0ZXh0YXJlYSB2YWx1ZT13
cml0dGVuV29yZHN9fQotICB7e3RleHRhcmVhIHZhbHVlPXR3b1dheVdyaXR0ZW5Xb3Jkc319Ci0g
IGBgYAotCi0gIGBgYGh0bWwKLSAgPHRleHRhcmVhIGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci10
ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+
Ci0KLSAgPC0tIGJvdGggdXBkYXRlZCBpbiByZWFsIHRpbWUgLS0+Ci0KLSAgPHRleHRhcmVhIGlk
PSJlbWJlcjIiIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0
IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBgYAotCi0gICMjIEV4dGVuc2lvbgotCi0gIElu
dGVybmFsbHksIGB7e3RleHRhcmVhfX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRl
eHRBcmVhYCwgcGFzc2luZwotICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5U
ZXh0QXJlYWAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KLSAgZXh0ZW5kIHRoZSBjYXBhYmls
aXRpZXMgb2YgdGV4dCBhcmVhcyBpbiB5b3VyIGFwcGxpY2F0aW9uIGJ5IHJlb3BlbmluZyB0aGlz
Ci0gIGNsYXNzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBkZXBsb3lpbmcgdG8gYnJvd3NlcnMg
d2hlcmUgdGhlIGByZXF1aXJlZGAKLSAgYXR0cmlidXRlIGlzIHVzZWQsIHlvdSBjYW4gZ2xvYmFs
bHkgYWRkIHN1cHBvcnQgZm9yIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZQotICBvbiBhbGwgYHt7
dGV4dGFyZWF9fWBzJyBpbiB5b3VyIGFwcCBieSByZW9wZW5pbmcgYEVtYmVyLlRleHRBcmVhYCBv
cgotICBgRW1iZXIuVGV4dFN1cHBvcnRgIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1dGVC
aW5kaW5nc2AgY29uY2F0ZW5hdGVkCi0gIHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
RW1iZXIuVGV4dEFyZWEucmVvcGVuKHsKLSAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydyZXF1aXJl
ZCddCi0gIH0pOwotICBgYGAKLQotICBLZWVwIGluIG1pbmQgd2hlbiB3cml0aW5nIGBFbWJlci5U
ZXh0QXJlYWAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0QXJlYWAKLSAgaXRzZWxmIGV4dGVu
ZHMgYEVtYmVyLkNvbXBvbmVudGAsIG1lYW5pbmcgdGhhdCBpdCBkb2VzIE5PVCBpbmhlcml0Ci0g
IHRoZSBgY29udHJvbGxlcmAgb2YgdGhlIHBhcmVudCB2aWV3LgotCi0gIFNlZSBtb3JlIGFib3V0
IFtFbWJlciBjb21wb25lbnRzXShhcGkvY2xhc3Nlcy9FbWJlci5Db21wb25lbnQuaHRtbCkKLQot
ICBAbWV0aG9kIHRleHRhcmVhCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBw
YXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIo
J3RleHRhcmVhJywgZnVuY3Rpb24ob3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoJ1lvdSBjYW4g
b25seSBwYXNzIGF0dHJpYnV0ZXMgdG8gdGhlIGB0ZXh0YXJlYWAgaGVscGVyLCBub3QgYXJndW1l
bnRzJywgYXJndW1lbnRzLmxlbmd0aCA8IDIpOwotCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNo
LAotICAgICAgdHlwZXMgPSBvcHRpb25zLmhhc2hUeXBlczsKLQotICByZXR1cm4gRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBFbWJlci5UZXh0QXJlYSwgb3B0aW9ucyk7
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLUVtYmVyLkNvbXBvbmVudExvb2t1
cCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBsb29rdXBGYWN0b3J5OiBmdW5jdGlvbihuYW1l
LCBjb250YWluZXIpIHsKLQotICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCB0aGlzLmNvbnRh
aW5lcjsKLQotICAgIHZhciBmdWxsTmFtZSA9ICdjb21wb25lbnQ6JyArIG5hbWUsCi0gICAgICAg
IHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6Y29tcG9uZW50cy8nICsgbmFtZSwKLSAgICAg
ICAgdGVtcGxhdGVSZWdpc3RlcmVkID0gY29udGFpbmVyICYmIGNvbnRhaW5lci5oYXModGVtcGxh
dGVGdWxsTmFtZSk7Ci0KLSAgICBpZiAodGVtcGxhdGVSZWdpc3RlcmVkKSB7Ci0gICAgICBjb250
YWluZXIuaW5qZWN0aW9uKGZ1bGxOYW1lLCAnbGF5b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7Ci0g
ICAgfQotCi0gICAgdmFyIENvbXBvbmVudCA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KGZ1bGxO
YW1lKTsKLQotICAgIC8vIE9ubHkgdHJlYXQgYXMgYSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBj
b21wb25lbnQKLSAgICAvLyBvciBhIHRlbXBsYXRlIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCi0gICAg
aWYgKHRlbXBsYXRlUmVnaXN0ZXJlZCB8fCBDb21wb25lbnQpIHsKLSAgICAgIGlmICghQ29tcG9u
ZW50KSB7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihmdWxsTmFtZSwgRW1iZXIuQ29tcG9u
ZW50KTsKLSAgICAgICAgQ29tcG9uZW50ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5h
bWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbXBvbmVudDsKLSAgICB9Ci0gIH0KLX0pOwot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi0vKioK
LSAgRmluZCB0ZW1wbGF0ZXMgc3RvcmVkIGluIHRoZSBoZWFkIHRhZyBhcyBzY3JpcHQgdGFncyBh
bmQgbWFrZSB0aGVtIGF2YWlsYWJsZQotICB0byBgRW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9i
YWwgYEVtYmVyLlRFTVBMQVRFU2Agb2JqZWN0LiBUaGlzIHdpbGwgYmUgcnVuCi0gIGFzIGFzIGpR
dWVyeSBET00tcmVhZHkgY2FsbGJhY2suCi0KLSAgU2NyaXB0IHRhZ3Mgd2l0aCBgdGV4dC94LWhh
bmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKLSAgd2l0aCBFbWJlcidzIEhhbmRsZWJhcnMgYW5k
IGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydzIHRlbXBsYXRlLgotICBUaG9zZSB3aXRo
IHR5cGUgYHRleHQveC1yYXctaGFuZGxlYmFyc2Agd2lsbCBiZSBjb21waWxlZCB3aXRoIHJlZ3Vs
YXIKLSAgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4gdmlld3MnIGNvbXB1
dGVkIHByb3BlcnRpZXMuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBib290c3RyYXAKLSAgQGZv
ciBFbWJlci5IYW5kbGViYXJzCi0gIEBzdGF0aWMKLSAgQHBhcmFtIGN0eAotKi8KLUVtYmVyLkhh
bmRsZWJhcnMuYm9vdHN0cmFwID0gZnVuY3Rpb24oY3R4KSB7Ci0gIHZhciBzZWxlY3RvcnMgPSAn
c2NyaXB0W3R5cGU9InRleHQveC1oYW5kbGViYXJzIl0sIHNjcmlwdFt0eXBlPSJ0ZXh0L3gtcmF3
LWhhbmRsZWJhcnMiXSc7Ci0KLSAgRW1iZXIuJChzZWxlY3RvcnMsIGN0eCkKLSAgICAuZWFjaChm
dW5jdGlvbigpIHsKLSAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcKLSAg
ICB2YXIgc2NyaXB0ID0gRW1iZXIuJCh0aGlzKTsKLQotICAgIHZhciBjb21waWxlID0gKHNjcmlw
dC5hdHRyKCd0eXBlJykgPT09ICd0ZXh0L3gtcmF3LWhhbmRsZWJhcnMnKSA/Ci0gICAgICAgICAg
ICAgICAgICBFbWJlci4kLnByb3h5KEhhbmRsZWJhcnMuY29tcGlsZSwgSGFuZGxlYmFycykgOgot
ICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUs
IEVtYmVyLkhhbmRsZWJhcnMpLAotICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQs
IHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBsYXRlTmFtZSBwcm9wZXJ0eS4KLSAgICAgIC8vIEZp
cnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUtbmFtZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNr
IHRvIGl0cwotICAgICAgLy8gaWQgaWYgbm8gbmFtZSBpcyBmb3VuZC4KLSAgICAgIHRlbXBsYXRl
TmFtZSA9IHNjcmlwdC5hdHRyKCdkYXRhLXRlbXBsYXRlLW5hbWUnKSB8fCBzY3JpcHQuYXR0cign
aWQnKSB8fCAnYXBwbGljYXRpb24nLAotICAgICAgdGVtcGxhdGUgPSBjb21waWxlKHNjcmlwdC5o
dG1sKCkpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgb2Ygc2FtZSBuYW1lIGFscmVhZHkg
ZXhpc3RzCi0gICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdICE9PSB1bmRlZmlu
ZWQpIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcignVGVtcGxhdGUgbmFtZWQgIicgKyB0
ZW1wbGF0ZU5hbWUgICsgJyIgYWxyZWFkeSBleGlzdHMuJyk7Ci0gICAgfQotCi0gICAgLy8gRm9y
IHRlbXBsYXRlcyB3aGljaCBoYXZlIGEgbmFtZSwgd2Ugc2F2ZSB0aGVtIGFuZCB0aGVuIHJlbW92
ZSB0aGVtIGZyb20gdGhlIERPTQotICAgIEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdID0g
dGVtcGxhdGU7Ci0KLSAgICAvLyBSZW1vdmUgc2NyaXB0IHRhZyBmcm9tIERPTQotICAgIHNjcmlw
dC5yZW1vdmUoKTsKLSAgfSk7Ci19OwotCi1mdW5jdGlvbiBib290c3RyYXAoKSB7Ci0gIEVtYmVy
LkhhbmRsZWJhcnMuYm9vdHN0cmFwKCBFbWJlci4kKGRvY3VtZW50KSApOwotfQotCi1mdW5jdGlv
biByZWdpc3RlckNvbXBvbmVudExvb2t1cChjb250YWluZXIpIHsKLSAgY29udGFpbmVyLnJlZ2lz
dGVyKCdjb21wb25lbnQtbG9va3VwOm1haW4nLCBFbWJlci5Db21wb25lbnRMb29rdXApOwotfQot
Ci0vKgotICBXZSB0aWUgdGhpcyB0byBhcHBsaWNhdGlvbi5sb2FkIHRvIGVuc3VyZSB0aGF0IHdl
J3ZlIGF0IGxlYXN0Ci0gIGF0dGVtcHRlZCB0byBib290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQg
dGhlIGFwcGxpY2F0aW9uIGlzIGxvYWRlZC4KLQotICBXZSBhbHNvIHRpZSB0aGlzIHRvIGRvY3Vt
ZW50IHJlYWR5IHNpbmNlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhbGwKLSAgdGhlIGlubGluZSB0
ZW1wbGF0ZXMgYXJlIHByZXNlbnQgYXQgdGhpcyBwb2ludC4KLQotICBUaGVyZSdzIG5vIGhhcm0g
dG8gcnVubmluZyB0aGlzIHR3aWNlLCBzaW5jZSB3ZSByZW1vdmUgdGhlIHRlbXBsYXRlcwotICBm
cm9tIHRoZSBET00gYWZ0ZXIgcHJvY2Vzc2luZy4KLSovCi0KLUVtYmVyLm9uTG9hZCgnRW1iZXIu
QXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewotICBBcHBsaWNhdGlvbi5pbml0
aWFsaXplcih7Ci0gICAgbmFtZTogJ2RvbVRlbXBsYXRlcycsCi0gICAgaW5pdGlhbGl6ZTogYm9v
dHN0cmFwCi0gIH0pOwotCi0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAn
cmVnaXN0ZXJDb21wb25lbnRMb29rdXAnLAotICAgIGFmdGVyOiAnZG9tVGVtcGxhdGVzJywKLSAg
ICBpbml0aWFsaXplOiByZWdpc3RlckNvbXBvbmVudExvb2t1cAotICB9KTsKLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBIYW5kbGViYXJzCi0KLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotQHJlcXVpcmVzIGVtYmVyLXZpZXdz
Ci0qLwotCi1FbWJlci5ydW5Mb2FkSG9va3MoJ0VtYmVyLkhhbmRsZWJhcnMnLCBFbWJlci5IYW5k
bGViYXJzKTsKLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotZGVmaW5lKCJyb3V0ZS1yZWNvZ25p
emVyIiwKLSAgW10sCi0gIGZ1bmN0aW9uKCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIg
c3BlY2lhbHMgPSBbCi0gICAgICAnLycsICcuJywgJyonLCAnKycsICc/JywgJ3wnLAotICAgICAg
JygnLCAnKScsICdbJywgJ10nLCAneycsICd9JywgJ1xcJwotICAgIF07Ci0KLSAgICB2YXIgZXNj
YXBlUmVnZXggPSBuZXcgUmVnRXhwKCcoXFwnICsgc3BlY2lhbHMuam9pbignfFxcJykgKyAnKScs
ICdnJyk7Ci0KLSAgICAvLyBBIFNlZ21lbnQgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4gdGhlIG9y
aWdpbmFsIHJvdXRlIGRlc2NyaXB0aW9uLgotICAgIC8vIEVhY2ggU2VnbWVudCB0eXBlIHByb3Zp
ZGVzIGFuIGBlYWNoQ2hhcmAgYW5kIGByZWdleGAgbWV0aG9kLgotICAgIC8vCi0gICAgLy8gVGhl
IGBlYWNoQ2hhcmAgbWV0aG9kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggb25lIG9yIG1vcmUg
Y2hhcmFjdGVyCi0gICAgLy8gc3BlY2lmaWNhdGlvbnMuIEEgY2hhcmFjdGVyIHNwZWNpZmljYXRp
b24gY29uc3VtZXMgb25lIG9yIG1vcmUgaW5wdXQKLSAgICAvLyBjaGFyYWN0ZXJzLgotICAgIC8v
Ci0gICAgLy8gVGhlIGByZWdleGAgbWV0aG9kIHJldHVybnMgYSByZWdleCBmcmFnbWVudCBmb3Ig
dGhlIHNlZ21lbnQuIElmIHRoZQotICAgIC8vIHNlZ21lbnQgaXMgYSBkeW5hbWljIG9mIHN0YXIg
c2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFsc28gaW5jbHVkZXMKLSAgICAvLyBhIGNhcHR1
cmUuCi0gICAgLy8KLSAgICAvLyBBIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgot
ICAgIC8vCi0gICAgLy8gKiBgdmFsaWRDaGFyc2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0IG9mIGFs
bCB2YWxpZCBjaGFyYWN0ZXJzLCBvcgotICAgIC8vICogYGludmFsaWRDaGFyc2A6IGEgU3RyaW5n
IHdpdGggYSBsaXN0IG9mIGFsbCBpbnZhbGlkIGNoYXJhY3RlcnMKLSAgICAvLyAqIGByZXBlYXRg
OiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBjYW4gcmVwZWF0Ci0KLSAgICBm
dW5jdGlvbiBTdGF0aWNTZWdtZW50KHN0cmluZykgeyB0aGlzLnN0cmluZyA9IHN0cmluZzsgfQot
ICAgIFN0YXRpY1NlZ21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFjaENoYXI6IGZ1bmN0aW9u
KGNhbGxiYWNrKSB7Ci0gICAgICAgIHZhciBzdHJpbmcgPSB0aGlzLnN0cmluZywgY2hhcjsKLQot
ICAgICAgICBmb3IgKHZhciBpPTAsIGw9c3RyaW5nLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgICBjaGFyID0gc3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICBjYWxsYmFjayh7IHZhbGlk
Q2hhcnM6IGNoYXIgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnJlcGxhY2UoZXNjYXBlUmVnZXgs
ICdcXCQxJyk7Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIHJldHVybiB0aGlzLnN0cmluZzsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24g
RHluYW1pY1NlZ21lbnQobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9Ci0gICAgRHluYW1pY1Nl
Z21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFjaENoYXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7
Ci0gICAgICAgIGNhbGxiYWNrKHsgaW52YWxpZENoYXJzOiAiLyIsIHJlcGVhdDogdHJ1ZSB9KTsK
LSAgICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIo
W14vXSspIjsKLSAgICAgIH0sCi0KLSAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwYXJhbXMpIHsK
LSAgICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOwotICAgICAgfQotICAgIH07Ci0KLSAg
ICBmdW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH0KLSAgICBT
dGFyU2VnbWVudC5wcm90b3R5cGUgPSB7Ci0gICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJh
Y2spIHsKLSAgICAgICAgY2FsbGJhY2soeyBpbnZhbGlkQ2hhcnM6ICIiLCByZXBlYXQ6IHRydWUg
fSk7Ci0gICAgICB9LAotCi0gICAgICByZWdleDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVy
biAiKC4rKSI7Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocGFyYW1zKSB7
Ci0gICAgICAgIHJldHVybiBwYXJhbXNbdGhpcy5uYW1lXTsKLSAgICAgIH0KLSAgICB9OwotCi0g
ICAgZnVuY3Rpb24gRXBzaWxvblNlZ21lbnQoKSB7fQotICAgIEVwc2lsb25TZWdtZW50LnByb3Rv
dHlwZSA9IHsKLSAgICAgIGVhY2hDaGFyOiBmdW5jdGlvbigpIHt9LAotICAgICAgcmVnZXg6IGZ1
bmN0aW9uKCkgeyByZXR1cm4gIiI7IH0sCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7IHJl
dHVybiAiIjsgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBwYXJzZShyb3V0ZSwgbmFtZXMsIHR5
cGVzKSB7Ci0gICAgICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSAi
LyIuIFJlY29nbml0aW9uIHdpbGwKLSAgICAgIC8vIGFsc28gbm9ybWFsaXplLgotICAgICAgaWYg
KHJvdXRlLmNoYXJBdCgwKSA9PT0gIi8iKSB7IHJvdXRlID0gcm91dGUuc3Vic3RyKDEpOyB9Ci0K
LSAgICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNwbGl0KCIvIiksIHJlc3VsdHMgPSBbXTsKLQot
ICAgICAgZm9yICh2YXIgaT0wLCBsPXNlZ21lbnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXSwgbWF0Y2g7Ci0KLSAgICAgICAgaWYgKG1hdGNo
ID0gc2VnbWVudC5tYXRjaCgvXjooW15cL10rKSQvKSkgewotICAgICAgICAgIHJlc3VsdHMucHVz
aChuZXcgRHluYW1pY1NlZ21lbnQobWF0Y2hbMV0pKTsKLSAgICAgICAgICBuYW1lcy5wdXNoKG1h
dGNoWzFdKTsKLSAgICAgICAgICB0eXBlcy5keW5hbWljcysrOwotICAgICAgICB9IGVsc2UgaWYg
KG1hdGNoID0gc2VnbWVudC5tYXRjaCgvXlwqKFteXC9dKykkLykpIHsKLSAgICAgICAgICByZXN1
bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNoWzFdKSk7Ci0gICAgICAgICAgbmFtZXMucHVz
aChtYXRjaFsxXSk7Ci0gICAgICAgICAgdHlwZXMuc3RhcnMrKzsKLSAgICAgICAgfSBlbHNlIGlm
KHNlZ21lbnQgPT09ICIiKSB7Ci0gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBFcHNpbG9uU2Vn
bWVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFN0
YXRpY1NlZ21lbnQoc2VnbWVudCkpOwotICAgICAgICAgIHR5cGVzLnN0YXRpY3MrKzsKLSAgICAg
ICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvLyBB
IFN0YXRlIGhhcyBhIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFuZCAoYGNoYXJTcGVjYCkgYW5k
IGEgbGlzdCBvZiBwb3NzaWJsZQotICAgIC8vIHN1YnNlcXVlbnQgc3RhdGVzIChgbmV4dFN0YXRl
c2ApLgotICAgIC8vCi0gICAgLy8gSWYgYSBTdGF0ZSBpcyBhbiBhY2NlcHRpbmcgc3RhdGUsIGl0
IHdpbGwgYWxzbyBoYXZlIHNldmVyYWwgYWRkaXRpb25hbAotICAgIC8vIHByb3BlcnRpZXM6Ci0g
ICAgLy8KLSAgICAvLyAqIGByZWdleGA6IEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNl
ZCB0byBleHRyYWN0IHBhcmFtZXRlcnMgZnJvbSBwYXRocwotICAgIC8vICAgdGhhdCByZWFjaGVk
IHRoaXMgYWNjZXB0aW5nIHN0YXRlLgotICAgIC8vICogYGhhbmRsZXJzYDogSW5mb3JtYXRpb24g
b24gaG93IHRvIGNvbnZlcnQgdGhlIGxpc3Qgb2YgY2FwdHVyZXMgaW50byBjYWxscwotICAgIC8v
ICAgdG8gcmVnaXN0ZXJlZCBoYW5kbGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwot
ICAgIC8vICogYHR5cGVzYDogSG93IG1hbnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVu
dHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0bwotICAgIC8vICAgZGVjaWRlIHdoaWNoIHJvdXRlIHRv
IHVzZSBpZiBtdWx0aXBsZSByZWdpc3RlcmVkIHJvdXRlcyBtYXRjaCBhIHBhdGguCi0gICAgLy8K
LSAgICAvLyBDdXJyZW50bHksIFN0YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGlu
ZyBvdmVyIGBuZXh0U3RhdGVzYCBhbmQKLSAgICAvLyBjb21wYXJpbmcgYSBjaGFyYWN0ZXIgc3Bl
Y2lmaWNhdGlvbiBhZ2FpbnN0IGEgY2hhcmFjdGVyLiBBIG1vcmUgZWZmaWNpZW50Ci0gICAgLy8g
aW1wbGVtZW50YXRpb24gd291bGQgdXNlIGEgaGFzaCBvZiBrZXlzIHBvaW50aW5nIGF0IG9uZSBv
ciBtb3JlIG5leHQgc3RhdGVzLgotCi0gICAgZnVuY3Rpb24gU3RhdGUoY2hhclNwZWMpIHsKLSAg
ICAgIHRoaXMuY2hhclNwZWMgPSBjaGFyU3BlYzsKLSAgICAgIHRoaXMubmV4dFN0YXRlcyA9IFtd
OwotICAgIH0KLQotICAgIFN0YXRlLnByb3RvdHlwZSA9IHsKLSAgICAgIGdldDogZnVuY3Rpb24o
Y2hhclNwZWMpIHsKLSAgICAgICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXM7Ci0K
LSAgICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRTdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgICAgICAgIHZhciBjaGlsZCA9IG5leHRTdGF0ZXNbaV07Ci0KLSAgICAgICAgICB2YXIgaXNF
cXVhbCA9IGNoaWxkLmNoYXJTcGVjLnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLnZhbGlkQ2hhcnM7
Ci0gICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwgJiYgY2hpbGQuY2hhclNwZWMuaW52YWxpZENo
YXJzID09PSBjaGFyU3BlYy5pbnZhbGlkQ2hhcnM7Ci0KLSAgICAgICAgICBpZiAoaXNFcXVhbCkg
eyByZXR1cm4gY2hpbGQ7IH0KLSAgICAgICAgfQotICAgICAgfSwKLQotICAgICAgcHV0OiBmdW5j
dGlvbihjaGFyU3BlYykgewotICAgICAgICB2YXIgc3RhdGU7Ci0KLSAgICAgICAgLy8gSWYgdGhl
IGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGluIGEgY2hpbGQgb2YgdGhl
IGN1cnJlbnQKLSAgICAgICAgLy8gc3RhdGUsIGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCi0gICAg
ICAgIGlmIChzdGF0ZSA9IHRoaXMuZ2V0KGNoYXJTcGVjKSkgeyByZXR1cm4gc3RhdGU7IH0KLQot
ICAgICAgICAvLyBNYWtlIGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFjdGVyIHNwZWMKLSAgICAg
ICAgc3RhdGUgPSBuZXcgU3RhdGUoY2hhclNwZWMpOwotCi0gICAgICAgIC8vIEluc2VydCB0aGUg
bmV3IHN0YXRlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgdGhpcy5u
ZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotCi0gICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNw
ZWNpZmljYXRpb24gcmVwZWF0cywgaW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZAotICAg
ICAgICAvLyBvZiBpdHNlbGYuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHRyaWdnZXIgYW4gaW5m
aW5pdGUgbG9vcCBiZWNhdXNlIGVhY2gKLSAgICAgICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVj
b2duaXRpb24gY29uc3VtZXMgYSBjaGFyYWN0ZXIuCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBl
YXQpIHsKLSAgICAgICAgICBzdGF0ZS5uZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgc3RhdGUKLSAgICAgICAgcmV0dXJuIHN0YXRl
OwotICAgICAgfSwKLQotICAgICAgLy8gRmluZCBhIGxpc3Qgb2YgY2hpbGQgc3RhdGVzIG1hdGNo
aW5nIHRoZSBuZXh0IGNoYXJhY3RlcgotICAgICAgbWF0Y2g6IGZ1bmN0aW9uKGNoYXIpIHsKLSAg
ICAgICAgLy8gREVCVUcgIlByb2Nlc3NpbmcgYCIgKyBjaGFyICsgImA6IgotICAgICAgICB2YXIg
bmV4dFN0YXRlcyA9IHRoaXMubmV4dFN0YXRlcywKLSAgICAgICAgICAgIGNoaWxkLCBjaGFyU3Bl
YywgY2hhcnM7Ci0KLSAgICAgICAgLy8gREVCVUcgIiAgIiArIGRlYnVnU3RhdGUodGhpcykKLSAg
ICAgICAgdmFyIHJldHVybmVkID0gW107Ci0KLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRT
dGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIGNoaWxkID0gbmV4dFN0YXRlc1tp
XTsKLQotICAgICAgICAgIGNoYXJTcGVjID0gY2hpbGQuY2hhclNwZWM7Ci0KLSAgICAgICAgICBp
ZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMpICE9PSAndW5kZWZpbmVkJykg
ewotICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2hhcikgIT09IC0xKSB7IHJldHVybmVk
LnB1c2goY2hpbGQpOyB9Ci0gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hh
clNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICAgIGlmIChj
aGFycy5pbmRleE9mKGNoYXIpID09PSAtMSkgeyByZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQotICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5lZDsKLSAgICAgIH0K
LQotICAgICAgLyoqIElGIERFQlVHCi0gICAgICAsIGRlYnVnOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgdmFyIGNoYXJTcGVjID0gdGhpcy5jaGFyU3BlYywKLSAgICAgICAgICAgIGRlYnVnID0gIlsi
LAotICAgICAgICAgICAgY2hhcnMgPSBjaGFyU3BlYy52YWxpZENoYXJzIHx8IGNoYXJTcGVjLmlu
dmFsaWRDaGFyczsKLQotICAgICAgICBpZiAoY2hhclNwZWMuaW52YWxpZENoYXJzKSB7IGRlYnVn
ICs9ICJeIjsgfQotICAgICAgICBkZWJ1ZyArPSBjaGFyczsKLSAgICAgICAgZGVidWcgKz0gIl0i
OwotCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsgZGVidWcgKz0gIisiOyB9Ci0KLSAg
ICAgICAgcmV0dXJuIGRlYnVnOwotICAgICAgfQotICAgICAgRU5EIElGICoqLwotICAgIH07Ci0K
LSAgICAvKiogSUYgREVCVUcKLSAgICBmdW5jdGlvbiBkZWJ1Zyhsb2cpIHsKLSAgICAgIGNvbnNv
bGUubG9nKGxvZyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZGVidWdTdGF0ZShzdGF0ZSkgewot
ICAgICAgcmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKG4pIHsKLSAgICAgICAg
aWYgKG4ubmV4dFN0YXRlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuICIoICIgKyBuLmRlYnVnKCkg
KyAiIFthY2NlcHRpbmddICkiOyB9Ci0gICAgICAgIHJldHVybiAiKCAiICsgbi5kZWJ1ZygpICsg
IiA8dGhlbj4gIiArIG4ubmV4dFN0YXRlcy5tYXAoZnVuY3Rpb24ocykgeyByZXR1cm4gcy5kZWJ1
ZygpIH0pLmpvaW4oIiBvciAiKSArICIgKSI7Ci0gICAgICB9KS5qb2luKCIsICIpCi0gICAgfQot
ICAgIEVORCBJRiAqKi8KLQotICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBuYWl2ZSBzdHJhdGVn
eSwgYnV0IHNob3VsZCB3b3JrIGluIGEgbG90IG9mIGNhc2VzCi0gICAgLy8gQSBiZXR0ZXIgc3Ry
YXRlZ3kgd291bGQgcHJvcGVybHkgcmVzb2x2ZSAvcG9zdHMvOmlkL25ldyBhbmQgL3Bvc3RzL2Vk
aXQvOmlkCi0gICAgZnVuY3Rpb24gc29ydFNvbHV0aW9ucyhzdGF0ZXMpIHsKLSAgICAgIHJldHVy
biBzdGF0ZXMuc29ydChmdW5jdGlvbihhLCBiKSB7Ci0gICAgICAgIGlmIChhLnR5cGVzLnN0YXJz
ICE9PSBiLnR5cGVzLnN0YXJzKSB7IHJldHVybiBhLnR5cGVzLnN0YXJzIC0gYi50eXBlcy5zdGFy
czsgfQotICAgICAgICBpZiAoYS50eXBlcy5keW5hbWljcyAhPT0gYi50eXBlcy5keW5hbWljcykg
eyByZXR1cm4gYS50eXBlcy5keW5hbWljcyAtIGIudHlwZXMuZHluYW1pY3M7IH0KLSAgICAgICAg
aWYgKGEudHlwZXMuc3RhdGljcyAhPT0gYi50eXBlcy5zdGF0aWNzKSB7IHJldHVybiBiLnR5cGVz
LnN0YXRpY3MgLSBhLnR5cGVzLnN0YXRpY3M7IH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICAg
IH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3RhdGVzLCBjaGFyKSB7
Ci0gICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOwotCi0gICAgICBmb3IgKHZhciBpPTAsIGw9c3Rh
dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOwot
Ci0gICAgICAgIG5leHRTdGF0ZXMgPSBuZXh0U3RhdGVzLmNvbmNhdChzdGF0ZS5tYXRjaChjaGFy
KSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBuZXh0U3RhdGVzOwotICAgIH0KLQotICAgIGZ1
bmN0aW9uIGZpbmRIYW5kbGVyKHN0YXRlLCBwYXRoLCBxdWVyeVBhcmFtcykgewotICAgICAgdmFy
IGhhbmRsZXJzID0gc3RhdGUuaGFuZGxlcnMsIHJlZ2V4ID0gc3RhdGUucmVnZXg7Ci0gICAgICB2
YXIgY2FwdHVyZXMgPSBwYXRoLm1hdGNoKHJlZ2V4KSwgY3VycmVudENhcHR1cmUgPSAxOwotICAg
ICAgdmFyIHJlc3VsdCA9IFtdOwotCi0gICAgICBmb3IgKHZhciBpPTAsIGw9aGFuZGxlcnMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLCBuYW1l
cyA9IGhhbmRsZXIubmFtZXMsIHBhcmFtcyA9IHt9LAotICAgICAgICAgIHdhdGNoZWRRdWVyeVBh
cmFtcyA9IGhhbmRsZXIucXVlcnlQYXJhbXMgfHwgW10sCi0gICAgICAgICAgYWN0aXZlUXVlcnlQ
YXJhbXMgPSB7fSwKLSAgICAgICAgICBqLCBtOwotCi0gICAgICAgIGZvciAoaj0wLCBtPW5hbWVz
Lmxlbmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAgICBwYXJhbXNbbmFtZXNbal1dID0gY2FwdHVy
ZXNbY3VycmVudENhcHR1cmUrK107Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChqPTAsIG09d2F0
Y2hlZFF1ZXJ5UGFyYW1zLmxlbmd0aDsgaiA8IG07IGorKykgewotICAgICAgICAgIHZhciBrZXkg
PSB3YXRjaGVkUXVlcnlQYXJhbXNbal07Ci0gICAgICAgICAgaWYocXVlcnlQYXJhbXNba2V5XSl7
Ci0gICAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtc1trZXldID0gcXVlcnlQYXJhbXNba2V5XTsK
LSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIGN1cnJlbnRSZXN1bHQgPSB7IGhh
bmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFyYW1zOiBwYXJhbXMsIGlzRHluYW1pYzogISFuYW1l
cy5sZW5ndGggfTsKLSAgICAgICAgaWYod2F0Y2hlZFF1ZXJ5UGFyYW1zICYmIHdhdGNoZWRRdWVy
eVBhcmFtcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgY3VycmVudFJlc3VsdC5xdWVyeVBhcmFt
cyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5wdXNoKGN1
cnJlbnRSZXN1bHQpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQot
ICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KSB7Ci0gICAgICBz
ZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIpIHsKLSAgICAgICAgdmFyIHN0YXRlOwotCi0g
ICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5wdXQoY2hhcik7Ci0gICAgICB9KTsK
LQotICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbWFpbiBp
bnRlcmZhY2UKLQotICAgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAg
IHRoaXMucm9vdFN0YXRlID0gbmV3IFN0YXRlKCk7Ci0gICAgICB0aGlzLm5hbWVzID0ge307Ci0g
ICAgfTsKLQotCi0gICAgUm91dGVSZWNvZ25pemVyLnByb3RvdHlwZSA9IHsKLSAgICAgIGFkZDog
ZnVuY3Rpb24ocm91dGVzLCBvcHRpb25zKSB7Ci0gICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSB0
aGlzLnJvb3RTdGF0ZSwgcmVnZXggPSAiXiIsCi0gICAgICAgICAgICB0eXBlcyA9IHsgc3RhdGlj
czogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0sCi0gICAgICAgICAgICBoYW5kbGVycyA9IFtd
LCBhbGxTZWdtZW50cyA9IFtdLCBuYW1lOwotCi0gICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsK
LQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9cm91dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgICAgICB2YXIgcm91dGUgPSByb3V0ZXNbaV0sIG5hbWVzID0gW107Ci0KLSAgICAgICAgICB2
YXIgc2VnbWVudHMgPSBwYXJzZShyb3V0ZS5wYXRoLCBuYW1lcywgdHlwZXMpOwotCi0gICAgICAg
ICAgYWxsU2VnbWVudHMgPSBhbGxTZWdtZW50cy5jb25jYXQoc2VnbWVudHMpOwotCi0gICAgICAg
ICAgZm9yICh2YXIgaj0wLCBtPXNlZ21lbnRzLmxlbmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAg
ICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07Ci0KLSAgICAgICAgICAgIGlmIChzZWdtZW50
IGluc3RhbmNlb2YgRXBzaWxvblNlZ21lbnQpIHsgY29udGludWU7IH0KLQotICAgICAgICAgICAg
aXNFbXB0eSA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBBZGQgYSAiLyIgZm9yIHRoZSBuZXcg
c2VnbWVudAotICAgICAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dCh7IHZh
bGlkQ2hhcnM6ICIvIiB9KTsKLSAgICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKLQotICAgICAgICAg
ICAgLy8gQWRkIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlZ21lbnQgdG8gdGhlIE5GQSBhbmQg
cmVnZXgKLSAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGFkZFNlZ21lbnQoY3VycmVudFN0YXRl
LCBzZWdtZW50KTsKLSAgICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKLSAgICAg
ICAgICB9Ci0KLSAgICAgICAgICB2YXIgaGFuZGxlciA9IHsgaGFuZGxlcjogcm91dGUuaGFuZGxl
ciwgbmFtZXM6IG5hbWVzIH07Ci0gICAgICAgICAgaWYocm91dGUucXVlcnlQYXJhbXMpIHsKLSAg
ICAgICAgICAgIGhhbmRsZXIucXVlcnlQYXJhbXMgPSByb3V0ZS5xdWVyeVBhcmFtczsKLSAgICAg
ICAgICB9Ci0gICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlmIChpc0VtcHR5KSB7Ci0gICAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0
YXRlLnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsKLSAgICAgICAgICByZWdleCArPSAiLyI7Ci0g
ICAgICAgIH0KLQotICAgICAgICBjdXJyZW50U3RhdGUuaGFuZGxlcnMgPSBoYW5kbGVyczsKLSAg
ICAgICAgY3VycmVudFN0YXRlLnJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleCArICIkIik7Ci0gICAg
ICAgIGN1cnJlbnRTdGF0ZS50eXBlcyA9IHR5cGVzOwotCi0gICAgICAgIGlmIChuYW1lID0gb3B0
aW9ucyAmJiBvcHRpb25zLmFzKSB7Ci0gICAgICAgICAgdGhpcy5uYW1lc1tuYW1lXSA9IHsKLSAg
ICAgICAgICAgIHNlZ21lbnRzOiBhbGxTZWdtZW50cywKLSAgICAgICAgICAgIGhhbmRsZXJzOiBo
YW5kbGVycwotICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIGhhbmRs
ZXJzRm9yOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNb
bmFtZV0sIHJlc3VsdCA9IFtdOwotICAgICAgICBpZiAoIXJvdXRlKSB7IHRocm93IG5ldyBFcnJv
cigiVGhlcmUgaXMgbm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOyB9Ci0KLSAgICAgICAgZm9yICh2
YXIgaT0wLCBsPXJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBy
ZXN1bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gcmVzdWx0OwotICAgICAgfSwKLQotICAgICAgaGFzUm91dGU6IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICAgICAgcmV0dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKLSAgICAgIH0sCi0KLSAgICAgIGdl
bmVyYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMpIHsKLSAgICAgICAgdmFyIHJvdXRlID0gdGhp
cy5uYW1lc1tuYW1lXSwgb3V0cHV0ID0gIiI7Ci0gICAgICAgIGlmICghcm91dGUpIHsgdGhyb3cg
bmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiICsgbmFtZSk7IH0KLQotICAgICAg
ICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zZWdtZW50czsKLQotICAgICAgICBmb3IgKHZhciBpPTAs
IGw9c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIHZhciBzZWdtZW50ID0g
c2VnbWVudHNbaV07Ci0KLSAgICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVwc2lsb25T
ZWdtZW50KSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgICBvdXRwdXQgKz0gIi8iOwotICAgICAg
ICAgIG91dHB1dCArPSBzZWdtZW50LmdlbmVyYXRlKHBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAob3V0cHV0LmNoYXJBdCgwKSAhPT0gJy8nKSB7IG91dHB1dCA9ICcvJyArIG91dHB1
dDsgfQotCi0gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLnF1ZXJ5UGFyYW1zKSB7Ci0gICAg
ICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJhdGVRdWVyeVN0cmluZyhwYXJhbXMucXVlcnlQYXJh
bXMsIHJvdXRlLmhhbmRsZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdXRwdXQ7
Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbihwYXJhbXMs
IGhhbmRsZXJzKSB7Ci0gICAgICAgIHZhciBwYWlycyA9IFtdLCBhbGxvd2VkUGFyYW1zID0gW107
Ci0gICAgICAgIGZvcih2YXIgaT0wOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAg
ICAgICB2YXIgY3VycmVudFBhcmFtTGlzdCA9IGhhbmRsZXJzW2ldLnF1ZXJ5UGFyYW1zOwotICAg
ICAgICAgIGlmKGN1cnJlbnRQYXJhbUxpc3QpIHsKLSAgICAgICAgICAgIGFsbG93ZWRQYXJhbXMu
cHVzaC5hcHBseShhbGxvd2VkUGFyYW1zLCBjdXJyZW50UGFyYW1MaXN0KTsKLSAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKHZhciBrZXkgaW4gcGFyYW1zKSB7Ci0gICAgICAgICAg
aWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAgICAgICBpZihhbGxvd2Vk
UGFyYW1zLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsKLSAgICAgICAgICAgICAgdGhyb3cgJ1F1ZXJ5
IHBhcmFtICInICsga2V5ICsgJyIgaXMgbm90IHNwZWNpZmllZCBhcyBhIHZhbGlkIHBhcmFtIGZv
ciB0aGlzIHJvdXRlJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBh
cmFtc1trZXldOwotICAgICAgICAgICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5
KTsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgIHBhaXIg
Kz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIHBhaXJzLnB1c2gocGFpcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKHBhaXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH0KLQotICAgICAgICByZXR1
cm4gIj8iICsgcGFpcnMuam9pbigiJiIpOwotICAgICAgfSwKLQotICAgICAgcGFyc2VRdWVyeVN0
cmluZzogZnVuY3Rpb24ocXVlcnlTdHJpbmcpIHsKLSAgICAgICAgdmFyIHBhaXJzID0gcXVlcnlT
dHJpbmcuc3BsaXQoIiYiKSwgcXVlcnlQYXJhbXMgPSB7fTsKLSAgICAgICAgZm9yKHZhciBpPTA7
IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHZhciBwYWlyICAgICAgPSBwYWly
c1tpXS5zcGxpdCgnPScpLAotICAgICAgICAgICAgICBrZXkgICAgICAgPSBkZWNvZGVVUklDb21w
b25lbnQocGFpclswXSksCi0gICAgICAgICAgICAgIHZhbHVlICAgICA9IHBhaXJbMV0gPyBkZWNv
ZGVVUklDb21wb25lbnQocGFpclsxXSkgOiB0cnVlOwotICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tl
eV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7Ci0gICAg
ICB9LAotCi0gICAgICByZWNvZ25pemU6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAgICAgdmFyIHN0
YXRlcyA9IFsgdGhpcy5yb290U3RhdGUgXSwKLSAgICAgICAgICAgIHBhdGhMZW4sIGksIGwsIHF1
ZXJ5U3RhcnQsIHF1ZXJ5UGFyYW1zID0ge307Ci0KLSAgICAgICAgcXVlcnlTdGFydCA9IHBhdGgu
aW5kZXhPZignPycpOwotICAgICAgICBpZiAocXVlcnlTdGFydCAhPT0gLTEpIHsKLSAgICAgICAg
ICB2YXIgcXVlcnlTdHJpbmcgPSBwYXRoLnN1YnN0cihxdWVyeVN0YXJ0ICsgMSwgcGF0aC5sZW5n
dGgpOwotICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBxdWVyeVN0YXJ0KTsKLSAgICAg
ICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVN0cmluZyhxdWVyeVN0cmluZyk7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCi0KLSAgICAgICAgaWYgKHBh
dGguY2hhckF0KDApICE9PSAiLyIpIHsgcGF0aCA9ICIvIiArIHBhdGg7IH0KLQotICAgICAgICBw
YXRoTGVuID0gcGF0aC5sZW5ndGg7Ci0gICAgICAgIGlmIChwYXRoTGVuID4gMSAmJiBwYXRoLmNo
YXJBdChwYXRoTGVuIC0gMSkgPT09ICIvIikgewotICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0
cigwLCBwYXRoTGVuIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGk9MCwgbD1wYXRo
Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBzdGF0ZXMgPSByZWNvZ25pemVDaGFyKHN0
YXRlcywgcGF0aC5jaGFyQXQoaSkpOwotICAgICAgICAgIGlmICghc3RhdGVzLmxlbmd0aCkgeyBi
cmVhazsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRU5EIERFQlVHIEdST1VQCi0KLSAgICAg
ICAgdmFyIHNvbHV0aW9ucyA9IFtdOwotICAgICAgICBmb3IgKGk9MCwgbD1zdGF0ZXMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgICAgICAgIGlmIChzdGF0ZXNbaV0uaGFuZGxlcnMpIHsgc29sdXRp
b25zLnB1c2goc3RhdGVzW2ldKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGVzID0gc29y
dFNvbHV0aW9ucyhzb2x1dGlvbnMpOwotCi0gICAgICAgIHZhciBzdGF0ZSA9IHNvbHV0aW9uc1sw
XTsKLQotICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKLSAgICAgICAgICBy
ZXR1cm4gZmluZEhhbmRsZXIoc3RhdGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBUYXJnZXQocGF0aCwgbWF0Y2hlciwgZGVs
ZWdhdGUpIHsKLSAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICB0aGlzLm1hdGNoZXIgPSBt
YXRjaGVyOwotICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIFRh
cmdldC5wcm90b3R5cGUgPSB7Ci0gICAgICB0bzogZnVuY3Rpb24odGFyZ2V0LCBjYWxsYmFjaykg
ewotICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOwotCi0gICAgICAgIGlmIChk
ZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS53aWxsQWRkUm91dGUpIHsKLSAgICAgICAgICB0YXJnZXQgPSBk
ZWxlZ2F0ZS53aWxsQWRkUm91dGUodGhpcy5tYXRjaGVyLnRhcmdldCwgdGFyZ2V0KTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHRoaXMubWF0Y2hlci5hZGQodGhpcy5wYXRoLCB0YXJnZXQpOwotCi0g
ICAgICAgIGlmIChjYWxsYmFjaykgewotICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09
IDApIHsgdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZSBm
dW5jdGlvbiBwYXNzZWQgdG8gYHRvYCIpOyB9Ci0gICAgICAgICAgdGhpcy5tYXRjaGVyLmFkZENo
aWxkKHRoaXMucGF0aCwgdGFyZ2V0LCBjYWxsYmFjaywgdGhpcy5kZWxlZ2F0ZSk7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9LAotCi0gICAgICB3aXRoUXVlcnlQYXJh
bXM6IGZ1bmN0aW9uKCkgewotICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0
aHJvdyBuZXcgRXJyb3IoInlvdSBtdXN0IHByb3ZpZGUgYXJndW1lbnRzIHRvIHRoZSB3aXRoUXVl
cnlQYXJhbXMgbWV0aG9kIik7IH0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVu
dHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0g
InN0cmluZyIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigneW91IHNob3VsZCBjYWxs
IHdpdGhRdWVyeVBhcmFtcyB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzLCBlLmcuIHdpdGhRdWVyeVBh
cmFtcygiZm9vIiwgImJhciIpJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZh
ciBxdWVyeVBhcmFtcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICAgICAgdGhpcy5t
YXRjaGVyLmFkZFF1ZXJ5UGFyYW1zKHRoaXMucGF0aCwgcXVlcnlQYXJhbXMpOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBNYXRjaGVyKHRhcmdldCkgewotICAgICAgdGhpcy5yb3V0
ZXMgPSB7fTsKLSAgICAgIHRoaXMuY2hpbGRyZW4gPSB7fTsKLSAgICAgIHRoaXMucXVlcnlQYXJh
bXMgPSB7fTsKLSAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIE1hdGNo
ZXIucHJvdG90eXBlID0gewotICAgICAgYWRkOiBmdW5jdGlvbihwYXRoLCBoYW5kbGVyKSB7Ci0g
ICAgICAgIHRoaXMucm91dGVzW3BhdGhdID0gaGFuZGxlcjsKLSAgICAgIH0sCi0KLSAgICAgIGFk
ZFF1ZXJ5UGFyYW1zOiBmdW5jdGlvbihwYXRoLCBwYXJhbXMpIHsKLSAgICAgICAgdGhpcy5xdWVy
eVBhcmFtc1twYXRoXSA9IHBhcmFtczsKLSAgICAgIH0sCi0KLSAgICAgIGFkZENoaWxkOiBmdW5j
dGlvbihwYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCBkZWxlZ2F0ZSkgewotICAgICAgICB2YXIgbWF0
Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW5bcGF0aF0g
PSBtYXRjaGVyOwotCi0gICAgICAgIHZhciBtYXRjaCA9IGdlbmVyYXRlTWF0Y2gocGF0aCwgbWF0
Y2hlciwgZGVsZWdhdGUpOwotCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5jb250
ZXh0RW50ZXJlZCkgewotICAgICAgICAgIGRlbGVnYXRlLmNvbnRleHRFbnRlcmVkKHRhcmdldCwg
bWF0Y2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FsbGJhY2sobWF0Y2gpOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hl
ciwgZGVsZWdhdGUpIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoLCBuZXN0ZWRDYWxsYmFj
aykgewotICAgICAgICB2YXIgZnVsbFBhdGggPSBzdGFydGluZ1BhdGggKyBwYXRoOwotCi0gICAg
ICAgIGlmIChuZXN0ZWRDYWxsYmFjaykgewotICAgICAgICAgIG5lc3RlZENhbGxiYWNrKGdlbmVy
YXRlTWF0Y2goZnVsbFBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQoc3RhcnRpbmdQYXRoICsgcGF0aCwgbWF0Y2hl
ciwgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIGZ1bmN0aW9u
IGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIGhhbmRsZXIsIHF1ZXJ5UGFyYW1zKSB7Ci0gICAg
ICB2YXIgbGVuID0gMDsKLSAgICAgIGZvciAodmFyIGk9MCwgbD1yb3V0ZUFycmF5Lmxlbmd0aDsg
aTxsOyBpKyspIHsKLSAgICAgICAgbGVuICs9IHJvdXRlQXJyYXlbaV0ucGF0aC5sZW5ndGg7Ci0g
ICAgICB9Ci0KLSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihsZW4pOwotICAgICAgdmFyIHJvdXRl
ID0geyBwYXRoOiBwYXRoLCBoYW5kbGVyOiBoYW5kbGVyIH07Ci0gICAgICBpZihxdWVyeVBhcmFt
cykgeyByb3V0ZS5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zOyB9Ci0gICAgICByb3V0ZUFycmF5
LnB1c2gocm91dGUpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGVhY2hSb3V0ZShiYXNlUm91dGUs
IG1hdGNoZXIsIGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgICB2YXIgcm91dGVzID0gbWF0Y2hl
ci5yb3V0ZXM7Ci0gICAgICB2YXIgcXVlcnlQYXJhbXMgPSBtYXRjaGVyLnF1ZXJ5UGFyYW1zOwot
Ci0gICAgICBmb3IgKHZhciBwYXRoIGluIHJvdXRlcykgewotICAgICAgICBpZiAocm91dGVzLmhh
c093blByb3BlcnR5KHBhdGgpKSB7Ci0gICAgICAgICAgdmFyIHJvdXRlQXJyYXkgPSBiYXNlUm91
dGUuc2xpY2UoKTsKLSAgICAgICAgICBhZGRSb3V0ZShyb3V0ZUFycmF5LCBwYXRoLCByb3V0ZXNb
cGF0aF0sIHF1ZXJ5UGFyYW1zW3BhdGhdKTsKLQotICAgICAgICAgIGlmIChtYXRjaGVyLmNoaWxk
cmVuW3BhdGhdKSB7Ci0gICAgICAgICAgICBlYWNoUm91dGUocm91dGVBcnJheSwgbWF0Y2hlci5j
aGlsZHJlbltwYXRoXSwgY2FsbGJhY2ssIGJpbmRpbmcpOwotICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIHJvdXRlQXJyYXkpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIFJvdXRlUmVjb2duaXplci5wcm90
b3R5cGUubWFwID0gZnVuY3Rpb24oY2FsbGJhY2ssIGFkZFJvdXRlQ2FsbGJhY2spIHsKLSAgICAg
IHZhciBtYXRjaGVyID0gbmV3IE1hdGNoZXIoKTsKLQotICAgICAgY2FsbGJhY2soZ2VuZXJhdGVN
YXRjaCgiIiwgbWF0Y2hlciwgdGhpcy5kZWxlZ2F0ZSkpOwotCi0gICAgICBlYWNoUm91dGUoW10s
IG1hdGNoZXIsIGZ1bmN0aW9uKHJvdXRlKSB7Ci0gICAgICAgIGlmIChhZGRSb3V0ZUNhbGxiYWNr
KSB7IGFkZFJvdXRlQ2FsbGJhY2sodGhpcywgcm91dGUpOyB9Ci0gICAgICAgIGVsc2UgeyB0aGlz
LmFkZChyb3V0ZSk7IH0KLSAgICAgIH0sIHRoaXMpOwotICAgIH07Ci0gICAgcmV0dXJuIFJvdXRl
UmVjb2duaXplcjsKLSAgfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1kZWZpbmUo
InJvdXRlciIsCi0gIFsicm91dGUtcmVjb2duaXplciIsInJzdnAiLCJleHBvcnRzIl0sCi0gIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMg
ZmlsZSByZWZlcmVuY2VzIHNldmVyYWwgaW50ZXJuYWwgc3RydWN0dXJlczoKLQotICAgICAgIyMg
YFJlY29nbml6ZWRIYW5kbGVyYAotCi0gICAgICAqIGB7U3RyaW5nfSBoYW5kbGVyYDogQSBoYW5k
bGVyIG5hbWUKLSAgICAgICogYHtPYmplY3R9IHBhcmFtc2A6IEEgaGFzaCBvZiByZWNvZ25pemVk
IHBhcmFtZXRlcnMKLQotICAgICAgIyMgYEhhbmRsZXJJbmZvYAotCi0gICAgICAqIGB7Qm9vbGVh
bn0gaXNEeW5hbWljYDogd2hldGhlciBhIGhhbmRsZXIgaGFzIGFueSBkeW5hbWljIHNlZ21lbnRz
Ci0gICAgICAqIGB7U3RyaW5nfSBuYW1lYDogdGhlIG5hbWUgb2YgYSBoYW5kbGVyCi0gICAgICAq
IGB7T2JqZWN0fSBoYW5kbGVyYDogYSBoYW5kbGVyIG9iamVjdAotICAgICAgKiBge09iamVjdH0g
Y29udGV4dGA6IHRoZSBhY3RpdmUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXIKLSAgICAqLwotCi0g
ICAgdmFyIFJvdXRlUmVjb2duaXplciA9IF9fZGVwZW5kZW5jeTFfXzsKLSAgICB2YXIgUlNWUCA9
IF9fZGVwZW5kZW5jeTJfXzsKLQotICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGlj
ZTsKLQotCi0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIEEgVHJhbnNpdGlvbiBp
cyBhIHRoZW5uYWJsZSAoYSBwcm9taXNlLWxpa2Ugb2JqZWN0KSB0aGF0IHJlcHJlc2VudHMKLSAg
ICAgIGFuIGF0dGVtcHQgdG8gdHJhbnNpdGlvbiB0byBhbm90aGVyIHJvdXRlLiBJdCBjYW4gYmUg
YWJvcnRlZCwgZWl0aGVyCi0gICAgICBleHBsaWNpdGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVt
cHRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxlIGEKLSAgICAgIHByZXZpb3VzIG9uZSBpcyBz
dGlsbCB1bmRlcndheS4gQW4gYWJvcnRlZCB0cmFuc2l0aW9uIGNhbiBhbHNvCi0gICAgICBiZSBg
cmV0cnkoKWBkIGxhdGVyLgotICAgICAqLwotCi0gICAgZnVuY3Rpb24gVHJhbnNpdGlvbihyb3V0
ZXIsIHByb21pc2UpIHsKLSAgICAgIHRoaXMucm91dGVyID0gcm91dGVyOwotICAgICAgdGhpcy5w
cm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHRoaXMuZGF0YSA9IHt9OwotICAgICAgdGhpcy5yZXNv
bHZlZE1vZGVscyA9IHt9OwotICAgICAgdGhpcy5wcm92aWRlZE1vZGVscyA9IHt9OwotICAgICAg
dGhpcy5wcm92aWRlZE1vZGVsc0FycmF5ID0gW107Ci0gICAgICB0aGlzLnNlcXVlbmNlID0gKytU
cmFuc2l0aW9uLmN1cnJlbnRTZXF1ZW5jZTsKLSAgICAgIHRoaXMucGFyYW1zID0ge307Ci0gICAg
fQotCi0gICAgVHJhbnNpdGlvbi5jdXJyZW50U2VxdWVuY2UgPSAwOwotCi0gICAgVHJhbnNpdGlv
bi5wcm90b3R5cGUgPSB7Ci0gICAgICB0YXJnZXROYW1lOiBudWxsLAotICAgICAgdXJsTWV0aG9k
OiAndXBkYXRlJywKLSAgICAgIHByb3ZpZGVkTW9kZWxzOiBudWxsLAotICAgICAgcmVzb2x2ZWRN
b2RlbHM6IG51bGwsCi0gICAgICBwYXJhbXM6IG51bGwsCi0gICAgICBwaXZvdEhhbmRsZXI6IG51
bGwsCi0gICAgICByZXNvbHZlSW5kZXg6IDAsCi0gICAgICBoYW5kbGVySW5mb3M6IG51bGwsCi0K
LSAgICAgIGlzQWN0aXZlOiB0cnVlLAotCi0gICAgICAvKioKLSAgICAgICAgVGhlIFRyYW5zaXRp
b24ncyBpbnRlcm5hbCBwcm9taXNlLiBDYWxsaW5nIGAudGhlbmAgb24gdGhpcyBwcm9wZXJ0eQot
ICAgICAgICBpcyB0aGF0IHNhbWUgYXMgY2FsbGluZyBgLnRoZW5gIG9uIHRoZSBUcmFuc2l0aW9u
IG9iamVjdCBpdHNlbGYsIGJ1dAotICAgICAgICB0aGlzIHByb3BlcnR5IGlzIGV4cG9zZWQgZm9y
IHdoZW4geW91IHdhbnQgdG8gcGFzcyBhcm91bmQgYQotICAgICAgICBUcmFuc2l0aW9uJ3MgcHJv
bWlzZSwgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBvYmplY3QgaXRzZWxmLCBzaW5jZQotICAgICAg
ICBUcmFuc2l0aW9uIG9iamVjdCBjYW4gYmUgZXh0ZXJuYWxseSBgYWJvcnRgZWQsIHdoaWxlIHRo
ZSBwcm9taXNlCi0gICAgICAgIGNhbm5vdC4KLSAgICAgICAqLwotICAgICAgcHJvbWlzZTogbnVs
bCwKLQotICAgICAgLyoqCi0gICAgICAgIEN1c3RvbSBzdGF0ZSBjYW4gYmUgc3RvcmVkIG9uIGEg
VHJhbnNpdGlvbidzIGBkYXRhYCBvYmplY3QuCi0gICAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBm
b3IgZGVjb3JhdGluZyBhIFRyYW5zaXRpb24gd2l0aGluIGFuIGVhcmxpZXIKLSAgICAgICAgaG9v
ayBhbmQgc2hhcmVkIHdpdGggYSBsYXRlciBob29rLiBQcm9wZXJ0aWVzIHNldCBvbiBgZGF0YWAg
d2lsbAotICAgICAgICBiZSBjb3BpZWQgdG8gbmV3IHRyYW5zaXRpb25zIGdlbmVyYXRlZCBieSBj
YWxsaW5nIGByZXRyeWAgb24gdGhpcwotICAgICAgICB0cmFuc2l0aW9uLgotICAgICAgICovCi0g
ICAgICBkYXRhOiBudWxsLAotCi0gICAgICAvKioKLSAgICAgICAgQSBzdGFuZGFyZCBwcm9taXNl
IGhvb2sgdGhhdCByZXNvbHZlcyBpZiB0aGUgdHJhbnNpdGlvbgotICAgICAgICBzdWNjZWVkcyBh
bmQgcmVqZWN0cyBpZiBpdCBmYWlscy9yZWRpcmVjdHMvYWJvcnRzLgotCi0gICAgICAgIEZvcndh
cmRzIHRvIHRoZSBpbnRlcm5hbCBgcHJvbWlzZWAgcHJvcGVydHkgd2hpY2ggeW91IGNhbgotICAg
ICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRo
ZW5uYWJsZSwKLSAgICAgICAgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBpdHNlbGYuCi0KLSAgICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcwotICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBm
YWlsdXJlCi0gICAgICAgKi8KLSAgICAgIHRoZW46IGZ1bmN0aW9uKHN1Y2Nlc3MsIGZhaWx1cmUp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKHN1Y2Nlc3MsIGZhaWx1cmUpOwot
ICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEFib3J0cyB0aGUgVHJhbnNpdGlvbi4gTm90
ZSB5b3UgY2FuIGFsc28gaW1wbGljaXRseSBhYm9ydCBhIHRyYW5zaXRpb24KLSAgICAgICAgYnkg
aW5pdGlhdGluZyBhbm90aGVyIHRyYW5zaXRpb24gd2hpbGUgYSBwcmV2aW91cyBvbmUgaXMgdW5k
ZXJ3YXkuCi0gICAgICAgKi8KLSAgICAgIGFib3J0OiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYg
KHRoaXMuaXNBYm9ydGVkKSB7IHJldHVybiB0aGlzOyB9Ci0gICAgICAgIGxvZyh0aGlzLnJvdXRl
ciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJnZXROYW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJv
cnRlZCIpOwotICAgICAgICB0aGlzLmlzQWJvcnRlZCA9IHRydWU7Ci0gICAgICAgIHRoaXMuaXNB
Y3RpdmUgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51
bGw7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAg
IFJldHJpZXMgYSBwcmV2aW91c2x5LWFib3J0ZWQgdHJhbnNpdGlvbiAobWFraW5nIHN1cmUgdG8g
YWJvcnQgdGhlCi0gICAgICAgIHRyYW5zaXRpb24gaWYgaXQncyBzdGlsbCBhY3RpdmUpLiBSZXR1
cm5zIGEgbmV3IHRyYW5zaXRpb24gdGhhdAotICAgICAgICByZXByZXNlbnRzIHRoZSBuZXcgYXR0
ZW1wdCB0byB0cmFuc2l0aW9uLgotICAgICAgICovCi0gICAgICByZXRyeTogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIHRoaXMuYWJvcnQoKTsKLSAgICAgICAgdmFyIHJlY29nSGFuZGxlcnMgPSB0aGlz
LnJvdXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKHRoaXMudGFyZ2V0TmFtZSksCi0gICAgICAg
ICAgICBoYW5kbGVySW5mb3MgID0gZ2VuZXJhdGVIYW5kbGVySW5mb3NXaXRoUXVlcnlQYXJhbXMo
dGhpcy5yb3V0ZXIsIHJlY29nSGFuZGxlcnMsIHRoaXMucXVlcnlQYXJhbXMpLAotICAgICAgICAg
ICAgbmV3VHJhbnNpdGlvbiA9IHBlcmZvcm1UcmFuc2l0aW9uKHRoaXMucm91dGVyLCBoYW5kbGVy
SW5mb3MsIHRoaXMucHJvdmlkZWRNb2RlbHNBcnJheSwgdGhpcy5wYXJhbXMsIHRoaXMucXVlcnlQ
YXJhbXMsIHRoaXMuZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247Ci0gICAg
ICB9LAotCi0gICAgICAvKioKLSAgICAgICAgU2V0cyB0aGUgVVJMLWNoYW5naW5nIG1ldGhvZCB0
byBiZSBlbXBsb3llZCBhdCB0aGUgZW5kIG9mIGEKLSAgICAgICAgc3VjY2Vzc2Z1bCB0cmFuc2l0
aW9uLiBCeSBkZWZhdWx0LCBhIG5ldyBUcmFuc2l0aW9uIHdpbGwganVzdAotICAgICAgICB1c2Ug
YHVwZGF0ZVVSTGAsIGJ1dCBwYXNzaW5nICdyZXBsYWNlJyB0byB0aGlzIG1ldGhvZCB3aWxsCi0g
ICAgICAgIGNhdXNlIHRoZSBVUkwgdG8gdXBkYXRlIHVzaW5nICdyZXBsYWNlV2l0aCcgaW5zdGVh
ZC4gT21pdHRpbmcKLSAgICAgICAgYSBwYXJhbWV0ZXIgd2lsbCBkaXNhYmxlIHRoZSBVUkwgY2hh
bmdlLCBhbGxvd2luZyBmb3IgdHJhbnNpdGlvbnMKLSAgICAgICAgdGhhdCBkb24ndCB1cGRhdGUg
dGhlIFVSTCBhdCBjb21wbGV0aW9uICh0aGlzIGlzIGFsc28gdXNlZCBmb3IKLSAgICAgICAgaGFu
ZGxlVVJMLCBzaW5jZSB0aGUgVVJMIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmVmb3JlIHRoZQotICAg
ICAgICB0cmFuc2l0aW9uIHRvb2sgcGxhY2UpLgotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBt
ZXRob2QgdGhlIHR5cGUgb2YgVVJMLWNoYW5naW5nIG1ldGhvZCB0byB1c2UKLSAgICAgICAgICBh
dCB0aGUgZW5kIG9mIGEgdHJhbnNpdGlvbi4gQWNjZXB0ZWQgdmFsdWVzIGFyZSAncmVwbGFjZScs
Ci0gICAgICAgICAgZmFsc3kgdmFsdWVzLCBvciBhbnkgb3RoZXIgbm9uLWZhbHN5IHZhbHVlICh3
aGljaCBpcwotICAgICAgICAgIGludGVycHJldGVkIGFzIGFuIHVwZGF0ZVVSTCB0cmFuc2l0aW9u
KS4KLQotICAgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KLSAgICAg
ICAqLwotICAgICAgbWV0aG9kOiBmdW5jdGlvbihtZXRob2QpIHsKLSAgICAgICAgdGhpcy51cmxN
ZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEZpcmVzIGFuIGV2ZW50IG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb2x2
ZWQvcmVzb2x2aW5nCi0gICAgICAgIGhhbmRsZXJzIHdpdGhpbiB0aGlzIHRyYW5zaXRpb24uIFVz
ZWZ1bCBmb3IgZmlyaW5nIGV2ZW50cwotICAgICAgICBvbiByb3V0ZSBoaWVyYXJjaGllcyB0aGF0
IGhhdmVuJ3QgZnVsbHkgYmVlbiBlbnRlcmVkIHlldC4KLQotICAgICAgICBAcGFyYW0ge0Jvb2xl
YW59IGlnbm9yZUZhaWx1cmUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKLSAgICAg
ICAqLwotICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oaWdub3JlRmFpbHVyZSkgewotICAgICAgICB2
YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICAgICAgaWYgKHR5cGVvZiBpZ25v
cmVGYWlsdXJlID09PSAnYm9vbGVhbicpIHsKLSAgICAgICAgICBhcmdzLnNoaWZ0KCk7Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXJyb3JzIG9uIHVuaGFuZGxlZCB0cmln
Z2VyIGV2ZW50cyBieSBkZWZhdWx0Ci0gICAgICAgICAgaWdub3JlRmFpbHVyZSA9IGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHRyaWdnZXIodGhpcy5yb3V0ZXIsIHRoaXMuaGFuZGxlckluZm9z
LnNsaWNlKDAsIHRoaXMucmVzb2x2ZUluZGV4ICsgMSksIGlnbm9yZUZhaWx1cmUsIGFyZ3MpOwot
ICAgICAgfSwKLQotICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4g
IlRyYW5zaXRpb24gKHNlcXVlbmNlICIgKyB0aGlzLnNlcXVlbmNlICsgIikiOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBSb3V0ZXIoKSB7Ci0gICAgICB0aGlzLnJlY29nbml6ZXIg
PSBuZXcgUm91dGVSZWNvZ25pemVyKCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogc2VwYXJhdGUg
aW50byBtb2R1bGU/Ci0gICAgUm91dGVyLlRyYW5zaXRpb24gPSBUcmFuc2l0aW9uOwotCi0gICAg
X19leHBvcnRzX19bImRlZmF1bHQiXSA9IFJvdXRlcjsKLQotCi0gICAgLyoqCi0gICAgICBQcm9t
aXNlIHJlamVjdCByZWFzb25zIHBhc3NlZCB0byBwcm9taXNlIHJlamVjdGlvbgotICAgICAgaGFu
ZGxlcnMgZm9yIGZhaWxlZCB0cmFuc2l0aW9ucy4KLSAgICAgKi8KLSAgICBSb3V0ZXIuVW5yZWNv
Z25pemVkVVJMRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgICB0aGlzLm1lc3NhZ2Ug
PSAobWVzc2FnZSB8fCAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKTsKLSAgICAgIHRoaXMubmFtZSA9
ICJVbnJlY29nbml6ZWRVUkxFcnJvciI7Ci0gICAgfTsKLQotICAgIFJvdXRlci5UcmFuc2l0aW9u
QWJvcnRlZCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNz
YWdlIHx8ICJUcmFuc2l0aW9uQWJvcnRlZCIpOwotICAgICAgdGhpcy5uYW1lID0gIlRyYW5zaXRp
b25BYm9ydGVkIjsKLSAgICB9OwotCi0gICAgZnVuY3Rpb24gZXJyb3JUcmFuc2l0aW9uKHJvdXRl
ciwgcmVhc29uKSB7Ci0gICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24ocm91dGVyLCBSU1ZQLnJl
amVjdChyZWFzb24pKTsKLSAgICB9Ci0KLQotICAgIFJvdXRlci5wcm90b3R5cGUgPSB7Ci0gICAg
ICAvKioKLSAgICAgICAgVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgcm91dGVyLiBUaGUg
QVBJIGlzIGVzc2VudGlhbGx5Ci0gICAgICAgIHRoZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2Qg
aW4gYHJvdXRlLXJlY29nbml6ZXJgLgotCi0gICAgICAgIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRo
ZSBTdHJpbmcgaGFuZGxlciBhdCB0aGUgbGFzdCBgLnRvKClgCi0gICAgICAgIGNhbGwgYW5kIHVz
ZXMgaXQgYXMgdGhlIG5hbWUgb2YgdGhlIHdob2xlIHJvdXRlLgotCi0gICAgICAgIEBwYXJhbSB7
RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgICAqLwotICAgICAgbWFwOiBmdW5jdGlvbihjYWxsYmFj
aykgewotICAgICAgICB0aGlzLnJlY29nbml6ZXIuZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOwot
Ci0gICAgICAgIHRoaXMucmVjb2duaXplci5tYXAoY2FsbGJhY2ssIGZ1bmN0aW9uKHJlY29nbml6
ZXIsIHJvdXRlKSB7Ci0gICAgICAgICAgdmFyIGxhc3RIYW5kbGVyID0gcm91dGVbcm91dGUubGVu
Z3RoIC0gMV0uaGFuZGxlcjsKLSAgICAgICAgICB2YXIgYXJncyA9IFtyb3V0ZSwgeyBhczogbGFz
dEhhbmRsZXIgfV07Ci0gICAgICAgICAgcmVjb2duaXplci5hZGQuYXBwbHkocmVjb2duaXplciwg
YXJncyk7Ci0gICAgICAgIH0pOwotICAgICAgfSwKLQotICAgICAgaGFzUm91dGU6IGZ1bmN0aW9u
KHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlY29nbml6ZXIuaGFzUm91dGUocm91dGUp
OwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIENsZWFycyB0aGUgY3VycmVudCBhbmQg
dGFyZ2V0IHJvdXRlIGhhbmRsZXJzIGFuZCB0cmlnZ2VycyBleGl0Ci0gICAgICAgIG9uIGVhY2gg
b2YgdGhlbSBzdGFydGluZyBhdCB0aGUgbGVhZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoCi0g
ICAgICAgIGl0cyBhbmNlc3RvcnMuCi0gICAgICAqLwotICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkg
ewotICAgICAgICBlYWNoSGFuZGxlcih0aGlzLmN1cnJlbnRIYW5kbGVySW5mb3MgfHwgW10sIGZ1
bmN0aW9uKGhhbmRsZXJJbmZvKSB7Ci0gICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5m
by5oYW5kbGVyOwotICAgICAgICAgIGlmIChoYW5kbGVyLmV4aXQpIHsKLSAgICAgICAgICAgIGhh
bmRsZXIuZXhpdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuY3Vy
cmVudEhhbmRsZXJJbmZvcyA9IG51bGw7Ci0gICAgICAgIHRoaXMudGFyZ2V0SGFuZGxlckluZm9z
ID0gbnVsbDsKLSAgICAgIH0sCi0KLSAgICAgIGFjdGl2ZVRyYW5zaXRpb246IG51bGwsCi0KLSAg
ICAgIC8qKgotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7Ci0gICAg
ICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1
YWxseQotICAgICAgICB2aWEgdGhlIGJhY2sgYW5kIGZvcndhcmQgYnV0dG9uKS4KLQotICAgICAg
ICBSZXR1cm5zIGFuIEFycmF5IG9mIGhhbmRsZXJzIGFuZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lh
dGVkCi0gICAgICAgIHdpdGggdGhvc2UgcGFyYW1ldGVycy4KLQotICAgICAgICBAcGFyYW0ge1N0
cmluZ30gdXJsIGEgVVJMIHRvIHByb2Nlc3MKLQotICAgICAgICBAcmV0dXJuIHtBcnJheX0gYW4g
QXJyYXkgb2YgYFtoYW5kbGVyLCBwYXJhbWV0ZXJdYCB0dXBsZXMKLSAgICAgICovCi0gICAgICBo
YW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgewotICAgICAgICAvLyBQZXJmb3JtIGEgVVJMLWJhc2Vk
IHRyYW5zaXRpb24sIGJ1dCBkb24ndCBjaGFuZ2UKLSAgICAgICAgLy8gdGhlIFVSTCBhZnRlcndh
cmQsIHNpbmNlIGl0IGFscmVhZHkgaGFwcGVuZWQuCi0gICAgICAgIHZhciBhcmdzID0gc2xpY2Uu
Y2FsbChhcmd1bWVudHMpOwotICAgICAgICBpZiAodXJsLmNoYXJBdCgwKSAhPT0gJy8nKSB7IGFy
Z3NbMF0gPSAnLycgKyB1cmw7IH0KLSAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBh
cmdzKS5tZXRob2QobnVsbCk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgSG9vayBw
b2ludCBmb3IgdXBkYXRpbmcgdGhlIFVSTC4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJs
IGEgVVJMIHRvIHVwZGF0ZSB0bwotICAgICAgKi8KLSAgICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRl
ZCIpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxh
Y2luZyB0aGUgY3VycmVudCBVUkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKLQotICAgICAgICBC
eSBkZWZhdWx0IHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAotCi0gICAgICAg
IEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8gdXBkYXRlIHRvCi0gICAgICAqLwotICAgICAg
cmVwbGFjZVVSTDogZnVuY3Rpb24odXJsKSB7Ci0gICAgICAgIHRoaXMudXBkYXRlVVJMKHVybCk7
Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgVHJhbnNpdGlvbiBpbnRvIHRoZSBzcGVj
aWZpZWQgbmFtZWQgcm91dGUuCi0KLSAgICAgICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBl
eGl0IGNhbGxiYWNrIG9uIGFueSBoYW5kbGVycwotICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIg
cmVwcmVzZW50ZWQgYnkgdGhlIHRhcmdldCByb3V0ZS4KLQotICAgICAgICBAcGFyYW0ge1N0cmlu
Z30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICAgICovCi0gICAgICB0cmFuc2l0aW9u
VG86IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBh
cmd1bWVudHMpOwotICAgICAgfSwKLQotICAgICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBm
dW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMsIHRy
dWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIElkZW50aWNhbCB0byBgdHJhbnNp
dGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAotICAg
ICAgICBpZiBwb3NzaWJsZS4KLQotICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBwcmlt
YXJpbHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3RhdGVgLgotCi0gICAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQotICAgICAgKi8KLSAgICAgIHJlcGxhY2VX
aXRoOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb1RyYW5zaXRpb24odGhpcywg
YXJndW1lbnRzKS5tZXRob2QoJ3JlcGxhY2UnKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAg
ICAgICBAcHJpdmF0ZQotCi0gICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1l
IGFuZCBhIGxpc3Qgb2YgY29udGV4dHMgYW5kIHJldHVybnMKLSAgICAgICAgYSBzZXJpYWxpemVk
IHBhcmFtZXRlciBoYXNoIHN1aXRhYmxlIHRvIHBhc3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJhdGUo
KWAuCi0KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICAgIEBwYXJh
bSB7QXJyYXlbT2JqZWN0XX0gY29udGV4dHMKLSAgICAgICAgQHJldHVybiB7T2JqZWN0fSBhIHNl
cmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2gKLSAgICAgICovCi0KLSAgICAgIHBhcmFtc0ZvckhhbmRs
ZXI6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lLCBjb250ZXh0cykgewotICAgICAgICB2YXIgcGFydGl0
aW9uZWRBcmdzID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7
Ci0gICAgICAgIHJldHVybiBwYXJhbXNGb3JIYW5kbGVyKHRoaXMsIGhhbmRsZXJOYW1lLCBwYXJ0
aXRpb25lZEFyZ3NbMF0sIHBhcnRpdGlvbmVkQXJnc1sxXSk7Ci0gICAgICB9LAotCi0gICAgICAv
KioKLSAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBoYW5kbGVyIG5hbWUgYW5kIHJldHVybnMg
YSBsaXN0IG9mIHF1ZXJ5IHBhcmFtcwotICAgICAgICB0aGF0IGFyZSB2YWxpZCB0byBwYXNzIHRv
IHRoZSBoYW5kbGVyIG9yIGl0cyBwYXJlbnRzCi0KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGhh
bmRsZXJOYW1lCi0gICAgICAgIEByZXR1cm4ge0FycmF5W1N0cmluZ119IGEgbGlzdCBvZiBxdWVy
eSBwYXJhbWV0ZXJzCi0gICAgICAqLwotICAgICAgcXVlcnlQYXJhbXNGb3JIYW5kbGVyOiBmdW5j
dGlvbiAoaGFuZGxlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zRm9ySGFuZGxl
cih0aGlzLCBoYW5kbGVyTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgVGFr
ZSBhIG5hbWVkIHJvdXRlIGFuZCBjb250ZXh0IG9iamVjdHMgYW5kIGdlbmVyYXRlIGEKLSAgICAg
ICAgVVJMLgotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBy
b3V0ZSB0byBnZW5lcmF0ZQotICAgICAgICAgIGEgVVJMIGZvcgotICAgICAgICBAcGFyYW0gey4u
Lk9iamVjdH0gb2JqZWN0cyBhIGxpc3Qgb2Ygb2JqZWN0cyB0byBzZXJpYWxpemUKLQotICAgICAg
ICBAcmV0dXJuIHtTdHJpbmd9IGEgVVJMCi0gICAgICAqLwotICAgICAgZ2VuZXJhdGU6IGZ1bmN0
aW9uKGhhbmRsZXJOYW1lKSB7Ci0gICAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3MgPSBleHRyYWN0
UXVlcnlQYXJhbXMoc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSwKLSAgICAgICAgICBzdXBwbGll
ZFBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1swXSwKLSAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBh
cnRpdGlvbmVkQXJnc1sxXTsKLQotICAgICAgICB2YXIgcGFyYW1zID0gcGFyYW1zRm9ySGFuZGxl
cih0aGlzLCBoYW5kbGVyTmFtZSwgc3VwcGxpZWRQYXJhbXMsIHF1ZXJ5UGFyYW1zKSwKLSAgICAg
ICAgICB2YWxpZFF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXNGb3JIYW5kbGVyKHRoaXMsIGhhbmRs
ZXJOYW1lKTsKLQotICAgICAgICB2YXIgbWlzc2luZ1BhcmFtcyA9IFtdOwotCi0gICAgICAgIGZv
ciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgewotICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5o
YXNPd25Qcm9wZXJ0eShrZXkpICYmICF+dmFsaWRRdWVyeVBhcmFtcy5pbmRleE9mKGtleSkpIHsK
LSAgICAgICAgICAgIG1pc3NpbmdQYXJhbXMucHVzaChrZXkpOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChtaXNzaW5nUGFyYW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAg
ICB2YXIgZXJyID0gJ1lvdSBzdXBwbGllZCB0aGUgcGFyYW1zICc7Ci0gICAgICAgICAgZXJyICs9
IG1pc3NpbmdQYXJhbXMubWFwKGZ1bmN0aW9uKHBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4g
JyInICsgcGFyYW0gKyAiPSIgKyBxdWVyeVBhcmFtc1twYXJhbV0gKyAnIic7Ci0gICAgICAgICAg
fSkuam9pbignIGFuZCAnKTsKLQotICAgICAgICAgIGVyciArPSAnIHdoaWNoIGFyZSBub3QgdmFs
aWQgZm9yIHRoZSAiJyArIGhhbmRsZXJOYW1lICsgJyIgaGFuZGxlciBvciBpdHMgcGFyZW50cyc7
Ci0KLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAg
IHJldHVybiB0aGlzLnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxlck5hbWUsIHBhcmFtcyk7Ci0g
ICAgICB9LAotCi0gICAgICBpc0FjdGl2ZTogZnVuY3Rpb24oaGFuZGxlck5hbWUpIHsKLSAgICAg
ICAgdmFyIHBhcnRpdGlvbmVkQXJncyAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKSksCi0gICAgICAgICAgICBjb250ZXh0cyAgICAgICAgICA9IHBhcnRpdGlv
bmVkQXJnc1swXSwKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1zICAgICAgID0gcGFydGl0aW9uZWRB
cmdzWzFdLAotICAgICAgICAgICAgYWN0aXZlUXVlcnlQYXJhbXMgID0ge30sCi0gICAgICAgICAg
ICBlZmZlY3RpdmVRdWVyeVBhcmFtcyA9IHt9OwotCi0gICAgICAgIHZhciB0YXJnZXRIYW5kbGVy
SW5mb3MgPSB0aGlzLnRhcmdldEhhbmRsZXJJbmZvcywKLSAgICAgICAgICAgIGZvdW5kID0gZmFs
c2UsIG5hbWVzLCBvYmplY3QsIGhhbmRsZXJJbmZvLCBoYW5kbGVyT2JqOwotCi0gICAgICAgIGlm
ICghdGFyZ2V0SGFuZGxlckluZm9zKSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIHZhciBy
ZWNvZ0hhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKHRhcmdldEhhbmRsZXJJ
bmZvc1t0YXJnZXRIYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSk7Ci0gICAgICAgIGZvciAo
dmFyIGk9dGFyZ2V0SGFuZGxlckluZm9zLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAg
ICBoYW5kbGVySW5mbyA9IHRhcmdldEhhbmRsZXJJbmZvc1tpXTsKLSAgICAgICAgICBpZiAoaGFu
ZGxlckluZm8ubmFtZSA9PT0gaGFuZGxlck5hbWUpIHsgZm91bmQgPSB0cnVlOyB9Ci0KLSAgICAg
ICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIHZhciByZWNvZ0hhbmRsZXIgPSByZWNvZ0hh
bmRsZXJzW2ldOwotCi0gICAgICAgICAgICBtZXJnZShhY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxl
ckluZm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zICE9PSBmYWxz
ZSkgewotICAgICAgICAgICAgICBtZXJnZShlZmZlY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlcklu
Zm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAgICAgICBtZXJnZVNvbWVLZXlzKGVmZmVjdGl2ZVF1
ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcywgcmVjb2dIYW5kbGVyLnF1ZXJ5UGFyYW1zKTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvLmlzRHluYW1pYyAmJiBjb250
ZXh0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgIG9iamVjdCA9IGNvbnRleHRzLnBvcCgp
OwotCi0gICAgICAgICAgICAgIGlmIChpc1BhcmFtKG9iamVjdCkpIHsKLSAgICAgICAgICAgICAg
ICB2YXIgbmFtZSA9IHJlY29nSGFuZGxlci5uYW1lc1swXTsKLSAgICAgICAgICAgICAgICBpZiAo
IXRoaXMuY3VycmVudFBhcmFtcyB8fCAiIiArIG9iamVjdCAhPT0gdGhpcy5jdXJyZW50UGFyYW1z
W25hbWVdKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRs
ZXJJbmZvLmNvbnRleHQgIT09IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0KLSAgICAgICAgcmV0dXJuIGNvbnRleHRzLmxlbmd0aCA9PT0gMCAmJiBmb3VuZCAmJiBx
dWVyeVBhcmFtc0VxdWFsKGFjdGl2ZVF1ZXJ5UGFyYW1zLCBlZmZlY3RpdmVRdWVyeVBhcmFtcyk7
Ci0gICAgICB9LAotCi0gICAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZh
ciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICB0cmlnZ2VyKHRoaXMsIHRo
aXMuY3VycmVudEhhbmRsZXJJbmZvcywgZmFsc2UsIGFyZ3MpOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEhvb2sgcG9pbnQgZm9yIGxvZ2dpbmcgdHJhbnNpdGlvbiBzdGF0dXMgdXBk
YXRlcy4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBs
b2cuCi0gICAgICAqLwotICAgICAgbG9nOiBudWxsCi0gICAgfTsKLQotICAgIC8qKgotICAgICAg
QHByaXZhdGUKLQotICAgICAgVXNlZCBpbnRlcm5hbGx5IGZvciBib3RoIFVSTCBhbmQgbmFtZWQg
dHJhbnNpdGlvbiB0byBkZXRlcm1pbmUKLSAgICAgIGEgc2hhcmVkIHBpdm90IHBhcmVudCByb3V0
ZSBhbmQgb3RoZXIgZGF0YSBuZWNlc3NhcnkgdG8gcGVyZm9ybQotICAgICAgYSB0cmFuc2l0aW9u
LgotICAgICAqLwotICAgIGZ1bmN0aW9uIGdldE1hdGNoUG9pbnQocm91dGVyLCBoYW5kbGVycywg
b2JqZWN0cywgaW5wdXRQYXJhbXMsIHF1ZXJ5UGFyYW1zKSB7Ci0KLSAgICAgIHZhciBtYXRjaFBv
aW50ID0gaGFuZGxlcnMubGVuZ3RoLAotICAgICAgICAgIHByb3ZpZGVkTW9kZWxzID0ge30sIGks
Ci0gICAgICAgICAgY3VycmVudEhhbmRsZXJJbmZvcyA9IHJvdXRlci5jdXJyZW50SGFuZGxlcklu
Zm9zIHx8IFtdLAotICAgICAgICAgIHBhcmFtcyA9IHt9LAotICAgICAgICAgIG9sZFBhcmFtcyA9
IHJvdXRlci5jdXJyZW50UGFyYW1zIHx8IHt9LAotICAgICAgICAgIGFjdGl2ZVRyYW5zaXRpb24g
PSByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiwKLSAgICAgICAgICBoYW5kbGVyUGFyYW1zID0ge30s
Ci0gICAgICAgICAgb2JqOwotCi0gICAgICBvYmplY3RzID0gc2xpY2UuY2FsbChvYmplY3RzKTsK
LSAgICAgIG1lcmdlKHBhcmFtcywgaW5wdXRQYXJhbXMpOwotCi0gICAgICBmb3IgKGkgPSBoYW5k
bGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICB2YXIgaGFuZGxlck9iaiA9
IGhhbmRsZXJzW2ldLAotICAgICAgICAgICAgaGFuZGxlck5hbWUgPSBoYW5kbGVyT2JqLmhhbmRs
ZXIsCi0gICAgICAgICAgICBvbGRIYW5kbGVySW5mbyA9IGN1cnJlbnRIYW5kbGVySW5mb3NbaV0s
Ci0gICAgICAgICAgICBoYXNDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYg
aGFuZGxlciBuYW1lcyBoYXZlIGNoYW5nZWQuCi0gICAgICAgIGlmICghb2xkSGFuZGxlckluZm8g
fHwgb2xkSGFuZGxlckluZm8ubmFtZSAhPT0gaGFuZGxlck9iai5oYW5kbGVyKSB7IGhhc0NoYW5n
ZWQgPSB0cnVlOyB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJPYmouaXNEeW5hbWljKSB7Ci0gICAg
ICAgICAgLy8gVVJMIHRyYW5zaXRpb24uCi0KLSAgICAgICAgICBpZiAob2JqID0gZ2V0TWF0Y2hQ
b2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwgdHJ1ZSwg
cGFyYW1zKSkgewotICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBw
cm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0gPSBvYmo7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5hbWVdID0ge307Ci0gICAgICAgICAgICBm
b3IgKHZhciBwcm9wIGluIGhhbmRsZXJPYmoucGFyYW1zKSB7Ci0gICAgICAgICAgICAgIGlmICgh
aGFuZGxlck9iai5wYXJhbXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAg
ICAgICAgICAgICAgdmFyIG5ld1BhcmFtID0gaGFuZGxlck9iai5wYXJhbXNbcHJvcF07Ci0gICAg
ICAgICAgICAgIGlmIChvbGRQYXJhbXNbcHJvcF0gIT09IG5ld1BhcmFtKSB7IGhhc0NoYW5nZWQg
PSB0cnVlOyB9Ci0gICAgICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5hbWVdW3Byb3Bd
ID0gcGFyYW1zW3Byb3BdID0gbmV3UGFyYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJPYmouaGFzT3duUHJvcGVydHkoJ25hbWVzJykpIHsK
LSAgICAgICAgICAvLyBOYW1lZCB0cmFuc2l0aW9uLgotCi0gICAgICAgICAgaWYgKG9iamVjdHMu
bGVuZ3RoKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9Ci0KLSAgICAgICAgICBpZiAob2JqID0gZ2V0
TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwg
aGFuZGxlck9iai5uYW1lc1swXSwgcGFyYW1zKSkgewotICAgICAgICAgICAgcHJvdmlkZWRNb2Rl
bHNbaGFuZGxlck5hbWVdID0gb2JqOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2
YXIgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOwotICAgICAgICAgICAgaGFuZGxlclBhcmFtc1to
YW5kbGVyTmFtZV0gPSB7fTsKLSAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSBuYW1l
cy5sZW5ndGg7IGogPCBsZW47ICsraikgewotICAgICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVz
W2pdOwotICAgICAgICAgICAgICBoYW5kbGVyUGFyYW1zW2hhbmRsZXJOYW1lXVtuYW1lXSA9IHBh
cmFtc1tuYW1lXSA9IHBhcmFtc1tuYW1lXSB8fCBvbGRQYXJhbXNbbmFtZV07Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4g
b2xkIGhhbmRsZXIsIHNlZSBpZiBxdWVyeSBwYXJhbXMgYXJlIHRoZSBzYW1lLiBJZiB0aGVyZSBp
c24ndCBhbiBvbGQgaGFuZGxlciwKLSAgICAgICAgLy8gaGFzQ2hhbmdlZCB3aWxsIGFscmVhZHkg
YmUgdHJ1ZSBoZXJlCi0gICAgICAgIGlmKG9sZEhhbmRsZXJJbmZvICYmICFxdWVyeVBhcmFtc0Vx
dWFsKG9sZEhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKSkg
ewotICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoaGFzQ2hhbmdlZCkgeyBtYXRjaFBvaW50ID0gaTsgfQotICAgICAgfQotCi0gICAgICBpZiAo
b2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiTW9yZSBjb250
ZXh0IG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiB0aGVyZSBhcmUgZHluYW1pYyBzZWdtZW50cyBm
b3IgdGhlIHJvdXRlOiAiICsgaGFuZGxlcnNbaGFuZGxlcnMubGVuZ3RoIC0gMV0uaGFuZGxlcik7
Ci0gICAgICB9Ci0KLSAgICAgIHZhciBwaXZvdEhhbmRsZXJJbmZvID0gY3VycmVudEhhbmRsZXJJ
bmZvc1ttYXRjaFBvaW50IC0gMV0sCi0gICAgICAgICAgcGl2b3RIYW5kbGVyID0gcGl2b3RIYW5k
bGVySW5mbyAmJiBwaXZvdEhhbmRsZXJJbmZvLmhhbmRsZXI7Ci0KLSAgICAgIHJldHVybiB7IG1h
dGNoUG9pbnQ6IG1hdGNoUG9pbnQsIHByb3ZpZGVkTW9kZWxzOiBwcm92aWRlZE1vZGVscywgcGFy
YW1zOiBwYXJhbXMsIGhhbmRsZXJQYXJhbXM6IGhhbmRsZXJQYXJhbXMsIHBpdm90SGFuZGxlcjog
cGl2b3RIYW5kbGVyIH07Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZ2V0TWF0Y2hQb2ludE9iamVj
dChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwgcGFyYW1OYW1lLCBwYXJh
bXMpIHsKLQotICAgICAgaWYgKG9iamVjdHMubGVuZ3RoICYmIHBhcmFtTmFtZSkgewotCi0gICAg
ICAgIHZhciBvYmplY3QgPSBvYmplY3RzLnBvcCgpOwotCi0gICAgICAgIC8vIElmIHByb3ZpZGVk
IG9iamVjdCBpcyBzdHJpbmcgb3IgbnVtYmVyLCB0cmVhdCBhcyBwYXJhbS4KLSAgICAgICAgaWYg
KGlzUGFyYW0ob2JqZWN0KSkgewotICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gb2JqZWN0
LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIG9iamVjdDsK
LSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChhY3RpdmVUcmFuc2l0aW9uKSB7Ci0gICAgICAg
IC8vIFVzZSBtb2RlbCBmcm9tIHByZXZpb3VzIHRyYW5zaXRpb24gYXR0ZW1wdCwgcHJlZmVyYWJs
eSB0aGUgcmVzb2x2ZWQgb25lLgotICAgICAgICByZXR1cm4gYWN0aXZlVHJhbnNpdGlvbi5yZXNv
bHZlZE1vZGVsc1toYW5kbGVyTmFtZV0gfHwKLSAgICAgICAgICAgICAgIChwYXJhbU5hbWUgJiYg
YWN0aXZlVHJhbnNpdGlvbi5wcm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0pOwotICAgICAgfQot
ICAgIH0KLQotICAgIGZ1bmN0aW9uIGlzUGFyYW0ob2JqZWN0KSB7Ci0gICAgICByZXR1cm4gKHR5
cGVvZiBvYmplY3QgPT09ICJzdHJpbmciIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0
eXBlb2Ygb2JqZWN0ID09PSAibnVtYmVyIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBOdW1iZXIpOwot
ICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMgbWV0aG9k
IHRha2VzIGEgaGFuZGxlciBuYW1lIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBxdWVyeSBwYXJhbXMK
LSAgICAgIHRoYXQgYXJlIHZhbGlkIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIgb3IgaXRzIHBhcmVu
dHMKLQotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAgQHBhcmFtIHtTdHJpbmd9
IGhhbmRsZXJOYW1lCi0gICAgICBAcmV0dXJuIHtBcnJheVtTdHJpbmddfSBhIGxpc3Qgb2YgcXVl
cnkgcGFyYW1ldGVycwotICAgICovCi0gICAgZnVuY3Rpb24gcXVlcnlQYXJhbXNGb3JIYW5kbGVy
KHJvdXRlciwgaGFuZGxlck5hbWUpIHsKLSAgICAgIHZhciBoYW5kbGVycyA9IHJvdXRlci5yZWNv
Z25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKLSAgICAgICAgcXVlcnlQYXJhbXMgPSBb
XTsKLQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewot
ICAgICAgICBxdWVyeVBhcmFtcy5wdXNoLmFwcGx5KHF1ZXJ5UGFyYW1zLCBoYW5kbGVyc1tpXS5x
dWVyeVBhcmFtcyB8fCBbXSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBxdWVyeVBhcmFtczsK
LSAgICB9Ci0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBUaGlzIG1ldGhvZCB0YWtl
cyBhIGhhbmRsZXIgbmFtZSBhbmQgYSBsaXN0IG9mIGNvbnRleHRzIGFuZCByZXR1cm5zCi0gICAg
ICBhIHNlcmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2ggc3VpdGFibGUgdG8gcGFzcyB0byBgcmVjb2du
aXplci5nZW5lcmF0ZSgpYC4KLQotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAg
QHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19
IG9iamVjdHMKLSAgICAgIEByZXR1cm4ge09iamVjdH0gYSBzZXJpYWxpemVkIHBhcmFtZXRlciBo
YXNoCi0gICAgKi8KLSAgICBmdW5jdGlvbiBwYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxl
ck5hbWUsIG9iamVjdHMsIHF1ZXJ5UGFyYW1zKSB7Ci0KLSAgICAgIHZhciBoYW5kbGVycyA9IHJv
dXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKLSAgICAgICAgICBwYXJh
bXMgPSB7fSwKLSAgICAgICAgICBoYW5kbGVySW5mb3MgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dp
dGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBhcmFtcyksCi0gICAgICAgICAg
bWF0Y2hQb2ludCA9IGdldE1hdGNoUG9pbnQocm91dGVyLCBoYW5kbGVySW5mb3MsIG9iamVjdHMp
Lm1hdGNoUG9pbnQsCi0gICAgICAgICAgbWVyZ2VkUXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAg
ICBvYmplY3QsIGhhbmRsZXJPYmosIGhhbmRsZXIsIG5hbWVzLCBpOwotCi0gICAgICBwYXJhbXMu
cXVlcnlQYXJhbXMgPSB7fTsKLQotICAgICAgZm9yIChpPTA7IGk8aGFuZGxlcnMubGVuZ3RoOyBp
KyspIHsKLSAgICAgICAgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldOwotICAgICAgICBoYW5kbGVy
ID0gcm91dGVyLmdldEhhbmRsZXIoaGFuZGxlck9iai5oYW5kbGVyKTsKLSAgICAgICAgbmFtZXMg
PSBoYW5kbGVyT2JqLm5hbWVzOwotCi0gICAgICAgIC8vIElmIGl0J3MgYSBkeW5hbWljIHNlZ21l
bnQKLSAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCkgewotICAgICAgICAgIC8vIElmIHdlIGhhdmUg
b2JqZWN0cywgdXNlIHRoZW0KLSAgICAgICAgICBpZiAoaSA+PSBtYXRjaFBvaW50KSB7Ci0gICAg
ICAgICAgICBvYmplY3QgPSBvYmplY3RzLnNoaWZ0KCk7Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNl
IHVzZSBleGlzdGluZyBjb250ZXh0Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9i
amVjdCA9IGhhbmRsZXIuY29udGV4dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBTZXJp
YWxpemUgdG8gZ2VuZXJhdGUgcGFyYW1zCi0gICAgICAgICAgbWVyZ2UocGFyYW1zLCBzZXJpYWxp
emUoaGFuZGxlciwgb2JqZWN0LCBuYW1lcykpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChxdWVy
eVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKHBhcmFtcy5xdWVy
eVBhcmFtcywgcm91dGVyLmN1cnJlbnRRdWVyeVBhcmFtcywgaGFuZGxlck9iai5xdWVyeVBhcmFt
cyk7Ci0gICAgICAgICAgbWVyZ2VTb21lS2V5cyhwYXJhbXMucXVlcnlQYXJhbXMsIHF1ZXJ5UGFy
YW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAg
ICBpZiAocXVlcnlQYXJhbXNFcXVhbChwYXJhbXMucXVlcnlQYXJhbXMsIHt9KSkgeyBkZWxldGUg
cGFyYW1zLnF1ZXJ5UGFyYW1zOyB9Ci0gICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAg
IGZ1bmN0aW9uIG1lcmdlKGhhc2gsIG90aGVyKSB7Ci0gICAgICBmb3IgKHZhciBwcm9wIGluIG90
aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBoYXNoW3By
b3BdID0gb3RoZXJbcHJvcF07IH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBtZXJn
ZVNvbWVLZXlzKGhhc2gsIG90aGVyLCBrZXlzKSB7Ci0gICAgICBpZiAoIW90aGVyIHx8ICFrZXlz
KSB7IHJldHVybjsgfQotICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysp
IHsKLSAgICAgICAgdmFyIGtleSA9IGtleXNbaV0sIHZhbHVlOwotICAgICAgICBpZihvdGhlci5o
YXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAgICAgdmFsdWUgPSBvdGhlcltrZXldOwotICAg
ICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB0eXBlb2YgdmFs
dWUgPT09ICJ1bmRlZmluZWQiKSB7Ci0gICAgICAgICAgICBkZWxldGUgaGFzaFtrZXldOwotICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYXNoW2tleV0gPSBvdGhlcltrZXldOwotICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLSAgICAqLwotCi0gICAgZnVuY3Rpb24gZ2VuZXJhdGVIYW5kbGVySW5mb3NXaXRoUXVl
cnlQYXJhbXMocm91dGVyLCBoYW5kbGVycywgcXVlcnlQYXJhbXMpIHsKLSAgICAgIHZhciBoYW5k
bGVySW5mb3MgPSBbXTsKLQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5n
dGg7IGkrKykgewotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLAotICAgICAgICAg
IGhhbmRsZXJJbmZvID0geyBoYW5kbGVyOiBoYW5kbGVyLmhhbmRsZXIsIG5hbWVzOiBoYW5kbGVy
Lm5hbWVzLCBjb250ZXh0OiBoYW5kbGVyLmNvbnRleHQsIGlzRHluYW1pYzogaGFuZGxlci5pc0R5
bmFtaWMgfSwKLSAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtcyA9IHt9OwotCi0gICAgICAgIGlm
IChxdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKGFjdGl2
ZVF1ZXJ5UGFyYW1zLCByb3V0ZXIuY3VycmVudFF1ZXJ5UGFyYW1zLCBoYW5kbGVyLnF1ZXJ5UGFy
YW1zKTsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKGFjdGl2ZVF1ZXJ5UGFyYW1zLCBxdWVyeVBh
cmFtcywgaGFuZGxlci5xdWVyeVBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFu
ZGxlci5xdWVyeVBhcmFtcyAmJiBoYW5kbGVyLnF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHsKLSAg
ICAgICAgICBoYW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaGFuZGxlckluZm9zLnB1c2goaGFuZGxlckluZm8pOwotICAgICAg
fQotCi0gICAgICByZXR1cm4gaGFuZGxlckluZm9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAg
QHByaXZhdGUKLSAgICAqLwotICAgIGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5UGFyYW1UcmFuc2l0aW9u
KHJvdXRlciwgcXVlcnlQYXJhbXMsIGlzSW50ZXJtZWRpYXRlKSB7Ci0gICAgICB2YXIgY3VycmVu
dEhhbmRsZXJzID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsCi0gICAgICAgICAgY3VycmVu
dEhhbmRsZXIgPSBjdXJyZW50SGFuZGxlcnNbY3VycmVudEhhbmRsZXJzLmxlbmd0aCAtIDFdLAot
ICAgICAgICAgIG5hbWUgPSBjdXJyZW50SGFuZGxlci5uYW1lOwotCi0gICAgICBsb2cocm91dGVy
LCAiQXR0ZW1wdGluZyBxdWVyeSBwYXJhbSB0cmFuc2l0aW9uIik7Ci0KLSAgICAgIHJldHVybiBj
cmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBbbmFtZSwgcXVlcnlQYXJhbXNdLCBpc0ludGVy
bWVkaWF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotICAgICovCi0gICAg
ZnVuY3Rpb24gY3JlYXRlTmFtZWRUcmFuc2l0aW9uKHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlh
dGUpIHsKLSAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3MgICAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1z
KGFyZ3MpLAotICAgICAgICBwdXJlQXJncyAgICAgICAgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3Nb
MF0sCi0gICAgICAgIHF1ZXJ5UGFyYW1zICAgICAgICAgICA9IHBhcnRpdGlvbmVkQXJnc1sxXSwK
LSAgICAgICAgaGFuZGxlcnMgICAgICAgICAgICAgID0gcm91dGVyLnJlY29nbml6ZXIuaGFuZGxl
cnNGb3IocHVyZUFyZ3NbMF0pLAotICAgICAgICBoYW5kbGVySW5mb3MgICAgICAgICAgPSBnZW5l
cmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBh
cmFtcyk7Ci0KLQotICAgICAgbG9nKHJvdXRlciwgIkF0dGVtcHRpbmcgdHJhbnNpdGlvbiB0byAi
ICsgcHVyZUFyZ3NbMF0pOwotCi0gICAgICByZXR1cm4gcGVyZm9ybVRyYW5zaXRpb24ocm91dGVy
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJJbmZvcywKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzbGljZS5jYWxsKHB1cmVBcmdzLCAxKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXIuY3VycmVudFBhcmFtcywKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJtZWRp
YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0gICAgKi8KLSAgICBmdW5j
dGlvbiBjcmVhdGVVUkxUcmFuc2l0aW9uKHJvdXRlciwgdXJsLCBpc0ludGVybWVkaWF0ZSkgewot
ICAgICAgdmFyIHJlc3VsdHMgPSByb3V0ZXIucmVjb2duaXplci5yZWNvZ25pemUodXJsKSwKLSAg
ICAgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3Ms
Ci0gICAgICAgICAgcXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAgICBpLCBsZW47Ci0KLSAgICAg
IGxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0cmFuc2l0aW9uIHRvICIgKyB1cmwpOwotCi0g
ICAgICBpZiAocmVzdWx0cykgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyByb3V0ZSBpcyBh
Y3R1YWxseSBhY2Nlc3NpYmxlIGJ5IFVSTC4KLSAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVz
dWx0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewotCi0gICAgICAgICAgaWYgKHJvdXRlci5nZXRI
YW5kbGVyKHJlc3VsdHNbaV0uaGFuZGxlcikuaW5hY2Nlc3NpYmxlQnlVUkwpIHsKLSAgICAgICAg
ICAgIHJlc3VsdHMgPSBudWxsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcmVzdWx0cykgewotICAgICAgICByZXR1cm4g
ZXJyb3JUcmFuc2l0aW9uKHJvdXRlciwgbmV3IFJvdXRlci5VbnJlY29nbml6ZWRVUkxFcnJvcih1
cmwpKTsKLSAgICAgIH0KLQotICAgICAgZm9yKGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsg
aSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIG1lcmdlKHF1ZXJ5UGFyYW1zLCByZXN1bHRzW2ldLnF1
ZXJ5UGFyYW1zKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBlcmZvcm1UcmFuc2l0aW9uKHJv
dXRlciwgcmVzdWx0cywgW10sIHt9LCBxdWVyeVBhcmFtcywgbnVsbCwgaXNJbnRlcm1lZGlhdGUp
OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBUYWtlcyBhbiBB
cnJheSBvZiBgSGFuZGxlckluZm9gcywgZmlndXJlcyBvdXQgd2hpY2ggb25lcyBhcmUKLSAgICAg
IGV4aXRpbmcsIGVudGVyaW5nLCBvciBjaGFuZ2luZyBjb250ZXh0cywgYW5kIGNhbGxzIHRoZQot
ICAgICAgcHJvcGVyIGhhbmRsZXIgaG9va3MuCi0KLSAgICAgIEZvciBleGFtcGxlLCBjb25zaWRl
ciB0aGUgZm9sbG93aW5nIHRyZWUgb2YgaGFuZGxlcnMuIEVhY2ggaGFuZGxlciBpcwotICAgICAg
Zm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0IGhhbmRsZXMuCi0KLSAgICAgIGBgYAotICAg
ICAgfH5pbmRleCAoIi8iKQotICAgICAgfCB8fnBvc3RzICgiL3Bvc3RzIikKLSAgICAgIHwgfCB8
LXNob3dQb3N0ICgiLzppZCIpCi0gICAgICB8IHwgfC1uZXdQb3N0ICgiL25ldyIpCi0gICAgICB8
IHwgfC1lZGl0UG9zdCAoIi9lZGl0IikKLSAgICAgIHwgfH5hYm91dCAoIi9hYm91dC86aWQiKQot
ICAgICAgYGBgCi0KLSAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6Ci0K
LSAgICAgIDEuIEEgVVJMIHRyYW5zaXRpb24gdG8gYC9wb3N0cy8xYC4KLSAgICAgICAgIDEuIFRy
aWdnZXJzIHRoZSBgKm1vZGVsYCBjYWxsYmFja3Mgb24gdGhlCi0gICAgICAgICAgICBgaW5kZXhg
LCBgcG9zdHNgLCBhbmQgYHNob3dQb3N0YCBoYW5kbGVycwotICAgICAgICAgMi4gVHJpZ2dlcnMg
dGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gdGhlIHNhbWUKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRo
ZSBgc2V0dXBgIGNhbGxiYWNrIG9uIHRoZSBzYW1lCi0gICAgICAyLiBBIGRpcmVjdCB0cmFuc2l0
aW9uIHRvIGBuZXdQb3N0YAotICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBleGl0YCBjYWxsYmFj
ayBvbiBgc2hvd1Bvc3RgCi0gICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFj
ayBvbiBgbmV3UG9zdGAKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNr
IG9uIGBuZXdQb3N0YAotICAgICAgMy4gQSBkaXJlY3QgdHJhbnNpdGlvbiB0byBgYWJvdXRgIHdp
dGggYSBzcGVjaWZpZWQKLSAgICAgICAgIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAxLiBUcmln
Z2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAotICAgICAgICAgICAgYW5kIGBw
b3N0c2AKLSAgICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgc2VyaWFsaXplYCBjYWxsYmFjayBvbiBg
YWJvdXRgCi0gICAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgYWJv
dXRgCi0gICAgICAgICA0LiBUcmlnZ2VycyB0aGUgYHNldHVwYCBjYWxsYmFjayBvbiBgYWJvdXRg
Ci0KLSAgICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgotICAgICAgQHBhcmFtIHtB
cnJheVtIYW5kbGVySW5mb119IGhhbmRsZXJJbmZvcwotICAgICovCi0gICAgZnVuY3Rpb24gc2V0
dXBDb250ZXh0cyh0cmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpIHsKLSAgICAgIHZhciByb3V0ZXIg
PSB0cmFuc2l0aW9uLnJvdXRlciwKLSAgICAgICAgICBwYXJ0aXRpb24gPSBwYXJ0aXRpb25IYW5k
bGVycyhyb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyB8fCBbXSwgaGFuZGxlckluZm9zKTsKLQot
ICAgICAgcm91dGVyLnRhcmdldEhhbmRsZXJJbmZvcyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAg
ZWFjaEhhbmRsZXIocGFydGl0aW9uLmV4aXRlZCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAg
ICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotICAgICAgICBkZWxldGUg
aGFuZGxlci5jb250ZXh0OwotICAgICAgICBpZiAoaGFuZGxlci5leGl0KSB7IGhhbmRsZXIuZXhp
dCgpOyB9Ci0gICAgICB9KTsKLQotICAgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5mb3MgPSBwYXJ0
aXRpb24udW5jaGFuZ2VkLnNsaWNlKCk7Ci0gICAgICByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZv
cyA9IGN1cnJlbnRIYW5kbGVySW5mb3M7Ci0KLSAgICAgIGVhY2hIYW5kbGVyKHBhcnRpdGlvbi51
cGRhdGVkQ29udGV4dCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAgICAgICAgaGFuZGxlckVu
dGVyZWRPclVwZGF0ZWQodHJhbnNpdGlvbiwgY3VycmVudEhhbmRsZXJJbmZvcywgaGFuZGxlcklu
Zm8sIGZhbHNlKTsKLSAgICAgIH0pOwotCi0gICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZW50
ZXJlZCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAgICAgICAgaGFuZGxlckVudGVyZWRPclVw
ZGF0ZWQodHJhbnNpdGlvbiwgY3VycmVudEhhbmRsZXJJbmZvcywgaGFuZGxlckluZm8sIHRydWUp
OwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBI
ZWxwZXIgbWV0aG9kIHVzZWQgYnkgc2V0dXBDb250ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVk
aXJlY3RzCi0gICAgICB0aGF0IG1heSBoYXBwZW4gaW4gZW50ZXIvc2V0dXAuCi0gICAgKi8KLSAg
ICBmdW5jdGlvbiBoYW5kbGVyRW50ZXJlZE9yVXBkYXRlZCh0cmFuc2l0aW9uLCBjdXJyZW50SGFu
ZGxlckluZm9zLCBoYW5kbGVySW5mbywgZW50ZXIpIHsKLSAgICAgIHZhciBoYW5kbGVyID0gaGFu
ZGxlckluZm8uaGFuZGxlciwKLSAgICAgICAgICBjb250ZXh0ID0gaGFuZGxlckluZm8uY29udGV4
dDsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKGVudGVyICYmIGhhbmRsZXIuZW50ZXIpIHsg
aGFuZGxlci5lbnRlcigpOyB9Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0KLSAg
ICAgICAgc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KTsKLSAgICAgICAgc2V0UXVlcnlQYXJh
bXMoaGFuZGxlciwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOwotCi0gICAgICAgIGlmIChoYW5k
bGVyLnNldHVwKSB7IGhhbmRsZXIuc2V0dXAoY29udGV4dCwgaGFuZGxlckluZm8ucXVlcnlQYXJh
bXMpOyB9Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0gICAgICB9IGNhdGNoKGUp
IHsKLSAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFJvdXRlci5UcmFuc2l0aW9uQWJvcnRlZCkp
IHsKLSAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBgZXJyb3JgIGV2ZW50IHN0YXJ0aW5nIGZyb20g
dGhpcyBmYWlsZWQgaGFuZGxlci4KLSAgICAgICAgICB0cmFuc2l0aW9uLnRyaWdnZXIodHJ1ZSwg
J2Vycm9yJywgZSwgdHJhbnNpdGlvbiwgaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBQcm9wYWdhdGUgdGhlIGVycm9yIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gcHJvbWlzZSB3aWxs
IHJlamVjdC4KLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0KLQotICAgICAgY3VycmVudEhhbmRs
ZXJJbmZvcy5wdXNoKGhhbmRsZXJJbmZvKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLQotICAgICAgSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBgSGFuZGxlckluZm9gcywg
cGFzc2luZyB0aGUgaGFuZGxlcgotICAgICAgYW5kIGNvbnRleHQgaW50byB0aGUgY2FsbGJhY2su
Ci0KLSAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBoYW5kbGVySW5mb3MKLSAgICAg
IEBwYXJhbSB7RnVuY3Rpb24oT2JqZWN0LCBPYmplY3QpfSBjYWxsYmFjawotICAgICovCi0gICAg
ZnVuY3Rpb24gZWFjaEhhbmRsZXIoaGFuZGxlckluZm9zLCBjYWxsYmFjaykgewotICAgICAgZm9y
ICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNh
bGxiYWNrKGhhbmRsZXJJbmZvc1tpXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAg
ICBAcHJpdmF0ZQotCi0gICAgICBkZXRlcm1pbmVzIGlmIHR3byBxdWVyeXBhcmFtIG9iamVjdHMg
YXJlIHRoZSBzYW1lIG9yIG5vdAotICAgICoqLwotICAgIGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zRXF1
YWwoYSwgYikgewotICAgICAgYSA9IGEgfHwge307Ci0gICAgICBiID0gYiB8fCB7fTsKLSAgICAg
IHZhciBjaGVja2VkS2V5cyA9IFtdLCBrZXk7Ci0gICAgICBmb3Ioa2V5IGluIGEpIHsKLSAgICAg
ICAgaWYgKCFhLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgICAgaWYo
YltrZXldICE9PSBhW2tleV0pIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIGNoZWNrZWRLZXlz
LnB1c2goa2V5KTsKLSAgICAgIH0KLSAgICAgIGZvcihrZXkgaW4gYikgewotICAgICAgICBpZiAo
IWIuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQotICAgICAgICBpZiAofmNoZWNr
ZWRLZXlzLmluZGV4T2Yoa2V5KSkgeyBjb250aW51ZTsgfQotICAgICAgICAvLyBiIGhhcyBhIGtl
eSBub3QgaW4gYQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIG9uZSBVUkwgdG8KLSAgICAg
IGFub3RoZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGhhbmRsZXJzIGFyZSBubyBsb25nZXIgYWN0aXZl
LAotICAgICAgd2hpY2ggaGFuZGxlcnMgYXJlIG5ld2x5IGFjdGl2ZSwgYW5kIHdoaWNoIGhhbmRs
ZXJzIHJlbWFpbgotICAgICAgYWN0aXZlIGJ1dCBoYXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4K
LQotICAgICAgVGFrZSBhIGxpc3Qgb2Ygb2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5k
IHBhcnRpdGlvbgotICAgICAgdGhlbSBpbnRvIGZvdXIgYnVja2V0czoKLQotICAgICAgKiB1bmNo
YW5nZWQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUgb2xkIGFuZAotICAgICAg
ICBuZXcgVVJMLCBhbmQgaXRzIGNvbnRleHQgcmVtYWlucyB0aGUgc2FtZQotICAgICAgKiB1cGRh
dGVkIGNvbnRleHQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUKLSAgICAgICAg
b2xkIGFuZCBuZXcgVVJMLCBidXQgaXRzIGNvbnRleHQgY2hhbmdlZC4gVGhlIGhhbmRsZXIncwot
ICAgICAgICBgc2V0dXBgIG1ldGhvZCwgaWYgYW55LCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBu
ZXcKLSAgICAgICAgY29udGV4dC4KLSAgICAgICogZXhpdGVkOiB0aGUgaGFuZGxlciB3YXMgYWN0
aXZlIGluIHRoZSBvbGQgVVJMLCBidXQgaXMKLSAgICAgICAgbm8gbG9uZ2VyIGFjdGl2ZS4KLSAg
ICAgICogZW50ZXJlZDogdGhlIGhhbmRsZXIgd2FzIG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkws
IGJ1dAotICAgICAgICBpcyBub3cgYWN0aXZlLgotCi0gICAgICBUaGUgUGFydGl0aW9uZWRIYW5k
bGVycyBzdHJ1Y3R1cmUgaGFzIGZvdXIgZmllbGRzOgotCi0gICAgICAqIGB1cGRhdGVkQ29udGV4
dGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdAotICAgICAgICByZXByZXNl
bnQgaGFuZGxlcnMgdGhhdCByZW1haW4gYWN0aXZlIGJ1dCBoYXZlIGEgY2hhbmdlZAotICAgICAg
ICBjb250ZXh0Ci0gICAgICAqIGBlbnRlcmVkYDogYSBsaXN0IG9mIGBIYW5kbGVySW5mb2Agb2Jq
ZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAgICBoYW5kbGVycyB0aGF0IGFyZSBuZXdseSBhY3Rp
dmUKLSAgICAgICogYGV4aXRlZGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhh
dCBhcmUgbm8KLSAgICAgICAgbG9uZ2VyIGFjdGl2ZS4KLSAgICAgICogYHVuY2hhbmdlZGA6IGEg
bGlzdCBvZiBgSGFuZGVySW5mb2Agb2JqZWN0cyB0aGF0IHJlbWFpbiBhY3RpdmUuCi0KLSAgICAg
IEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBvbGRIYW5kbGVycyBhIGxpc3Qgb2YgdGhlIGhh
bmRsZXIKLSAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91cyBVUkwgKG9yIGBbXWAg
aWYgdGhpcyBpcyB0aGUKLSAgICAgICAgZmlyc3QgaGFuZGxlZCB0cmFuc2l0aW9uKQotICAgICAg
QHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG5ld0hhbmRsZXJzIGEgbGlzdCBvZiB0aGUgaGFu
ZGxlcgotICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBVUkwKLQotICAgICAgQHJldHVy
biB7UGFydGl0aW9ufQotICAgICovCi0gICAgZnVuY3Rpb24gcGFydGl0aW9uSGFuZGxlcnMob2xk
SGFuZGxlcnMsIG5ld0hhbmRsZXJzKSB7Ci0gICAgICB2YXIgaGFuZGxlcnMgPSB7Ci0gICAgICAg
ICAgICB1cGRhdGVkQ29udGV4dDogW10sCi0gICAgICAgICAgICBleGl0ZWQ6IFtdLAotICAgICAg
ICAgICAgZW50ZXJlZDogW10sCi0gICAgICAgICAgICB1bmNoYW5nZWQ6IFtdCi0gICAgICAgICAg
fTsKLQotICAgICAgdmFyIGhhbmRsZXJDaGFuZ2VkLCBjb250ZXh0Q2hhbmdlZCwgcXVlcnlQYXJh
bXNDaGFuZ2VkLCBpLCBsOwotCi0gICAgICBmb3IgKGk9MCwgbD1uZXdIYW5kbGVycy5sZW5ndGg7
IGk8bDsgaSsrKSB7Ci0gICAgICAgIHZhciBvbGRIYW5kbGVyID0gb2xkSGFuZGxlcnNbaV0sIG5l
d0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsKLQotICAgICAgICBpZiAoIW9sZEhhbmRsZXIgfHwg
b2xkSGFuZGxlci5oYW5kbGVyICE9PSBuZXdIYW5kbGVyLmhhbmRsZXIpIHsKLSAgICAgICAgICBo
YW5kbGVyQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXF1ZXJ5UGFyYW1zRXF1
YWwob2xkSGFuZGxlci5xdWVyeVBhcmFtcywgbmV3SGFuZGxlci5xdWVyeVBhcmFtcykpIHsKLSAg
ICAgICAgICBxdWVyeVBhcmFtc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKGhhbmRsZXJDaGFuZ2VkKSB7Ci0gICAgICAgICAgaGFuZGxlcnMuZW50ZXJlZC5wdXNoKG5l
d0hhbmRsZXIpOwotICAgICAgICAgIGlmIChvbGRIYW5kbGVyKSB7IGhhbmRsZXJzLmV4aXRlZC51
bnNoaWZ0KG9sZEhhbmRsZXIpOyB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dENoYW5nZWQg
fHwgb2xkSGFuZGxlci5jb250ZXh0ICE9PSBuZXdIYW5kbGVyLmNvbnRleHQgfHwgcXVlcnlQYXJh
bXNDaGFuZ2VkKSB7Ci0gICAgICAgICAgY29udGV4dENoYW5nZWQgPSB0cnVlOwotICAgICAgICAg
IGhhbmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2gobmV3SGFuZGxlcik7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgaGFuZGxlcnMudW5jaGFuZ2VkLnB1c2gob2xkSGFuZGxlcik7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpPW5ld0hhbmRsZXJzLmxlbmd0aCwgbD1vbGRI
YW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGhhbmRsZXJzLmV4aXRlZC51bnNo
aWZ0KG9sZEhhbmRsZXJzW2ldKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGhhbmRsZXJzOwot
ICAgIH0KLQotICAgIGZ1bmN0aW9uIHRyaWdnZXIocm91dGVyLCBoYW5kbGVySW5mb3MsIGlnbm9y
ZUZhaWx1cmUsIGFyZ3MpIHsKLSAgICAgIGlmIChyb3V0ZXIudHJpZ2dlckV2ZW50KSB7Ci0gICAg
ICAgIHJvdXRlci50cmlnZ2VyRXZlbnQoaGFuZGxlckluZm9zLCBpZ25vcmVGYWlsdXJlLCBhcmdz
KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB2YXIgbmFtZSA9IGFyZ3Muc2hp
ZnQoKTsKLQotICAgICAgaWYgKCFoYW5kbGVySW5mb3MpIHsKLSAgICAgICAgaWYgKGlnbm9yZUZh
aWx1cmUpIHsgcmV0dXJuOyB9Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHRy
aWdnZXIgZXZlbnQgJyIgKyBuYW1lICsgIicuIFRoZXJlIGFyZSBubyBhY3RpdmUgaGFuZGxlcnMi
KTsKLSAgICAgIH0KLQotICAgICAgdmFyIGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0gICAg
ICBmb3IgKHZhciBpPWhhbmRsZXJJbmZvcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAg
IHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAgICAgIGhhbmRsZXIg
PSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAgICAgIGlmIChoYW5kbGVyLmV2ZW50cyAmJiBo
YW5kbGVyLmV2ZW50c1tuYW1lXSkgewotICAgICAgICAgIGlmIChoYW5kbGVyLmV2ZW50c1tuYW1l
XS5hcHBseShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1ZSkgewotICAgICAgICAgICAgZXZlbnRXYXNI
YW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIWV2ZW50V2FzSGFu
ZGxlZCAmJiAhaWdub3JlRmFpbHVyZSkgewotICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdGhp
bmcgaGFuZGxlZCB0aGUgZXZlbnQgJyIgKyBuYW1lICsgIicuIik7Ci0gICAgICB9Ci0gICAgfQot
Ci0gICAgZnVuY3Rpb24gc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KSB7Ci0gICAgICBoYW5k
bGVyLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgaWYgKGhhbmRsZXIuY29udGV4dERpZENoYW5n
ZSkgeyBoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2UoKTsgfQotICAgIH0KLQotICAgIGZ1bmN0aW9u
IHNldFF1ZXJ5UGFyYW1zKGhhbmRsZXIsIHF1ZXJ5UGFyYW1zKSB7Ci0gICAgICBoYW5kbGVyLnF1
ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Ci0gICAgICBpZiAoaGFuZGxlci5xdWVyeVBhcmFtc0Rp
ZENoYW5nZSkgeyBoYW5kbGVyLnF1ZXJ5UGFyYW1zRGlkQ2hhbmdlKCk7IH0KLSAgICB9Ci0KLQot
ICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgRXh0cmFjdHMgcXVlcnkgcGFyYW1zIGZy
b20gdGhlIGVuZCBvZiBhbiBhcnJheQotICAgICoqLwotCi0gICAgZnVuY3Rpb24gZXh0cmFjdFF1
ZXJ5UGFyYW1zKGFycmF5KSB7Ci0gICAgICB2YXIgbGVuID0gKGFycmF5ICYmIGFycmF5Lmxlbmd0
aCksIGhlYWQsIHF1ZXJ5UGFyYW1zOwotCi0gICAgICBpZihsZW4gJiYgbGVuID4gMCAmJiBhcnJh
eVtsZW4gLSAxXSAmJiBhcnJheVtsZW4gLSAxXS5oYXNPd25Qcm9wZXJ0eSgncXVlcnlQYXJhbXMn
KSkgewotICAgICAgICBxdWVyeVBhcmFtcyA9IGFycmF5W2xlbiAtIDFdLnF1ZXJ5UGFyYW1zOwot
ICAgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJheSwgMCwgbGVuIC0gMSk7Ci0gICAgICAgIHJl
dHVybiBbaGVhZCwgcXVlcnlQYXJhbXNdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJu
IFthcnJheSwgbnVsbF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gcGVyZm9ybUlu
dGVybWVkaWF0ZVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVz
dWx0cykgewotCi0gICAgICB2YXIgaGFuZGxlckluZm9zID0gZ2VuZXJhdGVIYW5kbGVySW5mb3Mo
cm91dGVyLCByZWNvZ0hhbmRsZXJzKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxl
ckluZm9zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJ
bmZvc1tpXTsKLSAgICAgICAgaGFuZGxlckluZm8uY29udGV4dCA9IG1hdGNoUG9pbnRSZXN1bHRz
LnByb3ZpZGVkTW9kZWxzW2hhbmRsZXJJbmZvLm5hbWVdOwotICAgICAgfQotCi0gICAgICB2YXIg
c3R1YmJlZFRyYW5zaXRpb24gPSB7Ci0gICAgICAgIHJvdXRlcjogcm91dGVyLAotICAgICAgICBp
c0Fib3J0ZWQ6IGZhbHNlCi0gICAgICB9OwotCi0gICAgICBzZXR1cENvbnRleHRzKHN0dWJiZWRU
cmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZh
dGUKLQotICAgICAgQ3JlYXRlcywgYmVnaW5zLCBhbmQgcmV0dXJucyBhIFRyYW5zaXRpb24uCi0g
ICAgICovCi0gICAgZnVuY3Rpb24gcGVyZm9ybVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRs
ZXJzLCBwcm92aWRlZE1vZGVsc0FycmF5LCBwYXJhbXMsIHF1ZXJ5UGFyYW1zLCBkYXRhLCBpc0lu
dGVybWVkaWF0ZSkgewotCi0gICAgICB2YXIgbWF0Y2hQb2ludFJlc3VsdHMgPSBnZXRNYXRjaFBv
aW50KHJvdXRlciwgcmVjb2dIYW5kbGVycywgcHJvdmlkZWRNb2RlbHNBcnJheSwgcGFyYW1zLCBx
dWVyeVBhcmFtcyksCi0gICAgICAgICAgdGFyZ2V0TmFtZSA9IHJlY29nSGFuZGxlcnNbcmVjb2dI
YW5kbGVycy5sZW5ndGggLSAxXS5oYW5kbGVyLAotICAgICAgICAgIHdhc1RyYW5zaXRpb25pbmcg
PSBmYWxzZSwKLSAgICAgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRI
YW5kbGVySW5mb3M7Ci0KLSAgICAgIGlmIChpc0ludGVybWVkaWF0ZSkgewotICAgICAgICByZXR1
cm4gcGVyZm9ybUludGVybWVkaWF0ZVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBt
YXRjaFBvaW50UmVzdWx0cyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mg
YWxyZWFkeSBhIHRyYW5zaXRpb24gdW5kZXJ3YXkuCi0gICAgICBpZiAocm91dGVyLmFjdGl2ZVRy
YW5zaXRpb24pIHsKLSAgICAgICAgaWYgKHRyYW5zaXRpb25zSWRlbnRpY2FsKHJvdXRlci5hY3Rp
dmVUcmFuc2l0aW9uLCB0YXJnZXROYW1lLCBwcm92aWRlZE1vZGVsc0FycmF5LCBxdWVyeVBhcmFt
cykpIHsKLSAgICAgICAgICByZXR1cm4gcm91dGVyLmFjdGl2ZVRyYW5zaXRpb247Ci0gICAgICAg
IH0KLSAgICAgICAgcm91dGVyLmFjdGl2ZVRyYW5zaXRpb24uYWJvcnQoKTsKLSAgICAgICAgd2Fz
VHJhbnNpdGlvbmluZyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBkZWZlcnJlZCA9IFJT
VlAuZGVmZXIoKSwKLSAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb24ocm91dGVy
LCBkZWZlcnJlZC5wcm9taXNlKTsKLQotICAgICAgdHJhbnNpdGlvbi50YXJnZXROYW1lID0gdGFy
Z2V0TmFtZTsKLSAgICAgIHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHMgPSBtYXRjaFBvaW50UmVz
dWx0cy5wcm92aWRlZE1vZGVsczsKLSAgICAgIHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJh
eSA9IHByb3ZpZGVkTW9kZWxzQXJyYXk7Ci0gICAgICB0cmFuc2l0aW9uLnBhcmFtcyA9IG1hdGNo
UG9pbnRSZXN1bHRzLnBhcmFtczsKLSAgICAgIHRyYW5zaXRpb24uZGF0YSA9IGRhdGEgfHwge307
Ci0gICAgICB0cmFuc2l0aW9uLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Ci0gICAgICB0cmFu
c2l0aW9uLnBpdm90SGFuZGxlciA9IG1hdGNoUG9pbnRSZXN1bHRzLnBpdm90SGFuZGxlcjsKLSAg
ICAgIHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKLQotICAgICAgdmFyIGhh
bmRsZXJJbmZvcyA9IGdlbmVyYXRlSGFuZGxlckluZm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycyk7
Ci0gICAgICB0cmFuc2l0aW9uLmhhbmRsZXJJbmZvcyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAg
Ly8gRmlyZSAnd2lsbFRyYW5zaXRpb24nIGV2ZW50IG9uIGN1cnJlbnQgaGFuZGxlcnMsIGJ1dCBk
b24ndCBmaXJlIGl0Ci0gICAgICAvLyBpZiBhIHRyYW5zaXRpb24gd2FzIGFscmVhZHkgdW5kZXJ3
YXkuCi0gICAgICBpZiAoIXdhc1RyYW5zaXRpb25pbmcpIHsKLSAgICAgICAgdHJpZ2dlcihyb3V0
ZXIsIGN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUsIFsnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0
aW9uXSk7Ci0gICAgICB9Ci0KLSAgICAgIGxvZyhyb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2Us
ICJCZWdpbm5pbmcgdmFsaWRhdGlvbiBmb3IgdHJhbnNpdGlvbiB0byAiICsgdHJhbnNpdGlvbi50
YXJnZXROYW1lKTsKLSAgICAgIHZhbGlkYXRlRW50cnkodHJhbnNpdGlvbiwgbWF0Y2hQb2ludFJl
c3VsdHMubWF0Y2hQb2ludCwgbWF0Y2hQb2ludFJlc3VsdHMuaGFuZGxlclBhcmFtcykKLSAgICAg
ICAgICAgICAgICAgICAudGhlbih0cmFuc2l0aW9uU3VjY2VzcywgdHJhbnNpdGlvbkZhaWx1cmUp
OwotCi0gICAgICByZXR1cm4gdHJhbnNpdGlvbjsKLQotICAgICAgZnVuY3Rpb24gdHJhbnNpdGlv
blN1Y2Nlc3MoKSB7Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0KLSAgICAgICAg
dHJ5IHsKLSAgICAgICAgICBmaW5hbGl6ZVRyYW5zaXRpb24odHJhbnNpdGlvbiwgaGFuZGxlcklu
Zm9zKTsKLQotICAgICAgICAgIC8vIGN1cnJlbnRIYW5kbGVySW5mb3Mgd2FzIHVwZGF0ZWQgaW4g
ZmluYWxpemVUcmFuc2l0aW9uCi0gICAgICAgICAgdHJpZ2dlcihyb3V0ZXIsIHJvdXRlci5jdXJy
ZW50SGFuZGxlckluZm9zLCB0cnVlLCBbJ2RpZFRyYW5zaXRpb24nXSk7Ci0KLSAgICAgICAgICBp
ZiAocm91dGVyLmRpZFRyYW5zaXRpb24pIHsKLSAgICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0
aW9uKGhhbmRsZXJJbmZvcyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbG9nKHJvdXRlciwg
dHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlRSQU5TSVRJT04gQ09NUExFVEUuIik7Ci0KLSAgICAgICAg
ICAvLyBSZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhhbmRsZXIuCi0gICAgICAgICAgdHJhbnNpdGlv
bi5pc0FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaGFuZGxlcklu
Zm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVyKTsKLSAgICAgICAgfSBjYXRjaChl
KSB7Ci0gICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gRG9uJ3QgbnVsbGlmeSBpZiBhbm90aGVyIHRyYW5zaXRpb24gaXMgdW5kZXJ3YXkgKG1lYW5p
bmcKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgdHJhbnNpdGlvbiBpbml0aWF0ZWQgd2l0aCBlbnRl
ci9zZXR1cCkuCi0gICAgICAgIGlmICghdHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKLSAgICAgICAg
ICByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQot
ICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvbkZhaWx1cmUocmVhc29uKSB7Ci0gICAgICAgIGRlZmVy
cmVkLnJlamVjdChyZWFzb24pOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLQotICAgICAgQWNjZXB0cyBoYW5kbGVycyBpbiBSZWNvZ25pemVyIGZvcm1hdCwgZWl0
aGVyIHJldHVybmVkIGZyb20KLSAgICAgIHJlY29nbml6ZSgpIG9yIGhhbmRsZXJzRm9yKCksIGFu
ZCByZXR1cm5zIHVuaWZpZWQKLSAgICAgIGBIYW5kbGVySW5mb2BzLgotICAgICAqLwotICAgIGZ1
bmN0aW9uIGdlbmVyYXRlSGFuZGxlckluZm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycykgewotICAg
ICAgdmFyIGhhbmRsZXJJbmZvcyA9IFtdOwotICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJl
Y29nSGFuZGxlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgdmFyIGhhbmRsZXJP
YmogPSByZWNvZ0hhbmRsZXJzW2ldLAotICAgICAgICAgICAgaXNEeW5hbWljID0gaGFuZGxlck9i
ai5pc0R5bmFtaWMgfHwgKGhhbmRsZXJPYmoubmFtZXMgJiYgaGFuZGxlck9iai5uYW1lcy5sZW5n
dGgpOwotCi0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHsKLSAgICAgICAgICBpc0R5bmFtaWM6
ICEhaXNEeW5hbWljLAotICAgICAgICAgIG5hbWU6IGhhbmRsZXJPYmouaGFuZGxlciwKLSAgICAg
ICAgICBoYW5kbGVyOiByb3V0ZXIuZ2V0SGFuZGxlcihoYW5kbGVyT2JqLmhhbmRsZXIpCi0gICAg
ICAgIH07Ci0gICAgICAgIGlmKGhhbmRsZXJPYmoucXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICBo
YW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGhhbmRsZXJPYmoucXVlcnlQYXJhbXM7Ci0gICAgICAg
IH0KLSAgICAgICAgaGFuZGxlckluZm9zLnB1c2goaGFuZGxlckluZm8pOwotICAgICAgfQotICAg
ICAgcmV0dXJuIGhhbmRsZXJJbmZvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRl
Ci0gICAgICovCi0gICAgZnVuY3Rpb24gdHJhbnNpdGlvbnNJZGVudGljYWwob2xkVHJhbnNpdGlv
biwgdGFyZ2V0TmFtZSwgcHJvdmlkZWRNb2RlbHNBcnJheSwgcXVlcnlQYXJhbXMpIHsKLQotICAg
ICAgaWYgKG9sZFRyYW5zaXRpb24udGFyZ2V0TmFtZSAhPT0gdGFyZ2V0TmFtZSkgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgICAgdmFyIG9sZE1vZGVscyA9IG9sZFRyYW5zaXRpb24ucHJvdmlkZWRN
b2RlbHNBcnJheTsKLSAgICAgIGlmIChvbGRNb2RlbHMubGVuZ3RoICE9PSBwcm92aWRlZE1vZGVs
c0FycmF5Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgZm9yICh2YXIgaSA9IDAs
IGxlbiA9IG9sZE1vZGVscy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewotICAgICAgICBpZiAob2xk
TW9kZWxzW2ldICE9PSBwcm92aWRlZE1vZGVsc0FycmF5W2ldKSB7IHJldHVybiBmYWxzZTsgfQot
ICAgICAgfQotCi0gICAgICBpZighcXVlcnlQYXJhbXNFcXVhbChvbGRUcmFuc2l0aW9uLnF1ZXJ5
UGFyYW1zLCBxdWVyeVBhcmFtcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0K
LSAgICAgIFVwZGF0ZXMgdGhlIFVSTCAoaWYgbmVjZXNzYXJ5KSBhbmQgY2FsbHMgYHNldHVwQ29u
dGV4dHNgCi0gICAgICB0byB1cGRhdGUgdGhlIHJvdXRlcidzIGFycmF5IG9mIGBjdXJyZW50SGFu
ZGxlckluZm9zYC4KLSAgICAgKi8KLSAgICBmdW5jdGlvbiBmaW5hbGl6ZVRyYW5zaXRpb24odHJh
bnNpdGlvbiwgaGFuZGxlckluZm9zKSB7Ci0KLSAgICAgIGxvZyh0cmFuc2l0aW9uLnJvdXRlciwg
dHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlZhbGlkYXRpb24gc3VjY2VlZGVkLCBmaW5hbGl6aW5nIHRy
YW5zaXRpb247Iik7Ci0KLSAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKLSAg
ICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNlLAotICAgICAgICAgIGhhbmRsZXJOYW1l
ID0gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lLAotICAgICAgICAg
IHVybE1ldGhvZCA9IHRyYW5zaXRpb24udXJsTWV0aG9kLAotICAgICAgICAgIGk7Ci0KLSAgICAg
IC8vIENvbGxlY3QgcGFyYW1zIGZvciBVUkwuCi0gICAgICB2YXIgb2JqZWN0cyA9IFtdLCBwcm92
aWRlZE1vZGVscyA9IHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheS5zbGljZSgpOwotICAg
ICAgZm9yIChpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGk+PTA7IC0taSkgewotICAgICAg
ICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV07Ci0gICAgICAgIGlmIChoYW5kbGVy
SW5mby5pc0R5bmFtaWMpIHsKLSAgICAgICAgICB2YXIgcHJvdmlkZWRNb2RlbCA9IHByb3ZpZGVk
TW9kZWxzLnBvcCgpOwotICAgICAgICAgIG9iamVjdHMudW5zaGlmdChpc1BhcmFtKHByb3ZpZGVk
TW9kZWwpID8gcHJvdmlkZWRNb2RlbC50b1N0cmluZygpIDogaGFuZGxlckluZm8uY29udGV4dCk7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlckluZm8uaGFuZGxlci5pbmFjY2Vzc2li
bGVCeVVSTCkgewotICAgICAgICAgIHVybE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAg
IH0KLQotICAgICAgdmFyIG5ld1F1ZXJ5UGFyYW1zID0ge307Ci0gICAgICBmb3IgKGkgPSBoYW5k
bGVySW5mb3MubGVuZ3RoIC0gMTsgaT49MDsgLS1pKSB7Ci0gICAgICAgIG1lcmdlKG5ld1F1ZXJ5
UGFyYW1zLCBoYW5kbGVySW5mb3NbaV0ucXVlcnlQYXJhbXMpOwotICAgICAgfQotICAgICAgcm91
dGVyLmN1cnJlbnRRdWVyeVBhcmFtcyA9IG5ld1F1ZXJ5UGFyYW1zOwotCi0KLSAgICAgIHZhciBw
YXJhbXMgPSBwYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxlck5hbWUsIG9iamVjdHMsIHRy
YW5zaXRpb24ucXVlcnlQYXJhbXMpOwotCi0gICAgICByb3V0ZXIuY3VycmVudFBhcmFtcyA9IHBh
cmFtczsKLQotICAgICAgaWYgKHVybE1ldGhvZCkgewotICAgICAgICB2YXIgdXJsID0gcm91dGVy
LnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxlck5hbWUsIHBhcmFtcyk7Ci0KLSAgICAgICAgaWYg
KHVybE1ldGhvZCA9PT0gJ3JlcGxhY2UnKSB7Ci0gICAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwo
dXJsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBBc3N1bWUgZXZlcnl0aGluZyBl
bHNlIGlzIGp1c3QgYSBVUkwgdXBkYXRlIGZvciBub3cuCi0gICAgICAgICAgcm91dGVyLnVwZGF0
ZVVSTCh1cmwpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHNldHVwQ29udGV4dHModHJh
bnNpdGlvbiwgaGFuZGxlckluZm9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRl
Ci0KLSAgICAgIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gY29uc3RydWN0IHRoZSBjaGFpbiBv
ZiBwcm9taXNlcyB1c2VkCi0gICAgICB0byB2YWxpZGF0ZSBhIHRyYW5zaXRpb24uIFdyYXBzIGNh
bGxzIHRvIGBiZWZvcmVNb2RlbGAsIGBtb2RlbGAsCi0gICAgICBhbmQgYGFmdGVyTW9kZWxgIGlu
IHByb21pc2VzLCBhbmQgY2hlY2tzIGZvciByZWRpcmVjdHMvYWJvcnRzCi0gICAgICBiZXR3ZWVu
IGVhY2guCi0gICAgICovCi0gICAgZnVuY3Rpb24gdmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9uLCBt
YXRjaFBvaW50LCBoYW5kbGVyUGFyYW1zKSB7Ci0KLSAgICAgIHZhciBoYW5kbGVySW5mb3MgPSB0
cmFuc2l0aW9uLmhhbmRsZXJJbmZvcywKLSAgICAgICAgICBpbmRleCA9IHRyYW5zaXRpb24ucmVz
b2x2ZUluZGV4OwotCi0gICAgICBpZiAoaW5kZXggPT09IGhhbmRsZXJJbmZvcy5sZW5ndGgpIHsK
LSAgICAgICAgLy8gTm8gbW9yZSBjb250ZXh0cyB0byByZXNvbHZlLgotICAgICAgICByZXR1cm4g
UlNWUC5yZXNvbHZlKHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHMpOwotICAgICAgfQotCi0gICAg
ICB2YXIgcm91dGVyID0gdHJhbnNpdGlvbi5yb3V0ZXIsCi0gICAgICAgICAgaGFuZGxlckluZm8g
PSBoYW5kbGVySW5mb3NbaW5kZXhdLAotICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5o
YW5kbGVyLAotICAgICAgICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm8ubmFtZSwKLSAgICAg
ICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNlOwotCi0gICAgICBpZiAoaW5kZXggPCBtYXRj
aFBvaW50KSB7Ci0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiB1c2lu
ZyBjb250ZXh0IGZyb20gYWxyZWFkeS1hY3RpdmUgaGFuZGxlciIpOwotCi0gICAgICAgIC8vIFdl
J3JlIGJlZm9yZSB0aGUgbWF0Y2ggcG9pbnQsIHNvIGRvbid0IHJ1biBhbnkgaG9va3MsCi0gICAg
ICAgIC8vIGp1c3QgdXNlIHRoZSBhbHJlYWR5IHJlc29sdmVkIGNvbnRleHQgZnJvbSB0aGUgaGFu
ZGxlci4KLSAgICAgICAgdHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVsc1toYW5kbGVySW5mby5uYW1l
XSA9Ci0gICAgICAgICAgdHJhbnNpdGlvbi5wcm92aWRlZE1vZGVsc1toYW5kbGVySW5mby5uYW1l
XSB8fAotICAgICAgICAgIGhhbmRsZXJJbmZvLmhhbmRsZXIuY29udGV4dDsKLSAgICAgICAgcmV0
dXJuIHByb2NlZWQoKTsKLSAgICAgIH0KLQotICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUs
ICd3aWxsUmVzb2x2ZU1vZGVsJywgdHJhbnNpdGlvbiwgaGFuZGxlcik7Ci0KLSAgICAgIHJldHVy
biBSU1ZQLnJlc29sdmUoKS50aGVuKGhhbmRsZUFib3J0KQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLnRoZW4oYmVmb3JlTW9kZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGhl
bihoYW5kbGVBYm9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1vZGVsKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAudGhlbihhZnRlck1vZGVsKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGhl
bihudWxsLCBoYW5kbGVFcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHBy
b2NlZWQpOwotCi0gICAgICBmdW5jdGlvbiBoYW5kbGVBYm9ydChyZXN1bHQpIHsKLSAgICAgICAg
aWYgKHRyYW5zaXRpb24uaXNBYm9ydGVkKSB7Ci0gICAgICAgICAgbG9nKHRyYW5zaXRpb24ucm91
dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7Ci0gICAgICAgICAg
cmV0dXJuIFJTVlAucmVqZWN0KG5ldyBSb3V0ZXIuVHJhbnNpdGlvbkFib3J0ZWQoKSk7Ci0gICAg
ICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBmdW5jdGlv
biBoYW5kbGVFcnJvcihyZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFJv
dXRlci5UcmFuc2l0aW9uQWJvcnRlZCB8fCB0cmFuc2l0aW9uLmlzQWJvcnRlZCkgewotICAgICAg
ICAgIC8vIGlmIHRoZSB0cmFuc2l0aW9uIHdhcyBhYm9ydGVkIGFuZCAqbm8gYWRkaXRpb25hbCog
ZXJyb3Igd2FzIHRocm93biwKLSAgICAgICAgICAvLyByZWplY3Qgd2l0aCB0aGUgUm91dGVyLlRy
YW5zaXRpb25BYm9ydGVkIGluc3RhbmNlCi0gICAgICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KHJl
YXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvdGhlcndpc2UsIHdlJ3JlIGhlcmUgYmVj
YXVzZSBvZiBhIGRpZmZlcmVudCBlcnJvcgotICAgICAgICB0cmFuc2l0aW9uLmFib3J0KCk7Ci0K
LSAgICAgICAgbG9nKHJvdXRlciwgc2VxLCBoYW5kbGVyTmFtZSArICI6IGhhbmRsaW5nIGVycm9y
OiAiICsgcmVhc29uKTsKLQotICAgICAgICAvLyBBbiBlcnJvciB3YXMgdGhyb3duIC8gcHJvbWlz
ZSByZWplY3RlZCwgc28gZmlyZSBhbgotICAgICAgICAvLyBgZXJyb3JgIGV2ZW50IGZyb20gdGhp
cyBoYW5kbGVyIGluZm8gdXAgdG8gcm9vdC4KLSAgICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRy
dWUsICdlcnJvcicsIHJlYXNvbiwgdHJhbnNpdGlvbiwgaGFuZGxlckluZm8uaGFuZGxlcik7Ci0K
LSAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBvcmlnaW5hbCBlcnJvci4KLSAgICAgICAgcmV0dXJu
IFJTVlAucmVqZWN0KHJlYXNvbik7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIGJlZm9yZU1v
ZGVsKCkgewotCi0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiBjYWxs
aW5nIGJlZm9yZU1vZGVsIGhvb2siKTsKLQotICAgICAgICB2YXIgYXJnczsKLQotICAgICAgICBp
ZiAoaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICBhcmdzID0gW2hhbmRsZXJJ
bmZvLnF1ZXJ5UGFyYW1zLCB0cmFuc2l0aW9uXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICBhcmdzID0gW3RyYW5zaXRpb25dOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHAgPSBoYW5k
bGVyLmJlZm9yZU1vZGVsICYmIGhhbmRsZXIuYmVmb3JlTW9kZWwuYXBwbHkoaGFuZGxlciwgYXJn
cyk7Ci0gICAgICAgIHJldHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRpb24pID8gbnVsbCA6IHA7
Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIG1vZGVsKCkgewotICAgICAgICBsb2cocm91dGVy
LCBzZXEsIGhhbmRsZXJOYW1lICsgIjogcmVzb2x2aW5nIG1vZGVsIik7Ci0gICAgICAgIHZhciBw
ID0gZ2V0TW9kZWwoaGFuZGxlckluZm8sIHRyYW5zaXRpb24sIGhhbmRsZXJQYXJhbXNbaGFuZGxl
ck5hbWVdLCBpbmRleCA+PSBtYXRjaFBvaW50KTsKLSAgICAgICAgcmV0dXJuIChwIGluc3RhbmNl
b2YgVHJhbnNpdGlvbikgPyBudWxsIDogcDsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gYWZ0
ZXJNb2RlbChjb250ZXh0KSB7Ci0KLSAgICAgICAgbG9nKHJvdXRlciwgc2VxLCBoYW5kbGVyTmFt
ZSArICI6IGNhbGxpbmcgYWZ0ZXJNb2RlbCBob29rIik7Ci0KLSAgICAgICAgLy8gUGFzcyB0aGUg
Y29udGV4dCBhbmQgcmVzb2x2ZWQgcGFyZW50IGNvbnRleHRzIHRvIGFmdGVyTW9kZWwsIGJ1dCB3
ZSBkb24ndAotICAgICAgICAvLyB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBg
YWZ0ZXJNb2RlbGAgaW4gYW55IHdheSwgYnV0IHJhdGhlcgotICAgICAgICAvLyBhbHdheXMgcmVz
b2x2ZSB3aXRoIHRoZSBvcmlnaW5hbCBgY29udGV4dGAgb2JqZWN0LgotCi0gICAgICAgIHRyYW5z
aXRpb24ucmVzb2x2ZWRNb2RlbHNbaGFuZGxlckluZm8ubmFtZV0gPSBjb250ZXh0OwotCi0gICAg
ICAgIHZhciBhcmdzOwotCi0gICAgICAgIGlmIChoYW5kbGVySW5mby5xdWVyeVBhcmFtcykgewot
ICAgICAgICAgIGFyZ3MgPSBbY29udGV4dCwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMsIHRyYW5z
aXRpb25dOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFyZ3MgPSBbY29udGV4dCwgdHJh
bnNpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcCA9IGhhbmRsZXIuYWZ0ZXJNb2Rl
bCAmJiBoYW5kbGVyLmFmdGVyTW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7Ci0gICAgICAgIHJl
dHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRpb24pID8gbnVsbCA6IHA7Ci0gICAgICB9Ci0KLSAg
ICAgIGZ1bmN0aW9uIHByb2NlZWQoKSB7Ci0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxl
ck5hbWUgKyAiOiB2YWxpZGF0aW9uIHN1Y2NlZWRlZCwgcHJvY2VlZGluZyIpOwotCi0gICAgICAg
IGhhbmRsZXJJbmZvLmNvbnRleHQgPSB0cmFuc2l0aW9uLnJlc29sdmVkTW9kZWxzW2hhbmRsZXJJ
bmZvLm5hbWVdOwotICAgICAgICB0cmFuc2l0aW9uLnJlc29sdmVJbmRleCsrOwotICAgICAgICBy
ZXR1cm4gdmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9uLCBtYXRjaFBvaW50LCBoYW5kbGVyUGFyYW1z
KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRo
cm93cyBhIFRyYW5zaXRpb25BYm9ydGVkIGlmIHRoZSBwcm92aWRlZCB0cmFuc2l0aW9uIGhhcyBi
ZWVuIGFib3J0ZWQuCi0gICAgICovCi0gICAgZnVuY3Rpb24gY2hlY2tBYm9ydCh0cmFuc2l0aW9u
KSB7Ci0gICAgICBpZiAodHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKLSAgICAgICAgbG9nKHRyYW5z
aXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7Ci0g
ICAgICAgIHRocm93IG5ldyBSb3V0ZXIuVHJhbnNpdGlvbkFib3J0ZWQoKTsKLSAgICAgIH0KLSAg
ICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIEVuY2Fwc3VsYXRlcyB0aGUg
bG9naWMgZm9yIHdoZXRoZXIgdG8gY2FsbCBgbW9kZWxgIG9uIGEgcm91dGUsCi0gICAgICBvciB1
c2Ugb25lIG9mIHRoZSBtb2RlbHMgcHJvdmlkZWQgdG8gYHRyYW5zaXRpb25Ub2AuCi0gICAgICov
Ci0gICAgZnVuY3Rpb24gZ2V0TW9kZWwoaGFuZGxlckluZm8sIHRyYW5zaXRpb24sIGhhbmRsZXJQ
YXJhbXMsIG5lZWRzVXBkYXRlKSB7Ci0gICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhh
bmRsZXIsCi0gICAgICAgICAgaGFuZGxlck5hbWUgPSBoYW5kbGVySW5mby5uYW1lLCBhcmdzOwot
Ci0gICAgICBpZiAoIW5lZWRzVXBkYXRlICYmIGhhbmRsZXIuaGFzT3duUHJvcGVydHkoJ2NvbnRl
eHQnKSkgewotICAgICAgICByZXR1cm4gaGFuZGxlci5jb250ZXh0OwotICAgICAgfQotCi0gICAg
ICBpZiAodHJhbnNpdGlvbi5wcm92aWRlZE1vZGVscy5oYXNPd25Qcm9wZXJ0eShoYW5kbGVyTmFt
ZSkpIHsKLSAgICAgICAgdmFyIHByb3ZpZGVkTW9kZWwgPSB0cmFuc2l0aW9uLnByb3ZpZGVkTW9k
ZWxzW2hhbmRsZXJOYW1lXTsKLSAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm92aWRlZE1vZGVsID09
PSAnZnVuY3Rpb24nID8gcHJvdmlkZWRNb2RlbCgpIDogcHJvdmlkZWRNb2RlbDsKLSAgICAgIH0K
LQotICAgICAgaWYgKGhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zKSB7Ci0gICAgICAgIGFyZ3MgPSBb
aGFuZGxlclBhcmFtcyB8fCB7fSwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMsIHRyYW5zaXRpb25d
OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJncyA9IFtoYW5kbGVyUGFyYW1zIHx8IHt9LCB0
cmFuc2l0aW9uLCBoYW5kbGVySW5mby5xdWVyeVBhcmFtc107Ci0gICAgICB9Ci0KLSAgICAgIHJl
dHVybiBoYW5kbGVyLm1vZGVsICYmIGhhbmRsZXIubW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7
Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotICAgICAqLwotICAgIGZ1bmN0aW9u
IGxvZyhyb3V0ZXIsIHNlcXVlbmNlLCBtc2cpIHsKLQotICAgICAgaWYgKCFyb3V0ZXIubG9nKSB7
IHJldHVybjsgfQotCi0gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgewotICAgICAg
ICByb3V0ZXIubG9nKCJUcmFuc2l0aW9uICMiICsgc2VxdWVuY2UgKyAiOiAiICsgbXNnKTsKLSAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZyA9IHNlcXVlbmNlOwotICAgICAgICByb3V0ZXIubG9n
KG1zZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAg
ICBCZWdpbnMgYW5kIHJldHVybnMgYSBUcmFuc2l0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZAot
ICAgICAgYXJndW1lbnRzLiBBY2NlcHRzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSBvZiBib3RoIFVS
TAotICAgICAgdHJhbnNpdGlvbnMgYW5kIG5hbWVkIHRyYW5zaXRpb25zLgotCi0gICAgICBAcGFy
YW0ge1JvdXRlcn0gcm91dGVyCi0gICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IGFyZ3MgYXJn
dW1lbnRzIHBhc3NlZCB0byB0cmFuc2l0aW9uVG8sCi0gICAgICAgIHJlcGxhY2VXaXRoLCBvciBo
YW5kbGVVUkwKLSAgICAqLwotICAgIGZ1bmN0aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3Ms
IGlzSW50ZXJtZWRpYXRlKSB7Ci0gICAgICAvLyBOb3JtYWxpemUgYmxhbmsgdHJhbnNpdGlvbnMg
dG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCi0gICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0gfHwgJy8n
OwotCi0gICAgICBpZihhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLmhhc093blByb3BlcnR5
KCdxdWVyeVBhcmFtcycpKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVRdWVyeVBhcmFtVHJhbnNp
dGlvbihyb3V0ZXIsIGFyZ3NbMF0sIGlzSW50ZXJtZWRpYXRlKTsKLSAgICAgIH0gZWxzZSBpZiAo
bmFtZS5jaGFyQXQoMCkgPT09ICcvJykgewotICAgICAgICByZXR1cm4gY3JlYXRlVVJMVHJhbnNp
dGlvbihyb3V0ZXIsIG5hbWUsIGlzSW50ZXJtZWRpYXRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHJldHVybiBjcmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBzbGljZS5jYWxsKGFyZ3Mp
LCBpc0ludGVybWVkaWF0ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJp
dmF0ZQotCi0gICAgICBTZXJpYWxpemVzIGEgaGFuZGxlciB1c2luZyBpdHMgY3VzdG9tIGBzZXJp
YWxpemVgIG1ldGhvZCBvcgotICAgICAgYnkgYSBkZWZhdWx0IHRoYXQgbG9va3MgdXAgdGhlIGV4
cGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbQotICAgICAgdGhlIGR5bmFtaWMgc2VnbWVudC4KLQot
ICAgICAgQHBhcmFtIHtPYmplY3R9IGhhbmRsZXIgYSByb3V0ZXIgaGFuZGxlcgotICAgICAgQHBh
cmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCB0byBiZSBzZXJpYWxpemVkIGZvciB0aGlzIGhh
bmRsZXIKLSAgICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gbmFtZXMgdGhlIG5hbWVzIGFycmF5
IGF0dGFjaGVkIHRvIGFuCi0gICAgICAgIGhhbmRsZXIgb2JqZWN0IHJldHVybmVkIGZyb20gcm91
dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IoKQotICAgICovCi0gICAgZnVuY3Rpb24gc2VyaWFs
aXplKGhhbmRsZXIsIG1vZGVsLCBuYW1lcykgewotCi0gICAgICB2YXIgb2JqZWN0ID0ge307Ci0g
ICAgICBpZiAoaXNQYXJhbShtb2RlbCkpIHsKLSAgICAgICAgb2JqZWN0W25hbWVzWzBdXSA9IG1v
ZGVsOwotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgfQotCi0gICAgICAvLyBVc2UgY3Vz
dG9tIHNlcmlhbGl6ZSBpZiBpdCBleGlzdHMuCi0gICAgICBpZiAoaGFuZGxlci5zZXJpYWxpemUp
IHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKG1vZGVsLCBuYW1lcyk7Ci0gICAg
ICB9Ci0KLSAgICAgIGlmIChuYW1lcy5sZW5ndGggIT09IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICAg
IHZhciBuYW1lID0gbmFtZXNbMF07Ci0KLSAgICAgIGlmICgvX2lkJC8udGVzdChuYW1lKSkgewot
ICAgICAgICBvYmplY3RbbmFtZV0gPSBtb2RlbC5pZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAg
IG9iamVjdFtuYW1lXSA9IG1vZGVsOwotICAgICAgfQotICAgICAgcmV0dXJuIG9iamVjdDsKLSAg
ICB9Ci0gIH0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLWZ1bmN0aW9uIERTTChuYW1lKSB7
Ci0gIHRoaXMucGFyZW50ID0gbmFtZTsKLSAgdGhpcy5tYXRjaGVzID0gW107Ci19Ci0KLURTTC5w
cm90b3R5cGUgPSB7Ci0gIHJlc291cmNlOiBmdW5jdGlvbihuYW1lLCBvcHRpb25zLCBjYWxsYmFj
aykgewotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09
PSAnZnVuY3Rpb24nKSB7Ci0gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7Ci0gICAgICBvcHRpb25z
ID0ge307Ci0gICAgfQotCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAg
IG9wdGlvbnMgPSB7fTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZW9mIG9wdGlvbnMucGF0aCAhPT0g
J3N0cmluZycpIHsKLSAgICAgIG9wdGlvbnMucGF0aCA9ICIvIiArIG5hbWU7Ci0gICAgfQotCi0g
ICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICB2YXIgZHNsID0gbmV3IERTTChuYW1lKTsKLSAgICAg
IHJvdXRlKGRzbCwgJ2xvYWRpbmcnKTsKLSAgICAgIHJvdXRlKGRzbCwgJ2Vycm9yJywgeyBwYXRo
OiAiL191bnVzZWRfZHVtbXlfZXJyb3JfcGF0aF9yb3V0ZV8iICsgbmFtZSArICIvOmVycm9yIiB9
KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsKLSAgICAgIHRoaXMucHVzaChvcHRpb25zLnBh
dGgsIG5hbWUsIGRzbC5nZW5lcmF0ZSgpLCBvcHRpb25zLnF1ZXJ5UGFyYW1zKTsKLSAgICB9IGVs
c2UgewotICAgICAgdGhpcy5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9ucy5x
dWVyeVBhcmFtcyk7Ci0gICAgfQotCi0KLSAgICAgIH0sCi0KLSAgcHVzaDogZnVuY3Rpb24odXJs
LCBuYW1lLCBjYWxsYmFjaywgcXVlcnlQYXJhbXMpIHsKLSAgICB2YXIgcGFydHMgPSBuYW1lLnNw
bGl0KCcuJyk7Ci0gICAgaWYgKHVybCA9PT0gIiIgfHwgdXJsID09PSAiLyIgfHwgcGFydHNbcGFy
dHMubGVuZ3RoLTFdID09PSAiaW5kZXgiKSB7IHRoaXMuZXhwbGljaXRJbmRleCA9IHRydWU7IH0K
LQotICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmwsIG5hbWUsIGNhbGxiYWNrLCBxdWVyeVBhcmFt
c10pOwotICB9LAotCi0gIHJvdXRlOiBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7Ci0gICAgcm91
dGUodGhpcywgbmFtZSwgb3B0aW9ucyk7Ci0gICAgICB9LAotCi0gIGdlbmVyYXRlOiBmdW5jdGlv
bigpIHsKLSAgICB2YXIgZHNsTWF0Y2hlcyA9IHRoaXMubWF0Y2hlczsKLQotICAgIGlmICghdGhp
cy5leHBsaWNpdEluZGV4KSB7Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIsIHsgcGF0aDogIi8i
IH0pOwotICAgIH0KLQotICAgIHJldHVybiBmdW5jdGlvbihtYXRjaCkgewotICAgICAgZm9yICh2
YXIgaT0wLCBsPWRzbE1hdGNoZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgZHNs
TWF0Y2ggPSBkc2xNYXRjaGVzW2ldOwotICAgICAgICB2YXIgbWF0Y2hPYmogPSBtYXRjaChkc2xN
YXRjaFswXSkudG8oZHNsTWF0Y2hbMV0sIGRzbE1hdGNoWzJdKTsKLSAgICAgICAgICAgICAgfQot
ICAgIH07Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIHJvdXRlKGRzbCwgbmFtZSwgb3B0aW9ucykgewot
ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBgdGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5
cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nKTsKLQotICBvcHRpb25zID0gb3B0aW9ucyB8fCB7
fTsKLQotICBpZiAodHlwZW9mIG9wdGlvbnMucGF0aCAhPT0gJ3N0cmluZycpIHsKLSAgICBvcHRp
b25zLnBhdGggPSAiLyIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKGRzbC5wYXJlbnQgJiYgZHNsLnBh
cmVudCAhPT0gJ2FwcGxpY2F0aW9uJykgewotICAgIG5hbWUgPSBkc2wucGFyZW50ICsgIi4iICsg
bmFtZTsKLSAgfQotCi0gIGRzbC5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9u
cy5xdWVyeVBhcmFtcyk7Ci19Ci0KLURTTC5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICB2
YXIgZHNsID0gbmV3IERTTCgpOwotICBjYWxsYmFjay5jYWxsKGRzbCk7Ci0gIHJldHVybiBkc2w7
Ci19OwotCi1FbWJlci5Sb3V0ZXJEU0wgPSBEU0w7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0OwotCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1
bGUgZW1iZXItcm91dGluZwotKi8KLQotLyoqCi0KLSAgRmluZHMgYSBjb250cm9sbGVyIGluc3Rh
bmNlLgotCi0gIEBmb3IgRW1iZXIKLSAgQG1ldGhvZCBjb250cm9sbGVyRm9yCi0gIEBwcml2YXRl
Ci0qLwotRW1iZXIuY29udHJvbGxlckZvciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxl
ck5hbWUsIGxvb2t1cE9wdGlvbnMpIHsKLSAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRy
b2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lLCBsb29rdXBPcHRpb25zKTsKLX07Ci0KLS8qKgotICBH
ZW5lcmF0ZXMgYSBjb250cm9sbGVyIGZhY3RvcnkKLQotICBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJh
dGVkIGNvbnRyb2xsZXIgZmFjdG9yeSBpcyBkZXJpdmVkCi0gIGZyb20gdGhlIGNvbnRleHQuIElm
IHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IGFuIGFycmF5IGNvbnRyb2xsZXIKLSAgaXMgZ2VuZXJh
dGVkLCBpZiBhbiBvYmplY3QsIGFuIG9iamVjdCBjb250cm9sbGVyIG90aGVyd2lzZSwgYSBiYXNp
YwotICBjb250cm9sbGVyIGlzIGdlbmVyYXRlZC4KLQotICBZb3UgY2FuIGN1c3RvbWl6ZSB5b3Vy
IGdlbmVyYXRlZCBjb250cm9sbGVycyBieSBkZWZpbmluZwotICBgQXBwLk9iamVjdENvbnRyb2xs
ZXJgIG9yIGBBcHAuQXJyYXlDb250cm9sbGVyYC4KLQotICBAZm9yIEVtYmVyCi0gIEBtZXRob2Qg
Z2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeQotICBAcHJpdmF0ZQotKi8KLUVtYmVyLmdlbmVyYXRl
Q29udHJvbGxlckZhY3RvcnkgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBj
b250ZXh0KSB7Ci0gIHZhciBGYWN0b3J5LCBmdWxsTmFtZSwgaW5zdGFuY2UsIG5hbWUsIGZhY3Rv
cnlOYW1lLCBjb250cm9sbGVyVHlwZTsKLQotICBpZiAoY29udGV4dCAmJiBFbWJlci5pc0FycmF5
KGNvbnRleHQpKSB7Ci0gICAgY29udHJvbGxlclR5cGUgPSAnYXJyYXknOwotICB9IGVsc2UgaWYg
KGNvbnRleHQpIHsKLSAgICBjb250cm9sbGVyVHlwZSA9ICdvYmplY3QnOwotICB9IGVsc2Ugewot
ICAgIGNvbnRyb2xsZXJUeXBlID0gJ2Jhc2ljJzsKLSAgfQotCi0gIGZhY3RvcnlOYW1lID0gJ2Nv
bnRyb2xsZXI6JyArIGNvbnRyb2xsZXJUeXBlOwotCi0gIEZhY3RvcnkgPSBjb250YWluZXIubG9v
a3VwRmFjdG9yeShmYWN0b3J5TmFtZSkuZXh0ZW5kKHsKLSAgICBpc0dlbmVyYXRlZDogdHJ1ZSwK
LSAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gIihnZW5lcmF0ZWQgIiAr
IGNvbnRyb2xsZXJOYW1lICsgIiBjb250cm9sbGVyKSI7Ci0gICAgfQotICB9KTsKLQotICBmdWxs
TmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZTsKLQotICBjb250YWluZXIucmVn
aXN0ZXIoZnVsbE5hbWUsICBGYWN0b3J5KTsKLQotICByZXR1cm4gRmFjdG9yeTsKLX07Ci0KLS8q
KgotICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRlcyBhIGNvbnRyb2xsZXIuCi0KLSAgVGhlIHR5
cGUgb2YgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZhY3RvcnkgaXMgZGVyaXZlZAotICBmcm9t
IHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBhbiBhcnJheSBhbiBhcnJheSBjb250cm9s
bGVyCi0gIGlzIGdlbmVyYXRlZCwgaWYgYW4gb2JqZWN0LCBhbiBvYmplY3QgY29udHJvbGxlciBv
dGhlcndpc2UsIGEgYmFzaWMKLSAgY29udHJvbGxlciBpcyBnZW5lcmF0ZWQuCi0KLSAgQGZvciBF
bWJlcgotICBAbWV0aG9kIGdlbmVyYXRlQ29udHJvbGxlcgotICBAcHJpdmF0ZQotKi8KLUVtYmVy
LmdlbmVyYXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUs
IGNvbnRleHQpIHsKLSAgRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeShjb250YWluZXIs
IGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KTsKLSAgdmFyIGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6
JyArIGNvbnRyb2xsZXJOYW1lOwotICB2YXIgaW5zdGFuY2UgPSBjb250YWluZXIubG9va3VwKGZ1
bGxOYW1lKTsKLQotICBpZiAoZ2V0KGluc3RhbmNlLCAnbmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VO
RVJBVElPTicpKSB7Ci0gICAgRW1iZXIuTG9nZ2VyLmluZm8oImdlbmVyYXRlZCAtPiAiICsgZnVs
bE5hbWUsIHsgZnVsbE5hbWU6IGZ1bGxOYW1lIH0pOwotICB9Ci0KLSAgcmV0dXJuIGluc3RhbmNl
OwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgUm91dGVyID0gcmVxdWlyZU1vZHVs
ZSgicm91dGVyIilbJ2RlZmF1bHQnXTsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLXZhciBkZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3BlcnR5OwotdmFyIHNs
aWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwotCi12YXIgRGVmYXVsdFZpZXcgPSBFbWJlci5f
TWV0YW1vcnBoVmlldzsKLS8qKgotICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0
aGUgYXBwbGljYXRpb24gc3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCi0gIHRoZSBbcm91dGluZyBn
dWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy9yb3V0aW5nLykgZm9yIGRvY3VtZW50YXRp
b24uCi0KLSAgQGNsYXNzIFJvdXRlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVt
YmVyLk9iamVjdAotKi8KLUVtYmVyLlJvdXRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIu
RXZlbnRlZCwgewotICAvKioKLSAgICBUaGUgYGxvY2F0aW9uYCBwcm9wZXJ0eSBkZXRlcm1pbmVz
IHRoZSB0eXBlIG9mIFVSTCdzIHRoYXQgeW91cgotICAgIGFwcGxpY2F0aW9uIHdpbGwgdXNlLgot
Ci0gICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbiB0eXBlcyBhcmUgY3VycmVudGx5IGF2YWlsYWJs
ZToKLQotICAgICogYGhhc2hgCi0gICAgKiBgaGlzdG9yeWAKLSAgICAqIGBub25lYAotCi0gICAg
QHByb3BlcnR5IGxvY2F0aW9uCi0gICAgQGRlZmF1bHQgJ2hhc2gnCi0gICAgQHNlZSB7RW1iZXIu
TG9jYXRpb259Ci0gICovCi0gIGxvY2F0aW9uOiAnaGFzaCcsCi0KLSAgaW5pdDogZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5yb3V0ZXIgPSB0aGlzLmNvbnN0cnVjdG9yLnJvdXRlciB8fCB0aGlzLmNv
bnN0cnVjdG9yLm1hcChFbWJlci5LKTsKLSAgICB0aGlzLl9hY3RpdmVWaWV3cyA9IHt9OwotICAg
IHRoaXMuX3NldHVwTG9jYXRpb24oKTsKLQotICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZS5M
T0dfVFJBTlNJVElPTlNfSU5URVJOQUwnKSkgewotICAgICAgdGhpcy5yb3V0ZXIubG9nID0gRW1i
ZXIuTG9nZ2VyLmRlYnVnOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBSZXByZXNlbnRzIHRo
ZSBjdXJyZW50IFVSTC4KLQotICAgIEBtZXRob2QgdXJsCi0gICAgQHJldHVybnMge1N0cmluZ30g
VGhlIGN1cnJlbnQgVVJMLgotICAqLwotICB1cmw6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0aW9uJykuZ2V0VVJMKCk7Ci0gIH0pLAotCi0g
IC8qKgotICAgIEluaXRpYWxpemVzIHRoZSBjdXJyZW50IHJvdXRlciBpbnN0YW5jZSBhbmQgc2V0
cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCi0gICAgZXZlbnQgbGlzdGVuZXJzIHVzZWQgYnkgdGhl
IGluc3RhbmNlcyBgbG9jYXRpb25gIGltcGxlbWVudGF0aW9uLgotCi0gICAgQG1ldGhvZCBzdGFy
dFJvdXRpbmcKLSAgICBAcHJpdmF0ZQotICAqLwotICBzdGFydFJvdXRpbmc6IGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMucm91dGVyID0gdGhpcy5yb3V0ZXIgfHwgdGhpcy5jb25zdHJ1Y3Rvci5tYXAo
RW1iZXIuSyk7Ci0KLSAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXIsCi0gICAgICAgIGxvY2F0
aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAotICAgICAgICBjb250YWluZXIgPSB0aGlzLmNv
bnRhaW5lciwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICB0aGlzLl9zZXR1cFJvdXRlcihy
b3V0ZXIsIGxvY2F0aW9uKTsKLQotICAgIGNvbnRhaW5lci5yZWdpc3RlcigndmlldzpkZWZhdWx0
JywgRGVmYXVsdFZpZXcpOwotICAgIGNvbnRhaW5lci5yZWdpc3Rlcigndmlldzp0b3BsZXZlbCcs
IEVtYmVyLlZpZXcuZXh0ZW5kKCkpOwotCi0gICAgbG9jYXRpb24ub25VcGRhdGVVUkwoZnVuY3Rp
b24odXJsKSB7Ci0gICAgICBzZWxmLmhhbmRsZVVSTCh1cmwpOwotICAgIH0pOwotCi0gICAgdGhp
cy5oYW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkpOwotICB9LAotCi0gIC8qKgotICAgIEhhbmRs
ZXMgdXBkYXRpbmcgdGhlIHBhdGhzIGFuZCBub3RpZnlpbmcgYW55IGxpc3RlbmVycyBvZiB0aGUg
VVJMCi0gICAgY2hhbmdlLgotCi0gICAgVHJpZ2dlcnMgdGhlIHJvdXRlciBsZXZlbCBgZGlkVHJh
bnNpdGlvbmAgaG9vay4KLQotICAgIEBtZXRob2QgZGlkVHJhbnNpdGlvbgotICAgIEBwcml2YXRl
Ci0gICovCi0gIGRpZFRyYW5zaXRpb246IGZ1bmN0aW9uKGluZm9zKSB7Ci0gICAgdXBkYXRlUGF0
aHModGhpcyk7Ci0KLSAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKLQotICAgIHRoaXMu
bm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3VybCcpOwotCi0gICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1
bmxvb3Agc28gdXJsIHdpbGwgYmUgYWNjdXJhdGUuIFNlZW1zCi0gICAgLy8gbGVzcyBzdXJwcmlz
aW5nIHRoYW4gZGlkVHJhbnNpdGlvbiBiZWluZyBvdXQgb2Ygc3luYy4KLSAgICBFbWJlci5ydW4u
b25jZSh0aGlzLCB0aGlzLnRyaWdnZXIsICdkaWRUcmFuc2l0aW9uJyk7Ci0KLSAgICBpZiAoZ2V0
KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJVElPTlMpIHsKLSAgICAgIEVtYmVyLkxvZ2dl
ci5sb2coIlRyYW5zaXRpb25lZCBpbnRvICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5m
b3MpICsgIiciKTsKLSAgICB9Ci0gIH0sCi0KLSAgaGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsK
LSAgICByZXR1cm4gdGhpcy5fZG9UcmFuc2l0aW9uKCdoYW5kbGVVUkwnLCBbdXJsXSk7Ci0gIH0s
Ci0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5fZG9UcmFu
c2l0aW9uKCd0cmFuc2l0aW9uVG8nLCBhcmd1bWVudHMpOwotICB9LAotCi0gIGludGVybWVkaWF0
ZVRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yb3V0ZXIuaW50ZXJtZWRpYXRl
VHJhbnNpdGlvblRvLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOwotCi0gICAgdXBkYXRl
UGF0aHModGhpcyk7Ci0KLSAgICB2YXIgaW5mb3MgPSB0aGlzLnJvdXRlci5jdXJyZW50SGFuZGxl
ckluZm9zOwotICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZScpLkxPR19UUkFOU0lUSU9OUykg
ewotICAgICAgRW1iZXIuTG9nZ2VyLmxvZygiSW50ZXJtZWRpYXRlLXRyYW5zaXRpb25lZCBpbnRv
ICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgIiciKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLl9kb1RyYW5z
aXRpb24oJ3JlcGxhY2VXaXRoJywgYXJndW1lbnRzKTsKLSAgfSwKLQotICBnZW5lcmF0ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHVybCA9IHRoaXMucm91dGVyLmdlbmVyYXRlLmFwcGx5KHRoaXMu
cm91dGVyLCBhcmd1bWVudHMpOwotICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmZvcm1hdFVSTCh1
cmwpOwotICB9LAotCi0gIC8qKgotICAgIERldGVybWluZXMgaWYgdGhlIHN1cHBsaWVkIHJvdXRl
IGlzIGN1cnJlbnRseSBhY3RpdmUuCi0KLSAgICBAbWV0aG9kIGlzQWN0aXZlCi0gICAgQHBhcmFt
IHJvdXRlTmFtZQotICAgIEByZXR1cm5zIHtCb29sZWFufQotICAgIEBwcml2YXRlCi0gICovCi0g
IGlzQWN0aXZlOiBmdW5jdGlvbihyb3V0ZU5hbWUpIHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7Ci0gICAgcmV0dXJuIHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIGFyZ3VtZW50
cyk7Ci0gIH0sCi0KLSAgc2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHRoaXMu
cm91dGVyLnRyaWdnZXIuYXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRG9lcyB0aGlzIHJvdXRlciBpbnN0YW5jZSBoYXZlIHRoZSBnaXZlbiByb3V0ZS4K
LQotICAgIEBtZXRob2QgaGFzUm91dGUKLSAgICBAcmV0dXJucyB7Qm9vbGVhbn0KLSAgICBAcHJp
dmF0ZQotICAqLwotICBoYXNSb3V0ZTogZnVuY3Rpb24ocm91dGUpIHsKLSAgICByZXR1cm4gdGhp
cy5yb3V0ZXIuaGFzUm91dGUocm91dGUpOwotICB9LAotCi0gIC8qKgotICAgIFJlc2V0cyB0aGUg
c3RhdGUgb2YgdGhlIHJvdXRlciBieSBjbGVhcmluZyB0aGUgY3VycmVudCByb3V0ZQotICAgIGhh
bmRsZXJzIGFuZCBkZWFjdGl2YXRpbmcgdGhlbS4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhv
ZCByZXNldAotICAgKi8KLSAgcmVzZXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucm91dGVyLnJl
c2V0KCk7Ci0gIH0sCi0KLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCl7Ci0gICAgdmFyIGxvY2F0
aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpOwotICAgIGxvY2F0aW9uLmRlc3Ryb3koKTsKLQot
ICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgX2xvb2t1
cEFjdGl2ZVZpZXc6IGZ1bmN0aW9uKHRlbXBsYXRlTmFtZSkgewotICAgIHZhciBhY3RpdmUgPSB0
aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdOwotICAgIHJldHVybiBhY3RpdmUgJiYgYWN0
aXZlWzBdOwotICB9LAotCi0gIF9jb25uZWN0QWN0aXZlVmlldzogZnVuY3Rpb24odGVtcGxhdGVO
YW1lLCB2aWV3KSB7Ci0gICAgdmFyIGV4aXN0aW5nID0gdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxh
dGVOYW1lXTsKLQotICAgIGlmIChleGlzdGluZykgewotICAgICAgZXhpc3RpbmdbMF0ub2ZmKCd3
aWxsRGVzdHJveUVsZW1lbnQnLCB0aGlzLCBleGlzdGluZ1sxXSk7Ci0gICAgfQotCi0gICAgdmFy
IGRpc2Nvbm5lY3QgPSBmdW5jdGlvbigpIHsKLSAgICAgIGRlbGV0ZSB0aGlzLl9hY3RpdmVWaWV3
c1t0ZW1wbGF0ZU5hbWVdOwotICAgIH07Ci0KLSAgICB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0
ZU5hbWVdID0gW3ZpZXcsIGRpc2Nvbm5lY3RdOwotICAgIHZpZXcub25lKCd3aWxsRGVzdHJveUVs
ZW1lbnQnLCB0aGlzLCBkaXNjb25uZWN0KTsKLSAgfSwKLQotICBfc2V0dXBMb2NhdGlvbjogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAotICAg
ICAgICByb290VVJMID0gZ2V0KHRoaXMsICdyb290VVJMJyksCi0gICAgICAgIG9wdGlvbnMgPSB7
fTsKLQotICAgIGlmICh0eXBlb2Ygcm9vdFVSTCA9PT0gJ3N0cmluZycpIHsKLSAgICAgIG9wdGlv
bnMucm9vdFVSTCA9IHJvb3RVUkw7Ci0gICAgfQotCi0gICAgaWYgKCdzdHJpbmcnID09PSB0eXBl
b2YgbG9jYXRpb24pIHsKLSAgICAgIG9wdGlvbnMuaW1wbGVtZW50YXRpb24gPSBsb2NhdGlvbjsK
LSAgICAgIGxvY2F0aW9uID0gc2V0KHRoaXMsICdsb2NhdGlvbicsIEVtYmVyLkxvY2F0aW9uLmNy
ZWF0ZShvcHRpb25zKSk7Ci0gICAgfQotCi0gICAgLy8gZW5zdXJlIHRoYXQgaW5pdFN0YXRlIGlz
IGNhbGxlZCBBRlRFUiB0aGUgcm9vdFVSTCBpcyBzZXQgb24KLSAgICAvLyB0aGUgbG9jYXRpb24g
aW5zdGFuY2UKLSAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmluaXRTdGF0ZSA9PT0gJ2Z1bmN0aW9u
JykgeyBsb2NhdGlvbi5pbml0U3RhdGUoKTsgfQotICB9LAotCi0gIF9nZXRIYW5kbGVyRnVuY3Rp
b246IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWVuID0ge30sIGNvbnRhaW5lciA9IHRoaXMuY29u
dGFpbmVyLAotICAgICAgICBEZWZhdWx0Um91dGUgPSBjb250YWluZXIubG9va3VwRmFjdG9yeSgn
cm91dGU6YmFzaWMnKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICByZXR1cm4gZnVuY3Rp
b24obmFtZSkgewotICAgICAgdmFyIHJvdXRlTmFtZSA9ICdyb3V0ZTonICsgbmFtZSwKLSAgICAg
ICAgICBoYW5kbGVyID0gY29udGFpbmVyLmxvb2t1cChyb3V0ZU5hbWUpOwotCi0gICAgICBpZiAo
c2VlbltuYW1lXSkgeyByZXR1cm4gaGFuZGxlcjsgfQotCi0gICAgICBzZWVuW25hbWVdID0gdHJ1
ZTsKLQotICAgICAgaWYgKCFoYW5kbGVyKSB7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihy
b3V0ZU5hbWUsIERlZmF1bHRSb3V0ZS5leHRlbmQoKSk7Ci0gICAgICAgIGhhbmRsZXIgPSBjb250
YWluZXIubG9va3VwKHJvdXRlTmFtZSk7Ci0KLSAgICAgICAgaWYgKGdldChzZWxmLCAnbmFtZXNw
YWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7Ci0gICAgICAgICAgRW1iZXIuTG9nZ2VyLmlu
Zm8oImdlbmVyYXRlZCAtPiAiICsgcm91dGVOYW1lLCB7IGZ1bGxOYW1lOiByb3V0ZU5hbWUgfSk7
Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaGFuZGxlci5yb3V0ZU5hbWUgPSBuYW1lOwot
ICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfTsKLSAgfSwKLQotICBfc2V0dXBSb3V0ZXI6IGZ1
bmN0aW9uKHJvdXRlciwgbG9jYXRpb24pIHsKLSAgICB2YXIgbGFzdFVSTCwgZW1iZXJSb3V0ZXIg
PSB0aGlzOwotCi0gICAgcm91dGVyLmdldEhhbmRsZXIgPSB0aGlzLl9nZXRIYW5kbGVyRnVuY3Rp
b24oKTsKLQotICAgIHZhciBkb1VwZGF0ZVVSTCA9IGZ1bmN0aW9uKCkgewotICAgICAgbG9jYXRp
b24uc2V0VVJMKGxhc3RVUkwpOwotICAgIH07Ci0KLSAgICByb3V0ZXIudXBkYXRlVVJMID0gZnVu
Y3Rpb24ocGF0aCkgewotICAgICAgbGFzdFVSTCA9IHBhdGg7Ci0gICAgICBFbWJlci5ydW4ub25j
ZShkb1VwZGF0ZVVSTCk7Ci0gICAgfTsKLQotICAgIGlmIChsb2NhdGlvbi5yZXBsYWNlVVJMKSB7
Ci0gICAgICB2YXIgZG9SZXBsYWNlVVJMID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIGxvY2F0aW9u
LnJlcGxhY2VVUkwobGFzdFVSTCk7Ci0gICAgICB9OwotCi0gICAgICByb3V0ZXIucmVwbGFjZVVS
TCA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAgICAgbGFzdFVSTCA9IHBhdGg7Ci0gICAgICAgIEVt
YmVyLnJ1bi5vbmNlKGRvUmVwbGFjZVVSTCk7Ci0gICAgICB9OwotICAgIH0KLQotICAgIHJvdXRl
ci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24oaW5mb3MpIHsKLSAgICAgIGVtYmVyUm91dGVyLmRp
ZFRyYW5zaXRpb24oaW5mb3MpOwotICAgIH07Ci0gIH0sCi0KLSAgX2RvVHJhbnNpdGlvbjogZnVu
Y3Rpb24obWV0aG9kLCBhcmdzKSB7Ci0gICAgLy8gTm9ybWFsaXplIGJsYW5rIHJvdXRlIHRvIHJv
b3QgVVJMLgotICAgIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3MpOwotICAgIGFyZ3NbMF0gPSBhcmdz
WzBdIHx8ICcvJzsKLQotICAgIHZhciBwYXNzZWROYW1lID0gYXJnc1swXSwgbmFtZSwgc2VsZiA9
IHRoaXMsCi0gICAgICBpc1F1ZXJ5UGFyYW1zT25seSA9IGZhbHNlOwotCi0gICAgCi0gICAgaWYg
KCFpc1F1ZXJ5UGFyYW1zT25seSAmJiBwYXNzZWROYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSB7Ci0g
ICAgICBuYW1lID0gcGFzc2VkTmFtZTsKLSAgICB9IGVsc2UgaWYgKCFpc1F1ZXJ5UGFyYW1zT25s
eSkgewotICAgICAgaWYgKCF0aGlzLnJvdXRlci5oYXNSb3V0ZShwYXNzZWROYW1lKSkgewotICAg
ICAgICBuYW1lID0gYXJnc1swXSA9IHBhc3NlZE5hbWUgKyAnLmluZGV4JzsKLSAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgIG5hbWUgPSBwYXNzZWROYW1lOwotICAgICAgfQotCi0gICAgICBFbWJlci5h
c3NlcnQoIlRoZSByb3V0ZSAiICsgcGFzc2VkTmFtZSArICIgd2FzIG5vdCBmb3VuZCIsIHRoaXMu
cm91dGVyLmhhc1JvdXRlKG5hbWUpKTsKLSAgICB9Ci0KLSAgICB2YXIgdHJhbnNpdGlvblByb21p
c2UgPSB0aGlzLnJvdXRlclttZXRob2RdLmFwcGx5KHRoaXMucm91dGVyLCBhcmdzKTsKLQotICAg
IHRyYW5zaXRpb25Qcm9taXNlLnRoZW4obnVsbCwgZnVuY3Rpb24oZXJyb3IpIHsKLSAgICAgIGlm
IChlcnJvci5uYW1lID09PSAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKSB7Ci0gICAgICAgIEVtYmVy
LmFzc2VydCgiVGhlIFVSTCAnIiArIGVycm9yLm1lc3NhZ2UgKyAiJyBkaWQgbm90IG1hdGNoIGFu
eSByb3V0ZXMgaW4geW91ciBhcHBsaWNhdGlvbiIpOwotICAgICAgfQotICAgIH0sICdFbWJlcjog
Q2hlY2sgZm9yIFJvdXRlciB1bnJlY29nbml6ZWQgVVJMIGVycm9yJyk7Ci0KLSAgICAvLyBXZSB3
YW50IHRvIHJldHVybiB0aGUgY29uZmlndXJhYmxlIHByb21pc2Ugb2JqZWN0Ci0gICAgLy8gc28g
dGhhdCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gY2FuIHVzZSBgLm1ldGhvZCgpYCBvbiBpdCwK
LSAgICAvLyB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBleGlzdCBmb3Igbm9ybWFsIFJTVlAgcHJv
bWlzZXMuCi0gICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9taXNlOwotICB9LAotCi0gIF9zY2hlZHVs
ZUxvYWRpbmdFdmVudDogZnVuY3Rpb24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICB0
aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKLSAgICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9
IEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JvdXRlclRyYW5zaXRpb25zJywgdGhpcywgJ19maXJl
TG9hZGluZ0V2ZW50JywgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAotCi0gIF9maXJl
TG9hZGluZ0V2ZW50OiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgewotICAgIGlm
ICghdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbikgewotICAgICAgLy8gRG9uJ3QgZmlyZSBh
biBldmVudCBpZiB3ZSd2ZSBzaW5jZSBtb3ZlZCBvbiBmcm9tCi0gICAgICAvLyB0aGUgdHJhbnNp
dGlvbiB0aGF0IHB1dCB1cyBpbiBhIGxvYWRpbmcgc3RhdGUuCi0gICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICdsb2FkaW5nJywgdHJhbnNpdGlvbiwg
b3JpZ2luUm91dGUpOwotICB9LAotCi0gIF9jYW5jZWxMb2FkaW5nRXZlbnQ6IGZ1bmN0aW9uICgp
IHsKLSAgICBpZiAodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIpIHsKLSAgICAgIEVtYmVyLnJ1bi5j
YW5jZWwodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIpOwotICAgIH0KLSAgICB0aGlzLl9sb2FkaW5n
U3RhdGVUaW1lciA9IG51bGw7Ci0gIH0KLX0pOwotCi0vKioKLSAgSGVscGVyIGZ1bmN0aW9uIGZv
ciBpdGVyYXRpbmcgcm9vdC13YXJkLCBzdGFydGluZwotICBmcm9tIChidXQgbm90IGluY2x1ZGlu
ZykgdGhlIHByb3ZpZGVkIGBvcmlnaW5Sb3V0ZWAuCi0KLSAgUmV0dXJucyB0cnVlIGlmIHRoZSBs
YXN0IGNhbGxiYWNrIGZpcmVkIHJlcXVlc3RlZAotICB0byBidWJibGUgdXB3YXJkLgotCi0gIEBw
cml2YXRlCi0gKi8KLWZ1bmN0aW9uIGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFu
c2l0aW9uLCBjYWxsYmFjaykgewotICB2YXIgaGFuZGxlckluZm9zID0gdHJhbnNpdGlvbi5oYW5k
bGVySW5mb3MsCi0gICAgICBvcmlnaW5Sb3V0ZUZvdW5kID0gZmFsc2U7Ci0KLSAgZm9yICh2YXIg
aSA9IGhhbmRsZXJJbmZvcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgIHZhciBoYW5k
bGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAgcm91dGUgPSBoYW5kbGVySW5mby5o
YW5kbGVyOwotCi0gICAgaWYgKCFvcmlnaW5Sb3V0ZUZvdW5kKSB7Ci0gICAgICBpZiAob3JpZ2lu
Um91dGUgPT09IHJvdXRlKSB7Ci0gICAgICAgIG9yaWdpblJvdXRlRm91bmQgPSB0cnVlOwotICAg
ICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBo
YW5kbGVySW5mb3NbaSArIDFdLmhhbmRsZXIpICE9PSB0cnVlKSB7Ci0gICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUaGVzZSBnZXQgaW52b2tl
ZCB3aGVuIGFuIGFjdGlvbiBidWJibGVzIGFib3ZlIEFwcGxpY2F0aW9uUm91dGUKLS8vIGFuZCBh
cmUgbm90IG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlLgotdmFyIGRlZmF1bHRBY3Rpb25IYW5kbGVy
cyA9IHsKLQotICB3aWxsUmVzb2x2ZU1vZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcmlnaW5S
b3V0ZSkgewotICAgIG9yaWdpblJvdXRlLnJvdXRlci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJh
bnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAotCi0gIGVycm9yOiBmdW5jdGlvbihlcnJvciwg
dHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICAvLyBBdHRlbXB0IHRvIGZpbmQgYW4gYXBw
cm9wcmlhdGUgZXJyb3Igc3Vic3RhdGUgdG8gZW50ZXIuCi0gICAgdmFyIHJvdXRlciA9IG9yaWdp
blJvdXRlLnJvdXRlcjsKLQotICAgIHZhciB0cnlUb3BMZXZlbCA9IGZvckVhY2hSb3V0ZUFib3Zl
KG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBmdW5jdGlvbihyb3V0ZSwgY2hpbGRSb3V0ZSkgewot
ICAgICAgdmFyIGNoaWxkRXJyb3JSb3V0ZU5hbWUgPSBmaW5kQ2hpbGRSb3V0ZU5hbWUocm91dGUs
IGNoaWxkUm91dGUsICdlcnJvcicpOwotICAgICAgaWYgKGNoaWxkRXJyb3JSb3V0ZU5hbWUpIHsK
LSAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbyhjaGlsZEVycm9yUm91dGVO
YW1lLCBlcnJvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVl
OwotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExldmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3Ig
dG9wLWxldmVsIGVycm9yIHN0YXRlIHRvIGVudGVyLgotICAgICAgaWYgKHJvdXRlSGFzQmVlbkRl
ZmluZWQob3JpZ2luUm91dGUucm91dGVyLCAnYXBwbGljYXRpb25fZXJyb3InKSkgewotICAgICAg
ICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCdhcHBsaWNhdGlvbl9lcnJvcicsIGVy
cm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBE
b24ndCBmaXJlIGFuIGFzc2VydGlvbiBpZiB3ZSBmb3VuZCBhbiBlcnJvciBzdWJzdGF0ZS4KLSAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxl
IGxvYWRpbmcgcm91dGU6ICcgKyBlcnJvci5zdGFjayk7Ci0gIH0sCi0KLSAgbG9hZGluZzogZnVu
Y3Rpb24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICAvLyBBdHRlbXB0IHRvIGZpbmQg
YW4gYXBwcm9wcmlhdGUgbG9hZGluZyBzdWJzdGF0ZSB0byBlbnRlci4KLSAgICB2YXIgcm91dGVy
ID0gb3JpZ2luUm91dGUucm91dGVyOwotCi0gICAgdmFyIHRyeVRvcExldmVsID0gZm9yRWFjaFJv
dXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRpb24sIGZ1bmN0aW9uKHJvdXRlLCBjaGlsZFJv
dXRlKSB7Ci0gICAgICB2YXIgY2hpbGRMb2FkaW5nUm91dGVOYW1lID0gZmluZENoaWxkUm91dGVO
YW1lKHJvdXRlLCBjaGlsZFJvdXRlLCAnbG9hZGluZycpOwotCi0gICAgICBpZiAoY2hpbGRMb2Fk
aW5nUm91dGVOYW1lKSB7Ci0gICAgICAgIHJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8o
Y2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAg
ICAvLyBEb24ndCBidWJibGUgYWJvdmUgcGl2b3Qgcm91dGUuCi0gICAgICBpZiAodHJhbnNpdGlv
bi5waXZvdEhhbmRsZXIgIT09IHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
fQotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExldmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3Ig
dG9wLWxldmVsIGxvYWRpbmcgc3RhdGUgdG8gZW50ZXIuCi0gICAgICBpZiAocm91dGVIYXNCZWVu
RGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0ZXIsICdhcHBsaWNhdGlvbl9sb2FkaW5nJykpIHsKLSAg
ICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbygnYXBwbGljYXRpb25fbG9hZGlu
ZycpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlv
biBmaW5kQ2hpbGRSb3V0ZU5hbWUocGFyZW50Um91dGUsIG9yaWdpbmF0aW5nQ2hpbGRSb3V0ZSwg
bmFtZSkgewotICB2YXIgcm91dGVyID0gcGFyZW50Um91dGUucm91dGVyLAotICAgICAgY2hpbGRO
YW1lLAotICAgICAgdGFyZ2V0Q2hpbGRSb3V0ZU5hbWUgPSBvcmlnaW5hdGluZ0NoaWxkUm91dGUu
cm91dGVOYW1lLnNwbGl0KCcuJykucG9wKCksCi0gICAgICBuYW1lc3BhY2UgPSBwYXJlbnRSb3V0
ZS5yb3V0ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicgPyAnJyA6IHBhcmVudFJvdXRlLnJvdXRlTmFt
ZSArICcuJzsKLQotICAKLSAgLy8gU2Vjb25kLCB0cnkgZ2VuZXJhbCBsb2FkaW5nIHN0YXRlLCBl
LmcuICdsb2FkaW5nJwotICBjaGlsZE5hbWUgPSBuYW1lc3BhY2UgKyBuYW1lOwotICBpZiAocm91
dGVIYXNCZWVuRGVmaW5lZChyb3V0ZXIsIGNoaWxkTmFtZSkpIHsKLSAgICByZXR1cm4gY2hpbGRO
YW1lOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHJvdXRlSGFzQmVlbkRlZmluZWQocm91dGVyLCBuYW1l
KSB7Ci0gIHZhciBjb250YWluZXIgPSByb3V0ZXIuY29udGFpbmVyOwotICByZXR1cm4gcm91dGVy
Lmhhc1JvdXRlKG5hbWUpICYmCi0gICAgICAgICAoY29udGFpbmVyLmhhcygndGVtcGxhdGU6JyAr
IG5hbWUpIHx8IGNvbnRhaW5lci5oYXMoJ3JvdXRlOicgKyBuYW1lKSk7Ci19Ci0KLWZ1bmN0aW9u
IHRyaWdnZXJFdmVudChoYW5kbGVySW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFyZ3MpIHsKLSAgdmFy
IG5hbWUgPSBhcmdzLnNoaWZ0KCk7Ci0KLSAgaWYgKCFoYW5kbGVySW5mb3MpIHsKLSAgICBpZiAo
aWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNh
bid0IHRyaWdnZXIgYWN0aW9uICciICsgbmFtZSArICInIGJlY2F1c2UgeW91ciBhcHAgaGFzbid0
IGZpbmlzaGVkIHRyYW5zaXRpb25pbmcgaW50byBpdHMgZmlyc3Qgcm91dGUuIFRvIHRyaWdnZXIg
YW4gYWN0aW9uIG9uIGRlc3RpbmF0aW9uIHJvdXRlcyBkdXJpbmcgYSB0cmFuc2l0aW9uLCB5b3Ug
Y2FuIGNhbGwgYC5zZW5kKClgIG9uIHRoZSBgVHJhbnNpdGlvbmAgb2JqZWN0IHBhc3NlZCB0byB0
aGUgYG1vZGVsL2JlZm9yZU1vZGVsL2FmdGVyTW9kZWxgIGhvb2tzLiIpOwotICB9Ci0KLSAgdmFy
IGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0gIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3Mu
bGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVy
SW5mb3NbaV0sCi0gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAg
aWYgKGhhbmRsZXIuX2FjdGlvbnMgJiYgaGFuZGxlci5fYWN0aW9uc1tuYW1lXSkgewotICAgICAg
aWYgKGhhbmRsZXIuX2FjdGlvbnNbbmFtZV0uYXBwbHkoaGFuZGxlciwgYXJncykgPT09IHRydWUp
IHsKLSAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZGVmYXVsdEFjdGlvbkhh
bmRsZXJzW25hbWVdKSB7Ci0gICAgZGVmYXVsdEFjdGlvbkhhbmRsZXJzW25hbWVdLmFwcGx5KG51
bGwsIGFyZ3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghZXZlbnRXYXNIYW5kbGVkICYm
ICFpZ25vcmVGYWlsdXJlKSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJOb3RoaW5nIGhh
bmRsZWQgdGhlIGFjdGlvbiAnIiArIG5hbWUgKyAiJy4gSWYgeW91IGRpZCBoYW5kbGUgdGhlIGFj
dGlvbiwgdGhpcyBlcnJvciBjYW4gYmUgY2F1c2VkIGJ5IHJldHVybmluZyB0cnVlIGZyb20gYW4g
YWN0aW9uIGhhbmRsZXIgaW4gYSBjb250cm9sbGVyLCBjYXVzaW5nIHRoZSBhY3Rpb24gdG8gYnVi
YmxlLiIpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHVwZGF0ZVBhdGhzKHJvdXRlcikgewotICB2YXIg
YXBwQ29udHJvbGxlciA9IHJvdXRlci5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOmFwcGxp
Y2F0aW9uJyk7Ci0KLSAgaWYgKCFhcHBDb250cm9sbGVyKSB7Ci0gICAgLy8gYXBwQ29udHJvbGxl
ciBtaWdodCBub3QgZXhpc3Qgd2hlbiB0b3AtbGV2ZWwgbG9hZGluZy9lcnJvcgotICAgIC8vIHN1
YnN0YXRlcyBoYXZlIGJlZW4gZW50ZXJlZCBzaW5jZSBBcHBsaWNhdGlvblJvdXRlIGhhc24ndAot
ICAgIC8vIGFjdHVhbGx5IGJlZW4gZW50ZXJlZCBhdCB0aGF0IHBvaW50LgotICAgIHJldHVybjsK
LSAgfQotCi0gIHZhciBpbmZvcyA9IHJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcywK
LSAgICAgIHBhdGggPSBFbWJlci5Sb3V0ZXIuX3JvdXRlUGF0aChpbmZvcyk7Ci0KLSAgaWYgKCEo
J2N1cnJlbnRQYXRoJyBpbiBhcHBDb250cm9sbGVyKSkgewotICAgIGRlZmluZVByb3BlcnR5KGFw
cENvbnRyb2xsZXIsICdjdXJyZW50UGF0aCcpOwotICB9Ci0KLSAgc2V0KGFwcENvbnRyb2xsZXIs
ICdjdXJyZW50UGF0aCcsIHBhdGgpOwotCi0gIGlmICghKCdjdXJyZW50Um91dGVOYW1lJyBpbiBh
cHBDb250cm9sbGVyKSkgewotICAgIGRlZmluZVByb3BlcnR5KGFwcENvbnRyb2xsZXIsICdjdXJy
ZW50Um91dGVOYW1lJyk7Ci0gIH0KLQotICBzZXQoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0
ZU5hbWUnLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAxXS5uYW1lKTsKLX0KLQotRW1iZXIuUm91dGVy
LnJlb3BlbkNsYXNzKHsKLSAgcm91dGVyOiBudWxsLAotICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNr
KSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOwotICAgIGlmICghcm91dGVyKSB7Ci0g
ICAgICByb3V0ZXIgPSBuZXcgUm91dGVyKCk7Ci0gICAgICByb3V0ZXIuY2FsbGJhY2tzID0gW107
Ci0gICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0gdHJpZ2dlckV2ZW50OwotICAgICAgdGhpcy5y
ZW9wZW5DbGFzcyh7IHJvdXRlcjogcm91dGVyIH0pOwotICAgIH0KLQotICAgIHZhciBkc2wgPSBF
bWJlci5Sb3V0ZXJEU0wubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgnYXBw
bGljYXRpb24nLCB7IHBhdGg6ICIvIiB9LCBmdW5jdGlvbigpIHsKLSAgICAgICAgZm9yICh2YXIg
aT0wOyBpIDwgcm91dGVyLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHJvdXRl
ci5jYWxsYmFja3NbaV0uY2FsbCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5j
YWxsKHRoaXMpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICByb3V0ZXIuY2FsbGJhY2tzLnB1
c2goY2FsbGJhY2spOwotICAgIHJvdXRlci5tYXAoZHNsLmdlbmVyYXRlKCkpOwotICAgIHJldHVy
biByb3V0ZXI7Ci0gIH0sCi0KLSAgX3JvdXRlUGF0aDogZnVuY3Rpb24oaGFuZGxlckluZm9zKSB7
Ci0gICAgdmFyIHBhdGggPSBbXTsKLQotICAgIC8vIFdlIGhhdmUgdG8gaGFuZGxlIGNvYWxlc2Np
bmcgcmVzb3VyY2UgbmFtZXMgdGhhdAotICAgIC8vIGFyZSBwcmVmaXhlZCB3aXRoIHRoZWlyIHBh
cmVudCdzIG5hbWVzLCBlLmcuCi0gICAgLy8gWydmb28nLCAnZm9vLmJhci5iYXonXSA9PiAnZm9v
LmJhci5iYXonLCBub3QgJ2Zvby5mb28uYmFyLmJheicKLQotICAgIGZ1bmN0aW9uIGludGVyc2Vj
dGlvbk1hdGNoZXMoYTEsIGEyKSB7Ci0gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYTEubGVu
Z3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgewotICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaT0xLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgICB2YXIgbmFtZSA9IGhhbmRsZXJJbmZvc1tpXS5uYW1lLAotICAgICAg
ICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoIi4iKSwKLSAgICAgICAgICBvbGROYW1lUGFydHMg
PSBzbGljZS5jYWxsKHBhdGgpOwotCi0gICAgICB3aGlsZSAob2xkTmFtZVBhcnRzLmxlbmd0aCkg
ewotICAgICAgICBpZiAoaW50ZXJzZWN0aW9uTWF0Y2hlcyhvbGROYW1lUGFydHMsIG5hbWVQYXJ0
cykpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lUGFydHMu
c2hpZnQoKTsKLSAgICAgIH0KLQotICAgICAgcGF0aC5wdXNoLmFwcGx5KHBhdGgsIG5hbWVQYXJ0
cy5zbGljZShvbGROYW1lUGFydHMubGVuZ3RoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhdGgu
am9pbigiLiIpOwotICB9Ci19KTsKLQotUm91dGVyLlRyYW5zaXRpb24ucHJvdG90eXBlLnNlbmQg
PSBSb3V0ZXIuVHJhbnNpdGlvbi5wcm90b3R5cGUudHJpZ2dlcjsKLQotCi0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91
dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAotICAgIGdl
dFByb3BlcnRpZXMgPSBFbWJlci5nZXRQcm9wZXJ0aWVzLAotICAgIGNsYXNzaWZ5ID0gRW1iZXIu
U3RyaW5nLmNsYXNzaWZ5LAotICAgIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgYV9mb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCi0gICAgYV9yZXBsYWNlID0gRW1i
ZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2U7Ci0KLQotLyoqCi0gIFRoZSBgRW1iZXIuUm91dGVg
IGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGluZGl2aWR1YWwgcm91dGVzLiBSZWZlciB0bwotICB0
aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZv
ciBkb2N1bWVudGF0aW9uLgotCi0gIEBjbGFzcyBSb3V0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBleHRlbmRzIEVtYmVyLk9iamVjdAotICBAdXNlcyBFbWJlci5BY3Rpb25IYW5kbGVyCi0qLwot
RW1iZXIuUm91dGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkFjdGlvbkhhbmRsZXIsIHsK
LQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQG1ldGhvZCBleGl0Ci0gICovCi0gIGV4aXQ6
IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGVhY3RpdmF0ZSgpOwotICAgIHRoaXMudGVhcmRvd25W
aWV3cygpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBAbWV0aG9kIGVudGVy
Ci0gICovCi0gIGVudGVyOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmFjdGl2YXRlKCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhlIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLCBrZXllZCBieSBuYW1l
LCBhdmFpbGFibGUgb24gdGhpcyByb3V0ZSBhcwotICAgIGFjdGlvbiB0YXJnZXRzLgotCi0gICAg
VGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9u
fX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBs
aWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2Fu
IGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdmlh
IGBSb3V0ZSNzZW5kYAotICAgIG9yIGBDb250cm9sbGVyI3NlbmRgLgotCi0gICAgVGhlIGBhY3Rp
b25zYCBoYXNoIHdpbGwgaW5oZXJpdCBhY3Rpb24gaGFuZGxlcnMgZnJvbQotICAgIHRoZSBgYWN0
aW9uc2AgaGFzaCBkZWZpbmVkIG9uIGV4dGVuZGVkIFJvdXRlIHBhcmVudCBjbGFzc2VzCi0gICAg
b3IgbWl4aW5zIHJhdGhlciB0aGFuIGp1c3QgcmVwbGFjZSB0aGUgZW50aXJlIGhhc2gsIGUuZy46
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5DYW5EaXNwbGF5QmFubmVyID0gRW1iZXIuTWl4aW4uY3Jl
YXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGlzcGxheUJhbm5lcjogZnVuY3Rpb24o
bXNnKSB7Ci0gICAgICAgICAgLy8gLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNhbkRpc3BsYXlC
YW5uZXIsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbigp
IHsKLSAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAg
Ly8gYFdlbGNvbWVSb3V0ZWAsIHdoZW4gYWN0aXZlLCB3aWxsIGJlIGFibGUgdG8gcmVzcG9uZAot
ICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2UgdGhlIGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQg
cmF0aGVyCi0gICAgLy8gdGhlbiByZXBsYWNlZCB3aGVuIGV4dGVuZGluZyBtaXhpbnMgLyBwYXJl
bnQgY2xhc3Nlcy4KLSAgICB0aGlzLnNlbmQoJ2Rpc3BsYXlCYW5uZXInKTsKLSAgICB0aGlzLnNl
bmQoJ3BsYXlNdXNpYycpOwotICAgIGBgYAotCi0gICAgV2l0aGluIGEgcm91dGUncyBhY3Rpb24g
aGFuZGxlciwgdGhlIHZhbHVlIG9mIHRoZSBgdGhpc2AgY29udGV4dAotICAgIGlzIHRoZSBSb3V0
ZSBvYmplY3Q6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Tb25nUm91dGUgPSBFbWJlci5Sb3V0ZS5l
eHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCJzb25nIik7Ci0gICAgICAgICAgdGhpcy50
cmFuc2l0aW9uVG8oIm90aGVyLnJvdXRlIik7Ci0gICAgICAgICAgLi4uCi0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2Fs
bCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KLSAgICBhY3Rpb24gaGFuZGxlciBpZiBp
dCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBwYXJlbnQKLSAgICBjbGFzcyBvciBt
aXhpbjoKLQotICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyByb3V0ZXM6Ci0KLSAg
ICBgYGBqcwotICAgIEFwcC5EZWJ1Z1JvdXRlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICAg
IGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgICBjb25zb2xlLmRlYnVnKCJ0cm9sb2xvIik7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRl
bmQoQXBwLkRlYnVnUm91dGUsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0
ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRl
YnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVidWdSb3V0ZQotICAgICAgICAg
IHRoaXMuX3N1cGVyKCk7Ci0KLSAgICAgICAgICAvLyBzaG93IGFkZGl0aW9uYWwgYW5ub3lhbmNl
Ci0gICAgICAgICAgd2luZG93LmFsZXJ0KC4uLik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9
KTsKLSAgICBgYGAKLQotICAgICMjIEJ1YmJsaW5nCi0KLSAgICBCeSBkZWZhdWx0LCBhbiBhY3Rp
b24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVyIGRlZmluZWQKLSAgICBvbiB0aGUg
YGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8gY29udGludWUgYnViYmxpbmcgdGhlIGFjdGlv
biwKLSAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVgIGZyb20gdGhlIGhhbmRsZXI6Ci0KLSAgICBg
YGBqcwotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJj
ZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yb3V0ZSgic29uZyIpOwotICAg
ICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuQWxidW1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9
IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxh
eWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgLy8gLi4uCi0KLSAgICAgICAgICBpZiAoYWN0
aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRSb3V0ZSkgewotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICAjIyBCdWlsdC1pbiBhY3Rpb25zCi0KLSAgICBUaGVyZSBhcmUgYSBmZXcgYnVp
bHQtaW4gYWN0aW9ucyBwZXJ0YWluaW5nIHRvIHRyYW5zaXRpb25zIHRoYXQgeW91Ci0gICAgY2Fu
IHVzZSB0byBjdXN0b21pemUgdHJhbnNpdGlvbiBiZWhhdmlvcjogYHdpbGxUcmFuc2l0aW9uYCBh
bmQKLSAgICBgZXJyb3JgLgotCi0gICAgIyMjIGB3aWxsVHJhbnNpdGlvbmAKLQotICAgIFRoZSBg
d2lsbFRyYW5zaXRpb25gIGFjdGlvbiBpcyBmaXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFueQot
ICAgIGF0dGVtcHRlZCB0cmFuc2l0aW9uIHdpdGggYSBgVHJhbnNpdGlvbmAgb2JqZWN0IGFzIHRo
ZSBzb2xlCi0gICAgYXJndW1lbnQuIFRoaXMgYWN0aW9uIGNhbiBiZSB1c2VkIGZvciBhYm9ydGlu
ZywgcmVkaXJlY3RpbmcsCi0gICAgb3IgZGVjb3JhdGluZyB0aGUgdHJhbnNpdGlvbiBmcm9tIHRo
ZSBjdXJyZW50bHkgYWN0aXZlIHJvdXRlcy4KLQotICAgIEEgZ29vZCBleGFtcGxlIGlzIHByZXZl
bnRpbmcgbmF2aWdhdGlvbiB3aGVuIGEgZm9ybSBpcwotICAgIGhhbGYtZmlsbGVkIG91dDoKLQot
ICAgIGBgYGpzCi0gICAgQXBwLkNvbnRhY3RGb3JtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rpb24odHJh
bnNpdGlvbikgewotICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0KCd1c2VySGFzRW50
ZXJlZERhdGEnKSkgewotICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRpc3BsYXlOYXZpZ2F0
aW9uQ29uZmlybSgpOwotICAgICAgICAgICAgdHJhbnNpdGlvbi5hYm9ydCgpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgWW91IGNhbiBh
bHNvIHJlZGlyZWN0IGVsc2V3aGVyZSBieSBjYWxsaW5nCi0gICAgYHRoaXMudHJhbnNpdGlvblRv
KCdlbHNld2hlcmUnKWAgZnJvbSB3aXRoaW4gYHdpbGxUcmFuc2l0aW9uYC4KLSAgICBOb3RlIHRo
YXQgYHdpbGxUcmFuc2l0aW9uYCB3aWxsIG5vdCBiZSBmaXJlZCBmb3IgdGhlCi0gICAgcmVkaXJl
Y3RpbmcgYHRyYW5zaXRpb25Ub2AsIHNpbmNlIGB3aWxsVHJhbnNpdGlvbmAgZG9lc24ndAotICAg
IGZpcmUgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgdHJhbnNpdGlvbiB1bmRlcndheS4gSWYgeW91
IHdhbnQKLSAgICBzdWJzZXF1ZW50IGB3aWxsVHJhbnNpdGlvbmAgYWN0aW9ucyB0byBmaXJlIGZv
ciB0aGUgcmVkaXJlY3RpbmcKLSAgICB0cmFuc2l0aW9uLCB5b3UgbXVzdCBmaXJzdCBleHBsaWNp
dGx5IGNhbGwKLSAgICBgdHJhbnNpdGlvbi5hYm9ydCgpYC4KLQotICAgICMjIyBgZXJyb3JgCi0K
LSAgICBXaGVuIGF0dGVtcHRpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIGEgcm91dGUsIGFueSBvZiB0
aGUgaG9va3MKLSAgICBtYXkgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMsIGF0IHdoaWNo
IHBvaW50IGFuIGBlcnJvcmAKLSAgICBhY3Rpb24gd2lsbCBiZSBmaXJlZCBvbiB0aGUgcGFydGlh
bGx5LWVudGVyZWQgcm91dGVzLCBhbGxvd2luZwotICAgIGZvciBwZXItcm91dGUgZXJyb3IgaGFu
ZGxpbmcgbG9naWMsIG9yIHNoYXJlZCBlcnJvciBoYW5kbGluZwotICAgIGxvZ2ljIGRlZmluZWQg
b24gYSBwYXJlbnQgcm91dGUuCi0KLSAgICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3Ig
aGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgIGZvciByZWplY3RlZCBwcm9taXNlcyBm
cm9tIHRoZSB2YXJpb3VzIGhvb2tzIG9uIHRoZSByb3V0ZSwKLSAgICBhcyB3ZWxsIGFzIGFueSB1
bmhhbmRsZWQgZXJyb3JzIGZyb20gY2hpbGQgcm91dGVzOgotCi0gICAgYGBganMKLSAgICBBcHAu
QWRtaW5Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBiZWZvcmVNb2RlbDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdCgiYmFkIHRoaW5ncyEi
KTsKLSAgICAgIH0sCi0KLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZXJyb3I6IGZ1bmN0aW9u
KGVycm9yLCB0cmFuc2l0aW9uKSB7Ci0gICAgICAgICAgLy8gQXNzdW1pbmcgd2UgZ290IGhlcmUg
ZHVlIHRvIHRoZSBlcnJvciBpbiBgYmVmb3JlTW9kZWxgLAotICAgICAgICAgIC8vIHdlIGNhbiBl
eHBlY3QgdGhhdCBlcnJvciA9PT0gImJhZCB0aGluZ3MhIiwKLSAgICAgICAgICAvLyBidXQgYSBw
cm9taXNlIG1vZGVsIHJlamVjdGluZyB3b3VsZCBhbHNvCi0gICAgICAgICAgLy8gY2FsbCB0aGlz
IGhvb2ssIGFzIHdvdWxkIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKLSAgICAgICAgICAvLyBpbiBg
YWZ0ZXJNb2RlbGAuCi0KLSAgICAgICAgICAvLyBUaGUgYGVycm9yYCBob29rIGlzIGFsc28gcHJv
dmlkZWQgdGhlIGZhaWxlZAotICAgICAgICAgIC8vIGB0cmFuc2l0aW9uYCwgd2hpY2ggY2FuIGJl
IHN0b3JlZCBhbmQgbGF0ZXIKLSAgICAgICAgICAvLyBgLnJldHJ5KClgZCBpZiBkZXNpcmVkLgot
Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2xvZ2luJyk7Ci0gICAgICAgIH0KLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIGBlcnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJsZSB1
cCBhbGwgdGhlIHdheSB0byBgQXBwbGljYXRpb25Sb3V0ZWAKLSAgICB3aWxsIGZpcmUgYSBkZWZh
dWx0IGVycm9yIGhhbmRsZXIgdGhhdCBsb2dzIHRoZSBlcnJvci4gWW91IGNhbgotICAgIHNwZWNp
ZnkgeW91ciBvd24gZ2xvYmFsIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBieSBvdmVycmlkaW5nIHRo
ZQotICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBwbGljYXRpb25Sb3V0ZWA6Ci0KLSAgICBgYGBq
cwotICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAg
IGFjdGlvbnM6IHsKLSAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yLCB0cmFuc2l0aW9uKSB7
Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCdiYW5uZXInKS5kaXNwbGF5RXJyb3IoZXJy
b3IubWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IEBwcm9wZXJ0eSBhY3Rpb25zCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IG51bGwKLSAg
Ki8KLSAgX2FjdGlvbnM6IHsKLSAgICBmaW5hbGl6ZVF1ZXJ5UGFyYW1DaGFuZ2U6IGZ1bmN0aW9u
KHBhcmFtcywgZmluYWxQYXJhbXMpIHsKLSAgICAgICAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QGRlcHJlY2F0ZWQKLQotICAgIFBsZWFzZSB1c2UgYGFjdGlvbnNgIGluc3RlYWQuCi0gICAgQG1l
dGhvZCBldmVudHMKLSAgKi8KLSAgZXZlbnRzOiBudWxsLAotCi0gIG1lcmdlZFByb3BlcnRpZXM6
IFsnZXZlbnRzJ10sCi0KLSAgLyoqCi0gICAgVGhpcyBob29rIGlzIGV4ZWN1dGVkIHdoZW4gdGhl
IHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMgcm91dGUuIEl0IGlzCi0gICAgbm90IGV4ZWN1
dGVkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgcm91dGUgY2hhbmdlcy4KLQotICAgIEBtZXRob2Qg
ZGVhY3RpdmF0ZQotICAqLwotICBkZWFjdGl2YXRlOiBFbWJlci5LLAotCi0gIC8qKgotICAgIFRo
aXMgaG9vayBpcyBleGVjdXRlZCB3aGVuIHRoZSByb3V0ZXIgZW50ZXJzIHRoZSByb3V0ZS4gSXQg
aXMgbm90IGV4ZWN1dGVkCi0gICAgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2Vz
LgotCi0gICAgQG1ldGhvZCBhY3RpdmF0ZQotICAqLwotICBhY3RpdmF0ZTogRW1iZXIuSywKLQot
ICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZS4gT3B0aW9uYWxseSBzdXBw
bHkgbW9kZWwocykgZm9yIHRoZQotICAgIHJvdXRlIGluIHF1ZXN0aW9uLiBJZiBtdWx0aXBsZSBt
b2RlbHMgYXJlIHN1cHBsaWVkIHRoZXkgd2lsbCBiZSBhcHBsaWVkCi0gICAgbGFzdCB0byBmaXJz
dCByZWN1cnNpdmVseSB1cCB0aGUgcmVzb3VyY2UgdHJlZSAoc2VlIE11bHRpcGxlIE1vZGVscyBF
eGFtcGxlCi0gICAgYmVsb3cpLiBUaGUgbW9kZWwocykgd2lsbCBiZSBzZXJpYWxpemVkIGludG8g
dGhlIFVSTCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICByb3V0ZSdzIGBzZXJpYWxpemVgIGhv
b2suIFNlZSBhbHNvICdyZXBsYWNlV2l0aCcuCi0KLSAgICBTaW1wbGUgVHJhbnNpdGlvbiBFeGFt
cGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOwotICAgICAgdGhpcy5yb3V0ZSgic2VjcmV0Iik7
Ci0gICAgICB0aGlzLnJvdXRlKCJmb3VyT2hGb3VyIiwgeyBwYXRoOiAiKjoifSk7Ci0gICAgfSk7
Ci0KLSAgICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rp
b25zOiB7Ci0gICAgICAgIG1vdmVUb1NlY3JldDogZnVuY3Rpb24oY29udGV4dCl7Ci0gICAgICAg
ICAgaWYgKGF1dGhvcml6ZWQoKSl7Ci0gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubygnc2Vj
cmV0JywgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9u
VG8oJ2ZvdXJPaEZvdXInKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAot
Ci0gICBUcmFuc2l0aW9uIHRvIGEgbmVzdGVkIHJvdXRlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAg
IEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICB0aGlzLnJlc291cmNlKCdhcnRpY2xl
cycsIHsgcGF0aDogJy9hcnRpY2xlcycgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICAgdGhpcy5yb3V0
ZSgnbmV3Jyk7Ci0gICAgIH0pOwotICAgfSk7Ci0KLSAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKLSAgICAgYWN0aW9uczogewotICAgICAgIHRyYW5zaXRpb25Ub05ld0Fy
dGljbGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2FydGljbGVz
Lm5ldycpOwotICAgICAgIH0KLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgIE11bHRpcGxl
IE1vZGVscyBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlJvdXRlci5tYXAo
ZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOwotICAgICAgdGhpcy5yZXNv
dXJjZSgnYnJlYWtmYXN0Jywge3BhdGg6JzpicmVha2Zhc3RJZCd9LCBmdW5jdGlvbigpewotICAg
ICAgICB0aGlzLnJlc291cmNlKCdjZXJlYWwnLCB7cGF0aDogJzpjZXJlYWxJZCd9KTsKLSAgICAg
IH0pOwotICAgIH0pOwotCi0gICAgQXBwLkluZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICBtb3ZlVG9DaG9jb2xhdGVDZXJlYWw6IGZ1bmN0
aW9uKCl7Ci0gICAgICAgICAgdmFyIGNlcmVhbCA9IHsgY2VyZWFsSWQ6ICJDaG9jb2xhdGVZdW1t
aW5lc3MifSwKLSAgICAgICAgICAgICAgYnJlYWtmYXN0ID0ge2JyZWFrZmFzdElkOiAiQ2VyZWFs
QW5kTWlsayJ9OwotCi0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2NlcmVhbCcsIGJyZWFr
ZmFzdCwgY2VyZWFsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgQG1ldGhv
ZCB0cmFuc2l0aW9uVG8KLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUg
cm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1
c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICovCi0gIHRyYW5z
aXRpb25UbzogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHZhciByb3V0ZXIgPSB0aGlz
LnJvdXRlcjsKLSAgICByZXR1cm4gcm91dGVyLnRyYW5zaXRpb25Uby5hcHBseShyb3V0ZXIsIGFy
Z3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUGVyZm9ybSBhIHN5bmNocm9ub3VzIHRyYW5z
aXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdpdGggb3V0IGF0dGVtcHRpbmcKLSAgICB0byByZXNv
bHZlIHByb21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1cnJlbnRseSBhY3Rp
dmUKLSAgICBhc3luY2hyb25vdXMgdHJhbnNpdGlvbnMgKGkuZS4gcmVndWxhciB0cmFuc2l0aW9u
cyBjYXVzZWQgYnkKLSAgICBgdHJhbnNpdGlvblRvYCBvciBVUkwgY2hhbmdlcykuCi0KLSAgICBU
aGlzIG1ldGhvZCBpcyBoYW5keSBmb3IgcGVyZm9ybWluZyBpbnRlcm1lZGlhdGUgdHJhbnNpdGlv
bnMgb24gdGhlCi0gICAgd2F5IHRvIGEgZmluYWwgZGVzdGluYXRpb24gcm91dGUsIGFuZCBpcyBj
YWxsZWQgaW50ZXJuYWxseSBieSB0aGUKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0
aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRsZXJzLgotCi0gICAgQG1ldGhvZCBpbnRlcm1l
ZGlhdGVUcmFuc2l0aW9uVG8KLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0
aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBi
ZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICAqLwotICBp
bnRlcm1lZGlhdGVUcmFuc2l0aW9uVG86IGZ1bmN0aW9uKCkgewotICAgIHZhciByb3V0ZXIgPSB0
aGlzLnJvdXRlcjsKLSAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJv
dXRlciwgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5v
dGhlciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4K
LSAgICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQg
b2YgYWRkaW5nIGEgbmV3IG9uZS4KLSAgICBCZXNpZGUgdGhhdCwgaXQgaXMgaWRlbnRpY2FsIHRv
IGB0cmFuc2l0aW9uVG9gIGluIGFsbCBvdGhlciByZXNwZWN0cy4gU2VlCi0gICAgJ3RyYW5zaXRp
b25UbycgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIG11bHRpcGxlIG1vZGVs
cy4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUm91dGVyLm1h
cChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucm91dGUoImluZGV4Iik7Ci0gICAgICB0aGlzLnJv
dXRlKCJzZWNyZXQiKTsKLSAgICB9KTsKLQotICAgIEFwcC5TZWNyZXRSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7Ci0gICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYg
KCFhdXRob3JpemVkKCkpewotICAgICAgICAgIHRoaXMucmVwbGFjZVdpdGgoJ2luZGV4Jyk7Ci0g
ICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVwbGFj
ZVdpdGgKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAg
ICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxl
IHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICovCi0gIHJlcGxhY2VXaXRoOiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7Ci0gICAgcmV0dXJuIHJv
dXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgU2VuZHMgYW4gYWN0aW9uIHRvIHRoZSByb3V0ZXIsIHdoaWNoIHdpbGwgZGVsZWdhdGUg
aXQgdG8gdGhlIGN1cnJlbnRseQotICAgIGFjdGl2ZSByb3V0ZSBoaWVyYXJjaHkgcGVyIHRoZSBi
dWJibGluZyBydWxlcyBleHBsYWluZWQgdW5kZXIgYGFjdGlvbnNgLgotCi0gICAgRXhhbXBsZQot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAg
ICAgdGhpcy5yb3V0ZSgiaW5kZXgiKTsKLSAgICB9KTsKLQotICAgIEFwcC5BcHBsaWNhdGlvblJv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgdHJh
Y2s6IGZ1bmN0aW9uKGFyZykgewotICAgICAgICAgIGNvbnNvbGUubG9nKGFyZywgJ3dhcyBjbGlj
a2VkJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5JbmRleFJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgdHJhY2tJ
ZkRlYnVnOiBmdW5jdGlvbihhcmcpIHsKLSAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAg
ICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZW5kCi0gICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byB0cmlnZ2VyCi0gICAgQHBhcmFt
IHsuLi4qfSBhcmdzCi0gICovCi0gIHNlbmQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlz
LnJvdXRlci5zZW5kLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8q
KgotICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRlci5qcwotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0gICovCi0gIHNldHVwOiBmdW5jdGlvbihjb250
ZXh0LCBxdWVyeVBhcmFtcykgewotICAgIHZhciBjb250cm9sbGVyTmFtZSA9IHRoaXMuY29udHJv
bGxlck5hbWUgfHwgdGhpcy5yb3V0ZU5hbWUsCi0gICAgICAgIGNvbnRyb2xsZXIgPSB0aGlzLmNv
bnRyb2xsZXJGb3IoY29udHJvbGxlck5hbWUsIHRydWUpOwotICAgIGlmICghY29udHJvbGxlcikg
ewotICAgICAgY29udHJvbGxlciA9ICB0aGlzLmdlbmVyYXRlQ29udHJvbGxlcihjb250cm9sbGVy
TmFtZSwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gQXNzaWduIHRoZSByb3V0ZSdzIGNvbnRy
b2xsZXIgc28gdGhhdCBpdCBjYW4gbW9yZSBlYXNpbHkgYmUKLSAgICAvLyByZWZlcmVuY2VkIGlu
IGFjdGlvbiBoYW5kbGVycwotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0KLSAg
ICB2YXIgYXJncyA9IFtjb250cm9sbGVyLCBjb250ZXh0XTsKLQotICAgIAotICAgIGlmICh0aGlz
LnNldHVwQ29udHJvbGxlcnMpIHsKLSAgICAgIEVtYmVyLmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUu
c2V0dXBDb250cm9sbGVycyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnNl
dHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBtb2RlbCkgaW5zdGVhZC4iKTsKLSAgICAgIHRoaXMu
c2V0dXBDb250cm9sbGVycyhjb250cm9sbGVyLCBjb250ZXh0KTsKLSAgICB9IGVsc2UgewotICAg
ICAgdGhpcy5zZXR1cENvbnRyb2xsZXIuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotCi0gICAg
aWYgKHRoaXMucmVuZGVyVGVtcGxhdGVzKSB7Ci0gICAgICBFbWJlci5kZXByZWNhdGUoIkVtYmVy
LlJvdXRlLnJlbmRlclRlbXBsYXRlcyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJv
dXRlLnJlbmRlclRlbXBsYXRlKGNvbnRyb2xsZXIsIG1vZGVsKSBpbnN0ZWFkLiIpOwotICAgICAg
dGhpcy5yZW5kZXJUZW1wbGF0ZXMoY29udGV4dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMu
cmVuZGVyVGVtcGxhdGUuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBvcHRpb25hbGx5IHJlZGlyZWN0IHRvIGFu
b3RoZXIgcm91dGUuCi0KLSAgICBJZiB5b3UgY2FsbCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20g
aW5zaWRlIG9mIHRoaXMgaG9vaywgdGhpcyByb3V0ZQotICAgIHdpbGwgbm90IGJlIGVudGVyZWQg
aW4gZmF2b3Igb2YgdGhlIG90aGVyIGhvb2suCi0KLSAgICBOb3RlIHRoYXQgdGhpcyBob29rIGlz
IGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgotICAgIGBhZnRlck1vZGVs
YCwgc28gaWYgeW91IG92ZXJyaWRlIGBhZnRlck1vZGVsYCwgeW91IG11c3QgZWl0aGVyCi0gICAg
ZXhwbGljaXRseSBjYWxsIGByZWRpcmVjdGAgb3IganVzdCBwdXQgeW91ciByZWRpcmVjdGluZwot
ICAgIGB0aGlzLnRyYW5zaXRpb25UbygpYCBjYWxsIHdpdGhpbiBgYWZ0ZXJNb2RlbGAuCi0KLSAg
ICBAbWV0aG9kIHJlZGlyZWN0Ci0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCBm
b3IgdGhpcyByb3V0ZQotICAqLwotICByZWRpcmVjdDogRW1iZXIuSywKLQotICAvKioKLSAgICBU
aGlzIGhvb2sgaXMgdGhlIGZpcnN0IG9mIHRoZSByb3V0ZSBlbnRyeSB2YWxpZGF0aW9uIGhvb2tz
Ci0gICAgY2FsbGVkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHRyYW5zaXRpb24gaW50byBh
IHJvdXRlCi0gICAgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4gSXQgaXMgY2FsbGVkIGJlZm9yZSBg
bW9kZWxgIGFuZAotICAgIGBhZnRlck1vZGVsYCwgYW5kIGlzIGFwcHJvcHJpYXRlIGZvciBjYXNl
cyB3aGVuOgotCi0gICAgMSkgQSBkZWNpc2lvbiBjYW4gYmUgbWFkZSB0byByZWRpcmVjdCBlbHNl
d2hlcmUgd2l0aG91dAotICAgICAgIG5lZWRpbmcgdG8gcmVzb2x2ZSB0aGUgbW9kZWwgZmlyc3Qu
Ci0gICAgMikgQW55IGFzeW5jIG9wZXJhdGlvbnMgbmVlZCB0byBvY2N1ciBmaXJzdCBiZWZvcmUg
dGhlCi0gICAgICAgbW9kZWwgaXMgYXR0ZW1wdGVkIHRvIGJlIHJlc29sdmVkLgotCi0gICAgVGhp
cyBob29rIGlzIHByb3ZpZGVkIHRoZSBjdXJyZW50IGB0cmFuc2l0aW9uYCBhdHRlbXB0Ci0gICAg
YXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGAuYWJvcnQoKWAgdGhlIHRyYW5z
aXRpb24sCi0gICAgc2F2ZSBpdCBmb3IgYSBsYXRlciBgLnJldHJ5KClgLCBvciByZXRyaWV2ZSB2
YWx1ZXMgc2V0Ci0gICAgb24gaXQgZnJvbSBhIHByZXZpb3VzIGhvb2suIFlvdSBjYW4gYWxzbyBq
dXN0IGNhbGwKLSAgICBgdGhpcy50cmFuc2l0aW9uVG9gIHRvIGFub3RoZXIgcm91dGUgdG8gaW1w
bGljaXRseQotICAgIGFib3J0IHRoZSBgdHJhbnNpdGlvbmAuCi0KLSAgICBZb3UgY2FuIHJldHVy
biBhIHByb21pc2UgZnJvbSB0aGlzIGhvb2sgdG8gcGF1c2UgdGhlCi0gICAgdHJhbnNpdGlvbiB1
bnRpbCB0aGUgcHJvbWlzZSByZXNvbHZlcyAob3IgcmVqZWN0cykuIFRoaXMgY291bGQKLSAgICBi
ZSB1c2VmdWwsIGZvciBpbnN0YW5jZSwgZm9yIHJldHJpZXZpbmcgYXN5bmMgY29kZSBmcm9tCi0g
ICAgdGhlIHNlcnZlciB0aGF0IGlzIHJlcXVpcmVkIHRvIGVudGVyIGEgcm91dGUuCi0KLSAgICBg
YGBqcwotICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYmVm
b3JlTW9kZWw6IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsKLSAgICAgICAgaWYgKCFBcHAuUG9zdCkg
ewotICAgICAgICAgIHJldHVybiBFbWJlci4kLmdldFNjcmlwdCgnL21vZGVscy9wb3N0LmpzJyk7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIGBBcHAuUG9z
dGAgZG9lc24ndCBleGlzdCBpbiB0aGUgYWJvdmUgZXhhbXBsZSwKLSAgICBgYmVmb3JlTW9kZWxg
IHdpbGwgdXNlIGpRdWVyeSdzIGBnZXRTY3JpcHRgLCB3aGljaAotICAgIHJldHVybnMgYSBwcm9t
aXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNlcnZlciBoYXMKLSAgICBzdWNjZXNzZnVsbHkg
cmV0cmlldmVkIGFuZCBleGVjdXRlZCB0aGUgY29kZSBmcm9tIHRoZQotICAgIHNlcnZlci4gTm90
ZSB0aGF0IGlmIGFuIGVycm9yIHdlcmUgdG8gb2NjdXIsIGl0IHdvdWxkCi0gICAgYmUgcGFzc2Vk
IHRvIHRoZSBgZXJyb3JgIGhvb2sgb24gYEVtYmVyLlJvdXRlYCwgYnV0Ci0gICAgaXQncyBhbHNv
IHBvc3NpYmxlIHRvIGhhbmRsZSBlcnJvcnMgc3BlY2lmaWMgdG8KLSAgICBgYmVmb3JlTW9kZWxg
IHJpZ2h0IGZyb20gd2l0aGluIHRoZSBob29rICh0byBkaXN0aW5ndWlzaAotICAgIGZyb20gdGhl
IHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBvZiB0aGUgYGVycm9yYAotICAgIGhvb2sp
OgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK
LSAgICAgIGJlZm9yZU1vZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7Ci0gICAgICAgIGlmICgh
QXBwLlBvc3QpIHsKLSAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgICAgICAgcmV0dXJu
IEVtYmVyLiQuZ2V0U2NyaXB0KCdwb3N0LmpzJykudGhlbihudWxsLCBmdW5jdGlvbihlKSB7Ci0g
ICAgICAgICAgICBzZWxmLnRyYW5zaXRpb25UbygnaGVscCcpOwotCi0gICAgICAgICAgICAvLyBO
b3RlIHRoYXQgdGhlIGFib3ZlIHRyYW5zaXRpb25UbyB3aWxsIGltcGxpY2l0bHkKLSAgICAgICAg
ICAgIC8vIGhhbHQgdGhlIHRyYW5zaXRpb24uIElmIHlvdSB3ZXJlIHRvIHJldHVybgotICAgICAg
ICAgICAgLy8gbm90aGluZyBmcm9tIHRoaXMgcHJvbWlzZSByZWplY3QgaGFuZGxlciwKLSAgICAg
ICAgICAgIC8vIGFjY29yZGluZyB0byBwcm9taXNlIHNlbWFudGljcywgdGhhdCB3b3VsZAotICAg
ICAgICAgICAgLy8gY29udmVydCB0aGUgcmVqZWN0IGludG8gYSByZXNvbHZlIGFuZCB0aGUKLSAg
ICAgICAgICAgIC8vIHRyYW5zaXRpb24gd291bGQgY29udGludWUuIFRvIHByb3BhZ2F0ZSB0aGUK
LSAgICAgICAgICAgIC8vIGVycm9yIHNvIHRoYXQgaXQnZCBiZSBoYW5kbGVkIGJ5IHRoZSBgZXJy
b3JgCi0gICAgICAgICAgICAvLyBob29rLCB5b3Ugd291bGQgaGF2ZSB0byBlaXRoZXIKLSAgICAg
ICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdChlKTsKLSAgICAgICAgICAgIC8vIG9yCi0g
ICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGJlZm9yZU1vZGVsCi0gICAgQHBhcmFtIHtU
cmFuc2l0aW9ufSB0cmFuc2l0aW9uCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5UGFyYW1zIHRo
ZSBhY3RpdmUgcXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCi0gICAgQHJldHVybiB7UHJvbWlz
ZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBob29rIGlzCi0gICAgICBhIHByb21p
c2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAg
IHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1wcm9taXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAot
ICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4KLSAgKi8KLSAgYmVmb3JlTW9kZWw6IEVtYmVyLkss
Ci0KLSAgLyoqCi0gICAgVGhpcyBob29rIGlzIGNhbGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9k
ZWwgaGFzIHJlc29sdmVkLgotICAgIEl0IGZvbGxvd3MgaWRlbnRpY2FsIGFzeW5jL3Byb21pc2Ug
c2VtYW50aWNzIHRvIGBiZWZvcmVNb2RlbGAKLSAgICBidXQgaXMgcHJvdmlkZWQgdGhlIHJvdXRl
J3MgcmVzb2x2ZWQgbW9kZWwgaW4gYWRkaXRpb24gdG8KLSAgICB0aGUgYHRyYW5zaXRpb25gLCBh
bmQgaXMgdGhlcmVmb3JlIHN1aXRlZCB0byBwZXJmb3JtaW5nCi0gICAgbG9naWMgdGhhdCBjYW4g
b25seSB0YWtlIHBsYWNlIGFmdGVyIHRoZSBtb2RlbCBoYXMgYWxyZWFkeQotICAgIHJlc29sdmVk
LgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7
Ci0gICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbihwb3N0cywgdHJhbnNpdGlvbikgewotICAgICAg
ICBpZiAocG9zdHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3Quc2hvdycsIHBvc3RzWzBdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAg
IGBgYAotCi0gICAgUmVmZXIgdG8gZG9jdW1lbnRhdGlvbiBmb3IgYGJlZm9yZU1vZGVsYCBmb3Ig
YSBkZXNjcmlwdGlvbgotICAgIG9mIHRyYW5zaXRpb24tcGF1c2luZyBzZW1hbnRpY3Mgd2hlbiBh
IHByb21pc2UgaXMgcmV0dXJuZWQKLSAgICBmcm9tIHRoaXMgaG9vay4KLQotICAgIEBtZXRob2Qg
YWZ0ZXJNb2RlbAotICAgIEBwYXJhbSB7T2JqZWN0fSByZXNvbHZlZE1vZGVsIHRoZSB2YWx1ZSBy
ZXR1cm5lZCBmcm9tIGBtb2RlbGAsCi0gICAgICBvciBpdHMgcmVzb2x2ZWQgdmFsdWUgaWYgaXQg
d2FzIGEgcHJvbWlzZQotICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBw
YXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUgYWN0aXZlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhp
cyBoYW5kbGVyCi0gICAgQHJldHVybiB7UHJvbWlzZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZy
b20gdGhpcyBob29rIGlzCi0gICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1
c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAgIHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1w
cm9taXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAotICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4K
LSAgICovCi0gIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKHJlc29sdmVkTW9kZWwsIHRyYW5zaXRpb24s
IHF1ZXJ5UGFyYW1zKSB7Ci0gICAgdGhpcy5yZWRpcmVjdChyZXNvbHZlZE1vZGVsLCB0cmFuc2l0
aW9uKTsKLSAgfSwKLQotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNo
YW5nZWQgYnkgcm91dGVyLmpzLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGNvbnRleHRE
aWRDaGFuZ2UKLSAgKi8KLSAgY29udGV4dERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5jdXJyZW50TW9kZWwgPSB0aGlzLmNvbnRleHQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBob29r
IHlvdSBjYW4gaW1wbGVtZW50IHRvIGNvbnZlcnQgdGhlIFVSTCBpbnRvIHRoZSBtb2RlbCBmb3IK
LSAgICB0aGlzIHJvdXRlLgotCi0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlv
bigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9p
ZCd9KTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoZSBtb2RlbCBmb3IgdGhlIGBwb3N0YCBy
b3V0ZSBpcyBgQXBwLlBvc3QuZmluZChwYXJhbXMucG9zdF9pZClgLgotCi0gICAgQnkgZGVmYXVs
dCwgaWYgeW91ciByb3V0ZSBoYXMgYSBkeW5hbWljIHNlZ21lbnQgZW5kaW5nIGluIGBfaWRgOgot
Ci0gICAgKiBUaGUgbW9kZWwgY2xhc3MgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChg
cG9zdF9pZGAncwotICAgICAgY2xhc3MgaXMgYEFwcC5Qb3N0YCkKLSAgICAqIFRoZSBmaW5kIG1l
dGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVsIGNsYXNzIHdpdGggdGhlIHZhbHVlIG9mCi0gICAg
ICB0aGUgZHluYW1pYyBzZWdtZW50LgotCi0gICAgTm90ZSB0aGF0IGZvciByb3V0ZXMgd2l0aCBk
eW5hbWljIHNlZ21lbnRzLCB0aGlzIGhvb2sgaXMgb25seQotICAgIGV4ZWN1dGVkIHdoZW4gZW50
ZXJlZCB2aWEgdGhlIFVSTC4gSWYgdGhlIHJvdXRlIGlzIGVudGVyZWQKLSAgICB0aHJvdWdoIGEg
dHJhbnNpdGlvbiAoZS5nLiB3aGVuIHVzaW5nIHRoZSBgbGluay10b2AgSGFuZGxlYmFycwotICAg
IGhlbHBlciksIHRoZW4gYSBtb2RlbCBjb250ZXh0IGlzIGFscmVhZHkgcHJvdmlkZWQgYW5kIHRo
aXMgaG9vawotICAgIGlzIG5vdCBjYWxsZWQuIFJvdXRlcyB3aXRob3V0IGR5bmFtaWMgc2VnbWVu
dHMgd2lsbCBhbHdheXMKLSAgICBleGVjdXRlIHRoZSBtb2RlbCBob29rLgotCi0gICAgVGhpcyBo
b29rIGZvbGxvd3MgdGhlIGFzeW5jaHJvbm91cy9wcm9taXNlIHNlbWFudGljcwotICAgIGRlc2Ny
aWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYGJlZm9yZU1vZGVsYC4gSW4gcGFydGljdWxh
ciwKLSAgICBpZiBhIHByb21pc2UgcmV0dXJuZWQgZnJvbSBgbW9kZWxgIGZhaWxzLCB0aGUgZXJy
b3Igd2lsbCBiZQotICAgIGhhbmRsZWQgYnkgdGhlIGBlcnJvcmAgaG9vayBvbiBgRW1iZXIuUm91
dGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1i
ZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIG1vZGVsOiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAg
ICAgcmV0dXJuIEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3RfaWQpOwotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBtb2RlbAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJh
bXMgdGhlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIFVSTAotICAgIEBwYXJhbSB7VHJh
bnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUg
cXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCi0gICAgQHJldHVybiB7T2JqZWN0fFByb21pc2V9
IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4gSWYKLSAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5l
ZCwgdGhlIHRyYW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAotICAgICAgdGhlIHByb21pc2UgcmVz
b2x2ZXMsIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgb2YgdGhlIHByb21pc2UKLSAgICAgIHdpbGwg
YmUgdXNlZCBhcyB0aGUgbW9kZWwgZm9yIHRoaXMgcm91dGUuCi0gICovCi0gIG1vZGVsOiBmdW5j
dGlvbihwYXJhbXMsIHRyYW5zaXRpb24pIHsKLSAgICB2YXIgbWF0Y2gsIG5hbWUsIHNhd1BhcmFt
cywgdmFsdWU7Ci0KLSAgICBmb3IgKHZhciBwcm9wIGluIHBhcmFtcykgewotICAgICAgaWYgKG1h
dGNoID0gcHJvcC5tYXRjaCgvXiguKilfaWQkLykpIHsKLSAgICAgICAgbmFtZSA9IG1hdGNoWzFd
OwotICAgICAgICB2YWx1ZSA9IHBhcmFtc1twcm9wXTsKLSAgICAgIH0KLSAgICAgIHNhd1BhcmFt
cyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFuYW1lICYmIHNhd1BhcmFtcykgeyByZXR1cm4g
cGFyYW1zOyB9Ci0gICAgZWxzZSBpZiAoIW5hbWUpIHsgcmV0dXJuOyB9Ci0KLSAgICByZXR1cm4g
dGhpcy5maW5kTW9kZWwobmFtZSwgdmFsdWUpOwotICB9LAotCi0gIC8qKgotCi0gICAgQG1ldGhv
ZCBmaW5kTW9kZWwKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbW9kZWwgdHlwZQotICAg
IEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFsdWUgcGFzc2VkIHRvIGZpbmQKLSAgKi8KLSAg
ZmluZE1vZGVsOiBmdW5jdGlvbigpewotICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUn
KTsKLSAgICByZXR1cm4gc3RvcmUuZmluZC5hcHBseShzdG9yZSwgYXJndW1lbnRzKTsKLSAgfSwK
LQotICAvKioKLSAgICBTdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVy
c2lzdGVuY2UgbGlicmFyaWVzIHRvIGluamVjdCB0aGVtc2VsdmVzLgotCi0gICAgQnkgZGVmYXVs
dCwgdGhpcyBzdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyB0aGUgZXhhY3Qgc2FtZSBmdW5jdGlvbmFs
aXR5IHByZXZpb3VzbHkKLSAgICBpbiB0aGUgbW9kZWwgaG9vay4KLQotICAgIEN1cnJlbnRseSwg
dGhlIHJlcXVpcmVkIGludGVyZmFjZSBpczoKLQotICAgIGBzdG9yZS5maW5kKG1vZGVsTmFtZSwg
ZmluZEFyZ3VtZW50cylgCi0KLSAgICBAbWV0aG9kIHN0b3JlCi0gICAgQHBhcmFtIHtPYmplY3R9
IHN0b3JlCi0gICovCi0gIHN0b3JlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpewotICAgIHZh
ciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKLSAgICB2YXIgcm91dGVOYW1lID0gdGhpcy5y
b3V0ZU5hbWU7Ci0gICAgdmFyIG5hbWVzcGFjZSA9IGdldCh0aGlzLCAncm91dGVyLm5hbWVzcGFj
ZScpOwotCi0gICAgcmV0dXJuIHsKLSAgICAgIGZpbmQ6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7
Ci0gICAgICAgIHZhciBtb2RlbENsYXNzID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVs
OicgKyBuYW1lKTsKLQotICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB1c2VkIHRoZSBkeW5hbWlj
IHNlZ21lbnQgIiArIG5hbWUgKyAiX2lkIGluIHlvdXIgcm91dGUgIiArCi0gICAgICAgICAgICAg
ICAgICAgICByb3V0ZU5hbWUgKyAiLCBidXQgIiArIG5hbWVzcGFjZSArICIuIiArIGNsYXNzaWZ5
KG5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICIgZGlkIG5vdCBleGlzdCBhbmQgeW91IGRp
ZCBub3Qgb3ZlcnJpZGUgeW91ciByb3V0ZSdzIGBtb2RlbGAgIiArCi0gICAgICAgICAgICAgICAg
ICAgICAiaG9vay4iLCBtb2RlbENsYXNzKTsKLQotICAgICAgICByZXR1cm4gbW9kZWxDbGFzcy5m
aW5kKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9OwotICB9KSwKLQotICAvKioKLSAgICBBIGhvb2sg
eW91IGNhbiBpbXBsZW1lbnQgdG8gY29udmVydCB0aGUgcm91dGUncyBtb2RlbCBpbnRvIHBhcmFt
ZXRlcnMKLSAgICBmb3IgdGhlIFVSTC4KLQotICAgIGBgYGpzCi0gICAgQXBwLlJvdXRlci5tYXAo
ZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJlc291cmNlKCdwb3N0Jywge3BhdGg6ICcvcG9zdHMv
OnBvc3RfaWQnfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUu
ZXh0ZW5kKHsKLSAgICAgIG1vZGVsOiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAgICAgLy8gdGhl
IHNlcnZlciByZXR1cm5zIGB7IGlkOiAxMiB9YAotICAgICAgICByZXR1cm4galF1ZXJ5LmdldEpT
T04oIi9wb3N0cy8iICsgcGFyYW1zLnBvc3RfaWQpOwotICAgICAgfSwKLQotICAgICAgc2VyaWFs
aXplOiBmdW5jdGlvbihtb2RlbCkgewotICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSB0aGUgVVJM
IGAvcG9zdHMvMTJgCi0gICAgICAgIHJldHVybiB7IHBvc3RfaWQ6IG1vZGVsLmlkIH07Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgZGVmYXVsdCBgc2VyaWFsaXplYCBtZXRo
b2Qgd2lsbCBpbnNlcnQgdGhlIG1vZGVsJ3MgYGlkYCBpbnRvIHRoZQotICAgIHJvdXRlJ3MgZHlu
YW1pYyBzZWdtZW50IChpbiB0aGlzIGNhc2UsIGA6cG9zdF9pZGApIGlmIHRoZSBzZWdtZW50IGNv
bnRhaW5zICdfaWQnLgotICAgIElmIHRoZSByb3V0ZSBoYXMgbXVsdGlwbGUgZHluYW1pYyBzZWdt
ZW50cyBvciBkb2VzIG5vdCBjb250YWluICdfaWQnLCBgc2VyaWFsaXplYAotICAgIHdpbGwgcmV0
dXJuIGBFbWJlci5nZXRQcm9wZXJ0aWVzKG1vZGVsLCBwYXJhbXMpYAotCi0gICAgVGhpcyBtZXRo
b2QgaXMgY2FsbGVkIHdoZW4gYHRyYW5zaXRpb25Ub2AgaXMgY2FsbGVkIHdpdGggYSBjb250ZXh0
Ci0gICAgaW4gb3JkZXIgdG8gcG9wdWxhdGUgdGhlIFVSTC4KLQotICAgIEBtZXRob2Qgc2VyaWFs
aXplCi0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCi0gICAgQHBh
cmFtIHtBcnJheX0gcGFyYW1zIGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1
cnJlbnQKLSAgICAgIHJvdXRlIChpbiB0aGUgZXhhbXBsZSwgYFsncG9zdF9pZCddYC4KLSAgICBA
cmV0dXJuIHtPYmplY3R9IHRoZSBzZXJpYWxpemVkIHBhcmFtZXRlcnMKLSAgKi8KLSAgc2VyaWFs
aXplOiBmdW5jdGlvbihtb2RlbCwgcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmFtcy5sZW5ndGggPCAx
KSB7IHJldHVybjsgfQotICAgIGlmICghbW9kZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbmFt
ZSA9IHBhcmFtc1swXSwgb2JqZWN0ID0ge307Ci0KLSAgICBpZiAoL19pZCQvLnRlc3QobmFtZSkg
JiYgcGFyYW1zLmxlbmd0aCA9PT0gMSkgewotICAgICAgb2JqZWN0W25hbWVdID0gZ2V0KG1vZGVs
LCAiaWQiKTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqZWN0ID0gZ2V0UHJvcGVydGllcyhtb2Rl
bCwgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb2JqZWN0OwotICB9LAotCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBzZXR1cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1
cnJlbnQgcm91dGUuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJv
bGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUgYW5kIHRoZQotICAgIG1vZGVsIHN1cHBsaWVkIGJ5
IHRoZSBgbW9kZWxgIGhvb2suCi0KLSAgICBCeSBkZWZhdWx0LCB0aGUgYHNldHVwQ29udHJvbGxl
cmAgaG9vayBzZXRzIHRoZSBgY29udGVudGAgcHJvcGVydHkgb2YKLSAgICB0aGUgY29udHJvbGxl
ciB0byB0aGUgYG1vZGVsYC4KLQotICAgIFRoaXMgbWVhbnMgdGhhdCB5b3VyIHRlbXBsYXRlIHdp
bGwgZ2V0IGEgcHJveHkgZm9yIHRoZSBtb2RlbCBhcyBpdHMKLSAgICBjb250ZXh0LCBhbmQgeW91
IGNhbiBhY3QgYXMgdGhvdWdoIHRoZSBtb2RlbCBpdHNlbGYgd2FzIHRoZSBjb250ZXh0LgotCi0g
ICAgVGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2lsbCBiZSBvbmUgcmVzb2x2ZWQgYmFzZWQgb24g
dGhlIG5hbWUKLSAgICBvZiB0aGlzIHJvdXRlLgotCi0gICAgSWYgbm8gZXhwbGljaXQgY29udHJv
bGxlciBpcyBkZWZpbmVkLCBFbWJlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCi0gICAgYW4g
YXBwcm9wcmlhdGUgY29udHJvbGxlciBmb3IgdGhlIG1vZGVsLgotCi0gICAgKiBpZiB0aGUgbW9k
ZWwgaXMgYW4gYEVtYmVyLkFycmF5YCAoaW5jbHVkaW5nIHJlY29yZCBhcnJheXMgZnJvbSBFbWJl
cgotICAgICAgRGF0YSksIHRoZSBjb250cm9sbGVyIGlzIGFuIGBFbWJlci5BcnJheUNvbnRyb2xs
ZXJgLgotICAgICogb3RoZXJ3aXNlLCB0aGUgY29udHJvbGxlciBpcyBhbiBgRW1iZXIuT2JqZWN0
Q29udHJvbGxlcmAuCi0KLSAgICBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgcm91dGVyOgot
Ci0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMu
cmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKLSAgICB9KTsKLSAg
ICBgYGAKLQotICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCBhIGNvbnRyb2xsZXIgbmFtZWQgYEFw
cC5Qb3N0Q29udHJvbGxlcmAgd291bGQKLSAgICBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuIElm
IGl0IGlzIG5vdCBkZWZpbmVkLCBhbiBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAKLSAgICBpbnN0
YW5jZSB3b3VsZCBiZSB1c2VkLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBganMKLSAgICBBcHAu
UG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHNldHVwQ29udHJvbGxlcjog
ZnVuY3Rpb24oY29udHJvbGxlciwgbW9kZWwpIHsKLSAgICAgICAgY29udHJvbGxlci5zZXQoJ21v
ZGVsJywgbW9kZWwpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBz
ZXR1cENvbnRyb2xsZXIKLSAgICBAcGFyYW0ge0NvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgaW5zdGFu
Y2UKLSAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwKLSAgKi8KLSAgc2V0dXBDb250cm9sbGVyOiBm
dW5jdGlvbihjb250cm9sbGVyLCBjb250ZXh0KSB7Ci0gICAgaWYgKGNvbnRyb2xsZXIgJiYgKGNv
bnRleHQgIT09IHVuZGVmaW5lZCkpIHsKLSAgICAgIHNldChjb250cm9sbGVyLCAnbW9kZWwnLCBj
b250ZXh0KTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY29udHJvbGxl
ciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIG9yIG5hbWUuCi0KLSAgICBUaGUgY29udHJvbGxlciBp
bnN0YW5jZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQsIGVpdGhlciB0aHJvdWdoIGVu
dGVyaW5nIHRoZQotICAgIGFzc29jaWF0ZWQgcm91dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJv
bGxlcmAuCi0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRl
bmQoewotICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7
Ci0gICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIsIHBvc3QpOwotICAgICAgICB0aGlzLmNv
bnRyb2xsZXJGb3IoJ3Bvc3RzJykuc2V0KCdjdXJyZW50UG9zdCcsIHBvc3QpOwotICAgICAgfQot
ICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBjb250cm9sbGVyRm9yCi0gICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIG9yIGNvbnRyb2xsZXIKLSAgICBA
cmV0dXJuIHtFbWJlci5Db250cm9sbGVyfQotICAqLwotICBjb250cm9sbGVyRm9yOiBmdW5jdGlv
bihuYW1lLCBfc2tpcEFzc2VydCkgewotICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5l
ciwKLSAgICAgICAgcm91dGUgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZTonK25hbWUpLAotICAg
ICAgICBjb250cm9sbGVyOwotCi0gICAgaWYgKHJvdXRlICYmIHJvdXRlLmNvbnRyb2xsZXJOYW1l
KSB7Ci0gICAgICBuYW1lID0gcm91dGUuY29udHJvbGxlck5hbWU7Ci0gICAgfQotCi0gICAgY29u
dHJvbGxlciA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpOwotCi0gICAg
Ly8gTk9URTogV2UncmUgc3BlY2lmaWNhbGx5IGNoZWNraW5nIHRoYXQgc2tpcEFzc2VydCBpcyB0
cnVlLCBiZWNhdXNlIGFjY29yZGluZwotICAgIC8vICAgdG8gdGhlIG9sZCBBUEkgdGhlIHNlY29u
ZCBwYXJhbWV0ZXIgd2FzIG1vZGVsLiBXZSBkbyBub3Qgd2FudCBwZW9wbGUgd2hvCi0gICAgLy8g
ICBwYXNzZWQgYSBtb2RlbCB0byBza2lwIHRoZSBhc3NlcnRpb24uCi0gICAgRW1iZXIuYXNzZXJ0
KCJUaGUgY29udHJvbGxlciBuYW1lZCAnIituYW1lKyInIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFr
ZSBzdXJlICIgKwotICAgICAgICAgICAgICAgICAidGhhdCB0aGlzIHJvdXRlIGV4aXN0cyBhbmQg
aGFzIGFscmVhZHkgYmVlbiBlbnRlcmVkIGF0IGxlYXN0ICIgKwotICAgICAgICAgICAgICAgICAi
b25jZS4gSWYgeW91IGFyZSBhY2Nlc3NpbmcgYSBjb250cm9sbGVyIG5vdCBhc3NvY2lhdGVkIHdp
dGggYSAiICsKLSAgICAgICAgICAgICAgICAgInJvdXRlLCBtYWtlIHN1cmUgdGhlIGNvbnRyb2xs
ZXIgY2xhc3MgaXMgZXhwbGljaXRseSBkZWZpbmVkLiIsCi0gICAgICAgICAgICAgICAgIGNvbnRy
b2xsZXIgfHwgX3NraXBBc3NlcnQgPT09IHRydWUpOwotCi0gICAgcmV0dXJuIGNvbnRyb2xsZXI7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2VuZXJhdGVzIGEgY29udHJvbGxlciBmb3IgYSByb3V0ZS4K
LQotICAgIElmIHRoZSBvcHRpb25hbCBtb2RlbCBpcyBwYXNzZWQgdGhlbiB0aGUgY29udHJvbGxl
ciB0eXBlIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKLSAgICBlLmcuLCBhbiBBcnJheUNv
bnRyb2xsZXIgZm9yIGFycmF5cy4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGpzCi0gICAgQXBw
LlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBzZXR1cENvbnRyb2xsZXI6
IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIHBvc3QpIHsKLSAgICAgICAgdGhpcy5fc3VwZXIoY29udHJv
bGxlciwgcG9zdCk7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVDb250cm9sbGVyKCdwb3N0cycsIHBv
c3QpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUNv
bnRyb2xsZXIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJv
bGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgbW9kZWwgdG8gaW5mZXIgdGhlIHR5
cGUgb2YgdGhlIGNvbnRyb2xsZXIgKG9wdGlvbmFsKQotICAqLwotICBnZW5lcmF0ZUNvbnRyb2xs
ZXI6IGZ1bmN0aW9uKG5hbWUsIG1vZGVsKSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29u
dGFpbmVyOwotCi0gICAgbW9kZWwgPSBtb2RlbCB8fCB0aGlzLm1vZGVsRm9yKG5hbWUpOwotCi0g
ICAgcmV0dXJuIEVtYmVyLmdlbmVyYXRlQ29udHJvbGxlcihjb250YWluZXIsIG5hbWUsIG1vZGVs
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBtb2RlbCBvZiBhIHBhcmVudCAob3Ig
YW55IGFuY2VzdG9yKSByb3V0ZQotICAgIGluIGEgcm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEg
dHJhbnNpdGlvbiwgYWxsIHJvdXRlcwotICAgIG11c3QgcmVzb2x2ZSBhIG1vZGVsIG9iamVjdCwg
YW5kIGlmIGEgcm91dGUKLSAgICBuZWVkcyBhY2Nlc3MgdG8gYSBwYXJlbnQgcm91dGUncyBtb2Rl
bCBpbiBvcmRlciB0bwotICAgIHJlc29sdmUgYSBtb2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9k
ZWwgZnJvbSBhIHBhcmVudCksCi0gICAgaXQgY2FuIGNhbGwgYHRoaXMubW9kZWxGb3IodGhlTmFt
ZU9mUGFyZW50Um91dGUpYCB0bwotICAgIHJldHJpZXZlIGl0LgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5y
ZXNvdXJjZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0Lzpwb3N0X2lkJyB9LCBmdW5jdGlvbigpIHsK
LSAgICAgICAgICAgIHRoaXMucmVzb3VyY2UoJ2NvbW1lbnRzJyk7Ci0gICAgICAgIH0pOwotICAg
IH0pOwotCi0gICAgQXBwLkNvbW1lbnRzUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAg
ICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdwb3N0
JywgdGhpcy5tb2RlbEZvcigncG9zdCcpKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1l
IG9mIHRoZSByb3V0ZQotICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVsIG9iamVjdAotICAq
LwotICBtb2RlbEZvcjogZnVuY3Rpb24obmFtZSkgewotCi0gICAgdmFyIHJvdXRlID0gdGhpcy5j
b250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSksCi0gICAgICAgIHRyYW5zaXRpb24gPSB0
aGlzLnJvdXRlci5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbjsKLQotICAgIC8vIElmIHdlIGFyZSBt
aWQtdHJhbnNpdGlvbiwgd2Ugd2FudCB0byB0cnkgYW5kIGxvb2sgdXAKLSAgICAvLyByZXNvbHZl
ZCBwYXJlbnQgY29udGV4dHMgb24gdGhlIGN1cnJlbnQgdHJhbnNpdGlvbkV2ZW50LgotICAgIGlm
ICh0cmFuc2l0aW9uKSB7Ci0gICAgICB2YXIgbW9kZWxMb29rdXBOYW1lID0gKHJvdXRlICYmIHJv
dXRlLnJvdXRlTmFtZSkgfHwgbmFtZTsKLSAgICAgIGlmICh0cmFuc2l0aW9uLnJlc29sdmVkTW9k
ZWxzLmhhc093blByb3BlcnR5KG1vZGVsTG9va3VwTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHRy
YW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxMb29rdXBOYW1lXTsKLSAgICAgIH0KLSAgICB9
Ci0KLSAgICByZXR1cm4gcm91dGUgJiYgcm91dGUuY3VycmVudE1vZGVsOwotICB9LAotCi0gIC8q
KgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGZvciB0aGUg
Y3VycmVudCByb3V0ZS4KLQotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb250
cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZSBhbmQgdGhlCi0gICAgbW9kZWwgc3VwcGxpZWQg
YnkgdGhlIGBtb2RlbGAgaG9vay4gQnkgZGVmYXVsdCwgaXQgcmVuZGVycyB0aGUgcm91dGUncwot
ICAgIHRlbXBsYXRlLCBjb25maWd1cmVkIHdpdGggdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSByb3V0
ZS4KLQotICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIHNldCB1cCBhbmQgcmVu
ZGVyIGFkZGl0aW9uYWwgb3IKLSAgICBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZXMuCi0KLSAgICBgYGBq
cwotICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRl
clRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgewotICAgICAgICB2YXIgZmF2
Q29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlckZvcignZmF2b3JpdGVQb3N0Jyk7Ci0KLSAgICAg
ICAgLy8gUmVuZGVyIHRoZSBgZmF2b3JpdGVQb3N0YCB0ZW1wbGF0ZSBpbnRvCi0gICAgICAgIC8v
IHRoZSBvdXRsZXQgYHBvc3RzYCwgYW5kIGRpc3BsYXkgdGhlIGBmYXZvcml0ZVBvc3RgCi0gICAg
ICAgIC8vIGNvbnRyb2xsZXIuCi0gICAgICAgIHRoaXMucmVuZGVyKCdmYXZvcml0ZVBvc3QnLCB7
Ci0gICAgICAgICAgb3V0bGV0OiAncG9zdHMnLAotICAgICAgICAgIGNvbnRyb2xsZXI6IGZhdkNv
bnRyb2xsZXIKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHJlbmRlclRlbXBsYXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xsZXIgdGhl
IHJvdXRlJ3MgY29udHJvbGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgcm91dGUn
cyBtb2RlbAotICAqLwotICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24oY29udHJvbGxlciwgbW9k
ZWwpIHsKLSAgICB0aGlzLnJlbmRlcigpOwotICB9LAotCi0gIC8qKgotICAgIFJlbmRlcnMgYSB0
ZW1wbGF0ZSBpbnRvIGFuIG91dGxldC4KLQotICAgIFRoaXMgbWV0aG9kIGhhcyBhIG51bWJlciBv
ZiBkZWZhdWx0cywgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlCi0gICAgcm91dGUgc3BlY2lmaWVk
IGluIHRoZSByb3V0ZXIuCi0KLSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGpzCi0gICAgQXBw
LlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCdpbmRleCcpOwotICAg
ICAgdGhpcy5yZXNvdXJjZSgncG9zdCcsIHtwYXRoOiAnL3Bvc3RzLzpwb3N0X2lkJ30pOwotICAg
IH0pOwotCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVu
ZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlbmRlcigpOwotICAgICAg
fQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhlIG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBh
cyBkZWZpbmVkIGJ5IHRoZSByb3V0ZXIsIGlzIGBwb3N0YC4KLQotICAgIEJ5IGRlZmF1bHQsIHJl
bmRlciB3aWxsOgotCi0gICAgKiByZW5kZXIgdGhlIGBwb3N0YCB0ZW1wbGF0ZQotICAgICogd2l0
aCB0aGUgYHBvc3RgIHZpZXcgKGBQb3N0Vmlld2ApIGZvciBldmVudCBoYW5kbGluZywgaWYgb25l
IGV4aXN0cwotICAgICogYW5kIHRoZSBgcG9zdGAgY29udHJvbGxlciAoYFBvc3RDb250cm9sbGVy
YCksIGlmIG9uZSBleGlzdHMKLSAgICAqIGludG8gdGhlIGBtYWluYCBvdXRsZXQgb2YgdGhlIGBh
cHBsaWNhdGlvbmAgdGVtcGxhdGUKLQotICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlv
cjoKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewot
ICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlbmRlcign
bXlQb3N0JywgeyAgIC8vIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSAgICAgICAgICBpbnRvOiAn
aW5kZXgnLCAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyIGludG8KLSAgICAgICAg
ICBvdXRsZXQ6ICdkZXRhaWwnLCAgICAgICAvLyB0aGUgbmFtZSBvZiB0aGUgb3V0bGV0IGluIHRo
YXQgdGVtcGxhdGUKLSAgICAgICAgICBjb250cm9sbGVyOiAnYmxvZ1Bvc3QnICAvLyB0aGUgY29u
dHJvbGxlciB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0ZQotICAgICAgICB9KTsKLSAgICAgIH0KLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIFJlbWVtYmVyIHRoYXQgdGhlIGNvbnRyb2xsZXIncyBgY29u
dGVudGAgd2lsbCBiZSB0aGUgcm91dGUncyBtb2RlbC4gSW4KLSAgICB0aGlzIGNhc2UsIHRoZSBk
ZWZhdWx0IG1vZGVsIHdpbGwgYmUgYEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3RfaWQpYC4KLQot
ICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2Yg
dGhlIHRlbXBsYXRlIHRvIHJlbmRlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBv
cHRpb25zCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewotICAgIEVt
YmVyLmFzc2VydCgiVGhlIG5hbWUgaW4gdGhlIGdpdmVuIGFyZ3VtZW50cyBpcyB1bmRlZmluZWQi
LCBhcmd1bWVudHMubGVuZ3RoID4gMCA/ICFFbWJlci5pc05vbmUoYXJndW1lbnRzWzBdKSA6IHRy
dWUpOwotCi0gICAgdmFyIG5hbWVQYXNzZWQgPSAhIW5hbWU7Ci0KLSAgICBpZiAodHlwZW9mIG5h
bWUgPT09ICdvYmplY3QnICYmICFvcHRpb25zKSB7Ci0gICAgICBvcHRpb25zID0gbmFtZTsKLSAg
ICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAgICB9Ci0KLSAgICBvcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKLQotICAgIHZhciB0ZW1wbGF0ZU5hbWU7Ci0KLSAgICBpZiAobmFtZSkgewotICAg
ICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXC8vZywgJy4nKTsKLSAgICAgIHRlbXBsYXRlTmFtZSA9
IG5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAgICAg
IHRlbXBsYXRlTmFtZSA9IHRoaXMudGVtcGxhdGVOYW1lIHx8IG5hbWU7Ci0gICAgfQotCi0gICAg
dmFyIHZpZXdOYW1lID0gb3B0aW9ucy52aWV3IHx8IHRoaXMudmlld05hbWUgfHwgbmFtZTsKLQot
ICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKLSAgICAgICAgdmlldyA9IGNvbnRh
aW5lci5sb29rdXAoJ3ZpZXc6JyArIHZpZXdOYW1lKSwKLSAgICAgICAgdGVtcGxhdGUgPSB2aWV3
ID8gdmlldy5nZXQoJ3RlbXBsYXRlJykgOiBudWxsOwotCi0gICAgaWYgKCF0ZW1wbGF0ZSkgewot
ICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgdGVtcGxhdGVO
YW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIXZpZXcgJiYgIXRlbXBsYXRlKSB7Ci0gICAgICBFbWJl
ci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIFwiIiArIG5hbWUgKyAiXCIgdGVtcGxhdGUgb3Igdmll
dy4iLCAhbmFtZVBhc3NlZCk7Ci0gICAgICBpZiAoZ2V0KHRoaXMucm91dGVyLCAnbmFtZXNwYWNl
LkxPR19WSUVXX0xPT0tVUFMnKSkgewotICAgICAgICBFbWJlci5Mb2dnZXIuaW5mbygiQ291bGQg
bm90IGZpbmQgXCIiICsgbmFtZSArICJcIiB0ZW1wbGF0ZSBvciB2aWV3LiBOb3RoaW5nIHdpbGwg
YmUgcmVuZGVyZWQiLCB7IGZ1bGxOYW1lOiAndGVtcGxhdGU6JyArIG5hbWUgfSk7Ci0gICAgICB9
Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnMo
dGhpcywgbmFtZSwgdGVtcGxhdGUsIG9wdGlvbnMpOwotICAgIHZpZXcgPSBzZXR1cFZpZXcodmll
dywgY29udGFpbmVyLCBvcHRpb25zKTsKLQotICAgIGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21h
aW4nKSB7IHRoaXMubGFzdFJlbmRlcmVkVGVtcGxhdGUgPSBuYW1lOyB9Ci0KLSAgICBhcHBlbmRW
aWV3KHRoaXMsIHZpZXcsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIERpc2Nvbm5lY3Rz
IGEgdmlldyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGludG8gYW4gb3V0bGV0LgotCi0gICAgWW91
IG1heSBwYXNzIGFueSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGBkaXNjb25u
ZWN0T3V0bGV0YDoKLQotICAgICogYG91dGxldGA6IHRoZSBuYW1lIG9mIHRoZSBvdXRsZXQgdG8g
Y2xlYXIgKGRlZmF1bHQ6ICdtYWluJykKLSAgICAqIGBwYXJlbnRWaWV3YDogdGhlIG5hbWUgb2Yg
dGhlIHZpZXcgY29udGFpbmluZyB0aGUgb3V0bGV0IHRvIGNsZWFyCi0gICAgICAgKGRlZmF1bHQ6
IHRoZSB2aWV3IHJlbmRlcmVkIGJ5IHRoZSBwYXJlbnQgcm91dGUpCi0KLSAgICBFeGFtcGxlOgot
Ci0gICAgYGBganMKLSAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICBzaG93TW9kYWw6IGZ1bmN0aW9uKGV2dCkgewot
ICAgICAgICAgIHRoaXMucmVuZGVyKGV2dC5tb2RhbE5hbWUsIHsKLSAgICAgICAgICAgIG91dGxl
dDogJ21vZGFsJywKLSAgICAgICAgICAgIGludG86ICdhcHBsaWNhdGlvbicKLSAgICAgICAgICB9
KTsKLSAgICAgICAgfSwKLSAgICAgICAgaGlkZU1vZGFsOiBmdW5jdGlvbihldnQpIHsKLSAgICAg
ICAgICB0aGlzLmRpc2Nvbm5lY3RPdXRsZXQoewotICAgICAgICAgICAgb3V0bGV0OiAnbW9kYWwn
LAotICAgICAgICAgICAgcGFyZW50VmlldzogJ2FwcGxpY2F0aW9uJwotICAgICAgICAgIH0pOwot
ICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nv
bm5lY3RPdXRsZXQKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucwotICAq
LwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgb3B0aW9ucyA9
IG9wdGlvbnMgfHwge307Ci0gICAgb3B0aW9ucy5wYXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRW
aWV3ID8gb3B0aW9ucy5wYXJlbnRWaWV3LnJlcGxhY2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1w
bGF0ZSh0aGlzKTsKLSAgICBvcHRpb25zLm91dGxldCA9IG9wdGlvbnMub3V0bGV0IHx8ICdtYWlu
JzsKLQotICAgIHZhciBwYXJlbnRWaWV3ID0gdGhpcy5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXco
b3B0aW9ucy5wYXJlbnRWaWV3KTsKLSAgICBwYXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3B0
aW9ucy5vdXRsZXQpOwotICB9LAotCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0
aGlzLnRlYXJkb3duVmlld3MoKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAg
QG1ldGhvZCB0ZWFyZG93blZpZXdzCi0gICovCi0gIHRlYXJkb3duVmlld3M6IGZ1bmN0aW9uKCkg
ewotICAgIC8vIFRlYXIgZG93biB0aGUgdG9wIGxldmVsIHZpZXcKLSAgICBpZiAodGhpcy50ZWFy
ZG93blRvcExldmVsVmlldykgeyB0aGlzLnRlYXJkb3duVG9wTGV2ZWxWaWV3KCk7IH0KLQotICAg
IC8vIFRlYXIgZG93biBhbnkgb3V0bGV0cyByZW5kZXJlZCB3aXRoICdpbnRvJwotICAgIHZhciB0
ZWFyZG93bk91dGxldFZpZXdzID0gdGhpcy50ZWFyZG93bk91dGxldFZpZXdzIHx8IFtdOwotICAg
IGFfZm9yRWFjaCh0ZWFyZG93bk91dGxldFZpZXdzLCBmdW5jdGlvbih0ZWFyZG93bk91dGxldFZp
ZXcpIHsKLSAgICAgIHRlYXJkb3duT3V0bGV0VmlldygpOwotICAgIH0pOwotCi0gICAgZGVsZXRl
IHRoaXMudGVhcmRvd25Ub3BMZXZlbFZpZXc7Ci0gICAgZGVsZXRlIHRoaXMudGVhcmRvd25PdXRs
ZXRWaWV3czsKLSAgICBkZWxldGUgdGhpcy5sYXN0UmVuZGVyZWRUZW1wbGF0ZTsKLSAgfQotfSk7
Ci0KLWZ1bmN0aW9uIHBhcmVudFJvdXRlKHJvdXRlKSB7Ci0gIHZhciBoYW5kbGVySW5mb3MgPSBy
b3V0ZS5yb3V0ZXIucm91dGVyLnRhcmdldEhhbmRsZXJJbmZvczsKLQotICBpZiAoIWhhbmRsZXJJ
bmZvcykgeyByZXR1cm47IH0KLQotICB2YXIgcGFyZW50LCBjdXJyZW50OwotCi0gIGZvciAodmFy
IGk9MCwgbD1oYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGN1cnJlbnQgPSBo
YW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKLSAgICBpZiAoY3VycmVudCA9PT0gcm91dGUpIHsgcmV0
dXJuIHBhcmVudDsgfQotICAgIHBhcmVudCA9IGN1cnJlbnQ7Ci0gIH0KLX0KLQotZnVuY3Rpb24g
cGFyZW50VGVtcGxhdGUocm91dGUpIHsKLSAgdmFyIHBhcmVudCA9IHBhcmVudFJvdXRlKHJvdXRl
KSwgdGVtcGxhdGU7Ci0KLSAgaWYgKCFwYXJlbnQpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKHRlbXBs
YXRlID0gcGFyZW50Lmxhc3RSZW5kZXJlZFRlbXBsYXRlKSB7Ci0gICAgcmV0dXJuIHRlbXBsYXRl
OwotICB9IGVsc2UgewotICAgIHJldHVybiBwYXJlbnRUZW1wbGF0ZShwYXJlbnQpOwotICB9Ci19
Ci0KLWZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnMocm91dGUsIG5hbWUsIHRlbXBsYXRlLCBvcHRp
b25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotICBvcHRpb25zLmludG8gPSBvcHRp
b25zLmludG8gPyBvcHRpb25zLmludG8ucmVwbGFjZSgvXC8vZywgJy4nKSA6IHBhcmVudFRlbXBs
YXRlKHJvdXRlKTsKLSAgb3B0aW9ucy5vdXRsZXQgPSBvcHRpb25zLm91dGxldCB8fCAnbWFpbic7
Ci0gIG9wdGlvbnMubmFtZSA9IG5hbWU7Ci0gIG9wdGlvbnMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsK
LSAgb3B0aW9ucy5MT0dfVklFV19MT09LVVBTID0gZ2V0KHJvdXRlLnJvdXRlciwgJ25hbWVzcGFj
ZS5MT0dfVklFV19MT09LVVBTJyk7Ci0KLSAgRW1iZXIuYXNzZXJ0KCJBbiBvdXRsZXQgKCIrb3B0
aW9ucy5vdXRsZXQrIikgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBmb3VuZC4iLCBvcHRpb25z
Lm91dGxldCA9PT0gJ21haW4nIHx8IG9wdGlvbnMuaW50byk7Ci0KLSAgdmFyIGNvbnRyb2xsZXIg
PSBvcHRpb25zLmNvbnRyb2xsZXIsIG5hbWVkQ29udHJvbGxlcjsKLQotICBpZiAob3B0aW9ucy5j
b250cm9sbGVyKSB7Ci0gICAgY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlcjsKLSAgfSBl
bHNlIGlmIChuYW1lZENvbnRyb2xsZXIgPSByb3V0ZS5jb250YWluZXIubG9va3VwKCdjb250cm9s
bGVyOicgKyBuYW1lKSkgewotICAgIGNvbnRyb2xsZXIgPSBuYW1lZENvbnRyb2xsZXI7Ci0gIH0g
ZWxzZSB7Ci0gICAgY29udHJvbGxlciA9IHJvdXRlLmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJv
dXRlTmFtZTsKLSAgfQotCi0gIGlmICh0eXBlb2YgY29udHJvbGxlciA9PT0gJ3N0cmluZycpIHsK
LSAgICBjb250cm9sbGVyID0gcm91dGUuY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsg
Y29udHJvbGxlcik7Ci0gIH0KLQotICBvcHRpb25zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwot
Ci0gIHJldHVybiBvcHRpb25zOwotfQotCi1mdW5jdGlvbiBzZXR1cFZpZXcodmlldywgY29udGFp
bmVyLCBvcHRpb25zKSB7Ci0gIGlmICh2aWV3KSB7Ci0gICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdf
TE9PS1VQUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oIlJlbmRlcmluZyAiICsgb3B0aW9u
cy5uYW1lICsgIiB3aXRoICIgKyB2aWV3LCB7IGZ1bGxOYW1lOiAndmlldzonICsgb3B0aW9ucy5u
YW1lIH0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25z
LmludG8gPyAndmlldzpkZWZhdWx0JyA6ICd2aWV3OnRvcGxldmVsJzsKLSAgICB2aWV3ID0gY29u
dGFpbmVyLmxvb2t1cChkZWZhdWx0Vmlldyk7Ci0gICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdfTE9P
S1VQUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oIlJlbmRlcmluZyAiICsgb3B0aW9ucy5u
YW1lICsgIiB3aXRoIGRlZmF1bHQgdmlldyAiICsgdmlldywgeyBmdWxsTmFtZTogJ3ZpZXc6JyAr
IG9wdGlvbnMubmFtZSB9KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWdldCh2aWV3LCAndGVtcGxh
dGVOYW1lJykpIHsKLSAgICBzZXQodmlldywgJ3RlbXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7
Ci0KLSAgICBzZXQodmlldywgJ19kZWJ1Z1RlbXBsYXRlTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0g
IH0KLQotICBzZXQodmlldywgJ3JlbmRlcmVkTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0gIHNldCh2
aWV3LCAnY29udHJvbGxlcicsIG9wdGlvbnMuY29udHJvbGxlcik7Ci0KLSAgcmV0dXJuIHZpZXc7
Ci19Ci0KLWZ1bmN0aW9uIGFwcGVuZFZpZXcocm91dGUsIHZpZXcsIG9wdGlvbnMpIHsKLSAgaWYg
KG9wdGlvbnMuaW50bykgewotICAgIHZhciBwYXJlbnRWaWV3ID0gcm91dGUucm91dGVyLl9sb29r
dXBBY3RpdmVWaWV3KG9wdGlvbnMuaW50byk7Ci0gICAgdmFyIHRlYXJkb3duT3V0bGV0VmlldyA9
IGdlbmVyYXRlT3V0bGV0VGVhcmRvd24ocGFyZW50Vmlldywgb3B0aW9ucy5vdXRsZXQpOwotICAg
IGlmICghcm91dGUudGVhcmRvd25PdXRsZXRWaWV3cykgeyByb3V0ZS50ZWFyZG93bk91dGxldFZp
ZXdzID0gW107IH0KLSAgICBhX3JlcGxhY2Uocm91dGUudGVhcmRvd25PdXRsZXRWaWV3cywgMCwg
MCwgW3RlYXJkb3duT3V0bGV0Vmlld10pOwotICAgIHBhcmVudFZpZXcuY29ubmVjdE91dGxldChv
cHRpb25zLm91dGxldCwgdmlldyk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyIHJvb3RFbGVtZW50ID0g
Z2V0KHJvdXRlLCAncm91dGVyLm5hbWVzcGFjZS5yb290RWxlbWVudCcpOwotICAgIC8vIHRlYXIg
ZG93biB2aWV3IGlmIG9uZSBpcyBhbHJlYWR5IHJlbmRlcmVkCi0gICAgaWYgKHJvdXRlLnRlYXJk
b3duVG9wTGV2ZWxWaWV3KSB7Ci0gICAgICByb3V0ZS50ZWFyZG93blRvcExldmVsVmlldygpOwot
ICAgIH0KLSAgICByb3V0ZS5yb3V0ZXIuX2Nvbm5lY3RBY3RpdmVWaWV3KG9wdGlvbnMubmFtZSwg
dmlldyk7Ci0gICAgcm91dGUudGVhcmRvd25Ub3BMZXZlbFZpZXcgPSBnZW5lcmF0ZVRvcExldmVs
VGVhcmRvd24odmlldyk7Ci0gICAgdmlldy5hcHBlbmRUbyhyb290RWxlbWVudCk7Ci0gIH0KLX0K
LQotZnVuY3Rpb24gZ2VuZXJhdGVUb3BMZXZlbFRlYXJkb3duKHZpZXcpIHsKLSAgcmV0dXJuIGZ1
bmN0aW9uKCkgeyB2aWV3LmRlc3Ryb3koKTsgfTsKLX0KLQotZnVuY3Rpb24gZ2VuZXJhdGVPdXRs
ZXRUZWFyZG93bihwYXJlbnRWaWV3LCBvdXRsZXQpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBw
YXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3V0bGV0KTsgfTsKLX0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLUVtYmVyLm9uTG9h
ZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKCkgewotICB2YXIgaGFuZGxlYmFyc1Jlc29s
dmUgPSBFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQYXJhbXMsCi0gICAgICBtYXAgPSBFbWJlci5B
cnJheVBvbHlmaWxscy5tYXAsCi0gICAgICBnZXQgPSBFbWJlci5nZXQsCi0gICAgICBoYW5kbGVi
YXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQ7Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhcmFt
cyhjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKLSAgICByZXR1cm4gbWFwLmNhbGwocmVzb2x2
ZVBhdGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucyksIGZ1bmN0aW9uKHBhdGgsIGkpIHsKLSAg
ICAgIGlmIChudWxsID09PSBwYXRoKSB7Ci0gICAgICAgIC8vIFBhcmFtIHdhcyBzdHJpbmcvbnVt
YmVyLCBub3QgYSBwYXRoLCBzbyBqdXN0IHJldHVybiByYXcgc3RyaW5nL251bWJlci4KLSAgICAg
ICAgcmV0dXJuIHBhcmFtc1tpXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBoYW5k
bGViYXJzR2V0KGNvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwotICAgICAgfQotICAgIH0pOwotICB9
Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhdGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucykgewot
ICAgIHZhciByZXNvbHZlZCA9IGhhbmRsZWJhcnNSZXNvbHZlKGNvbnRleHQsIHBhcmFtcywgb3B0
aW9ucyksCi0gICAgICAgIHR5cGVzID0gb3B0aW9ucy50eXBlczsKLQotICAgIHJldHVybiBtYXAu
Y2FsbChyZXNvbHZlZCwgZnVuY3Rpb24ob2JqZWN0LCBpKSB7Ci0gICAgICBpZiAodHlwZXNbaV0g
PT09ICdJRCcpIHsKLSAgICAgICAgcmV0dXJuIHVud3JhcChvYmplY3QsIHBhcmFtc1tpXSk7Ci0g
ICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIGZ1bmN0aW9uIHVud3JhcChvYmplY3QsIHBhdGgpIHsKLSAgICAgIGlmIChwYXRoID09PSAn
Y29udHJvbGxlcicpIHsgcmV0dXJuIHBhdGg7IH0KLQotICAgICAgaWYgKEVtYmVyLkNvbnRyb2xs
ZXJNaXhpbi5kZXRlY3Qob2JqZWN0KSkgewotICAgICAgICByZXR1cm4gdW53cmFwKGdldChvYmpl
Y3QsICdtb2RlbCcpLCBwYXRoID8gcGF0aCArICcubW9kZWwnIDogJ21vZGVsJyk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBF
bWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcyA9IHJlc29sdmVQYXJhbXM7Ci0gIEVtYmVyLlJvdXRl
ci5yZXNvbHZlUGF0aHMgPSByZXNvbHZlUGF0aHM7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0
cmluZy5mbXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5k
bGViYXJzKSB7Ci0KLSAgdmFyIHJlc29sdmVQYXJhbXMgPSBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBh
cmFtcywKLSAgICAgIHJlc29sdmVQYXRocyAgPSBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBhdGhzLAot
ICAgICAgaXNTaW1wbGVDbGljayA9IEVtYmVyLlZpZXdVdGlscy5pc1NpbXBsZUNsaWNrOwotCi0g
IGZ1bmN0aW9uIGZ1bGxSb3V0ZU5hbWUocm91dGVyLCBuYW1lKSB7Ci0gICAgdmFyIG5hbWVXaXRo
SW5kZXg7Ci0gICAgaWYgKCFyb3V0ZXIuaGFzUm91dGUobmFtZSkpIHsKLSAgICAgIG5hbWVXaXRo
SW5kZXggPSBuYW1lICsgJy5pbmRleCc7Ci0gICAgICBFbWJlci5hc3NlcnQoZm10KCJUaGUgYXR0
ZW1wdCB0byBsaW5rLXRvIHJvdXRlICclQCcgZmFpbGVkIChhbHNvIHRyaWVkICclQCcpLiAiICsK
LSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByb3V0ZXIgZGlkIG5vdCBmaW5kICclQCcgaW4g
aXRzIHBvc3NpYmxlIHJvdXRlczogJyVAJyIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtuYW1l
LCBuYW1lV2l0aEluZGV4LCBuYW1lLCBFbWJlci5rZXlzKHJvdXRlci5yb3V0ZXIucmVjb2duaXpl
ci5uYW1lcykuam9pbigiJywgJyIpXSksCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdXRlci5o
YXNSb3V0ZShuYW1lV2l0aEluZGV4KSk7Ci0gICAgICBuYW1lID0gbmFtZVdpdGhJbmRleDsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldFJlc29sdmVkUGF0
aHMob3B0aW9ucykgewotCi0gICAgdmFyIHR5cGVzID0gb3B0aW9ucy5vcHRpb25zLnR5cGVzLAot
ICAgICAgICBkYXRhID0gb3B0aW9ucy5vcHRpb25zLmRhdGE7Ci0KLSAgICByZXR1cm4gcmVzb2x2
ZVBhdGhzKG9wdGlvbnMuY29udGV4dCwgb3B0aW9ucy5wYXJhbXMsIHsgdHlwZXM6IHR5cGVzLCBk
YXRhOiBkYXRhIH0pOwotICB9Ci0KLSAgLyoqCi0gICAgYEVtYmVyLkxpbmtWaWV3YCByZW5kZXJz
IGFuIGVsZW1lbnQgd2hvc2UgYGNsaWNrYCBldmVudCB0cmlnZ2VycyBhCi0gICAgdHJhbnNpdGlv
biBvZiB0aGUgYXBwbGljYXRpb24ncyBpbnN0YW5jZSBvZiBgRW1iZXIuUm91dGVyYCB0bwotICAg
IGEgc3VwcGxpZWQgcm91dGUgYnkgbmFtZS4KLQotICAgIEluc3RhbmNlcyBvZiBgTGlua1ZpZXdg
IHdpbGwgbW9zdCBsaWtlbHkgYmUgY3JlYXRlZCB0aHJvdWdoCi0gICAgdGhlIGBsaW5rLXRvYCBI
YW5kbGViYXJzIGhlbHBlciwgYnV0IHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcwotICAgIGNhbiBi
ZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBhcHBsaWNhdGlvbi13aWRlIGJlaGF2aW9yLgotCi0g
ICAgQGNsYXNzIExpbmtWaWV3Ci0gICAgQG5hbWVzcGFjZSBFbWJlcgotICAgIEBleHRlbmRzIEVt
YmVyLlZpZXcKLSAgICBAc2VlIHtIYW5kbGViYXJzLmhlbHBlcnMubGluay10b30KLSAgKiovCi0g
IHZhciBMaW5rVmlldyA9IEVtYmVyLkxpbmtWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAg
IHRhZ05hbWU6ICdhJywKLSAgICBjdXJyZW50V2hlbjogbnVsbCwKLQotICAgIC8qKgotICAgICAg
U2V0cyB0aGUgYHRpdGxlYCBhdHRyaWJ1dGUgb2YgdGhlIGBMaW5rVmlld2AncyBIVE1MIGVsZW1l
bnQuCi0KLSAgICAgIEBwcm9wZXJ0eSB0aXRsZQotICAgICAgQGRlZmF1bHQgbnVsbAotICAgICoq
LwotICAgIHRpdGxlOiBudWxsLAotCi0gICAgLyoqCi0gICAgICBTZXRzIHRoZSBgcmVsYCBhdHRy
aWJ1dGUgb2YgdGhlIGBMaW5rVmlld2AncyBIVE1MIGVsZW1lbnQuCi0KLSAgICAgIEBwcm9wZXJ0
eSByZWwKLSAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAqKi8KLSAgICByZWw6IG51bGwsCi0KLSAg
ICAvKioKLSAgICAgIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYExpbmtWaWV3YCdzIGVsZW1l
bnQgd2hlbiBpdHMgYGFjdGl2ZWAKLSAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KLQotICAgICAg
QHByb3BlcnR5IGFjdGl2ZUNsYXNzCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0
IGFjdGl2ZQotICAgICoqLwotICAgIGFjdGl2ZUNsYXNzOiAnYWN0aXZlJywKLQotICAgIC8qKgot
ICAgICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVu
IGl0cyBgbG9hZGluZ2AKLSAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KLQotICAgICAgQHByb3Bl
cnR5IGxvYWRpbmdDbGFzcwotICAgICAgQHR5cGUgU3RyaW5nCi0gICAgICBAZGVmYXVsdCBsb2Fk
aW5nCi0gICAgKiovCi0gICAgbG9hZGluZ0NsYXNzOiAnbG9hZGluZycsCi0KLSAgICAvKioKLSAg
ICAgIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYSBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVu
IGl0cyBgZGlzYWJsZWRgCi0gICAgICBwcm9wZXJ0eSBpcyBgdHJ1ZWAuCi0KLSAgICAgIEBwcm9w
ZXJ0eSBkaXNhYmxlZENsYXNzCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGRp
c2FibGVkCi0gICAgKiovCi0gICAgZGlzYWJsZWRDbGFzczogJ2Rpc2FibGVkJywKLSAgICBfaXNE
aXNhYmxlZDogZmFsc2UsCi0KLSAgICAvKioKLSAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUg
YExpbmtWaWV3YCB3aWxsIHRyaWdnZXIgcm91dGluZyB2aWEKLSAgICAgIHRoZSBgcmVwbGFjZVdp
dGhgIHJvdXRpbmcgc3RyYXRlZ3kuCi0KLSAgICAgIEBwcm9wZXJ0eSByZXBsYWNlCi0gICAgICBA
dHlwZSBCb29sZWFuCi0gICAgICBAZGVmYXVsdCBmYWxzZQotICAgICoqLwotICAgIHJlcGxhY2U6
IGZhbHNlLAotCi0gICAgLyoqCi0gICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5rLXRvfX1gIGhl
bHBlciB3aWxsIGJpbmQgdG8gdGhlIGBocmVmYCBhbmQKLSAgICAgIGB0aXRsZWAgYXR0cmlidXRl
cy4gSXQncyBkaXNjb3VyYWdlIHRoYXQgeW91IG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAotICAg
ICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0aGUgYXJyYXkgaWYgbmVlZGVkLgotCi0gICAg
ICBAcHJvcGVydHkgYXR0cmlidXRlQmluZGluZ3MKLSAgICAgIEB0eXBlIEFycmF5IHwgU3RyaW5n
Ci0gICAgICBAZGVmYXVsdCBbJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10KLSAgICAgKiovCi0gICAg
YXR0cmlidXRlQmluZGluZ3M6IFsnaHJlZicsICd0aXRsZScsICdyZWwnXSwKLQotICAgIC8qKgot
ICAgICAgQnkgZGVmYXVsdCB0aGUgYHt7bGluay10b319YCBoZWxwZXIgd2lsbCBiaW5kIHRvIHRo
ZSBgYWN0aXZlYCwgYGxvYWRpbmdgLCBhbmQKLSAgICAgIGBkaXNhYmxlZGAgY2xhc3Nlcy4gSXQg
aXMgZGlzY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhlc2UgZGlyZWN0bHkuCi0KLSAgICAgIEBwcm9w
ZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAgICAgQHR5cGUgQXJyYXkKLSAgICAgIEBkZWZhdWx0
IFsnYWN0aXZlJywgJ2xvYWRpbmcnLCAnZGlzYWJsZWQnXQotICAgICAqKi8KLSAgICBjbGFzc05h
bWVCaW5kaW5nczogWydhY3RpdmUnLCAnbG9hZGluZycsICdkaXNhYmxlZCddLAotCi0gICAgLyoq
Ci0gICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciByZXNwb25kcyB0byB0
aGUgYGNsaWNrYCBldmVudC4gWW91Ci0gICAgICBjYW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWxseSBi
eSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8geW91ciBjdXN0b20KLSAgICAgIGV2ZW50IG5hbWUu
Ci0KLSAgICAgIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiBtb2JpbGUgd2hlbiBvbmUg
d2FudHMgdG8gYXZvaWQgdGhlIDMwMG1zCi0gICAgICBjbGljayBkZWxheSB1c2luZyBzb21lIHNv
cnQgb2YgY3VzdG9tIGB0YXBgIGV2ZW50LgotCi0gICAgICBAcHJvcGVydHkgZXZlbnROYW1lCi0g
ICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGNsaWNrCi0gICAgKi8KLSAgICBldmVu
dE5hbWU6ICdjbGljaycsCi0KLSAgICAvLyB0aGlzIGlzIGRvYydlZCBoZXJlIHNvIGl0IHNob3dz
IHVwIGluIHRoZSBldmVudHMKLSAgICAvLyBzZWN0aW9uIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlv
biwgd2hpY2ggaXMgd2hlcmUKLSAgICAvLyBwZW9wbGUgd2lsbCBsaWtlbHkgZ28gbG9va2luZyBm
b3IgaXQuCi0gICAgLyoqCi0gICAgICBUcmlnZ2VycyB0aGUgYExpbmtWaWV3YCdzIHJvdXRpbmcg
YmVoYXZpb3IuIElmCi0gICAgICBgZXZlbnROYW1lYCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3Ro
ZXIgdGhhbiBgY2xpY2tgCi0gICAgICB0aGUgcm91dGluZyBiZWhhdmlvciB3aWxsIHRyaWdnZXIg
b24gdGhhdCBjdXN0b20gZXZlbnQKLSAgICAgIGluc3RlYWQuCi0KLSAgICAgIEBldmVudCBjbGlj
awotICAgICoqLwotCi0gICAgLyoqCi0gICAgICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVk
IHdoZW4gTGlua1ZpZXcgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLgotCi0gICAgICBFeGFtcGxl
OgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBBcHAuTXlMaW5rVmlldyA9IEVtYmVyLkxp
bmtWaWV3LmV4dGVuZCh7Ci0gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHRo
aXMuX3N1cGVyKCk7Ci0gICAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnRXZlbnQgaXMgJyArIHRo
aXMuZ2V0KCdldmVudE5hbWUnKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgYGBgCi0K
LSAgICAgIE5PVEU6IElmIHlvdSBkbyBvdmVycmlkZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNs
YXNzIGxpa2UgYEVtYmVyLlZpZXdgIG9yCi0gICAgICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwg
YmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlcigpYCBpbiB5b3VyCi0gICAgICBgaW5pdGAgZGVj
bGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5
IHRvCi0gICAgICBkbyBpbXBvcnRhbnQgc2V0dXAgd29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5n
ZSBiZWhhdmlvciBpbiB5b3VyCi0gICAgICBhcHBsaWNhdGlvbi4KLQotICAgICAgQG1ldGhvZCBp
bml0Ci0gICAgKi8KLSAgICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX3N1cGVyLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0KLSAgICAgIC8vIE1hcCBkZXNpcmVkIGV2ZW50IG5hbWUg
dG8gaW52b2tlIGZ1bmN0aW9uCi0gICAgICB2YXIgZXZlbnROYW1lID0gZ2V0KHRoaXMsICdldmVu
dE5hbWUnKSwgaTsKLSAgICAgIHRoaXMub24oZXZlbnROYW1lLCB0aGlzLCB0aGlzLl9pbnZva2Up
OwotCi0gICAgICAgICAgfSwKLQotICAgIC8qKgotICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tl
ZCBieSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJlCi0gICAgICB3
aGVuZXZlciB0aGUgcGFyYW1zIGNoYW5nZQotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQG1ldGhv
ZCBfcGFyYW1zQ2hhbmdlZAotICAgICAqLwotICAgIF9wYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbigp
IHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3Jlc29sdmVkUGFyYW1zJyk7Ci0g
ICAgfSwKLQotICAgIC8qKgotICAgICBUaGlzIGlzIGNhbGxlZCB0byBzZXR1cCBvYnNlcnZlcnMg
dGhhdCB3aWxsIHRyaWdnZXIgYSByZXJlbmRlci4KLQotICAgICBAcHJpdmF0ZQotICAgICBAbWV0
aG9kIF9zZXR1cFBhdGhPYnNlcnZlcnMKLSAgICAqKi8KLSAgICBfc2V0dXBQYXRoT2JzZXJ2ZXJz
OiBmdW5jdGlvbigpewotICAgICAgdmFyIGhlbHBlclBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRl
cnMsCi0gICAgICAgICAgbGlua1RleHRQYXRoICAgICA9IGhlbHBlclBhcmFtZXRlcnMub3B0aW9u
cy5saW5rVGV4dFBhdGgsCi0gICAgICAgICAgcGF0aHMgPSBnZXRSZXNvbHZlZFBhdGhzKGhlbHBl
clBhcmFtZXRlcnMpLAotICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKLSAgICAgICAg
ICBwYXRoLCBpLCBub3JtYWxpemVkUGF0aDsKLQotICAgICAgaWYgKGxpbmtUZXh0UGF0aCkgewot
ICAgICAgICBub3JtYWxpemVkUGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aCho
ZWxwZXJQYXJhbWV0ZXJzLmNvbnRleHQsIGxpbmtUZXh0UGF0aCwgaGVscGVyUGFyYW1ldGVycy5v
cHRpb25zLmRhdGEpOwotICAgICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZFBh
dGgucm9vdCwgbm9ybWFsaXplZFBhdGgucGF0aCwgdGhpcywgdGhpcy5yZXJlbmRlcik7Ci0gICAg
ICB9Ci0KLSAgICAgIGZvcihpPTA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICBwYXRoID0g
cGF0aHNbaV07Ci0gICAgICAgIGlmIChudWxsID09PSBwYXRoKSB7Ci0gICAgICAgICAgLy8gQSBs
aXRlcmFsIHZhbHVlIHdhcyBwcm92aWRlZCwgbm90IGEgcGF0aCwgc28gbm90aGluZyB0byBvYnNl
cnZlLgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbm9ybWFsaXpl
ZFBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoaGVscGVyUGFyYW1ldGVycy5j
b250ZXh0LCBwYXRoLCBoZWxwZXJQYXJhbWV0ZXJzLm9wdGlvbnMuZGF0YSk7Ci0gICAgICAgIHRo
aXMucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkUGF0aC5yb290LCBub3JtYWxpemVkUGF0aC5w
YXRoLCB0aGlzLCB0aGlzLl9wYXJhbXNDaGFuZ2VkKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAg
YWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKCl7Ci0gICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBh
cmd1bWVudHMpOwotICAgICAgdGhpcy5fc2V0dXBQYXRoT2JzZXJ2ZXJzKCk7Ci0gICAgfSwKLQot
ICAgIC8qKgotICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSBvYnNlcnZlcnMgaW5zdGFs
bGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJlCi0gICAgICB3aGVuZXZlciB0aGUgcXVlcnkgcGFy
YW1zIGNoYW5nZQotICAgICAgQHByaXZhdGUKLSAgICAgKi8KLSAgICBfcXVlcnlQYXJhbXNDaGFu
Z2VkOiBmdW5jdGlvbiAob2JqZWN0LCBwYXRoKSB7Ci0gICAgICB0aGlzLm5vdGlmeVByb3BlcnR5
Q2hhbmdlKCdxdWVyeVBhcmFtcycpOwotICAgIH0sCi0KLQotICAgIC8qKgotICAgICAgRXZlbiB0
aG91Z2ggdGhpcyBpc24ndCBhIHZpcnR1YWwgdmlldywgd2Ugd2FudCB0byB0cmVhdCBpdCBhcyBp
ZiBpdCBpcwotICAgICAgc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgcGFyZW50IHdpdGgge3t2
aWV3LnByb3B9fQotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQG1ldGhvZCBjb25jcmV0ZVZpZXcK
LSAgICAqKi8KLSAgICBjb25jcmV0ZVZpZXc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewot
ICAgICAgcmV0dXJuIGdldCh0aGlzLCAncGFyZW50VmlldycpOwotICAgIH0pLnByb3BlcnR5KCdw
YXJlbnRWaWV3JyksCi0KLSAgICAvKioKLQotICAgICAgQWNjZXNzZWQgYXMgYSBjbGFzc25hbWUg
YmluZGluZyB0byBhcHBseSB0aGUgYExpbmtWaWV3YCdzIGBkaXNhYmxlZENsYXNzYAotICAgICAg
Q1NTIGBjbGFzc2AgdG8gdGhlIGVsZW1lbnQgd2hlbiB0aGUgbGluayBpcyBkaXNhYmxlZC4KLQot
ICAgICAgV2hlbiBgdHJ1ZWAgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGVsZW1lbnQgd2lsbCBub3Qg
dHJpZ2dlciByb3V0ZSBjaGFuZ2VzLgotICAgICAgQHByb3BlcnR5IGRpc2FibGVkCi0gICAgKi8K
LSAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gY29tcHV0ZUxpbmtWaWV3RGlz
YWJsZWQoa2V5LCB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgdGhp
cy5zZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUpOyB9Ci0KLSAgICAgIHJldHVybiB2YWx1ZSA/IGdl
dCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7Ci0gICAgfSksCi0KLSAgICAvKioKLSAg
ICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJpbmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rVmll
d2AncyBgYWN0aXZlQ2xhc3NgCi0gICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVu
IHRoZSBsaW5rIGlzIGFjdGl2ZS4KLQotICAgICAgQSBgTGlua1ZpZXdgIGlzIGNvbnNpZGVyZWQg
YWN0aXZlIHdoZW4gaXRzIGBjdXJyZW50V2hlbmAgcHJvcGVydHkgaXMgYHRydWVgCi0gICAgICBv
ciB0aGUgYXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtW
aWV3YCB3b3VsZCB0cmlnZ2VyCi0gICAgICB0cmFuc2l0aW9ucyBpbnRvLgotCi0gICAgICBAcHJv
cGVydHkgYWN0aXZlCi0gICAgKiovCi0gICAgYWN0aXZlOiBFbWJlci5jb21wdXRlZChmdW5jdGlv
biBjb21wdXRlTGlua1ZpZXdBY3RpdmUoKSB7Ci0gICAgICBpZiAoZ2V0KHRoaXMsICdsb2FkaW5n
JykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgIHZhciByb3V0ZXIgPSBnZXQodGhpcywgJ3Jv
dXRlcicpLAotICAgICAgICAgIHJvdXRlQXJncyA9IGdldCh0aGlzLCAncm91dGVBcmdzJyksCi0g
ICAgICAgICAgY29udGV4dHMgPSByb3V0ZUFyZ3Muc2xpY2UoMSksCi0gICAgICAgICAgcmVzb2x2
ZWRQYXJhbXMgPSBnZXQodGhpcywgJ3Jlc29sdmVkUGFyYW1zJyksCi0gICAgICAgICAgY3VycmVu
dFdoZW4gPSB0aGlzLmN1cnJlbnRXaGVuIHx8IHJlc29sdmVkUGFyYW1zWzBdLAotICAgICAgICAg
IGN1cnJlbnRXaXRoSW5kZXggPSBjdXJyZW50V2hlbiArICcuaW5kZXgnLAotICAgICAgICAgIGlz
QWN0aXZlID0gcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwgW2N1cnJlbnRXaGVuXS5jb25j
YXQoY29udGV4dHMpKSB8fAotICAgICAgICAgICAgICAgICAgICAgcm91dGVyLmlzQWN0aXZlLmFw
cGx5KHJvdXRlciwgW2N1cnJlbnRXaXRoSW5kZXhdLmNvbmNhdChjb250ZXh0cykpOwotCi0gICAg
ICBpZiAoaXNBY3RpdmUpIHsgcmV0dXJuIGdldCh0aGlzLCAnYWN0aXZlQ2xhc3MnKTsgfQotICAg
IH0pLnByb3BlcnR5KCdyZXNvbHZlZFBhcmFtcycsICdyb3V0ZUFyZ3MnLCAncm91dGVyLnVybCcp
LAotCi0gICAgLyoqCi0gICAgICBBY2Nlc3NlZCBhcyBhIGNsYXNzbmFtZSBiaW5kaW5nIHRvIGFw
cGx5IHRoZSBgTGlua1ZpZXdgJ3MgYGxvYWRpbmdDbGFzc2AKLSAgICAgIENTUyBgY2xhc3NgIHRv
IHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgbG9hZGluZy4KLQotICAgICAgQSBgTGlua1Zp
ZXdgIGlzIGNvbnNpZGVyZWQgbG9hZGluZyB3aGVuIGl0IGhhcyBhdCBsZWFzdCBvbmUKLSAgICAg
IHBhcmFtZXRlciB3aG9zZSB2YWx1ZSBpcyBjdXJyZW50bHkgbnVsbCBvciB1bmRlZmluZWQuIER1
cmluZwotICAgICAgdGhpcyB0aW1lLCBjbGlja2luZyB0aGUgbGluayB3aWxsIHBlcmZvcm0gbm8g
dHJhbnNpdGlvbiBhbmQKLSAgICAgIGVtaXQgYSB3YXJuaW5nIHRoYXQgdGhlIGxpbmsgaXMgc3Rp
bGwgaW4gYSBsb2FkaW5nIHN0YXRlLgotCi0gICAgICBAcHJvcGVydHkgbG9hZGluZwotICAgICoq
LwotICAgIGxvYWRpbmc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld0xv
YWRpbmcoKSB7Ci0gICAgICBpZiAoIWdldCh0aGlzLCAncm91dGVBcmdzJykpIHsgcmV0dXJuIGdl
dCh0aGlzLCAnbG9hZGluZ0NsYXNzJyk7IH0KLSAgICB9KS5wcm9wZXJ0eSgncm91dGVBcmdzJyks
Ci0KLSAgICAvKioKLSAgICAgIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiByb3V0ZXIg
ZnJvbSB0aGUgY29udGFpbmVyLgotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQHByb3BlcnR5IHJv
dXRlcgotICAgICoqLwotICAgIHJvdXRlcjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gZ2V0KHRoaXMsICdjb250cm9sbGVyJykuY29udGFpbmVyLmxvb2t1cCgncm91
dGVyOm1haW4nKTsKLSAgICB9KSwKLQotICAgIC8qKgotICAgICAgRXZlbnQgaGFuZGxlciB0aGF0
IGludm9rZXMgdGhlIGxpbmssIGFjdGl2YXRpbmcgdGhlIGFzc29jaWF0ZWQgcm91dGUuCi0KLSAg
ICAgIEBwcml2YXRlCi0gICAgICBAbWV0aG9kIF9pbnZva2UKLSAgICAgIEBwYXJhbSB7RXZlbnR9
IGV2ZW50Ci0gICAgKi8KLSAgICBfaW52b2tlOiBmdW5jdGlvbihldmVudCkgewotICAgICAgaWYg
KCFpc1NpbXBsZUNsaWNrKGV2ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgICBpZiAodGhp
cy5wcmV2ZW50RGVmYXVsdCAhPT0gZmFsc2UpIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfQot
ICAgICAgaWYgKHRoaXMuYnViYmxlcyA9PT0gZmFsc2UpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9u
KCk7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAnX2lzRGlzYWJsZWQnKSkgeyByZXR1cm4gZmFs
c2U7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAnbG9hZGluZycpKSB7Ci0gICAgICAgIEVtYmVy
LkxvZ2dlci53YXJuKCJUaGlzIGxpbmstdG8gaXMgaW4gYW4gaW5hY3RpdmUgbG9hZGluZyBzdGF0
ZSBiZWNhdXNlIGF0IGxlYXN0IG9uZSBvZiBpdHMgcGFyYW1ldGVycyBwcmVzZW50bHkgaGFzIGEg
bnVsbC91bmRlZmluZWQgdmFsdWUsIG9yIHRoZSBwcm92aWRlZCByb3V0ZSBuYW1lIGlzIGludmFs
aWQuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgdmFyIHJvdXRl
ciA9IGdldCh0aGlzLCAncm91dGVyJyksCi0gICAgICAgICAgcm91dGVBcmdzID0gZ2V0KHRoaXMs
ICdyb3V0ZUFyZ3MnKTsKLQotICAgICAgaWYgKGdldCh0aGlzLCAncmVwbGFjZScpKSB7Ci0gICAg
ICAgIHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIHJvdXRlQXJncyk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICByb3V0ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgcm91dGVB
cmdzKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLyoqCi0gICAgICBDb21wdXRlZCBwcm9wZXJ0
eSB0aGF0IHJldHVybnMgdGhlIHJlc29sdmVkIHBhcmFtZXRlcnMuCi0KLSAgICAgIEBwcml2YXRl
Ci0gICAgICBAcHJvcGVydHkKLSAgICAgIEByZXR1cm4ge0FycmF5fQotICAgICAqLwotICAgIHJl
c29sdmVkUGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAgIHZhciBwYXJh
bWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzLAotICAgICAgICAgIG9wdGlvbnMgPSBwYXJhbWV0ZXJz
Lm9wdGlvbnMsCi0gICAgICAgICAgdHlwZXMgPSBvcHRpb25zLnR5cGVzLAotICAgICAgICAgIGRh
dGEgPSBvcHRpb25zLmRhdGE7Ci0KLSAgICAgIAotICAgICAgLy8gT3JpZ2luYWwgaW1wbGVtZW50
YXRpb24gaWYgcXVlcnkgcGFyYW1zIG5vdCBlbmFibGVkCi0gICAgICByZXR1cm4gcmVzb2x2ZVBh
cmFtcyhwYXJhbWV0ZXJzLmNvbnRleHQsIHBhcmFtZXRlcnMucGFyYW1zLCB7IHR5cGVzOiB0eXBl
cywgZGF0YTogZGF0YSB9KTsKLSAgICB9KS5wcm9wZXJ0eSgpLAotCi0gICAgLyoqCi0gICAgICBD
b21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcm91dGUgbmFtZSBhbmQK
LSAgICAgIGFueSBkeW5hbWljIHNlZ21lbnRzLgotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQHBy
b3BlcnR5Ci0gICAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcm91dGUgbmFt
ZSBhbmQgYW55IGR5bmFtaWMgc2VnbWVudHMKLSAgICAgKi8KLSAgICByb3V0ZUFyZ3M6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld1JvdXRlQXJncygpIHsKLSAgICAgIHZh
ciByZXNvbHZlZFBhcmFtcyA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJhbXMnKS5zbGljZSgwKSwK
LSAgICAgICAgICByb3V0ZXIgPSBnZXQodGhpcywgJ3JvdXRlcicpLAotICAgICAgICAgIG5hbWVk
Um91dGUgPSByZXNvbHZlZFBhcmFtc1swXTsKLQotICAgICAgaWYgKCFuYW1lZFJvdXRlKSB7IHJl
dHVybjsgfQotCi0gICAgICBuYW1lZFJvdXRlID0gZnVsbFJvdXRlTmFtZShyb3V0ZXIsIG5hbWVk
Um91dGUpOwotICAgICAgcmVzb2x2ZWRQYXJhbXNbMF0gPSBuYW1lZFJvdXRlOwotCi0gICAgICBm
b3IgKHZhciBpID0gMSwgbGVuID0gcmVzb2x2ZWRQYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKLSAgICAgICAgdmFyIHBhcmFtID0gcmVzb2x2ZWRQYXJhbXNbaV07Ci0gICAgICAgIGlmIChw
YXJhbSA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyYW0gPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAg
ICAgLy8gSWYgY29udGV4dHMgYXJlbid0IHByZXNlbnQsIGNvbnNpZGVyIHRoZSBsaW5rVmlldyB1
bmxvYWRlZC4KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAg
Ci0gICAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbXM7Ci0gICAgfSkucHJvcGVydHkoJ3Jlc29sdmVk
UGFyYW1zJywgJ3F1ZXJ5UGFyYW1zJywgJ3JvdXRlci51cmwnKSwKLQotCi0gICAgX3BvdGVudGlh
bFF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgbmFt
ZWRSb3V0ZSA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJhbXMnKVswXTsKLSAgICAgIGlmICghbmFt
ZWRSb3V0ZSkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgdmFyIHJvdXRlciAgICAgICAgICA9IGdl
dCh0aGlzLCAncm91dGVyJyk7Ci0KLSAgICAgIG5hbWVkUm91dGUgPSBmdWxsUm91dGVOYW1lKHJv
dXRlciwgbmFtZWRSb3V0ZSk7Ci0KLSAgICAgIHJldHVybiByb3V0ZXIucm91dGVyLnF1ZXJ5UGFy
YW1zRm9ySGFuZGxlcihuYW1lZFJvdXRlKTsKLSAgICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJh
bXMnKSwKLQotICAgIHF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0g
ICAgICB2YXIgc2VsZiAgICAgICAgICAgICAgPSB0aGlzLAotICAgICAgICBxdWVyeVBhcmFtcyAg
ICAgICAgID0gbnVsbCwKLSAgICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1zICA9IGdldCh0aGlzLCAn
X3BvdGVudGlhbFF1ZXJ5UGFyYW1zJyk7Ci0KLSAgICAgIGlmICghYWxsb3dlZFF1ZXJ5UGFyYW1z
KSB7IHJldHVybiBudWxsOyB9Ci0gICAgICBhbGxvd2VkUXVlcnlQYXJhbXMuZm9yRWFjaChmdW5j
dGlvbiAocGFyYW0pIHsKLSAgICAgICAgdmFyIHZhbHVlID0gZ2V0KHNlbGYsIHBhcmFtKTsKLSAg
ICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICBxdWVy
eVBhcmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9OwotICAgICAgICAgIHF1ZXJ5UGFyYW1zW3BhcmFt
XSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotCi0gICAgICByZXR1cm4gcXVlcnlQ
YXJhbXM7Ci0gICAgfSkucHJvcGVydHkoJ19wb3RlbnRpYWxRdWVyeVBhcmFtcy5bXScpLAotCi0g
ICAgLyoqCi0gICAgICBTZXRzIHRoZSBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0ZSB0byB0aGUg
dXJsIGZvcgotICAgICAgdGhlIGBMaW5rVmlld2AncyB0YXJnZXRlZCByb3V0ZS4KLQotICAgICAg
SWYgdGhlIGBMaW5rVmlld2AncyBgdGFnTmFtZWAgaXMgY2hhbmdlZCB0byBhIHZhbHVlIG90aGVy
Ci0gICAgICB0aGFuIGBhYCwgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCi0KLSAgICAg
IEBwcm9wZXJ0eSBocmVmCi0gICAgKiovCi0gICAgaHJlZjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rp
b24gY29tcHV0ZUxpbmtWaWV3SHJlZigpIHsKLSAgICAgIGlmIChnZXQodGhpcywgJ3RhZ05hbWUn
KSAhPT0gJ2EnKSB7IHJldHVybjsgfQotCi0gICAgICB2YXIgcm91dGVyID0gZ2V0KHRoaXMsICdy
b3V0ZXInKSwKLSAgICAgICAgICByb3V0ZUFyZ3MgPSBnZXQodGhpcywgJ3JvdXRlQXJncycpOwot
Ci0gICAgICByZXR1cm4gcm91dGVBcmdzID8gcm91dGVyLmdlbmVyYXRlLmFwcGx5KHJvdXRlciwg
cm91dGVBcmdzKSA6IGdldCh0aGlzLCAnbG9hZGluZ0hyZWYnKTsKLSAgICB9KS5wcm9wZXJ0eSgn
cm91dGVBcmdzJyksCi0KLSAgICAvKioKLSAgICAgIFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8g
dXNlIHdoaWxlIGEgbGluay10byBpcyBsb2FkaW5nLgotICAgICAgT25seSBhcHBsaWVzIHdoZW4g
dGFnTmFtZSBpcyAnYScKLQotICAgICAgQHByb3BlcnR5IGxvYWRpbmdIcmVmCi0gICAgICBAdHlw
ZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0ICMKLSAgICAqLwotICAgIGxvYWRpbmdIcmVmOiAnIycK
LSAgfSk7Ci0KLSAgTGlua1ZpZXcudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJMaW5r
VmlldyI7IH07Ci0KLSAgLyoqCi0gICAgVGhlIGB7e2xpbmstdG99fWAgaGVscGVyIHJlbmRlcnMg
YSBsaW5rIHRvIHRoZSBzdXBwbGllZAotICAgIGByb3V0ZU5hbWVgIHBhc3NpbmcgYW4gb3B0aW9u
YWxseSBzdXBwbGllZCBtb2RlbCB0byB0aGUKLSAgICByb3V0ZSBhcyBpdHMgYG1vZGVsYCBjb250
ZXh0IG9mIHRoZSByb3V0ZS4gVGhlIGJsb2NrCi0gICAgZm9yIGB7e2xpbmstdG99fWAgYmVjb21l
cyB0aGUgaW5uZXJIVE1MIG9mIHRoZSByZW5kZXJlZAotICAgIGVsZW1lbnQ6Ci0KLSAgICBgYGBo
YW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5J319Ci0gICAgICBHcmVhdCBI
YW1zdGVyIFBob3RvcwotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAot
ICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3RvcyI+Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3Rv
cwotICAgIDwvYT4KLSAgICBgYGAKLQotICAgICMjIyBTdXBwbHlpbmcgYSB0YWdOYW1lCi0gICAg
QnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIHJlbmRlcnMgYW4gYDxhPmAgZWxlbWVudC4gVGhpcyBj
YW4KLSAgICBiZSBvdmVycmlkZGVuIGZvciBhIHNpbmdsZSB1c2Ugb2YgYHt7bGluay10b319YCBi
eSBzdXBwbHlpbmcKLSAgICBhIGB0YWdOYW1lYCBvcHRpb246Ci0KLSAgICBgYGBoYW5kbGViYXJz
Ci0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyB0YWdOYW1lPSJsaSJ9fQotICAgICAgR3Jl
YXQgSGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAKLQotICAgIGBgYGh0
bWwKLSAgICA8bGk+Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIDwvbGk+Ci0gICAg
YGBgCi0KLSAgICBUbyBvdmVycmlkZSB0aGlzIG9wdGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGlj
YXRpb24sIHNlZQotICAgICJPdmVycmlkaW5nIEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgot
Ci0gICAgIyMjIERpc2FibGluZyB0aGUgYGxpbmstdG9gIGhlbHBlcgotICAgIEJ5IGRlZmF1bHQg
YHt7bGluay10b319YCBpcyBlbmFibGVkLgotICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2Fi
bGVkYCBoZWxwZXIgcHJvcGVydHkgd2lsbCBkaXNhYmxlIHRoZSBgbGluay10b2AgaGVscGVyLgot
Ci0gICAgc3RhdGljIHVzZTogdGhlIGBkaXNhYmxlZGAgb3B0aW9uOgotCi0gICAgYGBgaGFuZGxl
YmFycwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWQ9dHJ1ZX19Ci0gICAg
ICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAg
ZHluYW1pYyB1c2U6IHRoZSBgZGlzYWJsZWRXaGVuYCBvcHRpb246Ci0KLSAgICBgYGBoYW5kbGVi
YXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBkaXNhYmxlZFdoZW49Y29udHJvbGxl
ci5zb21lUHJvcGVydHl9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5r
LXRvfX0KLSAgICBgYGAKLQotICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2FibGVkYCB3aWxs
IGRpc2FibGUgaXQgZXhjZXB0IGB1bmRlZmluZWRgLgotICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkg
YHRydWVgIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBoZWxwZXIgeW91IGNhbgotICAgIG92ZXJyaWRl
IHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBFbWJlci5MaW5rVmlld2AuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgRW1iZXIuTGlua1ZpZXcucmVvcGVuKHsKLSAgICAgIGRpc2FibGVkOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPT0g
dW5kZWZpbmVkKSB7Ci0gICAgICAgICAgdGhpcy5zZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUgPT09
IHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IGdldCh0
aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7Ci0gICAgICB9KQotICAgIH0pOwotICAgIGBg
YAotCi0gICAgc2VlICJPdmVycmlkaW5nIEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiIGZvciBt
b3JlLgotCi0gICAgIyMjIEhhbmRsaW5nIGBocmVmYAotICAgIGB7e2xpbmstdG99fWAgd2lsbCB1
c2UgeW91ciBhcHBsaWNhdGlvbidzIFJvdXRlciB0bwotICAgIGZpbGwgdGhlIGVsZW1lbnQncyBg
aHJlZmAgcHJvcGVydHkgd2l0aCBhIHVybCB0aGF0Ci0gICAgbWF0Y2hlcyB0aGUgcGF0aCB0byB0
aGUgc3VwcGxpZWQgYHJvdXRlTmFtZWAgZm9yIHlvdXIKLSAgICByb3V0ZXJzJ3MgY29uZmlndXJl
ZCBgTG9jYXRpb25gIHNjaGVtZSwgd2hpY2ggZGVmYXVsdHMKLSAgICB0byBFbWJlci5IYXNoTG9j
YXRpb24uCi0KLSAgICAjIyMgSGFuZGxpbmcgY3VycmVudCByb3V0ZQotICAgIGB7e2xpbmstdG99
fWAgd2lsbCBhcHBseSBhIENTUyBjbGFzcyBuYW1lIG9mICdhY3RpdmUnCi0gICAgd2hlbiB0aGUg
YXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIG1hdGNoZXMKLSAgICB0aGUgc3VwcGxpZWQgcm91
dGVOYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uJ3MKLSAgICBjdXJyZW50IHJv
dXRlIGlzICdwaG90b0dhbGxlcnkucmVjZW50JyB0aGUgZm9sbG93aW5nCi0gICAgdXNlIG9mIGB7
e2xpbmstdG99fWA6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9H
YWxsZXJ5LnJlY2VudCd9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MgZnJvbSB0aGUgbGFz
dCB3ZWVrCi0gICAge3svbGluay10b319Ci0gICAgYGBgCi0KLSAgICB3aWxsIHJlc3VsdCBpbgot
Ci0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy90aGlzLXdlZWsiIGNs
YXNzPSJhY3RpdmUiPgotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKLSAgICA8L2E+Ci0gICAg
YGBgCi0KLSAgICBUaGUgQ1NTIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIGNsYXNzZXMgY2Fu
IGJlIGN1c3RvbWl6ZWQKLSAgICBmb3IgYSBzaW5nbGUgdXNlIG9mIGB7e2xpbmstdG99fWAgYnkg
cGFzc2luZyBhbiBgYWN0aXZlQ2xhc3NgCi0gICAgb3B0aW9uOgotCi0gICAgYGBgaGFuZGxlYmFy
cwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIGFjdGl2ZUNsYXNzPSJjdXJy
ZW50LXVybCJ9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MgZnJvbSB0aGUgbGFzdCB3ZWVr
Ci0gICAge3svbGluay10b319Ci0gICAgYGBgCi0KLSAgICBgYGBodG1sCi0gICAgPGEgaHJlZj0i
L2hhbXN0ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KLSAgICAgIEdy
ZWF0IEhhbXN0ZXIgUGhvdG9zCi0gICAgPC9hPgotICAgIGBgYAotCi0gICAgVG8gb3ZlcnJpZGUg
dGhpcyBvcHRpb24gZm9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBzZWUKLSAgICAiT3ZlcnJp
ZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRzIi4KLQotICAgICMjIyBTdXBwbHlpbmcgYSBt
b2RlbAotICAgIEFuIG9wdGlvbmFsIG1vZGVsIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGZvciByb3V0
ZXMgd2hvc2UKLSAgICBwYXRocyBjb250YWluIGR5bmFtaWMgc2VnbWVudHMuIFRoaXMgYXJndW1l
bnQgd2lsbCBiZWNvbWUKLSAgICB0aGUgbW9kZWwgY29udGV4dCBvZiB0aGUgbGlua2VkIHJvdXRl
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewot
ICAgICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxsZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rv
cy86cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0g
ICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBhUGhvdG99fQotICAgICAge3thUGhvdG8udGl0
bGV9fQotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhy
ZWY9Ii9oYW1zdGVyLXBob3Rvcy80MiI+Ci0gICAgICBUb21zdGVyCi0gICAgPC9hPgotICAgIGBg
YAotCi0gICAgIyMjIFN1cHBseWluZyBtdWx0aXBsZSBtb2RlbHMKLSAgICBGb3IgZGVlcC1saW5r
aW5nIHRvIHJvdXRlIHBhdGhzIHRoYXQgY29udGFpbiBtdWx0aXBsZQotICAgIGR5bmFtaWMgc2Vn
bWVudHMsIG11bHRpcGxlIG1vZGVsIGFyZ3VtZW50cyBjYW4gYmUgdXNlZC4KLSAgICBBcyB0aGUg
cm91dGVyIHRyYW5zaXRpb25zIHRocm91Z2ggdGhlIHJvdXRlIHBhdGgsIGVhY2gKLSAgICBzdXBw
bGllZCBtb2RlbCBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgY29udGV4dCBmb3IgdGhlCi0gICAg
cm91dGUgd2l0aCB0aGUgZHluYW1pYyBzZWdtZW50czoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoInBob3Rv
R2FsbGVyeSIsIHtwYXRoOiAiaGFtc3Rlci1waG90b3MvOnBob3RvX2lkIn0sIGZ1bmN0aW9uKCkg
ewotICAgICAgICB0aGlzLnJvdXRlKCJjb21tZW50Iiwge3BhdGg6ICJjb21tZW50cy86Y29tbWVu
dF9pZCJ9KTsKLSAgICAgIH0pOwotICAgIH0pOwotICAgIGBgYAotICAgIFRoaXMgYXJndW1lbnQg
d2lsbCBiZWNvbWUgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtlZCByb3V0ZToKLQotICAg
IGBgYGhhbmRsZWJhcnMKLSAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnkuY29tbWVudCcgYVBo
b3RvIGNvbW1lbnR9fQotICAgICAge3tjb21tZW50LmJvZHl9fQotICAgIHt7L2xpbmstdG99fQot
ICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9j
b21tZW50LzcxOCI+Ci0gICAgICBBKysrIHdvdWxkIHNudWdnbGUgYWdhaW4uCi0gICAgPC9hPgot
ICAgIGBgYAotCi0gICAgIyMjIFN1cHBseWluZyBhbiBleHBsaWNpdCBkeW5hbWljIHNlZ21lbnQg
dmFsdWUKLSAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIG1vZGVsIG9iamVjdCBhdmFpbGFibGUgdG8g
cGFzcyB0byBge3tsaW5rLXRvfX1gLAotICAgIGFuIG9wdGlvbmFsIHN0cmluZyBvciBpbnRlZ2Vy
IGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgZm9yIHJvdXRlcyB3aG9zZQotICAgIHBhdGhzIGNvbnRh
aW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgdmFsdWUK
LSAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxs
ZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBh
UGhvdG9JZH19Ci0gICAgICB7e2FQaG90by50aXRsZX19Ci0gICAge3svbGluay10b319Ci0gICAg
YGBgCi0KLSAgICBgYGBodG1sCi0gICAgPGEgaHJlZj0iL2hhbXN0ZXItcGhvdG9zLzQyIj4KLSAg
ICAgIFRvbXN0ZXIKLSAgICA8L2E+Ci0gICAgYGBgCi0KLSAgICBXaGVuIHRyYW5zaXRpb25pbmcg
aW50byB0aGUgbGlua2VkIHJvdXRlLCB0aGUgYG1vZGVsYCBob29rIHdpbGwKLSAgICBiZSB0cmln
Z2VyZWQgd2l0aCBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVyLgot
Ci0gICAgIyMjIEFsbG93aW5nIERlZmF1bHQgQWN0aW9uCi0KLSAgIEJ5IGRlZmF1bHQgdGhlIGB7
e2xpbmstdG99fWAgaGVscGVyIHByZXZlbnRzIHRoZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uCi0g
ICBieSBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdCgpYCBhcyB0aGlzIHNvcnQgb2YgYWN0aW9uIGJ1
YmJsaW5nIGlzIG5vcm1hbGx5Ci0gICBoYW5kbGVkIGludGVybmFsbHkgYW5kIHdlIGRvIG5vdCB3
YW50IHRvIHRha2UgdGhlIGJyb3dzZXIgdG8gYSBuZXcgVVJMIChmb3IKLSAgIGV4YW1wbGUpLgot
Ci0gICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHNwZWNpZnkgYHByZXZl
bnREZWZhdWx0PWZhbHNlYCBpbgotICAgeW91ciB0ZW1wbGF0ZToKLQotICAgIGBgYGhhbmRsZWJh
cnMKLSAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQaG90b0lkIHByZXZlbnREZWZhdWx0
PWZhbHNlfX0KLSAgICAgIHt7YVBob3RvSWQudGl0bGV9fQotICAgIHt7L2xpbmstdG99fQotICAg
IGBgYAotCi0gICAgIyMjIE92ZXJyaWRpbmcgYXR0cmlidXRlcwotICAgIFlvdSBjYW4gb3ZlcnJp
ZGUgYW55IGdpdmVuIHByb3BlcnR5IG9mIHRoZSBFbWJlci5MaW5rVmlldwotICAgIHRoYXQgaXMg
Z2VuZXJhdGVkIGJ5IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciBieSBwYXNzaW5nCi0gICAga2V5
L3ZhbHVlIHBhaXJzLCBsaWtlIHNvOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2xpbmst
dG8gIGFQaG90byB0YWdOYW1lPSdsaScgdGl0bGU9J0ZvbGxvd2luZyB0aGlzIGxpbmsgd2lsbCBj
aGFuZ2UgeW91ciBsaWZlJyBjbGFzc05hbWVzPSdwaWMgc3dlZXQnfX0KLSAgICAgIFVoLW1hemlu
ZyEKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAKLQotICAgIFNlZSBbRW1iZXIuTGlua1ZpZXdd
KC9hcGkvY2xhc3Nlcy9FbWJlci5MaW5rVmlldy5odG1sKSBmb3IgYQotICAgIGNvbXBsZXRlIGxp
c3Qgb2Ygb3ZlcnJpZGVhYmxlIHByb3BlcnRpZXMuIEJlIHN1cmUgdG8gYWxzbwotICAgIGNoZWNr
IG91dCBpbmhlcml0ZWQgcHJvcGVydGllcyBvZiBgTGlua1ZpZXdgLgotCi0gICAgIyMjIE92ZXJy
aWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0cwotICAgIGBge3tsaW5rLXRvfX1gYCBjcmVh
dGVzIGFuIGluc3RhbmNlIG9mIEVtYmVyLkxpbmtWaWV3Ci0gICAgZm9yIHJlbmRlcmluZy4gVG8g
b3ZlcnJpZGUgb3B0aW9ucyBmb3IgeW91ciBlbnRpcmUKLSAgICBhcHBsaWNhdGlvbiwgcmVvcGVu
IEVtYmVyLkxpbmtWaWV3IGFuZCBzdXBwbHkgdGhlCi0gICAgZGVzaXJlZCB2YWx1ZXM6Ci0KLSAg
ICBgYGAgamF2YXNjcmlwdAotICAgIEVtYmVyLkxpbmtWaWV3LnJlb3Blbih7Ci0gICAgICBhY3Rp
dmVDbGFzczogImlzLWFjdGl2ZSIsCi0gICAgICB0YWdOYW1lOiAnbGknCi0gICAgfSkKLSAgICBg
YGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZl
bnQgaW4KLSAgICB0aGlzIG1hbm5lcjoKLQotICAgIGBgYCBqYXZhc2NyaXB0Ci0gICAgRW1iZXIu
TGlua1ZpZXcucmVvcGVuKHsKLSAgICAgIGV2ZW50TmFtZTogJ2N1c3RvbUV2ZW50TmFtZScKLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgbGluay10bwotICAgIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCi0gICAgQHBhcmFtIHtTdHJpbmd9IHJvdXRlTmFtZQotICAgIEBwYXJh
bSB7T2JqZWN0fSBbY29udGV4dF0qCi0gICAgQHBhcmFtIFtvcHRpb25zXSB7T2JqZWN0fSBIYW5k
bGViYXJzIGtleS92YWx1ZSBwYWlycyBvZiBvcHRpb25zLCB5b3UgY2FuIG92ZXJyaWRlIGFueSBw
cm9wZXJ0eSBvZiBFbWJlci5MaW5rVmlldwotICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJp
bmcKLSAgICBAc2VlIHtFbWJlci5MaW5rVmlld30KLSAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5y
ZWdpc3RlckhlbHBlcignbGluay10bycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcihuYW1lKSB7Ci0g
ICAgdmFyIG9wdGlvbnMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAotICAgICAg
ICBwYXJhbXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpLAotICAgICAgICBoYXNo
ID0gb3B0aW9ucy5oYXNoOwotCi0gICAgaGFzaC5kaXNhYmxlZEJpbmRpbmcgPSBoYXNoLmRpc2Fi
bGVkV2hlbjsKLQotICAgIGlmICghb3B0aW9ucy5mbikgewotICAgICAgdmFyIGxpbmtUaXRsZSA9
IHBhcmFtcy5zaGlmdCgpOwotICAgICAgdmFyIGxpbmtUeXBlID0gb3B0aW9ucy50eXBlcy5zaGlm
dCgpOwotICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwotICAgICAgaWYgKGxpbmtUeXBlID09PSAn
SUQnKSB7Ci0gICAgICAgIG9wdGlvbnMubGlua1RleHRQYXRoID0gbGlua1RpdGxlOwotICAgICAg
ICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgcmV0dXJuIEVtYmVyLkhhbmRs
ZWJhcnMuZ2V0KGNvbnRleHQsIGxpbmtUaXRsZSwgb3B0aW9ucyk7Ci0gICAgICAgIH07Ci0gICAg
ICB9IGVsc2UgewotICAgICAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
cmV0dXJuIGxpbmtUaXRsZTsKLSAgICAgICAgfTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBoYXNo
LnBhcmFtZXRlcnMgPSB7Ci0gICAgICBjb250ZXh0OiB0aGlzLAotICAgICAgb3B0aW9uczogb3B0
aW9ucywKLSAgICAgIHBhcmFtczogcGFyYW1zCi0gICAgfTsKLQotICAgIHJldHVybiBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIExpbmtWaWV3LCBvcHRpb25zKTsKLSAg
fSk7Ci0KLSAgLyoqCi0gICAgU2VlIFtsaW5rLXRvXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxl
YmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2xpbmstdG8pCi0KLSAgICBAbWV0aG9kIGxpbmtUbwot
ICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQGRlcHJlY2F0ZWQKLSAgICBA
cGFyYW0ge1N0cmluZ30gcm91dGVOYW1lCi0gICAgQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoK
LSAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJIZWxwZXIoJ2xpbmtUbycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcigpIHsKLSAg
ICBFbWJlci53YXJuKCJUaGUgJ2xpbmtUbycgdmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBm
YXZvciBvZiAnbGluay10byciKTsKLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
WydsaW5rLXRvJ10uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfSk7Ci19KTsKLQotCi0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcm91dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykg
ewotICAvKioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSAg
Ki8KLQotICBIYW5kbGViYXJzLk91dGxldFZpZXcgPSBFbWJlci5Db250YWluZXJWaWV3LmV4dGVu
ZChFbWJlci5fTWV0YW1vcnBoKTsKLQotICAvKioKLSAgICBUaGUgYG91dGxldGAgaGVscGVyIGlz
IGEgcGxhY2Vob2xkZXIgdGhhdCB0aGUgcm91dGVyIHdpbGwgZmlsbCBpbiB3aXRoCi0gICAgdGhl
IGFwcHJvcHJpYXRlIHRlbXBsYXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBh
cHBsaWNhdGlvbi4KLQotICAgIGBgYCBoYW5kbGViYXJzCi0gICAge3tvdXRsZXR9fQotICAgIGBg
YAotCi0gICAgQnkgZGVmYXVsdCwgYSB0ZW1wbGF0ZSBiYXNlZCBvbiBFbWJlcidzIG5hbWluZyBj
b252ZW50aW9ucyB3aWxsIGJlIHJlbmRlcmVkCi0gICAgaW50byB0aGUgYG91dGxldGAgKGUuZy4g
YEFwcC5Qb3N0c1JvdXRlYCB3aWxsIHJlbmRlciB0aGUgYHBvc3RzYCB0ZW1wbGF0ZSkuCi0KLSAg
ICBZb3UgY2FuIHJlbmRlciBhIGRpZmZlcmVudCB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgYHJlbmRl
cigpYCBtZXRob2QgaW4gdGhlCi0gICAgcm91dGUncyBgcmVuZGVyVGVtcGxhdGVgIGhvb2suIFRo
ZSBmb2xsb3dpbmcgd2lsbCByZW5kZXIgdGhlIGBmYXZvcml0ZVBvc3RgCi0gICAgdGVtcGxhdGUg
aW50byB0aGUgYG91dGxldGAuCi0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0c1Jv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlv
bigpIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcpOwotICAgICAgfQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgWW91IGNhbiBjcmVhdGUgY3VzdG9tIG5hbWVkIG91dGxldHMg
Zm9yIG1vcmUgY29udHJvbC4KLQotICAgIGBgYCBoYW5kbGViYXJzCi0gICAge3tvdXRsZXQgJ2Zh
dm9yaXRlUG9zdCd9fQotICAgIHt7b3V0bGV0ICdwb3N0cyd9fQotICAgIGBgYAotCi0gICAgVGhl
biB5b3UgY2FuIGRlZmluZSB3aGF0IHRlbXBsYXRlIGlzIHJlbmRlcmVkIGludG8gZWFjaCBvdXRs
ZXQgaW4geW91cgotICAgIHJvdXRlLgotCi0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5Q
b3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBm
dW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcsIHsgb3V0bGV0
OiAnZmF2b3JpdGVQb3N0JyB9KTsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ3Bvc3RzJywgeyBvdXRs
ZXQ6ICdwb3N0cycgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBZb3UgY2Fu
IHNwZWNpZnkgdGhlIHZpZXcgdGhhdCB0aGUgb3V0bGV0IHVzZXMgdG8gY29udGFpbiBhbmQgbWFu
YWdlIHRoZQotICAgIHRlbXBsYXRlcyByZW5kZXJlZCBpbnRvIGl0LgotCi0gICAgYGBgIGhhbmRs
ZWJhcnMKLSAgICB7e291dGxldCB2aWV3PSdzZWN0aW9uQ29udGFpbmVyJ319Ci0gICAgYGBgCi0K
LSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5TZWN0aW9uQ29udGFpbmVyID0gRW1iZXIuQ29u
dGFpbmVyVmlldy5leHRlbmQoewotICAgICAgdGFnTmFtZTogJ3NlY3Rpb24nLAotICAgICAgY2xh
c3NOYW1lczogWydzcGVjaWFsJ10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qgb3V0
bGV0Ci0gICAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgICBAcGFyYW0ge1N0cmlu
Z30gcHJvcGVydHkgdGhlIHByb3BlcnR5IG9uIHRoZSBjb250cm9sbGVyCi0gICAgICB0aGF0IGhv
bGRzIHRoZSB2aWV3IGZvciB0aGlzIG91dGxldAotICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBz
dHJpbmcKLSAgKi8KLSAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignb3V0bGV0JywgZnVuY3Rp
b24gb3V0bGV0SGVscGVyKHByb3BlcnR5LCBvcHRpb25zKSB7Ci0gICAKLSAgICB2YXIgb3V0bGV0
U291cmNlLAotICAgICAgICBjb250YWluZXIsCi0gICAgICAgIHZpZXdOYW1lLAotICAgICAgICB2
aWV3Q2xhc3MsCi0gICAgICAgIHZpZXdGdWxsTmFtZTsKLQotICAgIGlmIChwcm9wZXJ0eSAmJiBw
cm9wZXJ0eS5kYXRhICYmIHByb3BlcnR5LmRhdGEuaXNSZW5kZXJEYXRhKSB7Ci0gICAgICBvcHRp
b25zID0gcHJvcGVydHk7Ci0gICAgICBwcm9wZXJ0eSA9ICdtYWluJzsKLSAgICB9Ci0KLSAgICBj
b250YWluZXIgPSBvcHRpb25zLmRhdGEudmlldy5jb250YWluZXI7Ci0KLSAgICBvdXRsZXRTb3Vy
Y2UgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgICB3aGlsZSAoIW91dGxldFNvdXJjZS5nZXQoJ3Rl
bXBsYXRlLmlzVG9wJykpIHsKLSAgICAgIG91dGxldFNvdXJjZSA9IG91dGxldFNvdXJjZS5nZXQo
J19wYXJlbnRWaWV3Jyk7Ci0gICAgfQotCi0gICAgLy8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJy
aWRlCi0gICAgdmlld05hbWUgPSBvcHRpb25zLmhhc2gudmlldzsKLQotICAgIGlmICh2aWV3TmFt
ZSkgewotICAgICAgdmlld0Z1bGxOYW1lID0gJ3ZpZXc6JyArIHZpZXdOYW1lOwotICAgICAgRW1i
ZXIuYXNzZXJ0KCJVc2luZyBhIHF1b3RlbGVzcyB2aWV3IHBhcmFtZXRlciB3aXRoIHt7b3V0bGV0
fX0gaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0byBxdW90ZWQgdXNhZ2UgJ3t7b3V0
bGV0IFwiIiArIHZpZXdOYW1lICsgIlwifX0uIiwgb3B0aW9ucy5oYXNoVHlwZXMudmlldyAhPT0g
J0lEJyk7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRoZSB2aWV3IG5hbWUgeW91IHN1cHBsaWVkICci
ICsgdmlld05hbWUgKyAiJyBkaWQgbm90IHJlc29sdmUgdG8gYSB2aWV3LiIsIGNvbnRhaW5lci5o
YXModmlld0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgdmlld0NsYXNzID0gdmlld05hbWUgPyBj
b250YWluZXIubG9va3VwRmFjdG9yeSh2aWV3RnVsbE5hbWUpIDogb3B0aW9ucy5oYXNoLnZpZXdD
bGFzcyB8fCBIYW5kbGViYXJzLk91dGxldFZpZXc7Ci0KLSAgICBvcHRpb25zLmRhdGEudmlldy5z
ZXQoJ291dGxldFNvdXJjZScsIG91dGxldFNvdXJjZSk7Ci0gICAgb3B0aW9ucy5oYXNoLmN1cnJl
bnRWaWV3QmluZGluZyA9ICdfdmlldy5vdXRsZXRTb3VyY2UuX291dGxldHMuJyArIHByb3BlcnR5
OwotCi0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywgdmlld0Ns
YXNzLCBvcHRpb25zKTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIg
Z2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkhh
bmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7Ci0KLSAgLyoqCi0gICAgQ2FsbGluZyBg
YHt7cmVuZGVyfX1gYCBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIHdpbGwgaW5zZXJ0IGFub3RoZXIK
LSAgICB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIG5hbWUuIFRoZSBpbnNlcnRl
ZCB0ZW1wbGF0ZSB3aWxsCi0gICAgYWNjZXNzIGl0cyBwcm9wZXJ0aWVzIG9uIGl0cyBvd24gY29u
dHJvbGxlciAocmF0aGVyIHRoYW4gdGhlIGNvbnRyb2xsZXIKLSAgICBvZiB0aGUgcGFyZW50IHRl
bXBsYXRlKS4KLQotICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3Rz
LCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4KLQotICAgIE5vdGU6IEEgZ2l2ZW4g
Y29udHJvbGxlciBtYXkgb25seSBiZSB1c2VkICpvbmNlKiBpbiB5b3VyIGFwcCBpbiB0aGlzIG1h
bm5lci4KLSAgICBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgY29udHJvbGxlciB3aWxsIGJl
IGNyZWF0ZWQgZm9yIHlvdS4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLk5hdmlnYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewot
ICAgICAgd2hvOiAid29ybGQiCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJz
Ci0gICAgPCEtLSBuYXZpZ2F0aW9uLmhicyAtLT4KLSAgICBIZWxsbywge3t3aG99fS4KLSAgICBg
YGAKLQotICAgIGBgYGhhbmRlbGJhcnMKLSAgICA8IS0tIGFwcGxpY2F0aW9uLmhicyAtLT4KLSAg
ICA8aDE+TXkgZ3JlYXQgYXBwPC9oMT4KLSAgICB7e3JlbmRlciBuYXZpZ2F0aW9ufX0KLSAgICBg
YGAKLQotICAgIGBgYGh0bWwKLSAgICA8aDE+TXkgZ3JlYXQgYXBwPC9oMT4KLSAgICA8ZGl2IGNs
YXNzPSdlbWJlci12aWV3Jz4KLSAgICAgIEhlbGxvLCB3b3JsZC4KLSAgICA8L2Rpdj4KLSAgICBg
YGAKLQotICAgIE9wdGlvbmFsbHkgeW91IG1heSBwcm92aWRlIGEgc2Vjb25kIGFyZ3VtZW50OiBh
IHByb3BlcnR5IHBhdGgKLSAgICB0aGF0IHdpbGwgYmUgYm91bmQgdG8gdGhlIGBtb2RlbGAgcHJv
cGVydHkgb2YgdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBJZiBhIGBtb2RlbGAgcHJvcGVydHkgcGF0
aCBpcyBzcGVjaWZpZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCi0gICAgY29udHJvbGxl
ciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7e3JlbmRlcn19YCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0
aW1lcwotICAgIHdpdGggdGhlIHNhbWUgbmFtZS4KLQotICAgRm9yIGV4YW1wbGUgaWYgeW91IGhh
ZCB0aGlzIGBhdXRob3JgIHRlbXBsYXRlLgotCi0gICBgYGBoYW5kbGViYXJzCi08ZGl2IGNsYXNz
PSJhdXRob3IiPgotICBXcml0dGVuIGJ5IHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19LgotICBU
b3RhbCBQb3N0czoge3twb3N0Q291bnR9fQotPC9kaXY+Ci0gIGBgYAotCi0gIFlvdSBjb3VsZCBy
ZW5kZXIgaXQgaW5zaWRlIHRoZSBgcG9zdGAgdGVtcGxhdGUgdXNpbmcgdGhlIGByZW5kZXJgIGhl
bHBlci4KLQotICBgYGBoYW5kbGViYXJzCi08ZGl2IGNsYXNzPSJwb3N0Ij4KLSAgPGgxPnt7dGl0
bGV9fTwvaDE+Ci0gIDxkaXY+e3tib2R5fX08L2Rpdj4KLSAge3tyZW5kZXIgImF1dGhvciIgYXV0
aG9yfX0KLTwvZGl2PgotICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbmRlcgotICAgIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgICBAcGFy
YW0ge09iamVjdD99IGNvbnRleHRTdHJpbmcKLSAgICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAg
ICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJhcnMu
cmVnaXN0ZXJIZWxwZXIoJ3JlbmRlcicsIGZ1bmN0aW9uIHJlbmRlckhlbHBlcihuYW1lLCBjb250
ZXh0U3RyaW5nLCBvcHRpb25zKSB7Ci0gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7
Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGUgdG8gcmVuZGVyIiwg
bGVuZ3RoID49IDIpOwotICAgIHZhciBjb250ZXh0UHJvdmlkZWQgPSBsZW5ndGggPT09IDMsCi0g
ICAgICAgIGNvbnRhaW5lciwgcm91dGVyLCBjb250cm9sbGVyLCB2aWV3LCBjb250ZXh0LCBsb29r
dXBPcHRpb25zOwotCi0gICAgY29udGFpbmVyID0gKG9wdGlvbnMgfHwgY29udGV4dFN0cmluZyku
ZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyLmNvbnRhaW5lcjsKLSAgICByb3V0ZXIgPSBjb250YWlu
ZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotCi0gICAgaWYgKGxlbmd0aCA9PT0gMikgewotICAg
ICAgLy8gdXNlIHRoZSBzaW5nbGV0b24gY29udHJvbGxlcgotICAgICAgb3B0aW9ucyA9IGNvbnRl
eHRTdHJpbmc7Ci0gICAgICBjb250ZXh0U3RyaW5nID0gdW5kZWZpbmVkOwotICAgICAgRW1iZXIu
YXNzZXJ0KCJZb3UgY2FuIG9ubHkgdXNlIHRoZSB7e3JlbmRlcn19IGhlbHBlciBvbmNlIHdpdGhv
dXQgYSBtb2RlbCBvYmplY3QgYXMgaXRzIHNlY29uZCBhcmd1bWVudCwgYXMgaW4ge3tyZW5kZXIg
XCJwb3N0XCIgcG9zdH19LiIsICFyb3V0ZXIgfHwgIXJvdXRlci5fbG9va3VwQWN0aXZlVmlldyhu
YW1lKSk7Ci0gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDMpIHsKLSAgICAgIC8vIGNyZWF0ZSBh
IG5ldyBjb250cm9sbGVyCi0gICAgICBjb250ZXh0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQob3B0
aW9ucy5jb250ZXh0c1sxXSwgY29udGV4dFN0cmluZywgb3B0aW9ucyk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgIHRocm93IEVtYmVyLkVycm9yKCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGVOYW1lIHRv
IHJlbmRlciIpOwotICAgIH0KLQotICAgIC8vICMgbGVnYWN5IG5hbWVzcGFjZQotICAgIG5hbWUg
PSBuYW1lLnJlcGxhY2UoL1wvL2csICcuJyk7Ci0gICAgLy8gXCBsZWdhY3kgc2xhc2ggYXMgbmFt
ZXNwYWNlIHN1cHBvcnQKLQotCi0gICAgdmlldyA9IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyAr
IG5hbWUpIHx8IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6ZGVmYXVsdCcpOwotCi0gICAgLy8gcHJv
dmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCi0gICAgdmFyIGNvbnRyb2xsZXJOYW1lID0gb3B0aW9u
cy5oYXNoLmNvbnRyb2xsZXIgfHwgbmFtZTsKLSAgICB2YXIgY29udHJvbGxlckZ1bGxOYW1lID0g
J2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOwotCi0gICAgaWYgKG9wdGlvbnMuaGFzaC5j
b250cm9sbGVyKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRoZSBjb250cm9sbGVyIG5hbWUgeW91
IHN1cHBsaWVkICciICsgY29udHJvbGxlck5hbWUgKyAiJyBkaWQgbm90IHJlc29sdmUgdG8gYSBj
b250cm9sbGVyLiIsIGNvbnRhaW5lci5oYXMoY29udHJvbGxlckZ1bGxOYW1lKSk7Ci0gICAgfQot
Ci0gICAgdmFyIHBhcmVudENvbnRyb2xsZXIgPSBvcHRpb25zLmRhdGEua2V5d29yZHMuY29udHJv
bGxlcjsKLQotICAgIC8vIGNob29zZSBuYW1lCi0gICAgaWYgKGxlbmd0aCA+IDIpIHsKLSAgICAg
IHZhciBmYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoY29udHJvbGxlckZ1bGxOYW1l
KSB8fAotICAgICAgICAgICAgICAgICAgICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5
KGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpOwotCi0gICAgICBjb250cm9sbGVy
ID0gZmFjdG9yeS5jcmVhdGUoewotICAgICAgICBtb2RlbDogY29udGV4dCwKLSAgICAgICAgcGFy
ZW50Q29udHJvbGxlcjogcGFyZW50Q29udHJvbGxlciwKLSAgICAgICAgdGFyZ2V0OiBwYXJlbnRD
b250cm9sbGVyCi0gICAgICB9KTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBjb250cm9sbGVyID0g
Y29udGFpbmVyLmxvb2t1cChjb250cm9sbGVyRnVsbE5hbWUpIHx8Ci0gICAgICAgICAgICAgICAg
ICAgRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUpOwot
Ci0gICAgICBjb250cm9sbGVyLnNldFByb3BlcnRpZXMoewotICAgICAgICB0YXJnZXQ6IHBhcmVu
dENvbnRyb2xsZXIsCi0gICAgICAgIHBhcmVudENvbnRyb2xsZXI6IHBhcmVudENvbnRyb2xsZXIK
LSAgICAgIH0pOwotICAgIH0KLQotICAgIHZhciByb290ID0gb3B0aW9ucy5jb250ZXh0c1sxXTsK
LQotICAgIGlmIChyb290KSB7Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocm9vdCwgY29u
dGV4dFN0cmluZywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIGNvbnRyb2xsZXIuc2V0KCdtb2RlbCcs
IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHJvb3QsIGNvbnRleHRTdHJpbmcsIG9wdGlvbnMpKTsKLSAg
ICAgIH0pOwotICAgIH0KLQotICAgIG9wdGlvbnMuaGFzaC52aWV3TmFtZSA9IEVtYmVyLlN0cmlu
Zy5jYW1lbGl6ZShuYW1lKTsKLQotICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSAndGVtcGxhdGU6JyAr
IG5hbWU7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdXNlZCBge3tyZW5kZXIgJyIgKyBuYW1lICsg
Iid9fWAsIGJ1dCAnIiArIG5hbWUgKyAiJyBjYW4gbm90IGJlIGZvdW5kIGFzIGVpdGhlciBhIHRl
bXBsYXRlIG9yIGEgdmlldy4iLCBjb250YWluZXIuaGFzKCJ2aWV3OiIgKyBuYW1lKSB8fCBjb250
YWluZXIuaGFzKHRlbXBsYXRlTmFtZSkpOwotICAgIG9wdGlvbnMuaGFzaC50ZW1wbGF0ZSA9IGNv
bnRhaW5lci5sb29rdXAodGVtcGxhdGVOYW1lKTsKLQotICAgIG9wdGlvbnMuaGFzaC5jb250cm9s
bGVyID0gY29udHJvbGxlcjsKLQotICAgIGlmIChyb3V0ZXIgJiYgIWNvbnRleHQpIHsKLSAgICAg
IHJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcobmFtZSwgdmlldyk7Ci0gICAgfQotCi0gICAgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKLSAg
fSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJl
cgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5k
bGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgewotCi0gIHZhciByZXNvbHZlUGFyYW1zID0g
RW1iZXIuUm91dGVyLnJlc29sdmVQYXJhbXMsCi0gICAgICBpc1NpbXBsZUNsaWNrID0gRW1iZXIu
Vmlld1V0aWxzLmlzU2ltcGxlQ2xpY2s7Ci0KLSAgdmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVy
LkhhbmRsZWJhcnMsCi0gICAgICBoYW5kbGViYXJzR2V0ID0gRW1iZXJIYW5kbGViYXJzLmdldCwK
LSAgICAgIFNhZmVTdHJpbmcgPSBFbWJlckhhbmRsZWJhcnMuU2FmZVN0cmluZywKLSAgICAgIGZv
ckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLAotICAgICAgZ2V0ID0gRW1iZXIu
Z2V0LAotICAgICAgYV9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKLQotICBmdW5jdGlv
biBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsKLSAgICB2YXIgcmV0ID0gW107Ci0gICAgaWYg
KGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KLQotICAgIHZhciB0eXBlcyA9
IG9wdGlvbnMub3B0aW9ucy50eXBlcy5zbGljZSgxKSwKLSAgICAgICAgZGF0YSA9IG9wdGlvbnMu
b3B0aW9ucy5kYXRhOwotCi0gICAgcmV0dXJuIHJldC5jb25jYXQocmVzb2x2ZVBhcmFtcyhvcHRp
b25zLmNvbnRleHQsIG9wdGlvbnMucGFyYW1zLCB7IHR5cGVzOiB0eXBlcywgZGF0YTogZGF0YSB9
KSk7Ci0gIH0KLQotICB2YXIgQWN0aW9uSGVscGVyID0gRW1iZXJIYW5kbGViYXJzLkFjdGlvbkhl
bHBlciA9IHsKLSAgICByZWdpc3RlcmVkQWN0aW9uczoge30KLSAgfTsKLQotICB2YXIga2V5cyA9
IFsiYWx0IiwgInNoaWZ0IiwgIm1ldGEiLCAiY3RybCJdOwotCi0gIHZhciBQT0lOVEVSX0VWRU5U
X1RZUEVfUkVHRVggPSAvXmNsaWNrfG1vdXNlfHRvdWNoLzsKLQotICB2YXIgaXNBbGxvd2VkRXZl
bnQgPSBmdW5jdGlvbihldmVudCwgYWxsb3dlZEtleXMpIHsKLSAgICBpZiAodHlwZW9mIGFsbG93
ZWRLZXlzID09PSAidW5kZWZpbmVkIikgewotICAgICAgaWYgKFBPSU5URVJfRVZFTlRfVFlQRV9S
RUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBpc1NpbXBsZUNsaWNrKGV2
ZW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFsbG93ZWRLZXlzID0gJyc7Ci0gICAgICB9
Ci0gICAgfQotCi0gICAgaWYgKGFsbG93ZWRLZXlzLmluZGV4T2YoImFueSIpID49IDApIHsKLSAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZhciBhbGxvd2VkID0gdHJ1ZTsKLQotICAg
IGZvckVhY2guY2FsbChrZXlzLCBmdW5jdGlvbihrZXkpIHsKLSAgICAgIGlmIChldmVudFtrZXkg
KyAiS2V5Il0gJiYgYWxsb3dlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkgewotICAgICAgICBh
bGxvd2VkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gYWxsb3dlZDsK
LSAgfTsKLQotICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25O
YW1lLCBvcHRpb25zLCBhbGxvd2VkS2V5cykgewotICAgIHZhciBhY3Rpb25JZCA9ICgrK0VtYmVy
LnV1aWQpLnRvU3RyaW5nKCk7Ci0KLSAgICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnNb
YWN0aW9uSWRdID0gewotICAgICAgZXZlbnROYW1lOiBvcHRpb25zLmV2ZW50TmFtZSwKLSAgICAg
IGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZVJlZ2lzdGVyZWRBY3Rpb24oZXZlbnQpIHsKLSAgICAg
ICAgaWYgKCFpc0FsbG93ZWRFdmVudChldmVudCwgYWxsb3dlZEtleXMpKSB7IHJldHVybiB0cnVl
OyB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgIT09IGZhbHNlKSB7Ci0g
ICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
IChvcHRpb25zLmJ1YmJsZXMgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgZXZlbnQuc3RvcFByb3Bh
Z2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy50YXJn
ZXQ7Ci0KLSAgICAgICAgaWYgKHRhcmdldC50YXJnZXQpIHsKLSAgICAgICAgICB0YXJnZXQgPSBo
YW5kbGViYXJzR2V0KHRhcmdldC5yb290LCB0YXJnZXQudGFyZ2V0LCB0YXJnZXQub3B0aW9ucyk7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnJvb3Q7Ci0gICAg
ICAgIH0KLQotICAgICAgICBFbWJlci5ydW4oZnVuY3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigp
IHsKLSAgICAgICAgICBpZiAodGFyZ2V0LnNlbmQpIHsKLSAgICAgICAgICAgIHRhcmdldC5zZW5k
LmFwcGx5KHRhcmdldCwgYXJncyhvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbk5hbWUpKTsKLSAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgYWN0aW9uICci
ICsgYWN0aW9uTmFtZSArICInIGRpZCBub3QgZXhpc3Qgb24gIiArIHRhcmdldCwgdHlwZW9mIHRh
cmdldFthY3Rpb25OYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICAgICAgICB0YXJnZXRbYWN0
aW9uTmFtZV0uYXBwbHkodGFyZ2V0LCBhcmdzKG9wdGlvbnMucGFyYW1ldGVycykpOwotICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIG9wdGlvbnMudmlldy5v
bignd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgICBkZWxldGUgQWN0aW9uSGVs
cGVyLnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklkXTsKLSAgICB9KTsKLQotICAgIHJldHVybiBh
Y3Rpb25JZDsKLSAgfTsKLQotICAvKioKLSAgICBUaGUgYHt7YWN0aW9ufX1gIGhlbHBlciByZWdp
c3RlcnMgYW4gSFRNTCBlbGVtZW50IHdpdGhpbiBhIHRlbXBsYXRlIGZvciBET00KLSAgICBldmVu
dCBoYW5kbGluZyBhbmQgZm9yd2FyZHMgdGhhdCBpbnRlcmFjdGlvbiB0byB0aGUgdGVtcGxhdGVz
J3MgY29udHJvbGxlcgotICAgIG9yIHN1cHBsaWVkIGB0YXJnZXRgIG9wdGlvbiAoc2VlICdTcGVj
aWZ5aW5nIGEgVGFyZ2V0JykuCi0KLSAgICBJZiB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBpbXBs
ZW1lbnQgdGhlIGV2ZW50LCB0aGUgZXZlbnQgaXMgc2VudAotICAgIHRvIHRoZSBjdXJyZW50IHJv
dXRlLCBhbmQgaXQgYnViYmxlcyB1cCB0aGUgcm91dGUgaGllcmFyY2h5IGZyb20gdGhlcmUuCi0K
LSAgICBVc2VyIGludGVyYWN0aW9uIHdpdGggdGhhdCBlbGVtZW50IHdpbGwgaW52b2tlIHRoZSBz
dXBwbGllZCBhY3Rpb24gbmFtZSBvbgotICAgIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQuCi0KLSAg
ICBHaXZlbiB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIEhhbmRsZWJhcnMgdGVtcGxhdGUgb24g
dGhlIHBhZ2UKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8ZGl2IHt7YWN0aW9uICdhbkFjdGlv
bk5hbWUnfX0+Ci0gICAgICBjbGljayBtZQotICAgIDwvZGl2PgotICAgIGBgYAotCi0gICAgQW5k
IGFwcGxpY2F0aW9uIGNvZGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgICAgYWN0aW9uczog
ewotICAgICAgICBhbkFjdGlvbk5hbWU6IGZ1bmN0aW9uKCkgewotICAgICAgICB9Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJl
bmRlcmVkIEhUTUwKLQotICAgIGBgYGh0bWwKLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4K
LSAgICAgIDxkaXYgZGF0YS1lbWJlci1hY3Rpb249IjEiPgotICAgICAgICBjbGljayBtZQotICAg
ICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgYGBgCi0KLSAgICBDbGlja2luZyAiY2xpY2sgbWUi
IHdpbGwgdHJpZ2dlciB0aGUgYGFuQWN0aW9uTmFtZWAgYWN0aW9uIG9mIHRoZQotICAgIGBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyYC4gSW4gdGhpcyBjYXNlLCBubyBhZGRpdGlvbmFsIHBhcmFt
ZXRlcnMgd2lsbCBiZSBwYXNzZWQuCi0KLSAgICBJZiB5b3UgcHJvdmlkZSBhZGRpdGlvbmFsIHBh
cmFtZXRlcnMgdG8gdGhlIGhlbHBlcjoKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8YnV0dG9u
IHt7YWN0aW9uICdlZGl0JyBwb3N0fX0+RWRpdDwvYnV0dG9uPgotICAgIGBgYAotCi0gICAgVGhv
c2UgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCBhbG9uZyBhcyBhcmd1bWVudHMgdG8gdGhlIEph
dmFTY3JpcHQKLSAgICBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbi4KLQotICAgICMj
IyBFdmVudCBQcm9wYWdhdGlvbgotCi0gICAgRXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIHRoZSBh
Y3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCi0gICAgYC5wcmV2ZW50RGVmYXVs
dCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGRvIHNvIGluIHlvdXIgZXZl
bnQKLSAgICBoYW5kbGVycy4gSWYgeW91IG5lZWQgdG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRpb24g
KHRvIGhhbmRsZSBmaWxlIGlucHV0cyBmb3IKLSAgICBleGFtcGxlKSB5b3UgY2FuIHN1cHBseSB0
aGUgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBvcHRpb24gdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxw
ZXI6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGRpdiB7e2FjdGlvbiAic2F5SGVsbG8iIHBy
ZXZlbnREZWZhdWx0PWZhbHNlfX0+Ci0gICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgLz4KLSAgICAg
IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4KLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIFRv
IGRpc2FibGUgYnViYmxpbmcsIHBhc3MgYGJ1YmJsZXM9ZmFsc2VgIHRvIHRoZSBoZWxwZXI6Ci0K
LSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGJ1dHRvbiB7e2FjdGlvbiAnZWRpdCcgcG9zdCBidWJi
bGVzPWZhbHNlfX0+RWRpdDwvYnV0dG9uPgotICAgIGBgYAotCi0gICAgSWYgeW91IG5lZWQgdGhl
IGRlZmF1bHQgaGFuZGxlciB0byB0cmlnZ2VyIHlvdSBzaG91bGQgZWl0aGVyIHJlZ2lzdGVyIHlv
dXIKLSAgICBvd24gZXZlbnQgaGFuZGxlciwgb3IgdXNlIGV2ZW50IG1ldGhvZHMgb24geW91ciB2
aWV3IGNsYXNzLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwp
Ci0gICAgJ1Jlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMnIGZvciBtb3JlIGluZm9ybWF0aW9u
LgotCi0gICAgIyMjIFNwZWNpZnlpbmcgRE9NIGV2ZW50IHR5cGUKLQotICAgIEJ5IGRlZmF1bHQg
dGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgcmVnaXN0ZXJzIGZvciBET00gYGNsaWNrYCBldmVudHMu
IFlvdSBjYW4KLSAgICBzdXBwbHkgYW4gYG9uYCBvcHRpb24gdG8gdGhlIGhlbHBlciB0byBzcGVj
aWZ5IGEgZGlmZmVyZW50IERPTSBldmVudCBuYW1lOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAg
IDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgb249ImRvdWJsZUNsaWNrIn19PgotICAgICAg
Y2xpY2sgbWUKLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIFNlZSBgRW1iZXIuVmlld2AgJ1Jl
c3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMnIGZvciBhIGxpc3Qgb2YKLSAgICBhY2NlcHRhYmxl
IERPTSBldmVudCBuYW1lcy4KLQotICAgIE5PVEU6IEJlY2F1c2UgYHt7YWN0aW9ufX1gIGRlcGVu
ZHMgb24gRW1iZXIncyBldmVudCBkaXNwYXRjaCBzeXN0ZW0gaXQgd2lsbAotICAgIG9ubHkgZnVu
Y3Rpb24gaWYgYW4gYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgaW5zdGFuY2UgaXMgYXZhaWxhYmxl
LiBBbgotICAgIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRl
ZCB3aGVuIGEgbmV3IGBFbWJlci5BcHBsaWNhdGlvbmAKLSAgICBpcyBjcmVhdGVkLiBIYXZpbmcg
YW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkFwcGxpY2F0aW9uYCB3aWxsIHNhdGlzZnkgdGhpcwotICAg
IHJlcXVpcmVtZW50LgotCi0gICAgIyMjIFNwZWNpZnlpbmcgd2hpdGVsaXN0ZWQgbW9kaWZpZXIg
a2V5cwotCi0gICAgQnkgZGVmYXVsdCB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciB3aWxsIGlnbm9y
ZSBjbGljayBldmVudCB3aXRoIHByZXNzZWQgbW9kaWZpZXIKLSAgICBrZXlzLiBZb3UgY2FuIHN1
cHBseSBhbiBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGtleXMgc2hvdWxk
IG5vdCBiZSBpZ25vcmVkLgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIDxkaXYge3thY3Rpb24g
ImFuQWN0aW9uTmFtZSIgYWxsb3dlZEtleXM9ImFsdCJ9fT4KLSAgICAgIGNsaWNrIG1lCi0gICAg
PC9kaXY+Ci0gICAgYGBgCi0KLSAgICBUaGlzIHdheSB0aGUgYHt7YWN0aW9ufX1gIHdpbGwgZmly
ZSB3aGVuIGNsaWNraW5nIHdpdGggdGhlIGFsdCBrZXkgcHJlc3NlZCBkb3duLgotCi0gICAgQWx0
ZXJuYXRpdmVseSwgc3VwcGx5ICJhbnkiIHRvIHRoZSBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBh
Y2NlcHQgYW55IGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVyIGtleXMuCi0KLSAgICBgYGBoYW5kbGVi
YXJzCi0gICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rpb25OYW1lIiBhbGxvd2VkS2V5cz0iYW55In19
PgotICAgICAgY2xpY2sgbWUgd2l0aCBhbnkga2V5IHByZXNzZWQKLSAgICA8L2Rpdj4KLSAgICBg
YGAKLQotICAgICMjIyBTcGVjaWZ5aW5nIGEgVGFyZ2V0Ci0KLSAgICBUaGVyZSBhcmUgc2V2ZXJh
bCBwb3NzaWJsZSB0YXJnZXQgb2JqZWN0cyBmb3IgYHt7YWN0aW9ufX1gIGhlbHBlcnM6Ci0KLSAg
ICBJbiBhIHR5cGljYWwgRW1iZXIgYXBwbGljYXRpb24sIHdoZXJlIHZpZXdzIGFyZSBtYW5hZ2Vk
IHRocm91Z2ggdXNlIG9mIHRoZQotICAgIGB7e291dGxldH19YCBoZWxwZXIsIGFjdGlvbnMgd2ls
bCBidWJibGUgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciwgdGhlbgotICAgIHRvIHRoZSBjdXJy
ZW50IHJvdXRlLCBhbmQgdGhlbiB1cCB0aGUgcm91dGUgaGllcmFyY2h5LgotCi0gICAgQWx0ZXJu
YXRpdmVseSwgYSBgdGFyZ2V0YCBvcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBoZWxwZXIg
dG8gY2hhbmdlCi0gICAgd2hpY2ggb2JqZWN0IHdpbGwgcmVjZWl2ZSB0aGUgbWV0aG9kIGNhbGwu
IFRoaXMgb3B0aW9uIG11c3QgYmUgYSBwYXRoCi0gICAgdG8gYW4gb2JqZWN0LCBhY2Nlc3NpYmxl
IGluIHRoZSBjdXJyZW50IGNvbnRleHQ6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3shIHRo
ZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSB9fQotICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFt
ZSIgdGFyZ2V0PXZpZXd9fT4KLSAgICAgIGNsaWNrIG1lCi0gICAgPC9kaXY+Ci0gICAgYGBgCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlv
bigpe30KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGBgYAotCi0gICAgIyMjIEFkZGl0aW9uYWwg
UGFyYW1ldGVycwotCi0gICAgWW91IG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0
byB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlci4gVGhlc2UKLSAgICBwYXJhbWV0ZXJzIGFyZSBwYXNz
ZWQgYWxvbmcgYXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgSmF2YVNjcmlwdCBmdW5jdGlvbgotICAg
IGltcGxlbWVudGluZyB0aGUgYWN0aW9uLgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2Vh
Y2ggcGVyc29uIGluIHBlb3BsZX19Ci0gICAgICA8ZGl2IHt7YWN0aW9uICJlZGl0IiBwZXJzb259
fT4KLSAgICAgICAgY2xpY2sgbWUKLSAgICAgIDwvZGl2PgotICAgIHt7L2VhY2h9fQotICAgIGBg
YAotCi0gICAgQ2xpY2tpbmcgImNsaWNrIG1lIiB3aWxsIHRyaWdnZXIgdGhlIGBlZGl0YCBtZXRo
b2Qgb24gdGhlIGN1cnJlbnQgY29udHJvbGxlcgotICAgIHdpdGggdGhlIHZhbHVlIG9mIGBwZXJz
b25gIGFzIGEgcGFyYW1ldGVyLgotCi0gICAgQG1ldGhvZCBhY3Rpb24KLSAgICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycwotICAgIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25OYW1lCi0gICAg
QHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoKLSAgICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAg
Ki8KLSAgRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdhY3Rpb24nLCBmdW5jdGlvbiBh
Y3Rpb25IZWxwZXIoYWN0aW9uTmFtZSkgewotICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2Fy
Z3VtZW50cy5sZW5ndGggLSAxXSwKLSAgICAgICAgY29udGV4dHMgPSBhX3NsaWNlLmNhbGwoYXJn
dW1lbnRzLCAxLCAtMSk7Ci0KLSAgICB2YXIgaGFzaCA9IG9wdGlvbnMuaGFzaCwKLSAgICAgICAg
Y29udHJvbGxlcjsKLQotICAgIC8vIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhbG9uZyB0byByZWdp
c3RlckFjdGlvbgotICAgIHZhciBhY3Rpb24gPSB7Ci0gICAgICBldmVudE5hbWU6IGhhc2gub24g
fHwgImNsaWNrIgotICAgIH07Ci0KLSAgICBhY3Rpb24ucGFyYW1ldGVycyA9IHsKLSAgICAgIGNv
bnRleHQ6IHRoaXMsCi0gICAgICBvcHRpb25zOiBvcHRpb25zLAotICAgICAgcGFyYW1zOiBjb250
ZXh0cwotICAgIH07Ci0KLSAgICBhY3Rpb24udmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0g
ICAgdmFyIHJvb3QsIHRhcmdldDsKLQotICAgIGlmIChoYXNoLnRhcmdldCkgewotICAgICAgcm9v
dCA9IHRoaXM7Ci0gICAgICB0YXJnZXQgPSBoYXNoLnRhcmdldDsKLSAgICB9IGVsc2UgaWYgKGNv
bnRyb2xsZXIgPSBvcHRpb25zLmRhdGEua2V5d29yZHMuY29udHJvbGxlcikgewotICAgICAgcm9v
dCA9IGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgYWN0aW9uLnRhcmdldCA9IHsgcm9vdDogcm9v
dCwgdGFyZ2V0OiB0YXJnZXQsIG9wdGlvbnM6IG9wdGlvbnMgfTsKLSAgICBhY3Rpb24uYnViYmxl
cyA9IGhhc2guYnViYmxlczsKLSAgICBhY3Rpb24ucHJldmVudERlZmF1bHQgPSBoYXNoLnByZXZl
bnREZWZhdWx0OwotCi0gICAgdmFyIGFjdGlvbklkID0gQWN0aW9uSGVscGVyLnJlZ2lzdGVyQWN0
aW9uKGFjdGlvbk5hbWUsIGFjdGlvbiwgaGFzaC5hbGxvd2VkS2V5cyk7Ci0gICAgcmV0dXJuIG5l
dyBTYWZlU3RyaW5nKCdkYXRhLWVtYmVyLWFjdGlvbj0iJyArIGFjdGlvbklkICsgJyInKTsKLSAg
fSk7Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRp
bmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIu
Q29udHJvbGxlck1peGluLnJlb3Blbih7Ci0gIC8qKgotICAgIFRyYW5zaXRpb24gdGhlIGFwcGxp
Y2F0aW9uIGludG8gYW5vdGhlciByb3V0ZS4gVGhlIHJvdXRlIG1heQotICAgIGJlIGVpdGhlciBh
IHNpbmdsZSByb3V0ZSBvciByb3V0ZSBwYXRoOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGFD
b250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nUG9zdHMnKTsKLSAgICBhQ29udHJvbGxl
ci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsKLSAgICBgYGAK
LQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVzdGlv
bi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0
aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAgIHRoZSByb3V0ZToKLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3QnLCBhUG9zdCk7
Ci0gICAgYGBgCi0KLSAgICBNdWx0aXBsZSBtb2RlbHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8g
Zmlyc3QgcmVjdXJzaXZlbHkgdXAgdGhlCi0gICAgcmVzb3VyY2UgdHJlZS4KLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICB0aGlzLnJlc291cmNlKCdibG9nUG9zdCcsIHtwYXRoOic6YmxvZ1Bvc3RJ
ZCd9LCBmdW5jdGlvbigpewotICAgICAgdGhpcy5yZXNvdXJjZSgnYmxvZ0NvbW1lbnQnLCB7cGF0
aDogJzpibG9nQ29tbWVudElkJ30pOwotICAgIH0pOwotCi0gICAgYUNvbnRyb2xsZXIudHJhbnNp
dGlvblRvUm91dGUoJ2Jsb2dDb21tZW50JywgYVBvc3QsIGFDb21tZW50KTsKLSAgICBgYGAKLQot
ICAgIFNlZSBhbHNvICdyZXBsYWNlUm91dGUnLgotCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUg
dGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0gICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUg
bW9kZWwocykgdG8gYmUgdXNlZCB3aGlsZSB0cmFuc2l0aW9uaW5nCi0gICAgdG8gdGhlIHJvdXRl
LgotICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1peGluCi0gICAgQG1ldGhvZCB0cmFuc2l0aW9u
VG9Sb3V0ZQotICAqLwotICB0cmFuc2l0aW9uVG9Sb3V0ZTogZnVuY3Rpb24oKSB7Ci0gICAgLy8g
dGFyZ2V0IG1heSBiZSBlaXRoZXIgYW5vdGhlciBjb250cm9sbGVyIG9yIGEgcm91dGVyCi0gICAg
dmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JyksCi0gICAgICAgIG1ldGhvZCA9IHRhcmdl
dC50cmFuc2l0aW9uVG9Sb3V0ZSB8fCB0YXJnZXQudHJhbnNpdGlvblRvOwotICAgIHJldHVybiBt
ZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIEBkZXBy
ZWNhdGVkCi0gICAgQGZvciBFbWJlci5Db250cm9sbGVyTWl4aW4KLSAgICBAbWV0aG9kIHRyYW5z
aXRpb25UbwotICAqLwotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRl
cHJlY2F0ZSgidHJhbnNpdGlvblRvIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdHJhbnNpdGlv
blRvUm91dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvUm91dGUuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhl
ciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KLSAg
ICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2Yg
YWRkaW5nIGEgbmV3IG9uZS4gCi0gICAgQmVzaWRlIHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBg
dHJhbnNpdGlvblRvUm91dGVgIGluIGFsbCBvdGhlciByZXNwZWN0cy4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0cycpOwotICAgIGFD
b250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsKLSAgICBg
YGAKLQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVz
dGlvbi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2lu
ZyB0aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAgIHRoZSByb3V0ZToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgYVBvc3QpOwot
ICAgIGBgYAotCi0gICAgTXVsdGlwbGUgbW9kZWxzIHdpbGwgYmUgYXBwbGllZCBsYXN0IHRvIGZp
cnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQotICAgIHJlc291cmNlIHRyZWUuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgdGhpcy5yZXNvdXJjZSgnYmxvZ1Bvc3QnLCB7cGF0aDonOmJsb2dQb3N0SWQn
fSwgZnVuY3Rpb24oKXsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ2Jsb2dDb21tZW50Jywge3BhdGg6
ICc6YmxvZ0NvbW1lbnRJZCd9KTsKLSAgICB9KTsKLQotICAgIGFDb250cm9sbGVyLnJlcGxhY2VS
b3V0ZSgnYmxvZ0NvbW1lbnQnLCBhUG9zdCwgYUNvbW1lbnQpOwotICAgIGBgYAotCi0gICAgQHBh
cmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0gICAgQHBhcmFtIHsuLi5P
YmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgdG8gYmUgdXNlZCB3aGlsZSB0cmFuc2l0aW9uaW5n
Ci0gICAgdG8gdGhlIHJvdXRlLgotICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1peGluCi0gICAg
QG1ldGhvZCByZXBsYWNlUm91dGUKLSAgKi8KLSAgcmVwbGFjZVJvdXRlOiBmdW5jdGlvbigpIHsK
LSAgICAvLyB0YXJnZXQgbWF5IGJlIGVpdGhlciBhbm90aGVyIGNvbnRyb2xsZXIgb3IgYSByb3V0
ZXIKLSAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAgICAgICAgbWV0aG9k
ID0gdGFyZ2V0LnJlcGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdpdGg7Ci0gICAgcmV0dXJu
IG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQGRl
cHJlY2F0ZWQKLSAgICBAZm9yIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgotICAgIEBtZXRob2QgcmVw
bGFjZVdpdGgKLSAgKi8KLSAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRl
cHJlY2F0ZSgicmVwbGFjZVdpdGggaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSByZXBsYWNlUm91
dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZVJvdXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIuVmlldy5yZW9wZW4oewotCi0gIC8qKgotICAg
IFNldHMgdGhlIHByaXZhdGUgYF9vdXRsZXRzYCBvYmplY3Qgb24gdGhlIHZpZXcuCi0KLSAgICBA
bWV0aG9kIGluaXQKLSAgICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAn
X291dGxldHMnLCB7fSk7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgfSwKLQotICAvKioKLSAgICBN
YW51YWxseSBmaWxsIGFueSBvZiBhIHZpZXcncyBge3tvdXRsZXR9fWAgYXJlYXMgd2l0aCB0aGUK
LSAgICBzdXBwbGllZCB2aWV3LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIHZhciBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1i
ZXIuSGFuZGxlYmFycy5jb21waWxlKCdDaGlsZCB2aWV3OiB7e291dGxldCAibWFpbiJ9fSAnKQot
ICAgIH0pOwotICAgIHZhciBteVZpZXcgPSBNeVZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmFw
cGVuZFRvKCdib2R5Jyk7Ci0gICAgLy8gVGhlIGh0bWwgZm9yIG15VmlldyBub3cgbG9va3MgbGlr
ZToKLSAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVyLXZpZXciPkNoaWxkIHZp
ZXc6IDwvZGl2PgotCi0gICAgdmFyIEZvb1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
ICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8aDE+Rm9vPC9oMT4gJykKLSAg
ICB9KTsKLSAgICB2YXIgZm9vVmlldyA9IEZvb1ZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmNv
bm5lY3RPdXRsZXQoJ21haW4nLCBmb29WaWV3KTsKLSAgICAvLyBUaGUgaHRtbCBmb3IgbXlWaWV3
IG5vdyBsb29rcyBsaWtlOgotICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXIt
dmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxkaXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1i
ZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2PgotICAgIC8vIDwvZGl2PgotICAgIGBgYAotICAg
IEBtZXRob2QgY29ubmVjdE91dGxldAotICAgIEBwYXJhbSAge1N0cmluZ30gb3V0bGV0TmFtZSBB
IHVuaXF1ZSBuYW1lIGZvciB0aGUgb3V0bGV0Ci0gICAgQHBhcmFtICB7T2JqZWN0fSB2aWV3ICAg
ICAgIEFuIEVtYmVyLlZpZXcKLSAgICovCi0gIGNvbm5lY3RPdXRsZXQ6IGZ1bmN0aW9uKG91dGxl
dE5hbWUsIHZpZXcpIHsKLSAgICBpZiAodGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7Ci0g
ICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zW291dGxldE5hbWVdOwotICAg
IH0KLQotICAgIGlmICh0aGlzLl9oYXNFcXVpdmFsZW50VmlldyhvdXRsZXROYW1lLCB2aWV3KSkg
ewotICAgICAgdmlldy5kZXN0cm95KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFy
IG91dGxldHMgPSBnZXQodGhpcywgJ19vdXRsZXRzJyksCi0gICAgICAgIGNvbnRhaW5lciA9IGdl
dCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAgIHJvdXRlciA9IGNvbnRhaW5lciAmJiBjb250
YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpLAotICAgICAgICByZW5kZXJlZE5hbWUgPSBnZXQo
dmlldywgJ3JlbmRlcmVkTmFtZScpOwotCi0gICAgc2V0KG91dGxldHMsIG91dGxldE5hbWUsIHZp
ZXcpOwotCi0gICAgaWYgKHJvdXRlciAmJiByZW5kZXJlZE5hbWUpIHsKLSAgICAgIHJvdXRlci5f
Y29ubmVjdEFjdGl2ZVZpZXcocmVuZGVyZWROYW1lLCB2aWV3KTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRGV0ZXJtaW5lcyBpZiB0aGUgdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQg
YnkgY2hlY2tpbmcgaWYKLSAgICB0aGUgdmlldyBoYXMgdGhlIHNhbWUgY29uc3RydWN0b3IsIHRl
bXBsYXRlLCBhbmQgY29udGV4dCBhcyB0aGUKLSAgICB2aWV3IGluIHRoZSBgX291dGxldHNgIG9i
amVjdC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfaGFzRXF1aXZhbGVudFZpZXcKLSAg
ICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dGxldCB3ZSBh
cmUgY2hlY2tpbmcKLSAgICBAcGFyYW0gIHtPYmplY3R9IHZpZXcgICAgICAgQW4gRW1iZXIuVmll
dwotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAqLwotICBfaGFzRXF1aXZhbGVudFZpZXc6IGZ1
bmN0aW9uKG91dGxldE5hbWUsIHZpZXcpIHsKLSAgICB2YXIgZXhpc3RpbmdWaWV3ID0gZ2V0KHRo
aXMsICdfb3V0bGV0cy4nK291dGxldE5hbWUpOwotICAgIHJldHVybiBleGlzdGluZ1ZpZXcgJiYK
LSAgICAgIGV4aXN0aW5nVmlldy5jb25zdHJ1Y3RvciA9PT0gdmlldy5jb25zdHJ1Y3RvciAmJgot
ICAgICAgZXhpc3RpbmdWaWV3LmdldCgndGVtcGxhdGUnKSA9PT0gdmlldy5nZXQoJ3RlbXBsYXRl
JykgJiYKLSAgICAgIGV4aXN0aW5nVmlldy5nZXQoJ2NvbnRleHQnKSA9PT0gdmlldy5nZXQoJ2Nv
bnRleHQnKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGFuIG91dGxldCBmcm9tIHRoZSB2
aWV3LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBNeVZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCdDaGlsZCB2aWV3OiB7e291dGxldCAibWFpbiJ9fSAnKQotICAgIH0pOwotICAgIHZh
ciBteVZpZXcgPSBNeVZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmFwcGVuZFRvKCdib2R5Jyk7
Ci0gICAgLy8gbXlWaWV3J3MgaHRtbDoKLSAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9
ImVtYmVyLXZpZXciPkNoaWxkIHZpZXc6IDwvZGl2PgotCi0gICAgdmFyIEZvb1ZpZXcgPSBFbWJl
ci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxl
KCc8aDE+Rm9vPC9oMT4gJykKLSAgICB9KTsKLSAgICB2YXIgZm9vVmlldyA9IEZvb1ZpZXcuY3Jl
YXRlKCk7Ci0gICAgbXlWaWV3LmNvbm5lY3RPdXRsZXQoJ21haW4nLCBmb29WaWV3KTsKLSAgICAv
LyBteVZpZXcncyBodG1sOgotICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXIt
dmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxkaXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1i
ZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2PgotICAgIC8vIDwvZGl2PgotCi0gICAgbXlWaWV3
LmRpc2Nvbm5lY3RPdXRsZXQoJ21haW4nKTsKLSAgICAvLyBteVZpZXcncyBodG1sOgotICAgIC8v
IDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzogPC9kaXY+
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nvbm5lY3RPdXRsZXQKLSAgICBAcGFyYW0gIHtT
dHJpbmd9IG91dGxldE5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dGxldCB0byBiZSByZW1vdmVkCi0g
ICAqLwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihvdXRsZXROYW1lKSB7Ci0gICAgaWYg
KCF0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMpIHsKLSAgICAgIHRoaXMuX3BlbmRpbmdEaXNj
b25uZWN0aW9ucyA9IHt9OwotICAgIH0KLSAgICB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnNb
b3V0bGV0TmFtZV0gPSB0cnVlOwotICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMsICdfZmluaXNoRGlz
Y29ubmVjdGlvbnMnKTsKLSAgfSwKLQotICAvKioKLSAgICBHZXRzIGFuIG91dGxldCB0aGF0IGlz
IHBlbmRpbmcgZGlzY29ubmVjdGlvbiBhbmQgdGhlbgotICAgIG51bGxpZnlzIHRoZSBvYmplY3Qg
b24gdGhlIGBfb3V0bGV0YCBvYmplY3QuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2Zp
bmlzaERpc2Nvbm5lY3Rpb25zCi0gICAqLwotICBfZmluaXNoRGlzY29ubmVjdGlvbnM6IGZ1bmN0
aW9uKCkgewotICAgIHZhciBvdXRsZXRzID0gZ2V0KHRoaXMsICdfb3V0bGV0cycpOwotICAgIHZh
ciBwZW5kaW5nRGlzY29ubmVjdGlvbnMgPSB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnM7Ci0g
ICAgdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zID0gbnVsbDsKLQotICAgIGZvciAodmFyIG91
dGxldE5hbWUgaW4gcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7Ci0gICAgICBzZXQob3V0bGV0cywg
b3V0bGV0TmFtZSwgbnVsbCk7Ci0gICAgfQotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8K
LQotLy8gQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGFmdGVyIHRoZSAnYWN0aW9ucycgcXVldWUgKHdo
ZXJlIFJTVlAgcHJvbWlzZXMKLS8vIHJlc29sdmUpLCB3aGljaCBpcyB1c2VkIGluIHJvdXRlciB0
cmFuc2l0aW9ucyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5Ci0vLyBsb2FkaW5nIHN0YXRlIGVudHJ5
IGlmIGFsbCBjb250ZXh0IHByb21pc2VzIHJlc29sdmUgb24gdGhlIAotLy8gJ2FjdGlvbnMnIHF1
ZXVlIGZpcnN0LgotCi12YXIgcXVldWVzID0gRW1iZXIucnVuLnF1ZXVlcywKLSAgICBpbmRleE9m
ID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKLXF1ZXVlcy5zcGxpY2UoaW5kZXhPZi5j
YWxsKHF1ZXVlcywgJ2FjdGlvbnMnKSArIDEsIDAsICdyb3V0ZXJUcmFuc2l0aW9ucycpOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKLQotLyoqCi0gIEVtYmVyLkxvY2F0aW9uIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNv
cnJlY3QgaW1wbGVtZW50YXRpb24gb2YKLSAgdGhlIGBsb2NhdGlvbmAgQVBJLgotCi0gICMjIElt
cGxlbWVudGF0aW9ucwotCi0gIFlvdSBjYW4gcGFzcyBhbiBpbXBsZW1lbnRhdGlvbiBuYW1lIChg
aGFzaGAsIGBoaXN0b3J5YCwgYG5vbmVgKSB0byBmb3JjZSBhCi0gIHBhcnRpY3VsYXIgaW1wbGVt
ZW50YXRpb24gdG8gYmUgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLgotCi0gICMjIyBIYXNoTG9j
YXRpb24KLQotICBVc2luZyBgSGFzaExvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgd2l0aCBhIGAj
YCAoaGFzaCBzaWduKSBzZXBhcmF0aW5nIHRoZQotICBzZXJ2ZXIgc2lkZSBVUkwgcG9ydGlvbiBv
ZiB0aGUgVVJMIGZyb20gdGhlIHBvcnRpb24gdGhhdCBpcyB1c2VkIGJ5IEVtYmVyLgotICBUaGlz
IHJlbGllcyB1cG9uIHRoZSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlIGJyb3dz
ZXIuCi0KLSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Sb3V0ZXIubWFwKGZ1
bmN0aW9uKCkgewotICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7Ci0gICAg
ICB0aGlzLnJvdXRlKCduZXcnKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgQXBwLlJvdXRlci5yZW9w
ZW4oewotICAgIGxvY2F0aW9uOiAnaGFzaCcKLSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgd2lsbCBy
ZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvIy9wb3N0cy9uZXdgLgotCi0gICMjIyBIaXN0
b3J5TG9jYXRpb24KLQotICBVc2luZyBgSGlzdG9yeUxvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMg
dGhhdCBhcmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhCi0gIHN0YW5kYXJkIFVSTC4gVGhpcyBy
ZWxpZXMgdXBvbiB0aGUgYnJvd3NlcidzIGBoaXN0b3J5YCBBUEkuCi0KLSAgRXhhbXBsZToKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgIHRoaXMu
cmVzb3VyY2UoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCduZXcnKTsK
LSAgICB9KTsKLSAgfSk7Ci0KLSAgQXBwLlJvdXRlci5yZW9wZW4oewotICAgIGxvY2F0aW9uOiAn
aGlzdG9yeScKLSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5u
ZXcgdXJsIG9mIGAvcG9zdHMvbmV3YC4KLQotICAjIyMgTm9uZUxvY2F0aW9uCi0KLSAgVXNpbmcg
YE5vbmVMb2NhdGlvbmAgY2F1c2VzIEVtYmVyIHRvIG5vdCBzdG9yZSB0aGUgYXBwbGljYXRpb25z
IFVSTCBzdGF0ZQotICBpbiB0aGUgYWN0dWFsIFVSTC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBm
b3IgdGVzdGluZyBwdXJwb3NlcywgYW5kIGlzIG9uZQotICBvZiB0aGUgY2hhbmdlcyBtYWRlIHdo
ZW4gY2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KLQotICAjIyBMb2NhdGlvbiBBUEkK
LQotICBFYWNoIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93
aW5nIG1ldGhvZHM6Ci0KLSAgKiBpbXBsZW1lbnRhdGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5h
bWUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGltcGxlbWVudGF0aW9uLgotICAqIGdldFVSTDogcmV0
dXJucyB0aGUgY3VycmVudCBVUkwuCi0gICogc2V0VVJMKHBhdGgpOiBzZXRzIHRoZSBjdXJyZW50
IFVSTC4KLSAgKiByZXBsYWNlVVJMKHBhdGgpOiByZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0
aW9uYWwpLgotICAqIG9uVXBkYXRlVVJMKGNhbGxiYWNrKTogdHJpZ2dlcnMgdGhlIGNhbGxiYWNr
IHdoZW4gdGhlIFVSTCBjaGFuZ2VzLgotICAqIGZvcm1hdFVSTCh1cmwpOiBmb3JtYXRzIGB1cmxg
IHRvIGJlIHBsYWNlZCBpbnRvIGBocmVmYCBhdHRyaWJ1dGUuCi0KLSAgQ2FsbGluZyBzZXRVUkwg
b3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4KLQot
ICBAY2xhc3MgTG9jYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotRW1i
ZXIuTG9jYXRpb24gPSB7Ci0gIC8qKgotICAgVGhpcyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9m
IHVzaW5nIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbgotICAgaW1wbGVtZW50
YXRpb24gYXMgZGVzaXJlZC4KLQotICAgRm9yIGV4YW1wbGU6Ci0KLSAgIGBgYGphdmFzY3JpcHQK
LSAgIC8vIEdpdmVuIGEgbG9jYXRpb24gcmVnaXN0ZXJlZCBhcyBmb2xsb3dzOgotICAgY29udGFp
bmVyLnJlZ2lzdGVyKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnLCBIaXN0b3J5VGVzdExvY2F0aW9u
KTsKLQotICAgLy8gWW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB2aWE6Ci0gICBjb250
YWluZXIubG9va3VwKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnKTsKLSAgIGBgYAotCi0gICAgQG1l
dGhvZCBjcmVhdGUKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm4ge09i
amVjdH0gYW4gaW5zdGFuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAg
QVBJCi0gICAgQGRlcHJlY2F0ZWQgVXNlIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2Nh
dGlvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdQotICAgIG5lZWQuCi0gICovCi0gIGNyZWF0ZTog
ZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYg
b3B0aW9ucy5pbXBsZW1lbnRhdGlvbjsKLSAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9u
LmNyZWF0ZTogeW91IG11c3Qgc3BlY2lmeSBhICdpbXBsZW1lbnRhdGlvbicgb3B0aW9uIiwgISFp
bXBsZW1lbnRhdGlvbik7Ci0KLSAgICB2YXIgaW1wbGVtZW50YXRpb25DbGFzcyA9IHRoaXMuaW1w
bGVtZW50YXRpb25zW2ltcGxlbWVudGF0aW9uXTsKLSAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxv
Y2F0aW9uLmNyZWF0ZTogIiArIGltcGxlbWVudGF0aW9uICsgIiBpcyBub3QgYSB2YWxpZCBpbXBs
ZW1lbnRhdGlvbiIsICEhaW1wbGVtZW50YXRpb25DbGFzcyk7Ci0KLSAgICByZXR1cm4gaW1wbGVt
ZW50YXRpb25DbGFzcy5jcmVhdGUuYXBwbHkoaW1wbGVtZW50YXRpb25DbGFzcywgYXJndW1lbnRz
KTsKLSAgfSwKLQotICAvKioKLSAgIFRoaXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2lu
ZyB0aGUgY29udGFpbmVyIHRvIHJlZ2lzdGVyIHRoZQotICAgbG9jYXRpb24gaW1wbGVtZW50YXRp
b24gYXMgZGVzaXJlZC4KLQotICAgRXhhbXBsZToKLQotICAgYGBgamF2YXNjcmlwdAotICAgQXBw
bGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJoaXN0b3J5LXRlc3QtbG9jYXRpb24i
LAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewot
ICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnktdGVzdCcsIEhpc3Rv
cnlUZXN0TG9jYXRpb24pOwotICAgIH0KLSAgIH0pOwotICAgYGBgCi0KLSAgIEBtZXRob2QgcmVn
aXN0ZXJJbXBsZW1lbnRhdGlvbgotICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgIEBwYXJhbSB7
T2JqZWN0fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGxvY2F0aW9uYCBBUEkKLSAgIEBkZXByZWNh
dGVkIFJlZ2lzdGVyIHlvdXIgY3VzdG9tIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIHdpdGggdGhl
Ci0gICBjb250YWluZXIgZGlyZWN0bHkuCi0gICovCi0gIHJlZ2lzdGVySW1wbGVtZW50YXRpb246
IGZ1bmN0aW9uKG5hbWUsIGltcGxlbWVudGF0aW9uKSB7Ci0gICAgdGhpcy5pbXBsZW1lbnRhdGlv
bnNbbmFtZV0gPSBpbXBsZW1lbnRhdGlvbjsKLSAgfSwKLQotICBpbXBsZW1lbnRhdGlvbnM6IHt9
Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1A
c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9
IEVtYmVyLnNldDsKLQotLyoqCi0gIEVtYmVyLk5vbmVMb2NhdGlvbiBkb2VzIG5vdCBpbnRlcmFj
dCB3aXRoIHRoZSBicm93c2VyLiBJdCBpcyB1c2VmdWwgZm9yCi0gIHRlc3RpbmcsIG9yIHdoZW4g
eW91IG5lZWQgdG8gbWFuYWdlIHN0YXRlIHdpdGggeW91ciBSb3V0ZXIsIGJ1dCB0ZW1wb3Jhcmls
eQotICBkb24ndCB3YW50IGl0IHRvIG11Y2sgd2l0aCB0aGUgVVJMIChmb3IgZXhhbXBsZSB3aGVu
IHlvdSBlbWJlZCB5b3VyCi0gIGFwcGxpY2F0aW9uIGluIGEgbGFyZ2VyIHBhZ2UpLgotCi0gIEBj
bGFzcyBOb25lTG9jYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5P
YmplY3QKLSovCi1FbWJlci5Ob25lTG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
cGF0aDogJycsCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoLgotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVSTAotICAgIEByZXR1cm4ge1N0cmluZ30gcGF0aAot
ICAqLwotICBnZXRVUkw6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ3BhdGgn
KTsKLSAgfSwKLQotICAvKioKLSAgICBTZXQgdGhlIHBhdGggYW5kIHJlbWVtYmVycyB3aGF0IHdh
cyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCi0gICAgdG8gY2hhbmdlIHRoZSBwYXRoIHdpbGwgbm90
IGludm9rZSB0aGUgYHVwZGF0ZVVSTGAgY2FsbGJhY2suCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBm
dW5jdGlvbihwYXRoKSB7Ci0gICAgc2V0KHRoaXMsICdwYXRoJywgcGF0aCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHBhdGgg
Y2hhbmdlcy4gVGhlc2UKLSAgICBjYWxsYmFja3Mgd2lsbCBleGVjdXRlIHdoZW4gdGhlIHVzZXIg
cHJlc3NlcyB0aGUgYmFjayBvciBmb3J3YXJkCi0gICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBz
ZXRVUkxgIGlzIGludm9rZWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgb25VcGRhdGVV
UkwKLSAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQotICAqLwotICBvblVwZGF0ZVVSTDog
ZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUgcGF0aCBhbmQgY2FsbHMgdGhlIGB1cGRhdGVV
UkxgIGNhbGxiYWNrLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGhhbmRsZVVSTAotICAg
IEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259Ci0gICovCi0gIGhhbmRsZVVSTDogZnVuY3Rpb24o
dXJsKSB7Ci0gICAgc2V0KHRoaXMsICdwYXRoJywgdXJsKTsKLSAgICB0aGlzLnVwZGF0ZUNhbGxi
YWNrKHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2l2ZW4gYSBVUkwsIGZvcm1hdHMgaXQgdG8g
YmUgcGxhY2VkIGludG8gdGhlIHBhZ2UgYXMgcGFydAotICAgIG9mIGFuIGVsZW1lbnQncyBgaHJl
ZmAgYXR0cmlidXRlLgotCi0gICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2lu
ZyB0aGUge3thY3Rpb259fSBoZWxwZXIKLSAgICB0byBnZW5lcmF0ZSBhIFVSTCBiYXNlZCBvbiBh
biBldmVudC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBmb3JtYXRVUkwKLSAgICBAcGFy
YW0gdXJsIHtTdHJpbmd9Ci0gICAgQHJldHVybiB7U3RyaW5nfSB1cmwKLSAgKi8KLSAgZm9ybWF0
VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBvdmVy
bHkgbWVhbmluZ2Z1bCwgYnV0IHdlIGRvIG5vdCB3YW50IHRvIHRocm93Ci0gICAgLy8gZXJyb3Jz
IHdoZW4gdGVzdCBjb2RlIHJlbmRlcnMgdGVtcGxhdGVzIGNvbnRhaW5pbmcge3thY3Rpb24gaHJl
Zj10cnVlfX0KLSAgICAvLyBoZWxwZXJzLgotICAgIHJldHVybiB1cmw7Ci0gIH0KLX0pOwotCi1F
bWJlci5Mb2NhdGlvbi5yZWdpc3RlckltcGxlbWVudGF0aW9uKCdub25lJywgRW1iZXIuTm9uZUxv
Y2F0aW9uKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJl
cgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBgRW1iZXIuSGFzaExvY2F0aW9uYCBpbXBsZW1lbnRz
IHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJyb3dzZXIncwotICBoYXNoLiBBdCBwcmVzZW50
LCBpdCByZWxpZXMgb24gYSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCi0gIGJy
b3dzZXIuCi0KLSAgQGNsYXNzIEhhc2hMb2NhdGlvbgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBl
eHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLkhhc2hMb2NhdGlvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAnbG9jYXRp
b24nLCBnZXQodGhpcywgJ2xvY2F0aW9uJykgfHwgd2luZG93LmxvY2F0aW9uKTsKLSAgfSwKLQot
ICAvKioKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlvbi5oYXNoYCwgbWludXMgdGhl
ICcjJyBhdCB0aGUgZnJvbnQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZ2V0VVJMCi0g
ICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgaW1wbGVtZW50
YXRpb24gd2l0aG91dCBmZWF0dXJlIGZsYWcgZW5hYmxlZAotICAgIHJldHVybiBnZXQodGhpcywg
J2xvY2F0aW9uJykuaGFzaC5zdWJzdHIoMSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0IHRoZSBg
bG9jYXRpb24uaGFzaGAgYW5kIHJlbWVtYmVycyB3aGF0IHdhcyBzZXQuIFRoaXMgcHJldmVudHMK
LSAgICBgb25VcGRhdGVVUkxgIGNhbGxiYWNrcyBmcm9tIHRyaWdnZXJpbmcgd2hlbiB0aGUgaGFz
aCB3YXMgc2V0IGJ5Ci0gICAgYEhhc2hMb2NhdGlvbmAuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBm
dW5jdGlvbihwYXRoKSB7Ci0gICAgZ2V0KHRoaXMsICdsb2NhdGlvbicpLmhhc2ggPSBwYXRoOwot
ICAgIHNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOwotICB9LAotCi0gIC8qKgotICAgIFVz
ZXMgbG9jYXRpb24ucmVwbGFjZSB0byB1cGRhdGUgdGhlIHVybCB3aXRob3V0IGEgcGFnZSByZWxv
YWQKLSAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlvbi4KLQotICAgIEBwcml2YXRlCi0gICAgQG1l
dGhvZCByZXBsYWNlVVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgcmVwbGFj
ZVVSTDogZnVuY3Rpb24ocGF0aCkgewotICAgIGdldCh0aGlzLCAnbG9jYXRpb24nKS5yZXBsYWNl
KCcjJyArIHBhdGgpOwotICB9LAotCi0gIC8qKgotICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8g
YmUgaW52b2tlZCB3aGVuIHRoZSBoYXNoIGNoYW5nZXMuIFRoZXNlCi0gICAgY2FsbGJhY2tzIHdp
bGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGJhY2sgb3IgZm9yd2FyZAotICAg
IGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJMYCBpcyBpbnZva2VkLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIG9uVXBkYXRlVVJMCi0gICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlv
bn0KLSAgKi8KLSAgb25VcGRhdGVVUkw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgdmFyIHNl
bGYgPSB0aGlzOwotICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKTsKLQotICAgIEVt
YmVyLiQod2luZG93KS5vbignaGFzaGNoYW5nZS5lbWJlci1sb2NhdGlvbi0nK2d1aWQsIGZ1bmN0
aW9uKCkgewotICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgcGF0aCA9
IGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpOwotICAgICAgICBpZiAoZ2V0KHNlbGYsICdsYXN0U2V0
VVJMJykgPT09IHBhdGgpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgc2V0KHNlbGYsICdsYXN0U2V0
VVJMJywgbnVsbCk7Ci0KLSAgICAgICAgY2FsbGJhY2socGF0aCk7Ci0gICAgICB9KTsKLSAgICB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFj
ZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0Ci0gICAgb2YgYW4gZWxlbWVudCdzIGBocmVmYCBhdHRy
aWJ1dGUuCi0KLSAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7
e2FjdGlvbn19IGhlbHBlcgotICAgIHRvIGdlbmVyYXRlIGEgVVJMIGJhc2VkIG9uIGFuIGV2ZW50
LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGZvcm1hdFVSTAotICAgIEBwYXJhbSB1cmwg
e1N0cmluZ30KLSAgKi8KLSAgZm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICByZXR1cm4g
JyMnK3VybDsKLSAgfSwKLQotICAvKioKLSAgICBDbGVhbnMgdXAgdGhlIEhhc2hMb2NhdGlvbiBl
dmVudCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQot
ICAqLwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5n
dWlkRm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3aW5kb3cpLm9mZignaGFzaGNoYW5nZS5lbWJl
ci1sb2NhdGlvbi0nK2d1aWQpOwotICB9Ci19KTsKLQotRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJ
bXBsZW1lbnRhdGlvbignaGFzaCcsIEVtYmVyLkhhc2hMb2NhdGlvbik7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91
dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIHBv
cHN0YXRlRmlyZWQgPSBmYWxzZTsKLXZhciBzdXBwb3J0c0hpc3RvcnlTdGF0ZSA9IHdpbmRvdy5o
aXN0b3J5ICYmICdzdGF0ZScgaW4gd2luZG93Lmhpc3Rvcnk7Ci0KLS8qKgotICBFbWJlci5IaXN0
b3J5TG9jYXRpb24gaW1wbGVtZW50cyB0aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2Vy
J3MKLSAgaGlzdG9yeS5wdXNoU3RhdGUgQVBJLgotCi0gIEBjbGFzcyBIaXN0b3J5TG9jYXRpb24K
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5I
aXN0b3J5TG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLQotICBpbml0OiBmdW5jdGlv
bigpIHsKLSAgICBzZXQodGhpcywgJ2xvY2F0aW9uJywgZ2V0KHRoaXMsICdsb2NhdGlvbicpIHx8
IHdpbmRvdy5sb2NhdGlvbik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXNlZCB0byBzZXQgc3RhdGUg
b24gZmlyc3QgY2FsbCB0byBzZXRVUkwKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBpbml0
U3RhdGUKLSAgKi8KLSAgaW5pdFN0YXRlOiBmdW5jdGlvbigpIHsKLSAgICBzZXQodGhpcywgJ2hp
c3RvcnknLCBnZXQodGhpcywgJ2hpc3RvcnknKSB8fCB3aW5kb3cuaGlzdG9yeSk7Ci0gICAgdGhp
cy5yZXBsYWNlU3RhdGUodGhpcy5mb3JtYXRVUkwodGhpcy5nZXRVUkwoKSkpOwotICB9LAotCi0g
IC8qKgotICAgIFdpbGwgYmUgcHJlLXBlbmRlZCB0byBwYXRoIHVwb24gc3RhdGUgY2hhbmdlCi0K
LSAgICBAcHJvcGVydHkgcm9vdFVSTAotICAgIEBkZWZhdWx0ICcvJwotICAqLwotICByb290VVJM
OiAnLycsCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY3VycmVudCBgbG9jYXRpb24ucGF0aG5h
bWVgIHdpdGhvdXQgYHJvb3RVUkxgLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVS
TAotICAgIEByZXR1cm4gdXJsIHtTdHJpbmd9Ci0gICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIHJvb3RVUkwgPSBnZXQodGhpcywgJ3Jvb3RVUkwnKSwKLSAgICAgICAgbG9jYXRp
b24gPSBnZXQodGhpcywgJ2xvY2F0aW9uJyksCi0gICAgICAgIHBhdGggPSBsb2NhdGlvbi5wYXRo
bmFtZTsKLQotICAgIHJvb3RVUkwgPSByb290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB2
YXIgdXJsID0gcGF0aC5yZXBsYWNlKHJvb3RVUkwsICcnKTsKLQotICAgIAotICAgIHJldHVybiB1
cmw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXNlcyBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvIHVwZGF0
ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1l
dGhvZCBzZXRVUkwKLSAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQotICAqLwotICBzZXRVUkw6IGZ1
bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0
aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0gICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGgg
IT09IHBhdGgpIHsKLSAgICAgIHRoaXMucHVzaFN0YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgICBVc2VzIGBoaXN0b3J5LnJlcGxhY2VTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1cmwg
d2l0aG91dCBhIHBhZ2UgcmVsb2FkCi0gICAgb3IgaGlzdG9yeSBtb2RpZmljYXRpb24uCi0KLSAg
ICBAcHJpdmF0ZQotICAgIEBtZXRob2QgcmVwbGFjZVVSTAotICAgIEBwYXJhbSBwYXRoIHtTdHJp
bmd9Ci0gICovCi0gIHJlcGxhY2VVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUg
PSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0g
ICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGggIT09IHBhdGgpIHsKLSAgICAgIHRoaXMucmVwbGFj
ZVN0YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgIEdldCB0aGUgY3VycmVudCBg
aGlzdG9yeS5zdGF0ZWAKLSAgIFBvbHlmaWxsIGNoZWNrcyBmb3IgbmF0aXZlIGJyb3dzZXIgc3Vw
cG9ydCBhbmQgZmFsbHMgYmFjayB0byByZXRyaWV2aW5nCi0gICBmcm9tIGEgcHJpdmF0ZSBfaGlz
dG9yeVN0YXRlIHZhcmlhYmxlCi0KLSAgIEBwcml2YXRlCi0gICBAbWV0aG9kIGdldFN0YXRlCi0g
ICBAcmV0dXJuIHN0YXRlIHtPYmplY3R9Ci0gICovCi0gIGdldFN0YXRlOiBmdW5jdGlvbigpIHsK
LSAgICByZXR1cm4gc3VwcG9ydHNIaXN0b3J5U3RhdGUgPyBnZXQodGhpcywgJ2hpc3RvcnknKS5z
dGF0ZSA6IHRoaXMuX2hpc3RvcnlTdGF0ZTsKLSAgfSwKLQotICAvKioKLSAgIFB1c2hlcyBhIG5l
dyBzdGF0ZS4KLQotICAgQHByaXZhdGUKLSAgIEBtZXRob2QgcHVzaFN0YXRlCi0gICBAcGFyYW0g
cGF0aCB7U3RyaW5nfQotICAqLwotICBwdXNoU3RhdGU6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2
YXIgc3RhdGUgPSB7IHBhdGg6IHBhdGggfTsKLQotICAgIGdldCh0aGlzLCAnaGlzdG9yeScpLnB1
c2hTdGF0ZShzdGF0ZSwgbnVsbCwgcGF0aCk7Ci0KLSAgICAvLyBzdG9yZSBzdGF0ZSBpZiBicm93
c2VyIGRvZXNuJ3Qgc3VwcG9ydCBgaGlzdG9yeS5zdGF0ZWAKLSAgICBpZiAoIXN1cHBvcnRzSGlz
dG9yeVN0YXRlKSB7Ci0gICAgICB0aGlzLl9oaXN0b3J5U3RhdGUgPSBzdGF0ZTsKLSAgICB9Ci0K
LSAgICAvLyB1c2VkIGZvciB3ZWJraXQgd29ya2Fyb3VuZAotICAgIHRoaXMuX3ByZXZpb3VzVVJM
ID0gdGhpcy5nZXRVUkwoKTsKLSAgfSwKLQotICAvKioKLSAgIFJlcGxhY2VzIHRoZSBjdXJyZW50
IHN0YXRlLgotCi0gICBAcHJpdmF0ZQotICAgQG1ldGhvZCByZXBsYWNlU3RhdGUKLSAgIEBwYXJh
bSBwYXRoIHtTdHJpbmd9Ci0gICovCi0gIHJlcGxhY2VTdGF0ZTogZnVuY3Rpb24ocGF0aCkgewot
ICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OwotCi0gICAgZ2V0KHRoaXMsICdoaXN0b3J5
JykucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCBwYXRoKTsKLQotICAgIC8vIHN0b3JlIHN0YXRl
IGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGBoaXN0b3J5LnN0YXRlYAotICAgIGlmICghc3Vw
cG9ydHNIaXN0b3J5U3RhdGUpIHsKLSAgICAgIHRoaXMuX2hpc3RvcnlTdGF0ZSA9IHN0YXRlOwot
ICAgIH0KLQotICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCi0gICAgdGhpcy5fcHJl
dmlvdXNVUkwgPSB0aGlzLmdldFVSTCgpOwotICB9LAotCi0gIC8qKgotICAgIFJlZ2lzdGVyIGEg
Y2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgYnJvd3NlcgotICAgIGhpc3Rvcnkg
Y2hhbmdlcywgaW5jbHVkaW5nIHVzaW5nIGZvcndhcmQgYW5kIGJhY2sgYnV0dG9ucy4KLQotICAg
IEBwcml2YXRlCi0gICAgQG1ldGhvZCBvblVwZGF0ZVVSTAotICAgIEBwYXJhbSBjYWxsYmFjayB7
RnVuY3Rpb259Ci0gICovCi0gIG9uVXBkYXRlVVJMOiBmdW5jdGlvbihjYWxsYmFjaykgewotICAg
IHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0K
LSAgICBFbWJlci4kKHdpbmRvdykub24oJ3BvcHN0YXRlLmVtYmVyLWxvY2F0aW9uLScrZ3VpZCwg
ZnVuY3Rpb24oZSkgewotICAgICAgLy8gSWdub3JlIGluaXRpYWwgcGFnZSBsb2FkIHBvcHN0YXRl
IGV2ZW50IGluIENocm9tZQotICAgICAgaWYgKCFwb3BzdGF0ZUZpcmVkKSB7Ci0gICAgICAgIHBv
cHN0YXRlRmlyZWQgPSB0cnVlOwotICAgICAgICBpZiAoc2VsZi5nZXRVUkwoKSA9PT0gc2VsZi5f
cHJldmlvdXNVUkwpIHsgcmV0dXJuOyB9Ci0gICAgICB9Ci0gICAgICBjYWxsYmFjayhzZWxmLmdl
dFVSTCgpKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBVc2VkIHdoZW4gdXNpbmcgYHt7
YWN0aW9ufX1gIGhlbHBlci4gIFRoZSB1cmwgaXMgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSByb290
VVJMLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGZvcm1hdFVSTAotICAgIEBwYXJhbSB1
cmwge1N0cmluZ30KLSAgICBAcmV0dXJuIGZvcm1hdHRlZCB1cmwge1N0cmluZ30KLSAgKi8KLSAg
Zm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICB2YXIgcm9vdFVSTCA9IGdldCh0aGlzLCAn
cm9vdFVSTCcpOwotCi0gICAgaWYgKHVybCAhPT0gJycpIHsKLSAgICAgIHJvb3RVUkwgPSByb290
VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm9vdFVSTCArIHVy
bDsKLSAgfSwKLQotICAvKioKLSAgICBDbGVhbnMgdXAgdGhlIEhpc3RvcnlMb2NhdGlvbiBldmVu
dCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAq
LwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5ndWlk
Rm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3aW5kb3cpLm9mZigncG9wc3RhdGUuZW1iZXItbG9j
YXRpb24tJytndWlkKTsKLSAgfQotfSk7Ci0KLUVtYmVyLkxvY2F0aW9uLnJlZ2lzdGVySW1wbGVt
ZW50YXRpb24oJ2hpc3RvcnknLCBFbWJlci5IaXN0b3J5TG9jYXRpb24pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJl
ciBSb3V0aW5nCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotQHJl
cXVpcmVzIGVtYmVyLXZpZXdzCi0qLwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci1mdW5jdGlv
biB2aXNpdCh2ZXJ0ZXgsIGZuLCB2aXNpdGVkLCBwYXRoKSB7Ci0gIHZhciBuYW1lID0gdmVydGV4
Lm5hbWUsCi0gICAgdmVydGljZXMgPSB2ZXJ0ZXguaW5jb21pbmcsCi0gICAgbmFtZXMgPSB2ZXJ0
ZXguaW5jb21pbmdOYW1lcywKLSAgICBsZW4gPSBuYW1lcy5sZW5ndGgsCi0gICAgaTsKLSAgaWYg
KCF2aXNpdGVkKSB7Ci0gICAgdmlzaXRlZCA9IHt9OwotICB9Ci0gIGlmICghcGF0aCkgewotICAg
IHBhdGggPSBbXTsKLSAgfQotICBpZiAodmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewot
ICAgIHJldHVybjsKLSAgfQotICBwYXRoLnB1c2gobmFtZSk7Ci0gIHZpc2l0ZWRbbmFtZV0gPSB0
cnVlOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICB2aXNpdCh2ZXJ0aWNlc1tu
YW1lc1tpXV0sIGZuLCB2aXNpdGVkLCBwYXRoKTsKLSAgfQotICBmbih2ZXJ0ZXgsIHBhdGgpOwot
ICBwYXRoLnBvcCgpOwotfQotCi1mdW5jdGlvbiBEQUcoKSB7Ci0gIHRoaXMubmFtZXMgPSBbXTsK
LSAgdGhpcy52ZXJ0aWNlcyA9IHt9OwotfQotCi1EQUcucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQotICBpZiAodGhpcy52ZXJ0aWNlcy5o
YXNPd25Qcm9wZXJ0eShuYW1lKSkgewotICAgIHJldHVybiB0aGlzLnZlcnRpY2VzW25hbWVdOwot
ICB9Ci0gIHZhciB2ZXJ0ZXggPSB7Ci0gICAgbmFtZTogbmFtZSwgaW5jb21pbmc6IHt9LCBpbmNv
bWluZ05hbWVzOiBbXSwgaGFzT3V0Z29pbmc6IGZhbHNlLCB2YWx1ZTogbnVsbAotICB9OwotICB0
aGlzLnZlcnRpY2VzW25hbWVdID0gdmVydGV4OwotICB0aGlzLm5hbWVzLnB1c2gobmFtZSk7Ci0g
IHJldHVybiB2ZXJ0ZXg7Ci19OwotCi1EQUcucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKG5hbWUs
IHZhbHVlKSB7Ci0gIHRoaXMuYWRkKG5hbWUpLnZhbHVlID0gdmFsdWU7Ci19OwotCi1EQUcucHJv
dG90eXBlLmFkZEVkZ2UgPSBmdW5jdGlvbihmcm9tTmFtZSwgdG9OYW1lKSB7Ci0gIGlmICghZnJv
bU5hbWUgfHwgIXRvTmFtZSB8fCBmcm9tTmFtZSA9PT0gdG9OYW1lKSB7Ci0gICAgcmV0dXJuOwot
ICB9Ci0gIHZhciBmcm9tID0gdGhpcy5hZGQoZnJvbU5hbWUpLCB0byA9IHRoaXMuYWRkKHRvTmFt
ZSk7Ci0gIGlmICh0by5pbmNvbWluZy5oYXNPd25Qcm9wZXJ0eShmcm9tTmFtZSkpIHsKLSAgICBy
ZXR1cm47Ci0gIH0KLSAgZnVuY3Rpb24gY2hlY2tDeWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKLSAgICBp
ZiAodmVydGV4Lm5hbWUgPT09IHRvTmFtZSkgewotICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y
KCJjeWNsZSBkZXRlY3RlZDogIiArIHRvTmFtZSArICIgPC0gIiArIHBhdGguam9pbigiIDwtICIp
KTsKLSAgICB9Ci0gIH0KLSAgdmlzaXQoZnJvbSwgY2hlY2tDeWNsZSk7Ci0gIGZyb20uaGFzT3V0
Z29pbmcgPSB0cnVlOwotICB0by5pbmNvbWluZ1tmcm9tTmFtZV0gPSBmcm9tOwotICB0by5pbmNv
bWluZ05hbWVzLnB1c2goZnJvbU5hbWUpOwotfTsKLQotREFHLnByb3RvdHlwZS50b3Bzb3J0ID0g
ZnVuY3Rpb24oZm4pIHsKLSAgdmFyIHZpc2l0ZWQgPSB7fSwKLSAgICB2ZXJ0aWNlcyA9IHRoaXMu
dmVydGljZXMsCi0gICAgbmFtZXMgPSB0aGlzLm5hbWVzLAotICAgIGxlbiA9IG5hbWVzLmxlbmd0
aCwKLSAgICBpLCB2ZXJ0ZXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIHZl
cnRleCA9IHZlcnRpY2VzW25hbWVzW2ldXTsKLSAgICBpZiAoIXZlcnRleC5oYXNPdXRnb2luZykg
ewotICAgICAgdmlzaXQodmVydGV4LCBmbiwgdmlzaXRlZCk7Ci0gICAgfQotICB9Ci19OwotCi1E
QUcucHJvdG90eXBlLmFkZEVkZ2VzID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJlZm9yZSwgYWZ0
ZXIpIHsKLSAgdmFyIGk7Ci0gIHRoaXMubWFwKG5hbWUsIHZhbHVlKTsKLSAgaWYgKGJlZm9yZSkg
ewotICAgIGlmICh0eXBlb2YgYmVmb3JlID09PSAnc3RyaW5nJykgewotICAgICAgdGhpcy5hZGRF
ZGdlKG5hbWUsIGJlZm9yZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBi
ZWZvcmUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdGhpcy5hZGRFZGdlKG5hbWUsIGJlZm9yZVtp
XSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChhZnRlcikgewotICAgIGlmICh0eXBlb2Yg
YWZ0ZXIgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB0aGlzLmFkZEVkZ2UoYWZ0ZXIsIG5hbWUpOwot
ICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXIubGVuZ3RoOyBpKyspIHsK
LSAgICAgICAgdGhpcy5hZGRFZGdlKGFmdGVyW2ldLCBuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0g
IH0KLX07Ci0KLUVtYmVyLkRBRyA9IERBRzsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBjbGFzc2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lm
eSwKLSAgICBjYXBpdGFsaXplID0gRW1iZXIuU3RyaW5nLmNhcGl0YWxpemUsCi0gICAgZGVjYW1l
bGl6ZSA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplOwotCi0vKioKLSAgVGhlIERlZmF1bHRSZXNv
bHZlciBkZWZpbmVzIHRoZSBkZWZhdWx0IGxvb2t1cCBydWxlcyB0byByZXNvbHZlCi0gIGNvbnRh
aW5lciBsb29rdXBzIGJlZm9yZSBjb25zdWx0aW5nIHRoZSBjb250YWluZXIgZm9yIHJlZ2lzdGVy
ZWQKLSAgaXRlbXM6Ci0KLSogdGVtcGxhdGVzIGFyZSBsb29rZWQgdXAgb24gYEVtYmVyLlRFTVBM
QVRFU2AKLSogb3RoZXIgbmFtZXMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgYXBwbGljYXRpb24gYWZ0
ZXIgY29udmVydGluZwotICB0aGUgbmFtZS4gRm9yIGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3Rg
IGxvb2tzIHVwCi0gIGBBcHAuUG9zdENvbnRyb2xsZXJgIGJ5IGRlZmF1bHQuCi0qIHRoZXJlIGFy
ZSBzb21lIG51YW5jZXMgKHNlZSBleGFtcGxlcyBiZWxvdykKLQotICAjIyMgSG93IFJlc29sdmlu
ZyBXb3JrcwotCi0gIFRoZSBjb250YWluZXIgY2FsbHMgdGhpcyBvYmplY3QncyBgcmVzb2x2ZWAg
bWV0aG9kIHdpdGggdGhlCi0gIGBmdWxsTmFtZWAgYXJndW1lbnQuCi0KLSAgSXQgZmlyc3QgcGFy
c2VzIHRoZSBmdWxsTmFtZSBpbnRvIGFuIG9iamVjdCB1c2luZyBgcGFyc2VOYW1lYC4KLQotICBU
aGVuIGl0IGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgdHlwZS1zcGVjaWZpYyBpbnN0YW5j
ZQotICBtZXRob2Qgb2YgdGhlIGZvcm0gYHJlc29sdmVbVHlwZV1gIGFuZCBjYWxscyBpdCBpZiBp
dCBleGlzdHMuCi0gIEZvciBleGFtcGxlIGlmIGl0IHdhcyByZXNvbHZpbmcgJ3RlbXBsYXRlOnBv
c3QnLCBpdCB3b3VsZCBjYWxsCi0gIHRoZSBgcmVzb2x2ZVRlbXBsYXRlYCBtZXRob2QuCi0KLSAg
SXRzIGxhc3QgcmVzb3J0IGlzIHRvIGNhbGwgdGhlIGByZXNvbHZlT3RoZXJgIG1ldGhvZC4KLQot
ICBUaGUgbWV0aG9kcyBvZiB0aGlzIG9iamVjdCBhcmUgZGVzaWduZWQgdG8gYmUgZWFzeSB0byBv
dmVycmlkZQotICBpbiBhIHN1YmNsYXNzLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVuaGFuY2Ug
aG93IGEgdGVtcGxhdGUKLSAgaXMgcmVzb2x2ZWQgbGlrZSBzbzoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7Ci0gICAgUmVzb2x2ZXI6IEVtYmVy
LkRlZmF1bHRSZXNvbHZlci5leHRlbmQoewotICAgICAgcmVzb2x2ZVRlbXBsYXRlOiBmdW5jdGlv
bihwYXJzZWROYW1lKSB7Ci0gICAgICAgIHZhciByZXNvbHZlZFRlbXBsYXRlID0gdGhpcy5fc3Vw
ZXIocGFyc2VkTmFtZSk7Ci0gICAgICAgIGlmIChyZXNvbHZlZFRlbXBsYXRlKSB7IHJldHVybiBy
ZXNvbHZlZFRlbXBsYXRlOyB9Ci0gICAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbJ25vdF9m
b3VuZCddOwotICAgICAgfQotICAgIH0pCi0gIH0pOwotICBgYGAKLQotICBTb21lIGV4YW1wbGVz
IG9mIGhvdyBuYW1lcyBhcmUgcmVzb2x2ZWQ6Ci0KLSAgYGBgCi0gICd0ZW1wbGF0ZTpwb3N0JyAv
Lz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdCddCi0gICd0ZW1wbGF0ZTpwb3N0cy9ieWxpbmUnIC8v
PT4gRW1iZXIuVEVNUExBVEVTWydwb3N0cy9ieWxpbmUnXQotICAndGVtcGxhdGU6cG9zdHMuYnls
aW5lJyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KLSAgJ3RlbXBsYXRlOmJs
b2dQb3N0JyAvLz0+IEVtYmVyLlRFTVBMQVRFU1snYmxvZ1Bvc3QnXQotICAgICAgICAgICAgICAg
ICAgICAgIC8vICAgT1IKLSAgICAgICAgICAgICAgICAgICAgICAvLyAgIEVtYmVyLlRFTVBMQVRF
U1snYmxvZ19wb3N0J10KLSAgJ2NvbnRyb2xsZXI6cG9zdCcgLy89PiBBcHAuUG9zdENvbnRyb2xs
ZXIKLSAgJ2NvbnRyb2xsZXI6cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3RzSW5kZXhDb250cm9s
bGVyCi0gICdjb250cm9sbGVyOmJsb2cvcG9zdCcgLy89PiBCbG9nLlBvc3RDb250cm9sbGVyCi0g
ICdjb250cm9sbGVyOmJhc2ljJyAvLz0+IEVtYmVyLkNvbnRyb2xsZXIKLSAgJ3JvdXRlOnBvc3Qn
IC8vPT4gQXBwLlBvc3RSb3V0ZQotICAncm91dGU6cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3Rz
SW5kZXhSb3V0ZQotICAncm91dGU6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdFJvdXRlCi0gICdy
b3V0ZTpiYXNpYycgLy89PiBFbWJlci5Sb3V0ZQotICAndmlldzpwb3N0JyAvLz0+IEFwcC5Qb3N0
VmlldwotICAndmlldzpwb3N0cy5pbmRleCcgLy89PiBBcHAuUG9zdHNJbmRleFZpZXcKLSAgJ3Zp
ZXc6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdFZpZXcKLSAgJ3ZpZXc6YmFzaWMnIC8vPT4gRW1i
ZXIuVmlldwotICAnZm9vOnBvc3QnIC8vPT4gQXBwLlBvc3RGb28KLSAgJ21vZGVsOnBvc3QnIC8v
PT4gQXBwLlBvc3QKLSAgYGBgCi0KLSAgQGNsYXNzIERlZmF1bHRSZXNvbHZlcgotICBAbmFtZXNw
YWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLkRlZmF1bHRSZXNv
bHZlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAvKioKLSAgICBUaGlzIHdpbGwgYmUgc2V0
IHRvIHRoZSBBcHBsaWNhdGlvbiBpbnN0YW5jZSB3aGVuIGl0IGlzCi0gICAgY3JlYXRlZC4KLQot
ICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKLSAgKi8KLSAgbmFtZXNwYWNlOiBudWxsLAotCi0gIG5v
cm1hbGl6ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2YXIgc3BsaXQgPSBmdWxsTmFtZS5z
cGxpdCgnOicsIDIpLAotICAgICAgICB0eXBlID0gc3BsaXRbMF0sCi0gICAgICAgIG5hbWUgPSBz
cGxpdFsxXTsKLQotICAgIEVtYmVyLmFzc2VydCgiVHJpZWQgdG8gbm9ybWFsaXplIGEgY29udGFp
bmVyIG5hbWUgd2l0aG91dCBhIGNvbG9uICg6KSBpbiAiICsKLSAgICAgICAgICAgICAgICAgIml0
LiBZb3UgcHJvYmFibHkgdHJpZWQgdG8gbG9va3VwIGEgbmFtZSB0aGF0IGRpZCBub3QgY29udGFp
biAiICsKLSAgICAgICAgICAgICAgICAgImEgdHlwZSwgYSBjb2xvbiwgYW5kIGEgbmFtZS4gQSBw
cm9wZXIgbG9va3VwIG5hbWUgd291bGQgYmUgIiArCi0gICAgICAgICAgICAgICAgICJgdmlldzpw
b3N0YC4iLCBzcGxpdC5sZW5ndGggPT09IDIpOwotCi0gICAgaWYgKHR5cGUgIT09ICd0ZW1wbGF0
ZScpIHsKLSAgICAgIHZhciByZXN1bHQgPSBuYW1lOwotCi0gICAgICBpZiAocmVzdWx0LmluZGV4
T2YoJy4nKSA+IC0xKSB7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cLiguKS9n
LCBmdW5jdGlvbihtKSB7IHJldHVybiBtLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOyB9KTsKLSAg
ICAgIH0KLQotICAgICAgaWYgKG5hbWUuaW5kZXhPZignXycpID4gLTEpIHsKLSAgICAgICAgcmVz
dWx0ID0gcmVzdWx0LnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24obSkgeyByZXR1cm4gbS5jaGFy
QXQoMSkudG9VcHBlckNhc2UoKTsgfSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0eXBlICsg
JzonICsgcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAg
fQotICB9LAotCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHZpYSB0aGUgY29u
dGFpbmVyJ3MgcmVzb2x2ZXIgbWV0aG9kLgotICAgIEl0IHBhcnNlcyB0aGUgcHJvdmlkZWQgYGZ1
bGxOYW1lYCBhbmQgdGhlbiBsb29rcyB1cCBhbmQKLSAgICByZXR1cm5zIHRoZSBhcHByb3ByaWF0
ZSB0ZW1wbGF0ZSBvciBjbGFzcy4KLQotICAgIEBtZXRob2QgcmVzb2x2ZQotICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwotICAgIEByZXR1cm4ge09iamVjdH0g
dGhlIHJlc29sdmVkIGZhY3RvcnkKLSAgKi8KLSAgcmVzb2x2ZTogZnVuY3Rpb24oZnVsbE5hbWUp
IHsKLSAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxOYW1lKSwKLSAgICAg
ICAgdHlwZVNwZWNpZmljUmVzb2x2ZU1ldGhvZCA9IHRoaXNbcGFyc2VkTmFtZS5yZXNvbHZlTWV0
aG9kTmFtZV07Ci0KLSAgICBpZiAoIXBhcnNlZE5hbWUubmFtZSB8fCAhcGFyc2VkTmFtZS50eXBl
KSB7Ci0gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGZ1bGxOYW1lOiBgIiArIGZ1
bGxOYW1lICsgImAsIG11c3QgYmUgb2YgdGhlIGZvcm0gYHR5cGU6bmFtZWAgIik7Ci0gICAgfQot
Ci0gICAgaWYgKHR5cGVTcGVjaWZpY1Jlc29sdmVNZXRob2QpIHsKLSAgICAgIHZhciByZXNvbHZl
ZCA9IHR5cGVTcGVjaWZpY1Jlc29sdmVNZXRob2QuY2FsbCh0aGlzLCBwYXJzZWROYW1lKTsKLSAg
ICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gcmVzb2x2ZWQ7IH0KLSAgICB9Ci0gICAgcmV0dXJu
IHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOwotICB9LAotICAvKioKLSAgICBDb252ZXJ0
IHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgZm9ybSAidHlwZTpuYW1lIiB0bwotICAgIGEgSmF2YXNj
cmlwdCBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkIGFzcGVjdHMgb2YgdGhlIG5hbWUKLSAgICBicm9r
ZW4gb3V0LgotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0
aGUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcGFyc2VOYW1lCi0gICovCi0gIHBhcnNlTmFt
ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2YXIgbmFtZVBhcnRzID0gZnVsbE5hbWUuc3Bs
aXQoIjoiKSwKLSAgICAgICAgdHlwZSA9IG5hbWVQYXJ0c1swXSwgZnVsbE5hbWVXaXRob3V0VHlw
ZSA9IG5hbWVQYXJ0c1sxXSwKLSAgICAgICAgbmFtZSA9IGZ1bGxOYW1lV2l0aG91dFR5cGUsCi0g
ICAgICAgIG5hbWVzcGFjZSA9IGdldCh0aGlzLCAnbmFtZXNwYWNlJyksCi0gICAgICAgIHJvb3Qg
PSBuYW1lc3BhY2U7Ci0KLSAgICBpZiAodHlwZSAhPT0gJ3RlbXBsYXRlJyAmJiBuYW1lLmluZGV4
T2YoJy8nKSAhPT0gLTEpIHsKLSAgICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKLSAg
ICAgIG5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKLSAgICAgIHZhciBuYW1lc3BhY2VO
YW1lID0gY2FwaXRhbGl6ZShwYXJ0cy5zbGljZSgwLCAtMSkuam9pbignLicpKTsKLSAgICAgIHJv
b3QgPSBFbWJlci5OYW1lc3BhY2UuYnlOYW1lKG5hbWVzcGFjZU5hbWUpOwotCi0gICAgICBFbWJl
ci5hc3NlcnQoJ1lvdSBhcmUgbG9va2luZyBmb3IgYSAnICsgbmFtZSArICcgJyArIHR5cGUgKyAn
IGluIHRoZSAnICsgbmFtZXNwYWNlTmFtZSArICcgbmFtZXNwYWNlLCBidXQgdGhlIG5hbWVzcGFj
ZSBjb3VsZCBub3QgYmUgZm91bmQnLCByb290KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gewotICAg
ICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAotICAgICAgdHlwZTogdHlwZSwKLSAgICAgIGZ1bGxOYW1l
V2l0aG91dFR5cGU6IGZ1bGxOYW1lV2l0aG91dFR5cGUsCi0gICAgICBuYW1lOiBuYW1lLAotICAg
ICAgcm9vdDogcm9vdCwKLSAgICAgIHJlc29sdmVNZXRob2ROYW1lOiAicmVzb2x2ZSIgKyBjbGFz
c2lmeSh0eXBlKQotICAgIH07Ci0gIH0sCi0gIC8qKgotICAgIExvb2sgdXAgdGhlIHRlbXBsYXRl
IGluIEVtYmVyLlRFTVBMQVRFUwotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0
fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1
bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVUZW1wbGF0ZQotICAqLwot
ICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICB2YXIgdGVtcGxh
dGVOYW1lID0gcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlLnJlcGxhY2UoL1wuL2csICcv
Jyk7Ci0KLSAgICBpZiAoRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFtZV0pIHsKLSAgICAgIHJl
dHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0
ZU5hbWUgPSBkZWNhbWVsaXplKHRlbXBsYXRlTmFtZSk7Ci0gICAgaWYgKEVtYmVyLlRFTVBMQVRF
U1t0ZW1wbGF0ZU5hbWVdKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRl
TmFtZV07Ci0gICAgfQotICB9LAotICAvKioKLSAgICBHaXZlbiBhIHBhcnNlTmFtZSBvYmplY3Qg
KG91dHB1dCBmcm9tIGBwYXJzZU5hbWVgKSwgYXBwbHkKLSAgICB0aGUgY29udmVudGlvbnMgZXhw
ZWN0ZWQgYnkgYEVtYmVyLlJvdXRlcmAKLQotICAgIEBwcm90ZWN0ZWQKLSAgICBAcGFyYW0ge09i
amVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCi0gICAg
ICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCi0gICAgQG1ldGhvZCB1c2VSb3V0ZXJOYW1pbmcKLSAg
Ki8KLSAgdXNlUm91dGVyTmFtaW5nOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7Ci0gICAgcGFyc2Vk
TmFtZS5uYW1lID0gcGFyc2VkTmFtZS5uYW1lLnJlcGxhY2UoL1wuL2csICdfJyk7Ci0gICAgaWYg
KHBhcnNlZE5hbWUubmFtZSA9PT0gJ2Jhc2ljJykgewotICAgICAgcGFyc2VkTmFtZS5uYW1lID0g
Jyc7Ci0gICAgfQotICB9LAotICAvKioKLSAgICBMb29rdXAgdGhlIGNvbnRyb2xsZXIgdXNpbmcg
YHJlc29sdmVPdGhlcmAKLQotICAgIEBwcm90ZWN0ZWQKLSAgICBAcGFyYW0ge09iamVjdH0gcGFy
c2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCi0gICAgICBmdWxsTmFt
ZSBsb29rdXAgc3RyaW5nCi0gICAgQG1ldGhvZCByZXNvbHZlQ29udHJvbGxlcgotICAqLwotICBy
ZXNvbHZlQ29udHJvbGxlcjogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHRoaXMudXNlUm91
dGVyTmFtaW5nKHBhcnNlZE5hbWUpOwotICAgIHJldHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJz
ZWROYW1lKTsKLSAgfSwKLSAgLyoqCi0gICAgTG9va3VwIHRoZSByb3V0ZSB1c2luZyBgcmVzb2x2
ZU90aGVyYAotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1l
IGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1
cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVSb3V0ZQotICAqLwotICByZXNvbHZlUm91dGU6
IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICB0aGlzLnVzZVJvdXRlck5hbWluZyhwYXJzZWRO
YW1lKTsKLSAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2VkTmFtZSk7Ci0gIH0sCi0g
IC8qKgotICAgIExvb2t1cCB0aGUgdmlldyB1c2luZyBgcmVzb2x2ZU90aGVyYAotCi0gICAgQHBy
b3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVj
dCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0
aG9kIHJlc29sdmVWaWV3Ci0gICovCi0gIHJlc29sdmVWaWV3OiBmdW5jdGlvbihwYXJzZWROYW1l
KSB7Ci0gICAgdGhpcy51c2VSb3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7Ci0gICAgcmV0dXJuIHRo
aXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOwotICB9LAotCi0gIHJlc29sdmVIZWxwZXI6IGZ1
bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2Vk
TmFtZSkgfHwgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzW3BhcnNlZE5hbWUuZnVsbE5hbWVXaXRo
b3V0VHlwZV07Ci0gIH0sCi0KLSAgLyoqCi0gICAgTG9va3VwIHRoZSBtb2RlbCBvbiB0aGUgQXBw
bGljYXRpb24gbmFtZXNwYWNlCi0KLSAgICBAcHJvdGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9
IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVs
bE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcmVzb2x2ZU1vZGVsCi0gICovCi0gIHJl
c29sdmVNb2RlbDogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBj
bGFzc2lmeShwYXJzZWROYW1lLm5hbWUpLAotICAgICAgICBmYWN0b3J5ID0gZ2V0KHBhcnNlZE5h
bWUucm9vdCwgY2xhc3NOYW1lKTsKLQotICAgICBpZiAoZmFjdG9yeSkgeyByZXR1cm4gZmFjdG9y
eTsgfQotICB9LAotICAvKioKLSAgICBMb29rIHVwIHRoZSBzcGVjaWZpZWQgb2JqZWN0IChmcm9t
IHBhcnNlZE5hbWUpIG9uIHRoZSBhcHByb3ByaWF0ZQotICAgIG5hbWVzcGFjZSAodXN1YWxseSBv
biB0aGUgQXBwbGljYXRpb24pCi0KLSAgICBAcHJvdGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9
IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVs
bE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcmVzb2x2ZU90aGVyCi0gICovCi0gIHJl
c29sdmVPdGhlcjogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBj
bGFzc2lmeShwYXJzZWROYW1lLm5hbWUpICsgY2xhc3NpZnkocGFyc2VkTmFtZS50eXBlKSwKLSAg
ICAgICAgZmFjdG9yeSA9IGdldChwYXJzZWROYW1lLnJvb3QsIGNsYXNzTmFtZSk7Ci0gICAgaWYg
KGZhY3RvcnkpIHsgcmV0dXJuIGZhY3Rvcnk7IH0KLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5z
IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIGEgZnVsbE5hbWUuIFVzZWQgYnkgdGhl
Ci0gICAgQXBwbGljYXRpb24gbmFtZXNwYWNlIGluIGFzc2VydGlvbnMgdG8gZGVzY3JpYmUgdGhl
Ci0gICAgcHJlY2lzZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IEVtYmVyIGlzIGxvb2tpbmcgZm9y
LCByYXRoZXIgdGhhbgotICAgIGNvbnRhaW5lciBrZXlzLgotCi0gICAgQHByb3RlY3RlZAotICAg
IEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2Qg
bG9va3VwRGVzY3JpcHRpb24KLSAgKi8KLSAgbG9va3VwRGVzY3JpcHRpb246IGZ1bmN0aW9uKGZ1
bGxOYW1lKSB7Ci0gICAgdmFyIHBhcnNlZE5hbWUgPSB0aGlzLnBhcnNlTmFtZShmdWxsTmFtZSk7
Ci0KLSAgICBpZiAocGFyc2VkTmFtZS50eXBlID09PSAndGVtcGxhdGUnKSB7Ci0gICAgICByZXR1
cm4gInRlbXBsYXRlIGF0ICIgKyBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5cGUucmVwbGFj
ZSgvXC4vZywgJy8nKTsKLSAgICB9Ci0KLSAgICB2YXIgZGVzY3JpcHRpb24gPSBwYXJzZWROYW1l
LnJvb3QgKyAiLiIgKyBjbGFzc2lmeShwYXJzZWROYW1lLm5hbWUpOwotICAgIGlmIChwYXJzZWRO
YW1lLnR5cGUgIT09ICdtb2RlbCcpIHsgZGVzY3JpcHRpb24gKz0gY2xhc3NpZnkocGFyc2VkTmFt
ZS50eXBlKTsgfQotCi0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9LAotCi0gIG1ha2VUb1N0
cmluZzogZnVuY3Rpb24oZmFjdG9yeSwgZnVsbE5hbWUpIHsKLSAgICByZXR1cm4gZmFjdG9yeS50
b1N0cmluZygpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
QG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi1mdW5jdGlvbiBEZXByZWNhdGVkQ29u
dGFpbmVyKGNvbnRhaW5lcikgewotICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7Ci19Ci0K
LURlcHJlY2F0ZWRDb250YWluZXIuZGVwcmVjYXRlID0gZnVuY3Rpb24obWV0aG9kKSB7Ci0gIHJl
dHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyOwot
Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCdVc2luZyB0aGUgZGVmYXVsdENvbnRhaW5lciBpcyBubyBs
b25nZXIgc3VwcG9ydGVkLiBbZGVmYXVsdENvbnRhaW5lciMnICsgbWV0aG9kICsgJ10gc2VlOiBo
dHRwOi8vZ2l0LmlvL0VLUHBuQScsIGZhbHNlKTsKLSAgICByZXR1cm4gY29udGFpbmVyW21ldGhv
ZF0uYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9OwotfTsKLQotRGVwcmVjYXRlZENv
bnRhaW5lci5wcm90b3R5cGUgPSB7Ci0gIF9jb250YWluZXI6IG51bGwsCi0gIGxvb2t1cDogRGVw
cmVjYXRlZENvbnRhaW5lci5kZXByZWNhdGUoJ2xvb2t1cCcpLAotICByZXNvbHZlOiBEZXByZWNh
dGVkQ29udGFpbmVyLmRlcHJlY2F0ZSgncmVzb2x2ZScpLAotICByZWdpc3RlcjogRGVwcmVjYXRl
ZENvbnRhaW5lci5kZXByZWNhdGUoJ3JlZ2lzdGVyJykKLX07Ci0KLS8qKgotICBBbiBpbnN0YW5j
ZSBvZiBgRW1iZXIuQXBwbGljYXRpb25gIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgZXZlcnkg
RW1iZXIKLSAgYXBwbGljYXRpb24uIEl0IGhlbHBzIHRvIGluc3RhbnRpYXRlLCBpbml0aWFsaXpl
IGFuZCBjb29yZGluYXRlIHRoZSBtYW55Ci0gIG9iamVjdHMgdGhhdCBtYWtlIHVwIHlvdXIgYXBw
LgotCi0gIEVhY2ggRW1iZXIgYXBwIGhhcyBvbmUgYW5kIG9ubHkgb25lIGBFbWJlci5BcHBsaWNh
dGlvbmAgb2JqZWN0LiBJbiBmYWN0LCB0aGUKLSAgdmVyeSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxk
IGRvIGluIHlvdXIgYXBwbGljYXRpb24gaXMgY3JlYXRlIHRoZSBpbnN0YW5jZToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHdpbmRvdy5BcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAg
YGBgCi0KLSAgVHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIHRoZSBvbmx5IGds
b2JhbCB2YXJpYWJsZS4gQWxsIG90aGVyCi0gIGNsYXNzZXMgaW4geW91ciBhcHAgc2hvdWxkIGJl
IHByb3BlcnRpZXMgb24gdGhlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5zdGFuY2UsCi0gIHdoaWNo
IGhpZ2hsaWdodHMgaXRzIGZpcnN0IHJvbGU6IGEgZ2xvYmFsIG5hbWVzcGFjZS4KLQotICBGb3Ig
ZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIHZpZXcgY2xhc3MsIGl0IG1pZ2h0IGxvb2sgbGlrZSB0
aGlzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLk15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KCk7Ci0gIGBgYAotCi0gIEJ5IGRlZmF1bHQsIGNhbGxpbmcgYEVtYmVyLkFwcGxpY2F0aW9uLmNy
ZWF0ZSgpYCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZQotICB5b3VyIGFwcGxpY2F0aW9u
IGJ5IGNhbGxpbmcgdGhlIGBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFsaXplKClgIG1ldGhvZC4g
SWYKLSAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlhbGl6YXRpb24sIHlvdSBjYW4gY2FsbCB5b3Vy
IGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAotICBtZXRob2QuIFdoZW4geW91IGFyZSByZWFkeSBm
b3IgeW91ciBhcHAgdG8gYmUgaW5pdGlhbGl6ZWQsIGNhbGwgaXRzCi0gIGBhZHZhbmNlUmVhZGlu
ZXNzKClgIG1ldGhvZC4KLQotICBZb3UgY2FuIGRlZmluZSBhIGByZWFkeWAgbWV0aG9kIG9uIHRo
ZSBgRW1iZXIuQXBwbGljYXRpb25gIGluc3RhbmNlLCB3aGljaAotICB3aWxsIGJlIHJ1biBieSBF
bWJlciB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXplZC4KLQotICBCZWNhdXNlIGBF
bWJlci5BcHBsaWNhdGlvbmAgaW5oZXJpdHMgZnJvbSBgRW1iZXIuTmFtZXNwYWNlYCwgYW55IGNs
YXNzZXMKLSAgeW91IGNyZWF0ZSB3aWxsIGhhdmUgdXNlZnVsIHN0cmluZyByZXByZXNlbnRhdGlv
bnMgd2hlbiBjYWxsaW5nIGB0b1N0cmluZygpYC4KLSAgU2VlIHRoZSBgRW1iZXIuTmFtZXNwYWNl
YCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gIFdoaWxlIHlvdSBjYW4g
dGhpbmsgb2YgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gIGFzIGEgY29udGFpbmVyIHRoYXQgaG9s
ZHMgdGhlCi0gIG90aGVyIGNsYXNzZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIHNl
dmVyYWwgb3RoZXIgcmVzcG9uc2liaWxpdGllcwotICBnb2luZyBvbiB1bmRlci10aGUtaG9vZCB0
aGF0IHlvdSBtYXkgd2FudCB0byB1bmRlcnN0YW5kLgotCi0gICMjIyBFdmVudCBEZWxlZ2F0aW9u
Ci0KLSAgRW1iZXIgdXNlcyBhIHRlY2huaXF1ZSBjYWxsZWQgX2V2ZW50IGRlbGVnYXRpb25fLiBU
aGlzIGFsbG93cyB0aGUgZnJhbWV3b3JrCi0gIHRvIHNldCB1cCBhIGdsb2JhbCwgc2hhcmVkIGV2
ZW50IGxpc3RlbmVyIGluc3RlYWQgb2YgcmVxdWlyaW5nIGVhY2ggdmlldyB0bwotICBkbyBpdCBt
YW51YWxseS4gRm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgZWFjaCB2aWV3IHJlZ2lzdGVyaW5nIGl0
cyBvd24KLSAgYG1vdXNlZG93bmAgbGlzdGVuZXIgb24gaXRzIGFzc29jaWF0ZWQgZWxlbWVudCwg
RW1iZXIgc2V0cyB1cCBhIGBtb3VzZWRvd25gCi0gIGxpc3RlbmVyIG9uIHRoZSBgYm9keWAuCi0K
LSAgSWYgYSBgbW91c2Vkb3duYCBldmVudCBvY2N1cnMsIEVtYmVyIHdpbGwgbG9vayBhdCB0aGUg
dGFyZ2V0IG9mIHRoZSBldmVudCBhbmQKLSAgc3RhcnQgd2Fsa2luZyB1cCB0aGUgRE9NIG5vZGUg
dHJlZSwgZmluZGluZyBjb3JyZXNwb25kaW5nIHZpZXdzIGFuZCBpbnZva2luZwotICB0aGVpciBg
bW91c2VEb3duYCBtZXRob2QgYXMgaXQgZ29lcy4KLQotICBgRW1iZXIuQXBwbGljYXRpb25gIGhh
cyBhIG51bWJlciBvZiBkZWZhdWx0IGV2ZW50cyB0aGF0IGl0IGxpc3RlbnMgZm9yLCBhcwotICB3
ZWxsIGFzIGEgbWFwcGluZyBmcm9tIGxvd2VyY2FzZSBldmVudHMgdG8gY2FtZWwtY2FzZWQgdmll
dyBtZXRob2QgbmFtZXMuIEZvcgotICBleGFtcGxlLCB0aGUgYGtleXByZXNzYCBldmVudCBjYXVz
ZXMgdGhlIGBrZXlQcmVzc2AgbWV0aG9kIG9uIHRoZSB2aWV3IHRvIGJlCi0gIGNhbGxlZCwgdGhl
IGBkYmxjbGlja2AgZXZlbnQgY2F1c2VzIGBkb3VibGVDbGlja2AgdG8gYmUgY2FsbGVkLCBhbmQg
c28gb24uCi0KLSAgSWYgdGhlcmUgaXMgYSBidWJibGluZyBicm93c2VyIGV2ZW50IHRoYXQgRW1i
ZXIgZG9lcyBub3QgbGlzdGVuIGZvciBieQotICBkZWZhdWx0LCB5b3UgY2FuIHNwZWNpZnkgY3Vz
dG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2aWV3IG1ldGhvZAotICBuYW1lcyBi
eSBzZXR0aW5nIHRoZSBhcHBsaWNhdGlvbidzIGBjdXN0b21FdmVudHNgIHByb3BlcnR5OgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBj
dXN0b21FdmVudHM6IHsKLSAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciB0aGUgcGFzdGUgZXZlbnQK
LSAgICAgIHBhc3RlOiAicGFzdGUiCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQnkgZGVmYXVs
dCwgdGhlIGFwcGxpY2F0aW9uIHNldHMgdXAgdGhlc2UgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBk
b2N1bWVudAotICBib2R5LiBIb3dldmVyLCBpbiBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGlu
ZyBhbiBFbWJlciBhcHBsaWNhdGlvbiBpbnNpZGUKLSAgYW4gZXhpc3RpbmcgcGFnZSwgeW91IG1h
eSB3YW50IGl0IHRvIHNldCB1cCB0aGUgbGlzdGVuZXJzIG9uIGFuIGVsZW1lbnQKLSAgaW5zaWRl
IHRoZSBib2R5LgotCi0gIEZvciBleGFtcGxlLCBpZiBvbmx5IGV2ZW50cyBpbnNpZGUgYSBET00g
ZWxlbWVudCB3aXRoIHRoZSBJRCBvZiBgZW1iZXItYXBwYAotICBzaG91bGQgYmUgZGVsZWdhdGVk
LCBzZXQgeW91ciBhcHBsaWNhdGlvbidzIGByb290RWxlbWVudGAgcHJvcGVydHk6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAg
ICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCi0gIH0pOwotICBgYGAKLQotICBUaGUgYHJvb3RF
bGVtZW50YCBjYW4gYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgYSBqUXVlcnktY29tcGF0aWJs
ZSBzZWxlY3RvcgotICBzdHJpbmcuIE5vdGUgdGhhdCAqdmlld3MgYXBwZW5kZWQgdG8gdGhlIERP
TSBvdXRzaWRlIHRoZSByb290IGVsZW1lbnQgd2lsbAotICBub3QgcmVjZWl2ZSBldmVudHMuKiBJ
ZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3Ugb25seQot
ICBhcHBlbmQgdmlld3MgaW5zaWRlIGl0IQotCi0gIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFk
dmFudGFnZXMgb2YgZXZlbnQgZGVsZWdhdGlvbiBhbmQgdGhlIEVtYmVyIHZpZXcKLSAgbGF5ZXIs
IGFuZCBhIGxpc3Qgb2YgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGFyZSBzZXR1cCBieSBkZWZh
dWx0LCB2aXNpdCB0aGUKLSAgW0VtYmVyIFZpZXcgTGF5ZXIgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpz
LmNvbS9ndWlkZXMvdW5kZXJzdGFuZGluZy1lbWJlci90aGUtdmlldy1sYXllci8jdG9jX2V2ZW50
LWRlbGVnYXRpb24pLgotCi0gICMjIyBJbml0aWFsaXplcnMKLQotICBMaWJyYXJpZXMgb24gdG9w
IG9mIEVtYmVyIGNhbiByZWdpc3RlciBhZGRpdGlvbmFsIGluaXRpYWxpemVycywgbGlrZSBzbzoK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAg
ICBuYW1lOiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBh
cHBsaWNhdGlvbikgewotICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBw
bGljYXRpb24uU3RvcmUpOwotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gICMjIyBSb3V0aW5nCi0K
LSAgSW4gYWRkaXRpb24gdG8gY3JlYXRpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJvdXRlciwgYEVt
YmVyLkFwcGxpY2F0aW9uYCBpcwotICBhbHNvIHJlc3BvbnNpYmxlIGZvciB0ZWxsaW5nIHRoZSBy
b3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5nLiBUcmFuc2l0aW9ucwotICBiZXR3ZWVuIHJvdXRl
cyBjYW4gYmUgbG9nZ2VkIHdpdGggdGhlIGBMT0dfVFJBTlNJVElPTlNgIGZsYWcsIGFuZCBtb3Jl
Ci0gIGRldGFpbGVkIGludHJhLXRyYW5zaXRpb24gbG9nZ2luZyBjYW4gYmUgbG9nZ2VkIHdpdGgK
LSAgdGhlIGBMT0dfVFJBTlNJVElPTlNfSU5URVJOQUxgIGZsYWc6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBMT0dfVFJB
TlNJVElPTlM6IHRydWUsIC8vIGJhc2ljIGxvZ2dpbmcgb2Ygc3VjY2Vzc2Z1bCB0cmFuc2l0aW9u
cwotICAgIExPR19UUkFOU0lUSU9OU19JTlRFUk5BTDogdHJ1ZSAvLyBkZXRhaWxlZCBsb2dnaW5n
IG9mIGFsbCByb3V0aW5nIHN0ZXBzCi0gIH0pOwotICBgYGAKLQotICBCeSBkZWZhdWx0LCB0aGUg
cm91dGVyIHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBVUkwgaW50
bwotICBhcHBsaWNhdGlvbiBzdGF0ZSBvbmNlIHRoZSBicm93c2VyIGVtaXRzIHRoZSBgRE9NQ29u
dGVudFJlYWR5YCBldmVudC4gSWYgeW91Ci0gIG5lZWQgdG8gZGVmZXIgcm91dGluZywgeW91IGNh
biBjYWxsIHRoZSBhcHBsaWNhdGlvbidzIGBkZWZlclJlYWRpbmVzcygpYAotICBtZXRob2QuIE9u
Y2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhlIGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhv
ZC4KLQotICBJZiB0aGVyZSBpcyBhbnkgc2V0dXAgcmVxdWlyZWQgYmVmb3JlIHJvdXRpbmcgYmVn
aW5zLCB5b3UgY2FuIGltcGxlbWVudCBhCi0gIGByZWFkeSgpYCBtZXRob2Qgb24geW91ciBhcHAg
dGhhdCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHJvdXRpbmcKLSAgYmVnaW5z
LgotICBgYGAKLQotICBAY2xhc3MgQXBwbGljYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBA
ZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKLSovCi0KLXZhciBBcHBsaWNhdGlvbiA9IEVtYmVyLkFw
cGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZChFbWJlci5EZWZlcnJlZE1peGluLCB7
Ci0KLSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVsZW1lbnQgb2YgdGhlIEFwcGxpY2F0aW9uLiBU
aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4KLSAgICBlbGVtZW50IG9yIGEKLSAgICBbalF1ZXJ5
LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY2F0ZWdv
cnkvc2VsZWN0b3JzLykuCi0KLSAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBw
YXNzZWQgdG8gdGhlIEFwcGxpY2F0aW9uJ3MsCi0gICAgYGV2ZW50RGlzcGF0Y2hlcmAsIHdoaWNo
IHNldHMgdXAgdGhlIGxpc3RlbmVycyBmb3IgZXZlbnQgZGVsZWdhdGlvbi4gRXZlcnkKLSAgICB2
aWV3IGluIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQg
eW91IHNwZWNpZnkgaGVyZS4KLQotICAgIEBwcm9wZXJ0eSByb290RWxlbWVudAotICAgIEB0eXBl
IERPTUVsZW1lbnQKLSAgICBAZGVmYXVsdCAnYm9keScKLSAgKi8KLSAgcm9vdEVsZW1lbnQ6ICdi
b2R5JywKLQotICAvKioKLSAgICBUaGUgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgcmVzcG9uc2li
bGUgZm9yIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoaXMKLSAgICBhcHBsaWNhdGlvbidzIHZpZXdz
LgotCi0gICAgVGhlIGV2ZW50IGRpc3BhdGNoZXIgaXMgY3JlYXRlZCBieSB0aGUgYXBwbGljYXRp
b24gYXQgaW5pdGlhbGl6YXRpb24gdGltZQotICAgIGFuZCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVy
cyBvbiB0aGUgRE9NIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZQotICAgIGFwcGxpY2F0aW9uJ3Mg
YHJvb3RFbGVtZW50YCBwcm9wZXJ0eS4KLQotICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ig
YEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgICBAcHJv
cGVydHkgZXZlbnREaXNwYXRjaGVyCi0gICAgQHR5cGUgRW1iZXIuRXZlbnREaXNwYXRjaGVyCi0g
ICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBldmVudERpc3BhdGNoZXI6IG51bGwsCi0KLSAgLyoq
Ci0gICAgVGhlIERPTSBldmVudHMgZm9yIHdoaWNoIHRoZSBldmVudCBkaXNwYXRjaGVyIHNob3Vs
ZCBsaXN0ZW4uCi0KLSAgICBCeSBkZWZhdWx0LCB0aGUgYXBwbGljYXRpb24ncyBgRW1iZXIuRXZl
bnREaXNwYXRjaGVyYCBsaXN0ZW5zCi0gICAgZm9yIGEgc2V0IG9mIHN0YW5kYXJkIERPTSBldmVu
dHMsIHN1Y2ggYXMgYG1vdXNlZG93bmAgYW5kCi0gICAgYGtleXVwYCwgYW5kIGRlbGVnYXRlcyB0
aGVtIHRvIHlvdXIgYXBwbGljYXRpb24ncyBgRW1iZXIuVmlld2AKLSAgICBpbnN0YW5jZXMuCi0K
LSAgICBJZiB5b3Ugd291bGQgbGlrZSBhZGRpdGlvbmFsIGJ1YmJsaW5nIGV2ZW50cyB0byBiZSBk
ZWxlZ2F0ZWQgdG8geW91cgotICAgIHZpZXdzLCBzZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25g
J3MgYGN1c3RvbUV2ZW50c2AgcHJvcGVydHkKLSAgICB0byBhIGhhc2ggY29udGFpbmluZyB0aGUg
RE9NIGV2ZW50IG5hbWUgYXMgdGhlIGtleSBhbmQgdGhlCi0gICAgY29ycmVzcG9uZGluZyB2aWV3
IG1ldGhvZCBuYW1lIGFzIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICAgIGN1c3RvbUV2
ZW50czogewotICAgICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgdGhlIHBhc3RlIGV2ZW50Ci0gICAg
ICAgIHBhc3RlOiAicGFzdGUiCi0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJv
cGVydHkgY3VzdG9tRXZlbnRzCi0gICAgQHR5cGUgT2JqZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAot
ICAqLwotICBjdXN0b21FdmVudHM6IG51bGwsCi0KLSAgLy8gU3RhcnQgb2ZmIHRoZSBudW1iZXIg
b2YgZGVmZXJyYWxzIGF0IDEuIFRoaXMgd2lsbCBiZQotICAvLyBkZWNyZW1lbnRlZCBieSB0aGUg
QXBwbGljYXRpb24ncyBvd24gYGluaXRpYWxpemVgIG1ldGhvZC4KLSAgX3JlYWRpbmVzc0RlZmVy
cmFsczogMSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuJCkgeyB0aGlz
LiQgPSBFbWJlci4kOyB9Ci0gICAgdGhpcy5fX2NvbnRhaW5lcl9fID0gdGhpcy5idWlsZENvbnRh
aW5lcigpOwotCi0gICAgdGhpcy5Sb3V0ZXIgPSB0aGlzLmRlZmF1bHRSb3V0ZXIoKTsKLQotICAg
IHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlzLnNjaGVkdWxlSW5pdGlhbGl6ZSgpOwotCi0gICAg
RW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0hhbmRsZWJhcnMnLCBFbWJlci5I
YW5kbGViYXJzLlZFUlNJT04pOwotICAgIEVtYmVyLmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJy
YXJ5KCdqUXVlcnknLCBFbWJlci4kKCkuanF1ZXJ5KTsKLQotICAgIGlmICggRW1iZXIuTE9HX1ZF
UlNJT04gKSB7Ci0gICAgICBFbWJlci5MT0dfVkVSU0lPTiA9IGZhbHNlOyAvLyB3ZSBvbmx5IG5l
ZWQgdG8gc2VlIHRoaXMgb25jZSBwZXIgQXBwbGljYXRpb24jaW5pdAotICAgICAgdmFyIG1heE5h
bWVMZW5ndGggPSBNYXRoLm1heC5hcHBseSh0aGlzLCBFbWJlci5BKEVtYmVyLmxpYnJhcmllcyku
bWFwQnkoIm5hbWUubGVuZ3RoIikpOwotCi0gICAgICBFbWJlci5kZWJ1ZygnLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLScpOwotICAgICAgRW1iZXIubGlicmFyaWVzLmVhY2goZnVuY3Rp
b24obmFtZSwgdmVyc2lvbikgewotICAgICAgICB2YXIgc3BhY2VzID0gbmV3IEFycmF5KG1heE5h
bWVMZW5ndGggLSBuYW1lLmxlbmd0aCArIDEpLmpvaW4oIiAiKTsKLSAgICAgICAgRW1iZXIuZGVi
dWcoW25hbWUsIHNwYWNlcywgJyA6ICcsIHZlcnNpb25dLmpvaW4oIiIpKTsKLSAgICAgIH0pOwot
ICAgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQnVpbGQgdGhlIGNvbnRhaW5lciBmb3IgdGhlIGN1cnJl
bnQgYXBwbGljYXRpb24uCi0KLSAgICBBbHNvIHJlZ2lzdGVyIGEgZGVmYXVsdCBhcHBsaWNhdGlv
biB2aWV3IGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uCi0gICAgaXRzZWxmIGRvZXMgbm90LgotCi0g
ICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGJ1aWxkQ29udGFpbmVyCi0gICAgQHJldHVybiB7RW1i
ZXIuQ29udGFpbmVyfSB0aGUgY29uZmlndXJlZCBjb250YWluZXIKLSAgKi8KLSAgYnVpbGRDb250
YWluZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVy
X18gPSBBcHBsaWNhdGlvbi5idWlsZENvbnRhaW5lcih0aGlzKTsKLQotICAgIHJldHVybiBjb250
YWluZXI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3B0
ZWQgb3V0IG9mIHJvdXRpbmcgYW5kIGhhcyBub3QgZXhwbGljaXRseQotICAgIGRlZmluZWQgYSBy
b3V0ZXIsIHN1cHBseSBhIGRlZmF1bHQgcm91dGVyIGZvciB0aGUgYXBwbGljYXRpb24gYXV0aG9y
Ci0gICAgdG8gY29uZmlndXJlLgotCi0gICAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb24gZGV2ZWxv
cGVycyB0byBkbzoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgQXBwID0gRW1iZXIuQXBw
bGljYXRpb24uY3JlYXRlKCk7Ci0KLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAg
ICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2QgZGVmYXVsdFJvdXRlcgotICAgIEByZXR1cm4ge0VtYmVyLlJvdXRl
cn0gdGhlIGRlZmF1bHQgcm91dGVyCi0gICovCi0KLSAgZGVmYXVsdFJvdXRlcjogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKHRoaXMuUm91dGVyID09PSBmYWxzZSkgeyByZXR1cm47IH0KLSAgICB2YXIg
Y29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwotCi0gICAgaWYgKHRoaXMuUm91dGVyKSB7
Ci0gICAgICBjb250YWluZXIudW5yZWdpc3Rlcigncm91dGVyOm1haW4nKTsKLSAgICAgIGNvbnRh
aW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCB0aGlzLlJvdXRlcik7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KCdyb3V0ZXI6bWFpbicpOwotICB9LAotCi0g
IC8qKgotICAgIEF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24gb25jZSB0
aGUgRE9NIGhhcwotICAgIGJlY29tZSByZWFkeS4KLQotICAgIFRoZSBpbml0aWFsaXphdGlvbiBp
dHNlbGYgaXMgc2NoZWR1bGVkIG9uIHRoZSBhY3Rpb25zIHF1ZXVlCi0gICAgd2hpY2ggZW5zdXJl
cyB0aGF0IGFwcGxpY2F0aW9uIGxvYWRpbmcgZmluaXNoZXMgYmVmb3JlCi0gICAgYm9vdGluZy4K
LQotICAgIElmIHlvdSBhcmUgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBjb2RlLCB5b3Ugc2hvdWxk
IGNhbGwKLSAgICBgZGVmZXJSZWFkaW5lc3MoKWAgdG8gZGVmZXIgYm9vdGluZywgYW5kIHRoZW4g
Y2FsbAotICAgIGBhZHZhbmNlUmVhZGluZXNzKClgIG9uY2UgYWxsIG9mIHlvdXIgY29kZSBoYXMg
ZmluaXNoZWQKLSAgICBsb2FkaW5nLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHNjaGVk
dWxlSW5pdGlhbGl6ZQotICAqLwotICBzY2hlZHVsZUluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewot
ICAgIHZhciBzZWxmID0gdGhpczsKLQotICAgIGlmICghdGhpcy4kIHx8IHRoaXMuJC5pc1JlYWR5
KSB7Ci0gICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBzZWxmLCAnX2luaXRpYWxp
emUnKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy4kKCkucmVhZHkoZnVuY3Rpb24gcnVuSW5p
dGlhbGl6ZSgpIHsKLSAgICAgICAgRW1iZXIucnVuKHNlbGYsICdfaW5pdGlhbGl6ZScpOwotICAg
ICAgfSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFVzZSB0aGlzIHRvIGRlZmVyIHJlYWRp
bmVzcyB1bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0cnVlLgotCi0gICAgRXhhbXBsZToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAg
ICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsKLQotICAgIGpRdWVyeS5nZXRKU09OKCIvYXV0aC10b2tl
biIsIGZ1bmN0aW9uKHRva2VuKSB7Ci0gICAgICBBcHAudG9rZW4gPSB0b2tlbjsKLSAgICAgIEFw
cC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGFsbG93
cyB5b3UgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMgc2V0dXAgbG9naWMgYW5kIGRlZmVyCi0gICAg
Ym9vdGluZyB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHRoZSBzZXR1cCBoYXMgZmluaXNoZWQuCi0K
LSAgICBIb3dldmVyLCBpZiB0aGUgc2V0dXAgcmVxdWlyZXMgYSBsb2FkaW5nIFVJLCBpdCBtaWdo
dCBiZSBiZXR0ZXIKLSAgICB0byB1c2UgdGhlIHJvdXRlciBmb3IgdGhpcyBwdXJwb3NlLgotCi0g
ICAgQG1ldGhvZCBkZWZlclJlYWRpbmVzcwotICAqLwotICBkZWZlclJlYWRpbmVzczogZnVuY3Rp
b24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBjYWxsIGRlZmVyUmVhZGluZXNzIG9u
IGFuIGluc3RhbmNlIG9mIEVtYmVyLkFwcGxpY2F0aW9uIiwgdGhpcyBpbnN0YW5jZW9mIEVtYmVy
LkFwcGxpY2F0aW9uKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgZGVmZXIgcmVhZGlu
ZXNzIHNpbmNlIHRoZSBgcmVhZHkoKWAgaG9vayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4iLCB0
aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKTsKLSAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJh
bHMrKzsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsIGBhZHZhbmNlUmVhZGluZXNzYCBhZnRlciBh
bnkgYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGhhcyBjb21wbGV0ZWQuCi0gICAgRWFjaCBjYWxs
IHRvIGBkZWZlclJlYWRpbmVzc2AgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5j
ZVJlYWRpbmVzc2AKLSAgICBvciB0aGUgYXBwbGljYXRpb24gd2lsbCBuZXZlciBiZWNvbWUgcmVh
ZHkgYW5kIHJvdXRpbmcgd2lsbCBub3QgYmVnaW4uCi0KLSAgICBAbWV0aG9kIGFkdmFuY2VSZWFk
aW5lc3MKLSAgICBAc2VlIHtFbWJlci5BcHBsaWNhdGlvbiNkZWZlclJlYWRpbmVzc30KLSAgKi8K
LSAgYWR2YW5jZVJlYWRpbmVzczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ug
bXVzdCBjYWxsIGFkdmFuY2VSZWFkaW5lc3Mgb24gYW4gaW5zdGFuY2Ugb2YgRW1iZXIuQXBwbGlj
YXRpb24iLCB0aGlzIGluc3RhbmNlb2YgRW1iZXIuQXBwbGljYXRpb24pOwotICAgIHRoaXMuX3Jl
YWRpbmVzc0RlZmVycmFscy0tOwotCi0gICAgaWYgKHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9
PT0gMCkgewotICAgICAgRW1iZXIucnVuLm9uY2UodGhpcywgdGhpcy5kaWRCZWNvbWVSZWFkeSk7
Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIHJlZ2lzdGVycyBhIGZhY3RvcnkgZm9yIGxhdGVy
IGluamVjdGlvbgotCi0gICAgRXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAg
PSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLQotICAgIEFwcC5QZXJzb24gID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7fSk7Ci0gICAgQXBwLk9yYW5nZSAgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KHt9KTsKLSAgICBBcHAuRW1haWwgICA9IEVtYmVyLk9iamVjdC5leHRlbmQoe30pOwotICAgIEFw
cC5zZXNzaW9uID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7fSk7Ci0KLSAgICBBcHAucmVnaXN0ZXIo
J21vZGVsOnVzZXInLCBBcHAuUGVyc29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKLSAgICBBcHAu
cmVnaXN0ZXIoJ2ZydWl0OmZhdm9yaXRlJywgQXBwLk9yYW5nZSk7Ci0gICAgQXBwLnJlZ2lzdGVy
KCdjb21tdW5pY2F0aW9uOm1haW4nLCBBcHAuRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7Ci0g
ICAgQXBwLnJlZ2lzdGVyKCdzZXNzaW9uJywgQXBwLnNlc3Npb24sIHtpbnN0YW50aWF0ZTogZmFs
c2V9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVnaXN0ZXIKLSAgICBAcGFyYW0gIGZ1bGxO
YW1lIHtTdHJpbmd9IHR5cGU6bmFtZSAoZS5nLiwgJ21vZGVsOnVzZXInKQotICAgIEBwYXJhbSAg
ZmFjdG9yeSB7RnVuY3Rpb259IChlLmcuLCBBcHAuUGVyc29uKQotICAgIEBwYXJhbSAgb3B0aW9u
cyB7U3RyaW5nfSAob3B0aW9uYWwpCi0gICoqLwotICByZWdpc3RlcjogZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX19jb250YWluZXJfXzsKLSAgICBjb250YWluZXIucmVn
aXN0ZXIuYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9LAotICAvKioKLSAgICBkZWZp
bmVzIGFuIGluamVjdGlvbiBvciB0eXBlSW5qZWN0aW9uCi0KLSAgICBFeGFtcGxlOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5pbmplY3QoPGZ1bGxfbmFtZSBvciB0eXBlPiwgPHByb3Bl
cnR5IG5hbWU+LCA8ZnVsbF9uYW1lPikKLSAgICBBcHAuaW5qZWN0KCdtb2RlbDp1c2VyJywgJ2Vt
YWlsJywgJ21vZGVsOmVtYWlsJykKLSAgICBBcHAuaW5qZWN0KCdtb2RlbCcsICdzb3VyY2UnLCAn
c291cmNlOm1haW4nKQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBpbmplY3QKLSAgICBAcGFyYW0g
IGZhY3RvcnlOYW1lT3JUeXBlIHtTdHJpbmd9Ci0gICAgQHBhcmFtICBwcm9wZXJ0eSB7U3RyaW5n
fQotICAgIEBwYXJhbSAgaW5qZWN0aW9uTmFtZSB7U3RyaW5nfQotICAqKi8KLSAgaW5qZWN0OiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwotICAg
IGNvbnRhaW5lci5pbmplY3Rpb24uYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxpbmcgaW5pdGlhbGl6ZSBtYW51YWxseSBpcyBub3Qgc3VwcG9ydGVk
LgotCi0gICAgUGxlYXNlIHNlZSBFbWJlci5BcHBsaWNhdGlvbiNhZHZhbmNlUmVhZGluZXNzIGFu
ZAotICAgIEVtYmVyLkFwcGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzLgotCi0gICAgQHByaXZhdGUK
LSAgICBAZGVwcmVjYXRlZAotICAgIEBtZXRob2QgaW5pdGlhbGl6ZQotICAgKiovCi0gIGluaXRp
YWxpemU6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQ2FsbGluZyBpbml0aWFs
aXplIG1hbnVhbGx5IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBzZWUgRW1iZXIuQXBwbGljYXRp
b24jYWR2YW5jZVJlYWRpbmVzcyBhbmQgRW1iZXIuQXBwbGljYXRpb24jZGVmZXJSZWFkaW5lc3Mn
KTsKLSAgfSwKLSAgLyoqCi0gICAgSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24uIFRoaXMgaGFw
cGVucyBhdXRvbWF0aWNhbGx5LgotCi0gICAgUnVuIGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0
aGUgYXBwbGljYXRpb24gbG9hZCBob29rLiBUaGVzZSBob29rcyBtYXkKLSAgICBjaG9vc2UgdG8g
ZGVmZXIgcmVhZGluZXNzLiBGb3IgZXhhbXBsZSwgYW4gYXV0aGVudGljYXRpb24gaG9vayBtaWdo
dCB3YW50Ci0gICAgdG8gZGVmZXIgcmVhZGluZXNzIHVudGlsIHRoZSBhdXRoIHRva2VuIGhhcyBi
ZWVuIHJldHJpZXZlZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfaW5pdGlhbGl6ZQot
ICAqLwotICBfaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuaXNEZXN0cm95
ZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgQXBwLlJvdXRlciBt
dXN0IGFscmVhZHkgYmUgYXNzaWduZWQKLSAgICBpZiAodGhpcy5Sb3V0ZXIpIHsKLSAgICAgIHZh
ciBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX187Ci0gICAgICBjb250YWluZXIudW5yZWdp
c3Rlcigncm91dGVyOm1haW4nKTsKLSAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1h
aW4nLCB0aGlzLlJvdXRlcik7Ci0gICAgfQotCi0gICAgdGhpcy5ydW5Jbml0aWFsaXplcnMoKTsK
LSAgICBFbWJlci5ydW5Mb2FkSG9va3MoJ2FwcGxpY2F0aW9uJywgdGhpcyk7Ci0KLSAgICAvLyBB
dCB0aGlzIHBvaW50LCBhbnkgaW5pdGlhbGl6ZXJzIG9yIGxvYWQgaG9va3MgdGhhdCB3b3VsZCBo
YXZlIHdhbnRlZAotICAgIC8vIHRvIGRlZmVyIHJlYWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBnZW5l
cmFsLCBhZHZhbmNpbmcgcmVhZGluZXNzIGhlcmUKLSAgICAvLyB3aWxsIHByb2NlZWQgdG8gZGlk
QmVjb21lUmVhZHkuCi0gICAgdGhpcy5hZHZhbmNlUmVhZGluZXNzKCk7Ci0KLSAgICByZXR1cm4g
dGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXNldCB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMg
dHlwaWNhbGx5IHVzZWQgb25seSBpbiB0ZXN0cy4gSXQgY2xlYW5zIHVwCi0gICAgdGhlIGFwcGxp
Y2F0aW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0KLSAgICAxLiBEZWFjdGl2YXRlIGV4aXN0
aW5nIHJvdXRlcwotICAgIDIuIERlc3Ryb3kgYWxsIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lcgot
ICAgIDMuIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjb250YWluZXIKLSAgICA0LiBSZS1yb3V0
ZSB0byB0aGUgZXhpc3RpbmcgdXJsCi0KLSAgICBUeXBpY2FsIEV4YW1wbGU6Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBwOwotCi0gICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewot
ICAgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAgICBt
b2R1bGUoImFjY2VwdGFuY2UgdGVzdCIsIHsKLSAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgQXBwLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0ZXN0KCJmaXJzdCB0
ZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBBcHAgaXMgZnJlc2hseSByZXNldAotICAgIH0p
OwotCi0gICAgdGVzdCgiZmlyc3QgdGVzdCIsIGZ1bmN0aW9uKCkgewotICAgICAgLy8gQXBwIGlz
IGFnYWluIGZyZXNobHkgcmVzZXQKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEFkdmFuY2VkIEV4
YW1wbGU6Ci0KLSAgICBPY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFw
cCBmcm9tIGluaXRpYWxpemluZyBkdXJpbmcKLSAgICBzZXR1cC4gVGhpcyBjb3VsZCBlbmFibGUg
ZXh0cmEgY29uZmlndXJhdGlvbiwgb3IgZW5hYmxlIGFzc2VydGluZyBwcmlvcgotICAgIHRvIHRo
ZSBhcHAgYmVjb21pbmcgcmVhZHkuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBw
OwotCi0gICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgQXBwID0gRW1iZXIuQXBwbGlj
YXRpb24uY3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAgICBtb2R1bGUoImFjY2VwdGFuY2UgdGVzdCIs
IHsKLSAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIucnVuKGZ1bmN0aW9u
KCkgewotICAgICAgICAgIEFwcC5yZXNldCgpOwotICAgICAgICAgIEFwcC5kZWZlclJlYWRpbmVz
cygpOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHRlc3QoImZpcnN0IHRl
c3QiLCBmdW5jdGlvbigpIHsKLSAgICAgIG9rKHRydWUsICdzb21ldGhpbmcgYmVmb3JlIGFwcCBp
cyBpbml0aWFsaXplZCcpOwotCi0gICAgICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgICAg
IEFwcC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAgICB9KTsKLSAgICAgIG9rKHRydWUsICdzb21l
dGhpbmcgYWZ0ZXIgYXBwIGlzIGluaXRpYWxpemVkJyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIHJlc2V0Ci0gICoqLwotICByZXNldDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5f
cmVhZGluZXNzRGVmZXJyYWxzID0gMTsKLQotICAgIGZ1bmN0aW9uIGhhbmRsZVJlc2V0KCkgewot
ICAgICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWlu
Jyk7Ci0gICAgICByb3V0ZXIucmVzZXQoKTsKLQotICAgICAgRW1iZXIucnVuKHRoaXMuX19jb250
YWluZXJfXywgJ2Rlc3Ryb3knKTsKLQotICAgICAgdGhpcy5idWlsZENvbnRhaW5lcigpOwotCi0g
ICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgRW1iZXIu
cnVuLmpvaW4odGhpcywgaGFuZGxlUmVzZXQpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBydW5Jbml0aWFsaXplcnMKLSAgKi8KLSAgcnVuSW5pdGlhbGl6ZXJzOiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgaW5pdGlhbGl6ZXJzID0gZ2V0KHRoaXMuY29uc3RydWN0b3Is
ICdpbml0aWFsaXplcnMnKSwKLSAgICAgICAgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9f
LAotICAgICAgICBncmFwaCA9IG5ldyBFbWJlci5EQUcoKSwKLSAgICAgICAgbmFtZXNwYWNlID0g
dGhpcywKLSAgICAgICAgbmFtZSwgaW5pdGlhbGl6ZXI7Ci0KLSAgICBmb3IgKG5hbWUgaW4gaW5p
dGlhbGl6ZXJzKSB7Ci0gICAgICBpbml0aWFsaXplciA9IGluaXRpYWxpemVyc1tuYW1lXTsKLSAg
ICAgIGdyYXBoLmFkZEVkZ2VzKGluaXRpYWxpemVyLm5hbWUsIGluaXRpYWxpemVyLmluaXRpYWxp
emUsIGluaXRpYWxpemVyLmJlZm9yZSwgaW5pdGlhbGl6ZXIuYWZ0ZXIpOwotICAgIH0KLQotICAg
IGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRleCkgewotICAgICAgdmFyIGluaXRpYWxpemVy
ID0gdmVydGV4LnZhbHVlOwotICAgICAgRW1iZXIuYXNzZXJ0KCJObyBhcHBsaWNhdGlvbiBpbml0
aWFsaXplciBuYW1lZCAnIit2ZXJ0ZXgubmFtZSsiJyIsIGluaXRpYWxpemVyKTsKLSAgICAgIGlu
aXRpYWxpemVyKGNvbnRhaW5lciwgbmFtZXNwYWNlKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioK
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZGlkQmVjb21lUmVhZHkKLSAgKi8KLSAgZGlkQmVj
b21lUmVhZHk6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2V0dXBFdmVudERpc3BhdGNoZXIoKTsK
LSAgICB0aGlzLnJlYWR5KCk7IC8vIHVzZXIgaG9vawotICAgIHRoaXMuc3RhcnRSb3V0aW5nKCk7
Ci0KLSAgICBpZiAoIUVtYmVyLnRlc3RpbmcpIHsKLSAgICAgIC8vIEVhZ2VybHkgbmFtZSBhbGwg
Y2xhc3NlcyB0aGF0IGFyZSBhbHJlYWR5IGxvYWRlZAotICAgICAgRW1iZXIuTmFtZXNwYWNlLnBy
b2Nlc3NBbGwoKTsKLSAgICAgIEVtYmVyLkJPT1RFRCA9IHRydWU7Ci0gICAgfQotCi0gICAgdGhp
cy5yZXNvbHZlKHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIFNldHVwIHVwIHRoZSBldmVudCBk
aXNwYXRjaGVyIHRvIHJlY2VpdmUgZXZlbnRzIG9uIHRoZQotICAgIGFwcGxpY2F0aW9uJ3MgYHJv
b3RFbGVtZW50YCB3aXRoIGFueSByZWdpc3RlcmVkCi0gICAgYGN1c3RvbUV2ZW50c2AuCi0KLSAg
ICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0dXBFdmVudERpc3BhdGNoZXIKLSAgKi8KLSAgc2V0
dXBFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXN0b21FdmVudHMgPSBn
ZXQodGhpcywgJ2N1c3RvbUV2ZW50cycpLAotICAgICAgICByb290RWxlbWVudCA9IGdldCh0aGlz
LCAncm9vdEVsZW1lbnQnKSwKLSAgICAgICAgZGlzcGF0Y2hlciA9IHRoaXMuX19jb250YWluZXJf
Xy5sb29rdXAoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFpbicpOwotCi0gICAgc2V0KHRoaXMsICdldmVu
dERpc3BhdGNoZXInLCBkaXNwYXRjaGVyKTsKLSAgICBkaXNwYXRjaGVyLnNldHVwKGN1c3RvbUV2
ZW50cywgcm9vdEVsZW1lbnQpOwotICB9LAotCi0gIC8qKgotICAgIHRyaWdnZXIgYSBuZXcgY2Fs
bCB0byBgcm91dGVgIHdoZW5ldmVyIHRoZSBVUkwgY2hhbmdlcy4KLSAgICBJZiB0aGUgYXBwbGlj
YXRpb24gaGFzIGEgcm91dGVyLCB1c2UgaXQgdG8gcm91dGUgdG8gdGhlIGN1cnJlbnQgVVJMLCBh
bmQKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBzdGFydFJvdXRpbmcKLSAgICBAcHJvcGVy
dHkgcm91dGVyIHtFbWJlci5Sb3V0ZXJ9Ci0gICovCi0gIHN0YXJ0Um91dGluZzogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjpt
YWluJyk7Ci0gICAgaWYgKCFyb3V0ZXIpIHsgcmV0dXJuOyB9Ci0KLSAgICByb3V0ZXIuc3RhcnRS
b3V0aW5nKCk7Ci0gIH0sCi0KLSAgaGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICB2YXIg
cm91dGVyID0gdGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cCgncm91dGVyOm1haW4nKTsKLQotICAg
IHJvdXRlci5oYW5kbGVVUkwodXJsKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0
aGUgQXBwbGljYXRpb24gaGFzIGJlY29tZSByZWFkeS4KLSAgICBUaGUgY2FsbCB3aWxsIGJlIGRl
bGF5ZWQgdW50aWwgdGhlIERPTSBoYXMgYmVjb21lIHJlYWR5LgotCi0gICAgQGV2ZW50IHJlYWR5
Ci0gICovCi0gIHJlYWR5OiBFbWJlci5LLAotCi0gIC8qKgotICAgIEBkZXByZWNhdGVkIFVzZSAn
UmVzb2x2ZXInIGluc3RlYWQKLSAgICBTZXQgdGhpcyB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBj
bGFzcyB0byBgRW1iZXIuRGVmYXVsdFJlc29sdmVyYAotCi0KLSAgICBAcHJvcGVydHkgcmVzb2x2
ZXIKLSAgKi8KLSAgcmVzb2x2ZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgU2V0IHRoaXMgdG8gcHJv
dmlkZSBhbiBhbHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKLQotICAg
IEBwcm9wZXJ0eSByZXNvbHZlcgotICAqLwotICBSZXNvbHZlcjogbnVsbCwKLQotICB3aWxsRGVz
dHJveTogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuQk9PVEVEID0gZmFsc2U7Ci0KLSAgICB0aGlz
Ll9fY29udGFpbmVyX18uZGVzdHJveSgpOwotICB9LAotCi0gIGluaXRpYWxpemVyOiBmdW5jdGlv
bihvcHRpb25zKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5pbml0aWFsaXplcihvcHRpb25zKTsK
LSAgfQotfSk7Ci0KLUVtYmVyLkFwcGxpY2F0aW9uLnJlb3BlbkNsYXNzKHsKLSAgaW5pdGlhbGl6
ZXJzOiB7fSwKLSAgaW5pdGlhbGl6ZXI6IGZ1bmN0aW9uKGluaXRpYWxpemVyKSB7Ci0gICAgLy8g
SWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5pdGlhbGl6ZXIgYmVpbmcgYWRkZWQgdG8gYSBzdWJjbGFz
cywgd2UgYXJlIGdvaW5nIHRvIHJlb3BlbiB0aGUgY2xhc3MKLSAgICAvLyB0byBtYWtlIHN1cmUg
d2UgaGF2ZSBhIG5ldyBgaW5pdGlhbGl6ZXJzYCBvYmplY3QsIHdoaWNoIGV4dGVuZHMgZnJvbSB0
aGUgcGFyZW50IGNsYXNzJyB1c2luZwotICAgIC8vIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuIFdp
dGhvdXQgdGhpcywgYXR0ZW1wdGluZyB0byBhZGQgaW5pdGlhbGl6ZXJzIHRvIHRoZSBzdWJjbGFz
cyB3b3VsZAotICAgIC8vIHBvbGx1dGUgdGhlIHBhcmVudCBjbGFzcyBhcyB3ZWxsIGFzIG90aGVy
IHN1YmNsYXNzZXMuCi0gICAgaWYgKHRoaXMuc3VwZXJjbGFzcy5pbml0aWFsaXplcnMgIT09IHVu
ZGVmaW5lZCAmJiB0aGlzLnN1cGVyY2xhc3MuaW5pdGlhbGl6ZXJzID09PSB0aGlzLmluaXRpYWxp
emVycykgewotICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7Ci0gICAgICAgIGluaXRpYWxpemVyczog
RW1iZXIuY3JlYXRlKHRoaXMuaW5pdGlhbGl6ZXJzKQotICAgICAgfSk7Ci0gICAgfQotCi0gICAg
RW1iZXIuYXNzZXJ0KCJUaGUgaW5pdGlhbGl6ZXIgJyIgKyBpbml0aWFsaXplci5uYW1lICsgIicg
aGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIiwgIXRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxp
emVyLm5hbWVdKTsKLSAgICBFbWJlci5hc3NlcnQoIkFuIGluaXRpYWxpemVyIGNhbm5vdCBiZSBy
ZWdpc3RlcmVkIHdpdGggYm90aCBhIGJlZm9yZSBhbmQgYW4gYWZ0ZXIiLCAhKGluaXRpYWxpemVy
LmJlZm9yZSAmJiBpbml0aWFsaXplci5hZnRlcikpOwotICAgIEVtYmVyLmFzc2VydCgiQW4gaW5p
dGlhbGl6ZXIgY2Fubm90IGJlIHJlZ2lzdGVyZWQgd2l0aG91dCBhbiBpbml0aWFsaXplIGZ1bmN0
aW9uIiwgRW1iZXIuY2FuSW52b2tlKGluaXRpYWxpemVyLCAnaW5pdGlhbGl6ZScpKTsKLQotICAg
IHRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxpemVyLm5hbWVdID0gaW5pdGlhbGl6ZXI7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhpcyBjcmVhdGVzIGEgY29udGFpbmVyIHdpdGggdGhlIGRlZmF1bHQg
RW1iZXIgbmFtaW5nIGNvbnZlbnRpb25zLgotCi0gICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSBj
b250YWluZXI6Ci0KLSAgICAqIHJlZ2lzdGVyZWQgdmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGlt
ZSB0aGV5IGFyZSBsb29rZWQgdXAgKHRoZXkgYXJlCi0gICAgICBub3Qgc2luZ2xldG9ucykKLSAg
ICAqIHJlZ2lzdGVyZWQgdGVtcGxhdGVzIGFyZSBub3QgZmFjdG9yaWVzOyB0aGUgcmVnaXN0ZXJl
ZCB2YWx1ZSBpcwotICAgICAgcmV0dXJuZWQgZGlyZWN0bHkuCi0gICAgKiB0aGUgcm91dGVyIHJl
Y2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBpdHMgYG5hbWVzcGFjZWAgcHJvcGVydHkKLSAgICAq
IGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSByb3V0ZXIgYXMgdGhlaXIgYHRhcmdldGAgYW5k
IGBjb250cm9sbGVyc2AKLSAgICAgIHByb3BlcnRpZXMKLSAgICAqIGFsbCBjb250cm9sbGVycyBy
ZWNlaXZlIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVpciBgbmFtZXNwYWNlYCBwcm9wZXJ0eQotICAg
ICogdGhlIGFwcGxpY2F0aW9uIHZpZXcgcmVjZWl2ZXMgdGhlIGFwcGxpY2F0aW9uIGNvbnRyb2xs
ZXIgYXMgaXRzCi0gICAgICBgY29udHJvbGxlcmAgcHJvcGVydHkKLSAgICAqIHRoZSBhcHBsaWNh
dGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSBhcyBpdHMKLSAgICAg
IGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
YnVpbGRDb250YWluZXIKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHtFbWJlci5BcHBsaWNhdGlv
bn0gbmFtZXNwYWNlIHRoZSBhcHBsaWNhdGlvbiB0byBidWlsZCB0aGUKLSAgICAgIGNvbnRhaW5l
ciBmb3IuCi0gICAgQHJldHVybiB7RW1iZXIuQ29udGFpbmVyfSB0aGUgYnVpbHQgY29udGFpbmVy
Ci0gICovCi0gIGJ1aWxkQ29udGFpbmVyOiBmdW5jdGlvbihuYW1lc3BhY2UpIHsKLSAgICB2YXIg
Y29udGFpbmVyID0gbmV3IEVtYmVyLkNvbnRhaW5lcigpOwotCi0gICAgRW1iZXIuQ29udGFpbmVy
LmRlZmF1bHRDb250YWluZXIgPSBuZXcgRGVwcmVjYXRlZENvbnRhaW5lcihjb250YWluZXIpOwot
Ci0gICAgY29udGFpbmVyLnNldCA9IEVtYmVyLnNldDsKLSAgICBjb250YWluZXIucmVzb2x2ZXIg
ID0gcmVzb2x2ZXJGb3IobmFtZXNwYWNlKTsKLSAgICBjb250YWluZXIubm9ybWFsaXplID0gY29u
dGFpbmVyLnJlc29sdmVyLm5vcm1hbGl6ZTsKLSAgICBjb250YWluZXIuZGVzY3JpYmUgID0gY29u
dGFpbmVyLnJlc29sdmVyLmRlc2NyaWJlOwotICAgIGNvbnRhaW5lci5tYWtlVG9TdHJpbmcgPSBj
b250YWluZXIucmVzb2x2ZXIubWFrZVRvU3RyaW5nOwotCi0gICAgY29udGFpbmVyLm9wdGlvbnNG
b3JUeXBlKCdjb21wb25lbnQnLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVy
Lm9wdGlvbnNGb3JUeXBlKCd2aWV3JywgeyBzaW5nbGV0b246IGZhbHNlIH0pOwotICAgIGNvbnRh
aW5lci5vcHRpb25zRm9yVHlwZSgndGVtcGxhdGUnLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsK
LSAgICBjb250YWluZXIub3B0aW9uc0ZvclR5cGUoJ2hlbHBlcicsIHsgaW5zdGFudGlhdGU6IGZh
bHNlIH0pOwotCi0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdhcHBsaWNhdGlvbjptYWluJywgbmFt
ZXNwYWNlLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKLQotICAgIGNvbnRhaW5lci5yZWdpc3Rl
cignY29udHJvbGxlcjpiYXNpYycsIEVtYmVyLkNvbnRyb2xsZXIsIHsgaW5zdGFudGlhdGU6IGZh
bHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjpvYmplY3QnLCBFbWJl
ci5PYmplY3RDb250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKLSAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6YXJyYXknLCBFbWJlci5BcnJheUNvbnRyb2xsZXIsIHsg
aW5zdGFudGlhdGU6IGZhbHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGU6YmFz
aWMnLCBFbWJlci5Sb3V0ZSwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1haW4nLCBFbWJlci5FdmVudERpc3BhdGNoZXIp
OwotCi0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdyb3V0ZXI6bWFpbicsICBFbWJlci5Sb3V0ZXIp
OwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ3JvdXRlcjptYWluJywgJ25hbWVzcGFjZScsICdh
cHBsaWNhdGlvbjptYWluJyk7Ci0KLSAgICBjb250YWluZXIuaW5qZWN0aW9uKCdjb250cm9sbGVy
JywgJ3RhcmdldCcsICdyb3V0ZXI6bWFpbicpOwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ2Nv
bnRyb2xsZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1haW4nKTsKLQotICAgIGNvbnRh
aW5lci5pbmplY3Rpb24oJ3JvdXRlJywgJ3JvdXRlcicsICdyb3V0ZXI6bWFpbicpOwotCi0gICAg
cmV0dXJuIGNvbnRhaW5lcjsKLSAgfQotfSk7Ci0KLS8qKgotICBUaGlzIGZ1bmN0aW9uIGRlZmlu
ZXMgdGhlIGRlZmF1bHQgbG9va3VwIHJ1bGVzIGZvciBjb250YWluZXIgbG9va3VwczoKLQotICAq
IHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJlci5URU1QTEFURVNgCi0gICogb3RoZXIg
bmFtZXMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgY2xhc3NpZnlpbmcg
dGhlIG5hbWUuCi0gICAgRm9yIGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3RgIGxvb2tzIHVwIGBB
cHAuUG9zdENvbnRyb2xsZXJgIGJ5IGRlZmF1bHQuCi0gICogaWYgdGhlIGRlZmF1bHQgbG9va3Vw
IGZhaWxzLCBsb29rIGZvciByZWdpc3RlcmVkIGNsYXNzZXMgb24gdGhlIGNvbnRhaW5lcgotCi0g
IFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZWdpc3RlciBkZWZhdWx0IGluamVjdGlv
bnMgaW4gdGhlIGNvbnRhaW5lcgotICB0aGF0IGNvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG5v
cm1hbCBuYW1pbmcgY29udmVudGlvbi4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHJlc29sdmVy
Rm9yCi0gIEBwYXJhbSB7RW1iZXIuTmFtZXNwYWNlfSBuYW1lc3BhY2UgdGhlIG5hbWVzcGFjZSB0
byBsb29rIGZvciBjbGFzc2VzCi0gIEByZXR1cm4geyp9IHRoZSByZXNvbHZlZCB2YWx1ZSBmb3Ig
YSBnaXZlbiBsb29rdXAKLSovCi1mdW5jdGlvbiByZXNvbHZlckZvcihuYW1lc3BhY2UpIHsKLSAg
aWYgKG5hbWVzcGFjZS5nZXQoJ3Jlc29sdmVyJykpIHsKLSAgICBFbWJlci5kZXByZWNhdGUoJ0Fw
cGxpY2F0aW9uLnJlc29sdmVyIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQXBwbGljYXRpb24u
UmVzb2x2ZXInLCBmYWxzZSk7Ci0gIH0KLQotICB2YXIgUmVzb2x2ZXJDbGFzcyA9IG5hbWVzcGFj
ZS5nZXQoJ3Jlc29sdmVyJykgfHwgbmFtZXNwYWNlLmdldCgnUmVzb2x2ZXInKSB8fCBFbWJlci5E
ZWZhdWx0UmVzb2x2ZXI7Ci0gIHZhciByZXNvbHZlciA9IFJlc29sdmVyQ2xhc3MuY3JlYXRlKHsK
LSAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZQotICB9KTsKLQotICBmdW5jdGlvbiByZXNvbHZlKGZ1
bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJlc29sdmVyLnJlc29sdmUoZnVsbE5hbWUpOwotICB9Ci0K
LSAgcmVzb2x2ZS5kZXNjcmliZSA9IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJl
c29sdmVyLmxvb2t1cERlc2NyaXB0aW9uKGZ1bGxOYW1lKTsKLSAgfTsKLQotICByZXNvbHZlLm1h
a2VUb1N0cmluZyA9IGZ1bmN0aW9uKGZhY3RvcnksIGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJl
c29sdmVyLm1ha2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7Ci0gIH07Ci0KLSAgcmVzb2x2
ZS5ub3JtYWxpemUgPSBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgIGlmIChyZXNvbHZlci5ub3Jt
YWxpemUpIHsKLSAgICAgIHJldHVybiByZXNvbHZlci5ub3JtYWxpemUoZnVsbE5hbWUpOwotICAg
IH0gZWxzZSB7Ci0gICAgICBFbWJlci5kZXByZWNhdGUoJ1RoZSBSZXNvbHZlciBzaG91bGQgbm93
IHByb3ZpZGUgYSBcJ25vcm1hbGl6ZVwnIGZ1bmN0aW9uJywgZmFsc2UpOwotICAgICAgcmV0dXJu
IGZ1bGxOYW1lOwotICAgIH0KLSAgfTsKLQotICByZXR1cm4gcmVzb2x2ZTsKLX0KLQotRW1iZXIu
cnVuTG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlvbicsIEVtYmVyLkFwcGxpY2F0aW9uKTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi1mdW5jdGlvbiB2ZXJpZnlO
ZWVkc0RlcGVuZGVuY2llcyhjb250cm9sbGVyLCBjb250YWluZXIsIG5lZWRzKSB7Ci0gIHZhciBk
ZXBlbmRlbmN5LCBpLCBsLCBtaXNzaW5nID0gW107Ci0KLSAgZm9yIChpPTAsIGw9bmVlZHMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgIGRlcGVuZGVuY3kgPSBuZWVkc1tpXTsKLQotICAgIEVtYmVy
LmFzc2VydChFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiNuZWVkcyBtdXN0IG5vdCBzcGVj
aWZ5IGRlcGVuZGVuY2llcyB3aXRoIHBlcmlvZHMgaW4gdGhlaXIgbmFtZXMgKCIgKyBkZXBlbmRl
bmN5ICsgIikiLCBkZXBlbmRlbmN5LmluZGV4T2YoJy4nKSA9PT0gLTEpOwotCi0gICAgaWYgKGRl
cGVuZGVuY3kuaW5kZXhPZignOicpID09PSAtMSkgewotICAgICAgZGVwZW5kZW5jeSA9ICJjb250
cm9sbGVyOiIgKyBkZXBlbmRlbmN5OwotICAgIH0KLQotICAgIC8vIFN0cnVjdHVyZSBhc3NlcnQg
dG8gc3RpbGwgZG8gdmVyaWZpY2F0aW9uIGJ1dCBub3Qgc3RyaW5nIGNvbmNhdCBpbiBwcm9kdWN0
aW9uCi0gICAgaWYgKCFjb250YWluZXIuaGFzKGRlcGVuZGVuY3kpKSB7Ci0gICAgICBtaXNzaW5n
LnB1c2goZGVwZW5kZW5jeSk7Ci0gICAgfQotICB9Ci0gIGlmIChtaXNzaW5nLmxlbmd0aCkgewot
ICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiBu
ZWVkcyBbICIgKyBtaXNzaW5nLmpvaW4oJywgJykgKyAiIF0gYnV0ICIgKyAobWlzc2luZy5sZW5n
dGggPiAxID8gJ3RoZXknIDogJ2l0JykgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotICB9Ci19
Ci0KLXZhciBkZWZhdWx0Q29udHJvbGxlcnNDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gIHZhciBjb250cm9sbGVyID0gdGhpczsKLQotICByZXR1cm4gewot
ICAgIG5lZWRzOiBnZXQoY29udHJvbGxlciwgJ25lZWRzJyksCi0gICAgY29udGFpbmVyOiBnZXQo
Y29udHJvbGxlciwgJ2NvbnRhaW5lcicpLAotICAgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24o
Y29udHJvbGxlck5hbWUpIHsKLSAgICAgIHZhciBuZWVkcyA9IHRoaXMubmVlZHMsCi0gICAgICAg
IGRlcGVuZGVuY3ksIGksIGw7Ci0gICAgICBmb3IgKGk9MCwgbD1uZWVkcy5sZW5ndGg7IGk8bDsg
aSsrKSB7Ci0gICAgICAgIGRlcGVuZGVuY3kgPSBuZWVkc1tpXTsKLSAgICAgICAgaWYgKGRlcGVu
ZGVuY3kgPT09IGNvbnRyb2xsZXJOYW1lKSB7Ci0gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFp
bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWUpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0KLSAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBFbWJlci5pbnNwZWN0KGNvbnRyb2xs
ZXIpICsgJyNuZWVkcyBkb2VzIG5vdCBpbmNsdWRlIGAnICsgY29udHJvbGxlck5hbWUgKyAnYC4g
VG8gYWNjZXNzIHRoZSAnICsgY29udHJvbGxlck5hbWUgKyAnIGNvbnRyb2xsZXIgZnJvbSAnICsg
RW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICcsICcgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xs
ZXIpICsgJyBzaG91bGQgaGF2ZSBhIGBuZWVkc2AgcHJvcGVydHkgdGhhdCBpcyBhbiBhcnJheSBv
ZiB0aGUgY29udHJvbGxlcnMgaXQgaGFzIGFjY2VzcyB0by4nOwotICAgICAgdGhyb3cgbmV3IFJl
ZmVyZW5jZUVycm9yKGVycm9yTWVzc2FnZSk7Ci0gICAgfSwKLSAgICBzZXRVbmtub3duUHJvcGVy
dHk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBj
YW5ub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBgY29udHJvbGxlcnMuIiArIGtleSArICJgIG9m
ICIgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpKTsKLSAgICB9Ci0gIH07Ci19KTsKLQotLyoq
Ci0gIEBjbGFzcyBDb250cm9sbGVyTWl4aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVy
LkNvbnRyb2xsZXJNaXhpbi5yZW9wZW4oewotICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBbJ25l
ZWRzJ10sCi0KLSAgLyoqCi0gICAgQW4gYXJyYXkgb2Ygb3RoZXIgY29udHJvbGxlciBvYmplY3Rz
IGF2YWlsYWJsZSBpbnNpZGUKLSAgICBpbnN0YW5jZXMgb2YgdGhpcyBjb250cm9sbGVyIHZpYSB0
aGUgYGNvbnRyb2xsZXJzYAotICAgIHByb3BlcnR5OgotCi0gICAgRm9yIGV4YW1wbGUsIHdoZW4g
eW91IGRlZmluZSBhIGNvbnRyb2xsZXI6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkNv
bW1lbnRzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgICAg
bmVlZHM6IFsncG9zdCddCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgYXBwbGljYXRpb24n
cyBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlc2Ugb3RoZXIKLSAgICBjb250cm9sbGVycyBhcmUgYWNj
ZXNzaWJsZSBieSBuYW1lIHRocm91Z2ggdGhlCi0gICAgYGNvbnRyb2xsZXJzYCBwcm9wZXJ0eToK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlzLmdldCgnY29udHJvbGxlcnMucG9zdCcpOyAv
LyBpbnN0YW5jZSBvZiBBcHAuUG9zdENvbnRyb2xsZXIKLSAgICBgYGAKLQotICAgIEdpdmVuIHRo
YXQgeW91IGhhdmUgYSBuZXN0ZWQgY29udHJvbGxlciAobmVzdGVkIHJlc291cmNlKToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudHNOZXdDb250cm9sbGVyID0gRW1iZXIuT2Jq
ZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIH0pOwotICAgIGBgYAotCi0gICAgV2hlbiB5b3Ug
ZGVmaW5lIGEgY29udHJvbGxlciB0aGF0IHJlcXVpcmVzIGFjY2VzcyB0byBhIG5lc3RlZCBvbmU6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkluZGV4Q29udHJvbGxlciA9IEVtYmVyLk9i
amVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAgIG5lZWRzOiBbJ2NvbW1lbnRzTmV3J10KLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIFlvdSB3aWxsIGJlIGFibGUgdG8gZ2V0IGFjY2VzcyB0byBp
dDoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlzLmdldCgnY29udHJvbGxlcnMuY29tbWVu
dHNOZXcnKTsgLy8gaW5zdGFuY2Ugb2YgQXBwLkNvbW1lbnRzTmV3Q29udHJvbGxlcgotICAgIGBg
YAotCi0gICAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc2luZ2xldG9uIGNvbnRyb2xsZXJz
LgotCi0gICAgQHByb3BlcnR5IHtBcnJheX0gbmVlZHMKLSAgICBAZGVmYXVsdCBbXQotICAqLwot
ICBuZWVkczogW10sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5lZWRzID0gZ2V0
KHRoaXMsICduZWVkcycpLAotICAgIGxlbmd0aCA9IGdldChuZWVkcywgJ2xlbmd0aCcpOwotCi0g
ICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgIEVtYmVyLmFzc2VydCgnIGAnICsgRW1iZXIuaW5z
cGVjdCh0aGlzKSArICcgc3BlY2lmaWVzIGBuZWVkc2AsIGJ1dCBkb2VzICcgKwotICAgICAgICAg
ICAgICAgICAgICJub3QgaGF2ZSBhIGNvbnRhaW5lci4gUGxlYXNlIGVuc3VyZSB0aGlzIGNvbnRy
b2xsZXIgd2FzICIgKwotICAgICAgICAgICAgICAgICAgICJpbnN0YW50aWF0ZWQgd2l0aCBhIGNv
bnRhaW5lci4iLAotICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyIHx8IEVtYmVyLm1l
dGEodGhpcywgZmFsc2UpLmRlc2NzLmNvbnRyb2xsZXJzICE9PSBkZWZhdWx0Q29udHJvbGxlcnND
b21wdXRlZFByb3BlcnR5KTsKLQotICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7Ci0gICAgICAg
IHZlcmlmeU5lZWRzRGVwZW5kZW5jaWVzKHRoaXMsIHRoaXMuY29udGFpbmVyLCBuZWVkcyk7Ci0g
ICAgICB9Ci0KLSAgICAgIC8vIGlmIG5lZWRzIHRoZW4gaW5pdGlhbGl6ZSBjb250cm9sbGVycyBw
cm94eQotICAgICAgZ2V0KHRoaXMsICdjb250cm9sbGVycycpOwotICAgIH0KLQotICAgIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhv
ZCBjb250cm9sbGVyRm9yCi0gICAgQHNlZSB7RW1iZXIuUm91dGUjY29udHJvbGxlckZvcn0KLSAg
ICBAZGVwcmVjYXRlZCBVc2UgYG5lZWRzYCBpbnN0ZWFkCi0gICovCi0gIGNvbnRyb2xsZXJGb3I6
IGZ1bmN0aW9uKGNvbnRyb2xsZXJOYW1lKSB7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCJDb250cm9s
bGVyI2NvbnRyb2xsZXJGb3IgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBDb250cm9sbGVyI25l
ZWRzIGluc3RlYWQiKTsKLSAgICByZXR1cm4gRW1iZXIuY29udHJvbGxlckZvcihnZXQodGhpcywg
J2NvbnRhaW5lcicpLCBjb250cm9sbGVyTmFtZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU3RvcmVz
IHRoZSBpbnN0YW5jZXMgb2Ygb3RoZXIgY29udHJvbGxlcnMgYXZhaWxhYmxlIGZyb20gd2l0aGlu
Ci0gICAgdGhpcyBjb250cm9sbGVyLiBBbnkgY29udHJvbGxlciBsaXN0ZWQgYnkgbmFtZSBpbiB0
aGUgYG5lZWRzYAotICAgIHByb3BlcnR5IHdpbGwgYmUgYWNjZXNzaWJsZSBieSBuYW1lIHRocm91
Z2ggdGhpcyBwcm9wZXJ0eS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudHND
b250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgICBuZWVkczog
Wydwb3N0J10sCi0gICAgICBwb3N0VGl0bGU6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBjdXJy
ZW50UG9zdCA9IHRoaXMuZ2V0KCdjb250cm9sbGVycy5wb3N0Jyk7IC8vIGluc3RhbmNlIG9mIEFw
cC5Qb3N0Q29udHJvbGxlcgotICAgICAgICByZXR1cm4gY3VycmVudFBvc3QuZ2V0KCd0aXRsZScp
OwotICAgICAgfS5wcm9wZXJ0eSgnY29udHJvbGxlcnMucG9zdC50aXRsZScpCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAc2VlIHtFbWJlci5Db250cm9sbGVyTWl4aW4jbmVlZHN9Ci0gICAgQHBy
b3BlcnR5IHtPYmplY3R9IGNvbnRyb2xsZXJzCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBj
b250cm9sbGVyczogZGVmYXVsdENvbnRyb2xsZXJzQ29tcHV0ZWRQcm9wZXJ0eQotfSk7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0v
KioKLUVtYmVyIEFwcGxpY2F0aW9uCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
YXBwbGljYXRpb24KLUByZXF1aXJlcyBlbWJlci12aWV3cywgZW1iZXItcm91dGluZwotKi8KLQot
fSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVt
YmVyLWV4dGVuc2lvbi1zdXBwb3J0Ci0qLwotLyoqCi0gIFRoZSBgRGF0YUFkYXB0ZXJgIGhlbHBz
IGEgZGF0YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5Ci0gIGludGVyZmFjZSB3aXRoIHRvb2xzIHRoYXQg
ZGVidWcgRW1iZXIgc3VjaAotICBhcyB0aGUgW0VtYmVyIEV4dGVuc2lvbl0oaHR0cHM6Ly9naXRo
dWIuY29tL3RpbGRlaW8vZW1iZXItZXh0ZW5zaW9uKQotICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94
LgotCi0gIFRoaXMgY2xhc3Mgd2lsbCBiZSBleHRlbmRlZCBieSBhIHBlcnNpc3RlbmNlIGxpYnJh
cnkKLSAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzIHdpdGgKLSAgbGli
cmFyeS1zcGVjaWZpYyBjb2RlLgotCi0gIFRoZSBtZXRob2RzIGxpa2VseSB0byBiZSBvdmVycmlk
ZGVuIGFyZToKLQotICAqIGBnZXRGaWx0ZXJzYAotICAqIGBkZXRlY3RgCi0gICogYGNvbHVtbnNG
b3JUeXBlYAotICAqIGBnZXRSZWNvcmRzYAotICAqIGBnZXRSZWNvcmRDb2x1bW5WYWx1ZXNgCi0g
ICogYGdldFJlY29yZEtleXdvcmRzYAotICAqIGBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXNgCi0gICog
YGdldFJlY29yZENvbG9yYAotICAqIGBvYnNlcnZlUmVjb3JkYAotCi0gIFRoZSBhZGFwdGVyIHdp
bGwgbmVlZCB0byBiZSByZWdpc3RlcmVkCi0gIGluIHRoZSBhcHBsaWNhdGlvbidzIGNvbnRhaW5l
ciBhcyBgZGF0YUFkYXB0ZXI6bWFpbmAKLQotICBFeGFtcGxlOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJkYXRhQWRhcHRlciIsCi0K
LSAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9uKSB7Ci0gICAg
ICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YUFkYXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVy
KTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgRGF0YUFkYXB0ZXIKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5EYXRhQWRhcHRl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlz
Ll9zdXBlcigpOwotICAgIHRoaXMucmVsZWFzZU1ldGhvZHMgPSBFbWJlci5BKCk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgVGhlIGNvbnRhaW5lciBvZiB0aGUgYXBwbGljYXRpb24gYmVpbmcgZGVidWdn
ZWQuCi0gICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGluamVjdGVkCi0gICAgb24gY3JlYXRpb24u
Ci0KLSAgICBAcHJvcGVydHkgY29udGFpbmVyCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBj
b250YWluZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgTnVtYmVyIG9mIGF0dHJpYnV0ZXMgdG8gc2Vu
ZAotICAgIGFzIGNvbHVtbnMuIChFbm91Z2ggdG8gbWFrZSB0aGUgcmVjb3JkCi0gICAgaWRlbnRp
ZmlhYmxlKS4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IGF0dHJpYnV0ZUxpbWl0Ci0g
ICAgQGRlZmF1bHQgMwotICAqLwotICBhdHRyaWJ1dGVMaW1pdDogMywKLQotICAvKioKLSAgICBT
dG9yZXMgYWxsIG1ldGhvZHMgdGhhdCBjbGVhciBvYnNlcnZlcnMuCi0gICAgVGhlc2UgbWV0aG9k
cyB3aWxsIGJlIGNhbGxlZCBvbiBkZXN0cnVjdGlvbi4KLQotICAgIEBwcml2YXRlCi0gICAgQHBy
b3BlcnR5IHJlbGVhc2VNZXRob2RzCi0gICovCi0gIHJlbGVhc2VNZXRob2RzOiBFbWJlci5BKCks
Ci0KLSAgLyoqCi0gICAgU3BlY2lmaWVzIGhvdyByZWNvcmRzIGNhbiBiZSBmaWx0ZXJlZC4KLSAg
ICBSZWNvcmRzIHJldHVybmVkIHdpbGwgbmVlZCB0byBoYXZlIGEgYGZpbHRlclZhbHVlc2AKLSAg
ICBwcm9wZXJ0eSB3aXRoIGEga2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBhcnJh
eS4KLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIGdldEZpbHRlcnMKLSAgICBAcmV0dXJuIHtB
cnJheX0gTGlzdCBvZiBvYmplY3RzIGRlZmluaW5nIGZpbHRlcnMuCi0gICAgIFRoZSBvYmplY3Qg
c2hvdWxkIGhhdmUgYSBgbmFtZWAgYW5kIGBkZXNjYCBwcm9wZXJ0eS4KLSAgKi8KLSAgZ2V0Rmls
dGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSwKLQotICAvKioK
LSAgICBGZXRjaCB0aGUgbW9kZWwgdHlwZXMgYW5kIG9ic2VydmUgdGhlbSBmb3IgY2hhbmdlcy4K
LQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIHdhdGNoTW9kZWxUeXBlcwotCi0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gdHlwZXNBZGRlZCBDYWxsYmFjayB0byBjYWxsIHRvIGFkZCB0eXBlcy4KLSAg
ICBUYWtlcyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgd3JhcHBlZCB0eXBlcyAocmV0
dXJuZWQgZnJvbSBgd3JhcE1vZGVsVHlwZWApLgotCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gdHlw
ZXNVcGRhdGVkIENhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIHR5cGUgaGFzIGNoYW5nZWQuCi0gICAg
VGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBwZWQgdHlwZXMuCi0KLSAg
ICBAcmV0dXJuIHtGdW5jdGlvbn0gTWV0aG9kIHRvIGNhbGwgdG8gcmVtb3ZlIGFsbCBvYnNlcnZl
cnMKLSAgKi8KLSAgd2F0Y2hNb2RlbFR5cGVzOiBmdW5jdGlvbih0eXBlc0FkZGVkLCB0eXBlc1Vw
ZGF0ZWQpIHsKLSAgICB2YXIgbW9kZWxUeXBlcyA9IHRoaXMuZ2V0TW9kZWxUeXBlcygpLAotICAg
ICAgICBzZWxmID0gdGhpcywgdHlwZXNUb1NlbmQsIHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgp
OwotCi0gICAgdHlwZXNUb1NlbmQgPSBtb2RlbFR5cGVzLm1hcChmdW5jdGlvbih0eXBlKSB7Ci0g
ICAgICB2YXIgd3JhcHBlZCA9IHNlbGYud3JhcE1vZGVsVHlwZSh0eXBlKTsKLSAgICAgIHJlbGVh
c2VNZXRob2RzLnB1c2goc2VsZi5vYnNlcnZlTW9kZWxUeXBlKHR5cGUsIHR5cGVzVXBkYXRlZCkp
OwotICAgICAgcmV0dXJuIHdyYXBwZWQ7Ci0gICAgfSk7Ci0KLSAgICB0eXBlc0FkZGVkKHR5cGVz
VG9TZW5kKTsKLQotICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24oKSB7Ci0gICAgICByZWxlYXNl
TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7IGZuKCk7IH0pOwotICAgICAgc2VsZi5yZWxl
YXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFzZSk7Ci0gICAgfTsKLSAgICB0aGlzLnJlbGVh
c2VNZXRob2RzLnB1c2hPYmplY3QocmVsZWFzZSk7Ci0gICAgcmV0dXJuIHJlbGVhc2U7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgRmV0Y2ggdGhlIHJlY29yZHMgb2YgYSBnaXZlbiB0eXBlIGFuZCBvYnNl
cnZlIHRoZW0gZm9yIGNoYW5nZXMuCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCB3YXRjaFJl
Y29yZHMKLQotICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZHNBZGRlZCBDYWxsYmFjayB0byBj
YWxsIHRvIGFkZCByZWNvcmRzLgotICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFp
bmluZyB3cmFwcGVkIHJlY29yZHMuCi0gICAgVGhlIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9s
bG93aW5nIHByb3BlcnRpZXM6Ci0gICAgICBjb2x1bW5WYWx1ZXM6IHtPYmplY3R9IGtleSBhbmQg
dmFsdWUgb2YgYSB0YWJsZSBjZWxsCi0gICAgICBvYmplY3Q6IHtPYmplY3R9IHRoZSBhY3R1YWwg
cmVjb3JkIG9iamVjdAotCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVjb3Jkc1VwZGF0ZWQgQ2Fs
bGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhhcyBjaGFuZ2VkLgotICAgIFRha2VzIGFuIGFy
cmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCi0KLSAgICBAcGFyYW0g
e0Z1bmN0aW9ufSByZWNvcmRzUmVtb3ZlZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gYSByZWNvcmQg
aGFzIHJlbW92ZWQuCi0gICAgVGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgotICAgICAg
aW5kZXg6IHRoZSBhcnJheSBpbmRleCB3aGVyZSB0aGUgcmVjb3JkcyB3ZXJlIHJlbW92ZWQKLSAg
ICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVtb3ZlZAotCi0gICAgQHJldHVybiB7
RnVuY3Rpb259IE1ldGhvZCB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzCi0gICovCi0g
IHdhdGNoUmVjb3JkczogZnVuY3Rpb24odHlwZSwgcmVjb3Jkc0FkZGVkLCByZWNvcmRzVXBkYXRl
ZCwgcmVjb3Jkc1JlbW92ZWQpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXMsIHJlbGVhc2VNZXRob2Rz
ID0gRW1iZXIuQSgpLCByZWNvcmRzID0gdGhpcy5nZXRSZWNvcmRzKHR5cGUpLCByZWxlYXNlOwot
Ci0gICAgdmFyIHJlY29yZFVwZGF0ZWQgPSBmdW5jdGlvbih1cGRhdGVkUmVjb3JkKSB7Ci0gICAg
ICByZWNvcmRzVXBkYXRlZChbdXBkYXRlZFJlY29yZF0pOwotICAgIH07Ci0KLSAgICB2YXIgcmVj
b3Jkc1RvU2VuZCA9IHJlY29yZHMubWFwKGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVsZWFz
ZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVkKSk7
Ci0gICAgICByZXR1cm4gc2VsZi53cmFwUmVjb3JkKHJlY29yZCk7Ci0gICAgfSk7Ci0KLQotICAg
IHZhciBjb250ZW50RGlkQ2hhbmdlID0gZnVuY3Rpb24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50
LCBhZGRlZENvdW50KSB7Ci0gICAgICBmb3IgKHZhciBpID0gaWR4OyBpIDwgaWR4ICsgYWRkZWRD
b3VudDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBhcnJheS5vYmplY3RBdChpKTsKLSAg
ICAgICAgdmFyIHdyYXBwZWQgPSBzZWxmLndyYXBSZWNvcmQocmVjb3JkKTsKLSAgICAgICAgcmVs
ZWFzZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVk
KSk7Ci0gICAgICAgIHJlY29yZHNBZGRlZChbd3JhcHBlZF0pOwotICAgICAgfQotCi0gICAgICBp
ZiAocmVtb3ZlZENvdW50KSB7Ci0gICAgICAgIHJlY29yZHNSZW1vdmVkKGlkeCwgcmVtb3ZlZENv
dW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgdmFyIG9ic2VydmVyID0geyBkaWRDaGFuZ2U6
IGNvbnRlbnREaWRDaGFuZ2UsIHdpbGxDaGFuZ2U6IEVtYmVyLksgfTsKLSAgICByZWNvcmRzLmFk
ZEFycmF5T2JzZXJ2ZXIoc2VsZiwgb2JzZXJ2ZXIpOwotCi0gICAgcmVsZWFzZSA9IGZ1bmN0aW9u
KCkgewotICAgICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihmbikgeyBmbigpOyB9
KTsKLSAgICAgIHJlY29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxmLCBvYnNlcnZlcik7Ci0g
ICAgICBzZWxmLnJlbGVhc2VNZXRob2RzLnJlbW92ZU9iamVjdChyZWxlYXNlKTsKLSAgICB9Owot
Ci0gICAgcmVjb3Jkc0FkZGVkKHJlY29yZHNUb1NlbmQpOwotCi0gICAgdGhpcy5yZWxlYXNlTWV0
aG9kcy5wdXNoT2JqZWN0KHJlbGVhc2UpOwotICAgIHJldHVybiByZWxlYXNlOwotICB9LAotCi0g
IC8qKgotICAgIENsZWFyIGFsbCBvYnNlcnZlcnMgYmVmb3JlIGRlc3RydWN0aW9uCi0gICAgQHBy
aXZhdGUKLSAgKi8KLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVy
KCk7Ci0gICAgdGhpcy5yZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7Ci0gICAg
ICBmbigpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIERldGVjdCB3aGV0aGVyIGEgY2xh
c3MgaXMgYSBtb2RlbC4KLQotICAgIFRlc3QgdGhhdCBhZ2FpbnN0IHRoZSBtb2RlbCBjbGFzcwot
ICAgIG9mIHlvdXIgcGVyc2lzdGVuY2UgbGlicmFyeQotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIGRldGVjdAotICAgIEBwYXJhbSB7Q2xhc3N9IGtsYXNzIFRoZSBjbGFzcyB0byB0ZXN0Ci0g
ICAgQHJldHVybiBib29sZWFuIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGEgbW9kZWwgY2xhc3Mgb3Ig
bm90Ci0gICovCi0gIGRldGVjdDogZnVuY3Rpb24oa2xhc3MpIHsKLSAgICByZXR1cm4gZmFsc2U7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBjb2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5
cGUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgY29sdW1uc0ZvclR5cGUKLSAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBlCi0gICAgQHJldHVybiB7QXJyYXl9IEFuIGFy
cmF5IG9mIGNvbHVtbnMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICAgIG5hbWU6IHtTdHJp
bmd9IG5hbWUgb2YgdGhlIGNvbHVtbgotICAgICBkZXNjOiB7U3RyaW5nfSBIdW1hbml6ZWQgZGVz
Y3JpcHRpb24gKHdoYXQgd291bGQgc2hvdyBpbiBhIHRhYmxlIGNvbHVtbiBuYW1lKQotICAqLwot
ICBjb2x1bW5zRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHJldHVybiBFbWJlci5BKCk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBvYnNlcnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNz
LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIG9ic2VydmVNb2RlbFR5cGUKLSAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBlIGNsYXNzCi0gICAgQHBhcmFtIHtGdW5jdGlv
bn0gdHlwZXNVcGRhdGVkIENhbGxlZCB3aGVuIGEgdHlwZSBpcyBtb2RpZmllZC4KLSAgICBAcmV0
dXJuIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcmVtb3ZlIG9ic2VydmVycwot
ICAqLwotCi0gIG9ic2VydmVNb2RlbFR5cGU6IGZ1bmN0aW9uKHR5cGUsIHR5cGVzVXBkYXRlZCkg
ewotICAgIHZhciBzZWxmID0gdGhpcywgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKTsK
LQotICAgIHZhciBvbkNoYW5nZSA9IGZ1bmN0aW9uKCkgewotICAgICAgdHlwZXNVcGRhdGVkKFtz
ZWxmLndyYXBNb2RlbFR5cGUodHlwZSldKTsKLSAgICB9OwotICAgIHZhciBvYnNlcnZlciA9IHsK
LSAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5zY2hlZHVs
ZU9uY2UoJ2FjdGlvbnMnLCB0aGlzLCBvbkNoYW5nZSk7Ci0gICAgICB9LAotICAgICAgd2lsbENo
YW5nZTogRW1iZXIuSwotICAgIH07Ci0KLSAgICByZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIodGhp
cywgb2JzZXJ2ZXIpOwotCi0gICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigpIHsKLSAgICAgIHJl
Y29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxmLCBvYnNlcnZlcik7Ci0gICAgfTsKLQotICAg
IHJldHVybiByZWxlYXNlOwotICB9LAotCi0KLSAgLyoqCi0gICAgV3JhcHMgYSBnaXZlbiBtb2Rl
bCB0eXBlIGFuZCBvYnNlcnZlcyBjaGFuZ2VzIHRvIGl0LgotCi0gICAgQHByaXZhdGUKLSAgICBA
bWV0aG9kIHdyYXBNb2RlbFR5cGUKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIEEgbW9kZWwgY2xh
c3MKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBlc1VwZGF0ZWQgY2FsbGJhY2sgdG8gY2FsbCB3
aGVuIHRoZSB0eXBlIGNoYW5nZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNvbnRhaW5zIHRoZSB3
cmFwcGVkIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiB0byByZW1vdmUgb2JzZXJ2ZXJzCi0gICAgRm9y
bWF0OgotICAgICAgdHlwZToge09iamVjdH0gdGhlIHdyYXBwZWQgdHlwZQotICAgICAgICBUaGUg
d3JhcHBlZCB0eXBlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAgICAgICAgICBuYW1lOiB7
U3RyaW5nfSBuYW1lIG9mIHRoZSB0eXBlCi0gICAgICAgICAgY291bnQ6IHtJbnRlZ2VyfSBudW1i
ZXIgb2YgcmVjb3JkcyBhdmFpbGFibGUKLSAgICAgICAgICBjb2x1bW5zOiB7Q29sdW1uc30gYXJy
YXkgb2YgY29sdW1ucyB0byBkZXNjcmliZSB0aGUgcmVjb3JkCi0gICAgICAgICAgb2JqZWN0OiB7
Q2xhc3N9IHRoZSBhY3R1YWwgTW9kZWwgdHlwZSBjbGFzcwotICAgICAgcmVsZWFzZToge0Z1bmN0
aW9ufSBUaGUgZnVuY3Rpb24gdG8gcmVtb3ZlIG9ic2VydmVycwotICAqLwotICB3cmFwTW9kZWxU
eXBlOiBmdW5jdGlvbih0eXBlLCB0eXBlc1VwZGF0ZWQpIHsKLSAgICB2YXIgcmVsZWFzZSwgcmVj
b3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKSwKLSAgICAgICAgdHlwZVRvU2VuZCwgc2VsZiA9
IHRoaXM7Ci0KLSAgICB0eXBlVG9TZW5kID0gewotICAgICAgbmFtZTogdHlwZS50b1N0cmluZygp
LAotICAgICAgY291bnQ6IEVtYmVyLmdldChyZWNvcmRzLCAnbGVuZ3RoJyksCi0gICAgICBjb2x1
bW5zOiB0aGlzLmNvbHVtbnNGb3JUeXBlKHR5cGUpLAotICAgICAgb2JqZWN0OiB0eXBlCi0gICAg
fTsKLQotCi0gICAgcmV0dXJuIHR5cGVUb1NlbmQ7Ci0gIH0sCi0KLQotICAvKioKLSAgICBGZXRj
aGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24uCi0KLSAgICBAcHJpdmF0
ZQotICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcwotICAgIEByZXR1cm4ge0FycmF5fSBBcnJheSBv
ZiBtb2RlbCB0eXBlcwotICAqLwotCi0gLy8gVE9ETzogVXNlIHRoZSByZXNvbHZlciBpbnN0ZWFk
IG9mIGxvb3Bpbmcgb3ZlciBuYW1lc3BhY2VzLgotICBnZXRNb2RlbFR5cGVzOiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgbmFtZXNwYWNlcyA9IEVtYmVyLkEoRW1iZXIuTmFtZXNwYWNlLk5BTUVTUEFD
RVMpLCB0eXBlcyA9IEVtYmVyLkEoKSwgc2VsZiA9IHRoaXM7Ci0KLSAgICBuYW1lc3BhY2VzLmZv
ckVhY2goZnVuY3Rpb24obmFtZXNwYWNlKSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNw
YWNlKSB7Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmhhc093blByb3BlcnR5KGtleSkpIHsgY29u
dGludWU7IH0KLSAgICAgICAgdmFyIGtsYXNzID0gbmFtZXNwYWNlW2tleV07Ci0gICAgICAgIGlm
IChzZWxmLmRldGVjdChrbGFzcykpIHsKLSAgICAgICAgICB0eXBlcy5wdXNoKGtsYXNzKTsKLSAg
ICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiB0eXBlczsKLSAgfSwKLQotICAv
KioKLSAgICBGZXRjaGVzIGFsbCBsb2FkZWQgcmVjb3JkcyBmb3IgYSBnaXZlbiB0eXBlLgotCi0g
ICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFJlY29yZHMKLSAgICBAcmV0dXJuIHtBcnJheX0g
QW4gYXJyYXkgb2YgcmVjb3Jkcy4KLSAgICAgVGhpcyBhcnJheSB3aWxsIGJlIG9ic2VydmVkIGZv
ciBjaGFuZ2VzLAotICAgICBzbyBpdCBzaG91bGQgdXBkYXRlIHdoZW4gbmV3IHJlY29yZHMgYXJl
IGFkZGVkL3JlbW92ZWQuCi0gICovCi0gIGdldFJlY29yZHM6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICByZXR1cm4gRW1iZXIuQSgpOwotICB9LAotCi0gIC8qKgotICAgIFdyYXBzIGEgcmVjb3JkIGFu
ZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3
cmFwUmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNl
LgotICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHdyYXBwZWQgcmVjb3JkLiBGb3JtYXQ6Ci0gICAg
Y29sdW1uVmFsdWVzOiB7QXJyYXl9Ci0gICAgc2VhcmNoS2V5d29yZHM6IHtBcnJheX0KLSAgKi8K
LSAgd3JhcFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFyIHJlY29yZFRvU2VuZCA9
IHsgb2JqZWN0OiByZWNvcmQgfSwgY29sdW1uVmFsdWVzID0ge30sIHNlbGYgPSB0aGlzOwotCi0g
ICAgcmVjb3JkVG9TZW5kLmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVz
KHJlY29yZCk7Ci0gICAgcmVjb3JkVG9TZW5kLnNlYXJjaEtleXdvcmRzID0gdGhpcy5nZXRSZWNv
cmRLZXl3b3JkcyhyZWNvcmQpOwotICAgIHJlY29yZFRvU2VuZC5maWx0ZXJWYWx1ZXMgPSB0aGlz
LmdldFJlY29yZEZpbHRlclZhbHVlcyhyZWNvcmQpOwotICAgIHJlY29yZFRvU2VuZC5jb2xvciA9
IHRoaXMuZ2V0UmVjb3JkQ29sb3IocmVjb3JkKTsKLQotICAgIHJldHVybiByZWNvcmRUb1NlbmQ7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0cyB0aGUgdmFsdWVzIGZvciBlYWNoIGNvbHVtbi4KLQot
ICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRDb2x1bW5WYWx1ZXMKLSAgICBAcmV0
dXJuIHtPYmplY3R9IEtleXMgc2hvdWxkIG1hdGNoIGNvbHVtbiBuYW1lcyBkZWZpbmVkCi0gICAg
YnkgdGhlIG1vZGVsIHR5cGUuCi0gICovCi0gIGdldFJlY29yZENvbHVtblZhbHVlczogZnVuY3Rp
b24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIHt9OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMg
a2V5d29yZHMgdG8gbWF0Y2ggd2hlbiBzZWFyY2hpbmcgcmVjb3Jkcy4KLQotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBnZXRSZWNvcmRLZXl3b3JkcwotICAgIEByZXR1cm4ge0FycmF5fSBSZWxl
dmFudCBrZXl3b3JkcyBmb3Igc2VhcmNoLgotICAqLwotICBnZXRSZWNvcmRLZXl3b3JkczogZnVu
Y3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgZmlsdGVycyBkZWZpbmVkIGJ5IGBnZXRGaWx0ZXJzYC4K
LQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXMKLSAgICBA
cGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5zdGFuY2UKLSAgICBAcmV0dXJuIHtP
YmplY3R9IFRoZSBmaWx0ZXIgdmFsdWVzCi0gICovCi0gIGdldFJlY29yZEZpbHRlclZhbHVlczog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIHt9OwotICB9LAotCi0gIC8qKgotICAgIEVh
Y2ggcmVjb3JkIGNhbiBoYXZlIGEgY29sb3IgdGhhdCByZXByZXNlbnRzIGl0cyBzdGF0ZS4KLQot
ICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRDb2xvcgotICAgIEBwYXJhbSB7T2Jq
ZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZQotICAgIEByZXR1cm4ge1N0cmluZ30gVGhl
IHJlY29yZCdzIGNvbG9yCi0gICAgICBQb3NzaWJsZSBvcHRpb25zOiBibGFjaywgcmVkLCBibHVl
LCBncmVlbgotICAqLwotICBnZXRSZWNvcmRDb2xvcjogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAg
cmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50IHBy
b3BlcnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFwcGVkIHJlY29yZAotICAgIHdoZW4gYSBjaGFu
Z2Ugb2NjdXJzLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIG9ic2VydmVyUmVjb3JkCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNlCi0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gcmVjb3JkVXBkYXRlZCBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVj
b3JkIGlzIHVwZGF0ZWQuCi0gICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBj
YWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzLgotICAqLwotICBvYnNlcnZlUmVjb3JkOiBmdW5j
dGlvbihyZWNvcmQsIHJlY29yZFVwZGF0ZWQpIHsKLSAgICByZXR1cm4gZnVuY3Rpb24oKXt9Owot
ICB9Ci0KLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIEV4
dGVuc2lvbiBTdXBwb3J0Ci0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItZXh0ZW5z
aW9uLXN1cHBvcnQKLUByZXF1aXJlcyBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotfSkoKTsKLQot
KGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci10
ZXN0aW5nCi0gKi8KLXZhciBzbGljZSA9IFtdLnNsaWNlLAotICAgIGhlbHBlcnMgPSB7fSwKLSAg
ICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tzID0gW107Ci0KLS8qKgotICBUaGlzIGlzIGEgY29udGFp
bmVyIGZvciBhbiBhc3NvcnRtZW50IG9mIHRlc3RpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5Ogot
Ci0gICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0ZXN0IGFkYXB0ZXIgKGZvciB5b3VyIGZyYW1ld29y
ayBvZiBjaG9pY2UpLgotICAqIFJlZ2lzdGVyL1VucmVnaXN0ZXIgYWRkaXRpb25hbCB0ZXN0IGhl
bHBlcnMuCi0gICogU2V0dXAgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW4gdGhlIHRlc3QgaGVs
cGVycyBhcmUgaW5qZWN0ZWQgaW50bwotICAgIHlvdXIgYXBwbGljYXRpb24uCi0KLSAgQGNsYXNz
IFRlc3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLlRlc3QgPSB7Ci0KLSAgLyoqCi0g
ICAgYHJlZ2lzdGVySGVscGVyYCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgdGVzdCBoZWxwZXIgdGhh
dCB3aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBgQXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBj
YWxsZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0
aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwotICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0K
LSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5UZXN0LnJl
Z2lzdGVySGVscGVyKCdib290JywgZnVuY3Rpb24oYXBwKSB7Ci0gICAgICBFbWJlci5ydW4oYXBw
LCBhcHAuYWR2YW5jZVJlYWRpbmVzcyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGhl
bHBlciBjYW4gbGF0ZXIgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIGJlY2F1c2UgaXQgd2ls
bCBiZQotICAgIGNhbGxlZCB3aXRoIGBhcHBgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0g
ICAgQXBwLmluamVjdFRlc3RIZWxwZXJzKCk7Ci0gICAgYm9vdCgpOwotICAgIGBgYAotCi0gICAg
QHB1YmxpYwotICAgIEBtZXRob2QgcmVnaXN0ZXJIZWxwZXIKLSAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1ldGhvZCB0byBhZGQuCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gaGVscGVyTWV0aG9kCi0gICAgQHBhcmFtIG9wdGlvbnMge09iamVjdH0KLSAgKi8K
LSAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGhlbHBlck1ldGhvZCkgewotICAgIGhl
bHBlcnNbbmFtZV0gPSB7Ci0gICAgICBtZXRob2Q6IGhlbHBlck1ldGhvZCwKLSAgICAgIG1ldGE6
IHsgd2FpdDogZmFsc2UgfQotICAgIH07Ci0gIH0sCi0KLSAgLyoqCi0gICAgYHJlZ2lzdGVyQXN5
bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW4gYXN5bmMgdGVzdCBoZWxwZXIgdGhhdCB3
aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBgQXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxs
ZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0
aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwotICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAg
ICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5UZXN0LnJlZ2lz
dGVyQXN5bmNIZWxwZXIoJ2Jvb3QnLCBmdW5jdGlvbihhcHApIHsKLSAgICAgIEVtYmVyLnJ1bihh
cHAsIGFwcC5hZHZhbmNlUmVhZGluZXNzKTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoZSBh
ZHZhbnRhZ2Ugb2YgYW4gYXN5bmMgaGVscGVyIGlzIHRoYXQgaXQgd2lsbCBub3QgcnVuCi0gICAg
dW50aWwgdGhlIGxhc3QgYXN5bmMgaGVscGVyIGhhcyBjb21wbGV0ZWQuICBBbGwgYXN5bmMgaGVs
cGVycwotICAgIGFmdGVyIGl0IHdpbGwgd2FpdCBmb3IgaXQgY29tcGxldGUgYmVmb3JlIHJ1bm5p
bmcuCi0KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVy
LlRlc3QucmVnaXN0ZXJBc3luY0hlbHBlcignZGVsZXRlUG9zdCcsIGZ1bmN0aW9uKGFwcCwgcG9z
dElkKSB7Ci0gICAgICBjbGljaygnLmRlbGV0ZS0nICsgcG9zdElkKTsKLSAgICB9KTsKLQotICAg
IC8vIC4uLiBpbiB5b3VyIHRlc3QKLSAgICB2aXNpdCgnL3Bvc3QvMicpOwotICAgIGRlbGV0ZVBv
c3QoMik7Ci0gICAgdmlzaXQoJy9wb3N0LzMnKTsKLSAgICBkZWxldGVQb3N0KDMpOwotICAgIGBg
YAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2QgcmVnaXN0ZXJBc3luY0hlbHBlcgotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgbWV0aG9kIHRvIGFkZC4K
LSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKLSAgKi8KLSAgcmVnaXN0ZXJBc3lu
Y0hlbHBlcjogZnVuY3Rpb24obmFtZSwgaGVscGVyTWV0aG9kKSB7Ci0gICAgaGVscGVyc1tuYW1l
XSA9IHsKLSAgICAgIG1ldGhvZDogaGVscGVyTWV0aG9kLAotICAgICAgbWV0YTogeyB3YWl0OiB0
cnVlIH0KLSAgICB9OwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRk
ZWQgaGVscGVyIG1ldGhvZC4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGAKLSAgICBFbWJlci5U
ZXN0LnVucmVnaXN0ZXJIZWxwZXIoJ3dhaXQnKTsKLSAgICBgYGAKLQotICAgIEBwdWJsaWMKLSAg
ICBAbWV0aG9kIHVucmVnaXN0ZXJIZWxwZXIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUg
aGVscGVyIHRvIHJlbW92ZS4KLSAgKi8KLSAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFt
ZSkgewotICAgIGRlbGV0ZSBoZWxwZXJzW25hbWVdOwotICAgIGRlbGV0ZSBFbWJlci5UZXN0LlBy
b21pc2UucHJvdG90eXBlW25hbWVdOwotICB9LAotCi0gIC8qKgotICAgIFVzZWQgdG8gcmVnaXN0
ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW5ldmVyIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNg
Ci0gICAgaXMgY2FsbGVkLgotCi0gICAgVGhlIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3Vy
cmVudCBhcHBsaWNhdGlvbiBhcyBhbiBhcmd1bWVudC4KLQotICAgIEV4YW1wbGU6Ci0gICAgYGBg
Ci0gICAgRW1iZXIuVGVzdC5vbkluamVjdEhlbHBlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJl
ci4kKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rpb24oKSB7Ci0gICAgICAgIFRlc3QucGVuZGlu
Z0FqYXhSZXF1ZXN0cysrOwotICAgICAgfSk7Ci0KLSAgICAgIEVtYmVyLiQoZG9jdW1lbnQpLmFq
YXhTdG9wKGZ1bmN0aW9uKCkgewotICAgICAgICBUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMtLTsK
LSAgICAgIH0pOwotICAgIH0pOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2Qg
b25JbmplY3RIZWxwZXJzCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0
aW9uIHRvIGJlIGNhbGxlZC4KLSAgKi8KLSAgb25JbmplY3RIZWxwZXJzOiBmdW5jdGlvbihjYWxs
YmFjaykgewotICAgIGluamVjdEhlbHBlcnNDYWxsYmFja3MucHVzaChjYWxsYmFjayk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhpcyByZXR1cm5zIGEgdGhlbmFibGUgdGFpbG9yZWQgZm9yIHRlc3Rp
bmcuICBJdCBjYXRjaGVzIGZhaWxlZAotICAgIGBvblN1Y2Nlc3NgIGNhbGxiYWNrcyBhbmQgaW52
b2tlcyB0aGUgYEVtYmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb25gCi0gICAgY2FsbGJhY2sgaW4g
dGhlIGxhc3QgY2hhaW5lZCB0aGVuLgotCi0gICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJldHVy
bmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3VjaCBhcyBgd2FpdGAuCi0KLSAgICBAcHVibGljCi0gICAg
QG1ldGhvZCBwcm9taXNlCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXIgVGhlIGZ1bmN0
aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS4KLSAgKi8KLSAgcHJvbWlzZTogZnVuY3Rp
b24ocmVzb2x2ZXIpIHsKLSAgICByZXR1cm4gbmV3IEVtYmVyLlRlc3QuUHJvbWlzZShyZXNvbHZl
cik7Ci0gIH0sCi0KLSAgLyoqCi0gICBVc2VkIHRvIGFsbG93IGVtYmVyLXRlc3RpbmcgdG8gY29t
bXVuaWNhdGUgd2l0aCBhIHNwZWNpZmljIHRlc3RpbmcKLSAgIGZyYW1ld29yay4KLQotICAgWW91
IGNhbiBtYW51YWxseSBzZXQgaXQgYmVmb3JlIGNhbGxpbmcgYEFwcC5zZXR1cEZvclRlc3Rpbmco
KWAuCi0KLSAgIEV4YW1wbGU6Ci0KLSAgIGBgYAotICAgRW1iZXIuVGVzdC5hZGFwdGVyID0gTXlD
dXN0b21BZGFwdGVyLmNyZWF0ZSgpCi0gICBgYGAKLQotICAgSWYgeW91IGRvIG5vdCBzZXQgaXQs
IGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRvIGBFbWJlci5UZXN0LlFVbml0QWRhcHRlcmAu
Ci0KLSAgIEBwdWJsaWMKLSAgIEBwcm9wZXJ0eSBhZGFwdGVyCi0gICBAdHlwZSB7Q2xhc3N9IFRo
ZSBhZGFwdGVyIHRvIGJlIHVzZWQuCi0gICBAZGVmYXVsdCBFbWJlci5UZXN0LlFVbml0QWRhcHRl
cgotICAqLwotICBhZGFwdGVyOiBudWxsLAotCi0gIC8qKgotICAgIFJlcGxhY2VtZW50IGZvciBg
RW1iZXIuUlNWUC5yZXNvbHZlYAotICAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhpcyB1c2Vz
Ci0gICAgYW5kIGluc3RhbmNlIG9mIGBFbWJlci5UZXN0LlByb21pc2VgCi0KLSAgICBAcHVibGlj
Ci0gICAgQG1ldGhvZCByZXNvbHZlCi0gICAgQHBhcmFtIHtNaXhlZH0gVGhlIHZhbHVlIHRvIHJl
c29sdmUKLSAgKi8KLSAgcmVzb2x2ZTogZnVuY3Rpb24odmFsKSB7Ci0gICAgcmV0dXJuIEVtYmVy
LlRlc3QucHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7Ci0gICAgICByZXR1cm4gcmVzb2x2ZSh2
YWwpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgICBUaGlzIGFsbG93cyBlbWJlci10ZXN0
aW5nIHRvIHBsYXkgbmljZWx5IHdpdGggb3RoZXIgYXN5bmNocm9ub3VzCi0gICAgIGV2ZW50cywg
c3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIHdhaXRpbmcgZm9yIGEgQ1NTMwotICAgICB0
cmFuc2l0aW9uIG9yIGFuIEluZGV4REIgdHJhbnNhY3Rpb24uCi0KLSAgICAgRm9yIGV4YW1wbGU6
Ci0gICAgIGBgYGphdmFzY3JpcHQKLSAgICAgRW1iZXIuVGVzdC5yZWdpc3RlcldhaXRlcihmdW5j
dGlvbigpIHsKLSAgICAgcmV0dXJuIG15UGVuZGluZ1RyYW5zYWN0aW9ucygpID09IDA7Ci0gICAg
IH0pOwotICAgICBgYGAKLSAgICAgVGhlIGBjb250ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRv
IG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYHRoaXNgCi0gICAgIHdpdGggd2hpY2ggeW91ciBjYWxs
YmFjayB3aWxsIGJlIGludm9rZWQuCi0KLSAgICAgRm9yIGV4YW1wbGU6Ci0gICAgIGBgYGphdmFz
Y3JpcHQKLSAgICAgRW1iZXIuVGVzdC5yZWdpc3RlcldhaXRlcihNeURCLCBNeURCLmhhc1BlbmRp
bmdUcmFuc2FjdGlvbnMpOwotICAgICBgYGAKLSAgICAgQHB1YmxpYwotICAgICBAbWV0aG9kIHJl
Z2lzdGVyV2FpdGVyCi0gICAgIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IChvcHRpb25hbCkKLSAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgKi8KLSAgcmVnaXN0ZXJXYWl0ZXI6IGZ1
bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09
IDEpIHsKLSAgICAgIGNhbGxiYWNrID0gY29udGV4dDsKLSAgICAgIGNvbnRleHQgPSBudWxsOwot
ICAgIH0KLSAgICBpZiAoIXRoaXMud2FpdGVycykgewotICAgICAgdGhpcy53YWl0ZXJzID0gRW1i
ZXIuQSgpOwotICAgIH0KLSAgICB0aGlzLndhaXRlcnMucHVzaChbY29udGV4dCwgY2FsbGJhY2td
KTsKLSAgfSwKLSAgLyoqCi0gICAgIGB1bnJlZ2lzdGVyV2FpdGVyYCBpcyB1c2VkIHRvIHVucmVn
aXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdhcwotICAgICByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVy
V2FpdGVyYC4KLQotICAgICBAcHVibGljCi0gICAgIEBtZXRob2QgdW5yZWdpc3RlcldhaXRlcgot
ICAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCAob3B0aW9uYWwpCi0gICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrCi0gICovCi0gIHVucmVnaXN0ZXJXYWl0ZXI6IGZ1bmN0aW9uKGNvbnRl
eHQsIGNhbGxiYWNrKSB7Ci0gICAgdmFyIHBhaXI7Ci0gICAgaWYgKCF0aGlzLndhaXRlcnMpIHsg
cmV0dXJuOyB9Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIGNhbGxi
YWNrID0gY29udGV4dDsKLSAgICAgIGNvbnRleHQgPSBudWxsOwotICAgIH0KLSAgICBwYWlyID0g
W2NvbnRleHQsIGNhbGxiYWNrXTsKLSAgICB0aGlzLndhaXRlcnMgPSBFbWJlci5BKHRoaXMud2Fp
dGVycy5maWx0ZXIoZnVuY3Rpb24oZWx0KSB7Ci0gICAgICByZXR1cm4gRW1iZXIuY29tcGFyZShl
bHQsIHBhaXIpIT09MDsKLSAgICB9KSk7Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIGhlbHBlcihhcHAs
IG5hbWUpIHsKLSAgdmFyIGZuID0gaGVscGVyc1tuYW1lXS5tZXRob2QsCi0gICAgICBtZXRhID0g
aGVscGVyc1tuYW1lXS5tZXRhOwotCi0gIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJn
cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwKLSAgICAgICAgbGFzdFByb21pc2UgPSBFbWJlci5U
ZXN0Lmxhc3RQcm9taXNlOwotCi0gICAgYXJncy51bnNoaWZ0KGFwcCk7Ci0KLSAgICAvLyBzb21l
IGhlbHBlcnMgYXJlIG5vdCBhc3luYyBhbmQKLSAgICAvLyBuZWVkIHRvIHJldHVybiBhIHZhbHVl
IGltbWVkaWF0ZWx5LgotICAgIC8vIGV4YW1wbGU6IGBmaW5kYAotICAgIGlmICghbWV0YS53YWl0
KSB7Ci0gICAgICByZXR1cm4gZm4uYXBwbHkoYXBwLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBpZiAo
IWxhc3RQcm9taXNlKSB7Ci0gICAgICAvLyBJdCdzIHRoZSBmaXJzdCBhc3luYyBoZWxwZXIgaW4g
Y3VycmVudCBjb250ZXh0Ci0gICAgICBsYXN0UHJvbWlzZSA9IGZuLmFwcGx5KGFwcCwgYXJncyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHdhaXQgZm9yIGxhc3QgaGVscGVyJ3MgcHJvbWlzZSB0
byByZXNvbHZlCi0gICAgICAvLyBhbmQgdGhlbiBleGVjdXRlCi0gICAgICBydW4oZnVuY3Rpb24o
KSB7Ci0gICAgICAgIGxhc3RQcm9taXNlID0gRW1iZXIuVGVzdC5yZXNvbHZlKGxhc3RQcm9taXNl
KS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgICAgIHJldHVybiBmbi5hcHBseShhcHAsIGFyZ3Mp
OwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIHJldHVybiBsYXN0UHJvbWlz
ZTsKLSAgfTsKLX0KLQotZnVuY3Rpb24gcnVuKGZuKSB7Ci0gIGlmICghRW1iZXIucnVuLmN1cnJl
bnRSdW5Mb29wKSB7Ci0gICAgRW1iZXIucnVuKGZuKTsKLSAgfSBlbHNlIHsKLSAgICBmbigpOwot
ICB9Ci19Ci0KLUVtYmVyLkFwcGxpY2F0aW9uLnJlb3Blbih7Ci0gIC8qKgotICAgVGhpcyBwcm9w
ZXJ0eSBjb250YWlucyB0aGUgdGVzdGluZyBoZWxwZXJzIGZvciB0aGUgY3VycmVudCBhcHBsaWNh
dGlvbi4gVGhlc2UKLSAgIGFyZSBjcmVhdGVkIG9uY2UgeW91IGNhbGwgYGluamVjdFRlc3RIZWxw
ZXJzYCBvbiB5b3VyIGBFbWJlci5BcHBsaWNhdGlvbmAKLSAgIGluc3RhbmNlLiBUaGUgaW5jbHVk
ZWQgaGVscGVycyBhcmUgYWxzbyBhdmFpbGFibGUgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQot
ICAgZGVmYXVsdCwgYnV0IGNhbiBiZSB1c2VkIGZyb20gdGhpcyBvYmplY3Qgb24gdGhlIGluZGl2
aWR1YWwgYXBwbGljYXRpb24gYWxzby4KLQotICAgIEBwcm9wZXJ0eSB0ZXN0SGVscGVycwotICAg
IEB0eXBlIHtPYmplY3R9Ci0gICAgQGRlZmF1bHQge30KLSAgKi8KLSAgdGVzdEhlbHBlcnM6IHt9
LAotCi0gIC8qKgotICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4gdGhlIG9yaWdpbmFsIG1l
dGhvZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQKLSAgIG9uIHRoZSBgaGVscGVyQ29udGFpbmVyYCBi
ZWZvcmUgYGluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxsZWQuCi0KLSAgIFdoZW4gYHJlbW92ZVRl
c3RIZWxwZXJzYCBpcyBjYWxsZWQsIHRoZXNlIG1ldGhvZHMgYXJlIHJlc3RvcmVkIHRvIHRoZQot
ICAgYGhlbHBlckNvbnRhaW5lcmAuCi0KLSAgICBAcHJvcGVydHkgb3JpZ2luYWxNZXRob2RzCi0g
ICAgQHR5cGUge09iamVjdH0KLSAgICBAZGVmYXVsdCB7fQotICAgIEBwcml2YXRlCi0gICovCi0g
IG9yaWdpbmFsTWV0aG9kczoge30sCi0KLQotICAvKioKLSAgVGhpcyBwcm9wZXJ0eSBpbmRpY2F0
ZXMgd2hldGhlciBvciBub3QgdGhpcyBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgaW4KLSAgdGVz
dGluZyBtb2RlLiBUaGlzIGlzIHNldCB3aGVuIGBzZXR1cEZvclRlc3RpbmdgIGlzIGNhbGxlZCBv
biB0aGUgY3VycmVudAotICBhcHBsaWNhdGlvbi4KLQotICBAcHJvcGVydHkgdGVzdGluZwotICBA
dHlwZSB7Qm9vbGVhbn0KLSAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgdGVzdGluZzogZmFsc2Us
Ci0KLSAgLyoqCi0gICBUaGlzIGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxp
Y2F0aW9uLCBzbyB0aGF0IHlvdSBjYW4gc3RhcnQKLSAgIHRoZSBhcHAgd2hlbiB5b3VyIHRlc3Rz
IGFyZSByZWFkeSB0byBydW4uIEl0IGFsc28gc2V0cyB0aGUgcm91dGVyJ3MKLSAgIGxvY2F0aW9u
IHRvICdub25lJywgc28gdGhhdCB0aGUgd2luZG93J3MgbG9jYXRpb24gd2lsbCBub3QgYmUgbW9k
aWZpZWQKLSAgIChwcmV2ZW50aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJl
dHdlZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQotICAgd2l0aCB5b3VyIHRlc3RpbmcgZnJhbWV3
b3JrKS4KLQotICAgRXhhbXBsZToKLQotICBgYGAKLSAgQXBwLnNldHVwRm9yVGVzdGluZygpOwot
ICBgYGAKLQotICAgIEBtZXRob2Qgc2V0dXBGb3JUZXN0aW5nCi0gICovCi0gIHNldHVwRm9yVGVz
dGluZzogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIudGVzdGluZyA9IHRydWU7Ci0KLSAgICB0aGlz
LnRlc3RpbmcgPSB0cnVlOwotCi0gICAgdGhpcy5Sb3V0ZXIucmVvcGVuKHsKLSAgICAgIGxvY2F0
aW9uOiAnbm9uZScKLSAgICB9KTsKLQotICAgIC8vIGlmIGFkYXB0ZXIgaXMgbm90IG1hbnVhbGx5
IHNldCBkZWZhdWx0IHRvIFFVbml0Ci0gICAgaWYgKCFFbWJlci5UZXN0LmFkYXB0ZXIpIHsKLSAg
ICAgICBFbWJlci5UZXN0LmFkYXB0ZXIgPSBFbWJlci5UZXN0LlFVbml0QWRhcHRlci5jcmVhdGUo
KTsKLSAgICB9Ci0KLSAgICAgIH0sCi0KLSAgLyoqCi0gICAgVGhpcyB3aWxsIGJlIHVzZWQgYXMg
dGhlIGNvbnRhaW5lciB0byBpbmplY3QgdGhlIHRlc3QgaGVscGVycyBpbnRvLiBCeQotICAgIGRl
ZmF1bHQgdGhlIGhlbHBlcnMgYXJlIGluamVjdGVkIGludG8gYHdpbmRvd2AuCi0KLSAgICBAcHJv
cGVydHkgaGVscGVyQ29udGFpbmVyCi0gICBAdHlwZSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJl
IHVzZWQgZm9yIHRlc3QgaGVscGVycy4KLSAgIEBkZWZhdWx0IHdpbmRvdwotICAqLwotICBoZWxw
ZXJDb250YWluZXI6IHdpbmRvdywKLQotICAvKioKLSAgICBUaGlzIGluamVjdHMgdGhlIHRlc3Qg
aGVscGVycyBpbnRvIHRoZSBgaGVscGVyQ29udGFpbmVyYCBvYmplY3QuIElmIGFuIG9iamVjdCBp
cyBwcm92aWRlZAotICAgIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaGVscGVyQ29udGFpbmVyLiBJ
ZiBgaGVscGVyQ29udGFpbmVyYCBpcyBub3Qgc2V0IGl0IHdpbGwgZGVmYXVsdAotICAgIHRvIGB3
aW5kb3dgLiBJZiBhIGZ1bmN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBk
ZWZpbmVkIGl0IHdpbGwgYmUgY2FjaGVkCi0gICAgKHNvIHRoYXQgaXQgY2FuIGJlIHJlc2V0IGlm
IHRoZSBoZWxwZXIgaXMgcmVtb3ZlZCB3aXRoIGB1bnJlZ2lzdGVySGVscGVyYCBvcgotICAgIGBy
ZW1vdmVUZXN0SGVscGVyc2ApLgotCi0gICBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBg
b25JbmplY3RIZWxwZXJzYCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgaGVscGVycyBoYXZl
IGJlZW4gaW5qZWN0ZWQuCi0KLSAgRXhhbXBsZToKLSAgYGBgCi0gIEFwcC5pbmplY3RUZXN0SGVs
cGVycygpOwotICBgYGAKLQotICAgIEBtZXRob2QgaW5qZWN0VGVzdEhlbHBlcnMKLSAgKi8KLSAg
aW5qZWN0VGVzdEhlbHBlcnM6IGZ1bmN0aW9uKGhlbHBlckNvbnRhaW5lcikgewotICAgIGlmICho
ZWxwZXJDb250YWluZXIpIHsgdGhpcy5oZWxwZXJDb250YWluZXIgPSBoZWxwZXJDb250YWluZXI7
IH0KLQotICAgIHRoaXMudGVzdEhlbHBlcnMgPSB7fTsKLSAgICBmb3IgKHZhciBuYW1lIGluIGhl
bHBlcnMpIHsKLSAgICAgIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVdID0gdGhpcy5oZWxwZXJD
b250YWluZXJbbmFtZV07Ci0gICAgICB0aGlzLnRlc3RIZWxwZXJzW25hbWVdID0gdGhpcy5oZWxw
ZXJDb250YWluZXJbbmFtZV0gPSBoZWxwZXIodGhpcywgbmFtZSk7Ci0gICAgICBwcm90b1dyYXAo
RW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZSwgbmFtZSwgaGVscGVyKHRoaXMsIG5hbWUpLCBo
ZWxwZXJzW25hbWVdLm1ldGEud2FpdCk7Ci0gICAgfQotCi0gICAgZm9yKHZhciBpID0gMCwgbCA9
IGluamVjdEhlbHBlcnNDYWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBpbmpl
Y3RIZWxwZXJzQ2FsbGJhY2tzW2ldKHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBU
aGlzIHJlbW92ZXMgYWxsIGhlbHBlcnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCwgYW5kIHJl
c2V0cyBhbmQgZnVuY3Rpb25zCi0gICAgdGhhdCB3ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBl
cnMuCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5yZW1vdmVU
ZXN0SGVscGVycygpOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2QgcmVtb3Zl
VGVzdEhlbHBlcnMKLSAgKi8KLSAgcmVtb3ZlVGVzdEhlbHBlcnM6IGZ1bmN0aW9uKCkgewotICAg
IGZvciAodmFyIG5hbWUgaW4gaGVscGVycykgewotICAgICAgdGhpcy5oZWxwZXJDb250YWluZXJb
bmFtZV0gPSB0aGlzLm9yaWdpbmFsTWV0aG9kc1tuYW1lXTsKLSAgICAgIGRlbGV0ZSB0aGlzLnRl
c3RIZWxwZXJzW25hbWVdOwotICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVd
OwotICAgIH0KLSAgfQotfSk7Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBuZWVkZWQK
LS8vIEJ1dCBzdGlsbCBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotLy8gb2YgaGVs
cGVyIGNoYWluaW5nCi1mdW5jdGlvbiBwcm90b1dyYXAocHJvdG8sIG5hbWUsIGNhbGxiYWNrLCBp
c0FzeW5jKSB7Ci0gIHByb3RvW25hbWVdID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFyZ3MgPSBh
cmd1bWVudHM7Ci0gICAgaWYgKGlzQXN5bmMpIHsKLSAgICAgIHJldHVybiBjYWxsYmFjay5hcHBs
eSh0aGlzLCBhcmdzKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOwotICAg
ICAgfSk7Ci0gICAgfQotICB9OwotfQotCi1FbWJlci5UZXN0LlByb21pc2UgPSBmdW5jdGlvbigp
IHsKLSAgRW1iZXIuUlNWUC5Qcm9taXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIEVtYmVy
LlRlc3QubGFzdFByb21pc2UgPSB0aGlzOwotfTsKLQotRW1iZXIuVGVzdC5Qcm9taXNlLnByb3Rv
dHlwZSA9IEVtYmVyLmNyZWF0ZShFbWJlci5SU1ZQLlByb21pc2UucHJvdG90eXBlKTsKLUVtYmVy
LlRlc3QuUHJvbWlzZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbWJlci5UZXN0LlByb21pc2U7
Ci0KLS8vIFBhdGNoIGB0aGVuYCB0byBpc29sYXRlIGFzeW5jIG1ldGhvZHMKLS8vIHNwZWNpZmlj
YWxseSBgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAKLXZhciBvcmlnaW5hbFRoZW4gPSBFbWJlci5S
U1ZQLlByb21pc2UucHJvdG90eXBlLnRoZW47Ci1FbWJlci5UZXN0LlByb21pc2UucHJvdG90eXBl
LnRoZW4gPSBmdW5jdGlvbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewotICByZXR1cm4gb3JpZ2lu
YWxUaGVuLmNhbGwodGhpcywgZnVuY3Rpb24odmFsKSB7Ci0gICAgcmV0dXJuIGlzb2xhdGUob25T
dWNjZXNzLCB2YWwpOwotICB9LCBvbkZhaWx1cmUpOwotfTsKLQotLy8gVGhpcyBtZXRob2QgaXNv
bGF0ZXMgbmVzdGVkIGFzeW5jIG1ldGhvZHMKLS8vIHNvIHRoYXQgdGhleSBkb24ndCBjb25mbGlj
dCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCi0vLwotLy8gMS4gU2V0IGBFbWJlci5UZXN0Lmxh
c3RQcm9taXNlYCB0byBudWxsCi0vLyAyLiBJbnZva2UgbWV0aG9kCi0vLyAzLiBSZXR1cm4gdGhl
IGxhc3QgcHJvbWlzZSBjcmVhdGVkIGR1cmluZyBtZXRob2QKLS8vIDQuIFJlc3RvcmUgYEVtYmVy
LlRlc3QubGFzdFByb21pc2VgIHRvIG9yaWdpbmFsIHZhbHVlCi1mdW5jdGlvbiBpc29sYXRlKGZu
LCB2YWwpIHsKLSAgdmFyIHZhbHVlLCBsYXN0UHJvbWlzZTsKLQotICAvLyBSZXNldCBsYXN0UHJv
bWlzZSBmb3IgbmVzdGVkIGhlbHBlcnMKLSAgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7
Ci0KLSAgdmFsdWUgPSBmbi5jYWxsKG51bGwsIHZhbCk7Ci0KLSAgbGFzdFByb21pc2UgPSBFbWJl
ci5UZXN0Lmxhc3RQcm9taXNlOwotCi0gIC8vIElmIHRoZSBtZXRob2QgcmV0dXJuZWQgYSBwcm9t
aXNlCi0gIC8vIHJldHVybiB0aGF0IHByb21pc2UuIElmIG5vdCwKLSAgLy8gcmV0dXJuIHRoZSBs
YXN0IGFzeW5jIGhlbHBlcidzIHByb21pc2UKLSAgaWYgKCh2YWx1ZSAmJiAodmFsdWUgaW5zdGFu
Y2VvZiBFbWJlci5UZXN0LlByb21pc2UpKSB8fCAhbGFzdFByb21pc2UpIHsKLSAgICByZXR1cm4g
dmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgcnVuKGZ1bmN0aW9uKCkgewotICAgICAgbGFzdFByb21p
c2UgPSBFbWJlci5UZXN0LnJlc29sdmUobGFzdFByb21pc2UpLnRoZW4oZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0pOwotICAgIH0pOwotICAgIHJldHVybiBsYXN0
UHJvbWlzZTsKLSAgfQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1iZXIub25M
b2FkKCdFbWJlci5BcHBsaWNhdGlvbicsIGZ1bmN0aW9uKEFwcGxpY2F0aW9uKSB7Ci0gIEFwcGxp
Y2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAnZGVmZXJSZWFkaW5lc3MgaW4gYHRlc3Rp
bmdgIG1vZGUnLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNh
dGlvbil7Ci0gICAgICBpZiAoYXBwbGljYXRpb24udGVzdGluZykgewotICAgICAgICBhcHBsaWNh
dGlvbi5kZWZlclJlYWRpbmVzcygpOwotICAgICAgfQotICAgIH0KLSAgfSk7Ci0KLSAgfSk7Ci0K
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3Vi
bW9kdWxlIGVtYmVyLXRlc3RpbmcKLSAqLwotCi12YXIgJCA9IEVtYmVyLiQ7Ci0KLS8qKgotICBU
aGlzIG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3ggYW5kIHRyaWdnZXJzIHRoZSBjbGljayBldmVu
dCB0byBmaXJlIHRoZQotICBwYXNzZWQgaW4gaGFuZGxlci4gSXQgaXMgdXNlZCB0byBjb3JyZWN0
IGZvciBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucwotICBvZiBqUXVlcnkgKGUuZyAxLjguMykuCi0K
LSAgQHByaXZhdGUKLSAgQG1ldGhvZCB0ZXN0Q2hlY2tib3hDbGljawotKi8KLWZ1bmN0aW9uIHRl
c3RDaGVja2JveENsaWNrKGhhbmRsZXIpIHsKLSAgJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94Ij4n
KQotICAgIC5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgbGVmdDogJy0xMDAwcHgnLCB0b3A6
ICctMTAwMHB4JyB9KQotICAgIC5hcHBlbmRUbygnYm9keScpCi0gICAgLm9uKCdjbGljaycsIGhh
bmRsZXIpCi0gICAgLnRyaWdnZXIoJ2NsaWNrJykKLSAgICAucmVtb3ZlKCk7Ci19Ci0KLSQoZnVu
Y3Rpb24oKSB7Ci0gIC8qCi0gICAgRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGVja2JveCBjaGVja2Vk
IHVzaW5nIGpRdWVyeSdzICJjbGljayIgbWV0aG9kIHdpbGwgaGF2ZQotICAgIHRoZSBjb3JyZWN0
IHZhbHVlIGZvciBpdHMgY2hlY2tlZCBwcm9wZXJ0eS4KLQotICAgIElmIHdlIGRldGVybWluZSB0
aGF0IHRoZSBjdXJyZW50IGpRdWVyeSB2ZXJzaW9uIGV4aGliaXRzIHRoaXMgYmVoYXZpb3IsCi0g
ICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkgYXMgaW4gdGhlIGNvbW1pdCBmb3IgdGhlIGFj
dHVhbCBmaXg6Ci0gICAgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvY29tbWl0LzFm
YjJmOTIuCi0gICovCi0gIHRlc3RDaGVja2JveENsaWNrKGZ1bmN0aW9uKCkgewotICAgIGlmICgh
dGhpcy5jaGVja2VkICYmICEkLmV2ZW50LnNwZWNpYWwuY2xpY2spIHsKLSAgICAgICQuZXZlbnQu
c3BlY2lhbC5jbGljayA9IHsKLSAgICAgICAgLy8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBl
dmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKLSAgICAgICAgdHJpZ2dlcjogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgaWYgKCQubm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSAmJiB0
aGlzLnR5cGUgPT09ICJjaGVja2JveCIgJiYgdGhpcy5jbGljaykgewotICAgICAgICAgICAgdGhp
cy5jbGljaygpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgfTsKLSAgICB9Ci0gIH0pOwotCi0gIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkg
dGhhdCB0aGUgcGF0Y2ggdG9vayBlZmZlY3Qgb3IgYmxvdyB1cC4KLSAgdGVzdENoZWNrYm94Q2xp
Y2soZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIud2FybigiY2xpY2tlZCBjaGVja2JveGVzIHNob3Vs
ZCBiZSBjaGVja2VkISB0aGUgalF1ZXJ5IHBhdGNoIGRpZG4ndCB3b3JrIiwgdGhpcy5jaGVja2Vk
KTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotIEBtb2R1
bGUgZW1iZXIKLSBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKLSovCi0KLXZhciBUZXN0ID0gRW1i
ZXIuVGVzdDsKLQotLyoqCi0gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0
byBjcmVhdGUgaG9va3MgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQKLSAgYnkgYW4gYWRhcHRlciBm
b3IgdmFyaW91cyB0ZXN0IGZyYW1ld29ya3MuCi0KLSAgQGNsYXNzIEFkYXB0ZXIKLSAgQG5hbWVz
cGFjZSBFbWJlci5UZXN0Ci0qLwotVGVzdC5BZGFwdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7
Ci0gIC8qKgotICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5
bmMgb3BlcmF0aW9uIGlzIGFib3V0IHRvIHN0YXJ0LgotCi0gICAgT3ZlcnJpZGUgdGhpcyB0byBj
YWxsIHlvdXIgZnJhbWV3b3JrJ3MgbWV0aG9kcyB0aGF0IGhhbmRsZSBhc3luYwotICAgIG9wZXJh
dGlvbnMuCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCBhc3luY1N0YXJ0Ci0gICovCi0gIGFz
eW5jU3RhcnQ6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNh
bGxlZCB3aGVuZXZlciBhbiBhc3luYyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KLQotICAgIEBw
dWJsaWMKLSAgICBAbWV0aG9kIGFzeW5jRW5kCi0gICovCi0gIGFzeW5jRW5kOiBFbWJlci5LLAot
Ci0gIC8qKgotICAgIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1l
d29yaydzIGZhbHNlIGFzc2VydGlvbi4KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVu
ZXZlciBhbiBleGNlcHRpb24gb2NjdXJzIGNhdXNpbmcgdGhlIHRlc3RpbmcKLSAgICBwcm9taXNl
IHRvIGZhaWwuCi0KLSAgICBRVW5pdCBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
ICAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikgewotICAgICAgICBvayhmYWxzZSwgZXJyb3Ip
OwotICAgICAgfTsKLSAgICBgYGAKLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIGV4Y2VwdGlv
bgotICAgIEBwYXJhbSB7U3RyaW5nfSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4K
LSAgKi8KLSAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikgewotICAgIHRocm93IGVycm9yOwot
ICB9Ci19KTsKLQotLyoqCi0gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBkZWZp
bmVkIGJ5IEVtYmVyLlRlc3QuQWRhcHRlciBmb3IgdGhlCi0gIFFVbml0IHRlc3RpbmcgZnJhbWV3
b3JrLgotCi0gIEBjbGFzcyBRVW5pdEFkYXB0ZXIKLSAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Ci0g
IEBleHRlbmRzIEVtYmVyLlRlc3QuQWRhcHRlcgotKi8KLVRlc3QuUVVuaXRBZGFwdGVyID0gVGVz
dC5BZGFwdGVyLmV4dGVuZCh7Ci0gIGFzeW5jU3RhcnQ6IGZ1bmN0aW9uKCkgewotICAgIHN0b3Ao
KTsKLSAgfSwKLSAgYXN5bmNFbmQ6IGZ1bmN0aW9uKCkgewotICAgIHN0YXJ0KCk7Ci0gIH0sCi0g
IGV4Y2VwdGlvbjogZnVuY3Rpb24oZXJyb3IpIHsKLSAgICBvayhmYWxzZSwgRW1iZXIuaW5zcGVj
dChlcnJvcikpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
KiBAbW9kdWxlIGVtYmVyCi0qIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwKLSAgICBUZXN0ID0gRW1iZXIuVGVzdCwKLSAgICBoZWxwZXIgPSBUZXN0
LnJlZ2lzdGVySGVscGVyLAotICAgIGFzeW5jSGVscGVyID0gVGVzdC5yZWdpc3RlckFzeW5jSGVs
cGVyLAotICAgIGNvdW50QXN5bmMgPSAwOwotCi1UZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSAw
OwotCi1UZXN0Lm9uSW5qZWN0SGVscGVycyhmdW5jdGlvbigpIHsKLSAgRW1iZXIuJChkb2N1bWVu
dCkuYWpheFN0YXJ0KGZ1bmN0aW9uKCkgewotICAgIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cysr
OwotICB9KTsKLQotICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RvcChmdW5jdGlvbigpIHsKLSAg
ICBFbWJlci5hc3NlcnQoIkFuIGFqYXhTdG9wIGV2ZW50IHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBu
dW1iZXIgb2YgcGVuZGluZyBBSkFYICIgKwotICAgICAgICAgICAgICAgICAicmVxdWVzdHMgdG8g
YmUgbmVnYXRpdmUgaGFzIGJlZW4gdHJpZ2dlcmVkLiBUaGlzIGlzIG1vc3QgbGlrZWx5ICIgKwot
ICAgICAgICAgICAgICAgICAiY2F1c2VkIGJ5IEFKQVggZXZlbnRzIHRoYXQgd2VyZSBzdGFydGVk
IGJlZm9yZSBjYWxsaW5nICIgKwotICAgICAgICAgICAgICAgICAiYGluamVjdFRlc3RIZWxwZXJz
KClgLiIsIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cyAhPT0gMCk7Ci0gICAgVGVzdC5wZW5kaW5n
QWpheFJlcXVlc3RzLS07Ci0gIH0pOwotfSk7Ci0KLWZ1bmN0aW9uIGN1cnJlbnRSb3V0ZU5hbWUo
YXBwKXsKLSAgdmFyIGFwcENvbnRyb2xsZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ2Nv
bnRyb2xsZXI6YXBwbGljYXRpb24nKTsKLQotICByZXR1cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdj
dXJyZW50Um91dGVOYW1lJyk7Ci19Ci0KLWZ1bmN0aW9uIGN1cnJlbnRQYXRoKGFwcCl7Ci0gIHZh
ciBhcHBDb250cm9sbGVyID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdjb250cm9sbGVyOmFw
cGxpY2F0aW9uJyk7Ci0KLSAgcmV0dXJuIGdldChhcHBDb250cm9sbGVyLCAnY3VycmVudFBhdGgn
KTsKLX0KLQotZnVuY3Rpb24gY3VycmVudFVSTChhcHApewotICB2YXIgcm91dGVyID0gYXBwLl9f
Y29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotCi0gIHJldHVybiBnZXQocm91dGVy
LCAnbG9jYXRpb24nKS5nZXRVUkwoKTsKLX0KLQotZnVuY3Rpb24gdmlzaXQoYXBwLCB1cmwpIHsK
LSAgRW1iZXIucnVuKGFwcCwgJ2FkdmFuY2VSZWFkaW5lc3MnKTsKLQotICBhcHAuX19jb250YWlu
ZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJykubG9jYXRpb24uc2V0VVJMKHVybCk7Ci0gIEVtYmVy
LnJ1bihhcHAsIGFwcC5oYW5kbGVVUkwsIHVybCk7Ci0gIHJldHVybiB3YWl0KGFwcCk7Ci19Ci0K
LWZ1bmN0aW9uIGNsaWNrKGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpIHsKLSAgdmFyICRlbCA9IGZp
bmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpOwotICBFbWJlci5ydW4oJGVsLCAn
bW91c2Vkb3duJyk7Ci0KLSAgaWYgKCRlbC5pcygnOmlucHV0JykpIHsKLSAgICB2YXIgdHlwZSA9
ICRlbC5wcm9wKCd0eXBlJyk7Ci0gICAgaWYgKHR5cGUgIT09ICdjaGVja2JveCcgJiYgdHlwZSAh
PT0gJ3JhZGlvJyAmJiB0eXBlICE9PSAnaGlkZGVuJykgewotICAgICAgRW1iZXIucnVuKCRlbCwg
ZnVuY3Rpb24oKXsKLSAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBgZm9j
dXNpbmAgZXZlbnQgaWYgdGhlIHdpbmRvdwotICAgICAgICAvLyBkb2VzIG5vdCBoYXZlIGZvY3Vz
LiBJZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBoYXZlIGZvY3VzIGp1c3QKLSAgICAgICAgLy8gdXNl
IHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgotICAgICAgICBpZiAoIWRvY3VtZW50Lmhhc0Zv
Y3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICB0aGlzLmZvY3VzKCk7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhpcy50cmlnZ2VyKCdmb2N1c2luJyk7Ci0gICAg
ICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIEVtYmVyLnJ1bigkZWwsICdtb3VzZXVw
Jyk7Ci0gIEVtYmVyLnJ1bigkZWwsICdjbGljaycpOwotCi0gIHJldHVybiB3YWl0KGFwcCk7Ci19
Ci0KLWZ1bmN0aW9uIHRyaWdnZXJFdmVudChhcHAsIHNlbGVjdG9yLCBjb250ZXh0LCBldmVudCl7
Ci0gIGlmICh0eXBlb2YgbWV0aG9kID09PSAndW5kZWZpbmVkJykgewotICAgIGV2ZW50ID0gY29u
dGV4dDsKLSAgICBjb250ZXh0ID0gbnVsbDsKLSAgfQotCi0gIHZhciAkZWwgPSBmaW5kV2l0aEFz
c2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLQotICBFbWJlci5ydW4oJGVsLCAndHJpZ2dl
cicsIGV2ZW50KTsKLQotICByZXR1cm4gd2FpdChhcHApOwotfQotCi1mdW5jdGlvbiBrZXlFdmVu
dChhcHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0eXBlLCBrZXlDb2RlKSB7Ci0gIHZhciAkZWw7Ci0g
IGlmICh0eXBlb2Yga2V5Q29kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKLSAgICBrZXlDb2RlID0gdHlw
ZTsKLSAgICB0eXBlID0gY29udGV4dDsKLSAgICBjb250ZXh0ID0gbnVsbDsKLSAgfQotICAkZWwg
PSBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLSAgdmFyIGV2ZW50ID0g
RW1iZXIuJC5FdmVudCh0eXBlLCB7IGtleUNvZGU6IGtleUNvZGUgfSk7Ci0gIEVtYmVyLnJ1bigk
ZWwsICd0cmlnZ2VyJywgZXZlbnQpOwotICByZXR1cm4gd2FpdChhcHApOwotfQotCi1mdW5jdGlv
biBmaWxsSW4oYXBwLCBzZWxlY3RvciwgY29udGV4dCwgdGV4dCkgewotICB2YXIgJGVsOwotICBp
ZiAodHlwZW9mIHRleHQgPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgdGV4dCA9IGNvbnRleHQ7Ci0g
ICAgY29udGV4dCA9IG51bGw7Ci0gIH0KLSAgJGVsID0gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxl
Y3RvciwgY29udGV4dCk7Ci0gIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKLSAgICAkZWwudmFsKHRl
eHQpLmNoYW5nZSgpOwotICB9KTsKLSAgcmV0dXJuIHdhaXQoYXBwKTsKLX0KLQotZnVuY3Rpb24g
ZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3RvciwgY29udGV4dCkgewotICB2YXIgJGVsID0gZmlu
ZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLSAgaWYgKCRlbC5sZW5ndGggPT09IDApIHsKLSAg
ICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVsZW1lbnQgIiArIHNlbGVjdG9yICsgIiBub3QgZm91
bmQuIik7Ci0gIH0KLSAgcmV0dXJuICRlbDsKLX0KLQotZnVuY3Rpb24gZmluZChhcHAsIHNlbGVj
dG9yLCBjb250ZXh0KSB7Ci0gIHZhciAkZWw7Ci0gIGNvbnRleHQgPSBjb250ZXh0IHx8IGdldChh
cHAsICdyb290RWxlbWVudCcpOwotICAkZWwgPSBhcHAuJChzZWxlY3RvciwgY29udGV4dCk7Ci0K
LSAgcmV0dXJuICRlbDsKLX0KLQotZnVuY3Rpb24gYW5kVGhlbihhcHAsIGNhbGxiYWNrKSB7Ci0g
IHJldHVybiB3YWl0KGFwcCwgY2FsbGJhY2soYXBwKSk7Ci19Ci0KLWZ1bmN0aW9uIHdhaXQoYXBw
LCB2YWx1ZSkgewotICByZXR1cm4gVGVzdC5wcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKLSAg
ICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhc3luYyBwcm9taXNlLCBraWNrIG9mZiB0aGUgYXN5
bmMgdGVzdAotICAgIGlmICgrK2NvdW50QXN5bmMgPT09IDEpIHsKLSAgICAgIFRlc3QuYWRhcHRl
ci5hc3luY1N0YXJ0KCk7Ci0gICAgfQotCi0gICAgLy8gRXZlcnkgMTBtcywgcG9sbCBmb3IgdGhl
IGFzeW5jIHRoaW5nIHRvIGhhdmUgZmluaXNoZWQKLSAgICB2YXIgd2F0Y2hlciA9IHNldEludGVy
dmFsKGZ1bmN0aW9uKCkgewotICAgICAgLy8gMS4gSWYgdGhlIHJvdXRlciBpcyBsb2FkaW5nLCBr
ZWVwIHBvbGxpbmcKLSAgICAgIHZhciByb3V0ZXJJc0xvYWRpbmcgPSBhcHAuX19jb250YWluZXJf
Xy5sb29rdXAoJ3JvdXRlcjptYWluJykucm91dGVyLmlzTG9hZGluZzsKLSAgICAgIGlmIChyb3V0
ZXJJc0xvYWRpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIC8vIDIuIElmIHRoZXJlIGFyZSBwZW5k
aW5nIEFqYXggcmVxdWVzdHMsIGtlZXAgcG9sbGluZwotICAgICAgaWYgKFRlc3QucGVuZGluZ0Fq
YXhSZXF1ZXN0cykgeyByZXR1cm47IH0KLQotICAgICAgLy8gMy4gSWYgdGhlcmUgYXJlIHNjaGVk
dWxlZCB0aW1lcnMgb3Igd2UgYXJlIGluc2lkZSBvZiBhIHJ1biBsb29wLCBrZWVwIHBvbGxpbmcK
LSAgICAgIGlmIChFbWJlci5ydW4uaGFzU2NoZWR1bGVkVGltZXJzKCkgfHwgRW1iZXIucnVuLmN1
cnJlbnRSdW5Mb29wKSB7IHJldHVybjsgfQotICAgICAgaWYgKFRlc3Qud2FpdGVycyAmJiBUZXN0
LndhaXRlcnMuYW55KGZ1bmN0aW9uKHdhaXRlcikgewotICAgICAgICB2YXIgY29udGV4dCA9IHdh
aXRlclswXTsKLSAgICAgICAgdmFyIGNhbGxiYWNrID0gd2FpdGVyWzFdOwotICAgICAgICByZXR1
cm4gIWNhbGxiYWNrLmNhbGwoY29udGV4dCk7Ci0gICAgICB9KSkgeyByZXR1cm47IH0KLSAgICAg
IC8vIFN0b3AgcG9sbGluZwotICAgICAgY2xlYXJJbnRlcnZhbCh3YXRjaGVyKTsKLQotICAgICAg
Ly8gSWYgdGhpcyBpcyB0aGUgbGFzdCBhc3luYyBwcm9taXNlLCBlbmQgdGhlIGFzeW5jIHRlc3QK
LSAgICAgIGlmICgtLWNvdW50QXN5bmMgPT09IDApIHsKLSAgICAgICAgVGVzdC5hZGFwdGVyLmFz
eW5jRW5kKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN5bmNocm9ub3VzbHkgcmVzb2x2ZSB0aGUg
cHJvbWlzZQotICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIHZhbHVlKTsKLSAgICB9LCAx
MCk7Ci0gIH0pOwotCi19Ci0KLQotLyoqCi0qIExvYWRzIGEgcm91dGUsIHNldHMgdXAgYW55IGNv
bnRyb2xsZXJzLCBhbmQgcmVuZGVycyBhbnkgdGVtcGxhdGVzIGFzc29jaWF0ZWQKLSogd2l0aCB0
aGUgcm91dGUgYXMgdGhvdWdoIGEgcmVhbCB1c2VyIGhhZCB0cmlnZ2VyZWQgdGhlIHJvdXRlIGNo
YW5nZSB3aGlsZQotKiB1c2luZyB5b3VyIGFwcC4KLSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2
YXNjcmlwdAotKiB2aXNpdCgncG9zdHMvaW5kZXgnKS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8v
IGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIHZpc2l0Ci0qIEBw
YXJhbSB7U3RyaW5nfSB1cmwgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0qIEByZXR1cm4ge1JTVlAu
UHJvbWlzZX0KLSovCi1hc3luY0hlbHBlcigndmlzaXQnLCB2aXNpdCk7Ci0KLS8qKgotKiBDbGlj
a3MgYW4gZWxlbWVudCBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgdHJpZ2dlcmVkIGJ5IHRoZSBl
bGVtZW50J3MgYGNsaWNrYAotKiBldmVudC4KLSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2YXNj
cmlwdAotKiBjbGljaygnLnNvbWUtalF1ZXJ5LXNlbGVjdG9yJykudGhlbihmdW5jdGlvbigpIHsK
LSogIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGNsaWNr
Ci0qIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcg
ZWxlbWVudCBvbiB0aGUgRE9NCi0qIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hl
bHBlcignY2xpY2snLCBjbGljayk7Ci0KLS8qKgotKiBTaW11bGF0ZXMgYSBrZXkgZXZlbnQsIGUu
Zy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBga2V5dXBgIHdpdGggdGhlIGRlc2lyZWQga2V5Q29k
ZQotKgotKiBFeGFtcGxlOgotKgotKiBgYGBqYXZhc2NyaXB0Ci0qIGtleUV2ZW50KCcuc29tZS1q
UXVlcnktc2VsZWN0b3InLCAna2V5cHJlc3MnLCAxMykudGhlbihmdW5jdGlvbigpIHsKLSogIC8v
IGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGtleUV2ZW50Ci0q
IEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxl
bWVudCBvbiB0aGUgRE9NCi0qIEBwYXJhbSB7U3RyaW5nfSB0aGUgdHlwZSBvZiBrZXkgZXZlbnQs
IGUuZy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBga2V5dXBgCi0qIEBwYXJhbSB7TnVtYmVyfSB0
aGUga2V5Q29kZSBvZiB0aGUgc2ltdWxhdGVkIGtleSBldmVudAotKiBAcmV0dXJuIHtSU1ZQLlBy
b21pc2V9Ci0qLwotYXN5bmNIZWxwZXIoJ2tleUV2ZW50Jywga2V5RXZlbnQpOwotCi0vKioKLSog
RmlsbHMgaW4gYW4gaW5wdXQgZWxlbWVudCB3aXRoIHNvbWUgdGV4dC4KLSoKLSogRXhhbXBsZToK
LSoKLSogYGBgamF2YXNjcmlwdAotKiBmaWxsSW4oJyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20n
KS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBg
YAotKgotKiBAbWV0aG9kIGZpbGxJbgotKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5
IHNlbGVjdG9yIGZpbmRpbmcgYW4gaW5wdXQgZWxlbWVudCBvbiB0aGUgRE9NCi0qIHRvIGZpbGwg
dGV4dCB3aXRoCi0qIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRo
ZSBpbnB1dCBlbGVtZW50Ci0qIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hlbHBl
cignZmlsbEluJywgZmlsbEluKTsKLQotLyoqCi0qIEZpbmRzIGFuIGVsZW1lbnQgaW4gdGhlIGNv
bnRleHQgb2YgdGhlIGFwcCdzIGNvbnRhaW5lciBlbGVtZW50LiBBIHNpbXBsZSBhbGlhcwotKiBm
b3IgYGFwcC4kKHNlbGVjdG9yKWAuCi0qCi0qIEV4YW1wbGU6Ci0qCi0qIGBgYGphdmFzY3JpcHQK
LSogdmFyICRlbCA9IGZpbmQoJy5teS1zZWxlY3Rvcik7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGZp
bmQKLSogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzdHJpbmcgc2VsZWN0b3IgZm9y
IGVsZW1lbnQgbG9va3VwCi0qIEByZXR1cm4ge09iamVjdH0galF1ZXJ5IG9iamVjdCByZXByZXNl
bnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0qLwotaGVscGVyKCdmaW5kJywgZmluZCk7
Ci0KLS8qKgotKiBMaWtlIGBmaW5kYCwgYnV0IHRocm93cyBhbiBlcnJvciBpZiB0aGUgZWxlbWVu
dCBzZWxlY3RvciByZXR1cm5zIG5vIHJlc3VsdHMuCi0qCi0qIEV4YW1wbGU6Ci0qCi0qIGBgYGph
dmFzY3JpcHQKLSogdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KCcuZG9lc250LWV4aXN0Jyk7IC8v
IHRocm93cyBlcnJvcgotKiBgYGAKLSoKLSogQG1ldGhvZCBmaW5kV2l0aEFzc2VydAotKiBAcGFy
YW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5IHNlbGVjdG9yIHN0cmluZyBmb3IgZmluZGluZyBh
biBlbGVtZW50IHdpdGhpbgotKiB0aGUgRE9NCi0qIEByZXR1cm4ge09iamVjdH0galF1ZXJ5IG9i
amVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0qIEB0aHJvd3Mge0Vy
cm9yfSB0aHJvd3MgZXJyb3IgaWYgalF1ZXJ5IG9iamVjdCByZXR1cm5lZCBoYXMgYSBsZW5ndGgg
b2YgMAotKi8KLWhlbHBlcignZmluZFdpdGhBc3NlcnQnLCBmaW5kV2l0aEFzc2VydCk7Ci0KLS8q
KgotICBDYXVzZXMgdGhlIHJ1biBsb29wIHRvIHByb2Nlc3MgYW55IHBlbmRpbmcgZXZlbnRzLiBU
aGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLSAgYW55IGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBv
dGhlciBoZWxwZXJzIChvciB5b3VyIGFzc2VydGlvbnMpIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0K
LSAgVGhpcyBpcyBtb3N0IG9mdGVuIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGhl
bHBlciBmdW5jdGlvbnMgKHNlZSAnY2xpY2snLAotICAnZmlsbEluJywndmlzaXQnLGV0YykuCi0K
LSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLlRlc3QucmVnaXN0ZXJBc3lu
Y0hlbHBlcignbG9naW5Vc2VyJywgZnVuY3Rpb24oYXBwLCB1c2VybmFtZSwgcGFzc3dvcmQpIHsK
LSAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUnKQotICAgIC5maWxsSW4oJyN1c2VybmFtZScs
IHVzZXJuYW1lKQotICAgIC5maWxsSW4oJyNwYXNzd29yZCcsIHVzZXJuYW1lKQotICAgIC5jbGlj
aygnLnN1Ym1pdCcpCi0KLSAgICByZXR1cm4gd2FpdCgpOwotICB9KTsKLQotICBAbWV0aG9kIHdh
aXQKLSAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KLSAg
QHJldHVybiB7UlNWUC5Qcm9taXNlfQotKi8KLWFzeW5jSGVscGVyKCd3YWl0Jywgd2FpdCk7Ci1h
c3luY0hlbHBlcignYW5kVGhlbicsIGFuZFRoZW4pOwotCi0KLQotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEVtYmVyIFRlc3RpbmcKLQotICBAbW9kdWxlIGVtYmVyCi0gIEBz
dWJtb2R1bGUgZW1iZXItdGVzdGluZwotICBAcmVxdWlyZXMgZW1iZXItYXBwbGljYXRpb24KLSov
Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotRW1iZXIKLQotQG1vZHVsZSBlbWJlcgot
Ki8KLQotZnVuY3Rpb24gdGhyb3dXaXRoTWVzc2FnZShtc2cpIHsKLSAgcmV0dXJuIGZ1bmN0aW9u
KCkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihtc2cpOwotICB9OwotfQotCi1mdW5jdGlv
biBnZW5lcmF0ZVJlbW92ZWRDbGFzcyhjbGFzc05hbWUpIHsKLSAgdmFyIG1zZyA9ICIgaGFzIGJl
ZW4gbW92ZWQgaW50byBhIHBsdWdpbjogaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvZW1iZXIt
c3RhdGVzIjsKLQotICByZXR1cm4gewotICAgIGV4dGVuZDogdGhyb3dXaXRoTWVzc2FnZShjbGFz
c05hbWUgKyBtc2cpLAotICAgIGNyZWF0ZTogdGhyb3dXaXRoTWVzc2FnZShjbGFzc05hbWUgKyBt
c2cpCi0gIH07Ci19Ci0KLUVtYmVyLlN0YXRlTWFuYWdlciA9IGdlbmVyYXRlUmVtb3ZlZENsYXNz
KCJFbWJlci5TdGF0ZU1hbmFnZXIiKTsKLQotLyoqCi0gIFRoaXMgd2FzIGV4cG9ydGVkIHRvIGVt
YmVyLXN0YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAgcmVsZWFzZS4gU2VlOiBodHRwczovL2dpdGh1
Yi5jb20vZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAgCi0gIEBjbGFzcyBTdGF0ZU1hbmFnZXIKLSAg
QG5hbWVzcGFjZSBFbWJlcgotKi8KLQotRW1iZXIuU3RhdGUgPSBnZW5lcmF0ZVJlbW92ZWRDbGFz
cygiRW1iZXIuU3RhdGUiKTsKLQotLyoqCi0gIFRoaXMgd2FzIGV4cG9ydGVkIHRvIGVtYmVyLXN0
YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAgcmVsZWFzZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20v
ZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAgCi0gIEBjbGFzcyBTdGF0ZQotICBAbmFtZXNwYWNlIEVt
YmVyCi0qLwotCi19KSgpOwotCi0KLX0pKCk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcwpkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMjUxMDMzYjRjZGYzNTMwYjM4ZTdjZjhkZDg4
OTEwNzRkMjIzNi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGVi
YXJzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjc0NiArMCwwIEBACi0vKiEKLQotIGhhbmRsZWJh
cnMgdjEuMy4wCi0KLUNvcHlyaWdodCAoQykgMjAxMSBieSBZZWh1ZGEgS2F0egotCi1QZXJtaXNz
aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh
aW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRp
b24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhv
dXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwot
dG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNl
bnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw
ZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl
Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5v
dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxs
IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBT
T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E
LCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9S
UyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBP
UiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S
VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ
VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLVRIRSBTT0ZU
V0FSRS4KLQotQGxpY2Vuc2UKLSovCi0vKiBleHBvcnRlZCBIYW5kbGViYXJzICovCi12YXIgSGFu
ZGxlYmFycyA9IChmdW5jdGlvbigpIHsKLS8vIGhhbmRsZWJhcnMvc2FmZS1zdHJpbmcuanMKLXZh
ciBfX21vZHVsZTRfXyA9IChmdW5jdGlvbigpIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19l
eHBvcnRzX187Ci0gIC8vIEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlCi0gIGZ1
bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7Ci0gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0g
IH0KLQotICBTYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICAg
IHJldHVybiAiIiArIHRoaXMuc3RyaW5nOwotICB9OwotCi0gIF9fZXhwb3J0c19fID0gU2FmZVN0
cmluZzsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoKTsKLQotLy8gaGFuZGxlYmFycy91dGls
cy5qcwotdmFyIF9fbW9kdWxlM19fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAi
dXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNfXyA9IHt9OwotICAvKmpzaGludCAtVzAwNCAq
LwotICB2YXIgU2FmZVN0cmluZyA9IF9fZGVwZW5kZW5jeTFfXzsKLQotICB2YXIgZXNjYXBlID0g
ewotICAgICImIjogIiZhbXA7IiwKLSAgICAiPCI6ICImbHQ7IiwKLSAgICAiPiI6ICImZ3Q7IiwK
LSAgICAnIic6ICImcXVvdDsiLAotICAgICInIjogIiYjeDI3OyIsCi0gICAgImAiOiAiJiN4NjA7
IgotICB9OwotCi0gIHZhciBiYWRDaGFycyA9IC9bJjw+IidgXS9nOwotICB2YXIgcG9zc2libGUg
PSAvWyY8PiInYF0vOwotCi0gIGZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7Ci0gICAgcmV0dXJu
IGVzY2FwZVtjaHJdIHx8ICImYW1wOyI7Ci0gIH0KLQotICBmdW5jdGlvbiBleHRlbmQob2JqLCB2
YWx1ZSkgewotICAgIGZvcih2YXIga2V5IGluIHZhbHVlKSB7Ci0gICAgICBpZihPYmplY3QucHJv
dG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHsKLSAgICAgICAgb2JqW2tl
eV0gPSB2YWx1ZVtrZXldOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIF9fZXhwb3J0c19fLmV4
dGVuZCA9IGV4dGVuZDt2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwot
ICBfX2V4cG9ydHNfXy50b1N0cmluZyA9IHRvU3RyaW5nOwotICAvLyBTb3VyY2VkIGZyb20gbG9k
YXNoCi0gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9sb2Rhc2gvYmxvYi9tYXN0ZXIv
TElDRU5TRS50eHQKLSAgdmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJl
dHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7Ci0gIH07Ci0gIC8vIGZhbGxiYWNrIGZv
ciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaQotICBpZiAoaXNGdW5jdGlvbigv
eC8pKSB7Ci0gICAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICByZXR1cm4g
dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAn
W29iamVjdCBGdW5jdGlvbl0nOwotICAgIH07Ci0gIH0KLSAgdmFyIGlzRnVuY3Rpb247Ci0gIF9f
ZXhwb3J0c19fLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uOwotICB2YXIgaXNBcnJheSA9IEFycmF5
LmlzQXJyYXkgfHwgZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVv
ZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0
IEFycmF5XScgOiBmYWxzZTsKLSAgfTsKLSAgX19leHBvcnRzX18uaXNBcnJheSA9IGlzQXJyYXk7
Ci0KLSAgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKLSAgICAvLyBkb24ndCBl
c2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBzYWZlCi0gICAgaWYgKHN0
cmluZyBpbnN0YW5jZW9mIFNhZmVTdHJpbmcpIHsKLSAgICAgIHJldHVybiBzdHJpbmcudG9TdHJp
bmcoKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJpbmcgJiYgc3RyaW5nICE9PSAwKSB7Ci0gICAgICBy
ZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0
aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kCi0gICAgLy8gdGhl
IHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMs
IGNhdXNpbmcgaXNzdWVzIGlmCi0gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2Nh
cGVkIGNoYXJhY3RlcnMgaW4gaXQuCi0gICAgc3RyaW5nID0gIiIgKyBzdHJpbmc7Ci0KLSAgICBp
ZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH0KLSAgICByZXR1cm4g
c3RyaW5nLnJlcGxhY2UoYmFkQ2hhcnMsIGVzY2FwZUNoYXIpOwotICB9Ci0KLSAgX19leHBvcnRz
X18uZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJlc3Npb247ZnVuY3Rpb24gaXNFbXB0eSh2
YWx1ZSkgewotICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHsKLSAgICAgIHJldHVybiB0
cnVlOwotICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAw
KSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgfQotCi0gIF9fZXhwb3J0c19fLmlzRW1wdHkgPSBpc0VtcHR5OwotICByZXR1
cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTRfXyk7Ci0KLS8vIGhhbmRsZWJhcnMvZXhjZXB0
aW9uLmpzCi12YXIgX19tb2R1bGU1X18gPSAoZnVuY3Rpb24oKSB7Ci0gICJ1c2Ugc3RyaWN0IjsK
LSAgdmFyIF9fZXhwb3J0c19fOwotCi0gIHZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbics
ICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAn
c3RhY2snXTsKLQotICBmdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkgewotICAgIHZh
ciBsaW5lOwotICAgIGlmIChub2RlICYmIG5vZGUuZmlyc3RMaW5lKSB7Ci0gICAgICBsaW5lID0g
bm9kZS5maXJzdExpbmU7Ci0KLSAgICAgIG1lc3NhZ2UgKz0gJyAtICcgKyBsaW5lICsgJzonICsg
bm9kZS5maXJzdENvbHVtbjsKLSAgICB9Ci0KLSAgICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBl
LmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7Ci0KLSAgICAvLyBVbmZvcnR1bmF0ZWx5
IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3Ig
cHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay4KLSAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBl
cnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsKLSAgICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9
IHRtcFtlcnJvclByb3BzW2lkeF1dOwotICAgIH0KLQotICAgIGlmIChsaW5lKSB7Ci0gICAgICB0
aGlzLmxpbmVOdW1iZXIgPSBsaW5lOwotICAgICAgdGhpcy5jb2x1bW4gPSBub2RlLmZpcnN0Q29s
dW1uOwotICAgIH0KLSAgfQotCi0gIEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsK
LQotICBfX2V4cG9ydHNfXyA9IEV4Y2VwdGlvbjsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSko
KTsKLQotLy8gaGFuZGxlYmFycy9iYXNlLmpzCi12YXIgX19tb2R1bGUyX18gPSAoZnVuY3Rpb24o
X19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2
YXIgX19leHBvcnRzX18gPSB7fTsKLSAgdmFyIFV0aWxzID0gX19kZXBlbmRlbmN5MV9fOwotICB2
YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5Ml9fOwotCi0gIHZhciBWRVJTSU9OID0gIjEuMy4w
IjsKLSAgX19leHBvcnRzX18uVkVSU0lPTiA9IFZFUlNJT047dmFyIENPTVBJTEVSX1JFVklTSU9O
ID0gNDsKLSAgX19leHBvcnRzX18uQ09NUElMRVJfUkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lP
TjsKLSAgdmFyIFJFVklTSU9OX0NIQU5HRVMgPSB7Ci0gICAgMTogJzw9IDEuMC5yYy4yJywgLy8g
MS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKLSAgICAyOiAn
PT0gMS4wLjAtcmMuMycsCi0gICAgMzogJz09IDEuMC4wLXJjLjQnLAotICAgIDQ6ICc+PSAxLjAu
MCcKLSAgfTsKLSAgX19leHBvcnRzX18uUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5H
RVM7Ci0gIHZhciBpc0FycmF5ID0gVXRpbHMuaXNBcnJheSwKLSAgICAgIGlzRnVuY3Rpb24gPSBV
dGlscy5pc0Z1bmN0aW9uLAotICAgICAgdG9TdHJpbmcgPSBVdGlscy50b1N0cmluZywKLSAgICAg
IG9iamVjdFR5cGUgPSAnW29iamVjdCBPYmplY3RdJzsKLQotICBmdW5jdGlvbiBIYW5kbGViYXJz
RW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMpIHsKLSAgICB0aGlzLmhlbHBlcnMgPSBoZWxw
ZXJzIHx8IHt9OwotICAgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKLQotICAgIHJl
Z2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5IYW5kbGVi
YXJzRW52aXJvbm1lbnQgPSBIYW5kbGViYXJzRW52aXJvbm1lbnQ7SGFuZGxlYmFyc0Vudmlyb25t
ZW50LnByb3RvdHlwZSA9IHsKLSAgICBjb25zdHJ1Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50
LAotCi0gICAgbG9nZ2VyOiBsb2dnZXIsCi0gICAgbG9nOiBsb2csCi0KLSAgICByZWdpc3Rlckhl
bHBlcjogZnVuY3Rpb24obmFtZSwgZm4sIGludmVyc2UpIHsKLSAgICAgIGlmICh0b1N0cmluZy5j
YWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7Ci0gICAgICAgIGlmIChpbnZlcnNlIHx8IGZuKSB7
IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVs
cGVycycpOyB9Ci0gICAgICAgIFV0aWxzLmV4dGVuZCh0aGlzLmhlbHBlcnMsIG5hbWUpOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGludmVyc2UpIHsgZm4ubm90ID0gaW52ZXJzZTsgfQot
ICAgICAgICB0aGlzLmhlbHBlcnNbbmFtZV0gPSBmbjsKLSAgICAgIH0KLSAgICB9LAotCi0gICAg
cmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lLCBzdHIpIHsKLSAgICAgIGlmICh0b1N0cmlu
Zy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7Ci0gICAgICAgIFV0aWxzLmV4dGVuZCh0aGlz
LnBhcnRpYWxzLCAgbmFtZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLnBhcnRpYWxz
W25hbWVdID0gc3RyOwotICAgICAgfQotICAgIH0KLSAgfTsKLQotICBmdW5jdGlvbiByZWdpc3Rl
ckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIo
J2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihhcmcpIHsKLSAgICAgIGlmKGFyZ3VtZW50cy5sZW5n
dGggPT09IDIpIHsKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk1pc3NpbmcgaGVscGVyOiAnIiArIGFyZyArICIn
Iik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxv
Y2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgdmFy
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UgfHwgZnVuY3Rpb24oKSB7fSwgZm4gPSBvcHRpb25z
LmZuOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4
dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmKGNvbnRleHQgPT09IHRydWUpIHsKLSAgICAgICAg
cmV0dXJuIGZuKHRoaXMpOwotICAgICAgfSBlbHNlIGlmKGNvbnRleHQgPT09IGZhbHNlIHx8IGNv
bnRleHQgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTsKLSAgICAgIH0g
ZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkgewotICAgICAgICBpZihjb250ZXh0Lmxlbmd0aCA+
IDApIHsKLSAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9w
dGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMp
OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZm4oY29udGV4dCk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcs
IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIHZhciBmbiA9IG9wdGlvbnMuZm4s
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0gICAgICB2YXIgaSA9IDAsIHJldCA9ICIiLCBk
YXRhOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4
dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmIChvcHRpb25zLmRhdGEpIHsKLSAgICAgICAgZGF0
YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGNvbnRl
eHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7Ci0gICAgICAgIGlmIChpc0FycmF5
KGNvbnRleHQpKSB7Ci0gICAgICAgICAgZm9yKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGk8ajsg
aSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgICBkYXRhLmluZGV4
ID0gaTsKLSAgICAgICAgICAgICAgZGF0YS5maXJzdCA9IChpID09PSAwKTsKLSAgICAgICAgICAg
ICAgZGF0YS5sYXN0ICA9IChpID09PSAoY29udGV4dC5sZW5ndGgtMSkpOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtpXSwgeyBkYXRhOiBkYXRhIH0p
OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IodmFyIGtleSBp
biBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZihjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkp
IHsKLSAgICAgICAgICAgICAgaWYoZGF0YSkgeyAKLSAgICAgICAgICAgICAgICBkYXRhLmtleSA9
IGtleTsgCi0gICAgICAgICAgICAgICAgZGF0YS5pbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAg
ZGF0YS5maXJzdCA9IChpID09PSAwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBy
ZXQgPSByZXQgKyBmbihjb250ZXh0W2tleV0sIHtkYXRhOiBkYXRhfSk7Ci0gICAgICAgICAgICAg
IGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQot
ICAgICAgaWYoaSA9PT0gMCl7Ci0gICAgICAgIHJldCA9IGludmVyc2UodGhpcyk7Ci0gICAgICB9
Ci0KLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3Rlckhl
bHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykgewotICAgICAgaWYgKGlz
RnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7IGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWwuY2FsbCh0
aGlzKTsgfQotCi0gICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9z
aXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCi0gICAgICAv
LyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRp
b25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZQotICAgICAgLy8gYmVoYXZpb3Ig
b2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBi
eSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS4KLSAgICAgIGlmICgoIW9wdGlvbnMuaGFz
aC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwpIHx8IFV0aWxzLmlzRW1wdHkoY29uZGl0aW9u
YWwpKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKLSAgICAgIH0KLSAgICB9KTsK
LQotICAgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbihjb25kaXRp
b25hbCwgb3B0aW9ucykgewotICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2Fs
bCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlv
bnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pOwotICAgIH0pOwotCi0gICAgaW5zdGFuY2UucmVn
aXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBp
ZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9
Ci0KLSAgICAgIGlmICghVXRpbHMuaXNFbXB0eShjb250ZXh0KSkgcmV0dXJuIG9wdGlvbnMuZm4o
Y29udGV4dCk7Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywg
ZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgdmFyIGxldmVsID0gb3B0aW9ucy5k
YXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsID8gcGFyc2VJbnQob3B0aW9ucy5kYXRh
LmxldmVsLCAxMCkgOiAxOwotICAgICAgaW5zdGFuY2UubG9nKGxldmVsLCBjb250ZXh0KTsKLSAg
ICB9KTsKLSAgfQotCi0gIHZhciBsb2dnZXIgPSB7Ci0gICAgbWV0aG9kTWFwOiB7IDA6ICdkZWJ1
ZycsIDE6ICdpbmZvJywgMjogJ3dhcm4nLCAzOiAnZXJyb3InIH0sCi0KLSAgICAvLyBTdGF0ZSBl
bnVtCi0gICAgREVCVUc6IDAsCi0gICAgSU5GTzogMSwKLSAgICBXQVJOOiAyLAotICAgIEVSUk9S
OiAzLAotICAgIGxldmVsOiAzLAotCi0gICAgLy8gY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhv
c3QgZW52aXJvbm1lbnQKLSAgICBsb2c6IGZ1bmN0aW9uKGxldmVsLCBvYmopIHsKLSAgICAgIGlm
IChsb2dnZXIubGV2ZWwgPD0gbGV2ZWwpIHsKLSAgICAgICAgdmFyIG1ldGhvZCA9IGxvZ2dlci5t
ZXRob2RNYXBbbGV2ZWxdOwotICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmlu
ZWQnICYmIGNvbnNvbGVbbWV0aG9kXSkgewotICAgICAgICAgIGNvbnNvbGVbbWV0aG9kXS5jYWxs
KGNvbnNvbGUsIG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIF9fZXhw
b3J0c19fLmxvZ2dlciA9IGxvZ2dlcjsKLSAgZnVuY3Rpb24gbG9nKGxldmVsLCBvYmopIHsgbG9n
Z2VyLmxvZyhsZXZlbCwgb2JqKTsgfQotCi0gIF9fZXhwb3J0c19fLmxvZyA9IGxvZzt2YXIgY3Jl
YXRlRnJhbWUgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgICB2YXIgb2JqID0ge307Ci0gICAgVXRp
bHMuZXh0ZW5kKG9iaiwgb2JqZWN0KTsKLSAgICByZXR1cm4gb2JqOwotICB9OwotICBfX2V4cG9y
dHNfXy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lOwotICByZXR1cm4gX19leHBvcnRzX187Ci19
KShfX21vZHVsZTNfXywgX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzL3J1bnRpbWUuanMK
LXZhciBfX21vZHVsZTZfXyA9IChmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5j
eTJfXywgX19kZXBlbmRlbmN5M19fKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0
c19fID0ge307Ci0gIHZhciBVdGlscyA9IF9fZGVwZW5kZW5jeTFfXzsKLSAgdmFyIEV4Y2VwdGlv
biA9IF9fZGVwZW5kZW5jeTJfXzsKLSAgdmFyIENPTVBJTEVSX1JFVklTSU9OID0gX19kZXBlbmRl
bmN5M19fLkNPTVBJTEVSX1JFVklTSU9OOwotICB2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IF9fZGVw
ZW5kZW5jeTNfXy5SRVZJU0lPTl9DSEFOR0VTOwotCi0gIGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24o
Y29tcGlsZXJJbmZvKSB7Ci0gICAgdmFyIGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8g
JiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsCi0gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJ
TEVSX1JFVklTSU9OOwotCi0gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZp
c2lvbikgewotICAgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsK
LSAgICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJl
dmlzaW9uXSwKLSAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VT
W2NvbXBpbGVyUmV2aXNpb25dOwotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUZW1wbGF0
ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhh
biB0aGUgY3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5
b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIitydW50aW1lVmVyc2lvbnMrIikg
b3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgiK2NvbXBpbGVy
VmVyc2lvbnMrIikuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBVc2UgdGhlIGVtYmVk
ZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhp
cyByZXZpc2lvbiB5ZXQKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVtcGxhdGUgd2Fz
IHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUg
Y3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1
bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2NvbXBpbGVySW5mb1sxXSsiKS4iKTsKLSAgICAg
IH0KLSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZp
c2lvbjsvLyBUT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFuZCBicmVhayB1cCBjb21waWxlUGFydGlh
bAotCi0gIGZ1bmN0aW9uIHRlbXBsYXRlKHRlbXBsYXRlU3BlYywgZW52KSB7Ci0gICAgaWYgKCFl
bnYpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGVudmlyb25tZW50IHBhc3NlZCB0
byB0ZW1wbGF0ZSIpOwotICAgIH0KLQotICAgIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVu
Y2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0
aW9uIHRvIGFsbG93Ci0gICAgLy8gZm9yIGV4dGVybmFsIHVzZXJzIHRvIG92ZXJyaWRlIHRoZXNl
IGFzIHBzZXVkby1zdXBwb3J0ZWQgQVBJcy4KLSAgICB2YXIgaW52b2tlUGFydGlhbFdyYXBwZXIg
PSBmdW5jdGlvbihwYXJ0aWFsLCBuYW1lLCBjb250ZXh0LCBoZWxwZXJzLCBwYXJ0aWFscywgZGF0
YSkgewotICAgICAgdmFyIHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsgcmV0dXJuIHJlc3VsdDsg
fQotCi0gICAgICBpZiAoZW52LmNvbXBpbGUpIHsKLSAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGhl
bHBlcnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0aWFscywgZGF0YTogZGF0YSB9OwotICAgICAg
ICBwYXJ0aWFsc1tuYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHsgZGF0YTogZGF0YSAhPT0g
dW5kZWZpbmVkIH0sIGVudik7Ci0gICAgICAgIHJldHVybiBwYXJ0aWFsc1tuYW1lXShjb250ZXh0
LCBvcHRpb25zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24o
IlRoZSBwYXJ0aWFsICIgKyBuYW1lICsgIiBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5u
aW5nIGluIHJ1bnRpbWUtb25seSBtb2RlIik7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIC8vIEp1
c3QgYWRkIHdhdGVyCi0gICAgdmFyIGNvbnRhaW5lciA9IHsKLSAgICAgIGVzY2FwZUV4cHJlc3Np
b246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCi0gICAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQ
YXJ0aWFsV3JhcHBlciwKLSAgICAgIHByb2dyYW1zOiBbXSwKLSAgICAgIHByb2dyYW06IGZ1bmN0
aW9uKGksIGZuLCBkYXRhKSB7Ci0gICAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJv
Z3JhbXNbaV07Ci0gICAgICAgIGlmKGRhdGEpIHsKLSAgICAgICAgICBwcm9ncmFtV3JhcHBlciA9
IHByb2dyYW0oaSwgZm4sIGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBl
cikgewotICAgICAgICAgIHByb2dyYW1XcmFwcGVyID0gdGhpcy5wcm9ncmFtc1tpXSA9IHByb2dy
YW0oaSwgZm4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9ncmFtV3JhcHBlcjsKLSAg
ICAgIH0sCi0gICAgICBtZXJnZTogZnVuY3Rpb24ocGFyYW0sIGNvbW1vbikgewotICAgICAgICB2
YXIgcmV0ID0gcGFyYW0gfHwgY29tbW9uOwotCi0gICAgICAgIGlmIChwYXJhbSAmJiBjb21tb24g
JiYgKHBhcmFtICE9PSBjb21tb24pKSB7Ci0gICAgICAgICAgcmV0ID0ge307Ci0gICAgICAgICAg
VXRpbHMuZXh0ZW5kKHJldCwgY29tbW9uKTsKLSAgICAgICAgICBVdGlscy5leHRlbmQocmV0LCBw
YXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0sCi0gICAgICBw
cm9ncmFtV2l0aERlcHRoOiBlbnYuVk0ucHJvZ3JhbVdpdGhEZXB0aCwKLSAgICAgIG5vb3A6IGVu
di5WTS5ub29wLAotICAgICAgY29tcGlsZXJJbmZvOiBudWxsCi0gICAgfTsKLQotICAgIHJldHVy
biBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBvcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKLSAgICAgIHZhciBuYW1lc3BhY2UgPSBvcHRpb25zLnBhcnRpYWwgPyBvcHRpb25zIDog
ZW52LAotICAgICAgICAgIGhlbHBlcnMsCi0gICAgICAgICAgcGFydGlhbHM7Ci0KLSAgICAgIGlm
ICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAgIGhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7
Ci0gICAgICAgIHBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFsczsKLSAgICAgIH0KLSAgICAgIHZh
ciByZXN1bHQgPSB0ZW1wbGF0ZVNwZWMuY2FsbCgKLSAgICAgICAgICAgIGNvbnRhaW5lciwKLSAg
ICAgICAgICAgIG5hbWVzcGFjZSwgY29udGV4dCwKLSAgICAgICAgICAgIGhlbHBlcnMsCi0gICAg
ICAgICAgICBwYXJ0aWFscywKLSAgICAgICAgICAgIG9wdGlvbnMuZGF0YSk7Ci0KLSAgICAgIGlm
ICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAgIGVudi5WTS5jaGVja1JldmlzaW9uKGNvbnRh
aW5lci5jb21waWxlckluZm8pOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAg
IH07Ci0gIH0KLQotICBfX2V4cG9ydHNfXy50ZW1wbGF0ZSA9IHRlbXBsYXRlO2Z1bmN0aW9uIHBy
b2dyYW1XaXRoRGVwdGgoaSwgZm4sIGRhdGEgLyosICRkZXB0aCAqLykgewotICAgIHZhciBhcmdz
ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTsKLQotICAgIHZhciBw
cm9nID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgb3B0aW9ucyA9IG9wdGlv
bnMgfHwge307Ci0KLSAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBbY29udGV4dCwgb3B0aW9u
cy5kYXRhIHx8IGRhdGFdLmNvbmNhdChhcmdzKSk7Ci0gICAgfTsKLSAgICBwcm9nLnByb2dyYW0g
PSBpOwotICAgIHByb2cuZGVwdGggPSBhcmdzLmxlbmd0aDsKLSAgICByZXR1cm4gcHJvZzsKLSAg
fQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW1XaXRoRGVwdGggPSBwcm9ncmFtV2l0aERlcHRoO2Z1
bmN0aW9uIHByb2dyYW0oaSwgZm4sIGRhdGEpIHsKLSAgICB2YXIgcHJvZyA9IGZ1bmN0aW9uKGNv
bnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gICAg
ICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucy5kYXRhIHx8IGRhdGEpOwotICAgIH07Ci0gICAg
cHJvZy5wcm9ncmFtID0gaTsKLSAgICBwcm9nLmRlcHRoID0gMDsKLSAgICByZXR1cm4gcHJvZzsK
LSAgfQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW0gPSBwcm9ncmFtO2Z1bmN0aW9uIGludm9rZVBh
cnRpYWwocGFydGlhbCwgbmFtZSwgY29udGV4dCwgaGVscGVycywgcGFydGlhbHMsIGRhdGEpIHsK
LSAgICB2YXIgb3B0aW9ucyA9IHsgcGFydGlhbDogdHJ1ZSwgaGVscGVyczogaGVscGVycywgcGFy
dGlhbHM6IHBhcnRpYWxzLCBkYXRhOiBkYXRhIH07Ci0KLSAgICBpZihwYXJ0aWFsID09PSB1bmRl
ZmluZWQpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1l
ICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsKLSAgICB9IGVsc2UgaWYocGFydGlhbCBpbnN0YW5j
ZW9mIEZ1bmN0aW9uKSB7Ci0gICAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTsK
LSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlh
bDtmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gIiI7IH0KLQotICBfX2V4cG9ydHNfXy5ub29wID0g
bm9vcDsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoX19tb2R1bGUzX18sIF9fbW9kdWxlNV9f
LCBfX21vZHVsZTJfXyk7Ci0KLS8vIGhhbmRsZWJhcnMucnVudGltZS5qcwotdmFyIF9fbW9kdWxl
MV9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVu
ZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fKSB7Ci0gICJ1c2Ugc3Ry
aWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fOwotICAvKmdsb2JhbHMgSGFuZGxlYmFyczogdHJ1ZSAq
LwotICB2YXIgYmFzZSA9IF9fZGVwZW5kZW5jeTFfXzsKLQotICAvLyBFYWNoIG9mIHRoZXNlIGF1
Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuCi0gIC8v
IChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJlIGNvZGUgYmV0d2VlbiBjb21tb25qcyBhbmQg
YnJvd3NlIGVudnMpCi0gIHZhciBTYWZlU3RyaW5nID0gX19kZXBlbmRlbmN5Ml9fOwotICB2YXIg
RXhjZXB0aW9uID0gX19kZXBlbmRlbmN5M19fOwotICB2YXIgVXRpbHMgPSBfX2RlcGVuZGVuY3k0
X187Ci0gIHZhciBydW50aW1lID0gX19kZXBlbmRlbmN5NV9fOwotCi0gIC8vIEZvciBjb21wYXRp
YmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5k
bGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQotICB2YXIgY3JlYXRlID0gZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7Ci0KLSAgICBVdGls
cy5leHRlbmQoaGIsIGJhc2UpOwotICAgIGhiLlNhZmVTdHJpbmcgPSBTYWZlU3RyaW5nOwotICAg
IGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjsKLSAgICBoYi5VdGlscyA9IFV0aWxzOwotCi0gICAg
aGIuVk0gPSBydW50aW1lOwotICAgIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykgewotICAg
ICAgcmV0dXJuIHJ1bnRpbWUudGVtcGxhdGUoc3BlYywgaGIpOwotICAgIH07Ci0KLSAgICByZXR1
cm4gaGI7Ci0gIH07Ci0KLSAgdmFyIEhhbmRsZWJhcnMgPSBjcmVhdGUoKTsKLSAgSGFuZGxlYmFy
cy5jcmVhdGUgPSBjcmVhdGU7Ci0KLSAgX19leHBvcnRzX18gPSBIYW5kbGViYXJzOwotICByZXR1
cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTJfXywgX19tb2R1bGU0X18sIF9fbW9kdWxlNV9f
LCBfX21vZHVsZTNfXywgX19tb2R1bGU2X18pOwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2Fz
dC5qcwotdmFyIF9fbW9kdWxlN19fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAi
dXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNfXzsKLSAgdmFyIEV4Y2VwdGlvbiA9IF9fZGVw
ZW5kZW5jeTFfXzsKLQotICBmdW5jdGlvbiBMb2NhdGlvbkluZm8obG9jSW5mbyl7Ci0gICAgbG9j
SW5mbyA9IGxvY0luZm8gfHwge307Ci0gICAgdGhpcy5maXJzdExpbmUgICA9IGxvY0luZm8uZmly
c3RfbGluZTsKLSAgICB0aGlzLmZpcnN0Q29sdW1uID0gbG9jSW5mby5maXJzdF9jb2x1bW47Ci0g
ICAgdGhpcy5sYXN0Q29sdW1uICA9IGxvY0luZm8ubGFzdF9jb2x1bW47Ci0gICAgdGhpcy5sYXN0
TGluZSAgICA9IGxvY0luZm8ubGFzdF9saW5lOwotICB9Ci0KLSAgdmFyIEFTVCA9IHsKLSAgICBQ
cm9ncmFtTm9kZTogZnVuY3Rpb24oc3RhdGVtZW50cywgaW52ZXJzZVN0cmlwLCBpbnZlcnNlLCBs
b2NJbmZvKSB7Ci0gICAgICB2YXIgaW52ZXJzZUxvY2F0aW9uSW5mbywgZmlyc3RJbnZlcnNlTm9k
ZTsKLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7Ci0gICAgICAgIGxvY0luZm8g
PSBpbnZlcnNlOwotICAgICAgICBpbnZlcnNlID0gbnVsbDsKLSAgICAgIH0gZWxzZSBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgICBsb2NJbmZvID0gaW52ZXJzZVN0cmlwOwot
ICAgICAgICBpbnZlcnNlU3RyaXAgPSBudWxsOwotICAgICAgfQotCi0gICAgICBMb2NhdGlvbklu
Zm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAgIHRoaXMudHlwZSA9ICJwcm9ncmFtIjsKLSAg
ICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7Ci0gICAgICB0aGlzLnN0cmlwID0ge307
Ci0KLSAgICAgIGlmKGludmVyc2UpIHsKLSAgICAgICAgZmlyc3RJbnZlcnNlTm9kZSA9IGludmVy
c2VbMF07Ci0gICAgICAgIGlmIChmaXJzdEludmVyc2VOb2RlKSB7Ci0gICAgICAgICAgaW52ZXJz
ZUxvY2F0aW9uSW5mbyA9IHsKLSAgICAgICAgICAgIGZpcnN0X2xpbmU6IGZpcnN0SW52ZXJzZU5v
ZGUuZmlyc3RMaW5lLAotICAgICAgICAgICAgbGFzdF9saW5lOiBmaXJzdEludmVyc2VOb2RlLmxh
c3RMaW5lLAotICAgICAgICAgICAgbGFzdF9jb2x1bW46IGZpcnN0SW52ZXJzZU5vZGUubGFzdENv
bHVtbiwKLSAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogZmlyc3RJbnZlcnNlTm9kZS5maXJzdENv
bHVtbgotICAgICAgICAgIH07Ci0gICAgICAgICAgdGhpcy5pbnZlcnNlID0gbmV3IEFTVC5Qcm9n
cmFtTm9kZShpbnZlcnNlLCBpbnZlcnNlU3RyaXAsIGludmVyc2VMb2NhdGlvbkluZm8pOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMuaW52ZXJzZSA9IG5ldyBBU1QuUHJvZ3JhbU5v
ZGUoaW52ZXJzZSwgaW52ZXJzZVN0cmlwKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnN0cmlw
LnJpZ2h0ID0gaW52ZXJzZVN0cmlwLmxlZnQ7Ci0gICAgICB9IGVsc2UgaWYgKGludmVyc2VTdHJp
cCkgewotICAgICAgICB0aGlzLnN0cmlwLmxlZnQgPSBpbnZlcnNlU3RyaXAucmlnaHQ7Ci0gICAg
ICB9Ci0gICAgfSwKLQotICAgIE11c3RhY2hlTm9kZTogZnVuY3Rpb24ocmF3UGFyYW1zLCBoYXNo
LCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywg
bG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAibXVzdGFjaGUiOwotICAgICAgdGhpcy5zdHJp
cCA9IHN0cmlwOwotCi0gICAgICAvLyBPcGVuIG1heSBiZSBhIHN0cmluZyBwYXJzZWQgZnJvbSB0
aGUgcGFyc2VyIG9yIGEgcGFzc2VkIGJvb2xlYW4gZmxhZwotICAgICAgaWYgKG9wZW4gIT0gbnVs
bCAmJiBvcGVuLmNoYXJBdCkgewotICAgICAgICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9y
dCBJRSBwcmUtMTAKLSAgICAgICAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBv
cGVuLmNoYXJBdCgyKTsKLSAgICAgICAgdGhpcy5lc2NhcGVkID0gZXNjYXBlRmxhZyAhPT0gJ3sn
ICYmIGVzY2FwZUZsYWcgIT09ICcmJzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuZXNj
YXBlZCA9ICEhb3BlbjsKLSAgICAgIH0KLQotICAgICAgaWYgKHJhd1BhcmFtcyBpbnN0YW5jZW9m
IEFTVC5TZXhwck5vZGUpIHsKLSAgICAgICAgdGhpcy5zZXhwciA9IHJhd1BhcmFtczsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIC8vIFN1cHBvcnQgb2xkIEFTVCBBUEkKLSAgICAgICAgdGhpcy5z
ZXhwciA9IG5ldyBBU1QuU2V4cHJOb2RlKHJhd1BhcmFtcywgaGFzaCk7Ci0gICAgICB9Ci0KLSAg
ICAgIHRoaXMuc2V4cHIuaXNSb290ID0gdHJ1ZTsKLQotICAgICAgLy8gU3VwcG9ydCBvbGQgQVNU
IEFQSSB0aGF0IHN0b3JlZCB0aGlzIGluZm8gaW4gTXVzdGFjaGVOb2RlCi0gICAgICB0aGlzLmlk
ID0gdGhpcy5zZXhwci5pZDsKLSAgICAgIHRoaXMucGFyYW1zID0gdGhpcy5zZXhwci5wYXJhbXM7
Ci0gICAgICB0aGlzLmhhc2ggPSB0aGlzLnNleHByLmhhc2g7Ci0gICAgICB0aGlzLmVsaWdpYmxl
SGVscGVyID0gdGhpcy5zZXhwci5lbGlnaWJsZUhlbHBlcjsKLSAgICAgIHRoaXMuaXNIZWxwZXIg
PSB0aGlzLnNleHByLmlzSGVscGVyOwotICAgIH0sCi0KLSAgICBTZXhwck5vZGU6IGZ1bmN0aW9u
KHJhd1BhcmFtcywgaGFzaCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhp
cywgbG9jSW5mbyk7Ci0KLSAgICAgIHRoaXMudHlwZSA9ICJzZXhwciI7Ci0gICAgICB0aGlzLmhh
c2ggPSBoYXNoOwotCi0gICAgICB2YXIgaWQgPSB0aGlzLmlkID0gcmF3UGFyYW1zWzBdOwotICAg
ICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyYW1zID0gcmF3UGFyYW1zLnNsaWNlKDEpOwotCi0gICAg
ICAvLyBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBpZjoKLSAgICAgIC8vICogaXRz
IGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQotICAgICAg
dmFyIGVsaWdpYmxlSGVscGVyID0gdGhpcy5lbGlnaWJsZUhlbHBlciA9IGlkLmlzU2ltcGxlOwot
Ci0gICAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6Ci0gICAgICAv
LyAqIGl0IGlzIGFuIGVsaWdpYmxlIGhlbHBlciwgYW5kCi0gICAgICAvLyAqIGl0IGhhcyBhdCBs
ZWFzdCBvbmUgcGFyYW1ldGVyIG9yIGhhc2ggc2VnbWVudAotICAgICAgdGhpcy5pc0hlbHBlciA9
IGVsaWdpYmxlSGVscGVyICYmIChwYXJhbXMubGVuZ3RoIHx8IGhhc2gpOwotCi0gICAgICAvLyBp
ZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKLSAg
ICAgIC8vIGhlbHBlciwgaXQgaXMgYW1iaWd1b3VzLCBhbmQgd2lsbCBiZSByZXNvbHZlZCBpbiBh
IGxhdGVyCi0gICAgICAvLyBwYXNzIG9yIGF0IHJ1bnRpbWUuCi0gICAgfSwKLQotICAgIFBhcnRp
YWxOb2RlOiBmdW5jdGlvbihwYXJ0aWFsTmFtZSwgY29udGV4dCwgc3RyaXAsIGxvY0luZm8pIHsK
LSAgICAgIExvY2F0aW9uSW5mby5jYWxsKHRoaXMsIGxvY0luZm8pOwotICAgICAgdGhpcy50eXBl
ICAgICAgICAgPSAicGFydGlhbCI7Ci0gICAgICB0aGlzLnBhcnRpYWxOYW1lICA9IHBhcnRpYWxO
YW1lOwotICAgICAgdGhpcy5jb250ZXh0ICAgICAgPSBjb250ZXh0OwotICAgICAgdGhpcy5zdHJp
cCA9IHN0cmlwOwotICAgIH0sCi0KLSAgICBCbG9ja05vZGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBw
cm9ncmFtLCBpbnZlcnNlLCBjbG9zZSwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNh
bGwodGhpcywgbG9jSW5mbyk7Ci0KLSAgICAgIGlmKG11c3RhY2hlLnNleHByLmlkLm9yaWdpbmFs
ICE9PSBjbG9zZS5wYXRoLm9yaWdpbmFsKSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24o
bXVzdGFjaGUuc2V4cHIuaWQub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLnBh
dGgub3JpZ2luYWwsIHRoaXMpOwotICAgICAgfQotCi0gICAgICB0aGlzLnR5cGUgPSAnYmxvY2sn
OwotICAgICAgdGhpcy5tdXN0YWNoZSA9IG11c3RhY2hlOwotICAgICAgdGhpcy5wcm9ncmFtICA9
IHByb2dyYW07Ci0gICAgICB0aGlzLmludmVyc2UgID0gaW52ZXJzZTsKLQotICAgICAgdGhpcy5z
dHJpcCA9IHsKLSAgICAgICAgbGVmdDogbXVzdGFjaGUuc3RyaXAubGVmdCwKLSAgICAgICAgcmln
aHQ6IGNsb3NlLnN0cmlwLnJpZ2h0Ci0gICAgICB9OwotCi0gICAgICAocHJvZ3JhbSB8fCBpbnZl
cnNlKS5zdHJpcC5sZWZ0ID0gbXVzdGFjaGUuc3RyaXAucmlnaHQ7Ci0gICAgICAoaW52ZXJzZSB8
fCBwcm9ncmFtKS5zdHJpcC5yaWdodCA9IGNsb3NlLnN0cmlwLmxlZnQ7Ci0KLSAgICAgIGlmIChp
bnZlcnNlICYmICFwcm9ncmFtKSB7Ci0gICAgICAgIHRoaXMuaXNJbnZlcnNlID0gdHJ1ZTsKLSAg
ICAgIH0KLSAgICB9LAotCi0gICAgQ29udGVudE5vZGU6IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5m
bykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlz
LnR5cGUgPSAiY29udGVudCI7Ci0gICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKLSAgICB9LAot
Ci0gICAgSGFzaE5vZGU6IGZ1bmN0aW9uKHBhaXJzLCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlv
bkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAgIHRoaXMudHlwZSA9ICJoYXNoIjsKLSAg
ICAgIHRoaXMucGFpcnMgPSBwYWlyczsKLSAgICB9LAotCi0gICAgSWROb2RlOiBmdW5jdGlvbihw
YXJ0cywgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7
Ci0gICAgICB0aGlzLnR5cGUgPSAiSUQiOwotCi0gICAgICB2YXIgb3JpZ2luYWwgPSAiIiwKLSAg
ICAgICAgICBkaWcgPSBbXSwKLSAgICAgICAgICBkZXB0aCA9IDA7Ci0KLSAgICAgIGZvcih2YXIg
aT0wLGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgcGFydCA9IHBhcnRz
W2ldLnBhcnQ7Ci0gICAgICAgIG9yaWdpbmFsICs9IChwYXJ0c1tpXS5zZXBhcmF0b3IgfHwgJycp
ICsgcGFydDsKLQotICAgICAgICBpZiAocGFydCA9PT0gIi4uIiB8fCBwYXJ0ID09PSAiLiIgfHwg
cGFydCA9PT0gInRoaXMiKSB7Ci0gICAgICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7Ci0gICAg
ICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhdGg6ICIgKyBvcmlnaW5hbCwg
dGhpcyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAiLi4iKSB7Ci0gICAgICAgICAg
ICBkZXB0aCsrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmlzU2NvcGVk
ID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGlnLnB1
c2gocGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdGhpcy5vcmlnaW5hbCA9IG9y
aWdpbmFsOwotICAgICAgdGhpcy5wYXJ0cyAgICA9IGRpZzsKLSAgICAgIHRoaXMuc3RyaW5nICAg
PSBkaWcuam9pbignLicpOwotICAgICAgdGhpcy5kZXB0aCAgICA9IGRlcHRoOwotCi0gICAgICAv
LyBhbiBJRCBpcyBzaW1wbGUgaWYgaXQgb25seSBoYXMgb25lIHBhcnQsIGFuZCB0aGF0IHBhcnQg
aXMgbm90Ci0gICAgICAvLyBgLi5gIG9yIGB0aGlzYC4KLSAgICAgIHRoaXMuaXNTaW1wbGUgPSBw
YXJ0cy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNTY29wZWQgJiYgZGVwdGggPT09IDA7Ci0KLSAg
ICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gdGhpcy5zdHJpbmc7Ci0gICAgfSwKLQotICAgIFBh
cnRpYWxOYW1lTm9kZTogZnVuY3Rpb24obmFtZSwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25J
bmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiUEFSVElBTF9OQU1F
IjsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWUub3JpZ2luYWw7Ci0gICAgfSwKLQotICAgIERhdGFO
b2RlOiBmdW5jdGlvbihpZCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhp
cywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiREFUQSI7Ci0gICAgICB0aGlzLmlkID0g
aWQ7Ci0gICAgfSwKLQotICAgIFN0cmluZ05vZGU6IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5mbykg
ewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5
cGUgPSAiU1RSSU5HIjsKLSAgICAgIHRoaXMub3JpZ2luYWwgPQotICAgICAgICB0aGlzLnN0cmlu
ZyA9Ci0gICAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gc3RyaW5nOwotICAgIH0sCi0KLSAg
ICBJbnRlZ2VyTm9kZTogZnVuY3Rpb24oaW50ZWdlciwgbG9jSW5mbykgewotICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiSU5URUdFUiI7
Ci0gICAgICB0aGlzLm9yaWdpbmFsID0KLSAgICAgICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsK
LSAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gTnVtYmVyKGludGVnZXIpOwotICAgIH0sCi0K
LSAgICBCb29sZWFuTm9kZTogZnVuY3Rpb24oYm9vbCwgbG9jSW5mbykgewotICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiQk9PTEVBTiI7
Ci0gICAgICB0aGlzLmJvb2wgPSBib29sOwotICAgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBi
b29sID09PSAidHJ1ZSI7Ci0gICAgfSwKLQotICAgIENvbW1lbnROb2RlOiBmdW5jdGlvbihjb21t
ZW50LCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsK
LSAgICAgIHRoaXMudHlwZSA9ICJjb21tZW50IjsKLSAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1l
bnQ7Ci0gICAgfQotICB9OwotCi0gIC8vIE11c3QgYmUgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHJh
dGhlciB0aGFuIHRoZSByb290IG9mIHRoZSBtb2R1bGUgYXMgdGhlIGppc29uIGxleGVyCi0gIC8v
IG1vc3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KLSAgX19leHBvcnRz
X18gPSBBU1Q7Ci0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKF9fbW9kdWxlNV9fKTsKLQotLy8g
aGFuZGxlYmFycy9jb21waWxlci9wYXJzZXIuanMKLXZhciBfX21vZHVsZTlfXyA9IChmdW5jdGlv
bigpIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIC8qIGpzaGludCBp
Z25vcmU6c3RhcnQgKi8KLSAgLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLwotICB2YXIgaGFu
ZGxlYmFycyA9IChmdW5jdGlvbigpewotICB2YXIgcGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0
cmFjZSgpIHsgfSwKLSAgeXk6IHt9LAotICBzeW1ib2xzXzogeyJlcnJvciI6Miwicm9vdCI6Mywi
c3RhdGVtZW50cyI6NCwiRU9GIjo1LCJwcm9ncmFtIjo2LCJzaW1wbGVJbnZlcnNlIjo3LCJzdGF0
ZW1lbnQiOjgsIm9wZW5JbnZlcnNlIjo5LCJjbG9zZUJsb2NrIjoxMCwib3BlbkJsb2NrIjoxMSwi
bXVzdGFjaGUiOjEyLCJwYXJ0aWFsIjoxMywiQ09OVEVOVCI6MTQsIkNPTU1FTlQiOjE1LCJPUEVO
X0JMT0NLIjoxNiwic2V4cHIiOjE3LCJDTE9TRSI6MTgsIk9QRU5fSU5WRVJTRSI6MTksIk9QRU5f
RU5EQkxPQ0siOjIwLCJwYXRoIjoyMSwiT1BFTiI6MjIsIk9QRU5fVU5FU0NBUEVEIjoyMywiQ0xP
U0VfVU5FU0NBUEVEIjoyNCwiT1BFTl9QQVJUSUFMIjoyNSwicGFydGlhbE5hbWUiOjI2LCJwYXJ0
aWFsX29wdGlvbjAiOjI3LCJzZXhwcl9yZXBldGl0aW9uMCI6MjgsInNleHByX29wdGlvbjAiOjI5
LCJkYXRhTmFtZSI6MzAsInBhcmFtIjozMSwiU1RSSU5HIjozMiwiSU5URUdFUiI6MzMsIkJPT0xF
QU4iOjM0LCJPUEVOX1NFWFBSIjozNSwiQ0xPU0VfU0VYUFIiOjM2LCJoYXNoIjozNywiaGFzaF9y
ZXBldGl0aW9uX3BsdXMwIjozOCwiaGFzaFNlZ21lbnQiOjM5LCJJRCI6NDAsIkVRVUFMUyI6NDEs
IkRBVEEiOjQyLCJwYXRoU2VnbWVudHMiOjQzLCJTRVAiOjQ0LCIkYWNjZXB0IjowLCIkZW5kIjox
fSwKLSAgdGVybWluYWxzXzogezI6ImVycm9yIiw1OiJFT0YiLDE0OiJDT05URU5UIiwxNToiQ09N
TUVOVCIsMTY6Ik9QRU5fQkxPQ0siLDE4OiJDTE9TRSIsMTk6Ik9QRU5fSU5WRVJTRSIsMjA6Ik9Q
RU5fRU5EQkxPQ0siLDIyOiJPUEVOIiwyMzoiT1BFTl9VTkVTQ0FQRUQiLDI0OiJDTE9TRV9VTkVT
Q0FQRUQiLDI1OiJPUEVOX1BBUlRJQUwiLDMyOiJTVFJJTkciLDMzOiJJTlRFR0VSIiwzNDoiQk9P
TEVBTiIsMzU6Ik9QRU5fU0VYUFIiLDM2OiJDTE9TRV9TRVhQUiIsNDA6IklEIiw0MToiRVFVQUxT
Iiw0MjoiREFUQSIsNDQ6IlNFUCJ9LAotICBwcm9kdWN0aW9uc186IFswLFszLDJdLFszLDFdLFs2
LDJdLFs2LDNdLFs2LDJdLFs2LDFdLFs2LDFdLFs2LDBdLFs0LDFdLFs0LDJdLFs4LDNdLFs4LDNd
LFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFsxMSwzXSxbOSwzXSxbMTAsM10sWzEyLDNdLFsxMiwz
XSxbMTMsNF0sWzcsMl0sWzE3LDNdLFsxNywxXSxbMzEsMV0sWzMxLDFdLFszMSwxXSxbMzEsMV0s
WzMxLDFdLFszMSwzXSxbMzcsMV0sWzM5LDNdLFsyNiwxXSxbMjYsMV0sWzI2LDFdLFszMCwyXSxb
MjEsMV0sWzQzLDNdLFs0MywxXSxbMjcsMF0sWzI3LDFdLFsyOCwwXSxbMjgsMl0sWzI5LDBdLFsy
OSwxXSxbMzgsMV0sWzM4LDJdXSwKLSAgcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24gYW5vbnltb3Vz
KHl5dGV4dCx5eWxlbmcseXlsaW5lbm8seXkseXlzdGF0ZSwkJCxfJCkgewotCi0gIHZhciAkMCA9
ICQkLmxlbmd0aCAtIDE7Ci0gIHN3aXRjaCAoeXlzdGF0ZSkgewotICBjYXNlIDE6IHJldHVybiBu
ZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMV0sIHRoaXMuXyQpOyAKLSAgYnJlYWs7Ci0gIGNhc2Ug
MjogcmV0dXJuIG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgdGhpcy5fJCk7IAotICBicmVhazsKLSAg
Y2FzZSAzOnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgJCRbJDAtMV0sICQkWyQwXSwg
dGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDQ6dGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2Rl
KCQkWyQwLTJdLCAkJFskMC0xXSwgJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2Ug
NTp0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMV0sICQkWyQwXSwgW10sIHRoaXMu
XyQpOwotICBicmVhazsKLSAgY2FzZSA2OnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZSgkJFsk
MF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSA3OnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFt
Tm9kZShbXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDg6dGhpcy4kID0gbmV3IHl5LlBy
b2dyYW1Ob2RlKFtdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgOTp0aGlzLiQgPSBbJCRb
JDBdXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTA6ICQkWyQwLTFdLnB1c2goJCRbJDBdKTsgdGhpcy4k
ID0gJCRbJDAtMV07IAotICBicmVhazsKLSAgY2FzZSAxMTp0aGlzLiQgPSBuZXcgeXkuQmxvY2tO
b2RlKCQkWyQwLTJdLCAkJFskMC0xXS5pbnZlcnNlLCAkJFskMC0xXSwgJCRbJDBdLCB0aGlzLl8k
KTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTI6dGhpcy4kID0gbmV3IHl5LkJsb2NrTm9kZSgkJFskMC0y
XSwgJCRbJDAtMV0sICQkWyQwLTFdLmludmVyc2UsICQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFr
OwotICBjYXNlIDEzOnRoaXMuJCA9ICQkWyQwXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTQ6dGhpcy4k
ID0gJCRbJDBdOwotICBicmVhazsKLSAgY2FzZSAxNTp0aGlzLiQgPSBuZXcgeXkuQ29udGVudE5v
ZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTY6dGhpcy4kID0gbmV3IHl5
LkNvbW1lbnROb2RlKCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDE3OnRoaXMu
JCA9IG5ldyB5eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV0sIG51bGwsICQkWyQwLTJdLCBzdHJpcEZs
YWdzKCQkWyQwLTJdLCAkJFskMF0pLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTg6dGhp
cy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlw
RmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAxOTp0
aGlzLiQgPSB7cGF0aDogJCRbJDAtMV0sIHN0cmlwOiBzdHJpcEZsYWdzKCQkWyQwLTJdLCAkJFsk
MF0pfTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjA6dGhpcy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgk
JFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlwRmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRo
aXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAyMTp0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2Rl
KCQkWyQwLTFdLCBudWxsLCAkJFskMC0yXSwgc3RyaXBGbGFncygkJFskMC0yXSwgJCRbJDBdKSwg
dGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDIyOnRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTm9k
ZSgkJFskMC0yXSwgJCRbJDAtMV0sIHN0cmlwRmxhZ3MoJCRbJDAtM10sICQkWyQwXSksIHRoaXMu
XyQpOwotICBicmVhazsKLSAgY2FzZSAyMzp0aGlzLiQgPSBzdHJpcEZsYWdzKCQkWyQwLTFdLCAk
JFskMF0pOwotICBicmVhazsKLSAgY2FzZSAyNDp0aGlzLiQgPSBuZXcgeXkuU2V4cHJOb2RlKFsk
JFskMC0yXV0uY29uY2F0KCQkWyQwLTFdKSwgJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0g
IGNhc2UgMjU6dGhpcy4kID0gbmV3IHl5LlNleHByTm9kZShbJCRbJDBdXSwgbnVsbCwgdGhpcy5f
JCk7Ci0gIGJyZWFrOwotICBjYXNlIDI2OnRoaXMuJCA9ICQkWyQwXTsKLSAgYnJlYWs7Ci0gIGNh
c2UgMjc6dGhpcy4kID0gbmV3IHl5LlN0cmluZ05vZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJl
YWs7Ci0gIGNhc2UgMjg6dGhpcy4kID0gbmV3IHl5LkludGVnZXJOb2RlKCQkWyQwXSwgdGhpcy5f
JCk7Ci0gIGJyZWFrOwotICBjYXNlIDI5OnRoaXMuJCA9IG5ldyB5eS5Cb29sZWFuTm9kZSgkJFsk
MF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAzMDp0aGlzLiQgPSAkJFskMF07Ci0gIGJy
ZWFrOwotICBjYXNlIDMxOiQkWyQwLTFdLmlzSGVscGVyID0gdHJ1ZTsgdGhpcy4kID0gJCRbJDAt
MV07Ci0gIGJyZWFrOwotICBjYXNlIDMyOnRoaXMuJCA9IG5ldyB5eS5IYXNoTm9kZSgkJFskMF0s
IHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAzMzp0aGlzLiQgPSBbJCRbJDAtMl0sICQkWyQw
XV07Ci0gIGJyZWFrOwotICBjYXNlIDM0OnRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTmFtZU5vZGUo
JCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMzU6dGhpcy4kID0gbmV3IHl5LlBh
cnRpYWxOYW1lTm9kZShuZXcgeXkuU3RyaW5nTm9kZSgkJFskMF0sIHRoaXMuXyQpLCB0aGlzLl8k
KTsKLSAgYnJlYWs7Ci0gIGNhc2UgMzY6dGhpcy4kID0gbmV3IHl5LlBhcnRpYWxOYW1lTm9kZShu
ZXcgeXkuSW50ZWdlck5vZGUoJCRbJDBdLCB0aGlzLl8kKSk7Ci0gIGJyZWFrOwotICBjYXNlIDM3
OnRoaXMuJCA9IG5ldyB5eS5EYXRhTm9kZSgkJFskMF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAg
Y2FzZSAzODp0aGlzLiQgPSBuZXcgeXkuSWROb2RlKCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFr
OwotICBjYXNlIDM5OiAkJFskMC0yXS5wdXNoKHtwYXJ0OiAkJFskMF0sIHNlcGFyYXRvcjogJCRb
JDAtMV19KTsgdGhpcy4kID0gJCRbJDAtMl07IAotICBicmVhazsKLSAgY2FzZSA0MDp0aGlzLiQg
PSBbe3BhcnQ6ICQkWyQwXX1dOwotICBicmVhazsKLSAgY2FzZSA0Mzp0aGlzLiQgPSBbXTsKLSAg
YnJlYWs7Ci0gIGNhc2UgNDQ6JCRbJDAtMV0ucHVzaCgkJFskMF0pOwotICBicmVhazsKLSAgY2Fz
ZSA0Nzp0aGlzLiQgPSBbJCRbJDBdXTsKLSAgYnJlYWs7Ci0gIGNhc2UgNDg6JCRbJDAtMV0ucHVz
aCgkJFskMF0pOwotICBicmVhazsKLSAgfQotICB9LAotICB0YWJsZTogW3szOjEsNDoyLDU6WzEs
M10sODo0LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5
OlsxLDExXSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1OlsxLDE1XX0sezE6WzNdfSx7NTpbMSwxNl0s
ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpb
MSwxMV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxOlsyLDJdfSx7NTpbMiw5XSwx
NDpbMiw5XSwxNTpbMiw5XSwxNjpbMiw5XSwxOTpbMiw5XSwyMDpbMiw5XSwyMjpbMiw5XSwyMzpb
Miw5XSwyNTpbMiw5XX0sezQ6MjAsNjoxOCw3OjE5LDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6
WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwyMV0sMjA6WzIsOF0sMjI6WzEsMTNdLDIz
OlsxLDE0XSwyNTpbMSwxNV19LHs0OjIwLDY6MjIsNzoxOSw4OjQsOTo1LDExOjYsMTI6NywxMzo4
LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0sMTk6WzEsMjFdLDIwOlsyLDhdLDIyOlsxLDEz
XSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NTpbMiwxM10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxNjpb
MiwxM10sMTk6WzIsMTNdLDIwOlsyLDEzXSwyMjpbMiwxM10sMjM6WzIsMTNdLDI1OlsyLDEzXX0s
ezU6WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwxNF0sMTY6WzIsMTRdLDE5OlsyLDE0XSwyMDpbMiwx
NF0sMjI6WzIsMTRdLDIzOlsyLDE0XSwyNTpbMiwxNF19LHs1OlsyLDE1XSwxNDpbMiwxNV0sMTU6
WzIsMTVdLDE2OlsyLDE1XSwxOTpbMiwxNV0sMjA6WzIsMTVdLDIyOlsyLDE1XSwyMzpbMiwxNV0s
MjU6WzIsMTVdfSx7NTpbMiwxNl0sMTQ6WzIsMTZdLDE1OlsyLDE2XSwxNjpbMiwxNl0sMTk6WzIs
MTZdLDIwOlsyLDE2XSwyMjpbMiwxNl0sMjM6WzIsMTZdLDI1OlsyLDE2XX0sezE3OjIzLDIxOjI0
LDMwOjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9LHsxNzoyOSwyMToyNCwzMDoyNSw0MDpb
MSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTc6MzAsMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsx
LDI3XSw0MzoyNn0sezE3OjMxLDIxOjI0LDMwOjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9
LHsyMTozMywyNjozMiwzMjpbMSwzNF0sMzM6WzEsMzVdLDQwOlsxLDI4XSw0MzoyNn0sezE6WzIs
MV19LHs1OlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIsMTBdLDE2OlsyLDEwXSwxOTpbMiwxMF0sMjA6
WzIsMTBdLDIyOlsyLDEwXSwyMzpbMiwxMF0sMjU6WzIsMTBdfSx7MTA6MzYsMjA6WzEsMzddfSx7
NDozOCw4OjQsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0s
MTk6WzEsMTFdLDIwOlsyLDddLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NzozOSw4
OjE3LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5Olsx
LDIxXSwyMDpbMiw2XSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1OlsxLDE1XX0sezE3OjIzLDE4Olsx
LDQwXSwyMToyNCwzMDoyNSw0MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTA6NDEsMjA6WzEs
MzddfSx7MTg6WzEsNDJdfSx7MTg6WzIsNDNdLDI0OlsyLDQzXSwyODo0MywzMjpbMiw0M10sMzM6
WzIsNDNdLDM0OlsyLDQzXSwzNTpbMiw0M10sMzY6WzIsNDNdLDQwOlsyLDQzXSw0MjpbMiw0M119
LHsxODpbMiwyNV0sMjQ6WzIsMjVdLDM2OlsyLDI1XX0sezE4OlsyLDM4XSwyNDpbMiwzOF0sMzI6
WzIsMzhdLDMzOlsyLDM4XSwzNDpbMiwzOF0sMzU6WzIsMzhdLDM2OlsyLDM4XSw0MDpbMiwzOF0s
NDI6WzIsMzhdLDQ0OlsxLDQ0XX0sezIxOjQ1LDQwOlsxLDI4XSw0MzoyNn0sezE4OlsyLDQwXSwy
NDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQwXSwzNDpbMiw0MF0sMzU6WzIsNDBdLDM2OlsyLDQw
XSw0MDpbMiw0MF0sNDI6WzIsNDBdLDQ0OlsyLDQwXX0sezE4OlsxLDQ2XX0sezE4OlsxLDQ3XX0s
ezI0OlsxLDQ4XX0sezE4OlsyLDQxXSwyMTo1MCwyNzo0OSw0MDpbMSwyOF0sNDM6MjZ9LHsxODpb
MiwzNF0sNDA6WzIsMzRdfSx7MTg6WzIsMzVdLDQwOlsyLDM1XX0sezE4OlsyLDM2XSw0MDpbMiwz
Nl19LHs1OlsyLDExXSwxNDpbMiwxMV0sMTU6WzIsMTFdLDE2OlsyLDExXSwxOTpbMiwxMV0sMjA6
WzIsMTFdLDIyOlsyLDExXSwyMzpbMiwxMV0sMjU6WzIsMTFdfSx7MjE6NTEsNDA6WzEsMjhdLDQz
OjI2fSx7ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEy
XSwxOTpbMSwxMV0sMjA6WzIsM10sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHs0OjUy
LDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpb
MSwxMV0sMjA6WzIsNV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxNDpbMiwyM10s
MTU6WzIsMjNdLDE2OlsyLDIzXSwxOTpbMiwyM10sMjA6WzIsMjNdLDIyOlsyLDIzXSwyMzpbMiwy
M10sMjU6WzIsMjNdfSx7NTpbMiwxMl0sMTQ6WzIsMTJdLDE1OlsyLDEyXSwxNjpbMiwxMl0sMTk6
WzIsMTJdLDIwOlsyLDEyXSwyMjpbMiwxMl0sMjM6WzIsMTJdLDI1OlsyLDEyXX0sezE0OlsyLDE4
XSwxNTpbMiwxOF0sMTY6WzIsMThdLDE5OlsyLDE4XSwyMDpbMiwxOF0sMjI6WzIsMThdLDIzOlsy
LDE4XSwyNTpbMiwxOF19LHsxODpbMiw0NV0sMjE6NTYsMjQ6WzIsNDVdLDI5OjUzLDMwOjYwLDMx
OjU0LDMyOlsxLDU3XSwzMzpbMSw1OF0sMzQ6WzEsNTldLDM1OlsxLDYxXSwzNjpbMiw0NV0sMzc6
NTUsMzg6NjIsMzk6NjMsNDA6WzEsNjRdLDQyOlsxLDI3XSw0MzoyNn0sezQwOlsxLDY1XX0sezE4
OlsyLDM3XSwyNDpbMiwzN10sMzI6WzIsMzddLDMzOlsyLDM3XSwzNDpbMiwzN10sMzU6WzIsMzdd
LDM2OlsyLDM3XSw0MDpbMiwzN10sNDI6WzIsMzddfSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxNjpb
MiwxN10sMTk6WzIsMTddLDIwOlsyLDE3XSwyMjpbMiwxN10sMjM6WzIsMTddLDI1OlsyLDE3XX0s
ezU6WzIsMjBdLDE0OlsyLDIwXSwxNTpbMiwyMF0sMTY6WzIsMjBdLDE5OlsyLDIwXSwyMDpbMiwy
MF0sMjI6WzIsMjBdLDIzOlsyLDIwXSwyNTpbMiwyMF19LHs1OlsyLDIxXSwxNDpbMiwyMV0sMTU6
WzIsMjFdLDE2OlsyLDIxXSwxOTpbMiwyMV0sMjA6WzIsMjFdLDIyOlsyLDIxXSwyMzpbMiwyMV0s
MjU6WzIsMjFdfSx7MTg6WzEsNjZdfSx7MTg6WzIsNDJdfSx7MTg6WzEsNjddfSx7ODoxNyw5OjUs
MTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjA6
WzIsNF0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxODpbMiwyNF0sMjQ6WzIsMjRd
LDM2OlsyLDI0XX0sezE4OlsyLDQ0XSwyNDpbMiw0NF0sMzI6WzIsNDRdLDMzOlsyLDQ0XSwzNDpb
Miw0NF0sMzU6WzIsNDRdLDM2OlsyLDQ0XSw0MDpbMiw0NF0sNDI6WzIsNDRdfSx7MTg6WzIsNDZd
LDI0OlsyLDQ2XSwzNjpbMiw0Nl19LHsxODpbMiwyNl0sMjQ6WzIsMjZdLDMyOlsyLDI2XSwzMzpb
MiwyNl0sMzQ6WzIsMjZdLDM1OlsyLDI2XSwzNjpbMiwyNl0sNDA6WzIsMjZdLDQyOlsyLDI2XX0s
ezE4OlsyLDI3XSwyNDpbMiwyN10sMzI6WzIsMjddLDMzOlsyLDI3XSwzNDpbMiwyN10sMzU6WzIs
MjddLDM2OlsyLDI3XSw0MDpbMiwyN10sNDI6WzIsMjddfSx7MTg6WzIsMjhdLDI0OlsyLDI4XSwz
MjpbMiwyOF0sMzM6WzIsMjhdLDM0OlsyLDI4XSwzNTpbMiwyOF0sMzY6WzIsMjhdLDQwOlsyLDI4
XSw0MjpbMiwyOF19LHsxODpbMiwyOV0sMjQ6WzIsMjldLDMyOlsyLDI5XSwzMzpbMiwyOV0sMzQ6
WzIsMjldLDM1OlsyLDI5XSwzNjpbMiwyOV0sNDA6WzIsMjldLDQyOlsyLDI5XX0sezE4OlsyLDMw
XSwyNDpbMiwzMF0sMzI6WzIsMzBdLDMzOlsyLDMwXSwzNDpbMiwzMF0sMzU6WzIsMzBdLDM2Olsy
LDMwXSw0MDpbMiwzMF0sNDI6WzIsMzBdfSx7MTc6NjgsMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQy
OlsxLDI3XSw0MzoyNn0sezE4OlsyLDMyXSwyNDpbMiwzMl0sMzY6WzIsMzJdLDM5OjY5LDQwOlsx
LDcwXX0sezE4OlsyLDQ3XSwyNDpbMiw0N10sMzY6WzIsNDddLDQwOlsyLDQ3XX0sezE4OlsyLDQw
XSwyNDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQwXSwzNDpbMiw0MF0sMzU6WzIsNDBdLDM2Olsy
LDQwXSw0MDpbMiw0MF0sNDE6WzEsNzFdLDQyOlsyLDQwXSw0NDpbMiw0MF19LHsxODpbMiwzOV0s
MjQ6WzIsMzldLDMyOlsyLDM5XSwzMzpbMiwzOV0sMzQ6WzIsMzldLDM1OlsyLDM5XSwzNjpbMiwz
OV0sNDA6WzIsMzldLDQyOlsyLDM5XSw0NDpbMiwzOV19LHs1OlsyLDIyXSwxNDpbMiwyMl0sMTU6
WzIsMjJdLDE2OlsyLDIyXSwxOTpbMiwyMl0sMjA6WzIsMjJdLDIyOlsyLDIyXSwyMzpbMiwyMl0s
MjU6WzIsMjJdfSx7NTpbMiwxOV0sMTQ6WzIsMTldLDE1OlsyLDE5XSwxNjpbMiwxOV0sMTk6WzIs
MTldLDIwOlsyLDE5XSwyMjpbMiwxOV0sMjM6WzIsMTldLDI1OlsyLDE5XX0sezM2OlsxLDcyXX0s
ezE4OlsyLDQ4XSwyNDpbMiw0OF0sMzY6WzIsNDhdLDQwOlsyLDQ4XX0sezQxOlsxLDcxXX0sezIx
OjU2LDMwOjYwLDMxOjczLDMyOlsxLDU3XSwzMzpbMSw1OF0sMzQ6WzEsNTldLDM1OlsxLDYxXSw0
MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTg6WzIsMzFdLDI0OlsyLDMxXSwzMjpbMiwzMV0s
MzM6WzIsMzFdLDM0OlsyLDMxXSwzNTpbMiwzMV0sMzY6WzIsMzFdLDQwOlsyLDMxXSw0MjpbMiwz
MV19LHsxODpbMiwzM10sMjQ6WzIsMzNdLDM2OlsyLDMzXSw0MDpbMiwzM119XSwKLSAgZGVmYXVs
dEFjdGlvbnM6IHszOlsyLDJdLDE2OlsyLDFdLDUwOlsyLDQyXX0sCi0gIHBhcnNlRXJyb3I6IGZ1
bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3Ioc3Ry
KTsKLSAgfSwKLSAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7Ci0gICAgICB2YXIgc2Vs
ZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB2c3RhY2sgPSBbbnVsbF0sIGxzdGFjayA9IFtdLCB0YWJs
ZSA9IHRoaXMudGFibGUsIHl5dGV4dCA9ICIiLCB5eWxpbmVubyA9IDAsIHl5bGVuZyA9IDAsIHJl
Y292ZXJpbmcgPSAwLCBURVJST1IgPSAyLCBFT0YgPSAxOwotICAgICAgdGhpcy5sZXhlci5zZXRJ
bnB1dChpbnB1dCk7Ci0gICAgICB0aGlzLmxleGVyLnl5ID0gdGhpcy55eTsKLSAgICAgIHRoaXMu
eXkubGV4ZXIgPSB0aGlzLmxleGVyOwotICAgICAgdGhpcy55eS5wYXJzZXIgPSB0aGlzOwotICAg
ICAgaWYgKHR5cGVvZiB0aGlzLmxleGVyLnl5bGxvYyA9PSAidW5kZWZpbmVkIikKLSAgICAgICAg
ICB0aGlzLmxleGVyLnl5bGxvYyA9IHt9OwotICAgICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55
eWxsb2M7Ci0gICAgICBsc3RhY2sucHVzaCh5eWxvYyk7Ci0gICAgICB2YXIgcmFuZ2VzID0gdGhp
cy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4ZXIub3B0aW9ucy5yYW5nZXM7Ci0gICAgICBpZiAo
dHlwZW9mIHRoaXMueXkucGFyc2VFcnJvciA9PT0gImZ1bmN0aW9uIikKLSAgICAgICAgICB0aGlz
LnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7Ci0gICAgICBmdW5jdGlvbiBwb3BTdGFj
ayhuKSB7Ci0gICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47Ci0g
ICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwotICAgICAgICAgIGxz
dGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKLSAgICAgIH0KLSAgICAgIGZ1bmN0aW9u
IGxleCgpIHsKLSAgICAgICAgICB2YXIgdG9rZW47Ci0gICAgICAgICAgdG9rZW4gPSBzZWxmLmxl
eGVyLmxleCgpIHx8IDE7Ci0gICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIp
IHsKLSAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsK
LSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgfQotICAgICAgdmFy
IHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30s
IHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwotICAgICAgICAgIGlmICh0aGlz
LmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgewotICAgICAgICAgICAgICBhY3Rpb24gPSB0aGlzLmRl
ZmF1bHRBY3Rpb25zW3N0YXRlXTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBp
ZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKLSAg
ICAgICAgICAgICAgICAgIHN5bWJvbCA9IGxleCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsKLSAg
ICAgICAgICB9Ci0gICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICJ1bmRlZmluZWQiIHx8
ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0pIHsKLSAgICAgICAgICAgICAgdmFyIGVyclN0
ciA9ICIiOwotICAgICAgICAgICAgICBpZiAoIXJlY292ZXJpbmcpIHsKLSAgICAgICAgICAgICAg
ICAgIGV4cGVjdGVkID0gW107Ci0gICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3Rh
dGVdKQotICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+
IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaCgiJyIgKyB0aGlz
LnRlcm1pbmFsc19bcF0gKyAiJyIpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgIGlmICh0aGlzLmxleGVyLnNob3dQb3NpdGlvbikgewotICAgICAgICAgICAgICAg
ICAgICAgIGVyclN0ciA9ICJQYXJzZSBlcnJvciBvbiBsaW5lICIgKyAoeXlsaW5lbm8gKyAxKSAr
ICI6XG4iICsgdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSArICJcbkV4cGVjdGluZyAiICsgZXhw
ZWN0ZWQuam9pbigiLCAiKSArICIsIGdvdCAnIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8
fCBzeW1ib2wpICsgIiciOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsg
MSkgKyAiOiBVbmV4cGVjdGVkICIgKyAoc3ltYm9sID09IDE/ImVuZCBvZiBpbnB1dCI6IiciICsg
KHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyAiJyIpOwotICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwge3RleHQ6
IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1i
b2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBl
Y3RlZH0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhY3Rp
b25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkgewotICAgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3Np
YmxlIGF0IHN0YXRlOiAiICsgc3RhdGUgKyAiLCB0b2tlbjogIiArIHN5bWJvbCk7Ci0gICAgICAg
ICAgfQotICAgICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7Ci0gICAgICAgICAgY2FzZSAxOgot
ICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7Ci0gICAgICAgICAgICAgIHZzdGFjay5w
dXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKLSAgICAgICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5s
ZXhlci55eWxsb2MpOwotICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7Ci0gICAg
ICAgICAgICAgIHN5bWJvbCA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1i
b2wpIHsKLSAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwotICAg
ICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7Ci0gICAgICAgICAgICAg
ICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXlsaW5lbm87Ci0gICAgICAgICAgICAgICAgICB5
eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwotICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJp
bmcgPiAwKQotICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJpbmctLTsKLSAgICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOwot
ICAgICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBudWxsOwotICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAg
bGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKLSAgICAgICAgICAgICAgeXl2
YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTsKLSAgICAgICAgICAgICAgeXl2YWwu
XyQgPSB7Zmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJz
dF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBm
aXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29s
dW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbn07
Ci0gICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKLSAgICAgICAgICAgICAgICAgIHl5dmFsLl8k
LnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxz
dGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwotICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxl
bmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25bMV0sIHZzdGFjaywgbHN0YWNrKTsKLSAgICAg
ICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewotICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGxlbikgewot
ICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLCAtMSAqIGxlbiAqIDIpOwot
ICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTsKLSAg
ICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7Ci0gICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1th
Y3Rpb25bMV1dWzBdKTsKLSAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7Ci0gICAg
ICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTsKLSAgICAgICAgICAgICAgbmV3U3RhdGUg
PSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1d
OwotICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB9OwotCi0KLSAgZnVu
Y3Rpb24gc3RyaXBGbGFncyhvcGVuLCBjbG9zZSkgewotICAgIHJldHVybiB7Ci0gICAgICBsZWZ0
OiBvcGVuLmNoYXJBdCgyKSA9PT0gJ34nLAotICAgICAgcmlnaHQ6IGNsb3NlLmNoYXJBdCgwKSA9
PT0gJ34nIHx8IGNsb3NlLmNoYXJBdCgxKSA9PT0gJ34nCi0gICAgfTsKLSAgfQotCi0gIC8qIEpp
c29uIGdlbmVyYXRlZCBsZXhlciAqLwotICB2YXIgbGV4ZXIgPSAoZnVuY3Rpb24oKXsKLSAgdmFy
IGxleGVyID0gKHtFT0Y6MSwKLSAgcGFyc2VFcnJvcjpmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwg
aGFzaCkgewotICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewotICAgICAgICAgICAgICB0
aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7Ci0gICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7Ci0gICAgICAgICAgfQotICAgICAg
fSwKLSAgc2V0SW5wdXQ6ZnVuY3Rpb24gKGlucHV0KSB7Ci0gICAgICAgICAgdGhpcy5faW5wdXQg
PSBpbnB1dDsKLSAgICAgICAgICB0aGlzLl9tb3JlID0gdGhpcy5fbGVzcyA9IHRoaXMuZG9uZSA9
IGZhbHNlOwotICAgICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7Ci0gICAg
ICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7Ci0gICAg
ICAgICAgdGhpcy5jb25kaXRpb25TdGFjayA9IFsnSU5JVElBTCddOwotICAgICAgICAgIHRoaXMu
eXlsbG9jID0ge2ZpcnN0X2xpbmU6MSxmaXJzdF9jb2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2Nv
bHVtbjowfTsKLSAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2Mu
cmFuZ2UgPSBbMCwwXTsKLSAgICAgICAgICB0aGlzLm9mZnNldCA9IDA7Ci0gICAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgICB9LAotICBpbnB1dDpmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgdmFy
IGNoID0gdGhpcy5faW5wdXRbMF07Ci0gICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7Ci0gICAg
ICAgICAgdGhpcy55eWxlbmcrKzsKLSAgICAgICAgICB0aGlzLm9mZnNldCsrOwotICAgICAgICAg
IHRoaXMubWF0Y2ggKz0gY2g7Ci0gICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwotICAgICAg
ICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKLSAgICAgICAgICBp
ZiAobGluZXMpIHsKLSAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwotICAgICAgICAgICAg
ICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBp
ZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKLQotICAgICAg
ICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UoMSk7Ci0gICAgICAgICAgcmV0dXJu
IGNoOwotICAgICAgfSwKLSAgdW5wdXQ6ZnVuY3Rpb24gKGNoKSB7Ci0gICAgICAgICAgdmFyIGxl
biA9IGNoLmxlbmd0aDsKLSAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98
XG4pL2cpOwotCi0gICAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0OwotICAg
ICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxl
bmd0aC1sZW4tMSk7Ci0gICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47Ci0gICAgICAgICAg
dGhpcy5vZmZzZXQgLT0gbGVuOwotICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2gu
c3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKLSAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRj
aC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGgtMSk7Ci0gICAgICAgICAgdGhpcy5tYXRjaGVk
ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoLTEpOwotCi0gICAg
ICAgICAgaWYgKGxpbmVzLmxlbmd0aC0xKSB0aGlzLnl5bGluZW5vIC09IGxpbmVzLmxlbmd0aC0x
OwotICAgICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7Ci0KLSAgICAgICAgICB0aGlz
Lnl5bGxvYyA9IHtmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJzdF9saW5lLAotICAgICAgICAg
ICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEsCi0gICAgICAgICAgICBmaXJzdF9jb2x1bW46
IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiwKLSAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5l
cyA/Ci0gICAgICAgICAgICAgICAgKGxpbmVzLmxlbmd0aCA9PT0gb2xkTGluZXMubGVuZ3RoID8g
dGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkgKyBvbGRMaW5lc1tvbGRMaW5lcy5sZW5ndGgg
LSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVzWzBdLmxlbmd0aDoKLSAgICAgICAgICAgICAg
ICB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KLSAgICAgICAgICAgIH07Ci0KLSAgICAg
ICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewotICAgICAgICAgICAgICB0aGlzLnl5bGxv
Yy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwotICAgICAgICAgIH0K
LSAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0sCi0gIG1vcmU6ZnVuY3Rpb24gKCkgewot
ICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwotICAgICAgICAgIHJldHVybiB0aGlzOwotICAg
ICAgfSwKLSAgbGVzczpmdW5jdGlvbiAobikgewotICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5t
YXRjaC5zbGljZShuKSk7Ci0gICAgICB9LAotICBwYXN0SW5wdXQ6ZnVuY3Rpb24gKCkgewotICAg
ICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVu
Z3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpOwotICAgICAgICAgIHJldHVybiAocGFzdC5sZW5ndGgg
PiAyMCA/ICcuLi4nOicnKSArIHBhc3Quc3Vic3RyKC0yMCkucmVwbGFjZSgvXG4vZywgIiIpOwot
ICAgICAgfSwKLSAgdXBjb21pbmdJbnB1dDpmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgdmFyIG5l
eHQgPSB0aGlzLm1hdGNoOwotICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7Ci0gICAg
ICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQuc3Vic3RyKDAsIDIwLW5leHQubGVuZ3RoKTsK
LSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSsobmV4dC5s
ZW5ndGggPiAyMCA/ICcuLi4nOicnKSkucmVwbGFjZSgvXG4vZywgIiIpOwotICAgICAgfSwKLSAg
c2hvd1Bvc2l0aW9uOmZ1bmN0aW9uICgpIHsKLSAgICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0
SW5wdXQoKTsKLSAgICAgICAgICB2YXIgYyA9IG5ldyBBcnJheShwcmUubGVuZ3RoICsgMSkuam9p
bigiLSIpOwotICAgICAgICAgIHJldHVybiBwcmUgKyB0aGlzLnVwY29taW5nSW5wdXQoKSArICJc
biIgKyBjKyJeIjsKLSAgICAgIH0sCi0gIG5leHQ6ZnVuY3Rpb24gKCkgewotICAgICAgICAgIGlm
ICh0aGlzLmRvbmUpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAgICAg
IH0KLSAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwotCi0gICAg
ICAgICAgdmFyIHRva2VuLAotICAgICAgICAgICAgICBtYXRjaCwKLSAgICAgICAgICAgICAgdGVt
cE1hdGNoLAotICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgY29sLAotICAgICAg
ICAgICAgICBsaW5lczsKLSAgICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHsKLSAgICAgICAgICAg
ICAgdGhpcy55eXRleHQgPSAnJzsKLSAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9ICcnOwotICAg
ICAgICAgIH0KLSAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLl9jdXJyZW50UnVsZXMoKTsKLSAg
ICAgICAgICBmb3IgKHZhciBpPTA7aSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAg
ICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTsK
LSAgICAgICAgICAgICAgaWYgKHRlbXBNYXRjaCAmJiAoIW1hdGNoIHx8IHRlbXBNYXRjaFswXS5s
ZW5ndGggPiBtYXRjaFswXS5sZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgICBtYXRjaCA9IHRl
bXBNYXRjaDsKLSAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAg
IGlmICghdGhpcy5vcHRpb25zLmZsZXgpIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgfQotICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICBsaW5lcyA9IG1hdGNo
WzBdLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKLSAgICAgICAgICAgICAgaWYgKGxpbmVzKSB0
aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDsKLSAgICAgICAgICAgICAgdGhpcy55eWxsb2Mg
PSB7Zmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBsYXN0X2xpbmU6IHRoaXMueXlsaW5lbm8rMSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID8gbGluZXNbbGluZXMu
bGVuZ3RoLTFdLmxlbmd0aC1saW5lc1tsaW5lcy5sZW5ndGgtMV0ubWF0Y2goL1xyP1xuPy8pWzBd
Lmxlbmd0aCA6IHRoaXMueXlsbG9jLmxhc3RfY29sdW1uICsgbWF0Y2hbMF0ubGVuZ3RofTsKLSAg
ICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07Ci0gICAgICAgICAgICAgIHRoaXMu
bWF0Y2ggKz0gbWF0Y2hbMF07Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwot
ICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKLSAgICAgICAg
ICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKLSAgICAgICAgICAgICAgICAgIHRoaXMu
eXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107
Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwotICAg
ICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0
aCk7Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKLSAgICAgICAgICAg
ICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBy
dWxlc1tpbmRleF0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0
aC0xXSk7Ci0gICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMu
ZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjsKLSAg
ICAgICAgICAgICAgZWxzZSByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh0aGlz
Ll9pbnB1dCA9PT0gIiIpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGlj
YWwgZXJyb3Igb24gbGluZSAnKyh0aGlzLnl5bGluZW5vKzEpKycuIFVucmVjb2duaXplZCB0ZXh0
LlxuJyt0aGlzLnNob3dQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgIHt0ZXh0OiAi
IiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm99KTsKLSAgICAgICAgICB9Ci0gICAg
ICB9LAotICBsZXg6ZnVuY3Rpb24gbGV4KCkgewotICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0
KCk7Ci0gICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAg
ICAgICByZXR1cm4gcjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4g
dGhpcy5sZXgoKTsKLSAgICAgICAgICB9Ci0gICAgICB9LAotICBiZWdpbjpmdW5jdGlvbiBiZWdp
bihjb25kaXRpb24pIHsKLSAgICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrLnB1c2goY29uZGl0
aW9uKTsKLSAgICAgIH0sCi0gIHBvcFN0YXRlOmZ1bmN0aW9uIHBvcFN0YXRlKCkgewotICAgICAg
ICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNrLnBvcCgpOwotICAgICAgfSwKLSAgX2N1cnJl
bnRSdWxlczpmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewotICAgICAgICAgIHJldHVybiB0aGlz
LmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0
aC0xXV0ucnVsZXM7Ci0gICAgICB9LAotICB0b3BTdGF0ZTpmdW5jdGlvbiAoKSB7Ci0gICAgICAg
ICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgt
Ml07Ci0gICAgICB9LAotICBwdXNoU3RhdGU6ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7Ci0g
ICAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pOwotICAgICAgfX0pOwotICBsZXhlci5vcHRp
b25zID0ge307Ci0gIGxleGVyLnBlcmZvcm1BY3Rpb24gPSBmdW5jdGlvbiBhbm9ueW1vdXMoeXks
eXlfLCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsWVlfU1RBUlQpIHsKLQotCi0gIGZ1bmN0aW9u
IHN0cmlwKHN0YXJ0LCBlbmQpIHsKLSAgICByZXR1cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQu
c3Vic3RyKHN0YXJ0LCB5eV8ueXlsZW5nLWVuZCk7Ci0gIH0KLQotCi0gIHZhciBZWVNUQVRFPVlZ
X1NUQVJUCi0gIHN3aXRjaCgkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zKSB7Ci0gIGNhc2UgMDoK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNl
KC0yKSA9PT0gIlxcXFwiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdHJpcCgwLDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhp
cy5iZWdpbigibXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgaWYoeXlfLnl5dGV4dC5zbGljZSgtMSkgPT09ICJcXCIpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5
dGV4dCkgcmV0dXJuIDE0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAg
YnJlYWs7Ci0gIGNhc2UgMTpyZXR1cm4gMTQ7Ci0gIGJyZWFrOwotICBjYXNlIDI6Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCi0gIGJyZWFrOwotICBjYXNlIDM6c3RyaXAoMCw0KTsgdGhpcy5w
b3BTdGF0ZSgpOyByZXR1cm4gMTU7Ci0gIGJyZWFrOwotICBjYXNlIDQ6cmV0dXJuIDM1OwotICBi
cmVhazsKLSAgY2FzZSA1OnJldHVybiAzNjsKLSAgYnJlYWs7Ci0gIGNhc2UgNjpyZXR1cm4gMjU7
Ci0gIGJyZWFrOwotICBjYXNlIDc6cmV0dXJuIDE2OwotICBicmVhazsKLSAgY2FzZSA4OnJldHVy
biAyMDsKLSAgYnJlYWs7Ci0gIGNhc2UgOTpyZXR1cm4gMTk7Ci0gIGJyZWFrOwotICBjYXNlIDEw
OnJldHVybiAxOTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTE6cmV0dXJuIDIzOwotICBicmVhazsKLSAg
Y2FzZSAxMjpyZXR1cm4gMjI7Ci0gIGJyZWFrOwotICBjYXNlIDEzOnRoaXMucG9wU3RhdGUoKTsg
dGhpcy5iZWdpbignY29tJyk7Ci0gIGJyZWFrOwotICBjYXNlIDE0OnN0cmlwKDMsNSk7IHRoaXMu
cG9wU3RhdGUoKTsgcmV0dXJuIDE1OwotICBicmVhazsKLSAgY2FzZSAxNTpyZXR1cm4gMjI7Ci0g
IGJyZWFrOwotICBjYXNlIDE2OnJldHVybiA0MTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTc6cmV0dXJu
IDQwOwotICBicmVhazsKLSAgY2FzZSAxODpyZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDE5
OnJldHVybiA0NDsKLSAgYnJlYWs7Ci0gIGNhc2UgMjA6Ly8gaWdub3JlIHdoaXRlc3BhY2UKLSAg
YnJlYWs7Ci0gIGNhc2UgMjE6dGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMjQ7Ci0gIGJyZWFrOwot
ICBjYXNlIDIyOnRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDE4OwotICBicmVhazsKLSAgY2FzZSAy
Mzp5eV8ueXl0ZXh0ID0gc3RyaXAoMSwyKS5yZXBsYWNlKC9cXCIvZywnIicpOyByZXR1cm4gMzI7
Ci0gIGJyZWFrOwotICBjYXNlIDI0Onl5Xy55eXRleHQgPSBzdHJpcCgxLDIpLnJlcGxhY2UoL1xc
Jy9nLCInIik7IHJldHVybiAzMjsKLSAgYnJlYWs7Ci0gIGNhc2UgMjU6cmV0dXJuIDQyOwotICBi
cmVhazsKLSAgY2FzZSAyNjpyZXR1cm4gMzQ7Ci0gIGJyZWFrOwotICBjYXNlIDI3OnJldHVybiAz
NDsKLSAgYnJlYWs7Ci0gIGNhc2UgMjg6cmV0dXJuIDMzOwotICBicmVhazsKLSAgY2FzZSAyOTpy
ZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMwOnl5Xy55eXRleHQgPSBzdHJpcCgxLDIpOyBy
ZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMxOnJldHVybiAnSU5WQUxJRCc7Ci0gIGJyZWFr
OwotICBjYXNlIDMyOnJldHVybiA1OwotICBicmVhazsKLSAgfQotICB9OwotICBsZXhlci5ydWxl
cyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywvXig/OlteXHgwMF0rKS8sL14oPzpbXlx4
MDBdezIsfT8oPz0oXHtce3xcXFx7XHt8XFxcXFx7XHt8JCkpKS8sL14oPzpbXHNcU10qPy0tXH1c
fSkvLC9eKD86XCgpLywvXig/OlwpKS8sL14oPzpce1x7KH4pPz4pLywvXig/Olx7XHsofik/Iykv
LC9eKD86XHtceyh+KT9cLykvLC9eKD86XHtceyh+KT9cXikvLC9eKD86XHtceyh+KT9ccyplbHNl
XGIpLywvXig/Olx7XHsofik/XHspLywvXig/Olx7XHsofik/JikvLC9eKD86XHtceyEtLSkvLC9e
KD86XHtceyFbXHNcU10qP1x9XH0pLywvXig/Olx7XHsofik/KS8sL14oPzo9KS8sL14oPzpcLlwu
KS8sL14oPzpcLig/PShbPX59XHNcLy4pXSkpKS8sL14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14o
PzpcfSh+KT9cfVx9KS8sL14oPzoofik/XH1cfSkvLC9eKD86IihcXFsiXXxbXiJdKSoiKS8sL14o
PzonKFxcWyddfFteJ10pKicpLywvXig/OkApLywvXig/OnRydWUoPz0oW359XHMpXSkpKS8sL14o
PzpmYWxzZSg/PShbfn1ccyldKSkpLywvXig/Oi0/WzAtOV0rKD89KFt+fVxzKV0pKSkvLC9eKD86
KFteXHMhIiMlLSxcLlwvOy0+QFxbLVxeYFx7LX5dKyg/PShbPX59XHNcLy4pXSkpKSkvLC9eKD86
XFtbXlxdXSpcXSkvLC9eKD86LikvLC9eKD86JCkvXTsKLSAgbGV4ZXIuY29uZGl0aW9ucyA9IHsi
bXUiOnsicnVsZXMiOls0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwy
MCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl0sImluY2x1c2l2ZSI6ZmFsc2V9
LCJlbXUiOnsicnVsZXMiOlsyXSwiaW5jbHVzaXZlIjpmYWxzZX0sImNvbSI6eyJydWxlcyI6WzNd
LCJpbmNsdXNpdmUiOmZhbHNlfSwiSU5JVElBTCI6eyJydWxlcyI6WzAsMSwzMl0sImluY2x1c2l2
ZSI6dHJ1ZX19OwotICByZXR1cm4gbGV4ZXI7fSkoKQotICBwYXJzZXIubGV4ZXIgPSBsZXhlcjsK
LSAgZnVuY3Rpb24gUGFyc2VyICgpIHsgdGhpcy55eSA9IHt9OyB9UGFyc2VyLnByb3RvdHlwZSA9
IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2VyOwotICByZXR1cm4gbmV3IFBhcnNlcjsKLSAg
fSkoKTtfX2V4cG9ydHNfXyA9IGhhbmRsZWJhcnM7Ci0gIC8qIGpzaGludCBpZ25vcmU6ZW5kICov
Ci0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKCk7Ci0KLS8vIGhhbmRsZWJhcnMvY29tcGlsZXIv
YmFzZS5qcwotdmFyIF9fbW9kdWxlOF9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19k
ZXBlbmRlbmN5Ml9fKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fID0ge307
Ci0gIHZhciBwYXJzZXIgPSBfX2RlcGVuZGVuY3kxX187Ci0gIHZhciBBU1QgPSBfX2RlcGVuZGVu
Y3kyX187Ci0KLSAgX19leHBvcnRzX18ucGFyc2VyID0gcGFyc2VyOwotCi0gIGZ1bmN0aW9uIHBh
cnNlKGlucHV0KSB7Ci0gICAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlIEFT
VCB3YXMgcGFzc2VkIGluLgotICAgIGlmKGlucHV0LmNvbnN0cnVjdG9yID09PSBBU1QuUHJvZ3Jh
bU5vZGUpIHsgcmV0dXJuIGlucHV0OyB9Ci0KLSAgICBwYXJzZXIueXkgPSBBU1Q7Ci0gICAgcmV0
dXJuIHBhcnNlci5wYXJzZShpbnB1dCk7Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5wYXJzZSA9IHBh
cnNlOwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTlfXywgX19tb2R1bGU3X18p
OwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2NvbXBpbGVyLmpzCi12YXIgX19tb2R1bGUxMF9f
ID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAidXNlIHN0cmljdCI7Ci0gIHZhciBf
X2V4cG9ydHNfXyA9IHt9OwotICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5MV9fOwotCi0g
IGZ1bmN0aW9uIENvbXBpbGVyKCkge30KLQotICBfX2V4cG9ydHNfXy5Db21waWxlciA9IENvbXBp
bGVyOy8vIHRoZSBmb3VuZEhlbHBlciByZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIg
bG9va3VwIGZyb20gZmluZGluZyBhCi0gIC8vIGZ1bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBp
cyBuZWNlc3NhcnkgZm9yIG11c3RhY2hlIGNvbXBhdGliaWxpdHksIHdoaWNoCi0gIC8vIHJlcXVp
cmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxv
Y2tIZWxwZXJNaXNzaW5nLAotICAvLyBhbmQgdGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRp
bmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJsb2NrSGVscGVyTWlzc2luZy4KLQotICBDb21waWxl
ci5wcm90b3R5cGUgPSB7Ci0gICAgY29tcGlsZXI6IENvbXBpbGVyLAotCi0gICAgZGlzYXNzZW1i
bGU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG9wY29kZXMgPSB0aGlzLm9wY29kZXMsIG9wY29k
ZSwgb3V0ID0gW10sIHBhcmFtcywgcGFyYW07Ci0KLSAgICAgIGZvciAodmFyIGk9MCwgbD1vcGNv
ZGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKLQot
ICAgICAgICBpZiAob3Bjb2RlLm9wY29kZSA9PT0gJ0RFQ0xBUkUnKSB7Ci0gICAgICAgICAgb3V0
LnB1c2goIkRFQ0xBUkUgIiArIG9wY29kZS5uYW1lICsgIj0iICsgb3Bjb2RlLnZhbHVlKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwYXJhbXMgPSBbXTsKLSAgICAgICAgICBmb3IgKHZh
ciBqPTA7IGo8b3Bjb2RlLmFyZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIHBhcmFtID0g
b3Bjb2RlLmFyZ3Nbal07Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAic3RyaW5n
IikgewotICAgICAgICAgICAgICBwYXJhbSA9ICJcIiIgKyBwYXJhbS5yZXBsYWNlKCJcbiIsICJc
XG4iKSArICJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbXMucHVzaChwYXJh
bSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5wdXNoKG9wY29kZS5vcGNvZGUgKyAiICIg
KyBwYXJhbXMuam9pbigiICIpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4g
b3V0LmpvaW4oIlxuIik7Ci0gICAgfSwKLQotICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHsK
LSAgICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwotICAgICAgaWYgKG90aGVyLm9w
Y29kZXMubGVuZ3RoICE9PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQot
Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHZhciBvcGNv
ZGUgPSB0aGlzLm9wY29kZXNbaV0sCi0gICAgICAgICAgICBvdGhlck9wY29kZSA9IG90aGVyLm9w
Y29kZXNbaV07Ci0gICAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNv
ZGUgfHwgb3Bjb2RlLmFyZ3MubGVuZ3RoICE9PSBvdGhlck9wY29kZS5hcmdzLmxlbmd0aCkgewot
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHZhciBqID0g
MDsgaiA8IG9wY29kZS5hcmdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgaWYgKG9wY29kZS5h
cmdzW2pdICE9PSBvdGhlck9wY29kZS5hcmdzW2pdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGxlbiA9IHRoaXMu
Y2hpbGRyZW4ubGVuZ3RoOwotICAgICAgaWYgKG90aGVyLmNoaWxkcmVuLmxlbmd0aCAhPT0gbGVu
KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkg
PCBsZW47IGkrKykgewotICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW5baV0uZXF1YWxzKG90aGVy
LmNoaWxkcmVuW2ldKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
ICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9LAotCi0gICAgZ3VpZDogMCwKLQotICAg
IGNvbXBpbGU6IGZ1bmN0aW9uKHByb2dyYW0sIG9wdGlvbnMpIHsKLSAgICAgIHRoaXMub3Bjb2Rl
cyA9IFtdOwotICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwotICAgICAgdGhpcy5kZXB0aHMgPSB7
bGlzdDogW119OwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQotICAgICAgLy8gVGhl
c2UgY2hhbmdlcyB3aWxsIHByb3BhZ2F0ZSB0byB0aGUgb3RoZXIgY29tcGlsZXIgY29tcG9uZW50
cwotICAgICAgdmFyIGtub3duSGVscGVycyA9IHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnM7Ci0g
ICAgICB0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzID0gewotICAgICAgICAnaGVscGVyTWlzc2lu
Zyc6IHRydWUsCi0gICAgICAgICdibG9ja0hlbHBlck1pc3NpbmcnOiB0cnVlLAotICAgICAgICAn
ZWFjaCc6IHRydWUsCi0gICAgICAgICdpZic6IHRydWUsCi0gICAgICAgICd1bmxlc3MnOiB0cnVl
LAotICAgICAgICAnd2l0aCc6IHRydWUsCi0gICAgICAgICdsb2cnOiB0cnVlCi0gICAgICB9Owot
ICAgICAgaWYgKGtub3duSGVscGVycykgewotICAgICAgICBmb3IgKHZhciBuYW1lIGluIGtub3du
SGVscGVycykgewotICAgICAgICAgIHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0gPSBr
bm93bkhlbHBlcnNbbmFtZV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRo
aXMuYWNjZXB0KHByb2dyYW0pOwotICAgIH0sCi0KLSAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUp
IHsKLSAgICAgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge30sCi0gICAgICAgICAgcmV0Owot
ICAgICAgaWYgKHN0cmlwLmxlZnQpIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3N0cmlwJyk7Ci0g
ICAgICB9Ci0KLSAgICAgIHJldCA9IHRoaXNbbm9kZS50eXBlXShub2RlKTsKLQotICAgICAgaWYg
KHN0cmlwLnJpZ2h0KSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdzdHJpcCcpOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0sCi0KLSAgICBwcm9ncmFtOiBmdW5jdGlvbihwcm9n
cmFtKSB7Ci0gICAgICB2YXIgc3RhdGVtZW50cyA9IHByb2dyYW0uc3RhdGVtZW50czsKLQotICAg
ICAgZm9yKHZhciBpPTAsIGw9c3RhdGVtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAg
IHRoaXMuYWNjZXB0KHN0YXRlbWVudHNbaV0pOwotICAgICAgfQotICAgICAgdGhpcy5pc1NpbXBs
ZSA9IGwgPT09IDE7Ci0KLSAgICAgIHRoaXMuZGVwdGhzLmxpc3QgPSB0aGlzLmRlcHRocy5saXN0
LnNvcnQoZnVuY3Rpb24oYSwgYikgewotICAgICAgICByZXR1cm4gYSAtIGI7Ci0gICAgICB9KTsK
LQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIGNvbXBpbGVQcm9ncmFtOiBmdW5j
dGlvbihwcm9ncmFtKSB7Ci0gICAgICB2YXIgcmVzdWx0ID0gbmV3IHRoaXMuY29tcGlsZXIoKS5j
b21waWxlKHByb2dyYW0sIHRoaXMub3B0aW9ucyk7Ci0gICAgICB2YXIgZ3VpZCA9IHRoaXMuZ3Vp
ZCsrLCBkZXB0aDsKLQotICAgICAgdGhpcy51c2VQYXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8
IHJlc3VsdC51c2VQYXJ0aWFsOwotCi0gICAgICB0aGlzLmNoaWxkcmVuW2d1aWRdID0gcmVzdWx0
OwotCi0gICAgICBmb3IodmFyIGk9MCwgbD1yZXN1bHQuZGVwdGhzLmxpc3QubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgICAgICBkZXB0aCA9IHJlc3VsdC5kZXB0aHMubGlzdFtpXTsKLQotICAgICAg
ICBpZihkZXB0aCA8IDIpIHsgY29udGludWU7IH0KLSAgICAgICAgZWxzZSB7IHRoaXMuYWRkRGVw
dGgoZGVwdGggLSAxKTsgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gZ3VpZDsKLSAgICB9LAot
Ci0gICAgYmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7Ci0gICAgICB2YXIgbXVzdGFjaGUgPSBibG9j
ay5tdXN0YWNoZSwKLSAgICAgICAgICBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSwKLSAgICAgICAg
ICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKLQotICAgICAgaWYgKHByb2dyYW0pIHsKLSAgICAg
ICAgcHJvZ3JhbSA9IHRoaXMuY29tcGlsZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAg
ICAgIGlmIChpbnZlcnNlKSB7Ci0gICAgICAgIGludmVyc2UgPSB0aGlzLmNvbXBpbGVQcm9ncmFt
KGludmVyc2UpOwotICAgICAgfQotCi0gICAgICB2YXIgc2V4cHIgPSBtdXN0YWNoZS5zZXhwcjsK
LSAgICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKHNleHByKTsKLQotICAgICAgaWYg
KHR5cGUgPT09ICJoZWxwZXIiKSB7Ci0gICAgICAgIHRoaXMuaGVscGVyU2V4cHIoc2V4cHIsIHBy
b2dyYW0sIGludmVyc2UpOwotICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAic2ltcGxlIikgewot
ICAgICAgICB0aGlzLnNpbXBsZVNleHByKHNleHByKTsKLQotICAgICAgICAvLyBub3cgdGhhdCB0
aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvCi0gICAgICAgIC8vIGV2
YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYAotICAgICAgICB0aGlz
Lm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1
c2hQcm9ncmFtJywgaW52ZXJzZSk7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsK
LSAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpOwotCi0gICAg
ICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQg
dG8KLSAgICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3Np
bmdgCi0gICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwotICAgICAg
ICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKLSAgICAgICAgdGhpcy5vcGNv
ZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3VzQmxvY2tWYWx1
ZScpOwotICAgICAgfQotCi0gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7Ci0gICAgfSwKLQot
ICAgIGhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICAgIHZhciBwYWlycyA9IGhhc2gucGFpcnMs
IHBhaXIsIHZhbDsKLQotICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7Ci0KLSAgICAgIGZv
cih2YXIgaT0wLCBsPXBhaXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgcGFpciA9IHBh
aXJzW2ldOwotICAgICAgICB2YWwgID0gcGFpclsxXTsKLQotICAgICAgICBpZiAodGhpcy5vcHRp
b25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICAgIGlmKHZhbC5kZXB0aCkgewotICAgICAgICAg
ICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aGlz
Lm9wY29kZSgnZ2V0Q29udGV4dCcsIHZhbC5kZXB0aCB8fCAwKTsKLSAgICAgICAgICB0aGlzLm9w
Y29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsLnN0cmluZ01vZGVWYWx1ZSwgdmFsLnR5cGUpOwot
Ci0gICAgICAgICAgaWYgKHZhbC50eXBlID09PSAnc2V4cHInKSB7Ci0gICAgICAgICAgICAvLyBT
dWJleHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KLSAgICAgICAgICAgIC8v
IGluIHN0cmluZyBwYXJhbXMgbW9kZS4KLSAgICAgICAgICAgIHRoaXMuc2V4cHIodmFsKTsKLSAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhpcy5hY2NlcHQodmFsKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyWzBd
KTsKLSAgICAgIH0KLSAgICAgIHRoaXMub3Bjb2RlKCdwb3BIYXNoJyk7Ci0gICAgfSwKLQotICAg
IHBhcnRpYWw6IGZ1bmN0aW9uKHBhcnRpYWwpIHsKLSAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBh
cnRpYWwucGFydGlhbE5hbWU7Ci0gICAgICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlOwotCi0gICAg
ICBpZihwYXJ0aWFsLmNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5JRChwYXJ0aWFsLmNvbnRleHQp
OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2gnLCAnZGVwdGgwJyk7
Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VQYXJ0aWFsJywgcGFydGlhbE5h
bWUubmFtZSk7Ci0gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7Ci0gICAgfSwKLQotICAgIGNv
bnRlbnQ6IGZ1bmN0aW9uKGNvbnRlbnQpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250
ZW50JywgY29udGVudC5zdHJpbmcpOwotICAgIH0sCi0KLSAgICBtdXN0YWNoZTogZnVuY3Rpb24o
bXVzdGFjaGUpIHsKLSAgICAgIHRoaXMuc2V4cHIobXVzdGFjaGUuc2V4cHIpOwotCi0gICAgICBp
ZihtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKLSAgICAgICAg
dGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRo
aXMub3Bjb2RlKCdhcHBlbmQnKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgYW1iaWd1b3VzU2V4
cHI6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7Ci0gICAgICB2YXIgaWQgPSBz
ZXhwci5pZCwKLSAgICAgICAgICBuYW1lID0gaWQucGFydHNbMF0sCi0gICAgICAgICAgaXNCbG9j
ayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7Ci0KLSAgICAgIHRoaXMub3Bj
b2RlKCdnZXRDb250ZXh0JywgaWQuZGVwdGgpOwotCi0gICAgICB0aGlzLm9wY29kZSgncHVzaFBy
b2dyYW0nLCBwcm9ncmFtKTsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVy
c2UpOwotCi0gICAgICB0aGlzLm9wY29kZSgnaW52b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9j
ayk7Ci0gICAgfSwKLQotICAgIHNpbXBsZVNleHByOiBmdW5jdGlvbihzZXhwcikgewotICAgICAg
dmFyIGlkID0gc2V4cHIuaWQ7Ci0KLSAgICAgIGlmIChpZC50eXBlID09PSAnREFUQScpIHsKLSAg
ICAgICAgdGhpcy5EQVRBKGlkKTsKLSAgICAgIH0gZWxzZSBpZiAoaWQucGFydHMubGVuZ3RoKSB7
Ci0gICAgICAgIHRoaXMuSUQoaWQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU2ltcGxp
ZmllZCBJRCBmb3IgYHRoaXNgCi0gICAgICAgIHRoaXMuYWRkRGVwdGgoaWQuZGVwdGgpOwotICAg
ICAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIGlkLmRlcHRoKTsKLSAgICAgICAgdGhpcy5v
cGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdyZXNv
bHZlUG9zc2libGVMYW1iZGEnKTsKLSAgICB9LAotCi0gICAgaGVscGVyU2V4cHI6IGZ1bmN0aW9u
KHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7Ci0gICAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1
cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSksCi0gICAgICAgICAg
bmFtZSA9IHNleHByLmlkLnBhcnRzWzBdOwotCi0gICAgICBpZiAodGhpcy5vcHRpb25zLmtub3du
SGVscGVyc1tuYW1lXSkgewotICAgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXIn
LCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKLSAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtu
b3duSGVscGVyc09ubHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiWW91IHNwZWNp
ZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgIiArIG5h
bWUsIHNleHByKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VI
ZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lLCBzZXhwci5pc1Jvb3QpOwotICAgICAgfQotICAg
IH0sCi0KLSAgICBzZXhwcjogZnVuY3Rpb24oc2V4cHIpIHsKLSAgICAgIHZhciB0eXBlID0gdGhp
cy5jbGFzc2lmeVNleHByKHNleHByKTsKLQotICAgICAgaWYgKHR5cGUgPT09ICJzaW1wbGUiKSB7
Ci0gICAgICAgIHRoaXMuc2ltcGxlU2V4cHIoc2V4cHIpOwotICAgICAgfSBlbHNlIGlmICh0eXBl
ID09PSAiaGVscGVyIikgewotICAgICAgICB0aGlzLmhlbHBlclNleHByKHNleHByKTsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwotICAgICAgfQot
ICAgIH0sCi0KLSAgICBJRDogZnVuY3Rpb24oaWQpIHsKLSAgICAgIHRoaXMuYWRkRGVwdGgoaWQu
ZGVwdGgpOwotICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBpZC5kZXB0aCk7Ci0KLSAg
ICAgIHZhciBuYW1lID0gaWQucGFydHNbMF07Ci0gICAgICBpZiAoIW5hbWUpIHsKLSAgICAgICAg
dGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlz
Lm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgaWQucGFydHNbMF0pOwotICAgICAgfQotCi0gICAg
ICBmb3IodmFyIGk9MSwgbD1pZC5wYXJ0cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHRo
aXMub3Bjb2RlKCdsb29rdXAnLCBpZC5wYXJ0c1tpXSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAg
IERBVEE6IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gdHJ1ZTsK
LSAgICAgIGlmIChkYXRhLmlkLmlzU2NvcGVkIHx8IGRhdGEuaWQuZGVwdGgpIHsKLSAgICAgICAg
dGhyb3cgbmV3IEV4Y2VwdGlvbignU2NvcGVkIGRhdGEgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBv
cnRlZDogJyArIGRhdGEub3JpZ2luYWwsIGRhdGEpOwotICAgICAgfQotCi0gICAgICB0aGlzLm9w
Y29kZSgnbG9va3VwRGF0YScpOwotICAgICAgdmFyIHBhcnRzID0gZGF0YS5pZC5wYXJ0czsKLSAg
ICAgIGZvcih2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdGhp
cy5vcGNvZGUoJ2xvb2t1cCcsIHBhcnRzW2ldKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgU1RS
SU5HOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5nJywg
c3RyaW5nLnN0cmluZyk7Ci0gICAgfSwKLQotICAgIElOVEVHRVI6IGZ1bmN0aW9uKGludGVnZXIp
IHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsIGludGVnZXIuaW50ZWdlcik7Ci0g
ICAgfSwKLQotICAgIEJPT0xFQU46IGZ1bmN0aW9uKGJvb2wpIHsKLSAgICAgIHRoaXMub3Bjb2Rl
KCdwdXNoTGl0ZXJhbCcsIGJvb2wuYm9vbCk7Ci0gICAgfSwKLQotICAgIGNvbW1lbnQ6IGZ1bmN0
aW9uKCkge30sCi0KLSAgICAvLyBIRUxQRVJTCi0gICAgb3Bjb2RlOiBmdW5jdGlvbihuYW1lKSB7
Ci0gICAgICB0aGlzLm9wY29kZXMucHVzaCh7IG9wY29kZTogbmFtZSwgYXJnczogW10uc2xpY2Uu
Y2FsbChhcmd1bWVudHMsIDEpIH0pOwotICAgIH0sCi0KLSAgICBkZWNsYXJlOiBmdW5jdGlvbihu
YW1lLCB2YWx1ZSkgewotICAgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6ICdERUNMQVJF
JywgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwotICAgIH0sCi0KLSAgICBhZGREZXB0aDog
ZnVuY3Rpb24oZGVwdGgpIHsKLSAgICAgIGlmKGRlcHRoID09PSAwKSB7IHJldHVybjsgfQotCi0g
ICAgICBpZighdGhpcy5kZXB0aHNbZGVwdGhdKSB7Ci0gICAgICAgIHRoaXMuZGVwdGhzW2RlcHRo
XSA9IHRydWU7Ci0gICAgICAgIHRoaXMuZGVwdGhzLmxpc3QucHVzaChkZXB0aCk7Ci0gICAgICB9
Ci0gICAgfSwKLQotICAgIGNsYXNzaWZ5U2V4cHI6IGZ1bmN0aW9uKHNleHByKSB7Ci0gICAgICB2
YXIgaXNIZWxwZXIgICA9IHNleHByLmlzSGVscGVyOwotICAgICAgdmFyIGlzRWxpZ2libGUgPSBz
ZXhwci5lbGlnaWJsZUhlbHBlcjsKLSAgICAgIHZhciBvcHRpb25zICAgID0gdGhpcy5vcHRpb25z
OwotCi0gICAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNhbiBwb3NzaWJseSByZXNvbHZlIHRoZSBh
bWJpZ3VpdHkgbm93Ci0gICAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKLSAgICAg
ICAgdmFyIG5hbWUgPSBzZXhwci5pZC5wYXJ0c1swXTsKLQotICAgICAgICBpZiAob3B0aW9ucy5r
bm93bkhlbHBlcnNbbmFtZV0pIHsKLSAgICAgICAgICBpc0hlbHBlciA9IHRydWU7Ci0gICAgICAg
IH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7Ci0gICAgICAgICAgaXNFbGln
aWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0hlbHBlcikg
eyByZXR1cm4gImhlbHBlciI7IH0KLSAgICAgIGVsc2UgaWYgKGlzRWxpZ2libGUpIHsgcmV0dXJu
ICJhbWJpZ3VvdXMiOyB9Ci0gICAgICBlbHNlIHsgcmV0dXJuICJzaW1wbGUiOyB9Ci0gICAgfSwK
LQotICAgIHB1c2hQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtcykgewotICAgICAgdmFyIGkgPSBwYXJh
bXMubGVuZ3RoLCBwYXJhbTsKLQotICAgICAgd2hpbGUoaS0tKSB7Ci0gICAgICAgIHBhcmFtID0g
cGFyYW1zW2ldOwotCi0gICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAg
ICAgICAgICBpZihwYXJhbS5kZXB0aCkgewotICAgICAgICAgICAgdGhpcy5hZGREZXB0aChwYXJh
bS5kZXB0aCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRl
eHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKLSAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmlu
Z1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVlLCBwYXJhbS50eXBlKTsKLQotICAgICAgICAg
IGlmIChwYXJhbS50eXBlID09PSAnc2V4cHInKSB7Ci0gICAgICAgICAgICAvLyBTdWJleHByZXNz
aW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KLSAgICAgICAgICAgIC8vIGluIHN0cmlu
ZyBwYXJhbXMgbW9kZS4KLSAgICAgICAgICAgIHRoaXMuc2V4cHIocGFyYW0pOwotICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aGlzW3BhcmFtLnR5cGVdKHBhcmFtKTsK
LSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0KLSAgICBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFt
czogZnVuY3Rpb24oc2V4cHIsIHByb2dyYW0sIGludmVyc2UpIHsKLSAgICAgIHZhciBwYXJhbXMg
PSBzZXhwci5wYXJhbXM7Ci0gICAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKLQotICAgICAg
dGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7Ci0gICAgICB0aGlzLm9wY29kZSgn
cHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKLQotICAgICAgaWYgKHNleHByLmhhc2gpIHsKLSAgICAg
ICAgdGhpcy5oYXNoKHNleHByLmhhc2gpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5v
cGNvZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcGFyYW1zOwotICAg
IH0KLSAgfTsKLQotICBmdW5jdGlvbiBwcmVjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsK
LSAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBp
bnB1dC5jb25zdHJ1Y3RvciAhPT0gZW52LkFTVC5Qcm9ncmFtTm9kZSkpIHsKLSAgICAgIHRocm93
IG5ldyBFeGNlcHRpb24oIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1Qg
dG8gSGFuZGxlYmFycy5wcmVjb21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1dCk7Ci0gICAgfQot
Ci0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gICAgaWYgKCEoJ2RhdGEnIGluIG9wdGlv
bnMpKSB7Ci0gICAgICBvcHRpb25zLmRhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIHZhciBhc3Qg
PSBlbnYucGFyc2UoaW5wdXQpOwotICAgIHZhciBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGls
ZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7Ci0gICAgcmV0dXJuIG5ldyBlbnYuSmF2YVNjcmlw
dENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucyk7Ci0gIH0KLQotICBfX2V4
cG9ydHNfXy5wcmVjb21waWxlID0gcHJlY29tcGlsZTtmdW5jdGlvbiBjb21waWxlKGlucHV0LCBv
cHRpb25zLCBlbnYpIHsKLSAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAodHlwZW9mIGlucHV0ICE9
PSAnc3RyaW5nJyAmJiBpbnB1dC5jb25zdHJ1Y3RvciAhPT0gZW52LkFTVC5Qcm9ncmFtTm9kZSkp
IHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3Ig
SGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5jb21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1
dCk7Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICBpZiAoISgn
ZGF0YScgaW4gb3B0aW9ucykpIHsKLSAgICAgIG9wdGlvbnMuZGF0YSA9IHRydWU7Ci0gICAgfQot
Ci0gICAgdmFyIGNvbXBpbGVkOwotCi0gICAgZnVuY3Rpb24gY29tcGlsZUlucHV0KCkgewotICAg
ICAgdmFyIGFzdCA9IGVudi5wYXJzZShpbnB1dCk7Ci0gICAgICB2YXIgZW52aXJvbm1lbnQgPSBu
ZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwotICAgICAgdmFyIHRlbXBs
YXRlU3BlYyA9IG5ldyBlbnYuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVu
dCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTsKLSAgICAgIHJldHVybiBlbnYudGVtcGxhdGUo
dGVtcGxhdGVTcGVjKTsKLSAgICB9Ci0KLSAgICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVk
IG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCi0gICAgcmV0dXJuIGZ1
bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAg
ICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjb21w
aWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMpOwotICAgIH07Ci0gIH0KLQotICBfX2V4
cG9ydHNfXy5jb21waWxlID0gY29tcGlsZTsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoX19t
b2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIu
anMKLXZhciBfX21vZHVsZTExX18gPSAoZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVu
ZGVuY3kyX18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIHZhciBD
T01QSUxFUl9SRVZJU0lPTiA9IF9fZGVwZW5kZW5jeTFfXy5DT01QSUxFUl9SRVZJU0lPTjsKLSAg
dmFyIFJFVklTSU9OX0NIQU5HRVMgPSBfX2RlcGVuZGVuY3kxX18uUkVWSVNJT05fQ0hBTkdFUzsK
LSAgdmFyIGxvZyA9IF9fZGVwZW5kZW5jeTFfXy5sb2c7Ci0gIHZhciBFeGNlcHRpb24gPSBfX2Rl
cGVuZGVuY3kyX187Ci0KLSAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewotICAgIHRoaXMudmFs
dWUgPSB2YWx1ZTsKLSAgfQotCi0gIGZ1bmN0aW9uIEphdmFTY3JpcHRDb21waWxlcigpIHt9Ci0K
LSAgSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHsKLSAgICAvLyBQVUJMSUMgQVBJOiBZ
b3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCi0g
ICAgLy8gYWx0ZXJuYXRpdmUgY29tcGlsZWQgZm9ybXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZm
ZXJpbmcgc2VtYW50aWNzCi0gICAgbmFtZUxvb2t1cDogZnVuY3Rpb24ocGFyZW50LCBuYW1lIC8q
ICwgdHlwZSovKSB7Ci0gICAgICB2YXIgd3JhcCwKLSAgICAgICAgICByZXQ7Ci0gICAgICBpZiAo
cGFyZW50LmluZGV4T2YoJ2RlcHRoJykgPT09IDApIHsKLSAgICAgICAgd3JhcCA9IHRydWU7Ci0g
ICAgICB9Ci0KLSAgICAgIGlmICgvXlswLTldKyQvLnRlc3QobmFtZSkpIHsKLSAgICAgICAgcmV0
ID0gcGFyZW50ICsgIlsiICsgbmFtZSArICJdIjsKLSAgICAgIH0gZWxzZSBpZiAoSmF2YVNjcmlw
dENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lKG5hbWUpKSB7Ci0gICAgICAg
IHJldCA9IHBhcmVudCArICIuIiArIG5hbWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAg
ICAgcmV0ID0gcGFyZW50ICsgIlsnIiArIG5hbWUgKyAiJ10iOwotICAgICAgfQotCi0gICAgICBp
ZiAod3JhcCkgewotICAgICAgICByZXR1cm4gJygnICsgcGFyZW50ICsgJyAmJiAnICsgcmV0ICsg
JyknOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICB9
LAotCi0gICAgY29tcGlsZXJJbmZvOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciByZXZpc2lvbiA9
IENPTVBJTEVSX1JFVklTSU9OLAotICAgICAgICAgIHZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdF
U1tyZXZpc2lvbl07Ci0gICAgICByZXR1cm4gInRoaXMuY29tcGlsZXJJbmZvID0gWyIrcmV2aXNp
b24rIiwnIit2ZXJzaW9ucysiJ107XG4iOwotICAgIH0sCi0KLSAgICBhcHBlbmRUb0J1ZmZlcjog
ZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkg
ewotICAgICAgICByZXR1cm4gInJldHVybiAiICsgc3RyaW5nICsgIjsiOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICBhcHBlbmRUb0J1ZmZlcjogdHJ1ZSwKLSAg
ICAgICAgICBjb250ZW50OiBzdHJpbmcsCi0gICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkg
eyByZXR1cm4gImJ1ZmZlciArPSAiICsgc3RyaW5nICsgIjsiOyB9Ci0gICAgICAgIH07Ci0gICAg
ICB9Ci0gICAgfSwKLQotICAgIGluaXRpYWxpemVCdWZmZXI6IGZ1bmN0aW9uKCkgewotICAgICAg
cmV0dXJuIHRoaXMucXVvdGVkU3RyaW5nKCIiKTsKLSAgICB9LAotCi0gICAgbmFtZXNwYWNlOiAi
SGFuZGxlYmFycyIsCi0gICAgLy8gRU5EIFBVQkxJQyBBUEkKLQotICAgIGNvbXBpbGU6IGZ1bmN0
aW9uKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewotICAgICAgdGhp
cy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKLQotICAgICAgbG9nKCdkZWJ1ZycsIHRoaXMuZW52aXJvbm1lbnQuZGlzYXNzZW1i
bGUoKSArICJcblxuIik7Ci0KLSAgICAgIHRoaXMubmFtZSA9IHRoaXMuZW52aXJvbm1lbnQubmFt
ZTsKLSAgICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKLSAgICAgIHRoaXMuY29udGV4dCA9
IGNvbnRleHQgfHwgewotICAgICAgICBwcm9ncmFtczogW10sCi0gICAgICAgIGVudmlyb25tZW50
czogW10sCi0gICAgICAgIGFsaWFzZXM6IHsgfQotICAgICAgfTsKLQotICAgICAgdGhpcy5wcmVh
bWJsZSgpOwotCi0gICAgICB0aGlzLnN0YWNrU2xvdCA9IDA7Ci0gICAgICB0aGlzLnN0YWNrVmFy
cyA9IFtdOwotICAgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07Ci0gICAgICB0aGlz
Lmhhc2hlcyA9IFtdOwotICAgICAgdGhpcy5jb21waWxlU3RhY2sgPSBbXTsKLSAgICAgIHRoaXMu
aW5saW5lU3RhY2sgPSBbXTsKLQotICAgICAgdGhpcy5jb21waWxlQ2hpbGRyZW4oZW52aXJvbm1l
bnQsIG9wdGlvbnMpOwotCi0gICAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMs
IG9wY29kZTsKLQotICAgICAgdGhpcy5pID0gMDsKLQotICAgICAgZm9yKHZhciBsPW9wY29kZXMu
bGVuZ3RoOyB0aGlzLmk8bDsgdGhpcy5pKyspIHsKLSAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1t0
aGlzLmldOwotCi0gICAgICAgIGlmKG9wY29kZS5vcGNvZGUgPT09ICdERUNMQVJFJykgewotICAg
ICAgICAgIHRoaXNbb3Bjb2RlLm5hbWVdID0gb3Bjb2RlLnZhbHVlOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgIHRoaXNbb3Bjb2RlLm9wY29kZV0uYXBwbHkodGhpcywgb3Bjb2RlLmFyZ3Mp
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgdGhlIHN0cmlwTmV4dCBmbGFnIGlmIGl0
IHdhcyBub3Qgc2V0IGJ5IHRoaXMgb3BlcmF0aW9uLgotICAgICAgICBpZiAob3Bjb2RlLm9wY29k
ZSAhPT0gdGhpcy5zdHJpcE5leHQpIHsKLSAgICAgICAgICB0aGlzLnN0cmlwTmV4dCA9IGZhbHNl
OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZsdXNoIGFueSB0cmFpbGluZyBjb250
ZW50IHRoYXQgbWlnaHQgYmUgcGVuZGluZy4KLSAgICAgIHRoaXMucHVzaFNvdXJjZSgnJyk7Ci0K
LSAgICAgIGlmICh0aGlzLnN0YWNrU2xvdCB8fCB0aGlzLmlubGluZVN0YWNrLmxlbmd0aCB8fCB0
aGlzLmNvbXBpbGVTdGFjay5sZW5ndGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbign
Q29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVuY3Rpb25Db250ZXh0KGFzT2JqZWN0KTsKLSAg
ICB9LAotCi0gICAgcHJlYW1ibGU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG91dCA9IFtdOwot
Ci0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5uYW1lc3BhY2U7Ci0KLSAgICAgICAgdmFyIGNvcGllcyA9ICJoZWxwZXJzID0gdGhpcy5tZXJn
ZShoZWxwZXJzLCAiICsgbmFtZXNwYWNlICsgIi5oZWxwZXJzKTsiOwotICAgICAgICBpZiAodGhp
cy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7IGNvcGllcyA9IGNvcGllcyArICIgcGFydGlhbHMg
PSB0aGlzLm1lcmdlKHBhcnRpYWxzLCAiICsgbmFtZXNwYWNlICsgIi5wYXJ0aWFscyk7IjsgfQot
ICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsgY29waWVzID0gY29waWVzICsgIiBkYXRh
ID0gZGF0YSB8fCB7fTsiOyB9Ci0gICAgICAgIG91dC5wdXNoKGNvcGllcyk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICBvdXQucHVzaCgnJyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghdGhpcy5l
bnZpcm9ubWVudC5pc1NpbXBsZSkgewotICAgICAgICBvdXQucHVzaCgiLCBidWZmZXIgPSAiICsg
dGhpcy5pbml0aWFsaXplQnVmZmVyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0LnB1
c2goIiIpOwotICAgICAgfQotCi0gICAgICAvLyB0cmFjayB0aGUgbGFzdCBjb250ZXh0IHB1c2hl
ZCBpbnRvIHBsYWNlIHRvIGFsbG93IHNraXBwaW5nIHRoZQotICAgICAgLy8gZ2V0Q29udGV4dCBv
cGNvZGUgd2hlbiBpdCB3b3VsZCBiZSBhIG5vb3AKLSAgICAgIHRoaXMubGFzdENvbnRleHQgPSAw
OwotICAgICAgdGhpcy5zb3VyY2UgPSBvdXQ7Ci0gICAgfSwKLQotICAgIGNyZWF0ZUZ1bmN0aW9u
Q29udGV4dDogZnVuY3Rpb24oYXNPYmplY3QpIHsKLSAgICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0
YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7Ci0KLSAgICAgIGlmKGxvY2Fscy5s
ZW5ndGggPiAwKSB7Ci0gICAgICAgIHRoaXMuc291cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAi
LCAiICsgbG9jYWxzLmpvaW4oIiwgIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdlbmVyYXRlIG1p
bmltaXplciBhbGlhcyBtYXBwaW5ncwotICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsKLSAgICAg
ICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5jb250ZXh0LmFsaWFzZXMpIHsKLSAgICAgICAgICBp
ZiAodGhpcy5jb250ZXh0LmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpKSB7Ci0gICAgICAg
ICAgICB0aGlzLnNvdXJjZVsxXSA9IHRoaXMuc291cmNlWzFdICsgJywgJyArIGFsaWFzICsgJz0n
ICsgdGhpcy5jb250ZXh0LmFsaWFzZXNbYWxpYXNdOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgfQotCi0gICAgICBpZiAodGhpcy5zb3VyY2VbMV0pIHsKLSAgICAgICAgdGhpcy5zb3Vy
Y2VbMV0gPSAidmFyICIgKyB0aGlzLnNvdXJjZVsxXS5zdWJzdHJpbmcoMikgKyAiOyI7Ci0gICAg
ICB9Ci0KLSAgICAgIC8vIE1lcmdlIGNoaWxkcmVuCi0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkg
ewotICAgICAgICB0aGlzLnNvdXJjZVsxXSArPSAnXG4nICsgdGhpcy5jb250ZXh0LnByb2dyYW1z
LmpvaW4oJ1xuJykgKyAnXG4nOwotICAgICAgfQotCi0gICAgICBpZiAoIXRoaXMuZW52aXJvbm1l
bnQuaXNTaW1wbGUpIHsKLSAgICAgICAgdGhpcy5wdXNoU291cmNlKCJyZXR1cm4gYnVmZmVyOyIp
OwotICAgICAgfQotCi0gICAgICB2YXIgcGFyYW1zID0gdGhpcy5pc0NoaWxkID8gWyJkZXB0aDAi
LCAiZGF0YSJdIDogWyJIYW5kbGViYXJzIiwgImRlcHRoMCIsICJoZWxwZXJzIiwgInBhcnRpYWxz
IiwgImRhdGEiXTsKLQotICAgICAgZm9yKHZhciBpPTAsIGw9dGhpcy5lbnZpcm9ubWVudC5kZXB0
aHMubGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHBhcmFtcy5wdXNoKCJkZXB0aCIg
KyB0aGlzLmVudmlyb25tZW50LmRlcHRocy5saXN0W2ldKTsKLSAgICAgIH0KLQotICAgICAgLy8g
UGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdo
ZW4gcG9zc2libGUKLSAgICAgIHZhciBzb3VyY2UgPSB0aGlzLm1lcmdlU291cmNlKCk7Ci0KLSAg
ICAgIGlmICghdGhpcy5pc0NoaWxkKSB7Ci0gICAgICAgIHNvdXJjZSA9IHRoaXMuY29tcGlsZXJJ
bmZvKCkrc291cmNlOwotICAgICAgfQotCi0gICAgICBpZiAoYXNPYmplY3QpIHsKLSAgICAgICAg
cGFyYW1zLnB1c2goc291cmNlKTsKLQotICAgICAgICByZXR1cm4gRnVuY3Rpb24uYXBwbHkodGhp
cywgcGFyYW1zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhciBmdW5jdGlvblNvdXJjZSA9
ICdmdW5jdGlvbiAnICsgKHRoaXMubmFtZSB8fCAnJykgKyAnKCcgKyBwYXJhbXMuam9pbignLCcp
ICsgJykge1xuICAnICsgc291cmNlICsgJ30nOwotICAgICAgICBsb2coJ2RlYnVnJywgZnVuY3Rp
b25Tb3VyY2UgKyAiXG5cbiIpOwotICAgICAgICByZXR1cm4gZnVuY3Rpb25Tb3VyY2U7Ci0gICAg
ICB9Ci0gICAgfSwKLSAgICBtZXJnZVNvdXJjZTogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBXQVJO
OiBXZSBhcmUgbm90IGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBzdGlsbCBwb3B1
bGF0ZWQgYXMgdGhlIHNvdXJjZSBzaG91bGQKLSAgICAgIC8vIG5vdCBoYXZlIGJ1ZmZlciBhcHBl
bmQgb3BlcmF0aW9ucyBhcyB0aGVpciBmaW5hbCBhY3Rpb24uCi0gICAgICB2YXIgc291cmNlID0g
JycsCi0gICAgICAgICAgYnVmZmVyOwotICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMu
c291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHZhciBsaW5lID0gdGhpcy5z
b3VyY2VbaV07Ci0gICAgICAgIGlmIChsaW5lLmFwcGVuZFRvQnVmZmVyKSB7Ci0gICAgICAgICAg
aWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyICsgJ1xuICAgICsgJyAr
IGxpbmUuY29udGVudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyID0g
bGluZS5jb250ZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBp
ZiAoYnVmZmVyKSB7Ci0gICAgICAgICAgICBzb3VyY2UgKz0gJ2J1ZmZlciArPSAnICsgYnVmZmVy
ICsgJztcbiAgJzsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsKLSAgICAgICAgICB9
Ci0gICAgICAgICAgc291cmNlICs9IGxpbmUgKyAnXG4gICc7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfSwKLQotICAgIC8vIFtibG9ja1ZhbHVlXQotICAg
IC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFs
dWUKLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJldHVybiB2YWx1ZSBvZiBibG9ja0hlbHBlck1p
c3NpbmcKLSAgICAvLwotICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRh
a2UgYSBibG9jayBvZiB0aGUgZm9ybQotICAgIC8vIGB7eyNmb299fS4uLnt7L2Zvb319YCwgcmVz
b2x2ZSB0aGUgdmFsdWUgb2YgYGZvb2AsIGFuZAotICAgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0
YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQotICAgIC8vIGludm9raW5nIGJsb2NrSGVs
cGVyTWlzc2luZy4KLSAgICBibG9ja1ZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuY29u
dGV4dC5hbGlhc2VzLmJsb2NrSGVscGVyTWlzc2luZyA9ICdoZWxwZXJzLmJsb2NrSGVscGVyTWlz
c2luZyc7Ci0KLSAgICAgIHZhciBwYXJhbXMgPSBbImRlcHRoMCJdOwotICAgICAgdGhpcy5zZXR1
cFBhcmFtcygwLCBwYXJhbXMpOwotCi0gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbihj
dXJyZW50KSB7Ci0gICAgICAgIHBhcmFtcy5zcGxpY2UoMSwgMCwgY3VycmVudCk7Ci0gICAgICAg
IHJldHVybiAiYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoIiArIHBhcmFtcy5qb2luKCIsICIpICsg
IikiOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQot
ICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwg
dmFsdWUKLSAgICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9m
IGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIG5v
IGxhc3RIZWxwZXI6IHNhbWUgYXMgW2Jsb2NrVmFsdWVdCi0gICAgLy8gT24gc3RhY2ssIGFmdGVy
LCBpZiBsYXN0SGVscGVyOiB2YWx1ZQotICAgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9u
KCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuYmxvY2tIZWxwZXJNaXNzaW5nID0gJ2hl
bHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJzsKLQotICAgICAgdmFyIHBhcmFtcyA9IFsiZGVwdGgw
Il07Ci0gICAgICB0aGlzLnNldHVwUGFyYW1zKDAsIHBhcmFtcyk7Ci0KLSAgICAgIHZhciBjdXJy
ZW50ID0gdGhpcy50b3BTdGFjaygpOwotICAgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBjdXJyZW50
KTsKLQotICAgICAgdGhpcy5wdXNoU291cmNlKCJpZiAoISIgKyB0aGlzLmxhc3RIZWxwZXIgKyAi
KSB7ICIgKyBjdXJyZW50ICsgIiA9IGJsb2NrSGVscGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMu
am9pbigiLCAiKSArICIpOyB9Iik7Ci0gICAgfSwKLQotICAgIC8vIFthcHBlbmRDb250ZW50XQot
ICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFm
dGVyOiAuLi4KLSAgICAvLwotICAgIC8vIEFwcGVuZHMgdGhlIHN0cmluZyB2YWx1ZSBvZiBgY29u
dGVudGAgdG8gdGhlIGN1cnJlbnQgYnVmZmVyCi0gICAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24o
Y29udGVudCkgewotICAgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKLSAgICAgICAgY29u
dGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQgKyBjb250ZW50OwotICAgICAgfQotICAgICAgaWYg
KHRoaXMuc3RyaXBOZXh0KSB7Ci0gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15c
cysvLCAnJyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSBjb250ZW50
OwotICAgIH0sCi0KLSAgICAvLyBbc3RyaXBdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVm
b3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gUmVt
b3ZlcyBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBwcmlvciBjb250ZW50IG5vZGUg
YW5kIGZsYWdzCi0gICAgLy8gdGhlIG5leHQgb3BlcmF0aW9uIGZvciBzdHJpcHBpbmcgaWYgaXQg
aXMgYSBjb250ZW50IG5vZGUuCi0gICAgc3RyaXA6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRo
aXMucGVuZGluZ0NvbnRlbnQpIHsKLSAgICAgICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IHRoaXMu
cGVuZGluZ0NvbnRlbnQucmVwbGFjZSgvXHMrJC8sICcnKTsKLSAgICAgIH0KLSAgICAgIHRoaXMu
c3RyaXBOZXh0ID0gJ3N0cmlwJzsKLSAgICB9LAotCi0gICAgLy8gW2FwcGVuZF0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0
ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBh
cHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAvLwotICAgIC8vIElmIGB2YWx1
ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJpbmcgYW5kIGFwcGVu
ZGVkCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCi0gICAg
YXBwZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEZvcmNlIGFueXRoaW5nIHRoYXQgaXMgaW5s
aW5lZCBvbnRvIHRoZSBzdGFjayBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0aW9uCi0gICAgICAv
LyB3aGVuIHdlIGV4YW1pbmUgbG9jYWwKLSAgICAgIHRoaXMuZmx1c2hJbmxpbmUoKTsKLSAgICAg
IHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgIHRoaXMucHVzaFNvdXJjZSgiaWYo
IiArIGxvY2FsICsgIiB8fCAiICsgbG9jYWwgKyAiID09PSAwKSB7ICIgKyB0aGlzLmFwcGVuZFRv
QnVmZmVyKGxvY2FsKSArICIgfSIpOwotICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1w
bGUpIHsKLSAgICAgICAgdGhpcy5wdXNoU291cmNlKCJlbHNlIHsgIiArIHRoaXMuYXBwZW5kVG9C
dWZmZXIoIicnIikgKyAiIH0iKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gW2FwcGVuZEVz
Y2FwZWRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCi0gICAg
Ly8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAvLwotICAgIC8vIEVzY2FwZSBgdmFsdWVgIGFu
ZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgotICAgIGFwcGVuZEVzY2FwZWQ6IGZ1bmN0aW9uKCkg
ewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuZXNjYXBlRXhwcmVzc2lvbiA9ICd0aGlzLmVz
Y2FwZUV4cHJlc3Npb24nOwotCi0gICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1
ZmZlcigiZXNjYXBlRXhwcmVzc2lvbigiICsgdGhpcy5wb3BTdGFjaygpICsgIikiKSk7Ci0gICAg
fSwKLQotICAgIC8vIFtnZXRDb250ZXh0XQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9y
ZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAvLyBDb21waWxlciB2YWx1
ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoCi0gICAgLy8KLSAgICAvLyBTZXQgdGhlIHZhbHVl
IG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAotICAgIGdl
dENvbnRleHQ6IGZ1bmN0aW9uKGRlcHRoKSB7Ci0gICAgICBpZih0aGlzLmxhc3RDb250ZXh0ICE9
PSBkZXB0aCkgewotICAgICAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVwdGg7Ci0gICAgICB9Ci0g
ICAgfSwKLQotICAgIC8vIFtsb29rdXBPbkNvbnRleHRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFj
aywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25h
bWVdLCAuLi4KLSAgICAvLwotICAgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgbmFtZWAgb24g
dGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzCi0gICAgLy8gaXQgb250byB0aGUgc3RhY2su
Ci0gICAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICB0aGlzLnB1c2go
dGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4
dCcpKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hDb250ZXh0XQotICAgIC8vCi0gICAgLy8gT24g
c3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4
dCwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNv
bnRleHQgb250byB0aGUgc3RhY2suCi0gICAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uKCkgewotICAg
ICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0KTsKLSAg
ICB9LAotCi0gICAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV0KLSAgICAvLwotICAgIC8vIE9u
IHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc29s
dmVkIHZhbHVlLCAuLi4KLSAgICAvLwotICAgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRh
LCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQotICAgIC8vIHRoZSByZXR1cm4gdmFsdWUgb2Yg
dGhlIGxhbWJkYQotICAgIHJlc29sdmVQb3NzaWJsZUxhbWJkYTogZnVuY3Rpb24oKSB7Ci0gICAg
ICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1bmN0aW9uIic7Ci0KLSAg
ICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGN1cnJlbnQpIHsKLSAgICAgICAgcmV0dXJu
ICJ0eXBlb2YgIiArIGN1cnJlbnQgKyAiID09PSBmdW5jdGlvblR5cGUgPyAiICsgY3VycmVudCAr
ICIuYXBwbHkoZGVwdGgwKSA6ICIgKyBjdXJyZW50OwotICAgICAgfSk7Ci0gICAgfSwKLQotICAg
IC8vIFtsb29rdXBdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4u
Ci0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZVtuYW1lXSwgLi4uCi0gICAgLy8KLSAgICAv
LyBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sgd2l0aCB0aGUgcmVzdWx0IG9mIGxvb2tp
bmcKLSAgICAvLyB1cCBgbmFtZWAgb24gYHZhbHVlYAotICAgIGxvb2t1cDogZnVuY3Rpb24obmFt
ZSkgewotICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24oY3VycmVudCkgewotICAgICAg
ICByZXR1cm4gY3VycmVudCArICIgPT0gbnVsbCB8fCAiICsgY3VycmVudCArICIgPT09IGZhbHNl
ID8gIiArIGN1cnJlbnQgKyAiIDogIiArIHRoaXMubmFtZUxvb2t1cChjdXJyZW50LCBuYW1lLCAn
Y29udGV4dCcpOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIFtsb29rdXBEYXRhXQotICAg
IC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVy
OiBkYXRhLCAuLi4KLSAgICAvLwotICAgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9y
Ci0gICAgbG9va3VwRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVy
YWwoJ2RhdGEnKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hTdHJpbmdQYXJhbV0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogc3Ry
aW5nLCBjdXJyZW50Q29udGV4dCwgLi4uCi0gICAgLy8KLSAgICAvLyBUaGlzIG9wY29kZSBpcyBk
ZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2RlLCB3aGljaAotICAgIC8vIHByb3ZpZGVzIHRo
ZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHMKLSAgICAvLyBkZXB0
aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCi0gICAgcHVzaFN0cmluZ1Bh
cmFtOiBmdW5jdGlvbihzdHJpbmcsIHR5cGUpIHsKLSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJh
bCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCk7Ci0KLSAgICAgIHRoaXMucHVzaFN0cmluZyh0
eXBlKTsKLQotICAgICAgLy8gSWYgaXQncyBhIHN1YmV4cHJlc3Npb24sIHRoZSBzdHJpbmcgcmVz
dWx0Ci0gICAgICAvLyB3aWxsIGJlIHB1c2hlZCBhZnRlciB0aGlzIG9wY29kZS4KLSAgICAgIGlm
ICh0eXBlICE9PSAnc2V4cHInKSB7Ci0gICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3Ry
aW5nJykgewotICAgICAgICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwotICAgICAgICB9
Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIGVtcHR5SGFzaDogZnVuY3Rpb24oKSB7Ci0gICAgICB0
aGlzLnB1c2hTdGFja0xpdGVyYWwoJ3t9Jyk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3Ry
aW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFzaENvbnRleHRzCi0g
ICAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFzaFR5cGVzCi0gICAgICB9Ci0gICAgfSwKLSAg
ICBwdXNoSGFzaDogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAodGhpcy5oYXNoKSB7Ci0gICAgICAg
IHRoaXMuaGFzaGVzLnB1c2godGhpcy5oYXNoKTsKLSAgICAgIH0KLSAgICAgIHRoaXMuaGFzaCA9
IHt2YWx1ZXM6IFtdLCB0eXBlczogW10sIGNvbnRleHRzOiBbXX07Ci0gICAgfSwKLSAgICBwb3BI
YXNoOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBoYXNoID0gdGhpcy5oYXNoOwotICAgICAgdGhp
cy5oYXNoID0gdGhpcy5oYXNoZXMucG9wKCk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3Ry
aW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLmNvbnRleHRzLmpvaW4o
JywnKSArICd9Jyk7Ci0gICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLnR5cGVzLmpvaW4oJywn
KSArICd9Jyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMucHVzaCgne1xuICAgICcgKyBoYXNoLnZh
bHVlcy5qb2luKCcsXG4gICAgJykgKyAnXG4gIH0nKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hT
dHJpbmddCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBz
dGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KLSAgICAvLwotICAgIC8vIFB1
c2ggYSBxdW90ZWQgdmVyc2lvbiBvZiBgc3RyaW5nYCBvbnRvIHRoZSBzdGFjawotICAgIHB1c2hT
dHJpbmc6IGZ1bmN0aW9uKHN0cmluZykgewotICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRo
aXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwotICAgIH0sCi0KLSAgICAvLyBbcHVzaF0KLSAgICAv
LwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjog
ZXhwciwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoIGFuIGV4cHJlc3Npb24gb250byB0aGUgc3Rh
Y2sKLSAgICBwdXNoOiBmdW5jdGlvbihleHByKSB7Ci0gICAgICB0aGlzLmlubGluZVN0YWNrLnB1
c2goZXhwcik7Ci0gICAgICByZXR1cm4gZXhwcjsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hMaXRl
cmFsXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3Rh
Y2ssIGFmdGVyOiB2YWx1ZSwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoZXMgYSB2YWx1ZSBvbnRv
IHRoZSBzdGFjay4gVGhpcyBvcGVyYXRpb24gcHJldmVudHMKLSAgICAvLyB0aGUgY29tcGlsZXIg
ZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCi0gICAgLy8gaXQuCi0g
ICAgcHVzaExpdGVyYWw6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xp
dGVyYWwodmFsdWUpOwotICAgIH0sCi0KLSAgICAvLyBbcHVzaFByb2dyYW1dCi0gICAgLy8KLSAg
ICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHByb2dy
YW0oZ3VpZCksIC4uLgotICAgIC8vCi0gICAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBv
bnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwotICAgIC8vIGEgY29tcGlsZS10aW1lIGd1aWQgYW5k
IGNvbnZlcnRzIGl0IGludG8gYSBydW50aW1lLWFjY2Vzc2libGUKLSAgICAvLyBleHByZXNzaW9u
LgotICAgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbihndWlkKSB7Ci0gICAgICBpZiAoZ3VpZCAhPSBu
dWxsKSB7Ci0gICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnByb2dyYW1FeHByZXNz
aW9uKGd1aWQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJh
bChudWxsKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gW2ludm9rZUhlbHBlcl0KLSAgICAv
LwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFt
cy4uLiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9j
YXRpb24KLSAgICAvLwotICAgIC8vIFBvcHMgb2ZmIHRoZSBoZWxwZXIncyBwYXJhbWV0ZXJzLCBp
bnZva2VzIHRoZSBoZWxwZXIsCi0gICAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJu
IHZhbHVlIG9udG8gdGhlIHN0YWNrLgotICAgIC8vCi0gICAgLy8gSWYgdGhlIGhlbHBlciBpcyBu
b3QgZm91bmQsIGBoZWxwZXJNaXNzaW5nYCBpcyBjYWxsZWQuCi0gICAgaW52b2tlSGVscGVyOiBm
dW5jdGlvbihwYXJhbVNpemUsIG5hbWUsIGlzUm9vdCkgewotICAgICAgdGhpcy5jb250ZXh0LmFs
aWFzZXMuaGVscGVyTWlzc2luZyA9ICdoZWxwZXJzLmhlbHBlck1pc3NpbmcnOwotICAgICAgdGhp
cy51c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAgICAgIHZhciBoZWxwZXIgPSB0aGlzLmxhc3RI
ZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgdHJ1ZSk7Ci0gICAgICB2
YXIgbm9uSGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0
LCBuYW1lLCAnY29udGV4dCcpOwotCi0gICAgICB2YXIgbG9va3VwID0gJ2hlbHBlciA9ICcgKyBo
ZWxwZXIubmFtZSArICcgfHwgJyArIG5vbkhlbHBlcjsKLSAgICAgIGlmIChoZWxwZXIucGFyYW1z
SW5pdCkgewotICAgICAgICBsb29rdXAgKz0gJywnICsgaGVscGVyLnBhcmFtc0luaXQ7Ci0gICAg
ICB9Ci0KLSAgICAgIHRoaXMucHVzaCgKLSAgICAgICAgJygnCi0gICAgICAgICAgKyBsb29rdXAK
LSAgICAgICAgICArICcsaGVscGVyICcKLSAgICAgICAgICAgICsgJz8gaGVscGVyLmNhbGwoJyAr
IGhlbHBlci5jYWxsUGFyYW1zICsgJykgJwotICAgICAgICAgICAgKyAnOiBoZWxwZXJNaXNzaW5n
LmNhbGwoJyArIGhlbHBlci5oZWxwZXJNaXNzaW5nUGFyYW1zICsgJykpJyk7Ci0KLSAgICAgIC8v
IEFsd2F5cyBmbHVzaCBzdWJleHByZXNzaW9ucy4gVGhpcyBpcyBib3RoIHRvIHByZXZlbnQgdGhl
IGNvbXBvdW5kaW5nIHNpemUgaXNzdWUgdGhhdAotICAgICAgLy8gb2NjdXJzIHdoZW4gdGhlIGNv
ZGUgaGFzIHRvIGJlIGR1cGxpY2F0ZWQgZm9yIGlubGluaW5nIGFuZCBhbHNvIHRvIHByZXZlbnQg
ZXJyb3JzCi0gICAgICAvLyBkdWUgdG8gdGhlIGluY29ycmVjdCBvcHRpb25zIG9iamVjdCBiZWlu
ZyBwYXNzZWQgZHVlIHRvIHRoZSBzaGFyZWQgcmVnaXN0ZXIuCi0gICAgICBpZiAoIWlzUm9vdCkg
ewotICAgICAgICB0aGlzLmZsdXNoSW5saW5lKCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8v
IFtpbnZva2VLbm93bkhlbHBlcl0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhh
c2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFm
dGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KLSAgICAvLwotICAgIC8vIFRoaXMgb3Bl
cmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAotICAgIC8v
IHNvIGEgYGhlbHBlck1pc3NpbmdgIGZhbGxiYWNrIGlzIG5vdCByZXF1aXJlZC4KLSAgICBpbnZv
a2VLbm93bkhlbHBlcjogZnVuY3Rpb24ocGFyYW1TaXplLCBuYW1lKSB7Ci0gICAgICB2YXIgaGVs
cGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwotICAgICAgdGhpcy5wdXNo
KGhlbHBlci5uYW1lICsgIi5jYWxsKCIgKyBoZWxwZXIuY2FsbFBhcmFtcyArICIpIik7Ci0gICAg
fSwKLQotICAgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywg
YmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgotICAgIC8vIE9u
IHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCi0gICAgLy8KLSAgICAvLyBU
aGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gYW4gZXhwcmVzc2lvbiBsaWtlIGB7e2Zvb319YAot
ICAgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hl
dGhlciBpdAotICAgIC8vIGlzIGEgaGVscGVyIG9yIGEgcGF0aC4KLSAgICAvLwotICAgIC8vIFRo
aXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAotICAg
IC8vIGFuZCBjYW4gYmUgYXZvaWRlZCBieSBwYXNzaW5nIHRoZSBga25vd25IZWxwZXJzYCBhbmQK
LSAgICAvLyBga25vd25IZWxwZXJzT25seWAgZmxhZ3MgYXQgY29tcGlsZS10aW1lLgotICAgIGlu
dm9rZUFtYmlndW91czogZnVuY3Rpb24obmFtZSwgaGVscGVyQ2FsbCkgewotICAgICAgdGhpcy5j
b250ZXh0LmFsaWFzZXMuZnVuY3Rpb25UeXBlID0gJyJmdW5jdGlvbiInOwotICAgICAgdGhpcy51
c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAgICAgIHRoaXMuZW1wdHlIYXNoKCk7Ci0gICAgICB2
YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKLQotICAg
ICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hl
bHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0KLSAgICAgIHZhciBub25IZWxwZXIgPSB0aGlzLm5h
bWVMb29rdXAoJ2RlcHRoJyArIHRoaXMubGFzdENvbnRleHQsIG5hbWUsICdjb250ZXh0Jyk7Ci0g
ICAgICB2YXIgbmV4dFN0YWNrID0gdGhpcy5uZXh0U3RhY2soKTsKLQotICAgICAgaWYgKGhlbHBl
ci5wYXJhbXNJbml0KSB7Ci0gICAgICAgIHRoaXMucHVzaFNvdXJjZShoZWxwZXIucGFyYW1zSW5p
dCk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnB1c2hTb3VyY2UoJ2lmIChoZWxwZXIgPSAnICsgaGVs
cGVyTmFtZSArICcpIHsgJyArIG5leHRTdGFjayArICcgPSBoZWxwZXIuY2FsbCgnICsgaGVscGVy
LmNhbGxQYXJhbXMgKyAnKTsgfScpOwotICAgICAgdGhpcy5wdXNoU291cmNlKCdlbHNlIHsgaGVs
cGVyID0gJyArIG5vbkhlbHBlciArICc7ICcgKyBuZXh0U3RhY2sgKyAnID0gdHlwZW9mIGhlbHBl
ciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoJyArIGhlbHBlci5jYWxsUGFyYW1zICsg
JykgOiBoZWxwZXI7IH0nKTsKLSAgICB9LAotCi0gICAgLy8gW2ludm9rZVBhcnRpYWxdCi0gICAg
Ly8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBjb250ZXh0LCAuLi4KLSAgICAvLyBPbiBzdGFj
ayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgotICAgIC8vCi0gICAgLy8gVGhp
cyBvcGVyYXRpb24gcG9wcyBvZmYgYSBjb250ZXh0LCBpbnZva2VzIGEgcGFydGlhbCB3aXRoIHRo
YXQgY29udGV4dCwKLSAgICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRp
b24gYmFjay4KLSAgICBpbnZva2VQYXJ0aWFsOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICB2YXIg
cGFyYW1zID0gW3RoaXMubmFtZUxvb2t1cCgncGFydGlhbHMnLCBuYW1lLCAncGFydGlhbCcpLCAi
JyIgKyBuYW1lICsgIiciLCB0aGlzLnBvcFN0YWNrKCksICJoZWxwZXJzIiwgInBhcnRpYWxzIl07
Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkgewotICAgICAgICBwYXJhbXMucHVzaCgi
ZGF0YSIpOwotICAgICAgfQotCi0gICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRo
aXMiOwotICAgICAgdGhpcy5wdXNoKCJzZWxmLmludm9rZVBhcnRpYWwoIiArIHBhcmFtcy5qb2lu
KCIsICIpICsgIikiKTsKLSAgICB9LAotCi0gICAgLy8gW2Fzc2lnblRvSGFzaF0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCBoYXNoLCAuLi4KLSAgICAvLyBPbiBzdGFj
aywgYWZ0ZXI6IGhhc2gsIC4uLgotICAgIC8vCi0gICAgLy8gUG9wcyBhIHZhbHVlIGFuZCBoYXNo
IG9mZiB0aGUgc3RhY2ssIGFzc2lnbnMgYGhhc2hba2V5XSA9IHZhbHVlYAotICAgIC8vIGFuZCBw
dXNoZXMgdGhlIGhhc2ggYmFjayBvbnRvIHRoZSBzdGFjay4KLSAgICBhc3NpZ25Ub0hhc2g6IGZ1
bmN0aW9uKGtleSkgewotICAgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAotICAgICAg
ICAgIGNvbnRleHQsCi0gICAgICAgICAgdHlwZTsKLQotICAgICAgaWYgKHRoaXMub3B0aW9ucy5z
dHJpbmdQYXJhbXMpIHsKLSAgICAgICAgdHlwZSA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgICAg
Y29udGV4dCA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGhhc2ggPSB0
aGlzLmhhc2g7Ci0gICAgICBpZiAoY29udGV4dCkgewotICAgICAgICBoYXNoLmNvbnRleHRzLnB1
c2goIiciICsga2V5ICsgIic6ICIgKyBjb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBl
KSB7Ci0gICAgICAgIGhhc2gudHlwZXMucHVzaCgiJyIgKyBrZXkgKyAiJzogIiArIHR5cGUpOwot
ICAgICAgfQotICAgICAgaGFzaC52YWx1ZXMucHVzaCgiJyIgKyBrZXkgKyAiJzogKCIgKyB2YWx1
ZSArICIpIik7Ci0gICAgfSwKLQotICAgIC8vIEhFTFBFUlMKLQotICAgIGNvbXBpbGVyOiBKYXZh
U2NyaXB0Q29tcGlsZXIsCi0KLSAgICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uKGVudmlyb25t
ZW50LCBvcHRpb25zKSB7Ci0gICAgICB2YXIgY2hpbGRyZW4gPSBlbnZpcm9ubWVudC5jaGlsZHJl
biwgY2hpbGQsIGNvbXBpbGVyOwotCi0gICAgICBmb3IodmFyIGk9MCwgbD1jaGlsZHJlbi5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGNv
bXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKTsKLQotICAgICAgICB2YXIgaW5kZXggPSB0aGlz
Lm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKLQotICAgICAgICBpZiAoaW5kZXggPT0gbnVs
bCkgewotICAgICAgICAgIHRoaXMuY29udGV4dC5wcm9ncmFtcy5wdXNoKCcnKTsgICAgIC8vIFBs
YWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgot
ICAgICAgICAgIGluZGV4ID0gdGhpcy5jb250ZXh0LnByb2dyYW1zLmxlbmd0aDsKLSAgICAgICAg
ICBjaGlsZC5pbmRleCA9IGluZGV4OwotICAgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScg
KyBpbmRleDsKLSAgICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXNbaW5kZXhdID0gY29tcGls
ZXIuY29tcGlsZShjaGlsZCwgb3B0aW9ucywgdGhpcy5jb250ZXh0KTsKLSAgICAgICAgICB0aGlz
LmNvbnRleHQuZW52aXJvbm1lbnRzW2luZGV4XSA9IGNoaWxkOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgY2hpbGQubmFtZSA9ICdw
cm9ncmFtJyArIGluZGV4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSwKLSAgICBtYXRjaEV4
aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24oY2hpbGQpIHsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBs
ZW4gPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0g
ICAgICAgIHZhciBlbnZpcm9ubWVudCA9IHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaV07Ci0g
ICAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7Ci0g
ICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9LAotCi0gICAgcHJv
Z3JhbUV4cHJlc3Npb246IGZ1bmN0aW9uKGd1aWQpIHsKLSAgICAgIHRoaXMuY29udGV4dC5hbGlh
c2VzLnNlbGYgPSAidGhpcyI7Ci0KLSAgICAgIGlmKGd1aWQgPT0gbnVsbCkgewotICAgICAgICBy
ZXR1cm4gInNlbGYubm9vcCI7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBjaGlsZCA9IHRoaXMuZW52
aXJvbm1lbnQuY2hpbGRyZW5bZ3VpZF0sCi0gICAgICAgICAgZGVwdGhzID0gY2hpbGQuZGVwdGhz
Lmxpc3QsIGRlcHRoOwotCi0gICAgICB2YXIgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwg
Y2hpbGQubmFtZSwgImRhdGEiXTsKLQotICAgICAgZm9yKHZhciBpPTAsIGwgPSBkZXB0aHMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgICAgICBkZXB0aCA9IGRlcHRoc1tpXTsKLQotICAgICAgICBp
ZihkZXB0aCA9PT0gMSkgeyBwcm9ncmFtUGFyYW1zLnB1c2goImRlcHRoMCIpOyB9Ci0gICAgICAg
IGVsc2UgeyBwcm9ncmFtUGFyYW1zLnB1c2goImRlcHRoIiArIChkZXB0aCAtIDEpKTsgfQotICAg
ICAgfQotCi0gICAgICByZXR1cm4gKGRlcHRocy5sZW5ndGggPT09IDAgPyAic2VsZi5wcm9ncmFt
KCIgOiAic2VsZi5wcm9ncmFtV2l0aERlcHRoKCIpICsgcHJvZ3JhbVBhcmFtcy5qb2luKCIsICIp
ICsgIikiOwotICAgIH0sCi0KLSAgICByZWdpc3RlcjogZnVuY3Rpb24obmFtZSwgdmFsKSB7Ci0g
ICAgICB0aGlzLnVzZVJlZ2lzdGVyKG5hbWUpOwotICAgICAgdGhpcy5wdXNoU291cmNlKG5hbWUg
KyAiID0gIiArIHZhbCArICI7Iik7Ci0gICAgfSwKLQotICAgIHVzZVJlZ2lzdGVyOiBmdW5jdGlv
bihuYW1lKSB7Ci0gICAgICBpZighdGhpcy5yZWdpc3RlcnNbbmFtZV0pIHsKLSAgICAgICAgdGhp
cy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwotICAgICAgICB0aGlzLnJlZ2lzdGVycy5saXN0LnB1
c2gobmFtZSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIHB1c2hTdGFja0xpdGVyYWw6IGZ1bmN0
aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwot
ICAgIH0sCi0KLSAgICBwdXNoU291cmNlOiBmdW5jdGlvbihzb3VyY2UpIHsKLSAgICAgIGlmICh0
aGlzLnBlbmRpbmdDb250ZW50KSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBl
bmRUb0J1ZmZlcih0aGlzLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSkpOwotICAg
ICAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gdW5kZWZpbmVkOwotICAgICAgfQotCi0gICAgICBp
ZiAoc291cmNlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2goc291cmNlKTsKLSAgICAgIH0K
LSAgICB9LAotCi0gICAgcHVzaFN0YWNrOiBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICB0aGlzLmZs
dXNoSW5saW5lKCk7Ci0KLSAgICAgIHZhciBzdGFjayA9IHRoaXMuaW5jclN0YWNrKCk7Ci0gICAg
ICBpZiAoaXRlbSkgewotICAgICAgICB0aGlzLnB1c2hTb3VyY2Uoc3RhY2sgKyAiID0gIiArIGl0
ZW0gKyAiOyIpOwotICAgICAgfQotICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7
Ci0gICAgICByZXR1cm4gc3RhY2s7Ci0gICAgfSwKLQotICAgIHJlcGxhY2VTdGFjazogZnVuY3Rp
b24oY2FsbGJhY2spIHsKLSAgICAgIHZhciBwcmVmaXggPSAnJywKLSAgICAgICAgICBpbmxpbmUg
PSB0aGlzLmlzSW5saW5lKCksCi0gICAgICAgICAgc3RhY2ssCi0gICAgICAgICAgY3JlYXRlZFN0
YWNrLAotICAgICAgICAgIHVzZWRMaXRlcmFsOwotCi0gICAgICAvLyBJZiB3ZSBhcmUgY3VycmVu
dGx5IGlubGluZSB0aGVuIHdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50
byB0aGUKLSAgICAgIC8vIHJlcGxhY2VtZW50IHN0YXRlbWVudCB2aWEgJywnCi0gICAgICBpZiAo
aW5saW5lKSB7Ci0gICAgICAgIHZhciB0b3AgPSB0aGlzLnBvcFN0YWNrKHRydWUpOwotCi0gICAg
ICAgIGlmICh0b3AgaW5zdGFuY2VvZiBMaXRlcmFsKSB7Ci0gICAgICAgICAgLy8gTGl0ZXJhbHMg
ZG8gbm90IG5lZWQgdG8gYmUgaW5saW5lZAotICAgICAgICAgIHN0YWNrID0gdG9wLnZhbHVlOwot
ICAgICAgICAgIHVzZWRMaXRlcmFsID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUg
aW5saW5lCi0gICAgICAgICAgY3JlYXRlZFN0YWNrID0gIXRoaXMuc3RhY2tTbG90OwotICAgICAg
ICAgIHZhciBuYW1lID0gIWNyZWF0ZWRTdGFjayA/IHRoaXMudG9wU3RhY2tOYW1lKCkgOiB0aGlz
LmluY3JTdGFjaygpOwotCi0gICAgICAgICAgcHJlZml4ID0gJygnICsgdGhpcy5wdXNoKG5hbWUp
ICsgJyA9ICcgKyB0b3AgKyAnKSwnOwotICAgICAgICAgIHN0YWNrID0gdGhpcy50b3BTdGFjaygp
OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGFjayA9IHRoaXMudG9wU3Rh
Y2soKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGl0ZW0gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0
YWNrKTsKLQotICAgICAgaWYgKGlubGluZSkgewotICAgICAgICBpZiAoIXVzZWRMaXRlcmFsKSB7
Ci0gICAgICAgICAgdGhpcy5wb3BTdGFjaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjcmVh
dGVkU3RhY2spIHsKLSAgICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwotICAgICAgICB9Ci0gICAg
ICAgIHRoaXMucHVzaCgnKCcgKyBwcmVmaXggKyBpdGVtICsgJyknKTsKLSAgICAgIH0gZWxzZSB7
Ci0gICAgICAgIC8vIFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IGRlcHRoIHZh
cmlhYmxlLiBUaHJvdWdoIHJlcGxhY2VTdGFjawotICAgICAgICBpZiAoIS9ec3RhY2svLnRlc3Qo
c3RhY2spKSB7Ci0gICAgICAgICAgc3RhY2sgPSB0aGlzLm5leHRTdGFjaygpOwotICAgICAgICB9
Ci0KLSAgICAgICAgdGhpcy5wdXNoU291cmNlKHN0YWNrICsgIiA9ICgiICsgcHJlZml4ICsgaXRl
bSArICIpOyIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN0YWNrOwotICAgIH0sCi0KLSAgICBu
ZXh0U3RhY2s6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCk7Ci0g
ICAgfSwKLQotICAgIGluY3JTdGFjazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnN0YWNrU2xv
dCsrOwotICAgICAgaWYodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsg
dGhpcy5zdGFja1ZhcnMucHVzaCgic3RhY2siICsgdGhpcy5zdGFja1Nsb3QpOyB9Ci0gICAgICBy
ZXR1cm4gdGhpcy50b3BTdGFja05hbWUoKTsKLSAgICB9LAotICAgIHRvcFN0YWNrTmFtZTogZnVu
Y3Rpb24oKSB7Ci0gICAgICByZXR1cm4gInN0YWNrIiArIHRoaXMuc3RhY2tTbG90OwotICAgIH0s
Ci0gICAgZmx1c2hJbmxpbmU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGlubGluZVN0YWNrID0g
dGhpcy5pbmxpbmVTdGFjazsKLSAgICAgIGlmIChpbmxpbmVTdGFjay5sZW5ndGgpIHsKLSAgICAg
ICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdOwotICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0g
aW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICB2YXIgZW50cnkg
PSBpbmxpbmVTdGFja1tpXTsKLSAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFs
KSB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBpbGVTdGFjay5wdXNoKGVudHJ5KTsKLSAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wdXNoU3RhY2soZW50cnkpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0gICAgaXNJbmxpbmU6IGZ1bmN0aW9uKCkg
ewotICAgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwotICAgIH0sCi0KLSAgICBw
b3BTdGFjazogZnVuY3Rpb24od3JhcHBlZCkgewotICAgICAgdmFyIGlubGluZSA9IHRoaXMuaXNJ
bmxpbmUoKSwKLSAgICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0
aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7Ci0KLSAgICAgIGlmICghd3JhcHBlZCAmJiAoaXRlbSBp
bnN0YW5jZW9mIExpdGVyYWwpKSB7Ci0gICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgaWYgKCFpbmxpbmUpIHsKLSAgICAgICAgICBpZiAoIXRoaXMuc3Rh
Y2tTbG90KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIHN0YWNr
IHBvcCcpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgICAgfQotICAgIH0sCi0KLSAgICB0b3BTdGFj
azogZnVuY3Rpb24od3JhcHBlZCkgewotICAgICAgdmFyIHN0YWNrID0gKHRoaXMuaXNJbmxpbmUo
KSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjayksCi0gICAgICAgICAgaXRl
bSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwotCi0gICAgICBpZiAoIXdyYXBwZWQgJiYgKGl0
ZW0gaW5zdGFuY2VvZiBMaXRlcmFsKSkgewotICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKLSAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgICAgfQotICAgIH0sCi0KLSAg
ICBxdW90ZWRTdHJpbmc6IGZ1bmN0aW9uKHN0cikgewotICAgICAgcmV0dXJuICciJyArIHN0cgot
ICAgICAgICAucmVwbGFjZSgvXFwvZywgJ1xcXFwnKQotICAgICAgICAucmVwbGFjZSgvIi9nLCAn
XFwiJykKLSAgICAgICAgLnJlcGxhY2UoL1xuL2csICdcXG4nKQotICAgICAgICAucmVwbGFjZSgv
XHIvZywgJ1xccicpCi0gICAgICAgIC5yZXBsYWNlKC9cdTIwMjgvZywgJ1xcdTIwMjgnKSAgIC8v
IFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAotICAgICAgICAucmVwbGFjZSgvXHUyMDI5L2csICdc
XHUyMDI5JykgKyAnIic7Ci0gICAgfSwKLQotICAgIHNldHVwSGVscGVyOiBmdW5jdGlvbihwYXJh
bVNpemUsIG5hbWUsIG1pc3NpbmdQYXJhbXMpIHsKLSAgICAgIHZhciBwYXJhbXMgPSBbXSwKLSAg
ICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cFBhcmFtcyhwYXJhbVNpemUsIHBhcmFtcywg
bWlzc2luZ1BhcmFtcyk7Ci0gICAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAo
J2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0KLSAgICAgIHJldHVybiB7Ci0gICAgICAgIHBh
cmFtczogcGFyYW1zLAotICAgICAgICBwYXJhbXNJbml0OiBwYXJhbXNJbml0LAotICAgICAgICBu
YW1lOiBmb3VuZEhlbHBlciwKLSAgICAgICAgY2FsbFBhcmFtczogWyJkZXB0aDAiXS5jb25jYXQo
cGFyYW1zKS5qb2luKCIsICIpLAotICAgICAgICBoZWxwZXJNaXNzaW5nUGFyYW1zOiBtaXNzaW5n
UGFyYW1zICYmIFsiZGVwdGgwIiwgdGhpcy5xdW90ZWRTdHJpbmcobmFtZSldLmNvbmNhdChwYXJh
bXMpLmpvaW4oIiwgIikKLSAgICAgIH07Ci0gICAgfSwKLQotICAgIHNldHVwT3B0aW9uczogZnVu
Y3Rpb24ocGFyYW1TaXplLCBwYXJhbXMpIHsKLSAgICAgIHZhciBvcHRpb25zID0gW10sIGNvbnRl
eHRzID0gW10sIHR5cGVzID0gW10sIHBhcmFtLCBpbnZlcnNlLCBwcm9ncmFtOwotCi0gICAgICBv
cHRpb25zLnB1c2goImhhc2g6IiArIHRoaXMucG9wU3RhY2soKSk7Ci0KLSAgICAgIGlmICh0aGlz
Lm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7Ci0gICAgICAgIG9wdGlvbnMucHVzaCgiaGFzaFR5cGVz
OiIgKyB0aGlzLnBvcFN0YWNrKCkpOwotICAgICAgICBvcHRpb25zLnB1c2goImhhc2hDb250ZXh0
czoiICsgdGhpcy5wb3BTdGFjaygpKTsKLSAgICAgIH0KLQotICAgICAgaW52ZXJzZSA9IHRoaXMu
cG9wU3RhY2soKTsKLSAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7Ci0KLSAgICAgIC8v
IEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFs
bG93cwotICAgICAgLy8gaGVscGVycyB0byBkbyBhIGNoZWNrIGZvciBgaWYgKG9wdGlvbnMuZm4p
YAotICAgICAgaWYgKHByb2dyYW0gfHwgaW52ZXJzZSkgewotICAgICAgICBpZiAoIXByb2dyYW0p
IHsKLSAgICAgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOwotICAgICAg
ICAgIHByb2dyYW0gPSAic2VsZi5ub29wIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW52
ZXJzZSkgewotICAgICAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7Ci0g
ICAgICAgICAgaW52ZXJzZSA9ICJzZWxmLm5vb3AiOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0
aW9ucy5wdXNoKCJpbnZlcnNlOiIgKyBpbnZlcnNlKTsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJm
bjoiICsgcHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvcih2YXIgaT0wOyBpPHBhcmFtU2l6
ZTsgaSsrKSB7Ci0gICAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwotICAgICAgICBwYXJh
bXMucHVzaChwYXJhbSk7Ci0KLSAgICAgICAgaWYodGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykg
ewotICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5wb3BTdGFjaygpKTsKLSAgICAgICAgICBjb250
ZXh0cy5wdXNoKHRoaXMucG9wU3RhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAg
aWYgKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJj
b250ZXh0czpbIiArIGNvbnRleHRzLmpvaW4oIiwiKSArICJdIik7Ci0gICAgICAgIG9wdGlvbnMu
cHVzaCgidHlwZXM6WyIgKyB0eXBlcy5qb2luKCIsIikgKyAiXSIpOwotICAgICAgfQotCi0gICAg
ICBpZih0aGlzLm9wdGlvbnMuZGF0YSkgewotICAgICAgICBvcHRpb25zLnB1c2goImRhdGE6ZGF0
YSIpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9LAotCi0gICAgLy8g
dGhlIHBhcmFtcyBhbmQgY29udGV4dHMgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gYXJyYXlzCi0g
ICAgLy8gdG8gZmlsbCBpbgotICAgIHNldHVwUGFyYW1zOiBmdW5jdGlvbihwYXJhbVNpemUsIHBh
cmFtcywgdXNlUmVnaXN0ZXIpIHsKLSAgICAgIHZhciBvcHRpb25zID0gJ3snICsgdGhpcy5zZXR1
cE9wdGlvbnMocGFyYW1TaXplLCBwYXJhbXMpLmpvaW4oJywnKSArICd9JzsKLQotICAgICAgaWYg
KHVzZVJlZ2lzdGVyKSB7Ci0gICAgICAgIHRoaXMudXNlUmVnaXN0ZXIoJ29wdGlvbnMnKTsKLSAg
ICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKLSAgICAgICAgcmV0dXJuICdvcHRpb25zPScg
KyBvcHRpb25zOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1zLnB1c2gob3B0aW9ucyk7
Ci0gICAgICAgIHJldHVybiAnJzsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0KLSAgdmFyIHJlc2Vy
dmVkV29yZHMgPSAoCi0gICAgImJyZWFrIGVsc2UgbmV3IHZhciIgKwotICAgICIgY2FzZSBmaW5h
bGx5IHJldHVybiB2b2lkIiArCi0gICAgIiBjYXRjaCBmb3Igc3dpdGNoIHdoaWxlIiArCi0gICAg
IiBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgiICsKLSAgICAiIGRlZmF1bHQgaWYgdGhyb3ci
ICsKLSAgICAiIGRlbGV0ZSBpbiB0cnkiICsKLSAgICAiIGRvIGluc3RhbmNlb2YgdHlwZW9mIiAr
Ci0gICAgIiBhYnN0cmFjdCBlbnVtIGludCBzaG9ydCIgKwotICAgICIgYm9vbGVhbiBleHBvcnQg
aW50ZXJmYWNlIHN0YXRpYyIgKwotICAgICIgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXIiICsKLSAg
ICAiIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9uaXplZCIgKwotICAgICIgY2xhc3MgZmxvYXQg
cGFja2FnZSB0aHJvd3MiICsKLSAgICAiIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQiICsK
LSAgICAiIGRlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlIiArCi0gICAgIiBk
b3VibGUgaW1wb3J0IHB1YmxpYyBsZXQgeWllbGQiCi0gICkuc3BsaXQoIiAiKTsKLQotICB2YXIg
Y29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9Owot
Ci0gIGZvcih2YXIgaT0wLCBsPXJlc2VydmVkV29yZHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAg
IGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwotICB9Ci0KLSAgSmF2YVNj
cmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24obmFt
ZSkgewotICAgIGlmKCFKYXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYg
L15bYS16QS1aXyRdWzAtOWEtekEtWl8kXSokLy50ZXN0KG5hbWUpKSB7Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9OwotCi0gIF9fZXhwb3J0c19fID0g
SmF2YVNjcmlwdENvbXBpbGVyOwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTJf
XywgX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzLmpzCi12YXIgX19tb2R1bGUwX18gPSAo
ZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNf
XywgX19kZXBlbmRlbmN5NF9fLCBfX2RlcGVuZGVuY3k1X18pIHsKLSAgInVzZSBzdHJpY3QiOwot
ICB2YXIgX19leHBvcnRzX187Ci0gIC8qZ2xvYmFscyBIYW5kbGViYXJzOiB0cnVlICovCi0gIHZh
ciBIYW5kbGViYXJzID0gX19kZXBlbmRlbmN5MV9fOwotCi0gIC8vIENvbXBpbGVyIGltcG9ydHMK
LSAgdmFyIEFTVCA9IF9fZGVwZW5kZW5jeTJfXzsKLSAgdmFyIFBhcnNlciA9IF9fZGVwZW5kZW5j
eTNfXy5wYXJzZXI7Ci0gIHZhciBwYXJzZSA9IF9fZGVwZW5kZW5jeTNfXy5wYXJzZTsKLSAgdmFy
IENvbXBpbGVyID0gX19kZXBlbmRlbmN5NF9fLkNvbXBpbGVyOwotICB2YXIgY29tcGlsZSA9IF9f
ZGVwZW5kZW5jeTRfXy5jb21waWxlOwotICB2YXIgcHJlY29tcGlsZSA9IF9fZGVwZW5kZW5jeTRf
Xy5wcmVjb21waWxlOwotICB2YXIgSmF2YVNjcmlwdENvbXBpbGVyID0gX19kZXBlbmRlbmN5NV9f
OwotCi0gIHZhciBfY3JlYXRlID0gSGFuZGxlYmFycy5jcmVhdGU7Ci0gIHZhciBjcmVhdGUgPSBm
dW5jdGlvbigpIHsKLSAgICB2YXIgaGIgPSBfY3JlYXRlKCk7Ci0KLSAgICBoYi5jb21waWxlID0g
ZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHsKLSAgICAgIHJldHVybiBjb21waWxlKGlucHV0LCBv
cHRpb25zLCBoYik7Ci0gICAgfTsKLSAgICBoYi5wcmVjb21waWxlID0gZnVuY3Rpb24gKGlucHV0
LCBvcHRpb25zKSB7Ci0gICAgICByZXR1cm4gcHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIp
OwotICAgIH07Ci0KLSAgICBoYi5BU1QgPSBBU1Q7Ci0gICAgaGIuQ29tcGlsZXIgPSBDb21waWxl
cjsKLSAgICBoYi5KYXZhU2NyaXB0Q29tcGlsZXIgPSBKYXZhU2NyaXB0Q29tcGlsZXI7Ci0gICAg
aGIuUGFyc2VyID0gUGFyc2VyOwotICAgIGhiLnBhcnNlID0gcGFyc2U7Ci0KLSAgICByZXR1cm4g
aGI7Ci0gIH07Ci0KLSAgSGFuZGxlYmFycyA9IGNyZWF0ZSgpOwotICBIYW5kbGViYXJzLmNyZWF0
ZSA9IGNyZWF0ZTsKLQotICBfX2V4cG9ydHNfXyA9IEhhbmRsZWJhcnM7Ci0gIHJldHVybiBfX2V4
cG9ydHNfXzsKLX0pKF9fbW9kdWxlMV9fLCBfX21vZHVsZTdfXywgX19tb2R1bGU4X18sIF9fbW9k
dWxlMTBfXywgX19tb2R1bGUxMV9fKTsKLQotICByZXR1cm4gX19tb2R1bGUwX187Ci19KSgpOwpk
aWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9q
cXVlcnkuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2px
dWVyeS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkY2E4Y2E0MjU3ZGMzYjdl
YzAwYmU0MjlkZTZhZTE1NmQzNjc5OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5
L2pxdWVyeS5qcworKysgL2Rldi9udWxsCkBAIC0xLDkxMTEgKzAsMCBAQAotLyohCi0gKiBqUXVl
cnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjEuMAotICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgot
ICogSW5jbHVkZXMgU2l6emxlLmpzCi0gKiBodHRwOi8vc2l6emxlanMuY29tLwotICoKLSAqIENv
cHlyaWdodCAyMDA1LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250
cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQotICogaHR0cDovL2px
dWVyeS5vcmcvbGljZW5zZQotICoKLSAqIERhdGU6IDIwMTQtMDEtMjNUMjE6MTBaCi0gKi8KLQot
KGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7Ci0KLSAgICBpZiAoIHR5cGVvZiBtb2R1bGUg
PT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7Ci0g
ICAgICAgIC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hl
cmUgYSBwcm9wZXIgd2luZG93IGlzIHByZXNlbnQsCi0gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGZh
Y3RvcnkgYW5kIGdldCBqUXVlcnkKLSAgICAgICAgLy8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRv
IG5vdCBpbmhlcmVudGx5IHBvc3NlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQKLSAgICAgICAg
Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGpRdWVyeS1tYWtpbmcgZmFjdG9yeSBhcyBt
b2R1bGUuZXhwb3J0cwotICAgICAgICAvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0
aGUgY3JlYXRpb24gb2YgYSByZWFsIHdpbmRvdwotICAgICAgICAvLyBlLmcuIHZhciBqUXVlcnkg
PSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwotICAgICAgICAvLyBTZWUgdGlja2V0ICMxNDU0
OSBmb3IgbW9yZSBpbmZvCi0gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50
ID8KLSAgICAgICAgICAgIGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDoKLSAgICAgICAgICAgIGZ1
bmN0aW9uKCB3ICkgewotICAgICAgICAgICAgICAgIGlmICggIXcuZG9jdW1lbnQgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggImpRdWVyeSByZXF1aXJlcyBhIHdpbmRv
dyB3aXRoIGEgZG9jdW1lbnQiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWN0b3J5KCB3ICk7Ci0gICAgICAgICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGZhY3RvcnkoIGdsb2JhbCApOwotICAgIH0KLQotLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBp
cyBub3QgZGVmaW5lZCB5ZXQKLX0odHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5k
b3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHsKLQotLy8gQ2FuJ3QgZG8g
dGhpcyBiZWNhdXNlIHNldmVyYWwgYXBwcyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZQotLy8gdGhl
IHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCi0v
LyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggInVzZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEz
MzM1KQotLy8gU3VwcG9ydDogRmlyZWZveCAxOCsKLS8vCi0KLXZhciBhcnIgPSBbXTsKLQotdmFy
IHNsaWNlID0gYXJyLnNsaWNlOwotCi12YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKLQotdmFyIHB1
c2ggPSBhcnIucHVzaDsKLQotdmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjsKLQotdmFyIGNsYXNz
MnR5cGUgPSB7fTsKLQotdmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZzsKLQotdmFy
IGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7Ci0KLXZhciB0cmltID0gIiIudHJp
bTsKLQotdmFyIHN1cHBvcnQgPSB7fTsKLQotCi0KLXZhcgotICAgIC8vIFVzZSB0aGUgY29ycmVj
dCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKLSAg
ICBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKLQotICAgIHZlcnNpb24gPSAiMi4xLjAiLAot
Ci0gICAgLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKLSAgICBqUXVlcnkgPSBmdW5j
dGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7Ci0gICAgICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0
IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwotICAgICAg
ICAvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBi
ZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKQotICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5mbi5p
bml0KCBzZWxlY3RvciwgY29udGV4dCApOwotICAgIH0sCi0KLSAgICAvLyBNYXRjaGVzIGRhc2hl
ZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKLSAgICBybXNQcmVmaXggPSAvXi1tcy0vLAotICAgIHJk
YXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwKLQotICAgIC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVs
Q2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKLSAgICBmY2FtZWxDYXNlID0gZnVuY3Rpb24o
IGFsbCwgbGV0dGVyICkgewotICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Ci0g
ICAgfTsKLQotalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKLSAgICAvLyBUaGUgY3Vy
cmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCi0gICAganF1ZXJ5OiB2ZXJzaW9uLAot
Ci0gICAgY29uc3RydWN0b3I6IGpRdWVyeSwKLQotICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkg
c2VsZWN0b3IKLSAgICBzZWxlY3RvcjogIiIsCi0KLSAgICAvLyBUaGUgZGVmYXVsdCBsZW5ndGgg
b2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKLSAgICBsZW5ndGg6IDAsCi0KLSAgICB0b0FycmF5OiBm
dW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAot
Ci0gICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBP
UgotICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFy
cmF5Ci0gICAgZ2V0OiBmdW5jdGlvbiggbnVtICkgewotICAgICAgICByZXR1cm4gbnVtICE9IG51
bGwgPwotCi0gICAgICAgICAgICAvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5Ci0gICAgICAgICAg
ICAoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6
Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKLSAgICAgICAgICAgIHNs
aWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAotCi0gICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVt
ZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjawotICAgIC8vIChyZXR1cm5pbmcgdGhlIG5l
dyBtYXRjaGVkIGVsZW1lbnQgc2V0KQotICAgIHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkg
ewotCi0gICAgICAgIC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0Ci0g
ICAgICAgIHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMg
KTsKLQotICAgICAgICAvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEg
cmVmZXJlbmNlKQotICAgICAgICByZXQucHJldk9iamVjdCA9IHRoaXM7Ci0gICAgICAgIHJldC5j
b250ZXh0ID0gdGhpcy5jb250ZXh0OwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9y
bWVkIGVsZW1lbnQgc2V0Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwKLQotICAgIC8vIEV4
ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCi0g
ICAgLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywg
YnV0IHRoaXMgaXMKLSAgICAvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCi0gICAgZWFjaDogZnVu
Y3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewotICAgICAgICByZXR1cm4galF1ZXJ5LmVhY2goIHRo
aXMsIGNhbGxiYWNrLCBhcmdzICk7Ci0gICAgfSwKLQotICAgIG1hcDogZnVuY3Rpb24oIGNhbGxi
YWNrICkgewotICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywg
ZnVuY3Rpb24oIGVsZW0sIGkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCgg
ZWxlbSwgaSwgZWxlbSApOwotICAgICAgICB9KSk7Ci0gICAgfSwKLQotICAgIHNsaWNlOiBmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhp
cywgYXJndW1lbnRzICkgKTsKLSAgICB9LAotCi0gICAgZmlyc3Q6IGZ1bmN0aW9uKCkgewotICAg
ICAgICByZXR1cm4gdGhpcy5lcSggMCApOwotICAgIH0sCi0KLSAgICBsYXN0OiBmdW5jdGlvbigp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXEoIC0xICk7Ci0gICAgfSwKLQotICAgIGVxOiBmdW5j
dGlvbiggaSApIHsKLSAgICAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAotICAgICAgICAgICAg
aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTsKLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0
YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKLSAgICB9LAotCi0g
ICAgZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0
aGlzLmNvbnN0cnVjdG9yKG51bGwpOwotICAgIH0sCi0KLSAgICAvLyBGb3IgaW50ZXJuYWwgdXNl
IG9ubHkuCi0gICAgLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBh
IGpRdWVyeSBtZXRob2QuCi0gICAgcHVzaDogcHVzaCwKLSAgICBzb3J0OiBhcnIuc29ydCwKLSAg
ICBzcGxpY2U6IGFyci5zcGxpY2UKLX07Ci0KLWpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0
ZW5kID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29w
eUlzQXJyYXksIGNsb25lLAotICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCi0g
ICAgICAgIGkgPSAxLAotICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAotICAgICAg
ICBkZWVwID0gZmFsc2U7Ci0KLSAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCi0g
ICAgaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7Ci0gICAgICAgIGRlZXAgPSB0
YXJnZXQ7Ci0KLSAgICAgICAgLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAotICAg
ICAgICB0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTsKLSAgICAgICAgaSsrOwotICAgIH0K
LQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGlu
ZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQotICAgIGlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9i
amVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7Ci0gICAgICAgIHRhcmdldCA9
IHt9OwotICAgIH0KLQotICAgIC8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFy
Z3VtZW50IGlzIHBhc3NlZAotICAgIGlmICggaSA9PT0gbGVuZ3RoICkgewotICAgICAgICB0YXJn
ZXQgPSB0aGlzOwotICAgICAgICBpLS07Ci0gICAgfQotCi0gICAgZm9yICggOyBpIDwgbGVuZ3Ro
OyBpKysgKSB7Ci0gICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2
YWx1ZXMKLSAgICAgICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkg
ewotICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAotICAgICAgICAgICAgZm9y
ICggbmFtZSBpbiBvcHRpb25zICkgewotICAgICAgICAgICAgICAgIHNyYyA9IHRhcmdldFsgbmFt
ZSBdOwotICAgICAgICAgICAgICAgIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07Ci0KLSAgICAgICAg
ICAgICAgICAvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCi0gICAgICAgICAgICAgICAgaWYg
KCB0YXJnZXQgPT09IGNvcHkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVy
Z2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5cwotICAgICAgICAgICAgICAgIGlmICggZGVlcCAm
JiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0g
alF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggY29w
eUlzQXJyYXkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNl
OwotICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXko
c3JjKSA/IHNyYyA6IFtdOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMp
ID8gc3JjIDoge307Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAg
ICAvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KLSAgICAgICAgICAg
ICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29w
eSApOwotCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVl
cwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUg
bW9kaWZpZWQgb2JqZWN0Ci0gICAgcmV0dXJuIHRhcmdldDsKLX07Ci0KLWpRdWVyeS5leHRlbmQo
ewotICAgIC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQotICAg
IGV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2Uo
IC9cRC9nLCAiIiApLAotCi0gICAgLy8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRo
ZSByZWFkeSBtb2R1bGUKLSAgICBpc1JlYWR5OiB0cnVlLAotCi0gICAgZXJyb3I6IGZ1bmN0aW9u
KCBtc2cgKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvciggbXNnICk7Ci0gICAgfSwKLQotICAg
IG5vb3A6IGZ1bmN0aW9uKCkge30sCi0KLSAgICAvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9y
IGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgotICAgIC8vIFNpbmNlIHZlcnNpb24gMS4z
LCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKLSAgICAvLyBhcmVuJ3Qgc3Vw
cG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgotICAgIGlzRnVuY3Rpb246
IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAi
ZnVuY3Rpb24iOwotICAgIH0sCi0KLSAgICBpc0FycmF5OiBBcnJheS5pc0FycmF5LAotCi0gICAg
aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAm
JiBvYmogPT09IG9iai53aW5kb3c7Ci0gICAgfSwKLQotICAgIGlzTnVtZXJpYzogZnVuY3Rpb24o
IG9iaiApIHsKLSAgICAgICAgLy8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBw
b3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXwiIikKLSAgICAgICAgLy8gLi4uYnV0IG1pc2ludGVy
cHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAo
IjB4Li4uIikKLSAgICAgICAgLy8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFO
Ci0gICAgICAgIHJldHVybiBvYmogLSBwYXJzZUZsb2F0KCBvYmogKSA+PSAwOwotICAgIH0sCi0K
LSAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewotICAgICAgICAvLyBOb3QgcGxh
aW4gb2JqZWN0czoKLSAgICAgICAgLy8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVy
bmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgIltvYmplY3QgT2JqZWN0XSIKLSAgICAgICAg
Ly8gLSBET00gbm9kZXMKLSAgICAgICAgLy8gLSB3aW5kb3cKLSAgICAgICAgaWYgKCBqUXVlcnku
dHlwZSggb2JqICkgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5k
b3coIG9iaiApICkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gU3VwcG9ydDogRmlyZWZveCA8MjAKLSAgICAgICAgLy8gVGhlIHRyeS9jYXRjaCBz
dXBwcmVzc2VzIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MKLSAg
ICAgICAgLy8gdGhlICJjb25zdHJ1Y3RvciIgcHJvcGVydHkgb2YgY2VydGFpbiBob3N0IG9iamVj
dHMsIGllLiB8d2luZG93LmxvY2F0aW9ufAotICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1v
emlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04MTQ2MjIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAg
ICAgIGlmICggb2JqLmNvbnN0cnVjdG9yICYmCi0gICAgICAgICAgICAgICAgICAgICFoYXNPd24u
Y2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiICkgKSB7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNh
dGNoICggZSApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgcmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29u
ZmlkZW50IHRoYXQKLSAgICAgICAgLy8gfG9ianwgaXMgYSBwbGFpbiBvYmplY3QsIGNyZWF0ZWQg
Ynkge30gb3IgY29uc3RydWN0ZWQgd2l0aCBuZXcgT2JqZWN0Ci0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIH0sCi0KLSAgICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewotICAgICAg
ICB2YXIgbmFtZTsKLSAgICAgICAgZm9yICggbmFtZSBpbiBvYmogKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQot
ICAgIHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIGlmICggb2JqID09IG51bGwgKSB7
Ci0gICAgICAgICAgICByZXR1cm4gb2JqICsgIiI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3Vw
cG9ydDogQW5kcm9pZCA8IDQuMCwgaU9TIDwgNiAoZnVuY3Rpb25pc2ggUmVnRXhwKQotICAgICAg
ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0
aW9uIiA/Ci0gICAgICAgICAgICBjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKG9iaikgXSB8fCAi
b2JqZWN0IiA6Ci0gICAgICAgICAgICB0eXBlb2Ygb2JqOwotICAgIH0sCi0KLSAgICAvLyBFdmFs
dWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAotICAgIGdsb2JhbEV2YWw6IGZ1bmN0
aW9uKCBjb2RlICkgewotICAgICAgICB2YXIgc2NyaXB0LAotICAgICAgICAgICAgaW5kaXJlY3Qg
PSBldmFsOwotCi0gICAgICAgIGNvZGUgPSBqUXVlcnkudHJpbSggY29kZSApOwotCi0gICAgICAg
IGlmICggY29kZSApIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFs
aWQsIHByb2xvZ3VlIHBvc2l0aW9uCi0gICAgICAgICAgICAvLyBzdHJpY3QgbW9kZSBwcmFnbWEs
IGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYQotICAgICAgICAgICAgLy8gc2NyaXB0IHRhZyBp
bnRvIHRoZSBkb2N1bWVudC4KLSAgICAgICAgICAgIGlmICggY29kZS5pbmRleE9mKCJ1c2Ugc3Ry
aWN0IikgPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgic2NyaXB0Iik7Ci0gICAgICAgICAgICAgICAgc2NyaXB0LnRleHQgPSBjb2RlOwot
ICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVu
dE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIC8vIE90aGVyd2lzZSwgYXZvaWQgdGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRp
b24KLSAgICAgICAgICAgIC8vIGFuZCByZW1vdmFsIGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2Jh
bCBldmFsCi0gICAgICAgICAgICAgICAgaW5kaXJlY3QoIGNvZGUgKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7
IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCi0gICAgLy8gTWljcm9zb2Z0IGZvcmdv
dCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQotICAgIGNhbWVsQ2FzZTogZnVu
Y3Rpb24oIHN0cmluZyApIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVm
aXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwotICAgIH0sCi0K
LSAgICBub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgICAgIHJldHVybiBl
bGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xv
d2VyQ2FzZSgpOwotICAgIH0sCi0KLSAgICAvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBv
bmx5Ci0gICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7Ci0gICAgICAg
IHZhciB2YWx1ZSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbGVuZ3RoID0gb2Jq
Lmxlbmd0aCwKLSAgICAgICAgICAgIGlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7Ci0KLSAg
ICAgICAgaWYgKCBhcmdzICkgewotICAgICAgICAgICAgaWYgKCBpc0FycmF5ICkgewotICAgICAg
ICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAg
ICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOwotCi0gICAgICAgICAg
ICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoIGkgaW4gb2JqICkgewotICAg
ICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyAp
OwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgLy8gQSBzcGVjaWFsLCBmYXN0LCBj
YXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGlmICggaXNBcnJheSApIHsKLSAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBs
ZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxs
KCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHZh
bHVlID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICBmb3IgKCBpIGluIG9iaiApIHsKLSAgICAgICAgICAgICAgICAgICAg
dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotICAgICAg
ICAgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9LAot
Ci0gICAgdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0ID09IG51
bGwgPyAiIiA6IHRyaW0uY2FsbCggdGV4dCApOwotICAgIH0sCi0KLSAgICAvLyByZXN1bHRzIGlz
IGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0gICAgbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCBy
ZXN1bHRzICkgewotICAgICAgICB2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKLQotICAgICAgICBp
ZiAoIGFyciAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKCBpc0FycmF5bGlrZSggT2JqZWN0
KGFycikgKSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkubWVyZ2UoIHJldCwKLSAgICAgICAg
ICAgICAgICAgICAgdHlwZW9mIGFyciA9PT0gInN0cmluZyIgPwotICAgICAgICAgICAgICAgICAg
ICBbIGFyciBdIDogYXJyCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgcHVzaC5jYWxsKCByZXQsIGFyciApOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9LAotCi0gICAgaW5BcnJheTog
ZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKLSAgICAgICAgcmV0dXJuIGFyciA9PSBudWxsID8g
LTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApOwotICAgIH0sCi0KLSAgICBtZXJnZTog
ZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7Ci0gICAgICAgIHZhciBsZW4gPSArc2Vjb25kLmxl
bmd0aCwKLSAgICAgICAgICAgIGogPSAwLAotICAgICAgICAgICAgaSA9IGZpcnN0Lmxlbmd0aDsK
LQotICAgICAgICBmb3IgKCA7IGogPCBsZW47IGorKyApIHsKLSAgICAgICAgICAgIGZpcnN0WyBp
KysgXSA9IHNlY29uZFsgaiBdOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyc3QubGVuZ3RoID0g
aTsKLQotICAgICAgICByZXR1cm4gZmlyc3Q7Ci0gICAgfSwKLQotICAgIGdyZXA6IGZ1bmN0aW9u
KCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrSW52ZXJz
ZSwKLSAgICAgICAgICAgIG1hdGNoZXMgPSBbXSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAg
ICAgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAotICAgICAgICAgICAgY2FsbGJhY2tFeHBlY3Qg
PSAhaW52ZXJ0OwotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmlu
ZyB0aGUgaXRlbXMKLSAgICAgICAgLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24K
LSAgICAgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBjYWxsYmFj
a0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKLSAgICAgICAgICAgIGlmICgg
Y2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKLSAgICAgICAgICAgICAgICBt
YXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0sCi0KLSAgICAvLyBhcmcgaXMgZm9yIGludGVy
bmFsIHVzYWdlIG9ubHkKLSAgICBtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyAp
IHsKLSAgICAgICAgdmFyIHZhbHVlLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAgICBs
ZW5ndGggPSBlbGVtcy5sZW5ndGgsCi0gICAgICAgICAgICBpc0FycmF5ID0gaXNBcnJheWxpa2Uo
IGVsZW1zICksCi0gICAgICAgICAgICByZXQgPSBbXTsKLQotICAgICAgICAvLyBHbyB0aHJvdWdo
IHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZh
bHVlcwotICAgICAgICBpZiAoIGlzQXJyYXkgKSB7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBs
ZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sg
aSBdLCBpLCBhcmcgKTsKLQotICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsK
LSAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRo
ZSBvYmplY3QsCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKCBpIGluIGVsZW1z
ICkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFy
ZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAg
ICAgICAgICAgICByZXQucHVzaCggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlz
Ci0gICAgICAgIHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKLSAgICB9LAotCi0gICAg
Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCi0gICAgZ3VpZDogMSwKLQotICAg
IC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFw
cGx5aW5nIGFueQotICAgIC8vIGFyZ3VtZW50cy4KLSAgICBwcm94eTogZnVuY3Rpb24oIGZuLCBj
b250ZXh0ICkgewotICAgICAgICB2YXIgdG1wLCBhcmdzLCBwcm94eTsKLQotICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0ID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHRtcCA9IGZuWyBj
b250ZXh0IF07Ci0gICAgICAgICAgICBjb250ZXh0ID0gZm47Ci0gICAgICAgICAgICBmbiA9IHRt
cDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0
YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCi0gICAgICAgIC8vIHRoaXMgdGhyb3dzIGEg
VHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCi0gICAgICAgIGlm
ICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVm
aW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNpbXVsYXRlZCBiaW5kCi0gICAgICAgIGFy
Z3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKLSAgICAgICAgcHJveHkgPSBmdW5jdGlv
bigpIHsKLSAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdz
LmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApOwotICAgICAgICB9OwotCi0gICAg
ICAgIC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmln
aW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAotICAgICAgICBwcm94eS5ndWlkID0g
Zm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKLQotICAgICAgICByZXR1cm4gcHJv
eHk7Ci0gICAgfSwKLQotICAgIG5vdzogRGF0ZS5ub3csCi0KLSAgICAvLyBqUXVlcnkuc3VwcG9y
dCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXIKLSAg
ICAvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgotICAgIHN1cHBvcnQ6
IHN1cHBvcnQKLX0pOwotCi0vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXAKLWpRdWVyeS5l
YWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2Jq
ZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7Ci0gICAgY2xhc3MydHlw
ZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLX0pOwot
Ci1mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgewotICAgIHZhciBsZW5ndGggPSBvYmoubGVu
Z3RoLAotICAgICAgICB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApOwotCi0gICAgaWYgKCB0eXBl
ID09PSAiZnVuY3Rpb24iIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5n
dGggKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiB0eXBlID09
PSAiYXJyYXkiIHx8IGxlbmd0aCA9PT0gMCB8fAotICAgICAgICB0eXBlb2YgbGVuZ3RoID09PSAi
bnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKLX0KLXZhciBT
aXp6bGUgPQotLyohCi0gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2MS4xMC4xNgotICog
aHR0cDovL3NpenpsZWpzLmNvbS8KLSAqCi0gKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRh
dGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUg
TUlUIGxpY2Vuc2UKLSAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKLSAqCi0gKiBEYXRlOiAy
MDE0LTAxLTEzCi0gKi8KLShmdW5jdGlvbiggd2luZG93ICkgewotCi12YXIgaSwKLSAgICBzdXBw
b3J0LAotICAgIEV4cHIsCi0gICAgZ2V0VGV4dCwKLSAgICBpc1hNTCwKLSAgICBjb21waWxlLAot
ICAgIG91dGVybW9zdENvbnRleHQsCi0gICAgc29ydElucHV0LAotICAgIGhhc0R1cGxpY2F0ZSwK
LQotICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMKLSAgICBzZXREb2N1bWVudCwKLSAgICBkb2N1
bWVudCwKLSAgICBkb2NFbGVtLAotICAgIGRvY3VtZW50SXNIVE1MLAotICAgIHJidWdneVFTQSwK
LSAgICByYnVnZ3lNYXRjaGVzLAotICAgIG1hdGNoZXMsCi0gICAgY29udGFpbnMsCi0KLSAgICAv
LyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCi0gICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcg
RGF0ZSgpKSwKLSAgICBwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsCi0gICAgZGlycnVu
cyA9IDAsCi0gICAgZG9uZSA9IDAsCi0gICAgY2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0g
ICAgdG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0gICAgY29tcGlsZXJDYWNoZSA9IGNyZWF0
ZUNhY2hlKCksCi0gICAgc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIGlm
ICggYSA9PT0gYiApIHsKLSAgICAgICAgICAgIGhhc0R1cGxpY2F0ZSA9IHRydWU7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSwKLQotICAgIC8vIEdlbmVyYWwtcHVycG9zZSBj
b25zdGFudHMKLSAgICBzdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAotICAgIE1BWF9O
RUdBVElWRSA9IDEgPDwgMzEsCi0KLSAgICAvLyBJbnN0YW5jZSBtZXRob2RzCi0gICAgaGFzT3du
ID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKLSAgICBhcnIgPSBbXSwKLSAgICBwb3AgPSBhcnIucG9w
LAotICAgIHB1c2hfbmF0aXZlID0gYXJyLnB1c2gsCi0gICAgcHVzaCA9IGFyci5wdXNoLAotICAg
IHNsaWNlID0gYXJyLnNsaWNlLAotICAgIC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBp
ZiB3ZSBjYW4ndCB1c2UgYSBuYXRpdmUgb25lCi0gICAgaW5kZXhPZiA9IGFyci5pbmRleE9mIHx8
IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICB2YXIgaSA9IDAsCi0gICAgICAgICAgICBsZW4g
PSB0aGlzLmxlbmd0aDsKLSAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAg
ICAgICBpZiAoIHRoaXNbaV0gPT09IGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0sCi0K
LSAgICBib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxh
eXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVu
fHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCi0KLSAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25z
Ci0KLSAgICAvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3Nz
My1zZWxlY3RvcnMvI3doaXRlc3BhY2UKLSAgICB3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxc
blxcZl0iLAotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0
ZXJzCi0gICAgY2hhcmFjdGVyRW5jb2RpbmcgPSAiKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4
YTBdKSsiLAotCi0gICAgLy8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJh
Y3RlcnMKLSAgICAvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmll
ciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9y
cwotICAgIC8vIFByb3BlciBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRh
dGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgotICAgIGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJF
bmNvZGluZy5yZXBsYWNlKCAidyIsICJ3IyIgKSwKLQotICAgIC8vIEFjY2VwdGFibGUgb3BlcmF0
b3JzIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwot
ICAgIGF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5j
b2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsKLSAgICAgICAgIiooPzooWypeJHwhfl0/PSkiICsg
d2hpdGVzcGFjZSArICIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlk
ZW50aWZpZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFjZSArICIqXFxdIiwKLQotICAgIC8vIFByZWZl
ciBhcmd1bWVudHMgcXVvdGVkLAotICAgIC8vICAgdGhlbiBub3QgY29udGFpbmluZyBwc2V1ZG9z
L2JyYWNrZXRzLAotICAgIC8vICAgdGhlbiBhdHRyaWJ1dGUgc2VsZWN0b3JzL25vbi1wYXJlbnRo
ZXRpY2FsIGV4cHJlc3Npb25zLAotICAgIC8vICAgdGhlbiBhbnl0aGluZyBlbHNlCi0gICAgLy8g
VGhlc2UgcHJlZmVyZW5jZXMgYXJlIGhlcmUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0
b3JzCi0gICAgLy8gICBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBQU0VVRE8gcHJlRmlsdGVyCi0g
ICAgcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKChbJ1wiXSko
KD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJp
YnV0ZXMucmVwbGFjZSggMywgOCApICsgIikqKXwuKilcXCl8KSIsCi0KLSAgICAvLyBMZWFkaW5n
IGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24t
d2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyCi0gICAgcnRyaW0gPSBu
ZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikq
KSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICksCi0KLSAgICByY29tbWEgPSBuZXcgUmVnRXhw
KCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwKLSAgICByY29t
YmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooWz4rfl18IiArIHdo
aXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCi0KLSAgICByYXR0cmlidXRlUXVv
dGVzID0gbmV3IFJlZ0V4cCggIj0iICsgd2hpdGVzcGFjZSArICIqKFteXFxdJ1wiXSo/KSIgKyB3
aGl0ZXNwYWNlICsgIipcXF0iLCAiZyIgKSwKLQotICAgIHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBw
c2V1ZG9zICksCi0gICAgcmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCAiXiIgKyBpZGVudGlmaWVy
ICsgIiQiICksCi0KLSAgICBtYXRjaEV4cHIgPSB7Ci0gICAgICAgICJJRCI6IG5ldyBSZWdFeHAo
ICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKLSAgICAgICAgIkNMQVNTIjogbmV3
IFJlZ0V4cCggIl5cXC4oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCi0gICAgICAgICJU
QUciOiBuZXcgUmVnRXhwKCAiXigiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAi
dyoiICkgKyAiKSIgKSwKLSAgICAgICAgIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1
dGVzICksCi0gICAgICAgICJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCi0g
ICAgICAgICJDSElMRCI6IG5ldyBSZWdFeHAoICJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1s
YXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsgd2hpdGVzcGFjZSArCi0gICAgICAgICAgICAi
KihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwp
IiArIHdoaXRlc3BhY2UgKwotICAgICAgICAgICAgIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSAr
ICIqXFwpfCkiLCAiaSIgKSwKLSAgICAgICAgImJvb2wiOiBuZXcgUmVnRXhwKCAiXig/OiIgKyBi
b29sZWFucyArICIpJCIsICJpIiApLAotICAgICAgICAvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBp
bXBsZW1lbnRpbmcgLmlzKCkKLSAgICAgICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGlu
ZyBpbiBgc2VsZWN0YAotICAgICAgICAibmVlZHNDb250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsg
d2hpdGVzcGFjZSArICIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCko
PzpcXCgiICsKLSAgICAgICAgICAgIHdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3
aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQotICAgIH0sCi0KLSAgICByaW5w
dXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKLSAgICByaGVhZGVy
ID0gL15oXGQkL2ksCi0KLSAgICBybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAot
Ci0gICAgLy8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mg
c2VsZWN0b3JzCi0gICAgcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1d
KykpJC8sCi0KLSAgICByc2libGluZyA9IC9bK35dLywKLSAgICByZXNjYXBlID0gLyd8XFwvZywK
LQotICAgIC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEu
aHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKLSAgICBydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxc
XChbXFxkYS1mXXsxLDZ9IiArIHdoaXRlc3BhY2UgKyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwu
KSIsICJpZyIgKSwKLSAgICBmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBl
ZFdoaXRlc3BhY2UgKSB7Ci0gICAgICAgIHZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEw
MDAwOwotICAgICAgICAvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAotICAgICAgICAvLyBTdXBw
b3J0OiBGaXJlZm94Ci0gICAgICAgIC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50
ZXJwcmV0YXRpb24gb2YgKyIweCIKLSAgICAgICAgcmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNj
YXBlZFdoaXRlc3BhY2UgPwotICAgICAgICAgICAgZXNjYXBlZCA6Ci0gICAgICAgICAgICBoaWdo
IDwgMCA/Ci0gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGVwb2ludAotICAgICAgICAgICAgICAg
IFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOgotICAgICAgICAgICAgICAg
IC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQotICAgICAg
ICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2gg
JiAweDNGRiB8IDB4REMwMCApOwotICAgIH07Ci0KLS8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5
KCBfLCBOb2RlTGlzdCApCi10cnkgewotICAgIHB1c2guYXBwbHkoCi0gICAgICAgIChhcnIgPSBz
bGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSwKLSAgICAgICAgcHJlZmVycmVk
RG9jLmNoaWxkTm9kZXMKLSAgICApOwotICAgIC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wCi0gICAg
Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseQotICAgIGFyclsgcHJlZmVycmVk
RG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Ci19IGNhdGNoICggZSApIHsKLSAgICBw
dXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/Ci0KLSAgICAgICAgLy8gTGV2ZXJhZ2Ugc2xpY2Ug
aWYgcG9zc2libGUKLSAgICAgICAgZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewotICAgICAgICAg
ICAgcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7Ci0gICAgICAg
IH0gOgotCi0gICAgICAgIC8vIFN1cHBvcnQ6IElFPDkKLSAgICAgICAgLy8gT3RoZXJ3aXNlIGFw
cGVuZCBkaXJlY3RseQotICAgICAgICBmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7Ci0gICAgICAg
ICAgICB2YXIgaiA9IHRhcmdldC5sZW5ndGgsCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAg
ICAgICAgICAvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgKLSAgICAgICAgICAgIHdoaWxl
ICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KLSAgICAgICAgICAgIHRhcmdldC5sZW5n
dGggPSBqIC0gMTsKLSAgICAgICAgfQotICAgIH07Ci19Ci0KLWZ1bmN0aW9uIFNpenpsZSggc2Vs
ZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFyIG1hdGNoLCBlbGVtLCBt
LCBub2RlVHlwZSwKLSAgICAgICAgLy8gUVNBIHZhcnMKLSAgICAgICAgaSwgZ3JvdXBzLCBvbGQs
IG5pZCwgbmV3Q29udGV4dCwgbmV3U2VsZWN0b3I7Ci0KLSAgICBpZiAoICggY29udGV4dCA/IGNv
bnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3Vt
ZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCggY29udGV4dCApOwotICAgIH0KLQotICAgIGNv
bnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwotICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IFtd
OwotCi0gICAgaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiAp
IHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgaWYgKCAobm9kZVR5cGUg
PSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsKLSAgICAgICAg
cmV0dXJuIFtdOwotICAgIH0KLQotICAgIGlmICggZG9jdW1lbnRJc0hUTUwgJiYgIXNlZWQgKSB7
Ci0KLSAgICAgICAgLy8gU2hvcnRjdXRzCi0gICAgICAgIGlmICggKG1hdGNoID0gcnF1aWNrRXhw
ci5leGVjKCBzZWxlY3RvciApKSApIHsKLSAgICAgICAgICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUo
IiNJRCIpCi0gICAgICAgICAgICBpZiAoIChtID0gbWF0Y2hbMV0pICkgewotICAgICAgICAgICAg
ICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBj
b250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNr
IHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCi0gICAgICAg
ICAgICAgICAgICAgIC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQg
KGpRdWVyeSAjNjk2MykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFy
ZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3
aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggZWxlbS5pZCA9PT0gbSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1
bHRzLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICBpZiAo
IGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCggbSApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMo
IGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gcmVzdWx0czsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIG1hdGNoWzJdICkgewotICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMs
IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgi
LkNMQVNTIikKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBv
cnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUgKSB7Ci0gICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFFTQSBwYXRoCi0gICAg
ICAgIGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBz
ZWxlY3RvciApKSApIHsKLSAgICAgICAgICAgIG5pZCA9IG9sZCA9IGV4cGFuZG87Ci0gICAgICAg
ICAgICBuZXdDb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gbm9k
ZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIC8vIHFTQSB3b3JrcyBzdHJh
bmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllcwotICAgICAgICAgICAgLy8gV2UgY2FuIHdv
cmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdAotICAg
ICAgICAgICAgLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBE
dXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCi0gICAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgd29y
ayBvbiBvYmplY3QgZWxlbWVudHMKLSAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDEgJiYg
Y29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKLSAgICAgICAg
ICAgICAgICBncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKLQotICAgICAgICAgICAgICAg
IGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJpZCIpKSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgbmlkID0gb2xkLnJlcGxhY2UoIHJlc2NhcGUsICJcXCQmIiApOwotICAgICAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRl
KCAiaWQiLCBuaWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmlkID0g
IltpZD0nIiArIG5pZCArICInXSAiOwotCi0gICAgICAgICAgICAgICAgaSA9IGdyb3Vwcy5sZW5n
dGg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0
b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dDsKLSAg
ICAgICAgICAgICAgICBuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIsIik7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICggbmV3U2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICAgICAg
dHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3Ig
KQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0czsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKHFzYUVycm9yKSB7Ci0gICAgICAgICAgICAg
ICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAhb2xkICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImlkIik7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgb3RoZXJzCi0gICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0
b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwotfQot
Ci0vKioKLSAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQotICogQHJl
dHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEg
YWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aAotICogIHByb3BlcnR5IG5hbWUgdGhlIChz
cGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4
cHIuY2FjaGVMZW5ndGgpCi0gKiAgZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQotICovCi1mdW5j
dGlvbiBjcmVhdGVDYWNoZSgpIHsKLSAgICB2YXIga2V5cyA9IFtdOwotCi0gICAgZnVuY3Rpb24g
Y2FjaGUoIGtleSwgdmFsdWUgKSB7Ci0gICAgICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9p
ZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAj
MTU3KQotICAgICAgICBpZiAoIGtleXMucHVzaCgga2V5ICsgIiAiICkgPiBFeHByLmNhY2hlTGVu
Z3RoICkgewotICAgICAgICAgICAgLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVz
Ci0gICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFsdWUpOwotICAgIH0KLSAgICBy
ZXR1cm4gY2FjaGU7Ci19Ci0KLS8qKgotICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVz
ZSBieSBTaXp6bGUKLSAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJr
Ci0gKi8KLWZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7Ci0gICAgZm5bIGV4cGFuZG8gXSA9
IHRydWU7Ci0gICAgcmV0dXJuIGZuOwotfQotCi0vKioKLSAqIFN1cHBvcnQgdGVzdGluZyB1c2lu
ZyBhbiBlbGVtZW50Ci0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQg
ZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHQKLSAqLwotZnVuY3Rpb24gYXNzZXJ0KCBm
biApIHsKLSAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0KLSAg
ICB0cnkgewotICAgICAgICByZXR1cm4gISFmbiggZGl2ICk7Ci0gICAgfSBjYXRjaCAoZSkgewot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgLy8gUmVtb3Zl
IGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0Ci0gICAgICAgIGlmICggZGl2LnBhcmVudE5vZGUg
KSB7Ci0gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7Ci0gICAg
ICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKLSAgICAgICAgZGl2ID0gbnVs
bDsKLSAgICB9Ci19Ci0KLS8qKgotICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2Yg
dGhlIHNwZWNpZmllZCBhdHRycwotICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJh
dGVkIGxpc3Qgb2YgYXR0cmlidXRlcwotICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUg
bWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi0gKi8KLWZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0
cnMsIGhhbmRsZXIgKSB7Ci0gICAgdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCi0gICAgICAg
IGkgPSBhdHRycy5sZW5ndGg7Ci0KLSAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgRXhwci5h
dHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7Ci0gICAgfQotfQotCi0vKioKLSAqIENoZWNr
cyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKLSAqIEBwYXJhbSB7RWxlbWVudH0gYQot
ICogQHBhcmFtIHtFbGVtZW50fSBiCi0gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3Mg
dGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKLSAq
LwotZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkgewotICAgIHZhciBjdXIgPSBiICYmIGEs
Ci0gICAgICAgIGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09
PSAxICYmCi0gICAgICAgICAgICAoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC0K
LSAgICAgICAgICAgICggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7Ci0KLSAgICAv
LyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKLSAgICBpZiAo
IGRpZmYgKSB7Ci0gICAgICAgIHJldHVybiBkaWZmOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlm
IGIgZm9sbG93cyBhCi0gICAgaWYgKCBjdXIgKSB7Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1
ci5uZXh0U2libGluZykgKSB7Ci0gICAgICAgICAgICBpZiAoIGN1ciA9PT0gYiApIHsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICByZXR1cm4gYSA/IDEgOiAtMTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24g
dG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzCi0gKiBAcGFyYW0ge1N0cmluZ30gdHlw
ZQotICovCi1mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4g
ZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xv
d2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUg
PT09IHR5cGU7Ci0gICAgfTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNl
IGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKLSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gKi8KLWZ1
bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4gZnVuY3Rpb24o
IGVsZW0gKSB7Ci0gICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp
OwotICAgICAgICByZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIp
ICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKLSAgICB9OwotfQotCi0vKioKLSAqIFJldHVybnMgYSBm
dW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHMKLSAqIEBwYXJhbSB7RnVu
Y3Rpb259IGZuCi0gKi8KLWZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkgewot
ICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewotICAgICAgICBh
cmd1bWVudCA9ICthcmd1bWVudDsKLSAgICAgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlv
biggc2VlZCwgbWF0Y2hlcyApIHsKLSAgICAgICAgICAgIHZhciBqLAotICAgICAgICAgICAgICAg
IG1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksCi0gICAgICAg
ICAgICAgICAgaSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIE1hdGNo
IGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlcwotICAgICAgICAgICAgd2hp
bGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhl
c1tpXSkgXSApIHsKLSAgICAgICAgICAgICAgICAgICAgc2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9
IHNlZWRbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7
Ci0gICAgfSk7Ci19Ci0KLS8qKgotICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBT
aXp6bGUgY29udGV4dAotICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHQKLSAqIEBy
ZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRh
YmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZQotICovCi1mdW5jdGlvbiB0ZXN0Q29udGV4dCgg
Y29udGV4dCApIHsKLSAgICByZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVt
ZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmIGNvbnRleHQ7Ci19Ci0KLS8vIEV4cG9z
ZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCi1zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQg
PSB7fTsKLQotLyoqCi0gKiBEZXRlY3RzIFhNTCBub2RlcwotICogQHBhcmFtIHtFbGVtZW50fE9i
amVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnQKLSAqIEByZXR1cm5zIHtCb29sZWFu
fSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKLSAqLwotaXNYTUwgPSBTaXp6
bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBkb2N1bWVudEVsZW1lbnQgaXMg
dmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0Ci0gICAgLy8gKHN1
Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpCi0gICAgdmFyIGRvY3VtZW50RWxl
bWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1l
bnQ7Ci0gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFt
ZSAhPT0gIkhUTUwiIDogZmFsc2U7Ci19OwotCi0vKioKLSAqIFNldHMgZG9jdW1lbnQtcmVsYXRl
ZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogQHBhcmFt
IHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8g
dXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKLSAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl
IGN1cnJlbnQgZG9jdW1lbnQKLSAqLwotc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQg
PSBmdW5jdGlvbiggbm9kZSApIHsKLSAgICB2YXIgaGFzQ29tcGFyZSwKLSAgICAgICAgZG9jID0g
bm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jLAotICAgICAg
ICBwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7Ci0KLSAgICAvLyBJZiBubyBkb2N1bWVudCBhbmQg
ZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuCi0gICAgaWYgKCBkb2MgPT09IGRv
Y3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsK
LSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8vIFNldCBvdXIgZG9jdW1l
bnQKLSAgICBkb2N1bWVudCA9IGRvYzsKLSAgICBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVu
dDsKLQotICAgIC8vIFN1cHBvcnQgdGVzdHMKLSAgICBkb2N1bWVudElzSFRNTCA9ICFpc1hNTCgg
ZG9jICk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRT44Ci0gICAgLy8gSWYgaWZyYW1lIGRvY3VtZW50
IGlzIGFzc2lnbmVkIHRvICJkb2N1bWVudCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVl
biByZWxvYWRlZCwKLSAgICAvLyBJRSB3aWxsIHRocm93ICJwZXJtaXNzaW9uIGRlbmllZCIgZXJy
b3Igd2hlbiBhY2Nlc3NpbmcgImRvY3VtZW50IiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzYK
LSAgICAvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28g
cGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkCi0gICAgaWYgKCBwYXJlbnQgJiYgcGFyZW50ICE9PSBw
YXJlbnQudG9wICkgewotICAgICAgICAvLyBJRTExIGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQs
IHNvIGFsbCBtdXN0IHN1ZmZlcgotICAgICAgICBpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVy
ICkgewotICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoICJ1bmxvYWQiLCBmdW5j
dGlvbigpIHsKLSAgICAgICAgICAgICAgICBzZXREb2N1bWVudCgpOwotICAgICAgICAgICAgfSwg
ZmFsc2UgKTsKLSAgICAgICAgfSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkgewotICAg
ICAgICAgICAgcGFyZW50LmF0dGFjaEV2ZW50KCAib251bmxvYWQiLCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgICAgICBzZXREb2N1bWVudCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICAvKiBBdHRyaWJ1dGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAg
Ly8gU3VwcG9ydDogSUU8OAotICAgIC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkg
cmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcyAoZXhjZXB0aW5nIElFOCBib29s
ZWFucykKLSAgICBzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsK
LSAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICJpIjsKLSAgICAgICAgcmV0dXJuICFkaXYuZ2V0QXR0
cmlidXRlKCJjbGFzc05hbWUiKTsKLSAgICB9KTsKLQotICAgIC8qIGdldEVsZW1lbnQocylCeSoK
LSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFn
TmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cwotICAgIHN1cHBvcnQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAgZGl2LmFwcGVuZENo
aWxkKCBkb2MuY3JlYXRlQ29tbWVudCgiIikgKTsKLSAgICAgICAgcmV0dXJuICFkaXYuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Ci0gICAgfSk7Ci0KLSAgICAvLyBDaGVjayBpZiBn
ZXRFbGVtZW50c0J5Q2xhc3NOYW1lIGNhbiBiZSB0cnVzdGVkCi0gICAgc3VwcG9ydC5nZXRFbGVt
ZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2MuZ2V0RWxlbWVudHNCeUNsYXNzTmFt
ZSApICYmIGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotICAgICAgICBkaXYuaW5uZXJIVE1MID0g
IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IjsKLQotICAgICAg
ICAvLyBTdXBwb3J0OiBTYWZhcmk8NAotICAgICAgICAvLyBDYXRjaCBjbGFzcyBvdmVyLWNhY2hp
bmcKLSAgICAgICAgZGl2LmZpcnN0Q2hpbGQuY2xhc3NOYW1lID0gImkiOwotICAgICAgICAvLyBT
dXBwb3J0OiBPcGVyYTwxMAotICAgICAgICAvLyBDYXRjaCBnRUJDTiBmYWlsdXJlIHRvIGZpbmQg
bm9uLWxlYWRpbmcgY2xhc3NlcwotICAgICAgICByZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUoImkiKS5sZW5ndGggPT09IDI7Ci0gICAgfSk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTwx
MAotICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFt
ZQotICAgIC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVw
IHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsCi0gICAgLy8gc28gdXNlIGEgcm91bmRhYm91dCBn
ZXRFbGVtZW50c0J5TmFtZSB0ZXN0Ci0gICAgc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0
aW9uKCBkaXYgKSB7Ci0gICAgICAgIGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhw
YW5kbzsKLSAgICAgICAgcmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRF
bGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKLSAgICB9KTsKLQotICAgIC8vIElEIGZp
bmQgYW5kIGZpbHRlcgotICAgIGlmICggc3VwcG9ydC5nZXRCeUlkICkgewotICAgICAgICBFeHBy
LmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7Ci0gICAgICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgZG9jdW1l
bnRJc0hUTUwgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRC
eUlkKCBpZCApOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2gg
d2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCi0gICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhh
dCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MwotICAgICAgICAgICAgICAgIHJl
dHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOwotICAgICAgICAgICAgfQotICAgICAg
ICB9OwotICAgICAgICBFeHByLmZpbHRlclsiSUQiXSA9IGZ1bmN0aW9uKCBpZCApIHsKLSAgICAg
ICAgICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwot
ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHJl
dHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOwotICAgICAgICAgICAgfTsK
LSAgICAgICAgfTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBTdXBwb3J0OiBJRTYvNwotICAg
ICAgICAvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0
Ci0gICAgICAgIGRlbGV0ZSBFeHByLmZpbmRbIklEIl07Ci0KLSAgICAgICAgRXhwci5maWx0ZXJb
IklEIl0gPSAgZnVuY3Rpb24oIGlkICkgewotICAgICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJl
cGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRB
dHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJp
ZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJ
ZDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLy8gVGFnCi0gICAg
RXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwotICAgICAg
ICBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewotICAgICAgICAgICAgaWYgKCB0eXBlb2YgY29u
dGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgewotICAgICAgICAg
ICAgICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSA6Ci0gICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7
Ci0gICAgICAgICAgICB2YXIgZWxlbSwKLSAgICAgICAgICAgICAgICB0bXAgPSBbXSwKLSAgICAg
ICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gY29udGV4dC5nZXRF
bGVtZW50c0J5VGFnTmFtZSggdGFnICk7Ci0KLSAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgcG9z
c2libGUgY29tbWVudHMKLSAgICAgICAgICAgIGlmICggdGFnID09PSAiKiIgKSB7Ci0gICAgICAg
ICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRtcC5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgIH07Ci0KLSAgICAvLyBDbGFzcwotICAg
IEV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBm
dW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewotICAgICAgICBpZiAoIHR5cGVvZiBjb250
ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiBkb2N1bWVudElz
SFRNTCApIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUoIGNsYXNzTmFtZSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qIFFTQS9tYXRjaGVz
U2VsZWN0b3IKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvLyBRU0EgYW5kIG1hdGNoZXNT
ZWxlY3RvciBzdXBwb3J0Ci0KLSAgICAvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0
cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQotICAgIHJidWdneU1hdGNoZXMgPSBb
XTsKLQotICAgIC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUg
MjEpCi0gICAgLy8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQg
dGhyb3dzIGFuIGVycm9yCi0gICAgLy8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRg
IGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQotICAgIC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8g
cGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCi0gICAg
Ly8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4Ci0gICAgcmJ1Z2d5UVNB
ID0gW107Ci0KLSAgICBpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5
U2VsZWN0b3JBbGwgKSkgKSB7Ci0gICAgICAgIC8vIEJ1aWxkIFFTQSByZWdleAotICAgICAgICAv
LyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCi0gICAgICAgIGFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgewotICAgICAgICAgICAgLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0
eSBzdHJpbmcgb24gcHVycG9zZQotICAgICAgICAgICAgLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3Mg
dHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIGEgYm9v
bGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKLSAgICAgICAgICAgIC8vIHNpbmNlIGl0cyBwcmVzZW5j
ZSBzaG91bGQgYmUgZW5vdWdoCi0gICAgICAgICAgICAvLyBodHRwOi8vYnVncy5qcXVlcnkuY29t
L3RpY2tldC8xMjM1OQotICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0IHQ9Jyc+
PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iOwotCi0gICAgICAgICAgICAv
LyBTdXBwb3J0OiBJRTgsIE9wZXJhIDEwLTEyCi0gICAgICAgICAgICAvLyBOb3RoaW5nIHNob3Vs
ZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9Ci0g
ICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbdF49JyddIikubGVuZ3RoICkg
ewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2Ug
KyAiKig/OicnfFwiXCIpIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdXBw
b3J0OiBJRTgKLSAgICAgICAgICAgIC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgInZhbHVlIiBh
cmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICBpZiAoICFkaXYucXVlcnlTZWxl
Y3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICByYnVnZ3lR
U0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2YWx1ZXwiICsgYm9vbGVhbnMgKyAi
KSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Via2l0L09wZXJhIC0gOmNo
ZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKLSAgICAgICAgICAg
IC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5
LyNjaGVja2VkCi0gICAgICAgICAgICAvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwg
bm90IHNlZSBsYXRlciB0ZXN0cwotICAgICAgICAgICAgaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JB
bGwoIjpjaGVja2VkIikubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNo
KCI6Y2hlY2tlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3Nl
cnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBO
YXRpdmUgQXBwcwotICAgICAgICAgICAgLy8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBh
cmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50Ci0gICAgICAgICAgICB2
YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgICAgICAgIGlucHV0
LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVuIiApOwotICAgICAgICAgICAgZGl2LmFwcGVu
ZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggIm5hbWUiLCAiRCIgKTsKLQotICAgICAgICAg
ICAgLy8gU3VwcG9ydDogSUU4Ci0gICAgICAgICAgICAvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZp
dHkgb2YgbmFtZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JB
bGwoIltuYW1lPWRdIikubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNo
KCAibmFtZSIgKyB3aGl0ZXNwYWNlICsgIipbKl4kfCF+XT89IiApOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBl
bGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQotICAgICAgICAgICAg
Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKLSAg
ICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCAp
IHsKLSAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxl
ZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3BlcmEgMTAtMTEgZG9lcyBu
b3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3MKLSAgICAgICAgICAgIGRpdi5x
dWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7Ci0gICAgICAgICAgICByYnVnZ3lRU0EucHVzaCgiLC4q
OiIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxl
Y3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxl
Y3RvciB8fAotICAgICAgICBkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fAotICAgICAgICBk
b2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHwKLSAgICAgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxl
Y3RvcikgKSkgKSB7Ci0KLSAgICAgICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgICAg
ICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0
b3IKLSAgICAgICAgICAgIC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpCi0gICAgICAg
ICAgICBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsICJkaXYi
ICk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24K
LSAgICAgICAgICAgIC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3Rl
YWQKLSAgICAgICAgICAgIG1hdGNoZXMuY2FsbCggZGl2LCAiW3MhPScnXTp4IiApOwotICAgICAg
ICAgICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7Ci0gICAgICAgIH0pOwot
ICAgIH0KLQotICAgIHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCgg
cmJ1Z2d5UVNBLmpvaW4oInwiKSApOwotICAgIHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVz
Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOwotCi0gICAg
LyogQ29udGFpbnMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgaGFzQ29tcGFyZSA9IHJuYXRp
dmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwotCi0gICAgLy8gRWxl
bWVudCBjb250YWlucyBhbm90aGVyCi0gICAgLy8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxl
bWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAotICAgIC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMg
bm90IGNvbnRhaW4gaXRzZWxmCi0gICAgY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUu
dGVzdCggZG9jRWxlbS5jb250YWlucyApID8KLSAgICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7Ci0g
ICAgICAgICAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1l
bnQgOiBhLAotICAgICAgICAgICAgICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwotICAgICAg
ICAgICAgcmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAm
JiAoCi0gICAgICAgICAgICAgICAgYWRvd24uY29udGFpbnMgPwotICAgICAgICAgICAgICAgICAg
ICBhZG93bi5jb250YWlucyggYnVwICkgOgotICAgICAgICAgICAgICAgICAgICBhLmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTYK
LSAgICAgICAgICAgICkpOwotICAgICAgICB9IDoKLSAgICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7
Ci0gICAgICAgICAgICBpZiAoIGIgKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAoYiA9IGIu
cGFyZW50Tm9kZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggYiA9PT0gYSApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9OwotCi0gICAgLyogU29ydGluZwotICAgIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
LQotICAgIC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKLSAgICBzb3J0T3JkZXIgPSBoYXNDb21w
YXJlID8KLSAgICBmdW5jdGlvbiggYSwgYiApIHsKLQotICAgICAgICAvLyBGbGFnIGZvciBkdXBs
aWNhdGUgcmVtb3ZhbAotICAgICAgICBpZiAoIGEgPT09IGIgKSB7Ci0gICAgICAgICAgICBoYXNE
dXBsaWNhdGUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNv
bXBhcmVEb2N1bWVudFBvc2l0aW9uCi0gICAgICAgIHZhciBjb21wYXJlID0gIWEuY29tcGFyZURv
Y3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjsKLSAgICAgICAgaWYg
KCBjb21wYXJlICkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmU7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRo
ZSBzYW1lIGRvY3VtZW50Ci0gICAgICAgIGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBh
ICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/Ci0gICAgICAgICAgICBhLmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uKCBiICkgOgotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Uga25v
dyB0aGV5IGFyZSBkaXNjb25uZWN0ZWQKLSAgICAgICAgICAgIDE7Ci0KLSAgICAgICAgLy8gRGlz
Y29ubmVjdGVkIG5vZGVzCi0gICAgICAgIGlmICggY29tcGFyZSAmIDEgfHwKLSAgICAgICAgICAg
ICghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSAp
ID09PSBjb21wYXJlKSApIHsKLQotICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVt
ZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50Ci0gICAgICAgICAg
ICBpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBj
b250YWlucyhwcmVmZXJyZWREb2MsIGEpICkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggYiA9PT0gZG9jIHx8IGIub3duZXJEb2N1
bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IE1haW50YWluIG9yaWdpbmFsIG9yZGVyCi0gICAgICAgICAgICByZXR1cm4gc29ydElucHV0ID8K
LSAgICAgICAgICAgICAgICAoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9m
LmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOgotICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgIH0K
LQotICAgICAgICByZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7Ci0gICAgfSA6Ci0gICAgZnVu
Y3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBp
ZGVudGljYWwKLSAgICAgICAgaWYgKCBhID09PSBiICkgewotICAgICAgICAgICAgaGFzRHVwbGlj
YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAg
dmFyIGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgYXVwID0gYS5wYXJlbnRO
b2RlLAotICAgICAgICAgICAgYnVwID0gYi5wYXJlbnROb2RlLAotICAgICAgICAgICAgYXAgPSBb
IGEgXSwKLSAgICAgICAgICAgIGJwID0gWyBiIF07Ci0KLSAgICAgICAgLy8gUGFyZW50bGVzcyBu
b2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKLSAgICAgICAgaWYgKCAh
YXVwIHx8ICFidXAgKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA9PT0gZG9jID8gLTEgOgotICAg
ICAgICAgICAgICAgIGIgPT09IGRvYyA/IDEgOgotICAgICAgICAgICAgICAgIGF1cCA/IC0xIDoK
LSAgICAgICAgICAgICAgICBidXAgPyAxIDoKLSAgICAgICAgICAgICAgICBzb3J0SW5wdXQgPwot
ICAgICAgICAgICAgICAgICggaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2Yu
Y2FsbCggc29ydElucHV0LCBiICkgKSA6Ci0gICAgICAgICAgICAgICAgMDsKLQotICAgICAgICAv
LyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVjawotICAg
ICAgICB9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHsKLSAgICAgICAgICAgIHJldHVybiBzaWJs
aW5nQ2hlY2soIGEsIGIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSB3ZSBu
ZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCi0gICAgICAg
IGN1ciA9IGE7Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAg
ICAgICAgICAgIGFwLnVuc2hpZnQoIGN1ciApOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGI7
Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAgICAgICAgICAg
IGJwLnVuc2hpZnQoIGN1ciApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayBkb3duIHRo
ZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKLSAgICAgICAgd2hpbGUgKCBhcFtpXSA9
PT0gYnBbaV0gKSB7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gaSA/Ci0gICAgICAgICAgICAvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhh
dmUgYSBjb21tb24gYW5jZXN0b3IKLSAgICAgICAgICAgIHNpYmxpbmdDaGVjayggYXBbaV0sIGJw
W2ldICkgOgotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50
IHNvcnQgZmlyc3QKLSAgICAgICAgICAgIGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6Ci0g
ICAgICAgICAgICBicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6Ci0gICAgICAgICAgICAwOwot
ICAgIH07Ci0KLSAgICByZXR1cm4gZG9jOwotfTsKLQotU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlv
biggZXhwciwgZWxlbWVudHMgKSB7Ci0gICAgcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVs
bCwgZWxlbWVudHMgKTsKLX07Ci0KLVNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbigg
ZWxlbSwgZXhwciApIHsKLSAgICAvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKLSAgICBp
ZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7Ci0gICAg
ICAgIHNldERvY3VtZW50KCBlbGVtICk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQg
YXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCi0gICAgZXhwciA9IGV4cHIucmVwbGFjZSgg
cmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKLQotICAgIGlmICggc3VwcG9ydC5tYXRjaGVz
U2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKLSAgICAgICAgKCAhcmJ1Z2d5TWF0Y2hlcyB8
fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgotICAgICAgICAoICFyYnVnZ3lRU0Eg
ICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAg
ICAgICAgICAgIHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTsKLQotICAgICAg
ICAgICAgLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5l
Y3RlZCBub2RlcwotICAgICAgICAgICAgaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRN
YXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9k
ZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICAvLyBm
cmFnbWVudCBpbiBJRSA5Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxl
bS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJl
dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChlKSB7fQotICAgIH0KLQotICAgIHJl
dHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbZWxlbV0gKS5sZW5ndGggPiAwOwot
fTsKLQotU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7Ci0gICAg
Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0gICAgaWYgKCAoIGNvbnRleHQub3duZXJE
b2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewotICAgICAgICBzZXREb2N1bWVu
dCggY29udGV4dCApOwotICAgIH0KLSAgICByZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0g
KTsKLX07Ci0KLVNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgLy8g
U2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0gICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVu
dCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCggZWxlbSAp
OwotICAgIH0KLQotICAgIHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2Fz
ZSgpIF0sCi0gICAgICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBw
cm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KQotICAgICAgICB2YWwgPSBmbiAmJiBoYXNPd24uY2Fs
bCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/Ci0gICAgICAgICAgICBm
biggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgotICAgICAgICAgICAgdW5kZWZpbmVk
OwotCi0gICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KLSAgICAgICAgdmFsIDoKLSAgICAg
ICAgc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/Ci0gICAgICAgICAgICBl
bGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKLSAgICAgICAgICAgICh2YWwgPSBlbGVtLmdldEF0
dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgPwotICAgICAgICAgICAgICAgIHZh
bC52YWx1ZSA6Ci0gICAgICAgICAgICAgICAgbnVsbDsKLX07Ci0KLVNpenpsZS5lcnJvciA9IGZ1
bmN0aW9uKCBtc2cgKSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJl
Y29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOwotfTsKLQotLyoqCi0gKiBEb2N1bWVudCBz
b3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCi0gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVz
dWx0cwotICovCi1TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewotICAg
IHZhciBlbGVtLAotICAgICAgICBkdXBsaWNhdGVzID0gW10sCi0gICAgICAgIGogPSAwLAotICAg
ICAgICBpID0gMDsKLQotICAgIC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBs
aWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKLSAgICBoYXNEdXBsaWNhdGUgPSAhc3VwcG9y
dC5kZXRlY3REdXBsaWNhdGVzOwotICAgIHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUg
JiYgcmVzdWx0cy5zbGljZSggMCApOwotICAgIHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7Ci0K
LSAgICBpZiAoIGhhc0R1cGxpY2F0ZSApIHsKLSAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3Vs
dHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICBpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsK
LSAgICAgICAgICAgICAgICBqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCBqLS0gKSB7Ci0gICAgICAgICAgICByZXN1bHRz
LnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0cwotICAgIC8vIFNl
ZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNQotICAgIHNvcnRJbnB1
dCA9IG51bGw7Ci0KLSAgICByZXR1cm4gcmVzdWx0czsKLX07Ci0KLS8qKgotICogVXRpbGl0eSBm
dW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00g
bm9kZXMKLSAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbQotICovCi1nZXRUZXh0ID0gU2l6
emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICB2YXIgbm9kZSwKLSAgICAgICAg
cmV0ID0gIiIsCi0gICAgICAgIGkgPSAwLAotICAgICAgICBub2RlVHlwZSA9IGVsZW0ubm9kZVR5
cGU7Ci0KLSAgICBpZiAoICFub2RlVHlwZSApIHsKLSAgICAgICAgLy8gSWYgbm8gbm9kZVR5cGUs
IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkKLSAgICAgICAgd2hpbGUgKCAobm9kZSA9
IGVsZW1baSsrXSkgKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBu
b2RlcwotICAgICAgICAgICAgcmV0ICs9IGdldFRleHQoIG5vZGUgKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBl
ID09PSAxMSApIHsKLSAgICAgICAgLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cwotICAg
ICAgICAvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxp
bmVzIChqUXVlcnkgIzExMTUzKQotICAgICAgICBpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50
ID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtLnRleHRDb250ZW50Owot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCi0g
ICAgICAgICAgICBmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxl
bS5uZXh0U2libGluZyApIHsKLSAgICAgICAgICAgICAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09
IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7Ci0gICAgICAgIHJldHVybiBlbGVtLm5vZGVWYWx1ZTsK
LSAgICB9Ci0gICAgLy8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3Ry
dWN0aW9uIG5vZGVzCi0KLSAgICByZXR1cm4gcmV0OwotfTsKLQotRXhwciA9IFNpenpsZS5zZWxl
Y3RvcnMgPSB7Ci0KLSAgICAvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKLSAgICBjYWNo
ZUxlbmd0aDogNTAsCi0KLSAgICBjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKLQotICAgIG1h
dGNoOiBtYXRjaEV4cHIsCi0KLSAgICBhdHRySGFuZGxlOiB7fSwKLQotICAgIGZpbmQ6IHt9LAot
Ci0gICAgcmVsYXRpdmU6IHsKLSAgICAgICAgIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJz
dDogdHJ1ZSB9LAotICAgICAgICAiICI6IHsgZGlyOiAicGFyZW50Tm9kZSIgfSwKLSAgICAgICAg
IisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCi0gICAgICAgICJ+
IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KLSAgICB9LAotCi0gICAgcHJlRmlsdGVyOiB7
Ci0gICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG1hdGNoICkgewotICAgICAgICAgICAgbWF0Y2hb
MV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwotCi0gICAgICAg
ICAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBv
ciB1bnF1b3RlZAotICAgICAgICAgICAgbWF0Y2hbM10gPSAoIG1hdGNoWzRdIHx8IG1hdGNoWzVd
IHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKLQotICAgICAgICAgICAg
aWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKLSAgICAgICAgICAgICAgICBtYXRjaFszXSA9ICIg
IiArIG1hdGNoWzNdICsgIiAiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4g
bWF0Y2guc2xpY2UoIDAsIDQgKTsKLSAgICAgICAgfSwKLQotICAgICAgICAiQ0hJTEQiOiBmdW5j
dGlvbiggbWF0Y2ggKSB7Ci0gICAgICAgICAgICAvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJD
SElMRCJdCi0gICAgICAgICAgICAgICAgMSB0eXBlIChvbmx5fG50aHwuLi4pCi0gICAgICAgICAg
ICAgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQotICAgICAgICAgICAgICAgIDMgYXJndW1lbnQg
KGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCi0gICAgICAgICAgICAgICAgNCB4bi1j
b21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpufCkKLSAgICAgICAgICAgICAgICA1
IHNpZ24gb2YgeG4tY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgNiB4IG9mIHhuLWNvbXBvbmVu
dAotICAgICAgICAgICAgICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAotICAgICAgICAgICAgICAg
IDggeSBvZiB5LWNvbXBvbmVudAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1hdGNoWzFd
ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKLQotICAgICAgICAgICAgaWYgKCBtYXRjaFsxXS5z
bGljZSggMCwgMyApID09PSAibnRoIiApIHsKLSAgICAgICAgICAgICAgICAvLyBudGgtKiByZXF1
aXJlcyBhcmd1bWVudAotICAgICAgICAgICAgICAgIGlmICggIW1hdGNoWzNdICkgewotICAgICAg
ICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4
cHIuZmlsdGVyLkNISUxECi0gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90
cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQotICAgICAgICAgICAgICAgIG1hdGNoWzRdID0g
KyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNd
ID09PSAiZXZlbiIgfHwgbWF0Y2hbM10gPT09ICJvZGQiICkgKTsKLSAgICAgICAgICAgICAgICBt
YXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2Rk
IiApOwotCi0gICAgICAgICAgICAvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKLSAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewotICAgICAgICAgICAgICAgIFNpenps
ZS5lcnJvciggbWF0Y2hbMF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJu
IG1hdGNoOwotICAgICAgICB9LAotCi0gICAgICAgICJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2gg
KSB7Ci0gICAgICAgICAgICB2YXIgZXhjZXNzLAotICAgICAgICAgICAgICAgIHVucXVvdGVkID0g
IW1hdGNoWzVdICYmIG1hdGNoWzJdOwotCi0gICAgICAgICAgICBpZiAoIG1hdGNoRXhwclsiQ0hJ
TEQiXS50ZXN0KCBtYXRjaFswXSApICkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBh
cy1pcwotICAgICAgICAgICAgaWYgKCBtYXRjaFszXSAmJiBtYXRjaFs0XSAhPT0gdW5kZWZpbmVk
ICkgewotICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gbWF0Y2hbNF07Ci0KLSAgICAgICAgICAg
IC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCi0gICAg
ICAgICAgICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkg
JiYKLSAgICAgICAgICAgICAgICAvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2
ZWx5KQotICAgICAgICAgICAgICAgIChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUg
KSkgJiYKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFy
ZW50aGVzaXMKLSAgICAgICAgICAgICAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIiki
LCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAotICAgICAgICAgICAg
ICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOwotICAgICAgICAgICAg
ICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBz
ZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKLSAgICAgICAgICAgIHJldHVy
biBtYXRjaC5zbGljZSggMCwgMyApOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZpbHRlcjog
ewotCi0gICAgICAgICJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHsKLSAgICAg
ICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBl
LCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1l
U2VsZWN0b3IgPT09ICIqIiA/Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0
cnVlOyB9IDoKLSAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz
ZSgpID09PSBub2RlTmFtZTsKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9LAotCi0gICAg
ICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7Ci0gICAgICAgICAgICB2YXIgcGF0
dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArICIgIiBdOwotCi0gICAgICAgICAgICByZXR1
cm4gcGF0dGVybiB8fAotICAgICAgICAgICAgICAgIChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihe
fCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8
JCkiICkpICYmCi0gICAgICAgICAgICAgICAgY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlv
biggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCggdHlw
ZW9mIGVsZW0uY2xhc3NOYW1lID09PSAic3RyaW5nIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBl
b2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0
ZSgiY2xhc3MiKSB8fCAiIiApOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9LAotCi0g
ICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKLSAgICAg
ICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICB2YXIgcmVz
dWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsKLQotICAgICAgICAgICAgICAgIGlmICgg
cmVzdWx0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvciA9
PT0gIiE9IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCAhb3BlcmF0
b3IgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiIjsKLQotICAgICAgICAgICAgICAgIHJl
dHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0ID09PSBjaGVjayA6Ci0gICAgICAgICAgICAg
ICAgICAgIG9wZXJhdG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6Ci0gICAgICAgICAg
ICAgICAgICAgIG9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNo
ZWNrICkgPT09IDAgOgotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gIio9IiA/IGNo
ZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOgotICAgICAgICAgICAgICAgICAg
ICBvcGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0
aCApID09PSBjaGVjayA6Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAifj0iID8g
KCAiICIgKyByZXN1bHQgKyAiICIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOgotICAgICAgICAg
ICAgICAgICAgICBvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0
LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKLSAgICAgICAg
ICAgICAgICAgICAgZmFsc2U7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9LAotCi0gICAgICAg
ICJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7
Ci0gICAgICAgICAgICB2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwK
LSAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gImxhc3QiLAot
ICAgICAgICAgICAgICAgIG9mVHlwZSA9IHdoYXQgPT09ICJvZi10eXBlIjsKLQotICAgICAgICAg
ICAgcmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgPwotCi0gICAgICAgICAgICAgICAg
Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7Ci0gICAg
ICAgICAgICAgICAgfSA6Ci0KLSAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgewotICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5v
ZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXIg
PSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIs
Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsCi0gICAg
ICAgICAgICAgICAgICAgICAgICBuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dl
ckNhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZU
eXBlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggcGFyZW50ICkgewotCi0gICAgICAgICAg
ICAgICAgICAgICAgICAvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIHNpbXBsZSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3aGlsZSAoIGRpciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IGVsZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKG5v
ZGUgPSBub2RlWyBkaXIgXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5v
ZGUubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZl
bid0IHlldCBkb25lIHNvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9
IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFz
dENoaWxkIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi14bWwgOm50aC1jaGls
ZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgCi0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8
IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub2RlSW5kZXggPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsxXTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2Fj
aGVbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVJbmRleCAmJiBw
YXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8
fAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNlZWtp
bmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewotCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBh
cmVudGAgYW5kIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9k
ZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVu
cywgbm9kZUluZGV4LCBkaWZmIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHByZXZp
b3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKCB1c2VDYWNoZSAmJiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBd
IHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJy
dW5zICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBjYWNoZVsxXTsKLQot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1sIDpudGgtY2hpbGQoLi4uKSBvciA6bnRoLWxh
c3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pCi0gICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0
aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5v
ZGUgJiYgbm9kZVsgZGlyIF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRp
ZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7Ci0KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJiArK2RpZmYgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFj
aCBlbmNvdW50ZXJlZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIHVzZUNhY2hlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9
IFsgZGlycnVucywgZGlmZiBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5vZGUgPT09IGVs
ZW0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY29ycG9yYXRl
IHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplCi0gICAgICAgICAgICAg
ICAgICAgICAgICBkaWZmIC09IGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49
IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewot
ICAgICAgICAgICAgLy8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCi0g
ICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFz
c2VzCi0gICAgICAgICAgICAvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2Fz
ZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwotICAgICAg
ICAgICAgLy8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvcwot
ICAgICAgICAgICAgdmFyIGFyZ3MsCi0gICAgICAgICAgICAgICAgZm4gPSBFeHByLnBzZXVkb3Nb
IHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAot
ICAgICAgICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoICJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIg
KyBwc2V1ZG8gKTsKLQotICAgICAgICAgICAgLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1
ZG8gdG8gaW5kaWNhdGUgdGhhdAotICAgICAgICAgICAgLy8gYXJndW1lbnRzIGFyZSBuZWVkZWQg
dG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAgICAgICAgICAgIC8vIGp1c3QgYXMgU2l6
emxlIGRvZXMKLSAgICAgICAgICAgIGlmICggZm5bIGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZm4oIGFyZ3VtZW50ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlcwotICAgICAgICAgICAg
aWYgKCBmbi5sZW5ndGggPiAxICkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBbIHBzZXVkbywg
cHNldWRvLCAiIiwgYXJndW1lbnQgXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhwci5zZXRG
aWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID8KLSAgICAgICAg
ICAgICAgICAgICAgbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaSA9IG1hdGNoZWQubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUg
KCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaW5kZXhPZi5jYWxs
KCBzZWVkLCBtYXRjaGVkW2ldICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFsg
aWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAgICAgICAg
ICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbigg
ZWxlbSwgMCwgYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICByZXR1cm4gZm47Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgcHNldWRv
czogewotICAgICAgICAvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3MKLSAgICAgICAgIm5v
dCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICAvLyBU
cmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQotICAgICAgICAgICAgLy8gdG8gYXZv
aWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKLSAgICAgICAgICAgIC8vIHNwYWNlcyBh
cyBjb21iaW5hdG9ycwotICAgICAgICAgICAgdmFyIGlucHV0ID0gW10sCi0gICAgICAgICAgICAg
ICAgcmVzdWx0cyA9IFtdLAotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBjb21waWxlKCBzZWxl
Y3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXRj
aGVyWyBleHBhbmRvIF0gPwotICAgICAgICAgICAgICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgICAgICAgICB2YXIg
ZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQs
IG51bGwsIHhtbCwgW10gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzZWVkLmxlbmd0
aDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkg
YG1hdGNoZXJgCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pOwotICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfSkgOgotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0WzBdID0gZWxlbTsKLSAgICAgICAgICAgICAgICAg
ICAgbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gIXJlc3VsdHMucG9wKCk7Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAg
fSksCi0KLSAgICAgICAgImhhcyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7
Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwotICAgICAgICAgICAg
fTsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImNvbnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0
aW9uKCB0ZXh0ICkgewotICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAg
ICAgICAgICAgICAgIHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQg
fHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7Ci0gICAgICAgICAgICB9
OwotICAgICAgICB9KSwKLQotICAgICAgICAvLyAiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJl
c2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvcgotICAgICAgICAvLyBpcyBiYXNlZCBzb2xlbHkg
b24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQotICAgICAgICAvLyBiZWluZyBlcXVhbCB0
byB0aGUgaWRlbnRpZmllciBDLAotICAgICAgICAvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRl
bnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICItIi4KLSAgICAgICAgLy8gVGhlIG1h
dGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZv
cm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuCi0gICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIEMgZG9l
cyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgotICAgICAgICAvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvCi0gICAgICAgICJsYW5nIjog
bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHsKLSAgICAgICAgICAgIC8vIGxhbmcgdmFs
dWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKLSAgICAgICAgICAgIGlmICggIXJpZGVudGlm
aWVyLnRlc3QobGFuZyB8fCAiIikgKSB7Ci0gICAgICAgICAgICAgICAgU2l6emxlLmVycm9yKCAi
dW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2Uo
KTsKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAg
ICB2YXIgZWxlbUxhbmc7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAg
ICBpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID8KLSAgICAgICAgICAgICAgICAgICAg
ICAgIGVsZW0ubGFuZyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0
ZSgieG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgibGFuZyIpKSApIHsKLQotICAgICAg
ICAgICAgICAgICAgICAgICAgZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5n
LmluZGV4T2YoIGxhbmcgKyAiLSIgKSA9PT0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5u
b2RlVHlwZSA9PT0gMSApOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIH07Ci0gICAgICAgIH0pLAotCi0gICAgICAgIC8vIE1pc2NlbGxhbmVvdXMKLSAgICAgICAg
InRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgdmFyIGhhc2ggPSB3aW5k
b3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7Ci0gICAgICAgICAgICByZXR1cm4g
aGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7Ci0gICAgICAgIH0sCi0KLSAgICAg
ICAgInJvb3QiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtID09
PSBkb2NFbGVtOwotICAgICAgICB9LAotCi0gICAgICAgICJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQg
JiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVt
LnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsKLSAgICAgICAgfSwKLQotICAg
ICAgICAvLyBCb29sZWFuIHByb3BlcnRpZXMKLSAgICAgICAgImVuYWJsZWQiOiBmdW5jdGlvbigg
ZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTsKLSAg
ICAgICAgfSwKLQotICAgICAgICAiZGlzYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAg
ICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwotICAgICAgICB9LAotCi0gICAg
ICAgICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBJbiBDU1Mz
LCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVu
dHMKLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2Vs
ZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCi0gICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVt
Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09
PSAiaW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYm
ICEhZWxlbS5zZWxlY3RlZCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgInNlbGVjdGVkIjogZnVu
Y3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBt
YWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0Ci0gICAgICAgICAgICAvLyBvcHRpb25zIGluIFNhZmFy
aSB3b3JrIHByb3Blcmx5Ci0gICAgICAgICAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKLSAg
ICAgICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgLy8gQ29udGVudHMKLSAgICAgICAgImVtcHR5IjogZnVuY3Rpb24oIGVs
ZW0gKSB7Ci0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2Vt
cHR5LXBzZXVkbwotICAgICAgICAgICAgLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAo
MSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAot
ICAgICAgICAgICAgLy8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2lu
ZyBpbnN0cnVjdGlvbjogNzsgZXRjLikKLSAgICAgICAgICAgIC8vIG5vZGVUeXBlIDwgNiB3b3Jr
cyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW4KLSAgICAg
ICAgICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5l
eHRTaWJsaW5nICkgewotICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSwKLQotICAg
ICAgICAicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICByZXR1cm4gIUV4
cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEVs
ZW1lbnQvaW5wdXQgdHlwZXMKLSAgICAgICAgImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOwotICAgICAg
ICB9LAotCi0gICAgICAgICJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAg
cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwotICAgICAgICB9LAotCi0gICAg
ICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHZhciBuYW1lID0g
ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09
ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSAiYnV0dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsK
LSAgICAgICAgfSwKLQotICAgICAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAg
ICAgICAgdmFyIGF0dHI7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpID09PSAiaW5wdXQiICYmCi0gICAgICAgICAgICAgICAgZWxlbS50eXBlID09PSAidGV4
dCIgJiYKLQotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFPDgKLSAgICAgICAgICAgICAg
ICAvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgInNlYXJjaCIpIGFwcGVhciB3
aXRoIGVsZW0udHlwZSA9PT0gInRleHQiCi0gICAgICAgICAgICAgICAgKCAoYXR0ciA9IGVsZW0u
Z2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAi
dGV4dCIgKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9u
Ci0gICAgICAgICJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gWyAwIF07Ci0gICAgICAgIH0pLAotCi0gICAgICAgICJsYXN0Ijog
Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7
Ci0gICAgICAgICAgICByZXR1cm4gWyBsZW5ndGggLSAxIF07Ci0gICAgICAgIH0pLAotCi0gICAg
ICAgICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywg
bGVuZ3RoLCBhcmd1bWVudCApIHsKLSAgICAgICAgICAgIHJldHVybiBbIGFyZ3VtZW50IDwgMCA/
IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKLSAgICAgICAgfSksCi0KLSAgICAgICAg
ImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxl
bmd0aCApIHsKLSAgICAgICAgICAgIHZhciBpID0gMDsKLSAgICAgICAgICAgIGZvciAoIDsgaSA8
IGxlbmd0aDsgaSArPSAyICkgewotICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBp
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOwotICAg
ICAgICB9KSwKLQotICAgICAgICAib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlv
biggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Ci0gICAgICAgICAgICB2YXIgaSA9IDE7Ci0gICAg
ICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKLSAgICAgICAgICAgICAgICBt
YXRjaEluZGV4ZXMucHVzaCggaSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu
IG1hdGNoSW5kZXhlczsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImx0IjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewot
ICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFy
Z3VtZW50OwotICAgICAgICAgICAgZm9yICggOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAg
ICAgbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJl
dHVybiBtYXRjaEluZGV4ZXM7Ci0gICAgICAgIH0pLAotCi0gICAgICAgICJndCI6IGNyZWF0ZVBv
c2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCAp
IHsKLSAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGgg
OiBhcmd1bWVudDsKLSAgICAgICAgICAgIGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKLSAgICAg
ICAgICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAgICAgICAgfSkKLSAgICB9Ci19OwotCi1FeHBy
LnBzZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJlcSJdOwotCi0vLyBBZGQgYnV0dG9uL2lu
cHV0IHR5cGUgcHNldWRvcwotZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1
ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7Ci0gICAgRXhw
ci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwotfQotZm9yICggaSBpbiB7
IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHsKLSAgICBFeHByLnBzZXVkb3NbIGkgXSA9
IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwotfQotCi0vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcg
bmV3IHNldEZpbHRlcnMKLWZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQotc2V0RmlsdGVycy5wcm90
b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7Ci1FeHByLnNldEZpbHRlcnMgPSBu
ZXcgc2V0RmlsdGVycygpOwotCi1mdW5jdGlvbiB0b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25s
eSApIHsKLSAgICB2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSwKLSAgICAgICAgc29G
YXIsIGdyb3VwcywgcHJlRmlsdGVycywKLSAgICAgICAgY2FjaGVkID0gdG9rZW5DYWNoZVsgc2Vs
ZWN0b3IgKyAiICIgXTsKLQotICAgIGlmICggY2FjaGVkICkgewotICAgICAgICByZXR1cm4gcGFy
c2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwotICAgIH0KLQotICAgIHNvRmFyID0gc2Vs
ZWN0b3I7Ci0gICAgZ3JvdXBzID0gW107Ci0gICAgcHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVy
OwotCi0gICAgd2hpbGUgKCBzb0ZhciApIHsKLQotICAgICAgICAvLyBDb21tYSBhbmQgZmlyc3Qg
cnVuCi0gICAgICAgIGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFy
ICkpICkgewotICAgICAgICAgICAgaWYgKCBtYXRjaCApIHsKLSAgICAgICAgICAgICAgICAvLyBE
b24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAotICAgICAgICAgICAgICAgIHNv
RmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKLSAgICAgICAg
fQotCi0gICAgICAgIG1hdGNoZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBDb21iaW5hdG9ycwot
ICAgICAgICBpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKLSAg
ICAgICAgICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgICAgICAgICAgdG9rZW5zLnB1
c2goewotICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVkLAotICAgICAgICAgICAgICAgIC8v
IENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZQotICAgICAgICAgICAgICAgIHR5
cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCAiICIgKQotICAgICAgICAgICAgfSk7Ci0gICAg
ICAgICAgICBzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gRmlsdGVycwotICAgICAgICBmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVy
ICkgewotICAgICAgICAgICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBz
b0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAotICAgICAgICAgICAgICAgIChtYXRj
aCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewotICAgICAgICAgICAgICAgIG1h
dGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsKLSAg
ICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoZWQsCi0gICAgICAgICAgICAgICAgICAgIHR5
cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoCi0gICAgICAgICAg
ICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5s
ZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIW1hdGNo
ZWQgKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJl
dHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2VzcwotICAgIC8vIGlmIHdlJ3JlIGp1
c3QgcGFyc2luZwotICAgIC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRv
a2VucwotICAgIHJldHVybiBwYXJzZU9ubHkgPwotICAgICAgICBzb0Zhci5sZW5ndGggOgotICAg
ICAgICBzb0ZhciA/Ci0gICAgICAgICAgICBTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOgotICAg
ICAgICAgICAgLy8gQ2FjaGUgdGhlIHRva2VucwotICAgICAgICAgICAgdG9rZW5DYWNoZSggc2Vs
ZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Ci19Ci0KLWZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRv
a2VucyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGxlbiA9IHRva2Vucy5sZW5ndGgsCi0g
ICAgICAgIHNlbGVjdG9yID0gIiI7Ci0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAg
ICAgIHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVj
dG9yOwotfQotCi1mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBi
YXNlICkgewotICAgIHZhciBkaXIgPSBjb21iaW5hdG9yLmRpciwKLSAgICAgICAgY2hlY2tOb25F
bGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFyZW50Tm9kZSIsCi0gICAgICAgIGRvbmVOYW1l
ID0gZG9uZSsrOwotCi0gICAgcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPwotICAgICAgICAvLyBD
aGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnQKLSAgICAgICAg
ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKLSAgICAgICAgICAgIHdoaWxlICggKGVs
ZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBl
ID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gOgotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGFu
Y2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwotICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgewotICAgICAgICAgICAgdmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLAotICAgICAg
ICAgICAgICAgIG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdOwotCi0gICAgICAgICAg
ICAvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRv
bid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZwotICAgICAgICAgICAgaWYgKCB4bWwgKSB7Ci0g
ICAgICAgICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQs
IHhtbCApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIChl
bGVtID0gZWxlbVsgZGlyIF0pICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsg
ZGlyIF0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2FjaGVbIDAgXSA9PT0g
ZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHsKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJv
cGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIG5l
d2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckNhY2hlWyBkaXIgXSA9IG5ld0NhY2hlOwot
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25l
OyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQs
IHhtbCApKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9OwotfQotCi1mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7
Ci0gICAgcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPwotICAgICAgICBmdW5jdGlvbiggZWxl
bSwgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7
Ci0gICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFtYXRj
aGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSA6Ci0gICAgICAgIG1hdGNoZXJzWzBdOwotfQotCi1m
dW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkg
ewotICAgIHZhciBlbGVtLAotICAgICAgICBuZXdVbm1hdGNoZWQgPSBbXSwKLSAgICAgICAgaSA9
IDAsCi0gICAgICAgIGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCi0gICAgICAgIG1hcHBlZCA9IG1h
cCAhPSBudWxsOwotCi0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgIGlmICgg
KGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotICAgICAgICAgICAgaWYgKCAhZmlsdGVyIHx8IGZp
bHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAgICAgICAgICAgICAgbmV3VW5tYXRj
aGVkLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAgICAgICBpZiAoIG1hcHBlZCApIHsKLSAgICAg
ICAgICAgICAgICAgICAgbWFwLnB1c2goIGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VW5tYXRjaGVkOwotfQot
Ci1mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0
RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7Ci0gICAgaWYgKCBwb3N0RmlsdGVy
ICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7Ci0gICAgICAgIHBvc3RGaWx0ZXIgPSBzZXRN
YXRjaGVyKCBwb3N0RmlsdGVyICk7Ci0gICAgfQotICAgIGlmICggcG9zdEZpbmRlciAmJiAhcG9z
dEZpbmRlclsgZXhwYW5kbyBdICkgewotICAgICAgICBwb3N0RmluZGVyID0gc2V0TWF0Y2hlcigg
cG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7Ci0gICAgfQotICAgIHJldHVybiBtYXJrRnVuY3Rp
b24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKLSAgICAgICAgdmFy
IHRlbXAsIGksIGVsZW0sCi0gICAgICAgICAgICBwcmVNYXAgPSBbXSwKLSAgICAgICAgICAgIHBv
c3RNYXAgPSBbXSwKLSAgICAgICAgICAgIHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCi0K
LSAgICAgICAgICAgIC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0
Ci0gICAgICAgICAgICBlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3Ig
fHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAot
Ci0gICAgICAgICAgICAvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZp
bmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgIG1h
dGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwotICAgICAgICAg
ICAgICAgIGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCAp
IDoKLSAgICAgICAgICAgICAgICBlbGVtcywKLQotICAgICAgICAgICAgbWF0Y2hlck91dCA9IG1h
dGNoZXIgPwotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBm
aWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3Vs
dHMsCi0gICAgICAgICAgICAgICAgcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBw
cmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPwotCi0gICAgICAgICAgICAgICAgICAgIC8vIC4u
LmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAg
ICBbXSA6Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRz
IGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgOgotICAgICAgICAgICAgICAg
IG1hdGNoZXJJbjsKLQotICAgICAgICAvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcwotICAgICAgICBp
ZiAoIG1hdGNoZXIgKSB7Ci0gICAgICAgICAgICBtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJP
dXQsIGNvbnRleHQsIHhtbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwbHkgcG9zdEZp
bHRlcgotICAgICAgICBpZiAoIHBvc3RGaWx0ZXIgKSB7Ci0gICAgICAgICAgICB0ZW1wID0gY29u
ZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsKLSAgICAgICAgICAgIHBvc3RGaWx0ZXIoIHRl
bXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKLQotICAgICAgICAgICAgLy8gVW4tbWF0Y2ggZmFpbGlu
ZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJbgotICAgICAgICAgICAg
aSA9IHRlbXAubGVuZ3RoOwotICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgewotICAgICAgICAgICAgICAgICAgICBtYXRj
aGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCBzZWVkICkgewotICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciAp
IHsKLSAgICAgICAgICAgICAgICBpZiAoIHBvc3RGaW5kZXIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJt
ZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0cwotICAgICAgICAgICAgICAgICAgICB0ZW1w
ID0gW107Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAgICAg
ICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0
Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goIChtYXRjaGVySW5baV0g
PSBlbGVtKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0g
W10pLCB0ZW1wLCB4bWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAv
LyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVt
IHN5bmNocm9uaXplZAotICAgICAgICAgICAgICAgIGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAg
ICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAo
ZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodGVtcCA9
IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAt
MSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0
ZW1wXSA9IGVsZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJv
dWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
bWF0Y2hlck91dCA9IGNvbmRlbnNlKAotICAgICAgICAgICAgICAgIG1hdGNoZXJPdXQgPT09IHJl
c3VsdHMgPwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3Rp
bmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0
Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyICkgewotICAgICAg
ICAgICAgICAgIHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOwot
ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRz
LCBtYXRjaGVyT3V0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9KTsKLX0KLQot
ZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKLSAgICB2YXIgY2hlY2tDb250
ZXh0LCBtYXRjaGVyLCBqLAotICAgICAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAotICAgICAgICBs
ZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAotICAgICAg
ICBpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAi
XSwKLSAgICAgICAgaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAotCi0gICAgICAgIC8vIFRo
ZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJs
ZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCi0gICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENv
bWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09
IGNoZWNrQ29udGV4dDsKLSAgICAgICAgfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAotICAg
ICAgICBtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4g
LTE7Ci0gICAgICAgIH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKLSAgICAgICAgbWF0Y2hl
cnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7Ci0gICAgICAgICAgICByZXR1
cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENv
bnRleHQgKSApIHx8ICgKLSAgICAgICAgICAgICAgICAoY2hlY2tDb250ZXh0ID0gY29udGV4dCku
bm9kZVR5cGUgPwotICAgICAgICAgICAgICAgICAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRl
eHQsIHhtbCApIDoKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBj
b250ZXh0LCB4bWwgKSApOwotICAgICAgICB9IF07Ci0KLSAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKLSAgICAgICAgaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50
eXBlIF0pICkgewotICAgICAgICAgICAgbWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoZWxlbWVu
dE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIpIF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51
bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBzcGVjaWFs
IHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyCi0gICAgICAgICAgICBpZiAoIG1hdGNo
ZXJbIGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHJlbGF0
aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmcKLSAgICAgICAgICAgICAg
ICBqID0gKytpOwotICAgICAgICAgICAgICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgewotICAg
ICAgICAgICAgICAgICAgICBpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0TWF0Y2hlcigKLSAg
ICAgICAgICAgICAgICAgICAgaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCi0g
ICAgICAgICAgICAgICAgICAgIGkgPiAxICYmIHRvU2VsZWN0b3IoCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmlu
YXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYAotICAgICAgICAgICAgICAg
ICAgICAgICAgdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNb
IGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKLSAgICAgICAgICAgICAgICAgICAg
KS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyLAot
ICAgICAgICAgICAgICAgICAgICBpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNs
aWNlKCBpLCBqICkgKSwKLSAgICAgICAgICAgICAgICAgICAgaiA8IGxlbiAmJiBtYXRjaGVyRnJv
bVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLAotICAgICAgICAgICAgICAg
ICAgICBqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApCi0gICAgICAgICAgICAgICAgKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsK
LX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMs
IHNldE1hdGNoZXJzICkgewotICAgIHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAs
Ci0gICAgICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLAotICAgICAg
ICBzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBv
dXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSwgaiwgbWF0Y2hlciwKLSAgICAgICAg
ICAgICAgICBtYXRjaGVkQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGkgPSAiMCIsCi0gICAg
ICAgICAgICAgICAgdW5tYXRjaGVkID0gc2VlZCAmJiBbXSwKLSAgICAgICAgICAgICAgICBzZXRN
YXRjaGVkID0gW10sCi0gICAgICAgICAgICAgICAgY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENv
bnRleHQsCi0gICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2Vl
ZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dAotICAgICAgICAgICAgICAgIGVsZW1zID0g
c2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kWyJUQUciXSggIioiLCBvdXRlcm1vc3QgKSwK
LSAgICAgICAgICAgICAgICAvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBv
dXRlcm1vc3QgbWF0Y2hlcgotICAgICAgICAgICAgICAgIGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVu
cyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLAot
ICAgICAgICAgICAgICAgIGxlbiA9IGVsZW1zLmxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKCBv
dXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICAgICAgb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQg
IT09IGRvY3VtZW50ICYmIGNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRz
Ci0gICAgICAgICAgICAvLyBLZWVwIGBpYCBhIHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxlbWVu
dHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAiMDAiIGJlbG93Ci0gICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRTw5LCBTYWZhcmkKLSAgICAgICAgICAgIC8vIFRvbGVyYXRlIE5vZGVMaXN0IHBy
b3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVu
dHMgYnkgaWQKLSAgICAgICAgICAgIGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNb
aV0pICE9IG51bGw7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGJ5RWxlbWVudCAmJiBl
bGVtICkgewotICAgICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBvdXRlcm1vc3QgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8v
IFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKLSAgICAgICAgICAgICAg
ICBpZiAoIGJ5U2V0ICkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGV5IHdpbGwgaGF2ZSBn
b25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzCi0gICAgICAgICAgICAgICAgICAgIGlm
ICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1hdGNoZWRDb3VudC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg
ICAgICAgLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9y
IG5vdAotICAgICAgICAgICAgICAgICAgICBpZiAoIHNlZWQgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB1bm1hdGNoZWQucHVzaCggZWxlbSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcHBseSBz
ZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMKLSAgICAgICAgICAgIG1hdGNoZWRDb3Vu
dCArPSBpOwotICAgICAgICAgICAgaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7
Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hl
ciA9IHNldE1hdGNoZXJzW2orK10pICkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyKCB1
bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApOwotICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgIGlmICggc2VlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
UmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29y
dGluZwotICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3Vs
dHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBE
aXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hl
cwotICAgICAgICAgICAgICAgICAgICBzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQg
KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgbWF0Y2hlcyB0
byByZXN1bHRzCi0gICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hl
ZCApOwotCi0gICAgICAgICAgICAgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGlu
ZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCi0gICAgICAg
ICAgICAgICAgaWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAw
ICYmCi0gICAgICAgICAgICAgICAgICAgICggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVu
Z3RoICkgPiAxICkgewotCi0gICAgICAgICAgICAgICAgICAgIFNpenpsZS51bmlxdWVTb3J0KCBy
ZXN1bHRzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMK
LSAgICAgICAgICAgIGlmICggb3V0ZXJtb3N0ICkgewotICAgICAgICAgICAgICAgIGRpcnJ1bnMg
PSBkaXJydW5zVW5pcXVlOwotICAgICAgICAgICAgICAgIG91dGVybW9zdENvbnRleHQgPSBjb250
ZXh0QmFja3VwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdW5tYXRjaGVk
OwotICAgICAgICB9OwotCi0gICAgcmV0dXJuIGJ5U2V0ID8KLSAgICAgICAgbWFya0Z1bmN0aW9u
KCBzdXBlck1hdGNoZXIgKSA6Ci0gICAgICAgIHN1cGVyTWF0Y2hlcjsKLX0KLQotY29tcGlsZSA9
IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBncm91cCAvKiBJbnRlcm5hbCBV
c2UgT25seSAqLyApIHsKLSAgICB2YXIgaSwKLSAgICAgICAgc2V0TWF0Y2hlcnMgPSBbXSwKLSAg
ICAgICAgZWxlbWVudE1hdGNoZXJzID0gW10sCi0gICAgICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2Fj
aGVbIHNlbGVjdG9yICsgIiAiIF07Ci0KLSAgICBpZiAoICFjYWNoZWQgKSB7Ci0gICAgICAgIC8v
IEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1
c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAotICAgICAgICBpZiAoICFncm91cCApIHsKLSAgICAg
ICAgICAgIGdyb3VwID0gdG9rZW5pemUoIHNlbGVjdG9yICk7Ci0gICAgICAgIH0KLSAgICAgICAg
aSA9IGdyb3VwLmxlbmd0aDsKLSAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICBj
YWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggZ3JvdXBbaV0gKTsKLSAgICAgICAgICAgIGlmICgg
Y2FjaGVkWyBleHBhbmRvIF0gKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWF0Y2hlcnMucHVzaCgg
Y2FjaGVkICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVsZW1lbnRN
YXRjaGVycy5wdXNoKCBjYWNoZWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvbgotICAgICAgICBjYWNoZWQgPSBjb21w
aWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0
Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZDsKLX07Ci0K
LWZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyAp
IHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGxlbiA9IGNvbnRleHRzLmxlbmd0aDsKLSAgICBm
b3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgU2l6emxlKCBzZWxlY3RvciwgY29udGV4
dHNbaV0sIHJlc3VsdHMgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLWZ1bmN0
aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFy
IGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCi0gICAgICAgIG1hdGNoID0gdG9rZW5pemUo
IHNlbGVjdG9yICk7Ci0KLSAgICBpZiAoICFzZWVkICkgewotICAgICAgICAvLyBUcnkgdG8gbWlu
aW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cAotICAgICAgICBpZiAo
IG1hdGNoLmxlbmd0aCA9PT0gMSApIHsKLQotICAgICAgICAgICAgLy8gVGFrZSBhIHNob3J0Y3V0
IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKLSAgICAg
ICAgICAgIHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKLSAgICAgICAg
ICAgIGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09
PSAiSUQiICYmCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0
Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmCi0gICAgICAgICAgICAgICAgICAg
IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7Ci0KLSAgICAgICAgICAgICAgICBj
b250ZXh0ID0gKCBFeHByLmZpbmRbIklEIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5l
c2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdOwotICAgICAgICAgICAgICAg
IGlmICggIWNvbnRleHQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNs
aWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwot
ICAgICAgICAgICAgaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3Ig
KSA/IDAgOiB0b2tlbnMubGVuZ3RoOwotICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAg
ICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBBYm9y
dCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCi0gICAgICAgICAgICAgICAgaWYgKCBFeHByLnJlbGF0
aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIChmaW5kID0gRXhwci5m
aW5kWyB0eXBlIF0pICkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2gsIGV4cGFuZGlu
ZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCAoc2VlZCA9IGZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5t
YXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksCi0gICAgICAgICAgICAg
ICAgICAgICAgICByc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0
KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICkp
ICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5v
IHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRva2Vucy5zcGxpY2UoIGksIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVj
dG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoICFzZWxlY3RvciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ29tcGls
ZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbgotICAgIC8vIFByb3ZpZGUgYG1hdGNo
YCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJv
dmUKLSAgICBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSgKLSAgICAgICAgc2VlZCwKLSAgICAg
ICAgY29udGV4dCwKLSAgICAgICAgIWRvY3VtZW50SXNIVE1MLAotICAgICAgICByZXN1bHRzLAot
ICAgICAgICByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0
LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Ci0gICAgKTsKLSAgICByZXR1cm4gcmVzdWx0czsKLX0K
LQotLy8gT25lLXRpbWUgYXNzaWdubWVudHMKLQotLy8gU29ydCBzdGFiaWxpdHkKLXN1cHBvcnQu
c29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIiIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIiIp
ID09PSBleHBhbmRvOwotCi0vLyBTdXBwb3J0OiBDaHJvbWU8MTQKLS8vIEFsd2F5cyBhc3N1bWUg
ZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rp
b24KLXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlOwotCi0vLyBJbml0
aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKLXNldERvY3VtZW50KCk7Ci0KLS8v
IFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBp
biBDaHJvbWUgMjcpCi0vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFj
aCBvdGhlcioKLXN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkg
ewotICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKQotICAg
IHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJkaXYiKSApICYgMTsKLX0pOwotCi0vLyBTdXBwb3J0OiBJRTw4Ci0vLyBQcmV2ZW50IGF0
dHJpYnV0ZS9wcm9wZXJ0eSAiaW50ZXJwb2xhdGlvbiIKLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHgKLWlmICggIWFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgewotICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9h
PiI7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAi
IyIgOwotfSkgKSB7Ci0gICAgYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1
bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLSAgICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi0vLyBT
dXBwb3J0OiBJRTw5Ci0vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0
ZSgidmFsdWUiKQotaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24o
IGRpdiApIHsKLSAgICBkaXYuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKLSAgICBkaXYuZmlyc3RD
aGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIiICk7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENo
aWxkLmdldEF0dHJpYnV0ZSggInZhbHVlIiApID09PSAiIjsKLX0pICkgewotICAgIGFkZEhhbmRs
ZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewotICAgICAgICBpZiAo
ICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICB9KTsK
LX0KLQotLy8gU3VwcG9ydDogSUU8OQotLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2gg
Ym9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllcwotaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBk
aXYgKSB7Ci0gICAgcmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsK
LX0pICkgewotICAgIGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBp
c1hNTCApIHsKLSAgICAgICAgdmFyIHZhbDsKLSAgICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0gICAg
ICAgICAgICByZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgp
IDoKLSAgICAgICAgICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFt
ZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KLSAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
LSAgICAgICAgICAgICAgICBudWxsOwotICAgICAgICB9Ci0gICAgfSk7Ci19Ci0KLXJldHVybiBT
aXp6bGU7Ci0KLX0pKCB3aW5kb3cgKTsKLQotCi0KLWpRdWVyeS5maW5kID0gU2l6emxlOwotalF1
ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwotalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5l
eHByLnBzZXVkb3M7Ci1qUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7Ci1qUXVlcnku
dGV4dCA9IFNpenpsZS5nZXRUZXh0OwotalF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MOwot
alF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwotCi0KLQotdmFyIHJuZWVkc0NvbnRl
eHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7Ci0KLXZhciByc2luZ2xlVGFnID0g
KC9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8pOwotCi0KLQotdmFyIHJpc1NpbXBsZSA9IC9e
LlteOiNcW1wuLF0qJC87Ci0KLS8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxp
dHkgZm9yIGZpbHRlciBhbmQgbm90Ci1mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZp
ZXIsIG5vdCApIHsKLSAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsK
LSAgICAgICAgcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkg
KSB7Ci0gICAgICAgICAgICAvKiBqc2hpbnQgLVcwMTggKi8KLSAgICAgICAgICAgIHJldHVybiAh
IXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDsKLSAgICAgICAgfSk7Ci0K
LSAgICB9Ci0KLSAgICBpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHsKLSAgICAgICAgcmV0dXJu
IGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90OwotICAgICAgICB9KTsKLQotICAg
IH0KLQotICAgIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAg
IGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkgewotICAgICAgICAgICAgcmV0dXJu
IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwotICAgICAgICB9Ci0K
LSAgICAgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyAp
OwotICAgIH0KLQotICAgIHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBl
bGVtICkgewotICAgICAgICByZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSAp
ID49IDAgKSAhPT0gbm90OwotICAgIH0pOwotfQotCi1qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24o
IGV4cHIsIGVsZW1zLCBub3QgKSB7Ci0gICAgdmFyIGVsZW0gPSBlbGVtc1sgMCBdOwotCi0gICAg
aWYgKCBub3QgKSB7Ci0gICAgICAgIGV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKLSAgICB9
Ci0KLSAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEg
PwotICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsg
ZWxlbSBdIDogW10gOgotICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnku
Z3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0u
bm9kZVR5cGUgPT09IDE7Ci0gICAgICAgIH0pKTsKLX07Ci0KLWpRdWVyeS5mbi5leHRlbmQoewot
ICAgIGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgdmFyIGksCi0gICAgICAg
ICAgICBsZW4gPSB0aGlzLmxlbmd0aCwKLSAgICAgICAgICAgIHJldCA9IFtdLAotICAgICAgICAg
ICAgc2VsZiA9IHRoaXM7Ci0KLSAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVj
dG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBp
IDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmNvbnRhaW5z
KCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysg
KSB7Ci0gICAgICAgICAgICBqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29u
dGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICkKLSAgICAgICAgcmV0
ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCAp
OwotICAgICAgICByZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciAr
ICIgIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwK
LSAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
cHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlKSApOwotICAgIH0s
Ci0gICAgbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB1
c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlKSApOwotICAgIH0sCi0g
ICAgaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgcmV0dXJuICEhd2lubm93KAot
ICAgICAgICAgICAgdGhpcywKLQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9u
YWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNl
dAotICAgICAgICAgICAgLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1
cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgotICAgICAgICAgICAgdHlwZW9mIHNlbGVj
dG9yID09PSAic3RyaW5nIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPwotICAg
ICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3IgKSA6Ci0gICAgICAgICAgICAgICAgc2VsZWN0
b3IgfHwgW10sCi0gICAgICAgICAgICBmYWxzZQotICAgICAgICApLmxlbmd0aDsKLSAgICB9Ci19
KTsKLQotCi0vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAotCi0KLS8vIEEgY2VudHJhbCBy
ZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQotdmFyIHJvb3RqUXVlcnksCi0K
LSAgICAvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwotICAgIC8vIFBy
aW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgj
OTUyMSkKLSAgICAvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0
IHdpdGggPCkKLSAgICBycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3
LV0qKSkkLywKLQotICAgIGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3Rv
ciwgY29udGV4dCApIHsKLSAgICAgICAgdmFyIG1hdGNoLCBlbGVtOwotCi0gICAgICAgIC8vIEhB
TkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKLSAgICAgICAgaWYg
KCAhc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKLSAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0
b3IgPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgaWYgKCBzZWxlY3RvclswXSA9PT0gIjwi
ICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09ICI+IiAmJiBzZWxlY3Rvci5s
ZW5ndGggPj0gMyApIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRo
YXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVj
awotICAgICAgICAgICAgICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOwotCi0g
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hdGNoID0gcnF1aWNrRXhwci5l
eGVjKCBzZWxlY3RvciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYXRjaCBo
dG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCi0gICAgICAg
ICAgICBpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7Ci0KLSAgICAgICAg
ICAgICAgICAvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKLSAgICAgICAgICAgICAgICBp
ZiAoIG1hdGNoWzFdICkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCBp
bnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwotCi0gICAgICAgICAgICAg
ICAgICAgIC8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKLSAgICAgICAgICAgICAg
ICAgICAgLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhU
TUwgaXMgbm90IHByZXNlbnQKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCB0aGlz
LCBqUXVlcnkucGFyc2VIVE1MKAotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250
ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LAotICAgICAgICAgICAgICAg
ICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgICAgICAgICApICk7Ci0KLSAgICAgICAgICAgICAg
ICAgICAgLy8gSEFORExFOiAkKGh0bWwsIHByb3BzKQotICAgICAgICAgICAgICAgICAgICBpZiAo
IHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29u
dGV4dCApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggbWF0Y2ggaW4gY29udGV4
dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIG9mIGNvbnRl
eHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRj
aCBdICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgb3RoZXJ3aXNl
IHNldCBhcyBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4
dFsgbWF0Y2ggXSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKCNpZCkKLSAg
ICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbGVtID0gZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8g
Q2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKLSAg
ICAgICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1
bWVudCAjNjk2MwotICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnRO
b2RlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRp
cmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRo
aXMubGVuZ3RoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbMF0gPSBlbGVtOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0
ID0gZG9jdW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rv
cjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQotICAgICAgICAgICAgfSBl
bHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKLQotICAg
ICAgICAgICAgLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCi0gICAgICAgICAgICAvLyAod2hp
Y2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNv
bnRleHQgKS5maW5kKCBzZWxlY3RvciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEhB
TkRMRTogJChET01FbGVtZW50KQotICAgICAgICB9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlw
ZSApIHsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKLSAg
ICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0g
ICAgICAgIC8vIEhBTkRMRTogJChmdW5jdGlvbikKLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIGRv
Y3VtZW50IHJlYWR5Ci0gICAgICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxl
Y3RvciApICkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiByb290alF1ZXJ5LnJlYWR5ICE9
PSAidW5kZWZpbmVkIiA/Ci0gICAgICAgICAgICAgICAgcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0
b3IgKSA6Ci0gICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBp
cyBub3QgcHJlc2VudAotICAgICAgICAgICAgICAgIHNlbGVjdG9yKCBqUXVlcnkgKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsK
LSAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKLSAgICAgICAg
ICAgIHRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAg
ICByZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKLSAgICB9OwotCi0v
LyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBp
bnN0YW50aWF0aW9uCi1pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKLQotLy8gSW5pdGlhbGl6
ZSBjZW50cmFsIHJlZmVyZW5jZQotcm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTsKLQot
Ci12YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCi0g
ICAgLy8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3Rh
cnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQKLSAgICBndWFyYW50ZWVkVW5pcXVlID0gewotICAgICAg
ICBjaGlsZHJlbjogdHJ1ZSwKLSAgICAgICAgY29udGVudHM6IHRydWUsCi0gICAgICAgIG5leHQ6
IHRydWUsCi0gICAgICAgIHByZXY6IHRydWUKLSAgICB9OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAg
ICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewotICAgICAgICB2YXIgbWF0Y2hl
ZCA9IFtdLAotICAgICAgICAgICAgdHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkOwotCi0g
ICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgJiYgZWxlbS5ub2RlVHlwZSAhPT0g
OSApIHsKLSAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgbWF0Y2hlZC5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIG1hdGNoZWQ7Ci0gICAgfSwKLQotICAgIHNpYmxpbmc6IGZ1bmN0aW9uKCBu
LCBlbGVtICkgewotICAgICAgICB2YXIgbWF0Y2hlZCA9IFtdOwotCi0gICAgICAgIGZvciAoIDsg
bjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7Ci0gICAgICAgICAgICBpZiAoIG4ubm9kZVR5cGUgPT09
IDEgJiYgbiAhPT0gZWxlbSApIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVkLnB1c2goIG4gKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaGVkOwotICAg
IH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBoYXM6IGZ1bmN0aW9uKCB0YXJnZXQg
KSB7Ci0gICAgICAgIHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKLSAgICAg
ICAgICAgIGwgPSB0YXJnZXRzLmxlbmd0aDsKLQotICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIo
ZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKCA7
IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHRo
aXMsIHRhcmdldHNbaV0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotCi0g
ICAgY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHsKLSAgICAgICAgdmFy
IGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAot
ICAgICAgICAgICAgbWF0Y2hlZCA9IFtdLAotICAgICAgICAgICAgcG9zID0gcm5lZWRzQ29udGV4
dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5nIiA/Ci0g
ICAgICAgICAgICAgICAgalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0
ICkgOgotICAgICAgICAgICAgICAgIDA7Ci0KLSAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkg
ewotICAgICAgICAgICAgZm9yICggY3VyID0gdGhpc1tpXTsgY3VyICYmIGN1ciAhPT0gY29udGV4
dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHNr
aXAgZG9jdW1lbnQgZnJhZ21lbnRzCi0gICAgICAgICAgICAgICAgaWYgKCBjdXIubm9kZVR5cGUg
PCAxMSAmJiAocG9zID8KLSAgICAgICAgICAgICAgICAgICAgcG9zLmluZGV4KGN1cikgPiAtMSA6
Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6
emxlCi0gICAgICAgICAgICAgICAgICAgIGN1ci5ub2RlVHlwZSA9PT0gMSAmJgotICAgICAgICAg
ICAgICAgICAgICAgICAgalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3Jz
KSkgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKCBjdXIgKTsKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0
aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVkICkgOiBtYXRjaGVkICk7Ci0gICAgfSwKLQot
ICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KLSAgICAv
LyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKLSAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0g
KSB7Ci0KLSAgICAgICAgLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKLSAg
ICAgICAgaWYgKCAhZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiAoIHRoaXNbIDAgXSAmJiB0
aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAt
MTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluZGV4IGluIHNlbGVjdG9yCi0gICAgICAgIGlm
ICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4
T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50Ci0gICAgICAg
IHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsCi0KLSAgICAgICAgICAgIC8vIElmIGl0IHJlY2Vp
dmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAotICAgICAgICAg
ICAgZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtCi0gICAgICAgICk7Ci0gICAgfSwKLQot
ICAgIGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewotICAgICAgICByZXR1cm4g
dGhpcy5wdXNoU3RhY2soCi0gICAgICAgICAgICBqUXVlcnkudW5pcXVlKAotICAgICAgICAgICAg
ICAgIGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCAp
ICkKLSAgICAgICAgICAgICkKLSAgICAgICAgKTsKLSAgICB9LAotCi0gICAgYWRkQmFjazogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgewotICAgICAgICByZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09
IG51bGwgPwotICAgICAgICAgICAgdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZp
bHRlcihzZWxlY3RvcikKLSAgICAgICAgKTsKLSAgICB9Ci19KTsKLQotZnVuY3Rpb24gc2libGlu
ZyggY3VyLCBkaXIgKSB7Ci0gICAgd2hpbGUgKCAoY3VyID0gY3VyW2Rpcl0pICYmIGN1ci5ub2Rl
VHlwZSAhPT0gMSApIHt9Ci0gICAgcmV0dXJuIGN1cjsKLX0KLQotalF1ZXJ5LmVhY2goewotICAg
IHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZhciBwYXJlbnQgPSBlbGVtLnBh
cmVudE5vZGU7Ci0gICAgICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAx
MSA/IHBhcmVudCA6IG51bGw7Ci0gICAgfSwKLSAgICBwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwotICAg
IH0sCi0gICAgcGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAg
ICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGlsICk7Ci0gICAg
fSwKLSAgICBuZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIHNpYmxpbmco
IGVsZW0sICJuZXh0U2libGluZyIgKTsKLSAgICB9LAotICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICByZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsK
LSAgICB9LAotICAgIG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4g
alF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiApOwotICAgIH0sCi0gICAgcHJldkFsbDog
ZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJl
dmlvdXNTaWJsaW5nIiApOwotICAgIH0sCi0gICAgbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwg
aSwgdW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxp
bmciLCB1bnRpbCApOwotICAgIH0sCi0gICAgcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwg
dW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJs
aW5nIiwgdW50aWwgKTsKLSAgICB9LAotICAgIHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSAp
LmZpcnN0Q2hpbGQsIGVsZW0gKTsKLSAgICB9LAotICAgIGNoaWxkcmVuOiBmdW5jdGlvbiggZWxl
bSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsK
LSAgICB9LAotICAgIGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJu
IGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2Rl
cyApOwotICAgIH0KLX0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKLSAgICBqUXVlcnkuZm5bIG5h
bWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBtYXRjaGVk
ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7Ci0KLSAgICAgICAgaWYgKCBuYW1lLnNs
aWNlKCAtNSApICE9PSAiVW50aWwiICkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSB1bnRpbDsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09
PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxl
Y3RvciwgbWF0Y2hlZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0aGlzLmxlbmd0aCA+
IDEgKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlcwotICAgICAgICAgICAgaWYg
KCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS51
bmlxdWUoIG1hdGNoZWQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV2ZXJz
ZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXMKLSAgICAgICAgICAgIGlm
ICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVk
LnJldmVyc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApOwotICAgIH07Ci19KTsKLXZhciBybm90d2hpdGUgPSAo
L1xTKy9nKTsKLQotCi0KLS8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUK
LXZhciBvcHRpb25zQ2FjaGUgPSB7fTsKLQotLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9w
dGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCi1mdW5j
dGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgewotICAgIHZhciBvYmplY3QgPSBvcHRpb25z
Q2FjaGVbIG9wdGlvbnMgXSA9IHt9OwotICAgIGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBy
bm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7Ci0gICAgICAgIG9iamVjdFsg
ZmxhZyBdID0gdHJ1ZTsKLSAgICB9KTsKLSAgICByZXR1cm4gb2JqZWN0OwotfQotCi0vKgotICog
Q3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0g
KgotICogIG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlv
bnMgdGhhdCB3aWxsIGNoYW5nZSBob3cKLSAqICAgICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBi
ZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0Ci0gKgotICogQnkgZGVm
YXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0
IGFuZCBjYW4gYmUKLSAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCi0gKgotICogUG9zc2libGUg
b3B0aW9uczoKLSAqCi0gKiAgb25jZTogICAgICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFj
ayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKLSAqCi0gKiAg
bWVtb3J5OiAgICAgICAgIHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdp
bGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhl
IGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXpl
ZCIKLSAqICAgICAgICAgICAgICAgICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCi0gKgotICog
IHVuaXF1ZTogICAgICAgICB3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVk
IG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKLSAqCi0gKiAgc3RvcE9uRmFsc2U6ICAg
IGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQotICoKLSAq
LwotalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewotCi0gICAgLy8gQ29u
dmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlm
IG5lZWRlZAotICAgIC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKLSAgICBvcHRpb25zID0g
dHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8KLSAgICAgICAgKCBvcHRpb25zQ2FjaGVbIG9w
dGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6Ci0gICAgICAgIGpRdWVyeS5l
eHRlbmQoIHt9LCBvcHRpb25zICk7Ci0KLSAgICB2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Ig
bm9uLWZvcmdldHRhYmxlIGxpc3RzKQotICAgICAgICBtZW1vcnksCi0gICAgICAgIC8vIEZsYWcg
dG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCi0gICAgICAgIGZpcmVkLAotICAgICAg
ICAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCi0gICAgICAgIGZp
cmluZywKLSAgICAgICAgLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5
IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCi0gICAgICAgIGZpcmluZ1N0YXJ0LAotICAgICAgICAvLyBF
bmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKLSAgICAgICAgZmlyaW5nTGVuZ3RoLAotICAgICAg
ICAvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1v
dmUgaWYgbmVlZGVkKQotICAgICAgICBmaXJpbmdJbmRleCwKLSAgICAgICAgLy8gQWN0dWFsIGNh
bGxiYWNrIGxpc3QKLSAgICAgICAgbGlzdCA9IFtdLAotICAgICAgICAvLyBTdGFjayBvZiBmaXJl
IGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCi0gICAgICAgIHN0YWNrID0gIW9wdGlvbnMub25j
ZSAmJiBbXSwKLSAgICAgICAgLy8gRmlyZSBjYWxsYmFja3MKLSAgICAgICAgZmlyZSA9IGZ1bmN0
aW9uKCBkYXRhICkgewotICAgICAgICAgICAgbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0
YTsKLSAgICAgICAgICAgIGZpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGZpcmluZ0luZGV4ID0g
ZmlyaW5nU3RhcnQgfHwgMDsKLSAgICAgICAgICAgIGZpcmluZ1N0YXJ0ID0gMDsKLSAgICAgICAg
ICAgIGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwotICAgICAgICAgICAgZmlyaW5nID0gdHJ1
ZTsKLSAgICAgICAgICAgIGZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0
aDsgZmlyaW5nSW5kZXgrKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxpc3RbIGZpcmluZ0lu
ZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMu
c3RvcE9uRmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBU
byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkCi0gICAgICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcmlu
ZyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCBsaXN0ICkgewotICAgICAgICAgICAgICAgIGlm
ICggc3RhY2sgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhY2subGVuZ3RoICkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSggc3RhY2suc2hpZnQoKSApOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWVtb3J5ICkgewotICAg
ICAgICAgICAgICAgICAgICBsaXN0ID0gW107Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICAvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVj
dAotICAgICAgICBzZWxmID0gewotICAgICAgICAgICAgLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBj
b2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdAotICAgICAgICAgICAgYWRkOiBmdW5j
dGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxpc3QgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aAotICAgICAgICAgICAgICAg
ICAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgKGZ1bmN0
aW9uIGFkZCggYXJncyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCBh
cmdzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCggYXJnICk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zcGVjdCByZWN1cnNpdmVseQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoIGFyZyApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
ICAgICAgICB9KSggYXJndW1lbnRzICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIG5l
ZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGN1
cnJlbnQgZmlyaW5nIGJhdGNoPwotICAgICAgICAgICAgICAgICAgICBpZiAoIGZpcmluZyApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwotICAg
ICAgICAgICAgICAgICAgICAvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVu
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXkKLSAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWVtb3J5ICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgZmlyaW5nU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmUo
IG1lbW9yeSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8v
IFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgIHJlbW92ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBsaXN0ICkgewotICAgICAgICAgICAgICAg
ICAgICBqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hp
bGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoIGluZGV4LCAxICk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBmaXJpbmcgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nTGVuZ3RoLS07Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpcmluZ0luZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBDaGVj
ayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgotICAgICAgICAgICAgLy8gSWYg
bm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxs
YmFja3MgYXR0YWNoZWQuCi0gICAgICAgICAgICBoYXM6IGZ1bmN0aW9uKCBmbiApIHsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDog
ISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAv
LyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICBlbXB0eTog
ZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IFtdOwotICAgICAgICAgICAgICAg
IGZpcmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAg
ICAgICB9LAotICAgICAgICAgICAgLy8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUK
LSAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGxpc3Qg
PSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhp
czsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBJcyBpdCBkaXNhYmxlZD8KLSAgICAg
ICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWxp
c3Q7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gTG9jayB0aGUgbGlzdCBpbiBpdHMg
Y3VycmVudCBzdGF0ZQotICAgICAgICAgICAgbG9jazogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
ICAgICAgc3RhY2sgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKCAhbWVtb3J5ICkg
ewotICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc2FibGUoKTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9LAotICAgICAgICAg
ICAgLy8gSXMgaXQgbG9ja2VkPwotICAgICAgICAgICAgbG9ja2VkOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gIXN0YWNrOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAg
IC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVu
dHMKLSAgICAgICAgICAgIGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXJncyA9IGFyZ3MgfHwgW107Ci0gICAgICAgICAgICAgICAgICAgIGFy
Z3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICggZmlyaW5nICkgewotICAgICAgICAgICAgICAgICAgICAgICAg
c3RhY2sucHVzaCggYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAgICAgZmlyZSggYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAg
ICAgfSwKLSAgICAgICAgICAgIC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2
ZW4gYXJndW1lbnRzCi0gICAgICAgICAgICBmaXJlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAg
ICAgICBzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBUbyBrbm93IGlmIHRo
ZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKLSAgICAg
ICAgICAgIGZpcmVkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISFmaXJl
ZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIHJldHVybiBzZWxmOwotfTsKLQot
Ci1qUXVlcnkuZXh0ZW5kKHsKLQotICAgIERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKLSAg
ICAgICAgdmFyIHR1cGxlcyA9IFsKLSAgICAgICAgICAgICAgICAvLyBhY3Rpb24sIGFkZCBsaXN0
ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGUKLSAgICAgICAgICAgICAgICBbICJyZXNv
bHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQi
IF0sCi0gICAgICAgICAgICAgICAgWyAicmVqZWN0IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJhY2tz
KCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQiIF0sCi0gICAgICAgICAgICAgICAgWyAibm90aWZ5
IiwgInByb2dyZXNzIiwgalF1ZXJ5LkNhbGxiYWNrcygibWVtb3J5IikgXQotICAgICAgICAgICAg
XSwKLSAgICAgICAgICAgIHN0YXRlID0gInBlbmRpbmciLAotICAgICAgICAgICAgcHJvbWlzZSA9
IHsKLSAgICAgICAgICAgICAgICBzdGF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGFs
d2F5czogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLmRvbmUoIGFy
Z3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9u
KCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHsKLSAgICAgICAgICAgICAgICAg
ICAgdmFyIGZucyA9IGFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVy
eS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkg
JiYgZm5zWyBpIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXJyZWRbIGRv
bmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVy
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZCA9IGZu
ICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJv
bWlzZSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQu
cHJvbWlzZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbmUo
IG5ld0RlZmVyLnJlc29sdmUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBuZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBwcm9taXNl
ID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVu
dHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBmbnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9KS5wcm9taXNl
KCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAvLyBHZXQgYSBwcm9taXNl
IGZvciB0aGlzIGRlZmVycmVkCi0gICAgICAgICAgICAgICAgLy8gSWYgb2JqIGlzIHByb3ZpZGVk
LCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdAotICAgICAgICAgICAg
ICAgIHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgZGVmZXJyZWQg
PSB7fTsKLQotICAgICAgICAvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0Ci0gICAgICAgIHBy
b21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKLQotICAgICAgICAvLyBBZGQgbGlzdC1zcGVjaWZp
YyBtZXRob2RzCi0gICAgICAgIGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBs
ZSApIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gdHVwbGVbIDIgXSwKLSAgICAgICAgICAgICAg
ICBzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07Ci0KLSAgICAgICAgICAgIC8vIHByb21pc2VbIGRv
bmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkCi0gICAgICAgICAgICBwcm9taXNlWyB0
dXBsZVsxXSBdID0gbGlzdC5hZGQ7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSBzdGF0ZQotICAg
ICAgICAgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChm
dW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgPSBbIHJlc29sdmVkIHwg
cmVqZWN0ZWQgXQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RyaW5nOwotCi0g
ICAgICAgICAgICAgICAgLy8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7
IHByb2dyZXNzX2xpc3QubG9jawotICAgICAgICAgICAgICAgIH0sIHR1cGxlc1sgaSBeIDEgXVsg
MiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICAvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCi0gICAg
ICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAg
ICAgIGRlZmVycmVkWyB0dXBsZVswXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHBy
b21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsK
LSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIg
XSA9IGxpc3QuZmlyZVdpdGg7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGRl
ZmVycmVkIGEgcHJvbWlzZQotICAgICAgICBwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7Ci0K
LSAgICAgICAgLy8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueQotICAgICAgICBpZiAoIGZ1bmMgKSB7
Ci0gICAgICAgICAgICBmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gQWxsIGRvbmUhCi0gICAgICAgIHJldHVybiBkZWZlcnJlZDsKLSAgICB9
LAotCi0gICAgLy8gRGVmZXJyZWQgaGVscGVyCi0gICAgd2hlbjogZnVuY3Rpb24oIHN1Ym9yZGlu
YXRlIC8qICwgLi4uLCBzdWJvcmRpbmF0ZU4gKi8gKSB7Ci0gICAgICAgIHZhciBpID0gMCwKLSAg
ICAgICAgICAgIHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAg
ICAgICAgIGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLAotCi0gICAgICAgICAgICAvLyB0
aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCi0gICAgICAgICAgICByZW1haW5p
bmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbigg
c3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLAotCi0gICAgICAgICAgICAvLyB0
aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNp
bmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC4KLSAgICAgICAgICAgIGRlZmVycmVkID0gcmVt
YWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKLQotICAgICAg
ICAgICAgLy8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZh
bHVlcwotICAgICAgICAgICAgdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFs
dWVzICkgewotICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRleHRzWyBpIF0gPSB0aGlzOwotICAgICAgICAgICAgICAgICAg
ICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1l
bnRzICkgOiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZXMgPT09IHByb2dy
ZXNzVmFsdWVzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0
aCggY29udGV4dHMsIHZhbHVlcyApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAh
KCAtLXJlbWFpbmluZyApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVz
b2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9LAotCi0gICAgICAgICAgICBwcm9ncmVzc1Zh
bHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzOwotCi0gICAgICAgIC8vIGFk
ZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVz
b2x2ZWQKLSAgICAgICAgaWYgKCBsZW5ndGggPiAxICkgewotICAgICAgICAgICAgcHJvZ3Jlc3NW
YWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwotICAgICAgICAgICAgcHJvZ3Jlc3NDb250ZXh0
cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7Ci0gICAgICAgICAgICByZXNvbHZlQ29udGV4dHMgPSBu
ZXcgQXJyYXkoIGxlbmd0aCApOwotICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysg
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5Lmlz
RnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKCkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMg
KSApCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3ND
b250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIG9u
IGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXIKLSAgICAgICAgaWYgKCAhcmVtYWluaW5nICkg
ewotICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVz
b2x2ZVZhbHVlcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21p
c2UoKTsKLSAgICB9Ci19KTsKLQotCi0vLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHkK
LXZhciByZWFkeUxpc3Q7Ci0KLWpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHsKLSAg
ICAvLyBBZGQgdGhlIGNhbGxiYWNrCi0gICAgalF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBm
biApOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICAvLyBJ
cyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgot
ICAgIGlzUmVhZHk6IGZhbHNlLAotCi0gICAgLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55
IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQotICAgIC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4g
U2VlICM2NzgxCi0gICAgcmVhZHlXYWl0OiAxLAotCi0gICAgLy8gSG9sZCAob3IgcmVsZWFzZSkg
dGhlIHJlYWR5IGV2ZW50Ci0gICAgaG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHsKLSAgICAg
ICAgaWYgKCBob2xkICkgewotICAgICAgICAgICAgalF1ZXJ5LnJlYWR5V2FpdCsrOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgalF1ZXJ5LnJlYWR5KCB0cnVlICk7Ci0gICAgICAgIH0K
LSAgICB9LAotCi0gICAgLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQotICAgIHJlYWR5
OiBmdW5jdGlvbiggd2FpdCApIHsKLQotICAgICAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVu
ZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5Ci0gICAgICAgIGlmICggd2FpdCA9PT0g
dHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkgewotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCB0aGUgRE9N
IGlzIHJlYWR5Ci0gICAgICAgIGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKLQotICAgICAgICAvLyBJ
ZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYg
bmVlZCBiZQotICAgICAgICBpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0
ID4gMCApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElm
IHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGUKLSAgICAgICAgcmVhZHlMaXN0
LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOwotCi0gICAgICAgIC8vIFRyaWdn
ZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwotICAgICAgICBpZiAoIGpRdWVyeS5mbi50cmlnZ2Vy
ICkgewotICAgICAgICAgICAgalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoInJlYWR5Iikub2Zm
KCJyZWFkeSIpOwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLS8qKgotICogVGhlIHJlYWR5IGV2
ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2QKLSAqLwotZnVuY3Rpb24gY29tcGxl
dGVkKCkgewotICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9h
ZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwotICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVy
KCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKLSAgICBqUXVlcnkucmVhZHkoKTsKLX0KLQot
alF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkgewotICAgIGlmICggIXJlYWR5
TGlzdCApIHsKLQotICAgICAgICByZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTsKLQotICAg
ICAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBh
ZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLSAgICAgICAgLy8g
d2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSAiaW50ZXJhY3RpdmUiIGhlcmUsIGJ1dCBp
dCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZQotICAgICAgICAvLyBkaXNjb3ZlcmVkIGJ5IENo
cmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1
Ci0gICAgICAgIGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKLSAg
ICAgICAgICAgIC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRo
ZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQotICAgICAgICAgICAgc2V0VGltZW91dCggalF1
ZXJ5LnJlYWR5ICk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gVXNlIHRo
ZSBoYW5keSBldmVudCBjYWxsYmFjawotICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0
ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7Ci0KLSAgICAgICAg
ICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3Jr
Ci0gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQs
IGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNl
KCBvYmogKTsKLX07Ci0KLS8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0
aGUgdXNlciBkb2VzIG5vdAotalF1ZXJ5LnJlYWR5LnByb21pc2UoKTsKLQotCi0KLQotLy8gTXVs
dGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9u
Ci0vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVu
Y3Rpb24KLXZhciBhY2Nlc3MgPSBqUXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwg
a2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewotICAgIHZhciBpID0gMCwK
LSAgICAgICAgbGVuID0gZWxlbXMubGVuZ3RoLAotICAgICAgICBidWxrID0ga2V5ID09IG51bGw7
Ci0KLSAgICAvLyBTZXRzIG1hbnkgdmFsdWVzCi0gICAgaWYgKCBqUXVlcnkudHlwZSgga2V5ICkg
PT09ICJvYmplY3QiICkgewotICAgICAgICBjaGFpbmFibGUgPSB0cnVlOwotICAgICAgICBmb3Ig
KCBpIGluIGtleSApIHsKLSAgICAgICAgICAgIGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwg
a2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7Ci0gICAgICAgIH0KLQotICAgIC8vIFNldHMg
b25lIHZhbHVlCi0gICAgfSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKLSAgICAg
ICAgY2hhaW5hYmxlID0gdHJ1ZTsKLQotICAgICAgICBpZiAoICFqUXVlcnkuaXNGdW5jdGlvbigg
dmFsdWUgKSApIHsKLSAgICAgICAgICAgIHJhdyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoIGJ1bGsgKSB7Ci0gICAgICAgICAgICAvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWlu
c3QgdGhlIGVudGlyZSBzZXQKLSAgICAgICAgICAgIGlmICggcmF3ICkgewotICAgICAgICAgICAg
ICAgIGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIGZuID0gbnVsbDsK
LQotICAgICAgICAgICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVl
cwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWxrID0gZm47Ci0gICAg
ICAgICAgICAgICAgZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7Ci0g
ICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICggZm4gKSB7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAg
ICAgICAgICBmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVt
c1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hhaW5hYmxlID8KLSAgICAgICAgZWxlbXMgOgotCi0g
ICAgICAgIC8vIEdldHMKLSAgICAgICAgYnVsayA/Ci0gICAgICAgICAgICBmbi5jYWxsKCBlbGVt
cyApIDoKLSAgICAgICAgICAgIGxlbiA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDsK
LX07Ci0KLQotLyoqCi0gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IGNhbiBoYXZlIGRh
dGEKLSAqLwotalF1ZXJ5LmFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7Ci0gICAgLy8g
QWNjZXB0cyBvbmx5OgotICAgIC8vICAtIE5vZGUKLSAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9O
T0RFCi0gICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREUKLSAgICAvLyAgLSBPYmplY3QKLSAg
ICAvLyAgICAtIEFueQotICAgIC8qIGpzaGludCAtVzAxOCAqLwotICAgIHJldHVybiBvd25lci5u
b2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5
cGUgKTsKLX07Ci0KLQotZnVuY3Rpb24gRGF0YSgpIHsKLSAgICAvLyBTdXBwb3J0OiBBbmRyb2lk
IDwgNCwKLSAgICAvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRl
bnNpb25zL2ZyZWV6ZSBtZXRob2QsCi0gICAgLy8gcmV0dXJuIG5ldyBlbXB0eSBvYmplY3QgaW5z
dGVhZCB3aXRoIG5vIFtbc2V0XV0gYWNjZXNzb3IKLSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHko
IHRoaXMuY2FjaGUgPSB7fSwgMCwgewotICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewotICAgICAg
ICAgICAgcmV0dXJuIHt9OwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0aGlzLmV4cGFuZG8g
PSBqUXVlcnkuZXhwYW5kbyArIE1hdGgucmFuZG9tKCk7Ci19Ci0KLURhdGEudWlkID0gMTsKLURh
dGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhOwotCi1EYXRhLnByb3RvdHlwZSA9IHsKLSAg
ICBrZXk6IGZ1bmN0aW9uKCBvd25lciApIHsKLSAgICAgICAgLy8gV2UgY2FuIGFjY2VwdCBkYXRh
IGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCi0gICAgICAgIC8vIGJ1
dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCi0gICAgICAgIC8vIEFsd2F5cyByZXR1cm4gdGhl
IGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LgotICAgICAgICBpZiAoICFEYXRhLmFjY2VwdHMoIG93
bmVyICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZh
ciBkZXNjcmlwdG9yID0ge30sCi0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3duZXIgb2Jq
ZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5Ci0gICAgICAgICAgICB1bmxvY2sgPSBvd25lclsg
dGhpcy5leHBhbmRvIF07Ci0KLSAgICAgICAgLy8gSWYgbm90LCBjcmVhdGUgb25lCi0gICAgICAg
IGlmICggIXVubG9jayApIHsKLSAgICAgICAgICAgIHVubG9jayA9IERhdGEudWlkKys7Ci0KLSAg
ICAgICAgICAgIC8vIFNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUg
cHJvcGVydHkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvclsg
dGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTsKLSAgICAgICAgICAgICAgICBPYmpl
Y3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTsKLQotICAgICAgICAgICAg
Ly8gU3VwcG9ydDogQW5kcm9pZCA8IDQKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGEgbGVz
cyBzZWN1cmUgZGVmaW5pdGlvbgotICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7Ci0gICAgICAg
ICAgICAgICAgZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7Ci0gICAgICAgICAg
ICAgICAgalF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuc3VyZSB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAg
IGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkgewotICAgICAgICAgICAgdGhpcy5jYWNoZVsg
dW5sb2NrIF0gPSB7fTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1bmxvY2s7Ci0gICAg
fSwKLSAgICBzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7Ci0gICAgICAgIHZh
ciBwcm9wLAotICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0
byB0aGlzIG5vZGUsCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhp
cyAib3duZXIiLCBjcmVhdGUgb25lIGlubGluZQotICAgICAgICAgICAgLy8gYW5kIHNldCB0aGUg
dW5sb2NrIGFzIHRob3VnaCBhbiBvd25lciBlbnRyeSBoYWQgYWx3YXlzIGV4aXN0ZWQKLSAgICAg
ICAgICAgIHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLAotICAgICAgICAgICAgY2FjaGUgPSB0
aGlzLmNhY2hlWyB1bmxvY2sgXTsKLQotICAgICAgICAvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwg
dmFsdWUgXSBhcmdzCi0gICAgICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewot
ICAgICAgICAgICAgY2FjaGVbIGRhdGEgXSA9IHZhbHVlOwotCi0gICAgICAgIC8vIEhhbmRsZTog
WyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkCi0g
ICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkgewotICAgICAg
ICAgICAgICAgIGpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7Ci0g
ICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0
byB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IGZvciAoIHByb3AgaW4gZGF0YSApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVbIHByb3Ag
XSA9IGRhdGFbIHByb3AgXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlOwotICAgIH0sCi0gICAgZ2V0OiBmdW5jdGlvbigg
b3duZXIsIGtleSApIHsKLSAgICAgICAgLy8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQs
IG9yIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0
ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsCi0gICAgICAgIC8vIGFsbG93aW5nIGRpcmVjdCBh
Y2Nlc3MgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgICAgLy8gZW1wdHkgZGF0YSBvYmplY3Qu
IEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuCi0gICAgICAgIHZhciBjYWNo
ZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07Ci0KLSAgICAgICAgcmV0dXJuIGtl
eSA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgIGNhY2hlIDogY2FjaGVbIGtleSBdOwotICAg
IH0sCi0gICAgYWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7Ci0gICAgICAg
IHZhciBzdG9yZWQ7Ci0gICAgICAgIC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjoKLSAgICAgICAg
Ly8KLSAgICAgICAgLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAotICAgICAgICAvLyAgIDIu
IEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWQKLSAgICAg
ICAgLy8KLSAgICAgICAgLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQg
bWV0aG9kIHRvIGRldGVybWluZQotICAgICAgICAvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJl
c3BlY3RpdmVseSBlaXRoZXI6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vICAgMS4gVGhlIGVudGly
ZSBjYWNoZSBvYmplY3QKLSAgICAgICAgLy8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtl
eQotICAgICAgICAvLwotICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8Ci0gICAgICAg
ICAgICAgICAgKChrZXkgJiYgdHlwZW9mIGtleSA9PT0gInN0cmluZyIpICYmIHZhbHVlID09PSB1
bmRlZmluZWQpICkgewotCi0gICAgICAgICAgICBzdG9yZWQgPSB0aGlzLmdldCggb3duZXIsIGtl
eSApOwotCi0gICAgICAgICAgICByZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQgPwotICAgICAg
ICAgICAgICAgIHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkp
ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3Ry
aW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQotICAgICAgICAvLyBhcmUgc3BlY2lmaWVkLCBz
ZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjoKLSAgICAgICAgLy8K
LSAgICAgICAgLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwotICAgICAgICAvLyAgIDIu
IEEga2V5IGFuZCB2YWx1ZQotICAgICAgICAvLwotICAgICAgICB0aGlzLnNldCggb3duZXIsIGtl
eSwgdmFsdWUgKTsKLQotICAgICAgICAvLyBTaW5jZSB0aGUgInNldCIgcGF0aCBjYW4gaGF2ZSB0
d28gcG9zc2libGUgZW50cnkgcG9pbnRzCi0gICAgICAgIC8vIHJldHVybiB0aGUgZXhwZWN0ZWQg
ZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQotICAgICAgICByZXR1cm4gdmFs
dWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5OwotICAgIH0sCi0gICAgcmVtb3ZlOiBmdW5j
dGlvbiggb3duZXIsIGtleSApIHsKLSAgICAgICAgdmFyIGksIG5hbWUsIGNhbWVsLAotICAgICAg
ICAgICAgdW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksCi0gICAgICAgICAgICBjYWNoZSA9IHRo
aXMuY2FjaGVbIHVubG9jayBdOwotCi0gICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICB0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9OwotCi0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJp
bmcgb2Yga2V5cwotICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMuLi4KLSAgICAg
ICAgICAgICAgICAvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIs
ICJ2YWwiKSBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZl
cnRlZCB0byBjYW1lbENhc2UuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8g
d2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKLSAgICAgICAgICAgICAg
ICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2Ci0gICAgICAgICAg
ICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGgu
Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1l
bENhc2UgKSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYW1lbCA9
IGpRdWVyeS5jYW1lbENhc2UoIGtleSApOwotICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgc3Ry
aW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYg
KCBrZXkgaW4gY2FjaGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBbIGtleSwgY2Ft
ZWwgXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuCi0gICAgICAgICAgICAgICAg
ICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNw
YWNlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjYW1lbDsKLSAgICAgICAgICAgICAgICAg
ICAgbmFtZSA9IG5hbWUgaW4gY2FjaGUgPwotICAgICAgICAgICAgICAgICAgICAgICAgWyBuYW1l
IF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpID0gbmFtZS5sZW5ndGg7Ci0gICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbIG5hbWVb
IGkgXSBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICBoYXNEYXRhOiBm
dW5jdGlvbiggb3duZXIgKSB7Ci0gICAgICAgIHJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3Qo
Ci0gICAgICAgICAgICB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fQot
ICAgICAgICApOwotICAgIH0sCi0gICAgZGlzY2FyZDogZnVuY3Rpb24oIG93bmVyICkgewotICAg
ICAgICBpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0
aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTsKLSAgICAgICAgfQotICAgIH0KLX07
Ci12YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTsKLQotdmFyIGRhdGFfdXNlciA9IG5ldyBEYXRh
KCk7Ci0KLQotCi0vKgotICAgIEltcGxlbWVudGF0aW9uIFN1bW1hcnkKLQotICAgIDEuIEVuZm9y
Y2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFu
Y2gKLSAgICAyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNp
bmcgdGhlIHN0b3JhZ2UKLSAgICAgICAgcGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLgotICAg
IDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgInByaXZhdGUiIGFu
ZCAidXNlciIgZGF0YS4KLSAgICA0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1
c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQotICAgIDUuIEF2b2lkIGV4
cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5k
byBwcm9wZXJ0aWVzKQotICAgIDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRh
dGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNAotKi8KLXZhciByYnJhY2UgPSAvXig/Olx7
W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAotICAgIHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOwot
Ci1mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewotICAgIHZhciBuYW1lOwot
Ci0gICAgLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFu
eQotICAgIC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQotICAgIGlmICgg
ZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgIG5h
bWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNh
c2UoKTsKLSAgICAgICAgZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7Ci0KLSAgICAg
ICAgaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICB0cnkgewot
ICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKLSAgICAgICAg
ICAgICAgICAgICAgZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAg
ICAgZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkg
Y29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCi0gICAg
ICAgICAgICAgICAgICAgICtkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6Ci0gICAgICAgICAg
ICAgICAgICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkg
OgotICAgICAgICAgICAgICAgICAgICBkYXRhOwotICAgICAgICAgICAgfSBjYXRjaCggZSApIHt9
Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3Qg
Y2hhbmdlZCBsYXRlcgotICAgICAgICAgICAgZGF0YV91c2VyLnNldCggZWxlbSwga2V5LCBkYXRh
ICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhID0gdW5kZWZpbmVkOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotfQotCi1qUXVlcnkuZXh0ZW5kKHsKLSAg
ICBoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGRhdGFfdXNlci5o
YXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKTsKLSAgICB9LAotCi0g
ICAgZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7Ci0gICAgICAgIHJldHVybiBk
YXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7Ci0gICAgfSwKLQotICAgIHJlbW92
ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotICAgICAgICBkYXRhX3VzZXIucmVtb3Zl
KCBlbGVtLCBuYW1lICk7Ci0gICAgfSwKLQotICAgIC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxs
cyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkCi0gICAgLy8gd2l0
aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNh
dGVkLgotICAgIF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKLSAgICAgICAg
cmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKLSAgICB9LAotCi0g
ICAgX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotICAgICAgICBkYXRhX3By
aXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5mbi5leHRlbmQo
ewotICAgIGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewotICAgICAgICB2YXIgaSwgbmFt
ZSwgZGF0YSwKLSAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCi0gICAgICAgICAgICBhdHRy
cyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzOwotCi0gICAgICAgIC8vIEdldHMgYWxsIHZhbHVl
cwotICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgaWYgKCB0
aGlzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV91c2VyLmdldCggZWxl
bSApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRh
X3ByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiApICkgewotICAgICAgICAgICAgICAgICAg
ICBpID0gYXR0cnMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5h
bWUuc2xpY2UoNSkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXR0ciggZWxl
bSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LnNldCggZWxl
bSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8g
U2V0cyBtdWx0aXBsZSB2YWx1ZXMKLSAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0
IiApIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgZGF0YV91c2VyLnNldCggdGhpcywga2V5ICk7Ci0gICAgICAgICAgICB9KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSAp
IHsKLSAgICAgICAgICAgIHZhciBkYXRhLAotICAgICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1
ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVy
eSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5Ci0gICAgICAgICAgICAvLyAo
YW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRo
ZQotICAgICAgICAgICAgLy8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFu
IGVtcHR5IGpRdWVyeSBvYmplY3QKLSAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRl
ZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKLSAgICAgICAgICAgIC8vIHRo
cm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1h
ZGUuCi0gICAgICAgICAgICBpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKLSAg
ICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCi0gICAg
ICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGFzLWlzCi0gICAgICAgICAgICAgICAgZGF0YSA9
IGRhdGFfdXNlci5nZXQoIGVsZW0sIGtleSApOwotICAgICAgICAgICAgICAgIGlmICggZGF0YSAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAg
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZy
b20gdGhlIGNhY2hlCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAot
ICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApOwot
ICAgICAgICAgICAgICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg
ICAvLyBBdHRlbXB0IHRvICJkaXNjb3ZlciIgdGhlIGRhdGEgaW4KLSAgICAgICAgICAgICAgICAv
LyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFB
dHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBk
YXRhICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwot
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHJlYWxseSBo
YXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC4KLSAgICAgICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgZGF0YS4uLgotICAgICAg
ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBh
dHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55Ci0gICAgICAgICAgICAg
ICAgLy8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJlZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5
LgotICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxL
ZXkgKTsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGlu
dGVyb3AsIHdlIGhhdmUgdG8KLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBwcm9wZXJ0eSBuYW1l
cyB3aXRoIGRhc2hlcyBpbiBhIGNhbWVsQ2FzZSBmb3JtLgotICAgICAgICAgICAgICAgIC8vIFRo
aXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKgotICAgICAgICAgICAgICAg
IGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApOwotCi0gICAgICAgICAgICAg
ICAgLy8gKi4uLiBJbiB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5
XwotICAgICAgICAgICAgICAgIC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUg
YSBjb3B5IG9mIHRoYXQKLSAgICAgICAgICAgICAgICAvLyB1bmNoYW5nZWQgcHJvcGVydHkuCi0g
ICAgICAgICAgICAgICAgaWYgKCBrZXkuaW5kZXhPZigiLSIpICE9PSAtMSAmJiBkYXRhICE9PSB1
bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFfdXNlci5zZXQoIHRoaXMsIGtl
eSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAg
fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7Ci0gICAg
fSwKLQotICAgIHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7Ci0gICAgICAgIHJldHVybiB0
aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBkYXRhX3VzZXIucmVtb3ZlKCB0aGlz
LCBrZXkgKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0g
ICAgcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewotICAgICAgICB2YXIgcXVl
dWU7Ci0KLSAgICAgICAgaWYgKCBlbGVtICkgewotICAgICAgICAgICAgdHlwZSA9ICggdHlwZSB8
fCAiZngiICkgKyAicXVldWUiOwotICAgICAgICAgICAgcXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBl
bGVtLCB0eXBlICk7Ci0KLSAgICAgICAgICAgIC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGlu
ZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKLSAgICAgICAgICAgIGlmICgg
ZGF0YSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSgg
ZGF0YSApICkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3Mo
IGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsKLSAgICAgICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKCBkYXRhICk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHF1ZXVlIHx8IFtd
OwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBl
ICkgewotICAgICAgICB0eXBlID0gdHlwZSB8fCAiZngiOwotCi0gICAgICAgIHZhciBxdWV1ZSA9
IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAotICAgICAgICAgICAgc3RhcnRMZW5ndGggPSBx
dWV1ZS5sZW5ndGgsCi0gICAgICAgICAgICBmbiA9IHF1ZXVlLnNoaWZ0KCksCi0gICAgICAgICAg
ICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLAotICAgICAgICAgICAg
bmV4dCA9IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5kZXF1ZXVlKCBlbGVt
LCB0eXBlICk7Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIElmIHRoZSBmeCBxdWV1ZSBp
cyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKLSAgICAgICAg
aWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgewotICAgICAgICAgICAgZm4gPSBxdWV1ZS5zaGlm
dCgpOwotICAgICAgICAgICAgc3RhcnRMZW5ndGgtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICggZm4gKSB7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHBy
ZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcKLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2Fs
bHkgZGVxdWV1ZWQKLSAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ4IiApIHsKLSAgICAgICAg
ICAgICAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gY2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvbgotICAg
ICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Ci0gICAgICAgICAgICBmbi5jYWxsKCBlbGVtLCBu
ZXh0LCBob29rcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhc3RhcnRMZW5ndGggJiYg
aG9va3MgKSB7Ci0gICAgICAgICAgICBob29rcy5lbXB0eS5maXJlKCk7Ci0gICAgICAgIH0KLSAg
ICB9LAotCi0gICAgLy8gbm90IGludGVuZGVkIGZvciBwdWJsaWMgY29uc3VtcHRpb24gLSBnZW5l
cmF0ZXMgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJucyB0aGUgY3VycmVudCBvbmUKLSAg
ICBfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7Ci0gICAgICAgIHZhciBrZXkg
PSB0eXBlICsgInF1ZXVlSG9va3MiOwotICAgICAgICByZXR1cm4gZGF0YV9wcml2LmdldCggZWxl
bSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2VzcyggZWxlbSwga2V5LCB7Ci0gICAgICAgICAgICBl
bXB0eTogalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKSB7Ci0g
ICAgICAgICAgICAgICAgZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgInF1ZXVlIiwg
a2V5IF0gKTsKLSAgICAgICAgICAgIH0pCi0gICAgICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVl
cnkuZm4uZXh0ZW5kKHsKLSAgICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0gICAg
ICAgIHZhciBzZXR0ZXIgPSAyOwotCi0gICAgICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgZGF0YSA9IHR5cGU7Ci0gICAgICAgICAgICB0eXBlID0gImZ4
IjsKLSAgICAgICAgICAgIHNldHRlci0tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBhcmd1
bWVudHMubGVuZ3RoIDwgc2V0dGVyICkgewotICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5xdWV1
ZSggdGhpc1swXSwgdHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGEgPT09
IHVuZGVmaW5lZCA/Ci0gICAgICAgICAgICB0aGlzIDoKLSAgICAgICAgICAgIHRoaXMuZWFjaChm
dW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRo
aXMsIHR5cGUsIGRhdGEgKTsKLQotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZv
ciB0aGlzIHF1ZXVlCi0gICAgICAgICAgICAgICAgalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0
eXBlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0g
IT09ICJpbnByb2dyZXNzIiApIHsKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUo
IHRoaXMsIHR5cGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICB9
LAotICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewotICAgICAgICByZXR1cm4gdGhpcy5l
YWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUg
KTsKLSAgICAgICAgfSk7Ci0gICAgfSwKLSAgICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSAp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKLSAgICB9
LAotICAgIC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWlu
IHR5cGUKLSAgICAvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKLSAg
ICBwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkgewotICAgICAgICB2YXIgdG1wLAotICAg
ICAgICAgICAgY291bnQgPSAxLAotICAgICAgICAgICAgZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQo
KSwKLSAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcywKLSAgICAgICAgICAgIGkgPSB0aGlzLmxl
bmd0aCwKLSAgICAgICAgICAgIHJlc29sdmUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoICEoIC0tY291bnQgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2
ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9OwotCi0gICAgICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewot
ICAgICAgICAgICAgb2JqID0gdHlwZTsKLSAgICAgICAgICAgIHR5cGUgPSB1bmRlZmluZWQ7Ci0g
ICAgICAgIH0KLSAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQotICAgICAgICB3aGlsZSAo
IGktLSApIHsKLSAgICAgICAgICAgIHRtcCA9IGRhdGFfcHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0s
IHR5cGUgKyAicXVldWVIb29rcyIgKTsKLSAgICAgICAgICAgIGlmICggdG1wICYmIHRtcC5lbXB0
eSApIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIHRtcC5lbXB0
eS5hZGQoIHJlc29sdmUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXNv
bHZlKCk7Ci0gICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTsKLSAgICB9Ci19KTsK
LXZhciBwbnVtID0gKC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8pLnNvdXJj
ZTsKLQotdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIg
XTsKLQotdmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkgewotICAgICAgICAvLyBp
c0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwotICAg
ICAgICAvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnQKLSAg
ICAgICAgZWxlbSA9IGVsIHx8IGVsZW07Ci0gICAgICAgIHJldHVybiBqUXVlcnkuY3NzKCBlbGVt
LCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJE
b2N1bWVudCwgZWxlbSApOwotICAgIH07Ci0KLXZhciByY2hlY2thYmxlVHlwZSA9ICgvXig/OmNo
ZWNrYm94fHJhZGlvKSQvaSk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGZyYWdtZW50
ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAotICAgICAgICBkaXYgPSBmcmFn
bWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApOwotCi0g
ICAgLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIg
dGhlIGNoZWNrZWQgYXR0cmlidXRlCi0gICAgZGl2LmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0n
cmFkaW8nIGNoZWNrZWQ9J2NoZWNrZWQnIG5hbWU9J3QnLz4iOwotCi0gICAgLy8gU3VwcG9ydDog
U2FmYXJpIDUuMSwgaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCi0gICAgLy8gb2xk
IFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50
cwotICAgIHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5v
ZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDsKLQotICAgIC8vIE1ha2Ugc3VyZSB0ZXh0YXJl
YSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkCi0gICAgLy8g
U3VwcG9ydDogSUU5LUlFMTErCi0gICAgZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4
dGFyZWE+IjsKLSAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0
cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsKLX0pKCk7Ci12YXIgc3RydW5kZWZpbmVkID0g
dHlwZW9mIHVuZGVmaW5lZDsKLQotCi0KLXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSAib25mb2N1
c2luIiBpbiB3aW5kb3c7Ci0KLQotdmFyCi0gICAgcmtleUV2ZW50ID0gL15rZXkvLAotICAgIHJt
b3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLAotICAgIHJmb2N1c01v
cnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAotICAgIHJ0eXBlbmFtZXNw
YWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsKLQotZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHsKLSAgICB0cnkg
ewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKLSAgICB9IGNhdGNoICgg
ZXJyICkgeyB9Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVu
dHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuCi0gKiBQcm9wcyB0byBEZWFu
IEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgotICovCi1q
UXVlcnkuZXZlbnQgPSB7Ci0KLSAgICBnbG9iYWw6IHt9LAotCi0gICAgYWRkOiBmdW5jdGlvbigg
ZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewotCi0gICAgICAgIHZhciBo
YW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCwKLSAgICAgICAgICAgIGV2ZW50cywgdCwgaGFu
ZGxlT2JqLAotICAgICAgICAgICAgc3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMs
IG9yaWdUeXBlLAotICAgICAgICAgICAgZWxlbURhdGEgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7
Ci0KLSAgICAgICAgLy8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21t
ZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cykKLSAgICAgICAgaWYgKCAhZWxlbURh
dGEgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxs
ZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhh
bmRsZXIKLSAgICAgICAgaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7Ci0gICAgICAgICAgICBoYW5k
bGVPYmpJbiA9IGhhbmRsZXI7Ci0gICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFu
ZGxlcjsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlx
dWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKLSAgICAgICAgaWYgKCAhaGFuZGxl
ci5ndWlkICkgewotICAgICAgICAgICAgaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUg
YW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3QKLSAgICAgICAgaWYgKCAhKGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0gICAgICAgICAgICBldmVudHMgPSBlbGVtRGF0
YS5ldmVudHMgPSB7fTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICEoZXZlbnRIYW5kbGUgPSBl
bGVtRGF0YS5oYW5kbGUpICkgewotICAgICAgICAgICAgZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5o
YW5kbGUgPSBmdW5jdGlvbiggZSApIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIHRoZSBz
ZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAotICAgICAgICAgICAg
ICAgIC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQK
LSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYm
IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/Ci0gICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmlu
ZWQ7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG11bHRp
cGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQotICAgICAgICB0eXBlcyA9ICggdHlwZXMg
fHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwotICAgICAgICB0ID0gdHlwZXMu
bGVuZ3RoOwotICAgICAgICB3aGlsZSAoIHQtLSApIHsKLSAgICAgICAgICAgIHRtcCA9IHJ0eXBl
bmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107Ci0gICAgICAgICAgICB0eXBlID0gb3Jp
Z1R5cGUgPSB0bXBbMV07Ci0gICAgICAgICAgICBuYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIg
KS5zcGxpdCggIi4iICkuc29ydCgpOwotCi0gICAgICAgICAgICAvLyBUaGVyZSAqbXVzdCogYmUg
YSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnMKLSAgICAgICAgICAg
IGlmICggIXR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3Bl
Y2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZQotICAgICAgICAgICAgc3Bl
Y2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0KLSAgICAgICAgICAg
IC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBl
LCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQotICAgICAgICAgICAgdHlwZSA9ICggc2VsZWN0b3IgPyBz
cGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwotCi0gICAg
ICAgICAgICAvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlCi0gICAg
ICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQot
ICAgICAgICAgICAgLy8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMK
LSAgICAgICAgICAgIGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoewotICAgICAgICAgICAgICAg
IHR5cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAgb3JpZ1R5cGU6IG9yaWdUeXBlLAotICAgICAg
ICAgICAgICAgIGRhdGE6IGRhdGEsCi0gICAgICAgICAgICAgICAgaGFuZGxlcjogaGFuZGxlciwK
LSAgICAgICAgICAgICAgICBndWlkOiBoYW5kbGVyLmd1aWQsCi0gICAgICAgICAgICAgICAgc2Vs
ZWN0b3I6IHNlbGVjdG9yLAotICAgICAgICAgICAgICAgIG5lZWRzQ29udGV4dDogc2VsZWN0b3Ig
JiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksCi0gICAg
ICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIi4iKQotICAgICAgICAgICAg
fSwgaGFuZGxlT2JqSW4gKTsKLQotICAgICAgICAgICAgLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxl
ciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKLSAgICAgICAgICAgIGlmICggIShoYW5kbGVycyA9
IGV2ZW50c1sgdHlwZSBdKSApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sg
dHlwZSBdID0gW107Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7
Ci0KLSAgICAgICAgICAgICAgICAvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBz
cGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKLSAgICAgICAgICAgICAgICBpZiAo
ICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNw
YWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxl
bS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSwgZmFsc2UgKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKLSAgICAgICAgICAgICAgICBzcGVjaWFsLmFkZC5j
YWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLQotICAgICAgICAgICAgICAgIGlmICggIWhhbmRsZU9i
ai5oYW5kbGVyLmd1aWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9iai5oYW5kbGVy
Lmd1aWQgPSBoYW5kbGVyLmd1aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVn
YXRlcyBpbiBmcm9udAotICAgICAgICAgICAgaWYgKCBzZWxlY3RvciApIHsKLSAgICAgICAgICAg
ICAgICBoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxl
T2JqICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1
c2goIGhhbmRsZU9iaiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBLZWVwIHRy
YWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1p
emF0aW9uCi0gICAgICAgICAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwot
ICAgICAgICB9Ci0KLSAgICB9LAotCi0gICAgLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBl
dmVudHMgZnJvbSBhbiBlbGVtZW50Ci0gICAgcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMs
IGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHsKLQotICAgICAgICB2YXIgaiwgb3Jp
Z0NvdW50LCB0bXAsCi0gICAgICAgICAgICBldmVudHMsIHQsIGhhbmRsZU9iaiwKLSAgICAgICAg
ICAgIHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKLSAgICAg
ICAgICAgIGVsZW1EYXRhID0gZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYu
Z2V0KCBlbGVtICk7Ci0KLSAgICAgICAgaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVt
RGF0YS5ldmVudHMpICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUg
b21pdHRlZAotICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRl
ICkgfHwgWyAiIiBdOwotICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAo
IHQtLSApIHsKLSAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3Rd
ICkgfHwgW107Ci0gICAgICAgICAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07Ci0gICAgICAg
ICAgICBuYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwot
Ci0gICAgICAgICAgICAvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlm
IHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgIGlmICggIXR5cGUgKSB7Ci0g
ICAgICAgICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVy
LCBzZWxlY3RvciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVyeS5l
dmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0gICAgICAgICAgICB0eXBlID0gKCBzZWxlY3Rv
ciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7Ci0g
ICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwotICAgICAgICAgICAg
dG1wID0gdG1wWzJdICYmIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigi
XFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBt
YXRjaGluZyBldmVudHMKLSAgICAgICAgICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5n
dGg7Ci0gICAgICAgICAgICB3aGlsZSAoIGotLSApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVP
YmogPSBoYW5kbGVyc1sgaiBdOwotCi0gICAgICAgICAgICAgICAgaWYgKCAoIG1hcHBlZFR5cGVz
IHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgotICAgICAgICAgICAgICAg
ICAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgot
ICAgICAgICAgICAgICAgICAgICAoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3Bh
Y2UgKSApICYmCi0gICAgICAgICAgICAgICAgICAgICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09
PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNl
bGVjdG9yICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZSggaiwgMSAp
OwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3BlY2lhbC5yZW1vdmUgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5k
bGVPYmogKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBp
ZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAotICAgICAg
ICAgICAgLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyBy
ZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCi0gICAgICAgICAgICBpZiAoIG9yaWdD
b3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIGlmICggIXNwZWNp
YWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBl
bGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7Ci0gICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0
J3Mgbm8gbG9uZ2VyIHVzZWQKLSAgICAgICAgaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZl
bnRzICkgKSB7Ci0gICAgICAgICAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxlOwotICAgICAgICAg
ICAgZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgImV2ZW50cyIgKTsKLSAgICAgICAgfQotICAgIH0s
Ci0KLSAgICB0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVy
cyApIHsKLQotICAgICAgICB2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFu
ZGxlLCBzcGVjaWFsLAotICAgICAgICAgICAgZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50
IF0sCi0gICAgICAgICAgICB0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2
ZW50LnR5cGUgOiBldmVudCwKLSAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCgg
ZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOwot
Ci0gICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwotCi0gICAgICAg
IC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCi0gICAgICAgIGlm
ICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9jdXMvYmx1ciBtb3JwaHMg
dG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93Ci0g
ICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2Vy
ZWQgKSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgg
dHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKLSAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgdHJp
Z2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKCkKLSAg
ICAgICAgICAgIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7Ci0gICAgICAgICAgICB0eXBl
ID0gbmFtZXNwYWNlcy5zaGlmdCgpOwotICAgICAgICAgICAgbmFtZXNwYWNlcy5zb3J0KCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwICYmICJvbiIg
KyB0eXBlOwotCi0gICAgICAgIC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBv
YmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZwotICAgICAgICBldmVu
dCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KLSAgICAgICAgICAgIGV2ZW50IDoKLSAgICAg
ICAgICAgIG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIg
JiYgZXZlbnQgKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZl
IGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCi0gICAgICAgIGV2ZW50Lmlz
VHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzOwotICAgICAgICBldmVudC5uYW1lc3BhY2Ug
PSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKLSAgICAgICAgZXZlbnQubmFtZXNwYWNlX3JlID0gZXZl
bnQubmFtZXNwYWNlID8KLSAgICAgICAgICAgIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVz
cGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgotICAgICAgICAgICAg
bnVsbDsKLQotICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWlu
ZyByZXVzZWQKLSAgICAgICAgZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwotICAgICAgICBpZiAo
ICFldmVudC50YXJnZXQgKSB7Ci0gICAgICAgICAgICBldmVudC50YXJnZXQgPSBlbGVtOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQg
dGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAotICAgICAgICBkYXRhID0g
ZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgIFsgZXZlbnQgXSA6Ci0gICAgICAgICAgICBqUXVl
cnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTsKLQotICAgICAgICAvLyBBbGxvdyBzcGVj
aWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzCi0gICAgICAgIHNwZWNpYWwgPSBq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwotICAgICAgICBpZiAoICFvbmx5SGFu
ZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwg
ZGF0YSApID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBl
ciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQotICAgICAgICAvLyBCdWJibGUgdXAgdG8gZG9jdW1l
bnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIg
KCM5NzI0KQotICAgICAgICBpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUg
JiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewotCi0gICAgICAgICAgICBidWJibGVUeXBl
ID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKLSAgICAgICAgICAgIGlmICggIXJmb2N1
c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7Ci0gICAgICAgICAgICAgICAgY3Vy
ID0gY3VyLnBhcmVudE5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKCA7IGN1
cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1
c2goIGN1ciApOwotICAgICAgICAgICAgICAgIHRtcCA9IGN1cjsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5n
Liwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCi0gICAgICAgICAgICBpZiAoIHRtcCA9
PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7Ci0gICAgICAgICAgICAgICAg
ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdp
bmRvdyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlyZSBoYW5k
bGVycyBvbiB0aGUgZXZlbnQgcGF0aAotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCAo
Y3VyID0gZXZlbnRQYXRoW2krK10pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkg
ewotCi0gICAgICAgICAgICBldmVudC50eXBlID0gaSA+IDEgPwotICAgICAgICAgICAgICAgIGJ1
YmJsZVR5cGUgOgotICAgICAgICAgICAgICAgIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKLQot
ICAgICAgICAgICAgLy8galF1ZXJ5IGhhbmRsZXIKLSAgICAgICAgICAgIGhhbmRsZSA9ICggZGF0
YV9wcml2LmdldCggY3VyLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRh
X3ByaXYuZ2V0KCBjdXIsICJoYW5kbGUiICk7Ci0gICAgICAgICAgICBpZiAoIGhhbmRsZSApIHsK
LSAgICAgICAgICAgICAgICBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBOYXRpdmUgaGFuZGxlcgotICAgICAgICAgICAgaGFuZGxlID0g
b250eXBlICYmIGN1clsgb250eXBlIF07Ci0gICAgICAgICAgICBpZiAoIGhhbmRsZSAmJiBoYW5k
bGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICkgewotICAgICAgICAgICAgICAg
IGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgICAgICBl
dmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBldmVudC50eXBlID0gdHlwZTsKLQotICAgICAgICAvLyBJZiBu
b2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93Ci0gICAgICAgIGlm
ICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7Ci0KLSAg
ICAgICAgICAgIGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBw
bHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiYKLSAgICAgICAgICAgICAg
ICBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewotCi0gICAgICAgICAgICAgICAgLy8gQ2Fs
bCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5h
bWUgYXMgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGRlZmF1bHQgYWN0
aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MCkK
LSAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsg
dHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewotCi0gICAgICAgICAgICAg
ICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0
cyBGT08oKSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gZWxlbVsgb250eXBlIF07
Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZl
bnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQotICAgICAgICAgICAgICAgICAg
ICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgZWxl
bVsgdHlwZSBdKCk7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQg
PSB1bmRlZmluZWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBldmVudC5yZXN1bHQ7Ci0gICAgfSwKLQotICAgIGRpc3BhdGNoOiBmdW5jdGlv
biggZXZlbnQgKSB7Ci0KLSAgICAgICAgLy8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBm
cm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0Ci0gICAgICAgIGV2ZW50ID0galF1ZXJ5LmV2ZW50
LmZpeCggZXZlbnQgKTsKLQotICAgICAgICB2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVP
YmosCi0gICAgICAgICAgICBoYW5kbGVyUXVldWUgPSBbXSwKLSAgICAgICAgICAgIGFyZ3MgPSBz
bGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAgICAgICAgIGhhbmRsZXJzID0gKCBkYXRhX3By
aXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKLSAg
ICAgICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8
IHt9OwotCi0gICAgICAgIC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhh
biB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50Ci0gICAgICAgIGFyZ3NbMF0gPSBldmVudDsK
LSAgICAgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOwotCi0gICAgICAgIC8vIENhbGwg
dGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWls
IGlmIGRlc2lyZWQKLSAgICAgICAgaWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwu
cHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKLSAg
ICAgICAgaGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2
ZW50LCBoYW5kbGVycyApOwotCi0gICAgICAgIC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkg
bWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCi0gICAgICAgIGkgPSAwOwot
ICAgICAgICB3aGlsZSAoIChtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSkgJiYgIWV2ZW50
LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7Ci0gICAgICAgICAgICBldmVudC5jdXJyZW50VGFy
Z2V0ID0gbWF0Y2hlZC5lbGVtOwotCi0gICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIHdo
aWxlICggKGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdKSAmJiAhZXZlbnQuaXNJ
bW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKLQotICAgICAgICAgICAgICAgIC8vIFRy
aWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IKLSAgICAg
ICAgICAgICAgICAvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0
aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS4KLSAg
ICAgICAgICAgICAgICBpZiAoICFldmVudC5uYW1lc3BhY2VfcmUgfHwgZXZlbnQubmFtZXNwYWNl
X3JlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKLQotICAgICAgICAgICAgICAgICAg
ICBldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50
LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICByZXQgPSAoIChq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8
fCBoYW5kbGVPYmouaGFuZGxlciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5
KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZXZlbnQucmVz
dWx0ID0gcmV0KSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZl
bnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5z
dG9wUHJvcGFnYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5
cGUKLSAgICAgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsKLSAgICAgICAgICAgIHNw
ZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7Ci0gICAgICAgIH0KLQotICAg
ICAgICByZXR1cm4gZXZlbnQucmVzdWx0OwotICAgIH0sCi0KLSAgICBoYW5kbGVyczogZnVuY3Rp
b24oIGV2ZW50LCBoYW5kbGVycyApIHsKLSAgICAgICAgdmFyIGksIG1hdGNoZXMsIHNlbCwgaGFu
ZGxlT2JqLAotICAgICAgICAgICAgaGFuZGxlclF1ZXVlID0gW10sCi0gICAgICAgICAgICBkZWxl
Z2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKLSAgICAgICAgICAgIGN1ciA9IGV2
ZW50LnRhcmdldDsKLQotICAgICAgICAvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzCi0gICAgICAg
IC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApCi0gICAgICAg
IC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKQotICAg
ICAgICBpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICghZXZlbnQuYnV0dG9u
IHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgewotCi0gICAgICAgICAgICBmb3IgKCA7IGN1
ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKLQotICAgICAgICAg
ICAgICAgIC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkx
MSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQotICAgICAgICAgICAgICAgIGlmICggY3VyLmRpc2Fi
bGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIG1hdGNoZXMgPSBbXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkg
PCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVP
YmogPSBoYW5kbGVyc1sgaSBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBj
b25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKQotICAgICAg
ICAgICAgICAgICAgICAgICAgc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwotCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmou
bmVlZHNDb250ZXh0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCBz
ZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPj0gMCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1h
dGNoZXNbIHNlbCBdICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVz
aCggaGFuZGxlT2JqICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRjaGVzLmxlbmd0aCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5k
bGVyczogbWF0Y2hlcyB9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgcmVtYWlu
aW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKLSAgICAgICAgaWYgKCBkZWxlZ2F0ZUNvdW50
IDwgaGFuZGxlcnMubGVuZ3RoICkgewotICAgICAgICAgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBl
bGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsK
LSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYW5kbGVyUXVldWU7Ci0gICAgfSwKLQotICAg
IC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3Vz
ZUV2ZW50Ci0gICAgcHJvcHM6ICJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3Vy
cmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJn
ZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksCi0KLSAgICBmaXhIb29rczoge30s
Ci0KLSAgICBrZXlIb29rczogewotICAgICAgICBwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtl
eUNvZGUiLnNwbGl0KCIgIiksCi0gICAgICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmln
aW5hbCApIHsKLQotICAgICAgICAgICAgLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCi0gICAg
ICAgICAgICBpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgZXZl
bnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUg
OiBvcmlnaW5hbC5rZXlDb2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4g
ZXZlbnQ7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgbW91c2VIb29rczogewotICAgICAgICBw
cm9wczogImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFn
ZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSwKLSAgICAgICAg
ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgewotICAgICAgICAgICAgdmFyIGV2
ZW50RG9jLCBkb2MsIGJvZHksCi0gICAgICAgICAgICAgICAgYnV0dG9uID0gb3JpZ2luYWwuYnV0
dG9uOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBj
bGllbnRYL1kgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwg
JiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGV2ZW50RG9j
ID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7Ci0gICAgICAgICAgICAg
ICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OwotICAgICAgICAgICAgICAgIGJvZHkg
PSBldmVudERvYy5ib2R5OwotCi0gICAgICAgICAgICAgICAgZXZlbnQucGFnZVggPSBvcmlnaW5h
bC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9s
bExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNs
aWVudExlZnQgfHwgMCApOwotICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwu
Y2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxU
b3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGll
bnRUb3AgIHx8IDAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHdoaWNo
IGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodAotICAgICAg
ICAgICAgLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQK
LSAgICAgICAgICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkg
ewotICAgICAgICAgICAgICAgIGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0
dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZp
eDogZnVuY3Rpb24oIGV2ZW50ICkgewotICAgICAgICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5k
byBdICkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxp
emUgc29tZSBwcm9wZXJ0aWVzCi0gICAgICAgIHZhciBpLCBwcm9wLCBjb3B5LAotICAgICAgICAg
ICAgdHlwZSA9IGV2ZW50LnR5cGUsCi0gICAgICAgICAgICBvcmlnaW5hbEV2ZW50ID0gZXZlbnQs
Ci0gICAgICAgICAgICBmaXhIb29rID0gdGhpcy5maXhIb29rc1sgdHlwZSBdOwotCi0gICAgICAg
IGlmICggIWZpeEhvb2sgKSB7Ci0gICAgICAgICAgICB0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBm
aXhIb29rID0KLSAgICAgICAgICAgICAgICBybW91c2VFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlz
Lm1vdXNlSG9va3MgOgotICAgICAgICAgICAgICAgIHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0
aGlzLmtleUhvb2tzIDoKLSAgICAgICAgICAgICAgICB7fTsKLSAgICAgICAgfQotICAgICAgICBj
b3B5ID0gZml4SG9vay5wcm9wcyA/IHRoaXMucHJvcHMuY29uY2F0KCBmaXhIb29rLnByb3BzICkg
OiB0aGlzLnByb3BzOwotCi0gICAgICAgIGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2lu
YWxFdmVudCApOwotCi0gICAgICAgIGkgPSBjb3B5Lmxlbmd0aDsKLSAgICAgICAgd2hpbGUgKCBp
LS0gKSB7Ci0gICAgICAgICAgICBwcm9wID0gY29weVsgaSBdOwotICAgICAgICAgICAgZXZlbnRb
IHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpCi0gICAgICAgIC8vIEFsbCBl
dmVudHMgc2hvdWxkIGhhdmUgYSB0YXJnZXQ7IENvcmRvdmEgZGV2aWNlcmVhZHkgZG9lc24ndAot
ICAgICAgICBpZiAoICFldmVudC50YXJnZXQgKSB7Ci0gICAgICAgICAgICBldmVudC50YXJnZXQg
PSBkb2N1bWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjAr
LCBDaHJvbWUgPCAyOAotICAgICAgICAvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9k
ZSAoIzUwNCwgIzEzMTQzKQotICAgICAgICBpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0g
MyApIHsKLSAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2Rl
OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5m
aWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKLSAgICB9LAotCi0gICAgc3Bl
Y2lhbDogewotICAgICAgICBsb2FkOiB7Ci0gICAgICAgICAgICAvLyBQcmV2ZW50IHRyaWdnZXJl
ZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkCi0gICAgICAg
ICAgICBub0J1YmJsZTogdHJ1ZQotICAgICAgICB9LAotICAgICAgICBmb2N1czogewotICAgICAg
ICAgICAgLy8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1
ZW5jZSBpcyBjb3JyZWN0Ci0gICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1
cyApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAg
ICAgICAgICAgIGRlbGVnYXRlVHlwZTogImZvY3VzaW4iCi0gICAgICAgIH0sCi0gICAgICAgIGJs
dXI6IHsKLSAgICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAg
IGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHRoaXMuYmx1cigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGRl
bGVnYXRlVHlwZTogImZvY3Vzb3V0IgotICAgICAgICB9LAotICAgICAgICBjbGljazogewotICAg
ICAgICAgICAgLy8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0
YXRlIHdpbGwgYmUgcmlnaHQKLSAgICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAg
ICAgICAgICAgICAgIGlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sg
JiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQiICkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHRoaXMuY2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0KLSAgICAgICAgICAgIC8vIEZvciBjcm9z
cy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5r
cwotICAgICAgICAgICAgX2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsICJhIiApOwotICAgICAg
ICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIGJlZm9yZXVubG9hZDogewotICAgICAgICAg
ICAgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0KLSAgICAgICAgICAgICAgICAv
LyBTdXBwb3J0OiBGaXJlZm94IDIwKwotICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24n
dCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KLSAgICAgICAgICAg
ICAgICBpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAg
ICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0KLSAgICBz
aW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7Ci0gICAgICAg
IC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9u
ZS4KLSAgICAgICAgLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFBy
b3BhZ2F0aW9uLCBidXQgaWYgdGhlCi0gICAgICAgIC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50
cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgotICAgICAgICB2YXIg
ZSA9IGpRdWVyeS5leHRlbmQoCi0gICAgICAgICAgICBuZXcgalF1ZXJ5LkV2ZW50KCksCi0gICAg
ICAgICAgICBldmVudCwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlOiB0eXBl
LAotICAgICAgICAgICAgICAgIGlzU2ltdWxhdGVkOiB0cnVlLAotICAgICAgICAgICAgICAgIG9y
aWdpbmFsRXZlbnQ6IHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmICgg
YnViYmxlICkgewotICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVs
ZW0gKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpRdWVyeS5ldmVudC5kaXNwYXRj
aC5jYWxsKCBlbGVtLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBlLmlzRGVmYXVsdFBy
ZXZlbnRlZCgpICkgewotICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAg
ICAgfQotICAgIH0KLX07Ci0KLWpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0
eXBlLCBoYW5kbGUgKSB7Ci0gICAgaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7Ci0g
ICAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApOwot
ICAgIH0KLX07Ci0KLWpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewotICAg
IC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAotICAgIGlm
ICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKLSAgICAgICAgcmV0dXJuIG5l
dyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBFdmVudCBvYmpl
Y3QKLSAgICBpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKLSAgICAgICAgdGhpcy5vcmlnaW5hbEV2
ZW50ID0gc3JjOwotICAgICAgICB0aGlzLnR5cGUgPSBzcmMudHlwZTsKLQotICAgICAgICAvLyBF
dmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHBy
ZXZlbnRlZAotICAgICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVm
bGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KLSAgICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQg
PSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fAotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IEFu
ZHJvaWQgPCA0LjAKLSAgICAgICAgICAgICAgICBzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5k
ZWZpbmVkICYmCi0gICAgICAgICAgICAgICAgc3JjLmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5n
ZXRQcmV2ZW50RGVmYXVsdCgpID8KLSAgICAgICAgICAgIHJldHVyblRydWUgOgotICAgICAgICAg
ICAgcmV0dXJuRmFsc2U7Ci0KLSAgICAvLyBFdmVudCB0eXBlCi0gICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhpcy50eXBlID0gc3JjOwotICAgIH0KLQotICAgIC8vIFB1dCBleHBsaWNpdGx5IHByb3Zp
ZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0Ci0gICAgaWYgKCBwcm9wcyApIHsK
LSAgICAgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBD
cmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQotICAg
IHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwot
Ci0gICAgLy8gTWFyayBpdCBhcyBmaXhlZAotICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0
cnVlOwotfTsKLQotLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNw
ZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi0vLyBodHRwOi8vd3d3
LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlw
dC1iaW5kaW5nLmh0bWwKLWpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Ci0gICAgaXNEZWZhdWx0
UHJldmVudGVkOiByZXR1cm5GYWxzZSwKLSAgICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJu
RmFsc2UsCi0gICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAot
Ci0gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgZSA9IHRoaXMu
b3JpZ2luYWxFdmVudDsKLQotICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVy
blRydWU7Ci0KLSAgICAgICAgaWYgKCBlICYmIGUucHJldmVudERlZmF1bHQgKSB7Ci0gICAgICAg
ICAgICBlLnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHN0b3BQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50
OwotCi0gICAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwotCi0g
ICAgICAgIGlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHsKLSAgICAgICAgICAgIGUuc3Rv
cFByb3BhZ2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHN0b3BJbW1lZGlhdGVQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlv
blN0b3BwZWQgPSByZXR1cm5UcnVlOwotICAgICAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwot
ICAgIH0KLX07Ci0KLS8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3Vz
ZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwotLy8gU3VwcG9ydDogQ2hyb21lIDE1Kwot
alF1ZXJ5LmVhY2goewotICAgIG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAotICAgIG1vdXNlbGVh
dmU6ICJtb3VzZW91dCIKLX0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7Ci0gICAgalF1ZXJ5LmV2
ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKLSAgICAgICAgZGVsZWdhdGVUeXBlOiBmaXgsCi0gICAg
ICAgIGJpbmRUeXBlOiBmaXgsCi0KLSAgICAgICAgaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7
Ci0gICAgICAgICAgICB2YXIgcmV0LAotICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMsCi0g
ICAgICAgICAgICAgICAgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCi0gICAgICAgICAg
ICAgICAgaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwotCi0gICAgICAgICAgICAvLyBGb3Ig
bW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRo
ZSB0YXJnZXQuCi0gICAgICAgICAgICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91
c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdwotICAgICAgICAgICAgaWYgKCAhcmVs
YXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwg
cmVsYXRlZCApKSApIHsKLSAgICAgICAgICAgICAgICBldmVudC50eXBlID0gaGFuZGxlT2JqLm9y
aWdUeXBlOwotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0
aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICBldmVudC50eXBlID0gZml4OwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH07Ci19
KTsKLQotLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCi0vLyBTdXBw
b3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaQotaWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxl
cyApIHsKLSAgICBqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291
dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKLQotICAgICAgICAvLyBBdHRhY2ggYSBzaW5n
bGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMg
Zm9jdXNpbi9mb2N1c291dAotICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCAp
IHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFy
Z2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7Ci0gICAgICAgICAgICB9Owot
Ci0gICAgICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKLSAgICAgICAgICAgIHNl
dHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2YXIgZG9jID0gdGhpcy5vd25lckRv
Y3VtZW50IHx8IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaGVzID0gZGF0YV9wcml2
LmFjY2VzcyggZG9jLCBmaXggKTsKLQotICAgICAgICAgICAgICAgIGlmICggIWF0dGFjaGVzICkg
ewotICAgICAgICAgICAgICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxl
ciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYXRhX3ByaXYu
YWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7Ci0gICAgICAgICAgICB9
LAotICAgICAgICAgICAgdGVhcmRvd246IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIHZh
ciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAg
YXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTsKLQotICAgICAgICAg
ICAgICAgIGlmICggIWF0dGFjaGVzICkgewotICAgICAgICAgICAgICAgICAgICBkb2MucmVtb3Zl
RXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAg
ICBkYXRhX3ByaXYucmVtb3ZlKCBkb2MsIGZpeCApOwotCi0gICAgICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFj
aGVzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAg
IH0pOwotfQotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLQotICAgIG9uOiBmdW5jdGlvbiggdHlwZXMs
IHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKLSAgICAgICAgdmFyIG9y
aWdGbiwgdHlwZTsKLQotICAgICAgICAvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFu
ZGxlcnMKLSAgICAgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewotICAgICAg
ICAgICAgLy8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkKLSAgICAgICAgICAgIGlm
ICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgICAgICAvLyAo
IHR5cGVzLU9iamVjdCwgZGF0YSApCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgfHwgc2Vs
ZWN0b3I7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBmb3IgKCB0eXBlIGluIHR5cGVzICkgewotICAgICAgICAgICAgICAg
IHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vICgg
dHlwZXMsIGZuICkKLSAgICAgICAgICAgIGZuID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICBkYXRh
ID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGZuID09IG51bGwg
KSB7Ci0gICAgICAgICAgICBpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKLSAgICAgICAgICAgICAg
ICBmbiA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDsKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gKCB0eXBlcywgZGF0YSwgZm4gKQotICAg
ICAgICAgICAgICAgIGZuID0gZGF0YTsKLSAgICAgICAgICAgICAgICBkYXRhID0gc2VsZWN0b3I7
Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICBmbiA9
IHJldHVybkZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCAhZm4gKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb25lID09PSAxICkgewotICAg
ICAgICAgICAgb3JpZ0ZuID0gZm47Ci0gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKCBldmVudCAp
IHsKLSAgICAgICAgICAgICAgICAvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQg
Y29udGFpbnMgdGhlIGluZm8KLSAgICAgICAgICAgICAgICBqUXVlcnkoKS5vZmYoIGV2ZW50ICk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7
Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIg
Y2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KLSAgICAgICAgICAgIGZuLmd1aWQgPSBvcmlnRm4uZ3Vp
ZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOwotICAgICAgICB9Ci0gICAgICAg
IHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgalF1ZXJ5LmV2ZW50
LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOwotICAgICAgICB9KTsKLSAg
ICB9LAotICAgIG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Ci0g
ICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Ci0g
ICAgfSwKLSAgICBvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgewotICAgICAg
ICB2YXIgaGFuZGxlT2JqLCB0eXBlOwotICAgICAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZl
bnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHsKLSAgICAgICAgICAgIC8vICggZXZlbnQg
KSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnQKLSAgICAgICAgICAgIGhhbmRsZU9iaiA9IHR5cGVz
LmhhbmRsZU9iajsKLSAgICAgICAgICAgIGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5v
ZmYoCi0gICAgICAgICAgICAgICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmln
VHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUsCi0g
ICAgICAgICAgICAgICAgaGFuZGxlT2JqLnNlbGVjdG9yLAotICAgICAgICAgICAgICAgIGhhbmRs
ZU9iai5oYW5kbGVyCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewotICAg
ICAgICAgICAgLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKLSAgICAgICAgICAgIGZv
ciAoIHR5cGUgaW4gdHlwZXMgKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vZmYoIHR5cGUsIHNl
bGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0
eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7Ci0gICAgICAgICAgICAvLyAoIHR5cGVz
IFssIGZuXSApCi0gICAgICAgICAgICBmbiA9IHNlbGVjdG9yOwotICAgICAgICAgICAgc2VsZWN0
b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7
Ci0gICAgICAgICAgICBmbiA9IHJldHVybkZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBqUXVlcnkuZXZlbnQucmVtb3Zl
KCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7Ci0gICAgICAgIH0pOwotICAgIH0sCi0KLSAg
ICB0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBl
LCBkYXRhLCB0aGlzICk7Ci0gICAgICAgIH0pOwotICAgIH0sCi0gICAgdHJpZ2dlckhhbmRsZXI6
IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewotICAgICAgICB2YXIgZWxlbSA9IHRoaXNbMF07Ci0g
ICAgICAgIGlmICggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJp
Z2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApOwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0K
LQotdmFyCi0gICAgcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5w
dXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKLSAgICBydGFnTmFtZSA9
IC88KFtcdzpdKykvLAotICAgIHJodG1sID0gLzx8JiM/XHcrOy8sCi0gICAgcm5vSW5uZXJodG1s
ID0gLzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSwKLSAgICAvLyBjaGVja2VkPSJjaGVja2VkIiBv
ciBjaGVja2VkCi0gICAgcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2Vk
LikvaSwKLSAgICByc2NyaXB0VHlwZSA9IC9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwKLSAg
ICByc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVwvKC4qKS8sCi0gICAgcmNsZWFuU2NyaXB0ID0g
L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLAotCi0gICAgLy8gV2Ug
aGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMCkKLSAgICB3
cmFwTWFwID0gewotCi0gICAgICAgIC8vIFN1cHBvcnQ6IElFIDkKLSAgICAgICAgb3B0aW9uOiBb
IDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKLQotICAg
ICAgICB0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKLSAgICAgICAgY29sOiBb
IDIsICI8dGFibGU+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAotICAgICAg
ICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKLSAgICAg
ICAgdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4i
IF0sCi0KLSAgICAgICAgX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0KLSAgICB9OwotCi0vLyBTdXBw
b3J0OiBJRSA5Ci13cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Ci0KLXdyYXBNYXAu
dGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlv
biA9IHdyYXBNYXAudGhlYWQ7Ci13cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKLQotLy8gU3VwcG9y
dDogMS54IGNvbXBhdGliaWxpdHkKLS8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0
Ym9keQotZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkgewotICAg
IHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJ0YWJsZSIgKSAmJgotICAgICAgICBqUXVl
cnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQu
Zmlyc3RDaGlsZCwgInRyIiApID8KLQotICAgICAgICBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJ0Ym9keSIpWzBdIHx8Ci0gICAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVy
RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSApIDoKLSAgICAgICAgZWxlbTsKLX0KLQot
Ly8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMg
Zm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgotZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSAp
IHsKLSAgICBlbGVtLnR5cGUgPSAoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSAhPT0gbnVsbCkg
KyAiLyIgKyBlbGVtLnR5cGU7Ci0gICAgcmV0dXJuIGVsZW07Ci19Ci1mdW5jdGlvbiByZXN0b3Jl
U2NyaXB0KCBlbGVtICkgewotICAgIHZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMo
IGVsZW0udHlwZSApOwotCi0gICAgaWYgKCBtYXRjaCApIHsKLSAgICAgICAgZWxlbS50eXBlID0g
bWF0Y2hbIDEgXTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSgi
dHlwZSIpOwotICAgIH0KLQotICAgIHJldHVybiBlbGVtOwotfQotCi0vLyBNYXJrIHNjcmlwdHMg
YXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKLWZ1bmN0aW9uIHNldEdsb2JhbEV2YWwo
IGVsZW1zLCByZWZFbGVtZW50cyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGwgPSBlbGVt
cy5sZW5ndGg7Ci0KLSAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgIGRhdGFfcHJp
di5zZXQoCi0gICAgICAgICAgICBlbGVtc1sgaSBdLCAiZ2xvYmFsRXZhbCIsICFyZWZFbGVtZW50
cyB8fCBkYXRhX3ByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCAiZ2xvYmFsRXZhbCIgKQotICAg
ICAgICApOwotICAgIH0KLX0KLQotZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCAp
IHsKLSAgICB2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRh
dGFDdXIsIGV2ZW50czsKLQotICAgIGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMs
IGhhbmRsZXJzLCBldGMuCi0gICAgaWYgKCBkYXRhX3ByaXYuaGFzRGF0YSggc3JjICkgKSB7Ci0g
ICAgICAgIHBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3JjICk7Ci0gICAgICAgIHBkYXRh
Q3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTsKLSAgICAgICAgZXZlbnRzID0g
cGRhdGFPbGQuZXZlbnRzOwotCi0gICAgICAgIGlmICggZXZlbnRzICkgewotICAgICAgICAgICAg
ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKLSAgICAgICAgICAgIHBkYXRhQ3VyLmV2ZW50cyA9IHt9
OwotCi0gICAgICAgICAgICBmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKLSAgICAgICAgICAgICAg
ICBmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsK
LSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRz
WyB0eXBlIF1bIGkgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIC8vIDIuIENvcHkgdXNlciBkYXRhCi0gICAgaWYgKCBkYXRhX3Vz
ZXIuaGFzRGF0YSggc3JjICkgKSB7Ci0gICAgICAgIHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vz
cyggc3JjICk7Ci0gICAgICAgIHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xk
ICk7Ci0KLSAgICAgICAgZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTsKLSAgICB9Ci19
Ci0KLWZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgewotICAgIHZhciByZXQgPSBjb250
ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgg
dGFnIHx8ICIqIiApIDoKLSAgICAgICAgICAgIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCA/IGNv
bnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoKLSAgICAgICAgICAgIFtdOwot
Ci0gICAgcmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUo
IGNvbnRleHQsIHRhZyApID8KLSAgICAgICAgalF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0
ICkgOgotICAgICAgICByZXQ7Ci19Ci0KLS8vIFN1cHBvcnQ6IElFID49IDkKLWZ1bmN0aW9uIGZp
eElucHV0KCBzcmMsIGRlc3QgKSB7Ci0gICAgdmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50
b0xvd2VyQ2FzZSgpOwotCi0gICAgLy8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0
ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uCi0gICAgaWYgKCBub2RlTmFt
ZSA9PT0gImlucHV0IiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgewotICAg
ICAgICBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKLQotICAgIC8vIEZhaWxzIHRvIHJldHVy
biB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4g
Y2xvbmluZyBvcHRpb25zCi0gICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwg
bm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7Ci0gICAgICAgIGRlc3QuZGVmYXVsdFZhbHVlID0g
c3JjLmRlZmF1bHRWYWx1ZTsKLSAgICB9Ci19Ci0KLWpRdWVyeS5leHRlbmQoewotICAgIGNsb25l
OiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0g
ICAgICAgIHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAotICAgICAgICAgICAg
Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAotICAgICAgICAgICAgaW5QYWdlID0galF1
ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKLQotICAgICAgICAvLyBT
dXBwb3J0OiBJRSA+PSA5Ci0gICAgICAgIC8vIEZpeCBDbG9uaW5nIGlzc3VlcwotICAgICAgICBp
ZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBl
bGVtLm5vZGVUeXBlID09PSAxMSApICYmCi0gICAgICAgICAgICAgICAgIWpRdWVyeS5pc1hNTERv
YyggZWxlbSApICkgewotCi0gICAgICAgICAgICAvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9y
IHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUv
MgotICAgICAgICAgICAgZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwotICAgICAgICAg
ICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKLQotICAgICAgICAgICAgZm9yICggaSA9
IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgZml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0
aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCi0gICAgICAgIGlmICggZGF0YUFuZEV2ZW50cyApIHsK
LSAgICAgICAgICAgIGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgICAgICAgICAg
c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsKLSAgICAgICAgICAg
ICAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwotCi0g
ICAgICAgICAgICAgICAgZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50
c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25l
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmVzZXJ2ZSBzY3Jp
cHQgZXZhbHVhdGlvbiBoaXN0b3J5Ci0gICAgICAgIGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xv
bmUsICJzY3JpcHQiICk7Ci0gICAgICAgIGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7
Ci0gICAgICAgICAgICBzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0
QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0sCi0KLSAgICBidWls
ZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiAp
IHsKLSAgICAgICAgdmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaiwKLSAgICAg
ICAgICAgIGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCi0gICAg
ICAgICAgICBub2RlcyA9IFtdLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAgICBsID0g
ZWxlbXMubGVuZ3RoOwotCi0gICAgICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKLSAgICAgICAg
ICAgIGVsZW0gPSBlbGVtc1sgaSBdOwotCi0gICAgICAgICAgICBpZiAoIGVsZW0gfHwgZWxlbSA9
PT0gMCApIHsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCBub2RlcyBkaXJlY3RseQotICAgICAg
ICAgICAgICAgIGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gIm9iamVjdCIgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAgICAgICAgICAgICAg
IC8vIGpRdWVyeS5tZXJnZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MK
LSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/
IFsgZWxlbSBdIDogZWxlbSApOwotCi0gICAgICAgICAgICAgICAgLy8gQ29udmVydCBub24taHRt
bCBpbnRvIGEgdGV4dCBub2RlCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIXJodG1sLnRl
c3QoIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaCggY29udGV4dC5j
cmVhdGVUZXh0Tm9kZSggZWxlbSApICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGh0
bWwgaW50byBET00gbm9kZXMKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgICAgICB0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRl
RWxlbWVudCgiZGl2IikgKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBEZXNlcmlhbGl6ZSBh
IHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRhZyA9ICggcnRh
Z05hbWUuZXhlYyggZWxlbSApIHx8IFsgIiIsICIiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZh
dWx0OwotICAgICAgICAgICAgICAgICAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxl
bS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICkgKyB3cmFwWyAyIF07Ci0KLSAgICAg
ICAgICAgICAgICAgICAgLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBj
b250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGogPSB3cmFwWyAwIF07Ci0gICAgICAgICAgICAg
ICAgICAgIHdoaWxlICggai0tICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1w
Lmxhc3RDaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAg
IC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeS5tZXJn
ZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKLSAgICAgICAgICAgICAg
ICAgICAgalF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcgotICAgICAgICAg
ICAgICAgICAgICB0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOwotCi0gICAgICAgICAgICAgICAg
ICAgIC8vIEZpeGVzICMxMjM0NgotICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBXZWJr
aXQsIElFCi0gICAgICAgICAgICAgICAgICAgIHRtcC50ZXh0Q29udGVudCA9ICIiOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92
ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnQKLSAgICAgICAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAi
IjsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysg
XSkgKSB7Ci0KLSAgICAgICAgICAgIC8vICM0MDg3IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlv
biBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0aGlzIGlzCi0gICAgICAgICAgICAvLyB0aGF0
IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZwotICAgICAgICAgICAgaWYgKCBzZWxlY3Rpb24g
JiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHsKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGFpbnMg
PSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwotCi0gICAgICAg
ICAgICAvLyBBcHBlbmQgdG8gZnJhZ21lbnQKLSAgICAgICAgICAgIHRtcCA9IGdldEFsbCggZnJh
Z21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNjcmlwdCIgKTsKLQotICAgICAgICAgICAgLy8g
UHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeQotICAgICAgICAgICAgaWYgKCBjb250
YWlucyApIHsKLSAgICAgICAgICAgICAgICBzZXRHbG9iYWxFdmFsKCB0bXAgKTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FwdHVyZSBleGVjdXRhYmxlcwotICAgICAgICAgICAg
aWYgKCBzY3JpcHRzICkgewotICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAg
IHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgIiIgKSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHNjcmlwdHMucHVzaCggZWxlbSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIGZyYWdtZW50OwotICAgIH0sCi0KLSAgICBjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyAp
IHsKLSAgICAgICAgdmFyIGRhdGEsIGVsZW0sIGV2ZW50cywgdHlwZSwga2V5LCBqLAotICAgICAg
ICAgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAotICAgICAgICAgICAgaSA9IDA7
Ci0KLSAgICAgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkr
KyApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKLSAg
ICAgICAgICAgICAgICBrZXkgPSBlbGVtWyBkYXRhX3ByaXYuZXhwYW5kbyBdOwotCi0gICAgICAg
ICAgICAgICAgaWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHsK
LSAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gT2JqZWN0LmtleXMoIGRhdGEuZXZlbnRzIHx8
IHt9ICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZXZlbnRzLmxlbmd0aCApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyAodHlwZSA9IGV2ZW50c1tqXSkgIT09IHVu
ZGVmaW5lZDsgaisrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3BlY2lh
bFsgdHlwZSBdICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZl
bnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJo
ZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhh
bmRsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAo
IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBE
aXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRhdGEKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRGlzY2Fy
ZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhCi0gICAgICAgICAgICBkZWxldGUgZGF0YV91c2Vy
LmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07Ci0gICAgICAgIH0KLSAgICB9Ci19
KTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgdGV4dDogZnVuY3Rpb24oIHZhbHVlICkgewot
ICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAg
ICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5
LnRleHQoIHRoaXMgKSA6Ci0gICAgICAgICAgICAgICAgdGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0
aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1
bWVudHMubGVuZ3RoICk7Ci0gICAgfSwKLQotICAgIGFwcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09
IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdl
dCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOwotICAgICAgICAgICAgICAgIHRh
cmdldC5hcHBlbmRDaGlsZCggZWxlbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAg
ICB9LAotCi0gICAgcHJlcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRv
bU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgaWYgKCB0
aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5
cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRh
cmdldCggdGhpcywgZWxlbSApOwotICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUo
IGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwot
ICAgIH0sCi0KLSAgICBiZWZvcmU6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5k
b21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIGlmICgg
dGhpcy5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNl
cnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAg
fSwKLQotICAgIGFmdGVyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9tTWFu
aXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMu
cGFyZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0p
OwotICAgIH0sCi0KLSAgICByZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyog
SW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Ci0gICAgICAgIHZhciBlbGVtLAotICAgICAgICAgICAg
ZWxlbXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkgOiB0aGlz
LAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ld
KSAhPSBudWxsOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5v
ZGVUeXBlID09PSAxICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFs
bCggZWxlbSApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggZWxlbS5wYXJl
bnROb2RlICkgewotICAgICAgICAgICAgICAgIGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRh
aW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAg
c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAg
fSwKLQotICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGVsZW0sCi0gICAgICAg
ICAgICBpID0gMDsKLQotICAgICAgICBmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsg
aSsrICkgewotICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCi0gICAg
ICAgICAgICAgICAgLy8gUHJldmVudCBtZW1vcnkgbGVha3MKLSAgICAgICAgICAgICAgICBqUXVl
cnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsKLQotICAgICAgICAgICAgICAg
IC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCi0gICAgICAgICAgICAgICAgZWxlbS50ZXh0
Q29udGVudCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJu
IHRoaXM7Ci0gICAgfSwKLQotICAgIGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVl
cERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgIGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRz
ID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7Ci0gICAgICAgIGRlZXBEYXRhQW5kRXZl
bnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0
YUFuZEV2ZW50czsKLQotICAgICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgICByZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0
YUFuZEV2ZW50cyApOwotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgaHRtbDogZnVuY3Rpb24o
IHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUg
KSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSwKLSAgICAgICAgICAg
ICAgICBpID0gMCwKLSAgICAgICAgICAgICAgICBsID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAgICAg
ICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewot
ICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmlubmVySFRNTDsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNl
IGlubmVySFRNTAotICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYm
ICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJgotICAgICAgICAgICAgICAgICF3cmFwTWFw
WyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNh
c2UoKSBdICkgewotCi0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0
bWxUYWcsICI8JDE+PC8kMj4iICk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAg
ICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBlbGVtID0gdGhpc1sgaSBdIHx8IHt9OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBS
ZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlubmVySFRNTCA9IHZhbHVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgZWxlbSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB1c2luZyBpbm5l
ckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKLSAgICAg
ICAgICAgICAgICB9IGNhdGNoKCBlICkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVl
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVu
Z3RoICk7Ci0gICAgfSwKLQotICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
dmFyIGFyZyA9IGFyZ3VtZW50c1sgMCBdOwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGNoYW5nZXMs
IHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudAotICAg
ICAgICB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAg
ICAgICAgYXJnID0gdGhpcy5wYXJlbnROb2RlOwotCi0gICAgICAgICAgICBqUXVlcnkuY2xlYW5E
YXRhKCBnZXRBbGwoIHRoaXMgKSApOwotCi0gICAgICAgICAgICBpZiAoIGFyZyApIHsKLSAgICAg
ICAgICAgICAgICBhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZvcmNlIHJlbW92YWwgaWYgdGhlcmUgd2FzIG5v
IG5ldyBjb250ZW50IChlLmcuLCBmcm9tIGVtcHR5IGFyZ3VtZW50cykKLSAgICAgICAgcmV0dXJu
IGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3Zl
KCk7Ci0gICAgfSwKLQotICAgIGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotICAgICAg
ICByZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7Ci0gICAgfSwKLQotICAgIGRv
bU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7Ci0KLSAgICAgICAgLy8gRmxhdHRl
biBhbnkgbmVzdGVkIGFycmF5cwotICAgICAgICBhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJn
cyApOwotCi0gICAgICAgIHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMs
IG5vZGUsIGRvYywKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVu
Z3RoLAotICAgICAgICAgICAgc2V0ID0gdGhpcywKLSAgICAgICAgICAgIGlOb0Nsb25lID0gbCAt
IDEsCi0gICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbIDAgXSwKLSAgICAgICAgICAgIGlzRnVuY3Rp
b24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKLQotICAgICAgICAvLyBXZSBjYW4ndCBj
bG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKLSAgICAg
ICAgaWYgKCBpc0Z1bmN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgKCBsID4gMSAmJiB0eXBlb2Yg
dmFsdWUgPT09ICJzdHJpbmciICYmCi0gICAgICAgICAgICAgICAgICAgICFzdXBwb3J0LmNoZWNr
Q2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkgewotICAgICAgICAgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHNlbGYg
PSBzZXQuZXEoIGluZGV4ICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgewot
ICAgICAgICAgICAgICAgICAgICBhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwg
c2VsZi5odG1sKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VsZi5k
b21NYW5pcCggYXJncywgY2FsbGJhY2sgKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCBsICkgewotICAgICAgICAgICAgZnJhZ21lbnQgPSBqUXVlcnkuYnVpbGRG
cmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCB0aGlzICk7Ci0g
ICAgICAgICAgICBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0KLSAgICAgICAgICAgIGlm
ICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAg
ZnJhZ21lbnQgPSBmaXJzdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBmaXJz
dCApIHsKLSAgICAgICAgICAgICAgICBzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFn
bWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOwotICAgICAgICAgICAgICAgIGhhc1Nj
cmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgb3Jp
Z2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVj
YXVzZSBpdCBjYW4gZW5kIHVwCi0gICAgICAgICAgICAgICAgLy8gYmVpbmcgZW1wdGllZCBpbmNv
cnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KLSAgICAgICAgICAgICAgICBm
b3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmcmFnbWVu
dDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIGkgIT09IGlOb0Nsb25lICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSAp
OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVk
IHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIGhhc1NjcmlwdHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9y
dDogUXRXZWJLaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqUXVlcnkubWVyZ2Ug
YmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQi
ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIHRoaXNbIGkgXSwgbm9kZSwgaSAp
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggaGFzU2NyaXB0cyAp
IHsKLSAgICAgICAgICAgICAgICAgICAgZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAx
IF0ub3duZXJEb2N1bWVudDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBSZWVuYWJsZSBzY3Jp
cHRzCi0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3Jp
cHQgKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlw
dHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZvciAo
IGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IHNjcmlwdHNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcnNjcmlw
dFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAhZGF0YV9wcml2LmFjY2Vzcyggbm9kZSwgImdsb2JhbEV2YWwiICkgJiYgalF1ZXJ5LmNv
bnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggbm9kZS5zcmMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGlv
bmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5Ll9ldmFsVXJsICkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Ll9ldmFsVXJsKCBu
b2RlLnNyYyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2Ny
aXB0LCAiIiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQot
fSk7Ci0KLWpRdWVyeS5lYWNoKHsKLSAgICBhcHBlbmRUbzogImFwcGVuZCIsCi0gICAgcHJlcGVu
ZFRvOiAicHJlcGVuZCIsCi0gICAgaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKLSAgICBpbnNlcnRB
ZnRlcjogImFmdGVyIiwKLSAgICByZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCi19LCBmdW5jdGlv
biggbmFtZSwgb3JpZ2luYWwgKSB7Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigg
c2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBlbGVtcywKLSAgICAgICAgICAgIHJldCA9IFtdLAot
ICAgICAgICAgICAgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAotICAgICAgICAgICAgbGFz
dCA9IGluc2VydC5sZW5ndGggLSAxLAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9y
ICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKLSAgICAgICAgICAgIGVsZW1zID0gaSA9PT0gbGFzdCA/
IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7Ci0gICAgICAgICAgICBqUXVlcnkoIGluc2VydFsg
aSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7Ci0KLSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0
V2ViS2l0Ci0gICAgICAgICAgICAvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5
bGlrZSkgdGhyb3dzCi0gICAgICAgICAgICBwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApOwotICAg
IH07Ci19KTsKLQotCi12YXIgaWZyYW1lLAotICAgIGVsZW1kaXNwbGF5ID0ge307Ci0KLS8qKgot
ICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudAotICogQHBhcmFtIHtT
dHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnQKLSAqIEBwYXJhbSB7T2JqZWN0fSBk
b2MgRG9jdW1lbnQgb2JqZWN0Ci0gKi8KLS8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1
bHREaXNwbGF5Ci1mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7Ci0gICAgdmFy
IGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9j
LmJvZHkgKSwKLQotICAgICAgICAvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSBy
ZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudAotICAgICAgICBkaXNwbGF5ID0g
d2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlID8KLQotICAgICAgICAgICAgLy8gVXNlIG9m
IHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdG1pemF0aW9uKSB1
bnRpbCBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLAotICAgICAgICAgICAgLy8gc2luY2Ug
aXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVjaWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBG
RgotICAgICAgICAgICAgd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0g
KS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCAiZGlzcGxheSIgKTsKLQotICAgIC8v
IFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LAotICAgIC8vIHNv
IHVzZSAiZGV0YWNoIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVu
dAotICAgIGVsZW0uZGV0YWNoKCk7Ci0KLSAgICByZXR1cm4gZGlzcGxheTsKLX0KLQotLyoqCi0g
KiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVu
dAotICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lCi0gKi8KLWZ1bmN0aW9uIGRlZmF1bHREaXNw
bGF5KCBub2RlTmFtZSApIHsKLSAgICB2YXIgZG9jID0gZG9jdW1lbnQsCi0gICAgICAgIGRpc3Bs
YXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsKLQotICAgIGlmICggIWRpc3BsYXkgKSB7Ci0g
ICAgICAgIGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7Ci0KLSAgICAg
ICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1l
Ci0gICAgICAgIGlmICggZGlzcGxheSA9PT0gIm5vbmUiIHx8ICFkaXNwbGF5ICkgewotCi0gICAg
ICAgICAgICAvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGUKLSAg
ICAgICAgICAgIGlmcmFtZSA9IChpZnJhbWUgfHwgalF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRl
cj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVs
ZW1lbnQgKTsKLQotICAgICAgICAgICAgLy8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0
b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlCi0gICAgICAgICAg
ICBkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7Ci0KLSAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFCi0gICAgICAgICAgICBkb2Mud3JpdGUoKTsKLSAgICAgICAgICAgIGRvYy5jbG9z
ZSgpOwotCi0gICAgICAgICAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRv
YyApOwotICAgICAgICAgICAgaWZyYW1lLmRldGFjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5Ci0gICAgICAgIGVsZW1kaXNwbGF5
WyBub2RlTmFtZSBdID0gZGlzcGxheTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGlzcGxheTsKLX0K
LXZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7Ci0KLXZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhw
KCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKTsKLQotdmFyIGdldFN0eWxl
cyA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4gZWxlbS5vd25lckRvY3VtZW50
LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKLSAgICB9OwotCi0K
LQotZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHsKLSAgICB2YXIgd2lk
dGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAotICAgICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7
Ci0KLSAgICBjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApOwotCi0gICAg
Ly8gU3VwcG9ydDogSUU5Ci0gICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBm
b3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUgIzEyNTM3Ci0gICAgaWYgKCBjb21wdXRlZCAp
IHsKLSAgICAgICAgcmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNv
bXB1dGVkWyBuYW1lIF07Ci0gICAgfQotCi0gICAgaWYgKCBjb21wdXRlZCApIHsKLQotICAgICAg
ICBpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50
LCBlbGVtICkgKSB7Ci0gICAgICAgICAgICByZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUg
KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1cHBvcnQ6IGlPUyA8IDYKLSAgICAgICAgLy8g
QSB0cmlidXRlIHRvIHRoZSAiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcyIKLSAgICAgICAg
Ly8gaU9TIDwgNiAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0
IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscwotICAgICAg
ICAvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMu
b3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKLSAgICAgICAgaWYgKCBybnVtbm9ucHgu
dGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7Ci0KLSAgICAgICAgICAgIC8v
IFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHdpZHRoID0gc3R5bGUu
d2lkdGg7Ci0gICAgICAgICAgICBtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoOwotICAgICAgICAg
ICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKLQotICAgICAgICAgICAgLy8gUHV0IGluIHRo
ZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAotICAgICAgICAgICAgc3R5
bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0OwotICAgICAg
ICAgICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7Ci0KLSAgICAgICAgICAgIC8vIFJldmVydCB0aGUg
Y2hhbmdlZCB2YWx1ZXMKLSAgICAgICAgICAgIHN0eWxlLndpZHRoID0gd2lkdGg7Ci0gICAgICAg
ICAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOwotICAgICAgICAgICAgc3R5bGUubWF4V2lk
dGggPSBtYXhXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQgIT09IHVu
ZGVmaW5lZCA/Ci0gICAgICAgIC8vIFN1cHBvcnQ6IElFCi0gICAgICAgIC8vIElFIHJldHVybnMg
ekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuCi0gICAgICAgIHJldCArICIiIDoKLSAgICAgICAg
cmV0OwotfQotCi0KLWZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiAp
IHsKLSAgICAvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4g
aWYgaXQncyByZWFsbHkgbmVlZGVkLgotICAgIHJldHVybiB7Ci0gICAgICAgIGdldDogZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICBpZiAoIGNvbmRpdGlvbkZuKCkgKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVl
IHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0Lgot
ICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBob29rcyBmb3IgbWFy
Z2luUmlnaHQsIHJlbW92ZSB0aGUgd2hvbGUgb2JqZWN0LgotICAgICAgICAgICAgICAgIGRlbGV0
ZSB0aGlzLmdldDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0
IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLgotCi0gICAgICAgICAgICByZXR1cm4gKHRoaXMu
Z2V0ID0gaG9va0ZuKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Ci0gICAgICAgIH0KLSAgICB9
OwotfQotCi0KLShmdW5jdGlvbigpIHsKLSAgICB2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6
aW5nUmVsaWFibGVWYWwsCi0gICAgICAgIC8vIFN1cHBvcnQ6IEZpcmVmb3gsIEFuZHJvaWQgMi4z
IChQcmVmaXhlZCBib3gtc2l6aW5nIHZlcnNpb25zKS4KLSAgICAgICAgZGl2UmVzZXQgPSAicGFk
ZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gtc2l6aW5n
OmNvbnRlbnQtYm94OyIgKwotICAgICAgICAgICAgIi1tb3otYm94LXNpemluZzpjb250ZW50LWJv
eDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IiwKLSAgICAgICAgZG9jRWxlbSA9IGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudCwKLSAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggImRpdiIgKSwKLSAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIg
KTsKLQotICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7Ci0gICAg
ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gIiI7Ci0gICAgc3Vw
cG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250
ZW50LWJveCI7Ci0KLSAgICBjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9ICJib3JkZXI6MDt3aWR0
aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDsiICsKLSAg
ICAgICAgIm1hcmdpbi10b3A6MXB4IjsKLSAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiAp
OwotCi0gICAgLy8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlh
YmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0Ci0gICAgLy8gc28gdGhleSdyZSBleGVj
dXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi4KLSAg
ICBmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkgewot
ICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94LCBBbmRyb2lkIDIuMyAoUHJlZml4ZWQgYm94LXNp
emluZyB2ZXJzaW9ucykuCi0gICAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gIi13ZWJraXQtYm94
LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94OyIgKwotICAgICAg
ICAgICAgImJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3Bs
YXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7IiArCi0gICAgICAgICAgICAicG9zaXRp
b246YWJzb2x1dGU7dG9wOjElIjsKLSAgICAgICAgZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFp
bmVyICk7Ci0KLSAgICAgICAgdmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUo
IGRpdiwgbnVsbCApOwotICAgICAgICBwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9
PSAiMSUiOwotICAgICAgICBib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09
PSAiNHB4IjsKLQotICAgICAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLSAg
ICB9Ci0KLSAgICAvLyBVc2Ugd2luZG93LmdldENvbXB1dGVkU3R5bGUgYmVjYXVzZSBqc2RvbSBv
biBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KLSAgICBpZiAoIHdpbmRvdy5nZXRDb21w
dXRlZFN0eWxlICkgewotICAgICAgICBqUXVlcnkuZXh0ZW5kKHN1cHBvcnQsIHsKLSAgICAgICAg
ICAgIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMg
dGVzdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UgYnV0IHdlIHN0aWxsIGRvIG1lbW9pemluZwotICAg
ICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHBy
ZS1jb21wdXRpbmcuCi0gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUg
dGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC4KLSAgICAgICAgICAgICAgICBjb21w
dXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYm94
U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggYm94U2l6
aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVBp
eGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICByZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7Ci0gICAgICAgICAgICB9
LAotICAgICAgICAgICAgcmVsaWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKLSAgICAgICAgICAgICAgICAvLyBDaGVj
ayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVj
dGx5Ci0gICAgICAgICAgICAgICAgLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQg
b24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpCi0gICAgICAgICAgICAgICAgLy8gV2ViS2l0
IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFy
Z2luLXJpZ2h0Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9u
bHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLgotICAgICAgICAgICAg
ICAgIHZhciByZXQsCi0gICAgICAgICAgICAgICAgICAgIG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRD
aGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApOwotICAgICAgICAgICAgICAg
IG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDsK
LSAgICAgICAgICAgICAgICBtYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSBtYXJnaW5EaXYu
c3R5bGUud2lkdGggPSAiMCI7Ci0gICAgICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gIjFw
eCI7Ci0gICAgICAgICAgICAgICAgZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7Ci0K
LSAgICAgICAgICAgICAgICByZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5
bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJpZ2h0ICk7Ci0KLSAgICAgICAgICAgICAgICBk
b2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLQotICAgICAgICAgICAgICAgIC8vIENs
ZWFuIHVwIHRoZSBkaXYgZm9yIG90aGVyIHN1cHBvcnQgdGVzdHMuCi0gICAgICAgICAgICAgICAg
ZGl2LmlubmVySFRNTCA9ICIiOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfSkoKTsKLQotCi0vLyBBIG1ldGhvZCBmb3Ig
cXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2Fs
Y3VsYXRpb25zLgotalF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJh
Y2ssIGFyZ3MgKSB7Ci0gICAgdmFyIHJldCwgbmFtZSwKLSAgICAgICAgb2xkID0ge307Ci0KLSAg
ICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKLSAg
ICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0gICAgICAgIG9sZFsgbmFtZSBdID0gZWxlbS5z
dHlsZVsgbmFtZSBdOwotICAgICAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1l
IF07Ci0gICAgfQotCi0gICAgcmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10g
KTsKLQotICAgIC8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwotICAgIGZvciAoIG5hbWUgaW4gb3B0
aW9ucyApIHsKLSAgICAgICAgZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07Ci0gICAg
fQotCi0gICAgcmV0dXJuIHJldDsKLX07Ci0KLQotdmFyCi0gICAgLy8gc3dhcHBhYmxlIGlmIGRp
c3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxl
LWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKLSAgICAvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2
YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3Bs
YXkKLSAgICByZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCi0gICAg
cm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSguKikkIiwgImkiICksCi0g
ICAgcnJlbE51bSA9IG5ldyBSZWdFeHAoICJeKFsrLV0pPSgiICsgcG51bSArICIpIiwgImkiICks
Ci0KLSAgICBjc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhp
ZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKLSAgICBjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7Ci0g
ICAgICAgIGxldHRlclNwYWNpbmc6IDAsCi0gICAgICAgIGZvbnRXZWlnaHQ6IDQwMAotICAgIH0s
Ci0KLSAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJPIiwgIk1veiIsICJtcyIgXTsKLQot
Ly8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBw
cmVmaXhlZCBwcm9wZXJ0eQotZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkg
ewotCi0gICAgLy8gc2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4
ZWQKLSAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAg
IH0KLQotICAgIC8vIGNoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXMKLSAgICB2YXIgY2Fw
TmFtZSA9IG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksCi0gICAgICAgIG9y
aWdOYW1lID0gbmFtZSwKLSAgICAgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKLQotICAgIHdo
aWxlICggaS0tICkgewotICAgICAgICBuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7
Ci0gICAgICAgIGlmICggbmFtZSBpbiBzdHlsZSApIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1l
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG9yaWdOYW1lOwotfQotCi1mdW5jdGlv
biBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewotICAgIHZhciBt
YXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7Ci0gICAgcmV0dXJuIG1hdGNoZXMgPwot
ICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCAic3VidHJhY3QiLCBlLmcuLCB3aGVu
IHVzZWQgYXMgaW4gY3NzSG9va3MKLSAgICAgICAgTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAt
ICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgotICAgICAg
ICB2YWx1ZTsKLX0KLQotZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUs
IGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkgewotICAgIHZhciBpID0gZXh0cmEgPT09ICgg
aXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApID8KLSAgICAgICAgLy8gSWYgd2Ug
YWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uCi0g
ICAgICAgIDQgOgotICAgICAgICAvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRh
bCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCi0gICAgICAgIG5hbWUgPT09ICJ3aWR0aCIgPyAxIDog
MCwKLQotICAgICAgICB2YWwgPSAwOwotCi0gICAgZm9yICggOyBpIDwgNDsgaSArPSAyICkgewot
ICAgICAgICAvLyBib3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3
ZSB3YW50IGl0Ci0gICAgICAgIGlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewotICAgICAgICAg
ICAgdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUs
IHN0eWxlcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpc0JvcmRlckJveCApIHsKLSAg
ICAgICAgICAgIC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlm
IHdlIHdhbnQgY29udGVudAotICAgICAgICAgICAgaWYgKCBleHRyYSA9PT0gImNvbnRlbnQiICkg
ewotICAgICAgICAgICAgICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBj
c3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyBy
ZW1vdmUgYm9yZGVyCi0gICAgICAgICAgICBpZiAoIGV4dHJhICE9PSAibWFyZ2luIiApIHsKLSAg
ICAgICAgICAgICAgICB2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBh
bmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29u
dGVudCwgc28gYWRkIHBhZGRpbmcKLSAgICAgICAgICAgIHZhbCArPSBqUXVlcnkuY3NzKCBlbGVt
LCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0KLSAgICAgICAg
ICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNv
IGFkZCBib3JkZXIKLSAgICAgICAgICAgIGlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKLSAg
ICAgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBh
bmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotZnVuY3Rpb24gZ2V0V2lkdGhPckhl
aWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7Ci0KLSAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBw
cm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQotICAg
IHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKLSAgICAgICAgdmFsID0gbmFtZSA9PT0gIndp
ZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKLSAgICAgICAgc3R5
bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCi0gICAgICAgIGlzQm9yZGVyQm94ID0galF1ZXJ5LmNz
cyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3giOwot
Ci0gICAgLy8gc29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZz
ZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkCi0gICAgLy8gc3ZnIC0gaHR0cHM6
Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1Ci0gICAgLy8gTWF0
aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4
Ci0gICAgaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgLy8gRmFsbCBi
YWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5Ci0gICAgICAg
IHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7Ci0gICAgICAgIGlmICggdmFsIDwg
MCB8fCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUg
XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4g
U3RvcCBoZXJlIGFuZCByZXR1cm4uCi0gICAgICAgIGlmICggcm51bW5vbnB4LnRlc3QodmFsKSAp
IHsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBu
ZWVkIHRoZSBjaGVjayBmb3Igc3R5bGUgaW4gY2FzZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1
bnJlbGlhYmxlIHZhbHVlcwotICAgICAgICAvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRs
eSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCi0gICAgICAgIHZhbHVlSXNC
b3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJgotICAgICAgICAgICAgKCBzdXBwb3J0LmJveFNpemlu
Z1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKLQotICAgICAgICAv
LyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQotICAgICAgICB2YWwg
PSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwOwotICAgIH0KLQotICAgIC8vIHVzZSB0aGUgYWN0aXZl
IGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzCi0gICAg
cmV0dXJuICggdmFsICsKLSAgICAgICAgYXVnbWVudFdpZHRoT3JIZWlnaHQoCi0gICAgICAgICAg
ICBlbGVtLAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIGV4dHJhIHx8ICggaXNCb3Jk
ZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAotICAgICAgICAgICAgdmFsdWVJc0JvcmRl
ckJveCwKLSAgICAgICAgICAgIHN0eWxlcwotICAgICAgICApCi0gICAgKSArICJweCI7Ci19Ci0K
LWZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHsKLSAgICB2YXIgZGlzcGxheSwg
ZWxlbSwgaGlkZGVuLAotICAgICAgICB2YWx1ZXMgPSBbXSwKLSAgICAgICAgaW5kZXggPSAwLAot
ICAgICAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7Ci0KLSAgICBmb3IgKCA7IGluZGV4IDwg
bGVuZ3RoOyBpbmRleCsrICkgewotICAgICAgICBlbGVtID0gZWxlbWVudHNbIGluZGV4IF07Ci0g
ICAgICAgIGlmICggIWVsZW0uc3R5bGUgKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sICJv
bGRkaXNwbGF5IiApOwotICAgICAgICBkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwotICAg
ICAgICBpZiAoIHNob3cgKSB7Ci0gICAgICAgICAgICAvLyBSZXNldCB0aGUgaW5saW5lIGRpc3Bs
YXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCi0gICAgICAgICAgICAvLyBiZWlu
ZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90Ci0gICAgICAgICAgICBpZiAoICF2YWx1
ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewotICAgICAgICAgICAgICAgIGVs
ZW0uc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBT
ZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25l
Ci0gICAgICAgICAgICAvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQg
YnJvd3NlciBzdHlsZSBpcwotICAgICAgICAgICAgLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAotICAg
ICAgICAgICAgaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVt
ICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmFjY2Vz
cyggZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBpZiAoICF2YWx1
ZXNbIGluZGV4IF0gKSB7Ci0gICAgICAgICAgICAgICAgaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0g
KTsKLQotICAgICAgICAgICAgICAgIGlmICggZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIg
fHwgIWhpZGRlbiApIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LnNldCggZWxlbSwg
Im9sZGRpc3BsYXkiLCBoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyhlbGVtLCAiZGlzcGxh
eSIpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotCi0gICAgLy8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEg
c2Vjb25kIGxvb3AKLSAgICAvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93Ci0gICAgZm9y
ICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKLSAgICAgICAgZWxlbSA9
IGVsZW1lbnRzWyBpbmRleCBdOwotICAgICAgICBpZiAoICFlbGVtLnN0eWxlICkgewotICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0
eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgewot
ICAgICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8
fCAiIiA6ICJub25lIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlbGVtZW50czsK
LX0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tz
IGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0Ci0gICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBh
bmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5Ci0gICAgY3NzSG9va3M6IHsKLSAgICAgICAgb3Bh
Y2l0eTogewotICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKCBjb21wdXRlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
V2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKLSAgICAgICAg
ICAgICAgICAgICAgdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgIm9wYWNpdHkiICk7Ci0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBEb24ndCBh
dXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRp
ZXMKLSAgICBjc3NOdW1iZXI6IHsKLSAgICAgICAgImNvbHVtbkNvdW50IjogdHJ1ZSwKLSAgICAg
ICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKLSAgICAgICAgImZvbnRXZWlnaHQiOiB0cnVlLAotICAg
ICAgICAibGluZUhlaWdodCI6IHRydWUsCi0gICAgICAgICJvcGFjaXR5IjogdHJ1ZSwKLSAgICAg
ICAgIm9yZGVyIjogdHJ1ZSwKLSAgICAgICAgIm9ycGhhbnMiOiB0cnVlLAotICAgICAgICAid2lk
b3dzIjogdHJ1ZSwKLSAgICAgICAgInpJbmRleCI6IHRydWUsCi0gICAgICAgICJ6b29tIjogdHJ1
ZQotICAgIH0sCi0KLSAgICAvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lz
aCB0byBmaXggYmVmb3JlCi0gICAgLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQotICAg
IGNzc1Byb3BzOiB7Ci0gICAgICAgIC8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKLSAg
ICAgICAgImZsb2F0IjogImNzc0Zsb2F0IgotICAgIH0sCi0KLSAgICAvLyBHZXQgYW5kIHNldCB0
aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQotICAgIHN0eWxlOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgewotICAgICAgICAvLyBEb24ndCBzZXQgc3R5bGVzIG9u
IHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKLSAgICAgICAgaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVU
eXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3
ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKLSAgICAgICAgdmFyIHJldCwgdHlwZSwg
aG9va3MsCi0gICAgICAgICAgICBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwK
LSAgICAgICAgICAgIHN0eWxlID0gZWxlbS5zdHlsZTsKLQotICAgICAgICBuYW1lID0galF1ZXJ5
LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0g
dmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7Ci0KLSAgICAgICAgLy8gZ2V0cyBo
b29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgotICAgICAgICAvLyBmb2xsb3dlZCBieSB0aGUg
dW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1l
IF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOwotCi0gICAgICAgIC8vIENoZWNrIGlm
IHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQotICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQg
KSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZW9mIHZhbHVlOwotCi0gICAgICAgICAgICAvLyBj
b252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVt
YmVycy4gIzczNDUKLSAgICAgICAgICAgIGlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9
IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoIHJl
dFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUg
KSApOwotICAgICAgICAgICAgICAgIC8vIEZpeGVzIGJ1ZyAjOTIzNwotICAgICAgICAgICAgICAg
IHR5cGUgPSAibnVtYmVyIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWFrZSBz
dXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2Ci0gICAg
ICAgICAgICBpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgewotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgYSBu
dW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4g
Q1NTIHByb3BlcnRpZXMpCi0gICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJudW1iZXIiICYmICFq
UXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgewotICAgICAgICAgICAgICAgIHZhbHVlICs9
ICJweCI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpeGVzICM4OTA4LCBpdCBj
YW4gYmUgZG9uZSBtb3JlIGNvcnJlY3RseSBieSBzcGVjaWZ5aW5nIHNldHRlcnMgaW4gY3NzSG9v
a3MsCi0gICAgICAgICAgICAvLyBidXQgaXQgd291bGQgbWVhbiB0byBkZWZpbmUgZWlnaHQgKGZv
ciBldmVyeSBwcm9ibGVtYXRpYyBwcm9wZXJ0eSkgaWRlbnRpY2FsIGZ1bmN0aW9ucwotICAgICAg
ICAgICAgaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5h
bWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7Ci0gICAgICAgICAgICAgICAgc3R5
bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8g
SWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNl
dCB0aGUgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAgICAgICBpZiAoICFob29rcyB8fCAhKCJzZXQi
IGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSwgU2Fm
YXJpCi0gICAgICAgICAgICAgICAgLy8gU2V0dGluZyBzdHlsZSB0byBibGFuayBzdHJpbmcgcmVx
dWlyZWQgdG8gZGVsZXRlICJzdHlsZTogeCAhaW1wb3J0YW50OyIKLSAgICAgICAgICAgICAgICBz
dHlsZVsgbmFtZSBdID0gIiI7Ci0gICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9IHZhbHVl
OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiBh
IGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUK
LSAgICAgICAgICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tz
LmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3
aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKLSAgICAgICAgICAg
IHJldHVybiBzdHlsZVsgbmFtZSBdOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGNzczogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7Ci0gICAgICAgIHZhciB2YWwsIG51
bSwgaG9va3MsCi0gICAgICAgICAgICBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUg
KTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJp
Z2h0IG5hbWUKLSAgICAgICAgbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAo
IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxl
LCBvcmlnTmFtZSApICk7Ci0KLSAgICAgICAgLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQg
dmVyc2lvbgotICAgICAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCi0g
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tz
WyBvcmlnTmFtZSBdOwotCi0gICAgICAgIC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRo
ZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCi0gICAgICAgIGlmICggaG9va3MgJiYgImdldCIg
aW4gaG9va3MgKSB7Ci0gICAgICAgICAgICB2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4
dHJhICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdl
dCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdAotICAgICAgICBpZiAoIHZhbCA9
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBz
dHlsZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY29udmVydCAibm9ybWFsIiB0byBjb21w
dXRlZCB2YWx1ZQotICAgICAgICBpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NO
b3JtYWxUcmFuc2Zvcm0gKSB7Ci0gICAgICAgICAgICB2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1b
IG5hbWUgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiwgY29udmVydGluZyB0byBu
dW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tz
IG51bWVyaWMKLSAgICAgICAgaWYgKCBleHRyYSA9PT0gIiIgfHwgZXh0cmEgKSB7Ci0gICAgICAg
ICAgICBudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsKLSAgICAgICAgICAgIHJldHVybiBleHRyYSA9
PT0gdHJ1ZSB8fCBqUXVlcnkuaXNOdW1lcmljKCBudW0gKSA/IG51bSB8fCAwIDogdmFsOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKFsg
ImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Ci0gICAgalF1ZXJ5LmNz
c0hvb2tzWyBuYW1lIF0gPSB7Ci0gICAgICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVk
LCBleHRyYSApIHsKLSAgICAgICAgICAgIGlmICggY29tcHV0ZWQgKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZp
c2libHkgc2hvdyB0aGVtCi0gICAgICAgICAgICAgICAgLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZl
IGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXMKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3
YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKSA/Ci0gICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRy
YSApOwotICAgICAgICAgICAgICAgICAgICB9KSA6Ci0gICAgICAgICAgICAgICAgICAgIGdldFdp
ZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewotICAg
ICAgICAgICAgdmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApOwotICAgICAg
ICAgICAgcmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgPwotICAg
ICAgICAgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KAotICAgICAgICAgICAgICAgICAgICBl
bGVtLAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBleHRy
YSwKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZh
bHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3giLAotICAgICAgICAgICAgICAgICAgICBzdHls
ZXMKLSAgICAgICAgICAgICAgICApIDogMAotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAg
IH07Ci19KTsKLQotLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKLWpRdWVyeS5jc3NIb29rcy5tYXJn
aW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LAotICAg
IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKLSAgICAgICAgaWYgKCBjb21wdXRlZCApIHsK
LSAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVy
bnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAotICAgICAgICAgICAgLy8gV29yayBhcm91
bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2Nr
Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5s
aW5lLWJsb2NrIiB9LAotICAgICAgICAgICAgICAgIGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmln
aHQiIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSk7Ci0KLS8vIFRoZXNlIGhvb2tzIGFyZSB1c2Vk
IGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMKLWpRdWVyeS5lYWNoKHsKLSAgICBtYXJn
aW46ICIiLAotICAgIHBhZGRpbmc6ICIiLAotICAgIGJvcmRlcjogIldpZHRoIgotfSwgZnVuY3Rp
b24oIHByZWZpeCwgc3VmZml4ICkgewotICAgIGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3Vm
Zml4IF0gPSB7Ci0gICAgICAgIGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkgewotICAgICAgICAg
ICAgdmFyIGkgPSAwLAotICAgICAgICAgICAgICAgIGV4cGFuZGVkID0ge30sCi0KLSAgICAgICAg
ICAgICAgICAvLyBhc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKLSAgICAg
ICAgICAgICAgICBwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxp
dCgiICIpIDogWyB2YWx1ZSBdOwotCi0gICAgICAgICAgICBmb3IgKCA7IGkgPCA0OyBpKysgKSB7
Ci0gICAgICAgICAgICAgICAgZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3Vm
Zml4IF0gPQotICAgICAgICAgICAgICAgICAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBd
IHx8IHBhcnRzWyAwIF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBleHBh
bmRlZDsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBpZiAoICFybWFyZ2luLnRlc3QoIHByZWZp
eCApICkgewotICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9
IHNldFBvc2l0aXZlTnVtYmVyOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAg
ICBjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICAgICAgcmV0dXJuIGFjY2Vzcygg
dGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewotICAgICAgICAgICAgdmFyIHN0
eWxlcywgbGVuLAotICAgICAgICAgICAgICAgIG1hcCA9IHt9LAotICAgICAgICAgICAgICAgIGkg
PSAwOwotCi0gICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Ci0gICAg
ICAgICAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAg
bGVuID0gbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3Mo
IGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwotICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICBqUXVlcnkuc3R5
bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgotICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVs
ZW0sIG5hbWUgKTsKLSAgICAgICAgfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAx
ICk7Ci0gICAgfSwKLSAgICBzaG93OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNob3dI
aWRlKCB0aGlzLCB0cnVlICk7Ci0gICAgfSwKLSAgICBoaWRlOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgcmV0dXJuIHNob3dIaWRlKCB0aGlzICk7Ci0gICAgfSwKLSAgICB0b2dnbGU6IGZ1bmN0aW9u
KCBzdGF0ZSApIHsKLSAgICAgICAgaWYgKCB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiApIHsK
LSAgICAgICAgICAgIHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7Ci0g
ICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAg
ICAgICAgaWYgKCBpc0hpZGRlbiggdGhpcyApICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSgg
dGhpcyApLnNob3coKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgalF1
ZXJ5KCB0aGlzICkuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19
KTsKLQotCi1mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcg
KSB7Ci0gICAgcmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywg
cHJvcCwgZW5kLCBlYXNpbmcgKTsKLX0KLWpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwotCi1Ud2Vlbi5w
cm90b3R5cGUgPSB7Ci0gICAgY29uc3RydWN0b3I6IFR3ZWVuLAotICAgIGluaXQ6IGZ1bmN0aW9u
KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHsKLSAgICAgICAgdGhp
cy5lbGVtID0gZWxlbTsKLSAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKLSAgICAgICAgdGhpcy5l
YXNpbmcgPSBlYXNpbmcgfHwgInN3aW5nIjsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9u
czsKLSAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKLSAgICAgICAg
dGhpcy5lbmQgPSBlbmQ7Ci0gICAgICAgIHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3Nz
TnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKLSAgICB9LAotICAgIGN1cjogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07Ci0K
LSAgICAgICAgcmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/Ci0gICAgICAgICAgICBob29rcy5n
ZXQoIHRoaXMgKSA6Ci0gICAgICAgICAgICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0
aGlzICk7Ci0gICAgfSwKLSAgICBydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkgewotICAgICAgICB2
YXIgZWFzZWQsCi0gICAgICAgICAgICBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9w
IF07Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7Ci0gICAgICAgICAg
ICB0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgKLSAgICAg
ICAgICAgICAgICBwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAx
LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICB0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDsKLSAgICAgICAgfQotICAg
ICAgICB0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMu
c3RhcnQ7Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKLSAgICAgICAgICAg
IHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgewotICAgICAgICAg
ICAgaG9va3Muc2V0KCB0aGlzICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUd2Vl
bi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgfQotfTsKLQotVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0g
VHdlZW4ucHJvdG90eXBlOwotCi1Ud2Vlbi5wcm9wSG9va3MgPSB7Ci0gICAgX2RlZmF1bHQ6IHsK
LSAgICAgICAgZ2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0
OwotCi0gICAgICAgICAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYm
Ci0gICAgICAgICAgICAgICAgKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVb
IHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHdlZW4u
ZWxlbVsgdHdlZW4ucHJvcCBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXNz
aW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9t
YXRpY2FsbHkKLSAgICAgICAgICAgIC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFj
ayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMKLSAgICAgICAgICAgIC8vIHNvLCBzaW1w
bGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQuCi0gICAgICAgICAg
ICAvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzICJyb3RhdGUoMXJhZCkiIGFyZSByZXR1cm5lZCBh
cyBpcy4KLSAgICAgICAgICAgIHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVu
LnByb3AsICIiICk7Ci0gICAgICAgICAgICAvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmlu
ZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAuCi0gICAgICAgICAgICByZXR1cm4gIXJl
c3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7Ci0gICAgICAgIH0sCi0gICAg
ICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgewotICAgICAgICAgICAgLy8gdXNlIHN0ZXAgaG9v
ayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxl
IGlmIGl0cwotICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGll
cyB3aGVyZSBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVu
LnByb3AgXSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBd
KCB0d2VlbiApOwotICAgICAgICAgICAgfSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAo
IHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVs
bCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgewotICAgICAgICAgICAgICAg
IGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4u
dW5pdCApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0d2Vlbi5lbGVt
WyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci19OwotCi0vLyBTdXBwb3J0OiBJRTkKLS8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNl
dHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwotCi1Ud2Vlbi5wcm9wSG9va3Muc2Ny
b2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7Ci0gICAgc2V0OiBmdW5jdGlv
biggdHdlZW4gKSB7Ci0gICAgICAgIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5l
bGVtLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0g
PSB0d2Vlbi5ub3c7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1qUXVlcnkuZWFzaW5nID0gewot
ICAgIGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0sCi0g
ICAgc3dpbmc6IGZ1bmN0aW9uKCBwICkgewotICAgICAgICByZXR1cm4gMC41IC0gTWF0aC5jb3Mo
IHAgKiBNYXRoLlBJICkgLyAyOwotICAgIH0KLX07Ci0KLWpRdWVyeS5meCA9IFR3ZWVuLnByb3Rv
dHlwZS5pbml0OwotCi0vLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludAotalF1ZXJ5
LmZ4LnN0ZXAgPSB7fTsKLQotCi0KLQotdmFyCi0gICAgZnhOb3csIHRpbWVySWQsCi0gICAgcmZ4
dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCi0gICAgcmZ4bnVtID0gbmV3IFJlZ0V4
cCggIl4oPzooWystXSk9fCkoIiArIHBudW0gKyAiKShbYS16JV0qKSQiLCAiaSIgKSwKLSAgICBy
cnVuID0gL3F1ZXVlSG9va3MkLywKLSAgICBhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0
UHJlZmlsdGVyIF0sCi0gICAgdHdlZW5lcnMgPSB7Ci0gICAgICAgICIqIjogWyBmdW5jdGlvbigg
cHJvcCwgdmFsdWUgKSB7Ci0gICAgICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVu
KCBwcm9wLCB2YWx1ZSApLAotICAgICAgICAgICAgICAgIHRhcmdldCA9IHR3ZWVuLmN1cigpLAot
ICAgICAgICAgICAgICAgIHBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbHVlICksCi0gICAgICAgICAg
ICAgICAgdW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBw
cm9wIF0gPyAiIiA6ICJweCIgKSwKLQotICAgICAgICAgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVl
IGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCi0g
ICAgICAgICAgICAgICAgc3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0
ICE9PSAicHgiICYmICt0YXJnZXQgKSAmJgotICAgICAgICAgICAgICAgICAgICByZnhudW0uZXhl
YyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksCi0gICAgICAgICAgICAgICAgc2Nh
bGUgPSAxLAotICAgICAgICAgICAgICAgIG1heEl0ZXJhdGlvbnMgPSAyMDsKLQotICAgICAgICAg
ICAgaWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkgewotICAgICAgICAgICAgICAg
IC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3MKLSAgICAgICAgICAgICAgICB1
bml0ID0gdW5pdCB8fCBzdGFydFsgMyBdOwotCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJl
IHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgotICAgICAgICAgICAgICAg
IHBhcnRzID0gcGFydHMgfHwgW107Ci0KLSAgICAgICAgICAgICAgICAvLyBJdGVyYXRpdmVseSBh
cHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAotICAgICAgICAgICAgICAg
IHN0YXJ0ID0gK3RhcmdldCB8fCAxOwotCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAg
ICAgICAgICAgICAvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVu
dGlsIHdlIGdldCAqc29tZXRoaW5nKgotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYSBzdHJp
bmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxl
IGFzIHVuY2hhbmdlZCBiZWxvdwotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8
ICIuNSI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGFuZCBhcHBseQotICAgICAg
ICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC8gc2NhbGU7Ci0gICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0
d2Vlbi5jdXIoKQotICAgICAgICAgICAgICAgIC8vIEFuZCBicmVha2luZyB0aGUgbG9vcCBpZiBz
Y2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdo
Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIo
KSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzCi0gICAgICAg
ICAgICBpZiAoIHBhcnRzICkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHdlZW4uc3RhcnQg
PSArc3RhcnQgfHwgK3RhcmdldCB8fCAwOwotICAgICAgICAgICAgICAgIHR3ZWVuLnVuaXQgPSB1
bml0OwotICAgICAgICAgICAgICAgIC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3
ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIHR3ZWVuLmVu
ZCA9IHBhcnRzWyAxIF0gPwotICAgICAgICAgICAgICAgICAgICBzdGFydCArICggcGFydHNbIDEg
XSArIDEgKSAqIHBhcnRzWyAyIF0gOgotICAgICAgICAgICAgICAgICAgICArcGFydHNbIDIgXTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICB9IF0K
LSAgICB9OwotCi0vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBz
eW5jaHJvbm91c2x5Ci1mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKLSAgICBzZXRUaW1lb3V0KGZ1
bmN0aW9uKCkgewotICAgICAgICBmeE5vdyA9IHVuZGVmaW5lZDsKLSAgICB9KTsKLSAgICByZXR1
cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwotfQotCi0vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJz
IHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgotZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGlu
Y2x1ZGVXaWR0aCApIHsKLSAgICB2YXIgd2hpY2gsCi0gICAgICAgIGkgPSAwLAotICAgICAgICBh
dHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07Ci0KLSAgICAvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBz
dGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCi0gICAgLy8gaWYgd2Ug
ZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFu
ZCBSaWdodAotICAgIGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwOwotICAgIGZv
ciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7Ci0gICAgICAgIHdoaWNoID0g
Y3NzRXhwYW5kWyBpIF07Ci0gICAgICAgIGF0dHJzWyAibWFyZ2luIiArIHdoaWNoIF0gPSBhdHRy
c1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7Ci0gICAgfQotCi0gICAgaWYgKCBpbmNsdWRl
V2lkdGggKSB7Ci0gICAgICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGF0dHJzOwotfQotCi1mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFs
dWUsIHByb3AsIGFuaW1hdGlvbiApIHsKLSAgICB2YXIgdHdlZW4sCi0gICAgICAgIGNvbGxlY3Rp
b24gPSAoIHR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIHR3ZWVuZXJzWyAiKiIgXSAp
LAotICAgICAgICBpbmRleCA9IDAsCi0gICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3Ro
OwotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7Ci0gICAgICAgIGlmICgg
KHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVl
ICkpICkgewotCi0gICAgICAgICAgICAvLyB3ZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQot
ICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1mdW5jdGlv
biBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHsKLSAgICAvKiBqc2hpbnQg
dmFsaWR0aGlzOiB0cnVlICovCi0gICAgdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBo
b29rcywgb2xkZmlyZSwgZGlzcGxheSwKLSAgICAgICAgYW5pbSA9IHRoaXMsCi0gICAgICAgIG9y
aWcgPSB7fSwKLSAgICAgICAgc3R5bGUgPSBlbGVtLnN0eWxlLAotICAgICAgICBoaWRkZW4gPSBl
bGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCi0gICAgICAgIGRhdGFTaG93ID0gZGF0
YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKLQotICAgIC8vIGhhbmRsZSBxdWV1ZTogZmFs
c2UgcHJvbWlzZXMKLSAgICBpZiAoICFvcHRzLnF1ZXVlICkgewotICAgICAgICBob29rcyA9IGpR
dWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOwotICAgICAgICBpZiAoIGhvb2tzLnVucXVl
dWVkID09IG51bGwgKSB7Ci0gICAgICAgICAgICBob29rcy51bnF1ZXVlZCA9IDA7Ci0gICAgICAg
ICAgICBvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKLSAgICAgICAgICAgIGhvb2tzLmVtcHR5
LmZpcmUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoICFob29rcy51bnF1ZXVl
ZCApIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkZmlyZSgpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgaG9va3MudW5xdWV1ZWQrKzsKLQot
ICAgICAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIC8vIGRvaW5nIHRo
aXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCi0g
ICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyBjb21wbGV0ZXMKLSAgICAgICAgICAgIGFuaW0uYWx3
YXlzKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGhvb2tzLnVucXVldWVkLS07Ci0gICAg
ICAgICAgICAgICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgewot
ICAgICAgICAgICAgICAgICAgICBob29rcy5lbXB0eS5maXJlKCk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIGhlaWdodC93
aWR0aCBvdmVyZmxvdyBwYXNzCi0gICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggImhl
aWdodCIgaW4gcHJvcHMgfHwgIndpZHRoIiBpbiBwcm9wcyApICkgewotICAgICAgICAvLyBNYWtl
IHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKLSAgICAgICAgLy8gUmVjb3JkIGFsbCAzIG92
ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90Ci0gICAgICAgIC8vIGNoYW5n
ZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAotICAgICAgICAvLyBv
dmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQotICAgICAgICBvcHRzLm92ZXJmbG93
ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsK
LQotICAgICAgICAvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhl
aWdodC93aWR0aAotICAgICAgICAvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0
IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkCi0gICAgICAgIGRpc3BsYXkgPSBqUXVl
cnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKLSAgICAgICAgLy8gR2V0IGRlZmF1bHQgZGlzcGxh
eSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAibm9uZSIKLSAgICAgICAgaWYgKCBkaXNwbGF5ID09
PSAibm9uZSIgKSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXkoIGVsZW0u
bm9kZU5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRpc3BsYXkgPT09ICJpbmxpbmUi
ICYmCi0gICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9u
ZSIgKSB7Ci0KLSAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGlmICggb3B0cy5vdmVyZmxvdyApIHsKLSAgICAgICAgc3R5
bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKLSAgICAgICAgYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKLSAgICAg
ICAgICAgIHN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKLSAgICAgICAgICAg
IHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKLSAgICAgICAgfSk7Ci0gICAg
fQotCi0gICAgLy8gc2hvdy9oaWRlIHBhc3MKLSAgICBmb3IgKCBwcm9wIGluIHByb3BzICkgewot
ICAgICAgICB2YWx1ZSA9IHByb3BzWyBwcm9wIF07Ci0gICAgICAgIGlmICggcmZ4dHlwZXMuZXhl
YyggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgcHJvcCBdOwotICAgICAg
ICAgICAgdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKLSAgICAgICAgICAg
IGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ciICkgKSB7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3Bw
ZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdl
IHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgotICAgICAgICAgICAgICAgIGlmICggdmFsdWUg
PT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYg
ZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7Ci0g
ICAgICAgIGlmICggZGF0YVNob3cgKSB7Ci0gICAgICAgICAgICBpZiAoICJoaWRkZW4iIGluIGRh
dGFTaG93ICkgewotICAgICAgICAgICAgICAgIGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFTaG93ID0gZGF0
YV9wcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHt9ICk7Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgp
IHRvICJyZXZlcnNlIgotICAgICAgICBpZiAoIHRvZ2dsZSApIHsKLSAgICAgICAgICAgIGRhdGFT
aG93LmhpZGRlbiA9ICFoaWRkZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBoaWRkZW4gKSB7
Ci0gICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5zaG93KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBhbmltLmRvbmUoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5
KCBlbGVtICkuaGlkZSgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5p
bS5kb25lKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgdmFyIHByb3A7Ci0KLSAgICAgICAgICAg
IGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7Ci0gICAgICAgICAgICBmb3IgKCBw
cm9wIGluIG9yaWcgKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9w
LCBvcmlnWyBwcm9wIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZv
ciAoIHByb3AgaW4gb3JpZyApIHsKLSAgICAgICAgICAgIHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhp
ZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7Ci0KLSAgICAgICAgICAg
IGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkgewotICAgICAgICAgICAgICAgIGRhdGFTaG93
WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKLSAgICAgICAgICAgICAgICBpZiAoIGhpZGRlbiApIHsK
LSAgICAgICAgICAgICAgICAgICAgdHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7Ci0gICAgICAgICAg
ICAgICAgICAgIHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVp
Z2h0IiA/IDEgOiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLX0KLQotZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcg
KSB7Ci0gICAgdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKLQotICAgIC8v
IGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzcwotICAgIGZv
ciAoIGluZGV4IGluIHByb3BzICkgewotICAgICAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSgg
aW5kZXggKTsKLSAgICAgICAgZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwotICAgICAg
ICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwotICAgICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2
YWx1ZSApICkgewotICAgICAgICAgICAgZWFzaW5nID0gdmFsdWVbIDEgXTsKLSAgICAgICAgICAg
IHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKLSAgICAgICAgICAgIHByb3BzWyBuYW1lIF0gPSB2
YWx1ZTsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgaW5kZXggXTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07Ci0gICAgICAgIGlmICggaG9v
a3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4
cGFuZCggdmFsdWUgKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgbmFtZSBdOwotCi0gICAg
ICAgICAgICAvLyBub3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29udCBvdmVyd3JpdGUga2V5cyBh
bHJlYWR5IHByZXNlbnQuCi0gICAgICAgICAgICAvLyBhbHNvIC0gcmV1c2luZyAnaW5kZXgnIGZy
b20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgotICAgICAgICAgICAg
Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBp
biBwcm9wcyApICkgewotICAgICAgICAgICAgICAgICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVl
WyBpbmRleCBdOwotICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0g
ZWFzaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKLSAgICAgICAg
fQotICAgIH0KLX0KLQotZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRp
b25zICkgewotICAgIHZhciByZXN1bHQsCi0gICAgICAgIHN0b3BwZWQsCi0gICAgICAgIGluZGV4
ID0gMCwKLSAgICAgICAgbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCi0gICAg
ICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgIC8vIGRvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3Rvcgot
ICAgICAgICAgICAgZGVsZXRlIHRpY2suZWxlbTsKLSAgICAgICAgfSksCi0gICAgICAgIHRpY2sg
PSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlmICggc3RvcHBlZCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgY3VycmVu
dFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAotICAgICAgICAgICAgICAgIHJlbWFpbmlu
ZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9u
IC0gY3VycmVudFRpbWUgKSwKLSAgICAgICAgICAgICAgICAvLyBhcmNoYWljIGNyYXNoIGJ1ZyB3
b24ndCBhbGxvdyB1cyB0byB1c2UgMSAtICggMC41IHx8IDAgKSAoIzEyNDk3KQotICAgICAgICAg
ICAgICAgIHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKLSAgICAg
ICAgICAgICAgICBwZXJjZW50ID0gMSAtIHRlbXAsCi0gICAgICAgICAgICAgICAgaW5kZXggPSAw
LAotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwotCi0g
ICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLSAgICAgICAg
ICAgICAgICBhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1h
dGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pOwotCi0gICAgICAgICAgICBpZiAoIHBlcmNlbnQg
PCAxICYmIGxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCgg
ZWxlbSwgWyBhbmltYXRpb24gXSApOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgYW5pbWF0aW9uID0gZGVmZXJyZWQucHJv
bWlzZSh7Ci0gICAgICAgICAgICBlbGVtOiBlbGVtLAotICAgICAgICAgICAgcHJvcHM6IGpRdWVy
eS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCi0gICAgICAgICAgICBvcHRzOiBqUXVlcnkuZXh0
ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSwKLSAgICAgICAgICAg
IG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcywKLSAgICAgICAgICAgIG9yaWdpbmFsT3B0
aW9uczogb3B0aW9ucywKLSAgICAgICAgICAgIHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhO
b3coKSwKLSAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLAotICAgICAgICAg
ICAgdHdlZW5zOiBbXSwKLSAgICAgICAgICAgIGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwg
ZW5kICkgewotICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwg
YW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1h
dGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcg
KTsKLSAgICAgICAgICAgICAgICBhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHN0
b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewotICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDAs
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3
YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucwotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndp
c2Ugd2Ugc2tpcCB0aGlzIHBhcnQKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gZ290b0Vu
ZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKLSAgICAgICAgICAgICAgICBpZiAoIHN0
b3BwZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBm
b3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLSAgICAgICAgICAgICAgICAgICAg
YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgICAgICAvLyByZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1l
Ci0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZWplY3QKLSAgICAgICAgICAgICAgICBp
ZiAoIGdvdG9FbmQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRo
KCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmlt
YXRpb24sIGdvdG9FbmQgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSksCi0gICAgICAgIHByb3BzID0g
YW5pbWF0aW9uLnByb3BzOwotCi0gICAgcHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRz
LnNwZWNpYWxFYXNpbmcgKTsKLQotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsr
ICkgewotICAgICAgICByZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwo
IGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7Ci0gICAgICAgIGlmICgg
cmVzdWx0ICkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7Ci0KLSAg
ICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewotICAg
ICAgICBhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKLSAgICB9
Ci0KLSAgICBqUXVlcnkuZngudGltZXIoCi0gICAgICAgIGpRdWVyeS5leHRlbmQoIHRpY2ssIHsK
LSAgICAgICAgICAgIGVsZW06IGVsZW0sCi0gICAgICAgICAgICBhbmltOiBhbmltYXRpb24sCi0g
ICAgICAgICAgICBxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWUKLSAgICAgICAgfSkKLSAgICAp
OwotCi0gICAgLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKLSAgICByZXR1cm4gYW5p
bWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCi0gICAgICAgIC5kb25l
KCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApCi0gICAgICAg
IC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKLSAgICAgICAgLmFsd2F5cyggYW5pbWF0aW9u
Lm9wdHMuYWx3YXlzICk7Ci19Ci0KLWpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBB
bmltYXRpb24sIHsKLQotICAgIHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7
Ci0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7Ci0gICAgICAgICAg
ICBjYWxsYmFjayA9IHByb3BzOwotICAgICAgICAgICAgcHJvcHMgPSBbICIqIiBdOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcHMgPSBwcm9wcy5zcGxpdCgiICIpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdmFyIHByb3AsCi0gICAgICAgICAgICBpbmRleCA9IDAsCi0gICAgICAg
ICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7Ci0KLSAgICAgICAgZm9yICggOyBpbmRleCA8IGxl
bmd0aCA7IGluZGV4KysgKSB7Ci0gICAgICAgICAgICBwcm9wID0gcHJvcHNbIGluZGV4IF07Ci0g
ICAgICAgICAgICB0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKLSAg
ICAgICAgICAgIHR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKLSAgICAgICAg
fQotICAgIH0sCi0KLSAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCAp
IHsKLSAgICAgICAgaWYgKCBwcmVwZW5kICkgewotICAgICAgICAgICAgYW5pbWF0aW9uUHJlZmls
dGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
YW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApOwotICAgICAgICB9Ci0gICAgfQot
fSk7Ci0KLWpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKLSAg
ICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5l
eHRlbmQoIHt9LCBzcGVlZCApIDogewotICAgICAgICBjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVh
c2luZyB8fAotICAgICAgICAgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQs
Ci0gICAgICAgIGR1cmF0aW9uOiBzcGVlZCwKLSAgICAgICAgZWFzaW5nOiBmbiAmJiBlYXNpbmcg
fHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCi0gICAg
fTsKLQotICAgIG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5k
dXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgotICAgICAgICBvcHQuZHVyYXRp
b24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBd
IDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKLQotICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVl
dWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKLSAgICBpZiAoIG9wdC5xdWV1ZSA9PSBu
dWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKLSAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsK
LSAgICB9Ci0KLSAgICAvLyBRdWV1ZWluZwotICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7Ci0K
LSAgICBvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYgKCBqUXVlcnkuaXNG
dW5jdGlvbiggb3B0Lm9sZCApICkgewotICAgICAgICAgICAgb3B0Lm9sZC5jYWxsKCB0aGlzICk7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9wdC5xdWV1ZSApIHsKLSAgICAgICAgICAgIGpR
dWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAg
ICByZXR1cm4gb3B0OwotfTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgZmFkZVRvOiBmdW5j
dGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewotCi0gICAgICAgIC8vIHNob3cg
YW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMAotICAgICAgICBy
ZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkK
LQotICAgICAgICAgICAgLy8gYW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCi0gICAgICAg
ICAgICAuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxi
YWNrICk7Ci0gICAgfSwKLSAgICBhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2lu
ZywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0
KCBwcm9wICksCi0gICAgICAgICAgICBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNp
bmcsIGNhbGxiYWNrICksCi0gICAgICAgICAgICBkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewot
ICAgICAgICAgICAgICAgIC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3Bl
cnR5IGVhc2luZyB3b24ndCBiZSBsb3N0Ci0gICAgICAgICAgICAgICAgdmFyIGFuaW0gPSBBbmlt
YXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwotCi0gICAg
ICAgICAgICAgICAgLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGlt
bWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgaWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0
aGlzLCAiZmluaXNoIiApICkgewotICAgICAgICAgICAgICAgICAgICBhbmltLnN0b3AoIHRydWUg
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZG9Bbmlt
YXRpb24uZmluaXNoID0gZG9BbmltYXRpb247Ci0KLSAgICAgICAgcmV0dXJuIGVtcHR5IHx8IG9w
dGFsbC5xdWV1ZSA9PT0gZmFsc2UgPwotICAgICAgICAgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlv
biApIDoKLSAgICAgICAgICAgIHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24g
KTsKLSAgICB9LAotICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5k
ICkgewotICAgICAgICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgewotICAgICAg
ICAgICAgdmFyIHN0b3AgPSBob29rcy5zdG9wOwotICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0
b3A7Ci0gICAgICAgICAgICBzdG9wKCBnb3RvRW5kICk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAg
aWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICBnb3RvRW5kID0g
Y2xlYXJRdWV1ZTsKLSAgICAgICAgICAgIGNsZWFyUXVldWUgPSB0eXBlOwotICAgICAgICAgICAg
dHlwZSA9IHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGNsZWFyUXVldWUgJiYg
dHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIs
IFtdICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkg
ewotICAgICAgICAgICAgdmFyIGRlcXVldWUgPSB0cnVlLAotICAgICAgICAgICAgICAgIGluZGV4
ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsCi0gICAgICAgICAgICAgICAg
dGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9wcml2
LmdldCggdGhpcyApOwotCi0gICAgICAgICAgICBpZiAoIGluZGV4ICkgewotICAgICAgICAgICAg
ICAgIGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW5kZXggaW4g
ZGF0YSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFb
IGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICgg
aW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKLSAgICAgICAgICAgICAgICBpZiAo
IHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJz
WyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZXJz
WyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApOwotICAgICAgICAgICAgICAgICAgICBkZXF1
ZXVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAx
ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBz
dGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2Vk
Ci0gICAgICAgICAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0
ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQotICAgICAgICAgICAgLy8gYnV0IG9ubHkg
aWYgdGhleSB3ZXJlIGdvdG9FbmQKLSAgICAgICAgICAgIGlmICggZGVxdWV1ZSB8fCAhZ290b0Vu
ZCApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotICAgIGZpbmlzaDogZnVuY3Rpb24oIHR5
cGUgKSB7Ci0gICAgICAgIGlmICggdHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICB0eXBl
ID0gdHlwZSB8fCAiZngiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgaW5kZXgsCi0gICAgICAgICAgICAgICAgZGF0YSA9
IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSwKLSAgICAgICAgICAgICAgICBxdWV1ZSA9IGRhdGFbIHR5
cGUgKyAicXVldWUiIF0sCi0gICAgICAgICAgICAgICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1
ZXVlSG9va3MiIF0sCi0gICAgICAgICAgICAgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAg
ICAgICAgICAgICAgICBsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7Ci0KLSAgICAg
ICAgICAgIC8vIGVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKLSAgICAgICAg
ICAgIGRhdGEuZmluaXNoID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gZW1wdHkgdGhlIHF1ZXVl
IGZpcnN0Ci0gICAgICAgICAgICBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7Ci0KLSAg
ICAgICAgICAgIGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKLSAgICAgICAgICAgICAgICBo
b29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgLy8gbG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW0KLSAg
ICAgICAgICAgIGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNb
IGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVyc1sg
aW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXJzLnNw
bGljZSggaW5kZXgsIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5k
IGZpbmlzaCB0aGVtCi0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3Ro
OyBpbmRleCsrICkgewotICAgICAgICAgICAgICAgIGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVl
dWVbIGluZGV4IF0uZmluaXNoICkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZVsgaW5kZXgg
XS5maW5pc2guY2FsbCggdGhpcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgLy8gdHVybiBvZmYgZmluaXNoaW5nIGZsYWcKLSAgICAgICAgICAgIGRl
bGV0ZSBkYXRhLmZpbmlzaDsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNo
KFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAg
IHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdOwotICAgIGpRdWVyeS5mblsgbmFtZSBdID0g
ZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewotICAgICAgICByZXR1cm4gc3Bl
ZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/Ci0gICAgICAgICAgICBj
c3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgotICAgICAgICAgICAgdGhpcy5hbmltYXRl
KCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwotICAgIH07
Ci19KTsKLQotLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwotalF1
ZXJ5LmVhY2goewotICAgIHNsaWRlRG93bjogZ2VuRngoInNob3ciKSwKLSAgICBzbGlkZVVwOiBn
ZW5GeCgiaGlkZSIpLAotICAgIHNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiksCi0gICAgZmFk
ZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAotICAgIGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUi
IH0sCi0gICAgZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Ci19LCBmdW5jdGlvbigg
bmFtZSwgcHJvcHMgKSB7Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQs
IGVhc2luZywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3Bz
LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwotICAgIH07Ci19KTsKLQotalF1ZXJ5LnRpbWVy
cyA9IFtdOwotalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGltZXIsCi0g
ICAgICAgIGkgPSAwLAotICAgICAgICB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwotCi0gICAgZnhO
b3cgPSBqUXVlcnkubm93KCk7Ci0KLSAgICBmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysg
KSB7Ci0gICAgICAgIHRpbWVyID0gdGltZXJzWyBpIF07Ci0gICAgICAgIC8vIENoZWNrcyB0aGUg
dGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZAotICAgICAgICBpZiAoICF0aW1lcigp
ICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHsKLSAgICAgICAgICAgIHRpbWVycy5zcGxpY2Uo
IGktLSwgMSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhdGltZXJzLmxlbmd0aCAp
IHsKLSAgICAgICAgalF1ZXJ5LmZ4LnN0b3AoKTsKLSAgICB9Ci0gICAgZnhOb3cgPSB1bmRlZmlu
ZWQ7Ci19OwotCi1qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7Ci0gICAgalF1
ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApOwotICAgIGlmICggdGltZXIoKSApIHsKLSAgICAgICAg
alF1ZXJ5LmZ4LnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgalF1ZXJ5LnRpbWVycy5w
b3AoKTsKLSAgICB9Ci19OwotCi1qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKLQotalF1ZXJ5LmZ4
LnN0YXJ0ID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAhdGltZXJJZCApIHsKLSAgICAgICAgdGlt
ZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7
Ci0gICAgfQotfTsKLQotalF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHsKLSAgICBjbGVhcklu
dGVydmFsKCB0aW1lcklkICk7Ci0gICAgdGltZXJJZCA9IG51bGw7Ci19OwotCi1qUXVlcnkuZngu
c3BlZWRzID0gewotICAgIHNsb3c6IDYwMCwKLSAgICBmYXN0OiAyMDAsCi0gICAgLy8gRGVmYXVs
dCBzcGVlZAotICAgIF9kZWZhdWx0OiA0MDAKLX07Ci0KLQotLy8gQmFzZWQgb2ZmIG9mIHRoZSBw
bHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgotLy8gaHR0cDovL2JsaW5k
c2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwotalF1ZXJ5LmZuLmRl
bGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7Ci0gICAgdGltZSA9IGpRdWVyeS5meCA/IGpR
dWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKLSAgICB0eXBlID0gdHlwZSB8
fCAiZngiOwotCi0gICAgcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBo
b29rcyApIHsKLSAgICAgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7
Ci0gICAgICAgIGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNsZWFyVGlt
ZW91dCggdGltZW91dCApOwotICAgICAgICB9OwotICAgIH0pOwotfTsKLQotCi0oZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAot
ICAgICAgICBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic2VsZWN0IiApLAotICAg
ICAgICBvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJv
cHRpb24iICkgKTsKLQotICAgIGlucHV0LnR5cGUgPSAiY2hlY2tib3giOwotCi0gICAgLy8gU3Vw
cG9ydDogaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCi0gICAgLy8gQ2hlY2sgdGhl
IGRlZmF1bHQgY2hlY2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIG9sZCBXZWJLaXQ7ICJvbiIgZWxz
ZXdoZXJlKQotICAgIHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSAiIjsKLQotICAg
IC8vIE11c3QgYWNjZXNzIHRoZSBwYXJlbnQgdG8gbWFrZSBhbiBvcHRpb24gc2VsZWN0IHByb3Bl
cmx5Ci0gICAgLy8gU3VwcG9ydDogSUU5LCBJRTEwCi0gICAgc3VwcG9ydC5vcHRTZWxlY3RlZCA9
IG9wdC5zZWxlY3RlZDsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lk
ZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKLSAgICAvLyAoV2Vi
S2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCi0gICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsK
LSAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKLQotICAgIC8vIENoZWNr
IGlmIGFuIGlucHV0IG1haW50YWlucyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpbwot
ICAgIC8vIFN1cHBvcnQ6IElFOSwgSUUxMAotICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCggImlucHV0IiApOwotICAgIGlucHV0LnZhbHVlID0gInQiOwotICAgIGlucHV0LnR5cGUg
PSAicmFkaW8iOwotICAgIHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7
Ci19KSgpOwotCi0KLXZhciBub2RlSG9vaywgYm9vbEhvb2ssCi0gICAgYXR0ckhhbmRsZSA9IGpR
dWVyeS5leHByLmF0dHJIYW5kbGU7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIGF0dHI6IGZ1
bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgalF1
ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwotICAgIH0sCi0K
LSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBu
YW1lICk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICBh
dHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBob29rcywg
cmV0LAotICAgICAgICAgICAgblR5cGUgPSBlbGVtLm5vZGVUeXBlOwotCi0gICAgICAgIC8vIGRv
bid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9k
ZXMKLSAgICAgICAgaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBu
VHlwZSA9PT0gMiApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCi0g
ICAgICAgIGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlCi0gICAg
ICAgIC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKLSAgICAgICAgaWYg
KCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7Ci0gICAgICAgICAg
ICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgaG9va3MgPSBqUXVlcnku
YXR0ckhvb2tzWyBuYW1lIF0gfHwKLSAgICAgICAgICAgICAgICAoIGpRdWVyeS5leHByLm1hdGNo
LmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewotCi0gICAgICAgICAgICBpZiAo
IHZhbHVlID09PSBudWxsICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCBl
bGVtLCBuYW1lICk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIGhvb2tzICYmICJzZXQiIGlu
IGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRl
ZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAi
IiApOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICB9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Mu
Z2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsK
LQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0galF1ZXJ5LmZpbmQuYXR0cigg
ZWxlbSwgbmFtZSApOwotCi0gICAgICAgICAgICAvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyBy
ZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAotICAgICAgICAgICAgcmV0dXJu
IHJldCA9PSBudWxsID8KLSAgICAgICAgICAgICAgICB1bmRlZmluZWQgOgotICAgICAgICAgICAg
ICAgIHJldDsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbigg
ZWxlbSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBuYW1lLCBwcm9wTmFtZSwKLSAgICAgICAgICAg
IGkgPSAwLAotICAgICAgICAgICAgYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJu
b3R3aGl0ZSApOwotCi0gICAgICAgIGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIChuYW1lID0gYXR0ck5hbWVzW2krK10pICkgewot
ICAgICAgICAgICAgICAgIHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1l
OwotCi0gICAgICAgICAgICAgICAgLy8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRy
ZWF0bWVudCAoIzEwODcwKQotICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmV4cHIubWF0Y2gu
Ym9vbC50ZXN0KCBuYW1lICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNldCBjb3JyZXNw
b25kaW5nIHByb3BlcnR5IHRvIGZhbHNlCi0gICAgICAgICAgICAgICAgICAgIGVsZW1bIHByb3BO
YW1lIF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVt
LnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fSwKLQotICAgIGF0dHJIb29rczogewotICAgICAgICB0eXBlOiB7Ci0gICAgICAgICAgICBzZXQ6
IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFzdXBwb3J0
LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKLSAgICAgICAgICAgICAgICAgICAg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7Ci0gICAgICAgICAgICAgICAgICAg
IC8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJl
c2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdmFs
dWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVh
dGlvbgotICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gZWxlbS52YWx1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgdmFsdWUgKTsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCB2YWwgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnZh
bHVlID0gdmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci19KTsKLQotLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwotYm9vbEhvb2sg
PSB7Ci0gICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Ci0gICAgICAgIGlm
ICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGJvb2xlYW4gYXR0
cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQotICAgICAgICAgICAgalF1ZXJ5LnJlbW92ZUF0dHIo
IGVsZW0sIG5hbWUgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uc2V0QXR0
cmlidXRlKCBuYW1lLCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0g
ICAgfQotfTsKLWpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRj
aCggL1x3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAgIHZhciBnZXR0ZXIgPSBhdHRy
SGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjsKLQotICAgIGF0dHJIYW5kbGVbIG5h
bWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLSAgICAgICAgdmFyIHJldCwg
aGFuZGxlOwotICAgICAgICBpZiAoICFpc1hNTCApIHsKLSAgICAgICAgICAgIC8vIEF2b2lkIGFu
IGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9t
IHRoZSBnZXR0ZXIKLSAgICAgICAgICAgIGhhbmRsZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTsKLSAg
ICAgICAgICAgIGF0dHJIYW5kbGVbIG5hbWUgXSA9IHJldDsKLSAgICAgICAgICAgIHJldCA9IGdl
dHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBuYW1l
LnRvTG93ZXJDYXNlKCkgOgotICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgICAgICBhdHRy
SGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsK
LSAgICB9OwotfSk7Ci0KLQotCi0KLXZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8
dGV4dGFyZWF8YnV0dG9uKSQvaTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgcHJvcDogZnVu
Y3Rpb24oIG5hbWUsIHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVl
cnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Ci0gICAgfSwKLQot
ICAgIHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewotICAgICAgICByZXR1cm4gdGhpcy5l
YWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4
WyBuYW1lIF0gfHwgbmFtZSBdOwotICAgICAgICB9KTsKLSAgICB9Ci19KTsKLQotalF1ZXJ5LmV4
dGVuZCh7Ci0gICAgcHJvcEZpeDogewotICAgICAgICAiZm9yIjogImh0bWxGb3IiLAotICAgICAg
ICAiY2xhc3MiOiAiY2xhc3NOYW1lIgotICAgIH0sCi0KLSAgICBwcm9wOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciByZXQsIGhvb2tzLCBub3R4bWwsCi0gICAg
ICAgICAgICBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7Ci0KLSAgICAgICAgLy8gZG9uJ3QgZ2V0L3Nl
dCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwotICAgICAg
ICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAy
ICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbm90eG1sID0g
blR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwotCi0gICAgICAgIGlmICgg
bm90eG1sICkgewotICAgICAgICAgICAgLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwotICAg
ICAgICAgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKLSAgICAgICAg
ICAgIGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgcmV0dXJuIGhvb2tz
ICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1l
ICkpICE9PSB1bmRlZmluZWQgPwotICAgICAgICAgICAgICAgIHJldCA6Ci0gICAgICAgICAgICAg
ICAgKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICByZXR1cm4gaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCgg
ZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgcmV0IDoKLSAgICAgICAg
ICAgICAgICBlbGVtWyBuYW1lIF07Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgcHJvcEhvb2tz
OiB7Ci0gICAgICAgIHRhYkluZGV4OiB7Ci0gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmhhc0F0dHJpYnV0ZSggInRhYmluZGV4
IiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/Ci0g
ICAgICAgICAgICAgICAgICAgIGVsZW0udGFiSW5kZXggOgotICAgICAgICAgICAgICAgICAgICAt
MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0pOwotCi0vLyBTdXBwb3J0OiBJ
RTkrCi0vLyBTZWxlY3RlZG5lc3MgZm9yIGFuIG9wdGlvbiBpbiBhbiBvcHRncm91cCBjYW4gYmUg
aW5hY2N1cmF0ZQotaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKLSAgICBqUXVlcnkucHJv
cEhvb2tzLnNlbGVjdGVkID0gewotICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAg
ICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKLSAgICAgICAgICAgIGlmICgg
cGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIHBhcmVudC5w
YXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH07Ci19Ci0KLWpRdWVyeS5lYWNoKFsKLSAgICAidGFi
SW5kZXgiLAotICAgICJyZWFkT25seSIsCi0gICAgIm1heExlbmd0aCIsCi0gICAgImNlbGxTcGFj
aW5nIiwKLSAgICAiY2VsbFBhZGRpbmciLAotICAgICJyb3dTcGFuIiwKLSAgICAiY29sU3BhbiIs
Ci0gICAgInVzZU1hcCIsCi0gICAgImZyYW1lQm9yZGVyIiwKLSAgICAiY29udGVudEVkaXRhYmxl
IgotXSwgZnVuY3Rpb24oKSB7Ci0gICAgalF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2Uo
KSBdID0gdGhpczsKLX0pOwotCi0KLQotCi12YXIgcmNsYXNzID0gL1tcdFxyXG5cZl0vZzsKLQot
alF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAg
ICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsCi0gICAg
ICAgICAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSwKLSAg
ICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAg
ICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlz
ICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKLSAg
ICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwcm9jZWVkICkgewotICAg
ICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aW9uIGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2li
aWxpdHkgKHNlZSByZW1vdmVDbGFzcykKLSAgICAgICAgICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8
ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdOwotCi0gICAgICAgICAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKLSAgICAgICAgICAgICAgICBlbGVtID0gdGhpc1sgaSBdOwotICAgICAg
ICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/
Ci0gICAgICAgICAgICAgICAgICAgICggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBs
YWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAgICAgICAgICAgICAgICAgIiAiCi0gICAgICAgICAg
ICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlmICggY3VyICkgewotICAgICAgICAgICAgICAg
ICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2Vz
W2orK10pICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAi
ICsgY2xhenogKyAiICIgKSA8IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vy
ICs9IGNsYXp6ICsgIiAiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBhc3NpZ24gaWYgZGlmZmVy
ZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgZmlu
YWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBl
bGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVy
biB0aGlzOwotICAgIH0sCi0KLSAgICByZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgewot
ICAgICAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwKLSAg
ICAgICAgICAgIHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1
ZSA9PT0gInN0cmluZyIgJiYgdmFsdWUsCi0gICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAg
IGxlbiA9IHRoaXMubGVuZ3RoOwotCi0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZh
bHVlICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewot
ICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0
aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAoIHByb2NlZWQgKSB7Ci0gICAgICAgICAgICBjbGFzc2VzID0gKCB2YWx1ZSB8
fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKLQotICAgICAgICAgICAgZm9yICggOyBp
IDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgZWxlbSA9IHRoaXNbIGkgXTsKLSAgICAg
ICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNz
aWJpbGl0eSAoc2VlIGFkZENsYXNzKQotICAgICAgICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5
cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICggIiAi
ICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAg
ICAgICAgICAgICAgICAgIiIKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAg
aWYgKCBjdXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBjbGF6eiArICIgIiApID49IDAgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLnJlcGxhY2UoICIgIiArIGNsYXp6ICsg
IiAiLCAiICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0
byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsVmFs
dWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6ICIiOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoIGVsZW0uY2xhc3NOYW1lICE9PSBmaW5hbFZhbHVlICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgZWxlbS5jbGFzc05hbWUgPSBmaW5hbFZhbHVlOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAg
ICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFs
dWUsIHN0YXRlVmFsICkgewotICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKLQotICAg
ICAgICBpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iICYmIHR5cGUgPT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFs
dWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewotICAgICAgICAgICAgcmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbiggaSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS50
b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwp
LCBzdGF0ZVZhbCApOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgaWYgKCB0eXBlID09PSAic3Ry
aW5nIiApIHsKLSAgICAgICAgICAgICAgICAvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1l
cwotICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIGkg
PSAwLAotICAgICAgICAgICAgICAgICAgICBzZWxmID0galF1ZXJ5KCB0aGlzICksCi0gICAgICAg
ICAgICAgICAgICAgIGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107
Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysg
XSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVu
LCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoIHNlbGYuaGFz
Q2xhc3MoIGNsYXNzTmFtZSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1v
dmVDbGFzcyggY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVG9nZ2xl
IHdob2xlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVu
ZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCB0
aGlzLmNsYXNzTmFtZSApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgY2xhc3NOYW1l
IGlmIHNldAotICAgICAgICAgICAgICAgICAgICBkYXRhX3ByaXYuc2V0KCB0aGlzLCAiX19jbGFz
c05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBw
YXNzZWQgImZhbHNlIiwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUg
Y2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLgotICAgICAg
ICAgICAgICAgIC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5
IHNhdmVkIChpZiBhbnl0aGluZyksCi0gICAgICAgICAgICAgICAgLy8gZmFsbGluZyBiYWNrIHRv
IHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgotICAgICAgICAgICAgICAg
IHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIg
OiBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSwKLQotICAgIGhhc0NsYXNzOiBmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7Ci0gICAgICAgIHZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwK
LSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoOwotICAgICAg
ICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXNbaV0ubm9kZVR5
cGUgPT09IDEgJiYgKCIgIiArIHRoaXNbaV0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFz
cywgIiAiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkgewotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLX0pOwotCi0KLQotCi12YXIgcnJldHVybiA9IC9cci9nOwotCi1qUXVlcnku
Zm4uZXh0ZW5kKHsKLSAgICB2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAgICAgICAgdmFyIGhv
b2tzLCByZXQsIGlzRnVuY3Rpb24sCi0gICAgICAgICAgICBlbGVtID0gdGhpc1swXTsKLQotICAg
ICAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewotICAgICAgICAgICAgaWYgKCBlbGVtICkg
ewotICAgICAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8
fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0gICAg
ICAgICAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Mu
Z2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0
ID0gZWxlbS52YWx1ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAi
c3RyaW5nIiA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJp
bmcgY2FzZXMKLSAgICAgICAgICAgICAgICAgICAgcmV0LnJlcGxhY2UocnJldHVybiwgIiIpIDoK
LSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwv
dW5kZWYgb3IgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIHJldCA9PSBudWxsID8gIiIgOiBy
ZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKLQotICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAgICAgdmFyIHZhbDsK
LQotICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgewotICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9u
ICkgewotICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSgg
dGhpcyApLnZhbCgpICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZh
bCA9IHZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUcmVhdCBudWxsL3Vu
ZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZwotICAgICAgICAgICAgaWYg
KCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB2YWwgPSAiIjsKLQotICAgICAgICAg
ICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7Ci0gICAgICAgICAgICAg
ICAgdmFsICs9ICIiOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSgg
dmFsICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlv
biggdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8g
IiIgOiB2YWx1ZSArICIiOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5
LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKLQotICAgICAgICAgICAg
Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcK
LSAgICAgICAgICAgIGlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNl
dCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICAg
ICB0aGlzLnZhbHVlID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19
KTsKLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgdmFsSG9va3M6IHsKLSAgICAgICAgc2VsZWN0OiB7
Ci0gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHZh
ciB2YWx1ZSwgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZWxlbS5vcHRp
b25zLAotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKLSAg
ICAgICAgICAgICAgICAgICAgb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5k
ZXggPCAwLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCi0g
ICAgICAgICAgICAgICAgICAgIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3Ro
LAotICAgICAgICAgICAgICAgICAgICBpID0gaW5kZXggPCAwID8KLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1heCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbmUgPyBpbmRleCA6IDA7Ci0K
LSAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25z
Ci0gICAgICAgICAgICAgICAgZm9yICggOyBpIDwgbWF4OyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJ
RTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSkKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCAp
ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMg
dGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQg
OiBvcHRpb24uZ2V0QXR0cmlidXRlKCAiZGlzYWJsZWQiICkgPT09IG51bGwgKSAmJgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFq
UXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKLQot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhl
IG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiAp
LnZhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIGFuIGFy
cmF5IGZvciBvbmUgc2VsZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbmUgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNdWx0aS1TZWxlY3Rz
IHJldHVybiBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goIHZh
bHVlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAg
c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG9wdGlv
blNldCwgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZWxlbS5vcHRpb25z
LAotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSAp
LAotICAgICAgICAgICAgICAgICAgICBpID0gb3B0aW9ucy5sZW5ndGg7Ci0KLSAgICAgICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9u
c1sgaSBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoIChvcHRpb24uc2VsZWN0ZWQgPSBqUXVl
cnkuaW5BcnJheSggalF1ZXJ5KG9wdGlvbikudmFsKCksIHZhbHVlcyApID49IDApICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgb3B0aW9uU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZvcmNlIGJyb3dz
ZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0
Ci0gICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9uU2V0ICkgewotICAgICAgICAgICAgICAgICAg
ICBlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0p
OwotCi0vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgotalF1ZXJ5LmVhY2go
WyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewotICAgIGpRdWVyeS52YWxIb29r
c1sgdGhpcyBdID0gewotICAgICAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAg
ICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52
YWwoKSwgdmFsdWUgKSA+PSAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Owot
ICAgIGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHsKLSAgICAgICAgalF1ZXJ5LnZhbEhvb2tzWyB0
aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0OiBX
ZWJraXQKLSAgICAgICAgICAgIC8vICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBh
IHZhbHVlIGlzbid0IHNwZWNpZmllZAotICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmli
dXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7Ci0gICAgICAgIH07Ci0g
ICAgfQotfSk7Ci0KLQotCi0KLS8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBp
bmNsdXNpb24KLQotCi1qUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQg
bG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKLSAgICAibW91c2Vk
b3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNl
bGVhdmUgIiArCi0gICAgImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5
dXAgZXJyb3IgY29udGV4dG1lbnUiKS5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsK
LQotICAgIC8vIEhhbmRsZSBldmVudCBiaW5kaW5nCi0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBm
dW5jdGlvbiggZGF0YSwgZm4gKSB7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4g
MCA/Ci0gICAgICAgICAgICB0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDoKLSAgICAg
ICAgICAgIHRoaXMudHJpZ2dlciggbmFtZSApOwotICAgIH07Ci19KTsKLQotalF1ZXJ5LmZuLmV4
dGVuZCh7Ci0gICAgaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewotICAgICAgICBy
ZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92
ZXIgKTsKLSAgICB9LAotCi0gICAgYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsK
LSAgICAgICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOwotICAgIH0s
Ci0gICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewotICAgICAgICByZXR1cm4gdGhp
cy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOwotICAgIH0sCi0KLSAgICBkZWxlZ2F0ZTogZnVuY3Rp
b24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9u
KCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7Ci0gICAgfSwKLSAgICB1bmRlbGVnYXRlOiBm
dW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHsKLSAgICAgICAgLy8gKCBuYW1lc3BhY2Ug
KSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQotICAgICAgICByZXR1cm4gYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5
cGVzLCBzZWxlY3RvciB8fCAiKioiLCBmbiApOwotICAgIH0KLX0pOwotCi0KLXZhciBub25jZSA9
IGpRdWVyeS5ub3coKTsKLQotdmFyIHJxdWVyeSA9ICgvXD8vKTsKLQotCi0KLS8vIFN1cHBvcnQ6
IEFuZHJvaWQgMi4zCi0vLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBp
bnB1dAotalF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgewotICAgIHJldHVybiBK
U09OLnBhcnNlKCBkYXRhICsgIiIgKTsKLX07Ci0KLQotLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFy
c2luZwotalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7Ci0gICAgdmFyIHhtbCwg
dG1wOwotICAgIGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewotICAg
ICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTkKLSAgICB0cnkg
ewotICAgICAgICB0bXAgPSBuZXcgRE9NUGFyc2VyKCk7Ci0gICAgICAgIHhtbCA9IHRtcC5wYXJz
ZUZyb21TdHJpbmcoIGRhdGEsICJ0ZXh0L3htbCIgKTsKLSAgICB9IGNhdGNoICggZSApIHsKLSAg
ICAgICAgeG1sID0gdW5kZWZpbmVkOwotICAgIH0KLQotICAgIGlmICggIXhtbCB8fCB4bWwuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7Ci0gICAgICAgIGpR
dWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwotICAgIH0KLSAgICByZXR1cm4g
eG1sOwotfTsKLQotCi12YXIKLSAgICAvLyBEb2N1bWVudCBsb2NhdGlvbgotICAgIGFqYXhMb2NQ
YXJ0cywKLSAgICBhamF4TG9jYXRpb24sCi0KLSAgICByaGFzaCA9IC8jLiokLywKLSAgICBydHMg
PSAvKFs/Jl0pXz1bXiZdKi8sCi0gICAgcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5d
KikkL21nLAotICAgIC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVj
dGlvbgotICAgIHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8List
ZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCi0gICAgcm5vQ29udGVudCA9IC9eKD86R0VU
fEhFQUQpJC8sCi0gICAgcnByb3RvY29sID0gL15cL1wvLywKLSAgICBydXJsID0gL14oW1x3List
XSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sCi0KLSAg
ICAvKiBQcmVmaWx0ZXJzCi0gICAgICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBj
dXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKLSAgICAg
KiAyKSBUaGVzZSBhcmUgY2FsbGVkOgotICAgICAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0
cmFuc3BvcnQKLSAgICAgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBp
cyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCi0gICAgICogMykga2V5IGlzIHRo
ZSBkYXRhVHlwZQotICAgICAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2Vk
Ci0gICAgICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUg
YW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCi0gICAgICovCi0gICAgcHJl
ZmlsdGVycyA9IHt9LAotCi0gICAgLyogVHJhbnNwb3J0cyBiaW5kaW5ncwotICAgICAqIDEpIGtl
eSBpcyB0aGUgZGF0YVR5cGUKLSAgICAgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4g
YmUgdXNlZAotICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRh
dGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKLSAgICAgKi8KLSAgICB0cmFuc3Bv
cnRzID0ge30sCi0KLSAgICAvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgj
MTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KLSAgICBhbGxU
eXBlcyA9ICIqLyIuY29uY2F0KCIqIik7Ci0KLS8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhj
ZXB0aW9uIHdoZW4gYWNjZXNzaW5nCi0vLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlm
IGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKLXRyeSB7Ci0gICAgYWpheExvY2F0aW9uID0g
bG9jYXRpb24uaHJlZjsKLX0gY2F0Y2goIGUgKSB7Ci0gICAgLy8gVXNlIHRoZSBocmVmIGF0dHJp
YnV0ZSBvZiBhbiBBIGVsZW1lbnQKLSAgICAvLyBzaW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZl
biBkb2N1bWVudC5sb2NhdGlvbgotICAgIGFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJhIiApOwotICAgIGFqYXhMb2NhdGlvbi5ocmVmID0gIiI7Ci0gICAgYWpheExvY2F0
aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Ci19Ci0KLS8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBw
YXJ0cwotYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2Uo
KSApIHx8IFtdOwotCi0vLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmls
dGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAotZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JU
cmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7Ci0KLSAgICAvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMg
b3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgotICAgIHJldHVybiBmdW5jdGlvbiggZGF0YVR5
cGVFeHByZXNzaW9uLCBmdW5jICkgewotCi0gICAgICAgIGlmICggdHlwZW9mIGRhdGFUeXBlRXhw
cmVzc2lvbiAhPT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICBmdW5jID0gZGF0YVR5cGVFeHBy
ZXNzaW9uOwotICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOwotICAgICAgICB9
Ci0KLSAgICAgICAgdmFyIGRhdGFUeXBlLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAg
ICBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5v
dHdoaXRlICkgfHwgW107Ci0KLSAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyAp
ICkgewotICAgICAgICAgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhw
cmVzc2lvbgotICAgICAgICAgICAgd2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkg
KSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAg
ICAgICBpZiAoIGRhdGFUeXBlWzBdID09PSAiKyIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRh
dGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCAiKiI7Ci0gICAgICAgICAgICAgICAgICAg
IChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVu
c2hpZnQoIGZ1bmMgKTsKLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKLSAg
ICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAoc3RydWN0dXJlWyBk
YXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLX0KLQot
Ly8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRz
Ci1mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRp
b25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkgewotCi0gICAgdmFyIGluc3BlY3RlZCA9IHt9
LAotICAgICAgICBzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMg
KTsKLQotICAgIGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkgewotICAgICAgICB2YXIgc2Vs
ZWN0ZWQ7Ci0gICAgICAgIGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7Ci0gICAgICAgIGpR
dWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVm
aWx0ZXJPckZhY3RvcnkgKSB7Ci0gICAgICAgICAgICB2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9
IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApOwot
ICAgICAgICAgICAgaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIg
JiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBd
ICkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBl
T3JUcmFuc3BvcnQgKTsKLSAgICAgICAgICAgICAgICBpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNw
b3J0ICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNl
IGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISggc2Vs
ZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0p
OwotICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGluc3BlY3Qo
IG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyAiKiIgXSAmJiBpbnNwZWN0
KCAiKiIgKTsKLX0KLQotLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zCi0vLyB0
aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLS8vIEZp
eGVzICM5ODg3Ci1mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHsKLSAgICB2YXIg
a2V5LCBkZWVwLAotICAgICAgICBmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxh
dE9wdGlvbnMgfHwge307Ci0KLSAgICBmb3IgKCBrZXkgaW4gc3JjICkgewotICAgICAgICBpZiAo
IHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICggZmxhdE9wdGlvbnNb
IGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNb
IGtleSBdOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICggZGVlcCApIHsKLSAgICAgICAgalF1
ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRh
cmdldDsKLX0KLQotLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgotICog
LSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBl
IGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKLSAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBy
ZXNwb25zZQotICovCi1mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVz
cG9uc2VzICkgewotCi0gICAgdmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFU
eXBlLAotICAgICAgICBjb250ZW50cyA9IHMuY29udGVudHMsCi0gICAgICAgIGRhdGFUeXBlcyA9
IHMuZGF0YVR5cGVzOwotCi0gICAgLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250
ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3MKLSAgICB3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAi
KiIgKSB7Ci0gICAgICAgIGRhdGFUeXBlcy5zaGlmdCgpOwotICAgICAgICBpZiAoIGN0ID09PSB1
bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVz
cG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8g
Q2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlCi0gICAgaWYg
KCBjdCApIHsKLSAgICAgICAgZm9yICggdHlwZSBpbiBjb250ZW50cyApIHsKLSAgICAgICAgICAg
IGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7
Ci0gICAgICAgICAgICAgICAgZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENo
ZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlw
ZQotICAgIGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkgewotICAgICAgICBmaW5h
bERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVHJ5
IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwotICAgICAgICBmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyAp
IHsKLSAgICAgICAgICAgIGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlw
ZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewotICAgICAgICAgICAgICAgIGZpbmFsRGF0YVR5
cGUgPSB0eXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKLSAgICAgICAgICAgICAgICBmaXJzdERhdGFU
eXBlID0gdHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBPciBqdXN0
IHVzZSBmaXJzdCBvbmUKLSAgICAgICAgZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwg
Zmlyc3REYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCi0g
ICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKLSAgICAvLyBh
bmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCi0gICAgaWYgKCBmaW5hbERhdGFU
eXBlICkgewotICAgICAgICBpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkg
ewotICAgICAgICAgICAgZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Ci0gICAgfQot
fQotCi0vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdp
bmFsIHJlc3BvbnNlCi0gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUg
anFYSFIgaW5zdGFuY2UKLSAqLwotZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBq
cVhIUiwgaXNTdWNjZXNzICkgewotICAgIHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBw
cmV2LAotICAgICAgICBjb252ZXJ0ZXJzID0ge30sCi0gICAgICAgIC8vIFdvcmsgd2l0aCBhIGNv
cHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNp
b24KLSAgICAgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTsKLQotICAgIC8vIENy
ZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwotICAgIGlmICggZGF0YVR5
cGVzWyAxIF0gKSB7Ci0gICAgICAgIGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkgewotICAg
ICAgICAgICAgY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNb
IGNvbnYgXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hp
ZnQoKTsKLQotICAgIC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCi0gICAg
d2hpbGUgKCBjdXJyZW50ICkgewotCi0gICAgICAgIGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3Vy
cmVudCBdICkgewotICAgICAgICAgICAganFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQg
XSBdID0gcmVzcG9uc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcHBseSB0aGUgZGF0YUZp
bHRlciBpZiBwcm92aWRlZAotICAgICAgICBpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRh
dGFGaWx0ZXIgKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9u
c2UsIHMuZGF0YVR5cGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXYgPSBjdXJyZW50Owot
ICAgICAgICBjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7Ci0KLSAgICAgICAgaWYgKCBjdXJy
ZW50ICkgewotCi0gICAgICAgIC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQg
ZGF0YVR5cGUgaXMgbm9uLWF1dG8KLSAgICAgICAgICAgIGlmICggY3VycmVudCA9PT0gIioiICkg
ewotCi0gICAgICAgICAgICAgICAgY3VycmVudCA9IHByZXY7Ci0KLSAgICAgICAgICAgIC8vIENv
bnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBm
cm9tIGN1cnJlbnQKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2
ICE9PSBjdXJyZW50ICkgewotCi0gICAgICAgICAgICAgICAgLy8gU2VlayBhIGRpcmVjdCBjb252
ZXJ0ZXIKLSAgICAgICAgICAgICAgICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1
cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOwotCi0gICAgICAgICAgICAg
ICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKLSAgICAgICAgICAgICAgICBpZiAoICFj
b252ICkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkg
ewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQK
LSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGNvbnYyLnNwbGl0KCAiICIgKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNj
ZXB0ZWQgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ID0gY29udmVydGVy
c1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBdIF07Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBjb252ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOwotCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUg
ZGF0YVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY29u
dmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKQotICAgICAg
ICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsKLQotICAgICAgICAgICAgICAgICAgICAv
LyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0
aGVtCi0gICAgICAgICAgICAgICAgICAgIGlmICggY29udiAmJiBzWyAidGhyb3dzIiBdICkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwotICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogInBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYg
PyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgcHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVy
biB7IHN0YXRlOiAic3VjY2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07Ci19Ci0KLWpRdWVyeS5leHRl
bmQoewotCi0gICAgLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBx
dWVyaWVzCi0gICAgYWN0aXZlOiAwLAotCi0gICAgLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2Fj
aGUgZm9yIG5leHQgcmVxdWVzdAotICAgIGxhc3RNb2RpZmllZDoge30sCi0gICAgZXRhZzoge30s
Ci0KLSAgICBhamF4U2V0dGluZ3M6IHsKLSAgICAgICAgdXJsOiBhamF4TG9jYXRpb24sCi0gICAg
ICAgIHR5cGU6ICJHRVQiLAotICAgICAgICBpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBh
amF4TG9jUGFydHNbIDEgXSApLAotICAgICAgICBnbG9iYWw6IHRydWUsCi0gICAgICAgIHByb2Nl
c3NEYXRhOiB0cnVlLAotICAgICAgICBhc3luYzogdHJ1ZSwKLSAgICAgICAgY29udGVudFR5cGU6
ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAotICAg
ICAgICAvKgotICAgICAgICB0aW1lb3V0OiAwLAotICAgICAgICBkYXRhOiBudWxsLAotICAgICAg
ICBkYXRhVHlwZTogbnVsbCwKLSAgICAgICAgdXNlcm5hbWU6IG51bGwsCi0gICAgICAgIHBhc3N3
b3JkOiBudWxsLAotICAgICAgICBjYWNoZTogbnVsbCwKLSAgICAgICAgdGhyb3dzOiBmYWxzZSwK
LSAgICAgICAgdHJhZGl0aW9uYWw6IGZhbHNlLAotICAgICAgICBoZWFkZXJzOiB7fSwKLSAgICAg
ICAgKi8KLQotICAgICAgICBhY2NlcHRzOiB7Ci0gICAgICAgICAgICAiKiI6IGFsbFR5cGVzLAot
ICAgICAgICAgICAgdGV4dDogInRleHQvcGxhaW4iLAotICAgICAgICAgICAgaHRtbDogInRleHQv
aHRtbCIsCi0gICAgICAgICAgICB4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKLSAg
ICAgICAgICAgIGpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCi0gICAg
ICAgIH0sCi0KLSAgICAgICAgY29udGVudHM6IHsKLSAgICAgICAgICAgIHhtbDogL3htbC8sCi0g
ICAgICAgICAgICBodG1sOiAvaHRtbC8sCi0gICAgICAgICAgICBqc29uOiAvanNvbi8KLSAgICAg
ICAgfSwKLQotICAgICAgICByZXNwb25zZUZpZWxkczogewotICAgICAgICAgICAgeG1sOiAicmVz
cG9uc2VYTUwiLAotICAgICAgICAgICAgdGV4dDogInJlc3BvbnNlVGV4dCIsCi0gICAgICAgICAg
ICBqc29uOiAicmVzcG9uc2VKU09OIgotICAgICAgICB9LAotCi0gICAgICAgIC8vIERhdGEgY29u
dmVydGVycwotICAgICAgICAvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioi
KSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQotICAgICAgICBjb252
ZXJ0ZXJzOiB7Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAotICAg
ICAgICAgICAgIiogdGV4dCI6IFN0cmluZywKLQotICAgICAgICAgICAgLy8gVGV4dCB0byBodG1s
ICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCi0gICAgICAgICAgICAidGV4dCBodG1sIjogdHJ1
ZSwKLQotICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgot
ICAgICAgICAgICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCi0KLSAgICAgICAgICAg
IC8vIFBhcnNlIHRleHQgYXMgeG1sCi0gICAgICAgICAgICAidGV4dCB4bWwiOiBqUXVlcnkucGFy
c2VYTUwKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4n
dCBiZSBkZWVwIGV4dGVuZGVkOgotICAgICAgICAvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0
b20gb3B0aW9ucyBoZXJlIGlmCi0gICAgICAgIC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRo
YXQgc2hvdWxkbid0IGJlCi0gICAgICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5k
KQotICAgICAgICBmbGF0T3B0aW9uczogewotICAgICAgICAgICAgdXJsOiB0cnVlLAotICAgICAg
ICAgICAgY29udGV4dDogdHJ1ZQotICAgICAgICB9Ci0gICAgfSwKLQotICAgIC8vIENyZWF0ZXMg
YSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0Ci0gICAgLy8gd2l0aCBi
b3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgotICAgIC8vIElmIHRhcmdldCBp
cyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCi0gICAgYWpheFNldHVwOiBmdW5j
dGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsKLSAgICAgICAgcmV0dXJuIHNldHRpbmdzID8KLQot
ICAgICAgICAgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKLSAgICAgICAgICAgIGFq
YXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0
aW5ncyApIDoKLQotICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncwotICAgICAg
ICAgICAgYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Ci0gICAgfSwK
LQotICAgIGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmls
dGVycyApLAotICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cygg
dHJhbnNwb3J0cyApLAotCi0gICAgLy8gTWFpbiBtZXRob2QKLSAgICBhamF4OiBmdW5jdGlvbigg
dXJsLCBvcHRpb25zICkgewotCi0gICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVs
YXRlIHByZS0xLjUgc2lnbmF0dXJlCi0gICAgICAgIGlmICggdHlwZW9mIHVybCA9PT0gIm9iamVj
dCIgKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0gdXJsOwotICAgICAgICAgICAgdXJsID0gdW5k
ZWZpbmVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBv
YmplY3QKLSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICAgICAgdmFyIHRy
YW5zcG9ydCwKLSAgICAgICAgICAgIC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KLSAg
ICAgICAgICAgIGNhY2hlVVJMLAotICAgICAgICAgICAgLy8gUmVzcG9uc2UgaGVhZGVycwotICAg
ICAgICAgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAotICAgICAgICAgICAgcmVzcG9uc2VIZWFk
ZXJzLAotICAgICAgICAgICAgLy8gdGltZW91dCBoYW5kbGUKLSAgICAgICAgICAgIHRpbWVvdXRU
aW1lciwKLSAgICAgICAgICAgIC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFycwotICAgICAg
ICAgICAgcGFydHMsCi0gICAgICAgICAgICAvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJl
IHRvIGJlIGRpc3BhdGNoZWQKLSAgICAgICAgICAgIGZpcmVHbG9iYWxzLAotICAgICAgICAgICAg
Ly8gTG9vcCB2YXJpYWJsZQotICAgICAgICAgICAgaSwKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0
aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKLSAgICAgICAgICAgIHMgPSBqUXVlcnkuYWpheFNldHVw
KCB7fSwgb3B0aW9ucyApLAotICAgICAgICAgICAgLy8gQ2FsbGJhY2tzIGNvbnRleHQKLSAgICAg
ICAgICAgIGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAotICAgICAgICAgICAgLy8g
Q29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBE
T00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgotICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250
ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNr
Q29udGV4dC5qcXVlcnkgKSA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRl
eHQgKSA6Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LAotICAgICAgICAgICAgLy8gRGVm
ZXJyZWRzCi0gICAgICAgICAgICBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLAotICAgICAg
ICAgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
Ci0gICAgICAgICAgICAvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwotICAgICAgICAgICAg
c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSwKLSAgICAgICAgICAgIC8vIEhlYWRlcnMg
KHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCi0gICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9
IHt9LAotICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAotICAgICAgICAgICAg
Ly8gVGhlIGpxWEhSIHN0YXRlCi0gICAgICAgICAgICBzdGF0ZSA9IDAsCi0gICAgICAgICAgICAv
LyBEZWZhdWx0IGFib3J0IG1lc3NhZ2UKLSAgICAgICAgICAgIHN0ckFib3J0ID0gImNhbmNlbGVk
IiwKLSAgICAgICAgICAgIC8vIEZha2UgeGhyCi0gICAgICAgICAgICBqcVhIUiA9IHsKLSAgICAg
ICAgICAgICAgICByZWFkeVN0YXRlOiAwLAotCi0gICAgICAgICAgICAgICAgLy8gQnVpbGRzIGhl
YWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVh
ZGVyOiBmdW5jdGlvbigga2V5ICkgewotICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2g7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzcG9uc2VIZWFkZXJzID0ge307Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0
Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggPT0gbnVs
bCA/IG51bGwgOiBtYXRjaDsKLSAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAg
Ly8gUmF3IHN0cmluZwotICAgICAgICAgICAgICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3Bv
bnNlSGVhZGVyc1N0cmluZyA6IG51bGw7Ci0gICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAg
ICAgICAgIC8vIENhY2hlcyB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgc2V0UmVxdWVzdEhl
YWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewotICAgICAgICAgICAgICAgICAgICB2YXIg
bG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggIXN0
YXRlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFt
ZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAg
ICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBj
b250ZW50LXR5cGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVu
Y3Rpb24oIHR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggIXN0YXRlICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgcy5taW1lVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAg
fSwKLQotICAgICAgICAgICAgICAgIC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0gICAg
ICAgICAgICAgICAgc3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHsKLSAgICAgICAgICAgICAg
ICAgICAgdmFyIGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggbWFwICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA8IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZm9yICggY29kZSBpbiBtYXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2
ZXMgb2xkIG9uZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZVsg
Y29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxs
YmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5hbHdheXMoIG1hcFsganFY
SFIuc3RhdHVzIF0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAg
ICB9LAotCi0gICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0Ci0gICAgICAgICAg
ICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgewotICAgICAgICAgICAgICAgICAg
ICB2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCB0cmFuc3BvcnQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bv
cnQuYWJvcnQoIGZpbmFsVGV4dCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOwotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdGhpczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIC8v
IEF0dGFjaCBkZWZlcnJlZHMKLSAgICAgICAgZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21w
bGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOwotICAgICAgICBqcVhIUi5zdWNjZXNzID0ganFY
SFIuZG9uZTsKLSAgICAgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOwotCi0gICAgICAgIC8v
IFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQotICAg
ICAgICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4
cGVjdCBpdCkKLSAgICAgICAgLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2Jq
ZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKLSAgICAgICAgLy8g
V2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCi0gICAgICAgIHMudXJs
ID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArICIiICkucmVwbGFjZSggcmhh
c2gsICIiICkKLSAgICAgICAgICAgIC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sg
MSBdICsgIi8vIiApOwotCi0gICAgICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBh
cyBwZXIgdGlja2V0ICMxMjAwNAotICAgICAgICBzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBv
cHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlOwotCi0gICAgICAgIC8vIEV4dHJhY3Qg
ZGF0YVR5cGVzIGxpc3QKLSAgICAgICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRh
VHlwZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07
Ci0KLSAgICAgICAgLy8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdl
IGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2gKLSAgICAgICAgaWYgKCBzLmNyb3Nz
RG9tYWluID09IG51bGwgKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwu
dG9Mb3dlckNhc2UoKSApOwotICAgICAgICAgICAgcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAm
JgotICAgICAgICAgICAgICAgICggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwg
cGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwKLSAgICAgICAgICAgICAgICAgICAg
KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/ICI4MCIgOiAiNDQzIiAp
ICkgIT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICgg
YWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyAiODAiIDogIjQ0MyIgKSApICkKLSAgICAg
ICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFs
cmVhZHkgYSBzdHJpbmcKLSAgICAgICAgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0
eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHMuZGF0YSA9IGpRdWVy
eS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBBcHBseSBwcmVmaWx0ZXJzCi0gICAgICAgIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRz
KCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwotCi0gICAgICAgIC8vIElmIHJlcXVl
c3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlCi0gICAgICAgIGlm
ICggc3RhdGUgPT09IDIgKSB7Ci0gICAgICAgICAgICByZXR1cm4ganFYSFI7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tl
ZCB0bwotICAgICAgICBmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOwotCi0gICAgICAgIC8vIFdhdGNo
IGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKLSAgICAgICAgaWYgKCBmaXJlR2xvYmFscyAmJiBq
UXVlcnkuYWN0aXZlKysgPT09IDAgKSB7Ci0gICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dl
cigiYWpheFN0YXJ0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcHBlcmNhc2UgdGhlIHR5
cGUKLSAgICAgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7Ci0KLSAgICAgICAgLy8g
RGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKLSAgICAgICAgcy5oYXNDb250ZW50ID0g
IXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgVVJMIGlu
IGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCi0gICAgICAgIC8v
IGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgotICAgICAgICBjYWNoZVVSTCA9
IHMudXJsOwotCi0gICAgICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMg
d2l0aCBubyBjb250ZW50Ci0gICAgICAgIGlmICggIXMuaGFzQ29udGVudCApIHsKLQotICAgICAg
ICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybAotICAgICAg
ICAgICAgaWYgKCBzLmRhdGEgKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVVUkwgPSAoIHMudXJs
ICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOwot
ICAgICAgICAgICAgICAgIC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVz
ZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKLSAgICAgICAgICAgICAgICBkZWxldGUgcy5kYXRhOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYg
bmVlZGVkCi0gICAgICAgICAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgewotICAgICAgICAg
ICAgICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPwotCi0gICAgICAgICAgICAgICAg
ICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVl
Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgbm9u
Y2UrKyApIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0
aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMICsgKCBycXVlcnkudGVzdCggY2Fj
aGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIG5vbmNlKys7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJ
Zi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgotICAgICAgICBpZiAo
IHMuaWZNb2RpZmllZCApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsg
Y2FjaGVVUkwgXSApIHsKLSAgICAgICAgICAgICAgICBqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAi
SWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkg
ewotICAgICAgICAgICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNo
IiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2Vu
dAotICAgICAgICBpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAh
PT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKLSAgICAgICAgICAgIGpxWEhSLnNl
dFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlICk7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBk
ZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCi0gICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIo
Ci0gICAgICAgICAgICAiQWNjZXB0IiwKLSAgICAgICAgICAgIHMuZGF0YVR5cGVzWyAwIF0gJiYg
cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KLSAgICAgICAgICAgICAgICBzLmFjY2VwdHNb
IHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBh
bGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoKLSAgICAgICAgICAgICAgICBzLmFjY2VwdHNb
ICIqIiBdCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9u
Ci0gICAgICAgIGZvciAoIGkgaW4gcy5oZWFkZXJzICkgewotICAgICAgICAgICAganFYSFIuc2V0
UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKLSAgICAg
ICAgaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250
ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkgewotICAgICAgICAg
ICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCi0gICAgICAgICAgICBy
ZXR1cm4ganFYSFIuYWJvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFib3J0aW5nIGlz
IG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgotICAgICAgICBzdHJBYm9ydCA9ICJhYm9ydCI7Ci0K
LSAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCi0gICAgICAgIGZvciAo
IGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKLSAgICAgICAg
ICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRy
YW5zcG9ydAotICAgICAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0
cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKLQotICAgICAgICAvLyBJZiBubyB0
cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKLSAgICAgICAgaWYgKCAhdHJhbnNwb3J0ICkgewotICAg
ICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0gMTsKLQotICAgICAgICAgICAgLy8gU2VuZCBn
bG9iYWwgZXZlbnQKLSAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAg
ICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIsIHMg
XSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGltZW91dAotICAgICAgICAgICAg
aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgdGltZW91
dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAganFY
SFIuYWJvcnQoInRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICB9LCBzLnRpbWVvdXQgKTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9
IDE7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25l
ICk7Ci0gICAgICAgICAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9w
YWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCi0gICAgICAgICAgICAgICAgaWYg
KCBzdGF0ZSA8IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUoIC0xLCBlICk7Ci0gICAg
ICAgICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxsYmFjayBmb3Igd2hl
biBldmVyeXRoaW5nIGlzIGRvbmUKLSAgICAgICAgZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRp
dmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7Ci0gICAgICAgICAgICB2YXIgaXNT
dWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAotICAgICAgICAgICAg
ICAgIHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OwotCi0gICAgICAgICAgICAvLyBDYWxs
ZWQgb25jZQotICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PT0gMiApIHsKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN0YXRlIGlzICJkb25l
IiBub3cKLSAgICAgICAgICAgIHN0YXRlID0gMjsKLQotICAgICAgICAgICAgLy8gQ2xlYXIgdGlt
ZW91dCBpZiBpdCBleGlzdHMKLSAgICAgICAgICAgIGlmICggdGltZW91dFRpbWVyICkgewotICAg
ICAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFn
ZSBjb2xsZWN0aW9uCi0gICAgICAgICAgICAvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhI
UiBvYmplY3Qgd2lsbCBiZSB1c2VkKQotICAgICAgICAgICAgdHJhbnNwb3J0ID0gdW5kZWZpbmVk
OwotCi0gICAgICAgICAgICAvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzCi0gICAgICAgICAgICBy
ZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwotCi0gICAgICAgICAgICAvLyBT
ZXQgcmVhZHlTdGF0ZQotICAgICAgICAgICAganFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAg
PyA0IDogMDsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWwKLSAgICAg
ICAgICAgIGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1
cyA9PT0gMzA0OwotCi0gICAgICAgICAgICAvLyBHZXQgcmVzcG9uc2UgZGF0YQotICAgICAgICAg
ICAgaWYgKCByZXNwb25zZXMgKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhamF4SGFu
ZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhY
IGZpZWxkcyBhcmUgYWx3YXlzIHNldCkKLSAgICAgICAgICAgIHJlc3BvbnNlID0gYWpheENvbnZl
cnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7Ci0KLSAgICAgICAgICAgIC8vIElm
IHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCi0gICAgICAgICAgICBpZiAoIGlzU3Vj
Y2VzcyApIHsKLQotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2Ug
YW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCi0gICAg
ICAgICAgICAgICAgaWYgKCBzLmlmTW9kaWZpZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1v
ZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3Bv
bnNlSGVhZGVyKCJldGFnIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlm
aWVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gaWYgbm8gY29udGVudAotICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09
PSAyMDQgfHwgcy50eXBlID09PSAiSEVBRCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1
c1RleHQgPSAibm9jb250ZW50IjsKLQotICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBtb2RpZmll
ZAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkgewotICAgICAg
ICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKLQotICAgICAgICAgICAg
ICAgIC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0
ZTsKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7Ci0gICAgICAg
ICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2UuZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAg
IGlzU3VjY2VzcyA9ICFlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0
Ci0gICAgICAgICAgICAgICAgLy8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVz
IGZvciBub24tYWJvcnRzCi0gICAgICAgICAgICAgICAgZXJyb3IgPSBzdGF0dXNUZXh0OwotICAg
ICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewotICAgICAgICAgICAg
ICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBz
dGF0dXMgPCAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3QKLSAgICAgICAgICAg
IGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgICAgIGpxWEhSLnN0YXR1c1RleHQgPSAo
IG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgIiI7Ci0KLSAgICAgICAgICAgIC8v
IFN1Y2Nlc3MvRXJyb3IKLSAgICAgICAgICAgIGlmICggaXNTdWNjZXNzICkgewotICAgICAgICAg
ICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywg
c3RhdHVzVGV4dCwganFYSFIgXSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1
c1RleHQsIGVycm9yIF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3RhdHVz
LWRlcGVuZGVudCBjYWxsYmFja3MKLSAgICAgICAgICAgIGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1
c0NvZGUgKTsKLSAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7Ci0KLSAgICAgICAg
ICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250
ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKLSAg
ICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9y
IF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29tcGxldGUKLSAgICAgICAg
ICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwg
c3RhdHVzVGV4dCBdICk7Ci0KLSAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAg
ICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBb
IGpxWEhSLCBzIF0gKTsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFY
IGNvdW50ZXIKLSAgICAgICAgICAgICAgICBpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewot
ICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4ganFYSFI7Ci0gICAgfSwKLQotICAgIGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNh
bGxiYWNrICkgewotICAgICAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFj
aywgImpzb24iICk7Ci0gICAgfSwKLQotICAgIGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2Fs
bGJhY2sgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2Fs
bGJhY2ssICJzY3JpcHQiICk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKCBbICJnZXQiLCAi
cG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKLSAgICBqUXVlcnlbIG1ldGhvZCBdID0g
ZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7Ci0gICAgICAgIC8vIHNoaWZ0
IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCi0gICAgICAgIGlmICggalF1
ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlIHx8IGNh
bGxiYWNrOwotICAgICAgICAgICAgY2FsbGJhY2sgPSBkYXRhOwotICAgICAgICAgICAgZGF0YSA9
IHVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqUXVlcnkuYWpheCh7Ci0g
ICAgICAgICAgICB1cmw6IHVybCwKLSAgICAgICAgICAgIHR5cGU6IG1ldGhvZCwKLSAgICAgICAg
ICAgIGRhdGFUeXBlOiB0eXBlLAotICAgICAgICAgICAgZGF0YTogZGF0YSwKLSAgICAgICAgICAg
IHN1Y2Nlc3M6IGNhbGxiYWNrCi0gICAgICAgIH0pOwotICAgIH07Ci19KTsKLQotLy8gQXR0YWNo
IGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKLWpR
dWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWpheFN0b3AiLCAiYWpheENvbXBsZXRlIiwgImFq
YXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4U2VuZCIgXSwgZnVuY3Rpb24oIGksIHR5cGUg
KSB7Ci0gICAgalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLm9uKCB0eXBlLCBmbiApOwotICAgIH07Ci19KTsKLQotCi1qUXVlcnkuX2V2YWxV
cmwgPSBmdW5jdGlvbiggdXJsICkgewotICAgIHJldHVybiBqUXVlcnkuYWpheCh7Ci0gICAgICAg
IHVybDogdXJsLAotICAgICAgICB0eXBlOiAiR0VUIiwKLSAgICAgICAgZGF0YVR5cGU6ICJzY3Jp
cHQiLAotICAgICAgICBhc3luYzogZmFsc2UsCi0gICAgICAgIGdsb2JhbDogZmFsc2UsCi0gICAg
ICAgICJ0aHJvd3MiOiB0cnVlCi0gICAgfSk7Ci19OwotCi0KLWpRdWVyeS5mbi5leHRlbmQoewot
ICAgIHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewotICAgICAgICB2YXIgd3JhcDsKLQotICAg
ICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7Ci0gICAgICAgICAgICByZXR1
cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSggdGhp
cyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApOwotICAgICAgICAgICAgfSk7Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoIHRoaXNbIDAgXSApIHsKLQotICAgICAgICAgICAgLy8gVGhl
IGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKLSAgICAgICAgICAgIHdyYXAgPSBq
UXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1
ZSApOwotCi0gICAgICAgICAgICBpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewotICAgICAg
ICAgICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgd3JhcC5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgdmFy
IGVsZW0gPSB0aGlzOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVu
dENoaWxkICkgewotICAgICAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRD
aGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsK
LSAgICAgICAgICAgIH0pLmFwcGVuZCggdGhpcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7Ci0g
ICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKLSAgICAgICAgICAgIHJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0
aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKLSAgICAgICAgICAgIH0pOwot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgIHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCi0gICAgICAgICAgICAgICAgY29udGVu
dHMgPSBzZWxmLmNvbnRlbnRzKCk7Ci0KLSAgICAgICAgICAgIGlmICggY29udGVudHMubGVuZ3Ro
ICkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKLQotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZCggaHRtbCApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgd3JhcDogZnVuY3Rpb24oIGh0
bWwgKSB7Ci0gICAgICAgIHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwg
KTsKLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAg
ICAgalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBp
KSA6IGh0bWwgKTsKLSAgICAgICAgfSk7Ci0gICAgfSwKLQotICAgIHVud3JhcDogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewotICAgICAg
ICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSkuZW5kKCk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5
LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBTdXBwb3J0
OiBPcGVyYSA8PSAxMi4xMgotICAgIC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBv
ZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKLSAgICByZXR1cm4g
ZWxlbS5vZmZzZXRXaWR0aCA8PSAwICYmIGVsZW0ub2Zmc2V0SGVpZ2h0IDw9IDA7Ci19OwotalF1
ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJu
ICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOwotfTsKLQotCi0KLQotdmFyIHIy
MCA9IC8lMjAvZywKLSAgICByYnJhY2tldCA9IC9cW1xdJC8sCi0gICAgckNSTEYgPSAvXHI/XG4v
ZywKLSAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8
ZmlsZSkkL2ksCi0gICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8
a2V5Z2VuKS9pOwotCi1mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlv
bmFsLCBhZGQgKSB7Ci0gICAgdmFyIG5hbWU7Ci0KLSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBv
YmogKSApIHsKLSAgICAgICAgLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCi0gICAgICAgIGpRdWVy
eS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewotICAgICAgICAgICAgaWYgKCB0cmFkaXRp
b25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsKLSAgICAgICAgICAgICAgICAvLyBU
cmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuCi0gICAgICAgICAgICAgICAgYWRkKCBw
cmVmaXgsIHYgKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJ
dGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBp
bmRleC4KLSAgICAgICAgICAgICAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBl
b2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0gZWxzZSBpZiAoICF0cmFkaXRp
b25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09ICJvYmplY3QiICkgewotICAgICAgICAvLyBT
ZXJpYWxpemUgb2JqZWN0IGl0ZW0uCi0gICAgICAgIGZvciAoIG5hbWUgaW4gb2JqICkgewotICAg
ICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFt
ZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KLSAgICAgICAgYWRkKCBwcmVmaXgsIG9iaiAp
OwotICAgIH0KLX0KLQotLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3Ig
YSBzZXQgb2YKLS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwotalF1ZXJ5LnBhcmFt
ID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkgewotICAgIHZhciBwcmVmaXgsCi0gICAgICAg
IHMgPSBbXSwKLSAgICAgICAgYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7Ci0gICAgICAg
ICAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMg
dmFsdWUKLSAgICAgICAgICAgIHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2
YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOwotICAgICAgICAgICAgc1sg
cy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklD
b21wb25lbnQoIHZhbHVlICk7Ci0gICAgICAgIH07Ci0KLSAgICAvLyBTZXQgdHJhZGl0aW9uYWwg
dG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLgotICAgIGlmICggdHJhZGl0aW9u
YWwgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNl
dHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7Ci0gICAgfQotCi0gICAg
Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkg
b2YgZm9ybSBlbGVtZW50cy4KLSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpx
dWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkgewotICAgICAgICAvLyBTZXJp
YWxpemUgdGhlIGZvcm0gZWxlbWVudHMKLSAgICAgICAgalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9u
KCkgewotICAgICAgICAgICAgYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKLSAgICAgICAg
fSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRo
ZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKLSAgICAgICAgLy8gZGlkIGl0KSwg
b3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCi0gICAgICAgIGZvciAoIHByZWZp
eCBpbiBhICkgewotICAgICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0s
IHRyYWRpdGlvbmFsLCBhZGQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiB0
aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KLSAgICByZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBs
YWNlKCByMjAsICIrIiApOwotfTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgc2VyaWFsaXpl
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxp
emVBcnJheSgpICk7Ci0gICAgfSwKLSAgICBzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIC8vIENhbiBh
ZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRz
Ci0gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRz
IiApOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxl
bWVudHMgKSA6IHRoaXM7Ci0gICAgICAgIH0pCi0gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKLQotICAgICAgICAgICAgLy8gVXNl
IC5pcyggIjpkaXNhYmxlZCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcwotICAg
ICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJs
ZWQiICkgJiYKLSAgICAgICAgICAgICAgICByc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFt
ZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmCi0gICAgICAgICAgICAgICAg
KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApOwotICAgICAg
ICB9KQotICAgICAgICAubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkgewotICAgICAgICAgICAgdmFy
IHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwotCi0gICAgICAgICAgICByZXR1cm4gdmFsID09
IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOgotICAgICAgICAgICAgICAgIGpRdWVyeS5p
c0FycmF5KCB2YWwgKSA/Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVu
Y3Rpb24oIHZhbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGVs
ZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLSAgICAgICAg
ICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IGVsZW0ubmFtZSwg
dmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLSAgICAgICAgfSkuZ2V0KCk7
Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHsK
LSAgICB0cnkgewotICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7Ci0gICAgfSBj
YXRjaCggZSApIHt9Ci19OwotCi12YXIgeGhySWQgPSAwLAotICAgIHhockNhbGxiYWNrcyA9IHt9
LAotICAgIHhoclN1Y2Nlc3NTdGF0dXMgPSB7Ci0gICAgICAgIC8vIGZpbGUgcHJvdG9jb2wgYWx3
YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCi0gICAgICAgIDA6IDIwMCwKLSAg
ICAgICAgLy8gU3VwcG9ydDogSUU5Ci0gICAgICAgIC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0
dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAotICAgICAgICAxMjIzOiAyMDQKLSAgICB9
LAotICAgIHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7Ci0KLS8vIFN1
cHBvcnQ6IElFOQotLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24g
dW5sb2FkICgjNTI4MCkKLWlmICggd2luZG93LkFjdGl2ZVhPYmplY3QgKSB7Ci0gICAgalF1ZXJ5
KCB3aW5kb3cgKS5vbiggInVubG9hZCIsIGZ1bmN0aW9uKCkgewotICAgICAgICBmb3IgKCB2YXIg
a2V5IGluIHhockNhbGxiYWNrcyApIHsKLSAgICAgICAgICAgIHhockNhbGxiYWNrc1sga2V5IF0o
KTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi1zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRl
ZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwotc3VwcG9ydC5hamF4
ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7Ci0KLWpRdWVyeS5hamF4VHJhbnNwb3J0
KGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgIHZhciBjYWxsYmFjazsKLQotICAgIC8vIENyb3Nz
IGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3QK
LSAgICBpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NE
b21haW4gKSB7Ci0gICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICBzZW5kOiBmdW5jdGlvbigg
aGVhZGVycywgY29tcGxldGUgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGksCi0gICAgICAgICAg
ICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyKCksCi0gICAgICAgICAgICAgICAgICAgIGlkID0g
Kyt4aHJJZDsKLQotICAgICAgICAgICAgICAgIHhoci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlv
bnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3Jk
ICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVk
Ci0gICAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKLSAgICAgICAgICAg
ICAgICAgICAgZm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE92ZXJy
aWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBpZiAoIG9wdGlvbnMubWlt
ZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHho
ci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgLy8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXIKLSAgICAgICAg
ICAgICAgICAvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9u
cyBmb3IgYSBwcmVmbGlnaHQgYXJlCi0gICAgICAgICAgICAgICAgLy8gYWtpbiB0byBhIGppZ3Nh
dyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS4KLSAgICAgICAgICAg
ICAgICAvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBl
dmVuIHVzaW5nIGFqYXhTZXR1cCkKLSAgICAgICAgICAgICAgICAvLyBGb3Igc2FtZS1kb21haW4g
cmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KLSAgICAg
ICAgICAgICAgICBpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyJYLVJlcXVl
c3RlZC1XaXRoIl0gKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbIlgtUmVxdWVzdGVk
LVdpdGgiXSA9ICJYTUxIdHRwUmVxdWVzdCI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gU2V0IGhlYWRlcnMKLSAgICAgICAgICAgICAgICBmb3IgKCBpIGluIGhlYWRl
cnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFk
ZXJzWyBpIF0gKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDYWxs
YmFjawotICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggY2FsbGJhY2sgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRl
IHhockNhbGxiYWNrc1sgaWQgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFj
ayA9IHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJhYm9ydCIgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHhoci5hYm9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbXBsZXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
ZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDcK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBd
IHx8IHhoci5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIu
c3RhdHVzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBv
cnQ6IElFOQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXNzaW5n
IGJpbmFyeS1kYXRhIHJlc3BvbnNlVGV4dCB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoIzExNDI2KQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciID8g
ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHhoci5yZXNw
b25zZVRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmlu
ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0QWxsUmVzcG9u
c2VIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIC8v
IExpc3RlbiB0byBldmVudHMKLSAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gY2FsbGJhY2so
KTsKLSAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IGNhbGxiYWNrKCJlcnJvciIpOwotCi0g
ICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFjawotICAgICAgICAgICAg
ICAgIGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2soImFib3J0Iik7Ci0K
LSAgICAgICAgICAgICAgICAvLyBEbyBzZW5kIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAg
Ly8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5Ci0gICAgICAg
ICAgICAgICAgLy8gaGFuZGxlZCBpbiBqUXVlcnkuYWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUp
Ci0gICAgICAgICAgICAgICAgeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25z
LmRhdGEgfHwgbnVsbCApOwotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgYWJvcnQ6IGZ1
bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGNhbGxiYWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9OwotICAgIH0KLX0pOwotCi0KLQotCi0vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlw
ZQotalF1ZXJ5LmFqYXhTZXR1cCh7Ci0gICAgYWNjZXB0czogewotICAgICAgICBzY3JpcHQ6ICJ0
ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFz
Y3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKLSAgICB9LAotICAgIGNvbnRlbnRzOiB7
Ci0gICAgICAgIHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvCi0gICAgfSwKLSAgICBjb252
ZXJ0ZXJzOiB7Ci0gICAgICAgICJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgewotICAg
ICAgICAgICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKLSAgICAgICAgICAgIHJldHVybiB0
ZXh0OwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLS8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwg
Y2FzZSBhbmQgY3Jvc3NEb21haW4KLWpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVu
Y3Rpb24oIHMgKSB7Ci0gICAgaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAg
IHMuY2FjaGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCBzLmNyb3NzRG9tYWluICkgewotICAg
ICAgICBzLnR5cGUgPSAiR0VUIjsKLSAgICB9Ci19KTsKLQotLy8gQmluZCBzY3JpcHQgdGFnIGhh
Y2sgdHJhbnNwb3J0Ci1qUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKCBz
ICkgewotICAgIC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4g
cmVxdWVzdHMKLSAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7Ci0gICAgICAgIHZhciBzY3JpcHQs
IGNhbGxiYWNrOwotICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24o
IF8sIGNvbXBsZXRlICkgewotICAgICAgICAgICAgICAgIHNjcmlwdCA9IGpRdWVyeSgiPHNjcmlw
dD4iKS5wcm9wKHsKLSAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsCi0gICAgICAgICAg
ICAgICAgICAgIGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAg
c3JjOiBzLnVybAotICAgICAgICAgICAgICAgIH0pLm9uKAotICAgICAgICAgICAgICAgICAgICAi
bG9hZCBlcnJvciIsCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2
dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggZXZ0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCBldnQu
dHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0g
ICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTsK
LSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBhYm9ydDogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKCBjYWxsYmFjayApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2so
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQot
fSk7Ci0KLQotCi0KLXZhciBvbGRDYWxsYmFja3MgPSBbXSwKLSAgICByanNvbnAgPSAvKD0pXD8o
Pz0mfCQpfFw/XD8vOwotCi0vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCi1qUXVlcnkuYWpheFNl
dHVwKHsKLSAgICBqc29ucDogImNhbGxiYWNrIiwKLSAgICBqc29ucENhbGxiYWNrOiBmdW5jdGlv
bigpIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1
ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwotICAgICAgICB0aGlzWyBjYWxsYmFj
ayBdID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrOwotICAgIH0KLX0pOwotCi0vLyBE
ZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAg
cmVxdWVzdHMKLWpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBz
LCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKLQotICAgIHZhciBjYWxsYmFja05hbWUsIG92
ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKLSAgICAgICAganNvblByb3AgPSBzLmpzb25w
ICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KLSAgICAgICAgICAgICJ1cmwi
IDoKLSAgICAgICAgICAgIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICYmICEoIHMuY29udGVu
dFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQi
KSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYgImRhdGEiCi0gICAgICAgICk7Ci0KLSAgICAv
LyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZl
IGEgcGFyYW1ldGVyIHRvIHNldAotICAgIGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAg
XSA9PT0gImpzb25wIiApIHsKLQotICAgICAgICAvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1i
ZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgIGNhbGxi
YWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2Fs
bGJhY2sgKSA/Ci0gICAgICAgICAgICBzLmpzb25wQ2FsbGJhY2soKSA6Ci0gICAgICAgICAgICBz
Lmpzb25wQ2FsbGJhY2s7Ci0KLSAgICAgICAgLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9y
IGZvcm0gZGF0YQotICAgICAgICBpZiAoIGpzb25Qcm9wICkgewotICAgICAgICAgICAgc1sganNv
blByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tO
YW1lICk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkgewotICAgICAg
ICAgICAgcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5q
c29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSBk
YXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KLSAg
ICAgICAgcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICBpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnku
ZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKLSAgICAgICAgfTsK
LQotICAgICAgICAvLyBmb3JjZSBqc29uIGRhdGFUeXBlCi0gICAgICAgIHMuZGF0YVR5cGVzWyAw
IF0gPSAianNvbiI7Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFjawotICAgICAgICBvdmVy
d3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07Ci0gICAgICAgIHdpbmRvd1sgY2FsbGJh
Y2tOYW1lIF0gPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlQ29udGFpbmVyID0g
YXJndW1lbnRzOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChm
aXJlcyBhZnRlciBjb252ZXJ0ZXJzKQotICAgICAgICBqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCi0gICAgICAgICAgICB3
aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47Ci0KLSAgICAgICAgICAgIC8vIFNh
dmUgYmFjayBhcyBmcmVlCi0gICAgICAgICAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewot
ICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRv
ZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAotICAgICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFj
ayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKLQotICAgICAgICAgICAgICAgIC8v
IHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICBv
bGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25z
ZQotICAgICAgICAgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlv
biggb3ZlcndyaXR0ZW4gKSApIHsKLSAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9u
c2VDb250YWluZXJbIDAgXSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25z
ZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOwotICAgICAgICB9KTsKLQotICAg
ICAgICAvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKLSAgICAgICAgcmV0dXJuICJzY3JpcHQiOwotICAg
IH0KLX0pOwotCi0KLQotCi0vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAotLy8gY29udGV4dCAob3B0
aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhp
cyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAotLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFs
KTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmlu
ZwotalF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0
cyApIHsKLSAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKLSAg
ICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGlmICggdHlwZW9mIGNvbnRleHQgPT09ICJi
b29sZWFuIiApIHsKLSAgICAgICAga2VlcFNjcmlwdHMgPSBjb250ZXh0OwotICAgICAgICBjb250
ZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Owot
Ci0gICAgdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAotICAgICAgICBzY3Jp
cHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwotCi0gICAgLy8gU2luZ2xlIHRhZwotICAgIGlmICgg
cGFyc2VkICkgewotICAgICAgICByZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNl
ZFsxXSApIF07Ci0gICAgfQotCi0gICAgcGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsg
ZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7Ci0KLSAgICBpZiAoIHNjcmlwdHMgJiYgc2NyaXB0
cy5sZW5ndGggKSB7Ci0gICAgICAgIGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwotICAgIH0K
LQotICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwotfTsK
LQotCi0vLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCi12YXIgX2xvYWQgPSBq
UXVlcnkuZm4ubG9hZDsKLQotLyoqCi0gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCi0gKi8KLWpR
dWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKLSAgICBp
ZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgewotICAgICAgICByZXR1cm4g
X2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotICAgIH0KLQotICAgIHZhciBzZWxlY3Rv
ciwgdHlwZSwgcmVzcG9uc2UsCi0gICAgICAgIHNlbGYgPSB0aGlzLAotICAgICAgICBvZmYgPSB1
cmwuaW5kZXhPZigiICIpOwotCi0gICAgaWYgKCBvZmYgPj0gMCApIHsKLSAgICAgICAgc2VsZWN0
b3IgPSB1cmwuc2xpY2UoIG9mZiApOwotICAgICAgICB1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiAp
OwotICAgIH0KLQotICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbgotICAgIGlmICggalF1ZXJ5Lmlz
RnVuY3Rpb24oIHBhcmFtcyApICkgewotCi0gICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3Mg
dGhlIGNhbGxiYWNrCi0gICAgICAgIGNhbGxiYWNrID0gcGFyYW1zOwotICAgICAgICBwYXJhbXMg
PSB1bmRlZmluZWQ7Ci0KLSAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCi0g
ICAgfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewot
ICAgICAgICB0eXBlID0gIlBPU1QiOwotICAgIH0KLQotICAgIC8vIElmIHdlIGhhdmUgZWxlbWVu
dHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0Ci0gICAgaWYgKCBzZWxmLmxlbmd0aCA+IDAg
KSB7Ci0gICAgICAgIGpRdWVyeS5hamF4KHsKLSAgICAgICAgICAgIHVybDogdXJsLAotCi0gICAg
ICAgICAgICAvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1l
dGhvZCB3aWxsIGJlIHVzZWQKLSAgICAgICAgICAgIHR5cGU6IHR5cGUsCi0gICAgICAgICAgICBk
YXRhVHlwZTogImh0bWwiLAotICAgICAgICAgICAgZGF0YTogcGFyYW1zCi0gICAgICAgIH0pLmRv
bmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsKLQotICAgICAgICAgICAgLy8gU2F2ZSByZXNw
b25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrCi0gICAgICAgICAgICByZXNwb25zZSA9
IGFyZ3VtZW50czsKLQotICAgICAgICAgICAgc2VsZi5odG1sKCBzZWxlY3RvciA/Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmln
aHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKLSAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIHNj
cmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKLSAgICAgICAgICAg
ICAgICBqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRl
eHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgotCi0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNl
IHVzZSB0aGUgZnVsbCByZXN1bHQKLSAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgKTsKLQot
ICAgICAgICB9KS5jb21wbGV0ZSggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMg
KSB7Ci0gICAgICAgICAgICBzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhS
LnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7Ci0gICAgICAgIH0pOwotICAgIH0KLQot
ICAgIHJldHVybiB0aGlzOwotfTsKLQotCi0KLQotalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRl
ZCA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGlt
ZXJzLCBmdW5jdGlvbiggZm4gKSB7Ci0gICAgICAgIHJldHVybiBlbGVtID09PSBmbi5lbGVtOwot
ICAgIH0pLmxlbmd0aDsKLX07Ci0KLQotCi0KLXZhciBkb2NFbGVtID0gd2luZG93LmRvY3VtZW50
LmRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBHZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVu
dAotICovCi1mdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5p
c1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZh
dWx0VmlldzsKLX0KLQotalF1ZXJ5Lm9mZnNldCA9IHsKLSAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9u
KCBlbGVtLCBvcHRpb25zLCBpICkgewotICAgICAgICB2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQs
IGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0
aW9uLAotICAgICAgICAgICAgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24i
ICksCi0gICAgICAgICAgICBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksCi0gICAgICAgICAgICBw
cm9wcyA9IHt9OwotCi0gICAgICAgIC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3Av
bGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KLSAgICAgICAgaWYgKCBwb3NpdGlvbiA9
PT0gInN0YXRpYyIgKSB7Ci0gICAgICAgICAgICBlbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0
aXZlIjsKLSAgICAgICAgfQotCi0gICAgICAgIGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7
Ci0gICAgICAgIGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICk7Ci0gICAgICAg
IGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKLSAgICAgICAgY2FsY3Vs
YXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAi
Zml4ZWQiICkgJiYKLSAgICAgICAgICAgICggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4
T2YoImF1dG8iKSA+IC0xOwotCi0gICAgICAgIC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxh
dGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlz
IGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAotICAgICAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9u
ICkgewotICAgICAgICAgICAgY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7Ci0gICAg
ICAgICAgICBjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7Ci0gICAgICAgICAgICBjdXJMZWZ0ID0g
Y3VyUG9zaXRpb24ubGVmdDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3VyVG9w
ID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsKLSAgICAgICAgICAgIGN1ckxlZnQgPSBw
YXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgg
alF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBv
cHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewotICAgICAgICAgICAgcHJvcHMudG9wID0gKCBv
cHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgewotICAgICAgICAgICAgcHJvcHMubGVmdCA9
ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKLSAgICAgICAgICAgIG9wdGlv
bnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgY3VyRWxlbS5jc3MoIHByb3BzICk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1qUXVl
cnkuZm4uZXh0ZW5kKHsKLSAgICBvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgICAg
ICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3B0aW9ucyA9
PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICB0aGlzIDoKLSAgICAgICAgICAgICAgICB0
aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5vZmZz
ZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0g
ICAgICAgIH0KLQotICAgICAgICB2YXIgZG9jRWxlbSwgd2luLAotICAgICAgICAgICAgZWxlbSA9
IHRoaXNbIDAgXSwKLSAgICAgICAgICAgIGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sCi0gICAg
ICAgICAgICBkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDsKLQotICAgICAgICBpZiAo
ICFkb2MgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBkb2NF
bGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBu
b3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKLSAgICAgICAgaWYgKCAhalF1ZXJ5LmNvbnRhaW5z
KCBkb2NFbGVtLCBlbGVtICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gYm94OwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVy
IHRoYW4gZXJyb3IKLSAgICAgICAgLy8gQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBo
b25lKQotICAgICAgICBpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0g
c3RydW5kZWZpbmVkICkgewotICAgICAgICAgICAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVu
dFJlY3QoKTsKLSAgICAgICAgfQotICAgICAgICB3aW4gPSBnZXRXaW5kb3coIGRvYyApOwotICAg
ICAgICByZXR1cm4gewotICAgICAgICAgICAgdG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0
IC0gZG9jRWxlbS5jbGllbnRUb3AsCi0gICAgICAgICAgICBsZWZ0OiBib3gubGVmdCArIHdpbi5w
YWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdAotICAgICAgICB9OwotICAgIH0sCi0KLSAg
ICBwb3NpdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmICggIXRoaXNbIDAgXSApIHsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBvZmZzZXRQYXJlbnQs
IG9mZnNldCwKLSAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCi0gICAgICAgICAgICBwYXJl
bnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9OwotCi0gICAgICAgIC8vIEZpeGVkIGVsZW1l
bnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDog
MH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudAotICAgICAgICBpZiAoIGpR
dWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKLSAgICAgICAgICAg
IC8vIFdlIGFzc3VtZSB0aGF0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpcyBhdmFpbGFibGUgd2hl
biBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZAotICAgICAgICAgICAgb2Zmc2V0ID0gZWxlbS5n
ZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKLSAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IHRo
aXMub2Zmc2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMK
LSAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAoICFq
UXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIgKSApIHsKLSAgICAgICAg
ICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwotICAgICAgICAg
ICAgcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJv
cmRlclRvcFdpZHRoIiwgdHJ1ZSApOwotICAgICAgICAgICAgcGFyZW50T2Zmc2V0LmxlZnQgKz0g
alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJMZWZ0V2lkdGgiLCB0cnVlICk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxl
bWVudCBtYXJnaW5zCi0gICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICB0b3A6IG9mZnNldC50
b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRy
dWUgKSwKLSAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQg
LSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUgKQotICAgICAgICB9OwotICAg
IH0sCi0KLSAgICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhp
cy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5v
ZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKLQotICAgICAgICAgICAgd2hpbGUgKCBvZmZzZXRQYXJl
bnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnQsICJodG1sIiApICYmIGpRdWVy
eS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9uIiApID09PSAic3RhdGljIiApICkgewotICAg
ICAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxl
bTsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLS8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBz
Y3JvbGxUb3AgbWV0aG9kcwotalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0
Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7
Ci0gICAgdmFyIHRvcCA9ICJwYWdlWU9mZnNldCIgPT09IHByb3A7Ci0KLSAgICBqUXVlcnkuZm5b
IG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKLSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhp
cywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgewotICAgICAgICAgICAgdmFyIHdpbiA9
IGdldFdpbmRvdyggZWxlbSApOwotCi0gICAgICAgICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVk
ICkgewotICAgICAgICAgICAgICAgIHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1l
dGhvZCBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHdpbiApIHsKLSAgICAg
ICAgICAgICAgICB3aW4uc2Nyb2xsVG8oCi0gICAgICAgICAgICAgICAgICAgICF0b3AgPyB2YWwg
OiB3aW5kb3cucGFnZVhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHRvcCA/IHZhbCA6IHdp
bmRvdy5wYWdlWU9mZnNldAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBudWxsICk7Ci0gICAg
fTsKLX0pOwotCi0vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5w
b3NpdGlvbgotLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTI5MDg0Ci0vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNw
ZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0Ci0vLyByYXRoZXIgdGhhbiBtYWtlIHRo
ZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBm
b3IgaXQgaGVyZQotalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwg
cHJvcCApIHsKLSAgICBqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3Vw
cG9ydC5waXhlbFBvc2l0aW9uLAotICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7
Ci0gICAgICAgICAgICBpZiAoIGNvbXB1dGVkICkgewotICAgICAgICAgICAgICAgIGNvbXB1dGVk
ID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgY3VyQ1NTIHJl
dHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID8KLSAgICAgICAgICAgICAgICAgICAgalF1
ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6Ci0gICAgICAgICAgICAgICAg
ICAgIGNvbXB1dGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgKTsKLX0pOwotCi0K
LS8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJI
ZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwotalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVp
Z2h0IiwgV2lkdGg6ICJ3aWR0aCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7Ci0gICAgalF1
ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAi
b3V0ZXIiICsgbmFtZSB9LCBmdW5jdGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKLSAg
ICAgICAgLy8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoCi0gICAg
ICAgIGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkgewot
ICAgICAgICAgICAgdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0
RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCi0gICAgICAgICAgICAgICAg
ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRy
dWUgPyAibWFyZ2luIiA6ICJib3JkZXIiICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhY2Nlc3Mo
IHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgICB2
YXIgZG9jOwotCi0gICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxk
IGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKLSAgICAgICAg
ICAgICAgICAgICAgLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1
ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBo
dHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NAotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFt
ZSBdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEdldCBkb2N1bWVu
dCB3aWR0aCBvciBoZWlnaHQKLSAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50Owot
Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBv
ZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwKLSAgICAgICAgICAg
ICAgICAgICAgLy8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYm9keVsgInNjcm9s
bCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCi0gICAgICAgICAgICAgICAgICAg
ICAgICBlbGVtLmJvZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBd
LAotICAgICAgICAgICAgICAgICAgICAgICAgZG9jWyAiY2xpZW50IiArIG5hbWUgXQotICAgICAg
ICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJl
dHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHdp
ZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcg
cGFyc2VGbG9hdAotICAgICAgICAgICAgICAgICAgICBqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBl
eHRyYSApIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9u
IHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlw
ZSwgdmFsdWUsIGV4dHJhICk7Ci0gICAgICAgICAgICB9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJn
aW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApOwotICAgICAgICB9OwotICAgIH0pOwot
fSk7Ci0KLQotLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNo
ZWQgZWxlbWVudCBzZXQKLWpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IHRoaXMubGVuZ3RoOwotfTsKLQotalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFj
azsKLQotCi0KLQotLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVl
cnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyCi0vLyBmaWxlcyB0aGF0IG1heSB1c2Ug
ZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci0v
LyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVz
dCBhbmQgbW9zdCByb2J1c3QKLS8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBp
cyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUKLS8vIGRlcml2ZWQgZnJvbSBmaWxl
IG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQot
Ly8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBp
ZiBhbiBBTUQgbW9kdWxlIHdhbnRzCi0vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlz
IHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCi1pZiAoIHR5cGVvZiBkZWZpbmUgPT09
ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKLSAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwg
ZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnk7Ci0gICAgfSk7Ci19Ci0KLQotCi0K
LXZhcgotICAgIC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQotICAgIF9q
UXVlcnkgPSB3aW5kb3cualF1ZXJ5LAotCi0gICAgLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBv
ZiBvdmVyd3JpdGUKLSAgICBfJCA9IHdpbmRvdy4kOwotCi1qUXVlcnkubm9Db25mbGljdCA9IGZ1
bmN0aW9uKCBkZWVwICkgewotICAgIGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKLSAgICAg
ICAgd2luZG93LiQgPSBfJDsKLSAgICB9Ci0KLSAgICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVy
eSA9PT0galF1ZXJ5ICkgewotICAgICAgICB3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKLSAgICB9
Ci0KLSAgICByZXR1cm4galF1ZXJ5OwotfTsKLQotLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVu
dGlmaWVycywgZXZlbiBpbgotLy8gQU1EICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1
Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLS8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3Nl
ciBlbXVsYXRvcnMgKCMxMzU2NikKLWlmICggdHlwZW9mIG5vR2xvYmFsID09PSBzdHJ1bmRlZmlu
ZWQgKSB7Ci0gICAgd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5OwotfQotCi0KLQot
Ci1yZXR1cm4galF1ZXJ5OwotCi19KSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWJlZjgzMTg5YzkxNWVlNzhlY2E4NDdmOTA4YzZkMDJk
NThhNDAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3Nz
CisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLWh0bWwsCi1ib2R5IHsKLSAgICBtYXJn
aW46IDA7Ci0gICAgcGFkZGluZzogMDsKLX0KLQotYnV0dG9uIHsKLSAgICBtYXJnaW46IDA7Ci0g
ICAgcGFkZGluZzogMDsKLSAgICBib3JkZXI6IDA7Ci0gICAgYmFja2dyb3VuZDogbm9uZTsKLSAg
ICBmb250LXNpemU6IDEwMCU7Ci0gICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgIGZv
bnQtZmFtaWx5OiBpbmhlcml0OwotICAgIGNvbG9yOiBpbmhlcml0OwotICAgIC13ZWJraXQtYXBw
ZWFyYW5jZTogbm9uZTsKLSAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTsKLSAgICAtby1hcHBlYXJh
bmNlOiBub25lOwotICAgIGFwcGVhcmFuY2U6IG5vbmU7Ci19Ci0KLWJvZHkgewotICAgIGZvbnQ6
IDE0cHggJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKLSAg
ICBsaW5lLWhlaWdodDogMS40ZW07Ci0gICAgYmFja2dyb3VuZDogI2VhZWFlYSB1cmwoJ2JnLnBu
ZycpOwotICAgIGNvbG9yOiAjNGQ0ZDRkOwotICAgIHdpZHRoOiA1NTBweDsKLSAgICBtYXJnaW46
IDAgYXV0bzsKLSAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAt
bW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbXMtZm9udC1zbW9vdGhpbmc6
IGFudGlhbGlhc2VkOwotICAgIC1vLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICBm
b250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Ci19Ci0KLWJ1dHRvbiwKLWlucHV0W3R5cGU9ImNo
ZWNrYm94Il0gewotICBvdXRsaW5lOiBub25lOwotfQotCi0jdG9kb2FwcCB7Ci0gICAgYmFja2dy
b3VuZDogI2ZmZjsKLSAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Ci0g
ICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwot
ICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7
Ci0gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKLSAgICBib3gtc2hhZG93OiAwIDJw
eCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCi0gICAgICAgICAgICAgICAgMCAyNXB4IDUwcHgg
MCByZ2JhKDAsIDAsIDAsIDAuMTUpOwotfQotCi0jdG9kb2FwcDpiZWZvcmUgewotICAgIGNvbnRl
bnQ6ICcnOwotICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKLSAgICBib3JkZXIt
cmlnaHQ6IDFweCBzb2xpZCAjZjVkNmQ2OwotICAgIHdpZHRoOiAycHg7Ci0gICAgcG9zaXRpb246
IGFic29sdXRlOwotICAgIHRvcDogMDsKLSAgICBsZWZ0OiA0MHB4OwotICAgIGhlaWdodDogMTAw
JTsKLX0KLQotI3RvZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewotICAg
IGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotI3RvZG9hcHAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xk
ZXIgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgICBjb2xvcjogI2E5YTlhOTsKLX0KLQot
I3RvZG9hcHAgaDEgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0xMjBweDsK
LSAgICB3aWR0aDogMTAwJTsKLSAgICBmb250LXNpemU6IDcwcHg7Ci0gICAgZm9udC13ZWlnaHQ6
IGJvbGQ7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIGNvbG9yOiAjYjNiM2IzOwotICAg
IGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Ci0gICAgdGV4dC1zaGFkb3c6IC0xcHgg
LTFweCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0
aW1pemVMZWdpYmlsaXR5OwotICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJp
bGl0eTsKLSAgICAtbXMtdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKLSAgICAt
by10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwotICAgIHRleHQtcmVuZGVyaW5n
OiBvcHRpbWl6ZUxlZ2liaWxpdHk7Ci19Ci0KLSNoZWFkZXIgewotICAgIHBhZGRpbmctdG9wOiAx
NXB4OwotICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7Ci19Ci0KLSNoZWFkZXI6YmVmb3JlIHsK
LSAgICBjb250ZW50OiAnJzsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgdG9wOiAwOwot
ICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6IDA7Ci0gICAgaGVpZ2h0OiAxNXB4OwotICAgIHotaW5k
ZXg6IDI7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7Ci0gICAgYmFja2dy
b3VuZDogIzhkN2Q3NzsKLSAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwg
bGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSksdG8o
cmdiYSgxMDEsIDg0LCA3NiwgMC44KSkpOwotICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFy
LWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2
LCAwLjgpKTsKLSAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwg
MTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOwotICAgIGJvcmRlci10b3At
bGVmdC1yYWRpdXM6IDFweDsKLSAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4OwotfQot
Ci0jbmV3LXRvZG8sCi0uZWRpdCB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIG1hcmdp
bjogMDsKLSAgICB3aWR0aDogMTAwJTsKLSAgICBmb250LXNpemU6IDI0cHg7Ci0gICAgZm9udC1m
YW1pbHk6IGluaGVyaXQ7Ci0gICAgbGluZS1oZWlnaHQ6IDEuNGVtOwotICAgIGJvcmRlcjogMDsK
LSAgICBvdXRsaW5lOiBub25lOwotICAgIGNvbG9yOiBpbmhlcml0OwotICAgIHBhZGRpbmc6IDZw
eDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwotICAgIGJveC1zaGFkb3c6IGluc2V0IDAg
LTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gICAgLW1vei1ib3gtc2l6aW5nOiBib3Jk
ZXItYm94OwotICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIC1vLWJveC1zaXpp
bmc6IGJvcmRlci1ib3g7Ci0gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICAtd2Via2l0
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBh
bnRpYWxpYXNlZDsKLSAgICAtbXMtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwotICAgIC1v
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICBmb250LXNtb290aGluZzogYW50aWFs
aWFzZWQ7Ci19Ci0KLSNuZXctdG9kbyB7Ci0gICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggNjBw
eDsKLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAy
KTsKLSAgICB6LWluZGV4OiAyOwotICAgIGJveC1zaGFkb3c6IG5vbmU7Ci19Ci0KLSNtYWluIHsK
LSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgei1pbmRleDogMjsKLSAgICBib3JkZXItdG9w
OiAxcHggZG90dGVkICNhZGFkYWQ7Ci19Ci0KLWxhYmVsW2Zvcj0ndG9nZ2xlLWFsbCddIHsKLSAg
ICBkaXNwbGF5OiBub25lOwotfQotCi0jdG9nZ2xlLWFsbCB7Ci0gICAgcG9zaXRpb246IGFic29s
dXRlOwotICAgIHRvcDogLTQycHg7Ci0gICAgbGVmdDogLTRweDsKLSAgICB3aWR0aDogNDBweDsK
LSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgLyogTW9iaWxlIFNhZmFyaSAqLwotICAgIGJv
cmRlcjogbm9uZTsKLX0KLQotI3RvZ2dsZS1hbGw6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnwrsn
OwotICAgIGZvbnQtc2l6ZTogMjhweDsKLSAgICBjb2xvcjogI2Q5ZDlkOTsKLSAgICBwYWRkaW5n
OiAwIDI1cHggN3B4OwotfQotCi0jdG9nZ2xlLWFsbDpjaGVja2VkOmJlZm9yZSB7Ci0gICAgY29s
b3I6ICM3MzczNzM7Ci19Ci0KLSN0b2RvLWxpc3QgewotICAgIG1hcmdpbjogMDsKLSAgICBwYWRk
aW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgewotICAg
IHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBmb250LXNpemU6IDI0cHg7Ci0gICAgYm9yZGVyLWJv
dHRvbTogMXB4IGRvdHRlZCAjY2NjOwotfQotCi0jdG9kby1saXN0IGxpOmxhc3QtY2hpbGQgewot
ICAgIGJvcmRlci1ib3R0b206IG5vbmU7Ci19Ci0KLSN0b2RvLWxpc3QgbGkuZWRpdGluZyB7Ci0g
ICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKLSAgICBwYWRkaW5nOiAwOwotfQotCi0jdG9kby1saXN0
IGxpLmVkaXRpbmcgLmVkaXQgewotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHdpZHRoOiA1MDZw
eDsKLSAgICBwYWRkaW5nOiAxM3B4IDE3cHggMTJweCAxN3B4OwotICAgIG1hcmdpbjogMCAwIDAg
NDNweDsKLX0KLQotI3RvZG8tbGlzdCBsaS5lZGl0aW5nIC52aWV3IHsKLSAgICBkaXNwbGF5OiBu
b25lOwotfQotCi0jdG9kby1saXN0IGxpIC50b2dnbGUgewotICAgIHRleHQtYWxpZ246IGNlbnRl
cjsKLSAgICB3aWR0aDogNDBweDsKLSAgICAvKiBhdXRvLCBzaW5jZSBub24tV2ViS2l0IGJyb3dz
ZXJzIGRvZXNuJ3Qgc3VwcG9ydCBpbnB1dCBzdHlsaW5nICovCi0gICAgaGVpZ2h0OiBhdXRvOwot
ICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IDA7Ci0gICAgYm90dG9tOiAwOwotICAg
IG1hcmdpbjogYXV0byAwOwotICAgIC8qIE1vYmlsZSBTYWZhcmkgKi8KLSAgICBib3JkZXI6IG5v
bmU7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICAgIC1tcy1hcHBlYXJhbmNlOiBu
b25lOwotICAgIC1vLWFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgYXBwZWFyYW5jZTogbm9uZTsKLX0K
LQotI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmFmdGVyIHsKLSAgICBjb250ZW50OiAn4pyUJzsKLSAg
ICAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2aXN1YWwgYWRqdXN0bWVudCAqLwotICAgIGxp
bmUtaGVpZ2h0OiA0M3B4OwotICAgIGZvbnQtc2l6ZTogMjBweDsKLSAgICBjb2xvcjogI2Q5ZDlk
OTsKLSAgICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgI2JmYmZiZjsKLX0KLQotI3RvZG8tbGlzdCBs
aSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgewotICAgIGNvbG9yOiAjODVhZGE3OwotICAgIHRleHQt
c2hhZG93OiAwIDFweCAwICM2Njk5OTE7Ci0gICAgYm90dG9tOiAxcHg7Ci0gICAgcG9zaXRpb246
IHJlbGF0aXZlOwotfQotCi0jdG9kby1saXN0IGxpIGxhYmVsIHsKLSAgICB3aGl0ZS1zcGFjZTog
cHJlOwotICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ci0gICAgcGFkZGluZzogMTVweCA2MHB4
IDE1cHggMTVweDsKLSAgICBtYXJnaW4tbGVmdDogNDVweDsKLSAgICBkaXNwbGF5OiBibG9jazsK
LSAgICBsaW5lLWhlaWdodDogMS4yOwotICAgIC13ZWJraXQtdHJhbnNpdGlvbjogY29sb3IgMC40
czsKLSAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjRzOwotfQotCi0jdG9kby1saXN0IGxpLmNvbXBs
ZXRlZCBsYWJlbCB7Ci0gICAgY29sb3I6ICNhOWE5YTk7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBs
aW5lLXRocm91Z2g7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgLmRlc3Ryb3kgewotICAgIGRpc3BsYXk6
IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHRvcDogMDsKLSAgICByaWdodDog
MTBweDsKLSAgICBib3R0b206IDA7Ci0gICAgd2lkdGg6IDQwcHg7Ci0gICAgaGVpZ2h0OiA0MHB4
OwotICAgIG1hcmdpbjogYXV0byAwOwotICAgIGZvbnQtc2l6ZTogMjJweDsKLSAgICBjb2xvcjog
I2E4OGE4YTsKLSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjJzOwotICAgIHRyYW5zaXRp
b246IGFsbCAwLjJzOwotfQotCi0jdG9kby1saXN0IGxpIC5kZXN0cm95OmhvdmVyIHsKLSAgICB0
ZXh0LXNoYWRvdzogMCAwIDFweCAjMDAwLAotICAgICAgICAgICAgICAgICAwIDAgMTBweCByZ2Jh
KDE5OSwgMTA3LCAxMDcsIDAuOCk7Ci0gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7
Ci0gICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4zKTsKLSAgICB0cmFuc2Zvcm06IHNjYWxlKDEu
Myk7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfi
nJYnOwotfQotCi0jdG9kby1saXN0IGxpOmhvdmVyIC5kZXN0cm95IHsKLSAgICBkaXNwbGF5OiBi
bG9jazsKLX0KLQotI3RvZG8tbGlzdCBsaSAuZWRpdCB7Ci0gICAgZGlzcGxheTogbm9uZTsKLX0K
LQotI3RvZG8tbGlzdCBsaS5lZGl0aW5nOmxhc3QtY2hpbGQgewotICAgIG1hcmdpbi1ib3R0b206
IC0xcHg7Ci19Ci0KLSNmb290ZXIgewotICAgIGNvbG9yOiAjNzc3OwotICAgIHBhZGRpbmc6IDAg
MTVweDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgcmlnaHQ6IDA7Ci0gICAgYm90dG9t
OiAtMzFweDsKLSAgICBsZWZ0OiAwOwotICAgIGhlaWdodDogMjBweDsKLSAgICB6LWluZGV4OiAx
OwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotI2Zvb3RlcjpiZWZvcmUgewotICAgIGNv
bnRlbnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICByaWdodDogMDsKLSAgICBi
b3R0b206IDMxcHg7Ci0gICAgbGVmdDogMDsKLSAgICBoZWlnaHQ6IDUwcHg7Ci0gICAgei1pbmRl
eDogLTE7Ci0gICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKLSAg
ICAgICAgICAgICAgICAwIDZweCAwIC0zcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAotICAg
ICAgICAgICAgICAgIDAgN3B4IDFweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwKLSAgICAgICAg
ICAgICAgICAwIDQzcHggMCAtNnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSwKLSAgICAgICAg
ICAgICAgICAwIDQ0cHggMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpOwotfQotCi0jdG9kby1j
b3VudCB7Ci0gICAgZmxvYXQ6IGxlZnQ7Ci0gICAgdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotI2Zp
bHRlcnMgewotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6
IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6
IDA7Ci19Ci0KLSNmaWx0ZXJzIGxpIHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci19Ci0KLSNmaWx0
ZXJzIGxpIGEgewotICAgIGNvbG9yOiAjODM3NTZmOwotICAgIG1hcmdpbjogMnB4OwotICAgIHRl
eHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI2ZpbHRlcnMgbGkgYS5zZWxlY3RlZCB7Ci0gICAg
Zm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLSNjbGVhci1jb21wbGV0ZWQgewotICAgIGZsb2F0OiBy
aWdodDsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0g
ICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwg
MC4xKTsKLSAgICBmb250LXNpemU6IDExcHg7Ci0gICAgcGFkZGluZzogMCAxMHB4OwotICAgIGJv
cmRlci1yYWRpdXM6IDNweDsKLSAgICBib3gtc2hhZG93OiAwIC0xcHggMCAwIHJnYmEoMCwgMCwg
MCwgMC4yKTsKLX0KLQotI2NsZWFyLWNvbXBsZXRlZDpob3ZlciB7Ci0gICAgYmFja2dyb3VuZDog
cmdiYSgwLCAwLCAwLCAwLjE1KTsKLSAgICBib3gtc2hhZG93OiAwIC0xcHggMCAwIHJnYmEoMCwg
MCwgMCwgMC4zKTsKLX0KLQotI2luZm8gewotICAgIG1hcmdpbjogNjVweCBhdXRvIDA7Ci0gICAg
Y29sb3I6ICNhNmE2YTY7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotICAgIHRleHQtc2hhZG93OiAw
IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7
Ci19Ci0KLSNpbmZvIGEgewotICAgIGNvbG9yOiBpbmhlcml0OwotfQotCi0vKgotICAgIEhhY2sg
dG8gcmVtb3ZlIGJhY2tncm91bmQgZnJvbSBNb2JpbGUgU2FmYXJpLgotICAgIENhbid0IHVzZSBp
dCBnbG9iYWxseSBzaW5jZSBpdCBkZXN0cm95cyBjaGVja2JveGVzIGluIEZpcmVmb3ggYW5kIE9w
ZXJhCi0qLwotCi1AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJh
dGlvOjApIHsKLSAgICAjdG9nZ2xlLWFsbCwKLSAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgewot
ICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwotICAgIH0KLQotICAgICN0b2RvLWxpc3QgbGkgLnRv
Z2dsZSB7Ci0gICAgICAgIGhlaWdodDogNDBweDsKLSAgICB9Ci0KLSAgICAjdG9nZ2xlLWFsbCB7
Ci0gICAgICAgIHRvcDogLTU2cHg7Ci0gICAgICAgIGxlZnQ6IC0xNXB4OwotICAgICAgICB3aWR0
aDogNjVweDsKLSAgICAgICAgaGVpZ2h0OiA0MXB4OwotICAgICAgICAtd2Via2l0LXRyYW5zZm9y
bTogcm90YXRlKDkwZGVnKTsKLSAgICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsK
LSAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwotICAgICAgICAtd2Via2l0LWFwcGVh
cmFuY2U6IG5vbmU7Ci0gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgfQotfQotCi0uaGlk
ZGVuIHsKLSAgICBkaXNwbGF5OiBub25lOwotfQotCi1ociB7Ci0gICAgbWFyZ2luOiAyMHB4IDA7
Ci0gICAgYm9yZGVyOiAwOwotICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI0M1QzVDNTsKLSAg
ICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3Rjc7Ci19Ci0KLS5sZWFybiBhIHsKLSAg
ICBmb250LXdlaWdodDogbm9ybWFsOwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBj
b2xvcjogI2I4M2Y0NTsKLX0KLQotLmxlYXJuIGE6aG92ZXIgewotICAgIHRleHQtZGVjb3JhdGlv
bjogdW5kZXJsaW5lOwotICAgIGNvbG9yOiAjNzg3ZTdlOwotfQotCi0ubGVhcm4gaDMsCi0ubGVh
cm4gaDQsCi0ubGVhcm4gaDUgewotICAgIG1hcmdpbjogMTBweCAwOwotICAgIGZvbnQtd2VpZ2h0
OiA1MDA7Ci0gICAgbGluZS1oZWlnaHQ6IDEuMjsKLSAgICBjb2xvcjogIzAwMDsKLX0KLQotLmxl
YXJuIGgzIHsKLSAgICBmb250LXNpemU6IDI0cHg7Ci19Ci0KLS5sZWFybiBoNCB7Ci0gICAgZm9u
dC1zaXplOiAxOHB4OwotfQotCi0ubGVhcm4gaDUgewotICAgIG1hcmdpbi1ib3R0b206IDA7Ci0g
ICAgZm9udC1zaXplOiAxNHB4OwotfQotCi0ubGVhcm4gdWwgewotICAgIHBhZGRpbmc6IDA7Ci0g
ICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OwotfQotCi0ubGVhcm4gbGkgewotICAgIGxpbmUtaGVp
Z2h0OiAyMHB4OwotfQotCi0ubGVhcm4gcCB7Ci0gICAgZm9udC1zaXplOiAxNXB4OwotICAgIGZv
bnQtd2VpZ2h0OiAzMDA7Ci0gICAgbGluZS1oZWlnaHQ6IDEuMzsKLSAgICBtYXJnaW4tdG9wOiAw
OwotICAgIG1hcmdpbi1ib3R0b206IDA7Ci19Ci0KLS5xdW90ZSB7Ci0gICAgYm9yZGVyOiBub25l
OwotICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKLX0KLQotLnF1b3RlIHAgewotICAgIGZvbnQt
c3R5bGU6IGl0YWxpYzsKLX0KLQotLnF1b3RlIHA6YmVmb3JlIHsKLSAgICBjb250ZW50OiAn4oCc
JzsKLSAgICBmb250LXNpemU6IDUwcHg7Ci0gICAgb3BhY2l0eTogLjE1OwotICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0yMHB4OwotICAgIGxlZnQ6IDNweDsKLX0KLQotLnF1b3Rl
IHA6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfigJ0nOwotICAgIGZvbnQtc2l6ZTogNTBweDsKLSAg
ICBvcGFjaXR5OiAuMTU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQy
cHg7Ci0gICAgcmlnaHQ6IDNweDsKLX0KLQotLnF1b3RlIGZvb3RlciB7Ci0gICAgcG9zaXRpb246
IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQwcHg7Ci0gICAgcmlnaHQ6IDA7Ci19Ci0KLS5xdW90
ZSBmb290ZXIgaW1nIHsKLSAgICBib3JkZXItcmFkaXVzOiAzcHg7Ci19Ci0KLS5xdW90ZSBmb290
ZXIgYSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDVweDsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxl
OwotfQotCi0uc3BlZWNoLWJ1YmJsZSB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIHBh
ZGRpbmc6IDEwcHg7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpOwotICAgIGJv
cmRlci1yYWRpdXM6IDVweDsKLX0KLQotLnNwZWVjaC1idWJibGU6YWZ0ZXIgewotICAgIGNvbnRl
bnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IDEwMCU7Ci0gICAgcmln
aHQ6IDMwcHg7Ci0gICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRyYW5zcGFyZW50OwotICAgIGJvcmRl
ci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKLX0KLQotLmxlYXJuLWJhciA+IC5sZWFy
biB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHdpZHRoOiAyNzJweDsKLSAgICB0b3A6
IDhweDsKLSAgICBsZWZ0OiAtMzAwcHg7Ci0gICAgcGFkZGluZzogMTBweDsKLSAgICBib3JkZXIt
cmFkaXVzOiA1cHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAu
Nik7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBsZWZ0OwotICAgIHRyYW5zaXRp
b24tcHJvcGVydHk6IGxlZnQ7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBt
czsKLSAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKLX0KLQotQG1lZGlhIChtaW4td2lk
dGg6IDg5OXB4KSB7Ci0gICAgLmxlYXJuLWJhciB7Ci0gICAgICAgIHdpZHRoOiBhdXRvOwotICAg
ICAgICBtYXJnaW46IDAgMCAwIDMwMHB4OwotICAgIH0KLQotICAgIC5sZWFybi1iYXIgPiAubGVh
cm4gewotICAgICAgICBsZWZ0OiA4cHg7Ci0gICAgfQotCi0gICAgLmxlYXJuLWJhciAjdG9kb2Fw
cCB7Ci0gICAgICAgIHdpZHRoOiA1NTBweDsKLSAgICAgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQw
cHggYXV0bzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
X2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAzNjhlNWVhMDNhNjFhZDM2Njc5YzE1ZWEwYWY2NDg5MTM3MWRiOWVhLi4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCisrKyAvZGV2
L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLShmdW5jdGlvbiAoKSB7Ci0gICAgJ3VzZSBzdHJpY3Qn
OwotCi0gICAgLy8gVW5kZXJzY29yZSdzIFRlbXBsYXRlIE1vZHVsZQotICAgIC8vIENvdXJ0ZXN5
IG9mIHVuZGVyc2NvcmVqcy5vcmcKLSAgICB2YXIgXyA9IChmdW5jdGlvbiAoXykgewotICAgICAg
ICBfLmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVjdCkgewotICAgICAgICAgICAgaWYgKCFvYmpl
Y3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgZm9yICh2YXIgYXJnc0luZGV4ID0gMSwgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5s
ZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7IGFyZ3NJbmRleCsrKSB7Ci0gICAgICAgICAg
ICAgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07Ci0gICAgICAgICAgICAg
ICAgaWYgKGl0ZXJhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBp
dGVyYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldID09IG51
bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxl
W2tleV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2Jq
ZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2Vz
IEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCi0gICAgICAgIC8vIGZv
bGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4K
LSAgICAgICAgXy50ZW1wbGF0ZVNldHRpbmdzID0gewotICAgICAgICAgICAgZXZhbHVhdGUgICAg
OiAvPCUoW1xzXFNdKz8pJT4vZywKLSAgICAgICAgICAgIGludGVycG9sYXRlIDogLzwlPShbXHNc
U10rPyklPi9nLAotICAgICAgICAgICAgZXNjYXBlICAgICAgOiAvPCUtKFtcc1xTXSs/KSU+L2cK
LSAgICAgICAgfTsKLQotICAgICAgICAvLyBXaGVuIGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRp
bmdzYCwgaWYgeW91IGRvbid0IHdhbnQgdG8gZGVmaW5lIGFuCi0gICAgICAgIC8vIGludGVycG9s
YXRpb24sIGV2YWx1YXRpb24gb3IgZXNjYXBpbmcgcmVnZXgsIHdlIG5lZWQgb25lIHRoYXQgaXMK
LSAgICAgICAgLy8gZ3VhcmFudGVlZCBub3QgdG8gbWF0Y2guCi0gICAgICAgIHZhciBub01hdGNo
ID0gLyguKV4vOwotCi0gICAgICAgIC8vIENlcnRhaW4gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVz
Y2FwZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBwdXQgaW50byBhCi0gICAgICAgIC8vIHN0cmluZyBs
aXRlcmFsLgotICAgICAgICB2YXIgZXNjYXBlcyA9IHsKLSAgICAgICAgICAgICInIjogICAgICAi
JyIsCi0gICAgICAgICAgICAnXFwnOiAgICAgJ1xcJywKLSAgICAgICAgICAgICdccic6ICAgICAn
cicsCi0gICAgICAgICAgICAnXG4nOiAgICAgJ24nLAotICAgICAgICAgICAgJ1x0JzogICAgICd0
JywKLSAgICAgICAgICAgICdcdTIwMjgnOiAndTIwMjgnLAotICAgICAgICAgICAgJ1x1MjAyOSc6
ICd1MjAyOScKLSAgICAgICAgfTsKLQotICAgICAgICB2YXIgZXNjYXBlciA9IC9cXHwnfFxyfFxu
fFx0fFx1MjAyOHxcdTIwMjkvZzsKLQotICAgICAgICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBs
YXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLgotICAgICAgICAv
LyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJl
c2VydmVzIHdoaXRlc3BhY2UsCi0gICAgICAgIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90
ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLgotICAgICAgICBfLnRlbXBsYXRlID0gZnVuY3Rp
b24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKLSAgICAgICAgICAgIHZhciByZW5kZXI7Ci0gICAg
ICAgICAgICBzZXR0aW5ncyA9IF8uZGVmYXVsdHMoe30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0
dGluZ3MpOwotCi0gICAgICAgICAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVn
dWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi4KLSAgICAgICAgICAgIHZhciBtYXRjaGVy
ID0gbmV3IFJlZ0V4cChbCi0gICAgICAgICAgICAgICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01h
dGNoKS5zb3VyY2UsCi0gICAgICAgICAgICAgICAgKHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5v
TWF0Y2gpLnNvdXJjZSwKLSAgICAgICAgICAgICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9N
YXRjaCkuc291cmNlCi0gICAgICAgICAgICBdLmpvaW4oJ3wnKSArICd8JCcsICdnJyk7Ci0KLSAg
ICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5n
IGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuCi0gICAgICAgICAgICB2YXIgaW5kZXggPSAwOwotICAg
ICAgICAgICAgdmFyIHNvdXJjZSA9ICJfX3ArPSciOwotICAgICAgICAgICAgdGV4dC5yZXBsYWNl
KG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwg
b2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9m
ZnNldCkKLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoZXNjYXBlciwgZnVuY3Rpb24obWF0
Y2gpIHsgcmV0dXJuICdcXCcgKyBlc2NhcGVzW21hdGNoXTsgfSk7Ci0KLSAgICAgICAgICAgICAg
ICBpZiAoZXNjYXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJytcbigoX190
PSgiICsgZXNjYXBlICsgIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZSkgewotICAgICAgICAg
ICAgICAgICAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiArIGludGVycG9sYXRlICsgIikpPT1u
dWxsPycnOl9fdCkrXG4nIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYg
KGV2YWx1YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFs
dWF0ZSArICJcbl9fcCs9JyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlu
ZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOwotICAgICAgICAgICAgICAgIHJldHVybiBtYXRj
aDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgc291cmNlICs9ICInO1xuIjsKLQotICAg
ICAgICAgICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZh
bHVlcyBpbiBsb2NhbCBzY29wZS4KLSAgICAgICAgICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUp
IHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOwotCi0gICAgICAg
ICAgICBzb3VyY2UgPSAidmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLCIg
KwotICAgICAgICAgICAgICAgICJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1l
bnRzLCcnKTt9O1xuIiArCi0gICAgICAgICAgICAgICAgc291cmNlICsgInJldHVybiBfX3A7XG4i
OwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlbmRlciA9IG5ldyBGdW5j
dGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpOwotICAgICAgICAg
ICAgfSBjYXRjaCAoZSkgewotICAgICAgICAgICAgICAgIGUuc291cmNlID0gc291cmNlOwotICAg
ICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChk
YXRhKSByZXR1cm4gcmVuZGVyKGRhdGEsIF8pOwotICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0g
ZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlz
LCBkYXRhLCBfKTsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhl
IGNvbXBpbGVkIGZ1bmN0aW9uIHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxh
dGlvbi4KLSAgICAgICAgICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRp
bmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKLQotICAgICAg
ICAgICAgcmV0dXJuIHRlbXBsYXRlOwotICAgICAgICB9OwotCi0gICAgICAgIHJldHVybiBfOwot
ICAgIH0pKHt9KTsKLQotICAgIGlmIChsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ3RvZG9tdmMuY29t
JykgewotICAgICAgICB3aW5kb3cuX2dhcSA9IFtbJ19zZXRBY2NvdW50JywnVUEtMzEwODEwNjIt
MSddLFsnX3RyYWNrUGFnZXZpZXcnXV07KGZ1bmN0aW9uKGQsdCl7dmFyIGc9ZC5jcmVhdGVFbGVt
ZW50KHQpLHM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXTtnLnNyYz0nLy93d3cuZ29vZ2xl
LWFuYWx5dGljcy5jb20vZ2EuanMnO3MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxzKX0oZG9j
dW1lbnQsJ3NjcmlwdCcpKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWRpcmVjdCgpIHsKLSAg
ICAgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndGFzdGVqcy5naXRodWIuaW8nKSB7Ci0g
ICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKCd0YXN0ZWpz
LmdpdGh1Yi5pby90b2RvbXZjJywgJ3RvZG9tdmMuY29tJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsKLSAgICAgICAgdmFyIGJhc2U7Ci0KLSAgICAgICAg
Wy9sYWJzLywgL1x3Ki1leGFtcGxlcy9dLmZvckVhY2goZnVuY3Rpb24gKGhyZWYpIHsKLSAgICAg
ICAgICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goaHJlZik7Ci0KLSAgICAgICAg
ICAgIGlmICghYmFzZSAmJiBtYXRjaCkgewotICAgICAgICAgICAgICAgIGJhc2UgPSBsb2NhdGlv
bi5ocmVmLmluZGV4T2YobWF0Y2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAg
ICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5zdWJzdHIoMCwgYmFzZSk7Ci0gICAgfQotCi0gICAg
ZnVuY3Rpb24gZ2V0RmlsZShmaWxlLCBjYWxsYmFjaykgewotICAgICAgICBpZiAoIWxvY2F0aW9u
Lmhvc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmluZm8oJ01pc3MgdGhlIGluZm8g
YmFyPyBSdW4gVG9kb01WQyBmcm9tIGEgc2VydmVyIHRvIGF2b2lkIGEgY3Jvc3Mtb3JpZ2luIGVy
cm9yLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVz
dCgpOwotCi0gICAgICAgIHhoci5vcGVuKCdHRVQnLCBmaW5kUm9vdCgpICsgZmlsZSwgdHJ1ZSk7
Ci0gICAgICAgIHhoci5zZW5kKCk7Ci0KLSAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgp
IHsKLSAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgY2FsbGJhY2spIHsKLSAg
ICAgICAgICAgICAgICBjYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBMZWFybihsZWFybkpTT04sIGNvbmZp
ZykgewotICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGVhcm4pKSB7Ci0gICAgICAgICAg
ICByZXR1cm4gbmV3IExlYXJuKGxlYXJuSlNPTiwgY29uZmlnKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHZhciB0ZW1wbGF0ZSwgZnJhbWV3b3JrOwotCi0gICAgICAgIGlmICh0eXBlb2YgbGVhcm5K
U09OICE9PSAnb2JqZWN0JykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBs
ZWFybkpTT04gPSBKU09OLnBhcnNlKGxlYXJuSlNPTik7Ci0gICAgICAgICAgICB9IGNhdGNoIChl
KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGNvbmZpZykgewotICAgICAgICAgICAgdGVtcGxhdGUgPSBjb25maWcudGVt
cGxhdGU7Ci0gICAgICAgICAgICBmcmFtZXdvcmsgPSBjb25maWcuZnJhbWV3b3JrOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCF0ZW1wbGF0ZSAmJiBsZWFybkpTT04udGVtcGxhdGVzKSB7Ci0g
ICAgICAgICAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50ZW1wbGF0ZXMudG9kb212YzsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICghZnJhbWV3b3JrICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Io
J1tkYXRhLWZyYW1ld29ya10nKSkgewotICAgICAgICAgICAgZnJhbWV3b3JrID0gZG9jdW1lbnQu
cXVlcnlTZWxlY3RvcignW2RhdGEtZnJhbWV3b3JrXScpLmdldEF0dHJpYnV0ZSgnZGF0YS1mcmFt
ZXdvcmsnKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNP
TltmcmFtZXdvcmtdKSB7Ci0gICAgICAgICAgICB0aGlzLmZyYW1ld29ya0pTT04gPSBsZWFybkpT
T05bZnJhbWV3b3JrXTsKLSAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLQot
ICAgICAgICAgICAgdGhpcy5hcHBlbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExlYXJu
LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciBhc2lkZSA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FzaWRlJyk7Ci0gICAgICAgIGFzaWRlLmlubmVySFRNTCA9
IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFtZXdvcmtKU09OKTsKLSAgICAgICAg
YXNpZGUuY2xhc3NOYW1lID0gJ2xlYXJuJzsKLQotICAgICAgICAvLyBMb2NhbGl6ZSBkZW1vIGxp
bmtzCi0gICAgICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9yQWxsKCcuZGVt
by1saW5rJyk7Ci0gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZGVtb0xpbmtz
LCBmdW5jdGlvbiAoZGVtb0xpbmspIHsKLSAgICAgICAgICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0
ZSgnaHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7Ci0g
ICAgICAgIH0pOwotCi0gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lID0gKGRvY3VtZW50
LmJvZHkuY2xhc3NOYW1lICsgJyBsZWFybi1iYXInKS50cmltKCk7Ci0gICAgICAgIGRvY3VtZW50
LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsK
LSAgICB9OwotCi0gICAgcmVkaXJlY3QoKTsKLSAgICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVh
cm4pOwotfSkoKTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9u
ZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2Nv
bXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBiMmE3NjAwODI1ZWUxMWYyMTg0OWVkNDc1NDk5YzdkMWVjYmNjODcwLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCkdJVCBiaW5hcnkgcGF0Y2gKbGl0ZXJhbCAw
CkhjbVY/ZDAwMDAxCgpsaXRlcmFsIDIxMjYKemNtVi1VMihrQnhQKTxoOzNLfExrMDAwZTFOSkxU
cTAwM2tGMDAza0gwe3tSMzRVQiFxMDAwMENQKXQtcz8oWGpFCno+Kzl5YD1ISzdudD1+M3QwMDBP
NU5rbDxaY3dUanUoUTR2fjdLV0VXI1ltP2xLX3Y7VG18IUZjKUBOd0VubXRzaAp6eCFPfno4MUpU
M3BGc20+bT0wNGhWYV9sWGxfYm09K007PWVJPCUkck8ydGFgc3VoKlNyI1BPdyo/YWRxIU8hQ1YK
eiowJmIpcmtDQ0VWKTFuSXVpTEJudFVILU1KSTsmcVlnenxkQE5obm5fYWJpMmdgcHU0TkFNVmlk
M2hTJT9xdXp+CnpqbEpmKHg4Y2o8UEdjam4qSitheyZINXAqbjUkNWUzPzxLQ2M/bzA2bUFzTlNi
Z1BXTz9QeiNDem48IT17PntWUwp6VVZFUDFtc2c5YF5PRlVoU081cnRYSGhSbHlVMmk+NiRCVD1n
bEdge0psY3RHSHJ3UkltKTZCdXU2NWpMUW5eSDgKenZsOWxacVVCQSslcXZNNVhDK3lZQG1mQShZ
Qn5YUD1lfDY8eyUkXmVVOG5ySz92MmNjYkBKb201Q0c+cktBTDdKCnpwbEhFSWF2VnB8MHAxJm0h
R2BUaT88N2laO31ARzcjWil9S20lMiFGSG5RMComP1BMUilHIUhBYUhnVSNjfCRkegp6cGojMEht
ZWFkSWU+YCMpPUpqa2J7Qj1GS25VM3BjLSZZQGpfajYoaDRZfitVcTxQVTM2Qzs1Yj1NXkZgPXAx
ZEkKems8Q1FPUE5hNz4hXko9TEh1bngxeGk0UVhLLVl7Jk1vVDhreTZWYjljfFdobk93Rn5jPTN6
T3k4YWdrdGxpUzYjCnpgIzhGYDlIKUQ9Ym1rOUI1TW5XJl9yIylmJGMrOyRMU3ItQF5BbjhkaGN+
SXF1dXY+ak9LN3B3N0xKOyZYMGkxQwp6R01zSGRQMU9zQG55JCRqIT5YQWlpJTdicDVrPmBweU5B
IX5lcGIpKClwOXpSNFlsNno9VX17Q0lkaDF6KEZwQW8KelFJVyE7MHpwQ3lDNCo3WUxrWkNPQGN1
bDBSXyZ6Z2hzQThFayl6JTwhcC1idnNzcGxZWTJ9UDshdjRDWWo5a21GCnpiMGJOX200VipmXlla
TW9iMihqM3BLan43diNadGtzPUlvK3tzdSVXaXVrZEpIJGI/ZlpraUE9UFlfM09oREJrbwp6KExU
UUhZJkZeXjJoRy1ZYCpaOTN2Yn5jPyooSmNoRGpUZkNzP3pSbSpgKk4qVi0kPT9RcXRoblNyKj9P
UzNzaksKem88X1VeZnt+YWc2MHVsPmpOcEthOTJ7QE5IK1NzdFglQH14QipKayFsfVBaMWNDbElu
c359NV4hUm5jVWsqcm1BCnolU0lWZ3Q1OEVReExKK09pRnE8eXU0ZU9EfDlMdDNkTnNlZnhPdXEp
RCYkXyVqMERncUN5MWd6Y3x0VEQzKm1lZQp6ez0lfDxgYH1fSHlwaE91ezspeGtSZytRbkhDQzNU
Zitrc3BxVjYqfFFLLVJjcUR9ND5La0J1d3F1eVpMVXB8Z3IKelBVYlViRmJCclBkMXhPYF5DKnIt
aTNwOSpGIyhPQmghNFd5QGFDJiohfE98R1hjakRBJlloRns7Y0Q3Km8oR1NeCnpAcFFTRTcpeF84
MT1ReWplNipMUSNUWHUtNyhvO1M4dTN0cERBPFNnY0tjS09wbUE7PUhCWlNAT0ZUQF9YT3Z4cQp6
Kk58M0tMeXRnekg2R1UmJlVvYzRaems0bHVtM1B7OT9mcEk0K1FHUEordjZgMWxmUnEzTGNTKihN
KldLK3xiJU8KemUkej4wX2RkaiVobUNzcGVYZGhZUn0taTlBPUNgRW9DaFVZdUh+XnghOSt8JihQ
Z2IqPkNrPD05anwpKkB4eWZUCnpwUCMrS3Q8fTM5YnwzV2w0ZnhUKCtHP2FIPmdHXmRATUVhVU9K
UmZ5NTVUdEZJN15ZKVZ1TVU9N1BwMHk1NWpTfgp6K1RKKWlnTXlycWtYO3dVOGo2OGlJRHRxSllo
U19EM19PZW0tQGc2bWVfUmZpUX11VF9LLUEtOXFHJX1nazNFOWMKeiE4YEtnc01OWG0pYmVsb1Bm
TXFsKnwmJE0+MXFgaSFjWSlSRlluak5ZdSpnU3ZAOFhlYlY3JX14WUw+NilHSlBKCnpKcEE3SzMx
bGNKdUlGS1N3LXt4NEZYMEsyQXopflhnPGBzT3UkNHxePE1DN0AreGJ3eHNHZ1R2SklBTGpQezY4
TAp6OEFZdVNHUzBHVWdrNldgdjRXO1J5KnVvRVRudWxQaXw1NzMlbHYqWnh3I3Y2eVVRXk1PZmNw
VCNWOFJJRFYjI04KekQxYCtBZW1zT2gpd2JXREV4VmNmcEt6KWp5Vj08fiZaWFBnNmN8WkRFN1U0
Yms8RF4+LSheWEpYNFl6b2lOUnZMCnp5dVk3fjI2dy1QXlp3JTZGfXNoQndWMiQwMmM4UnNTVXk2
ZE05MmRpQ0F4aVgzSVVxc3E1aWc2PlVfIVZ5KnE1JAp6am19MTZ0SnIrUVomVD9Ia2twZUl3Vlgt
cjFFST1AJVpsdDs2PHR3SDg2SUQ+ZyptaiZFIUEpKSVnWEo9eDZ1I2wKemNLRVA+Yng0cnFWKmtg
QkJyWiRNcWp0e1RzSGN4VUg+OylpQUt9QihLaWxhJlZEJWI/Nm0mXjBXSzReJkVaTkFJCno4QU1Z
c18lJEQlfE0rQCtjUXFMLWhpNHlHPmgqandkaWkhVzF7fXA+Wmh3Rll0XzRTdTFralk5PGJBWmp6
fjllawp6X0RpYXIrQWZKRlBfOUB5bVVvJEtXPjwtNWAhJFZOT0kxeShFRFNINFdwQ2lqRV8+YWwh
TnQ9XmVWRVIjdUoxPWIKejtCV0YySWd5RjVMZXhWK3llYyRLaW47QWlAbXlvO0c+ekomanJkVyNl
Y1hoSVpwaDVPWXF3X1BFZmNGNTY8TzE5CnpMKThyIUtNKClpZjBgQD9XNChKZGMpN1dvUEdeJj0k
PHpVc00rSENXYWtDXjN0WnhrK1BqUUd9Qj5aNTxaNlZ4dwp6QkBIclYkJmx+QFRhajcwcGNle2lT
dVJMc1VjekRZXzVUbkRxOFB5X1Ezd2hgRDghNGpLO3ZGZFJQK1EwPXpKeSoKenp1V2QlIWFpQER7
fCpKPEk7T0QmaSVse0pwLTgqUHUzVkdMV2l5azZ2I1htUXF3YC0rJWUkfENKdypAYDV6YjM8CnpF
fXojO2tSaEwmcTVQREc2QG1tKiQ+WnVfWlpFI3EzTWMrTiYxT143aG9oOVFSN2ArTCRjQlA1cHFH
PWZxQTB1aAp6VUJ1a2F4VEZtSCk8fFhidnAyYz1IU2JOa3BYdzczYTVsdjdWJGpiOTIjeVoxNDFA
JFg/Rn1KdDhnSVU3V202bTkKej9lXzs7enNubTZgTFplUD5UPSQpS3I+Wj9rcipVbUZxUjd6eDBD
Nl5ibWNzY0AxQUd0d19yTkg+LVhtJGQqfFE8CnpuJjFMbjB1Nz1sJklMcz4lQ2tKcGBEaUc5RjE4
eDROZStsZzwjaT9lN2pMJXg7NFpuUmtOXk14MDcqcW9NNk48JApFZig+ME4hMmtkTgoKZGlmZiAt
LWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvY3Jvc3Nkb21haW4ueG1sIGIvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9jcm9zc2RvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGMxNmE3YTA3YjM3ZTVkNWY3ZTBl
NTZjODI5ZjcyMDA2NzQ1ODQwMwotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvY3Jvc3Nkb21haW4ueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/
PgorPCFET0NUWVBFIGNyb3NzLWRvbWFpbi1wb2xpY3kgU1lTVEVNICJodHRwOi8vd3d3LmFkb2Jl
LmNvbS94bWwvZHRkcy9jcm9zcy1kb21haW4tcG9saWN5LmR0ZCI+Cis8Y3Jvc3MtZG9tYWluLXBv
bGljeT4KKyAgPCEtLSBSZWFkIHRoaXM6IHd3dy5hZG9iZS5jb20vZGV2bmV0L2FydGljbGVzL2Ny
b3NzZG9tYWluX3BvbGljeV9maWxlX3NwZWMuaHRtbCAtLT4KKworICA8IS0tIE1vc3QgcmVzdHJp
Y3RpdmUgcG9saWN5OiAtLT4KKyAgPHNpdGUtY29udHJvbCBwZXJtaXR0ZWQtY3Jvc3MtZG9tYWlu
LXBvbGljaWVzPSJub25lIi8+CisKKyAgPCEtLSBMZWFzdCByZXN0cmljdGl2ZSBwb2xpY3k6IC0t
PgorICA8IS0tCisgIDxzaXRlLWNvbnRyb2wgcGVybWl0dGVkLWNyb3NzLWRvbWFpbi1wb2xpY2ll
cz0iYWxsIi8+CisgIDxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49IioiIHRvLXBvcnRzPSIqIiBz
ZWN1cmU9ImZhbHNlIi8+CisgIDxhbGxvdy1odHRwLXJlcXVlc3QtaGVhZGVycy1mcm9tIGRvbWFp
bj0iKiIgaGVhZGVycz0iKiIgc2VjdXJlPSJmYWxzZSIvPgorICAtLT4KKzwvY3Jvc3MtZG9tYWlu
LXBvbGljeT4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbCBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbAppbmRleCAxNTkwOTc0ZWY5NjEzYTI4Nzk1NzM5
MGIxYWE4YTRkYTQ2Yzg5MDNhLi43ZTQ4YzE5OTI3ZDUxY2U0OGU4MzFhN2VlNWYwMTQzZjY2NjUw
NjRhIDEwMDY0NAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2luZGV4Lmh0bWwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9pbmRleC5odG1sCkBAIC0xLDc4ICsxLDI2IEBACi08IWRvY3R5cGUg
aHRtbD4KLTxodG1sIGxhbmc9ImVuIiBkYXRhLWZyYW1ld29yaz0iZW1iZXJqcyI+Ci0gICAgPGhl
YWQ+Ci0gICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KLSAgICAgICAgPHRpdGxlPmVtYmVy
LmpzIOKAoiBUb2RvTVZDPC90aXRsZT4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzIj4KLSAgICA8L2hl
YWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMi
IGRhdGEtdGVtcGxhdGUtbmFtZT0idG9kb3MiPgotICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InRv
ZG9hcHAiPgotICAgICAgICAgICAgICAgIDxoZWFkZXIgaWQ9ImhlYWRlciI+Ci0gICAgICAgICAg
ICAgICAgICAgIDxoMT50b2RvczwvaDE+Ci0gICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgaWQ9
Im5ldy10b2RvIiB0eXBlPSJ0ZXh0IiB2YWx1ZT1uZXdUaXRsZSBhY3Rpb249ImNyZWF0ZVRvZG8i
IHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/In19Ci0gICAgICAgICAgICAgICAg
PC9oZWFkZXI+Ci0gICAgICAgICAgICAgICAge3sjaWYgbGVuZ3RofX0KLSAgICAgICAgICAgICAg
ICAgICAgPHNlY3Rpb24gaWQ9Im1haW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlk
PSJ0b2RvLWxpc3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7I2VhY2ggZmlsdGVy
ZWRUb2RvcyBpdGVtQ29udHJvbGxlcj0idG9kbyJ9fQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA8bGkge3tiaW5kLWF0dHIgY2xhc3M9ImlzQ29tcGxldGVkOmNvbXBsZXRlZCBpc0Vk
aXRpbmc6ZWRpdGluZyJ9fT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7
I2lmIGlzRWRpdGluZ319Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
e3tlZGl0LXRvZG8gY2xhc3M9ImVkaXQiIHZhbHVlPWJ1ZmZlcmVkVGl0bGUgZm9jdXMtb3V0PSJk
b25lRWRpdGluZyIgaW5zZXJ0LW5ld2xpbmU9ImRvbmVFZGl0aW5nIiBlc2NhcGUtcHJlc3M9ImNh
bmNlbEVkaXRpbmcifX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxz
ZX19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnB1dCB0eXBl
PSJjaGVja2JveCIgY2xhc3M9InRvZ2dsZSIgY2hlY2tlZD1pc0NvbXBsZXRlZH19Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHt7YWN0aW9uICJlZGl0VG9k
byIgb249ImRvdWJsZUNsaWNrIn19Pnt7dGl0bGV9fTwvbGFiZWw+Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB7e2FjdGlvbiAicmVtb3ZlVG9kbyJ9fSBj
bGFzcz0iZGVzdHJveSI+PC9idXR0b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB7ey9pZn19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7L2VhY2h9fQotICAgICAgICAgICAgICAgICAg
ICAgICAgPC91bD4KLSAgICAgICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgdHlwZT0iY2hlY2ti
b3giIGlkPSJ0b2dnbGUtYWxsIiBjaGVja2VkPWFsbEFyZURvbmV9fQotICAgICAgICAgICAgICAg
ICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmb290ZXIgaWQ9ImZvb3RlciI+
Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57
e3JlbWFpbmluZy5sZW5ndGh9fTwvc3Ryb25nPiB7e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5n
Lmxlbmd0aH19IGxlZnQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dWwgaWQ9ImZp
bHRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAge3sjbGluay10byAidG9kb3MuaW5kZXgiIGFjdGl2ZUNsYXNzPSJz
ZWxlY3RlZCJ9fUFsbHt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwv
bGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rvcy5hY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxl
Y3RlZCJ9fUFjdGl2ZXt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwv
bGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rvcy5jb21wbGV0ZWQiIGFjdGl2ZUNsYXNzPSJz
ZWxlY3RlZCJ9fUNvbXBsZXRlZHt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAg
ICAgICAgICAge3sjaWYgY29tcGxldGVkLmxlbmd0aH19Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgPGJ1dHRvbiBpZD0iY2xlYXItY29tcGxldGVkIiB7e2FjdGlvbiAiY2xlYXJDb21wbGV0
ZWQifX0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyIGNvbXBsZXRlZCAo
e3tjb21wbGV0ZWQubGVuZ3RofX0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0
b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7ey9pZn19Ci0gICAgICAgICAgICAgICAgICAg
IDwvZm9vdGVyPgotICAgICAgICAgICAgICAgIHt7L2lmfX0KLSAgICAgICAgICAgIDwvc2VjdGlv
bj4KLSAgICAgICAgICAgIDxmb290ZXIgaWQ9ImluZm8iPgotICAgICAgICAgICAgICAgIDxwPkRv
dWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAg
ICAgICAgICAgICAgICAgQ3JlYXRlZCBieQotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJo
dHRwOi8vZ2l0aHViLmNvbS90b21kYWxlIj5Ub20gRGFsZTwvYT4sCi0gICAgICAgICAgICAgICAg
ICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5pPC9h
PgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8cD5QYXJ0IG9mIDxhIGhy
ZWY9Imh0dHA6Ly90b2RvbXZjLmNvbSI+VG9kb01WQzwvYT48L3A+Ci0gICAgICAgICAgICA8L2Zv
b3Rlcj4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0
IHNyYz0iYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzIj48L3NjcmlwdD4KLSAgICAg
ICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpz
Ij48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXIv
ZW1iZXIuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50
cy9lbWJlci1kYXRhL2VtYmVyLWRhdGEuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNy
Yz0iYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3Jh
Z2VfYWRhcHRlci5qcyI+PC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgc3JjPSJqcy9hcHAuanMi
Pjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvcm91dGVyLmpzIj48L3NjcmlwdD4K
LSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL21vZGVscy90b2RvLmpzIj48L3NjcmlwdD4KLSAgICAg
ICAgPHNjcmlwdCBzcmM9ImpzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMiPjwvc2Ny
aXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvY29udHJvbGxlcnMvdG9kb19jb250cm9sbGVy
LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL2VkaXRfdG9kb192
aWV3LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL3RvZG9zX3Zp
ZXcuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvaGVscGVycy9wbHVyYWxp
emUuanMiPjwvc2NyaXB0PgotICAgIDwvYm9keT4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cisg
IDxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICA8bWV0YSBodHRwLWVxdWl2
PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgorICAgIDx0aXRsZT5Ub2RvbXZj
PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKyAgICA8
bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFs
LXNjYWxlPTEiPgorICAgIDxiYXNlIGhyZWY9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzIiAvPgorICAg
IAorPG1ldGEgbmFtZT0idG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQiIGNvbnRlbnQ9IiU3QiUy
Mm1vZHVsZVByZWZpeCUyMiUzQSUyMnRvZG9tdmMlMjIlMkMlMjJlbnZpcm9ubWVudCUyMiUzQSUy
MmRldmVsb3BtZW50JTIyJTJDJTIyYmFzZVVSTCUyMiUzQW51bGwlMkMlMjJsb2NhdGlvblR5cGUl
MjIlM0ElMjJhdXRvJTIyJTJDJTIyRW1iZXJFTlYlMjIlM0ElN0IlMjJGRUFUVVJFUyUyMiUzQSU3
QiU3RCU3RCUyQyUyMkFQUCUyMiUzQSU3QiUyMm5hbWUlMjIlM0ElMjJ0b2RvbXZjJTIyJTJDJTIy
dmVyc2lvbiUyMiUzQSUyMjAuMC4wKzVkYmM1ZmI5JTIyJTdEJTJDJTIyZXhwb3J0QXBwbGljYXRp
b25HbG9iYWwlMjIlM0F0cnVlJTdEIiAvPgorCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmNzcyI+CisgICAgPGxpbmsg
cmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212
Yy5jc3MiPgorCisgICAgCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgCisKKyAgICA8c2NyaXB0
IHNyYz0iL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmpzIj48
L3NjcmlwdD4KKworICAgIAorICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL2pzL2FwcC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvYXBwLmpzCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBmODFmNTY0ZGNlMjQ1NzM3YTgyYzI1ODY5
MjcwZjE2MjUxZGM1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvYXBwLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNiAr
MCwwIEBACi0vKmdsb2JhbCBFbWJlciwgRFMsIFRvZG9zOnRydWUgKi8KLXdpbmRvdy5Ub2RvcyA9
IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwotCi1Ub2Rvcy5BcHBsaWNhdGlvbkFkYXB0ZXIg
PSBEUy5MU0FkYXB0ZXIuZXh0ZW5kKHsKLSAgICBuYW1lc3BhY2U6ICd0b2Rvcy1lbWJlcmpzJwot
fSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9f
Y29udHJvbGxlci5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb19j
b250cm9sbGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZlODEwMmVkZGVh
YmFjYjBmNDY1YWMzYjViNTMyNzNjMTQ5YTVmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9k
b19jb250cm9sbGVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLypnbG9iYWwg
VG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9Db250cm9sbGVyID0g
RW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIGlzRWRpdGluZzogZmFsc2UsCi0K
LSAgICAvLyBXZSB1c2UgdGhlIGJ1ZmZlcmVkVGl0bGUgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHZh
bHVlIG9mCi0gICAgLy8gdGhlIG1vZGVsJ3MgdGl0bGUgc28gdGhhdCB3ZSBjYW4gcm9sbCBpdCBi
YWNrIGxhdGVyIGluIHRoZQotICAgIC8vIGBjYW5jZWxFZGl0aW5nYCBhY3Rpb24uCi0gICAgYnVm
ZmVyZWRUaXRsZTogRW1iZXIuY29tcHV0ZWQub25lV2F5KCd0aXRsZScpLAotCi0gICAgYWN0aW9u
czogewotICAgICAgICBlZGl0VG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdGhpcy5z
ZXQoJ2lzRWRpdGluZycsIHRydWUpOwotICAgICAgICB9LAotCi0gICAgICAgIGRvbmVFZGl0aW5n
OiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICB2YXIgYnVmZmVyZWRUaXRsZSA9IHRoaXMuZ2V0
KCdidWZmZXJlZFRpdGxlJykudHJpbSgpOwotCi0gICAgICAgICAgICBpZiAoRW1iZXIuaXNFbXB0
eShidWZmZXJlZFRpdGxlKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBgZG9uZUVkaXRpbmdg
IGFjdGlvbiBnZXRzIHNlbnQgdHdpY2Ugd2hlbiB0aGUgdXNlciBoaXRzCi0gICAgICAgICAgICAg
ICAgLy8gZW50ZXIgKG9uY2UgdmlhICdpbnNlcnQtbmV3bGluZScgYW5kIG9uY2UgdmlhICdmb2N1
cy1vdXQnKS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFdlIGRlYm91
bmNlIG91ciBjYWxsIHRvICdyZW1vdmVUb2RvJyBzbyB0aGF0IGl0IG9ubHkgZ2V0cwotICAgICAg
ICAgICAgICAgIC8vIG1hZGUgb25jZS4KLSAgICAgICAgICAgICAgICBFbWJlci5ydW4uZGVib3Vu
Y2UodGhpcywgJ3JlbW92ZVRvZG8nLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgdmFyIHRvZG8gPSB0aGlzLmdldCgnbW9kZWwnKTsKLSAgICAgICAgICAgICAgICB0
b2RvLnNldCgndGl0bGUnLCBidWZmZXJlZFRpdGxlKTsKLSAgICAgICAgICAgICAgICB0b2RvLnNh
dmUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmUtc2V0IG91ciBuZXdseSBl
ZGl0ZWQgdGl0bGUgdG8gcGVyc2lzdCBpdHMgdHJpbW1lZCB2ZXJzaW9uCi0gICAgICAgICAgICB0
aGlzLnNldCgnYnVmZmVyZWRUaXRsZScsIGJ1ZmZlcmVkVGl0bGUpOwotICAgICAgICAgICAgdGhp
cy5zZXQoJ2lzRWRpdGluZycsIGZhbHNlKTsKLSAgICAgICAgfSwKLQotICAgICAgICBjYW5jZWxF
ZGl0aW5nOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICB0aGlzLnNldCgnYnVmZmVyZWRUaXRs
ZScsIHRoaXMuZ2V0KCd0aXRsZScpKTsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcn
LCBmYWxzZSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgcmVtb3ZlVG9kbzogZnVuY3Rpb24gKCkg
ewotICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2RvKCk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0g
ICAgcmVtb3ZlVG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICB2YXIgdG9kbyA9IHRoaXMuZ2V0
KCdtb2RlbCcpOwotCi0gICAgICAgIHRvZG8uZGVsZXRlUmVjb3JkKCk7Ci0gICAgICAgIHRvZG8u
c2F2ZSgpOwotICAgIH0sCi0KLSAgICBzYXZlV2hlbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkgewot
ICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5zYXZlKCk7Ci0gICAgfS5vYnNlcnZlcygnaXNDb21w
bGV0ZWQnKQotfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xs
ZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xs
ZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIz
OGRlNGMxNDYwNjBjOWEzNGQxNDU1MzExMTMzN2E3ZDhmMDRmNWQuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250
cm9sbGVycy90b2Rvc19jb250cm9sbGVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBA
QAotLypnbG9iYWwgVG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9z
Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgY3JlYXRlVG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdmFyIHRp
dGxlLCB0b2RvOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHRvZG8gdGl0bGUgc2V0IGJ5IHRo
ZSAiTmV3IFRvZG8iIHRleHQgZmllbGQKLSAgICAgICAgICAgIHRpdGxlID0gdGhpcy5nZXQoJ25l
d1RpdGxlJykudHJpbSgpOwotICAgICAgICAgICAgaWYgKCF0aXRsZSkgewotICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBu
ZXcgVG9kbyBtb2RlbAotICAgICAgICAgICAgdG9kbyA9IHRoaXMuc3RvcmUuY3JlYXRlUmVjb3Jk
KCd0b2RvJywgewotICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSwKLSAgICAgICAgICAgICAg
ICBpc0NvbXBsZXRlZDogZmFsc2UKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdG9kby5z
YXZlKCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFyIHRoZSAiTmV3IFRvZG8iIHRleHQgZmllbGQK
LSAgICAgICAgICAgIHRoaXMuc2V0KCduZXdUaXRsZScsICcnKTsKLSAgICAgICAgfSwKLQotICAg
ICAgICBjbGVhckNvbXBsZXRlZDogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdmFyIGNvbXBs
ZXRlZCA9IHRoaXMuZ2V0KCdjb21wbGV0ZWQnKTsKLSAgICAgICAgICAgIGNvbXBsZXRlZC5pbnZv
a2UoJ2RlbGV0ZVJlY29yZCcpOwotICAgICAgICAgICAgY29tcGxldGVkLmludm9rZSgnc2F2ZScp
OwotICAgICAgICB9LAotICAgIH0sCi0KLSAgICAvKiBwcm9wZXJ0aWVzICovCi0KLSAgICByZW1h
aW5pbmc6IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5KCdjb250ZW50JywgJ2lzQ29tcGxldGVkJywg
ZmFsc2UpLAotICAgIGNvbXBsZXRlZDogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ2NvbnRlbnQn
LCAnaXNDb21wbGV0ZWQnLCB0cnVlKSwKLQotICAgIGFsbEFyZURvbmU6IGZ1bmN0aW9uIChrZXks
IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAg
ICB0aGlzLnNldEVhY2goJ2lzQ29tcGxldGVkJywgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJu
IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMu
Z2V0KCdsZW5ndGgnKTsKLSAgICAgICAgICAgIHZhciBjb21wbGV0ZWRMZW5ndGggPSB0aGlzLmdl
dCgnY29tcGxldGVkLmxlbmd0aCcpOwotCi0gICAgICAgICAgICByZXR1cm4gbGVuZ3RoID4gMCAm
JiBsZW5ndGggPT09IGNvbXBsZXRlZExlbmd0aDsKLSAgICAgICAgfQotICAgIH0ucHJvcGVydHko
J2xlbmd0aCcsICdjb21wbGV0ZWQubGVuZ3RoJykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9qcy9oZWxwZXJzL3BsdXJhbGl6ZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
anMvaGVscGVycy9wbHVyYWxpemUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDli
NjI0NGM5NTM4N2RiYzZlYTk4M2M5MjE3MDAyZWY3OTBmNGI5MDcuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9oZWxw
ZXJzL3BsdXJhbGl6ZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLypnbG9iYWwg
VG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLUVtYmVyLkhhbmRsZWJhcnMuaGVscGVy
KCdwbHVyYWxpemUnLCBmdW5jdGlvbiAoc2luZ3VsYXIsIGNvdW50KSB7Ci0gICAgLyogRnJvbSBF
bWJlci1EYXRhICovCi0gICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IoRW1i
ZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7Ci0KLSAgICByZXR1cm4gY291bnQgPT09IDEgPyBz
aW5ndWxhciA6IGluZmxlY3Rvci5wbHVyYWxpemUoc2luZ3VsYXIpOwotfSk7CmRpZmYgLS1naXQg
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy9tb2RlbHMvdG9kby5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5
MTIwMmQxMDBmN2FlM2FhNWVmYjQxMDRmNmVkZjM3YWI2NWNmMC4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVs
cy90b2RvLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKmdsb2JhbCBUb2Rvcywg
RFMgKi8KLSd1c2Ugc3RyaWN0JzsKLQotVG9kb3MuVG9kbyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgdGl0bGU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGlzQ29tcGxldGVkOiBEUy5hdHRyKCdi
b29sZWFuJykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9yb3V0ZXIu
anMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3JvdXRlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMjAzZjYyOWIwNDUxMzllMTFjOTRkYTA4YmQ0MmNiMjJjYTM1ZTYwMC4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2pzL3JvdXRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qZ2xv
YmFsIEVtYmVyLCBUb2RvcyAqLwotJ3VzZSBzdHJpY3QnOwotCi1Ub2Rvcy5Sb3V0ZXIubWFwKGZ1
bmN0aW9uICgpIHsKLSAgICB0aGlzLnJlc291cmNlKCd0b2RvcycsIHsgcGF0aDogJy8nIH0sIGZ1
bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5yb3V0ZSgnYWN0aXZlJyk7Ci0gICAgICAgIHRoaXMu
cm91dGUoJ2NvbXBsZXRlZCcpOwotICAgIH0pOwotfSk7Ci0KLVRvZG9zLlRvZG9zUm91dGUgPSBF
bWJlci5Sb3V0ZS5leHRlbmQoewotICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLnN0b3JlLmZpbmQoJ3RvZG8nKTsKLSAgICB9Ci19KTsKLQotVG9kb3MuVG9kb3NJ
bmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICBzZXR1cENvbnRyb2xsZXI6IGZ1
bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmls
dGVyZWRUb2RvcycsIHRoaXMubW9kZWxGb3IoJ3RvZG9zJykpOwotICAgIH0KLX0pOwotCi1Ub2Rv
cy5Ub2Rvc0FjdGl2ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICBzZXR1cENvbnRy
b2xsZXI6IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgdmFyIHRvZG9zID0gdGhpcy5zdG9yZS5maWx0
ZXIoJ3RvZG8nLCBmdW5jdGlvbiAodG9kbykgewotICAgICAgICAgICAgcmV0dXJuICF0b2RvLmdl
dCgnaXNDb21wbGV0ZWQnKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5jb250cm9sbGVy
Rm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKLSAgICB9Ci19KTsKLQot
VG9kb3MuVG9kb3NDb21wbGV0ZWRSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgc2V0
dXBDb250cm9sbGVyOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciB0b2RvcyA9IHRoaXMuc3Rv
cmUuZmlsdGVyKCd0b2RvJywgZnVuY3Rpb24gKHRvZG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0
b2RvLmdldCgnaXNDb21wbGV0ZWQnKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5jb250
cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKLSAgICB9Ci19
KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3Zp
ZXcuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWVlMzA4MDZhMGM0MzM2YTJhOTgxODlkYmYw
YTkyODIxMWFmNWQwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanMKKysrIC9k
ZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKmdsb2JhbCBUb2RvcywgRW1iZXIgKi8KLSd1c2Ug
c3RyaWN0JzsKLQotVG9kb3MuRWRpdFRvZG9WaWV3ID0gRW1iZXIuVGV4dEZpZWxkLmV4dGVuZCh7
Ci0gICAgZm9jdXNPbkluc2VydDogZnVuY3Rpb24gKCkgewotICAgICAgICAvLyBSZS1zZXQgaW5w
dXQgdmFsdWUgdG8gZ2V0IHJpZCBvZiBhIHJlZHVudGFudCB0ZXh0IHNlbGVjdGlvbgotICAgICAg
ICB0aGlzLiQoKS52YWwodGhpcy4kKCkudmFsKCkpOwotICAgICAgICB0aGlzLiQoKS5mb2N1cygp
OwotICAgIH0ub24oJ2RpZEluc2VydEVsZW1lbnQnKQotfSk7Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
aGVscGVyKCdlZGl0LXRvZG8nLCBUb2Rvcy5FZGl0VG9kb1ZpZXcpOwpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy90b2Rvc192aWV3LmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy92aWV3cy90b2Rvc192aWV3LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCA2NmEwYjcxZTFiZWYyZDkwMDBjYjRjZTAxNjdkZjk2M2I1YjNkYjQ0Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMv
dmlld3MvdG9kb3Nfdmlldy5qcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLypnbG9i
YWwgVG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9zVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBmb2N1c0lucHV0OiBmdW5jdGlvbiAoKSB7Ci0gICAgICAg
IHRoaXMuJCgnI25ldy10b2RvJykuZm9jdXMoKTsKLSAgICB9Lm9uKCdkaWRJbnNlcnRFbGVtZW50
JykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3JlYWRtZS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
ZmU0YmQyNGVlNzA5MGQ2Zjk4NGRmNTY3YTE0NjRjZWMzNWY5YTA3Yy4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JlYWRt
ZS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgRW1iZXIuanMgVG9kb01WQyBF
eGFtcGxlCi0KLT4gQSBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIGFtYml0aW91cyB3ZWIgYXBwbGlj
YXRpb25zLgotCi0+IF9bRW1iZXIuanMgLSBlbWJlcmpzLmNvbV0oaHR0cDovL2VtYmVyanMuY29t
KV8KLQotCi0jIyBMZWFybmluZyBFbWJlci5qcwotCi1UaGUgW0VtYmVyLmpzIHdlYnNpdGVdKGh0
dHA6Ly9lbWJlcmpzLmNvbSkgaXMgYSBncmVhdCByZXNvdXJjZSBmb3IgZ2V0dGluZyBzdGFydGVk
LgotCi1IZXJlIGFyZSBzb21lIGxpbmtzIHlvdSBtYXkgZmluZCBoZWxwZnVsOgotCi0qIFtHdWlk
ZXNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMpCi0qIFtBUEkgUmVmZXJlbmNlXShodHRwOi8v
ZW1iZXJqcy5jb20vYXBpKQotKiBbU2NyZWVuY2FzdCAtIEJ1aWxkaW5nIGFuIEFwcCB3aXRoIEVt
YmVyLmpzXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUdhOTloTWk3d2ZZKQotKiBb
QXBwbGljYXRpb25zIGJ1aWx0IHdpdGggRW1iZXIuanNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9lbWJl
ci11c2VycykKLSogW0Jsb2ddKGh0dHA6Ly9lbWJlcmpzLmNvbS9ibG9nKQotCi1BcnRpY2xlcyBh
bmQgZ3VpZGVzIGZyb20gdGhlIGNvbW11bml0eToKLQotKiBbR2V0dGluZyBJbnRvIEVtYmVyLmpz
XShodHRwOi8vbmV0LnR1dHNwbHVzLmNvbS90dXRvcmlhbHMvamF2YXNjcmlwdC1hamF4L2dldHRp
bmctaW50by1lbWJlci1qcykKLSogW0VtYmVyV2F0Y2hdKGh0dHA6Ly9lbWJlcndhdGNoLmNvbSkK
LSogW0NvZGVTY2hvb2wgY291cnNlIFdhcm1pbmcgVXAgV2l0aCBFbWJlci5qc10oaHR0cHM6Ly93
d3cuY29kZXNjaG9vbC5jb20vY291cnNlcy93YXJtaW5nLXVwLXdpdGgtZW1iZXJqcykKLQotR2V0
IGhlbHAgZnJvbSBvdGhlciBFbWJlci5qcyB1c2VyczoKLQotKiBbRW1iZXIuanMgb24gU3RhY2tP
dmVyZmxvd10oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy90YWdnZWQvZW1iZXIu
anMpCi0qIFtFbWJlci5qcyBvbiBUd2l0dGVyXShodHRwOi8vdHdpdHRlci5jb20vZW1iZXJqcykK
LSogW0VtYmVyLmpzIG9uIEdvb2dsZSArXShodHRwczovL3BsdXMuZ29vZ2xlLmNvbS9jb21tdW5p
dGllcy8xMDYzODcwNDk3OTAzODc0NzEyMDUpCi0KLV9JZiB5b3UgaGF2ZSBvdGhlciBoZWxwZnVs
IGxpbmtzIHRvIHNoYXJlLCBvciBmaW5kIGFueSBvZiB0aGUgbGlua3MgYWJvdmUgbm8gbG9uZ2Vy
IHdvcmssIHBsZWFzZSBbbGV0IHVzIGtub3ddKGh0dHBzOi8vZ2l0aHViLmNvbS90YXN0ZWpzL3Rv
ZG9tdmMvaXNzdWVzKS5fCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JvYm90cy50
eHQgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JvYm90cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjU5MTY0NTJl
NWZmNmM4YjQzZDZkN2M3M2QwMDE1M2QzNGFjMzVkZQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvcm9ib3RzLnR4dApAQCAtMCwwICsxLDMgQEAKKyMgaHR0cDovL3d3dy5y
b2JvdHN0eHQub3JnCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzoKZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlLy5ib3dlcnJjIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmJvd2VycmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTU5ZTE2OTZlN2IyYzk3MDAwNWMzNWVjOGEwZjk0YWVh
NWRmMzZhYwotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5i
b3dlcnJjCkBAIC0wLDAgKzEsNCBAQAoreworICAiZGlyZWN0b3J5IjogImJvd2VyX2NvbXBvbmVu
dHMiLAorICAiYW5hbHl0aWNzIjogZmFsc2UKK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlLy5lZGl0b3Jjb25maWcgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
ZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ3YzU0Mzg0MDNjYTg3NWYxNzBkYjJhYTA3ZDFiZmEz
Njg5NDA2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
ZWRpdG9yY29uZmlnCkBAIC0wLDAgKzEsMzQgQEAKKyMgRWRpdG9yQ29uZmlnIGhlbHBzIGRldmVs
b3BlcnMgZGVmaW5lIGFuZCBtYWludGFpbiBjb25zaXN0ZW50CisjIGNvZGluZyBzdHlsZXMgYmV0
d2VlbiBkaWZmZXJlbnQgZWRpdG9ycyBhbmQgSURFcworIyBlZGl0b3Jjb25maWcub3JnCisKK3Jv
b3QgPSB0cnVlCisKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3Ry
aW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1
ZQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCitbKi5qc10KK2luZGVu
dF9zdHlsZSA9IHNwYWNlCitpbmRlbnRfc2l6ZSA9IDIKKworWyouaGJzXQoraW5zZXJ0X2ZpbmFs
X25ld2xpbmUgPSBmYWxzZQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgor
CitbKi5jc3NdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKK1sqLmh0
bWxdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKK1sqLntkaWZmLG1k
fV0KK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlCmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS8uZW1iZXItY2xpIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmVtYmVyLWNsaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZTY0Y2ZlZDJhODkwNWRjMjM1MDZhZjEwNjBlYzgw
Y2Y4ODc1ODJkCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
LmVtYmVyLWNsaQpAQCAtMCwwICsxLDkgQEAKK3sKKyAgLyoqCisgICAgRW1iZXIgQ0xJIHNlbmRz
IGFuYWx5dGljcyBpbmZvcm1hdGlvbiBieSBkZWZhdWx0LiBUaGUgZGF0YSBpcyBjb21wbGV0ZWx5
CisgICAgYW5vbnltb3VzLCBidXQgdGhlcmUgYXJlIHRpbWVzIHdoZW4geW91IG1pZ2h0IHdhbnQg
dG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLgorCisgICAgU2V0dGluZyBgZGlzYWJsZUFuYWx5dGlj
c2AgdG8gdHJ1ZSB3aWxsIHByZXZlbnQgYW55IGRhdGEgZnJvbSBiZWluZyBzZW50LgorICAqLwor
ICAiZGlzYWJsZUFuYWx5dGljcyI6IGZhbHNlCit9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS8uZ2l0aWdub3JlIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmdp
dGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5iZTA5ZTAzOGI3NWVjMmE3MjU4MDg5MzZhOGM2YjMyYzZhMmY2
MzJiCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmdpdGln
bm9yZQpAQCAtMCwwICsxLDE3IEBACisjIFNlZSBodHRwOi8vaGVscC5naXRodWIuY29tL2lnbm9y
ZS1maWxlcy8gZm9yIG1vcmUgYWJvdXQgaWdub3JpbmcgZmlsZXMuCisKKyMgY29tcGlsZWQgb3V0
cHV0CisjIC9kaXN0CisvdG1wCisKKyMgZGVwZW5kZW5jaWVzCisvbm9kZV9tb2R1bGVzCisvYm93
ZXJfY29tcG9uZW50cworCisjIG1pc2MKKy8uc2Fzcy1jYWNoZQorL2Nvbm5lY3QubG9jaworL2Nv
dmVyYWdlLyoKKy9saWJwZWVyY29ubmVjdGlvbi5sb2cKK25wbS1kZWJ1Zy5sb2cKK3Rlc3RlbS5s
b2cKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wODA5NmVmZmFh
YjM3NDk5NGFkY2IzNTc4ZTk4ODY3NWE0YmVmYTgyCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvLmpzaGludHJjCkBAIC0wLDAgKzEsMzIgQEAKK3sKKyAgInBy
ZWRlZiI6IFsKKyAgICAiZG9jdW1lbnQiLAorICAgICJ3aW5kb3ciLAorICAgICItUHJvbWlzZSIK
KyAgXSwKKyAgImJyb3dzZXIiOiB0cnVlLAorICAiYm9zcyI6IHRydWUsCisgICJjdXJseSI6IHRy
dWUsCisgICJkZWJ1ZyI6IGZhbHNlLAorICAiZGV2ZWwiOiB0cnVlLAorICAiZXFlcWVxIjogdHJ1
ZSwKKyAgImV2aWwiOiB0cnVlLAorICAiZm9yaW4iOiBmYWxzZSwKKyAgImltbWVkIjogZmFsc2Us
CisgICJsYXhicmVhayI6IGZhbHNlLAorICAibmV3Y2FwIjogdHJ1ZSwKKyAgIm5vYXJnIjogdHJ1
ZSwKKyAgIm5vZW1wdHkiOiBmYWxzZSwKKyAgIm5vbmV3IjogZmFsc2UsCisgICJub21lbiI6IGZh
bHNlLAorICAib25ldmFyIjogZmFsc2UsCisgICJwbHVzcGx1cyI6IGZhbHNlLAorICAicmVnZXhw
IjogZmFsc2UsCisgICJ1bmRlZiI6IHRydWUsCisgICJzdWIiOiB0cnVlLAorICAic3RyaWN0Ijog
ZmFsc2UsCisgICJ3aGl0ZSI6IGZhbHNlLAorICAiZXFudWxsIjogdHJ1ZSwKKyAgImVzbmV4dCI6
IHRydWUsCisgICJ1bnVzZWQiOiB0cnVlCit9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS8udHJhdmlzLnltbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy50cmF2
aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjY0NTMzYmVhODliY2MwZjAwOWFmMGNkMjNmZGUwZTRkMDZiOTQ5
MWEKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8udHJhdmlz
LnltbApAQCAtMCwwICsxLDIyIEBACistLS0KK2xhbmd1YWdlOiBub2RlX2pzCitub2RlX2pzOgor
ICAtICI0IgorCitzdWRvOiBmYWxzZQorCitjYWNoZToKKyAgZGlyZWN0b3JpZXM6CisgICAgLSBu
b2RlX21vZHVsZXMKKworYmVmb3JlX2luc3RhbGw6CisgIC0gbnBtIGNvbmZpZyBzZXQgc3BpbiBm
YWxzZQorICAtIG5wbSBpbnN0YWxsIC1nIGJvd2VyCisgIC0gbnBtIGluc3RhbGwgcGhhbnRvbWpz
LXByZWJ1aWx0CisKK2luc3RhbGw6CisgIC0gbnBtIGluc3RhbGwKKyAgLSBib3dlciBpbnN0YWxs
CisKK3NjcmlwdDoKKyAgLSBucG0gdGVzdApkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvLndhdGNobWFuY29uZmlnIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLndh
dGNobWFuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU3ODM0ZTNlNGYzOWMxYTc0NTk0MmRmZTkwODkxNzA4
NTkzZTBlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
d2F0Y2htYW5jb25maWcKQEAgLTAsMCArMSwzIEBACit7CisgICJpZ25vcmVfZGlycyI6IFsidG1w
IiwgImRpc3QiXQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVB
RE1FLm1kIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjViZDhhODNkYmUxNWMzNTg3ODRiNWUxOWU4OGVhZWZmY2M2YTQzNjQKLS0tIC9kZXYvbnVsbAor
KysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9SRUFETUUubWQKQEAgLTAsMCArMSwxNSBA
QAorIyBFbWJlci5qcyBUb2RvTVZDIEV4YW1wbGUgdXNpbmcgRW1iZXIgQ0xJCisKKz4gQSBmcmFt
ZXdvcmsgZm9yIGNyZWF0aW5nIGFtYml0aW91cyB3ZWIgYXBwbGljYXRpb25zLgorCis+IF9bRW1i
ZXIuanMgLSBlbWJlcmpzLmNvbV0oaHR0cDovL2VtYmVyanMuY29tKV8KKz4gX1tFbWJlciBDTEkg
LSBlbWJlci1jbGkuY29tXShodHRwOi8vZW1iZXItY2xpLmNvbSlfCisKKyMjIE5vdGUgZm9yIHBl
b3BsZSB1cGRhdGluZyB0aGlzIGFwcC4KKworVGhlIGBpbmRleC5odG1sYCBhbmQgdGhlIGBhc3Nl
dHNgIGZvbGRlciBpbiB0aGUgcGFyZW50IGZvbGRlciBhcyBzaW1saW5rcyBpbnRvIHRoZSBpdGVt
cyB3aXRoIHRoZQorc2FtZSBuYW1lcyBpbnNpZGUgYGRpc3RgLiBUaGUgYGRpc3RgIGZvbGRlciBo
YXMgdG8gYmUgY2hlY2tlZCBpbiBnaXQgYW5kIGJ1aWx0IGZvciBwcm9kdWN0aW9uLgorCitUbyB3
b3JrIG9uIHRoaXMgY29tbWVudCBgPGJhc2UgaHJlZj0iL2V4YW1wbGVzL2VtYmVyLWNsaS9pbmRl
eC5odG1sIiAvPmAgaW4gdGhlIGBhcHAvaW5kZXguaHRtbGAKK2FuZCB1bmNvbW1lbnRlZCBpdCBi
YWNrIGJlZm9yZSBkb2luZyB0aGUgcHJvZHVjdGlvbiBidWlsZC4KKwpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2FwcC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9hcHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjI2MGM0YzcwNmQwYWUzNzVjZmZjNjk2OWRm
ZTQzNGI1OWQyOTliNQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9hcHAuanMKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVy
JzsKK2ltcG9ydCBSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVyJzsKK2ltcG9ydCBsb2FkSW5pdGlh
bGl6ZXJzIGZyb20gJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJzsKK2ltcG9ydCBjb25maWcgZnJv
bSAnLi9jb25maWcvZW52aXJvbm1lbnQnOworCitsZXQgQXBwOworCitFbWJlci5NT0RFTF9GQUNU
T1JZX0lOSkVDVElPTlMgPSB0cnVlOworCitBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5leHRlbmQo
eworICAgIG1vZHVsZVByZWZpeDogY29uZmlnLm1vZHVsZVByZWZpeCwKKyAgICBwb2RNb2R1bGVQ
cmVmaXg6IGNvbmZpZy5wb2RNb2R1bGVQcmVmaXgsCisgICAgUmVzb2x2ZXIKK30pOworCitsb2Fk
SW5pdGlhbGl6ZXJzKEFwcCwgY29uZmlnLm1vZHVsZVByZWZpeCk7CisKK2V4cG9ydCBkZWZhdWx0
IEFwcDsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25l
bnRzLy5naXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMv
LmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhj
NTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVu
dHMvdG9kby1pdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVu
dHMvdG9kby1pdGVtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBkZTdmYmYxMTY1YjI2MTQ1NDFhNTZhMzkwZDFj
MzM4YzQ5OGUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS9hcHAvY29tcG9uZW50cy90b2RvLWl0ZW0uanMKQEAgLTAsMCArMSw0OSBAQAoraW1wb3J0IEVt
YmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVu
ZCh7CisgICAgcmVwbzogRW1iZXIuaW5qZWN0LnNlcnZpY2UoKSwKKyAgICB0YWdOYW1lOiAnbGkn
LAorICAgIGVkaXRpbmc6IGZhbHNlLAorICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3RvZG8uY29t
cGxldGVkJywgJ2VkaXRpbmcnXSwKKworICAgIGFjdGlvbnM6IHsKKyAgICAgICAgc3RhcnRFZGl0
aW5nKCkgeworICAgICAgICAgICAgdGhpcy5nZXQoJ29uU3RhcnRFZGl0JykoKTsKKyAgICAgICAg
ICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgdHJ1ZSk7CisgICAgICAgICAgICBFbWJlci5ydW4uc2No
ZWR1bGVPbmNlKCdhZnRlclJlbmRlcicsIHRoaXMsICdmb2N1c0lucHV0Jyk7CisgICAgICAgIH0s
CisKKyAgICAgICAgZG9uZUVkaXRpbmcodG9kb1RpdGxlKSB7CisgICAgICAgICAgICBpZiAoIXRo
aXMuZ2V0KCdlZGl0aW5nJykpIHsgcmV0dXJuOyB9CisgICAgICAgICAgICBpZiAoRW1iZXIuaXNC
bGFuayh0b2RvVGl0bGUpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kKCdyZW1vdmVUb2Rv
Jyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0KCd0b2Rv
LnRpdGxlJywgdG9kb1RpdGxlLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2Vk
aXRpbmcnLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhpcy5nZXQoJ29uRW5kRWRpdCcpKCk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgaGFuZGxlS2V5ZG93bihlKSB7
CisgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgICAgICAgICAgIGUu
dGFyZ2V0LmJsdXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykg
eworICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2UpOworICAgICAgICAg
ICAgfQorICAgICAgICB9LAorCisgICAgICAgIHRvZ2dsZUNvbXBsZXRlZChlKSB7CisgICAgICAg
ICAgICBsZXQgdG9kbyA9IHRoaXMuZ2V0KCd0b2RvJyk7CisgICAgICAgICAgICBFbWJlci5zZXQo
dG9kbywgJ2NvbXBsZXRlZCcsIGUudGFyZ2V0LmNoZWNrZWQpOworICAgICAgICAgICAgdGhpcy5n
ZXQoJ3JlcG8nKS5wZXJzaXN0KCk7CisgICAgICAgIH0sCisKKyAgICAgICAgcmVtb3ZlVG9kbygp
IHsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykuZGVsZXRlKHRoaXMuZ2V0KCd0b2RvJykp
OworICAgICAgICB9CisgICAgfSwKKworICAgIGZvY3VzSW5wdXQoKSB7CisgICAgICAgIHRoaXMu
ZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dC5lZGl0JykuZm9jdXMoKTsKKyAgICB9Cit9KTsK
ZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3Rv
ZG8tbGlzdC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3Rv
ZG8tbGlzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kODRlMGUzYTFmZTI5N2ZmNWQ4YWRiMTQxNjMyY2FlOTQy
NjhkMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L2NvbXBvbmVudHMvdG9kby1saXN0LmpzCkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9ydCBFbWJlciBm
cm9tICdlbWJlcic7CisKK2V4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoewor
ICAgIHJlcG86IEVtYmVyLmluamVjdC5zZXJ2aWNlKCksCisgICAgdGFnTmFtZTogJ3NlY3Rpb24n
LAorICAgIGVsZW1lbnRJZDogJ21haW4nLAorICAgIGNhblRvZ2dsZTogdHJ1ZSwKKyAgICBhbGxD
b21wbGV0ZWQ6IEVtYmVyLmNvbXB1dGVkKCd0b2Rvcy5AZWFjaC5jb21wbGV0ZWQnLCBmdW5jdGlv
biAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgndG9kb3MnKS5pc0V2ZXJ5KCdjb21wbGV0
ZWQnKTsKKyAgICB9KSwKKworICAgIGFjdGlvbnM6IHsKKyAgICAgICAgZW5hYmxlVG9nZ2xlKCkg
eworICAgICAgICAgICAgdGhpcy5zZXQoJ2NhblRvZ2dsZScsIHRydWUpOworICAgICAgICB9LAor
CisgICAgICAgIGRpc2FibGVUb2dnbGUoKSB7CisgICAgICAgICAgICB0aGlzLnNldCgnY2FuVG9n
Z2xlJywgZmFsc2UpOworICAgICAgICB9LAorCisgICAgICAgIHRvZ2dsZUFsbCgpIHsKKyAgICAg
ICAgICAgIGxldCBhbGxDb21wbGV0ZWQgPSB0aGlzLmdldCgnYWxsQ29tcGxldGVkJyk7CisgICAg
ICAgICAgICB0aGlzLmdldCgndG9kb3MnKS5mb3JFYWNoKHRvZG8gPT4gRW1iZXIuc2V0KHRvZG8s
ICdjb21wbGV0ZWQnLCAhYWxsQ29tcGxldGVkKSk7CisgICAgICAgICAgICB0aGlzLmdldCgncmVw
bycpLnBlcnNpc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FjdGl2ZS5qcyBiL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hY3RpdmUuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZGYwM2Q0MDc5MDM4ODlhMTQxMzc3MWEzMWRmYzE0YmE0ODkzNWIyNQotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hY3RpdmUuanMK
QEAgLTAsMCArMSw1IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworCitleHBvcnQgZGVm
YXVsdCBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgdG9kb3M6IEVtYmVyLmNvbXB1dGVk
LmZpbHRlckJ5KCdtb2RlbCcsICdjb21wbGV0ZWQnLCBmYWxzZSkKK30pOwpkaWZmIC0tZ2l0IGEv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpz
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9u
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmM4MTRlNWZhNzNjZDllODFjNjM1N2ZkNzExZTVlNjg3YzA5YmNhZmYK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29udHJv
bGxlcnMvYXBwbGljYXRpb24uanMKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IEVtYmVyIGZyb20g
J2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAg
IHJlcG86IEVtYmVyLmluamVjdC5zZXJ2aWNlKCksCisgICAgcmVtYWluaW5nOiBFbWJlci5jb21w
dXRlZC5maWx0ZXJCeSgnbW9kZWwnLCAnY29tcGxldGVkJywgZmFsc2UpLAorICAgIGNvbXBsZXRl
ZDogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcpLAorICAgIGFj
dGlvbnM6IHsKKyAgICAgICAgY3JlYXRlVG9kbyhlKSB7CisgICAgICAgICAgICBpZiAoZS5rZXlD
b2RlID09PSAxMyAmJiAhRW1iZXIuaXNCbGFuayhlLnRhcmdldC52YWx1ZSkpIHsKKyAgICAgICAg
ICAgICAgICB0aGlzLmdldCgncmVwbycpLmFkZCh7IHRpdGxlOiBlLnRhcmdldC52YWx1ZS50cmlt
KCksIGNvbXBsZXRlZDogZmFsc2UgfSk7CisgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUg
PSAnJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBjbGVhckNvbXBsZXRl
ZCgpIHsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnJlbW92ZU9iamVjdHModGhpcy5n
ZXQoJ2NvbXBsZXRlZCcpKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykucGVyc2lzdCgp
OworICAgICAgICB9CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS9hcHAvY29udHJvbGxlcnMvY29tcGxldGVkLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2NvbXBsZXRlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MzRkMDBh
ZmVmNzgwOWE3M2Q0MTkxNTFiOGYwMmVjNWUwNTY3ZjViCi0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2NvbXBsZXRlZC5qcwpAQCAt
MCwwICsxLDUgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisKK2V4cG9ydCBkZWZhdWx0
IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICB0b2RvczogRW1iZXIuY29tcHV0ZWQuZmls
dGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcsIHRydWUpCit9KTsKZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9oZWxwZXJzL2d0LmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvYXBwL2hlbHBlcnMvZ3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjM3MDY5NWEyZjk0NTY1
OWQ5ZjU4NDdkYjEzNzY0ZWFmNjYxMTBlYgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9oZWxwZXJzL2d0LmpzCkBAIC0wLDAgKzEsNyBAQAoraW1wb3J0
IEVtYmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGZ1bmN0aW9uIGd0KFtuMSwgbjJdLyosIGhh
c2gqLykgeworICAgIHJldHVybiBuMSA+IG4yOworfQorCitleHBvcnQgZGVmYXVsdCBFbWJlci5I
ZWxwZXIuaGVscGVyKGd0KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L2FwcC9oZWxwZXJzL3BsdXJhbGl6ZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2Fw
cC9oZWxwZXJzL3BsdXJhbGl6ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMWYxYTJhY2M4Zjg1NjE3ODBkMGI5
NWRmZjczY2E5NjMzYjY4OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2hlbHBlcnMvcGx1cmFsaXplLmpzCkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0
IEVtYmVyIGZyb20gJ2VtYmVyJzsKK2ltcG9ydCB7IHBsdXJhbGl6ZSB9IGZyb20gJ2VtYmVyLWlu
ZmxlY3Rvcic7CisKK2V4cG9ydCBmdW5jdGlvbiBwbHVyYWxpemVIZWxwZXIoW3Npbmd1bGFyLCBj
b3VudF0vKiwgaGFzaCovKSB7CisgICAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBw
bHVyYWxpemUoc2luZ3VsYXIpOworfQorCitleHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuaGVs
cGVyKHBsdXJhbGl6ZUhlbHBlcik7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS9hcHAvaW5kZXguaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9pbmRl
eC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmJhNmY2NDYzZTA0NmRkMzdlMDlkYzc3NGQ1OTcwNjY3YTMwMTEx
NTkKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5k
ZXguaHRtbApAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICA8aGVh
ZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1V
QS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KKyAgICA8dGl0bGU+VG9kb212YzwvdGl0
bGU+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+CisgICAgPG1ldGEg
bmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2Fs
ZT0xIj4KKyAgICA8YmFzZSBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcyIgLz4KKyAgICB7e2Nv
bnRlbnQtZm9yICJoZWFkIn19CisKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy92ZW5kb3IuY3NzIj4KKyAgICA8bGluayByZWw9InN0
eWxlc2hlZXQiIGhyZWY9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmNzcyI+
CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFkLWZvb3RlciJ9fQorICA8L2hlYWQ+CisgIDxib2R5
PgorICAgIHt7Y29udGVudC1mb3IgImJvZHkifX0KKworICAgIDxzY3JpcHQgc3JjPSIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0iL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3RvZG9tdmMuanMiPjwvc2NyaXB0PgorCisg
ICAge3tjb250ZW50LWZvciAiYm9keS1mb290ZXIifX0KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luc3RhbmNlLWluaXRpYWxp
emVycy9nbG9iYWwuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5zdGFuY2Ut
aW5pdGlhbGl6ZXJzL2dsb2JhbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zNGM5YTlkYWRlN2IxMDM1OTFiNThm
ZDZjNDYwYTg4NmM5NzJhMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2luc3RhbmNlLWluaXRpYWxpemVycy9nbG9iYWwuanMKQEAgLTAsMCArMSwx
MCBAQAorLy8gYXBwL2luc3RhbmNlLWluaXRpYWxpemVycy9nbG9iYWwuanMKKworZXhwb3J0IGZ1
bmN0aW9uIGluaXRpYWxpemUoYXBwbGljYXRpb24pIHsKKyAgd2luZG93LkFwcCA9IGFwcGxpY2F0
aW9uOyAgLy8gb3Igd2luZG93LldoYXRldmVyCit9CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgbmFt
ZTogJ2dsb2JhbCcsCisgIGluaXRpYWxpemU6IGluaXRpYWxpemUKK307ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L21vZGVscy8uZ2l0a2VlcCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9tb2RlbHMv
LmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhj
NTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29sdmVy
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29sdmVyLmpzCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjJmYjU2M2Q2YzA0ODhmNDFiZWM0NTRmZTFmYTdjMjI5OTc1YTU4ZGYKLS0tIC9kZXYvbnVs
bAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcmVzb2x2ZXIuanMKQEAgLTAs
MCArMSwzIEBACitpbXBvcnQgUmVzb2x2ZXIgZnJvbSAnZW1iZXItcmVzb2x2ZXInOworCitleHBv
cnQgZGVmYXVsdCBSZXNvbHZlcjsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9yb3V0ZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVy
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjRjNjBiZjkzZmM4N2I2N2Y2MDIzZmRjOTQzOTZjNDE0N2I1YTNkNmMK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVy
LmpzCkBAIC0wLDAgKzEsMTMgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQg
Y29uZmlnIGZyb20gJy4vY29uZmlnL2Vudmlyb25tZW50JzsKKworY29uc3QgUm91dGVyID0gRW1i
ZXIuUm91dGVyLmV4dGVuZCh7CisgICAgbG9jYXRpb246IGNvbmZpZy5sb2NhdGlvblR5cGUKK30p
OworCitSb3V0ZXIubWFwKGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnJvdXRlKCdhY3RpdmUnKTsK
KyAgICB0aGlzLnJvdXRlKCdjb21wbGV0ZWQnKTsKK30pOworCitleHBvcnQgZGVmYXVsdCBSb3V0
ZXI7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzLy5n
aXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy8uZ2l0a2VlcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9u
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy9hcHBsaWNhdGlvbi5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4yOTZhMzc1YmEyYTY1MGNiYTExOTY5Nzk1MTc4NDdmOWVmNjdmODEzCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy9h
cHBsaWNhdGlvbi5qcwpAQCAtMCwwICsxLDggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7
CisKK2V4cG9ydCBkZWZhdWx0IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgcmVwbzogRW1iZXIu
aW5qZWN0LnNlcnZpY2UoKSwKKyAgICBtb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0
KCdyZXBvJykuZmluZEFsbCgpOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL21lbW9yeS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlL2FwcC9zZXJ2aWNlcy9tZW1vcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNGI5ZDVhZjlkNmQx
ZDhkNTljMGNkYjI2ODhiZmVjMmFkYTgyZjNjMgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9tZW1vcnkuanMKQEAgLTAsMCArMSw4MiBA
QAorKGZ1bmN0aW9uKHJvb3QpIHsKKyAgdmFyIGxvY2FsU3RvcmFnZU1lbW9yeSA9IHt9OworICB2
YXIgY2FjaGUgPSB7fTsKKworICAvKioKKyAgICogbnVtYmVyIG9mIHN0b3JlZCBpdGVtcy4KKyAg
ICovCisgIGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGggPSAwOworCisgIC8qKgorICAgKiByZXR1
cm5zIGl0ZW0gZm9yIHBhc3NlZCBrZXksIG9yIG51bGwKKyAgICoKKyAgICogQHBhcmEge1N0cmlu
Z30ga2V5CisgICAqICAgICAgIG5hbWUgb2YgaXRlbSB0byBiZSByZXR1cm5lZAorICAgKiBAcmV0
dXJucyB7U3RyaW5nfG51bGx9CisgICAqLworICBsb2NhbFN0b3JhZ2VNZW1vcnkuZ2V0SXRlbSA9
IGZ1bmN0aW9uKGtleSkgeworICAgIHJldHVybiBjYWNoZVtrZXldIHx8IG51bGw7CisgIH07CisK
KyAgLyoqCisgICAqIHNldHMgaXRlbSBmb3Iga2V5IHRvIHBhc3NlZCB2YWx1ZSwgYXMgU3RyaW5n
CisgICAqCisgICAqIEBwYXJhIHtTdHJpbmd9IGtleQorICAgKiAgICAgICBuYW1lIG9mIGl0ZW0g
dG8gYmUgc2V0CisgICAqIEBwYXJhIHtTdHJpbmd9IHZhbHVlCisgICAqICAgICAgIHZhbHVlLCB3
aWxsIGFsd2F5cyBiZSB0dXJuZWQgaW50byBhIFN0cmluZworICAgKiBAcmV0dXJucyB7dW5kZWZp
bmVkfQorICAgKi8KKyAgbG9jYWxTdG9yYWdlTWVtb3J5LnNldEl0ZW0gPSBmdW5jdGlvbihrZXks
IHZhbHVlKSB7CisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAg
IGxvY2FsU3RvcmFnZU1lbW9yeS5yZW1vdmVJdGVtKGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAg
IGlmICghKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkpKSB7CisgICAgICAgIGxvY2FsU3RvcmFn
ZU1lbW9yeS5sZW5ndGgrKzsKKyAgICAgIH0KKworICAgICAgY2FjaGVba2V5XSA9ICcnICsgdmFs
dWU7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiByZW1vdmVzIGl0ZW0gZm9yIHBhc3NlZCBr
ZXkKKyAgICoKKyAgICogQHBhcmEge1N0cmluZ30ga2V5CisgICAqICAgICAgIG5hbWUgb2YgaXRl
bSB0byBiZSByZW1vdmVkCisgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CisgICAqLworICBsb2Nh
bFN0b3JhZ2VNZW1vcnkucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uKGtleSkgeworICAgIGlmIChjYWNo
ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICBkZWxldGUgY2FjaGVba2V5XTsKKyAgICAg
IGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGgtLTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAq
IHJldHVybnMgbmFtZSBvZiBrZXkgYXQgcGFzc2VkIGluZGV4CisgICAqCisgICAqIEBwYXJhIHtO
dW1iZXJ9IGluZGV4CisgICAqICAgICAgIFBvc2l0aW9uIGZvciBrZXkgdG8gYmUgcmV0dXJuZWQg
KHN0YXJ0cyBhdCAwKQorICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9CisgICAqLworICBsb2Nh
bFN0b3JhZ2VNZW1vcnkua2V5ID0gZnVuY3Rpb24oaW5kZXgpIHsKKyAgICByZXR1cm4gT2JqZWN0
LmtleXMoY2FjaGUpW2luZGV4XSB8fCBudWxsOworICB9OworCisgIC8qKgorICAgKiByZW1vdmVz
IGFsbCBzdG9yZWQgaXRlbXMgYW5kIHNldHMgbGVuZ3RoIHRvIDAKKyAgICoKKyAgICogQHJldHVy
bnMge3VuZGVmaW5lZH0KKyAgICovCisgIGxvY2FsU3RvcmFnZU1lbW9yeS5jbGVhciA9IGZ1bmN0
aW9uKCkgeworICAgIGNhY2hlID0ge307CisgICAgbG9jYWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCA9
IDA7CisgIH07CisKKyAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgeworICAgIG1v
ZHVsZS5leHBvcnRzID0gbG9jYWxTdG9yYWdlTWVtb3J5OworICB9IGVsc2UgeworICAgIHJvb3Qu
bG9jYWxTdG9yYWdlTWVtb3J5ID0gbG9jYWxTdG9yYWdlTWVtb3J5OworICB9Cit9KSh0aGlzKTsK
ZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9yZXBv
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL3JlcG8uanMKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uMDE0N2ZmM2VmYzdlOGFhZWYyN2I3MTAwNTA1YzAxYWQxMWY5YWNkMQotLS0gL2Rl
di9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9yZXBv
LmpzCkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQg
KiBhcyBsb2NhbFN0b3JhZ2VNZW1vcnkgZnJvbSAnLi9tZW1vcnknOworCitleHBvcnQgZGVmYXVs
dCBFbWJlci5TZXJ2aWNlLmV4dGVuZCh7CisgICAgbGFzdElkOiAwLAorICAgIGRhdGE6IG51bGws
CisgICAgZmluZEFsbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdkYXRhJykgfHwKKyAg
ICAgICAgICAgIHRoaXMuc2V0KCdkYXRhJywgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VNZW1vcnku
Z2V0SXRlbSgndG9kb3MnKSB8fCAnW10nKSk7CisgICAgfSwKKworICAgIGFkZChhdHRycykgewor
ICAgICAgICBsZXQgdG9kbyA9IE9iamVjdC5hc3NpZ24oeyBpZDogdGhpcy5pbmNyZW1lbnRQcm9w
ZXJ0eSgnbGFzdElkJykgfSwgYXR0cnMpOworICAgICAgICB0aGlzLmdldCgnZGF0YScpLnB1c2hP
YmplY3QodG9kbyk7CisgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgICAgICByZXR1cm4gdG9k
bzsKKyAgICB9LAorCisgICAgZGVsZXRlKHRvZG8pIHsKKyAgICAgICAgdGhpcy5nZXQoJ2RhdGEn
KS5yZW1vdmVPYmplY3QodG9kbyk7CisgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgIH0sCisK
KyAgICBwZXJzaXN0KCkgeworICAgICAgICBsb2NhbFN0b3JhZ2VNZW1vcnkuc2V0SXRlbSgndG9k
b3MnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmdldCgnZGF0YScpKSk7CisgICAgfQorfSk7CmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvc3R5bGVzL2FwcC5jc3MgYi9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvc3R5bGVzL2FwcC5jc3MKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hY3RpdmUuaGJzIGIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hY3RpdmUuaGJzCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmRlMjQ0ZjQ4N2QyMzgzNDQ4YTQyYTU5ZGYwYmY0MjU2NGUyMWY1NzMKLS0tIC9kZXYvbnVsbAor
KysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2FjdGl2ZS5oYnMK
QEAgLTAsMCArMSBAQAore3t0b2RvLWxpc3QgdG9kb3M9dG9kb3N9fQpcIE5vIG5ld2xpbmUgYXQg
ZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90
ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTE5YjYyMGNkNjMwMThmNjcz
ZWFhOWE3YjkwOGQ1ODk4YTkyMTU4ZgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzCkBAIC0wLDAgKzEsMjkg
QEAKKzxzZWN0aW9uIGlkPSJ0b2RvYXBwIj4KKyAgPGhlYWRlciBpZD0iaGVhZGVyIj4KKyAgICA8
aDE+dG9kb3M8L2gxPgorICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibmV3LXRvZG8iIG9ua2V5
ZG93bj17e2FjdGlvbiAnY3JlYXRlVG9kbyd9fSBwbGFjZWhvbGRlcj0iV2hhdCBuZWVkcyB0byBi
ZSBkb25lPyIgYXV0b2ZvY3VzPgorICA8L2hlYWRlcj4KKyAgICB7e291dGxldH19CisgICAge3sj
aWYgKGd0IG1vZGVsLmxlbmd0aCAwKX19CisgICAgICA8Zm9vdGVyIGlkPSJmb290ZXIiPgorICAg
ICAgICA8c3BhbiBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57e3JlbWFpbmluZy5sZW5ndGh9fTwv
c3Ryb25nPiB7e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5nLmxlbmd0aH19IGxlZnQ8L3NwYW4+
CisgICAgICAgIDx1bCBpZD0iZmlsdGVycyI+CisgICAgICAgICAgPGxpPnt7I2xpbmstdG8gImlu
ZGV4IiBhY3RpdmVDbGFzcz0ic2VsZWN0ZWQifX1BbGx7ey9saW5rLXRvfX08L2xpPgorICAgICAg
ICAgIDxsaT57eyNsaW5rLXRvICJhY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFjdGl2
ZXt7L2xpbmstdG99fTwvbGk+CisgICAgICAgICAgPGxpPnt7I2xpbmstdG8gImNvbXBsZXRlZCIg
YWN0aXZlQ2xhc3M9InNlbGVjdGVkIn19Q29tcGxldGVke3svbGluay10b319PC9saT4KKyAgICAg
ICAgPC91bD4KKyAgICAgICAge3sjaWYgY29tcGxldGVkLmxlbmd0aH19CisgICAgICAgICAgPGJ1
dHRvbiBpZD0iY2xlYXItY29tcGxldGVkIiBvbmNsaWNrPXt7YWN0aW9uICdjbGVhckNvbXBsZXRl
ZCd9fT5DbGVhciBjb21wbGV0ZWQ8L2J1dHRvbj4KKyAgICAgICAge3svaWZ9fQorICAgICAgPC9m
b290ZXI+CisgICAge3svaWZ9fQorPC9zZWN0aW9uPgorPGZvb3RlciBpZD0iaW5mbyI+CisgIDxw
PkRvdWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4KKyAgPHA+CisgICAgQ3JlYXRlZCBieQor
ICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2NpYmVybm94Ij5NaWd1ZWwgQ2FtYmE8L2E+
LAorICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5p
PC9hPgorICA8L3A+CisgIDxwPlBhcnQgb2YgPGEgaHJlZj0iaHR0cDovL3RvZG9tdmMuY29tIj5U
b2RvTVZDPC9hPjwvcD4KKzwvZm9vdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm
ZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcGxl
dGVkLmhicyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcGxl
dGVkLmhicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5kZTI0NGY0ODdkMjM4MzQ0OGE0MmE1OWRmMGJmNDI1NjRlMjFm
NTczCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Rl
bXBsYXRlcy9jb21wbGV0ZWQuaGJzCkBAIC0wLDAgKzEgQEAKK3t7dG9kby1saXN0IHRvZG9zPXRv
ZG9zfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvLmdpdGtlZXAgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvLmdpdGtlZXAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhjNTM5MQpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25l
bnRzL3RvZG8taXRlbS5oYnMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBvbmVudHMvdG9kby1pdGVtLmhicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jMDY5NzVlODY1ZTdiOWEw
NDI3ODVlOGIzODk3N2YzNGFhZDNkYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8taXRlbS5oYnMKQEAg
LTAsMCArMSw2IEBACis8ZGl2IGNsYXNzPSJ2aWV3Ij4KKyAgPGlucHV0IHR5cGU9ImNoZWNrYm94
IiBjbGFzcz0idG9nZ2xlIiBjaGVja2VkPXt7dG9kby5jb21wbGV0ZWR9fSBvbmNoYW5nZT17e2Fj
dGlvbiAndG9nZ2xlQ29tcGxldGVkJ319PgorICA8bGFiZWwgb25kYmxjbGljaz17e2FjdGlvbiAn
c3RhcnRFZGl0aW5nJ319Pnt7dG9kby50aXRsZX19PC9sYWJlbD4KKyAgPGJ1dHRvbiBvbmNsaWNr
PXt7YWN0aW9uICdyZW1vdmVUb2RvJ319IGNsYXNzPSJkZXN0cm95Ij48L2J1dHRvbj4KKzwvZGl2
PgorPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJlZGl0IiB2YWx1ZT17e3RvZG8udGl0bGV9fSBv
bmJsdXI9e3thY3Rpb24gJ2RvbmVFZGl0aW5nJyB2YWx1ZT0ndGFyZ2V0LnZhbHVlJ319IG9ua2V5
ZG93bj17e2FjdGlvbiAnaGFuZGxlS2V5ZG93bid9fSBhdXRvZm9jdXM+ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8tbGlzdC5oYnMgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1saXN0LmhicwpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4zMDlkMDdhMWY0MTdjZjFjMTg4OTMwYzVjYmZiMzNhNzA1MWM3ODY2Ci0tLSAvZGV2L251bGwK
KysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRz
L3RvZG8tbGlzdC5oYnMKQEAgLTAsMCArMSwxMCBAQAore3sjaWYgdG9kb3MubGVuZ3RofX0KKyAg
e3sjaWYgY2FuVG9nZ2xlfX0KKyAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUt
YWxsIiBjaGVja2VkPXt7YWxsQ29tcGxldGVkfX0gb25jaGFuZ2U9e3thY3Rpb24gJ3RvZ2dsZUFs
bCd9fT4KKyAge3svaWZ9fQorICA8dWwgaWQ9InRvZG8tbGlzdCIgY2xhc3M9InRvZG8tbGlzdCI+
CisgICAge3sjZWFjaCB0b2RvcyBhcyB8dG9kb3x9fQorICAgICAge3t0b2RvLWl0ZW0gdG9kbz10
b2RvIG9uU3RhcnRFZGl0PShhY3Rpb24gJ2Rpc2FibGVUb2dnbGUnKSBvbkVuZEVkaXQ9KGFjdGlv
biAnZW5hYmxlVG9nZ2xlJyl9fQorICAgIHt7L2VhY2h9fQorICA8L3VsPgore3svaWZ9fQpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9pbmRleC5o
YnMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2luZGV4Lmhicwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi43ZDU1NjVjMzZhYjM3ZGVhOWExYzQxOWRkZWE3NTNiZjE5NThjZDZmCi0tLSAv
ZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9p
bmRleC5oYnMKQEAgLTAsMCArMSwzIEBACit7eyNpZiBtb2RlbC5sZW5ndGh9fQorICB7e3RvZG8t
bGlzdCB0b2Rvcz1tb2RlbH19Cit7ey9pZn19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS9ib3dlci5qc29uIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYm93ZXIu
anNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi4yMjBhMDAxNGEyZGYyY2VjN2I2NjViNjNiMDM0ZTNiOTU4ODllMjgz
Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYm93ZXIuanNv
bgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgIm5hbWUiOiAidG9kb212YyIsCisgICJkZXBlbmRlbmNp
ZXMiOiB7CisgICAgImVtYmVyIjogIn4yLjYuMCIsCisgICAgImVtYmVyLWNsaS1zaGltcyI6ICIw
LjEuMSIsCisgICAgImVtYmVyLWNsaS10ZXN0LWxvYWRlciI6ICIwLjIuMiIsCisgICAgImVtYmVy
LXF1bml0LW5vdGlmaWNhdGlvbnMiOiAiMC4xLjAiCisgIH0KK30KZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2NvbmZpZy9lbnZpcm9ubWVudC5qcyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2NvbmZpZy9lbnZpcm9ubWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41OTc0NGIz
ZGVjOWVkN2E4ZmM1NDQ5MGE1ZTlhNGZjYjQxOGFkNTZiCi0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29uZmlnL2Vudmlyb25tZW50LmpzCkBAIC0wLDAgKzEs
NDcgQEAKKy8qIGpzaGludCBub2RlOiB0cnVlICovCisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rp
b24gKGVudmlyb25tZW50KSB7CisgICAgdmFyIEVOViA9IHsKKyAgICAgICAgbW9kdWxlUHJlZml4
OiAndG9kb212YycsCisgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCwKKyAgICAgICAg
YmFzZVVSTDogbnVsbCwKKyAgICAgICAgbG9jYXRpb25UeXBlOiAnYXV0bycsCisgICAgICAgIEVt
YmVyRU5WOiB7CisgICAgICAgICAgICBGRUFUVVJFUzogeworICAgICAgICAgICAgICAgIC8vIEhl
cmUgeW91IGNhbiBlbmFibGUgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG9uIGFuIGVtYmVyIGNhbmFy
eSBidWlsZAorICAgICAgICAgICAgICAgIC8vIGUuZy4gJ3dpdGgtY29udHJvbGxlcic6IHRydWUK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBBUFA6IHsKKyAgICAgICAgICAg
IC8vIEhlcmUgeW91IGNhbiBwYXNzIGZsYWdzL29wdGlvbnMgdG8geW91ciBhcHBsaWNhdGlvbiBp
bnN0YW5jZQorICAgICAgICAgICAgLy8gd2hlbiBpdCBpcyBjcmVhdGVkCisgICAgICAgIH0KKyAg
ICB9OworCisgICAgLy8gaWYgKGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnKSB7CisgICAg
Ly8gIEVOVi5BUFAuTE9HX1JFU09MVkVSID0gdHJ1ZTsKKyAgICAvLyAgRU5WLkFQUC5MT0dfQUNU
SVZFX0dFTkVSQVRJT04gPSB0cnVlOworICAgIC8vICBFTlYuQVBQLkxPR19UUkFOU0lUSU9OUyA9
IHRydWU7CisgICAgLy8gIEVOVi5BUFAuTE9HX1RSQU5TSVRJT05TX0lOVEVSTkFMID0gdHJ1ZTsK
KyAgICAvLyAgRU5WLkFQUC5MT0dfVklFV19MT09LVVBTID0gdHJ1ZTsKKyAgICAvLyB9CisKKyAg
ICBpZiAoZW52aXJvbm1lbnQgPT09ICd0ZXN0JykgeworICAgICAgICAvLyBUZXN0ZW0gcHJlZmVy
cyB0aGlzLi4uCisgICAgICAgIEVOVi5iYXNlVVJMID0gJy8nOworICAgICAgICBFTlYubG9jYXRp
b25UeXBlID0gJ25vbmUnOworCisgICAgICAgIC8vIGtlZXAgdGVzdCBjb25zb2xlIG91dHB1dCBx
dWlldGVyCisgICAgICAgIEVOVi5BUFAuTE9HX0FDVElWRV9HRU5FUkFUSU9OID0gZmFsc2U7Cisg
ICAgICAgIEVOVi5BUFAuTE9HX1ZJRVdfTE9PS1VQUyA9IGZhbHNlOworCisgICAgICAgIEVOVi5B
UFAucm9vdEVsZW1lbnQgPSAnI2VtYmVyLXRlc3RpbmcnOworICAgIH0KKworICAgIC8vIGlmIChl
bnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nKSB7CisKKyAgICAvLyB9CisKKyAgICByZXR1cm4g
RU5WOworfTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2VtYmVyLWNs
aS1idWlsZC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2VtYmVyLWNsaS1idWlsZC5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5iMWRiZjU5MThjYjgxMDk4YzgzMGJmMzg1YjFiYzVkOTQ0Y2UwOTVjCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvZW1iZXItY2xpLWJ1
aWxkLmpzCkBAIC0wLDAgKzEsMjYgQEAKKy8qanNoaW50IG5vZGU6dHJ1ZSovCisvKiBnbG9iYWwg
cmVxdWlyZSwgbW9kdWxlICovCit2YXIgRW1iZXJBcHAgPSByZXF1aXJlKCdlbWJlci1jbGkvbGli
L2Jyb2Njb2xpL2VtYmVyLWFwcCcpOworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkZWZh
dWx0cykgeworICAgIHZhciBhcHAgPSBuZXcgRW1iZXJBcHAoZGVmYXVsdHMsIHsKKyAgICAgICAg
Ly8gQWRkIG9wdGlvbnMgaGVyZQorICAgIH0pOworCisgICAgYXBwLmltcG9ydCgndmVuZG9yL2Jh
c2UuY3NzJyk7CisgICAgYXBwLmltcG9ydCgndmVuZG9yL2luZGV4LmNzcycpOworICAgIC8vIFVz
ZSBgYXBwLmltcG9ydGAgdG8gYWRkIGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIHRoZSBnZW5lcmF0
ZWQKKyAgICAvLyBvdXRwdXQgZmlsZXMuCisgICAgLy8KKyAgICAvLyBJZiB5b3UgbmVlZCB0byB1
c2UgZGlmZmVyZW50IGFzc2V0cyBpbiBkaWZmZXJlbnQKKyAgICAvLyBlbnZpcm9ubWVudHMsIHNw
ZWNpZnkgYW4gb2JqZWN0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIFRoYXQKKyAgICAvLyBvYmpl
Y3QncyBrZXlzIHNob3VsZCBiZSB0aGUgZW52aXJvbm1lbnQgbmFtZSBhbmQgdGhlIHZhbHVlcwor
ICAgIC8vIHNob3VsZCBiZSB0aGUgYXNzZXQgdG8gdXNlIGluIHRoYXQgZW52aXJvbm1lbnQuCisg
ICAgLy8KKyAgICAvLyBJZiB0aGUgbGlicmFyeSB0aGF0IHlvdSBhcmUgaW5jbHVkaW5nIGNvbnRh
aW5zIEFNRCBvciBFUzYKKyAgICAvLyBtb2R1bGVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaW1w
b3J0IGludG8geW91ciBhcHBsaWNhdGlvbgorICAgIC8vIHBsZWFzZSBzcGVjaWZ5IGFuIG9iamVj
dCB3aXRoIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMga2V5cworICAgIC8vIGFsb25nIHdpdGggdGhl
IGV4cG9ydHMgb2YgZWFjaCBtb2R1bGUgYXMgaXRzIHZhbHVlLgorCisgICAgcmV0dXJuIGFwcC50
b1RyZWUoKTsKK307CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wYWNr
YWdlLmpzb24gYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wYWNrYWdlLmpzb24KbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uNWJlNjU3MzIwZjIxZDQ2MzdiNGRkYWY3OTc3NGI2OWI2M2FhZDAzMQotLS0gL2Rldi9u
dWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3BhY2thZ2UuanNvbgpAQCAtMCww
ICsxLDQyIEBACit7CisgICJuYW1lIjogInRvZG9tdmMiLAorICAidmVyc2lvbiI6ICIwLjAuMCIs
CisgICJkZXNjcmlwdGlvbiI6ICJTbWFsbCBkZXNjcmlwdGlvbiBmb3IgdG9kb212YyBnb2VzIGhl
cmUiLAorICAicHJpdmF0ZSI6IHRydWUsCisgICJkaXJlY3RvcmllcyI6IHsKKyAgICAiZG9jIjog
ImRvYyIsCisgICAgInRlc3QiOiAidGVzdHMiCisgIH0sCisgICJzY3JpcHRzIjogeworICAgICJi
dWlsZCI6ICJlbWJlciBidWlsZCIsCisgICAgInN0YXJ0IjogImVtYmVyIHNlcnZlciIsCisgICAg
InRlc3QiOiAiZW1iZXIgdGVzdCIKKyAgfSwKKyAgInJlcG9zaXRvcnkiOiAiIiwKKyAgImVuZ2lu
ZXMiOiB7CisgICAgIm5vZGUiOiAiPj0gMC4xMC4wIgorICB9LAorICAiYXV0aG9yIjogIiIsCisg
ICJsaWNlbnNlIjogIk1JVCIsCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImJyb2Njb2xp
LWFzc2V0LXJldiI6ICJeMi40LjIiLAorICAgICJlbWJlci1hamF4IjogIjAuNy4xIiwKKyAgICAi
ZW1iZXItY2xpIjogIjIuNS4wIiwKKyAgICAiZW1iZXItY2xpLWFwcC12ZXJzaW9uIjogIl4xLjAu
MCIsCisgICAgImVtYmVyLWNsaS1iYWJlbCI6ICJeNS4xLjYiLAorICAgICJlbWJlci1jbGktZGVw
ZW5kZW5jeS1jaGVja2VyIjogIl4xLjIuMCIsCisgICAgImVtYmVyLWNsaS1odG1sYmFycyI6ICJe
MS4wLjMiLAorICAgICJlbWJlci1jbGktaHRtbGJhcnMtaW5saW5lLXByZWNvbXBpbGUiOiAiXjAu
My4xIiwKKyAgICAiZW1iZXItY2xpLWluamVjdC1saXZlLXJlbG9hZCI6ICJeMS40LjAiLAorICAg
ICJlbWJlci1jbGktanNoaW50IjogIl4xLjAuMCIsCisgICAgImVtYmVyLWNsaS1xdW5pdCI6ICJe
MS40LjAiLAorICAgICJlbWJlci1jbGktcmVsZWFzZSI6ICIwLjIuOCIsCisgICAgImVtYmVyLWNs
aS1zcmkiOiAiXjIuMS4wIiwKKyAgICAiZW1iZXItY2xpLXVnbGlmeSI6ICJeMS4yLjAiLAorICAg
ICJlbWJlci1leHBvcnQtYXBwbGljYXRpb24tZ2xvYmFsIjogIl4xLjAuNSIsCisgICAgImVtYmVy
LWluZmxlY3RvciI6ICIxLjkuNCIsCisgICAgImVtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzIjogIl4w
LjUuMSIsCisgICAgImVtYmVyLXJlc29sdmVyIjogIl4yLjAuMyIsCisgICAgImxvYWRlci5qcyI6
ICJeNC4wLjEiCisgIH0KK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3B1YmxpYy9jcm9zc2RvbWFpbi54bWwgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wdWJs
aWMvY3Jvc3Nkb21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBjMTZhN2EwN2IzN2U1ZDVmN2UwZTU2Yzgy
OWY3MjAwNjc0NTg0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS9wdWJsaWMvY3Jvc3Nkb21haW4ueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNp
b249IjEuMCI/PgorPCFET0NUWVBFIGNyb3NzLWRvbWFpbi1wb2xpY3kgU1lTVEVNICJodHRwOi8v
d3d3LmFkb2JlLmNvbS94bWwvZHRkcy9jcm9zcy1kb21haW4tcG9saWN5LmR0ZCI+Cis8Y3Jvc3Mt
ZG9tYWluLXBvbGljeT4KKyAgPCEtLSBSZWFkIHRoaXM6IHd3dy5hZG9iZS5jb20vZGV2bmV0L2Fy
dGljbGVzL2Nyb3NzZG9tYWluX3BvbGljeV9maWxlX3NwZWMuaHRtbCAtLT4KKworICA8IS0tIE1v
c3QgcmVzdHJpY3RpdmUgcG9saWN5OiAtLT4KKyAgPHNpdGUtY29udHJvbCBwZXJtaXR0ZWQtY3Jv
c3MtZG9tYWluLXBvbGljaWVzPSJub25lIi8+CisKKyAgPCEtLSBMZWFzdCByZXN0cmljdGl2ZSBw
b2xpY3k6IC0tPgorICA8IS0tCisgIDxzaXRlLWNvbnRyb2wgcGVybWl0dGVkLWNyb3NzLWRvbWFp
bi1wb2xpY2llcz0iYWxsIi8+CisgIDxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49IioiIHRvLXBv
cnRzPSIqIiBzZWN1cmU9ImZhbHNlIi8+CisgIDxhbGxvdy1odHRwLXJlcXVlc3QtaGVhZGVycy1m
cm9tIGRvbWFpbj0iKiIgaGVhZGVycz0iKiIgc2VjdXJlPSJmYWxzZSIvPgorICAtLT4KKzwvY3Jv
c3MtZG9tYWluLXBvbGljeT4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3B1YmxpYy9yb2JvdHMudHh0IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL3Jv
Ym90cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZjU5MTY0NTJlNWZmNmM4YjQzZDZkN2M3M2QwMDE1M2QzNGFj
MzVkZQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3B1Ymxp
Yy9yb2JvdHMudHh0CkBAIC0wLDAgKzEsMyBAQAorIyBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcK
K1VzZXItYWdlbnQ6ICoKK0Rpc2FsbG93OgpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdGVtLmpz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmRlMTQyZWUxMDRmZTZjNjFhNmQyYWI5YTc1NTQwNTM3NGQwODIyYjUKLS0t
IC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0ZW0uanMKQEAg
LTAsMCArMSwxMyBAQAorLypqc2hpbnQgbm9kZTp0cnVlKi8KK21vZHVsZS5leHBvcnRzID0gewor
ICAgIGZyYW1ld29yazogJ3F1bml0JywKKyAgICB0ZXN0X3BhZ2U6ICd0ZXN0cy9pbmRleC5odG1s
P2hpZGVwYXNzZWQnLAorICAgIGRpc2FibGVfd2F0Y2hpbmc6IHRydWUsCisgICAgbGF1bmNoX2lu
X2NpOiBbCisgICAgICAgICdQaGFudG9tSlMnCisgICAgXSwKKyAgICBsYXVuY2hfaW5fZGV2OiBb
CisgICAgICAgICdQaGFudG9tSlMnLAorICAgICAgICAnQ2hyb21lJworICAgIF0KK307CmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy8uanNoaW50cmMgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy8uanNoaW50cmMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmVjMGI3
YzE1NGIwOTMzNzI5MWM1ZDczNmU5OWQ1OTI4ZDU2MDU0OQotLS0gL2Rldi9udWxsCisrKyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzLy5qc2hpbnRyYwpAQCAtMCwwICsxLDUyIEBA
Cit7CisgICJwcmVkZWYiOiBbCisgICAgImRvY3VtZW50IiwKKyAgICAid2luZG93IiwKKyAgICAi
bG9jYXRpb24iLAorICAgICJzZXRUaW1lb3V0IiwKKyAgICAiJCIsCisgICAgIi1Qcm9taXNlIiwK
KyAgICAiZGVmaW5lIiwKKyAgICAiY29uc29sZSIsCisgICAgInZpc2l0IiwKKyAgICAiZXhpc3Rz
IiwKKyAgICAiZmlsbEluIiwKKyAgICAiY2xpY2siLAorICAgICJrZXlFdmVudCIsCisgICAgInRy
aWdnZXJFdmVudCIsCisgICAgImZpbmQiLAorICAgICJmaW5kV2l0aEFzc2VydCIsCisgICAgIndh
aXQiLAorICAgICJEUyIsCisgICAgImFuZFRoZW4iLAorICAgICJjdXJyZW50VVJMIiwKKyAgICAi
Y3VycmVudFBhdGgiLAorICAgICJjdXJyZW50Um91dGVOYW1lIgorICBdLAorICAibm9kZSI6IGZh
bHNlLAorICAiYnJvd3NlciI6IGZhbHNlLAorICAiYm9zcyI6IHRydWUsCisgICJjdXJseSI6IHRy
dWUsCisgICJkZWJ1ZyI6IGZhbHNlLAorICAiZGV2ZWwiOiBmYWxzZSwKKyAgImVxZXFlcSI6IHRy
dWUsCisgICJldmlsIjogdHJ1ZSwKKyAgImZvcmluIjogZmFsc2UsCisgICJpbW1lZCI6IGZhbHNl
LAorICAibGF4YnJlYWsiOiBmYWxzZSwKKyAgIm5ld2NhcCI6IHRydWUsCisgICJub2FyZyI6IHRy
dWUsCisgICJub2VtcHR5IjogZmFsc2UsCisgICJub25ldyI6IGZhbHNlLAorICAibm9tZW4iOiBm
YWxzZSwKKyAgIm9uZXZhciI6IGZhbHNlLAorICAicGx1c3BsdXMiOiBmYWxzZSwKKyAgInJlZ2V4
cCI6IGZhbHNlLAorICAidW5kZWYiOiB0cnVlLAorICAic3ViIjogdHJ1ZSwKKyAgInN0cmljdCI6
IGZhbHNlLAorICAid2hpdGUiOiBmYWxzZSwKKyAgImVxbnVsbCI6IHRydWUsCisgICJlc25leHQi
OiB0cnVlLAorICAidW51c2VkIjogdHJ1ZQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9kZXN0cm95LWFwcC5qcyBiL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvZGVzdHJveS1hcHAuanMKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTNk
NDk4OTUwMTJkOTZhMjljYTVhYzdjNjFkYWRhZmFhOWIzY2E0NQotLS0gL2Rldi9udWxsCisrKyBi
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvZGVzdHJveS1hcHAuanMK
QEAgLTAsMCArMSw1IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworCitleHBvcnQgZGVm
YXVsdCBmdW5jdGlvbiBkZXN0cm95QXBwKGFwcGxpY2F0aW9uKSB7CisgICAgRW1iZXIucnVuKGFw
cGxpY2F0aW9uLCAnZGVzdHJveScpOworfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdHMvaGVscGVycy9tb2R1bGUtZm9yLWFjY2VwdGFuY2UuanMgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy9oZWxwZXJzL21vZHVsZS1mb3ItYWNjZXB0YW5jZS5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kYmQ4MGZjMDQyYzY4MmNhYTIwZWYwZDBlNjg0NWU0NzQ1ZTFhYjBlCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVy
cy9tb2R1bGUtZm9yLWFjY2VwdGFuY2UuanMKQEAgLTAsMCArMSwyMiBAQAoraW1wb3J0IHsgbW9k
dWxlIH0gZnJvbSAncXVuaXQnOworaW1wb3J0IHN0YXJ0QXBwIGZyb20gJy4uL2hlbHBlcnMvc3Rh
cnQtYXBwJzsKK2ltcG9ydCBkZXN0cm95QXBwIGZyb20gJy4uL2hlbHBlcnMvZGVzdHJveS1hcHAn
OworCitleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucyA9IHt9KSB7CisgICAg
bW9kdWxlKG5hbWUsIHsKKyAgICAgICAgYmVmb3JlRWFjaCgpIHsKKyAgICAgICAgICAgIHRoaXMu
YXBwbGljYXRpb24gPSBzdGFydEFwcCgpOworCisgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZv
cmVFYWNoKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5iZWZvcmVFYWNoLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgYWZ0ZXJF
YWNoKCkgeworICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXJFYWNoKSB7CisgICAgICAgICAg
ICAgICAgb3B0aW9ucy5hZnRlckVhY2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGRlc3Ryb3lBcHAodGhpcy5hcHBsaWNhdGlvbik7CisgICAgICAg
IH0KKyAgICB9KTsKK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rl
c3RzL2hlbHBlcnMvcmVzb2x2ZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0
cy9oZWxwZXJzL3Jlc29sdmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUwZTkxNzlmNTQ2MzUwMjVmOTUwNGEz
NDllNDIzMDJhODAwNWZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS90ZXN0cy9oZWxwZXJzL3Jlc29sdmVyLmpzCkBAIC0wLDAgKzEsMTEgQEAKK2ltcG9y
dCBSZXNvbHZlciBmcm9tICcuLi8uLi9yZXNvbHZlcic7CitpbXBvcnQgY29uZmlnIGZyb20gJy4u
Ly4uL2NvbmZpZy9lbnZpcm9ubWVudCc7CisKK2NvbnN0IHJlc29sdmVyID0gUmVzb2x2ZXIuY3Jl
YXRlKCk7CisKK3Jlc29sdmVyLm5hbWVzcGFjZSA9IHsKKyAgICBtb2R1bGVQcmVmaXg6IGNvbmZp
Zy5tb2R1bGVQcmVmaXgsCisgICAgcG9kTW9kdWxlUHJlZml4OiBjb25maWcucG9kTW9kdWxlUHJl
Zml4Cit9OworCitleHBvcnQgZGVmYXVsdCByZXNvbHZlcjsKZGlmZiAtLWdpdCBhL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvc3RhcnQtYXBwLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9zdGFydC1hcHAuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZWYxYjZiNTVlZThlNzk2OTc4MzcxZDI3YjBhMzNmY2Y3NDE5NjlkZQotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvc3RhcnQtYXBwLmpz
CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQgQXBw
bGljYXRpb24gZnJvbSAnLi4vLi4vYXBwJzsKK2ltcG9ydCBjb25maWcgZnJvbSAnLi4vLi4vY29u
ZmlnL2Vudmlyb25tZW50JzsKKworZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRBcHAoYXR0
cnMpIHsKKyAgICBsZXQgYXBwbGljYXRpb247CisKKyAgICBsZXQgYXR0cmlidXRlcyA9IEVtYmVy
Lm1lcmdlKHt9LCBjb25maWcuQVBQKTsKKyAgICBhdHRyaWJ1dGVzID0gRW1iZXIubWVyZ2UoYXR0
cmlidXRlcywgYXR0cnMpOyAvLyB1c2UgZGVmYXVsdHMsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlOwor
CisgICAgRW1iZXIucnVuKCgpID0+IHsKKyAgICAgICAgYXBwbGljYXRpb24gPSBBcHBsaWNhdGlv
bi5jcmVhdGUoYXR0cmlidXRlcyk7CisgICAgICAgIGFwcGxpY2F0aW9uLnNldHVwRm9yVGVzdGlu
ZygpOworICAgICAgICBhcHBsaWNhdGlvbi5pbmplY3RUZXN0SGVscGVycygpOworICAgIH0pOwor
CisgICAgcmV0dXJuIGFwcGxpY2F0aW9uOworfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvdGVzdHMvaW5kZXguaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3Rlc3RzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2Y0NDIwODMzMjlhN2IwMWM1MGFjODgxNTk1
NGQ3NmM0OWE4ZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL3Rlc3RzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCFET0NUWVBFIGh0bWw+Cis8
aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0
dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxl
PlRvZG9tdmMgVGVzdHM8L3RpdGxlPgorICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250
ZW50PSIiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Ut
d2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFkIn19Cisg
ICAge3tjb250ZW50LWZvciAidGVzdC1oZWFkIn19CisKKyAgICA8bGluayByZWw9InN0eWxlc2hl
ZXQiIGhyZWY9ImFzc2V0cy92ZW5kb3IuY3NzIj4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9ImFzc2V0cy90b2RvbXZjLmNzcyI+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSJhc3NldHMvdGVzdC1zdXBwb3J0LmNzcyI+CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFk
LWZvb3RlciJ9fQorICAgIHt7Y29udGVudC1mb3IgInRlc3QtaGVhZC1mb290ZXIifX0KKyAgPC9o
ZWFkPgorICA8Ym9keT4KKyAgICB7e2NvbnRlbnQtZm9yICJib2R5In19CisgICAge3tjb250ZW50
LWZvciAidGVzdC1ib2R5In19CisKKyAgICA8c2NyaXB0IHNyYz0idGVzdGVtLmpzIiBpbnRlZ3Jp
dHk9IiI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy92ZW5kb3IuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSJhc3NldHMvdGVzdC1zdXBwb3J0LmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iYXNzZXRzL3RvZG9tdmMuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSJhc3NldHMvdGVzdHMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJhc3Nl
dHMvdGVzdC1sb2FkZXIuanMiPjwvc2NyaXB0PgorCisgICAge3tjb250ZW50LWZvciAiYm9keS1m
b290ZXIifX0KKyAgICB7e2NvbnRlbnQtZm9yICJ0ZXN0LWJvZHktZm9vdGVyIn19CisgIDwvYm9k
eT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3Rz
L2ludGVncmF0aW9uLy5naXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMv
aW50ZWdyYXRpb24vLmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFl
Nzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dGVzdHMvdGVzdC1oZWxwZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy90
ZXN0LWhlbHBlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzk5NjFmZDU2YTEyYjdlZTJiMmQ4YzE3NTIwZWZk
YTNkNmEwZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dGVzdHMvdGVzdC1oZWxwZXIuanMKQEAgLTAsMCArMSw2IEBACitpbXBvcnQgcmVzb2x2ZXIgZnJv
bSAnLi9oZWxwZXJzL3Jlc29sdmVyJzsKK2ltcG9ydCB7CisgICAgc2V0UmVzb2x2ZXIKK30gZnJv
bSAnZW1iZXItcXVuaXQnOworCitzZXRSZXNvbHZlcihyZXNvbHZlcik7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy91bml0Ly5naXRrZWVwIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvdW5pdC8uZ2l0a2VlcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5
YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvLmdpdGtlZXAgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS92ZW5kb3IvLmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFl
Nzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dmVuZG9yL2Jhc2UuY3NzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9yL2Jhc2Uu
Y3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjRkMjVkM2M4NGFjNmM2YWVmMjZiOTY4M2EyYmMxMGM2MWY5NjBjOGYK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvYmFz
ZS5jc3MKQEAgLTAsMCArMSwxNDEgQEAKK2hyIHsKKyAgICBtYXJnaW46IDIwcHggMDsKKyAgICBi
b3JkZXI6IDA7CisgICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjYzVjNWM1OworICAgIGJvcmRl
ci1ib3R0b206IDFweCBkYXNoZWQgI2Y3ZjdmNzsKK30KKworLmxlYXJuIGEgeworICAgIGZvbnQt
d2VpZ2h0OiBub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiAj
YjgzZjQ1OworfQorCisubGVhcm4gYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRl
cmxpbmU7CisgICAgY29sb3I6ICM3ODdlN2U7Cit9CisKKy5sZWFybiBoMywKKy5sZWFybiBoNCwK
Ky5sZWFybiBoNSB7CisgICAgbWFyZ2luOiAxMHB4IDA7CisgICAgZm9udC13ZWlnaHQ6IDUwMDsK
KyAgICBsaW5lLWhlaWdodDogMS4yOworICAgIGNvbG9yOiAjMDAwOworfQorCisubGVhcm4gaDMg
eworICAgIGZvbnQtc2l6ZTogMjRweDsKK30KKworLmxlYXJuIGg0IHsKKyAgICBmb250LXNpemU6
IDE4cHg7Cit9CisKKy5sZWFybiBoNSB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250
LXNpemU6IDE0cHg7Cit9CisKKy5sZWFybiB1bCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJn
aW46IDAgMCAzMHB4IDI1cHg7Cit9CisKKy5sZWFybiBsaSB7CisgICAgbGluZS1oZWlnaHQ6IDIw
cHg7Cit9CisKKy5sZWFybiBwIHsKKyAgICBmb250LXNpemU6IDE1cHg7CisgICAgZm9udC13ZWln
aHQ6IDMwMDsKKyAgICBsaW5lLWhlaWdodDogMS4zOworICAgIG1hcmdpbi10b3A6IDA7CisgICAg
bWFyZ2luLWJvdHRvbTogMDsKK30KKworI2lzc3VlLWNvdW50IHsKKyAgICBkaXNwbGF5OiBub25l
OworfQorCisucXVvdGUgeworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW46IDIwcHggMCA2
MHB4IDA7Cit9CisKKy5xdW90ZSBwIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKy5x
dW90ZSBwOmJlZm9yZSB7CisgICAgY29udGVudDogJ+KAnCc7CisgICAgZm9udC1zaXplOiA1MHB4
OworICAgIG9wYWNpdHk6IC4xNTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAt
MjBweDsKKyAgICBsZWZ0OiAzcHg7Cit9CisKKy5xdW90ZSBwOmFmdGVyIHsKKyAgICBjb250ZW50
OiAn4oCdJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0eTogLjE1OworICAgIHBv
c2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206IC00MnB4OworICAgIHJpZ2h0OiAzcHg7Cit9
CisKKy5xdW90ZSBmb290ZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206
IC00MHB4OworICAgIHJpZ2h0OiAwOworfQorCisucXVvdGUgZm9vdGVyIGltZyB7CisgICAgYm9y
ZGVyLXJhZGl1czogM3B4OworfQorCisucXVvdGUgZm9vdGVyIGEgeworICAgIG1hcmdpbi1sZWZ0
OiA1cHg7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLnNwZWVjaC1idWJibGUg
eworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBwYWRkaW5nOiAxMHB4OworICAgIGJhY2tn
cm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KTsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7Cit9CisK
Ky5zcGVlY2gtYnViYmxlOmFmdGVyIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjog
YWJzb2x1dGU7CisgICAgdG9wOiAxMDAlOworICAgIHJpZ2h0OiAzMHB4OworICAgIGJvcmRlcjog
MTNweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAs
IDAsIC4wNCk7Cit9CisKKy5sZWFybi1iYXIgPiAubGVhcm4geworICAgIHBvc2l0aW9uOiBhYnNv
bHV0ZTsKKyAgICB3aWR0aDogMjcycHg7CisgICAgdG9wOiA4cHg7CisgICAgbGVmdDogLTMwMHB4
OworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogNXB4OworICAgIGJhY2tn
cm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjYpOworICAgIHRyYW5zaXRpb24tcHJv
cGVydHk6IGxlZnQ7CisgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNTAwbXM7Cit9CisKK0BtZWRp
YSAobWluLXdpZHRoOiA4OTlweCkgeworICAgIC5sZWFybi1iYXIgeworICAgICAgICB3aWR0aDog
YXV0bzsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAzMDBweDsKKyAgICB9CisKKyAgICAubGVhcm4t
YmFyID4gLmxlYXJuIHsKKyAgICAgICAgbGVmdDogOHB4OworICAgIH0KK30KZGlmZiAtLWdpdCBh
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3ZlbmRvci9pbmRleC5jc3MgYi9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvaW5kZXguY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE3ZWExODAxNjEy
MTI2ZjFkYjY1Y2UwNTY4ZjJhMDIzNzNiOTNiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvaW5kZXguY3NzCkBAIC0wLDAgKzEsMzc4IEBACito
dG1sLAorYm9keSB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CisKK2J1dHRv
biB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgYm9yZGVyOiAwOworICAg
IGJhY2tncm91bmQ6IG5vbmU7CisgICAgZm9udC1zaXplOiAxMDAlOworICAgIHZlcnRpY2FsLWFs
aWduOiBiYXNlbGluZTsKKyAgICBmb250LWZhbWlseTogaW5oZXJpdDsKKyAgICBmb250LXdlaWdo
dDogaW5oZXJpdDsKKyAgICBjb2xvcjogaW5oZXJpdDsKKyAgICAtd2Via2l0LWFwcGVhcmFuY2U6
IG5vbmU7CisgICAgYXBwZWFyYW5jZTogbm9uZTsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5n
OiBhbnRpYWxpYXNlZDsKKyAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAg
ICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Cit9CisKK2JvZHkgeworICAgIGZvbnQ6IDE0
cHggJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgICBs
aW5lLWhlaWdodDogMS40ZW07CisgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKKyAgICBjb2xvcjog
IzRkNGQ0ZDsKKyAgICBtaW4td2lkdGg6IDIzMHB4OworICAgIG1heC13aWR0aDogNTUwcHg7Cisg
ICAgbWFyZ2luOiAwIGF1dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFz
ZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9v
dGhpbmc6IGFudGlhbGlhc2VkOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7Cit9CisKK2J1dHRvbiwK
K2lucHV0W3R5cGU9ImNoZWNrYm94Il0geworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy5oaWRk
ZW4geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvYXBwIHsKKyAgICBiYWNrZ3JvdW5k
OiAjZmZmOworICAgIG1hcmdpbjogMTMwcHggMCA0MHB4IDA7CisgICAgcG9zaXRpb246IHJlbGF0
aXZlOworICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwKKyAg
ICAgICAgICAgICAgICAwIDI1cHggNTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTsKK30KKworI3Rv
ZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeworICAgIGZvbnQtc3R5bGU6
IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogMzAwOworICAgIGNvbG9yOiAjZTZlNmU2OworfQor
CisjdG9kb2FwcCBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHlsZTogaXRh
bGljOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9CisKKyN0
b2RvYXBwIGlucHV0OjppbnB1dC1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHlsZTogaXRhbGlj
OworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9CisKKyN0b2Rv
YXBwIGgxIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAtMTU1cHg7CisgICAg
d2lkdGg6IDEwMCU7CisgICAgZm9udC1zaXplOiAxMDBweDsKKyAgICBmb250LXdlaWdodDogMTAw
OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBjb2xvcjogcmdiYSgxNzUsIDQ3LCA0Nywg
MC4xNSk7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5Owor
ICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKKyAgICB0ZXh0LXJl
bmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworfQorCisjbmV3LXRvZG8sCisuZWRpdCB7Cisg
ICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbjogMDsKKyAgICB3aWR0aDogMTAwJTsK
KyAgICBmb250LXNpemU6IDI0cHg7CisgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAgZm9u
dC13ZWlnaHQ6IGluaGVyaXQ7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJvcmRlcjog
MDsKKyAgICBvdXRsaW5lOiBub25lOworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBhZGRpbmc6
IDZweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6IGluc2V0
IDAgLTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgYm94LXNpemluZzogYm9yZGVy
LWJveDsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtbW96
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICBmb250LXNtb290aGluZzogYW50aWFs
aWFzZWQ7Cit9CisKKyNuZXctdG9kbyB7CisgICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggNjBw
eDsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAw
Myk7CisgICAgYm94LXNoYWRvdzogaW5zZXQgMCAtMnB4IDFweCByZ2JhKDAsMCwwLDAuMDMpOwor
fQorCisjbWFpbiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHotaW5kZXg6IDI7Cisg
ICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKK2xhYmVsW2Zvcj0ndG9nZ2xl
LWFsbCddIHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9nZ2xlLWFsbCB7CisgICAgcG9z
aXRpb246IGFic29sdXRlOworICAgIHRvcDogLTU1cHg7CisgICAgbGVmdDogLTEycHg7CisgICAg
d2lkdGg6IDYwcHg7CisgICAgaGVpZ2h0OiAzNHB4OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsK
KyAgICBib3JkZXI6IG5vbmU7IC8qIE1vYmlsZSBTYWZhcmkgKi8KK30KKworI3RvZ2dsZS1hbGw6
YmVmb3JlIHsKKyAgICBjb250ZW50OiAn4p2vJzsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAg
Y29sb3I6ICNlNmU2ZTY7CisgICAgcGFkZGluZzogMTBweCAyN3B4IDEwcHggMjdweDsKK30KKwor
I3RvZ2dsZS1hbGw6Y2hlY2tlZDpiZWZvcmUgeworICAgIGNvbG9yOiAjNzM3MzczOworfQorCisj
dG9kby1saXN0IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBsaXN0LXN0
eWxlOiBub25lOworfQorCisjdG9kby1saXN0IGxpIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7
CisgICAgZm9udC1zaXplOiAyNHB4OworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWRl
ZGVkOworfQorCisjdG9kby1saXN0IGxpOmxhc3QtY2hpbGQgeworICAgIGJvcmRlci1ib3R0b206
IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyB7CisgICAgYm9yZGVyLWJvdHRvbTog
bm9uZTsKKyAgICBwYWRkaW5nOiAwOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmcgLmVkaXQg
eworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHdpZHRoOiA1MDZweDsKKyAgICBwYWRkaW5nOiAx
M3B4IDE3cHggMTJweCAxN3B4OworICAgIG1hcmdpbjogMCAwIDAgNDNweDsKK30KKworI3RvZG8t
bGlzdCBsaS5lZGl0aW5nIC52aWV3IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9kby1s
aXN0IGxpIC50b2dnbGUgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICB3aWR0aDogNDBw
eDsKKyAgICAvKiBhdXRvLCBzaW5jZSBub24tV2ViS2l0IGJyb3dzZXJzIGRvZXNuJ3Qgc3VwcG9y
dCBpbnB1dCBzdHlsaW5nICovCisgICAgaGVpZ2h0OiBhdXRvOworICAgIHBvc2l0aW9uOiBhYnNv
bHV0ZTsKKyAgICB0b3A6IDA7CisgICAgYm90dG9tOiAwOworICAgIG1hcmdpbjogYXV0byAwOwor
ICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworICAgIC13ZWJraXQtYXBwZWFy
YW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCisjdG9kby1saXN0IGxpIC50
b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0Zjgs
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0
PSI0MCIgdmlld0JveD0iLTEwIC0xOCAxMDAgMTM1Ij48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBy
PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWRlZGVkIiBzdHJva2Utd2lkdGg9IjMiLz48L3N2
Zz4nKTsKK30KKworI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgeworICAgIGNv
bnRlbnQ6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0iaHR0cDovL3d3
dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iLTEwIC0x
OCAxMDAgMTM1Ij48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0ibm9uZSIgc3Ry
b2tlPSIjYmRkYWQ1IiBzdHJva2Utd2lkdGg9IjMiLz48cGF0aCBmaWxsPSIjNWRjMmFmIiBkPSJN
NzIgMjVMNDIgNzEgMjcgNTZsLTQgNCAyMCAyMCAzNC01MnoiLz48L3N2Zz4nKTsKK30KKworI3Rv
ZG8tbGlzdCBsaSBsYWJlbCB7CisgICAgd2hpdGUtc3BhY2U6IHByZTsKKyAgICB3b3JkLWJyZWFr
OiBicmVhay13b3JkOworICAgIHBhZGRpbmc6IDE1cHggNjBweCAxNXB4IDE1cHg7CisgICAgbWFy
Z2luLWxlZnQ6IDQ1cHg7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDEu
MjsKKyAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjRzOworfQorCisjdG9kby1saXN0IGxpLmNvbXBs
ZXRlZCBsYWJlbCB7CisgICAgY29sb3I6ICNkOWQ5ZDk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBs
aW5lLXRocm91Z2g7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3kgeworICAgIGRpc3BsYXk6
IG5vbmU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICByaWdodDog
MTBweDsKKyAgICBib3R0b206IDA7CisgICAgd2lkdGg6IDQwcHg7CisgICAgaGVpZ2h0OiA0MHB4
OworICAgIG1hcmdpbjogYXV0byAwOworICAgIGZvbnQtc2l6ZTogMzBweDsKKyAgICBjb2xvcjog
I2NjOWE5YTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMXB4OworICAgIHRyYW5zaXRpb246IGNvbG9y
IDAuMnMgZWFzZS1vdXQ7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6aG92ZXIgeworICAg
IGNvbG9yOiAjYWY1YjVlOworfQorCisjdG9kby1saXN0IGxpIC5kZXN0cm95OmFmdGVyIHsKKyAg
ICBjb250ZW50OiAnw5cnOworfQorCisjdG9kby1saXN0IGxpOmhvdmVyIC5kZXN0cm95IHsKKyAg
ICBkaXNwbGF5OiBibG9jazsKK30KKworI3RvZG8tbGlzdCBsaSAuZWRpdCB7CisgICAgZGlzcGxh
eTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nOmxhc3QtY2hpbGQgeworICAgIG1h
cmdpbi1ib3R0b206IC0xcHg7Cit9CisKKyNmb290ZXIgeworICAgIGNvbG9yOiAjNzc3OworICAg
IHBhZGRpbmc6IDEwcHggMTVweDsKKyAgICBoZWlnaHQ6IDIwcHg7CisgICAgdGV4dC1hbGlnbjog
Y2VudGVyOworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTZlNmU2OworfQorCisjZm9vdGVy
OmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAg
IHJpZ2h0OiAwOworICAgIGJvdHRvbTogMDsKKyAgICBsZWZ0OiAwOworICAgIGhlaWdodDogNTBw
eDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2Jh
KDAsIDAsIDAsIDAuMiksCisgICAgICAgICAgICAgICAgMCA4cHggMCAtM3B4ICNmNmY2ZjYsCisg
ICAgICAgICAgICAgICAgMCA5cHggMXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLAorICAgICAg
ICAgICAgICAgIDAgMTZweCAwIC02cHggI2Y2ZjZmNiwKKyAgICAgICAgICAgICAgICAwIDE3cHgg
MnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpOworfQorCisjdG9kby1jb3VudCB7CisgICAgZmxv
YXQ6IGxlZnQ7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworI3RvZG8tY291bnQgc3Ryb25n
IHsKKyAgICBmb250LXdlaWdodDogMzAwOworfQorCisjZmlsdGVycyB7CisgICAgbWFyZ2luOiAw
OworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwb3NpdGlvbjog
YWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30KKworI2ZpbHRlcnMgbGkg
eworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkgYSB7CisgICAgY29sb3I6
IGluaGVyaXQ7CisgICAgbWFyZ2luOiAzcHg7CisgICAgcGFkZGluZzogM3B4IDdweDsKKyAgICB0
ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7
CisgICAgYm9yZGVyLXJhZGl1czogM3B4OworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkLAor
I2ZpbHRlcnMgbGkgYTpob3ZlciB7CisgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE3NSwgNDcsIDQ3
LCAwLjEpOworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkIHsKKyAgICBib3JkZXItY29sb3I6
IHJnYmEoMTc1LCA0NywgNDcsIDAuMik7Cit9CisKKyNjbGVhci1jb21wbGV0ZWQsCitodG1sICNj
bGVhci1jb21wbGV0ZWQ6YWN0aXZlIHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgcG9zaXRpb246
IHJlbGF0aXZlOworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgIHRleHQtZGVjb3JhdGlvbjog
bm9uZTsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQor
CisjY2xlYXItY29tcGxldGVkOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGlu
ZTsKK30KKworI2luZm8geworICAgIG1hcmdpbjogNjVweCBhdXRvIDA7CisgICAgY29sb3I6ICNi
ZmJmYmY7CisgICAgZm9udC1zaXplOiAxMHB4OworICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJn
YmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKyNp
bmZvIHAgeworICAgIGxpbmUtaGVpZ2h0OiAxOworfQorCisjaW5mbyBhIHsKKyAgICBjb2xvcjog
aW5oZXJpdDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZm9udC13ZWlnaHQ6IDQw
MDsKK30KKworI2luZm8gYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7
Cit9CisKKy8qCisgICAgSGFjayB0byByZW1vdmUgYmFja2dyb3VuZCBmcm9tIE1vYmlsZSBTYWZh
cmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNrYm94
ZXMgaW4gRmlyZWZveAorKi8KK0BtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2Ut
cGl4ZWwtcmF0aW86MCkgeworICAgICN0b2dnbGUtYWxsLAorICAgICN0b2RvLWxpc3QgbGkgLnRv
Z2dsZSB7CisgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgfQorCisgICAgI3RvZG8tbGlz
dCBsaSAudG9nZ2xlIHsKKyAgICAgICAgaGVpZ2h0OiA0MHB4OworICAgIH0KKworICAgICN0b2dn
bGUtYWxsIHsKKyAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CisgICAg
ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNl
OiBub25lOworICAgICAgICBhcHBlYXJhbmNlOiBub25lOworICAgIH0KK30KKworQG1lZGlhICht
YXgtd2lkdGg6IDQzMHB4KSB7CisgICAgI2Zvb3RlciB7CisgICAgICAgIGhlaWdodDogNTBweDsK
KyAgICB9CisKKyAgICAjZmlsdGVycyB7CisgICAgICAgIGJvdHRvbTogMTBweDsKKyAgICB9Cit9
CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Rlc3QuaHRtbCBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvdGVzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMxYWRk
MmU5MzY2OWU4YWJlNWQ0OWRjYzMwNzQ3ZDg3OGE2MmY1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sCisr
KyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbD4KLTxo
ZWFkPgotPHRpdGxlPk5hY3UgRE9NIEJlbmNoIC0gTm90IEFub3RoZXIgQ29tcGxldGVseSBVbnJl
YWxpc3RpYyBET00gQmVuY2htYXJrPC90aXRsZT4KLTxzY3JpcHQgc3JjPSIuLi8uLi9iZW5jaG1h
cmsuanMiPjwvc2NyaXB0PgotPHNjcmlwdD4KLQotQmVuY2htYXJrUnVubmVyLnN1aXRlKHsKLSAg
ICB0aXRsZTogJ1NpbXBsZUVtYmVySlMnLAotICAgIHVybDogJ2luZGV4Lmh0bWwnLAotICAgIHBy
ZXBhcmU6IGZ1bmN0aW9uIChjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKLSAgICAg
ICAgY29udGVudFdpbmRvdy5Ub2Rvcy5TdG9yZSA9IGNvbnRlbnRXaW5kb3cuRFMuU3RvcmUuZXh0
ZW5kKHsKLSAgICAgICAgICAgIHJldmlzaW9uOiAxMiwKLSAgICAgICAgICAgIGFkYXB0ZXI6ICdU
b2Rvcy5MU0FkYXB0ZXInLAotICAgICAgICAgICAgY29tbWl0OiBmdW5jdGlvbiAoKSB7IH0KLSAg
ICAgICAgfSk7Ci0KLSAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgU2ltcGxlUHJvbWlzZTsKLQot
ICAgICAgICBmdW5jdGlvbiByZXNvbHZlSWZSZWFkeSgpIHsKLSAgICAgICAgICAgIGlmIChjb250
ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25ldy10b2RvJykpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHByb21pc2UucmVzb2x2ZSgpOwotICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZl
SWZSZWFkeSwgMTApOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdmVJZlJlYWR5KCk7Ci0KLSAg
ICAgICAgcmV0dXJuIHByb21pc2U7Ci0gICAgfSwKLSAgICB0ZXN0U3RlcHM6IGZ1bmN0aW9uIChj
b250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKLSAgICAgICAgY29udGVudERvY3VtZW50
LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdG9kbycpLmZvY3VzKCk7Ci0gICAgICAgIHZhciB2aWV3cyA9
IGNvbnRlbnRXaW5kb3cuRW1iZXIuVmlldy52aWV3czsKLSAgICAgICAgdmFyIGVtYmVyUnVuID0g
Y29udGVudFdpbmRvdy5FbWJlci5ydW47Ci0gICAgICAgIHZhciBudW1iZXJPZkl0ZW1zVG9BZGQg
PSAxMDA7Ci0gICAgICAgIHJldHVybiBbCi0gICAgICAgICAgICBbJ0FkZGluZycgKyBudW1iZXJP
Zkl0ZW1zVG9BZGQgKyAnSXRlbXMnLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgewotICAgICAgICAgICAg
ICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLnNldCgndmFs
dWUnLCAnU29tZXRoaW5nIHRvIGRvJyk7IH0pOwotICAgICAgICAgICAgICAgICAgICBlbWJlclJ1
bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLmluc2VydE5ld2xpbmUoZG9jdW1lbnQu
Y3JlYXRlRXZlbnQoJ0V2ZW50JykpOyB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9XSwKLSAgICAgICAgICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKCkgewot
ICAgICAgICAgICAgICAgIHZhciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3JBbGwoJy5lbWJlci1jaGVja2JveCcpOwotICAgICAgICAgICAgICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgY2hlY2tib3hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB2
YXIgdmlldyA9IHZpZXdzW2NoZWNrYm94ZXNbaV0uaWRdOwotICAgICAgICAgICAgICAgICAgICBl
bWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXcuc2V0KCdjaGVja2VkJywgdHJ1ZSk7IH0pOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWydEZWxldGluZ0l0
ZW1zJywgZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgICAgIHZhciBkZWxldGVCdXR0b25zID0g
Y29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7Ci0gICAgICAgICAg
ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsrKQotICAg
ICAgICAgICAgICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IGRlbGV0ZUJ1dHRvbnNbaV0u
Y2xpY2soKTsgfSk7Ci0gICAgICAgICAgICB9XSwKLSAgICAgICAgXTsKLSAgICB9Ci19KTsKLQot
PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBh
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0
ZW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMWZlMDg0YzY4Mzg4Y2NmYzJhYTczNDQ1ZDFkNGM1N2MzNmNlYzZm
OQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdGVtLmpzCkBAIC0w
LDAgKzEsMTkgQEAKKy8qKgorICogVGhpcyBpcyBkdW1teSBmaWxlIHRoYXQgZXhpc3RzIGZvciB0
aGUgc29sZSBwdXJwb3NlCisgKiBvZiBhbGxvd2luZyB0ZXN0cyB0byBydW4gZGlyZWN0bHkgaW4g
dGhlIGJyb3dzZXIgYXMKKyAqIHdlbGwgYXMgYnkgVGVzdGVtLgorICoKKyAqIFRlc3RlbSBpcyBj
b25maWd1cmVkIHRvIHJ1biB0ZXN0cyBkaXJlY3RseSBhZ2FpbnN0CisgKiB0aGUgdGVzdCBidWls
ZCBvZiBpbmRleC5odG1sLCB3aGljaCByZXF1aXJlcyBhCisgKiBzbmlwcGV0IHRvIGxvYWQgdGhl
IHRlc3RlbS5qcyBmaWxlOgorICogICA8c2NyaXB0IHNyYz0iL3Rlc3RlbS5qcyI+PC9zY3JpcHQ+
CisgKiBUaGlzIGhhcyB0byBnbyBiZWZvcmUgdGhlIHF1bml0IGZyYW1ld29yayBhbmQgYXBwCisg
KiB0ZXN0cyBhcmUgbG9hZGVkLgorICoKKyAqIFRlc3RlbSBpbnRlcm5hbGx5IHN1cHBsaWVzIHRo
aXMgZmlsZS4gSG93ZXZlciwgaWYgeW91CisgKiBydW4gdGhlIHRlc3RzIGRpcmVjdGx5IGluIHRo
ZSBicm93c2VyIChsb2NhbGhvc3Q6ODAwMC90ZXN0cyksCisgKiB0aGlzIGZpbGUgZG9lcyBub3Qg
ZXhpc3QuCisgKgorICogSGVuY2UgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmYWtlIGZpbGUuIFRoaXMg
ZmlsZSBpcyBzZXJ2ZWQKKyAqIGRpcmVjdGx5IGZyb20gdGhlIGV4cHJlc3Mgc2VydmVyIHRvIHNh
dGlzaWZ5IHRoZSBzY3JpcHQgbG9hZC4KKyAqLwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy90ZXN0cy9pbmRleC5odG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0cy9pbmRleC5o
dG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmUyYTI3YzE0OWI2ZGUwN2M2OTMzMTA5ODQyNWZkZDhkNWQ3YTJhMGUK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Rlc3RzL2luZGV4Lmh0bWwK
QEAgLTAsMCArMSw0MSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAg
PG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0
aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxlPlRvZG9tdmMgVGVzdHM8L3RpdGxl
PgorICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgorICAgIDxtZXRhIG5h
bWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9
MSI+CisKKyAgICA8YmFzZSBocmVmPSIvIiAvPgorPG1ldGEgbmFtZT0idG9kb212Yy9jb25maWcv
ZW52aXJvbm1lbnQiIGNvbnRlbnQ9IiU3QiUyMm1vZHVsZVByZWZpeCUyMiUzQSUyMnRvZG9tdmMl
MjIlMkMlMjJlbnZpcm9ubWVudCUyMiUzQSUyMnRlc3QlMjIlMkMlMjJiYXNlVVJMJTIyJTNBJTIy
LyUyMiUyQyUyMmxvY2F0aW9uVHlwZSUyMiUzQSUyMm5vbmUlMjIlMkMlMjJFbWJlckVOViUyMiUz
QSU3QiUyMkZFQVRVUkVTJTIyJTNBJTdCJTdEJTdEJTJDJTIyQVBQJTIyJTNBJTdCJTIyTE9HX0FD
VElWRV9HRU5FUkFUSU9OJTIyJTNBZmFsc2UlMkMlMjJMT0dfVklFV19MT09LVVBTJTIyJTNBZmFs
c2UlMkMlMjJyb290RWxlbWVudCUyMiUzQSUyMiUyM2VtYmVyLXRlc3RpbmclMjIlMkMlMjJuYW1l
JTIyJTNBJTIydG9kb212YyUyMiUyQyUyMnZlcnNpb24lMjIlM0ElMjIwLjAuMCs1ZGJjNWZiOSUy
MiU3RCUyQyUyMmV4cG9ydEFwcGxpY2F0aW9uR2xvYmFsJTIyJTNBdHJ1ZSU3RCIgLz4KKyAgICAK
KworICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXNzZXRzL3ZlbmRvci5jc3MiPgor
ICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXNzZXRzL3RvZG9tdmMuY3NzIj4KKyAg
ICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFzc2V0cy90ZXN0LXN1cHBvcnQuY3NzIj4K
KworICAgIAorICAgIAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIAorICAgIDxkaXYgaWQ9InF1
bml0Ij48L2Rpdj4KKzxkaXYgaWQ9InF1bml0LWZpeHR1cmUiPjwvZGl2PgorCis8ZGl2IGlkPSJl
bWJlci10ZXN0aW5nLWNvbnRhaW5lciI+CisgIDxkaXYgaWQ9ImVtYmVyLXRlc3RpbmciPjwvZGl2
PgorPC9kaXY+CisKKworICAgIDxzY3JpcHQgc3JjPSJ0ZXN0ZW0uanMiIGludGVncml0eT0iIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iYXNzZXRzL3ZlbmRvci5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9ImFzc2V0cy90ZXN0LXN1cHBvcnQuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgc3JjPSJhc3NldHMvdG9kb212Yy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
ImFzc2V0cy90ZXN0cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy90ZXN0
LWxvYWRlci5qcyI+PC9zY3JpcHQ+CisKKyAgICAKKyAgICA8c2NyaXB0PkVtYmVyLmFzc2VydCgn
VGhlIHRlc3RzIGZpbGUgd2FzIG5vdCBsb2FkZWQuIE1ha2Ugc3VyZSB5b3VyIHRlc3RzIGluZGV4
Lmh0bWwgaW5jbHVkZXMgImFzc2V0cy90ZXN0cy5qcyIuJywgRW1iZXJFTlYuVEVTVFNfRklMRV9M
T0FERUQpOzwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>309871</attachid>
            <date>2017-05-11 22:48:01 -0700</date>
            <delta_ts>2017-05-11 23:34:18 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-171342-20170511224757.patch</filename>
            <type>text/plain</type>
            <size>4273555</size>
            <attacher name="Addy Osmani">addyo</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE1ODA4CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCmluZGV4IGI5ZTE0YmUyOGRh
MmFmOTBlNjBmNGI5MTQ4OGI0NzE1ODQ0OGE2Y2IuLmVlYzY2N2E1YjBkYzNiMWI3MDIzMjFmMmQz
YWQ4ZjJhY2JhOTlhNzAgMTAwNjQ0Ci0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOTMgQEAKKzIwMTctMDUt
MTEgIEFkZHkgT3NtYW5pICA8YWRkeW9zbWFuaUBnbWFpbC5jb20+CisKKyAgICAgICAgU3BlZWRv
bWV0ZXI6IFVwZGF0ZSB0aGUgRW1iZXIuanMgVG9kb01WQyB0byBhIG1vcmUgcmVjZW50IHZlcnNp
b24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MTM0
MgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0
ZSB0aGUgRW1iZXIgVG9kb01WQyBhcHAgaW4gU3BlZWRvbWV0ZXIgdG8gbGF0ZXN0CisKKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9hc3NldHMvdG9kb212Yy5jc3M6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90
b2RvbXZjLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmNzczogUmVuYW1l
ZCBmcm9tIFBlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1v
bi9iYXNlLmNzcy4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9ib3dlci5qc29uOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVu
dHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
X2NvbXBvbmVudHMvZW1iZXItbG9jYWxzdG9yYWdlLWFkYXB0ZXIvbG9jYWxzdG9yYWdlX2FkYXB0
ZXIuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci9lbWJl
ci5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMv
aGFuZGxlYmFycy5qczogUmVtb3ZlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2px
dWVyeS9qcXVlcnkuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90
b2RvbXZjLWNvbW1vbi9iYXNlLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBv
bmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Nyb3Nz
ZG9tYWluLnhtbDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbDoKKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9qcy9hcHAuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb19j
b250cm9sbGVyLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9z
X2NvbnRyb2xsZXIuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvaGVscGVycy9wbHVyYWxp
emUuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvbW9kZWxzL3RvZG8uanM6IFJlbW92ZWQu
CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvanMvcm91dGVyLmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3Zp
ZXdzL2VkaXRfdG9kb192aWV3LmpzOiBSZW1vdmVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL3Rv
ZG9zX3ZpZXcuanM6IFJlbW92ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvcmVhZG1lLm1kOiBSZW1vdmVkLgor
ICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3JvYm90cy50eHQ6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8uYm93
ZXJyYzogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5lZGl0b3Jjb25maWc6IEFkZGVkLgor
ICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS8uZW1iZXItY2xpOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmdpdGlnbm9yZTogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYzogQWRk
ZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy50cmF2aXMueW1sOiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvLndhdGNobWFuY29uZmlnOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVB
RE1FLm1kOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2FwcC5qczogQWRkZWQuCisg
ICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMvdG9kby1pdGVtLmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMvdG9kby1saXN0LmpzOiBBZGRlZC4KKyAgICAg
ICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FjdGl2ZS5qczogQWRkZWQuCisgICAgICAg
ICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hcHBsaWNhdGlvbi5qczogQWRkZWQuCisgICAg
ICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9jb21wbGV0ZWQuanM6IEFkZGVkLgorICAg
ICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvaGVscGVycy9ndC5qczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9oZWxwZXJzL3BsdXJhbGl6ZS5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9pbmRleC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luc3Rh
bmNlLWluaXRpYWxpemVycy9nbG9iYWwuanM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9h
cHAvbW9kZWxzLy5naXRrZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29s
dmVyLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlci5qczogQWRkZWQu
CisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9yb3V0ZXMvLmdpdGtlZXA6IEFkZGVkLgorICAgICAg
ICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9uLmpzOiBBZGRlZC4KKyAgICAgICAg
KiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL21lbW9yeS5qczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9zZXJ2aWNlcy9yZXBvLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
YXBwL3N0eWxlcy9hcHAuY3NzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBs
YXRlcy9hY3RpdmUuaGJzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRl
cy9hcHBsaWNhdGlvbi5oYnM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBsZXRlZC5oYnM6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBvbmVudHMvLmdpdGtlZXA6IEFkZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAv
dGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1pdGVtLmhiczogQWRkZWQuCisgICAgICAgICogU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWxpc3QuaGJzOiBBZGRlZC4KKyAg
ICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9pbmRleC5oYnM6IEFkZGVkLgorICAgICAg
ICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS9ib3dlci5qc29uOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29u
ZmlnL2Vudmlyb25tZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvZW1iZXItY2xp
LWJ1aWxkLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcGFja2FnZS5qc29uOiBBZGRl
ZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL2Nyb3NzZG9tYWluLnhtbDogQWRkZWQuCisg
ICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3B1YmxpYy9yb2JvdHMudHh0OiBBZGRlZC4KKyAgICAgICAgKiBT
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdGVtLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvLmpz
aGludHJjOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9kZXN0cm95
LWFwcC5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvbW9kdWxl
LWZvci1hY2NlcHRhbmNlLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVs
cGVycy9yZXNvbHZlci5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBl
cnMvc3RhcnQtYXBwLmpzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaW5kZXgu
aHRtbDogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2ludGVncmF0aW9uLy5naXRr
ZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvdGVzdC1oZWxwZXIuanM6IEFk
ZGVkLgorICAgICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy91bml0Ly5naXRrZWVwOiBBZGRlZC4KKyAg
ICAgICAgKiBTcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9yLy5naXRrZWVwOiBBZGRlZC4KKyAgICAgICAgKiBTcGVl
ZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9z
b3VyY2UvdmVuZG9yL2Jhc2UuY3NzOiBBZGRlZC4KKyAgICAgICAgKiBTcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9y
L2luZGV4LmNzczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sOiBSZW1vdmVkLgorICAg
ICAgICAqIFNwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3Rlc3RlbS5qczogQWRkZWQuCisgICAgICAgICogU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdHMvaW5kZXguaHRt
bDogQWRkZWQuCisKIDIwMTctMDQtMjUgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFw
cGxlLmNvbT4KIAogICAgICAgICBBZGQgcGVyZm9ybWFuY2UgdGVzdCBmb3IgRm9udENhY2hlOjpz
eXN0ZW1GYWxsYmFja0ZvckNoYXJhY3RlcnMoKQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9hc3NldHMvdG9kb212Yy5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2Rv
bXZjLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1
MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmpzIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MTlhMDA0
YjBmY2ZkZjgyNzUzZDI0NTBiOGJmYzFiYWJhNjVlYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212Yy5qcwpAQCAtMCwwICsxLDEyNjQgQEAKKyJ1
c2Ugc3RyaWN0IjsKKworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCisKKworLyoganNoaW50
IGlnbm9yZTplbmQgKi8KKworZGVmaW5lKCd0b2RvbXZjL2FwcCcsIFsnZXhwb3J0cycsICdlbWJl
cicsICd0b2RvbXZjL3Jlc29sdmVyJywgJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJywgJ3RvZG9t
dmMvY29uZmlnL2Vudmlyb25tZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIsIF90b2Rv
bXZjUmVzb2x2ZXIsIF9lbWJlckxvYWRJbml0aWFsaXplcnMsIF90b2RvbXZjQ29uZmlnRW52aXJv
bm1lbnQpIHsKKworICAgIHZhciBBcHAgPSB1bmRlZmluZWQ7CisKKyAgICBfZW1iZXJbJ2RlZmF1
bHQnXS5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMgPSB0cnVlOworCisgICAgQXBwID0gX2VtYmVy
WydkZWZhdWx0J10uQXBwbGljYXRpb24uZXh0ZW5kKHsKKyAgICAgICAgbW9kdWxlUHJlZml4OiBf
dG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10ubW9kdWxlUHJlZml4LAorICAgICAg
ICBwb2RNb2R1bGVQcmVmaXg6IF90b2RvbXZjQ29uZmlnRW52aXJvbm1lbnRbJ2RlZmF1bHQnXS5w
b2RNb2R1bGVQcmVmaXgsCisgICAgICAgIFJlc29sdmVyOiBfdG9kb212Y1Jlc29sdmVyWydkZWZh
dWx0J10KKyAgICB9KTsKKworICAgICgwLCBfZW1iZXJMb2FkSW5pdGlhbGl6ZXJzWydkZWZhdWx0
J10pKEFwcCwgX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLm1vZHVsZVByZWZp
eCk7CisKKyAgICBleHBvcnRzWydkZWZhdWx0J10gPSBBcHA7Cit9KTsKK2RlZmluZSgndG9kb212
Yy9jb21wb25lbnRzL2FwcC12ZXJzaW9uJywgWydleHBvcnRzJywgJ2VtYmVyLWNsaS1hcHAtdmVy
c2lvbi9jb21wb25lbnRzL2FwcC12ZXJzaW9uJywgJ3RvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJDbGlBcHBWZXJzaW9uQ29tcG9uZW50c0FwcFZl
cnNpb24sIF90b2RvbXZjQ29uZmlnRW52aXJvbm1lbnQpIHsKKworICB2YXIgbmFtZSA9IF90b2Rv
bXZjQ29uZmlnRW52aXJvbm1lbnRbJ2RlZmF1bHQnXS5BUFAubmFtZTsKKyAgdmFyIHZlcnNpb24g
PSBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uQVBQLnZlcnNpb247CisKKyAg
ZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyQ2xpQXBwVmVyc2lvbkNvbXBvbmVudHNBcHBWZXJz
aW9uWydkZWZhdWx0J10uZXh0ZW5kKHsKKyAgICB2ZXJzaW9uOiB2ZXJzaW9uLAorICAgIG5hbWU6
IG5hbWUKKyAgfSk7Cit9KTsKK2RlZmluZSgndG9kb212Yy9jb21wb25lbnRzL3RvZG8taXRlbScs
IFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICAg
ZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uQ29tcG9uZW50LmV4dGVuZCh7
CisgICAgICAgIHJlcG86IF9lbWJlclsnZGVmYXVsdCddLmluamVjdC5zZXJ2aWNlKCksCisgICAg
ICAgIHRhZ05hbWU6ICdsaScsCisgICAgICAgIGVkaXRpbmc6IGZhbHNlLAorICAgICAgICBjbGFz
c05hbWVCaW5kaW5nczogWyd0b2RvLmNvbXBsZXRlZCcsICdlZGl0aW5nJ10sCisKKyAgICAgICAg
YWN0aW9uczogeworICAgICAgICAgICAgc3RhcnRFZGl0aW5nOiBmdW5jdGlvbiBzdGFydEVkaXRp
bmcoKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXQoJ29uU3RhcnRFZGl0JykoKTsKKyAgICAg
ICAgICAgICAgICB0aGlzLnNldCgnZWRpdGluZycsIHRydWUpOworICAgICAgICAgICAgICAgIF9l
bWJlclsnZGVmYXVsdCddLnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgdGhpcywgJ2Zv
Y3VzSW5wdXQnKTsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGRvbmVFZGl0aW5nOiBm
dW5jdGlvbiBkb25lRWRpdGluZyh0b2RvVGl0bGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRo
aXMuZ2V0KCdlZGl0aW5nJykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX2VtYmVyWydkZWZhdWx0J10uaXNCbGFu
ayh0b2RvVGl0bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZCgncmVtb3ZlVG9k
bycpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMu
c2V0KCd0b2RvLnRpdGxlJywgdG9kb1RpdGxlLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAg
IHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmdl
dCgnb25FbmRFZGl0JykoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICBoYW5kbGVLZXlkb3duOiBmdW5jdGlvbiBoYW5kbGVLZXlkb3duKGUpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgICAgICAgICAgICAg
ICBlLnRhcmdldC5ibHVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUg
PT09IDI3KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2Up
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHRvZ2ds
ZUNvbXBsZXRlZDogZnVuY3Rpb24gdG9nZ2xlQ29tcGxldGVkKGUpIHsKKyAgICAgICAgICAgICAg
ICB2YXIgdG9kbyA9IHRoaXMuZ2V0KCd0b2RvJyk7CisgICAgICAgICAgICAgICAgX2VtYmVyWydk
ZWZhdWx0J10uc2V0KHRvZG8sICdjb21wbGV0ZWQnLCBlLnRhcmdldC5jaGVja2VkKTsKKyAgICAg
ICAgICAgICAgICB0aGlzLmdldCgncmVwbycpLnBlcnNpc3QoKTsKKyAgICAgICAgICAgIH0sCisK
KyAgICAgICAgICAgIHJlbW92ZVRvZG86IGZ1bmN0aW9uIHJlbW92ZVRvZG8oKSB7CisgICAgICAg
ICAgICAgICAgdGhpcy5nZXQoJ3JlcG8nKVsnZGVsZXRlJ10odGhpcy5nZXQoJ3RvZG8nKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgZm9jdXNJbnB1dDogZnVuY3Rpb24g
Zm9jdXNJbnB1dCgpIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdp
bnB1dC5lZGl0JykuZm9jdXMoKTsKKyAgICAgICAgfQorICAgIH0pOworfSk7CitkZWZpbmUoJ3Rv
ZG9tdmMvY29tcG9uZW50cy90b2RvLWxpc3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlcikgeworICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclsn
ZGVmYXVsdCddLkNvbXBvbmVudC5leHRlbmQoeworICAgICAgICByZXBvOiBfZW1iZXJbJ2RlZmF1
bHQnXS5pbmplY3Quc2VydmljZSgpLAorICAgICAgICB0YWdOYW1lOiAnc2VjdGlvbicsCisgICAg
ICAgIGVsZW1lbnRJZDogJ21haW4nLAorICAgICAgICBjYW5Ub2dnbGU6IHRydWUsCisgICAgICAg
IGFsbENvbXBsZXRlZDogX2VtYmVyWydkZWZhdWx0J10uY29tcHV0ZWQoJ3RvZG9zLkBlYWNoLmNv
bXBsZXRlZCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldCgndG9k
b3MnKS5pc0V2ZXJ5KCdjb21wbGV0ZWQnKTsKKyAgICAgICAgfSksCisKKyAgICAgICAgYWN0aW9u
czogeworICAgICAgICAgICAgZW5hYmxlVG9nZ2xlOiBmdW5jdGlvbiBlbmFibGVUb2dnbGUoKSB7
CisgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2NhblRvZ2dsZScsIHRydWUpOworICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgZGlzYWJsZVRvZ2dsZTogZnVuY3Rpb24gZGlzYWJsZVRvZ2ds
ZSgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNldCgnY2FuVG9nZ2xlJywgZmFsc2UpOworICAg
ICAgICAgICAgfSwKKworICAgICAgICAgICAgdG9nZ2xlQWxsOiBmdW5jdGlvbiB0b2dnbGVBbGwo
KSB7CisgICAgICAgICAgICAgICAgdmFyIGFsbENvbXBsZXRlZCA9IHRoaXMuZ2V0KCdhbGxDb21w
bGV0ZWQnKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldCgndG9kb3MnKS5mb3JFYWNoKGZ1bmN0
aW9uICh0b2RvKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZW1iZXJbJ2RlZmF1bHQn
XS5zZXQodG9kbywgJ2NvbXBsZXRlZCcsICFhbGxDb21wbGV0ZWQpOworICAgICAgICAgICAgICAg
IH0pOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykucGVyc2lzdCgpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfSk7Cit9KTsKK2RlZmluZSgndG9kb212Yy9jb250cm9s
bGVycy9hY3RpdmUnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlcikgeworICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclsnZGVmYXVsdCddLkNvbnRy
b2xsZXIuZXh0ZW5kKHsKKyAgICAgICAgdG9kb3M6IF9lbWJlclsnZGVmYXVsdCddLmNvbXB1dGVk
LmZpbHRlckJ5KCdtb2RlbCcsICdjb21wbGV0ZWQnLCBmYWxzZSkKKyAgICB9KTsKK30pOworZGVm
aW5lKCd0b2RvbXZjL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uJywgWydleHBvcnRzJywgJ2VtYmVy
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgICBleHBvcnRzWydkZWZhdWx0J10g
PSBfZW1iZXJbJ2RlZmF1bHQnXS5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIHJlcG86IF9l
bWJlclsnZGVmYXVsdCddLmluamVjdC5zZXJ2aWNlKCksCisgICAgICAgIHJlbWFpbmluZzogX2Vt
YmVyWydkZWZhdWx0J10uY29tcHV0ZWQuZmlsdGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcsIGZh
bHNlKSwKKyAgICAgICAgY29tcGxldGVkOiBfZW1iZXJbJ2RlZmF1bHQnXS5jb21wdXRlZC5maWx0
ZXJCeSgnbW9kZWwnLCAnY29tcGxldGVkJyksCisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAg
ICAgIGNyZWF0ZVRvZG86IGZ1bmN0aW9uIGNyZWF0ZVRvZG8oZSkgeworICAgICAgICAgICAgICAg
IGlmIChlLmtleUNvZGUgPT09IDEzICYmICFfZW1iZXJbJ2RlZmF1bHQnXS5pc0JsYW5rKGUudGFy
Z2V0LnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmdldCgncmVwbycpLmFkZCh7
IHRpdGxlOiBlLnRhcmdldC52YWx1ZS50cmltKCksIGNvbXBsZXRlZDogZmFsc2UgfSk7CisgICAg
ICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgY2xlYXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGNs
ZWFyQ29tcGxldGVkKCkgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnJlbW92
ZU9iamVjdHModGhpcy5nZXQoJ2NvbXBsZXRlZCcpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdl
dCgncmVwbycpLnBlcnNpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOwor
fSk7CitkZWZpbmUoJ3RvZG9tdmMvY29udHJvbGxlcnMvY29tcGxldGVkJywgWydleHBvcnRzJywg
J2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgICBleHBvcnRzWydkZWZh
dWx0J10gPSBfZW1iZXJbJ2RlZmF1bHQnXS5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIHRv
ZG9zOiBfZW1iZXJbJ2RlZmF1bHQnXS5jb21wdXRlZC5maWx0ZXJCeSgnbW9kZWwnLCAnY29tcGxl
dGVkJywgdHJ1ZSkKKyAgICB9KTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvZ3QnLCBb
J2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlcikgeworICAgIHZh
ciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3Io
YXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2
YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRv
cl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fy
ci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0g
Y2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAo
IV9uICYmIF9pWydyZXR1cm4nXSkgX2lbJ3JldHVybiddKCk7IH0gZmluYWxseSB7IGlmIChfZCkg
dGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBp
ZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0
ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0g
ZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVy
ZSBub24taXRlcmFibGUgaW5zdGFuY2UnKTsgfSB9OyB9KSgpOworCisgICAgZXhwb3J0cy5ndCA9
IGd0OworCisgICAgZnVuY3Rpb24gZ3QoX3JlZiAvKiwgaGFzaCovKSB7CisgICAgICAgIHZhciBf
cmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpOworCisgICAgICAgIHZhciBuMSA9IF9yZWYy
WzBdOworICAgICAgICB2YXIgbjIgPSBfcmVmMlsxXTsKKworICAgICAgICByZXR1cm4gbjEgPiBu
MjsKKyAgICB9CisKKyAgICBleHBvcnRzWydkZWZhdWx0J10gPSBfZW1iZXJbJ2RlZmF1bHQnXS5I
ZWxwZXIuaGVscGVyKGd0KTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvcGx1cmFsaXpl
JywgWydleHBvcnRzJywgJ2VtYmVyJywgJ2VtYmVyLWluZmxlY3RvciddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyLCBfZW1iZXJJbmZsZWN0b3IpIHsKKyAgICB2YXIgX3NsaWNlZFRvQXJyYXkg
PSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkgeyB2YXIgX2Fy
ciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVk
OyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0g
KF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7
IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2Qg
PSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVsncmV0dXJu
J10pIF9pWydyZXR1cm4nXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0
dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXko
YXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3Qo
YXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcg
VHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGlu
c3RhbmNlJyk7IH0gfTsgfSkoKTsKKworICAgIGV4cG9ydHMucGx1cmFsaXplSGVscGVyID0gcGx1
cmFsaXplSGVscGVyOworCisgICAgZnVuY3Rpb24gcGx1cmFsaXplSGVscGVyKF9yZWYgLyosIGhh
c2gqLykgeworICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKTsKKwor
ICAgICAgICB2YXIgc2luZ3VsYXIgPSBfcmVmMlswXTsKKyAgICAgICAgdmFyIGNvdW50ID0gX3Jl
ZjJbMV07CisKKyAgICAgICAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiAoMCwgX2Vt
YmVySW5mbGVjdG9yLnBsdXJhbGl6ZSkoc2luZ3VsYXIpOworICAgIH0KKworICAgIGV4cG9ydHNb
J2RlZmF1bHQnXSA9IF9lbWJlclsnZGVmYXVsdCddLkhlbHBlci5oZWxwZXIocGx1cmFsaXplSGVs
cGVyKTsKK30pOworZGVmaW5lKCd0b2RvbXZjL2hlbHBlcnMvc2luZ3VsYXJpemUnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItaW5mbGVjdG9yL2xpYi9oZWxwZXJzL3Npbmd1bGFyaXplJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJJbmZsZWN0b3JMaWJIZWxwZXJzU2luZ3VsYXJpemUpIHsKKyAgZXhw
b3J0c1snZGVmYXVsdCddID0gX2VtYmVySW5mbGVjdG9yTGliSGVscGVyc1Npbmd1bGFyaXplWydk
ZWZhdWx0J107Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvYXBwLXZlcnNpb24n
LCBbJ2V4cG9ydHMnLCAnZW1iZXItY2xpLWFwcC12ZXJzaW9uL2luaXRpYWxpemVyLWZhY3Rvcnkn
LCAndG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
ckNsaUFwcFZlcnNpb25Jbml0aWFsaXplckZhY3RvcnksIF90b2RvbXZjQ29uZmlnRW52aXJvbm1l
bnQpIHsKKyAgZXhwb3J0c1snZGVmYXVsdCddID0geworICAgIG5hbWU6ICdBcHAgVmVyc2lvbics
CisgICAgaW5pdGlhbGl6ZTogKDAsIF9lbWJlckNsaUFwcFZlcnNpb25Jbml0aWFsaXplckZhY3Rv
cnlbJ2RlZmF1bHQnXSkoX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLkFQUC5u
YW1lLCBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uQVBQLnZlcnNpb24pCisg
IH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvY29udGFpbmVyLWRlYnVnLWFk
YXB0ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXIvY29udGFpbmVyLWRlYnVnLWFkYXB0
ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJlc29sdmVyQ29udGFpbmVyRGVidWdBZGFw
dGVyKSB7CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHsKKyAgICBuYW1lOiAnY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXInLAorCisgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsK
KyAgICAgIHZhciBhcHAgPSBhcmd1bWVudHNbMV0gfHwgYXJndW1lbnRzWzBdOworCisgICAgICBh
cHAucmVnaXN0ZXIoJ2NvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyOm1haW4nLCBfZW1iZXJSZXNvbHZl
ckNvbnRhaW5lckRlYnVnQWRhcHRlclsnZGVmYXVsdCddKTsKKyAgICAgIGFwcC5pbmplY3QoJ2Nv
bnRhaW5lci1kZWJ1Zy1hZGFwdGVyOm1haW4nLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1h
aW4nKTsKKyAgICB9CisgIH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbml0aWFsaXplcnMvZXhw
b3J0LWFwcGxpY2F0aW9uLWdsb2JhbCcsIFsnZXhwb3J0cycsICdlbWJlcicsICd0b2RvbXZjL2Nv
bmZpZy9lbnZpcm9ubWVudCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyLCBfdG9kb212Y0Nv
bmZpZ0Vudmlyb25tZW50KSB7CisgIGV4cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7CisK
KyAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKKyAgICB2YXIgYXBwbGljYXRpb24gPSBhcmd1bWVu
dHNbMV0gfHwgYXJndW1lbnRzWzBdOworICAgIGlmIChfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50
WydkZWZhdWx0J10uZXhwb3J0QXBwbGljYXRpb25HbG9iYWwgIT09IGZhbHNlKSB7CisgICAgICB2
YXIgdGhlR2xvYmFsOworICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7
CisgICAgICAgIHRoZUdsb2JhbCA9IHdpbmRvdzsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGds
b2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgdGhlR2xvYmFsID0gZ2xvYmFsOworICAg
ICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgdGhl
R2xvYmFsID0gc2VsZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5vIHJlYXNvbmFibGUg
Z2xvYmFsLCBqdXN0IGJhaWwKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIg
dmFsdWUgPSBfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10uZXhwb3J0QXBwbGlj
YXRpb25HbG9iYWw7CisgICAgICB2YXIgZ2xvYmFsTmFtZTsKKworICAgICAgaWYgKHR5cGVvZiB2
YWx1ZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgZ2xvYmFsTmFtZSA9IHZhbHVlOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgZ2xvYmFsTmFtZSA9IF9lbWJlclsnZGVmYXVsdCddLlN0cmluZy5j
bGFzc2lmeShfdG9kb212Y0NvbmZpZ0Vudmlyb25tZW50WydkZWZhdWx0J10ubW9kdWxlUHJlZml4
KTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0aGVHbG9iYWxbZ2xvYmFsTmFtZV0pIHsKKyAgICAg
ICAgdGhlR2xvYmFsW2dsb2JhbE5hbWVdID0gYXBwbGljYXRpb247CisKKyAgICAgICAgYXBwbGlj
YXRpb24ucmVvcGVuKHsKKyAgICAgICAgICB3aWxsRGVzdHJveTogZnVuY3Rpb24gd2lsbERlc3Ry
b3koKSB7CisgICAgICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgICAgICAgICAgZGVsZXRlIHRoZUdsb2JhbFtnbG9iYWxOYW1lXTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9
IHsKKyAgICBuYW1lOiAnZXhwb3J0LWFwcGxpY2F0aW9uLWdsb2JhbCcsCisKKyAgICBpbml0aWFs
aXplOiBpbml0aWFsaXplCisgIH07Cit9KTsKK2RlZmluZSgndG9kb212Yy9pbnN0YW5jZS1pbml0
aWFsaXplcnMvZ2xvYmFsJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4
cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7CisgIC8vIGFwcC9pbnN0YW5jZS1pbml0aWFs
aXplcnMvZ2xvYmFsLmpzCisKKyAgZnVuY3Rpb24gaW5pdGlhbGl6ZShhcHBsaWNhdGlvbikgewor
ICAgIHdpbmRvdy5BcHAgPSBhcHBsaWNhdGlvbjsgLy8gb3Igd2luZG93LldoYXRldmVyCisgIH0K
KworICBleHBvcnRzWydkZWZhdWx0J10gPSB7CisgICAgbmFtZTogJ2dsb2JhbCcsCisgICAgaW5p
dGlhbGl6ZTogaW5pdGlhbGl6ZQorICB9OworfSk7CitkZWZpbmUoJ3RvZG9tdmMvcmVzb2x2ZXIn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJlc29sdmVyKSB7CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9lbWJlclJlc29sdmVyWydkZWZh
dWx0J107Cit9KTsKK2RlZmluZSgndG9kb212Yy9yb3V0ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXIn
LCAndG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
ciwgX3RvZG9tdmNDb25maWdFbnZpcm9ubWVudCkgeworCisgICAgdmFyIFJvdXRlciA9IF9lbWJl
clsnZGVmYXVsdCddLlJvdXRlci5leHRlbmQoeworICAgICAgICBsb2NhdGlvbjogX3RvZG9tdmND
b25maWdFbnZpcm9ubWVudFsnZGVmYXVsdCddLmxvY2F0aW9uVHlwZQorICAgIH0pOworCisgICAg
Um91dGVyLm1hcChmdW5jdGlvbiAoKSB7CisgICAgICAgIHRoaXMucm91dGUoJ2FjdGl2ZScpOwor
ICAgICAgICB0aGlzLnJvdXRlKCdjb21wbGV0ZWQnKTsKKyAgICB9KTsKKworICAgIGV4cG9ydHNb
J2RlZmF1bHQnXSA9IFJvdXRlcjsKK30pOworZGVmaW5lKCd0b2RvbXZjL3JvdXRlcy9hcHBsaWNh
dGlvbicsIFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7
CisgICAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uUm91dGUuZXh0ZW5k
KHsKKyAgICAgICAgcmVwbzogX2VtYmVyWydkZWZhdWx0J10uaW5qZWN0LnNlcnZpY2UoKSwKKyAg
ICAgICAgbW9kZWw6IGZ1bmN0aW9uIG1vZGVsKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMu
Z2V0KCdyZXBvJykuZmluZEFsbCgpOworICAgICAgICB9CisgICAgfSk7Cit9KTsKK2RlZmluZSgn
dG9kb212Yy9zZXJ2aWNlcy9hamF4JywgWydleHBvcnRzJywgJ2VtYmVyLWFqYXgvc2VydmljZXMv
YWpheCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyQWpheFNlcnZpY2VzQWpheCkgeworICBP
YmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ2RlZmF1bHQnLCB7CisgICAgZW51bWVyYWJs
ZTogdHJ1ZSwKKyAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJB
amF4U2VydmljZXNBamF4WydkZWZhdWx0J107CisgICAgfQorICB9KTsKK30pOworZGVmaW5lKCd0
b2RvbXZjL3NlcnZpY2VzL21lbW9yeScsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykg
eworICAoZnVuY3Rpb24gKHJvb3QpIHsKKyAgICB2YXIgbG9jYWxTdG9yYWdlTWVtb3J5ID0ge307
CisgICAgdmFyIGNhY2hlID0ge307CisKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2Ygc3RvcmVk
IGl0ZW1zLgorICAgICAqLworICAgIGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGggPSAwOworCisg
ICAgLyoqCisgICAgICogcmV0dXJucyBpdGVtIGZvciBwYXNzZWQga2V5LCBvciBudWxsCisgICAg
ICoKKyAgICAgKiBAcGFyYSB7U3RyaW5nfSBrZXkKKyAgICAgKiAgICAgICBuYW1lIG9mIGl0ZW0g
dG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9CisgICAgICovCisg
ICAgbG9jYWxTdG9yYWdlTWVtb3J5LmdldEl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgICBy
ZXR1cm4gY2FjaGVba2V5XSB8fCBudWxsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBzZXRz
IGl0ZW0gZm9yIGtleSB0byBwYXNzZWQgdmFsdWUsIGFzIFN0cmluZworICAgICAqCisgICAgICog
QHBhcmEge1N0cmluZ30ga2V5CisgICAgICogICAgICAgbmFtZSBvZiBpdGVtIHRvIGJlIHNldAor
ICAgICAqIEBwYXJhIHtTdHJpbmd9IHZhbHVlCisgICAgICogICAgICAgdmFsdWUsIHdpbGwgYWx3
YXlzIGJlIHR1cm5lZCBpbnRvIGEgU3RyaW5nCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0K
KyAgICAgKi8KKyAgICBsb2NhbFN0b3JhZ2VNZW1vcnkuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXks
IHZhbHVlKSB7CisgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykgeworICAg
ICAgICBsb2NhbFN0b3JhZ2VNZW1vcnkucmVtb3ZlSXRlbShrZXkpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgbG9j
YWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCsrOworICAgICAgICB9CisKKyAgICAgICAgY2FjaGVba2V5
XSA9ICcnICsgdmFsdWU7CisgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIHJlbW92
ZXMgaXRlbSBmb3IgcGFzc2VkIGtleQorICAgICAqCisgICAgICogQHBhcmEge1N0cmluZ30ga2V5
CisgICAgICogICAgICAgbmFtZSBvZiBpdGVtIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcmV0dXJu
cyB7dW5kZWZpbmVkfQorICAgICAqLworICAgIGxvY2FsU3RvcmFnZU1lbW9yeS5yZW1vdmVJdGVt
ID0gZnVuY3Rpb24gKGtleSkgeworICAgICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkp
IHsKKyAgICAgICAgZGVsZXRlIGNhY2hlW2tleV07CisgICAgICAgIGxvY2FsU3RvcmFnZU1lbW9y
eS5sZW5ndGgtLTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogcmV0dXJucyBu
YW1lIG9mIGtleSBhdCBwYXNzZWQgaW5kZXgKKyAgICAgKgorICAgICAqIEBwYXJhIHtOdW1iZXJ9
IGluZGV4CisgICAgICogICAgICAgUG9zaXRpb24gZm9yIGtleSB0byBiZSByZXR1cm5lZCAoc3Rh
cnRzIGF0IDApCisgICAgICogQHJldHVybnMge1N0cmluZ3xudWxsfQorICAgICAqLworICAgIGxv
Y2FsU3RvcmFnZU1lbW9yeS5rZXkgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICAgIHJldHVybiBP
YmplY3Qua2V5cyhjYWNoZSlbaW5kZXhdIHx8IG51bGw7CisgICAgfTsKKworICAgIC8qKgorICAg
ICAqIHJlbW92ZXMgYWxsIHN0b3JlZCBpdGVtcyBhbmQgc2V0cyBsZW5ndGggdG8gMAorICAgICAq
CisgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KKyAgICAgKi8KKyAgICBsb2NhbFN0b3JhZ2VN
ZW1vcnkuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgICBjYWNoZSA9IHt9OworICAgICAgbG9j
YWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCA9IDA7CisgICAgfTsKKworICAgIGlmICh0eXBlb2YgZXhw
b3J0cyA9PT0gJ29iamVjdCcpIHsKKyAgICAgIG1vZHVsZS5leHBvcnRzID0gbG9jYWxTdG9yYWdl
TWVtb3J5OworICAgIH0gZWxzZSB7CisgICAgICByb290LmxvY2FsU3RvcmFnZU1lbW9yeSA9IGxv
Y2FsU3RvcmFnZU1lbW9yeTsKKyAgICB9CisgIH0pKHRoaXMpOworfSk7CitkZWZpbmUoJ3RvZG9t
dmMvc2VydmljZXMvcmVwbycsIFsnZXhwb3J0cycsICdlbWJlcicsICd0b2RvbXZjL3NlcnZpY2Vz
L21lbW9yeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyLCBfdG9kb212Y1NlcnZpY2VzTWVt
b3J5KSB7CisgICAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uU2Vydmlj
ZS5leHRlbmQoeworICAgICAgICBsYXN0SWQ6IDAsCisgICAgICAgIGRhdGE6IG51bGwsCisgICAg
ICAgIGZpbmRBbGw6IGZ1bmN0aW9uIGZpbmRBbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhp
cy5nZXQoJ2RhdGEnKSB8fCB0aGlzLnNldCgnZGF0YScsIEpTT04ucGFyc2UoX3RvZG9tdmNTZXJ2
aWNlc01lbW9yeS5nZXRJdGVtKCd0b2RvcycpIHx8ICdbXScpKTsKKyAgICAgICAgfSwKKworICAg
ICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChhdHRycykgeworICAgICAgICAgICAgdmFyIHRvZG8gPSBP
YmplY3QuYXNzaWduKHsgaWQ6IHRoaXMuaW5jcmVtZW50UHJvcGVydHkoJ2xhc3RJZCcpIH0sIGF0
dHJzKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdkYXRhJykucHVzaE9iamVjdCh0b2RvKTsKKyAg
ICAgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgICAgICAgICAgcmV0dXJuIHRvZG87CisgICAg
ICAgIH0sCisKKyAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIF9kZWxldGUodG9kbykgeworICAg
ICAgICAgICAgdGhpcy5nZXQoJ2RhdGEnKS5yZW1vdmVPYmplY3QodG9kbyk7CisgICAgICAgICAg
ICB0aGlzLnBlcnNpc3QoKTsKKyAgICAgICAgfSwKKworICAgICAgICBwZXJzaXN0OiBmdW5jdGlv
biBwZXJzaXN0KCkgeworICAgICAgICAgICAgX3RvZG9tdmNTZXJ2aWNlc01lbW9yeS5zZXRJdGVt
KCd0b2RvcycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0KCdkYXRhJykpKTsKKyAgICAgICAgfQor
ICAgIH0pOworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVzL2FjdGl2ZSIsIFsiZXhwb3J0
cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICBleHBvcnRzWyJkZWZhdWx0Il0gPSBFbWJlci5I
VE1MQmFycy50ZW1wbGF0ZSgoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICBtZXRh
OiB7CisgICAgICAgICJmcmFnbWVudFJlYXNvbiI6IHsKKyAgICAgICAgICAibmFtZSI6ICJtaXNz
aW5nLXdyYXBwZXIiLAorICAgICAgICAgICJwcm9ibGVtcyI6IFsid3JvbmctdHlwZSJdCisgICAg
ICAgIH0sCisgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICJsb2Mi
OiB7CisgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0YXJ0IjogeworICAg
ICAgICAgICAgImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAKKyAgICAgICAgICB9
LAorICAgICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAg
ICAiY29sdW1uIjogMjUKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtb2R1bGVO
YW1lIjogInRvZG9tdmMvdGVtcGxhdGVzL2FjdGl2ZS5oYnMiCisgICAgICB9LAorICAgICAgaXNF
bXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwKKyAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxs
LAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rp
b24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1
bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7
CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgIHJldHVybiBlbDA7
CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJO
b2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICB2YXIgbW9y
cGhzID0gbmV3IEFycmF5KDEpOworICAgICAgICBtb3JwaHNbMF0gPSBkb20uY3JlYXRlTW9ycGhB
dChmcmFnbWVudCwgMCwgMCwgY29udGV4dHVhbEVsZW1lbnQpOworICAgICAgICBkb20uaW5zZXJ0
Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21l
bnQsIG51bGwpOworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRl
bWVudHM6IFtbImlubGluZSIsICJ0b2RvLWxpc3QiLCBbXSwgWyJ0b2RvcyIsIFsic3ViZXhwciIs
ICJAbXV0IiwgW1siZ2V0IiwgInRvZG9zIiwgWyJsb2MiLCBbbnVsbCwgWzEsIDE4XSwgWzEsIDIz
XV1dXV0sIFtdLCBbXV1dLCBbImxvYyIsIFtudWxsLCBbMSwgMF0sIFsxLCAyNV1dXV1dLAorICAg
ICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9OworICB9KSgpKTsKK30p
OworZGVmaW5lKCJ0b2RvbXZjL3RlbXBsYXRlcy9hcHBsaWNhdGlvbiIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICBleHBvcnRzWyJkZWZhdWx0Il0gPSBFbWJlci5IVE1MQmFy
cy50ZW1wbGF0ZSgoZnVuY3Rpb24gKCkgeworICAgIHZhciBjaGlsZDAgPSAoZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIGNoaWxkMCA9IChmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiB7Cisg
ICAgICAgICAgbWV0YTogeworICAgICAgICAgICAgImZyYWdtZW50UmVhc29uIjogZmFsc2UsCisg
ICAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAgICAgICAgImxvYyI6
IHsKKyAgICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgICAgICJzdGFydCI6
IHsKKyAgICAgICAgICAgICAgICAibGluZSI6IDExLAorICAgICAgICAgICAgICAgICJjb2x1bW4i
OiAxNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAiZW5kIjogeworICAgICAgICAg
ICAgICAgICJsaW5lIjogMTEsCisgICAgICAgICAgICAgICAgImNvbHVtbiI6IDYwCisgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAibW9kdWxlTmFtZSI6ICJ0b2Rv
bXZjL3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMiCisgICAgICAgICAgfSwKKyAgICAgICAgICBp
c0VtcHR5OiBmYWxzZSwKKyAgICAgICAgICBhcml0eTogMCwKKyAgICAgICAgICBjYWNoZWRGcmFn
bWVudDogbnVsbCwKKyAgICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICAgICAgYnVp
bGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgICAgIHZh
ciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICAgICAgdmFyIGVs
MSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiQWxsIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hp
bGQoZWwwLCBlbDEpOworICAgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgICB9LAorICAg
ICAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoKSB7Cisg
ICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgICAgfSwKKyAgICAgICAgICBzdGF0ZW1lbnRz
OiBbXSwKKyAgICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICAgIHRlbXBsYXRlczogW10KKyAg
ICAgICAgfTsKKyAgICAgIH0pKCk7CisgICAgICB2YXIgY2hpbGQxID0gKGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7CisgICAgICAgICAgICAiZnJhZ21l
bnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIs
CisgICAgICAgICAgICAibG9jIjogeworICAgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAg
ICAgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAgICJsaW5lIjogMTIsCisgICAg
ICAgICAgICAgICAgImNvbHVtbiI6IDE0CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAg
ICJlbmQiOiB7CisgICAgICAgICAgICAgICAgImxpbmUiOiAxMiwKKyAgICAgICAgICAgICAgICAi
Y29sdW1uIjogNjQKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
ICJtb2R1bGVOYW1lIjogInRvZG9tdmMvdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyIKKyAgICAg
ICAgICB9LAorICAgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICAgIGFyaXR5OiAwLAor
ICAgICAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgICAgIGhhc1JlbmRlcmVkOiBm
YWxzZSwKKyAgICAgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRv
bSkgeworICAgICAgICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJBY3RpdmUiKTsKKyAg
ICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgICAgIH0sCisgICAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2RlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgICB9
LAorICAgICAgICAgIHN0YXRlbWVudHM6IFtdLAorICAgICAgICAgIGxvY2FsczogW10sCisgICAg
ICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAgICB9OworICAgICAgfSkoKTsKKyAgICAgIHZhciBj
aGlsZDIgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIG1ldGE6
IHsKKyAgICAgICAgICAgICJmcmFnbWVudFJlYXNvbiI6IGZhbHNlLAorICAgICAgICAgICAgInJl
dmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAg
ICAgICJzb3VyY2UiOiBudWxsLAorICAgICAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAg
ICAgICAgImxpbmUiOiAxMywKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogMTQKKyAgICAgICAg
ICAgICAgfSwKKyAgICAgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICAgICAibGluZSI6
IDEzLAorICAgICAgICAgICAgICAgICJjb2x1bW4iOiA3MAorICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMv
YXBwbGljYXRpb24uaGJzIgorICAgICAgICAgIH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2Us
CisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRl
VGV4dE5vZGUoIkNvbXBsZXRlZCIpOworICAgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwg
ZWwxKTsKKyAgICAgICAgICAgIHJldHVybiBlbDA7CisgICAgICAgICAgfSwKKyAgICAgICAgICBi
dWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJlbmRlck5vZGVzKCkgeworICAgICAgICAg
ICAgcmV0dXJuIFtdOworICAgICAgICAgIH0sCisgICAgICAgICAgc3RhdGVtZW50czogW10sCisg
ICAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgICB0ZW1wbGF0ZXM6IFtdCisgICAgICAgIH07
CisgICAgICB9KSgpOworICAgICAgdmFyIGNoaWxkMyA9IChmdW5jdGlvbiAoKSB7CisgICAgICAg
IHJldHVybiB7CisgICAgICAgICAgbWV0YTogeworICAgICAgICAgICAgImZyYWdtZW50UmVhc29u
IjogZmFsc2UsCisgICAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAg
ICAgICAgImxvYyI6IHsKKyAgICAgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAg
ICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgICAibGluZSI6IDE1LAorICAgICAgICAgICAg
ICAgICJjb2x1bW4iOiA4CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICJlbmQiOiB7
CisgICAgICAgICAgICAgICAgImxpbmUiOiAxNywKKyAgICAgICAgICAgICAgICAiY29sdW1uIjog
OAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5h
bWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIgorICAgICAgICAgIH0sCisg
ICAgICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAg
Y2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAg
ICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAg
ICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
ICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAgICAgICAgICAiKTsKKyAgICAgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICB2YXIgZWwxID0gZG9t
LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOworICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShl
bDEsICJpZCIsICJjbGVhci1jb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIHZhciBlbDIgPSBkb20u
Y3JlYXRlVGV4dE5vZGUoIkNsZWFyIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgZG9tLmFwcGVu
ZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHJldHVybiBlbDA7
CisgICAgICAgICAgfSwKKyAgICAgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWls
ZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAg
ICAgICB2YXIgZWxlbWVudDAgPSBkb20uY2hpbGRBdChmcmFnbWVudCwgWzFdKTsKKyAgICAgICAg
ICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgICAgICBtb3JwaHNbMF0gPSBk
b20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQwLCAnb25jbGljaycpOworICAgICAgICAgICAgcmV0
dXJuIG1vcnBoczsKKyAgICAgICAgICB9LAorICAgICAgICAgIHN0YXRlbWVudHM6IFtbImF0dHJp
YnV0ZSIsICJvbmNsaWNrIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsiY2xlYXJDb21wbGV0ZWQi
XSwgW10sIFsibG9jIiwgW251bGwsIFsxNiwgNDddLCBbMTYsIDc0XV1dXV1dLAorICAgICAgICAg
IGxvY2FsczogW10sCisgICAgICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAgICB9OworICAgICAg
fSkoKTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1ldGE6IHsKKyAgICAgICAgICAiZnJhZ21l
bnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAicmV2aXNpb24iOiAiRW1iZXJAMi42LjIiLAor
ICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAg
ICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgImxpbmUiOiA3LAorICAgICAgICAgICAgICAi
Y29sdW1uIjogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJlbmQiOiB7CisgICAgICAg
ICAgICAgICJsaW5lIjogMTksCisgICAgICAgICAgICAgICJjb2x1bW4iOiA0CisgICAgICAgICAg
ICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAibW9kdWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBs
YXRlcy9hcHBsaWNhdGlvbi5oYnMiCisgICAgICAgIH0sCisgICAgICAgIGlzRW1wdHk6IGZhbHNl
LAorICAgICAgICBhcml0eTogMCwKKyAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAg
ICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24g
YnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3Vt
ZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCIg
ICAgICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICAg
IHZhciBlbDEgPSBkb20uY3JlYXRlRWxlbWVudCgiZm9vdGVyIik7CisgICAgICAgICAgZG9tLnNl
dEF0dHJpYnV0ZShlbDEsICJpZCIsICJmb290ZXIiKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9t
LmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxk
KGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4i
KTsKKyAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMiwgImlkIiwgInRvZG8tY291bnQiKTsK
KyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIpOworICAgICAg
ICAgIHZhciBlbDQgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgZG9tLmFwcGVu
ZENoaWxkKGVsMywgZWw0KTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOwor
ICAgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAiKTsKKyAgICAgICAgICBk
b20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRl
Q29tbWVudCgiIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAg
ICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCIgbGVmdCIpOworICAgICAgICAgIGRv
bS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwg
ZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAg
Iik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIg
ZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInVsIik7CisgICAgICAgICAgZG9tLnNldEF0dHJpYnV0
ZShlbDIsICJpZCIsICJmaWx0ZXJzIik7CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVU
ZXh0Tm9kZSgiXG4gICAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwg
ZWwzKTsKKyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxpIik7CisgICAg
ICAgICAgdmFyIGVsNCA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20uYXBw
ZW5kQ2hpbGQoZWwzLCBlbDQpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7
CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAgIik7
CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgICB2YXIgZWwz
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxpIik7CisgICAgICAgICAgdmFyIGVsNCA9IGRvbS5jcmVh
dGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQpOworICAg
ICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAgdmFyIGVsMyA9IGRv
bS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAgIik7CisgICAgICAgICAgZG9tLmFwcGVuZENo
aWxkKGVsMiwgZWwzKTsKKyAgICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUVsZW1lbnQoImxp
Iik7CisgICAgICAgICAgdmFyIGVsNCA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAg
ICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDIsIGVsMyk7CisgICAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAg
ICAgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgICAg
ZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0
ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVDb21tZW50KCIiKTsKKyAgICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4
dE5vZGUoIiAgICAgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIgZWwxID0g
ZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAs
IGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVpbGRS
ZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250
ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBlbGVtZW50MSA9IGRvbS5jaGlsZEF0KGZy
YWdtZW50LCBbMV0pOworICAgICAgICAgIHZhciBlbGVtZW50MiA9IGRvbS5jaGlsZEF0KGVsZW1l
bnQxLCBbMV0pOworICAgICAgICAgIHZhciBlbGVtZW50MyA9IGRvbS5jaGlsZEF0KGVsZW1lbnQx
LCBbM10pOworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoNik7CisgICAgICAgICAg
bW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZG9tLmNoaWxkQXQoZWxlbWVudDIsIFswXSks
IDAsIDApOworICAgICAgICAgIG1vcnBoc1sxXSA9IGRvbS5jcmVhdGVNb3JwaEF0KGVsZW1lbnQy
LCAyLCAyKTsKKyAgICAgICAgICBtb3JwaHNbMl0gPSBkb20uY3JlYXRlTW9ycGhBdChkb20uY2hp
bGRBdChlbGVtZW50MywgWzFdKSwgMCwgMCk7CisgICAgICAgICAgbW9ycGhzWzNdID0gZG9tLmNy
ZWF0ZU1vcnBoQXQoZG9tLmNoaWxkQXQoZWxlbWVudDMsIFszXSksIDAsIDApOworICAgICAgICAg
IG1vcnBoc1s0XSA9IGRvbS5jcmVhdGVNb3JwaEF0KGRvbS5jaGlsZEF0KGVsZW1lbnQzLCBbNV0p
LCAwLCAwKTsKKyAgICAgICAgICBtb3JwaHNbNV0gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50
MSwgNSwgNSk7CisgICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwKKyAgICAgICAg
c3RhdGVtZW50czogW1siY29udGVudCIsICJyZW1haW5pbmcubGVuZ3RoIiwgWyJsb2MiLCBbbnVs
bCwgWzksIDM4XSwgWzksIDU4XV1dXSwgWyJpbmxpbmUiLCAicGx1cmFsaXplIiwgWyJpdGVtIiwg
WyJnZXQiLCAicmVtYWluaW5nLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFs5LCA4N10sIFs5LCAx
MDNdXV1dXSwgW10sIFsibG9jIiwgW251bGwsIFs5LCA2OF0sIFs5LCAxMDVdXV1dLCBbImJsb2Nr
IiwgImxpbmstdG8iLCBbImluZGV4Il0sIFsiYWN0aXZlQ2xhc3MiLCAic2VsZWN0ZWQiXSwgMCwg
bnVsbCwgWyJsb2MiLCBbbnVsbCwgWzExLCAxNF0sIFsxMSwgNzJdXV1dLCBbImJsb2NrIiwgImxp
bmstdG8iLCBbImFjdGl2ZSJdLCBbImFjdGl2ZUNsYXNzIiwgInNlbGVjdGVkIl0sIDEsIG51bGws
IFsibG9jIiwgW251bGwsIFsxMiwgMTRdLCBbMTIsIDc2XV1dXSwgWyJibG9jayIsICJsaW5rLXRv
IiwgWyJjb21wbGV0ZWQiXSwgWyJhY3RpdmVDbGFzcyIsICJzZWxlY3RlZCJdLCAyLCBudWxsLCBb
ImxvYyIsIFtudWxsLCBbMTMsIDE0XSwgWzEzLCA4Ml1dXV0sIFsiYmxvY2siLCAiaWYiLCBbWyJn
ZXQiLCAiY29tcGxldGVkLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFsxNSwgMTRdLCBbMTUsIDMw
XV1dXV0sIFtdLCAzLCBudWxsLCBbImxvYyIsIFtudWxsLCBbMTUsIDhdLCBbMTcsIDE1XV1dXV0s
CisgICAgICAgIGxvY2FsczogW10sCisgICAgICAgIHRlbXBsYXRlczogW2NoaWxkMCwgY2hpbGQx
LCBjaGlsZDIsIGNoaWxkM10KKyAgICAgIH07CisgICAgfSkoKTsKKyAgICByZXR1cm4geworICAg
ICAgbWV0YTogeworICAgICAgICAiZnJhZ21lbnRSZWFzb24iOiB7CisgICAgICAgICAgIm5hbWUi
OiAibWlzc2luZy13cmFwcGVyIiwKKyAgICAgICAgICAicHJvYmxlbXMiOiBbIm11bHRpcGxlLW5v
ZGVzIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAg
ICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAic3Rh
cnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAiY29sdW1uIjogMAor
ICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICJsaW5lIjogMjks
CisgICAgICAgICAgICAiY29sdW1uIjogOQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAg
ICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIgorICAg
ICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNo
ZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxk
RnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAg
PSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNy
ZWF0ZUVsZW1lbnQoInNlY3Rpb24iKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDEsICJp
ZCIsICJ0b2RvYXBwIik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxu
ICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVs
MiA9IGRvbS5jcmVhdGVFbGVtZW50KCJoZWFkZXIiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0
ZShlbDIsICJpZCIsICJoZWFkZXIiKTsKKyAgICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0
Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAg
ICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxlbWVudCgiaDEiKTsKKyAgICAgICAgdmFyIGVsNCA9
IGRvbS5jcmVhdGVUZXh0Tm9kZSgidG9kb3MiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVs
MywgZWw0KTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgdmFy
IGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRD
aGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxlbWVudCgiaW5w
dXQiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJ0eXBlIiwgInRleHQiKTsKKyAg
ICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJpZCIsICJuZXctdG9kbyIpOworICAgICAgICBk
b20uc2V0QXR0cmlidXRlKGVsMywgInBsYWNlaG9sZGVyIiwgIldoYXQgbmVlZHMgdG8gYmUgZG9u
ZT8iKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMsICJhdXRvZm9jdXMiLCAiIik7Cisg
ICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20u
Y3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwz
KTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9
IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3Jl
YXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgIGRvbS5hcHBl
bmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7Cisg
ICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgIGRvbS5h
cHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlRWxlbWVu
dCgiZm9vdGVyIik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiaWQiLCAiaW5mbyIp
OworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgIik7CisgICAgICAg
IGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRl
RWxlbWVudCgicCIpOworICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCJEb3Vi
bGUtY2xpY2sgdG8gZWRpdCBhIHRvZG8iKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMiwg
ZWwzKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVs
MiA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQo
ZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZUVsZW1lbnQoInAiKTsKKyAg
ICAgICAgdmFyIGVsMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgQ3JlYXRlZCBieVxuICAg
ICIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICB2YXIgZWwz
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbDMs
ICJocmVmIiwgImh0dHA6Ly9naXRodWIuY29tL2NpYmVybm94Iik7CisgICAgICAgIHZhciBlbDQg
PSBkb20uY3JlYXRlVGV4dE5vZGUoIk1pZ3VlbCBDYW1iYSIpOworICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwzLCBlbDQpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAg
ICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZVRleHROb2RlKCIsXG4gICAgIik7CisgICAgICAgIGRv
bS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlRWxl
bWVudCgiYSIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMywgImhyZWYiLCAiaHR0cDov
L2dpdGh1Yi5jb20vYWRkeW9zbWFuaSIpOworICAgICAgICB2YXIgZWw0ID0gZG9tLmNyZWF0ZVRl
eHROb2RlKCJBZGR5IE9zbWFuaSIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwzLCBlbDQp
OworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICB2YXIgZWwzID0g
ZG9tLmNyZWF0ZVRleHROb2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDIs
IGVsMyk7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAgIHZhciBl
bDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxk
KGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVFbGVtZW50KCJwIik7Cisg
ICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlBhcnQgb2YgIik7CisgICAgICAg
IGRvbS5hcHBlbmRDaGlsZChlbDIsIGVsMyk7CisgICAgICAgIHZhciBlbDMgPSBkb20uY3JlYXRl
RWxlbWVudCgiYSIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMywgImhyZWYiLCAiaHR0
cDovL3RvZG9tdmMuY29tIik7CisgICAgICAgIHZhciBlbDQgPSBkb20uY3JlYXRlVGV4dE5vZGUo
IlRvZG9NVkMiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMywgZWw0KTsKKyAgICAgICAg
ZG9tLmFwcGVuZENoaWxkKGVsMiwgZWwzKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwg
ZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsKKyAgICAg
ICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVs
MCwgZWwxKTsKKyAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRl
ck5vZGVzOiBmdW5jdGlvbiBidWlsZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1
YWxFbGVtZW50KSB7CisgICAgICAgIHZhciBlbGVtZW50NCA9IGRvbS5jaGlsZEF0KGZyYWdtZW50
LCBbMF0pOworICAgICAgICB2YXIgZWxlbWVudDUgPSBkb20uY2hpbGRBdChlbGVtZW50NCwgWzEs
IDNdKTsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgzKTsKKyAgICAgICAgbW9ycGhz
WzBdID0gZG9tLmNyZWF0ZUF0dHJNb3JwaChlbGVtZW50NSwgJ29ua2V5ZG93bicpOworICAgICAg
ICBtb3JwaHNbMV0gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50NCwgMywgMyk7CisgICAgICAg
IG1vcnBoc1syXSA9IGRvbS5jcmVhdGVNb3JwaEF0KGVsZW1lbnQ0LCA1LCA1KTsKKyAgICAgICAg
cmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJhdHRyaWJ1dGUi
LCAib25rZXlkb3duIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsiY3JlYXRlVG9kbyJdLCBbXSwg
WyJsb2MiLCBbbnVsbCwgWzQsIDQ3XSwgWzQsIDcwXV1dXV0sIFsiY29udGVudCIsICJvdXRsZXQi
LCBbImxvYyIsIFtudWxsLCBbNiwgNF0sIFs2LCAxNF1dXV0sIFsiYmxvY2siLCAiaWYiLCBbWyJz
dWJleHByIiwgImd0IiwgW1siZ2V0IiwgIm1vZGVsLmxlbmd0aCIsIFsibG9jIiwgW251bGwsIFs3
LCAxNF0sIFs3LCAyNl1dXV0sIDBdLCBbXSwgWyJsb2MiLCBbbnVsbCwgWzcsIDEwXSwgWzcsIDI5
XV1dXV0sIFtdLCAwLCBudWxsLCBbImxvYyIsIFtudWxsLCBbNywgNF0sIFsxOSwgMTFdXV1dXSwK
KyAgICAgIGxvY2FsczogW10sCisgICAgICB0ZW1wbGF0ZXM6IFtjaGlsZDBdCisgICAgfTsKKyAg
fSkoKSk7Cit9KTsKK2RlZmluZSgidG9kb212Yy90ZW1wbGF0ZXMvY29tcGxldGVkIiwgWyJleHBv
cnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVy
LkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIG1l
dGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1lIjogIm1p
c3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAg
ICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxv
YyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAic3RhcnQiOiB7Cisg
ICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAg
IH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICJsaW5lIjogMSwKKyAgICAgICAg
ICAgICJjb2x1bW4iOiAyNQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVs
ZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcGxldGVkLmhicyIKKyAgICAgIH0sCisgICAg
ICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVkRnJhZ21lbnQ6
IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZyYWdtZW50OiBm
dW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0
ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVDb21tZW50
KCIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgcmV0dXJu
IGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJl
bmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAgIHZh
ciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgIG1vcnBoc1swXSA9IGRvbS5jcmVhdGVN
b3JwaEF0KGZyYWdtZW50LCAwLCAwLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgICAgIGRvbS5p
bnNlcnRCb3VuZGFyeShmcmFnbWVudCwgMCk7CisgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFyeShm
cmFnbWVudCwgbnVsbCk7CisgICAgICAgIHJldHVybiBtb3JwaHM7CisgICAgICB9LAorICAgICAg
c3RhdGVtZW50czogW1siaW5saW5lIiwgInRvZG8tbGlzdCIsIFtdLCBbInRvZG9zIiwgWyJzdWJl
eHByIiwgIkBtdXQiLCBbWyJnZXQiLCAidG9kb3MiLCBbImxvYyIsIFtudWxsLCBbMSwgMThdLCBb
MSwgMjNdXV1dXSwgW10sIFtdXV0sIFsibG9jIiwgW251bGwsIFsxLCAwXSwgWzEsIDI1XV1dXV0s
CisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXQorICAgIH07CisgIH0pKCkp
OworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1pdGVtIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9
IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAg
ICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1l
IjogIm1pc3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInByb2JsZW1zIjogWyJtdWx0aXBsZS1u
b2RlcyJdCisgICAgICAgIH0sCisgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisg
ICAgICAgICJsb2MiOiB7CisgICAgICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0
YXJ0IjogeworICAgICAgICAgICAgImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAK
KyAgICAgICAgICB9LAorICAgICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDYs
CisgICAgICAgICAgICAiY29sdW1uIjogMTUzCisgICAgICAgICAgfQorICAgICAgICB9LAorICAg
ICAgICAibW9kdWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8taXRl
bS5oYnMiCisgICAgICB9LAorICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwK
KyAgICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAor
ICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAg
ICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBl
bDEgPSBkb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAiY2xhc3MiLCAidmlldyIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHRO
b2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAg
IHZhciBlbDIgPSBkb20uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgZG9tLnNldEF0
dHJpYnV0ZShlbDIsICJ0eXBlIiwgImNoZWNrYm94Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1
dGUoZWwyLCAiY2xhc3MiLCAidG9nZ2xlIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEs
IGVsMik7CisgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlVGV4dE5vZGUoIlxuICAiKTsKKyAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgdmFyIGVsMiA9IGRvbS5j
cmVhdGVFbGVtZW50KCJsYWJlbCIpOworICAgICAgICB2YXIgZWwzID0gZG9tLmNyZWF0ZUNvbW1l
bnQoIiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwyLCBlbDMpOworICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHRO
b2RlKCJcbiAgIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAgICAg
IHZhciBlbDIgPSBkb20uY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CisgICAgICAgIGRvbS5zZXRB
dHRyaWJ1dGUoZWwyLCAiY2xhc3MiLCAiZGVzdHJveSIpOworICAgICAgICBkb20uYXBwZW5kQ2hp
bGQoZWwxLCBlbDIpOworICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIp
OworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwxLCBlbDIpOworICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJc
biIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIgZWwx
ID0gZG9tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAidHlwZSIsICJ0ZXh0Iik7CisgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiY2xh
c3MiLCAiZWRpdCIpOworICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMSwgImF1dG9mb2N1cyIs
ICIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgcmV0dXJu
IGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWlsZFJl
bmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICAgIHZh
ciBlbGVtZW50MCA9IGRvbS5jaGlsZEF0KGZyYWdtZW50LCBbMF0pOworICAgICAgICB2YXIgZWxl
bWVudDEgPSBkb20uY2hpbGRBdChlbGVtZW50MCwgWzFdKTsKKyAgICAgICAgaWYgKHRoaXMuY2Fj
aGVkRnJhZ21lbnQpIHsKKyAgICAgICAgICBkb20ucmVwYWlyQ2xvbmVkTm9kZShlbGVtZW50MSwg
W10sIHRydWUpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50MiA9IGRvbS5jaGlsZEF0
KGVsZW1lbnQwLCBbM10pOworICAgICAgICB2YXIgZWxlbWVudDMgPSBkb20uY2hpbGRBdChlbGVt
ZW50MCwgWzVdKTsKKyAgICAgICAgdmFyIGVsZW1lbnQ0ID0gZG9tLmNoaWxkQXQoZnJhZ21lbnQs
IFsyXSk7CisgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoOCk7CisgICAgICAgIG1vcnBo
c1swXSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDEsICdjaGVja2VkJyk7CisgICAgICAg
IG1vcnBoc1sxXSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDEsICdvbmNoYW5nZScpOwor
ICAgICAgICBtb3JwaHNbMl0gPSBkb20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQyLCAnb25kYmxj
bGljaycpOworICAgICAgICBtb3JwaHNbM10gPSBkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50Miwg
MCwgMCk7CisgICAgICAgIG1vcnBoc1s0XSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudDMs
ICdvbmNsaWNrJyk7CisgICAgICAgIG1vcnBoc1s1XSA9IGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxl
bWVudDQsICd2YWx1ZScpOworICAgICAgICBtb3JwaHNbNl0gPSBkb20uY3JlYXRlQXR0ck1vcnBo
KGVsZW1lbnQ0LCAnb25ibHVyJyk7CisgICAgICAgIG1vcnBoc1s3XSA9IGRvbS5jcmVhdGVBdHRy
TW9ycGgoZWxlbWVudDQsICdvbmtleWRvd24nKTsKKyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAg
ICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJhdHRyaWJ1dGUiLCAiY2hlY2tlZCIsIFsiZ2V0
IiwgInRvZG8uY29tcGxldGVkIiwgWyJsb2MiLCBbbnVsbCwgWzIsIDUwXSwgWzIsIDY0XV1dXV0s
IFsiYXR0cmlidXRlIiwgIm9uY2hhbmdlIiwgWyJzdWJleHByIiwgImFjdGlvbiIsIFsidG9nZ2xl
Q29tcGxldGVkIl0sIFtdLCBbImxvYyIsIFtudWxsLCBbMiwgNzZdLCBbMiwgMTA0XV1dXV0sIFsi
YXR0cmlidXRlIiwgIm9uZGJsY2xpY2siLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJzdGFydEVk
aXRpbmciXSwgW10sIFsibG9jIiwgW251bGwsIFszLCAyMF0sIFszLCA0NV1dXV1dLCBbImNvbnRl
bnQiLCAidG9kby50aXRsZSIsIFsibG9jIiwgW251bGwsIFszLCA0Nl0sIFszLCA2MF1dXV0sIFsi
YXR0cmlidXRlIiwgIm9uY2xpY2siLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJyZW1vdmVUb2Rv
Il0sIFtdLCBbImxvYyIsIFtudWxsLCBbNCwgMThdLCBbNCwgNDFdXV1dXSwgWyJhdHRyaWJ1dGUi
LCAidmFsdWUiLCBbImdldCIsICJ0b2RvLnRpdGxlIiwgWyJsb2MiLCBbbnVsbCwgWzYsIDQwXSwg
WzYsIDUwXV1dXV0sIFsiYXR0cmlidXRlIiwgIm9uYmx1ciIsIFsic3ViZXhwciIsICJhY3Rpb24i
LCBbImRvbmVFZGl0aW5nIl0sIFsidmFsdWUiLCAidGFyZ2V0LnZhbHVlIl0sIFsibG9jIiwgW251
bGwsIFs2LCA2MF0sIFs2LCAxMDVdXV1dXSwgWyJhdHRyaWJ1dGUiLCAib25rZXlkb3duIiwgWyJz
dWJleHByIiwgImFjdGlvbiIsIFsiaGFuZGxlS2V5ZG93biJdLCBbXSwgWyJsb2MiLCBbbnVsbCwg
WzYsIDExNl0sIFs2LCAxNDJdXV1dXV0sCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxh
dGVzOiBbXQorICAgIH07CisgIH0pKCkpOworfSk7CitkZWZpbmUoInRvZG9tdmMvdGVtcGxhdGVz
L2NvbXBvbmVudHMvdG9kby1saXN0IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7
CisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChmdW5jdGlv
biAoKSB7CisgICAgdmFyIGNoaWxkMCA9IChmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY2hpbGQw
ID0gKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7Cisg
ICAgICAgICAgICAiZnJhZ21lbnRSZWFzb24iOiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lv
biI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICAgICAibG9jIjogeworICAgICAgICAgICAgICAi
c291cmNlIjogbnVsbCwKKyAgICAgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAg
ICJsaW5lIjogMiwKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogMgorICAgICAgICAgICAgICB9
LAorICAgICAgICAgICAgICAiZW5kIjogeworICAgICAgICAgICAgICAgICJsaW5lIjogNCwKKyAg
ICAgICAgICAgICAgICAiY29sdW1uIjogMgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50
cy90b2RvLWxpc3QuaGJzIgorICAgICAgICAgIH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2Us
CisgICAgICAgICAgYXJpdHk6IDAsCisgICAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRl
VGV4dE5vZGUoIiAgICAiKTsKKyAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7
CisgICAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAg
ICAgICAgICBkb20uc2V0QXR0cmlidXRlKGVsMSwgInR5cGUiLCAiY2hlY2tib3giKTsKKyAgICAg
ICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCAiaWQiLCAidG9nZ2xlLWFsbCIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBk
b20uY3JlYXRlVGV4dE5vZGUoIlxuIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWww
LCBlbDEpOworICAgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgICB9LAorICAgICAgICAg
IGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFnbWVu
dCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgICAgIHZhciBlbGVtZW50MCA9IGRvbS5j
aGlsZEF0KGZyYWdtZW50LCBbMV0pOworICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVkRnJhZ21l
bnQpIHsKKyAgICAgICAgICAgICAgZG9tLnJlcGFpckNsb25lZE5vZGUoZWxlbWVudDAsIFtdLCB0
cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXko
Mik7CisgICAgICAgICAgICBtb3JwaHNbMF0gPSBkb20uY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQw
LCAnY2hlY2tlZCcpOworICAgICAgICAgICAgbW9ycGhzWzFdID0gZG9tLmNyZWF0ZUF0dHJNb3Jw
aChlbGVtZW50MCwgJ29uY2hhbmdlJyk7CisgICAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAg
ICAgICAgIH0sCisgICAgICAgICAgc3RhdGVtZW50czogW1siYXR0cmlidXRlIiwgImNoZWNrZWQi
LCBbImdldCIsICJhbGxDb21wbGV0ZWQiLCBbImxvYyIsIFtudWxsLCBbMywgNTNdLCBbMywgNjVd
XV1dXSwgWyJhdHRyaWJ1dGUiLCAib25jaGFuZ2UiLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJ0
b2dnbGVBbGwiXSwgW10sIFsibG9jIiwgW251bGwsIFszLCA3N10sIFszLCA5OV1dXV1dXSwKKyAg
ICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICAgIHRlbXBsYXRlczogW10KKyAgICAgICAgfTsK
KyAgICAgIH0pKCk7CisgICAgICB2YXIgY2hpbGQxID0gKGZ1bmN0aW9uICgpIHsKKyAgICAgICAg
cmV0dXJuIHsKKyAgICAgICAgICBtZXRhOiB7CisgICAgICAgICAgICAiZnJhZ21lbnRSZWFzb24i
OiBmYWxzZSwKKyAgICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAg
ICAgICAibG9jIjogeworICAgICAgICAgICAgICAic291cmNlIjogbnVsbCwKKyAgICAgICAgICAg
ICAgInN0YXJ0IjogeworICAgICAgICAgICAgICAgICJsaW5lIjogNiwKKyAgICAgICAgICAgICAg
ICAiY29sdW1uIjogNAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAiZW5kIjogewor
ICAgICAgICAgICAgICAgICJsaW5lIjogOCwKKyAgICAgICAgICAgICAgICAiY29sdW1uIjogNAor
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm1vZHVsZU5hbWUi
OiAidG9kb212Yy90ZW1wbGF0ZXMvY29tcG9uZW50cy90b2RvLWxpc3QuaGJzIgorICAgICAgICAg
IH0sCisgICAgICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICAgICAgYXJpdHk6IDEsCisgICAg
ICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNl
LAorICAgICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7
CisgICAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAg
ICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlVGV4dE5vZGUoIiAgICAgICIpOworICAgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICAgIHZhciBlbDEgPSBk
b20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBl
bDEpOworICAgICAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsKKyAg
ICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgICAgIH0sCisgICAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAg
ICAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAgICAgICAgIG1vcnBoc1sw
XSA9IGRvbS5jcmVhdGVNb3JwaEF0KGZyYWdtZW50LCAxLCAxLCBjb250ZXh0dWFsRWxlbWVudCk7
CisgICAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgICAgIH0sCisgICAgICAgICAgc3Rh
dGVtZW50czogW1siaW5saW5lIiwgInRvZG8taXRlbSIsIFtdLCBbInRvZG8iLCBbInN1YmV4cHIi
LCAiQG11dCIsIFtbImdldCIsICJ0b2RvIiwgWyJsb2MiLCBbbnVsbCwgWzcsIDIzXSwgWzcsIDI3
XV1dXV0sIFtdLCBbXV0sICJvblN0YXJ0RWRpdCIsIFsic3ViZXhwciIsICJhY3Rpb24iLCBbImRp
c2FibGVUb2dnbGUiXSwgW10sIFsibG9jIiwgW251bGwsIFs3LCA0MF0sIFs3LCA2NF1dXV0sICJv
bkVuZEVkaXQiLCBbInN1YmV4cHIiLCAiYWN0aW9uIiwgWyJlbmFibGVUb2dnbGUiXSwgW10sIFsi
bG9jIiwgW251bGwsIFs3LCA3NV0sIFs3LCA5OF1dXV1dLCBbImxvYyIsIFtudWxsLCBbNywgNl0s
IFs3LCAxMDBdXV1dXSwKKyAgICAgICAgICBsb2NhbHM6IFsidG9kbyJdLAorICAgICAgICAgIHRl
bXBsYXRlczogW10KKyAgICAgICAgfTsKKyAgICAgIH0pKCk7CisgICAgICByZXR1cm4geworICAg
ICAgICBtZXRhOiB7CisgICAgICAgICAgImZyYWdtZW50UmVhc29uIjogeworICAgICAgICAgICAg
Im5hbWUiOiAibWlzc2luZy13cmFwcGVyIiwKKyAgICAgICAgICAgICJwcm9ibGVtcyI6IFsid3Jv
bmctdHlwZSIsICJtdWx0aXBsZS1ub2RlcyJdCisgICAgICAgICAgfSwKKyAgICAgICAgICAicmV2
aXNpb24iOiAiRW1iZXJAMi42LjIiLAorICAgICAgICAgICJsb2MiOiB7CisgICAgICAgICAgICAi
c291cmNlIjogbnVsbCwKKyAgICAgICAgICAgICJzdGFydCI6IHsKKyAgICAgICAgICAgICAgImxp
bmUiOiAxLAorICAgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICJlbmQiOiB7CisgICAgICAgICAgICAgICJsaW5lIjogMTAsCisgICAgICAgICAgICAg
ICJjb2x1bW4iOiAwCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAibW9k
dWxlTmFtZSI6ICJ0b2RvbXZjL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8tbGlzdC5oYnMiCisg
ICAgICAgIH0sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICBhcml0eTogMCwKKyAg
ICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwK
KyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAg
ICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
ICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRD
aGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgi
ICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICAgIHZh
ciBlbDEgPSBkb20uY3JlYXRlRWxlbWVudCgidWwiKTsKKyAgICAgICAgICBkb20uc2V0QXR0cmli
dXRlKGVsMSwgImlkIiwgInRvZG8tbGlzdCIpOworICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUo
ZWwxLCAiY2xhc3MiLCAidG9kby1saXN0Iik7CisgICAgICAgICAgdmFyIGVsMiA9IGRvbS5jcmVh
dGVUZXh0Tm9kZSgiXG4iKTsKKyAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwxLCBlbDIpOwor
ICAgICAgICAgIHZhciBlbDIgPSBkb20uY3JlYXRlQ29tbWVudCgiIik7CisgICAgICAgICAgZG9t
LmFwcGVuZENoaWxkKGVsMSwgZWwyKTsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNyZWF0ZVRl
eHROb2RlKCIgICIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7CisgICAg
ICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9t
LmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVs
MSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVpbGRSZW5k
ZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0
dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMik7CisgICAg
ICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRl
eHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBtb3JwaHNbMV0gPSBkb20uY3JlYXRlTW9ycGhBdChk
b20uY2hpbGRBdChmcmFnbWVudCwgWzJdKSwgMSwgMSk7CisgICAgICAgICAgZG9tLmluc2VydEJv
dW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgICB9
LAorICAgICAgICBzdGF0ZW1lbnRzOiBbWyJibG9jayIsICJpZiIsIFtbImdldCIsICJjYW5Ub2dn
bGUiLCBbImxvYyIsIFtudWxsLCBbMiwgOF0sIFsyLCAxN11dXV1dLCBbXSwgMCwgbnVsbCwgWyJs
b2MiLCBbbnVsbCwgWzIsIDJdLCBbNCwgOV1dXV0sIFsiYmxvY2siLCAiZWFjaCIsIFtbImdldCIs
ICJ0b2RvcyIsIFsibG9jIiwgW251bGwsIFs2LCAxMl0sIFs2LCAxN11dXV1dLCBbXSwgMSwgbnVs
bCwgWyJsb2MiLCBbbnVsbCwgWzYsIDRdLCBbOCwgMTNdXV1dXSwKKyAgICAgICAgbG9jYWxzOiBb
XSwKKyAgICAgICAgdGVtcGxhdGVzOiBbY2hpbGQwLCBjaGlsZDFdCisgICAgICB9OworICAgIH0p
KCk7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdtZW50UmVhc29u
IjogeworICAgICAgICAgICJuYW1lIjogIm1pc3Npbmctd3JhcHBlciIsCisgICAgICAgICAgInBy
b2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJldmlzaW9uIjog
IkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291cmNlIjogbnVs
bCwKKyAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAg
ICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6IHsKKyAgICAg
ICAgICAgICJsaW5lIjogMTEsCisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0K
KyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvY29t
cG9uZW50cy90b2RvLWxpc3QuaGJzIgorICAgICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNlLAor
ICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1Jl
bmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21l
bnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgp
OworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICBkb20u
YXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwKKyAg
ICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFn
bWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJh
eSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAs
IDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdt
ZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCBudWxsKTsKKyAg
ICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJibG9j
ayIsICJpZiIsIFtbImdldCIsICJ0b2Rvcy5sZW5ndGgiLCBbImxvYyIsIFtudWxsLCBbMSwgNl0s
IFsxLCAxOF1dXV1dLCBbXSwgMCwgbnVsbCwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBbMTAsIDdd
XV1dXSwKKyAgICAgIGxvY2FsczogW10sCisgICAgICB0ZW1wbGF0ZXM6IFtjaGlsZDBdCisgICAg
fTsKKyAgfSkoKSk7Cit9KTsKK2RlZmluZSgidG9kb212Yy90ZW1wbGF0ZXMvaW5kZXgiLCBbImV4
cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgZXhwb3J0c1siZGVmYXVsdCJdID0gRW1i
ZXIuSFRNTEJhcnMudGVtcGxhdGUoKGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgY2hpbGQwID0gKGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1ldGE6IHsKKyAgICAgICAgICAi
ZnJhZ21lbnRSZWFzb24iOiB7CisgICAgICAgICAgICAibmFtZSI6ICJtaXNzaW5nLXdyYXBwZXIi
LAorICAgICAgICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgICB9LAor
ICAgICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICAgImxvYyI6IHsK
KyAgICAgICAgICAgICJzb3VyY2UiOiBudWxsLAorICAgICAgICAgICAgInN0YXJ0IjogeworICAg
ICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAgICJjb2x1bW4iOiAwCisgICAgICAg
ICAgICB9LAorICAgICAgICAgICAgImVuZCI6IHsKKyAgICAgICAgICAgICAgImxpbmUiOiAzLAor
ICAgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisg
ICAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9kb212Yy90ZW1wbGF0ZXMvaW5kZXguaGJzIgorICAg
ICAgICB9LAorICAgICAgICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgICAgYXJpdHk6IDAsCisgICAg
ICAgIGNhY2hlZEZyYWdtZW50OiBudWxsLAorICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisg
ICAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAg
ICAgICAgdmFyIGVsMCA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgICAg
dmFyIGVsMSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiICAiKTsKKyAgICAgICAgICBkb20uYXBwZW5k
Q2hpbGQoZWwwLCBlbDEpOworICAgICAgICAgIHZhciBlbDEgPSBkb20uY3JlYXRlQ29tbWVudCgi
Iik7CisgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGls
ZChlbDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAg
YnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50
LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXko
MSk7CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDEs
IDEsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAg
ICB9LAorICAgICAgICBzdGF0ZW1lbnRzOiBbWyJpbmxpbmUiLCAidG9kby1saXN0IiwgW10sIFsi
dG9kb3MiLCBbInN1YmV4cHIiLCAiQG11dCIsIFtbImdldCIsICJtb2RlbCIsIFsibG9jIiwgW251
bGwsIFsyLCAyMF0sIFsyLCAyNV1dXV1dLCBbXSwgW11dXSwgWyJsb2MiLCBbbnVsbCwgWzIsIDJd
LCBbMiwgMjddXV1dXSwKKyAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgdGVtcGxhdGVzOiBb
XQorICAgICAgfTsKKyAgICB9KSgpOworICAgIHJldHVybiB7CisgICAgICBtZXRhOiB7CisgICAg
ICAgICJmcmFnbWVudFJlYXNvbiI6IHsKKyAgICAgICAgICAibmFtZSI6ICJtaXNzaW5nLXdyYXBw
ZXIiLAorICAgICAgICAgICJwcm9ibGVtcyI6IFsid3JvbmctdHlwZSJdCisgICAgICAgIH0sCisg
ICAgICAgICJyZXZpc2lvbiI6ICJFbWJlckAyLjYuMiIsCisgICAgICAgICJsb2MiOiB7CisgICAg
ICAgICAgInNvdXJjZSI6IG51bGwsCisgICAgICAgICAgInN0YXJ0IjogeworICAgICAgICAgICAg
ImxpbmUiOiAxLAorICAgICAgICAgICAgImNvbHVtbiI6IDAKKyAgICAgICAgICB9LAorICAgICAg
ICAgICJlbmQiOiB7CisgICAgICAgICAgICAibGluZSI6IDQsCisgICAgICAgICAgICAiY29sdW1u
IjogMAorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1vZHVsZU5hbWUiOiAidG9k
b212Yy90ZW1wbGF0ZXMvaW5kZXguaGJzIgorICAgICAgfSwKKyAgICAgIGlzRW1wdHk6IGZhbHNl
LAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhh
c1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJh
Z21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRlRG9jdW1lbnRGcmFnbWVu
dCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICBk
b20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwK
KyAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBm
cmFnbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBB
cnJheSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQs
IDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZy
YWdtZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCBudWxsKTsK
KyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJi
bG9jayIsICJpZiIsIFtbImdldCIsICJtb2RlbC5sZW5ndGgiLCBbImxvYyIsIFtudWxsLCBbMSwg
Nl0sIFsxLCAxOF1dXV1dLCBbXSwgMCwgbnVsbCwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBbMywg
N11dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW2NoaWxkMF0KKyAg
ICB9OworICB9KSgpKTsKK30pOworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCisKKworLyog
anNoaW50IGlnbm9yZTplbmQgKi8KKworLyoganNoaW50IGlnbm9yZTpzdGFydCAqLworCitkZWZp
bmUoJ3RvZG9tdmMvY29uZmlnL2Vudmlyb25tZW50JywgWydlbWJlciddLCBmdW5jdGlvbihFbWJl
cikgeworICB2YXIgcHJlZml4ID0gJ3RvZG9tdmMnOworLyoganNoaW50IGlnbm9yZTpzdGFydCAq
LworCit0cnkgeworICB2YXIgbWV0YU5hbWUgPSBwcmVmaXggKyAnL2NvbmZpZy9lbnZpcm9ubWVu
dCc7CisgIHZhciByYXdDb25maWcgPSBFbWJlclsnZGVmYXVsdCddLiQoJ21ldGFbbmFtZT0iJyAr
IG1ldGFOYW1lICsgJyJdJykuYXR0cignY29udGVudCcpOworICB2YXIgY29uZmlnID0gSlNPTi5w
YXJzZSh1bmVzY2FwZShyYXdDb25maWcpKTsKKworICByZXR1cm4geyAnZGVmYXVsdCc6IGNvbmZp
ZyB9OworfQorY2F0Y2goZXJyKSB7CisgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlYWQg
Y29uZmlnIGZyb20gbWV0YSB0YWcgd2l0aCBuYW1lICInICsgbWV0YU5hbWUgKyAnIi4nKTsKK30K
KworLyoganNoaW50IGlnbm9yZTplbmQgKi8KKworfSk7CisKKy8qIGpzaGludCBpZ25vcmU6ZW5k
ICovCisKKy8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi8KKworaWYgKCFydW5uaW5nVGVzdHMpIHsK
KyAgcmVxdWlyZSgidG9kb212Yy9hcHAiKVsiZGVmYXVsdCJdLmNyZWF0ZSh7Im5hbWUiOiJ0b2Rv
bXZjIiwidmVyc2lvbiI6IjAuMC4wKzVkYmM1ZmI5In0pOworfQorCisvKiBqc2hpbnQgaWdub3Jl
OmVuZCAqLworLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9kb212Yy5tYXAKZGlmZiAtLWdpdCBhL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci5jc3MgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Fzc2V0cy92ZW5kb3IuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVlNDY0NWRhZDI4MTI0MzVhM2IyYzQ0OTY0
NGE2OGViMTI2NzIwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fz
c2V0cy92ZW5kb3IuY3NzCkBAIC0wLDAgKzEsNTIxIEBACitociB7CisgICAgbWFyZ2luOiAyMHB4
IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2M1YzVjNTsK
KyAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNmN2Y3Zjc7Cit9CisKKy5sZWFybiBhIHsK
KyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAg
ICBjb2xvcjogI2I4M2Y0NTsKK30KKworLmxlYXJuIGE6aG92ZXIgeworICAgIHRleHQtZGVjb3Jh
dGlvbjogdW5kZXJsaW5lOworICAgIGNvbG9yOiAjNzg3ZTdlOworfQorCisubGVhcm4gaDMsCisu
bGVhcm4gaDQsCisubGVhcm4gaDUgeworICAgIG1hcmdpbjogMTBweCAwOworICAgIGZvbnQtd2Vp
Z2h0OiA1MDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgICBjb2xvcjogIzAwMDsKK30KKwor
LmxlYXJuIGgzIHsKKyAgICBmb250LXNpemU6IDI0cHg7Cit9CisKKy5sZWFybiBoNCB7CisgICAg
Zm9udC1zaXplOiAxOHB4OworfQorCisubGVhcm4gaDUgeworICAgIG1hcmdpbi1ib3R0b206IDA7
CisgICAgZm9udC1zaXplOiAxNHB4OworfQorCisubGVhcm4gdWwgeworICAgIHBhZGRpbmc6IDA7
CisgICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OworfQorCisubGVhcm4gbGkgeworICAgIGxpbmUt
aGVpZ2h0OiAyMHB4OworfQorCisubGVhcm4gcCB7CisgICAgZm9udC1zaXplOiAxNXB4OworICAg
IGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgbGluZS1oZWlnaHQ6IDEuMzsKKyAgICBtYXJnaW4tdG9w
OiAwOworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKyNpc3N1ZS1jb3VudCB7CisgICAgZGlz
cGxheTogbm9uZTsKK30KKworLnF1b3RlIHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgbWFyZ2lu
OiAyMHB4IDAgNjBweCAwOworfQorCisucXVvdGUgcCB7CisgICAgZm9udC1zdHlsZTogaXRhbGlj
OworfQorCisucXVvdGUgcDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfigJwnOworICAgIGZvbnQt
c2l6ZTogNTBweDsKKyAgICBvcGFjaXR5OiAuMTU7CisgICAgcG9zaXRpb246IGFic29sdXRlOwor
ICAgIHRvcDogLTIwcHg7CisgICAgbGVmdDogM3B4OworfQorCisucXVvdGUgcDphZnRlciB7Cisg
ICAgY29udGVudDogJ+KAnSc7CisgICAgZm9udC1zaXplOiA1MHB4OworICAgIG9wYWNpdHk6IC4x
NTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgYm90dG9tOiAtNDJweDsKKyAgICByaWdo
dDogM3B4OworfQorCisucXVvdGUgZm9vdGVyIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cisg
ICAgYm90dG9tOiAtNDBweDsKKyAgICByaWdodDogMDsKK30KKworLnF1b3RlIGZvb3RlciBpbWcg
eworICAgIGJvcmRlci1yYWRpdXM6IDNweDsKK30KKworLnF1b3RlIGZvb3RlciBhIHsKKyAgICBt
YXJnaW4tbGVmdDogNXB4OworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5zcGVl
Y2gtYnViYmxlIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgcGFkZGluZzogMTBweDsK
KyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIC4wNCk7CisgICAgYm9yZGVyLXJhZGl1czog
NXB4OworfQorCisuc3BlZWNoLWJ1YmJsZTphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAg
cG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMTAwJTsKKyAgICByaWdodDogMzBweDsKKyAg
ICBib3JkZXI6IDEzcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLXRvcC1jb2xvcjog
cmdiYSgwLCAwLCAwLCAuMDQpOworfQorCisubGVhcm4tYmFyID4gLmxlYXJuIHsKKyAgICBwb3Np
dGlvbjogYWJzb2x1dGU7CisgICAgd2lkdGg6IDI3MnB4OworICAgIHRvcDogOHB4OworICAgIGxl
ZnQ6IC0zMDBweDsKKyAgICBwYWRkaW5nOiAxMHB4OworICAgIGJvcmRlci1yYWRpdXM6IDVweDsK
KyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC42KTsKKyAgICB0cmFu
c2l0aW9uLXByb3BlcnR5OiBsZWZ0OworICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDUwMG1zOwor
fQorCitAbWVkaWEgKG1pbi13aWR0aDogODk5cHgpIHsKKyAgICAubGVhcm4tYmFyIHsKKyAgICAg
ICAgd2lkdGg6IGF1dG87CisgICAgICAgIHBhZGRpbmctbGVmdDogMzAwcHg7CisgICAgfQorCisg
ICAgLmxlYXJuLWJhciA+IC5sZWFybiB7CisgICAgICAgIGxlZnQ6IDhweDsKKyAgICB9Cit9CisK
K2h0bWwsCitib2R5IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworYnV0
dG9uIHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBib3JkZXI6IDA7Cisg
ICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgdmVydGljYWwt
YWxpZ246IGJhc2VsaW5lOworICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OworICAgIGZvbnQtd2Vp
Z2h0OiBpbmhlcml0OworICAgIGNvbG9yOiBpbmhlcml0OworICAgIC13ZWJraXQtYXBwZWFyYW5j
ZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworICAgIC13ZWJraXQtZm9udC1zbW9vdGhp
bmc6IGFudGlhbGlhc2VkOworICAgIC1tb3otZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwor
ICAgIGZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKK30KKworYm9keSB7CisgICAgZm9udDog
MTRweCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICAg
IGxpbmUtaGVpZ2h0OiAxLjRlbTsKKyAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OworICAgIGNvbG9y
OiAjNGQ0ZDRkOworICAgIG1pbi13aWR0aDogMjMwcHg7CisgICAgbWF4LXdpZHRoOiA1NTBweDsK
KyAgICBtYXJnaW46IDAgYXV0bzsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxp
YXNlZDsKKyAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICBmb250LXNt
b290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKK30KKworYnV0dG9u
LAoraW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CisgICAgb3V0bGluZTogbm9uZTsKK30KKworLmhp
ZGRlbiB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworI3RvZG9hcHAgeworICAgIGJhY2tncm91
bmQ6ICNmZmY7CisgICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKKyAgICBwb3NpdGlvbjogcmVs
YXRpdmU7CisgICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpLAor
ICAgICAgICAgICAgICAgIDAgMjVweCA1MHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpOworfQorCisj
dG9kb2FwcCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHls
ZTogaXRhbGljOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9
CisKKyN0b2RvYXBwIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBp
dGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKwor
I3RvZG9hcHAgaW5wdXQ6OmlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICBmb250LXN0eWxlOiBpdGFs
aWM7CisgICAgZm9udC13ZWlnaHQ6IDMwMDsKKyAgICBjb2xvcjogI2U2ZTZlNjsKK30KKworI3Rv
ZG9hcHAgaDEgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0xNTVweDsKKyAg
ICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDEwMHB4OworICAgIGZvbnQtd2VpZ2h0OiAx
MDA7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiByZ2JhKDE3NSwgNDcsIDQ3
LCAwLjE1KTsKKyAgICAtd2Via2l0LXRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7
CisgICAgLW1vei10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworICAgIHRleHQt
cmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Cit9CisKKyNuZXctdG9kbywKKy5lZGl0IHsK
KyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luOiAwOworICAgIHdpZHRoOiAxMDAl
OworICAgIGZvbnQtc2l6ZTogMjRweDsKKyAgICBmb250LWZhbWlseTogaW5oZXJpdDsKKyAgICBm
b250LXdlaWdodDogaW5oZXJpdDsKKyAgICBsaW5lLWhlaWdodDogMS40ZW07CisgICAgYm9yZGVy
OiAwOworICAgIG91dGxpbmU6IG5vbmU7CisgICAgY29sb3I6IGluaGVyaXQ7CisgICAgcGFkZGlu
ZzogNnB4OworICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CisgICAgYm94LXNoYWRvdzogaW5z
ZXQgMCAtMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTsKKyAgICBib3gtc2l6aW5nOiBib3Jk
ZXItYm94OworICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIC1t
b3otZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOworICAgIGZvbnQtc21vb3RoaW5nOiBhbnRp
YWxpYXNlZDsKK30KKworI25ldy10b2RvIHsKKyAgICBwYWRkaW5nOiAxNnB4IDE2cHggMTZweCA2
MHB4OworICAgIGJvcmRlcjogbm9uZTsKKyAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAu
MDAzKTsKKyAgICBib3gtc2hhZG93OiBpbnNldCAwIC0ycHggMXB4IHJnYmEoMCwwLDAsMC4wMyk7
Cit9CisKKyNtYWluIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgei1pbmRleDogMjsK
KyAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNjsKK30KKworbGFiZWxbZm9yPSd0b2dn
bGUtYWxsJ10geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2dnbGUtYWxsIHsKKyAgICBw
b3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAtNTVweDsKKyAgICBsZWZ0OiAtMTJweDsKKyAg
ICB3aWR0aDogNjBweDsKKyAgICBoZWlnaHQ6IDM0cHg7CisgICAgdGV4dC1hbGlnbjogY2VudGVy
OworICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworfQorCisjdG9nZ2xlLWFs
bDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICfina8nOworICAgIGZvbnQtc2l6ZTogMjJweDsKKyAg
ICBjb2xvcjogI2U2ZTZlNjsKKyAgICBwYWRkaW5nOiAxMHB4IDI3cHggMTBweCAyN3B4OworfQor
CisjdG9nZ2xlLWFsbDpjaGVja2VkOmJlZm9yZSB7CisgICAgY29sb3I6ICM3MzczNzM7Cit9CisK
KyN0b2RvLWxpc3QgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGxpc3Qt
c3R5bGU6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkgeworICAgIHBvc2l0aW9uOiByZWxhdGl2
ZTsKKyAgICBmb250LXNpemU6IDI0cHg7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNl
ZGVkZWQ7Cit9CisKKyN0b2RvLWxpc3QgbGk6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRv
bTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nIHsKKyAgICBib3JkZXItYm90dG9t
OiBub25lOworICAgIHBhZGRpbmc6IDA7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyAuZWRp
dCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgd2lkdGg6IDUwNnB4OworICAgIHBhZGRpbmc6
IDEzcHggMTdweCAxMnB4IDE3cHg7CisgICAgbWFyZ2luOiAwIDAgMCA0M3B4OworfQorCisjdG9k
by1saXN0IGxpLmVkaXRpbmcgLnZpZXcgeworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2Rv
LWxpc3QgbGkgLnRvZ2dsZSB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiA0
MHB4OworICAgIC8qIGF1dG8sIHNpbmNlIG5vbi1XZWJLaXQgYnJvd3NlcnMgZG9lc24ndCBzdXBw
b3J0IGlucHV0IHN0eWxpbmcgKi8KKyAgICBoZWlnaHQ6IGF1dG87CisgICAgcG9zaXRpb246IGFi
c29sdXRlOworICAgIHRvcDogMDsKKyAgICBib3R0b206IDA7CisgICAgbWFyZ2luOiBhdXRvIDA7
CisgICAgYm9yZGVyOiBub25lOyAvKiBNb2JpbGUgU2FmYXJpICovCisgICAgLXdlYmtpdC1hcHBl
YXJhbmNlOiBub25lOworICAgIGFwcGVhcmFuY2U6IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkg
LnRvZ2dsZTphZnRlciB7CisgICAgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRm
OCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQwIiBoZWln
aHQ9IjQwIiB2aWV3Qm94PSItMTAgLTE4IDEwMCAxMzUiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAi
IHI9IjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlZGVkZWQiIHN0cm9rZS13aWR0aD0iMyIvPjwv
c3ZnPicpOworfQorCisjdG9kby1saXN0IGxpIC50b2dnbGU6Y2hlY2tlZDphZnRlciB7CisgICAg
Y29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPSJodHRwOi8v
d3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSItMTAg
LTE4IDEwMCAxMzUiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIiBmaWxsPSJub25lIiBz
dHJva2U9IiNiZGRhZDUiIHN0cm9rZS13aWR0aD0iMyIvPjxwYXRoIGZpbGw9IiM1ZGMyYWYiIGQ9
Ik03MiAyNUw0MiA3MSAyNyA1NmwtNCA0IDIwIDIwIDM0LTUyeiIvPjwvc3ZnPicpOworfQorCisj
dG9kby1saXN0IGxpIGxhYmVsIHsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgIHdvcmQtYnJl
YWs6IGJyZWFrLXdvcmQ7CisgICAgcGFkZGluZzogMTVweCA2MHB4IDE1cHggMTVweDsKKyAgICBt
YXJnaW4tbGVmdDogNDVweDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBsaW5lLWhlaWdodDog
MS4yOworICAgIHRyYW5zaXRpb246IGNvbG9yIDAuNHM7Cit9CisKKyN0b2RvLWxpc3QgbGkuY29t
cGxldGVkIGxhYmVsIHsKKyAgICBjb2xvcjogI2Q5ZDlkOTsKKyAgICB0ZXh0LWRlY29yYXRpb246
IGxpbmUtdGhyb3VnaDsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveSB7CisgICAgZGlzcGxh
eTogbm9uZTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIHJpZ2h0
OiAxMHB4OworICAgIGJvdHRvbTogMDsKKyAgICB3aWR0aDogNDBweDsKKyAgICBoZWlnaHQ6IDQw
cHg7CisgICAgbWFyZ2luOiBhdXRvIDA7CisgICAgZm9udC1zaXplOiAzMHB4OworICAgIGNvbG9y
OiAjY2M5YTlhOworICAgIG1hcmdpbi1ib3R0b206IDExcHg7CisgICAgdHJhbnNpdGlvbjogY29s
b3IgMC4ycyBlYXNlLW91dDsKK30KKworI3RvZG8tbGlzdCBsaSAuZGVzdHJveTpob3ZlciB7Cisg
ICAgY29sb3I6ICNhZjViNWU7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXIgewor
ICAgIGNvbnRlbnQ6ICfDlyc7Cit9CisKKyN0b2RvLWxpc3QgbGk6aG92ZXIgLmRlc3Ryb3kgewor
ICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisjdG9kby1saXN0IGxpIC5lZGl0IHsKKyAgICBkaXNw
bGF5OiBub25lOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmc6bGFzdC1jaGlsZCB7CisgICAg
bWFyZ2luLWJvdHRvbTogLTFweDsKK30KKworI2Zvb3RlciB7CisgICAgY29sb3I6ICM3Nzc7Cisg
ICAgcGFkZGluZzogMTBweCAxNXB4OworICAgIGhlaWdodDogMjBweDsKKyAgICB0ZXh0LWFsaWdu
OiBjZW50ZXI7CisgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKKyNmb290
ZXI6YmVmb3JlIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cisg
ICAgcmlnaHQ6IDA7CisgICAgYm90dG9tOiAwOworICAgIGxlZnQ6IDA7CisgICAgaGVpZ2h0OiA1
MHB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJn
YmEoMCwgMCwgMCwgMC4yKSwKKyAgICAgICAgICAgICAgICAwIDhweCAwIC0zcHggI2Y2ZjZmNiwK
KyAgICAgICAgICAgICAgICAwIDlweCAxcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksCisgICAg
ICAgICAgICAgICAgMCAxNnB4IDAgLTZweCAjZjZmNmY2LAorICAgICAgICAgICAgICAgIDAgMTdw
eCAycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMik7Cit9CisKKyN0b2RvLWNvdW50IHsKKyAgICBm
bG9hdDogbGVmdDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjdG9kby1jb3VudCBzdHJv
bmcgeworICAgIGZvbnQtd2VpZ2h0OiAzMDA7Cit9CisKKyNmaWx0ZXJzIHsKKyAgICBtYXJnaW46
IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKKyAgICByaWdodDogMDsKKyAgICBsZWZ0OiAwOworfQorCisjZmlsdGVycyBs
aSB7CisgICAgZGlzcGxheTogaW5saW5lOworfQorCisjZmlsdGVycyBsaSBhIHsKKyAgICBjb2xv
cjogaW5oZXJpdDsKKyAgICBtYXJnaW46IDNweDsKKyAgICBwYWRkaW5nOiAzcHggN3B4OworICAg
IHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVu
dDsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7Cit9CisKKyNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQs
CisjZmlsdGVycyBsaSBhOmhvdmVyIHsKKyAgICBib3JkZXItY29sb3I6IHJnYmEoMTc1LCA0Nywg
NDcsIDAuMSk7Cit9CisKKyNmaWx0ZXJzIGxpIGEuc2VsZWN0ZWQgeworICAgIGJvcmRlci1jb2xv
cjogcmdiYSgxNzUsIDQ3LCA0NywgMC4yKTsKK30KKworI2NsZWFyLWNvbXBsZXRlZCwKK2h0bWwg
I2NsZWFyLWNvbXBsZXRlZDphY3RpdmUgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBwb3NpdGlv
bjogcmVsYXRpdmU7CisgICAgbGluZS1oZWlnaHQ6IDIwcHg7CisgICAgdGV4dC1kZWNvcmF0aW9u
OiBub25lOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9
CisKKyNjbGVhci1jb21wbGV0ZWQ6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJs
aW5lOworfQorCisjaW5mbyB7CisgICAgbWFyZ2luOiA2NXB4IGF1dG8gMDsKKyAgICBjb2xvcjog
I2JmYmZiZjsKKyAgICBmb250LXNpemU6IDEwcHg7CisgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAg
cmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKwor
I2luZm8gcCB7CisgICAgbGluZS1oZWlnaHQ6IDE7Cit9CisKKyNpbmZvIGEgeworICAgIGNvbG9y
OiBpbmhlcml0OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBmb250LXdlaWdodDog
NDAwOworfQorCisjaW5mbyBhOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGlu
ZTsKK30KKworLyoKKyAgICBIYWNrIHRvIHJlbW92ZSBiYWNrZ3JvdW5kIGZyb20gTW9iaWxlIFNh
ZmFyaS4KKyAgICBDYW4ndCB1c2UgaXQgZ2xvYmFsbHkgc2luY2UgaXQgZGVzdHJveXMgY2hlY2ti
b3hlcyBpbiBGaXJlZm94CisqLworQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmlj
ZS1waXhlbC1yYXRpbzowKSB7CisgICAgI3RvZ2dsZS1hbGwsCisgICAgI3RvZG8tbGlzdCBsaSAu
dG9nZ2xlIHsKKyAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICB9CisKKyAgICAjdG9kby1s
aXN0IGxpIC50b2dnbGUgeworICAgICAgICBoZWlnaHQ6IDQwcHg7CisgICAgfQorCisgICAgI3Rv
Z2dsZS1hbGwgeworICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAg
ICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOworICAgICAgICAtd2Via2l0LWFwcGVhcmFu
Y2U6IG5vbmU7CisgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CisgICAgfQorfQorCitAbWVkaWEg
KG1heC13aWR0aDogNDMwcHgpIHsKKyAgICAjZm9vdGVyIHsKKyAgICAgICAgaGVpZ2h0OiA1MHB4
OworICAgIH0KKworICAgICNmaWx0ZXJzIHsKKyAgICAgICAgYm90dG9tOiAxMHB4OworICAgIH0K
K30KKwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzIGIv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU0ZDcxMDE0
YTgxNzFlODllZTYwMDMwZjJjMTFhNjBiYTU2Nzc0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy92ZW5kb3IuanMKQEAgLTAsMCArMSw2NjEyMSBAQAorLyog
anNoaW50IGlnbm9yZTpzdGFydCAqLworCit3aW5kb3cuRW1iZXJFTlYgPSB7IkZFQVRVUkVTIjp7
fX07Cit2YXIgcnVubmluZ1Rlc3RzID0gZmFsc2U7CisKKworCisvKiBqc2hpbnQgaWdub3JlOmVu
ZCAqLworCis7dmFyIGxvYWRlciwgZGVmaW5lLCByZXF1aXJlTW9kdWxlLCByZXF1aXJlLCByZXF1
aXJlanM7CisKKyhmdW5jdGlvbiAoZ2xvYmFsKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIg
aGVpbWRhbGwgPSBnbG9iYWwuaGVpbWRhbGw7CisKKyAgZnVuY3Rpb24gZGljdCgpIHsKKyAgICB2
YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBvYmpbJ19fJ10gPSB1bmRlZmluZWQ7
CisgICAgZGVsZXRlIG9ialsnX18nXTsKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgLy8gU2F2
ZSBvZmYgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiB0aGVzZSBnbG9iYWxzLCBzbyB3ZSBjYW4gcmVz
dG9yZSB0aGVtIGlmIHNvbWVvbmUgYXNrcyB1cyB0bworICB2YXIgb2xkR2xvYmFscyA9IHsKKyAg
ICBsb2FkZXI6IGxvYWRlciwKKyAgICBkZWZpbmU6IGRlZmluZSwKKyAgICByZXF1aXJlTW9kdWxl
OiByZXF1aXJlTW9kdWxlLAorICAgIHJlcXVpcmU6IHJlcXVpcmUsCisgICAgcmVxdWlyZWpzOiBy
ZXF1aXJlanMKKyAgfTsKKworICByZXF1aXJlanMgPSByZXF1aXJlID0gcmVxdWlyZU1vZHVsZSA9
IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgdmFyIHBlbmRpbmcgPSBbXTsKKyAgICB2YXIgbW9kID0g
ZmluZE1vZHVsZShuYW1lLCAnKHJlcXVpcmUpJywgcGVuZGluZyk7CisKKyAgICBmb3IgKHZhciBp
ID0gcGVuZGluZy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgcGVuZGluZ1tpXS5l
eHBvcnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1vZC5tb2R1bGUuZXhwb3J0czsKKyAgfTsK
KworICBsb2FkZXIgPSB7CisgICAgbm9Db25mbGljdDogZnVuY3Rpb24gKGFsaWFzZXMpIHsKKyAg
ICAgIHZhciBvbGROYW1lLCBuZXdOYW1lOworCisgICAgICBmb3IgKG9sZE5hbWUgaW4gYWxpYXNl
cykgeworICAgICAgICBpZiAoYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShvbGROYW1lKSkgeworICAg
ICAgICAgIGlmIChvbGRHbG9iYWxzLmhhc093blByb3BlcnR5KG9sZE5hbWUpKSB7CisgICAgICAg
ICAgICBuZXdOYW1lID0gYWxpYXNlc1tvbGROYW1lXTsKKworICAgICAgICAgICAgZ2xvYmFsW25l
d05hbWVdID0gZ2xvYmFsW29sZE5hbWVdOworICAgICAgICAgICAgZ2xvYmFsW29sZE5hbWVdID0g
b2xkR2xvYmFsc1tvbGROYW1lXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9CisgIH07CisKKyAgdmFyIF9pc0FycmF5OworICBpZiAoIUFycmF5LmlzQXJyYXkpIHsKKyAg
ICBfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7CisgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlw
ZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nOworICAgIH07CisgIH0gZWxz
ZSB7CisgICAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5OworICB9CisKKyAgdmFyIHJlZ2lzdHJ5
ID0gZGljdCgpOworICB2YXIgc2VlbiA9IGRpY3QoKTsKKworICB2YXIgdXVpZCA9IDA7CisKKyAg
ZnVuY3Rpb24gdW5zdXBwb3J0ZWRNb2R1bGUobGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IEVycm9y
KCdhbiB1bnN1cHBvcnRlZCBtb2R1bGUgd2FzIGRlZmluZWQsIGV4cGVjdGVkIGBkZWZpbmUobmFt
ZSwgZGVwcywgbW9kdWxlKWAgaW5zdGVhZCBnb3Q6IGAnICsgbGVuZ3RoICsgJ2AgYXJndW1lbnRz
IHRvIGRlZmluZWAnKTsKKyAgfQorCisgIHZhciBkZWZhdWx0RGVwcyA9IFsncmVxdWlyZScsICdl
eHBvcnRzJywgJ21vZHVsZSddOworCisgIGZ1bmN0aW9uIE1vZHVsZShuYW1lLCBkZXBzLCBjYWxs
YmFjaywgYWxpYXMpIHsKKyAgICB0aGlzLmlkID0gdXVpZCsrOworICAgIHRoaXMubmFtZSA9IG5h
bWU7CisgICAgdGhpcy5kZXBzID0gIWRlcHMubGVuZ3RoICYmIGNhbGxiYWNrLmxlbmd0aCA/IGRl
ZmF1bHREZXBzIDogZGVwczsKKyAgICB0aGlzLm1vZHVsZSA9IHsgZXhwb3J0czoge30gfTsKKyAg
ICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgdGhpcy5oYXNFeHBvcnRzQXNEZXAgPSBm
YWxzZTsKKyAgICB0aGlzLmlzQWxpYXMgPSBhbGlhczsKKyAgICB0aGlzLnJlaWZpZWQgPSBuZXcg
QXJyYXkoZGVwcy5sZW5ndGgpOworCisgICAgLyoKKyAgICAgICBFYWNoIG1vZHVsZSBub3JtYWxs
eSBwYXNzZXMgdGhyb3VnaCB0aGVzZSBzdGF0ZXMsIGluIG9yZGVyOgorICAgICAgICAgbmV3ICAg
ICAgIDogaW5pdGlhbCBzdGF0ZQorICAgICAgICAgcGVuZGluZyAgIDogdGhpcyBtb2R1bGUgaXMg
c2NoZWR1bGVkIHRvIGJlIGV4ZWN1dGVkCisgICAgICAgICByZWlmeWluZyAgOiB0aGlzIG1vZHVs
ZSdzIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZXhlY3V0ZWQKKyAgICAgICAgIHJlaWZpZWQgICA6
IHRoaXMgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIGZpbmlzaGVkIGV4ZWN1dGluZyBzdWNjZXNzZnVs
bHkKKyAgICAgICAgIGVycm9yZWQgICA6IHRoaXMgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIGZhaWxl
ZCB0byBleGVjdXRlCisgICAgICAgICBmaW5hbGl6ZWQgOiB0aGlzIG1vZHVsZSBleGVjdXRlZCBz
dWNjZXNzZnVsbHkKKyAgICAgKi8KKyAgICB0aGlzLnN0YXRlID0gJ25ldyc7CisgIH0KKworICBN
b2R1bGUucHJvdG90eXBlLm1ha2VEZWZhdWx0RXhwb3J0ID0gZnVuY3Rpb24gKCkgeworICAgIHZh
ciBleHBvcnRzID0gdGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICBpZiAoZXhwb3J0cyAhPT0gbnVs
bCAmJiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBleHBvcnRzID09PSAn
ZnVuY3Rpb24nKSAmJiBleHBvcnRzWydkZWZhdWx0J10gPT09IHVuZGVmaW5lZCAmJiBPYmplY3Qu
aXNFeHRlbnNpYmxlKGV4cG9ydHMpKSB7CisgICAgICBleHBvcnRzWydkZWZhdWx0J10gPSBleHBv
cnRzOworICAgIH0KKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLmV4cG9ydHMgPSBmdW5jdGlv
biAoKSB7CisgICAgLy8gaWYgZmluYWxpemVkLCB0aGVyZSBpcyBubyB3b3JrIHRvIGRvLiBJZiBy
ZWlmeWluZywgdGhlcmUgaXMgYQorICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgc28gd2UgbXVz
dCByZXR1cm4gb3VyIChwYXJ0aWFsKSBleHBvcnRzLgorICAgIGlmICh0aGlzLnN0YXRlID09PSAn
ZmluYWxpemVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVpZnlpbmcnKSB7CisgICAgICByZXR1cm4g
dGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICB9CisKKyAgICBpZiAobG9hZGVyLndyYXBNb2R1bGVz
KSB7CisgICAgICB0aGlzLmNhbGxiYWNrID0gbG9hZGVyLndyYXBNb2R1bGVzKHRoaXMubmFtZSwg
dGhpcy5jYWxsYmFjayk7CisgICAgfQorCisgICAgdGhpcy5yZWlmeSgpOworCisgICAgdmFyIHJl
c3VsdCA9IHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcywgdGhpcy5yZWlmaWVkKTsKKyAgICB0aGlz
LnN0YXRlID0gJ2ZpbmFsaXplZCc7CisKKyAgICBpZiAoISh0aGlzLmhhc0V4cG9ydHNBc0RlcCAm
JiByZXN1bHQgPT09IHVuZGVmaW5lZCkpIHsKKyAgICAgIHRoaXMubW9kdWxlLmV4cG9ydHMgPSBy
ZXN1bHQ7CisgICAgfQorICAgIHRoaXMubWFrZURlZmF1bHRFeHBvcnQoKTsKKyAgICByZXR1cm4g
dGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLnVuc2VlID0g
ZnVuY3Rpb24gKCkgeworICAgIHRoaXMuc3RhdGUgPSAnbmV3JzsKKyAgICB0aGlzLm1vZHVsZSA9
IHsgZXhwb3J0czoge30gfTsKKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLnJlaWZ5ID0gZnVu
Y3Rpb24gKCkgeworICAgIGlmICh0aGlzLnN0YXRlID09PSAncmVpZmllZCcpIHsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgdGhpcy5zdGF0ZSA9ICdyZWlmeWluZyc7CisgICAgdHJ5IHsKKyAg
ICAgIHRoaXMucmVpZmllZCA9IHRoaXMuX3JlaWZ5KCk7CisgICAgICB0aGlzLnN0YXRlID0gJ3Jl
aWZpZWQnOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ3JlaWZ5
aW5nJykgeworICAgICAgICB0aGlzLnN0YXRlID0gJ2Vycm9yZWQnOworICAgICAgfQorICAgIH0K
KyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLl9yZWlmeSA9IGZ1bmN0aW9uICgpIHsKKyAgICB2
YXIgcmVpZmllZCA9IHRoaXMucmVpZmllZC5zbGljZSgpOworICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcmVpZmllZC5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIG1vZCA9IHJlaWZpZWRbaV07Cisg
ICAgICByZWlmaWVkW2ldID0gbW9kLmV4cG9ydHMgPyBtb2QuZXhwb3J0cyA6IG1vZC5tb2R1bGUu
ZXhwb3J0cygpOworICAgIH0KKyAgICByZXR1cm4gcmVpZmllZDsKKyAgfTsKKworICBNb2R1bGUu
cHJvdG90eXBlLmZpbmREZXBzID0gZnVuY3Rpb24gKHBlbmRpbmcpIHsKKyAgICBpZiAodGhpcy5z
dGF0ZSAhPT0gJ25ldycpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLnN0YXRl
ID0gJ3BlbmRpbmcnOworCisgICAgdmFyIGRlcHMgPSB0aGlzLmRlcHM7CisKKyAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBkZXAgPSBkZXBzW2ld
OworICAgICAgdmFyIGVudHJ5ID0gdGhpcy5yZWlmaWVkW2ldID0geyBleHBvcnRzOiB1bmRlZmlu
ZWQsIG1vZHVsZTogdW5kZWZpbmVkIH07CisgICAgICBpZiAoZGVwID09PSAnZXhwb3J0cycpIHsK
KyAgICAgICAgdGhpcy5oYXNFeHBvcnRzQXNEZXAgPSB0cnVlOworICAgICAgICBlbnRyeS5leHBv
cnRzID0gdGhpcy5tb2R1bGUuZXhwb3J0czsKKyAgICAgIH0gZWxzZSBpZiAoZGVwID09PSAncmVx
dWlyZScpIHsKKyAgICAgICAgZW50cnkuZXhwb3J0cyA9IHRoaXMubWFrZVJlcXVpcmUoKTsKKyAg
ICAgIH0gZWxzZSBpZiAoZGVwID09PSAnbW9kdWxlJykgeworICAgICAgICBlbnRyeS5leHBvcnRz
ID0gdGhpcy5tb2R1bGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS5tb2R1bGUgPSBm
aW5kTW9kdWxlKHJlc29sdmUoZGVwLCB0aGlzLm5hbWUpLCB0aGlzLm5hbWUsIHBlbmRpbmcpOwor
ICAgICAgfQorICAgIH0KKyAgfTsKKworICBNb2R1bGUucHJvdG90eXBlLm1ha2VSZXF1aXJlID0g
ZnVuY3Rpb24gKCkgeworICAgIHZhciBuYW1lID0gdGhpcy5uYW1lOworICAgIHZhciByID0gZnVu
Y3Rpb24gKGRlcCkgeworICAgICAgcmV0dXJuIHJlcXVpcmUocmVzb2x2ZShkZXAsIG5hbWUpKTsK
KyAgICB9OworICAgIHJbJ2RlZmF1bHQnXSA9IHI7CisgICAgci5oYXMgPSBmdW5jdGlvbiAoZGVw
KSB7CisgICAgICByZXR1cm4gaGFzKHJlc29sdmUoZGVwLCBuYW1lKSk7CisgICAgfTsKKyAgICBy
ZXR1cm4gcjsKKyAgfTsKKworICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJh
Y2spIHsKKyAgICB2YXIgbW9kdWxlID0gcmVnaXN0cnlbbmFtZV07CisKKyAgICAvLyBJZiBhIG1v
ZHVsZSBmb3IgdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhbmQgaXMgaW4gYW55
IHN0YXRlCisgICAgLy8gb3RoZXIgdGhhbiBgbmV3YCAobWVhbmluZyBpdCBoYXMgYmVlbiBvciBp
cyBjdXJyZW50bHkgYmVpbmcgcmVxdWlyZWQpLAorICAgIC8vIHRoZW4gd2UgcmV0dXJuIGVhcmx5
IHRvIGF2b2lkIHJlZGVmaW5pdGlvbi4KKyAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5zdGF0ZSAh
PT0gJ25ldycpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA8IDIpIHsKKyAgICAgIHVuc3VwcG9ydGVkTW9kdWxlKGFyZ3VtZW50cy5sZW5ndGgpOwor
ICAgIH0KKworICAgIGlmICghX2lzQXJyYXkoZGVwcykpIHsKKyAgICAgIGNhbGxiYWNrID0gZGVw
czsKKyAgICAgIGRlcHMgPSBbXTsKKyAgICB9CisKKyAgICBpZiAoY2FsbGJhY2sgaW5zdGFuY2Vv
ZiBBbGlhcykgeworICAgICAgcmVnaXN0cnlbbmFtZV0gPSBuZXcgTW9kdWxlKGNhbGxiYWNrLm5h
bWUsIGRlcHMsIGNhbGxiYWNrLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVnaXN0cnlb
bmFtZV0gPSBuZXcgTW9kdWxlKG5hbWUsIGRlcHMsIGNhbGxiYWNrLCBmYWxzZSk7CisgICAgfQor
ICB9OworCisgIC8vIHdlIGRvbid0IHN1cHBvcnQgYWxsIG9mIEFNRAorICAvLyBkZWZpbmUuYW1k
ID0ge307CisKKyAgZnVuY3Rpb24gQWxpYXMocGF0aCkgeworICAgIHRoaXMubmFtZSA9IHBhdGg7
CisgIH0KKworICBkZWZpbmUuYWxpYXMgPSBmdW5jdGlvbiAocGF0aCwgdGFyZ2V0KSB7CisgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKKyAgICAgIHJldHVybiBkZWZpbmUodGFyZ2V0
LCBuZXcgQWxpYXMocGF0aCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQWxpYXMocGF0aCk7
CisgIH07CisKKyAgZnVuY3Rpb24gbWlzc2luZ01vZHVsZShuYW1lLCByZWZlcnJlcikgeworICAg
IHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgbW9kdWxlIGAnICsgbmFtZSArICdgIGlt
cG9ydGVkIGZyb20gYCcgKyByZWZlcnJlciArICdgJyk7CisgIH0KKworICBmdW5jdGlvbiBmaW5k
TW9kdWxlKG5hbWUsIHJlZmVycmVyLCBwZW5kaW5nKSB7CisgICAgdmFyIG1vZCA9IHJlZ2lzdHJ5
W25hbWVdIHx8IHJlZ2lzdHJ5W25hbWUgKyAnL2luZGV4J107CisKKyAgICB3aGlsZSAobW9kICYm
IG1vZC5pc0FsaWFzKSB7CisgICAgICBtb2QgPSByZWdpc3RyeVttb2QubmFtZV07CisgICAgfQor
CisgICAgaWYgKCFtb2QpIHsKKyAgICAgIG1pc3NpbmdNb2R1bGUobmFtZSwgcmVmZXJyZXIpOwor
ICAgIH0KKworICAgIGlmIChwZW5kaW5nICYmIG1vZC5zdGF0ZSAhPT0gJ3BlbmRpbmcnICYmIG1v
ZC5zdGF0ZSAhPT0gJ2ZpbmFsaXplZCcpIHsKKyAgICAgIG1vZC5maW5kRGVwcyhwZW5kaW5nKTsK
KyAgICAgIHBlbmRpbmcucHVzaChtb2QpOworICAgIH0KKyAgICByZXR1cm4gbW9kOworICB9CisK
KyAgZnVuY3Rpb24gcmVzb2x2ZShjaGlsZCwgbmFtZSkgeworICAgIGlmIChjaGlsZC5jaGFyQXQo
MCkgIT09ICcuJykgeworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKworICAgIHZhciBwYXJ0
cyA9IGNoaWxkLnNwbGl0KCcvJyk7CisgICAgdmFyIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8n
KTsKKyAgICB2YXIgcGFyZW50QmFzZSA9IG5hbWVQYXJ0cy5zbGljZSgwLCAtMSk7CisKKyAgICBm
b3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFy
IHBhcnQgPSBwYXJ0c1tpXTsKKworICAgICAgaWYgKHBhcnQgPT09ICcuLicpIHsKKyAgICAgICAg
aWYgKHBhcmVudEJhc2UubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCdDYW5ub3QgYWNjZXNzIHBhcmVudCBtb2R1bGUgb2Ygcm9vdCcpOworICAgICAgICB9CisgICAg
ICAgIHBhcmVudEJhc2UucG9wKCk7CisgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuJykgewor
ICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmVudEJhc2UucHVz
aChwYXJ0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGFyZW50QmFzZS5qb2luKCcv
Jyk7CisgIH0KKworICBmdW5jdGlvbiBoYXMobmFtZSkgeworICAgIHJldHVybiAhIShyZWdpc3Ry
eVtuYW1lXSB8fCByZWdpc3RyeVtuYW1lICsgJy9pbmRleCddKTsKKyAgfQorCisgIHJlcXVpcmVq
cy5lbnRyaWVzID0gcmVxdWlyZWpzLl9lYWtfc2VlbiA9IHJlZ2lzdHJ5OworICByZXF1aXJlanMu
aGFzID0gaGFzOworICByZXF1aXJlanMudW5zZWUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewor
ICAgIGZpbmRNb2R1bGUobW9kdWxlTmFtZSwgJyh1bnNlZSknLCBmYWxzZSkudW5zZWUoKTsKKyAg
fTsKKworICByZXF1aXJlanMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgcmVxdWlyZWpzLmVu
dHJpZXMgPSByZXF1aXJlanMuX2Vha19zZWVuID0gcmVnaXN0cnkgPSBkaWN0KCk7CisgICAgc2Vl
biA9IGRpY3QoKTsKKyAgfTsKKworICAvLyBUaGlzIGNvZGUgcHJpbWVzIHRoZSBKUyBlbmdpbmUg
Zm9yIGdvb2QgcGVyZm9ybWFuY2UgYnkgd2FybWluZyB0aGUKKyAgLy8gSklUIGNvbXBpbGVyIGZv
ciB0aGVzZSBmdW5jdGlvbnMuCisgIGRlZmluZSgnZm9vJywgZnVuY3Rpb24gKCkge30pOworICBk
ZWZpbmUoJ2Zvby9iYXInLCBbXSwgZnVuY3Rpb24gKCkge30pOworICBkZWZpbmUoJ2Zvby9hc2Rm
JywgWydtb2R1bGUnLCAnZXhwb3J0cycsICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChtb2R1bGUsIGV4
cG9ydHMsIHJlcXVpcmUpIHsKKyAgICBpZiAocmVxdWlyZS5oYXMoJ2Zvby9iYXInKSkgeworICAg
ICAgcmVxdWlyZSgnZm9vL2JhcicpOworICAgIH0KKyAgfSk7CisgIGRlZmluZSgnZm9vL2Jheics
IFtdLCBkZWZpbmUuYWxpYXMoJ2ZvbycpKTsKKyAgZGVmaW5lKCdmb28vcXV6JywgZGVmaW5lLmFs
aWFzKCdmb28nKSk7CisgIGRlZmluZS5hbGlhcygnZm9vJywgJ2Zvby9xdXgnKTsKKyAgZGVmaW5l
KCdmb28vYmFyJywgWydmb28nLCAnLi9xdXonLCAnLi9iYXonLCAnLi9hc2RmJywgJy4vYmFyJywg
Jy4uL2ZvbyddLCBmdW5jdGlvbiAoKSB7fSk7CisgIGRlZmluZSgnZm9vL21haW4nLCBbJ2Zvby9i
YXInXSwgZnVuY3Rpb24gKCkge30pOworCisgIHJlcXVpcmUoJ2Zvby9tYWluJyk7CisgIHJlcXVp
cmUudW5zZWUoJ2Zvby9iYXInKTsKKworICByZXF1aXJlanMuY2xlYXIoKTsKKworICBpZiAodHlw
ZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYm
IG1vZHVsZS5leHBvcnRzKSB7CisgICAgbW9kdWxlLmV4cG9ydHMgPSB7IHJlcXVpcmU6IHJlcXVp
cmUsIGRlZmluZTogZGVmaW5lIH07CisgIH0KK30pKHRoaXMpOworOy8qIQorICogalF1ZXJ5IEph
dmFTY3JpcHQgTGlicmFyeSB2Mi4yLjQKKyAqIGh0dHA6Ly9qcXVlcnkuY29tLworICoKKyAqIElu
Y2x1ZGVzIFNpenpsZS5qcworICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmln
aHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycworICogUmVsZWFzZWQg
dW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCisgKgor
ICogRGF0ZTogMjAxNi0wNS0yMFQxNzoyM1oKKyAqLworCisoZnVuY3Rpb24oIGdsb2JhbCwgZmFj
dG9yeSApIHsKKworICAgIGlmICggdHlwZW9mIG1vZHVsZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9m
IG1vZHVsZS5leHBvcnRzID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgLy8gRm9yIENvbW1vbkpT
IGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YAor
ICAgICAgICAvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5
LgorICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93
YCB3aXRoIGEgYGRvY3VtZW50YAorICAgICAgICAvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3Nl
IGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy4KKyAgICAgICAgLy8gVGhpcyBhY2NlbnR1YXRl
cyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KKyAgICAgICAg
Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZSgianF1ZXJ5Iikod2luZG93KTsKKyAgICAgICAg
Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby4KKyAgICAgICAgbW9kdWxlLmV4cG9y
dHMgPSBnbG9iYWwuZG9jdW1lbnQgPworICAgICAgICAgICAgZmFjdG9yeSggZ2xvYmFsLCB0cnVl
ICkgOgorICAgICAgICAgICAgZnVuY3Rpb24oIHcgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAh
dy5kb2N1bWVudCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAialF1
ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIgKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoIHcgKTsKKyAgICAgICAgICAgIH07
CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmFjdG9yeSggZ2xvYmFsICk7CisgICAgfQorCisvLyBQ
YXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAorfSh0eXBlb2Ygd2luZG93ICE9
PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFs
ICkgeworCisvLyBTdXBwb3J0OiBGaXJlZm94IDE4KworLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1v
ZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZQorLy8gdGhlIHN0YWNrIHZp
YSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCisvLyB5b3UgdHJ5
IHRvIHRyYWNlIHRocm91Z2ggInVzZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KQorLy8i
dXNlIHN0cmljdCI7Cit2YXIgYXJyID0gW107CisKK3ZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1
bWVudDsKKwordmFyIHNsaWNlID0gYXJyLnNsaWNlOworCit2YXIgY29uY2F0ID0gYXJyLmNvbmNh
dDsKKwordmFyIHB1c2ggPSBhcnIucHVzaDsKKwordmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjsK
KwordmFyIGNsYXNzMnR5cGUgPSB7fTsKKwordmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0
cmluZzsKKwordmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7CisKK3ZhciBz
dXBwb3J0ID0ge307CisKKworCit2YXIKKyAgICB2ZXJzaW9uID0gIjIuMi40IiwKKworICAgIC8v
IERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CisgICAgalF1ZXJ5ID0gZnVuY3Rpb24oIHNl
bGVjdG9yLCBjb250ZXh0ICkgeworCisgICAgICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFj
dHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJworICAgICAgICAvLyBO
ZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJv
d24gaWYgbm90IGluY2x1ZGVkKQorICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBz
ZWxlY3RvciwgY29udGV4dCApOworICAgIH0sCisKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQu
MQorICAgIC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAorICAgIHJ0cmltID0gL15b
XHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAorCisgICAgLy8gTWF0Y2hlcyBkYXNo
ZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCisgICAgcm1zUHJlZml4ID0gL14tbXMtLywKKyAgICBy
ZGFzaEFscGhhID0gLy0oW1xkYS16XSkvZ2ksCisKKyAgICAvLyBVc2VkIGJ5IGpRdWVyeS5jYW1l
bENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCisgICAgZmNhbWVsQ2FzZSA9IGZ1bmN0aW9u
KCBhbGwsIGxldHRlciApIHsKKyAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOwor
ICAgIH07CisKK2pRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7CisKKyAgICAvLyBUaGUg
Y3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCisgICAganF1ZXJ5OiB2ZXJzaW9u
LAorCisgICAgY29uc3RydWN0b3I6IGpRdWVyeSwKKworICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1w
dHkgc2VsZWN0b3IKKyAgICBzZWxlY3RvcjogIiIsCisKKyAgICAvLyBUaGUgZGVmYXVsdCBsZW5n
dGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKKyAgICBsZW5ndGg6IDAsCisKKyAgICB0b0FycmF5
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTsKKyAgICB9
LAorCisgICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNl
dCBPUgorICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFu
IGFycmF5CisgICAgZ2V0OiBmdW5jdGlvbiggbnVtICkgeworICAgICAgICByZXR1cm4gbnVtICE9
IG51bGwgPworCisgICAgICAgICAgICAvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJv
bSB0aGUgc2V0CisgICAgICAgICAgICAoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0
aCBdIDogdGhpc1sgbnVtIF0gKSA6CisKKyAgICAgICAgICAgIC8vIFJldHVybiBhbGwgdGhlIGVs
ZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKKyAgICAgICAgICAgIHNsaWNlLmNhbGwoIHRoaXMgKTsK
KyAgICB9LAorCisgICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBv
bnRvIHRoZSBzdGFjaworICAgIC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQg
c2V0KQorICAgIHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgeworCisgICAgICAgIC8vIEJ1
aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CisgICAgICAgIHZhciByZXQgPSBq
UXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKKworICAgICAgICAvLyBB
ZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQorICAgICAg
ICByZXQucHJldk9iamVjdCA9IHRoaXM7CisgICAgICAgIHJldC5jb250ZXh0ID0gdGhpcy5jb250
ZXh0OworCisgICAgICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0Cisg
ICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBm
b3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisgICAgZWFjaDogZnVuY3Rpb24o
IGNhbGxiYWNrICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNr
ICk7CisgICAgfSwKKworICAgIG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgeworICAgICAgICBy
ZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsK
KyAgICAgICAgfSApICk7CisgICAgfSwKKworICAgIHNsaWNlOiBmdW5jdGlvbigpIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkg
KTsKKyAgICB9LAorCisgICAgZmlyc3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhp
cy5lcSggMCApOworICAgIH0sCisKKyAgICBsYXN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZXEoIC0xICk7CisgICAgfSwKKworICAgIGVxOiBmdW5jdGlvbiggaSApIHsKKyAg
ICAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAorICAgICAgICAgICAgaiA9ICtpICsgKCBpIDwg
MCA/IGxlbiA6IDAgKTsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYg
aiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOworICAgIH0sCisKKyAgICBlbmQ6IGZ1bmN0
aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0
b3IoKTsKKyAgICB9LAorCisgICAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgIC8vIEJl
aGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgor
ICAgIHB1c2g6IHB1c2gsCisgICAgc29ydDogYXJyLnNvcnQsCisgICAgc3BsaWNlOiBhcnIuc3Bs
aWNlCit9OworCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkg
eworICAgIHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwK
KyAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sCisgICAgICAgIGkgPSAxLAor
ICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgICAgICBkZWVwID0gZmFsc2U7
CisKKyAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCisgICAgaWYgKCB0eXBlb2Yg
dGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7CisgICAgICAgIGRlZXAgPSB0YXJnZXQ7CisKKyAgICAg
ICAgLy8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAorICAgICAgICB0YXJnZXQgPSBh
cmd1bWVudHNbIGkgXSB8fCB7fTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIC8vIEhhbmRs
ZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4g
ZGVlcCBjb3B5KQorICAgIGlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVy
eS5pc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHsKKyAgICAgICAgdGFyZ2V0ID0ge307CisgICAgfQor
CisgICAgLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFz
c2VkCisgICAgaWYgKCBpID09PSBsZW5ndGggKSB7CisgICAgICAgIHRhcmdldCA9IHRoaXM7Cisg
ICAgICAgIGktLTsKKyAgICB9CisKKyAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwor
ICAgICAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisgICAg
ICAgIGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgeworCisgICAg
ICAgICAgICAvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CisgICAgICAgICAgICBmb3IgKCBuYW1l
IGluIG9wdGlvbnMgKSB7CisgICAgICAgICAgICAgICAgc3JjID0gdGFyZ2V0WyBuYW1lIF07Cisg
ICAgICAgICAgICAgICAgY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKKworICAgICAgICAgICAgICAg
IC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKKyAgICAgICAgICAgICAgICBpZiAoIHRhcmdl
dCA9PT0gY29weSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBs
YWluIG9iamVjdHMgb3IgYXJyYXlzCisgICAgICAgICAgICAgICAgaWYgKCBkZWVwICYmIGNvcHkg
JiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8CisgICAgICAgICAgICAgICAgICAg
ICggY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheSggY29weSApICkgKSApIHsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIGNvcHlJc0FycmF5ICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgY29weUlzQXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0g
c3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdOworCisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBq
UXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0
cywgY2xvbmUgdGhlbQorICAgICAgICAgICAgICAgICAgICB0YXJnZXRbIG5hbWUgXSA9IGpRdWVy
eS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CisKKyAgICAgICAgICAgICAgICAvLyBEb24n
dCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgg
Y29weSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRbIG5hbWUg
XSA9IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKKyAgICByZXR1cm4gdGFy
Z2V0OworfTsKKworalF1ZXJ5LmV4dGVuZCggeworCisgICAgLy8gVW5pcXVlIGZvciBlYWNoIGNv
cHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCisgICAgZXhwYW5kbzogImpRdWVyeSIgKyAoIHZlcnNp
b24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCisKKyAgICAvLyBBc3N1
bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZQorICAgIGlzUmVhZHk6
IHRydWUsCisKKyAgICBlcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKKyAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCBtc2cgKTsKKyAgICB9LAorCisgICAgbm9vcDogZnVuY3Rpb24oKSB7fSwKKworICAg
IGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkudHlw
ZSggb2JqICkgPT09ICJmdW5jdGlvbiI7CisgICAgfSwKKworICAgIGlzQXJyYXk6IEFycmF5Lmlz
QXJyYXksCisKKyAgICBpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKKyAgICAgICAgcmV0dXJu
IG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdzsKKyAgICB9LAorCisgICAgaXNOdW1l
cmljOiBmdW5jdGlvbiggb2JqICkgeworCisgICAgICAgIC8vIHBhcnNlRmxvYXQgTmFOcyBudW1l
cmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8IiIpCisgICAgICAgIC8v
IC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJs
eSBoZXggbGl0ZXJhbHMgKCIweC4uLiIpCisgICAgICAgIC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBp
bmZpbml0aWVzIHRvIE5hTgorICAgICAgICAvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHBy
ZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMCkKKyAgICAgICAgdmFyIHJlYWxTdHJpbmdP
YmogPSBvYmogJiYgb2JqLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAhalF1ZXJ5LmlzQXJy
YXkoIG9iaiApICYmICggcmVhbFN0cmluZ09iaiAtIHBhcnNlRmxvYXQoIHJlYWxTdHJpbmdPYmog
KSArIDEgKSA+PSAwOworICAgIH0sCisKKyAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2Jq
ICkgeworICAgICAgICB2YXIga2V5OworCisgICAgICAgIC8vIE5vdCBwbGFpbiBvYmplY3RzOgor
ICAgICAgICAvLyAtIEFueSBvYmplY3Qgb3IgdmFsdWUgd2hvc2UgaW50ZXJuYWwgW1tDbGFzc11d
IHByb3BlcnR5IGlzIG5vdCAiW29iamVjdCBPYmplY3RdIgorICAgICAgICAvLyAtIERPTSBub2Rl
cworICAgICAgICAvLyAtIHdpbmRvdworICAgICAgICBpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAh
PT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3Qg
b3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CisgICAgICAgIGlmICggb2Jq
LmNvbnN0cnVjdG9yICYmCisgICAgICAgICAgICAgICAgIWhhc093bi5jYWxsKCBvYmosICJjb25z
dHJ1Y3RvciIgKSAmJgorICAgICAgICAgICAgICAgICFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVj
dG9yLnByb3RvdHlwZSB8fCB7fSwgImlzUHJvdG90eXBlT2YiICkgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBPd24gcHJvcGVydGllcyBhcmUg
ZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwKKyAgICAgICAgLy8gaWYgbGFzdCBv
bmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24KKyAgICAgICAgZm9yICgga2V5
IGluIG9iaiApIHt9CisKKyAgICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhhc093
bi5jYWxsKCBvYmosIGtleSApOworICAgIH0sCisKKyAgICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlv
biggb2JqICkgeworICAgICAgICB2YXIgbmFtZTsKKyAgICAgICAgZm9yICggbmFtZSBpbiBvYmog
KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CisgICAgICAgIGlm
ICggb2JqID09IG51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqICsgIiI7CisgICAgICAg
IH0KKworICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNo
IFJlZ0V4cCkKKyAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJvYmplY3QiIHx8IHR5cGVv
ZiBvYmogPT09ICJmdW5jdGlvbiIgPworICAgICAgICAgICAgY2xhc3MydHlwZVsgdG9TdHJpbmcu
Y2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CisgICAgICAgICAgICB0eXBlb2Ygb2JqOworICAg
IH0sCisKKyAgICAvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAorICAg
IGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkgeworICAgICAgICB2YXIgc2NyaXB0LAorICAg
ICAgICAgICAgaW5kaXJlY3QgPSBldmFsOworCisgICAgICAgIGNvZGUgPSBqUXVlcnkudHJpbSgg
Y29kZSApOworCisgICAgICAgIGlmICggY29kZSApIHsKKworICAgICAgICAgICAgLy8gSWYgdGhl
IGNvZGUgaW5jbHVkZXMgYSB2YWxpZCwgcHJvbG9ndWUgcG9zaXRpb24KKyAgICAgICAgICAgIC8v
IHN0cmljdCBtb2RlIHByYWdtYSwgZXhlY3V0ZSBjb2RlIGJ5IGluamVjdGluZyBhCisgICAgICAg
ICAgICAvLyBzY3JpcHQgdGFnIGludG8gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgaWYgKCBj
b2RlLmluZGV4T2YoICJ1c2Ugc3RyaWN0IiApID09PSAxICkgeworICAgICAgICAgICAgICAgIHNj
cmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CisgICAgICAgICAgICAg
ICAgc2NyaXB0LnRleHQgPSBjb2RlOworICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBw
ZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYXZvaWQg
dGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRpb24KKyAgICAgICAgICAgICAgICAvLyBhbmQg
cmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbAorCisgICAgICAgICAgICAg
ICAgaW5kaXJlY3QoIGNvZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisK
KyAgICAvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQg
ZGF0YSBtb2R1bGVzCisgICAgLy8gU3VwcG9ydDogSUU5LTExKworICAgIC8vIE1pY3Jvc29mdCBm
b3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MikKKyAgICBjYW1lbENhc2U6
IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CisgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1z
UHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKyAgICB9
LAorCisgICAgbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworICAgICAgICByZXR1
cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUu
dG9Mb3dlckNhc2UoKTsKKyAgICB9LAorCisgICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJh
Y2sgKSB7CisgICAgICAgIHZhciBsZW5ndGgsIGkgPSAwOworCisgICAgICAgIGlmICggaXNBcnJh
eUxpa2UoIG9iaiApICkgeworICAgICAgICAgICAgbGVuZ3RoID0gb2JqLmxlbmd0aDsKKyAgICAg
ICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmICgg
Y2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkgeworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKCBpIGluIG9iaiApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09
PSBmYWxzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9
LAorCisgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjEKKyAgICB0cmltOiBmdW5jdGlvbiggdGV4
dCApIHsKKyAgICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/CisgICAgICAgICAgICAiIiA6Cisg
ICAgICAgICAgICAoIHRleHQgKyAiIiApLnJlcGxhY2UoIHJ0cmltLCAiIiApOworICAgIH0sCisK
KyAgICAvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisgICAgbWFrZUFycmF5
OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgeworICAgICAgICB2YXIgcmV0ID0gcmVzdWx0cyB8
fCBbXTsKKworICAgICAgICBpZiAoIGFyciAhPSBudWxsICkgeworICAgICAgICAgICAgaWYgKCBp
c0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5t
ZXJnZSggcmV0LAorICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/
CisgICAgICAgICAgICAgICAgICAgIFsgYXJyIF0gOiBhcnIKKyAgICAgICAgICAgICAgICApOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXNoLmNhbGwoIHJldCwgYXJy
ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAg
IH0sCisKKyAgICBpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkgeworICAgICAgICBy
ZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cisg
ICAgfSwKKworICAgIG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKKyAgICAgICAg
dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLAorICAgICAgICAgICAgaiA9IDAsCisgICAgICAgICAg
ICBpID0gZmlyc3QubGVuZ3RoOworCisgICAgICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgewor
ICAgICAgICAgICAgZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07CisgICAgICAgIH0KKworICAg
ICAgICBmaXJzdC5sZW5ndGggPSBpOworCisgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICB9LAor
CisgICAgZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgeworICAgICAg
ICB2YXIgY2FsbGJhY2tJbnZlcnNlLAorICAgICAgICAgICAgbWF0Y2hlcyA9IFtdLAorICAgICAg
ICAgICAgaSA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBlbGVtcy5sZW5ndGgsCisgICAgICAg
ICAgICBjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7CisKKyAgICAgICAgLy8gR28gdGhyb3VnaCB0
aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworICAgICAgICAvLyB0aGF0IHBhc3MgdGhl
IHZhbGlkYXRvciBmdW5jdGlvbgorICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsK
KyAgICAgICAgICAgIGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSAp
OworICAgICAgICAgICAgaWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkg
eworICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfSwKKworICAg
IC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorICAgIG1hcDogZnVuY3Rpb24oIGVs
ZW1zLCBjYWxsYmFjaywgYXJnICkgeworICAgICAgICB2YXIgbGVuZ3RoLCB2YWx1ZSwKKyAgICAg
ICAgICAgIGkgPSAwLAorICAgICAgICAgICAgcmV0ID0gW107CisKKyAgICAgICAgLy8gR28gdGhy
b3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5l
dyB2YWx1ZXMKKyAgICAgICAgaWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHsKKyAgICAgICAg
ICAgIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0
aDsgaSsrICkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0s
IGksIGFyZyApOworCisgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgeworICAg
ICAgICAgICAgICAgICAgICByZXQucHVzaCggdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9i
amVjdCwKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoIGkgaW4gZWxlbXMgKSB7
CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7
CisKKyAgICAgICAgICAgICAgICBpZiAoIHZhbHVlICE9IG51bGwgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHJldC5wdXNoKCB2YWx1ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKKyAg
ICAgICAgcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOworICAgIH0sCisKKyAgICAvLyBB
IGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKKyAgICBndWlkOiAxLAorCisgICAgLy8g
QmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlp
bmcgYW55CisgICAgLy8gYXJndW1lbnRzLgorICAgIHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRl
eHQgKSB7CisgICAgICAgIHZhciB0bXAsIGFyZ3MsIHByb3h5OworCisgICAgICAgIGlmICggdHlw
ZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgdG1wID0gZm5bIGNvbnRl
eHQgXTsKKyAgICAgICAgICAgIGNvbnRleHQgPSBmbjsKKyAgICAgICAgICAgIGZuID0gdG1wOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdl
dCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKKyAgICAgICAgLy8gdGhpcyB0aHJvd3MgYSBUeXBl
RXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KKyAgICAgICAgaWYgKCAh
alF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVk
OworICAgICAgICB9CisKKyAgICAgICAgLy8gU2ltdWxhdGVkIGJpbmQKKyAgICAgICAgYXJncyA9
IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApOworICAgICAgICBwcm94eSA9IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29u
Y2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CisgICAgICAgIH07CisKKyAgICAgICAg
Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFs
IGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCisgICAgICAgIHByb3h5Lmd1aWQgPSBmbi5n
dWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOworCisgICAgICAgIHJldHVybiBwcm94eTsK
KyAgICB9LAorCisgICAgbm93OiBEYXRlLm5vdywKKworICAgIC8vIGpRdWVyeS5zdXBwb3J0IGlz
IG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpcgorICAgIC8v
IHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuCisgICAgc3VwcG9ydDogc3Vw
cG9ydAorfSApOworCisvLyBKU0hpbnQgd291bGQgZXJyb3Igb24gdGhpcyBjb2RlIGR1ZSB0byB0
aGUgU3ltYm9sIG5vdCBiZWluZyBkZWZpbmVkIGluIEVTNS4KKy8vIERlZmluaW5nIHRoaXMgZ2xv
YmFsIGluIC5qc2hpbnRyYyB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2Jh
bAorLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGp1c3Qg
ZGlzYWJsZSBKU0hpbnQgZm9yIHRoZXNlCisvLyB0aHJlZSBsaW5lcy4KKy8qIGpzaGludCBpZ25v
cmU6IHN0YXJ0ICovCitpZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CisgICAg
alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07Cit9
CisvKiBqc2hpbnQgaWdub3JlOiBlbmQgKi8KKworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUg
bWFwCitqUXVlcnkuZWFjaCggIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBE
YXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCggIiAiICksCitmdW5jdGlvbigg
aSwgbmFtZSApIHsKKyAgICBjbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0g
bmFtZS50b0xvd2VyQ2FzZSgpOworfSApOworCitmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkg
eworCisgICAgLy8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0
b3IpCisgICAgLy8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1
KQorICAgIC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwor
ICAgIC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUUKKyAgICB2YXIgbGVuZ3RoID0g
ISFvYmogJiYgImxlbmd0aCIgaW4gb2JqICYmIG9iai5sZW5ndGgsCisgICAgICAgIHR5cGUgPSBq
UXVlcnkudHlwZSggb2JqICk7CisKKyAgICBpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgalF1
ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0eXBlID09PSAiYXJyYXkiIHx8IGxlbmd0aCA9PT0gMCB8fAorICAgICAgICB0
eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSAp
IGluIG9iajsKK30KK3ZhciBTaXp6bGUgPQorLyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVu
Z2luZSB2Mi4yLjEKKyAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpR
dWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVy
IHRoZSBNSVQgbGljZW5zZQorICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERh
dGU6IDIwMTUtMTAtMTcKKyAqLworKGZ1bmN0aW9uKCB3aW5kb3cgKSB7CisKK3ZhciBpLAorICAg
IHN1cHBvcnQsCisgICAgRXhwciwKKyAgICBnZXRUZXh0LAorICAgIGlzWE1MLAorICAgIHRva2Vu
aXplLAorICAgIGNvbXBpbGUsCisgICAgc2VsZWN0LAorICAgIG91dGVybW9zdENvbnRleHQsCisg
ICAgc29ydElucHV0LAorICAgIGhhc0R1cGxpY2F0ZSwKKworICAgIC8vIExvY2FsIGRvY3VtZW50
IHZhcnMKKyAgICBzZXREb2N1bWVudCwKKyAgICBkb2N1bWVudCwKKyAgICBkb2NFbGVtLAorICAg
IGRvY3VtZW50SXNIVE1MLAorICAgIHJidWdneVFTQSwKKyAgICByYnVnZ3lNYXRjaGVzLAorICAg
IG1hdGNoZXMsCisgICAgY29udGFpbnMsCisKKyAgICAvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRh
CisgICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgMSAqIG5ldyBEYXRlKCksCisgICAgcHJlZmVycmVk
RG9jID0gd2luZG93LmRvY3VtZW50LAorICAgIGRpcnJ1bnMgPSAwLAorICAgIGRvbmUgPSAwLAor
ICAgIGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHRva2VuQ2FjaGUgPSBjcmVhdGVD
YWNoZSgpLAorICAgIGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAorICAgIHNvcnRPcmRl
ciA9IGZ1bmN0aW9uKCBhLCBiICkgeworICAgICAgICBpZiAoIGEgPT09IGIgKSB7CisgICAgICAg
ICAgICBoYXNEdXBsaWNhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0sCisKKyAgICAvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzCisgICAgTUFYX05FR0FU
SVZFID0gMSA8PCAzMSwKKworICAgIC8vIEluc3RhbmNlIG1ldGhvZHMKKyAgICBoYXNPd24gPSAo
e30pLmhhc093blByb3BlcnR5LAorICAgIGFyciA9IFtdLAorICAgIHBvcCA9IGFyci5wb3AsCisg
ICAgcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKKyAgICBwdXNoID0gYXJyLnB1c2gsCisgICAgc2xp
Y2UgPSBhcnIuc2xpY2UsCisgICAgLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0
J3MgZmFzdGVyIHRoYW4gbmF0aXZlCisgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRl
eG9mLXZzLWZvci81CisgICAgaW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkgeworICAg
ICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICBsZW4gPSBsaXN0Lmxlbmd0aDsKKyAgICAgICAg
Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICBpZiAoIGxpc3RbaV0gPT09IGVs
ZW0gKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0sCisKKyAgICBib29sZWFucyA9ICJjaGVja2Vk
fHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxl
ZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3Bl
ZCIsCisKKyAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zCisKKyAgICAvLyBodHRwOi8vd3d3Lncz
Lm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZQorICAgIHdoaXRlc3BhY2UgPSAiW1xc
eDIwXFx0XFxyXFxuXFxmXSIsCisKKyAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9z
eW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXIKKyAgICBpZGVudGlmaWVyID0gIig/Olxc
XFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwKKworICAgIC8vIEF0dHJpYnV0ZSBzZWxlY3Rv
cnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwor
ICAgIGF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgaWRlbnRpZmllciAr
ICIpKD86IiArIHdoaXRlc3BhY2UgKworICAgICAgICAvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQor
ICAgICAgICAiKihbKl4kfCF+XT89KSIgKyB3aGl0ZXNwYWNlICsKKyAgICAgICAgLy8gIkF0dHJp
YnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5n
cyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF0iCisgICAgICAgICIqKD86JygoPzpcXFxcLnxbXlxc
XFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikp
fCkiICsgd2hpdGVzcGFjZSArCisgICAgICAgICIqXFxdIiwKKworICAgIHBzZXVkb3MgPSAiOigi
ICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKworICAgICAgICAvLyBUbyByZWR1Y2UgdGhlIG51
bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVm
ZXIgYXJndW1lbnRzOgorICAgICAgICAvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0
IG9yIGNhcHR1cmUgNSkKKyAgICAgICAgIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpc
XFxcLnxbXlxcXFxcIl0pKilcIil8IiArCisgICAgICAgIC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2
KQorICAgICAgICAiKCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJpYnV0ZXMgKyAiKSop
fCIgKworICAgICAgICAvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCisgICAgICAgICIu
KiIgKworICAgICAgICAiKVxcKXwpIiwKKworICAgIC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVk
IHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJh
Y3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXIKKyAgICByd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAo
IHdoaXRlc3BhY2UgKyAiKyIsICJnIiApLAorICAgIHJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsg
d2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSAr
ICIrJCIsICJnIiApLAorCisgICAgcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFj
ZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCisgICAgcmNvbWJpbmF0b3JzID0gbmV3IFJl
Z0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsg
d2hpdGVzcGFjZSArICIqIiApLAorCisgICAgcmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAo
ICI9IiArIHdoaXRlc3BhY2UgKyAiKihbXlxcXSdcIl0qPykiICsgd2hpdGVzcGFjZSArICIqXFxd
IiwgImciICksCisKKyAgICBycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAorICAgIHJp
ZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisgICAg
bWF0Y2hFeHByID0geworICAgICAgICAiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGlkZW50aWZp
ZXIgKyAiKSIgKSwKKyAgICAgICAgIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50
aWZpZXIgKyAiKSIgKSwKKyAgICAgICAgIlRBRyI6IG5ldyBSZWdFeHAoICJeKCIgKyBpZGVudGlm
aWVyICsgInxbKl0pIiApLAorICAgICAgICAiQVRUUiI6IG5ldyBSZWdFeHAoICJeIiArIGF0dHJp
YnV0ZXMgKSwKKyAgICAgICAgIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwK
KyAgICAgICAgIkNISUxEIjogbmV3IFJlZ0V4cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRo
LWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsKKyAgICAgICAgICAg
ICIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIiArIHdoaXRlc3BhY2UgKyAiKig/OihbKy1d
fCkiICsgd2hpdGVzcGFjZSArCisgICAgICAgICAgICAiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNl
ICsgIipcXCl8KSIsICJpIiApLAorICAgICAgICAiYm9vbCI6IG5ldyBSZWdFeHAoICJeKD86IiAr
IGJvb2xlYW5zICsgIikkIiwgImkiICksCisgICAgICAgIC8vIEZvciB1c2UgaW4gbGlicmFyaWVz
IGltcGxlbWVudGluZyAuaXMoKQorICAgICAgICAvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNo
aW5nIGluIGBzZWxlY3RgCisgICAgICAgICJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIg
KyB3aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0
KSg/OlxcKCIgKworICAgICAgICAgICAgd2hpdGVzcGFjZSArICIqKCg/Oi1cXGQpP1xcZCopIiAr
IHdoaXRlc3BhY2UgKyAiKlxcKXwpKD89W14tXXwkKSIsICJpIiApCisgICAgfSwKKworICAgIHJp
bnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAorICAgIHJoZWFk
ZXIgPSAvXmhcZCQvaSwKKworICAgIHJuYXRpdmUgPSAvXltee10rXHtccypcW25hdGl2ZSBcdy8s
CisKKyAgICAvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFT
UyBzZWxlY3RvcnMKKyAgICBycXVpY2tFeHByID0gL14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3
LV0rKSkkLywKKworICAgIHJzaWJsaW5nID0gL1srfl0vLAorICAgIHJlc2NhcGUgPSAvJ3xcXC9n
LAorCisgICAgLy8gQ1NTIGVzY2FwZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0
YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVycworICAgIHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJc
XFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIp
fC4pIiwgImlnIiApLAorICAgIGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2Nh
cGVkV2hpdGVzcGFjZSApIHsKKyAgICAgICAgdmFyIGhpZ2ggPSAiMHgiICsgZXNjYXBlZCAtIDB4
MTAwMDA7CisgICAgICAgIC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CisgICAgICAgIC8vIFN1
cHBvcnQ6IEZpcmVmb3g8MjQKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJp
YyBpbnRlcnByZXRhdGlvbiBvZiArIjB4IgorICAgICAgICByZXR1cm4gaGlnaCAhPT0gaGlnaCB8
fCBlc2NhcGVkV2hpdGVzcGFjZSA/CisgICAgICAgICAgICBlc2NhcGVkIDoKKyAgICAgICAgICAg
IGhpZ2ggPCAwID8KKyAgICAgICAgICAgICAgICAvLyBCTVAgY29kZXBvaW50CisgICAgICAgICAg
ICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6CisgICAgICAgICAg
ICAgICAgLy8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpCisg
ICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwg
aGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7CisgICAgfSwKKworICAgIC8vIFVzZWQgZm9yIGlmcmFt
ZXMKKyAgICAvLyBTZWUgc2V0RG9jdW1lbnQoKQorICAgIC8vIFJlbW92aW5nIHRoZSBmdW5jdGlv
biB3cmFwcGVyIGNhdXNlcyBhICJQZXJtaXNzaW9uIERlbmllZCIKKyAgICAvLyBlcnJvciBpbiBJ
RQorICAgIHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgc2V0RG9jdW1lbnQo
KTsKKyAgICB9OworCisvLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKQor
dHJ5IHsKKyAgICBwdXNoLmFwcGx5KAorICAgICAgICAoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVy
cmVkRG9jLmNoaWxkTm9kZXMgKSksCisgICAgICAgIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzCisg
ICAgKTsKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMAorICAgIC8vIERldGVjdCBzaWxlbnRs
eSBmYWlsaW5nIHB1c2guYXBwbHkKKyAgICBhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxl
bmd0aCBdLm5vZGVUeXBlOworfSBjYXRjaCAoIGUgKSB7CisgICAgcHVzaCA9IHsgYXBwbHk6IGFy
ci5sZW5ndGggPworCisgICAgICAgIC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlCisgICAg
ICAgIGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKKyAgICAgICAgICAgIHB1c2hfbmF0aXZlLmFw
cGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoZWxzKSApOworICAgICAgICB9IDoKKworICAgICAgICAv
LyBTdXBwb3J0OiBJRTw5CisgICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHkKKyAg
ICAgICAgZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgeworICAgICAgICAgICAgdmFyIGogPSB0YXJn
ZXQubGVuZ3RoLAorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgLy8gQ2FuJ3Qg
dHJ1c3QgTm9kZUxpc3QubGVuZ3RoCisgICAgICAgICAgICB3aGlsZSAoICh0YXJnZXRbaisrXSA9
IGVsc1tpKytdKSApIHt9CisgICAgICAgICAgICB0YXJnZXQubGVuZ3RoID0gaiAtIDE7CisgICAg
ICAgIH0KKyAgICB9OworfQorCitmdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCBy
ZXN1bHRzLCBzZWVkICkgeworICAgIHZhciBtLCBpLCBlbGVtLCBuaWQsIG5pZHNlbGVjdCwgbWF0
Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsCisgICAgICAgIG5ld0NvbnRleHQgPSBjb250ZXh0ICYm
IGNvbnRleHQub3duZXJEb2N1bWVudCwKKworICAgICAgICAvLyBub2RlVHlwZSBkZWZhdWx0cyB0
byA5LCBzaW5jZSBjb250ZXh0IGRlZmF1bHRzIHRvIGRvY3VtZW50CisgICAgICAgIG5vZGVUeXBl
ID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5OworCisgICAgcmVzdWx0cyA9IHJlc3Vs
dHMgfHwgW107CisKKyAgICAvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQg
c2VsZWN0b3Igb3IgY29udGV4dAorICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5n
IiB8fCAhc2VsZWN0b3IgfHwKKyAgICAgICAgbm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09
IDkgJiYgbm9kZVR5cGUgIT09IDExICkgeworCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAg
IH0KKworICAgIC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQg
dG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHMKKyAgICBpZiAoICFzZWVkICkgeworCisgICAg
ICAgIGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBw
cmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgICAgICBzZXREb2N1bWVudCgg
Y29udGV4dCApOworICAgICAgICB9CisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3Vt
ZW50OworCisgICAgICAgIGlmICggZG9jdW1lbnRJc0hUTUwgKSB7CisKKyAgICAgICAgICAgIC8v
IElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSAiZ2V0
KkJ5KiIgRE9NIG1ldGhvZAorICAgICAgICAgICAgLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdt
ZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQorICAgICAgICAgICAg
aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3Rv
ciApKSApIHsKKworICAgICAgICAgICAgICAgIC8vIElEIHNlbGVjdG9yCisgICAgICAgICAgICAg
ICAgaWYgKCAobSA9IG1hdGNoWzFdKSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBEb2N1
bWVudCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gY29udGV4dC5nZXRFbGVtZW50
QnlJZCggbSApKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6
IElFLCBPcGVyYSwgV2Via2l0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzog
aWRlbnRpZnkgdmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVt
ZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtLmlkID09PSBtICkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGNvbnRleHQKKyAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUUs
IE9wZXJhLCBXZWJraXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGlkZW50aWZ5
IHZlcnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVtZW50QnlJZCBjYW4g
bWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlk
KCBtICkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMoIGNvbnRleHQs
IGVsZW0gKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaWQgPT09IG0gKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8g
VHlwZSBzZWxlY3RvcgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewor
ICAgICAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHRzOworCisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgc2VsZWN0b3IKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlD
bGFzc05hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lICkgeworCisgICAgICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsIGNv
bnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbAorICAgICAgICAg
ICAgaWYgKCBzdXBwb3J0LnFzYSAmJgorICAgICAgICAgICAgICAgICFjb21waWxlckNhY2hlWyBz
ZWxlY3RvciArICIgIiBdICYmCisgICAgICAgICAgICAgICAgKCFyYnVnZ3lRU0EgfHwgIXJidWdn
eVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHsKKworICAgICAgICAgICAgICAgIGlmICggbm9kZVR5
cGUgIT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQgPSBjb250ZXh0Owor
ICAgICAgICAgICAgICAgICAgICBuZXdTZWxlY3RvciA9IHNlbGVjdG9yOworCisgICAgICAgICAg
ICAgICAgLy8gcVNBIGxvb2tzIG91dHNpZGUgRWxlbWVudCBjb250ZXh0LCB3aGljaCBpcyBub3Qg
d2hhdCB3ZSB3YW50CisgICAgICAgICAgICAgICAgLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQg
Zm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0
OiBJRSA8PTgKKyAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50cworICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAh
PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgY29u
dGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgIlxcJCYiICk7Cisg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250
ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgKG5pZCA9IGV4cGFuZG8pICk7CisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3Ig
aW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVj
dG9yICk7CisgICAgICAgICAgICAgICAgICAgIGkgPSBncm91cHMubGVuZ3RoOworICAgICAgICAg
ICAgICAgICAgICBuaWRzZWxlY3QgPSByaWRlbnRpZmllci50ZXN0KCBuaWQgKSA/ICIjIiArIG5p
ZCA6ICJbaWQ9JyIgKyBuaWQgKyAiJ10iOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGkt
LSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tpXSA9IG5pZHNlbGVjdCArICIg
IiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oICIsIiApOworCisgICAg
ICAgICAgICAgICAgICAgIC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9ycwor
ICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3Ig
KSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRleHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
aWYgKCBuZXdTZWxlY3RvciApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCisgICAg
ICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBxc2FFcnJvciApIHsKKyAgICAg
ICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgg
bmlkID09PSBleHBhbmRvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQu
cmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGwgb3RoZXJzCisgICAgcmV0dXJuIHNlbGVjdCggc2Vs
ZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwor
fQorCisvKioKKyAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQorICog
QHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRh
dGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aAorICogIHByb3BlcnR5IG5hbWUgdGhl
IChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFu
IEV4cHIuY2FjaGVMZW5ndGgpCisgKiAgZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQorICovCitm
dW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKKyAgICB2YXIga2V5cyA9IFtdOworCisgICAgZnVuY3Rp
b24gY2FjaGUoIGtleSwgdmFsdWUgKSB7CisgICAgICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBh
dm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1
ZSAjMTU3KQorICAgICAgICBpZiAoIGtleXMucHVzaCgga2V5ICsgIiAiICkgPiBFeHByLmNhY2hl
TGVuZ3RoICkgeworICAgICAgICAgICAgLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRy
aWVzCisgICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOworICAgICAgICB9
CisgICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFsdWUpOworICAgIH0KKyAg
ICByZXR1cm4gY2FjaGU7Cit9CisKKy8qKgorICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFs
IHVzZSBieSBTaXp6bGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBt
YXJrCisgKi8KK2Z1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7CisgICAgZm5bIGV4cGFuZG8g
XSA9IHRydWU7CisgICAgcmV0dXJuIGZuOworfQorCisvKioKKyAqIFN1cHBvcnQgdGVzdGluZyB1
c2luZyBhbiBlbGVtZW50CisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0
ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHQKKyAqLworZnVuY3Rpb24gYXNzZXJ0
KCBmbiApIHsKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisK
KyAgICB0cnkgeworICAgICAgICByZXR1cm4gISFmbiggZGl2ICk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgLy8gUmVt
b3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CisgICAgICAgIGlmICggZGl2LnBhcmVudE5v
ZGUgKSB7CisgICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKyAgICAgICAgZGl2ID0g
bnVsbDsKKyAgICB9Cit9CisKKy8qKgorICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwg
b2YgdGhlIHNwZWNpZmllZCBhdHRycworICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2Vw
YXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcworICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBU
aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCisgKi8KK2Z1bmN0aW9uIGFkZEhhbmRsZSgg
YXR0cnMsIGhhbmRsZXIgKSB7CisgICAgdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCisgICAg
ICAgIGkgPSBhcnIubGVuZ3RoOworCisgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgICAgIEV4cHIu
YXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyOworICAgIH0KK30KKworLyoqCisgKiBDaGVj
a3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzCisgKiBAcGFyYW0ge0VsZW1lbnR9IGEK
KyAqIEBwYXJhbSB7RWxlbWVudH0gYgorICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNz
IHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiCisg
Ki8KK2Z1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKKyAgICB2YXIgY3VyID0gYiAmJiBh
LAorICAgICAgICBkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9
PT0gMSAmJgorICAgICAgICAgICAgKCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKSAt
CisgICAgICAgICAgICAoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOworCisgICAg
Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCisgICAgaWYg
KCBkaWZmICkgeworICAgICAgICByZXR1cm4gZGlmZjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBp
ZiBiIGZvbGxvd3MgYQorICAgIGlmICggY3VyICkgeworICAgICAgICB3aGlsZSAoIChjdXIgPSBj
dXIubmV4dFNpYmxpbmcpICkgeworICAgICAgICAgICAgaWYgKCBjdXIgPT09IGIgKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIGEgPyAxIDogLTE7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9u
IHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcworICogQHBhcmFtIHtTdHJpbmd9IHR5
cGUKKyAqLworZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CisgICAgcmV0dXJu
IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBl
ID09PSB0eXBlOworICAgIH07Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVz
ZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zCisgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQorICovCitm
dW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICB2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2Uo
KTsKKyAgICAgICAgcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24i
KSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisgICAgfTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEg
ZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCisgKiBAcGFyYW0ge0Z1
bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsK
KyAgICByZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsKKyAgICAgICAg
YXJndW1lbnQgPSArYXJndW1lbnQ7CisgICAgICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rp
b24oIHNlZWQsIG1hdGNoZXMgKSB7CisgICAgICAgICAgICB2YXIgaiwKKyAgICAgICAgICAgICAg
ICBtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAorICAgICAg
ICAgICAgICAgIGkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOworCisgICAgICAgICAgICAvLyBNYXRj
aCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKKyAgICAgICAgICAgIHdo
aWxlICggaS0tICkgeworICAgICAgICAgICAgICAgIGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4
ZXNbaV0pIF0gKSB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRbal0gPSAhKG1hdGNoZXNbal0g
PSBzZWVkW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0p
OworICAgIH0pOworfQorCisvKioKKyAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEg
U2l6emxlIGNvbnRleHQKKyAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0CisgKiBA
cmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0
YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKKyAqLworZnVuY3Rpb24gdGVzdENvbnRleHQo
IGNvbnRleHQgKSB7CisgICAgcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxl
bWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cit9CisKKy8vIEV4cG9z
ZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCitzdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQg
PSB7fTsKKworLyoqCisgKiBEZXRlY3RzIFhNTCBub2RlcworICogQHBhcmFtIHtFbGVtZW50fE9i
amVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnQKKyAqIEByZXR1cm5zIHtCb29sZWFu
fSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKKyAqLworaXNYTUwgPSBTaXp6
bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAvLyBkb2N1bWVudEVsZW1lbnQgaXMg
dmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CisgICAgLy8gKHN1
Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpCisgICAgdmFyIGRvY3VtZW50RWxl
bWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1l
bnQ7CisgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFt
ZSAhPT0gIkhUTUwiIDogZmFsc2U7Cit9OworCisvKioKKyAqIFNldHMgZG9jdW1lbnQtcmVsYXRl
ZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudAorICogQHBhcmFt
IHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8g
dXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKKyAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl
IGN1cnJlbnQgZG9jdW1lbnQKKyAqLworc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQg
PSBmdW5jdGlvbiggbm9kZSApIHsKKyAgICB2YXIgaGFzQ29tcGFyZSwgcGFyZW50LAorICAgICAg
ICBkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7
CisKKyAgICAvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxl
Y3RlZAorICAgIGlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwg
IWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7CisgICAgICAgIHJldHVybiBkb2N1bWVudDsKKyAgICB9
CisKKyAgICAvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlcworICAgIGRvY3VtZW50ID0gZG9jOwor
ICAgIGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisgICAgZG9jdW1lbnRJc0hU
TUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7CisKKyAgICAvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdl
CisgICAgLy8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyAi
cGVybWlzc2lvbiBkZW5pZWQiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNikKKyAgICBpZiAoIChwYXJl
bnQgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgJiYgcGFyZW50LnRvcCAhPT0gcGFyZW50ICkgewor
ICAgICAgICAvLyBTdXBwb3J0OiBJRSAxMQorICAgICAgICBpZiAoIHBhcmVudC5hZGRFdmVudExp
c3RlbmVyICkgeworICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoICJ1bmxvYWQi
LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSApOworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAx
MCBvbmx5CisgICAgICAgIH0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHsKKyAgICAg
ICAgICAgIHBhcmVudC5hdHRhY2hFdmVudCggIm9udW5sb2FkIiwgdW5sb2FkSGFuZGxlciApOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLyogQXR0cmlidXRlcworICAgIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8KKworICAgIC8vIFN1cHBvcnQ6IElFPDgKKyAgICAvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1
dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXMKKyAgICAvLyAo
ZXhjZXB0aW5nIElFOCBib29sZWFucykKKyAgICBzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQo
ZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICJpIjsKKyAgICAgICAg
cmV0dXJuICFkaXYuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKTsKKyAgICB9KTsKKworICAgIC8q
IGdldEVsZW1lbnQocylCeSoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvLyBDaGVjayBp
ZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cworICAgIHN1
cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAg
ICAgICAgZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOworICAg
ICAgICByZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsKKyAgICB9
KTsKKworICAgIC8vIFN1cHBvcnQ6IElFPDkKKyAgICBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsK
KworICAgIC8vIFN1cHBvcnQ6IElFPDEwCisgICAgLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQg
cmV0dXJucyBlbGVtZW50cyBieSBuYW1lCisgICAgLy8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJ
ZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcywKKyAgICAv
LyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3QKKyAgICBzdXBwb3J0
LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKyAgICAgICAgZG9jRWxlbS5hcHBl
bmRDaGlsZCggZGl2ICkuaWQgPSBleHBhbmRvOworICAgICAgICByZXR1cm4gIWRvY3VtZW50Lmdl
dEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyAp
Lmxlbmd0aDsKKyAgICB9KTsKKworICAgIC8vIElEIGZpbmQgYW5kIGZpbHRlcgorICAgIGlmICgg
c3VwcG9ydC5nZXRCeUlkICkgeworICAgICAgICBFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbigg
aWQsIGNvbnRleHQgKSB7CisgICAgICAgICAgICBpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1l
bnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKKyAgICAgICAgICAg
ICAgICB2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIG0gPyBbIG0gXSA6IFtdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAg
ICAgICBFeHByLmZpbHRlclsiSUQiXSA9IGZ1bmN0aW9uKCBpZCApIHsKKyAgICAgICAgICAgIHZh
ciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworICAgICAgICAg
ICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbGVt
LmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOworICAgICAgICAgICAgfTsKKyAgICAgICAg
fTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTdXBwb3J0OiBJRTYvNworICAgICAgICAvLyBn
ZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CisgICAgICAg
IGRlbGV0ZSBFeHByLmZpbmRbIklEIl07CisKKyAgICAgICAgRXhwci5maWx0ZXJbIklEIl0gPSAg
ZnVuY3Rpb24oIGlkICkgeworICAgICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1
bmVzY2FwZSwgZnVuZXNjYXBlICk7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVO
b2RlICE9PSAidW5kZWZpbmVkIiAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJp
YnV0ZU5vZGUoImlkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1
ZSA9PT0gYXR0cklkOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAv
LyBUYWcKKyAgICBFeHByLmZpbmRbIlRBRyJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSA/CisgICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CisgICAgICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFn
ICk7CisKKyAgICAgICAgICAgIC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBn
RUJUTgorICAgICAgICAgICAgfSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0gOgorCisgICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7Cisg
ICAgICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgICAgICB0bXAgPSBbXSwKKyAgICAgICAg
ICAgICAgICBpID0gMCwKKyAgICAgICAgICAgICAgICAvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwg
YSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vCisg
ICAgICAgICAgICAgICAgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRh
ZyApOworCisgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCisgICAg
ICAgICAgICBpZiAoIHRhZyA9PT0gIioiICkgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGVs
ZW0gPSByZXN1bHRzW2krK10pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAucHVzaCggZWxlbSAp
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgcmV0dXJuIHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1
bHRzOworICAgICAgICB9OworCisgICAgLy8gQ2xhc3MKKyAgICBFeHByLmZpbmRbIkNMQVNTIl0g
PSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwg
Y29udGV4dCApIHsKKyAgICAgICAgaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKKyAgICAgICAgICAg
IHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOworICAg
ICAgICB9CisgICAgfTsKKworICAgIC8qIFFTQS9tYXRjaGVzU2VsZWN0b3IKKyAgICAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCisKKyAgICAvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0CisKKyAg
ICAvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElF
OS9PcGVyYSAxMS41KQorICAgIHJidWdneU1hdGNoZXMgPSBbXTsKKworICAgIC8vIHFTYSg6Zm9j
dXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCisgICAgLy8gV2UgYWxsb3cg
dGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yCisgICAg
Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlm
cmFtZQorICAgIC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwg
dGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCisgICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpx
dWVyeS5jb20vdGlja2V0LzEzMzc4CisgICAgcmJ1Z2d5UVNBID0gW107CisKKyAgICBpZiAoIChz
dXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSAp
IHsKKyAgICAgICAgLy8gQnVpbGQgUVNBIHJlZ2V4CisgICAgICAgIC8vIFJlZ2V4IHN0cmF0ZWd5
IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmkKKyAgICAgICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYg
KSB7CisgICAgICAgICAgICAvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJw
b3NlCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90
IGV4cGxpY2l0bHkKKyAgICAgICAgICAgIC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0
cmlidXRlLAorICAgICAgICAgICAgLy8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91
Z2gKKyAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5Cisg
ICAgICAgICAgICBkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pbm5lckhUTUwgPSAiPGEgaWQ9
JyIgKyBleHBhbmRvICsgIic+PC9hPiIgKworICAgICAgICAgICAgICAgICI8c2VsZWN0IGlkPSci
ICsgZXhwYW5kbyArICItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+IiArCisgICAgICAgICAgICAg
ICAgIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKKworICAgICAgICAg
ICAgLy8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNgorICAgICAgICAgICAgLy8gTm90aGlu
ZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBv
ciAqPQorICAgICAgICAgICAgLy8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBp
biBPcGVyYSBidXQgInNhZmUiIGZvciBXaW5SVAorICAgICAgICAgICAgLy8gaHR0cDovL21zZG4u
bWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3Nl
Y3Rpb24KKyAgICAgICAgICAgIGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2Fw
dHVyZV49JyddIikubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAi
WypeJF09IiArIHdoaXRlc3BhY2UgKyAiKig/OicnfFwiXCIpIiApOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgKKyAgICAgICAgICAgIC8vIEJvb2xlYW4gYXR0
cmlidXRlcyBhbmQgInZhbHVlIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5CisgICAgICAgICAg
ICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKKyAg
ICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2
YWx1ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjAr
LCBQaGFudG9tSlM8MS45LjgrCisgICAgICAgICAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFs
bCggIltpZH49IiArIGV4cGFuZG8gKyAiLV0iICkubGVuZ3RoICkgeworICAgICAgICAgICAgICAg
IHJidWdneVFTQS5wdXNoKCJ+PSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBX
ZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVt
ZW50cworICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1z
ZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKyAgICAgICAgICAgIC8vIElFOCB0aHJvd3MgZXJy
b3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgICAgICAgICBpZiAoICFk
aXYucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CisgICAgICAgICAgICAg
ICAgcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrCisgICAgICAgICAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxCisgICAgICAgICAgICAvLyBJ
bi1wYWdlIGBzZWxlY3RvciNpZCBzaWJpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHMKKyAg
ICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCAiYSMiICsgZXhwYW5kbyArICIr
KiIgKS5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goIi4jLitbK35d
Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydChmdW5jdGlv
biggZGl2ICkgeworICAgICAgICAgICAgLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBz
CisgICAgICAgICAgICAvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmlj
dGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnQKKyAgICAgICAgICAgIHZhciBpbnB1dCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisgICAgICAgICAgICBpbnB1dC5zZXRB
dHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKKyAgICAgICAgICAgIGRpdi5hcHBlbmRDaGls
ZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgIkQiICk7CisKKyAgICAgICAgICAgIC8v
IFN1cHBvcnQ6IElFOAorICAgICAgICAgICAgLy8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9m
IG5hbWUgYXR0cmlidXRlCisgICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJb
bmFtZT1kXSIpLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIm5h
bWUiICsgd2hpdGVzcGFjZSArICIqWypeJHwhfl0/PSIgKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVu
dHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZCkKKyAgICAgICAgICAgIC8vIElF
OCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisgICAgICAg
ICAgICBpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggKSB7Cisg
ICAgICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRo
cm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisgICAgICAgICAgICBkaXYucXVlcnlT
ZWxlY3RvckFsbCgiKiw6eCIpOworICAgICAgICAgICAgcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsK
KyAgICAgICAgfSk7CisgICAgfQorCisgICAgaWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3Ig
PSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8CisgICAgICAgIGRv
Y0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8CisgICAgICAgIGRvY0VsZW0ubW96TWF0Y2hl
c1NlbGVjdG9yIHx8CisgICAgICAgIGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fAorICAgICAg
ICBkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHsKKworICAgICAgICBhc3NlcnQoZnVu
Y3Rpb24oIGRpdiApIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3Np
YmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgorICAgICAgICAgICAgLy8gb24gYSBkaXNjb25uZWN0
ZWQgbm9kZSAoSUUgOSkKKyAgICAgICAgICAgIHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBt
YXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKKworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQg
ZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gR2Vja28gZG9lcyBub3QgZXJy
b3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZAorICAgICAgICAgICAgbWF0Y2hlcy5jYWxsKCBkaXYs
ICJbcyE9JyddOngiICk7CisgICAgICAgICAgICByYnVnZ3lNYXRjaGVzLnB1c2goICIhPSIsIHBz
ZXVkb3MgKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNB
Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CisgICAgcmJ1Z2d5
TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNo
ZXMuam9pbigifCIpICk7CisKKyAgICAvKiBDb250YWlucworICAgIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
KyAgICBoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uICk7CisKKyAgICAvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXIKKyAgICAvLyBQdXJw
b3NlZnVsbHkgc2VsZi1leGNsdXNpdmUKKyAgICAvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5v
dCBjb250YWluIGl0c2VsZgorICAgIGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRl
c3QoIGRvY0VsZW0uY29udGFpbnMgKSA/CisgICAgICAgIGZ1bmN0aW9uKCBhLCBiICkgeworICAg
ICAgICAgICAgdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50
IDogYSwKKyAgICAgICAgICAgICAgICBidXAgPSBiICYmIGIucGFyZW50Tm9kZTsKKyAgICAgICAg
ICAgIHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYg
KAorICAgICAgICAgICAgICAgIGFkb3duLmNvbnRhaW5zID8KKyAgICAgICAgICAgICAgICAgICAg
YWRvd24uY29udGFpbnMoIGJ1cCApIDoKKyAgICAgICAgICAgICAgICAgICAgYS5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2Cisg
ICAgICAgICAgICApKTsKKyAgICAgICAgfSA6CisgICAgICAgIGZ1bmN0aW9uKCBhLCBiICkgewor
ICAgICAgICAgICAgaWYgKCBiICkgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGIgPSBiLnBh
cmVudE5vZGUpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGIgPT09IGEgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfTsKKworICAgIC8qIFNvcnRpbmcKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisK
KyAgICAvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCisgICAgc29ydE9yZGVyID0gaGFzQ29tcGFy
ZSA/CisgICAgZnVuY3Rpb24oIGEsIGIgKSB7CisKKyAgICAgICAgLy8gRmxhZyBmb3IgZHVwbGlj
YXRlIHJlbW92YWwKKyAgICAgICAgaWYgKCBhID09PSBiICkgeworICAgICAgICAgICAgaGFzRHVw
bGljYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21w
YXJlRG9jdW1lbnRQb3NpdGlvbgorICAgICAgICB2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1
bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CisgICAgICAgIGlmICgg
Y29tcGFyZSApIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUg
c2FtZSBkb2N1bWVudAorICAgICAgICBjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSAp
ID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPworICAgICAgICAgICAgYS5jb21wYXJlRG9j
dW1lbnRQb3NpdGlvbiggYiApIDoKKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGtub3cg
dGhleSBhcmUgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAxOworCisgICAgICAgIC8vIERpc2Nv
bm5lY3RlZCBub2RlcworICAgICAgICBpZiAoIGNvbXBhcmUgJiAxIHx8CisgICAgICAgICAgICAo
IXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9
PT0gY29tcGFyZSkgKSB7CisKKyAgICAgICAgICAgIC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVu
dCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudAorICAgICAgICAgICAg
aWYgKCBhID09PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAm
JiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkgeworICAgICAgICAgICAgICAgIHJldHVybiAt
MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5v
d25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBi
KSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKKyAgICAgICAgICAgIHJldHVybiBzb3J0
SW5wdXQgPworICAgICAgICAgICAgICAgICggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRl
eE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKKyAgICAgICAgICAgICAgICAwOworICAgICAgICB9CisK
KyAgICAgICAgcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOworICAgIH0gOgorICAgIGZ1bmN0
aW9uKCBhLCBiICkgeworICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRl
bnRpY2FsCisgICAgICAgIGlmICggYSA9PT0gYiApIHsKKyAgICAgICAgICAgIGhhc0R1cGxpY2F0
ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZh
ciBjdXIsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGF1cCA9IGEucGFyZW50Tm9k
ZSwKKyAgICAgICAgICAgIGJ1cCA9IGIucGFyZW50Tm9kZSwKKyAgICAgICAgICAgIGFwID0gWyBh
IF0sCisgICAgICAgICAgICBicCA9IFsgYiBdOworCisgICAgICAgIC8vIFBhcmVudGxlc3Mgbm9k
ZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisgICAgICAgIGlmICggIWF1
cCB8fCAhYnVwICkgeworICAgICAgICAgICAgcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgor
ICAgICAgICAgICAgICAgIGIgPT09IGRvY3VtZW50ID8gMSA6CisgICAgICAgICAgICAgICAgYXVw
ID8gLTEgOgorICAgICAgICAgICAgICAgIGJ1cCA/IDEgOgorICAgICAgICAgICAgICAgIHNvcnRJ
bnB1dCA/CisgICAgICAgICAgICAgICAgKCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4
T2YoIHNvcnRJbnB1dCwgYiApICkgOgorICAgICAgICAgICAgICAgIDA7CisKKyAgICAgICAgLy8g
SWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKKyAgICAg
ICAgfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CisgICAgICAgICAgICByZXR1cm4gc2libGlu
Z0NoZWNrKCBhLCBiICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2Ugd2UgbmVl
ZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvbgorICAgICAgICBj
dXIgPSBhOworICAgICAgICB3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisgICAg
ICAgICAgICBhcC51bnNoaWZ0KCBjdXIgKTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBiOwor
ICAgICAgICB3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CisgICAgICAgICAgICBi
cC51bnNoaWZ0KCBjdXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhbGsgZG93biB0aGUg
dHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CisgICAgICAgIHdoaWxlICggYXBbaV0gPT09
IGJwW2ldICkgeworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGkgPworICAgICAgICAgICAgLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZl
IGEgY29tbW9uIGFuY2VzdG9yCisgICAgICAgICAgICBzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtp
XSApIDoKKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBz
b3J0IGZpcnN0CisgICAgICAgICAgICBhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgorICAg
ICAgICAgICAgYnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOgorICAgICAgICAgICAgMDsKKyAg
ICB9OworCisgICAgcmV0dXJuIGRvY3VtZW50OworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5j
dGlvbiggZXhwciwgZWxlbWVudHMgKSB7CisgICAgcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwg
bnVsbCwgZWxlbWVudHMgKTsKK307CisKK1NpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlv
biggZWxlbSwgZXhwciApIHsKKyAgICAvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKKyAg
ICBpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7Cisg
ICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRo
YXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisgICAgZXhwciA9IGV4cHIucmVwbGFj
ZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKKworICAgIGlmICggc3VwcG9ydC5tYXRj
aGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKKyAgICAgICAgIWNvbXBpbGVyQ2FjaGVb
IGV4cHIgKyAiICIgXSAmJgorICAgICAgICAoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRj
aGVzLnRlc3QoIGV4cHIgKSApICYmCisgICAgICAgICggIXJidWdneVFTQSAgICAgfHwgIXJidWdn
eVFTQS50ZXN0KCBleHByICkgKSApIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFy
IHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOworCisgICAgICAgICAgICAvLyBJRSA5
J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzCisg
ICAgICAgICAgICBpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CisgICAg
ICAgICAgICAgICAgICAgIC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0
byBiZSBpbiBhIGRvY3VtZW50CisgICAgICAgICAgICAgICAgICAgIC8vIGZyYWdtZW50IGluIElF
IDkKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5v
ZGVUeXBlICE9PSAxMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAg
ICAgfQorICAgICAgICB9IGNhdGNoIChlKSB7fQorICAgIH0KKworICAgIHJldHVybiBTaXp6bGUo
IGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cit9OworCitTaXp6
bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKKyAgICAvLyBTZXQgZG9j
dW1lbnQgdmFycyBpZiBuZWVkZWQKKyAgICBpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8
IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgIHNldERvY3VtZW50KCBjb250ZXh0
ICk7CisgICAgfQorICAgIHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApOworfTsKKwor
U2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAvLyBTZXQgZG9jdW1l
bnQgdmFycyBpZiBuZWVkZWQKKyAgICBpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0g
KSAhPT0gZG9jdW1lbnQgKSB7CisgICAgICAgIHNldERvY3VtZW50KCBlbGVtICk7CisgICAgfQor
CisgICAgdmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSwKKyAg
ICAgICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMg
KGpRdWVyeSAjMTM4MDcpCisgICAgICAgIHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0
dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID8KKyAgICAgICAgICAgIGZuKCBlbGVtLCBu
YW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6CisgICAgICAgICAgICB1bmRlZmluZWQ7CisKKyAgICBy
ZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPworICAgICAgICB2YWwgOgorICAgICAgICBzdXBwb3J0
LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID8KKyAgICAgICAgICAgIGVsZW0uZ2V0QXR0
cmlidXRlKCBuYW1lICkgOgorICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9k
ZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CisgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
KyAgICAgICAgICAgICAgICBudWxsOworfTsKKworU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1z
ZyApIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBl
eHByZXNzaW9uOiAiICsgbXNnICk7Cit9OworCisvKioKKyAqIERvY3VtZW50IHNvcnRpbmcgYW5k
IHJlbW92aW5nIGR1cGxpY2F0ZXMKKyAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCisgKi8K
K1NpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7CisgICAgdmFyIGVsZW0s
CisgICAgICAgIGR1cGxpY2F0ZXMgPSBbXSwKKyAgICAgICAgaiA9IDAsCisgICAgICAgIGkgPSAw
OworCisgICAgLy8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFz
c3VtZSB0aGVpciBwcmVzZW5jZQorICAgIGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1
cGxpY2F0ZXM7CisgICAgc29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRz
LnNsaWNlKCAwICk7CisgICAgcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKKworICAgIGlmICgg
aGFzRHVwbGljYXRlICkgeworICAgICAgICB3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSAp
IHsKKyAgICAgICAgICAgIGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgeworICAgICAgICAg
ICAgICAgIGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICB3aGlsZSAoIGotLSApIHsKKyAgICAgICAgICAgIHJlc3VsdHMuc3BsaWNlKCBk
dXBsaWNhdGVzWyBqIF0sIDEgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENsZWFyIGlu
cHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCisgICAgLy8gU2VlIGh0dHBzOi8v
Z2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1CisgICAgc29ydElucHV0ID0gbnVsbDsK
KworICAgIHJldHVybiByZXN1bHRzOworfTsKKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIGZv
ciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2RlcworICog
QHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCisgKi8KK2dldFRleHQgPSBTaXp6bGUuZ2V0VGV4
dCA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHZhciBub2RlLAorICAgICAgICByZXQgPSAiIiwK
KyAgICAgICAgaSA9IDAsCisgICAgICAgIG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKKworICAg
IGlmICggIW5vZGVUeXBlICkgeworICAgICAgICAvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBl
eHBlY3RlZCB0byBiZSBhbiBhcnJheQorICAgICAgICB3aGlsZSAoIChub2RlID0gZWxlbVtpKytd
KSApIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzCisgICAg
ICAgICAgICByZXQgKz0gZ2V0VGV4dCggbm9kZSApOworICAgICAgICB9CisgICAgfSBlbHNlIGlm
ICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkg
eworICAgICAgICAvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCisgICAgICAgIC8vIGlu
bmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVy
eSAjMTExNTMpCisgICAgICAgIGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09ICJzdHJp
bmciICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW4KKyAgICAgICAgICAg
IGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJs
aW5nICkgeworICAgICAgICAgICAgICAgIHJldCArPSBnZXRUZXh0KCBlbGVtICk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2Rl
VHlwZSA9PT0gNCApIHsKKyAgICAgICAgcmV0dXJuIGVsZW0ubm9kZVZhbHVlOworICAgIH0KKyAg
ICAvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9k
ZXMKKworICAgIHJldHVybiByZXQ7Cit9OworCitFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsK
KworICAgIC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcgorICAgIGNhY2hlTGVuZ3RoOiA1
MCwKKworICAgIGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLAorCisgICAgbWF0Y2g6IG1hdGNo
RXhwciwKKworICAgIGF0dHJIYW5kbGU6IHt9LAorCisgICAgZmluZDoge30sCisKKyAgICByZWxh
dGl2ZTogeworICAgICAgICAiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0s
CisgICAgICAgICIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAorICAgICAgICAiKyI6IHsgZGly
OiAicHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwKKyAgICAgICAgIn4iOiB7IGRpcjog
InByZXZpb3VzU2libGluZyIgfQorICAgIH0sCisKKyAgICBwcmVGaWx0ZXI6IHsKKyAgICAgICAg
IkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNo
WzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisKKyAgICAgICAgICAgIC8vIE1v
dmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVk
CisgICAgICAgICAgICBtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hb
NV0gfHwgIiIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCisgICAgICAgICAg
ICBpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworICAgICAgICAgICAgICAgIG1hdGNoWzNdID0g
IiAiICsgbWF0Y2hbM10gKyAiICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biBtYXRjaC5zbGljZSggMCwgNCApOworICAgICAgICB9LAorCisgICAgICAgICJDSElMRCI6IGZ1
bmN0aW9uKCBtYXRjaCApIHsKKyAgICAgICAgICAgIC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJb
IkNISUxEIl0KKyAgICAgICAgICAgICAgICAxIHR5cGUgKG9ubHl8bnRofC4uLikKKyAgICAgICAg
ICAgICAgICAyIHdoYXQgKGNoaWxkfG9mLXR5cGUpCisgICAgICAgICAgICAgICAgMyBhcmd1bWVu
dCAoZXZlbnxvZGR8XGQqfFxkKm4oWystXVxkKyk/fC4uLikKKyAgICAgICAgICAgICAgICA0IHhu
LWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQorICAgICAgICAgICAgICAg
IDUgc2lnbiBvZiB4bi1jb21wb25lbnQKKyAgICAgICAgICAgICAgICA2IHggb2YgeG4tY29tcG9u
ZW50CisgICAgICAgICAgICAgICAgNyBzaWduIG9mIHktY29tcG9uZW50CisgICAgICAgICAgICAg
ICAgOCB5IG9mIHktY29tcG9uZW50CisgICAgICAgICAgICAqLworICAgICAgICAgICAgbWF0Y2hb
MV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICBpZiAoIG1hdGNoWzFd
LnNsaWNlKCAwLCAzICkgPT09ICJudGgiICkgeworICAgICAgICAgICAgICAgIC8vIG50aC0qIHJl
cXVpcmVzIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCAhbWF0Y2hbM10gKSB7CisgICAg
ICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3Ig
RXhwci5maWx0ZXIuQ0hJTEQKKyAgICAgICAgICAgICAgICAvLyByZW1lbWJlciB0aGF0IGZhbHNl
L3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCisgICAgICAgICAgICAgICAgbWF0Y2hbNF0g
PSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hb
M10gPT09ICJldmVuIiB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKSApOworICAgICAgICAgICAgICAg
IG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09ICJv
ZGQiICk7CisKKyAgICAgICAgICAgIC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50cwor
ICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0Y2hbM10gKSB7CisgICAgICAgICAgICAgICAgU2l6
emxlLmVycm9yKCBtYXRjaFswXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1
cm4gbWF0Y2g7CisgICAgICAgIH0sCisKKyAgICAgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRj
aCApIHsKKyAgICAgICAgICAgIHZhciBleGNlc3MsCisgICAgICAgICAgICAgICAgdW5xdW90ZWQg
PSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07CisKKyAgICAgICAgICAgIGlmICggbWF0Y2hFeHByWyJD
SElMRCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRz
IGFzLWlzCisgICAgICAgICAgICBpZiAoIG1hdGNoWzNdICkgeworICAgICAgICAgICAgICAgIG1h
dGNoWzJdID0gbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgIiI7CisKKyAgICAgICAgICAgIC8vIFN0
cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCisgICAgICAgICAg
ICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiYKKyAg
ICAgICAgICAgICAgICAvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KQor
ICAgICAgICAgICAgICAgIChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYK
KyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVz
aXMKKyAgICAgICAgICAgICAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIikiLCB1bnF1
b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICAgICAgICAgIG1h
dGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOworICAgICAgICAgICAgICAgIG1h
dGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBm
aWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKKyAgICAgICAgICAgIHJldHVybiBtYXRj
aC5zbGljZSggMCwgMyApOworICAgICAgICB9CisgICAgfSwKKworICAgIGZpbHRlcjogeworCisg
ICAgICAgICJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHsKKyAgICAgICAgICAg
IHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5l
c2NhcGUgKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1lU2VsZWN0
b3IgPT09ICIqIiA/CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9
IDoKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09
PSBub2RlTmFtZTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9LAorCisgICAgICAgICJD
TEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CisgICAgICAgICAgICB2YXIgcGF0dGVybiA9
IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArICIgIiBdOworCisgICAgICAgICAgICByZXR1cm4gcGF0
dGVybiB8fAorICAgICAgICAgICAgICAgIChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihefCIgKyB3
aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiICkp
ICYmCisgICAgICAgICAgICAgICAgY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVs
ZW0uY2xhc3NOYW1lID09PSAic3RyaW5nIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxl
bS5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFz
cyIpIHx8ICIiICk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0sCisKKyAgICAgICAg
IkFUVFIiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkgeworICAgICAgICAgICAg
cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBT
aXp6bGUuYXR0ciggZWxlbSwgbmFtZSApOworCisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHQg
PT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yID09PSAiIT0i
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICFvcGVyYXRvciApIHsK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIiOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG9w
ZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAgICAg
b3BlcmF0b3IgPT09ICIhPSIgPyByZXN1bHQgIT09IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAg
ICAgb3BlcmF0b3IgPT09ICJePSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9
PT0gMCA6CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYg
cmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CisgICAgICAgICAgICAgICAgICAgIG9wZXJh
dG9yID09PSAiJD0iID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09
IGNoZWNrIDoKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiAr
IHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgIiAiICkgKyAiICIgKS5pbmRleE9mKCBjaGVj
ayApID4gLTEgOgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gInw9IiA/IHJlc3Vs
dCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNo
ZWNrICsgIi0iIDoKKyAgICAgICAgICAgICAgICAgICAgZmFsc2U7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9LAorCisgICAgICAgICJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1
bWVudCwgZmlyc3QsIGxhc3QgKSB7CisgICAgICAgICAgICB2YXIgc2ltcGxlID0gdHlwZS5zbGlj
ZSggMCwgMyApICE9PSAibnRoIiwKKyAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHlwZS5zbGlj
ZSggLTQgKSAhPT0gImxhc3QiLAorICAgICAgICAgICAgICAgIG9mVHlwZSA9IHdoYXQgPT09ICJv
Zi10eXBlIjsKKworICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAg
PworCisgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQorICAgICAgICAg
ICAgICAgIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFl
bGVtLnBhcmVudE5vZGU7CisgICAgICAgICAgICAgICAgfSA6CisKKyAgICAgICAgICAgICAgICBm
dW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgICAgICAgICB2YXIg
Y2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gIm5leHRT
aWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFy
ZW50ID0gZWxlbS5wYXJlbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG9m
VHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICB1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGRpZmYgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmVudCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10
eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzaW1wbGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd2hpbGUgKCBkaXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUgPSBlbGVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3
aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCBvZlR5cGUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXZl
cnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBkaXIgPSB0eXBlID09PSAib25s
eSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IFsgZm9y
d2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOworCisgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUg
ZGF0YSBvbiBgcGFyZW50YAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBmb3J3YXJkICYm
IHVzZUNhY2hlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBgZWxl
bWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbm9kZSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRl
ckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGll
cyAoalF1ZXJ5IGdoLTE3MDkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ2Fj
aGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBk
aXJydW5zICYmIGNhY2hlWyAxIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9
IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5v
ZGUgJiYgbm9kZVsgZGlyIF0gfHwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgp
KSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGZvdW5kLCBj
YWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVhaworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09
IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDYWNo
ZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2
aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggdXNlQ2FjaGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbm9kZSA9IGVsZW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVuZCBhZ2FpbnN0IGNsb25l
ZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGVyQ2FjaGVbIG5vZGUudW5pcXVl
SUQgXSA9IHt9KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHVu
aXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9IG5vZGVJbmRleDsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4bWwg
Om50aC1jaGlsZCguLi4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgOm50aC1s
YXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggZGlmZiA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVs
ZW1gIGZyb20gdGhlIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxl
ICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0
YXJ0LnBvcCgpKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCAoIG9mVHlwZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9k
ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDoKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVUeXBlID09PSAxICkgJiYKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2RpZmYgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNv
dW50ZXJlZCBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCB1c2VDYWNoZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0g
e30pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFIDw5IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3
MDkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNh
Y2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBd
ID0ge30pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu
aXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG5vZGUgPT09IGVsZW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNp
emUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gbGFzdDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAm
JiBkaWZmIC8gZmlyc3QgPj0gMCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgfTsKKyAgICAgICAgfSwKKworICAgICAgICAiUFNFVURPIjogZnVuY3Rpb24oIHBzZXVk
bywgYXJndW1lbnQgKSB7CisgICAgICAgICAgICAvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNh
c2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVj
dG9ycy8jcHNldWRvLWNsYXNzZXMKKyAgICAgICAgICAgIC8vIFByaW9yaXRpemUgYnkgY2FzZSBz
ZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2Fz
ZSBsZXR0ZXJzCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJp
dHMgZnJvbSBwc2V1ZG9zCisgICAgICAgICAgICB2YXIgYXJncywKKyAgICAgICAgICAgICAgICBm
biA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9M
b3dlckNhc2UoKSBdIHx8CisgICAgICAgICAgICAgICAgICAgIFNpenpsZS5lcnJvciggInVuc3Vw
cG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOworCisgICAgICAgICAgICAvLyBUaGUgdXNlciBt
YXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CisgICAgICAgICAgICAvLyBhcmd1
bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgorICAgICAgICAg
ICAgLy8ganVzdCBhcyBTaXp6bGUgZG9lcworICAgICAgICAgICAgaWYgKCBmblsgZXhwYW5kbyBd
ICkgeworICAgICAgICAgICAgICAgIHJldHVybiBmbiggYXJndW1lbnQgKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1
cmVzCisgICAgICAgICAgICBpZiAoIGZuLmxlbmd0aCA+IDEgKSB7CisgICAgICAgICAgICAgICAg
YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOworICAgICAgICAgICAgICAg
IHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2Fz
ZSgpICkgPworICAgICAgICAgICAgICAgICAgICBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQs
IG1hdGNoZXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWR4LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpID0gbWF0Y2hlZC5sZW5ndGg7CisgICAgICAgICAgICAg
ICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkgOgorICAgICAg
ICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApOworICAgICAgICAgICAgICAgICAgICB9OworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm47CisgICAgICAgIH0KKyAgICB9LAor
CisgICAgcHNldWRvczogeworICAgICAgICAvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3MK
KyAgICAgICAgIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisgICAg
ICAgICAgICAvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQorICAgICAgICAg
ICAgLy8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICAgICAgICAg
IC8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycworICAgICAgICAgICAgdmFyIGlucHV0ID0gW10sCisg
ICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtdLAorICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBj
b21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CisKKyAgICAgICAgICAg
IHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gPworICAgICAgICAgICAgICAgIG1hcmtGdW5jdGlv
bihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAg
ICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZCA9IG1h
dGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkg
PSBzZWVkLmxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCBlbGVtZW50cyB1
bm1hdGNoZWQgYnkgYG1hdGNoZXJgCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVs
ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfSkgOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0WzBdID0gZWxlbTsKKyAgICAg
ICAgICAgICAgICAgICAgbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApOworICAg
ICAgICAgICAgICAgICAgICAvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQor
ICAgICAgICAgICAgICAgICAgICBpbnB1dFswXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiAhcmVzdWx0cy5wb3AoKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9KSwK
KworICAgICAgICAiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAg
ICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9KSwKKworICAgICAgICAiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24o
IHRleHQgKSB7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1
bmVzY2FwZSApOworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAg
ICAgICAgICAgIHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwg
Z2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CisgICAgICAgICAgICB9Owor
ICAgICAgICB9KSwKKworICAgICAgICAvLyAiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2Vu
dGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvcgorICAgICAgICAvLyBpcyBiYXNlZCBzb2xlbHkgb24g
dGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQorICAgICAgICAvLyBiZWluZyBlcXVhbCB0byB0
aGUgaWRlbnRpZmllciBDLAorICAgICAgICAvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRp
ZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICItIi4KKyAgICAgICAgLy8gVGhlIG1hdGNo
aW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1l
ZCBjYXNlLWluc2Vuc2l0aXZlbHkuCisgICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBu
b3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgorICAgICAgICAvLyBodHRwOi8v
d3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvCisgICAgICAgICJsYW5nIjogbWFy
a0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHsKKyAgICAgICAgICAgIC8vIGxhbmcgdmFsdWUg
bXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKyAgICAgICAgICAgIGlmICggIXJpZGVudGlmaWVy
LnRlc3QobGFuZyB8fCAiIikgKSB7CisgICAgICAgICAgICAgICAgU2l6emxlLmVycm9yKCAidW5z
dXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxh
bmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsK
KyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgICAgICB2
YXIgZWxlbUxhbmc7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBp
ZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID8KKyAgICAgICAgICAgICAgICAgICAgICAg
IGVsZW0ubGFuZyA6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSgi
eG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgibGFuZyIpKSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOworICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmlu
ZGV4T2YoIGxhbmcgKyAiLSIgKSA9PT0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2Rl
VHlwZSA9PT0gMSApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IH07CisgICAgICAgIH0pLAorCisgICAgICAgIC8vIE1pc2NlbGxhbmVvdXMKKyAgICAgICAgInRh
cmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgdmFyIGhhc2ggPSB3aW5kb3cu
bG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7CisgICAgICAgICAgICByZXR1cm4gaGFz
aCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7CisgICAgICAgIH0sCisKKyAgICAgICAg
InJvb3QiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtID09PSBk
b2NFbGVtOworICAgICAgICB9LAorCisgICAgICAgICJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYg
KCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5
cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsKKyAgICAgICAgfSwKKworICAgICAg
ICAvLyBCb29sZWFuIHByb3BlcnRpZXMKKyAgICAgICAgImVuYWJsZWQiOiBmdW5jdGlvbiggZWxl
bSApIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTsKKyAgICAg
ICAgfSwKKworICAgICAgICAiZGlzYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAg
ICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOworICAgICAgICB9LAorCisgICAgICAg
ICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICAvLyBJbiBDU1MzLCA6
Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHMK
KyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0
b3JzLTIwMTEwOTI5LyNjaGVja2VkCisgICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5v
ZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSAi
aW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYmICEh
ZWxlbS5zZWxlY3RlZCk7CisgICAgICAgIH0sCisKKyAgICAgICAgInNlbGVjdGVkIjogZnVuY3Rp
b24oIGVsZW0gKSB7CisgICAgICAgICAgICAvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtl
cyBzZWxlY3RlZC1ieS1kZWZhdWx0CisgICAgICAgICAgICAvLyBvcHRpb25zIGluIFNhZmFyaSB3
b3JrIHByb3Blcmx5CisgICAgICAgICAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKKyAgICAg
ICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CisgICAgICAgIH0s
CisKKyAgICAgICAgLy8gQ29udGVudHMKKyAgICAgICAgImVtcHR5IjogZnVuY3Rpb24oIGVsZW0g
KSB7CisgICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5
LXBzZXVkbworICAgICAgICAgICAgLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkg
b3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAorICAg
ICAgICAgICAgLy8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBp
bnN0cnVjdGlvbjogNzsgZXRjLikKKyAgICAgICAgICAgIC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBi
ZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW4KKyAgICAgICAg
ICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRT
aWJsaW5nICkgeworICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKworICAgICAg
ICAicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICByZXR1cm4gIUV4cHIu
cHNldWRvc1siZW1wdHkiXSggZWxlbSApOworICAgICAgICB9LAorCisgICAgICAgIC8vIEVsZW1l
bnQvaW5wdXQgdHlwZXMKKyAgICAgICAgImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAg
ICAgICAgICAgcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgICAgICB9
LAorCisgICAgICAgICJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAgICAgcmV0
dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOworICAgICAgICB9LAorCisgICAgICAg
ICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHZhciBuYW1lID0gZWxl
bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJp
bnB1dCIgJiYgZWxlbS50eXBlID09PSAiYnV0dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsKKyAg
ICAgICAgfSwKKworICAgICAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICAg
ICAgdmFyIGF0dHI7CisgICAgICAgICAgICByZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz
ZSgpID09PSAiaW5wdXQiICYmCisgICAgICAgICAgICAgICAgZWxlbS50eXBlID09PSAidGV4dCIg
JiYKKworICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFPDgKKyAgICAgICAgICAgICAgICAv
LyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgInNlYXJjaCIpIGFwcGVhciB3aXRo
IGVsZW0udHlwZSA9PT0gInRleHQiCisgICAgICAgICAgICAgICAgKCAoYXR0ciA9IGVsZW0uZ2V0
QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4
dCIgKTsKKyAgICAgICAgfSwKKworICAgICAgICAvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCisg
ICAgICAgICJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgICByZXR1cm4gWyAwIF07CisgICAgICAgIH0pLAorCisgICAgICAgICJsYXN0IjogY3Jl
YXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Cisg
ICAgICAgICAgICByZXR1cm4gWyBsZW5ndGggLSAxIF07CisgICAgICAgIH0pLAorCisgICAgICAg
ICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVu
Z3RoLCBhcmd1bWVudCApIHsKKyAgICAgICAgICAgIHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFy
Z3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKKyAgICAgICAgfSksCisKKyAgICAgICAgImV2
ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0
aCApIHsKKyAgICAgICAgICAgIHZhciBpID0gMDsKKyAgICAgICAgICAgIGZvciAoIDsgaSA8IGxl
bmd0aDsgaSArPSAyICkgeworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOworICAgICAg
ICB9KSwKKworICAgICAgICAib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigg
bWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CisgICAgICAgICAgICB2YXIgaSA9IDE7CisgICAgICAg
ICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKKyAgICAgICAgICAgICAgICBtYXRj
aEluZGV4ZXMucHVzaCggaSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1h
dGNoSW5kZXhlczsKKyAgICAgICAgfSksCisKKyAgICAgICAgImx0IjogY3JlYXRlUG9zaXRpb25h
bFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworICAg
ICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3Vt
ZW50OworICAgICAgICAgICAgZm9yICggOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICAgICAg
bWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biBtYXRjaEluZGV4ZXM7CisgICAgICAgIH0pLAorCisgICAgICAgICJndCI6IGNyZWF0ZVBvc2l0
aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsK
KyAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBh
cmd1bWVudDsKKyAgICAgICAgICAgIGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKKyAgICAgICAg
ICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKKyAgICAgICAgfSkKKyAgICB9Cit9OworCitFeHByLnBz
ZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJlcSJdOworCisvLyBBZGQgYnV0dG9uL2lucHV0
IHR5cGUgcHNldWRvcworZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwg
ZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7CisgICAgRXhwci5w
c2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOworfQorZm9yICggaSBpbiB7IHN1
Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHsKKyAgICBFeHByLnBzZXVkb3NbIGkgXSA9IGNy
ZWF0ZUJ1dHRvblBzZXVkbyggaSApOworfQorCisvLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3
IHNldEZpbHRlcnMKK2Z1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQorc2V0RmlsdGVycy5wcm90b3R5
cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7CitFeHByLnNldEZpbHRlcnMgPSBuZXcg
c2V0RmlsdGVycygpOworCit0b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBz
ZWxlY3RvciwgcGFyc2VPbmx5ICkgeworICAgIHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0
eXBlLAorICAgICAgICBzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLAorICAgICAgICBjYWNoZWQg
PSB0b2tlbkNhY2hlWyBzZWxlY3RvciArICIgIiBdOworCisgICAgaWYgKCBjYWNoZWQgKSB7Cisg
ICAgICAgIHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7CisgICAgfQor
CisgICAgc29GYXIgPSBzZWxlY3RvcjsKKyAgICBncm91cHMgPSBbXTsKKyAgICBwcmVGaWx0ZXJz
ID0gRXhwci5wcmVGaWx0ZXI7CisKKyAgICB3aGlsZSAoIHNvRmFyICkgeworCisgICAgICAgIC8v
IENvbW1hIGFuZCBmaXJzdCBydW4KKyAgICAgICAgaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSBy
Y29tbWEuZXhlYyggc29GYXIgKSkgKSB7CisgICAgICAgICAgICBpZiAoIG1hdGNoICkgeworICAg
ICAgICAgICAgICAgIC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkCisg
ICAgICAgICAgICAgICAgc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwg
c29GYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cHMucHVzaCggKHRva2VucyA9
IFtdKSApOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2hlZCA9IGZhbHNlOworCisgICAgICAg
IC8vIENvbWJpbmF0b3JzCisgICAgICAgIGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMo
IHNvRmFyICkpICkgeworICAgICAgICAgICAgbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CisgICAg
ICAgICAgICB0b2tlbnMucHVzaCh7CisgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoZWQsCisg
ICAgICAgICAgICAgICAgLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCisg
ICAgICAgICAgICAgICAgdHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApCisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVu
Z3RoICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWx0ZXJzCisgICAgICAgIGZvciAoIHR5
cGUgaW4gRXhwci5maWx0ZXIgKSB7CisgICAgICAgICAgICBpZiAoIChtYXRjaCA9IG1hdGNoRXhw
clsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8CisgICAg
ICAgICAgICAgICAgKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7Cisg
ICAgICAgICAgICAgICAgbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAg
dG9rZW5zLnB1c2goeworICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hlZCwKKyAgICAg
ICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlczog
bWF0Y2gKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBzb0ZhciA9IHNvRmFy
LnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCAhbWF0Y2hlZCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzCisg
ICAgLy8gaWYgd2UncmUganVzdCBwYXJzaW5nCisgICAgLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBl
cnJvciBvciByZXR1cm4gdG9rZW5zCisgICAgcmV0dXJuIHBhcnNlT25seSA/CisgICAgICAgIHNv
RmFyLmxlbmd0aCA6CisgICAgICAgIHNvRmFyID8KKyAgICAgICAgICAgIFNpenpsZS5lcnJvcigg
c2VsZWN0b3IgKSA6CisgICAgICAgICAgICAvLyBDYWNoZSB0aGUgdG9rZW5zCisgICAgICAgICAg
ICB0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKK307CisKK2Z1bmN0
aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgICAgIGxlbiA9
IHRva2Vucy5sZW5ndGgsCisgICAgICAgIHNlbGVjdG9yID0gIiI7CisgICAgZm9yICggOyBpIDwg
bGVuOyBpKysgKSB7CisgICAgICAgIHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTsKKyAgICB9
CisgICAgcmV0dXJuIHNlbGVjdG9yOworfQorCitmdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRj
aGVyLCBjb21iaW5hdG9yLCBiYXNlICkgeworICAgIHZhciBkaXIgPSBjb21iaW5hdG9yLmRpciwK
KyAgICAgICAgY2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFyZW50Tm9kZSIs
CisgICAgICAgIGRvbmVOYW1lID0gZG9uZSsrOworCisgICAgcmV0dXJuIGNvbWJpbmF0b3IuZmly
c3QgPworICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5n
IGVsZW1lbnQKKyAgICAgICAgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKKyAgICAg
ICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CisgICAgICAgICAgICAgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gOgorCisgICAgICAgIC8vIENo
ZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cworICAgICAgICBmdW5j
dGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgdmFyIG9sZENhY2hlLCB1
bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwKKyAgICAgICAgICAgICAgICBuZXdDYWNoZSA9IFsgZGly
cnVucywgZG9uZU5hbWUgXTsKKworICAgICAgICAgICAgLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFy
eSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRv
ciBjYWNoaW5nCisgICAgICAgICAgICBpZiAoIHhtbCApIHsKKyAgICAgICAgICAgICAgICB3aGls
ZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGVs
ZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkg
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVj
a05vbkVsZW1lbnRzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDYWNoZSA9IGVs
ZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA8OSBvbmx5CisgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51
bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGRpciBdKSAm
JgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMg
JiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0
byBwcmV2aW91cyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAo
bmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOworICAgICAgICAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBuZXdjYWNoZSBz
byByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5pcXVlQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFp
bCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkp
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH07Cit9CisKK2Z1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHsKKyAgICBy
ZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CisgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250
ZXh0LCB4bWwgKSB7CisgICAgICAgICAgICB2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKKyAgICAg
ICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgIGlmICggIW1hdGNoZXJzW2ld
KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9IDoKKyAgICAgICAgbWF0Y2hlcnNbMF07Cit9CisKK2Z1bmN0aW9u
IG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKKyAgICB2
YXIgaSA9IDAsCisgICAgICAgIGxlbiA9IGNvbnRleHRzLmxlbmd0aDsKKyAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKKyAgICAgICAgU2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJl
c3VsdHMgKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK2Z1bmN0aW9uIGNvbmRl
bnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7CisgICAgdmFyIGVs
ZW0sCisgICAgICAgIG5ld1VubWF0Y2hlZCA9IFtdLAorICAgICAgICBpID0gMCwKKyAgICAgICAg
bGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKKyAgICAgICAgbWFwcGVkID0gbWFwICE9IG51bGw7CisK
KyAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0
Y2hlZFtpXSkgKSB7CisgICAgICAgICAgICBpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBj
b250ZXh0LCB4bWwgKSApIHsKKyAgICAgICAgICAgICAgICBuZXdVbm1hdGNoZWQucHVzaCggZWxl
bSApOworICAgICAgICAgICAgICAgIGlmICggbWFwcGVkICkgeworICAgICAgICAgICAgICAgICAg
ICBtYXAucHVzaCggaSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdVbm1hdGNoZWQ7Cit9CisKK2Z1bmN0aW9uIHNl
dE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RG
aW5kZXIsIHBvc3RTZWxlY3RvciApIHsKKyAgICBpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0
ZXJbIGV4cGFuZG8gXSApIHsKKyAgICAgICAgcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RG
aWx0ZXIgKTsKKyAgICB9CisgICAgaWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBh
bmRvIF0gKSB7CisgICAgICAgIHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBw
b3N0U2VsZWN0b3IgKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworICAgICAgICB2YXIgdGVtcCwgaSwgZWxl
bSwKKyAgICAgICAgICAgIHByZU1hcCA9IFtdLAorICAgICAgICAgICAgcG9zdE1hcCA9IFtdLAor
ICAgICAgICAgICAgcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKKworICAgICAgICAgICAg
Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHQKKyAgICAgICAgICAg
IGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRl
eHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCisKKyAgICAgICAgICAg
IC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Ig
c2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbgorICAgICAgICAgICAgbWF0Y2hlckluID0gcHJl
RmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisgICAgICAgICAgICAgICAgY29uZGVu
c2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorICAgICAgICAg
ICAgICAgIGVsZW1zLAorCisgICAgICAgICAgICBtYXRjaGVyT3V0ID0gbWF0Y2hlciA/CisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQs
IG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cywKKyAgICAgICAg
ICAgICAgICBwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8
IHBvc3RGaWx0ZXIgKSA/CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uaW50ZXJtZWRpYXRl
IHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgIFtdIDoKKworICAg
ICAgICAgICAgICAgICAgICAvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHkKKyAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0cyA6CisgICAgICAgICAgICAgICAgbWF0Y2hlckluOwor
CisgICAgICAgIC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCisgICAgICAgIGlmICggbWF0Y2hlciAp
IHsKKyAgICAgICAgICAgIG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwg
eG1sICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSBwb3N0RmlsdGVyCisgICAgICAg
IGlmICggcG9zdEZpbHRlciApIHsKKyAgICAgICAgICAgIHRlbXAgPSBjb25kZW5zZSggbWF0Y2hl
ck91dCwgcG9zdE1hcCApOworICAgICAgICAgICAgcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRl
eHQsIHhtbCApOworCisgICAgICAgICAgICAvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5
IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluCisgICAgICAgICAgICBpID0gdGVtcC5sZW5n
dGg7CisgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChl
bGVtID0gdGVtcFtpXSkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJPdXRbIHBvc3RN
YXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHNlZWQgKSB7
CisgICAgICAgICAgICBpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkgeworICAgICAgICAg
ICAgICAgIGlmICggcG9zdEZpbmRlciApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRo
ZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBw
b3N0RmluZGVyIGNvbnRleHRzCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBbXTsKKyAgICAg
ICAgICAgICAgICAgICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGVsZW0gPSBt
YXRjaGVyT3V0W2ldKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3Jl
IG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgcG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHht
bCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1vdmUgbWF0Y2hl
ZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVk
CisgICAgICAgICAgICAgICAgaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworICAgICAgICAgICAgICAg
IHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gbWF0Y2hl
ck91dFtpXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wID0gcG9zdEZpbmRlciA/
IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisg
ICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYg
ZGVmaW5lZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2hlck91dCA9IGNvbmRl
bnNlKAorICAgICAgICAgICAgICAgIG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPworICAgICAgICAg
ICAgICAgICAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVu
Z3RoICkgOgorICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0CisgICAgICAgICAgICApOwor
ICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyICkgeworICAgICAgICAgICAgICAgIHBvc3RGaW5k
ZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKK30KKworZnVuY3Rpb24gbWF0Y2hlckZy
b21Ub2tlbnMoIHRva2VucyApIHsKKyAgICB2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLAor
ICAgICAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAorICAgICAgICBsZWFkaW5nUmVsYXRpdmUgPSBF
eHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAorICAgICAgICBpbXBsaWNpdFJlbGF0aXZl
ID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwKKyAgICAgICAgaSA9IGxl
YWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAorCisgICAgICAgIC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0
Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBj
b250ZXh0KHMpCisgICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKKyAg
ICAgICAgfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAorICAgICAgICBtYXRjaEFueUNvbnRl
eHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVy
biBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xOworICAgICAgICB9LCBpbXBsaWNp
dFJlbGF0aXZlLCB0cnVlICksCisgICAgICAgIG1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwg
Y29udGV4dCwgeG1sICkgeworICAgICAgICAgICAgdmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2
ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCisgICAg
ICAgICAgICAgICAgKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KKyAgICAgICAg
ICAgICAgICAgICAgbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CisgICAgICAg
ICAgICAgICAgICAgIG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTsKKyAg
ICAgICAgICAgIC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KQorICAg
ICAgICAgICAgY2hlY2tDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7Cisg
ICAgICAgIH0gXTsKKworICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBpZiAo
IChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7CisgICAgICAg
ICAgICBtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMg
KSwgbWF0Y2hlcikgXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hdGNoZXIgPSBF
eHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNo
ZXMgKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3Np
dGlvbmFsIG1hdGNoZXIKKyAgICAgICAgICAgIGlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgewor
ICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFu
eSkgZm9yIHByb3BlciBoYW5kbGluZworICAgICAgICAgICAgICAgIGogPSArK2k7CisgICAgICAg
ICAgICAgICAgZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
ICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIHJldHVybiBzZXRNYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICBp
ID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKKyAgICAgICAgICAgICAgICAgICAg
aSA+IDEgJiYgdG9TZWxlY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBw
cmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1w
bGljaXQgYW55LWVsZW1lbnQgYCpgCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuc2xp
Y2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSAi
ICIgPyAiKiIgOiAiIiB9KQorICAgICAgICAgICAgICAgICAgICApLnJlcGxhY2UoIHJ0cmltLCAi
JDEiICksCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAg
IGkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLAorICAg
ICAgICAgICAgICAgICAgICBqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0g
dG9rZW5zLnNsaWNlKCBqICkpICksCisgICAgICAgICAgICAgICAgICAgIGogPCBsZW4gJiYgdG9T
ZWxlY3RvciggdG9rZW5zICkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgbWF0Y2hlcnMucHVzaCggbWF0Y2hlciApOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRj
aGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7Cisg
ICAgdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKKyAgICAgICAgYnlFbGVtZW50
ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsCisgICAgICAgIHN1cGVyTWF0Y2hlciA9IGZ1
bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgIHZhciBlbGVtLCBqLCBtYXRjaGVyLAorICAgICAgICAgICAgICAgIG1hdGNoZWRDb3Vu
dCA9IDAsCisgICAgICAgICAgICAgICAgaSA9ICIwIiwKKyAgICAgICAgICAgICAgICB1bm1hdGNo
ZWQgPSBzZWVkICYmIFtdLAorICAgICAgICAgICAgICAgIHNldE1hdGNoZWQgPSBbXSwKKyAgICAg
ICAgICAgICAgICBjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKyAgICAgICAgICAg
ICAgICAvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVy
bW9zdCBjb250ZXh0CisgICAgICAgICAgICAgICAgZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAm
JiBFeHByLmZpbmRbIlRBRyJdKCAiKiIsIG91dGVybW9zdCApLAorICAgICAgICAgICAgICAgIC8v
IFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisg
ICAgICAgICAgICAgICAgZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAg
PT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCisgICAgICAgICAgICAgICAgbGVu
ID0gZWxlbXMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAoIG91dGVybW9zdCApIHsKKyAgICAg
ICAgICAgICAgICBvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29u
dGV4dCB8fCBvdXRlcm1vc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBl
bGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzCisgICAg
ICAgICAgICAvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmkKKyAgICAgICAgICAgIC8vIFRvbGVyYXRl
IE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0
Y2hpbmcgZWxlbWVudHMgYnkgaWQKKyAgICAgICAgICAgIGZvciAoIDsgaSAhPT0gbGVuICYmIChl
bGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJ5
RWxlbWVudCAmJiBlbGVtICkgeworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3Vt
ZW50ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0RG9jdW1lbnQoIGVsZW0gKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHhtbCA9ICFkb2N1bWVudElzSFRNTDsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVu
dE1hdGNoZXJzW2orK10pICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRjaGVy
KCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlc3VsdHMucHVzaCggZWxlbSApOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggb3V0ZXJtb3N0ICkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcmFjayB1bm1hdGNo
ZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzCisgICAgICAgICAgICAgICAgaWYgKCBieVNldCAp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFs
bCBwb3NzaWJsZSBtYXRjaGVycworICAgICAgICAgICAgICAgICAgICBpZiAoIChlbGVtID0gIW1h
dGNoZXIgJiYgZWxlbSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkQ291bnQt
LTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIExlbmd0
aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3QKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCBzZWVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXRj
aGVkLnB1c2goIGVsZW0gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYGlgIGlzIG5vdyB0aGUgY291bnQg
b2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50
YAorICAgICAgICAgICAgLy8gbWFrZXMgdGhlIGxhdHRlciBub25uZWdhdGl2ZS4KKyAgICAgICAg
ICAgIG1hdGNoZWRDb3VudCArPSBpOworCisgICAgICAgICAgICAvLyBBcHBseSBzZXQgZmlsdGVy
cyB0byB1bm1hdGNoZWQgZWxlbWVudHMKKyAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgY2FuIGJl
IHNraXBwZWQgaWYgdGhlcmUgYXJlIG5vIHVubWF0Y2hlZCBlbGVtZW50cyAoaS5lLiwgYG1hdGNo
ZWRDb3VudGAKKyAgICAgICAgICAgIC8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZp
c2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQorICAg
ICAgICAgICAgLy8gbm8gZWxlbWVudCBtYXRjaGVycyBhbmQgbm8gc2VlZC4KKyAgICAgICAgICAg
IC8vIEluY3JlbWVudGluZyBhbiBpbml0aWFsbHktc3RyaW5nICIwIiBgaWAgYWxsb3dzIGBpYCB0
byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0CisgICAgICAgICAgICAvLyBjYXNlLCB3aGlj
aCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20g
YGlgIGJ1dCBpcyBhbHNvCisgICAgICAgICAgICAvLyBudW1lcmljYWxseSB6ZXJvLgorICAgICAg
ICAgICAgaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7CisgICAgICAgICAgICAg
ICAgaiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hlciA9IHNldE1hdGNoZXJz
W2orK10pICkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1h
dGNoZWQsIGNvbnRleHQsIHhtbCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmICggc2VlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVpbnRlZ3JhdGUgZWxl
bWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZworICAgICAgICAg
ICAgICAgICAgICBpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEo
dW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGluZGV4IHBs
YWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcworICAgICAgICAgICAg
ICAgICAgICBzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzCisgICAg
ICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOworCisgICAgICAg
ICAgICAgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNj
ZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCisgICAgICAgICAgICAgICAgaWYgKCBv
dXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCisgICAgICAgICAg
ICAgICAgICAgICggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewor
CisgICAgICAgICAgICAgICAgICAgIFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPdmVycmlkZSBt
YW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKKyAgICAgICAgICAgIGlm
ICggb3V0ZXJtb3N0ICkgeworICAgICAgICAgICAgICAgIGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVl
OworICAgICAgICAgICAgICAgIG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdW5tYXRjaGVkOworICAgICAgICB9Owor
CisgICAgcmV0dXJuIGJ5U2V0ID8KKyAgICAgICAgbWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIg
KSA6CisgICAgICAgIHN1cGVyTWF0Y2hlcjsKK30KKworY29tcGlsZSA9IFNpenpsZS5jb21waWxl
ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsK
KyAgICB2YXIgaSwKKyAgICAgICAgc2V0TWF0Y2hlcnMgPSBbXSwKKyAgICAgICAgZWxlbWVudE1h
dGNoZXJzID0gW10sCisgICAgICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsg
IiAiIF07CisKKyAgICBpZiAoICFjYWNoZWQgKSB7CisgICAgICAgIC8vIEdlbmVyYXRlIGEgZnVu
Y3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVh
Y2ggZWxlbWVudAorICAgICAgICBpZiAoICFtYXRjaCApIHsKKyAgICAgICAgICAgIG1hdGNoID0g
dG9rZW5pemUoIHNlbGVjdG9yICk7CisgICAgICAgIH0KKyAgICAgICAgaSA9IG1hdGNoLmxlbmd0
aDsKKyAgICAgICAgd2hpbGUgKCBpLS0gKSB7CisgICAgICAgICAgICBjYWNoZWQgPSBtYXRjaGVy
RnJvbVRva2VucyggbWF0Y2hbaV0gKTsKKyAgICAgICAgICAgIGlmICggY2FjaGVkWyBleHBhbmRv
IF0gKSB7CisgICAgICAgICAgICAgICAgc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVsZW1lbnRNYXRjaGVycy5wdXNoKCBj
YWNoZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENhY2hlIHRo
ZSBjb21waWxlZCBmdW5jdGlvbgorICAgICAgICBjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxl
Y3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNo
ZXJzICkgKTsKKworICAgICAgICAvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb24KKyAg
ICAgICAgY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgfQorICAgIHJldHVybiBjYWNo
ZWQ7Cit9OworCisvKioKKyAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdv
cmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKKyAqICBzZWxlY3RvciBmdW5jdGlvbnMKKyAqIEBw
YXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBp
bGVkCisgKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQorICog
QHBhcmFtIHtFbGVtZW50fSBjb250ZXh0CisgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c10KKyAq
IEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0
CisgKi8KK3NlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRl
eHQsIHJlc3VsdHMsIHNlZWQgKSB7CisgICAgdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZp
bmQsCisgICAgICAgIGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICYm
IHNlbGVjdG9yLAorICAgICAgICBtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoc2VsZWN0b3Ig
PSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvcikgKTsKKworICAgIHJlc3VsdHMgPSByZXN1
bHRzIHx8IFtdOworCisgICAgLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUg
aXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKKyAgICAvLyAodGhl
IGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpCisgICAgaWYgKCBtYXRjaC5s
ZW5ndGggPT09IDEgKSB7CisKKyAgICAgICAgLy8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRp
bmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSUQKKyAgICAgICAgdG9rZW5zID0gbWF0Y2hbMF0g
PSBtYXRjaFswXS5zbGljZSggMCApOworICAgICAgICBpZiAoIHRva2Vucy5sZW5ndGggPiAyICYm
ICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgorICAgICAgICAgICAgICAgIHN1
cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1M
ICYmCisgICAgICAgICAgICAgICAgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsK
KworICAgICAgICAgICAgY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVz
WzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsK
KyAgICAgICAgICAgIGlmICggIWNvbnRleHQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisKKyAgICAgICAgICAgIC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwg
dmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIGNvbXBpbGVkICkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnBhcmVu
dE5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iu
c2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZworICAgICAg
ICBpID0gbWF0Y2hFeHByWyJuZWVkc0NvbnRleHQiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRv
a2Vucy5sZW5ndGg7CisgICAgICAgIHdoaWxlICggaS0tICkgeworICAgICAgICAgICAgdG9rZW4g
PSB0b2tlbnNbaV07CisKKyAgICAgICAgICAgIC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0
b3IKKyAgICAgICAgICAgIGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBd
ICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKKyAgICAgICAgICAgICAgICAvLyBT
ZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMK
KyAgICAgICAgICAgICAgICBpZiAoIChzZWVkID0gZmluZCgKKyAgICAgICAgICAgICAgICAgICAg
dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAorICAgICAg
ICAgICAgICAgICAgICByc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250
ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CisgICAgICAgICAgICAgICAgKSkg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tl
bnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5CisgICAgICAgICAgICAgICAgICAgIHRva2Vu
cy5zcGxpY2UoIGksIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWVkLmxl
bmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAh
c2VsZWN0b3IgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRz
LCBzZWVkICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbXBp
bGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRl
ZAorICAgIC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBt
b2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmUKKyAgICAoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNl
bGVjdG9yLCBtYXRjaCApICkoCisgICAgICAgIHNlZWQsCisgICAgICAgIGNvbnRleHQsCisgICAg
ICAgICFkb2N1bWVudElzSFRNTCwKKyAgICAgICAgcmVzdWx0cywKKyAgICAgICAgIWNvbnRleHQg
fHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJl
bnROb2RlICkgfHwgY29udGV4dAorICAgICk7CisgICAgcmV0dXJuIHJlc3VsdHM7Cit9OworCisv
LyBPbmUtdGltZSBhc3NpZ25tZW50cworCisvLyBTb3J0IHN0YWJpbGl0eQorc3VwcG9ydC5zb3J0
U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09
IGV4cGFuZG87CisKKy8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNSsKKy8vIEFsd2F5cyBhc3N1bWUg
ZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rp
b24KK3N1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlOworCisvLyBJbml0
aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKK3NldERvY3VtZW50KCk7CisKKy8v
IFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBp
biBDaHJvbWUgMjcpCisvLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFj
aCBvdGhlcioKK3N1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkg
eworICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKQorICAg
IHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJkaXYiKSApICYgMTsKK30pOworCisvLyBTdXBwb3J0OiBJRTw4CisvLyBQcmV2ZW50IGF0
dHJpYnV0ZS9wcm9wZXJ0eSAiaW50ZXJwb2xhdGlvbiIKKy8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHgKK2lmICggIWFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgeworICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9h
PiI7CisgICAgcmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAi
IyIgOworfSkgKSB7CisgICAgYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1
bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKKyAgICAgICAgaWYgKCAhaXNYTUwgKSB7Cisg
ICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCisvLyBT
dXBwb3J0OiBJRTw5CisvLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0
ZSgidmFsdWUiKQoraWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24o
IGRpdiApIHsKKyAgICBkaXYuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKKyAgICBkaXYuZmlyc3RD
aGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIiICk7CisgICAgcmV0dXJuIGRpdi5maXJzdENo
aWxkLmdldEF0dHJpYnV0ZSggInZhbHVlIiApID09PSAiIjsKK30pICkgeworICAgIGFkZEhhbmRs
ZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgeworICAgICAgICBpZiAo
ICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgKSB7Cisg
ICAgICAgICAgICByZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICB9KTsK
K30KKworLy8gU3VwcG9ydDogSUU8OQorLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2gg
Ym9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllcworaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBk
aXYgKSB7CisgICAgcmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsK
K30pICkgeworICAgIGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBp
c1hNTCApIHsKKyAgICAgICAgdmFyIHZhbDsKKyAgICAgICAgaWYgKCAhaXNYTUwgKSB7CisgICAg
ICAgICAgICByZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgp
IDoKKyAgICAgICAgICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFt
ZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KKyAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
KyAgICAgICAgICAgICAgICBudWxsOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3JldHVybiBT
aXp6bGU7CisKK30pKCB3aW5kb3cgKTsKKworCisKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1
ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOworalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5
LmV4cHIucHNldWRvczsKK2pRdWVyeS51bmlxdWVTb3J0ID0galF1ZXJ5LnVuaXF1ZSA9IFNpenps
ZS51bmlxdWVTb3J0OworalF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDsKK2pRdWVyeS5pc1hN
TERvYyA9IFNpenpsZS5pc1hNTDsKK2pRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsK
KworCisKK3ZhciBkaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKKyAgICB2YXIg
bWF0Y2hlZCA9IFtdLAorICAgICAgICB0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CisK
KyAgICB3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0g
OSApIHsKKyAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAg
aWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoZWQucHVzaCgg
ZWxlbSApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXRjaGVkOworfTsKKworCit2
YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHsKKyAgICB2YXIgbWF0Y2hlZCA9IFtd
OworCisgICAgZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHsKKyAgICAgICAgaWYgKCBu
Lm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CisgICAgICAgICAgICBtYXRjaGVkLnB1
c2goIG4gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXRjaGVkOworfTsKKwor
Cit2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKKwor
dmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbXHctXSspXHMqXC8/Pig/OjxcL1wxPnwpJC8gKTsKKwor
CisKK3ZhciByaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOworCisvLyBJbXBsZW1lbnQgdGhl
IGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdAorZnVuY3Rpb24gd2lu
bm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7CisgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggcXVhbGlmaWVyICkgKSB7CisgICAgICAgIHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVu
dHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworICAgICAgICAgICAgLyoganNoaW50IC1XMDE4ICov
CisgICAgICAgICAgICByZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9
PSBub3Q7CisgICAgICAgIH0gKTsKKworICAgIH0KKworICAgIGlmICggcXVhbGlmaWVyLm5vZGVU
eXBlICkgeworICAgICAgICByZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbigg
ZWxlbSApIHsKKyAgICAgICAgICAgIHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBu
b3Q7CisgICAgICAgIH0gKTsKKworICAgIH0KKworICAgIGlmICggdHlwZW9mIHF1YWxpZmllciA9
PT0gInN0cmluZyIgKSB7CisgICAgICAgIGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciAp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVu
dHMsIG5vdCApOworICAgICAgICB9CisKKyAgICAgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRl
ciggcXVhbGlmaWVyLCBlbGVtZW50cyApOworICAgIH0KKworICAgIHJldHVybiBqUXVlcnkuZ3Jl
cCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gKCBpbmRleE9m
LmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90OworICAgIH0gKTsKK30KKwor
alF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgeworICAgIHZhciBl
bGVtID0gZWxlbXNbIDAgXTsKKworICAgIGlmICggbm90ICkgeworICAgICAgICBleHByID0gIjpu
b3QoIiArIGV4cHIgKyAiKSI7CisgICAgfQorCisgICAgcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0g
MSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID8KKyAgICAgICAgalF1ZXJ5LmZpbmQubWF0Y2hlc1Nl
bGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDoKKyAgICAgICAgalF1ZXJ5LmZp
bmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICAgICAgICAgIHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworICAgICAgICB9ICkgKTsK
K307CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3Ig
KSB7CisgICAgICAgIHZhciBpLAorICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGgsCisgICAg
ICAgICAgICByZXQgPSBbXSwKKyAgICAgICAgICAgIHNlbGYgPSB0aGlzOworCisgICAgICAgIGlm
ICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICkgKTsKKyAgICAgICAgfQorCisgICAg
ICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICBqUXVlcnkuZmlu
ZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBO
ZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCAp
LmZpbmQoIHNlbGVjdG9yICkKKyAgICAgICAgcmV0ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEg
PyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApOworICAgICAgICByZXQuc2VsZWN0b3IgPSB0
aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciArICIgIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7
CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKyAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNl
bGVjdG9yIHx8IFtdLCBmYWxzZSApICk7CisgICAgfSwKKyAgICBub3Q6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNl
bGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKKyAgICB9LAorICAgIGlzOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7CisgICAgICAgIHJldHVybiAhIXdpbm5vdygKKyAgICAgICAgICAgIHRoaXMsCisKKyAg
ICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBj
aGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKKyAgICAgICAgICAgIC8vIHNvICQo
InA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGgg
dHdvICJwIi4KKyAgICAgICAgICAgIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgJiYgcm5l
ZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8KKyAgICAgICAgICAgICAgICBqUXVlcnkoIHNl
bGVjdG9yICkgOgorICAgICAgICAgICAgICAgIHNlbGVjdG9yIHx8IFtdLAorICAgICAgICAgICAg
ZmFsc2UKKyAgICAgICAgKS5sZW5ndGg7CisgICAgfQorfSApOworCisKKy8vIEluaXRpYWxpemUg
YSBqUXVlcnkgb2JqZWN0CisKKworLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBq
UXVlcnkoZG9jdW1lbnQpCit2YXIgcm9vdGpRdWVyeSwKKworICAgIC8vIEEgc2ltcGxlIHdheSB0
byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCisgICAgLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFn
PiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQorICAgIC8vIFN0cmljdCBI
VE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQorICAgIHJxdWlja0V4
cHIgPSAvXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAorCisgICAgaW5pdCA9
IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkgewor
ICAgICAgICB2YXIgbWF0Y2gsIGVsZW07CisKKyAgICAgICAgLy8gSEFORExFOiAkKCIiKSwgJChu
dWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKQorICAgICAgICBpZiAoICFzZWxlY3RvciApIHsK
KyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWV0aG9k
IGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CisgICAgICAgIC8vIHNvIG1p
Z3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSkKKyAgICAgICAgcm9vdCA9IHJv
b3QgfHwgcm9vdGpRdWVyeTsKKworICAgICAgICAvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisgICAg
ICAgIGlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKyAgICAgICAgICAgIGlm
ICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCisgICAgICAgICAgICAgICAgc2VsZWN0b3JbIHNl
bGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gIj4iICYmCisgICAgICAgICAgICAgICAgc2VsZWN0b3Iu
bGVuZ3RoID49IDMgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdz
IHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBj
aGVjaworICAgICAgICAgICAgICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOwor
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hdGNoID0gcnF1aWNrRXhw
ci5leGVjKCBzZWxlY3RvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXRj
aCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCisgICAg
ICAgICAgICBpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgeworCisg
ICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisgICAgICAgICAg
ICAgICAgaWYgKCBtYXRjaFsgMSBdICkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0g
Y29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7CisKKyAg
ICAgICAgICAgICAgICAgICAgLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJh
Y2stY29tcGF0CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBl
cnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50CisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTCgKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1hdGNoWyAxIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0
ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6
IGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgICAg
ICAgICApICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKGh0bWwsIHByb3Bz
KQorICAgICAgICAgICAgICAgICAgICBpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSAp
ICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBp
ZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzRnVu
Y3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlcworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICAgICAgICAgIC8vIEhBTkRMRTogJCgjaWQpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsg
MiBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjYK
KyAgICAgICAgICAgICAgICAgICAgLy8gZ0VCSUQgcmV0dXJucyBub2RlcyBubyBsb25nZXIgaW4g
dGhlIGRvY3VtZW50ICgjNjk2MykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtICYmIGVs
ZW0ucGFyZW50Tm9kZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IHRo
ZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNb
IDAgXSA9IGVsZW07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICB0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxl
Y3RvciA9IHNlbGVjdG9yOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCisg
ICAgICAgICAgICB9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gKCBjb250ZXh0IHx8IHJvb3QgKS5maW5kKCBzZWxlY3RvciAp
OworCisgICAgICAgICAgICAvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKKyAgICAgICAgICAg
IC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1
Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgLy8gSEFORExFOiAkKERPTUVsZW1lbnQpCisgICAgICAgIH0gZWxzZSBpZiAoIHNlbGVjdG9y
Lm5vZGVUeXBlICkgeworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpc1sgMCBdID0gc2Vs
ZWN0b3I7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDE7CisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICAvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisgICAgICAgIC8vIFNob3J0
Y3V0IGZvciBkb2N1bWVudCByZWFkeQorICAgICAgICB9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggc2VsZWN0b3IgKSApIHsKKyAgICAgICAgICAgIHJldHVybiByb290LnJlYWR5ICE9PSB1
bmRlZmluZWQgPworICAgICAgICAgICAgICAgIHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgorCisg
ICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJl
c2VudAorICAgICAgICAgICAgICAgIHNlbGVjdG9yKCBqUXVlcnkgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAg
ICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMu
Y29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
alF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKKyAgICB9OworCisvLyBHaXZlIHRo
ZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0
aW9uCitpbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworLy8gSW5pdGlhbGl6ZSBjZW50cmFs
IHJlZmVyZW5jZQorcm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTsKKworCit2YXIgcnBh
cmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCisKKyAgICAvLyBN
ZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBm
cm9tIGEgdW5pcXVlIHNldAorICAgIGd1YXJhbnRlZWRVbmlxdWUgPSB7CisgICAgICAgIGNoaWxk
cmVuOiB0cnVlLAorICAgICAgICBjb250ZW50czogdHJ1ZSwKKyAgICAgICAgbmV4dDogdHJ1ZSwK
KyAgICAgICAgcHJldjogdHJ1ZQorICAgIH07CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBo
YXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CisgICAgICAgIHZhciB0YXJnZXRzID0galF1ZXJ5KCB0
YXJnZXQsIHRoaXMgKSwKKyAgICAgICAgICAgIGwgPSB0YXJnZXRzLmxlbmd0aDsKKworICAgICAg
ICByZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGkgPSAw
OworICAgICAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlm
ICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9ICk7CisgICAgfSwKKworICAgIGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMs
IGNvbnRleHQgKSB7CisgICAgICAgIHZhciBjdXIsCisgICAgICAgICAgICBpID0gMCwKKyAgICAg
ICAgICAgIGwgPSB0aGlzLmxlbmd0aCwKKyAgICAgICAgICAgIG1hdGNoZWQgPSBbXSwKKyAgICAg
ICAgICAgIHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNl
bGVjdG9ycyAhPT0gInN0cmluZyIgPworICAgICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3Jz
LCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoKKyAgICAgICAgICAgICAgICAwOworCisgICAg
ICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKKyAgICAgICAgICAgIGZvciAoIGN1ciA9IHRoaXNb
IGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CisK
KyAgICAgICAgICAgICAgICAvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHMKKyAgICAg
ICAgICAgICAgICBpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmICggcG9zID8KKyAgICAgICAgICAg
ICAgICAgICAgcG9zLmluZGV4KCBjdXIgKSA+IC0xIDoKKworICAgICAgICAgICAgICAgICAgICAv
LyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKKyAgICAgICAgICAgICAgICAgICAg
Y3VyLm5vZGVUeXBlID09PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZmlu
ZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICBtYXRjaGVkLnB1c2goIGN1ciApOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVT
b3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7CisgICAgfSwKKworICAgIC8vIERldGVybWluZSB0
aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldAorICAgIGluZGV4OiBmdW5j
dGlvbiggZWxlbSApIHsKKworICAgICAgICAvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGlu
IHBhcmVudAorICAgICAgICBpZiAoICFlbGVtICkgeworICAgICAgICAgICAgcmV0dXJuICggdGhp
c1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgp
Lmxlbmd0aCA6IC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5kZXggaW4gc2VsZWN0b3IK
KyAgICAgICAgaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CisgICAgICAg
IH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1l
bnQKKyAgICAgICAgcmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcywKKworICAgICAgICAgICAgLy8g
SWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2Vk
CisgICAgICAgICAgICBlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW0KKyAgICAgICAgKTsK
KyAgICB9LAorCisgICAgYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisgICAg
ICAgIHJldHVybiB0aGlzLnB1c2hTdGFjaygKKyAgICAgICAgICAgIGpRdWVyeS51bmlxdWVTb3J0
KAorICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxl
Y3RvciwgY29udGV4dCApICkKKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9LAorCisg
ICAgYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworICAgICAgICByZXR1cm4gdGhpcy5h
ZGQoIHNlbGVjdG9yID09IG51bGwgPworICAgICAgICAgICAgdGhpcy5wcmV2T2JqZWN0IDogdGhp
cy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQorICAgICAgICApOworICAgIH0KK30gKTsK
KworZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7CisgICAgd2hpbGUgKCAoIGN1ciA9IGN1
clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQorICAgIHJldHVybiBjdXI7Cit9
CisKK2pRdWVyeS5lYWNoKCB7CisgICAgcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAg
ICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKyAgICAgICAgcmV0dXJuIHBhcmVudCAm
JiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKKyAgICB9LAorICAgIHBh
cmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAicGFy
ZW50Tm9kZSIgKTsKKyAgICB9LAorICAgIHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGks
IHVudGlsICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGls
ICk7CisgICAgfSwKKyAgICBuZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJu
IHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKyAgICB9LAorICAgIHByZXY6IGZ1bmN0
aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2li
bGluZyIgKTsKKyAgICB9LAorICAgIG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAg
ICByZXR1cm4gZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciICk7CisgICAgfSwKKyAgICBwcmV2QWxs
OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAgcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3Vz
U2libGluZyIgKTsKKyAgICB9LAorICAgIG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVu
dGlsICkgeworICAgICAgICByZXR1cm4gZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCAp
OworICAgIH0sCisgICAgcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Cisg
ICAgICAgIHJldHVybiBkaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOworICAg
IH0sCisgICAgc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2li
bGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApOworICAg
IH0sCisgICAgY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgeworICAgICAgICByZXR1cm4gc2li
bGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApOworICAgIH0sCisgICAgY29udGVudHM6IGZ1bmN0aW9u
KCBlbGVtICkgeworICAgICAgICByZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgalF1ZXJ5
Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7CisgICAgfQorfSwgZnVuY3Rpb24oIG5hbWUs
IGZuICkgeworICAgIGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3Rv
ciApIHsKKyAgICAgICAgdmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwg
KTsKKworICAgICAgICBpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CisgICAg
ICAgICAgICBzZWxlY3RvciA9IHVudGlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBzZWxl
Y3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgbWF0
Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoIHRoaXMubGVuZ3RoID4gMSApIHsKKworICAgICAgICAgICAgLy8gUmVtb3Zl
IGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSAp
IHsKKyAgICAgICAgICAgICAgICBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQg
cHJldi1kZXJpdmF0aXZlcworICAgICAgICAgICAgaWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFt
ZSApICkgeworICAgICAgICAgICAgICAgIG1hdGNoZWQucmV2ZXJzZSgpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7
CisgICAgfTsKK30gKTsKK3ZhciBybm90d2hpdGUgPSAoIC9cUysvZyApOworCisKKworLy8gQ29u
dmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMK
K2Z1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7CisgICAgdmFyIG9iamVjdCA9IHt9
OworICAgIGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVu
Y3Rpb24oIF8sIGZsYWcgKSB7CisgICAgICAgIG9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKKyAgICB9
ICk7CisgICAgcmV0dXJuIG9iamVjdDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGNhbGxiYWNrIGxp
c3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoKKyAqICBvcHRpb25zOiBhbiBv
cHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2Ug
aG93CisgKiAgICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFk
aXRpb25hbCBvcHRpb24gb2JqZWN0CisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qg
d2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJl
ZCIgbXVsdGlwbGUgdGltZXMuCisgKgorICogUG9zc2libGUgb3B0aW9uczoKKyAqCisgKiAgb25j
ZTogICAgICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZp
cmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKKyAqCisgKiAgbWVtb3J5OiAgICAgICAgIHdpbGwg
a2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sg
YWRkZWQKKyAqICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQg
cmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXplZCIKKyAqICAgICAgICAgICAgICAg
ICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICogIHVuaXF1ZTogICAgICAgICB3aWxs
IGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBp
biB0aGUgbGlzdCkKKyAqCisgKiAgc3RvcE9uRmFsc2U6ICAgIGludGVycnVwdCBjYWxsaW5ncyB3
aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQorICoKKyAqLworalF1ZXJ5LkNhbGxiYWNrcyA9
IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCisgICAgLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3Ry
aW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZAorICAgIC8vICh3ZSBj
aGVjayBpbiBjYWNoZSBmaXJzdCkKKyAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09ICJz
dHJpbmciID8KKyAgICAgICAgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDoKKyAgICAgICAgalF1
ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKKworICAgIHZhciAvLyBGbGFnIHRvIGtub3cgaWYg
bGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCisgICAgICAgIGZpcmluZywKKworICAgICAgICAvLyBM
YXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cworICAgICAgICBtZW1vcnks
CisKKyAgICAgICAgLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKKyAg
ICAgICAgZmlyZWQsCisKKyAgICAgICAgLy8gRmxhZyB0byBwcmV2ZW50IGZpcmluZworICAgICAg
ICBsb2NrZWQsCisKKyAgICAgICAgLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKKyAgICAgICAgbGlz
dCA9IFtdLAorCisgICAgICAgIC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRh
YmxlIGxpc3RzCisgICAgICAgIHF1ZXVlID0gW10sCisKKyAgICAgICAgLy8gSW5kZXggb2YgY3Vy
cmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQp
CisgICAgICAgIGZpcmluZ0luZGV4ID0gLTEsCisKKyAgICAgICAgLy8gRmlyZSBjYWxsYmFja3MK
KyAgICAgICAgZmlyZSA9IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAgICAvLyBFbmZvcmNlIHNp
bmdsZS1maXJpbmcKKyAgICAgICAgICAgIGxvY2tlZCA9IG9wdGlvbnMub25jZTsKKworICAgICAg
ICAgICAgLy8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsCisg
ICAgICAgICAgICAvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGlt
ZSBjaGFuZ2VzCisgICAgICAgICAgICBmaXJlZCA9IGZpcmluZyA9IHRydWU7CisgICAgICAgICAg
ICBmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHsKKyAgICAgICAgICAg
ICAgICBtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpOworICAgICAgICAgICAgICAgIHdoaWxlICggKytm
aXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFJ1
biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uCisgICAgICAgICAgICAg
ICAgICAgIGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9y
eVsgMSBdICkgPT09IGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0
b3BPbkZhbHNlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIGVuZCBh
bmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCisgICAgICAgICAgICAg
ICAgICAgICAgICBmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoOworICAgICAgICAgICAgICAgICAg
ICAgICAgbWVtb3J5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmdldCB0aGUgZGF0YSBp
ZiB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIGlmICggIW9wdGlvbnMubWVtb3J5ICkg
eworICAgICAgICAgICAgICAgIG1lbW9yeSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBmaXJpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2xlYW4gdXAgaWYgd2Un
cmUgZG9uZSBmaXJpbmcgZm9yIGdvb2QKKyAgICAgICAgICAgIGlmICggbG9ja2VkICkgeworCisg
ICAgICAgICAgICAgICAgLy8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3Ig
ZnV0dXJlIGFkZCBjYWxscworICAgICAgICAgICAgICAgIGlmICggbWVtb3J5ICkgeworICAgICAg
ICAgICAgICAgICAgICBsaXN0ID0gW107CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Us
IHRoaXMgb2JqZWN0IGlzIHNwZW50CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAgICAgbGlzdCA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSwKKworICAgICAgICAvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdAorICAgICAg
ICBzZWxmID0geworCisgICAgICAgICAgICAvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rp
b24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgIGlmICggbGlzdCApIHsKKworICAgICAgICAgICAgICAgICAgICAv
LyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVy
IGFkZGluZworICAgICAgICAgICAgICAgICAgICBpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKCBtZW1vcnkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICggZnVuY3Rpb24gYWRkKCBhcmdzICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBf
LCBhcmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggYXJnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW9w
dGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBsaXN0LnB1c2goIGFyZyApOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXJn
ICYmIGFyZy5sZW5ndGggJiYgalF1ZXJ5LnR5cGUoIGFyZyApICE9PSAic3RyaW5nIiApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCggYXJnICk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSApOworICAgICAgICAg
ICAgICAgICAgICB9ICkoIGFyZ3VtZW50cyApOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
bWVtb3J5ICYmICFmaXJpbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlKCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBSZW1vdmUgYSBj
YWxsYmFjayBmcm9tIHRoZSBsaXN0CisgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKCkgewor
ICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcg
KSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4g
LTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnNwbGljZSggaW5kZXgsIDEgKTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZpcmluZ0luZGV4LS07CisgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAv
LyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgorICAgICAgICAgICAg
Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhh
cyBjYWxsYmFja3MgYXR0YWNoZWQuCisgICAgICAgICAgICBoYXM6IGZ1bmN0aW9uKCBmbiApIHsK
KyAgICAgICAgICAgICAgICByZXR1cm4gZm4gPworICAgICAgICAgICAgICAgICAgICBqUXVlcnku
aW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDoKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5sZW5n
dGggPiAwOworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBjYWxs
YmFja3MgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgZW1wdHk6IGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgICAgIGlmICggbGlzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA9IFtd
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAg
ICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGQKKyAgICAg
ICAgICAgIC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9ucworICAgICAgICAg
ICAgLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCisgICAgICAgICAgICBkaXNhYmxl
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBsb2NrZWQgPSBxdWV1ZSA9IFtdOworICAg
ICAgICAgICAgICAgIGxpc3QgPSBtZW1vcnkgPSAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkaXNhYmxlZDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgICAgICAgcmV0dXJuICFsaXN0OworICAgICAgICAgICAgfSwKKworICAgICAg
ICAgICAgLy8gRGlzYWJsZSAuZmlyZQorICAgICAgICAgICAgLy8gQWxzbyBkaXNhYmxlIC5hZGQg
dW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdCkKKyAg
ICAgICAgICAgIC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKKyAgICAgICAgICAgIGxv
Y2s6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGxvY2tlZCA9IHF1ZXVlID0gW107Cisg
ICAgICAgICAgICAgICAgaWYgKCAhbWVtb3J5ICkgeworICAgICAgICAgICAgICAgICAgICBsaXN0
ID0gbWVtb3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGxvY2tlZDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgICAgICAgcmV0dXJuICEhbG9ja2VkOworICAgICAgICAgICAgfSwKKworICAg
ICAgICAgICAgLy8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5k
IGFyZ3VtZW50cworICAgICAgICAgICAgZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdz
ICkgeworICAgICAgICAgICAgICAgIGlmICggIWxvY2tlZCApIHsKKyAgICAgICAgICAgICAgICAg
ICAgYXJncyA9IGFyZ3MgfHwgW107CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbIGNvbnRl
eHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07CisgICAgICAgICAgICAgICAg
ICAgIHF1ZXVlLnB1c2goIGFyZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhZmlyaW5n
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSgpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAg
ICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRo
IHRoZSBnaXZlbiBhcmd1bWVudHMKKyAgICAgICAgICAgIGZpcmU6IGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgICAgIHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOworICAgICAgICAg
ICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gVG8g
a25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBv
bmNlCisgICAgICAgICAgICBmaXJlZDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0
dXJuICEhZmlyZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICByZXR1cm4gc2Vs
ZjsKK307CisKKworalF1ZXJ5LmV4dGVuZCggeworCisgICAgRGVmZXJyZWQ6IGZ1bmN0aW9uKCBm
dW5jICkgeworICAgICAgICB2YXIgdHVwbGVzID0gWworCisgICAgICAgICAgICAgICAgLy8gYWN0
aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlCisgICAgICAgICAg
ICAgICAgWyAicmVzb2x2ZSIsICJkb25lIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5
IiApLCAicmVzb2x2ZWQiIF0sCisgICAgICAgICAgICAgICAgWyAicmVqZWN0IiwgImZhaWwiLCBq
UXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksICJyZWplY3RlZCIgXSwKKyAgICAgICAg
ICAgICAgICBbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5
IiApIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBzdGF0ZSA9ICJwZW5kaW5nIiwKKyAg
ICAgICAgICAgIHByb21pc2UgPSB7CisgICAgICAgICAgICAgICAgc3RhdGU6IGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAgICAgfSwK
KyAgICAgICAgICAgICAgICBhbHdheXM6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAg
ICBkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTsKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
ICAgICB0aGVuOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7
CisgICAgICAgICAgICAgICAgICAgIHZhciBmbnMgPSBhcmd1bWVudHM7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0
dXBsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBqUXVlcnkuaXNG
dW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRp
bmcgYWN0aW9ucyB0byBuZXdEZWZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVy
cmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmV0dXJuZWQgJiYgalF1ZXJ5
LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybmVkLnByb21pc2UoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSAp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZhaWwoIG5ld0RlZmVy
LnJlamVjdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGVmZXJbIHR1cGxlWyAwIF0gKyAi
V2l0aCIgXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzID09
PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50cworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZucyA9IG51bGw7
CisgICAgICAgICAgICAgICAgICAgIH0gKS5wcm9taXNlKCk7CisgICAgICAgICAgICAgICAgfSwK
KworICAgICAgICAgICAgICAgIC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWQKKyAg
ICAgICAgICAgICAgICAvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBp
cyBhZGRlZCB0byB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgcHJvbWlzZTogZnVuY3Rpb24o
IG9iaiApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5
LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWZlcnJlZCA9IHt9OworCisgICAgICAgIC8vIEtl
ZXAgcGlwZSBmb3IgYmFjay1jb21wYXQKKyAgICAgICAgcHJvbWlzZS5waXBlID0gcHJvbWlzZS50
aGVuOworCisgICAgICAgIC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHMKKyAgICAgICAgalF1
ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworICAgICAgICAgICAgdmFy
IGxpc3QgPSB0dXBsZVsgMiBdLAorICAgICAgICAgICAgICAgIHN0YXRlU3RyaW5nID0gdHVwbGVb
IDMgXTsKKworICAgICAgICAgICAgLy8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBd
ID0gbGlzdC5hZGQKKyAgICAgICAgICAgIHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRk
OworCisgICAgICAgICAgICAvLyBIYW5kbGUgc3RhdGUKKyAgICAgICAgICAgIGlmICggc3RhdGVT
dHJpbmcgKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoIGZ1bmN0aW9uKCkgeworCisgICAg
ICAgICAgICAgICAgICAgIC8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0cmluZzsKKworICAgICAgICAgICAgICAgIC8v
IFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0Lmxv
Y2sKKyAgICAgICAgICAgICAgICB9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBs
ZXNbIDIgXVsgMiBdLmxvY2sgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVm
ZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQorICAgICAgICAgICAgZGVmZXJyZWRb
IHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGRlZmVycmVkWyB0
dXBsZVsgMCBdICsgIldpdGgiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gcHJvbWlzZSA6IHRoaXMs
IGFyZ3VtZW50cyApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAg
fTsKKyAgICAgICAgICAgIGRlZmVycmVkWyB0dXBsZVsgMCBdICsgIldpdGgiIF0gPSBsaXN0LmZp
cmVXaXRoOworICAgICAgICB9ICk7CisKKyAgICAgICAgLy8gTWFrZSB0aGUgZGVmZXJyZWQgYSBw
cm9taXNlCisgICAgICAgIHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTsKKworICAgICAgICAv
LyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55CisgICAgICAgIGlmICggZnVuYyApIHsKKyAgICAgICAg
ICAgIGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBBbGwgZG9uZSEKKyAgICAgICAgcmV0dXJuIGRlZmVycmVkOworICAgIH0sCisKKyAgICAv
LyBEZWZlcnJlZCBoZWxwZXIKKyAgICB3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAu
Li4sIHN1Ym9yZGluYXRlTiAqLyApIHsKKyAgICAgICAgdmFyIGkgPSAwLAorICAgICAgICAgICAg
cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAorICAgICAgICAgICAgbGVu
Z3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsCisKKyAgICAgICAgICAgIC8vIHRoZSBjb3VudCBv
ZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IGxlbmd0
aCAhPT0gMSB8fAorICAgICAgICAgICAgICAgICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVu
Y3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKKworICAgICAgICAg
ICAgLy8gdGhlIG1hc3RlciBEZWZlcnJlZC4KKyAgICAgICAgICAgIC8vIElmIHJlc29sdmVWYWx1
ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgorICAg
ICAgICAgICAgZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVy
eS5EZWZlcnJlZCgpLAorCisgICAgICAgICAgICAvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGgg
cmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzCisgICAgICAgICAgICB1cGRhdGVGdW5jID0gZnVu
Y3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dHNbIGkgXSA9IHRo
aXM7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+
IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHZhbHVlcyA9PT0gcHJvZ3Jlc3NWYWx1ZXMgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CisgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0sCisK
KyAgICAgICAgICAgIHByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29u
dGV4dHM7CisKKyAgICAgICAgLy8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0
ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZAorICAgICAgICBpZiAoIGxlbmd0aCA+IDEgKSB7
CisgICAgICAgICAgICBwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CisgICAg
ICAgICAgICBwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKyAgICAgICAg
ICAgIHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CisgICAgICAgICAgICBm
b3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlc29sdmVW
YWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21p
c2UgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2Uo
KQorICAgICAgICAgICAgICAgICAgICAgICAgLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9n
cmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICkKKyAgICAgICAgICAgICAgICAgICAgICAg
IC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSAp
CisgICAgICAgICAgICAgICAgICAgICAgICAuZmFpbCggZGVmZXJyZWQucmVqZWN0ICk7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLS1yZW1haW5pbmc7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8g
SWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlcgorICAg
ICAgICBpZiAoICFyZW1haW5pbmcgKSB7CisgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0
aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOworICAgIH0KK30gKTsKKworCisvLyBUaGUgZGVm
ZXJyZWQgdXNlZCBvbiBET00gcmVhZHkKK3ZhciByZWFkeUxpc3Q7CisKK2pRdWVyeS5mbi5yZWFk
eSA9IGZ1bmN0aW9uKCBmbiApIHsKKworICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sKKyAgICBqUXVl
cnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7CisKKyAgICByZXR1cm4gdGhpczsKK307CisK
K2pRdWVyeS5leHRlbmQoIHsKKworICAgIC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8g
U2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCisgICAgaXNSZWFkeTogZmFsc2UsCisKKyAgICAv
LyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCisg
ICAgLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKKyAgICByZWFkeVdhaXQ6IDEs
CisKKyAgICAvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKKyAgICBob2xkUmVh
ZHk6IGZ1bmN0aW9uKCBob2xkICkgeworICAgICAgICBpZiAoIGhvbGQgKSB7CisgICAgICAgICAg
ICBqUXVlcnkucmVhZHlXYWl0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqUXVl
cnkucmVhZHkoIHRydWUgKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvLyBIYW5kbGUgd2hl
biB0aGUgRE9NIGlzIHJlYWR5CisgICAgcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgeworCisgICAg
ICAgIC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkg
cmVhZHkKKyAgICAgICAgaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDog
alF1ZXJ5LmlzUmVhZHkgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICAvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKyAgICAgICAgalF1ZXJ5Lmlz
UmVhZHkgPSB0cnVlOworCisgICAgICAgIC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBm
aXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlCisgICAgICAgIGlmICggd2FpdCAh
PT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgeworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwg
dG8gZXhlY3V0ZQorICAgICAgICByZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpR
dWVyeSBdICk7CisKKyAgICAgICAgLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisg
ICAgICAgIGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkgeworICAgICAgICAgICAgalF1
ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCAicmVhZHkiICk7CisgICAgICAgICAgICBq
UXVlcnkoIGRvY3VtZW50ICkub2ZmKCAicmVhZHkiICk7CisgICAgICAgIH0KKyAgICB9Cit9ICk7
CisKKy8qKgorICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRo
b2QKKyAqLworZnVuY3Rpb24gY29tcGxldGVkKCkgeworICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50
TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7CisgICAgd2luZG93LnJl
bW92ZUV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxldGVkICk7CisgICAgalF1ZXJ5LnJlYWR5
KCk7Cit9CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKKyAgICBp
ZiAoICFyZWFkeUxpc3QgKSB7CisKKyAgICAgICAgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVk
KCk7CisKKyAgICAgICAgLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBp
cyBjYWxsZWQKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkg
b2NjdXJyZWQuCisgICAgICAgIC8vIFN1cHBvcnQ6IElFOS0xMCBvbmx5CisgICAgICAgIC8vIE9s
ZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzICJpbnRlcmFjdGl2ZSIgdG9vIHNvb24KKyAgICAgICAg
aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8CisgICAgICAgICAgICAo
IGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICJsb2FkaW5nIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRF
bGVtZW50LmRvU2Nyb2xsICkgKSB7CisKKyAgICAgICAgICAgIC8vIEhhbmRsZSBpdCBhc3luY2hy
b25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQor
ICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOworCisgICAgICAg
IH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sK
KyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVk
IiwgY29tcGxldGVkICk7CisKKyAgICAgICAgICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9u
bG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCisgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRM
aXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApOworfTsKKworLy8gS2ljayBvZmYgdGhlIERPTSBy
ZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90CitqUXVlcnkucmVhZHkucHJvbWlz
ZSgpOworCisKKworCisvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZh
bHVlcyBvZiBhIGNvbGxlY3Rpb24KKy8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4
ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgordmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywg
Zm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKyAgICB2YXIgaSA9
IDAsCisgICAgICAgIGxlbiA9IGVsZW1zLmxlbmd0aCwKKyAgICAgICAgYnVsayA9IGtleSA9PSBu
dWxsOworCisgICAgLy8gU2V0cyBtYW55IHZhbHVlcworICAgIGlmICggalF1ZXJ5LnR5cGUoIGtl
eSApID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgY2hhaW5hYmxlID0gdHJ1ZTsKKyAgICAgICAg
Zm9yICggaSBpbiBrZXkgKSB7CisgICAgICAgICAgICBhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5
WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKKyAgICAgICAgfQorCisgICAgLy8gU2V0cyBv
bmUgdmFsdWUKKyAgICB9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworICAgICAg
ICBjaGFpbmFibGUgPSB0cnVlOworCisgICAgICAgIGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2
YWx1ZSApICkgeworICAgICAgICAgICAgcmF3ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICggYnVsayApIHsKKworICAgICAgICAgICAgLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2Fp
bnN0IHRoZSBlbnRpcmUgc2V0CisgICAgICAgICAgICBpZiAoIHJhdyApIHsKKyAgICAgICAgICAg
ICAgICBmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBmbiA9IG51bGw7
CisKKyAgICAgICAgICAgIC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1
ZXMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVsayA9IGZuOworICAg
ICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApOwor
ICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGZuICkgeworICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgZm4oCisgICAgICAgICAgICAgICAgICAgIGVsZW1zWyBpIF0sIGtleSwgcmF3ID8K
KyAgICAgICAgICAgICAgICAgICAgdmFsdWUgOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZS5j
YWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQorICAgICAgICAgICAg
ICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hh
aW5hYmxlID8KKyAgICAgICAgZWxlbXMgOgorCisgICAgICAgIC8vIEdldHMKKyAgICAgICAgYnVs
ayA/CisgICAgICAgICAgICBmbi5jYWxsKCBlbGVtcyApIDoKKyAgICAgICAgICAgIGxlbiA/IGZu
KCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0OworfTsKK3ZhciBhY2NlcHREYXRhID0gZnVu
Y3Rpb24oIG93bmVyICkgeworCisgICAgLy8gQWNjZXB0cyBvbmx5OgorICAgIC8vICAtIE5vZGUK
KyAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFCisgICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5U
X05PREUKKyAgICAvLyAgLSBPYmplY3QKKyAgICAvLyAgICAtIEFueQorICAgIC8qIGpzaGludCAt
VzAxOCAqLworICAgIHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlw
ZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTsKK307CisKKworCisKK2Z1bmN0aW9uIERh
dGEoKSB7CisgICAgdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwor
fQorCitEYXRhLnVpZCA9IDE7CisKK0RhdGEucHJvdG90eXBlID0geworCisgICAgcmVnaXN0ZXI6
IGZ1bmN0aW9uKCBvd25lciwgaW5pdGlhbCApIHsKKyAgICAgICAgdmFyIHZhbHVlID0gaW5pdGlh
bCB8fCB7fTsKKworICAgICAgICAvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3Ry
aW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyCisgICAgICAgIC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50
CisgICAgICAgIGlmICggb3duZXIubm9kZVR5cGUgKSB7CisgICAgICAgICAgICBvd25lclsgdGhp
cy5leHBhbmRvIF0gPSB2YWx1ZTsKKworICAgICAgICAvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGlu
IGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eQorICAgICAgICAvLyBjb25m
aWd1cmFiaWxpdHkgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQorICAg
ICAgICAvLyBkZWxldGVkIHdpdGggdGhlIGRlbGV0ZSBvcGVyYXRvcgorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRv
LCB7CisgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICAgICAgICAgIHdyaXRh
YmxlOiB0cnVlLAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQorICAgICAgICAg
ICAgfSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvd25lclsgdGhpcy5leHBhbmRvIF07
CisgICAgfSwKKyAgICBjYWNoZTogZnVuY3Rpb24oIG93bmVyICkgeworCisgICAgICAgIC8vIFdl
IGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJz
LAorICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LgorICAgICAgICAvLyBB
bHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC4KKyAgICAgICAgaWYgKCAhYWNjZXB0RGF0YSgg
b3duZXIgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZQorICAgICAg
ICB2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CisKKyAgICAgICAgLy8gSWYgbm90
LCBjcmVhdGUgb25lCisgICAgICAgIGlmICggIXZhbHVlICkgeworICAgICAgICAgICAgdmFsdWUg
PSB7fTsKKworICAgICAgICAgICAgLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVu
dCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCisgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxk
IG5vdCwgc2VlICM4MzM1LgorICAgICAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBv
YmplY3QuCisgICAgICAgICAgICBpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CisKKyAgICAg
ICAgICAgICAgICAvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVk
IG9yIGxvb3BlZCBvdmVyCisgICAgICAgICAgICAgICAgLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQK
KyAgICAgICAgICAgICAgICBpZiAoIG93bmVyLm5vZGVUeXBlICkgeworICAgICAgICAgICAgICAg
ICAgICBvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTsKKworICAgICAgICAgICAgICAgIC8v
IE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eQorICAgICAg
ICAgICAgICAgIC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3Bl
cnR5IHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3Zl
ZAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywgeworICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxl
OiB0cnVlCisgICAgICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSwKKyAg
ICBzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CisgICAgICAgIHZhciBwcm9w
LAorICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApOworCisgICAgICAgIC8v
IEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3MKKyAgICAgICAgaWYgKCB0eXBlb2Yg
ZGF0YSA9PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBjYWNoZVsgZGF0YSBdID0gdmFsdWU7
CisKKyAgICAgICAgLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKKyAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUt
Ynktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKKyAgICAgICAgICAgIGZvciAoIHByb3AgaW4gZGF0
YSApIHsKKyAgICAgICAgICAgICAgICBjYWNoZVsgcHJvcCBdID0gZGF0YVsgcHJvcCBdOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICB9LAorICAg
IGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CisgICAgICAgIHJldHVybiBrZXkgPT09IHVu
ZGVmaW5lZCA/CisgICAgICAgICAgICB0aGlzLmNhY2hlKCBvd25lciApIDoKKyAgICAgICAgICAg
IG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGtleSBdOwor
ICAgIH0sCisgICAgYWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7CisgICAg
ICAgIHZhciBzdG9yZWQ7CisKKyAgICAgICAgLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgorICAg
ICAgICAvLworICAgICAgICAvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkCisgICAgICAgIC8v
ICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAor
ICAgICAgICAvLworICAgICAgICAvLyBUYWtlIHRoZSAicmVhZCIgcGF0aCBhbmQgYWxsb3cgdGhl
IGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lCisgICAgICAgIC8vIHdoaWNoIHZhbHVlIHRvIHJldHVy
biwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAxLiBUaGUg
ZW50aXJlIGNhY2hlIG9iamVjdAorICAgICAgICAvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0
aGUga2V5CisgICAgICAgIC8vCisgICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwKKyAg
ICAgICAgICAgICAgICAoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFs
dWUgPT09IHVuZGVmaW5lZCApICkgeworCisgICAgICAgICAgICBzdG9yZWQgPSB0aGlzLmdldCgg
b3duZXIsIGtleSApOworCisgICAgICAgICAgICByZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQg
PworICAgICAgICAgICAgICAgIHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVs
Q2FzZSgga2V5ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gdGhlIGtleSBpcyBu
b3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlCisgICAgICAgIC8vIGFyZSBzcGVj
aWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgorICAg
ICAgICAvLworICAgICAgICAvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzCisgICAgICAg
IC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCisgICAgICAgIC8vCisgICAgICAgIHRoaXMuc2V0KCBv
d25lciwga2V5LCB2YWx1ZSApOworCisgICAgICAgIC8vIFNpbmNlIHRoZSAic2V0IiBwYXRoIGNh
biBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHMKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBl
eHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdCisgICAgICAgIHJl
dHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7CisgICAgfSwKKyAgICByZW1v
dmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkgeworICAgICAgICB2YXIgaSwgbmFtZSwgY2FtZWws
CisgICAgICAgICAgICBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKKworICAgICAgICBp
ZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgdGhp
cy5yZWdpc3Rlciggb3duZXIgKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAv
LyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5cworICAgICAg
ICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7CisKKyAgICAgICAgICAgICAgICAv
LyBJZiAibmFtZSIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLgorICAgICAgICAgICAgICAgIC8vIFdo
ZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhICgia2V5IiwgInZhbCIpIHNpZ25hdHVy
ZSwKKyAgICAgICAgICAgICAgICAvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2Fz
ZS4KKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93
XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZQorICAgICAgICAgICAgICAgIC8vIGJvdGggcGxhaW4g
a2V5IGFuZCBjYW1lbENhc2Uga2V5LiAjMTI3ODYKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdp
bGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC4KKyAgICAgICAgICAgICAg
ICBuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbWVsID0galF1ZXJ5LmNhbWVsQ2Fz
ZSgga2V5ICk7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBi
ZWZvcmUgYW55IG1hbmlwdWxhdGlvbgorICAgICAgICAgICAgICAgIGlmICgga2V5IGluIGNhY2hl
ICkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gWyBrZXksIGNhbWVsIF07CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGtleSB3aXRo
IHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuCisgICAgICAgICAgICAgICAgICAgIC8vIE90aGVy
d2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCisgICAgICAg
ICAgICAgICAgICAgIG5hbWUgPSBjYW1lbDsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5h
bWUgaW4gY2FjaGUgPworICAgICAgICAgICAgICAgICAgICAgICAgWyBuYW1lIF0gOiAoIG5hbWUu
bWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpID0gbmFtZS5sZW5ndGg7CisKKyAgICAgICAgICAgIHdoaWxl
ICggaS0tICkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVsgbmFtZVsgaSBdIF07Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZG8g
aWYgdGhlcmUncyBubyBtb3JlIGRhdGEKKyAgICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8
fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKKworICAgICAgICAgICAgLy8gU3Vw
cG9ydDogQ2hyb21lIDw9IDM1LTQ1KworICAgICAgICAgICAgLy8gV2Via2l0ICYgQmxpbmsgcGVy
Zm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8v
IGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWQKKyAgICAgICAgICAg
IC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0z
Nzg2MDcKKyAgICAgICAgICAgIGlmICggb3duZXIubm9kZVR5cGUgKSB7CisgICAgICAgICAgICAg
ICAgb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICBoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIg
KSB7CisgICAgICAgIHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKKyAgICAgICAg
cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNo
ZSApOworICAgIH0KK307Cit2YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpOworCit2YXIgZGF0YVVz
ZXIgPSBuZXcgRGF0YSgpOworCisKKworLy8gIEltcGxlbWVudGF0aW9uIFN1bW1hcnkKKy8vCisv
LyAgMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRo
IDEuOS54IGJyYW5jaAorLy8gIDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0
eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZQorLy8gICAgICBwYXRocyB0byBhIHNpbmdsZSBtZWNo
YW5pc20uCisvLyAgMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAi
cHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgorLy8gIDQuIF9OZXZlcl8gZXhwb3NlICJwcml2YXRl
IiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpCisvLyAg
NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMg
KGVnLiBleHBhbmRvIHByb3BlcnRpZXMpCisvLyAgNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9y
IGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0CisKK3ZhciByYnJhY2Ug
PSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAorICAgIHJtdWx0aURhc2ggPSAvW0Et
Wl0vZzsKKworZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKKyAgICB2YXIg
bmFtZTsKKworICAgIC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBm
ZXRjaCBhbnkKKyAgICAvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUKKyAg
ICBpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAg
ICAgICBuYW1lID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQmIiApLnRv
TG93ZXJDYXNlKCk7CisgICAgICAgIGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwor
CisgICAgICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgeworICAgICAgICAgICAg
dHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSA9PT0gInRydWUiID8gdHJ1ZSA6Cisg
ICAgICAgICAgICAgICAgICAgIGRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CisgICAgICAgICAg
ICAgICAgICAgIGRhdGEgPT09ICJudWxsIiA/IG51bGwgOgorCisgICAgICAgICAgICAgICAgICAg
IC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3Ry
aW5nCisgICAgICAgICAgICAgICAgICAgICtkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6Cisg
ICAgICAgICAgICAgICAgICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09O
KCBkYXRhICkgOgorICAgICAgICAgICAgICAgICAgICBkYXRhOworICAgICAgICAgICAgfSBjYXRj
aCAoIGUgKSB7fQorCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNv
IGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKKyAgICAgICAgICAgIGRhdGFVc2VyLnNldCggZWxlbSwg
a2V5LCBkYXRhICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gdW5kZWZp
bmVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkYXRhOworfQorCitqUXVlcnkuZXh0
ZW5kKCB7CisgICAgaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgIHJldHVybiBk
YXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApOworICAg
IH0sCisKKyAgICBkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKKyAgICAgICAg
cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOworICAgIH0sCisKKyAg
ICByZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAgICAgZGF0YVVzZXIu
cmVtb3ZlKCBlbGVtLCBuYW1lICk7CisgICAgfSwKKworICAgIC8vIFRPRE86IE5vdyB0aGF0IGFs
bCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkCisgICAg
Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRl
cHJlY2F0ZWQuCisgICAgX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgeworICAg
ICAgICByZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7CisgICAgfSwK
KworICAgIF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKyAgICAgICAgZGF0
YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisgICAgfQorfSApOworCitqUXVlcnkuZm4uZXh0
ZW5kKCB7CisgICAgZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CisgICAgICAgIHZhciBp
LCBuYW1lLCBkYXRhLAorICAgICAgICAgICAgZWxlbSA9IHRoaXNbIDAgXSwKKyAgICAgICAgICAg
IGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7CisKKyAgICAgICAgLy8gR2V0cyBhbGwg
dmFsdWVzCisgICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICBp
ZiAoIHRoaXMubGVuZ3RoICkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhVXNlci5nZXQo
IGVsZW0gKTsKKworICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAh
ZGF0YVByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiApICkgeworICAgICAgICAgICAgICAg
ICAgICBpID0gYXR0cnMubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUUxMSsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0
KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhdHRyc1sgaSBdICkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5h
bWUuc2xpY2UoIDUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXR0
ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIGRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRy
dWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0cyBtdWx0aXBsZSB2YWx1ZXMK
KyAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGRhdGFVc2VyLnNl
dCggdGhpcywga2V5ICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIg
ZGF0YSwgY2FtZWxLZXk7CisKKyAgICAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmpl
Y3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CisgICAgICAgICAgICAvLyAoYW5kIHRo
ZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZQorICAg
ICAgICAgICAgLy8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5
IGpRdWVyeSBvYmplY3QKKyAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRg
IGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKKyAgICAgICAgICAgIC8vIHRocm93IGFu
IGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuCisg
ICAgICAgICAgICBpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAg
ICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKyAgICAgICAg
ICAgICAgICAvLyB3aXRoIHRoZSBrZXkgYXMtaXMKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0
YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKSB8fAorCisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0
byBmaW5kIGRhc2hlZCBrZXkgaWYgaXQgZXhpc3RzIChnaC0yNzc5KQorICAgICAgICAgICAgICAg
ICAgICAvLyBUaGlzIGlzIGZvciAyLjIueCBvbmx5CisgICAgICAgICAgICAgICAgICAgIGRhdGFV
c2VyLmdldCggZWxlbSwga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNh
c2UoKSApOworCisgICAgICAgICAgICAgICAgaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7CisKKyAgICAg
ICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCisgICAgICAg
ICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAorICAgICAgICAgICAgICAgIGRhdGEg
PSBkYXRhVXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7CisgICAgICAgICAgICAgICAgaWYgKCBk
YXRhICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gImRpc2Nv
dmVyIiB0aGUgZGF0YSBpbgorICAgICAgICAgICAgICAgIC8vIEhUTUw1IGN1c3RvbSBkYXRhLSog
YXR0cnMKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1
bmRlZmluZWQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vz
bid0IGV4aXN0LgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gU2V0IHRoZSBkYXRhLi4uCisgICAgICAgICAgICBjYW1lbEtleSA9IGpRdWVy
eS5jYW1lbENhc2UoIGtleSApOworICAgICAgICAgICAgdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsK
KworICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBhdHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciBy
ZWZlcmVuY2Ugb2YgYW55CisgICAgICAgICAgICAgICAgLy8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJl
ZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5LgorICAgICAgICAgICAgICAgIHZhciBkYXRh
ID0gZGF0YVVzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApOworCisgICAgICAgICAgICAgICAgLy8g
Rm9yIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUgaW50ZXJvcCwgd2UgaGF2ZSB0bworICAgICAgICAg
ICAgICAgIC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNl
IGZvcm0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHBy
b3BlcnRpZXMuLi4qCisgICAgICAgICAgICAgICAgZGF0YVVzZXIuc2V0KCB0aGlzLCBjYW1lbEtl
eSwgdmFsdWUgKTsKKworICAgICAgICAgICAgICAgIC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJv
cGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV8KKyAgICAgICAgICAgICAgICAvLyBoYXZlIGRh
c2hlcywgd2UgbmVlZCB0byBhbHNvIHN0b3JlIGEgY29weSBvZiB0aGF0CisgICAgICAgICAgICAg
ICAgLy8gdW5jaGFuZ2VkIHByb3BlcnR5LgorICAgICAgICAgICAgICAgIGlmICgga2V5LmluZGV4
T2YoICItIiApID4gLTEgJiYgZGF0YSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAg
ICAgICBkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVu
Z3RoID4gMSwgbnVsbCwgdHJ1ZSApOworICAgIH0sCisKKyAgICByZW1vdmVEYXRhOiBmdW5jdGlv
bigga2V5ICkgeworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7CisgICAgICAgIH0gKTsKKyAgICB9
Cit9ICk7CisKKworalF1ZXJ5LmV4dGVuZCggeworICAgIHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwg
dHlwZSwgZGF0YSApIHsKKyAgICAgICAgdmFyIHF1ZXVlOworCisgICAgICAgIGlmICggZWxlbSAp
IHsKKyAgICAgICAgICAgIHR5cGUgPSAoIHR5cGUgfHwgImZ4IiApICsgInF1ZXVlIjsKKyAgICAg
ICAgICAgIHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7CisKKyAgICAgICAgICAg
IC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1
c3QgYSBsb29rdXAKKyAgICAgICAgICAgIGlmICggZGF0YSApIHsKKyAgICAgICAgICAgICAgICBp
ZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSggZGF0YSApICkgeworICAgICAgICAgICAgICAg
ICAgICBxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJh
eSggZGF0YSApICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgcXVldWUucHVzaCggZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHJldHVybiBxdWV1ZSB8fCBbXTsKKyAgICAgICAgfQorICAgIH0sCisKKyAg
ICBkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKyAgICAgICAgdHlwZSA9IHR5cGUg
fHwgImZ4IjsKKworICAgICAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUg
KSwKKyAgICAgICAgICAgIHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAorICAgICAgICAgICAg
Zm4gPSBxdWV1ZS5zaGlmdCgpLAorICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9v
a3MoIGVsZW0sIHR5cGUgKSwKKyAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOworICAgICAgICAgICAgfTsK
KworICAgICAgICAvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUg
dGhlIHByb2dyZXNzIHNlbnRpbmVsCisgICAgICAgIGlmICggZm4gPT09ICJpbnByb2dyZXNzIiAp
IHsKKyAgICAgICAgICAgIGZuID0gcXVldWUuc2hpZnQoKTsKKyAgICAgICAgICAgIHN0YXJ0TGVu
Z3RoLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGZuICkgeworCisgICAgICAgICAgICAv
LyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJl
aW5nCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCisgICAgICAgICAgICBp
ZiAoIHR5cGUgPT09ICJmeCIgKSB7CisgICAgICAgICAgICAgICAgcXVldWUudW5zaGlmdCggImlu
cHJvZ3Jlc3MiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENsZWFyIHVwIHRo
ZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KKyAgICAgICAgICAgIGRlbGV0ZSBob29rcy5zdG9w
OworICAgICAgICAgICAgZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgeworICAgICAgICAgICAgaG9v
a3MuZW1wdHkuZmlyZSgpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8vIE5vdCBwdWJsaWMg
LSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25l
CisgICAgX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgeworICAgICAgICB2YXIg
a2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKKyAgICAgICAgcmV0dXJuIGRhdGFQcml2LmdldCgg
ZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHsKKyAgICAgICAgICAg
IGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICkuYWRkKCBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1
ZSIsIGtleSBdICk7CisgICAgICAgICAgICB9ICkKKyAgICAgICAgfSApOworICAgIH0KK30gKTsK
KworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSAp
IHsKKyAgICAgICAgdmFyIHNldHRlciA9IDI7CisKKyAgICAgICAgaWYgKCB0eXBlb2YgdHlwZSAh
PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBkYXRhID0gdHlwZTsKKyAgICAgICAgICAgIHR5
cGUgPSAiZngiOworICAgICAgICAgICAgc2V0dGVyLS07CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7CisgICAgICAgICAgICByZXR1cm4galF1
ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVy
biBkYXRhID09PSB1bmRlZmluZWQgPworICAgICAgICAgICAgdGhpcyA6CisgICAgICAgICAgICB0
aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IGpRdWVy
eS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOworCisgICAgICAgICAgICAgICAgLy8gRW5zdXJl
IGEgaG9va3MgZm9yIHRoaXMgcXVldWUKKyAgICAgICAgICAgICAgICBqUXVlcnkuX3F1ZXVlSG9v
a3MoIHRoaXMsIHR5cGUgKTsKKworICAgICAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ4IiAm
JiBxdWV1ZVsgMCBdICE9PSAiaW5wcm9ncmVzcyIgKSB7CisgICAgICAgICAgICAgICAgICAgIGpR
dWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSApOworICAgIH0sCisgICAgZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAg
IHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgalF1ZXJ5LmRlcXVl
dWUoIHRoaXMsIHR5cGUgKTsKKyAgICAgICAgfSApOworICAgIH0sCisgICAgY2xlYXJRdWV1ZTog
ZnVuY3Rpb24oIHR5cGUgKSB7CisgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJm
eCIsIFtdICk7CisgICAgfSwKKworICAgIC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBx
dWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKKyAgICAvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5
cGUgYnkgZGVmYXVsdCkKKyAgICBwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkgeworICAg
ICAgICB2YXIgdG1wLAorICAgICAgICAgICAgY291bnQgPSAxLAorICAgICAgICAgICAgZGVmZXIg
PSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcywKKyAgICAg
ICAgICAgIGkgPSB0aGlzLmxlbmd0aCwKKyAgICAgICAgICAgIHJlc29sdmUgPSBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICBpZiAoICEoIC0tY291bnQgKSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIGlmICggdHlwZW9mIHR5cGUg
IT09ICJzdHJpbmciICkgeworICAgICAgICAgICAgb2JqID0gdHlwZTsKKyAgICAgICAgICAgIHR5
cGUgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKyAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsK
KworICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgIHRtcCA9IGRhdGFQcml2Lmdl
dCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOworICAgICAgICAgICAgaWYg
KCB0bXAgJiYgdG1wLmVtcHR5ICkgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAg
ICAgICAgICAgdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIHJlc29sdmUoKTsKKyAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2UoIG9i
aiApOworICAgIH0KK30gKTsKK3ZhciBwbnVtID0gKCAvWystXT8oPzpcZCpcLnwpXGQrKD86W2VF
XVsrLV0/XGQrfCkvICkuc291cmNlOworCit2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86
KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CisKKwordmFyIGNzc0V4
cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKKwordmFyIGlzSGlk
ZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkgeworCisgICAgICAgIC8vIGlzSGlkZGVuIG1pZ2h0
IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247CisgICAgICAgIC8vIGluIHRo
YXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAorICAgICAgICBlbGVtID0g
ZWwgfHwgZWxlbTsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiAp
ID09PSAibm9uZSIgfHwKKyAgICAgICAgICAgICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJE
b2N1bWVudCwgZWxlbSApOworICAgIH07CisKKworCitmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0s
IHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgeworICAgIHZhciBhZGp1c3RlZCwKKyAgICAgICAg
c2NhbGUgPSAxLAorICAgICAgICBtYXhJdGVyYXRpb25zID0gMjAsCisgICAgICAgIGN1cnJlbnRW
YWx1ZSA9IHR3ZWVuID8KKyAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHdlZW4uY3Vy
KCk7IH0gOgorICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiBqUXVlcnkuY3NzKCBlbGVt
LCBwcm9wLCAiIiApOyB9LAorICAgICAgICBpbml0aWFsID0gY3VycmVudFZhbHVlKCksCisgICAg
ICAgIHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NO
dW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAorCisgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVl
IGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCisg
ICAgICAgIGluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0
ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKKyAgICAgICAgICAgIHJjc3NOdW0uZXhlYyggalF1
ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7CisKKyAgICBpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5p
dGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgeworCisgICAgICAgIC8vIFRydXN0IHVuaXRzIHJl
cG9ydGVkIGJ5IGpRdWVyeS5jc3MKKyAgICAgICAgdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5p
dFsgMyBdOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3Bl
cnRpZXMgbGF0ZXIgb24KKyAgICAgICAgdmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107CisK
KyAgICAgICAgLy8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRp
bmcgcG9pbnQKKyAgICAgICAgaW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7CisKKyAgICAg
ICAgZG8geworCisgICAgICAgICAgICAvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91
dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi4KKyAgICAgICAgICAgIC8vIFVzZSBz
dHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMg
dW5jaGFuZ2VkIGJlbG93CisgICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8ICIuNSI7CisKKyAg
ICAgICAgICAgIC8vIEFkanVzdCBhbmQgYXBwbHkKKyAgICAgICAgICAgIGluaXRpYWxJblVuaXQg
PSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CisgICAgICAgICAgICBqUXVlcnkuc3R5bGUoIGVsZW0s
IHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7CisKKyAgICAgICAgLy8gVXBkYXRlIHNjYWxl
LCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkKKyAgICAgICAgLy8gQnJl
YWsgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3Zl
IGp1c3QgaGFkIGVub3VnaC4KKyAgICAgICAgfSB3aGlsZSAoCisgICAgICAgICAgICBzY2FsZSAh
PT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYm
IC0tbWF4SXRlcmF0aW9ucworICAgICAgICApOworICAgIH0KKworICAgIGlmICggdmFsdWVQYXJ0
cyApIHsKKyAgICAgICAgaW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFs
IHx8IDA7CisKKyAgICAgICAgLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3Bl
Y2lmaWVkCisgICAgICAgIGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID8KKyAgICAgICAgICAg
IGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIg
XSA6CisgICAgICAgICAgICArdmFsdWVQYXJ0c1sgMiBdOworICAgICAgICBpZiAoIHR3ZWVuICkg
eworICAgICAgICAgICAgdHdlZW4udW5pdCA9IHVuaXQ7CisgICAgICAgICAgICB0d2Vlbi5zdGFy
dCA9IGluaXRpYWxJblVuaXQ7CisgICAgICAgICAgICB0d2Vlbi5lbmQgPSBhZGp1c3RlZDsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRqdXN0ZWQ7Cit9Cit2YXIgcmNoZWNrYWJsZVR5
cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7CisKK3ZhciBydGFnTmFtZSA9ICggLzwo
W1x3Oi1dKykvICk7CisKK3ZhciByc2NyaXB0VHlwZSA9ICggL14kfFwvKD86amF2YXxlY21hKXNj
cmlwdC9pICk7CisKKworCisvLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9y
dCBYSFRNTCAoIzEzMjAwKQordmFyIHdyYXBNYXAgPSB7CisKKyAgICAvLyBTdXBwb3J0OiBJRTkK
KyAgICBvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxl
Y3Q+IiBdLAorCisgICAgLy8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBl
bGVtZW50cyBpbiB0aGUKKyAgICAvLyBzYW1lIHdheSB0aGF0IHRhZyBzb3VwIHBhcnNlcnMgZG8u
IFNvIHdlIGNhbm5vdCBzaG9ydGVuCisgICAgLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9y
IG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgorICAgIHRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwv
dGFibGU+IiBdLAorICAgIGNvbDogWyAyLCAiPHRhYmxlPjxjb2xncm91cD4iLCAiPC9jb2xncm91
cD48L3RhYmxlPiIgXSwKKyAgICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48
L3RhYmxlPiIgXSwKKyAgICB0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90
Ym9keT48L3RhYmxlPiIgXSwKKworICAgIF9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCit9OworCisv
LyBTdXBwb3J0OiBJRTkKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKKword3Jh
cE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5j
YXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCisKK2Z1
bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgeworCisgICAgLy8gU3VwcG9ydDogSUU5LTEx
KworICAgIC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2Nh
dGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSkKKyAgICB2YXIgcmV0ID0gdHlwZW9mIGNvbnRl
eHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KKyAgICAgICAgICAgIGNv
bnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6CisgICAgICAgICAgICB0
eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiA/CisgICAgICAg
ICAgICAgICAgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgIioiICkgOgorICAgICAg
ICAgICAgW107CisKKyAgICByZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVy
eS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgPworICAgICAgICBqUXVlcnkubWVyZ2UoIFsgY29u
dGV4dCBdLCByZXQgKSA6CisgICAgICAgIHJldDsKK30KKworCisvLyBNYXJrIHNjcmlwdHMgYXMg
aGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKK2Z1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVs
ZW1zLCByZWZFbGVtZW50cyApIHsKKyAgICB2YXIgaSA9IDAsCisgICAgICAgIGwgPSBlbGVtcy5s
ZW5ndGg7CisKKyAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7CisgICAgICAgIGRhdGFQcml2LnNl
dCgKKyAgICAgICAgICAgIGVsZW1zWyBpIF0sCisgICAgICAgICAgICAiZ2xvYmFsRXZhbCIsCisg
ICAgICAgICAgICAhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBd
LCAiZ2xvYmFsRXZhbCIgKQorICAgICAgICApOworICAgIH0KK30KKworCit2YXIgcmh0bWwgPSAv
PHwmIz9cdys7LzsKKworZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNj
cmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKKyAgICB2YXIgZWxlbSwgdG1wLCB0YWcsIHdy
YXAsIGNvbnRhaW5zLCBqLAorICAgICAgICBmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1l
bnRGcmFnbWVudCgpLAorICAgICAgICBub2RlcyA9IFtdLAorICAgICAgICBpID0gMCwKKyAgICAg
ICAgbCA9IGVsZW1zLmxlbmd0aDsKKworICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKKyAgICAg
ICAgZWxlbSA9IGVsZW1zWyBpIF07CisKKyAgICAgICAgaWYgKCBlbGVtIHx8IGVsZW0gPT09IDAg
KSB7CisKKyAgICAgICAgICAgIC8vIEFkZCBub2RlcyBkaXJlY3RseQorICAgICAgICAgICAgaWYg
KCBqUXVlcnkudHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKKworICAgICAgICAgICAgICAg
IC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MgorICAgICAgICAgICAgICAgIC8v
IHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKKyAgICAg
ICAgICAgICAgICBqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0g
OiBlbGVtICk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQg
bm9kZQorICAgICAgICAgICAgfSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKKyAg
ICAgICAgICAgICAgICBub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkg
KTsKKworICAgICAgICAgICAgLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBl
bmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CisKKyAgICAgICAgICAg
ICAgICAvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAg
ICAgICAgdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0u
dG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwg
d3JhcE1hcC5fZGVmYXVsdDsKKyAgICAgICAgICAgICAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsg
MSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTsKKworICAgICAg
ICAgICAgICAgIC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVu
dAorICAgICAgICAgICAgICAgIGogPSB3cmFwWyAwIF07CisgICAgICAgICAgICAgICAgd2hpbGUg
KCBqLS0gKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcC5sYXN0Q2hpbGQ7CisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjEs
IFBoYW50b21KUzwyCisgICAgICAgICAgICAgICAgLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2Up
IHRocm93cyBvbiBhbmNpZW50IFdlYktpdAorICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJnZSgg
bm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CisKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0
aGUgdG9wLWxldmVsIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIHRtcCA9IGZyYWdtZW50LmZp
cnN0Q2hpbGQ7CisKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMg
YXJlIG9ycGhhbmVkICgjMTIzOTIpCisgICAgICAgICAgICAgICAgdG1wLnRleHRDb250ZW50ID0g
IiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZW1vdmUgd3Jh
cHBlciBmcm9tIGZyYWdtZW50CisgICAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKKworICAg
IGkgPSAwOworICAgIHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CisKKyAgICAg
ICAgLy8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRy
YWMtNDA4NykKKyAgICAgICAgaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0s
IHNlbGVjdGlvbiApID4gLTEgKSB7CisgICAgICAgICAgICBpZiAoIGlnbm9yZWQgKSB7CisgICAg
ICAgICAgICAgICAgaWdub3JlZC5wdXNoKCBlbGVtICk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRhaW5zID0galF1ZXJ5LmNv
bnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgICAgICAvLyBBcHBlbmQg
dG8gZnJhZ21lbnQKKyAgICAgICAgdG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCgg
ZWxlbSApLCAic2NyaXB0IiApOworCisgICAgICAgIC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0
aW9uIGhpc3RvcnkKKyAgICAgICAgaWYgKCBjb250YWlucyApIHsKKyAgICAgICAgICAgIHNldEds
b2JhbEV2YWwoIHRtcCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FwdHVyZSBleGVjdXRh
YmxlcworICAgICAgICBpZiAoIHNjcmlwdHMgKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAg
ICAgICAgIHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkgeworICAgICAgICAgICAgICAg
IGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CisgICAgICAgICAg
ICAgICAgICAgIHNjcmlwdHMucHVzaCggZWxlbSApOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmcmFnbWVudDsKK30KKwor
CisoIGZ1bmN0aW9uKCkgeworICAgIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3Vt
ZW50RnJhZ21lbnQoKSwKKyAgICAgICAgZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKSwKKyAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCAiaW5wdXQiICk7CisKKyAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00
LjMsIFNhZmFyaTw9NS4xCisgICAgLy8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBz
ZXQgKCMxMTIxNykKKyAgICAvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCisgICAg
Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5
MDEpCisgICAgaW5wdXQuc2V0QXR0cmlidXRlKCAidHlwZSIsICJyYWRpbyIgKTsKKyAgICBpbnB1
dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CisgICAgaW5wdXQuc2V0QXR0
cmlidXRlKCAibmFtZSIsICJ0IiApOworCisgICAgZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwor
CisgICAgLy8gU3VwcG9ydDogU2FmYXJpPD01LjEsIEFuZHJvaWQ8NC4yCisgICAgLy8gT2xkZXIg
V2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRz
CisgICAgc3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9k
ZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOworCisgICAgLy8gU3VwcG9ydDogSUU8PTExKwor
ICAgIC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMg
cHJvcGVybHkgY2xvbmVkCisgICAgZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFy
ZWE+IjsKKyAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVl
ICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsKK30gKSgpOworCisKK3ZhcgorICAgIHJrZXlFdmVu
dCA9IC9ea2V5LywKKyAgICBybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0
bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKKyAgICBydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/
OlwuKC4rKXwpLzsKKworZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisv
LyBTdXBwb3J0OiBJRTkKKy8vIFNlZSAjMTMzOTMgZm9yIG1vcmUgaW5mbworZnVuY3Rpb24gc2Fm
ZUFjdGl2ZUVsZW1lbnQoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFj
dGl2ZUVsZW1lbnQ7CisgICAgfSBjYXRjaCAoIGVyciApIHsgfQorfQorCitmdW5jdGlvbiBvbigg
ZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkgeworICAgIHZhciBvcmlnRm4s
IHR5cGU7CisKKyAgICAvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMKKyAg
ICBpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgLy8gKCB0eXBl
cy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkKKyAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3Ig
IT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSAp
CisgICAgICAgICAgICBkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKKyAgICAgICAgICAgIHNlbGVj
dG9yID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICAgIGZvciAoIHR5cGUgaW4gdHlwZXMg
KSB7CisgICAgICAgICAgICBvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0
eXBlIF0sIG9uZSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtOworICAgIH0KKwor
ICAgIGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CisKKyAgICAgICAgLy8gKCB0
eXBlcywgZm4gKQorICAgICAgICBmbiA9IHNlbGVjdG9yOworICAgICAgICBkYXRhID0gc2VsZWN0
b3IgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHsKKyAgICAgICAg
aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAvLyAo
IHR5cGVzLCBzZWxlY3RvciwgZm4gKQorICAgICAgICAgICAgZm4gPSBkYXRhOworICAgICAgICAg
ICAgZGF0YSA9IHVuZGVmaW5lZDsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8g
KCB0eXBlcywgZGF0YSwgZm4gKQorICAgICAgICAgICAgZm4gPSBkYXRhOworICAgICAgICAgICAg
ZGF0YSA9IHNlbGVjdG9yOworICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisgICAg
ICAgIH0KKyAgICB9CisgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgICAgIGZuID0gcmV0
dXJuRmFsc2U7CisgICAgfSBlbHNlIGlmICggIWZuICkgeworICAgICAgICByZXR1cm4gZWxlbTsK
KyAgICB9CisKKyAgICBpZiAoIG9uZSA9PT0gMSApIHsKKyAgICAgICAgb3JpZ0ZuID0gZm47Cisg
ICAgICAgIGZuID0gZnVuY3Rpb24oIGV2ZW50ICkgeworCisgICAgICAgICAgICAvLyBDYW4gdXNl
IGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm8KKyAgICAgICAgICAg
IGpRdWVyeSgpLm9mZiggZXZlbnQgKTsKKyAgICAgICAgICAgIHJldHVybiBvcmlnRm4uYXBwbHko
IHRoaXMsIGFyZ3VtZW50cyApOworICAgICAgICB9OworCisgICAgICAgIC8vIFVzZSBzYW1lIGd1
aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisgICAgICAgIGZuLmd1aWQgPSBv
cmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOworICAgIH0KKyAg
ICByZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgalF1ZXJ5LmV2ZW50LmFk
ZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOworICAgIH0gKTsKK30KKworLyoK
KyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0
aGUgcHVibGljIGludGVyZmFjZS4KKyAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQg
bGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuCisgKi8KK2pRdWVyeS5ldmVudCA9IHsKKwor
ICAgIGdsb2JhbDoge30sCisKKyAgICBhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxl
ciwgZGF0YSwgc2VsZWN0b3IgKSB7CisKKyAgICAgICAgdmFyIGhhbmRsZU9iakluLCBldmVudEhh
bmRsZSwgdG1wLAorICAgICAgICAgICAgZXZlbnRzLCB0LCBoYW5kbGVPYmosCisgICAgICAgICAg
ICBzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCisgICAgICAg
ICAgICBlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApOworCisgICAgICAgIC8vIERvbid0
IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93
IHBsYWluIG9iamVjdHMpCisgICAgICAgIGlmICggIWVsZW1EYXRhICkgeworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9i
amVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyCisgICAgICAgIGlmICgg
aGFuZGxlci5oYW5kbGVyICkgeworICAgICAgICAgICAgaGFuZGxlT2JqSW4gPSBoYW5kbGVyOwor
ICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CisgICAgICAgICAgICBz
ZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgLy8g
TWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQv
cmVtb3ZlIGl0IGxhdGVyCisgICAgICAgIGlmICggIWhhbmRsZXIuZ3VpZCApIHsKKyAgICAgICAg
ICAgIGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7CisgICAgICAgIH0KKworICAgICAgICAv
LyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlm
IHRoaXMgaXMgdGhlIGZpcnN0CisgICAgICAgIGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZl
bnRzICkgKSB7CisgICAgICAgICAgICBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkg
KSB7CisgICAgICAgICAgICBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9u
KCBlICkgeworCisgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9m
IGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKKyAgICAgICAgICAgICAgICAvLyB3aGVuIGFu
IGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmIGpRdWVyeS5ldmVudC50
cmlnZ2VyZWQgIT09IGUudHlwZSA/CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5k
aXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CisgICAgICAgICAg
ICB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBh
cmF0ZWQgYnkgYSBzcGFjZQorICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCgg
cm5vdHdoaXRlICkgfHwgWyAiIiBdOworICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOworICAgICAg
ICB3aGlsZSAoIHQtLSApIHsKKyAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMo
IHR5cGVzWyB0IF0gKSB8fCBbXTsKKyAgICAgICAgICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsg
MSBdOworICAgICAgICAgICAgbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCgg
Ii4iICkuc29ydCgpOworCisgICAgICAgICAgICAvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBu
byBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnMKKyAgICAgICAgICAgIGlmICggIXR5
cGUgKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVu
dCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZQorICAgICAgICAgICAgc3BlY2lhbCA9IGpR
dWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisKKyAgICAgICAgICAgIC8vIElmIHNl
bGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndp
c2UgZ2l2ZW4gdHlwZQorICAgICAgICAgICAgdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRl
bGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOworCisgICAgICAgICAgICAv
LyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlCisgICAgICAgICAgICBz
cGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKworICAgICAgICAg
ICAgLy8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMKKyAgICAgICAg
ICAgIGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHsKKyAgICAgICAgICAgICAgICB0eXBlOiB0
eXBlLAorICAgICAgICAgICAgICAgIG9yaWdUeXBlOiBvcmlnVHlwZSwKKyAgICAgICAgICAgICAg
ICBkYXRhOiBkYXRhLAorICAgICAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsCisgICAgICAg
ICAgICAgICAgZ3VpZDogaGFuZGxlci5ndWlkLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBz
ZWxlY3RvciwKKyAgICAgICAgICAgICAgICBuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVy
eS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAorICAgICAgICAgICAg
ICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCAiLiIgKQorICAgICAgICAgICAgfSwgaGFu
ZGxlT2JqSW4gKTsKKworICAgICAgICAgICAgLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1
ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKKyAgICAgICAgICAgIGlmICggISggaGFuZGxlcnMgPSBldmVu
dHNbIHR5cGUgXSApICkgeworICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBl
IF0gPSBbXTsKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKKwor
ICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNp
YWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQorICAgICAgICAgICAgICAgIGlmICggIXNw
ZWNpYWwuc2V0dXAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbC5zZXR1cC5jYWxsKCBl
bGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKKworICAg
ICAgICAgICAgICAgICAgICBpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUg
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKKyAgICAgICAgICAgICAgICBz
cGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKKworICAgICAgICAgICAgICAgIGlm
ICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRs
ZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVy
IGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAorICAgICAgICAgICAgaWYgKCBzZWxlY3RvciApIHsK
KyAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQr
KywgMCwgaGFuZGxlT2JqICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3Ig
ZXZlbnQgb3B0aW1pemF0aW9uCisgICAgICAgICAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBl
IF0gPSB0cnVlOworICAgICAgICB9CisKKyAgICB9LAorCisgICAgLy8gRGV0YWNoIGFuIGV2ZW50
IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CisgICAgcmVtb3ZlOiBmdW5jdGlvbigg
ZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHsKKworICAgICAg
ICB2YXIgaiwgb3JpZ0NvdW50LCB0bXAsCisgICAgICAgICAgICBldmVudHMsIHQsIGhhbmRsZU9i
aiwKKyAgICAgICAgICAgIHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmln
VHlwZSwKKyAgICAgICAgICAgIGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYm
IGRhdGFQcml2LmdldCggZWxlbSApOworCisgICAgICAgIGlmICggIWVsZW1EYXRhIHx8ICEoIGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsg
dHlwZSBtYXkgYmUgb21pdHRlZAorICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRj
aCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOworICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOworICAg
ICAgICB3aGlsZSAoIHQtLSApIHsKKyAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4
ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTsKKyAgICAgICAgICAgIHR5cGUgPSBvcmlnVHlwZSA9IHRt
cFsgMSBdOworICAgICAgICAgICAgbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxp
dCggIi4iICkuc29ydCgpOworCisgICAgICAgICAgICAvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24g
dGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKKyAgICAgICAgICAg
IGlmICggIXR5cGUgKSB7CisgICAgICAgICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7
CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0
eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisgICAgICAgICAg
ICB0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5k
VHlwZSApIHx8IHR5cGU7CisgICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8
IFtdOworICAgICAgICAgICAgdG1wID0gdG1wWyAyIF0gJiYKKyAgICAgICAgICAgICAgICBuZXcg
UmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oICJcXC4oPzouKlxcLnwpIiApICsg
IihcXC58JCkiICk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKKyAg
ICAgICAgICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7CisgICAgICAgICAgICB3
aGlsZSAoIGotLSApIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBd
OworCisgICAgICAgICAgICAgICAgaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBo
YW5kbGVPYmoub3JpZ1R5cGUgKSAmJgorICAgICAgICAgICAgICAgICAgICAoICFoYW5kbGVyIHx8
IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgorICAgICAgICAgICAgICAgICAg
ICAoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCisgICAgICAg
ICAgICAgICAgICAgICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0
b3IgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRs
ZU9iai5zZWxlY3RvciApICkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2Uo
IGosIDEgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGhhbmRsZU9iai5zZWxlY3RvciAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHNwZWNpYWwucmVt
b3ZlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxl
bSwgaGFuZGxlT2JqICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhh
bmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QK
KyAgICAgICAgICAgIC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBk
dXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKQorICAgICAgICAgICAgaWYg
KCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICBpZiAo
ICFzcGVjaWFsLnRlYXJkb3duIHx8CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwudGVhcmRv
d24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkg
eworCisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwg
ZWxlbURhdGEuaGFuZGxlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ZGVsZXRlIGV2ZW50c1sgdHlwZSBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQK
KyAgICAgICAgaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CisgICAgICAg
ICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJoYW5kbGUgZXZlbnRzIiApOworICAgICAgICB9
CisgICAgfSwKKworICAgIGRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CisKKyAgICAgICAg
Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2Jq
ZWN0CisgICAgICAgIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTsKKworICAgICAg
ICB2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosCisgICAgICAgICAgICBoYW5kbGVy
UXVldWUgPSBbXSwKKyAgICAgICAgICAgIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwK
KyAgICAgICAgICAgIGhhbmRsZXJzID0gKCBkYXRhUHJpdi5nZXQoIHRoaXMsICJldmVudHMiICkg
fHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAorICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVy
eS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CisKKyAgICAgICAgLy8gVXNlIHRo
ZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUg
ZXZlbnQKKyAgICAgICAgYXJnc1sgMCBdID0gZXZlbnQ7CisgICAgICAgIGV2ZW50LmRlbGVnYXRl
VGFyZ2V0ID0gdGhpczsKKworICAgICAgICAvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZv
ciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkCisgICAgICAgIGlm
ICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMs
IGV2ZW50ICkgPT09IGZhbHNlICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgLy8gRGV0ZXJtaW5lIGhhbmRsZXJzCisgICAgICAgIGhhbmRsZXJRdWV1ZSA9IGpR
dWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTsKKworICAg
ICAgICAvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFn
YXRpb24gYmVuZWF0aCB1cworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKCAoIG1hdGNo
ZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVk
KCkgKSB7CisgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtOwor
CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIHdoaWxlICggKCBoYW5kbGVPYmogPSBt
YXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmCisgICAgICAgICAgICAgICAgIWV2ZW50LmlzSW1t
ZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUcmln
Z2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUg
bmFtZXNwYWNlKHMpCisgICAgICAgICAgICAgICAgLy8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhv
c2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuCisgICAg
ICAgICAgICAgICAgaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRl
c3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKKworICAgICAgICAgICAgICAgICAgICBldmVu
dC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEg
PSBoYW5kbGVPYmouZGF0YTsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSAoICggalF1ZXJ5
LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8Cisg
ICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVk
LmVsZW0sIGFyZ3MgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCAhPT0gdW5kZWZp
bmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJl
dCApID09PSBmYWxzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9w
YWdhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQorICAg
ICAgICBpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkgeworICAgICAgICAgICAgc3BlY2lhbC5w
b3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIGhhbmRsZXJzOiBmdW5jdGlvbiggZXZl
bnQsIGhhbmRsZXJzICkgeworICAgICAgICB2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmos
CisgICAgICAgICAgICBoYW5kbGVyUXVldWUgPSBbXSwKKyAgICAgICAgICAgIGRlbGVnYXRlQ291
bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAorICAgICAgICAgICAgY3VyID0gZXZlbnQudGFy
Z2V0OworCisgICAgICAgIC8vIFN1cHBvcnQgKGF0IGxlYXN0KTogQ2hyb21lLCBJRTkKKyAgICAg
ICAgLy8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVycworICAgICAgICAvLyBCbGFjay1ob2xlIFNWRyA8
dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKQorICAgICAgICAvLworICAgICAgICAvLyBTdXBw
b3J0OiBGaXJlZm94PD00MisKKyAgICAgICAgLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgaW4gRkYg
YnV0IGRvbid0IGJsb2NrIElFIHJhZGlvIGV2ZW50cyAoIzM4NjEsIGdoLTIzNDMpCisgICAgICAg
IGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYKKyAgICAgICAgICAgICggZXZl
bnQudHlwZSAhPT0gImNsaWNrIiB8fCBpc05hTiggZXZlbnQuYnV0dG9uICkgfHwgZXZlbnQuYnV0
dG9uIDwgMSApICkgeworCisgICAgICAgICAgICBmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0g
Y3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKKworICAgICAgICAgICAgICAgIC8vIERvbid0IGNo
ZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KQorICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nl
c3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzEx
NzY0KQorICAgICAgICAgICAgICAgIGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICggY3VyLmRp
c2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgbWF0Y2hlcyA9IFtdOworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0g
MDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhh
bmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERv
bid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpCisg
ICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyAiICI7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWyBzZWwgXSA9IGhhbmRs
ZU9iai5uZWVkc0NvbnRleHQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVl
cnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0
aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggbWF0Y2hlc1sgc2VsIF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hl
cy5wdXNoKCBoYW5kbGVPYmogKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXMubGVuZ3RoICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3Vy
LCBoYW5kbGVyczogbWF0Y2hlcyB9ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhl
IHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzCisgICAgICAgIGlmICggZGVsZWdh
dGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHsKKyAgICAgICAgICAgIGhhbmRsZXJRdWV1ZS5w
dXNoKCB7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3Vu
dCApIH0gKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVyUXVldWU7CisgICAg
fSwKKworICAgIC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50
IGFuZCBNb3VzZUV2ZW50CisgICAgcHJvcHM6ICggImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUg
Y3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlICIgKworICAgICAgICAibWV0
YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIg
KS5zcGxpdCggIiAiICksCisKKyAgICBmaXhIb29rczoge30sCisKKyAgICBrZXlIb29rczogewor
ICAgICAgICBwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCAiICIgKSwK
KyAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgeworCisgICAgICAg
ICAgICAvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKyAgICAgICAgICAgIGlmICggZXZlbnQu
d2hpY2ggPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBldmVudC53aGljaCA9IG9yaWdpbmFs
LmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBldmVudDsKKyAgICAgICAgfQor
ICAgIH0sCisKKyAgICBtb3VzZUhvb2tzOiB7CisgICAgICAgIHByb3BzOiAoICJidXR0b24gYnV0
dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZICIgKworICAg
ICAgICAgICAgInNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiICkuc3BsaXQoICIgIiApLAorICAg
ICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CisgICAgICAgICAgICB2
YXIgZXZlbnREb2MsIGRvYywgYm9keSwKKyAgICAgICAgICAgICAgICBidXR0b24gPSBvcmlnaW5h
bC5idXR0b247CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3Npbmcg
YW5kIGNsaWVudFgvWSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICggZXZlbnQucGFnZVggPT0g
bnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgZXZl
bnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKyAgICAgICAg
ICAgICAgICBkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAg
Ym9keSA9IGV2ZW50RG9jLmJvZHk7CisKKyAgICAgICAgICAgICAgICBldmVudC5wYWdlWCA9IG9y
aWdpbmFsLmNsaWVudFggKworICAgICAgICAgICAgICAgICAgICAoIGRvYyAmJiBkb2Muc2Nyb2xs
TGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLQorICAgICAgICAgICAgICAg
ICAgICAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8
fCAwICk7CisgICAgICAgICAgICAgICAgZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsK
KyAgICAgICAgICAgICAgICAgICAgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBi
b2R5LnNjcm9sbFRvcCAgfHwgMCApIC0KKyAgICAgICAgICAgICAgICAgICAgKCBkb2MgJiYgZG9j
LmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAy
ID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CisgICAgICAgICAgICAvLyBOb3RlOiBidXR0b24gaXMg
bm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorICAgICAgICAgICAgaWYgKCAhZXZlbnQu
d2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgZXZlbnQu
d2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYg
NCA/IDIgOiAwICkgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXZl
bnQ7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7Cisg
ICAgICAgIGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CisgICAgICAgICAgICByZXR1
cm4gZXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5
IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKKyAgICAg
ICAgdmFyIGksIHByb3AsIGNvcHksCisgICAgICAgICAgICB0eXBlID0gZXZlbnQudHlwZSwKKyAg
ICAgICAgICAgIG9yaWdpbmFsRXZlbnQgPSBldmVudCwKKyAgICAgICAgICAgIGZpeEhvb2sgPSB0
aGlzLmZpeEhvb2tzWyB0eXBlIF07CisKKyAgICAgICAgaWYgKCAhZml4SG9vayApIHsKKyAgICAg
ICAgICAgIHRoaXMuZml4SG9va3NbIHR5cGUgXSA9IGZpeEhvb2sgPQorICAgICAgICAgICAgICAg
IHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6CisgICAgICAgICAg
ICAgICAgcmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOgorICAgICAgICAg
ICAgICAgIHt9OworICAgICAgICB9CisgICAgICAgIGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhp
cy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CisKKyAgICAgICAg
ZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CisKKyAgICAgICAgaSA9
IGNvcHkubGVuZ3RoOworICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgIHByb3Ag
PSBjb3B5WyBpIF07CisgICAgICAgICAgICBldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsg
cHJvcCBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdl
YktpdCkgKCMxMzI1NSkKKyAgICAgICAgLy8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdl
dDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0CisgICAgICAgIGlmICggIWV2ZW50LnRhcmdl
dCApIHsKKyAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IGRvY3VtZW50OworICAgICAgICB9CisK
KyAgICAgICAgLy8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOAorICAgICAgICAvLyBU
YXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQorICAgICAgICBp
ZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKKyAgICAgICAgICAgIGV2ZW50LnRh
cmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50
ICkgOiBldmVudDsKKyAgICB9LAorCisgICAgc3BlY2lhbDogeworICAgICAgICBsb2FkOiB7CisK
KyAgICAgICAgICAgIC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20g
YnViYmxpbmcgdG8gd2luZG93LmxvYWQKKyAgICAgICAgICAgIG5vQnViYmxlOiB0cnVlCisgICAg
ICAgIH0sCisgICAgICAgIGZvY3VzOiB7CisKKyAgICAgICAgICAgIC8vIEZpcmUgbmF0aXZlIGV2
ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdAorICAgICAg
ICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCB0aGlzICE9
PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuZm9jdXMgKSB7CisgICAgICAgICAgICAgICAg
ICAgIHRoaXMuZm9jdXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6
ICJmb2N1c2luIgorICAgICAgICB9LAorICAgICAgICBibHVyOiB7CisgICAgICAgICAgICB0cmln
Z2VyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMgPT09IHNhZmVBY3Rp
dmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmJs
dXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIK
KyAgICAgICAgfSwKKyAgICAgICAgY2xpY2s6IHsKKworICAgICAgICAgICAgLy8gRm9yIGNoZWNr
Ym94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKKyAg
ICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICggdGhp
cy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0
aGlzLCAiaW5wdXQiICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2soKTsKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5
LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rcworICAgICAgICAgICAgX2RlZmF1
bHQ6IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4galF1ZXJ5Lm5v
ZGVOYW1lKCBldmVudC50YXJnZXQsICJhIiApOworICAgICAgICAgICAgfQorICAgICAgICB9LAor
CisgICAgICAgIGJlZm9yZXVubG9hZDogeworICAgICAgICAgICAgcG9zdERpc3BhdGNoOiBmdW5j
dGlvbiggZXZlbnQgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94IDIw
KworICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJu
VmFsdWUgZmllbGQgaXMgbm90IHNldC4KKyAgICAgICAgICAgICAgICBpZiAoIGV2ZW50LnJlc3Vs
dCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7CisgICAgICAgICAgICAg
ICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKwor
alF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKKwor
ICAgIC8vIFRoaXMgImlmIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHMKKyAgICBpZiAoIGVs
ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKKyAgICAgICAgZWxlbS5yZW1vdmVFdmVudExpc3Rl
bmVyKCB0eXBlLCBoYW5kbGUgKTsKKyAgICB9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlv
biggc3JjLCBwcm9wcyApIHsKKworICAgIC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0
aGUgJ25ldycga2V5d29yZAorICAgIGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVu
dCApICkgeworICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwor
ICAgIH0KKworICAgIC8vIEV2ZW50IG9iamVjdAorICAgIGlmICggc3JjICYmIHNyYy50eXBlICkg
eworICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisgICAgICAgIHRoaXMudHlwZSA9
IHNyYy50eXBlOworCisgICAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQg
bWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCisgICAgICAgIC8vIGJ5IGEgaGFuZGxl
ciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgorICAgICAg
ICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8CisgICAg
ICAgICAgICAgICAgc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJgorCisgICAg
ICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKKyAgICAgICAgICAgICAgICBzcmMu
cmV0dXJuVmFsdWUgPT09IGZhbHNlID8KKyAgICAgICAgICAgIHJldHVyblRydWUgOgorICAgICAg
ICAgICAgcmV0dXJuRmFsc2U7CisKKyAgICAvLyBFdmVudCB0eXBlCisgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy50eXBlID0gc3JjOworICAgIH0KKworICAgIC8vIFB1dCBleHBsaWNpdGx5IHBy
b3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CisgICAgaWYgKCBwcm9wcyAp
IHsKKyAgICAgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKKyAgICB9CisKKyAgICAv
LyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQor
ICAgIHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygp
OworCisgICAgLy8gTWFyayBpdCBhcyBmaXhlZAorICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0g
PSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFz
IHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRwOi8v
d3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNj
cmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisgICAgY29uc3Ry
dWN0b3I6IGpRdWVyeS5FdmVudCwKKyAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNl
LAorICAgIGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKKyAgICBpc0ltbWVkaWF0
ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisgICAgaXNTaW11bGF0ZWQ6IGZhbHNl
LAorCisgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRo
aXMub3JpZ2luYWxFdmVudDsKKworICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJl
dHVyblRydWU7CisKKyAgICAgICAgaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgeworICAg
ICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9CisgICAgfSwKKyAgICBzdG9w
UHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxF
dmVudDsKKworICAgICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsK
KworICAgICAgICBpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CisgICAgICAgICAgICBl
LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgICB9CisgICAgfSwKKyAgICBzdG9wSW1tZWRpYXRl
UHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZSA9IHRoaXMub3JpZ2luYWxF
dmVudDsKKworICAgICAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0
dXJuVHJ1ZTsKKworICAgICAgICBpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CisgICAg
ICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOworICAgICAgICB9CisKKyAgICAg
ICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9Cit9OworCisvLyBDcmVhdGUgbW91c2Vl
bnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVj
a3MKKy8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuCisvLyBEbyB0
aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9p
bnRlcm91dAorLy8KKy8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHkKKy8vIFNhZmFyaSBzZW5kcyBt
b3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgorLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9j
aHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OAorLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBv
ZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4K
K2pRdWVyeS5lYWNoKCB7CisgICAgbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCisgICAgbW91c2Vs
ZWF2ZTogIm1vdXNlb3V0IiwKKyAgICBwb2ludGVyZW50ZXI6ICJwb2ludGVyb3ZlciIsCisgICAg
cG9pbnRlcmxlYXZlOiAicG9pbnRlcm91dCIKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7Cisg
ICAgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKKyAgICAgICAgZGVsZWdhdGVUeXBl
OiBmaXgsCisgICAgICAgIGJpbmRUeXBlOiBmaXgsCisKKyAgICAgICAgaGFuZGxlOiBmdW5jdGlv
biggZXZlbnQgKSB7CisgICAgICAgICAgICB2YXIgcmV0LAorICAgICAgICAgICAgICAgIHRhcmdl
dCA9IHRoaXMsCisgICAgICAgICAgICAgICAgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQs
CisgICAgICAgICAgICAgICAgaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOworCisgICAgICAg
ICAgICAvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQg
aXMgb3V0c2lkZSB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgLy8gTkI6IE5vIHJlbGF0ZWRUYXJn
ZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKKyAgICAgICAg
ICAgIGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250
YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHsKKyAgICAgICAgICAgICAgICBldmVudC50eXBl
ID0gaGFuZGxlT2JqLm9yaWdUeXBlOworICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZU9iai5o
YW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKyAgICAgICAgICAgICAgICBldmVudC50
eXBlID0gZml4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAg
ICAgfQorICAgIH07Cit9ICk7CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBvbjogZnVuY3Rp
b24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CisgICAgICAgIHJldHVybiBvbiggdGhp
cywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgb25lOiBmdW5jdGlv
biggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHsKKyAgICAgICAgcmV0dXJuIG9uKCB0aGlz
LCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7CisgICAgfSwKKyAgICBvZmY6IGZ1bmN0
aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgeworICAgICAgICB2YXIgaGFuZGxlT2JqLCB0eXBl
OworICAgICAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhh
bmRsZU9iaiApIHsKKworICAgICAgICAgICAgLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVy
eS5FdmVudAorICAgICAgICAgICAgaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOworICAgICAg
ICAgICAgalF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZigKKyAgICAgICAgICAgICAg
ICBoYW5kbGVPYmoubmFtZXNwYWNlID8KKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlT2JqLm9y
aWdUeXBlICsgIi4iICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6CisgICAgICAgICAgICAgICAgICAg
IGhhbmRsZU9iai5vcmlnVHlwZSwKKyAgICAgICAgICAgICAgICBoYW5kbGVPYmouc2VsZWN0b3Is
CisgICAgICAgICAgICAgICAgaGFuZGxlT2JqLmhhbmRsZXIKKyAgICAgICAgICAgICk7CisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHR5cGVvZiB0eXBl
cyA9PT0gIm9iamVjdCIgKSB7CisKKyAgICAgICAgICAgIC8vICggdHlwZXMtb2JqZWN0IFssIHNl
bGVjdG9yXSApCisgICAgICAgICAgICBmb3IgKCB0eXBlIGluIHR5cGVzICkgeworICAgICAgICAg
ICAgICAgIHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkg
eworCisgICAgICAgICAgICAvLyAoIHR5cGVzIFssIGZuXSApCisgICAgICAgICAgICBmbiA9IHNl
bGVjdG9yOworICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7CisgICAgICAgICAgICBmbiA9IHJldHVybkZhbHNl
OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciAp
OworICAgICAgICB9ICk7CisgICAgfQorfSApOworCisKK3ZhcgorICAgIHJ4aHRtbFRhZyA9IC88
KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzot
XSspW14+XSopXC8+L2dpLAorCisgICAgLy8gU3VwcG9ydDogSUUgMTAtMTEsIEVkZ2UgMTAyNDAr
CisgICAgLy8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJl
IHNsb3dkb3ducy4KKyAgICAvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUv
ZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLworICAgIHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxz
dHlsZXw8bGluay9pLAorCisgICAgLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorICAg
IHJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisgICAgcnNj
cmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcLyguKikvLAorICAgIHJjbGVhblNjcmlwdCA9IC9eXHMq
PCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKKworLy8gTWFuaXB1bGF0aW5n
IHRhYmxlcyByZXF1aXJlcyBhIHRib2R5CitmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVs
ZW0sIGNvbnRlbnQgKSB7CisgICAgcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRhYmxl
IiApICYmCisgICAgICAgIGpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEg
PyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgPworCisgICAgICAgIGVsZW0u
Z2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKVsgMCBdIHx8CisgICAgICAgICAgICBlbGVt
LmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInRib2R5IiAp
ICkgOgorICAgICAgICBlbGVtOworfQorCisvLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0
cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uCitmdW5j
dGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgeworICAgIGVsZW0udHlwZSA9ICggZWxlbS5nZXRB
dHRyaWJ1dGUoICJ0eXBlIiApICE9PSBudWxsICkgKyAiLyIgKyBlbGVtLnR5cGU7CisgICAgcmV0
dXJuIGVsZW07Cit9CitmdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkgeworICAgIHZhciBt
YXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApOworCisgICAgaWYgKCBt
YXRjaCApIHsKKyAgICAgICAgZWxlbS50eXBlID0gbWF0Y2hbIDEgXTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSggInR5cGUiICk7CisgICAgfQorCisgICAgcmV0
dXJuIGVsZW07Cit9CisKK2Z1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7Cisg
ICAgdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3Vy
LCBldmVudHM7CisKKyAgICBpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5k
bGVycywgZXRjLgorICAgIGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7CisgICAgICAg
IHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTsKKyAgICAgICAgcGRhdGFDdXIgPSBk
YXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CisgICAgICAgIGV2ZW50cyA9IHBkYXRhT2xk
LmV2ZW50czsKKworICAgICAgICBpZiAoIGV2ZW50cyApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBw
ZGF0YUN1ci5oYW5kbGU7CisgICAgICAgICAgICBwZGF0YUN1ci5ldmVudHMgPSB7fTsKKworICAg
ICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7CisgICAgICAgICAgICAgICAgZm9yICgg
aSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgICAgIGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBd
WyBpIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICAvLyAyLiBDb3B5IHVzZXIgZGF0YQorICAgIGlmICggZGF0YVVzZXIuaGFzRGF0
YSggc3JjICkgKSB7CisgICAgICAgIHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTsK
KyAgICAgICAgdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKKworICAg
ICAgICBkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7CisgICAgfQorfQorCisvLyBGaXgg
SUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKK2Z1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3Qg
KSB7CisgICAgdmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCisg
ICAgLy8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVj
a2JveCBvciByYWRpbyBidXR0b24uCisgICAgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiBy
Y2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgeworICAgICAgICBkZXN0LmNoZWNrZWQg
PSBzcmMuY2hlY2tlZDsKKworICAgIC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0
aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCisg
ICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0
YXJlYSIgKSB7CisgICAgICAgIGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsK
KyAgICB9Cit9CisKK2Z1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFj
aywgaWdub3JlZCApIHsKKworICAgIC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKKyAgICBh
cmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOworCisgICAgdmFyIGZyYWdtZW50LCBmaXJz
dCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLAorICAgICAgICBpID0gMCwKKyAgICAg
ICAgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAorICAgICAgICBpTm9DbG9uZSA9IGwgLSAxLAorICAg
ICAgICB2YWx1ZSA9IGFyZ3NbIDAgXSwKKyAgICAgICAgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1
bmN0aW9uKCB2YWx1ZSApOworCisgICAgLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0
aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CisgICAgaWYgKCBpc0Z1bmN0aW9uIHx8Cisg
ICAgICAgICAgICAoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYKKyAgICAg
ICAgICAgICAgICAhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkg
KSApIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkg
eworICAgICAgICAgICAgdmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApOworICAgICAg
ICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgeworICAgICAgICAgICAgICAgIGFyZ3NbIDAgXSA9IHZh
bHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CisgICAg
ICAgIH0gKTsKKyAgICB9CisKKyAgICBpZiAoIGwgKSB7CisgICAgICAgIGZyYWdtZW50ID0gYnVp
bGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBj
b2xsZWN0aW9uLCBpZ25vcmVkICk7CisgICAgICAgIGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGls
ZDsKKworICAgICAgICBpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkgewor
ICAgICAgICAgICAgZnJhZ21lbnQgPSBmaXJzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJl
cXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVu
dHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjaworICAgICAgICBpZiAoIGZpcnN0IHx8IGlnbm9yZWQg
KSB7CisgICAgICAgICAgICBzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwg
InNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOworICAgICAgICAgICAgaGFzU2NyaXB0cyA9IHNj
cmlwdHMubGVuZ3RoOworCisgICAgICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50
IGZvciB0aGUgbGFzdCBpdGVtCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBi
ZWNhdXNlIGl0IGNhbiBlbmQgdXAKKyAgICAgICAgICAgIC8vIGJlaW5nIGVtcHRpZWQgaW5jb3Jy
ZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCisgICAgICAgICAgICBmb3IgKCA7
IGkgPCBsOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IGZyYWdtZW50OworCisgICAg
ICAgICAgICAgICAgaWYgKCBpICE9PSBpTm9DbG9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOworCisgICAgICAgICAgICAg
ICAgICAgIC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVz
dG9yYXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBoYXNTY3JpcHRzICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDIK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJv
d3Mgb24gYW5jaWVudCBXZWJLaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tZXJn
ZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCAic2NyaXB0IiApICk7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxs
KCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCBoYXNTY3JpcHRzICkgeworICAgICAgICAgICAgICAgIGRvYyA9IHNjcmlwdHNbIHNj
cmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CisKKyAgICAgICAgICAgICAgICAvLyBS
ZWVuYWJsZSBzY3JpcHRzCisgICAgICAgICAgICAgICAgalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVz
dG9yZVNjcmlwdCApOworCisgICAgICAgICAgICAgICAgLy8gRXZhbHVhdGUgZXhlY3V0YWJsZSBz
Y3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvbgorICAgICAgICAgICAgICAgIGZvciAo
IGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBub2Rl
ID0gc2NyaXB0c1sgaSBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJzY3JpcHRUeXBlLnRl
c3QoIG5vZGUudHlwZSB8fCAiIiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhZGF0YVBy
aXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgorICAgICAgICAgICAgICAgICAgICAg
ICAgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCBub2RlLnNyYyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBw
cmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuX2V2YWxVcmwg
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5fZXZhbFVybCggbm9k
ZS5zcmMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5nbG9i
YWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIiIgKSApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IGNvbGxlY3Rpb247Cit9CisKK2Z1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBE
YXRhICkgeworICAgIHZhciBub2RlLAorICAgICAgICBub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5
LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sCisgICAgICAgIGkgPSAwOworCisgICAg
Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgeworICAgICAgICBp
ZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAgalF1
ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICggbm9kZS5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgaWYgKCBrZWVwRGF0YSAmJiBqUXVl
cnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkgeworICAgICAgICAgICAg
ICAgIHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSApOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZWxlbTsKK30KKworalF1ZXJ5LmV4dGVuZCgg
eworICAgIGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICByZXR1cm4g
aHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7
CisgICAgICAgIHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAorICAgICAgICAg
ICAgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAorICAgICAgICAgICAgaW5QYWdlID0g
alF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKKworICAgICAgICAv
LyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKKyAgICAgICAgaWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hl
Y2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAm
JgorICAgICAgICAgICAgICAgICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKKworICAgICAg
ICAgICAgLy8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBo
dHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKKyAgICAgICAgICAgIGRlc3RFbGVt
ZW50cyA9IGdldEFsbCggY2xvbmUgKTsKKyAgICAgICAgICAgIHNyY0VsZW1lbnRzID0gZ2V0QWxs
KCBlbGVtICk7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgICAgIGZpeElucHV0KCBzcmNFbGVtZW50
c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9u
ZQorICAgICAgICBpZiAoIGRhdGFBbmRFdmVudHMgKSB7CisgICAgICAgICAgICBpZiAoIGRlZXBE
YXRhQW5kRXZlbnRzICkgeworICAgICAgICAgICAgICAgIHNyY0VsZW1lbnRzID0gc3JjRWxlbWVu
dHMgfHwgZ2V0QWxsKCBlbGVtICk7CisgICAgICAgICAgICAgICAgZGVzdEVsZW1lbnRzID0gZGVz
dEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTsKKworICAgICAgICAgICAgICAgIGZvciAoIGkg
PSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAg
ICAgICAgICBjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBp
IF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgLy8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeQor
ICAgICAgICBkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOworICAgICAg
ICBpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgc2V0R2xvYmFs
RXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgInNjcmlwdCIgKSAp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisgICAgICAg
IHJldHVybiBjbG9uZTsKKyAgICB9LAorCisgICAgY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMg
KSB7CisgICAgICAgIHZhciBkYXRhLCBlbGVtLCB0eXBlLAorICAgICAgICAgICAgc3BlY2lhbCA9
IGpRdWVyeS5ldmVudC5zcGVjaWFsLAorICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgZm9y
ICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkgeworICAgICAg
ICAgICAgaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAo
IGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCBkYXRhLmV2ZW50cyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHR5
cGUgaW4gZGF0YS5ldmVudHMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBz
cGVjaWFsWyB0eXBlIF0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mg
b3ZlcmhlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRh
dGEuaGFuZGxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1KworICAgICAgICAgICAgICAgICAgICAvLyBB
c3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmUK
KyAgICAgICAgICAgICAgICAgICAgZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVk
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGVsZW1bIGRhdGFVc2Vy
LmV4cGFuZG8gXSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBDaHJvbWUg
PD0gMzUtNDUrCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVh
ZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZQorICAgICAgICAgICAgICAgICAgICBl
bGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSApOworCitqUXVlcnkuZm4uZXh0ZW5k
KCB7CisKKyAgICAvLyBLZWVwIGRvbU1hbmlwIGV4cG9zZWQgdW50aWwgMy4wIChnaC0yMjI1KQor
ICAgIGRvbU1hbmlwOiBkb21NYW5pcCwKKworICAgIGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9y
ICkgeworICAgICAgICByZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOworICAg
IH0sCisKKyAgICByZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAgICAgICAgcmV0dXJu
IHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTsKKyAgICB9LAorCisgICAgdGV4dDogZnVuY3Rpb24o
IHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUg
KSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisgICAgICAgICAg
ICAgICAgalF1ZXJ5LnRleHQoIHRoaXMgKSA6CisgICAgICAgICAgICAgICAgdGhpcy5lbXB0eSgp
LmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXMubm9kZVR5
cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gKTsKKyAgICAgICAgfSwgbnVs
bCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKyAgICB9LAorCisgICAgYXBwZW5kOiBmdW5j
dGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0
aW9uKCBlbGVtICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRo
aXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisgICAgICAgICAg
ICAgICAgdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOworICAg
ICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApOworICAgICAgICAgICAgfQor
ICAgICAgICB9ICk7CisgICAgfSwKKworICAgIHByZXBlbmQ6IGZ1bmN0aW9uKCkgeworICAgICAg
ICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgICAgICAgICBpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0g
MTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKyAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0
ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CisgICAgICAgICAgICAgICAgdGFy
Z2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSApOworICAgIH0sCisKKyAgICBiZWZvcmU6IGZ1bmN0aW9uKCkgeworICAg
ICAgICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7
CisgICAgICAgICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAgICAgICB0
aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgYWZ0ZXI6IGZ1bmN0aW9uKCkgeworICAgICAg
ICByZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Cisg
ICAgICAgICAgICBpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKKyAgICAgICAgICAgICAgICB0aGlz
LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgZW1wdHk6IGZ1bmN0aW9uKCkg
eworICAgICAgICB2YXIgZWxlbSwKKyAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgIGZvciAo
IDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgeworICAgICAgICAgICAgaWYg
KCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCisgICAgICAgICAgICAgICAgLy8gUHJldmVudCBt
ZW1vcnkgbGVha3MKKyAgICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVs
ZW0sIGZhbHNlICkgKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5n
IG5vZGVzCisgICAgICAgICAgICAgICAgZWxlbS50ZXh0Q29udGVudCA9ICIiOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7CisgICAg
ICAgIGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFB
bmRFdmVudHM7CisgICAgICAgIGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMg
PT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKKworICAgICAgICBy
ZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5j
bG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTsKKyAgICAgICAg
fSApOworICAgIH0sCisKKyAgICBodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgIHJl
dHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBl
bGVtID0gdGhpc1sgMCBdIHx8IHt9LAorICAgICAgICAgICAgICAgIGkgPSAwLAorICAgICAgICAg
ICAgICAgIGwgPSB0aGlzLmxlbmd0aDsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5k
ZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJu
IGVsZW0uaW5uZXJIVE1MOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZWUgaWYg
d2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCisgICAgICAgICAg
ICBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2
YWx1ZSApICYmCisgICAgICAgICAgICAgICAgIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFs
dWUgKSB8fCBbICIiLCAiIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7CisKKyAgICAgICAg
ICAgICAgICB2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApOworCisgICAgICAg
ICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQg
bWVtb3J5IGxlYWtzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUg
PT09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmNsZWFuRGF0YSgg
Z2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxl
bS5pbm5lckhUTUwgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSAwOworCisgICAgICAg
ICAgICAgICAgLy8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0
aGUgZmFsbGJhY2sgbWV0aG9kCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7fQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW0gKSB7CisgICAgICAgICAgICAgICAg
dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwg
bnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKyAgICB9LAorCisgICAgcmVwbGFjZVdp
dGg6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaWdub3JlZCA9IFtdOworCisgICAgICAgIC8v
IE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxl
bWVudCB3aXRoIHRoZSBuZXcgY29udGVudAorICAgICAgICByZXR1cm4gZG9tTWFuaXAoIHRoaXMs
IGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisgICAgICAgICAgICB2YXIgcGFyZW50ID0g
dGhpcy5wYXJlbnROb2RlOworCisgICAgICAgICAgICBpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlz
LCBpZ25vcmVkICkgPCAwICkgeworICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdl
dEFsbCggdGhpcyApICk7CisgICAgICAgICAgICAgICAgaWYgKCBwYXJlbnQgKSB7CisgICAgICAg
ICAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgY2FsbGJhY2sgaW52
b2NhdGlvbgorICAgICAgICB9LCBpZ25vcmVkICk7CisgICAgfQorfSApOworCitqUXVlcnkuZWFj
aCggeworICAgIGFwcGVuZFRvOiAiYXBwZW5kIiwKKyAgICBwcmVwZW5kVG86ICJwcmVwZW5kIiwK
KyAgICBpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorICAgIGluc2VydEFmdGVyOiAiYWZ0ZXIiLAor
ICAgIHJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5h
bCApIHsKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKyAg
ICAgICAgdmFyIGVsZW1zLAorICAgICAgICAgICAgcmV0ID0gW10sCisgICAgICAgICAgICBpbnNl
cnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisgICAgICAgICAgICBsYXN0ID0gaW5zZXJ0Lmxlbmd0
aCAtIDEsCisgICAgICAgICAgICBpID0gMDsKKworICAgICAgICBmb3IgKCA7IGkgPD0gbGFzdDsg
aSsrICkgeworICAgICAgICAgICAgZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xv
bmUoIHRydWUgKTsKKyAgICAgICAgICAgIGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwg
XSggZWxlbXMgKTsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogUXRXZWJLaXQKKyAgICAgICAg
ICAgIC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKyAg
ICAgICAgICAgIHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisgICAgfTsKK30gKTsKKworCit2
YXIgaWZyYW1lLAorICAgIGVsZW1kaXNwbGF5ID0geworCisgICAgICAgIC8vIFN1cHBvcnQ6IEZp
cmVmb3gKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBwcmUtZGVmaW5lIHRoZXNlIHZhbHVlcyBmb3Ig
RkYgKCMxMDIyNykKKyAgICAgICAgSFRNTDogImJsb2NrIiwKKyAgICAgICAgQk9EWTogImJsb2Nr
IgorICAgIH07CisKKy8qKgorICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxl
bWVudAorICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnQKKyAq
IEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0CisgKi8KKworLy8gQ2FsbGVkIG9u
bHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXkKK2Z1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5h
bWUsIGRvYyApIHsKKyAgICB2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5h
bWUgKSApLmFwcGVuZFRvKCBkb2MuYm9keSApLAorCisgICAgICAgIGRpc3BsYXkgPSBqUXVlcnku
Y3NzKCBlbGVtWyAwIF0sICJkaXNwbGF5IiApOworCisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkg
ZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsCisgICAgLy8gc28gdXNlICJkZXRhY2giIG1ldGhv
ZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50CisgICAgZWxlbS5kZXRhY2go
KTsKKworICAgIHJldHVybiBkaXNwbGF5OworfQorCisvKioKKyAqIFRyeSB0byBkZXRlcm1pbmUg
dGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50CisgKiBAcGFyYW0ge1N0cmlu
Z30gbm9kZU5hbWUKKyAqLworZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgewor
ICAgIHZhciBkb2MgPSBkb2N1bWVudCwKKyAgICAgICAgZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBu
b2RlTmFtZSBdOworCisgICAgaWYgKCAhZGlzcGxheSApIHsKKyAgICAgICAgZGlzcGxheSA9IGFj
dHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKKworICAgICAgICAvLyBJZiB0aGUgc2ltcGxl
IHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWUKKyAgICAgICAgaWYgKCBkaXNw
bGF5ID09PSAibm9uZSIgfHwgIWRpc3BsYXkgKSB7CisKKyAgICAgICAgICAgIC8vIFVzZSB0aGUg
YWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZQorICAgICAgICAgICAgaWZyYW1lID0g
KCBpZnJhbWUgfHwgalF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhl
aWdodD0nMCcvPiIgKSApCisgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRF
bGVtZW50ICk7CisKKyAgICAgICAgICAgIC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxl
dG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorICAgICAgICAg
ICAgZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50OworCisgICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRQorICAgICAgICAgICAgZG9jLndyaXRlKCk7CisgICAgICAgICAgICBkb2MuY2xv
c2UoKTsKKworICAgICAgICAgICAgZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBk
b2MgKTsKKyAgICAgICAgICAgIGlmcmFtZS5kZXRhY2goKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQorICAgICAgICBlbGVtZGlzcGxh
eVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CisgICAgfQorCisgICAgcmV0dXJuIGRpc3BsYXk7Cit9
Cit2YXIgcm1hcmdpbiA9ICggL15tYXJnaW4vICk7CisKK3ZhciBybnVtbm9ucHggPSBuZXcgUmVn
RXhwKCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKTsKKwordmFyIGdldFN0
eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgeworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFPD0xMSss
IEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApCisgICAgICAgIC8vIElFIHRocm93cyBvbiBl
bGVtZW50cyBjcmVhdGVkIGluIHBvcHVwcworICAgICAgICAvLyBGRiBtZWFud2hpbGUgdGhyb3dz
IG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUi
CisgICAgICAgIHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OworCisg
ICAgICAgIGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkgeworICAgICAgICAgICAgdmlldyA9
IHdpbmRvdzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5
bGUoIGVsZW0gKTsKKyAgICB9OworCit2YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25z
LCBjYWxsYmFjaywgYXJncyApIHsKKyAgICB2YXIgcmV0LCBuYW1lLAorICAgICAgICBvbGQgPSB7
fTsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcg
b25lcworICAgIGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKyAgICAgICAgb2xkWyBuYW1lIF0g
PSBlbGVtLnN0eWxlWyBuYW1lIF07CisgICAgICAgIGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlv
bnNbIG5hbWUgXTsKKyAgICB9CisKKyAgICByZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJn
cyB8fCBbXSApOworCisgICAgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCisgICAgZm9yICggbmFt
ZSBpbiBvcHRpb25zICkgeworICAgICAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUg
XTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfTsKKworCit2YXIgZG9jdW1lbnRFbGVtZW50
ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisKKworKCBmdW5jdGlvbigpIHsKKyAgICB2
YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHBpeGVsTWFyZ2luUmln
aHRWYWwsIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCwKKyAgICAgICAgY29udGFpbmVyID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKKyAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCggImRpdiIgKTsKKworICAgIC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24t
YnJvd3NlcikgZW52aXJvbm1lbnRzCisgICAgaWYgKCAhZGl2LnN0eWxlICkgeworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU5LTExKworICAgIC8vIFN0eWxlIG9m
IGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKKyAg
ICBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiY29udGVudC1ib3giOworICAgIGRpdi5jbG9u
ZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICIiOworICAgIHN1cHBvcnQuY2xl
YXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3gi
OworCisgICAgY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAiYm9yZGVyOjA7d2lkdGg6OHB4O2hl
aWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDsiICsKKyAgICAgICAgInBhZGRpbmc6MDttYXJnaW4t
dG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZSI7CisgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKCBk
aXYgKTsKKworICAgIC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdS
ZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dAorICAgIC8vIHNvIHRoZXkncmUg
ZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24u
CisgICAgZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7CisgICAgICAgIGRpdi5zdHlsZS5j
c3NUZXh0ID0KKworICAgICAgICAgICAgLy8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAy
LjMKKyAgICAgICAgICAgIC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZworICAgICAgICAgICAg
Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94
O2JveC1zaXppbmc6Ym9yZGVyLWJveDsiICsKKyAgICAgICAgICAgICJwb3NpdGlvbjpyZWxhdGl2
ZTtkaXNwbGF5OmJsb2NrOyIgKworICAgICAgICAgICAgIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7
cGFkZGluZzoxcHg7IiArCisgICAgICAgICAgICAidG9wOjElO3dpZHRoOjUwJSI7CisgICAgICAg
IGRpdi5pbm5lckhUTUwgPSAiIjsKKyAgICAgICAgZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxk
KCBjb250YWluZXIgKTsKKworICAgICAgICB2YXIgZGl2U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0
ZWRTdHlsZSggZGl2ICk7CisgICAgICAgIHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3Ag
IT09ICIxJSI7CisgICAgICAgIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCA9IGRpdlN0eWxlLm1hcmdp
bkxlZnQgPT09ICIycHgiOworICAgICAgICBib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxl
LndpZHRoID09PSAiNHB4IjsKKworICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQu
MyBvbmx5CisgICAgICAgIC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2Ug
dmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndAorICAgICAgICBkaXYuc3R5bGUubWFy
Z2luUmlnaHQgPSAiNTAlIjsKKyAgICAgICAgcGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxl
Lm1hcmdpblJpZ2h0ID09PSAiNHB4IjsKKworICAgICAgICBkb2N1bWVudEVsZW1lbnQucmVtb3Zl
Q2hpbGQoIGNvbnRhaW5lciApOworICAgIH0KKworICAgIGpRdWVyeS5leHRlbmQoIHN1cHBvcnQs
IHsKKyAgICAgICAgcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8v
IFRoaXMgdGVzdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UgYnV0IHdlIHN0aWxsIGRvIG1lbW9pemlu
ZworICAgICAgICAgICAgLy8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUg
cHJlLWNvbXB1dGluZy4KKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRl
c3Qgd2FzIGFscmVhZHkgcGVyZm9ybWVkLCB0aG91Z2guCisgICAgICAgICAgICBjb21wdXRlU3R5
bGVUZXN0cygpOworICAgICAgICAgICAgcmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7CisgICAgICAg
IH0sCisgICAgICAgIGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
IGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBj
b21wdXRlU3R5bGVUZXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJv
eFNpemluZ1JlbGlhYmxlVmFsOworICAgICAgICB9LAorICAgICAgICBwaXhlbE1hcmdpblJpZ2h0
OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCA0LjAtNC4z
CisgICAgICAgICAgICAvLyBXZSdyZSBjaGVja2luZyBmb3IgYm94U2l6aW5nUmVsaWFibGVWYWwg
aGVyZSBpbnN0ZWFkIG9mIHBpeGVsTWFyZ2luUmlnaHRWYWwKKyAgICAgICAgICAgIC8vIHNpbmNl
IHRoYXQgY29tcHJlc3NlcyBiZXR0ZXIgYW5kIHRoZXkncmUgY29tcHV0ZWQgdG9nZXRoZXIgYW55
d2F5LgorICAgICAgICAgICAgaWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkgewor
ICAgICAgICAgICAgICAgIGNvbXB1dGVTdHlsZVRlc3RzKCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICByZXR1cm4gcGl4ZWxNYXJnaW5SaWdodFZhbDsKKyAgICAgICAgfSwKKyAgICAgICAg
cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgLy8gU3VwcG9y
dDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzcK
KyAgICAgICAgICAgIGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKKyAgICAg
ICAgICAgICAgICBjb21wdXRlU3R5bGVUZXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKKyAgICAgICAgfSwKKyAgICAgICAgcmVs
aWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIFN1cHBvcnQ6
IEFuZHJvaWQgMi4zCisgICAgICAgICAgICAvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3
aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5CisgICAgICAgICAgICAvLyBnZXRz
IGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuICgjMzMz
MykKKyAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJl
dHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAorICAgICAgICAgICAgLy8gVGhpcyBz
dXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMg
bmVlZGVkLgorICAgICAgICAgICAgdmFyIHJldCwKKyAgICAgICAgICAgICAgICBtYXJnaW5EaXYg
PSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKTsKKwor
ICAgICAgICAgICAgLy8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJv
cmRlcjsgcGFkZGluZworICAgICAgICAgICAgbWFyZ2luRGl2LnN0eWxlLmNzc1RleHQgPSBkaXYu
c3R5bGUuY3NzVGV4dCA9CisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRyb2lkIDIu
MworICAgICAgICAgICAgICAgIC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZworICAgICAgICAg
ICAgICAgICItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50
LWJveDsiICsKKyAgICAgICAgICAgICAgICAiZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6
MDtwYWRkaW5nOjAiOworICAgICAgICAgICAgbWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0g
bWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOworICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRo
ID0gIjFweCI7CisgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRh
aW5lciApOworCisgICAgICAgICAgICByZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1
dGVkU3R5bGUoIG1hcmdpbkRpdiApLm1hcmdpblJpZ2h0ICk7CisKKyAgICAgICAgICAgIGRvY3Vt
ZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CisgICAgICAgICAgICBkaXYucmVt
b3ZlQ2hpbGQoIG1hcmdpbkRpdiApOworCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAg
ICB9CisgICAgfSApOworfSApKCk7CisKKworZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBj
b21wdXRlZCApIHsKKyAgICB2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAorICAg
ICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKyAgICBjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdl
dFN0eWxlcyggZWxlbSApOworICAgIHJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWQuZ2V0UHJvcGVy
dHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQ7CisKKyAgICAv
LyBTdXBwb3J0OiBPcGVyYSAxMi4xeCBvbmx5CisgICAgLy8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2
ZW4gd2l0aG91dCBjb21wdXRlZAorICAgIC8vIGNvbXB1dGVkIGlzIHVuZGVmaW5lZCBmb3IgZWxl
bXMgb24gZG9jdW1lbnQgZnJhZ21lbnRzCisgICAgaWYgKCAoIHJldCA9PT0gIiIgfHwgcmV0ID09
PSB1bmRlZmluZWQgKSAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVs
ZW0gKSApIHsKKyAgICAgICAgcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7CisgICAg
fQorCisgICAgLy8gU3VwcG9ydDogSUU5CisgICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5
IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNykKKyAgICBpZiAoIGNvbXB1dGVkICkg
eworCisgICAgICAgIC8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVk
d2FyZHMiCisgICAgICAgIC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9y
IHNvbWUgdmFsdWVzLAorICAgICAgICAvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkg
cGl4ZWxzLgorICAgICAgICAvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6
CisgICAgICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1
ZXMKKyAgICAgICAgaWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4
LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgeworCisgICAgICAgICAgICAv
LyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgICAgICB3aWR0aCA9IHN0eWxl
LndpZHRoOworICAgICAgICAgICAgbWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsKKyAgICAgICAg
ICAgIG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CisKKyAgICAgICAgICAgIC8vIFB1dCBpbiB0
aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKKyAgICAgICAgICAgIHN0
eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKKyAgICAg
ICAgICAgIHJldCA9IGNvbXB1dGVkLndpZHRoOworCisgICAgICAgICAgICAvLyBSZXZlcnQgdGhl
IGNoYW5nZWQgdmFsdWVzCisgICAgICAgICAgICBzdHlsZS53aWR0aCA9IHdpZHRoOworICAgICAg
ICAgICAgc3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDsKKyAgICAgICAgICAgIHN0eWxlLm1heFdp
ZHRoID0gbWF4V2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0ICE9PSB1
bmRlZmluZWQgPworCisgICAgICAgIC8vIFN1cHBvcnQ6IElFOS0xMSsKKyAgICAgICAgLy8gSUUg
cmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgcmV0ICsgIiIgOgor
ICAgICAgICByZXQ7Cit9CisKKworZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25Gbiwg
aG9va0ZuICkgeworCisgICAgLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUg
Zmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KKyAgICByZXR1cm4geworICAgICAgICBn
ZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCBjb25kaXRpb25GbigpICkgeworCisg
ICAgICAgICAgICAgICAgLy8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0
byB1c2UgaXQgZHVlCisgICAgICAgICAgICAgICAgLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwg
cmVtb3ZlIGl0LgorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmdldDsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhvb2sgbmVlZGVk
OyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFn
YWluLgorICAgICAgICAgICAgcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhp
cywgYXJndW1lbnRzICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisKK3ZhcgorCisgICAgLy8g
U3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZQorICAgIC8v
IGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgorICAgIC8v
IFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5v
cmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQorICAgIHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFi
bGUoPyEtY1tlYV0pLispLywKKworICAgIGNzc1Nob3cgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUi
LCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheTogImJsb2NrIiB9LAorICAgIGNzc05vcm1h
bFRyYW5zZm9ybSA9IHsKKyAgICAgICAgbGV0dGVyU3BhY2luZzogIjAiLAorICAgICAgICBmb250
V2VpZ2h0OiAiNDAwIgorICAgIH0sCisKKyAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJP
IiwgIk1veiIsICJtcyIgXSwKKyAgICBlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggImRpdiIgKS5zdHlsZTsKKworLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBh
IHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQorZnVuY3Rpb24gdmVuZG9yUHJv
cE5hbWUoIG5hbWUgKSB7CisKKyAgICAvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90
IHZlbmRvciBwcmVmaXhlZAorICAgIGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkgeworICAgICAg
ICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVk
IG5hbWVzCisgICAgdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUu
c2xpY2UoIDEgKSwKKyAgICAgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKKworICAgIHdoaWxl
ICggaS0tICkgeworICAgICAgICBuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7Cisg
ICAgICAgIGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkgeworICAgICAgICAgICAgcmV0dXJuIG5h
bWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Z1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBl
bGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7CisKKyAgICAvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFs
dWVzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgLy8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50Cisg
ICAgdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CisgICAgcmV0dXJuIG1hdGNo
ZXMgPworCisgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUu
Zy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcworICAgICAgICBNYXRoLm1heCggMCwgbWF0Y2hl
c1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8ICJweCIgKSA6
CisgICAgICAgIHZhbHVlOworfQorCitmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxl
bSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7CisgICAgdmFyIGkgPSBleHRy
YSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPworCisgICAgICAg
IC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21l
bnRhdGlvbgorICAgICAgICA0IDoKKworICAgICAgICAvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBm
b3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCisgICAgICAgIG5hbWUgPT09ICJ3
aWR0aCIgPyAxIDogMCwKKworICAgICAgICB2YWwgPSAwOworCisgICAgZm9yICggOyBpIDwgNDsg
aSArPSAyICkgeworCisgICAgICAgIC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwg
c28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKKyAgICAgICAgaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIg
KSB7CisgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBh
bmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzQm9y
ZGVyQm94ICkgeworCisgICAgICAgICAgICAvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcs
IHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnQKKyAgICAgICAgICAgIGlmICggZXh0cmEg
PT09ICJjb250ZW50IiApIHsKKyAgICAgICAgICAgICAgICB2YWwgLT0galF1ZXJ5LmNzcyggZWxl
bSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIg
bm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgorICAgICAgICAgICAgaWYgKCBleHRyYSAhPT0g
Im1hcmdpbiIgKSB7CisgICAgICAgICAgICAgICAgdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJi
b3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2lu
dCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKKyAgICAgICAgICAgIHZhbCAr
PSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5
bGVzICk7CisKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRl
bnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXIKKyAgICAgICAgICAgIGlmICggZXh0cmEgIT09
ICJwYWRkaW5nIiApIHsKKyAgICAgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwg
ImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZhbDsKK30KKworZnVu
Y3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7CisKKyAgICAvLyBT
dGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9y
ZGVyLWJveCB2YWx1ZQorICAgIHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKKyAgICAgICAg
dmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhl
aWdodCwKKyAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCisgICAgICAgIGlzQm9y
ZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9
PT0gImJvcmRlci1ib3giOworCisgICAgLy8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4g
dW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkCisg
ICAgLy8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NjQ5Mjg1CisgICAgLy8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDkxNjY4CisgICAgaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHsK
KworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBp
ZiBuZWNlc3NhcnkKKyAgICAgICAgdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsK
KyAgICAgICAgaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgeworICAgICAgICAgICAgdmFs
ID0gZWxlbS5zdHlsZVsgbmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcHV0ZWQg
dW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi4KKyAgICAgICAgaWYgKCBy
bnVtbm9ucHgudGVzdCggdmFsICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNo
IHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKKyAgICAgICAgLy8gZm9yIGdldENvbXB1dGVkU3R5
bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQorICAgICAg
ICB2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiYKKyAgICAgICAgICAgICggc3VwcG9y
dC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7CisK
KyAgICAgICAgLy8gTm9ybWFsaXplICIiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmEKKyAg
ICAgICAgdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKKyAgICB9CisKKyAgICAvLyBVc2Ug
dGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0
eWxlcworICAgIHJldHVybiAoIHZhbCArCisgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KAor
ICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBleHRyYSB8
fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKKyAgICAgICAgICAgIHZh
bHVlSXNCb3JkZXJCb3gsCisgICAgICAgICAgICBzdHlsZXMKKyAgICAgICAgKQorICAgICkgKyAi
cHgiOworfQorCitmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7CisgICAgdmFy
IGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKKyAgICAgICAgdmFsdWVzID0gW10sCisgICAgICAgIGlu
ZGV4ID0gMCwKKyAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCisgICAgZm9yICgg
OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgZWxlbSA9IGVsZW1lbnRzWyBp
bmRleCBdOworICAgICAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQo
IGVsZW0sICJvbGRkaXNwbGF5IiApOworICAgICAgICBkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNw
bGF5OworICAgICAgICBpZiAoIHNob3cgKSB7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBp
bmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKKyAgICAgICAg
ICAgIC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKKyAgICAgICAgICAg
IGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSAibm9uZSIgKSB7CisgICAgICAg
ICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRp
c3BsYXk6IG5vbmUKKyAgICAgICAgICAgIC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0
aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzCisgICAgICAgICAgICAvLyBmb3Igc3VjaCBhbiBl
bGVtZW50CisgICAgICAgICAgICBpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNI
aWRkZW4oIGVsZW0gKSApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbIGluZGV4IF0gPSBkYXRh
UHJpdi5hY2Nlc3MoCisgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAgICAg
ICAgICJvbGRkaXNwbGF5IiwKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BsYXkoIGVs
ZW0ubm9kZU5hbWUgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApOworCisgICAg
ICAgICAgICBpZiAoIGRpc3BsYXkgIT09ICJub25lIiB8fCAhaGlkZGVuICkgeworICAgICAgICAg
ICAgICAgIGRhdGFQcml2LnNldCgKKyAgICAgICAgICAgICAgICAgICAgZWxlbSwKKyAgICAgICAg
ICAgICAgICAgICAgIm9sZGRpc3BsYXkiLAorICAgICAgICAgICAgICAgICAgICBoaWRkZW4gPyBk
aXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkKKyAgICAgICAgICAgICAgICAp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBkaXNw
bGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKyAgICAvLyB0byBh
dm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CisgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxl
bmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOworICAg
ICAgICBpZiAoICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8
fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgeworICAgICAgICAgICAgZWxlbS5zdHlsZS5k
aXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCAiIiA6ICJub25lIjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBlbGVtZW50czsKK30KKworalF1ZXJ5LmV4dGVuZCggewor
CisgICAgLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBk
ZWZhdWx0CisgICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHBy
b3BlcnR5CisgICAgY3NzSG9va3M6IHsKKyAgICAgICAgb3BhY2l0eTogeworICAgICAgICAgICAg
Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBj
b21wdXRlZCApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGdl
dCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQorICAgICAgICAgICAgICAgICAgICB2YXIgcmV0
ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfSwKKworICAgIC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkICJw
eCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllcworICAgIGNzc051bWJlcjog
eworICAgICAgICAiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAorICAgICAgICAiY29s
dW1uQ291bnQiOiB0cnVlLAorICAgICAgICAiZmlsbE9wYWNpdHkiOiB0cnVlLAorICAgICAgICAi
ZmxleEdyb3ciOiB0cnVlLAorICAgICAgICAiZmxleFNocmluayI6IHRydWUsCisgICAgICAgICJm
b250V2VpZ2h0IjogdHJ1ZSwKKyAgICAgICAgImxpbmVIZWlnaHQiOiB0cnVlLAorICAgICAgICAi
b3BhY2l0eSI6IHRydWUsCisgICAgICAgICJvcmRlciI6IHRydWUsCisgICAgICAgICJvcnBoYW5z
IjogdHJ1ZSwKKyAgICAgICAgIndpZG93cyI6IHRydWUsCisgICAgICAgICJ6SW5kZXgiOiB0cnVl
LAorICAgICAgICAiem9vbSI6IHRydWUKKyAgICB9LAorCisgICAgLy8gQWRkIGluIHByb3BlcnRp
ZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQorICAgIC8vIHNldHRpbmcgb3Ig
Z2V0dGluZyB0aGUgdmFsdWUKKyAgICBjc3NQcm9wczogeworICAgICAgICAiZmxvYXQiOiAiY3Nz
RmxvYXQiCisgICAgfSwKKworICAgIC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBv
biBhIERPTSBOb2RlCisgICAgc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0
cmEgKSB7CisKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50
IG5vZGVzCisgICAgICAgIGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVt
Lm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkgeworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRo
IHRoZSByaWdodCBuYW1lCisgICAgICAgIHZhciByZXQsIHR5cGUsIGhvb2tzLAorICAgICAgICAg
ICAgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCisgICAgICAgICAgICBzdHls
ZSA9IGVsZW0uc3R5bGU7CisKKyAgICAgICAgbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05h
bWUgXSB8fAorICAgICAgICAgICAgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5k
b3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApOworCisgICAgICAgIC8vIEdldHMg
aG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uCisg
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tz
WyBvcmlnTmFtZSBdOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1
ZQorICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICB0eXBl
ID0gdHlwZW9mIHZhbHVlOworCisgICAgICAgICAgICAvLyBDb252ZXJ0ICIrPSIgb3IgIi09IiB0
byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSkKKyAgICAgICAgICAgIGlmICggdHlwZSA9PT0gInN0
cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsK
KyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7CisK
KyAgICAgICAgICAgICAgICAvLyBGaXhlcyBidWcgIzkyMzcKKyAgICAgICAgICAgICAgICB0eXBl
ID0gIm51bWJlciI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0
aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpCisgICAgICAgICAgICBp
ZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgeworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSBudW1iZXIgd2Fz
IHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRp
ZXMpCisgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJudW1iZXIiICkgeworICAgICAgICAgICAg
ICAgIHZhbHVlICs9IHJldCAmJiByZXRbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIG9yaWdO
YW1lIF0gPyAiIiA6ICJweCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3Vw
cG9ydDogSUU5LTExKworICAgICAgICAgICAgLy8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBv
cmlnaW5hbCBjbG9uZSdzIHZhbHVlcworICAgICAgICAgICAgaWYgKCAhc3VwcG9ydC5jbGVhckNs
b25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkg
PT09IDAgKSB7CisgICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNl
IHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAg
ICAgICAgICBpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8CisgICAgICAgICAg
ICAgICAgKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5k
ZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9IHZhbHVlOworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIElmIGEgaG9v
ayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAg
ICAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJgorICAgICAgICAgICAgICAg
ICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQg
KSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9i
amVjdAorICAgICAgICAgICAgcmV0dXJuIHN0eWxlWyBuYW1lIF07CisgICAgICAgIH0KKyAgICB9
LAorCisgICAgY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKKyAg
ICAgICAgdmFyIHZhbCwgbnVtLCBob29rcywKKyAgICAgICAgICAgIG9yaWdOYW1lID0galF1ZXJ5
LmNhbWVsQ2FzZSggbmFtZSApOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdv
cmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorICAgICAgICBuYW1lID0galF1ZXJ5LmNzc1Byb3Bz
WyBvcmlnTmFtZSBdIHx8CisgICAgICAgICAgICAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUg
XSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7CisKKyAgICAgICAg
Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZQorICAg
ICAgICBob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sg
b3JpZ05hbWUgXTsKKworICAgICAgICAvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUg
Y29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorICAgICAgICBpZiAoIGhvb2tzICYmICJnZXQiIGlu
IGhvb2tzICkgeworICAgICAgICAgICAgdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRy
YSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQg
dGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKKyAgICAgICAgaWYgKCB2YWwgPT09
IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgIHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5
bGVzICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1
dGVkIHZhbHVlCisgICAgICAgIGlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05v
cm1hbFRyYW5zZm9ybSApIHsKKyAgICAgICAgICAgIHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsg
bmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBv
ciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisgICAgICAg
IGlmICggZXh0cmEgPT09ICIiIHx8IGV4dHJhICkgeworICAgICAgICAgICAgbnVtID0gcGFyc2VG
bG9hdCggdmFsICk7CisgICAgICAgICAgICByZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5p
dGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZh
bDsKKyAgICB9Cit9ICk7CisKK2pRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1
bmN0aW9uKCBpLCBuYW1lICkgeworICAgIGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0geworICAg
ICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisgICAgICAgICAg
ICBpZiAoIGNvbXB1dGVkICkgeworCisgICAgICAgICAgICAgICAgLy8gQ2VydGFpbiBlbGVtZW50
cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCisgICAg
ICAgICAgICAgICAgLy8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0
aGF0IHdvdWxkIGJlbmVmaXQKKyAgICAgICAgICAgICAgICByZXR1cm4gcmRpc3BsYXlzd2FwLnRl
c3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKKyAgICAgICAgICAgICAgICAg
ICAgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBzd2Fw
KCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0gKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaWR0aE9y
SGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworICAgICAgICAgICAgfQorICAgICAgICB9LAor
CisgICAgICAgIHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHsKKyAgICAgICAg
ICAgIHZhciBtYXRjaGVzLAorICAgICAgICAgICAgICAgIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0
eWxlcyggZWxlbSApLAorICAgICAgICAgICAgICAgIHN1YnRyYWN0ID0gZXh0cmEgJiYgYXVnbWVu
dFdpZHRoT3JIZWlnaHQoCisgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAg
ICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhLAorICAgICAgICAgICAgICAg
ICAgICBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAi
Ym9yZGVyLWJveCIsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlcworICAgICAgICAgICAgICAg
ICk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1l
bnQgaXMgbmVlZGVkCisgICAgICAgICAgICBpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJj
c3NOdW0uZXhlYyggdmFsdWUgKSApICYmCisgICAgICAgICAgICAgICAgKCBtYXRjaGVzWyAzIF0g
fHwgInB4IiApICE9PSAicHgiICkgeworCisgICAgICAgICAgICAgICAgZWxlbS5zdHlsZVsgbmFt
ZSBdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBu
YW1lICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzZXRQb3NpdGl2ZU51
bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CisgICAgICAgIH0KKyAgICB9OworfSApOwor
CitqUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxp
YWJsZU1hcmdpbkxlZnQsCisgICAgZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgICAg
ICBpZiAoIGNvbXB1dGVkICkgeworICAgICAgICAgICAgcmV0dXJuICggcGFyc2VGbG9hdCggY3Vy
Q1NTKCBlbGVtLCAibWFyZ2luTGVmdCIgKSApIHx8CisgICAgICAgICAgICAgICAgZWxlbS5nZXRC
b3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KKyAgICAgICAgICAgICAgICAgICAgc3dhcCggZWxl
bSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKKyAgICAgICAgICAg
ICAgICAgICAgfSApCisgICAgICAgICAgICAgICAgKSArICJweCI7CisgICAgICAgIH0KKyAgICB9
CispOworCisvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMworalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJp
Z2h0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsCisgICAgZnVu
Y3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworICAgICAgICBpZiAoIGNvbXB1dGVkICkgeworICAg
ICAgICAgICAgcmV0dXJuIHN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9
LAorICAgICAgICAgICAgICAgIGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmlnaHQiIF0gKTsKKyAg
ICAgICAgfQorICAgIH0KKyk7CisKKy8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUg
dG8gZXhwYW5kIHByb3BlcnRpZXMKK2pRdWVyeS5lYWNoKCB7CisgICAgbWFyZ2luOiAiIiwKKyAg
ICBwYWRkaW5nOiAiIiwKKyAgICBib3JkZXI6ICJXaWR0aCIKK30sIGZ1bmN0aW9uKCBwcmVmaXgs
IHN1ZmZpeCApIHsKKyAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0gewor
ICAgICAgICBleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZhciBpID0g
MCwKKyAgICAgICAgICAgICAgICBleHBhbmRlZCA9IHt9LAorCisgICAgICAgICAgICAgICAgLy8g
QXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nCisgICAgICAgICAgICAgICAg
cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciID8gdmFsdWUuc3BsaXQoICIgIiApIDog
WyB2YWx1ZSBdOworCisgICAgICAgICAgICBmb3IgKCA7IGkgPCA0OyBpKysgKSB7CisgICAgICAg
ICAgICAgICAgZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPQor
ICAgICAgICAgICAgICAgICAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRz
WyAwIF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBleHBhbmRlZDsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICBpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgewor
ICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0
aXZlTnVtYmVyOworICAgIH0KK30gKTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGNzczog
ZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBm
dW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIgc3R5bGVzLCBs
ZW4sCisgICAgICAgICAgICAgICAgbWFwID0ge30sCisgICAgICAgICAgICAgICAgaSA9IDA7CisK
KyAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsKKyAgICAgICAgICAg
ICAgICBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBu
YW1lLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGxlbjsgaSsrICkgewor
ICAgICAgICAgICAgICAgICAgICBtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwg
bmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJu
IHZhbHVlICE9PSB1bmRlZmluZWQgPworICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggZWxl
bSwgbmFtZSwgdmFsdWUgKSA6CisgICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgbmFt
ZSApOworICAgICAgICB9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKyAg
ICB9LAorICAgIHNob3c6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gc2hvd0hpZGUoIHRo
aXMsIHRydWUgKTsKKyAgICB9LAorICAgIGhpZGU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1
cm4gc2hvd0hpZGUoIHRoaXMgKTsKKyAgICB9LAorICAgIHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRl
ICkgeworICAgICAgICBpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gImJvb2xlYW4iICkgeworICAgICAg
ICAgICAgcmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
aWYgKCBpc0hpZGRlbiggdGhpcyApICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyAp
LnNob3coKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0
aGlzICkuaGlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfQorfSApOwor
CisKK2Z1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsK
KyAgICByZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9w
LCBlbmQsIGVhc2luZyApOworfQoralF1ZXJ5LlR3ZWVuID0gVHdlZW47CisKK1R3ZWVuLnByb3Rv
dHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogVHdlZW4sCisgICAgaW5pdDogZnVuY3Rpb24oIGVs
ZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgeworICAgICAgICB0aGlzLmVs
ZW0gPSBlbGVtOworICAgICAgICB0aGlzLnByb3AgPSBwcm9wOworICAgICAgICB0aGlzLmVhc2lu
ZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OworICAgICAgICB0aGlzLm9wdGlv
bnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigp
OworICAgICAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICAgICAgdGhpcy51bml0ID0gdW5pdCB8fCAo
IGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOworICAgIH0sCisgICAgY3Vy
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlz
LnByb3AgXTsKKworICAgICAgICByZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KKyAgICAgICAg
ICAgIGhvb2tzLmdldCggdGhpcyApIDoKKyAgICAgICAgICAgIFR3ZWVuLnByb3BIb29rcy5fZGVm
YXVsdC5nZXQoIHRoaXMgKTsKKyAgICB9LAorICAgIHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7
CisgICAgICAgIHZhciBlYXNlZCwKKyAgICAgICAgICAgIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tz
WyB0aGlzLnByb3AgXTsKKworICAgICAgICBpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsK
KyAgICAgICAgICAgIHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2lu
ZyBdKAorICAgICAgICAgICAgICAgIHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBl
cmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbgorICAgICAgICAgICAgKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50OworICAg
ICAgICB9CisgICAgICAgIHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVh
c2VkICsgdGhpcy5zdGFydDsKKworICAgICAgICBpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgewor
ICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywg
dGhpcyApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7
CisgICAgICAgICAgICBob29rcy5zZXQoIHRoaXMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9OworCitUd2Vlbi5wcm90b3R5cGUuaW5pdC5w
cm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVuLnByb3BIb29rcyA9IHsKKyAgICBf
ZGVmYXVsdDogeworICAgICAgICBnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKyAgICAgICAgICAg
IHZhciByZXN1bHQ7CisKKyAgICAgICAgICAgIC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVt
ZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsCisgICAgICAgICAgICAv
LyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3Rz
LgorICAgICAgICAgICAgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CisgICAgICAg
ICAgICAgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5z
dHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR3
ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
UGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBh
dXRvbWF0aWNhbGx5CisgICAgICAgICAgICAvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFs
bGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgorICAgICAgICAgICAgLy8gU2lt
cGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0OworICAgICAgICAg
ICAgLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQg
YXMtaXMuCisgICAgICAgICAgICByZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vl
bi5wcm9wLCAiIiApOworCisgICAgICAgICAgICAvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRl
ZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAuCisgICAgICAgICAgICByZXR1cm4g
IXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CisgICAgICAgIH0sCisg
ICAgICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgeworCisgICAgICAgICAgICAvLyBVc2Ugc3Rl
cCBob29rIGZvciBiYWNrIGNvbXBhdC4KKyAgICAgICAgICAgIC8vIFVzZSBjc3NIb29rIGlmIGl0
cyB0aGVyZS4KKyAgICAgICAgICAgIC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2Ug
cGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCisgICAgICAgICAgICBpZiAoIGpRdWVy
eS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LmZ4LnN0
ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR3ZWVu
LmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKKyAgICAgICAgICAgICAgICAoIHR3ZWVuLmVsZW0uc3R5
bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fAorICAgICAgICAg
ICAgICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgeworICAgICAgICAg
ICAgICAgIGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsg
dHdlZW4udW5pdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0d2Vl
bi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9Cit9OworCisvLyBTdXBwb3J0OiBJRTkKKy8vIFBhbmljIGJhc2VkIGFwcHJvYWNo
IHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2RlcworVHdlZW4ucHJvcEhvb2tz
LnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0geworICAgIHNldDogZnVu
Y3Rpb24oIHR3ZWVuICkgeworICAgICAgICBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdl
ZW4uZWxlbS5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgdHdlZW4uZWxlbVsgdHdlZW4ucHJv
cCBdID0gdHdlZW4ubm93OworICAgICAgICB9CisgICAgfQorfTsKKworalF1ZXJ5LmVhc2luZyA9
IHsKKyAgICBsaW5lYXI6IGZ1bmN0aW9uKCBwICkgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9
LAorICAgIHN3aW5nOiBmdW5jdGlvbiggcCApIHsKKyAgICAgICAgcmV0dXJuIDAuNSAtIE1hdGgu
Y29zKCBwICogTWF0aC5QSSApIC8gMjsKKyAgICB9LAorICAgIF9kZWZhdWx0OiAic3dpbmciCit9
OworCitqUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsKKworLy8gQmFjayBDb21wYXQg
PDEuOCBleHRlbnNpb24gcG9pbnQKK2pRdWVyeS5meC5zdGVwID0ge307CisKKworCisKK3Zhcgor
ICAgIGZ4Tm93LCB0aW1lcklkLAorICAgIHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRl
KSQvLAorICAgIHJydW4gPSAvcXVldWVIb29rcyQvOworCisvLyBBbmltYXRpb25zIGNyZWF0ZWQg
c3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5CitmdW5jdGlvbiBjcmVhdGVGeE5v
dygpIHsKKyAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CisgICAgICAgIGZ4Tm93
ID0gdW5kZWZpbmVkOworICAgIH0gKTsKKyAgICByZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3co
KSApOworfQorCisvLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFu
aW1hdGlvbgorZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsKKyAgICB2YXIg
d2hpY2gsCisgICAgICAgIGkgPSAwLAorICAgICAgICBhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07
CisKKyAgICAvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxs
IGNzc0V4cGFuZCB2YWx1ZXMsCisgICAgLy8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBz
a2lwIG92ZXIgTGVmdCBhbmQgUmlnaHQKKyAgICBpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGgg
PyAxIDogMDsKKyAgICBmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkgewor
ICAgICAgICB3aGljaCA9IGNzc0V4cGFuZFsgaSBdOworICAgICAgICBhdHRyc1sgIm1hcmdpbiIg
KyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworICAgIH0KKwor
ICAgIGlmICggaW5jbHVkZVdpZHRoICkgeworICAgICAgICBhdHRycy5vcGFjaXR5ID0gYXR0cnMu
d2lkdGggPSB0eXBlOworICAgIH0KKworICAgIHJldHVybiBhdHRyczsKK30KKworZnVuY3Rpb24g
Y3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7CisgICAgdmFyIHR3ZWVuLAor
ICAgICAgICBjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSAp
LmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAorICAgICAgICBpbmRleCA9IDAs
CisgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOworICAgIGZvciAoIDsgaW5kZXgg
PCBsZW5ndGg7IGluZGV4KysgKSB7CisgICAgICAgIGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25b
IGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7CisKKyAgICAgICAg
ICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CisgICAgICAgICAgICByZXR1cm4g
dHdlZW47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Z1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIo
IGVsZW0sIHByb3BzLCBvcHRzICkgeworICAgIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi8K
KyAgICB2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLCBkaXNw
bGF5LCBjaGVja0Rpc3BsYXksCisgICAgICAgIGFuaW0gPSB0aGlzLAorICAgICAgICBvcmlnID0g
e30sCisgICAgICAgIHN0eWxlID0gZWxlbS5zdHlsZSwKKyAgICAgICAgaGlkZGVuID0gZWxlbS5u
b2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLAorICAgICAgICBkYXRhU2hvdyA9IGRhdGFQcml2
LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKKworICAgIC8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJv
bWlzZXMKKyAgICBpZiAoICFvcHRzLnF1ZXVlICkgeworICAgICAgICBob29rcyA9IGpRdWVyeS5f
cXVldWVIb29rcyggZWxlbSwgImZ4IiApOworICAgICAgICBpZiAoIGhvb2tzLnVucXVldWVkID09
IG51bGwgKSB7CisgICAgICAgICAgICBob29rcy51bnF1ZXVlZCA9IDA7CisgICAgICAgICAgICBv
bGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKKyAgICAgICAgICAgIGhvb2tzLmVtcHR5LmZpcmUg
PSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoICFob29rcy51bnF1ZXVlZCApIHsK
KyAgICAgICAgICAgICAgICAgICAgb2xkZmlyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgaG9va3MudW5xdWV1ZWQrKzsKKworICAgICAg
ICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUg
Y29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCisgICAgICAg
ICAgICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaG9va3MudW5x
dWV1ZWQtLTsKKyAgICAgICAgICAgICAgICBpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIg
KS5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgIGhvb2tzLmVtcHR5LmZpcmUoKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0gKTsKKyAgICB9CisK
KyAgICAvLyBIZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzcworICAgIGlmICggZWxlbS5ub2RlVHlw
ZSA9PT0gMSAmJiAoICJoZWlnaHQiIGluIHByb3BzIHx8ICJ3aWR0aCIgaW4gcHJvcHMgKSApIHsK
KworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKKyAgICAgICAg
Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90
CisgICAgICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dY
IGFuZAorICAgICAgICAvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQorICAg
ICAgICBvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBz
dHlsZS5vdmVyZmxvd1kgXTsKKworICAgICAgICAvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBp
bmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAorICAgICAgICAvLyBhbmltYXRpb25zIG9uIGlu
bGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkCisgICAg
ICAgIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKKworICAgICAgICAv
LyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAibm9uZSIKKyAg
ICAgICAgY2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gIm5vbmUiID8KKyAgICAgICAgICAgIGRh
dGFQcml2LmdldCggZWxlbSwgIm9sZGRpc3BsYXkiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0u
bm9kZU5hbWUgKSA6IGRpc3BsYXk7CisKKyAgICAgICAgaWYgKCBjaGVja0Rpc3BsYXkgPT09ICJp
bmxpbmUiICYmIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgeworICAg
ICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOworICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKCBvcHRzLm92ZXJmbG93ICkgeworICAgICAgICBzdHlsZS5vdmVyZmxvdyA9
ICJoaWRkZW4iOworICAgICAgICBhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7CisgICAgICAgICAg
ICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKKyAgICAgICAgICAgIHN0eWxl
Lm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKKyAgICAgICAgICAgIHN0eWxlLm92ZXJm
bG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKKyAgICAgICAgfSApOworICAgIH0KKworICAgIC8v
IHNob3cvaGlkZSBwYXNzCisgICAgZm9yICggcHJvcCBpbiBwcm9wcyApIHsKKyAgICAgICAgdmFs
dWUgPSBwcm9wc1sgcHJvcCBdOworICAgICAgICBpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkg
KSB7CisgICAgICAgICAgICBkZWxldGUgcHJvcHNbIHByb3AgXTsKKyAgICAgICAgICAgIHRvZ2ds
ZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2dsZSI7CisgICAgICAgICAgICBpZiAoIHZhbHVl
ID09PSAoIGhpZGRlbiA/ICJoaWRlIiA6ICJzaG93IiApICkgeworCisgICAgICAgICAgICAgICAg
Ly8gSWYgdGhlcmUgaXMgZGF0YVNob3cgbGVmdCBvdmVyIGZyb20gYSBzdG9wcGVkIGhpZGUgb3Ig
c2hvdworICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRo
IHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgorICAgICAgICAgICAgICAgIGlm
ICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1
bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3JpZ1sgcHJvcCBdID0gZGF0
YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsK
KworICAgICAgICAvLyBBbnkgbm9uLWZ4IHZhbHVlIHN0b3BzIHVzIGZyb20gcmVzdG9yaW5nIHRo
ZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBk
aXNwbGF5ID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAhalF1ZXJ5
LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKKyAgICAgICAgaWYgKCBkYXRhU2hvdyApIHsKKyAg
ICAgICAgICAgIGlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7CisgICAgICAgICAgICAgICAg
aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sICJmeHNob3ci
LCB7fSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2ds
ZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byAicmV2ZXJzZSIKKyAgICAgICAgaWYgKCB0
b2dnbGUgKSB7CisgICAgICAgICAgICBkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuOworICAgICAg
ICB9CisgICAgICAgIGlmICggaGlkZGVuICkgeworICAgICAgICAgICAgalF1ZXJ5KCBlbGVtICku
c2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5pbS5kb25lKCBmdW5jdGlv
bigpIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5oaWRlKCk7CisgICAgICAgICAg
ICB9ICk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIHZhciBwcm9wOworCisgICAgICAgICAgICBkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJm
eHNob3ciICk7CisgICAgICAgICAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAgICAgICAg
ICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSApOworICAgICAgICBmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisgICAg
ICAgICAgICB0d2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDog
MCwgcHJvcCwgYW5pbSApOworCisgICAgICAgICAgICBpZiAoICEoIHByb3AgaW4gZGF0YVNob3cg
KSApIHsKKyAgICAgICAgICAgICAgICBkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7Cisg
ICAgICAgICAgICAgICAgaWYgKCBoaWRkZW4gKSB7CisgICAgICAgICAgICAgICAgICAgIHR3ZWVu
LmVuZCA9IHR3ZWVuLnN0YXJ0OworICAgICAgICAgICAgICAgICAgICB0d2Vlbi5zdGFydCA9IHBy
b3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIgPyAxIDogMDsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIC8vIElmIHRoaXMgaXMgYSBu
b29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2
YWx1ZQorICAgIH0gZWxzZSBpZiAoICggZGlzcGxheSA9PT0gIm5vbmUiID8gZGVmYXVsdERpc3Bs
YXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkgKSA9PT0gImlubGluZSIgKSB7CisgICAgICAg
IHN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5OworICAgIH0KK30KKworZnVuY3Rpb24gcHJvcEZpbHRl
ciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7CisgICAgdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcs
IHZhbHVlLCBob29rczsKKworICAgIC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhw
YW5kIGNzc0hvb2sgcGFzcworICAgIGZvciAoIGluZGV4IGluIHByb3BzICkgeworICAgICAgICBu
YW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKKyAgICAgICAgZWFzaW5nID0gc3BlY2lh
bEVhc2luZ1sgbmFtZSBdOworICAgICAgICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOworICAgICAg
ICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworICAgICAgICAgICAgZWFzaW5nID0g
dmFsdWVbIDEgXTsKKyAgICAgICAgICAgIHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsg
MCBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKyAgICAg
ICAgICAgIHByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sg
aW5kZXggXTsKKyAgICAgICAgfQorCisgICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBu
YW1lIF07CisgICAgICAgIGlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CisgICAg
ICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKKyAgICAgICAgICAgIGRlbGV0
ZSBwcm9wc1sgbmFtZSBdOworCisgICAgICAgICAgICAvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRo
aXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCisgICAgICAgICAgICAvLyBSZXVzaW5n
ICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgorICAgICAgICAgICAg
Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBp
biBwcm9wcyApICkgeworICAgICAgICAgICAgICAgICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVl
WyBpbmRleCBdOworICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0g
ZWFzaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKyAgICAgICAg
fQorICAgIH0KK30KKworZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRp
b25zICkgeworICAgIHZhciByZXN1bHQsCisgICAgICAgIHN0b3BwZWQsCisgICAgICAgIGluZGV4
ID0gMCwKKyAgICAgICAgbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAorICAg
ICAgICBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7CisK
KyAgICAgICAgICAgIC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3Rv
cgorICAgICAgICAgICAgZGVsZXRlIHRpY2suZWxlbTsKKyAgICAgICAgfSApLAorICAgICAgICB0
aWNrID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoIHN0b3BwZWQgKSB7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGN1
cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKKyAgICAgICAgICAgICAgICByZW1h
aW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJh
dGlvbiAtIGN1cnJlbnRUaW1lICksCisKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBBbmRy
b2lkIDIuMworICAgICAgICAgICAgICAgIC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93
IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKKyAgICAgICAgICAgICAgICB0
ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsCisgICAgICAgICAgICAg
ICAgcGVyY2VudCA9IDEgLSB0ZW1wLAorICAgICAgICAgICAgICAgIGluZGV4ID0gMCwKKyAgICAg
ICAgICAgICAgICBsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDsKKworICAgICAgICAg
ICAgZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgICAgICAgICAg
YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBl
cmNlbnQsIHJlbWFpbmluZyBdICk7CisKKyAgICAgICAgICAgIGlmICggcGVyY2VudCA8IDEgJiYg
bGVuZ3RoICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBb
IGFuaW1hdGlvbiBdICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgfQorICAgICAgICB9LAorICAgICAgICBhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7
CisgICAgICAgICAgICBlbGVtOiBlbGVtLAorICAgICAgICAgICAgcHJvcHM6IGpRdWVyeS5leHRl
bmQoIHt9LCBwcm9wZXJ0aWVzICksCisgICAgICAgICAgICBvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0
cnVlLCB7CisgICAgICAgICAgICAgICAgc3BlY2lhbEVhc2luZzoge30sCisgICAgICAgICAgICAg
ICAgZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CisgICAgICAgICAgICB9LCBvcHRpb25z
ICksCisgICAgICAgICAgICBvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCisgICAgICAg
ICAgICBvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCisgICAgICAgICAgICBzdGFydFRpbWU6IGZ4
Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJh
dGlvbiwKKyAgICAgICAgICAgIHR3ZWVuczogW10sCisgICAgICAgICAgICBjcmVhdGVUd2Vlbjog
ZnVuY3Rpb24oIHByb3AsIGVuZCApIHsKKyAgICAgICAgICAgICAgICB2YXIgdHdlZW4gPSBqUXVl
cnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsCisgICAgICAgICAgICAg
ICAgICAgICAgICBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0
aW9uLm9wdHMuZWFzaW5nICk7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnR3ZWVucy5wdXNo
KCB0d2VlbiApOworICAgICAgICAgICAgICAgIHJldHVybiB0d2VlbjsKKyAgICAgICAgICAgIH0s
CisgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKKyAgICAgICAgICAgICAg
ICB2YXIgaW5kZXggPSAwLAorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBnb2lu
ZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucworICAgICAgICAgICAg
ICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnQKKyAgICAgICAgICAgICAgICAg
ICAgbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKKyAgICAg
ICAgICAgICAgICBpZiAoIHN0b3BwZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKKyAg
ICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTsKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHdoZW4gd2UgcGxh
eWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdAorICAgICAgICAgICAgICAgIGlm
ICggZ290b0VuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0aCgg
ZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJl
ZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOworICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdFdpdGgo
IGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gKSwKKyAg
ICAgICAgcHJvcHMgPSBhbmltYXRpb24ucHJvcHM7CisKKyAgICBwcm9wRmlsdGVyKCBwcm9wcywg
YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOworCisgICAgZm9yICggOyBpbmRleCA8IGxl
bmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgIHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJz
WyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7
CisgICAgICAgIGlmICggcmVzdWx0ICkgeworICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5j
dGlvbiggcmVzdWx0LnN0b3AgKSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuX3F1ZXVlSG9v
a3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQorICAgICAg
ICAgICAgICAgICAgICBqUXVlcnkucHJveHkoIHJlc3VsdC5zdG9wLCByZXN1bHQgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApOworCisgICAg
aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKKyAgICAg
ICAgYW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7CisgICAgfQor
CisgICAgalF1ZXJ5LmZ4LnRpbWVyKAorICAgICAgICBqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7Cisg
ICAgICAgICAgICBlbGVtOiBlbGVtLAorICAgICAgICAgICAgYW5pbTogYW5pbWF0aW9uLAorICAg
ICAgICAgICAgcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCisgICAgICAgIH0gKQorICAgICk7
CisKKyAgICAvLyBhdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9ucworICAgIHJldHVybiBhbmlt
YXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKKyAgICAgICAgLmRvbmUo
IGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKKyAgICAgICAg
LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKQorICAgICAgICAuYWx3YXlzKCBhbmltYXRpb24u
b3B0cy5hbHdheXMgKTsKK30KKworalF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFu
aW1hdGlvbiwgeworICAgIHR3ZWVuZXJzOiB7CisgICAgICAgICIqIjogWyBmdW5jdGlvbiggcHJv
cCwgdmFsdWUgKSB7CisgICAgICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBw
cm9wLCB2YWx1ZSApOworICAgICAgICAgICAgYWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCBy
Y3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7CisgICAgICAgICAgICByZXR1cm4gdHdlZW47
CisgICAgICAgIH0gXQorICAgIH0sCisKKyAgICB0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNh
bGxiYWNrICkgeworICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkgewor
ICAgICAgICAgICAgY2FsbGJhY2sgPSBwcm9wczsKKyAgICAgICAgICAgIHByb3BzID0gWyAiKiIg
XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BzID0gcHJvcHMubWF0Y2goIHJu
b3R3aGl0ZSApOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHByb3AsCisgICAgICAgICAgICBp
bmRleCA9IDAsCisgICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisKKyAgICAgICAg
Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisgICAgICAgICAgICBwcm9wID0g
cHJvcHNbIGluZGV4IF07CisgICAgICAgICAgICBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9
IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOworICAgICAgICAgICAgQW5pbWF0aW9u
LnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKKyAgICAgICAgfQorICAgIH0s
CisKKyAgICBwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKKworICAgIHByZWZpbHRl
cjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkgeworICAgICAgICBpZiAoIHByZXBlbmQg
KSB7CisgICAgICAgICAgICBBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayAp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQW5pbWF0aW9uLnByZWZpbHRlcnMucHVz
aCggY2FsbGJhY2sgKTsKKyAgICAgICAgfQorICAgIH0KK30gKTsKKworalF1ZXJ5LnNwZWVkID0g
ZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgeworICAgIHZhciBvcHQgPSBzcGVlZCAmJiB0
eXBlb2Ygc3BlZWQgPT09ICJvYmplY3QiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7
CisgICAgICAgIGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CisgICAgICAgICAgICBq
UXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKyAgICAgICAgZHVyYXRpb246IHNw
ZWVkLAorICAgICAgICBlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5p
c0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcKKyAgICB9OworCisgICAgb3B0LmR1cmF0aW9u
ID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/
CisgICAgICAgIG9wdC5kdXJhdGlvbiA6IG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRz
ID8KKyAgICAgICAgICAgIGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5
LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworICAgIC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVl
L3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKKyAgICBpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9w
dC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKyAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsKKyAgICB9CisK
KyAgICAvLyBRdWV1ZWluZworICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisKKyAgICBvcHQu
Y29tcGxldGUgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
b3B0Lm9sZCApICkgeworICAgICAgICAgICAgb3B0Lm9sZC5jYWxsKCB0aGlzICk7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIG9wdC5xdWV1ZSApIHsKKyAgICAgICAgICAgIGpRdWVyeS5kZXF1
ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4g
b3B0OworfTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGZhZGVUbzogZnVuY3Rpb24oIHNw
ZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsKKworICAgICAgICAvLyBTaG93IGFueSBoaWRk
ZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKKyAgICAgICAgcmV0dXJuIHRo
aXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCisKKyAgICAg
ICAgICAgIC8vIEFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZAorICAgICAgICAgICAgLmVu
ZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsK
KyAgICB9LAorICAgIGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxs
YmFjayApIHsKKyAgICAgICAgdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3Ag
KSwKKyAgICAgICAgICAgIG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2Fs
bGJhY2sgKSwKKyAgICAgICAgICAgIGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7CisKKyAgICAg
ICAgICAgICAgICAvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBl
YXNpbmcgd29uJ3QgYmUgbG9zdAorICAgICAgICAgICAgICAgIHZhciBhbmltID0gQW5pbWF0aW9u
KCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTsKKworICAgICAgICAg
ICAgICAgIC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlh
dGVseQorICAgICAgICAgICAgICAgIGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCAi
ZmluaXNoIiApICkgeworICAgICAgICAgICAgICAgICAgICBhbmltLnN0b3AoIHRydWUgKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZG9BbmltYXRpb24u
ZmluaXNoID0gZG9BbmltYXRpb247CisKKyAgICAgICAgcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5x
dWV1ZSA9PT0gZmFsc2UgPworICAgICAgICAgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoK
KyAgICAgICAgICAgIHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTsKKyAg
ICB9LAorICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewor
ICAgICAgICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgeworICAgICAgICAgICAg
dmFyIHN0b3AgPSBob29rcy5zdG9wOworICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Cisg
ICAgICAgICAgICBzdG9wKCBnb3RvRW5kICk7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKCB0
eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBnb3RvRW5kID0gY2xlYXJR
dWV1ZTsKKyAgICAgICAgICAgIGNsZWFyUXVldWUgPSB0eXBlOworICAgICAgICAgICAgdHlwZSA9
IHVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAh
PT0gZmFsc2UgKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHZhciBkZXF1ZXVlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICBpbmRleCA9IHR5
cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAorICAgICAgICAgICAgICAgIHRpbWVy
cyA9IGpRdWVyeS50aW1lcnMsCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFQcml2LmdldCgg
dGhpcyApOworCisgICAgICAgICAgICBpZiAoIGluZGV4ICkgeworICAgICAgICAgICAgICAgIGlm
ICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICggaW5kZXggaW4gZGF0YSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4
IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICggaW5kZXgg
PSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRpbWVy
c1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmCisgICAgICAgICAgICAgICAgICAgICggdHlwZSA9
PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgeworCisgICAgICAg
ICAgICAgICAgICAgIHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTsKKyAgICAg
ICAgICAgICAgICAgICAgZGVxdWV1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aW1l
cnMuc3BsaWNlKCBpbmRleCwgMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0
IHN0ZXAgd2Fzbid0IGZvcmNlZC4KKyAgICAgICAgICAgIC8vIFRpbWVycyBjdXJyZW50bHkgd2ls
bCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKKyAgICAgICAgICAgIC8vIHdp
bGwgZGVxdWV1ZSBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZC4KKyAgICAgICAgICAgIGlm
ICggZGVxdWV1ZSB8fCAhZ290b0VuZCApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1
ZSggdGhpcywgdHlwZSApOworICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfSwKKyAg
ICBmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAgICBpZiAoIHR5cGUgIT09IGZhbHNl
ICkgeworICAgICAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBpbmRleCwK
KyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksCisgICAgICAgICAg
ICAgICAgcXVldWUgPSBkYXRhWyB0eXBlICsgInF1ZXVlIiBdLAorICAgICAgICAgICAgICAgIGhv
b2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAorICAgICAgICAgICAgICAgIHRpbWVy
cyA9IGpRdWVyeS50aW1lcnMsCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcXVldWUgPyBxdWV1
ZS5sZW5ndGggOiAwOworCisgICAgICAgICAgICAvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24g
cHJpdmF0ZSBkYXRhCisgICAgICAgICAgICBkYXRhLmZpbmlzaCA9IHRydWU7CisKKyAgICAgICAg
ICAgIC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdAorICAgICAgICAgICAgalF1ZXJ5LnF1ZXVlKCB0
aGlzLCB0eXBlLCBbXSApOworCisgICAgICAgICAgICBpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3Ag
KSB7CisgICAgICAgICAgICAgICAgaG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9u
cywgYW5kIGZpbmlzaCB0aGVtCisgICAgICAgICAgICBmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5n
dGg7IGluZGV4LS07ICkgeworICAgICAgICAgICAgICAgIGlmICggdGltZXJzWyBpbmRleCBdLmVs
ZW0gPT09IHRoaXMgJiYgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgeworICAgICAg
ICAgICAgICAgICAgICB0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7CisgICAgICAg
ICAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9u
cyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbQorICAgICAgICAgICAgZm9yICggaW5k
ZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAo
IHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKKyAgICAgICAgICAg
ICAgICAgICAgcXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFR1cm4gb2ZmIGZpbmlzaGlu
ZyBmbGFnCisgICAgICAgICAgICBkZWxldGUgZGF0YS5maW5pc2g7CisgICAgICAgIH0gKTsKKyAg
ICB9Cit9ICk7CisKK2pRdWVyeS5lYWNoKCBbICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBm
dW5jdGlvbiggaSwgbmFtZSApIHsKKyAgICB2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsK
KyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFj
ayApIHsKKyAgICAgICAgcmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSAi
Ym9vbGVhbiIgPworICAgICAgICAgICAgY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoK
KyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVh
c2luZywgY2FsbGJhY2sgKTsKKyAgICB9OworfSApOworCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMg
Zm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCggeworICAgIHNsaWRlRG93bjogZ2Vu
RngoICJzaG93IiApLAorICAgIHNsaWRlVXA6IGdlbkZ4KCAiaGlkZSIgKSwKKyAgICBzbGlkZVRv
Z2dsZTogZ2VuRngoICJ0b2dnbGUiICksCisgICAgZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9
LAorICAgIGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0sCisgICAgZmFkZVRvZ2dsZTogeyBv
cGFjaXR5OiAidG9nZ2xlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7CisgICAgalF1
ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Cisg
ICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFj
ayApOworICAgIH07Cit9ICk7CisKK2pRdWVyeS50aW1lcnMgPSBbXTsKK2pRdWVyeS5meC50aWNr
ID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHRpbWVyLAorICAgICAgICBpID0gMCwKKyAgICAgICAg
dGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworICAgIGZ4Tm93ID0galF1ZXJ5Lm5vdygpOworCisg
ICAgZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICB0aW1lciA9IHRp
bWVyc1sgaSBdOworCisgICAgICAgIC8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5
IGJlZW4gcmVtb3ZlZAorICAgICAgICBpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0
aW1lciApIHsKKyAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGktLSwgMSApOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKyAgICAgICAgalF1ZXJ5LmZ4
LnN0b3AoKTsKKyAgICB9CisgICAgZnhOb3cgPSB1bmRlZmluZWQ7Cit9OworCitqUXVlcnkuZngu
dGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7CisgICAgalF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1l
ciApOworICAgIGlmICggdGltZXIoKSApIHsKKyAgICAgICAgalF1ZXJ5LmZ4LnN0YXJ0KCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgalF1ZXJ5LnRpbWVycy5wb3AoKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKK2pRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewor
ICAgIGlmICggIXRpbWVySWQgKSB7CisgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2
YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKyAgICB9Cit9OworCitq
UXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgIHdpbmRvdy5jbGVhckludGVydmFsKCB0
aW1lcklkICk7CisKKyAgICB0aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMg
PSB7CisgICAgc2xvdzogNjAwLAorICAgIGZhc3Q6IDIwMCwKKworICAgIC8vIERlZmF1bHQgc3Bl
ZWQKKyAgICBfZGVmYXVsdDogNDAwCit9OworCisKKy8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2lu
IGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi4KKy8vIGh0dHA6Ly93ZWIuYXJjaGl2
ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBo
cC8yMDA5LzA3L2pxdWVyeS1kZWxheS8KK2pRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1l
LCB0eXBlICkgeworICAgIHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1l
IF0gfHwgdGltZSA6IHRpbWU7CisgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKKworICAgIHJldHVy
biB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7CisgICAgICAgIHZh
ciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsKKyAgICAgICAgaG9v
a3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCgg
dGltZW91dCApOworICAgICAgICB9OworICAgIH0gKTsKK307CisKKworKCBmdW5jdGlvbigpIHsK
KyAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisgICAg
ICAgIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCisgICAgICAg
IG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggIm9wdGlv
biIgKSApOworCisgICAgaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CisKKyAgICAvLyBTdXBwb3J0
OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yKworICAgIC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hl
Y2tib3ggc2hvdWxkIGJlICJvbiIKKyAgICBzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAh
PT0gIiI7CisKKyAgICAvLyBTdXBwb3J0OiBJRTw9MTErCisgICAgLy8gTXVzdCBhY2Nlc3Mgc2Vs
ZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3QKKyAgICBzdXBwb3J0Lm9w
dFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkOworCisgICAgLy8gU3VwcG9ydDogQW5kcm9pZDw9Mi4z
CisgICAgLy8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkg
bWFya2VkIGFzIGRpc2FibGVkCisgICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKKyAgICBzdXBw
b3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworICAgIC8vIFN1cHBvcnQ6IElFPD0x
MSsKKyAgICAvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRp
bworICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOworICAgIGlu
cHV0LnZhbHVlID0gInQiOworICAgIGlucHV0LnR5cGUgPSAicmFkaW8iOworICAgIHN1cHBvcnQu
cmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7Cit9ICkoKTsKKworCit2YXIgYm9vbEhv
b2ssCisgICAgYXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7CisKK2pRdWVyeS5m
bi5leHRlbmQoIHsKKyAgICBhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAg
IHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRz
Lmxlbmd0aCA+IDEgKTsKKyAgICB9LAorCisgICAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUg
KSB7CisgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTsKKyAgICAgICAgfSApOworICAgIH0KK30g
KTsKKworalF1ZXJ5LmV4dGVuZCggeworICAgIGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2
YWx1ZSApIHsKKyAgICAgICAgdmFyIHJldCwgaG9va3MsCisgICAgICAgICAgICBuVHlwZSA9IGVs
ZW0ubm9kZVR5cGU7CisKKyAgICAgICAgLy8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRl
eHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcworICAgICAgICBpZiAoIG5UeXBlID09PSAz
IHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgeworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMg
YXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUg
PT09ICJ1bmRlZmluZWQiICkgeworICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVt
LCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMg
YXJlIGxvd2VyY2FzZQorICAgICAgICAvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBk
ZWZpbmVkCisgICAgICAgIGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxl
bSApICkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAg
ICAgIGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8CisgICAgICAgICAgICAgICAg
KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZp
bmVkICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7
CisgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBudWxsICkgeworICAgICAgICAgICAgICAgIGpR
dWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tz
ICYmCisgICAgICAgICAgICAgICAgKCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1l
ICkgKSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSAr
ICIiICk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBu
YW1lICkgKSAhPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0K
KworICAgICAgICByZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7CisKKyAgICAg
ICAgLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0
byB1bmRlZmluZWQKKyAgICAgICAgcmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0
OworICAgIH0sCisKKyAgICBhdHRySG9va3M6IHsKKyAgICAgICAgdHlwZTogeworICAgICAgICAg
ICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAh
c3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSAicmFkaW8iICYmCisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgeworICAgICAgICAgICAg
ICAgICAgICB2YXIgdmFsID0gZWxlbS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5z
ZXRBdHRyaWJ1dGUoICJ0eXBlIiwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2
YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnZhbHVlID0gdmFsOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorCisgICAgcmVt
b3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgICAgICB2YXIgbmFtZSwgcHJv
cE5hbWUsCisgICAgICAgICAgICBpID0gMCwKKyAgICAgICAgICAgIGF0dHJOYW1lcyA9IHZhbHVl
ICYmIHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKTsKKworICAgICAgICBpZiAoIGF0dHJOYW1lcyAm
JiBlbGVtLm5vZGVUeXBlID09PSAxICkgeworICAgICAgICAgICAgd2hpbGUgKCAoIG5hbWUgPSBh
dHRyTmFtZXNbIGkrKyBdICkgKSB7CisgICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBqUXVlcnku
cHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CisKKyAgICAgICAgICAgICAgICAvLyBCb29sZWFuIGF0
dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApCisgICAgICAgICAgICAgICAg
aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZQorICAgICAg
ICAgICAgICAgICAgICBlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30gKTsKKworLy8gSG9va3MgZm9yIGJvb2xlYW4g
YXR0cmlidXRlcworYm9vbEhvb2sgPSB7CisgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUs
IG5hbWUgKSB7CisgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgeworCisgICAgICAgICAg
ICAvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlCisgICAgICAg
ICAgICBqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9OworalF1ZXJ5LmVhY2goIGpRdWVyeS5leHBy
Lm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7
CisgICAgdmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRy
OworCisgICAgYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1M
ICkgeworICAgICAgICB2YXIgcmV0LCBoYW5kbGU7CisgICAgICAgIGlmICggIWlzWE1MICkgewor
CisgICAgICAgICAgICAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJl
bW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCisgICAgICAgICAgICBoYW5kbGUg
PSBhdHRySGFuZGxlWyBuYW1lIF07CisgICAgICAgICAgICBhdHRySGFuZGxlWyBuYW1lIF0gPSBy
ZXQ7CisgICAgICAgICAgICByZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVs
bCA/CisgICAgICAgICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpIDoKKyAgICAgICAgICAgICAg
ICBudWxsOworICAgICAgICAgICAgYXR0ckhhbmRsZVsgbmFtZSBdID0gaGFuZGxlOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKK30gKTsKKworCisKKwordmFyIHJmb2N1
c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLAorICAgIHJjbGlj
a2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICBwcm9w
OiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMs
IGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKyAgICB9
LAorCisgICAgcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7CisgICAgICAgIHJldHVybiB0
aGlzLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZGVsZXRlIHRoaXNbIGpRdWVyeS5w
cm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOworICAgICAgICB9ICk7CisgICAgfQorfSApOworCitq
UXVlcnkuZXh0ZW5kKCB7CisgICAgcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkg
eworICAgICAgICB2YXIgcmV0LCBob29rcywKKyAgICAgICAgICAgIG5UeXBlID0gZWxlbS5ub2Rl
VHlwZTsKKworICAgICAgICAvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29t
bWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCisgICAgICAgIGlmICggblR5cGUgPT09IDMgfHwgblR5
cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0g
KSApIHsKKworICAgICAgICAgICAgLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcworICAgICAg
ICAgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKKyAgICAgICAgICAg
IGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworICAgICAgICAgICAgaWYgKCBob29rcyAmJiAi
c2V0IiBpbiBob29rcyAmJgorICAgICAgICAgICAgICAgICggcmV0ID0gaG9va3Muc2V0KCBlbGVt
LCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICByZXR1
cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKCBlbGVtWyBuYW1l
IF0gPSB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBp
biBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7
CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVs
ZW1bIG5hbWUgXTsKKyAgICB9LAorCisgICAgcHJvcEhvb2tzOiB7CisgICAgICAgIHRhYkluZGV4
OiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCisgICAgICAgICAgICAg
ICAgLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCisgICAgICAgICAg
ICAgICAgLy8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0
CisgICAgICAgICAgICAgICAgLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAx
LzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2
YXNjcmlwdC8KKyAgICAgICAgICAgICAgICAvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2
YWwoIzEyMDcyKQorICAgICAgICAgICAgICAgIHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0
dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0YWJpbmRl
eCA/CisgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6CisgICAg
ICAgICAgICAgICAgICAgIHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CisgICAg
ICAgICAgICAgICAgICAgICAgICByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBl
bGVtLmhyZWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKwor
ICAgIHByb3BGaXg6IHsKKyAgICAgICAgImZvciI6ICJodG1sRm9yIiwKKyAgICAgICAgImNsYXNz
IjogImNsYXNzTmFtZSIKKyAgICB9Cit9ICk7CisKKy8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQor
Ly8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5CisvLyBmb3JjZXMgdGhlIGJy
b3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCisvLyBvbiB0aGUgb3B0aW9uCisvLyBU
aGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZAorLy8gd2hlbiBp
biBhbiBvcHRncm91cAoraWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKKyAgICBqUXVlcnku
cHJvcEhvb2tzLnNlbGVjdGVkID0geworICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewor
ICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKyAgICAgICAgICAgIGlm
ICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgeworICAgICAgICAgICAgICAgIHBhcmVu
dC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSApIHsK
KyAgICAgICAgICAgIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisgICAgICAgICAgICBp
ZiAoIHBhcmVudCApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuc2VsZWN0ZWRJbmRleDsKKwor
ICAgICAgICAgICAgICAgIGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CisgICAgICAgICAgICAg
ICAgICAgIHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KKworalF1ZXJ5LmVhY2goIFsK
KyAgICAidGFiSW5kZXgiLAorICAgICJyZWFkT25seSIsCisgICAgIm1heExlbmd0aCIsCisgICAg
ImNlbGxTcGFjaW5nIiwKKyAgICAiY2VsbFBhZGRpbmciLAorICAgICJyb3dTcGFuIiwKKyAgICAi
Y29sU3BhbiIsCisgICAgInVzZU1hcCIsCisgICAgImZyYW1lQm9yZGVyIiwKKyAgICAiY29udGVu
dEVkaXRhYmxlIgorXSwgZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5LnByb3BGaXhbIHRoaXMudG9M
b3dlckNhc2UoKSBdID0gdGhpczsKK30gKTsKKworCisKKwordmFyIHJjbGFzcyA9IC9bXHRcclxu
XGZdL2c7CisKK2Z1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgeworICAgIHJldHVybiBlbGVtLmdl
dEF0dHJpYnV0ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSggImNsYXNzIiApIHx8ICIiOworfQorCitq
UXVlcnkuZm4uZXh0ZW5kKCB7CisgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAg
ICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZh
bHVlLAorICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlv
biggdmFsdWUgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBq
ICkgeworICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxs
KCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKKyAgICAgICAgICAgIH0gKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSAp
IHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107
CisKKyAgICAgICAgICAgIHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKKyAgICAg
ICAgICAgICAgICBjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CisgICAgICAgICAgICAgICAg
Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAoICIgIiAr
IGN1clZhbHVlICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKTsKKworICAgICAgICAgICAg
ICAgIGlmICggY3VyICkgeworICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAg
ICAgICAgICAgd2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAw
ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciArPSBjbGF6eiArICIgIjsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgIC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRl
ZCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBqUXVlcnkudHJp
bSggY3VyICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFs
dWUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSggImNsYXNz
IiwgZmluYWxWYWx1ZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAg
fSwKKworICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CisgICAgICAgIHZhciBj
bGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwKKyAgICAg
ICAgICAgIGkgPSAwOworCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkg
KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKKyAgICAg
ICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywg
aiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgeworICAgICAgICAgICAgcmV0dXJuIHRo
aXMuYXR0ciggImNsYXNzIiwgIiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdHlwZW9m
IHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSApIHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSB2
YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107CisKKyAgICAgICAgICAgIHdoaWxlICggKCBl
bGVtID0gdGhpc1sgaSsrIF0gKSApIHsKKyAgICAgICAgICAgICAgICBjdXJWYWx1ZSA9IGdldENs
YXNzKCBlbGVtICk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVy
ZSBmb3IgYmV0dGVyIGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKQorICAgICAgICAgICAg
ICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgKCAi
ICIgKyBjdXJWYWx1ZSArICIgIiApLnJlcGxhY2UoIHJjbGFzcywgIiAiICk7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGN1ciApIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAg
ICAgICAgICAgICAgIHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXMKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkg
PiAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXIucmVwbGFjZSgg
IiAiICsgY2xhenogKyAiICIsICIgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhc3NpZ24g
aWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy4KKyAgICAgICAgICAgICAg
ICAgICAgZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgdG9nZ2xlQ2xhc3M6IGZ1bmN0
aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CisgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVl
OworCisgICAgICAgIGlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgdHlwZSA9
PT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENs
YXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnko
IHRoaXMgKS50b2dnbGVDbGFzcygKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuY2FsbCggdGhp
cywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSwKKyAgICAgICAgICAgICAgICAgICAg
c3RhdGVWYWwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSApOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2
YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzOworCisgICAgICAgICAgICBpZiAoIHR5
cGUgPT09ICJzdHJpbmciICkgeworCisgICAgICAgICAgICAgICAgLy8gVG9nZ2xlIGluZGl2aWR1
YWwgY2xhc3MgbmFtZXMKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICBz
ZWxmID0galF1ZXJ5KCB0aGlzICk7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IHZhbHVl
Lm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKKworICAgICAgICAgICAgICAgIHdoaWxlICggKCBj
bGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkgeworCisgICAgICAgICAgICAgICAgICAg
IC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAorICAg
ICAgICAgICAgICAgICAgICBpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CisgICAg
ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFk
ZENsYXNzKCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gImJvb2xlYW4i
ICkgeworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7CisgICAg
ICAgICAgICAgICAgaWYgKCBjbGFzc05hbWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8g
U3RvcmUgY2xhc3NOYW1lIGlmIHNldAorICAgICAgICAgICAgICAgICAgICBkYXRhUHJpdi5zZXQo
IHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBp
ZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHJlbW92ZSB0
aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQp
LgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBw
cmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksCisgICAgICAgICAgICAgICAgLy8gZmFsbGlu
ZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgorICAgICAg
ICAgICAgICAgIGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgICAg
IHRoaXMuc2V0QXR0cmlidXRlKCAiY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xh
c3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiIiA6
CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHJpdi5nZXQoIHRoaXMsICJfX2NsYXNzTmFt
ZV9fIiApIHx8ICIiCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisgICAgfSwKKworICAgIGhhc0NsYXNzOiBmdW5j
dGlvbiggc2VsZWN0b3IgKSB7CisgICAgICAgIHZhciBjbGFzc05hbWUsIGVsZW0sCisgICAgICAg
ICAgICBpID0gMDsKKworICAgICAgICBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIjsK
KyAgICAgICAgd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgeworICAgICAgICAgICAg
aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCisgICAgICAgICAgICAgICAgKCAiICIgKyBnZXRD
bGFzcyggZWxlbSApICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKQorICAgICAgICAgICAg
ICAgICAgICAuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMQorICAgICAgICAgICAgKSB7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfSApOworCisKKworCit2YXIgcnJldHVybiA9IC9c
ci9nLAorICAgIHJzcGFjZXMgPSAvW1x4MjBcdFxyXG5cZl0rL2c7CisKK2pRdWVyeS5mbi5leHRl
bmQoIHsKKyAgICB2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKyAgICAgICAgdmFyIGhvb2tzLCBy
ZXQsIGlzRnVuY3Rpb24sCisgICAgICAgICAgICBlbGVtID0gdGhpc1sgMCBdOworCisgICAgICAg
IGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CisgICAgICAgICAgICBpZiAoIGVsZW0gKSB7Cisg
ICAgICAgICAgICAgICAgaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8Cisg
ICAgICAgICAgICAgICAgICAgIGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpIF07CisKKyAgICAgICAgICAgICAgICBpZiAoIGhvb2tzICYmCisgICAgICAgICAgICAg
ICAgICAgICJnZXQiIGluIGhvb2tzICYmCisgICAgICAgICAgICAgICAgICAgICggcmV0ID0gaG9v
a3MuZ2V0KCBlbGVtLCAidmFsdWUiICkgKSAhPT0gdW5kZWZpbmVkCisgICAgICAgICAgICAgICAg
KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgcmV0ID0gZWxlbS52YWx1ZTsKKworICAgICAgICAgICAgICAgIHJl
dHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/CisKKyAgICAgICAgICAgICAgICAgICAgLy8g
SGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcworICAgICAgICAgICAgICAgICAgICByZXQu
cmVwbGFjZSggcnJldHVybiwgIiIgKSA6CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxl
IGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCisgICAgICAgICAgICAg
ICAgICAgIHJldCA9PSBudWxsID8gIiIgOiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNG
dW5jdGlvbiggdmFsdWUgKTsKKworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigg
aSApIHsKKyAgICAgICAgICAgIHZhciB2YWw7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5ub2Rl
VHlwZSAhPT0gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICggaXNGdW5jdGlvbiApIHsKKyAgICAgICAgICAgICAgICB2YWwgPSB2
YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVy
cyB0byBzdHJpbmcKKyAgICAgICAgICAgIGlmICggdmFsID09IG51bGwgKSB7CisgICAgICAgICAg
ICAgICAgdmFsID0gIiI7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09
ICJudW1iZXIiICkgeworICAgICAgICAgICAgICAgIHZhbCArPSAiIjsKKworICAgICAgICAgICAg
fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgeworICAgICAgICAgICAgICAgIHZh
bCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkgeworICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKyAgICAgICAgICAg
ICAgICB9ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnZh
bEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9M
b3dlckNhc2UoKSBdOworCisgICAgICAgICAgICAvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQs
IGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZworICAgICAgICAgICAgaWYgKCAhaG9va3MgfHwg
ISggInNldCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgInZhbHVlIiApID09
PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSApOworICAgIH0KK30gKTsKKworalF1ZXJ5LmV4dGVuZCggewor
ICAgIHZhbEhvb2tzOiB7CisgICAgICAgIG9wdGlvbjogeworICAgICAgICAgICAgZ2V0OiBmdW5j
dGlvbiggZWxlbSApIHsKKworICAgICAgICAgICAgICAgIHZhciB2YWwgPSBqUXVlcnkuZmluZC5h
dHRyKCBlbGVtLCAidmFsdWUiICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxs
ID8KKyAgICAgICAgICAgICAgICAgICAgdmFsIDoKKworICAgICAgICAgICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRTEwLTExKworICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb24udGV4dCB0aHJv
d3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCisgICAgICAgICAgICAgICAgICAgIC8vIFN0
cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBz
Oi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlCisg
ICAgICAgICAgICAgICAgICAgIGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICkucmVw
bGFjZSggcnNwYWNlcywgIiAiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAg
IHNlbGVjdDogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKyAgICAgICAg
ICAgICAgICB2YXIgdmFsdWUsIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9
IGVsZW0ub3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBlbGVtLnNlbGVjdGVk
SW5kZXgsCisgICAgICAgICAgICAgICAgICAgIG9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1v
bmUiIHx8IGluZGV4IDwgMCwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gb25lID8gbnVs
bCA6IFtdLAorICAgICAgICAgICAgICAgICAgICBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRp
b25zLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaSA9IGluZGV4IDwgMCA/CisgICAgICAg
ICAgICAgICAgICAgICAgICBtYXggOgorICAgICAgICAgICAgICAgICAgICAgICAgb25lID8gaW5k
ZXggOiAwOworCisgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0
ZWQgb3B0aW9ucworICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IG1heDsgaSsrICkgeworICAg
ICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25zWyBpIF07CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAo
IzI1NTEpCisgICAgICAgICAgICAgICAgICAgIGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9
PT0gaW5kZXggKSAmJgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmV0
dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc3VwcG9ydC5vcHREaXNhYmxlZCA/CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0
QXR0cmlidXRlKCAiZGlzYWJsZWQiICkgPT09IG51bGwgKSAmJgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAi
b3B0Z3JvdXAiICkgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBz
cGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgdmFs
dWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBvbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzLnB1c2goIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisgICAg
ICAgICAgICAgICAgdmFyIG9wdGlvblNldCwgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICBv
cHRpb25zID0gZWxlbS5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBqUXVl
cnkubWFrZUFycmF5KCB2YWx1ZSApLAorICAgICAgICAgICAgICAgICAgICBpID0gb3B0aW9ucy5s
ZW5ndGg7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIG9w
dGlvbi5zZWxlY3RlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuaW5BcnJheSgg
alF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xCisgICAg
ICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uU2V0ID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBu
b24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CisgICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9uU2V0
ICkgeworICAgICAgICAgICAgICAgICAgICBlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KK30gKTsKKworLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdl
dHRlci9zZXR0ZXIKK2pRdWVyeS5lYWNoKCBbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rp
b24oKSB7CisgICAgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CisgICAgICAgIHNldDogZnVu
Y3Rpb24oIGVsZW0sIHZhbHVlICkgeworICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgg
dmFsdWUgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVl
cnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7
CisgICAgICAgIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkg
eworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09IG51
bGwgPyAib24iIDogZWxlbS52YWx1ZTsKKyAgICAgICAgfTsKKyAgICB9Cit9ICk7CisKKworCisK
Ky8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KKworCit2YXIg
cmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87CisKK2pRdWVy
eS5leHRlbmQoIGpRdWVyeS5ldmVudCwgeworCisgICAgdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50
LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CisKKyAgICAgICAgdmFyIGksIGN1ciwgdG1w
LCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwKKyAgICAgICAgICAgIGV2ZW50
UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLAorICAgICAgICAgICAgdHlwZSA9IGhhc093bi5j
YWxsKCBldmVudCwgInR5cGUiICkgPyBldmVudC50eXBlIDogZXZlbnQsCisgICAgICAgICAgICBu
YW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFt
ZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOworCisgICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBl
bGVtIHx8IGRvY3VtZW50OworCisgICAgICAgIC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFu
ZCBjb21tZW50IG5vZGVzCisgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVt
Lm5vZGVUeXBlID09PSA4ICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBu
b3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93CisgICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCgg
dHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewor
CisgICAgICAgICAgICAvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBt
YXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisgICAgICAgICAgICBuYW1lc3BhY2VzID0gdHlw
ZS5zcGxpdCggIi4iICk7CisgICAgICAgICAgICB0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwor
ICAgICAgICAgICAgbmFtZXNwYWNlcy5zb3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgb250eXBl
ID0gdHlwZS5pbmRleE9mKCAiOiIgKSA8IDAgJiYgIm9uIiArIHR5cGU7CisKKyAgICAgICAgLy8g
Q2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0
IGFuIGV2ZW50IHR5cGUgc3RyaW5nCisgICAgICAgIGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBh
bmRvIF0gPworICAgICAgICAgICAgZXZlbnQgOgorICAgICAgICAgICAgbmV3IGpRdWVyeS5FdmVu
dCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOworCisgICAgICAg
IC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1
ZXJ5IChhbHdheXMgdHJ1ZSkKKyAgICAgICAgZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJz
ID8gMiA6IDM7CisgICAgICAgIGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggIi4i
ICk7CisgICAgICAgIGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgPworICAgICAg
ICAgICAgbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86Lipc
XC58KSIgKSArICIoXFwufCQpIiApIDoKKyAgICAgICAgICAgIG51bGw7CisKKyAgICAgICAgLy8g
Q2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCisgICAgICAgIGV2
ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKKyAgICAgICAgaWYgKCAhZXZlbnQudGFyZ2V0ICkgewor
ICAgICAgICAgICAgZXZlbnQudGFyZ2V0ID0gZWxlbTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcg
dGhlIGhhbmRsZXIgYXJnIGxpc3QKKyAgICAgICAgZGF0YSA9IGRhdGEgPT0gbnVsbCA/CisgICAg
ICAgICAgICBbIGV2ZW50IF0gOgorICAgICAgICAgICAgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwg
WyBldmVudCBdICk7CisKKyAgICAgICAgLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBv
dXRzaWRlIHRoZSBsaW5lcworICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxb
IHR5cGUgXSB8fCB7fTsKKyAgICAgICAgaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJp
Z2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUg
ZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgj
OTk1MSkKKyAgICAgICAgLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsg
d2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKKyAgICAgICAgaWYg
KCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3co
IGVsZW0gKSApIHsKKworICAgICAgICAgICAgYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVU
eXBlIHx8IHR5cGU7CisgICAgICAgICAgICBpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVU
eXBlICsgdHlwZSApICkgeworICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnROb2RlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnRO
b2RlICkgeworICAgICAgICAgICAgICAgIGV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKKyAgICAgICAg
ICAgICAgICB0bXAgPSBjdXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkg
YWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3Ig
ZGV0YWNoZWQgRE9NKQorICAgICAgICAgICAgaWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3Vt
ZW50IHx8IGRvY3VtZW50ICkgKSB7CisgICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1c2goIHRt
cC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQg
cGF0aAorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsg
aSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKworICAgICAgICAg
ICAgZXZlbnQudHlwZSA9IGkgPiAxID8KKyAgICAgICAgICAgICAgICBidWJibGVUeXBlIDoKKyAg
ICAgICAgICAgICAgICBzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7CisKKyAgICAgICAgICAgIC8v
IGpRdWVyeSBoYW5kbGVyCisgICAgICAgICAgICBoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3Vy
LCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJgorICAgICAgICAgICAgICAgIGRh
dGFQcml2LmdldCggY3VyLCAiaGFuZGxlIiApOworICAgICAgICAgICAgaWYgKCBoYW5kbGUgKSB7
CisgICAgICAgICAgICAgICAgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gTmF0aXZlIGhhbmRsZXIKKyAgICAgICAgICAgIGhhbmRsZSA9
IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworICAgICAgICAgICAgaWYgKCBoYW5kbGUgJiYgaGFu
ZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgeworICAgICAgICAgICAgICAgIGV2ZW50
LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7CisgICAgICAgICAgICAgICAgaWYg
KCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkgeworICAgICAgICAgICAgICAgICAgICBldmVudC5w
cmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBldmVudC50eXBlID0gdHlwZTsKKworICAgICAgICAvLyBJZiBub2JvZHkg
cHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CisgICAgICAgIGlmICggIW9u
bHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CisKKyAgICAgICAg
ICAgIGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAorICAgICAgICAgICAgICAgIHNwZWNpYWwu
X2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmCisg
ICAgICAgICAgICAgICAgYWNjZXB0RGF0YSggZWxlbSApICkgeworCisgICAgICAgICAgICAgICAg
Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBu
YW1lIG5hbWUgYXMgdGhlIGV2ZW50LgorICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGRlZmF1
bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgj
NjE3MCkKKyAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbigg
ZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCisgICAgICAg
ICAgICAgICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBj
YWxsIGl0cyBGT08oKSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZWxlbVsgb250
eXBlIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNh
bWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQorICAgICAgICAgICAg
ICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKKyAgICAgICAgICAgICAgICAg
ICAgZWxlbVsgdHlwZSBdKCk7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmln
Z2VyZWQgPSB1bmRlZmluZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIHJldHVybiBldmVudC5yZXN1bHQ7CisgICAgfSwKKworICAgIC8vIFBpZ2d5YmFj
ayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZQorICAgIC8vIFVz
ZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCisgICAgc2ltdWxhdGU6IGZ1bmN0
aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHsKKyAgICAgICAgdmFyIGUgPSBqUXVlcnkuZXh0ZW5k
KAorICAgICAgICAgICAgbmV3IGpRdWVyeS5FdmVudCgpLAorICAgICAgICAgICAgZXZlbnQsCisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKKyAgICAgICAgICAgICAg
ICBpc1NpbXVsYXRlZDogdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CisgICAgfQorCit9ICk7CisK
K2pRdWVyeS5mbi5leHRlbmQoIHsKKworICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRh
ICkgeworICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
IGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CisgICAgICAgIH0gKTsK
KyAgICB9LAorICAgIHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKyAg
ICAgICAgdmFyIGVsZW0gPSB0aGlzWyAwIF07CisgICAgICAgIGlmICggZWxlbSApIHsKKyAgICAg
ICAgICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1
ZSApOworICAgICAgICB9CisgICAgfQorfSApOworCisKK2pRdWVyeS5lYWNoKCAoICJibHVyIGZv
Y3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxj
bGljayAiICsKKyAgICAibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3Vz
ZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisgICAgImNoYW5nZSBzZWxlY3Qgc3VibWl0
IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiICkuc3BsaXQoICIgIiAp
LAorICAgIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCisgICAgLy8gSGFuZGxlIGV2ZW50IGJpbmRp
bmcKKyAgICBqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsKKyAgICAg
ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KKyAgICAgICAgICAgIHRoaXMub24oIG5h
bWUsIG51bGwsIGRhdGEsIGZuICkgOgorICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCBuYW1lICk7
CisgICAgfTsKK30gKTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAgIGhvdmVyOiBmdW5jdGlv
biggZm5PdmVyLCBmbk91dCApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5P
dmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7CisgICAgfQorfSApOworCisKKwor
CitzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CisKKworLy8gU3VwcG9y
dDogRmlyZWZveAorLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50
cworLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3df
YnVnLmNnaT9pZD02ODc3ODcKKy8vCisvLyBTdXBwb3J0OiBDaHJvbWUsIFNhZmFyaQorLy8gZm9j
dXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCisvLyB3
aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0z
LUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXIKKy8vIFJlbGF0ZWQgdGlja2V0
IC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0
OTg1NworaWYgKCAhc3VwcG9ydC5mb2N1c2luICkgeworICAgIGpRdWVyeS5lYWNoKCB7IGZvY3Vz
OiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsK
KworICAgICAgICAvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRv
Y3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAorICAgICAgICB2YXIg
aGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKKyAgICAgICAgICAgIGpRdWVyeS5ldmVudC5z
aW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsK
KyAgICAgICAgfTsKKworICAgICAgICBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7Cisg
ICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGRvYyA9
IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBhdHRhY2hl
cyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKKworICAgICAgICAgICAgICAgIGlmICgg
IWF0dGFjaGVzICkgeworICAgICAgICAgICAgICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigg
b3JpZywgaGFuZGxlciwgdHJ1ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTsKKyAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICB0ZWFyZG93bjogZnVuY3Rpb24oKSB7CisgICAgICAg
ICAgICAgICAgdmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorICAgICAgICAg
ICAgICAgICAgICBhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CisK
KyAgICAgICAgICAgICAgICBpZiAoICFhdHRhY2hlcyApIHsKKyAgICAgICAgICAgICAgICAgICAg
ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKyAgICAgICAg
ICAgICAgICAgICAgZGF0YVByaXYucmVtb3ZlKCBkb2MsIGZpeCApOworCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZp
eCwgYXR0YWNoZXMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH07CisgICAgfSApOworfQordmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uOworCit2YXIg
bm9uY2UgPSBqUXVlcnkubm93KCk7CisKK3ZhciBycXVlcnkgPSAoIC9cPy8gKTsKKworCisKKy8v
IFN1cHBvcnQ6IEFuZHJvaWQgMi4zCisvLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNh
c3QgbnVsbCBpbnB1dAoralF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgeworICAg
IHJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgIiIgKTsKK307CisKKworLy8gQ3Jvc3MtYnJvd3Nl
ciB4bWwgcGFyc2luZworalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7CisgICAg
dmFyIHhtbDsKKyAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsK
KyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gU3VwcG9ydDogSUU5CisgICAg
dHJ5IHsKKyAgICAgICAgeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9t
U3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7CisgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAg
IHhtbCA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1l
bnRzQnlUYWdOYW1lKCAicGFyc2VyZXJyb3IiICkubGVuZ3RoICkgeworICAgICAgICBqUXVlcnku
ZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKKyAgICB9CisgICAgcmV0dXJuIHhtbDsK
K307CisKKwordmFyCisgICAgcmhhc2ggPSAvIy4qJC8sCisgICAgcnRzID0gLyhbPyZdKV89W14m
XSovLAorICAgIHJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKKworICAg
IC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgorICAgIHJs
b2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZp
bGV8cmVzfHdpZGdldCk6JC8sCisgICAgcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCisg
ICAgcnByb3RvY29sID0gL15cL1wvLywKKworICAgIC8qIFByZWZpbHRlcnMKKyAgICAgKiAxKSBU
aGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pz
b25wLmpzIGZvciBhbiBleGFtcGxlKQorICAgICAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CisgICAg
ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydAorICAgICAqICAgIC0gQUZURVIg
cGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEg
aXMgdHJ1ZSkKKyAgICAgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCisgICAgICogNCkgdGhlIGNh
dGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQKKyAgICAgKiA1KSBleGVjdXRpb24gd2lsbCBz
dGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIq
IiBpZiBuZWVkZWQKKyAgICAgKi8KKyAgICBwcmVmaWx0ZXJzID0ge30sCisKKyAgICAvKiBUcmFu
c3BvcnRzIGJpbmRpbmdzCisgICAgICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZQorICAgICAqIDIp
IHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCisgICAgICogMykgc2VsZWN0aW9u
IHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlm
IG5lZWRlZAorICAgICAqLworICAgIHRyYW5zcG9ydHMgPSB7fSwKKworICAgIC8vIEF2b2lkIGNv
bW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFu
ZCBldmFkZSBjb21wcmVzc2lvbgorICAgIGFsbFR5cGVzID0gIiovIi5jb25jYXQoICIqIiApLAor
CisgICAgLy8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luCisgICAg
b3JpZ2luQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CisgICAgb3JpZ2lu
QW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOworCisvLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9y
IGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAorZnVuY3Rpb24g
YWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CisKKyAgICAvLyBkYXRh
VHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgorICAgIHJldHVy
biBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgeworCisgICAgICAgIGlmICgg
dHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7CisgICAgICAgICAgICBm
dW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOworICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9u
ID0gIioiOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGFUeXBlLAorICAgICAgICAgICAg
aSA9IDAsCisgICAgICAgICAgICBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dl
ckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107CisKKyAgICAgICAgaWYgKCBqUXVlcnku
aXNGdW5jdGlvbiggZnVuYyApICkgeworCisgICAgICAgICAgICAvLyBGb3IgZWFjaCBkYXRhVHlw
ZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCisgICAgICAgICAgICB3aGlsZSAoICggZGF0YVR5
cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBQcmVwZW5k
IGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgICAgIGlmICggZGF0YVR5cGVbIDAgXSA9PT0gIisi
ICkgeworICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkg
fHwgIioiOworICAgICAgICAgICAgICAgICAgICAoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0
cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTsKKworICAgICAgICAg
ICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICAoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0
YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQorCisvLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rp
b24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0aW9uIGluc3BlY3RQcmVmaWx0
ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFY
SFIgKSB7CisKKyAgICB2YXIgaW5zcGVjdGVkID0ge30sCisgICAgICAgIHNlZWtpbmdUcmFuc3Bv
cnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApOworCisgICAgZnVuY3Rpb24gaW5zcGVj
dCggZGF0YVR5cGUgKSB7CisgICAgICAgIHZhciBzZWxlY3RlZDsKKyAgICAgICAgaW5zcGVjdGVk
WyBkYXRhVHlwZSBdID0gdHJ1ZTsKKyAgICAgICAgalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0
YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKKyAgICAg
ICAgICAgIHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRp
b25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CisgICAgICAgICAgICBpZiAoIHR5cGVvZiBk
YXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5nIiAmJgorICAgICAgICAgICAgICAgICFzZWVr
aW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKKwor
ICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFu
c3BvcnQgKTsKKyAgICAgICAgICAgICAgICBpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICgg
c2Vla2luZ1RyYW5zcG9ydCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gISggc2VsZWN0ZWQg
PSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gKTsKKyAg
ICAgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHJldHVybiBpbnNwZWN0KCBvcHRp
b25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioi
ICk7Cit9CisKKy8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucworLy8gdGhhdCB0
YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCisvLyBGaXhlcyAj
OTg4NworZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7CisgICAgdmFyIGtleSwg
ZGVlcCwKKyAgICAgICAgZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRp
b25zIHx8IHt9OworCisgICAgZm9yICgga2V5IGluIHNyYyApIHsKKyAgICAgICAgaWYgKCBzcmNb
IGtleSBdICE9PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAoIGZsYXRPcHRpb25zWyBrZXkg
XSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtl
eSBdOworICAgICAgICB9CisgICAgfQorICAgIGlmICggZGVlcCApIHsKKyAgICAgICAgalF1ZXJ5
LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7CisgICAgfQorCisgICAgcmV0dXJuIHRhcmdl
dDsKK30KKworLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgorICogLSBm
aW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFu
ZCBleHBlY3RlZCBkYXRhVHlwZSkKKyAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNw
b25zZQorICovCitmdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9u
c2VzICkgeworCisgICAgdmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBl
LAorICAgICAgICBjb250ZW50cyA9IHMuY29udGVudHMsCisgICAgICAgIGRhdGFUeXBlcyA9IHMu
ZGF0YVR5cGVzOworCisgICAgLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50
LXR5cGUgaW4gdGhlIHByb2Nlc3MKKyAgICB3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIg
KSB7CisgICAgICAgIGRhdGFUeXBlcy5zaGlmdCgpOworICAgICAgICBpZiAoIGN0ID09PSB1bmRl
ZmluZWQgKSB7CisgICAgICAgICAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9u
c2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBD
aGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKKyAgICBpZiAo
IGN0ICkgeworICAgICAgICBmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgeworICAgICAgICAgICAg
aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHsK
KyAgICAgICAgICAgICAgICBkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hl
Y2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBl
CisgICAgaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisgICAgICAgIGZpbmFs
RGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIFRy
eSBjb252ZXJ0aWJsZSBkYXRhVHlwZXMKKyAgICAgICAgZm9yICggdHlwZSBpbiByZXNwb25zZXMg
KSB7CisgICAgICAgICAgICBpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5
cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgeworICAgICAgICAgICAgICAgIGZpbmFsRGF0
YVR5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKKyAgICAgICAgICAgICAgICBmaXJzdERh
dGFUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE9y
IGp1c3QgdXNlIGZpcnN0IG9uZQorICAgICAgICBmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlw
ZSB8fCBmaXJzdERhdGFUeXBlOworICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5
cGUKKyAgICAvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAorICAg
IC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKKyAgICBpZiAoIGZpbmFs
RGF0YVR5cGUgKSB7CisgICAgICAgIGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAw
IF0gKSB7CisgICAgICAgICAgICBkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKKyAg
ICB9Cit9CisKKy8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUg
b3JpZ2luYWwgcmVzcG9uc2UKKyAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9u
IHRoZSBqcVhIUiBpbnN0YW5jZQorICovCitmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9u
c2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7CisgICAgdmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0
bXAsIHByZXYsCisgICAgICAgIGNvbnZlcnRlcnMgPSB7fSwKKworICAgICAgICAvLyBXb3JrIHdp
dGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBj
b252ZXJzaW9uCisgICAgICAgIGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7CisKKyAg
ICAvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXMKKyAgICBpZiAo
IGRhdGFUeXBlc1sgMSBdICkgeworICAgICAgICBmb3IgKCBjb252IGluIHMuY29udmVydGVycyAp
IHsKKyAgICAgICAgICAgIGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252
ZXJ0ZXJzWyBjb252IF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyZW50ID0gZGF0YVR5
cGVzLnNoaWZ0KCk7CisKKyAgICAvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlw
ZQorICAgIHdoaWxlICggY3VycmVudCApIHsKKworICAgICAgICBpZiAoIHMucmVzcG9uc2VGaWVs
ZHNbIGN1cnJlbnQgXSApIHsKKyAgICAgICAgICAgIGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBj
dXJyZW50IF0gXSA9IHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwbHkgdGhl
IGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKKyAgICAgICAgaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3Mg
JiYgcy5kYXRhRmlsdGVyICkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIo
IHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7CisgICAgICAgIH0KKworICAgICAgICBwcmV2ID0gY3Vy
cmVudDsKKyAgICAgICAgY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOworCisgICAgICAgIGlm
ICggY3VycmVudCApIHsKKworICAgICAgICAvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBj
dXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvCisgICAgICAgICAgICBpZiAoIGN1cnJlbnQgPT09
ICIqIiApIHsKKworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcmV2OworCisgICAgICAgICAg
ICAvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRp
ZmZlcnMgZnJvbSBjdXJyZW50CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwcmV2ICE9PSAiKiIg
JiYgcHJldiAhPT0gY3VycmVudCApIHsKKworICAgICAgICAgICAgICAgIC8vIFNlZWsgYSBkaXJl
Y3QgY29udmVydGVyCisgICAgICAgICAgICAgICAgY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAi
ICIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKKworICAgICAg
ICAgICAgICAgIC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyCisgICAgICAgICAgICAgICAg
aWYgKCAhY29udiApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggY29udjIgaW4gY29udmVy
dGVycyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29udjIgb3V0cHV0cyBj
dXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVk
IHRvIGFjY2VwdGVkIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udiA9IGNv
bnZlcnRlcnNbIHByZXYgKyAiICIgKyB0bXBbIDAgXSBdIHx8CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnZlcnRlcnNbICIqICIgKyB0bXBbIDAgXSBdOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggY29udiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRl
cm1lZGlhdGUgZGF0YVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNl
KQorICAgICAgICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5k
IHJldHVybiB0aGVtCisgICAgICAgICAgICAgICAgICAgIGlmICggY29udiAmJiBzLnRocm93cyAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsK
KyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRy
eSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25z
ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGU6ICJwYXJzZXJlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVycm9yOiBjb252ID8gZSA6ICJObyBjb252ZXJzaW9uIGZyb20gIiArIHByZXYgKyAiIHRvICIg
KyBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7IHN0YXRlOiAic3Vj
Y2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07Cit9CisKK2pRdWVyeS5leHRlbmQoIHsKKworICAgIC8v
IENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllcworICAgIGFj
dGl2ZTogMCwKKworICAgIC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJl
cXVlc3QKKyAgICBsYXN0TW9kaWZpZWQ6IHt9LAorICAgIGV0YWc6IHt9LAorCisgICAgYWpheFNl
dHRpbmdzOiB7CisgICAgICAgIHVybDogbG9jYXRpb24uaHJlZiwKKyAgICAgICAgdHlwZTogIkdF
VCIsCisgICAgICAgIGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3Rv
Y29sICksCisgICAgICAgIGdsb2JhbDogdHJ1ZSwKKyAgICAgICAgcHJvY2Vzc0RhdGE6IHRydWUs
CisgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9u
L3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisgICAgICAgIC8qCisgICAg
ICAgIHRpbWVvdXQ6IDAsCisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIGRhdGFUeXBlOiBu
dWxsLAorICAgICAgICB1c2VybmFtZTogbnVsbCwKKyAgICAgICAgcGFzc3dvcmQ6IG51bGwsCisg
ICAgICAgIGNhY2hlOiBudWxsLAorICAgICAgICB0aHJvd3M6IGZhbHNlLAorICAgICAgICB0cmFk
aXRpb25hbDogZmFsc2UsCisgICAgICAgIGhlYWRlcnM6IHt9LAorICAgICAgICAqLworCisgICAg
ICAgIGFjY2VwdHM6IHsKKyAgICAgICAgICAgICIqIjogYWxsVHlwZXMsCisgICAgICAgICAgICB0
ZXh0OiAidGV4dC9wbGFpbiIsCisgICAgICAgICAgICBodG1sOiAidGV4dC9odG1sIiwKKyAgICAg
ICAgICAgIHhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorICAgICAgICAgICAganNv
bjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIKKyAgICAgICAgfSwKKworICAg
ICAgICBjb250ZW50czogeworICAgICAgICAgICAgeG1sOiAvXGJ4bWxcYi8sCisgICAgICAgICAg
ICBodG1sOiAvXGJodG1sLywKKyAgICAgICAgICAgIGpzb246IC9cYmpzb25cYi8KKyAgICAgICAg
fSwKKworICAgICAgICByZXNwb25zZUZpZWxkczogeworICAgICAgICAgICAgeG1sOiAicmVzcG9u
c2VYTUwiLAorICAgICAgICAgICAgdGV4dDogInJlc3BvbnNlVGV4dCIsCisgICAgICAgICAgICBq
c29uOiAicmVzcG9uc2VKU09OIgorICAgICAgICB9LAorCisgICAgICAgIC8vIERhdGEgY29udmVy
dGVycworICAgICAgICAvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBh
bmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQorICAgICAgICBjb252ZXJ0
ZXJzOiB7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAorICAgICAg
ICAgICAgIiogdGV4dCI6IFN0cmluZywKKworICAgICAgICAgICAgLy8gVGV4dCB0byBodG1sICh0
cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCisgICAgICAgICAgICAidGV4dCBodG1sIjogdHJ1ZSwK
KworICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgorICAg
ICAgICAgICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCisKKyAgICAgICAgICAgIC8v
IFBhcnNlIHRleHQgYXMgeG1sCisgICAgICAgICAgICAidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VY
TUwKKyAgICAgICAgfSwKKworICAgICAgICAvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBi
ZSBkZWVwIGV4dGVuZGVkOgorICAgICAgICAvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20g
b3B0aW9ucyBoZXJlIGlmCisgICAgICAgIC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQg
c2hvdWxkbid0IGJlCisgICAgICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQor
ICAgICAgICBmbGF0T3B0aW9uczogeworICAgICAgICAgICAgdXJsOiB0cnVlLAorICAgICAgICAg
ICAgY29udGV4dDogdHJ1ZQorICAgICAgICB9CisgICAgfSwKKworICAgIC8vIENyZWF0ZXMgYSBm
dWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0CisgICAgLy8gd2l0aCBib3Ro
IGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgorICAgIC8vIElmIHRhcmdldCBpcyBv
bWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCisgICAgYWpheFNldHVwOiBmdW5jdGlv
biggdGFyZ2V0LCBzZXR0aW5ncyApIHsKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzID8KKworICAg
ICAgICAgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKKyAgICAgICAgICAgIGFqYXhF
eHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5n
cyApIDoKKworICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncworICAgICAgICAg
ICAgYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7CisgICAgfSwKKwor
ICAgIGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVy
cyApLAorICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJh
bnNwb3J0cyApLAorCisgICAgLy8gTWFpbiBtZXRob2QKKyAgICBhamF4OiBmdW5jdGlvbiggdXJs
LCBvcHRpb25zICkgeworCisgICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRl
IHByZS0xLjUgc2lnbmF0dXJlCisgICAgICAgIGlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIg
KSB7CisgICAgICAgICAgICBvcHRpb25zID0gdXJsOworICAgICAgICAgICAgdXJsID0gdW5kZWZp
bmVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmpl
Y3QKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAgICAgICAgdmFyIHRyYW5z
cG9ydCwKKworICAgICAgICAgICAgLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQorICAg
ICAgICAgICAgY2FjaGVVUkwsCisKKyAgICAgICAgICAgIC8vIFJlc3BvbnNlIGhlYWRlcnMKKyAg
ICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1N0cmluZywKKyAgICAgICAgICAgIHJlc3BvbnNlSGVh
ZGVycywKKworICAgICAgICAgICAgLy8gdGltZW91dCBoYW5kbGUKKyAgICAgICAgICAgIHRpbWVv
dXRUaW1lciwKKworICAgICAgICAgICAgLy8gVXJsIGNsZWFudXAgdmFyCisgICAgICAgICAgICB1
cmxBbmNob3IsCisKKyAgICAgICAgICAgIC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUg
dG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICAgICAgZmlyZUdsb2JhbHMsCisKKyAgICAgICAgICAg
IC8vIExvb3AgdmFyaWFibGUKKyAgICAgICAgICAgIGksCisKKyAgICAgICAgICAgIC8vIENyZWF0
ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKKyAgICAgICAgICAgIHMgPSBqUXVlcnkuYWpheFNl
dHVwKCB7fSwgb3B0aW9ucyApLAorCisgICAgICAgICAgICAvLyBDYWxsYmFja3MgY29udGV4dAor
ICAgICAgICAgICAgY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCisKKyAgICAgICAg
ICAgIC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0
IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb24KKyAgICAgICAgICAgIGdsb2JhbEV2
ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJgorICAgICAgICAgICAgICAgICggY2FsbGJhY2tDb250
ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CisgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOgorICAgICAgICAgICAgICAgICAgICBq
UXVlcnkuZXZlbnQsCisKKyAgICAgICAgICAgIC8vIERlZmVycmVkcworICAgICAgICAgICAgZGVm
ZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSwKKyAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQg
PSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCisKKyAgICAgICAgICAgIC8vIFN0
YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisgICAgICAgICAgICBzdGF0dXNDb2RlID0gcy5zdGF0
dXNDb2RlIHx8IHt9LAorCisgICAgICAgICAgICAvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFs
bCBhdCBvbmNlKQorICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSB7fSwKKyAgICAgICAgICAg
IHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKKworICAgICAgICAgICAgLy8gVGhlIGpxWEhSIHN0
YXRlCisgICAgICAgICAgICBzdGF0ZSA9IDAsCisKKyAgICAgICAgICAgIC8vIERlZmF1bHQgYWJv
cnQgbWVzc2FnZQorICAgICAgICAgICAgc3RyQWJvcnQgPSAiY2FuY2VsZWQiLAorCisgICAgICAg
ICAgICAvLyBGYWtlIHhocgorICAgICAgICAgICAganFYSFIgPSB7CisgICAgICAgICAgICAgICAg
cmVhZHlTdGF0ZTogMCwKKworICAgICAgICAgICAgICAgIC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0
YWJsZSBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rp
b24oIGtleSApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoOworICAgICAgICAgICAg
ICAgICAgICBpZiAoIHN0YXRlID09PSAyICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCAhcmVzcG9uc2VIZWFkZXJzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Bv
bnNlSGVhZGVycyA9IHt9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCBt
YXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50
b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1h
dGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVs
bCA6IG1hdGNoOworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAvLyBSYXcg
c3RyaW5nCisgICAgICAgICAgICAgICAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFk
ZXJzU3RyaW5nIDogbnVsbDsKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAg
Ly8gQ2FjaGVzIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyOiBm
dW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBsbmFtZSA9
IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdGUgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5h
bWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAg
ICAgICB9LAorCisgICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQt
dHlwZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbigg
dHlwZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RhdGUgKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBzLm1pbWVUeXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICAgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICAgICAgICAg
ICAgICBzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgeworICAgICAgICAgICAgICAgICAgICB2
YXIgY29kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXAgKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHN0YXRlIDwgMiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKCBjb2RlIGluIG1hcCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9s
ZCBvbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGVbIGNvZGUg
XSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFj
a3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5hbHdheXMoIG1hcFsganFYSFIu
c3RhdHVzIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9
LAorCisgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAg
ICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgeworICAgICAgICAgICAgICAgICAgICB2
YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCB0cmFuc3BvcnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQu
YWJvcnQoIGZpbmFsVGV4dCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIC8vIEF0
dGFjaCBkZWZlcnJlZHMKKyAgICAgICAgZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0
ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOworICAgICAgICBqcVhIUi5zdWNjZXNzID0ganFYSFIu
ZG9uZTsKKyAgICAgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOworCisgICAgICAgIC8vIFJl
bW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQorICAgICAg
ICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVj
dCBpdCkKKyAgICAgICAgLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0
ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKKyAgICAgICAgLy8gV2Ug
YWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCisgICAgICAgIHMudXJsID0g
KCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyAiIiApLnJlcGxhY2UoIHJoYXNo
LCAiIiApCisgICAgICAgICAgICAucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2Nv
bCArICIvLyIgKTsKKworICAgICAgICAvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMg
cGVyIHRpY2tldCAjMTIwMDQKKyAgICAgICAgcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0
aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKKworICAgICAgICAvLyBFeHRyYWN0IGRh
dGFUeXBlcyBsaXN0CisgICAgICAgIHMuZGF0YVR5cGVzID0galF1ZXJ5LnRyaW0oIHMuZGF0YVR5
cGUgfHwgIioiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwor
CisgICAgICAgIC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUg
b3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgorICAgICAgICBpZiAoIHMu
Y3Jvc3NEb21haW4gPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHVybEFuY2hvciA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoICJhIiApOworCisgICAgICAgICAgICAvLyBTdXBwb3J0OiBJRTgtMTEr
CisgICAgICAgICAgICAvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIGlmIHVybCBpcyBtYWxmb3JtZWQs
IGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAg
ICAgICAgICAgdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKKworICAgICAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFOC0xMSsKKyAgICAgICAgICAgICAgICAvLyBBbmNob3IncyBob3N0IHByb3BlcnR5
IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQorICAgICAgICAgICAg
ICAgIHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7CisgICAgICAgICAgICAgICAgcy5j
cm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArICIvLyIgKyBvcmlnaW5BbmNob3Iu
aG9zdCAhPT0KKyAgICAgICAgICAgICAgICAgICAgdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiAr
IHVybEFuY2hvci5ob3N0OworICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBp
dCBpcyBjcm9zc0RvbWFpbiwKKyAgICAgICAgICAgICAgICAvLyBpdCBjYW4gYmUgcmVqZWN0ZWQg
YnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgcy5jcm9z
c0RvbWFpbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBD
b252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKyAgICAgICAgaWYgKCBzLmRhdGEg
JiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKKyAgICAg
ICAgICAgIHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSBwcmVmaWx0ZXJzCisgICAgICAgIGluc3BlY3RQ
cmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwor
CisgICAgICAgIC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBz
dG9wIHRoZXJlCisgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7CisgICAgICAgICAgICByZXR1
cm4ganFYSFI7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZl
bnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bworICAgICAgICAvLyBEb24ndCBmaXJlIGV2ZW50cyBp
ZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1
MTE4KQorICAgICAgICBmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDsKKwor
ICAgICAgICAvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisgICAgICAgIGlmICgg
ZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgeworICAgICAgICAgICAgalF1
ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBVcHBlcmNhc2UgdGhlIHR5cGUKKyAgICAgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNl
KCk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKKyAgICAg
ICAgcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CisKKyAgICAgICAg
Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVk
LVNpbmNlCisgICAgICAgIC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgor
ICAgICAgICBjYWNoZVVSTCA9IHMudXJsOworCisgICAgICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5k
bGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisgICAgICAgIGlmICggIXMuaGFzQ29u
dGVudCApIHsKKworICAgICAgICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBk
YXRhIHRvIHVybAorICAgICAgICAgICAgaWYgKCBzLmRhdGEgKSB7CisgICAgICAgICAgICAgICAg
Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAi
PyIgKSArIHMuZGF0YSApOworCisgICAgICAgICAgICAgICAgLy8gIzk2ODI6IHJlbW92ZSBkYXRh
IHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeQorICAgICAgICAgICAg
ICAgIGRlbGV0ZSBzLmRhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBh
bnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmICggcy5jYWNoZSA9PT0g
ZmFsc2UgKSB7CisgICAgICAgICAgICAgICAgcy51cmwgPSBydHMudGVzdCggY2FjaGVVUkwgKSA/
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJh
bWV0ZXIsIHNldCBpdHMgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVVUkwucmVwbGFj
ZSggcnRzLCAiJDFfPSIgKyBub25jZSsrICkgOgorCisgICAgICAgICAgICAgICAgICAgIC8vIE90
aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVVUkwg
KyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgbm9uY2Ur
KzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgSWYtTW9k
aWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVk
IG1vZGUuCisgICAgICAgIGlmICggcy5pZk1vZGlmaWVkICkgeworICAgICAgICAgICAgaWYgKCBq
UXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkgeworICAgICAgICAgICAgICAgIGpxWEhS
LnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZp
ZWRbIGNhY2hlVVJMIF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggalF1ZXJ5
LmV0YWdbIGNhY2hlVVJMIF0gKSB7CisgICAgICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhl
YWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwg
aWYgZGF0YSBpcyBiZWluZyBzZW50CisgICAgICAgIGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVu
dCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkgewor
ICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29u
dGVudFR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgQWNjZXB0cyBoZWFk
ZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKKyAgICAgICAganFY
SFIuc2V0UmVxdWVzdEhlYWRlcigKKyAgICAgICAgICAgICJBY2NlcHQiLAorICAgICAgICAgICAg
cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CisgICAg
ICAgICAgICAgICAgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gKworICAgICAgICAgICAg
ICAgICAgICAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7
IHE9MC4wMSIgOiAiIiApIDoKKyAgICAgICAgICAgICAgICBzLmFjY2VwdHNbICIqIiBdCisgICAg
ICAgICk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCisgICAgICAgIGZv
ciAoIGkgaW4gcy5oZWFkZXJzICkgeworICAgICAgICAgICAganFYSFIuc2V0UmVxdWVzdEhlYWRl
ciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG93IGN1
c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKyAgICAgICAgaWYgKCBzLmJl
Zm9yZVNlbmQgJiYKKyAgICAgICAgICAgICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29u
dGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKKworICAgICAg
ICAgICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisgICAgICAgICAg
ICByZXR1cm4ganFYSFIuYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFib3J0aW5n
IGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgorICAgICAgICBzdHJBYm9ydCA9ICJhYm9ydCI7
CisKKyAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisgICAgICAgIGZv
ciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKKyAgICAg
ICAgICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0
IHRyYW5zcG9ydAorICAgICAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNw
b3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworICAgICAgICAvLyBJZiBu
byB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKKyAgICAgICAgaWYgKCAhdHJhbnNwb3J0ICkgewor
ICAgICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0gMTsKKworICAgICAgICAgICAgLy8gU2Vu
ZCBnbG9iYWwgZXZlbnQKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7CisgICAgICAg
ICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIs
IHMgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiByZXF1ZXN0IHdhcyBh
Ym9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZQorICAgICAgICAgICAgaWYgKCBzdGF0
ZSA9PT0gMiApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ganFYSFI7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIC8vIFRpbWVvdXQKKyAgICAgICAgICAgIGlmICggcy5hc3luYyAmJiBz
LnRpbWVvdXQgPiAwICkgeworICAgICAgICAgICAgICAgIHRpbWVvdXRUaW1lciA9IHdpbmRvdy5z
ZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAganFYSFIuYWJvcnQo
ICJ0aW1lb3V0IiApOworICAgICAgICAgICAgICAgIH0sIHMudGltZW91dCApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gMTsKKyAg
ICAgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKKyAg
ICAgICAgICAgIH0gY2F0Y2ggKCBlICkgeworCisgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRl
IGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZQorICAgICAgICAgICAgICAgIGlmICggc3Rh
dGUgPCAyICkgeworICAgICAgICAgICAgICAgICAgICBkb25lKCAtMSwgZSApOworCisgICAgICAg
ICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsYmFjayBmb3Igd2hlbiBl
dmVyeXRoaW5nIGlzIGRvbmUKKyAgICAgICAgZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVT
dGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CisgICAgICAgICAgICB2YXIgaXNTdWNj
ZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorICAgICAgICAgICAgICAg
IHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OworCisgICAgICAgICAgICAvLyBDYWxsZWQg
b25jZQorICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PT0gMiApIHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXRlIGlzICJkb25lIiBu
b3cKKyAgICAgICAgICAgIHN0YXRlID0gMjsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91
dCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIGlmICggdGltZW91dFRpbWVyICkgeworICAgICAg
ICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdh
cmJhZ2UgY29sbGVjdGlvbgorICAgICAgICAgICAgLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUg
anFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IHVuZGVm
aW5lZDsKKworICAgICAgICAgICAgLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycworICAgICAgICAg
ICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKKworICAgICAgICAgICAg
Ly8gU2V0IHJlYWR5U3RhdGUKKyAgICAgICAgICAgIGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMg
PiAwID8gNCA6IDA7CisKKyAgICAgICAgICAgIC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCisg
ICAgICAgICAgICBpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBz
dGF0dXMgPT09IDMwNDsKKworICAgICAgICAgICAgLy8gR2V0IHJlc3BvbnNlIGRhdGEKKyAgICAg
ICAgICAgIGlmICggcmVzcG9uc2VzICkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYWph
eEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25z
ZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpCisgICAgICAgICAgICByZXNwb25zZSA9IGFqYXhD
b252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOworCisgICAgICAgICAgICAv
LyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZworICAgICAgICAgICAgaWYgKCBp
c1N1Y2Nlc3MgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNp
bmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgor
ICAgICAgICAgICAgICAgIGlmICggcy5pZk1vZGlmaWVkICkgeworICAgICAgICAgICAgICAgICAg
ICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCAiTGFzdC1Nb2RpZmllZCIgKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCApIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGpxWEhSLmdl
dFJlc3BvbnNlSGVhZGVyKCAiZXRhZyIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb2Rp
ZmllZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBd
ID0gbW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAvLyBpZiBubyBjb250ZW50CisgICAgICAgICAgICAgICAgaWYgKCBz
dGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKKyAgICAgICAgICAgICAgICAg
ICAgc3RhdHVzVGV4dCA9ICJub2NvbnRlbnQiOworCisgICAgICAgICAgICAgICAgLy8gaWYgbm90
IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7
CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSAibm90bW9kaWZpZWQiOworCisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCA9IHJlc3Bv
bnNlLnN0YXRlOworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTsK
KyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjsKKyAgICAgICAgICAg
ICAgICAgICAgaXNTdWNjZXNzID0gIWVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGVycm9yIGZyb20gc3Rh
dHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzCisgICAgICAgICAgICAgICAgZXJy
b3IgPSBzdGF0dXNUZXh0OworICAgICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNU
ZXh0ICkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBzdGF0dXMgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHho
ciBvYmplY3QKKyAgICAgICAgICAgIGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAg
IGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsg
IiI7CisKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MvRXJyb3IKKyAgICAgICAgICAgIGlmICggaXNT
dWNjZXNzICkgeworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFj
a0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0Nv
bnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKyAgICAgICAgICAgIGpx
WEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTsKKyAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB1
bmRlZmluZWQ7CisKKyAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7CisgICAgICAgICAg
ICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2Vz
cyIgOiAiYWpheEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywgaXNTdWNj
ZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gQ29tcGxldGUKKyAgICAgICAgICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxi
YWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7CisKKyAgICAgICAgICAgIGlmICgg
ZmlyZUdsb2JhbHMgKSB7CisgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdn
ZXIoICJhamF4Q29tcGxldGUiLCBbIGpxWEhSLCBzIF0gKTsKKworICAgICAgICAgICAgICAgIC8v
IEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorICAgICAgICAgICAgICAgIGlmICggISgg
LS1qUXVlcnkuYWN0aXZlICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50
cmlnZ2VyKCAiYWpheFN0b3AiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGpxWEhSOworICAgIH0sCisKKyAgICBnZXRKU09O
OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKKyAgICAgICAgcmV0dXJuIGpRdWVy
eS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOworICAgIH0sCisKKyAgICBnZXRT
Y3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgeworICAgICAgICByZXR1cm4galF1ZXJ5
LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOworICAgIH0KK30gKTsK
KworalF1ZXJ5LmVhY2goIFsgImdldCIsICJwb3N0IiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkg
eworICAgIGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywg
dHlwZSApIHsKKworICAgICAgICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3
YXMgb21pdHRlZAorICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7Cisg
ICAgICAgICAgICB0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKKyAgICAgICAgICAgIGNhbGxiYWNr
ID0gZGF0YTsKKyAgICAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0
IGhhdmUgLnVybCkKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7
CisgICAgICAgICAgICB1cmw6IHVybCwKKyAgICAgICAgICAgIHR5cGU6IG1ldGhvZCwKKyAgICAg
ICAgICAgIGRhdGFUeXBlOiB0eXBlLAorICAgICAgICAgICAgZGF0YTogZGF0YSwKKyAgICAgICAg
ICAgIHN1Y2Nlc3M6IGNhbGxiYWNrCisgICAgICAgIH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1
cmwgKSAmJiB1cmwgKSApOworICAgIH07Cit9ICk7CisKKworalF1ZXJ5Ll9ldmFsVXJsID0gZnVu
Y3Rpb24oIHVybCApIHsKKyAgICByZXR1cm4galF1ZXJ5LmFqYXgoIHsKKyAgICAgICAgdXJsOiB1
cmwsCisKKyAgICAgICAgLy8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVy
cmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpCisgICAgICAgIHR5cGU6ICJHRVQi
LAorICAgICAgICBkYXRhVHlwZTogInNjcmlwdCIsCisgICAgICAgIGFzeW5jOiBmYWxzZSwKKyAg
ICAgICAgZ2xvYmFsOiBmYWxzZSwKKyAgICAgICAgInRocm93cyI6IHRydWUKKyAgICB9ICk7Cit9
OworCisKK2pRdWVyeS5mbi5leHRlbmQoIHsKKyAgICB3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCAp
IHsKKyAgICAgICAgdmFyIHdyYXA7CisKKyAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
aHRtbCApICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7
CisgICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKCB0aGlz
LCBpICkgKTsKKyAgICAgICAgICAgIH0gKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGhp
c1sgMCBdICkgeworCisgICAgICAgICAgICAvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFy
Z2V0IGFyb3VuZAorICAgICAgICAgICAgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93
bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CisKKyAgICAgICAgICAgIGlmICgg
dGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7CisgICAgICAgICAgICAgICAgd3JhcC5pbnNlcnRCZWZv
cmUoIHRoaXNbIDAgXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cmFwLm1hcCgg
ZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzOworCisgICAgICAg
ICAgICAgICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgeworICAgICAgICAgICAg
ICAgICAgICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDsKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKKyAgICAgICAgICAgIH0gKS5hcHBlbmQo
IHRoaXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICB3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICBpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCBodG1sICkgKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlv
biggaSApIHsKKyAgICAgICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwu
Y2FsbCggdGhpcywgaSApICk7CisgICAgICAgICAgICB9ICk7CisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBzZWxmID0g
alF1ZXJ5KCB0aGlzICksCisgICAgICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLmNvbnRlbnRz
KCk7CisKKyAgICAgICAgICAgIGlmICggY29udGVudHMubGVuZ3RoICkgeworICAgICAgICAgICAg
ICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBzZWxmLmFwcGVuZCggaHRtbCApOworICAgICAgICAgICAgfQorICAgICAg
ICB9ICk7CisgICAgfSwKKworICAgIHdyYXA6IGZ1bmN0aW9uKCBodG1sICkgeworICAgICAgICB2
YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CisKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CisgICAgICAgICAgICBqUXVlcnkoIHRoaXMg
KS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7Cisg
ICAgICAgIH0gKTsKKyAgICB9LAorCisgICAgdW53cmFwOiBmdW5jdGlvbigpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaCggZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAo
ICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgeworICAgICAgICAgICAgICAgIGpR
dWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSApLmVuZCgpOworICAgIH0KK30gKTsKKworCitqUXVlcnkuZXhwci5maWx0
ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgeworICAgIHJldHVybiAhalF1ZXJ5LmV4cHIu
ZmlsdGVycy52aXNpYmxlKCBlbGVtICk7Cit9OworalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxl
ID0gZnVuY3Rpb24oIGVsZW0gKSB7CisKKyAgICAvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMgor
ICAgIC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3Mg
dGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKKyAgICAvLyBVc2UgT1IgaW5zdGVhZCBvZiBBTkQg
YXMgdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUgaWYgZWl0aGVyIGlzIHRydWUKKyAgICAvLyBT
ZWUgdGlja2V0cyAjMTA0MDYgYW5kICMxMzEzMgorICAgIHJldHVybiBlbGVtLm9mZnNldFdpZHRo
ID4gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA+IDAgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxl
bmd0aCA+IDA7Cit9OworCisKKworCit2YXIgcjIwID0gLyUyMC9nLAorICAgIHJicmFja2V0ID0g
L1xbXF0kLywKKyAgICByQ1JMRiA9IC9ccj9cbi9nLAorICAgIHJzdWJtaXR0ZXJUeXBlcyA9IC9e
KD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSwKKyAgICByc3VibWl0dGFibGUg
PSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7CisKK2Z1bmN0aW9uIGJ1aWxk
UGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKyAgICB2YXIgbmFtZTsK
KworICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgeworCisgICAgICAgIC8vIFNlcmlh
bGl6ZSBhcnJheSBpdGVtLgorICAgICAgICBqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwg
diApIHsKKyAgICAgICAgICAgIGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJl
Zml4ICkgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMg
YSBzY2FsYXIuCisgICAgICAgICAgICAgICAgYWRkKCBwcmVmaXgsIHYgKTsKKworICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJy
YXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LgorICAgICAgICAgICAgICAg
IGJ1aWxkUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAiWyIgKyAoIHR5cGVv
ZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKKyAgICAgICAg
ICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICAgICAgdHJhZGl0aW9uYWwsCisgICAgICAg
ICAgICAgICAgICAgIGFkZAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gKTsKKworICAgIH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSgg
b2JqICkgPT09ICJvYmplY3QiICkgeworCisgICAgICAgIC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRl
bS4KKyAgICAgICAgZm9yICggbmFtZSBpbiBvYmogKSB7CisgICAgICAgICAgICBidWlsZFBhcmFt
cyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBh
ZGQgKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBTZXJpYWxpemUg
c2NhbGFyIGl0ZW0uCisgICAgICAgIGFkZCggcHJlZml4LCBvYmogKTsKKyAgICB9Cit9CisKKy8v
IFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisvLyBrZXkv
dmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKK2pRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0
cmFkaXRpb25hbCApIHsKKyAgICB2YXIgcHJlZml4LAorICAgICAgICBzID0gW10sCisgICAgICAg
IGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCisgICAgICAgICAgICAvLyBJZiB2YWx1
ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKKyAgICAgICAg
ICAgIHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1
ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOworICAgICAgICAgICAgc1sgcy5sZW5ndGggXSA9IGVu
Y29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVl
ICk7CisgICAgICAgIH07CisKKyAgICAvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1
ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLgorICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5l
ZCApIHsKKyAgICAgICAgdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVy
eS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7CisgICAgfQorCisgICAgLy8gSWYgYW4gYXJyYXkg
d2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50
cy4KKyAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5
LmlzUGxhaW5PYmplY3QoIGEgKSApICkgeworCisgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgZm9y
bSBlbGVtZW50cworICAgICAgICBqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisgICAgICAg
ICAgICBhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOworICAgICAgICB9ICk7CisKKyAgICB9
IGVsc2UgeworCisgICAgICAgIC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdh
eSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgorICAgICAgICAvLyBkaWQgaXQpLCBvdGhlcndpc2Ug
ZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKyAgICAgICAgZm9yICggcHJlZml4IGluIGEgKSB7
CisgICAgICAgICAgICBidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9u
YWwsIGFkZCApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRp
bmcgc2VyaWFsaXphdGlvbgorICAgIHJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwg
IisiICk7Cit9OworCitqUXVlcnkuZm4uZXh0ZW5kKCB7CisgICAgc2VyaWFsaXplOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgp
ICk7CisgICAgfSwKKyAgICBzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJl
dHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIC8vIENhbiBhZGQgcHJv
cEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCisgICAg
ICAgICAgICB2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRzIiApOwor
ICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMg
KSA6IHRoaXM7CisgICAgICAgIH0gKQorICAgICAgICAuZmlsdGVyKCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOworCisgICAgICAgICAgICAvLyBVc2UgLmlz
KCAiOmRpc2FibGVkIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggIjpkaXNhYmxlZCIg
KSAmJgorICAgICAgICAgICAgICAgIHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkg
JiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKKyAgICAgICAgICAgICAgICAoIHRo
aXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7CisgICAgICAgIH0g
KQorICAgICAgICAubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKKyAgICAgICAgICAgIHZhciB2
YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbCA9PSBu
dWxsID8KKyAgICAgICAgICAgICAgICBudWxsIDoKKyAgICAgICAgICAgICAgICBqUXVlcnkuaXNB
cnJheSggdmFsICkgPworICAgICAgICAgICAgICAgICAgICBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0
aW9uKCB2YWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBlbGVt
Lm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CisgICAgICAgICAg
ICAgICAgICAgIH0gKSA6CisgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogZWxlbS5uYW1lLCB2
YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OworICAgICAgICB9ICkuZ2V0KCk7
CisgICAgfQorfSApOworCisKK2pRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7
CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsK
KyAgICB9IGNhdGNoICggZSApIHt9Cit9OworCit2YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHsKKwor
ICAgICAgICAvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNz
dW1lIDIwMAorICAgICAgICAwOiAyMDAsCisKKyAgICAgICAgLy8gU3VwcG9ydDogSUU5CisgICAg
ICAgIC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJl
IDIwNAorICAgICAgICAxMjIzOiAyMDQKKyAgICB9LAorICAgIHhoclN1cHBvcnRlZCA9IGpRdWVy
eS5hamF4U2V0dGluZ3MueGhyKCk7CisKK3N1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYm
ICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyU3VwcG9ydGVkICk7CitzdXBwb3J0LmFqYXggPSB4
aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKKworalF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1
bmN0aW9uKCBvcHRpb25zICkgeworICAgIHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKKwor
ICAgIC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1M
SHR0cFJlcXVlc3QKKyAgICBpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9w
dGlvbnMuY3Jvc3NEb21haW4gKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBzZW5k
OiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7CisgICAgICAgICAgICAgICAgdmFyIGks
CisgICAgICAgICAgICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyKCk7CisKKyAgICAgICAgICAg
ICAgICB4aHIub3BlbigKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlLAorICAgICAg
ICAgICAgICAgICAgICBvcHRpb25zLnVybCwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5h
c3luYywKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51c2VybmFtZSwKKyAgICAgICAgICAg
ICAgICAgICAgb3B0aW9ucy5wYXNzd29yZAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAg
ICAgICAgICAvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkCisgICAgICAgICAgICAg
ICAgaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICgg
aSBpbiBvcHRpb25zLnhockZpZWxkcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhoclsg
aSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBp
ZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92
ZXJyaWRlTWltZVR5cGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHhoci5vdmVycmlkZU1pbWVU
eXBlKCBvcHRpb25zLm1pbWVUeXBlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgLy8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXIKKyAgICAgICAgICAgICAgICAvLyBGb3Ig
Y3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGln
aHQgYXJlCisgICAgICAgICAgICAgICAgLy8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNp
bXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS4KKyAgICAgICAgICAgICAgICAvLyAoaXQgY2Fu
IGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhT
ZXR1cCkKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0
IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KKyAgICAgICAgICAgICAgICBpZiAo
ICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyAiWC1SZXF1ZXN0ZWQtV2l0aCIgXSAp
IHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAi
WE1MSHR0cFJlcXVlc3QiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8v
IFNldCBoZWFkZXJzCisgICAgICAgICAgICAgICAgZm9yICggaSBpbiBoZWFkZXJzICkgeworICAg
ICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sKKyAgICAg
ICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkgeworICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNh
bGxiYWNrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZXJyb3JD
YWxsYmFjayA9IHhoci5vbmxvYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4
aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJhYm9ydCIgKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydDogSUU5CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIGEgbWFudWFsIG5hdGl2ZSBhYm9ydCwgSUU5IHRo
cm93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb24gYW55IHBy
b3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoIDAsICJlcnJvciIgKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKAorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMg
MDsgc2VlICM4NjA1LCAjMTQyMDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB4aHIuc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHhoci5zdGF0dXNUZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJTdWNjZXNzU3RhdHVzWyB4
aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHhoci5zdGF0dXNUZXh0LAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBTdXBwb3J0OiBJRTkgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gSUU5IGhhcyBubyBYSFIyIGJ1dCB0aHJvd3Mgb24gYmluYXJ5ICh0cmFjLTExNDI2
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFhIUjIgbm9uLXRl
eHQsIGxldCB0aGUgY2FsbGVyIGhhbmRsZSBpdCAoZ2gtMjQ5OCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRl
eHQiICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHhoci5y
ZXNwb25zZVRleHQgIT09ICJzdHJpbmciID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8g
ZXZlbnRzCisgICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CisgICAgICAg
ICAgICAgICAgZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0gY2FsbGJhY2soICJlcnJvciIg
KTsKKworICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFOQorICAgICAgICAgICAgICAgIC8v
IFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CisgICAgICAgICAgICAg
ICAgLy8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0cworICAgICAgICAgICAgICAgIGlmICggeGhy
Lm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHsKKyAgICAgICAgICAgICAgICAgICAgeGhyLm9uYWJv
cnQgPSBlcnJvckNhbGxiYWNrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBp
dCBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHhoci5yZWFkeVN0YXRlID09
PSA0ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgb25lcnJvciB0
byBiZSBjYWxsZWQgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRo
YXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWQK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24o
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhYm9y
dCBjYWxsYmFjaworICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIg
KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8g
c2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKQorICAgICAgICAg
ICAgICAgICAgICB4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8
fCBudWxsICk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgLy8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3Rp
ZmllZCBhcyBhbiBlcnJvciB5ZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjYWxsYmFjayAp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBhYm9y
dDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjYWxsYmFjayApIHsKKyAgICAg
ICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgIH07CisgICAgfQorfSApOworCisKKworCisvLyBJbnN0YWxsIHNjcmlwdCBk
YXRhVHlwZQoralF1ZXJ5LmFqYXhTZXR1cCggeworICAgIGFjY2VwdHM6IHsKKyAgICAgICAgc2Ny
aXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCAiICsKKyAgICAg
ICAgICAgICJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQi
CisgICAgfSwKKyAgICBjb250ZW50czogeworICAgICAgICBzY3JpcHQ6IC9cYig/OmphdmF8ZWNt
YSlzY3JpcHRcYi8KKyAgICB9LAorICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAgInRleHQgc2Ny
aXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CisgICAgICAgICAgICBqUXVlcnkuZ2xvYmFsRXZhbCgg
dGV4dCApOworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9ICk7
CisKKy8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW4KK2pRdWVy
eS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisgICAgaWYgKCBzLmNh
Y2hlID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgIHMuY2FjaGUgPSBmYWxzZTsKKyAgICB9Cisg
ICAgaWYgKCBzLmNyb3NzRG9tYWluICkgeworICAgICAgICBzLnR5cGUgPSAiR0VUIjsKKyAgICB9
Cit9ICk7CisKKy8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydAoralF1ZXJ5LmFqYXhU
cmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKKworICAgIC8vIFRoaXMgdHJhbnNw
b3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKKyAgICBpZiAoIHMuY3Jv
c3NEb21haW4gKSB7CisgICAgICAgIHZhciBzY3JpcHQsIGNhbGxiYWNrOworICAgICAgICByZXR1
cm4geworICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgeworICAgICAg
ICAgICAgICAgIHNjcmlwdCA9IGpRdWVyeSggIjxzY3JpcHQ+IiApLnByb3AoIHsKKyAgICAgICAg
ICAgICAgICAgICAgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LAorICAgICAgICAgICAgICAgICAg
ICBzcmM6IHMudXJsCisgICAgICAgICAgICAgICAgfSApLm9uKAorICAgICAgICAgICAgICAgICAg
ICAibG9hZCBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24o
IGV2dCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggZXZ0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCBl
dnQudHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7
CisKKyAgICAgICAgICAgICAgICAvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZv
aWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5o
ZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApOworICAgICAgICAgICAgfSwKKyAgICAgICAg
ICAgIGFib3J0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGNhbGxiYWNrICkg
eworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9ICk7CisKKworCisKK3ZhciBvbGRDYWxs
YmFja3MgPSBbXSwKKyAgICByanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vOworCisvLyBEZWZh
dWx0IGpzb25wIHNldHRpbmdzCitqUXVlcnkuYWpheFNldHVwKCB7CisgICAganNvbnA6ICJjYWxs
YmFjayIsCisgICAganNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjYWxs
YmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBu
b25jZSsrICkgKTsKKyAgICAgICAgdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7CisgICAgICAgIHJl
dHVybiBjYWxsYmFjazsKKyAgICB9Cit9ICk7CisKKy8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlv
bnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cworalF1ZXJ5LmFqYXhQ
cmVmaWx0ZXIoICJqc29uIGpzb25wIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpx
WEhSICkgeworCisgICAgdmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29u
dGFpbmVyLAorICAgICAgICBqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25w
LnRlc3QoIHMudXJsICkgPworICAgICAgICAgICAgInVybCIgOgorICAgICAgICAgICAgdHlwZW9m
IHMuZGF0YSA9PT0gInN0cmluZyIgJiYKKyAgICAgICAgICAgICAgICAoIHMuY29udGVudFR5cGUg
fHwgIiIgKQorICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3
LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgIHJqc29ucC50ZXN0
KCBzLmRhdGEgKSAmJiAiZGF0YSIKKyAgICAgICAgKTsKKworICAgIC8vIEhhbmRsZSBpZmYgdGhl
IGV4cGVjdGVkIGRhdGEgdHlwZSBpcyAianNvbnAiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8g
c2V0CisgICAgaWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiICkg
eworCisgICAgICAgIC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGlu
ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQKKyAgICAgICAgY2FsbGJhY2tOYW1lID0gcy5qc29u
cENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KKyAgICAg
ICAgICAgIHMuanNvbnBDYWxsYmFjaygpIDoKKyAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjazsK
KworICAgICAgICAvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhCisgICAg
ICAgIGlmICgganNvblByb3AgKSB7CisgICAgICAgICAgICBzWyBqc29uUHJvcCBdID0gc1sganNv
blByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKKyAgICAgICAg
fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7CisgICAgICAgICAgICBzLnVybCArPSAo
IHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmpzb25wICsgIj0iICsgY2Fs
bGJhY2tOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlIGRhdGEgY29udmVydGVyIHRv
IHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgorICAgICAgICBzLmNvbnZlcnRl
cnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCAhcmVz
cG9uc2VDb250YWluZXIgKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5LmVycm9yKCBjYWxsYmFj
a05hbWUgKyAiIHdhcyBub3QgY2FsbGVkIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07CisgICAgICAgIH07CisKKyAgICAgICAgLy8g
Rm9yY2UganNvbiBkYXRhVHlwZQorICAgICAgICBzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOwor
CisgICAgICAgIC8vIEluc3RhbGwgY2FsbGJhY2sKKyAgICAgICAgb3ZlcndyaXR0ZW4gPSB3aW5k
b3dbIGNhbGxiYWNrTmFtZSBdOworICAgICAgICB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50czsKKyAg
ICAgICAgfTsKKworICAgICAgICAvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29u
dmVydGVycykKKyAgICAgICAganFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHsKKworICAgICAgICAg
ICAgLy8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0CisgICAgICAg
ICAgICBpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAg
alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKKworICAgICAgICAg
ICAgLy8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWUKKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgd2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0
dGVuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIGJhY2sgYXMgZnJlZQor
ICAgICAgICAgICAgaWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHsKKworICAgICAgICAgICAgICAg
IC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhp
bmdzIGFyb3VuZAorICAgICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0
dGluZ3MuanNvbnBDYWxsYmFjazsKKworICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGNhbGxi
YWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgICAgICBvbGRDYWxsYmFja3MucHVz
aCggY2FsbGJhY2tOYW1lICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENhbGwg
aWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQorICAgICAgICAgICAg
aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4g
KSApIHsKKyAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAg
XSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZUNvbnRhaW5lciA9IG92
ZXJ3cml0dGVuID0gdW5kZWZpbmVkOworICAgICAgICB9ICk7CisKKyAgICAgICAgLy8gRGVsZWdh
dGUgdG8gc2NyaXB0CisgICAgICAgIHJldHVybiAic2NyaXB0IjsKKyAgICB9Cit9ICk7CisKKwor
CisKKy8vIEFyZ3VtZW50ICJkYXRhIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWwKKy8vIGNvbnRl
eHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVk
IGluIHRoaXMgY29udGV4dCwKKy8vIGRlZmF1bHRzIHRvIGRvY3VtZW50CisvLyBrZWVwU2NyaXB0
cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhl
IGh0bWwgc3RyaW5nCitqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQs
IGtlZXBTY3JpcHRzICkgeworICAgIGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJp
bmciICkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCB0eXBlb2YgY29u
dGV4dCA9PT0gImJvb2xlYW4iICkgeworICAgICAgICBrZWVwU2NyaXB0cyA9IGNvbnRleHQ7Cisg
ICAgICAgIGNvbnRleHQgPSBmYWxzZTsKKyAgICB9CisgICAgY29udGV4dCA9IGNvbnRleHQgfHwg
ZG9jdW1lbnQ7CisKKyAgICB2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICksCisg
ICAgICAgIHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107CisKKyAgICAvLyBTaW5nbGUgdGFn
CisgICAgaWYgKCBwYXJzZWQgKSB7CisgICAgICAgIHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxl
bWVudCggcGFyc2VkWyAxIF0gKSBdOworICAgIH0KKworICAgIHBhcnNlZCA9IGJ1aWxkRnJhZ21l
bnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CisKKyAgICBpZiAoIHNjcmlwdHMgJiYg
c2NyaXB0cy5sZW5ndGggKSB7CisgICAgICAgIGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwor
ICAgIH0KKworICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyAp
OworfTsKKworCisvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCit2YXIgX2xv
YWQgPSBqUXVlcnkuZm4ubG9hZDsKKworLyoqCisgKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCisg
Ki8KK2pRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsK
KyAgICBpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgeworICAgICAgICBy
ZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworICAgIH0KKworICAgIHZhciBz
ZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsCisgICAgICAgIHNlbGYgPSB0aGlzLAorICAgICAgICBv
ZmYgPSB1cmwuaW5kZXhPZiggIiAiICk7CisKKyAgICBpZiAoIG9mZiA+IC0xICkgeworICAgICAg
ICBzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7CisgICAgICAgIHVy
bCA9IHVybC5zbGljZSggMCwgb2ZmICk7CisgICAgfQorCisgICAgLy8gSWYgaXQncyBhIGZ1bmN0
aW9uCisgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CisKKyAgICAgICAg
Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKKyAgICAgICAgY2FsbGJhY2sgPSBw
YXJhbXM7CisgICAgICAgIHBhcmFtcyA9IHVuZGVmaW5lZDsKKworICAgIC8vIE90aGVyd2lzZSwg
YnVpbGQgYSBwYXJhbSBzdHJpbmcKKyAgICB9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBh
cmFtcyA9PT0gIm9iamVjdCIgKSB7CisgICAgICAgIHR5cGUgPSAiUE9TVCI7CisgICAgfQorCisg
ICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3QKKyAg
ICBpZiAoIHNlbGYubGVuZ3RoID4gMCApIHsKKyAgICAgICAgalF1ZXJ5LmFqYXgoIHsKKyAgICAg
ICAgICAgIHVybDogdXJsLAorCisgICAgICAgICAgICAvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMg
dW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAv
LyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2UKKyAgICAgICAgICAgIC8v
IHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZAorICAgICAgICAg
ICAgdHlwZTogdHlwZSB8fCAiR0VUIiwKKyAgICAgICAgICAgIGRhdGFUeXBlOiAiaHRtbCIsCisg
ICAgICAgICAgICBkYXRhOiBwYXJhbXMKKyAgICAgICAgfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNw
b25zZVRleHQgKSB7CisKKyAgICAgICAgICAgIC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBj
b21wbGV0ZSBjYWxsYmFjaworICAgICAgICAgICAgcmVzcG9uc2UgPSBhcmd1bWVudHM7CisKKyAg
ICAgICAgICAgIHNlbGYuaHRtbCggc2VsZWN0b3IgPworCisgICAgICAgICAgICAgICAgLy8gSWYg
YSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEg
ZHVtbXkgZGl2CisgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElF
ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzCisgICAgICAgICAgICAgICAgalF1ZXJ5KCAiPGRp
dj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNl
bGVjdG9yICkgOgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCBy
ZXN1bHQKKyAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgKTsKKworICAgICAgICAvLyBJZiB0
aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzICJkYXRhIiwgInN0YXR1cyIs
ICJqcVhIUiIKKyAgICAgICAgLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25z
ZSB3YXMgc2V0IGFib3ZlLgorICAgICAgICAvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBn
ZXRzICJqcVhIUiIsICJzdGF0dXMiLCAiZXJyb3IiCisgICAgICAgIH0gKS5hbHdheXMoIGNhbGxi
YWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkgeworICAgICAgICAgICAgc2VsZi5lYWNo
KCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSggdGhpcywgcmVz
cG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOworICAgICAg
ICAgICAgfSApOworICAgICAgICB9ICk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7Cit9Owor
CisKKworCisvLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1v
biBBSkFYIGV2ZW50cworalF1ZXJ5LmVhY2goIFsKKyAgICAiYWpheFN0YXJ0IiwKKyAgICAiYWph
eFN0b3AiLAorICAgICJhamF4Q29tcGxldGUiLAorICAgICJhamF4RXJyb3IiLAorICAgICJhamF4
U3VjY2VzcyIsCisgICAgImFqYXhTZW5kIgorXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7CisgICAg
alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CisgICAgICAgIHJldHVybiB0aGlz
Lm9uKCB0eXBlLCBmbiApOworICAgIH07Cit9ICk7CisKKworCisKK2pRdWVyeS5leHByLmZpbHRl
cnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKKyAgICByZXR1cm4galF1ZXJ5LmdyZXAo
IGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKKyAgICAgICAgcmV0dXJuIGVsZW0gPT09
IGZuLmVsZW07CisgICAgfSApLmxlbmd0aDsKK307CisKKworCisKKy8qKgorICogR2V0cyBhIHdp
bmRvdyBmcm9tIGFuIGVsZW1lbnQKKyAqLworZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgewor
ICAgIHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBl
ID09PSA5ICYmIGVsZW0uZGVmYXVsdFZpZXc7Cit9CisKK2pRdWVyeS5vZmZzZXQgPSB7CisgICAg
c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKKyAgICAgICAgdmFyIGN1
clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NM
ZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbiwKKyAgICAgICAgICAgIHBvc2l0aW9uID0galF1ZXJ5LmNz
cyggZWxlbSwgInBvc2l0aW9uIiApLAorICAgICAgICAgICAgY3VyRWxlbSA9IGpRdWVyeSggZWxl
bSApLAorICAgICAgICAgICAgcHJvcHMgPSB7fTsKKworICAgICAgICAvLyBTZXQgcG9zaXRpb24g
Zmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCisgICAg
ICAgIGlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgeworICAgICAgICAgICAgZWxlbS5zdHls
ZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CisgICAgICAgIH0KKworICAgICAgICBjdXJPZmZzZXQg
PSBjdXJFbGVtLm9mZnNldCgpOworICAgICAgICBjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVt
LCAidG9wIiApOworICAgICAgICBjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQi
ICk7CisgICAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gImFic29sdXRl
IiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApICYmCisgICAgICAgICAgICAoIGN1ckNTU1RvcCAr
IGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOworCisgICAgICAgIC8vIE5lZWQg
dG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyCisgICAgICAgIC8vIHRv
cCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhl
ZAorICAgICAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworICAgICAgICAgICAgY3VyUG9z
aXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBjdXJUb3AgPSBjdXJQb3Np
dGlvbi50b3A7CisgICAgICAgICAgICBjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9w
ICkgfHwgMDsKKyAgICAgICAgICAgIGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkg
fHwgMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlv
bnMgKSApIHsKKworICAgICAgICAgICAgLy8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxv
dyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpCisgICAgICAg
ICAgICBvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwg
Y3VyT2Zmc2V0ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggb3B0aW9ucy50b3AgIT0g
bnVsbCApIHsKKyAgICAgICAgICAgIHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZz
ZXQudG9wICkgKyBjdXJUb3A7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBvcHRpb25zLmxlZnQg
IT0gbnVsbCApIHsKKyAgICAgICAgICAgIHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1
ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAidXNp
bmciIGluIG9wdGlvbnMgKSB7CisgICAgICAgICAgICBvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0s
IHByb3BzICk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1ckVsZW0uY3NzKCBw
cm9wcyApOworICAgICAgICB9CisgICAgfQorfTsKKworalF1ZXJ5LmZuLmV4dGVuZCggeworICAg
IG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CisgICAgICAgIGlmICggYXJndW1lbnRzLmxl
bmd0aCApIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPworICAg
ICAgICAgICAgICAgIHRoaXMgOgorICAgICAgICAgICAgICAgIHRoaXMuZWFjaCggZnVuY3Rpb24o
IGkgKSB7CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlz
LCBvcHRpb25zLCBpICk7CisgICAgICAgICAgICAgICAgfSApOworICAgICAgICB9CisKKyAgICAg
ICAgdmFyIGRvY0VsZW0sIHdpbiwKKyAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCisgICAg
ICAgICAgICBib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAorICAgICAgICAgICAgZG9jID0gZWxl
bSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CisKKyAgICAgICAgaWYgKCAhZG9jICkgeworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZG9jRWxlbSA9IGRvYy5kb2N1bWVu
dEVsZW1lbnQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVk
IERPTSBub2RlCisgICAgICAgIGlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSAp
ICkgeworICAgICAgICAgICAgcmV0dXJuIGJveDsKKyAgICAgICAgfQorCisgICAgICAgIGJveCA9
IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisgICAgICAgIHdpbiA9IGdldFdpbmRvdygg
ZG9jICk7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICB0b3A6IGJveC50b3AgKyB3aW4u
cGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCwKKyAgICAgICAgICAgIGxlZnQ6IGJveC5s
ZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0CisgICAgICAgIH07Cisg
ICAgfSwKKworICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpc1sg
MCBdICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG9m
ZnNldFBhcmVudCwgb2Zmc2V0LAorICAgICAgICAgICAgZWxlbSA9IHRoaXNbIDAgXSwKKyAgICAg
ICAgICAgIHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CisKKyAgICAgICAgLy8g
Rml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRvdyAocGFyZW50T2Zmc2V0ID0ge3Rv
cDowLCBsZWZ0OiAwfSwKKyAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQg
cGFyZW50CisgICAgICAgIGlmICggalF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApID09PSAi
Zml4ZWQiICkgeworCisgICAgICAgICAgICAvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0
IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWQKKyAgICAgICAgICAgIG9m
ZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisKKyAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKyAgICAgICAgICAgIG9m
ZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7CisKKyAgICAgICAgICAgIC8vIEdldCBj
b3JyZWN0IG9mZnNldHMKKyAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisgICAg
ICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIg
KSApIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0
KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9y
ZGVycworICAgICAgICAgICAgcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQ
YXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSApOworICAgICAgICAgICAgcGFyZW50
T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJMZWZ0
V2lkdGgiLCB0cnVlICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdWJ0cmFjdCBwYXJlbnQg
b2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAg
ICB0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwg
Im1hcmdpblRvcCIsIHRydWUgKSwKKyAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFy
ZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUgKQor
ICAgICAgICB9OworICAgIH0sCisKKyAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1
bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKyAgICAvLyAxKSBGb3IgdGhlIGVs
ZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9k
IHdpbGwgcmV0dXJuCisgICAgLy8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2lu
ZG93CisgICAgLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAorICAgIC8v
IDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5v
ZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGYKKyAgICAvLworICAgIC8vIGJ1dCB0aG9zZSBleGNl
cHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcworICAg
IC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLgor
ICAgIC8vCisgICAgLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5k
IGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKKyAgICBvZmZzZXRQYXJlbnQ6
IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OworCisgICAgICAg
ICAgICB3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJw
b3NpdGlvbiIgKSA9PT0gInN0YXRpYyIgKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50
ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CisgICAgICAgIH0gKTsK
KyAgICB9Cit9ICk7CisKKy8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9k
cworalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAi
cGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7CisgICAgdmFyIHRvcCA9
ICJwYWdlWU9mZnNldCIgPT09IHByb3A7CisKKyAgICBqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVu
Y3Rpb24oIHZhbCApIHsKKyAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVs
ZW0sIG1ldGhvZCwgdmFsICkgeworICAgICAgICAgICAgdmFyIHdpbiA9IGdldFdpbmRvdyggZWxl
bSApOworCisgICAgICAgICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgeworICAgICAgICAg
ICAgICAgIHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdpbiApIHsKKyAgICAgICAgICAgICAgICB3aW4u
c2Nyb2xsVG8oCisgICAgICAgICAgICAgICAgICAgICF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZz
ZXQsCisgICAgICAgICAgICAgICAgICAgIHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldAorICAg
ICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
ZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG1ldGhvZCwg
dmFsLCBhcmd1bWVudHMubGVuZ3RoICk7CisgICAgfTsKK30gKTsKKworLy8gU3VwcG9ydDogU2Fm
YXJpPDctOCssIENocm9tZTwzNy00NCsKKy8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNp
bmcgalF1ZXJ5LmZuLnBvc2l0aW9uCisvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKKy8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdv
b2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MAorLy8gZ2V0Q29tcHV0
ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRv
bS9yaWdodDsKKy8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRo
ZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlCitqUXVlcnkuZWFjaCggWyAi
dG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkgeworICAgIGpRdWVyeS5jc3NIb29r
c1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCisgICAgICAg
IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKyAgICAgICAgICAgIGlmICggY29tcHV0ZWQg
KSB7CisgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKKwor
ICAgICAgICAgICAgICAgIC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNr
IHRvIG9mZnNldAorICAgICAgICAgICAgICAgIHJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0
ZWQgKSA/CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHBy
b3AgXSArICJweCIgOgorICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICk7Cit9ICk7CisKKworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBp
bm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRo
b2RzCitqUXVlcnkuZWFjaCggeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBm
dW5jdGlvbiggbmFtZSwgdHlwZSApIHsKKyAgICBqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiAiaW5u
ZXIiICsgbmFtZSwgY29udGVudDogdHlwZSwgIiI6ICJvdXRlciIgKyBuYW1lIH0sCisgICAgICAg
IGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgeworCisgICAgICAgIC8vIE1hcmdp
biBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aAorICAgICAgICBqUXVlcnkuZm5b
IGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHZh
ciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVv
ZiBtYXJnaW4gIT09ICJib29sZWFuIiApLAorICAgICAgICAgICAgICAgIGV4dHJhID0gZGVmYXVs
dEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIg
OiAiYm9yZGVyIiApOworCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlv
biggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgdmFyIGRvYzsKKworICAg
ICAgICAgICAgICAgIGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCBy
ZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKKyAgICAgICAgICAgICAgICAgICAg
Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMg
VVJMIGZvciBkaXNjdXNzaW9uOgorICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1
Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NAorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBo
ZWlnaHQKKyAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CisgICAg
ICAgICAgICAgICAgICAgIGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50OworCisgICAgICAgICAg
ICAgICAgICAgIC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgv
SGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwKKyAgICAgICAgICAgICAgICAgICAgLy8g
d2hpY2hldmVyIGlzIGdyZWF0ZXN0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1h
eCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0s
IGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmJv
ZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBdLAorICAgICAgICAg
ICAgICAgICAgICAgICAgZG9jWyAiY2xpZW50IiArIG5hbWUgXQorICAgICAgICAgICAgICAgICAg
ICApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9
PT0gdW5kZWZpbmVkID8KKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgd2lkdGggb3IgaGVp
Z2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0
CisgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgor
CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1l
bnQKKyAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwg
ZXh0cmEgKTsKKyAgICAgICAgICAgIH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVm
aW5lZCwgY2hhaW5hYmxlLCBudWxsICk7CisgICAgICAgIH07CisgICAgfSApOworfSApOworCisK
K2pRdWVyeS5mbi5leHRlbmQoIHsKKworICAgIGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwg
Zm4gKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTsK
KyAgICB9LAorICAgIHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTsKKyAgICB9LAorCisgICAgZGVsZWdhdGU6
IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgeworICAgICAgICByZXR1cm4g
dGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOworICAgIH0sCisgICAgdW5kZWxl
Z2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CisKKyAgICAgICAgLy8gKCBu
YW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQorICAgICAgICByZXR1cm4g
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/CisgICAgICAgICAgICB0aGlzLm9mZiggc2VsZWN0b3Is
ICIqKiIgKSA6CisgICAgICAgICAgICB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIs
IGZuICk7CisgICAgfSwKKyAgICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMubGVuZ3RoOworICAgIH0KK30gKTsKKworalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4u
YWRkQmFjazsKKworCisKKworLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5j
ZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyCisvLyBmaWxlcyB0aGF0IG1h
eSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0
aGF0CisvLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlz
IHNhZmVzdCBhbmQgbW9zdCByb2J1c3QKKy8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpx
dWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUKKy8vIGRlcml2ZWQgZnJv
bSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2Vy
Y2FzZQorLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28g
dGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzCisvLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlk
ZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCisKKy8vIE5vdGUgdGhhdCBm
b3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hv
dWxkCisvLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9p
ZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuCisvLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVy
eSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorLy8gaHR0cHM6
Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGli
cmFyaWVzI3dpa2ktYW5vbgorCitpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYg
ZGVmaW5lLmFtZCApIHsKKyAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiBqUXVlcnk7CisgICAgfSApOworfQorCisKKwordmFyCisKKyAgICAvLyBN
YXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKyAgICBfalF1ZXJ5ID0gd2luZG93
LmpRdWVyeSwKKworICAgIC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisg
ICAgXyQgPSB3aW5kb3cuJDsKKworalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCAp
IHsKKyAgICBpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7CisgICAgICAgIHdpbmRvdy4kID0g
XyQ7CisgICAgfQorCisgICAgaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSAp
IHsKKyAgICAgICAgd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CisgICAgfQorCisgICAgcmV0dXJu
IGpRdWVyeTsKK307CisKKy8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4g
aW4gQU1ECisvLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9q
cXVlcnkvcHVsbC81NTcpCisvLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgj
MTM1NjYpCitpZiAoICFub0dsb2JhbCApIHsKKyAgICB3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQg
PSBqUXVlcnk7Cit9CisKK3JldHVybiBqUXVlcnk7Cit9KSk7CisKKzs7KGZ1bmN0aW9uKCkgewor
LyohCisgKiBAb3ZlcnZpZXcgIEVtYmVyIC0gSmF2YVNjcmlwdCBBcHBsaWNhdGlvbiBGcmFtZXdv
cmsKKyAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEtMjAxNiBUaWxkZSBJbmMuIGFuZCBjb250
cmlidXRvcnMKKyAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYtMjAxMSBTdHJv
YmUgSW5jLgorICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwOC0yMDExIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIg
TUlUIGxpY2Vuc2UKKyAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vZW1i
ZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElDRU5TRQorICogQHZlcnNpb24gICAyLjYuMgorICovCisK
K3ZhciBlbmlmZWQsIHJlcXVpcmVNb2R1bGUsIHJlcXVpcmUsIEVtYmVyOwordmFyIG1haW5Db250
ZXh0ID0gdGhpczsKKworKGZ1bmN0aW9uKCkgeworICB2YXIgaXNOb2RlID0gdHlwZW9mIHdpbmRv
dyA9PT0gJ3VuZGVmaW5lZCcgJiYKKyAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcg
JiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nOworCisg
IGlmICghaXNOb2RlKSB7CisgICAgRW1iZXIgPSB0aGlzLkVtYmVyID0gdGhpcy5FbWJlciB8fCB7
fTsKKyAgfQorCisgIGlmICh0eXBlb2YgRW1iZXIgPT09ICd1bmRlZmluZWQnKSB7IEVtYmVyID0g
e307IH0KKworICBpZiAodHlwZW9mIEVtYmVyLl9fbG9hZGVyID09PSAndW5kZWZpbmVkJykgewor
ICAgIHZhciByZWdpc3RyeSA9IHt9OworICAgIHZhciBzZWVuID0ge307CisKKyAgICBlbmlmZWQg
PSBmdW5jdGlvbihuYW1lLCBkZXBzLCBjYWxsYmFjaykgeworICAgICAgdmFyIHZhbHVlID0geyB9
OworCisgICAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIHZhbHVlLmRlcHMgPSBbXTsKKyAg
ICAgICAgdmFsdWUuY2FsbGJhY2sgPSBkZXBzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFs
dWUuZGVwcyA9IGRlcHM7CisgICAgICAgIHZhbHVlLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAg
ICB9CisKKyAgICAgIHJlZ2lzdHJ5W25hbWVdID0gdmFsdWU7CisgICAgfTsKKworICAgIHJlcXVp
cmUgPSByZXF1aXJlTW9kdWxlID0gZnVuY3Rpb24obmFtZSkgeworICAgICAgcmV0dXJuIGludGVy
bmFsUmVxdWlyZShuYW1lLCBudWxsKTsKKyAgICB9OworCisgICAgLy8gc2V0dXAgYHJlcXVpcmVg
IG1vZHVsZQorICAgIHJlcXVpcmVbJ2RlZmF1bHQnXSA9IHJlcXVpcmU7CisKKyAgICByZXF1aXJl
LmhhcyA9IGZ1bmN0aW9uIHJlZ2lzdHJ5SGFzKG1vZHVsZU5hbWUpIHsKKyAgICAgIHJldHVybiAh
IXJlZ2lzdHJ5W21vZHVsZU5hbWVdIHx8ICEhcmVnaXN0cnlbbW9kdWxlTmFtZSArICcvaW5kZXgn
XTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gbWlzc2luZ01vZHVsZShuYW1lLCByZWZlcnJlck5h
bWUpIHsKKyAgICAgIGlmIChyZWZlcnJlck5hbWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCdDb3VsZCBub3QgZmluZCBtb2R1bGUgJyArIG5hbWUgKyAnIHJlcXVpcmVkIGJ5OiAnICsgcmVm
ZXJyZXJOYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291
bGQgbm90IGZpbmQgbW9kdWxlICcgKyBuYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5j
dGlvbiBpbnRlcm5hbFJlcXVpcmUoX25hbWUsIHJlZmVycmVyTmFtZSkgeworICAgICAgdmFyIG5h
bWUgPSBfbmFtZTsKKyAgICAgIHZhciBtb2QgPSByZWdpc3RyeVtuYW1lXTsKKworICAgICAgaWYg
KCFtb2QpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUgKyAnL2luZGV4JzsKKyAgICAgICAgbW9kID0g
cmVnaXN0cnlbbmFtZV07CisgICAgICB9CisKKyAgICAgIHZhciBleHBvcnRzID0gc2VlbltuYW1l
XTsKKworICAgICAgaWYgKGV4cG9ydHMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXR1cm4g
ZXhwb3J0czsKKyAgICAgIH0KKworICAgICAgZXhwb3J0cyA9IHNlZW5bbmFtZV0gPSB7fTsKKwor
ICAgICAgaWYgKCFtb2QpIHsKKyAgICAgICAgbWlzc2luZ01vZHVsZShfbmFtZSwgcmVmZXJyZXJO
YW1lKTsKKyAgICAgIH0KKworICAgICAgdmFyIGRlcHMgPSBtb2QuZGVwczsKKyAgICAgIHZhciBj
YWxsYmFjayA9IG1vZC5jYWxsYmFjazsKKyAgICAgIHZhciBsZW5ndGggPSBkZXBzLmxlbmd0aDsK
KyAgICAgIHZhciByZWlmaWVkID0gbmV3IEFycmF5KGxlbmd0aCk7CisKKyAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGRlcHNbaV0gPT09ICdleHBv
cnRzJykgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSBleHBvcnRzOworICAgICAgICB9IGVsc2Ug
aWYgKGRlcHNbaV0gPT09ICdyZXF1aXJlJykgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSByZXF1
aXJlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlaWZpZWRbaV0gPSBpbnRlcm5hbFJl
cXVpcmUoZGVwc1tpXSwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2FsbGJh
Y2suYXBwbHkodGhpcywgcmVpZmllZCk7CisKKyAgICAgIHJldHVybiBleHBvcnRzOworICAgIH0K
KworICAgIHJlcXVpcmVNb2R1bGUuX2Vha19zZWVuID0gcmVnaXN0cnk7CisKKyAgICBFbWJlci5f
X2xvYWRlciA9IHsKKyAgICAgIGRlZmluZTogZW5pZmVkLAorICAgICAgcmVxdWlyZTogcmVxdWly
ZSwKKyAgICAgIHJlZ2lzdHJ5OiByZWdpc3RyeQorICAgIH07CisgIH0gZWxzZSB7CisgICAgZW5p
ZmVkID0gRW1iZXIuX19sb2FkZXIuZGVmaW5lOworICAgIHJlcXVpcmUgPSByZXF1aXJlTW9kdWxl
ID0gRW1iZXIuX19sb2FkZXIucmVxdWlyZTsKKyAgfQorfSkoKTsKKworZW5pZmVkKCdiYWNrYnVy
bmVyJywgWydleHBvcnRzJywgJ2JhY2tidXJuZXIvdXRpbHMnLCAnYmFja2J1cm5lci9wbGF0Zm9y
bScsICdiYWNrYnVybmVyL2JpbmFyeS1zZWFyY2gnLCAnYmFja2J1cm5lci9kZWZlcnJlZC1hY3Rp
b24tcXVldWVzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfYmFja2J1cm5lclV0aWxzLCBfYmFja2J1
cm5lclBsYXRmb3JtLCBfYmFja2J1cm5lckJpbmFyeVNlYXJjaCwgX2JhY2tidXJuZXJEZWZlcnJl
ZEFjdGlvblF1ZXVlcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
QmFja2J1cm5lcjsKKworICBmdW5jdGlvbiBCYWNrYnVybmVyKHF1ZXVlTmFtZXMsIG9wdGlvbnMp
IHsKKyAgICB0aGlzLnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzOworICAgIHRoaXMub3B0aW9ucyA9
IG9wdGlvbnMgfHwge307CisgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlKSB7Cisg
ICAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlID0gcXVldWVOYW1lc1swXTsKKyAgICB9Cisg
ICAgdGhpcy5pbnN0YW5jZVN0YWNrID0gW107CisgICAgdGhpcy5fZGVib3VuY2VlcyA9IFtdOwor
ICAgIHRoaXMuX3Rocm90dGxlcnMgPSBbXTsKKyAgICB0aGlzLl9ldmVudENhbGxiYWNrcyA9IHsK
KyAgICAgIGVuZDogW10sCisgICAgICBiZWdpbjogW10KKyAgICB9OworCisgICAgdmFyIF90aGlz
ID0gdGhpczsKKyAgICB0aGlzLl9ib3VuZENsZWFySXRlbXMgPSBmdW5jdGlvbiAoKSB7CisgICAg
ICBjbGVhckl0ZW1zKCk7CisgICAgfTsKKworICAgIHRoaXMuX3RpbWVyVGltZW91dElkID0gdW5k
ZWZpbmVkOworICAgIHRoaXMuX3RpbWVycyA9IFtdOworCisgICAgdGhpcy5fcGxhdGZvcm0gPSB0
aGlzLm9wdGlvbnMuX3BsYXRmb3JtIHx8IF9iYWNrYnVybmVyUGxhdGZvcm0uZGVmYXVsdDsKKwor
ICAgIHRoaXMuX2JvdW5kUnVuRXhwaXJlZFRpbWVycyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIF90
aGlzLl9ydW5FeHBpcmVkVGltZXJzKCk7CisgICAgfTsKKyAgfQorCisgIEJhY2tidXJuZXIucHJv
dG90eXBlID0geworICAgIGJlZ2luOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3B0aW9ucyA9
IHRoaXMub3B0aW9uczsKKyAgICAgIHZhciBvbkJlZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm9u
QmVnaW47CisgICAgICB2YXIgcHJldmlvdXNJbnN0YW5jZSA9IHRoaXMuY3VycmVudEluc3RhbmNl
OworCisgICAgICBpZiAocHJldmlvdXNJbnN0YW5jZSkgeworICAgICAgICB0aGlzLmluc3RhbmNl
U3RhY2sucHVzaChwcmV2aW91c0luc3RhbmNlKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5jdXJy
ZW50SW5zdGFuY2UgPSBuZXcgX2JhY2tidXJuZXJEZWZlcnJlZEFjdGlvblF1ZXVlcy5kZWZhdWx0
KHRoaXMucXVldWVOYW1lcywgb3B0aW9ucyk7CisgICAgICB0aGlzLl90cmlnZ2VyKCdiZWdpbics
IHRoaXMuY3VycmVudEluc3RhbmNlLCBwcmV2aW91c0luc3RhbmNlKTsKKyAgICAgIGlmIChvbkJl
Z2luKSB7CisgICAgICAgIG9uQmVnaW4odGhpcy5jdXJyZW50SW5zdGFuY2UsIHByZXZpb3VzSW5z
dGFuY2UpOworICAgICAgfQorICAgIH0sCisKKyAgICBlbmQ6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOworICAgICAgdmFyIG9uRW5kID0gb3B0aW9ucyAm
JiBvcHRpb25zLm9uRW5kOworICAgICAgdmFyIGN1cnJlbnRJbnN0YW5jZSA9IHRoaXMuY3VycmVu
dEluc3RhbmNlOworICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IG51bGw7CisKKyAgICAgIC8vIFBy
ZXZlbnQgZG91YmxlLWZpbmFsbHkgYnVnIGluIFNhZmFyaSA2LjAuMiBhbmQgaU9TIDYKKyAgICAg
IC8vIFRoaXMgYnVnIGFwcGVhcnMgdG8gYmUgcmVzb2x2ZWQgaW4gU2FmYXJpIDYuMC41IGFuZCBp
T1MgNworICAgICAgdmFyIGZpbmFsbHlBbHJlYWR5Q2FsbGVkID0gZmFsc2U7CisgICAgICB0cnkg
eworICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1c2goKTsKKyAgICAgIH0gZmluYWxseSB7Cisg
ICAgICAgIGlmICghZmluYWxseUFscmVhZHlDYWxsZWQpIHsKKyAgICAgICAgICBmaW5hbGx5QWxy
ZWFkeUNhbGxlZCA9IHRydWU7CisKKyAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG51
bGw7CisKKyAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCkgeworICAgICAg
ICAgICAgbmV4dEluc3RhbmNlID0gdGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpOworICAgICAgICAg
ICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7CisgICAgICAgICAgfQorICAg
ICAgICAgIHRoaXMuX3RyaWdnZXIoJ2VuZCcsIGN1cnJlbnRJbnN0YW5jZSwgbmV4dEluc3RhbmNl
KTsKKyAgICAgICAgICBpZiAob25FbmQpIHsKKyAgICAgICAgICAgIG9uRW5kKGN1cnJlbnRJbnN0
YW5jZSwgbmV4dEluc3RhbmNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9LAorCisgICAgLyoqCisgICAgIFRyaWdnZXIgYW4gZXZlbnQuIFN1cHBvcnRzIHVwIHRvIHR3
byBhcmd1bWVudHMuIERlc2lnbmVkIGFyb3VuZAorICAgICB0cmlnZ2VyaW5nIHRyYW5zaXRpb24g
ZXZlbnRzIGZyb20gb25lIHJ1biBsb29wIGluc3RhbmNlIHRvIHRoZQorICAgICBuZXh0LCB3aGlj
aCByZXF1aXJlcyBhbiBhcmd1bWVudCBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIGFuZCB0aGVuCisg
ICAgIGFuIGFyZ3VtZW50IGZvciB0aGUgbmV4dCBpbnN0YW5jZS4KKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2QgX3RyaWdnZXIKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQorICAg
ICBAcGFyYW0ge2FueX0gYXJnMQorICAgICBAcGFyYW0ge2FueX0gYXJnMgorICAgICAqLworICAg
IF90cmlnZ2VyOiBmdW5jdGlvbiAoZXZlbnROYW1lLCBhcmcxLCBhcmcyKSB7CisgICAgICB2YXIg
Y2FsbGJhY2tzID0gdGhpcy5fZXZlbnRDYWxsYmFja3NbZXZlbnROYW1lXTsKKyAgICAgIGlmIChj
YWxsYmFja3MpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3Ro
OyBpKyspIHsKKyAgICAgICAgICBjYWxsYmFja3NbaV0oYXJnMSwgYXJnMik7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9LAorCisgICAgb246IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNr
KSB7CisgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoJ0NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpOworICAg
ICAgfQorICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2V2ZW50Q2FsbGJhY2tzW2V2ZW50TmFt
ZV07CisgICAgICBpZiAoY2FsbGJhY2tzKSB7CisgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxi
YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5v
dCBvbigpIGV2ZW50ICInICsgZXZlbnROYW1lICsgJyIgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlz
dCcpOworICAgICAgfQorICAgIH0sCisKKyAgICBvZmY6IGZ1bmN0aW9uIChldmVudE5hbWUsIGNh
bGxiYWNrKSB7CisgICAgICBpZiAoZXZlbnROYW1lKSB7CisgICAgICAgIHZhciBjYWxsYmFja3Mg
PSB0aGlzLl9ldmVudENhbGxiYWNrc1tldmVudE5hbWVdOworICAgICAgICB2YXIgY2FsbGJhY2tG
b3VuZCA9IGZhbHNlOworICAgICAgICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuOworICAgICAgICBp
ZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5s
ZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2sp
IHsKKyAgICAgICAgICAgICAgY2FsbGJhY2tGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgIGNh
bGxiYWNrcy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjYWxsYmFja0ZvdW5kKSB7Cisg
ICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IG9mZigpIGNhbGxiYWNrIHRoYXQg
ZG9lcyBub3QgZXhpc3QnKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhy
b3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IG9mZigpIGV2ZW50ICInICsgZXZlbnROYW1lICsgJyIg
YmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdCcpOworICAgICAgfQorICAgIH0sCisKKyAgICBydW46
IGZ1bmN0aW9uICgpIC8qIHRhcmdldCwgbWV0aG9kLCBhcmdzICoveworICAgICAgdmFyIGxlbmd0
aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgICB2YXIgbWV0aG9kLCB0YXJnZXQsIGFyZ3M7CisK
KyAgICAgIGlmIChsZW5ndGggPT09IDEpIHsKKyAgICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzBd
OworICAgICAgICB0YXJnZXQgPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0
ID0gYXJndW1lbnRzWzBdOworICAgICAgICBtZXRob2QgPSBhcmd1bWVudHNbMV07CisgICAgICB9
CisKKyAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzU3RyaW5nKG1ldGhvZCkpIHsKKyAgICAg
ICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICB9CisKKyAgICAgIGlmIChsZW5ndGgg
PiAyKSB7CisgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMik7CisgICAgICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gbGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGFy
Z3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAg
ICAgICBhcmdzID0gW107CisgICAgICB9CisKKyAgICAgIHZhciBvbkVycm9yID0gZ2V0T25FcnJv
cih0aGlzLm9wdGlvbnMpOworCisgICAgICB0aGlzLmJlZ2luKCk7CisKKyAgICAgIC8vIGd1YXJk
IGFnYWluc3QgU2FmYXJpIDYncyBkb3VibGUtZmluYWxseSBidWcKKyAgICAgIHZhciBkaWRGaW5h
bGx5ID0gZmFsc2U7CisKKyAgICAgIGlmIChvbkVycm9yKSB7CisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOworICAgICAgICB9IGNhdGNo
IChlcnJvcikgeworICAgICAgICAgIG9uRXJyb3IoZXJyb3IpOworICAgICAgICB9IGZpbmFsbHkg
eworICAgICAgICAgIGlmICghZGlkRmluYWxseSkgeworICAgICAgICAgICAgZGlkRmluYWxseSA9
IHRydWU7CisgICAgICAgICAgICB0aGlzLmVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gbWV0aG9kLmFw
cGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgaWYgKCFk
aWRGaW5hbGx5KSB7CisgICAgICAgICAgICBkaWRGaW5hbGx5ID0gdHJ1ZTsKKyAgICAgICAgICAg
IHRoaXMuZW5kKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKwor
ICAgIC8qCisgICAgICBKb2luIHRoZSBwYXNzZWQgbWV0aG9kIHdpdGggYW4gZXhpc3RpbmcgcXVl
dWUgYW5kIGV4ZWN1dGUgaW1tZWRpYXRlbHksCisgICAgICBpZiB0aGVyZSBpc24ndCBvbmUgdXNl
IGBCYWNrYnVybmVyI3J1bmAuCisgICAgICAgVGhlIGpvaW4gbWV0aG9kIGlzIGxpa2UgdGhlIHJ1
biBtZXRob2QgZXhjZXB0IHRoYXQgaXQgd2lsbCBzY2hlZHVsZSBpbnRvCisgICAgICBhbiBleGlz
dGluZyBxdWV1ZSBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIEluIGVpdGhlciBjYXNlLCB0aGUgam9p
biBtZXRob2Qgd2lsbAorICAgICAgaW1tZWRpYXRlbHkgZXhlY3V0ZSB0aGUgcGFzc2VkIGluIGZ1
bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdC4KKyAgICAgICBAbWV0aG9kIGpvaW4KKyAgICAg
IEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBU
aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkCisgICAgICBAcGFyYW0ge2FueX0gYXJncyBUaGUgbWV0
aG9kIGFyZ3VtZW50cworICAgICAgQHJldHVybiBtZXRob2QgcmVzdWx0CisgICAgKi8KKyAgICBq
b2luOiBmdW5jdGlvbiAoKSAvKiB0YXJnZXQsIG1ldGhvZCwgYXJncyAqL3sKKyAgICAgIGlmICgh
dGhpcy5jdXJyZW50SW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucnVuLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMu
bGVuZ3RoOworICAgICAgdmFyIG1ldGhvZCwgdGFyZ2V0OworCisgICAgICBpZiAobGVuZ3RoID09
PSAxKSB7CisgICAgICAgIG1ldGhvZCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgdGFyZ2V0ID0g
bnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXTsKKyAg
ICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzFdOworICAgICAgfQorCisgICAgICBpZiAoX2JhY2ti
dXJuZXJVdGlscy5pc1N0cmluZyhtZXRob2QpKSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldFtt
ZXRob2RdOworICAgICAgfQorCisgICAgICBpZiAobGVuZ3RoID09PSAxKSB7CisgICAgICAgIHJl
dHVybiBtZXRob2QoKTsKKyAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAyKSB7CisgICAgICAg
IHJldHVybiBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFy
IGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMik7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBs
ID0gbGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVu
dHNbaSArIDJdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0
LCBhcmdzKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoKKyAgICAgIERlZmVyIHRoZSBwYXNz
ZWQgZnVuY3Rpb24gdG8gcnVuIGluc2lkZSB0aGUgc3BlY2lmaWVkIHF1ZXVlLgorICAgICAgIEBt
ZXRob2QgZGVmZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBxdWV1ZU5hbWUKKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSB0YXJnZXQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2Qg
VGhlIG1ldGhvZCBvciBtZXRob2QgbmFtZSB0byBiZSBleGVjdXRlZAorICAgICAgQHBhcmFtIHth
bnl9IGFyZ3MgVGhlIG1ldGhvZCBhcmd1bWVudHMKKyAgICAgIEByZXR1cm4gbWV0aG9kIHJlc3Vs
dAorICAgICovCisgICAgZGVmZXI6IGZ1bmN0aW9uIChxdWV1ZU5hbWUgLyogLCB0YXJnZXQsIG1l
dGhvZCwgYXJncyAqLykgeworICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7Cisg
ICAgICB2YXIgbWV0aG9kLCB0YXJnZXQsIGFyZ3M7CisKKyAgICAgIGlmIChsZW5ndGggPT09IDIp
IHsKKyAgICAgICAgbWV0aG9kID0gYXJndW1lbnRzWzFdOworICAgICAgICB0YXJnZXQgPSBudWxs
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzFdOworICAgICAg
ICBtZXRob2QgPSBhcmd1bWVudHNbMl07CisgICAgICB9CisKKyAgICAgIGlmIChfYmFja2J1cm5l
clV0aWxzLmlzU3RyaW5nKG1ldGhvZCkpIHsKKyAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhv
ZF07CisgICAgICB9CisKKyAgICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBuZXcgRXJyb3Io
KSA6IHVuZGVmaW5lZDsKKworICAgICAgaWYgKGxlbmd0aCA+IDMpIHsKKyAgICAgICAgYXJncyA9
IG5ldyBBcnJheShsZW5ndGggLSAzKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBsZW5n
dGg7IGkrKykgeworICAgICAgICAgIGFyZ3NbaSAtIDNdID0gYXJndW1lbnRzW2ldOworICAgICAg
ICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdzID0gdW5kZWZpbmVkOworICAgICAgfQor
CisgICAgICBpZiAoIXRoaXMuY3VycmVudEluc3RhbmNlKSB7CisgICAgICAgIGNyZWF0ZUF1dG9y
dW4odGhpcyk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2Uuc2No
ZWR1bGUocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgZmFsc2UsIHN0YWNrKTsKKyAg
ICB9LAorCisgICAgZGVmZXJPbmNlOiBmdW5jdGlvbiAocXVldWVOYW1lIC8qICwgdGFyZ2V0LCBt
ZXRob2QsIGFyZ3MgKi8pIHsKKyAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwor
ICAgICAgdmFyIG1ldGhvZCwgdGFyZ2V0LCBhcmdzOworCisgICAgICBpZiAobGVuZ3RoID09PSAy
KSB7CisgICAgICAgIG1ldGhvZCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgdGFyZ2V0ID0gbnVs
bDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXTsKKyAgICAg
ICAgbWV0aG9kID0gYXJndW1lbnRzWzJdOworICAgICAgfQorCisgICAgICBpZiAoX2JhY2tidXJu
ZXJVdGlscy5pc1N0cmluZyhtZXRob2QpKSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldFttZXRo
b2RdOworICAgICAgfQorCisgICAgICB2YXIgc3RhY2sgPSB0aGlzLkRFQlVHID8gbmV3IEVycm9y
KCkgOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChsZW5ndGggPiAzKSB7CisgICAgICAgIGFyZ3Mg
PSBuZXcgQXJyYXkobGVuZ3RoIC0gMyk7CisgICAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbGVu
Z3RoOyBpKyspIHsKKyAgICAgICAgICBhcmdzW2kgLSAzXSA9IGFyZ3VtZW50c1tpXTsKKyAgICAg
ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJncyA9IHVuZGVmaW5lZDsKKyAgICAgIH0K
KworICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkgeworICAgICAgICBjcmVhdGVBdXRv
cnVuKHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEluc3RhbmNlLnNj
aGVkdWxlKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHRydWUsIHN0YWNrKTsKKyAg
ICB9LAorCisgICAgc2V0VGltZW91dDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGwgPSBhcmd1
bWVudHMubGVuZ3RoOworICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobCk7CisKKyAgICAgIGZv
ciAodmFyIHggPSAwOyB4IDwgbDsgeCsrKSB7CisgICAgICAgIGFyZ3NbeF0gPSBhcmd1bWVudHNb
eF07CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSBhcmdzLmxlbmd0aCwKKyAgICAgICAg
ICBtZXRob2QsCisgICAgICAgICAgd2FpdCwKKyAgICAgICAgICB0YXJnZXQsCisgICAgICAgICAg
bWV0aG9kT3JUYXJnZXQsCisgICAgICAgICAgbWV0aG9kT3JXYWl0LAorICAgICAgICAgIG1ldGhv
ZE9yQXJnczsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMSkgeworICAgICAgICBtZXRob2QgPSBhcmdzLnNo
aWZ0KCk7CisgICAgICAgIHdhaXQgPSAwOworICAgICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDIp
IHsKKyAgICAgICAgbWV0aG9kT3JUYXJnZXQgPSBhcmdzWzBdOworICAgICAgICBtZXRob2RPcldh
aXQgPSBhcmdzWzFdOworCisgICAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzRnVuY3Rpb24o
bWV0aG9kT3JXYWl0KSB8fCBfYmFja2J1cm5lclV0aWxzLmlzRnVuY3Rpb24obWV0aG9kT3JUYXJn
ZXRbbWV0aG9kT3JXYWl0XSkpIHsKKyAgICAgICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7Cisg
ICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOworICAgICAgICAgIHdhaXQgPSAwOworICAg
ICAgICB9IGVsc2UgaWYgKF9iYWNrYnVybmVyVXRpbHMuaXNDb2VyY2FibGVOdW1iZXIobWV0aG9k
T3JXYWl0KSkgeworICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICB3
YWl0ID0gYXJncy5zaGlmdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1ldGhvZCA9
IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICB3YWl0ID0gMDsKKyAgICAgICAgfQorICAgICAgfSBl
bHNlIHsKKyAgICAgICAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CisKKyAgICAg
ICAgaWYgKF9iYWNrYnVybmVyVXRpbHMuaXNDb2VyY2FibGVOdW1iZXIobGFzdCkpIHsKKyAgICAg
ICAgICB3YWl0ID0gYXJncy5wb3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3YWl0
ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJnc1swXTsKKyAg
ICAgICAgbWV0aG9kT3JBcmdzID0gYXJnc1sxXTsKKworICAgICAgICBpZiAoX2JhY2tidXJuZXJV
dGlscy5pc0Z1bmN0aW9uKG1ldGhvZE9yQXJncykgfHwgX2JhY2tidXJuZXJVdGlscy5pc1N0cmlu
ZyhtZXRob2RPckFyZ3MpICYmIG1ldGhvZE9yVGFyZ2V0ICE9PSBudWxsICYmIG1ldGhvZE9yQXJn
cyBpbiBtZXRob2RPclRhcmdldCkgeworICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hpZnQoKTsK
KyAgICAgICAgICBtZXRob2QgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAg
IHZhciBleGVjdXRlQXQgPSBEYXRlLm5vdygpICsgcGFyc2VJbnQod2FpdCAhPT0gd2FpdCA/IDAg
OiB3YWl0LCAxMCk7CisKKyAgICAgIGlmIChfYmFja2J1cm5lclV0aWxzLmlzU3RyaW5nKG1ldGhv
ZCkpIHsKKyAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICB9CisKKyAgICAg
IHZhciBvbkVycm9yID0gZ2V0T25FcnJvcih0aGlzLm9wdGlvbnMpOworCisgICAgICBmdW5jdGlv
biBmbigpIHsKKyAgICAgICAgaWYgKG9uRXJyb3IpIHsKKyAgICAgICAgICB0cnkgeworICAgICAg
ICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgICAgfSBjYXRjaCAoZSkg
eworICAgICAgICAgICAgb25FcnJvcihlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7CisgICAgICAgIH0KKyAgICAg
IH0KKworICAgICAgcmV0dXJuIHRoaXMuX3NldFRpbWVvdXQoZm4sIGV4ZWN1dGVBdCk7CisgICAg
fSwKKworICAgIF9zZXRUaW1lb3V0OiBmdW5jdGlvbiAoZm4sIGV4ZWN1dGVBdCkgeworICAgICAg
aWYgKHRoaXMuX3RpbWVycy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgdGhpcy5fdGltZXJzLnB1
c2goZXhlY3V0ZUF0LCBmbik7CisgICAgICAgIHRoaXMuX2luc3RhbGxUaW1lclRpbWVvdXQoKTsK
KyAgICAgICAgcmV0dXJuIGZuOworICAgICAgfQorCisgICAgICAvLyBmaW5kIHBvc2l0aW9uIHRv
IGluc2VydAorICAgICAgdmFyIGkgPSBfYmFja2J1cm5lckJpbmFyeVNlYXJjaC5kZWZhdWx0KGV4
ZWN1dGVBdCwgdGhpcy5fdGltZXJzKTsKKworICAgICAgdGhpcy5fdGltZXJzLnNwbGljZShpLCAw
LCBleGVjdXRlQXQsIGZuKTsKKworICAgICAgLy8gd2Ugc2hvdWxkIGJlIHRoZSBuZXcgZWFybGll
c3QgdGltZXIgaWYgaSA9PSAwCisgICAgICBpZiAoaSA9PT0gMCkgeworICAgICAgICB0aGlzLl9y
ZWluc3RhbGxUaW1lclRpbWVvdXQoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZuOworICAg
IH0sCisKKyAgICB0aHJvdHRsZTogZnVuY3Rpb24gKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywg
d2FpdCwgW2ltbWVkaWF0ZV0gKi8pIHsKKyAgICAgIHZhciBiYWNrYnVybmVyID0gdGhpczsKKyAg
ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpOworICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYXJnc1tpXSA9
IGFyZ3VtZW50c1tpXTsKKyAgICAgIH0KKyAgICAgIHZhciBpbW1lZGlhdGUgPSBhcmdzLnBvcCgp
OworICAgICAgdmFyIHdhaXQsIHRocm90dGxlciwgaW5kZXgsIHRpbWVyOworCisgICAgICBpZiAo
X2JhY2tidXJuZXJVdGlscy5pc051bWJlcihpbW1lZGlhdGUpIHx8IF9iYWNrYnVybmVyVXRpbHMu
aXNTdHJpbmcoaW1tZWRpYXRlKSkgeworICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOworICAgICAg
ICBpbW1lZGlhdGUgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2FpdCA9IGFyZ3Mu
cG9wKCk7CisgICAgICB9CisKKyAgICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAxMCk7CisKKyAg
ICAgIGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCwgdGhpcy5fdGhyb3R0bGVy
cyk7CisgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3R0
bGVyc1tpbmRleF07CisgICAgICB9IC8vIHRocm90dGxlZAorCisgICAgICB0aW1lciA9IHRoaXMu
X3BsYXRmb3JtLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoIWltbWVkaWF0
ZSkgeworICAgICAgICAgIGJhY2tidXJuZXIucnVuLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3MpOwor
ICAgICAgICB9CisgICAgICAgIHZhciBpbmRleCA9IGZpbmRUaHJvdHRsZXIodGFyZ2V0LCBtZXRo
b2QsIGJhY2tidXJuZXIuX3Rocm90dGxlcnMpOworICAgICAgICBpZiAoaW5kZXggPiAtMSkgewor
ICAgICAgICAgIGJhY2tidXJuZXIuX3Rocm90dGxlcnMuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAg
ICAgfQorICAgICAgfSwgd2FpdCk7CisKKyAgICAgIGlmIChpbW1lZGlhdGUpIHsKKyAgICAgICAg
dGhpcy5ydW4uYXBwbHkodGhpcywgYXJncyk7CisgICAgICB9CisKKyAgICAgIHRocm90dGxlciA9
IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOworCisgICAgICB0aGlzLl90aHJvdHRsZXJzLnB1c2go
dGhyb3R0bGVyKTsKKworICAgICAgcmV0dXJuIHRocm90dGxlcjsKKyAgICB9LAorCisgICAgZGVi
b3VuY2U6IGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZCAvKiAsIGFyZ3MsIHdhaXQsIFtpbW1lZGlh
dGVdICovKSB7CisgICAgICB2YXIgYmFja2J1cm5lciA9IHRoaXM7CisgICAgICB2YXIgYXJncyA9
IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07
CisgICAgICB9CisKKyAgICAgIHZhciBpbW1lZGlhdGUgPSBhcmdzLnBvcCgpOworICAgICAgdmFy
IHdhaXQsIGluZGV4LCBkZWJvdW5jZWUsIHRpbWVyOworCisgICAgICBpZiAoX2JhY2tidXJuZXJV
dGlscy5pc051bWJlcihpbW1lZGlhdGUpIHx8IF9iYWNrYnVybmVyVXRpbHMuaXNTdHJpbmcoaW1t
ZWRpYXRlKSkgeworICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOworICAgICAgICBpbW1lZGlhdGUg
PSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdhaXQgPSBhcmdzLnBvcCgpOworICAg
ICAgfQorCisgICAgICB3YWl0ID0gcGFyc2VJbnQod2FpdCwgMTApOworICAgICAgLy8gUmVtb3Zl
IGRlYm91bmNlZQorICAgICAgaW5kZXggPSBmaW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kLCB0
aGlzLl9kZWJvdW5jZWVzKTsKKworICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgZGVi
b3VuY2VlID0gdGhpcy5fZGVib3VuY2Vlc1tpbmRleF07CisgICAgICAgIHRoaXMuX2RlYm91bmNl
ZXMuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgdGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0
KGRlYm91bmNlZVsyXSk7CisgICAgICB9CisKKyAgICAgIHRpbWVyID0gdGhpcy5fcGxhdGZvcm0u
c2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmICghaW1tZWRpYXRlKSB7CisgICAg
ICAgICAgYmFja2J1cm5lci5ydW4uYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgICAgICAgIH0K
KyAgICAgICAgdmFyIGluZGV4ID0gZmluZERlYm91bmNlZSh0YXJnZXQsIG1ldGhvZCwgYmFja2J1
cm5lci5fZGVib3VuY2Vlcyk7CisgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgICAg
YmFja2J1cm5lci5fZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgICB9CisgICAg
ICB9LCB3YWl0KTsKKworICAgICAgaWYgKGltbWVkaWF0ZSAmJiBpbmRleCA9PT0gLTEpIHsKKyAg
ICAgICAgYmFja2J1cm5lci5ydW4uYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgICAgICB9CisK
KyAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOworCisgICAgICBiYWNr
YnVybmVyLl9kZWJvdW5jZWVzLnB1c2goZGVib3VuY2VlKTsKKworICAgICAgcmV0dXJuIGRlYm91
bmNlZTsKKyAgICB9LAorCisgICAgY2FuY2VsVGltZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICBf
YmFja2J1cm5lclV0aWxzLmVhY2godGhpcy5fdGhyb3R0bGVycywgdGhpcy5fYm91bmRDbGVhckl0
ZW1zKTsKKyAgICAgIHRoaXMuX3Rocm90dGxlcnMgPSBbXTsKKworICAgICAgX2JhY2tidXJuZXJV
dGlscy5lYWNoKHRoaXMuX2RlYm91bmNlZXMsIHRoaXMuX2JvdW5kQ2xlYXJJdGVtcyk7CisgICAg
ICB0aGlzLl9kZWJvdW5jZWVzID0gW107CisKKyAgICAgIHRoaXMuX2NsZWFyVGltZXJUaW1lb3V0
KCk7CisgICAgICB0aGlzLl90aW1lcnMgPSBbXTsKKworICAgICAgaWYgKHRoaXMuX2F1dG9ydW4p
IHsKKyAgICAgICAgdGhpcy5fcGxhdGZvcm0uY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9ydW4pOwor
ICAgICAgICB0aGlzLl9hdXRvcnVuID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaGFz
VGltZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gISF0aGlzLl90aW1lcnMubGVuZ3Ro
IHx8ICEhdGhpcy5fZGVib3VuY2Vlcy5sZW5ndGggfHwgISF0aGlzLl90aHJvdHRsZXJzLmxlbmd0
aCB8fCB0aGlzLl9hdXRvcnVuOworICAgIH0sCisKKyAgICBjYW5jZWw6IGZ1bmN0aW9uICh0aW1l
cikgeworICAgICAgdmFyIHRpbWVyVHlwZSA9IHR5cGVvZiB0aW1lcjsKKworICAgICAgaWYgKHRp
bWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVjdCcgJiYgdGltZXIucXVldWUgJiYgdGltZXIubWV0
aG9kKSB7CisgICAgICAgIC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBkZWZlck9uY2UKKyAgICAgICAg
cmV0dXJuIHRpbWVyLnF1ZXVlLmNhbmNlbCh0aW1lcik7CisgICAgICB9IGVsc2UgaWYgKHRpbWVy
VHlwZSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAvLyB3ZSdyZSBjYW5jZWxsaW5nIGEgc2V0
VGltZW91dAorICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX3RpbWVycy5sZW5ndGg7
IGkgPCBsOyBpICs9IDIpIHsKKyAgICAgICAgICBpZiAodGhpcy5fdGltZXJzW2kgKyAxXSA9PT0g
dGltZXIpIHsKKyAgICAgICAgICAgIHRoaXMuX3RpbWVycy5zcGxpY2UoaSwgMik7IC8vIHJlbW92
ZSB0aGUgdHdvIGVsZW1lbnRzCisgICAgICAgICAgICBpZiAoaSA9PT0gMCkgeworICAgICAgICAg
ICAgICB0aGlzLl9yZWluc3RhbGxUaW1lclRpbWVvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNl
IGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGltZXIpID09PSAnW29iamVjdCBB
cnJheV0nKSB7CisgICAgICAgIC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSB0aHJvdHRsZSBvciBkZWJv
dW5jZQorICAgICAgICByZXR1cm4gdGhpcy5fY2FuY2VsSXRlbShmaW5kVGhyb3R0bGVyLCB0aGlz
Ll90aHJvdHRsZXJzLCB0aW1lcikgfHwgdGhpcy5fY2FuY2VsSXRlbShmaW5kRGVib3VuY2VlLCB0
aGlzLl9kZWJvdW5jZWVzLCB0aW1lcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm47
IC8vIHRpbWVyIHdhcyBudWxsIG9yIG5vdCBhIHRpbWVyCisgICAgICB9CisgICAgfSwKKworICAg
IF9jYW5jZWxJdGVtOiBmdW5jdGlvbiAoZmluZE1ldGhvZCwgYXJyYXksIHRpbWVyKSB7CisgICAg
ICB2YXIgaXRlbSwgaW5kZXg7CisKKyAgICAgIGlmICh0aW1lci5sZW5ndGggPCAzKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaW5kZXggPSBmaW5kTWV0aG9kKHRp
bWVyWzBdLCB0aW1lclsxXSwgYXJyYXkpOworCisgICAgICBpZiAoaW5kZXggPiAtMSkgeworCisg
ICAgICAgIGl0ZW0gPSBhcnJheVtpbmRleF07CisKKyAgICAgICAgaWYgKGl0ZW1bMl0gPT09IHRp
bWVyWzJdKSB7CisgICAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgICB0
aGlzLl9wbGF0Zm9ybS5jbGVhclRpbWVvdXQodGltZXJbMl0pOworICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAor
CisgICAgX3J1bkV4cGlyZWRUaW1lcnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3RpbWVy
VGltZW91dElkID0gdW5kZWZpbmVkOworICAgICAgdGhpcy5ydW4odGhpcywgdGhpcy5fc2NoZWR1
bGVFeHBpcmVkVGltZXJzKTsKKyAgICB9LAorCisgICAgX3NjaGVkdWxlRXhwaXJlZFRpbWVyczog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG4gPSBEYXRlLm5vdygpOworICAgICAgdmFyIHRpbWVy
cyA9IHRoaXMuX3RpbWVyczsKKyAgICAgIHZhciBpID0gMDsKKyAgICAgIHZhciBsID0gdGltZXJz
Lmxlbmd0aDsKKyAgICAgIGZvciAoOyBpIDwgbDsgaSArPSAyKSB7CisgICAgICAgIHZhciBleGVj
dXRlQXQgPSB0aW1lcnNbaV07CisgICAgICAgIHZhciBmbiA9IHRpbWVyc1tpICsgMV07CisgICAg
ICAgIGlmIChleGVjdXRlQXQgPD0gbikgeworICAgICAgICAgIHRoaXMuc2NoZWR1bGUodGhpcy5v
cHRpb25zLmRlZmF1bHRRdWV1ZSwgbnVsbCwgZm4pOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aW1lcnMuc3BsaWNlKDAsIGkp
OworICAgICAgdGhpcy5faW5zdGFsbFRpbWVyVGltZW91dCgpOworICAgIH0sCisKKyAgICBfcmVp
bnN0YWxsVGltZXJUaW1lb3V0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9jbGVhclRpbWVy
VGltZW91dCgpOworICAgICAgdGhpcy5faW5zdGFsbFRpbWVyVGltZW91dCgpOworICAgIH0sCisK
KyAgICBfY2xlYXJUaW1lclRpbWVvdXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy5f
dGltZXJUaW1lb3V0SWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5f
cGxhdGZvcm0uY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyVGltZW91dElkKTsKKyAgICAgIHRoaXMu
X3RpbWVyVGltZW91dElkID0gdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBfaW5zdGFsbFRpbWVy
VGltZW91dDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF0aGlzLl90aW1lcnMubGVuZ3RoKSB7
CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBtaW5FeHBpcmVzQXQgPSB0aGlz
Ll90aW1lcnNbMF07CisgICAgICB2YXIgbiA9IERhdGUubm93KCk7CisgICAgICB2YXIgd2FpdCA9
IE1hdGgubWF4KDAsIG1pbkV4cGlyZXNBdCAtIG4pOworICAgICAgdGhpcy5fdGltZXJUaW1lb3V0
SWQgPSB0aGlzLl9wbGF0Zm9ybS5zZXRUaW1lb3V0KHRoaXMuX2JvdW5kUnVuRXhwaXJlZFRpbWVy
cywgd2FpdCk7CisgICAgfQorICB9OworCisgIEJhY2tidXJuZXIucHJvdG90eXBlLnNjaGVkdWxl
ID0gQmFja2J1cm5lci5wcm90b3R5cGUuZGVmZXI7CisgIEJhY2tidXJuZXIucHJvdG90eXBlLnNj
aGVkdWxlT25jZSA9IEJhY2tidXJuZXIucHJvdG90eXBlLmRlZmVyT25jZTsKKyAgQmFja2J1cm5l
ci5wcm90b3R5cGUubGF0ZXIgPSBCYWNrYnVybmVyLnByb3RvdHlwZS5zZXRUaW1lb3V0OworCisg
IGZ1bmN0aW9uIGdldE9uRXJyb3Iob3B0aW9ucykgeworICAgIHJldHVybiBvcHRpb25zLm9uRXJy
b3IgfHwgb3B0aW9ucy5vbkVycm9yVGFyZ2V0ICYmIG9wdGlvbnMub25FcnJvclRhcmdldFtvcHRp
b25zLm9uRXJyb3JNZXRob2RdOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlQXV0b3J1bihiYWNr
YnVybmVyKSB7CisgICAgYmFja2J1cm5lci5iZWdpbigpOworICAgIGJhY2tidXJuZXIuX2F1dG9y
dW4gPSBiYWNrYnVybmVyLl9wbGF0Zm9ybS5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAg
IGJhY2tidXJuZXIuX2F1dG9ydW4gPSBudWxsOworICAgICAgYmFja2J1cm5lci5lbmQoKTsKKyAg
ICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmREZWJvdW5jZWUodGFyZ2V0LCBtZXRob2QsIGRl
Ym91bmNlZXMpIHsKKyAgICByZXR1cm4gZmluZEl0ZW0odGFyZ2V0LCBtZXRob2QsIGRlYm91bmNl
ZXMpOworICB9CisKKyAgZnVuY3Rpb24gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCwgdGhy
b3R0bGVycykgeworICAgIHJldHVybiBmaW5kSXRlbSh0YXJnZXQsIG1ldGhvZCwgdGhyb3R0bGVy
cyk7CisgIH0KKworICBmdW5jdGlvbiBmaW5kSXRlbSh0YXJnZXQsIG1ldGhvZCwgY29sbGVjdGlv
bikgeworICAgIHZhciBpdGVtOworICAgIHZhciBpbmRleCA9IC0xOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaXRlbSA9
IGNvbGxlY3Rpb25baV07CisgICAgICBpZiAoaXRlbVswXSA9PT0gdGFyZ2V0ICYmIGl0ZW1bMV0g
PT09IG1ldGhvZCkgeworICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBpbmRleDsKKyAgfQorCisgIGZ1bmN0aW9uIGNsZWFySXRl
bXMoaXRlbSkgeworICAgIHRoaXMuX3BsYXRmb3JtLmNsZWFyVGltZW91dChpdGVtWzJdKTsKKyAg
fQorfSk7CitlbmlmZWQoImJhY2tidXJuZXIvYmluYXJ5LXNlYXJjaCIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gYmluYXJ5U2VhcmNoOworCisgIGZ1bmN0aW9uIGJpbmFyeVNlYXJjaCh0aW1lLCB0aW1lcnMp
IHsKKyAgICB2YXIgc3RhcnQgPSAwOworICAgIHZhciBlbmQgPSB0aW1lcnMubGVuZ3RoIC0gMjsK
KyAgICB2YXIgbWlkZGxlLCBsOworCisgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAv
LyBzaW5jZSB0aW1lcnMgaXMgYW4gYXJyYXkgb2YgcGFpcnMgJ2wnIHdpbGwgYWx3YXlzCisgICAg
ICAvLyBiZSBhbiBpbnRlZ2VyCisgICAgICBsID0gKGVuZCAtIHN0YXJ0KSAvIDI7CisKKyAgICAg
IC8vIGNvbXBlbnNhdGUgZm9yIHRoZSBpbmRleCBpbiBjYXNlIGV2ZW4gbnVtYmVyCisgICAgICAv
LyBvZiBwYWlycyBpbnNpZGUgdGltZXJzCisgICAgICBtaWRkbGUgPSBzdGFydCArIGwgLSBsICUg
MjsKKworICAgICAgaWYgKHRpbWUgPj0gdGltZXJzW21pZGRsZV0pIHsKKyAgICAgICAgc3RhcnQg
PSBtaWRkbGUgKyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5kID0gbWlkZGxlOworICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiB0aW1lID49IHRpbWVyc1tzdGFydF0gPyBzdGFydCAr
IDIgOiBzdGFydDsKKyAgfQorfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvZGVmZXJyZWQtYWN0aW9u
LXF1ZXVlcycsIFsnZXhwb3J0cycsICdiYWNrYnVybmVyL3V0aWxzJywgJ2JhY2tidXJuZXIvcXVl
dWUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9iYWNrYnVybmVyVXRpbHMsIF9iYWNrYnVybmVyUXVl
dWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERlZmVycmVkQWN0
aW9uUXVldWVzOworCisgIGZ1bmN0aW9uIERlZmVycmVkQWN0aW9uUXVldWVzKHF1ZXVlTmFtZXMs
IG9wdGlvbnMpIHsKKyAgICB2YXIgcXVldWVzID0gdGhpcy5xdWV1ZXMgPSB7fTsKKyAgICB0aGlz
LnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzID0gcXVldWVOYW1lcyB8fCBbXTsKKworICAgIHRoaXMu
b3B0aW9ucyA9IG9wdGlvbnM7CisKKyAgICBfYmFja2J1cm5lclV0aWxzLmVhY2gocXVldWVOYW1l
cywgZnVuY3Rpb24gKHF1ZXVlTmFtZSkgeworICAgICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcg
X2JhY2tidXJuZXJRdWV1ZS5kZWZhdWx0KHF1ZXVlTmFtZSwgb3B0aW9uc1txdWV1ZU5hbWVdLCBv
cHRpb25zKTsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIG5vU3VjaFF1ZXVlKG5hbWUpIHsK
KyAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhdHRlbXB0ZWQgdG8gc2NoZWR1bGUgYW4gYWN0aW9u
IGluIGEgcXVldWUgKCcgKyBuYW1lICsgJykgdGhhdCBkb2VzblwndCBleGlzdCcpOworICB9CisK
KyAgZnVuY3Rpb24gbm9TdWNoTWV0aG9kKG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1lv
dSBhdHRlbXB0ZWQgdG8gc2NoZWR1bGUgYW4gYWN0aW9uIGluIGEgcXVldWUgKCcgKyBuYW1lICsg
JykgZm9yIGEgbWV0aG9kIHRoYXQgZG9lc25cJ3QgZXhpc3QnKTsKKyAgfQorCisgIERlZmVycmVk
QWN0aW9uUXVldWVzLnByb3RvdHlwZSA9IHsKKyAgICBzY2hlZHVsZTogZnVuY3Rpb24gKG5hbWUs
IHRhcmdldCwgbWV0aG9kLCBhcmdzLCBvbmNlRmxhZywgc3RhY2spIHsKKyAgICAgIHZhciBxdWV1
ZXMgPSB0aGlzLnF1ZXVlczsKKyAgICAgIHZhciBxdWV1ZSA9IHF1ZXVlc1tuYW1lXTsKKworICAg
ICAgaWYgKCFxdWV1ZSkgeworICAgICAgICBub1N1Y2hRdWV1ZShuYW1lKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKCFtZXRob2QpIHsKKyAgICAgICAgbm9TdWNoTWV0aG9kKG5hbWUpOworICAgICAg
fQorCisgICAgICBpZiAob25jZUZsYWcpIHsKKyAgICAgICAgcmV0dXJuIHF1ZXVlLnB1c2hVbmlx
dWUodGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHJldHVybiBxdWV1ZS5wdXNoKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgICB9
CisgICAgfSwKKworICAgIGZsdXNoOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVldWVzID0g
dGhpcy5xdWV1ZXM7CisgICAgICB2YXIgcXVldWVOYW1lcyA9IHRoaXMucXVldWVOYW1lczsKKyAg
ICAgIHZhciBxdWV1ZU5hbWUsIHF1ZXVlOworICAgICAgdmFyIHF1ZXVlTmFtZUluZGV4ID0gMDsK
KyAgICAgIHZhciBudW1iZXJPZlF1ZXVlcyA9IHF1ZXVlTmFtZXMubGVuZ3RoOworCisgICAgICB3
aGlsZSAocXVldWVOYW1lSW5kZXggPCBudW1iZXJPZlF1ZXVlcykgeworICAgICAgICBxdWV1ZU5h
bWUgPSBxdWV1ZU5hbWVzW3F1ZXVlTmFtZUluZGV4XTsKKyAgICAgICAgcXVldWUgPSBxdWV1ZXNb
cXVldWVOYW1lXTsKKworICAgICAgICB2YXIgbnVtYmVyT2ZRdWV1ZUl0ZW1zID0gcXVldWUuX3F1
ZXVlLmxlbmd0aDsKKworICAgICAgICBpZiAobnVtYmVyT2ZRdWV1ZUl0ZW1zID09PSAwKSB7Cisg
ICAgICAgICAgcXVldWVOYW1lSW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBx
dWV1ZS5mbHVzaChmYWxzZSAvKiBhc3luYyAqLyk7CisgICAgICAgICAgcXVldWVOYW1lSW5kZXgg
PSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2JhY2ti
dXJuZXIvcGxhdGZvcm0nLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBHbG9iYWxDb250ZXh0OworCisgIC8qIGdsb2JhbCBzZWxmICov
CisgIGlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHsKKyAgICBHbG9iYWxDb250ZXh0ID0g
c2VsZjsKKworICAgIC8qIGdsb2JhbCBnbG9iYWwgKi8KKyAgfSBlbHNlIGlmICh0eXBlb2YgZ2xv
YmFsID09PSAnb2JqZWN0JykgeworICAgICAgR2xvYmFsQ29udGV4dCA9IGdsb2JhbDsKKworICAg
ICAgLyogZ2xvYmFsIHdpbmRvdyAqLworICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0g
J29iamVjdCcpIHsKKyAgICAgICAgR2xvYmFsQ29udGV4dCA9IHdpbmRvdzsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ2xvYmFsOiBgc2VsZmAsIGBnbG9iYWxg
IG5vciBgd2luZG93YCB3YXMgZm91bmQnKTsKKyAgICAgIH0KKworICBleHBvcnRzLmRlZmF1bHQg
PSBHbG9iYWxDb250ZXh0OworfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvcXVldWUnLCBbJ2V4cG9y
dHMnLCAnYmFja2J1cm5lci91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2JhY2tidXJuZXJV
dGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUXVldWU7CisK
KyAgZnVuY3Rpb24gUXVldWUobmFtZSwgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucykgeworICAgIHRo
aXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucyB8
fCB7fTsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgIHRoaXMuX3F1ZXVlID0gW107
CisgICAgdGhpcy50YXJnZXRRdWV1ZXMgPSB7fTsKKyAgICB0aGlzLl9xdWV1ZUJlaW5nRmx1c2hl
ZCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIFF1ZXVlLnByb3RvdHlwZSA9IHsKKyAgICBwdXNoOiBm
dW5jdGlvbiAodGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7CisgICAgICB2YXIgcXVldWUg
PSB0aGlzLl9xdWV1ZTsKKyAgICAgIHF1ZXVlLnB1c2godGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0
YWNrKTsKKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcXVldWU6IHRoaXMsCisgICAgICAgIHRh
cmdldDogdGFyZ2V0LAorICAgICAgICBtZXRob2Q6IG1ldGhvZAorICAgICAgfTsKKyAgICB9LAor
CisgICAgcHVzaFVuaXF1ZVdpdGhvdXRHdWlkOiBmdW5jdGlvbiAodGFyZ2V0LCBtZXRob2QsIGFy
Z3MsIHN0YWNrKSB7CisgICAgICB2YXIgcXVldWUgPSB0aGlzLl9xdWV1ZTsKKworICAgICAgZm9y
ICh2YXIgaSA9IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKKyAgICAgICAg
dmFyIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKKyAgICAgICAgdmFyIGN1cnJlbnRNZXRob2Qg
PSBxdWV1ZVtpICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAm
JiBjdXJyZW50TWV0aG9kID09PSBtZXRob2QpIHsKKyAgICAgICAgICBxdWV1ZVtpICsgMl0gPSBh
cmdzOyAvLyByZXBsYWNlIGFyZ3MKKyAgICAgICAgICBxdWV1ZVtpICsgM10gPSBzdGFjazsgLy8g
cmVwbGFjZSBzdGFjaworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisg
ICAgICBxdWV1ZS5wdXNoKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjayk7CisgICAgfSwKKwor
ICAgIHRhcmdldFF1ZXVlOiBmdW5jdGlvbiAodGFyZ2V0UXVldWUsIHRhcmdldCwgbWV0aG9kLCBh
cmdzLCBzdGFjaykgeworICAgICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7CisKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gdGFyZ2V0UXVldWUubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Cisg
ICAgICAgIHZhciBjdXJyZW50TWV0aG9kID0gdGFyZ2V0UXVldWVbaV07CisgICAgICAgIHZhciBj
dXJyZW50SW5kZXggPSB0YXJnZXRRdWV1ZVtpICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRN
ZXRob2QgPT09IG1ldGhvZCkgeworICAgICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleCArIDJdID0g
YXJnczsgLy8gcmVwbGFjZSBhcmdzCisgICAgICAgICAgcXVldWVbY3VycmVudEluZGV4ICsgM10g
PSBzdGFjazsgLy8gcmVwbGFjZSBzdGFjaworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICB0YXJnZXRRdWV1ZS5wdXNoKG1ldGhvZCwgcXVldWUucHVzaCh0YXJn
ZXQsIG1ldGhvZCwgYXJncywgc3RhY2spIC0gNCk7CisgICAgfSwKKworICAgIHB1c2hVbmlxdWVX
aXRoR3VpZDogZnVuY3Rpb24gKGd1aWQsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgewor
ICAgICAgdmFyIGhhc0xvY2FsUXVldWUgPSB0aGlzLnRhcmdldFF1ZXVlc1tndWlkXTsKKworICAg
ICAgaWYgKGhhc0xvY2FsUXVldWUpIHsKKyAgICAgICAgdGhpcy50YXJnZXRRdWV1ZShoYXNMb2Nh
bFF1ZXVlLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgdGhpcy50YXJnZXRRdWV1ZXNbZ3VpZF0gPSBbbWV0aG9kLCB0aGlzLl9xdWV1ZS5wdXNo
KHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgLSA0XTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIHsKKyAgICAgICAgcXVldWU6IHRoaXMsCisgICAgICAgIHRhcmdldDogdGFyZ2V0LAorICAg
ICAgICBtZXRob2Q6IG1ldGhvZAorICAgICAgfTsKKyAgICB9LAorCisgICAgcHVzaFVuaXF1ZTog
ZnVuY3Rpb24gKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgeworICAgICAgdmFyIEtFWSA9
IHRoaXMuZ2xvYmFsT3B0aW9ucy5HVUlEX0tFWTsKKworICAgICAgaWYgKHRhcmdldCAmJiBLRVkp
IHsKKyAgICAgICAgdmFyIGd1aWQgPSB0YXJnZXRbS0VZXTsKKyAgICAgICAgaWYgKGd1aWQpIHsK
KyAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoVW5pcXVlV2l0aEd1aWQoZ3VpZCwgdGFyZ2V0LCBt
ZXRob2QsIGFyZ3MsIHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0aGlzLnB1
c2hVbmlxdWVXaXRob3V0R3VpZCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOworCisgICAg
ICByZXR1cm4geworICAgICAgICBxdWV1ZTogdGhpcywKKyAgICAgICAgdGFyZ2V0OiB0YXJnZXQs
CisgICAgICAgIG1ldGhvZDogbWV0aG9kCisgICAgICB9OworICAgIH0sCisKKyAgICBpbnZva2U6
IGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZCwgYXJncywgXywgX2Vycm9yUmVjb3JkZWRGb3JTdGFj
aykgeworICAgICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgIG1ldGhv
ZC5hcHBseSh0YXJnZXQsIGFyZ3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0aG9kLmNh
bGwodGFyZ2V0KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgaW52b2tlV2l0aE9uRXJyb3I6IGZ1
bmN0aW9uICh0YXJnZXQsIG1ldGhvZCwgYXJncywgb25FcnJvciwgZXJyb3JSZWNvcmRlZEZvclN0
YWNrKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoYXJncyAmJiBhcmdzLmxlbmd0aCA+IDAp
IHsKKyAgICAgICAgICBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmdzKTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgICB9CisgICAgICB9IGNh
dGNoIChlcnJvcikgeworICAgICAgICBvbkVycm9yKGVycm9yLCBlcnJvclJlY29yZGVkRm9yU3Rh
Y2spOworICAgICAgfQorICAgIH0sCisKKyAgICBmbHVzaDogZnVuY3Rpb24gKHN5bmMpIHsKKyAg
ICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlOworICAgICAgdmFyIGxlbmd0aCA9IHF1ZXVlLmxl
bmd0aDsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisKKyAgICAgIHZhciBnbG9iYWxPcHRpb25zID0gdGhpcy5nbG9iYWxPcHRpb25zOworICAg
ICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisgICAgICB2YXIgYmVmb3JlID0gb3B0aW9u
cyAmJiBvcHRpb25zLmJlZm9yZTsKKyAgICAgIHZhciBhZnRlciA9IG9wdGlvbnMgJiYgb3B0aW9u
cy5hZnRlcjsKKyAgICAgIHZhciBvbkVycm9yID0gZ2xvYmFsT3B0aW9ucy5vbkVycm9yIHx8IGds
b2JhbE9wdGlvbnMub25FcnJvclRhcmdldCAmJiBnbG9iYWxPcHRpb25zLm9uRXJyb3JUYXJnZXRb
Z2xvYmFsT3B0aW9ucy5vbkVycm9yTWV0aG9kXTsKKyAgICAgIHZhciB0YXJnZXQsIG1ldGhvZCwg
YXJncywgZXJyb3JSZWNvcmRlZEZvclN0YWNrOworICAgICAgdmFyIGludm9rZSA9IG9uRXJyb3Ig
PyB0aGlzLmludm9rZVdpdGhPbkVycm9yIDogdGhpcy5pbnZva2U7CisKKyAgICAgIHRoaXMudGFy
Z2V0UXVldWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICAgIHZhciBxdWV1ZUl0ZW1zID0g
dGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQgPSB0aGlzLl9xdWV1ZS5zbGljZSgpOworICAgICAgdGhp
cy5fcXVldWUgPSBbXTsKKworICAgICAgaWYgKGJlZm9yZSkgeworICAgICAgICBiZWZvcmUoKTsK
KyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewor
ICAgICAgICB0YXJnZXQgPSBxdWV1ZUl0ZW1zW2ldOworICAgICAgICBtZXRob2QgPSBxdWV1ZUl0
ZW1zW2kgKyAxXTsKKyAgICAgICAgYXJncyA9IHF1ZXVlSXRlbXNbaSArIDJdOworICAgICAgICBl
cnJvclJlY29yZGVkRm9yU3RhY2sgPSBxdWV1ZUl0ZW1zW2kgKyAzXTsgLy8gRGVidWdnaW5nIGFz
c2lzdGFuY2UKKworICAgICAgICBpZiAoX2JhY2tidXJuZXJVdGlscy5pc1N0cmluZyhtZXRob2Qp
KSB7CisgICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CisgICAgICAgIH0KKworICAg
ICAgICAvLyBtZXRob2QgY291bGQgaGF2ZSBiZWVuIG51bGxpZmllZCAvIGNhbmNlbGVkIGR1cmlu
ZyBmbHVzaAorICAgICAgICBpZiAobWV0aG9kKSB7CisgICAgICAgICAgLy8KKyAgICAgICAgICAv
LyAgICAqKiBBdHRlbnRpb24gaW50cmVwaWQgZGV2ZWxvcGVyICoqCisgICAgICAgICAgLy8KKyAg
ICAgICAgICAvLyAgICBUbyBmaW5kIG91dCB0aGUgc3RhY2sgb2YgdGhpcyB0YXNrIHdoZW4gaXQg
d2FzIHNjaGVkdWxlZCBvbnRvCisgICAgICAgICAgLy8gICAgdGhlIHJ1biBsb29wLCBhZGQgdGhl
IGZvbGxvd2luZyB0byB5b3VyIGFwcC5qczoKKyAgICAgICAgICAvLworICAgICAgICAgIC8vICAg
IEVtYmVyLnJ1bi5iYWNrYnVybmVyLkRFQlVHID0gdHJ1ZTsgLy8gTk9URTogVGhpcyBzbG93cyB5
b3VyIGFwcCwgZG9uJ3QgbGVhdmUgaXQgb24gaW4gcHJvZHVjdGlvbi4KKyAgICAgICAgICAvLwor
ICAgICAgICAgIC8vICAgIE9uY2UgdGhhdCBpcyBpbiBwbGFjZSwgd2hlbiB5b3UgYXJlIGF0IGEg
YnJlYWtwb2ludCBhbmQgbmF2aWdhdGUKKyAgICAgICAgICAvLyAgICBoZXJlIGluIHRoZSBzdGFj
ayBleHBsb3JlciwgeW91IGNhbiBsb29rIGF0IGBlcnJvclJlY29yZGVkRm9yU3RhY2suc3RhY2tg
LAorICAgICAgICAgIC8vICAgIHdoaWNoIHdpbGwgYmUgdGhlIGNhcHR1cmVkIHN0YWNrIHdoZW4g
dGhpcyBqb2Igd2FzIHNjaGVkdWxlZC4KKyAgICAgICAgICAvLworICAgICAgICAgIGludm9rZSh0
YXJnZXQsIG1ldGhvZCwgYXJncywgb25FcnJvciwgZXJyb3JSZWNvcmRlZEZvclN0YWNrKTsKKyAg
ICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYWZ0ZXIpIHsKKyAgICAgICAgYWZ0ZXIoKTsK
KyAgICAgIH0KKworICAgICAgdGhpcy5fcXVldWVCZWluZ0ZsdXNoZWQgPSB1bmRlZmluZWQ7CisK
KyAgICAgIGlmIChzeW5jICE9PSBmYWxzZSAmJiB0aGlzLl9xdWV1ZS5sZW5ndGggPiAwKSB7Cisg
ICAgICAgIC8vIGNoZWNrIGlmIG5ldyBpdGVtcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgdGhp
cy5mbHVzaCh0cnVlKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgY2FuY2VsOiBmdW5jdGlvbiAo
YWN0aW9uVG9DYW5jZWwpIHsKKyAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLAorICAgICAg
ICAgIGN1cnJlbnRUYXJnZXQsCisgICAgICAgICAgY3VycmVudE1ldGhvZCwKKyAgICAgICAgICBp
LAorICAgICAgICAgIGw7CisgICAgICB2YXIgdGFyZ2V0ID0gYWN0aW9uVG9DYW5jZWwudGFyZ2V0
OworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvblRvQ2FuY2VsLm1ldGhvZDsKKyAgICAgIHZhciBH
VUlEX0tFWSA9IHRoaXMuZ2xvYmFsT3B0aW9ucy5HVUlEX0tFWTsKKworICAgICAgaWYgKEdVSURf
S0VZICYmIHRoaXMudGFyZ2V0UXVldWVzICYmIHRhcmdldCkgeworICAgICAgICB2YXIgdGFyZ2V0
UXVldWUgPSB0aGlzLnRhcmdldFF1ZXVlc1t0YXJnZXRbR1VJRF9LRVldXTsKKworICAgICAgICBp
ZiAodGFyZ2V0UXVldWUpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGFyZ2V0UXVldWUu
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0UXVldWVbaV0gPT09
IG1ldGhvZCkgeworICAgICAgICAgICAgICB0YXJnZXRRdWV1ZS5zcGxpY2UoaSwgMSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAo
aSA9IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKKyAgICAgICAgY3VycmVu
dFRhcmdldCA9IHF1ZXVlW2ldOworICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVbaSArIDFd
OworCisgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09PSB0YXJnZXQgJiYgY3VycmVudE1ldGhv
ZCA9PT0gbWV0aG9kKSB7CisgICAgICAgICAgcXVldWUuc3BsaWNlKGksIDQpOworICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIGlmIG5vdCBmb3Vu
ZCBpbiBjdXJyZW50IHF1ZXVlCisgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUgcXVldWUgdGhhdCBp
cyBiZWluZyBmbHVzaGVkCisgICAgICBxdWV1ZSA9IHRoaXMuX3F1ZXVlQmVpbmdGbHVzaGVkOwor
CisgICAgICBpZiAoIXF1ZXVlKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAg
Zm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gNCkgeworICAgICAgICBj
dXJyZW50VGFyZ2V0ID0gcXVldWVbaV07CisgICAgICAgIGN1cnJlbnRNZXRob2QgPSBxdWV1ZVtp
ICsgMV07CisKKyAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAmJiBjdXJyZW50
TWV0aG9kID09PSBtZXRob2QpIHsKKyAgICAgICAgICAvLyBkb24ndCBtZXNzIHdpdGggYXJyYXkg
ZHVyaW5nIGZsdXNoCisgICAgICAgICAgLy8ganVzdCBudWxsaWZ5IHRoZSBtZXRob2QKKyAgICAg
ICAgICBxdWV1ZVtpICsgMV0gPSBudWxsOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2JhY2tidXJuZXIvdXRpbHMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZWFjaCA9IGVhY2g7CisgIGV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZzsKKyAg
ZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjsKKyAgZXhwb3J0cy5pc051bWJlciA9IGlz
TnVtYmVyOworICBleHBvcnRzLmlzQ29lcmNhYmxlTnVtYmVyID0gaXNDb2VyY2FibGVOdW1iZXI7
CisgIHZhciBOVU1CRVIgPSAvXGQrLzsKKworICBmdW5jdGlvbiBlYWNoKGNvbGxlY3Rpb24sIGNh
bGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsr
KSB7CisgICAgICBjYWxsYmFjayhjb2xsZWN0aW9uW2ldKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBpc1N0cmluZyhzdXNwZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBzdXNwZWN0ID09PSAn
c3RyaW5nJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oc3VzcGVjdCkgeworICAgIHJl
dHVybiB0eXBlb2Ygc3VzcGVjdCA9PT0gJ2Z1bmN0aW9uJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlz
TnVtYmVyKHN1c3BlY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIHN1c3BlY3QgPT09ICdudW1iZXIn
OworICB9CisKKyAgZnVuY3Rpb24gaXNDb2VyY2FibGVOdW1iZXIobnVtYmVyKSB7CisgICAgcmV0
dXJuIGlzTnVtYmVyKG51bWJlcikgfHwgTlVNQkVSLnRlc3QobnVtYmVyKTsKKyAgfQorfSk7Citl
bmlmZWQoJ2NvbnRhaW5lci9jb250YWluZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29y
ZScsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9kaWN0aW9uYXJ5JywgJ2VtYmVy
LW1ldGFsL2ZlYXR1cmVzJywgJ2NvbnRhaW5lci9vd25lcicsICdlbWJlci1ydW50aW1lL21peGlu
cy9jb250YWluZXJfcHJveHknLCAnZW1iZXItbWV0YWwvc3ltYm9sJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRGljdGlv
bmFyeSwgX2VtYmVyTWV0YWxGZWF0dXJlcywgX2NvbnRhaW5lck93bmVyLCBfZW1iZXJSdW50aW1l
TWl4aW5zQ29udGFpbmVyX3Byb3h5LCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgdmFyIENPTlRBSU5FUl9PVkVSUklERSA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1
bHQoJ0NPTlRBSU5FUl9PVkVSUklERScpOworCisgIC8qKgorICAgQSBjb250YWluZXIgdXNlZCB0
byBpbnN0YW50aWF0ZSBhbmQgY2FjaGUgb2JqZWN0cy4KKyAgCisgICBFdmVyeSBgQ29udGFpbmVy
YCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGBSZWdpc3RyeWAsIHdoaWNoIGlzIHJlZmVyZW5j
ZWQKKyAgIHRvIGRldGVybWluZSB0aGUgZmFjdG9yeSBhbmQgb3B0aW9ucyB0aGF0IHNob3VsZCBi
ZSB1c2VkIHRvIGluc3RhbnRpYXRlCisgICBvYmplY3RzLgorICAKKyAgIFRoZSBwdWJsaWMgQVBJ
IGZvciBgQ29udGFpbmVyYCBpcyBzdGlsbCBpbiBmbHV4IGFuZCBzaG91bGQgbm90IGJlIGNvbnNp
ZGVyZWQKKyAgIHN0YWJsZS4KKyAgCisgICBAcHJpdmF0ZQorICAgQGNsYXNzIENvbnRhaW5lcgor
ICAgKi8KKyAgZnVuY3Rpb24gQ29udGFpbmVyKHJlZ2lzdHJ5LCBvcHRpb25zKSB7CisgICAgdGhp
cy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OworICAgIHRoaXMub3duZXIgPSBvcHRpb25zICYmIG9wdGlv
bnMub3duZXIgPyBvcHRpb25zLm93bmVyIDogbnVsbDsKKyAgICB0aGlzLmNhY2hlID0gX2VtYmVy
TWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQob3B0aW9ucyAmJiBvcHRpb25zLmNhY2hlID8gb3B0aW9u
cy5jYWNoZSA6IG51bGwpOworICAgIHRoaXMuZmFjdG9yeUNhY2hlID0gX2VtYmVyTWV0YWxEaWN0
aW9uYXJ5LmRlZmF1bHQob3B0aW9ucyAmJiBvcHRpb25zLmZhY3RvcnlDYWNoZSA/IG9wdGlvbnMu
ZmFjdG9yeUNhY2hlIDogbnVsbCk7CisgICAgdGhpcy52YWxpZGF0aW9uQ2FjaGUgPSBfZW1iZXJN
ZXRhbERpY3Rpb25hcnkuZGVmYXVsdChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGlvbkNhY2hl
ID8gb3B0aW9ucy52YWxpZGF0aW9uQ2FjaGUgOiBudWxsKTsKKyAgICB0aGlzLl9mYWtlQ29udGFp
bmVyVG9JbmplY3QgPSBfZW1iZXJSdW50aW1lTWl4aW5zQ29udGFpbmVyX3Byb3h5LmJ1aWxkRmFr
ZUNvbnRhaW5lcldpdGhEZXByZWNhdGlvbnModGhpcyk7CisgICAgdGhpc1tDT05UQUlORVJfT1ZF
UlJJREVdID0gdW5kZWZpbmVkOworICB9CisKKyAgQ29udGFpbmVyLnByb3RvdHlwZSA9IHsKKyAg
ICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgQHByb3BlcnR5IG93bmVyCisgICAgIEB0eXBlIE9i
amVjdAorICAgICAqLworICAgIG93bmVyOiBudWxsLAorCisgICAgLyoqCisgICAgIEBwcml2YXRl
CisgICAgIEBwcm9wZXJ0eSByZWdpc3RyeQorICAgICBAdHlwZSBSZWdpc3RyeQorICAgICBAc2lu
Y2UgMS4xMS4wCisgICAgICovCisgICAgcmVnaXN0cnk6IG51bGwsCisKKyAgICAvKioKKyAgICAg
QHByaXZhdGUKKyAgICAgQHByb3BlcnR5IGNhY2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0
CisgICAgICovCisgICAgY2FjaGU6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAg
ICAgQHByb3BlcnR5IGZhY3RvcnlDYWNoZQorICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAg
ICAqLworICAgIGZhY3RvcnlDYWNoZTogbnVsbCwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQor
ICAgICBAcHJvcGVydHkgdmFsaWRhdGlvbkNhY2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0
CisgICAgICovCisgICAgdmFsaWRhdGlvbkNhY2hlOiBudWxsLAorCisgICAgLyoqCisgICAgIEdp
dmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbnN0YW5jZS4KKyAgICAgIFRo
ZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBmb3IgbG9va3VwIHRvIHJldHVybiBhIHNpbmdsZXRvbiBp
bnN0YW5jZS4KKyAgICAgVGhlIHNpbmdsZXRvbiBpcyBzY29wZWQgdG8gdGhlIGNvbnRhaW5lciwg
YWxsb3dpbmcgbXVsdGlwbGUgY29udGFpbmVycworICAgICB0byBhbGwgaGF2ZSB0aGVpciBvd24g
bG9jYWxseSBzY29wZWQgc2luZ2xldG9ucy4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFy
IHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHZhciBjb250YWluZXIgPSByZWdpc3Ry
eS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3
aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicpOworICAgICAgdHdpdHRlciBpbnN0YW5jZW9mIFR3aXR0ZXI7IC8vID0+IHRydWUKKyAgICAg
IC8vIGJ5IGRlZmF1bHQgdGhlIGNvbnRhaW5lciB3aWxsIHJldHVybiBzaW5nbGV0b25zCisgICAg
IHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJyk7CisgICAgIHR3
aXR0ZXIyIGluc3RhbmNlb2YgVHdpdHRlcjsgLy8gPT4gdHJ1ZQorICAgICAgdHdpdHRlciA9PT0g
dHdpdHRlcjI7IC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIElmIHNpbmdsZXRvbnMgYXJlIG5v
dCB3YW50ZWQsIGFuIG9wdGlvbmFsIGZsYWcgY2FuIGJlIHByb3ZpZGVkIGF0IGxvb2t1cC4KKyAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7Cisg
ICAgIHZhciBjb250YWluZXIgPSByZWdpc3RyeS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBj
b250YWluZXIubG9va3VwKCdhcGk6dHdpdHRlcicsIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAg
ICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmds
ZXRvbjogZmFsc2UgfSk7CisgICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsgLy89PiBmYWxzZQor
ICAgICBgYGAKKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgbG9va3VwCisgICAgIEBwYXJh
bSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCisgICAg
IEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VdIFRoZSBmdWxsbmFtZSBvZiB0aGUgcmVx
dWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxvb2t1cCkKKyAgICAgQHJldHVybiB7YW55fQor
ICAgICAqLworICAgIGxvb2t1cDogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRpb25zKSB7CisgICAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnZnVsbE5hbWUgbXVzdCBiZSBhIHByb3BlciBmdWxs
IG5hbWUnLCB0aGlzLnJlZ2lzdHJ5LnZhbGlkYXRlRnVsbE5hbWUoZnVsbE5hbWUpKTsKKyAgICAg
IHJldHVybiBsb29rdXAodGhpcywgdGhpcy5yZWdpc3RyeS5ub3JtYWxpemUoZnVsbE5hbWUpLCBv
cHRpb25zKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIEdpdmVuIGEgZnVsbE5hbWUsIHJldHVy
biB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhv
ZCBsb29rdXBGYWN0b3J5CisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFy
YW0ge09iamVjdH0gW29wdGlvbnNdCisgICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3Vy
Y2VdIFRoZSBmdWxsbmFtZSBvZiB0aGUgcmVxdWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxv
b2t1cCkKKyAgICAgQHJldHVybiB7YW55fQorICAgICAqLworICAgIGxvb2t1cEZhY3Rvcnk6IGZ1
bmN0aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3Nl
cnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy5yZWdpc3RyeS52
YWxpZGF0ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisgICAgICByZXR1cm4gZmFjdG9yeUZvcih0aGlz
LCB0aGlzLnJlZ2lzdHJ5Lm5vcm1hbGl6ZShmdWxsTmFtZSksIG9wdGlvbnMpOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgQSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGRlc3Ryb3lpbmcgdGhlIGNv
bnRhaW5lciwgaXRzIGRlc2NlbmRhbnQgY29udGFpbmVycyBhbmQgYWxsCisgICAgIHRoZWlyIG1h
bmFnZWQgb2JqZWN0cy4KKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgZGVzdHJveQorICAg
ICAqLworICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGVhY2hEZXN0cm95YWJsZSh0
aGlzLCBmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5kZXN0cm95KSB7CisgICAg
ICAgICAgaXRlbS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICB0aGlz
LmlzRGVzdHJveWVkID0gdHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIENsZWFyIGVpdGhl
ciB0aGUgZW50aXJlIGNhY2hlIG9yIGp1c3QgdGhlIGNhY2hlIGZvciBhIHBhcnRpY3VsYXIga2V5
LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCByZXNldAorICAgICBAcGFyYW0ge1N0cmlu
Z30gZnVsbE5hbWUgb3B0aW9uYWwga2V5IHRvIHJlc2V0OyBpZiBtaXNzaW5nLCByZXNldHMgZXZl
cnl0aGluZworICAgICAqLworICAgIHJlc2V0OiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICByZXNldE1lbWJlcih0aGlzLCB0
aGlzLnJlZ2lzdHJ5Lm5vcm1hbGl6ZShmdWxsTmFtZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmVzZXRDYWNoZSh0aGlzKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgIFJl
dHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBvd25lciB0byBh
CisgICAgIG1hbnVhbGx5IGNyZWF0ZWQgaW5zdGFuY2UuCisgICAgICBAcHJpdmF0ZQorICAgICBA
bWV0aG9kIG93bmVySW5qZWN0aW9uCisgICAgIEByZXR1cm5zIHsgT2JqZWN0IH0KKyAgICAqLwor
ICAgIG93bmVySW5qZWN0aW9uOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3JlZjsKKworICAg
ICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltfY29udGFpbmVyT3duZXIuT1dORVJdID0gdGhpcy5v
d25lciwgX3JlZjsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gaXNTaW5nbGV0b24oY29udGFp
bmVyLCBmdWxsTmFtZSkgeworICAgIHJldHVybiBjb250YWluZXIucmVnaXN0cnkuZ2V0T3B0aW9u
KGZ1bGxOYW1lLCAnc2luZ2xldG9uJykgIT09IGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gbG9v
a3VwKGNvbnRhaW5lciwgZnVsbE5hbWUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5s
ZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRz
WzJdOworCisgICAgaWYgKG9wdGlvbnMuc291cmNlKSB7CisgICAgICBmdWxsTmFtZSA9IGNvbnRh
aW5lci5yZWdpc3RyeS5leHBhbmRMb2NhbExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucyk7CisKKyAg
ICAgIC8vIGlmIGV4cGFuZExvY2FsTG9va3VwIHJldHVybnMgZmFsc2V5LCB3ZSBkbyBub3Qgc3Vw
cG9ydCBsb2NhbCBsb29rdXAKKyAgICAgIGlmICghZnVsbE5hbWUpIHsKKyAgICAgICAgcmV0dXJu
OworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb250YWluZXIuY2FjaGVbZnVsbE5hbWVdICE9
PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zaW5nbGV0b24gIT09IGZhbHNlKSB7CisgICAgICByZXR1
cm4gY29udGFpbmVyLmNhY2hlW2Z1bGxOYW1lXTsKKyAgICB9CisKKyAgICB2YXIgdmFsdWUgPSBp
bnN0YW50aWF0ZShjb250YWluZXIsIGZ1bGxOYW1lKTsKKworICAgIGlmICh2YWx1ZSA9PT0gdW5k
ZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzU2luZ2xldG9uKGNv
bnRhaW5lciwgZnVsbE5hbWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBmYWxzZSkgeworICAg
ICAgY29udGFpbmVyLmNhY2hlW2Z1bGxOYW1lXSA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVy
biB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIG1hcmtJbmplY3Rpb25zQXNEeW5hbWljKGluamVj
dGlvbnMpIHsKKyAgICBpbmplY3Rpb25zLl9keW5hbWljID0gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGFyZUluamVjdGlvbnNEeW5hbWljKGluamVjdGlvbnMpIHsKKyAgICByZXR1cm4gISFpbmpl
Y3Rpb25zLl9keW5hbWljOworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRJbmplY3Rpb25zKCkgLyog
Y29udGFpbmVyLCAuLi5pbmplY3Rpb25zICoveworICAgIHZhciBoYXNoID0ge307CisKKyAgICBp
ZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKyAgICAgIHZhciBjb250YWluZXIgPSBhcmd1bWVu
dHNbMF07CisgICAgICB2YXIgaW5qZWN0aW9ucyA9IFtdOworICAgICAgdmFyIGluamVjdGlvbjsK
KworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICAgIGlmIChhcmd1bWVudHNbaV0pIHsKKyAgICAgICAgICBpbmplY3Rpb25zID0g
aW5qZWN0aW9ucy5jb25jYXQoYXJndW1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorCisg
ICAgICBjb250YWluZXIucmVnaXN0cnkudmFsaWRhdGVJbmplY3Rpb25zKGluamVjdGlvbnMpOwor
CisgICAgICBmb3IgKGkgPSAwLCBsID0gaW5qZWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgICAgaW5qZWN0aW9uID0gaW5qZWN0aW9uc1tpXTsKKyAgICAgICAgaGFzaFtpbmplY3Rp
b24ucHJvcGVydHldID0gbG9va3VwKGNvbnRhaW5lciwgaW5qZWN0aW9uLmZ1bGxOYW1lKTsKKyAg
ICAgICAgaWYgKCFpc1NpbmdsZXRvbihjb250YWluZXIsIGluamVjdGlvbi5mdWxsTmFtZSkpIHsK
KyAgICAgICAgICBtYXJrSW5qZWN0aW9uc0FzRHluYW1pYyhoYXNoKTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgZnVuY3Rpb24gZmFjdG9y
eUZvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMu
bGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50
c1syXTsKKworICAgIHZhciByZWdpc3RyeSA9IGNvbnRhaW5lci5yZWdpc3RyeTsKKworICAgIGlm
IChvcHRpb25zLnNvdXJjZSkgeworICAgICAgZnVsbE5hbWUgPSByZWdpc3RyeS5leHBhbmRMb2Nh
bExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucyk7CisKKyAgICAgIC8vIGlmIGV4cGFuZExvY2FsTG9v
a3VwIHJldHVybnMgZmFsc2V5LCB3ZSBkbyBub3Qgc3VwcG9ydCBsb2NhbCBsb29rdXAKKyAgICAg
IGlmICghZnVsbE5hbWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAg
IHZhciBjYWNoZSA9IGNvbnRhaW5lci5mYWN0b3J5Q2FjaGU7CisgICAgaWYgKGNhY2hlW2Z1bGxO
YW1lXSkgeworICAgICAgcmV0dXJuIGNhY2hlW2Z1bGxOYW1lXTsKKyAgICB9CisgICAgdmFyIGZh
Y3RvcnkgPSByZWdpc3RyeS5yZXNvbHZlKGZ1bGxOYW1lKTsKKyAgICBpZiAoZmFjdG9yeSA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHR5cGUgPSBmdWxs
TmFtZS5zcGxpdCgnOicpWzBdOworICAgIGlmICghZmFjdG9yeSB8fCB0eXBlb2YgZmFjdG9yeS5l
eHRlbmQgIT09ICdmdW5jdGlvbicgfHwgIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1PREVMX0ZB
Q1RPUllfSU5KRUNUSU9OUyAmJiB0eXBlID09PSAnbW9kZWwnKSB7CisgICAgICBpZiAoZmFjdG9y
eSAmJiB0eXBlb2YgZmFjdG9yeS5fb25Mb29rdXAgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAg
ZmFjdG9yeS5fb25Mb29rdXAoZnVsbE5hbWUpOworICAgICAgfQorCisgICAgICAvLyBUT0RPOiB0
aGluayBhYm91dCBhICdzYWZlJyBtZXJnZSBzdHlsZSBleHRlbnNpb24KKyAgICAgIC8vIGZvciBu
b3cganVzdCBmYWxsYmFjayB0byBjcmVhdGUgdGltZSBpbmplY3Rpb24KKyAgICAgIGNhY2hlW2Z1
bGxOYW1lXSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9IGVsc2Ugewor
ICAgICAgdmFyIGluamVjdGlvbnMgPSBpbmplY3Rpb25zRm9yKGNvbnRhaW5lciwgZnVsbE5hbWUp
OworICAgICAgdmFyIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVjdGlvbnNGb3IoY29u
dGFpbmVyLCBmdWxsTmFtZSk7CisgICAgICB2YXIgY2FjaGVhYmxlID0gIWFyZUluamVjdGlvbnNE
eW5hbWljKGluamVjdGlvbnMpICYmICFhcmVJbmplY3Rpb25zRHluYW1pYyhmYWN0b3J5SW5qZWN0
aW9ucyk7CisKKyAgICAgIGZhY3RvcnlJbmplY3Rpb25zLl90b1N0cmluZyA9IHJlZ2lzdHJ5Lm1h
a2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7CisKKyAgICAgIHZhciBpbmplY3RlZEZhY3Rv
cnkgPSBmYWN0b3J5LmV4dGVuZChpbmplY3Rpb25zKTsKKworICAgICAgLy8gVE9ETyAtIHJlbW92
ZSBhbGwgYGNvbnRhaW5lcmAgaW5qZWN0aW9ucyB3aGVuIEVtYmVyIHJlYWNoZXMgdjMuMC4wCisg
ICAgICBpbmplY3REZXByZWNhdGVkQ29udGFpbmVyKGluamVjdGVkRmFjdG9yeS5wcm90b3R5cGUs
IGNvbnRhaW5lcik7CisgICAgICBpbmplY3RlZEZhY3RvcnkucmVvcGVuQ2xhc3MoZmFjdG9yeUlu
amVjdGlvbnMpOworCisgICAgICBpZiAoZmFjdG9yeSAmJiB0eXBlb2YgZmFjdG9yeS5fb25Mb29r
dXAgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgZmFjdG9yeS5fb25Mb29rdXAoZnVsbE5hbWUp
OworICAgICAgfQorCisgICAgICBpZiAoY2FjaGVhYmxlKSB7CisgICAgICAgIGNhY2hlW2Z1bGxO
YW1lXSA9IGluamVjdGVkRmFjdG9yeTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGluamVjdGVk
RmFjdG9yeTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbmplY3Rpb25zRm9yKGNvbnRhaW5l
ciwgZnVsbE5hbWUpIHsKKyAgICB2YXIgcmVnaXN0cnkgPSBjb250YWluZXIucmVnaXN0cnk7Cisg
ICAgdmFyIHNwbGl0TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCc6Jyk7CisgICAgdmFyIHR5cGUgPSBz
cGxpdE5hbWVbMF07CisKKyAgICB2YXIgaW5qZWN0aW9ucyA9IGJ1aWxkSW5qZWN0aW9ucyhjb250
YWluZXIsIHJlZ2lzdHJ5LmdldFR5cGVJbmplY3Rpb25zKHR5cGUpLCByZWdpc3RyeS5nZXRJbmpl
Y3Rpb25zKGZ1bGxOYW1lKSk7CisgICAgaW5qZWN0aW9ucy5fZGVidWdDb250YWluZXJLZXkgPSBm
dWxsTmFtZTsKKworICAgIF9jb250YWluZXJPd25lci5zZXRPd25lcihpbmplY3Rpb25zLCBjb250
YWluZXIub3duZXIpOworCisgICAgcmV0dXJuIGluamVjdGlvbnM7CisgIH0KKworICBmdW5jdGlv
biBmYWN0b3J5SW5qZWN0aW9uc0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIHJl
Z2lzdHJ5ID0gY29udGFpbmVyLnJlZ2lzdHJ5OworICAgIHZhciBzcGxpdE5hbWUgPSBmdWxsTmFt
ZS5zcGxpdCgnOicpOworICAgIHZhciB0eXBlID0gc3BsaXROYW1lWzBdOworCisgICAgdmFyIGZh
Y3RvcnlJbmplY3Rpb25zID0gYnVpbGRJbmplY3Rpb25zKGNvbnRhaW5lciwgcmVnaXN0cnkuZ2V0
RmFjdG9yeVR5cGVJbmplY3Rpb25zKHR5cGUpLCByZWdpc3RyeS5nZXRGYWN0b3J5SW5qZWN0aW9u
cyhmdWxsTmFtZSkpOworICAgIGZhY3RvcnlJbmplY3Rpb25zLl9kZWJ1Z0NvbnRhaW5lcktleSA9
IGZ1bGxOYW1lOworCisgICAgcmV0dXJuIGZhY3RvcnlJbmplY3Rpb25zOworICB9CisKKyAgZnVu
Y3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxsTmFtZSkgeworICAgIHZhciBmYWN0b3J5
ID0gZmFjdG9yeUZvcihjb250YWluZXIsIGZ1bGxOYW1lKTsKKyAgICB2YXIgbGF6eUluamVjdGlv
bnMsIHZhbGlkYXRpb25DYWNoZTsKKworICAgIGlmIChjb250YWluZXIucmVnaXN0cnkuZ2V0T3B0
aW9uKGZ1bGxOYW1lLCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHsKKyAgICAgIHJldHVybiBm
YWN0b3J5OworICAgIH0KKworICAgIGlmIChmYWN0b3J5KSB7CisgICAgICBpZiAodHlwZW9mIGZh
Y3RvcnkuY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcign
RmFpbGVkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBcJycgKyBmdWxsTmFtZSArICdcJy4gJyAr
ICdNb3N0IGxpa2VseSBhbiBpbXByb3Blcmx5IGRlZmluZWQgY2xhc3Mgb3IgYW4gaW52YWxpZCBt
b2R1bGUgZXhwb3J0LicpOworICAgICAgfQorCisgICAgICB2YWxpZGF0aW9uQ2FjaGUgPSBjb250
YWluZXIudmFsaWRhdGlvbkNhY2hlOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLnJ1bkluRGVi
dWcoZnVuY3Rpb24gKCkgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgbGF6eSBpbmplY3Rp
b25zIGFyZSB2YWxpZCBhdCBpbnN0YW50aWF0aW9uIHRpbWUKKyAgICAgICAgaWYgKCF2YWxpZGF0
aW9uQ2FjaGVbZnVsbE5hbWVdICYmIHR5cGVvZiBmYWN0b3J5Ll9sYXp5SW5qZWN0aW9ucyA9PT0g
J2Z1bmN0aW9uJykgeworICAgICAgICAgIGxhenlJbmplY3Rpb25zID0gZmFjdG9yeS5fbGF6eUlu
amVjdGlvbnMoKTsKKyAgICAgICAgICBsYXp5SW5qZWN0aW9ucyA9IGNvbnRhaW5lci5yZWdpc3Ry
eS5ub3JtYWxpemVJbmplY3Rpb25zSGFzaChsYXp5SW5qZWN0aW9ucyk7CisKKyAgICAgICAgICBj
b250YWluZXIucmVnaXN0cnkudmFsaWRhdGVJbmplY3Rpb25zKGxhenlJbmplY3Rpb25zKTsKKyAg
ICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHZhbGlkYXRpb25DYWNoZVtmdWxsTmFtZV0gPSB0
cnVlOworCisgICAgICB2YXIgb2JqID0gdW5kZWZpbmVkOworCisgICAgICBpZiAodHlwZW9mIGZh
Y3RvcnkuZXh0ZW5kID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFj
dG9yeSB3YXMgZXh0ZW5kYWJsZSBhbmQgaXMgYWxyZWFkeSBpbmplY3RlZAorICAgICAgICBvYmog
PSBmYWN0b3J5LmNyZWF0ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gYXNzdW1lIHRo
ZSBmYWN0b3J5IHdhcyBleHRlbmRhYmxlCisgICAgICAgIC8vIHRvIGNyZWF0ZSB0aW1lIGluamVj
dGlvbnMKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBuZXcnaW5nIGZvciBpbnN0YW50aWF0aW9u
IGFuZCBtZXJnZSBpbmplY3Rpb25zIGZvciBwdXJlIEpTIEZ1bmN0aW9ucworICAgICAgICB2YXIg
aW5qZWN0aW9ucyA9IGluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSk7CisKKyAgICAg
ICAgLy8gRW5zdXJlIHRoYXQgYSBjb250YWluZXIgaXMgYXZhaWxhYmxlIHRvIGFuIG9iamVjdCBk
dXJpbmcgaW5zdGFudGlhdGlvbi4KKyAgICAgICAgLy8gVE9ETyAtIHJlbW92ZSB3aGVuIEVtYmVy
IHJlYWNoZXMgdjMuMC4wCisgICAgICAgIC8vIFRoaXMgImZha2UiIGNvbnRhaW5lciB3aWxsIGJl
IHJlcGxhY2VkIGFmdGVyIGluc3RhbnRpYXRpb24gd2l0aCBhCisgICAgICAgIC8vIHByb3BlcnR5
IHRoYXQgcmFpc2VzIGRlcHJlY2F0aW9ucyBldmVyeSB0aW1lIGl0IGlzIGFjY2Vzc2VkLgorICAg
ICAgICBpbmplY3Rpb25zLmNvbnRhaW5lciA9IGNvbnRhaW5lci5fZmFrZUNvbnRhaW5lclRvSW5q
ZWN0OworICAgICAgICBvYmogPSBmYWN0b3J5LmNyZWF0ZShpbmplY3Rpb25zKTsKKworICAgICAg
ICAvLyBUT0RPIC0gcmVtb3ZlIHdoZW4gRW1iZXIgcmVhY2hlcyB2My4wLjAKKyAgICAgICAgaWYg
KCFPYmplY3QuaXNGcm96ZW4ob2JqKSAmJiAnY29udGFpbmVyJyBpbiBvYmopIHsKKyAgICAgICAg
ICBpbmplY3REZXByZWNhdGVkQ29udGFpbmVyKG9iaiwgY29udGFpbmVyKTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICByZXR1cm4gb2JqOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8gLSBy
ZW1vdmUgd2hlbiBFbWJlciByZWFjaGVzIHYzLjAuMAorICBmdW5jdGlvbiBpbmplY3REZXByZWNh
dGVkQ29udGFpbmVyKG9iamVjdCwgY29udGFpbmVyKSB7CisgICAgT2JqZWN0LmRlZmluZVByb3Bl
cnR5KG9iamVjdCwgJ2NvbnRhaW5lcicsIHsKKyAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAg
ICAgIGVudW1lcmFibGU6IGZhbHNlLAorICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAg
IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyB0aGUgaW5qZWN0ZWQgYGNvbnRhaW5l
cmAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgYGdldE93bmVyYCBoZWxwZXIgaW5zdGVh
ZCB0byBhY2Nlc3MgdGhlIG93bmVyIG9mIHRoaXMgb2JqZWN0LicsIGZhbHNlLCB7IGlkOiAnZW1i
ZXItYXBwbGljYXRpb24uaW5qZWN0ZWQtY29udGFpbmVyJywgdW50aWw6ICczLjAuMCcsIHVybDog
J2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueCN0b2NfaW5qZWN0ZWQtY29udGFp
bmVyLWFjY2VzcycgfSk7CisgICAgICAgIHJldHVybiB0aGlzW0NPTlRBSU5FUl9PVkVSUklERV0g
fHwgY29udGFpbmVyOworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Byb3ZpZGluZyB0aGUgYGNvbnRh
aW5lcmAgcHJvcGVydHkgdG8gJyArIHRoaXMgKyAnIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ug
YEVtYmVyLnNldE93bmVyYCBvciBgb3duZXIub3duZXJJbmplY3Rpb24oKWAgaW5zdGVhZCB0byBw
cm92aWRlIGFuIG93bmVyIHRvIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkLicsIGZhbHNlLCB7
IGlkOiAnZW1iZXItYXBwbGljYXRpb24uaW5qZWN0ZWQtY29udGFpbmVyJywgdW50aWw6ICczLjAu
MCcsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueCN0b2NfaW5qZWN0
ZWQtY29udGFpbmVyLWFjY2VzcycgfSk7CisKKyAgICAgICAgdGhpc1tDT05UQUlORVJfT1ZFUlJJ
REVdID0gdmFsdWU7CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pOwor
ICB9CisKKyAgZnVuY3Rpb24gZWFjaERlc3Ryb3lhYmxlKGNvbnRhaW5lciwgY2FsbGJhY2spIHsK
KyAgICB2YXIgY2FjaGUgPSBjb250YWluZXIuY2FjaGU7CisgICAgdmFyIGtleXMgPSBPYmplY3Qu
a2V5cyhjYWNoZSk7CisgICAgdmFyIGtleSwgdmFsdWU7CisKKyAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBrZXkgPSBrZXlzW2ldOworICAg
ICAgdmFsdWUgPSBjYWNoZVtrZXldOworCisgICAgICBpZiAoY29udGFpbmVyLnJlZ2lzdHJ5Lmdl
dE9wdGlvbihrZXksICdpbnN0YW50aWF0ZScpICE9PSBmYWxzZSkgeworICAgICAgICBjYWxsYmFj
ayh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVzZXRDYWNoZShj
b250YWluZXIpIHsKKyAgICBlYWNoRGVzdHJveWFibGUoY29udGFpbmVyLCBmdW5jdGlvbiAodmFs
dWUpIHsKKyAgICAgIGlmICh2YWx1ZS5kZXN0cm95KSB7CisgICAgICAgIHZhbHVlLmRlc3Ryb3ko
KTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGNvbnRhaW5lci5jYWNoZS5kaWN0ID0gX2VtYmVy
TWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQobnVsbCk7CisgIH0KKworICBmdW5jdGlvbiByZXNldE1l
bWJlcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CisgICAgdmFyIG1lbWJlciA9IGNvbnRhaW5lci5j
YWNoZVtmdWxsTmFtZV07CisKKyAgICBkZWxldGUgY29udGFpbmVyLmZhY3RvcnlDYWNoZVtmdWxs
TmFtZV07CisKKyAgICBpZiAobWVtYmVyKSB7CisgICAgICBkZWxldGUgY29udGFpbmVyLmNhY2hl
W2Z1bGxOYW1lXTsKKworICAgICAgaWYgKG1lbWJlci5kZXN0cm95KSB7CisgICAgICAgIG1lbWJl
ci5kZXN0cm95KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
Q29udGFpbmVyOworfSk7CitlbmlmZWQoJ2NvbnRhaW5lci9pbmRleCcsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jb3JlJywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdjb250YWluZXIvY29udGFp
bmVyJywgJ2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxD
b3JlLCBfY29udGFpbmVyUmVnaXN0cnksIF9jb250YWluZXJDb250YWluZXIsIF9jb250YWluZXJP
d25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoKKyAgUHVibGljIEFQSSBmb3IgdGhlIGNv
bnRhaW5lciBpcyBzdGlsbCBpbiBmbHV4LgorICBUaGUgcHVibGljIEFQSSwgc3BlY2lmaWVkIG9u
IHRoZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhlIHN0YWJs
ZSBBUEkuCisgIC8vIEBtb2R1bGUgY29udGFpbmVyCisgICAgQHByaXZhdGUKKyAgKi8KKworICAv
KgorICAgRmxhZyB0byBlbmFibGUvZGlzYWJsZSBtb2RlbCBmYWN0b3J5IGluamVjdGlvbnMgKGRp
c2FibGVkIGJ5IGRlZmF1bHQpLgorICAgSWYgbW9kZWwgZmFjdG9yeSBpbmplY3Rpb25zIGFyZSBl
bmFibGVkLCBtb2RlbHMgc2hvdWxkIG5vdCBiZQorICAgYWNjZXNzZWQgZ2xvYmFsbHkgKG9ubHkg
dGhyb3VnaCBgY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOm1vZGVsTmFtZScpKWApOwor
ICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMg
PSBmYWxzZTsKKworICBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WICYmIHR5cGVvZiBf
ZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FTlYuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TICE9PSAn
dW5kZWZpbmVkJykgeworICAgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1PREVMX0ZBQ1RPUllf
SU5KRUNUSU9OUyA9ICEhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WLk1PREVMX0ZBQ1RPUllf
SU5KRUNUSU9OUzsKKyAgfQorCisgIGV4cG9ydHMuUmVnaXN0cnkgPSBfY29udGFpbmVyUmVnaXN0
cnkuZGVmYXVsdDsKKyAgZXhwb3J0cy5Db250YWluZXIgPSBfY29udGFpbmVyQ29udGFpbmVyLmRl
ZmF1bHQ7CisgIGV4cG9ydHMuZ2V0T3duZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXI7Cisg
IGV4cG9ydHMuc2V0T3duZXIgPSBfY29udGFpbmVyT3duZXIuc2V0T3duZXI7Cit9KTsKK2VuaWZl
ZCgnY29udGFpbmVyL293bmVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTeW1ib2wpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHMuZ2V0T3duZXIgPSBnZXRPd25lcjsKKyAgZXhwb3J0cy5zZXRPd25lciA9
IHNldE93bmVyOworICB2YXIgT1dORVIgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdPV05F
UicpOworCisgIGV4cG9ydHMuT1dORVIgPSBPV05FUjsKKyAgLyoqCisgICAgRnJhbWV3b3JrIG9i
amVjdHMgaW4gYW4gRW1iZXIgYXBwbGljYXRpb24gKGNvbXBvbmVudHMsIHNlcnZpY2VzLCByb3V0
ZXMsIGV0Yy4pCisgICAgYXJlIGNyZWF0ZWQgdmlhIGEgZmFjdG9yeSBhbmQgZGVwZW5kZW5jeSBp
bmplY3Rpb24gc3lzdGVtLiBFYWNoIG9mIHRoZXNlCisgICAgb2JqZWN0cyBpcyB0aGUgcmVzcG9u
c2liaWxpdHkgb2YgYW4gIm93bmVyIiwgd2hpY2ggaGFuZGxlZCBpdHMKKyAgICBpbnN0YW50aWF0
aW9uIGFuZCBtYW5hZ2VzIGl0cyBsaWZldGltZS4KKyAgCisgICAgYGdldE93bmVyYCBmZXRjaGVz
IHRoZSBvd25lciBvYmplY3QgcmVzcG9uc2libGUgZm9yIGFuIGluc3RhbmNlLiBUaGlzIGNhbgor
ICAgIGJlIHVzZWQgdG8gbG9va3VwIG9yIHJlc29sdmUgb3RoZXIgY2xhc3MgaW5zdGFuY2VzLCBv
ciByZWdpc3RlciBuZXcgZmFjdG9yaWVzCisgICAgaW50byB0aGUgb3duZXIuCisgIAorICAgIEZv
ciBleGFtcGxlLCB0aGlzIGNvbXBvbmVudCBkeW5hbWljYWxseSBsb29rcyB1cCBhIHNlcnZpY2Ug
YmFzZWQgb24gdGhlCisgICAgYGF1ZGlvVHlwZWAgcGFzc2VkIGFzIGFuIGF0dHJpYnV0ZToKKyAg
CisgICAgYGBgCisgICAgLy8gYXBwL2NvbXBvbmVudHMvcGxheS1hdWRpby5qcworICAgIGltcG9y
dCBFbWJlciBmcm9tICdlbWJlcic7CisgIAorICAgIC8vIFVzYWdlOgorICAgIC8vCisgICAgLy8g
ICB7e3BsYXktYXVkaW8gYXVkaW9UeXBlPW1vZGVsLmF1ZGlvVHlwZSBhdWRpb0ZpbGU9bW9kZWwu
ZmlsZX19CisgICAgLy8KKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0ZW5k
KHsKKyAgICAgIGF1ZGlvU2VydmljZTogRW1iZXIuY29tcHV0ZWQoJ2F1ZGlvVHlwZScsIGZ1bmN0
aW9uKCkgeworICAgICAgICBsZXQgb3duZXIgPSBFbWJlci5nZXRPd25lcih0aGlzKTsKKyAgICAg
ICAgcmV0dXJuIG93bmVyLmxvb2t1cChgc2VydmljZToke3RoaXMuZ2V0KCdhdWRpb1R5cGUnKX1g
KTsKKyAgICAgIH0pLAorICAgICAgY2xpY2soKSB7CisgICAgICAgIGxldCBwbGF5ZXIgPSB0aGlz
LmdldCgnYXVkaW9TZXJ2aWNlJyk7CisgICAgICAgIHBsYXllci5wbGF5KHRoaXMuZ2V0KCdhdWRp
b0ZpbGUnKSk7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZ2V0
T3duZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IEFuIG9iamVjdCB3aXRoIGFuIG93bmVy
LgorICAgIEByZXR1cm4ge09iamVjdH0gQW4gb3duZXIgb2JqZWN0LgorICAgIEBmb3IgRW1iZXIK
KyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZ2V0T3duZXIob2JqZWN0KSB7CisgICAg
cmV0dXJuIG9iamVjdFtPV05FUl07CisgIH0KKworICAvKioKKyAgICBgc2V0T3duZXJgIGZvcmNl
cyBhIG5ldyBvd25lciBvbiBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZS4gVGhpcyBpcyBwcmltYXJp
bHkKKyAgICB1c2VmdWwgaW4gc29tZSB0ZXN0aW5nIGNhc2VzLgorICAKKyAgICBAbWV0aG9kIHNl
dE93bmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBBbiBvYmplY3Qgd2l0aCBhbiBvd25l
ci4KKyAgICBAcmV0dXJuIHtPYmplY3R9IEFuIG93bmVyIG9iamVjdC4KKyAgICBAZm9yIEVtYmVy
CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNldE93bmVyKG9iamVjdCwgb3duZXIp
IHsKKyAgICBvYmplY3RbT1dORVJdID0gb3duZXI7CisgIH0KK30pOworZW5pZmVkKCdjb250YWlu
ZXIvcmVnaXN0cnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXIt
bWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZGljdGlvbmFyeScsICdlbWJlci1tZXRhbC9lbXB0
eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2NvbnRhaW5lci9jb250YWluZXInLCAn
ZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVy
ZXMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRGljdGlvbmFyeSwgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QsIF9lbWJlck1ldGFsQXNzaWduLCBfY29udGFpbmVyQ29udGFpbmVyLCBfZW1i
ZXJNZXRhbFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnByaXZhdGl6ZSA9
IHByaXZhdGl6ZTsKKworICB2YXIgVkFMSURfRlVMTF9OQU1FX1JFR0VYUCA9IC9eW146XSs6W146
XSskLzsKKworICAvKioKKyAgIEEgcmVnaXN0cnkgdXNlZCB0byBzdG9yZSBmYWN0b3J5IGFuZCBv
cHRpb24gaW5mb3JtYXRpb24ga2V5ZWQKKyAgIGJ5IHR5cGUuCisgIAorICAgQSBgUmVnaXN0cnlg
IHN0b3JlcyB0aGUgZmFjdG9yeSBhbmQgb3B0aW9uIGluZm9ybWF0aW9uIG5lZWRlZCBieSBhCisg
ICBgQ29udGFpbmVyYCB0byBpbnN0YW50aWF0ZSBhbmQgY2FjaGUgb2JqZWN0cy4KKyAgCisgICBU
aGUgQVBJIGZvciBgUmVnaXN0cnlgIGlzIHN0aWxsIGluIGZsdXggYW5kIHNob3VsZCBub3QgYmUg
Y29uc2lkZXJlZCBzdGFibGUuCisgIAorICAgQHByaXZhdGUKKyAgIEBjbGFzcyBSZWdpc3RyeQor
ICAgQHNpbmNlIDEuMTEuMAorICAqLworICBmdW5jdGlvbiBSZWdpc3RyeShvcHRpb25zKSB7Cisg
ICAgdGhpcy5mYWxsYmFjayA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mYWxsYmFjayA/IG9wdGlvbnMu
ZmFsbGJhY2sgOiBudWxsOworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXNvbHZlcikg
eworICAgICAgdGhpcy5yZXNvbHZlciA9IG9wdGlvbnMucmVzb2x2ZXI7CisKKyAgICAgIGlmICh0
eXBlb2YgdGhpcy5yZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBkZXByZWNhdGVS
ZXNvbHZlckZ1bmN0aW9uKHRoaXMpOworICAgICAgfQorICAgIH0KKworICAgIHRoaXMucmVnaXN0
cmF0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG9wdGlvbnMgJiYgb3B0aW9u
cy5yZWdpc3RyYXRpb25zID8gb3B0aW9ucy5yZWdpc3RyYXRpb25zIDogbnVsbCk7CisKKyAgICB0
aGlzLl90eXBlSW5qZWN0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwp
OworICAgIHRoaXMuX2luamVjdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChu
dWxsKTsKKyAgICB0aGlzLl9mYWN0b3J5VHlwZUluamVjdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rp
b25hcnkuZGVmYXVsdChudWxsKTsKKyAgICB0aGlzLl9mYWN0b3J5SW5qZWN0aW9ucyA9IF9lbWJl
ck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwpOworCisgICAgdGhpcy5fbG9jYWxMb29rdXBD
YWNoZSA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgdGhpcy5f
bm9ybWFsaXplQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAg
ICB0aGlzLl9yZXNvbHZlQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxs
KTsKKyAgICB0aGlzLl9mYWlsQ2FjaGUgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChu
dWxsKTsKKworICAgIHRoaXMuX29wdGlvbnMgPSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVs
dChudWxsKTsKKyAgICB0aGlzLl90eXBlT3B0aW9ucyA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5k
ZWZhdWx0KG51bGwpOworICB9CisKKyAgUmVnaXN0cnkucHJvdG90eXBlID0geworICAgIC8qKgor
ICAgICBBIGJhY2t1cCByZWdpc3RyeSBmb3IgcmVzb2x2aW5nIHJlZ2lzdHJhdGlvbnMgd2hlbiBu
byBtYXRjaGVzIGNhbiBiZSBmb3VuZC4KKyAgICAgIEBwcml2YXRlCisgICAgIEBwcm9wZXJ0eSBm
YWxsYmFjaworICAgICBAdHlwZSBSZWdpc3RyeQorICAgICAqLworICAgIGZhbGxiYWNrOiBudWxs
LAorCisgICAgLyoqCisgICAgIEFuIG9iamVjdCB0aGF0IGhhcyBhIGByZXNvbHZlYCBtZXRob2Qg
dGhhdCByZXNvbHZlcyBhIG5hbWUuCisgICAgICBAcHJpdmF0ZQorICAgICBAcHJvcGVydHkgcmVz
b2x2ZXIKKyAgICAgQHR5cGUgUmVzb2x2ZXIKKyAgICAgKi8KKyAgICByZXNvbHZlcjogbnVsbCwK
KworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICBAcHJvcGVydHkgcmVnaXN0cmF0aW9ucwor
ICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAqLworICAgIHJlZ2lzdHJhdGlvbnM6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfdHlwZUluamVj
dGlvbnMKKyAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfdHlwZUluamVj
dGlvbnM6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBf
aW5qZWN0aW9ucworICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAqLworICAgIF9pbmpl
Y3Rpb25zOiBudWxsLAorCisgICAgLyoqCisgICAgIEBwcml2YXRlCisgICAgICBAcHJvcGVydHkg
X2ZhY3RvcnlUeXBlSW5qZWN0aW9ucworICAgICBAdHlwZSBJbmhlcml0aW5nRGljdAorICAgICAq
LworICAgIF9mYWN0b3J5VHlwZUluamVjdGlvbnM6IG51bGwsCisKKyAgICAvKioKKyAgICAgQHBy
aXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfZmFjdG9yeUluamVjdGlvbnMKKyAgICAgQHR5cGUgSW5o
ZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfZmFjdG9yeUluamVjdGlvbnM6IG51bGwsCisKKyAg
ICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfbm9ybWFsaXplQ2FjaGUKKyAg
ICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfbm9ybWFsaXplQ2FjaGU6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfcmVzb2x2ZUNh
Y2hlCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0CisgICAgICovCisgICAgX3Jlc29sdmVDYWNo
ZTogbnVsbCwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICAgQHByb3BlcnR5IF9vcHRp
b25zCisgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0CisgICAgICovCisgICAgX29wdGlvbnM6IG51
bGwsCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgIEBwcm9wZXJ0eSBfdHlwZU9wdGlv
bnMKKyAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKKyAgICAgKi8KKyAgICBfdHlwZU9wdGlvbnM6
IG51bGwsCisKKyAgICAvKioKKyAgICAgQ3JlYXRlcyBhIGNvbnRhaW5lciBiYXNlZCBvbiB0aGlz
IHJlZ2lzdHJ5LgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBjb250YWluZXIKKyAgICAg
QHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgQHJldHVybiB7Q29udGFpbmVyfSBjcmVhdGVk
IGNvbnRhaW5lcgorICAgICAqLworICAgIGNvbnRhaW5lcjogZnVuY3Rpb24gKG9wdGlvbnMpIHsK
KyAgICAgIHJldHVybiBuZXcgX2NvbnRhaW5lckNvbnRhaW5lci5kZWZhdWx0KHRoaXMsIG9wdGlv
bnMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXJzIGEgZmFjdG9yeSBmb3IgbGF0
ZXIgaW5qZWN0aW9uLgorICAgICAgRXhhbXBsZToKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
dmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgICByZWdpc3RyeS5yZWdpc3Rlcign
bW9kZWw6dXNlcicsIFBlcnNvbiwge3NpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdmcnVpdDpmYXZvcml0ZScsIE9yYW5nZSk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lz
dGVyKCdjb21tdW5pY2F0aW9uOm1haW4nLCBFbWFpbCwge3NpbmdsZXRvbjogZmFsc2V9KTsKKyAg
ICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIHJlZ2lzdGVyCisgICAgIEBwYXJh
bSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmYWN0b3J5CisgICAg
IEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXI6IGZ1bmN0aW9u
IChmdWxsTmFtZSwgZmFjdG9yeSkgeworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVu
Z3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sy
XTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBw
cm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisKKyAg
ICAgIGlmIChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcignQXR0ZW1wdGluZyB0byByZWdpc3RlciBhbiB1bmtub3duIGZhY3Rvcnk6IGAnICsgZnVs
bE5hbWUgKyAnYCcpOworICAgICAgfQorCisgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlz
Lm5vcm1hbGl6ZShmdWxsTmFtZSk7CisKKyAgICAgIGlmICh0aGlzLl9yZXNvbHZlQ2FjaGVbbm9y
bWFsaXplZE5hbWVdKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlLXJlZ2lz
dGVyOiBgJyArIGZ1bGxOYW1lICsgJ2AsIGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQu
Jyk7CisgICAgICB9CisKKyAgICAgIGRlbGV0ZSB0aGlzLl9mYWlsQ2FjaGVbbm9ybWFsaXplZE5h
bWVdOworICAgICAgdGhpcy5yZWdpc3RyYXRpb25zW25vcm1hbGl6ZWROYW1lXSA9IGZhY3Rvcnk7
CisgICAgICB0aGlzLl9vcHRpb25zW25vcm1hbGl6ZWROYW1lXSA9IG9wdGlvbnM7CisgICAgfSwK
KworICAgIC8qKgorICAgICBVbnJlZ2lzdGVyIGEgZnVsbE5hbWUKKyAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHJlZ2lzdHJ5LnJl
Z2lzdGVyKCdtb2RlbDp1c2VyJywgVXNlcik7CisgICAgICByZWdpc3RyeS5yZXNvbHZlKCdtb2Rl
bDp1c2VyJykuY3JlYXRlKCkgaW5zdGFuY2VvZiBVc2VyIC8vPT4gdHJ1ZQorICAgICAgcmVnaXN0
cnkudW5yZWdpc3RlcignbW9kZWw6dXNlcicpCisgICAgIHJlZ2lzdHJ5LnJlc29sdmUoJ21vZGVs
OnVzZXInKSA9PT0gdW5kZWZpbmVkIC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIEBwcml2YXRl
CisgICAgIEBtZXRob2QgdW5yZWdpc3RlcgorICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUK
KyAgICAgKi8KKyAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdmdWxsTmFtZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFt
ZScsIHRoaXMudmFsaWRhdGVGdWxsTmFtZShmdWxsTmFtZSkpOworCisgICAgICB2YXIgbm9ybWFs
aXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisKKyAgICAgIHRoaXMuX2xvY2Fs
TG9va3VwQ2FjaGUgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworCisg
ICAgICBkZWxldGUgdGhpcy5yZWdpc3RyYXRpb25zW25vcm1hbGl6ZWROYW1lXTsKKyAgICAgIGRl
bGV0ZSB0aGlzLl9yZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdOworICAgICAgZGVsZXRlIHRo
aXMuX2ZhaWxDYWNoZVtub3JtYWxpemVkTmFtZV07CisgICAgICBkZWxldGUgdGhpcy5fb3B0aW9u
c1tub3JtYWxpemVkTmFtZV07CisgICAgfSwKKworICAgIC8qKgorICAgICBHaXZlbiBhIGZ1bGxO
YW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQnkgZGVmYXVsdCBg
cmVzb2x2ZWAgd2lsbCByZXRyaWV2ZSB0aGUgZmFjdG9yeSBmcm9tCisgICAgIHRoZSByZWdpc3Ry
eS4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5
KCk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOworICAg
ICAgcmVnaXN0cnkucmVzb2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0dGVyCisgICAgIGBg
YAorICAgICAgT3B0aW9uYWxseSB0aGUgcmVnaXN0cnkgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBj
dXN0b20gcmVzb2x2ZXIuCisgICAgIElmIHByb3ZpZGVkLCBgcmVzb2x2ZWAgd2lsbCBmaXJzdCBw
cm92aWRlIHRoZSBjdXN0b20gcmVzb2x2ZXIKKyAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIHJlc29s
dmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjaworICAgICB0byB0aGUg
cmVnaXN0cnkuCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5ldyBS
ZWdpc3RyeSgpOworICAgICByZWdpc3RyeS5yZXNvbHZlciA9IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7
CisgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBzeXN0ZW0gb2YgY2hvaWNlCisgICAg
ICB9OworICAgICAgLy8gdGhlIHR3aXR0ZXIgZmFjdG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxl
IHN5c3RlbQorICAgICByZWdpc3RyeS5yZXNvbHZlKCdhcGk6dHdpdHRlcicpIC8vID0+IFR3aXR0
ZXIKKyAgICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIHJlc29sdmUKKyAgICAg
QHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10K
KyAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNvdXJjZV0gdGhlIGZ1bGxuYW1lIG9mIHRo
ZSByZXF1ZXN0IHNvdXJjZSAodXNlZCBmb3IgbG9jYWwgbG9va3VwcykKKyAgICAgQHJldHVybiB7
RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9yeQorICAgICAqLworICAgIHJlc29sdmU6IGZ1bmN0
aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQo
J2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0ZUZ1bGxO
YW1lKGZ1bGxOYW1lKSk7CisgICAgICB2YXIgZmFjdG9yeSA9IHJlc29sdmUodGhpcywgdGhpcy5u
b3JtYWxpemUoZnVsbE5hbWUpLCBvcHRpb25zKTsKKyAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRl
ZmluZWQgJiYgdGhpcy5mYWxsYmFjaykgeworICAgICAgICB2YXIgX2ZhbGxiYWNrOworCisgICAg
ICAgIGZhY3RvcnkgPSAoX2ZhbGxiYWNrID0gdGhpcy5mYWxsYmFjaykucmVzb2x2ZS5hcHBseShf
ZmFsbGJhY2ssIGFyZ3VtZW50cyk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFjdG9yeTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgIEEgaG9vayB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJl
IGhvdyB0aGUgcmVzb2x2ZXIgd2lsbAorICAgICBhdHRlbXB0IHRvIGZpbmQgdGhlIGZhY3Rvcnku
CisgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgRW1iZXIgYC5kZXNjcmliZWAgcmV0dXJu
cyB0aGUgZnVsbAorICAgICBjbGFzcyBuYW1lIChpbmNsdWRpbmcgbmFtZXNwYWNlKSB3aGVyZSBF
bWJlcidzIHJlc29sdmVyIGV4cGVjdHMKKyAgICAgdG8gZmluZCB0aGUgYGZ1bGxOYW1lYC4KKyAg
ICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgZGVzY3JpYmUKKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge3N0cmluZ30gZGVzY3JpYmVkIGZ1bGxOYW1lCisgICAg
ICovCisgICAgZGVzY3JpYmU6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgaWYgKHRoaXMu
cmVzb2x2ZXIgJiYgdGhpcy5yZXNvbHZlci5sb29rdXBEZXNjcmlwdGlvbikgeworICAgICAgICBy
ZXR1cm4gdGhpcy5yZXNvbHZlci5sb29rdXBEZXNjcmlwdGlvbihmdWxsTmFtZSk7CisgICAgICB9
IGVsc2UgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmFsbGJhY2su
ZGVzY3JpYmUoZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxO
YW1lOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgQSBob29rIHRvIGVuYWJsZSBj
dXN0b20gZnVsbE5hbWUgbm9ybWFsaXphdGlvbiBiZWhhdmlvdXIKKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2Qgbm9ybWFsaXplRnVsbE5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxO
YW1lCisgICAgIEByZXR1cm4ge3N0cmluZ30gbm9ybWFsaXplZCBmdWxsTmFtZQorICAgICAqLwor
ICAgIG5vcm1hbGl6ZUZ1bGxOYW1lOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIGlmICh0
aGlzLnJlc29sdmVyICYmIHRoaXMucmVzb2x2ZXIubm9ybWFsaXplKSB7CisgICAgICAgIHJldHVy
biB0aGlzLnJlc29sdmVyLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB9IGVsc2UgaWYgKHRo
aXMuZmFsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmFsbGJhY2subm9ybWFsaXplRnVs
bE5hbWUoZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxOYW1l
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgTm9ybWFsaXplIGEgZnVsbE5hbWUg
YmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgY29udmVudGlvbnMKKyAgICAgIEBwcml2YXRlCisg
ICAgIEBtZXRob2Qgbm9ybWFsaXplCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAg
ICBAcmV0dXJuIHtzdHJpbmd9IG5vcm1hbGl6ZWQgZnVsbE5hbWUKKyAgICAgKi8KKyAgICBub3Jt
YWxpemU6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6
ZUNhY2hlW2Z1bGxOYW1lXSB8fCAodGhpcy5fbm9ybWFsaXplQ2FjaGVbZnVsbE5hbWVdID0gdGhp
cy5ub3JtYWxpemVGdWxsTmFtZShmdWxsTmFtZSkpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
QG1ldGhvZCBtYWtlVG9TdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgIEBwYXJhbSB7YW55fSBm
YWN0b3J5CisgICAgIEBwYXJhbSB7c3RyaW5nfSBmdWxsTmFtZQorICAgICBAcmV0dXJuIHtmdW5j
dGlvbn0gdG9TdHJpbmcgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBtYWtlVG9TdHJpbmc6IGZ1bmN0
aW9uIChmYWN0b3J5LCBmdWxsTmFtZSkgeworICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiYgdGhp
cy5yZXNvbHZlci5tYWtlVG9TdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXIu
bWFrZVRvU3RyaW5nKGZhY3RvcnksIGZ1bGxOYW1lKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5m
YWxsYmFjaykgeworICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFjay5tYWtlVG9TdHJpbmcoZmFj
dG9yeSwgZnVsbE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnku
dG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgIEdpdmVuIGEgZnVs
bE5hbWUgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBhd2FyZSBvZiBpdHMgZmFjdG9yeQorICAg
ICBvciBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIGhh
cworICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IFtv
cHRpb25zXQorICAgICBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc291cmNlXSB0aGUgZnVsbG5h
bWUgb2YgdGhlIHJlcXVlc3Qgc291cmNlICh1c2VkIGZvciBsb2NhbCBsb29rdXBzKQorICAgICBA
cmV0dXJuIHtCb29sZWFufQorICAgICAqLworICAgIGhhczogZnVuY3Rpb24gKGZ1bGxOYW1lLCBv
cHRpb25zKSB7CisgICAgICBpZiAoIXRoaXMuaXNWYWxpZEZ1bGxOYW1lKGZ1bGxOYW1lKSkgewor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciBzb3VyY2UgPSB1bmRl
ZmluZWQ7CisKKyAgICAgIHNvdXJjZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zb3VyY2UgJiYgdGhp
cy5ub3JtYWxpemUob3B0aW9ucy5zb3VyY2UpOworCisgICAgICByZXR1cm4gaGFzKHRoaXMsIHRo
aXMubm9ybWFsaXplKGZ1bGxOYW1lKSwgc291cmNlKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
IEFsbG93IHJlZ2lzdGVyaW5nIG9wdGlvbnMgZm9yIGFsbCBmYWN0b3JpZXMgb2YgYSB0eXBlLgor
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsK
KyAgICAgdmFyIGNvbnRhaW5lciA9IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgLy8gaWYg
YWxsIG9mIHR5cGUgYGNvbm5lY3Rpb25gIG11c3Qgbm90IGJlIHNpbmdsZXRvbnMKKyAgICAgcmVn
aXN0cnkub3B0aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7
CisgICAgICByZWdpc3RyeS5yZWdpc3RlcignY29ubmVjdGlvbjp0d2l0dGVyJywgVHdpdHRlckNv
bm5lY3Rpb24pOworICAgICByZWdpc3RyeS5yZWdpc3RlcignY29ubmVjdGlvbjpmYWNlYm9vaycs
IEZhY2Vib29rQ29ubmVjdGlvbik7CisgICAgICB2YXIgdHdpdHRlciA9IGNvbnRhaW5lci5sb29r
dXAoJ2Nvbm5lY3Rpb246dHdpdHRlcicpOworICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIu
bG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsKKyAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIy
OyAvLyA9PiBmYWxzZQorICAgICAgdmFyIGZhY2Vib29rID0gY29udGFpbmVyLmxvb2t1cCgnY29u
bmVjdGlvbjpmYWNlYm9vaycpOworICAgICB2YXIgZmFjZWJvb2syID0gY29udGFpbmVyLmxvb2t1
cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOworICAgICAgZmFjZWJvb2sgPT09IGZhY2Vib29rMjsg
Ly8gPT4gZmFsc2UKKyAgICAgYGBgCisgICAgICBAcHJpdmF0ZQorICAgICBAbWV0aG9kIG9wdGlv
bnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgIEBwYXJhbSB7T2JqZWN0
fSBvcHRpb25zCisgICAgICovCisgICAgb3B0aW9uc0ZvclR5cGU6IGZ1bmN0aW9uICh0eXBlLCBv
cHRpb25zKSB7CisgICAgICB0aGlzLl90eXBlT3B0aW9uc1t0eXBlXSA9IG9wdGlvbnM7CisgICAg
fSwKKworICAgIGdldE9wdGlvbnNGb3JUeXBlOiBmdW5jdGlvbiAodHlwZSkgeworICAgICAgdmFy
IG9wdGlvbnNGb3JUeXBlID0gdGhpcy5fdHlwZU9wdGlvbnNbdHlwZV07CisgICAgICBpZiAob3B0
aW9uc0ZvclR5cGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIG9w
dGlvbnNGb3JUeXBlID0gdGhpcy5mYWxsYmFjay5nZXRPcHRpb25zRm9yVHlwZSh0eXBlKTsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiBvcHRpb25zRm9yVHlwZTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgIEBwcml2YXRlCisgICAgIEBtZXRob2Qgb3B0aW9ucworICAgICBAcGFyYW0ge1N0cmluZ30g
ZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgKi8KKyAgICBvcHRp
b25zOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRz
Lmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVu
dHNbMV07CisKKyAgICAgIHZhciBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxO
YW1lKTsKKyAgICAgIHRoaXMuX29wdGlvbnNbbm9ybWFsaXplZE5hbWVdID0gb3B0aW9uczsKKyAg
ICB9LAorCisgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICB2YXIg
bm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB2YXIgb3B0
aW9ucyA9IHRoaXMuX29wdGlvbnNbbm9ybWFsaXplZE5hbWVdOworICAgICAgaWYgKG9wdGlvbnMg
PT09IHVuZGVmaW5lZCAmJiB0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIG9wdGlvbnMgPSB0aGlz
LmZhbGxiYWNrLmdldE9wdGlvbnMoZnVsbE5hbWUpOworICAgICAgfQorICAgICAgcmV0dXJuIG9w
dGlvbnM7CisgICAgfSwKKworICAgIGdldE9wdGlvbjogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRp
b25OYW1lKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbZnVsbE5hbWVdOwor
CisgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zW29wdGlvbk5hbWVdICE9PSB1bmRlZmluZWQp
IHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV07CisgICAgICB9CisKKyAgICAg
IHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoJzonKVswXTsKKyAgICAgIG9wdGlvbnMgPSB0aGlz
Ll90eXBlT3B0aW9uc1t0eXBlXTsKKworICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRp
b25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5h
bWVdOworICAgICAgfSBlbHNlIGlmICh0aGlzLmZhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiB0
aGlzLmZhbGxiYWNrLmdldE9wdGlvbihmdWxsTmFtZSwgb3B0aW9uTmFtZSk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIC8qKgorICAgICBVc2VkIG9ubHkgdmlhIGBpbmplY3Rpb25gLgorICAgICAg
UHJvdmlkZXMgYSBzcGVjaWFsaXplZCBmb3JtIG9mIGluamVjdGlvbiwgc3BlY2lmaWNhbGx5IGVu
YWJsaW5nCisgICAgIGFsbCBvYmplY3RzIG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGgg
YSByZWZlcmVuY2UgdG8gYW5vdGhlcgorICAgICBvYmplY3QuCisgICAgICBGb3IgZXhhbXBsZSwg
cHJvdmlkZWQgZWFjaCBvYmplY3Qgb2YgdHlwZSBgY29udHJvbGxlcmAgbmVlZGVkIGEgYHJvdXRl
cmAuCisgICAgIG9uZSB3b3VsZCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgYGBgamF2YXNjcmlw
dAorICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgdmFyIGNvbnRhaW5l
ciA9IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JvdXRl
cjptYWluJywgUm91dGVyKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6dXNl
cicsIFVzZXJDb250cm9sbGVyKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6
cG9zdCcsIFBvc3RDb250cm9sbGVyKTsKKyAgICAgIHJlZ2lzdHJ5LnR5cGVJbmplY3Rpb24oJ2Nv
bnRyb2xsZXInLCAncm91dGVyJywgJ3JvdXRlcjptYWluJyk7CisgICAgICB2YXIgdXNlciA9IGNv
bnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6dXNlcicpOworICAgICB2YXIgcG9zdCA9IGNvbnRh
aW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6cG9zdCcpOworICAgICAgdXNlci5yb3V0ZXIgaW5zdGFu
Y2VvZiBSb3V0ZXI7IC8vPT4gdHJ1ZQorICAgICBwb3N0LnJvdXRlciBpbnN0YW5jZW9mIFJvdXRl
cjsgLy89PiB0cnVlCisgICAgICAvLyBib3RoIGNvbnRyb2xsZXJzIHNoYXJlIHRoZSBzYW1lIHJv
dXRlcgorICAgICB1c2VyLnJvdXRlciA9PT0gcG9zdC5yb3V0ZXI7IC8vPT4gdHJ1ZQorICAgICBg
YGAKKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgdHlwZUluamVjdGlvbgorICAgICBAcGFy
YW0ge1N0cmluZ30gdHlwZQorICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgICovCisgICAgdHlwZUluamVjdGlvbjogZnVuY3Rp
b24gKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ2Z1bGxOYW1lIG11c3QgYmUgYSBwcm9wZXIgZnVsbCBuYW1lJywgdGhpcy52YWxpZGF0
ZUZ1bGxOYW1lKGZ1bGxOYW1lKSk7CisKKyAgICAgIHZhciBmdWxsTmFtZVR5cGUgPSBmdWxsTmFt
ZS5zcGxpdCgnOicpWzBdOworICAgICAgaWYgKGZ1bGxOYW1lVHlwZSA9PT0gdHlwZSkgeworICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmplY3QgYSBgJyArIGZ1bGxOYW1lICsgJ2Ag
b24gb3RoZXIgJyArIHR5cGUgKyAnKHMpLicpOworICAgICAgfQorCisgICAgICB2YXIgaW5qZWN0
aW9ucyA9IHRoaXMuX3R5cGVJbmplY3Rpb25zW3R5cGVdIHx8ICh0aGlzLl90eXBlSW5qZWN0aW9u
c1t0eXBlXSA9IFtdKTsKKworICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVy
dHk6IHByb3BlcnR5LAorICAgICAgICBmdWxsTmFtZTogZnVsbE5hbWUKKyAgICAgIH0pOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgRGVmaW5lcyBpbmplY3Rpb24gcnVsZXMuCisgICAgICBUaGVz
ZSBydWxlcyBhcmUgdXNlZCB0byBpbmplY3QgZGVwZW5kZW5jaWVzIG9udG8gb2JqZWN0cyB3aGVu
IHRoZXkKKyAgICAgYXJlIGluc3RhbnRpYXRlZC4KKyAgICAgIFR3byBmb3JtcyBvZiBpbmplY3Rp
b25zIGFyZSBwb3NzaWJsZToKKyAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90
aGVyIGZ1bGxOYW1lCisgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhIHR5cGUKKyAg
ICAgIEV4YW1wbGU6CisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5l
dyBSZWdpc3RyeSgpOworICAgICB2YXIgY29udGFpbmVyID0gcmVnaXN0cnkuY29udGFpbmVyKCk7
CisgICAgICByZWdpc3RyeS5yZWdpc3Rlcignc291cmNlOm1haW4nLCBTb3VyY2UpOworICAgICBy
ZWdpc3RyeS5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOworICAgICByZWdpc3RyeS5yZWdp
c3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOworICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFt
ZSBvbiBhbm90aGVyIGZ1bGxOYW1lCisgICAgIC8vIGVnLiBlYWNoIHVzZXIgbW9kZWwgZ2V0cyBh
IHBvc3QgbW9kZWwKKyAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdtb2RlbDp1c2VyJywgJ3Bvc3Qn
LCAnbW9kZWw6cG9zdCcpOworICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90
aGVyIHR5cGUKKyAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdtb2RlbCcsICdzb3VyY2UnLCAnc291
cmNlOm1haW4nKTsKKyAgICAgIHZhciB1c2VyID0gY29udGFpbmVyLmxvb2t1cCgnbW9kZWw6dXNl
cicpOworICAgICB2YXIgcG9zdCA9IGNvbnRhaW5lci5sb29rdXAoJ21vZGVsOnBvc3QnKTsKKyAg
ICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2YgU291cmNlOyAvLz0+IHRydWUKKyAgICAgcG9zdC5z
b3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQorICAgICAgdXNlci5wb3N0IGluc3Rh
bmNlb2YgUG9zdDsgLy89PiB0cnVlCisgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUgdGhl
IHNhbWUgc291cmNlCisgICAgIHVzZXIuc291cmNlID09PSBwb3N0LnNvdXJjZTsgLy89PiB0cnVl
CisgICAgIGBgYAorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBpbmplY3Rpb24KKyAgICAg
QHBhcmFtIHtTdHJpbmd9IGZhY3RvcnlOYW1lCisgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0
eQorICAgICBAcGFyYW0ge1N0cmluZ30gaW5qZWN0aW9uTmFtZQorICAgICAqLworICAgIGluamVj
dGlvbjogZnVuY3Rpb24gKGZ1bGxOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSkgeworICAg
ICAgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGluamVjdGlvbk5hbWUpOworICAgICAgdmFyIG5vcm1h
bGl6ZWRJbmplY3Rpb25OYW1lID0gdGhpcy5ub3JtYWxpemUoaW5qZWN0aW9uTmFtZSk7CisKKyAg
ICAgIGlmIChmdWxsTmFtZS5pbmRleE9mKCc6JykgPT09IC0xKSB7CisgICAgICAgIHJldHVybiB0
aGlzLnR5cGVJbmplY3Rpb24oZnVsbE5hbWUsIHByb3BlcnR5LCBub3JtYWxpemVkSW5qZWN0aW9u
TmFtZSk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdmdWxsTmFt
ZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRhdGVGdWxsTmFtZShmdWxs
TmFtZSkpOworICAgICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemUoZnVsbE5h
bWUpOworCisgICAgICB2YXIgaW5qZWN0aW9ucyA9IHRoaXMuX2luamVjdGlvbnNbbm9ybWFsaXpl
ZE5hbWVdIHx8ICh0aGlzLl9pbmplY3Rpb25zW25vcm1hbGl6ZWROYW1lXSA9IFtdKTsKKworICAg
ICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LAorICAgICAg
ICBmdWxsTmFtZTogbm9ybWFsaXplZEluamVjdGlvbk5hbWUKKyAgICAgIH0pOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgVXNlZCBvbmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCisgICAgICBQ
cm92aWRlcyBhIHNwZWNpYWxpemVkIGZvcm0gb2YgaW5qZWN0aW9uLCBzcGVjaWZpY2FsbHkgZW5h
YmxpbmcKKyAgICAgYWxsIGZhY3Rvcnkgb2Ygb25lIHR5cGUgdG8gYmUgaW5qZWN0ZWQgd2l0aCBh
IHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgIG9iamVjdC4KKyAgICAgIEZvciBleGFtcGxlLCBw
cm92aWRlZCBlYWNoIGZhY3Rvcnkgb2YgdHlwZSBgbW9kZWxgIG5lZWRlZCBhIGBzdG9yZWAuCisg
ICAgIG9uZSB3b3VsZCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVy
KCdzdG9yZTptYWluJywgU29tZVN0b3JlKTsKKyAgICAgIHJlZ2lzdHJ5LmZhY3RvcnlUeXBlSW5q
ZWN0aW9uKCdtb2RlbCcsICdzdG9yZScsICdzdG9yZTptYWluJyk7CisgICAgICB2YXIgc3RvcmUg
PSByZWdpc3RyeS5sb29rdXAoJ3N0b3JlOm1haW4nKTsKKyAgICAgdmFyIFVzZXJGYWN0b3J5ID0g
cmVnaXN0cnkubG9va3VwRmFjdG9yeSgnbW9kZWw6dXNlcicpOworICAgICAgVXNlckZhY3Rvcnku
c3RvcmUgaW5zdGFuY2VvZiBTb21lU3RvcmU7IC8vPT4gdHJ1ZQorICAgICBgYGAKKyAgICAgIEBw
cml2YXRlCisgICAgIEBtZXRob2QgZmFjdG9yeVR5cGVJbmplY3Rpb24KKyAgICAgQHBhcmFtIHtT
dHJpbmd9IHR5cGUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5CisgICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZQorICAgICAqLworICAgIGZhY3RvcnlUeXBlSW5qZWN0aW9uOiBmdW5j
dGlvbiAodHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKSB7CisgICAgICB2YXIgaW5qZWN0aW9ucyA9
IHRoaXMuX2ZhY3RvcnlUeXBlSW5qZWN0aW9uc1t0eXBlXSB8fCAodGhpcy5fZmFjdG9yeVR5cGVJ
bmplY3Rpb25zW3R5cGVdID0gW10pOworCisgICAgICBpbmplY3Rpb25zLnB1c2goeworICAgICAg
ICBwcm9wZXJ0eTogcHJvcGVydHksCisgICAgICAgIGZ1bGxOYW1lOiB0aGlzLm5vcm1hbGl6ZShm
dWxsTmFtZSkKKyAgICAgIH0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgRGVmaW5lcyBmYWN0
b3J5IGluamVjdGlvbiBydWxlcy4KKyAgICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmplY3Rpb24g
cnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWluc3QgZmFjdG9yaWVzLCB2aWEKKyAgICAgYFJlZ2lzdHJ5
I2xvb2t1cEZhY3RvcnlgLgorICAgICAgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gaW5qZWN0IG9i
amVjdHMgb250byBmYWN0b3JpZXMgd2hlbiB0aGV5CisgICAgIGFyZSBsb29rZWQgdXAuCisgICAg
ICBUd28gZm9ybXMgb2YgaW5qZWN0aW9ucyBhcmUgcG9zc2libGU6CisgICAgICAqIEluamVjdGlu
ZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQorICAgICAqIEluamVjdGluZyBvbmUg
ZnVsbE5hbWUgb24gYSB0eXBlCisgICAgICBFeGFtcGxlOgorICAgICAgYGBgamF2YXNjcmlwdAor
ICAgICB2YXIgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKKyAgICAgdmFyIGNvbnRhaW5lciA9
IHJlZ2lzdHJ5LmNvbnRhaW5lcigpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3N0b3JlOm1h
aW4nLCBTdG9yZSk7CisgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdzdG9yZTpzZWNvbmRhcnknLCBP
dGhlclN0b3JlKTsKKyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBVc2VyKTsK
KyAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ21vZGVsOnBvc3QnLCBQb3N0KTsKKyAgICAgIC8vIGlu
amVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciB0eXBlCisgICAgIHJlZ2lzdHJ5LmZhY3Rv
cnlJbmplY3Rpb24oJ21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKKyAgICAgIC8vIGlu
amVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQorICAgICByZWdpc3RyeS5m
YWN0b3J5SW5qZWN0aW9uKCdtb2RlbDpwb3N0JywgJ3NlY29uZGFyeVN0b3JlJywgJ3N0b3JlOnNl
Y29uZGFyeScpOworICAgICAgdmFyIFVzZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3Rv
cnkoJ21vZGVsOnVzZXInKTsKKyAgICAgdmFyIFBvc3RGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1
cEZhY3RvcnkoJ21vZGVsOnBvc3QnKTsKKyAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1
cCgnc3RvcmU6bWFpbicpOworICAgICAgVXNlckZhY3Rvcnkuc3RvcmUgaW5zdGFuY2VvZiBTdG9y
ZTsgLy89PiB0cnVlCisgICAgIFVzZXJGYWN0b3J5LnNlY29uZGFyeVN0b3JlIGluc3RhbmNlb2Yg
T3RoZXJTdG9yZTsgLy89PiBmYWxzZQorICAgICAgUG9zdEZhY3Rvcnkuc3RvcmUgaW5zdGFuY2Vv
ZiBTdG9yZTsgLy89PiB0cnVlCisgICAgIFBvc3RGYWN0b3J5LnNlY29uZGFyeVN0b3JlIGluc3Rh
bmNlb2YgT3RoZXJTdG9yZTsgLy89PiB0cnVlCisgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hh
cmUgdGhlIHNhbWUgc291cmNlIGluc3RhbmNlCisgICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQ
b3N0RmFjdG9yeS5zdG9yZTsgLy89PiB0cnVlCisgICAgIGBgYAorICAgICAgQHByaXZhdGUKKyAg
ICAgQG1ldGhvZCBmYWN0b3J5SW5qZWN0aW9uCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmYWN0b3J5
TmFtZQorICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGluamVjdGlvbk5hbWUKKyAgICAgKi8KKyAgICBmYWN0b3J5SW5qZWN0aW9uOiBmdW5jdGlvbiAo
ZnVsbE5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7CisgICAgICB2YXIgbm9ybWFsaXpl
ZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CisgICAgICB2YXIgbm9ybWFsaXplZElu
amVjdGlvbk5hbWUgPSB0aGlzLm5vcm1hbGl6ZShpbmplY3Rpb25OYW1lKTsKKworICAgICAgdGhp
cy52YWxpZGF0ZUZ1bGxOYW1lKGluamVjdGlvbk5hbWUpOworCisgICAgICBpZiAoZnVsbE5hbWUu
aW5kZXhPZignOicpID09PSAtMSkgeworICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5VHlwZUlu
amVjdGlvbihub3JtYWxpemVkTmFtZSwgcHJvcGVydHksIG5vcm1hbGl6ZWRJbmplY3Rpb25OYW1l
KTsKKyAgICAgIH0KKworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlzLl9mYWN0b3J5SW5qZWN0
aW9uc1tub3JtYWxpemVkTmFtZV0gfHwgKHRoaXMuX2ZhY3RvcnlJbmplY3Rpb25zW25vcm1hbGl6
ZWROYW1lXSA9IFtdKTsKKworICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgcHJvcGVy
dHk6IHByb3BlcnR5LAorICAgICAgICBmdWxsTmFtZTogbm9ybWFsaXplZEluamVjdGlvbk5hbWUK
KyAgICAgIH0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhv
ZCBrbm93bkZvclR5cGUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gaXRl
cmF0ZSBvdmVyCisgICAgKi8KKyAgICBrbm93bkZvclR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7Cisg
ICAgICB2YXIgZmFsbGJhY2tLbm93biA9IHVuZGVmaW5lZCwKKyAgICAgICAgICByZXNvbHZlcktu
b3duID0gdW5kZWZpbmVkOworCisgICAgICB2YXIgbG9jYWxLbm93biA9IF9lbWJlck1ldGFsRGlj
dGlvbmFyeS5kZWZhdWx0KG51bGwpOworICAgICAgdmFyIHJlZ2lzdGVyZWROYW1lcyA9IE9iamVj
dC5rZXlzKHRoaXMucmVnaXN0cmF0aW9ucyk7CisgICAgICBmb3IgKHZhciBpbmRleCA9IDAsIF9s
ZW5ndGggPSByZWdpc3RlcmVkTmFtZXMubGVuZ3RoOyBpbmRleCA8IF9sZW5ndGg7IGluZGV4Kysp
IHsKKyAgICAgICAgdmFyIGZ1bGxOYW1lID0gcmVnaXN0ZXJlZE5hbWVzW2luZGV4XTsKKyAgICAg
ICAgdmFyIGl0ZW1UeXBlID0gZnVsbE5hbWUuc3BsaXQoJzonKVswXTsKKworICAgICAgICBpZiAo
aXRlbVR5cGUgPT09IHR5cGUpIHsKKyAgICAgICAgICBsb2NhbEtub3duW2Z1bGxOYW1lXSA9IHRy
dWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAg
ICAgICAgZmFsbGJhY2tLbm93biA9IHRoaXMuZmFsbGJhY2sua25vd25Gb3JUeXBlKHR5cGUpOwor
ICAgICAgfQorCisgICAgICBpZiAodGhpcy5yZXNvbHZlciAmJiB0aGlzLnJlc29sdmVyLmtub3du
Rm9yVHlwZSkgeworICAgICAgICByZXNvbHZlcktub3duID0gdGhpcy5yZXNvbHZlci5rbm93bkZv
clR5cGUodHlwZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbEFzc2lnbi5k
ZWZhdWx0KHt9LCBmYWxsYmFja0tub3duLCBsb2NhbEtub3duLCByZXNvbHZlcktub3duKTsKKyAg
ICB9LAorCisgICAgdmFsaWRhdGVGdWxsTmFtZTogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAg
ICBpZiAoIXRoaXMuaXNWYWxpZEZ1bGxOYW1lKGZ1bGxOYW1lKSkgeworICAgICAgICB0aHJvdyBu
ZXcgVHlwZUVycm9yKCdJbnZhbGlkIEZ1bGxuYW1lLCBleHBlY3RlZDogYHR5cGU6bmFtZWAgZ290
OiAnICsgZnVsbE5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAor
CisgICAgaXNWYWxpZEZ1bGxOYW1lOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHJldHVy
biAhIVZBTElEX0ZVTExfTkFNRV9SRUdFWFAudGVzdChmdWxsTmFtZSk7CisgICAgfSwKKworICAg
IHZhbGlkYXRlSW5qZWN0aW9uczogZnVuY3Rpb24gKGluamVjdGlvbnMpIHsKKyAgICAgIGlmICgh
aW5qZWN0aW9ucykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmdWxs
TmFtZTsKKworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGluamVjdGlvbnMubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZnVsbE5hbWUgPSBpbmplY3Rpb25zW2ldLmZ1
bGxOYW1lOworCisgICAgICAgIGlmICghdGhpcy5oYXMoZnVsbE5hbWUpKSB7CisgICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIGluamVjdCBhbiB1bmtub3duIGluamVjdGlv
bjogYCcgKyBmdWxsTmFtZSArICdgJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisg
ICAgbm9ybWFsaXplSW5qZWN0aW9uc0hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CisgICAgICB2YXIg
aW5qZWN0aW9ucyA9IFtdOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gaGFzaCkgeworICAgICAg
ICBpZiAoaGFzaC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ0V4cGVjdGVkIGEgcHJvcGVyIGZ1bGwgbmFtZSwgZ2l2ZW4gXCcnICsgaGFz
aFtrZXldICsgJ1wnJywgdGhpcy52YWxpZGF0ZUZ1bGxOYW1lKGhhc2hba2V5XSkpOworCisgICAg
ICAgICAgaW5qZWN0aW9ucy5wdXNoKHsKKyAgICAgICAgICAgIHByb3BlcnR5OiBrZXksCisgICAg
ICAgICAgICBmdWxsTmFtZTogaGFzaFtrZXldCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIGluamVjdGlvbnM7CisgICAgfSwKKworICAgIGdldEluamVj
dGlvbnM6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlz
Ll9pbmplY3Rpb25zW2Z1bGxOYW1lXSB8fCBbXTsKKyAgICAgIGlmICh0aGlzLmZhbGxiYWNrKSB7
CisgICAgICAgIGluamVjdGlvbnMgPSBpbmplY3Rpb25zLmNvbmNhdCh0aGlzLmZhbGxiYWNrLmdl
dEluamVjdGlvbnMoZnVsbE5hbWUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmplY3Rpb25z
OworICAgIH0sCisKKyAgICBnZXRUeXBlSW5qZWN0aW9uczogZnVuY3Rpb24gKHR5cGUpIHsKKyAg
ICAgIHZhciBpbmplY3Rpb25zID0gdGhpcy5fdHlwZUluamVjdGlvbnNbdHlwZV0gfHwgW107Cisg
ICAgICBpZiAodGhpcy5mYWxsYmFjaykgeworICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9u
cy5jb25jYXQodGhpcy5mYWxsYmFjay5nZXRUeXBlSW5qZWN0aW9ucyh0eXBlKSk7CisgICAgICB9
CisgICAgICByZXR1cm4gaW5qZWN0aW9uczsKKyAgICB9LAorCisgICAgZ2V0RmFjdG9yeUluamVj
dGlvbnM6IGZ1bmN0aW9uIChmdWxsTmFtZSkgeworICAgICAgdmFyIGluamVjdGlvbnMgPSB0aGlz
Ll9mYWN0b3J5SW5qZWN0aW9uc1tmdWxsTmFtZV0gfHwgW107CisgICAgICBpZiAodGhpcy5mYWxs
YmFjaykgeworICAgICAgICBpbmplY3Rpb25zID0gaW5qZWN0aW9ucy5jb25jYXQodGhpcy5mYWxs
YmFjay5nZXRGYWN0b3J5SW5qZWN0aW9ucyhmdWxsTmFtZSkpOworICAgICAgfQorICAgICAgcmV0
dXJuIGluamVjdGlvbnM7CisgICAgfSwKKworICAgIGdldEZhY3RvcnlUeXBlSW5qZWN0aW9uczog
ZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgIHZhciBpbmplY3Rpb25zID0gdGhpcy5fZmFjdG9yeVR5
cGVJbmplY3Rpb25zW3R5cGVdIHx8IFtdOworICAgICAgaWYgKHRoaXMuZmFsbGJhY2spIHsKKyAg
ICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KHRoaXMuZmFsbGJhY2suZ2V0RmFj
dG9yeVR5cGVJbmplY3Rpb25zKHR5cGUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmplY3Rp
b25zOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBkZXByZWNhdGVSZXNvbHZlckZ1bmN0aW9u
KHJlZ2lzdHJ5KSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Bhc3NpbmcgYSBg
cmVzb2x2ZXJgIGZ1bmN0aW9uIGludG8gYSBSZWdpc3RyeSBpcyBkZXByZWNhdGVkLiBQbGVhc2Ug
cGFzcyBpbiBhIFJlc29sdmVyIG9iamVjdCB3aXRoIGEgYHJlc29sdmVgIG1ldGhvZC4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLnJlZ2lzdHJ5LXJlc29sdmVyLWFzLWZ1bmN0aW9u
JywgdW50aWw6ICczLjAuMCcsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMv
djIueCN0b2NfcmVnaXN0cnktcmVzb2x2ZXItYXMtZnVuY3Rpb24nIH0pOworICAgIHJlZ2lzdHJ5
LnJlc29sdmVyID0geworICAgICAgcmVzb2x2ZTogcmVnaXN0cnkucmVzb2x2ZXIKKyAgICB9Owor
ICB9CisKKyAgLyoqCisgICAgR2l2ZW4gYSBmdWxsTmFtZSBhbmQgYSBzb3VyY2UgZnVsbE5hbWUg
cmV0dXJucyB0aGUgZnVsbHkgcmVzb2x2ZWQKKyAgICBmdWxsTmFtZS4gVXNlZCB0byBhbGxvdyBm
b3IgbG9jYWwgbG9va3VwLgorICAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHJlZ2lzdHJ5ID0g
bmV3IFJlZ2lzdHJ5KCk7CisgICAgIC8vIHRoZSB0d2l0dGVyIGZhY3RvcnkgaXMgYWRkZWQgdG8g
dGhlIG1vZHVsZSBzeXN0ZW0KKyAgICByZWdpc3RyeS5leHBhbmRMb2NhbExvb2t1cCgnY29tcG9u
ZW50OnBvc3QtdGl0bGUnLCB7IHNvdXJjZTogJ3RlbXBsYXRlOnBvc3QnIH0pIC8vID0+IGNvbXBv
bmVudDpwb3N0L3Bvc3QtdGl0bGUKKyAgICBgYGAKKyAgICAgQHByaXZhdGUKKyAgICBAbWV0aG9k
IGV4cGFuZExvY2FsTG9va3VwCisgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgQHBh
cmFtIHtPYmplY3R9IFtvcHRpb25zXQorICAgIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3Vy
Y2VdIHRoZSBmdWxsbmFtZSBvZiB0aGUgcmVxdWVzdCBzb3VyY2UgKHVzZWQgZm9yIGxvY2FsIGxv
b2t1cHMpCisgICAgQHJldHVybiB7U3RyaW5nfSBmdWxsTmFtZQorICAqLworICBSZWdpc3RyeS5w
cm90b3R5cGUuZXhwYW5kTG9jYWxMb29rdXAgPSBmdW5jdGlvbiBSZWdpc3RyeV9leHBhbmRMb2Nh
bExvb2t1cChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgIGlmICh0aGlzLnJlc29sdmVyICYmIHRo
aXMucmVzb2x2ZXIuZXhwYW5kTG9jYWxMb29rdXApIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdmdWxsTmFtZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRh
dGVGdWxsTmFtZShmdWxsTmFtZSkpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ29w
dGlvbnMuc291cmNlIG11c3QgYmUgcHJvdmlkZWQgdG8gZXhwYW5kTG9jYWxMb29rdXAnLCBvcHRp
b25zICYmIG9wdGlvbnMuc291cmNlKTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdv
cHRpb25zLnNvdXJjZSBtdXN0IGJlIGEgcHJvcGVyIGZ1bGwgbmFtZScsIHRoaXMudmFsaWRhdGVG
dWxsTmFtZShvcHRpb25zLnNvdXJjZSkpOworCisgICAgICB2YXIgbm9ybWFsaXplZEZ1bGxOYW1l
ID0gdGhpcy5ub3JtYWxpemUoZnVsbE5hbWUpOworICAgICAgdmFyIG5vcm1hbGl6ZWRTb3VyY2Ug
PSB0aGlzLm5vcm1hbGl6ZShvcHRpb25zLnNvdXJjZSk7CisKKyAgICAgIHJldHVybiBleHBhbmRM
b2NhbExvb2t1cCh0aGlzLCBub3JtYWxpemVkRnVsbE5hbWUsIG5vcm1hbGl6ZWRTb3VyY2UpOwor
ICAgIH0gZWxzZSBpZiAodGhpcy5mYWxsYmFjaykgeworICAgICAgcmV0dXJuIHRoaXMuZmFsbGJh
Y2suZXhwYW5kTG9jYWxMb29rdXAoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZXhwYW5kTG9jYWxM
b29rdXAocmVnaXN0cnksIG5vcm1hbGl6ZWROYW1lLCBub3JtYWxpemVkU291cmNlKSB7CisgICAg
dmFyIGNhY2hlID0gcmVnaXN0cnkuX2xvY2FsTG9va3VwQ2FjaGU7CisgICAgdmFyIG5vcm1hbGl6
ZWROYW1lQ2FjaGUgPSBjYWNoZVtub3JtYWxpemVkTmFtZV07CisKKyAgICBpZiAoIW5vcm1hbGl6
ZWROYW1lQ2FjaGUpIHsKKyAgICAgIG5vcm1hbGl6ZWROYW1lQ2FjaGUgPSBjYWNoZVtub3JtYWxp
emVkTmFtZV0gPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgIH0K
KworICAgIHZhciBjYWNoZWQgPSBub3JtYWxpemVkTmFtZUNhY2hlW25vcm1hbGl6ZWRTb3VyY2Vd
OworCisgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gY2FjaGVk
OworICAgIH0KKworICAgIHZhciBleHBhbmRlZCA9IHJlZ2lzdHJ5LnJlc29sdmVyLmV4cGFuZExv
Y2FsTG9va3VwKG5vcm1hbGl6ZWROYW1lLCBub3JtYWxpemVkU291cmNlKTsKKworICAgIHJldHVy
biBub3JtYWxpemVkTmFtZUNhY2hlW25vcm1hbGl6ZWRTb3VyY2VdID0gZXhwYW5kZWQ7CisgIH0K
KworICBmdW5jdGlvbiByZXNvbHZlKHJlZ2lzdHJ5LCBub3JtYWxpemVkTmFtZSwgb3B0aW9ucykg
eworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc291cmNlKSB7CisgICAgICAvLyB3aGVuIGBz
b3VyY2VgIGlzIHByb3ZpZGVkIGV4cGFuZCBub3JtYWxpemVkTmFtZQorICAgICAgLy8gYW5kIHNv
dXJjZSBpbnRvIHRoZSBmdWxsIG5vcm1hbGl6ZWROYW1lCisgICAgICBub3JtYWxpemVkTmFtZSA9
IHJlZ2lzdHJ5LmV4cGFuZExvY2FsTG9va3VwKG5vcm1hbGl6ZWROYW1lLCBvcHRpb25zKTsKKwor
ICAgICAgLy8gaWYgZXhwYW5kTG9jYWxMb29rdXAgcmV0dXJucyBmYWxzZXksIHdlIGRvIG5vdCBz
dXBwb3J0IGxvY2FsIGxvb2t1cAorICAgICAgaWYgKCFub3JtYWxpemVkTmFtZSkgeworICAgICAg
ICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGNhY2hlZCA9IHJlZ2lzdHJ5Ll9y
ZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdOworICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5l
ZCkgeworICAgICAgcmV0dXJuIGNhY2hlZDsKKyAgICB9CisgICAgaWYgKHJlZ2lzdHJ5Ll9mYWls
Q2FjaGVbbm9ybWFsaXplZE5hbWVdKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFy
IHJlc29sdmVkID0gdW5kZWZpbmVkOworCisgICAgaWYgKHJlZ2lzdHJ5LnJlc29sdmVyKSB7Cisg
ICAgICByZXNvbHZlZCA9IHJlZ2lzdHJ5LnJlc29sdmVyLnJlc29sdmUobm9ybWFsaXplZE5hbWUp
OworICAgIH0KKworICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXNv
bHZlZCA9IHJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbnNbbm9ybWFsaXplZE5hbWVdOworICAgIH0KKwor
ICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZWdpc3RyeS5fZmFpbENh
Y2hlW25vcm1hbGl6ZWROYW1lXSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZ2lzdHJ5
Ll9yZXNvbHZlQ2FjaGVbbm9ybWFsaXplZE5hbWVdID0gcmVzb2x2ZWQ7CisgICAgfQorCisgICAg
cmV0dXJuIHJlc29sdmVkOworICB9CisKKyAgZnVuY3Rpb24gaGFzKHJlZ2lzdHJ5LCBmdWxsTmFt
ZSwgc291cmNlKSB7CisgICAgcmV0dXJuIHJlZ2lzdHJ5LnJlc29sdmUoZnVsbE5hbWUsIHsgc291
cmNlOiBzb3VyY2UgfSkgIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIHZhciBwcml2YXRlTmFtZXMg
PSBfZW1iZXJNZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAgdmFyIHByaXZhdGVTdWZm
aXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBuZXcgRGF0ZSgpKSArICcnOworCisgIGZ1
bmN0aW9uIHByaXZhdGl6ZShfcmVmKSB7CisgICAgdmFyIGZ1bGxOYW1lID0gX3JlZlswXTsKKwor
ICAgIHZhciBuYW1lID0gcHJpdmF0ZU5hbWVzW2Z1bGxOYW1lXTsKKyAgICBpZiAobmFtZSkgewor
ICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgdmFyIF9mdWxsTmFtZSRzcGxpdCA9IGZ1
bGxOYW1lLnNwbGl0KCc6Jyk7CisKKyAgICB2YXIgdHlwZSA9IF9mdWxsTmFtZSRzcGxpdFswXTsK
KyAgICB2YXIgcmF3TmFtZSA9IF9mdWxsTmFtZSRzcGxpdFsxXTsKKworICAgIHJldHVybiBwcml2
YXRlTmFtZXNbZnVsbE5hbWVdID0gX2VtYmVyTWV0YWxVdGlscy5pbnRlcm4odHlwZSArICc6JyAr
IHJhd05hbWUgKyAnLScgKyBwcml2YXRlU3VmZml4KTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVs
dCA9IFJlZ2lzdHJ5OworfSk7CitlbmlmZWQoJ2RhZy1tYXAnLCBbJ2V4cG9ydHMnLCAndmVydGV4
JywgJ3Zpc2l0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfdmVydGV4LCBfdmlzaXQpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERBRzsKKworICAvKioKKyAgICogREFH
IHN0YW5kcyBmb3IgRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaC4KKyAgICoKKyAgICogSXQgaXMgdXNl
ZCB0byBidWlsZCBhIGdyYXBoIG9mIGRlcGVuZGVuY2llcyBjaGVja2luZyB0aGF0IHRoZXJlIGlz
bid0IGNpcmN1bGFyCisgICAqIGRlcGVuZGVuY2llcy4gcC5lIFJlZ2lzdGVyaW5nIGluaXRpYWxp
emVycyB3aXRoIGEgY2VydGFpbiBwcmVjZWRlbmNlIG9yZGVyLgorICAgKgorICAgKiBAY2xhc3Mg
REFHCisgICAqIEBjb25zdHJ1Y3RvcgorICAgKi8KKworICBmdW5jdGlvbiBEQUcoKSB7CisgICAg
dGhpcy5uYW1lcyA9IFtdOworICAgIHRoaXMudmVydGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwp
OworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSB2ZXJ0ZXggZW50cnkgdG8gdGhlIGdyYXBoIHVu
bGVzcyBpdCBpcyBhbHJlYWR5IGFkZGVkLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAbWV0
aG9kIGFkZAorICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4
IHRvIGFkZAorICAgKi8KKyAgREFHLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobmFtZSkgewor
ICAgIGlmICghbmFtZSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBhZGQgVmVydGV4
IHdpdGhvdXQgbmFtZSIpOworICAgIH0KKyAgICBpZiAodGhpcy52ZXJ0aWNlc1tuYW1lXSAhPT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNlc1tuYW1lXTsKKyAgICB9Cisg
ICAgdmFyIHZlcnRleCA9IG5ldyBfdmVydGV4LmRlZmF1bHQobmFtZSk7CisgICAgdGhpcy52ZXJ0
aWNlc1tuYW1lXSA9IHZlcnRleDsKKyAgICB0aGlzLm5hbWVzLnB1c2gobmFtZSk7CisgICAgcmV0
dXJuIHZlcnRleDsKKyAgfTsKKworICAvKioKKyAgICogQWRkcyBhIHZlcnRleCB0byB0aGUgZ3Jh
cGggYW5kIHNldHMgaXRzIHZhbHVlLgorICAgKgorICAgKiBAcHJpdmF0ZQorICAgKiBAbWV0aG9k
IG1hcAorICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4Lgor
ICAgKiBAcGFyYW0gICAgICAgICB2YWx1ZSBUaGUgdmFsdWUgdG8gcHV0IGluIHRoZSB2ZXJ0ZXgu
CisgICAqLworICBEQUcucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewor
ICAgIHRoaXMuYWRkKG5hbWUpLnZhbHVlID0gdmFsdWU7CisgIH07CisKKyAgLyoqCisgICAqIENv
bm5lY3RzIHRoZSB2ZXJ0aWNlcyB3aXRoIHRoZSBnaXZlbiBuYW1lcywgYWRkaW5nIHRoZW0gdG8g
dGhlIGdyYXBoIGlmCisgICAqIG5lY2Vzc2FyeSwgb25seSBpZiB0aGlzIGRvZXMgbm90IHByb2R1
Y2UgaXMgYW55IGNpcmN1bGFyIGRlcGVuZGVuY3kuCisgICAqCisgICAqIEBwcml2YXRlCisgICAq
IEBtZXRob2QgYWRkRWRnZQorICAgKiBAcGFyYW0ge1N0cmluZ30gZnJvbU5hbWUgVGhlIG5hbWUg
dGhlIHZlcnRleCB3aGVyZSB0aGUgZWRnZSBzdGFydHMuCisgICAqIEBwYXJhbSB7U3RyaW5nfSB0
b05hbWUgVGhlIG5hbWUgdGhlIHZlcnRleCB3aGVyZSB0aGUgZWRnZSBlbmRzLgorICAgKi8KKyAg
REFHLnByb3RvdHlwZS5hZGRFZGdlID0gZnVuY3Rpb24gKGZyb21OYW1lLCB0b05hbWUpIHsKKyAg
ICBpZiAoIWZyb21OYW1lIHx8ICF0b05hbWUgfHwgZnJvbU5hbWUgPT09IHRvTmFtZSkgeworICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgZnJvbSA9IHRoaXMuYWRkKGZyb21OYW1lKTsKKyAg
ICB2YXIgdG8gPSB0aGlzLmFkZCh0b05hbWUpOworICAgIGlmICh0by5pbmNvbWluZy5oYXNPd25Q
cm9wZXJ0eShmcm9tTmFtZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnVuY3Rpb24g
Y2hlY2tDeWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKKyAgICAgIGlmICh2ZXJ0ZXgubmFtZSA9PT0gdG9O
YW1lKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiY3ljbGUgZGV0ZWN0ZWQ6ICIgKyB0b05h
bWUgKyAiIDwtICIgKyBwYXRoLmpvaW4oIiA8LSAiKSk7CisgICAgICB9CisgICAgfQorICAgIF92
aXNpdC5kZWZhdWx0KGZyb20sIGNoZWNrQ3ljbGUpOworICAgIGZyb20uaGFzT3V0Z29pbmcgPSB0
cnVlOworICAgIHRvLmluY29taW5nW2Zyb21OYW1lXSA9IGZyb207CisgICAgdG8uaW5jb21pbmdO
YW1lcy5wdXNoKGZyb21OYW1lKTsKKyAgfTsKKworICAvKioKKyAgICogVmlzaXRzIGFsbCB0aGUg
dmVydGV4IG9mIHRoZSBncmFwaCBjYWxsaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGVhY2gg
b25lLAorICAgKiBlbnN1cmluZyB0aGF0IHRoZSB2ZXJ0aWNlcyBhcmUgdmlzaXRlZCByZXNwZWN0
aW5nIHRoZWlyIHByZWNlZGVuY2UuCisgICAqCisgICAqIEBtZXRob2QgIHRvcHNvcnQKKyAgICog
QHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgb24gZWFjaCB2
ZXJ0ZXguCisgICAqLworICBEQUcucHJvdG90eXBlLnRvcHNvcnQgPSBmdW5jdGlvbiAoZm4pIHsK
KyAgICB2YXIgdmlzaXRlZCA9IHt9OworICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7
CisgICAgdmFyIG5hbWVzID0gdGhpcy5uYW1lczsKKyAgICB2YXIgbGVuID0gbmFtZXMubGVuZ3Ro
OworICAgIHZhciBpLCB2ZXJ0ZXg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIHZlcnRleCA9IHZlcnRpY2VzW25hbWVzW2ldXTsKKyAgICAgIGlmICghdmVydGV4Lmhh
c091dGdvaW5nKSB7CisgICAgICAgIF92aXNpdC5kZWZhdWx0KHZlcnRleCwgZm4sIHZpc2l0ZWQp
OworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQWRkcyBhIHZlcnRleCB3aXRo
IHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZSB0byB0aGUgZ3JhcGggYW5kIGpvaW5zIGl0IHdpdGgg
dGhlCisgICAqIHZlcnRpY2VzIHJlZmVyZW5jZWQgaW4gX2JlZm9yZV8gYW5kIF9hZnRlcl8uIElm
IHRoZXJlIGlzbid0IHZlcnRpY2VzIHdpdGggdGhvc2UKKyAgICogbmFtZXMsIHRoZXkgYXJlIGFk
ZGVkIHRvby4KKyAgICoKKyAgICogSWYgZWl0aGVyIF9iZWZvcmVfIG9yIF9hZnRlcl8gYXJlIGZh
bHN5L2VtcHR5LCB0aGUgYWRkZWQgdmVydGV4IHdpbGwgbm90IGhhdmUKKyAgICogYW4gaW5jb21p
bmcvb3V0Z29pbmcgZWRnZS4KKyAgICoKKyAgICogQG1ldGhvZCBhZGRFZGdlcworICAgKiBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmVydGV4IHRvIGJlIGFkZGVkLgorICAg
KiBAcGFyYW0gICAgICAgICB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhhdCB2ZXJ0ZXguCisgICAqIEBw
YXJhbSAgICAgICAgYmVmb3JlIEFuIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhl
IG5hbWVzIG9mIHRoZSB2ZXJ0aWNlcyBiZWZvcmUKKyAgICogICAgICAgICAgICAgICAgICAgICAg
d2hpY2ggdGhpcyB2ZXJ0ZXggbXVzdCBiZSB2aXNpdGVkLgorICAgKiBAcGFyYW0gICAgICAgICBh
ZnRlciBBbiBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUg
dmVydGV4IGFmdGVyCisgICAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoaXMgdmVydGV4
IG11c3QgYmUgdmlzaXRlZC4KKyAgICoKKyAgICovCisgIERBRy5wcm90b3R5cGUuYWRkRWRnZXMg
PSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGJlZm9yZSwgYWZ0ZXIpIHsKKyAgICB2YXIgaTsKKyAg
ICB0aGlzLm1hcChuYW1lLCB2YWx1ZSk7CisgICAgaWYgKGJlZm9yZSkgeworICAgICAgaWYgKHR5
cGVvZiBiZWZvcmUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHRoaXMuYWRkRWRnZShuYW1lLCBi
ZWZvcmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJlZm9yZS5s
ZW5ndGg7IGkrKykgeworICAgICAgICAgIHRoaXMuYWRkRWRnZShuYW1lLCBiZWZvcmVbaV0pOwor
ICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChhZnRlcikgeworICAgICAgaWYgKHR5
cGVvZiBhZnRlciA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgdGhpcy5hZGRFZGdlKGFmdGVyLCBu
YW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhZnRlci5sZW5n
dGg7IGkrKykgeworICAgICAgICAgIHRoaXMuYWRkRWRnZShhZnRlcltpXSwgbmFtZSk7CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07Cit9KTsKK2VuaWZlZCgnZGFnLW1hcC51bWQnLCBb
J2V4cG9ydHMnLCAnZGFnLW1hcC9wbGF0Zm9ybScsICdkYWctbWFwJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZGFnTWFwUGxhdGZvcm0sIF9kYWdNYXApIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
IGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi8KKyAgaWYgKHR5
cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeworICAgIGRlZmluZShm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2RhZ01hcC5kZWZhdWx0OworICAgIH0pOworICB9
IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRz
KSB7CisgICAgbW9kdWxlLmV4cG9ydHMgPSBfZGFnTWFwLmRlZmF1bHQ7CisgIH0gZWxzZSBpZiAo
dHlwZW9mIF9kYWdNYXBQbGF0Zm9ybS5kZWZhdWx0ICE9PSAndW5kZWZpbmVkJykgeworICAgIF9k
YWdNYXBQbGF0Zm9ybS5kZWZhdWx0WydEQUcnXSA9IF9kYWdNYXAuZGVmYXVsdDsKKyAgfQorfSk7
CitlbmlmZWQoJ2RhZy1tYXAvcGxhdGZvcm0nLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9y
dHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBwbGF0Zm9ybTsKKworICAvKiBnbG9iYWwg
c2VsZiAqLworICBpZiAodHlwZW9mIHNlbGYgPT09ICdvYmplY3QnKSB7CisgICAgcGxhdGZvcm0g
PSBzZWxmOworCisgICAgLyogZ2xvYmFsIGdsb2JhbCAqLworICB9IGVsc2UgaWYgKHR5cGVvZiBn
bG9iYWwgPT09ICdvYmplY3QnKSB7CisgICAgICBwbGF0Zm9ybSA9IGdsb2JhbDsKKyAgICB9IGVs
c2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBnbG9iYWw6IGBzZWxmYCBvciBgZ2xvYmFs
YCBmb3VuZCcpOworICAgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBwbGF0Zm9ybTsKK30pOwor
ZW5pZmVkKCJkb20taGVscGVyIiwgWyJleHBvcnRzIiwgImh0bWxiYXJzLXJ1bnRpbWUvbW9ycGgi
LCAibW9ycGgtYXR0ciIsICJkb20taGVscGVyL2J1aWxkLWh0bWwtZG9tIiwgImRvbS1oZWxwZXIv
Y2xhc3NlcyIsICJkb20taGVscGVyL3Byb3AiXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9odG1sYmFy
c1J1bnRpbWVNb3JwaCwgX21vcnBoQXR0ciwgX2RvbUhlbHBlckJ1aWxkSHRtbERvbSwgX2RvbUhl
bHBlckNsYXNzZXMsIF9kb21IZWxwZXJQcm9wKSB7CisgIC8qZ2xvYmFscyBtb2R1bGUsIFVSTCov
CisKKyAgInVzZSBzdHJpY3QiOworCisgIHZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1
bmRlZmluZWQnID8gZmFsc2UgOiBkb2N1bWVudDsKKworICB2YXIgZGVsZXRlc0JsYW5rVGV4dE5v
ZGVzID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgZWxlbWVudCA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9j
dW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpKTsKKyAgICB2YXIgY2xvbmVkRWxlbWVudCA9IGVsZW1l
bnQuY2xvbmVOb2RlKHRydWUpOworICAgIHJldHVybiBjbG9uZWRFbGVtZW50LmNoaWxkTm9kZXMu
bGVuZ3RoID09PSAwOworICB9KShkb2MpOworCisgIHZhciBpZ25vcmVzQ2hlY2tlZEF0dHJpYnV0
ZSA9IGRvYyAmJiAoZnVuY3Rpb24gKGRvY3VtZW50KSB7CisgICAgdmFyIGVsZW1lbnQgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdj
aGVja2VkJywgJ2NoZWNrZWQnKTsKKyAgICB2YXIgY2xvbmVkRWxlbWVudCA9IGVsZW1lbnQuY2xv
bmVOb2RlKGZhbHNlKTsKKyAgICByZXR1cm4gIWNsb25lZEVsZW1lbnQuY2hlY2tlZDsKKyAgfSko
ZG9jKTsKKworICB2YXIgY2FuUmVtb3ZlU3ZnVmlld0JveEF0dHJpYnV0ZSA9IGRvYyAmJiAoZG9j
LmNyZWF0ZUVsZW1lbnROUyA/IChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgZWxlbWVu
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhfZG9tSGVscGVyQnVpbGRIdG1sRG9tLnN2Z05h
bWVzcGFjZSwgJ3N2ZycpOworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAg
MCAxMDAgMTAwJyk7CisgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3ZpZXdCb3gnKTsKKyAg
ICByZXR1cm4gIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94Jyk7CisgIH0pKGRvYykgOiB0
cnVlKTsKKworICB2YXIgY2FuQ2xvbmUgPSBkb2MgJiYgKGZ1bmN0aW9uIChkb2N1bWVudCkgewor
ICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgZWxl
bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpKTsKKyAgICBlbGVt
ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJykpOworICAgIHZhciBj
bG9uZWRFbGVtZW50ID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisgICAgcmV0dXJuIGNsb25l
ZEVsZW1lbnQuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUgPT09ICcgJzsKKyAgfSkoZG9jKTsKKwor
ICAvLyBUaGlzIGlzIG5vdCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LCBidXQgb2YKKyAg
Ly8gdGhlIGVsZW1lbnRzIGluc2lkZSB0aGF0IGVsZW1lbnRzLgorICBmdW5jdGlvbiBpbnRlcmlv
ck5hbWVzcGFjZShlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5uYW1lc3Bh
Y2VVUkkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3ZnTmFtZXNwYWNlICYmICFfZG9tSGVs
cGVyQnVpbGRIdG1sRG9tLnN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50c1tlbGVtZW50LnRhZ05hbWVd
KSB7CisgICAgICByZXR1cm4gX2RvbUhlbHBlckJ1aWxkSHRtbERvbS5zdmdOYW1lc3BhY2U7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIC8vIFRoZSBI
VE1MIHNwZWMgYWxsb3dzIGZvciAib21pdHRlZCBzdGFydCB0YWdzIi4gVGhlc2UgdGFncyBhcmUg
b3B0aW9uYWwKKyAgLy8gd2hlbiB0aGVpciBpbnRlbmRlZCBjaGlsZCBpcyB0aGUgZmlyc3QgdGhp
bmcgaW4gdGhlIHBhcmVudCB0YWcuIEZvcgorICAvLyBleGFtcGxlLCB0aGlzIGlzIGEgdGJvZHkg
c3RhcnQgdGFnOgorICAvLworICAvLyA8dGFibGU+CisgIC8vICAgPHRib2R5PgorICAvLyAgICAg
PHRyPgorICAvLworICAvLyBUaGUgdGJvZHkgbWF5IGJlIG9taXR0ZWQsIGFuZCB0aGUgYnJvd3Nl
ciB3aWxsIGFjY2VwdCBhbmQgcmVuZGVyOgorICAvLworICAvLyA8dGFibGU+CisgIC8vICAgPHRy
PgorICAvLworICAvLyBIb3dldmVyLCB0aGUgb21pdHRlZCBzdGFydCB0YWcgd2lsbCBzdGlsbCBi
ZSBhZGRlZCB0byB0aGUgRE9NLiBIZXJlCisgIC8vIHdlIHRlc3QgdGhlIHN0cmluZyBhbmQgY29u
dGV4dCB0byBzZWUgaWYgdGhlIGJyb3dzZXIgaXMgYWJvdXQgdG8KKyAgLy8gcGVyZm9ybSB0aGlz
IGNsZWFudXAuCisgIC8vCisgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBw
cy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3N5bnRheC5odG1sI29wdGlvbmFsLXRhZ3MKKyAgLy8g
ZGVzY3JpYmVzIHdoaWNoIHRhZ3MgYXJlIG9taXR0YWJsZS4gVGhlIHNwZWMgZm9yIHRib2R5IGFu
ZCBjb2xncm91cAorICAvLyBleHBsYWlucyB0aGlzIGJlaGF2aW9yOgorICAvLworICAvLyBodHRw
Oi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90
YWJsZXMuaHRtbCN0aGUtdGJvZHktZWxlbWVudAorICAvLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcv
c3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90YWJsZXMuaHRtbCN0aGUtY29s
Z3JvdXAtZWxlbWVudAorICAvLworCisgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZFRlc3QgPSAv
PChbXHc6XSspLzsKKyAgZnVuY3Rpb24gZGV0ZWN0T21pdHRlZFN0YXJ0VGFnKHN0cmluZywgY29u
dGV4dHVhbEVsZW1lbnQpIHsKKyAgICAvLyBPbWl0dGVkIHN0YXJ0IHRhZ3MgYXJlIG9ubHkgaW5z
aWRlIHRhYmxlIHRhZ3MuCisgICAgaWYgKGNvbnRleHR1YWxFbGVtZW50LnRhZ05hbWUgPT09ICdU
QUJMRScpIHsKKyAgICAgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZE1hdGNoID0gb21pdHRlZFN0
YXJ0VGFnQ2hpbGRUZXN0LmV4ZWMoc3RyaW5nKTsKKyAgICAgIGlmIChvbWl0dGVkU3RhcnRUYWdD
aGlsZE1hdGNoKSB7CisgICAgICAgIHZhciBvbWl0dGVkU3RhcnRUYWdDaGlsZCA9IG9taXR0ZWRT
dGFydFRhZ0NoaWxkTWF0Y2hbMV07CisgICAgICAgIC8vIEl0IGlzIGFscmVhZHkgYXNzZXJ0ZWQg
dGhhdCB0aGUgY29udGV4dHVhbCBlbGVtZW50IGlzIGEgdGFibGUKKyAgICAgICAgLy8gYW5kIG5v
dCB0aGUgcHJvcGVyIHN0YXJ0IHRhZy4gSnVzdCBzZWUgaWYgYSB0YWcgd2FzIG9taXR0ZWQuCisg
ICAgICAgIHJldHVybiBvbWl0dGVkU3RhcnRUYWdDaGlsZCA9PT0gJ3RyJyB8fCBvbWl0dGVkU3Rh
cnRUYWdDaGlsZCA9PT0gJ2NvbCc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24g
YnVpbGRTVkdET00oaHRtbCwgZG9tKSB7CisgICAgdmFyIGRpdiA9IGRvbS5kb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdkaXYnKTsKKyAgICBkaXYuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwgKyAn
PC9zdmc+JzsKKyAgICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQuY2hpbGROb2RlczsKKyAgfQorCisg
IHZhciBndWlkID0gMTsKKworICBmdW5jdGlvbiBFbGVtZW50TW9ycGgoZWxlbWVudCwgZG9tLCBu
YW1lc3BhY2UpIHsKKyAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgIHRoaXMuZG9tID0g
ZG9tOworICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOworICAgIHRoaXMuZ3VpZCA9ICJl
bGVtZW50IiArIGd1aWQrKzsKKworICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkOworICAgIHRo
aXMuaXNEaXJ0eSA9IHRydWU7CisgIH0KKworICBFbGVtZW50TW9ycGgucHJvdG90eXBlLmdldFN0
YXRlID0gZnVuY3Rpb24gKCkgeworICAgIGlmICghdGhpcy5fc3RhdGUpIHsKKyAgICAgIHRoaXMu
X3N0YXRlID0ge307CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3N0YXRlOworICB9OworCisg
IEVsZW1lbnRNb3JwaC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAobmV3U3RhdGUpIHsK
KyAgICAvKmpzaGludCAtVzA5MyAqLworCisgICAgcmV0dXJuIHRoaXMuX3N0YXRlID0gbmV3U3Rh
dGU7CisgIH07CisKKyAgLy8gcmVuZGVyQW5kQ2xlYW51cCBjYWxscyBgY2xlYXJgIG9uIGFsbCBp
dGVtcyBpbiB0aGUgbW9ycGggbWFwCisgIC8vIGp1c3QgYmVmb3JlIGNhbGxpbmcgYGRlc3Ryb3lg
IG9uIHRoZSBtb3JwaC4KKyAgLy8KKyAgLy8gQXMgYSBmdXR1cmUgcmVmYWN0b3IgdGhpcyBjb3Vs
ZCBiZSBjaGFuZ2VkIHRvIHNldCB0aGUgcHJvcGVydHkKKyAgLy8gYmFjayB0byBpdHMgb3JpZ2lu
YWwvZGVmYXVsdCB2YWx1ZS4KKyAgRWxlbWVudE1vcnBoLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0
aW9uICgpIHt9OworCisgIEVsZW1lbnRNb3JwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB0aGlzLmVsZW1lbnQgPSBudWxsOworICAgIHRoaXMuZG9tID0gbnVsbDsKKyAg
fTsKKworICAvKgorICAgKiBBIGNsYXNzIHdyYXBwaW5nIERPTSBmdW5jdGlvbnMgdG8gYWRkcmVz
cyBlbnZpcm9ubWVudCBjb21wYXRpYmlsaXR5LAorICAgKiBuYW1lc3BhY2VzLCBjb250ZXh0dWFs
IGVsZW1lbnRzIGZvciBtb3JwaCB1bi1lc2NhcGVkIGNvbnRlbnQKKyAgICogaW5zZXJ0aW9uLgor
ICAgKgorICAgKiBXaGVuIGVudGVyaW5nIGEgdGVtcGxhdGUsIGEgRE9NSGVscGVyIHNob3VsZCBi
ZSBwYXNzZWQ6CisgICAqCisgICAqICAgdGVtcGxhdGUoY29udGV4dCwgeyBob29rczogaG9va3Ms
IGRvbTogbmV3IERPTUhlbHBlcigpIH0pOworICAgKgorICAgKiBUT0RPOiBzdXBwb3J0IGZvcmVp
Z25PYmplY3QgYXMgYSBwYXNzZWQgY29udGV4dHVhbCBlbGVtZW50LiBJdCBoYXMKKyAgICogYSBu
YW1lc3BhY2UgKHN2ZykgdGhhdCBkb2VzIG5vdCBtYXRjaCBpdHMgaW50ZXJuYWwgbmFtZXNwYWNl
CisgICAqICh4aHRtbCkuCisgICAqCisgICAqIEBjbGFzcyBET01IZWxwZXIKKyAgICogQGNvbnN0
cnVjdG9yCisgICAqIEBwYXJhbSB7SFRNTERvY3VtZW50fSBfZG9jdW1lbnQgVGhlIGRvY3VtZW50
IERPTSBtZXRob2RzIGFyZSBwcm94aWVkIHRvCisgICAqLworICBmdW5jdGlvbiBET01IZWxwZXIo
X2RvY3VtZW50KSB7CisgICAgdGhpcy5kb2N1bWVudCA9IF9kb2N1bWVudCB8fCBkb2N1bWVudDsK
KyAgICBpZiAoIXRoaXMuZG9jdW1lbnQpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQSBkb2N1
bWVudCBvYmplY3QgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIERPTUhlbHBlciwgb3IgYXZhaWxhYmxl
IG9uIHRoZSBnbG9iYWwgc2NvcGUiKTsKKyAgICB9CisgICAgdGhpcy5jYW5DbG9uZSA9IGNhbkNs
b25lOworICAgIHRoaXMubmFtZXNwYWNlID0gbnVsbDsKKworICAgIGluc3RhbGxFbnZpcm9ubWVu
dFNwZWNpZmljTWV0aG9kcyh0aGlzKTsKKyAgfQorCisgIHZhciBwcm90b3R5cGUgPSBET01IZWxw
ZXIucHJvdG90eXBlOworICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBET01IZWxwZXI7CisKKyAg
cHJvdG90eXBlLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24gKGlkLCByb290Tm9kZSkgeworICAg
IHJvb3ROb2RlID0gcm9vdE5vZGUgfHwgdGhpcy5kb2N1bWVudDsKKyAgICByZXR1cm4gcm9vdE5v
ZGUuZ2V0RWxlbWVudEJ5SWQoaWQpOworICB9OworCisgIHByb3RvdHlwZS5pbnNlcnRCZWZvcmUg
PSBmdW5jdGlvbiAoZWxlbWVudCwgY2hpbGRFbGVtZW50LCByZWZlcmVuY2VDaGlsZCkgeworICAg
IHJldHVybiBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZEVsZW1lbnQsIHJlZmVyZW5jZUNoaWxk
KTsKKyAgfTsKKworICBwcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAoZWxlbWVudCwg
Y2hpbGRFbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVt
ZW50KTsKKyAgfTsKKworICB2YXIgaXRlbUF0OworCisgIC8vIEl0IGFwcGVhcnMgdGhhdCBzb21l
dGltZXMsIGluIHlldCB0byBiZSBpdGVudGlmaWVkIHNjZW5hcmlvcyBQaGFudG9tSlMgMi4wCisg
IC8vIGNyYXNoZXMgb24gY2hpbGROb2Rlcy5pdGVtKGluZGV4KSwgYnV0IHdvcmtzIGFzIGV4cGVj
dGVkIHdpdGggY2hpbGROb2Rlc1tpbmRleF07CisgIC8vCisgIC8vIEFsdGhvdWdoIGl0IHdvdWxk
IGJlIG5pY2UgdG8gbW92ZSB0byBjaGlsZE5vZGVzW2luZGV4XSBpbiBhbGwgc2NlbmFyaW9zLAor
ICAvLyB0aGlzIHdvdWxkIHJlcXVpcmUgU2ltcGxlRE9NIHRvIG1haW50YWluIHRoZSBjaGlsZE5v
ZGVzIGFycmF5LiBUaGlzIHdvdWxkIGJlCisgIC8vIHF1aXRlIGNvc3RseSwgaW4gYm90aCBkZXYg
dGltZSBhbmQgcnVudGltZS4KKyAgLy8KKyAgLy8gU28gaW5zdGVhZCwgd2UgY2hvb3NlIHRoZSBi
ZXN0IHBvc3NpYmxlIG1ldGhvZCBhbmQgY2FsbCBpdCBhIGRheS4KKyAgLy8KKyAgLypnbG9iYWwg
bmF2aWdhdG9yICovCisgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBu
YXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1BoYW50b21KUycpKSB7CisgICAgaXRlbUF0ID0g
ZnVuY3Rpb24gKG5vZGVzLCBpbmRleCkgeworICAgICAgcmV0dXJuIG5vZGVzW2luZGV4XTsKKyAg
ICB9OworICB9IGVsc2UgeworICAgIGl0ZW1BdCA9IGZ1bmN0aW9uIChub2RlcywgaW5kZXgpIHsK
KyAgICAgIHJldHVybiBub2Rlcy5pdGVtKGluZGV4KTsKKyAgICB9OworICB9CisKKyAgcHJvdG90
eXBlLmNoaWxkQXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgaW5kaWNlcykgeworICAgIHZhciBjaGls
ZCA9IGVsZW1lbnQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBp
KyspIHsKKyAgICAgIGNoaWxkID0gaXRlbUF0KGNoaWxkLmNoaWxkTm9kZXMsIGluZGljZXNbaV0p
OworICAgIH0KKworICAgIHJldHVybiBjaGlsZDsKKyAgfTsKKworICAvLyBOb3RlIHRvIGEgRmVs
bG93IEltcGxlbWVudG9yOgorICAvLyBBaGgsIGFjY2Vzc2luZyBhIGNoaWxkIG5vZGUgYXQgYW4g
aW5kZXguIFNlZW1zIGxpa2UgaXQgc2hvdWxkIGJlIHNvIHNpbXBsZSwKKyAgLy8gZG9lc24ndCBp
dD8gVW5mb3J0dW5hdGVseSwgdGhpcyBwYXJ0aWN1bGFyIG1ldGhvZCBoYXMgY2F1c2VkIHVzIGEg
c3VycHJpc2luZworICAvLyBhbW91bnQgb2YgcGFpbi4gQXMgeW91J2xsIG5vdGUgYmVsb3csIHRo
aXMgbWV0aG9kIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdhbGsKKyAgLy8gdGhlIGxpbmtlZCBsaXN0
IG9mIGNoaWxkIG5vZGVzIHJhdGhlciB0aGFuIGFjY2VzcyB0aGUgY2hpbGQgYnkgaW5kZXgKKyAg
Ly8gZGlyZWN0bHksIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSB0d28gKDIpIEFQSXMgaW4gdGhlIERP
TSB0aGF0IGRvIHRoaXMgZm9yIHVzLgorICAvLyBJZiB5b3UncmUgdGhpbmtpbmcgdG8geW91cnNl
bGYsICJXaGF0IGFuIG92ZXJzaWdodCEgV2hhdCBhbiBvcHBvcnR1bml0eSB0bworICAvLyBvcHRp
bWl6ZSB0aGlzIGNvZGUhIiB0aGVuIHRvIHlvdSBJIHNheTogc3RvcCEgRm9yIEkgaGF2ZSBhIHRh
bGUgdG8gdGVsbC4KKyAgLy8KKyAgLy8gRmlyc3QsIHRoaXMgY29kZSBtdXN0IGJlIGNvbXBhdGli
bGUgd2l0aCBzaW1wbGUtZG9tIGZvciByZW5kZXJpbmcgb24gdGhlCisgIC8vIHNlcnZlciB3aGVy
ZSB0aGVyZSBpcyBubyByZWFsIERPTS4gUHJldmlvdXNseSwgd2UgYWNjZXNzZWQgYSBjaGlsZCBu
b2RlCisgIC8vIGRpcmVjdGx5IHZpYSBgZWxlbWVudC5jaGlsZE5vZGVzW2luZGV4XWAuIFdoaWxl
IHdlICpjb3VsZCogaW4gdGhlb3J5IGRvIGEKKyAgLy8gZnVsbC1maWRlbGl0eSBzaW11bGF0aW9u
IG9mIGEgbGl2ZSBgY2hpbGROb2Rlc2AgYXJyYXksIHRoaXMgaXMgc2xvdywKKyAgLy8gY29tcGxp
Y2F0ZWQgYW5kIGVycm9yLXByb25lLgorICAvLworICAvLyAiTm8gcHJvYmxlbSwiIHdlIHRob3Vn
aHQsICJ3ZSdsbCBqdXN0IHVzZSB0aGUgc2ltaWxhcgorICAvLyBgY2hpbGROb2Rlcy5pdGVtKGlu
ZGV4KWAgQVBJLiIgVGhlbiwgd2UgY291bGQganVzdCBpbXBsZW1lbnQgb3VyIG93biBgaXRlbWAK
KyAgLy8gbWV0aG9kIGluIHNpbXBsZS1kb20gYW5kIHdhbGsgdGhlIGNoaWxkIG5vZGUgbGlua2Vk
IGxpc3QgdGhlcmUsIGFsbG93aW5nCisgIC8vIHVzIHRvIHJldGFpbiB0aGUgcGVyZm9ybWFuY2Ug
YWR2YW50YWdlcyBvZiB0aGUgKHN1cmVseSBvcHRpbWl6ZWQpIGBpdGVtKClgCisgIC8vIEFQSSBp
biB0aGUgYnJvd3Nlci4KKyAgLy8KKyAgLy8gVW5mb3J0dW5hdGVseSwgYW4gZW50ZXJwcmlzaW5n
IHNvdWwgbmFtZWQgU2FteSBBbHphaHJhbmkgZGlzY292ZXJlZCB0aGF0IGluCisgIC8vIElFOCwg
YWNjZXNzaW5nIGFuIGl0ZW0gb3V0LW9mLWJvdW5kcyB2aWEgYGl0ZW0oKWAgY2F1c2VzIGFuIGV4
Y2VwdGlvbiB3aGVyZQorICAvLyBvdGhlciBicm93c2VycyByZXR1cm4gbnVsbC4gVGhpcyBuZWNl
c3NpdGF0ZWQgYS4uLiBjaGVjayBvZgorICAvLyBgY2hpbGROb2Rlcy5sZW5ndGhgLCBicmluZ2lu
ZyB1cyBiYWNrIGFyb3VuZCB0byBoYXZpbmcgdG8gc3VwcG9ydCBhCisgIC8vIGZ1bGwtZmlkZWxp
dHkgYGNoaWxkTm9kZXNgIGFycmF5IQorICAvLworICAvLyBXb3JzdCBvZiBhbGwsIEtyaXMgU2Vs
ZGVuIGludmVzdGlnYXRlZCBob3cgYnJvd3NlcnMgYXJlIGFjdHVhbHkgaW1wbGVtZW50ZWQKKyAg
Ly8gYW5kIGRpc2NvdmVyZWQgdGhhdCB0aGV5J3JlIGFsbCBsaW5rZWQgbGlzdHMgdW5kZXIgdGhl
IGhvb2QgYW55d2F5LiBBY2Nlc3NpbmcKKyAgLy8gYGNoaWxkTm9kZXNgIHJlcXVpcmVzIHRoZW0g
dG8gYWxsb2NhdGUgYSBuZXcgbGl2ZSBjb2xsZWN0aW9uIGJhY2tlZCBieSB0aGF0CisgIC8vIGxp
bmtlZCBsaXN0LCB3aGljaCBpcyBpdHNlbGYgYSByYXRoZXIgZXhwZW5zaXZlIG9wZXJhdGlvbi4g
T3VyIGFzc3VtZWQKKyAgLy8gb3B0aW1pemF0aW9uIGhhZCBiYWNrZmlyZWQhIFRoYXQgaXMgdGhl
IGRhbmdlciBvZiBtYWdpY2FsIHRoaW5raW5nIGFib3V0CisgIC8vIHRoZSBwZXJmb3JtYW5jZSBv
ZiBuYXRpdmUgaW1wbGVtZW50YXRpb25zLgorICAvLworICAvLyBBbmQgdGhpcywgbXkgZnJpZW5k
cywgaXMgd2h5IHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24ganVzdCB3YWxrcyB0aGUKKyAg
Ly8gbGlua2VkIGxpc3QsIGFzIHN1cnByaXNlZCBhcyB0aGF0IG1heSBtYWtlIHlvdS4gUGxlYXNl
IGVuc3VyZSB5b3UgdW5kZXJzdGFuZAorICAvLyB0aGUgYWJvdmUgYmVmb3JlIGNoYW5naW5nIHRo
aXMgYW5kIHN1Ym1pdHRpbmcgYSBQUi4KKyAgLy8KKyAgLy8gVG9tIERhbGUsIEphbnVhcnkgMTh0
aCwgMjAxNSwgUG9ydGxhbmQgT1IKKyAgcHJvdG90eXBlLmNoaWxkQXRJbmRleCA9IGZ1bmN0aW9u
IChlbGVtZW50LCBpbmRleCkgeworICAgIHZhciBub2RlID0gZWxlbWVudC5maXJzdENoaWxkOwor
CisgICAgZm9yICh2YXIgaWR4ID0gMDsgbm9kZSAmJiBpZHggPCBpbmRleDsgaWR4KyspIHsKKyAg
ICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworICAgIH0KKworICAgIHJldHVybiBub2RlOwor
ICB9OworCisgIHByb3RvdHlwZS5hcHBlbmRUZXh0ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHRleHQp
IHsKKyAgICByZXR1cm4gZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmNyZWF0ZVRl
eHROb2RlKHRleHQpKTsKKyAgfTsKKworICBwcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rp
b24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFt
ZSwgU3RyaW5nKHZhbHVlKSk7CisgIH07CisKKyAgcHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1
bmN0aW9uIChlbGVtZW50LCBuYW1lKSB7CisgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRl
KG5hbWUpOworICB9OworCisgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChl
bGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7CisgICAgZWxlbWVudC5zZXRBdHRyaWJ1
dGVOUyhuYW1lc3BhY2UsIG5hbWUsIFN0cmluZyh2YWx1ZSkpOworICB9OworCisgIHByb3RvdHlw
ZS5nZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpIHsK
KyAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUpOworICB9
OworCisgIGlmIChjYW5SZW1vdmVTdmdWaWV3Qm94QXR0cmlidXRlKSB7CisgICAgcHJvdG90eXBl
LnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lKSB7CisgICAgICBlbGVt
ZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9OworICB9IGVsc2UgeworICAgIHByb3Rv
dHlwZS5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgeworICAgICAg
aWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ3N2ZycgJiYgbmFtZSA9PT0gJ3ZpZXdCb3gnKSB7Cisg
ICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG51bGwpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICB9CisgICAgfTsK
KyAgfQorCisgIHByb3RvdHlwZS5zZXRQcm9wZXJ0eVN0cmljdCA9IGZ1bmN0aW9uIChlbGVtZW50
LCBuYW1lLCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICB2
YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgaWYgKHZhbHVlID09PSBudWxsICYmIChuYW1lID09
PSAndmFsdWUnIHx8IG5hbWUgPT09ICd0eXBlJyB8fCBuYW1lID09PSAnc3JjJykpIHsKKyAgICAg
IHZhbHVlID0gJyc7CisgICAgfQorCisgICAgZWxlbWVudFtuYW1lXSA9IHZhbHVlOworICB9Owor
CisgIHByb3RvdHlwZS5nZXRQcm9wZXJ0eVN0cmljdCA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1l
KSB7CisgICAgcmV0dXJuIGVsZW1lbnRbbmFtZV07CisgIH07CisKKyAgcHJvdG90eXBlLnNldFBy
b3BlcnR5ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpIHsKKyAg
ICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3Zn
TmFtZXNwYWNlKSB7CisgICAgICBpZiAoX2RvbUhlbHBlclByb3AuaXNBdHRyUmVtb3ZhbFZhbHVl
KHZhbHVlKSkgeworICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIGlmIChuYW1lc3BhY2UpIHsKKyAgICAgICAgICBlbGVtZW50LnNl
dEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQor
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgX25vcm1hbGl6ZVByb3BlcnR5ID0gX2Rv
bUhlbHBlclByb3Aubm9ybWFsaXplUHJvcGVydHkoZWxlbWVudCwgbmFtZSk7CisKKyAgICAgIHZh
ciBub3JtYWxpemVkID0gX25vcm1hbGl6ZVByb3BlcnR5Lm5vcm1hbGl6ZWQ7CisgICAgICB2YXIg
dHlwZSA9IF9ub3JtYWxpemVQcm9wZXJ0eS50eXBlOworCisgICAgICBpZiAodHlwZSA9PT0gJ3By
b3AnKSB7CisgICAgICAgIGVsZW1lbnRbbm9ybWFsaXplZF0gPSB2YWx1ZTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIGlmIChfZG9tSGVscGVyUHJvcC5pc0F0dHJSZW1vdmFsVmFsdWUodmFsdWUp
KSB7CisgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgaWYgKG5hbWVzcGFjZSAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZU5T
KSB7CisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwg
dmFsdWUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJp
YnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAg
fQorICB9OworCisgIGlmIChkb2MgJiYgZG9jLmNyZWF0ZUVsZW1lbnROUykgeworICAgIC8vIE9u
bHkgb3B0IGludG8gbmFtZXNwYWNlIGRldGVjdGlvbiBpZiBhIGNvbnRleHR1YWxFbGVtZW50Cisg
ICAgLy8gaXMgcGFzc2VkLgorICAgIHByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24g
KHRhZ05hbWUsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5uYW1lc3BhY2U7CisgICAgICBpZiAoY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgaWYg
KHRhZ05hbWUgPT09ICdzdmcnKSB7CisgICAgICAgICAgbmFtZXNwYWNlID0gX2RvbUhlbHBlckJ1
aWxkSHRtbERvbS5zdmdOYW1lc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmFt
ZXNwYWNlID0gaW50ZXJpb3JOYW1lc3BhY2UoY29udGV4dHVhbEVsZW1lbnQpOworICAgICAgICB9
CisgICAgICB9CisgICAgICBpZiAobmFtZXNwYWNlKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIHRhZ05hbWUpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsK
KyAgICAgIH0KKyAgICB9OworICAgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9u
IChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7CisgICAgICBlbGVtZW50LnNldEF0
dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgU3RyaW5nKHZhbHVlKSk7CisgICAgfTsKKyAgfSBl
bHNlIHsKKyAgICBwcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lKSB7
CisgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOworICAg
IH07CisgICAgcHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5h
bWVzcGFjZSwgbmFtZSwgdmFsdWUpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUs
IFN0cmluZyh2YWx1ZSkpOworICAgIH07CisgIH0KKworICBwcm90b3R5cGUuYWRkQ2xhc3NlcyA9
IF9kb21IZWxwZXJDbGFzc2VzLmFkZENsYXNzZXM7CisgIHByb3RvdHlwZS5yZW1vdmVDbGFzc2Vz
ID0gX2RvbUhlbHBlckNsYXNzZXMucmVtb3ZlQ2xhc3NlczsKKworICBwcm90b3R5cGUuc2V0TmFt
ZXNwYWNlID0gZnVuY3Rpb24gKG5zKSB7CisgICAgdGhpcy5uYW1lc3BhY2UgPSBuczsKKyAgfTsK
KworICBwcm90b3R5cGUuZGV0ZWN0TmFtZXNwYWNlID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAg
ICB0aGlzLm5hbWVzcGFjZSA9IGludGVyaW9yTmFtZXNwYWNlKGVsZW1lbnQpOworICB9OworCisg
IHByb3RvdHlwZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gKCkgeworICAgIHJl
dHVybiB0aGlzLmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgfTsKKworICBw
cm90b3R5cGUuY3JlYXRlVGV4dE5vZGUgPSBmdW5jdGlvbiAodGV4dCkgeworICAgIHJldHVybiB0
aGlzLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOworICB9OworCisgIHByb3RvdHlwZS5j
cmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKHRleHQpIHsKKyAgICByZXR1cm4gdGhpcy5kb2N1bWVu
dC5jcmVhdGVDb21tZW50KHRleHQpOworICB9OworCisgIHByb3RvdHlwZS5yZXBhaXJDbG9uZWRO
b2RlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGJsYW5rQ2hpbGRUZXh0Tm9kZXMsIGlzQ2hlY2tlZCkg
eworICAgIGlmIChkZWxldGVzQmxhbmtUZXh0Tm9kZXMgJiYgYmxhbmtDaGlsZFRleHROb2Rlcy5s
ZW5ndGggPiAwKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmxhbmtDaGlsZFRleHRO
b2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2YXIgdGV4dE5vZGUgPSB0aGlz
LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSwKKyAgICAgICAgICAgIG9mZnNldCA9IGJsYW5r
Q2hpbGRUZXh0Tm9kZXNbaV0sCisgICAgICAgICAgICBiZWZvcmUgPSB0aGlzLmNoaWxkQXRJbmRl
eChlbGVtZW50LCBvZmZzZXQpOworICAgICAgICBpZiAoYmVmb3JlKSB7CisgICAgICAgICAgZWxl
bWVudC5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGJlZm9yZSk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICB9CisgICAgaWYgKGlnbm9yZXNDaGVja2VkQXR0cmlidXRlICYmIGlzQ2hlY2tlZCkg
eworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOworICAg
IH0KKyAgfTsKKworICBwcm90b3R5cGUuY2xvbmVOb2RlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGRl
ZXApIHsKKyAgICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSghIWRlZXApOworICAgIHJl
dHVybiBjbG9uZTsKKyAgfTsKKworICBwcm90b3R5cGUuQXR0ck1vcnBoQ2xhc3MgPSBfbW9ycGhB
dHRyLmRlZmF1bHQ7CisKKyAgcHJvdG90eXBlLmNyZWF0ZUF0dHJNb3JwaCA9IGZ1bmN0aW9uIChl
bGVtZW50LCBhdHRyTmFtZSwgbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIHRoaXMuQXR0ck1vcnBo
Q2xhc3MuY3JlYXRlKGVsZW1lbnQsIGF0dHJOYW1lLCB0aGlzLCBuYW1lc3BhY2UpOworICB9Owor
CisgIHByb3RvdHlwZS5FbGVtZW50TW9ycGhDbGFzcyA9IEVsZW1lbnRNb3JwaDsKKworICBwcm90
b3R5cGUuY3JlYXRlRWxlbWVudE1vcnBoID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWVzcGFjZSkg
eworICAgIHJldHVybiBuZXcgdGhpcy5FbGVtZW50TW9ycGhDbGFzcyhlbGVtZW50LCB0aGlzLCBu
YW1lc3BhY2UpOworICB9OworCisgIHByb3RvdHlwZS5jcmVhdGVVbnNhZmVBdHRyTW9ycGggPSBm
dW5jdGlvbiAoZWxlbWVudCwgYXR0ck5hbWUsIG5hbWVzcGFjZSkgeworICAgIHZhciBtb3JwaCA9
IHRoaXMuY3JlYXRlQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBuYW1lc3BhY2UpOworICAg
IG1vcnBoLmVzY2FwZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgcHJv
dG90eXBlLk1vcnBoQ2xhc3MgPSBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVsdDsKKworICBw
cm90b3R5cGUuY3JlYXRlTW9ycGggPSBmdW5jdGlvbiAocGFyZW50LCBzdGFydCwgZW5kLCBjb250
ZXh0dWFsRWxlbWVudCkgeworICAgIGlmIChjb250ZXh0dWFsRWxlbWVudCAmJiBjb250ZXh0dWFs
RWxlbWVudC5ub2RlVHlwZSA9PT0gMTEpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90
IHBhc3MgYSBmcmFnbWVudCBhcyB0aGUgY29udGV4dHVhbCBlbGVtZW50IHRvIGNyZWF0ZU1vcnBo
Iik7CisgICAgfQorCisgICAgaWYgKCFjb250ZXh0dWFsRWxlbWVudCAmJiBwYXJlbnQgJiYgcGFy
ZW50Lm5vZGVUeXBlID09PSAxKSB7CisgICAgICBjb250ZXh0dWFsRWxlbWVudCA9IHBhcmVudDsK
KyAgICB9CisgICAgdmFyIG1vcnBoID0gbmV3IHRoaXMuTW9ycGhDbGFzcyh0aGlzLCBjb250ZXh0
dWFsRWxlbWVudCk7CisgICAgbW9ycGguZmlyc3ROb2RlID0gc3RhcnQ7CisgICAgbW9ycGgubGFz
dE5vZGUgPSBlbmQ7CisgICAgcmV0dXJuIG1vcnBoOworICB9OworCisgIHByb3RvdHlwZS5jcmVh
dGVGcmFnbWVudE1vcnBoID0gZnVuY3Rpb24gKGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgaWYg
KGNvbnRleHR1YWxFbGVtZW50ICYmIGNvbnRleHR1YWxFbGVtZW50Lm5vZGVUeXBlID09PSAxMSkg
eworICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGFzcyBhIGZyYWdtZW50IGFzIHRoZSBj
b250ZXh0dWFsIGVsZW1lbnQgdG8gY3JlYXRlTW9ycGgiKTsKKyAgICB9CisKKyAgICB2YXIgZnJh
Z21lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICByZXR1cm4gX2h0bWxi
YXJzUnVudGltZU1vcnBoLmRlZmF1bHQuY3JlYXRlKHRoaXMsIGNvbnRleHR1YWxFbGVtZW50LCBm
cmFnbWVudCk7CisgIH07CisKKyAgcHJvdG90eXBlLnJlcGxhY2VDb250ZW50V2l0aE1vcnBoID0g
ZnVuY3Rpb24gKGVsZW1lbnQpIHsKKyAgICB2YXIgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZmlyc3RD
aGlsZDsKKworICAgIGlmICghZmlyc3RDaGlsZCkgeworICAgICAgdmFyIGNvbW1lbnQgPSB0aGlz
LmNyZWF0ZUNvbW1lbnQoJycpOworICAgICAgdGhpcy5hcHBlbmRDaGlsZChlbGVtZW50LCBjb21t
ZW50KTsKKyAgICAgIHJldHVybiBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVsdC5jcmVhdGUo
dGhpcywgZWxlbWVudCwgY29tbWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBtb3JwaCA9
IF9odG1sYmFyc1J1bnRpbWVNb3JwaC5kZWZhdWx0LmF0dGFjaCh0aGlzLCBlbGVtZW50LCBmaXJz
dENoaWxkLCBlbGVtZW50Lmxhc3RDaGlsZCk7CisgICAgICBtb3JwaC5jbGVhcigpOworICAgICAg
cmV0dXJuIG1vcnBoOworICAgIH0KKyAgfTsKKworICBwcm90b3R5cGUuY3JlYXRlVW5zYWZlTW9y
cGggPSBmdW5jdGlvbiAocGFyZW50LCBzdGFydCwgZW5kLCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgIHZhciBtb3JwaCA9IHRoaXMuY3JlYXRlTW9ycGgocGFyZW50LCBzdGFydCwgZW5kLCBjb250
ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGgucGFyc2VUZXh0QXNIVE1MID0gdHJ1ZTsKKyAgICBy
ZXR1cm4gbW9ycGg7CisgIH07CisKKyAgLy8gVGhpcyBoZWxwZXIgaXMganVzdCB0byBrZWVwIHRo
ZSB0ZW1wbGF0ZXMgZ29vZCBsb29raW5nLAorICAvLyBwYXNzaW5nIGludGVnZXJzIGluc3RlYWQg
b2YgZWxlbWVudCByZWZlcmVuY2VzLgorICBwcm90b3R5cGUuY3JlYXRlTW9ycGhBdCA9IGZ1bmN0
aW9uIChwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgIHZhciBzaW5nbGUgPSBzdGFydEluZGV4ID09PSBlbmRJbmRleDsKKyAgICB2YXIgc3RhcnQg
PSB0aGlzLmNoaWxkQXRJbmRleChwYXJlbnQsIHN0YXJ0SW5kZXgpOworICAgIHZhciBlbmQgPSBz
aW5nbGUgPyBzdGFydCA6IHRoaXMuY2hpbGRBdEluZGV4KHBhcmVudCwgZW5kSW5kZXgpOworICAg
IHJldHVybiB0aGlzLmNyZWF0ZU1vcnBoKHBhcmVudCwgc3RhcnQsIGVuZCwgY29udGV4dHVhbEVs
ZW1lbnQpOworICB9OworCisgIHByb3RvdHlwZS5jcmVhdGVVbnNhZmVNb3JwaEF0ID0gZnVuY3Rp
b24gKHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIGNvbnRleHR1YWxFbGVtZW50KSB7Cisg
ICAgdmFyIG1vcnBoID0gdGhpcy5jcmVhdGVNb3JwaEF0KHBhcmVudCwgc3RhcnRJbmRleCwgZW5k
SW5kZXgsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICBtb3JwaC5wYXJzZVRleHRBc0hUTUwgPSB0
cnVlOworICAgIHJldHVybiBtb3JwaDsKKyAgfTsKKworICBwcm90b3R5cGUuaW5zZXJ0TW9ycGhC
ZWZvcmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgcmVmZXJlbmNlQ2hpbGQsIGNvbnRleHR1YWxFbGVt
ZW50KSB7CisgICAgdmFyIGluc2VydGlvbiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgn
Jyk7CisgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoaW5zZXJ0aW9uLCByZWZlcmVuY2VDaGlsZCk7
CisgICAgcmV0dXJuIHRoaXMuY3JlYXRlTW9ycGgoZWxlbWVudCwgaW5zZXJ0aW9uLCBpbnNlcnRp
b24sIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgfTsKKworICBwcm90b3R5cGUuYXBwZW5kTW9ycGgg
PSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgaW5zZXJ0
aW9uID0gdGhpcy5kb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTsKKyAgICBlbGVtZW50LmFwcGVu
ZENoaWxkKGluc2VydGlvbik7CisgICAgcmV0dXJuIHRoaXMuY3JlYXRlTW9ycGgoZWxlbWVudCwg
aW5zZXJ0aW9uLCBpbnNlcnRpb24sIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgfTsKKworICBwcm90
b3R5cGUuaW5zZXJ0Qm91bmRhcnkgPSBmdW5jdGlvbiAoZnJhZ21lbnQsIGluZGV4KSB7CisgICAg
Ly8gdGhpcyB3aWxsIGFsd2F5cyBiZSBudWxsIG9yIGZpcnN0Q2hpbGQKKyAgICB2YXIgY2hpbGQg
PSBpbmRleCA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLmNoaWxkQXRJbmRleChmcmFnbWVudCwgaW5k
ZXgpOworICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmNyZWF0ZVRleHROb2Rl
KCcnKSwgY2hpbGQpOworICB9OworCisgIHByb3RvdHlwZS5zZXRNb3JwaEhUTUwgPSBmdW5jdGlv
biAobW9ycGgsIGh0bWwpIHsKKyAgICBtb3JwaC5zZXRIVE1MKGh0bWwpOworICB9OworCisgIHBy
b3RvdHlwZS5wYXJzZUhUTUwgPSBmdW5jdGlvbiAoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpIHsK
KyAgICB2YXIgY2hpbGROb2RlczsKKworICAgIGlmIChpbnRlcmlvck5hbWVzcGFjZShjb250ZXh0
dWFsRWxlbWVudCkgPT09IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uc3ZnTmFtZXNwYWNlKSB7Cisg
ICAgICBjaGlsZE5vZGVzID0gYnVpbGRTVkdET00oaHRtbCwgdGhpcyk7CisgICAgfSBlbHNlIHsK
KyAgICAgIHZhciBub2RlcyA9IF9kb21IZWxwZXJCdWlsZEh0bWxEb20uYnVpbGRIVE1MRE9NKGh0
bWwsIGNvbnRleHR1YWxFbGVtZW50LCB0aGlzKTsKKyAgICAgIGlmIChkZXRlY3RPbWl0dGVkU3Rh
cnRUYWcoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpKSB7CisgICAgICAgIHZhciBub2RlID0gbm9k
ZXNbMF07CisgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUubm9kZVR5cGUgIT09IDEpIHsKKyAg
ICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgICAgfQorICAgICAgICBjaGls
ZE5vZGVzID0gbm9kZS5jaGlsZE5vZGVzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hpbGRO
b2RlcyA9IG5vZGVzOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvcHkgbm9kZSBsaXN0IHRv
IGEgZnJhZ21lbnQuCisgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVEb2N1
bWVudEZyYWdtZW50KCk7CisKKyAgICBpZiAoY2hpbGROb2RlcyAmJiBjaGlsZE5vZGVzLmxlbmd0
aCA+IDApIHsKKyAgICAgIHZhciBjdXJyZW50Tm9kZSA9IGNoaWxkTm9kZXNbMF07CisKKyAgICAg
IC8vIFdlIHByZXBlbmQgYW4gPG9wdGlvbj4gdG8gPHNlbGVjdD4gYm94ZXMgdG8gYWJzb3JiIGFu
eSBicm93c2VyIGJ1Z3MKKyAgICAgIC8vIHJlbGF0ZWQgdG8gYXV0by1zZWxlY3QgYmVoYXZpb3Iu
IFNraXAgcGFzdCBpdC4KKyAgICAgIGlmIChjb250ZXh0dWFsRWxlbWVudC50YWdOYW1lID09PSAn
U0VMRUNUJykgeworICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5n
OworICAgICAgfQorCisgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKKyAgICAgICAgdmFyIHRl
bXBOb2RlID0gY3VycmVudE5vZGU7CisgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUu
bmV4dFNpYmxpbmc7CisKKyAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcE5vZGUpOwor
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmcmFnbWVudDsKKyAgfTsKKworICB2YXIgbm9k
ZVVSTDsKKyAgdmFyIHBhcnNpbmdOb2RlOworCisgIGZ1bmN0aW9uIGluc3RhbGxFbnZpcm9ubWVu
dFNwZWNpZmljTWV0aG9kcyhkb21IZWxwZXIpIHsKKyAgICB2YXIgcHJvdG9jb2wgPSBicm93c2Vy
UHJvdG9jb2xGb3JVUkwuY2FsbChkb21IZWxwZXIsICdmb29iYXI6YmF6Jyk7CisKKyAgICAvLyBU
ZXN0IHRvIHNlZSBpZiBvdXIgRE9NIGltcGxlbWVudGF0aW9uIHBhcnNlcworICAgIC8vIGFuZCBu
b3JtYWxpemVzIFVSTHMuCisgICAgaWYgKHByb3RvY29sID09PSAnZm9vYmFyOicpIHsKKyAgICAg
IC8vIFN3YXAgaW4gdGhlIG1ldGhvZCB0aGF0IGRvZXNuJ3QgZG8gdGhpcyB0ZXN0IG5vdyB0aGF0
CisgICAgICAvLyB3ZSBrbm93IGl0IHdvcmtzLgorICAgICAgZG9tSGVscGVyLnByb3RvY29sRm9y
VVJMID0gYnJvd3NlclByb3RvY29sRm9yVVJMOworICAgIH0gZWxzZSBpZiAodHlwZW9mIFVSTCA9
PT0gJ29iamVjdCcpIHsKKyAgICAgIC8vIFVSTCBnbG9iYWxseSBwcm92aWRlZCwgbGlrZWx5IGZy
b20gRmFzdEJvb3QncyBzYW5kYm94CisgICAgICBub2RlVVJMID0gVVJMOworICAgICAgZG9tSGVs
cGVyLnByb3RvY29sRm9yVVJMID0gbm9kZVByb3RvY29sRm9yVVJMOworICAgIH0gZWxzZSBpZiAo
dHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5yZXF1aXJlID09PSAn
ZnVuY3Rpb24nKSB7CisgICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRv
IG91ciBvd24gVVJMIHBhcnNpbmcuCisgICAgICAvLyBHbG9iYWwgYHJlcXVpcmVgIGlzIHNoYWRv
d2VkIGJ5IEVtYmVyJ3MgbG9hZGVyIHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBmdWxseQorICAgICAg
Ly8gcXVhbGlmaWVkIGBtb2R1bGUucmVxdWlyZWAuCisgICAgICBub2RlVVJMID0gbW9kdWxlLnJl
cXVpcmUoJ3VybCcpOworICAgICAgZG9tSGVscGVyLnByb3RvY29sRm9yVVJMID0gbm9kZVByb3Rv
Y29sRm9yVVJMOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRPTSBIZWxw
ZXIgY291bGQgbm90IGZpbmQgdmFsaWQgVVJMIHBhcnNpbmcgbWVjaGFuaXNtIik7CisgICAgfQor
CisgICAgLy8gQSBTaW1wbGVET00tc3BlY2lmaWMgZXh0ZW5zaW9uIHRoYXQgYWxsb3dzIHVzIHRv
IHBsYWNlIEhUTUwgZGlyZWN0bHkKKyAgICAvLyBpbnRvIHRoZSBET00gdHJlZSwgZm9yIHdoZW4g
dGhlIG91dHB1dCB0YXJnZXQgaXMgYWx3YXlzIHNlcmlhbGl6ZWQgSFRNTC4KKyAgICBpZiAoZG9t
SGVscGVyLmRvY3VtZW50LmNyZWF0ZVJhd0hUTUxTZWN0aW9uKSB7CisgICAgICBkb21IZWxwZXIu
c2V0TW9ycGhIVE1MID0gbm9kZVNldE1vcnBoSFRNTDsKKyAgICB9CisgIH0KKworICBmdW5jdGlv
biBub2RlU2V0TW9ycGhIVE1MKG1vcnBoLCBodG1sKSB7CisgICAgdmFyIHNlY3Rpb24gPSB0aGlz
LmRvY3VtZW50LmNyZWF0ZVJhd0hUTUxTZWN0aW9uKGh0bWwpOworICAgIG1vcnBoLnNldE5vZGUo
c2VjdGlvbik7CisgIH0KKworICBmdW5jdGlvbiBicm93c2VyUHJvdG9jb2xGb3JVUkwodXJsKSB7
CisgICAgaWYgKCFwYXJzaW5nTm9kZSkgeworICAgICAgcGFyc2luZ05vZGUgPSB0aGlzLmRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKKyAgICB9CisKKyAgICBwYXJzaW5nTm9kZS5ocmVmID0g
dXJsOworICAgIHJldHVybiBwYXJzaW5nTm9kZS5wcm90b2NvbDsKKyAgfQorCisgIGZ1bmN0aW9u
IG5vZGVQcm90b2NvbEZvclVSTCh1cmwpIHsKKyAgICB2YXIgcHJvdG9jb2wgPSBub2RlVVJMLnBh
cnNlKHVybCkucHJvdG9jb2w7CisgICAgcmV0dXJuIHByb3RvY29sID09PSBudWxsID8gJzonIDog
cHJvdG9jb2w7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBET01IZWxwZXI7Cit9KTsKK2Vu
aWZlZCgnZG9tLWhlbHBlci9idWlsZC1odG1sLWRvbScsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAo
ZXhwb3J0cykgeworICAvKiBnbG9iYWwgWE1MU2VyaWFsaXplcjpmYWxzZSAqLworICAndXNlIHN0
cmljdCc7CisKKyAgdmFyIHN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50cyA9IHsgZm9yZWlnbk9iamVj
dDogMSwgZGVzYzogMSwgdGl0bGU6IDEgfTsKKyAgZXhwb3J0cy5zdmdIVE1MSW50ZWdyYXRpb25Q
b2ludHMgPSBzdmdIVE1MSW50ZWdyYXRpb25Qb2ludHM7CisgIHZhciBzdmdOYW1lc3BhY2UgPSAn
aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOworCisgIGV4cG9ydHMuc3ZnTmFtZXNwYWNlID0g
c3ZnTmFtZXNwYWNlOworICB2YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVk
JyA/IGZhbHNlIDogZG9jdW1lbnQ7CisKKyAgLy8gU2FmYXJpIGRvZXMgbm90IGxpa2UgdXNpbmcg
aW5uZXJIVE1MIG9uIFNWRyBIVE1MIGludGVncmF0aW9uCisgIC8vIHBvaW50cyAoZGVzYy90aXRs
ZS9mb3JlaWduT2JqZWN0KS4KKyAgdmFyIG5lZWRzSW50ZWdyYXRpb25Qb2ludEZpeCA9IGRvYyAm
JiAoZnVuY3Rpb24gKGRvY3VtZW50KSB7CisgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRO
UyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEluIEZGIHRp
dGxlIHdpbGwgbm90IGFjY2VwdCBpbm5lckhUTUwuCisgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnROUyhzdmdOYW1lc3BhY2UsICd0aXRsZScpOworICAgIHRlc3RFbC5pbm5l
ckhUTUwgPSAiPGRpdj48L2Rpdj4iOworICAgIHJldHVybiB0ZXN0RWwuY2hpbGROb2Rlcy5sZW5n
dGggPT09IDAgfHwgdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgIT09IDE7CisgIH0pKGRv
Yyk7CisKKyAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgcHJpb3IgdG8gOSBkb2VzIG5vdCBhbGxvdyBz
ZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmlyc3QgZWxlbWVudAorICAvLyBpcyBhICJ6ZXJvLXNj
b3BlIiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5n
CisgIC8vIHRoZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0ZXh0IG5vZGUuIFdlLCBsaWtlIE1v
ZGVybml6ciwgdXNlICZzaHk7CisgIHZhciBuZWVkc1NoeSA9IGRvYyAmJiAoZnVuY3Rpb24gKGRv
Y3VtZW50KSB7CisgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp
OworICAgIHRlc3RFbC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4iOworICAgIHRlc3RFbC5maXJz
dENoaWxkLmlubmVySFRNTCA9ICI8c2NyaXB0PjxcL3NjcmlwdD4iOworICAgIHJldHVybiB0ZXN0
RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPT09ICcnOworICB9KShkb2MpOworCisgIC8vIElFIDgg
KGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcK
KyAgLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0IHdl
IGNhbgorICAvLyBhY2NpZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3BhY2Ugd2hlbiB1cGRhdGluZyBh
IG1vcnBoLgorICB2YXIgbW92ZXNXaGl0ZXNwYWNlID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1l
bnQpIHsKKyAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Cisg
ICAgdGVzdEVsLmlubmVySFRNTCA9ICJUZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhv
bGRlcic+PFwvc2NyaXB0PlZhbHVlIjsKKyAgICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0u
bm9kZVZhbHVlID09PSAnVGVzdDonICYmIHRlc3RFbC5jaGlsZE5vZGVzWzJdLm5vZGVWYWx1ZSA9
PT0gJyBWYWx1ZSc7CisgIH0pKGRvYyk7CisKKyAgdmFyIHRhZ05hbWVzUmVxdWlyaW5nSW5uZXJI
VE1MRml4ID0gZG9jICYmIChmdW5jdGlvbiAoZG9jdW1lbnQpIHsKKyAgICB2YXIgdGFnTmFtZXNS
ZXF1aXJpbmdJbm5lckhUTUxGaXg7CisgICAgLy8gSUUgOSBhbmQgZWFybGllciBkb24ndCBhbGxv
dyB1cyB0byBzZXQgaW5uZXJIVE1MIG9uIGNvbCwgY29sZ3JvdXAsIGZyYW1lc2V0LAorICAgIC8v
IGh0bWwsIHN0eWxlLCB0YWJsZSwgdGJvZHksIHRmb290LCB0aGVhZCwgdGl0bGUsIHRyLiBEZXRl
Y3QgdGhpcyBhbmQgYWRkCisgICAgLy8gdGhlbSB0byBhbiBpbml0aWFsIGxpc3Qgb2YgY29ycmVj
dGVkIHRhZ3MuCisgICAgLy8KKyAgICAvLyBIZXJlIHdlIGFyZSBvbmx5IGRlYWxpbmcgd2l0aCB0
aGUgb25lcyB3aGljaCBjYW4gaGF2ZSBjaGlsZCBub2Rlcy4KKyAgICAvLworICAgIHZhciB0YWJs
ZU5lZWRzSW5uZXJIVE1MRml4OworICAgIHZhciB0YWJsZUlubmVySFRNTFRlc3RFbGVtZW50ID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTsKKyAgICB0cnkgeworICAgICAgdGFibGVJ
bm5lckhUTUxUZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnPHRib2R5PjwvdGJvZHk+JzsKKyAgICB9
IGNhdGNoIChlKSB7fSBmaW5hbGx5IHsKKyAgICAgIHRhYmxlTmVlZHNJbm5lckhUTUxGaXggPSB0
YWJsZUlubmVySFRNTFRlc3RFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOworICAgIH0K
KyAgICBpZiAodGFibGVOZWVkc0lubmVySFRNTEZpeCkgeworICAgICAgdGFnTmFtZXNSZXF1aXJp
bmdJbm5lckhUTUxGaXggPSB7CisgICAgICAgIGNvbGdyb3VwOiBbJ3RhYmxlJ10sCisgICAgICAg
IHRhYmxlOiBbXSwKKyAgICAgICAgdGJvZHk6IFsndGFibGUnXSwKKyAgICAgICAgdGZvb3Q6IFsn
dGFibGUnXSwKKyAgICAgICAgdGhlYWQ6IFsndGFibGUnXSwKKyAgICAgICAgdHI6IFsndGFibGUn
LCAndGJvZHknXQorICAgICAgfTsKKyAgICB9CisKKyAgICAvLyBJRSA4IGRvZXNuJ3QgYWxsb3cg
c2V0dGluZyBpbm5lckhUTUwgb24gYSBzZWxlY3QgdGFnLiBEZXRlY3QgdGhpcyBhbmQKKyAgICAv
LyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgY29ycmVjdGVkIHRhZ3MuCisgICAgLy8KKyAgICB2YXIg
c2VsZWN0SW5uZXJIVE1MVGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxl
Y3QnKTsKKyAgICBzZWxlY3RJbm5lckhUTUxUZXN0RWxlbWVudC5pbm5lckhUTUwgPSAnPG9wdGlv
bj48L29wdGlvbj4nOworICAgIGlmICghc2VsZWN0SW5uZXJIVE1MVGVzdEVsZW1lbnQuY2hpbGRO
b2Rlc1swXSkgeworICAgICAgdGFnTmFtZXNSZXF1aXJpbmdJbm5lckhUTUxGaXggPSB0YWdOYW1l
c1JlcXVpcmluZ0lubmVySFRNTEZpeCB8fCB7fTsKKyAgICAgIHRhZ05hbWVzUmVxdWlyaW5nSW5u
ZXJIVE1MRml4LnNlbGVjdCA9IFtdOworICAgIH0KKyAgICByZXR1cm4gdGFnTmFtZXNSZXF1aXJp
bmdJbm5lckhUTUxGaXg7CisgIH0pKGRvYyk7CisKKyAgZnVuY3Rpb24gc2NyaXB0U2FmZUlubmVy
SFRNTChlbGVtZW50LCBodG1sKSB7CisgICAgLy8gd2l0aG91dCBhIGxlYWRpbmcgdGV4dCBub2Rl
LCBJRSB3aWxsIGRyb3AgYSBsZWFkaW5nIHNjcmlwdCB0YWcuCisgICAgaHRtbCA9ICcmc2h5Oycg
KyBodG1sOworCisgICAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1sOworCisgICAgdmFyIG5vZGVz
ID0gZWxlbWVudC5jaGlsZE5vZGVzOworCisgICAgLy8gTG9vayBmb3IgJnNoeTsgdG8gcmVtb3Zl
IGl0LgorICAgIHZhciBzaHlFbGVtZW50ID0gbm9kZXNbMF07CisgICAgd2hpbGUgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKKyAgICAgIHNoeUVs
ZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgfQorICAgIC8vIEF0IHRoaXMgcG9p
bnQgaXQncyB0aGUgYWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgorICAgIGlmIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1
MDBBRCIpIHsKKyAgICAgIHZhciBuZXdWYWx1ZSA9IHNoeUVsZW1lbnQubm9kZVZhbHVlLnNsaWNl
KDEpOworICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCkgeworICAgICAgICBzaHlFbGVtZW50Lm5v
ZGVWYWx1ZSA9IHNoeUVsZW1lbnQubm9kZVZhbHVlLnNsaWNlKDEpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgc2h5RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNoeUVsZW1lbnQpOwor
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub2RlczsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1
aWxkRE9NV2l0aEZpeChodG1sLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHZhciB0YWdOYW1l
ID0gY29udGV4dHVhbEVsZW1lbnQudGFnTmFtZTsKKworICAgIC8vIEZpcmVmb3ggdmVyc2lvbnMg
PCAxMSBkbyBub3QgaGF2ZSBzdXBwb3J0IGZvciBlbGVtZW50Lm91dGVySFRNTC4KKyAgICB2YXIg
b3V0ZXJIVE1MID0gY29udGV4dHVhbEVsZW1lbnQub3V0ZXJIVE1MIHx8IG5ldyBYTUxTZXJpYWxp
emVyKCkuc2VyaWFsaXplVG9TdHJpbmcoY29udGV4dHVhbEVsZW1lbnQpOworICAgIGlmICghb3V0
ZXJIVE1MKSB7CisgICAgICB0aHJvdyAiQ2FuJ3Qgc2V0IGlubmVySFRNTCBvbiAiICsgdGFnTmFt
ZSArICIgaW4gdGhpcyBicm93c2VyIjsKKyAgICB9CisKKyAgICBodG1sID0gZml4U2VsZWN0KGh0
bWwsIGNvbnRleHR1YWxFbGVtZW50KTsKKworICAgIHZhciB3cmFwcGluZ1RhZ3MgPSB0YWdOYW1l
c1JlcXVpcmluZ0lubmVySFRNTEZpeFt0YWdOYW1lLnRvTG93ZXJDYXNlKCldOworCisgICAgdmFy
IHN0YXJ0VGFnID0gb3V0ZXJIVE1MLm1hdGNoKG5ldyBSZWdFeHAoIjwiICsgdGFnTmFtZSArICIo
W14+XSopPiIsICdpJykpWzBdOworICAgIHZhciBlbmRUYWcgPSAnPC8nICsgdGFnTmFtZSArICc+
JzsKKworICAgIHZhciB3cmFwcGVkSFRNTCA9IFtzdGFydFRhZywgaHRtbCwgZW5kVGFnXTsKKwor
ICAgIHZhciBpID0gd3JhcHBpbmdUYWdzLmxlbmd0aDsKKyAgICB2YXIgd3JhcHBlZERlcHRoID0g
MSArIGk7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgd3JhcHBlZEhUTUwudW5zaGlmdCgnPCcg
KyB3cmFwcGluZ1RhZ3NbaV0gKyAnPicpOworICAgICAgd3JhcHBlZEhUTUwucHVzaCgnPC8nICsg
d3JhcHBpbmdUYWdzW2ldICsgJz4nKTsKKyAgICB9CisKKyAgICB2YXIgd3JhcHBlciA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgIHNjcmlwdFNhZmVJbm5lckhUTUwod3JhcHBl
ciwgd3JhcHBlZEhUTUwuam9pbignJykpOworICAgIHZhciBlbGVtZW50ID0gd3JhcHBlcjsKKyAg
ICB3aGlsZSAod3JhcHBlZERlcHRoLS0pIHsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmZpcnN0
Q2hpbGQ7CisgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAxKSB7
CisgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgICAgfQorICAgIH0K
KyAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgIT09IHRhZ05hbWUpIHsKKyAg
ICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgIH0KKyAgICByZXR1cm4gZWxl
bWVudCA/IGVsZW1lbnQuY2hpbGROb2RlcyA6IFtdOworICB9CisKKyAgdmFyIGJ1aWxkRE9NOwor
ICBpZiAobmVlZHNTaHkpIHsKKyAgICBidWlsZERPTSA9IGZ1bmN0aW9uIGJ1aWxkRE9NKGh0bWws
IGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIGh0bWwgPSBmaXhTZWxlY3QoaHRtbCwg
Y29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICBjb250ZXh0dWFsRWxlbWVudCA9IGRvbS5jbG9u
ZU5vZGUoY29udGV4dHVhbEVsZW1lbnQsIGZhbHNlKTsKKyAgICAgIHNjcmlwdFNhZmVJbm5lckhU
TUwoY29udGV4dHVhbEVsZW1lbnQsIGh0bWwpOworICAgICAgcmV0dXJuIGNvbnRleHR1YWxFbGVt
ZW50LmNoaWxkTm9kZXM7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBidWlsZERPTSA9IGZ1bmN0
aW9uIGJ1aWxkRE9NKGh0bWwsIGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIGh0bWwg
PSBmaXhTZWxlY3QoaHRtbCwgY29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICBjb250ZXh0dWFs
RWxlbWVudCA9IGRvbS5jbG9uZU5vZGUoY29udGV4dHVhbEVsZW1lbnQsIGZhbHNlKTsKKyAgICAg
IGNvbnRleHR1YWxFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7CisgICAgICByZXR1cm4gY29udGV4
dHVhbEVsZW1lbnQuY2hpbGROb2RlczsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gZml4U2Vs
ZWN0KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50KSB7CisgICAgaWYgKGNvbnRleHR1YWxFbGVtZW50
LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7CisgICAgICBodG1sID0gIjxvcHRpb24+PC9vcHRpb24+
IiArIGh0bWw7CisgICAgfQorCisgICAgcmV0dXJuIGh0bWw7CisgIH0KKworICB2YXIgYnVpbGRJ
RVNhZmVET007CisgIGlmICh0YWdOYW1lc1JlcXVpcmluZ0lubmVySFRNTEZpeCB8fCBtb3Zlc1do
aXRlc3BhY2UpIHsKKyAgICBidWlsZElFU2FmZURPTSA9IGZ1bmN0aW9uIGJ1aWxkSUVTYWZlRE9N
KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50LCBkb20pIHsKKyAgICAgIC8vIE1ha2UgYSBsaXN0IG9m
IHRoZSBsZWFkaW5nIHRleHQgb24gc2NyaXB0IG5vZGVzLiBJbmNsdWRlCisgICAgICAvLyBzY3Jp
cHQgdGFncyB3aXRob3V0IGFueSB3aGl0ZXNwYWNlIGZvciBlYXNpZXIgcHJvY2Vzc2luZyBsYXRl
ci4KKyAgICAgIHZhciBzcGFjZXNCZWZvcmUgPSBbXTsKKyAgICAgIHZhciBzcGFjZXNBZnRlciA9
IFtdOworICAgICAgaWYgKHR5cGVvZiBodG1sID09PSAnc3RyaW5nJykgeworICAgICAgICBodG1s
ID0gaHRtbC5yZXBsYWNlKC8oXHMqKSg8c2NyaXB0KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHNwYWNl
cywgdGFnKSB7CisgICAgICAgICAgc3BhY2VzQmVmb3JlLnB1c2goc3BhY2VzKTsKKyAgICAgICAg
ICByZXR1cm4gdGFnOworICAgICAgICB9KTsKKworICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNl
KC8oPFwvc2NyaXB0PikoXHMqKS9nLCBmdW5jdGlvbiAobWF0Y2gsIHRhZywgc3BhY2VzKSB7Cisg
ICAgICAgICAgc3BhY2VzQWZ0ZXIucHVzaChzcGFjZXMpOworICAgICAgICAgIHJldHVybiB0YWc7
CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICAvLyBGZXRjaCBub2RlcworICAgICAgdmFy
IG5vZGVzOworICAgICAgaWYgKHRhZ05hbWVzUmVxdWlyaW5nSW5uZXJIVE1MRml4W2NvbnRleHR1
YWxFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pIHsKKyAgICAgICAgLy8gYnVpbGRET01X
aXRoRml4IHVzZXMgc3RyaW5nIHdyYXBwZXJzIGZvciBwcm9ibGVtYXRpYyBpbm5lckhUTUwuCisg
ICAgICAgIG5vZGVzID0gYnVpbGRET01XaXRoRml4KGh0bWwsIGNvbnRleHR1YWxFbGVtZW50KTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGVzID0gYnVpbGRET00oaHRtbCwgY29udGV4dHVh
bEVsZW1lbnQsIGRvbSk7CisgICAgICB9CisKKyAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBzY3Jp
cHQgdGFncywgdGhlIG5vZGVzIHRoZW1zZWx2ZXMgd2lsbCBiZQorICAgICAgLy8gbXV0YXRlZCBh
cyB3ZSBhZGQgdGVzdCBub2Rlcy4KKyAgICAgIHZhciBpLCBqLCBub2RlLCBub2RlU2NyaXB0Tm9k
ZXM7CisgICAgICB2YXIgc2NyaXB0Tm9kZXMgPSBbXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBu
b2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBub2RlID0gbm9kZXNbaV07CisgICAgICAgIGlm
IChub2RlLm5vZGVUeXBlICE9PSAxKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsKKyAgICAgICAgICBzY3Jp
cHROb2Rlcy5wdXNoKG5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5vZGVTY3Jp
cHROb2RlcyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOworICAgICAgICAg
IGZvciAoaiA9IDA7IGogPCBub2RlU2NyaXB0Tm9kZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAg
ICAgIHNjcmlwdE5vZGVzLnB1c2gobm9kZVNjcmlwdE5vZGVzW2pdKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gV2FsayB0aGUgc2NyaXB0IHRhZ3MgYW5kIHB1
dCBiYWNrIHRoZWlyIGxlYWRpbmcgdGV4dCBub2Rlcy4KKyAgICAgIHZhciBzY3JpcHROb2RlLCB0
ZXh0Tm9kZSwgc3BhY2VCZWZvcmUsIHNwYWNlQWZ0ZXI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwg
c2NyaXB0Tm9kZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2NyaXB0Tm9kZSA9IHNjcmlwdE5v
ZGVzW2ldOworICAgICAgICBzcGFjZUJlZm9yZSA9IHNwYWNlc0JlZm9yZVtpXTsKKyAgICAgICAg
aWYgKHNwYWNlQmVmb3JlICYmIHNwYWNlQmVmb3JlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICB0
ZXh0Tm9kZSA9IGRvbS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzcGFjZUJlZm9yZSk7CisgICAg
ICAgICAgc2NyaXB0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgc2NyaXB0
Tm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBzcGFjZUFmdGVyID0gc3BhY2VzQWZ0ZXJbaV07
CisgICAgICAgIGlmIChzcGFjZUFmdGVyICYmIHNwYWNlQWZ0ZXIubGVuZ3RoID4gMCkgeworICAg
ICAgICAgIHRleHROb2RlID0gZG9tLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNwYWNlQWZ0ZXIp
OworICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dE5vZGUs
IHNjcmlwdE5vZGUubmV4dFNpYmxpbmcpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBub2RlczsKKyAgICB9OworICB9IGVsc2UgeworICAgIGJ1aWxkSUVTYWZlRE9NID0gYnVp
bGRET007CisgIH0KKworICB2YXIgYnVpbGRIVE1MRE9NOworICBpZiAobmVlZHNJbnRlZ3JhdGlv
blBvaW50Rml4KSB7CisgICAgZXhwb3J0cy5idWlsZEhUTUxET00gPSBidWlsZEhUTUxET00gPSBm
dW5jdGlvbiBidWlsZEhUTUxET00oaHRtbCwgY29udGV4dHVhbEVsZW1lbnQsIGRvbSkgeworICAg
ICAgaWYgKHN2Z0hUTUxJbnRlZ3JhdGlvblBvaW50c1tjb250ZXh0dWFsRWxlbWVudC50YWdOYW1l
XSkgeworICAgICAgICByZXR1cm4gYnVpbGRJRVNhZmVET00oaHRtbCwgZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnZGl2JyksIGRvbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYnVp
bGRJRVNhZmVET00oaHRtbCwgY29udGV4dHVhbEVsZW1lbnQsIGRvbSk7CisgICAgICB9CisgICAg
fTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRzLmJ1aWxkSFRNTERPTSA9IGJ1aWxkSFRNTERPTSA9
IGJ1aWxkSUVTYWZlRE9NOworICB9CisKKyAgZXhwb3J0cy5idWlsZEhUTUxET00gPSBidWlsZEhU
TUxET007Cit9KTsKK2VuaWZlZCgnZG9tLWhlbHBlci9jbGFzc2VzJywgWydleHBvcnRzJ10sIGZ1
bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgZG9jID0gdHlwZW9m
IGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogZG9jdW1lbnQ7CisKKyAgLy8gUGhh
bnRvbUpTIGhhcyBhIGJyb2tlbiBjbGFzc0xpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXJp
eWEvcGhhbnRvbWpzL2lzc3Vlcy8xMjc4MgorICB2YXIgY2FuQ2xhc3NMaXN0ID0gZG9jICYmIChm
dW5jdGlvbiAoKSB7CisgICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsK
KyAgICBpZiAoIWQuY2xhc3NMaXN0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGQuY2xhc3NMaXN0LmFkZCgnYm9vJyk7CisgICAgZC5jbGFzc0xpc3QuYWRkKCdib28nLCAnYmF6
Jyk7CisgICAgcmV0dXJuIGQuY2xhc3NOYW1lID09PSAnYm9vIGJheic7CisgIH0pKCk7CisKKyAg
ZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoZWxlbWVudCkgeworICAgIHZhciBjbGFzc1N0cmluZyA9
IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnOworICAgIHJldHVybiBjbGFzc1N0
cmluZyAhPT0gJycgJiYgY2xhc3NTdHJpbmcgIT09ICcgJyA/IGNsYXNzU3RyaW5nLnNwbGl0KCcg
JykgOiBbXTsKKyAgfQorCisgIGZ1bmN0aW9uIGludGVyc2VjdChjb250YWluaW5nQXJyYXksIHZh
bHVlc0FycmF5KSB7CisgICAgdmFyIGNvbnRhaW5pbmdJbmRleCA9IDA7CisgICAgdmFyIGNvbnRh
aW5pbmdMZW5ndGggPSBjb250YWluaW5nQXJyYXkubGVuZ3RoOworICAgIHZhciB2YWx1ZXNJbmRl
eCA9IDA7CisgICAgdmFyIHZhbHVlc0xlbmd0aCA9IHZhbHVlc0FycmF5Lmxlbmd0aDsKKworICAg
IHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgQXJyYXkodmFsdWVzTGVuZ3RoKTsKKworICAgIC8vIFRP
RE86IHJld3JpdGUgdGhpcyBsb29wIGluIGFuIG9wdGltYWwgbWFubmVyCisgICAgZm9yICg7IGNv
bnRhaW5pbmdJbmRleCA8IGNvbnRhaW5pbmdMZW5ndGg7IGNvbnRhaW5pbmdJbmRleCsrKSB7Cisg
ICAgICB2YWx1ZXNJbmRleCA9IDA7CisgICAgICBmb3IgKDsgdmFsdWVzSW5kZXggPCB2YWx1ZXNM
ZW5ndGg7IHZhbHVlc0luZGV4KyspIHsKKyAgICAgICAgaWYgKHZhbHVlc0FycmF5W3ZhbHVlc0lu
ZGV4XSA9PT0gY29udGFpbmluZ0FycmF5W2NvbnRhaW5pbmdJbmRleF0pIHsKKyAgICAgICAgICBp
bnRlcnNlY3Rpb25bdmFsdWVzSW5kZXhdID0gY29udGFpbmluZ0luZGV4OworICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGludGVyc2VjdGlv
bjsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZENsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xh
c3NOYW1lcykgeworICAgIHZhciBleGlzdGluZ0NsYXNzZXMgPSBidWlsZENsYXNzTGlzdChlbGVt
ZW50KTsKKworICAgIHZhciBpbmRleGVzID0gaW50ZXJzZWN0KGV4aXN0aW5nQ2xhc3NlcywgY2xh
c3NOYW1lcyk7CisgICAgdmFyIGRpZENoYW5nZSA9IGZhbHNlOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjbGFzc05hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaWYgKGluZGV4
ZXNbaV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAgICAg
ICBleGlzdGluZ0NsYXNzZXMucHVzaChjbGFzc05hbWVzW2ldKTsKKyAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoZGlkQ2hhbmdlKSB7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3Mn
LCBleGlzdGluZ0NsYXNzZXMubGVuZ3RoID4gMCA/IGV4aXN0aW5nQ2xhc3Nlcy5qb2luKCcgJykg
OiAnJyk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3Nlc1ZpYUF0dHJpYnV0
ZShlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgdmFyIGV4aXN0aW5nQ2xhc3NlcyA9IGJ1aWxk
Q2xhc3NMaXN0KGVsZW1lbnQpOworCisgICAgdmFyIGluZGV4ZXMgPSBpbnRlcnNlY3QoY2xhc3NO
YW1lcywgZXhpc3RpbmdDbGFzc2VzKTsKKyAgICB2YXIgZGlkQ2hhbmdlID0gZmFsc2U7CisgICAg
dmFyIG5ld0NsYXNzZXMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXhpc3RpbmdD
bGFzc2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaWYgKGluZGV4ZXNbaV0gPT09IHVu
ZGVmaW5lZCkgeworICAgICAgICBuZXdDbGFzc2VzLnB1c2goZXhpc3RpbmdDbGFzc2VzW2ldKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpZENoYW5nZSA9IHRydWU7CisgICAgICB9CisgICAg
fQorCisgICAgaWYgKGRpZENoYW5nZSkgeworICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Ns
YXNzJywgbmV3Q2xhc3Nlcy5sZW5ndGggPiAwID8gbmV3Q2xhc3Nlcy5qb2luKCcgJykgOiAnJyk7
CisgICAgfQorICB9CisKKyAgdmFyIGFkZENsYXNzZXMsIHJlbW92ZUNsYXNzZXM7CisgIGlmIChj
YW5DbGFzc0xpc3QpIHsKKyAgICBleHBvcnRzLmFkZENsYXNzZXMgPSBhZGRDbGFzc2VzID0gZnVu
Y3Rpb24gYWRkQ2xhc3NlcyhlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgICBpZiAoZWxlbWVu
dC5jbGFzc0xpc3QpIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAxKSB7Cisg
ICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbMF0pOworICAgICAgICB9
IGVsc2UgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAyKSB7CisgICAgICAgICAgZWxlbWVudC5j
bGFzc0xpc3QuYWRkKGNsYXNzTmFtZXNbMF0sIGNsYXNzTmFtZXNbMV0pOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZC5hcHBseShlbGVtZW50LmNsYXNz
TGlzdCwgY2xhc3NOYW1lcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFk
ZENsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xhc3NOYW1lcyk7CisgICAgICB9CisgICAg
fTsKKyAgICBleHBvcnRzLnJlbW92ZUNsYXNzZXMgPSByZW1vdmVDbGFzc2VzID0gZnVuY3Rpb24g
cmVtb3ZlQ2xhc3NlcyhlbGVtZW50LCBjbGFzc05hbWVzKSB7CisgICAgICBpZiAoZWxlbWVudC5j
bGFzc0xpc3QpIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAxKSB7CisgICAg
ICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbMF0pOworICAgICAgICB9
IGVsc2UgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID09PSAyKSB7CisgICAgICAgICAgZWxlbWVudC5j
bGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZXNbMF0sIGNsYXNzTmFtZXNbMV0pOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZS5hcHBseShlbGVtZW50
LmNsYXNzTGlzdCwgY2xhc3NOYW1lcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJlbW92ZUNsYXNzZXNWaWFBdHRyaWJ1dGUoZWxlbWVudCwgY2xhc3NOYW1lcyk7CisgICAg
ICB9CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRzLmFkZENsYXNzZXMgPSBhZGRDbGFz
c2VzID0gYWRkQ2xhc3Nlc1ZpYUF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLnJlbW92ZUNsYXNzZXMg
PSByZW1vdmVDbGFzc2VzID0gcmVtb3ZlQ2xhc3Nlc1ZpYUF0dHJpYnV0ZTsKKyAgfQorCisgIGV4
cG9ydHMuYWRkQ2xhc3NlcyA9IGFkZENsYXNzZXM7CisgIGV4cG9ydHMucmVtb3ZlQ2xhc3NlcyA9
IHJlbW92ZUNsYXNzZXM7Cit9KTsKK2VuaWZlZCgnZG9tLWhlbHBlci9wcm9wJywgWydleHBvcnRz
J10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmlz
QXR0clJlbW92YWxWYWx1ZSA9IGlzQXR0clJlbW92YWxWYWx1ZTsKKyAgZXhwb3J0cy5ub3JtYWxp
emVQcm9wZXJ0eSA9IG5vcm1hbGl6ZVByb3BlcnR5OworCisgIGZ1bmN0aW9uIGlzQXR0clJlbW92
YWxWYWx1ZSh2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0g
dW5kZWZpbmVkOworICB9CisKKyAgLyoKKyAgICoKKyAgICogQG1ldGhvZCBub3JtYWxpemVQcm9w
ZXJ0eQorICAgKiBAcGFyYW0gZWxlbWVudCB7SFRNTEVsZW1lbnR9CisgICAqIEBwYXJhbSBzbG90
TmFtZSB7U3RyaW5nfQorICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IG5hbWUsIHR5cGUgfQorICAg
Ki8KKworICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBzbG90TmFtZSkgewor
ICAgIHZhciB0eXBlLCBub3JtYWxpemVkOworCisgICAgaWYgKHNsb3ROYW1lIGluIGVsZW1lbnQp
IHsKKyAgICAgIG5vcm1hbGl6ZWQgPSBzbG90TmFtZTsKKyAgICAgIHR5cGUgPSAncHJvcCc7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHZhciBsb3dlciA9IHNsb3ROYW1lLnRvTG93ZXJDYXNlKCk7Cisg
ICAgICBpZiAobG93ZXIgaW4gZWxlbWVudCkgeworICAgICAgICB0eXBlID0gJ3Byb3AnOworICAg
ICAgICBub3JtYWxpemVkID0gbG93ZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0g
J2F0dHInOworICAgICAgICBub3JtYWxpemVkID0gc2xvdE5hbWU7CisgICAgICB9CisgICAgfQor
CisgICAgaWYgKHR5cGUgPT09ICdwcm9wJyAmJiAobm9ybWFsaXplZC50b0xvd2VyQ2FzZSgpID09
PSAnc3R5bGUnIHx8IHByZWZlckF0dHIoZWxlbWVudC50YWdOYW1lLCBub3JtYWxpemVkKSkpIHsK
KyAgICAgIHR5cGUgPSAnYXR0cic7CisgICAgfQorCisgICAgcmV0dXJuIHsgbm9ybWFsaXplZDog
bm9ybWFsaXplZCwgdHlwZTogdHlwZSB9OworICB9CisKKyAgLy8gcHJvcGVydGllcyB0aGF0IE1V
U1QgYmUgc2V0IGFzIGF0dHJpYnV0ZXMsIGR1ZSB0bzoKKyAgLy8gKiBicm93c2VyIGJ1ZworICAv
LyAqIHN0cmFuZ2Ugc3BlYyBvdXRsaWVyCisgIHZhciBBVFRSX09WRVJSSURFUyA9IHsKKworICAg
IC8vIHBoYW50b21qcyA8IDIuMCBsZXRzIHlvdSBzZXQgaXQgYXMgYSBwcm9wIGJ1dCB3b24ndCBy
ZWZsZWN0IGl0CisgICAgLy8gYmFjayB0byB0aGUgYXR0cmlidXRlLiBidXR0b24uZ2V0QXR0cmli
dXRlKCd0eXBlJykgPT09IG51bGwKKyAgICBCVVRUT046IHsgdHlwZTogdHJ1ZSwgZm9ybTogdHJ1
ZSB9LAorCisgICAgSU5QVVQ6IHsKKyAgICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIElFOCBpcyBk
cm9wZWQKKyAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSUUgKElFOCkgdGhyb3cgYW4gZXhjZXB0
aW9uIHdoZW4gc2V0dGluZworICAgICAgLy8gYGlucHV0Lmxpc3QgPSAnc29tZXN0cmluZydgOgor
ICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvZW1iZXIuanMvaXNzdWVzLzEwOTA4
CisgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9pc3N1ZXMvMTEz
NjQKKyAgICAgIGxpc3Q6IHRydWUsCisgICAgICAvLyBTb21lIHZlcnNpb24gb2YgSUUgKGxpa2Ug
SUU5KSBhY3R1YWxseSB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgIC8vIGlmIHlvdSBzZXQgaW5w
dXQudHlwZSA9ICdzb21ldGhpbmctdW5rbm93bicKKyAgICAgIHR5cGU6IHRydWUsCisgICAgICBm
b3JtOiB0cnVlLAorICAgICAgLy8gQ2hyb21lIDQ2LjAuMjQ2NC4wOiAnYXV0b2NvcnJlY3QnIGlu
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JykgPT09IGZhbHNlCisgICAgICAvLyBTYWZh
cmkgOC4wLjc6ICdhdXRvY29ycmVjdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQn
KSA9PT0gZmFsc2UKKyAgICAgIC8vIE1vYmlsZSBTYWZhcmkgKGlPUyA4LjQgc2ltdWxhdG9yKTog
J2F1dG9jb3JyZWN0JyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpID09PSB0cnVl
CisgICAgICBhdXRvY29ycmVjdDogdHJ1ZQorICAgIH0sCisKKyAgICAvLyBlbGVtZW50LmZvcm0g
aXMgYWN0dWFsbHkgYSBsZWdpdGltYXRlIHJlYWRPbmx5IHByb3BlcnR5LCB0aGF0IGlzIHRvIGJl
CisgICAgLy8gbXV0YXRlZCwgYnV0IG11c3QgYmUgbXV0YXRlZCBieSBzZXRBdHRyaWJ1dGUuLi4K
KyAgICBTRUxFQ1Q6IHsgZm9ybTogdHJ1ZSB9LAorICAgIE9QVElPTjogeyBmb3JtOiB0cnVlIH0s
CisgICAgVEVYVEFSRUE6IHsgZm9ybTogdHJ1ZSB9LAorICAgIExBQkVMOiB7IGZvcm06IHRydWUg
fSwKKyAgICBGSUVMRFNFVDogeyBmb3JtOiB0cnVlIH0sCisgICAgTEVHRU5EOiB7IGZvcm06IHRy
dWUgfSwKKyAgICBPQkpFQ1Q6IHsgZm9ybTogdHJ1ZSB9CisgIH07CisKKyAgZnVuY3Rpb24gcHJl
ZmVyQXR0cih0YWdOYW1lLCBwcm9wTmFtZSkgeworICAgIHZhciB0YWcgPSBBVFRSX09WRVJSSURF
U1t0YWdOYW1lLnRvVXBwZXJDYXNlKCldOworICAgIHJldHVybiB0YWcgJiYgdGFnW3Byb3BOYW1l
LnRvTG93ZXJDYXNlKCldIHx8IGZhbHNlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItYXBwbGlj
YXRpb24vaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRh
bC9mZWF0dXJlcycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCAnZW1iZXItYXBw
bGljYXRpb24vc3lzdGVtL3Jlc29sdmVyJywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBs
aWNhdGlvbicsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24taW5zdGFuY2Un
LCAnZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZScsICdlbWJlci1hcHBsaWNhdGlvbi9z
eXN0ZW0vZW5naW5lLWluc3RhbmNlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENv
cmUsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQsIF9l
bWJlckFwcGxpY2F0aW9uU3lzdGVtUmVzb2x2ZXIsIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBw
bGljYXRpb24sIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb25JbnN0YW5jZSwgX2Vt
YmVyQXBwbGljYXRpb25TeXN0ZW1FbmdpbmUsIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5l
SW5zdGFuY2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0
LkFwcGxpY2F0aW9uID0gX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbi5kZWZhdWx0
OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5SZXNvbHZlciA9IF9lbWJlckFwcGxpY2F0aW9u
U3lzdGVtUmVzb2x2ZXIuUmVzb2x2ZXI7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkRlZmF1
bHRSZXNvbHZlciA9IF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtUmVzb2x2ZXIuZGVmYXVsdDsKKwor
ICBfZW1iZXJSdW50aW1lU3lzdGVtTGF6eV9sb2FkLnJ1bkxvYWRIb29rcygnRW1iZXIuQXBwbGlj
YXRpb24nLCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUFwcGxpY2F0aW9uLmRlZmF1bHQpOworfSk7
CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgorKi8K
KworLy8gRXhwb3NlIGBFbmdpbmVJbnN0YW5jZWAgYW5kIGBBcHBsaWNhdGlvbkluc3RhbmNlYCBm
b3IgZWFzeSBvdmVycmlkaW5nLgorLy8gUmVhbmFseXplIHdoZXRoZXIgdG8gY29udGludWUgZXhw
b3NpbmcgdGhlc2UgYWZ0ZXIgZmVhdHVyZSBmbGFnIGlzIHJlbW92ZWQuCitlbmlmZWQoJ2VtYmVy
LWFwcGxpY2F0aW9uL3N5c3RlbS9hcHBsaWNhdGlvbi1pbnN0YW5jZScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0
YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9ydW5f
bG9vcCcsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1ydW50aW1lL21peGlucy9yZWdp
c3RyeV9wcm94eScsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvZW52aXJvbm1l
bnQnLCAnZW1iZXItcnVudGltZS9leHQvcnN2cCcsICdlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5
JywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUtaW5zdGFuY2UnXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxTeW1ib2wsIF9lbWJlck1ldGFsUnVuX2xv
b3AsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94
eSwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsRW52aXJvbm1lbnQsIF9lbWJlclJ1bnRp
bWVFeHRSc3ZwLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyQXBwbGljYXRpb25TeXN0
ZW1FbmdpbmVJbnN0YW5jZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLWFwcGxpY2F0aW9uCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBJTlRF
Uk5BTF9CT09UX09QVElPTlMgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdJTlRFUk5BTF9C
T09UX09QVElPTlMnKTsKKworICBleHBvcnRzLklOVEVSTkFMX0JPT1RfT1BUSU9OUyA9IElOVEVS
TkFMX0JPT1RfT1BUSU9OUzsKKyAgdmFyIEJvb3RPcHRpb25zID0gdW5kZWZpbmVkOworCisgIC8q
KgorICAgIFRoZSBgQXBwbGljYXRpb25JbnN0YW5jZWAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUg
c3RhdGVmdWwgYXNwZWN0cyBvZiBhCisgICAgcnVubmluZyBgQXBwbGljYXRpb25gLgorICAKKyAg
ICBBdCBhIGhpZ2gtbGV2ZWwsIHdlIGJyZWFrIGFwcGxpY2F0aW9uIGJvb3QgaW50byB0d28gZGlz
dGluY3QgcGhhc2VzOgorICAKKyAgICAqIERlZmluaXRpb24gdGltZSwgd2hlcmUgYWxsIG9mIHRo
ZSBjbGFzc2VzLCB0ZW1wbGF0ZXMsIGFuZCBvdGhlcgorICAgICAgZGVwZW5kZW5jaWVzIGFyZSBs
b2FkZWQgKHR5cGljYWxseSBpbiB0aGUgYnJvd3NlcikuCisgICAgKiBSdW4gdGltZSwgd2hlcmUg
d2UgYmVnaW4gZXhlY3V0aW5nIHRoZSBhcHBsaWNhdGlvbiBvbmNlIGV2ZXJ5dGhpbmcKKyAgICAg
IGhhcyBsb2FkZWQuCisgIAorICAgIERlZmluaXRpb24gdGltZSBjYW4gYmUgZXhwZW5zaXZlIGFu
ZCBvbmx5IG5lZWRzIHRvIGhhcHBlbiBvbmNlIHNpbmNlIGl0IGlzCisgICAgYW4gaWRlbXBvdGVu
dCBvcGVyYXRpb24uIEZvciBleGFtcGxlLCBiZXR3ZWVuIHRlc3QgcnVucyBhbmQgRmFzdEJvb3QK
KyAgICByZXF1ZXN0cywgdGhlIGFwcGxpY2F0aW9uIHN0YXlzIHRoZSBzYW1lLiBJdCBpcyBvbmx5
IHRoZSBzdGF0ZSB0aGF0IHdlIHdhbnQKKyAgICB0byByZXNldC4KKyAgCisgICAgVGhhdCBzdGF0
ZSBpcyB3aGF0IHRoZSBgQXBwbGljYXRpb25JbnN0YW5jZWAgbWFuYWdlczogaXQgaXMgcmVzcG9u
c2libGUgZm9yCisgICAgY3JlYXRpbmcgdGhlIGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIGFsbCBh
cHBsaWNhdGlvbiBzdGF0ZSwgYW5kIGRpc3Bvc2luZyBvZgorICAgIGl0IG9uY2UgdGhlIHBhcnRp
Y3VsYXIgdGVzdCBydW4gb3IgRmFzdEJvb3QgcmVxdWVzdCBoYXMgZmluaXNoZWQuCisgIAorICAg
IEBwdWJsaWMKKyAgICBAY2xhc3MgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZQorICAgIEBleHRl
bmRzIEVtYmVyLkVuZ2luZUluc3RhbmNlCisgICovCisKKyAgdmFyIEFwcGxpY2F0aW9uSW5zdGFu
Y2UgPSBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUVuZ2luZUluc3RhbmNlLmRlZmF1bHQuZXh0ZW5k
KHsKKyAgICAvKioKKyAgICAgIFRoZSBgQXBwbGljYXRpb25gIGZvciB3aGljaCB0aGlzIGlzIGFu
IGluc3RhbmNlLgorICAgICAgIEBwcm9wZXJ0eSB7RW1iZXIuQXBwbGljYXRpb259IGFwcGxpY2F0
aW9uCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYXBwbGljYXRpb246IG51bGwsCisKKyAg
ICAvKioKKyAgICAgIFRoZSBET00gZXZlbnRzIGZvciB3aGljaCB0aGUgZXZlbnQgZGlzcGF0Y2hl
ciBzaG91bGQgbGlzdGVuLgorICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBhcHBsaWNhdGlvbidzIGBF
bWJlci5FdmVudERpc3BhdGNoZXJgIGxpc3RlbnMKKyAgICAgIGZvciBhIHNldCBvZiBzdGFuZGFy
ZCBET00gZXZlbnRzLCBzdWNoIGFzIGBtb3VzZWRvd25gIGFuZAorICAgICAgYGtleXVwYCwgYW5k
IGRlbGVnYXRlcyB0aGVtIHRvIHlvdXIgYXBwbGljYXRpb24ncyBgRW1iZXIuVmlld2AKKyAgICAg
IGluc3RhbmNlcy4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQHByb3BlcnR5IHtPYmplY3R9IGN1
c3RvbUV2ZW50cworICAgICovCisgICAgY3VzdG9tRXZlbnRzOiBudWxsLAorCisgICAgLyoqCisg
ICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBvZiB0aGUgQXBwbGljYXRpb24gYXMgYW4gZWxlbWVu
dCBvciBhCisgICAgICBbalF1ZXJ5LWNvbXBhdGlibGUgc2VsZWN0b3IKKyAgICAgIHN0cmluZ10o
aHR0cDovL2FwaS5qcXVlcnkuY29tL2NhdGVnb3J5L3NlbGVjdG9ycy8pLgorICAgICAgIEBwcml2
YXRlCisgICAgICBAcHJvcGVydHkge1N0cmluZ3xET01FbGVtZW50fSByb290RWxlbWVudAorICAg
ICovCisgICAgcm9vdEVsZW1lbnQ6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICAvLyBSZWdp
c3RlciB0aGlzIGluc3RhbmNlIGluIHRoZSBwZXItaW5zdGFuY2UgcmVnaXN0cnkuCisgICAgICAv
LworICAgICAgLy8gV2h5IGRvIHdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGluc3RhbmNlIGluIHRo
ZSBmaXJzdCBwbGFjZT8KKyAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCBhIGdvb2Qgd2F5IGZvciB0
aGUgcm9vdCByb3V0ZSAoYS5rLmEgQXBwbGljYXRpb25Sb3V0ZSkKKyAgICAgIC8vIHRvIG5vdGlm
eSB1cyB3aGVuIGl0IGhhcyBjcmVhdGVkIHRoZSByb290LW1vc3Qgdmlldy4gVGhhdCB2aWV3IGlz
IHRoZW4KKyAgICAgIC8vIGFwcGVuZGVkIHRvIHRoZSByb290RWxlbWVudCwgaW4gdGhlIGNhc2Ug
b2YgYXBwcywgdG8gdGhlIGZpeHR1cmUgaGFybmVzcworICAgICAgLy8gaW4gdGVzdHMsIG9yIHJl
bmRlcmVkIHRvIGEgc3RyaW5nIGluIHRoZSBjYXNlIG9mIEZhc3RCb290LgorICAgICAgdGhpcy5y
ZWdpc3RlcignLWFwcGxpY2F0aW9uLWluc3RhbmNlOm1haW4nLCB0aGlzLCB7IGluc3RhbnRpYXRl
OiBmYWxzZSB9KTsKKworICAgICAgdGhpcy5fYm9vdGVkID0gZmFsc2U7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgSW5pdGlhbGl6ZSB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2VgIGFu
ZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMKKyAgICAgIHdpdGggdGhlIGluc3RhbmNl
IGl0c2VsZiB3aGVuIHRoZSBib290IHByb2Nlc3MgaXMgY29tcGxldGUuCisgICAgICAgVGhlIHBy
aW1hcnkgdGFzayBoZXJlIGlzIHRvIHJ1biBhbnkgcmVnaXN0ZXJlZCBpbnN0YW5jZSBpbml0aWFs
aXplcnMuCisgICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBCb290T3B0aW9uc2AgZm9y
IHRoZSBvcHRpb25zIGl0IHRha2VzLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGJv
b3QKKyAgICAgIEBwYXJhbSBvcHRpb25zCisgICAgICBAcmV0dXJuIHtQcm9taXNlPEVtYmVyLkFw
cGxpY2F0aW9uSW5zdGFuY2UsRXJyb3I+fQorICAgICovCisgICAgYm9vdDogZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVu
dHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3Vt
ZW50c1swXTsKKworICAgICAgaWYgKHRoaXMuX2Jvb3RQcm9taXNlKSB7CisgICAgICAgIHJldHVy
biB0aGlzLl9ib290UHJvbWlzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fYm9vdFByb21pc2Ug
PSBuZXcgX2VtYmVyUnVudGltZUV4dFJzdnAuZGVmYXVsdC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNv
bHZlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlKF90aGlzLl9ib290U3luYyhvcHRpb25zKSk7
CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRoaXMuX2Jvb3RQcm9taXNlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFVuZm9ydHVuYXRlbHksIGEgbG90IG9mIGV4aXN0aW5nIGNvZGUgYXNz
dW1lcyBib290aW5nIGFuIGluc3RhbmNlIGlzCisgICAgICBzeW5jaHJvbm91cyDigJMgc3BlY2lm
aWNhbGx5LCBhIGxvdCBvZiB0ZXN0cyBhc3N1bWVzIHRoZSBsYXN0IGNhbGwgdG8KKyAgICAgIGBh
cHAuYWR2YW5jZVJlYWRpbmVzcygpYCBvciBgYXBwLnJlc2V0KClgIHdpbGwgcmVzdWx0IGluIGEg
bmV3IGluc3RhbmNlCisgICAgICBiZWluZyBmdWxseS1ib290ZWQgd2hlbiB0aGUgY3VycmVudCBy
dW5sb29wIGNvbXBsZXRlcy4KKyAgICAgICBXZSB3b3VsZCBsaWtlIG5ldyBjb2RlIChsaWtlIHRo
ZSBgdmlzaXRgIEFQSSkgdG8gc3RvcCBtYWtpbmcgdGhpcyBhc3N1bXB0aW9uLAorICAgICAgc28g
d2UgY3JlYXRlZCB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gYWJvdmUgdGhhdCByZXR1cm5zIGEg
cHJvbWlzZS4gQnV0IHVudGlsCisgICAgICB3ZSBoYXZlIG1pZ3JhdGVkIGFsbCB0aGUgY29kZSwg
d2Ugd291bGQgaGF2ZSB0byBleHBvc2UgdGhpcyBtZXRob2QgZm9yIHVzZQorICAgICAgKmludGVy
bmFsbHkqIGluIHBsYWNlcyB3aGVyZSB3ZSBuZWVkIHRvIGJvb3QgYW4gaW5zdGFuY2Ugc3luY2hy
b25vdXNseS4KKyAgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2Jvb3RTeW5jOiBmdW5jdGlv
biAob3B0aW9ucykgeworICAgICAgaWYgKHRoaXMuX2Jvb3RlZCkgeworICAgICAgICByZXR1cm4g
dGhpczsKKyAgICAgIH0KKworICAgICAgb3B0aW9ucyA9IG5ldyBCb290T3B0aW9ucyhvcHRpb25z
KTsKKworICAgICAgdmFyIHJlZ2lzdHJ5ID0gdGhpcy5fX3JlZ2lzdHJ5X187CisKKyAgICAgIHJl
Z2lzdHJ5LnJlZ2lzdGVyKCctZW52aXJvbm1lbnQ6bWFpbicsIG9wdGlvbnMudG9FbnZpcm9ubWVu
dCgpLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKyAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
dmlldycsICdfZW52aXJvbm1lbnQnLCAnLWVudmlyb25tZW50Om1haW4nKTsKKyAgICAgIHJlZ2lz
dHJ5LmluamVjdGlvbigncm91dGUnLCAnX2Vudmlyb25tZW50JywgJy1lbnZpcm9ubWVudDptYWlu
Jyk7CisKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdzZXJ2aWNlOi1kb2N1bWVudCcsIG9wdGlv
bnMuZG9jdW1lbnQsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworCisgICAgICBpZiAob3B0aW9u
cy5pc0ludGVyYWN0aXZlKSB7CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldycsICdy
ZW5kZXJlcicsICdyZW5kZXJlcjotZG9tJyk7CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
Y29tcG9uZW50JywgJ3JlbmRlcmVyJywgJ3JlbmRlcmVyOi1kb20nKTsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldycsICdyZW5kZXJlcicsICdyZW5kZXJl
cjotaW5lcnQnKTsKKyAgICAgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdjb21wb25lbnQnLCAncmVu
ZGVyZXInLCAncmVuZGVyZXI6LWluZXJ0Jyk7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25z
LnJvb3RFbGVtZW50KSB7CisgICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSBvcHRpb25zLnJvb3RF
bGVtZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IHRoaXMu
YXBwbGljYXRpb24ucm9vdEVsZW1lbnQ7CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25zLmxv
Y2F0aW9uKSB7CisgICAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ3JvdXRlcicpOworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQo
cm91dGVyLCAnbG9jYXRpb24nLCBvcHRpb25zLmxvY2F0aW9uKTsKKyAgICAgIH0KKworICAgICAg
dGhpcy5hcHBsaWNhdGlvbi5ydW5JbnN0YW5jZUluaXRpYWxpemVycyh0aGlzKTsKKworICAgICAg
aWYgKG9wdGlvbnMuaXNJbnRlcmFjdGl2ZSkgeworICAgICAgICB0aGlzLnNldHVwRXZlbnREaXNw
YXRjaGVyKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX2Jvb3RlZCA9IHRydWU7CisKKyAgICAg
IHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICByb3V0ZXI6IF9lbWJlck1ldGFsQ29tcHV0ZWQu
Y29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMubG9va3VwKCdyb3V0ZXI6
bWFpbicpOworICAgIH0pLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIFRoaXMgaG9vayBp
cyBjYWxsZWQgYnkgdGhlIHJvb3QtbW9zdCBSb3V0ZSAoYS5rLmEuIHRoZSBBcHBsaWNhdGlvblJv
dXRlKQorICAgICAgd2hlbiBpdCBoYXMgZmluaXNoZWQgY3JlYXRpbmcgdGhlIHJvb3QgVmlldy4g
QnkgZGVmYXVsdCwgd2Ugc2ltcGx5IHRha2UgdGhlCisgICAgICB2aWV3IGFuZCBhcHBlbmQgaXQg
dG8gdGhlIGByb290RWxlbWVudGAgc3BlY2lmaWVkIG9uIHRoZSBBcHBsaWNhdGlvbi4KKyAgICAg
ICBJbiBjYXNlcyBsaWtlIEZhc3RCb290IGFuZCB0ZXN0aW5nLCB3ZSBjYW4gb3ZlcnJpZGUgdGhp
cyBob29rIGFuZCBpbXBsZW1lbnQKKyAgICAgIGN1c3RvbSBiZWhhdmlvciwgc3VjaCBhcyBzZXJp
YWxpemluZyB0byBhIHN0cmluZyBhbmQgc2VuZGluZyBvdmVyIGFuIEhUVFAKKyAgICAgIHNvY2tl
dCByYXRoZXIgdGhhbiBhcHBlbmRpbmcgdG8gRE9NLgorICAgICAgIEBwYXJhbSB2aWV3IHtFbWJl
ci5WaWV3fSB0aGUgcm9vdC1tb3N0IHZpZXcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBk
aWRDcmVhdGVSb290VmlldzogZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgIHZpZXcuYXBwZW5kVG8o
dGhpcy5yb290RWxlbWVudCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGVsbHMgdGhlIHJv
dXRlciB0byBzdGFydCByb3V0aW5nLiBUaGUgcm91dGVyIHdpbGwgYXNrIHRoZSBsb2NhdGlvbiBm
b3IgdGhlCisgICAgICBjdXJyZW50IFVSTCBvZiB0aGUgcGFnZSB0byBkZXRlcm1pbmUgdGhlIGlu
aXRpYWwgVVJMIHRvIHN0YXJ0IHJvdXRpbmcgdG8uCisgICAgICBUbyBzdGFydCB0aGUgYXBwIGF0
IGEgc3BlY2lmaWMgVVJMLCBjYWxsIGBoYW5kbGVVUkxgIGluc3RlYWQuCisgICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIHN0YXJ0Um91dGluZzogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJv
dXRlciA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAg
ICByb3V0ZXIuc3RhcnRSb3V0aW5nKCk7CisgICAgICB0aGlzLl9kaWRTZXR1cFJvdXRlciA9IHRy
dWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBTZXRzIHVwIHRo
ZSByb3V0ZXIsIGluaXRpYWxpemluZyB0aGUgY2hpbGQgcm91dGVyIGFuZCBjb25maWd1cmluZyB0
aGUKKyAgICAgIGxvY2F0aW9uIGJlZm9yZSByb3V0aW5nIGJlZ2lucy4KKyAgICAgICBCZWNhdXNl
IHNldHVwIHNob3VsZCBvbmx5IG9jY3VyIG9uY2UsIG11bHRpcGxlIGNhbGxzIHRvIGBzZXR1cFJv
dXRlcmAKKyAgICAgIGJleW9uZCB0aGUgZmlyc3QgY2FsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICAq
LworICAgIHNldHVwUm91dGVyOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5fZGlkU2V0
dXBSb3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5fZGlkU2V0
dXBSb3V0ZXIgPSB0cnVlOworCisgICAgICB2YXIgcm91dGVyID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKyAgICAgIHJvdXRlci5zZXR1cFJvdXRlcigpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIERpcmVjdHMgdGhlIHJvdXRlciB0byByb3V0ZSB0byBh
IHBhcnRpY3VsYXIgVVJMLiBUaGlzIGlzIHVzZWZ1bCBpbiB0ZXN0cywKKyAgICAgIGZvciBleGFt
cGxlLCB0byB0ZWxsIHRoZSBhcHAgdG8gc3RhcnQgYXQgYSBwYXJ0aWN1bGFyIFVSTC4KKyAgICAg
ICBAcGFyYW0gdXJsIHtTdHJpbmd9IHRoZSBVUkwgdGhlIHJvdXRlciBzaG91bGQgcm91dGUgdG8K
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYW5kbGVVUkw6IGZ1bmN0aW9uICh1cmwpIHsK
KyAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Jv
dXRlcicpOworCisgICAgICB0aGlzLnNldHVwUm91dGVyKCk7CisgICAgICByZXR1cm4gcm91dGVy
LmhhbmRsZVVSTCh1cmwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAg
Ki8KKyAgICBzZXR1cEV2ZW50RGlzcGF0Y2hlcjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGRp
c3BhdGNoZXIgPSB0aGlzLmxvb2t1cCgnZXZlbnRfZGlzcGF0Y2hlcjptYWluJyk7CisgICAgICB2
YXIgYXBwbGljYXRpb25DdXN0b21FdmVudHMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcy5hcHBsaWNhdGlvbiwgJ2N1c3RvbUV2ZW50cycpOworICAgICAgdmFyIGluc3RhbmNlQ3Vz
dG9tRXZlbnRzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjdXN0b21FdmVu
dHMnKTsKKworICAgICAgdmFyIGN1c3RvbUV2ZW50cyA9IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1
bHQoe30sIGFwcGxpY2F0aW9uQ3VzdG9tRXZlbnRzLCBpbnN0YW5jZUN1c3RvbUV2ZW50cyk7Cisg
ICAgICBkaXNwYXRjaGVyLnNldHVwKGN1c3RvbUV2ZW50cywgdGhpcy5yb290RWxlbWVudCk7CisK
KyAgICAgIHJldHVybiBkaXNwYXRjaGVyOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVy
bnMgdGhlIGN1cnJlbnQgVVJMIG9mIHRoZSBhcHAgaW5zdGFuY2UuIFRoaXMgaXMgdXNlZnVsIHdo
ZW4geW91cgorICAgICAgYXBwIGRvZXMgbm90IHVwZGF0ZSB0aGUgYnJvd3NlcnMgVVJMIGJhciAo
aS5lLiBpdCB1c2VzIHRoZSBgJ25vbmUnYAorICAgICAgbG9jYXRpb24gYWRhcHRlcikuCisgICAg
ICAgQHB1YmxpYworICAgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgY3VycmVudCBVUkwKKyAgICAq
LworICAgIGdldFVSTDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJvdXRlciA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAgICByZXR1cm4gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlciwgJ3VybCcpOworICAgIH0sCisKKyAgICAvLyBg
aW5zdGFuY2UudmlzaXQodXJsKWAgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBgaW5zdGFuY2Uu
aGFuZGxlVVJMKClgOworICAgIC8vIHRoZSB0ZXN0IGhlbHBlcnMgY2FuIHByb2JhYmx5IGJlIHN3
aXRjaGVkIHRvIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvbworCisgICAgLyoqCisgICAgICBO
YXZpZ2F0ZSB0aGUgaW5zdGFuY2UgdG8gYSBwYXJ0aWN1bGFyIFVSTC4gVGhpcyBpcyB1c2VmdWwg
aW4gdGVzdHMsIGZvcgorICAgICAgZXhhbXBsZSwgb3IgdG8gdGVsbCB0aGUgYXBwIHRvIHN0YXJ0
IGF0IGEgcGFydGljdWxhciBVUkwuIFRoaXMgbWV0aG9kCisgICAgICByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFwcCBpbnN0YW5jZSB3aGVuIHRoZSB0cmFuc2l0aW9u
CisgICAgICBpcyBjb21wbGV0ZSwgb3IgcmVqZWN0cyBpZiB0aGUgdHJhbnNpb24gd2FzIGFib3J0
ZWQgZHVlIHRvIGFuIGVycm9yLgorICAgICAgIEBwdWJsaWMKKyAgICAgIEBwYXJhbSB1cmwge1N0
cmluZ30gdGhlIGRlc3RpbmF0aW9uIFVSTAorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgICAq
LworICAgIHZpc2l0OiBmdW5jdGlvbiAodXJsKSB7CisgICAgICB2YXIgX3RoaXMyID0gdGhpczsK
KworICAgICAgdGhpcy5zZXR1cFJvdXRlcigpOworCisgICAgICB2YXIgcm91dGVyID0gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKworICAgICAgdmFyIGhhbmRs
ZVJlc29sdmUgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIC8vIFJlc29sdmUgb25seSBhZnRlciBy
ZW5kZXJpbmcgaXMgY29tcGxldGUKKyAgICAgICAgcmV0dXJuIG5ldyBfZW1iZXJSdW50aW1lRXh0
UnN2cC5kZWZhdWx0LlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKKyAgICAgICAgICAvLyBU
T0RPOiB3aHkgaXMgdGhpcyBuZWNlc3Nhcnk/IFNob3VsZG4ndCAnYWN0aW9ucycgcXVldWUgYmUg
ZW5vdWdoPworICAgICAgICAgIC8vIEFsc28sIGFyZW4ndCBwcm9pbXNlcyBzdXBwb3NlZCB0byBi
ZSBhc3luYyBhbnl3YXk/CisgICAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm5l
eHQobnVsbCwgcmVzb2x2ZSwgX3RoaXMyKTsKKyAgICAgICAgfSk7CisgICAgICB9OworCisgICAg
ICB2YXIgaGFuZGxlUmVqZWN0ID0gZnVuY3Rpb24gKGVycm9yKSB7CisgICAgICAgIGlmIChlcnJv
ci5lcnJvcikgeworICAgICAgICAgIHRocm93IGVycm9yLmVycm9yOworICAgICAgICB9IGVsc2Ug
aWYgKGVycm9yLm5hbWUgPT09ICdUcmFuc2l0aW9uQWJvcnRlZCcgJiYgcm91dGVyLnJvdXRlci5h
Y3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHJvdXRlci5yb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbi50aGVuKGhhbmRsZVJlc29sdmUsIGhhbmRsZVJlamVjdCk7CisgICAgICAgIH0g
ZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1RyYW5zaXRpb25BYm9ydGVkJykgeworICAgICAgICAg
IHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdmFyIGxvY2F0
aW9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlciwgJ2xvY2F0aW9uJyk7CisK
KyAgICAgIC8vIEtlZXBzIHRoZSBsb2NhdGlvbiBhZGFwdGVyJ3MgaW50ZXJuYWwgVVJMIGluLXN5
bmMKKyAgICAgIGxvY2F0aW9uLnNldFVSTCh1cmwpOworCisgICAgICAvLyBnZXRVUkwgcmV0dXJu
cyB0aGUgc2V0IHVybCB3aXRoIHRoZSByb290VVJMIHN0cmlwcGVkIG9mZgorICAgICAgcmV0dXJu
IHJvdXRlci5oYW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkpLnRoZW4oaGFuZGxlUmVzb2x2ZSwg
aGFuZGxlUmVqZWN0KTsKKyAgICB9CisgIH0pOworCisgIC8qKgorICAgIEEgbGlzdCBvZiBib290
LXRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB0aGUgYmVoYXZpb3Ig
b2YKKyAgICBhbiBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZWAuCisgIAorICAgIFRoaXMgaXMg
YW4gaW50ZXJmYWNlIGNsYXNzIHRoYXQgZXhpc3RzIHB1cmVseSB0byBkb2N1bWVudCB0aGUgYXZh
aWxhYmxlCisgICAgb3B0aW9uczsgeW91IGRvIG5vdCBuZWVkIHRvIGNvbnN0cnVjdCBpdCBtYW51
YWxseS4gU2ltcGx5IHBhc3MgYSByZWd1bGFyCisgICAgSmF2YVNjcmlwdCBvYmplY3QgY29udGFp
bmluZyB0aGUgZGVzaXJlZCBvcHRpb25zIGludG8gbWV0aG9kcyB0aGF0IHJlcXVpcmUKKyAgICBv
bmUgb2YgdGhlc2Ugb3B0aW9ucyBvYmplY3Q6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBN
eUFwcC52aXNpdCgiLyIsIHsgbG9jYXRpb246ICJub25lIiwgcm9vdEVsZW1lbnQ6ICIjY29udGFp
bmVyIiB9KTsKKyAgICBgYGAKKyAgCisgICAgTm90IGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIHN1
cHBvcnRlZCBvcHRpb25zIGFyZSB2YWxpZC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uCisgICAgb24g
YEVtYmVyLkFwcGxpY2F0aW9uI3Zpc2l0YCBmb3IgdGhlIHN1cHBvcnRlZCBjb25maWd1cmF0aW9u
cy4KKyAgCisgICAgSW50ZXJuYWwsIGV4cGVyaW1lbnRhbCBvciBvdGhlcndpc2UgdW5zdGFibGUg
ZmxhZ3MgYXJlIG1hcmtlZCBhcyBwcml2YXRlLgorICAKKyAgICBAY2xhc3MgQm9vdE9wdGlvbnMK
KyAgICBAbmFtZXNwYWNlIEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UKKyAgICBAcHVibGljCisg
ICovCisgIEJvb3RPcHRpb25zID0gZnVuY3Rpb24gQm9vdE9wdGlvbnMoKSB7CisgICAgdmFyIG9w
dGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmlu
ZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKKworICAgIC8qKgorICAgICAgUHJvdmlkZSBhIHNwZWNp
ZmljIGluc3RhbmNlIG9mIGpRdWVyeS4gVGhpcyBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0
aAorICAgICAgdGhlIGBkb2N1bWVudGAgb3B0aW9uLCBhcyBpdCBhbGxvd3MgeW91IHRvIHVzZSBh
IGNvcHkgb2YgYGpRdWVyeWAgdGhhdCBpcworICAgICAgYXBwcm9wcmlhdGVseSBib3VuZCB0byB0
aGUgZm9yZWlnbiBgZG9jdW1lbnRgIChlLmcuIGEganNkb20pLgorICAgICAgIFRoaXMgaXMgaGln
aGx5IGV4cGVyaW1lbnRhbCBhbmQgc3VwcG9ydCB2ZXJ5IGluY29tcGxldGUgYXQgdGhlIG1vbWVu
dC4KKyAgICAgICBAcHJvcGVydHkgalF1ZXJ5CisgICAgICBAdHlwZSBPYmplY3QKKyAgICAgIEBk
ZWZhdWx0IGF1dG8tZGV0ZWN0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICB0aGlzLmpR
dWVyeSA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQ7IC8vIFRoaXMgZGVmYXVsdCBp
cyBvdmVycmlkYWJsZSBiZWxvdworCisgICAgLyoqCisgICAgICBJbnRlcmFjdGl2ZSBtb2RlOiB3
aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIGV2ZW50IGRlbGVnYXRpb24gYW5kIGludm9rZQorICAg
ICAgbGlmZWN5Y2xlIGNhbGxiYWNrcyBvbiBDb21wb25lbnRzLgorICAgICAgIEBwcm9wZXJ0eSBp
c0ludGVyYWN0aXZlCisgICAgICBAdHlwZSBib29sZWFuCisgICAgICBAZGVmYXVsdCBhdXRvLWRl
dGVjdGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgdGhpcy5pc0ludGVyYWN0aXZlID0g
X2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTTsgLy8gVGhpcyBkZWZhdWx0IGlz
IG92ZXJyaWRhYmxlIGJlbG93CisKKyAgICAvKioKKyAgICAgIFJ1biBpbiBhIGZ1bGwgYnJvd3Nl
ciBlbnZpcm9ubWVudC4KKyAgICAgICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gYGZhbHNlYCwg
aXQgd2lsbCBkaXNhYmxlIG1vc3QgYnJvd3Nlci1zcGVjaWZpYworICAgICAgYW5kIGludGVyYWN0
aXZlIGZlYXR1cmVzLiBTcGVjaWZpY2FsbHk6CisgICAgICAgKiBJdCBkb2VzIG5vdCB1c2UgYGpR
dWVyeWAgdG8gYXBwZW5kIHRoZSByb290IHZpZXc7IHRoZSBgcm9vdEVsZW1lbnRgCisgICAgICAg
IChlaXRoZXIgc3BlY2lmaWVkIGFzIGEgc3Vic2VxdWVudCBvcHRpb24gb3Igb24gdGhlIGFwcGxp
Y2F0aW9uIGl0c2VsZikKKyAgICAgICAgbXVzdCBhbHJlYWR5IGJlIGFuIGBFbGVtZW50YCBpbiB0
aGUgZ2l2ZW4gYGRvY3VtZW50YCAoYXMgb3Bwb3NlZCB0byBhCisgICAgICAgIHN0cmluZyBzZWxl
Y3RvcikuCisgICAgICAgKiBJdCBkb2VzIG5vdCBzZXQgdXAgYW4gYEV2ZW50RGlzcGF0Y2hlcmAu
CisgICAgICAgKiBJdCBkb2VzIG5vdCBydW4gYW55IGBDb21wb25lbnRgIGxpZmVjeWNsZSBob29r
cyAoc3VjaCBhcyBgZGlkSW5zZXJ0RWxlbWVudGApLgorICAgICAgICogSXQgc2V0cyB0aGUgYGxv
Y2F0aW9uYCBvcHRpb24gdG8gYCJub25lImAuIChJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UKKyAg
ICAgICAgdGhlIGxvY2F0aW9uIGFkYXB0ZXIgc3BlY2lmaWVkIGluIHRoZSBhcHAncyByb3V0ZXIg
aW5zdGVhZCwgeW91IGNhbiBhbHNvCisgICAgICAgIHNwZWNpZnkgYHsgbG9jYXRpb246IG51bGwg
fWAgdG8gc3BlY2lmaWNhbGx5IG9wdC1vdXQuKQorICAgICAgIEBwcm9wZXJ0eSBpc0Jyb3dzZXIK
KyAgICAgIEB0eXBlIGJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IGF1dG8tZGV0ZWN0ZWQKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGlmIChvcHRpb25zLmlzQnJvd3NlciAhPT0gdW5kZWZpbmVk
KSB7CisgICAgICB0aGlzLmlzQnJvd3NlciA9ICEhb3B0aW9ucy5pc0Jyb3dzZXI7CisgICAgfSBl
bHNlIHsKKyAgICAgIHRoaXMuaXNCcm93c2VyID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0Lmhhc0RPTTsKKyAgICB9CisKKyAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7CisgICAgICB0
aGlzLmpRdWVyeSA9IG51bGw7CisgICAgICB0aGlzLmlzSW50ZXJhY3RpdmUgPSBmYWxzZTsKKyAg
ICAgIHRoaXMubG9jYXRpb24gPSAnbm9uZSc7CisgICAgfQorCisgICAgLyoqCisgICAgICBEaXNh
YmxlIHJlbmRlcmluZyBjb21wbGV0ZWx5LgorICAgICAgIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0
byBgdHJ1ZWAsIGl0IHdpbGwgZGlzYWJsZSB0aGUgZW50aXJlIHJlbmRlcmluZworICAgICAgcGlw
ZWxpbmUuIEVzc2VudGlhbGx5LCB0aGlzIHB1dHMgdGhlIGFwcCBpbnRvICJyb3V0aW5nLW9ubHki
IG1vZGUuIE5vCisgICAgICB0ZW1wbGF0ZXMgd2lsbCBiZSByZW5kZXJlZCwgYW5kIG5vIENvbXBv
bmVudHMgd2lsbCBiZSBjcmVhdGVkLgorICAgICAgIEBwcm9wZXJ0eSBzaG91bGRSZW5kZXIKKyAg
ICAgIEB0eXBlIGJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IHRydWUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGlmIChvcHRpb25zLnNob3VsZFJlbmRlciAhPT0gdW5kZWZpbmVkKSB7CisgICAg
ICB0aGlzLnNob3VsZFJlbmRlciA9ICEhb3B0aW9ucy5zaG91bGRSZW5kZXI7CisgICAgfSBlbHNl
IHsKKyAgICAgIHRoaXMuc2hvdWxkUmVuZGVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXRo
aXMuc2hvdWxkUmVuZGVyKSB7CisgICAgICB0aGlzLmpRdWVyeSA9IG51bGw7CisgICAgICB0aGlz
LmlzSW50ZXJhY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgIElmIHByZXNl
bnQsIHJlbmRlciBpbnRvIHRoZSBnaXZlbiBgRG9jdW1lbnRgIG9iamVjdCBpbnN0ZWFkIG9mIHRo
ZQorICAgICAgZ2xvYmFsIGB3aW5kb3cuZG9jdW1lbnRgIG9iamVjdC4KKyAgICAgICBJbiBwcmFj
dGljZSwgdGhpcyBpcyBvbmx5IHVzZWZ1bCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBp
bgorICAgICAgbm9uLWludGVyYWN0aXZlIG1vZGUsIGJlY2F1c2UgRW1iZXIncyBgalF1ZXJ5YCBk
ZXBlbmRlbmN5IGlzCisgICAgICBpbXBsaWNpdGx5IGJvdW5kIHRvIHRoZSBjdXJyZW50IGRvY3Vt
ZW50LCBjYXVzaW5nIGV2ZW50IGRlbGVnYXRpb24KKyAgICAgIHRvIG5vdCB3b3JrIHByb3Blcmx5
IHdoZW4gdGhlIGFwcCBpcyByZW5kZXJlZCBpbnRvIGEgZm9yZWlnbgorICAgICAgZG9jdW1lbnQg
b2JqZWN0IChzdWNoIGFzIGFuIGlmcmFtZSdzIGBjb250ZW50RG9jdW1lbnRgKS4KKyAgICAgICBJ
biBub24tYnJvd3NlciBtb2RlLCB0aGlzIGNvdWxkIGJlIGEgImBEb2N1bWVudGAtbGlrZSIgb2Jq
ZWN0IGFzCisgICAgICBFbWJlciBvbmx5IGludGVyYWN0IHdpdGggYSBzbWFsbCBzdWJzZXQgb2Yg
dGhlIERPTSBBUEkgaW4gbm9uLQorICAgICAgaW50ZXJhY3RpdmUgbW9kZS4gV2hpbGUgdGhlIGV4
YWN0IHJlcXVpcmVtZW50cyBoYXZlIG5vdCB5ZXQgYmVlbgorICAgICAgZm9ybWFsaXplZCwgdGhl
IGBTaW1wbGVET01gIGxpYnJhcnkncyBpbXBsZW1lbnRhdGlvbiBpcyBrbm93biB0bworICAgICAg
d29yay4KKyAgICAgICBAcHJvcGVydHkgZG9jdW1lbnQKKyAgICAgIEB0eXBlIERvY3VtZW50Cisg
ICAgICBAZGVmYXVsdCB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgb2JqZWN0CisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICBpZiAob3B0aW9ucy5kb2N1bWVudCkgeworICAgICAgdGhpcy5kb2N1bWVu
dCA9IG9wdGlvbnMuZG9jdW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuZG9jdW1lbnQg
PSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsOworICAg
IH0KKworICAgIC8qKgorICAgICAgSWYgcHJlc2VudCwgb3ZlcnJpZGVzIHRoZSBhcHBsaWNhdGlv
bidzIGByb290RWxlbWVudGAgcHJvcGVydHkgb24KKyAgICAgIHRoZSBpbnN0YW5jZS4gVGhpcyBp
cyB1c2VmdWwgZm9yIHRlc3RpbmcgZW52aXJvbm1lbnQsIHdoZXJlIHlvdQorICAgICAgbWlnaHQg
d2FudCB0byBhcHBlbmQgdGhlIHJvb3QgdmlldyB0byBhIGZpeHR1cmUgYXJlYS4KKyAgICAgICBJ
biBub24tYnJvd3NlciBtb2RlLCBiZWNhdXNlIEVtYmVyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRv
IGpRdWVyeSwKKyAgICAgIHRoaXMgb3B0aW9ucyBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIERPTSBg
RWxlbWVudGAgb2JqZWN0IGluc3RlYWQgb2YKKyAgICAgIGEgc2VsZWN0b3Igc3RyaW5nLgorICAg
ICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBgRW1iZXIuQXBwbGljYXRpb25zYCdzIGByb290
RWxlbWVudGAgZm9yCisgICAgICBkZXRhaWxzLgorICAgICAgIEBwcm9wZXJ0eSByb290RWxlbWVu
dAorICAgICAgQHR5cGUgU3RyaW5nfEVsZW1lbnQKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAg
IEBwdWJsaWMKKyAgICAgKi8KKyAgICBpZiAob3B0aW9ucy5yb290RWxlbWVudCkgeworICAgICAg
dGhpcy5yb290RWxlbWVudCA9IG9wdGlvbnMucm9vdEVsZW1lbnQ7CisgICAgfQorCisgICAgLy8g
U2V0IHRoZXNlIG9wdGlvbnMgbGFzdCB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIG92ZXJy
aWRlIHRoZQorICAgIC8vIGRlZmF1bHRzIGZyb20gdGhlICJjb21ibyIgb3B0aW9ucyBsaWtlIGBp
c0Jyb3dzZXJgIChhbHRob3VnaCBpbgorICAgIC8vIHByYWN0aWNlLCB0aGUgcmVzdWx0aW5nIGNv
bWJpbmF0aW9uIGlzIHByb2JhYmx5IGludmFsaWQpCisKKyAgICAvKioKKyAgICAgIElmIHByZXNl
bnQsIG92ZXJyaWRlcyB0aGUgcm91dGVyJ3MgYGxvY2F0aW9uYCBwcm9wZXJ0eSB3aXRoIHRoaXMK
KyAgICAgIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW52aXJvbm1lbnRzIHdoZXJlIHRyeWlu
ZyB0byBtb2RpZnkgdGhlCisgICAgICBVUkwgd291bGQgYmUgaW5hcHByb3ByaWF0ZS4KKyAgICAg
ICBAcHJvcGVydHkgbG9jYXRpb24KKyAgICAgIEB0eXBlIHN0cmluZworICAgICAgQGRlZmF1bHQg
bnVsbAorICAgICAgQHB1YmxpYworICAgICovCisgICAgaWYgKG9wdGlvbnMubG9jYXRpb24gIT09
IHVuZGVmaW5lZCkgeworICAgICAgdGhpcy5sb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247Cisg
ICAgfQorCisgICAgaWYgKG9wdGlvbnMualF1ZXJ5ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRo
aXMualF1ZXJ5ID0gb3B0aW9ucy5qUXVlcnk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMuaXNJ
bnRlcmFjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLmlzSW50ZXJhY3RpdmUgPSAh
IW9wdGlvbnMuaXNJbnRlcmFjdGl2ZTsKKyAgICB9CisgIH07CisKKyAgQm9vdE9wdGlvbnMucHJv
dG90eXBlLnRvRW52aXJvbm1lbnQgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGVudiA9IF9lbWJl
ck1ldGFsQXNzaWduLmRlZmF1bHQoe30sIF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdCk7
CisgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlCisgICAgZW52Lmhh
c0RPTSA9IHRoaXMuaXNCcm93c2VyOworICAgIGVudi5vcHRpb25zID0gdGhpczsKKyAgICByZXR1
cm4gZW52OworICB9OworCisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvbkluc3Rh
bmNlLnByb3RvdHlwZSwgJ2NvbnRhaW5lcicsIHsKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisg
ICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIg
aW5zdGFuY2UgPSB0aGlzOworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbG9va3VwOiBmdW5jdGlv
biAoKSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1VzaW5nIGBBcHBs
aWNhdGlvbkluc3RhbmNlLmNvbnRhaW5lci5sb29rdXBgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1
c2UgYEFwcGxpY2F0aW9uSW5zdGFuY2UubG9va3VwYCBpbnN0ZWFkLicsIGZhbHNlLCB7CisgICAg
ICAgICAgICBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLmFwcC1pbnN0YW5jZS1jb250YWluZXInLAor
ICAgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAgICAgICB1cmw6ICdodHRwOi8vZW1i
ZXJqcy5jb20vZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1hcHBsaWNhdGlvbmluc3RhbmNl
LWNvbnRhaW5lcicKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gaW5zdGFuY2UubG9v
a3VwLmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICB9OworICAg
IH0KKyAgfSk7CisKKyAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFwcGxpY2F0aW9uSW5zdGFuY2Uu
cHJvdG90eXBlLCAncmVnaXN0cnknLCB7CisgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgIGVu
dW1lcmFibGU6IGZhbHNlLAorICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9l
bWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94eS5idWlsZEZha2VSZWdpc3RyeVdpdGhEZXBy
ZWNhdGlvbnModGhpcywgJ0FwcGxpY2F0aW9uSW5zdGFuY2UnKTsKKyAgICB9CisgIH0pOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEFwcGxpY2F0aW9uSW5zdGFuY2U7Cit9KTsKK2VuaWZlZCgnZW1i
ZXItYXBwbGljYXRpb24vc3lzdGVtL2FwcGxpY2F0aW9uJywgWydleHBvcnRzJywgJ2VtYmVyLW1l
dGFsJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdl
bWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAn
ZW1iZXItcnVudGltZS9jb250cm9sbGVycy9jb250cm9sbGVyJywgJ2VtYmVyLWh0bWxiYXJzL3N5
c3RlbS9kb20taGVscGVyJywgJ2VtYmVyLW1ldGFsLXZpZXdzJywgJ2VtYmVyLWh0bWxiYXJzL3Rl
bXBsYXRlcy90b3AtbGV2ZWwtdmlldycsICdlbWJlci1yb3V0aW5nLXZpZXdzL3ZpZXdzL291dGxl
dCcsICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9ldmVudF9k
aXNwYXRjaGVyJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItcm91dGluZy9z
eXN0ZW0vcm91dGUnLCAnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGVyJywgJ2VtYmVyLXJvdXRp
bmcvbG9jYXRpb24vaGFzaF9sb2NhdGlvbicsICdlbWJlci1yb3V0aW5nL2xvY2F0aW9uL2hpc3Rv
cnlfbG9jYXRpb24nLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi9hdXRvX2xvY2F0aW9uJywgJ2Vt
YmVyLXJvdXRpbmcvbG9jYXRpb24vbm9uZV9sb2NhdGlvbicsICdlbWJlci1yb3V0aW5nL3N5c3Rl
bS9jYWNoZScsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vYXBwbGljYXRpb24taW5zdGFuY2Un
LCAnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9maWVsZCcsICdlbWJlci12aWV3cy92aWV3cy90ZXh0
X2FyZWEnLCAnZW1iZXItdmlld3Mvdmlld3MvY2hlY2tib3gnLCAnZW1iZXItcm91dGluZy12aWV3
cy9jb21wb25lbnRzL2xpbmstdG8nLCAnZW1iZXItcm91dGluZy9zZXJ2aWNlcy9yb3V0aW5nJywg
J2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2NvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyJywgJ2VtYmVy
LXJ1bnRpbWUvbWl4aW5zL3JlZ2lzdHJ5X3Byb3h5JywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdl
bWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci1ydW50aW1lL2V4dC9yc3ZwJywgJ2VtYmVy
LWFwcGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWwsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LCBfZW1iZXJSdW50aW1lU3lzdGVtTGF6eV9sb2FkLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1i
ZXJSdW50aW1lQ29udHJvbGxlcnNDb250cm9sbGVyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhl
bHBlciwgX2VtYmVyTWV0YWxWaWV3cywgX2VtYmVySHRtbGJhcnNUZW1wbGF0ZXNUb3BMZXZlbFZp
ZXcsIF9lbWJlclJvdXRpbmdWaWV3c1ZpZXdzT3V0bGV0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldywg
X2VtYmVyVmlld3NTeXN0ZW1FdmVudF9kaXNwYXRjaGVyLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVy
eSwgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRlLCBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGVyLCBf
ZW1iZXJSb3V0aW5nTG9jYXRpb25IYXNoX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25I
aXN0b3J5X2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25BdXRvX2xvY2F0aW9uLCBfZW1i
ZXJSb3V0aW5nTG9jYXRpb25Ob25lX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nU3lzdGVtQ2FjaGUs
IF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb25JbnN0YW5jZSwgX2VtYmVyVmlld3NW
aWV3c1RleHRfZmllbGQsIF9lbWJlclZpZXdzVmlld3NUZXh0X2FyZWEsIF9lbWJlclZpZXdzVmll
d3NDaGVja2JveCwgX2VtYmVyUm91dGluZ1ZpZXdzQ29tcG9uZW50c0xpbmtUbywgX2VtYmVyUm91
dGluZ1NlcnZpY2VzUm91dGluZywgX2VtYmVyRXh0ZW5zaW9uU3VwcG9ydENvbnRhaW5lcl9kZWJ1
Z19hZGFwdGVyLCBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHksIF9jb250YWluZXJS
ZWdpc3RyeSwgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9l
bWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lLCBfcmVxdWlyZTIpIHsKKyAgLyoqCisgIEBtb2R1
bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgorICAqLworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5fcmVzZXRMZWdhY3lBZGRvbldhcm5pbmdzID0gX3Jlc2V0TGVn
YWN5QWRkb25XYXJuaW5nczsKKworICB2YXIgX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBs
YXRlTGl0ZXJhbExvb3NlKFsnLWJ1Y2tldC1jYWNoZTptYWluJ10sIFsnLWJ1Y2tldC1jYWNoZTpt
YWluJ10pLAorICAgICAgX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxM
b29zZShbJ3RlbXBsYXRlOmNvbXBvbmVudHMvLWRlZmF1bHQnXSwgWyd0ZW1wbGF0ZTpjb21wb25l
bnRzLy1kZWZhdWx0J10pOworCisgIGZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29z
ZShzdHJpbmdzLCByYXcpIHsgc3RyaW5ncy5yYXcgPSByYXc7IHJldHVybiBzdHJpbmdzOyB9CisK
KyAgdmFyIGxpYnJhcmllc1JlZ2lzdGVyZWQgPSBmYWxzZTsKKworICB2YXIgd2FybmVkQWJvdXRM
ZWdhY3lWaWV3QWRkb24gPSBmYWxzZTsKKyAgdmFyIHdhcm5lZEFib3V0TGVnYWN5Q29udHJvbGxl
ckFkZG9uID0gZmFsc2U7CisKKyAgLy8gRm9yIHRlc3RpbmcKKworICBmdW5jdGlvbiBfcmVzZXRM
ZWdhY3lBZGRvbldhcm5pbmdzKCkgeworICAgIHdhcm5lZEFib3V0TGVnYWN5Vmlld0FkZG9uID0g
ZmFsc2U7CisgICAgd2FybmVkQWJvdXRMZWdhY3lDb250cm9sbGVyQWRkb24gPSBmYWxzZTsKKyAg
fQorCisgIC8qKgorICAgIEFuIGluc3RhbmNlIG9mIGBFbWJlci5BcHBsaWNhdGlvbmAgaXMgdGhl
IHN0YXJ0aW5nIHBvaW50IGZvciBldmVyeSBFbWJlcgorICAgIGFwcGxpY2F0aW9uLiBJdCBoZWxw
cyB0byBpbnN0YW50aWF0ZSwgaW5pdGlhbGl6ZSBhbmQgY29vcmRpbmF0ZSB0aGUgbWFueQorICAg
IG9iamVjdHMgdGhhdCBtYWtlIHVwIHlvdXIgYXBwLgorICAKKyAgICBFYWNoIEVtYmVyIGFwcCBo
YXMgb25lIGFuZCBvbmx5IG9uZSBgRW1iZXIuQXBwbGljYXRpb25gIG9iamVjdC4gSW4gZmFjdCwg
dGhlCisgICAgdmVyeSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxkIGRvIGluIHlvdXIgYXBwbGljYXRp
b24gaXMgY3JlYXRlIHRoZSBpbnN0YW5jZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHdp
bmRvdy5BcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICBgYGAKKyAgCisgICAg
VHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIHRoZSBvbmx5IGdsb2JhbCB2YXJp
YWJsZS4gQWxsIG90aGVyCisgICAgY2xhc3NlcyBpbiB5b3VyIGFwcCBzaG91bGQgYmUgcHJvcGVy
dGllcyBvbiB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uYCBpbnN0YW5jZSwKKyAgICB3aGljaCBoaWdo
bGlnaHRzIGl0cyBmaXJzdCByb2xlOiBhIGdsb2JhbCBuYW1lc3BhY2UuCisgIAorICAgIEZvciBl
eGFtcGxlLCBpZiB5b3UgZGVmaW5lIGEgdmlldyBjbGFzcywgaXQgbWlnaHQgbG9vayBsaWtlIHRo
aXM6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuTXlWaWV3ID0gRW1iZXIuVmlldy5l
eHRlbmQoKTsKKyAgICBgYGAKKyAgCisgICAgQnkgZGVmYXVsdCwgY2FsbGluZyBgRW1iZXIuQXBw
bGljYXRpb24uY3JlYXRlKClgIHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplCisgICAgeW91
ciBhcHBsaWNhdGlvbiBieSBjYWxsaW5nIHRoZSBgRW1iZXIuQXBwbGljYXRpb24uaW5pdGlhbGl6
ZSgpYCBtZXRob2QuIElmCisgICAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlhbGl6YXRpb24sIHlv
dSBjYW4gY2FsbCB5b3VyIGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAorICAgIG1ldGhvZC4gV2hl
biB5b3UgYXJlIHJlYWR5IGZvciB5b3VyIGFwcCB0byBiZSBpbml0aWFsaXplZCwgY2FsbCBpdHMK
KyAgICBgYWR2YW5jZVJlYWRpbmVzcygpYCBtZXRob2QuCisgIAorICAgIFlvdSBjYW4gZGVmaW5l
IGEgYHJlYWR5YCBtZXRob2Qgb24gdGhlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5zdGFuY2UsIHdo
aWNoCisgICAgd2lsbCBiZSBydW4gYnkgRW1iZXIgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgaW5p
dGlhbGl6ZWQuCisgIAorICAgIEJlY2F1c2UgYEVtYmVyLkFwcGxpY2F0aW9uYCBpbmhlcml0cyBm
cm9tIGBFbWJlci5OYW1lc3BhY2VgLCBhbnkgY2xhc3NlcworICAgIHlvdSBjcmVhdGUgd2lsbCBo
YXZlIHVzZWZ1bCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHdoZW4gY2FsbGluZyBgdG9TdHJpbmco
KWAuCisgICAgU2VlIHRoZSBgRW1iZXIuTmFtZXNwYWNlYCBkb2N1bWVudGF0aW9uIGZvciBtb3Jl
IGluZm9ybWF0aW9uLgorICAKKyAgICBXaGlsZSB5b3UgY2FuIHRoaW5rIG9mIHlvdXIgYEVtYmVy
LkFwcGxpY2F0aW9uYCBhcyBhIGNvbnRhaW5lciB0aGF0IGhvbGRzIHRoZQorICAgIG90aGVyIGNs
YXNzZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgcmVzcG9u
c2liaWxpdGllcworICAgIGdvaW5nIG9uIHVuZGVyLXRoZS1ob29kIHRoYXQgeW91IG1heSB3YW50
IHRvIHVuZGVyc3RhbmQuCisgIAorICAgICMjIyBFdmVudCBEZWxlZ2F0aW9uCisgIAorICAgIEVt
YmVyIHVzZXMgYSB0ZWNobmlxdWUgY2FsbGVkIF9ldmVudCBkZWxlZ2F0aW9uXy4gVGhpcyBhbGxv
d3MgdGhlIGZyYW1ld29yaworICAgIHRvIHNldCB1cCBhIGdsb2JhbCwgc2hhcmVkIGV2ZW50IGxp
c3RlbmVyIGluc3RlYWQgb2YgcmVxdWlyaW5nIGVhY2ggdmlldyB0bworICAgIGRvIGl0IG1hbnVh
bGx5LiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBlYWNoIHZpZXcgcmVnaXN0ZXJpbmcgaXRzIG93
bgorICAgIGBtb3VzZWRvd25gIGxpc3RlbmVyIG9uIGl0cyBhc3NvY2lhdGVkIGVsZW1lbnQsIEVt
YmVyIHNldHMgdXAgYSBgbW91c2Vkb3duYAorICAgIGxpc3RlbmVyIG9uIHRoZSBgYm9keWAuCisg
IAorICAgIElmIGEgYG1vdXNlZG93bmAgZXZlbnQgb2NjdXJzLCBFbWJlciB3aWxsIGxvb2sgYXQg
dGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgYW5kCisgICAgc3RhcnQgd2Fsa2luZyB1cCB0aGUgRE9N
IG5vZGUgdHJlZSwgZmluZGluZyBjb3JyZXNwb25kaW5nIHZpZXdzIGFuZCBpbnZva2luZworICAg
IHRoZWlyIGBtb3VzZURvd25gIG1ldGhvZCBhcyBpdCBnb2VzLgorICAKKyAgICBgRW1iZXIuQXBw
bGljYXRpb25gIGhhcyBhIG51bWJlciBvZiBkZWZhdWx0IGV2ZW50cyB0aGF0IGl0IGxpc3RlbnMg
Zm9yLCBhcworICAgIHdlbGwgYXMgYSBtYXBwaW5nIGZyb20gbG93ZXJjYXNlIGV2ZW50cyB0byBj
YW1lbC1jYXNlZCB2aWV3IG1ldGhvZCBuYW1lcy4gRm9yCisgICAgZXhhbXBsZSwgdGhlIGBrZXlw
cmVzc2AgZXZlbnQgY2F1c2VzIHRoZSBga2V5UHJlc3NgIG1ldGhvZCBvbiB0aGUgdmlldyB0byBi
ZQorICAgIGNhbGxlZCwgdGhlIGBkYmxjbGlja2AgZXZlbnQgY2F1c2VzIGBkb3VibGVDbGlja2Ag
dG8gYmUgY2FsbGVkLCBhbmQgc28gb24uCisgIAorICAgIElmIHRoZXJlIGlzIGEgYnViYmxpbmcg
YnJvd3NlciBldmVudCB0aGF0IEVtYmVyIGRvZXMgbm90IGxpc3RlbiBmb3IgYnkKKyAgICBkZWZh
dWx0LCB5b3UgY2FuIHNwZWNpZnkgY3VzdG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGlu
ZyB2aWV3IG1ldGhvZAorICAgIG5hbWVzIGJ5IHNldHRpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgYGN1
c3RvbUV2ZW50c2AgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgdGhlIHBhc3RlIGV2ZW50CisgICAgICAgIHBhc3RlOiAn
cGFzdGUnCisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFRvIHByZXZlbnQgRW1i
ZXIgZnJvbSBzZXR0aW5nIHVwIGEgbGlzdGVuZXIgZm9yIGEgZGVmYXVsdCBldmVudCwKKyAgICBz
cGVjaWZ5IHRoZSBldmVudCBuYW1lIHdpdGggYSBgbnVsbGAgdmFsdWUgaW4gdGhlIGBjdXN0b21F
dmVudHNgCisgICAgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAvLyBwcmV2ZW50IGxpc3RlbmVycyBmb3IgbW91c2VlbnRlci9tb3VzZWxlYXZlIGV2ZW50
cworICAgICAgICBtb3VzZWVudGVyOiBudWxsLAorICAgICAgICBtb3VzZWxlYXZlOiBudWxsCisg
ICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEJ5IGRlZmF1bHQsIHRoZSBhcHBsaWNh
dGlvbiBzZXRzIHVwIHRoZXNlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgZG9jdW1lbnQKKyAgICBi
b2R5LiBIb3dldmVyLCBpbiBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGluZyBhbiBFbWJlciBh
cHBsaWNhdGlvbiBpbnNpZGUKKyAgICBhbiBleGlzdGluZyBwYWdlLCB5b3UgbWF5IHdhbnQgaXQg
dG8gc2V0IHVwIHRoZSBsaXN0ZW5lcnMgb24gYW4gZWxlbWVudAorICAgIGluc2lkZSB0aGUgYm9k
eS4KKyAgCisgICAgRm9yIGV4YW1wbGUsIGlmIG9ubHkgZXZlbnRzIGluc2lkZSBhIERPTSBlbGVt
ZW50IHdpdGggdGhlIElEIG9mIGBlbWJlci1hcHBgCisgICAgc2hvdWxkIGJlIGRlbGVnYXRlZCwg
c2V0IHlvdXIgYXBwbGljYXRpb24ncyBgcm9vdEVsZW1lbnRgIHByb3BlcnR5OgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7Cisg
ICAgICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IFRoZSBgcm9vdEVsZW1lbnRgIGNhbiBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciBhIGpRdWVy
eS1jb21wYXRpYmxlIHNlbGVjdG9yCisgICAgc3RyaW5nLiBOb3RlIHRoYXQgKnZpZXdzIGFwcGVu
ZGVkIHRvIHRoZSBET00gb3V0c2lkZSB0aGUgcm9vdCBlbGVtZW50IHdpbGwKKyAgICBub3QgcmVj
ZWl2ZSBldmVudHMuKiBJZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVsZW1lbnQsIG1ha2Ug
c3VyZSB5b3Ugb25seQorICAgIGFwcGVuZCB2aWV3cyBpbnNpZGUgaXQhCisgIAorICAgIFRvIGxl
YXJuIG1vcmUgYWJvdXQgdGhlIGV2ZW50cyBFbWJlciBjb21wb25lbnRzIHVzZSwgc2VlCisgICAg
W2NvbXBvbmVudHMvaGFuZGxpbmctZXZlbnRzXShodHRwczovL2d1aWRlcy5lbWJlcmpzLmNvbS92
Mi42LjAvY29tcG9uZW50cy9oYW5kbGluZy1ldmVudHMvI3RvY19ldmVudC1uYW1lcykuCisgIAor
ICAgICMjIyBJbml0aWFsaXplcnMKKyAgCisgICAgTGlicmFyaWVzIG9uIHRvcCBvZiBFbWJlciBj
YW4gYWRkIGluaXRpYWxpemVycywgbGlrZSBzbzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICdhcGktYWRhcHRl
cicsCisgIAorICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAg
ICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2FwaS1hZGFwdGVyOm1haW4nLCBBcGlBZGFwdGVyKTsK
KyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSW5pdGlhbGl6ZXJzIHByb3ZpZGUg
YW4gb3Bwb3J0dW5pdHkgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCByZWdpc3RyeSwgd2hpY2gKKyAg
ICBvcmdhbml6ZXMgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIGFuIEVtYmVyIGFwcGxpY2F0
aW9uLiBBZGRpdGlvbmFsbHkKKyAgICB0aGV5IHByb3ZpZGUgYSBjaGFuY2UgdG8gYWNjZXNzIHRo
ZSBpbnN0YW50aWF0ZWQgYXBwbGljYXRpb24uIEJleW9uZAorICAgIGJlaW5nIHVzZWQgZm9yIGxp
YnJhcmllcywgaW5pdGlhbGl6ZXJzIGFyZSBhbHNvIGEgZ3JlYXQgd2F5IHRvIG9yZ2FuaXplCisg
ICAgZGVwZW5kZW5jeSBpbmplY3Rpb24gb3Igc2V0dXAgaW4geW91ciBvd24gYXBwbGljYXRpb24u
CisgIAorICAgICMjIyBSb3V0aW5nCisgIAorICAgIEluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIHlv
dXIgYXBwbGljYXRpb24ncyByb3V0ZXIsIGBFbWJlci5BcHBsaWNhdGlvbmAgaXMKKyAgICBhbHNv
IHJlc3BvbnNpYmxlIGZvciB0ZWxsaW5nIHRoZSByb3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5n
LiBUcmFuc2l0aW9ucworICAgIGJldHdlZW4gcm91dGVzIGNhbiBiZSBsb2dnZWQgd2l0aCB0aGUg
YExPR19UUkFOU0lUSU9OU2AgZmxhZywgYW5kIG1vcmUKKyAgICBkZXRhaWxlZCBpbnRyYS10cmFu
c2l0aW9uIGxvZ2dpbmcgY2FuIGJlIGxvZ2dlZCB3aXRoCisgICAgdGhlIGBMT0dfVFJBTlNJVElP
TlNfSU5URVJOQUxgIGZsYWc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBwID0g
RW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIExPR19UUkFOU0lUSU9OUzogdHJ1ZSwg
Ly8gYmFzaWMgbG9nZ2luZyBvZiBzdWNjZXNzZnVsIHRyYW5zaXRpb25zCisgICAgICBMT0dfVFJB
TlNJVElPTlNfSU5URVJOQUw6IHRydWUgLy8gZGV0YWlsZWQgbG9nZ2luZyBvZiBhbGwgcm91dGlu
ZyBzdGVwcworICAgIH0pOworICAgIGBgYAorICAKKyAgICBCeSBkZWZhdWx0LCB0aGUgcm91dGVy
IHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBVUkwgaW50bworICAg
IGFwcGxpY2F0aW9uIHN0YXRlIG9uY2UgdGhlIGJyb3dzZXIgZW1pdHMgdGhlIGBET01Db250ZW50
UmVhZHlgIGV2ZW50LiBJZiB5b3UKKyAgICBuZWVkIHRvIGRlZmVyIHJvdXRpbmcsIHlvdSBjYW4g
Y2FsbCB0aGUgYXBwbGljYXRpb24ncyBgZGVmZXJSZWFkaW5lc3MoKWAKKyAgICBtZXRob2QuIE9u
Y2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhlIGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhv
ZC4KKyAgCisgICAgSWYgdGhlcmUgaXMgYW55IHNldHVwIHJlcXVpcmVkIGJlZm9yZSByb3V0aW5n
IGJlZ2lucywgeW91IGNhbiBpbXBsZW1lbnQgYQorICAgIGByZWFkeSgpYCBtZXRob2Qgb24geW91
ciBhcHAgdGhhdCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHJvdXRpbmcKKyAg
ICBiZWdpbnMuCisgIAorICAgIEBjbGFzcyBBcHBsaWNhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1i
ZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5FbmdpbmUKKyAgICBAdXNlcyBSZWdpc3RyeVByb3h5TWl4
aW4KKyAgICBAcHVibGljCisgICovCisKKyAgdmFyIEFwcGxpY2F0aW9uID0gX2VtYmVyQXBwbGlj
YXRpb25TeXN0ZW1FbmdpbmUuZGVmYXVsdC5leHRlbmQoeworICAgIF9zdXBwcmVzc0RlZmVycmVk
RGVwcmVjYXRpb246IHRydWUsCisKKyAgICAvKioKKyAgICAgIFRoZSByb290IERPTSBlbGVtZW50
IG9mIHRoZSBBcHBsaWNhdGlvbi4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuCisgICAgICBl
bGVtZW50IG9yIGEKKyAgICAgIFtqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmddKGh0
dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jYXRlZ29yeS9zZWxlY3RvcnMvKS4KKyAgICAgICBUaGlzIGlz
IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIEFwcGxpY2F0aW9uJ3MsCisg
ICAgICBgZXZlbnREaXNwYXRjaGVyYCwgd2hpY2ggc2V0cyB1cCB0aGUgbGlzdGVuZXJzIGZvciBl
dmVudCBkZWxlZ2F0aW9uLiBFdmVyeQorICAgICAgdmlldyBpbiB5b3VyIGFwcGxpY2F0aW9uIHNo
b3VsZCBiZSBhIGNoaWxkIG9mIHRoZSBlbGVtZW50IHlvdSBzcGVjaWZ5IGhlcmUuCisgICAgICAg
QHByb3BlcnR5IHJvb3RFbGVtZW50CisgICAgICBAdHlwZSBET01FbGVtZW50CisgICAgICBAZGVm
YXVsdCAnYm9keScKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJvb3RFbGVtZW50OiAnYm9k
eScsCisKKyAgICAvKioKKyAgICAgIFRoZSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCByZXNwb25z
aWJsZSBmb3IgZGVsZWdhdGluZyBldmVudHMgdG8gdGhpcworICAgICAgYXBwbGljYXRpb24ncyB2
aWV3cy4KKyAgICAgICBUaGUgZXZlbnQgZGlzcGF0Y2hlciBpcyBjcmVhdGVkIGJ5IHRoZSBhcHBs
aWNhdGlvbiBhdCBpbml0aWFsaXphdGlvbiB0aW1lCisgICAgICBhbmQgc2V0cyB1cCBldmVudCBs
aXN0ZW5lcnMgb24gdGhlIERPTSBlbGVtZW50IGRlc2NyaWJlZCBieSB0aGUKKyAgICAgIGFwcGxp
Y2F0aW9uJ3MgYHJvb3RFbGVtZW50YCBwcm9wZXJ0eS4KKyAgICAgICBTZWUgdGhlIGRvY3VtZW50
YXRpb24gZm9yIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLgor
ICAgICAgIEBwcm9wZXJ0eSBldmVudERpc3BhdGNoZXIKKyAgICAgIEB0eXBlIEVtYmVyLkV2ZW50
RGlzcGF0Y2hlcgorICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgZXZlbnREaXNwYXRjaGVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgRE9NIGV2ZW50
cyBmb3Igd2hpY2ggdGhlIGV2ZW50IGRpc3BhdGNoZXIgc2hvdWxkIGxpc3Rlbi4KKyAgICAgICBC
eSBkZWZhdWx0LCB0aGUgYXBwbGljYXRpb24ncyBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBsaXN0
ZW5zCisgICAgICBmb3IgYSBzZXQgb2Ygc3RhbmRhcmQgRE9NIGV2ZW50cywgc3VjaCBhcyBgbW91
c2Vkb3duYCBhbmQKKyAgICAgIGBrZXl1cGAsIGFuZCBkZWxlZ2F0ZXMgdGhlbSB0byB5b3VyIGFw
cGxpY2F0aW9uJ3MgYEVtYmVyLlZpZXdgCisgICAgICBpbnN0YW5jZXMuCisgICAgICAgSWYgeW91
IHdvdWxkIGxpa2UgYWRkaXRpb25hbCBidWJibGluZyBldmVudHMgdG8gYmUgZGVsZWdhdGVkIHRv
IHlvdXIKKyAgICAgIHZpZXdzLCBzZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gJ3MgYGN1c3Rv
bUV2ZW50c2AgcHJvcGVydHkKKyAgICAgIHRvIGEgaGFzaCBjb250YWluaW5nIHRoZSBET00gZXZl
bnQgbmFtZSBhcyB0aGUga2V5IGFuZCB0aGUKKyAgICAgIGNvcnJlc3BvbmRpbmcgdmlldyBtZXRo
b2QgbmFtZSBhcyB0aGUgdmFsdWUuIFNldHRpbmcgYW4gZXZlbnQgdG8KKyAgICAgIGEgdmFsdWUg
b2YgYG51bGxgIHdpbGwgcHJldmVudCBhIGRlZmF1bHQgZXZlbnQgbGlzdGVuZXIgZnJvbSBiZWlu
ZworICAgICAgYWRkZWQgZm9yIHRoYXQgZXZlbnQuCisgICAgICAgVG8gYWRkIG5ldyBldmVudHMg
dG8gYmUgbGlzdGVuZWQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9
IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7CisgICAgICAgIGN1c3RvbUV2ZW50czogeworICAg
ICAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciB0aGUgcGFzdGUgZXZlbnQKKyAgICAgICAgICBwYXN0
ZTogJ3Bhc3RlJworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRvIHBy
ZXZlbnQgZGVmYXVsdCBldmVudHMgZnJvbSBiZWluZyBsaXN0ZW5lZCB0bzoKKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAg
ICAgICAgY3VzdG9tRXZlbnRzOiB7CisgICAgICAgICAgLy8gcmVtb3ZlIHN1cHBvcnQgZm9yIG1v
dXNlZW50ZXIgLyBtb3VzZWxlYXZlIGV2ZW50cworICAgICAgICAgIG1vdXNlZW50ZXI6IG51bGws
CisgICAgICAgICAgbW91c2VsZWF2ZTogbnVsbAorICAgICAgICB9CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgQHByb3BlcnR5IGN1c3RvbUV2ZW50cworICAgICAgQHR5cGUgT2JqZWN0Cisg
ICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBjdXN0b21FdmVu
dHM6IG51bGwsCisKKyAgICAvKioKKyAgICAgIFdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNob3Vs
ZCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHJvdXRpbmcgYW5kIHJlbmRlcgorICAgICAgdGVtcGxhdGVz
IHRvIHRoZSBgcm9vdEVsZW1lbnRgIG9uIERPTSByZWFkeS4gV2hpbGUgZGVmYXVsdCBieSB0cnVl
LAorICAgICAgb3RoZXIgZW52aXJvbm1lbnRzIHN1Y2ggYXMgRmFzdEJvb3Qgb3IgYSB0ZXN0aW5n
IGhhcm5lc3MgY2FuIHNldCB0aGlzCisgICAgICBwcm9wZXJ0eSB0byBgZmFsc2VgIGFuZCBjb250
cm9sIHRoZSBwcmVjaXNlIHRpbWluZyBhbmQgYmVoYXZpb3Igb2YgdGhlIGJvb3QKKyAgICAgIHBy
b2Nlc3MuCisgICAgICAgQHByb3BlcnR5IGF1dG9ib290CisgICAgICBAdHlwZSBCb29sZWFuCisg
ICAgICBAZGVmYXVsdCB0cnVlCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYXV0b2Jvb3Q6
IHRydWUsCisKKyAgICAvKioKKyAgICAgIFdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBi
ZSBjb25maWd1cmVkIGZvciB0aGUgbGVnYWN5ICJnbG9iYWxzIG1vZGUiLgorICAgICAgVW5kZXIg
dGhpcyBtb2RlLCB0aGUgQXBwbGljYXRpb24gb2JqZWN0IHNlcnZlcyBhcyBhIGdsb2JhbCBuYW1l
c3BhY2UgZm9yIGFsbAorICAgICAgY2xhc3Nlcy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgICAgLi4uCisgICAg
ICB9KTsKKyAgICAgICBBcHAuUm91dGVyLnJlb3Blbih7CisgICAgICAgIGxvY2F0aW9uOiAnbm9u
ZScKKyAgICAgIH0pOworICAgICAgIEFwcC5Sb3V0ZXIubWFwKHsKKyAgICAgICAgLi4uCisgICAg
ICB9KTsKKyAgICAgICBBcHAuTXlDb21wb25lbnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsK
KyAgICAgICAgLi4uCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRoaXMgZmxhZyBhbHNv
IGV4cG9zZXMgb3RoZXIgaW50ZXJuYWwgQVBJcyB0aGF0IGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBv
ZgorICAgICAgYSBzcGVjaWFsICJkZWZhdWx0IGluc3RhbmNlIiwgbGlrZSBgQXBwLl9fY29udGFp
bmVyX18ubG9va3VwKC4uLilgLgorICAgICAgIFRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBub3Qg
Y29uZmlndXJhYmxlLCBpdHMgdmFsdWUgaXMgZGVyaXZlZCBmcm9tCisgICAgICB0aGUgYGF1dG9i
b290YCBmbGFnIOKAkyBkaXNhYmxpbmcgYGF1dG9ib290YCBhbHNvIGltcGxpZXMgb3B0aW5nLW91
dCBvZgorICAgICAgZ2xvYmFscyBtb2RlIHN1cHBvcnQsIGFsdGhvdWdoIHRoZXkgYXJlIHVsdGlt
YXRlbHkgb3J0aG9nb25hbCBjb25jZXJucy4KKyAgICAgICBTb21lIG9mIHRoZSBnbG9iYWwgbW9k
ZXMgZmVhdHVyZXMgYXJlIGFscmVhZHkgZGVwcmVjYXRlZCBpbiAxLnguIFRoZQorICAgICAgZXhp
c3RlbmNlIG9mIHRoaXMgZmxhZyBpcyB0byB1bnRhbmdsZSB0aGUgZ2xvYmFscyBtb2RlIGNvZGUg
cGF0aHMgZnJvbQorICAgICAgdGhlIGF1dG9ib290IGNvZGUgcGF0aHMsIHNvIHRoYXQgdGhlc2Ug
bGVnYWN5IGZlYXR1cmVzIGNhbiBiZSByZXZpZXdlZAorICAgICAgZm9yIGRlcHJlY2F0aW9uL3Jl
bW92YWwgc2VwYXJhdGVseS4KKyAgICAgICBGb3JjaW5nIHRoZSAoYXV0b2Jvb3Q9dHJ1ZSwgX2ds
b2JhbHNNb2RlPWZhbHNlKSBoZXJlIGFuZCBydW5uaW5nIHRoZSB0ZXN0cworICAgICAgd291bGQg
cmV2ZWFsIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHdlIGFyZSBzdGlsbCByZWx5aW5nIG9uIHRoZXNl
IGxlZ2FjeQorICAgICAgYmVoYXZpb3IgaW50ZXJuYWxseSAobW9zdGx5IGp1c3QgdGVzdHMpLgor
ICAgICAgIEBwcm9wZXJ0eSBfZ2xvYmFsc01vZGUKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAgICAg
IEBkZWZhdWx0IHRydWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBfZ2xvYmFsc01vZGU6
IHRydWUsCisKKyAgICBpbml0OiBmdW5jdGlvbiAob3B0aW9ucykgeworICAgICAgdGhpcy5fc3Vw
ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKCF0aGlzLiQpIHsKKyAgICAg
ICAgdGhpcy4kID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdDsKKyAgICAgIH0KKwor
ICAgICAgcmVnaXN0ZXJMaWJyYXJpZXMoKTsKKyAgICAgIGxvZ0xpYnJhcnlWZXJzaW9ucygpOwor
CisgICAgICAvLyBTdGFydCBvZmYgdGhlIG51bWJlciBvZiBkZWZlcnJhbHMgYXQgMS4gVGhpcyB3
aWxsIGJlIGRlY3JlbWVudGVkIGJ5CisgICAgICAvLyB0aGUgQXBwbGljYXRpb24ncyBvd24gYGJv
b3RgIG1ldGhvZC4KKyAgICAgIHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9IDE7CisgICAgICB0
aGlzLl9ib290ZWQgPSBmYWxzZTsKKworICAgICAgdGhpcy5hdXRvYm9vdCA9IHRoaXMuX2dsb2Jh
bHNNb2RlID0gISF0aGlzLmF1dG9ib290OworCisgICAgICBpZiAodGhpcy5fZ2xvYmFsc01vZGUp
IHsKKyAgICAgICAgdGhpcy5fcHJlcGFyZUZvckdsb2JhbHNNb2RlKCk7CisgICAgICB9CisKKyAg
ICAgIGlmICh0aGlzLmF1dG9ib290KSB7CisgICAgICAgIHRoaXMud2FpdEZvckRPTVJlYWR5KCk7
CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ3JlYXRlIGFuIEFwcGxpY2F0aW9u
SW5zdGFuY2UgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgYnVpbGRJbnN0YW5jZQorICAgICAgQHJldHVybiB7RW1iZXIuQXBwbGljYXRpb25JbnN0
YW5jZX0gdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlCisgICAgKi8KKyAgICBidWlsZEluc3RhbmNl
OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0g
MCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisg
ICAgICBvcHRpb25zLmJhc2UgPSB0aGlzOworICAgICAgb3B0aW9ucy5hcHBsaWNhdGlvbiA9IHRo
aXM7CisgICAgICByZXR1cm4gX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbkluc3Rh
bmNlLmRlZmF1bHQuY3JlYXRlKG9wdGlvbnMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEVu
YWJsZSB0aGUgbGVnYWN5IGdsb2JhbHMgbW9kZSBieSBhbGxvd2luZyB0aGlzIGFwcGxpY2F0aW9u
IHRvIGFjdAorICAgICAgYXMgYSBnbG9iYWwgbmFtZXNwYWNlLiBTZWUgdGhlIGRvY3Mgb24gdGhl
IGBfZ2xvYmFsc01vZGVgIHByb3BlcnR5CisgICAgICBmb3IgZGV0YWlscy4KKyAgICAgICBNb3N0
IG9mIHRoZXNlIGZlYXR1cmVzIGFyZSBhbHJlYWR5IGRlcHJlY2F0ZWQgaW4gMS54LCBzbyB3ZSBj
YW4KKyAgICAgIHN0b3AgdXNpbmcgdGhlbSBpbnRlcm5hbGx5IGFuZCB0cnkgdG8gcmVtb3ZlIHRo
ZW0uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgX3ByZXBhcmVGb3JHbG9iYWxzTW9k
ZQorICAgICovCisgICAgX3ByZXBhcmVGb3JHbG9iYWxzTW9kZTogZnVuY3Rpb24gKCkgeworICAg
ICAgLy8gQ3JlYXRlIHN1YmNsYXNzIG9mIEVtYmVyLlJvdXRlciBmb3IgdGhpcyBBcHBsaWNhdGlv
biBpbnN0YW5jZS4KKyAgICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgc29tZW9uZSByZW9w
ZW5pbmcgYEFwcC5Sb3V0ZXJgIGRvZXMgbm90CisgICAgICAvLyB0YW1wZXIgd2l0aCB0aGUgZGVm
YXVsdCBgRW1iZXIuUm91dGVyYC4KKyAgICAgIHRoaXMuUm91dGVyID0gKHRoaXMuUm91dGVyIHx8
IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXIuZGVmYXVsdCkuZXh0ZW5kKCk7CisKKyAgICAgIHRo
aXMuX2J1aWxkRGVwcmVjYXRlZEluc3RhbmNlKCk7CisgICAgfSwKKworICAgIC8qCisgICAgICBC
dWlsZCB0aGUgZGVwcmVjYXRlZCBpbnN0YW5jZSBmb3IgbGVnYWN5IGdsb2JhbHMgbW9kZSBzdXBw
b3J0LgorICAgICAgQ2FsbGVkIHdoZW4gY3JlYXRpbmcgYW5kIHJlc2V0dGluZyB0aGUgYXBwbGlj
YXRpb24uCisgICAgICAgVGhpcyBpcyBvcnRob2dvbmFsIHRvIGF1dG9ib290OiB0aGUgZGVwcmVj
YXRlZCBpbnN0YW5jZSBuZWVkcyB0bworICAgICAgYmUgY3JlYXRlZCBhdCBBcHBsaWNhdGlvbiBj
b25zdHJ1Y3Rpb24gKG5vdCBib290KSB0aW1lIHRvIGV4cG9zZQorICAgICAgQXBwLl9fY29udGFp
bmVyX18gYW5kIHRoZSBnbG9iYWwgRW1iZXIuVmlldy52aWV3cyByZWdpc3RyeS4gSWYKKyAgICAg
IGF1dG9ib290IHNlZXMgdGhhdCB0aGlzIGluc3RhbmNlIGV4aXN0cywgaXQgd2lsbCBjb250aW51
ZSBib290aW5nCisgICAgICBpdCB0byBhdm9pZCBkb2luZyB1bm5jZXNzYXJ5IHdvcmsgKGFzIG9w
cG9zZWQgdG8gYnVpbGRpbmcgYSBuZXcKKyAgICAgIGluc3RhbmNlIGF0IGJvb3QgdGltZSksIGJ1
dCB0aGV5IGFyZSBvdGhlcndpc2UgdW5yZWxhdGVkLgorICAgICAgIEBwcml2YXRlCisgICAgICBA
bWV0aG9kIF9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZQorICAgICovCisgICAgX2J1aWxkRGVwcmVj
YXRlZEluc3RhbmNlOiBmdW5jdGlvbiAoKSB7CisgICAgICAvLyBCdWlsZCBhIGRlZmF1bHQgaW5z
dGFuY2UKKyAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuYnVpbGRJbnN0YW5jZSgpOworCisgICAg
ICAvLyBMZWdhY3kgc3VwcG9ydCBmb3IgQXBwLl9fY29udGFpbmVyX18gYW5kIG90aGVyIGdsb2Jh
bCBtZXRob2RzCisgICAgICAvLyBvbiBBcHAgdGhhdCByZWx5IG9uIGEgc2luZ2xlLCBkZWZhdWx0
IGluc3RhbmNlLgorICAgICAgdGhpcy5fX2RlcHJlY2F0ZWRJbnN0YW5jZV9fID0gaW5zdGFuY2U7
CisgICAgICB0aGlzLl9fY29udGFpbmVyX18gPSBpbnN0YW5jZS5fX2NvbnRhaW5lcl9fOworCisg
ICAgICAvLyBGb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb25seSwgc2V0IHRoZSB2aWV3IHJlZ2lz
dHJ5IHRvIHRoZSBnbG9iYWwKKyAgICAgIC8vIEVtYmVyLlZpZXcudmlld3MgaGFzaCBmb3IgYmFj
a3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICAgICBfZW1iZXJWaWV3c1ZpZXdzVmlldy5kZWZhdWx0
LnZpZXdzID0gaW5zdGFuY2UubG9va3VwKCctdmlldy1yZWdpc3RyeTptYWluJyk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgQXV0b21hdGljYWxseSBraWNrLW9mZiB0aGUgYm9vdCBwcm9jZXNz
IGZvciB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUKKyAgICAgIERPTSBoYXMgYmVjb21lIHJlYWR5
LgorICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBpdHNlbGYgaXMgc2NoZWR1bGVkIG9uIHRoZSBh
Y3Rpb25zIHF1ZXVlIHdoaWNoCisgICAgICBlbnN1cmVzIHRoYXQgY29kZS1sb2FkaW5nIGZpbmlz
aGVzIGJlZm9yZSBib290aW5nLgorICAgICAgIElmIHlvdSBhcmUgYXN5bmNocm9ub3VzbHkgbG9h
ZGluZyBjb2RlLCB5b3Ugc2hvdWxkIGNhbGwgYGRlZmVyUmVhZGluZXNzKClgCisgICAgICB0byBk
ZWZlciBib290aW5nLCBhbmQgdGhlbiBjYWxsIGBhZHZhbmNlUmVhZGluZXNzKClgIG9uY2UgYWxs
IG9mIHlvdXIgY29kZQorICAgICAgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2Qgd2FpdEZvckRPTVJlYWR5CisgICAgKi8KKyAgICB3YWl0Rm9yRE9N
UmVhZHk6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy4kIHx8IHRoaXMuJC5pc1JlYWR5
KSB7CisgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZSgnYWN0aW9u
cycsIHRoaXMsICdkb21SZWFkeScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy4kKCku
cmVhZHkoX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmJpbmQodGhpcywgJ2RvbVJlYWR5Jykp
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRoaXMgaXMgdGhlIGF1dG9ib290
IGZsb3c6CisgICAgICAgMS4gQm9vdCB0aGUgYXBwIGJ5IGNhbGxpbmcgYHRoaXMuYm9vdCgpYAor
ICAgICAgMi4gQ3JlYXRlIGFuIGluc3RhbmNlIChvciB1c2UgdGhlIGBfX2RlcHJlY2F0ZWRJbnN0
YW5jZV9fYCBpbiBnbG9iYWxzIG1vZGUpCisgICAgICAzLiBCb290IHRoZSBpbnN0YW5jZSBieSBj
YWxsaW5nIGBpbnN0YW5jZS5ib290KClgCisgICAgICA0LiBJbnZva2UgdGhlIGBBcHAucmVhZHko
KWAgY2FsbGJhY2sKKyAgICAgIDUuIEtpY2stb2ZmIHJvdXRpbmcgb24gdGhlIGluc3RhbmNlCisg
ICAgICAgSWRlYWxseSwgdGhpcyBpcyBhbGwgd2Ugd291bGQgbmVlZCB0byBkbzoKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBfYXV0b0Jvb3QoKSB7CisgICAgICAgIHRoaXMuYm9vdCgpLnRo
ZW4oKCkgPT4geworICAgICAgICAgIGxldCBpbnN0YW5jZSA9ICh0aGlzLl9nbG9iYWxzTW9kZSkg
PyB0aGlzLl9fZGVwcmVjYXRlZEluc3RhbmNlX18gOiB0aGlzLmJ1aWxkSW5zdGFuY2UoKTsKKyAg
ICAgICAgICByZXR1cm4gaW5zdGFuY2UuYm9vdCgpOworICAgICAgICB9KS50aGVuKChpbnN0YW5j
ZSkgPT4geworICAgICAgICAgIEFwcC5yZWFkeSgpOworICAgICAgICAgIGluc3RhbmNlLnN0YXJ0
Um91dGluZygpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIGBgYAorICAgICAgIFVuZm9y
dHVuYXRlbHksIHdlIGNhbm5vdCBhY3R1YWxseSB3cml0ZSB0aGlzIGJlY2F1c2Ugd2UgbmVlZCB0
byBwYXJ0aWNpcGF0ZQorICAgICAgaW4gdGhlICJzeW5jaHJvbm91cyIgYm9vdCBwcm9jZXNzLiBX
aGlsZSB0aGUgY29kZSBhYm92ZSB3b3VsZCB3b3JrIGZpbmUgb24KKyAgICAgIHRoZSBpbml0aWFs
IGJvb3QgKGkuZS4gRE9NIHJlYWR5KSwgd2hlbiBgQXBwLnJlc2V0KClgIGlzIGNhbGxlZCwgd2Ug
bmVlZCB0bworICAgICAgYm9vdCBhIG5ldyBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChzZWUgdGhl
IGRvY3VtZW50YXRpb24gb24gYF9ib290U3luYygpYAorICAgICAgZm9yIGRldGFpbHMpLgorICAg
ICAgIEJlY2F1c2Ugb2YgdGhpcyByZXN0cmljdGlvbiwgdGhlIGFjdHVhbCBsb2dpYyBvZiB0aGlz
IG1ldGhvZCBpcyBsb2NhdGVkCisgICAgICBpbnNpZGUgYGRpZEJlY29tZVJlYWR5KClgLgorICAg
ICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGRvbVJlYWR5CisgICAgKi8KKyAgICBkb21SZWFk
eTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHsKKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICB0aGlzLl9ib290U3luYygpOworCisgICAgICAvLyBD
b250aW51ZXMgdG8gYGRpZEJlY29tZVJlYWR5YAorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFVz
ZSB0aGlzIHRvIGRlZmVyIHJlYWRpbmVzcyB1bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0cnVlLgor
ICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9IEVt
YmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOworICAgICAgIEFwcC5kZWZlclJlYWRpbmVzcygpOwor
ICAgICAgIC8vIEVtYmVyLiQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGpRdWVyeSBvYmplY3QvZnVu
Y3Rpb24KKyAgICAgIEVtYmVyLiQuZ2V0SlNPTignL2F1dGgtdG9rZW4nLCBmdW5jdGlvbih0b2tl
bikgeworICAgICAgICBBcHAudG9rZW4gPSB0b2tlbjsKKyAgICAgICAgQXBwLmFkdmFuY2VSZWFk
aW5lc3MoKTsKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgVGhpcyBhbGxvd3MgeW91IHRv
IHBlcmZvcm0gYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGFuZCBkZWZlcgorICAgICAgYm9vdGlu
ZyB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHRoZSBzZXR1cCBoYXMgZmluaXNoZWQuCisgICAgICAg
SG93ZXZlciwgaWYgdGhlIHNldHVwIHJlcXVpcmVzIGEgbG9hZGluZyBVSSwgaXQgbWlnaHQgYmUg
YmV0dGVyCisgICAgICB0byB1c2UgdGhlIHJvdXRlciBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAg
IEBtZXRob2QgZGVmZXJSZWFkaW5lc3MKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGRlZmVy
UmVhZGluZXNzOiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
WW91IG11c3QgY2FsbCBkZWZlclJlYWRpbmVzcyBvbiBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBs
aWNhdGlvbicsIHRoaXMgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbik7CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBkZWZlciByZWFkaW5lc3Mgc2luY2UgdGhlIGByZWFk
eSgpYCBob29rIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLicsIHRoaXMuX3JlYWRpbmVzc0RlZmVy
cmFscyA+IDApOworICAgICAgdGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzKys7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgQ2FsbCBgYWR2YW5jZVJlYWRpbmVzc2AgYWZ0ZXIgYW55IGFzeW5jaHJv
bm91cyBzZXR1cCBsb2dpYyBoYXMgY29tcGxldGVkLgorICAgICAgRWFjaCBjYWxsIHRvIGBkZWZl
clJlYWRpbmVzc2AgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5jZVJlYWRpbmVz
c2AKKyAgICAgIG9yIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlY29tZSByZWFkeSBhbmQg
cm91dGluZyB3aWxsIG5vdCBiZWdpbi4KKyAgICAgICBAbWV0aG9kIGFkdmFuY2VSZWFkaW5lc3MK
KyAgICAgIEBzZWUge0VtYmVyLkFwcGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzfQorICAgICAgQHB1
YmxpYworICAgICovCisgICAgYWR2YW5jZVJlYWRpbmVzczogZnVuY3Rpb24gKCkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBtdXN0IGNhbGwgYWR2YW5jZVJlYWRpbmVzcyBv
biBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBsaWNhdGlvbicsIHRoaXMgaW5zdGFuY2VvZiBBcHBs
aWNhdGlvbik7CisgICAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMtLTsKKworICAgICAgaWYg
KHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9PT0gMCkgeworICAgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLCB0aGlzLmRpZEJlY29tZVJlYWR5KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBhbmQg
cmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGBFbWJlci5BcHBsaWNhdGlv
bmAKKyAgICAgIG9iamVjdCB3aGVuIHRoZSBib290IHByb2Nlc3MgaXMgY29tcGxldGUuCisgICAg
ICAgUnVuIGFueSBhcHBsaWNhdGlvbiBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUgYXBwbGljYXRp
b24gbG9hZCBob29rLiBUaGVzZSBob29rcyBtYXkKKyAgICAgIGNob29zZSB0byBkZWZlciByZWFk
aW5lc3MuIEZvciBleGFtcGxlLCBhbiBhdXRoZW50aWNhdGlvbiBob29rIG1pZ2h0IHdhbnQgdG8g
ZGVmZXIKKyAgICAgIHJlYWRpbmVzcyB1bnRpbCB0aGUgYXV0aCB0b2tlbiBoYXMgYmVlbiByZXRy
aWV2ZWQuCisgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRp
Y2FsbHkgb24gIkRPTSByZWFkeSI7IGhvd2V2ZXIsIGlmIGF1dG9ib290CisgICAgICBpcyBkaXNh
YmxlZCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHRoZSBmaXJzdCBhcHBsaWNh
dGlvbiBpbnN0YW5jZSBpcworICAgICAgY3JlYXRlZCB2aWEgYHZpc2l0YC4KKyAgICAgICBAcHJp
dmF0ZQorICAgICAgQG1ldGhvZCBib290CisgICAgICBAcmV0dXJuIHtQcm9taXNlPEVtYmVyLkFw
cGxpY2F0aW9uLEVycm9yPn0KKyAgICAqLworICAgIGJvb3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGlmICh0aGlzLl9ib290UHJvbWlzZSkgeworICAgICAgICByZXR1cm4gdGhpcy5fYm9vdFByb21p
c2U7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX2Jvb3RTeW5jKCk7Cisg
ICAgICB9IGNhdGNoIChfKSB7CisgICAgICAgIC8vIElnbm9yZSB0aCBlcnJvcjogaW4gdGhlIGFz
eW5jaHJvbm91cyBib290IHBhdGgsIHRoZSBlcnJvciBpcyBhbHJlYWR5IHJlZmxlY3RlZAorICAg
ICAgICAvLyBpbiB0aGUgcHJvbWlzZSByZWplY3Rpb24KKyAgICAgIH0KKworICAgICAgcmV0dXJu
IHRoaXMuX2Jvb3RQcm9taXNlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFVuZm9ydHVuYXRl
bHksIGEgbG90IG9mIGV4aXN0aW5nIGNvZGUgYXNzdW1lcyB0aGUgYm9vdGluZyBwcm9jZXNzIGlz
CisgICAgICAic3luY2hyb25vdXMiLiBTcGVjaWZpY2FsbHksIGEgbG90IG9mIHRlc3RzIGFzc3Vt
ZXMgdGhlIGxhc3QgY2FsbCB0bworICAgICAgYGFwcC5hZHZhbmNlUmVhZGluZXNzKClgIG9yIGBh
cHAucmVzZXQoKWAgd2lsbCByZXN1bHQgaW4gdGhlIGFwcCBiZWluZworICAgICAgZnVsbHktYm9v
dGVkIHdoZW4gdGhlIGN1cnJlbnQgcnVubG9vcCBjb21wbGV0ZXMuCisgICAgICAgV2Ugd291bGQg
bGlrZSBuZXcgY29kZSAobGlrZSB0aGUgYHZpc2l0YCBBUEkpIHRvIHN0b3AgbWFraW5nIHRoaXMg
YXNzdW1wdGlvbiwKKyAgICAgIHNvIHdlIGNyZWF0ZWQgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9u
IGFib3ZlIHRoYXQgcmV0dXJucyBhIHByb21pc2UuIEJ1dCB1bnRpbAorICAgICAgd2UgaGF2ZSBt
aWdyYXRlZCBhbGwgdGhlIGNvZGUsIHdlIHdvdWxkIGhhdmUgdG8gZXhwb3NlIHRoaXMgbWV0aG9k
IGZvciB1c2UKKyAgICAgICppbnRlcm5hbGx5KiBpbiBwbGFjZXMgd2hlcmUgd2UgbmVlZCB0byBi
b290IGFuIGFwcCAic3luY2hyb25vdXNseSIuCisgICAgICAgQHByaXZhdGUKKyAgICAqLworICAg
IF9ib290U3luYzogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuX2Jvb3RlZCkgeworICAg
ICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkVO
Vi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQgJiYgIXdhcm5lZEFib3V0TGVnYWN5Vmlld0Fk
ZG9uKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdTdXBwb3J0IGZvciB0
aGUgYGVtYmVyLWxlZ2FjeS12aWV3c2AgYWRkb24gd2lsbCBlbmQgc29vbiwgcGxlYXNlIHJlbW92
ZSBpdCBmcm9tIHlvdXIgYXBwbGljYXRpb24uJywgZmFsc2UsIHsgaWQ6ICdlbWJlci1sZWdhY3kt
dmlld3MnLCB1bnRpbDogJzIuNi4wJywgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0
aW9ucy92MS54LyN0b2NfZW1iZXItdmlldycgfSk7CisKKyAgICAgICAgd2FybmVkQWJvdXRMZWdh
Y3lWaWV3QWRkb24gPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoX2VtYmVyTWV0YWwuZGVm
YXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfQ09OVFJPTExFUl9TVVBQT1JUICYmICF3YXJuZWRBYm91
dExlZ2FjeUNvbnRyb2xsZXJBZGRvbikgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4o
J1N1cHBvcnQgZm9yIHRoZSBgZW1iZXItbGVnYWN5LWNvbnRyb2xsZXJzYCBoYXMgYmVlbiByZW1v
dmVkLCBwbGVhc2UgcmVtb3ZlIGl0IGZyb20geW91ciBhcHBsaWNhdGlvbi4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLWxlZ2FjeS1jb250cm9sbGVycycsIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS9k
ZXByZWNhdGlvbnMvdjEueC8jdG9jX29iamVjdGNvbnRyb2xsZXInIH0pOworCisgICAgICAgIHdh
cm5lZEFib3V0TGVnYWN5Q29udHJvbGxlckFkZG9uID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAg
Ly8gRXZlbiB0aG91Z2ggdGhpcyByZXR1cm5zIHN5bmNocm9ub3VzbHksIHdlIHN0aWxsIG5lZWQg
dG8gbWFrZSBzdXJlIHRoZQorICAgICAgLy8gYm9vdCBwcm9taXNlIGV4aXN0cyBmb3IgYm9vay1r
ZWVwaW5nIHB1cnBvc2VzOiBpZiBhbnl0aGluZyB3ZW50IHdyb25nIGluCisgICAgICAvLyB0aGUg
Ym9vdCBwcm9jZXNzLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBlcnJvciBhcyBhIHJlamVjdGlvbiBv
biB0aGUgYm9vdAorICAgICAgLy8gcHJvbWlzZSBzbyB0aGF0IGEgZnV0dXJlIGNhbGxlciBvZiBg
Ym9vdCgpYCBjYW4gdGVsbCB3aGF0IGZhaWxlZC4KKyAgICAgIHZhciBkZWZlciA9IHRoaXMuX2Jv
b3RSZXNvbHZlciA9IG5ldyBfZW1iZXJSdW50aW1lRXh0UnN2cC5kZWZhdWx0LmRlZmVyKCk7Cisg
ICAgICB0aGlzLl9ib290UHJvbWlzZSA9IGRlZmVyLnByb21pc2U7CisKKyAgICAgIHRyeSB7Cisg
ICAgICAgIHRoaXMucnVuSW5pdGlhbGl6ZXJzKCk7CisgICAgICAgIF9lbWJlclJ1bnRpbWVTeXN0
ZW1MYXp5X2xvYWQucnVuTG9hZEhvb2tzKCdhcHBsaWNhdGlvbicsIHRoaXMpOworICAgICAgICB0
aGlzLmFkdmFuY2VSZWFkaW5lc3MoKTsKKyAgICAgICAgLy8gQ29udGludWVzIHRvIGBkaWRCZWNv
bWVSZWFkeWAKKyAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgICAgIC8vIEZvciB0aGUgYXN5
bmNocm9ub3VzIGJvb3QgcGF0aAorICAgICAgICBkZWZlci5yZWplY3QoZXJyb3IpOworCisgICAg
ICAgIC8vIEZvciB0aGUgc3luY2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRocm93IGVycm9y
OworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJlc2V0IHRoZSBhcHBsaWNhdGlv
bi4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBvbmx5IGluIHRlc3RzLiBJdCBjbGVhbnMgdXAKKyAg
ICAgIHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAgIDEuIERl
YWN0aXZhdGUgZXhpc3Rpbmcgcm91dGVzCisgICAgICAyLiBEZXN0cm95IGFsbCBvYmplY3RzIGlu
IHRoZSBjb250YWluZXIKKyAgICAgIDMuIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjb250YWlu
ZXIKKyAgICAgIDQuIFJlLXJvdXRlIHRvIHRoZSBleGlzdGluZyB1cmwKKyAgICAgICBUeXBpY2Fs
IEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcDsKKyAgICAgICBy
dW4oZnVuY3Rpb24oKSB7CisgICAgICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OworICAgICAgfSk7CisgICAgICAgbW9kdWxlKCdhY2NlcHRhbmNlIHRlc3QnLCB7CisgICAgICAg
IHNldHVwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBBcHAucmVzZXQoKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICAgdGVzdCgnZmlyc3QgdGVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAg
ICAvLyBBcHAgaXMgZnJlc2hseSByZXNldAorICAgICAgfSk7CisgICAgICAgdGVzdCgnc2Vjb25k
IHRlc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gQXBwIGlzIGFnYWluIGZyZXNobHkgcmVz
ZXQKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQWR2YW5jZWQgRXhhbXBsZToKKyAgICAg
ICBPY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tIGluaXRp
YWxpemluZyBkdXJpbmcKKyAgICAgIHNldHVwLiBUaGlzIGNvdWxkIGVuYWJsZSBleHRyYSBjb25m
aWd1cmF0aW9uLCBvciBlbmFibGUgYXNzZXJ0aW5nIHByaW9yCisgICAgICB0byB0aGUgYXBwIGJl
Y29taW5nIHJlYWR5LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBBcHA7CisgICAg
ICAgcnVuKGZ1bmN0aW9uKCkgeworICAgICAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVh
dGUoKTsKKyAgICAgIH0pOworICAgICAgIG1vZHVsZSgnYWNjZXB0YW5jZSB0ZXN0JywgeworICAg
ICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgcnVuKGZ1bmN0aW9uKCkgeworICAg
ICAgICAgICAgQXBwLnJlc2V0KCk7CisgICAgICAgICAgICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsK
KyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgdGVzdCgnZmlyc3Qg
dGVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBvayh0cnVlLCAnc29tZXRoaW5nIGJlZm9yZSBh
cHAgaXMgaW5pdGlhbGl6ZWQnKTsKKyAgICAgICAgIHJ1bihmdW5jdGlvbigpIHsKKyAgICAgICAg
ICBBcHAuYWR2YW5jZVJlYWRpbmVzcygpOworICAgICAgICB9KTsKKyAgICAgICAgIG9rKHRydWUs
ICdzb21ldGhpbmcgYWZ0ZXIgYXBwIGlzIGluaXRpYWxpemVkJyk7CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgIEBtZXRob2QgcmVzZXQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FsbGlu
ZyByZXNldCgpIG9uIGluc3RhbmNlcyBvZiBgRW1iZXIuQXBwbGljYXRpb25gIGlzIG5vdFxuICAg
ICAgICAgICAgc3VwcG9ydGVkIHdoZW4gZ2xvYmFscyBtb2RlIGlzIGRpc2FibGVkOyBjYWxsIGB2
aXNpdCgpYCB0b1xuICAgICAgICAgICAgY3JlYXRlIG5ldyBgRW1iZXIuQXBwbGljYXRpb25JbnN0
YW5jZWBzIGFuZCBkaXNwb3NlIHRoZW1cbiAgICAgICAgICAgIHZpYSB0aGVpciBgZGVzdHJveSgp
YCBtZXRob2QgaW5zdGVhZC4nLCB0aGlzLl9nbG9iYWxzTW9kZSAmJiB0aGlzLmF1dG9ib290KTsK
KworICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5fX2RlcHJlY2F0ZWRJbnN0YW5jZV9fOworCisg
ICAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPSAxOworICAgICAgdGhpcy5fYm9vdFByb21p
c2UgPSBudWxsOworICAgICAgdGhpcy5fYm9vdFJlc29sdmVyID0gbnVsbDsKKyAgICAgIHRoaXMu
X2Jvb3RlZCA9IGZhbHNlOworCisgICAgICBmdW5jdGlvbiBoYW5kbGVSZXNldCgpIHsKKyAgICAg
ICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KGluc3RhbmNlLCAnZGVzdHJveScpOworICAg
ICAgICB0aGlzLl9idWlsZERlcHJlY2F0ZWRJbnN0YW5jZSgpOworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCAnX2Jvb3RTeW5jJyk7
CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5qb2luKHRoaXMs
IGhhbmRsZVJlc2V0KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAg
QG1ldGhvZCBkaWRCZWNvbWVSZWFkeQorICAgICovCisgICAgZGlkQmVjb21lUmVhZHk6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIFRPRE86IElzIHRoaXMgc3RpbGwgbmVl
ZGVkIGZvciBfZ2xvYmFsc01vZGUgPSBmYWxzZT8KKyAgICAgICAgaWYgKCFfZW1iZXJNZXRhbC5k
ZWZhdWx0LnRlc3RpbmcpIHsKKyAgICAgICAgICAvLyBFYWdlcmx5IG5hbWUgYWxsIGNsYXNzZXMg
dGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQKKyAgICAgICAgICBfZW1iZXJNZXRhbC5kZWZhdWx0Lk5h
bWVzcGFjZS5wcm9jZXNzQWxsKCk7CisgICAgICAgICAgX2VtYmVyTWV0YWwuZGVmYXVsdC5CT09U
RUQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGRvY3VtZW50YXRpb24gb24g
YF9hdXRvYm9vdCgpYCBmb3IgZGV0YWlscworICAgICAgICBpZiAodGhpcy5hdXRvYm9vdCkgewor
ICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHVuZGVmaW5lZDsKKworICAgICAgICAgIGlmICh0aGlz
Ll9nbG9iYWxzTW9kZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBf
X2RlcHJlY2F0ZWRJbnN0YW5jZV9fIGx5aW5nIGFyb3VuZCwgYm9vdCBpdCB0bworICAgICAgICAg
ICAgLy8gYXZvaWQgdW5uZWNlc3Nhcnkgd29yaworICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlz
Ll9fZGVwcmVjYXRlZEluc3RhbmNlX187CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IC8vIE90aGVyd2lzZSwgYnVpbGQgYW4gaW5zdGFuY2UgYW5kIGJvb3QgaXQuIFRoaXMgaXMgY3Vy
cmVudGx5IHVucmVhY2hhYmxlLAorICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBmb3JjZWQgX2ds
b2JhbHNNb2RlIHRvID09PSBhdXRvYm9vdDsgYnV0IGhhdmluZyB0aGlzIGJyYW5jaAorICAgICAg
ICAgICAgLy8gYWxsb3dzIHVzIHRvIGxvY2FsbHkgdG9nZ2xlIHRoYXQgZmxhZyBmb3Igd2VlZGlu
ZyBvdXQgbGVnYWN5IGdsb2JhbHMgbW9kZQorICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGlu
ZGVwZW5kZW50bHkKKyAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5idWlsZEluc3RhbmNlKCk7
CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5zdGFuY2UuX2Jvb3RTeW5jKCk7CisKKyAgICAg
ICAgICAvLyBUT0RPOiBBcHAucmVhZHkoKSBpcyBub3QgY2FsbGVkIHdoZW4gYXV0b2Jvb3QgaXMg
ZGlzYWJsZWQsIGlzIHRoaXMgY29ycmVjdD8KKyAgICAgICAgICB0aGlzLnJlYWR5KCk7CisKKyAg
ICAgICAgICBpbnN0YW5jZS5zdGFydFJvdXRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEZvciB0aGUgYXN5bmNocm9ub3VzIGJvb3QgcGF0aAorICAgICAgICB0aGlzLl9ib290UmVzb2x2
ZXIucmVzb2x2ZSh0aGlzKTsKKworICAgICAgICAvLyBGb3IgdGhlIHN5bmNocm9ub3VzIGJvb3Qg
cGF0aAorICAgICAgICB0aGlzLl9ib290ZWQgPSB0cnVlOworICAgICAgfSBjYXRjaCAoZXJyb3Ip
IHsKKyAgICAgICAgLy8gRm9yIHRoZSBhc3luY2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRo
aXMuX2Jvb3RSZXNvbHZlci5yZWplY3QoZXJyb3IpOworCisgICAgICAgIC8vIEZvciB0aGUgc3lu
Y2hyb25vdXMgYm9vdCBwYXRoCisgICAgICAgIHRocm93IGVycm9yOworICAgICAgfQorICAgIH0s
CisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBBcHBsaWNhdGlvbiBoYXMgYmVjb21l
IHJlYWR5LCBpbW1lZGlhdGVseSBiZWZvcmUgcm91dGluZworICAgICAgYmVnaW5zLiBUaGUgY2Fs
bCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIERPTSBoYXMgYmVjb21lIHJlYWR5LgorICAgICAg
IEBldmVudCByZWFkeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVhZHk6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyBUaGlzIG1ldGhvZCBt
dXN0IGJlIG1vdmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSBvYmplY3QKKyAgICB3aWxs
RGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICAgIF9lbWJlck1ldGFsLmRlZmF1bHQuQk9PVEVEID0gZmFsc2U7CisgICAg
ICB0aGlzLl9ib290ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuX2Jvb3RQcm9taXNlID0gbnVsbDsK
KyAgICAgIHRoaXMuX2Jvb3RSZXNvbHZlciA9IG51bGw7CisKKyAgICAgIGlmIChfZW1iZXJSdW50
aW1lU3lzdGVtTGF6eV9sb2FkLl9sb2FkZWQuYXBwbGljYXRpb24gPT09IHRoaXMpIHsKKyAgICAg
ICAgX2VtYmVyUnVudGltZVN5c3RlbUxhenlfbG9hZC5fbG9hZGVkLmFwcGxpY2F0aW9uID0gdW5k
ZWZpbmVkOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5fZ2xvYmFsc01vZGUgJiYgdGhpcy5f
X2RlcHJlY2F0ZWRJbnN0YW5jZV9fKSB7CisgICAgICAgIHRoaXMuX19kZXByZWNhdGVkSW5zdGFu
Y2VfXy5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgQm9vdCBh
IG5ldyBpbnN0YW5jZSBvZiBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZWAgZm9yIHRoZSBjdXJy
ZW50CisgICAgICBhcHBsaWNhdGlvbiBhbmQgbmF2aWdhdGUgaXQgdG8gdGhlIGdpdmVuIGB1cmxg
LiBSZXR1cm5zIGEgYFByb21pc2VgIHRoYXQKKyAgICAgIHJlc29sdmVzIHdpdGggdGhlIGluc3Rh
bmNlIHdoZW4gdGhlIGluaXRpYWwgcm91dGluZyBhbmQgcmVuZGVyaW5nIGlzCisgICAgICBjb21w
bGV0ZSwgb3IgcmVqZWN0cyB3aXRoIGFueSBlcnJvciB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZSBi
b290IHByb2Nlc3MuCisgICAgICAgV2hlbiBgYXV0b2Jvb3RgIGlzIGRpc2FibGVkLCBjYWxsaW5n
IGB2aXNpdGAgd291bGQgZmlyc3QgY2F1c2UgdGhlCisgICAgICBhcHBsaWNhdGlvbiB0byBib290
LCB3aGljaCBydW5zIHRoZSBhcHBsaWNhdGlvbiBpbml0aWFsaXplcnMuCisgICAgICAgVGhpcyBt
ZXRob2QgYWxzbyB0YWtlcyBhIGhhc2ggb2YgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9u
cyBmb3IKKyAgICAgIGN1c3RvbWl6aW5nIHRoZSBpbnN0YW5jZSdzIGJlaGF2aW9yLiBTZWUgdGhl
IGRvY3VtZW50YXRpb24gb24KKyAgICAgIGBFbWJlci5BcHBsaWNhdGlvbkluc3RhbmNlLkJvb3RP
cHRpb25zYCBmb3IgZGV0YWlscy4KKyAgICAgICBgRW1iZXIuQXBwbGljYXRpb25JbnN0YW5jZS5C
b290T3B0aW9uc2AgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIHRoYXQgZXhpc3RzCisgICAgICBwdXJl
bHkgdG8gZG9jdW1lbnQgdGhlIGF2YWlsYWJsZSBvcHRpb25zOyB5b3UgZG8gbm90IG5lZWQgdG8g
Y29uc3RydWN0IGl0CisgICAgICBtYW51YWxseS4gU2ltcGx5IHBhc3MgYSByZWd1bGFyIEphdmFT
Y3JpcHQgb2JqZWN0IGNvbnRhaW5pbmcgb2YgdGhlCisgICAgICBkZXNpcmVkIG9wdGlvbnM6Cisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgTXlBcHAudmlzaXQoIi8iLCB7IGxvY2F0aW9uOiAi
bm9uZSIsIHJvb3RFbGVtZW50OiAiI2NvbnRhaW5lciIgfSk7CisgICAgICBgYGAKKyAgICAgICAj
IyMgU3VwcG9ydGVkIFNjZW5hcmlvcworICAgICAgIFdoaWxlIHRoZSBgQm9vdE9wdGlvbnNgIGNs
YXNzIGV4cG9zZXMgYSBsYXJnZSBudW1iZXIgb2Yga25vYnMsIG5vdCBhbGwKKyAgICAgIGNvbWJp
bmF0aW9ucyBvZiB0aGVtIGFyZSB2YWxpZDsgY2VydGFpbiBpbmNvbXBhdGlibGUgY29tYmluYXRp
b25zIG1pZ2h0CisgICAgICByZXN1bHQgaW4gdW5leHBlY3RlZCBiZWhhdmlvci4KKyAgICAgICBG
b3IgZXhhbXBsZSwgYm9vdGluZyB0aGUgaW5zdGFuY2UgaW4gdGhlIGZ1bGwgYnJvd3NlciBlbnZp
cm9ubWVudAorICAgICAgd2hpbGUgc3BlY2lmeWluZyBhIGZvcmllZ24gYGRvY3VtZW50YCBvYmpl
Y3QgKGUuZy4gYHsgaXNCcm93c2VyOiB0cnVlLAorICAgICAgZG9jdW1lbnQ6IGlmcmFtZS5jb250
ZW50RG9jdW1lbnQgfWApIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHRvZGF5LAorICAgICAgbGFy
Z2VseSBkdWUgdG8gRW1iZXIncyBqUXVlcnkgZGVwZW5kZW5jeS4KKyAgICAgICBDdXJyZW50bHks
IHRoZXJlIGFyZSB0aHJlZSBvZmZpY2lhbGx5IHN1cHBvcnRlZCBzY2VuYXJpb3MvY29uZmlndXJh
dGlvbnMuCisgICAgICBVc2FnZXMgb3V0c2lkZSBvZiB0aGVzZSBzY2VuYXJpb3MgYXJlIG5vdCBn
dWFyYW50ZWVkIHRvIHdvcmssIGJ1dCBwbGVhc2UKKyAgICAgIGZlZWwgZnJlZSB0byBmaWxlIGJ1
ZyByZXBvcnRzIGRvY3VtZW50aW5nIHlvdXIgZXhwZXJpZW5jZSBhbmQgYW55IGlzc3VlcworICAg
ICAgeW91IGVuY291bnRlcmVkIHRvIGhlbHAgZXhwYW5kIHN1cHBvcnQuCisgICAgICAgIyMjIyBC
cm93c2VyIEFwcGxpY2F0aW9ucyAoTWFudWFsIEJvb3QpCisgICAgICAgVGhlIHNldHVwIGlzIGxh
cmdlbHkgc2ltaWxhciB0byBob3cgRW1iZXIgd29ya3Mgb3V0LW9mLXRoZS1ib3guIE5vcm1hbGx5
LAorICAgICAgRW1iZXIgd2lsbCBib290IGEgZGVmYXVsdCBpbnN0YW5jZSBmb3IgeW91ciBBcHBs
aWNhdGlvbiBvbiAiRE9NIHJlYWR5Ii4KKyAgICAgIEhvd2V2ZXIsIHlvdSBjYW4gY3VzdG9taXpl
IHRoaXMgYmVoYXZpb3IgYnkgZGlzYWJsaW5nIGBhdXRvYm9vdGAuCisgICAgICAgRm9yIGV4YW1w
bGUsIHRoaXMgYWxsb3dzIHlvdSB0byByZW5kZXIgYSBtaW5pdHVyZSBkZW1vIG9mIHlvdXIgYXBw
bGljYXRpb24KKyAgICAgIGludG8gYSBzcGVjaWZpYyBhcmVhIG9uIHlvdXIgbWFya2V0aW5nIHdl
YnNpdGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgaW1wb3J0IE15QXBwIGZyb20gJ215
LWFwcCc7CisgICAgICAgJChmdW5jdGlvbigpIHsKKyAgICAgICAgbGV0IEFwcCA9IE15QXBwLmNy
ZWF0ZSh7IGF1dG9ib290OiBmYWxzZSB9KTsKKyAgICAgICAgIGxldCBvcHRpb25zID0geworICAg
ICAgICAgIC8vIE92ZXJyaWRlIHRoZSByb3V0ZXIncyBsb2NhdGlvbiBhZGFwdGVyIHRvIHByZXZl
bnQgaXQgZnJvbSB1cGRhdGluZworICAgICAgICAgIC8vIHRoZSBVUkwgaW4gdGhlIGFkZHJlc3Mg
YmFyCisgICAgICAgICAgbG9jYXRpb246ICdub25lJywKKyAgICAgICAgICAgLy8gT3ZlcnJpZGUg
dGhlIGRlZmF1bHQgYHJvb3RFbGVtZW50YCBvbiB0aGUgYXBwIHRvIHJlbmRlciBpbnRvIGEKKyAg
ICAgICAgICAvLyBzcGVjaWZpYyBgZGl2YCBvbiB0aGUgcGFnZQorICAgICAgICAgIHJvb3RFbGVt
ZW50OiAnI2RlbW8nCisgICAgICAgIH07CisgICAgICAgICAvLyBTdGFydCB0aGUgYXBwIGF0IHRo
ZSBzcGVjaWFsIGRlbW8gVVJMCisgICAgICAgIEFwcC52aXNpdCgnL2RlbW8nLCBvcHRpb25zKTsK
KyAgICAgIH0pOworICAgICAgYGBgYAorICAgICAgIE9yIHBlcmhhcHMgeW91IG1pZ2h0IHdhbnQg
dG8gYm9vdCB0d28gaW5zdGFuY2VzIG9mIHlvdXIgYXBwIG9uIHRoZSBzYW1lCisgICAgICBwYWdl
IGZvciBhIHNwbGl0LXNjcmVlbiBtdWx0aXBsYXllciBleHBlcmllbmNlOgorICAgICAgIGBgYGph
dmFzY3JpcHQKKyAgICAgIGltcG9ydCBNeUFwcCBmcm9tICdteS1hcHAnOworICAgICAgICQoZnVu
Y3Rpb24oKSB7CisgICAgICAgIGxldCBBcHAgPSBNeUFwcC5jcmVhdGUoeyBhdXRvYm9vdDogZmFs
c2UgfSk7CisgICAgICAgICBsZXQgc2Vzc2lvbklkID0gTXlBcHAuZ2VuZXJhdGVTZXNzaW9uSUQo
KTsKKyAgICAgICAgIGxldCBwbGF5ZXIxID0gQXBwLnZpc2l0KGAvbWF0Y2hlcy9qb2luP25hbWU9
UGxheWVyKzEmc2Vzc2lvbj0ke3Nlc3Npb25JZH1gLCB7IHJvb3RFbGVtZW50OiAnI2xlZnQnLCBs
b2NhdGlvbjogJ25vbmUnIH0pOworICAgICAgICBsZXQgcGxheWVyMiA9IEFwcC52aXNpdChgL21h
dGNoZXMvam9pbj9uYW1lPVBsYXllcisyJnNlc3Npb249JHtzZXNzaW9uSWR9YCwgeyByb290RWxl
bWVudDogJyNyaWdodCcsIGxvY2F0aW9uOiAnbm9uZScgfSk7CisgICAgICAgICBQcm9taXNlLmFs
bChbcGxheWVyMSwgcGxheWVyMl0pLnRoZW4oKCkgPT4geworICAgICAgICAgIC8vIEJvdGggYXBw
cyBoYXZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCByZW5kZXIKKyAgICAgICAgICAkKCcjbG9hZGlu
ZycpLmZhZGVPdXQoKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAg
IERvIG5vdGUgdGhhdCBlYWNoIGFwcCBpbnN0YW5jZSBtYWludGFpbnMgdGhlaXIgb3duIHJlZ2lz
dHJ5L2NvbnRhaW5lciwgc28KKyAgICAgIHRoZXkgd2lsbCBydW4gaW4gY29tcGxldGUgaXNvbGF0
aW9uIGJ5IGRlZmF1bHQuCisgICAgICAgIyMjIyBTZXJ2ZXItU2lkZSBSZW5kZXJpbmcgKGFsc28g
a25vd24gYXMgRmFzdEJvb3QpCisgICAgICAgVGhpcyBzZXR1cCBhbGxvd3MgeW91IHRvIHJ1biB5
b3VyIEVtYmVyIGFwcCBpbiBhIHNlcnZlciBlbnZpcm9ubWVudCB1c2luZworICAgICAgTm9kZS5q
cyBhbmQgcmVuZGVyIGl0cyBjb250ZW50IGludG8gc3RhdGljIEhUTUwgZm9yIFNFTyBwdXJwb3Nl
cy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBjb25zdCBIVE1MU2VyaWFsaXplciA9IG5l
dyBTaW1wbGVET00uSFRNTFNlcmlhbGl6ZXIoU2ltcGxlRE9NLnZvaWRNYXApOworICAgICAgIGZ1
bmN0aW9uIHJlbmRlclVSTCh1cmwpIHsKKyAgICAgICAgbGV0IGRvbSA9IG5ldyBTaW1wbGVET00u
RG9jdW1lbnQoKTsKKyAgICAgICAgbGV0IHJvb3RFbGVtZW50ID0gZG9tLmJvZHk7CisgICAgICAg
IGxldCBvcHRpb25zID0geyBpc0Jyb3dzZXI6IGZhbHNlLCBkb2N1bWVudDogZG9tLCByb290RWxl
bWVudDogcm9vdEVsZW1lbnQgfTsKKyAgICAgICAgIHJldHVybiBNeUFwcC52aXNpdChvcHRpb25z
KS50aGVuKGluc3RhbmNlID0+IHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJu
IEhUTUxTZXJpYWxpemVyLnNlcmlhbGl6ZShyb290RWxlbWVudC5maXJzdENoaWxkKTsKKyAgICAg
ICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJveSgpOworICAgICAg
ICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICBgYGAKKyAgICAgICBJbiB0aGlzIHNj
ZW5hcmlvLCBiZWNhdXNlIEVtYmVyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIGEgZ2xvYmFsIGBk
b2N1bWVudGAKKyAgICAgIG9iamVjdCBpbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCwgeW91IG11
c3QgcHJvdmlkZSBvbmUgZXhwbGljaXRseS4gSW4gcHJhY3RpY2UsCisgICAgICBpbiB0aGUgbm9u
LWJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZSBzdGFuZC1pbiBgZG9jdW1lbnRgIG9iamVjdCBvbmx5
IG5lZWQgdG8KKyAgICAgIGltcGxlbWVudCBhIGxpbWl0ZWQgc3Vic2V0IG9mIHRoZSBmdWxsIERP
TSBBUEkuIFRoZSBgU2ltcGxlRE9NYCBsaWJyYXJ5IGlzIGtub3duCisgICAgICB0byB3b3JrLgor
ICAgICAgIFNpbmNlIHRoZXJlIGlzIG5vIGFjY2VzcyB0byBqUXVlcnkgaW4gdGhlIG5vbi1icm93
c2VyIGVudmlyb25tZW50LCB5b3UgbXVzdCBhbHNvCisgICAgICBzcGVjaWZ5IGEgRE9NIGBFbGVt
ZW50YCBvYmplY3QgaW4gdGhlIHNhbWUgYGRvY3VtZW50YCBmb3IgdGhlIGByb290RWxlbWVudGAg
b3B0aW9uCisgICAgICAoYXMgb3Bwb3NlZCB0byBhIHNlbGVjdG9yIHN0cmluZyBsaWtlIGAiYm9k
eSJgKS4KKyAgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIGBpc0Jyb3dzZXJgLCBg
ZG9jdW1lbnRgIGFuZCBgcm9vdEVsZW1lbnRgIHByb3BlcnRpZXMKKyAgICAgIG9uIGBFbWJlci5B
cHBsaWNhdGlvbkluc3RhbmNlLkJvb3RPcHRpb25zYCBmb3IgZGV0YWlscy4KKyAgICAgICAjIyMj
IFNlcnZlci1TaWRlIFJlc291cmNlIERpc2NvdmVyeQorICAgICAgIFRoaXMgc2V0dXAgYWxsb3dz
IHlvdSB0byBydW4gdGhlIHJvdXRpbmcgbGF5ZXIgb2YgeW91ciBFbWJlciBhcHAgaW4gYSBzZXJ2
ZXIKKyAgICAgIGVudmlyb25tZW50IHVzaW5nIE5vZGUuanMgYW5kIGNvbXBsZXRlbHkgZGlzYWJs
ZSByZW5kZXJpbmcuIFRoaXMgYWxsb3dzIHlvdQorICAgICAgdG8gc2ltdWxhdGUgYW5kIGRpc2Nv
dmVyIHRoZSByZXNvdXJjZXMgKGkuZS4gQUpBWCByZXF1ZXN0cykgbmVlZGVkIHRvIGZ1ZmlsbAor
ICAgICAgYSBnaXZlbiByZXF1ZXN0IGFuZCBlYWdlcmx5ICJwdXNoIiB0aGVzZSByZXNvdXJjZXMg
dG8gdGhlIGNsaWVudC4KKyAgICAgICBgYGBhcHAvaW5pdGlhbGl6ZXJzL25ldHdvcmstc2Vydmlj
ZS5qcworICAgICAgaW1wb3J0IEJyb3dzZXJOZXR3b3JrU2VydmljZSBmcm9tICdhcHAvc2Vydmlj
ZXMvbmV0d29yay9icm93c2VyJzsKKyAgICAgIGltcG9ydCBOb2RlTmV0d29ya1NlcnZpY2UgZnJv
bSAnYXBwL3NlcnZpY2VzL25ldHdvcmsvbm9kZSc7CisgICAgICAgLy8gSW5qZWN0IGEgKGh5cG90
aGV0aWNhbCkgc2VydmljZSBmb3IgYWJzdHJhY3RpbmcgYWxsIEFKQVggY2FsbHMgYW5kIHVzZQor
ICAgICAgLy8gdGhlIGFwcHJvcGlhdGUgaW1wbGVtZW50YWlvbiBvbiB0aGUgY2xpZW50L3NlcnZl
ci4gVGhpcyBhbHNvIGFsbG93cyB0aGUKKyAgICAgIC8vIHNlcnZlciB0byBsb2cgYWxsIHRoZSBB
SkFYIGNhbGxzIG1hZGUgZHVyaW5nIGEgcGFydGljdWxhciByZXF1ZXN0IGFuZCB1c2UKKyAgICAg
IC8vIHRoYXQgZm9yIHJlc291cmNlLWRpc2NvdmVyeSBwdXJwb3NlLgorICAgICAgIGV4cG9ydCBm
dW5jdGlvbiBpbml0aWFsaXplKGFwcGxpY2F0aW9uKSB7CisgICAgICAgIGlmICh3aW5kb3cpIHsg
Ly8gYnJvd3NlcgorICAgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdzZXJ2aWNlOm5ldHdv
cmsnLCBCcm93c2VyTmV0d29ya1NlcnZpY2UpOworICAgICAgICB9IGVsc2UgeyAvLyBub2RlCisg
ICAgICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcnZpY2U6bmV0d29yaycsIE5vZGVOZXR3
b3JrU2VydmljZSk7CisgICAgICAgIH0KKyAgICAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91
dGUnLCAnbmV0d29yaycsICdzZXJ2aWNlOm5ldHdvcmsnKTsKKyAgICAgIH07CisgICAgICAgZXhw
b3J0IGRlZmF1bHQgeworICAgICAgICBuYW1lOiAnbmV0d29yay1zZXJ2aWNlJywKKyAgICAgICAg
aW5pdGlhbGl6ZTogaW5pdGlhbGl6ZQorICAgICAgfTsKKyAgICAgIGBgYAorICAgICAgIGBgYGFw
cC9yb3V0ZXMvcG9zdC5qcworICAgICAgaW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVyJzsKKyAgICAg
ICAvLyBBbiBleGFtcGxlIG9mIGhvdyB0aGUgKGh5cG90aGV0aWNhbCkgc2VydmljZSBpcyB1c2Vk
IGluIHJvdXRlcy4KKyAgICAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Sb3V0ZS5leHRlbmQoewor
ICAgICAgICBtb2RlbChwYXJhbXMpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmZl
dGNoKGAvYXBpL3Bvc3RzLyR7cGFyYW1zLnBvc3RfaWR9Lmpzb25gKTsKKyAgICAgICAgfSwKKyAg
ICAgICAgIGFmdGVyTW9kZWwocG9zdCkgeworICAgICAgICAgIGlmIChwb3N0LmlzRXh0ZXJuYWxD
b250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmZldGNoKGAvYXBpL2V4
dGVybmFsLz91cmw9JHtwb3N0LmV4dGVybmFsVVJMfWApOworICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICByZXR1cm4gcG9zdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgYGBgCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgLy8gRmluYWxseSwgcHV0
IGFsbCB0aGUgcGllY2VzIHRvZ2V0aGVyCisgICAgICAgZnVuY3Rpb24gZGlzY292ZXJSZXNvdXJj
ZXNGb3IodXJsKSB7CisgICAgICAgIHJldHVybiBNeUFwcC52aXNpdCh1cmwsIHsgaXNCcm93c2Vy
OiBmYWxzZSwgc2hvdWxkUmVuZGVyOiBmYWxzZSB9KS50aGVuKGluc3RhbmNlID0+IHsKKyAgICAg
ICAgICBsZXQgbmV0d29ya1NlcnZpY2UgPSBpbnN0YW5jZS5sb29rdXAoJ3NlcnZpY2U6bmV0d29y
aycpOworICAgICAgICAgIHJldHVybiBuZXR3b3JrU2VydmljZS5yZXF1ZXN0czsgLy8gPT4geyAi
L2FwaS9wb3N0cy8xMjMuanNvbiI6ICIuLi4iIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAg
ICBgYGAKKyAgICAgICBAcHVibGljCisgICAgICBAbWV0aG9kIHZpc2l0CisgICAgICBAcGFyYW0g
dXJsIHtTdHJpbmd9IFRoZSBpbml0aWFsIFVSTCB0byBuYXZpZ2F0ZSB0bworICAgICAgQHBhcmFt
IG9wdGlvbnMge0VtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UuQm9vdE9wdGlvbnN9CisgICAgICBA
cmV0dXJuIHtQcm9taXNlPEVtYmVyLkFwcGxpY2F0aW9uSW5zdGFuY2UsIEVycm9yPn0KKyAgICAq
LworICAgIHZpc2l0OiBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7CisgICAgICB2YXIgX3RoaXMg
PSB0aGlzOworCisgICAgICByZXR1cm4gdGhpcy5ib290KCkudGhlbihmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIHJldHVybiBfdGhpcy5idWlsZEluc3RhbmNlKCkuYm9vdChvcHRpb25zKS50aGVuKGZ1
bmN0aW9uIChpbnN0YW5jZSkgeworICAgICAgICAgIHJldHVybiBpbnN0YW5jZS52aXNpdCh1cmwp
OworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKyAgfSk7CisKKyAgT2JqZWN0LmRlZmlu
ZVByb3BlcnR5KEFwcGxpY2F0aW9uLnByb3RvdHlwZSwgJ3JlZ2lzdHJ5JywgeworICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZSwKKyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgICBnZXQ6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHkuYnVp
bGRGYWtlUmVnaXN0cnlXaXRoRGVwcmVjYXRpb25zKHRoaXMsICdBcHBsaWNhdGlvbicpOworICAg
IH0KKyAgfSk7CisKKyAgQXBwbGljYXRpb24ucmVvcGVuQ2xhc3MoeworICAgIC8qKgorICAgICAg
VGhpcyBjcmVhdGVzIGEgcmVnaXN0cnkgd2l0aCB0aGUgZGVmYXVsdCBFbWJlciBuYW1pbmcgY29u
dmVudGlvbnMuCisgICAgICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSByZWdpc3RyeToKKyAgICAg
ICAqIHJlZ2lzdGVyZWQgdmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGV5IGFyZSBsb29r
ZWQgdXAgKHRoZXkgYXJlCisgICAgICAgIG5vdCBzaW5nbGV0b25zKQorICAgICAgKiByZWdpc3Rl
cmVkIHRlbXBsYXRlcyBhcmUgbm90IGZhY3RvcmllczsgdGhlIHJlZ2lzdGVyZWQgdmFsdWUgaXMK
KyAgICAgICAgcmV0dXJuZWQgZGlyZWN0bHkuCisgICAgICAqIHRoZSByb3V0ZXIgcmVjZWl2ZXMg
dGhlIGFwcGxpY2F0aW9uIGFzIGl0cyBgbmFtZXNwYWNlYCBwcm9wZXJ0eQorICAgICAgKiBhbGwg
Y29udHJvbGxlcnMgcmVjZWl2ZSB0aGUgcm91dGVyIGFzIHRoZWlyIGB0YXJnZXRgIGFuZCBgY29u
dHJvbGxlcnNgCisgICAgICAgIHByb3BlcnRpZXMKKyAgICAgICogYWxsIGNvbnRyb2xsZXJzIHJl
Y2VpdmUgdGhlIGFwcGxpY2F0aW9uIGFzIHRoZWlyIGBuYW1lc3BhY2VgIHByb3BlcnR5CisgICAg
ICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBjb250cm9s
bGVyIGFzIGl0cworICAgICAgICBgY29udHJvbGxlcmAgcHJvcGVydHkKKyAgICAgICogdGhlIGFw
cGxpY2F0aW9uIHZpZXcgcmVjZWl2ZXMgdGhlIGFwcGxpY2F0aW9uIHRlbXBsYXRlIGFzIGl0cwor
ICAgICAgICBgZGVmYXVsdFRlbXBsYXRlYCBwcm9wZXJ0eQorICAgICAgIEBwcml2YXRlCisgICAg
ICBAbWV0aG9kIGJ1aWxkUmVnaXN0cnkKKyAgICAgIEBzdGF0aWMKKyAgICAgIEBwYXJhbSB7RW1i
ZXIuQXBwbGljYXRpb259IG5hbWVzcGFjZSB0aGUgYXBwbGljYXRpb24gZm9yIHdoaWNoIHRvCisg
ICAgICAgIGJ1aWxkIHRoZSByZWdpc3RyeQorICAgICAgQHJldHVybiB7RW1iZXIuUmVnaXN0cnl9
IHRoZSBidWlsdCByZWdpc3RyeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgYnVpbGRSZWdp
c3RyeTogZnVuY3Rpb24gKGFwcGxpY2F0aW9uKSB7CisgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Vt
ZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJn
dW1lbnRzWzFdOworCisgICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9zdXBlci5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOworICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2FwcGxpY2F0aW9uOm1haW4n
LCBhcHBsaWNhdGlvbiwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisKKyAgICAgIGlmIChvcHRp
b25zW19lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lLkdMSU1NRVJdKSB7CisgICAgICAgIGds
aW1tZXJTZXR1cFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0
bWxiYXJzU2V0dXBSZWdpc3RyeShyZWdpc3RyeSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBy
ZWdpc3RyeTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9uIGNvbW1vblNldHVwUmVnaXN0cnko
cmVnaXN0cnkpIHsKKyAgICByZWdpc3RyeS5vcHRpb25zRm9yVHlwZSgnY29tcG9uZW50JywgeyBz
aW5nbGV0b246IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5Lm9wdGlvbnNGb3JUeXBlKCd2aWV3Jywg
eyBzaW5nbGV0b246IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5LmluamVjdGlvbigncmVuZGVyZXIn
LCAnZG9tJywgJ3NlcnZpY2U6LWRvbS1oZWxwZXInKTsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVy
KCdjb250cm9sbGVyOmJhc2ljJywgX2VtYmVyUnVudGltZUNvbnRyb2xsZXJzQ29udHJvbGxlci5k
ZWZhdWx0LCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKKworICAgIHJlZ2lzdHJ5LmluamVjdGlv
bignc2VydmljZTotZG9tLWhlbHBlcicsICdkb2N1bWVudCcsICdzZXJ2aWNlOi1kb2N1bWVudCcp
OworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJy12aWV3LXJlZ2lzdHJ5Om1haW4nLCB7IGNyZWF0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4ge307CisgICAgICB9IH0pOworCisgICAg
cmVnaXN0cnkuaW5qZWN0aW9uKCd2aWV3JywgJ192aWV3UmVnaXN0cnknLCAnLXZpZXctcmVnaXN0
cnk6bWFpbicpOworCisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdfdG9wTGV2ZWxW
aWV3VGVtcGxhdGUnLCAndGVtcGxhdGU6LW91dGxldCcpOworCisgICAgcmVnaXN0cnkucmVnaXN0
ZXIoJ3JvdXRlOmJhc2ljJywgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRlLmRlZmF1bHQpOworICAg
IHJlZ2lzdHJ5LnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1haW4nLCBfZW1iZXJWaWV3c1N5
c3RlbUV2ZW50X2Rpc3BhdGNoZXIuZGVmYXVsdCk7CisKKyAgICByZWdpc3RyeS5pbmplY3Rpb24o
J3JvdXRlcjptYWluJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlvbjptYWluJyk7CisgICAgcmVn
aXN0cnkuaW5qZWN0aW9uKCd2aWV3Oi1vdXRsZXQnLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9u
Om1haW4nKTsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdsb2NhdGlvbjphdXRvJywgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXV0b19sb2NhdGlvbi5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdp
c3RlcignbG9jYXRpb246aGFzaCcsIF9lbWJlclJvdXRpbmdMb2NhdGlvbkhhc2hfbG9jYXRpb24u
ZGVmYXVsdCk7CisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnknLCBfZW1i
ZXJSb3V0aW5nTG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5
LnJlZ2lzdGVyKCdsb2NhdGlvbjpub25lJywgX2VtYmVyUm91dGluZ0xvY2F0aW9uTm9uZV9sb2Nh
dGlvbi5kZWZhdWx0KTsKKworICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udHJvbGxlcicsICd0
YXJnZXQnLCAncm91dGVyOm1haW4nKTsKKyAgICByZWdpc3RyeS5pbmplY3Rpb24oJ2NvbnRyb2xs
ZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1haW4nKTsKKworICAgIHJlZ2lzdHJ5LnJl
Z2lzdGVyKF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRpemUoX3RlbXBsYXRlT2JqZWN0KSwgX2Vt
YmVyUm91dGluZ1N5c3RlbUNhY2hlLmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5LmluamVjdGlvbign
cm91dGVyJywgJ19idWNrZXRDYWNoZScsIF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRpemUoX3Rl
bXBsYXRlT2JqZWN0KSk7CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdfYnVja2V0
Q2FjaGUnLCBfY29udGFpbmVyUmVnaXN0cnkucHJpdmF0aXplKF90ZW1wbGF0ZU9iamVjdCkpOwor
ICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udHJvbGxlcicsICdfYnVja2V0Q2FjaGUnLCBfY29u
dGFpbmVyUmVnaXN0cnkucHJpdmF0aXplKF90ZW1wbGF0ZU9iamVjdCkpOworCisgICAgcmVnaXN0
cnkuaW5qZWN0aW9uKCdyb3V0ZScsICdyb3V0ZXInLCAncm91dGVyOm1haW4nKTsKKworICAgIHJl
Z2lzdHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6LXRleHQtZmllbGQnLCBfZW1iZXJWaWV3c1ZpZXdz
VGV4dF9maWVsZC5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcignY29tcG9uZW50Oi10
ZXh0LWFyZWEnLCBfZW1iZXJWaWV3c1ZpZXdzVGV4dF9hcmVhLmRlZmF1bHQpOworICAgIHJlZ2lz
dHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6LWNoZWNrYm94JywgX2VtYmVyVmlld3NWaWV3c0NoZWNr
Ym94LmRlZmF1bHQpOworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdjb21wb25lbnQ6bGluay10bycs
IF9lbWJlclJvdXRpbmdWaWV3c0NvbXBvbmVudHNMaW5rVG8uZGVmYXVsdCk7CisKKyAgICAvLyBS
ZWdpc3RlciB0aGUgcm91dGluZyBzZXJ2aWNlLi4uCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3Nl
cnZpY2U6LXJvdXRpbmcnLCBfZW1iZXJSb3V0aW5nU2VydmljZXNSb3V0aW5nLmRlZmF1bHQpOwor
ICAgIC8vIFRoZW4gaW5qZWN0IHRoZSBhcHAgcm91dGVyIGludG8gaXQKKyAgICByZWdpc3RyeS5p
bmplY3Rpb24oJ3NlcnZpY2U6LXJvdXRpbmcnLCAncm91dGVyJywgJ3JvdXRlcjptYWluJyk7CisK
KyAgICAvLyBERUJVR0dJTkcKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVzb2x2ZXItZm9yLWRl
YnVnZ2luZzptYWluJywgcmVnaXN0cnkucmVzb2x2ZXIsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0p
OworICAgIHJlZ2lzdHJ5LmluamVjdGlvbignY29udGFpbmVyLWRlYnVnLWFkYXB0ZXI6bWFpbics
ICdyZXNvbHZlcicsICdyZXNvbHZlci1mb3ItZGVidWdnaW5nOm1haW4nKTsKKyAgICByZWdpc3Ry
eS5pbmplY3Rpb24oJ2RhdGEtYWRhcHRlcjptYWluJywgJ2NvbnRhaW5lckRlYnVnQWRhcHRlcics
ICdjb250YWluZXItZGVidWctYWRhcHRlcjptYWluJyk7CisgICAgLy8gQ3VzdG9tIHJlc29sdmVy
IGF1dGhvcnMgbWF5IHdhbnQgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIENvbnRhaW5lckRlYnVnQWRh
cHRlciB3aXRoIHRoaXMga2V5CisKKyAgICByZWdpc3RyeS5yZWdpc3RlcignY29udGFpbmVyLWRl
YnVnLWFkYXB0ZXI6bWFpbicsIF9lbWJlckV4dGVuc2lvblN1cHBvcnRDb250YWluZXJfZGVidWdf
YWRhcHRlci5kZWZhdWx0KTsKKyAgfQorCisgIGZ1bmN0aW9uIGdsaW1tZXJTZXR1cFJlZ2lzdHJ5
KHJlZ2lzdHJ5KSB7CisgICAgY29tbW9uU2V0dXBSZWdpc3RyeShyZWdpc3RyeSk7CisKKyAgICB2
YXIgRW52aXJvbm1lbnQgPSBfcmVxdWlyZTIuZGVmYXVsdCgnZW1iZXItZ2xpbW1lci9lbnZpcm9u
bWVudCcpLmRlZmF1bHQ7CisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3NlcnZpY2U6LWdsaW1tZXIt
ZW52aXJvbm1lbnQnLCBFbnZpcm9ubWVudCk7CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdzZXJ2
aWNlOi1nbGltbWVyLWVudmlyb25tZW50JywgJ2RvbScsICdzZXJ2aWNlOi1kb20taGVscGVyJyk7
CisgICAgcmVnaXN0cnkuaW5qZWN0aW9uKCdyZW5kZXJlcicsICdlbnYnLCAnc2VydmljZTotZ2xp
bW1lci1lbnZpcm9ubWVudCcpOworCisgICAgdmFyIE91dGxldFZpZXcgPSBfcmVxdWlyZTIuZGVm
YXVsdCgnZW1iZXItZ2xpbW1lci9lbWJlci1yb3V0aW5nLXZpZXcnKS5PdXRsZXRWaWV3OworICAg
IHJlZ2lzdHJ5LnJlZ2lzdGVyKCd2aWV3Oi1vdXRsZXQnLCBPdXRsZXRWaWV3KTsKKworICAgIHZh
ciBfcmVxdWlyZSA9IF9yZXF1aXJlMi5kZWZhdWx0KCdlbWJlci1nbGltbWVyL2VtYmVyLW1ldGFs
LXZpZXdzJyk7CisKKyAgICB2YXIgSW50ZXJhY3RpdmVSZW5kZXJlciA9IF9yZXF1aXJlLkludGVy
YWN0aXZlUmVuZGVyZXI7CisgICAgdmFyIEluZXJ0UmVuZGVyZXIgPSBfcmVxdWlyZS5JbmVydFJl
bmRlcmVyOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JlbmRlcmVyOi1kb20nLCBJbnRlcmFj
dGl2ZVJlbmRlcmVyKTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVuZGVyZXI6LWluZXJ0Jywg
SW5lcnRSZW5kZXJlcik7CisKKyAgICB2YXIgRE9NSGVscGVyID0gX3JlcXVpcmUyLmRlZmF1bHQo
J2VtYmVyLWdsaW1tZXIvZG9tJykuZGVmYXVsdDsKKworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdz
ZXJ2aWNlOi1kb20taGVscGVyJywgeworICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoX3JlZikgewor
ICAgICAgICB2YXIgZG9jdW1lbnQgPSBfcmVmLmRvY3VtZW50OworICAgICAgICByZXR1cm4gbmV3
IERPTUhlbHBlcihkb2N1bWVudCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgZ2xpbW1l
ck91dGxldFRlbXBsYXRlID0gX3JlcXVpcmUyLmRlZmF1bHQoJ2VtYmVyLWdsaW1tZXIvdGVtcGxh
dGVzL291dGxldCcpLmRlZmF1bHQ7CisgICAgdmFyIGdsaW1tZXJDb21wb25lbnRUZW1wbGF0ZSA9
IF9yZXF1aXJlMi5kZWZhdWx0KCdlbWJlci1nbGltbWVyL3RlbXBsYXRlcy9jb21wb25lbnQnKS5k
ZWZhdWx0OworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKF9jb250YWluZXJSZWdpc3RyeS5wcml2YXRp
emUoX3RlbXBsYXRlT2JqZWN0MiksIGdsaW1tZXJDb21wb25lbnRUZW1wbGF0ZSk7CisgICAgcmVn
aXN0cnkucmVnaXN0ZXIoJ3RlbXBsYXRlOi1vdXRsZXQnLCBnbGltbWVyT3V0bGV0VGVtcGxhdGUp
OworICAgIHJlZ2lzdHJ5LmluamVjdGlvbigndmlldzotb3V0bGV0JywgJ3RlbXBsYXRlJywgJ3Rl
bXBsYXRlOi1vdXRsZXQnKTsKKyAgICByZWdpc3RyeS5pbmplY3Rpb24oJ3RlbXBsYXRlJywgJ2Vu
dicsICdzZXJ2aWNlOi1nbGltbWVyLWVudmlyb25tZW50Jyk7CisKKyAgICByZWdpc3RyeS5vcHRp
b25zRm9yVHlwZSgnaGVscGVyJywgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7CisgIH0KKworICBm
dW5jdGlvbiBodG1sYmFyc1NldHVwUmVnaXN0cnkocmVnaXN0cnkpIHsKKyAgICBjb21tb25TZXR1
cFJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKKworICAgIHJlZ2lzdHJ5Lm9wdGlvbnNGb3JUeXBlKCd0ZW1w
bGF0ZScsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOworICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCd2
aWV3Oi1vdXRsZXQnLCBfZW1iZXJSb3V0aW5nVmlld3NWaWV3c091dGxldC5PdXRsZXRWaWV3KTsK
KworICAgIHZhciBJbnRlcmFjdGl2ZVJlbmRlcmVyID0gX2VtYmVyTWV0YWxWaWV3cy5JbnRlcmFj
dGl2ZVJlbmRlcmVyOworICAgIHZhciBJbmVydFJlbmRlcmVyID0gX2VtYmVyTWV0YWxWaWV3cy5J
bmVydFJlbmRlcmVyOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3JlbmRlcmVyOi1kb20nLCBJ
bnRlcmFjdGl2ZVJlbmRlcmVyKTsKKyAgICByZWdpc3RyeS5yZWdpc3RlcigncmVuZGVyZXI6LWlu
ZXJ0JywgSW5lcnRSZW5kZXJlcik7CisKKyAgICByZWdpc3RyeS5yZWdpc3Rlcignc2VydmljZTot
ZG9tLWhlbHBlcicsIHsKKyAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICAg
IHZhciBkb2N1bWVudCA9IF9yZWYyLmRvY3VtZW50OworICAgICAgICByZXR1cm4gbmV3IF9lbWJl
ckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLmRlZmF1bHQoZG9jdW1lbnQpOworICAgICAgfQorICAg
IH0pOworCisgICAgcmVnaXN0cnkucmVnaXN0ZXIoJ3RlbXBsYXRlOi1vdXRsZXQnLCBfZW1iZXJI
dG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldy5kZWZhdWx0KTsKKyAgICByZWdpc3RyeS5yZWdp
c3Rlcigndmlldzp0b3BsZXZlbCcsIF9lbWJlclZpZXdzVmlld3NWaWV3LmRlZmF1bHQuZXh0ZW5k
KCkpOworICB9CisKKyAgZnVuY3Rpb24gcmVnaXN0ZXJMaWJyYXJpZXMoKSB7CisgICAgaWYgKCFs
aWJyYXJpZXNSZWdpc3RlcmVkKSB7CisgICAgICBsaWJyYXJpZXNSZWdpc3RlcmVkID0gdHJ1ZTsK
KworICAgICAgaWYgKF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5oYXNET00pIHsKKyAg
ICAgICAgX2VtYmVyTWV0YWwuZGVmYXVsdC5saWJyYXJpZXMucmVnaXN0ZXJDb3JlTGlicmFyeSgn
alF1ZXJ5JywgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCgpLmpxdWVyeSk7CisgICAg
ICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbG9nTGlicmFyeVZlcnNpb25zKCkgeworICAg
IGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkxPR19WRVJTSU9OKSB7CisgICAgICAvLyB3ZSBvbmx5
IG5lZWQgdG8gc2VlIHRoaXMgb25jZSBwZXIgQXBwbGljYXRpb24jaW5pdAorICAgICAgX2VtYmVy
TWV0YWwuZGVmYXVsdC5MT0dfVkVSU0lPTiA9IGZhbHNlOworICAgICAgdmFyIGxpYnMgPSBfZW1i
ZXJNZXRhbC5kZWZhdWx0LmxpYnJhcmllcy5fcmVnaXN0cnk7CisKKyAgICAgIHZhciBuYW1lTGVu
Z3RocyA9IGxpYnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbSwgJ25hbWUubGVuZ3RoJyk7CisgICAgICB9KTsKKwor
ICAgICAgdmFyIG1heE5hbWVMZW5ndGggPSBNYXRoLm1heC5hcHBseSh0aGlzLCBuYW1lTGVuZ3Ro
cyk7CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0nKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlicy5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKKyAgICAgICAgdmFyIGxpYiA9IGxpYnNbaV07CisgICAgICAgIHZhciBzcGFj
ZXMgPSBuZXcgQXJyYXkobWF4TmFtZUxlbmd0aCAtIGxpYi5uYW1lLmxlbmd0aCArIDEpLmpvaW4o
JyAnKTsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1ZyhbbGliLm5hbWUsIHNwYWNlcywg
JyA6ICcsIGxpYi52ZXJzaW9uXS5qb2luKCcnKSk7CisgICAgICB9CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlYnVnKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgfQor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQXBwbGljYXRpb247Cit9KTsKKy8vIEVtYmVyLmxp
YnJhcmllcywgTE9HX1ZFUlNJT04sIE5hbWVzcGFjZSwgQk9PVEVECitlbmlmZWQoJ2VtYmVyLWFw
cGxpY2F0aW9uL3N5c3RlbS9lbmdpbmUtaW5zdGFuY2UnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVu
dGltZS9zeXN0ZW0vb2JqZWN0JywgJ2NvbnRhaW5lci9yZWdpc3RyeScsICdlbWJlci1ydW50aW1l
L21peGlucy9jb250YWluZXJfcHJveHknLCAnZW1iZXItcnVudGltZS9taXhpbnMvcmVnaXN0cnlf
cHJveHknLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9jb250YWluZXJSZWdpc3RyeSwgX2VtYmVyUnVudGltZU1p
eGluc0NvbnRhaW5lcl9wcm94eSwgX2VtYmVyUnVudGltZU1peGluc1JlZ2lzdHJ5X3Byb3h5LCBf
ZW1iZXJNZXRhbFJ1bl9sb29wKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItYXBwbGljYXRpb24KKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisg
ICAgVGhlIGBFbmdpbmVJbnN0YW5jZWAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgc3RhdGVmdWwg
YXNwZWN0cyBvZiBhCisgICAgcnVubmluZyBgRW5naW5lYC4KKyAgCisgICAgQHB1YmxpYworICAg
IEBjbGFzcyBFbWJlci5FbmdpbmVJbnN0YW5jZQorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAor
ICAgIEB1c2VzIFJlZ2lzdHJ5UHJveHlNaXhpbgorICAgIEB1c2VzIENvbnRhaW5lclByb3h5TWl4
aW4KKyAgICBAY2F0ZWdvcnkgZW1iZXItYXBwbGljYXRpb24tZW5naW5lcworICAqLworCisgIHZh
ciBFbmdpbmVJbnN0YW5jZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRl
bmQoX2VtYmVyUnVudGltZU1peGluc1JlZ2lzdHJ5X3Byb3h5LmRlZmF1bHQsIF9lbWJlclJ1bnRp
bWVNaXhpbnNDb250YWluZXJfcHJveHkuZGVmYXVsdCwgeworICAgIC8qKgorICAgICAgVGhlIGJh
c2UgYEVuZ2luZWAgZm9yIHdoaWNoIHRoaXMgaXMgYW4gaW5zdGFuY2UuCisgICAgICAgQHByb3Bl
cnR5IHtFbWJlci5FbmdpbmV9IGVuZ2luZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGJh
c2U6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICB2YXIgYmFzZSA9IHRoaXMuYmFzZTsKKwor
ICAgICAgaWYgKCFiYXNlKSB7CisgICAgICAgIGJhc2UgPSB0aGlzLmFwcGxpY2F0aW9uOworICAg
ICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgYSBwZXIt
aW5zdGFuY2UgcmVnaXN0cnkgdGhhdCB3aWxsIHVzZSB0aGUgYXBwbGljYXRpb24ncyByZWdpc3Ry
eQorICAgICAgLy8gYXMgYSBmYWxsYmFjayBmb3IgcmVzb2x2aW5nIHJlZ2lzdHJhdGlvbnMuCisg
ICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9fcmVnaXN0cnlfXyA9IG5ldyBfY29udGFpbmVyUmVn
aXN0cnkuZGVmYXVsdCh7CisgICAgICAgIGZhbGxiYWNrOiBiYXNlLl9fcmVnaXN0cnlfXworICAg
ICAgfSk7CisKKyAgICAgIC8vIENyZWF0ZSBhIHBlci1pbnN0YW5jZSBjb250YWluZXIgZnJvbSB0
aGUgaW5zdGFuY2UncyByZWdpc3RyeQorICAgICAgdGhpcy5fX2NvbnRhaW5lcl9fID0gcmVnaXN0
cnkuY29udGFpbmVyKHsgb3duZXI6IHRoaXMgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICBV
bnJlZ2lzdGVyIGEgZmFjdG9yeS4KKyAgICAgIE92ZXJyaWRlcyBgUmVnaXN0cnlQcm94eSN1bnJl
Z2lzdGVyYCBpbiBvcmRlciB0byBjbGVhciBhbnkgY2FjaGVkIGluc3RhbmNlcworICAgICBvZiB0
aGUgdW5yZWdpc3RlcmVkIGZhY3RvcnkuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgdW5y
ZWdpc3RlcgorICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgKi8KKyAgICB1bnJl
Z2lzdGVyOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHRoaXMuX19jb250YWluZXJfXy5y
ZXNldChmdWxsTmFtZSk7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICB3aWxsRGVz
dHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKKyAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdCh0aGlzLl9fY29udGFpbmVy
X18sICdkZXN0cm95Jyk7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBFbmdp
bmVJbnN0YW5jZTsKK30pOworZW5pZmVkKCdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vZW5naW5l
JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hbWVzcGFjZScsICdjb250YWlu
ZXIvcmVnaXN0cnknLCAnZW1iZXItcnVudGltZS9taXhpbnMvcmVnaXN0cnlfcHJveHknLCAnZGFn
LW1hcCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
c2V0JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1hcHBsaWNhdGlvbi9zeXN0ZW0vcmVzb2x2ZXInLCAn
ZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2VuZ2luZS1pbnN0YW5jZScsICdlbWJlci1tZXRhbC9m
ZWF0dXJlcycsICdlbWJlci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UsIF9jb250YWluZXJSZWdpc3RyeSwgX2VtYmVyUnVudGlt
ZU1peGluc1JlZ2lzdHJ5X3Byb3h5LCBfZGFnTWFwLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbVJlc29s
dmVyLCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUVuZ2luZUluc3RhbmNlLCBfZW1iZXJNZXRhbEZl
YXR1cmVzLCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICB2
YXIgR0xJTU1FUiA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0dMSU1NRVInKTsKKworICBl
eHBvcnRzLkdMSU1NRVIgPSBHTElNTUVSOworICBmdW5jdGlvbiBwcm9wcyhvYmopIHsKKyAgICB2
YXIgcHJvcGVydGllcyA9IFtdOworCisgICAgZm9yICh2YXIga2V5IGluIG9iaikgeworICAgICAg
cHJvcGVydGllcy5wdXNoKGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHByb3BlcnRpZXM7Cisg
IH0KKworICAvKioKKyAgICBUaGUgYEVuZ2luZWAgY2xhc3MgY29udGFpbnMgY29yZSBmdW5jdGlv
bmFsaXR5IGZvciBib3RoIGFwcGxpY2F0aW9ucyBhbmQKKyAgICBlbmdpbmVzLgorICAKKyAgICBF
YWNoIGVuZ2luZSBtYW5hZ2VzIGEgcmVnaXN0cnkgdGhhdCdzIHVzZWQgZm9yIGRlcGVuZGVuY3kg
aW5qZWN0aW9uIGFuZAorICAgIGV4cG9zZWQgdGhyb3VnaCBgUmVnaXN0cnlQcm94eWAuCisgIAor
ICAgIEVuZ2luZXMgYWxzbyBtYW5hZ2UgaW5pdGlhbGl6ZXJzIGFuZCBpbnN0YW5jZSBpbml0aWFs
aXplcnMuCisgIAorICAgIEVuZ2luZXMgY2FuIHNwYXduIGBFbmdpbmVJbnN0YW5jZWAgaW5zdGFu
Y2VzIHZpYSBgYnVpbGRJbnN0YW5jZSgpYC4KKyAgCisgICAgQGNsYXNzIEVuZ2luZQorICAgIEBu
YW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKKyAgICBAdXNlcyBS
ZWdpc3RyeVByb3h5CisgICAgQGNhdGVnb3J5IGVtYmVyLWFwcGxpY2F0aW9uLWVuZ2luZXMKKyAg
ICBAcHVibGljCisgICovCisgIHZhciBFbmdpbmUgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNw
YWNlLmRlZmF1bHQuZXh0ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNSZWdpc3RyeV9wcm94eS5kZWZh
dWx0LCB7CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKHRoaXNbR0xJTU1FUl0gPT09IHVuZGVmaW5l
ZCkgeworICAgICAgICB0aGlzW0dMSU1NRVJdID0gX2VtYmVyTWV0YWxGZWF0dXJlcy5kZWZhdWx0
KCdlbWJlci1nbGltbWVyJyk7CisgICAgICB9CisKKyAgICAgIHRoaXMuYnVpbGRSZWdpc3RyeSgp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIENyZWF0ZSBhbiBFbmdpbmVJbnN0YW5jZSBmb3Ig
dGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBidWlsZElu
c3RhbmNlCisgICAgICBAcmV0dXJuIHtFbWJlci5FbmdpbmVJbnN0YW5jZX0gdGhlIGFwcGxpY2F0
aW9uIGluc3RhbmNlCisgICAgKi8KKyAgICBidWlsZEluc3RhbmNlOiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0g
PT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgICBvcHRpb25zLmJhc2Ug
PSB0aGlzOworICAgICAgcmV0dXJuIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtRW5naW5lSW5zdGFu
Y2UuZGVmYXVsdC5jcmVhdGUob3B0aW9ucyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQnVp
bGQgYW5kIGNvbmZpZ3VyZSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9u
LgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGJ1aWxkUmVnaXN0cnkKKyAgICAgIEBy
ZXR1cm4ge0VtYmVyLlJlZ2lzdHJ5fSB0aGUgY29uZmlndXJlZCByZWdpc3RyeQorICAgICovCisg
ICAgYnVpbGRSZWdpc3RyeTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9jb25zdHJ1Y3RvciRi
dWlsZFJlZ2lzdHJ5OworCisgICAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLl9fcmVnaXN0cnlfXyA9
IHRoaXMuY29uc3RydWN0b3IuYnVpbGRSZWdpc3RyeSh0aGlzLCAoX2NvbnN0cnVjdG9yJGJ1aWxk
UmVnaXN0cnkgPSB7fSwgX2NvbnN0cnVjdG9yJGJ1aWxkUmVnaXN0cnlbR0xJTU1FUl0gPSB0aGlz
W0dMSU1NRVJdLCBfY29uc3RydWN0b3IkYnVpbGRSZWdpc3RyeSkpOworCisgICAgICByZXR1cm4g
cmVnaXN0cnk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgaW5pdGlhbGl6ZXIKKyAgICAqLworICAgIGluaXRpYWxpemVyOiBmdW5jdGlvbiAob3B0aW9u
cykgeworICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5pbml0aWFsaXplcihvcHRpb25zKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBpbnN0YW5jZUluaXRp
YWxpemVyCisgICAgKi8KKyAgICBpbnN0YW5jZUluaXRpYWxpemVyOiBmdW5jdGlvbiAob3B0aW9u
cykgeworICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5pbnN0YW5jZUluaXRpYWxpemVyKG9wdGlvbnMp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHJ1bklu
aXRpYWxpemVycworICAgICovCisgICAgcnVuSW5pdGlhbGl6ZXJzOiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB0aGlzLl9ydW5Jbml0aWFsaXplcignaW5p
dGlhbGl6ZXJzJywgZnVuY3Rpb24gKG5hbWUsIGluaXRpYWxpemVyKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdObyBhcHBsaWNhdGlvbiBpbml0aWFsaXplciBuYW1lZCBcJycg
KyBuYW1lICsgJ1wnJywgISFpbml0aWFsaXplcik7CisgICAgICAgIGlmIChpbml0aWFsaXplci5p
bml0aWFsaXplLmxlbmd0aCA9PT0gMikgeworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdUaGUgYGluaXRpYWxpemVgIG1ldGhvZCBmb3IgQXBwbGljYXRpb24gaW5pdGlhbGl6
ZXIgXCcnICsgbmFtZSArICdcJyBzaG91bGQgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCAtIGBBcHBg
LCBhbiBpbnN0YW5jZSBvZiBhbiBgQXBwbGljYXRpb25gLicsIGZhbHNlLCB7CisgICAgICAgICAg
ICBpZDogJ2VtYmVyLWFwcGxpY2F0aW9uLmFwcC1pbml0aWFsaXplci1pbml0aWFsaXplLWFyZ3Vt
ZW50cycsCisgICAgICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgICAgIHVybDogJ2h0
dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueC8jdG9jX2luaXRpYWxpemVyLWFyaXR5
JworICAgICAgICAgIH0pOworCisgICAgICAgICAgaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShfdGhp
cy5fX3JlZ2lzdHJ5X18sIF90aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbml0
aWFsaXplci5pbml0aWFsaXplKF90aGlzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgIEBzaW5jZSAxLjEyLjAKKyAgICAgIEBt
ZXRob2QgcnVuSW5zdGFuY2VJbml0aWFsaXplcnMKKyAgICAqLworICAgIHJ1bkluc3RhbmNlSW5p
dGlhbGl6ZXJzOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHsKKyAgICAgIHRoaXMuX3J1bkluaXRpYWxp
emVyKCdpbnN0YW5jZUluaXRpYWxpemVycycsIGZ1bmN0aW9uIChuYW1lLCBpbml0aWFsaXplcikg
eworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnTm8gaW5zdGFuY2UgaW5pdGlhbGl6
ZXIgbmFtZWQgXCcnICsgbmFtZSArICdcJycsICEhaW5pdGlhbGl6ZXIpOworICAgICAgICBpbml0
aWFsaXplci5pbml0aWFsaXplKGluc3RhbmNlKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBf
cnVuSW5pdGlhbGl6ZXI6IGZ1bmN0aW9uIChidWNrZXROYW1lLCBjYikgeworICAgICAgdmFyIGlu
aXRpYWxpemVyc0J5TmFtZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLmNvbnN0
cnVjdG9yLCBidWNrZXROYW1lKTsKKyAgICAgIHZhciBpbml0aWFsaXplcnMgPSBwcm9wcyhpbml0
aWFsaXplcnNCeU5hbWUpOworICAgICAgdmFyIGdyYXBoID0gbmV3IF9kYWdNYXAuZGVmYXVsdCgp
OworICAgICAgdmFyIGluaXRpYWxpemVyOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlu
aXRpYWxpemVycy5sZW5ndGg7IGkrKykgeworICAgICAgICBpbml0aWFsaXplciA9IGluaXRpYWxp
emVyc0J5TmFtZVtpbml0aWFsaXplcnNbaV1dOworICAgICAgICBncmFwaC5hZGRFZGdlcyhpbml0
aWFsaXplci5uYW1lLCBpbml0aWFsaXplciwgaW5pdGlhbGl6ZXIuYmVmb3JlLCBpbml0aWFsaXpl
ci5hZnRlcik7CisgICAgICB9CisKKyAgICAgIGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRl
eCkgeworICAgICAgICBjYih2ZXJ0ZXgubmFtZSwgdmVydGV4LnZhbHVlKTsKKyAgICAgIH0pOwor
ICAgIH0KKyAgfSk7CisKKyAgRW5naW5lLnJlb3BlbkNsYXNzKHsKKyAgICBpbml0aWFsaXplcnM6
IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksCisgICAgaW5zdGFuY2VJbml0
aWFsaXplcnM6IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksCisKKyAgICAv
KioKKyAgICAgIFRoZSBnb2FsIG9mIGluaXRpYWxpemVycyBzaG91bGQgYmUgdG8gcmVnaXN0ZXIg
ZGVwZW5kZW5jaWVzIGFuZCBpbmplY3Rpb25zLgorICAgICAgVGhpcyBwaGFzZSBydW5zIG9uY2Uu
IEJlY2F1c2UgdGhlc2UgaW5pdGlhbGl6ZXJzIG1heSBsb2FkIGNvZGUsIHRoZXkgYXJlCisgICAg
ICBhbGxvd2VkIHRvIGRlZmVyIGFwcGxpY2F0aW9uIHJlYWRpbmVzcyBhbmQgYWR2YW5jZSBpdC4g
SWYgeW91IG5lZWQgdG8gYWNjZXNzCisgICAgICB0aGUgY29udGFpbmVyIG9yIHN0b3JlIHlvdSBz
aG91bGQgdXNlIGFuIEluc3RhbmNlSW5pdGlhbGl6ZXIgdGhhdCB3aWxsIGJlIHJ1bgorICAgICAg
YWZ0ZXIgYWxsIGluaXRpYWxpemVycyBhbmQgdGhlcmVmb3JlIGFmdGVyIGFsbCBjb2RlIGlzIGxv
YWRlZCBhbmQgdGhlIGFwcCBpcworICAgICAgcmVhZHkuCisgICAgICAgSW5pdGlhbGl6ZXIgcmVj
ZWl2ZXMgYW4gb2JqZWN0IHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAg
ICBgbmFtZWAsIGBiZWZvcmVgLCBgYWZ0ZXJgLCBgaW5pdGlhbGl6ZWAuIFRoZSBvbmx5IHJlcXVp
cmVkIGF0dHJpYnV0ZSBpcworICAgICAgYGluaXRpYWxpemVgLCBhbGwgb3RoZXJzIGFyZSBvcHRp
b25hbC4KKyAgICAgICAqIGBuYW1lYCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdW5kZXIgd2hpY2gg
bmFtZSB0aGUgaW5pdGlhbGl6ZXIgaXMgcmVnaXN0ZXJlZC4KKyAgICAgIFRoaXMgbXVzdCBiZSBh
IHVuaXF1ZSBuYW1lLCBhcyB0cnlpbmcgdG8gcmVnaXN0ZXIgdHdvIGluaXRpYWxpemVycyB3aXRo
IHRoZQorICAgICAgc2FtZSBuYW1lIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAg
ICAgbmFtZTogJ25hbWVkSW5pdGlhbGl6ZXInLAorICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rp
b24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICBFbWJlci5kZWJ1ZygnUnVubmluZyBuYW1lZElu
aXRpYWxpemVyIScpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgICog
YGJlZm9yZWAgYW5kIGBhZnRlcmAgYXJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBpbml0aWFs
aXplciBpcyByYW4gcHJpb3IKKyAgICAgIG9yIGFmdGVyIHRoZSBvbmUgaWRlbnRpZmllZCBieSB0
aGUgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIGEgc2luZ2xlIHN0cmluZworICAgICAgb3IgYW4g
YXJyYXkgb2Ygc3RyaW5ncywgcmVmZXJlbmNpbmcgdGhlIGBuYW1lYCBvZiBvdGhlciBpbml0aWFs
aXplcnMuCisgICAgICAgQW4gZXhhbXBsZSBvZiBvcmRlcmluZyBpbml0aWFsaXplcnMsIHdlIGNy
ZWF0ZSBhbiBpbml0aWFsaXplciBuYW1lZCBgZmlyc3RgOgorICAgICAgIGBgYGphdmFzY3JpcHQK
KyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgICAgbmFtZTogJ2Zp
cnN0JywKKyAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7CisgICAg
ICAgICAgRW1iZXIuZGVidWcoJ0ZpcnN0IGluaXRpYWxpemVyIScpOworICAgICAgICB9CisgICAg
ICB9KTsKKyAgICAgICAvLyBERUJVRzogRmlyc3QgaW5pdGlhbGl6ZXIhCisgICAgICBgYGAKKyAg
ICAgICBXZSBhZGQgYW5vdGhlciBpbml0aWFsaXplciBuYW1lZCBgc2Vjb25kYCwgc3BlY2lmeWlu
ZyB0aGF0IGl0IHNob3VsZCBydW4KKyAgICAgIGFmdGVyIHRoZSBpbml0aWFsaXplciBuYW1lZCBg
Zmlyc3RgOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLkFwcGxpY2F0aW9uLmlu
aXRpYWxpemVyKHsKKyAgICAgICAgbmFtZTogJ3NlY29uZCcsCisgICAgICAgIGFmdGVyOiAnZmly
c3QnLAorICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAg
ICAgICBFbWJlci5kZWJ1ZygnU2Vjb25kIGluaXRpYWxpemVyIScpOworICAgICAgICB9CisgICAg
ICB9KTsKKyAgICAgICAvLyBERUJVRzogRmlyc3QgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJV
RzogU2Vjb25kIGluaXRpYWxpemVyIQorICAgICAgYGBgCisgICAgICAgQWZ0ZXJ3YXJkcyB3ZSBh
ZGQgYSBmdXJ0aGVyIGluaXRpYWxpemVyIG5hbWVkIGBwcmVgLCB0aGlzIHRpbWUgc3BlY2lmeWlu
ZworICAgICAgdGhhdCBpdCBzaG91bGQgcnVuIGJlZm9yZSB0aGUgaW5pdGlhbGl6ZXIgbmFtZWQg
YGZpcnN0YDoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5p
bml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdwcmUnLAorICAgICAgICBiZWZvcmU6ICdmaXJz
dCcsCisgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikgeworICAgICAg
ICAgIEVtYmVyLmRlYnVnKCdQcmUgaW5pdGlhbGl6ZXIhJyk7CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgIC8vIERFQlVHOiBQcmUgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogRmly
c3QgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogU2Vjb25kIGluaXRpYWxpemVyIQorICAg
ICAgYGBgCisgICAgICAgRmluYWxseSB3ZSBhZGQgYW4gaW5pdGlhbGl6ZXIgbmFtZWQgYHBvc3Rg
LCBzcGVjaWZ5aW5nIGl0IHNob3VsZCBydW4gYWZ0ZXIKKyAgICAgIGJvdGggdGhlIGBmaXJzdGAg
YW5kIHRoZSBgc2Vjb25kYCBpbml0aWFsaXplcnM6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgRW1iZXIuQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgICAgICBuYW1lOiAncG9zdCcs
CisgICAgICAgIGFmdGVyOiBbJ2ZpcnN0JywgJ3NlY29uZCddLAorICAgICAgICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICBFbWJlci5kZWJ1ZygnUG9zdCBp
bml0aWFsaXplciEnKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgLy8gREVCVUc6IFBy
ZSBpbml0aWFsaXplciEKKyAgICAgIC8vIERFQlVHOiBGaXJzdCBpbml0aWFsaXplciEKKyAgICAg
IC8vIERFQlVHOiBTZWNvbmQgaW5pdGlhbGl6ZXIhCisgICAgICAvLyBERUJVRzogUG9zdCBpbml0
aWFsaXplciEKKyAgICAgIGBgYAorICAgICAgICogYGluaXRpYWxpemVgIGlzIGEgY2FsbGJhY2sg
ZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBvbmUgYXJndW1lbnQsCisgICAgICAgIGBhcHBsaWNhdGlv
bmAsIG9uIHdoaWNoIHlvdSBjYW4gb3BlcmF0ZS4KKyAgICAgICBFeGFtcGxlIG9mIHVzaW5nIGBh
cHBsaWNhdGlvbmAgdG8gcmVnaXN0ZXIgYW4gYWRhcHRlcjoKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdh
cGktYWRhcHRlcicsCisgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikg
eworICAgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhcGktYWRhcHRlcjptYWluJywgQXBp
QWRhcHRlcik7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhv
ZCBpbml0aWFsaXplcgorICAgICAgQHBhcmFtIGluaXRpYWxpemVyIHtPYmplY3R9CisgICAgICBA
cHVibGljCisgICAgKi8KKworICAgIGluaXRpYWxpemVyOiBidWlsZEluaXRpYWxpemVyTWV0aG9k
KCdpbml0aWFsaXplcnMnLCAnaW5pdGlhbGl6ZXInKSwKKworICAgIC8qKgorICAgICAgSW5zdGFu
Y2UgaW5pdGlhbGl6ZXJzIHJ1biBhZnRlciBhbGwgaW5pdGlhbGl6ZXJzIGhhdmUgcnVuLiBCZWNh
dXNlCisgICAgICBpbnN0YW5jZSBpbml0aWFsaXplcnMgcnVuIGFmdGVyIHRoZSBhcHAgaXMgZnVs
bHkgc2V0IHVwLiBXZSBoYXZlIGFjY2VzcworICAgICAgdG8gdGhlIHN0b3JlLCBjb250YWluZXIs
IGFuZCBvdGhlciBpdGVtcy4gSG93ZXZlciwgdGhlc2UgaW5pdGlhbGl6ZXJzIHJ1bgorICAgICAg
YWZ0ZXIgY29kZSBoYXMgbG9hZGVkIGFuZCBhcmUgbm90IGFsbG93ZWQgdG8gZGVmZXIgcmVhZGlu
ZXNzLgorICAgICAgIEluc3RhbmNlIGluaXRpYWxpemVyIHJlY2VpdmVzIGFuIG9iamVjdCB3aGlj
aCBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgYG5hbWVgLCBgYmVmb3JlYCwg
YGFmdGVyYCwgYGluaXRpYWxpemVgLiBUaGUgb25seSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMKKyAg
ICAgIGBpbml0aWFsaXplYCwgYWxsIG90aGVycyBhcmUgb3B0aW9uYWwuCisgICAgICAgKiBgbmFt
ZWAgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHVuZGVyIHdoaWNoIG5hbWUgdGhlIGluc3RhbmNlSW5p
dGlhbGl6ZXIgaXMKKyAgICAgIHJlZ2lzdGVyZWQuIFRoaXMgbXVzdCBiZSBhIHVuaXF1ZSBuYW1l
LCBhcyB0cnlpbmcgdG8gcmVnaXN0ZXIgdHdvCisgICAgICBpbnN0YW5jZUluaXRpYWxpemVyIHdp
dGggdGhlIHNhbWUgbmFtZSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNhdGlvbi5pbnN0YW5jZUluaXRpYWxpemVyKHsKKyAg
ICAgICAgbmFtZTogJ25hbWVkaW5zdGFuY2VJbml0aWFsaXplcicsCisgICAgICAgICBpbml0aWFs
aXplOiBmdW5jdGlvbihhcHBsaWNhdGlvbikgeworICAgICAgICAgIEVtYmVyLmRlYnVnKCdSdW5u
aW5nIG5hbWVkSW5pdGlhbGl6ZXIhJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBg
CisgICAgICAgKiBgYmVmb3JlYCBhbmQgYGFmdGVyYCBhcmUgdXNlZCB0byBlbnN1cmUgdGhhdCB0
aGlzIGluaXRpYWxpemVyIGlzIHJhbiBwcmlvcgorICAgICAgb3IgYWZ0ZXIgdGhlIG9uZSBpZGVu
dGlmaWVkIGJ5IHRoZSB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgYSBzaW5nbGUgc3RyaW5nCisg
ICAgICBvciBhbiBhcnJheSBvZiBzdHJpbmdzLCByZWZlcmVuY2luZyB0aGUgYG5hbWVgIG9mIG90
aGVyIGluaXRpYWxpemVycy4KKyAgICAgICAqIFNlZSBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFs
aXplciBmb3IgZGlzY3Vzc2lvbiBvbiB0aGUgdXNhZ2Ugb2YgYmVmb3JlCisgICAgICBhbmQgYWZ0
ZXIuCisgICAgICAgRXhhbXBsZSBpbnN0YW5jZUluaXRpYWxpemVyIHRvIHByZWxvYWQgZGF0YSBp
bnRvIHRoZSBzdG9yZS4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5BcHBsaWNh
dGlvbi5pbml0aWFsaXplcih7CisgICAgICAgIG5hbWU6ICdwcmVsb2FkLWRhdGEnLAorICAgICAg
ICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXBwbGljYXRpb24pIHsKKyAgICAgICAgICB2YXIgdXNl
ckNvbmZpZywgdXNlckNvbmZpZ0VuY29kZWQsIHN0b3JlOworICAgICAgICAgIC8vIFdlIGhhdmUg
YSBIVE1MIGVzY2FwZWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdXNlcidzIGJhc2ljCisg
ICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgc2VydmVyIHNpZGUgYW5kIHN0b3Jl
ZCBpbiB0aGUgRE9NIG9mIHRoZSBtYWluCisgICAgICAgICAgLy8gaW5kZXguaHRtbCBmaWxlLiBU
aGlzIGFsbG93cyB0aGUgYXBwIHRvIGhhdmUgYWNjZXNzIHRvIGEgc2V0IG9mIGRhdGEKKyAgICAg
ICAgICAvLyB3aXRob3V0IG1ha2luZyBhbnkgYWRkaXRpb25hbCByZW1vdGUgY2FsbHMuIEdvb2Qg
Zm9yIGJhc2ljIGRhdGEgdGhhdCBpcworICAgICAgICAgIC8vIG5lZWRlZCBmb3IgaW1tZWRpYXRl
IHJlbmRlcmluZyBvZiB0aGUgcGFnZS4gS2VlcCBpbiBtaW5kLCB0aGlzIGRhdGEsCisgICAgICAg
ICAgLy8gbGlrZSBhbGwgbG9jYWwgbW9kZWxzIGFuZCBkYXRhIGNhbiBiZSBtYW5pcHVsYXRlZCBi
eSB0aGUgdXNlciwgc28gaXQKKyAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9u
IGZvciBzZWN1cml0eSBvciBhdXRob3JpemF0aW9uLgorICAgICAgICAgIC8vCisgICAgICAgICAg
Ly8gR3JhYiB0aGUgZW5jb2RlZCBkYXRhIGZyb20gdGhlIG1ldGEgdGFnCisgICAgICAgICAgdXNl
ckNvbmZpZ0VuY29kZWQgPSBFbWJlci4kKCdoZWFkIG1ldGFbbmFtZT1hcHAtdXNlci1jb25maWdd
JykuYXR0cignY29udGVudCcpOworICAgICAgICAgIC8vIFVuZXNjYXBlIHRoZSB0ZXh0LCB0aGVu
IHBhcnNlIHRoZSByZXN1bHRpbmcgSlNPTiBpbnRvIGEgcmVhbCBvYmplY3QKKyAgICAgICAgICB1
c2VyQ29uZmlnID0gSlNPTi5wYXJzZSh1bmVzY2FwZSh1c2VyQ29uZmlnRW5jb2RlZCkpOworICAg
ICAgICAgIC8vIExvb2t1cCB0aGUgc3RvcmUKKyAgICAgICAgICBzdG9yZSA9IGFwcGxpY2F0aW9u
Lmxvb2t1cCgnc2VydmljZTpzdG9yZScpOworICAgICAgICAgIC8vIFB1c2ggdGhlIGVuY29kZWQg
SlNPTiBpbnRvIHRoZSBzdG9yZQorICAgICAgICAgIHN0b3JlLnB1c2hQYXlsb2FkKHVzZXJDb25m
aWcpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgaW5z
dGFuY2VJbml0aWFsaXplcgorICAgICAgQHBhcmFtIGluc3RhbmNlSW5pdGlhbGl6ZXIKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGluc3RhbmNlSW5pdGlhbGl6ZXI6IGJ1aWxkSW5pdGlhbGl6
ZXJNZXRob2QoJ2luc3RhbmNlSW5pdGlhbGl6ZXJzJywgJ2luc3RhbmNlIGluaXRpYWxpemVyJyks
CisKKyAgICAvKioKKyAgICAgIFRoaXMgY3JlYXRlcyBhIHJlZ2lzdHJ5IHdpdGggdGhlIGRlZmF1
bHQgRW1iZXIgbmFtaW5nIGNvbnZlbnRpb25zLgorICAgICAgIEl0IGFsc28gY29uZmlndXJlcyB0
aGUgcmVnaXN0cnk6CisgICAgICAgKiByZWdpc3RlcmVkIHZpZXdzIGFyZSBjcmVhdGVkIGV2ZXJ5
IHRpbWUgdGhleSBhcmUgbG9va2VkIHVwICh0aGV5IGFyZQorICAgICAgICBub3Qgc2luZ2xldG9u
cykKKyAgICAgICogcmVnaXN0ZXJlZCB0ZW1wbGF0ZXMgYXJlIG5vdCBmYWN0b3JpZXM7IHRoZSBy
ZWdpc3RlcmVkIHZhbHVlIGlzCisgICAgICAgIHJldHVybmVkIGRpcmVjdGx5LgorICAgICAgKiB0
aGUgcm91dGVyIHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBpdHMgYG5hbWVzcGFjZWAgcHJv
cGVydHkKKyAgICAgICogYWxsIGNvbnRyb2xsZXJzIHJlY2VpdmUgdGhlIHJvdXRlciBhcyB0aGVp
ciBgdGFyZ2V0YCBhbmQgYGNvbnRyb2xsZXJzYAorICAgICAgICBwcm9wZXJ0aWVzCisgICAgICAq
IGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVpciBgbmFtZXNw
YWNlYCBwcm9wZXJ0eQorICAgICAgKiB0aGUgYXBwbGljYXRpb24gdmlldyByZWNlaXZlcyB0aGUg
YXBwbGljYXRpb24gY29udHJvbGxlciBhcyBpdHMKKyAgICAgICAgYGNvbnRyb2xsZXJgIHByb3Bl
cnR5CisgICAgICAqIHRoZSBhcHBsaWNhdGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlv
biB0ZW1wbGF0ZSBhcyBpdHMKKyAgICAgICAgYGRlZmF1bHRUZW1wbGF0ZWAgcHJvcGVydHkKKyAg
ICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBidWlsZFJlZ2lzdHJ5CisgICAgICBAc3RhdGlj
CisgICAgICBAcGFyYW0ge0VtYmVyLkFwcGxpY2F0aW9ufSBuYW1lc3BhY2UgdGhlIGFwcGxpY2F0
aW9uIGZvciB3aGljaCB0bworICAgICAgICBidWlsZCB0aGUgcmVnaXN0cnkKKyAgICAgIEByZXR1
cm4ge0VtYmVyLlJlZ2lzdHJ5fSB0aGUgYnVpbHQgcmVnaXN0cnkKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGJ1aWxkUmVnaXN0cnk6IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHsKKyAgICAgIHZh
ciByZWdpc3RyeSA9IG5ldyBfY29udGFpbmVyUmVnaXN0cnkuZGVmYXVsdCh7CisgICAgICAgIHJl
c29sdmVyOiByZXNvbHZlckZvcihuYW1lc3BhY2UpCisgICAgICB9KTsKKworICAgICAgcmVnaXN0
cnkuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworCisgICAgICByZXR1cm4gcmVn
aXN0cnk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBh
bHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKKyAgICAgICAgQGRlcHJl
Y2F0ZWQgVXNlICdSZXNvbHZlcicgaW5zdGVhZAorICAgICAgQHByb3BlcnR5IHJlc29sdmVyCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlcjogbnVsbCwKKworICAgIC8qKgorICAg
ICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1
bHRSZXNvbHZlcmAKKyAgICAgICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIFJlc29sdmVyOiBudWxsCisgIH0pOworCisgIC8qKgorICAgIFRoaXMgZnVuY3Rp
b24gZGVmaW5lcyB0aGUgZGVmYXVsdCBsb29rdXAgcnVsZXMgZm9yIGNvbnRhaW5lciBsb29rdXBz
OgorICAKKyAgICAqIHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJlci5URU1QTEFURVNg
CisgICAgKiBvdGhlciBuYW1lcyBhcmUgbG9va2VkIHVwIG9uIHRoZSBhcHBsaWNhdGlvbiBhZnRl
ciBjbGFzc2lmeWluZyB0aGUgbmFtZS4KKyAgICAgIEZvciBleGFtcGxlLCBgY29udHJvbGxlcjpw
b3N0YCBsb29rcyB1cCBgQXBwLlBvc3RDb250cm9sbGVyYCBieSBkZWZhdWx0LgorICAgICogaWYg
dGhlIGRlZmF1bHQgbG9va3VwIGZhaWxzLCBsb29rIGZvciByZWdpc3RlcmVkIGNsYXNzZXMgb24g
dGhlIGNvbnRhaW5lcgorICAKKyAgICBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gcmVn
aXN0ZXIgZGVmYXVsdCBpbmplY3Rpb25zIGluIHRoZSBjb250YWluZXIKKyAgICB0aGF0IGNvdWxk
IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG5vcm1hbCBuYW1pbmcgY29udmVudGlvbi4KKyAgCisgICAg
QHByaXZhdGUKKyAgICBAbWV0aG9kIHJlc29sdmVyRm9yCisgICAgQHBhcmFtIHtFbWJlci5OYW1l
c3BhY2V9IG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIGxvb2sgZm9yIGNsYXNzZXMKKyAgICBA
cmV0dXJuIHsqfSB0aGUgcmVzb2x2ZWQgdmFsdWUgZm9yIGEgZ2l2ZW4gbG9va3VwCisgICovCisg
IGZ1bmN0aW9uIHJlc29sdmVyRm9yKG5hbWVzcGFjZSkgeworICAgIHZhciBSZXNvbHZlckNsYXNz
ID0gbmFtZXNwYWNlLmdldCgnUmVzb2x2ZXInKSB8fCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbVJl
c29sdmVyLmRlZmF1bHQ7CisKKyAgICByZXR1cm4gUmVzb2x2ZXJDbGFzcy5jcmVhdGUoeworICAg
ICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxk
SW5pdGlhbGl6ZXJNZXRob2QoYnVja2V0TmFtZSwgaHVtYW5OYW1lKSB7CisgICAgcmV0dXJuIGZ1
bmN0aW9uIChpbml0aWFsaXplcikgeworICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5p
dGlhbGl6ZXIgYmVpbmcgYWRkZWQgdG8gYSBzdWJjbGFzcywgd2UgYXJlIGdvaW5nIHRvIHJlb3Bl
biB0aGUgY2xhc3MKKyAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbmV3IGBpbml0aWFs
aXplcnNgIG9iamVjdCwgd2hpY2ggZXh0ZW5kcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MnIHVzaW5n
CisgICAgICAvLyBwcm90b3R5cGFsIGluaGVyaXRhbmNlLiBXaXRob3V0IHRoaXMsIGF0dGVtcHRp
bmcgdG8gYWRkIGluaXRpYWxpemVycyB0byB0aGUgc3ViY2xhc3Mgd291bGQKKyAgICAgIC8vIHBv
bGx1dGUgdGhlIHBhcmVudCBjbGFzcyBhcyB3ZWxsIGFzIG90aGVyIHN1YmNsYXNzZXMuCisgICAg
ICBpZiAodGhpcy5zdXBlcmNsYXNzW2J1Y2tldE5hbWVdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5z
dXBlcmNsYXNzW2J1Y2tldE5hbWVdID09PSB0aGlzW2J1Y2tldE5hbWVdKSB7CisgICAgICAgIHZh
ciBhdHRycyA9IHt9OworICAgICAgICBhdHRyc1tidWNrZXROYW1lXSA9IE9iamVjdC5jcmVhdGUo
dGhpc1tidWNrZXROYW1lXSk7CisgICAgICAgIHRoaXMucmVvcGVuQ2xhc3MoYXR0cnMpOworICAg
ICAgfQorCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlICcgKyBodW1hbk5hbWUg
KyAnIFwnJyArIGluaXRpYWxpemVyLm5hbWUgKyAnXCcgaGFzIGFscmVhZHkgYmVlbiByZWdpc3Rl
cmVkJywgIXRoaXNbYnVja2V0TmFtZV1baW5pdGlhbGl6ZXIubmFtZV0pOworICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0FuICcgKyBodW1hbk5hbWUgKyAnIGNhbm5vdCBiZSByZWdpc3Rl
cmVkIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbicsIF9lbWJlck1ldGFsVXRpbHMuY2Fu
SW52b2tlKGluaXRpYWxpemVyLCAnaW5pdGlhbGl6ZScpKTsKKyAgICAgIF9lbWJlck1ldGFsRGVi
dWcuYXNzZXJ0KCdBbiAnICsgaHVtYW5OYW1lICsgJyBjYW5ub3QgYmUgcmVnaXN0ZXJlZCB3aXRo
b3V0IGEgbmFtZSBwcm9wZXJ0eScsIGluaXRpYWxpemVyLm5hbWUgIT09IHVuZGVmaW5lZCk7CisK
KyAgICAgIHRoaXNbYnVja2V0TmFtZV1baW5pdGlhbGl6ZXIubmFtZV0gPSBpbml0aWFsaXplcjsK
KyAgICB9OworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW5naW5lOworfSk7CitlbmlmZWQo
J2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9yZXNvbHZlcicsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vc3RyaW5nJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50
aW1lL3N5c3RlbS9uYW1lc3BhY2UnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycycsICdlbWJlci1h
cHBsaWNhdGlvbi91dGlscy92YWxpZGF0ZS10eXBlJywgJ2VtYmVyLW1ldGFsL2RpY3Rpb25hcnkn
LCAnZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVfcmVnaXN0cnknXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJSdW50aW1l
U3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1lU3lz
dGVtTmFtZXNwYWNlLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnMsIF9lbWJlckFwcGxpY2F0aW9uVXRp
bHNWYWxpZGF0ZVR5cGUsIF9lbWJlck1ldGFsRGljdGlvbmFyeSwgX2VtYmVySHRtbGJhcnNUZW1w
bGF0ZV9yZWdpc3RyeSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVt
YmVyLWFwcGxpY2F0aW9uCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBSZXNvbHZl
ciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qCisg
ICAgICBUaGlzIHdpbGwgYmUgc2V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpbnN0YW5jZSB3aGVuIGl0
IGlzCisgICAgICBjcmVhdGVkLgorICAgICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKKyAgICAqLwor
ICAgIG5hbWVzcGFjZTogbnVsbCwKKyAgICBub3JtYWxpemU6IG51bGwsIC8vIHJlcXVpcmVkCisg
ICAgcmVzb2x2ZTogbnVsbCwgLy8gcmVxdWlyZWQKKyAgICBwYXJzZU5hbWU6IG51bGwsIC8vIHJl
cXVpcmVkCisgICAgbG9va3VwRGVzY3JpcHRpb246IG51bGwsIC8vIHJlcXVpcmVkCisgICAgbWFr
ZVRvU3RyaW5nOiBudWxsLCAvLyByZXF1aXJlZAorICAgIHJlc29sdmVPdGhlcjogbnVsbCwgLy8g
cmVxdWlyZWQKKyAgICBfbG9nTG9va3VwOiBudWxsIC8vIHJlcXVpcmVkCisgIH0pOworCisgIGV4
cG9ydHMuUmVzb2x2ZXIgPSBSZXNvbHZlcjsKKyAgLyoqCisgICAgVGhlIERlZmF1bHRSZXNvbHZl
ciBkZWZpbmVzIHRoZSBkZWZhdWx0IGxvb2t1cCBydWxlcyB0byByZXNvbHZlCisgICAgY29udGFp
bmVyIGxvb2t1cHMgYmVmb3JlIGNvbnN1bHRpbmcgdGhlIGNvbnRhaW5lciBmb3IgcmVnaXN0ZXJl
ZAorICAgIGl0ZW1zOgorICAKKyAgICAqIHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJl
ci5URU1QTEFURVNgCisgICAgKiBvdGhlciBuYW1lcyBhcmUgbG9va2VkIHVwIG9uIHRoZSBhcHBs
aWNhdGlvbiBhZnRlciBjb252ZXJ0aW5nCisgICAgICB0aGUgbmFtZS4gRm9yIGV4YW1wbGUsIGBj
b250cm9sbGVyOnBvc3RgIGxvb2tzIHVwCisgICAgICBgQXBwLlBvc3RDb250cm9sbGVyYCBieSBk
ZWZhdWx0LgorICAgICogdGhlcmUgYXJlIHNvbWUgbnVhbmNlcyAoc2VlIGV4YW1wbGVzIGJlbG93
KQorICAKKyAgICAjIyMgSG93IFJlc29sdmluZyBXb3JrcworICAKKyAgICBUaGUgY29udGFpbmVy
IGNhbGxzIHRoaXMgb2JqZWN0J3MgYHJlc29sdmVgIG1ldGhvZCB3aXRoIHRoZQorICAgIGBmdWxs
TmFtZWAgYXJndW1lbnQuCisgIAorICAgIEl0IGZpcnN0IHBhcnNlcyB0aGUgZnVsbE5hbWUgaW50
byBhbiBvYmplY3QgdXNpbmcgYHBhcnNlTmFtZWAuCisgIAorICAgIFRoZW4gaXQgY2hlY2tzIGZv
ciB0aGUgcHJlc2VuY2Ugb2YgYSB0eXBlLXNwZWNpZmljIGluc3RhbmNlCisgICAgbWV0aG9kIG9m
IHRoZSBmb3JtIGByZXNvbHZlW1R5cGVdYCBhbmQgY2FsbHMgaXQgaWYgaXQgZXhpc3RzLgorICAg
IEZvciBleGFtcGxlIGlmIGl0IHdhcyByZXNvbHZpbmcgJ3RlbXBsYXRlOnBvc3QnLCBpdCB3b3Vs
ZCBjYWxsCisgICAgdGhlIGByZXNvbHZlVGVtcGxhdGVgIG1ldGhvZC4KKyAgCisgICAgSXRzIGxh
c3QgcmVzb3J0IGlzIHRvIGNhbGwgdGhlIGByZXNvbHZlT3RoZXJgIG1ldGhvZC4KKyAgCisgICAg
VGhlIG1ldGhvZHMgb2YgdGhpcyBvYmplY3QgYXJlIGRlc2lnbmVkIHRvIGJlIGVhc3kgdG8gb3Zl
cnJpZGUKKyAgICBpbiBhIHN1YmNsYXNzLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVuaGFuY2Ug
aG93IGEgdGVtcGxhdGUKKyAgICBpcyByZXNvbHZlZCBsaWtlIHNvOgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKKyAgICAgIFJlc29s
dmVyOiBFbWJlci5EZWZhdWx0UmVzb2x2ZXIuZXh0ZW5kKHsKKyAgICAgICAgcmVzb2x2ZVRlbXBs
YXRlOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7CisgICAgICAgICAgdmFyIHJlc29sdmVkVGVtcGxh
dGUgPSB0aGlzLl9zdXBlcihwYXJzZWROYW1lKTsKKyAgICAgICAgICBpZiAocmVzb2x2ZWRUZW1w
bGF0ZSkgeyByZXR1cm4gcmVzb2x2ZWRUZW1wbGF0ZTsgfQorICAgICAgICAgIHJldHVybiBFbWJl
ci5URU1QTEFURVNbJ25vdF9mb3VuZCddOworICAgICAgICB9CisgICAgICB9KQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBTb21lIGV4YW1wbGVzIG9mIGhvdyBuYW1lcyBhcmUgcmVzb2x2ZWQ6
CisgIAorICAgIGBgYAorICAgICd0ZW1wbGF0ZTpwb3N0JyAgICAgICAgICAgLy89PiBFbWJlci5U
RU1QTEFURVNbJ3Bvc3QnXQorICAgICd0ZW1wbGF0ZTpwb3N0cy9ieWxpbmUnICAgLy89PiBFbWJl
ci5URU1QTEFURVNbJ3Bvc3RzL2J5bGluZSddCisgICAgJ3RlbXBsYXRlOnBvc3RzLmJ5bGluZScg
ICAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KKyAgICAndGVtcGxhdGU6Ymxv
Z1Bvc3QnICAgICAgIC8vPT4gRW1iZXIuVEVNUExBVEVTWydibG9nUG9zdCddCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyAgIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyAgIEVtYmVyLlRFTVBMQVRFU1snYmxvZ19wb3N0J10KKyAgICAnY29udHJvbGxlcjpwb3N0
JyAgICAgICAgIC8vPT4gQXBwLlBvc3RDb250cm9sbGVyCisgICAgJ2NvbnRyb2xsZXI6cG9zdHMu
aW5kZXgnICAvLz0+IEFwcC5Qb3N0c0luZGV4Q29udHJvbGxlcgorICAgICdjb250cm9sbGVyOmJs
b2cvcG9zdCcgICAgLy89PiBCbG9nLlBvc3RDb250cm9sbGVyCisgICAgJ2NvbnRyb2xsZXI6YmFz
aWMnICAgICAgICAvLz0+IEVtYmVyLkNvbnRyb2xsZXIKKyAgICAncm91dGU6cG9zdCcgICAgICAg
ICAgICAgIC8vPT4gQXBwLlBvc3RSb3V0ZQorICAgICdyb3V0ZTpwb3N0cy5pbmRleCcgICAgICAg
Ly89PiBBcHAuUG9zdHNJbmRleFJvdXRlCisgICAgJ3JvdXRlOmJsb2cvcG9zdCcgICAgICAgICAv
Lz0+IEJsb2cuUG9zdFJvdXRlCisgICAgJ3JvdXRlOmJhc2ljJyAgICAgICAgICAgICAvLz0+IEVt
YmVyLlJvdXRlCisgICAgJ3ZpZXc6cG9zdCcgICAgICAgICAgICAgICAvLz0+IEFwcC5Qb3N0Vmll
dworICAgICd2aWV3OnBvc3RzLmluZGV4JyAgICAgICAgLy89PiBBcHAuUG9zdHNJbmRleFZpZXcK
KyAgICAndmlldzpibG9nL3Bvc3QnICAgICAgICAgIC8vPT4gQmxvZy5Qb3N0VmlldworICAgICd2
aWV3OmJhc2ljJyAgICAgICAgICAgICAgLy89PiBFbWJlci5WaWV3CisgICAgJ2Zvbzpwb3N0JyAg
ICAgICAgICAgICAgICAvLz0+IEFwcC5Qb3N0Rm9vCisgICAgJ21vZGVsOnBvc3QnICAgICAgICAg
ICAgICAvLz0+IEFwcC5Qb3N0CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBEZWZhdWx0UmVzb2x2
ZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAg
QHB1YmxpYworICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1P
YmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qKgorICAgICAgVGhpcyB3aWxsIGJlIHNldCB0
byB0aGUgQXBwbGljYXRpb24gaW5zdGFuY2Ugd2hlbiBpdCBpcworICAgICAgY3JlYXRlZC4KKyAg
ICAgICBAcHJvcGVydHkgbmFtZXNwYWNlCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBuYW1l
c3BhY2U6IG51bGwsCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9wYXJz
ZU5hbWVDYWNoZSA9IF9lbWJlck1ldGFsRGljdGlvbmFyeS5kZWZhdWx0KG51bGwpOworICAgIH0s
CisgICAgbm9ybWFsaXplOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBfZnVsbE5h
bWUkc3BsaXQgPSBmdWxsTmFtZS5zcGxpdCgnOicsIDIpOworCisgICAgICB2YXIgdHlwZSA9IF9m
dWxsTmFtZSRzcGxpdFswXTsKKyAgICAgIHZhciBuYW1lID0gX2Z1bGxOYW1lJHNwbGl0WzFdOwor
CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVHJpZWQgdG8gbm9ybWFsaXplIGEgY29u
dGFpbmVyIG5hbWUgd2l0aG91dCBhIGNvbG9uICg6KSBpbiBpdC4gJyArICdZb3UgcHJvYmFibHkg
dHJpZWQgdG8gbG9va3VwIGEgbmFtZSB0aGF0IGRpZCBub3QgY29udGFpbiBhIHR5cGUsICcgKyAn
YSBjb2xvbiwgYW5kIGEgbmFtZS4gQSBwcm9wZXIgbG9va3VwIG5hbWUgd291bGQgYmUgYHZpZXc6
cG9zdGAuJywgZnVsbE5hbWUuc3BsaXQoJzonKS5sZW5ndGggPT09IDIpOworCisgICAgICBpZiAo
dHlwZSAhPT0gJ3RlbXBsYXRlJykgeworICAgICAgICB2YXIgcmVzdWx0ID0gbmFtZTsKKworICAg
ICAgICBpZiAocmVzdWx0LmluZGV4T2YoJy4nKSA+IC0xKSB7CisgICAgICAgICAgcmVzdWx0ID0g
cmVzdWx0LnJlcGxhY2UoL1wuKC4pL2csIGZ1bmN0aW9uIChtKSB7CisgICAgICAgICAgICByZXR1
cm4gbS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJ18nKSA+IC0xKSB7CisgICAgICAgICAgcmVzdWx0
ID0gcmVzdWx0LnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24gKG0pIHsKKyAgICAgICAgICAgIHJl
dHVybiBtLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgIH0pOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHsKKyAgICAgICAgICByZXN1
bHQgPSByZXN1bHQucmVwbGFjZSgvLSguKS9nLCBmdW5jdGlvbiAobSkgeworICAgICAgICAgICAg
cmV0dXJuIG0uY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgfSk7CisgICAgICAg
IH0KKworICAgICAgICByZXR1cm4gdHlwZSArICc6JyArIHJlc3VsdDsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdmlhIHRoZSBjb250YWluZXIncyByZXNvbHZlciBt
ZXRob2QuCisgICAgICBJdCBwYXJzZXMgdGhlIHByb3ZpZGVkIGBmdWxsTmFtZWAgYW5kIHRoZW4g
bG9va3MgdXAgYW5kCisgICAgICByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBvciBj
bGFzcy4KKyAgICAgICBAbWV0aG9kIHJlc29sdmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxs
TmFtZSB0aGUgbG9va3VwIHN0cmluZworICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcmVzb2x2
ZWQgZmFjdG9yeQorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVzb2x2ZTogZnVuY3Rpb24g
KGZ1bGxOYW1lKSB7CisgICAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxO
YW1lKTsKKyAgICAgIHZhciByZXNvbHZlTWV0aG9kTmFtZSA9IHBhcnNlZE5hbWUucmVzb2x2ZU1l
dGhvZE5hbWU7CisgICAgICB2YXIgcmVzb2x2ZWQ7CisKKyAgICAgIGlmICh0aGlzW3Jlc29sdmVN
ZXRob2ROYW1lXSkgeworICAgICAgICByZXNvbHZlZCA9IHRoaXNbcmVzb2x2ZU1ldGhvZE5hbWVd
KHBhcnNlZE5hbWUpOworICAgICAgfQorCisgICAgICByZXNvbHZlZCA9IHJlc29sdmVkIHx8IHRo
aXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOworCisgICAgICBpZiAocGFyc2VkTmFtZS5yb290
ICYmIHBhcnNlZE5hbWUucm9vdC5MT0dfUkVTT0xWRVIpIHsKKyAgICAgICAgdGhpcy5fbG9nTG9v
a3VwKHJlc29sdmVkLCBwYXJzZWROYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc29sdmVk
KSB7CisgICAgICAgIF9lbWJlckFwcGxpY2F0aW9uVXRpbHNWYWxpZGF0ZVR5cGUuZGVmYXVsdChy
ZXNvbHZlZCwgcGFyc2VkTmFtZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXNvbHZlZDsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBDb252ZXJ0IHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUg
Zm9ybSAndHlwZTpuYW1lJyB0bworICAgICAgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoZSBw
YXJzZWQgYXNwZWN0cyBvZiB0aGUgbmFtZQorICAgICAgYnJva2VuIG91dC4KKyAgICAgICBAcHJv
dGVjdGVkCisgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUgdGhlIGxvb2t1cCBzdHJpbmcK
KyAgICAgIEBtZXRob2QgcGFyc2VOYW1lCisgICAgICBAcHVibGljCisgICAgKi8KKworICAgIHBh
cnNlTmFtZTogZnVuY3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5fcGFyc2VO
YW1lQ2FjaGVbZnVsbE5hbWVdIHx8ICh0aGlzLl9wYXJzZU5hbWVDYWNoZVtmdWxsTmFtZV0gPSB0
aGlzLl9wYXJzZU5hbWUoZnVsbE5hbWUpKTsKKyAgICB9LAorCisgICAgX3BhcnNlTmFtZTogZnVu
Y3Rpb24gKGZ1bGxOYW1lKSB7CisgICAgICB2YXIgX2Z1bGxOYW1lJHNwbGl0MiA9IGZ1bGxOYW1l
LnNwbGl0KCc6Jyk7CisKKyAgICAgIHZhciB0eXBlID0gX2Z1bGxOYW1lJHNwbGl0MlswXTsKKyAg
ICAgIHZhciBmdWxsTmFtZVdpdGhvdXRUeXBlID0gX2Z1bGxOYW1lJHNwbGl0MlsxXTsKKworICAg
ICAgdmFyIG5hbWUgPSBmdWxsTmFtZVdpdGhvdXRUeXBlOworICAgICAgdmFyIG5hbWVzcGFjZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJyk7CisgICAgICB2
YXIgcm9vdCA9IG5hbWVzcGFjZTsKKyAgICAgIHZhciBsYXN0U2xhc2hJbmRleCA9IG5hbWUubGFz
dEluZGV4T2YoJy8nKTsKKyAgICAgIHZhciBkaXJuYW1lID0gbGFzdFNsYXNoSW5kZXggIT09IC0x
ID8gbmFtZS5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCkgOiBudWxsOworCisgICAgICBpZiAodHlw
ZSAhPT0gJ3RlbXBsYXRlJyAmJiBsYXN0U2xhc2hJbmRleCAhPT0gLTEpIHsKKyAgICAgICAgdmFy
IHBhcnRzID0gbmFtZS5zcGxpdCgnLycpOworICAgICAgICBuYW1lID0gcGFydHNbcGFydHMubGVu
Z3RoIC0gMV07CisgICAgICAgIHZhciBuYW1lc3BhY2VOYW1lID0gX2VtYmVyUnVudGltZVN5c3Rl
bVN0cmluZy5jYXBpdGFsaXplKHBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJykpOworICAgICAg
ICByb290ID0gX2VtYmVyUnVudGltZVN5c3RlbU5hbWVzcGFjZS5kZWZhdWx0LmJ5TmFtZShuYW1l
c3BhY2VOYW1lKTsKKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGFyZSBs
b29raW5nIGZvciBhICcgKyBuYW1lICsgJyAnICsgdHlwZSArICcgaW4gdGhlICcgKyBuYW1lc3Bh
Y2VOYW1lICsgJyBuYW1lc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlIGNvdWxkIG5vdCBiZSBmb3Vu
ZCcsIHJvb3QpOworICAgICAgfQorCisgICAgICB2YXIgcmVzb2x2ZU1ldGhvZE5hbWUgPSBmdWxs
TmFtZVdpdGhvdXRUeXBlID09PSAnbWFpbicgPyAnTWFpbicgOiBfZW1iZXJSdW50aW1lU3lzdGVt
U3RyaW5nLmNsYXNzaWZ5KHR5cGUpOworCisgICAgICBpZiAoIShuYW1lICYmIHR5cGUpKSB7Cisg
ICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZnVsbE5hbWU6IGAnICsgZnVsbE5h
bWUgKyAnYCwgbXVzdCBiZSBvZiB0aGUgZm9ybSBgdHlwZTpuYW1lYCAnKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHsKKyAgICAgICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAorICAgICAgICB0eXBl
OiB0eXBlLAorICAgICAgICBmdWxsTmFtZVdpdGhvdXRUeXBlOiBmdWxsTmFtZVdpdGhvdXRUeXBl
LAorICAgICAgICBkaXJuYW1lOiBkaXJuYW1lLAorICAgICAgICBuYW1lOiBuYW1lLAorICAgICAg
ICByb290OiByb290LAorICAgICAgICByZXNvbHZlTWV0aG9kTmFtZTogJ3Jlc29sdmUnICsgcmVz
b2x2ZU1ldGhvZE5hbWUKKyAgICAgIH07CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJu
cyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGZ1bGxOYW1lLiBVc2VkIGJ5IHRo
ZQorICAgICAgQXBwbGljYXRpb24gbmFtZXNwYWNlIGluIGFzc2VydGlvbnMgdG8gZGVzY3JpYmUg
dGhlCisgICAgICBwcmVjaXNlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgRW1iZXIgaXMgbG9va2lu
ZyBmb3IsIHJhdGhlciB0aGFuCisgICAgICBjb250YWluZXIga2V5cy4KKyAgICAgICBAcHJvdGVj
dGVkCisgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUgdGhlIGxvb2t1cCBzdHJpbmcKKyAg
ICAgIEBtZXRob2QgbG9va3VwRGVzY3JpcHRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IGxvb2t1cERlc2NyaXB0aW9uOiBmdW5jdGlvbiAoZnVsbE5hbWUpIHsKKyAgICAgIHZhciBwYXJz
ZWROYW1lID0gdGhpcy5wYXJzZU5hbWUoZnVsbE5hbWUpOworICAgICAgdmFyIGRlc2NyaXB0aW9u
OworCisgICAgICBpZiAocGFyc2VkTmFtZS50eXBlID09PSAndGVtcGxhdGUnKSB7CisgICAgICAg
IHJldHVybiAndGVtcGxhdGUgYXQgJyArIHBhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZS5y
ZXBsYWNlKC9cLi9nLCAnLycpOworICAgICAgfQorCisgICAgICBkZXNjcmlwdGlvbiA9IHBhcnNl
ZE5hbWUucm9vdCArICcuJyArIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkocGFy
c2VkTmFtZS5uYW1lKS5yZXBsYWNlKC9cLi9nLCAnJyk7CisKKyAgICAgIGlmIChwYXJzZWROYW1l
LnR5cGUgIT09ICdtb2RlbCcpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gKz0gX2VtYmVyUnVudGlt
ZVN5c3RlbVN0cmluZy5jbGFzc2lmeShwYXJzZWROYW1lLnR5cGUpOworICAgICAgfQorCisgICAg
ICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfSwKKworICAgIG1ha2VUb1N0cmluZzogZnVuY3Rp
b24gKGZhY3RvcnksIGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gZmFjdG9yeS50b1N0cmluZygp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEdpdmVuIGEgcGFyc2VOYW1lIG9iamVjdCAob3V0
cHV0IGZyb20gYHBhcnNlTmFtZWApLCBhcHBseQorICAgICAgdGhlIGNvbnZlbnRpb25zIGV4cGVj
dGVkIGJ5IGBFbWJlci5Sb3V0ZXJgCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFtIHtP
YmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAg
ICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHVzZVJvdXRlck5hbWlu
ZworICAgICAgQHB1YmxpYworICAgICovCisgICAgdXNlUm91dGVyTmFtaW5nOiBmdW5jdGlvbiAo
cGFyc2VkTmFtZSkgeworICAgICAgcGFyc2VkTmFtZS5uYW1lID0gcGFyc2VkTmFtZS5uYW1lLnJl
cGxhY2UoL1wuL2csICdfJyk7CisgICAgICBpZiAocGFyc2VkTmFtZS5uYW1lID09PSAnYmFzaWMn
KSB7CisgICAgICAgIHBhcnNlZE5hbWUubmFtZSA9ICcnOworICAgICAgfQorICAgIH0sCisgICAg
LyoqCisgICAgICBMb29rIHVwIHRoZSB0ZW1wbGF0ZSBpbiBFbWJlci5URU1QTEFURVMKKyAgICAg
ICBAcHJvdGVjdGVkCisgICAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFt
ZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcK
KyAgICAgIEBtZXRob2QgcmVzb2x2ZVRlbXBsYXRlCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uIChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgdGVt
cGxhdGVOYW1lID0gcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlLnJlcGxhY2UoL1wuL2cs
ICcvJyk7CisKKyAgICAgIHJldHVybiBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlX3JlZ2lzdHJ5Lmdl
dCh0ZW1wbGF0ZU5hbWUpIHx8IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkuZ2V0KF9l
bWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuZGVjYW1lbGl6ZSh0ZW1wbGF0ZU5hbWUpKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBMb29rdXAgdGhlIHZpZXcgdXNpbmcgYHJlc29sdmVPdGhlcmAK
KyAgICAgICBAcHJvdGVjdGVkCisgICAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBh
cnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCisgICAgICAgIGZ1bGxOYW1lIGxvb2t1cCBz
dHJpbmcKKyAgICAgIEBtZXRob2QgcmVzb2x2ZVZpZXcKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIHJlc29sdmVWaWV3OiBmdW5jdGlvbiAocGFyc2VkTmFtZSkgeworICAgICAgdGhpcy51c2VS
b3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7CisgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIo
cGFyc2VkTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTG9va3VwIHRoZSBjb250cm9s
bGVyIHVzaW5nIGByZXNvbHZlT3RoZXJgCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFt
IHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAor
ICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVDb250
cm9sbGVyCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlQ29udHJvbGxlcjogZnVu
Y3Rpb24gKHBhcnNlZE5hbWUpIHsKKyAgICAgIHRoaXMudXNlUm91dGVyTmFtaW5nKHBhcnNlZE5h
bWUpOworICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOworICAgIH0s
CisgICAgLyoqCisgICAgICBMb29rdXAgdGhlIHJvdXRlIHVzaW5nIGByZXNvbHZlT3RoZXJgCisg
ICAgICAgQHByb3RlY3RlZAorICAgICAgQHBhcmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJz
ZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAorICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3Ry
aW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVSb3V0ZQorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgcmVzb2x2ZVJvdXRlOiBmdW5jdGlvbiAocGFyc2VkTmFtZSkgeworICAgICAgdGhpcy51c2VS
b3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7CisgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIo
cGFyc2VkTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTG9va3VwIHRoZSBtb2RlbCBv
biB0aGUgQXBwbGljYXRpb24gbmFtZXNwYWNlCisgICAgICAgQHByb3RlY3RlZAorICAgICAgQHBh
cmFtIHtPYmplY3R9IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNl
ZAorICAgICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCisgICAgICBAbWV0aG9kIHJlc29sdmVN
b2RlbAorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVzb2x2ZU1vZGVsOiBmdW5jdGlvbiAo
cGFyc2VkTmFtZSkgeworICAgICAgdmFyIGNsYXNzTmFtZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1T
dHJpbmcuY2xhc3NpZnkocGFyc2VkTmFtZS5uYW1lKTsKKyAgICAgIHZhciBmYWN0b3J5ID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHBhcnNlZE5hbWUucm9vdCwgY2xhc3NOYW1lKTsKKwor
ICAgICAgaWYgKGZhY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICB9Cisg
ICAgfSwKKyAgICAvKioKKyAgICAgIExvb2sgdXAgdGhlIHNwZWNpZmllZCBvYmplY3QgKGZyb20g
cGFyc2VkTmFtZSkgb24gdGhlIGFwcHJvcHJpYXRlCisgICAgICBuYW1lc3BhY2UgKHVzdWFsbHkg
b24gdGhlIEFwcGxpY2F0aW9uKQorICAgICAgIEBwcm90ZWN0ZWQKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKKyAgICAg
ICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAgICAgQG1ldGhvZCByZXNvbHZlSGVscGVyCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICByZXNvbHZlSGVscGVyOiBmdW5jdGlvbiAocGFyc2Vk
TmFtZSkgeworICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpIHx8IF9l
bWJlckh0bWxiYXJzSGVscGVycy5kZWZhdWx0W3BhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlw
ZV07CisgICAgfSwKKyAgICAvKioKKyAgICAgIExvb2sgdXAgdGhlIHNwZWNpZmllZCBvYmplY3Qg
KGZyb20gcGFyc2VkTmFtZSkgb24gdGhlIGFwcHJvcHJpYXRlCisgICAgICBuYW1lc3BhY2UgKHVz
dWFsbHkgb24gdGhlIEFwcGxpY2F0aW9uKQorICAgICAgIEBwcm90ZWN0ZWQKKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQK
KyAgICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZworICAgICAgQG1ldGhvZCByZXNvbHZlT3Ro
ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlc29sdmVPdGhlcjogZnVuY3Rpb24gKHBh
cnNlZE5hbWUpIHsKKyAgICAgIHZhciBjbGFzc05hbWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtU3Ry
aW5nLmNsYXNzaWZ5KHBhcnNlZE5hbWUubmFtZSkgKyBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5n
LmNsYXNzaWZ5KHBhcnNlZE5hbWUudHlwZSk7CisgICAgICB2YXIgZmFjdG9yeSA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldChwYXJzZWROYW1lLnJvb3QsIGNsYXNzTmFtZSk7CisgICAgICBp
ZiAoZmFjdG9yeSkgeworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgIH0KKyAgICB9LAor
CisgICAgcmVzb2x2ZU1haW46IGZ1bmN0aW9uIChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgY2xh
c3NOYW1lID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeShwYXJzZWROYW1lLnR5
cGUpOworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwYXJzZWROYW1l
LnJvb3QsIGNsYXNzTmFtZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICBAbWV0aG9kIF9sb2dM
b29rdXAKKyAgICAgQHBhcmFtIHtCb29sZWFufSBmb3VuZAorICAgICBAcGFyYW0ge09iamVjdH0g
cGFyc2VkTmFtZQorICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2xvZ0xvb2t1cDogZnVuY3Rp
b24gKGZvdW5kLCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgc3ltYm9sLCBwYWRkaW5nOworCisg
ICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgc3ltYm9sID0gJ1vinJNdJzsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHN5bWJvbCA9ICdbIF0nOworICAgICAgfQorCisgICAgICBpZiAocGFyc2Vk
TmFtZS5mdWxsTmFtZS5sZW5ndGggPiA2MCkgeworICAgICAgICBwYWRkaW5nID0gJy4nOworICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgcGFkZGluZyA9IG5ldyBBcnJheSg2MCAtIHBhcnNlZE5hbWUu
ZnVsbE5hbWUubGVuZ3RoKS5qb2luKCcuJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFs
RGVidWcuaW5mbyhzeW1ib2wsIHBhcnNlZE5hbWUuZnVsbE5hbWUsIHBhZGRpbmcsIHRoaXMubG9v
a3VwRGVzY3JpcHRpb24ocGFyc2VkTmFtZS5mdWxsTmFtZSkpOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgVXNlZCB0byBpdGVyYXRlIGFsbCBpdGVtcyBvZiBhIGdpdmVuIHR5cGUuCisgICAgICBA
bWV0aG9kIGtub3duRm9yVHlwZQorICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0
byBzZWFyY2ggZm9yCisgICAgIEBwcml2YXRlCisgICAgICovCisgICAga25vd25Gb3JUeXBlOiBm
dW5jdGlvbiAodHlwZSkgeworICAgICAgdmFyIG5hbWVzcGFjZSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJyk7CisgICAgICB2YXIgc3VmZml4ID0gX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeSh0eXBlKTsKKyAgICAgIHZhciB0eXBlUmVnZXhw
ID0gbmV3IFJlZ0V4cChzdWZmaXggKyAnJCcpOworCisgICAgICB2YXIga25vd24gPSBfZW1iZXJN
ZXRhbERpY3Rpb25hcnkuZGVmYXVsdChudWxsKTsKKyAgICAgIHZhciBrbm93bktleXMgPSBPYmpl
Y3Qua2V5cyhuYW1lc3BhY2UpOworICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBfbGVuZ3RoID0g
a25vd25LZXlzLmxlbmd0aDsgaW5kZXggPCBfbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgIHZh
ciBfbmFtZSA9IGtub3duS2V5c1tpbmRleF07CisKKyAgICAgICAgaWYgKHR5cGVSZWdleHAudGVz
dChfbmFtZSkpIHsKKyAgICAgICAgICB2YXIgY29udGFpbmVyTmFtZSA9IHRoaXMudHJhbnNsYXRl
VG9Db250YWluZXJGdWxsbmFtZSh0eXBlLCBfbmFtZSk7CisKKyAgICAgICAgICBrbm93bltjb250
YWluZXJOYW1lXSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGtu
b3duOworICAgIH0sCisKKyAgICAvKioKKyAgICAgQ29udmVydHMgcHJvdmlkZWQgbmFtZSBmcm9t
IHRoZSBiYWNraW5nIG5hbWVzcGFjZSBpbnRvIGEgY29udGFpbmVyIGxvb2t1cCBuYW1lLgorICAg
ICAgRXhhbXBsZXM6CisgICAgICBBcHAuRm9vQmFySGVscGVyIC0+IGhlbHBlcjpmb28tYmFyCisg
ICAgIEFwcC5USGVscGVyIC0+IGhlbHBlcjp0CisgICAgICBAbWV0aG9kIHRyYW5zbGF0ZVRvQ29u
dGFpbmVyRnVsbG5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKKyAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUKKyAgICAgQHByaXZhdGUKKyAgICAgKi8KKworICAgIHRyYW5zbGF0ZVRvQ29u
dGFpbmVyRnVsbG5hbWU6IGZ1bmN0aW9uICh0eXBlLCBuYW1lKSB7CisgICAgICB2YXIgc3VmZml4
ID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jbGFzc2lmeSh0eXBlKTsKKyAgICAgIHZhciBu
YW1lUHJlZml4ID0gbmFtZS5zbGljZSgwLCBzdWZmaXgubGVuZ3RoICogLTEpOworICAgICAgdmFy
IGRhc2hlcml6ZWROYW1lID0gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5kYXNoZXJpemUobmFt
ZVByZWZpeCk7CisKKyAgICAgIHJldHVybiB0eXBlICsgJzonICsgZGFzaGVyaXplZE5hbWU7Cisg
ICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1hcHBsaWNhdGlvbi91dGlscy92YWxpZGF0
ZS10eXBlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItYXBwbGljYXRpb24KKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gdmFsaWRhdGVUeXBlOworCisgIHZhciBWQUxJREFURURfVFlQRVMgPSB7
CisgICAgcm91dGU6IFsnYXNzZXJ0JywgJ2lzUm91dGVGYWN0b3J5JywgJ0VtYmVyLlJvdXRlJ10s
CisgICAgY29tcG9uZW50OiBbJ2RlcHJlY2F0ZScsICdpc0NvbXBvbmVudEZhY3RvcnknLCAnRW1i
ZXIuQ29tcG9uZW50J10sCisgICAgdmlldzogWydkZXByZWNhdGUnLCAnaXNWaWV3RmFjdG9yeScs
ICdFbWJlci5WaWV3J10sCisgICAgc2VydmljZTogWydkZXByZWNhdGUnLCAnaXNTZXJ2aWNlRmFj
dG9yeScsICdFbWJlci5TZXJ2aWNlJ10KKyAgfTsKKworICBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUo
cmVzb2x2ZWRUeXBlLCBwYXJzZWROYW1lKSB7CisgICAgdmFyIHZhbGlkYXRpb25BdHRyaWJ1dGVz
ID0gVkFMSURBVEVEX1RZUEVTW3BhcnNlZE5hbWUudHlwZV07CisKKyAgICBpZiAoIXZhbGlkYXRp
b25BdHRyaWJ1dGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGFjdGlvbiA9
IHZhbGlkYXRpb25BdHRyaWJ1dGVzWzBdOworICAgIHZhciBmYWN0b3J5RmxhZyA9IHZhbGlkYXRp
b25BdHRyaWJ1dGVzWzFdOworICAgIHZhciBleHBlY3RlZFR5cGUgPSB2YWxpZGF0aW9uQXR0cmli
dXRlc1syXTsKKworICAgIGlmIChhY3Rpb24gPT09ICdkZXByZWNhdGUnKSB7CisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnSW4gRW1iZXIgMi4wICcgKyBwYXJzZWROYW1lLnR5cGUg
KyAnIGZhY3RvcmllcyBtdXN0IGhhdmUgYW4gYCcgKyBmYWN0b3J5RmxhZyArICdgICcgKyAoJ3By
b3BlcnR5IHNldCB0byB0cnVlLiBZb3UgcmVnaXN0ZXJlZCAnICsgcmVzb2x2ZWRUeXBlICsgJyBh
cyBhICcgKyBwYXJzZWROYW1lLnR5cGUgKyAnICcpICsgKCdmYWN0b3J5LiBFaXRoZXIgYWRkIHRo
ZSBgJyArIGZhY3RvcnlGbGFnICsgJ2AgcHJvcGVydHkgdG8gdGhpcyBmYWN0b3J5IG9yICcpICsg
KCdleHRlbmQgZnJvbSAnICsgZXhwZWN0ZWRUeXBlICsgJy4nKSwgISFyZXNvbHZlZFR5cGVbZmFj
dG9yeUZsYWddLCB7IGlkOiAnZW1iZXItYXBwbGljYXRpb24udmFsaWRhdGUtdHlwZScsIHVudGls
OiAnMy4wLjAnIH0pOworICAgIH0gZWxzZSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnRXhwZWN0ZWQgJyArIHBhcnNlZE5hbWUuZnVsbE5hbWUgKyAnIHRvIHJlc29sdmUgdG8gYW4g
JyArIGV4cGVjdGVkVHlwZSArICcgYnV0ICcgKyAoJ2luc3RlYWQgaXQgd2FzICcgKyByZXNvbHZl
ZFR5cGUgKyAnLicpLCAhIXJlc29sdmVkVHlwZVtmYWN0b3J5RmxhZ10pOworICAgIH0KKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLWRlYnVnL2RlcHJlY2F0ZScsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9jb3JlJywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2VtYmVyLW1ldGFsL2xvZ2dlcicsICdl
bWJlci1kZWJ1Zy9oYW5kbGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3Jl
LCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbExvZ2dlciwgX2VtYmVyRGVidWdIYW5kbGVy
cykgeworICAvKmdsb2JhbCBfX2ZhaWxfXyovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBf
c2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgIGV4cG9ydHMucmVnaXN0ZXJIYW5kbGVy
ID0gcmVnaXN0ZXJIYW5kbGVyOworICBleHBvcnRzLmRlZmF1bHQgPSBkZXByZWNhdGU7CisKKyAg
ZnVuY3Rpb24gcmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXIpIHsKKyAgICBfZW1iZXJEZWJ1Z0hhbmRs
ZXJzLnJlZ2lzdGVySGFuZGxlcignZGVwcmVjYXRlJywgaGFuZGxlcik7CisgIH0KKworICBmdW5j
dGlvbiBmb3JtYXRNZXNzYWdlKF9tZXNzYWdlLCBvcHRpb25zKSB7CisgICAgdmFyIG1lc3NhZ2Ug
PSBfbWVzc2FnZTsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWQpIHsKKyAgICAgIG1l
c3NhZ2UgPSBtZXNzYWdlICsgKCcgW2RlcHJlY2F0aW9uIGlkOiAnICsgb3B0aW9ucy5pZCArICdd
Jyk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51cmwpIHsKKyAgICAgIG1l
c3NhZ2UgKz0gJyBTZWUgJyArIG9wdGlvbnMudXJsICsgJyBmb3IgbW9yZSBkZXRhaWxzLic7Cisg
ICAgfQorCisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0KKworICByZWdpc3RlckhhbmRsZXIoZnVu
Y3Rpb24gbG9nRGVwcmVjYXRpb25Ub0NvbnNvbGUobWVzc2FnZSwgb3B0aW9ucykgeworICAgIHZh
ciB1cGRhdGVkTWVzc2FnZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSwgb3B0aW9ucyk7CisKKyAg
ICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ0RFUFJFQ0FUSU9OOiAnICsgdXBkYXRl
ZE1lc3NhZ2UpOworICB9KTsKKworICB2YXIgY2FwdHVyZUVycm9yRm9yU3RhY2sgPSB1bmRlZmlu
ZWQ7CisKKyAgaWYgKG5ldyBFcnJvcigpLnN0YWNrKSB7CisgICAgY2FwdHVyZUVycm9yRm9yU3Rh
Y2sgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gbmV3IEVycm9yKCk7CisgICAgfTsKKyAg
fSBlbHNlIHsKKyAgICBjYXB0dXJlRXJyb3JGb3JTdGFjayA9IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHRyeSB7CisgICAgICAgIF9fZmFpbF9fLmZhaWwoKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAg
ICAgICAgcmV0dXJuIGU7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJlZ2lzdGVySGFuZGxl
cihmdW5jdGlvbiBsb2dEZXByZWNhdGlvblN0YWNrVHJhY2UobWVzc2FnZSwgb3B0aW9ucywgbmV4
dCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5MT0dfU1RBQ0tUUkFDRV9PTl9E
RVBSRUNBVElPTikgeworICAgICAgdmFyIHN0YWNrU3RyID0gJyc7CisgICAgICB2YXIgZXJyb3Ig
PSBjYXB0dXJlRXJyb3JGb3JTdGFjaygpOworICAgICAgdmFyIHN0YWNrID0gdW5kZWZpbmVkOwor
CisgICAgICBpZiAoZXJyb3Iuc3RhY2spIHsKKyAgICAgICAgaWYgKGVycm9yWydhcmd1bWVudHMn
XSkgeworICAgICAgICAgIC8vIENocm9tZQorICAgICAgICAgIHN0YWNrID0gZXJyb3Iuc3RhY2su
cmVwbGFjZSgvXlxzK2F0XHMrL2dtLCAnJykucmVwbGFjZSgvXihbXlwoXSs/KShbXG4kXSkvZ20s
ICd7YW5vbnltb3VzfSgkMSkkMicpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5ccypcKChb
XlwpXSspXCkvZ20sICd7YW5vbnltb3VzfSgkMSknKS5zcGxpdCgnXG4nKTsKKyAgICAgICAgICBz
dGFjay5zaGlmdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEZpcmVmb3gKKyAg
ICAgICAgICBzdGFjayA9IGVycm9yLnN0YWNrLnJlcGxhY2UoLyg/OlxuQDowKT9ccyskL20sICcn
KS5yZXBsYWNlKC9eXCgvZ20sICd7YW5vbnltb3VzfSgnKS5zcGxpdCgnXG4nKTsKKyAgICAgICAg
fQorCisgICAgICAgIHN0YWNrU3RyID0gJ1xuICAgICcgKyBzdGFjay5zbGljZSgyKS5qb2luKCdc
biAgICAnKTsKKyAgICAgIH0KKworICAgICAgdmFyIHVwZGF0ZWRNZXNzYWdlID0gZm9ybWF0TWVz
c2FnZShtZXNzYWdlLCBvcHRpb25zKTsKKworICAgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVs
dC53YXJuKCdERVBSRUNBVElPTjogJyArIHVwZGF0ZWRNZXNzYWdlICsgc3RhY2tTdHIpOworICAg
IH0gZWxzZSB7CisgICAgICBuZXh0LmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKKyAgICB9
CisgIH0pOworCisgIHJlZ2lzdGVySGFuZGxlcihmdW5jdGlvbiByYWlzZU9uRGVwcmVjYXRpb24o
bWVzc2FnZSwgb3B0aW9ucywgbmV4dCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5FTlYuUkFJU0VfT05fREVQUkVDQVRJT04pIHsKKyAgICAgIHZhciB1cGRhdGVkTWVzc2FnZSA9
IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVy
cm9yLmRlZmF1bHQodXBkYXRlZE1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBuZXh0LmFw
cGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKKyAgICB9CisgIH0pOworCisgIHZhciBtaXNzaW5n
T3B0aW9uc0RlcHJlY2F0aW9uID0gJ1doZW4gY2FsbGluZyBgRW1iZXIuZGVwcmVjYXRlYCB5b3Ug
JyArICdtdXN0IHByb3ZpZGUgYW4gYG9wdGlvbnNgIGhhc2ggYXMgdGhlIHRoaXJkIHBhcmFtZXRl
ci4gICcgKyAnYG9wdGlvbnNgIHNob3VsZCBpbmNsdWRlIGBpZGAgYW5kIGB1bnRpbGAgcHJvcGVy
dGllcy4nOworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24gPSBtaXNzaW5nT3B0
aW9uc0RlcHJlY2F0aW9uOworICB2YXIgbWlzc2luZ09wdGlvbnNJZERlcHJlY2F0aW9uID0gJ1do
ZW4gY2FsbGluZyBgRW1iZXIuZGVwcmVjYXRlYCB5b3UgbXVzdCBwcm92aWRlIGBpZGAgaW4gb3B0
aW9ucy4nOworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiA9IG1pc3NpbmdP
cHRpb25zSWREZXByZWNhdGlvbjsKKyAgdmFyIG1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNhdGlv
biA9ICdXaGVuIGNhbGxpbmcgYEVtYmVyLmRlcHJlY2F0ZWAgeW91IG11c3QgcHJvdmlkZSBgdW50
aWxgIGluIG9wdGlvbnMuJzsKKworICBleHBvcnRzLm1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNh
dGlvbiA9IG1pc3NpbmdPcHRpb25zVW50aWxEZXByZWNhdGlvbjsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1kZWJ1ZworICAqLworCisgIC8qKgorICAgIERpc3Bs
YXkgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYW5kIGEg
c3RhY2sgdHJhY2UKKyAgICAoQ2hyb21lIGFuZCBGaXJlZm94IG9ubHkpLgorICAKKyAgICAqIElu
IGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBm
dW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMgbWV0aG9kIGluIEVtYmVyIGl0c2VsZiBh
cmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5qcyBidWlsZC4KKyAgCisgICAgQG1ldGhv
ZCBkZXByZWNhdGUKKyAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9m
IHRoZSBkZXByZWNhdGlvbi4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgQSBib29sZWFuLiBJ
ZiBmYWxzeSwgdGhlIGRlcHJlY2F0aW9uCisgICAgICB3aWxsIGJlIGRpc3BsYXllZC4KKyAgICBA
cGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXNz
CisgICAgICBpbiBhIGB1cmxgIHRvIHRoZSB0cmFuc2l0aW9uIGd1aWRlIG9uIHRoZSBlbWJlcmpz
LmNvbSB3ZWJzaXRlLCBhbmQgYSB1bmlxdWUKKyAgICAgIGBpZGAgZm9yIHRoaXMgZGVwcmVjYXRp
b24uIFRoZSBgaWRgIGNhbiBiZSB1c2VkIGJ5IEVtYmVyIGRlYnVnZ2luZyB0b29scworICAgICAg
dG8gY2hhbmdlIHRoZSBiZWhhdmlvciAocmFpc2UsIGxvZyBvciBzaWxlbmNlKSBmb3IgdGhhdCBz
cGVjaWZpYyBkZXByZWNhdGlvbi4KKyAgICAgIFRoZSBgaWRgIHNob3VsZCBiZSBuYW1lc3BhY2Vk
IGJ5IGRvdHMsIGUuZy4gInZpZXcuaGVscGVyLnNlbGVjdCIuCisgICAgQGZvciBFbWJlcgorICAg
IEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBkZXByZWNhdGUobWVzc2FnZSwgdGVzdCwgb3B0
aW9ucykgeworICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5pZCAmJiAhb3B0aW9ucy51bnRp
bCkgeworICAgICAgZGVwcmVjYXRlKG1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24sIGZhbHNlLCB7
CisgICAgICAgIGlkOiAnZW1iZXItZGVidWcuZGVwcmVjYXRlLW9wdGlvbnMtbWlzc2luZycsCisg
ICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20v
ZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAg
ICAgfSk7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuaWQpIHsKKyAgICAg
IGRlcHJlY2F0ZShtaXNzaW5nT3B0aW9uc0lkRGVwcmVjYXRpb24sIGZhbHNlLCB7CisgICAgICAg
IGlkOiAnZW1iZXItZGVidWcuZGVwcmVjYXRlLWlkLW1pc3NpbmcnLAorICAgICAgICB1bnRpbDog
JzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92
Mi54LyN0b2NfZW1iZXItZGVidWctZnVuY3Rpb24tb3B0aW9ucycKKyAgICAgIH0pOworICAgIH0K
KworICAgIGlmIChvcHRpb25zICYmICFvcHRpb25zLnVudGlsKSB7CisgICAgICBkZXByZWNhdGUo
bWlzc2luZ09wdGlvbnNVbnRpbERlcHJlY2F0aW9uLCBvcHRpb25zICYmIG9wdGlvbnMudW50aWws
IHsKKyAgICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy5kZXByZWNhdGUtdW50aWwtbWlzc2luZycsCisg
ICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20v
ZGVwcmVjYXRpb25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAg
ICAgfSk7CisgICAgfQorCisgICAgX2VtYmVyRGVidWdIYW5kbGVycy5pbnZva2UuYXBwbHkodW5k
ZWZpbmVkLCBbJ2RlcHJlY2F0ZSddLmNvbmNhdChfc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7Cisg
IH0KK30pOworZW5pZmVkKCJlbWJlci1kZWJ1Zy9oYW5kbGVycyIsIFsiZXhwb3J0cyJdLCBmdW5j
dGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5yZWdpc3Rlckhh
bmRsZXIgPSByZWdpc3RlckhhbmRsZXI7CisgIGV4cG9ydHMuaW52b2tlID0gaW52b2tlOworICB2
YXIgSEFORExFUlMgPSB7fTsKKworICBleHBvcnRzLkhBTkRMRVJTID0gSEFORExFUlM7CisKKyAg
ZnVuY3Rpb24gcmVnaXN0ZXJIYW5kbGVyKHR5cGUsIGNhbGxiYWNrKSB7CisgICAgdmFyIG5leHRI
YW5kbGVyID0gSEFORExFUlNbdHlwZV0gfHwgZnVuY3Rpb24gKCkge307CisKKyAgICBIQU5ETEVS
U1t0eXBlXSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBvcHRpb25zKSB7CisgICAgICBjYWxsYmFjayht
ZXNzYWdlLCBvcHRpb25zLCBuZXh0SGFuZGxlcik7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9u
IGludm9rZSh0eXBlLCBtZXNzYWdlLCB0ZXN0LCBvcHRpb25zKSB7CisgICAgaWYgKHRlc3QpIHsK
KyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaGFuZGxlckZvclR5cGUgPSBIQU5ETEVS
U1t0eXBlXTsKKworICAgIGlmICghaGFuZGxlckZvclR5cGUpIHsKKyAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAoaGFuZGxlckZvclR5cGUpIHsKKyAgICAgIGhhbmRsZXJGb3JUeXBlKG1l
c3NhZ2UsIG9wdGlvbnMpOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWRlYnVnL2lu
ZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcn
LCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0
YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL2Vudmlyb25tZW50JywgJ2VtYmVyLWRlYnVnL2RlcHJl
Y2F0ZScsICdlbWJlci1kZWJ1Zy93YXJuJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFs
RXJyb3IsIF9lbWJlck1ldGFsTG9nZ2VyLCBfZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJE
ZWJ1Z0RlcHJlY2F0ZSwgX2VtYmVyRGVidWdXYXJuKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLl93YXJuSWZVc2luZ1N0cmlwcGVkRmVhdHVyZUZsYWdzID0gX3dhcm5JZlVzaW5nU3Ry
aXBwZWRGZWF0dXJlRmxhZ3M7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci1kZWJ1ZworICAqLworCisgIC8qKgorICBAY2xhc3MgRW1iZXIKKyAgQHB1YmxpYwor
ICAqLworCisgIC8qKgorICAgIERlZmluZSBhbiBhc3NlcnRpb24gdGhhdCB3aWxsIHRocm93IGFu
IGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuCisgIAorICAgICogSW4gYSBw
cm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0
aW9uIChOT1ApLgorICAgIFVzZXMgb2YgdGhpcyBtZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBz
dHJpcHBlZCBmcm9tIHRoZSBlbWJlci5wcm9kLmpzIGJ1aWxkLgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gVGVzdCBmb3IgdHJ1dGhpbmVzcworICAgIEVtYmVyLmFzc2VydCgnTXVzdCBw
YXNzIGEgdmFsaWQgb2JqZWN0Jywgb2JqKTsKKyAgCisgICAgLy8gRmFpbCB1bmNvbmRpdGlvbmFs
bHkKKyAgICBFbWJlci5hc3NlcnQoJ1RoaXMgY29kZSBwYXRoIHNob3VsZCBuZXZlciBiZSBydW4n
KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhc3NlcnQKKyAgICBAcGFyYW0ge1N0cmluZ30g
ZGVzYyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3NlcnRpb24uIFRoaXMgd2lsbCBiZWNvbWUKKyAg
ICAgIHRoZSB0ZXh0IG9mIHRoZSBFcnJvciB0aHJvd24gaWYgdGhlIGFzc2VydGlvbiBmYWlscy4K
KyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgTXVzdCBiZSB0cnV0aHkgZm9yIHRoZSBhc3NlcnRp
b24gdG8gcGFzcy4gSWYKKyAgICAgIGZhbHN5LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24u
CisgICAgQHB1YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24o
J2Fzc2VydCcsIGZ1bmN0aW9uIGFzc2VydChkZXNjLCB0ZXN0KSB7CisgICAgaWYgKCF0ZXN0KSB7
CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdBc3NlcnRpb24gRmFp
bGVkOiAnICsgZGVzYyk7CisgICAgfQorICB9KTsKKworICAvKioKKyAgICBEaXNwbGF5IGEgZGVi
dWcgbm90aWNlLgorICAKKyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2Qg
aXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMg
bWV0aG9kIGluIEVtYmVyIGl0c2VsZiBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5q
cyBidWlsZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmRlYnVnKCdJXCdtIGEg
ZGVidWcgbm90aWNlIScpOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGRlYnVnCisgICAgQHBh
cmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSBkZWJ1ZyBtZXNzYWdlIHRvIGRpc3BsYXkuCisgICAgQHB1
YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24oJ2RlYnVnJywg
ZnVuY3Rpb24gZGVidWcobWVzc2FnZSkgeworICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQu
ZGVidWcoJ0RFQlVHOiAnICsgbWVzc2FnZSk7CisgIH0pOworCisgIC8qKgorICAgIERpc3BsYXkg
YW4gaW5mbyBub3RpY2UuCisgIAorICAgICogSW4gYSBwcm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1l
dGhvZCBpcyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0aW9uIChOT1ApLgorICAgIFVzZXMgb2Yg
dGhpcyBtZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBlbWJlci5w
cm9kLmpzIGJ1aWxkLgorICAKKyAgICBAbWV0aG9kIGluZm8KKyAgICBAcHJpdmF0ZQorICAqLwor
ICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rpb24oJ2luZm8nLCBmdW5jdGlvbiBpbmZv
KCkgeworICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQuaW5mby5hcHBseSh1bmRlZmluZWQs
IGFyZ3VtZW50cyk7CisgIH0pOworCisgIC8qKgorICAgIEFsaWFzIGFuIG9sZCwgZGVwcmVjYXRl
ZCBtZXRob2Qgd2l0aCBpdHMgbmV3IGNvdW50ZXJwYXJ0LgorICAKKyAgICBEaXNwbGF5IGEgZGVw
cmVjYXRpb24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBhIHN0YWNrIHRy
YWNlCisgICAgKENocm9tZSBhbmQgRmlyZWZveCBvbmx5KSB3aGVuIHRoZSBhc3NpZ25lZCBtZXRo
b2QgaXMgY2FsbGVkLgorICAKKyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRo
b2QgaXMgZGVmaW5lZCBhcyBhbiBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEVtYmVyLm9sZE1ldGhvZCA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoJ1BsZWFz
ZSB1c2UgdGhlIG5ldywgdXBkYXRlZCBtZXRob2QnLCBFbWJlci5uZXdNZXRob2QpOworICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGRlcHJlY2F0ZUZ1bmMKKyAgICBAcGFyYW0ge1N0cmluZ30gbWVz
c2FnZSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4KKyAgICBAcGFyYW0ge09iamVj
dH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdCBmb3IgRW1iZXIuZGVwcmVjYXRlLgorICAg
IEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIG5ldyBmdW5jdGlvbiBjYWxsZWQgdG8gcmVwbGFj
ZSBpdHMgZGVwcmVjYXRlZCBjb3VudGVycGFydC4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gQSBu
ZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCBhIGRlcHJl
Y2F0aW9uIHdhcm5pbmcKKyAgICBAcHJpdmF0ZQorICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNl
dERlYnVnRnVuY3Rpb24oJ2RlcHJlY2F0ZUZ1bmMnLCBmdW5jdGlvbiBkZXByZWNhdGVGdW5jKCkg
eworICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xl
biksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICBhcmdzW19rZXldID0g
YXJndW1lbnRzW19rZXldOworICAgIH0KKworICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykgewor
ICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgbWVzc2FnZSA9IGFy
Z3NbMF07CisgICAgICAgIHZhciBvcHRpb25zID0gYXJnc1sxXTsKKyAgICAgICAgdmFyIGZ1bmMg
PSBhcmdzWzJdOworCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgdjogZnVuY3Rpb24gKCkg
eworICAgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUobWVzc2FnZSwgZmFsc2Us
IG9wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KSgpOworCisgICAgICBpZiAodHlw
ZW9mIF9yZXQgPT09ICdvYmplY3QnKSByZXR1cm4gX3JldC52OworICAgIH0gZWxzZSB7CisgICAg
ICB2YXIgX3JldDIgPSAoZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgbWVzc2FnZSA9IGFyZ3Nb
MF07CisgICAgICAgIHZhciBmdW5jID0gYXJnc1sxXTsKKworICAgICAgICByZXR1cm4geworICAg
ICAgICAgIHY6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJn
dW1lbnRzKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KSgpOworCisgICAgICBp
ZiAodHlwZW9mIF9yZXQyID09PSAnb2JqZWN0JykgcmV0dXJuIF9yZXQyLnY7CisgICAgfQorICB9
KTsKKworICAvKioKKyAgICBSdW4gYSBmdW5jdGlvbiBtZWFudCBmb3IgZGVidWdnaW5nLgorICAK
KyAgICAqIEluIGEgcHJvZHVjdGlvbiBidWlsZCwgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBhcyBh
biBlbXB0eSBmdW5jdGlvbiAoTk9QKS4KKyAgICBVc2VzIG9mIHRoaXMgbWV0aG9kIGluIEVtYmVy
IGl0c2VsZiBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZW1iZXIucHJvZC5qcyBidWlsZC4KKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLnJ1bkluRGVidWcoKCkgPT4geworICAgICAgRW1i
ZXIuQ29tcG9uZW50LnJlb3Blbih7CisgICAgICAgIGRpZEluc2VydEVsZW1lbnQoKSB7CisgICAg
ICAgICAgY29uc29sZS5sb2coIkknbSBoYXBweSIpOworICAgICAgICB9CisgICAgICB9KTsKKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBydW5JbkRlYnVnCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuCisgICAgQHNpbmNlIDEu
NS4wCisgICAgQHB1YmxpYworICAqLworICBfZW1iZXJNZXRhbERlYnVnLnNldERlYnVnRnVuY3Rp
b24oJ3J1bkluRGVidWcnLCBmdW5jdGlvbiBydW5JbkRlYnVnKGZ1bmMpIHsKKyAgICBmdW5jKCk7
CisgIH0pOworCisgIF9lbWJlck1ldGFsRGVidWcuc2V0RGVidWdGdW5jdGlvbignZGVidWdTZWFs
JywgZnVuY3Rpb24gZGVidWdTZWFsKG9iaikgeworICAgIE9iamVjdC5zZWFsKG9iaik7CisgIH0p
OworCisgIF9lbWJlck1ldGFsRGVidWcuc2V0RGVidWdGdW5jdGlvbignZGVwcmVjYXRlJywgX2Vt
YmVyRGVidWdEZXByZWNhdGUuZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxEZWJ1Zy5zZXREZWJ1
Z0Z1bmN0aW9uKCd3YXJuJywgX2VtYmVyRGVidWdXYXJuLmRlZmF1bHQpOworCisgIC8qKgorICAg
IFdpbGwgY2FsbCBgRW1iZXIud2FybigpYCBpZiBFTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVMgb3IK
KyAgICBhbnkgc3BlY2lmaWMgRkVBVFVSRVMgZmxhZyBpcyB0cnV0aHkuCisgIAorICAgIFRoaXMg
bWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGluIGRlYnVnIGNhbmFyeSBidWlsZHMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfd2FybklmVXNpbmdTdHJpcHBlZEZlYXR1cmVG
bGFncworICAgIEByZXR1cm4ge3ZvaWR9CisgICovCisKKyAgZnVuY3Rpb24gX3dhcm5JZlVzaW5n
U3RyaXBwZWRGZWF0dXJlRmxhZ3MoRkVBVFVSRVMsIGtub3duRmVhdHVyZXMsIGZlYXR1cmVzV2Vy
ZVN0cmlwcGVkKSB7CisgICAgaWYgKGZlYXR1cmVzV2VyZVN0cmlwcGVkKSB7CisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLndhcm4oJ0VtYmVyLkVOVi5FTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVMgaXMg
b25seSBhdmFpbGFibGUgaW4gY2FuYXJ5IGJ1aWxkcy4nLCAhX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQuRU5WLkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFUywgeyBpZDogJ2VtYmVyLWRlYnVnLmZlYXR1
cmUtZmxhZy13aXRoLWZlYXR1cmVzLXN0cmlwcGVkJyB9KTsKKworICAgICAgdmFyIGtleXMgPSBP
YmplY3Qua2V5cyhGRUFUVVJFUyB8fCB7fSk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtl
eXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGtleSA9IGtleXNbaV07CisgICAgICAgIGlm
IChrZXkgPT09ICdpc0VuYWJsZWQnIHx8ICEoa2V5IGluIGtub3duRmVhdHVyZXMpKSB7CisgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndh
cm4oJ0ZFQVRVUkVbIicgKyBrZXkgKyAnIl0gaXMgc2V0IGFzIGVuYWJsZWQsIGJ1dCBGRUFUVVJF
IGZsYWdzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBjYW5hcnkgYnVpbGRzLicsICFGRUFUVVJFU1tr
ZXldLCB7IGlkOiAnZW1iZXItZGVidWcuZmVhdHVyZS1mbGFnLXdpdGgtZmVhdHVyZXMtc3RyaXBw
ZWQnIH0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQudGVzdGluZykgeworICAgIC8vIENvbXBsYWluIGlmIHRoZXkncmUgdXNpbmcgRkVBVFVS
RSBmbGFncyBpbiBidWlsZHMgb3RoZXIgdGhhbiBjYW5hcnkKKyAgICBfZW1iZXJNZXRhbEZlYXR1
cmVzLkZFQVRVUkVTWydmZWF0dXJlcy1zdHJpcHBlZC10ZXN0J10gPSB0cnVlOworICAgIHZhciBm
ZWF0dXJlc1dlcmVTdHJpcHBlZCA9IHRydWU7CisKKyAgICBkZWxldGUgX2VtYmVyTWV0YWxGZWF0
dXJlcy5GRUFUVVJFU1snZmVhdHVyZXMtc3RyaXBwZWQtdGVzdCddOworICAgIF93YXJuSWZVc2lu
Z1N0cmlwcGVkRmVhdHVyZUZsYWdzKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5GRUFUVVJF
UywgX2VtYmVyTWV0YWxGZWF0dXJlcy5LTk9XTl9GRUFUVVJFUywgZmVhdHVyZXNXZXJlU3RyaXBw
ZWQpOworCisgICAgLy8gSW5mb3JtIHRoZSBkZXZlbG9wZXIgYWJvdXQgdGhlIEVtYmVyIEluc3Bl
Y3RvciBpZiBub3QgaW5zdGFsbGVkLgorICAgIHZhciBpc0ZpcmVmb3ggPSBfZW1iZXJNZXRhbEVu
dmlyb25tZW50LmRlZmF1bHQuaXNGaXJlZm94OworICAgIHZhciBpc0Nocm9tZSA9IF9lbWJlck1l
dGFsRW52aXJvbm1lbnQuZGVmYXVsdC5pc0Nocm9tZTsKKworICAgIGlmICh0eXBlb2Ygd2luZG93
ICE9PSAndW5kZWZpbmVkJyAmJiAoaXNGaXJlZm94IHx8IGlzQ2hyb21lKSAmJiB3aW5kb3cuYWRk
RXZlbnRMaXN0ZW5lcikgeworICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBm
dW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50LmRhdGFzZXQgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dC5kYXRhc2V0LmVtYmVyRXh0ZW5zaW9uKSB7CisgICAgICAgICAgdmFyIGRvd25sb2FkVVJMOwor
CisgICAgICAgICAgaWYgKGlzQ2hyb21lKSB7CisgICAgICAgICAgICBkb3dubG9hZFVSTCA9ICdo
dHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9lbWJlci1pbnNwZWN0b3Iv
Ym1kYmxuY2Vna2Vua2FjaWVpaGZocGpmcHBvY29uaGknOworICAgICAgICAgIH0gZWxzZSBpZiAo
aXNGaXJlZm94KSB7CisgICAgICAgICAgICBkb3dubG9hZFVSTCA9ICdodHRwczovL2FkZG9ucy5t
b3ppbGxhLm9yZy9lbi1VUy9maXJlZm94L2FkZG9uL2VtYmVyLWluc3BlY3Rvci8nOworICAgICAg
ICAgIH0KKworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVidWcoJ0ZvciBtb3JlIGFkdmFu
Y2VkIGRlYnVnZ2luZywgaW5zdGFsbCB0aGUgRW1iZXIgSW5zcGVjdG9yIGZyb20gJyArIGRvd25s
b2FkVVJMKTsKKyAgICAgICAgfQorICAgICAgfSwgZmFsc2UpOworICAgIH0KKyAgfQorICAvKioK
KyAgICBAcHVibGljCisgICAgQGNsYXNzIEVtYmVyLkRlYnVnCisgICovCisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LkRlYnVnID0ge307CisKKyAgLyoqCisgICAgQWxsb3dzIGZvciBydW50aW1l
IHJlZ2lzdHJhdGlvbiBvZiBoYW5kbGVyIGZ1bmN0aW9ucyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZh
dWx0IGRlcHJlY2F0aW9uIGJlaGF2aW9yLgorICAgIERlcHJlY2F0aW9ucyBhcmUgaW52b2tlZCBi
eSBjYWxscyB0byBbRW1iZXIuZGVwcmVjYXRlXShodHRwOi8vZW1iZXJqcy5jb20vYXBpL2NsYXNz
ZXMvRW1iZXIuaHRtbCNtZXRob2RfZGVwcmVjYXRlKS4KKyAgICBUaGUgZm9sbG93aW5nIGV4YW1w
bGUgZGVtb25zdHJhdGVzIGl0cyB1c2FnZSBieSByZWdpc3RlcmluZyBhIGhhbmRsZXIgdGhhdCB0
aHJvd3MgYW4gZXJyb3IgaWYgdGhlCisgICAgbWVzc2FnZSBjb250YWlucyB0aGUgd29yZCAic2hv
dWxkIiwgb3RoZXJ3aXNlIGRlZmVycyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgRW1iZXIuRGVidWcucmVnaXN0ZXJEZXByZWNhdGlvbkhhbmRsZXIo
KG1lc3NhZ2UsIG9wdGlvbnMsIG5leHQpID0+IHsKKyAgICAgIGlmIChtZXNzYWdlLmluZGV4T2Yo
J3Nob3VsZCcpICE9PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcHJlY2F0aW9u
IG1lc3NhZ2Ugd2l0aCBzaG91bGQ6ICR7bWVzc2FnZX1gKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIC8vIGRlZmVyIHRvIHdoYXRldmVyIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgYmVmb3JlIHRo
aXMgb25lCisgICAgICAgIG5leHQobWVzc2FnZSwgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQor
ICAgIGBgYAorICAKKyAgICBUaGUgaGFuZGxlciBmdW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5n
IGFyZ3VtZW50czoKKyAgCisgICAgPHVsPgorICAgICAgPGxpPiA8Y29kZT5tZXNzYWdlPC9jb2Rl
PiAtIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGRlcHJlY2F0aW9uIGNhbGwuPC9saT4K
KyAgICAgIDxsaT4gPGNvZGU+b3B0aW9uczwvY29kZT4gLSBBbiBvYmplY3QgcGFzc2VkIGluIHdp
dGggdGhlIGRlcHJlY2F0aW9uIGNhbGwgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9u
IGluY2x1ZGluZzo8L2xpPgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPiA8Y29kZT5pZDwv
Y29kZT4gLSBBbiBpZCBvZiB0aGUgZGVwcmVjYXRpb24gaW4gdGhlIGZvcm0gb2YgPGNvZGU+cGFj
a2FnZS1uYW1lLnNwZWNpZmljLWRlcHJlY2F0aW9uPC9jb2RlPi48L2xpPgorICAgICAgICAgIDxs
aT4gPGNvZGU+dW50aWw8L2NvZGU+IC0gVGhlIEVtYmVyIHZlcnNpb24gbnVtYmVyIHRoZSBmZWF0
dXJlIGFuZCBkZXByZWNhdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4uPC9saT4KKyAgICAgICAgPC91
bD4KKyAgICAgIDxsaT4gPGNvZGU+bmV4dDwvY29kZT4gLSBBIGZ1bmN0aW9uIHRoYXQgY2FsbHMg
aW50byB0aGUgcHJldmlvdXNseSByZWdpc3RlcmVkIGhhbmRsZXIuPC9saT4KKyAgICA8L3VsPgor
ICAKKyAgICBAcHVibGljCisgICAgQHN0YXRpYworICAgIEBtZXRob2QgcmVnaXN0ZXJEZXByZWNh
dGlvbkhhbmRsZXIKKyAgICBAcGFyYW0gaGFuZGxlciB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8g
aGFuZGxlIGRlcHJlY2F0aW9uIGNhbGxzLgorICAgIEBzaW5jZSAyLjEuMAorICAqLworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5EZWJ1Zy5yZWdpc3RlckRlcHJlY2F0aW9uSGFuZGxlciA9IF9l
bWJlckRlYnVnRGVwcmVjYXRlLnJlZ2lzdGVySGFuZGxlcjsKKyAgLyoqCisgICAgQWxsb3dzIGZv
ciBydW50aW1lIHJlZ2lzdHJhdGlvbiBvZiBoYW5kbGVyIGZ1bmN0aW9ucyB0aGF0IG92ZXJyaWRl
IHRoZSBkZWZhdWx0IHdhcm5pbmcgYmVoYXZpb3IuCisgICAgV2FybmluZ3MgYXJlIGludm9rZWQg
YnkgY2FsbHMgbWFkZSB0byBbRW1iZXIud2Fybl0oaHR0cDovL2VtYmVyanMuY29tL2FwaS9jbGFz
c2VzL0VtYmVyLmh0bWwjbWV0aG9kX3dhcm4pLgorICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBk
ZW1vbnN0cmF0ZXMgaXRzIHVzYWdlIGJ5IHJlZ2lzdGVyaW5nIGEgaGFuZGxlciB0aGF0IGRvZXMg
bm90aGluZyBvdmVycmlkaW5nIEVtYmVyJ3MKKyAgICBkZWZhdWx0IHdhcm5pbmcgYmVoYXZpb3Iu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICAvLyBuZXh0IGlzIG5vdCBjYWxsZWQsIHNvIG5v
IHdhcm5pbmdzIGdldCB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgIEVtYmVyLkRlYnVnLnJlZ2lz
dGVyV2FybkhhbmRsZXIoKCkgPT4ge30pOworICAgIGBgYAorICAKKyAgICBUaGUgaGFuZGxlciBm
dW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAgCisgICAgPHVsPgorICAg
ICAgPGxpPiA8Y29kZT5tZXNzYWdlPC9jb2RlPiAtIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20g
dGhlIHdhcm4gY2FsbC4gPC9saT4KKyAgICAgIDxsaT4gPGNvZGU+b3B0aW9uczwvY29kZT4gLSBB
biBvYmplY3QgcGFzc2VkIGluIHdpdGggdGhlIHdhcm4gY2FsbCBjb250YWluaW5nIGFkZGl0aW9u
YWwgaW5mb3JtYXRpb24gaW5jbHVkaW5nOjwvbGk+CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8
bGk+IDxjb2RlPmlkPC9jb2RlPiAtIEFuIGlkIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmb3JtIG9m
IDxjb2RlPnBhY2thZ2UtbmFtZS5zcGVjaWZpYy13YXJuaW5nPC9jb2RlPi48L2xpPgorICAgICAg
ICA8L3VsPgorICAgICAgPGxpPiA8Y29kZT5uZXh0PC9jb2RlPiAtIEEgZnVuY3Rpb24gdGhhdCBj
YWxscyBpbnRvIHRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaGFuZGxlci48L2xpPgorICAgIDwv
dWw+CisgIAorICAgIEBwdWJsaWMKKyAgICBAc3RhdGljCisgICAgQG1ldGhvZCByZWdpc3Rlcldh
cm5IYW5kbGVyCisgICAgQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIGhh
bmRsZSB3YXJuaW5ncy4KKyAgICBAc2luY2UgMi4xLjAKKyAgKi8KKyAgX2VtYmVyTWV0YWxDb3Jl
LmRlZmF1bHQuRGVidWcucmVnaXN0ZXJXYXJuSGFuZGxlciA9IF9lbWJlckRlYnVnV2Fybi5yZWdp
c3RlckhhbmRsZXI7CisKKyAgLyoKKyAgICBXZSBhcmUgdHJhbnNpdGlvbmluZyBhd2F5IGZyb20g
YGVtYmVyLmpzYCB0byBgZW1iZXIuZGVidWcuanNgIHRvIG1ha2UKKyAgICBpdCBtdWNoIGNsZWFy
ZXIgdGhhdCBpdCBpcyBvbmx5IGZvciBsb2NhbCBkZXZlbG9wbWVudCBwdXJwb3Nlcy4KKyAgCisg
ICAgVGhpcyBmbGFnIHZhbHVlIGlzIGNoYW5nZWQgYnkgdGhlIHRvb2xpbmcgKGJ5IGEgc2ltcGxl
IHN0cmluZyByZXBsYWNlbWVudCkKKyAgICBzbyB0aGF0IGlmIGBlbWJlci5qc2AgKHdoaWNoIG11
c3QgYmUgb3V0cHV0IGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMpIGlzCisgICAgdXNlZCBh
IG5pY2UgaGVscGZ1bCB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIG91dC4KKyAgKi8K
KyAgdmFyIHJ1bm5pbmdOb25FbWJlckRlYnVnSlMgPSBmYWxzZTsKKyAgZXhwb3J0cy5ydW5uaW5n
Tm9uRW1iZXJEZWJ1Z0pTID0gcnVubmluZ05vbkVtYmVyRGVidWdKUzsKKyAgaWYgKHJ1bm5pbmdO
b25FbWJlckRlYnVnSlMpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ1BsZWFzZSB1c2Ug
YGVtYmVyLmRlYnVnLmpzYCBpbnN0ZWFkIG9mIGBlbWJlci5qc2AgZm9yIGRldmVsb3BtZW50IGFu
ZCBkZWJ1Z2dpbmcuJyk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1kZWJ1Zy93YXJuJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL2xvZ2dlcicsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJl
ci1kZWJ1Zy9oYW5kbGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxMb2dnZXIs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlckRlYnVnSGFuZGxlcnMpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIHZhciBfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CisgIGV4cG9ydHMucmVn
aXN0ZXJIYW5kbGVyID0gcmVnaXN0ZXJIYW5kbGVyOworICBleHBvcnRzLmRlZmF1bHQgPSB3YXJu
OworCisgIGZ1bmN0aW9uIHJlZ2lzdGVySGFuZGxlcihoYW5kbGVyKSB7CisgICAgX2VtYmVyRGVi
dWdIYW5kbGVycy5yZWdpc3RlckhhbmRsZXIoJ3dhcm4nLCBoYW5kbGVyKTsKKyAgfQorCisgIHJl
Z2lzdGVySGFuZGxlcihmdW5jdGlvbiBsb2dXYXJuaW5nKG1lc3NhZ2UsIG9wdGlvbnMpIHsKKyAg
ICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ1dBUk5JTkc6ICcgKyBtZXNzYWdlKTsK
KyAgICBpZiAoJ3RyYWNlJyBpbiBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0KSB7CisgICAgICBf
ZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0LnRyYWNlKCk7CisgICAgfQorICB9KTsKKworICB2YXIg
bWlzc2luZ09wdGlvbnNEZXByZWNhdGlvbiA9ICdXaGVuIGNhbGxpbmcgYEVtYmVyLndhcm5gIHlv
dSAnICsgJ211c3QgcHJvdmlkZSBhbiBgb3B0aW9uc2AgaGFzaCBhcyB0aGUgdGhpcmQgcGFyYW1l
dGVyLiAgJyArICdgb3B0aW9uc2Agc2hvdWxkIGluY2x1ZGUgYW4gYGlkYCBwcm9wZXJ0eS4nOwor
ICBleHBvcnRzLm1pc3NpbmdPcHRpb25zRGVwcmVjYXRpb24gPSBtaXNzaW5nT3B0aW9uc0RlcHJl
Y2F0aW9uOworICB2YXIgbWlzc2luZ09wdGlvbnNJZERlcHJlY2F0aW9uID0gJ1doZW4gY2FsbGlu
ZyBgRW1iZXIud2FybmAgeW91IG11c3QgcHJvdmlkZSBgaWRgIGluIG9wdGlvbnMuJzsKKworICBl
eHBvcnRzLm1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiA9IG1pc3NpbmdPcHRpb25zSWREZXBy
ZWNhdGlvbjsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1kZWJ1
ZworICAqLworCisgIC8qKgorICAgIERpc3BsYXkgYSB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVk
IG1lc3NhZ2UuCisgIAorICAgICogSW4gYSBwcm9kdWN0aW9uIGJ1aWxkLCB0aGlzIG1ldGhvZCBp
cyBkZWZpbmVkIGFzIGFuIGVtcHR5IGZ1bmN0aW9uIChOT1ApLgorICAgIFVzZXMgb2YgdGhpcyBt
ZXRob2QgaW4gRW1iZXIgaXRzZWxmIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBlbWJlci5wcm9kLmpz
IGJ1aWxkLgorICAKKyAgICBAbWV0aG9kIHdhcm4KKyAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2Fn
ZSBBIHdhcm5pbmcgdG8gZGlzcGxheS4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IHRlc3QgQW4gb3B0
aW9uYWwgYm9vbGVhbi4gSWYgZmFsc3ksIHRoZSB3YXJuaW5nCisgICAgICB3aWxsIGJlIGRpc3Bs
YXllZC4KKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBjYW4gYmUg
dXNlZCB0byBwYXNzIGEgdW5pcXVlCisgICAgICBgaWRgIGZvciB0aGlzIHdhcm5pbmcuICBUaGUg
YGlkYCBjYW4gYmUgdXNlZCBieSBFbWJlciBkZWJ1Z2dpbmcgdG9vbHMKKyAgICAgIHRvIGNoYW5n
ZSB0aGUgYmVoYXZpb3IgKHJhaXNlLCBsb2csIG9yIHNpbGVuY2UpIGZvciB0aGF0IHNwZWNpZmlj
IHdhcm5pbmcuCisgICAgICBUaGUgYGlkYCBzaG91bGQgYmUgbmFtZXNwYWNlZCBieSBkb3RzLCBl
LmcuICJlbWJlci1kZWJ1Zy5mZWF0dXJlLWZsYWctd2l0aC1mZWF0dXJlcy1zdHJpcHBlZCIKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHdhcm4obWVzc2Fn
ZSwgdGVzdCwgb3B0aW9ucykgeworICAgIGlmICghb3B0aW9ucykgeworICAgICAgX2VtYmVyTWV0
YWxEZWJ1Zy5kZXByZWNhdGUobWlzc2luZ09wdGlvbnNEZXByZWNhdGlvbiwgZmFsc2UsIHsKKyAg
ICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy53YXJuLW9wdGlvbnMtbWlzc2luZycsCisgICAgICAgIHVu
dGlsOiAnMy4wLjAnLAorICAgICAgICB1cmw6ICdodHRwOi8vZW1iZXJqcy5jb20vZGVwcmVjYXRp
b25zL3YyLngvI3RvY19lbWJlci1kZWJ1Zy1mdW5jdGlvbi1vcHRpb25zJworICAgICAgfSk7Cisg
ICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiYgIW9wdGlvbnMuaWQpIHsKKyAgICAgIF9lbWJlck1l
dGFsRGVidWcuZGVwcmVjYXRlKG1pc3NpbmdPcHRpb25zSWREZXByZWNhdGlvbiwgZmFsc2UsIHsK
KyAgICAgICAgaWQ6ICdlbWJlci1kZWJ1Zy53YXJuLWlkLW1pc3NpbmcnLAorICAgICAgICB1bnRp
bDogJzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9u
cy92Mi54LyN0b2NfZW1iZXItZGVidWctZnVuY3Rpb24tb3B0aW9ucycKKyAgICAgIH0pOworICAg
IH0KKworICAgIF9lbWJlckRlYnVnSGFuZGxlcnMuaW52b2tlLmFwcGx5KHVuZGVmaW5lZCwgWyd3
YXJuJ10uY29uY2F0KF9zbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2NvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vbmF0aXZlX2Fy
cmF5JywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc3RyaW5n
JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hbWVzcGFjZScsICdlbWJlci1ydW50aW1lL3N5c3Rl
bS9vYmplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUnVu
dGltZVN5c3RlbU5hdGl2ZV9hcnJheSwgX2VtYmVyUnVudGltZVV0aWxzLCBfZW1iZXJSdW50aW1l
U3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNwYWNlLCBfZW1iZXJSdW50aW1l
U3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWV4dGVuc2lvbi1zdXBwb3J0CisgICovCisKKyAgLyoqCisg
ICAgVGhlIGBDb250YWluZXJEZWJ1Z0FkYXB0ZXJgIGhlbHBzIHRoZSBjb250YWluZXIgYW5kIHJl
c29sdmVyIGludGVyZmFjZQorICAgIHdpdGggdG9vbHMgdGhhdCBkZWJ1ZyBFbWJlciBzdWNoIGFz
IHRoZQorICAgIFtFbWJlciBFeHRlbnNpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL2Vt
YmVyLWV4dGVuc2lvbikKKyAgICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94LgorICAKKyAgICBUaGlz
IGNsYXNzIGNhbiBiZSBleHRlbmRlZCBieSBhIGN1c3RvbSByZXNvbHZlciBpbXBsZW1lbnRlcgor
ICAgIHRvIG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMgd2l0aCBsaWJyYXJ5LXNwZWNpZmlj
IGNvZGUuCisgIAorICAgIFRoZSBtZXRob2RzIGxpa2VseSB0byBiZSBvdmVycmlkZGVuIGFyZToK
KyAgCisgICAgKiBgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGVgCisgICAgKiBgY2F0YWxvZ0VudHJp
ZXNCeVR5cGVgCisgIAorICAgIFRoZSBhZGFwdGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3RlcmVk
CisgICAgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgY29udGFpbmVyIGFzIGBjb250YWluZXItZGVidWct
YWRhcHRlcjptYWluYC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICJjb250YWluZXJEZWJ1
Z0FkYXB0ZXIiLAorICAKKyAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7
CisgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdjb250YWluZXItZGVidWctYWRhcHRlcjpt
YWluJywgcmVxdWlyZSgnYXBwL2NvbnRhaW5lci1kZWJ1Zy1hZGFwdGVyJykpOworICAgICAgfQor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgQ29udGFpbmVyRGVidWdBZGFwdGVyCisg
ICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBzaW5j
ZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVu
dGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgLyoqCisgICAgICBUaGUgcmVz
b2x2ZXIgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICBiZWluZyBkZWJ1Z2dlZC4g
VGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGluamVjdGVkCisgICAgICBvbiBjcmVhdGlvbi4KKyAgICAg
ICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMK
KyAgICAqLworICAgIHJlc29sdmVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRy
dWUgaWYgaXQgaXMgcG9zc2libGUgdG8gY2F0YWxvZyBhIGxpc3Qgb2YgYXZhaWxhYmxlCisgICAg
ICBjbGFzc2VzIGluIHRoZSByZXNvbHZlciBmb3IgYSBnaXZlbiB0eXBlLgorICAgICAgIEBtZXRo
b2QgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRo
ZSB0eXBlLiBlLmcuICJtb2RlbCIsICJjb250cm9sbGVyIiwgInJvdXRlIi4KKyAgICAgIEByZXR1
cm4ge2Jvb2xlYW59IHdoZXRoZXIgYSBsaXN0IGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlLgor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgY2FuQ2F0YWxvZ0VudHJpZXNCeVR5cGU6IGZ1bmN0
aW9uICh0eXBlKSB7CisgICAgICBpZiAodHlwZSA9PT0gJ21vZGVsJyB8fCB0eXBlID09PSAndGVt
cGxhdGUnKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgYXZhaWxhYmxlIGNs
YXNzZXMgYSBnaXZlbiB0eXBlLgorICAgICAgIEBtZXRob2QgY2F0YWxvZ0VudHJpZXNCeVR5cGUK
KyAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSB0eXBlLiBlLmcuICJtb2RlbCIsICJjb250
cm9sbGVyIiwgInJvdXRlIi4KKyAgICAgIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBzdHJp
bmdzLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2F0YWxvZ0VudHJpZXNCeVR5cGU6IGZ1
bmN0aW9uICh0eXBlKSB7CisgICAgICB2YXIgbmFtZXNwYWNlcyA9IF9lbWJlclJ1bnRpbWVTeXN0
ZW1OYXRpdmVfYXJyYXkuQShfZW1iZXJSdW50aW1lU3lzdGVtTmFtZXNwYWNlLmRlZmF1bHQuTkFN
RVNQQUNFUyk7CisgICAgICB2YXIgdHlwZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2Fy
cmF5LkEoKTsKKyAgICAgIHZhciB0eXBlU3VmZml4UmVnZXggPSBuZXcgUmVnRXhwKF9lbWJlclJ1
bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkodHlwZSkgKyAnJCcpOworCisgICAgICBuYW1lc3Bh
Y2VzLmZvckVhY2goZnVuY3Rpb24gKG5hbWVzcGFjZSkgeworICAgICAgICBpZiAobmFtZXNwYWNl
ICE9PSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdCkgeworICAgICAgICAgIGZvciAodmFyIGtleSBp
biBuYW1lc3BhY2UpIHsKKyAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmhhc093blByb3BlcnR5
KGtleSkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAodHlwZVN1ZmZpeFJlZ2V4LnRlc3Qoa2V5KSkgeworICAgICAgICAgICAgICB2YXIg
a2xhc3MgPSBuYW1lc3BhY2Vba2V5XTsKKyAgICAgICAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVV
dGlscy50eXBlT2Yoa2xhc3MpID09PSAnY2xhc3MnKSB7CisgICAgICAgICAgICAgICAgdHlwZXMu
cHVzaChfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShrZXkucmVwbGFjZSh0eXBl
U3VmZml4UmVnZXgsICcnKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0eXBlczsKKyAgICB9
CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLWV4dGVuc2lvbi1zdXBwb3J0L2RhdGFfYWRhcHRl
cicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwv
cnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc3RyaW5nJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL25hbWVzcGFjZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXIt
cnVudGltZS9zeXN0ZW0vbmF0aXZlX2FycmF5JywgJ2VtYmVyLWFwcGxpY2F0aW9uL3N5c3RlbS9h
cHBsaWNhdGlvbicsICdjb250YWluZXIvb3duZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvYXJy
YXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJN
ZXRhbFJ1bl9sb29wLCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLCBfZW1iZXJSdW50aW1lU3lz
dGVtTmFtZXNwYWNlLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1lU3lz
dGVtTmF0aXZlX2FycmF5LCBfZW1iZXJBcHBsaWNhdGlvblN5c3RlbUFwcGxpY2F0aW9uLCBfY29u
dGFpbmVyT3duZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheSkgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1leHRlbnNpb24t
c3VwcG9ydAorICAqLworCisgIC8qKgorICAgIFRoZSBgRGF0YUFkYXB0ZXJgIGhlbHBzIGEgZGF0
YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5CisgICAgaW50ZXJmYWNlIHdpdGggdG9vbHMgdGhhdCBkZWJ1
ZyBFbWJlciBzdWNoCisgICAgYXMgdGhlIFtFbWJlciBFeHRlbnNpb25dKGh0dHBzOi8vZ2l0aHVi
LmNvbS90aWxkZWlvL2VtYmVyLWV4dGVuc2lvbikKKyAgICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94
LgorICAKKyAgICBUaGlzIGNsYXNzIHdpbGwgYmUgZXh0ZW5kZWQgYnkgYSBwZXJzaXN0ZW5jZSBs
aWJyYXJ5CisgICAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzIHdpdGgK
KyAgICBsaWJyYXJ5LXNwZWNpZmljIGNvZGUuCisgIAorICAgIFRoZSBtZXRob2RzIGxpa2VseSB0
byBiZSBvdmVycmlkZGVuIGFyZToKKyAgCisgICAgKiBgZ2V0RmlsdGVyc2AKKyAgICAqIGBkZXRl
Y3RgCisgICAgKiBgY29sdW1uc0ZvclR5cGVgCisgICAgKiBgZ2V0UmVjb3Jkc2AKKyAgICAqIGBn
ZXRSZWNvcmRDb2x1bW5WYWx1ZXNgCisgICAgKiBgZ2V0UmVjb3JkS2V5d29yZHNgCisgICAgKiBg
Z2V0UmVjb3JkRmlsdGVyVmFsdWVzYAorICAgICogYGdldFJlY29yZENvbG9yYAorICAgICogYG9i
c2VydmVSZWNvcmRgCisgIAorICAgIFRoZSBhZGFwdGVyIHdpbGwgbmVlZCB0byBiZSByZWdpc3Rl
cmVkCisgICAgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgY29udGFpbmVyIGFzIGBkYXRhQWRhcHRlcjpt
YWluYC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcGxp
Y2F0aW9uLmluaXRpYWxpemVyKHsKKyAgICAgIG5hbWU6ICJkYXRhLWFkYXB0ZXIiLAorICAKKyAg
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGFwcGxpY2F0aW9uKSB7CisgICAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCdkYXRhLWFkYXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVyKTsKKyAgICAg
IH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQGNsYXNzIERhdGFBZGFwdGVyCisgICAgQG5h
bWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyT2JqZWN0CisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQu
ZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgdGhpcy5yZWxlYXNlTWV0aG9kcyA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRo
ZSBjb250YWluZXItZGVidWctYWRhcHRlciB3aGljaCBpcyB1c2VkCisgICAgICB0byBsaXN0IGFs
bCBtb2RlbHMuCisgICAgICAgQHByb3BlcnR5IGNvbnRhaW5lckRlYnVnQWRhcHRlcgorICAgICAg
QGRlZmF1bHQgdW5kZWZpbmVkCisgICAgICBAc2luY2UgMS41LjAKKyAgICAgIEBwdWJsaWMKKyAg
ICAqKi8KKyAgICBjb250YWluZXJEZWJ1Z0FkYXB0ZXI6IHVuZGVmaW5lZCwKKworICAgIC8qKgor
ICAgICAgVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHRvIHNlbmQKKyAgICAgIGFzIGNvbHVtbnMu
IChFbm91Z2ggdG8gbWFrZSB0aGUgcmVjb3JkCisgICAgICBpZGVudGlmaWFibGUpLgorICAgICAg
IEBwcml2YXRlCisgICAgICBAcHJvcGVydHkgYXR0cmlidXRlTGltaXQKKyAgICAgIEBkZWZhdWx0
IDMKKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICovCisgICAgYXR0cmlidXRlTGltaXQ6IDMsCisK
KyAgICAvKioKKyAgICAgICBFbWJlciBEYXRhID4gdjEuMC4wLWJldGEuMTgKKyAgICAgICByZXF1
aXJlcyBzdHJpbmcgbW9kZWwgbmFtZXMgdG8gYmUgcGFzc2VkCisgICAgICAgYXJvdW5kIGluc3Rl
YWQgb2YgdGhlIGFjdHVhbCBmYWN0b3JpZXMuCisgICAgICAgIFRoaXMgaXMgYSBzdGFtcCBmb3Ig
dGhlIEVtYmVyIEluc3BlY3RvcgorICAgICAgIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUg
dmVyc2lvbnMKKyAgICAgICB0byBiZSBhYmxlIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgdG9v
LgorICAgICAgICBAcHVibGljCisgICAgICAgQHByb3BlcnR5IGFjY2VwdHNNb2RlbE5hbWUKKyAg
ICAgKi8KKyAgICBhY2NlcHRzTW9kZWxOYW1lOiB0cnVlLAorCisgICAgLyoqCisgICAgICBTdG9y
ZXMgYWxsIG1ldGhvZHMgdGhhdCBjbGVhciBvYnNlcnZlcnMuCisgICAgICBUaGVzZSBtZXRob2Rz
IHdpbGwgYmUgY2FsbGVkIG9uIGRlc3RydWN0aW9uLgorICAgICAgIEBwcml2YXRlCisgICAgICBA
cHJvcGVydHkgcmVsZWFzZU1ldGhvZHMKKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICovCisgICAg
cmVsZWFzZU1ldGhvZHM6IF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSgpLAorCisg
ICAgLyoqCisgICAgICBTcGVjaWZpZXMgaG93IHJlY29yZHMgY2FuIGJlIGZpbHRlcmVkLgorICAg
ICAgUmVjb3JkcyByZXR1cm5lZCB3aWxsIG5lZWQgdG8gaGF2ZSBhIGBmaWx0ZXJWYWx1ZXNgCisg
ICAgICBwcm9wZXJ0eSB3aXRoIGEga2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBh
cnJheS4KKyAgICAgICBAcHVibGljCisgICAgICBAbWV0aG9kIGdldEZpbHRlcnMKKyAgICAgIEBy
ZXR1cm4ge0FycmF5fSBMaXN0IG9mIG9iamVjdHMgZGVmaW5pbmcgZmlsdGVycy4KKyAgICAgICBU
aGUgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5hbWVgIGFuZCBgZGVzY2AgcHJvcGVydHkuCisgICAg
Ki8KKyAgICBnZXRGaWx0ZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUnVu
dGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgRmV0
Y2ggdGhlIG1vZGVsIHR5cGVzIGFuZCBvYnNlcnZlIHRoZW0gZm9yIGNoYW5nZXMuCisgICAgICAg
QHB1YmxpYworICAgICAgQG1ldGhvZCB3YXRjaE1vZGVsVHlwZXMKKyAgICAgICBAcGFyYW0ge0Z1
bmN0aW9ufSB0eXBlc0FkZGVkIENhbGxiYWNrIHRvIGNhbGwgdG8gYWRkIHR5cGVzLgorICAgICAg
VGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBwZWQgdHlwZXMgKHJldHVy
bmVkIGZyb20gYHdyYXBNb2RlbFR5cGVgKS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBl
c1VwZGF0ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgdHlwZSBoYXMgY2hhbmdlZC4KKyAgICAg
IFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHR5cGVzLgorICAg
ICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBNZXRob2QgdG8gY2FsbCB0byByZW1vdmUgYWxsIG9ic2Vy
dmVycworICAgICovCisgICAgd2F0Y2hNb2RlbFR5cGVzOiBmdW5jdGlvbiAodHlwZXNBZGRlZCwg
dHlwZXNVcGRhdGVkKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2YXIgbW9k
ZWxUeXBlcyA9IHRoaXMuZ2V0TW9kZWxUeXBlcygpOworICAgICAgdmFyIHJlbGVhc2VNZXRob2Rz
ID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgICB2YXIgdHlwZXNU
b1NlbmQ7CisKKyAgICAgIHR5cGVzVG9TZW5kID0gbW9kZWxUeXBlcy5tYXAoZnVuY3Rpb24gKHR5
cGUpIHsKKyAgICAgICAgdmFyIGtsYXNzID0gdHlwZS5rbGFzczsKKyAgICAgICAgdmFyIHdyYXBw
ZWQgPSBfdGhpcy53cmFwTW9kZWxUeXBlKGtsYXNzLCB0eXBlLm5hbWUpOworICAgICAgICByZWxl
YXNlTWV0aG9kcy5wdXNoKF90aGlzLm9ic2VydmVNb2RlbFR5cGUodHlwZS5uYW1lLCB0eXBlc1Vw
ZGF0ZWQpKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQ7CisgICAgICB9KTsKKworICAgICAgdHlw
ZXNBZGRlZCh0eXBlc1RvU2VuZCk7CisKKyAgICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24gKCkg
eworICAgICAgICByZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeworICAgICAg
ICAgIHJldHVybiBmbigpOworICAgICAgICB9KTsKKyAgICAgICAgX3RoaXMucmVsZWFzZU1ldGhv
ZHMucmVtb3ZlT2JqZWN0KHJlbGVhc2UpOworICAgICAgfTsKKyAgICAgIHRoaXMucmVsZWFzZU1l
dGhvZHMucHVzaE9iamVjdChyZWxlYXNlKTsKKyAgICAgIHJldHVybiByZWxlYXNlOworICAgIH0s
CisKKyAgICBfbmFtZVRvQ2xhc3M6IGZ1bmN0aW9uICh0eXBlKSB7CisgICAgICBpZiAodHlwZW9m
IHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHR5cGUgPSBfY29udGFpbmVyT3duZXIuZ2V0
T3duZXIodGhpcykuX2xvb2t1cEZhY3RvcnkoJ21vZGVsOicgKyB0eXBlKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiB0eXBlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEZldGNoIHRoZSByZWNv
cmRzIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgb2JzZXJ2ZSB0aGVtIGZvciBjaGFuZ2VzLgorICAgICAg
IEBwdWJsaWMKKyAgICAgIEBtZXRob2Qgd2F0Y2hSZWNvcmRzCisgICAgICAgQHBhcmFtIHtTdHJp
bmd9IG1vZGVsTmFtZSBUaGUgbW9kZWwgbmFtZS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBy
ZWNvcmRzQWRkZWQgQ2FsbGJhY2sgdG8gY2FsbCB0byBhZGQgcmVjb3Jkcy4KKyAgICAgIFRha2Vz
IGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCisgICAgICBU
aGUgb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAg
Y29sdW1uVmFsdWVzOiB7T2JqZWN0fSBUaGUga2V5IGFuZCB2YWx1ZSBvZiBhIHRhYmxlIGNlbGwu
CisgICAgICAgIG9iamVjdDoge09iamVjdH0gVGhlIGFjdHVhbCByZWNvcmQgb2JqZWN0LgorICAg
ICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZHNVcGRhdGVkIENhbGxiYWNrIHRvIGNhbGwgd2hl
biBhIHJlY29yZCBoYXMgY2hhbmdlZC4KKyAgICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMg
Y29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCisgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVj
b3Jkc1JlbW92ZWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhhcyByZW1vdmVkLgor
ICAgICAgVGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICBpbmRleDogVGhl
IGFycmF5IGluZGV4IHdoZXJlIHRoZSByZWNvcmRzIHdlcmUgcmVtb3ZlZC4KKyAgICAgICAgY291
bnQ6IFRoZSBudW1iZXIgb2YgcmVjb3JkcyByZW1vdmVkLgorICAgICAgIEByZXR1cm4ge0Z1bmN0
aW9ufSBNZXRob2QgdG8gY2FsbCB0byByZW1vdmUgYWxsIG9ic2VydmVycy4KKyAgICAqLworICAg
IHdhdGNoUmVjb3JkczogZnVuY3Rpb24gKG1vZGVsTmFtZSwgcmVjb3Jkc0FkZGVkLCByZWNvcmRz
VXBkYXRlZCwgcmVjb3Jkc1JlbW92ZWQpIHsKKyAgICAgIHZhciBfdGhpczIgPSB0aGlzOworCisg
ICAgICB2YXIgcmVsZWFzZU1ldGhvZHMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKyAgICAgIHZhciBrbGFzcyA9IHRoaXMuX25hbWVUb0NsYXNzKG1vZGVsTmFtZSk7Cisg
ICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3JkcyhrbGFzcywgbW9kZWxOYW1lKTsKKyAg
ICAgIHZhciByZWxlYXNlOworCisgICAgICB2YXIgcmVjb3JkVXBkYXRlZCA9IGZ1bmN0aW9uICh1
cGRhdGVkUmVjb3JkKSB7CisgICAgICAgIHJlY29yZHNVcGRhdGVkKFt1cGRhdGVkUmVjb3JkXSk7
CisgICAgICB9OworCisgICAgICB2YXIgcmVjb3Jkc1RvU2VuZCA9IHJlY29yZHMubWFwKGZ1bmN0
aW9uIChyZWNvcmQpIHsKKyAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChfdGhpczIub2JzZXJ2
ZVJlY29yZChyZWNvcmQsIHJlY29yZFVwZGF0ZWQpKTsKKyAgICAgICAgcmV0dXJuIF90aGlzMi53
cmFwUmVjb3JkKHJlY29yZCk7CisgICAgICB9KTsKKworICAgICAgdmFyIGNvbnRlbnREaWRDaGFu
Z2UgPSBmdW5jdGlvbiAoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Cisg
ICAgICAgIGZvciAodmFyIGkgPSBpZHg7IGkgPCBpZHggKyBhZGRlZENvdW50OyBpKyspIHsKKyAg
ICAgICAgICB2YXIgcmVjb3JkID0gX2VtYmVyUnVudGltZU1peGluc0FycmF5Lm9iamVjdEF0KGFy
cmF5LCBpKTsKKyAgICAgICAgICB2YXIgd3JhcHBlZCA9IF90aGlzMi53cmFwUmVjb3JkKHJlY29y
ZCk7CisgICAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChfdGhpczIub2JzZXJ2ZVJlY29yZChy
ZWNvcmQsIHJlY29yZFVwZGF0ZWQpKTsKKyAgICAgICAgICByZWNvcmRzQWRkZWQoW3dyYXBwZWRd
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdmVkQ291bnQpIHsKKyAgICAgICAgICBy
ZWNvcmRzUmVtb3ZlZChpZHgsIHJlbW92ZWRDb3VudCk7CisgICAgICAgIH0KKyAgICAgIH07CisK
KyAgICAgIHZhciBvYnNlcnZlciA9IHsgZGlkQ2hhbmdlOiBjb250ZW50RGlkQ2hhbmdlLCB3aWxs
Q2hhbmdlOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0g
fTsKKyAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRBcnJheU9ic2VydmVyKHJlY29y
ZHMsIHRoaXMsIG9ic2VydmVyKTsKKworICAgICAgcmVsZWFzZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsKKyAgICAgICAgICBm
bigpOworICAgICAgICB9KTsKKyAgICAgICAgX2VtYmVyUnVudGltZU1peGluc0FycmF5LnJlbW92
ZUFycmF5T2JzZXJ2ZXIocmVjb3JkcywgX3RoaXMyLCBvYnNlcnZlcik7CisgICAgICAgIF90aGlz
Mi5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFzZSk7CisgICAgICB9OworCisgICAg
ICByZWNvcmRzQWRkZWQocmVjb3Jkc1RvU2VuZCk7CisKKyAgICAgIHRoaXMucmVsZWFzZU1ldGhv
ZHMucHVzaE9iamVjdChyZWxlYXNlKTsKKyAgICAgIHJldHVybiByZWxlYXNlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIENsZWFyIGFsbCBvYnNlcnZlcnMgYmVmb3JlIGRlc3RydWN0aW9uCisg
ICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCB3aWxsRGVzdHJveQorICAgICovCisgICAgd2ls
bERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisgICAgICB0aGlzLnJlbGVhc2VNZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKGZu
KSB7CisgICAgICAgIGZuKCk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBE
ZXRlY3Qgd2hldGhlciBhIGNsYXNzIGlzIGEgbW9kZWwuCisgICAgICAgVGVzdCB0aGF0IGFnYWlu
c3QgdGhlIG1vZGVsIGNsYXNzCisgICAgICBvZiB5b3VyIHBlcnNpc3RlbmNlIGxpYnJhcnkuCisg
ICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZGV0ZWN0CisgICAgICBAcGFyYW0ge0NsYXNz
fSBrbGFzcyBUaGUgY2xhc3MgdG8gdGVzdC4KKyAgICAgIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVy
IHRoZSBjbGFzcyBpcyBhIG1vZGVsIGNsYXNzIG9yIG5vdC4KKyAgICAqLworICAgIGRldGVjdDog
ZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIC8q
KgorICAgICAgR2V0IHRoZSBjb2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5cGUuCisgICAgICAg
QHByaXZhdGUKKyAgICAgIEBtZXRob2QgY29sdW1uc0ZvclR5cGUKKyAgICAgIEBwYXJhbSB7Q2xh
c3N9IHR5cGUgVGhlIG1vZGVsIHR5cGUuCisgICAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkg
b2YgY29sdW1ucyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgICAgICBuYW1lOiB7U3RyaW5n
fSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uLgorICAgICAgIGRlc2M6IHtTdHJpbmd9IEh1bWFuaXpl
ZCBkZXNjcmlwdGlvbiAod2hhdCB3b3VsZCBzaG93IGluIGEgdGFibGUgY29sdW1uIG5hbWUpLgor
ICAgICovCisgICAgY29sdW1uc0ZvclR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7CisgICAgfSwKKworICAgIC8q
KgorICAgICAgQWRkcyBvYnNlcnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNzLgorICAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIG9ic2VydmVNb2RlbFR5cGUKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtb2RlbE5hbWUgVGhlIG1vZGVsIHR5cGUgbmFtZS4KKyAgICAgIEBwYXJhbSB7RnVuY3Rp
b259IHR5cGVzVXBkYXRlZCBDYWxsZWQgd2hlbiBhIHR5cGUgaXMgbW9kaWZpZWQuCisgICAgICBA
cmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcmVtb3ZlIG9ic2VydmVy
cy4KKyAgICAqLworCisgICAgb2JzZXJ2ZU1vZGVsVHlwZTogZnVuY3Rpb24gKG1vZGVsTmFtZSwg
dHlwZXNVcGRhdGVkKSB7CisgICAgICB2YXIgX3RoaXMzID0gdGhpczsKKworICAgICAgdmFyIGts
YXNzID0gdGhpcy5fbmFtZVRvQ2xhc3MobW9kZWxOYW1lKTsKKyAgICAgIHZhciByZWNvcmRzID0g
dGhpcy5nZXRSZWNvcmRzKGtsYXNzLCBtb2RlbE5hbWUpOworCisgICAgICB2YXIgb25DaGFuZ2Ug
PSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHR5cGVzVXBkYXRlZChbX3RoaXMzLndyYXBNb2RlbFR5
cGUoa2xhc3MsIG1vZGVsTmFtZSldKTsKKyAgICAgIH07CisgICAgICB2YXIgb2JzZXJ2ZXIgPSB7
CisgICAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgIF9lbWJlck1ldGFs
UnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCB0aGlzLCBvbkNoYW5nZSk7
CisgICAgICAgIH0sCisgICAgICAgIHdpbGxDaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAg
ICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgX2VtYmVyUnVudGlt
ZU1peGluc0FycmF5LmFkZEFycmF5T2JzZXJ2ZXIocmVjb3JkcywgdGhpcywgb2JzZXJ2ZXIpOwor
CisgICAgICB2YXIgcmVsZWFzZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgX2VtYmVyUnVudGlt
ZU1peGluc0FycmF5LnJlbW92ZUFycmF5T2JzZXJ2ZXIocmVjb3JkcywgX3RoaXMzLCBvYnNlcnZl
cik7CisgICAgICB9OworCisgICAgICByZXR1cm4gcmVsZWFzZTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBXcmFwcyBhIGdpdmVuIG1vZGVsIHR5cGUgYW5kIG9ic2VydmVzIGNoYW5nZXMgdG8g
aXQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgd3JhcE1vZGVsVHlwZQorICAgICAg
QHBhcmFtIHtDbGFzc30ga2xhc3MgQSBtb2RlbCBjbGFzcy4KKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBtb2RlbE5hbWUgTmFtZSBvZiB0aGUgY2xhc3MuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IENv
bnRhaW5zIHRoZSB3cmFwcGVkIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiB0byByZW1vdmUgb2JzZXJ2
ZXJzCisgICAgICBGb3JtYXQ6CisgICAgICAgIHR5cGU6IHtPYmplY3R9IFRoZSB3cmFwcGVkIHR5
cGUuCisgICAgICAgICAgVGhlIHdyYXBwZWQgdHlwZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6
CisgICAgICAgICAgICBuYW1lOiB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KKyAgICAg
ICAgICAgIGNvdW50OiB7SW50ZWdlcn0gVGhlIG51bWJlciBvZiByZWNvcmRzIGF2YWlsYWJsZS4K
KyAgICAgICAgICAgIGNvbHVtbnM6IHtDb2x1bW5zfSBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGRl
c2NyaWJlIHRoZSByZWNvcmQuCisgICAgICAgICAgICBvYmplY3Q6IHtDbGFzc30gVGhlIGFjdHVh
bCBNb2RlbCB0eXBlIGNsYXNzLgorICAgICAgICByZWxlYXNlOiB7RnVuY3Rpb259IFRoZSBmdW5j
dGlvbiB0byByZW1vdmUgb2JzZXJ2ZXJzLgorICAgICovCisgICAgd3JhcE1vZGVsVHlwZTogZnVu
Y3Rpb24gKGtsYXNzLCBuYW1lKSB7CisgICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jk
cyhrbGFzcywgbmFtZSk7CisgICAgICB2YXIgdHlwZVRvU2VuZDsKKworICAgICAgdHlwZVRvU2Vu
ZCA9IHsKKyAgICAgICAgbmFtZTogbmFtZSwKKyAgICAgICAgY291bnQ6IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldChyZWNvcmRzLCAnbGVuZ3RoJyksCisgICAgICAgIGNvbHVtbnM6IHRoaXMu
Y29sdW1uc0ZvclR5cGUoa2xhc3MpLAorICAgICAgICBvYmplY3Q6IGtsYXNzCisgICAgICB9Owor
CisgICAgICByZXR1cm4gdHlwZVRvU2VuZDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBGZXRj
aGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcworICAgICAgQHJldHVybiB7QXJyYXl9IEFy
cmF5IG9mIG1vZGVsIHR5cGVzLgorICAgICovCisgICAgZ2V0TW9kZWxUeXBlczogZnVuY3Rpb24g
KCkgeworICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CisKKyAgICAgIHZhciBjb250YWluZXJEZWJ1
Z0FkYXB0ZXIgPSB0aGlzLmdldCgnY29udGFpbmVyRGVidWdBZGFwdGVyJyk7CisgICAgICB2YXIg
dHlwZXM7CisKKyAgICAgIGlmIChjb250YWluZXJEZWJ1Z0FkYXB0ZXIuY2FuQ2F0YWxvZ0VudHJp
ZXNCeVR5cGUoJ21vZGVsJykpIHsKKyAgICAgICAgdHlwZXMgPSBjb250YWluZXJEZWJ1Z0FkYXB0
ZXIuY2F0YWxvZ0VudHJpZXNCeVR5cGUoJ21vZGVsJyk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICB0eXBlcyA9IHRoaXMuX2dldE9iamVjdHNPbk5hbWVzcGFjZXMoKTsKKyAgICAgIH0KKworICAg
ICAgLy8gTmV3IGFkYXB0ZXJzIHJldHVybiBzdHJpbmdzIGluc3RlYWQgb2YgY2xhc3Nlcy4KKyAg
ICAgIHR5cGVzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHR5cGVzKS5tYXAo
ZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBrbGFzczogX3Ro
aXM0Ll9uYW1lVG9DbGFzcyhuYW1lKSwKKyAgICAgICAgICBuYW1lOiBuYW1lCisgICAgICAgIH07
CisgICAgICB9KTsKKyAgICAgIHR5cGVzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJh
eS5BKHR5cGVzKS5maWx0ZXIoZnVuY3Rpb24gKHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIF90aGlz
NC5kZXRlY3QodHlwZS5rbGFzcyk7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuQSh0eXBlcyk7CisgICAgfSwKKworICAgIC8qKgorICAg
ICAgTG9vcHMgb3ZlciBhbGwgbmFtZXNwYWNlcyBhbmQgYWxsIG9iamVjdHMKKyAgICAgIGF0dGFj
aGVkIHRvIHRoZW0uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgX2dldE9iamVjdHNP
bk5hbWVzcGFjZXMKKyAgICAgIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiBtb2RlbCB0eXBlIHN0
cmluZ3MuCisgICAgKi8KKyAgICBfZ2V0T2JqZWN0c09uTmFtZXNwYWNlczogZnVuY3Rpb24gKCkg
eworICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CisKKyAgICAgIHZhciBuYW1lc3BhY2VzID0gX2Vt
YmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1lc3Bh
Y2UuZGVmYXVsdC5OQU1FU1BBQ0VTKTsKKyAgICAgIHZhciB0eXBlcyA9IF9lbWJlclJ1bnRpbWVT
eXN0ZW1OYXRpdmVfYXJyYXkuQSgpOworCisgICAgICBuYW1lc3BhY2VzLmZvckVhY2goZnVuY3Rp
b24gKG5hbWVzcGFjZSkgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNwYWNlKSB7Cisg
ICAgICAgICAgaWYgKCFuYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIHdp
bGwgZmlsdGVyIGFnYWluIGluIGBnZXRNb2RlbFR5cGVzYCwKKyAgICAgICAgICAvLyB3ZSBzaG91
bGQgbm90IGNhbGwgYGxvb2t1cEZhY3RvcnlgIG9uIG5vbi1tb2RlbHMKKyAgICAgICAgICAvLyAo
ZXNwZWNpYWxseSB3aGVuIGBFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlNgIGlzIGB0cnVl
YCkKKyAgICAgICAgICBpZiAoIV90aGlzNS5kZXRlY3QobmFtZXNwYWNlW2tleV0pKSB7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG5hbWUgPSBfZW1i
ZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShrZXkpOworICAgICAgICAgIGlmICghKG5h
bWVzcGFjZSBpbnN0YW5jZW9mIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb24uZGVm
YXVsdCkgJiYgbmFtZXNwYWNlLnRvU3RyaW5nKCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1l
c3BhY2UgKyAnLycgKyBuYW1lOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlcy5wdXNoKG5h
bWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0eXBlczsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBGZXRjaGVzIGFsbCBsb2FkZWQgcmVjb3JkcyBmb3IgYSBnaXZlbiB0
eXBlLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGdldFJlY29yZHMKKyAgICAgIEBy
ZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiByZWNvcmRzLgorICAgICAgIFRoaXMgYXJyYXkgd2ls
bCBiZSBvYnNlcnZlZCBmb3IgY2hhbmdlcywKKyAgICAgICBzbyBpdCBzaG91bGQgdXBkYXRlIHdo
ZW4gbmV3IHJlY29yZHMgYXJlIGFkZGVkL3JlbW92ZWQuCisgICAgKi8KKyAgICBnZXRSZWNvcmRz
OiBmdW5jdGlvbiAodHlwZSkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRp
dmVfYXJyYXkuQSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFdyYXBzIGEgcmVjb3JkIGFu
ZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhv
ZCB3cmFwUmVjb3JkCisgICAgICBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5z
dGFuY2UuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSB3cmFwcGVkIHJlY29yZC4gRm9ybWF0
OgorICAgICAgY29sdW1uVmFsdWVzOiB7QXJyYXl9CisgICAgICBzZWFyY2hLZXl3b3Jkczoge0Fy
cmF5fQorICAgICovCisgICAgd3JhcFJlY29yZDogZnVuY3Rpb24gKHJlY29yZCkgeworICAgICAg
dmFyIHJlY29yZFRvU2VuZCA9IHsgb2JqZWN0OiByZWNvcmQgfTsKKworICAgICAgcmVjb3JkVG9T
ZW5kLmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKHJlY29yZCk7Cisg
ICAgICByZWNvcmRUb1NlbmQuc2VhcmNoS2V5d29yZHMgPSB0aGlzLmdldFJlY29yZEtleXdvcmRz
KHJlY29yZCk7CisgICAgICByZWNvcmRUb1NlbmQuZmlsdGVyVmFsdWVzID0gdGhpcy5nZXRSZWNv
cmRGaWx0ZXJWYWx1ZXMocmVjb3JkKTsKKyAgICAgIHJlY29yZFRvU2VuZC5jb2xvciA9IHRoaXMu
Z2V0UmVjb3JkQ29sb3IocmVjb3JkKTsKKworICAgICAgcmV0dXJuIHJlY29yZFRvU2VuZDsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBHZXRzIHRoZSB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uLgor
ICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGdldFJlY29yZENvbHVtblZhbHVlcworICAg
ICAgQHJldHVybiB7T2JqZWN0fSBLZXlzIHNob3VsZCBtYXRjaCBjb2x1bW4gbmFtZXMgZGVmaW5l
ZAorICAgICAgYnkgdGhlIG1vZGVsIHR5cGUuCisgICAgKi8KKyAgICBnZXRSZWNvcmRDb2x1bW5W
YWx1ZXM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBSZXR1cm5zIGtleXdvcmRzIHRvIG1hdGNoIHdoZW4gc2VhcmNoaW5nIHJl
Y29yZHMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZ2V0UmVjb3JkS2V5d29yZHMK
KyAgICAgIEByZXR1cm4ge0FycmF5fSBSZWxldmFudCBrZXl3b3JkcyBmb3Igc2VhcmNoLgorICAg
ICovCisgICAgZ2V0UmVjb3JkS2V5d29yZHM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJl
dHVybiBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgZmlsdGVycyBkZWZpbmVkIGJ5IGBnZXRG
aWx0ZXJzYC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBnZXRSZWNvcmRGaWx0ZXJW
YWx1ZXMKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZS4K
KyAgICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGZpbHRlciB2YWx1ZXMuCisgICAgKi8KKyAgICBn
ZXRSZWNvcmRGaWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uIChyZWNvcmQpIHsKKyAgICAgIHJldHVybiB7
fTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBFYWNoIHJlY29yZCBjYW4gaGF2ZSBhIGNvbG9y
IHRoYXQgcmVwcmVzZW50cyBpdHMgc3RhdGUuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgZ2V0UmVjb3JkQ29sb3IKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29y
ZCBpbnN0YW5jZQorICAgICAgQHJldHVybiB7U3RyaW5nfSBUaGUgcmVjb3JkcyBjb2xvci4KKyAg
ICAgICAgUG9zc2libGUgb3B0aW9uczogYmxhY2ssIHJlZCwgYmx1ZSwgZ3JlZW4uCisgICAgKi8K
KyAgICBnZXRSZWNvcmRDb2xvcjogZnVuY3Rpb24gKHJlY29yZCkgeworICAgICAgcmV0dXJuIG51
bGw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50IHByb3Bl
cnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFwcGVkIHJlY29yZAorICAgICAgd2hlbiBhIGNoYW5n
ZSBvY2N1cnMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb2JzZXJ2ZXJSZWNvcmQK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZS4KKyAgICAg
IEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZFVwZGF0ZWQgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hl
biBhIHJlY29yZCBpcyB1cGRhdGVkLgorICAgICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5j
dGlvbiB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzLgorICAgICovCisgICAgb2JzZXJ2
ZVJlY29yZDogZnVuY3Rpb24gKHJlY29yZCwgcmVjb3JkVXBkYXRlZCkgeworICAgICAgcmV0dXJu
IGZ1bmN0aW9uICgpIHt9OworICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItZXh0ZW5z
aW9uLXN1cHBvcnQvaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci1leHRlbnNpb24tc3VwcG9ydC9kYXRhX2FkYXB0ZXInLCAnZW1iZXItZXh0ZW5zaW9uLXN1cHBv
cnQvY29udGFpbmVyX2RlYnVnX2FkYXB0ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsQ29yZSwgX2VtYmVyRXh0ZW5zaW9uU3VwcG9ydERhdGFfYWRhcHRlciwgX2VtYmVyRXh0ZW5z
aW9uU3VwcG9ydENvbnRhaW5lcl9kZWJ1Z19hZGFwdGVyKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItZXh0ZW5zaW9uLXN1cHBvcnQKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRGF0YUFkYXB0ZXIgPSBfZW1i
ZXJFeHRlbnNpb25TdXBwb3J0RGF0YV9hZGFwdGVyLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LkNvbnRhaW5lckRlYnVnQWRhcHRlciA9IF9lbWJlckV4dGVuc2lvblN1cHBvcnRD
b250YWluZXJfZGVidWdfYWRhcHRlci5kZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxi
YXJzL2NvbXBhdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLWh0bWxi
YXJzL3V0aWxzL3N0cmluZyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBf
ZW1iZXJIdG1sYmFyc1V0aWxzU3RyaW5nKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgRW1i
ZXJIYW5kbGViYXJzID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFuZGxlYmFycyA9IF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0LkhhbmRsZWJhcnMgfHwge307CisKKyAgRW1iZXJIYW5kbGViYXJz
LlNhZmVTdHJpbmcgPSBfZW1iZXJIdG1sYmFyc1V0aWxzU3RyaW5nLlNhZmVTdHJpbmc7CisgIEVt
YmVySGFuZGxlYmFycy5VdGlscyA9IHsKKyAgICBlc2NhcGVFeHByZXNzaW9uOiBfZW1iZXJIdG1s
YmFyc1V0aWxzU3RyaW5nLmVzY2FwZUV4cHJlc3Npb24KKyAgfTsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBFbWJlckhhbmRsZWJhcnM7Cit9KTsKKy8vIGZvciBIYW5kbGViYXJzIGV4cG9ydAorZW5p
ZmVkKCdlbWJlci1odG1sYmFycy9lbnYnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwnLCAnZW1i
ZXItbWV0YWwvZW52aXJvbm1lbnQnLCAnaHRtbGJhcnMtcnVudGltZScsICdlbWJlci1tZXRhbC9h
c3NpZ24nLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsICdlbWJlci1odG1sYmFycy9o
b29rcy9jb25jYXQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvbGluay1yZW5kZXItbm9kZScsICdl
bWJlci1odG1sYmFycy9ob29rcy9jcmVhdGUtZnJlc2gtc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMv
aG9va3MvYmluZC1zaGFkb3ctc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1zZWxm
JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2NvcGUnLCAnZW1iZXItaHRtbGJhcnMvaG9v
a3MvYmluZC1sb2NhbCcsICdlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLWJsb2NrJywgJ2VtYmVy
LWh0bWxiYXJzL2hvb2tzL3VwZGF0ZS1zZWxmJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1y
b290JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1jaGlsZCcsICdlbWJlci1odG1sYmFycy9o
b29rcy9nZXQtYmxvY2snLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LXZhbHVlJywgJ2VtYmVy
LWh0bWxiYXJzL2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tz
L2NsZWFudXAtcmVuZGVyLW5vZGUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZGVzdHJveS1yZW5k
ZXItbm9kZScsICdlbWJlci1odG1sYmFycy9ob29rcy9kaWQtcmVuZGVyLW5vZGUnLCAnZW1iZXIt
aHRtbGJhcnMvaG9va3Mvd2lsbC1jbGVhbnVwLXRyZWUnLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mv
ZGlkLWNsZWFudXAtdHJlZScsICdlbWJlci1odG1sYmFycy9ob29rcy9jbGFzc2lmeScsICdlbWJl
ci1odG1sYmFycy9ob29rcy9jb21wb25lbnQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvbG9va3Vw
LWhlbHBlcicsICdlbWJlci1odG1sYmFycy9ob29rcy9oYXMtaGVscGVyJywgJ2VtYmVyLWh0bWxi
YXJzL2hvb2tzL2ludm9rZS1oZWxwZXInLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZWxlbWVudCcs
ICdlbWJlci1odG1sYmFycy9oZWxwZXJzJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzJywgJ2Vt
YmVyLWh0bWxiYXJzL3N5c3RlbS9kb20taGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRz
L2RlYnVnZ2VyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3dpdGgnLCAnZW1iZXItaHRtbGJh
cnMva2V5d29yZHMvb3V0bGV0JywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3VuYm91bmQnLCAn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvdmlldycsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9j
b21wb25lbnQnLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1jb21wb25lbnQnLCAn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvcGFydGlhbCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jk
cy9pbnB1dCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy90ZXh0YXJlYScsICdlbWJlci1odG1s
YmFycy9rZXl3b3Jkcy95aWVsZCcsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9tdXQnLCAnZW1i
ZXItaHRtbGJhcnMva2V5d29yZHMvcmVhZG9ubHknLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMv
Z2V0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbCwgX2VtYmVyTWV0YWxFbnZpcm9u
bWVudCwgX2h0bWxiYXJzUnVudGltZSwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxiYXJz
SG9va3NTdWJleHByLCBfZW1iZXJIdG1sYmFyc0hvb2tzQ29uY2F0LCBfZW1iZXJIdG1sYmFyc0hv
b2tzTGlua1JlbmRlck5vZGUsIF9lbWJlckh0bWxiYXJzSG9va3NDcmVhdGVGcmVzaFNjb3BlLCBf
ZW1iZXJIdG1sYmFyc0hvb2tzQmluZFNoYWRvd1Njb3BlLCBfZW1iZXJIdG1sYmFyc0hvb2tzQmlu
ZFNlbGYsIF9lbWJlckh0bWxiYXJzSG9va3NCaW5kU2NvcGUsIF9lbWJlckh0bWxiYXJzSG9va3NC
aW5kTG9jYWwsIF9lbWJlckh0bWxiYXJzSG9va3NCaW5kQmxvY2ssIF9lbWJlckh0bWxiYXJzSG9v
a3NVcGRhdGVTZWxmLCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Um9vdCwgX2VtYmVySHRtbGJhcnNI
b29rc0dldENoaWxkLCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0QmxvY2ssIF9lbWJlckh0bWxiYXJz
SG9va3NHZXRWYWx1ZSwgX2VtYmVySHRtbGJhcnNIb29rc0dldENlbGxPclZhbHVlLCBfZW1iZXJI
dG1sYmFyc0hvb2tzQ2xlYW51cFJlbmRlck5vZGUsIF9lbWJlckh0bWxiYXJzSG9va3NEZXN0cm95
UmVuZGVyTm9kZSwgX2VtYmVySHRtbGJhcnNIb29rc0RpZFJlbmRlck5vZGUsIF9lbWJlckh0bWxi
YXJzSG9va3NXaWxsQ2xlYW51cFRyZWUsIF9lbWJlckh0bWxiYXJzSG9va3NEaWRDbGVhbnVwVHJl
ZSwgX2VtYmVySHRtbGJhcnNIb29rc0NsYXNzaWZ5LCBfZW1iZXJIdG1sYmFyc0hvb2tzQ29tcG9u
ZW50LCBfZW1iZXJIdG1sYmFyc0hvb2tzTG9va3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hvb2tz
SGFzSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hvb2tzSW52b2tlSGVscGVyLCBfZW1iZXJIdG1sYmFy
c0hvb2tzRWxlbWVudCwgX2VtYmVySHRtbGJhcnNIZWxwZXJzLCBfZW1iZXJIdG1sYmFyc0tleXdv
cmRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhlbHBlciwgX2VtYmVySHRtbGJhcnNLZXl3b3Jk
c0RlYnVnZ2VyLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzV2l0aCwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc091dGxldCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1VuYm91bmQsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNWaWV3LCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ29tcG9uZW50LCBfZW1iZXJIdG1s
YmFyc0tleXdvcmRzRWxlbWVudENvbXBvbmVudCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1BhcnRp
YWwsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNJbnB1dCwgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1Rl
eHRhcmVhLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzWWllbGQsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNNdXQsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNSZWFkb25seSwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc0dldCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIGVtYmVySG9va3MgPSBfZW1iZXJN
ZXRhbEFzc2lnbi5kZWZhdWx0KHt9LCBfaHRtbGJhcnNSdW50aW1lLmhvb2tzKTsKKyAgZW1iZXJI
b29rcy5rZXl3b3JkcyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHMuZGVmYXVsdDsKKworICBfZW1i
ZXJNZXRhbEFzc2lnbi5kZWZhdWx0KGVtYmVySG9va3MsIHsKKyAgICBsaW5rUmVuZGVyTm9kZTog
X2VtYmVySHRtbGJhcnNIb29rc0xpbmtSZW5kZXJOb2RlLmRlZmF1bHQsCisgICAgY3JlYXRlRnJl
c2hTY29wZTogX2VtYmVySHRtbGJhcnNIb29rc0NyZWF0ZUZyZXNoU2NvcGUuZGVmYXVsdCwKKyAg
ICBjcmVhdGVDaGlsZFNjb3BlOiBfZW1iZXJIdG1sYmFyc0hvb2tzQ3JlYXRlRnJlc2hTY29wZS5j
cmVhdGVDaGlsZFNjb3BlLAorICAgIGJpbmRTaGFkb3dTY29wZTogX2VtYmVySHRtbGJhcnNIb29r
c0JpbmRTaGFkb3dTY29wZS5kZWZhdWx0LAorICAgIGJpbmRTZWxmOiBfZW1iZXJIdG1sYmFyc0hv
b2tzQmluZFNlbGYuZGVmYXVsdCwKKyAgICBiaW5kU2NvcGU6IF9lbWJlckh0bWxiYXJzSG9va3NC
aW5kU2NvcGUuZGVmYXVsdCwKKyAgICBiaW5kTG9jYWw6IF9lbWJlckh0bWxiYXJzSG9va3NCaW5k
TG9jYWwuZGVmYXVsdCwKKyAgICBiaW5kQmxvY2s6IF9lbWJlckh0bWxiYXJzSG9va3NCaW5kQmxv
Y2suZGVmYXVsdCwKKyAgICB1cGRhdGVTZWxmOiBfZW1iZXJIdG1sYmFyc0hvb2tzVXBkYXRlU2Vs
Zi5kZWZhdWx0LAorICAgIGdldEJsb2NrOiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0QmxvY2suZGVm
YXVsdCwKKyAgICBnZXRSb290OiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Um9vdC5kZWZhdWx0LAor
ICAgIGdldENoaWxkOiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Q2hpbGQuZGVmYXVsdCwKKyAgICBn
ZXRWYWx1ZTogX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQsCisgICAgZ2V0Q2Vs
bE9yVmFsdWU6IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZhdWx0LAorICAg
IHN1YmV4cHI6IF9lbWJlckh0bWxiYXJzSG9va3NTdWJleHByLmRlZmF1bHQsCisgICAgY29uY2F0
OiBfZW1iZXJIdG1sYmFyc0hvb2tzQ29uY2F0LmRlZmF1bHQsCisgICAgY2xlYW51cFJlbmRlck5v
ZGU6IF9lbWJlckh0bWxiYXJzSG9va3NDbGVhbnVwUmVuZGVyTm9kZS5kZWZhdWx0LAorICAgIGRl
c3Ryb3lSZW5kZXJOb2RlOiBfZW1iZXJIdG1sYmFyc0hvb2tzRGVzdHJveVJlbmRlck5vZGUuZGVm
YXVsdCwKKyAgICB3aWxsQ2xlYW51cFRyZWU6IF9lbWJlckh0bWxiYXJzSG9va3NXaWxsQ2xlYW51
cFRyZWUuZGVmYXVsdCwKKyAgICBkaWRDbGVhbnVwVHJlZTogX2VtYmVySHRtbGJhcnNIb29rc0Rp
ZENsZWFudXBUcmVlLmRlZmF1bHQsCisgICAgZGlkUmVuZGVyTm9kZTogX2VtYmVySHRtbGJhcnNI
b29rc0RpZFJlbmRlck5vZGUuZGVmYXVsdCwKKyAgICBjbGFzc2lmeTogX2VtYmVySHRtbGJhcnNI
b29rc0NsYXNzaWZ5LmRlZmF1bHQsCisgICAgY29tcG9uZW50OiBfZW1iZXJIdG1sYmFyc0hvb2tz
Q29tcG9uZW50LmRlZmF1bHQsCisgICAgbG9va3VwSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
TG9va3VwSGVscGVyLmRlZmF1bHQsCisgICAgaGFzSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
SGFzSGVscGVyLmRlZmF1bHQsCisgICAgaW52b2tlSGVscGVyOiBfZW1iZXJIdG1sYmFyc0hvb2tz
SW52b2tlSGVscGVyLmRlZmF1bHQsCisgICAgZWxlbWVudDogX2VtYmVySHRtbGJhcnNIb29rc0Vs
ZW1lbnQuZGVmYXVsdAorICB9KTsKKworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVy
S2V5d29yZCgnZGVidWdnZXInLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzRGVidWdnZXIuZGVmYXVs
dCk7CisgIF9lbWJlckh0bWxiYXJzS2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCd3aXRoJywgX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc1dpdGguZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHMucmVnaXN0ZXJLZXl3b3JkKCdvdXRsZXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzT3V0bGV0
LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgndW5i
b3VuZCcsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNVbmJvdW5kLmRlZmF1bHQpOworICBfZW1iZXJI
dG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnY29tcG9uZW50JywgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkc0NvbXBvbmVudC5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5y
ZWdpc3RlcktleXdvcmQoJ0BlbGVtZW50X2NvbXBvbmVudCcsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNFbGVtZW50Q29tcG9uZW50LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJl
Z2lzdGVyS2V5d29yZCgncGFydGlhbCcsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNQYXJ0aWFsLmRl
ZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnaW5wdXQn
LCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzSW5wdXQuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJz
S2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCd0ZXh0YXJlYScsIF9lbWJlckh0bWxiYXJzS2V5d29y
ZHNUZXh0YXJlYS5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5yZWdpc3Rlcktl
eXdvcmQoJ3lpZWxkJywgX2VtYmVySHRtbGJhcnNLZXl3b3Jkc1lpZWxkLmRlZmF1bHQpOworICBf
ZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgnbXV0JywgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkc011dC5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNLZXl3b3Jkcy5yZWdpc3Rl
cktleXdvcmQoJ0BtdXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzTXV0LnByaXZhdGVNdXQpOwor
ICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29yZCgncmVhZG9ubHknLCBfZW1i
ZXJIdG1sYmFyc0tleXdvcmRzUmVhZG9ubHkuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzS2V5
d29yZHMucmVnaXN0ZXJLZXl3b3JkKCdnZXQnLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzR2V0LmRl
ZmF1bHQpOworCisgIGlmIChfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9W
SUVXX1NVUFBPUlQpIHsKKyAgICBfZW1iZXJIdG1sYmFyc0tleXdvcmRzLnJlZ2lzdGVyS2V5d29y
ZCgndmlldycsIF9lbWJlckh0bWxiYXJzS2V5d29yZHNWaWV3LmRlZmF1bHQpOworICB9CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0geworICAgIGhvb2tzOiBlbWJlckhvb2tzLAorICAgIGhlbHBlcnM6
IF9lbWJlckh0bWxiYXJzSGVscGVycy5kZWZhdWx0LAorICAgIHVzZUZyYWdtZW50Q2FjaGU6IHRy
dWUKKyAgfTsKKworICB2YXIgZG9tSGVscGVyID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0Lmhhc0RPTSA/IG5ldyBfZW1iZXJIdG1sYmFyc1N5c3RlbURvbUhlbHBlci5kZWZhdWx0KCkg
OiBudWxsOworCisgIGV4cG9ydHMuZG9tSGVscGVyID0gZG9tSGVscGVyOworfSk7CitlbmlmZWQo
J2VtYmVyLWh0bWxiYXJzL2dsaW1tZXItY29tcG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLXZp
ZXdzL3ZpZXdzL2NvcmVfdmlldycsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19jaGlsZF92aWV3
c19zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy92aWV3X3N0YXRlX3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL3RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0JywgJ2VtYmVyLXZpZXdz
L21peGlucy9jbGFzc19uYW1lc19zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy9pbnN0cnVt
ZW50YXRpb25fc3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvYXJpYV9yb2xlX3N1cHBvcnQn
LCAnZW1iZXItdmlld3MvbWl4aW5zL3ZpZXdfc3VwcG9ydCcsICdlbWJlci12aWV3cy92aWV3cy92
aWV3J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1ZpZXdzQ29yZV92aWV3LCBfZW1i
ZXJWaWV3c01peGluc1ZpZXdfY2hpbGRfdmlld3Nfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNW
aWV3X3N0YXRlX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1
cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydCwgX2VtYmVyVmlld3NN
aXhpbnNJbnN0cnVtZW50YXRpb25fc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNBcmlhX3JvbGVf
c3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNWaWV3X3N1cHBvcnQsIF9lbWJlclZpZXdzVmlld3NW
aWV3KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJWaWV3
c1ZpZXdzQ29yZV92aWV3LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclZpZXdzTWl4aW5zVmlld19jaGls
ZF92aWV3c19zdXBwb3J0LmRlZmF1bHQsIF9lbWJlclZpZXdzTWl4aW5zVmlld19zdGF0ZV9zdXBw
b3J0LmRlZmF1bHQsIF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1cHBvcnQu
ZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNDbGFzc19uYW1lc19zdXBwb3J0LmRlZmF1bHQsIF9l
bWJlclZpZXdzTWl4aW5zSW5zdHJ1bWVudGF0aW9uX3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmll
d3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1ZpZXdf
c3VwcG9ydC5kZWZhdWx0LCB7CisgICAgaXNDb21wb25lbnQ6IHRydWUsCisgICAgaXNHbGltbWVy
Q29tcG9uZW50OiB0cnVlLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5f
c3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3ZpZXdSZWdpc3RyeSA9
IHRoaXMuX3ZpZXdSZWdpc3RyeSB8fCBfZW1iZXJWaWV3c1ZpZXdzVmlldy5kZWZhdWx0LnZpZXdz
OworICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVyJywgWydl
eHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmhlbHBlciA9IGhlbHBlcjsKKworICAvKioKKyAgICBFbWJlciBIZWxwZXJzIGFy
ZSBmdW5jdGlvbnMgdGhhdCBjYW4gY29tcHV0ZSB2YWx1ZXMsIGFuZCBhcmUgdXNlZCBpbiB0ZW1w
bGF0ZXMuCisgICAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBjYWxscyBhIGhlbHBlciBuYW1lZCBg
Zm9ybWF0LWN1cnJlbmN5YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDxkaXY+e3tmb3Jt
YXQtY3VycmVuY3kgY2VudHMgY3VycmVuY3k9IiQifX08L2Rpdj4KKyAgICBgYGAKKyAgCisgICAg
QWRkaXRpb25hbGx5LCBhIGhlbHBlciBjYW4gYmUgY2FsbGVkIGFzIGEgbmVzdGVkIGhlbHBlciAo
c29tZXRpbWVzIGNhbGxlZCBhCisgICAgc3ViZXhwcmVzc2lvbikuIEluIHRoaXMgZXhhbXBsZSwg
dGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgaGVscGVyIGlzIHBhc3NlZAorICAgIHRvIGEgY29tcG9u
ZW50IG5hbWVkIGBzaG93LW1vbmV5YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7c2hv
dy1tb25leSBhbW91bnQ9KGZvcm1hdC1jdXJyZW5jeSBjZW50cyBjdXJyZW5jeT0iJCIpfX0KKyAg
ICBgYGAKKyAgCisgICAgSGVscGVycyBkZWZpbmVkIHVzaW5nIGEgY2xhc3MgbXVzdCBwcm92aWRl
IGEgYGNvbXB1dGVgIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZToKKyAgCisgICAgYGBganMKKyAgICBl
eHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuZXh0ZW5kKHsKKyAgICAgIGNvbXB1dGUocGFyYW1z
LCBoYXNoKSB7CisgICAgICAgIGxldCBjZW50cyA9IHBhcmFtc1swXTsKKyAgICAgICAgbGV0IGN1
cnJlbmN5ID0gaGFzaC5jdXJyZW5jeTsKKyAgICAgICAgcmV0dXJuIGAke2N1cnJlbmN5fSR7Y2Vu
dHMgKiAwLjAxfWA7CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEVhY2ggdGlt
ZSB0aGUgaW5wdXQgdG8gYSBoZWxwZXIgY2hhbmdlcywgdGhlIGBjb21wdXRlYCBmdW5jdGlvbiB3
aWxsIGJlCisgICAgY2FsbGVkIGFnYWluLgorICAKKyAgICBBcyBpbnN0YW5jZXMsIHRoZXNlIGhl
bHBlcnMgYWxzbyBoYXZlIGFjY2VzcyB0byB0aGUgY29udGFpbmVyIGFuZCB3aWxsIGFjY2VwdAor
ICAgIGluamVjdGVkIGRlcGVuZGVuY2llcy4KKyAgCisgICAgQWRkaXRpb25hbGx5LCBjbGFzcyBo
ZWxwZXJzIGNhbiBjYWxsIGByZWNvbXB1dGVgIHRvIGZvcmNlIGEgbmV3IGNvbXB1dGF0aW9uLgor
ICAKKyAgICBAY2xhc3MgRW1iZXIuSGVscGVyCisgICAgQHB1YmxpYworICAgIEBzaW5jZSAxLjEz
LjAKKyAgKi8KKyAgdmFyIEhlbHBlciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVs
dC5leHRlbmQoeworICAgIGlzSGVscGVySW5zdGFuY2U6IHRydWUsCisKKyAgICAvKioKKyAgICAg
IE9uIGEgY2xhc3MtYmFzZWQgaGVscGVyLCBpdCBtYXkgYmUgdXNlZnVsIHRvIGZvcmNlIGEgcmVj
b21wdXRhdGlvbiBvZiB0aGF0CisgICAgICBoZWxwZXJzIHZhbHVlLiBUaGlzIGlzIGFraW4gdG8g
YHJlcmVuZGVyYCBvbiBhIGNvbXBvbmVudC4KKyAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBjb21w
b25lbnQgd2lsbCByZXJlbmRlciB3aGVuIHRoZSBgY3VycmVudFVzZXJgIG9uIGEKKyAgICAgIHNl
c3Npb24gc2VydmljZSBjaGFuZ2VzOgorICAgICAgIGBgYGpzCisgICAgICAvLyBhcHAvaGVscGVy
cy9jdXJyZW50LXVzZXItZW1haWwuanMKKyAgICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkhlbHBl
ci5leHRlbmQoeworICAgICAgICBzZXNzaW9uOiBFbWJlci5pbmplY3Quc2VydmljZSgpLAorICAg
ICAgICBvbk5ld1VzZXI6IEVtYmVyLm9ic2VydmVyKCdzZXNzaW9uLmN1cnJlbnRVc2VyJywgZnVu
Y3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5yZWNvbXB1dGUoKTsKKyAgICAgICAgfSksCisgICAg
ICAgIGNvbXB1dGUoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdzZXNzaW9uLmN1cnJl
bnRVc2VyLmVtYWlsJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAg
QG1ldGhvZCByZWNvbXB1dGUKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5jZSAxLjEzLjAKKyAg
ICAqLworICAgIHJlY29tcHV0ZTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3RyZWFtLm5v
dGlmeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB3
aGVuIHdyaXRpbmcgYSBjbGFzcy1iYXNlZCBoZWxwZXIuCisgICAgICAgQG1ldGhvZCBjb21wdXRl
CisgICAgICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgVGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRv
IHRoZSBoZWxwZXIKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBuYW1lZCBhcmd1bWVu
dHMgdG8gdGhlIGhlbHBlcgorICAgICAgQHB1YmxpYworICAgICAgQHNpbmNlIDEuMTMuMAorICAg
ICovCisgIH0pOworCisgIEhlbHBlci5yZW9wZW5DbGFzcyh7CisgICAgaXNIZWxwZXJGYWN0b3J5
OiB0cnVlCisgIH0pOworCisgIC8qKgorICAgIEluIG1hbnkgY2FzZXMsIHRoZSBjZXJlbW9ueSBv
ZiBhIGZ1bGwgYEVtYmVyLkhlbHBlcmAgY2xhc3MgaXMgbm90IHJlcXVpcmVkLgorICAgIFRoZSBg
aGVscGVyYCBtZXRob2QgY3JlYXRlIHB1cmUtZnVuY3Rpb24gaGVscGVycyB3aXRob3V0IGluc3Rh
bmNlcy4gRm9yCisgICAgZXhhbXBsZToKKyAgCisgICAgYGBganMKKyAgICAvLyBhcHAvaGVscGVy
cy9mb3JtYXQtY3VycmVuY3kuanMKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuaGVs
cGVyKGZ1bmN0aW9uKHBhcmFtcywgaGFzaCkgeworICAgICAgbGV0IGNlbnRzID0gcGFyYW1zWzBd
OworICAgICAgbGV0IGN1cnJlbmN5ID0gaGFzaC5jdXJyZW5jeTsKKyAgICAgIHJldHVybiBgJHtj
dXJyZW5jeX0ke2NlbnRzICogMC4wMX1gOworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAc3Rh
dGljCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyIFRoZSBoZWxwZXIgZnVuY3Rpb24KKyAg
ICBAbWV0aG9kIGhlbHBlcgorICAgIEBwdWJsaWMKKyAgICBAc2luY2UgMS4xMy4wCisgICovCisK
KyAgZnVuY3Rpb24gaGVscGVyKGhlbHBlckZuKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGlzSGVs
cGVySW5zdGFuY2U6IHRydWUsCisgICAgICBjb21wdXRlOiBoZWxwZXJGbgorICAgIH07CisgIH0K
KworICBleHBvcnRzLmRlZmF1bHQgPSBIZWxwZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJh
cnMvaGVscGVycycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0KSB7CisgIC8qKgorICBAbW9k
dWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAvKioKKyAg
IEBwcml2YXRlCisgICBAcHJvcGVydHkgaGVscGVycworICAqLworICAndXNlIHN0cmljdCc7CisK
KyAgZXhwb3J0cy5yZWdpc3RlckhlbHBlciA9IHJlZ2lzdGVySGVscGVyOworCisgIHZhciBoZWxw
ZXJzID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgLyoq
CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIF9yZWdpc3RlckhlbHBlcgorICAgIEBmb3IgRW1i
ZXIuSFRNTEJhcnMKKyAgICBAcGFyYW0ge1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7T2JqZWN0
fEZ1bmN0aW9ufSBoZWxwZXJGdW5jIFRoZSBoZWxwZXIgZnVuY3Rpb24gdG8gYWRkLgorICAqLwor
CisgIGZ1bmN0aW9uIHJlZ2lzdGVySGVscGVyKG5hbWUsIGhlbHBlckZ1bmMpIHsKKyAgICBoZWxw
ZXJzW25hbWVdID0gaGVscGVyRnVuYzsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IGhlbHBl
cnM7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVycy8taHRtbC1zYWZlJywgWydl
eHBvcnRzJywgJ2h0bWxiYXJzLXV0aWwvc2FmZS1zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9odG1sYmFyc1V0aWxTYWZlU3RyaW5nKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBodG1sU2FmZUhlbHBlcjsKKworICAvKioKKyAgIFRoaXMgcHJpdmF0ZSBoZWxw
ZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSBgaXNWaXNpYmxlOiBmYWxzZWAgZm9yCisg
ICBFbWJlci5WaWV3IGFuZCBFbWJlci5Db21wb25lbnQuCisgIAorICAgQHByaXZhdGUKKyAgICov
CisKKyAgZnVuY3Rpb24gaHRtbFNhZmVIZWxwZXIoX3JlZikgeworICAgIHZhciB2YWx1ZSA9IF9y
ZWZbMF07CisKKyAgICByZXR1cm4gbmV3IF9odG1sYmFyc1V0aWxTYWZlU3RyaW5nLmRlZmF1bHQo
dmFsdWUpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaGVscGVycy8tam9pbi1j
bGFzc2VzJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qCisgICAgVGhp
cyBwcml2YXRlIGhlbHBlciBpcyB1c2VkIHRvIGpvaW4gYW5kIGNvbXBhY3QgYSBsaXN0IG9mIGNs
YXNzIG5hbWVzLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBqb2luQ2xhc3NlczsKKworICBmdW5jdGlvbiBqb2luQ2xhc3Nl
cyhjbGFzc05hbWVzKSB7CisgICAgdmFyIHJlc3VsdCA9IFtdOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjbGFzc05hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFyIGNsYXNz
TmFtZSA9IGNsYXNzTmFtZXNbaV07CisKKyAgICAgIGlmIChjbGFzc05hbWUpIHsKKyAgICAgICAg
cmVzdWx0LnB1c2goY2xhc3NOYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVz
dWx0LmpvaW4oJyAnKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMv
LW5vcm1hbGl6ZS1jbGFzcycsIFsnZXhwb3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJp
bmcnLCAnZW1iZXItbWV0YWwvcGF0aF9jYWNoZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZywgX2VtYmVyTWV0YWxQYXRoX2NhY2hlKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBub3JtYWxpemVDbGFzczsKKworICAvKgorICAg
IFRoaXMgcHJpdmF0ZSBoZWxwZXIgaXMgdXNlZCBieSBDb21wb25lbnROb2RlIHRvIGNvbnZlcnQg
dGhlIGNsYXNzTmFtZUJpbmRpbmdzCisgICAgbWljcm9zeW50YXggaW50byBhIGNsYXNzIG5hbWUu
CisgIAorICAgIFdoZW4gYSBjb21wb25lbnQgb3IgdmlldyBpcyBjcmVhdGVkLCB3ZSBub3JtYWxp
emUgY2xhc3MgbmFtZSBiaW5kaW5ncyBpbnRvIGEKKyAgICBzZXJpZXMgb2YgYXR0cmlidXRlIG5v
ZGVzIHRoYXQgdXNlIHRoaXMgaGVscGVyLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1
bmN0aW9uIG5vcm1hbGl6ZUNsYXNzKHBhcmFtcywgaGFzaCkgeworICAgIHZhciBwcm9wTmFtZSA9
IHBhcmFtc1swXTsKKyAgICB2YXIgdmFsdWUgPSBwYXJhbXNbMV07CisgICAgdmFyIGFjdGl2ZUNs
YXNzID0gaGFzaC5hY3RpdmVDbGFzczsKKyAgICB2YXIgaW5hY3RpdmVDbGFzcyA9IGhhc2guaW5h
Y3RpdmVDbGFzczsKKworICAgIC8vIFdoZW4gdXNpbmcgdGhlIGNvbG9uIHN5bnRheCwgZXZhbHVh
dGUgdGhlIHRydXRoaW5lc3Mgb3IgZmFsc2luZXNzCisgICAgLy8gb2YgdGhlIHZhbHVlIHRvIGRl
dGVybWluZSB3aGljaCBjbGFzc05hbWUgdG8gcmV0dXJuLgorICAgIGlmIChhY3RpdmVDbGFzcyB8
fCBpbmFjdGl2ZUNsYXNzKSB7CisgICAgICBpZiAoISF2YWx1ZSkgeworICAgICAgICByZXR1cm4g
YWN0aXZlQ2xhc3M7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaW5hY3RpdmVDbGFz
czsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdmFsdWUgaXMgYSBCb29sZWFuIGFuZCB0cnVlLCBy
ZXR1cm4gdGhlIGRhc2hlcml6ZWQgcHJvcGVydHkKKyAgICAgIC8vIG5hbWUuCisgICAgfSBlbHNl
IGlmICh2YWx1ZSA9PT0gdHJ1ZSkgeworICAgICAgICAvLyBPbmx5IGFwcGx5IHRvIGxhc3Qgc2Vn
bWVudCBpbiB0aGUgcGF0aC4KKyAgICAgICAgaWYgKHByb3BOYW1lICYmIF9lbWJlck1ldGFsUGF0
aF9jYWNoZS5pc1BhdGgocHJvcE5hbWUpKSB7CisgICAgICAgICAgdmFyIHNlZ21lbnRzID0gcHJv
cE5hbWUuc3BsaXQoJy4nKTsKKyAgICAgICAgICBwcm9wTmFtZSA9IHNlZ21lbnRzW3NlZ21lbnRz
Lmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVT
eXN0ZW1TdHJpbmcuZGFzaGVyaXplKHByb3BOYW1lKTsKKworICAgICAgICAvLyBJZiB0aGUgdmFs
dWUgaXMgbm90IGZhbHNlLCB1bmRlZmluZWQsIG9yIG51bGwsIHJldHVybiB0aGUgY3VycmVudAor
ICAgICAgICAvLyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICB9IGVsc2UgaWYgKHZhbHVl
ICE9PSBmYWxzZSAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOwor
CisgICAgICAgICAgLy8gTm90aGluZyB0byBkaXNwbGF5LiBSZXR1cm4gbnVsbCBzbyB0aGF0IHRo
ZSBvbGQgY2xhc3MgaXMgcmVtb3ZlZAorICAgICAgICAgIC8vIGJ1dCBubyBuZXcgY2xhc3MgaXMg
YWRkZWQuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAg
ICAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9oZWxwZXJzL2NvbmNhdCcs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgorICAgIENvbmNh
dGVuYXRlcyBpbnB1dCBwYXJhbXMgdG9nZXRoZXIuCisgICAgRXhhbXBsZToKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3tzb21lLWNvbXBvbmVudCBuYW1lPShjb25jYXQgZmlyc3ROYW1lICIgIiBs
YXN0TmFtZSl9fQorICAgIHt7ISB3b3VsZCBwYXNzIG5hbWU9IjxmaXJzdCBuYW1lIHZhbHVlPiA8
bGFzdCBuYW1lIHZhbHVlPiIgdG8gdGhlIGNvbXBvbmVudH19CisgICAgYGBgCisgICAgQHB1Ymxp
YworICAgIEBtZXRob2QgY29uY2F0CisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycwor
ICAgIEBzaW5jZSAxLjEzLjAKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IGNvbmNhdDsKKworICBmdW5jdGlvbiBjb25jYXQocGFyYW1zKSB7CisgICAgcmV0dXJu
IHBhcmFtcy5qb2luKCcnKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBl
cnMvZWFjaC1pbicsIFsnZXhwb3J0cycsICdlbWJlci12aWV3cy9zdHJlYW1zL3Nob3VsZF9kaXNw
bGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1N0cmVhbXNTaG91bGRfZGlzcGxh
eSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRl
cworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgYHt7ZWFjaC1pbn19
YCBoZWxwZXIgbG9vcHMgb3ZlciBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdC4gSXQgaXMgdW5ib3Vu
ZCwKKyAgICBpbiB0aGF0IG5ldyAob3IgcmVtb3ZlZCkgcHJvcGVydGllcyBhZGRlZCB0byB0aGUg
dGFyZ2V0IG9iamVjdCB3aWxsIG5vdCBiZQorICAgIHJlbmRlcmVkLgorICAKKyAgICBGb3IgZXhh
bXBsZSwgZ2l2ZW4gYSBgdXNlcmAgb2JqZWN0IHRoYXQgbG9va3MgbGlrZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHsKKyAgICAgICJuYW1lIjogIlNoZWxseSBTYWlscyIsCisgICAgICAi
YWdlIjogNDIKKyAgICB9CisgICAgYGBgCisgIAorICAgIFRoaXMgdGVtcGxhdGUgd291bGQgZGlz
cGxheSBhbGwgcHJvcGVydGllcyBvbiB0aGUgYHVzZXJgCisgICAgb2JqZWN0IGluIGEgbGlzdDoK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDx1bD4KKyAgICB7eyNlYWNoLWluIHVzZXIgYXMg
fGtleSB2YWx1ZXx9fQorICAgICAgPGxpPnt7a2V5fX06IHt7dmFsdWV9fTwvbGk+CisgICAge3sv
ZWFjaC1pbn19CisgICAgPC91bD4KKyAgICBgYGAKKyAgCisgICAgT3V0cHV0dGluZyB0aGVpciBu
YW1lIGFuZCBhZ2UuCisgIAorICAgIEBtZXRob2QgZWFjaC1pbgorICAgIEBmb3IgRW1iZXIuVGVt
cGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICAgQHNpbmNlIDIuMS4wCisgICovCisgIHZh
ciBlYWNoSW5IZWxwZXIgPSBmdW5jdGlvbiAoX3JlZiwgaGFzaCwgYmxvY2tzKSB7CisgICAgdmFy
IG9iamVjdCA9IF9yZWZbMF07CisKKyAgICB2YXIgb2JqS2V5cywgcHJvcCwgaTsKKyAgICBvYmpL
ZXlzID0gb2JqZWN0ID8gT2JqZWN0LmtleXMob2JqZWN0KSA6IFtdOworICAgIGlmIChfZW1iZXJW
aWV3c1N0cmVhbXNTaG91bGRfZGlzcGxheS5kZWZhdWx0KG9iaktleXMpKSB7CisgICAgICBmb3Ig
KGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICBwcm9wID0gb2JqS2V5
c1tpXTsKKyAgICAgICAgYmxvY2tzLnRlbXBsYXRlLnlpZWxkSXRlbShwcm9wLCBbcHJvcCwgb2Jq
ZWN0W3Byb3BdXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChibG9ja3MuaW52ZXJzZS55aWVs
ZCkgeworICAgICAgYmxvY2tzLmludmVyc2UueWllbGQoKTsKKyAgICB9CisgIH07CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gZWFjaEluSGVscGVyOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L2hlbHBlcnMvZWFjaCcsIFsnZXhwb3J0cycsICdlbWJlci12aWV3cy9zdHJlYW1zL3Nob3VsZF9k
aXNwbGF5JywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2RlY29kZS1lYWNoLWtleSddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyVmlld3NTdHJlYW1zU2hvdWxkX2Rpc3BsYXksIF9lbWJlckh0bWxi
YXJzVXRpbHNEZWNvZGVFYWNoS2V5KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IGVhY2hIZWxwZXI7CisKKyAgLyoqCisgICAgVGhlIGB7eyNlYWNofX1gIGhl
bHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGluIGEgY29sbGVjdGlvbi4gSXQgaXMgYW4gZXh0ZW5z
aW9uCisgICAgb2YgdGhlIGJhc2UgSGFuZGxlYmFycyBge3sjZWFjaH19YCBoZWxwZXIuCisgIAor
ICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGB7eyNlYWNofX1gIGlzIHRvIHlpZWxkIGl0cyBp
bm5lciBibG9jayBvbmNlIGZvciBldmVyeQorICAgIGl0ZW0gaW4gYW4gYXJyYXkgcGFzc2luZyB0
aGUgaXRlbSBhcyB0aGUgZmlyc3QgYmxvY2sgcGFyYW1ldGVyLgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgdmFyIGRldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1ZGEnfSx7bmFtZTogJ1RvbSd9
LCB7bmFtZTogJ1BhdWwnfV07CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
eyNlYWNoIGRldmVsb3BlcnMga2V5PSJuYW1lIiBhcyB8cGVyc29ufH19CisgICAgICB7e3BlcnNv
bi5uYW1lfX0KKyAgICAgIHt7ISBgdGhpc2AgaXMgd2hhdGV2ZXIgaXQgd2FzIG91dHNpZGUgdGhl
ICNlYWNoIH19CisgICAge3svZWFjaH19CisgICAgYGBgCisgIAorICAgIFRoZSBzYW1lIHJ1bGVz
IGFwcGx5IHRvIGFycmF5cyBvZiBwcmltaXRpdmVzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIGRldmVsb3Blck5hbWVzID0gWydZZWh1ZGEnLCAnVG9tJywgJ1BhdWwnXQorICAgIGBg
YAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjZWFjaCBkZXZlbG9wZXJOYW1lcyBrZXk9
IkBpbmRleCIgYXMgfG5hbWV8fX0KKyAgICAgIHt7bmFtZX19CisgICAge3svZWFjaH19CisgICAg
YGBgCisgIAorICAgIER1cmluZyBpdGVyYXRpb24sIHRoZSBpbmRleCBvZiBlYWNoIGl0ZW0gaW4g
dGhlIGFycmF5IGlzIHByb3ZpZGVkIGFzIGEgc2Vjb25kIGJsb2NrIHBhcmFtZXRlci4KKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIDx1bD4KKyAgICAgIHt7I2VhY2ggcGVvcGxlIGFzIHxwZXJz
b24gaW5kZXh8fX0KKyAgICAgICAgPGxpPkhlbGxvLCB7e3BlcnNvbi5uYW1lfX0hIFlvdSdyZSBu
dW1iZXIge3tpbmRleH19IGluIGxpbmU8L2xpPgorICAgICAge3svZWFjaH19CisgICAgPC91bD4K
KyAgICBgYGAKKyAgCisgICAgIyMjIFNwZWNpZnlpbmcgS2V5cworICAKKyAgICBUaGUgYGtleWAg
b3B0aW9uIGlzIHVzZWQgdG8gdGVsbCBFbWJlciBob3cgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcnJh
eSBiZWluZworICAgIGl0ZXJhdGVkIG92ZXIgd2l0aCBge3sjZWFjaH19YCBoYXMgY2hhbmdlZCBi
ZXR3ZWVuIHJlbmRlcnMuIEJ5IGhlbHBpbmcgRW1iZXIKKyAgICBkZXRlY3QgdGhhdCBzb21lIGVs
ZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgdGhlIHNhbWUsIERPTSBlbGVtZW50cyBjYW4gYmUKKyAg
ICByZS11c2VkLCBzaWduaWZpY2FudGx5IGltcHJvdmluZyByZW5kZXJpbmcgc3BlZWQuCisgIAor
ICAgIEZvciBleGFtcGxlLCBoZXJlJ3MgdGhlIGB7eyNlYWNofX1gIGhlbHBlciB3aXRoIGl0cyBg
a2V5YCBzZXQgdG8gYGlkYDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2VhY2ggbW9k
ZWwga2V5PSJpZCIgYXMgfGl0ZW18fX0KKyAgICB7ey9lYWNofX0KKyAgICBgYGAKKyAgCisgICAg
V2hlbiB0aGlzIGB7eyNlYWNofX1gIHJlLXJlbmRlcnMsIEVtYmVyIHdpbGwgbWF0Y2ggdXAgdGhl
IHByZXZpb3VzbHkgcmVuZGVyZWQKKyAgICBpdGVtcyAoYW5kIHJlb3JkZXIgdGhlIGdlbmVyYXRl
ZCBET00gZWxlbWVudHMpIGJhc2VkIG9uIGVhY2ggaXRlbSdzIGBpZGAKKyAgICBwcm9wZXJ0eS4K
KyAgCisgICAgQnkgZGVmYXVsdCB0aGUgaXRlbSdzIG93biByZWZlcmVuY2UgaXMgdXNlZC4KKyAg
CisgICAgIyMjIHt7ZWxzZX19IGNvbmRpdGlvbgorICAKKyAgICBge3sjZWFjaH19YCBjYW4gaGF2
ZSBhIG1hdGNoaW5nIGB7e2Vsc2V9fWAuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrIHdpbGwg
cmVuZGVyCisgICAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuCisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgICB7eyNlYWNoIGRldmVsb3BlcnMgYXMgfHBlcnNvbnx9fQorICAgICAge3twZXJz
b24ubmFtZX19CisgICAge3tlbHNlfX0KKyAgICAgIDxwPlNvcnJ5LCBub2JvZHkgaXMgYXZhaWxh
YmxlIGZvciB0aGlzIHRhc2suPC9wPgorICAgIHt7L2VhY2h9fQorICAgIGBgYAorICAKKyAgICBA
bWV0aG9kIGVhY2gKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHB1Ymxp
YworICAqLworCisgIGZ1bmN0aW9uIGVhY2hIZWxwZXIocGFyYW1zLCBoYXNoLCBibG9ja3MpIHsK
KyAgICB2YXIgbGlzdCA9IHBhcmFtc1swXTsKKyAgICB2YXIga2V5UGF0aCA9IGhhc2gua2V5Owor
CisgICAgaWYgKF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9kaXNwbGF5LmRlZmF1bHQobGlzdCkp
IHsKKyAgICAgIGZvckVhY2gobGlzdCwgZnVuY3Rpb24gKGl0ZW0sIGkpIHsKKyAgICAgICAgdmFy
IGtleSA9IF9lbWJlckh0bWxiYXJzVXRpbHNEZWNvZGVFYWNoS2V5LmRlZmF1bHQoaXRlbSwga2V5
UGF0aCwgaSk7CisKKyAgICAgICAgYmxvY2tzLnRlbXBsYXRlLnlpZWxkSXRlbShrZXksIFtpdGVt
LCBpXSk7CisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKGJsb2Nrcy5pbnZlcnNlLnlpZWxkKSB7
CisgICAgICBibG9ja3MuaW52ZXJzZS55aWVsZCgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9u
IGZvckVhY2goaXRlcmFibGUsIGNiKSB7CisgICAgcmV0dXJuIGl0ZXJhYmxlLmZvckVhY2ggPyBp
dGVyYWJsZS5mb3JFYWNoKGNiKSA6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaXRlcmFi
bGUsIGNiKTsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL2hlbHBlcnMvaGFzaCIs
IFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAgLyoqCisgICBAbW9kdWxlIGVt
YmVyCisgICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAgKi8KKworICAgLyoqCisgICAg
ICBVc2UgdGhlIGB7e2hhc2h9fWAgaGVscGVyIHRvIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhcyBh
biBvcHRpb24gdG8geW91cgorICAgICAgY29tcG9uZW50cy4gVGhpcyBpcyBzcGVjaWFsbHkgdXNl
ZnVsIGZvciBjb250ZXh0dWFsIGNvbXBvbmVudHMgd2hlcmUgeW91IGNhbgorICAgICAganVzdCB5
aWVsZCBhIGhhc2g6CisgICAgICBgYGBoYW5kbGViYXJzCisgICAgICB7e3lpZWxkIChoYXNoCisg
ICAgICAgICBuYW1lPSdTYXJhaCcKKyAgICAgICAgIHRpdGxlPW9mZmljZQorICAgICAgKX19Cisg
ICAgICBgYGAKKyAgICAgIFdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3Qgc3VjaCBhczoKKyAgICAg
IGBgYGpzCisgICAgICB7IG5hbWU6ICdTYXJhaCcsIHRpdGxlOiB0aGlzLmdldCgnb2ZmaWNlJykg
fQorICAgICAgYGBgCisgICAgICBXaGVyZSB0aGUgYHRpdGxlYCBpcyBib3VuZCB0byB1cGRhdGVz
IG9mIHRoZSBgb2ZmaWNlYCBwcm9wZXJ0eS4KKyAgICAgIEBtZXRob2QgaGFzaAorICAgICAgQGZv
ciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMK
KyAgICAgIEByZXR1cm4ge09iamVjdH0gSGFzaAorICAgICAgQHB1YmxpYworICAgICovCisKKyAg
ICJ1c2Ugc3RyaWN0IjsKKworICAgZXhwb3J0cy5kZWZhdWx0ID0gaGFzaEhlbHBlcjsKKworICAg
ZnVuY3Rpb24gaGFzaEhlbHBlcihwYXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICAgIHJldHVy
biBoYXNoOworICAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvaWZfdW5s
ZXNzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXZpZXdzL3N0cmVh
bXMvc2hvdWxkX2Rpc3BsYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9kaXNwbGF5KSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIC8qKgorICAgIFVzZSB0aGUgYGlmYCBibG9jayBoZWxwZXIgdG8gY29uZGl0aW9uYWxs
eSByZW5kZXIgYSBibG9jayBkZXBlbmRpbmcgb24gYQorICAgIHByb3BlcnR5LiBJZiB0aGUgcHJv
cGVydHkgaXMgImZhbHNleSIsIGZvciBleGFtcGxlOiBgZmFsc2VgLCBgdW5kZWZpbmVkYCwKKyAg
IGBudWxsYCwgYCIiYCwgYDBgLCBgTmFOYCBvciBhbiBlbXB0eSBhcnJheSwgdGhlIGJsb2NrIHdp
bGwgbm90IGJlIHJlbmRlcmVkLgorICAKKyAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyEgd2lsbCBu
b3QgcmVuZGVyIGlmIGZvbyBpcyBmYWxzZXl9fQorICAgIHt7I2lmIGZvb319CisgICAgICBXZWxj
b21lIHRvIHRoZSB7e2Zvby5iYXJ9fQorICAgIHt7L2lmfX0KKyAgICBgYGAKKyAgCisgICAgWW91
IGNhbiBhbHNvIHNwZWNpZnkgYSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBwcm9wZXJ0eSBpcyBm
YWxzZXkgYnkgdXNpbmcKKyAgICB0aGUgYGVsc2VgIGhlbHBlci4KKyAgCisgICAgYGBgaGFuZGxl
YmFycworICAgIHt7ISBpcyBpdCByYWluaW5nIG91dHNpZGU/fX0KKyAgICB7eyNpZiBpc1JhaW5p
bmd9fQorICAgICAgWWVzLCBncmFiIGFuIHVtYnJlbGxhIQorICAgIHt7ZWxzZX19CisgICAgICBO
bywgaXQncyBsb3ZlbHkgb3V0c2lkZSEKKyAgICB7ey9pZn19CisgICAgYGBgCisgIAorICAgIFlv
dSBhcmUgYWxzbyBhYmxlIHRvIGNvbWJpbmUgYGVsc2VgIGFuZCBgaWZgIGhlbHBlcnMgdG8gY3Jl
YXRlIG1vcmUgY29tcGxleAorICAgIGNvbmRpdGlvbmFsIGxvZ2ljLgorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3sjaWYgaXNNb3JuaW5nfX0KKyAgICAgIEdvb2QgbW9ybmluZworICAgIHt7
ZWxzZSBpZiBpc0FmdGVybm9vbn19CisgICAgICBHb29kIGFmdGVybm9vbgorICAgIHt7ZWxzZX19
CisgICAgICBHb29kIG5pZ2h0CisgICAge3svaWZ9fQorICAgIGBgYAorICAKKyAgICBZb3UgY2Fu
IHVzZSBgaWZgIGlubGluZSB0byBjb25kaXRpb25hbGx5IHJlbmRlciBhIHNpbmdsZSBwcm9wZXJ0
eSBvciBzdHJpbmcuCisgICAgVGhpcyBoZWxwZXIgYWN0cyBsaWtlIGEgdGVybmFyeSBvcGVyYXRv
ci4gSWYgdGhlIGZpcnN0IHByb3BlcnR5IGlzIHRydXRoeSwKKyAgICB0aGUgc2Vjb25kIGFyZ3Vt
ZW50IHdpbGwgYmUgZGlzcGxheWVkLCBpZiBub3QsIHRoZSB0aGlyZCBhcmd1bWVudCB3aWxsIGJl
CisgICAgZGlzcGxheWVkCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2lmIHVzZUxvbmdH
cmVldGluZyAiSGVsbG8iICJIaSJ9fSBEYXZlCisgICAgYGBgCisgIAorICAgIEZpbmFsbHksIHlv
dSBjYW4gdXNlIHRoZSBgaWZgIGhlbHBlciBpbnNpZGUgYW5vdGhlciBoZWxwZXIgYXMgYSBzdWJl
eHByZXNzaW9uLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tzb21lLWNvbXBvbmVudCBo
ZWlnaHQ9KGlmIGlzQmlnICIxMDAiICIxMCIpfX0KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBp
ZgorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisg
IGZ1bmN0aW9uIGlmSGVscGVyKHBhcmFtcywgaGFzaCwgb3B0aW9ucykgeworICAgIHJldHVybiBp
ZlVubGVzcyhwYXJhbXMsIGhhc2gsIG9wdGlvbnMsIF9lbWJlclZpZXdzU3RyZWFtc1Nob3VsZF9k
aXNwbGF5LmRlZmF1bHQocGFyYW1zWzBdKSk7CisgIH0KKworICAvKioKKyAgICBUaGUgYHVubGVz
c2AgaGVscGVyIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBgaWZgIGhlbHBlci4gSXRzIGJsb2NrIHdp
bGwgYmUKKyAgICByZW5kZXJlZCBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhIGZhbHNleSB2
YWx1ZS4gIEFsbCBmb3JtcyBvZiB0aGUgYGlmYAorICAgIGhlbHBlciBjYW4gYWxzbyBiZSB1c2Vk
IHdpdGggYHVubGVzc2AuCisgIAorICAgIEBtZXRob2QgdW5sZXNzCisgICAgQGZvciBFbWJlci5U
ZW1wbGF0ZXMuaGVscGVycworICAgIEBwdWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24gdW5sZXNzSGVs
cGVyKHBhcmFtcywgaGFzaCwgb3B0aW9ucykgeworICAgIHJldHVybiBpZlVubGVzcyhwYXJhbXMs
IGhhc2gsIG9wdGlvbnMsICFfZW1iZXJWaWV3c1N0cmVhbXNTaG91bGRfZGlzcGxheS5kZWZhdWx0
KHBhcmFtc1swXSkpOworICB9CisKKyAgZnVuY3Rpb24gaWZVbmxlc3MocGFyYW1zLCBoYXNoLCBv
cHRpb25zLCB0cnV0aHkpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGJsb2Nr
IGZvcm0gb2YgdGhlIGBpZmAgYW5kIGB1bmxlc3NgIGhlbHBlcnMgZXhwZWN0IGV4YWN0bHkgb25l
ICcgKyAnYXJndW1lbnQsIGUuZy4gYHt7I2lmIG5ld01lc3NhZ2VzfX0gWW91IGhhdmUgbmV3IG1l
c3NhZ2VzLiB7ey9pZn19LmAnLCAhb3B0aW9ucy50ZW1wbGF0ZS55aWVsZCB8fCBwYXJhbXMubGVu
Z3RoID09PSAxKTsKKworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgaW5saW5lIGZv
cm0gb2YgdGhlIGBpZmAgYW5kIGB1bmxlc3NgIGhlbHBlcnMgZXhwZWN0IHR3byBvciAnICsgJ3Ro
cmVlIGFyZ3VtZW50cywgZS5nLiBge3tpZiB0cmlhbEV4cGlyZWQgXCdFeHBpcmVkXCcgZXhwaXJ5
RGF0ZX19YCAnICsgJ29yIGB7e3VubGVzcyBpc0ZpcnN0TG9naW4gXCdXZWxjb21lIGJhY2shXCd9
fWAuJywgISFvcHRpb25zLnRlbXBsYXRlLnlpZWxkIHx8IHBhcmFtcy5sZW5ndGggPT09IDIgfHwg
cGFyYW1zLmxlbmd0aCA9PT0gMyk7CisKKyAgICBpZiAodHJ1dGh5KSB7CisgICAgICBpZiAob3B0
aW9ucy50ZW1wbGF0ZS55aWVsZCkgeworICAgICAgICBvcHRpb25zLnRlbXBsYXRlLnlpZWxkKCk7
CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGFyYW1zWzFdOworICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICBpZiAob3B0aW9ucy5pbnZlcnNlLnlpZWxkKSB7CisgICAgICAgIG9w
dGlvbnMuaW52ZXJzZS55aWVsZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBh
cmFtc1syXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLmlmSGVscGVyID0gaWZI
ZWxwZXI7CisgIGV4cG9ydHMudW5sZXNzSGVscGVyID0gdW5sZXNzSGVscGVyOworfSk7Citlbmlm
ZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9jJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL2hlbHBlcicsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlckh0bWxiYXJzSGVscGVyLCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgorICAgIENhbGxzIFtFbWJlci5TdHJpbmcu
bG9jXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2xvYykgd2l0aCB0aGUK
KyAgICBwcm92aWRlZCBzdHJpbmcuIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6
ZSB0ZXh0IHdpdGhpbiBhIHRlbXBsYXRlLgorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIuU1RSSU5HUyA9IHsKKyAgICAgICdfd2VsY29tZV8nOiAnQm9u
am91cicKKyAgICB9OworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGRpdiBj
bGFzcz0nbWVzc2FnZSc+CisgICAgICB7e2xvYyAnX3dlbGNvbWVfJ319CisgICAgPC9kaXY+Cisg
ICAgYGBgCisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGNsYXNzPSdtZXNzYWdlJz4KKyAgICAg
IEJvbmpvdXIKKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgU2VlIFtFbWJlci5TdHJpbmcu
bG9jXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2xvYykgZm9yIGhvdyB0
bworICAgIHNldCB1cCBsb2NhbGl6ZWQgc3RyaW5nIHJlZmVyZW5jZXMuCisgIAorICAgIEBtZXRo
b2QgbG9jCisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgIEBwYXJhbSB7U3Ry
aW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQuCisgICAgQHNlZSB7RW1iZXIuU3RyaW5nI2xv
Y30KKyAgICBAcHVibGljCisgICovCisgIGZ1bmN0aW9uIGxvY0hlbHBlcihwYXJhbXMpIHsKKyAg
ICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5sb2MuYXBwbHkobnVsbCwgcGFyYW1z
KTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBl
cihsb2NIZWxwZXIpOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvbG9nJywg
WydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2xvZ2dlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxMb2dnZXIpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gbG9nSGVscGVyOworCisgIC8qKgorICAgIGBsb2dgIGFsbG93cyB5b3UgdG8gb3V0cHV0
IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nCisgICAgY29u
dGV4dC4gYGxvZ2AgYWxzbyBhY2NlcHRzIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIHN0cmluZ3Mg
b3IgbnVtYmVycy4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7bG9nICJteVZhcmlhYmxl
OiIgbXlWYXJpYWJsZSB9fQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxvZworICAgIEBmb3Ig
RW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcGFyYW0geyp9IHZhbHVlcworICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBsb2dIZWxwZXIodmFsdWVzKSB7CisgICAgX2VtYmVyTWV0
YWxMb2dnZXIuZGVmYXVsdC5sb2cuYXBwbHkobnVsbCwgdmFsdWVzKTsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvd2l0aCcsIFsnZXhwb3J0cycsICdlbWJlci12aWV3
cy9zdHJlYW1zL3Nob3VsZF9kaXNwbGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3
c1N0cmVhbXNTaG91bGRfZGlzcGxheSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzLmRlZmF1bHQgPSB3aXRoSGVscGVyOworCisgIC8qKgorICAgIFVzZSB0aGUgYHt7d2l0aH19
YCBoZWxwZXIgd2hlbiB5b3Ugd2FudCB0byBhbGlhcyBhIHByb3BlcnR5IHRvIGEgbmV3IG5hbWUu
IFRoaXMgaXMgaGVscGZ1bAorICAgIGZvciBzZW1hbnRpYyBjbGFyaXR5IGFzIGl0IGFsbG93cyB5
b3UgdG8gcmV0YWluIGRlZmF1bHQgc2NvcGUgb3IgdG8gcmVmZXJlbmNlIGEgcHJvcGVydHkgZnJv
bSBhbm90aGVyCisgICAgYHt7d2l0aH19YCBibG9jay4KKyAgCisgICAgSWYgdGhlIGFsaWFzZWQg
cHJvcGVydHkgaXMgImZhbHNleSIsIGZvciBleGFtcGxlOiBgZmFsc2VgLCBgdW5kZWZpbmVkYCBg
bnVsbGAsIGAiImAsIGAwYCwgTmFOIG9yCisgICAgYW4gZW1wdHkgYXJyYXksIHRoZSBibG9jayB3
aWxsIG5vdCBiZSByZW5kZXJlZC4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBXaWxs
IG9ubHkgcmVuZGVyIGlmIHVzZXIucG9zdHMgY29udGFpbnMgaXRlbXN9fQorICAgIHt7I3dpdGgg
dXNlci5wb3N0cyBhcyB8YmxvZ1Bvc3RzfH19CisgICAgICA8ZGl2IGNsYXNzPSJub3RpY2UiPgor
ICAgICAgICBUaGVyZSBhcmUge3tibG9nUG9zdHMubGVuZ3RofX0gYmxvZyBwb3N0cyB3cml0dGVu
IGJ5IHt7dXNlci5uYW1lfX0uCisgICAgICA8L2Rpdj4KKyAgICAgIHt7I2VhY2ggYmxvZ1Bvc3Rz
IGFzIHxwb3N0fH19CisgICAgICAgIDxsaT57e3Bvc3QudGl0bGV9fTwvbGk+CisgICAgICB7ey9l
YWNofX0KKyAgICB7ey93aXRofX0KKyAgICBgYGAKKyAgCisgICAgV2l0aG91dCB0aGUgYGFzYCBv
cGVyYXRvciwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byByZWZlcmVuY2UgYHVzZXIubmFtZWAg
aW4gdGhlIGV4YW1wbGUgYWJvdmUuCisgIAorICAgIE5PVEU6IFRoZSBhbGlhcyBzaG91bGQgbm90
IHJldXNlIGEgbmFtZSBmcm9tIHRoZSBib3VuZCBwcm9wZXJ0eSBwYXRoLgorICAgIEZvciBleGFt
cGxlOiBge3sjd2l0aCBmb28uYmFyIGFzIHxmb298fX1gIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVz
ZSBpdCBhdHRlbXB0cyB0byBhbGlhcyB1c2luZworICAgIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBw
cm9wZXJ0eSBwYXRoLCBgZm9vYC4gSW5zdGVhZCwgdXNlIGB7eyN3aXRoIGZvby5iYXIgYXMgfGJh
enx9fWAuCisgIAorICAgIEBtZXRob2Qgd2l0aAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhl
bHBlcnMKKyAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgIEByZXR1cm4ge1N0cmluZ30g
SFRNTCBzdHJpbmcKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gd2l0aEhlbHBlcihw
YXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICBpZiAoX2VtYmVyVmlld3NTdHJlYW1zU2hvdWxk
X2Rpc3BsYXkuZGVmYXVsdChwYXJhbXNbMF0pKSB7CisgICAgICBvcHRpb25zLnRlbXBsYXRlLnlp
ZWxkKFtwYXJhbXNbMF1dKTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW52ZXJzZSAmJiBvcHRp
b25zLmludmVyc2UueWllbGQpIHsKKyAgICAgIG9wdGlvbnMuaW52ZXJzZS55aWVsZChbXSk7Cisg
ICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvYmluZC1ibG9jaycs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gYmluZEJsb2NrOworCisgIGZ1bmN0aW9uIGJpbmRCbG9jayhlbnYs
IHNjb3BlLCBibG9jaykgeworICAgIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8
IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gJ2RlZmF1bHQnIDogYXJndW1lbnRzWzNdOwor
CisgICAgc2NvcGUuYmluZEJsb2NrKG5hbWUsIGJsb2NrKTsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtbG9jYWwnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
c3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9wcm94eS1zdHJlYW0nXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSwgX2VtYmVyTWV0YWxTdHJl
YW1zUHJveHlTdHJlYW0pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBiaW5kTG9jYWw7CisKKyAgZnVuY3Rpb24gYmluZExvY2FsKGVudiwgc2NvcGUsIGtleSwg
dmFsdWUpIHsKKyAgICAvLyBUT0RPOiBXaGF0IGlzIHRoZSBjYXVzZSBvZiB0aGVzZSBjYXNlcz8K
KyAgICBpZiAoc2NvcGUuaGFzT3duTG9jYWwoa2V5KSkgeworICAgICAgdmFyIGV4aXN0aW5nID0g
c2NvcGUuZ2V0TG9jYWwoa2V5KTsKKyAgICAgIGlmIChleGlzdGluZyAhPT0gdmFsdWUpIHsKKyAg
ICAgICAgZXhpc3Rpbmcuc2V0U291cmNlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2Ugewor
ICAgICAgdmFyIG5ld1ZhbHVlID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLndyYXAodmFsdWUs
IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQsIGtleSk7CisgICAgICBzY29w
ZS5iaW5kTG9jYWwoa2V5LCBuZXdWYWx1ZSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgiZW1i
ZXItaHRtbGJhcnMvaG9va3MvYmluZC1zY29wZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhw
b3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gYmluZFNjb3Bl
OworCisgIGZ1bmN0aW9uIGJpbmRTY29wZShlbnYsIHNjb3BlKSB7fQorfSk7CitlbmlmZWQoJ2Vt
YmVyLWh0bWxiYXJzL2hvb2tzL2JpbmQtc2VsZicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbCcs
ICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbSddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWwsIF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gYmluZFNlbGY7CisKKyAgZnVuY3Rpb24g
YmluZFNlbGYoZW52LCBzY29wZSwgc2VsZikgeworICAgIGlmIChzZWxmICYmIHNlbGYuaXNWaWV3
KSB7CisgICAgICBpZiAoISFfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9W
SUVXX1NVUFBPUlQpIHsKKyAgICAgICAgc2NvcGUuYmluZExvY2FsKCd2aWV3JywgbmV3U3RyZWFt
KHNlbGYsICd2aWV3JykpOworICAgICAgfQorCisgICAgICB2YXIgX3NlbGZTdHJlYW0gPSBuZXdT
dHJlYW0oc2VsZiwgJycpOworCisgICAgICBpZiAoc2VsZi5pc0dsaW1tZXJDb21wb25lbnQpIHsK
KyAgICAgICAgc2NvcGUuYmluZFNlbGYoX3NlbGZTdHJlYW0pOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgc2NvcGUuYmluZFNlbGYobmV3U3RyZWFtKF9zZWxmU3RyZWFtLmdldEtleSgnY29udGV4
dCcpLCAnJykpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHNl
bGZTdHJlYW0gPSBuZXdTdHJlYW0oc2VsZiwgJycpOworICAgIHNjb3BlLmJpbmRTZWxmKHNlbGZT
dHJlYW0pOworICB9CisKKyAgZnVuY3Rpb24gbmV3U3RyZWFtKG5ld1ZhbHVlLCBrZXkpIHsKKyAg
ICByZXR1cm4gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFs
dWUsIGtleSk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9iaW5kLXNo
YWRvdy1zY29wZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVh
bSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0pIHsK
KyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBiaW5kU2hhZG93U2Nv
cGU7CisKKyAgZnVuY3Rpb24gYmluZFNoYWRvd1Njb3BlKGVudiwgcGFyZW50U2NvcGUsIHNoYWRv
d1Njb3BlLCBvcHRpb25zKSB7CisgICAgaWYgKCFvcHRpb25zKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgdmFyIHZpZXcgPSBvcHRpb25zLnZpZXc7CisgICAgaWYgKHZpZXcgJiYgIXZp
ZXcuaXNDb21wb25lbnQpIHsKKyAgICAgIHNoYWRvd1Njb3BlLmJpbmRMb2NhbCgndmlldycsIG5l
d1N0cmVhbSh2aWV3LCAndmlldycpKTsKKworICAgICAgaWYgKHZpZXcuaXNWaWV3KSB7CisgICAg
ICAgIHNoYWRvd1Njb3BlLmJpbmRTZWxmKG5ld1N0cmVhbShzaGFkb3dTY29wZS5nZXRMb2NhbCgn
dmlldycpLmdldEtleSgnY29udGV4dCcpLCAnJykpOworICAgICAgfQorICAgIH0KKworICAgIHNo
YWRvd1Njb3BlLmJpbmRWaWV3KHZpZXcpOworCisgICAgaWYgKHZpZXcgJiYgb3B0aW9ucy5hdHRy
cykgeworICAgICAgc2hhZG93U2NvcGUuYmluZENvbXBvbmVudCh2aWV3KTsKKyAgICB9CisKKyAg
ICBpZiAoJ2F0dHJzJyBpbiBvcHRpb25zKSB7CisgICAgICBzaGFkb3dTY29wZS5iaW5kQXR0cnMo
b3B0aW9ucy5hdHRycyk7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRvd1Njb3BlOworICB9CisK
KyAgZnVuY3Rpb24gbmV3U3RyZWFtKG5ld1ZhbHVlLCBrZXkpIHsKKyAgICByZXR1cm4gbmV3IF9l
bWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFsdWUsIGtleSk7CisgIH0K
K30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9jbGFzc2lmeScsIFsnZXhwb3J0cycs
ICdlbWJlci1odG1sYmFycy91dGlscy9pcy1jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlckh0bWxiYXJzVXRpbHNJc0NvbXBvbmVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNsYXNzaWZ5OworCisgIGZ1bmN0aW9uIGNsYXNzaWZ5KGVu
diwgc2NvcGUsIHBhdGgpIHsKKyAgICBpZiAoX2VtYmVySHRtbGJhcnNVdGlsc0lzQ29tcG9uZW50
LmRlZmF1bHQoZW52LCBzY29wZSwgcGF0aCkpIHsKKyAgICAgIHJldHVybiAnY29tcG9uZW50JzsK
KyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxi
YXJzL2hvb2tzL2NsZWFudXAtcmVuZGVyLW5vZGUiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4
cG9ydHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1s
YmFycworICAqLworCisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjbGVh
bnVwUmVuZGVyTm9kZTsKKworICBmdW5jdGlvbiBjbGVhbnVwUmVuZGVyTm9kZShyZW5kZXJOb2Rl
KSB7CisgICAgaWYgKHJlbmRlck5vZGUuY2xlYW51cCkgeworICAgICAgcmVuZGVyTm9kZS5jbGVh
bnVwKCk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvY29t
cG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2ZlYXR1cmVzJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvY29tcG9uZW50LW5vZGUtbWFu
YWdlcicsICdlbWJlci12aWV3cy9zeXN0ZW0vYnVpbGQtY29tcG9uZW50LXRlbXBsYXRlJywgJ2Vt
YmVyLWh0bWxiYXJzL3V0aWxzL2xvb2t1cC1jb21wb25lbnQnLCAnZW1iZXItbWV0YWwvYXNzaWdu
JywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1tZXRhbC9jYWNoZScsICdlbWJl
ci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdlbWJlci1odG1sYmFycy91dGlscy9l
eHRyYWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1
cmUtY29tcG9uZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJIdG1sYmFyc05vZGVNYW5hZ2Vyc0NvbXBvbmVudE5vZGVN
YW5hZ2VyLCBfZW1iZXJWaWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVtcGxhdGUsIF9lbWJlckh0
bWxiYXJzVXRpbHNMb29rdXBDb21wb25lbnQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1iZXJNZXRh
bEVtcHR5X29iamVjdCwgX2VtYmVyTWV0YWxDYWNoZSwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29r
dXBIZWxwZXIsIF9lbWJlckh0bWxiYXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNvbXBvbmVudEhvb2s7CisKKyAgdmFyIElTX0FOR0xFX0NB
Q0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7
CisgICAgcmV0dXJuIGtleS5tYXRjaCgvXihAPyk8KC4qKT4kLyk7CisgIH0pOworCisgIGZ1bmN0
aW9uIGNvbXBvbmVudEhvb2socmVuZGVyTm9kZSwgZW52LCBzY29wZSwgX3RhZ05hbWUsIHBhcmFt
cywgYXR0cnMsIHRlbXBsYXRlcywgdmlzaXRvcikgeworICAgIHZhciBzdGF0ZSA9IHJlbmRlck5v
ZGUuZ2V0U3RhdGUoKTsKKworICAgIHZhciB0YWdOYW1lID0gX3RhZ05hbWU7CisgICAgaWYgKF9l
bWJlckh0bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RPVF9DQUNIRS5nZXQodGFn
TmFtZSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBlbnYuaG9va3MuZ2V0KGVudiwgc2NvcGUsIHRh
Z05hbWUpOworICAgICAgdmFyIGNvbXBvbmVudENlbGwgPSBzdHJlYW0udmFsdWUoKTsKKyAgICAg
IGlmIChfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5pc0NvbXBvbmVudENl
bGwoY29tcG9uZW50Q2VsbCkpIHsKKyAgICAgICAgdGFnTmFtZSA9IGNvbXBvbmVudENlbGxbX2Vt
YmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuQ09NUE9ORU5UX1BBVEhdOworCisg
ICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3NpbmcgcG9zaXRpb25hbCBwYXJhbXMgYmVmb3Jl
IG1lcmdpbmcgaW50byBhIGhhc2ggbXVzdCBiZSBkb25lCisgICAgICAgICAqIGhlcmUgdG8gYXZv
aWQgcHJvYmxlbXMgd2l0aCByZXN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycyByZW5kZXJlZCB1c2lu
ZworICAgICAgICAgKiB0aGUgZG90IG5vdGF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBD
bG9zdXJlIGNvbXBvbmVudHMgKGZvciB0aGUgY29udGV4dHVhbCBjb21wb25lbnQgZmVhdHVyZSkg
ZG8gbm90CisgICAgICAgICAqIGFjdHVhbGx5IGtlZXAgdGhlIHBvc2l0aW9uYWwgcGFyYW1zLCBi
dXQgcHJvY2VzcyB0aGVtIGF0IGVhY2ggbGV2ZWwuCisgICAgICAgICAqIFRoZXJlZm9yZSwgd2hl
biByZW5kZXJpbmcgYSBjbG9zdXJlIGNvbXBvbmVudCB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAg
ICAgICogaGVscGVyIHdlIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMgYW5kIGF0dHJpYnV0ZXMgYW5k
IHRoZW4gbWVyZ2UgdGhvc2UKKyAgICAgICAgICogb24gdG9wIG9mIHRoZSBjbG9zdXJlIGNvbXBv
bmVudCBhdHRyaWJ1dGVzLgorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgdmFyIG5l
d0F0dHJzID0gX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChuZXcgX2VtYmVyTWV0YWxFbXB0eV9v
YmplY3QuZGVmYXVsdCgpLCBhdHRycyk7CisgICAgICAgIF9lbWJlckh0bWxiYXJzS2V5d29yZHND
bG9zdXJlQ29tcG9uZW50LnByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50
Q2VsbCwgcGFyYW1zLCBuZXdBdHRycyk7CisgICAgICAgIHBhcmFtcyA9IFtdOworICAgICAgICBh
dHRycyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50Lm1lcmdlSW5OZXdI
YXNoKGNvbXBvbmVudENlbGxbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQu
Q09NUE9ORU5UX0hBU0hdLCBuZXdBdHRycyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRGV0
ZXJtaW5lIGlmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb3IgYSByZS1yZW5kZXIuCisgICAg
aWYgKHN0YXRlLm1hbmFnZXIpIHsKKyAgICAgIHZhciBzbSA9IHN0YXRlLm1hbmFnZXI7CisgICAg
ICB2YXIgdGVtcGxhdGVNZXRhID0gbnVsbDsKKyAgICAgIGlmIChzbS5ibG9jaykgeworICAgICAg
ICB0ZW1wbGF0ZU1ldGEgPSBzbS5ibG9jay50ZW1wbGF0ZS5tZXRhOworICAgICAgfSBlbHNlIGlm
IChzbS5zY29wZSAmJiBzbS5zY29wZS5fdmlldykgeworICAgICAgICB0ZW1wbGF0ZU1ldGEgPSBz
bS5zY29wZS5fdmlldy50ZW1wbGF0ZS5tZXRhOworICAgICAgfQorICAgICAgZW52Lm1ldGEubW9k
dWxlTmFtZSA9IHRlbXBsYXRlTWV0YSAmJiB0ZW1wbGF0ZU1ldGEubW9kdWxlTmFtZSB8fCBlbnYu
bWV0YSAmJiBlbnYubWV0YS5tb2R1bGVOYW1lOworICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc0V4
dHJhY3RQb3NpdGlvbmFsUGFyYW1zLmRlZmF1bHQocmVuZGVyTm9kZSwgc20uY29tcG9uZW50LmNv
bnN0cnVjdG9yLCBwYXJhbXMsIGF0dHJzLCBmYWxzZSk7CisgICAgICBzdGF0ZS5tYW5hZ2VyLnJl
cmVuZGVyKGVudiwgYXR0cnMsIHZpc2l0b3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IHZhciBpc0FuZ2xlQnJhY2tldCA9IGZhbHNlOworICAgIHZhciBpc1RvcExldmVsID0gZmFsc2U7
CisgICAgdmFyIGlzRGFzaGVyaXplZCA9IGZhbHNlOworCisgICAgdmFyIGFuZ2xlcyA9IElTX0FO
R0xFX0NBQ0hFLmdldCh0YWdOYW1lKTsKKworICAgIGlmIChhbmdsZXMpIHsKKyAgICAgIHRhZ05h
bWUgPSBhbmdsZXNbMl07CisgICAgICBpc0FuZ2xlQnJhY2tldCA9IHRydWU7CisgICAgICBpc1Rv
cExldmVsID0gISFhbmdsZXNbMV07CisgICAgfQorCisgICAgaWYgKF9lbWJlckh0bWxiYXJzU3lz
dGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RBU0hfQ0FDSEUuZ2V0KHRhZ05hbWUpKSB7CisgICAg
ICBpc0Rhc2hlcml6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZhciBwYXJlbnRWaWV3ID0gZW52
LnZpZXc7CisKKyAgICAvLyB8IFRvcC1sZXZlbCAgICB8IEludm9jYXRpb246IDxmb28tYmFyPiAg
ICB8IEludm9jYXRpb246IHt7Zm9vLWJhcn19ICB8CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAg
IC8vIHwgPGRpdj4gICAgICAgIHwgPGRpdj4gaXMgY29tcG9uZW50IGVsICAgIHwgbm8gc3BlY2lh
bCBzZW1hbnRpY3MgKGEpIHwKKyAgICAvLyB8IDxmb28tYmFyPiAgICB8IDxmb28tYmFyPiBpcyBp
ZGVudGl0eSBlbCB8IEVXVEYgICAgICAgICAgICAgICAgICAgICB8CisgICAgLy8gfCA8YmFyLWJh
ej4gICAgfCByZWN1cnNpdmUgaW52b2NhdGlvbiAgICAgfCBubyBzcGVjaWFsIHNlbWFudGljcyAg
ICAgfAorICAgIC8vIHwge3thbnl0aGluZ319IHwgRVdURiAgICAgICAgICAgICAgICAgICAgIHwg
bm8gc3BlY2lhbCBzZW1hbnRpY3MgICAgIHwKKyAgICAvLworICAgIC8vIChhKSBuZWVkcyB0byBi
ZSBpbXBsZW1lbnRlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHVzdWFsIHNlbWFudGljcyBvZgor
ICAgIC8vICAgICA8ZGl2PiBhcmUgZGVmaW5lZCBieSB0aGUgY29tcGlsZWQgdGVtcGxhdGUsIGFu
ZCB3ZSBuZWVkIHRvIGVtdWxhdGUKKyAgICAvLyAgICAgdGhvc2Ugc2VtYW50aWNzLgorCisgICAg
dmFyIGN1cnJlbnRDb21wb25lbnQgPSBlbnYudmlldzsKKyAgICB2YXIgaXNJbnZva2VkV2l0aEFu
Z2xlcyA9IGN1cnJlbnRDb21wb25lbnQgJiYgY3VycmVudENvbXBvbmVudC5faXNBbmdsZUJyYWNr
ZXQ7CisgICAgdmFyIGlzSW52b2tlZFdpdGhDdXJsaWVzID0gY3VycmVudENvbXBvbmVudCAmJiAh
Y3VycmVudENvbXBvbmVudC5faXNBbmdsZUJyYWNrZXQ7CisKKyAgICAvLyA8ZGl2PiBhdCB0aGUg
dG9wIGxldmVsIG9mIGEgPGZvby1iYXI+IGludm9jYXRpb24uCisgICAgdmFyIGlzQ29tcG9uZW50
SFRNTEVsZW1lbnQgPSBpc0FuZ2xlQnJhY2tldCAmJiAhaXNEYXNoZXJpemVkICYmIGlzSW52b2tl
ZFdpdGhBbmdsZXM7CisKKyAgICAvLyA8Zm9vLWJhcj4gYXQgdGhlIHRvcCBsZXZlbCBvZiBhIDxm
b28tYmFyPiBpbnZvY2F0aW9uLgorICAgIHZhciBpc0NvbXBvbmVudElkZW50aXR5RWxlbWVudCA9
IGlzQW5nbGVCcmFja2V0ICYmIGlzVG9wTGV2ZWwgJiYgdGFnTmFtZSA9PT0gZW52LnZpZXcudGFn
TmFtZTsKKworICAgIC8vIDxkaXY+IGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSB7e2Zvby1iYXJ9fSBp
bnZvY2F0aW9uLgorICAgIHZhciBpc05vcm1hbEhUTUxFbGVtZW50ID0gaXNBbmdsZUJyYWNrZXQg
JiYgIWlzRGFzaGVyaXplZCAmJiBpc0ludm9rZWRXaXRoQ3VybGllczsKKworICAgIHZhciBjb21w
b25lbnQgPSB1bmRlZmluZWQsCisgICAgICAgIGxheW91dCA9IHVuZGVmaW5lZDsKKyAgICBpZiAo
aXNEYXNoZXJpemVkIHx8ICFpc0FuZ2xlQnJhY2tldCkgeworICAgICAgdmFyIG9wdGlvbnMgPSB7
fTsKKworICAgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0YSAmJiBlbnYubWV0YS5tb2R1bGVO
YW1lOworCisgICAgICBpZiAobW9kdWxlTmFtZSkgeworICAgICAgICBvcHRpb25zLnNvdXJjZSA9
ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlc3VsdCA9
IF9lbWJlckh0bWxiYXJzVXRpbHNMb29rdXBDb21wb25lbnQuZGVmYXVsdChlbnYub3duZXIsIHRh
Z05hbWUsIG9wdGlvbnMpOworCisgICAgICBjb21wb25lbnQgPSByZXN1bHQuY29tcG9uZW50Owor
ICAgICAgbGF5b3V0ID0gcmVzdWx0LmxheW91dDsKKworICAgICAgaWYgKGlzQW5nbGVCcmFja2V0
ICYmIGlzRGFzaGVyaXplZCAmJiAhY29tcG9uZW50ICYmICFsYXlvdXQpIHsKKyAgICAgICAgaXND
b21wb25lbnRIVE1MRWxlbWVudCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnSFRNTEJhcnMgZXJyb3I6IENvdWxkIG5vdCBmaW5kIGNvbXBv
bmVudCBuYW1lZCAiJyArIHRhZ05hbWUgKyAnIiAobm8gY29tcG9uZW50IG9yIHRlbXBsYXRlIHdp
dGggdGhhdCBuYW1lIHdhcyBmb3VuZCknLCAhIShjb21wb25lbnQgfHwgbGF5b3V0KSk7CisgICAg
ICB9CisgICAgfQorCisgICAgaWYgKGlzQ29tcG9uZW50SWRlbnRpdHlFbGVtZW50IHx8IGlzQ29t
cG9uZW50SFRNTEVsZW1lbnQpIHsKKyAgICAgIC8vIEluc2lkZSB0aGUgbGF5b3V0IGZvciA8Zm9v
LWJhcj4gaW52b2tlZCB3aXRoIGFuZ2xlcywgdGhpcyBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQK
KyAgICAgIC8vIGZvciB0aGUgY29tcG9uZW50LiBJdCBjYW4gZWl0aGVyIGJlIGA8Zm9vLWJhcj5g
ICh0aGUgImlkZW50aXR5IGVsZW1lbnQiKSBvciBhbnkKKyAgICAgIC8vIG5vcm1hbCBIVE1MIGVs
ZW1lbnQgKG5vbi1kYXNoZXJpemVkKS4KKyAgICAgIHZhciB0ZW1wbGF0ZU9wdGlvbnMgPSB7Cisg
ICAgICAgIGNvbXBvbmVudDogY3VycmVudENvbXBvbmVudCwKKyAgICAgICAgdGFnTmFtZTogdGFn
TmFtZSwKKyAgICAgICAgaXNBbmdsZUJyYWNrZXQ6IHRydWUsCisgICAgICAgIGlzQ29tcG9uZW50
RWxlbWVudDogdHJ1ZSwKKyAgICAgICAgb3V0ZXJBdHRyczogc2NvcGUuZ2V0QXR0cnMoKSwKKyAg
ICAgICAgcGFyZW50U2NvcGU6IHNjb3BlCisgICAgICB9OworCisgICAgICB2YXIgY29udGVudE9w
dGlvbnMgPSB7IHRlbXBsYXRlczogdGVtcGxhdGVzLCBzY29wZTogc2NvcGUgfTsKKworICAgICAg
dmFyIF9idWlsZENvbXBvbmVudFRlbXBsYXRlID0gX2VtYmVyVmlld3NTeXN0ZW1CdWlsZENvbXBv
bmVudFRlbXBsYXRlLmRlZmF1bHQodGVtcGxhdGVPcHRpb25zLCBhdHRycywgY29udGVudE9wdGlv
bnMpOworCisgICAgICB2YXIgYmxvY2sgPSBfYnVpbGRDb21wb25lbnRUZW1wbGF0ZS5ibG9jazsK
KworICAgICAgYmxvY2suaW52b2tlKGVudiwgW10sIHVuZGVmaW5lZCwgcmVuZGVyTm9kZSwgc2Nv
cGUsIHZpc2l0b3IpOworICAgIH0gZWxzZSBpZiAoaXNOb3JtYWxIVE1MRWxlbWVudCkgeworICAg
ICAgdmFyIGJsb2NrID0gX2VtYmVyVmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmJ1
aWxkSFRNTFRlbXBsYXRlKHRhZ05hbWUsIGF0dHJzLCB7IHRlbXBsYXRlczogdGVtcGxhdGVzLCBz
Y29wZTogc2NvcGUgfSk7CisgICAgICBibG9jay5pbnZva2UoZW52LCBbXSwgdW5kZWZpbmVkLCBy
ZW5kZXJOb2RlLCBzY29wZSwgdmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEludm9r
aW5nIGEgY29tcG9uZW50IGZyb20gdGhlIG91dHNpZGUgKGVpdGhlciB2aWEgPGZvby1iYXI+IGFu
Z2xlIGJyYWNrZXRzCisgICAgICAvLyBvciB7e2Zvby1iYXJ9fSBsZWdhY3kgY3VybGllcykuCisK
KyAgICAgIHZhciBtYW5hZ2VyID0gX2VtYmVySHRtbGJhcnNOb2RlTWFuYWdlcnNDb21wb25lbnRO
b2RlTWFuYWdlci5kZWZhdWx0LmNyZWF0ZShyZW5kZXJOb2RlLCBlbnYsIHsKKyAgICAgICAgdGFn
TmFtZTogdGFnTmFtZSwKKyAgICAgICAgcGFyYW1zOiBwYXJhbXMsCisgICAgICAgIGF0dHJzOiBh
dHRycywKKyAgICAgICAgcGFyZW50VmlldzogcGFyZW50VmlldywKKyAgICAgICAgdGVtcGxhdGVz
OiB0ZW1wbGF0ZXMsCisgICAgICAgIGlzQW5nbGVCcmFja2V0OiBpc0FuZ2xlQnJhY2tldCwKKyAg
ICAgICAgaXNUb3BMZXZlbDogaXNUb3BMZXZlbCwKKyAgICAgICAgY29tcG9uZW50OiBjb21wb25l
bnQsCisgICAgICAgIGxheW91dDogbGF5b3V0LAorICAgICAgICBwYXJlbnRTY29wZTogc2NvcGUK
KyAgICAgIH0pOworCisgICAgICBzdGF0ZS5tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgIG1hbmFn
ZXIucmVuZGVyKGVudiwgdmlzaXRvcik7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
aHRtbGJhcnMvaG9va3MvY29uY2F0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzKSB7Cisg
IC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8K
KworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gY29uY2F0OworCisgIGZ1
bmN0aW9uIGNvbmNhdChlbnYsIHBhcnRzKSB7CisgICAgcmV0dXJuIF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLmNvbmNhdChwYXJ0cywgJycpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJh
cnMvaG9va3MvY3JlYXRlLWZyZXNoLXNjb3BlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3N0
cmVhbXMvcHJveHktc3RyZWFtJywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0sIF9lbWJlck1ldGFsRW1w
dHlfb2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjcmVh
dGVGcmVzaFNjb3BlOworICBleHBvcnRzLmNyZWF0ZUNoaWxkU2NvcGUgPSBjcmVhdGVDaGlsZFNj
b3BlOworCisgIC8qCisgICAgRW1iZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBIVE1MQmFycyBjcmVh
dGVzIGFuIGVucmljaGVkIHNjb3BlLgorICAKKyAgICAqIHNlbGY6IHNhbWUgYXMgSFRNTEJhcnMs
IHRoaXMgZmllbGQgcmVwcmVzZW50cyB0aGUgZHluYW1pYyBsb29rdXAKKyAgICAgIG9mIHJvb3Qg
a2V5cyB0aGF0IGFyZSBub3Qgc3BlY2lhbCBrZXl3b3JkcyBvciBibG9jayBhcmd1bWVudHMuCisg
ICAgKiBibG9ja3M6IHNhbWUgYXMgSFRNTEJhcnMsIGEgYnVuZGxlIG9mIG5hbWVkIGJsb2NrcyB0
aGUgbGF5b3V0CisgICAgICBjYW4geWllbGQgdG8uCisgICAgKiBjb21wb25lbnQ6IGluZGljYXRl
cyB0aGF0IHRoZSBzY29wZSBpcyB0aGUgbGF5b3V0IG9mIGEgY29tcG9uZW50LAorICAgICAgd2hp
Y2ggaXMgdXNlZCB0byB0cmlnZ2VyIGxpZmVjeWNsZSBob29rcyBmb3IgdGhlIGNvbXBvbmVudCB3
aGVuCisgICAgICBvbmUgb2YgdGhlIHN0cmVhbXMgaW4gaXRzIGxheW91dCBmaXJlcy4KKyAgICAq
IGF0dHJzOiBhIG1hcCBvZiBrZXktdmFsdWUgYXR0cmlidXRlcyBzZW50IGluIGJ5IHRoZSBpbnZv
a2VyIG9mCisgICAgICBhIHRlbXBsYXRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBjb21wb25lbnQn
cyBsYXlvdXQuCisgICAgKiBsb2NhbHM6IGEgbWFwIG9mIGxvY2FscywgcHJvZHVjZWQgYnkgYmxv
Y2sgcGFyYW1zIChgYXMgfGEgYnxgKQorICAgICogbG9jYWxQcmVzZW50OiBhIG1hcCBvZiBhdmFp
bGFibGUgbG9jYWxzIHRvIGF2b2lkIGV4cGVuc2l2ZQorICAgICAgYGhhc093blByb3BlcnR5YCBj
aGVja3MuCisgIAorICAgIFRoZSBgc2VsZmAgZmllbGQgaGFzIHR3byBzcGVjaWFsIG1lYW5pbmdz
OgorICAKKyAgICAqIElmIGBzZWxmYCBpcyBhIHZpZXcgKGBpc1ZpZXdgKSwgdGhlIGFjdHVhbCBI
VE1MQmFycyBgc2VsZmAgYmVjb21lcworICAgICAgdGhlIHZpZXcncyBgY29udGV4dGAuIFRoaXMg
aXMgbGVnYWN5IHNlbWFudGljczsgY29tcG9uZW50cyBhbHdheXMKKyAgICAgIHVzZSB0aGUgY29t
cG9uZW50IGl0c2VsZiBhcyB0aGUgYHRoaXNgLgorICAgICogSWYgYHNlbGZgIGlzIGEgdmlldywg
dHdvIHNwZWNpYWwgbG9jYWxzIGFyZSBjcmVhdGVkOiBgdmlld2AgYW5kCisgICAgICBgY29udHJv
bGxlcmAuIFRoZXNlIGxvY2FscyBhcmUgbGVnYWN5IHNlbWFudGljcy4KKyAgCisgICAgKipJTVBP
UlRBTlQqKjogVGhlcmUgYXJlIHR3byBwbGFjZXMgaW4gRW1iZXIgd2hlcmUgdGhlIGFtYmllbnQK
KyAgICBjb250cm9sbGVyIGlzIGxvb2tlZCB1cC4gQm90aCBvZiB0aG9zZSBwbGFjZXMgdXNlIHRo
ZSBwcmVzZW5jZQorICAgIG9mIGBzY29wZS5sb2NhbHMudmlld2AgdG8gaW5kaWNhdGUgdGhhdCB0
aGUgY29udHJvbGxlciBsb29rdXAKKyAgICBzaG91bGQgYmUgZHluYW1pYyBvZmYgb2YgdGhlIGFt
YmllbnQgdmlldy4gSWYgYHNjb3BlLmxvY2Fscy52aWV3YAorICAgIGRvZXMgbm90IGV4aXN0LCB0
aGUgY29kZSBhc3N1bWVzIHRoYXQgaXQgaXMgaW5zaWRlIG9mIGEgdG9wLWxldmVsCisgICAgdGVt
cGxhdGUgKHdpdGhvdXQgYSB2aWV3KSBhbmQgdXNlcyB0aGUgYHNlbGZgIGl0c2VsZiBhcyB0aGUK
KyAgICBjb250cm9sbGVyLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHJlbW92ZSBgc2NvcGUubG9j
YWxzLnZpZXdgCisgICAgKHBlcmhhcHMgYmVjYXVzZSB3ZSBhcmUgZmluYWxseSByZWFkeSB0byBz
aGVkIHRoZSB2aWV3IGtleXdvcmQpLAorICAgIHRoZXJlIG1heSBiZSB1bmV4cGVjdGVkIGNvbnNl
cXVlbmNlcyBvbiBjb250cm9sbGVyIHNlbWFudGljcy4KKyAgICBJZiB0aGlzIGhhcHBlbnMgdG8g
eW91LCBJIGhvcGUgeW91IGZpbmQgdGhpcyBjb21tZW50LiAtIFlLICYgVEQKKyAgCisgICAgSW4g
cHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCB3aXRoIHRoZSBleGNlcHRpb25zIG9mIHRvcC1sZXZl
bAorICAgIHZpZXctbGVzcyB0ZW1wbGF0ZXMgYW5kIHRoZSBsZWdhY3kgYGNvbnRyb2xsZXI9Zm9v
YCBzZW1hbnRpY3MsCisgICAgdGhlIGNvbnRyb2xsZXIgaGllcmFyY2h5IGlzIG1hbmFnZWQgZHlu
YW1pY2FsbHkgYnkgbG9va2luZyBhdAorICAgIHRoZSBjdXJyZW50IHZpZXcncyBgY29udHJvbGxl
cmAuCisgICovCisKKyAgZnVuY3Rpb24gU2NvcGUocGFyZW50KSB7CisgICAgdGhpcy5fc2VsZiA9
IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9ibG9ja3MgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fY29t
cG9uZW50ID0gdW5kZWZpbmVkOworICAgIHRoaXMuX3ZpZXcgPSB1bmRlZmluZWQ7CisgICAgdGhp
cy5fYXR0cnMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fbG9jYWxzID0gdW5kZWZpbmVkOworICAg
IHRoaXMuX2xvY2FsUHJlc2VudCA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLm92ZXJyaWRlQ29udHJv
bGxlciA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgfQorCisgIHZh
ciBwcm90byA9IFNjb3BlLnByb3RvdHlwZTsKKworICBwcm90by5nZXRTZWxmID0gZnVuY3Rpb24g
KCkgeworICAgIHJldHVybiB0aGlzLl9zZWxmIHx8IHRoaXMucGFyZW50LmdldFNlbGYoKTsKKyAg
fTsKKworICBwcm90by5iaW5kU2VsZiA9IGZ1bmN0aW9uIChzZWxmKSB7CisgICAgdGhpcy5fc2Vs
ZiA9IHNlbGY7CisgIH07CisKKyAgcHJvdG8udXBkYXRlU2VsZiA9IGZ1bmN0aW9uIChzZWxmLCBr
ZXkpIHsKKyAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLl9zZWxmOworCisgICAgaWYgKGV4aXN0aW5n
KSB7CisgICAgICBleGlzdGluZy5zZXRTb3VyY2Uoc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAg
IHRoaXMuX3NlbGYgPSBuZXcgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0uZGVmYXVsdChz
ZWxmLCBrZXkpOworICAgIH0KKyAgfTsKKworICBwcm90by5nZXRCbG9jayA9IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgaWYgKCF0aGlzLl9ibG9ja3MpIHsKKyAgICAgIHJldHVybiB0aGlzLnBhcmVu
dC5nZXRCbG9jayhuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuX2Jsb2Nrc1tuYW1lXSB8
fCB0aGlzLnBhcmVudC5nZXRCbG9jayhuYW1lKTsKKyAgfTsKKworICBwcm90by5oYXNCbG9jayA9
IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9ibG9ja3MpIHsKKyAgICAgIHJldHVy
biB0aGlzLnBhcmVudC5oYXNCbG9jayhuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuICEhKHRoaXMu
X2Jsb2Nrc1tuYW1lXSB8fCB0aGlzLnBhcmVudC5oYXNCbG9jayhuYW1lKSk7CisgIH07CisKKyAg
cHJvdG8uYmluZEJsb2NrID0gZnVuY3Rpb24gKG5hbWUsIGJsb2NrKSB7CisgICAgaWYgKCF0aGlz
Ll9ibG9ja3MpIHsKKyAgICAgIHRoaXMuX2Jsb2NrcyA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCk7CisgICAgfQorICAgIHRoaXMuX2Jsb2Nrc1tuYW1lXSA9IGJsb2NrOwor
ICB9OworCisgIHByb3RvLmdldENvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g
dGhpcy5fY29tcG9uZW50IHx8IHRoaXMucGFyZW50LmdldENvbXBvbmVudCgpOworICB9OworCisg
IHByb3RvLmJpbmRDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CisgICAgdGhpcy5f
Y29tcG9uZW50ID0gY29tcG9uZW50OworICB9OworCisgIHByb3RvLmdldFZpZXcgPSBmdW5jdGlv
biAoKSB7CisgICAgcmV0dXJuIHRoaXMuX3ZpZXcgfHwgdGhpcy5wYXJlbnQuZ2V0VmlldygpOwor
ICB9OworCisgIHByb3RvLmJpbmRWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICB0aGlzLl92
aWV3ID0gdmlldzsKKyAgfTsKKworICBwcm90by5nZXRBdHRycyA9IGZ1bmN0aW9uICgpIHsKKyAg
ICByZXR1cm4gdGhpcy5fYXR0cnMgfHwgdGhpcy5wYXJlbnQuZ2V0QXR0cnMoKTsKKyAgfTsKKwor
ICBwcm90by5iaW5kQXR0cnMgPSBmdW5jdGlvbiAoYXR0cnMpIHsKKyAgICB0aGlzLl9hdHRycyA9
IGF0dHJzOworICB9OworCisgIHByb3RvLmhhc0xvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAg
ICBpZiAoIXRoaXMuX2xvY2FsUHJlc2VudCkgeworICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lmhh
c0xvY2FsKG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5fbG9jYWxQcmVzZW50W25hbWVd
IHx8IHRoaXMucGFyZW50Lmhhc0xvY2FsKG5hbWUpOworICB9OworCisgIHByb3RvLmhhc093bkxv
Y2FsID0gZnVuY3Rpb24gKG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy5fbG9jYWxQcmVzZW50ICYm
IHRoaXMuX2xvY2FsUHJlc2VudFtuYW1lXTsKKyAgfTsKKworICBwcm90by5nZXRMb2NhbCA9IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgaWYgKCF0aGlzLl9sb2NhbFByZXNlbnQpIHsKKyAgICAgIHJl
dHVybiB0aGlzLnBhcmVudC5nZXRMb2NhbChuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMu
X2xvY2FsUHJlc2VudFtuYW1lXSA/IHRoaXMuX2xvY2Fsc1tuYW1lXSA6IHRoaXMucGFyZW50Lmdl
dExvY2FsKG5hbWUpOworICB9OworCisgIHByb3RvLmJpbmRMb2NhbCA9IGZ1bmN0aW9uIChuYW1l
LCB2YWx1ZSkgeworICAgIGlmICghdGhpcy5fbG9jYWxQcmVzZW50KSB7CisgICAgICB0aGlzLl9s
b2NhbFByZXNlbnQgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAg
ICAgdGhpcy5fbG9jYWxzID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsK
KyAgICB9CisKKyAgICB0aGlzLl9sb2NhbFByZXNlbnRbbmFtZV0gPSB0cnVlOworICAgIHRoaXMu
X2xvY2Fsc1tuYW1lXSA9IHZhbHVlOworICB9OworCisgIHZhciBFTVBUWSA9IHsKKyAgICBfc2Vs
ZjogdW5kZWZpbmVkLAorICAgIF9ibG9ja3M6IHVuZGVmaW5lZCwKKyAgICBfY29tcG9uZW50OiB1
bmRlZmluZWQsCisgICAgX3ZpZXc6IHVuZGVmaW5lZCwKKyAgICBfYXR0cnM6IHVuZGVmaW5lZCwK
KyAgICBfbG9jYWxzOiB1bmRlZmluZWQsCisgICAgX2xvY2FsUHJlc2VudDogdW5kZWZpbmVkLAor
ICAgIG92ZXJyaWRlQ29udHJvbGxlcjogdW5kZWZpbmVkLAorCisgICAgZ2V0U2VsZjogZnVuY3Rp
b24gKCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBiaW5kU2VsZjogZnVuY3Rp
b24gKHNlbGYpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisgICAgdXBkYXRlU2VsZjog
ZnVuY3Rpb24gKHNlbGYsIGtleSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBn
ZXRCbG9jazogZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisg
ICAgYmluZEJsb2NrOiBmdW5jdGlvbiAobmFtZSwgYmxvY2spIHsKKyAgICAgIHJldHVybiBudWxs
OworICAgIH0sCisgICAgaGFzQmxvY2s6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSwKKyAgICBnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJl
dHVybiBudWxsOworICAgIH0sCisgICAgYmluZENvbXBvbmVudDogZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBnZXRWaWV3OiBmdW5jdGlvbiAoKSB7CisgICAg
ICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGJpbmRWaWV3OiBmdW5jdGlvbiAodmlldykgewor
ICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBnZXRBdHRyczogZnVuY3Rpb24gKCkgewor
ICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBiaW5kQXR0cnM6IGZ1bmN0aW9uIChhdHRy
cykgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBoYXNMb2NhbDogZnVuY3Rpb24g
KG5hbWUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorICAgIGhhc093bkxvY2FsOiBm
dW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisgICAgZ2V0TG9j
YWw6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorICAgIGJp
bmRMb2NhbDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgIH07CisKKyAgZnVuY3Rpb24gY3JlYXRlRnJlc2hTY29wZSgpIHsKKyAgICByZXR1cm4g
bmV3IFNjb3BlKEVNUFRZKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkU2NvcGUocGFy
ZW50KSB7CisgICAgcmV0dXJuIG5ldyBTY29wZShwYXJlbnQpOworICB9Cit9KTsKK2VuaWZlZCgi
ZW1iZXItaHRtbGJhcnMvaG9va3MvZGVzdHJveS1yZW5kZXItbm9kZSIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IGRlc3Ryb3lSZW5kZXJOb2RlOworCisgIGZ1bmN0aW9uIGRlc3Ryb3lSZW5kZXJOb2Rl
KHJlbmRlck5vZGUpIHsKKyAgICBpZiAocmVuZGVyTm9kZS5lbWJlclZpZXcpIHsKKyAgICAgIHJl
bmRlck5vZGUuZW1iZXJWaWV3LmRlc3Ryb3koKTsKKyAgICB9CisKKyAgICB2YXIgc3RyZWFtVW5z
dWJzY3JpYmVycyA9IHJlbmRlck5vZGUuc3RyZWFtVW5zdWJzY3JpYmVyczsKKyAgICBpZiAoc3Ry
ZWFtVW5zdWJzY3JpYmVycykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdHJlYW1VbnN1
YnNjcmliZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBzdHJlYW1VbnN1YnNjcmli
ZXJzW2ldKCk7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJh
cnMvaG9va3MvZGlkLWNsZWFudXAtdHJlZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0
cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGlkQ2xlYW51cFRy
ZWU7CisKKyAgZnVuY3Rpb24gZGlkQ2xlYW51cFRyZWUoZW52KSB7CisgICAgLy8gT25jZSB3ZSBo
YXZlIGZpbnNpaGVkIGNsZWFuaW5nIHVwIHRoZSByZW5kZXIgbm9kZSBhbmQgc3ViLW5vZGVzLCBy
ZXNldAorICAgIC8vIHN0YXRlIHRyYWNraW5nIHdoaWNoIHZpZXcgdGhvc2UgcmVuZGVyIG5vZGVz
IGJlbG9uZ2VkIHRvLgorICAgIGVudi52aWV3Lm93bmVyVmlldy5fZGVzdHJveWluZ1N1YnRyZWVG
b3JWaWV3ID0gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL2hvb2tzL2Rp
ZC1yZW5kZXItbm9kZSIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAidXNl
IHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGlkUmVuZGVyTm9kZTsKKworICBmdW5j
dGlvbiBkaWRSZW5kZXJOb2RlKG1vcnBoLCBlbnYpIHsKKyAgICBlbnYucmVuZGVyZWROb2Rlcy5h
ZGQobW9ycGgpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvZWxlbWVu
dCcsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdo
dG1sYmFycy1ydW50aW1lL2hvb2tzJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnZva2UtaGVs
cGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBl
ciwgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBl
cikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJz
CisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGVtYmVyRWxl
bWVudDsKKworICBmdW5jdGlvbiBlbWJlckVsZW1lbnQobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgs
IHBhcmFtcywgaGFzaCwgdmlzaXRvcikgeworICAgIGlmIChfaHRtbGJhcnNSdW50aW1lSG9va3Mu
aGFuZGxlUmVkaXJlY3QobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgbnVs
bCwgbnVsbCwgdmlzaXRvcikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgcmVz
dWx0OworICAgIHZhciBoZWxwZXIgPSBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBlci5m
aW5kSGVscGVyKHBhdGgsIHNjb3BlLmdldFNlbGYoKSwgZW52KTsKKyAgICBpZiAoaGVscGVyKSB7
CisgICAgICB2YXIgaGVscGVyU3RyZWFtID0gX2VtYmVySHRtbGJhcnNTeXN0ZW1JbnZva2VIZWxw
ZXIuYnVpbGRIZWxwZXJTdHJlYW0oaGVscGVyLCBwYXJhbXMsIGhhc2gsIHsgZWxlbWVudDogbW9y
cGguZWxlbWVudCB9LCBlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHJlc3VsdCA9IGhlbHBlclN0
cmVhbS52YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBlbnYuaG9va3MuZ2V0
KGVudiwgc2NvcGUsIHBhdGgpOworICAgIH0KKworICAgIGVudi5ob29rcy5nZXRWYWx1ZShyZXN1
bHQpOworICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LWJsb2NrIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBnZXRCbG9jazsKKworICBmdW5jdGlvbiBnZXRCbG9jayhzY29wZSwg
a2V5KSB7CisgICAgcmV0dXJuIHNjb3BlLmdldEJsb2NrKGtleSk7CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtY2VsbC1vci12YWx1ZScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL211dCdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlckh0bWxi
YXJzS2V5d29yZHNNdXQpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IGdldENlbGxPclZhbHVlOworCisgIGZ1bmN0aW9uIGdldENlbGxPclZhbHVlKHJlZikgeworICAg
IGlmIChyZWYgJiYgcmVmW19lbWJlckh0bWxiYXJzS2V5d29yZHNNdXQuTVVUQUJMRV9SRUZFUkVO
Q0VdKSB7CisgICAgICAvLyBSZWlmeSB0aGUgbXV0YWJsZSByZWZlcmVuY2UgaW50byBhIG11dGFi
bGUgY2VsbC4KKyAgICAgIHJldHVybiByZWYuY2VsbCgpOworICAgIH0KKworICAgIC8vIEdldCB0
aGUgdmFsdWUgb3V0IG9mIHRoZSByZWZlcmVuY2UuCisgICAgcmV0dXJuIF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQocmVmKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hv
b2tzL2dldC1jaGlsZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGdldENoaWxkOworCisgIGZ1bmN0aW9u
IGdldENoaWxkKHBhcmVudCwga2V5KSB7CisgICAgaWYgKF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LmlzU3RyZWFtKHBhcmVudCkpIHsKKyAgICAgIHJldHVybiBwYXJlbnQuZ2V0S2V5KGtleSk7Cisg
ICAgfQorCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBhcmUgbG9va2lu
ZyBhdCBhbiBgYXR0cnNgIGhhc2guCisgICAgLy8gVGhhdCBtaWdodCBjaGFuZ2UgaWYgaXQgaXMg
cG9zc2libGUgdG8gcGFzcyBvYmplY3QgbGl0ZXJhbHMKKyAgICAvLyB0aHJvdWdoIHRoZSB0ZW1w
bGF0aW5nIHN5c3RlbS4KKyAgICByZXR1cm4gcGFyZW50W2tleV07CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtcm9vdCcsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAo
ZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0
bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGdl
dFJvb3Q7CisKKyAgZnVuY3Rpb24gZ2V0Um9vdChzY29wZSwga2V5KSB7CisgICAgaWYgKGtleSA9
PT0gJ3RoaXMnKSB7CisgICAgICByZXR1cm4gW3Njb3BlLmdldFNlbGYoKV07CisgICAgfSBlbHNl
IGlmIChrZXkgPT09ICdoYXNCbG9jaycpIHsKKyAgICAgIHJldHVybiBbISFzY29wZS5oYXNCbG9j
aygnZGVmYXVsdCcpXTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2hhc0Jsb2NrUGFyYW1zJykg
eworICAgICAgdmFyIGJsb2NrID0gc2NvcGUuZ2V0QmxvY2soJ2RlZmF1bHQnKTsKKyAgICAgIHJl
dHVybiBbISFibG9jayAmJiBibG9jay5hcml0eV07CisgICAgfSBlbHNlIGlmIChzY29wZS5oYXNM
b2NhbChrZXkpKSB7CisgICAgICByZXR1cm4gW3Njb3BlLmdldExvY2FsKGtleSldOworICAgIH0g
ZWxzZSB7CisgICAgICByZXR1cm4gW2dldEtleShzY29wZSwga2V5KV07CisgICAgfQorICB9CisK
KyAgZnVuY3Rpb24gZ2V0S2V5KHNjb3BlLCBrZXkpIHsKKyAgICBpZiAoa2V5ID09PSAnYXR0cnMn
KSB7CisgICAgICB2YXIgX2F0dHJzID0gc2NvcGUuZ2V0QXR0cnMoKTsKKyAgICAgIGlmIChfYXR0
cnMpIHsKKyAgICAgICAgcmV0dXJuIF9hdHRyczsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIg
c2VsZiA9IHNjb3BlLmdldFNlbGYoKSB8fCBzY29wZS5nZXRMb2NhbCgndmlldycpOworCisgICAg
aWYgKHNlbGYpIHsKKyAgICAgIHJldHVybiBzZWxmLmdldEtleShrZXkpOworICAgIH0KKworICAg
IHZhciBhdHRycyA9IHNjb3BlLmdldEF0dHJzKCk7CisgICAgaWYgKGF0dHJzICYmIGtleSBpbiBh
dHRycykgeworICAgICAgLy8gVE9ETzogYXR0cnMKKyAgICAgIC8vIGRlcHJlY2F0ZSgiWW91IGFj
Y2Vzc2VkIHRoZSBgIiArIGtleSArICJgIGF0dHJpYnV0ZSBkaXJlY3RseS4gUGxlYXNlIHVzZSBg
YXR0cnMuIiArIGtleSArICJgIGluc3RlYWQuIik7CisgICAgICByZXR1cm4gYXR0cnNba2V5XTsK
KyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9nZXQtdmFsdWUn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci12aWV3cy9j
b21wYXQvYXR0cnMtcHJveHknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBnZXRWYWx1ZTsKKworICBmdW5jdGlvbiBnZXRWYWx1
ZShyZWYpIHsKKyAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHJl
Zik7CisKKyAgICBpZiAodmFsdWUgJiYgdmFsdWVbX2VtYmVyVmlld3NDb21wYXRBdHRyc1Byb3h5
Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdmFsdWU7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy9o
YXMtaGVscGVyJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVs
cGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBl
cikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaGFzSGVscGVySG9v
azsKKworICBmdW5jdGlvbiBoYXNIZWxwZXJIb29rKGVudiwgc2NvcGUsIGhlbHBlck5hbWUpIHsK
KyAgICBpZiAoZW52LmhlbHBlcnNbaGVscGVyTmFtZV0pIHsKKyAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKyAgICBpZiAoX2VtYmVySHRtbGJh
cnNTeXN0ZW1Mb29rdXBIZWxwZXIudmFsaWRhdGVMYXp5SGVscGVyTmFtZShoZWxwZXJOYW1lLCBv
d25lciwgZW52Lmhvb2tzLmtleXdvcmRzKSkgeworICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUg
PSAnaGVscGVyOicgKyBoZWxwZXJOYW1lOworICAgICAgaWYgKG93bmVyLmhhc1JlZ2lzdHJhdGlv
bihyZWdpc3RyYXRpb25OYW1lKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKwor
ICAgICAgdmFyIG9wdGlvbnMgPSB7fTsKKyAgICAgIHZhciBtb2R1bGVOYW1lID0gZW52Lm1ldGEg
JiYgZW52Lm1ldGEubW9kdWxlTmFtZTsKKyAgICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAgICAg
IG9wdGlvbnMuc291cmNlID0gJ3RlbXBsYXRlOicgKyBtb2R1bGVOYW1lOworICAgICAgfQorCisg
ICAgICBpZiAob3duZXIuaGFzUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbk5hbWUsIG9wdGlvbnMp
KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2ludm9rZS1oZWxw
ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2ludm9rZS1oZWxwZXInLCAn
ZW1iZXItaHRtbGJhcnMvdXRpbHMvc3Vic2NyaWJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlciwgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmli
ZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaW52b2tlSGVscGVy
OworCisgIGZ1bmN0aW9uIGludm9rZUhlbHBlcihtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvciwg
cGFyYW1zLCBoYXNoLCBoZWxwZXIsIHRlbXBsYXRlcywgY29udGV4dCkgeworICAgIHZhciBoZWxw
ZXJTdHJlYW0gPSBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlci5idWlsZEhlbHBlclN0
cmVhbShoZWxwZXIsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGVzLCBlbnYsIHNjb3BlKTsKKworICAg
IC8vIEVtYmVyLkhlbHBlciBoZWxwZXJzIGFyZSBwdXJlIHZhbHVlcywgdGh1cyBsaW5rYWJsZS4K
KyAgICBpZiAoaGVscGVyU3RyZWFtLmxpbmthYmxlKSB7CisgICAgICBpZiAobW9ycGgpIHsKKyAg
ICAgICAgLy8gV2hlbiBwcm9jZXNzaW5nIGFuIGlubGluZSBleHByZXNzaW9uLCB0aGUgcGFyYW1z
IGFuZCBoYXNoIGhhdmUgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGxpbmtlZC4gVGh1cywgSFRN
TEJhcnMgd2lsbCBub3QgbGluayB0aGUgcmV0dXJuZWQgaGVscGVyU3RyZWFtLgorICAgICAgICAv
LyBXZSBzdWJzY3JpYmUgdGhlIG1vcnBoIHRvIHRoZSBoZWxwZXJTdHJlYW0gaGVyZSwgYW5kIGFs
c28gc3Vic2NyaWJlCisgICAgICAgIC8vIHRoZSBoZWxwZXJTdHJlYW0gdG8gYW55IHBhcmFtcy4K
KyAgICAgICAgdmFyIGFkZGVkRGVwZW5kZW5jeSA9IGZhbHNlOworICAgICAgICBmb3IgKHZhciBp
ID0gMCwgbCA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICBhZGRlZERl
cGVuZGVuY3kgPSB0cnVlOworICAgICAgICAgIGhlbHBlclN0cmVhbS5hZGREZXBlbmRlbmN5KHBh
cmFtc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHsKKyAg
ICAgICAgICBhZGRlZERlcGVuZGVuY3kgPSB0cnVlOworICAgICAgICAgIGhlbHBlclN0cmVhbS5h
ZGREZXBlbmRlbmN5KGhhc2hba2V5XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZGVkRGVw
ZW5kZW5jeSkgeworICAgICAgICAgIF9lbWJlckh0bWxiYXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVs
dChtb3JwaCwgZW52LCBzY29wZSwgaGVscGVyU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgfQor
CisgICAgICByZXR1cm4geyBsaW5rOiB0cnVlLCB2YWx1ZTogaGVscGVyU3RyZWFtIH07CisgICAg
fQorCisgICAgLy8gQnVpbHQtaW4gaGVscGVycyBhcmUgbm90IGxpbmthYmxlLiBUaGV5IG11c3Qg
cnVuIG9uIGV2ZXJ5IHJlcmVuZGVyLgorICAgIHJldHVybiB7IHZhbHVlOiBoZWxwZXJTdHJlYW0u
dmFsdWUoKSB9OworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvbGluay1y
ZW5kZXItbm9kZScsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUn
LCAnZW1iZXItcnVudGltZS91dGlscycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2Vt
YmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdv
cmRzL2Nsb3N1cmUtY29tcG9uZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFy
c1V0aWxzU3Vic2NyaWJlLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0
aWxzLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1cEhlbHBlciwgX2VtYmVySHRtbGJhcnNLZXl3
b3Jkc0Nsb3N1cmVDb21wb25lbnQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1v
ZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBsaW5rUmVuZGVyTm9kZTsKKyAgZXhwb3J0cy5saW5rUGFyYW1zRm9yID0gbGlu
a1BhcmFtc0ZvcjsKKworICBmdW5jdGlvbiBsaW5rUmVuZGVyTm9kZShyZW5kZXJOb2RlLCBlbnYs
IHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gpIHsKKyAgICBpZiAocmVuZGVyTm9kZS5zdHJlYW1V
bnN1YnNjcmliZXJzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIga2V5
d29yZCA9IGVudi5ob29rcy5rZXl3b3Jkc1twYXRoXTsKKyAgICBpZiAoa2V5d29yZCAmJiBrZXl3
b3JkLmxpbmspIHsKKyAgICAgIGtleXdvcmQubGluayhyZW5kZXJOb2RlLmdldFN0YXRlKCksIHBh
cmFtcywgaGFzaCk7CisgICAgfSBlbHNlIGlmIChwYXRoID09PSAndW5ib3VuZCcpIHsKKyAgICAg
IHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBsaW5rUGFyYW1zRm9yKHBhdGgsIHBh
cmFtcyk7CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgaXMgYSBkb3QgaW4gdGhlIHBhdGgsIHdl
IG5lZWQgdG8gc3Vic2NyaWJlIHRvIHRoZSBhcmd1bWVudHMgaW4gdGhlCisgICAgLy8gY2xvc3Vy
ZSBjb21wb25lbnQgYXMgd2VsbC4KKworICAgIGlmIChfZW1iZXJIdG1sYmFyc1N5c3RlbUxvb2t1
cEhlbHBlci5DT05UQUlOU19ET1RfQ0FDSEUuZ2V0KHBhdGgpKSB7CisgICAgICB2YXIgc3RyZWFt
ID0gZW52Lmhvb2tzLmdldChlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHZhciBjb21wb25lbnRD
ZWxsID0gc3RyZWFtLnZhbHVlKCk7CisKKyAgICAgIGlmIChfZW1iZXJIdG1sYmFyc0tleXdvcmRz
Q2xvc3VyZUNvbXBvbmVudC5pc0NvbXBvbmVudENlbGwoY29tcG9uZW50Q2VsbCkpIHsKKyAgICAg
ICAgdmFyIGNsb3N1cmVBdHRycyA9IF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9u
ZW50Lm1lcmdlSW5OZXdIYXNoKGNvbXBvbmVudENlbGxbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Ns
b3N1cmVDb21wb25lbnQuQ09NUE9ORU5UX0hBU0hdLCBoYXNoKTsKKworICAgICAgICBmb3IgKHZh
ciBrZXkgaW4gY2xvc3VyZUF0dHJzKSB7CisgICAgICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1
YnNjcmliZS5kZWZhdWx0KHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIGNsb3N1cmVBdHRyc1trZXld
KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJhbXMgJiYgcGFyYW1z
Lmxlbmd0aCkgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZS5kZWZhdWx0KHJlbmRlck5v
ZGUsIGVudiwgc2NvcGUsIHBhcmFtc1tpXSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhh
c2gpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiBoYXNoKSB7CisgICAgICAgIF9lbWJlckh0bWxi
YXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVsdChyZW5kZXJOb2RlLCBlbnYsIHNjb3BlLCBoYXNoW2tl
eV0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSBwYXJhbXMgYW5kIGhhc2ggY2FuIGJl
IHJldXNlZC4gVGhleSBkb24ndCBuZWVkIHRvIGJlCisgICAgLy8gcmVjb21wdXRlZCBvbiBzdWJz
ZXF1ZW50IHJlLXJlbmRlcnMgYmVjYXVzZSB0aGV5IGFyZQorICAgIC8vIHN0cmVhbXMuCisgICAg
cmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBsaW5rUGFyYW1zRm9yKHBhdGgsIHBhcmFt
cykgeworICAgIHN3aXRjaCAocGF0aCkgeworICAgICAgY2FzZSAndW5sZXNzJzoKKyAgICAgIGNh
c2UgJ2lmJzoKKyAgICAgICAgcGFyYW1zWzBdID0gc2hvdWxkRGlzcGxheShwYXJhbXNbMF0sIHRv
Qm9vbCk7YnJlYWs7CisgICAgICBjYXNlICdlYWNoJzoKKyAgICAgICAgcGFyYW1zWzBdID0gZWFj
aFBhcmFtKHBhcmFtc1swXSk7YnJlYWs7CisgICAgICBjYXNlICd3aXRoJzoKKyAgICAgICAgcGFy
YW1zWzBdID0gc2hvdWxkRGlzcGxheShwYXJhbXNbMF0sIGlkZW50aXR5KTticmVhazsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBlYWNoUGFyYW0obGlzdCkgeworICAgIHZhciBsaXN0Q2hhbmdl
ID0gZ2V0S2V5KGxpc3QsICdbXScpOworCisgICAgdmFyIHN0cmVhbSA9IF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLmNoYWluKGxpc3QsIGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQobGlzdENoYW5nZSk7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMucmVhZChsaXN0KTsKKyAgICB9LCAnZWFjaCcpOworCisgICAgc3RyZWFtLmFkZERl
cGVuZGVuY3kobGlzdENoYW5nZSk7CisgICAgcmV0dXJuIHN0cmVhbTsKKyAgfQorCisgIGZ1bmN0
aW9uIHNob3VsZERpc3BsYXkocHJlZGljYXRlLCBjb2VyY2VyKSB7CisgICAgdmFyIGxlbmd0aCA9
IGdldEtleShwcmVkaWNhdGUsICdsZW5ndGgnKTsKKyAgICB2YXIgaXNUcnV0aHkgPSBnZXRLZXko
cHJlZGljYXRlLCAnaXNUcnV0aHknKTsKKworICAgIHZhciBzdHJlYW0gPSBfZW1iZXJNZXRhbFN0
cmVhbXNVdGlscy5jaGFpbihwcmVkaWNhdGUsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBwcmVk
aWNhdGVWYWwgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHByZWRpY2F0ZSk7CisgICAg
ICB2YXIgbGVuZ3RoVmFsID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChsZW5ndGgpOwor
ICAgICAgdmFyIGlzVHJ1dGh5VmFsID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChpc1Ry
dXRoeSk7CisKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShwcmVkaWNhdGVW
YWwpKSB7CisgICAgICAgIHJldHVybiBsZW5ndGhWYWwgPiAwID8gY29lcmNlcihwcmVkaWNhdGVW
YWwpIDogZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgaXNUcnV0aHlWYWwgPT09
ICdib29sZWFuJykgeworICAgICAgICByZXR1cm4gaXNUcnV0aHlWYWwgPyBjb2VyY2VyKHByZWRp
Y2F0ZVZhbCkgOiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGNvZXJjZXIocHJlZGlj
YXRlVmFsKTsKKyAgICB9LCAnU2hvdWxkRGlzcGxheScpOworCisgICAgX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMuYWRkRGVwZW5kZW5jeShzdHJlYW0sIGxlbmd0aCk7CisgICAgX2VtYmVyTWV0YWxT
dHJlYW1zVXRpbHMuYWRkRGVwZW5kZW5jeShzdHJlYW0sIGlzVHJ1dGh5KTsKKworICAgIHJldHVy
biBzdHJlYW07CisgIH0KKworICBmdW5jdGlvbiB0b0Jvb2wodmFsdWUpIHsKKyAgICByZXR1cm4g
ISF2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7CisgICAgcmV0dXJu
IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gZ2V0S2V5KG9iaiwga2V5KSB7CisgICAgaWYgKF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9iaikpIHsKKyAgICAgIHJldHVybiBvYmou
Z2V0S2V5KGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvYmogJiYgb2JqW2tleV07
CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaG9va3MvbG9va3VwLWhl
bHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcidd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGxvb2t1cEhlbHBlckhvb2s7
CisKKyAgZnVuY3Rpb24gbG9va3VwSGVscGVySG9vayhlbnYsIHNjb3BlLCBoZWxwZXJOYW1lKSB7
CisgICAgcmV0dXJuIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLmRlZmF1bHQoaGVs
cGVyTmFtZSwgc2NvcGUuZ2V0U2VsZigpLCBlbnYpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
aHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsIFsnZXhwb3J0cycsICdlbWJlci1odG1sYmFycy9zeXN0
ZW0vbG9va3VwLWhlbHBlcicsICdlbWJlci1odG1sYmFycy9zeXN0ZW0vaW52b2tlLWhlbHBlcics
ICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2xpbmst
cmVuZGVyLW5vZGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbUludm9rZUhlbHBlciwgX2VtYmVyTWV0YWxT
dHJlYW1zVXRpbHMsIF9lbWJlckh0bWxiYXJzSG9va3NMaW5rUmVuZGVyTm9kZSkgeworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHN1YmV4cHI7CisgIGV4cG9ydHMu
bGFiZWxGb3JTdWJleHByID0gbGFiZWxGb3JTdWJleHByOworCisgIGZ1bmN0aW9uIHN1YmV4cHIo
ZW52LCBzY29wZSwgaGVscGVyTmFtZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgLy8gVE9ETzogS2V5
d29yZHMgYW5kIGhlbHBlciBpbnZvY2F0aW9uIHNob3VsZCBiZSBpbnRlZ3JhdGVkIGludG8KKyAg
ICAvLyB0aGUgc3ViZXhwciBob29rIHVwc3RyZWFtIGluIEhUTUxCYXJzLgorICAgIHZhciBrZXl3
b3JkID0gZW52Lmhvb2tzLmtleXdvcmRzW2hlbHBlck5hbWVdOworICAgIGlmIChrZXl3b3JkKSB7
CisgICAgICByZXR1cm4ga2V5d29yZChudWxsLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIG51
bGwsIG51bGwpOworICAgIH0KKworICAgIF9lbWJlckh0bWxiYXJzSG9va3NMaW5rUmVuZGVyTm9k
ZS5saW5rUGFyYW1zRm9yKGhlbHBlck5hbWUsIHBhcmFtcyk7CisKKyAgICB2YXIgbGFiZWwgPSBs
YWJlbEZvclN1YmV4cHIocGFyYW1zLCBoYXNoLCBoZWxwZXJOYW1lKTsKKyAgICB2YXIgaGVscGVy
ID0gX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIuZGVmYXVsdChoZWxwZXJOYW1lLCBz
Y29wZS5nZXRTZWxmKCksIGVudik7CisKKyAgICB2YXIgaGVscGVyU3RyZWFtID0gX2VtYmVySHRt
bGJhcnNTeXN0ZW1JbnZva2VIZWxwZXIuYnVpbGRIZWxwZXJTdHJlYW0oaGVscGVyLCBwYXJhbXMs
IGhhc2gsIG51bGwsIGVudiwgc2NvcGUsIGxhYmVsKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBs
ID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgaGVscGVyU3RyZWFtLmFkZERl
cGVuZGVuY3kocGFyYW1zW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBrZXkgaW4gaGFzaCkg
eworICAgICAgaGVscGVyU3RyZWFtLmFkZERlcGVuZGVuY3koaGFzaFtrZXldKTsKKyAgICB9CisK
KyAgICByZXR1cm4gaGVscGVyU3RyZWFtOworICB9CisKKyAgZnVuY3Rpb24gbGFiZWxGb3JTdWJl
eHByKHBhcmFtcywgaGFzaCwgaGVscGVyTmFtZSkgeworICAgIHZhciBwYXJhbXNMYWJlbHMgPSBs
YWJlbHNGb3JQYXJhbXMocGFyYW1zKTsKKyAgICB2YXIgaGFzaExhYmVscyA9IGxhYmVsc0Zvckhh
c2goaGFzaCk7CisgICAgdmFyIGxhYmVsID0gJygnICsgaGVscGVyTmFtZTsKKworICAgIGlmIChw
YXJhbXNMYWJlbHMpIHsKKyAgICAgIGxhYmVsICs9ICcgJyArIHBhcmFtc0xhYmVsczsKKyAgICB9
CisgICAgaWYgKGhhc2hMYWJlbHMpIHsKKyAgICAgIGxhYmVsICs9ICcgJyArIGhhc2hMYWJlbHM7
CisgICAgfQorCisgICAgcmV0dXJuIGxhYmVsICsgJyknOworICB9CisKKyAgZnVuY3Rpb24gbGFi
ZWxzRm9yUGFyYW1zKHBhcmFtcykgeworICAgIHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGls
cy5sYWJlbHNGb3IocGFyYW1zKS5qb2luKCcgJyk7CisgIH0KKworICBmdW5jdGlvbiBsYWJlbHNG
b3JIYXNoKGhhc2gpIHsKKyAgICB2YXIgb3V0ID0gW107CisKKyAgICBmb3IgKHZhciBwcm9wIGlu
IGhhc2gpIHsKKyAgICAgIG91dC5wdXNoKHByb3AgKyAnPScgKyBfZW1iZXJNZXRhbFN0cmVhbXNV
dGlscy5sYWJlbEZvcihoYXNoW3Byb3BdKSk7CisgICAgfQorCisgICAgcmV0dXJuIG91dC5qb2lu
KCcgJyk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9ob29rcy91cGRhdGUtc2Vs
ZicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItaHRtbGJhcnMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gdXBkYXRlU2VsZjsKKworICBmdW5jdGlvbiB1cGRhdGVTZWxmKGVudiwgc2NvcGUsIF9zZWxm
KSB7CisgICAgdmFyIHNlbGYgPSBfc2VsZjsKKworICAgIGlmIChzZWxmICYmIHNlbGYuaGFzQm91
bmRDb250cm9sbGVyKSB7CisgICAgICB2YXIgX3NlbGYyID0gc2VsZjsKKyAgICAgIHZhciBjb250
cm9sbGVyID0gX3NlbGYyLmNvbnRyb2xsZXI7CisKKyAgICAgIHNlbGYgPSBzZWxmLnNlbGY7CisK
KyAgICAgIHNjb3BlLnVwZGF0ZUxvY2FsKCdjb250cm9sbGVyJywgY29udHJvbGxlciB8fCBzZWxm
KTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQlVHOiBzY29wZS5hdHRy
cyBhbmQgc2VsZi5pc1ZpZXcgc2hvdWxkIG5vdCBib3RoIGJlIHRydWUnLCAhKHNjb3BlLmF0dHJz
ICYmIHNlbGYuaXNWaWV3KSk7CisKKyAgICBpZiAoc2VsZiAmJiBzZWxmLmlzVmlldykgeworICAg
ICAgc2NvcGUudXBkYXRlTG9jYWwoJ3ZpZXcnLCBzZWxmKTsKKyAgICAgIHNjb3BlLnVwZGF0ZVNl
bGYoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHNlbGYsICdjb250ZXh0JyksICcnKTsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzY29wZS51cGRhdGVTZWxmKHNlbGYpOworICB9Cit9
KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMvaG9va3Mvd2lsbC1jbGVhbnVwLXRyZWUiLCBbImV4
cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IHdpbGxDbGVhbnVwVHJlZTsKKworICBmdW5jdGlvbiB3aWxsQ2xlYW51cFRy
ZWUoZW52KSB7CisgICAgdmFyIHZpZXcgPSBlbnYudmlldzsKKworICAgIC8vIFdoZW4gd2UgZ28g
dG8gY2xlYW4gdXAgdGhlIHJlbmRlciBub2RlIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLCB3ZSBt
YXkKKyAgICAvLyBlbmNvdW50ZXIgdmlld3MvY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhv
c2Ugbm9kZXMgYWxvbmcgdGhlIHdheS4gSW4KKyAgICAvLyB0aG9zZSBjYXNlcywgd2UgbmVlZCB0
byBzZXZlciB0aGUgbGluayBiZXR3ZWVuIHRoZQorICAgIC8vIGV4aXN0aW5nIHZpZXcgaGllcmFy
Y2h5IGFuZCB0aG9zZSB2aWV3cy4KKyAgICAvLworICAgIC8vIEhvd2V2ZXIsIHdlIGRvICpub3Qq
IG5lZWQgdG8gcmVtb3ZlIHRoZSBjaGlsZCB2aWV3cyBvZiBjaGlsZCB2aWV3cywgc2luY2UKKyAg
ICAvLyBzZXZlcmluZyB0aGUgY29ubmVjdGlvbiB0byB0aGVpciBwYXJlbnQgZWZmZWN0aXZlbHkg
c2V2ZXJzIHRoZW0gZnJvbSB0aGUKKyAgICAvLyB2aWV3IGdyYXBoLgorICAgIC8vCisgICAgLy8g
Rm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyB2aWV3IGdyYXBoOgorICAgIC8vCisg
ICAgLy8gICAgQQorICAgIC8vICAgLyBcCisgICAgLy8gIEIgIEMKKyAgICAvLyAgICAvIFwKKyAg
ICAvLyAgIEQgIEUKKyAgICAvLworICAgIC8vIElmIHdlIGFyZSBjbGVhbmluZyB1cCB0aGUgbm9k
ZSBmb3IgdmlldyBDLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IHZpZXcKKyAgICAvLyBmcm9tIEEn
cyBjaGlsZCB2aWV3cy4gSG93ZXZlciwgd2UgZG8gbm90IG5lZWQgdG8gcmVtb3ZlIEQgYW5kIEUg
ZnJvbSBDJ3MKKyAgICAvLyBjaGlsZCB2aWV3cywgc2luY2UgcmVtb3ZpbmcgQyB0cmFuc2l0aXZl
bHkgcmVtb3ZlcyBEIGFuZCBFIGFzIHdlbGwuCisgICAgLy8KKyAgICAvLyBUbyBhY2NvbXBsaXNo
IHRoaXMsIHdlIHRyYWNrIHRoZSBuZWFyZXN0IHZpZXcgdG8gdGhpcyByZW5kZXIgbm9kZSBvbiB0
aGUKKyAgICAvLyBvd25lciB2aWV3LCB0aGUgcm9vdC1tb3N0IHZpZXcgaW4gdGhlIGdyYXBoIChB
IGluIHRoZSBleGFtcGxlIGFib3ZlKS4gSWYKKyAgICAvLyB3ZSBkZXRlY3QgYSB2aWV3IHRoYXQg
aXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhhdCB2aWV3LCB3ZSByZW1vdmUgaXQgZnJvbQorICAgIC8v
IHRoZSBgY2hpbGRWaWV3c2AgYXJyYXkuIE90aGVyIHBhcmVudC9jaGlsZCB2aWV3IHJlbGF0aW9u
c2hpcHMgYXJlCisgICAgLy8gdW50b3VjaGVkLiAgVGhpcyB2aWV3IGlzIHRoZW4gY2xlYXJlZCBv
bmNlIGNsZWFudXAgaXMgY29tcGxldGUgaW4KKyAgICAvLyBgZGlkQ2xlYW51cFRyZWVgLgorICAg
IHZpZXcub3duZXJWaWV3Ll9kZXN0cm95aW5nU3VidHJlZUZvclZpZXcgPSB2aWV3OworICB9Cit9
KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvaW5kZXgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvY29yZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlcicsICdlbWJlci1odG1sYmFycy9zeXN0
ZW0vbWFrZV9ib3VuZF9oZWxwZXInLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycycsICdlbWJlci1o
dG1sYmFycy9oZWxwZXJzL2lmX3VubGVzcycsICdlbWJlci1odG1sYmFycy9oZWxwZXJzL3dpdGgn
LCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9sb2MnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9s
b2cnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy9lYWNoJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBl
cnMvZWFjaC1pbicsICdlbWJlci1odG1sYmFycy9oZWxwZXJzLy1ub3JtYWxpemUtY2xhc3MnLCAn
ZW1iZXItaHRtbGJhcnMvaGVscGVycy9jb25jYXQnLCAnZW1iZXItaHRtbGJhcnMvaGVscGVycy8t
am9pbi1jbGFzc2VzJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMvLWh0bWwtc2FmZScsICdlbWJl
ci1odG1sYmFycy9oZWxwZXJzL2hhc2gnLCAnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxw
ZXInLCAnZW1iZXItaHRtbGJhcnMvaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL3RlbXBsYXRlX3Jl
Z2lzdHJ5JywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9ib290c3RyYXAnLCAnZW1iZXItaHRtbGJh
cnMvY29tcGF0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlclRl
bXBsYXRlQ29tcGlsZXIsIF9lbWJlckh0bWxiYXJzU3lzdGVtTWFrZV9ib3VuZF9oZWxwZXIsIF9l
bWJlckh0bWxiYXJzSGVscGVycywgX2VtYmVySHRtbGJhcnNIZWxwZXJzSWZfdW5sZXNzLCBfZW1i
ZXJIdG1sYmFyc0hlbHBlcnNXaXRoLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNMb2MsIF9lbWJlckh0
bWxiYXJzSGVscGVyc0xvZywgX2VtYmVySHRtbGJhcnNIZWxwZXJzRWFjaCwgX2VtYmVySHRtbGJh
cnNIZWxwZXJzRWFjaEluLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNOb3JtYWxpemVDbGFzcywgX2Vt
YmVySHRtbGJhcnNIZWxwZXJzQ29uY2F0LCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNKb2luQ2xhc3Nl
cywgX2VtYmVySHRtbGJhcnNIZWxwZXJzSHRtbFNhZmUsIF9lbWJlckh0bWxiYXJzSGVscGVyc0hh
c2gsIF9lbWJlckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLCBfZW1iZXJIdG1sYmFyc0hlbHBlciwg
X2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeSwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Cb290
c3RyYXAsIF9lbWJlckh0bWxiYXJzQ29tcGF0KSB7CisgIC8qKgorICAgIEVtYmVyIHRlbXBsYXRl
cyBhcmUgZXhlY3V0ZWQgYnkgW0hUTUxCYXJzXShodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9o
dG1sYmFycyksCisgICAgYW4gSFRNTC1mcmllbmRseSB2ZXJzaW9uIG9mIFtIYW5kbGViYXJzXSho
dHRwOi8vaGFuZGxlYmFyc2pzLmNvbS8pLiBBbnkgdmFsaWQgSGFuZGxlYmFycyBzeW50YXggaXMg
dmFsaWQgaW4gYW4gRW1iZXIgdGVtcGxhdGUuCisgIAorICAgICMjIyBTaG93aW5nIGEgcHJvcGVy
dHkKKyAgCisgICAgVGVtcGxhdGVzIG1hbmFnZSB0aGUgZmxvdyBvZiBhbiBhcHBsaWNhdGlvbidz
IFVJLCBhbmQgZGlzcGxheSBzdGF0ZSAodGhyb3VnaAorICAgIHRoZSBET00pIHRvIGEgdXNlci4g
Rm9yIGV4YW1wbGUsIGdpdmVuIGEgY29tcG9uZW50IHdpdGggdGhlIHByb3BlcnR5ICJuYW1lIiwK
KyAgICB0aGF0IGNvbXBvbmVudCdzIHRlbXBsYXRlIGNhbiB1c2UgdGhlIG5hbWUgaW4gc2V2ZXJh
bCB3YXlzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8gYXBwL2NvbXBvbmVudHMvcGVy
c29uLmpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAg
ICBuYW1lOiAnSmlsbCcKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7ISBhcHAvY29tcG9uZW50cy9wZXJzb24uaGJzIH19CisgICAge3tuYW1lfX0KKyAgICA8
ZGl2Pnt7bmFtZX19PC9kaXY+CisgICAgPHNwYW4gZGF0YS1uYW1lPXt7bmFtZX19Pjwvc3Bhbj4K
KyAgICBgYGAKKyAgCisgICAgQW55IHRpbWUgdGhlICJuYW1lIiBwcm9wZXJ0eSBvbiB0aGUgY29t
cG9uZW50IGNoYW5nZXMsIHRoZSBET00gd2lsbCBiZQorICAgIHVwZGF0ZWQuCisgIAorICAgIFBy
b3BlcnRpZXMgY2FuIGJlIGNoYWluZWQgYXMgd2VsbDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7YVVzZXJNb2RlbC5uYW1lfX0KKyAgICA8ZGl2Pnt7bGlzdE9mVXNlcnMuZmlyc3RPYmpl
Y3QubmFtZX19PC9kaXY+CisgICAgYGBgCisgIAorICAgICMjIyBVc2luZyBFbWJlciBoZWxwZXJz
CisgIAorICAgIFdoZW4gY29udGVudCBpcyBwYXNzZWQgaW4gbXVzdGFjaGVzIGB7e319YCwgRW1i
ZXIgd2lsbCBmaXJzdCB0cnkgdG8gZmluZCBhIGhlbHBlcgorICAgIG9yIGNvbXBvbmVudCB3aXRo
IHRoYXQgbmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBgaWZgIGhlbHBlcjoKKyAgCisgICAgYGBgaGFu
ZGxlYmFycworICAgIHt7aWYgbmFtZSAiSSBoYXZlIGEgbmFtZSIgIkkgaGF2ZSBubyBuYW1lIn19
CisgICAgPHNwYW4gZGF0YS1oYXMtbmFtZT17e2lmIG5hbWUgdHJ1ZX19Pjwvc3Bhbj4KKyAgICBg
YGAKKyAgCisgICAgVGhlIHJldHVybmVkIHZhbHVlIGlzIHBsYWNlZCB3aGVyZSB0aGUgYHt7fX1g
IGlzIGNhbGxlZC4gVGhlIGFib3ZlIHN0eWxlIGlzCisgICAgY2FsbGVkICJpbmxpbmUiLiBBIHNl
Y29uZCBzdHlsZSBvZiBoZWxwZXIgdXNhZ2UgaXMgY2FsbGVkICJibG9jayIuIEZvciBleGFtcGxl
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjaWYgbmFtZX19CisgICAgICBJIGhhdmUg
YSBuYW1lCisgICAge3tlbHNlfX0KKyAgICAgIEkgaGF2ZSBubyBuYW1lCisgICAge3svaWZ9fQor
ICAgIGBgYAorICAKKyAgICBUaGUgYmxvY2sgZm9ybSBvZiBoZWxwZXJzIGFsbG93cyB5b3UgdG8g
Y29udHJvbCBob3cgdGhlIFVJIGlzIGNyZWF0ZWQgYmFzZWQKKyAgICBvbiB0aGUgdmFsdWVzIG9m
IHByb3BlcnRpZXMuCisgIAorICAgIEEgdGhpcmQgZm9ybSBvZiBoZWxwZXIgaXMgY2FsbGVkICJu
ZXN0ZWQiLiBGb3IgZXhhbXBsZSBoZXJlIHRoZSBjb25jYXQKKyAgICBoZWxwZXIgd2lsbCBhZGQg
IiBEb2UiIHRvIGEgZGlzcGxheWVkIG5hbWUgaWYgdGhlIHBlcnNvbiBoYXMgbm8gbGFzdCBuYW1l
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPHNwYW4gZGF0YS1uYW1lPXt7Y29uY2F0IGZp
cnN0TmFtZSAoCisgICAgIGlmIGxhc3ROYW1lIChjb25jYXQgIiAiIGxhc3ROYW1lKSAiRG9lIgor
ICAgICl9fT48L3NwYW4+CisgICAgYGBgCisgIAorICAgIEVtYmVyJ3MgYnVpbHQtaW4gaGVscGVy
cyBhcmUgZGVzY3JpYmVkIHVuZGVyIHRoZSBbRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnNdKC9hcGkv
Y2xhc3Nlcy9FbWJlci5UZW1wbGF0ZXMuaGVscGVycy5odG1sKQorICAgIG5hbWVzcGFjZS4gRG9j
dW1lbnRhdGlvbiBvbiBjcmVhdGluZyBjdXN0b20gaGVscGVycyBjYW4gYmUgZm91bmQgdW5kZXIK
KyAgICBbRW1iZXIuSGVscGVyXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGVscGVyLmh0bWwpLgorICAK
KyAgICAjIyMgSW52b2tpbmcgYSBDb21wb25lbnQKKyAgCisgICAgRW1iZXIgY29tcG9uZW50cyBy
ZXByZXNlbnQgc3RhdGUgdG8gdGhlIFVJIG9mIGFuIGFwcGxpY2F0aW9uLiBGdXJ0aGVyCisgICAg
cmVhZGluZyBvbiBjb21wb25lbnRzIGNhbiBiZSBmb3VuZCB1bmRlciBbRW1iZXIuQ29tcG9uZW50
XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpLgorICAKKyAgICBAbW9kdWxlIGVt
YmVyCisgICAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgICBAbWFpbiBlbWJlci10ZW1w
bGF0ZXMKKyAgICBAcHVibGljCisgICovCisKKyAgLyoqCisgIAorICAgIFtIVE1MQmFyc10oaHR0
cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vaHRtbGJhcnMpIGlzIGEgW0hhbmRsZWJhcnNdKGh0dHA6
Ly9oYW5kbGViYXJzanMuY29tLykKKyAgICBjb21wYXRpYmxlIHRlbXBsYXRpbmcgZW5naW5lIHVz
ZWQgYnkgRW1iZXIuanMuIFRoZSBjbGFzc2VzIGFuZCBuYW1lc3BhY2VzCisgICAgY292ZXJlZCBi
eSB0aGlzIGRvY3VtZW50YXRpb24gYXR0ZW1wdCB0byBmb2N1cyBvbiBBUElzIGZvciBpbnRlcmFj
dGluZworICAgIHdpdGggSFRNTEJhcnMgaXRzZWxmLiBGb3IgbW9yZSBnZW5lcmFsIGd1aWRhbmNl
IG9uIEVtYmVyLmpzIHRlbXBsYXRlcyBhbmQKKyAgICBoZWxwZXJzLCBwbGVhc2Ugc2VlIHRoZSBb
ZW1iZXItdGVtcGxhdGVzXSgvYXBpL21vZHVsZXMvZW1iZXItdGVtcGxhdGVzLmh0bWwpCisgICAg
cGFja2FnZS4KKyAgCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItaHRt
bGJhcnMKKyAgICBAbWFpbiBlbWJlci1odG1sYmFycworICAgIEBwdWJsaWMKKyAgKi8KKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIF9lbWJlckh0bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcignaWYn
LCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNJZl91bmxlc3MuaWZIZWxwZXIpOworICBfZW1iZXJIdG1s
YmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIF9lbWJlckh0bWxiYXJzSGVscGVy
c0lmX3VubGVzcy51bmxlc3NIZWxwZXIpOworICBfZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0
ZXJIZWxwZXIoJ3dpdGgnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNXaXRoLmRlZmF1bHQpOworICBf
ZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJ2xvYycsIF9lbWJlckh0bWxiYXJz
SGVscGVyc0xvYy5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVs
cGVyKCdsb2cnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNMb2cuZGVmYXVsdCk7CisgIF9lbWJlckh0
bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcignZWFjaCcsIF9lbWJlckh0bWxiYXJzSGVscGVy
c0VhY2guZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzSGVscGVycy5yZWdpc3RlckhlbHBlcign
ZWFjaC1pbicsIF9lbWJlckh0bWxiYXJzSGVscGVyc0VhY2hJbi5kZWZhdWx0KTsKKyAgX2VtYmVy
SHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCctbm9ybWFsaXplLWNsYXNzJywgX2VtYmVy
SHRtbGJhcnNIZWxwZXJzTm9ybWFsaXplQ2xhc3MuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJz
SGVscGVycy5yZWdpc3RlckhlbHBlcignY29uY2F0JywgX2VtYmVySHRtbGJhcnNIZWxwZXJzQ29u
Y2F0LmRlZmF1bHQpOworICBfZW1iZXJIdG1sYmFyc0hlbHBlcnMucmVnaXN0ZXJIZWxwZXIoJy1q
b2luLWNsYXNzZXMnLCBfZW1iZXJIdG1sYmFyc0hlbHBlcnNKb2luQ2xhc3Nlcy5kZWZhdWx0KTsK
KyAgX2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCctaHRtbC1zYWZlJywgX2Vt
YmVySHRtbGJhcnNIZWxwZXJzSHRtbFNhZmUuZGVmYXVsdCk7CisgIF9lbWJlckh0bWxiYXJzSGVs
cGVycy5yZWdpc3RlckhlbHBlcignaGFzaCcsIF9lbWJlckh0bWxiYXJzSGVscGVyc0hhc2guZGVm
YXVsdCk7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSFRNTEJhcnMgPSB7CisgICAgdGVt
cGxhdGU6IF9lbWJlclRlbXBsYXRlQ29tcGlsZXIudGVtcGxhdGUsCisgICAgY29tcGlsZTogX2Vt
YmVyVGVtcGxhdGVDb21waWxlci5jb21waWxlLAorICAgIHByZWNvbXBpbGU6IF9lbWJlclRlbXBs
YXRlQ29tcGlsZXIucHJlY29tcGlsZSwKKyAgICBtYWtlQm91bmRIZWxwZXI6IF9lbWJlckh0bWxi
YXJzU3lzdGVtTWFrZV9ib3VuZF9oZWxwZXIuZGVmYXVsdCwKKyAgICByZWdpc3RlclBsdWdpbjog
X2VtYmVyVGVtcGxhdGVDb21waWxlci5yZWdpc3RlclBsdWdpbiwKKyAgICBET01IZWxwZXI6IF9l
bWJlckh0bWxiYXJzU3lzdGVtRG9tSGVscGVyLmRlZmF1bHQKKyAgfTsKKworICBfZW1iZXJIdG1s
YmFyc0hlbHBlci5kZWZhdWx0LmhlbHBlciA9IF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBlcjsK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGVscGVyID0gX2VtYmVySHRtbGJhcnNIZWxwZXIu
ZGVmYXVsdDsKKworICAvKioKKyAgICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVtcGxhdGVzLiBU
aGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0ZWQKKyAgICBieSB0aGUgYnVpbGQgdG9v
bHMgc28gdGhhdCB5b3UgY2FuIHN0b3JlIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgaW4KKyAg
ICBzZXBhcmF0ZSBmaWxlcyB0aGF0IGdldCBsb2FkZWQgaW50byBKYXZhU2NyaXB0IGF0IGJ1aWxk
dGltZS4KKyAgCisgICAgQHByb3BlcnR5IFRFTVBMQVRFUworICAgIEBmb3IgRW1iZXIKKyAgICBA
dHlwZSBPYmplY3QKKyAgICBAcHJpdmF0ZQorICAqLworICBPYmplY3QuZGVmaW5lUHJvcGVydHko
X2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQsICdURU1QTEFURVMnLCB7CisgICAgY29uZmlndXJhYmxl
OiBmYWxzZSwKKyAgICBnZXQ6IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkuZ2V0VGVt
cGxhdGVzLAorICAgIHNldDogX2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeS5zZXRUZW1w
bGF0ZXMKKyAgfSk7Cit9KTsKKworLy8gSW1wb3J0aW5nIGFkZHMgdGVtcGxhdGUgYm9vdHN0cmFw
cGluZworLy8gaW5pdGlhbGl6ZXIgdG8gZW5hYmxlIGVtYmVkZGVkIHRlbXBsYXRlcy4KKworLy8g
SW1wb3J0aW5nIGVtYmVyLWh0bWxiYXJzL2NvbXBhdCB1cGRhdGVzIHRoZQorLy8gRW1iZXIuSGFu
ZGxlYmFycyBnbG9iYWwgaWYgaHRtbGJhcnMgaXMgZW5hYmxlZC4KK2VuaWZlZCgnZW1iZXItaHRt
bGJhcnMva2V5d29yZHMnLCBbJ2V4cG9ydHMnLCAnaHRtbGJhcnMtcnVudGltZSddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMucmVnaXN0ZXJLZXl3b3JkID0gcmVnaXN0ZXJLZXl3b3JkOworCisgIC8qKgorICAg
QHByaXZhdGUKKyAgIEBwcm9wZXJ0eSBoZWxwZXJzCisgICovCisgIHZhciBrZXl3b3JkcyA9IE9i
amVjdC5jcmVhdGUoX2h0bWxiYXJzUnVudGltZS5ob29rcy5rZXl3b3Jkcyk7CisKKyAgLyoqCisg
IEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisgIC8q
KgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBfcmVnaXN0ZXJIZWxwZXIKKyAgICBAZm9yIEVt
YmVyLkhUTUxCYXJzCisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKKyAgICBAcGFyYW0ge09iamVj
dHxGdW5jdGlvbn0ga2V5d29yZCBUaGUga2V5d29yZCB0byBhZGQuCisgICovCisKKyAgZnVuY3Rp
b24gcmVnaXN0ZXJLZXl3b3JkKG5hbWUsIGtleXdvcmQpIHsKKyAgICBrZXl3b3Jkc1tuYW1lXSA9
IGtleXdvcmQ7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBrZXl3b3JkczsKK30pOworZW5p
ZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWNvbXBvbmVudCcsIFsnZXhwb3J0
cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1l
dGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1tZXRhbC9l
bXB0eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1odG1sYmFy
cy9ob29rcy9zdWJleHByJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdlbWJlci1odG1sYmFycy91
dGlscy9leHRyYWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2xv
b2t1cC1jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9l
bWJlck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxTeW1ib2wsIF9lbWJlck1ldGFsU3RyZWFtc1N0
cmVhbSwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBf
ZW1iZXJIdG1sYmFyc0hvb2tzU3ViZXhwciwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxi
YXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1
cENvbXBvbmVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVy
LXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBjbG9zdXJlQ29tcG9uZW50OworICBleHBvcnRzLmlzQ29tcG9uZW50Q2VsbCA9IGlzQ29tcG9u
ZW50Q2VsbDsKKyAgZXhwb3J0cy5wcm9jZXNzUG9zaXRpb25hbFBhcmFtc0Zyb21DZWxsID0gcHJv
Y2Vzc1Bvc2l0aW9uYWxQYXJhbXNGcm9tQ2VsbDsKKyAgZXhwb3J0cy5tZXJnZUluTmV3SGFzaCA9
IG1lcmdlSW5OZXdIYXNoOworICB2YXIgQ09NUE9ORU5UX1JFRkVSRU5DRSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0NPTVBPTkVOVF9SRUZFUkVOQ0UnKTsKKyAgZXhwb3J0cy5DT01QT05F
TlRfUkVGRVJFTkNFID0gQ09NUE9ORU5UX1JFRkVSRU5DRTsKKyAgdmFyIENPTVBPTkVOVF9DRUxM
ID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnQ09NUE9ORU5UX0NFTEwnKTsKKyAgZXhwb3J0
cy5DT01QT05FTlRfQ0VMTCA9IENPTVBPTkVOVF9DRUxMOworICB2YXIgQ09NUE9ORU5UX1BBVEgg
PSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdDT01QT05FTlRfUEFUSCcpOworICBleHBvcnRz
LkNPTVBPTkVOVF9QQVRIID0gQ09NUE9ORU5UX1BBVEg7CisgIHZhciBDT01QT05FTlRfUE9TSVRJ
T05BTF9QQVJBTVMgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdDT01QT05FTlRfUE9TSVRJ
T05BTF9QQVJBTVMnKTsKKyAgZXhwb3J0cy5DT01QT05FTlRfUE9TSVRJT05BTF9QQVJBTVMgPSBD
T01QT05FTlRfUE9TSVRJT05BTF9QQVJBTVM7CisgIHZhciBDT01QT05FTlRfSEFTSCA9IF9lbWJl
ck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0NPTVBPTkVOVF9IQVNIJyk7CisKKyAgZXhwb3J0cy5DT01Q
T05FTlRfSEFTSCA9IENPTVBPTkVOVF9IQVNIOworICB2YXIgQ2xvc3VyZUNvbXBvbmVudFN0cmVh
bSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDog
ZnVuY3Rpb24gKGVudiwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB0aGlzLl9lbnYgPSBl
bnY7CisgICAgICB0aGlzLl9wYXRoID0gcGF0aDsKKyAgICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFt
czsKKyAgICAgIHRoaXMuX2hhc2ggPSBoYXNoOworICAgICAgdGhpcy5sYWJlbCA9IF9lbWJlckh0
bWxiYXJzSG9va3NTdWJleHByLmxhYmVsRm9yU3ViZXhwcihbcGF0aF0uY29uY2F0KHBhcmFtcyks
IGhhc2gsICdjb21wb25lbnQnKTsKKyAgICAgIHRoaXNbQ09NUE9ORU5UX1JFRkVSRU5DRV0gPSB0
cnVlOworICAgIH0sCisgICAgY29tcHV0ZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGNy
ZWF0ZUNsb3N1cmVDb21wb25lbnRDZWxsKHRoaXMuX2VudiwgdGhpcy5fcGF0aCwgdGhpcy5fcGFy
YW1zLCB0aGlzLl9oYXNoLCB0aGlzLmxhYmVsKTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9u
IGNsb3N1cmVDb21wb25lbnQoZW52LCBfcmVmMywgaGFzaCkgeworICAgIHZhciBwYXRoID0gX3Jl
ZjNbMF07CisKKyAgICB2YXIgcGFyYW1zID0gX3JlZjMuc2xpY2UoMSk7CisKKyAgICB2YXIgcyA9
IG5ldyBDbG9zdXJlQ29tcG9uZW50U3RyZWFtKGVudiwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKwor
ICAgIHMuYWRkRGVwZW5kZW5jeShwYXRoKTsKKworICAgIC8vIEZJWE1FOiBJZiB0aGUgc3RyZWFt
IGludmFsaWRhdGVzIG9uIGV2ZXJ5IHBhcmFtcyBvciBoYXNoIGNoYW5nZSwgdGhlbgorICAgIC8v
IHRoZSB7e2NvbXBvbmVudCBoZWxwZXIgd2lsbCBiZSBmb3JjZWQgdG8gcmUtcmVuZGVyIHRoZSB3
aG9sZSBjb21wb25lbnQKKyAgICAvLyBlYWNoIHRpbWUuIEluc3RlYWQsIHRoZXNlIGRlcGVuZGVu
Y2llcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGFuZCB0aGUKKyAgICAvLyBlbGVtZW50IGNvbXBv
bmVudCBrZXl3b3JkIHNob3VsZCBhZGQgdGhlIHBhcmFtcyBhbmQgaGFzaCBhcyBkZXBlbmRlbmNp
ZXMuCisgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgIHJldHVybiBz
LmFkZERlcGVuZGVuY3koaXRlbSk7CisgICAgfSk7CisgICAgT2JqZWN0LmtleXMoaGFzaCkuZm9y
RWFjaChmdW5jdGlvbiAoa2V5KSB7CisgICAgICByZXR1cm4gcy5hZGREZXBlbmRlbmN5KGhhc2hb
a2V5XSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gczsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0
ZUNsb3N1cmVDb21wb25lbnRDZWxsKGVudiwgb3JpZ2luYWxDb21wb25lbnRQYXRoLCBwYXJhbXMs
IGhhc2gsIGxhYmVsKSB7CisgICAgdmFyIGNvbXBvbmVudFBhdGggPSBfZW1iZXJNZXRhbFN0cmVh
bXNVdGlscy5yZWFkKG9yaWdpbmFsQ29tcG9uZW50UGF0aCk7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnQ29tcG9uZW50IHBhdGggY2Fubm90IGJlIG51bGwgaW4gJyArIGxhYmVsLCAh
X2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoY29tcG9uZW50UGF0aCkpOworCisgICAgdmFyIG5l
d0hhc2ggPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCksIGhhc2gpOworCisgICAgaWYgKGlzQ29tcG9uZW50Q2VsbChjb21wb25l
bnRQYXRoKSkgeworICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZENsb3N1cmVDb21wb25lbnRDZWxs
KGNvbXBvbmVudFBhdGgsIHBhcmFtcywgbmV3SGFzaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgY29tcG9uZW50IGhlbHBlciBjYW5ub3QgYmUgdXNl
ZCB3aXRob3V0IGEgdmFsaWQgY29tcG9uZW50IG5hbWUuIFlvdSB1c2VkICInICsgY29tcG9uZW50
UGF0aCArICciIHZpYSAnICsgbGFiZWwsIGlzVmFsaWRDb21wb25lbnRQYXRoKGVudiwgY29tcG9u
ZW50UGF0aCkpOworICAgICAgcmV0dXJuIGNyZWF0ZU5ld0Nsb3N1cmVDb21wb25lbnRDZWxsKGVu
diwgY29tcG9uZW50UGF0aCwgcGFyYW1zLCBuZXdIYXNoKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBpc1ZhbGlkQ29tcG9uZW50UGF0aChlbnYsIHBhdGgpIHsKKyAgICB2YXIgcmVzdWx0ID0g
X2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1cENvbXBvbmVudC5kZWZhdWx0KGVudi5vd25lciwgcGF0
aCk7CisKKyAgICByZXR1cm4gISEocmVzdWx0LmNvbXBvbmVudCB8fCByZXN1bHQubGF5b3V0KTsK
KyAgfQorCisgIGZ1bmN0aW9uIGlzQ29tcG9uZW50Q2VsbChjb21wb25lbnQpIHsKKyAgICByZXR1
cm4gY29tcG9uZW50ICYmIGNvbXBvbmVudFtDT01QT05FTlRfQ0VMTF07CisgIH0KKworICBmdW5j
dGlvbiBjcmVhdGVOZXN0ZWRDbG9zdXJlQ29tcG9uZW50Q2VsbChjb21wb25lbnRDZWxsLCBwYXJh
bXMsIGhhc2gpIHsKKyAgICB2YXIgX3JlZjsKKworICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9u
ZSBpbiBlYWNoIG5lc3RpbmcgbGV2ZWwgdG8gYXZvaWQgcmFpc2luZyBhc3NlcnRpb25zLgorICAg
IHByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50Q2VsbCwgcGFyYW1zLCBo
YXNoKTsKKworICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZbQ09NUE9ORU5UX1BBVEhdID0gY29t
cG9uZW50Q2VsbFtDT01QT05FTlRfUEFUSF0sIF9yZWZbQ09NUE9ORU5UX0hBU0hdID0gbWVyZ2VJ
bk5ld0hhc2goY29tcG9uZW50Q2VsbFtDT01QT05FTlRfSEFTSF0sIGhhc2gpLCBfcmVmW0NPTVBP
TkVOVF9QT1NJVElPTkFMX1BBUkFNU10gPSBjb21wb25lbnRDZWxsW0NPTVBPTkVOVF9QT1NJVElP
TkFMX1BBUkFNU10sIF9yZWZbQ09NUE9ORU5UX0NFTExdID0gdHJ1ZSwgX3JlZjsKKyAgfQorCisg
IGZ1bmN0aW9uIHByb2Nlc3NQb3NpdGlvbmFsUGFyYW1zRnJvbUNlbGwoY29tcG9uZW50Q2VsbCwg
cGFyYW1zLCBoYXNoKSB7CisgICAgdmFyIHBvc2l0aW9uYWxQYXJhbXMgPSBjb21wb25lbnRDZWxs
W0NPTVBPTkVOVF9QT1NJVElPTkFMX1BBUkFNU107CisKKyAgICBfZW1iZXJIdG1sYmFyc1V0aWxz
RXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMucHJvY2Vzc1Bvc2l0aW9uYWxQYXJhbXMobnVsbCwgcG9z
aXRpb25hbFBhcmFtcywgcGFyYW1zLCBoYXNoKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZU5l
d0Nsb3N1cmVDb21wb25lbnRDZWxsKGVudiwgY29tcG9uZW50UGF0aCwgcGFyYW1zLCBoYXNoKSB7
CisgICAgdmFyIF9yZWYyOworCisgICAgdmFyIHBvc2l0aW9uYWxQYXJhbXMgPSBnZXRQb3NpdGlv
bmFsUGFyYW1zKGVudi5vd25lciwgY29tcG9uZW50UGF0aCk7CisKKyAgICAvLyBUaGlzIG5lZWRz
IHRvIGJlIGRvbmUgaW4gZWFjaCBuZXN0aW5nIGxldmVsIHRvIGF2b2lkIHJhaXNpbmcgYXNzZXJ0
aW9ucy4KKyAgICBfZW1iZXJIdG1sYmFyc1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMucHJv
Y2Vzc1Bvc2l0aW9uYWxQYXJhbXMobnVsbCwgcG9zaXRpb25hbFBhcmFtcywgcGFyYW1zLCBoYXNo
KTsKKworICAgIHJldHVybiBfcmVmMiA9IHt9LCBfcmVmMltDT01QT05FTlRfUEFUSF0gPSBjb21w
b25lbnRQYXRoLCBfcmVmMltDT01QT05FTlRfSEFTSF0gPSBoYXNoLCBfcmVmMltDT01QT05FTlRf
UE9TSVRJT05BTF9QQVJBTVNdID0gcG9zaXRpb25hbFBhcmFtcywgX3JlZjJbQ09NUE9ORU5UX0NF
TExdID0gdHJ1ZSwgX3JlZjI7CisgIH0KKworICAvKgorICAgUmV0dXJucyB0aGUgcG9zaXRpb25h
bCBwYXJhbWV0ZXJzIGZvciBjb21wb25lbnQgYGNvbXBvbmVudFBhdGhgLgorICAgSWYgaXQgaGFz
IG5vIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgaXQgcmV0dXJucyB0aGUgZW1wdHkgYXJyYXkuCisg
ICAqLworICBmdW5jdGlvbiBnZXRQb3NpdGlvbmFsUGFyYW1zKGNvbnRhaW5lciwgY29tcG9uZW50
UGF0aCkgeworICAgIGlmICghY29tcG9uZW50UGF0aCkgeworICAgICAgcmV0dXJuIFtdOworICAg
IH0KKyAgICB2YXIgcmVzdWx0ID0gX2VtYmVySHRtbGJhcnNVdGlsc0xvb2t1cENvbXBvbmVudC5k
ZWZhdWx0KGNvbnRhaW5lciwgY29tcG9uZW50UGF0aCk7CisgICAgdmFyIGNvbXBvbmVudCA9IHJl
c3VsdC5jb21wb25lbnQ7CisKKyAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5wb3NpdGlv
bmFsUGFyYW1zKSB7CisgICAgICByZXR1cm4gY29tcG9uZW50LnBvc2l0aW9uYWxQYXJhbXM7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBbXTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBt
ZXJnZUluTmV3SGFzaChvcmlnaW5hbCwgdXBkYXRlcykgeworICAgIHJldHVybiBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBvcmlnaW5hbCwgdXBkYXRlcyk7CisgIH0KK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jb21wb25lbnQnLCBbJ2V4cG9ydHMnLCAnaHRtbGJh
cnMtcnVudGltZS9ob29rcycsICdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWNvbXBv
bmVudCcsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfaHRtbGJhcnNSdW50aW1lSG9va3MsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2VtYmVy
TWV0YWxBc3NpZ24pIHsKKyAgLyoqCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUg
ZW1iZXItdGVtcGxhdGVzCisgICAgQHB1YmxpYworICAqLworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICAgVGhlIGB7e2NvbXBvbmVudH19YCBoZWxwZXIgbGV0cyB5b3UgYWRkIGluc3RhbmNl
cyBvZiBgRW1iZXIuQ29tcG9uZW50YCB0byBhCisgICAgdGVtcGxhdGUuIFNlZSBbRW1iZXIuQ29t
cG9uZW50XSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0bWwpIGZvcgorICAgIGFkZGl0
aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEgYENvbXBvbmVudGAgZnVuY3Rpb25zLgorICAgIGB7
e2NvbXBvbmVudH19YCdzIHByaW1hcnkgdXNlIGlzIGZvciBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0
byBkeW5hbWljYWxseQorICAgIGNoYW5nZSB3aGljaCB0eXBlIG9mIGNvbXBvbmVudCBpcyByZW5k
ZXJlZCBhcyB0aGUgc3RhdGUgb2YgeW91ciBhcHBsaWNhdGlvbgorICAgIGNoYW5nZXMuIFRoZSBw
cm92aWRlZCBibG9jayB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgY29t
cG9uZW50LgorICAgIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRoZSBmb2xsb3dpbmcgdGVtcGxh
dGU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyEgYXBwbGljYXRpb24uaGJzIH19Cisg
ICAge3tjb21wb25lbnQgaW5mb2dyYXBoaWNDb21wb25lbnROYW1lfX0KKyAgICBgYGAKKyAgCisg
ICAgQW5kIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY29kZToKKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAg
IGluZm9ncmFwaGljQ29tcG9uZW50TmFtZTogY29tcHV0ZWQoJ2lzTWFya2V0T3BlbicsIHsKKyAg
ICAgICAgZ2V0KCkgeworICAgICAgICAgIGlmICh0aGlzLmdldCgnaXNNYXJrZXRPcGVuJykpIHsK
KyAgICAgICAgICAgIHJldHVybiAnbGl2ZS11cGRhdGluZy1jaGFydCc7CisgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHJldHVybiAnbWFya2V0LWNsb3NlLXN1bW1hcnknOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfSkKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgVGhl
IGBsaXZlLXVwZGF0aW5nLWNoYXJ0YCBjb21wb25lbnQgd2lsbCBiZSBhcHBlbmRlZCB3aGVuIGBp
c01hcmtldE9wZW5gIGlzCisgICAgYHRydWVgLCBhbmQgdGhlIGBtYXJrZXQtY2xvc2Utc3VtbWFy
eWAgY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWQgd2hlbgorICAgIGBpc01hcmtldE9wZW5gIGlz
IGBmYWxzZWAuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzIHdoaWxlIHRoZSBhcHAgaXMgcnVubmluZywK
KyAgICB0aGUgY29tcG9uZW50IHdpbGwgYmUgYXV0b21hdGljYWxseSBzd2FwcGVkIG91dCBhY2Nv
cmRpbmdseS4KKyAgICBOb3RlOiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBoZWxwZXIgd2hlbiB5
b3UgYXJlIGNvbnNpc3RlbnRseSByZW5kZXJpbmcgdGhlIHNhbWUKKyAgICBjb21wb25lbnQuIElu
IHRoYXQgY2FzZSwgdXNlIHN0YW5kYXJkIGNvbXBvbmVudCBzeW50YXgsIGZvciBleGFtcGxlOgor
ICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3shIGFwcGxpY2F0aW9uLmhicyB9fQorICAgIHt7
bGl2ZS11cGRhdGluZy1jaGFydH19CisgICAgYGBgCisgIAorICAgICMjIE5lc3RlZCBVc2FnZQor
ICAKKyAgICBUaGUgYGNvbXBvbmVudGAgaGVscGVyIGNhbiBiZSB1c2VkIHRvIHBhY2thZ2UgYSBj
b21wb25lbnQgcGF0aCB3aXRoIGluaXRpYWwgYXR0cnMuCisgICAgVGhlIGluY2x1ZGVkIGF0dHJz
IGNhbiB0aGVuIGJlIG1lcmdlZCBkdXJpbmcgdGhlIGZpbmFsIGludm9jYXRpb24uCisgIAorICAg
IEZvciBleGFtcGxlLCBnaXZlbiBhIGBwZXJzb24tZm9ybWAgY29tcG9uZW50IHdpdGggdGhlIGZv
bGxvd2luZyB0ZW1wbGF0ZToKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7eWllbGQgKGhh
c2gKKyAgICAgICAgbmFtZUlucHV0PShjb21wb25lbnQgIm15LWlucHV0LWNvbXBvbmVudCIgdmFs
dWU9bW9kZWwubmFtZSBwbGFjZWhvbGRlcj0iRmlyc3QgTmFtZSIpKX19CisgICAgYGBgCisgIAor
ICAgIFRoZSBmb2xsb3dpbmcgc25pcHBldDoKKyAgCisgICAgYGBgCisgICAge3sjcGVyc29uLWZv
cm0gYXMgfGZvcm18fX0KKyAgICAgIHt7Y29tcG9uZW50IGZvcm0ubmFtZUlucHV0IHBsYWNlaG9s
ZGVyPSJVc2VybmFtZSJ9fQorICAgIHt7L3BlcnNvbi1mb3JtfX0KKyAgICBgYGAKKyAgCisgICAg
d291bGQgb3V0cHV0IGFuIGlucHV0IHdob3NlIHZhbHVlIGlzIGFscmVhZHkgYm91bmQgdG8gYG1v
ZGVsLm5hbWVgIGFuZCBgcGxhY2Vob2xkZXJgCisgICAgaXMgIlVzZXJuYW1lIi4KKyAgCisgICAg
QG1ldGhvZCBjb21wb25lbnQKKyAgICBAc2luY2UgMS4xMS4wCisgICAgQGZvciBFbWJlci5UZW1w
bGF0ZXMuaGVscGVycworICAgIEBwdWJsaWMKKyAgKi8KKworICBleHBvcnRzLmRlZmF1bHQgPSBm
dW5jdGlvbiAobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICBpZiAoIW1vcnBoKSB7CisgICAgICByZXR1cm4gX2VtYmVySHRt
bGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuZGVmYXVsdChlbnYsIHBhcmFtcywgaGFzaCk7
CisgICAgfQorCisgICAgdmFyIG5ld0hhc2ggPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5l
dyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCksIGhhc2gpOworCisgICAgX2h0bWxi
YXJzUnVudGltZUhvb2tzLmtleXdvcmQoJ0BlbGVtZW50X2NvbXBvbmVudCcsIG1vcnBoLCBlbnYs
IHNjb3BlLCBwYXJhbXMsIG5ld0hhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKKyAgfTsKK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jk
cy9kZWJ1Z2dlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZyddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZykgeworICAvKmpzaGludCBkZWJ1Zzp0cnVlKi8KKwor
ICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICov
CisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGRlYnVnZ2VyS2V5d29y
ZDsKKworICAvKioKKyAgICBFeGVjdXRlIHRoZSBgZGVidWdnZXJgIHN0YXRlbWVudCBpbiB0aGUg
Y3VycmVudCB0ZW1wbGF0ZSdzIGNvbnRleHQuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
e2RlYnVnZ2VyfX0KKyAgICBgYGAKKyAgCisgICAgV2hlbiB1c2luZyB0aGUgZGVidWdnZXIgaGVs
cGVyIHlvdSB3aWxsIGhhdmUgYWNjZXNzIHRvIGEgYGdldGAgZnVuY3Rpb24uIFRoaXMKKyAgICBm
dW5jdGlvbiByZXRyaWV2ZXMgdmFsdWVzIGF2YWlsYWJsZSBpbiB0aGUgY29udGV4dCBvZiB0aGUg
dGVtcGxhdGUuCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB3b25kZXJpbmcgd2h5IGEgdmFs
dWUgYHt7Zm9vfX1gIGlzbid0IHJlbmRlcmluZyBhcworICAgIGV4cGVjdGVkIHdpdGhpbiBhIHRl
bXBsYXRlLCB5b3UgY291bGQgcGxhY2UgYSBge3tkZWJ1Z2dlcn19YCBzdGF0ZW1lbnQgYW5kLAor
ICAgIHdoZW4gdGhlIGBkZWJ1Z2dlcjtgIGJyZWFrcG9pbnQgaXMgaGl0LCB5b3UgY2FuIGF0dGVt
cHQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZToKKyAgCisgICAgYGBgCisgICAgPiBnZXQoJ2Zvbycp
CisgICAgYGBgCisgIAorICAgIGBnZXRgIGlzIGFsc28gYXdhcmUgb2Yga2V5d29yZHMuIFNvIGlu
IHRoaXMgc2l0dWF0aW9uCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNlYWNoIGl0ZW1z
IGFzIHxpdGVtfH19CisgICAgICB7e2RlYnVnZ2VyfX0KKyAgICB7ey9lYWNofX0KKyAgICBgYGAK
KyAgCisgICAgWW91J2xsIGJlIGFibGUgdG8gZ2V0IHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IGl0
ZW06CisgIAorICAgIGBgYAorICAgID4gZ2V0KCdpdGVtLm5hbWUnKQorICAgIGBgYAorICAKKyAg
ICBZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBjb250ZXh0IG9mIHRoZSB2aWV3IHRvIG1ha2Ugc3Vy
ZSBpdCBpcyB0aGUgb2JqZWN0IHRoYXQKKyAgICB5b3UgZXhwZWN0OgorICAKKyAgICBgYGAKKyAg
ICA+IGNvbnRleHQKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBkZWJ1Z2dlcgorICAgIEBmb3Ig
RW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
ZGVidWdnZXJLZXl3b3JkKG1vcnBoLCBlbnYsIHNjb3BlKSB7CisgICAgLyoganNoaW50IHVudXNl
ZDogZmFsc2UsIGRlYnVnOiB0cnVlICovCisKKyAgICB2YXIgdmlldyA9IGVudi5ob29rcy5nZXRW
YWx1ZShzY29wZS5nZXRMb2NhbCgndmlldycpKTsKKyAgICB2YXIgY29udGV4dCA9IGVudi5ob29r
cy5nZXRWYWx1ZShzY29wZS5nZXRTZWxmKCkpOworCisgICAgZnVuY3Rpb24gZ2V0KHBhdGgpIHsK
KyAgICAgIHJldHVybiBlbnYuaG9va3MuZ2V0VmFsdWUoZW52Lmhvb2tzLmdldChlbnYsIHNjb3Bl
LCBwYXRoKSk7CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5pbmZvKCdVc2UgYHZpZXdg
LCBgY29udGV4dGAsIGFuZCBgZ2V0KDxwYXRoPilgIHRvIGRlYnVnIHRoaXMgdGVtcGxhdGUuJyk7
CisKKyAgICBkZWJ1Z2dlcjsKKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgn
ZW1iZXItaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1jb21wb25lbnQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtY29t
cG9uZW50JywgJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL2xvb2t1cC1jb21wb25lbnQnLCAnZW1iZXIt
aHRtbGJhcnMvdXRpbHMvZXh0cmFjdC1wb3NpdGlvbmFsLXBhcmFtcyddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29t
cG9uZW50LCBfZW1iZXJIdG1sYmFyc1V0aWxzTG9va3VwQ29tcG9uZW50LCBfZW1iZXJIdG1sYmFy
c1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBzZXR1cFN0YXRlOiBmdW5jdGlvbiAobGFzdFN0YXRlLCBl
bnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gpIHsKKyAgICAgIHZhciBjb21wb25lbnRQYXRoID0gZ2V0
Q29tcG9uZW50UGF0aChwYXJhbXNbMF0sIGVudik7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdCh7fSwgbGFzdFN0YXRlLCB7CisgICAgICAgIGNvbXBvbmVudFBhdGg6IGNv
bXBvbmVudFBhdGgsCisgICAgICAgIGlzQ29tcG9uZW50SGVscGVyOiB0cnVlCisgICAgICB9KTsK
KyAgICB9LAorCisgICAgcmVuZGVyOiBmdW5jdGlvbiAobW9ycGgpIHsKKyAgICAgIHZhciBzdGF0
ZSA9IG1vcnBoLmdldFN0YXRlKCk7CisKKyAgICAgIGlmIChzdGF0ZS5tYW5hZ2VyKSB7CisgICAg
ICAgIHN0YXRlLm1hbmFnZXIuZGVzdHJveSgpOworICAgICAgfQorCisgICAgICAvLyBGb3JjZSB0
aGUgY29tcG9uZW50IGhvb2sgdG8gdHJlYXQgdGhpcyBhcyBhIGZpcnN0LXRpbWUgcmVuZGVyLAor
ICAgICAgLy8gYmVjYXVzZSBub3JtYWwgY29tcG9uZW50cyAoYDxmb28tYmFyPmApIGNhbm5vdCBj
aGFuZ2UgYXQgcnVudGltZSwKKyAgICAgIC8vIGJ1dCB0aGUgYHt7Y29tcG9uZW50fX1gIGhlbHBl
ciBjYW4uCisgICAgICBzdGF0ZS5tYW5hZ2VyID0gbnVsbDsKKworICAgICAgZm9yICh2YXIgX2xl
biA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDog
MCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIHJlc3RbX2tleSAt
IDFdID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZW5kZXIuYXBwbHkodW5k
ZWZpbmVkLCBbbW9ycGhdLmNvbmNhdChyZXN0KSk7CisgICAgfSwKKworICAgIHJlcmVuZGVyOiBy
ZW5kZXIKKyAgfTsKKworICBmdW5jdGlvbiBnZXRDb21wb25lbnRQYXRoKHBhcmFtLCBlbnYpIHsK
KyAgICB2YXIgcGF0aCA9IGVudi5ob29rcy5nZXRWYWx1ZShwYXJhbSk7CisgICAgaWYgKF9lbWJl
ckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LmlzQ29tcG9uZW50Q2VsbChwYXRoKSkg
eworICAgICAgcGF0aCA9IHBhdGhbX2VtYmVySHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25l
bnQuQ09NUE9ORU5UX1BBVEhdOworICAgIH0KKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIGZ1
bmN0aW9uIHJlbmRlcihtb3JwaCwgZW52LCBzY29wZSwgX3JlZiwgaGFzaCwgdGVtcGxhdGUsIGlu
dmVyc2UsIHZpc2l0b3IpIHsKKyAgICB2YXIgcGF0aCA9IF9yZWZbMF07CisKKyAgICB2YXIgcGFy
YW1zID0gX3JlZi5zbGljZSgxKTsKKworICAgIHZhciBpc1JlcmVuZGVyID0gYXJndW1lbnRzLmxl
bmd0aCA8PSA4IHx8IGFyZ3VtZW50c1s4XSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBhcmd1bWVu
dHNbOF07CisKKyAgICB2YXIgX21vcnBoJGdldFN0YXRlID0gbW9ycGguZ2V0U3RhdGUoKTsKKwor
ICAgIHZhciBjb21wb25lbnRQYXRoID0gX21vcnBoJGdldFN0YXRlLmNvbXBvbmVudFBhdGg7CisK
KyAgICAvLyBJZiB0aGUgdmFsdWUgcGFzc2VkIHRvIHRoZSB7e2NvbXBvbmVudH19IGhlbHBlciBp
cyB1bmRlZmluZWQgb3IgbnVsbCwKKyAgICAvLyBkb24ndCBjcmVhdGUgYSBuZXcgQ29tcG9uZW50
Tm9kZS4KKyAgICBpZiAoY29tcG9uZW50UGF0aCA9PT0gdW5kZWZpbmVkIHx8IGNvbXBvbmVudFBh
dGggPT09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYXRoID0gZW52Lmhv
b2tzLmdldFZhbHVlKHBhdGgpOworCisgICAgaWYgKGlzUmVyZW5kZXIpIHsKKyAgICAgIHZhciBy
ZXN1bHQgPSBfZW1iZXJIdG1sYmFyc1V0aWxzTG9va3VwQ29tcG9uZW50LmRlZmF1bHQoZW52Lm93
bmVyLCBjb21wb25lbnRQYXRoKTsKKyAgICAgIHZhciBjb21wb25lbnQgPSByZXN1bHQuY29tcG9u
ZW50OworCisgICAgICBfZW1iZXJIdG1sYmFyc1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMu
ZGVmYXVsdChudWxsLCBjb21wb25lbnQsIHBhcmFtcywgaGFzaCk7CisgICAgfQorCisgICAgaWYg
KF9lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9uZW50LmlzQ29tcG9uZW50Q2VsbChw
YXRoKSkgeworICAgICAgdmFyIGNsb3N1cmVDb21wb25lbnQgPSBlbnYuaG9va3MuZ2V0VmFsdWUo
cGF0aCk7CisKKyAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBlYWNoIG5lc3Rpbmcg
bGV2ZWwgdG8gYXZvaWQgcmFpc2luZyBhc3NlcnRpb25zCisgICAgICBfZW1iZXJIdG1sYmFyc0tl
eXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5wcm9jZXNzUG9zaXRpb25hbFBhcmFtc0Zyb21DZWxsKGNs
b3N1cmVDb21wb25lbnQsIHBhcmFtcywgaGFzaCk7CisgICAgICBwYXJhbXMgPSBbXTsKKyAgICAg
IGhhc2ggPSBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudC5tZXJnZUluTmV3
SGFzaChjbG9zdXJlQ29tcG9uZW50W19lbWJlckh0bWxiYXJzS2V5d29yZHNDbG9zdXJlQ29tcG9u
ZW50LkNPTVBPTkVOVF9IQVNIXSwgaGFzaCk7CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlcyA9
IHsgZGVmYXVsdDogdGVtcGxhdGUsIGludmVyc2U6IGludmVyc2UgfTsKKyAgICBlbnYuaG9va3Mu
Y29tcG9uZW50KG1vcnBoLCBlbnYsIHNjb3BlLCBjb21wb25lbnRQYXRoLCBwYXJhbXMsIGhhc2gs
IHRlbXBsYXRlcywgdmlzaXRvcik7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9r
ZXl3b3Jkcy9nZXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1o
dG1sYmFycy91dGlscy9zdWJzY3JpYmUnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9vYnNlcnZlciddLCBmdW5jdGlv
biAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLCBf
ZW1iZXJNZXRhbFN0cmVhbXNVdGlscywgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRh
bE9ic2VydmVyKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIGxhYmVsRm9y
KHNvdXJjZSwga2V5KSB7CisgICAgdmFyIHNvdXJjZUxhYmVsID0gc291cmNlLmxhYmVsID8gc291
cmNlLmxhYmVsIDogJyc7CisgICAgdmFyIGtleUxhYmVsID0ga2V5LmxhYmVsID8ga2V5LmxhYmVs
IDogJyc7CisgICAgcmV0dXJuICcoZ2V0ICcgKyBzb3VyY2VMYWJlbCArICcgJyArIGtleUxhYmVs
ICsgJyknOworICB9CisKKyAgdmFyIER5bmFtaWNLZXlTdHJlYW0gPSBfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0uZGVmYXVsdC5leHRlbmQoeworICAgIGluaXQ6IGZ1bmN0aW9uIChzb3VyY2UsIGtl
eVNvdXJjZSkgeworICAgICAgLy8gVXNlZCB0byBnZXQgdGhlIG9yaWdpbmFsIHBhdGggZm9yIGRl
YnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAgIHZhciBsYWJlbCA9IGxhYmVsRm9yKHNvdXJjZSwga2V5
U291cmNlKTsKKworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgdGhpcy5wYXRoID0g
bGFiZWw7CisgICAgICB0aGlzLnNvdXJjZURlcCA9IHRoaXMuYWRkTXV0YWJsZURlcGVuZGVuY3ko
c291cmNlKTsKKyAgICAgIHRoaXMua2V5RGVwID0gdGhpcy5hZGRNdXRhYmxlRGVwZW5kZW5jeShr
ZXlTb3VyY2UpOworICAgICAgdGhpcy5vYnNlcnZlZE9iamVjdCA9IG51bGw7CisgICAgICB0aGlz
Lm9ic2VydmVkS2V5ID0gbnVsbDsKKyAgICB9LAorCisgICAga2V5OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIga2V5ID0gdGhpcy5rZXlEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmICh0eXBlb2Yg
a2V5ID09PSAnc3RyaW5nJykgeworICAgICAgICByZXR1cm4ga2V5OworICAgICAgfQorICAgIH0s
CisKKyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5z
b3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIHZhciBrZXkgPSB0aGlzLmtleSgpOworICAgICAg
aWYgKG9iamVjdCAmJiBrZXkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldChvYmplY3QsIGtleSk7CisgICAgICB9CisgICAgfSwKKworICAgIHNldFZhbHVlOiBm
dW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIHZhciBvYmplY3QgPSB0aGlzLnNvdXJjZURlcC5nZXRW
YWx1ZSgpOworICAgICAgdmFyIGtleSA9IHRoaXMua2V5KCk7CisgICAgICBpZiAob2JqZWN0KSB7
CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChvYmplY3QsIGtleSwgdmFsdWUp
OworICAgICAgfQorICAgIH0sCisKKyAgICBfc3VwZXIkcmV2YWxpZGF0ZTogX2VtYmVyTWV0YWxT
dHJlYW1zU3RyZWFtLmRlZmF1bHQucHJvdG90eXBlLnJldmFsaWRhdGUsCisKKyAgICByZXZhbGlk
YXRlOiBmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIHRoaXMuX3N1cGVyJHJldmFsaWRhdGUodmFs
dWUpOworCisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAg
ICAgIHZhciBrZXkgPSB0aGlzLmtleSgpOworICAgICAgaWYgKG9iamVjdCAhPT0gdGhpcy5vYnNl
cnZlZE9iamVjdCB8fCBrZXkgIT09IHRoaXMub2JzZXJ2ZWRLZXkpIHsKKyAgICAgICAgdGhpcy5f
Y2xlYXJPYnNlcnZlZE9iamVjdCgpOworCisgICAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9i
amVjdCA9PT0gJ29iamVjdCcgJiYga2V5KSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxPYnNlcnZl
ci5hZGRPYnNlcnZlcihvYmplY3QsIGtleSwgdGhpcywgdGhpcy5ub3RpZnkpOworICAgICAgICAg
IHRoaXMub2JzZXJ2ZWRPYmplY3QgPSBvYmplY3Q7CisgICAgICAgICAgdGhpcy5vYnNlcnZlZEtl
eSA9IGtleTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBfY2xlYXJPYnNlcnZl
ZE9iamVjdDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMub2JzZXJ2ZWRPYmplY3QpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxPYnNlcnZlci5yZW1vdmVPYnNlcnZlcih0aGlzLm9ic2VydmVk
T2JqZWN0LCB0aGlzLm9ic2VydmVkS2V5LCB0aGlzLCB0aGlzLm5vdGlmeSk7CisgICAgICAgIHRo
aXMub2JzZXJ2ZWRPYmplY3QgPSBudWxsOworICAgICAgICB0aGlzLm9ic2VydmVkS2V5ID0gbnVs
bDsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIHZhciBidWlsZFN0cmVhbSA9IGZ1bmN0aW9u
IGJ1aWxkU3RyZWFtKHBhcmFtcykgeworICAgIHZhciBvYmpSZWYgPSBwYXJhbXNbMF07CisgICAg
dmFyIHBhdGhSZWYgPSBwYXJhbXNbMV07CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
VGhlIGZpcnN0IGFyZ3VtZW50IHRvIHt7Z2V0fX0gbXVzdCBiZSBhIHN0cmVhbScsIF9lbWJlck1l
dGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9ialJlZikpOworICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCd7e2dldH19IHJlcXVpcmVzIGF0IGxlYXN0IHR3byBhcmd1bWVudHMnLCBwYXJhbXMu
bGVuZ3RoID4gMSk7CisKKyAgICB2YXIgc3RyZWFtID0gYnVpbGREeW5hbWljS2V5U3RyZWFtKG9i
alJlZiwgcGF0aFJlZik7CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9OworCisgIGZ1bmN0aW9u
IGJ1aWxkRHluYW1pY0tleVN0cmVhbShzb3VyY2UsIGtleVNvdXJjZSkgeworICAgIGlmICghX2Vt
YmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0oa2V5U291cmNlKSkgeworICAgICAgcmV0dXJu
IHNvdXJjZS5nZXQoa2V5U291cmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBE
eW5hbWljS2V5U3RyZWFtKHNvdXJjZSwga2V5U291cmNlKTsKKyAgICB9CisgIH0KKworICAvKioK
KyAgICBEeW5hbWljYWxseSBsb29rIHVwIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBUaGUgc2Vj
b25kIGFyZ3VtZW50IHRvIGB7e2dldH19YAorICAgIHNob3VsZCBoYXZlIGEgc3RyaW5nIHZhbHVl
LCBhbHRob3VnaCBpdCBjYW4gYmUgYm91bmQuCisgIAorICAgIEZvciBleGFtcGxlLCB0aGVzZSB0
d28gdXNhZ2VzIGFyZSBlcXVpdmlsZW50OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tw
ZXJzb24uaGVpZ2h0fX0KKyAgICB7e2dldCBwZXJzb24gImhlaWdodCJ9fQorICAgIGBgYAorICAK
KyAgICBJZiB0aGVyZSB3ZXJlIHNldmVyYWwgZmFjdHMgYWJvdXQgYSBwZXJzb24sIHRoZSBge3tn
ZXR9fWAgaGVscGVyIGNhbiBkeW5hbWljYWxseQorICAgIHBpY2sgb25lOgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3tnZXQgcGVyc29uIGZhY3ROYW1lfX0KKyAgICBgYGAKKyAgCisgICAg
Rm9yIGEgbW9yZSBjb21wbGV4IGV4YW1wbGUsIHRoaXMgdGVtcGxhdGUgd291bGQgYWxsb3cgdGhl
IHVzZXIgdG8gc3dpdGNoCisgICAgYmV0d2VlbiBzaG93aW5nIHRoZSB1c2VyJ3MgaGVpZ2h0IGFu
ZCB3ZWlnaHQgd2l0aCBhIGNsaWNrOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tnZXQg
cGVyc29uIGZhY3ROYW1lfX0KKyAgICA8YnV0dG9uIHt7YWN0aW9uIChtdXQgZmFjdE5hbWUpICJo
ZWlnaHQifX0+U2hvdyBoZWlnaHQ8L2J1dHRvbj4KKyAgICA8YnV0dG9uIHt7YWN0aW9uIChtdXQg
ZmFjdE5hbWUpICJ3ZWlnaHQifX0+U2hvdyB3ZWlnaHQ8L2J1dHRvbj4KKyAgICBgYGAKKyAgCisg
ICAgVGhlIGB7e2dldH19YCBoZWxwZXIgY2FuIGFsc28gcmVzcGVjdCBtdXRhYmxlIHZhbHVlcyBp
dHNlbGYuIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tpbnB1dCB2
YWx1ZT0obXV0IChnZXQgcGVyc29uIGZhY3ROYW1lKSkgdHlwZT0idGV4dCJ9fQorICAgIDxidXR0
b24ge3thY3Rpb24gKG11dCBmYWN0TmFtZSkgImhlaWdodCJ9fT5TaG93IGhlaWdodDwvYnV0dG9u
PgorICAgIDxidXR0b24ge3thY3Rpb24gKG11dCBmYWN0TmFtZSkgIndlaWdodCJ9fT5TaG93IHdl
aWdodDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBXb3VsZCBhbGxvdyB0aGUgdXNlciB0byBz
d2FwIHdoYXQgZmFjdCBpcyBiZWluZyBkaXNwbGF5ZWQsIGFuZCBhbHNvIGVkaXQKKyAgICB0aGF0
IGZhY3QgdmlhIGEgdHdvLXdheSBtdXRhYmxlIGJpbmRpbmcuCisgIAorICAgIEBwdWJsaWMKKyAg
ICBAbWV0aG9kIGdldAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMKKyAgICBAc2lu
Y2UgMi4xLjAKKyAgKi8KKyAgZnVuY3Rpb24gZ2V0S2V5d29yZChtb3JwaCwgZW52LCBzY29wZSwg
cGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGlmIChtb3Jw
aCA9PT0gbnVsbCkgeworICAgICAgcmV0dXJuIGJ1aWxkU3RyZWFtKHBhcmFtcyk7CisgICAgfSBl
bHNlIHsKKyAgICAgIHZhciBzdHJlYW0gPSB1bmRlZmluZWQ7CisgICAgICBpZiAobW9ycGgubGlu
a2VkUmVzdWx0KSB7CisgICAgICAgIHN0cmVhbSA9IG1vcnBoLmxpbmtlZFJlc3VsdDsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHN0cmVhbSA9IGJ1aWxkU3RyZWFtKHBhcmFtcyk7CisKKyAgICAg
ICAgX2VtYmVySHRtbGJhcnNVdGlsc1N1YnNjcmliZS5kZWZhdWx0KG1vcnBoLCBlbnYsIHNjb3Bl
LCBzdHJlYW0pOworICAgICAgICBlbnYuaG9va3MubGlua1JlbmRlck5vZGUobW9ycGgsIGVudiwg
c2NvcGUsIG51bGwsIHBhcmFtcywgaGFzaCk7CisKKyAgICAgICAgbW9ycGgubGlua2VkUmVzdWx0
ID0gc3RyZWFtOworICAgICAgfQorICAgICAgZW52Lmhvb2tzLnJhbmdlKG1vcnBoLCBlbnYsIHNj
b3BlLCBudWxsLCBzdHJlYW0sIHZpc2l0b3IpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZ2V0S2V5d29yZDsKK30pOworZW5pZmVkKCdlbWJl
ci1odG1sYmFycy9rZXl3b3Jkcy9pbnB1dCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1
ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFs
RGVidWcsIF9lbWJlck1ldGFsQXNzaWduKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBz
dWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBUaGUgYHt7aW5wdXR9fWAgaGVscGVyIGxldHMgeW91IGNyZWF0ZSBhbiBIVE1MIGA8aW5w
dXQgLz5gIGNvbXBvbmVudC4KKyAgICBJdCBjYXVzZXMgYW4gYEVtYmVyLlRleHRGaWVsZGAgY29t
cG9uZW50IHRvIGJlIHJlbmRlcmVkLiAgRm9yIG1vcmUgaW5mbywKKyAgICBzZWUgdGhlIFtFbWJl
ci5UZXh0RmllbGRdKC9hcGkvY2xhc3Nlcy9FbWJlci5UZXh0RmllbGQuaHRtbCkgZG9jcyBhbmQK
KyAgICB0aGUgW3RlbXBsYXRlcyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy90ZW1w
bGF0ZXMvaW5wdXQtaGVscGVycy8pLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tpbnB1
dCB2YWx1ZT0iOTg3In19CisgICAgYGBgCisgIAorICAgIHJlbmRlcnMgYXM6CisgIAorICAgIGBg
YEhUTUwKKyAgICA8aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Ijk4NyIgLz4KKyAgICBgYGAKKyAg
CisgICAgIyMjIFRleHQgZmllbGQKKyAgCisgICAgSWYgbm8gYHR5cGVgIG9wdGlvbiBpcyBzcGVj
aWZpZWQsIGEgZGVmYXVsdCBvZiB0eXBlICd0ZXh0JyBpcyB1c2VkLgorICAKKyAgICBNYW55IG9m
IHRoZSBzdGFuZGFyZCBIVE1MIGF0dHJpYnV0ZXMgbWF5IGJlIHBhc3NlZCB0byB0aGlzIGhlbHBl
ci4KKyAgCisgICAgPHRhYmxlPgorICAgICAgPHRyPjx0ZD5gcmVhZG9ubHlgPC90ZD48dGQ+YHJl
cXVpcmVkYDwvdGQ+PHRkPmBhdXRvZm9jdXNgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD5gdmFs
dWVgPC90ZD48dGQ+YHBsYWNlaG9sZGVyYDwvdGQ+PHRkPmBkaXNhYmxlZGA8L3RkPjwvdHI+Cisg
ICAgICA8dHI+PHRkPmBzaXplYDwvdGQ+PHRkPmB0YWJpbmRleGA8L3RkPjx0ZD5gbWF4bGVuZ3Ro
YDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YG5hbWVgPC90ZD48dGQ+YG1pbmA8L3RkPjx0ZD5g
bWF4YDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YHBhdHRlcm5gPC90ZD48dGQ+YGFjY2VwdGA8
L3RkPjx0ZD5gYXV0b2NvbXBsZXRlYDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+YGF1dG9zYXZl
YDwvdGQ+PHRkPmBmb3JtYWN0aW9uYDwvdGQ+PHRkPmBmb3JtZW5jdHlwZWA8L3RkPjwvdHI+Cisg
ICAgICA8dHI+PHRkPmBmb3JtbWV0aG9kYDwvdGQ+PHRkPmBmb3Jtbm92YWxpZGF0ZWA8L3RkPjx0
ZD5gZm9ybXRhcmdldGA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPmBoZWlnaHRgPC90ZD48dGQ+
YGlucHV0bW9kZWA8L3RkPjx0ZD5gbXVsdGlwbGVgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD5g
c3RlcGA8L3RkPjx0ZD5gd2lkdGhgPC90ZD48dGQ+YGZvcm1gPC90ZD48L3RyPgorICAgICAgPHRy
Pjx0ZD5gc2VsZWN0aW9uRGlyZWN0aW9uYDwvdGQ+PHRkPmBzcGVsbGNoZWNrYDwvdGQ+PHRkPiZu
YnNwOzwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAKKyAgCisgICAgV2hlbiBzZXQgdG8gYSBx
dW90ZWQgc3RyaW5nLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBkaXJlY3RseSBhcHBsaWVkIHRvIHRo
ZSBIVE1MCisgICAgZWxlbWVudC4gV2hlbiBsZWZ0IHVucXVvdGVkLCB0aGVzZSB2YWx1ZXMgd2ls
bCBiZSBib3VuZCB0byBhIHByb3BlcnR5IG9uIHRoZQorICAgIHRlbXBsYXRlJ3MgY3VycmVudCBy
ZW5kZXJpbmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4K
KyAgCisgIAorICAgIEEgdmVyeSBjb21tb24gdXNlIG9mIHRoaXMgaGVscGVyIGlzIHRvIGJpbmQg
dGhlIGB2YWx1ZWAgb2YgYW4gaW5wdXQgdG8gYW4gT2JqZWN0J3MgYXR0cmlidXRlOgorICAKKyAg
ICBgYGBoYW5kbGViYXJzCisgICAgU2VhcmNoOgorICAgIHt7aW5wdXQgdmFsdWU9c2VhcmNoV29y
ZH19CisgICAgYGBgCisgIAorICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGluaXRhbCB2YWx1ZSBp
biB0aGUgYDxpbnB1dCAvPmAgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIGBzZWFyY2hXb3Jk
YC4KKyAgICBJZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB0ZXh0LCB0aGUgdmFsdWUgb2YgYHNlYXJj
aFdvcmRgIHdpbGwgYWxzbyBiZSB1cGRhdGVkLgorICAKKyAgICAjIyMgQWN0aW9ucworICAgIFRo
ZSBoZWxwZXIgY2FuIHNlbmQgbXVsdGlwbGUgYWN0aW9ucyBiYXNlZCBvbiB1c2VyIGV2ZW50cy4K
KyAgICBUaGUgYWN0aW9uIHByb3BlcnR5IGRlZmluZXMgdGhlIGFjdGlvbiB3aGljaCBpcyBzZW50
IHdoZW4KKyAgICB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3tpbnB1dCBhY3Rpb249InN1Ym1pdCJ9fQorICAgIGBgYAorICAKKyAg
ICBUaGUgaGVscGVyIGFsbG93cyBzb21lIHVzZXIgZXZlbnRzIHRvIHNlbmQgYWN0aW9ucy4KKyAg
CisgICAgKiBgZW50ZXJgCisgICAgKiBgaW5zZXJ0LW5ld2xpbmVgCisgICAgKiBgZXNjYXBlLXBy
ZXNzYAorICAgICogYGZvY3VzLWluYAorICAgICogYGZvY3VzLW91dGAKKyAgICAqIGBrZXktcHJl
c3NgCisgICAgKiBga2V5LXVwYAorICAKKyAgCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkZXNp
cmUgYW4gYWN0aW9uIHRvIGJlIHNlbnQgd2hlbiB0aGUgaW5wdXQgaXMgYmx1cnJlZCwKKyAgICB5
b3Ugb25seSBuZWVkIHRvIHNldHVwIHRoZSBhY3Rpb24gbmFtZSB0byB0aGUgZXZlbnQgbmFtZSBw
cm9wZXJ0eS4KKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7aW5wdXQgZm9jdXMtb3V0PSJh
bGVydE1lc3NhZ2UifX0KKyAgICBgYGAKKyAgCisgICAgU2VlIG1vcmUgYWJvdXQgW1RleHQgU3Vw
cG9ydCBBY3Rpb25zXSgvYXBpL2NsYXNzZXMvRW1iZXIuVGV4dEZpZWxkLmh0bWwpCisgIAorICAK
KyAgICAjIyMgRXh0ZW5kaW5nIGBFbWJlci5UZXh0RmllbGRgCisgIAorICAgIEludGVybmFsbHks
IGB7e2lucHV0IHR5cGU9InRleHQifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRl
eHRGaWVsZGAsIHBhc3NpbmcKKyAgICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJl
ci5UZXh0RmllbGRgJ3MgYGNyZWF0ZWAgbWV0aG9kLiBZb3UgY2FuIGV4dGVuZCB0aGUKKyAgICBj
YXBhYmlsaXRpZXMgb2YgdGV4dCBpbnB1dHMgaW4geW91ciBhcHBsaWNhdGlvbnMgYnkgcmVvcGVu
aW5nIHRoaXMgY2xhc3MuIEZvciBleGFtcGxlLAorICAgIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBC
b290c3RyYXAgcHJvamVjdCB3aGVyZSBgZGF0YS0qYCBhdHRyaWJ1dGVzIGFyZSB1c2VkLCB5b3UK
KyAgICBjYW4gYWRkIG9uZSB0byB0aGUgYFRleHRGaWVsZGAncyBgYXR0cmlidXRlQmluZGluZ3Ng
IHByb3BlcnR5OgorICAKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLlRleHRGaWVs
ZC5yZW9wZW4oeworICAgICAgYXR0cmlidXRlQmluZGluZ3M6IFsnZGF0YS1lcnJvciddCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIEtlZXAgaW4gbWluZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRl
eHRGaWVsZGAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0RmllbGRgCisgICAgaXRzZWxmIGV4
dGVuZHMgYEVtYmVyLkNvbXBvbmVudGAuIEV4cGVjdCBpc29sYXRlZCBjb21wb25lbnQgc2VtYW50
aWNzLCBub3QKKyAgICBsZWdhY3kgMS54IHZpZXcgc2VtYW50aWNzIChsaWtlIGBjb250cm9sbGVy
YCBiZWluZyBwcmVzZW50KS4KKyAgCisgICAgU2VlIG1vcmUgYWJvdXQgW0VtYmVyIGNvbXBvbmVu
dHNdKC9hcGkvY2xhc3Nlcy9FbWJlci5Db21wb25lbnQuaHRtbCkKKyAgCisgIAorICAgICMjIyBD
aGVja2JveAorICAKKyAgICBDaGVja2JveGVzIGFyZSBzcGVjaWFsIGZvcm1zIG9mIHRoZSBge3tp
bnB1dH19YCBoZWxwZXIuICBUbyBjcmVhdGUgYSBgPGNoZWNrYm94IC8+YDoKKyAgCisgICAgYGBg
aGFuZGxlYmFycworICAgIEVtYmVyaXplIEV2ZXJ5dGhpbmc6CisgICAge3tpbnB1dCB0eXBlPSJj
aGVja2JveCIgbmFtZT0iaXNFbWJlcml6ZWQiIGNoZWNrZWQ9aXNFbWJlcml6ZWR9fQorICAgIGBg
YAorICAKKyAgICBUaGlzIHdpbGwgYmluZCBjaGVja2VkIHN0YXRlIG9mIHRoaXMgY2hlY2tib3gg
dG8gdGhlIHZhbHVlIG9mIGBpc0VtYmVyaXplZGAgIC0tIGlmIGVpdGhlciBvbmUgY2hhbmdlcywK
KyAgICBpdCB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgb3RoZXIuCisgIAorICAKKyAgICBUaGUg
Zm9sbG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0aGUgaGVscGVyOgorICAK
KyAgICAqIGBjaGVja2VkYAorICAgICogYGRpc2FibGVkYAorICAgICogYHRhYmluZGV4YAorICAg
ICogYGluZGV0ZXJtaW5hdGVgCisgICAgKiBgbmFtZWAKKyAgICAqIGBhdXRvZm9jdXNgCisgICAg
KiBgZm9ybWAKKyAgCisgIAorICAgICMjIyBFeHRlbmRpbmcgYEVtYmVyLkNoZWNrYm94YAorICAK
KyAgICBJbnRlcm5hbGx5LCBge3tpbnB1dCB0eXBlPSJjaGVja2JveCJ9fWAgY3JlYXRlcyBhbiBp
bnN0YW5jZSBvZiBgRW1iZXIuQ2hlY2tib3hgLCBwYXNzaW5nCisgICAgYXJndW1lbnRzIGZyb20g
dGhlIGhlbHBlciB0byBgRW1iZXIuQ2hlY2tib3hgJ3MgYGNyZWF0ZWAgbWV0aG9kLiBZb3UgY2Fu
IGV4dGVuZCB0aGUKKyAgICBjYXBhYmxpbHRpZXMgb2YgY2hlY2tib3ggaW5wdXRzIGluIHlvdXIg
YXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0aGlzIGNsYXNzLiBGb3IgZXhhbXBsZSwKKyAgICBp
ZiB5b3Ugd2FudGVkIHRvIGFkZCBhIGNzcyBjbGFzcyB0byBhbGwgY2hlY2tib3hlcyBpbiB5b3Vy
IGFwcGxpY2F0aW9uOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuQ2hlY2tib3gu
cmVvcGVuKHsKKyAgICAgIGNsYXNzTmFtZXM6IFsnbXktYXBwLWNoZWNrYm94J10KKyAgICB9KTsK
KyAgICBgYGAKKyAgCisgIAorICAgIEBtZXRob2QgaW5wdXQKKyAgICBAZm9yIEVtYmVyLlRlbXBs
YXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgc2V0dXBTdGF0ZTogZnVuY3Rpb24gKGxhc3RT
dGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgdHlwZSA9IGVudi5o
b29rcy5nZXRWYWx1ZShoYXNoLnR5cGUpOworICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21w
b25lbnROYW1lTWFwW3R5cGVdIHx8IGRlZmF1bHRDb21wb25lbnROYW1lOworCisgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgne3tpbnB1dCB0eXBlPVwnY2hlY2tib3hcJ319IGRvZXMgbm90
IHN1cHBvcnQgc2V0dGluZyBgdmFsdWU9c29tZUJvb2xlYW5WYWx1ZWA7ICcgKyAneW91IG11c3Qg
dXNlIGBjaGVja2VkPXNvbWVCb29sZWFuVmFsdWVgIGluc3RlYWQuJywgISh0eXBlID09PSAnY2hl
Y2tib3gnICYmIGhhc2guaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpKTsKKworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoe30sIGxhc3RTdGF0ZSwgeyBjb21wb25lbnROYW1l
OiBjb21wb25lbnROYW1lIH0pOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikg
eworICAgICAgZW52Lmhvb2tzLmNvbXBvbmVudChtb3JwaCwgZW52LCBzY29wZSwgbW9ycGguZ2V0
U3RhdGUoKS5jb21wb25lbnROYW1lLCBwYXJhbXMsIGhhc2gsIHsgZGVmYXVsdDogdGVtcGxhdGUs
IGludmVyc2U6IGludmVyc2UgfSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIHJlcmVuZGVyOiBm
dW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
ICAgIH0KKyAgfTsKKworICB2YXIgZGVmYXVsdENvbXBvbmVudE5hbWUgPSAnLXRleHQtZmllbGQn
OworCisgIHZhciBjb21wb25lbnROYW1lTWFwID0geworICAgICdjaGVja2JveCc6ICctY2hlY2ti
b3gnCisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvbXV0JywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJl
ci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVh
bScsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLXZpZXdzL2NvbXBhdC9hdHRy
cy1wcm94eScsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdvcmRzL2Nsb3N1cmUtYWN0aW9u
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFN5bWJv
bCwgX2VtYmVyTWV0YWxTdHJlYW1zUHJveHlTdHJlYW0sIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVh
bSwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eSwg
X2VtYmVyUm91dGluZ0h0bWxiYXJzS2V5d29yZHNDbG9zdXJlQWN0aW9uKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBfUHJveHlTdHJlYW0kZXh0ZW5kOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IG11dDsKKyAgZXhwb3J0cy5wcml2YXRlTXV0ID0gcHJpdmF0ZU11dDsKKyAgdmFyIE1V
VEFCTEVfUkVGRVJFTkNFID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnTVVUQUJMRV9SRUZF
UkVOQ0UnKTsKKworICBleHBvcnRzLk1VVEFCTEVfUkVGRVJFTkNFID0gTVVUQUJMRV9SRUZFUkVO
Q0U7CisgIHZhciBNdXRTdHJlYW0gPSBfZW1iZXJNZXRhbFN0cmVhbXNQcm94eVN0cmVhbS5kZWZh
dWx0LmV4dGVuZCgoX1Byb3h5U3RyZWFtJGV4dGVuZCA9IHsKKyAgICBpbml0OiBmdW5jdGlvbiAo
c3RyZWFtKSB7CisgICAgICB0aGlzLmxhYmVsID0gJyhtdXQgJyArIHN0cmVhbS5sYWJlbCArICcp
JzsKKyAgICAgIHRoaXMucGF0aCA9IHN0cmVhbS5wYXRoOworICAgICAgdGhpcy5zb3VyY2VEZXAg
PSB0aGlzLmFkZE11dGFibGVEZXBlbmRlbmN5KHN0cmVhbSk7CisgICAgICB0aGlzW01VVEFCTEVf
UkVGRVJFTkNFXSA9IHRydWU7CisgICAgfSwKKworICAgIGNlbGw6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHZhciBzb3VyY2UgPSB0aGlzOworICAgICAgdmFyIHZhbHVlID0gc291cmNlLnZhbHVlKCk7
CisKKyAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVtfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jk
c0Nsb3N1cmVBY3Rpb24uQUNUSU9OXSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9
CisKKyAgICAgIHZhciB2YWwgPSB7CisgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgdXBk
YXRlOiBmdW5jdGlvbiAodmFsKSB7CisgICAgICAgICAgc291cmNlLnNldFZhbHVlKHZhbCk7Cisg
ICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHZhbFtfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJv
eHkuTVVUQUJMRV9DRUxMXSA9IHRydWU7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgfSwg
X1Byb3h5U3RyZWFtJGV4dGVuZFtfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVB
Y3Rpb24uSU5WT0tFXSA9IGZ1bmN0aW9uICh2YWwpIHsKKyAgICB0aGlzLnNldFZhbHVlKHZhbCk7
CisgIH0sIF9Qcm94eVN0cmVhbSRleHRlbmQpKTsKKworICAvKioKKyAgICBUaGUgYG11dGAgaGVs
cGVyIGxldHMgeW91IF9fY2xlYXJseSBzcGVjaWZ5X18gdGhhdCBhIGNoaWxkIGBDb21wb25lbnRg
IGNhbiB1cGRhdGUgdGhlCisgICAgKG11dGFibGUpIHZhbHVlIHBhc3NlZCB0byBpdCwgd2hpY2gg
d2lsbCBfX2NoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBjb21wb25lbnRfXy4KKyAgCisg
ICAgVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yIHBhc3NpbmcgbXV0YWJsZSB2YWx1ZXMgdG8gYSBg
Q29tcG9uZW50YCBvZiBhbnkgc2l6ZSwgYnV0CisgICAgY3JpdGljYWwgdG8gdW5kZXJzdGFuZGlu
ZyB0aGUgbG9naWMgb2YgYSBsYXJnZS9jb21wbGV4IGBDb21wb25lbnRgLgorICAKKyAgICBUbyBz
cGVjaWZ5IHRoYXQgYSBwYXJhbWV0ZXIgaXMgbXV0YWJsZSwgd2hlbiBpbnZva2luZyB0aGUgY2hp
bGQgYENvbXBvbmVudGA6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e215LWNoaWxkIGNo
aWxkQ2xpY2tDb3VudD0obXV0IHRvdGFsQ2xpY2tzKX19CisgICAgYGBgCisgIAorICAgIFRoZSBj
aGlsZCBgQ29tcG9uZW50YCBjYW4gdGhlbiBtb2RpZnkgdGhlIHBhcmVudCdzIHZhbHVlIGFzIG5l
ZWRlZDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIG15LWNoaWxkLmpzCisgICAgZXhw
b3J0IGRlZmF1bHQgQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBjbGljaygpIHsKKyAgICAgICAg
dGhpcy5nZXQoJ2NoaWxkQ2xpY2tDb3VudCcpLnVwZGF0ZSh0aGlzLmdldCgnY2hpbGRDbGlja0Nv
dW50JykudmFsdWUgKyAxKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQWRk
aXRpb25hbGx5LCB0aGUgYG11dGAgaGVscGVyIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBgYWN0
aW9uYCBoZWxwZXIgdG8KKyAgICBtdXRhdGUgYSB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgIAorICAg
IGBgYGhhbmRsZWJhcnMKKyAgICB7e215LWNoaWxkIGNoaWxkQ2xpY2tDb3VudD10b3RhbENsaWNr
cyBjbGljay1jb3VudC1jaGFuZ2U9KGFjdGlvbiAobXV0IHRvdGFsQ2xpY2tzKSl9fQorICAgIGBg
YAorICAKKyAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgd291bGQgaW52b2tlIHRoZSBhY3Rpb24g
d2l0aCB0aGUgbmV3IGNsaWNrIHZhbHVlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8g
bXktY2hpbGQuanMKKyAgICBleHBvcnQgZGVmYXVsdCBDb21wb25lbnQuZXh0ZW5kKHsKKyAgICAg
IGNsaWNrKCkgeworICAgICAgICB0aGlzLmdldCgnY2xpY2tDb3VudENoYW5nZScpKHRoaXMuZ2V0
KCdjaGlsZENsaWNrQ291bnQnKSArIDEpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBUaGUgYG11dGAgaGVscGVyIGNoYW5nZXMgdGhlIGB0b3RhbENsaWNrc2AgdmFsdWUgdG8g
d2hhdCB3YXMgcHJvdmlkZWQgYXMgdGhlIGFjdGlvbiBhcmd1bWVudC4KKyAgCisgICAgU2VlIGEg
WzIuMCBibG9nIHBvc3RdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ibG9nLzIwMTUvMDUvMTAvcnVuLXVw
LXRvLXR3by1vaC5odG1sI3RvY190aGUtY29kZS1tdXQtY29kZS1oZWxwZXIpIGZvcgorICAgIGFk
ZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdXNpbmcgYHt7bXV0fX1gLgorICAKKyAgICBAcHVibGlj
CisgICAgQG1ldGhvZCBtdXQKKyAgICBAcGFyYW0ge09iamVjdH0gW2F0dHJdIHRoZSAidHdvLXdh
eSIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIG1vZGlmaWVkLgorICAgIEBmb3IgRW1iZXIuVGVtcGxh
dGVzLmhlbHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbXV0KG1vcnBoLCBl
bnYsIHNjb3BlLCBvcmlnaW5hbFBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UpIHsKKyAg
ICAvLyBJZiBgbW9ycGhgIGlzIGBudWxsYCB0aGUga2V5d29yZCBpcyBiZWluZyBpbnZva2VkIGFz
IGEgc3ViZXhwcmVzc2lvbi4KKyAgICBpZiAobW9ycGggPT09IG51bGwpIHsKKyAgICAgIHZhciB2
YWx1ZVN0cmVhbSA9IG9yaWdpbmFsUGFyYW1zWzBdOworICAgICAgcmV0dXJuIG11dFBhcmFtKGVu
di5ob29rcy5nZXRWYWx1ZSwgdmFsdWVTdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiB0cnVl
OworICB9CisKKyAgZnVuY3Rpb24gcHJpdmF0ZU11dChtb3JwaCwgZW52LCBzY29wZSwgb3JpZ2lu
YWxQYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlKSB7CisgICAgLy8gSWYgYG1vcnBoYCBp
cyBgbnVsbGAgdGhlIGtleXdvcmQgaXMgYmVpbmcgaW52b2tlZCBhcyBhIHN1YmV4cHJlc3Npb24u
CisgICAgaWYgKG1vcnBoID09PSBudWxsKSB7CisgICAgICB2YXIgdmFsdWVTdHJlYW0gPSBvcmln
aW5hbFBhcmFtc1swXTsKKyAgICAgIHJldHVybiBtdXRQYXJhbShlbnYuaG9va3MuZ2V0VmFsdWUs
IHZhbHVlU3RyZWFtLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisg
IHZhciBMaXRlcmFsU3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0
ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAobGl0ZXJhbCkgeworICAgICAgdGhpcy5saXRlcmFs
ID0gbGl0ZXJhbDsKKyAgICAgIHRoaXMubGFiZWwgPSAnKGxpdGVyYWwgJyArIGxpdGVyYWwgKyAn
KSc7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0
aGlzLmxpdGVyYWw7CisgICAgfSwKKworICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsKSB7Cisg
ICAgICB0aGlzLmxpdGVyYWwgPSB2YWw7CisgICAgICB0aGlzLm5vdGlmeSgpOworICAgIH0KKyAg
fSk7CisKKyAgZnVuY3Rpb24gbXV0UGFyYW0ocmVhZCwgc3RyZWFtLCBpbnRlcm5hbCkgeworICAg
IGlmIChpbnRlcm5hbCkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0
cmVhbShzdHJlYW0pKSB7CisgICAgICAgIHZhciBsaXRlcmFsID0gc3RyZWFtOworICAgICAgICBz
dHJlYW0gPSBuZXcgTGl0ZXJhbFN0cmVhbShsaXRlcmFsKTsKKyAgICAgIH0KKyAgICB9IGVsc2Ug
eworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW4gb25seSBwYXNzIGEgcGF0
aCB0byBtdXQnLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShzdHJlYW0pKTsKKyAg
ICB9CisKKyAgICBpZiAoc3RyZWFtW01VVEFCTEVfUkVGRVJFTkNFXSkgeworICAgICAgcmV0dXJu
IHN0cmVhbTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE11dFN0cmVhbShzdHJlYW0pOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvb3V0bGV0JywgWydleHBvcnRz
JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJl
ci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL3ZpZXctbm9kZS1tYW5hZ2VyJywgJ2VtYmVyLWh0bWxi
YXJzL3RlbXBsYXRlcy90b3AtbGV2ZWwtdmlldycsICdlbWJlci1tZXRhbC9mZWF0dXJlcyddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQsIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzVmlld05vZGVNYW5hZ2VyLCBfZW1iZXJIdG1s
YmFyc1RlbXBsYXRlc1RvcExldmVsVmlldywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldy5k
ZWZhdWx0Lm1ldGEucmV2aXNpb24gPSAnRW1iZXJAMi42LjInOworCisgIC8qKgorICAgIFRoZSBg
e3tvdXRsZXR9fWAgaGVscGVyIGxldHMgeW91IHNwZWNpZnkgd2hlcmUgYSBjaGlsZCByb3V0ZSB3
aWxsIHJlbmRlciBpbgorICAgIHlvdXIgdGVtcGxhdGUuIEFuIGltcG9ydGFudCB1c2Ugb2YgdGhl
IGB7e291dGxldH19YCBoZWxwZXIgaXMgaW4geW91cgorICAgIGFwcGxpY2F0aW9uJ3MgYGFwcGxp
Y2F0aW9uLmhic2AgZmlsZToKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBhcHAvdGVt
cGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAKKyAgICA8IS0tIGhlYWRlciBjb250ZW50IGdv
ZXMgaGVyZSwgYW5kIHdpbGwgYWx3YXlzIGRpc3BsYXkgLS0+CisgICAge3tteS1oZWFkZXJ9fQor
ICAKKyAgICA8ZGl2IGNsYXNzPSJteS1keW5hbWljLWNvbnRlbnQiPgorICAgICAgPCEtLSB0aGlz
IGNvbnRlbnQgd2lsbCBjaGFuZ2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgcm91dGUsIHdoaWNoIGRl
cGVuZHMgb24gdGhlIGN1cnJlbnQgVVJMIC0tPgorICAgICAge3tvdXRsZXR9fQorICAgIDwvZGl2
PgorICAKKyAgICA8IS0tIGZvb3RlciBjb250ZW50IGdvZXMgaGVyZSwgYW5kIHdpbGwgYWx3YXlz
IGRpc3BsYXkgLS0+CisgICAge3tteS1mb290ZXJ9fQorICAgIGBgYAorICAKKyAgICBTZWUgW3Rl
bXBsYXRlcyBndWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy90ZW1wbGF0ZXMvdGhlLWFw
cGxpY2F0aW9uLXRlbXBsYXRlLykgZm9yCisgICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB1
c2luZyBge3tvdXRsZXR9fWAgaW4gYGFwcGxpY2F0aW9uLmhic2AuCisgIAorICAgIFlvdSBtYXkg
YWxzbyBzcGVjaWZ5IGEgbmFtZSBmb3IgdGhlIGB7e291dGxldH19YCwgd2hpY2ggaXMgdXNlZnVs
IHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZQorICAgIGB7e291dGxldH19YCBpbiBhIHRlbXBsYXRl
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3tvdXRsZXQgIm1lbnUifX0KKyAgICB7e291
dGxldCAic2lkZWJhciJ9fQorICAgIHt7b3V0bGV0ICJtYWluIn19CisgICAgYGBgCisgIAorICAg
IFlvdXIgcm91dGVzIGNhbiB0aGVuIHJlbmRlciBpbnRvIGEgc3BlY2lmaWMgb25lIG9mIHRoZXNl
IGBvdXRsZXRgcyBieSBzcGVjaWZ5aW5nIHRoZSBgb3V0bGV0YAorICAgIGF0dHJpYnV0ZSBpbiB5
b3VyIGByZW5kZXJUZW1wbGF0ZWAgZnVuY3Rpb246CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAvLyBhcHAvcm91dGVzL21lbnUuanMKKyAgCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgIHJlbmRlclRlbXBsYXRlKCkgeworICAgICAgICB0aGlzLnJlbmRl
cih7IG91dGxldDogJ21lbnUnIH0pOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBTZWUgdGhlIFtyb3V0aW5nIGd1aWRlXShodHRwOi8vZW1iZXJqcy5jb20vZ3VpZGVzL3JvdXRp
bmcvcmVuZGVyaW5nLWEtdGVtcGxhdGUvKSBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIG9uIGhv
dyB5b3VyIGByb3V0ZWAgaW50ZXJhY3RzIHdpdGggdGhlIGB7e291dGxldH19YCBoZWxwZXIuCisg
IAorICAgIE5vdGU6IFlvdXIgY29udGVudCBfX3dpbGwgbm90IHJlbmRlcl9fIGlmIHRoZXJlIGlz
bid0IGFuIGB7e291dGxldH19YCBmb3IgaXQuCisgIAorICAgIEBwdWJsaWMKKyAgICBAbWV0aG9k
IG91dGxldAorICAgIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0KKyAgICBAZm9yIEVtYmVyLlRlbXBs
YXRlcy5oZWxwZXJzCisgICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQgPSB7Cisg
ICAgd2lsbFJlbmRlcjogZnVuY3Rpb24gKHJlbmRlck5vZGUsIGVudikgeworICAgICAgZW52LnZp
ZXcub3duZXJWaWV3Ll9vdXRsZXRzLnB1c2gocmVuZGVyTm9kZSk7CisgICAgfSwKKworICAgIHNl
dHVwU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7Cisg
ICAgICB2YXIgb3V0bGV0U3RhdGUgPSBlbnYub3V0bGV0U3RhdGU7CisgICAgICB2YXIgcmVhZCA9
IGVudi5ob29rcy5nZXRWYWx1ZTsKKyAgICAgIHZhciBvdXRsZXROYW1lID0gcmVhZChwYXJhbXNb
MF0pIHx8ICdtYWluJzsKKyAgICAgIHZhciBzZWxlY3RlZE91dGxldFN0YXRlID0gb3V0bGV0U3Rh
dGVbb3V0bGV0TmFtZV07CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIG91dGxldFN0YXRlOiBz
ZWxlY3RlZE91dGxldFN0YXRlLAorICAgICAgICBoYXNQYXJlbnRPdXRsZXQ6IGVudi5oYXNQYXJl
bnRPdXRsZXQsCisgICAgICAgIG1hbmFnZXI6IHN0YXRlLm1hbmFnZXIKKyAgICAgIH07CisgICAg
fSwKKworICAgIGNoaWxkRW52OiBmdW5jdGlvbiAoc3RhdGUsIGVudikgeworICAgICAgdmFyIG91
dGxldFN0YXRlID0gc3RhdGUub3V0bGV0U3RhdGU7CisgICAgICB2YXIgdG9SZW5kZXIgPSBvdXRs
ZXRTdGF0ZSAmJiBvdXRsZXRTdGF0ZS5yZW5kZXI7CisgICAgICB2YXIgbWV0YSA9IHRvUmVuZGVy
ICYmIHRvUmVuZGVyLnRlbXBsYXRlICYmIHRvUmVuZGVyLnRlbXBsYXRlLm1ldGE7CisKKyAgICAg
IHJldHVybiBlbnYuY2hpbGRXaXRoT3V0bGV0U3RhdGUob3V0bGV0U3RhdGUgJiYgb3V0bGV0U3Rh
dGUub3V0bGV0cywgdHJ1ZSwgbWV0YSk7CisgICAgfSwKKworICAgIGlzU3RhYmxlOiBmdW5jdGlv
biAobGFzdFN0YXRlLCBuZXh0U3RhdGUpIHsKKyAgICAgIHJldHVybiBpc1N0YWJsZShsYXN0U3Rh
dGUub3V0bGV0U3RhdGUsIG5leHRTdGF0ZS5vdXRsZXRTdGF0ZSk7CisgICAgfSwKKworICAgIGlz
RW1wdHk6IGZ1bmN0aW9uIChzdGF0ZSkgeworICAgICAgcmV0dXJuIGlzRW1wdHkoc3RhdGUub3V0
bGV0U3RhdGUpOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJOb2RlLCBl
bnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7Cisg
ICAgICB2YXIgc3RhdGUgPSByZW5kZXJOb2RlLmdldFN0YXRlKCk7CisgICAgICB2YXIgcGFyZW50
VmlldyA9IGVudi52aWV3OworICAgICAgdmFyIG91dGxldFN0YXRlID0gc3RhdGUub3V0bGV0U3Rh
dGU7CisgICAgICB2YXIgdG9SZW5kZXIgPSBvdXRsZXRTdGF0ZS5yZW5kZXI7CisgICAgICB2YXIg
bmFtZXNwYWNlID0gZW52Lm93bmVyLmxvb2t1cCgnYXBwbGljYXRpb246bWFpbicpOworICAgICAg
dmFyIExPR19WSUVXX0xPT0tVUFMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobmFtZXNw
YWNlLCAnTE9HX1ZJRVdfTE9PS1VQUycpOworCisgICAgICB2YXIgVmlld0NsYXNzID0gb3V0bGV0
U3RhdGUucmVuZGVyLlZpZXdDbGFzczsKKworICAgICAgaWYgKCFzdGF0ZS5oYXNQYXJlbnRPdXRs
ZXQgJiYgIVZpZXdDbGFzcykgeworICAgICAgICBWaWV3Q2xhc3MgPSBlbnYub3duZXIuX2xvb2t1
cEZhY3RvcnkoJ3ZpZXc6dG9wbGV2ZWwnKTsKKyAgICAgIH0KKworICAgICAgdmFyIENvbXBvbmVu
dDsKKworICAgICAgdmFyIG9wdGlvbnM7CisgICAgICB2YXIgYXR0cnMgPSB7fTsKKyAgICAgIGlm
IChDb21wb25lbnQpIHsKKyAgICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICBjb21wb25lbnQ6
IENvbXBvbmVudAorICAgICAgICB9OworICAgICAgICBhdHRycyA9IHRvUmVuZGVyLmF0dHJzOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICBjb21wb25lbnQ6
IFZpZXdDbGFzcywKKyAgICAgICAgICBzZWxmOiB0b1JlbmRlci5jb250cm9sbGVyLAorICAgICAg
ICAgIGNyZWF0ZU9wdGlvbnM6IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXI6IHRvUmVuZGVyLmNv
bnRyb2xsZXIKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGUgPSB0
ZW1wbGF0ZSB8fCB0b1JlbmRlci50ZW1wbGF0ZSAmJiB0b1JlbmRlci50ZW1wbGF0ZS5yYXc7CisK
KyAgICAgICAgaWYgKExPR19WSUVXX0xPT0tVUFMgJiYgVmlld0NsYXNzKSB7CisgICAgICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5pbmZvKCdSZW5kZXJpbmcgJyArIHRvUmVuZGVyLm5hbWUgKyAnIHdp
dGggJyArIFZpZXdDbGFzcywgeyBmdWxsTmFtZTogJ3ZpZXc6JyArIHRvUmVuZGVyLm5hbWUgfSk7
CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlLm1hbmFnZXIpIHsKKyAgICAg
ICAgc3RhdGUubWFuYWdlci5kZXN0cm95KCk7CisgICAgICAgIHN0YXRlLm1hbmFnZXIgPSBudWxs
OworICAgICAgfQorCisgICAgICB2YXIgbm9kZU1hbmFnZXIgPSBfZW1iZXJIdG1sYmFyc05vZGVN
YW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlci5kZWZhdWx0LmNyZWF0ZShyZW5kZXJOb2RlLCBlbnYsIGF0
dHJzLCBvcHRpb25zLCBwYXJlbnRWaWV3LCBudWxsLCBudWxsLCB0ZW1wbGF0ZSk7CisgICAgICBz
dGF0ZS5tYW5hZ2VyID0gbm9kZU1hbmFnZXI7CisKKyAgICAgIG5vZGVNYW5hZ2VyLnJlbmRlcihl
bnYsIGhhc2gsIHZpc2l0b3IpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBpc0VtcHR5KG91
dGxldFN0YXRlKSB7CisgICAgcmV0dXJuICFvdXRsZXRTdGF0ZSB8fCAhb3V0bGV0U3RhdGUucmVu
ZGVyLlZpZXdDbGFzcyAmJiAhb3V0bGV0U3RhdGUucmVuZGVyLnRlbXBsYXRlOworICB9CisKKyAg
ZnVuY3Rpb24gaXNTdGFibGUoYSwgYikgeworICAgIGlmICghYSAmJiAhYikgeworICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIGlmICghYSB8fCAhYikgeworICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBhID0gYS5yZW5kZXI7CisgICAgYiA9IGIucmVuZGVyOworICAgIGZvciAo
dmFyIGtleSBpbiBhKSB7CisgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAg
ICAgIC8vIE5hbWUgaXMgb25seSBoZXJlIGZvciBsb2dnaW5nICYgZGVidWdnaW5nLiBJZiB0d28g
ZGlmZmVyZW50CisgICAgICAgIC8vIG5hbWVzIHJlc3VsdCBpbiBvdGhlcndpc2UgaWRlbnRpY2Fs
IHN0YXRlcywgdGhleSdyZSBzdGlsbAorICAgICAgICAvLyBpZGVudGljYWwuCisgICAgICAgIGlm
IChhW2tleV0gIT09IGJba2V5XSAmJiBrZXkgIT09ICduYW1lJykgeworICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3BhcnRpYWwnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItdmlld3Mvc3lzdGVtL2xvb2t1cF9wYXJ0aWFsJywgJ2h0bWxiYXJzLXJ1bnRp
bWUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzU3lzdGVtTG9va3VwX3BhcnRpYWws
IF9odG1sYmFyc1J1bnRpbWUpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
VGhlIGBwYXJ0aWFsYCBoZWxwZXIgcmVuZGVycyBhbm90aGVyIHRlbXBsYXRlIHdpdGhvdXQKKyAg
ICBjaGFuZ2luZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7Zm9vfX0KKyAgICB7e3BhcnRpYWwgIm5hdiJ9fQorICAgIGBgYAorICAKKyAgICBUaGUg
YWJvdmUgZXhhbXBsZSB0ZW1wbGF0ZSB3aWxsIHJlbmRlciBhIHRlbXBsYXRlIG5hbWVkCisgICAg
Il9uYXYiLCB3aGljaCBoYXMgdGhlIHNhbWUgY29udGV4dCBhcyB0aGUgcGFyZW50IHRlbXBsYXRl
CisgICAgaXQncyByZW5kZXJlZCBpbnRvLCBzbyBpZiB0aGUgIl9uYXYiIHRlbXBsYXRlIGFsc28g
cmVmZXJlbmNlZAorICAgIGB7e2Zvb319YCwgaXQgd291bGQgcHJpbnQgdGhlIHNhbWUgdGhpbmcg
YXMgdGhlIGB7e2Zvb319YAorICAgIGluIHRoZSBhYm92ZSBleGFtcGxlLgorICAKKyAgICBJZiBh
ICJfbmF2IiB0ZW1wbGF0ZSBpc24ndCBmb3VuZCwgdGhlIGBwYXJ0aWFsYCBoZWxwZXIgd2lsbAor
ICAgIGZhbGwgYmFjayB0byBhIHRlbXBsYXRlIG5hbWVkICJuYXYiLgorICAKKyAgICAjIyMgQm91
bmQgdGVtcGxhdGUgbmFtZXMKKyAgCisgICAgVGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBgcGFy
dGlhbGAgY2FuIGFsc28gYmUgYSBwYXRoCisgICAgdG8gYSBwcm9wZXJ0eSBjb250YWluaW5nIGEg
dGVtcGxhdGUgbmFtZSwgZS5nLjoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7cGFydGlh
bCBzb21lVGVtcGxhdGVOYW1lfX0KKyAgICBgYGAKKyAgCisgICAgVGhlIGFib3ZlIGV4YW1wbGUg
d2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBgc29tZVRlbXBsYXRlTmFtZWAKKyAgICBvbiB0aGUg
dGVtcGxhdGUgY29udGV4dCAoZS5nLiBhIGNvbnRyb2xsZXIpIGFuZCB1c2UgdGhhdAorICAgIHZh
bHVlIGFzIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIuIElmIHRoZSByZXNvbHZl
ZAorICAgIHZhbHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwgYmUgcmVuZGVyZWQuIElmIGBzb21l
VGVtcGxhdGVOYW1lYAorICAgIGNoYW5nZXMsIHRoZSBwYXJ0aWFsIHdpbGwgYmUgcmUtcmVuZGVy
ZWQgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZQorICAgIG5hbWUuCisgIAorICAKKyAgICBAbWV0aG9k
IHBhcnRpYWwKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtT
dHJpbmd9IHBhcnRpYWxOYW1lIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgbWlu
dXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICBAcHVibGljCisgICovCisKKyAgZXhwb3J0
cy5kZWZhdWx0ID0geworICAgIHNldHVwU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSwgZW52LCBzY29w
ZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICByZXR1cm4geyBwYXJ0aWFsTmFtZTogZW52Lmhvb2tz
LmdldFZhbHVlKHBhcmFtc1swXSkgfTsKKyAgICB9LAorCisgICAgcmVuZGVyOiBmdW5jdGlvbiAo
cmVuZGVyTm9kZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwg
dmlzaXRvcikgeworICAgICAgdmFyIHN0YXRlID0gcmVuZGVyTm9kZS5nZXRTdGF0ZSgpOworICAg
ICAgaWYgKCFzdGF0ZS5wYXJ0aWFsTmFtZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
IH0KKyAgICAgIHZhciBmb3VuZCA9IF9lbWJlclZpZXdzU3lzdGVtTG9va3VwX3BhcnRpYWwuZGVm
YXVsdChlbnYsIHN0YXRlLnBhcnRpYWxOYW1lKTsKKyAgICAgIGlmICghZm91bmQpIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIF9odG1sYmFyc1J1bnRpbWUuaW50ZXJu
YWwuaG9zdEJsb2NrKHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIGZvdW5kLnJhdywgbnVsbCwgbnVs
bCwgdmlzaXRvciwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgICAgb3B0aW9ucy50ZW1wbGF0
ZXMudGVtcGxhdGUueWllbGQoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfTsKK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy9yZWFkb25seScsIFsnZXhwb3J0cycsICdlbWJlci1o
dG1sYmFycy9rZXl3b3Jkcy9tdXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJz
S2V5d29yZHNNdXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJl
ci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gcmVhZG9ubHk7CisKKyAgZnVuY3Rpb24gcmVhZG9ubHkobW9ycGgsIGVudiwgc2NvcGUsIG9y
aWdpbmFsUGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSkgeworICAgIC8vIElmIGBtb3Jw
aGAgaXMgYG51bGxgIHRoZSBrZXl3b3JkIGlzIGJlaW5nIGludm9rZWQgYXMgYSBzdWJleHByZXNz
aW9uLgorICAgIGlmIChtb3JwaCA9PT0gbnVsbCkgeworICAgICAgdmFyIHN0cmVhbSA9IG9yaWdp
bmFsUGFyYW1zWzBdOworICAgICAgaWYgKHN0cmVhbSAmJiBzdHJlYW1bX2VtYmVySHRtbGJhcnNL
ZXl3b3Jkc011dC5NVVRBQkxFX1JFRkVSRU5DRV0pIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS5z
b3VyY2VEZXAuZGVwZW5kZWU7CisgICAgICB9CisgICAgICByZXR1cm4gc3RyZWFtOworICAgIH0K
KworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMva2V5
d29yZHMvdGV4dGFyZWEnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKwor
ICAvKioKKyAgICBge3t0ZXh0YXJlYX19YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9mIGA8dGV4
dGFyZWE+YCB0YWcgaW50byB0aGUgdGVtcGxhdGUuCisgICAgVGhlIGF0dHJpYnV0ZXMgb2YgYHt7
dGV4dGFyZWF9fWAgbWF0Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRhZ3MgYXMKKyAgICBj
bG9zZWx5IGFzIHBvc3NpYmxlLgorICAKKyAgICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0cmlidXRl
cyBjYW4gYmUgc2V0OgorICAKKyAgICAgICogYHZhbHVlYAorICAgICAgKiBgbmFtZWAKKyAgICAg
ICogYHJvd3NgCisgICAgICAqIGBjb2xzYAorICAgICAgKiBgcGxhY2Vob2xkZXJgCisgICAgICAq
IGBkaXNhYmxlZGAKKyAgICAgICogYG1heGxlbmd0aGAKKyAgICAgICogYHRhYmluZGV4YAorICAg
ICAgKiBgc2VsZWN0aW9uRW5kYAorICAgICAgKiBgc2VsZWN0aW9uU3RhcnRgCisgICAgICAqIGBz
ZWxlY3Rpb25EaXJlY3Rpb25gCisgICAgICAqIGB3cmFwYAorICAgICAgKiBgcmVhZG9ubHlgCisg
ICAgICAqIGBhdXRvZm9jdXNgCisgICAgICAqIGBmb3JtYAorICAgICAgKiBgc3BlbGxjaGVja2AK
KyAgICAgICogYHJlcXVpcmVkYAorICAKKyAgICBXaGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcs
IHRoZXNlIHZhbHVlIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAorICAgIGVs
ZW1lbnQuIFdoZW4gbGVmdCB1bnF1b3RlZCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgYm91bmQgdG8g
YSBwcm9wZXJ0eSBvbiB0aGUKKyAgICB0ZW1wbGF0ZSdzIGN1cnJlbnQgcmVuZGVyaW5nIGNvbnRl
eHQgKG1vc3QgdHlwaWNhbGx5IGEgY29udHJvbGxlciBpbnN0YW5jZSkuCisgIAorICAgIFVuYm91
bmQ6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e3RleHRhcmVhIHZhbHVlPSJMb3RzIG9m
IHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1QgYm91bmQifX0KKyAgICBgYGAKKyAgCisgICAgV291bGQg
cmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKKyAgCisgICAgYGBgaHRtbAorICAgIDx0ZXh0
YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2Ygc3RhdGljIHRleHQg
dGhhdCBJU04nVCBib3VuZAorICAgIDwvdGV4dGFyZWE+CisgICAgYGBgCisgIAorICAgIEJvdW5k
OgorICAKKyAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBgd3JpdHRlbldvcmRzYCBw
cm9wZXJ0eSBvbiBgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlcmAKKyAgICB3aWxsIGJlIHVwZGF0
ZWQgbGl2ZSBhcyB0aGUgdXNlciB0eXBlcyAnTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQnIGlu
dG8KKyAgICB0aGUgdGV4dCBhcmVhIG9mIHRoZWlyIGJyb3dzZXIncyB3aW5kb3cuCisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29u
dHJvbGxlci5leHRlbmQoeworICAgICAgd3JpdHRlbldvcmRzOiAiTG90cyBvZiB0ZXh0IHRoYXQg
SVMgYm91bmQiCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jkc319CisgICAgYGBgCisgIAorICAgICBXb3VsZCBy
ZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgorICAKKyAgICBgYGBodG1sCisgICAgPHRleHRh
cmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgorICAgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMg
Ym91bmQKKyAgICA8L3RleHRhcmVhPgorICAgIGBgYAorICAKKyAgICBJZiB5b3Ugd2FudGVkIGEg
b25lIHdheSBiaW5kaW5nIGJldHdlZW4gdGhlIHRleHQgYXJlYSBhbmQgYSBkaXYgdGFnCisgICAg
c29tZXdoZXJlIGVsc2Ugb24geW91ciBzY3JlZW4sIHlvdSBjb3VsZCB1c2UgYEVtYmVyLmNvbXB1
dGVkLm9uZVdheWA6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25D
b250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgd3JpdHRlbldvcmRz
OiAiTG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQiLAorICAgICAgb3V0cHV0V3JpdHRlbldvcmRz
OiBFbWJlci5jb21wdXRlZC5vbmVXYXkoIndyaXR0ZW5Xb3JkcyIpCisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e3RleHRhcmVhIHZhbHVlPXdyaXR0ZW5Xb3Jk
c319CisgIAorICAgIDxkaXY+CisgICAgICB7e291dHB1dFdyaXR0ZW5Xb3Jkc319CisgICAgPC9k
aXY+CisgICAgYGBgCisgIAorICAgIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6
CisgIAorICAgIGBgYGh0bWwKKyAgICA8dGV4dGFyZWEgY2xhc3M9ImVtYmVyLXRleHQtYXJlYSI+
CisgICAgICBMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZAorICAgIDwvdGV4dGFyZWE+CisgIAor
ICAgIDwtLSB0aGUgZm9sbG93aW5nIGRpdiB3aWxsIGJlIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGFz
IHlvdSB0eXBlIC0tPgorICAKKyAgICA8ZGl2PgorICAgICAgTG90cyBvZiB0ZXh0IHRoYXQgSVMg
Ym91bmQKKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgRmluYWxseSwgdGhpcyBleGFtcGxl
IHJlYWxseSBzaG93cyB0aGUgcG93ZXIgYW5kIGVhc2Ugb2YgRW1iZXIgd2hlbiB0d28KKyAgICBw
cm9wZXJ0aWVzIGFyZSBib3VuZCB0byBlYWNob3RoZXIgdmlhIGBFbWJlci5jb21wdXRlZC5hbGlh
c2AuIFR5cGUgaW50bworICAgIGVpdGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5J2xsIGJvdGgg
c3RheSBpbiBzeW5jLiBOb3RlIHRoYXQKKyAgICBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgIGNvc3Rz
IG1vcmUgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIHNvIG9ubHkgdXNlIGl0IHdoZW4KKyAgICB5
b3VyIHJlYWxseSBiaW5kaW5nIGluIGJvdGggZGlyZWN0aW9uczoKKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4
dGVuZCh7CisgICAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCIs
CisgICAgICB0d29XYXlXcml0dGVuV29yZHM6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCJ3cml0dGVu
V29yZHMiKQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3t0
ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQorICAgIHt7dGV4dGFyZWEgdmFsdWU9dHdvV2F5
V3JpdHRlbldvcmRzfX0KKyAgICBgYGAKKyAgCisgICAgYGBgaHRtbAorICAgIDx0ZXh0YXJlYSBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2YgdGV4dCB0
aGF0IElTIGJvdW5kCisgICAgPC90ZXh0YXJlYT4KKyAgCisgICAgPC0tIGJvdGggdXBkYXRlZCBp
biByZWFsIHRpbWUgLS0+CisgIAorICAgIDx0ZXh0YXJlYSBpZD0iZW1iZXIyIiBjbGFzcz0iZW1i
ZXItdGV4dC1hcmVhIj4KKyAgICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCisgICAgPC90
ZXh0YXJlYT4KKyAgICBgYGAKKyAgCisgICAgIyMjIEFjdGlvbnMKKyAgCisgICAgVGhlIGhlbHBl
ciBjYW4gc2VuZCBtdWx0aXBsZSBhY3Rpb25zIGJhc2VkIG9uIHVzZXIgZXZlbnRzLgorICAKKyAg
ICBUaGUgYWN0aW9uIHByb3BlcnR5IGRlZmluZXMgdGhlIGFjdGlvbiB3aGljaCBpcyBzZW5kIHdo
ZW4KKyAgICB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LgorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAge3tpbnB1dCBhY3Rpb249InN1Ym1pdCJ9fQorICAgIGBgYAorICAKKyAgICBU
aGUgaGVscGVyIGFsbG93cyBzb21lIHVzZXIgZXZlbnRzIHRvIHNlbmQgYWN0aW9ucy4KKyAgCisg
ICogYGVudGVyYAorICAqIGBpbnNlcnQtbmV3bGluZWAKKyAgKiBgZXNjYXBlLXByZXNzYAorICAq
IGBmb2N1cy1pbmAKKyAgKiBgZm9jdXMtb3V0YAorICAqIGBrZXktcHJlc3NgCisgIAorICAgIEZv
ciBleGFtcGxlLCBpZiB5b3UgZGVzaXJlIGFuIGFjdGlvbiB0byBiZSBzZW50IHdoZW4gdGhlIGlu
cHV0IGlzIGJsdXJyZWQsCisgICAgeW91IG9ubHkgbmVlZCB0byBzZXR1cCB0aGUgYWN0aW9uIG5h
bWUgdG8gdGhlIGV2ZW50IG5hbWUgcHJvcGVydHkuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAg
ICB7e3RleHRhcmVhIGZvY3VzLWluPSJhbGVydE1lc3NhZ2UifX0KKyAgICBgYGAKKyAgCisgICAg
U2VlIG1vcmUgYWJvdXQgW1RleHQgU3VwcG9ydCBBY3Rpb25zXSgvYXBpL2NsYXNzZXMvRW1iZXIu
VGV4dEFyZWEuaHRtbCkKKyAgCisgICAgIyMjIEV4dGVuc2lvbgorICAKKyAgICBJbnRlcm5hbGx5
LCBge3t0ZXh0YXJlYX19YCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBFbWJlci5UZXh0QXJlYWAs
IHBhc3NpbmcKKyAgICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5UZXh0QXJl
YWAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KKyAgICBleHRlbmQgdGhlIGNhcGFiaWxpdGll
cyBvZiB0ZXh0IGFyZWFzIGluIHlvdXIgYXBwbGljYXRpb24gYnkgcmVvcGVuaW5nIHRoaXMKKyAg
ICBjbGFzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBCb290c3RyYXAgcHJv
amVjdCB3aGVyZSBgZGF0YS0qYAorICAgIGF0dHJpYnV0ZXMgYXJlIHVzZWQsIHlvdSBjYW4gZ2xv
YmFsbHkgYWRkIHN1cHBvcnQgZm9yIGEgYGRhdGEtKmAgYXR0cmlidXRlCisgICAgb24gYWxsIGB7
e3RleHRhcmVhfX1gcycgaW4geW91ciBhcHAgYnkgcmVvcGVuaW5nIGBFbWJlci5UZXh0QXJlYWAg
b3IKKyAgICBgRW1iZXIuVGV4dFN1cHBvcnRgIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1
dGVCaW5kaW5nc2AgY29uY2F0ZW5hdGVkCisgICAgcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBFbWJlci5UZXh0QXJlYS5yZW9wZW4oeworICAgICAgYXR0cmlidXRlQmluZGlu
Z3M6IFsnZGF0YS1lcnJvciddCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEtlZXAgaW4gbWlu
ZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRleHRBcmVhYCBzdWJjbGFzc2VzIHRoYXQgYEVtYmVyLlRl
eHRBcmVhYAorICAgIGl0c2VsZiBleHRlbmRzIGBFbWJlci5Db21wb25lbnRgLiBFeHBlY3QgaXNv
bGF0ZWQgY29tcG9uZW50IHNlbWFudGljcywgbm90CisgICAgbGVnYWN5IDEueCB2aWV3IHNlbWFu
dGljcyAobGlrZSBgY29udHJvbGxlcmAgYmVpbmcgcHJlc2VudCkuCisgIAorICAgIFNlZSBtb3Jl
IGFib3V0IFtFbWJlciBjb21wb25lbnRzXSgvYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0
bWwpCisgIAorICAgIEBtZXRob2QgdGV4dGFyZWEKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5o
ZWxwZXJzCisgICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCisgICAgQHB1YmxpYworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dGFyZWE7CisKKyAgZnVuY3Rp
b24gdGV4dGFyZWEobW9ycGgsIGVudiwgc2NvcGUsIG9yaWdpbmFsUGFyYW1zLCBoYXNoLCB0ZW1w
bGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGVudi5ob29rcy5jb21wb25lbnQobW9ycGgs
IGVudiwgc2NvcGUsICctdGV4dC1hcmVhJywgb3JpZ2luYWxQYXJhbXMsIGhhc2gsIHsgZGVmYXVs
dDogdGVtcGxhdGUsIGludmVyc2U6IGludmVyc2UgfSwgdmlzaXRvcik7CisgICAgcmV0dXJuIHRy
dWU7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9rZXl3b3Jkcy91bmJvdW5kJywg
WydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Ry
ZWFtJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSwgX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10
ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
dW5ib3VuZDsKKworICAvKioKKyAgICBUaGUgYHt7dW5ib3VuZH19YCBoZWxwZXIgZGlzY29ubmVj
dHMgdGhlIG9uZS13YXkgYmluZGluZyBvZiBhIHByb3BlcnR5LAorICAgIGVzc2VudGlhbGx5IGZy
ZWV6aW5nIGl0cyB2YWx1ZSBhdCB0aGUgbW9tZW50IG9mIHJlbmRlcmluZy4gRm9yIGV4YW1wbGUs
CisgICAgaW4gdGhpcyBleGFtcGxlIHRoZSBkaXNwbGF5IG9mIHRoZSB2YXJpYWJsZSBgbmFtZWAg
d2lsbCBub3QgY2hhbmdlIGV2ZW4KKyAgICBpZiBpdCBpcyBzZXQgd2l0aCBhIG5ldyB2YWx1ZToK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7dW5ib3VuZCBuYW1lfX0KKyAgICBgYGAKKyAg
CisgICAgTGlrZSBhbnkgaGVscGVyLCB0aGUgYHVuYm91bmRgIGhlbHBlciBjYW4gYWNjZXB0IGEg
bmVzdGVkIGhlbHBlciBleHByZXNzaW9uLgorICAgIFRoaXMgYWxsb3dzIGZvciBjdXN0b20gaGVs
cGVycyB0byBiZSByZW5kZXJlZCB1bmJvdW5kOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3t1bmJvdW5kIChzb21lLWN1c3RvbS1oZWxwZXIpfX0KKyAgICB7e3VuYm91bmQgKGNhcGl0YWxp
emUgbmFtZSl9fQorICAgIHt7ISBZb3UgY2FuIHVzZSBhbnkgaGVscGVyLCBpbmNsdWRpbmcgdW5i
b3VuZCwgaW4gYSBuZXN0ZWQgZXhwcmVzc2lvbiB9fQorICAgIHt7Y2FwaXRhbGl6ZSAodW5ib3Vu
ZCBuYW1lKX19CisgICAgYGBgCisgIAorICAgIFRoZSBgdW5ib3VuZGAgaGVscGVyIG9ubHkgYWNj
ZXB0cyBhIHNpbmdsZSBhcmd1bWVudCwgYW5kIGl0IHJldHVybiBhbgorICAgIHVuYm91bmQgdmFs
dWUuCisgIAorICAgIEBtZXRob2QgdW5ib3VuZAorICAgIEBmb3IgRW1iZXIuVGVtcGxhdGVzLmhl
bHBlcnMKKyAgICBAcHVibGljCisgICovCisKKyAgdmFyIFZvbGF0aWxlU3RyZWFtID0gX2VtYmVy
TWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAo
c291cmNlKSB7CisgICAgICB0aGlzLmxhYmVsID0gJyh2b2xhdGlsZSAnICsgc291cmNlLmxhYmVs
ICsgJyknOworICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICB0aGlzLmFkZERlcGVu
ZGVuY3koc291cmNlKTsKKyAgICB9LAorCisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHRoaXMuc291cmNlKTsKKyAgICB9
LAorCisgICAgbm90aWZ5OiBmdW5jdGlvbiAoKSB7fQorICB9KTsKKworICBmdW5jdGlvbiB1bmJv
dW5kKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2
aXNpdG9yKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3VuYm91bmQgaGVscGVyIGNh
bm5vdCBiZSBjYWxsZWQgd2l0aCBtdWx0aXBsZSBwYXJhbXMgb3IgaGFzaCBwYXJhbXMnLCBwYXJh
bXMubGVuZ3RoID09PSAxICYmIE9iamVjdC5rZXlzKGhhc2gpLmxlbmd0aCA9PT0gMCk7CisgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3VuYm91bmQgaGVscGVyIGNhbm5vdCBiZSBjYWxsZWQg
YXMgYSBibG9jaycsICF0ZW1wbGF0ZSk7CisKKyAgICBpZiAobW9ycGggPT09IG51bGwpIHsKKyAg
ICAgIHJldHVybiBuZXcgVm9sYXRpbGVTdHJlYW0ocGFyYW1zWzBdKTsKKyAgICB9CisKKyAgICB2
YXIgc3RyZWFtID0gdW5kZWZpbmVkOworICAgIGlmIChtb3JwaC5saW5rZWRSZXN1bHQpIHsKKyAg
ICAgIHN0cmVhbSA9IG1vcnBoLmxpbmtlZFJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgc3Ry
ZWFtID0gbmV3IFZvbGF0aWxlU3RyZWFtKHBhcmFtc1swXSk7CisgICAgICBtb3JwaC5saW5rZWRS
ZXN1bHQgPSBzdHJlYW07CisgICAgfQorICAgIGVudi5ob29rcy5yYW5nZShtb3JwaCwgZW52LCBz
Y29wZSwgbnVsbCwgc3RyZWFtLCB2aXNpdG9yKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRzL3ZpZXcnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItdmlld3Mvc3RyZWFtcy91dGlscycsICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVy
LWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2RlLW1hbmFnZXInXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlclZpZXdzU3RyZWFtc1V0aWxzLCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2Vt
YmVySHRtbGJhcnNOb2RlTWFuYWdlcnNWaWV3Tm9kZU1hbmFnZXIpIHsKKyAgLyoqCisgIEBtb2R1
bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgICAgYHt7dmlld319YCBpbnNlcnRzIGEgbmV3IGluc3RhbmNlIG9m
IGFuIGBFbWJlci5WaWV3YCBpbnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMKKyAgICBvcHRpb25z
IHRvIHRoZSBgRW1iZXIuVmlld2AncyBgY3JlYXRlYCBtZXRob2QgYW5kIHVzaW5nIHRoZSBzdXBw
bGllZCBibG9jayBhcworICAgIHRoZSB2aWV3J3Mgb3duIHRlbXBsYXRlLgorICAKKyAgICBBbiBl
bXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKKyAgCisgICAgYGBgaGFu
ZGxlYmFycworICAgIEEgc3BhbjoKKyAgICB7eyN2aWV3IHRhZ05hbWU9InNwYW4ifX0KKyAgICAg
IGhlbGxvLgorICAgIHt7L3ZpZXd9fQorICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiBI
VE1MIHN0cnVjdHVyZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxib2R5PgorICAgICAgPCEtLSBO
b3RlOiB0aGUgaGFuZGxlYmFycyB0ZW1wbGF0ZSBzY3JpcHQKKyAgICAgICAgICAgYWxzbyByZXN1
bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIuVmlldworICAgICAgICAgICB3aGljaCBpcyB0aGUgb3V0
ZXIgPGRpdj4gaGVyZSAtLT4KKyAgCisgICAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KKyAg
ICAgICAgQSBzcGFuOgorICAgICAgICA8c3BhbiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll
dyI+CisgICAgICAgICAgSGVsbG8uCisgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvZGl2PgorICAg
IDwvYm9keT4KKyAgICBgYGAKKyAgCisgICAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0aW5nCisgIAor
ICAgIFRoZSBgcGFyZW50Vmlld2AgcHJvcGVydHkgb2YgdGhlIG5ldyBgRW1iZXIuVmlld2AgaW5z
dGFuY2UgY3JlYXRlZCB0aHJvdWdoCisgICAgYHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0aGUg
YEVtYmVyLlZpZXdgIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZQorICAgIGB7e3ZpZXd9
fWAgd2FzIGNhbGxlZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGFWaWV3ID0gRW1iZXIu
Vmlldy5jcmVhdGUoeworICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgi
e3sjdmlld319IG15IHBhcmVudDoge3twYXJlbnRWaWV3LmVsZW1lbnRJZH19IHt7L3ZpZXd9fSIp
CisgICAgfSk7CisgIAorICAgIGFWaWV3LmFwcGVuZFRvKCdib2R5Jyk7CisgICAgYGBgCisgIAor
ICAgIFdpbGwgcmVzdWx0IGluIEhUTUwgc3RydWN0dXJlOgorICAKKyAgICBgYGBodG1sCisgICAg
PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgICA8ZGl2IGlkPSJlbWJl
cjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KKyAgICAgICAgbXkgcGFyZW50OiBlbWJlcjEKKyAgICAg
IDwvZGl2PgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICAjIyMgU2V0dGluZyBDU1MgaWQg
YW5kIGNsYXNzIGF0dHJpYnV0ZXMKKyAgCisgICAgVGhlIEhUTUwgYGlkYCBhdHRyaWJ1dGUgY2Fu
IGJlIHNldCBvbiB0aGUgYHt7dmlld319YCdzIHJlc3VsdGluZyBlbGVtZW50IHdpdGgKKyAgICB0
aGUgYGlkYCBvcHRpb24uIFRoaXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFzc2VkIHRvIGBFbWJl
ci5WaWV3LmNyZWF0ZWAuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyN2aWV3IHRhZ05h
bWU9InNwYW4iIGlkPSJhLWN1c3RvbS1pZCJ9fQorICAgICAgaGVsbG8uCisgICAge3svdmlld319
CisgICAgYGBgCisgIAorICAgIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVy
ZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAg
PHNwYW4gaWQ9ImEtY3VzdG9tLWlkIiBjbGFzcz0iZW1iZXItdmlldyI+CisgICAgICAgIGhlbGxv
LgorICAgICAgPC9zcGFuPgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBUaGUgSFRNTCBg
Y2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5n
IGVsZW1lbnQKKyAgICB3aXRoIHRoZSBgY2xhc3NgIG9yIGBjbGFzc05hbWVCaW5kaW5nc2Agb3B0
aW9ucy4gVGhlIGBjbGFzc2Agb3B0aW9uIHdpbGwKKyAgICBkaXJlY3RseSBzZXQgdGhlIENTUyBg
Y2xhc3NgIGF0dHJpYnV0ZSBhbmQgd2lsbCBub3QgYmUgcGFzc2VkIHRvCisgICAgYEVtYmVyLlZp
ZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdzYCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRl
YCBhbmQgdXNlCisgICAgYEVtYmVyLlZpZXdgJ3MgY2xhc3MgbmFtZSBiaW5kaW5nIGZ1bmN0aW9u
YWxpdHk6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyN2aWV3IHRhZ05hbWU9InNwYW4i
IGNsYXNzPSJhLWN1c3RvbS1jbGFzcyJ9fQorICAgICAgaGVsbG8uCisgICAge3svdmlld319Cisg
ICAgYGBgCisgIAorICAgIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToK
KyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgPHNw
YW4gaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcgYS1jdXN0b20tY2xhc3MiPgorICAgICAg
ICBoZWxsby4KKyAgICAgIDwvc3Bhbj4KKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgIyMj
IFN1cHBseWluZyBhIGRpZmZlcmVudCB2aWV3IGNsYXNzCisgIAorICAgIGB7e3ZpZXd9fWAgY2Fu
IHRha2UgYW4gb3B0aW9uYWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBzdXBwbGllZCBvcHRp
b25zIHRvCisgICAgc3BlY2lmeSBhIHBhdGggdG8gYSBjdXN0b20gdmlldyBjbGFzcy4KKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIHt7I3ZpZXcgImN1c3RvbSJ9fXt7ISB3aWxsIGxvb2sgdXAg
QXBwLkN1c3RvbVZpZXcgfX0KKyAgICAgIGhlbGxvLgorICAgIHt7L3ZpZXd9fQorICAgIGBgYAor
ICAKKyAgICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoIGFj
Y2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAorICAgIGNvbnRleHQuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBNeUFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7fSk7CisgICAgTXlB
cHAuT3V0ZXJWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgaW5uZXJWaWV3Q2xhc3M6
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgICAgY2xhc3NOYW1lczogWydhLWN1c3RvbS12aWV3
LWNsYXNzLWFzLXByb3BlcnR5J10KKyAgICAgIH0pLAorICAgICAgdGVtcGxhdGU6IEVtYmVyLkhh
bmRsZWJhcnMuY29tcGlsZSgne3sjdmlldyB2aWV3LmlubmVyVmlld0NsYXNzfX0gaGkge3svdmll
d319JykKKyAgICB9KTsKKyAgCisgICAgTXlBcHAuT3V0ZXJWaWV3LmNyZWF0ZSgpLmFwcGVuZFRv
KCdib2R5Jyk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcg
SFRNTDoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXciPgorICAgICAgPGRpdiBpZD0iZW1iZXIyIiBjbGFzcz0iZW1iZXItdmlldyBhLWN1c3Rv
bS12aWV3LWNsYXNzLWFzLXByb3BlcnR5Ij4KKyAgICAgICAgaGkKKyAgICAgIDwvZGl2PgorICAg
IDwvZGl2PgorICAgIGBgYAorICAKKyAgICAjIyMgQmxvY2tsZXNzIHVzZQorICAKKyAgICBJZiB5
b3Ugc3VwcGx5IGEgY3VzdG9tIGBFbWJlci5WaWV3YCBzdWJjbGFzcyB0aGF0IHNwZWNpZmllcyBp
dHMgb3duIHRlbXBsYXRlCisgICAgb3IgcHJvdmlkZSBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlvbiB0
byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQKKyAgICBzdXBwbHlpbmcgYSBibG9j
ay4gQXR0ZW1wdHMgdG8gdXNlIGJvdGggYSBgdGVtcGxhdGVOYW1lYCBvcHRpb24gYW5kIHN1cHBs
eSBhCisgICAgYmxvY2sgd2lsbCB0aHJvdyBhbiBlcnJvci4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICBBcHAuV2l0
aFRlbXBsYXRlRGVmaW5lZFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0
ZU5hbWU6ICdkZWZpbmVkLXRlbXBsYXRlJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3shIGFwcGxpY2F0aW9uLmhicyB9fQorICAgIHt7dmlldyAnd2l0aC10
ZW1wbGF0ZS1kZWZpbmVkJ319CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7
eyEgZGVmaW5lZC10ZW1wbGF0ZS5oYnMgfX0KKyAgICBTb21lIGNvbnRlbnQgZm9yIHRoZSBkZWZp
bmVkIHRlbXBsYXRlIHZpZXcuCisgICAgYGBgCisgIAorICAgICMjIyBgdmlld05hbWVgIHByb3Bl
cnR5CisgIAorICAgIFlvdSBjYW4gc3VwcGx5IGEgYHZpZXdOYW1lYCBvcHRpb24gdG8gYHt7dmll
d319YC4gVGhlIGBFbWJlci5WaWV3YCBpbnN0YW5jZQorICAgIHdpbGwgYmUgcmVmZXJlbmNlZCBh
cyBhIHByb3BlcnR5IG9mIGl0cyBwYXJlbnQgdmlldyBieSB0aGlzIG5hbWUuCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBhVmlldyA9IEVtYmVyLlZpZXcuY3JlYXRlKHsKKyAgICAgIHRlbXBs
YXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7I3ZpZXcgdmlld05hbWU9ImFDaGlsZEJ5
TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQorICAgIH0pOworICAKKyAgICBhVmlldy5hcHBlbmRUbygn
Ym9keScpOworICAgIGFWaWV3LmdldCgnYUNoaWxkQnlOYW1lJykgLy8gdGhlIGluc3RhbmNlIG9m
IEVtYmVyLlZpZXcgY3JlYXRlZCBieSB7e3ZpZXd9fSBoZWxwZXIKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCB2aWV3CisgICAgQGZvciBFbWJlci5UZW1wbGF0ZXMuaGVscGVycworICAgIEBwdWJs
aWMKKyAgICBAZGVwcmVjYXRlZAorICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBz
ZXR1cFN0YXRlOiBmdW5jdGlvbiAoc3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkgewor
ICAgICAgdmFyIHJlYWQgPSBlbnYuaG9va3MuZ2V0VmFsdWU7CisgICAgICB2YXIgdGFyZ2V0T2Jq
ZWN0ID0gcmVhZChzY29wZS5nZXRTZWxmKCkpOworICAgICAgdmFyIHZpZXdDbGFzc09ySW5zdGFu
Y2UgPSBzdGF0ZS52aWV3Q2xhc3NPckluc3RhbmNlOworICAgICAgaWYgKCF2aWV3Q2xhc3NPcklu
c3RhbmNlKSB7CisgICAgICAgIHZpZXdDbGFzc09ySW5zdGFuY2UgPSBnZXRWaWV3KHJlYWQocGFy
YW1zWzBdKSwgZW52Lm93bmVyKTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgcGFyZW50VmlldyBl
eGlzdHMsIHVzZSBpdHMgY29udHJvbGxlciAodGhlIGRlZmF1bHQKKyAgICAgIC8vIGJlaGF2aW9y
KSwgb3RoZXJ3aXNlIHVzZSBgc2NvcGUuc2VsZmAgYXMgdGhlIGNvbnRyb2xsZXIKKyAgICAgIHZh
ciBjb250cm9sbGVyID0gc2NvcGUuaGFzTG9jYWwoJ3ZpZXcnKSA/IG51bGwgOiByZWFkKHNjb3Bl
LmdldFNlbGYoKSk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIG1hbmFnZXI6IHN0YXRlLm1h
bmFnZXIsCisgICAgICAgIHBhcmVudFZpZXc6IGVudi52aWV3LAorICAgICAgICBjb250cm9sbGVy
OiBjb250cm9sbGVyLAorICAgICAgICB0YXJnZXRPYmplY3Q6IHRhcmdldE9iamVjdCwKKyAgICAg
ICAgdmlld0NsYXNzT3JJbnN0YW5jZTogdmlld0NsYXNzT3JJbnN0YW5jZQorICAgICAgfTsKKyAg
ICB9LAorCisgICAgcmVyZW5kZXI6IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1z
LCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgICAgLy8gSWYgdGhlIGhh
c2ggaXMgZW1wdHksIHRoZSBjb21wb25lbnQgY2Fubm90IGhhdmUgZXh0cmFjdGVkIGEgcGFydAor
ICAgICAgLy8gb2YgYSBtdXRhYmxlIHBhcmFtIGFuZCB1c2VkIGl0IGluIGl0cyBsYXlvdXQsIGJl
Y2F1c2UgdGhlcmUgYXJlCisgICAgICAvLyBubyBwYXJhbXMgYXQgYWxsLgorICAgICAgaWYgKE9i
amVjdC5rZXlzKGhhc2gpLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gbW9ycGguZ2V0U3RhdGUo
KS5tYW5hZ2VyLnJlcmVuZGVyKGVudiwgaGFzaCwgdmlzaXRvciwgdHJ1ZSk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIHJlbmRlcjogZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsKKyAgICAgIGlmIChoYXNoLnRhZykg
eworICAgICAgICBoYXNoID0gc3dhcEtleShoYXNoLCAndGFnJywgJ3RhZ05hbWUnKTsKKyAgICAg
IH0KKworICAgICAgaWYgKGhhc2guY2xhc3NOYW1lQmluZGluZ3MpIHsKKyAgICAgICAgaGFzaC5j
bGFzc05hbWVCaW5kaW5ncyA9IGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKTsKKyAg
ICAgIH0KKworICAgICAgdmFyIHN0YXRlID0gbm9kZS5nZXRTdGF0ZSgpOworICAgICAgdmFyIHBh
cmVudFZpZXcgPSBzdGF0ZS5wYXJlbnRWaWV3OworCisgICAgICB2YXIgb3B0aW9ucyA9IHsKKyAg
ICAgICAgY29tcG9uZW50OiBzdGF0ZS52aWV3Q2xhc3NPckluc3RhbmNlLAorICAgICAgICBsYXlv
dXQ6IG51bGwKKyAgICAgIH07CisKKyAgICAgIG9wdGlvbnMuY3JlYXRlT3B0aW9ucyA9IHt9Owor
ICAgICAgaWYgKHN0YXRlLmNvbnRyb2xsZXIpIHsKKyAgICAgICAgLy8gVXNlIGBfY29udHJvbGxl
cmAgdG8gYXZvaWQgc3RvbXBpbmcgb24gYSBDUAorICAgICAgICAvLyB0aGF0IGV4aXN0cyBpbiB0
aGUgdGFyZ2V0IHZpZXcvY29tcG9uZW50CisgICAgICAgIG9wdGlvbnMuY3JlYXRlT3B0aW9ucy5f
Y29udHJvbGxlciA9IHN0YXRlLmNvbnRyb2xsZXI7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0
ZS50YXJnZXRPYmplY3QpIHsKKyAgICAgICAgLy8gVXNlIGBfdGFyZ2V0T2JqZWN0YCB0byBhdm9p
ZCBzdG9tcGluZyBvbiBhIENQCisgICAgICAgIC8vIHRoYXQgZXhpc3RzIGluIHRoZSB0YXJnZXQg
dmlldy9jb21wb25lbnQKKyAgICAgICAgb3B0aW9ucy5jcmVhdGVPcHRpb25zLl90YXJnZXRPYmpl
Y3QgPSBzdGF0ZS50YXJnZXRPYmplY3Q7CisgICAgICB9CisKKyAgICAgIGlmIChzdGF0ZS5tYW5h
Z2VyKSB7CisgICAgICAgIHN0YXRlLm1hbmFnZXIuZGVzdHJveSgpOworICAgICAgICBzdGF0ZS5t
YW5hZ2VyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIG5vZGVNYW5hZ2VyID0gX2VtYmVy
SHRtbGJhcnNOb2RlTWFuYWdlcnNWaWV3Tm9kZU1hbmFnZXIuZGVmYXVsdC5jcmVhdGUobm9kZSwg
ZW52LCBoYXNoLCBvcHRpb25zLCBwYXJlbnRWaWV3LCBudWxsLCBzY29wZSwgdGVtcGxhdGUpOwor
ICAgICAgc3RhdGUubWFuYWdlciA9IG5vZGVNYW5hZ2VyOworCisgICAgICBub2RlTWFuYWdlci5y
ZW5kZXIoZW52LCBoYXNoLCB2aXNpdG9yKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZ2V0
Vmlldyh2aWV3UGF0aCwgb3duZXIpIHsKKyAgICB2YXIgdmlld0NsYXNzT3JJbnN0YW5jZTsKKwor
ICAgIGlmICghdmlld1BhdGgpIHsKKyAgICAgIGlmIChvd25lcikgeworICAgICAgICB2aWV3Q2xh
c3NPckluc3RhbmNlID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoJ3ZpZXc6dG9wbGV2ZWwnKTsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIHZpZXdDbGFzc09ySW5zdGFuY2UgPSBfZW1iZXJWaWV3c1Zp
ZXdzVmlldy5kZWZhdWx0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2aWV3Q2xhc3NP
ckluc3RhbmNlID0gX2VtYmVyVmlld3NTdHJlYW1zVXRpbHMucmVhZFZpZXdGYWN0b3J5KHZpZXdQ
YXRoLCBvd25lcik7CisgICAgfQorCisgICAgcmV0dXJuIHZpZXdDbGFzc09ySW5zdGFuY2U7Cisg
IH0KKworICBmdW5jdGlvbiBzd2FwS2V5KGhhc2gsIG9yaWdpbmFsLCB1cGRhdGUpIHsKKyAgICB2
YXIgbmV3SGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBoYXNoKSB7CisgICAgICBp
ZiAocHJvcCA9PT0gb3JpZ2luYWwpIHsKKyAgICAgICAgbmV3SGFzaFt1cGRhdGVdID0gaGFzaFtw
cm9wXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld0hhc2hbcHJvcF0gPSBoYXNoW3Byb3Bd
OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdIYXNoOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItaHRtbGJhcnMva2V5d29yZHMvd2l0aCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9kZWJ1ZycsICdodG1sYmFycy1ydW50aW1lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbERlYnVnLCBfaHRtbGJhcnNSdW50aW1lKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisg
IEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGVzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBpc1N0YWJsZTogZnVuY3Rpb24gKCkgeworICAgICAg
cmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIGlzRW1wdHk6IGZ1bmN0aW9uIChzdGF0ZSkgewor
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICByZW5kZXI6IGZ1bmN0aW9uIChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikg
eworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3t7I3dpdGggZm9vfX0gbXVzdCBiZSBj
YWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCBvciB0aGUgdXNlIHRoZSAnICsgJ3t7I3dpdGgg
Zm9vIGFzIHxiYXJ8fX0gc3ludGF4JywgcGFyYW1zLmxlbmd0aCA9PT0gMSk7CisKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUge3sjd2l0aH19IGhlbHBlciBtdXN0IGJlIGNhbGxl
ZCB3aXRoIGEgYmxvY2snLCAhIXRlbXBsYXRlKTsKKworICAgICAgX2h0bWxiYXJzUnVudGltZS5p
bnRlcm5hbC5jb250aW51ZUJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCAnd2l0aCcsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOworICAgIH0sCisKKyAgICByZXJlbmRl
cjogZnVuY3Rpb24gKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBp
bnZlcnNlLCB2aXNpdG9yKSB7CisgICAgICBfaHRtbGJhcnNSdW50aW1lLmludGVybmFsLmNvbnRp
bnVlQmxvY2sobW9ycGgsIGVudiwgc2NvcGUsICd3aXRoJywgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0
ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLWh0
bWxiYXJzL2tleXdvcmRzL3lpZWxkJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSB5aWVsZEtleXdvcmQ7CisK
KyAgZnVuY3Rpb24geWllbGRLZXl3b3JkKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gs
IHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7CisgICAgdmFyIHRvID0gZW52Lmhvb2tzLmdl
dFZhbHVlKGhhc2gudG8pIHx8ICdkZWZhdWx0JzsKKyAgICB2YXIgYmxvY2sgPSBzY29wZS5nZXRC
bG9jayh0byk7CisKKyAgICBpZiAoYmxvY2spIHsKKyAgICAgIGJsb2NrLmludm9rZShlbnYsIHBh
cmFtcywgaGFzaC5zZWxmLCBtb3JwaCwgc2NvcGUsIHZpc2l0b3IpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvbW9ycGhzL2F0dHIt
bW9ycGgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZG9tLWhlbHBlcicsICdl
bWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVn
LCBfZG9tSGVscGVyLCBfZW1iZXJNZXRhbElzX25vbmUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBIVE1MQmFyc0F0dHJNb3JwaCA9IF9kb21IZWxwZXIuZGVmYXVsdC5wcm90b3R5cGUuQXR0
ck1vcnBoQ2xhc3M7CisKKyAgdmFyIHN0eWxlV2FybmluZyA9ICcnICsgJ0JpbmRpbmcgc3R5bGUg
YXR0cmlidXRlcyBtYXkgaW50cm9kdWNlIGNyb3NzLXNpdGUgc2NyaXB0aW5nIHZ1bG5lcmFiaWxp
dGllczsgJyArICdwbGVhc2UgZW5zdXJlIHRoYXQgdmFsdWVzIGJlaW5nIGJvdW5kIGFyZSBwcm9w
ZXJseSBlc2NhcGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgJyArICdpbmNsdWRpbmcgaG93IHRv
IGRpc2FibGUgdGhpcyB3YXJuaW5nLCBzZWUgJyArICdodHRwOi8vZW1iZXJqcy5jb20vZGVwcmVj
YXRpb25zL3YxLngvI3RvY19iaW5kaW5nLXN0eWxlLWF0dHJpYnV0ZXMuJzsKKworICBleHBvcnRz
LnN0eWxlV2FybmluZyA9IHN0eWxlV2FybmluZzsKKyAgdmFyIHByb3RvID0gSFRNTEJhcnNBdHRy
TW9ycGgucHJvdG90eXBlOworCisgIHByb3RvLmRpZEluaXQgPSBmdW5jdGlvbiAoKSB7CisgICAg
dGhpcy5zdHJlYW1VbnN1YnNjcmliZXJzID0gbnVsbDsKKworICAgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIGRlcHJlY2F0ZUVzY2FwZWRTdHls
ZShtb3JwaCwgdmFsdWUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oc3R5bGVXYXJuaW5n
LCAoZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBlc2NhcGVkKSB7CisgICAgICAvLyBTYWZlU3RyaW5n
CisgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQodmFsdWUpIHx8IHZhbHVlICYm
IHZhbHVlLnRvSFRNTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAg
aWYgKG5hbWUgIT09ICdzdHlsZScpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisK
KyAgICAgIHJldHVybiAhZXNjYXBlZDsKKyAgICB9KShtb3JwaC5hdHRyTmFtZSwgdmFsdWUsIG1v
cnBoLmVzY2FwZWQpLCB7IGlkOiAnZW1iZXItaHRtbGJhcnMuc3R5bGUteHNzLXdhcm5pbmcnIH0p
OworICB9CisKKyAgcHJvdG8ud2lsbFNldENvbnRlbnQgPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAg
ICBkZXByZWNhdGVFc2NhcGVkU3R5bGUodGhpcywgdmFsdWUpOworICB9OworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IEhUTUxCYXJzQXR0ck1vcnBoOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L21vcnBocy9tb3JwaCcsIFsnZXhwb3J0cycsICdkb20taGVscGVyJywgJ2VtYmVyLW1ldGFsL2Rl
YnVnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZG9tSGVscGVyLCBfZW1iZXJNZXRhbERlYnVnKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgSFRNTEJhcnNNb3JwaCA9IF9kb21IZWxwZXIuZGVm
YXVsdC5wcm90b3R5cGUuTW9ycGhDbGFzczsKKyAgdmFyIGd1aWQgPSAxOworCisgIGZ1bmN0aW9u
IEVtYmVyTW9ycGgoRE9NSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMuSFRN
TEJhcnNNb3JwaCRjb25zdHJ1Y3RvcihET01IZWxwZXIsIGNvbnRleHR1YWxFbGVtZW50KTsKKwor
ICAgIHRoaXMuZW1iZXJWaWV3ID0gbnVsbDsKKyAgICB0aGlzLmVtYmVyVG9EZXN0cm95ID0gbnVs
bDsKKyAgICB0aGlzLnN0cmVhbVVuc3Vic2NyaWJlcnMgPSBudWxsOworICAgIHRoaXMuZ3VpZCA9
IGd1aWQrKzsKKworICAgIC8vIEEgY29tcG9uZW50IGNhbiBiZWNvbWUgZGlydHkgZWl0aGVyIGJl
Y2F1c2Ugb25lIG9mIGl0cworICAgIC8vIGF0dHJpYnV0ZXMgY2hhbmdlZCwgb3IgYmVjYXVzZSBp
dCB3YXMgcmUtcmVuZGVyZWQuIElmIGFueSBwYXJ0CisgICAgLy8gb2YgdGhlIGNvbXBvbmVudCdz
IHRlbXBsYXRlIGNoYW5nZXMgdGhyb3VnaCBvYnNlcnZhdGlvbiwgaXQgaGFzCisgICAgLy8gcmUt
cmVuZGVyZWQgZnJvbSB0aGUgcGVycHNlY3RpdmUgb2YgdGhlIHByb2dyYW1taW5nIG1vZGVsLiBU
aGlzCisgICAgLy8gZmxhZyBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciBhIGNvbXBvbmVudCBiZWNv
bWVzIGRpcnR5IGJlY2F1c2UKKyAgICAvLyBvbmUgb2YgaXRzIGF0dHJpYnV0ZXMgY2hhbmdlZCwg
d2hpY2ggYWxzbyB0cmlnZ2VycyB0aGUgYXR0cmlidXRlCisgICAgLy8gdXBkYXRlIGZsYWcgKGRp
ZFVwZGF0ZUF0dHJzKS4KKyAgICB0aGlzLnNob3VsZFJlY2VpdmVBdHRycyA9IGZhbHNlOworCisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1Z1NlYWwodGhpcyk7CisgIH0KKworICB2YXIgcHJvdG8g
PSBFbWJlck1vcnBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSFRNTEJhcnNNb3JwaC5wcm90
b3R5cGUpOworICBwcm90by5IVE1MQmFyc01vcnBoJGNvbnN0cnVjdG9yID0gSFRNTEJhcnNNb3Jw
aDsKKyAgcHJvdG8uSFRNTEJhcnNNb3JwaCRjbGVhciA9IEhUTUxCYXJzTW9ycGgucHJvdG90eXBl
LmNsZWFyOworCisgIHByb3RvLmFkZERlc3RydWN0aW9uID0gZnVuY3Rpb24gKHRvRGVzdHJveSkg
eworICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kgPSB0aGlzLmVtYmVyVG9EZXN0cm95IHx8IFtdOwor
ICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kucHVzaCh0b0Rlc3Ryb3kpOworICB9OworCisgIHByb3Rv
LmNsZWFudXAgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHZpZXcgPSB0aGlzLmVtYmVyVmlldzsK
KworICAgIGlmICh2aWV3KSB7CisgICAgICB2YXIgcGFyZW50VmlldyA9IHZpZXcucGFyZW50Vmll
dzsKKworICAgICAgaWYgKHBhcmVudFZpZXcgJiYgdmlldy5vd25lclZpZXcuX2Rlc3Ryb3lpbmdT
dWJ0cmVlRm9yVmlldyA9PT0gcGFyZW50VmlldykgeworICAgICAgICBwYXJlbnRWaWV3LnJlbW92
ZUNoaWxkKHZpZXcpOworICAgICAgfQorICAgIH0KKworICAgIHZhciB0b0Rlc3Ryb3kgPSB0aGlz
LmVtYmVyVG9EZXN0cm95OworCisgICAgaWYgKHRvRGVzdHJveSkgeworICAgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSB0b0Rlc3Ryb3kubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHRvRGVz
dHJveVtpXS5kZXN0cm95KCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuZW1iZXJUb0Rlc3Ryb3kg
PSBudWxsOworICAgIH0KKyAgfTsKKworICBwcm90by5kaWRSZW5kZXIgPSBmdW5jdGlvbiAoZW52
LCBzY29wZSkgeworICAgIGVudi5yZW5kZXJlZE5vZGVzLmFkZCh0aGlzKTsKKyAgfTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBFbWJlck1vcnBoOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L25vZGUtbWFuYWdlcnMvY29tcG9uZW50LW5vZGUtbWFuYWdlcicsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci12aWV3cy9zeXN0ZW0vYnVpbGQtY29tcG9uZW50LXRlbXBs
YXRlJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLW1l
dGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItdmll
d3MvY29tcGF0L2F0dHJzLXByb3h5JywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVtZW50
YXRpb24tc3VwcG9ydCcsICdlbWJlci12aWV3cy9jb21wb25lbnRzL2NvbXBvbmVudCcsICdlbWJl
ci1odG1sYmFycy9nbGltbWVyLWNvbXBvbmVudCcsICdlbWJlci1odG1sYmFycy91dGlscy9leHRy
YWN0LXBvc2l0aW9uYWwtcGFyYW1zJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdjb250YWluZXIv
b3duZXInLCAnZW1iZXItaHRtbGJhcnMvaG9va3MvZ2V0LXZhbHVlJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJWaWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVt
cGxhdGUsIF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZSwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJz
UHJveHksIF9lbWJlckh0bWxiYXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCwgX2VtYmVy
Vmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1iZXJIdG1sYmFyc0dsaW1tZXJDb21wb25lbnQs
IF9lbWJlckh0bWxiYXJzVXRpbHNFeHRyYWN0UG9zaXRpb25hbFBhcmFtcywgX2VtYmVyTWV0YWxT
eW1ib2wsIF9jb250YWluZXJPd25lciwgX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlKSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmNyZWF0ZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBv
bmVudDsKKyAgZXhwb3J0cy50YWtlTGVnYWN5U25hcHNob3QgPSB0YWtlTGVnYWN5U25hcHNob3Q7
CisKKyAgLy8gVGhlc2Ugc3ltYm9scyB3aWxsIGJlIHVzZWQgdG8gbGltaXQgbGluay10bydzIHB1
YmxpYyBBUEkgc3VyZmFjZSBhcmVhLgorICB2YXIgSEFTX0JMT0NLID0gX2VtYmVyTWV0YWxTeW1i
b2wuZGVmYXVsdCgnSEFTX0JMT0NLJyk7CisKKyAgZXhwb3J0cy5IQVNfQkxPQ0sgPSBIQVNfQkxP
Q0s7CisgIC8vIEluIHRoZW9yeSB0aGlzIHNob3VsZCBjb21lIHRocm91Z2ggdGhlIGVudiwgYnV0
IGl0IHNob3VsZAorICAvLyBiZSBzYWZlIHRvIGltcG9ydCB0aGlzIHVudGlsIHdlIG1ha2UgdGhl
IGhvb2sgc3lzdGVtIHB1YmxpYworICAvLyBhbmQgaXQgZ2V0cyBhY3RpdmVseSB1c2VkIGluIGFk
ZG9ucyBvciBvdGhlciBkb3duc3RyZWFtCisgIC8vIGxpYnJhcmllcy4KKworICBmdW5jdGlvbiBD
b21wb25lbnROb2RlTWFuYWdlcihjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBzY29wZSwgcmVu
ZGVyTm9kZSwgYXR0cnMsIGJsb2NrLCBleHBlY3RFbGVtZW50KSB7CisgICAgdGhpcy5jb21wb25l
bnQgPSBjb21wb25lbnQ7CisgICAgdGhpcy5pc0FuZ2xlQnJhY2tldCA9IGlzQW5nbGVCcmFja2V0
OworICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB0aGlzLnJlbmRlck5vZGUgPSByZW5kZXJO
b2RlOworICAgIHRoaXMuYXR0cnMgPSBhdHRyczsKKyAgICB0aGlzLmJsb2NrID0gYmxvY2s7Cisg
ICAgdGhpcy5leHBlY3RFbGVtZW50ID0gZXhwZWN0RWxlbWVudDsKKyAgfQorCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IENvbXBvbmVudE5vZGVNYW5hZ2VyOworCisgIENvbXBvbmVudE5vZGVNYW5hZ2Vy
LmNyZWF0ZSA9IGZ1bmN0aW9uIENvbXBvbmVudE5vZGVNYW5hZ2VyX2NyZWF0ZShyZW5kZXJOb2Rl
LCBlbnYsIG9wdGlvbnMpIHsKKyAgICB2YXIgX2NyZWF0ZU9wdGlvbnM7CisKKyAgICB2YXIgdGFn
TmFtZSA9IG9wdGlvbnMudGFnTmFtZTsKKyAgICB2YXIgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7
CisgICAgdmFyIF9vcHRpb25zJGF0dHJzID0gb3B0aW9ucy5hdHRyczsKKyAgICB2YXIgYXR0cnMg
PSBfb3B0aW9ucyRhdHRycyA9PT0gdW5kZWZpbmVkID8ge30gOiBfb3B0aW9ucyRhdHRyczsKKyAg
ICB2YXIgcGFyZW50VmlldyA9IG9wdGlvbnMucGFyZW50VmlldzsKKyAgICB2YXIgcGFyZW50U2Nv
cGUgPSBvcHRpb25zLnBhcmVudFNjb3BlOworICAgIHZhciBpc0FuZ2xlQnJhY2tldCA9IG9wdGlv
bnMuaXNBbmdsZUJyYWNrZXQ7CisgICAgdmFyIGNvbXBvbmVudCA9IG9wdGlvbnMuY29tcG9uZW50
OworICAgIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDsKKyAgICB2YXIgdGVtcGxhdGVzID0g
b3B0aW9ucy50ZW1wbGF0ZXM7CisKKyAgICBjb21wb25lbnQgPSBjb21wb25lbnQgfHwgKGlzQW5n
bGVCcmFja2V0ID8gX2VtYmVySHRtbGJhcnNHbGltbWVyQ29tcG9uZW50LmRlZmF1bHQgOiBfZW1i
ZXJWaWV3c0NvbXBvbmVudHNDb21wb25lbnQuZGVmYXVsdCk7CisKKyAgICB2YXIgY3JlYXRlT3B0
aW9ucyA9IChfY3JlYXRlT3B0aW9ucyA9IHsKKyAgICAgIHBhcmVudFZpZXc6IHBhcmVudFZpZXcK
KyAgICB9LCBfY3JlYXRlT3B0aW9uc1tIQVNfQkxPQ0tdID0gISF0ZW1wbGF0ZXMuZGVmYXVsdCwg
X2NyZWF0ZU9wdGlvbnMpOworCisgICAgY29uZmlndXJlVGFnTmFtZShhdHRycywgdGFnTmFtZSwg
Y29tcG9uZW50LCBpc0FuZ2xlQnJhY2tldCwgY3JlYXRlT3B0aW9ucyk7CisKKyAgICAvLyBNYXAg
cGFzc2VkIGF0dHJpYnV0ZXMgKGUuZy4gPG15LWNvbXBvbmVudCBpZD0iZm9vIj4pIHRvIGNvbXBv
bmVudAorICAgIC8vIHByb3BlcnRpZXMgKHsgaWQ6ICJmb28iIH0pLgorICAgIGNvbmZpZ3VyZUNy
ZWF0ZU9wdGlvbnMoYXR0cnMsIGNyZWF0ZU9wdGlvbnMpOworCisgICAgLy8gSWYgdGhlcmUgaXMg
YSBjb250cm9sbGVyIG9uIHRoZSBzY29wZSwgcGx1Y2sgaXQgb2ZmIGFuZCBzYXZlIGl0IG9uIHRo
ZQorICAgIC8vIGNvbXBvbmVudC4gVGhpcyBhbGxvd3MgdGhlIGNvbXBvbmVudCB0byB0YXJnZXQg
YWN0aW9ucyBzZW50IHZpYQorICAgIC8vIGBzZW5kQWN0aW9uYCBjb3JyZWN0bHkuCisgICAgaWYg
KHBhcmVudFNjb3BlLmhhc0xvY2FsKCdjb250cm9sbGVyJykpIHsKKyAgICAgIGNyZWF0ZU9wdGlv
bnMuX2NvbnRyb2xsZXIgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChwYXJl
bnRTY29wZS5nZXRMb2NhbCgnY29udHJvbGxlcicpKTsKKyAgICB9IGVsc2UgeworICAgICAgY3Jl
YXRlT3B0aW9ucy5fdGFyZ2V0T2JqZWN0ID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRl
ZmF1bHQocGFyZW50U2NvcGUuZ2V0U2VsZigpKTsKKyAgICB9CisKKyAgICBfZW1iZXJIdG1sYmFy
c1V0aWxzRXh0cmFjdFBvc2l0aW9uYWxQYXJhbXMuZGVmYXVsdChyZW5kZXJOb2RlLCBjb21wb25l
bnQsIHBhcmFtcywgYXR0cnMpOworCisgICAgLy8gSW5zdGFudGlhdGUgdGhlIGNvbXBvbmVudAor
ICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0
LCBjcmVhdGVPcHRpb25zLCByZW5kZXJOb2RlLCBlbnYsIGF0dHJzKTsKKworICAgIC8vIElmIHRo
ZSBjb21wb25lbnQgc3BlY2lmaWVzIGl0cyBsYXlvdXQgdmlhIHRoZSBgbGF5b3V0YCBwcm9wZXJ0
eQorICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgdGhlIHRlbXBsYXRlIGxvb2tlZCB1cCBpbiB0aGUg
Y29udGFpbmVyLCBnZXQgaXQKKyAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBjb21wb25lbnQg
aW5zdGFuY2UuCisgICAgaWYgKCFsYXlvdXQpIHsKKyAgICAgIGxheW91dCA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChjb21wb25lbnQsICdsYXlvdXQnKTsKKyAgICB9CisKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLnJ1bkluRGVidWcoZnVuY3Rpb24gKCkgeworICAgICAgaWYgKGlzQW5nbGVC
cmFja2V0KSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IGlu
dm9rZSB0aGUgXCcnICsgdGFnTmFtZSArICdcJyBjb21wb25lbnQgd2l0aCBhbmdsZSBicmFja2V0
cywgYmVjYXVzZSBpdFwncyBhIHN1YmNsYXNzIG9mIENvbXBvbmVudC4gUGxlYXNlIHVwZ3JhZGUg
dG8gR2xpbW1lckNvbXBvbmVudC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnZva2UgYXMgXCd7
eycgKyB0YWdOYW1lICsgJ319XCcuJywgY29tcG9uZW50LmlzR2xpbW1lckNvbXBvbmVudCk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5v
dCBpbnZva2UgdGhlIFwnJyArIHRhZ05hbWUgKyAnXCcgY29tcG9uZW50IHdpdGggY3VybHkgYnJh
Y2VzLCBiZWNhdXNlIGl0XCdzIGEgc3ViY2xhc3Mgb2YgR2xpbW1lckNvbXBvbmVudC4gUGxlYXNl
IGludm9rZSBpdCBhcyBcJzwnICsgdGFnTmFtZSArICc+XCcgaW5zdGVhZC4nLCAhY29tcG9uZW50
LmlzR2xpbW1lckNvbXBvbmVudCk7CisgICAgICB9CisKKyAgICAgIGlmICghbGF5b3V0KSB7Cisg
ICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGZyYWdtZW50UmVhc29uID0gbGF5
b3V0Lm1ldGEuZnJhZ21lbnRSZWFzb247CisgICAgICBpZiAoaXNBbmdsZUJyYWNrZXQgJiYgZnJh
Z21lbnRSZWFzb24pIHsKKyAgICAgICAgc3dpdGNoIChmcmFnbWVudFJlYXNvbi5uYW1lKSB7Cisg
ICAgICAgICAgY2FzZSAnbWlzc2luZy13cmFwcGVyJzoKKyAgICAgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdUaGUgPCcgKyB0YWdOYW1lICsgJz4gdGVtcGxhdGUgbXVzdCBoYXZlIGEg
c2luZ2xlIHRvcC1sZXZlbCBlbGVtZW50IGJlY2F1c2UgaXQgaXMgYSBHbGltbWVyQ29tcG9uZW50
LicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbW9kaWZpZXJzJzoKKyAg
ICAgICAgICAgIHZhciBtb2RpZmllcnMgPSBmcmFnbWVudFJlYXNvbi5tb2RpZmllcnMubWFwKGZ1
bmN0aW9uIChtKSB7CisgICAgICAgICAgICAgIHJldHVybiAne3snICsgbSArICcgLi4ufX0nOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IGNhbm5vdCB1c2UgJyArIG1vZGlmaWVycy5qb2luKCcsICcpICsgJyBpbiB0aGUgdG9wLWxldmVs
IGVsZW1lbnQgb2YgdGhlIDwnICsgdGFnTmFtZSArICc+IHRlbXBsYXRlIGJlY2F1c2UgaXQgaXMg
YSBHbGltbWVyQ29tcG9uZW50LicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2Fz
ZSAndHJpcGxlLWN1cmxpZXMnOgorICAgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQo
J1lvdSBjYW5ub3QgdXNlIHRyaXBsZSBjdXJsaWVzIChlLmcuIHN0eWxlPXt7eyAuLi4gfX19KSBp
biB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgdGhlIDwnICsgdGFnTmFtZSArICc+IHRlbXBsYXRl
IGJlY2F1c2UgaXQgaXMgYSBHbGltbWVyQ29tcG9uZW50LicpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciByZXN1bHRzID0gX2VtYmVy
Vmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmRlZmF1bHQoeyBsYXlvdXQ6IGxheW91
dCwgY29tcG9uZW50OiBjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0OiBpc0FuZ2xlQnJhY2tldCB9
LCBhdHRycywgeyB0ZW1wbGF0ZXM6IHRlbXBsYXRlcywgc2NvcGU6IHBhcmVudFNjb3BlIH0pOwor
CisgICAgcmV0dXJuIG5ldyBDb21wb25lbnROb2RlTWFuYWdlcihjb21wb25lbnQsIGlzQW5nbGVC
cmFja2V0LCBwYXJlbnRTY29wZSwgcmVuZGVyTm9kZSwgYXR0cnMsIHJlc3VsdHMuYmxvY2ssIHJl
c3VsdHMuY3JlYXRlZEVsZW1lbnQpOworICB9OworCisgIGZ1bmN0aW9uIGNvbmZpZ3VyZVRhZ05h
bWUoYXR0cnMsIHRhZ05hbWUsIGNvbXBvbmVudCwgaXNBbmdsZUJyYWNrZXQsIGNyZWF0ZU9wdGlv
bnMpIHsKKyAgICBpZiAoaXNBbmdsZUJyYWNrZXQpIHsKKyAgICAgIGNyZWF0ZU9wdGlvbnMudGFn
TmFtZSA9IHRhZ05hbWU7CisgICAgfSBlbHNlIGlmIChhdHRycy50YWdOYW1lKSB7CisgICAgICBj
cmVhdGVPcHRpb25zLnRhZ05hbWUgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVs
dChhdHRycy50YWdOYW1lKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjb25maWd1cmVDcmVh
dGVPcHRpb25zKGF0dHJzLCBjcmVhdGVPcHRpb25zKSB7CisgICAgLy8gU29tZSBhdHRycyBhcmUg
c3BlY2lhbCBhbmQgbmVlZCB0byBiZSBzZXQgYXMgcHJvcGVydGllcyBvbiB0aGUgY29tcG9uZW50
CisgICAgLy8gaW5zdGFuY2UuIE1ha2Ugc3VyZSB3ZSB1c2UgZ2V0VmFsdWUoKSB0byBnZXQgdGhl
bSBmcm9tIGBhdHRyc2Agc2luY2UKKyAgICAvLyB0aGV5IGFyZSBzdGlsbCBzdHJlYW1zLgorICAg
IGlmIChhdHRycy5pZCkgeworICAgICAgY3JlYXRlT3B0aW9ucy5lbGVtZW50SWQgPSBfZW1iZXJI
dG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCk7CisgICAgfQorICAgIGlmIChh
dHRycy5fZGVmYXVsdFRhZ05hbWUpIHsKKyAgICAgIGNyZWF0ZU9wdGlvbnMuX2RlZmF1bHRUYWdO
YW1lID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0cnMuX2RlZmF1bHRU
YWdOYW1lKTsKKyAgICB9CisgICAgaWYgKGF0dHJzLnZpZXdOYW1lKSB7CisgICAgICBjcmVhdGVP
cHRpb25zLnZpZXdOYW1lID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0
cnMudmlld05hbWUpOworICAgIH0KKyAgfQorCisgIENvbXBvbmVudE5vZGVNYW5hZ2VyLnByb3Rv
dHlwZS5yZW5kZXIgPSBmdW5jdGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9yZW5kZXIoX2Vudiwg
dmlzaXRvcikgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDsKKworICAgIHJl
dHVybiBfZW1iZXJIdG1sYmFyc1N5c3RlbUluc3RydW1lbnRhdGlvblN1cHBvcnQuaW5zdHJ1bWVu
dChjb21wb25lbnQsIGZ1bmN0aW9uIENvbXBvbmVudE5vZGVNYW5hZ2VyX3JlbmRlcl9pbnN0cnVt
ZW50KCkgeworICAgICAgdmFyIG1ldGEgPSB0aGlzLmJsb2NrICYmIHRoaXMuYmxvY2sudGVtcGxh
dGUubWV0YTsKKyAgICAgIHZhciBlbnYgPSBfZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50LCBt
ZXRhKTsKKworICAgICAgZW52LnJlbmRlcmVyLmNvbXBvbmVudFdpbGxSZW5kZXIoY29tcG9uZW50
KTsKKyAgICAgIGVudi5yZW5kZXJlZFZpZXdzLnB1c2goY29tcG9uZW50LmVsZW1lbnRJZCk7CisK
KyAgICAgIGlmICh0aGlzLmJsb2NrKSB7CisgICAgICAgIHRoaXMuYmxvY2suaW52b2tlKGVudiwg
W10sIHVuZGVmaW5lZCwgdGhpcy5yZW5kZXJOb2RlLCB0aGlzLnNjb3BlLCB2aXNpdG9yKTsKKyAg
ICAgIH0KKworICAgICAgdmFyIGVsZW1lbnQgPSB1bmRlZmluZWQ7CisgICAgICBpZiAodGhpcy5l
eHBlY3RFbGVtZW50IHx8IGNvbXBvbmVudC5pc0dsaW1tZXJDb21wb25lbnQpIHsKKyAgICAgICAg
Ly8gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBHbGltbWVyIGNvbXBvbmVudHMgYXJlIG5ldmVyIGZy
YWdtZW50cy4gV2hlbgorICAgICAgICAvLyBHbGltbWVyIGNvbXBvbmVudHMgZ2FpbiBmcmFnbWVu
dCBwb3dlcnMsIHdlIHdpbGwgbmVlZCB0byBjb21tdW5pY2F0ZQorICAgICAgICAvLyB3aGV0aGVy
IHRoZSBsYXlvdXQgcHJvZHVjZWQgYSBzaW5nbGUgdG9wLWxldmVsIG5vZGUgb3IgZnJhZ21lbnQK
KyAgICAgICAgLy8gc29tZWhvdyAoZWl0aGVyIHZpYSBzdGF0aWMgaW5mb3JtYXRpb24gb24gdGhl
IHRlbXBsYXRlL2NvbXBvbmVudCwgb3IKKyAgICAgICAgLy8gZHluYW1pY2FsbHkgYXMgdGhlIGxh
eW91dCBpcyBiZWluZyByZW5kZXJlZCkuCisgICAgICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlck5v
ZGUuZmlyc3ROb2RlOworCisgICAgICAgIC8vIEdsaW1tZXIgY29tcG9uZW50cyBtYXkgaGF2ZSB3
aGl0ZXNwYWNlIG9yIGJvdW5kYXJ5IG5vZGVzIGFyb3VuZCB0aGUKKyAgICAgICAgLy8gdG9wLWxl
dmVsIGVsZW1lbnQuCisgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09
IDEpIHsKKyAgICAgICAgICBlbGVtZW50ID0gbmV4dEVsZW1lbnRTaWJsaW5nKGVsZW1lbnQpOwor
ICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEluIGVudmlyb25tZW50cyBsaWtlIEZhc3RC
b290LCBkaXNhYmxlIGFueSBob29rcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBjb21wb25lbnQKKyAg
ICAgIC8vIHRvIGFjY2VzcyB0aGUgRE9NIGRpcmVjdGx5LgorICAgICAgaWYgKGVudi5kZXN0aW5l
ZEZvckRPTSkgeworICAgICAgICBlbnYucmVuZGVyZXIuZGlkQ3JlYXRlRWxlbWVudChjb21wb25l
bnQsIGVsZW1lbnQpOworICAgICAgICBlbnYucmVuZGVyZXIud2lsbEluc2VydEVsZW1lbnQoY29t
cG9uZW50LCBlbGVtZW50KTsKKworICAgICAgICBlbnYubGlmZWN5Y2xlSG9va3MucHVzaCh7IHR5
cGU6ICdkaWRJbnNlcnRFbGVtZW50JywgdmlldzogY29tcG9uZW50IH0pOworICAgICAgfQorICAg
IH0sIHRoaXMpOworICB9OworCisgIGZ1bmN0aW9uIG5leHRFbGVtZW50U2libGluZyhub2RlKSB7
CisgICAgdmFyIGN1cnJlbnQgPSBub2RlOworCisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAg
IGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSAxKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50Owor
ICAgICAgfQorICAgICAgY3VycmVudCA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgfQorICB9CisK
KyAgQ29tcG9uZW50Tm9kZU1hbmFnZXIucHJvdG90eXBlLnJlcmVuZGVyID0gZnVuY3Rpb24gQ29t
cG9uZW50Tm9kZU1hbmFnZXJfcmVyZW5kZXIoX2VudiwgYXR0cnMsIHZpc2l0b3IpIHsKKyAgICB2
YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7CisKKyAgICByZXR1cm4gX2VtYmVySHRtbGJh
cnNTeXN0ZW1JbnN0cnVtZW50YXRpb25TdXBwb3J0Lmluc3RydW1lbnQoY29tcG9uZW50LCBmdW5j
dGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9yZXJlbmRlcl9pbnN0cnVtZW50KCkgeworICAgICAg
dmFyIGVudiA9IF9lbnYuY2hpbGRXaXRoVmlldyhjb21wb25lbnQpOworCisgICAgICB2YXIgc25h
cHNob3QgPSB0YWtlU25hcHNob3QoYXR0cnMpOworCisgICAgICBpZiAoY29tcG9uZW50Ll9yZW5k
ZXJOb2RlLnNob3VsZFJlY2VpdmVBdHRycykgeworICAgICAgICBpZiAoY29tcG9uZW50Ll9wcm9w
YWdhdGVBdHRyc1RvVGhpcykgeworICAgICAgICAgIGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNU
b1RoaXModGFrZUxlZ2FjeVNuYXBzaG90KGF0dHJzKSk7CisgICAgICAgIH0KKworICAgICAgICBl
bnYucmVuZGVyZXIuY29tcG9uZW50VXBkYXRlQXR0cnMoY29tcG9uZW50LCBzbmFwc2hvdCk7Cisg
ICAgICAgIGNvbXBvbmVudC5fcmVuZGVyTm9kZS5zaG91bGRSZWNlaXZlQXR0cnMgPSBmYWxzZTsK
KyAgICAgIH0KKworICAgICAgLy8gTm90aWZ5IGNvbXBvbmVudCB0aGF0IGl0IGhhcyBiZWNvbWUg
ZGlydHkgYW5kIGlzIGFib3V0IHRvIGNoYW5nZS4KKyAgICAgIGVudi5yZW5kZXJlci5jb21wb25l
bnRXaWxsVXBkYXRlKGNvbXBvbmVudCwgc25hcHNob3QpOworICAgICAgZW52LnJlbmRlcmVyLmNv
bXBvbmVudFdpbGxSZW5kZXIoY29tcG9uZW50KTsKKworICAgICAgZW52LnJlbmRlcmVkVmlld3Mu
cHVzaChjb21wb25lbnQuZWxlbWVudElkKTsKKworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAg
ICAgICAgdGhpcy5ibG9jay5pbnZva2UoZW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5v
ZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3IpOworICAgICAgfQorCisgICAgICBlbnYubGlmZWN5Y2xl
SG9va3MucHVzaCh7IHR5cGU6ICdkaWRVcGRhdGUnLCB2aWV3OiBjb21wb25lbnQgfSk7CisKKyAg
ICAgIHJldHVybiBlbnY7CisgICAgfSwgdGhpcyk7CisgIH07CisKKyAgQ29tcG9uZW50Tm9kZU1h
bmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBDb21wb25lbnROb2RlTWFuYWdlcl9k
ZXN0cm95KCkgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDsKKworICAgIC8v
IENsZWFyIGNvbXBvbmVudCdzIHJlbmRlciBub2RlLiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYXJl
ZAorICAgIC8vIGR1cmluZyB2aWV3IGRlc3RydWN0aW9uLCBidXQgaW4gdGhpcyBjYXNlIHdlJ3Jl
IHJlLWFzc2lnbmluZyB0aGUKKyAgICAvLyBub2RlIHRvIGEgZGlmZmVyZW50IHZpZXcgYW5kIGl0
IHdpbGwgZ2V0IGNsZWFuZWQgdXAgYXV0b21hdGljYWxseS4KKyAgICBjb21wb25lbnQuX3JlbmRl
ck5vZGUgPSBudWxsOworICAgIGNvbXBvbmVudC5kZXN0cm95KCk7CisgIH07CisKKyAgZnVuY3Rp
b24gY3JlYXRlQ29tcG9uZW50KF9jb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBwcm9wcywgcmVu
ZGVyTm9kZSwgZW52KSB7CisgICAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA8PSA1IHx8
IGFyZ3VtZW50c1s1XSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbNV07CisKKyAgICBp
ZiAoIWlzQW5nbGVCcmFja2V0KSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY29u
dHJvbGxlcj0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCcsICEoJ2NvbnRyb2xsZXInIGluIGF0dHJz
KSk7CisKKyAgICAgIHNuYXBzaG90QW5kVXBkYXRlVGFyZ2V0KGF0dHJzLCBwcm9wcyk7CisgICAg
fSBlbHNlIHsKKyAgICAgIHByb3BzLmF0dHJzID0gdGFrZVNuYXBzaG90KGF0dHJzKTsKKworICAg
ICAgcHJvcHMuX2lzQW5nbGVCcmFja2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBfY29udGFpbmVy
T3duZXIuc2V0T3duZXIocHJvcHMsIGVudi5vd25lcik7CisgICAgcHJvcHMucmVuZGVyZXIgPSBw
cm9wcy5wYXJlbnRWaWV3ID8gcHJvcHMucGFyZW50Vmlldy5yZW5kZXJlciA6IGVudi5vd25lci5s
b29rdXAoJ3JlbmRlcmVyOi1kb20nKTsKKyAgICBwcm9wcy5fdmlld1JlZ2lzdHJ5ID0gcHJvcHMu
cGFyZW50VmlldyA/IHByb3BzLnBhcmVudFZpZXcuX3ZpZXdSZWdpc3RyeSA6IGVudi5vd25lci5s
b29rdXAoJy12aWV3LXJlZ2lzdHJ5Om1haW4nKTsKKworICAgIHZhciBjb21wb25lbnQgPSBfY29t
cG9uZW50LmNyZWF0ZShwcm9wcyk7CisKKyAgICBpZiAocHJvcHMucGFyZW50VmlldykgeworICAg
ICAgcHJvcHMucGFyZW50Vmlldy5hcHBlbmRDaGlsZChjb21wb25lbnQpOworCisgICAgICBpZiAo
cHJvcHMudmlld05hbWUpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHBy
b3BzLnBhcmVudFZpZXcsIHByb3BzLnZpZXdOYW1lLCBjb21wb25lbnQpOworICAgICAgfQorICAg
IH0KKworICAgIGNvbXBvbmVudC5fcmVuZGVyTm9kZSA9IHJlbmRlck5vZGU7CisgICAgcmVuZGVy
Tm9kZS5lbWJlclZpZXcgPSBjb21wb25lbnQ7CisgICAgcmVuZGVyTm9kZS5idWlsZENoaWxkRW52
ID0gYnVpbGRDaGlsZEVudjsKKyAgICByZXR1cm4gY29tcG9uZW50OworICB9CisKKyAgZnVuY3Rp
b24gdGFrZVNuYXBzaG90KGF0dHJzKSB7CisgICAgdmFyIGhhc2ggPSB7fTsKKworICAgIGZvciAo
dmFyIHByb3AgaW4gYXR0cnMpIHsKKyAgICAgIGhhc2hbcHJvcF0gPSBfZW1iZXJIdG1sYmFyc0hv
b2tzR2V0Q2VsbE9yVmFsdWUuZGVmYXVsdChhdHRyc1twcm9wXSk7CisgICAgfQorCisgICAgcmV0
dXJuIGhhc2g7CisgIH0KKworICBmdW5jdGlvbiB0YWtlTGVnYWN5U25hcHNob3QoYXR0cnMpIHsK
KyAgICB2YXIgaGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBhdHRycykgeworICAg
ICAgaGFzaFtwcm9wXSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KGF0dHJz
W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIGZ1bmN0aW9uIHNu
YXBzaG90QW5kVXBkYXRlVGFyZ2V0KHJhd0F0dHJzLCB0YXJnZXQpIHsKKyAgICB2YXIgYXR0cnMg
PSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gcmF3QXR0cnMpIHsKKyAgICAgIHZhciB2YWx1
ZSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZhdWx0KHJhd0F0dHJzW3By
b3BdKTsKKyAgICAgIGF0dHJzW3Byb3BdID0gdmFsdWU7CisKKyAgICAgIC8vIHdoZW4gYGF0dHJz
YCBpcyBhbiBhY3R1YWwgdmFsdWUgYmVpbmcgc2V0IGluIHRoZQorICAgICAgLy8gYXR0cnMgaGFz
aCAoYHt7Zm9vLWJhciBhdHRycz0iYmxhaCJ9fWApIHdlIGNhbm5vdAorICAgICAgLy8gc2V0IGAi
YmxhaCJgIHRvIHRoZSByb290IG9mIHRoZSB0YXJnZXQgYmVjYXVzZQorICAgICAgLy8gdGhhdCB3
b3VsZCByZXBsYWNlIGFsbCBhdHRycyB3aXRoIGBhdHRycy5hdHRyc2AKKyAgICAgIGlmIChwcm9w
ID09PSAnYXR0cnMnKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcud2FybignSW52b2tpbmcg
YSBjb21wb25lbnQgd2l0aCBhIGhhc2ggYXR0cmlidXRlIG5hbWVkIGBhdHRyc2AgaXMgbm90IHN1
cHBvcnRlZC4gUGxlYXNlIHJlZmFjdG9yIHVzYWdlIG9mICcgKyB0YXJnZXQgKyAnIHRvIGF2b2lk
IHBhc3NpbmcgYGF0dHJzYCBhcyBhIGhhc2ggcGFyYW1ldGVyLicsIGZhbHNlLCB7IGlkOiAnZW1i
ZXItaHRtbGJhcnMuY29tcG9uZW50LXVuc3VwcG9ydGVkLWF0dHJzJyB9KTsKKyAgICAgICAgY29u
dGludWU7CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVtfZW1iZXJWaWV3c0Nv
bXBhdEF0dHJzUHJveHkuTVVUQUJMRV9DRUxMXSkgeworICAgICAgICB2YWx1ZSA9IHZhbHVlLnZh
bHVlOworICAgICAgfQorCisgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdGFyZ2V0LmF0dHJzID0gYXR0cnM7CisgIH0KKworICBmdW5jdGlvbiBidWlsZENo
aWxkRW52KHN0YXRlLCBlbnYpIHsKKyAgICByZXR1cm4gZW52LmNoaWxkV2l0aFZpZXcodGhpcy5l
bWJlclZpZXcpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvbm9kZS1tYW5hZ2Vy
cy92aWV3LW5vZGUtbWFuYWdlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAn
ZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItdmlld3Mvc3lzdGVtL2J1aWxkLWNvbXBvbmVudC10
ZW1wbGF0ZScsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfc2V0JywgJ2VtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLXZpZXdzL3ZpZXdz
L3ZpZXcnLCAnZW1iZXItdmlld3MvY29tcGF0L2F0dHJzLXByb3h5JywgJ2VtYmVyLWh0bWxiYXJz
L2hvb2tzL2dldC1jZWxsLW9yLXZhbHVlJywgJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVt
ZW50YXRpb24tc3VwcG9ydCcsICdlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL2NvbXBvbmVu
dC1ub2RlLW1hbmFnZXInLCAnY29udGFpbmVyL293bmVyJywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tz
L2dldC12YWx1ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJl
ck1ldGFsRGVidWcsIF9lbWJlclZpZXdzU3lzdGVtQnVpbGRDb21wb25lbnRUZW1wbGF0ZSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRh
bFNldF9wcm9wZXJ0aWVzLCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2VtYmVyVmlld3NDb21wYXRB
dHRyc1Byb3h5LCBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0Q2VsbE9yVmFsdWUsIF9lbWJlckh0bWxi
YXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCwgX2VtYmVySHRtbGJhcnNOb2RlTWFuYWdl
cnNDb21wb25lbnROb2RlTWFuYWdlciwgX2NvbnRhaW5lck93bmVyLCBfZW1iZXJIdG1sYmFyc0hv
b2tzR2V0VmFsdWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuY3JlYXRlT3JVcGRh
dGVDb21wb25lbnQgPSBjcmVhdGVPclVwZGF0ZUNvbXBvbmVudDsKKworICBmdW5jdGlvbiBWaWV3
Tm9kZU1hbmFnZXIoY29tcG9uZW50LCBzY29wZSwgcmVuZGVyTm9kZSwgYmxvY2ssIGV4cGVjdEVs
ZW1lbnQpIHsKKyAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICB0aGlzLnNjb3Bl
ID0gc2NvcGU7CisgICAgdGhpcy5yZW5kZXJOb2RlID0gcmVuZGVyTm9kZTsKKyAgICB0aGlzLmJs
b2NrID0gYmxvY2s7CisgICAgdGhpcy5leHBlY3RFbGVtZW50ID0gZXhwZWN0RWxlbWVudDsKKyAg
fQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IFZpZXdOb2RlTWFuYWdlcjsKKworICBWaWV3Tm9kZU1h
bmFnZXIuY3JlYXRlID0gZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX2NyZWF0ZShyZW5kZXJOb2Rl
LCBlbnYsIGF0dHJzLCBmb3VuZCwgcGFyZW50VmlldywgcGF0aCwgY29udGVudFNjb3BlLCBjb250
ZW50VGVtcGxhdGUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnSFRNTEJhcnMgZXJy
b3I6IENvdWxkIG5vdCBmaW5kIGNvbXBvbmVudCBuYW1lZCAiJyArIHBhdGggKyAnIiAobm8gY29t
cG9uZW50IG9yIHRlbXBsYXRlIHdpdGggdGhhdCBuYW1lIHdhcyBmb3VuZCknLCAhIShmdW5jdGlv
biAoKSB7CisgICAgICBpZiAocGF0aCkgeworICAgICAgICByZXR1cm4gZm91bmQuY29tcG9uZW50
IHx8IGZvdW5kLmxheW91dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmb3VuZC5j
b21wb25lbnQgfHwgZm91bmQubGF5b3V0IHx8IGNvbnRlbnRUZW1wbGF0ZTsKKyAgICAgIH0KKyAg
ICB9KSgpKTsKKworICAgIHZhciBjb21wb25lbnQ7CisgICAgdmFyIGNvbXBvbmVudEluZm8gPSB7
IGxheW91dDogZm91bmQubGF5b3V0IH07CisKKyAgICBpZiAoZm91bmQuY29tcG9uZW50KSB7Cisg
ICAgICB2YXIgb3B0aW9ucyA9IHsgcGFyZW50VmlldzogcGFyZW50VmlldyB9OworCisgICAgICBp
ZiAoYXR0cnMgJiYgYXR0cnMuaWQpIHsKKyAgICAgICAgb3B0aW9ucy5lbGVtZW50SWQgPSBfZW1i
ZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCk7CisgICAgICB9CisgICAg
ICBpZiAoYXR0cnMgJiYgYXR0cnMudGFnTmFtZSkgeworICAgICAgICBvcHRpb25zLnRhZ05hbWUg
PSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy50YWdOYW1lKTsKKyAg
ICAgIH0KKyAgICAgIGlmIChhdHRycyAmJiBhdHRycy5fZGVmYXVsdFRhZ05hbWUpIHsKKyAgICAg
ICAgb3B0aW9ucy5fZGVmYXVsdFRhZ05hbWUgPSBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUu
ZGVmYXVsdChhdHRycy5fZGVmYXVsdFRhZ05hbWUpOworICAgICAgfQorICAgICAgaWYgKGF0dHJz
ICYmIGF0dHJzLnZpZXdOYW1lKSB7CisgICAgICAgIG9wdGlvbnMudmlld05hbWUgPSBfZW1iZXJI
dG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy52aWV3TmFtZSk7CisgICAgICB9CisK
KyAgICAgIGlmIChmb3VuZC5jb21wb25lbnQuY3JlYXRlICYmIGNvbnRlbnRTY29wZSkgeworICAg
ICAgICB2YXIgX3NlbGYgPSBjb250ZW50U2NvcGUuZ2V0U2VsZigpOworICAgICAgICBpZiAoX3Nl
bGYpIHsKKyAgICAgICAgICBvcHRpb25zLl9jb250ZXh0ID0gX2VtYmVySHRtbGJhcnNIb29rc0dl
dFZhbHVlLmRlZmF1bHQoY29udGVudFNjb3BlLmdldFNlbGYoKSk7CisgICAgICAgIH0KKyAgICAg
IH0KKworICAgICAgaWYgKGZvdW5kLnNlbGYpIHsKKyAgICAgICAgb3B0aW9ucy5fY29udGV4dCA9
IF9lbWJlckh0bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KGZvdW5kLnNlbGYpOworICAgICAg
fQorCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRJbmZvLmNvbXBvbmVudCA9IGNyZWF0ZU9y
VXBkYXRlQ29tcG9uZW50KGZvdW5kLmNvbXBvbmVudCwgb3B0aW9ucywgZm91bmQuY3JlYXRlT3B0
aW9ucywgcmVuZGVyTm9kZSwgZW52LCBhdHRycyk7CisKKyAgICAgIHZhciBsYXlvdXQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoY29tcG9uZW50LCAnbGF5b3V0Jyk7CisgICAgICBpZiAo
bGF5b3V0KSB7CisgICAgICAgIGNvbXBvbmVudEluZm8ubGF5b3V0ID0gbGF5b3V0OworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgY29tcG9uZW50SW5mby5sYXlvdXQgPSBnZXRUZW1wbGF0ZShjb21w
b25lbnQpIHx8IGNvbXBvbmVudEluZm8ubGF5b3V0OworICAgICAgfQorCisgICAgICByZW5kZXJO
b2RlLmVtYmVyVmlldyA9IGNvbXBvbmVudDsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydCgnQlVHOiBWaWV3Tm9kZU1hbmFnZXIuY3JlYXRlIGNhbiB0YWtlIGEgc2NvcGUgb3Ig
YSBzZWxmLCBidXQgbm90IGJvdGgnLCAhKGNvbnRlbnRTY29wZSAmJiBmb3VuZC5zZWxmKSk7CisK
KyAgICB2YXIgcmVzdWx0cyA9IF9lbWJlclZpZXdzU3lzdGVtQnVpbGRDb21wb25lbnRUZW1wbGF0
ZS5kZWZhdWx0KGNvbXBvbmVudEluZm8sIGF0dHJzLCB7CisgICAgICB0ZW1wbGF0ZXM6IHsgZGVm
YXVsdDogY29udGVudFRlbXBsYXRlIH0sCisgICAgICBzY29wZTogY29udGVudFNjb3BlLAorICAg
ICAgc2VsZjogZm91bmQuc2VsZgorICAgIH0pOworCisgICAgcmV0dXJuIG5ldyBWaWV3Tm9kZU1h
bmFnZXIoY29tcG9uZW50LCBjb250ZW50U2NvcGUsIHJlbmRlck5vZGUsIHJlc3VsdHMuYmxvY2ss
IHJlc3VsdHMuY3JlYXRlZEVsZW1lbnQpOworICB9OworCisgIFZpZXdOb2RlTWFuYWdlci5wcm90
b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX3JlbmRlcihlbnYsIGF0dHJz
LCB2aXNpdG9yKSB7CisgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50OworCisgICAg
cmV0dXJuIF9lbWJlckh0bWxiYXJzU3lzdGVtSW5zdHJ1bWVudGF0aW9uU3VwcG9ydC5pbnN0cnVt
ZW50KGNvbXBvbmVudCwgZnVuY3Rpb24gVmlld05vZGVNYW5hZ2VyX3JlbmRlcl9pbnN0cnVtZW50
KCkgeworICAgICAgdmFyIG5ld0VudiA9IGVudjsKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAg
ICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50KTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHZhciBtZXRhID0gdGhpcy5ibG9jayAmJiB0aGlzLmJsb2NrLnRlbXBsYXRl
Lm1ldGE7CisKKyAgICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aE1ldGEobWV0YSk7CisgICAg
ICB9CisKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAgICAgICAgZW52LnJlbmRlcmVyLndpbGxS
ZW5kZXIoY29tcG9uZW50KTsKKyAgICAgICAgZW52LnJlbmRlcmVkVmlld3MucHVzaChjb21wb25l
bnQuZWxlbWVudElkKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAgICAg
ICAgdGhpcy5ibG9jay5pbnZva2UobmV3RW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5v
ZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3IpOworICAgICAgfQorCisgICAgICBpZiAoY29tcG9uZW50
KSB7CisgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5leHBlY3RFbGVtZW50ICYmIHRoaXMucmVu
ZGVyTm9kZS5maXJzdE5vZGU7CisKKyAgICAgICAgLy8gSW4gZW52aXJvbm1lbnRzIGxpa2UgRmFz
dEJvb3QsIGRpc2FibGUgYW55IGhvb2tzIHRoYXQgd291bGQgY2F1c2UgdGhlIGNvbXBvbmVudAor
ICAgICAgICAvLyB0byBhY2Nlc3MgdGhlIERPTSBkaXJlY3RseS4KKyAgICAgICAgaWYgKGVudi5k
ZXN0aW5lZEZvckRPTSkgeworICAgICAgICAgIGVudi5yZW5kZXJlci5kaWRDcmVhdGVFbGVtZW50
KGNvbXBvbmVudCwgZWxlbWVudCk7CisgICAgICAgICAgZW52LnJlbmRlcmVyLndpbGxJbnNlcnRF
bGVtZW50KGNvbXBvbmVudCwgZWxlbWVudCk7CisgICAgICAgICAgZW52LmxpZmVjeWNsZUhvb2tz
LnB1c2goeyB0eXBlOiAnZGlkSW5zZXJ0RWxlbWVudCcsIHZpZXc6IGNvbXBvbmVudCB9KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0sIHRoaXMpOworICB9OworCisgIFZpZXdOb2RlTWFuYWdl
ci5wcm90b3R5cGUucmVyZW5kZXIgPSBmdW5jdGlvbiBWaWV3Tm9kZU1hbmFnZXJfcmVyZW5kZXIo
ZW52LCBhdHRycywgdmlzaXRvcikgeworICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVu
dDsKKworICAgIHJldHVybiBfZW1iZXJIdG1sYmFyc1N5c3RlbUluc3RydW1lbnRhdGlvblN1cHBv
cnQuaW5zdHJ1bWVudChjb21wb25lbnQsIGZ1bmN0aW9uIFZpZXdOb2RlTWFuYWdlcl9yZXJlbmRl
cl9pbnN0cnVtZW50KCkgeworICAgICAgdmFyIG5ld0VudiA9IGVudjsKKyAgICAgIGlmIChjb21w
b25lbnQpIHsKKyAgICAgICAgbmV3RW52ID0gZW52LmNoaWxkV2l0aFZpZXcoY29tcG9uZW50KTsK
KworICAgICAgICB2YXIgc25hcHNob3QgPSB0YWtlU25hcHNob3QoYXR0cnMpOworCisgICAgICAg
IC8vIE5vdGlmeSBjb21wb25lbnQgdGhhdCBpdCBoYXMgYmVjb21lIGRpcnR5IGFuZCBpcyBhYm91
dCB0byBjaGFuZ2UuCisgICAgICAgIGVudi5yZW5kZXJlci53aWxsVXBkYXRlKGNvbXBvbmVudCwg
c25hcHNob3QpOworCisgICAgICAgIGlmIChjb21wb25lbnQuX3JlbmRlck5vZGUuc2hvdWxkUmVj
ZWl2ZUF0dHJzKSB7CisgICAgICAgICAgaWYgKGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNUb1Ro
aXMpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudC5fcHJvcGFnYXRlQXR0cnNUb1RoaXMoX2VtYmVy
SHRtbGJhcnNOb2RlTWFuYWdlcnNDb21wb25lbnROb2RlTWFuYWdlci50YWtlTGVnYWN5U25hcHNo
b3QoYXR0cnMpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnYucmVuZGVyZXIuY29tcG9u
ZW50VXBkYXRlQXR0cnMoY29tcG9uZW50LCBzbmFwc2hvdCk7CisgICAgICAgICAgY29tcG9uZW50
Ll9yZW5kZXJOb2RlLnNob3VsZFJlY2VpdmVBdHRycyA9IGZhbHNlOworICAgICAgICB9CisKKyAg
ICAgICAgZW52LnJlbmRlcmVyLndpbGxSZW5kZXIoY29tcG9uZW50KTsKKworICAgICAgICBlbnYu
cmVuZGVyZWRWaWV3cy5wdXNoKGNvbXBvbmVudC5lbGVtZW50SWQpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgdmFyIG1ldGEgPSB0aGlzLmJsb2NrICYmIHRoaXMuYmxvY2sudGVtcGxhdGUubWV0
YTsKKworICAgICAgICBuZXdFbnYgPSBlbnYuY2hpbGRXaXRoTWV0YShtZXRhKTsKKyAgICAgIH0K
KworICAgICAgaWYgKHRoaXMuYmxvY2spIHsKKyAgICAgICAgdGhpcy5ibG9jay5pbnZva2UobmV3
RW52LCBbXSwgdW5kZWZpbmVkLCB0aGlzLnJlbmRlck5vZGUsIHRoaXMuc2NvcGUsIHZpc2l0b3Ip
OworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3RW52OworICAgIH0sIHRoaXMpOworICB9Owor
CisgIFZpZXdOb2RlTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIFZpZXdOb2Rl
TWFuYWdlcl9kZXN0cm95KCkgeworICAgIGlmICh0aGlzLmNvbXBvbmVudCkgeworICAgICAgdGhp
cy5jb21wb25lbnQuZGVzdHJveSgpOworICAgICAgdGhpcy5jb21wb25lbnQgPSBudWxsOworICAg
IH0KKyAgfTsKKworICBmdW5jdGlvbiBnZXRUZW1wbGF0ZShjb21wb25lbnRPclZpZXcpIHsKKyAg
ICBpZiAoIWNvbXBvbmVudE9yVmlldy5pc0NvbXBvbmVudCkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldChjb21wb25lbnRPclZpZXcsICd0ZW1wbGF0ZScpOworICAg
IH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGVD
b21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLCBjcmVhdGVPcHRpb25zLCByZW5kZXJOb2RlLCBl
bnYpIHsKKyAgICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDUgfHwgYXJndW1lbnRz
WzVdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1s1XTsKKworICAgIHZhciBzbmFwc2hv
dCA9IHRha2VTbmFwc2hvdChhdHRycyk7CisgICAgdmFyIHByb3BzID0gX2VtYmVyTWV0YWxBc3Np
Z24uZGVmYXVsdCh7fSwgb3B0aW9ucyk7CisgICAgdmFyIGRlZmF1bHRDb250cm9sbGVyID0gX2Vt
YmVyVmlld3NWaWV3c1ZpZXcuZGVmYXVsdC5wcm90bygpLmNvbnRyb2xsZXI7CisgICAgdmFyIGhh
c1N1cHBsaWVkQ29udHJvbGxlciA9ICdjb250cm9sbGVyJyBpbiBhdHRycyB8fCAnY29udHJvbGxl
cicgaW4gcHJvcHM7CisKKyAgICBpZiAoIXByb3BzLm93bmVyVmlldyAmJiBvcHRpb25zLnBhcmVu
dFZpZXcpIHsKKyAgICAgIHByb3BzLm93bmVyVmlldyA9IG9wdGlvbnMucGFyZW50Vmlldy5vd25l
clZpZXc7CisgICAgfQorCisgICAgcHJvcHMuYXR0cnMgPSBzbmFwc2hvdDsKKyAgICBpZiAoY29t
cG9uZW50LmNyZWF0ZSkgeworICAgICAgdmFyIHByb3RvID0gY29tcG9uZW50LnByb3RvKCk7CisK
KyAgICAgIGlmIChjcmVhdGVPcHRpb25zKSB7CisgICAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRl
ZmF1bHQocHJvcHMsIGNyZWF0ZU9wdGlvbnMpOworICAgICAgfQorCisgICAgICBtZXJnZUJpbmRp
bmdzKHByb3BzLCBzbmFwc2hvdCk7CisKKyAgICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKwor
ICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKHByb3BzLCBvd25lcik7CisgICAgICBwcm9w
cy5yZW5kZXJlciA9IG9wdGlvbnMucGFyZW50VmlldyA/IG9wdGlvbnMucGFyZW50Vmlldy5yZW5k
ZXJlciA6IG93bmVyICYmIG93bmVyLmxvb2t1cCgncmVuZGVyZXI6LWRvbScpOworICAgICAgcHJv
cHMuX3ZpZXdSZWdpc3RyeSA9IG9wdGlvbnMucGFyZW50VmlldyA/IG9wdGlvbnMucGFyZW50Vmll
dy5fdmlld1JlZ2lzdHJ5IDogb3duZXIgJiYgb3duZXIubG9va3VwKCctdmlldy1yZWdpc3RyeTpt
YWluJyk7CisKKyAgICAgIGlmIChwcm90by5jb250cm9sbGVyICE9PSBkZWZhdWx0Q29udHJvbGxl
ciB8fCBoYXNTdXBwbGllZENvbnRyb2xsZXIpIHsKKyAgICAgICAgZGVsZXRlIHByb3BzLl9jb250
ZXh0OworICAgICAgfQorCisgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuY3JlYXRlKHByb3Bz
KTsKKyAgICB9IGVsc2UgeworICAgICAgZW52LnJlbmRlcmVyLmNvbXBvbmVudFVwZGF0ZUF0dHJz
KGNvbXBvbmVudCwgc25hcHNob3QpOworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJvcGVydGllcy5k
ZWZhdWx0KGNvbXBvbmVudCwgcHJvcHMpOworCisgICAgICBpZiAoY29tcG9uZW50Ll9wcm9wYWdh
dGVBdHRyc1RvVGhpcykgeworICAgICAgICBjb21wb25lbnQuX3Byb3BhZ2F0ZUF0dHJzVG9UaGlz
KF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIudGFrZUxlZ2Fj
eVNuYXBzaG90KGF0dHJzKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMucGFy
ZW50VmlldykgeworICAgICAgb3B0aW9ucy5wYXJlbnRWaWV3LmFwcGVuZENoaWxkKGNvbXBvbmVu
dCk7CisKKyAgICAgIGlmIChvcHRpb25zLnZpZXdOYW1lKSB7CisgICAgICAgIF9lbWJlck1ldGFs
UHJvcGVydHlfc2V0LnNldChvcHRpb25zLnBhcmVudFZpZXcsIG9wdGlvbnMudmlld05hbWUsIGNv
bXBvbmVudCk7CisgICAgICB9CisgICAgfQorCisgICAgY29tcG9uZW50Ll9yZW5kZXJOb2RlID0g
cmVuZGVyTm9kZTsKKworICAgIHJlbmRlck5vZGUuZW1iZXJWaWV3ID0gY29tcG9uZW50OworICAg
IHJldHVybiBjb21wb25lbnQ7CisgIH0KKworICBmdW5jdGlvbiB0YWtlU25hcHNob3QoYXR0cnMp
IHsKKyAgICB2YXIgaGFzaCA9IHt9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBhdHRycykgewor
ICAgICAgaGFzaFtwcm9wXSA9IF9lbWJlckh0bWxiYXJzSG9va3NHZXRDZWxsT3JWYWx1ZS5kZWZh
dWx0KGF0dHJzW3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIGZ1
bmN0aW9uIG1lcmdlQmluZGluZ3ModGFyZ2V0LCBhdHRycykgeworICAgIGZvciAodmFyIHByb3Ag
aW4gYXR0cnMpIHsKKyAgICAgIGlmICghYXR0cnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAg
ICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyB3aGVuIGBhdHRyc2AgaXMgYW4gYWN0
dWFsIHZhbHVlIGJlaW5nIHNldCBpbiB0aGUKKyAgICAgIC8vIGF0dHJzIGhhc2ggKGB7e2Zvby1i
YXIgYXR0cnM9ImJsYWgifX1gKSB3ZSBjYW5ub3QKKyAgICAgIC8vIHNldCBgImJsYWgiYCB0byB0
aGUgcm9vdCBvZiB0aGUgdGFyZ2V0IGJlY2F1c2UKKyAgICAgIC8vIHRoYXQgd291bGQgcmVwbGFj
ZSBhbGwgYXR0cnMgd2l0aCBgYXR0cnMuYXR0cnNgCisgICAgICBpZiAocHJvcCA9PT0gJ2F0dHJz
JykgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ0ludm9raW5nIGEgY29tcG9uZW50
IHdpdGggYSBoYXNoIGF0dHJpYnV0ZSBuYW1lZCBgYXR0cnNgIGlzIG5vdCBzdXBwb3J0ZWQuIFBs
ZWFzZSByZWZhY3RvciB1c2FnZSBvZiAnICsgdGFyZ2V0ICsgJyB0byBhdm9pZCBwYXNzaW5nIGBh
dHRyc2AgYXMgYSBoYXNoIHBhcmFtZXRlci4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLWh0bWxiYXJz
LnZpZXctdW5zdXBwb3J0ZWQtYXR0cnMnIH0pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0K
KyAgICAgIHZhciB2YWx1ZSA9IGF0dHJzW3Byb3BdOworCisgICAgICBpZiAodmFsdWUgJiYgdmFs
dWVbX2VtYmVyVmlld3NDb21wYXRBdHRyc1Byb3h5Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgICAg
dGFyZ2V0W3Byb3BdID0gdmFsdWUudmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YXJn
ZXRbcHJvcF0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGFyZ2V0Owor
ICB9Cit9KTsKKworLy8gSW4gdGhlb3J5IHRoaXMgc2hvdWxkIGNvbWUgdGhyb3VnaCB0aGUgZW52
LCBidXQgaXQgc2hvdWxkCisvLyBiZSBzYWZlIHRvIGltcG9ydCB0aGlzIHVudGlsIHdlIG1ha2Ug
dGhlIGhvb2sgc3lzdGVtIHB1YmxpYworLy8gYW5kIGl0IGdldHMgYWN0aXZlbHkgdXNlZCBpbiBh
ZGRvbnMgb3Igb3RoZXIgZG93bnN0cmVhbQorLy8gbGlicmFyaWVzLgorZW5pZmVkKCdlbWJlci1o
dG1sYmFycy9zdHJlYW1zL2J1aWx0LWluLWhlbHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0sIF9lbWJlckh0bWxiYXJzU3Ry
ZWFtc1V0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgQnVpbHRJbkhlbHBlclN0cmVh
bSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDog
ZnVuY3Rpb24gKGhlbHBlciwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZXMsIGVudiwgc2NvcGUsIGxh
YmVsKSB7CisgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKKyAgICAgIHRoaXMucGFyYW1zID0g
cGFyYW1zOworICAgICAgdGhpcy50ZW1wbGF0ZXMgPSB0ZW1wbGF0ZXM7CisgICAgICB0aGlzLmVu
diA9IGVudjsKKyAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgIHRoaXMuaGFzaCA9IGhh
c2g7CisgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLmhlbHBlcihfZW1iZXJIdG1sYmFyc1N0cmVh
bXNVdGlscy5nZXRBcnJheVZhbHVlcyh0aGlzLnBhcmFtcyksIF9lbWJlckh0bWxiYXJzU3RyZWFt
c1V0aWxzLmdldEhhc2hWYWx1ZXModGhpcy5oYXNoKSwgdGhpcy50ZW1wbGF0ZXMsIHRoaXMuZW52
LCB0aGlzLnNjb3BlKTsKKyAgICB9CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEJ1aWx0
SW5IZWxwZXJTdHJlYW07Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3RyZWFtcy9oZWxw
ZXItZmFjdG9yeScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdl
bWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbFN0cmVhbXNTdHJlYW0sIF9lbWJlckh0bWxiYXJzU3RyZWFtc1V0aWxzKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICB2YXIgSGVscGVyRmFjdG9yeVN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFt
c1N0cmVhbS5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGhlbHBlckZhY3Rv
cnksIHBhcmFtcywgaGFzaCwgbGFiZWwpIHsKKyAgICAgIHRoaXMuaGVscGVyRmFjdG9yeSA9IGhl
bHBlckZhY3Rvcnk7CisgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgIHRoaXMuaGFz
aCA9IGhhc2g7CisgICAgICB0aGlzLmxpbmthYmxlID0gdHJ1ZTsKKyAgICAgIHRoaXMuaGVscGVy
ID0gbnVsbDsKKyAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICB9LAorCisgICAgY29tcHV0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF0aGlzLmhlbHBlcikgeworICAgICAgICB0aGlz
LmhlbHBlciA9IHRoaXMuaGVscGVyRmFjdG9yeS5jcmVhdGUoeyBfc3RyZWFtOiB0aGlzIH0pOwor
ICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmNvbXB1dGUoX2VtYmVySHRtbGJhcnNT
dHJlYW1zVXRpbHMuZ2V0QXJyYXlWYWx1ZXModGhpcy5wYXJhbXMpLCBfZW1iZXJIdG1sYmFyc1N0
cmVhbXNVdGlscy5nZXRIYXNoVmFsdWVzKHRoaXMuaGFzaCkpOworICAgIH0sCisKKyAgICBkZWFj
dGl2YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnN1cGVyJGRlYWN0aXZhdGUoKTsKKyAg
ICAgIGlmICh0aGlzLmhlbHBlcikgeworICAgICAgICB0aGlzLmhlbHBlci5kZXN0cm95KCk7Cisg
ICAgICAgIHRoaXMuaGVscGVyID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorICAgIHN1cGVyJGRl
YWN0aXZhdGU6IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZhdWx0LnByb3RvdHlwZS5kZWFj
dGl2YXRlCisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEhlbHBlckZhY3RvcnlTdHJlYW07
Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3RyZWFtcy9oZWxwZXItaW5zdGFuY2UnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItaHRtbGJhcnMv
c3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxTdHJlYW1zU3Ry
ZWFtLCBfZW1iZXJIdG1sYmFyc1N0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAg
dmFyIEhlbHBlckluc3RhbmNlU3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1
bHQuZXh0ZW5kKHsKKyAgICBpbml0OiBmdW5jdGlvbiAoaGVscGVyLCBwYXJhbXMsIGhhc2gsIGxh
YmVsKSB7CisgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjsKKyAgICAgIHRoaXMucGFyYW1zID0g
cGFyYW1zOworICAgICAgdGhpcy5oYXNoID0gaGFzaDsKKyAgICAgIHRoaXMubGlua2FibGUgPSB0
cnVlOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0sCisKKyAgICBjb21wdXRlOiBm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuY29tcHV0ZShfZW1iZXJIdG1s
YmFyc1N0cmVhbXNVdGlscy5nZXRBcnJheVZhbHVlcyh0aGlzLnBhcmFtcyksIF9lbWJlckh0bWxi
YXJzU3RyZWFtc1V0aWxzLmdldEhhc2hWYWx1ZXModGhpcy5oYXNoKSk7CisgICAgfQorICB9KTsK
KworICBleHBvcnRzLmRlZmF1bHQgPSBIZWxwZXJJbnN0YW5jZVN0cmVhbTsKK30pOworZW5pZmVk
KCdlbWJlci1odG1sYmFycy9zdHJlYW1zL3V0aWxzJywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL2hvb2tzL2dldC12YWx1ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySHRtbGJhcnNI
b29rc0dldFZhbHVlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmdldEFycmF5VmFs
dWVzID0gZ2V0QXJyYXlWYWx1ZXM7CisgIGV4cG9ydHMuZ2V0SGFzaFZhbHVlcyA9IGdldEhhc2hW
YWx1ZXM7CisKKyAgLy8gV2UgZG9uJ3Qgd2FudCB0byBsZWFrIG11dGFibGUgY2VsbHMgaW50byBo
ZWxwZXJzLCB3aGljaAorICAvLyBhcmUgcHVyZSBmdW5jdGlvbnMgdGhhdCBjYW4gb25seSB3b3Jr
IHdpdGggdmFsdWVzLgorCisgIGZ1bmN0aW9uIGdldEFycmF5VmFsdWVzKHBhcmFtcykgeworICAg
IHZhciBsID0gcGFyYW1zLmxlbmd0aDsKKyAgICB2YXIgb3V0ID0gbmV3IEFycmF5KGwpOworCisg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKKyAgICAgIG91dFtpXSA9IF9lbWJlckh0
bWxiYXJzSG9va3NHZXRWYWx1ZS5kZWZhdWx0KHBhcmFtc1tpXSk7CisgICAgfQorCisgICAgcmV0
dXJuIG91dDsKKyAgfQorCisgIGZ1bmN0aW9uIGdldEhhc2hWYWx1ZXMoaGFzaCkgeworICAgIHZh
ciBvdXQgPSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgICAgb3V0W3By
b3BdID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoaGFzaFtwcm9wXSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJz
L3N5c3RlbS9hcHBlbmQtdGVtcGxhdGVkLXZpZXcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3Zp
ZXcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldykgeworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGFwcGVuZFRlbXBsYXRlZFZpZXc7CisKKyAgZnVuY3Rpb24g
YXBwZW5kVGVtcGxhdGVkVmlldyhwYXJlbnRWaWV3LCBtb3JwaCwgdmlld0NsYXNzT3JJbnN0YW5j
ZSwgcHJvcHMpIHsKKyAgICB2YXIgdmlld1Byb3RvOworICAgIGlmIChfZW1iZXJWaWV3c1ZpZXdz
Vmlldy5kZWZhdWx0LmRldGVjdEluc3RhbmNlKHZpZXdDbGFzc09ySW5zdGFuY2UpKSB7CisgICAg
ICB2aWV3UHJvdG8gPSB2aWV3Q2xhc3NPckluc3RhbmNlOworICAgIH0gZWxzZSB7CisgICAgICB2
aWV3UHJvdG8gPSB2aWV3Q2xhc3NPckluc3RhbmNlLnByb3RvKCk7CisgICAgfQorCisgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW5ub3QgcHJvdmlkZSBhIHRlbXBsYXRlIGJsb2Nr
IGlmIHlvdSBhbHNvIHNwZWNpZmllZCBhIHRlbXBsYXRlTmFtZScsICFwcm9wcy50ZW1wbGF0ZSB8
fCAhX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHByb3BzLCAndGVtcGxhdGVOYW1lJykgJiYg
IV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3UHJvdG8sICd0ZW1wbGF0ZU5hbWUnKSk7
CisKKyAgICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGBfY29udGV4dGAgY29tcHV0
ZWQgcHJvcGVydHkgaWYgdGhlcmUgaXMKKyAgICAvLyBubyBzcGVjaWZpZWQgY29udHJvbGxlci4g
U2VlIFZpZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgdmFyIG5vQ29udHJv
bGxlckluUHJvdG8gPSAhdmlld1Byb3RvLmNvbnRyb2xsZXI7CisgICAgaWYgKHZpZXdQcm90by5j
b250cm9sbGVyICYmIHZpZXdQcm90by5jb250cm9sbGVyLmlzRGVzY3JpcHRvcikgeworICAgICAg
bm9Db250cm9sbGVySW5Qcm90byA9IHRydWU7CisgICAgfQorICAgIGlmIChub0NvbnRyb2xsZXJJ
blByb3RvICYmICF2aWV3UHJvdG8uY29udHJvbGxlckJpbmRpbmcgJiYgIXByb3BzLmNvbnRyb2xs
ZXIgJiYgIXByb3BzLmNvbnRyb2xsZXJCaW5kaW5nKSB7CisgICAgICBwcm9wcy5fY29udGV4dCA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwYXJlbnRWaWV3LCAnY29udGV4dCcpOyAvLyBU
T0RPOiBpcyB0aGlzIHJpZ2h0PyEKKyAgICB9CisKKyAgICBwcm9wcy5fbW9ycGggPSBtb3JwaDsK
KworICAgIHJldHVybiBwYXJlbnRWaWV3LmFwcGVuZENoaWxkKHZpZXdDbGFzc09ySW5zdGFuY2Us
IHByb3BzKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9ib290c3Ry
YXAnLCBbJ2V4cG9ydHMnLCAnZW1iZXItdmlld3MvY29tcG9uZW50X2xvb2t1cCcsICdlbWJlci12
aWV3cy9zeXN0ZW0vanF1ZXJ5JywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL2xhenlfbG9hZCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY29tcGls
ZScsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci1odG1sYmFycy90ZW1wbGF0ZV9y
ZWdpc3RyeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVmlld3NDb21wb25lbnRfbG9va3Vw
LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyUnVudGlt
ZVN5c3RlbUxhenlfbG9hZCwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGUsIF9l
bWJlck1ldGFsRW52aXJvbm1lbnQsIF9lbWJlckh0bWxiYXJzVGVtcGxhdGVfcmVnaXN0cnkpIHsK
KyAgLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
KgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKwor
ICAvKioKKyAgICBGaW5kIHRlbXBsYXRlcyBzdG9yZWQgaW4gdGhlIGhlYWQgdGFnIGFzIHNjcmlw
dCB0YWdzIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlCisgICAgdG8gYEVtYmVyLkNvcmVWaWV3YCBp
biB0aGUgZ2xvYmFsIGBFbWJlci5URU1QTEFURVNgIG9iamVjdC4gVGhpcyB3aWxsIGJlIHJ1bgor
ICAgIGFzIGEgalF1ZXJ5IERPTS1yZWFkeSBjYWxsYmFjay4KKyAgCisgICAgU2NyaXB0IHRhZ3Mg
d2l0aCBgdGV4dC94LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKKyAgICB3aXRoIEVtYmVy
J3MgdGVtcGxhdGUgY29tcGlsZXIgYW5kIGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydz
IHRlbXBsYXRlLgorICAgIFRob3NlIHdpdGggdHlwZSBgdGV4dC94LXJhdy1oYW5kbGViYXJzYCB3
aWxsIGJlIGNvbXBpbGVkIHdpdGggcmVndWxhcgorICAgIEhhbmRsZWJhcnMgYW5kIGFyZSBzdWl0
YWJsZSBmb3IgdXNlIGluIHZpZXdzJyBjb21wdXRlZCBwcm9wZXJ0aWVzLgorICAKKyAgICBAcHJp
dmF0ZQorICAgIEBtZXRob2QgYm9vdHN0cmFwCisgICAgQGZvciBFbWJlci5IVE1MQmFycworICAg
IEBzdGF0aWMKKyAgICBAcGFyYW0gY3R4CisgICovCisgIGZ1bmN0aW9uIGJvb3RzdHJhcChjdHgp
IHsKKyAgICB2YXIgc2VsZWN0b3JzID0gJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyJd
LCBzY3JpcHRbdHlwZT0idGV4dC94LXJhdy1oYW5kbGViYXJzIl0nOworCisgICAgX2VtYmVyVmll
d3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWxlY3RvcnMsIGN0eCkuZWFjaChmdW5jdGlvbiAoKSB7
CisgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcuCisgICAgICB2YXIg
c2NyaXB0ID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh0aGlzKTsKKworICAgICAg
Ly8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQsIHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBs
YXRlTmFtZSBwcm9wZXJ0eS4KKyAgICAgIC8vIEZpcnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUt
bmFtZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNrIHRvIGl0cworICAgICAgLy8gaWQgaWYgbm8g
bmFtZSBpcyBmb3VuZC4KKyAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBzY3JpcHQuYXR0cignZGF0
YS10ZW1wbGF0ZS1uYW1lJykgfHwgc2NyaXB0LmF0dHIoJ2lkJykgfHwgJ2FwcGxpY2F0aW9uJzsK
KyAgICAgIHZhciB0ZW1wbGF0ZSwgY29tcGlsZTsKKworICAgICAgaWYgKHNjcmlwdC5hdHRyKCd0
eXBlJykgPT09ICd0ZXh0L3gtcmF3LWhhbmRsZWJhcnMnKSB7CisgICAgICAgIGNvbXBpbGUgPSBf
ZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LnByb3h5KEhhbmRsZWJhcnMuY29tcGlsZSwg
SGFuZGxlYmFycyk7CisgICAgICAgIHRlbXBsYXRlID0gY29tcGlsZShzY3JpcHQuaHRtbCgpKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxl
clN5c3RlbUNvbXBpbGUuZGVmYXVsdChzY3JpcHQuaHRtbCgpLCB7CisgICAgICAgICAgbW9kdWxl
TmFtZTogdGVtcGxhdGVOYW1lCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICAvLyBDaGVj
ayBpZiB0ZW1wbGF0ZSBvZiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCisgICAgICBpZiAoX2Vt
YmVySHRtbGJhcnNUZW1wbGF0ZV9yZWdpc3RyeS5oYXModGVtcGxhdGVOYW1lKSkgeworICAgICAg
ICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdUZW1wbGF0ZSBuYW1lZCAiJyAr
IHRlbXBsYXRlTmFtZSArICciIGFscmVhZHkgZXhpc3RzLicpOworICAgICAgfQorCisgICAgICAv
LyBGb3IgdGVtcGxhdGVzIHdoaWNoIGhhdmUgYSBuYW1lLCB3ZSBzYXZlIHRoZW0gYW5kIHRoZW4g
cmVtb3ZlIHRoZW0gZnJvbSB0aGUgRE9NLgorICAgICAgX2VtYmVySHRtbGJhcnNUZW1wbGF0ZV9y
ZWdpc3RyeS5zZXQodGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZSk7CisKKyAgICAgIC8vIFJlbW92ZSBz
Y3JpcHQgdGFnIGZyb20gRE9NLgorICAgICAgc2NyaXB0LnJlbW92ZSgpOworICAgIH0pOworICB9
CisKKyAgZnVuY3Rpb24gX2Jvb3RzdHJhcCgpIHsKKyAgICBib290c3RyYXAoX2VtYmVyVmlld3NT
eXN0ZW1KcXVlcnkuZGVmYXVsdChkb2N1bWVudCkpOworICB9CisKKyAgZnVuY3Rpb24gcmVnaXN0
ZXJDb21wb25lbnRMb29rdXAoYXBwKSB7CisgICAgYXBwLnJlZ2lzdGVyKCdjb21wb25lbnQtbG9v
a3VwOm1haW4nLCBfZW1iZXJWaWV3c0NvbXBvbmVudF9sb29rdXAuZGVmYXVsdCk7CisgIH0KKwor
ICAvKgorICAgIFdlIHRpZSB0aGlzIHRvIGFwcGxpY2F0aW9uLmxvYWQgdG8gZW5zdXJlIHRoYXQg
d2UndmUgYXQgbGVhc3QKKyAgICBhdHRlbXB0ZWQgdG8gYm9vdHN0cmFwIGF0IHRoZSBwb2ludCB0
aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBsb2FkZWQuCisgIAorICAgIFdlIGFsc28gdGllIHRoaXMg
dG8gZG9jdW1lbnQgcmVhZHkgc2luY2Ugd2UncmUgZ3VhcmFudGVlZCB0aGF0IGFsbAorICAgIHRo
ZSBpbmxpbmUgdGVtcGxhdGVzIGFyZSBwcmVzZW50IGF0IHRoaXMgcG9pbnQuCisgIAorICAgIFRo
ZXJlJ3Mgbm8gaGFybSB0byBydW5uaW5nIHRoaXMgdHdpY2UsIHNpbmNlIHdlIHJlbW92ZSB0aGUg
dGVtcGxhdGVzCisgICAgZnJvbSB0aGUgRE9NIGFmdGVyIHByb2Nlc3NpbmcuCisgICovCisKKyAg
X2VtYmVyUnVudGltZVN5c3RlbUxhenlfbG9hZC5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywg
ZnVuY3Rpb24gKEFwcGxpY2F0aW9uKSB7CisgICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewor
ICAgICAgbmFtZTogJ2RvbVRlbXBsYXRlcycsCisgICAgICBpbml0aWFsaXplOiBfZW1iZXJNZXRh
bEVudmlyb25tZW50LmRlZmF1bHQuaGFzRE9NID8gX2Jvb3RzdHJhcCA6IGZ1bmN0aW9uICgpIHt9
CisgICAgfSk7CisKKyAgICBBcHBsaWNhdGlvbi5pbnN0YW5jZUluaXRpYWxpemVyKHsKKyAgICAg
IG5hbWU6ICdyZWdpc3RlckNvbXBvbmVudExvb2t1cCcsCisgICAgICBpbml0aWFsaXplOiByZWdp
c3RlckNvbXBvbmVudExvb2t1cAorICAgIH0pOworICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBib290c3RyYXA7Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxw
ZXInLCBbJ2V4cG9ydHMnLCAnZG9tLWhlbHBlcicsICdlbWJlci1odG1sYmFycy9tb3JwaHMvbW9y
cGgnLCAnZW1iZXItaHRtbGJhcnMvbW9ycGhzL2F0dHItbW9ycGgnXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9kb21IZWxwZXIsIF9lbWJlckh0bWxiYXJzTW9ycGhzTW9ycGgsIF9lbWJlckh0bWxiYXJz
TW9ycGhzQXR0ck1vcnBoKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBFbWJlckRP
TUhlbHBlcihfZG9jdW1lbnQpIHsKKyAgICBfZG9tSGVscGVyLmRlZmF1bHQuY2FsbCh0aGlzLCBf
ZG9jdW1lbnQpOworICB9CisKKyAgdmFyIHByb3RvID0gRW1iZXJET01IZWxwZXIucHJvdG90eXBl
ID0gT2JqZWN0LmNyZWF0ZShfZG9tSGVscGVyLmRlZmF1bHQucHJvdG90eXBlKTsKKyAgcHJvdG8u
TW9ycGhDbGFzcyA9IF9lbWJlckh0bWxiYXJzTW9ycGhzTW9ycGguZGVmYXVsdDsKKyAgcHJvdG8u
QXR0ck1vcnBoQ2xhc3MgPSBfZW1iZXJIdG1sYmFyc01vcnBoc0F0dHJNb3JwaC5kZWZhdWx0Owor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IEVtYmVyRE9NSGVscGVyOworfSk7CitlbmlmZWQoJ2VtYmVy
LWh0bWxiYXJzL3N5c3RlbS9pbnN0cnVtZW50YXRpb24tc3VwcG9ydCcsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9pbnN0cnVtZW50YXRpb24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsSW5zdHJ1bWVudGF0aW9uKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmluc3Ry
dW1lbnQgPSBpbnN0cnVtZW50OworCisgIC8qKgorICAgIFByb3ZpZGVzIGluc3RydW1lbnRhdGlv
biBmb3Igbm9kZSBtYW5hZ2Vycy4KKyAgCisgICAgV3JhcCB5b3VyIG5vZGUgbWFuYWdlcidzIHJl
bmRlciBhbmQgcmUtcmVuZGVyIG1ldGhvZHMKKyAgICB3aXRoIHRoaXMgZnVuY3Rpb24uCisgIAor
ICAgIEBwYXJhbSB7T2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IG9yIFZpZXcgaW5zdGFuY2Ug
KG9wdGlvbmFsKS4KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24g
dG8gaW5zdHJ1bWVudC4KKyAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgY29udGV4dCB0
byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLgorICAgIEByZXR1cm4ge09iamVjdH0gUmV0dXJuIHZh
bHVlIGZyb20gdGhlIGludm9rZWQgY2FsbGJhY2suCisgICAgQHByaXZhdGUKKyAgKi8KKworICBm
dW5jdGlvbiBpbnN0cnVtZW50KGNvbXBvbmVudCwgY2FsbGJhY2ssIGNvbnRleHQpIHsKKyAgICB2
YXIgaW5zdHJ1bWVudE5hbWUsIHZhbCwgZGV0YWlscywgZW5kOworICAgIC8vIE9ubHkgaW5zdHJ1
bWVudCBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBzdWJzY3JpYmVyLgorICAgIGlmIChfZW1iZXJN
ZXRhbEluc3RydW1lbnRhdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHsKKyAgICAgIGlmIChjb21w
b25lbnQpIHsKKyAgICAgICAgaW5zdHJ1bWVudE5hbWUgPSBjb21wb25lbnQuaW5zdHJ1bWVudE5h
bWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnN0cnVtZW50TmFtZSA9ICdub2RlJzsKKyAg
ICAgIH0KKyAgICAgIGRldGFpbHMgPSB7fTsKKyAgICAgIGlmIChjb21wb25lbnQpIHsKKyAgICAg
ICAgY29tcG9uZW50Lmluc3RydW1lbnREZXRhaWxzKGRldGFpbHMpOworICAgICAgfQorICAgICAg
ZW5kID0gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uX2luc3RydW1lbnRTdGFydCgncmVuZGVy
LicgKyBpbnN0cnVtZW50TmFtZSwgZnVuY3Rpb24gdmlld0luc3RydW1lbnREZXRhaWxzKCkgewor
ICAgICAgICByZXR1cm4gZGV0YWlsczsKKyAgICAgIH0pOworICAgICAgdmFsID0gY2FsbGJhY2su
Y2FsbChjb250ZXh0KTsKKyAgICAgIGlmIChlbmQpIHsKKyAgICAgICAgZW5kKCk7CisgICAgICB9
CisgICAgICByZXR1cm4gdmFsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FsbGJhY2su
Y2FsbChjb250ZXh0KTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy9z
eXN0ZW0vaW52b2tlLWhlbHBlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1odG1sYmFycy9zdHJlYW1zL2hlbHBlci1pbnN0YW5jZScsICdlbWJlci1odG1sYmFycy9z
dHJlYW1zL2hlbHBlci1mYWN0b3J5JywgJ2VtYmVyLWh0bWxiYXJzL3N0cmVhbXMvYnVpbHQtaW4t
aGVscGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJIdG1s
YmFyc1N0cmVhbXNIZWxwZXJJbnN0YW5jZSwgX2VtYmVySHRtbGJhcnNTdHJlYW1zSGVscGVyRmFj
dG9yeSwgX2VtYmVySHRtbGJhcnNTdHJlYW1zQnVpbHRJbkhlbHBlcikgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5idWlsZEhlbHBlclN0cmVhbSA9IGJ1aWxkSGVscGVyU3RyZWFtOwor
CisgIGZ1bmN0aW9uIGJ1aWxkSGVscGVyU3RyZWFtKGhlbHBlciwgcGFyYW1zLCBoYXNoLCB0ZW1w
bGF0ZXMsIGVudiwgc2NvcGUsIGxhYmVsKSB7CisgICAgdmFyIGlzQW55S2luZE9mSGVscGVyID0g
aGVscGVyLmlzSGVscGVySW5zdGFuY2UgfHwgaGVscGVyLmlzSGVscGVyRmFjdG9yeTsKKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnSGVscGVycyBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIGJs
b2NrIGZvcm0sIGZvciBleGFtcGxlIHt7I215LWhlbHBlcn19e3svbXktaGVscGVyfX0uIFBsZWFz
ZSB1c2UgYSBjb21wb25lbnQsIG9yIGFsdGVybmF0aXZlbHkgdXNlIHRoZSBoZWxwZXIgaW4gY29t
YmluYXRpb24gd2l0aCBhIGJ1aWx0LWluIEVtYmVyIGhlbHBlciwgZm9yIGV4YW1wbGUge3sjaWYg
KG15LWhlbHBlcil9fXt7L2lmfX0uJywgIShpc0FueUtpbmRPZkhlbHBlciAmJiB0ZW1wbGF0ZXMg
JiYgdGVtcGxhdGVzLnRlbXBsYXRlICYmIHRlbXBsYXRlcy50ZW1wbGF0ZS5tZXRhKSk7CisgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0hlbHBlcnMgbWF5IG5vdCBiZSB1c2VkIGluIHRoZSBl
bGVtZW50IGZvcm0sIGZvciBleGFtcGxlIDxkaXYge3tteS1oZWxwZXJ9fT4uJywgIShpc0FueUtp
bmRPZkhlbHBlciAmJiB0ZW1wbGF0ZXMgJiYgdGVtcGxhdGVzLmVsZW1lbnQpKTsKKyAgICBpZiAo
aGVscGVyLmlzSGVscGVyRmFjdG9yeSkgeworICAgICAgcmV0dXJuIG5ldyBfZW1iZXJIdG1sYmFy
c1N0cmVhbXNIZWxwZXJGYWN0b3J5LmRlZmF1bHQoaGVscGVyLCBwYXJhbXMsIGhhc2gsIGxhYmVs
KTsKKyAgICB9IGVsc2UgaWYgKGhlbHBlci5pc0hlbHBlckluc3RhbmNlKSB7CisgICAgICByZXR1
cm4gbmV3IF9lbWJlckh0bWxiYXJzU3RyZWFtc0hlbHBlckluc3RhbmNlLmRlZmF1bHQoaGVscGVy
LCBwYXJhbXMsIGhhc2gsIGxhYmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcGxhdGVzID0g
dGVtcGxhdGVzIHx8IHsgdGVtcGxhdGU6IHt9LCBpbnZlcnNlOiB7fSB9OworICAgICAgcmV0dXJu
IG5ldyBfZW1iZXJIdG1sYmFyc1N0cmVhbXNCdWlsdEluSGVscGVyLmRlZmF1bHQoaGVscGVyLCBw
YXJhbXMsIGhhc2gsIHRlbXBsYXRlcywgZW52LCBzY29wZSwgbGFiZWwpOworICAgIH0KKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL2NhY2hlJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbENhY2hlKSB7CisgIC8qKgor
ICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItaHRtbGJhcnMKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy52YWxpZGF0ZUxhenlIZWxwZXJOYW1lID0gdmFsaWRh
dGVMYXp5SGVscGVyTmFtZTsKKyAgZXhwb3J0cy5maW5kSGVscGVyID0gZmluZEhlbHBlcjsKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gbG9va3VwSGVscGVyOworICB2YXIgQ09OVEFJTlNfREFTSF9DQUNI
RSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkgewor
ICAgIHJldHVybiBrZXkuaW5kZXhPZignLScpICE9PSAtMTsKKyAgfSk7CisKKyAgZXhwb3J0cy5D
T05UQUlOU19EQVNIX0NBQ0hFID0gQ09OVEFJTlNfREFTSF9DQUNIRTsKKyAgdmFyIENPTlRBSU5T
X0RPVF9DQUNIRSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24g
KGtleSkgeworICAgIHJldHVybiBrZXkuaW5kZXhPZignLicpICE9PSAtMTsKKyAgfSk7CisKKyAg
ZXhwb3J0cy5DT05UQUlOU19ET1RfQ0FDSEUgPSBDT05UQUlOU19ET1RfQ0FDSEU7CisKKyAgZnVu
Y3Rpb24gdmFsaWRhdGVMYXp5SGVscGVyTmFtZShoZWxwZXJOYW1lLCBjb250YWluZXIsIGtleXdv
cmRzKSB7CisgICAgcmV0dXJuIGNvbnRhaW5lciAmJiAhKGhlbHBlck5hbWUgaW4ga2V5d29yZHMp
OworICB9CisKKyAgLyoqCisgICAgVXNlZCB0byBsb29rdXAvcmVzb2x2ZSBoYW5kbGViYXJzIGhl
bHBlcnMuIFRoZSBsb29rdXAgb3JkZXIgaXM6CisgIAorICAgICogTG9vayBmb3IgYSByZWdpc3Rl
cmVkIGhlbHBlcgorICAgICogSWYgYSBkYXNoIGV4aXN0cyBpbiB0aGUgbmFtZToKKyAgICAgICog
TG9vayBmb3IgYSBoZWxwZXIgcmVnaXN0ZWQgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgICogVXNl
IEVtYmVyLkNvbXBvbmVudExvb2t1cCB0byBmaW5kIGFuIEVtYmVyLkNvbXBvbmVudCB0aGF0IHJl
c29sdmVzCisgICAgICAgIHRvIHRoZSBnaXZlbiBuYW1lLgorICAKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2QgcmVzb2x2ZUhlbHBlcgorICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1l
IG9mIHRoZSBoZWxwZXIgdG8gbG9va3VwLgorICAgIEByZXR1cm4ge0hlbHBlcn0KKyAgKi8KKyAg
ZnVuY3Rpb24gX2ZpbmRIZWxwZXIobmFtZSwgdmlldywgZW52LCBvcHRpb25zKSB7CisgICAgdmFy
IGhlbHBlciA9IGVudi5oZWxwZXJzW25hbWVdOworCisgICAgaWYgKCFoZWxwZXIpIHsKKyAgICAg
IHZhciBvd25lciA9IGVudi5vd25lcjsKKyAgICAgIGlmICh2YWxpZGF0ZUxhenlIZWxwZXJOYW1l
KG5hbWUsIG93bmVyLCBlbnYuaG9va3Mua2V5d29yZHMpKSB7CisgICAgICAgIHZhciBoZWxwZXJO
YW1lID0gJ2hlbHBlcjonICsgbmFtZTsKKyAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNv
bS9lbWJlcmpzL2VtYmVyLmpzL2lzc3Vlcy8xMzA3MQorICAgICAgICAvLyBTZWUgaHR0cHM6Ly9i
dWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDgzOQorICAgICAgICB2YXIg
cmVnaXN0ZXJlZCA9IG93bmVyLmhhc1JlZ2lzdHJhdGlvbihoZWxwZXJOYW1lLCBvcHRpb25zKTsK
KyAgICAgICAgaWYgKHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICBoZWxwZXIgPSBvd25lci5fbG9v
a3VwRmFjdG9yeShoZWxwZXJOYW1lLCBvcHRpb25zKTsKKyAgICAgICAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnRXhwZWN0ZWQgdG8gZmluZCBhbiBFbWJlci5IZWxwZXIgd2l0aCB0aGUgbmFt
ZSAnICsgaGVscGVyTmFtZSArICcsIGJ1dCBmb3VuZCBhbiBvYmplY3Qgb2YgdHlwZSAnICsgdHlw
ZW9mIGhlbHBlciArICcgaW5zdGVhZC4nLCBoZWxwZXIuaXNIZWxwZXJGYWN0b3J5IHx8IGhlbHBl
ci5pc0hlbHBlckluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBoZWxwZXI7CisgIH0KKworICBmdW5jdGlvbiBmaW5kSGVscGVyKG5hbWUsIHZpZXcsIGVu
dikgeworICAgIHZhciBvcHRpb25zID0ge307CisgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0
YSAmJiBlbnYubWV0YS5tb2R1bGVOYW1lOworICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAgICBv
cHRpb25zLnNvdXJjZSA9ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZTsKKyAgICB9CisKKyAgICB2
YXIgbG9jYWxIZWxwZXIgPSBfZmluZEhlbHBlcihuYW1lLCB2aWV3LCBlbnYsIG9wdGlvbnMpOwor
CisgICAgLy8gTG9jYWwgbWF0Y2ggZm91bmQsIHVzZSBpdC4KKyAgICBpZiAobG9jYWxIZWxwZXIp
IHsKKyAgICAgIHJldHVybiBsb2NhbEhlbHBlcjsKKyAgICB9CisKKyAgICAvLyBGYWxsIGJhY2sg
dG8gZ2xvYmFsLgorICAgIHJldHVybiBfZmluZEhlbHBlcihuYW1lLCB2aWV3LCBlbnYpOworICB9
CisKKyAgZnVuY3Rpb24gbG9va3VwSGVscGVyKG5hbWUsIHZpZXcsIGVudikgeworICAgIHZhciBo
ZWxwZXIgPSBmaW5kSGVscGVyKG5hbWUsIHZpZXcsIGVudik7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnQSBoZWxwZXIgbmFtZWQgXCcnICsgbmFtZSArICdcJyBjb3VsZCBub3QgYmUg
Zm91bmQnLCAhIWhlbHBlcik7CisKKyAgICByZXR1cm4gaGVscGVyOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL21ha2VfYm91bmRfaGVscGVyJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLWh0bWxiYXJzL2hlbHBlciddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVySHRtbGJhcnNIZWxwZXIpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbWFrZUJvdW5kSGVscGVyOworCisg
IC8qKgorICAgIENyZWF0ZSBhIGJvdW5kIGhlbHBlci4gQWNjZXB0cyBhIGZ1bmN0aW9uIHRoYXQg
cmVjZWl2ZXMgdGhlIG9yZGVyZWQgYW5kIGhhc2ggcGFyYW1ldGVycworICAgIGZyb20gdGhlIHRl
bXBsYXRlLiBJZiBhIGJvdW5kIHByb3BlcnR5IHdhcyBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUs
IGl0IHdpbGwgYmUgcmVzb2x2ZWQgdG8gaXRzCisgICAgdmFsdWUgYW5kIGFueSBjaGFuZ2VzIHRv
IHRoZSBib3VuZCBwcm9wZXJ0eSBjYXVzZSB0aGUgaGVscGVyIGZ1bmN0aW9uIHRvIGJlIHJlLXJ1
biB3aXRoIHRoZSB1cGRhdGVkCisgICAgdmFsdWVzLgorICAKKyAgICAqIGBwYXJhbXNgIC0gQW4g
YXJyYXkgb2YgcmVzb2x2ZWQgb3JkZXJlZCBwYXJhbWV0ZXJzLgorICAgICogYGhhc2hgIC0gQW4g
b2JqZWN0IGNvbnRhaW5pbmcgdGhlIGhhc2ggcGFyYW1ldGVycy4KKyAgCisgICAgRm9yIGV4YW1w
bGU6CisgIAorICAgICogV2l0aCBhbiB1bnF1b3RlZCBvcmRlcmVkIHBhcmFtZXRlcjoKKyAgCisg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB7e3gtY2FwaXRhbGl6ZSBmb299fQorICAgICAgYGBg
CisgIAorICAgICAgQXNzdW1pbmcgYGZvb2Agd2FzIHNldCB0byBgImJhciJgLCB0aGUgYm91bmQg
aGVscGVyIHdvdWxkIHJlY2VpdmUgYFsiYmFyIl1gIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgYW5k
CisgICAgICBhbiBlbXB0eSBoYXNoIGFzIGl0cyBzZWNvbmQuCisgIAorICAgICogV2l0aCBhIHF1
b3RlZCBvcmRlcmVkIHBhcmFtZXRlcjoKKyAgCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB7
e3gtY2FwaXRhbGl6ZSAiZm9vIn19CisgICAgICBgYGAKKyAgCisgICAgICBUaGUgYm91bmQgaGVs
cGVyIHdvdWxkIHJlY2VpdmUgYFsiZm9vIl1gIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgYW5kIGFu
IGVtcHR5IGhhc2ggYXMgaXRzIHNlY29uZC4KKyAgCisgICAgKiBXaXRoIGFuIHVucXVvdGVkIGhh
c2ggcGFyYW1ldGVyOgorICAKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHt7eC1yZXBlYXQg
ImZvbyIgY291bnQ9cmVwZWF0Q291bnR9fQorICAgICAgYGBgCisgIAorICAgICAgQXNzdW1pbmcg
dGhhdCBgcmVwZWF0Q291bnRgIHJlc29sdmVkIHRvIDIsIHRoZSBib3VuZCBoZWxwZXIgd291bGQg
cmVjZWl2ZSBgWyJmb28iXWAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LAorICAgICAgYW5kIHsgY291
bnQ6IDIgfSBhcyBpdHMgc2Vjb25kLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgbWFr
ZUJvdW5kSGVscGVyCisgICAgQGZvciBFbWJlci5IVE1MQmFycworICAgIEBwYXJhbSB7RnVuY3Rp
b259IGZuCisgICAgQHNpbmNlIDEuMTAuMAorICAqLworCisgIGZ1bmN0aW9uIG1ha2VCb3VuZEhl
bHBlcihmbikgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyBgRW1iZXIu
SFRNTEJhcnMubWFrZUJvdW5kSGVscGVyYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcmVmYWN0b3Ig
dG8gdXNlIGBFbWJlci5IZWxwZXJgIG9yIGBFbWJlci5IZWxwZXIuaGVscGVyYC4nLCBmYWxzZSwg
eyBpZDogJ2VtYmVyLWh0bWxiYXJzLm1ha2UtYm91bmQtaGVscGVyJywgdW50aWw6ICczLjAuMCcg
fSk7CisgICAgcmV0dXJuIF9lbWJlckh0bWxiYXJzSGVscGVyLmhlbHBlcihmbik7CisgIH0KK30p
OworZW5pZmVkKCdlbWJlci1odG1sYmFycy9zeXN0ZW0vcmVuZGVyLWVudicsIFsnZXhwb3J0cycs
ICdlbWJlci1odG1sYmFycy9lbnYnLCAnZW1iZXItbWV0YWwtdmlld3MnLCAnY29udGFpbmVyL293
bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJIdG1sYmFyc0VudiwgX2VtYmVyTWV0YWxW
aWV3cywgX2NvbnRhaW5lck93bmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBSZW5kZXJFbnY7CisKKyAgZnVuY3Rpb24gUmVuZGVyRW52KG9wdGlvbnMpIHsKKyAg
ICB0aGlzLmxpZmVjeWNsZUhvb2tzID0gb3B0aW9ucy5saWZlY3ljbGVIb29rcyB8fCBbXTsKKyAg
ICB0aGlzLnJlbmRlcmVkVmlld3MgPSBvcHRpb25zLnJlbmRlcmVkVmlld3MgfHwgW107CisgICAg
dGhpcy5yZW5kZXJlZE5vZGVzID0gb3B0aW9ucy5yZW5kZXJlZE5vZGVzIHx8IG5ldyBfZW1iZXJN
ZXRhbFZpZXdzLk1vcnBoU2V0KCk7CisgICAgdGhpcy5oYXNQYXJlbnRPdXRsZXQgPSBvcHRpb25z
Lmhhc1BhcmVudE91dGxldCB8fCBmYWxzZTsKKworICAgIHRoaXMudmlldyA9IG9wdGlvbnMudmll
dzsKKyAgICB0aGlzLm91dGxldFN0YXRlID0gb3B0aW9ucy5vdXRsZXRTdGF0ZTsKKyAgICB0aGlz
Lm93bmVyID0gb3B0aW9ucy5vd25lcjsKKyAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucy5yZW5k
ZXJlcjsKKyAgICB0aGlzLmRvbSA9IG9wdGlvbnMuZG9tOworICAgIHRoaXMubWV0YSA9IG9wdGlv
bnMubWV0YTsKKworICAgIHRoaXMuaG9va3MgPSBfZW1iZXJIdG1sYmFyc0Vudi5kZWZhdWx0Lmhv
b2tzOworICAgIHRoaXMuaGVscGVycyA9IF9lbWJlckh0bWxiYXJzRW52LmRlZmF1bHQuaGVscGVy
czsKKyAgICB0aGlzLnVzZUZyYWdtZW50Q2FjaGUgPSBfZW1iZXJIdG1sYmFyc0Vudi5kZWZhdWx0
LnVzZUZyYWdtZW50Q2FjaGU7CisgICAgdGhpcy5kZXN0aW5lZEZvckRPTSA9IHRoaXMucmVuZGVy
ZXIuX2Rlc3RpbmVkRm9yRE9NOworICB9CisKKyAgUmVuZGVyRW52LmJ1aWxkID0gZnVuY3Rpb24g
KHZpZXcsIG1ldGEpIHsKKyAgICByZXR1cm4gbmV3IFJlbmRlckVudih7CisgICAgICB2aWV3OiB2
aWV3LAorICAgICAgb3V0bGV0U3RhdGU6IHZpZXcub3V0bGV0U3RhdGUsCisgICAgICBvd25lcjog
X2NvbnRhaW5lck93bmVyLmdldE93bmVyKHZpZXcpLAorICAgICAgcmVuZGVyZXI6IHZpZXcucmVu
ZGVyZXIsCisgICAgICBkb206IHZpZXcucmVuZGVyZXIuX2RvbSwKKyAgICAgIG1ldGE6IG1ldGEK
KyAgICB9KTsKKyAgfTsKKworICBSZW5kZXJFbnYucHJvdG90eXBlLmNoaWxkV2l0aE1ldGEgPSBm
dW5jdGlvbiAobWV0YSkgeworICAgIHJldHVybiBuZXcgUmVuZGVyRW52KHsKKyAgICAgIHZpZXc6
IHRoaXMudmlldywKKyAgICAgIG91dGxldFN0YXRlOiB0aGlzLm91dGxldFN0YXRlLAorICAgICAg
b3duZXI6IHRoaXMub3duZXIsCisgICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlciwKKyAgICAg
IGRvbTogdGhpcy5kb20sCisgICAgICBsaWZlY3ljbGVIb29rczogdGhpcy5saWZlY3ljbGVIb29r
cywKKyAgICAgIHJlbmRlcmVkVmlld3M6IHRoaXMucmVuZGVyZWRWaWV3cywKKyAgICAgIHJlbmRl
cmVkTm9kZXM6IHRoaXMucmVuZGVyZWROb2RlcywKKyAgICAgIGhhc1BhcmVudE91dGxldDogdGhp
cy5oYXNQYXJlbnRPdXRsZXQsCisgICAgICBtZXRhOiBtZXRhCisgICAgfSk7CisgIH07CisKKyAg
UmVuZGVyRW52LnByb3RvdHlwZS5jaGlsZFdpdGhWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAg
ICB2YXIgbWV0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVu
ZGVmaW5lZCA/IHRoaXMubWV0YSA6IGFyZ3VtZW50c1sxXTsKKworICAgIHJldHVybiBuZXcgUmVu
ZGVyRW52KHsKKyAgICAgIHZpZXc6IHZpZXcsCisgICAgICBvdXRsZXRTdGF0ZTogdGhpcy5vdXRs
ZXRTdGF0ZSwKKyAgICAgIG93bmVyOiB0aGlzLm93bmVyLAorICAgICAgcmVuZGVyZXI6IHRoaXMu
cmVuZGVyZXIsCisgICAgICBkb206IHRoaXMuZG9tLAorICAgICAgbGlmZWN5Y2xlSG9va3M6IHRo
aXMubGlmZWN5Y2xlSG9va3MsCisgICAgICByZW5kZXJlZFZpZXdzOiB0aGlzLnJlbmRlcmVkVmll
d3MsCisgICAgICByZW5kZXJlZE5vZGVzOiB0aGlzLnJlbmRlcmVkTm9kZXMsCisgICAgICBoYXNQ
YXJlbnRPdXRsZXQ6IHRoaXMuaGFzUGFyZW50T3V0bGV0LAorICAgICAgbWV0YTogbWV0YQorICAg
IH0pOworICB9OworCisgIFJlbmRlckVudi5wcm90b3R5cGUuY2hpbGRXaXRoT3V0bGV0U3RhdGUg
PSBmdW5jdGlvbiAob3V0bGV0U3RhdGUpIHsKKyAgICB2YXIgaGFzUGFyZW50T3V0bGV0ID0gYXJn
dW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5o
YXNQYXJlbnRPdXRsZXQgOiBhcmd1bWVudHNbMV07CisgICAgdmFyIG1ldGEgPSBhcmd1bWVudHMu
bGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB0aGlzLm1ldGEgOiBh
cmd1bWVudHNbMl07CisKKyAgICByZXR1cm4gbmV3IFJlbmRlckVudih7CisgICAgICB2aWV3OiB0
aGlzLnZpZXcsCisgICAgICBvdXRsZXRTdGF0ZTogb3V0bGV0U3RhdGUsCisgICAgICBvd25lcjog
dGhpcy5vd25lciwKKyAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLAorICAgICAgZG9tOiB0
aGlzLmRvbSwKKyAgICAgIGxpZmVjeWNsZUhvb2tzOiB0aGlzLmxpZmVjeWNsZUhvb2tzLAorICAg
ICAgcmVuZGVyZWRWaWV3czogdGhpcy5yZW5kZXJlZFZpZXdzLAorICAgICAgcmVuZGVyZWROb2Rl
czogdGhpcy5yZW5kZXJlZE5vZGVzLAorICAgICAgaGFzUGFyZW50T3V0bGV0OiBoYXNQYXJlbnRP
dXRsZXQsCisgICAgICBtZXRhOiBtZXRhCisgICAgfSk7CisgIH07Cit9KTsKK2VuaWZlZCgnZW1i
ZXItaHRtbGJhcnMvc3lzdGVtL3JlbmRlci12aWV3JywgWydleHBvcnRzJywgJ2VtYmVyLWh0bWxi
YXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2RlLW1hbmFnZXInLCAnZW1iZXItaHRtbGJhcnMvc3lz
dGVtL3JlbmRlci1lbnYnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckh0bWxiYXJzTm9kZU1h
bmFnZXJzVmlld05vZGVNYW5hZ2VyLCBfZW1iZXJIdG1sYmFyc1N5c3RlbVJlbmRlckVudikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5yZW5kZXJIVE1MQmFyc0Jsb2NrID0gcmVuZGVy
SFRNTEJhcnNCbG9jazsKKworICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgb25j
ZSBwZXIgcmVuZGVyIG9mIGEgInJvb3QgdmlldyIgKGBhcHBlbmRUb2ApLiBPdGhlcndpc2UsCisg
IC8vIEhUTUxCYXJzIHByb3BhZ2F0ZXMgdGhlIGV4aXN0aW5nIGVudiBhbmQgcmVuZGVycyB0ZW1w
bGF0ZXMgZm9yIGEgZ2l2ZW4gcmVuZGVyIG5vZGUuCisKKyAgZnVuY3Rpb24gcmVuZGVySFRNTEJh
cnNCbG9jayh2aWV3LCBibG9jaywgcmVuZGVyTm9kZSkgeworICAgIHZhciBtZXRhID0gYmxvY2sg
JiYgYmxvY2sudGVtcGxhdGUgJiYgYmxvY2sudGVtcGxhdGUubWV0YTsKKyAgICB2YXIgZW52ID0g
X2VtYmVySHRtbGJhcnNTeXN0ZW1SZW5kZXJFbnYuZGVmYXVsdC5idWlsZCh2aWV3LCBtZXRhKTsK
KworICAgIHZpZXcuZW52ID0gZW52OworICAgIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzVmll
d05vZGVNYW5hZ2VyLmNyZWF0ZU9yVXBkYXRlQ29tcG9uZW50KHZpZXcsIHt9LCBudWxsLCByZW5k
ZXJOb2RlLCBlbnYpOworICAgIHZhciBub2RlTWFuYWdlciA9IG5ldyBfZW1iZXJIdG1sYmFyc05v
ZGVNYW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlci5kZWZhdWx0KHZpZXcsIG51bGwsIHJlbmRlck5vZGUs
IGJsb2NrLCB2aWV3LnRhZ05hbWUgIT09ICcnKTsKKworICAgIG5vZGVNYW5hZ2VyLnJlbmRlcihl
bnYsIHt9KTsKKyAgfQorfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlX3JlZ2lz
dHJ5IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8vIFNUQVRFIHdpdGhp
biBhIG1vZHVsZSBpcyBmcm93bmVkIGFwb24sIHRoaXMgZXhpc3RzCisgIC8vIHRvIHN1cHBvcnQg
RW1iZXIuVEVNUExBVEVTIGJ1dCBzaGllbGQgZW1iZXIgaW50ZXJuYWxzIGZyb20gdGhpcyBsZWdh
Y3kKKyAgLy8gZ2xvYmFsIEFQSS4KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuc2V0VGVt
cGxhdGVzID0gc2V0VGVtcGxhdGVzOworICBleHBvcnRzLmdldFRlbXBsYXRlcyA9IGdldFRlbXBs
YXRlczsKKyAgZXhwb3J0cy5nZXQgPSBnZXQ7CisgIGV4cG9ydHMuaGFzID0gaGFzOworICBleHBv
cnRzLnNldCA9IHNldDsKKyAgdmFyIFRFTVBMQVRFUyA9IHt9OworCisgIGZ1bmN0aW9uIHNldFRl
bXBsYXRlcyh0ZW1wbGF0ZXMpIHsKKyAgICBURU1QTEFURVMgPSB0ZW1wbGF0ZXM7CisgIH0KKwor
ICBmdW5jdGlvbiBnZXRUZW1wbGF0ZXMoKSB7CisgICAgcmV0dXJuIFRFTVBMQVRFUzsKKyAgfQor
CisgIGZ1bmN0aW9uIGdldChuYW1lKSB7CisgICAgaWYgKFRFTVBMQVRFUy5oYXNPd25Qcm9wZXJ0
eShuYW1lKSkgeworICAgICAgcmV0dXJuIFRFTVBMQVRFU1tuYW1lXTsKKyAgICB9CisgIH0KKwor
ICBmdW5jdGlvbiBoYXMobmFtZSkgeworICAgIHJldHVybiBURU1QTEFURVMuaGFzT3duUHJvcGVy
dHkobmFtZSk7CisgIH0KKworICBmdW5jdGlvbiBzZXQobmFtZSwgdGVtcGxhdGUpIHsKKyAgICBy
ZXR1cm4gVEVNUExBVEVTW25hbWVdID0gdGVtcGxhdGU7CisgIH0KK30pOworZW5pZmVkKCJlbWJl
ci1odG1sYmFycy90ZW1wbGF0ZXMvY29tcG9uZW50IiwgWyJleHBvcnRzIiwgImVtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZSJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
VGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBsYXRlKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUuZGVm
YXVsdCgoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiB7CisgICAgICBtZXRhOiB7fSwKKyAgICAg
IGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVudDog
bnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6IGZ1
bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3JlYXRl
RG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQo
IiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICByZXR1cm4g
ZWwwOworICAgICAgfSwKKyAgICAgIGJ1aWxkUmVuZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVu
ZGVyTm9kZXMoZG9tLCBmcmFnbWVudCwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFy
IG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1v
cnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmlu
c2VydEJvdW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZy
YWdtZW50LCBudWxsKTsKKyAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBz
dGF0ZW1lbnRzOiBbWyJjb250ZW50IiwgInlpZWxkIiwgWyJsb2MiLCBbbnVsbCwgWzEsIDBdLCBb
MSwgOV1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9
OworICB9KSgpKTsKK30pOworZW5pZmVkKCJlbWJlci1odG1sYmFycy90ZW1wbGF0ZXMvZW1wdHki
LCBbImV4cG9ydHMiLCAiZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL3RlbXBsYXRlIl0s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUp
IHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclRlbXBsYXRl
Q29tcGlsZXJTeXN0ZW1UZW1wbGF0ZS5kZWZhdWx0KChmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJu
IHsKKyAgICAgIG1ldGE6IHt9LAorICAgICAgaXNFbXB0eTogdHJ1ZSwKKyAgICAgIGFyaXR5OiAw
LAorICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2Us
CisgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAg
ICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgcmV0
dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlvbiBidWls
ZFJlbmRlck5vZGVzKCkgeworICAgICAgICByZXR1cm4gW107CisgICAgICB9LAorICAgICAgc3Rh
dGVtZW50czogW10sCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXQorICAg
IH07CisgIH0pKCkpOworfSk7CitlbmlmZWQoImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlcy9saW5r
LXRvIiwgWyJleHBvcnRzIiwgImVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0
ZSJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBs
YXRlKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZW1w
bGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUuZGVmYXVsdCgoZnVuY3Rpb24gKCkgeworICAgIHZh
ciBjaGlsZDAgPSAoZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgbWV0YTog
e30sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgICBhcml0eTogMCwKKyAgICAgICAg
Y2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAg
ICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAg
ICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChl
bDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAgICAgICAgfSwKKyAgICAgICAgYnVp
bGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBj
b250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7
CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAs
IGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21l
bnQsIDApOworICAgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFyeShmcmFnbWVudCwgbnVsbCk7Cisg
ICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwKKyAgICAgICAgc3RhdGVtZW50czog
W1siY29udGVudCIsICJsaW5rVGl0bGUiLCBbImxvYyIsIFtudWxsLCBbMSwgMTddLCBbMSwgMzBd
XV1dXSwKKyAgICAgICAgbG9jYWxzOiBbXSwKKyAgICAgICAgdGVtcGxhdGVzOiBbXQorICAgICAg
fTsKKyAgICB9KSgpOworICAgIHZhciBjaGlsZDEgPSAoZnVuY3Rpb24gKCkgeworICAgICAgcmV0
dXJuIHsKKyAgICAgICAgbWV0YToge30sCisgICAgICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAg
ICBhcml0eTogMCwKKyAgICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisgICAgICAgIGhhc1Jl
bmRlcmVkOiBmYWxzZSwKKyAgICAgICAgYnVpbGRGcmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFn
bWVudChkb20pIHsKKyAgICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21l
bnQoKTsKKyAgICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1lbnQoIiIpOworICAgICAg
ICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAgICAgICAgcmV0dXJuIGVsMDsKKyAg
ICAgICAgfSwKKyAgICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24gYnVpbGRSZW5kZXJO
b2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgICAgICAgIHZhciBt
b3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1v
cnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1YWxFbGVtZW50KTsKKyAgICAgICAgICBkb20u
aW5zZXJ0Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICAgIGRvbS5pbnNlcnRCb3VuZGFy
eShmcmFnbWVudCwgbnVsbCk7CisgICAgICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgICAgfSwK
KyAgICAgICAgc3RhdGVtZW50czogW1siY29udGVudCIsICJ5aWVsZCIsIFsibG9jIiwgW251bGws
IFsxLCAzOF0sIFsxLCA0N11dXV1dLAorICAgICAgICBsb2NhbHM6IFtdLAorICAgICAgICB0ZW1w
bGF0ZXM6IFtdCisgICAgICB9OworICAgIH0pKCk7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6
IHt9LAorICAgICAgaXNFbXB0eTogZmFsc2UsCisgICAgICBhcml0eTogMCwKKyAgICAgIGNhY2hl
ZEZyYWdtZW50OiBudWxsLAorICAgICAgaGFzUmVuZGVyZWQ6IGZhbHNlLAorICAgICAgYnVpbGRG
cmFnbWVudDogZnVuY3Rpb24gYnVpbGRGcmFnbWVudChkb20pIHsKKyAgICAgICAgdmFyIGVsMCA9
IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgIHZhciBlbDEgPSBkb20uY3Jl
YXRlQ29tbWVudCgiIik7CisgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDAsIGVsMSk7CisgICAg
ICAgIHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rp
b24gYnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50LCBjb250ZXh0dWFsRWxlbWVudCkgewor
ICAgICAgICB2YXIgbW9ycGhzID0gbmV3IEFycmF5KDEpOworICAgICAgICBtb3JwaHNbMF0gPSBk
b20uY3JlYXRlTW9ycGhBdChmcmFnbWVudCwgMCwgMCwgY29udGV4dHVhbEVsZW1lbnQpOworICAg
ICAgICBkb20uaW5zZXJ0Qm91bmRhcnkoZnJhZ21lbnQsIDApOworICAgICAgICBkb20uaW5zZXJ0
Qm91bmRhcnkoZnJhZ21lbnQsIG51bGwpOworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAg
fSwKKyAgICAgIHN0YXRlbWVudHM6IFtbImJsb2NrIiwgImlmIiwgW1siZ2V0IiwgImxpbmtUaXRs
ZSIsIFsibG9jIiwgW251bGwsIFsxLCA2XSwgWzEsIDE1XV1dXV0sIFtdLCAwLCAxLCBbImxvYyIs
IFtudWxsLCBbMSwgMF0sIFsxLCA1NF1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRl
bXBsYXRlczogW2NoaWxkMCwgY2hpbGQxXQorICAgIH07CisgIH0pKCkpOworfSk7CitlbmlmZWQo
ImVtYmVyLWh0bWxiYXJzL3RlbXBsYXRlcy90b3AtbGV2ZWwtdmlldyIsIFsiZXhwb3J0cyIsICJl
bWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vdGVtcGxhdGUiXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSkgeworICAidXNlIHN0cmlj
dCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRl
bXBsYXRlLmRlZmF1bHQoKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4geworICAgICAgbWV0YTog
e30sCisgICAgICBpc0VtcHR5OiBmYWxzZSwKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVk
RnJhZ21lbnQ6IG51bGwsCisgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZy
YWdtZW50OiBmdW5jdGlvbiBidWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0g
ZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgdmFyIGVsMSA9IGRvbS5jcmVh
dGVDb21tZW50KCIiKTsKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsMCwgZWwxKTsKKyAgICAg
ICAgcmV0dXJuIGVsMDsKKyAgICAgIH0sCisgICAgICBidWlsZFJlbmRlck5vZGVzOiBmdW5jdGlv
biBidWlsZFJlbmRlck5vZGVzKGRvbSwgZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KSB7Cisg
ICAgICAgIHZhciBtb3JwaHMgPSBuZXcgQXJyYXkoMSk7CisgICAgICAgIG1vcnBoc1swXSA9IGRv
bS5jcmVhdGVNb3JwaEF0KGZyYWdtZW50LCAwLCAwLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAg
ICAgIGRvbS5pbnNlcnRCb3VuZGFyeShmcmFnbWVudCwgMCk7CisgICAgICAgIGRvbS5pbnNlcnRC
b3VuZGFyeShmcmFnbWVudCwgbnVsbCk7CisgICAgICAgIHJldHVybiBtb3JwaHM7CisgICAgICB9
LAorICAgICAgc3RhdGVtZW50czogW1siY29udGVudCIsICJvdXRsZXQiLCBbImxvYyIsIFtudWxs
LCBbMSwgMF0sIFsxLCAxMF1dXV1dLAorICAgICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRl
czogW10KKyAgICB9OworICB9KSgpKTsKK30pOworZW5pZmVkKCdlbWJlci1odG1sYmFycy91dGls
cy9kZWNvZGUtZWFjaC1rZXknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0
JywgJ2VtYmVyLW1ldGFsL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldCwgX2VtYmVyTWV0YWxVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gZGVjb2RlRWFjaEtleTsKKworICBmdW5jdGlvbiBpZGVudGl0eShpdGVt
KSB7CisgICAgdmFyIGtleSA9IHVuZGVmaW5lZDsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiBpdGVt
OworCisgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7Cisg
ICAgICBrZXkgPSBpdGVtOworICAgIH0gZWxzZSB7CisgICAgICBrZXkgPSBfZW1iZXJNZXRhbFV0
aWxzLmd1aWRGb3IoaXRlbSk7CisgICAgfQorCisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIGZ1
bmN0aW9uIGRlY29kZUVhY2hLZXkoaXRlbSwga2V5UGF0aCwgaW5kZXgpIHsKKyAgICB2YXIga2V5
OworCisgICAgc3dpdGNoIChrZXlQYXRoKSB7CisgICAgICBjYXNlICdAaW5kZXgnOgorICAgICAg
ICBrZXkgPSBpbmRleDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdAaWRlbnRpdHknOgor
ICAgICAgICBrZXkgPSBpZGVudGl0eShpdGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZh
dWx0OgorICAgICAgICBpZiAoa2V5UGF0aCkgeworICAgICAgICAgIGtleSA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXlQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICBrZXkgPSBpZGVudGl0eShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0
eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgeworICAgICAga2V5ID0gU3RyaW5nKGtleSk7CisgICAg
fQorCisgICAgcmV0dXJuIGtleTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0
aWxzL2V4dHJhY3QtcG9zaXRpb25hbC1wYXJhbXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFt
cy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0
YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZXh0cmFjdFBvc2l0aW9uYWxQYXJhbXM7CisgIGV4
cG9ydHMucHJvY2Vzc1Bvc2l0aW9uYWxQYXJhbXMgPSBwcm9jZXNzUG9zaXRpb25hbFBhcmFtczsK
KworICBmdW5jdGlvbiBleHRyYWN0UG9zaXRpb25hbFBhcmFtcyhyZW5kZXJOb2RlLCBjb21wb25l
bnQsIHBhcmFtcywgYXR0cnMpIHsKKyAgICB2YXIgcmFpc2VBc3NlcnRpb25zID0gYXJndW1lbnRz
Lmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGFyZ3Vt
ZW50c1s0XTsKKworICAgIHZhciBwb3NpdGlvbmFsUGFyYW1zID0gY29tcG9uZW50LnBvc2l0aW9u
YWxQYXJhbXM7CisKKyAgICBpZiAocG9zaXRpb25hbFBhcmFtcykgeworICAgICAgcHJvY2Vzc1Bv
c2l0aW9uYWxQYXJhbXMocmVuZGVyTm9kZSwgcG9zaXRpb25hbFBhcmFtcywgcGFyYW1zLCBhdHRy
cywgcmFpc2VBc3NlcnRpb25zKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzUG9z
aXRpb25hbFBhcmFtcyhyZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJz
KSB7CisgICAgdmFyIHJhaXNlQXNzZXJ0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBh
cmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IHRydWUgOiBhcmd1bWVudHNbNF07CisKKyAgICB2
YXIgaXNSZXN0ID0gdHlwZW9mIHBvc2l0aW9uYWxQYXJhbXMgPT09ICdzdHJpbmcnOworCisgICAg
aWYgKGlzUmVzdCkgeworICAgICAgcHJvY2Vzc1Jlc3RQb3NpdGlvbmFsUGFyYW1ldGVycyhyZW5k
ZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJzLCByYWlzZUFzc2VydGlvbnMp
OworICAgIH0gZWxzZSB7CisgICAgICBwcm9jZXNzTmFtZWRQb3NpdGlvbmFsUGFyYW1ldGVycyhy
ZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zLCBwYXJhbXMsIGF0dHJzLCByYWlzZUFzc2VydGlv
bnMpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHByb2Nlc3NOYW1lZFBvc2l0aW9uYWxQYXJh
bWV0ZXJzKHJlbmRlck5vZGUsIHBvc2l0aW9uYWxQYXJhbXMsIHBhcmFtcywgYXR0cnMsIHJhaXNl
QXNzZXJ0aW9ucykgeworICAgIHZhciBsaW1pdCA9IE1hdGgubWluKHBhcmFtcy5sZW5ndGgsIHBv
c2l0aW9uYWxQYXJhbXMubGVuZ3RoKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltaXQ7
IGkrKykgeworICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldOworCisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYSBwb3NpdGlvbmFsIHBhcmFt
IChhdCBwb3NpdGlvbiAnICsgaSArICcpIGFuZCB0aGUgaGFzaCBhcmd1bWVudCBgJyArIHBvc2l0
aW9uYWxQYXJhbXNbaV0gKyAnYC4nLCAhKHBvc2l0aW9uYWxQYXJhbXNbaV0gaW4gYXR0cnMgJiYg
cmFpc2VBc3NlcnRpb25zKSk7CisKKyAgICAgIGF0dHJzW3Bvc2l0aW9uYWxQYXJhbXNbaV1dID0g
cGFyYW07CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gcHJvY2Vzc1Jlc3RQb3NpdGlvbmFsUGFy
YW1ldGVycyhyZW5kZXJOb2RlLCBwb3NpdGlvbmFsUGFyYW1zTmFtZSwgcGFyYW1zLCBhdHRycywg
cmFpc2VBc3NlcnRpb25zKSB7CisgICAgdmFyIG5hbWVJbkF0dHJzID0gKHBvc2l0aW9uYWxQYXJh
bXNOYW1lIGluIGF0dHJzKTsKKworICAgIC8vIHdoZW4gbm8gcGFyYW1zIGFyZSB1c2VkLCBkbyBu
b3Qgb3ZlcnJpZGUgdGhlIHNwZWNpZmllZCBgYXR0cnMuc3RyaW5nUGFyYW1OYW1lYCB2YWx1ZQor
ICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAwICYmIG5hbWVJbkF0dHJzKSB7CisgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhdHRyaWJ1dGUgZm9y
IHRoYXQgdmFyaWFibGUsIGRvIG5vdGhpbmcKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
WW91IGNhbm5vdCBzcGVjaWZ5IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhbmQgdGhlIGhhc2ggYXJn
dW1lbnQgYCcgKyBwb3NpdGlvbmFsUGFyYW1zTmFtZSArICdgLicsICEobmFtZUluQXR0cnMgJiYg
cmFpc2VBc3NlcnRpb25zKSk7CisKKyAgICB2YXIgcGFyYW1zU3RyZWFtID0gbmV3IF9lbWJlck1l
dGFsU3RyZWFtc1N0cmVhbS5TdHJlYW0oZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsU3RyZWFtc1V0aWxzLnJlYWRBcnJheShwYXJhbXMuc2xpY2UoMCkpOworICAgIH0sICdw
YXJhbXMnKTsKKworICAgIGF0dHJzW3Bvc2l0aW9uYWxQYXJhbXNOYW1lXSA9IHBhcmFtc1N0cmVh
bTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAg
ICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07CisgICAgICBwYXJhbXNTdHJlYW0uYWRkRGVwZW5kZW5j
eShwYXJhbSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvdXRpbHMv
aXMtY29tcG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2ZlYXR1cmVzJywgJ2VtYmVy
LWh0bWxiYXJzL3N5c3RlbS9sb29rdXAtaGVscGVyJywgJ2VtYmVyLWh0bWxiYXJzL2tleXdvcmRz
L2Nsb3N1cmUtY29tcG9uZW50JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLCBfZW1iZXJIdG1sYmFyc0tleXdvcmRzQ2xvc3VyZUNvbXBvbmVudCwgX2VtYmVy
TWV0YWxTdHJlYW1zVXRpbHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci1odG1sYmFycworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBpc0NvbXBvbmVudDsKKworICBmdW5jdGlvbiBoYXNDb21wb25lbnRPclRlbXBsYXRl
KG93bmVyLCBwYXRoLCBvcHRpb25zKSB7CisgICAgcmV0dXJuIG93bmVyLmhhc1JlZ2lzdHJhdGlv
bignY29tcG9uZW50OicgKyBwYXRoLCBvcHRpb25zKSB8fCBvd25lci5oYXNSZWdpc3RyYXRpb24o
J3RlbXBsYXRlOmNvbXBvbmVudHMvJyArIHBhdGgsIG9wdGlvbnMpOworICB9CisKKyAgLyoKKyAg
IEdpdmVuIGEgcGF0aCBuYW1lLCByZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgY29tcG9uZW50IHdp
dGggdGhhdAorICAgbmFtZSB3YXMgZm91bmQgaW4gdGhlIGNvbnRhaW5lci4KKyAgKi8KKworICBm
dW5jdGlvbiBpc0NvbXBvbmVudChlbnYsIHNjb3BlLCBwYXRoKSB7CisgICAgdmFyIG93bmVyID0g
ZW52Lm93bmVyOworICAgIGlmICghb3duZXIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeworICAgICAgaWYgKF9lbWJlckh0
bWxiYXJzU3lzdGVtTG9va3VwSGVscGVyLkNPTlRBSU5TX0RPVF9DQUNIRS5nZXQocGF0aCkpIHsK
KyAgICAgICAgdmFyIHN0cmVhbSA9IGVudi5ob29rcy5nZXQoZW52LCBzY29wZSwgcGF0aCk7Cisg
ICAgICAgIGlmIChfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShzdHJlYW0pKSB7Cisg
ICAgICAgICAgdmFyIGNlbGwgPSBzdHJlYW0udmFsdWUoKTsKKyAgICAgICAgICBpZiAoX2VtYmVy
SHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVDb21wb25lbnQuaXNDb21wb25lbnRDZWxsKGNlbGwpKSB7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0KKyAgICAgIGlmICghX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIuQ09OVEFJTlNf
REFTSF9DQUNIRS5nZXQocGF0aCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQor
CisgICAgICBpZiAoaGFzQ29tcG9uZW50T3JUZW1wbGF0ZShvd25lciwgcGF0aCkpIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7IC8vIGdsb2JhbCBjb21wb25lbnQgZm91bmQKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBlbnYubWV0YSAmJiBlbnYubWV0YS5tb2R1bGVO
YW1lOworCisgICAgICAgICAgaWYgKCFtb2R1bGVOYW1lKSB7CisgICAgICAgICAgICAvLyBXaXRo
b3V0IGEgc291cmNlIG1vZHVsZU5hbWUsIHdlIGNhbiBub3QgcGVyZm9ybSBsb2NhbCBsb29rdXBz
LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZh
ciBvcHRpb25zID0geyBzb3VyY2U6ICd0ZW1wbGF0ZTonICsgbW9kdWxlTmFtZSB9OworCisgICAg
ICAgICAgcmV0dXJuIGhhc0NvbXBvbmVudE9yVGVtcGxhdGUob3duZXIsIHBhdGgsIG9wdGlvbnMp
OworICAgICAgICB9CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItaHRtbGJhcnMvdXRp
bHMvbG9va3VwLWNvbXBvbmVudCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9mZWF0dXJlcydd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbG9va3VwQ29tcG9uZW50OworCisgIGZ1bmN0aW9u
IGxvb2t1cENvbXBvbmVudFBhaXIoY29tcG9uZW50TG9va3VwLCBvd25lciwgbmFtZSwgb3B0aW9u
cykgeworICAgIHJldHVybiB7CisgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudExvb2t1cC5jb21w
b25lbnRGb3IobmFtZSwgb3duZXIsIG9wdGlvbnMpLAorICAgICAgbGF5b3V0OiBjb21wb25lbnRM
b29rdXAubGF5b3V0Rm9yKG5hbWUsIG93bmVyLCBvcHRpb25zKQorICAgIH07CisgIH0KKworICBm
dW5jdGlvbiBsb29rdXBDb21wb25lbnQob3duZXIsIG5hbWUsIG9wdGlvbnMpIHsKKyAgICB2YXIg
Y29tcG9uZW50TG9va3VwID0gb3duZXIubG9va3VwKCdjb21wb25lbnQtbG9va3VwOm1haW4nKTsK
KworICAgIHZhciBzb3VyY2UgPSBvcHRpb25zICYmIG9wdGlvbnMuc291cmNlOworCisgICAgaWYg
KHNvdXJjZSkgeworICAgICAgdmFyIGxvY2FsUmVzdWx0ID0gbG9va3VwQ29tcG9uZW50UGFpcihj
b21wb25lbnRMb29rdXAsIG93bmVyLCBuYW1lLCBvcHRpb25zKTsKKworICAgICAgaWYgKGxvY2Fs
UmVzdWx0LmNvbXBvbmVudCB8fCBsb2NhbFJlc3VsdC5sYXlvdXQpIHsKKyAgICAgICAgcmV0dXJu
IGxvY2FsUmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsb29rdXBDb21wb25l
bnRQYWlyKGNvbXBvbmVudExvb2t1cCwgb3duZXIsIG5hbWUpOworICB9Cit9KTsKK2VuaWZlZCgn
ZW1iZXItaHRtbGJhcnMvdXRpbHMvbmV3LXN0cmVhbScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLCBfZW1i
ZXJIdG1sYmFyc1V0aWxzU3Vic2NyaWJlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBuZXdTdHJlYW07CisKKyAgZnVuY3Rpb24gbmV3U3RyZWFtKHNjb3BlLCBrZXks
IG5ld1ZhbHVlLCByZW5kZXJOb2RlLCBpc1NlbGYpIHsKKyAgICB2YXIgc3RyZWFtID0gbmV3IF9l
bWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLmRlZmF1bHQobmV3VmFsdWUsIGlzU2VsZiA/ICcn
IDoga2V5KTsKKyAgICBpZiAocmVuZGVyTm9kZSkgeworICAgICAgX2VtYmVySHRtbGJhcnNVdGls
c1N1YnNjcmliZS5kZWZhdWx0KHJlbmRlck5vZGUsIHNjb3BlLCBzdHJlYW0pOworICAgIH0KKyAg
ICBzY29wZVtrZXldID0gc3RyZWFtOworICB9Cit9KTsKK2VuaWZlZCgiZW1iZXItaHRtbGJhcnMv
dXRpbHMvbm9ybWFsaXplLXNlbGYiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsK
KyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IG5vcm1hbGl6ZVNlbGY7CisK
KyAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZihzZWxmKSB7CisgICAgaWYgKHNlbGYgPT09IHVuZGVm
aW5lZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBz
ZWxmOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3N0cmlu
ZycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVt
L3N0cmluZycsICdodG1sYmFycy11dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcsIF9odG1sYmFyc1V0aWwpIHsKKyAgLyoq
CisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1odG1sYmFycworICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBNYXJrIGEgc3RyaW5nIGFzIHNhZmUgZm9yIHVu
ZXNjYXBlZCBvdXRwdXQgd2l0aCBFbWJlciB0ZW1wbGF0ZXMuIElmIHlvdQorICAgIHJldHVybiBI
VE1MIGZyb20gYSBoZWxwZXIsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgICAgZW5zdXJlIEVtYmVy
J3MgcmVuZGVyaW5nIGxheWVyIGRvZXMgbm90IGVzY2FwZSB0aGUgSFRNTC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEVtYmVyLlN0cmluZy5odG1sU2FmZSgnPGRpdj5zb21lU3RyaW5nPC9k
aXY+JykKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBodG1sU2FmZQorICAgIEBmb3IgRW1iZXIu
U3RyaW5nCisgICAgQHN0YXRpYworICAgIEByZXR1cm4ge0hhbmRsZWJhcnMuU2FmZVN0cmluZ30g
QSBzdHJpbmcgdGhhdCB3aWxsIG5vdCBiZSBIVE1MIGVzY2FwZWQgYnkgSGFuZGxlYmFycy4KKyAg
ICBAcHVibGljCisgICovCisgIGZ1bmN0aW9uIGh0bWxTYWZlKHN0cikgeworICAgIGlmIChzdHIg
PT09IG51bGwgfHwgc3RyID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHN0ciA9ICcnOworICAgIH0g
ZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHsKKyAgICAgIHN0ciA9ICcnICsgc3Ry
OworICAgIH0KKyAgICByZXR1cm4gbmV3IF9odG1sYmFyc1V0aWwuU2FmZVN0cmluZyhzdHIpOwor
ICB9CisKKyAgX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5kZWZhdWx0Lmh0bWxTYWZlID0gaHRt
bFNhZmU7CisgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUyA9
PT0gdHJ1ZSB8fCBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy5TdHJp
bmcpIHsKKyAgICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0gZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIGh0bWxTYWZlKHRoaXMpOworICAgIH07CisgIH0KKworICBleHBvcnRzLlNhZmVT
dHJpbmcgPSBfaHRtbGJhcnNVdGlsLlNhZmVTdHJpbmc7CisgIGV4cG9ydHMuaHRtbFNhZmUgPSBo
dG1sU2FmZTsKKyAgZXhwb3J0cy5lc2NhcGVFeHByZXNzaW9uID0gX2h0bWxiYXJzVXRpbC5lc2Nh
cGVFeHByZXNzaW9uOworfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3N1YnNjcmli
ZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJ10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gc3Vic2NyaWJlOworCisgIGZ1bmN0aW9uIHN1YnNjcmliZShub2Rl
LCBlbnYsIHNjb3BlLCBzdHJlYW0pIHsKKyAgICBpZiAoIV9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LmlzU3RyZWFtKHN0cmVhbSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGNvbXBv
bmVudCA9IHNjb3BlLmdldENvbXBvbmVudCgpOworICAgIHZhciB1bnN1YnNjcmliZXJzID0gbm9k
ZS5zdHJlYW1VbnN1YnNjcmliZXJzID0gbm9kZS5zdHJlYW1VbnN1YnNjcmliZXJzIHx8IFtdOwor
CisgICAgdW5zdWJzY3JpYmVycy5wdXNoKHN0cmVhbS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkgewor
ICAgICAgbm9kZS5pc0RpcnR5ID0gdHJ1ZTsKKworICAgICAgLy8gV2hlbmV2ZXIgYSByZW5kZXIg
bm9kZSBkaXJlY3RseSBpbnNpZGUgYSBjb21wb25lbnQgYmVjb21lcworICAgICAgLy8gZGlydHks
IHdlIHdhbnQgdG8gaW52b2tlIHRoZSB3aWxsUmVuZGVyRWxlbWVudCBhbmQKKyAgICAgIC8vIGRp
ZFJlbmRlckVsZW1lbnQgbGlmZWN5Y2xlIGhvb2tzLiBGcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0
aGUKKyAgICAgIC8vIHByb2dyYW1taW5nIG1vZGVsLCB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUg
RE9NIGNoYW5nZXMsIGEKKyAgICAgIC8vICJyZS1yZW5kZXIiIGhhcyBvY2N1cmVkLgorICAgICAg
aWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuX3JlbmRlck5vZGUpIHsKKyAgICAgICAgY29tcG9u
ZW50Ll9yZW5kZXJOb2RlLmlzRGlydHkgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAobm9k
ZS5nZXRTdGF0ZSgpLm1hbmFnZXIpIHsKKyAgICAgICAgbm9kZS5zaG91bGRSZWNlaXZlQXR0cnMg
PSB0cnVlOworICAgICAgfQorCisgICAgICBub2RlLm93bmVyTm9kZS5lbWJlclZpZXcuc2NoZWR1
bGVSZXZhbGlkYXRlKG5vZGUsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmxhYmVsRm9yKHN0cmVh
bSkpOworICAgIH0pKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLWh0bWxiYXJzL3V0aWxzL3Vw
ZGF0ZS1zY29wZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVh
bScsICdlbWJlci1odG1sYmFycy91dGlscy9zdWJzY3JpYmUnXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsU3RyZWFtc1Byb3h5U3RyZWFtLCBfZW1iZXJIdG1sYmFyc1V0aWxzU3Vic2Ny
aWJlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSB1cGRhdGVTY29w
ZTsKKworICBmdW5jdGlvbiB1cGRhdGVTY29wZShzY29wZSwga2V5LCBuZXdWYWx1ZSwgcmVuZGVy
Tm9kZSwgaXNTZWxmKSB7CisgICAgdmFyIGV4aXN0aW5nID0gc2NvcGVba2V5XTsKKworICAgIGlm
IChleGlzdGluZykgeworICAgICAgZXhpc3Rpbmcuc2V0U291cmNlKG5ld1ZhbHVlKTsKKyAgICB9
IGVsc2UgeworICAgICAgdmFyIHN0cmVhbSA9IG5ldyBfZW1iZXJNZXRhbFN0cmVhbXNQcm94eVN0
cmVhbS5kZWZhdWx0KG5ld1ZhbHVlLCBpc1NlbGYgPyBudWxsIDoga2V5KTsKKyAgICAgIGlmIChy
ZW5kZXJOb2RlKSB7CisgICAgICAgIF9lbWJlckh0bWxiYXJzVXRpbHNTdWJzY3JpYmUuZGVmYXVs
dChyZW5kZXJOb2RlLCBzY29wZSwgc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHNjb3BlW2tleV0g
PSBzdHJlYW07CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwtdmlld3MvaHRt
bGJhcnMtcmVuZGVyZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1i
ZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJl
ci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2J1aWxkLWNvbXBvbmVudC10ZW1wbGF0ZScsICdlbWJlci1tZXRhbC9lbnZpcm9u
bWVudCcsICdodG1sYmFycy1ydW50aW1lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bFJ1bl9sb29wLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9z
ZXQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVzLCBfZW1iZXJW
aWV3c1N5c3RlbUJ1aWxkQ29tcG9uZW50VGVtcGxhdGUsIF9lbWJlck1ldGFsRW52aXJvbm1lbnQs
IF9odG1sYmFyc1J1bnRpbWUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuUmVuZGVy
ZXIgPSBSZW5kZXJlcjsKKyAgZXhwb3J0cy5Nb3JwaFNldCA9IE1vcnBoU2V0OworCisgIGZ1bmN0
aW9uIFJlbmRlcmVyKGRvbUhlbHBlcikgeworICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0
aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07
CisKKyAgICB2YXIgZGVzdGluZWRGb3JET00gPSBfcmVmLmRlc3RpbmVkRm9yRE9NOworCisgICAg
dGhpcy5fZG9tID0gZG9tSGVscGVyOworCisgICAgLy8gVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0
aGVyIHRoZSByZXN1bHRpbmcgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlCisgICAgLy8gaW5zZXJ0
ZWQgaW50byB0aGUgRE9NLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYCBpZiB0aGUgcmVu
ZGVyZWQKKyAgICAvLyBlbGVtZW50IGlzIGdvaW5nIHRvIGJlIHNlcmlhbGl6ZWQgdG8gSFRNTCB3
aXRob3V0IGJlaW5nIGluc2VydGVkIGludG8KKyAgICAvLyB0aGUgRE9NIChlLmcuLCBpbiBGYXN0
Qm9vdCBtb2RlKS4gQnkgZGVmYXVsdCwgdGhpcyBmbGFnIGlzIHRoZSBzYW1lCisgICAgLy8gYXMg
d2hldGhlciB3ZSBhcmUgcnVubmluZyBpbiBhbiBlbnZpcm9ubWVudCB3aXRoIERPTSwgYnV0IG1h
eSBiZQorICAgIC8vIG92ZXJyaWRkZW4uCisgICAgdGhpcy5fZGVzdGluZWRGb3JET00gPSBkZXN0
aW5lZEZvckRPTSA9PT0gdW5kZWZpbmVkID8gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0
Lmhhc0RPTSA6IGRlc3RpbmVkRm9yRE9NOworICB9CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLnBy
ZXJlbmRlclRvcExldmVsVmlldyA9IGZ1bmN0aW9uIFJlbmRlcmVyX3ByZXJlbmRlclRvcExldmVs
Vmlldyh2aWV3LCByZW5kZXJOb2RlKSB7CisgICAgaWYgKHZpZXcuX3N0YXRlID09PSAnaW5ET00n
KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgaW5zZXJ0IGEgVmlldyB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQnKTsKKyAgICB9CisgICAgdmlldy5vd25lclZpZXcg
PSByZW5kZXJOb2RlLmVtYmVyVmlldyA9IHZpZXc7CisgICAgdmlldy5fcmVuZGVyTm9kZSA9IHJl
bmRlck5vZGU7CisKKyAgICB2YXIgbGF5b3V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0
KHZpZXcsICdsYXlvdXQnKTsKKyAgICB2YXIgdGVtcGxhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodmlldywgJ3RlbXBsYXRlJyk7CisKKyAgICB2YXIgY29tcG9uZW50SW5mbyA9IHsg
Y29tcG9uZW50OiB2aWV3LCBsYXlvdXQ6IGxheW91dCB9OworCisgICAgdmFyIGJsb2NrID0gX2Vt
YmVyVmlld3NTeXN0ZW1CdWlsZENvbXBvbmVudFRlbXBsYXRlLmRlZmF1bHQoY29tcG9uZW50SW5m
bywge30sIHsKKyAgICAgIHNlbGY6IHZpZXcsCisgICAgICB0ZW1wbGF0ZXM6IHRlbXBsYXRlID8g
eyBkZWZhdWx0OiB0ZW1wbGF0ZS5yYXcgfSA6IHVuZGVmaW5lZAorICAgIH0pLmJsb2NrOworCisg
ICAgdmlldy5yZW5kZXJCbG9jayhibG9jaywgcmVuZGVyTm9kZSk7CisgICAgdmlldy5sYXN0UmVz
dWx0ID0gcmVuZGVyTm9kZS5sYXN0UmVzdWx0OworICAgIHRoaXMuY2xlYXJSZW5kZXJlZFZpZXdz
KHZpZXcuZW52KTsKKyAgfTsKKworICBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyVG9wTGV2ZWxW
aWV3ID0gZnVuY3Rpb24gUmVuZGVyZXJfcmVuZGVyVG9wTGV2ZWxWaWV3KHZpZXcsIHJlbmRlck5v
ZGUpIHsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgaW5zZXJ0aW9uIGhhcyBiZWVuIGNhbmNlbGVk
LgorICAgIGlmICh2aWV3Ll93aWxsSW5zZXJ0KSB7CisgICAgICB2aWV3Ll93aWxsSW5zZXJ0ID0g
ZmFsc2U7CisgICAgICB0aGlzLnByZXJlbmRlclRvcExldmVsVmlldyh2aWV3LCByZW5kZXJOb2Rl
KTsKKyAgICAgIHRoaXMuZGlzcGF0Y2hMaWZlY3ljbGVIb29rcyh2aWV3LmVudik7CisgICAgfQor
ICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXZhbGlkYXRlVG9wTGV2ZWxWaWV3ID0gZnVu
Y3Rpb24gUmVuZGVyZXJfcmV2YWxpZGF0ZVRvcExldmVsVmlldyh2aWV3KSB7CisgICAgLy8gVGhp
cyBndWFyZCBwcmV2ZW50cyByZXZhbGlkYXRpb24gb24gYW4gYWxyZWFkeS1kZXN0cm95ZWQgdmll
dy4KKyAgICBpZiAodmlldy5fcmVuZGVyTm9kZS5sYXN0UmVzdWx0KSB7CisgICAgICB2aWV3Ll9y
ZW5kZXJOb2RlLmxhc3RSZXN1bHQucmV2YWxpZGF0ZSh2aWV3LmVudik7CisgICAgICAvLyBzdXBw
b3J0cyBjcmVhdGVFbGVtZW50LCB3aGljaCBvcGVyYXRlcyB3aXRob3V0IG1vdmluZyB0aGUgdmll
dyBpbnRvCisgICAgICAvLyB0aGUgaW5ET00gc3RhdGUuCisgICAgICBpZiAodmlldy5fc3RhdGUg
PT09ICdpbkRPTScpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRjaExpZmVjeWNsZUhvb2tzKHZpZXcu
ZW52KTsKKyAgICAgIH0KKyAgICAgIHRoaXMuY2xlYXJSZW5kZXJlZFZpZXdzKHZpZXcuZW52KTsK
KyAgICB9CisgIH07CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLmRpc3BhdGNoTGlmZWN5Y2xlSG9v
a3MgPSBmdW5jdGlvbiBSZW5kZXJlcl9kaXNwYXRjaExpZmVjeWNsZUhvb2tzKGVudikgeworICAg
IHZhciBvd25lclZpZXcgPSBlbnYudmlldzsKKworICAgIHZhciBsaWZlY3ljbGVIb29rcyA9IGVu
di5saWZlY3ljbGVIb29rczsKKyAgICB2YXIgaSwgaG9vazsKKworICAgIGZvciAoaSA9IDA7IGkg
PCBsaWZlY3ljbGVIb29rcy5sZW5ndGg7IGkrKykgeworICAgICAgaG9vayA9IGxpZmVjeWNsZUhv
b2tzW2ldOworICAgICAgb3duZXJWaWV3Ll9kaXNwYXRjaGluZyA9IGhvb2sudHlwZTsKKworICAg
ICAgc3dpdGNoIChob29rLnR5cGUpIHsKKyAgICAgICAgY2FzZSAnZGlkSW5zZXJ0RWxlbWVudCc6
CisgICAgICAgICAgdGhpcy5kaWRJbnNlcnRFbGVtZW50KGhvb2sudmlldyk7YnJlYWs7CisgICAg
ICAgIGNhc2UgJ2RpZFVwZGF0ZSc6CisgICAgICAgICAgdGhpcy5kaWRVcGRhdGUoaG9vay52aWV3
KTticmVhazsKKyAgICAgIH0KKworICAgICAgdGhpcy5kaWRSZW5kZXIoaG9vay52aWV3KTsKKyAg
ICB9CisKKyAgICBvd25lclZpZXcuX2Rpc3BhdGNoaW5nID0gbnVsbDsKKyAgICBlbnYubGlmZWN5
Y2xlSG9va3MubGVuZ3RoID0gMDsKKyAgfTsKKworICBSZW5kZXJlci5wcm90b3R5cGUuZW5zdXJl
Vmlld05vdFJlbmRlcmluZyA9IGZ1bmN0aW9uIFJlbmRlcmVyX2Vuc3VyZVZpZXdOb3RSZW5kZXJp
bmcodmlldykgeworICAgIHZhciBlbnYgPSB2aWV3Lm93bmVyVmlldy5lbnY7CisgICAgaWYgKGVu
diAmJiBlbnYucmVuZGVyZWRWaWV3cy5pbmRleE9mKHZpZXcuZWxlbWVudElkKSAhPT0gLTEpIHsK
KyAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHlvdSBkaWQgY2F1c2VkIGEgdmlldyB0
byByZS1yZW5kZXIgYWZ0ZXIgaXQgcmVuZGVyZWQgYnV0IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQg
aW50byB0aGUgRE9NLicpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBNb3JwaFNldCgpIHsK
KyAgICB0aGlzLm1vcnBocyA9IFtdOworICB9CisKKyAgTW9ycGhTZXQucHJvdG90eXBlLmFkZCA9
IGZ1bmN0aW9uIChtb3JwaCkgeworICAgIHRoaXMubW9ycGhzLnB1c2gobW9ycGgpOworICAgIG1v
cnBoLnNlZW4gPSB0cnVlOworICB9OworCisgIE1vcnBoU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5j
dGlvbiAobW9ycGgpIHsKKyAgICByZXR1cm4gbW9ycGguc2VlbjsKKyAgfTsKKworICBNb3JwaFNl
dC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIG1vcnBocyA9IHRoaXMu
bW9ycGhzOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9ycGhzLmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgbW9ycGhzW2ldLnNlZW4gPSBmYWxzZTsKKyAgICB9CisKKyAgICB0aGlzLm1v
cnBocyA9IFtdOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5jbGVhclJlbmRlcmVkVmll
d3MgPSBmdW5jdGlvbiBSZW5kZXJlcl9jbGVhclJlbmRlcmVkVmlld3MoZW52KSB7CisgICAgZW52
LnJlbmRlcmVkTm9kZXMuY2xlYXIoKTsKKyAgICBlbnYucmVuZGVyZWRWaWV3cy5sZW5ndGggPSAw
OworICB9OworCisgIC8vIFRoaXMgZW50cnkgcG9pbnQgaXMgY2FsbGVkIGZyb20gdG9wLWxldmVs
IGB2aWV3LmFwcGVuZFRvYC4KKyAgUmVuZGVyZXIucHJvdG90eXBlLmFwcGVuZFRvID0gZnVuY3Rp
b24gUmVuZGVyZXJfYXBwZW5kVG8odmlldywgdGFyZ2V0KSB7CisgICAgdmFyIG1vcnBoID0gdGhp
cy5fZG9tLmFwcGVuZE1vcnBoKHRhcmdldCk7CisgICAgbW9ycGgub3duZXJOb2RlID0gbW9ycGg7
CisgICAgdmlldy5fd2lsbEluc2VydCA9IHRydWU7CisgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5k
ZWZhdWx0LnNjaGVkdWxlKCdyZW5kZXInLCB0aGlzLCB0aGlzLnJlbmRlclRvcExldmVsVmlldywg
dmlldywgbW9ycGgpOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXBsYWNlSW4gPSBm
dW5jdGlvbiBSZW5kZXJlcl9yZXBsYWNlSW4odmlldywgdGFyZ2V0KSB7CisgICAgdmFyIG1vcnBo
ID0gdGhpcy5fZG9tLnJlcGxhY2VDb250ZW50V2l0aE1vcnBoKHRhcmdldCk7CisgICAgbW9ycGgu
b3duZXJOb2RlID0gbW9ycGg7CisgICAgdmlldy5fd2lsbEluc2VydCA9IHRydWU7CisgICAgX2Vt
YmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgdGhp
cy5yZW5kZXJUb3BMZXZlbFZpZXcsIHZpZXcsIG1vcnBoKTsKKyAgfTsKKworICBSZW5kZXJlci5w
cm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIFJlbmRlcmVyX2NyZWF0ZUVsZW1lbnQo
dmlldykgeworICAgIHZhciBtb3JwaCA9IHRoaXMuX2RvbS5jcmVhdGVGcmFnbWVudE1vcnBoKCk7
CisgICAgbW9ycGgub3duZXJOb2RlID0gbW9ycGg7CisgICAgdGhpcy5wcmVyZW5kZXJUb3BMZXZl
bFZpZXcodmlldywgbW9ycGgpOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWRDcmVh
dGVFbGVtZW50ID0gZnVuY3Rpb24gKHZpZXcsIGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudCkg
eworICAgICAgdmlldy5lbGVtZW50ID0gZWxlbWVudDsKKyAgICB9CisKKyAgICBpZiAodmlldy5f
dHJhbnNpdGlvblRvKSB7CisgICAgICB2aWV3Ll90cmFuc2l0aW9uVG8oJ2hhc0VsZW1lbnQnKTsK
KyAgICB9CisgIH07IC8vIGhhc0VsZW1lbnQKKworICBSZW5kZXJlci5wcm90b3R5cGUud2lsbElu
c2VydEVsZW1lbnQgPSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsK
KyAgICAgIHZpZXcudHJpZ2dlcignd2lsbEluc2VydEVsZW1lbnQnKTsKKyAgICB9CisgIH07IC8v
IFdpbGwgcGxhY2UgaW50byBET00uCisKKyAgUmVuZGVyZXIucHJvdG90eXBlLnNldEF0dHJzID0g
ZnVuY3Rpb24gKHZpZXcsIGF0dHJzKSB7CisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0
KHZpZXcsICdhdHRycycsIGF0dHJzKTsKKyAgfTsgLy8gU2V0IGF0dHJzIHRoZSBmaXJzdCB0aW1l
LgorCisgIFJlbmRlcmVyLnByb3RvdHlwZS5jb21wb25lbnRJbml0QXR0cnMgPSBmdW5jdGlvbiAo
Y29tcG9uZW50LCBhdHRycykgeworICAgIGNvbXBvbmVudC50cmlnZ2VyKCdkaWRJbml0QXR0cnMn
LCB7IGF0dHJzOiBhdHRycyB9KTsKKyAgICBjb21wb25lbnQudHJpZ2dlcignZGlkUmVjZWl2ZUF0
dHJzJywgeyBuZXdBdHRyczogYXR0cnMgfSk7CisgIH07IC8vIFNldCBhdHRycyB0aGUgZmlyc3Qg
dGltZS4KKworICBSZW5kZXJlci5wcm90b3R5cGUuZGlkSW5zZXJ0RWxlbWVudCA9IGZ1bmN0aW9u
ICh2aWV3KSB7CisgICAgaWYgKHZpZXcuX3RyYW5zaXRpb25UbykgeworICAgICAgdmlldy5fdHJh
bnNpdGlvblRvKCdpbkRPTScpOworICAgIH0KKworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAg
ICAgIHZpZXcudHJpZ2dlcignZGlkSW5zZXJ0RWxlbWVudCcpOworICAgIH0KKyAgfTsgLy8gaW5E
T00gLy8gUGxhY2VkIGludG8gRE9NLgorCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWRVcGRhdGUg
PSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAgICAgIHZpZXcu
dHJpZ2dlcignZGlkVXBkYXRlJyk7CisgICAgfQorICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlw
ZS5kaWRSZW5kZXIgPSBmdW5jdGlvbiAodmlldykgeworICAgIGlmICh2aWV3LnRyaWdnZXIpIHsK
KyAgICAgIHZpZXcudHJpZ2dlcignZGlkUmVuZGVyJyk7CisgICAgfQorICB9OworCisgIFJlbmRl
cmVyLnByb3RvdHlwZS51cGRhdGVBdHRycyA9IGZ1bmN0aW9uICh2aWV3LCBhdHRycykgeworICAg
IHRoaXMuc2V0QXR0cnModmlldywgYXR0cnMpOworICB9OyAvLyBTZXR0aW5nIG5ldyBhdHRycy4K
KworICBSZW5kZXJlci5wcm90b3R5cGUuY29tcG9uZW50VXBkYXRlQXR0cnMgPSBmdW5jdGlvbiAo
Y29tcG9uZW50LCBuZXdBdHRycykgeworICAgIHZhciBvbGRBdHRycyA9IG51bGw7CisKKyAgICBp
ZiAoY29tcG9uZW50LmF0dHJzKSB7CisgICAgICBvbGRBdHRycyA9IF9lbWJlck1ldGFsQXNzaWdu
LmRlZmF1bHQoe30sIGNvbXBvbmVudC5hdHRycyk7CisgICAgICBfZW1iZXJNZXRhbFNldF9wcm9w
ZXJ0aWVzLmRlZmF1bHQoY29tcG9uZW50LmF0dHJzLCBuZXdBdHRycyk7CisgICAgfSBlbHNlIHsK
KyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChjb21wb25lbnQsICdhdHRycycsIG5l
d0F0dHJzKTsKKyAgICB9CisKKyAgICBjb21wb25lbnQudHJpZ2dlcignZGlkVXBkYXRlQXR0cnMn
LCB7IG9sZEF0dHJzOiBvbGRBdHRycywgbmV3QXR0cnM6IG5ld0F0dHJzIH0pOworICAgIGNvbXBv
bmVudC50cmlnZ2VyKCdkaWRSZWNlaXZlQXR0cnMnLCB7IG9sZEF0dHJzOiBvbGRBdHRycywgbmV3
QXR0cnM6IG5ld0F0dHJzIH0pOworICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS53aWxsVXBk
YXRlID0gZnVuY3Rpb24gKHZpZXcsIGF0dHJzKSB7CisgICAgaWYgKHZpZXcuX3dpbGxVcGRhdGUp
IHsKKyAgICAgIHZpZXcuX3dpbGxVcGRhdGUoYXR0cnMpOworICAgIH0KKyAgfTsKKworICBSZW5k
ZXJlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIChjb21wb25lbnQp
IHsKKyAgICBjb21wb25lbnQudHJpZ2dlcignd2lsbFVwZGF0ZScpOworICB9OworCisgIFJlbmRl
cmVyLnByb3RvdHlwZS53aWxsUmVuZGVyID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBpZiAodmll
dy5fd2lsbFJlbmRlcikgeworICAgICAgdmlldy5fd2lsbFJlbmRlcigpOworICAgIH0KKyAgfTsK
KworICBSZW5kZXJlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlbmRlciA9IGZ1bmN0aW9uIChj
b21wb25lbnQpIHsKKyAgICBjb21wb25lbnQudHJpZ2dlcignd2lsbFJlbmRlcicpOworICB9Owor
CisgIFJlbmRlcmVyLnByb3RvdHlwZS5yZXJlbmRlciA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICAg
dmFyIHJlbmRlck5vZGUgPSB2aWV3Ll9yZW5kZXJOb2RlOworCisgICAgcmVuZGVyTm9kZS5pc0Rp
cnR5ID0gdHJ1ZTsKKyAgICBfaHRtbGJhcnNSdW50aW1lLmludGVybmFsLnZpc2l0Q2hpbGRyZW4o
cmVuZGVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgaWYgKG5vZGUu
Z2V0U3RhdGUoKS5tYW5hZ2VyKSB7CisgICAgICAgIG5vZGUuc2hvdWxkUmVjZWl2ZUF0dHJzID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICAgIG5vZGUuaXNEaXJ0eSA9IHRydWU7CisgICAgfSk7CisKKyAg
ICByZW5kZXJOb2RlLm93bmVyTm9kZS5lbWJlclZpZXcuc2NoZWR1bGVSZXZhbGlkYXRlKHJlbmRl
ck5vZGUsIHZpZXcudG9TdHJpbmcoKSwgJ3JlcmVuZGVyaW5nJyk7CisgIH07CisKKyAgUmVuZGVy
ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2aWV3LCBzaG91bGREZXN0cm95KSB7Cisg
ICAgdGhpcy53aWxsRGVzdHJveUVsZW1lbnQodmlldyk7CisKKyAgICB2aWV3Ll93aWxsUmVtb3Zl
RWxlbWVudCA9IHRydWU7CisgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
KCdyZW5kZXInLCB0aGlzLCB0aGlzLnJlbmRlckVsZW1lbnRSZW1vdmFsLCB2aWV3KTsKKyAgfTsK
KworICBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyRWxlbWVudFJlbW92YWwgPSBmdW5jdGlvbiBS
ZW5kZXJlcl9yZW5kZXJFbGVtZW50UmVtb3ZhbCh2aWV3KSB7CisgICAgLy8gVXNlIHRoZSBfd2ls
bFJlbW92ZUVsZW1lbnQgZmxhZyB0byBhdm9pZCBtdWxpdHBsZSByZW1vdmFsIGF0dGVtcHRzIGlu
CisgICAgLy8gY2FzZSBtYW55IGhhdmUgYmVlbiBzY2hlZHVsZWQuIFRoaXMgc2hvdWxkIGJlIG1v
cmUgcGVyZm9ybWFudCB0aGFuIHVzaW5nCisgICAgLy8gYHNjaGVkdWxlT25jZWAuCisgICAgaWYg
KHZpZXcuX3dpbGxSZW1vdmVFbGVtZW50KSB7CisgICAgICB2aWV3Ll93aWxsUmVtb3ZlRWxlbWVu
dCA9IGZhbHNlOworCisgICAgICBpZiAodmlldy5fcmVuZGVyTm9kZSAmJiB2aWV3LmVsZW1lbnQg
JiYgdmlldy5lbGVtZW50LnBhcmVudE5vZGUpIHsKKyAgICAgICAgdmlldy5fcmVuZGVyTm9kZS5j
bGVhcigpOworICAgICAgfQorICAgICAgdGhpcy5kaWREZXN0cm95RWxlbWVudCh2aWV3KTsKKyAg
ICB9CisgIH07CisKKyAgUmVuZGVyZXIucHJvdG90eXBlLndpbGxSZW1vdmVFbGVtZW50ID0gZnVu
Y3Rpb24gKCkgLyp2aWV3Ki97fTsKKworICBSZW5kZXJlci5wcm90b3R5cGUud2lsbERlc3Ryb3lF
bGVtZW50ID0gZnVuY3Rpb24gKHZpZXcpIHsKKyAgICBpZiAodmlldy5fd2lsbERlc3Ryb3lFbGVt
ZW50KSB7CisgICAgICB2aWV3Ll93aWxsRGVzdHJveUVsZW1lbnQoKTsKKyAgICB9CisgICAgaWYg
KHZpZXcudHJpZ2dlcikgeworICAgICAgdmlldy50cmlnZ2VyKCd3aWxsRGVzdHJveUVsZW1lbnQn
KTsKKyAgICAgIHZpZXcudHJpZ2dlcignd2lsbENsZWFyUmVuZGVyJyk7CisgICAgfQorCisgICAg
aWYgKHZpZXcuX3RyYW5zaXRpb25UbykgeworICAgICAgdmlldy5fdHJhbnNpdGlvblRvKCdkZXN0
cm95aW5nJyk7CisgICAgfQorICB9OworCisgIFJlbmRlcmVyLnByb3RvdHlwZS5kaWREZXN0cm95
RWxlbWVudCA9IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgdmlldy5lbGVtZW50ID0gbnVsbDsKKwor
ICAgIC8vIFZpZXdzIHRoYXQgYXJlIGJlaW5nIGRlc3Ryb3llZCBzaG91bGQgbmV2ZXIgZ28gYmFj
ayB0byB0aGUgcHJlUmVuZGVyIHN0YXRlLgorICAgIC8vIEhvd2V2ZXIgaWYgd2UncmUganVzdCBk
ZXN0cm95aW5nIGFuIGVsZW1lbnQgb24gYSB2aWV3IChhcyBpcyB0aGUgY2FzZSB3aGVuCisgICAg
Ly8gdXNpbmcgVmlldyNyZW1vdmUpIHRoZW4gdGhlIHZpZXcgc2hvdWxkIGdvIHRvIGEgcHJlUmVu
ZGVyIHN0YXRlIHNvIHRoYXQKKyAgICAvLyBpdCBjYW4gYmUgcmVuZGVyZWQgYWdhaW4gbGF0ZXIu
CisgICAgaWYgKHZpZXcuX3N0YXRlICE9PSAnZGVzdHJveWluZycgJiYgdmlldy5fdHJhbnNpdGlv
blRvKSB7CisgICAgICB2aWV3Ll90cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOworICAgIH0KKwor
ICAgIGlmICh2aWV3LnRyaWdnZXIpIHsKKyAgICAgIHZpZXcudHJpZ2dlcignZGlkRGVzdHJveUVs
ZW1lbnQnKTsKKyAgICB9CisgIH07IC8vIEVsZW1lbnQgZGVzdHJveWVkIHNvIHZpZXcuZGVzdHJv
eSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdCByZW1vdmVkRnJvbURPTQorCisgIHZhciBJbmVy
dFJlbmRlcmVyID0geworICAgIGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYyKSB7CisgICAgICB2YXIg
ZG9tID0gX3JlZjIuZG9tOworCisgICAgICByZXR1cm4gbmV3IFJlbmRlcmVyKGRvbSwgeyBkZXN0
aW5lZEZvckRPTTogZmFsc2UgfSk7CisgICAgfQorICB9OworCisgIGV4cG9ydHMuSW5lcnRSZW5k
ZXJlciA9IEluZXJ0UmVuZGVyZXI7CisgIHZhciBJbnRlcmFjdGl2ZVJlbmRlcmVyID0geworICAg
IGNyZWF0ZTogZnVuY3Rpb24gKF9yZWYzKSB7CisgICAgICB2YXIgZG9tID0gX3JlZjMuZG9tOwor
CisgICAgICByZXR1cm4gbmV3IFJlbmRlcmVyKGRvbSwgeyBkZXN0aW5lZEZvckRPTTogdHJ1ZSB9
KTsKKyAgICB9CisgIH07CisgIGV4cG9ydHMuSW50ZXJhY3RpdmVSZW5kZXJlciA9IEludGVyYWN0
aXZlUmVuZGVyZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwtdmlld3MvaW5kZXgnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwtdmlld3MvaHRtbGJhcnMtcmVuZGVyZXInXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsVmlld3NIdG1sYmFyc1JlbmRlcmVyKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICBmdW5jdGlvbiBfaW50ZXJvcEV4cG9ydFdpbGRjYXJkKG9iaiwgZGVmYXVsdHMp
IHsgdmFyIG5ld09iaiA9IGRlZmF1bHRzKHt9LCBvYmopOyBkZWxldGUgbmV3T2JqWydkZWZhdWx0
J107IHJldHVybiBuZXdPYmo7IH0KKworICBmdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0
cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9y
ICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2
YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkp
OyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmlu
ZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4g
b2JqOyB9CisKKyAgX2RlZmF1bHRzKGV4cG9ydHMsIF9pbnRlcm9wRXhwb3J0V2lsZGNhcmQoX2Vt
YmVyTWV0YWxWaWV3c0h0bWxiYXJzUmVuZGVyZXIsIF9kZWZhdWx0cykpOworfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL2FsaWFzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1i
ZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9j
b21wdXRlZCcsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9tZXRhJywgJ2VtYmVy
LW1ldGFsL2RlcGVuZGVudF9rZXlzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERl
YnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9l
bWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxDb21wdXRl
ZCwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxNZXRhLCBfZW1iZXJNZXRhbERlcGVuZGVu
dF9rZXlzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBhbGlhczsK
KyAgZXhwb3J0cy5BbGlhc2VkUHJvcGVydHkgPSBBbGlhc2VkUHJvcGVydHk7CisKKyAgZnVuY3Rp
b24gYWxpYXMoYWx0S2V5KSB7CisgICAgcmV0dXJuIG5ldyBBbGlhc2VkUHJvcGVydHkoYWx0S2V5
KTsKKyAgfQorCisgIGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0eShhbHRLZXkpIHsKKyAgICB0aGlz
LmlzRGVzY3JpcHRvciA9IHRydWU7CisgICAgdGhpcy5hbHRLZXkgPSBhbHRLZXk7CisgICAgdGhp
cy5fZGVwZW5kZW50S2V5cyA9IFthbHRLZXldOworICB9CisKKyAgQWxpYXNlZFByb3BlcnR5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3Iu
cHJvdG90eXBlKTsKKworICBBbGlhc2VkUHJvcGVydHkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9u
IEFsaWFzZWRQcm9wZXJ0eV9nZXQob2JqLCBrZXlOYW1lKSB7CisgICAgcmV0dXJuIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldChvYmosIHRoaXMuYWx0S2V5KTsKKyAgfTsKKworICBBbGlhc2Vk
UHJvcGVydHkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0eV9zZXQob2Jq
LCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5z
ZXQob2JqLCB0aGlzLmFsdEtleSwgdmFsdWUpOworICB9OworCisgIEFsaWFzZWRQcm9wZXJ0eS5w
cm90b3R5cGUud2lsbFdhdGNoID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIF9lbWJl
ck1ldGFsRGVwZW5kZW50X2tleXMuYWRkRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUs
IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaikpOworICB9OworCisgIEFsaWFzZWRQcm9wZXJ0eS5w
cm90b3R5cGUuZGlkVW53YXRjaCA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKKyAgICBfZW1i
ZXJNZXRhbERlcGVuZGVudF9rZXlzLnJlbW92ZURlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlO
YW1lLCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopKTsKKyAgfTsKKworICBBbGlhc2VkUHJvcGVy
dHkucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdTZXR0aW5nIGFsaWFzIFwnJyArIGtleU5hbWUgKyAnXCcgb24g
c2VsZicsIHRoaXMuYWx0S2V5ICE9PSBrZXlOYW1lKTsKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFs
TWV0YS5tZXRhKG9iaik7CisgICAgaWYgKG0ucGVla1dhdGNoaW5nKGtleU5hbWUpKSB7CisgICAg
ICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBr
ZXlOYW1lLCBtKTsKKyAgICB9CisgIH07CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3RvdHlwZS50
ZWFyZG93biA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKKyAgICB2YXIgbSA9IF9lbWJlck1l
dGFsTWV0YS5tZXRhKG9iaik7CisgICAgaWYgKG0ucGVla1dhdGNoaW5nKGtleU5hbWUpKSB7Cisg
ICAgICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLnJlbW92ZURlcGVuZGVudEtleXModGhpcywg
b2JqLCBrZXlOYW1lLCBtKTsKKyAgICB9CisgIH07CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3Rv
dHlwZS5yZWFkT25seSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnNldCA9IEFsaWFzZWRQcm9w
ZXJ0eV9yZWFkT25seVNldDsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworICBmdW5jdGlvbiBB
bGlhc2VkUHJvcGVydHlfcmVhZE9ubHlTZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIHRo
cm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0Nhbm5vdCBzZXQgcmVhZC1vbmx5IHBy
b3BlcnR5IFwnJyArIGtleU5hbWUgKyAnXCcgb24gb2JqZWN0OiAnICsgX2VtYmVyTWV0YWxVdGls
cy5pbnNwZWN0KG9iaikpOworICB9CisKKyAgQWxpYXNlZFByb3BlcnR5LnByb3RvdHlwZS5vbmVX
YXkgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5zZXQgPSBBbGlhc2VkUHJvcGVydHlfb25lV2F5
U2V0OworICAgIHJldHVybiB0aGlzOworICB9OworCisgIGZ1bmN0aW9uIEFsaWFzZWRQcm9wZXJ0
eV9vbmVXYXlTZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIF9lbWJlck1ldGFsUHJvcGVy
dGllcy5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwpOworICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldC5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgIH0KKworICAv
LyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEVtYmVyIERhdGEuCisgIEFsaWFzZWRQcm9w
ZXJ0eS5wcm90b3R5cGUuX21ldGEgPSB1bmRlZmluZWQ7CisgIEFsaWFzZWRQcm9wZXJ0eS5wcm90
b3R5cGUubWV0YSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5
cGUubWV0YTsKK30pOworZW5pZmVkKCJlbWJlci1tZXRhbC9hc3NpZ24iLCBbImV4cG9ydHMiXSwg
ZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoqCisgICAgQ29weSBwcm9wZXJ0aWVzIGZyb20gYSBz
b3VyY2Ugb2JqZWN0IHRvIGEgdGFyZ2V0IG9iamVjdC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciBhID0ge2ZpcnN0OiAnWWVodWRhJ307CisgICAgdmFyIGIgPSB7bGFzdDogJ0thdHon
fTsKKyAgICB2YXIgYyA9IHtjb21wYW55OiAnVGlsZGUgSW5jLid9OworICAgIEVtYmVyLmFzc2ln
bihhLCBiLCBjKTsgLy8gYSA9PT0ge2ZpcnN0OiAnWWVodWRhJywgbGFzdDogJ0thdHonLCBjb21w
YW55OiAnVGlsZGUgSW5jLid9LCBiID09PSB7bGFzdDogJ0thdHonfSwgYyA9PT0ge2NvbXBhbnk6
ICdUaWxkZSBJbmMuJ30KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhc3NpZ24KKyAgICBAZm9y
IEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9yaWdpbmFsIFRoZSBvYmplY3QgdG8gYXNzaWdu
IGludG8KKyAgICBAcGFyYW0ge09iamVjdH0gLi4uYXJncyBUaGUgb2JqZWN0cyB0byBjb3B5IHBy
b3BlcnRpZXMgZnJvbQorICAgIEByZXR1cm4ge09iamVjdH0KKyAgICBAcHVibGljCisgICovCisg
ICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBhc3NpZ247CisKKyAgZnVuY3Rp
b24gYXNzaWduKG9yaWdpbmFsKSB7CisgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5
IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5
XTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsg
aSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJnc1tpXTsKKyAgICAgIGlmICghYXJnKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgdXBkYXRlcyA9IE9iamVjdC5rZXlz
KGFyZyk7CisKKyAgICAgIGZvciAodmFyIF9pID0gMCwgX2wgPSB1cGRhdGVzLmxlbmd0aDsgX2kg
PCBfbDsgX2krKykgeworICAgICAgICB2YXIgcHJvcCA9IHVwZGF0ZXNbX2ldOworICAgICAgICBv
cmlnaW5hbFtwcm9wXSA9IGFyZ1twcm9wXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4g
b3JpZ2luYWw7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9iaW5kaW5nJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1l
dGFsL3J1bl9sb29wJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAn
ZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFs
L3BhdGhfY2FjaGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVy
TWV0YWxMb2dnZXIsIF9lbWJlck1ldGFsUnVuX2xvb3AsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxV
dGlscywgX2VtYmVyTWV0YWxFdmVudHMsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1ldGFs
UGF0aF9jYWNoZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5iaW5kID0gYmluZDsK
KworICAvLyBFUzZUT0RPOiB3aGVyZSBpcyBFbWJlci5sb29rdXAgZGVmaW5lZD8KKyAgLyoqCisg
IEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K
KyAgLy8gQ09OU1RBTlRTCisgIC8vCisKKyAgLyoqCisgICAgRGVidWcgcGFyYW1ldGVyIHlvdSBj
YW4gdHVybiBvbi4gVGhpcyB3aWxsIGxvZyBhbGwgYmluZGluZ3MgdGhhdCBmaXJlIHRvCisgICAg
dGhlIGNvbnNvbGUuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gY29kZS4g
Tm90ZSB0aGF0IHlvdQorICAgIGNhbiBhbHNvIGVuYWJsZSB0aGlzIGZyb20gdGhlIGNvbnNvbGUg
b3IgdGVtcG9yYXJpbHkuCisgIAorICAgIEBwcm9wZXJ0eSBMT0dfQklORElOR1MKKyAgICBAZm9y
IEVtYmVyCisgICAgQHR5cGUgQm9vbGVhbgorICAgIEBkZWZhdWx0IGZhbHNlCisgICAgQHB1Ymxp
YworICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5MT0dfQklORElOR1MgPSBmYWxzZSB8
fCAhIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5MT0dfQklORElOR1M7CisKKyAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
ICAvLyBCSU5ESU5HCisgIC8vCisKKyAgZnVuY3Rpb24gQmluZGluZyh0b1BhdGgsIGZyb21QYXRo
KSB7CisgICAgLy8gQ29uZmlndXJhdGlvbgorICAgIHRoaXMuX2Zyb20gPSBmcm9tUGF0aDsKKyAg
ICB0aGlzLl90byA9IHRvUGF0aDsKKyAgICB0aGlzLl9vbmVXYXkgPSB1bmRlZmluZWQ7CisKKyAg
ICAvLyBTdGF0ZQorICAgIHRoaXMuX2RpcmVjdGlvbiA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9y
ZWFkeVRvU3luYyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9mcm9tT2JqID0gdW5kZWZpbmVkOwor
ICAgIHRoaXMuX2Zyb21QYXRoID0gdW5kZWZpbmVkOworICAgIHRoaXMuX3RvT2JqID0gdW5kZWZp
bmVkOworICB9CisKKyAgLyoqCisgICAgQGNsYXNzIEJpbmRpbmcKKyAgICBAbmFtZXNwYWNlIEVt
YmVyCisgICAgQHB1YmxpYworICAqLworCisgIEJpbmRpbmcucHJvdG90eXBlID0geworICAgIC8q
KgorICAgICAgVGhpcyBjb3BpZXMgdGhlIEJpbmRpbmcgc28gaXQgY2FuIGJlIGNvbm5lY3RlZCB0
byBhbm90aGVyIG9iamVjdC4KKyAgICAgICBAbWV0aG9kIGNvcHkKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgY29weTogZnVu
Y3Rpb24gKCkgeworICAgICAgdmFyIGNvcHkgPSBuZXcgQmluZGluZyh0aGlzLl90bywgdGhpcy5f
ZnJvbSk7CisgICAgICBpZiAodGhpcy5fb25lV2F5KSB7CisgICAgICAgIGNvcHkuX29uZVdheSA9
IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gY29weTsKKyAgICB9LAorCisgICAgLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
ICAgIC8vIENPTkZJRworICAgIC8vCisKKyAgICAvKioKKyAgICAgIFRoaXMgd2lsbCBzZXQgYGZy
b21gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2lsbCBub3QKKyAg
ICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4gYWN0dWFsIG9i
amVjdCB1bnRpbCB5b3UKKyAgICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisgICAgICAgVGhlIGJp
bmRpbmcgd2lsbCBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSBwYXRoIHN0YXJ0aW5nIGF0IHRoZSBy
b290IG9iamVjdAorICAgICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRp
bmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKKyAgICAgIGBnZXQoKWAgLSBzZWUgdGhh
dCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgQG1ldGhvZCBmcm9tCisgICAg
ICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byBjb25uZWN0IHRvLgor
ICAgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCisgICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBmcm9tOiBmdW5jdGlvbiAocGF0aCkgeworICAgICAgdGhpcy5fZnJvbSA9IHBhdGg7
CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGlzIHdpbGwg
c2V0IHRoZSBgdG9gIHByb3BlcnR5IHBhdGggdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSXQgd2ls
bCBub3QKKyAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGlzIHByb3BlcnR5IHBhdGggdG8gYW4g
YWN0dWFsIG9iamVjdCB1bnRpbCB5b3UKKyAgICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisgICAg
ICAgVGhlIGJpbmRpbmcgd2lsbCBzZWFyY2ggZm9yIHRoZSBwcm9wZXJ0eSBwYXRoIHN0YXJ0aW5n
IGF0IHRoZSByb290IG9iamVjdAorICAgICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAg
dGhlIGJpbmRpbmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKKyAgICAgIGBnZXQoKWAg
LSBzZWUgdGhhdCBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgQG1ldGhvZCB0
bworICAgICAgQHBhcmFtIHtTdHJpbmd8VHVwbGV9IHBhdGggQSBwcm9wZXJ0eSBwYXRoIG9yIHR1
cGxlLgorICAgICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30gYHRoaXNgCisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICB0bzogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHRoaXMuX3RvID0gcGF0
aDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIENvbmZpZ3Vy
ZXMgdGhlIGJpbmRpbmcgYXMgb25lIHdheS4gQSBvbmUtd2F5IGJpbmRpbmcgd2lsbCByZWxheSBj
aGFuZ2VzCisgICAgICBvbiB0aGUgYGZyb21gIHNpZGUgdG8gdGhlIGB0b2Agc2lkZSwgYnV0IG5v
dCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4gVGhpcworICAgICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hh
bmdlIHRoZSBgdG9gIHNpZGUgZGlyZWN0bHksIHRoZSBgZnJvbWAgc2lkZSBtYXkgaGF2ZQorICAg
ICAgYSBkaWZmZXJlbnQgdmFsdWUuCisgICAgICAgQG1ldGhvZCBvbmVXYXkKKyAgICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgb25l
V2F5OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9vbmVXYXkgPSB0cnVlOworICAgICAgcmV0
dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCB0b1N0cmluZworICAg
ICAgQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYmluZGluZworICAg
ICAgQHB1YmxpYworICAgICovCisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBvbmVXYXkgPSB0aGlzLl9vbmVXYXkgPyAnW29uZVdheV0nIDogJyc7CisgICAgICByZXR1cm4g
J0VtYmVyLkJpbmRpbmc8JyArIF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKSArICc+KCcg
KyB0aGlzLl9mcm9tICsgJyAtPiAnICsgdGhpcy5fdG8gKyAnKScgKyBvbmVXYXk7CisgICAgfSwK
KworICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgICAvLyBDT05ORUNUIEFORCBTWU5DCisgICAgLy8KKworICAgIC8qKgor
ICAgICAgQXR0ZW1wdHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBp
dCBjYW4gcmVjZWl2ZSBhbmQgcmVsYXkKKyAgICAgIGNoYW5nZXMuIFRoaXMgbWV0aG9kIHdpbGwg
cmFpc2UgYW4gZXhjZXB0aW9uIGlmIHlvdSBoYXZlIG5vdCBzZXQgdGhlCisgICAgICBmcm9tL3Rv
IHByb3BlcnRpZXMgeWV0LgorICAgICAgIEBtZXRob2QgY29ubmVjdAorICAgICAgQHBhcmFtIHtP
YmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3QgZm9yIHRoaXMgYmluZGluZy4KKyAgICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAorICAgICAgQHB1YmxpYworICAgICovCisgICAgY29u
bmVjdDogZnVuY3Rpb24gKG9iaikgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ011
c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScsICEhb2Jq
KTsKKworICAgICAgdmFyIGZyb21PYmogPSB1bmRlZmluZWQsCisgICAgICAgICAgZnJvbVBhdGgg
PSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIElmIHRoZSBiaW5kaW5nJ3MgImZyb20iIHBhdGggY291
bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBnbG9iYWwsIHZlcmlmeQorICAgICAgLy8gd2hldGhlciB0
aGUgcGF0aCByZWZlcnMgdG8gYSBnbG9iYWwgb3Igbm90IGJ5IGNvbnN1bHRpbmcgYEVtYmVyLmxv
b2t1cGAuCisgICAgICBpZiAoX2VtYmVyTWV0YWxQYXRoX2NhY2hlLmlzR2xvYmFsUGF0aCh0aGlz
Ll9mcm9tKSkgeworICAgICAgICB2YXIgX25hbWUgPSBfZW1iZXJNZXRhbFBhdGhfY2FjaGUuZ2V0
Rmlyc3RLZXkodGhpcy5fZnJvbSk7CisgICAgICAgIHZhciBwb3NzaWJsZUdsb2JhbCA9IF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0Lmxvb2t1cFtfbmFtZV07CisKKyAgICAgICAgaWYgKHBvc3NpYmxl
R2xvYmFsKSB7CisgICAgICAgICAgZnJvbU9iaiA9IHBvc3NpYmxlR2xvYmFsOworICAgICAgICAg
IGZyb21QYXRoID0gX2VtYmVyTWV0YWxQYXRoX2NhY2hlLmdldFRhaWxQYXRoKHRoaXMuX2Zyb20p
OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmcm9tT2JqID09PSB1bmRlZmluZWQp
IHsKKyAgICAgICAgZnJvbU9iaiA9IG9iajsKKyAgICAgICAgZnJvbVBhdGggPSB0aGlzLl9mcm9t
OworICAgICAgfQorCisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50cnlTZXQob2JqLCB0
aGlzLl90bywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGZyb21PYmosIGZyb21QYXRoKSk7
CisKKyAgICAgIC8vIEFkZCBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHRvIGJlIG5vdGlmaWVk
IHdoZW4gdGhlIGJpbmRpbmcgc2hvdWxkIGJlIHVwZGF0ZWQuCisgICAgICBfZW1iZXJNZXRhbE9i
c2VydmVyLmFkZE9ic2VydmVyKGZyb21PYmosIGZyb21QYXRoLCB0aGlzLCAnZnJvbURpZENoYW5n
ZScpOworCisgICAgICAvLyBJZiB0aGUgYmluZGluZyBpcyBhIHR3by13YXkgYmluZGluZywgYWxz
byBzZXQgdXAgYW4gb2JzZXJ2ZXIgb24gdGhlIHRhcmdldC4KKyAgICAgIGlmICghdGhpcy5fb25l
V2F5KSB7CisgICAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIob2JqLCB0aGlz
Ll90bywgdGhpcywgJ3RvRGlkQ2hhbmdlJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFs
RXZlbnRzLmFkZExpc3RlbmVyKG9iaiwgJ3dpbGxEZXN0cm95JywgdGhpcywgJ2Rpc2Nvbm5lY3Qn
KTsKKworICAgICAgdGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOworICAgICAgdGhpcy5fZnJvbU9i
aiA9IGZyb21PYmo7CisgICAgICB0aGlzLl9mcm9tUGF0aCA9IGZyb21QYXRoOworICAgICAgdGhp
cy5fdG9PYmogPSBvYmo7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIERpc2Nvbm5lY3RzIHRoZSBiaW5kaW5nIGluc3RhbmNlLiBDaGFuZ2VzIHdpbGwgbm8g
bG9uZ2VyIGJlIHJlbGF5ZWQuIFlvdQorICAgICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNh
bGwgdGhpcyBtZXRob2QuCisgICAgICAgQG1ldGhvZCBkaXNjb25uZWN0CisgICAgICBAcmV0dXJu
IHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGRpc2Nv
bm5lY3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdNdXN0
IHBhc3MgYSB2YWxpZCBvYmplY3QgdG8gRW1iZXIuQmluZGluZy5kaXNjb25uZWN0KCknLCAhIXRo
aXMuX3RvT2JqKTsKKworICAgICAgLy8gUmVtb3ZlIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3Qg
c28gd2UncmUgbm8gbG9uZ2VyIG5vdGlmaWVkIG9mCisgICAgICAvLyBjaGFuZ2VzIHRoYXQgc2hv
dWxkIHVwZGF0ZSBiaW5kaW5ncy4KKyAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2Jz
ZXJ2ZXIodGhpcy5fZnJvbU9iaiwgdGhpcy5fZnJvbVBhdGgsIHRoaXMsICdmcm9tRGlkQ2hhbmdl
Jyk7CisKKyAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2Jz
ZXJ2ZXIgZnJvbSB0aGUgdGFyZ2V0IGFzIHdlbGwuCisgICAgICBpZiAoIXRoaXMuX29uZVdheSkg
eworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2VydmVyKHRoaXMuX3RvT2Jq
LCB0aGlzLl90bywgdGhpcywgJ3RvRGlkQ2hhbmdlJyk7CisgICAgICB9CisKKyAgICAgIHRoaXMu
X3JlYWR5VG9TeW5jID0gZmFsc2U7IC8vIERpc2FibGUgc2NoZWR1bGVkIHN5bmNzLi4uCisgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIFBSSVZBVEUKKyAgICAv
LworCisgICAgLyogQ2FsbGVkIHdoZW4gdGhlIGZyb20gc2lkZSBjaGFuZ2VzLiAqLworICAgIGZy
b21EaWRDaGFuZ2U6IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgIHRoaXMuX3NjaGVkdWxlU3lu
YygnZndkJyk7CisgICAgfSwKKworICAgIC8qIENhbGxlZCB3aGVuIHRoZSB0byBzaWRlIGNoYW5n
ZXMuICovCisgICAgdG9EaWRDaGFuZ2U6IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgIHRoaXMu
X3NjaGVkdWxlU3luYygnYmFjaycpOworICAgIH0sCisKKyAgICBfc2NoZWR1bGVTeW5jOiBmdW5j
dGlvbiAoZGlyKSB7CisgICAgICB2YXIgZXhpc3RpbmdEaXIgPSB0aGlzLl9kaXJlY3Rpb247CisK
KyAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgc2NoZWR1bGVkIHRoZSBiaW5kaW5nIHlldCwgc2NoZWR1
bGUgaXQuCisgICAgICBpZiAoZXhpc3RpbmdEaXIgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBf
ZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUoJ3N5bmMnLCB0aGlzLCAnX3N5bmMn
KTsKKyAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gZGlyOworICAgICAgfQorCisgICAgICAvLyBJ
ZiBib3RoIGEgJ2JhY2snIGFuZCAnZndkJyBzeW5jIGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhl
IHNhbWUgb2JqZWN0LAorICAgICAgLy8gZGVmYXVsdCB0byBhICdmd2QnIHN5bmMgc28gdGhhdCBp
dCByZW1haW5zIGRldGVybWluaXN0aWMuCisgICAgICBpZiAoZXhpc3RpbmdEaXIgPT09ICdiYWNr
JyAmJiBkaXIgPT09ICdmd2QnKSB7CisgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9ICdmd2QnOwor
ICAgICAgfQorICAgIH0sCisKKyAgICBfc3luYzogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGxv
ZyA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkxPR19CSU5ESU5HUzsKKworICAgICAgdmFyIHRv
T2JqID0gdGhpcy5fdG9PYmo7CisKKyAgICAgIC8vIERvbid0IHN5bmNocm9uaXplIGRlc3Ryb3ll
ZCBvYmplY3RzIG9yIGRpc2Nvbm5lY3RlZCBiaW5kaW5ncy4KKyAgICAgIGlmICh0b09iai5pc0Rl
c3Ryb3llZCB8fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAg
fQorCisgICAgICAvLyBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmluZGluZyBmb3IgdGhlIG9i
amVjdCB3ZSBhcmUKKyAgICAgIC8vIHN5bmNocm9uaXppbmcgZnJvbS4KKyAgICAgIHZhciBkaXJl
Y3Rpb24gPSB0aGlzLl9kaXJlY3Rpb247CisKKyAgICAgIHZhciBmcm9tT2JqID0gdGhpcy5fZnJv
bU9iajsKKyAgICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb21QYXRoOworCisgICAgICB0aGlz
Ll9kaXJlY3Rpb24gPSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIElmIHdlJ3JlIHN5bmNocm9uaXpp
bmcgZnJvbSB0aGUgcmVtb3RlIG9iamVjdC4uLgorICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Z3
ZCcpIHsKKyAgICAgICAgdmFyIGZyb21WYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dChmcm9tT2JqLCBmcm9tUGF0aCk7CisgICAgICAgIGlmIChsb2cpIHsKKyAgICAgICAgICBfZW1i
ZXJNZXRhbExvZ2dlci5kZWZhdWx0LmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwgJy0+JywgZnJv
bVZhbHVlLCBmcm9tT2JqKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fb25lV2F5KSB7
CisgICAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQudHJ5U2V0KHRvT2JqLCB0aGlzLl90
bywgZnJvbVZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfZW1iZXJNZXRhbE9i
c2VydmVyLl9zdXNwZW5kT2JzZXJ2ZXIodG9PYmosIHRoaXMuX3RvLCB0aGlzLCAndG9EaWRDaGFu
Z2UnLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50
cnlTZXQodG9PYmosIHRoaXMuX3RvLCBmcm9tVmFsdWUpOworICAgICAgICAgIH0pOworICAgICAg
ICB9CisgICAgICAgIC8vIElmIHdlJ3JlIHN5bmNocm9uaXppbmcgKnRvKiB0aGUgcmVtb3RlIG9i
amVjdC4KKyAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnYmFjaycpIHsKKyAgICAgICAg
ICB2YXIgdG9WYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0b09iaiwgdGhpcy5f
dG8pOworICAgICAgICAgIGlmIChsb2cpIHsKKyAgICAgICAgICAgIF9lbWJlck1ldGFsTG9nZ2Vy
LmRlZmF1bHQubG9nKCcgJywgdGhpcy50b1N0cmluZygpLCAnPC0nLCB0b1ZhbHVlLCB0b09iaik7
CisgICAgICAgICAgfQorICAgICAgICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNl
cnZlcihmcm9tT2JqLCBmcm9tUGF0aCwgdGhpcywgJ2Zyb21EaWRDaGFuZ2UnLCBmdW5jdGlvbiAo
KSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC50cnlTZXQoZnJvbU9iaiwg
ZnJvbVBhdGgsIHRvVmFsdWUpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisg
IH07CisKKyAgZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKHRvLCBmcm9tKSB7CisgICAgZm9yICh2
YXIga2V5IGluIGZyb20pIHsKKyAgICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGtleSkpIHsK
KyAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBt
aXhpblByb3BlcnRpZXMoQmluZGluZywgeworCisgICAgLyoKKyAgICAgIFNlZSBgRW1iZXIuQmlu
ZGluZy5mcm9tYC4KKyAgICAgICBAbWV0aG9kIGZyb20KKyAgICAgIEBzdGF0aWMKKyAgICAqLwor
ICAgIGZyb206IGZ1bmN0aW9uIChmcm9tKSB7CisgICAgICB2YXIgQyA9IHRoaXM7CisgICAgICBy
ZXR1cm4gbmV3IEModW5kZWZpbmVkLCBmcm9tKTsKKyAgICB9LAorCisgICAgLyoKKyAgICAgIFNl
ZSBgRW1iZXIuQmluZGluZy50b2AuCisgICAgICAgQG1ldGhvZCB0bworICAgICAgQHN0YXRpYwor
ICAgICovCisgICAgdG86IGZ1bmN0aW9uICh0bykgeworICAgICAgdmFyIEMgPSB0aGlzOworICAg
ICAgcmV0dXJuIG5ldyBDKHRvLCB1bmRlZmluZWQpOworICAgIH0KKyAgfSk7CisgIC8qKgorICAg
IEFuIGBFbWJlci5CaW5kaW5nYCBjb25uZWN0cyB0aGUgcHJvcGVydGllcyBvZiB0d28gb2JqZWN0
cyBzbyB0aGF0IHdoZW5ldmVyCisgICAgdGhlIHZhbHVlIG9mIG9uZSBwcm9wZXJ0eSBjaGFuZ2Vz
LCB0aGUgb3RoZXIgcHJvcGVydHkgd2lsbCBiZSBjaGFuZ2VkIGFsc28uCisgIAorICAgICMjIEF1
dG9tYXRpYyBDcmVhdGlvbiBvZiBCaW5kaW5ncyB3aXRoIGAvXipCaW5kaW5nL2AtbmFtZWQgUHJv
cGVydGllcy4KKyAgCisgICAgWW91IGRvIG5vdCB1c3VhbGx5IGNyZWF0ZSBCaW5kaW5nIG9iamVj
dHMgZGlyZWN0bHkgYnV0IGluc3RlYWQgZGVzY3JpYmUKKyAgICBiaW5kaW5ncyBpbiB5b3VyIGNs
YXNzIG9yIG9iamVjdCBkZWZpbml0aW9uIHVzaW5nIGF1dG9tYXRpYyBiaW5kaW5nCisgICAgZGV0
ZWN0aW9uLgorICAKKyAgICBQcm9wZXJ0aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5nYCBzdWZmaXgg
d2lsbCBiZSBjb252ZXJ0ZWQgdG8gYEVtYmVyLkJpbmRpbmdgCisgICAgaW5zdGFuY2VzLiBUaGUg
dmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEg
cGF0aAorICAgIHRvIGFub3RoZXIgb2JqZWN0IG9yIGEgY3VzdG9tIGJpbmRpbmcgaW5zdGFuY2Ug
Y3JlYXRlZCB1c2luZyBCaW5kaW5nIGhlbHBlcnMKKyAgICAoc2VlICJPbmUgV2F5IEJpbmRpbmdz
Iik6CisgIAorICAgIGBgYAorICAgIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250cm9sbGVy
LnRpdGxlIgorICAgIGBgYAorICAKKyAgICBUaGlzIHdpbGwgY3JlYXRlIGEgYmluZGluZyBmcm9t
IGBNeUFwcC5zb21lQ29udHJvbGxlci50aXRsZWAgdG8gdGhlIGB2YWx1ZWAKKyAgICBwcm9wZXJ0
eSBvZiB5b3VyIG9iamVjdCBpbnN0YW5jZSBhdXRvbWF0aWNhbGx5LiBOb3cgdGhlIHR3byB2YWx1
ZXMgd2lsbCBiZQorICAgIGtlcHQgaW4gc3luYy4KKyAgCisgICAgIyMgT25lIFdheSBCaW5kaW5n
cworICAKKyAgICBPbmUgZXNwZWNpYWxseSB1c2VmdWwgYmluZGluZyBjdXN0b21pemF0aW9uIHlv
dSBjYW4gdXNlIGlzIHRoZSBgb25lV2F5KClgCisgICAgaGVscGVyLiBUaGlzIGhlbHBlciB0ZWxs
cyBFbWJlciB0aGF0IHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluCisgICAgcmVjZWl2aW5nIGNo
YW5nZXMgb24gdGhlIG9iamVjdCB5b3UgYXJlIGJpbmRpbmcgZnJvbS4gRm9yIGV4YW1wbGUsIGlm
IHlvdQorICAgIGFyZSBiaW5kaW5nIHRvIGEgcHJlZmVyZW5jZSBhbmQgeW91IHdhbnQgdG8gYmUg
bm90aWZpZWQgaWYgdGhlIHByZWZlcmVuY2UKKyAgICBoYXMgY2hhbmdlZCwgYnV0IHlvdXIgb2Jq
ZWN0IHdpbGwgbm90IGJlIGNoYW5naW5nIHRoZSBwcmVmZXJlbmNlIGl0c2VsZiwgeW91CisgICAg
Y291bGQgZG86CisgIAorICAgIGBgYAorICAgIGJpZ1RpdGxlc0JpbmRpbmc6IEVtYmVyLkJpbmRp
bmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzIikKKyAgICBg
YGAKKyAgCisgICAgVGhpcyB3YXkgaWYgdGhlIHZhbHVlIG9mIGBNeUFwcC5wcmVmZXJlbmNlc0Nv
bnRyb2xsZXIuYmlnVGl0bGVzYCBjaGFuZ2VzIHRoZQorICAgIGBiaWdUaXRsZXNgIHByb3BlcnR5
IG9mIHlvdXIgb2JqZWN0IHdpbGwgY2hhbmdlIGFsc28uIEhvd2V2ZXIsIGlmIHlvdQorICAgIGNo
YW5nZSB0aGUgdmFsdWUgb2YgeW91ciBgYmlnVGl0bGVzYCBwcm9wZXJ0eSwgaXQgd2lsbCBub3Qg
dXBkYXRlIHRoZQorICAgIGBwcmVmZXJlbmNlc0NvbnRyb2xsZXJgLgorICAKKyAgICBPbmUgd2F5
IGJpbmRpbmdzIGFyZSBhbG1vc3QgdHdpY2UgYXMgZmFzdCB0byBzZXR1cCBhbmQgdHdpY2UgYXMg
ZmFzdCB0bworICAgIGV4ZWN1dGUgYmVjYXVzZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3b3Jy
eSBhYm91dCBjaGFuZ2VzIHRvIG9uZSBzaWRlLgorICAKKyAgICBZb3Ugc2hvdWxkIGNvbnNpZGVy
IHVzaW5nIG9uZSB3YXkgYmluZGluZ3MgYW55dGltZSB5b3UgaGF2ZSBhbiBvYmplY3QgdGhhdAor
ICAgIG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5kIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNo
YW5nZSBhIHByb3BlcnR5OyBvbmx5CisgICAgdG8gbW9uaXRvciBpdCBmb3IgY2hhbmdlcyAoc3Vj
aCBhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuCisgIAorICAgICMjIEFkZGluZyBCaW5kaW5ncyBN
YW51YWxseQorICAKKyAgICBBbGwgb2YgdGhlIGV4YW1wbGVzIGFib3ZlIHNob3cgeW91IGhvdyB0
byBjb25maWd1cmUgYSBjdXN0b20gYmluZGluZywgYnV0IHRoZQorICAgIHJlc3VsdCBvZiB0aGVz
ZSBjdXN0b21pemF0aW9ucyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkg
YWN0aXZlCisgICAgQmluZGluZyBpbnN0YW5jZS4gVGhlIGJpbmRpbmcgd2lsbCBhY3R1YWxseSBi
ZWNvbWUgYWN0aXZlIG9ubHkgd2hlbiB5b3UKKyAgICBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IHRo
ZSBiaW5kaW5nIGJlbG9uZ3MgdG8uIEl0IGlzIHVzZWZ1bCwgaG93ZXZlciwgdG8KKyAgICB1bmRl
cnN0YW5kIHdoYXQgYWN0dWFsbHkgaGFwcGVucyB3aGVuIHRoZSBiaW5kaW5nIGlzIGFjdGl2YXRl
ZC4KKyAgCisgICAgRm9yIGEgYmluZGluZyB0byBmdW5jdGlvbiBpdCBtdXN0IGhhdmUgYXQgbGVh
c3QgYSBgZnJvbWAgcHJvcGVydHkgYW5kIGEgYHRvYAorICAgIHByb3BlcnR5LiBUaGUgYGZyb21g
IHByb3BlcnR5IHBhdGggcG9pbnRzIHRvIHRoZSBvYmplY3Qva2V5IHRoYXQgeW91IHdhbnQgdG8K
KyAgICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2AgcGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9r
ZXkgeW91IHdhbnQgdG8gYmluZCB0by4KKyAgCisgICAgV2hlbiB5b3UgZGVmaW5lIGEgY3VzdG9t
IGJpbmRpbmcsIHlvdSBhcmUgdXN1YWxseSBkZXNjcmliaW5nIHRoZSBwcm9wZXJ0eQorICAgIHlv
dSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWVg
IGluIHRoZSBleGFtcGxlcworICAgIGFib3ZlKS4gV2hlbiB5b3VyIG9iamVjdCBpcyBjcmVhdGVk
LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXNzaWduIHRoZSB2YWx1ZQorICAgIHlvdSB3YW50IHRv
IGJpbmQgYHRvYCBiYXNlZCBvbiB0aGUgbmFtZSBvZiB5b3VyIGJpbmRpbmcga2V5LiBJbiB0aGUK
KyAgICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9iamVjdHMgd2lsbCBlZmZl
Y3RpdmVseSBjYWxsCisgICAgc29tZXRoaW5nIGxpa2UgdGhpcyBvbiB5b3VyIGJpbmRpbmc6Cisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBiaW5kaW5nID0gRW1iZXIuQmluZGluZy5mcm9tKCJ2
YWx1ZUJpbmRpbmciKS50bygidmFsdWUiKTsKKyAgICBgYGAKKyAgCisgICAgVGhpcyBjcmVhdGVz
IGEgbmV3IGJpbmRpbmcgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHRlbXBsYXRlIHlvdSBwcm92aWRl
LCBhbmQKKyAgICBzZXRzIHRoZSB0byBwYXRoIHRvIHRoZSBgdmFsdWVgIHByb3BlcnR5IG9mIHRo
ZSBuZXcgb2JqZWN0LiBOb3cgdGhhdCB0aGUKKyAgICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3Vy
ZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBpdCBzaW1wbHkgbmVlZHMgdG8gYmUKKyAgICBj
b25uZWN0ZWQgdG8gYmVjb21lIGFjdGl2ZS4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjb25u
ZWN0KClgIG1ldGhvZDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGJpbmRpbmcuY29ubmVj
dCh0aGlzKTsKKyAgICBgYGAKKyAgCisgICAgTm90ZSB0aGF0IHdoZW4geW91IGNvbm5lY3QgYSBi
aW5kaW5nIHlvdSBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgaXQgdG8gYmUKKyAgICBjb25uZWN0
ZWQgdG8uIFRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBmb3IgYm90aCB0aGUg
ZnJvbSBhbmQKKyAgICB0byBzaWRlIG9mIHRoZSBiaW5kaW5nIHdoZW4gaW5zcGVjdGluZyByZWxh
dGl2ZSBwYXRocy4gVGhpcyBhbGxvd3MgdGhlCisgICAgYmluZGluZyB0byBiZSBhdXRvbWF0aWNh
bGx5IGluaGVyaXRlZCBieSBzdWJjbGFzc2VkIG9iamVjdHMgYXMgd2VsbC4KKyAgCisgICAgVGhp
cyBhbHNvIGFsbG93cyB5b3UgdG8gYmluZCBiZXR3ZWVuIG9iamVjdHMgdXNpbmcgdGhlIHBhdGhz
IHlvdSBkZWNsYXJlIGluCisgICAgYGZyb21gIGFuZCBgdG9gOgorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgLy8gRXhhbXBsZSAxCisgICAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcuZnJvbSgi
QXBwLnNvbWVPYmplY3QudmFsdWUiKS50bygidmFsdWUiKTsKKyAgICBiaW5kaW5nLmNvbm5lY3Qo
dGhpcyk7CisgIAorICAgIC8vIEV4YW1wbGUgMgorICAgIGJpbmRpbmcgPSBFbWJlci5CaW5kaW5n
LmZyb20oInBhcmVudFZpZXcudmFsdWUiKS50bygiQXBwLnNvbWVPYmplY3QudmFsdWUiKTsKKyAg
ICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7CisgICAgYGBgCisgIAorICAgIE5vdyB0aGF0IHRoZSBi
aW5kaW5nIGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBvYnNlcnZlIGJvdGggdGhlIGZyb20gYW5kIHRv
IHNpZGUKKyAgICBhbmQgcmVsYXkgY2hhbmdlcy4KKyAgCisgICAgSWYgeW91IGV2ZXIgbmVlZGVk
IHRvIGRvIHNvICh5b3UgYWxtb3N0IG5ldmVyIHdpbGwsIGJ1dCBpdCBpcyB1c2VmdWwgdG8KKyAg
ICB1bmRlcnN0YW5kIHRoaXMgYW55d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBh
Y3RpdmUgYmluZGluZyBieQorICAgIHVzaW5nIHRoZSBgRW1iZXIuYmluZCgpYCBoZWxwZXIgbWV0
aG9kLiAoVGhpcyBpcyB0aGUgc2FtZSBtZXRob2QgdXNlZCBieQorICAgIHRvIHNldHVwIHlvdXIg
YmluZGluZ3Mgb24gb2JqZWN0cyk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5i
aW5kKE15QXBwLmFub3RoZXJPYmplY3QsICJ2YWx1ZSIsICJNeUFwcC5zb21lQ29udHJvbGxlci52
YWx1ZSIpOworICAgIGBgYAorICAKKyAgICBCb3RoIG9mIHRoZXNlIGNvZGUgZnJhZ21lbnRzIGhh
dmUgdGhlIHNhbWUgZWZmZWN0IGFzIGRvaW5nIHRoZSBtb3N0IGZyaWVuZGx5CisgICAgZm9ybSBv
ZiBiaW5kaW5nIGNyZWF0aW9uIGxpa2Ugc286CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBN
eUFwcC5hbm90aGVyT2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAgICB2YWx1ZUJp
bmRpbmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci52YWx1ZSIsCisgIAorICAgICAgLy8gT1RIRVIg
Q09ERSBGT1IgVEhJUyBPQkpFQ1QuLi4KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgRW1iZXIn
cyBidWlsdCBpbiBiaW5kaW5nIGNyZWF0aW9uIG1ldGhvZCBtYWtlcyBpdCBlYXN5IHRvIGF1dG9t
YXRpY2FsbHkKKyAgICBjcmVhdGUgYmluZGluZ3MgZm9yIHlvdS4gWW91IHNob3VsZCBhbHdheXMg
dXNlIHRoZSBoaWdoZXN0LWxldmVsIEFQSXMKKyAgICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVu
ZGVyc3RhbmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCisgIAorICAgIEBjbGFzcyBCaW5kaW5n
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAcHVibGlj
CisgICovCisgIC8vIEVtYmVyLkJpbmRpbmcgPSBCaW5kaW5nOyBFUzZUT0RPOiB3aGVyZSB0byBw
dXQgdGhpcz8KKworICAvKioKKyAgICBHbG9iYWwgaGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBu
ZXcgYmluZGluZy4gSnVzdCBwYXNzIHRoZSByb290IG9iamVjdAorICAgIGFsb25nIHdpdGggYSBg
dG9gIGFuZCBgZnJvbWAgcGF0aCB0byBjcmVhdGUgYW5kIGNvbm5lY3QgdGhlIGJpbmRpbmcuCisg
IAorICAgIEBtZXRob2QgYmluZAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
b2JqIFRoZSByb290IG9iamVjdCBvZiB0aGUgdHJhbnNmb3JtLgorICAgIEBwYXJhbSB7U3RyaW5n
fSB0byBUaGUgcGF0aCB0byB0aGUgJ3RvJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgorICAgICAgTXVz
dCBiZSByZWxhdGl2ZSB0byBvYmouCisgICAgQHBhcmFtIHtTdHJpbmd9IGZyb20gVGhlIHBhdGgg
dG8gdGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5kaW5nLgorICAgICAgTXVzdCBiZSByZWxhdGl2
ZSB0byBvYmogb3IgYSBnbG9iYWwgcGF0aC4KKyAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBi
aW5kaW5nIGluc3RhbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGJpbmQob2Jq
LCB0bywgZnJvbSkgeworICAgIHJldHVybiBuZXcgQmluZGluZyh0bywgZnJvbSkuY29ubmVjdChv
YmopOworICB9CisKKyAgZXhwb3J0cy5CaW5kaW5nID0gQmluZGluZzsKK30pOworLy8gRW1iZXIu
TE9HX0JJTkRJTkdTCitlbmlmZWQoJ2VtYmVyLW1ldGFsL2NhY2hlJywgWydleHBvcnRzJywgJ2Vt
YmVyLW1ldGFsL2VtcHR5X29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IENh
Y2hlOworCisgIGZ1bmN0aW9uIENhY2hlKGxpbWl0LCBmdW5jKSB7CisgICAgdGhpcy5zdG9yZSA9
IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgdGhpcy5zaXplID0g
MDsKKyAgICB0aGlzLm1pc3NlcyA9IDA7CisgICAgdGhpcy5oaXRzID0gMDsKKyAgICB0aGlzLmxp
bWl0ID0gbGltaXQ7CisgICAgdGhpcy5mdW5jID0gZnVuYzsKKyAgfQorCisgIHZhciBVTkRFRklO
RUQgPSBmdW5jdGlvbiAoKSB7fTsKKworICBDYWNoZS5wcm90b3R5cGUgPSB7CisgICAgc2V0OiBm
dW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgaWYgKHRoaXMubGltaXQgPiB0aGlzLnNpemUp
IHsKKyAgICAgICAgdGhpcy5zaXplKys7CisgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVk
KSB7CisgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gVU5ERUZJTkVEOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgIHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlOworICAgICAgICB9CisgICAg
ICB9CisKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAgZ2V0OiBmdW5jdGlvbiAo
a2V5KSB7CisgICAgICB2YXIgdmFsdWUgPSB0aGlzLnN0b3JlW2tleV07CisKKyAgICAgIGlmICh2
YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRoaXMubWlzc2VzKys7CisgICAgICAgIHZh
bHVlID0gdGhpcy5zZXQoa2V5LCB0aGlzLmZ1bmMoa2V5KSk7CisgICAgICB9IGVsc2UgaWYgKHZh
bHVlID09PSBVTkRFRklORUQpIHsKKyAgICAgICAgdGhpcy5oaXRzKys7CisgICAgICAgIHZhbHVl
ID0gdW5kZWZpbmVkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5oaXRzKys7CisgICAg
ICAgIC8vIG5vdGhpbmcgdG8gdHJhbnNsYXRlCisgICAgICB9CisKKyAgICAgIHJldHVybiB2YWx1
ZTsKKyAgICB9LAorCisgICAgcHVyZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuc3RvcmUg
PSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgdGhpcy5zaXpl
ID0gMDsKKyAgICAgIHRoaXMuaGl0cyA9IDA7CisgICAgICB0aGlzLm1pc3NlcyA9IDA7CisgICAg
fQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2NoYWlucycsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRh
bC93YXRjaF9rZXknLCAnZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0J10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxNZXRhLCBfZW1iZXJNZXRh
bFdhdGNoX2tleSwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZmluaXNoQ2hhaW5zID0gZmluaXNoQ2hhaW5zOworCisgIHZhciBGSVJTVF9L
RVkgPSAvXihbXlwuXSspLzsKKworICBmdW5jdGlvbiBmaXJzdEtleShwYXRoKSB7CisgICAgcmV0
dXJuIHBhdGgubWF0Y2goRklSU1RfS0VZKVswXTsKKyAgfQorCisgIGZ1bmN0aW9uIGlzT2JqZWN0
KG9iaikgeworICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7CisgIH0K
KworICBmdW5jdGlvbiBpc1ZvbGF0aWxlKG9iaikgeworICAgIHJldHVybiAhKGlzT2JqZWN0KG9i
aikgJiYgb2JqLmlzRGVzY3JpcHRvciAmJiBvYmouX3ZvbGF0aWxlID09PSBmYWxzZSk7CisgIH0K
KworICBmdW5jdGlvbiBDaGFpbldhdGNoZXJzKCkgeworICAgIC8vIGNoYWluIG5vZGVzIHRoYXQg
cmVmZXJlbmNlIGEga2V5IGluIHRoaXMgb2JqIGJ5IGtleQorICAgIC8vIHdlIG9ubHkgY3JlYXRl
IENoYWluV2F0Y2hlcnMgd2hlbiB3ZSBhcmUgZ29pbmcgdG8gYWRkIHRoZW0KKyAgICAvLyBzbyBj
cmVhdGUgdGhpcyB1cGZyb250CisgICAgdGhpcy5jaGFpbnMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0
eV9vYmplY3QuZGVmYXVsdCgpOworICB9CisKKyAgQ2hhaW5XYXRjaGVycy5wcm90b3R5cGUgPSB7
CisgICAgYWRkOiBmdW5jdGlvbiAoa2V5LCBub2RlKSB7CisgICAgICB2YXIgbm9kZXMgPSB0aGlz
LmNoYWluc1trZXldOworICAgICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAg
dGhpcy5jaGFpbnNba2V5XSA9IFtub2RlXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGVz
LnB1c2gobm9kZSk7CisgICAgICB9CisgICAgfSwKKworICAgIHJlbW92ZTogZnVuY3Rpb24gKGtl
eSwgbm9kZSkgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAgICAgIGlm
IChub2RlcykgeworICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8
IGw7IGkrKykgeworICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZSkgeworICAgICAgICAg
ICAgbm9kZXMuc3BsaWNlKGksIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIGhhczogZnVuY3Rpb24gKGtleSwgbm9k
ZSkgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAgICAgIGlmIChub2Rl
cykgeworICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZSkgeworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSwKKworICAgIHJldmFsaWRhdGVBbGw6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGZvciAodmFyIGtleSBpbiB0aGlzLmNoYWlucykgeworICAgICAgICB0aGlzLm5vdGlmeShrZXks
IHRydWUsIHVuZGVmaW5lZCk7CisgICAgICB9CisgICAgfSwKKworICAgIHJldmFsaWRhdGU6IGZ1
bmN0aW9uIChrZXkpIHsKKyAgICAgIHRoaXMubm90aWZ5KGtleSwgdHJ1ZSwgdW5kZWZpbmVkKTsK
KyAgICB9LAorCisgICAgLy8ga2V5OiB0aGUgc3RyaW5nIGtleSB0aGF0IGlzIHBhcnQgb2YgYSBw
YXRoIGNoYW5nZWQKKyAgICAvLyByZXZhbGlkYXRlOiBib29sZWFuOyB0aGUgY2hhaW5zIHRoYXQg
YXJlIHdhdGNoaW5nIHRoaXMgdmFsdWUgc2hvdWxkIHJldmFsaWRhdGUKKyAgICAvLyBjYWxsYmFj
azogZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBvYmplY3QgYW5kIHBhdGgg
dGhhdAorICAgIC8vICAgICAgICAgICB3aWxsIGJlL2FyZSBpbnZhbGlkYXRlZCBieSB0aGlzIGtl
eSBjaGFuZ2UsIGRlcGVuZGluZyBvbgorICAgIC8vICAgICAgICAgICB3aGV0aGVyIHRoZSByZXZh
bGlkYXRlIGZsYWcgaXMgcGFzc2VkCisgICAgbm90aWZ5OiBmdW5jdGlvbiAoa2V5LCByZXZhbGlk
YXRlLCBjYWxsYmFjaykgeworICAgICAgdmFyIG5vZGVzID0gdGhpcy5jaGFpbnNba2V5XTsKKyAg
ICAgIGlmIChub2RlcyA9PT0gdW5kZWZpbmVkIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkgeworICAg
ICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBhZmZlY3RlZCA9IHVuZGVmaW5lZDsK
KworICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIGFmZmVjdGVkID0gW107CisgICAgICB9
CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICAgIG5vZGVzW2ldLm5vdGlmeShyZXZhbGlkYXRlLCBhZmZlY3RlZCk7CisgICAgICB9
CisKKyAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgLy8gd2UgZ2F0aGVyIGNhbGxiYWNrcyBzbyB3ZSBkb24ndCBub3Rp
ZnkgdGhlbSBkdXJpbmcgcmV2YWxpZGF0aW9uCisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFm
ZmVjdGVkLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgeworICAgICAgICB2YXIgb2JqID0gYWZmZWN0
ZWRbaV07CisgICAgICAgIHZhciBwYXRoID0gYWZmZWN0ZWRbaSArIDFdOworICAgICAgICBjYWxs
YmFjayhvYmosIHBhdGgpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBtYWtl
Q2hhaW5XYXRjaGVyKCkgeworICAgIHJldHVybiBuZXcgQ2hhaW5XYXRjaGVycygpOworICB9CisK
KyAgZnVuY3Rpb24gYWRkQ2hhaW5XYXRjaGVyKG9iaiwga2V5TmFtZSwgbm9kZSkgeworICAgIGlm
ICghaXNPYmplY3Qob2JqKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBtID0g
X2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKyAgICBtLndyaXRhYmxlQ2hhaW5XYXRjaGVycyht
YWtlQ2hhaW5XYXRjaGVyKS5hZGQoa2V5TmFtZSwgbm9kZSk7CisgICAgX2VtYmVyTWV0YWxXYXRj
aF9rZXkud2F0Y2hLZXkob2JqLCBrZXlOYW1lLCBtKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlbW92
ZUNoYWluV2F0Y2hlcihvYmosIGtleU5hbWUsIG5vZGUpIHsKKyAgICBpZiAoIWlzT2JqZWN0KG9i
aikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0
YS5wZWVrTWV0YShvYmopOworCisgICAgaWYgKCFtIHx8ICFtLnJlYWRhYmxlQ2hhaW5XYXRjaGVy
cygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbWFrZSBtZXRhIHdyaXRhYmxl
CisgICAgbSA9IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisKKyAgICBtLnJlYWRhYmxlQ2hh
aW5XYXRjaGVycygpLnJlbW92ZShrZXlOYW1lLCBub2RlKTsKKworICAgIF9lbWJlck1ldGFsV2F0
Y2hfa2V5LnVud2F0Y2hLZXkob2JqLCBrZXlOYW1lLCBtKTsKKyAgfQorCisgIC8vIEEgQ2hhaW5O
b2RlIHdhdGNoZXMgYSBzaW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBz
dGFydGluZworICAvLyB2YWx1ZSBmb3IgdGhlIGtleSB0aGVuIHRoZSBub2RlIHdvbid0IGFjdHVh
bGx5IHdhdGNoIGl0LiBGb3IgYSByb290IG5vZGUKKyAgLy8gcGFzcyBudWxsIGZvciBwYXJlbnQg
YW5kIGtleSBhbmQgb2JqZWN0IGZvciB2YWx1ZS4KKyAgZnVuY3Rpb24gQ2hhaW5Ob2RlKHBhcmVu
dCwga2V5LCB2YWx1ZSkgeworICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKKyAgICB0aGlzLl9r
ZXkgPSBrZXk7CisKKyAgICAvLyBfd2F0Y2hpbmcgaXMgdHJ1ZSB3aGVuIGNhbGxpbmcgZ2V0KHRo
aXMuX3BhcmVudCwgdGhpcy5fa2V5KSB3aWxsCisgICAgLy8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0
aGlzIG5vZGUuCisgICAgLy8KKyAgICAvLyBJdCBpcyBmYWxzZSBmb3IgdGhlIHJvb3Qgb2YgYSBj
aGFpbiAoYmVjYXVzZSB3ZSBoYXZlIG5vIHBhcmVudCkKKyAgICAvLyBhbmQgZm9yIGdsb2JhbCBw
YXRocyAoYmVjYXVzZSB0aGUgcGFyZW50IG5vZGUgaXMgdGhlIG9iamVjdCB3aXRoCisgICAgLy8g
dGhlIG9ic2VydmVyIG9uIGl0KQorICAgIHRoaXMuX3dhdGNoaW5nID0gdmFsdWUgPT09IHVuZGVm
aW5lZDsKKworICAgIHRoaXMuX2NoYWlucyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9vYmplY3Qg
PSB1bmRlZmluZWQ7CisgICAgdGhpcy5jb3VudCA9IDA7CisKKyAgICB0aGlzLl92YWx1ZSA9IHZh
bHVlOworICAgIHRoaXMuX3BhdGhzID0ge307CisgICAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7Cisg
ICAgICB0aGlzLl9vYmplY3QgPSBwYXJlbnQudmFsdWUoKTsKKyAgICAgIGlmICh0aGlzLl9vYmpl
Y3QpIHsKKyAgICAgICAgYWRkQ2hhaW5XYXRjaGVyKHRoaXMuX29iamVjdCwgdGhpcy5fa2V5LCB0
aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBsYXp5R2V0KG9iaiwga2V5
KSB7CisgICAgaWYgKCFvYmopIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbWV0
YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworCisgICAgLy8gY2hlY2sgaWYgb2Jq
ZWN0IG1lYW50IG9ubHkgdG8gYmUgYSBwcm90b3R5cGUKKyAgICBpZiAobWV0YSAmJiBtZXRhLnBy
b3RvID09PSBvYmopIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBVc2UgYGdldGAg
aWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBFYWNoUHJveHkgb3IgYW4gdW5jYWNoZWFibGUgdmFs
dWUuCisgICAgaWYgKGlzVm9sYXRpbGUob2JqW2tleV0pKSB7CisgICAgICByZXR1cm4gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iaiwga2V5KTsKKyAgICAgIC8vIE90aGVyd2lzZSBhdHRl
bXB0IHRvIGdldCB0aGUgY2FjaGVkIHZhbHVlIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQorICAg
IH0gZWxzZSB7CisgICAgICAgIHZhciBjYWNoZSA9IG1ldGEucmVhZGFibGVDYWNoZSgpOworICAg
ICAgICBpZiAoY2FjaGUgJiYga2V5IGluIGNhY2hlKSB7CisgICAgICAgICAgcmV0dXJuIGNhY2hl
W2tleV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIENoYWluTm9kZS5wcm90b3R5cGUg
PSB7CisgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl92YWx1ZSA9PT0g
dW5kZWZpbmVkICYmIHRoaXMuX3dhdGNoaW5nKSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLl9w
YXJlbnQudmFsdWUoKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSBsYXp5R2V0KG9iaiwgdGhpcy5f
a2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLl92YWx1ZTsKKyAgICB9LAorCisgICAg
ZGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMuX3dhdGNoaW5nKSB7CisgICAg
ICAgIHZhciBvYmogPSB0aGlzLl9vYmplY3Q7CisgICAgICAgIGlmIChvYmopIHsKKyAgICAgICAg
ICByZW1vdmVDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRoaXMpOworICAgICAgICB9Cisg
ICAgICAgIHRoaXMuX3dhdGNoaW5nID0gZmFsc2U7IC8vIHNvIGZ1dHVyZSBjYWxscyBkbyBub3Ro
aW5nCisgICAgICB9CisgICAgfSwKKworICAgIC8vIGNvcGllcyBhIHRvcCBsZXZlbCBvYmplY3Qg
b25seQorICAgIGNvcHk6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgIHZhciByZXQgPSBuZXcgQ2hh
aW5Ob2RlKG51bGwsIG51bGwsIG9iaik7CisgICAgICB2YXIgcGF0aHMgPSB0aGlzLl9wYXRoczsK
KyAgICAgIHZhciBwYXRoOworCisgICAgICBmb3IgKHBhdGggaW4gcGF0aHMpIHsKKyAgICAgICAg
Ly8gdGhpcyBjaGVjayB3aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2YWxzLgorICAgICAgICBp
ZiAocGF0aHNbcGF0aF0gPD0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIHJldC5hZGQocGF0aCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0s
CisKKyAgICAvLyBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZSBvZiBhIGNoYWluIHRvIHNldHVwIHdh
dGNoZXJzIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAvLyBwYXRoLgorICAgIGFkZDogZnVuY3Rpb24g
KHBhdGgpIHsKKyAgICAgIHZhciBwYXRocyA9IHRoaXMuX3BhdGhzOworICAgICAgcGF0aHNbcGF0
aF0gPSAocGF0aHNbcGF0aF0gfHwgMCkgKyAxOworCisgICAgICB2YXIga2V5ID0gZmlyc3RLZXko
cGF0aCk7CisgICAgICB2YXIgdGFpbCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCArIDEpOworCisg
ICAgICB0aGlzLmNoYWluKGtleSwgdGFpbCk7CisgICAgfSwKKworICAgIC8vIGNhbGxlZCBvbiB0
aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8gdGVhcmRvd24gd2F0Y2hlciBvbiB0aGUgc3BlY2lm
aWVkCisgICAgLy8gcGF0aAorICAgIHJlbW92ZTogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZh
ciBwYXRocyA9IHRoaXMuX3BhdGhzOworICAgICAgaWYgKHBhdGhzW3BhdGhdID4gMCkgeworICAg
ICAgICBwYXRoc1twYXRoXS0tOworICAgICAgfQorCisgICAgICB2YXIga2V5ID0gZmlyc3RLZXko
cGF0aCk7CisgICAgICB2YXIgdGFpbCA9IHBhdGguc2xpY2Uoa2V5Lmxlbmd0aCArIDEpOworCisg
ICAgICB0aGlzLnVuY2hhaW4oa2V5LCB0YWlsKTsKKyAgICB9LAorCisgICAgY2hhaW46IGZ1bmN0
aW9uIChrZXksIHBhdGgpIHsKKyAgICAgIHZhciBjaGFpbnMgPSB0aGlzLl9jaGFpbnM7CisgICAg
ICB2YXIgbm9kZTsKKyAgICAgIGlmIChjaGFpbnMgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBj
aGFpbnMgPSB0aGlzLl9jaGFpbnMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVs
dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9kZSA9IGNoYWluc1trZXldOworICAgICAg
fQorCisgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIG5vZGUgPSBjaGFp
bnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCB1bmRlZmluZWQpOworICAgICAgfQor
CisgICAgICBub2RlLmNvdW50Kys7IC8vIGNvdW50IGNoYWlucy4uLgorCisgICAgICAvLyBjaGFp
biByZXN0IG9mIHBhdGggaWYgdGhlcmUgaXMgb25lCisgICAgICBpZiAocGF0aCkgeworICAgICAg
ICBrZXkgPSBmaXJzdEtleShwYXRoKTsKKyAgICAgICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5Lmxl
bmd0aCArIDEpOworICAgICAgICBub2RlLmNoYWluKGtleSwgcGF0aCk7CisgICAgICB9CisgICAg
fSwKKworICAgIHVuY2hhaW46IGZ1bmN0aW9uIChrZXksIHBhdGgpIHsKKyAgICAgIHZhciBjaGFp
bnMgPSB0aGlzLl9jaGFpbnM7CisgICAgICB2YXIgbm9kZSA9IGNoYWluc1trZXldOworCisgICAg
ICAvLyB1bmNoYWluIHJlc3Qgb2YgcGF0aCBmaXJzdC4uLgorICAgICAgaWYgKHBhdGggJiYgcGF0
aC5sZW5ndGggPiAxKSB7CisgICAgICAgIHZhciBuZXh0S2V5ID0gZmlyc3RLZXkocGF0aCk7Cisg
ICAgICAgIHZhciBuZXh0UGF0aCA9IHBhdGguc2xpY2UobmV4dEtleS5sZW5ndGggKyAxKTsKKyAg
ICAgICAgbm9kZS51bmNoYWluKG5leHRLZXksIG5leHRQYXRoKTsKKyAgICAgIH0KKworICAgICAg
Ly8gZGVsZXRlIG5vZGUgaWYgbmVlZGVkLgorICAgICAgbm9kZS5jb3VudC0tOworICAgICAgaWYg
KG5vZGUuY291bnQgPD0gMCkgeworICAgICAgICBjaGFpbnNbbm9kZS5fa2V5XSA9IHVuZGVmaW5l
ZDsKKyAgICAgICAgbm9kZS5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSwKKworICAgIG5vdGlm
eTogZnVuY3Rpb24gKHJldmFsaWRhdGUsIGFmZmVjdGVkKSB7CisgICAgICBpZiAocmV2YWxpZGF0
ZSAmJiB0aGlzLl93YXRjaGluZykgeworICAgICAgICB2YXIgb2JqID0gdGhpcy5fcGFyZW50LnZh
bHVlKCk7CisgICAgICAgIGlmIChvYmogIT09IHRoaXMuX29iamVjdCkgeworICAgICAgICAgIHJl
bW92ZUNoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7CisgICAgICAg
ICAgdGhpcy5fb2JqZWN0ID0gb2JqOworICAgICAgICAgIGFkZENoYWluV2F0Y2hlcihvYmosIHRo
aXMuX2tleSwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmlu
ZWQ7CisgICAgICB9CisKKyAgICAgIC8vIHRoZW4gbm90aWZ5IGNoYWlucy4uLgorICAgICAgdmFy
IGNoYWlucyA9IHRoaXMuX2NoYWluczsKKyAgICAgIHZhciBub2RlOworICAgICAgaWYgKGNoYWlu
cykgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gY2hhaW5zKSB7CisgICAgICAgICAgbm9kZSA9
IGNoYWluc1trZXldOworICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHsKKyAgICAg
ICAgICAgIG5vZGUubm90aWZ5KHJldmFsaWRhdGUsIGFmZmVjdGVkKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGFmZmVjdGVkICYmIHRoaXMuX3BhcmVudCkg
eworICAgICAgICB0aGlzLl9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZCh0aGlzLl9rZXksIDEsIGFm
ZmVjdGVkKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcG9wdWxhdGVBZmZlY3RlZDogZnVuY3Rp
b24gKHBhdGgsIGRlcHRoLCBhZmZlY3RlZCkgeworICAgICAgaWYgKHRoaXMuX2tleSkgeworICAg
ICAgICBwYXRoID0gdGhpcy5fa2V5ICsgJy4nICsgcGF0aDsKKyAgICAgIH0KKworICAgICAgaWYg
KHRoaXMuX3BhcmVudCkgeworICAgICAgICB0aGlzLl9wYXJlbnQucG9wdWxhdGVBZmZlY3RlZChw
YXRoLCBkZXB0aCArIDEsIGFmZmVjdGVkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChk
ZXB0aCA+IDEpIHsKKyAgICAgICAgICBhZmZlY3RlZC5wdXNoKHRoaXMudmFsdWUoKSwgcGF0aCk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gZmluaXNoQ2hh
aW5zKG9iaikgeworICAgIC8vIFdlIG9ubHkgY3JlYXRlIG1ldGEgaWYgd2UgcmVhbGx5IGhhdmUg
dG8KKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIGlmICht
KSB7CisgICAgICBtID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKworICAgICAgLy8gZmlu
aXNoIGFueSBjdXJyZW50IGNoYWlucyBub2RlIHdhdGNoZXJzIHRoYXQgcmVmZXJlbmNlIG9iagor
ICAgICAgdmFyIGNoYWluV2F0Y2hlcnMgPSBtLnJlYWRhYmxlQ2hhaW5XYXRjaGVycygpOworICAg
ICAgaWYgKGNoYWluV2F0Y2hlcnMpIHsKKyAgICAgICAgY2hhaW5XYXRjaGVycy5yZXZhbGlkYXRl
QWxsKCk7CisgICAgICB9CisgICAgICAvLyBlbnN1cmUgdGhhdCBpZiB3ZSBoYXZlIGluaGVyaXRl
ZCBhbnkgY2hhaW5zIHRoZXkgaGF2ZSBiZWVuCisgICAgICAvLyBjb3BpZWQgb250byBvdXIgb3du
IG1ldGEuCisgICAgICBpZiAobS5yZWFkYWJsZUNoYWlucygpKSB7CisgICAgICAgIG0ud3JpdGFi
bGVDaGFpbnMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLnJlbW92ZUNoYWlu
V2F0Y2hlciA9IHJlbW92ZUNoYWluV2F0Y2hlcjsKKyAgZXhwb3J0cy5DaGFpbk5vZGUgPSBDaGFp
bk5vZGU7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1l
dGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvZXhwYW5kX3Byb3Bl
cnRpZXMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZGVwZW5kZW50X2tleXMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVy
dHlfc2V0LCBfZW1iZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsRXhw
YW5kX3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVydGllcywg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRGVwZW5kZW50X2tleXMpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGNvbXB1dGVkOworCisgIC8q
KgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICBm
dW5jdGlvbiBVTkRFRklORUQoKSB7fQorCisgIHZhciBERUVQX0VBQ0hfUkVHRVggPSAvXC5AZWFj
aFwuW14uXStcLi87CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0cmFuc2Zvcm1z
IGFuIG9iamVjdCBsaXRlcmFsIHdpdGggb2JqZWN0J3MgYWNjZXNzb3IgZnVuY3Rpb24ocykgaW50
byBhIHByb3BlcnR5LgorICAKKyAgICBCeSBkZWZhdWx0IHRoZSBmdW5jdGlvbiBiYWNraW5nIHRo
ZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgY2FsbGVkCisgICAgb25jZSBhbmQgdGhl
IHJlc3VsdCB3aWxsIGJlIGNhY2hlZC4gWW91IGNhbiBzcGVjaWZ5IHZhcmlvdXMgcHJvcGVydGll
cworICAgIHRoYXQgeW91ciBjb21wdXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uLiBUaGlzIHdpbGwg
Zm9yY2UgdGhlIGNhY2hlZAorICAgIHJlc3VsdCB0byBiZSByZWNvbXB1dGVkIGlmIHRoZSBkZXBl
bmRlbmNpZXMgYXJlIG1vZGlmaWVkLgorICAKKyAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUg
d2UgZGVjbGFyZSBhIGNvbXB1dGVkIHByb3BlcnR5IC0gYGZ1bGxOYW1lYCAtIGJ5IGNhbGxpbmcK
KyAgICBgLkVtYmVyLmNvbXB1dGVkKClgIHdpdGggcHJvcGVydHkgZGVwZW5kZW5jaWVzIChgZmly
c3ROYW1lYCBhbmQgYGxhc3ROYW1lYCkgYXMgbGVhZGluZyBhcmd1bWVudHMgYW5kIGdldHRlciBh
Y2Nlc3NvciBmdW5jdGlvbi4gVGhlIGBmdWxsTmFtZWAgZ2V0dGVyIGZ1bmN0aW9uCisgICAgd2ls
bCBiZSBjYWxsZWQgb25jZSAocmVnYXJkbGVzcyBvZiBob3cgbWFueSB0aW1lcyBpdCBpcyBhY2Nl
c3NlZCkgYXMgbG9uZworICAgIGFzIGl0cyBkZXBlbmRlbmNpZXMgaGF2ZSBub3QgY2hhbmdlZC4g
T25jZSBgZmlyc3ROYW1lYCBvciBgbGFzdE5hbWVgIGFyZSB1cGRhdGVkCisgICAgYW55IGZ1dHVy
ZSBjYWxscyAob3IgYW55dGhpbmcgYm91bmQpIHRvIGBmdWxsTmFtZWAgd2lsbCBpbmNvcnBvcmF0
ZSB0aGUgbmV3CisgICAgdmFsdWVzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgbGV0IFBl
cnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgLy8gdGhlc2Ugd2lsbCBiZSBzdXBw
bGllZCBieSBgY3JlYXRlYAorICAgICAgZmlyc3ROYW1lOiBudWxsLAorICAgICAgbGFzdE5hbWU6
IG51bGwsCisgIAorICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1dGVkKCdmaXJzdE5hbWUnLCAn
bGFzdE5hbWUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgbGV0IGZpcnN0TmFtZSA9IHRoaXMuZ2V0
KCdmaXJzdE5hbWUnKSwKKyAgICAgICAgICAgIGxhc3ROYW1lICA9IHRoaXMuZ2V0KCdsYXN0TmFt
ZScpOworICAKKyAgICAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAg
ICAgfSkKKyAgICB9KTsKKyAgCisgICAgbGV0IHRvbSA9IFBlcnNvbi5jcmVhdGUoeworICAgICAg
Zmlyc3ROYW1lOiAnVG9tJywKKyAgICAgIGxhc3ROYW1lOiAnRGFsZScKKyAgICB9KTsKKyAgCisg
ICAgdG9tLmdldCgnZnVsbE5hbWUnKSAvLyAnVG9tIERhbGUnCisgICAgYGBgCisgIAorICAgIFlv
dSBjYW4gYWxzbyBkZWZpbmUgd2hhdCBFbWJlciBzaG91bGQgZG8gd2hlbiBzZXR0aW5nIGEgY29t
cHV0ZWQgcHJvcGVydHkgYnkgcHJvdmlkaW5nIGFkZGl0aW9uYWwgZnVuY3Rpb24gKGBzZXRgKSBp
biBoYXNoIGFyZ3VtZW50LgorICAgIElmIHlvdSB0cnkgdG8gc2V0IGEgY29tcHV0ZWQgcHJvcGVy
dHksIGl0IHdpbGwgdHJ5IHRvIGludm9rZSBzZXR0ZXIgYWNjZXNzb3IgZnVuY3Rpb24gd2l0aCB0
aGUga2V5IGFuZAorICAgIHZhbHVlIHlvdSB3YW50IHRvIHNldCBpdCB0byBhcyBhcmd1bWVudHMu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBsZXQgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4
dGVuZCh7CisgICAgICAvLyB0aGVzZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IGBjcmVhdGVgCisgICAg
ICBmaXJzdE5hbWU6IG51bGwsCisgICAgICBsYXN0TmFtZTogbnVsbCwKKyAgCisgICAgICBmdWxs
TmFtZTogRW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIHsKKyAgICAgICAg
Z2V0KGtleSkgeworICAgICAgICAgIGxldCBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1l
JyksCisgICAgICAgICAgICAgIGxhc3ROYW1lICA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOworICAK
KyAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgJyAnICsgbGFzdE5hbWU7CisgICAgICAgIH0s
CisgICAgICAgIHNldChrZXksIHZhbHVlKSB7CisgICAgICAgICAgbGV0IFtmaXJzdE5hbWUsIGxh
c3ROYW1lXSA9IHZhbHVlLnNwbGl0KCcgJyk7CisgIAorICAgICAgICAgIHRoaXMuc2V0KCdmaXJz
dE5hbWUnLCBmaXJzdE5hbWUpOworICAgICAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScsIGxhc3RO
YW1lKTsKKyAgCisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICB9KQor
ICAgIH0pOworICAKKyAgICBsZXQgcGVyc29uID0gUGVyc29uLmNyZWF0ZSgpOworICAKKyAgICBw
ZXJzb24uc2V0KCdmdWxsTmFtZScsICdQZXRlciBXYWdlbmV0Jyk7CisgICAgcGVyc29uLmdldCgn
Zmlyc3ROYW1lJyk7IC8vICdQZXRlcicKKyAgICBwZXJzb24uZ2V0KCdsYXN0TmFtZScpOyAgLy8g
J1dhZ2VuZXQnCisgICAgYGBgCisgIAorICAgIFlvdSBjYW4gb3ZlcndyaXRlIGNvbXB1dGVkIHBy
b3BlcnR5IHdpdGggbm9ybWFsIHByb3BlcnR5IChubyBsb25nZXIgY29tcHV0ZWQpLCB0aGF0IHdv
bid0IGNoYW5nZSBpZiBkZXBlbmRlbmNpZXMgY2hhbmdlLCBpZiB5b3Ugc2V0IGNvbXB1dGVkIHBy
b3BlcnR5IGFuZCBpdCB3b24ndCBoYXZlIHNldHRlciBhY2Nlc3NvciBmdW5jdGlvbiBkZWZpbmVk
LgorICAKKyAgICBZb3UgY2FuIGFsc28gbWFyayBjb21wdXRlZCBwcm9wZXJ0eSBhcyBgLnJlYWRP
bmx5KClgIGFuZCBibG9jayBhbGwgYXR0ZW1wdHMgdG8gc2V0IGl0LgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgLy8g
dGhlc2Ugd2lsbCBiZSBzdXBwbGllZCBieSBgY3JlYXRlYAorICAgICAgZmlyc3ROYW1lOiBudWxs
LAorICAgICAgbGFzdE5hbWU6IG51bGwsCisgIAorICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1
dGVkKCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCB7CisgICAgICAgIGdldChrZXkpIHsKKyAgICAg
ICAgICBsZXQgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOworICAgICAgICAgIGxl
dCBsYXN0TmFtZSAgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAgCisgICAgICAgICAgcmV0dXJu
IGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lOworICAgICAgICB9CisgICAgICB9KS5yZWFkT25s
eSgpCisgICAgfSk7CisgIAorICAgIGxldCBwZXJzb24gPSBQZXJzb24uY3JlYXRlKCk7CisgICAg
cGVyc29uLnNldCgnZnVsbE5hbWUnLCAnUGV0ZXIgV2FnZW5ldCcpOyAvLyBVbmNhdWdodCBFcnJv
cjogQ2Fubm90IHNldCByZWFkLW9ubHkgcHJvcGVydHkgImZ1bGxOYW1lIiBvbiBvYmplY3Q6IDwo
Li4uKTplbWJlclhYWD4KKyAgICBgYGAKKyAgCisgICAgQWRkaXRpb25hbCByZXNvdXJjZXM6Cisg
ICAgLSBbTmV3IENQIHN5bnRheCBSRkNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL3JmY3Mv
YmxvYi9tYXN0ZXIvdGV4dC8wMDExLWltcHJvdmVkLWNwLXN5bnRheC5tZCkKKyAgICAtIFtOZXcg
Y29tcHV0ZWQgc3ludGF4IGV4cGxhaW5lZCBpbiAiRW1iZXIgMS4xMiByZWxlYXNlZCIgXShodHRw
Oi8vZW1iZXJqcy5jb20vYmxvZy8yMDE1LzA1LzEzL2VtYmVyLTEtMTItcmVsZWFzZWQuaHRtbCN0
b2NfbmV3LWNvbXB1dGVkLXN5bnRheCkKKyAgCisgICAgQGNsYXNzIENvbXB1dGVkUHJvcGVydHkK
KyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHB1YmxpYworICAqLworICBmdW5jdGlvbiBDb21w
dXRlZFByb3BlcnR5KGNvbmZpZywgb3B0cykgeworICAgIHRoaXMuaXNEZXNjcmlwdG9yID0gdHJ1
ZTsKKyAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgdGhpcy5f
Z2V0dGVyID0gY29uZmlnOworICAgIH0gZWxzZSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnRW1iZXIuY29tcHV0ZWQgZXhwZWN0cyBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCBhcyBs
YXN0IGFyZ3VtZW50LicsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0Fy
cmF5KGNvbmZpZykpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0NvbmZpZyBvYmpl
Y3QgcGFzZWQgdG8gYSBFbWJlci5jb21wdXRlZCBjYW4gb25seSBjb250YWluIGBnZXRgIG9yIGBz
ZXRgIGtleXMuJywgKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5
cyhjb25maWcpOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgICBpZiAoa2V5c1tpXSAhPT0gJ2dldCcgJiYga2V5c1tpXSAhPT0gJ3NldCcp
IHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KSgpKTsKKyAgICAgIHRoaXMuX2dldHRlciA9IGNv
bmZpZy5nZXQ7CisgICAgICB0aGlzLl9zZXR0ZXIgPSBjb25maWcuc2V0OworICAgIH0KKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ29tcHV0ZWQgcHJvcGVydGllcyBtdXN0IHJlY2VpdmUg
YSBnZXR0ZXIgb3IgYSBzZXR0ZXIsIHlvdSBwYXNzZWQgbm9uZS4nLCAhIXRoaXMuX2dldHRlciB8
fCAhIXRoaXMuX3NldHRlcik7CisgICAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IHVuZGVmaW5lZDsK
KyAgICB0aGlzLl9zdXNwZW5kZWQgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fbWV0YSA9IHVuZGVm
aW5lZDsKKyAgICB0aGlzLl92b2xhdGlsZSA9IGZhbHNlOworICAgIHRoaXMuX2RlcGVuZGVudEtl
eXMgPSBvcHRzICYmIG9wdHMuZGVwZW5kZW50S2V5czsKKyAgICB0aGlzLl9yZWFkT25seSA9IGZh
bHNlOworICB9CisKKyAgQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcgX2VtYmVyTWV0
YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3IoKTsKKworICB2YXIgQ29tcHV0ZWRQcm9wZXJ0eVByb3Rv
dHlwZSA9IENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlOworCisgIC8qKgorICAgIENhbGwgb24g
YSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUuIFdoZW4g
aW4gdGhpcworICAgIG1vZGUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdpbGwgbm90IGF1dG9tYXRp
Y2FsbHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KKyAgCisgICAgSXQgYWxzbyBkb2VzIG5vdCBh
dXRvbWF0aWNhbGx5IGZpcmUgYW55IGNoYW5nZSBldmVudHMuIFlvdSBtdXN0IG1hbnVhbGx5IG5v
dGlmeQorICAgIGFueSBjaGFuZ2VzIGlmIHlvdSB3YW50IHRvIG9ic2VydmUgdGhpcyBwcm9wZXJ0
eS4KKyAgCisgICAgRGVwZW5kZW5jeSBrZXlzIGhhdmUgbm8gZWZmZWN0IG9uIHZvbGF0aWxlIHBy
b3BlcnRpZXMgYXMgdGhleSBhcmUgZm9yIGNhY2hlCisgICAgaW52YWxpZGF0aW9uIGFuZCBub3Rp
ZmljYXRpb24gd2hlbiBjYWNoZWQgdmFsdWUgaXMgaW52YWxpZGF0ZWQuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBsZXQgb3V0c2lkZVNlcnZpY2UgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
KyAgICAgIHZhbHVlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJu
IE91dHNpZGVTZXJ2aWNlLmdldFZhbHVlKCk7CisgICAgICB9KS52b2xhdGlsZSgpCisgICAgfSku
Y3JlYXRlKCk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2Qgdm9sYXRpbGUKKyAgICBAcmV0dXJu
IHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWluYWJsZQorICAgIEBwdWJs
aWMKKyAgKi8KKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS52b2xhdGlsZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB0aGlzLl92b2xhdGlsZSA9IHRydWU7CisgICAgcmV0dXJuIHRoaXM7CisgIH07
CisKKyAgLyoqCisgICAgQ2FsbCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5IHRvIHNldCBpdCBpbnRv
IHJlYWQtb25seSBtb2RlLiBXaGVuIGluIHRoaXMKKyAgICBtb2RlIHRoZSBjb21wdXRlZCBwcm9w
ZXJ0eSB3aWxsIHRocm93IGFuIGVycm9yIHdoZW4gc2V0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgZ3VpZDogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAnZ3VpZC1ndWlkLWd1aWQn
OworICAgICAgfSkucmVhZE9ubHkoKQorICAgIH0pOworICAKKyAgICBsZXQgcGVyc29uID0gUGVy
c29uLmNyZWF0ZSgpOworICAKKyAgICBwZXJzb24uc2V0KCdndWlkJywgJ25ldy1ndWlkJyk7IC8v
IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgcmVhZE9u
bHkKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWlu
YWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5yZWFk
T25seSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLl9yZWFkT25seSA9IHRydWU7CisgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0NvbXB1dGVkIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgYSBz
ZXR0ZXIgdXNpbmcgdGhlIG5ldyBzeW50YXggY2Fubm90IGJlIHJlYWQtb25seScsICEodGhpcy5f
cmVhZE9ubHkgJiYgdGhpcy5fc2V0dGVyICYmIHRoaXMuX3NldHRlciAhPT0gdGhpcy5fZ2V0dGVy
KSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH07CisKKyAgLyoqCisgICAgU2V0cyB0aGUgZGVwZW5k
ZW50IGtleXMgb24gdGhpcyBjb21wdXRlZCBwcm9wZXJ0eS4gUGFzcyBhbnkgbnVtYmVyIG9mCisg
ICAgYXJndW1lbnRzIGNvbnRhaW5pbmcga2V5IHBhdGhzIHRoYXQgdGhpcyBjb21wdXRlZCBwcm9w
ZXJ0eSBkZXBlbmRzIG9uLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgbGV0IFByZXNpZGVu
dCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgZnVsbE5hbWU6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAn
ICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisgIAorICAgICAgICAvLyBUZWxsIEVtYmVyIHRoYXQg
dGhpcyBjb21wdXRlZCBwcm9wZXJ0eSBkZXBlbmRzIG9uIGZpcnN0TmFtZQorICAgICAgICAvLyBh
bmQgbGFzdE5hbWUKKyAgICAgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQor
ICAgIH0pOworICAKKyAgICBsZXQgcHJlc2lkZW50ID0gUHJlc2lkZW50LmNyZWF0ZSh7CisgICAg
ICBmaXJzdE5hbWU6ICdCYXJhY2snLAorICAgICAgbGFzdE5hbWU6ICdPYmFtYScKKyAgICB9KTsK
KyAgCisgICAgcHJlc2lkZW50LmdldCgnZnVsbE5hbWUnKTsgLy8gJ0JhcmFjayBPYmFtYScKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRo
KiB6ZXJvIG9yIG1vcmUgcHJvcGVydHkgcGF0aHMKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRl
ZFByb3BlcnR5fSB0aGlzCisgICAgQGNoYWluYWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgQ29t
cHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIg
YXJnczsKKworICAgIHZhciBhZGRBcmcgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcud2FybignRGVwZW5kZW50IGtleXMgY29udGFpbmluZyBAZWFjaCBvbmx5
IHdvcmsgb25lIGxldmVsIGRlZXAuICcgKyAnWW91IGNhbm5vdCB1c2UgbmVzdGVkIGZvcm1zIGxp
a2UgdG9kb3MuQGVhY2gub3duZXIubmFtZSBvciB0b2Rvcy5AZWFjaC5vd25lci5AZWFjaC5uYW1l
LiAnICsgJ1BsZWFzZSBjcmVhdGUgYW4gaW50ZXJtZWRpYXJ5IGNvbXB1dGVkIHByb3BlcnR5Lics
IERFRVBfRUFDSF9SRUdFWC50ZXN0KHByb3BlcnR5KSA9PT0gZmFsc2UsIHsgaWQ6ICdlbWJlci1t
ZXRhbC5jb21wdXRlZC1kZWVwLWVhY2gnIH0pOworICAgICAgYXJncy5wdXNoKHByb3BlcnR5KTsK
KyAgICB9OworCisgICAgYXJncyA9IFtdOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1l
bnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVy
dGllcy5kZWZhdWx0KGFyZ3VtZW50c1tpXSwgYWRkQXJnKTsKKyAgICB9CisKKyAgICB0aGlzLl9k
ZXBlbmRlbnRLZXlzID0gYXJnczsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworICAvKioKKyAg
ICBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gYW5ub3RhdGUgY29tcHV0ZWQgcHJvcGVy
dGllcyB3aXRoIGFkZGl0aW9uYWwKKyAgICBtZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlv
biBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJhdGUgb24uIEZvciBleGFtcGxlLAorICAgIGNvbXB1
dGVkIHByb3BlcnR5IGZ1bmN0aW9ucyBtYXkgY2xvc2Ugb3ZlciB2YXJpYWJsZXMgdGhhdCBhcmUg
dGhlbiBubyBsb25nZXIKKyAgICBhdmFpbGFibGUgZm9yIGludHJvc3BlY3Rpb24uCisgIAorICAg
IFlvdSBjYW4gcGFzcyBhIGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVy
dHkgbGlrZSB0aGlzOgorICAKKyAgICBgYGAKKyAgICBwZXJzb246IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKCkgeworICAgICAgbGV0IHBlcnNvbklkID0gdGhpcy5nZXQoJ3BlcnNvbklkJyk7Cisg
ICAgICByZXR1cm4gQXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgICAgfSku
bWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKKyAgICBgYGAKKyAgCisgICAgVGhlIGhhc2ggdGhh
dCB5b3UgcGFzcyB0byB0aGUgYG1ldGEoKWAgZnVuY3Rpb24gd2lsbCBiZSBzYXZlZCBvbiB0aGUK
KyAgICBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4g
RW1iZXIgcnVudGltZQorICAgIGV4cG9zZXMgYSBwdWJsaWMgQVBJIGZvciByZXRyaWV2aW5nIHRo
ZXNlIHZhbHVlcyBmcm9tIGNsYXNzZXMsCisgICAgdmlhIHRoZSBgbWV0YUZvclByb3BlcnR5KClg
IGZ1bmN0aW9uLgorICAKKyAgICBAbWV0aG9kIG1ldGEKKyAgICBAcGFyYW0ge09iamVjdH0gbWV0
YQorICAgIEBjaGFpbmFibGUKKyAgICBAcHVibGljCisgICovCisgIENvbXB1dGVkUHJvcGVydHlQ
cm90b3R5cGUubWV0YSA9IGZ1bmN0aW9uIChtZXRhKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5n
dGggPT09IDApIHsKKyAgICAgIHJldHVybiB0aGlzLl9tZXRhIHx8IHt9OworICAgIH0gZWxzZSB7
CisgICAgICB0aGlzLl9tZXRhID0gbWV0YTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAg
fTsKKworICAvLyBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gQ1Aga2V5IGNoYW5nZXMKKyAgQ29tcHV0
ZWRQcm9wZXJ0eVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7
CisgICAgLy8gX3N1c3BlbmRlZCBpcyBzZXQgdmlhIGEgQ1Auc2V0IHRvIGVuc3VyZSB3ZSBkb24n
dCBjbGVhcgorICAgIC8vIHRoZSBjYWNoZWQgdmFsdWUgc2V0IGJ5IHRoZSBzZXR0ZXIKKyAgICBp
ZiAodGhpcy5fdm9sYXRpbGUgfHwgdGhpcy5fc3VzcGVuZGVkID09PSBvYmopIHsKKyAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyBkb24ndCBjcmVhdGUgb2JqZWN0cyBqdXN0IHRvIGludmFs
aWRhdGUKKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAg
IGlmICghbWV0YSB8fCBtZXRhLnNvdXJjZSAhPT0gb2JqKSB7CisgICAgICByZXR1cm47CisgICAg
fQorCisgICAgdmFyIGNhY2hlID0gbWV0YS5yZWFkYWJsZUNhY2hlKCk7CisgICAgaWYgKGNhY2hl
ICYmIGNhY2hlW2tleU5hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGNhY2hlW2tleU5hbWVd
ID0gdW5kZWZpbmVkOworICAgICAgX2VtYmVyTWV0YWxEZXBlbmRlbnRfa2V5cy5yZW1vdmVEZXBl
bmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7CisgICAgfQorICB9OworCisgIENv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgewor
ICAgIGlmICh0aGlzLl92b2xhdGlsZSkgeworICAgICAgcmV0dXJuIHRoaXMuX2dldHRlci5jYWxs
KG9iaiwga2V5TmFtZSk7CisgICAgfQorCisgICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEu
bWV0YShvYmopOworICAgIHZhciBjYWNoZSA9IG1ldGEud3JpdGFibGVDYWNoZSgpOworCisgICAg
dmFyIHJlc3VsdCA9IGNhY2hlW2tleU5hbWVdOworICAgIGlmIChyZXN1bHQgPT09IFVOREVGSU5F
RCkgeworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPT0g
dW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZhciByZXQg
PSB0aGlzLl9nZXR0ZXIuY2FsbChvYmosIGtleU5hbWUpOworICAgIGlmIChyZXQgPT09IHVuZGVm
aW5lZCkgeworICAgICAgY2FjaGVba2V5TmFtZV0gPSBVTkRFRklORUQ7CisgICAgfSBlbHNlIHsK
KyAgICAgIGNhY2hlW2tleU5hbWVdID0gcmV0OworICAgIH0KKworICAgIHZhciBjaGFpbldhdGNo
ZXJzID0gbWV0YS5yZWFkYWJsZUNoYWluV2F0Y2hlcnMoKTsKKyAgICBpZiAoY2hhaW5XYXRjaGVy
cykgeworICAgICAgY2hhaW5XYXRjaGVycy5yZXZhbGlkYXRlKGtleU5hbWUpOworICAgIH0KKyAg
ICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBr
ZXlOYW1lLCBtZXRhKTsKKworICAgIHJldHVybiByZXQ7CisgIH07CisKKyAgQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBjb21wdXRlZFByb3BlcnR5U2V0RW50cnkob2Jq
LCBrZXlOYW1lLCB2YWx1ZSkgeworICAgIGlmICh0aGlzLl9yZWFkT25seSkgeworICAgICAgdGhp
cy5fdGhyb3dSZWFkT25seUVycm9yKG9iaiwga2V5TmFtZSk7CisgICAgfQorCisgICAgaWYgKCF0
aGlzLl9zZXR0ZXIpIHsKKyAgICAgIHJldHVybiB0aGlzLmNsb2JiZXJTZXQob2JqLCBrZXlOYW1l
LCB2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKHRoaXMuX3ZvbGF0aWxlKSB7CisgICAgICByZXR1
cm4gdGhpcy52b2xhdGlsZVNldChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGhpcy5zZXRXaXRoU3VzcGVuZChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgfTsKKwor
ICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLl90aHJvd1JlYWRPbmx5RXJyb3IgPSBmdW5jdGlv
biBjb21wdXRlZFByb3BlcnR5VGhyb3dSZWFkT25seUVycm9yKG9iaiwga2V5TmFtZSkgeworICAg
IHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0Nhbm5vdCBzZXQgcmVhZC1vbmx5
IHByb3BlcnR5ICInICsga2V5TmFtZSArICciIG9uIG9iamVjdDogJyArIF9lbWJlck1ldGFsVXRp
bHMuaW5zcGVjdChvYmopKTsKKyAgfTsKKworICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLmNs
b2JiZXJTZXQgPSBmdW5jdGlvbiBjb21wdXRlZFByb3BlcnR5Q2xvYmJlclNldChvYmosIGtleU5h
bWUsIHZhbHVlKSB7CisgICAgdmFyIGNhY2hlZFZhbHVlID0gY2FjaGVGb3Iob2JqLCBrZXlOYW1l
KTsKKyAgICBfZW1iZXJNZXRhbFByb3BlcnRpZXMuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1l
LCBudWxsLCBjYWNoZWRWYWx1ZSk7CisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KG9i
aiwga2V5TmFtZSwgdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKKworICBDb21wdXRl
ZFByb3BlcnR5UHJvdG90eXBlLnZvbGF0aWxlU2V0ID0gZnVuY3Rpb24gY29tcHV0ZWRQcm9wZXJ0
eVZvbGF0aWxlU2V0KG9iaiwga2V5TmFtZSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpcy5fc2V0
dGVyLmNhbGwob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgIH07CisKKyAgQ29tcHV0ZWRQcm9wZXJ0
eVByb3RvdHlwZS5zZXRXaXRoU3VzcGVuZCA9IGZ1bmN0aW9uIGNvbXB1dGVkUHJvcGVydHlTZXRX
aXRoU3VzcGVuZChvYmosIGtleU5hbWUsIHZhbHVlKSB7CisgICAgdmFyIG9sZFN1c3BlbmRlZCA9
IHRoaXMuX3N1c3BlbmRlZDsKKyAgICB0aGlzLl9zdXNwZW5kZWQgPSBvYmo7CisgICAgdHJ5IHsK
KyAgICAgIHJldHVybiB0aGlzLl9zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7CisgICAgfSBmaW5h
bGx5IHsKKyAgICAgIHRoaXMuX3N1c3BlbmRlZCA9IG9sZFN1c3BlbmRlZDsKKyAgICB9CisgIH07
CisKKyAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5fc2V0ID0gZnVuY3Rpb24gY29tcHV0ZWRQ
cm9wZXJ0eVNldChvYmosIGtleU5hbWUsIHZhbHVlKSB7CisgICAgLy8gY2FjaGUgcmVxdWlyZXMg
b3duIG1ldGEKKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisgICAg
Ly8gZWl0aGVyIHRoZXJlIGlzIGEgd3JpdGFibGUgY2FjaGUgb3Igd2UgbmVlZCBvbmUgdG8gdXBk
YXRlCisgICAgdmFyIGNhY2hlID0gbWV0YS53cml0YWJsZUNhY2hlKCk7CisgICAgdmFyIGhhZENh
Y2hlZFZhbHVlID0gZmFsc2U7CisgICAgdmFyIGNhY2hlZFZhbHVlID0gdW5kZWZpbmVkOworICAg
IGlmIChjYWNoZVtrZXlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBpZiAoY2FjaGVba2V5
TmFtZV0gIT09IFVOREVGSU5FRCkgeworICAgICAgICBjYWNoZWRWYWx1ZSA9IGNhY2hlW2tleU5h
bWVdOworICAgICAgfQorICAgICAgaGFkQ2FjaGVkVmFsdWUgPSB0cnVlOworICAgIH0KKworICAg
IHZhciByZXQgPSB0aGlzLl9zZXR0ZXIuY2FsbChvYmosIGtleU5hbWUsIHZhbHVlLCBjYWNoZWRW
YWx1ZSk7CisKKyAgICAvLyBhbGxvd3Mgc2V0dGVyIHRvIHJldHVybiB0aGUgc2FtZSB2YWx1ZSB0
aGF0IGlzIGNhY2hlZCBhbHJlYWR5CisgICAgaWYgKGhhZENhY2hlZFZhbHVlICYmIGNhY2hlZFZh
bHVlID09PSByZXQpIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdmFyIHdhdGNo
ZWQgPSBtZXRhLnBlZWtXYXRjaGluZyhrZXlOYW1lKTsKKyAgICBpZiAod2F0Y2hlZCkgeworICAg
ICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKG9iaiwga2V5
TmFtZSk7CisgICAgfQorCisgICAgaWYgKGhhZENhY2hlZFZhbHVlKSB7CisgICAgICBjYWNoZVtr
ZXlOYW1lXSA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBpZiAoIWhhZENhY2hlZFZhbHVlKSB7
CisgICAgICBfZW1iZXJNZXRhbERlcGVuZGVudF9rZXlzLmFkZERlcGVuZGVudEtleXModGhpcywg
b2JqLCBrZXlOYW1lLCBtZXRhKTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09PSB1bmRlZmluZWQp
IHsKKyAgICAgIGNhY2hlW2tleU5hbWVdID0gVU5ERUZJTkVEOworICAgIH0gZWxzZSB7CisgICAg
ICBjYWNoZVtrZXlOYW1lXSA9IHJldDsKKyAgICB9CisKKyAgICBpZiAod2F0Y2hlZCkgeworICAg
ICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlEaWRDaGFuZ2Uob2JqLCBrZXlO
YW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9OworCisgIC8qIGNhbGxlZCBiZWZv
cmUgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiAqLworICBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBl
LnRlYXJkb3duID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgeworICAgIGlmICh0aGlzLl92b2xh
dGlsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgbWV0YSA9IF9lbWJlck1ldGFs
TWV0YS5tZXRhKG9iaik7CisgICAgdmFyIGNhY2hlID0gbWV0YS5yZWFkYWJsZUNhY2hlKCk7Cisg
ICAgaWYgKGNhY2hlICYmIGNhY2hlW2tleU5hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIF9l
bWJlck1ldGFsRGVwZW5kZW50X2tleXMucmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtl
eU5hbWUsIG1ldGEpOworICAgICAgY2FjaGVba2V5TmFtZV0gPSB1bmRlZmluZWQ7CisgICAgfQor
ICB9OworCisgIC8qKgorICAgIFRoaXMgaGVscGVyIHJldHVybnMgYSBuZXcgcHJvcGVydHkgZGVz
Y3JpcHRvciB0aGF0IHdyYXBzIHRoZSBwYXNzZWQKKyAgICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5j
dGlvbi4gWW91IGNhbiB1c2UgdGhpcyBoZWxwZXIgdG8gZGVmaW5lIHByb3BlcnRpZXMKKyAgICB3
aXRoIG1peGlucyBvciB2aWEgYEVtYmVyLmRlZmluZVByb3BlcnR5KClgLgorICAKKyAgICBJZiB5
b3UgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBn
ZXR0ZXIuIEEgY29tcHV0ZWQKKyAgICBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoaXMgd2F5IG1pZ2h0
IGxvb2sgbGlrZSB0aGlzOgorICAKKyAgICBgYGBqcworICAgIGxldCBQZXJzb24gPSBFbWJlci5P
YmplY3QuZXh0ZW5kKHsKKyAgICAgIGluaXQoKSB7CisgICAgICAgIHRoaXMuX3N1cGVyKC4uLmFy
Z3VtZW50cyk7CisgIAorICAgICAgICB0aGlzLmZpcnN0TmFtZSA9ICdCZXR0eSc7CisgICAgICAg
IHRoaXMubGFzdE5hbWUgPSAnSm9uZXMnOworICAgICAgfSwKKyAgCisgICAgICBmdWxsTmFtZTog
RW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIGZ1bmN0aW9uKCkgeworICAg
ICAgICByZXR1cm4gYCR7dGhpcy5nZXQoJ2ZpcnN0TmFtZScpfSAke3RoaXMuZ2V0KCdsYXN0TmFt
ZScpfWA7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICBsZXQgY2xpZW50ID0gUGVyc29uLmNy
ZWF0ZSgpOworICAKKyAgICBjbGllbnQuZ2V0KCdmdWxsTmFtZScpOyAvLyAnQmV0dHkgSm9uZXMn
CisgIAorICAgIGNsaWVudC5zZXQoJ2xhc3ROYW1lJywgJ0Z1bGxlcicpOworICAgIGNsaWVudC5n
ZXQoJ2Z1bGxOYW1lJyk7IC8vICdCZXR0eSBGdWxsZXInCisgICAgYGBgCisgIAorICAgIFlvdSBj
YW4gcGFzcyBhIGhhc2ggd2l0aCB0d28gZnVuY3Rpb25zLCBgZ2V0YCBhbmQgYHNldGAsIGFzIGFu
CisgICAgYXJndW1lbnQgdG8gcHJvdmlkZSBib3RoIGEgZ2V0dGVyIGFuZCBzZXR0ZXI6CisgIAor
ICAgIGBgYGpzCisgICAgbGV0IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
aW5pdCgpIHsKKyAgICAgICAgdGhpcy5fc3VwZXIoLi4uYXJndW1lbnRzKTsKKyAgCisgICAgICAg
IHRoaXMuZmlyc3ROYW1lID0gJ0JldHR5JzsKKyAgICAgICAgdGhpcy5sYXN0TmFtZSA9ICdKb25l
cyc7CisgICAgICB9LAorICAKKyAgICAgIGZ1bGxOYW1lOiBFbWJlci5jb21wdXRlZCgnZmlyc3RO
YW1lJywgJ2xhc3ROYW1lJywgeworICAgICAgICBnZXQoa2V5KSB7CisgICAgICAgICAgcmV0dXJu
IGAke3RoaXMuZ2V0KCdmaXJzdE5hbWUnKX0gJHt0aGlzLmdldCgnbGFzdE5hbWUnKX1gOworICAg
ICAgICB9LAorICAgICAgICBzZXQoa2V5LCB2YWx1ZSkgeworICAgICAgICAgIGxldCBbZmlyc3RO
YW1lLCBsYXN0TmFtZV0gPSB2YWx1ZS5zcGxpdCgvXHMrLyk7CisgICAgICAgICAgdGhpcy5zZXRQ
cm9wZXJ0aWVzKHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9KTsKKyAgICAgICAgICByZXR1cm4gdmFs
dWU7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pCisgIAorICAgIGxldCBjbGllbnQgPSBQ
ZXJzb24uY3JlYXRlKCk7CisgICAgY2xpZW50LmdldCgnZmlyc3ROYW1lJyk7IC8vICdCZXR0eScK
KyAgCisgICAgY2xpZW50LnNldCgnZnVsbE5hbWUnLCAnQ2Fycm9sbCBGdWxsZXInKTsKKyAgICBj
bGllbnQuZ2V0KCdmaXJzdE5hbWUnKTsgLy8gJ0NhcnJvbGwnCisgICAgYGBgCisgIAorICAgIFRo
ZSBgc2V0YCBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHR3byBwYXJhbWV0ZXJzLCBga2V5YCBhbmQg
YHZhbHVlYC4gVGhlIHZhbHVlCisgICAgcmV0dXJuZWQgZnJvbSBgc2V0YCB3aWxsIGJlIHRoZSBu
ZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAKKyAgICBfTm90ZTogVGhpcyBpcyB0aGUgcHJl
ZmVycmVkIHdheSB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyB3aGVuIHdyaXRpbmcgdGhp
cmQtcGFydHkKKyAgICBsaWJyYXJpZXMgdGhhdCBkZXBlbmQgb24gb3IgdXNlIEVtYmVyLCBzaW5j
ZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgdXNlcgorICAgIHdpbGwgaGF2ZSBbcHJv
dG90eXBlIEV4dGVuc2lvbnNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvY29uZmlndXJpbmct
ZW1iZXIvZGlzYWJsaW5nLXByb3RvdHlwZS1leHRlbnNpb25zLykgZW5hYmxlZC5fCisgIAorICAg
IFRoZSBhbHRlcm5hdGl2ZSBzeW50YXgsIHdpdGggcHJvdG90eXBlIGV4dGVuc2lvbnMsIG1pZ2h0
IGxvb2sgbGlrZToKKyAgCisgICAgYGBganMKKyAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7Cisg
ICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3RO
YW1lJyk7CisgICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKKyAgICBgYGAK
KyAgCisgICAgQGNsYXNzIGNvbXB1dGVkCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBjb25z
dHJ1Y3RvcgorICAgIEBzdGF0aWMKKyAgICBAcGFyYW0ge1N0cmluZ30gW2RlcGVuZGVudEtleXMq
XSBPcHRpb25hbCBkZXBlbmRlbnQga2V5cyB0aGF0IHRyaWdnZXIgdGhpcyBjb21wdXRlZCBwcm9w
ZXJ0eS4KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBm
dW5jdGlvbi4KKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBwcm9wZXJ0eSBk
ZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvbXB1
dGVkKGZ1bmMpIHsKKyAgICB2YXIgYXJnczsKKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4g
MSkgeworICAgICAgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKyAgICAgIGZ1bmMg
PSBhcmdzLnBvcCgpOworICAgIH0KKworICAgIHZhciBjcCA9IG5ldyBDb21wdXRlZFByb3BlcnR5
KGZ1bmMpOworCisgICAgaWYgKGFyZ3MpIHsKKyAgICAgIGNwLnByb3BlcnR5LmFwcGx5KGNwLCBh
cmdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3A7CisgIH0KKworICAvKioKKyAgICBSZXR1cm5z
IHRoZSBjYWNoZWQgdmFsdWUgZm9yIGEgcHJvcGVydHksIGlmIG9uZSBleGlzdHMuCisgICAgVGhp
cyBjYW4gYmUgdXNlZnVsIGZvciBwZWVraW5nIGF0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkCisg
ICAgcHJvcGVydHkgdGhhdCBpcyBnZW5lcmF0ZWQgbGF6aWx5LCB3aXRob3V0IGFjY2lkZW50YWxs
eSBjYXVzaW5nCisgICAgaXQgdG8gYmUgY3JlYXRlZC4KKyAgCisgICAgQG1ldGhvZCBjYWNoZUZv
cgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIHRoZSBvYmplY3Qgd2hv
c2UgcHJvcGVydHkgeW91IHdhbnQgdG8gY2hlY2sKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBjYWNoZWQgdmFsdWUgeW91IHdhbnQKKyAgICAg
IHRvIHJldHVybgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIGNhY2hlZCB2YWx1ZQorICAgIEBw
dWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24gY2FjaGVGb3Iob2JqLCBrZXkpIHsKKyAgICB2YXIgbWV0
YSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIHZhciBjYWNoZSA9IG1ldGEg
JiYgbWV0YS5zb3VyY2UgPT09IG9iaiAmJiBtZXRhLnJlYWRhYmxlQ2FjaGUoKTsKKyAgICB2YXIg
cmV0ID0gY2FjaGUgJiYgY2FjaGVba2V5XTsKKworICAgIGlmIChyZXQgPT09IFVOREVGSU5FRCkg
eworICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQor
CisgIGNhY2hlRm9yLnNldCA9IGZ1bmN0aW9uIChjYWNoZSwga2V5LCB2YWx1ZSkgeworICAgIGlm
ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjYWNoZVtrZXldID0gVU5ERUZJTkVEOwor
ICAgIH0gZWxzZSB7CisgICAgICBjYWNoZVtrZXldID0gdmFsdWU7CisgICAgfQorICB9OworCisg
IGNhY2hlRm9yLmdldCA9IGZ1bmN0aW9uIChjYWNoZSwga2V5KSB7CisgICAgdmFyIHJldCA9IGNh
Y2hlW2tleV07CisgICAgaWYgKHJldCA9PT0gVU5ERUZJTkVEKSB7CisgICAgICByZXR1cm4gdW5k
ZWZpbmVkOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9OworCisgIGNhY2hlRm9yLnJlbW92
ZSA9IGZ1bmN0aW9uIChjYWNoZSwga2V5KSB7CisgICAgY2FjaGVba2V5XSA9IHVuZGVmaW5lZDsK
KyAgfTsKKworICBleHBvcnRzLkNvbXB1dGVkUHJvcGVydHkgPSBDb21wdXRlZFByb3BlcnR5Owor
ICBleHBvcnRzLmNvbXB1dGVkID0gY29tcHV0ZWQ7CisgIGV4cG9ydHMuY2FjaGVGb3IgPSBjYWNo
ZUZvcjsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9jb21wdXRlZF9tYWNyb3MnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1t
ZXRhbC9pc19lbXB0eScsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1ldGFsL2FsaWFz
JywgJ2VtYmVyLW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsSXNfZW1wdHksIF9lbWJl
ck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVy
dGllcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5lbXB0eSA9IGVtcHR5OworICBl
eHBvcnRzLm5vdEVtcHR5ID0gbm90RW1wdHk7CisgIGV4cG9ydHMubm9uZSA9IG5vbmU7CisgIGV4
cG9ydHMubm90ID0gbm90OworICBleHBvcnRzLmJvb2wgPSBib29sOworICBleHBvcnRzLm1hdGNo
ID0gbWF0Y2g7CisgIGV4cG9ydHMuZXF1YWwgPSBlcXVhbDsKKyAgZXhwb3J0cy5ndCA9IGd0Owor
ICBleHBvcnRzLmd0ZSA9IGd0ZTsKKyAgZXhwb3J0cy5sdCA9IGx0OworICBleHBvcnRzLmx0ZSA9
IGx0ZTsKKyAgZXhwb3J0cy5vbmVXYXkgPSBvbmVXYXk7CisgIGV4cG9ydHMucmVhZE9ubHkgPSBy
ZWFkT25seTsKKyAgZXhwb3J0cy5kZXByZWNhdGluZ0FsaWFzID0gZGVwcmVjYXRpbmdBbGlhczsK
KworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLW1ldGFsCisgICov
CisKKyAgZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhzZWxmLCBwcm9wZXJ0eU5hbWVzKSB7CisgICAg
dmFyIHJldCA9IHt9OworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5n
dGg7IGkrKykgeworICAgICAgcmV0W3Byb3BlcnR5TmFtZXNbaV1dID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHNlbGYsIHByb3BlcnR5TmFtZXNbaV0pOworICAgIH0KKyAgICByZXR1cm4g
cmV0OworICB9CisKKyAgZnVuY3Rpb24gZ2VuZXJhdGVDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKG1h
Y3JvKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBleHBhbmRlZFByb3Bl
cnRpZXMgPSBbXTsKKyAgICAgIHZhciBjb21wdXRlZEZ1bmMgPSBfZW1iZXJNZXRhbENvbXB1dGVk
LmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIG1hY3JvLmFwcGx5KHRoaXMs
IFtnZXRQcm9wZXJ0aWVzKHRoaXMsIGV4cGFuZGVkUHJvcGVydGllcyldKTsKKyAgICAgIH0pOwor
CisgICAgICBmdW5jdGlvbiBleHRyYWN0UHJvcGVydHkoZW50cnkpIHsKKyAgICAgICAgZXhwYW5k
ZWRQcm9wZXJ0aWVzLnB1c2goZW50cnkpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBfbGVu
ID0gYXJndW1lbnRzLmxlbmd0aCwgcHJvcGVydGllcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsg
X2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBwcm9wZXJ0aWVzW19rZXldID0gYXJndW1l
bnRzW19rZXldOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRp
ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgX2VtYmVyTWV0YWxFeHBhbmRfcHJvcGVydGllcy5k
ZWZhdWx0KHByb3BlcnRpZXNbaV0sIGV4dHJhY3RQcm9wZXJ0eSk7CisgICAgICB9CisKKyAgICAg
IHJldHVybiBjb21wdXRlZEZ1bmMucHJvcGVydHkuYXBwbHkoY29tcHV0ZWRGdW5jLCBleHBhbmRl
ZFByb3BlcnRpZXMpOworICAgIH07CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50CisgICAg
cHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkg
ZnVuY3Rpb24uCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZh
ciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaXNEb25lOiBFbWJlci5j
b21wdXRlZC5lbXB0eSgndG9kb3MnKQorICAgIH0pOworICAKKyAgICB2YXIgdG9kb0xpc3QgPSBU
b0RvTGlzdC5jcmVhdGUoeworICAgICAgdG9kb3M6IFsnVW5pdCBUZXN0JywgJ0RvY3VtZW50YXRp
b24nLCAnUmVsZWFzZSddCisgICAgfSk7CisgIAorICAgIHRvZG9MaXN0LmdldCgnaXNEb25lJyk7
IC8vIGZhbHNlCisgICAgdG9kb0xpc3QuZ2V0KCd0b2RvcycpLmNsZWFyKCk7CisgICAgdG9kb0xp
c3QuZ2V0KCdpc0RvbmUnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAc2luY2UgMS42LjAK
KyAgICBAbWV0aG9kIGVtcHR5CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7
U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBuZWdhdGUKKyAgICB0aGUgb3JpZ2luYWwgdmFsdWUg
Zm9yIHByb3BlcnR5CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGVtcHR5KGRlcGVu
ZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVu
ZGVudEtleSArICcubGVuZ3RoJywgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsSXNfZW1wdHkuZGVmYXVsdChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgZGVw
ZW5kZW50S2V5KSk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3Bl
cnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50CisgICAg
cHJvcGVydHkgaXMgTk9UIG51bGwsIGFuIGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksIG9yIGVt
cHR5IGZ1bmN0aW9uLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFzU3R1ZmY6IEVt
YmVyLmNvbXB1dGVkLm5vdEVtcHR5KCdiYWNrcGFjaycpCisgICAgfSk7CisgIAorICAgIHZhciBo
YW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoeyBiYWNrcGFjazogWydGb29kJywgJ1NsZWVwaW5nIEJh
ZycsICdUZW50J10gfSk7CisgIAorICAgIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAgICAgICAg
IC8vIHRydWUKKyAgICBoYW1zdGVyLmdldCgnYmFja3BhY2snKS5jbGVhcigpOyAvLyBbXQorICAg
IGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAgICAgICAgIC8vIGZhbHNlCisgICAgYGBgCisgIAor
ICAgIEBtZXRob2Qgbm90RW1wdHkKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVy
dHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgorICAgIG9yaWdpbmFs
IHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBub3QgZW1wdHkuCisgICAgQHB1YmxpYworICAqLworCisg
IGZ1bmN0aW9uIG5vdEVtcHR5KGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRh
bENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSArICcubGVuZ3RoJywgZnVuY3Rpb24gKCkg
eworICAgICAgcmV0dXJuICFfZW1iZXJNZXRhbElzX2VtcHR5LmRlZmF1bHQoX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOworICAgIH0pOworICB9CisKKyAg
LyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFs
dWUgb2YgdGhlIGRlcGVuZGVudAorICAgIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcKKyAgICBhYm91dCB1c2Ug
b2YgPT0sIHdoaWNoIGNhbiBiZSB0ZWNobmljYWxseSBjb25mdXNpbmcuCisgIAorICAgIEV4YW1w
bGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICBpc0h1bmdyeTogRW1iZXIuY29tcHV0ZWQubm9uZSgnZm9vZCcpCisg
ICAgfSk7CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAg
aGFtc3Rlci5nZXQoJ2lzSHVuZ3J5Jyk7IC8vIHRydWUKKyAgICBoYW1zdGVyLnNldCgnZm9vZCcs
ICdCYW5hbmEnKTsKKyAgICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8gZmFsc2UKKyAgICBo
YW1zdGVyLnNldCgnZm9vZCcsIG51bGwpOworICAgIGhhbXN0ZXIuZ2V0KCdpc0h1bmdyeScpOyAv
LyB0cnVlCisgICAgYGBgCisgIAorICAgIEBtZXRob2Qgbm9uZQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKKyAgICByZXR1cm5z
IHRydWUgaWYgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVk
LgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBub25lKGRlcGVuZGVudEtleSkgewor
ICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVu
Y3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKKyAgICB9KTsKKyAg
fQorCisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRoZSBpbnZl
cnNlIGJvb2xlYW4gdmFsdWUKKyAgICBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRoZSBkZXBl
bmRlbnQgcHJvcGVydHkuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAor
ICAgIHZhciBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBpc0Fub255bW91czog
RW1iZXIuY29tcHV0ZWQubm90KCdsb2dnZWRJbicpCisgICAgfSk7CisgIAorICAgIHZhciB1c2Vy
ID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0pOworICAKKyAgICB1c2VyLmdldCgnaXNB
bm9ueW1vdXMnKTsgLy8gdHJ1ZQorICAgIHVzZXIuc2V0KCdsb2dnZWRJbicsIHRydWUpOworICAg
IHVzZXIuZ2V0KCdpc0Fub255bW91cycpOyAvLyBmYWxzZQorICAgIGBgYAorICAKKyAgICBAbWV0
aG9kIG5vdAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQg
cHJvcGVydHkgd2hpY2ggcmV0dXJucworICAgIGludmVyc2Ugb2YgdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBub3QoZGVwZW5k
ZW50S2V5KSB7CisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5k
ZW50S2V5LCBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gIV9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNvbnZlcnRzIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg
cHJvcGVydHkKKyAgICBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBoYXNCYW5h
bmFzOiBFbWJlci5jb21wdXRlZC5ib29sKCdudW1CYW5hbmFzJykKKyAgICB9KTsKKyAgCisgICAg
dmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnaGFz
QmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMCk7Cisg
ICAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UKKyAgICBoYW1zdGVyLnNldCgn
bnVtQmFuYW5hcycsIDEpOworICAgIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIHRydWUK
KyAgICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIG51bGwpOworICAgIGhhbXN0ZXIuZ2V0KCdo
YXNCYW5hbmFzJyk7IC8vIGZhbHNlCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYm9vbAorICAg
IEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Cisg
ICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hp
Y2ggY29udmVydHMKKyAgICB0byBib29sZWFuIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVy
dHkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gYm9vbChkZXBlbmRlbnRLZXkpIHsK
KyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0
aGlzLCBkZXBlbmRlbnRLZXkpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRl
ZCBwcm9wZXJ0eSB3aGljaCBtYXRjaGVzIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlCisgICAg
ZGVwZW5kZW50IHByb3BlcnR5IGFnYWluc3QgYSBnaXZlbiBSZWdFeHAsIHJldHVybmluZyBgdHJ1
ZWAKKyAgICBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgUmVnRXhwIGFuZCBgZmFsc2VgIGlmIGl0
IGRvZXMgbm90LgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2
YXIgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFzVmFsaWRFbWFpbDogRW1i
ZXIuY29tcHV0ZWQubWF0Y2goJ2VtYWlsJywgL14uK0AuK1wuLiskLykKKyAgICB9KTsKKyAgCisg
ICAgdmFyIHVzZXIgPSBVc2VyLmNyZWF0ZSh7bG9nZ2VkSW46IGZhbHNlfSk7CisgIAorICAgIHVz
ZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCisgICAgdXNlci5zZXQoJ2VtYWlsJywg
JycpOworICAgIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCisgICAgdXNlci5z
ZXQoJ2VtYWlsJywgJ2VtYmVyX2hhbXN0ZXJAZXhhbXBsZS5jb20nKTsKKyAgICB1c2VyLmdldCgn
aGFzVmFsaWRFbWFpbCcpOyAvLyB0cnVlCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgbWF0Y2gK
KyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtl
eQorICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleHAKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRl
ZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBtYXRjaAorICAgIHRoZSBvcmlnaW5h
bCB2YWx1ZSBmb3IgcHJvcGVydHkgYWdhaW5zdCBhIGdpdmVuIFJlZ0V4cAorICAgIEBwdWJsaWMK
KyAgKi8KKworICBmdW5jdGlvbiBtYXRjaChkZXBlbmRlbnRLZXksIHJlZ2V4cCkgeworICAgIHJl
dHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24g
KCkgeworICAgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
IGRlcGVuZGVudEtleSk7CisKKyAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcn
ID8gcmVnZXhwLnRlc3QodmFsdWUpIDogZmFsc2U7CisgICAgfSk7CisgIH0KKworICAvKioKKyAg
ICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBk
ZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgIAor
ICAgIEV4YW1wbGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBuYXBUaW1lOiBFbWJlci5jb21wdXRlZC5lcXVhbCgn
c3RhdGUnLCAnc2xlZXB5JykKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVy
LmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnbmFwVGltZScpOyAvLyBmYWxzZQorICAg
IGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdzbGVlcHknKTsKKyAgICBoYW1zdGVyLmdldCgnbmFwVGlt
ZScpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ3N0YXRlJywgJ2h1bmdyeScpOworICAgIGhh
bXN0ZXIuZ2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCisgICAgYGBgCisgIAorICAgIEBtZXRob2Qg
ZXF1YWwKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVu
ZGVudEtleQorICAgIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxPYmplY3R9IHZhbHVlCisgICAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0
dXJucyB0cnVlIGlmCisgICAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBlcXVh
bCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGVx
dWFsKGRlcGVuZGVudEtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgZGVwZW5kZW50S2V5KSA9PT0gdmFsdWU7Cisg
ICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJu
cyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBncmVhdGVy
IHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
aGFzVG9vTWFueUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmd0KCdudW1CYW5hbmFzJywgMTApCisg
ICAgfSk7CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAg
aGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIGZhbHNlCisgICAgaGFtc3Rlci5z
ZXQoJ251bUJhbmFuYXMnLCAzKTsKKyAgICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMn
KTsgLy8gZmFsc2UKKyAgICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDExKTsKKyAgICBoYW1z
dGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBA
bWV0aG9kIGd0CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBk
ZXBlbmRlbnRLZXkKKyAgICBAcGFyYW0ge051bWJlcn0gdmFsdWUKKyAgICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUg
aWYKKyAgICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGdyZWF0ZXIgdGhhbiBn
aXZlbiB2YWx1ZS4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZ3QoZGVwZW5kZW50
S2V5LCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRl
cGVuZGVudEtleSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID4gdmFsdWU7CisgICAgfSk7CisgIH0KKwor
ICAvKioKKyAgICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBw
cm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKKyAgICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwg
dG8gdGhlIHByb3ZpZGVkIHZhbHVlLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgaGFz
VG9vTWFueUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmd0ZSgnbnVtQmFuYW5hcycsIDEwKQorICAg
IH0pOworICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIGhh
bXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0
KCdudW1CYW5hbmFzJywgMyk7CisgICAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7
IC8vIGZhbHNlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAxMCk7CisgICAgaGFtc3Rl
ci5nZXQoJ2hhc1Rvb01hbnlCYW5hbmFzJyk7IC8vIHRydWUKKyAgICBgYGAKKyAgCisgICAgQG1l
dGhvZCBndGUKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRl
cGVuZGVudEtleQorICAgIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZQorICAgIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBp
ZgorICAgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciBvciBlcXVh
bCB0aGVuIGdpdmVuIHZhbHVlLgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBndGUo
ZGVwZW5kZW50S2V5LCB2YWx1ZSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID49IHZhbHVlOworICAgIH0p
OworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1
ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnR5CisgICAgaXMgbGVzcyB0aGFuIHRo
ZSBwcm92aWRlZCB2YWx1ZS4KKyAgCisgICAgRXhhbXBsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIG5lZWRzTW9y
ZUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmx0KCdudW1CYW5hbmFzJywgMykKKyAgICB9KTsKKyAg
CisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdl
dCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFu
YXMnLCAzKTsKKyAgICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQor
ICAgIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMik7CisgICAgaGFtc3Rlci5nZXQoJ25lZWRz
TW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGx0CisgICAg
QGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKKyAg
ICBAcGFyYW0ge051bWJlcn0gdmFsdWUKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl
cnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKKyAgICB0aGUgb3Jp
Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGxlc3MgdGhlbiBnaXZlbiB2YWx1ZS4KKyAgICBA
cHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbHQoZGVwZW5kZW50S2V5LCB2YWx1ZSkgeworICAg
IHJldHVybiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rp
b24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBk
ZXBlbmRlbnRLZXkpIDwgdmFsdWU7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1
dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg
cHJvcGVydHkKKyAgICBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVl
LgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3Rl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgbmVlZHNNb3JlQmFuYW5hczogRW1iZXIu
Y29tcHV0ZWQubHRlKCdudW1CYW5hbmFzJywgMykKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0
ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOworICAKKyAgICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFu
YW5hcycpOyAvLyB0cnVlCisgICAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCA1KTsKKyAgICBo
YW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQorICAgIGhhbXN0ZXIuc2V0
KCdudW1CYW5hbmFzJywgMyk7CisgICAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsg
Ly8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGx0ZQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHBhcmFtIHtOdW1i
ZXJ9IHZhbHVlCisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQg
cHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCisgICAgdGhlIG9yaWdpbmFsIHZhbHVlIGZv
ciBwcm9wZXJ0eSBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gZ2l2ZW4gdmFsdWUuCisgICAgQHB1Ymxp
YworICAqLworCisgIGZ1bmN0aW9uIGx0ZShkZXBlbmRlbnRLZXksIHZhbHVlKSB7CisgICAgcmV0
dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVu
ZGVudEtleSkgPD0gdmFsdWU7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBBIGNvbXB1dGVk
IHByb3BlcnR5IHRoYXQgcGVyZm9ybXMgYSBsb2dpY2FsIGBhbmRgIG9uIHRoZQorICAgIG9yaWdp
bmFsIHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGRlcGVuZGVudCBwcm9wZXJ0aWVzLgorICAKKyAg
ICBZb3UgbWF5IHBhc3MgaW4gbW9yZSB0aGFuIHR3byBwcm9wZXJ0aWVzIGFuZCBldmVuIHVzZQor
ICAgIHByb3BlcnR5IGJyYWNlIGV4cGFuc2lvbi4gIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxs
CisgICAgcmV0dXJucyB0aGUgZmlyc3QgZmFsc3kgdmFsdWUgb3IgbGFzdCB0cnV0aHkgdmFsdWUK
KyAgICBqdXN0IGxpa2UgSmF2YVNjcmlwdCdzIGB8fGAgb3BlcmF0b3IuCisgIAorICAgIEV4YW1w
bGUKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICByZWFkeUZvckNhbXA6IEVtYmVyLmNvbXB1dGVkLmFuZCgnaGFzVGVu
dCcsICdoYXNCYWNrcGFjaycpLAorICAgICAgcmVhZHlGb3JIaWtlOiBFbWJlci5jb21wdXRlZC5h
bmQoJ2hhc1dhbGtpbmdTdGljaycsICdoYXNCYWNrcGFjaycpCisgICAgfSk7CisgIAorICAgIHZh
ciB0b21zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsKKyAgCisgICAgdG9tc3Rlci5nZXQoJ3JlYWR5
Rm9yQ2FtcCcpOyAvLyBmYWxzZQorICAgIHRvbXN0ZXIuc2V0KCdoYXNUZW50JywgdHJ1ZSk7Cisg
ICAgdG9tc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyBmYWxzZQorICAgIHRvbXN0ZXIuc2V0
KCdoYXNCYWNrcGFjaycsIHRydWUpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckNhbXAnKTsg
Ly8gdHJ1ZQorICAgIHRvbXN0ZXIuc2V0KCdoYXNCYWNrcGFjaycsICdZZXMnKTsKKyAgICB0b21z
dGVyLmdldCgncmVhZHlGb3JDYW1wJyk7IC8vICdZZXMnCisgICAgdG9tc3Rlci5zZXQoJ2hhc1dh
bGtpbmdTdGljaycsIG51bGwpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckhpa2UnKTsgLy8g
bnVsbAorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGFuZAorICAgIEBmb3IgRW1iZXIuY29tcHV0
ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zCisgICAg
YSBsb2dpY2FsIGBhbmRgIG9uIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMg
Zm9yIHByb3BlcnRpZXMuCisgICAgQHB1YmxpYworICAqLworICB2YXIgYW5kID0gZ2VuZXJhdGVD
b21wdXRlZFdpdGhQcm9wZXJ0aWVzKGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7CisgICAgdmFyIHZh
bHVlOworICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CisgICAgICB2YWx1ZSA9IHBy
b3BlcnRpZXNba2V5XTsKKyAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkg
JiYgIXZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHZhbHVlOworICB9KTsKKworICBleHBvcnRzLmFuZCA9IGFuZDsKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBwZXJmb3JtcyBhIGxvZ2ljYWwgYG9yYCBvbiB0aGUK
KyAgICBvcmlnaW5hbCB2YWx1ZXMgZm9yIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGll
cy4KKyAgCisgICAgWW91IG1heSBwYXNzIGluIG1vcmUgdGhhbiB0d28gcHJvcGVydGllcyBhbmQg
ZXZlbiB1c2UKKyAgICBwcm9wZXJ0eSBicmFjZSBleHBhbnNpb24uICBUaGUgY29tcHV0ZWQgcHJv
cGVydHkgd2lsbAorICAgIHJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSBvciBsYXN0IGZh
bHN5IHZhbHVlIGp1c3QKKyAgICBsaWtlIEphdmFTY3JpcHQncyBgfHxgIG9wZXJhdG9yLgorICAK
KyAgICBFeGFtcGxlCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoeworICAgICAgcmVhZHlGb3JSYWluOiBFbWJlci5jb21wdXRlZC5v
cignaGFzSmFja2V0JywgJ2hhc1VtYnJlbGxhJyksCisgICAgICByZWFkeUZvckJlYWNoOiBFbWJl
ci5jb21wdXRlZC5vcigne2hhc1N1bnNjcmVlbixoYXNVbWJyZWxsYX0nKQorICAgIH0pOworICAK
KyAgICB2YXIgdG9tc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIHRvbXN0ZXIuZ2V0
KCdyZWFkeUZvclJhaW4nKTsgLy8gdW5kZWZpbmVkCisgICAgdG9tc3Rlci5zZXQoJ2hhc1VtYnJl
bGxhJywgdHJ1ZSk7CisgICAgdG9tc3Rlci5nZXQoJ3JlYWR5Rm9yUmFpbicpOyAvLyB0cnVlCisg
ICAgdG9tc3Rlci5zZXQoJ2hhc0phY2tldCcsICdZZXMnKTsKKyAgICB0b21zdGVyLmdldCgncmVh
ZHlGb3JSYWluJyk7IC8vICdZZXMnCisgICAgdG9tc3Rlci5zZXQoJ2hhc1N1bnNjcmVlbicsICdD
aGVjaycpOworICAgIHRvbXN0ZXIuZ2V0KCdyZWFkeUZvckJlYWNoJyk7IC8vICdDaGVjaycKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBvcgorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBA
cGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHBlcmZvcm1zCisgICAgYSBsb2dpY2Fs
IGBvcmAgb24gdGhlIHZhbHVlcyBvZiBhbGwgdGhlIG9yaWdpbmFsIHZhbHVlcyBmb3IgcHJvcGVy
dGllcy4KKyAgICBAcHVibGljCisgICovCisgIHZhciBvciA9IGdlbmVyYXRlQ29tcHV0ZWRXaXRo
UHJvcGVydGllcyhmdW5jdGlvbiAocHJvcGVydGllcykgeworICAgIHZhciB2YWx1ZTsKKyAgICBm
b3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgeworICAgICAgdmFsdWUgPSBwcm9wZXJ0aWVzW2tl
eV07CisgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlKSB7
CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVl
OworICB9KTsKKworICBleHBvcnRzLm9yID0gb3I7CisgIC8qKgorICAgIENyZWF0ZXMgYSBuZXcg
cHJvcGVydHkgdGhhdCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBwcm9wZXJ0eQorICAgIG9uIGFu
IG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBiZWhhdmUgYXMK
KyAgICB0aG91Z2ggdGhleSB3ZXJlIGNhbGxlZCBvbiB0aGUgb3JpZ2luYWwgcHJvcGVydHkuCisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7CisgICAgICBuYW1lOiAnQWxleCBNYXRjaG5lZXInLAorICAgICAgbm9tZW46IEVtYmVyLmNv
bXB1dGVkLmFsaWFzKCduYW1lJykKKyAgICB9KTsKKyAgCisgICAgdmFyIGFsZXggPSBQZXJzb24u
Y3JlYXRlKCk7CisgIAorICAgIGFsZXguZ2V0KCdub21lbicpOyAvLyAnQWxleCBNYXRjaG5lZXIn
CisgICAgYWxleC5nZXQoJ25hbWUnKTsgIC8vICdBbGV4IE1hdGNobmVlcicKKyAgCisgICAgYWxl
eC5zZXQoJ25vbWVuJywgJ0BtYWNodHknKTsKKyAgICBhbGV4LmdldCgnbmFtZScpOyAgLy8gJ0Bt
YWNodHknCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYWxpYXMKKyAgICBAZm9yIEVtYmVyLmNv
bXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4K
KyAgICBhbGlhcyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5LgorICAgIEBwdWJs
aWMKKyAgKi8KKworICAvKioKKyAgICBXaGVyZSBgY29tcHV0ZWQuYWxpYXNgIGFsaWFzZXMgYGdl
dGAgYW5kIGBzZXRgLCBhbmQgYWxsb3dzIGZvciBiaWRpcmVjdGlvbmFsCisgICAgZGF0YSBmbG93
LCBgY29tcHV0ZWQub25lV2F5YCBvbmx5IHByb3ZpZGVzIGFuIGFsaWFzZWQgYGdldGAuIFRoZSBg
c2V0YCB3aWxsCisgICAgbm90IG11dGF0ZSB0aGUgdXBzdHJlYW0gcHJvcGVydHksIHJhdGhlciBj
YXVzZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkgdG8KKyAgICBiZWNvbWUgdGhlIHZhbHVlIHNldC4g
VGhpcyBjYXVzZXMgdGhlIGRvd25zdHJlYW0gcHJvcGVydHkgdG8gcGVybWFuZW50bHkKKyAgICBk
aXZlcmdlIGZyb20gdGhlIHVwc3RyZWFtIHByb3BlcnR5LgorICAKKyAgICBFeGFtcGxlCisgIAor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgVXNlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgICAgZmlyc3ROYW1lOiBudWxsLAorICAgICAgbGFzdE5hbWU6IG51bGwsCisgICAgICBuaWNr
TmFtZTogRW1iZXIuY29tcHV0ZWQub25lV2F5KCdmaXJzdE5hbWUnKQorICAgIH0pOworICAKKyAg
ICB2YXIgdGVkZHkgPSBVc2VyLmNyZWF0ZSh7CisgICAgICBmaXJzdE5hbWU6ICdUZWRkeScsCisg
ICAgICBsYXN0TmFtZTogICdaZWVubnknCisgICAgfSk7CisgIAorICAgIHRlZGR5LmdldCgnbmlj
a05hbWUnKTsgICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICB0ZWRkeS5zZXQoJ25pY2tOYW1l
JywgJ1RlZGR5QmVhcicpOyAvLyAnVGVkZHlCZWFyJworICAgIHRlZGR5LmdldCgnZmlyc3ROYW1l
Jyk7ICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBvbmVX
YXkKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3Bl
cnR5IHdoaWNoIGNyZWF0ZXMgYQorICAgIG9uZSB3YXkgY29tcHV0ZWQgcHJvcGVydHkgdG8gdGhl
IG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVu
Y3Rpb24gb25lV2F5KGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbEFsaWFz
LmRlZmF1bHQoZGVwZW5kZW50S2V5KS5vbmVXYXkoKTsKKyAgfQorCisgIC8qKgorICAgIFRoaXMg
aXMgYSBtb3JlIHNlbWFudGljYWxseSBtZWFuaW5nZnVsIGFsaWFzIG9mIGBjb21wdXRlZC5vbmVX
YXlgLAorICAgIHdob3NlIG5hbWUgaXMgc29tZXdoYXQgYW1iaWd1b3VzIGFzIHRvIHdoaWNoIGRp
cmVjdGlvbiB0aGUgZGF0YSBmbG93cy4KKyAgCisgICAgQG1ldGhvZCByZWFkcworICAgIEBmb3Ig
RW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY3Jl
YXRlcyBhCisgICAgICBvbmUgd2F5IGNvbXB1dGVkIHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCB2
YWx1ZSBmb3IgcHJvcGVydHkuCisgICAgQHB1YmxpYworICAgKi8KKworICAvKioKKyAgICBXaGVy
ZSBgY29tcHV0ZWQub25lV2F5YCBwcm92aWRlcyBvbmVXYXkgYmluZGluZ3MsIGBjb21wdXRlZC5y
ZWFkT25seWAgcHJvdmlkZXMKKyAgICBhIHJlYWRPbmx5IG9uZSB3YXkgYmluZGluZy4gVmVyeSBv
ZnRlbiB3aGVuIHVzaW5nIGBjb21wdXRlZC5vbmVXYXlgIG9uZSBkb2VzCisgICAgbm90IGFsc28g
d2FudCBjaGFuZ2VzIHRvIHByb3BhZ2F0ZSBiYWNrIHVwLCBhcyB0aGV5IHdpbGwgcmVwbGFjZSB0
aGUgdmFsdWUuCisgIAorICAgIFRoaXMgcHJldmVudHMgdGhlIHJldmVyc2UgZmxvdywgYW5kIGFs
c28gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IG9jY3Vycy4KKyAgCisgICAgRXhhbXBsZQor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFVzZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KHsKKyAgICAgIGZpcnN0TmFtZTogbnVsbCwKKyAgICAgIGxhc3ROYW1lOiBudWxsLAorICAgICAg
bmlja05hbWU6IEVtYmVyLmNvbXB1dGVkLnJlYWRPbmx5KCdmaXJzdE5hbWUnKQorICAgIH0pOwor
ICAKKyAgICB2YXIgdGVkZHkgPSBVc2VyLmNyZWF0ZSh7CisgICAgICBmaXJzdE5hbWU6ICdUZWRk
eScsCisgICAgICBsYXN0TmFtZTogICdaZWVubnknCisgICAgfSk7CisgIAorICAgIHRlZGR5Lmdl
dCgnbmlja05hbWUnKTsgICAgICAgICAgICAgIC8vICdUZWRkeScKKyAgICB0ZWRkeS5zZXQoJ25p
Y2tOYW1lJywgJ1RlZGR5QmVhcicpOyAvLyB0aHJvd3MgRXhjZXB0aW9uCisgICAgLy8gdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCdDYW5ub3QgU2V0OiBuaWNrTmFtZSBvbjogPFVzZXI6ZW1iZXIyNzI4
OD4nICk7YAorICAgIHRlZGR5LmdldCgnZmlyc3ROYW1lJyk7ICAgICAgICAgICAgIC8vICdUZWRk
eScKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZWFkT25seQorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY3JlYXRlcyBhCisg
ICAgb25lIHdheSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHBy
b3BlcnR5LgorICAgIEBzaW5jZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biByZWFkT25seShkZXBlbmRlbnRLZXkpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxBbGlhcy5k
ZWZhdWx0KGRlcGVuZGVudEtleSkucmVhZE9ubHkoKTsKKyAgfQorCisgIC8qKgorICAgIENyZWF0
ZXMgYSBuZXcgcHJvcGVydHkgdGhhdCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBwcm9wZXJ0eQor
ICAgIG9uIGFuIG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAgdGhpcyBwcm9wZXJ0eSBi
ZWhhdmUgYXMKKyAgICB0aG91Z2ggdGhleSB3ZXJlIGNhbGxlZCBvbiB0aGUgb3JpZ2luYWwgcHJv
cGVydHksIGJ1dCBhbHNvCisgICAgcHJpbnQgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgorICAKKyAg
ICBAbWV0aG9kIGRlcHJlY2F0aW5nQWxpYXMKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAg
QHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KKyAgICBhbGlhcyB3
aXRoIGEgZGVwcmVjYXRpb24gdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKyAg
ICBAc2luY2UgMS43LjAKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gZGVwcmVjYXRp
bmdBbGlhcyhkZXBlbmRlbnRLZXksIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXksIHsKKyAgICAgIGdldDogZnVuY3Rpb24gKGtl
eSkgeworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnVXNhZ2Ugb2YgYCcgKyBr
ZXkgKyAnYCBpcyBkZXByZWNhdGVkLCB1c2UgYCcgKyBkZXBlbmRlbnRLZXkgKyAnYCBpbnN0ZWFk
LicsIGZhbHNlLCBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rp
b24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1Vz
YWdlIG9mIGAnICsga2V5ICsgJ2AgaXMgZGVwcmVjYXRlZCwgdXNlIGAnICsgZGVwZW5kZW50S2V5
ICsgJ2AgaW5zdGVhZC4nLCBmYWxzZSwgb3B0aW9ucyk7CisgICAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCBkZXBlbmRlbnRLZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJu
IHZhbHVlOworICAgICAgfQorICAgIH0pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwv
Y29yZScsIFsnZXhwb3J0cycsICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWly
ZSkgeworICAvKmdsb2JhbHMgRW1iZXI6dHJ1ZSxFTlYsRW1iZXJFTlYgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRh
bAorICAqLworCisgIC8qKgorICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCBFbWJlciBt
ZXRob2RzIGFuZCBmdW5jdGlvbnMuIEZ1dHVyZSB2ZXJzaW9ucyBvZgorICAgIEVtYmVyIG1heSBv
dmVyd3JpdGUgdGhpcyBuYW1lc3BhY2UgYW5kIHRoZXJlZm9yZSwgeW91IHNob3VsZCBhdm9pZCBh
ZGRpbmcgYW55CisgICAgbmV3IHByb3BlcnRpZXMuCisgIAorICAgIEF0IHRoZSBoZWFydCBvZiBF
bWJlciBpcyBFbWJlci1SdW50aW1lLCBhIHNldCBvZiBjb3JlIGZ1bmN0aW9ucyB0aGF0IHByb3Zp
ZGUKKyAgICBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5IGFuZCBvYmplY3QgcHJvcGVydHkg
b2JzZXJ2aW5nLiAgRW1iZXItUnVudGltZSBpcworICAgIHNtYWxsIGFuZCBwZXJmb3JtYW5jZS1m
b2N1c2VkIHNvIHlvdSBjYW4gdXNlIGl0IGFsb25nc2lkZSBvdGhlcgorICAgIGNyb3NzLXBsYXRm
b3JtIGxpYnJhcmllcyBzdWNoIGFzIGpRdWVyeS4gRm9yIG1vcmUgZGV0YWlscywgc2VlCisgICAg
W0VtYmVyLVJ1bnRpbWVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9hcGkvbW9kdWxlcy9lbWJlci1ydW50
aW1lLmh0bWwpLgorICAKKyAgICBAY2xhc3MgRW1iZXIKKyAgICBAc3RhdGljCisgICAgQHZlcnNp
b24gMi42LjIKKyAgICBAcHVibGljCisgICovCisKKyAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBl
b2YgRW1iZXIpIHsKKyAgICAvLyBDcmVhdGUgY29yZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2Ug
YW4gaW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNwYWNlIHNvIHRoYXQKKyAgICAvLyBvYmplY3RzIGFz
c2lnbmVkIHRvIGl0IGFyZSBnaXZlbiBhIHNhbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAg
IEVtYmVyID0ge307CisgIH0KKworICAvLyBEZWZhdWx0IGltcG9ydHMsIGV4cG9ydHMgYW5kIGxv
b2t1cCB0byB0aGUgZ2xvYmFsIG9iamVjdDsKKyAgdmFyIGdsb2JhbCA9IG1haW5Db250ZXh0IHx8
IHt9OyAvLyBqc2hpbnQgaWdub3JlOmxpbmUKKyAgRW1iZXIuaW1wb3J0cyA9IEVtYmVyLmltcG9y
dHMgfHwgZ2xvYmFsOworICBFbWJlci5sb29rdXAgPSBFbWJlci5sb29rdXAgfHwgZ2xvYmFsOwor
ICB2YXIgZW1FeHBvcnRzID0gRW1iZXIuZXhwb3J0cyA9IEVtYmVyLmV4cG9ydHMgfHwgZ2xvYmFs
OworCisgIC8vIGFsaWFzZXMgbmVlZGVkIHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3Zpbmcg
dGhlIGdsb2JhbCBjb250ZXh0CisgIGVtRXhwb3J0cy5FbSA9IGVtRXhwb3J0cy5FbWJlciA9IEVt
YmVyOworCisgIC8vIE1ha2Ugc3VyZSB0aGVzZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFs
cmVhZHkgZGVmaW5lZCBvciBub3QKKworICBFbWJlci5pc05hbWVzcGFjZSA9IHRydWU7CisKKyAg
RW1iZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICdFbWJlcic7CisgIH07
CisKKyAgLy8gVGhlIGRlYnVnIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgdG8gZ2xvYmFscyB3aXRo
IGByZXF1aXJlYCB0bworICAvLyBwcmV2ZW50IGJhYmVsLXBsdWdpbi1maWx0ZXItaW1wb3J0cyBm
cm9tIHJlbW92aW5nIHRoZW0uCisgIHZhciBkZWJ1Z01vZHVsZSA9IF9yZXF1aXJlLmRlZmF1bHQo
J2VtYmVyLW1ldGFsL2RlYnVnJyk7CisgIEVtYmVyLmFzc2VydCA9IGRlYnVnTW9kdWxlLmFzc2Vy
dDsKKyAgRW1iZXIud2FybiA9IGRlYnVnTW9kdWxlLndhcm47CisgIEVtYmVyLmRlYnVnID0gZGVi
dWdNb2R1bGUuZGVidWc7CisgIEVtYmVyLmRlcHJlY2F0ZSA9IGRlYnVnTW9kdWxlLmRlcHJlY2F0
ZTsKKyAgRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGRlYnVnTW9kdWxlLmRlcHJlY2F0ZUZ1bmM7Cisg
IEVtYmVyLnJ1bkluRGVidWcgPSBkZWJ1Z01vZHVsZS5ydW5JbkRlYnVnOworCisgIC8qKgorICAg
IFRoZSBzZW1hbnRpYyB2ZXJzaW9uLgorICAKKyAgICBAcHJvcGVydHkgVkVSU0lPTgorICAgIEB0
eXBlIFN0cmluZworICAgIEBkZWZhdWx0ICcyLjYuMicKKyAgICBAc3RhdGljCisgICAgQHB1Ymxp
YworICAqLworICBFbWJlci5WRVJTSU9OID0gJzIuNi4yJzsKKworICAvKioKKyAgICBUaGUgaGFz
aCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgY29uZmln
dXJhdGlvbgorICAgIHNldHRpbmdzLiBUbyBzcGVjaWZ5IHlvdXIgb3duIG9yIG92ZXJyaWRlIGRl
ZmF1bHQgc2V0dGluZ3MsIGFkZCB0aGUKKyAgICBkZXNpcmVkIHByb3BlcnRpZXMgdG8gYSBnbG9i
YWwgaGFzaCBuYW1lZCBgRW1iZXJFTlZgIChvciBgRU5WYCBmb3IKKyAgICBiYWNrd2FyZHMgY29t
cGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgRW1iZXIpLiBUaGUgYEVtYmVyRU5W
YAorICAgIGhhc2ggbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBsb2FkaW5nIEVtYmVyLgorICAKKyAg
ICBAcHJvcGVydHkgRU5WCisgICAgQHR5cGUgT2JqZWN0CisgICAgQHB1YmxpYworICAqLworCisg
IGlmIChFbWJlci5FTlYpIHsKKyAgICAvLyBkbyBub3RoaW5nIGlmIEVtYmVyLkVOViBpcyBhbHJl
YWR5IHNldHVwCisgICAgRW1iZXIuYXNzZXJ0KCdFbWJlci5FTlYgc2hvdWxkIGJlIGFuIG9iamVj
dC4nLCAnb2JqZWN0JyAhPT0gdHlwZW9mIEVtYmVyLkVOVik7CisgIH0gZWxzZSBpZiAoJ3VuZGVm
aW5lZCcgIT09IHR5cGVvZiBFbWJlckVOVikgeworICAgIEVtYmVyLkVOViA9IEVtYmVyRU5WOwor
ICB9IGVsc2UgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgRU5WKSB7CisgICAgRW1iZXIuRU5W
ID0gRU5WOworICB9IGVsc2UgeworICAgIEVtYmVyLkVOViA9IHt9OworICB9CisKKyAgLy8gRU5B
QkxFX0FMTF9GRUFUVVJFUyB3YXMgZG9jdW1lbnRlZCwgYnV0IHlvdSBjYW4ndCBhY3R1YWxseSBl
bmFibGUgbm9uIG9wdGlvbmFsIGZlYXR1cmVzLgorICBpZiAoRW1iZXIuRU5WLkVOQUJMRV9BTExf
RkVBVFVSRVMpIHsKKyAgICBFbWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZFQVRVUkVTID0gRW1i
ZXIuRU5WLkVOQUJMRV9BTExfRkVBVFVSRVM7CisgIH0KKworICBFbWJlci5jb25maWcgPSBFbWJl
ci5jb25maWcgfHwge307CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBCT09UU1RSQVAKKyAgLy8KKworICAvKioK
KyAgICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGFkZCB0byBgQXJyYXlgLCBgRnVu
Y3Rpb25gLCBhbmQgYFN0cmluZ2AKKyAgICBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMsIGEgZmV3
IGV4dHJhIG1ldGhvZHMgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIG1vcmUKKyAgICBmcmllbmRseSBB
UEkuCisgIAorICAgIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgbGVhdmluZyB0aGlzIG9wdGlvbiBz
ZXQgdG8gdHJ1ZSBob3dldmVyLCBpZiB5b3UgbmVlZAorICAgIHRvIHR1cm4gaXQgb2ZmLCB5b3Ug
Y2FuIGFkZCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgIGBFWFRFTkRfUFJPVE9UWVBF
U2AgdG8gYEVtYmVyRU5WYCBhbmQgc2V0IGl0IHRvIGBmYWxzZWAuCisgIAorICAgIE5vdGUsIHdo
ZW4gZGlzYWJsZWQgKHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIEVtYmVyIEFkZG9ucyks
IHlvdSB3aWxsCisgICAgaW5zdGVhZCBoYXZlIHRvIGFjY2VzcyBhbGwgbWV0aG9kcyBhbmQgZnVu
Y3Rpb25zIGZyb20gdGhlIEVtYmVyCisgICAgbmFtZXNwYWNlLgorICAKKyAgICBAcHJvcGVydHkg
RVhURU5EX1BST1RPVFlQRVMKKyAgICBAdHlwZSBCb29sZWFuCisgICAgQGRlZmF1bHQgdHJ1ZQor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcHVibGljCisgICovCisgIEVtYmVyLkVYVEVORF9QUk9UT1RZ
UEVTID0gRW1iZXIuRU5WLkVYVEVORF9QUk9UT1RZUEVTOworCisgIGlmICh0eXBlb2YgRW1iZXIu
RVhURU5EX1BST1RPVFlQRVMgPT09ICd1bmRlZmluZWQnKSB7CisgICAgRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVMgPSB0cnVlOworICB9CisKKyAgLyoqCisgICAgVGhlIGBMT0dfU1RBQ0tUUkFDRV9P
Tl9ERVBSRUNBVElPTmAgcHJvcGVydHksIHdoZW4gdHJ1ZSwgdGVsbHMgRW1iZXIgdG8gbG9nCisg
ICAgYSBmdWxsIHN0YWNrIHRyYWNlIGR1cmluZyBkZXByZWNhdGlvbiB3YXJuaW5ncy4KKyAgCisg
ICAgQHByb3BlcnR5IExPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OCisgICAgQHR5cGUgQm9v
bGVhbgorICAgIEBkZWZhdWx0IHRydWUKKyAgICBAcHVibGljCisgICovCisgIEVtYmVyLkxPR19T
VEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OID0gRW1iZXIuRU5WLkxPR19TVEFDS1RSQUNFX09OX0RF
UFJFQ0FUSU9OICE9PSBmYWxzZTsKKworICAvKioKKyAgICBUaGUgYExPR19WRVJTSU9OYCBwcm9w
ZXJ0eSwgd2hlbiB0cnVlLCB0ZWxscyBFbWJlciB0byBsb2cgdmVyc2lvbnMgb2YgYWxsCisgICAg
ZGVwZW5kZW50IGxpYnJhcmllcyBpbiB1c2UuCisgIAorICAgIEBwcm9wZXJ0eSBMT0dfVkVSU0lP
TgorICAgIEB0eXBlIEJvb2xlYW4KKyAgICBAZGVmYXVsdCB0cnVlCisgICAgQHB1YmxpYworICAq
LworICBFbWJlci5MT0dfVkVSU0lPTiA9IEVtYmVyLkVOVi5MT0dfVkVSU0lPTiA9PT0gZmFsc2Ug
PyBmYWxzZSA6IHRydWU7CisKKyAgLyoqCisgICAgQW4gZW1wdHkgZnVuY3Rpb24gdXNlZnVsIGZv
ciBzb21lIG9wZXJhdGlvbnMuIEFsd2F5cyByZXR1cm5zIGB0aGlzYC4KKyAgCisgICAgQG1ldGhv
ZCBLCisgICAgQHJldHVybiB7T2JqZWN0fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgZnVuY3Rpb24g
SygpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICBleHBvcnRzLksgPSBLOworCisgIEVtYmVy
LksgPSBLOworICAvL1RPRE86IEVTNiBHTE9CQUwgVE9ETworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IEVtYmVyOworfSk7CitlbmlmZWQoImVtYmVyLW1ldGFsL2RlYnVnIiwgWyJleHBvcnRzIl0sIGZ1
bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmdldERlYnVn
RnVuY3Rpb24gPSBnZXREZWJ1Z0Z1bmN0aW9uOworICBleHBvcnRzLnNldERlYnVnRnVuY3Rpb24g
PSBzZXREZWJ1Z0Z1bmN0aW9uOworICBleHBvcnRzLmFzc2VydCA9IGFzc2VydDsKKyAgZXhwb3J0
cy5pbmZvID0gaW5mbzsKKyAgZXhwb3J0cy53YXJuID0gd2FybjsKKyAgZXhwb3J0cy5kZWJ1ZyA9
IGRlYnVnOworICBleHBvcnRzLmRlcHJlY2F0ZSA9IGRlcHJlY2F0ZTsKKyAgZXhwb3J0cy5kZXBy
ZWNhdGVGdW5jID0gZGVwcmVjYXRlRnVuYzsKKyAgZXhwb3J0cy5ydW5JbkRlYnVnID0gcnVuSW5E
ZWJ1ZzsKKyAgZXhwb3J0cy5kZWJ1Z1NlYWwgPSBkZWJ1Z1NlYWw7CisgIHZhciBkZWJ1Z0Z1bmN0
aW9ucyA9IHsKKyAgICBhc3NlcnQ6IGZ1bmN0aW9uICgpIHt9LAorICAgIGluZm86IGZ1bmN0aW9u
ICgpIHt9LAorICAgIHdhcm46IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlYnVnOiBmdW5jdGlvbiAo
KSB7fSwKKyAgICBkZXByZWNhdGU6IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlcHJlY2F0ZUZ1bmM6
IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBh
cmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHJldHVy
biBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CisgICAgfSwKKyAgICBydW5JbkRlYnVnOiBmdW5jdGlv
biAoKSB7fSwKKyAgICBkZWJ1Z1NlYWw6IGZ1bmN0aW9uICgpIHt9CisgIH07CisKKyAgZXhwb3J0
cy5kZWJ1Z0Z1bmN0aW9ucyA9IGRlYnVnRnVuY3Rpb25zOworCisgIGZ1bmN0aW9uIGdldERlYnVn
RnVuY3Rpb24obmFtZSkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9uc1tuYW1lXTsKKyAgfQor
CisgIGZ1bmN0aW9uIHNldERlYnVnRnVuY3Rpb24obmFtZSwgZm4pIHsKKyAgICBkZWJ1Z0Z1bmN0
aW9uc1tuYW1lXSA9IGZuOworICB9CisKKyAgZnVuY3Rpb24gYXNzZXJ0KCkgeworICAgIHJldHVy
biBkZWJ1Z0Z1bmN0aW9ucy5hc3NlcnQuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9
CisKKyAgZnVuY3Rpb24gaW5mbygpIHsKKyAgICByZXR1cm4gZGVidWdGdW5jdGlvbnMuaW5mby5h
cHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiB3YXJuKCkgewor
ICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9ucy53YXJuLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRz
KTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlYnVnKCkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9u
cy5kZWJ1Zy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiBk
ZXByZWNhdGUoKSB7CisgICAgcmV0dXJuIGRlYnVnRnVuY3Rpb25zLmRlcHJlY2F0ZS5hcHBseSh1
bmRlZmluZWQsIGFyZ3VtZW50cyk7CisgIH0KKworICBmdW5jdGlvbiBkZXByZWNhdGVGdW5jKCkg
eworICAgIHJldHVybiBkZWJ1Z0Z1bmN0aW9ucy5kZXByZWNhdGVGdW5jLmFwcGx5KHVuZGVmaW5l
ZCwgYXJndW1lbnRzKTsKKyAgfQorCisgIGZ1bmN0aW9uIHJ1bkluRGVidWcoKSB7CisgICAgcmV0
dXJuIGRlYnVnRnVuY3Rpb25zLnJ1bkluRGVidWcuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMp
OworICB9CisKKyAgZnVuY3Rpb24gZGVidWdTZWFsKCkgeworICAgIHJldHVybiBkZWJ1Z0Z1bmN0
aW9ucy5kZWJ1Z1NlYWwuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItbWV0YWwvZGVwZW5kZW50X2tleXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvd2F0Y2hpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsV2F0Y2hpbmcpIHsK
KyAgJ25vIHVzZSBzdHJpY3QnOworICAvLyBSZW1vdmUgInVzZSBzdHJpY3QiOyBmcm9tIHRyYW5z
cGlsZWQgbW9kdWxlIHVudGlsCisgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xMzgwMzggaXMgZml4ZWQKKworICBleHBvcnRzLmFkZERlcGVuZGVudEtleXMgPSBh
ZGREZXBlbmRlbnRLZXlzOworICBleHBvcnRzLnJlbW92ZURlcGVuZGVudEtleXMgPSByZW1vdmVE
ZXBlbmRlbnRLZXlzOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItbWV0YWwKKyAgKi8KKworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIERFUEVOREVOVCBLRVlTCisgIC8vCisKKyAg
ZnVuY3Rpb24gYWRkRGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAg
ICAvLyB0aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRlcGVuZGVudCBrZXlzLCBzbworICAg
IC8vIGFkZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBrZXlzLgorICAgIHZhciBpZHgsIGxlbiwgZGVw
S2V5OworICAgIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5czsKKyAgICBpZiAoIWRl
cEtleXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGlkeCA9IDAsIGxlbiA9
IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICBkZXBLZXkgPSBkZXBL
ZXlzW2lkeF07CisgICAgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiB0aW1lcyBkZXBLZXkg
ZGVwZW5kcyBvbiBrZXlOYW1lLgorICAgICAgbWV0YS53cml0ZURlcHMoZGVwS2V5LCBrZXlOYW1l
LCAobWV0YS5wZWVrRGVwcyhkZXBLZXksIGtleU5hbWUpIHx8IDApICsgMSk7CisgICAgICAvLyBX
YXRjaCB0aGUgZGVwS2V5CisgICAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLndhdGNoKG9iaiwgZGVw
S2V5LCBtZXRhKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiByZW1vdmVEZXBlbmRlbnRLZXlz
KGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgeworICAgIC8vIHRoZSBkZXNjcmlwdG9yIGhhcyBh
IGxpc3Qgb2YgZGVwZW5kZW50IGtleXMsIHNvCisgICAgLy8gcmVtb3ZlIGFsbCBvZiBpdHMgZGVw
ZW5kZW50IGtleXMuCisgICAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRlbnRLZXlzOworICAg
IHZhciBpZHgsIGxlbiwgZGVwS2V5OworICAgIGlmICghZGVwS2V5cykgeworICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGZvciAoaWR4ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8
IGxlbjsgaWR4KyspIHsKKyAgICAgIGRlcEtleSA9IGRlcEtleXNbaWR4XTsKKyAgICAgIC8vIERl
Y3JlbWVudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9uIGtleU5hbWUuCisg
ICAgICBtZXRhLndyaXRlRGVwcyhkZXBLZXksIGtleU5hbWUsIChtZXRhLnBlZWtEZXBzKGRlcEtl
eSwga2V5TmFtZSkgfHwgMCkgLSAxKTsKKyAgICAgIC8vIFVud2F0Y2ggdGhlIGRlcEtleQorICAg
ICAgX2VtYmVyTWV0YWxXYXRjaGluZy51bndhdGNoKG9iaiwgZGVwS2V5LCBtZXRhKTsKKyAgICB9
CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9kZXByZWNhdGVfcHJvcGVydHknLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0Jywg
J2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0
KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAg
Ki8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZXByZWNhdGVQcm9wZXJ0eSA9IGRl
cHJlY2F0ZVByb3BlcnR5OworCisgIC8qKgorICAgIFVzZWQgaW50ZXJuYWxseSB0byBhbGxvdyBj
aGFuZ2luZyBwcm9wZXJ0aWVzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5LCBhbmQgcHJp
bnQgYSBoZWxwZnVsCisgICAgZGVwcmVjYXRpb24gd2FybmluZy4KKyAgCisgICAgQG1ldGhvZCBk
ZXByZWNhdGVQcm9wZXJ0eQorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0
byBhZGQgdGhlIGRlcHJlY2F0ZWQgcHJvcGVydHkgdG8uCisgICAgQHBhcmFtIHtTdHJpbmd9IGRl
cHJlY2F0ZWRLZXkgVGhlIHByb3BlcnR5IHRvIGFkZCAoYW5kIHByaW50IGRlcHJlY2F0aW9uIHdh
cm5pbmdzIHVwb24gYWNjZXNzaW5nKS4KKyAgICBAcGFyYW0ge1N0cmluZ30gbmV3S2V5IFRoZSBw
cm9wZXJ0eSB0aGF0IHdpbGwgYmUgYWxpYXNlZC4KKyAgICBAcHJpdmF0ZQorICAgIEBzaW5jZSAx
LjcuMAorICAqLworCisgIGZ1bmN0aW9uIGRlcHJlY2F0ZVByb3BlcnR5KG9iamVjdCwgZGVwcmVj
YXRlZEtleSwgbmV3S2V5LCBvcHRpb25zKSB7CisgICAgZnVuY3Rpb24gX2RlcHJlY2F0ZSgpIHsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2FnZSBvZiBgJyArIGRlcHJlY2F0
ZWRLZXkgKyAnYCBpcyBkZXByZWNhdGVkLCB1c2UgYCcgKyBuZXdLZXkgKyAnYCBpbnN0ZWFkLics
IGZhbHNlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2Jq
ZWN0LCBkZXByZWNhdGVkS2V5LCB7CisgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICBl
bnVtZXJhYmxlOiBmYWxzZSwKKyAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAg
IF9kZXByZWNhdGUoKTsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMs
IG5ld0tleSwgdmFsdWUpOworICAgICAgfSwKKyAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAg
ICAgICBfZGVwcmVjYXRlKCk7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgbmV3S2V5KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL2RpY3Rpb25hcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZW1wdHlf
b2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCkgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gbWFrZURpY3Rpb25hcnk7CisK
KyAgLy8gdGhlIGRlbGV0ZSBpcyBtZWFudCB0byBoaW50IGF0IHJ1bnRpbWVzIHRoYXQgdGhpcyBv
YmplY3Qgc2hvdWxkIHJlbWFpbiBpbgorICAvLyBkaWN0aW9uYXJ5IG1vZGUuIFRoaXMgaXMgY2xl
YXJseSBhIHJ1bnRpbWUgc3BlY2lmaWMgaGFjaywgYnV0IGN1cnJlbnRseSBpdAorICAvLyBhcHBl
YXJzIHdvcnRod2hpbGUgaW4gc29tZSB1c2VjYXNlcy4gUGxlYXNlIG5vdGUsIHRoZXNlIGRlbGV0
ZXMgZG8gaW5jcmVhc2UKKyAgLy8gdGhlIGNvc3Qgb2YgY3JlYXRpb24gZHJhbWF0aWNhbGx5IG92
ZXIgYSBwbGFpbiBPYmplY3QuY3JlYXRlLiBBbmQgYXMgdGhpcworICAvLyBvbmx5IG1ha2VzIHNl
bnNlIGZvciBsb25nLWxpdmVkIGRpY3Rpb25hcmllcyB0aGF0IGFyZW4ndCBpbnN0YW50aWF0ZWQg
b2Z0ZW4uCisKKyAgZnVuY3Rpb24gbWFrZURpY3Rpb25hcnkocGFyZW50KSB7CisgICAgdmFyIGRp
Y3Q7CisgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkgeworICAgICAgZGljdCA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRpY3QgPSBP
YmplY3QuY3JlYXRlKHBhcmVudCk7CisgICAgfQorICAgIGRpY3RbJ19kaWN0J10gPSBudWxsOwor
ICAgIGRlbGV0ZSBkaWN0WydfZGljdCddOworICAgIHJldHVybiBkaWN0OworICB9Cit9KTsKK2Vu
aWZlZCgiZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0IiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChl
eHBvcnRzKSB7CisgIC8vIFRoaXMgZXhpc3RzIGJlY2F1c2UgYE9iamVjdC5jcmVhdGUobnVsbClg
IGlzIGFic3VyZGx5IHNsb3cgY29tcGFyZWQKKyAgLy8gdG8gYG5ldyBFbXB0eU9iamVjdCgpYC4g
SW4gZWl0aGVyIGNhc2UsIHlvdSB3YW50IGEgbnVsbCBwcm90b3R5cGUKKyAgLy8gd2hlbiB5b3Un
cmUgdHJlYXRpbmcgdGhlIG9iamVjdCBpbnN0YW5jZXMgYXMgYXJiaXRyYXJ5IGRpY3Rpb25hcmll
cworICAvLyBhbmQgZG9uJ3Qgd2FudCB5b3VyIGtleXMgY29sbGlkaW5nIHdpdGggYnVpbGQtaW4g
bWV0aG9kcyBvbiB0aGUKKyAgLy8gZGVmYXVsdCBvYmplY3QgcHJvdG90eXBlLgorCisgICJ1c2Ug
c3RyaWN0IjsKKworICB2YXIgcHJvdG8gPSBPYmplY3QuY3JlYXRlKG51bGwsIHsKKyAgICAvLyB3
aXRob3V0IHRoaXMsIHdlIHdpbGwgYWx3YXlzIHN0aWxsIGVuZCB1cCB3aXRoIChuZXcKKyAgICAv
LyBFbXB0eU9iamVjdCgpKS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0CisgICAgY29uc3RydWN0b3I6
IHsKKyAgICAgIHZhbHVlOiB1bmRlZmluZWQsCisgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAg
ICAgIHdyaXRhYmxlOiB0cnVlCisgICAgfQorICB9KTsKKworICBmdW5jdGlvbiBFbXB0eU9iamVj
dCgpIHt9CisgIEVtcHR5T2JqZWN0LnByb3RvdHlwZSA9IHByb3RvOworICBleHBvcnRzLmRlZmF1
bHQgPSBFbXB0eU9iamVjdDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcs
IFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbENvcmUpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qCisgICAgRW1iZXIgY2FuIHJ1
biBpbiBtYW55IGRpZmZlcmVudCBlbnZpcm9ubWVudHMsIGluY2x1ZGluZyBlbnZpcm9ubWVudHMg
bGlrZQorICAgIE5vZGUuanMgd2hlcmUgdGhlIERPTSBpcyB1bmF2YWlsYWJsZS4gVGhpcyBvYmpl
Y3Qgc2VydmVzIGFzIGFuIGFic3RyYWN0aW9uCisgICAgb3ZlciB0aGUgYnJvd3NlciBmZWF0dXJl
cyB0aGF0IEVtYmVyIHJlbGllcyBvbiwgc28gdGhhdCBjb2RlIGRvZXMgbm90CisgICAgZXhwbG9k
ZSB3aGVuIHRyeWluZyB0byBib290IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBoYXZl
IHRoZW0uCisgIAorICAgIFRoaXMgaXMgYSBwcml2YXRlIGFic3RyYWN0aW9uLiBJbiB0aGUgZnV0
dXJlLCB3ZSBob3BlIHRoYXQgb3RoZXIKKyAgICBhYnN0cmFjdGlvbnMgKGxpa2UgYExvY2F0aW9u
YCwgYFJlbmRlcmVyYCwgYGRvbS1oZWxwZXJgKSBjYW4gZnVsbHkgYWJzdHJhY3QKKyAgICBvdmVy
IHRoZSBkaWZmZXJlbmNlcyBpbiBlbnZpcm9ubWVudC4KKyAgKi8KKyAgdmFyIGVudmlyb25tZW50
OworCisgIC8vIFRoaXMgY29kZSBhdHRlbXB0cyB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBhbiBl
bnZpcm9ubWVudCB3aXRoIERPTQorICAvLyBieSBzZWFyY2hpbmcgZm9yIHdpbmRvdyBhbmQgZG9j
dW1lbnQuY3JlYXRlRWxlbWVudC4gQW4gZW52aXJvbm1lbnQKKyAgLy8gd2l0aCBET00gbWF5IGRp
c2FibGUgdGhlIERPTSBmdW5jdGlvbmFsaXR5IG9mIEVtYmVyIGV4cGxpY2l0bHkgYnkKKyAgLy8g
ZGVmaW5pbmcgYSBgZGlzYWJsZUJyb3dzZXJFbnZpcm9ubWVudGAgRU5WLgorICB2YXIgaGFzRE9N
ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAn
dW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5l
ZCcgJiYgIV9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVOVi5kaXNhYmxlQnJvd3NlckVudmlyb25t
ZW50OworCisgIGlmIChoYXNET00pIHsKKyAgICBlbnZpcm9ubWVudCA9IHsKKyAgICAgIGhhc0RP
TTogdHJ1ZSwKKyAgICAgIGlzQ2hyb21lOiAhIXdpbmRvdy5jaHJvbWUgJiYgIXdpbmRvdy5vcGVy
YSwKKyAgICAgIGlzRmlyZWZveDogdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVk
JywKKyAgICAgIGlzUGhhbnRvbTogISF3aW5kb3cuY2FsbFBoYW50b20sCisgICAgICBsb2NhdGlv
bjogd2luZG93LmxvY2F0aW9uLAorICAgICAgaGlzdG9yeTogd2luZG93Lmhpc3RvcnksCisgICAg
ICB1c2VyQWdlbnQ6IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LAorICAgICAgZ2xvYmFsOiB3
aW5kb3cKKyAgICB9OworICB9IGVsc2UgeworICAgIGVudmlyb25tZW50ID0geworICAgICAgaGFz
RE9NOiBmYWxzZSwKKyAgICAgIGlzQ2hyb21lOiBmYWxzZSwKKyAgICAgIGlzRmlyZWZveDogZmFs
c2UsCisgICAgICBpc1BoYW50b206IGZhbHNlLAorICAgICAgbG9jYXRpb246IG51bGwsCisgICAg
ICBoaXN0b3J5OiBudWxsLAorICAgICAgdXNlckFnZW50OiAnTHlueCAodGV4dG1vZGUpJywKKyAg
ICAgIGdsb2JhbDogbnVsbAorICAgIH07CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBlbnZp
cm9ubWVudDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9lcnJvcicsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jb3JlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEVtYmVyRXJyb3I7CisKKyAg
dmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXIn
LCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOworCisgIC8qKgorICAgIEEg
c3ViY2xhc3Mgb2YgdGhlIEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0IGZvciB1c2UgaW4gRW1iZXIu
CisgIAorICAgIEBjbGFzcyBFcnJvcgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5k
cyBFcnJvcgorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biBFbWJlckVycm9yKCkgeworICAgIHZhciB0bXAgPSBFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpOworCisgICAgLy8gQWRkcyBhIGBzdGFja2AgcHJvcGVydHkgdG8gdGhlIGdpdmVuIGVycm9y
IG9iamVjdCB0aGF0IHdpbGwgeWllbGQgdGhlCisgICAgLy8gc3RhY2sgdHJhY2UgYXQgdGhlIHRp
bWUgY2FwdHVyZVN0YWNrVHJhY2Ugd2FzIGNhbGxlZC4KKyAgICAvLyBXaGVuIGNvbGxlY3Rpbmcg
dGhlIHN0YWNrIHRyYWNlIGFsbCBmcmFtZXMgYWJvdmUgdGhlIHRvcG1vc3QgY2FsbAorICAgIC8v
IHRvIHRoaXMgZnVuY3Rpb24sIGluY2x1ZGluZyB0aGF0IGNhbGwsIHdpbGwgYmUgbGVmdCBvdXQg
b2YgdGhlCisgICAgLy8gc3RhY2sgdHJhY2UuCisgICAgLy8gVGhpcyBpcyB1c2VmdWwgYmVjYXVz
ZSB3ZSBjYW4gaGlkZSBFbWJlciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgICAgLy8gdGhhdCBh
cmUgbm90IHZlcnkgaGVscGZ1bCBmb3IgdGhlIHVzZXIuCisgICAgaWYgKEVycm9yLmNhcHR1cmVT
dGFja1RyYWNlKSB7CisgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5FcnJvcik7CisgICAgfQorICAgIC8vIFVuZm9ydHVuYXRlbHkgZXJy
b3JzIGFyZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9w
IGluIHRtcGAgZG9lc24ndCB3b3JrLgorICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9y
UHJvcHMubGVuZ3RoOyBpZHgrKykgeworICAgICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1w
W2Vycm9yUHJvcHNbaWR4XV07CisgICAgfQorICB9CisKKyAgRW1iZXJFcnJvci5wcm90b3R5cGUg
PSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0
YWwvZXZlbnRzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFs
L3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMs
IF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxNZXRhX2xpc3RlbmVycykgeworICAnbm8gdXNl
IHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNwaWxlZCBtb2R1
bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEz
ODAzOCBpcyBmaXhlZAorCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItbWV0YWwKKyAgKi8KKyAgZXhwb3J0cy5hY2N1bXVsYXRlTGlzdGVuZXJzID0gYWNjdW11bGF0
ZUxpc3RlbmVyczsKKyAgZXhwb3J0cy5hZGRMaXN0ZW5lciA9IGFkZExpc3RlbmVyOworICBleHBv
cnRzLnJlbW92ZUxpc3RlbmVyID0gcmVtb3ZlTGlzdGVuZXI7CisgIGV4cG9ydHMuc3VzcGVuZExp
c3RlbmVyID0gc3VzcGVuZExpc3RlbmVyOworICBleHBvcnRzLnN1c3BlbmRMaXN0ZW5lcnMgPSBz
dXNwZW5kTGlzdGVuZXJzOworICBleHBvcnRzLndhdGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRz
OworICBleHBvcnRzLnNlbmRFdmVudCA9IHNlbmRFdmVudDsKKyAgZXhwb3J0cy5oYXNMaXN0ZW5l
cnMgPSBoYXNMaXN0ZW5lcnM7CisgIGV4cG9ydHMubGlzdGVuZXJzRm9yID0gbGlzdGVuZXJzRm9y
OworICBleHBvcnRzLm9uID0gb247CisKKyAgLyoKKyAgICBUaGUgZXZlbnQgc3lzdGVtIHVzZXMg
YSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyB0byBzdG9yZSBsaXN0ZW5lcnMgb24gYW4KKyAgICBv
YmplY3QuIFdoZW4gYSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50IGFy
cml2ZXMsIHRoZXNlCisgICAgaGFzaGVzIGFyZSBjb25zdWx0ZWQgdG8gZGV0ZXJtaW5lIHdoaWNo
IHRhcmdldCBhbmQgYWN0aW9uIHBhaXIgdG8gaW52b2tlLgorICAKKyAgICBUaGUgaGFzaGVzIGFy
ZSBzdG9yZWQgaW4gdGhlIG9iamVjdCdzIG1ldGEgaGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgor
ICAKKyAgICAgICAgLy8gT2JqZWN0J3MgbWV0YSBoYXNoCisgICAgICAgIHsKKyAgICAgICAgICBs
aXN0ZW5lcnM6IHsgICAgICAgLy8gdmFyaWFibGUgbmFtZTogYGxpc3RlbmVyU2V0YAorICAgICAg
ICAgICAgImZvbzpjaGFuZ2VkIjogWyAvLyB2YXJpYWJsZSBuYW1lOiBgYWN0aW9uc2AKKyAgICAg
ICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGZsYWdzCisgICAgICAgICAgICBdCisgICAgICAgICAg
fQorICAgICAgICB9CisgIAorICAqLworCisgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHRhcmdl
dCwgbWV0aG9kKSB7CisgICAgdmFyIGluZGV4ID0gLTE7CisgICAgLy8gaGFzaGVzIGFyZSBhZGRl
ZCB0byB0aGUgZW5kIG9mIHRoZSBldmVudCBhcnJheQorICAgIC8vIHNvIGl0IG1ha2VzIHNlbnNl
IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgZW5kCisgICAgLy8gb2YgdGhlIGFycmF5IGFuZCBz
ZWFyY2ggaW4gcmV2ZXJzZQorICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAzOyBpID49
IDA7IGkgLT0gMykgeworICAgICAgaWYgKHRhcmdldCA9PT0gYXJyYXlbaV0gJiYgbWV0aG9kID09
PSBhcnJheVtpICsgMV0pIHsKKyAgICAgICAgaW5kZXggPSBpOworICAgICAgICBicmVhazsKKyAg
ICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworICB9CisKKyAgZnVuY3Rpb24gYWNjdW11
bGF0ZUxpc3RlbmVycyhvYmosIGV2ZW50TmFtZSwgb3RoZXJBY3Rpb25zKSB7CisgICAgdmFyIG1l
dGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAoIW1ldGEpIHsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGFjdGlvbnMgPSBtZXRhLm1hdGNoaW5nTGlzdGVu
ZXJzKGV2ZW50TmFtZSk7CisgICAgdmFyIG5ld0FjdGlvbnMgPSBbXTsKKworICAgIGZvciAodmFy
IGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7CisgICAgICB2YXIgdGFy
Z2V0ID0gYWN0aW9uc1tpXTsKKyAgICAgIHZhciBtZXRob2QgPSBhY3Rpb25zW2kgKyAxXTsKKyAg
ICAgIHZhciBmbGFncyA9IGFjdGlvbnNbaSArIDJdOworICAgICAgdmFyIGFjdGlvbkluZGV4ID0g
aW5kZXhPZihvdGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKKworICAgICAgaWYgKGFjdGlv
bkluZGV4ID09PSAtMSkgeworICAgICAgICBvdGhlckFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhv
ZCwgZmxhZ3MpOworICAgICAgICBuZXdBY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdz
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3QWN0aW9uczsKKyAgfQorCisgIC8q
KgorICAgIEFkZCBhbiBldmVudCBsaXN0ZW5lcgorICAKKyAgICBAbWV0aG9kIGFkZExpc3RlbmVy
CisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0ge1N0cmluZ30gZXZl
bnROYW1lCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldCBBIHRhcmdldCBvYmpl
Y3Qgb3IgYSBmdW5jdGlvbgorICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBm
dW5jdGlvbiBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0
YAorICAgIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBBIGZsYWcgd2hldGhlciBhIGZ1bmN0aW9uIHNo
b3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9u
IGFkZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgb25jZSkgeworICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVzdCBwYXNzIGF0IGxlYXN0IGFuIG9iamVj
dCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5hZGRMaXN0ZW5lcicsICEhb2JqICYmICEhZXZlbnRO
YW1lKTsKKworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdkaWRJbml0QXR0cnMgY2Fs
bGVkIGluICcgKyAob2JqICYmIG9iai50b1N0cmluZyAmJiBvYmoudG9TdHJpbmcoKSkgKyAnLics
IGV2ZW50TmFtZSAhPT0gJ2RpZEluaXRBdHRycycsIHsKKyAgICAgIGlkOiAnZW1iZXItdmlld3Mu
ZGlkLWluaXQtYXR0cnMnLAorICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICB1cmw6ICdodHRw
Oi8vZW1iZXJqcy5jb20vZGVwcmVjYXRpb25zL3YyLngjdG9jX2VtYmVyLWNvbXBvbmVudC1kaWRp
bml0YXR0cnMnCisgICAgfSk7CisKKyAgICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0
eXBlb2YgdGFyZ2V0KSB7CisgICAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgICB0YXJnZXQgPSBu
dWxsOworICAgIH0KKworICAgIHZhciBmbGFncyA9IDA7CisgICAgaWYgKG9uY2UpIHsKKyAgICAg
IGZsYWdzIHw9IF9lbWJlck1ldGFsTWV0YV9saXN0ZW5lcnMuT05DRTsKKyAgICB9CisKKyAgICBf
ZW1iZXJNZXRhbE1ldGEubWV0YShvYmopLmFkZFRvTGlzdGVuZXJzKGV2ZW50TmFtZSwgdGFyZ2V0
LCBtZXRob2QsIGZsYWdzKTsKKworICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRp
ZEFkZExpc3RlbmVyKSB7CisgICAgICBvYmouZGlkQWRkTGlzdGVuZXIoZXZlbnROYW1lLCB0YXJn
ZXQsIG1ldGhvZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgUmVtb3ZlIGFuIGV2ZW50IGxp
c3RlbmVyCisgIAorICAgIEFyZ3VtZW50cyBzaG91bGQgbWF0Y2ggdGhvc2UgcGFzc2VkIHRvIGBF
bWJlci5hZGRMaXN0ZW5lcmAuCisgIAorICAgIEBtZXRob2QgcmVtb3ZlTGlzdGVuZXIKKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUK
KyAgICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0IEEgdGFyZ2V0IG9iamVjdCBvciBh
IGZ1bmN0aW9uCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9u
IG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCisgICAg
QHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG9iaiwgZXZlbnROYW1l
LCB0YXJnZXQsIG1ldGhvZCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVz
dCBwYXNzIGF0IGxlYXN0IGFuIG9iamVjdCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5yZW1vdmVM
aXN0ZW5lcicsICEhb2JqICYmICEhZXZlbnROYW1lKTsKKworICAgIGlmICghbWV0aG9kICYmICdm
dW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAg
ICAgIHRhcmdldCA9IG51bGw7CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2Jq
KS5yZW1vdmVGcm9tTGlzdGVuZXJzKGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2QsIGZ1bmN0aW9u
ICgpIHsKKyAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRpZFJlbW92ZUxpc3Rl
bmVyKSB7CisgICAgICAgIG9iai5kaWRSZW1vdmVMaXN0ZW5lci5hcHBseShvYmosIGFyZ3VtZW50
cyk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBTdXNwZW5kIGxpc3RlbmVy
IGR1cmluZyBjYWxsYmFjay4KKyAgCisgICAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRo
ZSB0YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCisgICAgd2hlbiBpdCBpcyB0YWtpbmcgYW4g
YWN0aW9uIHRoYXQgd291bGQgY2F1c2UgdGhlIGV2ZW50LCBlLmcuCisgICAgYW4gb2JqZWN0IG1p
Z2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB3aGlsZSBpdCBpcworICAg
IHNldHRpbmcgdGhhdCBwcm9wZXJ0eS4KKyAgCisgICAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIK
KyAgICBAZm9yIEVtYmVyCisgIAorICAgIEBwcml2YXRlCisgICAgQHBhcmFtIG9iagorICAgIEBw
YXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFy
Z2V0IEEgdGFyZ2V0IG9iamVjdCBvciBhIGZ1bmN0aW9uCisgICAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUg
Y2FsbGVkIG9uIGB0YXJnZXRgCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgKi8K
KworICBmdW5jdGlvbiBzdXNwZW5kTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0
aG9kLCBjYWxsYmFjaykgeworICAgIHJldHVybiBzdXNwZW5kTGlzdGVuZXJzKG9iaiwgW2V2ZW50
TmFtZV0sIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7CisgIH0KKworICAvKioKKyAgICBTdXNw
ZW5kcyBtdWx0aXBsZSBsaXN0ZW5lcnMgZHVyaW5nIGEgY2FsbGJhY2suCisgIAorICAgIEBtZXRo
b2Qgc3VzcGVuZExpc3RlbmVycworICAgIEBmb3IgRW1iZXIKKyAgCisgICAgQHByaXZhdGUKKyAg
ICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtBcnJheX0gZXZlbnROYW1lcyBBcnJheSBvZiBldmVu
dCBuYW1lcworICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQgQSB0YXJnZXQgb2Jq
ZWN0IG9yIGEgZnVuY3Rpb24KKyAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEg
ZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdl
dGAKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAqLworCisgIGZ1bmN0aW9uIHN1
c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudE5hbWVzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2sp
IHsKKyAgICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Cisg
ICAgICBtZXRob2QgPSB0YXJnZXQ7CisgICAgICB0YXJnZXQgPSBudWxsOworICAgIH0KKyAgICBy
ZXR1cm4gX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKS5zdXNwZW5kTGlzdGVuZXJzKGV2ZW50TmFt
ZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7CisgIH0KKworICAvKioKKyAgICBSZXR1cm4g
YSBsaXN0IG9mIGN1cnJlbnRseSB3YXRjaGVkIGV2ZW50cworICAKKyAgICBAcHJpdmF0ZQorICAg
IEBtZXRob2Qgd2F0Y2hlZEV2ZW50cworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisg
ICovCisKKyAgZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsKKyAgICByZXR1cm4gX2VtYmVy
TWV0YWxNZXRhLm1ldGEob2JqKS53YXRjaGVkRXZlbnRzKCk7CisgIH0KKworICAvKioKKyAgICBT
ZW5kIGFuIGV2ZW50LiBUaGUgZXhlY3V0aW9uIG9mIHN1c3BlbmRlZCBsaXN0ZW5lcnMKKyAgICBp
cyBza2lwcGVkLCBhbmQgb25jZSBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuIEEgbGlzdGVuZXIgd2l0
aG91dAorICAgIGEgdGFyZ2V0IGlzIGV4ZWN1dGVkIG9uIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiBh
biBhcnJheSBvZiBhY3Rpb25zCisgICAgaXMgbm90IHBhc3NlZCwgdGhlIGFjdGlvbnMgc3RvcmVk
IG9uIHRoZSBwYXNzZWQgb2JqZWN0IGFyZSBpbnZva2VkLgorICAKKyAgICBAbWV0aG9kIHNlbmRF
dmVudAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQorICAgIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJz
IGZvciBlYWNoIGxpc3RlbmVyLgorICAgIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgT3B0aW9uYWwg
YXJyYXkgb2YgYWN0aW9ucyAobGlzdGVuZXJzKS4KKyAgICBAcmV0dXJuIHRydWUKKyAgICBAcHVi
bGljCisgICovCisKKyAgZnVuY3Rpb24gc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBwYXJhbXMs
IGFjdGlvbnMpIHsKKyAgICBpZiAoIWFjdGlvbnMpIHsKKyAgICAgIHZhciBtZXRhID0gX2VtYmVy
TWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLm1h
dGNoaW5nTGlzdGVuZXJzKGV2ZW50TmFtZSk7CisgICAgfQorCisgICAgaWYgKCFhY3Rpb25zIHx8
IGFjdGlvbnMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9y
ICh2YXIgaSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKKyAgICAgIC8v
IGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKKyAgICAgIHZhciB0YXJnZXQg
PSBhY3Rpb25zW2ldOworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbnNbaSArIDFdOworICAgICAg
dmFyIGZsYWdzID0gYWN0aW9uc1tpICsgMl07CisKKyAgICAgIGlmICghbWV0aG9kKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGZsYWdzICYgX2VtYmVyTWV0YWxNZXRh
X2xpc3RlbmVycy5TVVNQRU5ERUQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAg
ICBpZiAoZmxhZ3MgJiBfZW1iZXJNZXRhbE1ldGFfbGlzdGVuZXJzLk9OQ0UpIHsKKyAgICAgICAg
cmVtb3ZlTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIH0K
KyAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgIHRhcmdldCA9IG9iajsKKyAgICAgIH0KKyAg
ICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1ldGhvZCkgeworICAgICAgICBpZiAocGFyYW1z
KSB7CisgICAgICAgICAgX2VtYmVyTWV0YWxVdGlscy5hcHBseVN0cih0YXJnZXQsIG1ldGhvZCwg
cGFyYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0YXJnZXRbbWV0aG9kXSgpOwor
ICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFyYW1zKSB7CisgICAgICAg
ICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgcGFyYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICBtZXRob2QuY2FsbCh0YXJnZXQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGhh
c0xpc3RlbmVycworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAgQHBhcmFtIHtT
dHJpbmd9IGV2ZW50TmFtZQorICAqLworCisgIGZ1bmN0aW9uIGhhc0xpc3RlbmVycyhvYmosIGV2
ZW50TmFtZSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7
CisgICAgaWYgKCFtZXRhKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVy
biBtZXRhLm1hdGNoaW5nTGlzdGVuZXJzKGV2ZW50TmFtZSkubGVuZ3RoID4gMDsKKyAgfQorCisg
IC8qKgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBsaXN0ZW5lcnNGb3IKKyAgICBAZm9yIEVt
YmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKKyAgKi8K
KworICBmdW5jdGlvbiBsaXN0ZW5lcnNGb3Iob2JqLCBldmVudE5hbWUpIHsKKyAgICB2YXIgcmV0
ID0gW107CisgICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAg
ICB2YXIgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5tYXRjaGluZ0xpc3RlbmVycyhldmVudE5hbWUp
OworCisgICAgaWYgKCFhY3Rpb25zKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAg
IGZvciAodmFyIGkgPSAwLCBsID0gYWN0aW9ucy5sZW5ndGg7IGkgPCBsOyBpICs9IDMpIHsKKyAg
ICAgIHZhciB0YXJnZXQgPSBhY3Rpb25zW2ldOworICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbnNb
aSArIDFdOworICAgICAgcmV0LnB1c2goW3RhcmdldCwgbWV0aG9kXSk7CisgICAgfQorCisgICAg
cmV0dXJuIHJldDsKKyAgfQorCisgIC8qKgorICAgIERlZmluZSBhIHByb3BlcnR5IGFzIGEgZnVu
Y3Rpb24gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgd2hlbgorICAgIGEgc3BlY2lmaWVkIGV2ZW50
IG9yIGV2ZW50cyBhcmUgdHJpZ2dlcmVkLgorICAKKyAgCisgICAgYGBgIGphdmFzY3JpcHQKKyAg
ICB2YXIgSm9iID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBsb2dDb21wbGV0ZWQ6IEVt
YmVyLm9uKCdjb21wbGV0ZWQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ0pv
YiBjb21wbGV0ZWQhJyk7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICB2YXIgam9iID0gSm9i
LmNyZWF0ZSgpOworICAKKyAgICBFbWJlci5zZW5kRXZlbnQoam9iLCAnY29tcGxldGVkJyk7IC8v
IExvZ3MgJ0pvYiBjb21wbGV0ZWQhJworICAgYGBgCisgIAorICAgIEBtZXRob2Qgb24KKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZXMqCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYworICAgIEByZXR1cm4gZnVuYworICAgIEBwdWJsaWMKKyAgKi8KKworICBm
dW5jdGlvbiBvbigpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJn
cyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAg
YXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICB2YXIgZnVuYyA9IGFy
Z3MucG9wKCk7CisgICAgdmFyIGV2ZW50cyA9IGFyZ3M7CisgICAgZnVuYy5fX2VtYmVyX2xpc3Rl
bnNfXyA9IGV2ZW50czsKKyAgICByZXR1cm4gZnVuYzsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVn
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBleHBhbmRQcm9wZXJ0aWVzOworCisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICB2YXIgU1BM
SVRfUkVHRVggPSAvXHt8XH0vOworICB2YXIgRU5EX1dJVEhfRUFDSF9SRUdFWCA9IC9cLkBlYWNo
JC87CisKKyAgLyoqCisgICAgRXhwYW5kcyBgcGF0dGVybmAsIGludm9raW5nIGBjYWxsYmFja2Ag
Zm9yIGVhY2ggZXhwYW5zaW9uLgorICAKKyAgICBUaGUgb25seSBwYXR0ZXJuIHN1cHBvcnRlZCBp
cyBicmFjZS1leHBhbnNpb24sIGFueXRoaW5nIGVsc2Ugd2lsbCBiZSBwYXNzZWQKKyAgICBvbmNl
IHRvIGBjYWxsYmFja2AgZGlyZWN0bHkuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAgYGBganMK
KyAgICBmdW5jdGlvbiBlY2hvKGFyZyl7IGNvbnNvbGUubG9nKGFyZyk7IH0KKyAgCisgICAgRW1i
ZXIuZXhwYW5kUHJvcGVydGllcygnZm9vLmJhcicsIGVjaG8pOyAgICAgICAgICAgICAgLy89PiAn
Zm9vLmJhcicKKyAgICBFbWJlci5leHBhbmRQcm9wZXJ0aWVzKCd7Zm9vLGJhcn0nLCBlY2hvKTsg
ICAgICAgICAgICAvLz0+ICdmb28nLCAnYmFyJworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMo
J2Zvby57YmFyLGJhen0nLCBlY2hvKTsgICAgICAgIC8vPT4gJ2Zvby5iYXInLCAnZm9vLmJheicK
KyAgICBFbWJlci5leHBhbmRQcm9wZXJ0aWVzKCd7Zm9vLGJhcn0uYmF6JywgZWNobyk7ICAgICAg
ICAvLz0+ICdmb28uYmF6JywgJ2Jhci5iYXonCisgICAgRW1iZXIuZXhwYW5kUHJvcGVydGllcygn
Zm9vLntiYXIsYmF6fS5bXScsIGVjaG8pICAgICAgLy89PiAnZm9vLmJhci5bXScsICdmb28uYmF6
LltdJworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMoJ3tmb28sYmFyfS57c3BhbSxlZ2dzfScs
IGVjaG8pIC8vPT4gJ2Zvby5zcGFtJywgJ2Zvby5lZ2dzJywgJ2Jhci5zcGFtJywgJ2Jhci5lZ2dz
JworICAgIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMoJ3tmb299LmJhci57YmF6fScpICAgICAgICAg
ICAgIC8vPT4gJ2Zvby5iYXIuYmF6JworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGV4cGFuZFBy
b3BlcnRpZXMKKyAgICBAZm9yIEVtYmVyCisgICAgQHByaXZhdGUKKyAgICBAcGFyYW0ge1N0cmlu
Z30gcGF0dGVybiBUaGUgcHJvcGVydHkgcGF0dGVybiB0byBleHBhbmQuCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZS4gIEl0IGlzIGludm9rZWQg
b25jZSBwZXIKKyAgICBleHBhbnNpb24sIGFuZCBpcyBwYXNzZWQgdGhlIGV4cGFuc2lvbi4KKyAg
Ki8KKworICBmdW5jdGlvbiBleHBhbmRQcm9wZXJ0aWVzKHBhdHRlcm4sIGNhbGxiYWNrKSB7Cisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0EgY29tcHV0ZWQgcHJvcGVydHkga2V5IG11c3Qg
YmUgYSBzdHJpbmcnLCB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpOworICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdCcmFjZSBleHBhbmRlZCBwcm9wZXJ0aWVzIGNhbm5vdCBjb250YWlu
IHNwYWNlcywgZS5nLiAidXNlci57Zmlyc3ROYW1lLCBsYXN0TmFtZX0iIHNob3VsZCBiZSAidXNl
ci57Zmlyc3ROYW1lLGxhc3ROYW1lfSInLCBwYXR0ZXJuLmluZGV4T2YoJyAnKSA9PT0gLTEpOwor
CisgICAgdmFyIHBhcnRzID0gcGF0dGVybi5zcGxpdChTUExJVF9SRUdFWCk7CisgICAgdmFyIHBy
b3BlcnRpZXMgPSBbcGFydHNdOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5n
dGg7IGkrKykgeworICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIGlmIChwYXJ0Lmlu
ZGV4T2YoJywnKSA+PSAwKSB7CisgICAgICAgIHByb3BlcnRpZXMgPSBkdXBsaWNhdGVBbmRSZXBs
YWNlKHByb3BlcnRpZXMsIHBhcnQuc3BsaXQoJywnKSwgaSk7CisgICAgICB9CisgICAgfQorCisg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBj
YWxsYmFjayhwcm9wZXJ0aWVzW2ldLmpvaW4oJycpLnJlcGxhY2UoRU5EX1dJVEhfRUFDSF9SRUdF
WCwgJy5bXScpKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkdXBsaWNhdGVBbmRSZXBsYWNl
KHByb3BlcnRpZXMsIGN1cnJlbnRQYXJ0cywgaW5kZXgpIHsKKyAgICB2YXIgYWxsID0gW107CisK
KyAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgICBjdXJy
ZW50UGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkgeworICAgICAgICB2YXIgY3VycmVudCA9
IHByb3BlcnR5LnNsaWNlKDApOworICAgICAgICBjdXJyZW50W2luZGV4XSA9IHBhcnQ7CisgICAg
ICAgIGFsbC5wdXNoKGN1cnJlbnQpOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICByZXR1cm4g
YWxsOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxBc3NpZ24pIHsKKyAgJ3VzZSBzdHJp
Y3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzRW5hYmxlZDsKKworICAvKioKKyAgICBUaGUg
aGFzaCBvZiBlbmFibGVkIENhbmFyeSBmZWF0dXJlcy4gQWRkIHRvIHRoaXMsIGFueSBjYW5hcnkg
ZmVhdHVyZXMKKyAgICBiZWZvcmUgY3JlYXRpbmcgeW91ciBhcHBsaWNhdGlvbi4KKyAgCisgICAg
QWx0ZXJuYXRpdmVseSAoYW5kIHJlY29tbWVuZGVkKSwgeW91IGNhbiBhbHNvIGRlZmluZSBgRW1i
ZXJFTlYuRkVBVFVSRVNgCisgICAgaWYgeW91IG5lZWQgdG8gZW5hYmxlIGZlYXR1cmVzIGZsYWdn
ZWQgYXQgcnVudGltZS4KKyAgCisgICAgQGNsYXNzIEZFQVRVUkVTCisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBzdGF0aWMKKyAgICBAc2luY2UgMS4xLjAKKyAgICBAcHVibGljCisgICovCisg
IHZhciBLTk9XTl9GRUFUVVJFUyA9IHt9O2V4cG9ydHMuS05PV05fRkVBVFVSRVMgPSBLTk9XTl9G
RUFUVVJFUzsKKyAgLy8ganNoaW50IGlnbm9yZTpsaW5lCisgIHZhciBGRUFUVVJFUyA9IF9lbWJl
ck1ldGFsQXNzaWduLmRlZmF1bHQoS05PV05fRkVBVFVSRVMsIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVOVi5GRUFUVVJFUyk7CisKKyAgZXhwb3J0cy5GRUFUVVJFUyA9IEZFQVRVUkVTOworICAv
KioKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIGBmZWF0dXJlYCBpcyBlbmFi
bGVkLiBVc2VkIGJ5IEVtYmVyJ3MKKyAgICBidWlsZCB0b29scyB0byBleGNsdWRlIGV4cGVyaW1l
bnRhbCBmZWF0dXJlcyBmcm9tIGJldGEvc3RhYmxlIGJ1aWxkcy4KKyAgCisgICAgWW91IGNhbiBk
ZWZpbmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIAorICAgICogYEVt
YmVyRU5WLkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFU2AgLSBlbmFibGUgYW55IGZlYXR1cmVzIHRo
YXQgaGF2ZSBub3QgYmVlbiBleHBsaWNpdGx5CisgICAgICBlbmFibGVkL2Rpc2FibGVkLgorICAK
KyAgICBAbWV0aG9kIGlzRW5hYmxlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBmZWF0dXJlIFRoZSBm
ZWF0dXJlIHRvIGNoZWNrCisgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICBAZm9yIEVtYmVyLkZF
QVRVUkVTCisgICAgQHNpbmNlIDEuMS4wCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9u
IGlzRW5hYmxlZChmZWF0dXJlKSB7CisgICAgdmFyIGZlYXR1cmVWYWx1ZSA9IEZFQVRVUkVTW2Zl
YXR1cmVdOworCisgICAgaWYgKGZlYXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFsdWUg
PT09IGZhbHNlIHx8IGZlYXR1cmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4g
ZmVhdHVyZVZhbHVlOworICAgIH0gZWxzZSBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5W
LkVOQUJMRV9PUFRJT05BTF9GRUFUVVJFUykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBl
bHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJl
ci1tZXRhbC9nZXRfcHJvcGVydGllcycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBnZXRQcm9wZXJ0aWVzOworCisg
IC8qKgorICAgIFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYEVtYmVy
LmdldFByb3BlcnRpZXNgCisgICAgd2l0aCBhbiBvYmplY3QgZm9sbG93ZWQgYnkgYSBsaXN0IG9m
IHN0cmluZ3Mgb3IgYW4gYXJyYXk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5n
ZXRQcm9wZXJ0aWVzKHJlY29yZCwgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICd6aXBDb2RlJyk7
CisgICAgLy8geyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAn
MTAwMTEnIH0KKyAgICBgYGAKKyAgCisgICAgaXMgZXF1aXZhbGVudCB0bzoKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEVtYmVyLmdldFByb3BlcnRpZXMocmVjb3JkLCBbJ2ZpcnN0TmFtZScs
ICdsYXN0TmFtZScsICd6aXBDb2RlJ10pOworICAgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxh
c3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9CisgICAgYGBgCisgIAorICAgIEBtZXRo
b2QgZ2V0UHJvcGVydGllcworICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2Jq
CisgICAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKKyAgICBA
cmV0dXJuIHtPYmplY3R9CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGdldFByb3Bl
cnRpZXMob2JqKSB7CisgICAgdmFyIHJldCA9IHt9OworICAgIHZhciBwcm9wZXJ0eU5hbWVzID0g
YXJndW1lbnRzOworICAgIHZhciBpID0gMTsKKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09
PSAyICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzFdKSkgeworICAgICAgaSA9IDA7CisgICAg
ICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFdOworICAgIH0KKyAgICBmb3IgKHZhciBsZW4g
PSBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICByZXRbcHJvcGVy
dHlOYW1lc1tpXV0gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQob2JqLCBwcm9wZXJ0eU5h
bWVzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LW1ldGFsL2luZGV4JywgWydleHBvcnRzJywgJ3JlcXVpcmUnLCAnZW1iZXItbWV0YWwvY29yZScs
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRh
bC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvbWVyZ2UnLCAnZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0
aW9uJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL21ldGEnLCAnZW1iZXItbWV0
YWwvZXJyb3InLCAnZW1iZXItbWV0YWwvY2FjaGUnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9ldmVudHMnLCAnZW1iZXItbWV0
YWwvb2JzZXJ2ZXJfc2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRh
bC9tYXAnLCAnZW1iZXItbWV0YWwvZ2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvc2V0X3By
b3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvd2F0Y2hfa2V5JywgJ2VtYmVyLW1ldGFsL2NoYWlucycs
ICdlbWJlci1tZXRhbC93YXRjaF9wYXRoJywgJ2VtYmVyLW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVy
LW1ldGFsL2V4cGFuZF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVy
LW1ldGFsL2FsaWFzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkX21hY3JvcycsICdlbWJlci1tZXRh
bC9vYnNlcnZlcicsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9iaW5kaW5nJywg
J2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXIt
bWV0YWwvbGlicmFyaWVzJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAnZW1iZXItbWV0YWwvaXNf
ZW1wdHknLCAnZW1iZXItbWV0YWwvaXNfYmxhbmsnLCAnZW1iZXItbWV0YWwvaXNfcHJlc2VudCcs
ICdiYWNrYnVybmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWlyZSwgX2VtYmVyTWV0YWxD
b3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbEFz
c2lnbiwgX2VtYmVyTWV0YWxNZXJnZSwgX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24sIF9lbWJl
ck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0
YWxDYWNoZSwgX2VtYmVyTWV0YWxMb2dnZXIsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbEV2ZW50cywgX2VtYmVyTWV0YWxPYnNlcnZlcl9zZXQsIF9lbWJlck1ldGFsUHJvcGVy
dHlfZXZlbnRzLCBfZW1iZXJNZXRhbFByb3BlcnRpZXMsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0
LCBfZW1iZXJNZXRhbE1hcCwgX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcywgX2VtYmVyTWV0YWxT
ZXRfcHJvcGVydGllcywgX2VtYmVyTWV0YWxXYXRjaF9rZXksIF9lbWJlck1ldGFsQ2hhaW5zLCBf
ZW1iZXJNZXRhbFdhdGNoX3BhdGgsIF9lbWJlck1ldGFsV2F0Y2hpbmcsIF9lbWJlck1ldGFsRXhw
YW5kX3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsQWxpYXMsIF9l
bWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRh
bE1peGluLCBfZW1iZXJNZXRhbEJpbmRpbmcsIF9lbWJlck1ldGFsUGF0aF9jYWNoZSwgX2VtYmVy
TWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxMaWJyYXJpZXMsIF9lbWJlck1ldGFsSXNfbm9uZSwg
X2VtYmVyTWV0YWxJc19lbXB0eSwgX2VtYmVyTWV0YWxJc19ibGFuaywgX2VtYmVyTWV0YWxJc19w
cmVzZW50LCBfYmFja2J1cm5lcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLW1ldGFsCisgICovCisKKyAgLy8gQkVHSU4gSU1QT1JUUworICAndXNlIHN0cmlj
dCc7CisKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5lbXB0eSA9IF9lbWJlck1ldGFs
Q29tcHV0ZWRfbWFjcm9zLmVtcHR5OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLm5v
dEVtcHR5ID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3Mubm90RW1wdHk7CisgIF9lbWJlck1l
dGFsQ29tcHV0ZWQuY29tcHV0ZWQubm9uZSA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLm5v
bmU7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQubm90ID0gX2VtYmVyTWV0YWxDb21w
dXRlZF9tYWNyb3Mubm90OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLmJvb2wgPSBf
ZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5ib29sOworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkLm1hdGNoID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MubWF0Y2g7CisgIF9lbWJl
ck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuZXF1YWwgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jv
cy5lcXVhbDsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5ndCA9IF9lbWJlck1ldGFs
Q29tcHV0ZWRfbWFjcm9zLmd0OworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkLmd0ZSA9
IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmd0ZTsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5j
b21wdXRlZC5sdCA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmx0OworICBfZW1iZXJNZXRh
bENvbXB1dGVkLmNvbXB1dGVkLmx0ZSA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmx0ZTsK
KyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5hbGlhcyA9IF9lbWJlck1ldGFsQWxpYXMu
ZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5vbmVXYXkgPSBfZW1iZXJN
ZXRhbENvbXB1dGVkX21hY3Jvcy5vbmVXYXk7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0
ZWQucmVhZHMgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5vbmVXYXk7CisgIF9lbWJlck1l
dGFsQ29tcHV0ZWQuY29tcHV0ZWQucmVhZE9ubHkgPSBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jv
cy5yZWFkT25seTsKKyAgX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZC5kZWZhdWx0VG8gPSBf
ZW1iZXJNZXRhbENvbXB1dGVkX21hY3Jvcy5kZWZhdWx0VG87CisgIF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQuZGVwcmVjYXRpbmdBbGlhcyA9IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9z
LmRlcHJlY2F0aW5nQWxpYXM7CisgIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuYW5kID0g
X2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MuYW5kOworICBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkLm9yID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3Mub3I7CisgIF9lbWJlck1ldGFs
Q29tcHV0ZWQuY29tcHV0ZWQuYW55ID0gX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MuYW55Owor
CisgIC8vIEVORCBJTVBPUlRTCisKKyAgLy8gQkVHSU4gRVhQT1JUUworICB2YXIgRW1iZXJJbnN0
cnVtZW50YXRpb24gPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5JbnN0cnVtZW50YXRpb24gPSB7
fTsKKyAgRW1iZXJJbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCA9IF9lbWJlck1ldGFsSW5zdHJ1
bWVudGF0aW9uLmluc3RydW1lbnQ7CisgIEVtYmVySW5zdHJ1bWVudGF0aW9uLnN1YnNjcmliZSA9
IF9lbWJlck1ldGFsSW5zdHJ1bWVudGF0aW9uLnN1YnNjcmliZTsKKyAgRW1iZXJJbnN0cnVtZW50
YXRpb24udW5zdWJzY3JpYmUgPSBfZW1iZXJNZXRhbEluc3RydW1lbnRhdGlvbi51bnN1YnNjcmli
ZTsKKyAgRW1iZXJJbnN0cnVtZW50YXRpb24ucmVzZXQgPSBfZW1iZXJNZXRhbEluc3RydW1lbnRh
dGlvbi5yZXNldDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pbnN0cnVtZW50ID0gX2Vt
YmVyTWV0YWxJbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuc3Vic2NyaWJlID0gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlOwor
CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Ll9DYWNoZSA9IF9lbWJlck1ldGFsQ2FjaGUuZGVm
YXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5nZW5lcmF0ZUd1aWQgPSBfZW1iZXJN
ZXRhbFV0aWxzLmdlbmVyYXRlR3VpZDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuR1VJRF9L
RVkgPSBfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5wbGF0Zm9ybSA9IHsKKyAgICBkZWZpbmVQcm9wZXJ0eTogdHJ1ZSwKKyAgICBoYXNQcm9wZXJ0
eUFjY2Vzc29yczogdHJ1ZQorICB9OworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVycm9y
ID0gX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5n
dWlkRm9yID0gX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yOworICBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5NRVRBX0RFU0MgPSBfZW1iZXJNZXRhbE1ldGEuTUVUQV9ERVNDOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5tZXRhID0gX2VtYmVyTWV0YWxNZXRhLm1ldGE7CisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0Lmluc3BlY3QgPSBfZW1iZXJNZXRhbFV0aWxzLmluc3BlY3Q7CisKKyAgX2Vt
YmVyTWV0YWxDb3JlLmRlZmF1bHQudHJ5Q2F0Y2hGaW5hbGx5ID0gX2VtYmVyTWV0YWxVdGlscy5k
ZXByZWNhdGVkVHJ5Q2F0Y2hGaW5hbGx5OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5tYWtl
QXJyYXkgPSBfZW1iZXJNZXRhbFV0aWxzLm1ha2VBcnJheTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuY2FuSW52b2tlID0gX2VtYmVyTWV0YWxVdGlscy5jYW5JbnZva2U7CisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LnRyeUludm9rZSA9IF9lbWJlck1ldGFsVXRpbHMudHJ5SW52b2tlOwor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC53cmFwID0gX2VtYmVyTWV0YWxVdGlscy53cmFwOwor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hcHBseSA9IF9lbWJlck1ldGFsVXRpbHMuYXBwbHk7
CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmFwcGx5U3RyID0gX2VtYmVyTWV0YWxVdGlscy5h
cHBseVN0cjsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudXVpZCA9IF9lbWJlck1ldGFsVXRp
bHMudXVpZDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5Mb2dnZXIgPSBfZW1iZXJNZXRh
bExvZ2dlci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmdldCA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuZ2V0V2l0
aERlZmF1bHQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXRXaXRoRGVmYXVsdDsKKyAgX2Vt
YmVyTWV0YWxDb3JlLmRlZmF1bHQuX2dldFBhdGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5f
Z2V0UGF0aDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vbiA9IF9lbWJlck1ldGFsRXZl
bnRzLm9uOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hZGRMaXN0ZW5lciA9IF9lbWJlck1l
dGFsRXZlbnRzLmFkZExpc3RlbmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5yZW1vdmVM
aXN0ZW5lciA9IF9lbWJlck1ldGFsRXZlbnRzLnJlbW92ZUxpc3RlbmVyOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5fc3VzcGVuZExpc3RlbmVyID0gX2VtYmVyTWV0YWxFdmVudHMuc3VzcGVu
ZExpc3RlbmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fc3VzcGVuZExpc3RlbmVycyA9
IF9lbWJlck1ldGFsRXZlbnRzLnN1c3BlbmRMaXN0ZW5lcnM7CisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LnNlbmRFdmVudCA9IF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudDsKKyAgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaGFzTGlzdGVuZXJzID0gX2VtYmVyTWV0YWxFdmVudHMuaGFzTGlz
dGVuZXJzOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC53YXRjaGVkRXZlbnRzID0gX2VtYmVy
TWV0YWxFdmVudHMud2F0Y2hlZEV2ZW50czsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubGlz
dGVuZXJzRm9yID0gX2VtYmVyTWV0YWxFdmVudHMubGlzdGVuZXJzRm9yOworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5hY2N1bXVsYXRlTGlzdGVuZXJzID0gX2VtYmVyTWV0YWxFdmVudHMuYWNj
dW11bGF0ZUxpc3RlbmVyczsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fT2JzZXJ2ZXJT
ZXQgPSBfZW1iZXJNZXRhbE9ic2VydmVyX3NldC5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LnByb3BlcnR5V2lsbENoYW5nZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRz
LnByb3BlcnR5V2lsbENoYW5nZTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucHJvcGVydHlE
aWRDaGFuZ2UgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZTsK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQub3ZlcnJpZGVDaGFpbnMgPSBfZW1iZXJNZXRhbFBy
b3BlcnR5X2V2ZW50cy5vdmVycmlkZUNoYWluczsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
YmVnaW5Qcm9wZXJ0eUNoYW5nZXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblBy
b3BlcnR5Q2hhbmdlczsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuZW5kUHJvcGVydHlDaGFu
Z2VzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMuZW5kUHJvcGVydHlDaGFuZ2VzOworICBf
ZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5jaGFuZ2VQcm9wZXJ0aWVzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9ldmVudHMuY2hhbmdlUHJvcGVydGllczsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5kZWZpbmVQcm9wZXJ0eSA9IF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eTsK
KworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5zZXQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X3Nl
dC5zZXQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRyeVNldCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnRyeVNldDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5PcmRlcmVkU2V0
ID0gX2VtYmVyTWV0YWxNYXAuT3JkZXJlZFNldDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
TWFwID0gX2VtYmVyTWV0YWxNYXAuTWFwOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NYXBX
aXRoRGVmYXVsdCA9IF9lbWJlck1ldGFsTWFwLk1hcFdpdGhEZWZhdWx0OworCisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LmdldFByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbEdldF9wcm9wZXJ0aWVz
LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnNldFByb3BlcnRpZXMgPSBfZW1i
ZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQud2F0Y2hLZXkgPSBfZW1iZXJNZXRhbFdhdGNoX2tleS53YXRjaEtleTsKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQudW53YXRjaEtleSA9IF9lbWJlck1ldGFsV2F0Y2hfa2V5LnVud2F0Y2hL
ZXk7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucmVtb3ZlQ2hhaW5XYXRjaGVyID0gX2Vt
YmVyTWV0YWxDaGFpbnMucmVtb3ZlQ2hhaW5XYXRjaGVyOworICBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5fQ2hhaW5Ob2RlID0gX2VtYmVyTWV0YWxDaGFpbnMuQ2hhaW5Ob2RlOworICBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5maW5pc2hDaGFpbnMgPSBfZW1iZXJNZXRhbENoYWlucy5maW5pc2hD
aGFpbnM7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQud2F0Y2hQYXRoID0gX2VtYmVyTWV0
YWxXYXRjaF9wYXRoLndhdGNoUGF0aDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudW53YXRj
aFBhdGggPSBfZW1iZXJNZXRhbFdhdGNoX3BhdGgudW53YXRjaFBhdGg7CisKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQud2F0Y2ggPSBfZW1iZXJNZXRhbFdhdGNoaW5nLndhdGNoOworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5pc1dhdGNoaW5nID0gX2VtYmVyTWV0YWxXYXRjaGluZy5pc1dh
dGNoaW5nOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC51bndhdGNoID0gX2VtYmVyTWV0YWxX
YXRjaGluZy51bndhdGNoOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5yZXdhdGNoID0gX2Vt
YmVyTWV0YWxXYXRjaGluZy5yZXdhdGNoOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5kZXN0
cm95ID0gX2VtYmVyTWV0YWxXYXRjaGluZy5kZXN0cm95OworCisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmV4cGFuZFByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbEV4cGFuZF9wcm9wZXJ0aWVzLmRl
ZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQ29tcHV0ZWRQcm9wZXJ0eSA9IF9l
bWJlck1ldGFsQ29tcHV0ZWQuQ29tcHV0ZWRQcm9wZXJ0eTsKKyAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuY29tcHV0ZWQgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkOworICBfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC5jYWNoZUZvciA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY2FjaGVGb3I7
CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuYWRkT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE9i
c2VydmVyLmFkZE9ic2VydmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vYnNlcnZlcnNG
b3IgPSBfZW1iZXJNZXRhbE9ic2VydmVyLm9ic2VydmVyc0ZvcjsKKyAgX2VtYmVyTWV0YWxDb3Jl
LmRlZmF1bHQucmVtb3ZlT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2Vy
dmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5fc3VzcGVuZE9ic2VydmVyID0gX2VtYmVy
TWV0YWxPYnNlcnZlci5fc3VzcGVuZE9ic2VydmVyOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVs
dC5fc3VzcGVuZE9ic2VydmVycyA9IF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNlcnZl
cnM7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSVNfQklORElORyA9IF9lbWJlck1ldGFs
TWl4aW4uSVNfQklORElORzsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucmVxdWlyZWQgPSBf
ZW1iZXJNZXRhbE1peGluLnJlcXVpcmVkOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hbGlh
c01ldGhvZCA9IF9lbWJlck1ldGFsTWl4aW4uYWxpYXNNZXRob2Q7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0Lm9ic2VydmVyID0gX2VtYmVyTWV0YWxNaXhpbi5vYnNlcnZlcjsKKyAgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaW1tZWRpYXRlT2JzZXJ2ZXIgPSBfZW1iZXJNZXRhbE1peGluLl9p
bW1lZGlhdGVPYnNlcnZlcjsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubWl4aW4gPSBfZW1i
ZXJNZXRhbE1peGluLm1peGluOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5NaXhpbiA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW47CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuYmluZCA9
IF9lbWJlck1ldGFsQmluZGluZy5iaW5kOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5CaW5k
aW5nID0gX2VtYmVyTWV0YWxCaW5kaW5nLkJpbmRpbmc7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LmlzR2xvYmFsUGF0aCA9IF9lbWJlck1ldGFsUGF0aF9jYWNoZS5pc0dsb2JhbFBhdGg7CisK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQucnVuID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZh
dWx0OworCisgIC8qKgorICBAY2xhc3MgQmFja2J1cm5lcgorICBAZm9yIEVtYmVyCisgIEBwcml2
YXRlCisgICovCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkJhY2tidXJuZXIgPSBfYmFja2J1
cm5lci5kZWZhdWx0OworICAvLyB0aGlzIGlzIHRoZSBuZXcgZ28gZm9yd2FyZCwgb25jZSBFbWJl
ciBEYXRhIHVwZGF0ZXMgdG8gdXNpbmcgYF9CYWNrYnVybmVyYCB3ZQorICAvLyBjYW4gcmVtb3Zl
IHRoZSBub24tdW5kZXJzY29yZWQgdmVyc2lvbi4KKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
X0JhY2tidXJuZXIgPSBfYmFja2J1cm5lci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmxpYnJhcmllcyA9IG5ldyBfZW1iZXJNZXRhbExpYnJhcmllcy5kZWZhdWx0KCk7Cisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdF
bWJlcicsIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlZFUlNJT04pOworCisgIF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LmlzTm9uZSA9IF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0OworICBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdC5pc0VtcHR5ID0gX2VtYmVyTWV0YWxJc19lbXB0eS5kZWZhdWx0
OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pc0JsYW5rID0gX2VtYmVyTWV0YWxJc19ibGFu
ay5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5pc1ByZXNlbnQgPSBfZW1iZXJN
ZXRhbElzX3ByZXNlbnQuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5hc3Np
Z24gPSBPYmplY3QuYXNzaWduIHx8IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsQ29yZS5kZWZhdWx0Lm1lcmdlID0gX2VtYmVyTWV0YWxNZXJnZS5kZWZhdWx0OworCisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkZFQVRVUkVTID0gX2VtYmVyTWV0YWxGZWF0dXJlcy5G
RUFUVVJFUzsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRkVBVFVSRVMuaXNFbmFibGVkID0g
X2VtYmVyTWV0YWxGZWF0dXJlcy5kZWZhdWx0OworCisgIC8qKgorICAgIEEgZnVuY3Rpb24gbWF5
IGJlIGFzc2lnbmVkIHRvIGBFbWJlci5vbmVycm9yYCB0byBiZSBjYWxsZWQgd2hlbiBFbWJlcgor
ICAgIGludGVybmFscyBlbmNvdW50ZXIgYW4gZXJyb3IuIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVj
aWFsaXplZCBlcnJvciBoYW5kbGluZworICAgIGFuZCByZXBvcnRpbmcgY29kZS4KKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIEVtYmVyLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikgeworICAg
ICAgRW0uJC5hamF4KCcvcmVwb3J0LWVycm9yJywgJ1BPU1QnLCB7CisgICAgICAgIHN0YWNrOiBl
cnJvci5zdGFjaywKKyAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjogJ3doYXRldmVyIGFwcCBzdGF0
ZSB5b3Ugd2FudCB0byBwcm92aWRlJworICAgICAgfSk7CisgICAgfTsKKyAgICBgYGAKKyAgCisg
ICAgSW50ZXJuYWxseSwgYEVtYmVyLm9uZXJyb3JgIGlzIHVzZWQgYXMgQmFja2J1cm5lcidzIGVy
cm9yIGhhbmRsZXIuCisgIAorICAgIEBldmVudCBvbmVycm9yCisgICAgQGZvciBFbWJlcgorICAg
IEBwYXJhbSB7RXhjZXB0aW9ufSBlcnJvciB0aGUgZXJyb3Igb2JqZWN0CisgICAgQHB1YmxpYwor
ICAqLworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5vbmVycm9yID0gbnVsbDsKKyAgLy8gRU5E
IEVYUE9SVFMKKworICAvLyBkbyB0aGlzIGZvciBzaWRlLWVmZmVjdHMgb2YgdXBkYXRpbmcgRW1i
ZXIuYXNzZXJ0LCB3YXJuLCBldGMgd2hlbgorICAvLyBlbWJlci1kZWJ1ZyBpcyBwcmVzZW50Cisg
IC8vIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgZGVwcmVjYXRlRnVuYworICBp
ZiAoX3JlcXVpcmUuaGFzKCdlbWJlci1kZWJ1ZycpKSB7CisgICAgX3JlcXVpcmUuZGVmYXVsdCgn
ZW1iZXItZGVidWcnKTsKKyAgfSBlbHNlIHsKKyAgICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5E
ZWJ1ZyA9IHt9OworICAgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkRlYnVnLnJlZ2lzdGVyRGVw
cmVjYXRpb25IYW5kbGVyID0gZnVuY3Rpb24gKCkge307CisgICAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuRGVidWcucmVnaXN0ZXJXYXJuSGFuZGxlciA9IGZ1bmN0aW9uICgpIHt9OworICB9CisK
KyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuY3JlYXRlID0gX2VtYmVyTWV0YWxEZWJ1Zy5kZXBy
ZWNhdGVGdW5jKCdFbWJlci5jcmVhdGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBPYmplY3Qu
Y3JlYXRlJywgeyBpZDogJ2VtYmVyLW1ldGFsLmVtYmVyLWNyZWF0ZScsIHVudGlsOiAnMy4wLjAn
IH0sIE9iamVjdC5jcmVhdGUpOworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5rZXlzID0gX2Vt
YmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGVGdW5jKCdFbWJlci5rZXlzIGlzIGRlcHJlY2F0ZWQgaW4g
ZmF2b3Igb2YgT2JqZWN0LmtleXMnLCB7IGlkOiAnZW1iZXItbWV0YWwuZW1iZXIua2V5cycsIHVu
dGlsOiAnMy4wLjAnIH0sIE9iamVjdC5rZXlzKTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1i
ZXJNZXRhbENvcmUuZGVmYXVsdDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9pbmplY3RlZF9w
cm9wZXJ0eScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9j
b21wdXRlZCcsICdlbWJlci1tZXRhbC9hbGlhcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywg
J2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1Zywg
X2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyTWV0YWxQcm9wZXJ0
aWVzLCBfY29udGFpbmVyT3duZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIFJl
YWQtb25seSBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBhIGNvbnRhaW5lciBs
b29rdXAuCisgIAorICAgIEBjbGFzcyBJbmplY3RlZFByb3BlcnR5CisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBjb250
YWluZXIgdHlwZSB0aGUgcHJvcGVydHkgd2lsbCBsb29rdXAKKyAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSAob3B0aW9uYWwpIFRoZSBuYW1lIHRoZSBwcm9wZXJ0eSB3aWxsIGxvb2t1cCwgZGVmYXVs
dHMKKyAgICAgICAgICAgdG8gdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEBwcml2YXRlCisgICov
CisgIGZ1bmN0aW9uIEluamVjdGVkUHJvcGVydHkodHlwZSwgbmFtZSkgeworICAgIHRoaXMudHlw
ZSA9IHR5cGU7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKworICAgIHRoaXMuX3N1cGVyJENvbnN0
cnVjdG9yKGluamVjdGVkUHJvcGVydHlHZXQpOworICAgIEFsaWFzZWRQcm9wZXJ0eVByb3RvdHlw
ZS5vbmVXYXkuY2FsbCh0aGlzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluamVjdGVkUHJvcGVydHlH
ZXQoa2V5TmFtZSkgeworICAgIHZhciBkZXNjID0gdGhpc1trZXlOYW1lXTsKKyAgICB2YXIgb3du
ZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykgfHwgdGhpcy5jb250YWluZXI7IC8v
IGZhbGxiYWNrIHRvIGBjb250YWluZXJgIGZvciBiYWNrd2FyZHMgY29tcGF0CisKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnSW5qZWN0ZWRQcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVk
IHdpdGggdGhlIEVtYmVyLmluamVjdCBjb21wdXRlZCBwcm9wZXJ0eSBtYWNyb3MuJywgZGVzYyAm
JiBkZXNjLmlzRGVzY3JpcHRvciAmJiBkZXNjLnR5cGUpOworICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdBdHRlbXB0aW5nIHRvIGxvb2t1cCBhbiBpbmplY3RlZCBwcm9wZXJ0eSBvbiBhbiBv
YmplY3Qgd2l0aG91dCBhIGNvbnRhaW5lciwgZW5zdXJlIHRoYXQgdGhlIG9iamVjdCB3YXMgaW5z
dGFudGlhdGVkIHZpYSBhIGNvbnRhaW5lci4nLCBvd25lcik7CisKKyAgICByZXR1cm4gb3duZXIu
bG9va3VwKGRlc2MudHlwZSArICc6JyArIChkZXNjLm5hbWUgfHwga2V5TmFtZSkpOworICB9CisK
KyAgSW5qZWN0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9lbWJlck1ldGFs
UHJvcGVydGllcy5EZXNjcmlwdG9yLnByb3RvdHlwZSk7CisKKyAgdmFyIEluamVjdGVkUHJvcGVy
dHlQcm90b3R5cGUgPSBJbmplY3RlZFByb3BlcnR5LnByb3RvdHlwZTsKKyAgdmFyIENvbXB1dGVk
UHJvcGVydHlQcm90b3R5cGUgPSBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVkUHJvcGVydHku
cHJvdG90eXBlOworICB2YXIgQWxpYXNlZFByb3BlcnR5UHJvdG90eXBlID0gX2VtYmVyTWV0YWxB
bGlhcy5BbGlhc2VkUHJvcGVydHkucHJvdG90eXBlOworCisgIEluamVjdGVkUHJvcGVydHlQcm90
b3R5cGUuX3N1cGVyJENvbnN0cnVjdG9yID0gX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFBy
b3BlcnR5OworCisgIEluamVjdGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5nZXQ7CisgIEluamVjdGVkUHJvcGVydHlQcm90b3R5cGUucmVhZE9ubHkg
PSBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnJlYWRPbmx5OworCisgIEluamVjdGVkUHJvcGVy
dHlQcm90b3R5cGUudGVhcmRvd24gPSBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnRlYXJkb3du
OworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEluamVjdGVkUHJvcGVydHk7Cit9KTsKK2VuaWZlZCgn
ZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0aW9uJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Nv
cmUnLCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsQ29yZSwgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudDsKKyAgZXhwb3J0cy5faW5zdHJ1bWVudFN0YXJ0
ID0gX2luc3RydW1lbnRTdGFydDsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7Cisg
IGV4cG9ydHMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKKyAgZXhwb3J0cy5yZXNldCA9IHJl
c2V0OworCisgIC8qKgorICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBFbWJlciBJbnN0cnVtZW50YXRp
b24gbW9kdWxlIGlzCisgICAgdG8gcHJvdmlkZSBlZmZpY2llbnQsIGdlbmVyYWwtcHVycG9zZSBp
bnN0cnVtZW50YXRpb24KKyAgICBmb3IgRW1iZXIuCisgIAorICAgIFN1YnNjcmliZSB0byBhIGxp
c3RlbmVyIGJ5IHVzaW5nIGBFbWJlci5zdWJzY3JpYmVgOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgRW1iZXIuc3Vic2NyaWJlKCJyZW5kZXIiLCB7CisgICAgICBiZWZvcmU6IGZ1bmN0aW9u
KG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgeworICAKKyAgICAgIH0sCisgIAorICAgICAgYWZ0
ZXI6IGZ1bmN0aW9uKG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgeworICAKKyAgICAgIH0KKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgSWYgeW91IHJldHVybiBhIHZhbHVlIGZyb20gdGhlIGBi
ZWZvcmVgIGNhbGxiYWNrLCB0aGF0IHNhbWUKKyAgICB2YWx1ZSB3aWxsIGJlIHBhc3NlZCBhcyBh
IGZvdXJ0aCBwYXJhbWV0ZXIgdG8gdGhlIGBhZnRlcmAKKyAgICBjYWxsYmFjay4KKyAgCisgICAg
SW5zdHJ1bWVudCBhIGJsb2NrIG9mIGNvZGUgYnkgdXNpbmcgYEVtYmVyLmluc3RydW1lbnRgOgor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuaW5zdHJ1bWVudCgicmVuZGVyLmhhbmRs
ZWJhcnMiLCBwYXlsb2FkLCBmdW5jdGlvbigpIHsKKyAgICAgIC8vIHJlbmRlcmluZyBsb2dpYwor
ICAgIH0sIGJpbmRpbmcpOworICAgIGBgYAorICAKKyAgICBFdmVudCBuYW1lcyBwYXNzZWQgdG8g
YEVtYmVyLmluc3RydW1lbnRgIGFyZSBuYW1lc3BhY2VkCisgICAgYnkgcGVyaW9kcywgZnJvbSBt
b3JlIGdlbmVyYWwgdG8gbW9yZSBzcGVjaWZpYy4gU3Vic2NyaWJlcnMKKyAgICBjYW4gbGlzdGVu
IGZvciBldmVudHMgYnkgd2hhdGV2ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQorICAgIGFy
ZSBpbnRlcmVzdGVkIGluLgorICAKKyAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50
IGlzIGByZW5kZXIuaGFuZGxlYmFyc2AsCisgICAgYW5kIHRoZSBzdWJzY3JpYmVyIGxpc3RlbmVk
IGZvciBhbGwgZXZlbnRzIGJlZ2lubmluZyB3aXRoCisgICAgYHJlbmRlcmAuIEl0IHdvdWxkIHJl
Y2VpdmUgY2FsbGJhY2tzIGZvciBldmVudHMgbmFtZWQKKyAgICBgcmVuZGVyYCwgYHJlbmRlci5o
YW5kbGViYXJzYCwgYHJlbmRlci5jb250YWluZXJgLCBvcgorICAgIGV2ZW4gYHJlbmRlci5oYW5k
bGViYXJzLmxheW91dGAuCisgIAorICAgIEBjbGFzcyBJbnN0cnVtZW50YXRpb24KKyAgICBAbmFt
ZXNwYWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICovCisgIHZhciBzdWJz
Y3JpYmVycyA9IFtdOworICBleHBvcnRzLnN1YnNjcmliZXJzID0gc3Vic2NyaWJlcnM7CisgIHZh
ciBjYWNoZSA9IHt9OworCisgIHZhciBwb3B1bGF0ZUxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1l
KSB7CisgICAgdmFyIGxpc3RlbmVycyA9IFtdOworICAgIHZhciBzdWJzY3JpYmVyOworCisgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBzdWJzY3JpYmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAg
ICAgIHN1YnNjcmliZXIgPSBzdWJzY3JpYmVyc1tpXTsKKyAgICAgIGlmIChzdWJzY3JpYmVyLnJl
Z2V4LnRlc3QobmFtZSkpIHsKKyAgICAgICAgbGlzdGVuZXJzLnB1c2goc3Vic2NyaWJlci5vYmpl
Y3QpOworICAgICAgfQorICAgIH0KKworICAgIGNhY2hlW25hbWVdID0gbGlzdGVuZXJzOworICAg
IHJldHVybiBsaXN0ZW5lcnM7CisgIH07CisKKyAgdmFyIHRpbWUgPSAoZnVuY3Rpb24gKCkgewor
ICAgIHZhciBwZXJmID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cucGVy
Zm9ybWFuY2UgfHwge30gOiB7fTsKKyAgICB2YXIgZm4gPSBwZXJmLm5vdyB8fCBwZXJmLm1vek5v
dyB8fCBwZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdzsKKyAgICAvLyBm
bi5iaW5kIHdpbGwgYmUgYXZhaWxhYmxlIGluIGFsbCB0aGUgYnJvd3NlcnMgdGhhdCBzdXBwb3J0
IHRoZSBhZHZhbmNlZCB3aW5kb3cucGVyZm9ybWFuY2UuLi4gOy0pCisgICAgcmV0dXJuIGZuID8g
Zm4uYmluZChwZXJmKSA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiArbmV3IERhdGUoKTsK
KyAgICB9OworICB9KSgpOworCisgIC8qKgorICAgIE5vdGlmaWVzIGV2ZW50J3Mgc3Vic2NyaWJl
cnMsIGNhbGxzIGBiZWZvcmVgIGFuZCBgYWZ0ZXJgIGhvb2tzLgorICAKKyAgICBAbWV0aG9kIGlu
c3RydW1lbnQKKyAgICBAbmFtZXNwYWNlIEVtYmVyLkluc3RydW1lbnRhdGlvbgorICAKKyAgICBA
cGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFjZWQgZXZlbnQgbmFtZS4KKyAgICBAcGFyYW0g
e09iamVjdH0gX3BheWxvYWQKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBGdW5jdGlv
biB0aGF0IHlvdSdyZSBpbnN0cnVtZW50aW5nLgorICAgIEBwYXJhbSB7T2JqZWN0fSBiaW5kaW5n
IENvbnRleHQgdGhhdCBpbnN0cnVtZW50IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoLgorICAgIEBw
cml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gaW5zdHJ1bWVudChuYW1lLCBfcGF5bG9hZCwgY2Fs
bGJhY2ssIGJpbmRpbmcpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAzICYmIHR5cGVv
ZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgYmluZGluZyA9IGNhbGxiYWNrOwor
ICAgICAgY2FsbGJhY2sgPSBfcGF5bG9hZDsKKyAgICAgIF9wYXlsb2FkID0gdW5kZWZpbmVkOwor
ICAgIH0KKyAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7CisgICAgICByZXR1cm4g
Y2FsbGJhY2suY2FsbChiaW5kaW5nKTsKKyAgICB9CisgICAgdmFyIHBheWxvYWQgPSBfcGF5bG9h
ZCB8fCB7fTsKKyAgICB2YXIgZmluYWxpemVyID0gX2luc3RydW1lbnRTdGFydChuYW1lLCBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9KTsKKworICAgIGlmIChmaW5h
bGl6ZXIpIHsKKyAgICAgIHJldHVybiB3aXRoRmluYWxpemVyKGNhbGxiYWNrLCBmaW5hbGl6ZXIs
IHBheWxvYWQsIGJpbmRpbmcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FsbGJhY2su
Y2FsbChiaW5kaW5nKTsKKyAgICB9CisgIH0KKworICB2YXIgZmxhZ2dlZEluc3RydW1lbnQ7CisK
KyAgZXhwb3J0cy5mbGFnZ2VkSW5zdHJ1bWVudCA9IGZsYWdnZWRJbnN0cnVtZW50ID0gZnVuY3Rp
b24gKG5hbWUsIHBheWxvYWQsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIGNhbGxiYWNrKCk7Cisg
IH07CisgIGV4cG9ydHMuZmxhZ2dlZEluc3RydW1lbnQgPSBmbGFnZ2VkSW5zdHJ1bWVudDsKKwor
ICBmdW5jdGlvbiB3aXRoRmluYWxpemVyKGNhbGxiYWNrLCBmaW5hbGl6ZXIsIHBheWxvYWQsIGJp
bmRpbmcpIHsKKyAgICB2YXIgcmVzdWx0ID0gdW5kZWZpbmVkOworICAgIHRyeSB7CisgICAgICBy
ZXN1bHQgPSBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
IHBheWxvYWQuZXhjZXB0aW9uID0gZTsKKyAgICAgIHJlc3VsdCA9IHBheWxvYWQ7CisgICAgfSBm
aW5hbGx5IHsKKyAgICAgIGZpbmFsaXplcigpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisgIH0KKworICAvLyBwcml2YXRlIGZvciBub3cKKworICBmdW5jdGlvbiBfaW5zdHJ1bWVudFN0
YXJ0KG5hbWUsIF9wYXlsb2FkKSB7CisgICAgdmFyIGxpc3RlbmVycyA9IGNhY2hlW25hbWVdOwor
CisgICAgaWYgKCFsaXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVycyA9IHBvcHVsYXRlTGlzdGVu
ZXJzKG5hbWUpOworICAgIH0KKworICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7Cisg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHBheWxvYWQgPSBfcGF5bG9hZCgpOworCisg
ICAgdmFyIFNUUlVDVFVSRURfUFJPRklMRSA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlNUUlVD
VFVSRURfUFJPRklMRTsKKyAgICB2YXIgdGltZU5hbWU7CisgICAgaWYgKFNUUlVDVFVSRURfUFJP
RklMRSkgeworICAgICAgdGltZU5hbWUgPSBuYW1lICsgJzogJyArIHBheWxvYWQub2JqZWN0Owor
ICAgICAgY29uc29sZS50aW1lKHRpbWVOYW1lKTsKKyAgICB9CisKKyAgICB2YXIgbCA9IGxpc3Rl
bmVycy5sZW5ndGg7CisgICAgdmFyIGJlZm9yZVZhbHVlcyA9IG5ldyBBcnJheShsKTsKKyAgICB2
YXIgaSwgbGlzdGVuZXI7CisgICAgdmFyIHRpbWVzdGFtcCA9IHRpbWUoKTsKKyAgICBmb3IgKGkg
PSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKyAgICAg
IGJlZm9yZVZhbHVlc1tpXSA9IGxpc3RlbmVyLmJlZm9yZShuYW1lLCB0aW1lc3RhbXAsIHBheWxv
YWQpOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbiBfaW5zdHJ1bWVudEVuZCgpIHsKKyAg
ICAgIHZhciBpLCBsLCBsaXN0ZW5lcjsKKyAgICAgIHZhciB0aW1lc3RhbXAgPSB0aW1lKCk7Cisg
ICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKKyAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5l
ci5hZnRlciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIGxpc3RlbmVyLmFmdGVyKG5hbWUs
IHRpbWVzdGFtcCwgcGF5bG9hZCwgYmVmb3JlVmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgICAg
fQorCisgICAgICBpZiAoU1RSVUNUVVJFRF9QUk9GSUxFKSB7CisgICAgICAgIGNvbnNvbGUudGlt
ZUVuZCh0aW1lTmFtZSk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgIFN1YnNj
cmliZXMgdG8gYSBwYXJ0aWN1bGFyIGV2ZW50IG9yIGluc3RydW1lbnRlZCBibG9jayBvZiBjb2Rl
LgorICAKKyAgICBAbWV0aG9kIHN1YnNjcmliZQorICAgIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1
bWVudGF0aW9uCisgIAorICAgIEBwYXJhbSB7U3RyaW5nfSBbcGF0dGVybl0gTmFtZXNwYWNlZCBl
dmVudCBuYW1lLgorICAgIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBCZWZvcmUgYW5kIEFmdGVy
IGhvb2tzLgorICAKKyAgICBAcmV0dXJuIHtTdWJzY3JpYmVyfQorICAgIEBwcml2YXRlCisgICov
CisKKyAgZnVuY3Rpb24gc3Vic2NyaWJlKHBhdHRlcm4sIG9iamVjdCkgeworICAgIHZhciBwYXRo
cyA9IHBhdHRlcm4uc3BsaXQoJy4nKTsKKyAgICB2YXIgcGF0aDsKKyAgICB2YXIgcmVnZXggPSBb
XTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICBwYXRoID0gcGF0aHNbaV07CisgICAgICBpZiAocGF0aCA9PT0gJyonKSB7CisgICAg
ICAgIHJlZ2V4LnB1c2goJ1teXFwuXSonKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlZ2V4
LnB1c2gocGF0aCk7CisgICAgICB9CisgICAgfQorCisgICAgcmVnZXggPSByZWdleC5qb2luKCdc
XC4nKTsKKyAgICByZWdleCA9IHJlZ2V4ICsgJyhcXC4uKik/JzsKKworICAgIHZhciBzdWJzY3Jp
YmVyID0geworICAgICAgcGF0dGVybjogcGF0dGVybiwKKyAgICAgIHJlZ2V4OiBuZXcgUmVnRXhw
KCdeJyArIHJlZ2V4ICsgJyQnKSwKKyAgICAgIG9iamVjdDogb2JqZWN0CisgICAgfTsKKworICAg
IHN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7CisgICAgY2FjaGUgPSB7fTsKKworICAgIHJl
dHVybiBzdWJzY3JpYmVyOworICB9CisKKyAgLyoqCisgICAgVW5zdWJzY3JpYmVzIGZyb20gYSBw
YXJ0aWN1bGFyIGV2ZW50IG9yIGluc3RydW1lbnRlZCBibG9jayBvZiBjb2RlLgorICAKKyAgICBA
bWV0aG9kIHVuc3Vic2NyaWJlCisgICAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24K
KyAgCisgICAgQHBhcmFtIHtPYmplY3R9IFtzdWJzY3JpYmVyXQorICAgIEBwcml2YXRlCisgICov
CisKKyAgZnVuY3Rpb24gdW5zdWJzY3JpYmUoc3Vic2NyaWJlcikgeworICAgIHZhciBpbmRleDsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3Vic2NyaWJlcnMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICBpZiAoc3Vic2NyaWJlcnNbaV0gPT09IHN1YnNjcmliZXIpIHsKKyAgICAgICAg
aW5kZXggPSBpOworICAgICAgfQorICAgIH0KKworICAgIHN1YnNjcmliZXJzLnNwbGljZShpbmRl
eCwgMSk7CisgICAgY2FjaGUgPSB7fTsKKyAgfQorCisgIC8qKgorICAgIFJlc2V0cyBgRW1iZXIu
SW5zdHJ1bWVudGF0aW9uYCBieSBmbHVzaGluZyBsaXN0IG9mIHN1YnNjcmliZXJzLgorICAKKyAg
ICBAbWV0aG9kIHJlc2V0CisgICAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24KKyAg
ICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlc2V0KCkgeworICAgIHN1YnNjcmliZXJz
Lmxlbmd0aCA9IDA7CisgICAgY2FjaGUgPSB7fTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1l
dGFsL2lzX2JsYW5rJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2lzX2VtcHR5J10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbElzX2VtcHR5KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBpc0JsYW5rOworCisgIC8qKgorICAgIEEgdmFsdWUgaXMgYmxh
bmsgaWYgaXQgaXMgZW1wdHkgb3IgYSB3aGl0ZXNwYWNlIHN0cmluZy4KKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEVtYmVyLmlzQmxhbmsoKTsgICAgICAgICAgICAgICAgLy8gdHJ1ZQorICAg
IEVtYmVyLmlzQmxhbmsobnVsbCk7ICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxh
bmsodW5kZWZpbmVkKTsgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoJycpOyAgICAg
ICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoW10pOyAgICAgICAgICAgICAgLy8g
dHJ1ZQorICAgIEVtYmVyLmlzQmxhbmsoJ1xuXHQnKTsgICAgICAgICAgLy8gdHJ1ZQorICAgIEVt
YmVyLmlzQmxhbmsoJyAgJyk7ICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzQmxhbmso
e30pOyAgICAgICAgICAgICAgLy8gZmFsc2UKKyAgICBFbWJlci5pc0JsYW5rKCdcblx0IEhlbGxv
Jyk7ICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNCbGFuaygnSGVsbG8gd29ybGQnKTsgICAvLyBm
YWxzZQorICAgIEVtYmVyLmlzQmxhbmsoWzEsMiwzXSk7ICAgICAgICAgLy8gZmFsc2UKKyAgICBg
YGAKKyAgCisgICAgQG1ldGhvZCBpc0JsYW5rCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7
T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgQHNp
bmNlIDEuNS4wCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGlzQmxhbmsob2JqKSB7
CisgICAgcmV0dXJuIF9lbWJlck1ldGFsSXNfZW1wdHkuZGVmYXVsdChvYmopIHx8IHR5cGVvZiBv
YmogPT09ICdzdHJpbmcnICYmIG9iai5tYXRjaCgvXFMvKSA9PT0gbnVsbDsKKyAgfQorfSk7Citl
bmlmZWQoJ2VtYmVyLW1ldGFsL2lzX2VtcHR5JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3By
b3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxJc19ub25lKSB7CisgICd1c2Ugc3Ry
aWN0JzsKKworICAvKioKKyAgICBWZXJpZmllcyB0aGF0IGEgdmFsdWUgaXMgYG51bGxgIG9yIGFu
IGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksCisgICAgb3IgZW1wdHkgZnVuY3Rpb24uCisgIAor
ICAgIENvbnN0cmFpbnMgdGhlIHJ1bGVzIG9uIGBFbWJlci5pc05vbmVgIGJ5IHJldHVybmluZyB0
cnVlIGZvciBlbXB0eQorICAgIHN0cmluZyBhbmQgZW1wdHkgYXJyYXlzLgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIuaXNFbXB0eSgpOyAgICAgICAgICAgICAgICAvLyB0cnVlCisg
ICAgRW1iZXIuaXNFbXB0eShudWxsKTsgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNF
bXB0eSh1bmRlZmluZWQpOyAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eSgnJyk7ICAg
ICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eShbXSk7ICAgICAgICAgICAgICAv
LyB0cnVlCisgICAgRW1iZXIuaXNFbXB0eSh7fSk7ICAgICAgICAgICAgICAvLyBmYWxzZQorICAg
IEVtYmVyLmlzRW1wdHkoJ0FkYW0gSGF3a2lucycpOyAgLy8gZmFsc2UKKyAgICBFbWJlci5pc0Vt
cHR5KFswLDEsMl0pOyAgICAgICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNFbXB0eSgnXG5cdCcp
OyAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzRW1wdHkoJyAgJyk7ICAgICAgICAgICAg
Ly8gZmFsc2UKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBpc0VtcHR5CisgICAgQGZvciBFbWJl
cgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVmFsdWUgdG8gdGVzdAorICAgIEByZXR1cm4ge0Jv
b2xlYW59CisgICAgQHB1YmxpYworICAqLworICBmdW5jdGlvbiBpc0VtcHR5KG9iaikgeworICAg
IHZhciBub25lID0gX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQob2JqKTsKKyAgICBpZiAobm9u
ZSkgeworICAgICAgcmV0dXJuIG5vbmU7CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBvYmouc2l6
ZSA9PT0gJ251bWJlcicpIHsKKyAgICAgIHJldHVybiAhb2JqLnNpemU7CisgICAgfQorCisgICAg
dmFyIG9iamVjdFR5cGUgPSB0eXBlb2Ygb2JqOworCisgICAgaWYgKG9iamVjdFR5cGUgPT09ICdv
YmplY3QnKSB7CisgICAgICB2YXIgc2l6ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChv
YmosICdzaXplJyk7CisgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7CisgICAg
ICAgIHJldHVybiAhc2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHlwZW9mIG9iai5s
ZW5ndGggPT09ICdudW1iZXInICYmIG9iamVjdFR5cGUgIT09ICdmdW5jdGlvbicpIHsKKyAgICAg
IHJldHVybiAhb2JqLmxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0VHlwZSA9PT0gJ29i
amVjdCcpIHsKKyAgICAgIHZhciBsZW5ndGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
b2JqLCAnbGVuZ3RoJyk7CisgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHsK
KyAgICAgICAgcmV0dXJuICFsZW5ndGg7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaXNFbXB0eTsKK30pOworZW5pZmVkKCJl
bWJlci1tZXRhbC9pc19ub25lIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
IC8qKgorICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgb3IgdW5k
ZWZpbmVkLiBUaGlzIGF2b2lkcyBlcnJvcnMKKyAgICBmcm9tIEpTTGludCBjb21wbGFpbmluZyBh
Ym91dCB1c2Ugb2YgPT0sIHdoaWNoIGNhbiBiZSB0ZWNobmljYWxseQorICAgIGNvbmZ1c2luZy4K
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmlzTm9uZSgpOyAgICAgICAgICAgICAg
Ly8gdHJ1ZQorICAgIEVtYmVyLmlzTm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQorICAgIEVt
YmVyLmlzTm9uZSh1bmRlZmluZWQpOyAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzTm9uZSgnJyk7
ICAgICAgICAgICAgLy8gZmFsc2UKKyAgICBFbWJlci5pc05vbmUoW10pOyAgICAgICAgICAgIC8v
IGZhbHNlCisgICAgRW1iZXIuaXNOb25lKGZ1bmN0aW9uKCkge30pOyAvLyBmYWxzZQorICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGlzTm9uZQorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09i
amVjdH0gb2JqIFZhbHVlIHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBwdWJs
aWMKKyAgKi8KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzTm9uZTsK
KworICBmdW5jdGlvbiBpc05vbmUob2JqKSB7CisgICAgcmV0dXJuIG9iaiA9PT0gbnVsbCB8fCBv
YmogPT09IHVuZGVmaW5lZDsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2lzX3ByZXNl
bnQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvaXNfYmxhbmsnXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlck1ldGFsSXNfYmxhbmspIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IGlzUHJlc2VudDsKKworICAvKioKKyAgICBBIHZhbHVlIGlzIHByZXNlbnQgaWYg
aXQgbm90IGBpc0JsYW5rYC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmlzUHJl
c2VudCgpOyAgICAgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudChudWxs
KTsgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCh1bmRlZmluZWQpOyAg
ICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCgnJyk7ICAgICAgICAgICAgICAvLyBm
YWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCgnICAnKTsgICAgICAgICAgICAvLyBmYWxzZQorICAg
IEVtYmVyLmlzUHJlc2VudCgnXG5cdCcpOyAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlz
UHJlc2VudChbXSk7ICAgICAgICAgICAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudCh7
IGxlbmd0aDogMCB9KSAgICAvLyBmYWxzZQorICAgIEVtYmVyLmlzUHJlc2VudChmYWxzZSk7ICAg
ICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQcmVzZW50KHRydWUpOyAgICAgICAgICAgIC8v
IHRydWUKKyAgICBFbWJlci5pc1ByZXNlbnQoJ3N0cmluZycpOyAgICAgICAgLy8gdHJ1ZQorICAg
IEVtYmVyLmlzUHJlc2VudCgwKTsgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQ
cmVzZW50KGZ1bmN0aW9uKCkge30pICAgIC8vIHRydWUKKyAgICBFbWJlci5pc1ByZXNlbnQoe30p
OyAgICAgICAgICAgICAgLy8gdHJ1ZQorICAgIEVtYmVyLmlzUHJlc2VudChmYWxzZSk7ICAgICAg
ICAgICAvLyB0cnVlCisgICAgRW1iZXIuaXNQcmVzZW50KCdcblx0IEhlbGxvJyk7ICAgIC8vIHRy
dWUKKyAgICBFbWJlci5pc1ByZXNlbnQoWzEsMiwzXSk7ICAgICAgICAgLy8gdHJ1ZQorICAgIGBg
YAorICAKKyAgICBAbWV0aG9kIGlzUHJlc2VudAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0g
e09iamVjdH0gb2JqIFZhbHVlIHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBz
aW5jZSAxLjguMAorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBpc1ByZXNlbnQob2Jq
KSB7CisgICAgcmV0dXJuICFfZW1iZXJNZXRhbElzX2JsYW5rLmRlZmF1bHQob2JqKTsKKyAgfQor
fSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL2xpYnJhcmllcycsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9mZWF0dXJlcyddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxGZWF0dXJlcykgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgICAgSGVscGVyIGNsYXNzIHRoYXQgYWxsb3dzIHlvdSB0byByZWdpc3RlciB5
b3VyIGxpYnJhcnkgd2l0aCBFbWJlci4KKyAgCisgICAgU2luZ2xldG9uIGNyZWF0ZWQgYXQgYEVt
YmVyLmxpYnJhcmllc2AuCisgIAorICAgIEBjbGFzcyBMaWJyYXJpZXMKKyAgICBAY29uc3RydWN0
b3IKKyAgICBAcHJpdmF0ZQorICAqLworICBmdW5jdGlvbiBMaWJyYXJpZXMoKSB7CisgICAgdGhp
cy5fcmVnaXN0cnkgPSBbXTsKKyAgICB0aGlzLl9jb3JlTGliSW5kZXggPSAwOworICB9CisKKyAg
TGlicmFyaWVzLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogTGlicmFyaWVzLAorCisg
ICAgX2dldExpYnJhcnlCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgbGlicyA9
IHRoaXMuX3JlZ2lzdHJ5OworICAgICAgdmFyIGNvdW50ID0gbGlicy5sZW5ndGg7CisKKyAgICAg
IGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAobGlic1tpXS5u
YW1lID09PSBuYW1lKSB7CisgICAgICAgICAgcmV0dXJuIGxpYnNbaV07CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBp
c0NvcmVMaWJyYXJ5KSB7CisgICAgICB2YXIgaW5kZXggPSB0aGlzLl9yZWdpc3RyeS5sZW5ndGg7
CisKKyAgICAgIGlmICghdGhpcy5fZ2V0TGlicmFyeUJ5TmFtZShuYW1lKSkgeworICAgICAgICBp
ZiAoaXNDb3JlTGlicmFyeSkgeworICAgICAgICAgIGluZGV4ID0gdGhpcy5fY29yZUxpYkluZGV4
Kys7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fcmVnaXN0cnkuc3BsaWNlKGluZGV4LCAwLCB7
IG5hbWU6IG5hbWUsIHZlcnNpb246IHZlcnNpb24gfSk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICBfZW1iZXJNZXRhbERlYnVnLndhcm4oJ0xpYnJhcnkgIicgKyBuYW1lICsgJyIgaXMgYWxyZWFk
eSByZWdpc3RlcmVkIHdpdGggRW1iZXIuJywgZmFsc2UsIHsgaWQ6ICdlbWJlci1tZXRhbC5saWJy
YXJpZXMtcmVnaXN0ZXInIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICByZWdpc3RlckNvcmVM
aWJyYXJ5OiBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbikgeworICAgICAgdGhpcy5yZWdpc3Rlcihu
YW1lLCB2ZXJzaW9uLCB0cnVlKTsKKyAgICB9LAorCisgICAgZGVSZWdpc3RlcjogZnVuY3Rpb24g
KG5hbWUpIHsKKyAgICAgIHZhciBsaWIgPSB0aGlzLl9nZXRMaWJyYXJ5QnlOYW1lKG5hbWUpOwor
ICAgICAgdmFyIGluZGV4OworCisgICAgICBpZiAobGliKSB7CisgICAgICAgIGluZGV4ID0gdGhp
cy5fcmVnaXN0cnkuaW5kZXhPZihsaWIpOworICAgICAgICB0aGlzLl9yZWdpc3RyeS5zcGxpY2Uo
aW5kZXgsIDEpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBM
aWJyYXJpZXM7Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbG9nZ2VyJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZXJyb3InXSwgZnVuY3Rpb24gKGV4cG9y
dHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxFcnJvcikgeworICAndXNlIHN0cmljdCc7
CisKKyAgZnVuY3Rpb24gSygpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIGZ1bmN0aW9u
IGNvbnNvbGVNZXRob2QobmFtZSkgeworICAgIHZhciBjb25zb2xlT2JqLCBsb2dUb0NvbnNvbGU7
CisgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMuY29uc29sZSkgeworICAg
ICAgY29uc29sZU9iaiA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMuY29uc29sZTsK
KyAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgeworICAgICAg
Y29uc29sZU9iaiA9IGNvbnNvbGU7CisgICAgfQorCisgICAgdmFyIG1ldGhvZCA9IHR5cGVvZiBj
b25zb2xlT2JqID09PSAnb2JqZWN0JyA/IGNvbnNvbGVPYmpbbmFtZV0gOiBudWxsOworCisgICAg
aWYgKG1ldGhvZCkgeworICAgICAgLy8gT2xkZXIgSUUgZG9lc24ndCBzdXBwb3J0IGJpbmQsIGJ1
dCBDaHJvbWUgbmVlZHMgaXQKKyAgICAgIGlmICh0eXBlb2YgbWV0aG9kLmJpbmQgPT09ICdmdW5j
dGlvbicpIHsKKyAgICAgICAgbG9nVG9Db25zb2xlID0gbWV0aG9kLmJpbmQoY29uc29sZU9iaik7
CisgICAgICAgIGxvZ1RvQ29uc29sZS5kaXNwbGF5TmFtZSA9ICdjb25zb2xlLicgKyBuYW1lOwor
ICAgICAgICByZXR1cm4gbG9nVG9Db25zb2xlOworICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0
aG9kLmFwcGx5ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGxvZ1RvQ29uc29sZSA9IGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgICBtZXRob2QuYXBwbHkoY29uc29sZU9iaiwgYXJndW1lbnRzKTsK
KyAgICAgICAgfTsKKyAgICAgICAgbG9nVG9Db25zb2xlLmRpc3BsYXlOYW1lID0gJ2NvbnNvbGUu
JyArIG5hbWU7CisgICAgICAgIHJldHVybiBsb2dUb0NvbnNvbGU7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciBtZXNzYWdlID0gQXJy
YXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsICcsICcpOworICAgICAgICAgIG1ldGhv
ZChtZXNzYWdlKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlv
biBhc3NlcnRQb2x5ZmlsbCh0ZXN0LCBtZXNzYWdlKSB7CisgICAgaWYgKCF0ZXN0KSB7CisgICAg
ICB0cnkgeworICAgICAgICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHRoZSBzdGFjaworICAgICAg
ICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdhc3NlcnRpb24gZmFpbGVkOiAn
ICsgbWVzc2FnZSk7CisgICAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgICBzZXRUaW1lb3V0
KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB0aHJvdyBlcnJvcjsKKyAgICAgICAgfSwgMCk7Cisg
ICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1w
bHkgdXNlcyB0aGUgbWV0aG9kcyBmcm9tIGBpbXBvcnRzLmNvbnNvbGVgLgorICAgIE92ZXJyaWRl
IHRoaXMgdG8gcHJvdmlkZSBtb3JlIHJvYnVzdCBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkuCisgIAor
ICAgIEBjbGFzcyBMb2dnZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgLyoqCisgICAgIExvZ3MgdGhlIGFyZ3VtZW50
cyB0byB0aGUgY29uc29sZS4KKyAgICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFz
IHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4K
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgZm9vID0gMTsKKyAgICAgIEVtYmVyLkxv
Z2dlci5sb2coJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsKKyAgICAgIC8vICJsb2cgdmFsdWUg
b2YgZm9vOiAxIiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUKKyAgICAgIGBgYAorICAg
ICAgQG1ldGhvZCBsb2cKKyAgICAgQGZvciBFbWJlci5Mb2dnZXIKKyAgICAgQHBhcmFtIHsqfSBh
cmd1bWVudHMKKyAgICAgQHB1YmxpYworICAgICovCisgICAgbG9nOiBjb25zb2xlTWV0aG9kKCds
b2cnKSB8fCBLLAorCisgICAgLyoqCisgICAgIFByaW50cyB0aGUgYXJndW1lbnRzIHRvIHRoZSBj
b25zb2xlIHdpdGggYSB3YXJuaW5nIGljb24uCisgICAgIFlvdSBjYW4gcGFzcyBhcyBtYW55IGFy
Z3VtZW50cyBhcyB5b3Ugd2FudCBhbmQgdGhleSB3aWxsIGJlIGpvaW5lZCB0b2dldGhlciB3aXRo
IGEgc3BhY2UuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuTG9nZ2VyLndhcm4o
J1NvbWV0aGluZyBoYXBwZW5lZCEnKTsKKyAgICAgIC8vICJTb21ldGhpbmcgaGFwcGVuZWQhIiB3
aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgd2l0aCBhIHdhcm5pbmcgaWNvbi4KKyAgICAg
IGBgYAorICAgICAgQG1ldGhvZCB3YXJuCisgICAgIEBmb3IgRW1iZXIuTG9nZ2VyCisgICAgIEBw
YXJhbSB7Kn0gYXJndW1lbnRzCisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdhcm46IGNvbnNv
bGVNZXRob2QoJ3dhcm4nKSB8fCBLLAorCisgICAgLyoqCisgICAgIFByaW50cyB0aGUgYXJndW1l
bnRzIHRvIHRoZSBjb25zb2xlIHdpdGggYW4gZXJyb3IgaWNvbiwgcmVkIHRleHQgYW5kIGEgc3Rh
Y2sgdHJhY2UuCisgICAgIFlvdSBjYW4gcGFzcyBhcyBtYW55IGFyZ3VtZW50cyBhcyB5b3Ugd2Fu
dCBhbmQgdGhleSB3aWxsIGJlIGpvaW5lZCB0b2dldGhlciB3aXRoIGEgc3BhY2UuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuTG9nZ2VyLmVycm9yKCdEYW5nZXIhIERhbmdlciEn
KTsKKyAgICAgIC8vICJEYW5nZXIhIERhbmdlciEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29u
c29sZSBpbiByZWQgdGV4dC4KKyAgICAgIGBgYAorICAgICAgQG1ldGhvZCBlcnJvcgorICAgICBA
Zm9yIEVtYmVyLkxvZ2dlcgorICAgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAgICBAcHVibGlj
CisgICAgKi8KKyAgICBlcnJvcjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBLLAorCisgICAg
LyoqCisgICAgIExvZ3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZS4KKyAgICAgWW91IGNh
biBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9p
bmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2
YXIgZm9vID0gMTsKKyAgICAgIEVtYmVyLkxvZ2dlci5pbmZvKCdsb2cgdmFsdWUgb2YgZm9vOics
IGZvbyk7CisgICAgICAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmludGVkIHRv
IHRoZSBjb25zb2xlCisgICAgICBgYGAKKyAgICAgIEBtZXRob2QgaW5mbworICAgICBAZm9yIEVt
YmVyLkxvZ2dlcgorICAgICBAcGFyYW0geyp9IGFyZ3VtZW50cworICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBpbmZvOiBjb25zb2xlTWV0aG9kKCdpbmZvJykgfHwgSywKKworICAgIC8qKgorICAg
ICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgorICAgICBZ
b3UgY2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdhbnQgYW5kIHRoZXkgd2lsbCBi
ZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIHZhciBmb28gPSAxOworICAgICAgRW1iZXIuTG9nZ2VyLmRlYnVnKCdsb2cgdmFsdWUgb2Yg
Zm9vOicsIGZvbyk7CisgICAgICAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmlu
dGVkIHRvIHRoZSBjb25zb2xlCisgICAgICBgYGAKKyAgICAgIEBtZXRob2QgZGVidWcKKyAgICAg
QGZvciBFbWJlci5Mb2dnZXIKKyAgICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKKyAgICAgQHB1Ymxp
YworICAgICovCisgICAgZGVidWc6IGNvbnNvbGVNZXRob2QoJ2RlYnVnJykgfHwgY29uc29sZU1l
dGhvZCgnaW5mbycpIHx8IEssCisKKyAgICAvKioKKyAgICAgSWYgdGhlIHZhbHVlIHBhc3NlZCBp
bnRvIGBFbWJlci5Mb2dnZXIuYXNzZXJ0YCBpcyBub3QgdHJ1dGh5IGl0IHdpbGwgdGhyb3cgYW4g
ZXJyb3Igd2l0aCBhIHN0YWNrIHRyYWNlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVt
YmVyLkxvZ2dlci5hc3NlcnQodHJ1ZSk7IC8vIHVuZGVmaW5lZAorICAgICAgRW1iZXIuTG9nZ2Vy
LmFzc2VydCh0cnVlID09PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVy
cm9yLgorICAgICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVlID09PSBmYWxzZSwgJ1NvbWV0aGlu
ZyBpbnZhbGlkJyk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVycm9yIHdpdGggbWVz
c2FnZS4KKyAgICAgIGBgYAorICAgICAgQG1ldGhvZCBhc3NlcnQKKyAgICAgQGZvciBFbWJlci5M
b2dnZXIKKyAgICAgQHBhcmFtIHtCb29sZWFufSBib29sIFZhbHVlIHRvIHRlc3QKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IG1lc3NhZ2UgQXNzZXJ0aW9uIG1lc3NhZ2Ugb24gZmFpbGVkCisgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIGFzc2VydDogY29uc29sZU1ldGhvZCgnYXNzZXJ0JykgfHwgYXNz
ZXJ0UG9seWZpbGwKKyAgfTsKK30pOworLy8gRW1iZXIuaW1wb3J0cworZW5pZmVkKCdlbWJlci1t
ZXRhbC9tYXAnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC91
dGlscycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3Qp
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAorICAq
LworCisgIC8qCisgICAgSmF2YVNjcmlwdCAoYmVmb3JlIEVTNikgZG9lcyBub3QgaGF2ZSBhIE1h
cCBpbXBsZW1lbnRhdGlvbi4gT2JqZWN0cywKKyAgICB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBhcyBk
aWN0aW9uYXJpZXMsIG1heSBvbmx5IGhhdmUgU3RyaW5ncyBhcyBrZXlzLgorICAKKyAgICBCZWNh
dXNlIEVtYmVyIGhhcyBhIHdheSB0byBnZXQgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZXZlcnkg
b2JqZWN0CisgICAgdmlhIGBFbWJlci5ndWlkRm9yYCwgd2UgY2FuIGltcGxlbWVudCBhIHBlcmZv
cm1hbnQgTWFwIHdpdGggYXJiaXRyYXJ5CisgICAga2V5cy4gQmVjYXVzZSBpdCBpcyBjb21tb25s
eSB1c2VkIGluIGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFwIGlzCisgICAgaW1wbGVtZW50ZWQg
YXMgYSBwdXJlIEphdmFTY3JpcHQgb2JqZWN0IGZvciBwZXJmb3JtYW5jZS4KKyAgCisgICAgVGhp
cyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBvZiB0aGUgRVM2
IHByb3Bvc2FsIGZvcgorICAgIG1hcHMgKGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3Uu
cGhwP2lkPWhhcm1vbnk6c2ltcGxlX21hcHNfYW5kX3NldHMpLAorICAgIHdpdGggb25lIGV4Y2Vw
dGlvbjogIGFzIHdlIGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4tVk0gaXRlcmF0aW9uLCB3
ZSBpbXBsZW1lbnQgYQorICAgIGZvckVhY2ggbWV0aG9kIGZvciBpdGVyYXRpb24uCisgIAorICAg
IE1hcCBpcyBtb2NrZWQgb3V0IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3QsIHNvIHlvdSBj
YW4gZG8KKyAgICBgRW1iZXIuTWFwLmNyZWF0ZSgpYCBmb3Igc3ltbWV0cnkgd2l0aCBvdGhlciBF
bWJlciBjbGFzc2VzLgorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBtaXNz
aW5nRnVuY3Rpb24oZm4pIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKE9iamVjdC5wcm90b3R5
cGUudG9TdHJpbmcuY2FsbChmbikgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7CisgIH0KKworICBm
dW5jdGlvbiBtaXNzaW5nTmV3KG5hbWUpIHsKKyAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25z
dHJ1Y3RvciAnICsgbmFtZSArICcgcmVxdWlyZXMgXCduZXdcJycpOworICB9CisKKyAgZnVuY3Rp
b24gY29weU51bGwob2JqKSB7CisgICAgdmFyIG91dHB1dCA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5
X29iamVjdC5kZWZhdWx0KCk7CisKKyAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgICAg
Ly8gaGFzT3duUHJvcGVyeSBpcyBub3QgbmVlZGVkIGJlY2F1c2Ugb2JqIGlzIG5ldyBFbXB0eU9i
amVjdCgpOworICAgICAgb3V0cHV0W3Byb3BdID0gb2JqW3Byb3BdOworICAgIH0KKworICAgIHJl
dHVybiBvdXRwdXQ7CisgIH0KKworICBmdW5jdGlvbiBjb3B5TWFwKG9yaWdpbmFsLCBuZXdPYmpl
Y3QpIHsKKyAgICB2YXIga2V5cyA9IG9yaWdpbmFsLl9rZXlzLmNvcHkoKTsKKyAgICB2YXIgdmFs
dWVzID0gY29weU51bGwob3JpZ2luYWwuX3ZhbHVlcyk7CisKKyAgICBuZXdPYmplY3QuX2tleXMg
PSBrZXlzOworICAgIG5ld09iamVjdC5fdmFsdWVzID0gdmFsdWVzOworICAgIG5ld09iamVjdC5z
aXplID0gb3JpZ2luYWwuc2l6ZTsKKworICAgIHJldHVybiBuZXdPYmplY3Q7CisgIH0KKworICAv
KioKKyAgICBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBFbWJlciBhbmQgRW1iZXIg
RGF0YS4KKyAgICBQbGVhc2UgZG8gbm90IHVzZSBpdCBhdCB0aGlzIHRpbWUuIFdlIHBsYW4gdG8g
Y2xlYW4gaXQgdXAKKyAgICBhbmQgYWRkIG1hbnkgdGVzdHMgc29vbi4KKyAgCisgICAgQGNsYXNz
IE9yZGVyZWRTZXQKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGNvbnN0cnVjdG9yCisgICAg
QHByaXZhdGUKKyAgKi8KKyAgZnVuY3Rpb24gT3JkZXJlZFNldCgpIHsKKyAgICBpZiAodGhpcyBp
bnN0YW5jZW9mIE9yZGVyZWRTZXQpIHsKKyAgICAgIHRoaXMuY2xlYXIoKTsKKyAgICAgIHRoaXMu
X3NpbGVuY2VSZW1vdmVEZXByZWNhdGlvbiA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBt
aXNzaW5nTmV3KCdPcmRlcmVkU2V0Jyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQG1ldGhv
ZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAgQHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KKyAg
ICBAcHJpdmF0ZQorICAqLworICBPcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOworCisgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcigp
OworICB9OworCisgIE9yZGVyZWRTZXQucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBP
cmRlcmVkU2V0LAorICAgIC8qKgorICAgICAgQG1ldGhvZCBjbGVhcgorICAgICAgQHByaXZhdGUK
KyAgICAqLworICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnByZXNlbmNlU2V0
ID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHRoaXMubGlz
dCA9IFtdOworICAgICAgdGhpcy5zaXplID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBA
bWV0aG9kIGFkZAorICAgICAgQHBhcmFtIG9iagorICAgICAgQHBhcmFtIGd1aWQgKG9wdGlvbmFs
LCBhbmQgZm9yIGludGVybmFsIHVzZSkKKyAgICAgIEByZXR1cm4ge0VtYmVyLk9yZGVyZWRTZXR9
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgYWRkOiBmdW5jdGlvbiAob2JqLCBfZ3VpZCkg
eworICAgICAgdmFyIGd1aWQgPSBfZ3VpZCB8fCBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3Iob2Jq
KTsKKyAgICAgIHZhciBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQ7CisgICAgICB2YXIg
bGlzdCA9IHRoaXMubGlzdDsKKworICAgICAgaWYgKHByZXNlbmNlU2V0W2d1aWRdICE9PSB0cnVl
KSB7CisgICAgICAgIHByZXNlbmNlU2V0W2d1aWRdID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5zaXpl
ID0gbGlzdC5wdXNoKG9iaik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEBzaW5jZSAxLjguMAorICAgICAgQG1ldGhvZCBkZWxldGUKKyAg
ICAgIEBwYXJhbSBvYmoKKyAgICAgIEBwYXJhbSBfZ3VpZCAob3B0aW9uYWwgYW5kIGZvciBpbnRl
cm5hbCB1c2Ugb25seSkKKyAgICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgICBAcHJpdmF0ZQor
ICAgICovCisgICAgZGVsZXRlOiBmdW5jdGlvbiAob2JqLCBfZ3VpZCkgeworICAgICAgdmFyIGd1
aWQgPSBfZ3VpZCB8fCBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3Iob2JqKTsKKyAgICAgIHZhciBw
cmVzZW5jZVNldCA9IHRoaXMucHJlc2VuY2VTZXQ7CisgICAgICB2YXIgbGlzdCA9IHRoaXMubGlz
dDsKKworICAgICAgaWYgKHByZXNlbmNlU2V0W2d1aWRdID09PSB0cnVlKSB7CisgICAgICAgIGRl
bGV0ZSBwcmVzZW5jZVNldFtndWlkXTsKKyAgICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9m
KG9iaik7CisgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgICAgbGlzdC5zcGxpY2Uo
aW5kZXgsIDEpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2l6ZSA9IGxpc3QubGVuZ3RoOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0aG9kIGlzRW1wdHkKKyAg
ICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaXNFbXB0
eTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gMDsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBAbWV0aG9kIGhhcworICAgICAgQHBhcmFtIG9iagorICAgICAgQHJl
dHVybiB7Qm9vbGVhbn0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYXM6IGZ1bmN0aW9u
IChvYmopIHsKKyAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICB2YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZv
cihvYmopOworICAgICAgdmFyIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldDsKKworICAg
ICAgcmV0dXJuIHByZXNlbmNlU2V0W2d1aWRdID09PSB0cnVlOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIEBtZXRob2QgZm9yRWFjaAorICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAgICAg
IEBwYXJhbSBzZWxmCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZm9yRWFjaDogZnVuY3Rp
b24gKGZuIC8qLCAuLi50aGlzQXJnKi8pIHsKKyAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5j
dGlvbicpIHsKKyAgICAgICAgbWlzc2luZ0Z1bmN0aW9uKGZuKTsKKyAgICAgIH0KKworICAgICAg
aWYgKHRoaXMuc2l6ZSA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAg
IHZhciBsaXN0ID0gdGhpcy5saXN0OworICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5n
dGg7CisgICAgICB2YXIgaTsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMikgeworICAgICAgICBm
b3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGZuLmNhbGwoYXJn
dW1lbnRzWzFdLCBsaXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAg
Zm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBmbihsaXN0W2ld
KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2Qg
dG9BcnJheQorICAgICAgQHJldHVybiB7QXJyYXl9CisgICAgICBAcHJpdmF0ZQorICAgICovCisg
ICAgdG9BcnJheTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMubGlzdC5zbGljZSgp
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgY29weQorICAgICAgQHJldHVybiB7
RW1iZXIuT3JkZXJlZFNldH0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBjb3B5OiBmdW5j
dGlvbiAoKSB7CisgICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yOworICAg
ICAgdmFyIHNldCA9IG5ldyBDb25zdHJ1Y3RvcigpOworCisgICAgICBzZXQuX3NpbGVuY2VSZW1v
dmVEZXByZWNhdGlvbiA9IHRoaXMuX3NpbGVuY2VSZW1vdmVEZXByZWNhdGlvbjsKKyAgICAgIHNl
dC5wcmVzZW5jZVNldCA9IGNvcHlOdWxsKHRoaXMucHJlc2VuY2VTZXQpOworICAgICAgc2V0Lmxp
c3QgPSB0aGlzLnRvQXJyYXkoKTsKKyAgICAgIHNldC5zaXplID0gdGhpcy5zaXplOworCisgICAg
ICByZXR1cm4gc2V0OworICAgIH0KKyAgfTsKKworICAvKioKKyAgICBBIE1hcCBzdG9yZXMgdmFs
dWVzIGluZGV4ZWQgYnkga2V5cy4gVW5saWtlIEphdmFTY3JpcHQncworICAgIGRlZmF1bHQgT2Jq
ZWN0cywgdGhlIGtleXMgb2YgYSBNYXAgY2FuIGJlIGFueSBKYXZhU2NyaXB0CisgICAgb2JqZWN0
LgorICAKKyAgICBJbnRlcm5hbGx5LCBhIE1hcCBoYXMgdHdvIGRhdGEgc3RydWN0dXJlczoKKyAg
CisgICAgMS4gYGtleXNgOiBhbiBPcmRlcmVkU2V0IG9mIGFsbCBvZiB0aGUgZXhpc3Rpbmcga2V5
cworICAgIDIuIGB2YWx1ZXNgOiBhIEphdmFTY3JpcHQgT2JqZWN0IGluZGV4ZWQgYnkgdGhlIGBF
bWJlci5ndWlkRm9yKGtleSlgCisgIAorICAgIFdoZW4gYSBrZXkvdmFsdWUgcGFpciBpcyBhZGRl
ZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlCisgICAgYWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBP
cmRlcmVkU2V0LCBhbmQgY3JlYXRlIG9yCisgICAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVz
YC4gV2hlbiBhbiBlbnRyeSBpcyBkZWxldGVkLAorICAgIHdlIGRlbGV0ZSBpdHMgZW50cnkgaW4g
YGtleXNgIGFuZCBgdmFsdWVzYC4KKyAgCisgICAgQGNsYXNzIE1hcAorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAcHJpdmF0ZQorICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5jdGlvbiBN
YXAoKSB7CisgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7CisgICAg
ICB0aGlzLl9rZXlzID0gT3JkZXJlZFNldC5jcmVhdGUoKTsKKyAgICAgIHRoaXMuX2tleXMuX3Np
bGVuY2VSZW1vdmVEZXByZWNhdGlvbiA9IHRydWU7CisgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcg
X2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgdGhpcy5zaXplID0gMDsK
KyAgICB9IGVsc2UgeworICAgICAgbWlzc2luZ05ldygnT3JkZXJlZFNldCcpOworICAgIH0KKyAg
fQorCisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0Lk1hcCA9IE1hcDsKKworICAvKioKKyAgICBA
bWV0aG9kIGNyZWF0ZQorICAgIEBzdGF0aWMKKyAgICBAcHJpdmF0ZQorICAqLworICBNYXAuY3Jl
YXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7CisgICAgcmV0
dXJuIG5ldyBDb25zdHJ1Y3RvcigpOworICB9OworCisgIE1hcC5wcm90b3R5cGUgPSB7CisgICAg
Y29uc3RydWN0b3I6IE1hcCwKKworICAgIC8qKgorICAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNo
YW5nZSBhcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG1hcCBjaGFuZ2VzLgorICAgICAg
IEBzaW5jZSAxLjguMAorICAgICAgQHByb3BlcnR5IHNpemUKKyAgICAgIEB0eXBlIG51bWJlcgor
ICAgICAgQGRlZmF1bHQgMAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHNpemU6IDAsCisK
KyAgICAvKioKKyAgICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZl
biBrZXkuCisgICAgICAgQG1ldGhvZCBnZXQKKyAgICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgICBA
cmV0dXJuIHsqfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIGB1bmRlZmlu
ZWRgCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7Cisg
ICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwor
ICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlczsKKyAgICAgIHZhciBndWlkID0gX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKGtleSk7CisKKyAgICAgIHJldHVybiB2YWx1ZXNbZ3VpZF07Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQWRkcyBhIHZhbHVlIHRvIHRoZSBtYXAuIElmIGEgdmFs
dWUgZm9yIHRoZSBnaXZlbiBrZXkgaGFzIGFscmVhZHkgYmVlbgorICAgICAgcHJvdmlkZWQsIHRo
ZSBuZXcgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSBvbGQgdmFsdWUuCisgICAgICAgQG1ldGhvZCBz
ZXQKKyAgICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgICBAcGFyYW0geyp9IHZhbHVlCisgICAgICBA
cmV0dXJuIHtFbWJlci5NYXB9CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgc2V0OiBmdW5j
dGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAg
dmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlczsKKyAgICAgIHZhciBndWlkID0gX2VtYmVyTWV0YWxV
dGlscy5ndWlkRm9yKGtleSk7CisKKyAgICAgIC8vIGVuc3VyZSB3ZSBkb24ndCBzdG9yZSAtMAor
ICAgICAgdmFyIGsgPSBrZXkgPT09IC0wID8gMCA6IGtleTsKKworICAgICAga2V5cy5hZGQoaywg
Z3VpZCk7CisKKyAgICAgIHZhbHVlc1tndWlkXSA9IHZhbHVlOworCisgICAgICB0aGlzLnNpemUg
PSBrZXlzLnNpemU7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBtYXAgZm9yIGFuIGFzc29jaWF0ZWQga2V5Lgor
ICAgICAgIEBzaW5jZSAxLjguMAorICAgICAgQG1ldGhvZCBkZWxldGUKKyAgICAgIEBwYXJhbSB7
Kn0ga2V5CisgICAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFuIGl0ZW0gd2FzIHJlbW92
ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGRlbGV0ZTog
ZnVuY3Rpb24gKGtleSkgeworICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgeworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBkb24ndCB1c2UgRVM2ICJkZWxldGUiIGJl
Y2F1c2UgaXQgd2lsbCBiZSBhbm5veWluZworICAgICAgLy8gdG8gdXNlIGluIGJyb3dzZXJzIHRo
YXQgYXJlIG5vdCBFUzYgZnJpZW5kbHk7CisgICAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7Cisg
ICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzOworICAgICAgdmFyIGd1aWQgPSBfZW1iZXJN
ZXRhbFV0aWxzLmd1aWRGb3Ioa2V5KTsKKworICAgICAgaWYgKGtleXMuZGVsZXRlKGtleSwgZ3Vp
ZCkpIHsKKyAgICAgICAgZGVsZXRlIHZhbHVlc1tndWlkXTsKKyAgICAgICAgdGhpcy5zaXplID0g
a2V5cy5zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBDaGVjayB3
aGV0aGVyIGEga2V5IGlzIHByZXNlbnQuCisgICAgICAgQG1ldGhvZCBoYXMKKyAgICAgIEBwYXJh
bSB7Kn0ga2V5CisgICAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIHdhcyBw
cmVzZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBoYXM6
IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzLl9rZXlzLmhhcyhrZXkpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGtleXMgYW5kIHZhbHVl
cy4gQ2FsbHMgdGhlIGZ1bmN0aW9uIG9uY2UKKyAgICAgIGZvciBlYWNoIGtleSwgcGFzc2luZyBp
biB2YWx1ZSwga2V5LCBhbmQgdGhlIG1hcCBiZWluZyBpdGVyYXRlZCBvdmVyLAorICAgICAgaW4g
dGhhdCBvcmRlci4KKyAgICAgICBUaGUga2V5cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBpdGVyYXRl
ZCBvdmVyIGluIGluc2VydGlvbiBvcmRlci4KKyAgICAgICBAbWV0aG9kIGZvckVhY2gKKyAgICAg
IEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICBAcGFyYW0geyp9IHNlbGYgaWYgcGFz
c2VkLCB0aGUgYHRoaXNgIHZhbHVlIGluc2lkZSB0aGUKKyAgICAgICAgY2FsbGJhY2suIEJ5IGRl
ZmF1bHQsIGB0aGlzYCBpcyB0aGUgbWFwLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGZv
ckVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjayAvKiwgLi4udGhpc0FyZyovKSB7CisgICAgICBpZiAo
dHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIG1pc3NpbmdGdW5jdGlv
bihjYWxsYmFjayk7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxl
bmd0aDsKKyAgICAgIHZhciBtYXAgPSB0aGlzOworICAgICAgdmFyIGNiLCB0aGlzQXJnOworCisg
ICAgICBpZiAobGVuZ3RoID09PSAyKSB7CisgICAgICAgIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07
CisgICAgICAgIGNiID0gZnVuY3Rpb24gKGtleSkgeworICAgICAgICAgIGNhbGxiYWNrLmNhbGwo
dGhpc0FyZywgbWFwLmdldChrZXkpLCBrZXksIG1hcCk7CisgICAgICAgIH07CisgICAgICB9IGVs
c2UgeworICAgICAgICBjYiA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgICAgICBjYWxsYmFjayht
YXAuZ2V0KGtleSksIGtleSwgbWFwKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgdGhp
cy5fa2V5cy5mb3JFYWNoKGNiKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0aG9kIGNs
ZWFyCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRoaXMuX2tleXMuY2xlYXIoKTsKKyAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgICB0aGlzLnNpemUgPSAwOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgY29weQorICAgICAgQHJldHVybiB7RW1iZXIuTWFw
fQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNvcHk6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiBjb3B5TWFwKHRoaXMsIG5ldyBNYXAoKSk7CisgICAgfQorICB9OworCisgIC8qKgor
ICAgIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0
ZW5kcyBFbWJlci5NYXAKKyAgICBAcHJpdmF0ZQorICAgIEBjb25zdHJ1Y3RvcgorICAgIEBwYXJh
bSBbb3B0aW9uc10KKyAgICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGVmYXVsdFZhbHVlXQorICAq
LworICBmdW5jdGlvbiBNYXBXaXRoRGVmYXVsdChvcHRpb25zKSB7CisgICAgdGhpcy5fc3VwZXIk
Y29uc3RydWN0b3IoKTsKKyAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZh
bHVlOworICB9CisKKyAgLyoqCisgICAgQG1ldGhvZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAg
QHBhcmFtIFtvcHRpb25zXQorICAgICAgQHBhcmFtIHsqfSBbb3B0aW9ucy5kZWZhdWx0VmFsdWVd
CisgICAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIuTWFwfSBJZiBvcHRpb25z
IGFyZSBwYXNzZWQsIHJldHVybnMKKyAgICAgIGBFbWJlci5NYXBXaXRoRGVmYXVsdGAgb3RoZXJ3
aXNlIHJldHVybnMgYEVtYmVyLk1hcGAKKyAgICBAcHJpdmF0ZQorICAqLworICBNYXBXaXRoRGVm
YXVsdC5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykgeworICAgIGlmIChvcHRpb25zKSB7Cisg
ICAgICByZXR1cm4gbmV3IE1hcFdpdGhEZWZhdWx0KG9wdGlvbnMpOworICAgIH0gZWxzZSB7Cisg
ICAgICByZXR1cm4gbmV3IE1hcCgpOworICAgIH0KKyAgfTsKKworICBNYXBXaXRoRGVmYXVsdC5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1hcC5wcm90b3R5cGUpOworICBNYXBXaXRoRGVmYXVs
dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXBXaXRoRGVmYXVsdDsKKyAgTWFwV2l0aERlZmF1
bHQucHJvdG90eXBlLl9zdXBlciRjb25zdHJ1Y3RvciA9IE1hcDsKKyAgTWFwV2l0aERlZmF1bHQu
cHJvdG90eXBlLl9zdXBlciRnZXQgPSBNYXAucHJvdG90eXBlLmdldDsKKworICAvKioKKyAgICBS
ZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LgorICAKKyAgICBA
bWV0aG9kIGdldAorICAgIEBwYXJhbSB7Kn0ga2V5CisgICAgQHJldHVybiB7Kn0gdGhlIHZhbHVl
IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZQorICAgIEBwcml2
YXRlCisgICovCisgIE1hcFdpdGhEZWZhdWx0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5
KSB7CisgICAgdmFyIGhhc1ZhbHVlID0gdGhpcy5oYXMoa2V5KTsKKworICAgIGlmIChoYXNWYWx1
ZSkgeworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyJGdldChrZXkpOworICAgIH0gZWxzZSB7Cisg
ICAgICB2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUoa2V5KTsKKyAgICAgIHRo
aXMuc2V0KGtleSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Cisg
ICAgfQorICB9OworCisgIC8qKgorICAgIEBtZXRob2QgY29weQorICAgIEByZXR1cm4ge0VtYmVy
Lk1hcFdpdGhEZWZhdWx0fQorICAgIEBwcml2YXRlCisgICovCisgIE1hcFdpdGhEZWZhdWx0LnBy
b3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXMu
Y29uc3RydWN0b3I7CisgICAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IENvbnN0cnVjdG9yKHsK
KyAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUKKyAgICB9KSk7CisgIH07CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gTWFwOworICBleHBvcnRzLk9yZGVyZWRTZXQgPSBPcmRlcmVk
U2V0OworICBleHBvcnRzLk1hcCA9IE1hcDsKKyAgZXhwb3J0cy5NYXBXaXRoRGVmYXVsdCA9IE1h
cFdpdGhEZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL21lcmdlJywgWydleHBvcnRz
J10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgIE1lcmdlIHRoZSBjb250ZW50cyBv
ZiB0d28gb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBFbWJlci5tZXJnZSh7Zmlyc3Q6ICdUb20nfSwge2xhc3Q6ICdEYWxl
J30pOyAvLyB7Zmlyc3Q6ICdUb20nLCBsYXN0OiAnRGFsZSd9CisgICAgdmFyIGEgPSB7Zmlyc3Q6
ICdZZWh1ZGEnfTsKKyAgICB2YXIgYiA9IHtsYXN0OiAnS2F0eid9OworICAgIEVtYmVyLm1lcmdl
KGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1llaHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0ge2xh
c3Q6ICdLYXR6J30KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBtZXJnZQorICAgIEBmb3IgRW1i
ZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWwgVGhlIG9iamVjdCB0byBtZXJnZSBpbnRv
CisgICAgQHBhcmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRp
ZXMgZnJvbQorICAgIEByZXR1cm4ge09iamVjdH0KKyAgICBAcHVibGljCisgICovCisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBtZXJnZTsKKworICBmdW5jdGlvbiBtZXJn
ZShvcmlnaW5hbCwgdXBkYXRlcykgeworICAgIGlmICghdXBkYXRlcyB8fCB0eXBlb2YgdXBkYXRl
cyAhPT0gJ29iamVjdCcpIHsKKyAgICAgIHJldHVybiBvcmlnaW5hbDsKKyAgICB9CisKKyAgICB2
YXIgcHJvcHMgPSBPYmplY3Qua2V5cyh1cGRhdGVzKTsKKyAgICB2YXIgcHJvcDsKKyAgICB2YXIg
bGVuZ3RoID0gcHJvcHMubGVuZ3RoOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7
IGkrKykgeworICAgICAgcHJvcCA9IHByb3BzW2ldOworICAgICAgb3JpZ2luYWxbcHJvcF0gPSB1
cGRhdGVzW3Byb3BdOworICAgIH0KKworICAgIHJldHVybiBvcmlnaW5hbDsKKyAgfQorfSk7Citl
bmlmZWQoJ2VtYmVyLW1ldGFsL21ldGEnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YV9s
aXN0ZW5lcnMnLCAnZW1iZXItbWV0YWwvZW1wdHlfb2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXJNZXRhbE1ldGFfbGlzdGVuZXJzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCkgewor
ICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNw
aWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisgIGV4cG9ydHMubWV0YSA9IG1ldGE7CisgIGV4cG9y
dHMucGVla01ldGEgPSBwZWVrTWV0YTsKKyAgZXhwb3J0cy5kZWxldGVNZXRhID0gZGVsZXRlTWV0
YTsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8qCisgICBUaGlz
IGRlY2xhcmVzIHNldmVyYWwgbWV0YS1wcm9ncmFtbWVkIG1lbWJlcnMgb24gdGhlIE1ldGEgY2xh
c3MuIFN1Y2gKKyAgIG1ldGEhCisgIAorICAgSW4gZ2VuZXJhbCwgdGhlIGByZWFkYWJsZWAgdmFy
aWFudHMgd2lsbCBnaXZlIHlvdSBhbiBvYmplY3QgKGlmIGl0CisgICBhbHJlYWR5IGV4aXN0cykg
dGhhdCB5b3UgY2FuIHJlYWQgYnV0IHNob3VsZCBub3QgbW9kaWZ5LiBUaGUKKyAgIGB3cml0YWJs
ZWAgdmFyaWFudHMgd2lsbCBnaXZlIHlvdSBhIG11dGFibGUgb2JqZWN0LCBhbmQgdGhleSB3aWxs
CisgICBjcmVhdGUgaXQgaWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QuCisgIAorICAgVGhlIGZv
bGxvd2luZyBtZXRob2RzIHdpbGwgZ2V0IGdlbmVyYXRlZCBtZXRhcHJvZ3JhbW1hdGljYWxseSwg
YW5kCisgICBJJ20gaW5jbHVkaW5nIHRoZW0gaGVyZSBmb3IgZ3JlcHBhYmlsaXR5OgorICAKKyAg
IHdyaXRhYmxlQ2FjaGUsIHJlYWRhYmxlQ2FjaGUsIHdyaXRlV2F0Y2hpbmcsCisgICBwZWVrV2F0
Y2hpbmcsIGNsZWFyV2F0Y2hpbmcsIHdyaXRlTWl4aW5zLAorICAgcGVla01peGlucywgY2xlYXJN
aXhpbnMsIHdyaXRlQmluZGluZ3MsCisgICBwZWVrQmluZGluZ3MsIGNsZWFyQmluZGluZ3MsIHdy
aXRlVmFsdWVzLAorICAgcGVla1ZhbHVlcywgY2xlYXJWYWx1ZXMsIHdyaXRlRGVwcywgZm9yRWFj
aEluRGVwcworICAgd3JpdGFibGVDaGFpbldhdGNoZXJzLCByZWFkYWJsZUNoYWluV2F0Y2hlcnMs
IHdyaXRhYmxlQ2hhaW5zLAorICAgcmVhZGFibGVDaGFpbnMsIHdyaXRhYmxlVGFnLCByZWFkYWJs
ZVRhZworICAKKyAgKi8KKyAgdmFyIG1lbWJlcnMgPSB7CisgICAgY2FjaGU6IG93bk1hcCwKKyAg
ICB3ZWFrOiBvd25NYXAsCisgICAgd2F0Y2hpbmc6IGluaGVyaXRlZE1hcCwKKyAgICBtaXhpbnM6
IGluaGVyaXRlZE1hcCwKKyAgICBiaW5kaW5nczogaW5oZXJpdGVkTWFwLAorICAgIHZhbHVlczog
aW5oZXJpdGVkTWFwLAorICAgIGRlcHM6IGluaGVyaXRlZE1hcE9mTWFwcywKKyAgICBjaGFpbldh
dGNoZXJzOiBvd25DdXN0b21PYmplY3QsCisgICAgY2hhaW5zOiBpbmhlcml0ZWRDdXN0b21PYmpl
Y3QsCisgICAgdGFnOiBvd25DdXN0b21PYmplY3QKKyAgfTsKKworICB2YXIgbWVtYmVyTmFtZXMg
PSBPYmplY3Qua2V5cyhtZW1iZXJzKTsKKyAgdmFyIE1FVEFfRklFTEQgPSAnX19lbWJlcl9tZXRh
X18nOworCisgIGZ1bmN0aW9uIE1ldGEob2JqLCBwYXJlbnRNZXRhKSB7CisgICAgdGhpcy5fY2Fj
aGUgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fd2VhayA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl93
YXRjaGluZyA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9taXhpbnMgPSB1bmRlZmluZWQ7CisgICAg
dGhpcy5fYmluZGluZ3MgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fdmFsdWVzID0gdW5kZWZpbmVk
OworICAgIHRoaXMuX2RlcHMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fY2hhaW5XYXRjaGVycyA9
IHVuZGVmaW5lZDsKKyAgICB0aGlzLl9jaGFpbnMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fdGFn
ID0gdW5kZWZpbmVkOworCisgICAgLy8gdXNlZCBvbmx5IGludGVybmFsbHkKKyAgICB0aGlzLnNv
dXJjZSA9IG9iajsKKworICAgIC8vIHdoZW4gbWV0YShvYmopLnByb3RvID09PSBvYmosIHRoZSBv
YmplY3QgaXMgaW50ZW5kZWQgdG8gYmUgb25seSBhCisgICAgLy8gcHJvdG90eXBlIGFuZCBkb2Vz
bid0IG5lZWQgdG8gYWN0dWFsbHkgYmUgb2JzZXJ2YWJsZSBpdHNlbGYKKyAgICB0aGlzLnByb3Rv
ID0gdW5kZWZpbmVkOworCisgICAgLy8gVGhlIG5leHQgbWV0YSBpbiBvdXIgaW5oZXJpdGFuY2Ug
Y2hhaW4uIFdlICh3aWxsKSB0cmFjayB0aGlzCisgICAgLy8gZXhwbGljaXRseSBpbnN0ZWFkIG9m
IHVzaW5nIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBiZWNhdXNlIHdlCisgICAgLy8gaGF2ZSBk
ZXRhaWxlZCBrbm93bGVkZ2Ugb2YgaG93IGVhY2ggcHJvcGVydHkgc2hvdWxkIHJlYWxseSBiZQor
ICAgIC8vIGluaGVyaXRlZCwgYW5kIHdlIGNhbiBvcHRpbWl6ZSBpdCBtdWNoIGJldHRlciB0aGFu
IEpTIHJ1bnRpbWVzLgorICAgIHRoaXMucGFyZW50ID0gcGFyZW50TWV0YTsKKworICAgIHRoaXMu
X2luaXRpYWxpemVMaXN0ZW5lcnMoKTsKKyAgfQorCisgIGZvciAodmFyIF9uYW1lIGluIF9lbWJl
ck1ldGFsTWV0YV9saXN0ZW5lcnMucHJvdG9NZXRob2RzKSB7CisgICAgTWV0YS5wcm90b3R5cGVb
X25hbWVdID0gX2VtYmVyTWV0YWxNZXRhX2xpc3RlbmVycy5wcm90b01ldGhvZHNbX25hbWVdOwor
ICB9CisgIG1lbWJlck5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKKyAgICByZXR1cm4g
bWVtYmVyc1tuYW1lXShuYW1lLCBNZXRhKTsKKyAgfSk7CisKKyAgLy8gSW1wbGVtZW50cyBhIG1l
bWJlciB0aGF0IGlzIGEgbGF6aWx5IGNyZWF0ZWQsIG5vbi1pbmhlcml0YWJsZQorICAvLyBQT0pP
LgorICBmdW5jdGlvbiBvd25NYXAobmFtZSwgTWV0YSkgeworICAgIHZhciBrZXkgPSBtZW1iZXJQ
cm9wZXJ0eShuYW1lKTsKKyAgICB2YXIgY2FwaXRhbGl6ZWQgPSBjYXBpdGFsaXplKG5hbWUpOwor
ICAgIE1ldGEucHJvdG90eXBlWyd3cml0YWJsZScgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVPd25NYXAoa2V5KTsKKyAgICB9Owor
ICAgIE1ldGEucHJvdG90eXBlWydyZWFkYWJsZScgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gdGhpc1trZXldOworICAgIH07CisgIH0KKworICBNZXRhLnByb3Rv
dHlwZS5fZ2V0T3JDcmVhdGVPd25NYXAgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIHJldCA9
IHRoaXNba2V5XTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0ID0gdGhpc1trZXldID0gbmV3
IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJl
dDsKKyAgfTsKKworICAvLyBJbXBsZW1lbnRzIGEgbWVtYmVyIHRoYXQgaXMgYSBsYXppbHkgY3Jl
YXRlZCBQT0pPIHdpdGggaW5oZXJpdGFibGUKKyAgLy8gdmFsdWVzLgorICBmdW5jdGlvbiBpbmhl
cml0ZWRNYXAobmFtZSwgTWV0YSkgeworICAgIHZhciBrZXkgPSBtZW1iZXJQcm9wZXJ0eShuYW1l
KTsKKyAgICB2YXIgY2FwaXRhbGl6ZWQgPSBjYXBpdGFsaXplKG5hbWUpOworCisgICAgTWV0YS5w
cm90b3R5cGVbJ3dyaXRlJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXksIHZhbHVl
KSB7CisgICAgICB2YXIgbWFwID0gdGhpcy5fZ2V0T3JDcmVhdGVPd25NYXAoa2V5KTsKKyAgICAg
IG1hcFtzdWJrZXldID0gdmFsdWU7CisgICAgfTsKKworICAgIE1ldGEucHJvdG90eXBlWydwZWVr
JyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXkpIHsKKyAgICAgIHJldHVybiB0aGlz
Ll9maW5kSW5oZXJpdGVkKGtleSwgc3Via2V5KTsKKyAgICB9OworCisgICAgTWV0YS5wcm90b3R5
cGVbJ2ZvckVhY2gnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGZuKSB7CisgICAgICB2YXIg
cG9pbnRlciA9IHRoaXM7CisgICAgICB2YXIgc2VlbiA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29i
amVjdC5kZWZhdWx0KCk7CisgICAgICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7Cisg
ICAgICAgIHZhciBtYXAgPSBwb2ludGVyW2tleV07CisgICAgICAgIGlmIChtYXApIHsKKyAgICAg
ICAgICBmb3IgKHZhciBfa2V5IGluIG1hcCkgeworICAgICAgICAgICAgaWYgKCFzZWVuW19rZXld
KSB7CisgICAgICAgICAgICAgIHNlZW5bX2tleV0gPSB0cnVlOworICAgICAgICAgICAgICBmbihf
a2V5LCBtYXBbX2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9CisgICAgfTsKKworICAg
IE1ldGEucHJvdG90eXBlWydjbGVhcicgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoKSB7Cisg
ICAgICB0aGlzW2tleV0gPSB1bmRlZmluZWQ7CisgICAgfTsKKworICAgIE1ldGEucHJvdG90eXBl
WydkZWxldGVGcm9tJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0aW9uIChzdWJrZXkpIHsKKyAgICAg
IGRlbGV0ZSB0aGlzLl9nZXRPckNyZWF0ZU93bk1hcChrZXkpW3N1YmtleV07CisgICAgfTsKKwor
ICAgIE1ldGEucHJvdG90eXBlWydoYXNJbicgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoc3Vi
a2V5KSB7CisgICAgICByZXR1cm4gdGhpcy5fZmluZEluaGVyaXRlZChrZXksIHN1YmtleSkgIT09
IHVuZGVmaW5lZDsKKyAgICB9OworICB9CisKKyAgTWV0YS5wcm90b3R5cGUuX2dldEluaGVyaXRl
ZCA9IGZ1bmN0aW9uIChrZXkpIHsKKyAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgd2hpbGUg
KHBvaW50ZXIgIT09IHVuZGVmaW5lZCkgeworICAgICAgaWYgKHBvaW50ZXJba2V5XSkgeworICAg
ICAgICByZXR1cm4gcG9pbnRlcltrZXldOworICAgICAgfQorICAgICAgcG9pbnRlciA9IHBvaW50
ZXIucGFyZW50OworICAgIH0KKyAgfTsKKworICBNZXRhLnByb3RvdHlwZS5fZmluZEluaGVyaXRl
ZCA9IGZ1bmN0aW9uIChrZXksIHN1YmtleSkgeworICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAg
ICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB2YXIgbWFwID0gcG9pbnRl
cltrZXldOworICAgICAgaWYgKG1hcCkgeworICAgICAgICB2YXIgdmFsdWUgPSBtYXBbc3Via2V5
XTsKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICByZXR1cm4g
dmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBvaW50ZXIgPSBwb2ludGVyLnBhcmVu
dDsKKyAgICB9CisgIH07CisKKyAgLy8gSW1wbGVtZW50cyBhIG1lbWJlciB0aGF0IHByb3ZpZGVz
IGEgbGF6aWx5IGNyZWF0ZWQgbWFwIG9mIG1hcHMsCisgIC8vIHdpdGggaW5oZXJpdGFuY2UgYXQg
Ym90aCBsZXZlbHMuCisgIGZ1bmN0aW9uIGluaGVyaXRlZE1hcE9mTWFwcyhuYW1lLCBNZXRhKSB7
CisgICAgdmFyIGtleSA9IG1lbWJlclByb3BlcnR5KG5hbWUpOworICAgIHZhciBjYXBpdGFsaXpl
ZCA9IGNhcGl0YWxpemUobmFtZSk7CisKKyAgICBNZXRhLnByb3RvdHlwZVsnd3JpdGUnICsgY2Fw
aXRhbGl6ZWRdID0gZnVuY3Rpb24gKHN1YmtleSwgaXRlbWtleSwgdmFsdWUpIHsKKyAgICAgIHZh
ciBvdXRlck1hcCA9IHRoaXMuX2dldE9yQ3JlYXRlT3duTWFwKGtleSk7CisgICAgICB2YXIgaW5u
ZXJNYXAgPSBvdXRlck1hcFtzdWJrZXldOworICAgICAgaWYgKCFpbm5lck1hcCkgeworICAgICAg
ICBpbm5lck1hcCA9IG91dGVyTWFwW3N1YmtleV0gPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmpl
Y3QuZGVmYXVsdCgpOworICAgICAgfQorICAgICAgaW5uZXJNYXBbaXRlbWtleV0gPSB2YWx1ZTsK
KyAgICB9OworCisgICAgTWV0YS5wcm90b3R5cGVbJ3BlZWsnICsgY2FwaXRhbGl6ZWRdID0gZnVu
Y3Rpb24gKHN1YmtleSwgaXRlbWtleSkgeworICAgICAgdmFyIHBvaW50ZXIgPSB0aGlzOworICAg
ICAgd2hpbGUgKHBvaW50ZXIgIT09IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgbWFwID0gcG9p
bnRlcltrZXldOworICAgICAgICBpZiAobWFwKSB7CisgICAgICAgICAgdmFyIHZhbHVlID0gbWFw
W3N1YmtleV07CisgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWVb
aXRlbWtleV0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbaXRl
bWtleV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBv
aW50ZXIgPSBwb2ludGVyLnBhcmVudDsKKyAgICAgIH0KKyAgICB9OworCisgICAgTWV0YS5wcm90
b3R5cGVbJ2hhcycgKyBjYXBpdGFsaXplZF0gPSBmdW5jdGlvbiAoc3Via2V5KSB7CisgICAgICB2
YXIgcG9pbnRlciA9IHRoaXM7CisgICAgICB3aGlsZSAocG9pbnRlciAhPT0gdW5kZWZpbmVkKSB7
CisgICAgICAgIGlmIChwb2ludGVyW2tleV0gJiYgcG9pbnRlcltrZXldW3N1YmtleV0pIHsKKyAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRl
ci5wYXJlbnQ7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIE1l
dGEucHJvdG90eXBlWydmb3JFYWNoSW4nICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKHN1Ymtl
eSwgZm4pIHsKKyAgICAgIHJldHVybiB0aGlzLl9mb3JFYWNoSW4oa2V5LCBzdWJrZXksIGZuKTsK
KyAgICB9OworICB9CisKKyAgTWV0YS5wcm90b3R5cGUuX2ZvckVhY2hJbiA9IGZ1bmN0aW9uIChr
ZXksIHN1YmtleSwgZm4pIHsKKyAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgdmFyIHNlZW4g
PSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgIHZhciBjYWxscyA9
IFtdOworICAgIHdoaWxlIChwb2ludGVyICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHZhciBtYXAg
PSBwb2ludGVyW2tleV07CisgICAgICBpZiAobWFwKSB7CisgICAgICAgIHZhciBpbm5lck1hcCA9
IG1hcFtzdWJrZXldOworICAgICAgICBpZiAoaW5uZXJNYXApIHsKKyAgICAgICAgICBmb3IgKHZh
ciBpbm5lcktleSBpbiBpbm5lck1hcCkgeworICAgICAgICAgICAgaWYgKCFzZWVuW2lubmVyS2V5
XSkgeworICAgICAgICAgICAgICBzZWVuW2lubmVyS2V5XSA9IHRydWU7CisgICAgICAgICAgICAg
IGNhbGxzLnB1c2goW2lubmVyS2V5LCBpbm5lck1hcFtpbm5lcktleV1dKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBvaW50ZXIgPSBwb2lu
dGVyLnBhcmVudDsKKyAgICB9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7
IGkrKykgeworICAgICAgdmFyIF9jYWxscyRpID0gY2FsbHNbaV07CisgICAgICB2YXIgaW5uZXJL
ZXkgPSBfY2FsbHMkaVswXTsKKyAgICAgIHZhciB2YWx1ZSA9IF9jYWxscyRpWzFdOworCisgICAg
ICBmbihpbm5lcktleSwgdmFsdWUpOworICAgIH0KKyAgfTsKKworICAvLyBJbXBsZW1lbnRzIGEg
bWVtYmVyIHRoYXQgcHJvdmlkZXMgYSBub24taGVyaXRhYmxlLCBsYXppbHktY3JlYXRlZAorICAv
LyBvYmplY3QgdXNpbmcgdGhlIG1ldGhvZCB5b3UgcHJvdmlkZS4KKyAgZnVuY3Rpb24gb3duQ3Vz
dG9tT2JqZWN0KG5hbWUsIE1ldGEpIHsKKyAgICB2YXIga2V5ID0gbWVtYmVyUHJvcGVydHkobmFt
ZSk7CisgICAgdmFyIGNhcGl0YWxpemVkID0gY2FwaXRhbGl6ZShuYW1lKTsKKyAgICBNZXRhLnBy
b3RvdHlwZVsnd3JpdGFibGUnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGNyZWF0ZSkgewor
ICAgICAgdmFyIHJldCA9IHRoaXNba2V5XTsKKyAgICAgIGlmICghcmV0KSB7CisgICAgICAgIHJl
dCA9IHRoaXNba2V5XSA9IGNyZWF0ZSh0aGlzLnNvdXJjZSk7CisgICAgICB9CisgICAgICByZXR1
cm4gcmV0OworICAgIH07CisgICAgTWV0YS5wcm90b3R5cGVbJ3JlYWRhYmxlJyArIGNhcGl0YWxp
emVkXSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgfTsKKyAg
fQorCisgIC8vIEltcGxlbWVudHMgYSBtZW1iZXIgdGhhdCBwcm92aWRlcyBhbiBpbmhlcml0YWJs
ZSwgbGF6aWx5LWNyZWF0ZWQKKyAgLy8gb2JqZWN0IHVzaW5nIHRoZSBtZXRob2QgeW91IHByb3Zp
ZGUuIFdlIHdpbGwgZGVyaXZlZCBjaGlsZHJlbiBmcm9tCisgIC8vIHRoZWlyIHBhcmVudHMgYnkg
Y2FsbGluZyB5b3VyIG9iamVjdCdzIGBjb3B5KClgIG1ldGhvZC4KKyAgZnVuY3Rpb24gaW5oZXJp
dGVkQ3VzdG9tT2JqZWN0KG5hbWUsIE1ldGEpIHsKKyAgICB2YXIga2V5ID0gbWVtYmVyUHJvcGVy
dHkobmFtZSk7CisgICAgdmFyIGNhcGl0YWxpemVkID0gY2FwaXRhbGl6ZShuYW1lKTsKKyAgICBN
ZXRhLnByb3RvdHlwZVsnd3JpdGFibGUnICsgY2FwaXRhbGl6ZWRdID0gZnVuY3Rpb24gKGNyZWF0
ZSkgeworICAgICAgdmFyIHJldCA9IHRoaXNba2V5XTsKKyAgICAgIGlmICghcmV0KSB7CisgICAg
ICAgIGlmICh0aGlzLnBhcmVudCkgeworICAgICAgICAgIHJldCA9IHRoaXNba2V5XSA9IHRoaXMu
cGFyZW50Wyd3cml0YWJsZScgKyBjYXBpdGFsaXplZF0oY3JlYXRlKS5jb3B5KHRoaXMuc291cmNl
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXQgPSB0aGlzW2tleV0gPSBjcmVhdGUo
dGhpcy5zb3VyY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAg
IH07CisgICAgTWV0YS5wcm90b3R5cGVbJ3JlYWRhYmxlJyArIGNhcGl0YWxpemVkXSA9IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9nZXRJbmhlcml0ZWQoa2V5KTsKKyAgICB9Owor
ICB9CisKKyAgZnVuY3Rpb24gbWVtYmVyUHJvcGVydHkobmFtZSkgeworICAgIHJldHVybiAnXycg
KyBuYW1lOworICB9CisKKyAgLy8gdGhlcmUncyBhIG1vcmUgZ2VuZXJhbC1wdXJwb3NlIGNhcGl0
YWxpemUgaW4gZW1iZXItcnVudGltZSwgYnV0IHdlCisgIC8vIGRvbid0IHdhbnQgdG8gbWFrZSBl
bWJlci1tZXRhbCBkZXBlbmQgb24gZW1iZXItcnVudGltZS4KKyAgZnVuY3Rpb24gY2FwaXRhbGl6
ZShuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXlx3LywgZnVuY3Rpb24gKG0pIHsK
KyAgICAgIHJldHVybiBtLnRvVXBwZXJDYXNlKCk7CisgICAgfSk7CisgIH0KKworICB2YXIgTUVU
QV9ERVNDID0geworICAgIHdyaXRhYmxlOiB0cnVlLAorICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwK
KyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAgICB2YWx1ZTogbnVsbAorICB9OworCisgIGV4cG9y
dHMuTUVUQV9ERVNDID0gTUVUQV9ERVNDOworICB2YXIgRU1CRVJfTUVUQV9QUk9QRVJUWSA9IHsK
KyAgICBuYW1lOiBNRVRBX0ZJRUxELAorICAgIGRlc2NyaXB0b3I6IE1FVEFfREVTQworICB9Owor
CisgIC8vIGNob29zZSB0aGUgb25lIGFwcHJvcHJpYXRlIGZvciBnaXZlbiBwbGF0Zm9ybQorICB2
YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChvYmosIG1ldGEpIHsKKyAgICAvLyBpZiBgbnVsbGAgYWxy
ZWFkeSwganVzdCBzZXQgaXQgdG8gdGhlIG5ldyB2YWx1ZQorICAgIC8vIG90aGVyd2lzZSBkZWZp
bmUgcHJvcGVydHkgZmlyc3QKKyAgICBpZiAob2JqW01FVEFfRklFTERdICE9PSBudWxsKSB7Cisg
ICAgICBpZiAob2JqLl9fZGVmaW5lTm9uRW51bWVyYWJsZSkgeworICAgICAgICBvYmouX19kZWZp
bmVOb25FbnVtZXJhYmxlKEVNQkVSX01FVEFfUFJPUEVSVFkpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgTUVUQV9GSUVMRCwgTUVUQV9ERVNDKTsK
KyAgICAgIH0KKyAgICB9CisKKyAgICBvYmpbTUVUQV9GSUVMRF0gPSBtZXRhOworICB9OworCisg
IC8qKgorICAgIFJldHJpZXZlcyB0aGUgbWV0YSBoYXNoIGZvciBhbiBvYmplY3QuIElmIGB3cml0
YWJsZWAgaXMgdHJ1ZSBlbnN1cmVzIHRoZQorICAgIGhhc2ggaXMgd3JpdGFibGUgZm9yIHRoaXMg
b2JqZWN0IGFzIHdlbGwuCisgIAorICAgIFRoZSBtZXRhIG9iamVjdCBjb250YWlucyBpbmZvcm1h
dGlvbiBhYm91dCBjb21wdXRlZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBhcworICAgIHdlbGwgYXMg
YW55IHdhdGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24uIFlvdSBnZW5lcmFs
bHkgd2lsbAorICAgIG5vdCBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseSBidXQgaW5z
dGVhZCB3b3JrIHdpdGggaGlnaGVyIGxldmVsCisgICAgbWV0aG9kcyB0aGF0IG1hbmlwdWxhdGUg
dGhpcyBoYXNoIGluZGlyZWN0bHkuCisgIAorICAgIEBtZXRob2QgbWV0YQorICAgIEBmb3IgRW1i
ZXIKKyAgICBAcHJpdmF0ZQorICAKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qg
dG8gcmV0cmlldmUgbWV0YSBmb3IKKyAgICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJsZT10cnVl
XSBQYXNzIGBmYWxzZWAgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gbW9kaWZ5CisgICAgICB0aGUg
bWV0YSBoYXNoLCBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGF2b2lkIG1ha2luZyBhbiB1bm5lY2Vz
c2FyeSBjb3B5LgorICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1ldGEgaGFzaCBmb3IgYW4gb2Jq
ZWN0CisgICovCisKKyAgZnVuY3Rpb24gbWV0YShvYmopIHsKKyAgICB2YXIgbWF5YmVNZXRhID0g
cGVla01ldGEob2JqKTsKKyAgICB2YXIgcGFyZW50ID0gdW5kZWZpbmVkOworCisgICAgLy8gcmVt
b3ZlIHRoaXMgY29kZSwgaW4tZmF2b3Igb2YgZXhwbGljaXQgcGFyZW50CisgICAgaWYgKG1heWJl
TWV0YSkgeworICAgICAgaWYgKG1heWJlTWV0YS5zb3VyY2UgPT09IG9iaikgeworICAgICAgICBy
ZXR1cm4gbWF5YmVNZXRhOworICAgICAgfQorICAgICAgcGFyZW50ID0gbWF5YmVNZXRhOworICAg
IH0KKworICAgIHZhciBuZXdNZXRhID0gbmV3IE1ldGEob2JqLCBwYXJlbnQpOworICAgIHNldE1l
dGEob2JqLCBuZXdNZXRhKTsKKyAgICByZXR1cm4gbmV3TWV0YTsKKyAgfQorCisgIGZ1bmN0aW9u
IHBlZWtNZXRhKG9iaikgeworICAgIHJldHVybiBvYmpbTUVUQV9GSUVMRF07CisgIH0KKworICBm
dW5jdGlvbiBkZWxldGVNZXRhKG9iaikgeworICAgIGlmICh0eXBlb2Ygb2JqW01FVEFfRklFTERd
ICE9PSAnb2JqZWN0JykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvYmpbTUVUQV9GSUVM
RF0gPSBudWxsOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbWV0YV9saXN0ZW5lcnMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLyoKKyAgIFdoZW4gd2UgcmVu
ZGVyIGEgcmljaCB0ZW1wbGF0ZSBoaWVyYXJjaHksIHRoZSBzZXQgb2YgZXZlbnRzIHRoYXQKKyAg
ICptaWdodCogaGFwcGVuIHRlbmRzIHRvIGJlIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIHNldCBvZiBl
dmVudHMgdGhhdAorICAgYWN0dWFsbHkgaGFwcGVuLiBUaGlzIGltcGxpZXMgdGhhdCB3ZSBzaG91
bGQgbWFrZSBsaXN0ZW5lciBjcmVhdGlvbiAmCisgICBkZXN0cnVjdGlvbiBjaGVhcCwgZXZlbiBh
dCB0aGUgY29zdCBvZiBtYWtpbmcgZXZlbnQgZGlzcGF0Y2ggbW9yZQorICAgZXhwZW5zaXZlLgor
ICAKKyAgIFRodXMgd2Ugc3RvcmUgYSBuZXcgbGlzdGVuZXIgd2l0aCBhIHNpbmdsZSBwdXNoIGFu
ZCBubyBuZXcKKyAgIGFsbG9jYXRpb25zLCB3aXRob3V0IGV2ZW4gYm90aGVyaW5nIHRvIGRvIGRl
ZHVwbGljYXRpb24gLS0gd2UgY2FuCisgICBzYXZlIHRoYXQgZm9yIGRpc3BhdGNoIHRpbWUsIGlm
IGFuIGV2ZW50IGFjdHVhbGx5IGhhcHBlbnMuCisgICAqLworCisgIC8qIGxpc3RlbmVyIGZsYWdz
ICovCisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgT05DRSA9IDE7CisgIGV4cG9ydHMuT05DRSA9
IE9OQ0U7CisgIHZhciBTVVNQRU5ERUQgPSAyOworCisgIGV4cG9ydHMuU1VTUEVOREVEID0gU1VT
UEVOREVEOworICB2YXIgcHJvdG9NZXRob2RzID0geworCisgICAgYWRkVG9MaXN0ZW5lcnM6IGZ1
bmN0aW9uIChldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBmbGFncykgeworICAgICAgaWYgKCF0
aGlzLl9saXN0ZW5lcnMpIHsKKyAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CisgICAgICB9
CisgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBm
bGFncyk7CisgICAgfSwKKworICAgIF9maW5hbGl6ZUxpc3RlbmVyczogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZCkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9CisgICAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykgeworICAgICAgICB0aGlzLl9saXN0
ZW5lcnMgPSBbXTsKKyAgICAgIH0KKyAgICAgIHZhciBwb2ludGVyID0gdGhpcy5wYXJlbnQ7Cisg
ICAgICB3aGlsZSAocG9pbnRlcikgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gcG9pbnRlci5f
bGlzdGVuZXJzOworICAgICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAgICAgdGhpcy5fbGlz
dGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmNvbmNhdChsaXN0ZW5lcnMpOworICAgICAgICB9Cisg
ICAgICAgIGlmIChwb2ludGVyLl9saXN0ZW5lcnNGaW5hbGl6ZWQpIHsKKyAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9
CisgICAgICB0aGlzLl9saXN0ZW5lcnNGaW5hbGl6ZWQgPSB0cnVlOworICAgIH0sCisKKyAgICBy
ZW1vdmVGcm9tTGlzdGVuZXJzOiBmdW5jdGlvbiAoZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwg
ZGlkUmVtb3ZlKSB7CisgICAgICB2YXIgcG9pbnRlciA9IHRoaXM7CisgICAgICB3aGlsZSAocG9p
bnRlcikgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gcG9pbnRlci5fbGlzdGVuZXJzOworICAg
ICAgICBpZiAobGlzdGVuZXJzKSB7CisgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSBsaXN0ZW5l
cnMubGVuZ3RoIC0gNDsgaW5kZXggPj0gMDsgaW5kZXggLT0gNCkgeworICAgICAgICAgICAgaWYg
KGxpc3RlbmVyc1tpbmRleF0gPT09IGV2ZW50TmFtZSAmJiAoIW1ldGhvZCB8fCBsaXN0ZW5lcnNb
aW5kZXggKyAxXSA9PT0gdGFyZ2V0ICYmIGxpc3RlbmVyc1tpbmRleCArIDJdID09PSBtZXRob2Qp
KSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVyID09PSB0aGlzKSB7CisgICAgICAgICAgICAg
ICAgLy8gd2UgYXJlIG1vZGlmeWluZyBvdXIgb3duIGxpc3QsIHNvIHdlIGVkaXQgZGlyZWN0bHkK
KyAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRpZFJlbW92ZSA9PT0gJ2Z1bmN0aW9uJykgewor
ICAgICAgICAgICAgICAgICAgZGlkUmVtb3ZlKGV2ZW50TmFtZSwgdGFyZ2V0LCBsaXN0ZW5lcnNb
aW5kZXggKyAyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RlbmVy
cy5zcGxpY2UoaW5kZXgsIDQpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gcmVtb3ZlIGFuIGluaGVyaXRlZCBsaXN0ZW5lciwgc28g
d2UgZG8KKyAgICAgICAgICAgICAgICAvLyBqdXN0LWluLXRpbWUgY29weWluZyB0byBkZXRhY2gg
b3VyIG93biBsaXN0ZW5lcnMgZnJvbQorICAgICAgICAgICAgICAgIC8vIG91ciBpbmhlcml0YW5j
ZSBjaGFpbi4KKyAgICAgICAgICAgICAgICB0aGlzLl9maW5hbGl6ZUxpc3RlbmVycygpOworICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUZyb21MaXN0ZW5lcnMoZXZlbnROYW1lLCB0
YXJnZXQsIG1ldGhvZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvaW50ZXIuX2xpc3RlbmVyc0ZpbmFsaXplZCkg
eworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgPSBwb2ludGVy
LnBhcmVudDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgbWF0Y2hpbmdMaXN0ZW5lcnM6IGZ1bmN0
aW9uIChldmVudE5hbWUpIHsKKyAgICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAgICAgIHZhciBy
ZXN1bHQgPSBbXTsKKyAgICAgIHdoaWxlIChwb2ludGVyKSB7CisgICAgICAgIHZhciBsaXN0ZW5l
cnMgPSBwb2ludGVyLl9saXN0ZW5lcnM7CisgICAgICAgIGlmIChsaXN0ZW5lcnMpIHsKKyAgICAg
ICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGlzdGVuZXJzLmxlbmd0aCAtIDM7IGlu
ZGV4ICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaW5kZXhdID09PSBldmVudE5h
bWUpIHsKKyAgICAgICAgICAgICAgcHVzaFVuaXF1ZUxpc3RlbmVyKHJlc3VsdCwgbGlzdGVuZXJz
LCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGlmIChwb2ludGVyLl9saXN0ZW5lcnNGaW5hbGl6ZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBwb2ludGVyID0gcG9pbnRlci5wYXJlbnQ7CisgICAgICB9CisgICAg
ICB2YXIgc3VzID0gdGhpcy5fc3VzcGVuZGVkTGlzdGVuZXJzOworICAgICAgaWYgKHN1cykgewor
ICAgICAgICBmb3IgKHZhciBzdXNJbmRleCA9IDA7IHN1c0luZGV4IDwgc3VzLmxlbmd0aCAtIDI7
IHN1c0luZGV4ICs9IDMpIHsKKyAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBzdXNbc3VzSW5k
ZXhdKSB7CisgICAgICAgICAgICBmb3IgKHZhciByZXN1bHRJbmRleCA9IDA7IHJlc3VsdEluZGV4
IDwgcmVzdWx0Lmxlbmd0aCAtIDI7IHJlc3VsdEluZGV4ICs9IDMpIHsKKyAgICAgICAgICAgICAg
aWYgKHJlc3VsdFtyZXN1bHRJbmRleF0gPT09IHN1c1tzdXNJbmRleCArIDFdICYmIHJlc3VsdFty
ZXN1bHRJbmRleCArIDFdID09PSBzdXNbc3VzSW5kZXggKyAyXSkgeworICAgICAgICAgICAgICAg
IHJlc3VsdFtyZXN1bHRJbmRleCArIDJdIHw9IFNVU1BFTkRFRDsKKyAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9LAorCisgICAgc3VzcGVuZExpc3RlbmVyczogZnVuY3Rpb24gKGV2
ZW50TmFtZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgeworICAgICAgdmFyIHN1cyA9IHRo
aXMuX3N1c3BlbmRlZExpc3RlbmVyczsKKyAgICAgIGlmICghc3VzKSB7CisgICAgICAgIHN1cyA9
IHRoaXMuX3N1c3BlbmRlZExpc3RlbmVycyA9IFtdOworICAgICAgfQorICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHN1cy5wdXNoKGV2
ZW50TmFtZXNbaV0sIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAg
ICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRhcmdldCk7CisgICAgICB9IGZpbmFsbHkgeworICAg
ICAgICBpZiAoc3VzLmxlbmd0aCA9PT0gZXZlbnROYW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICB0
aGlzLl9zdXNwZW5kZWRMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgZm9yICh2YXIgaSA9IHN1cy5sZW5ndGggLSAzOyBpID49IDA7IGkgLT0gMykgewor
ICAgICAgICAgICAgaWYgKHN1c1tpICsgMV0gPT09IHRhcmdldCAmJiBzdXNbaSArIDJdID09PSBt
ZXRob2QgJiYgZXZlbnROYW1lcy5pbmRleE9mKHN1c1tpXSkgIT09IC0xKSB7CisgICAgICAgICAg
ICAgIHN1cy5zcGxpY2UoaSwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICB9CisgICAgfSwKKworICAgIHdhdGNoZWRFdmVudHM6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHZhciBwb2ludGVyID0gdGhpczsKKyAgICAgIHZhciBuYW1lcyA9IHt9OworICAgICAg
d2hpbGUgKHBvaW50ZXIpIHsKKyAgICAgICAgdmFyIGxpc3RlbmVycyA9IHBvaW50ZXIuX2xpc3Rl
bmVyczsKKyAgICAgICAgaWYgKGxpc3RlbmVycykgeworICAgICAgICAgIGZvciAodmFyIGluZGV4
ID0gMDsgaW5kZXggPCBsaXN0ZW5lcnMubGVuZ3RoIC0gMzsgaW5kZXggKz0gNCkgeworICAgICAg
ICAgICAgbmFtZXNbbGlzdGVuZXJzW2luZGV4XV0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBpZiAocG9pbnRlci5fbGlzdGVuZXJzRmluYWxpemVkKSB7CisgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIucGFyZW50Owor
ICAgICAgfQorICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG5hbWVzKTsKKyAgICB9LAorCisgICAg
X2luaXRpYWxpemVMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX2xpc3RlbmVy
cyA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuX2xpc3RlbmVyc0ZpbmFsaXplZCA9IHVuZGVmaW5l
ZDsKKyAgICAgIHRoaXMuX3N1c3BlbmRlZExpc3RlbmVycyA9IHVuZGVmaW5lZDsKKyAgICB9Cisg
IH07CisKKyAgZXhwb3J0cy5wcm90b01ldGhvZHMgPSBwcm90b01ldGhvZHM7CisgIGZ1bmN0aW9u
IHB1c2hVbmlxdWVMaXN0ZW5lcihkZXN0aW5hdGlvbiwgc291cmNlLCBpbmRleCkgeworICAgIHZh
ciB0YXJnZXQgPSBzb3VyY2VbaW5kZXggKyAxXTsKKyAgICB2YXIgbWV0aG9kID0gc291cmNlW2lu
ZGV4ICsgMl07CisgICAgZm9yICh2YXIgZGVzdGluYXRpb25JbmRleCA9IDA7IGRlc3RpbmF0aW9u
SW5kZXggPCBkZXN0aW5hdGlvbi5sZW5ndGggLSAyOyBkZXN0aW5hdGlvbkluZGV4ICs9IDMpIHsK
KyAgICAgIGlmIChkZXN0aW5hdGlvbltkZXN0aW5hdGlvbkluZGV4XSA9PT0gdGFyZ2V0ICYmIGRl
c3RpbmF0aW9uW2Rlc3RpbmF0aW9uSW5kZXggKyAxXSA9PT0gbWV0aG9kKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdGluYXRpb24ucHVzaCh0YXJnZXQsIG1ldGhv
ZCwgc291cmNlW2luZGV4ICsgM10pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvbWl4
aW4nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9lcnJvcics
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwv
ZW1wdHlfb2JqZWN0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdl
bWJlci1tZXRhbC9leHBhbmRfcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywg
J2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2JpbmRpbmcnLCAnZW1iZXItbWV0
YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxF
cnJvciwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsRW1w
dHlfb2JqZWN0LCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9z
ZXQsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFeHBhbmRf
cHJvcGVydGllcywgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLCBfZW1iZXJNZXRhbENvbXB1dGVkLCBf
ZW1iZXJNZXRhbEJpbmRpbmcsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1ldGFsRXZlbnRz
LCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJl
bW92ZSAidXNlIHN0cmljdCI7IGZyb20gdHJhbnNwaWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisg
IC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKyAg
ZXhwb3J0cy5taXhpbiA9IG1peGluOworICBleHBvcnRzLmRlZmF1bHQgPSBNaXhpbjsKKyAgZXhw
b3J0cy5yZXF1aXJlZCA9IHJlcXVpcmVkOworICBleHBvcnRzLmFsaWFzTWV0aG9kID0gYWxpYXNN
ZXRob2Q7CisgIGV4cG9ydHMub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKKyAgZXhwb3J0cy5faW1tZWRp
YXRlT2JzZXJ2ZXIgPSBfaW1tZWRpYXRlT2JzZXJ2ZXI7CisgIGV4cG9ydHMuX2JlZm9yZU9ic2Vy
dmVyID0gX2JlZm9yZU9ic2VydmVyOworCisgIGZ1bmN0aW9uIFJPT1QoKSB7fQorICBST09ULl9f
aGFzU3VwZXIgPSBmYWxzZTsKKworICB2YXIgUkVRVUlSRUQ7CisgIHZhciBhX3NsaWNlID0gW10u
c2xpY2U7CisKKyAgZnVuY3Rpb24gaXNNZXRob2Qob2JqKSB7CisgICAgcmV0dXJuICdmdW5jdGlv
bicgPT09IHR5cGVvZiBvYmogJiYgb2JqLmlzTWV0aG9kICE9PSBmYWxzZSAmJiBvYmogIT09IEJv
b2xlYW4gJiYgb2JqICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBBcnJh
eSAmJiBvYmogIT09IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7CisgIH0KKworICB2YXIgQ09OVElO
VUUgPSB7fTsKKworICBmdW5jdGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwgbWl4aW4p
IHsKKyAgICB2YXIgZ3VpZDsKKworICAgIGlmIChtaXhpbiBpbnN0YW5jZW9mIE1peGluKSB7Cisg
ICAgICBndWlkID0gX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yKG1peGluKTsKKyAgICAgIGlmICht
aXhpbnNNZXRhLnBlZWtNaXhpbnMoZ3VpZCkpIHsKKyAgICAgICAgcmV0dXJuIENPTlRJTlVFOwor
ICAgICAgfQorICAgICAgbWl4aW5zTWV0YS53cml0ZU1peGlucyhndWlkLCBtaXhpbik7CisgICAg
ICByZXR1cm4gbWl4aW4ucHJvcGVydGllczsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1p
eGluOyAvLyBhcHBseSBhbm9ueW1vdXMgbWl4aW4gcHJvcGVydGllcworICAgIH0KKyAgfQorCisg
IGZ1bmN0aW9uIGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcyhjb25jYXRQcm9wLCBwcm9wcywg
dmFsdWVzLCBiYXNlKSB7CisgICAgdmFyIGNvbmNhdHM7CisKKyAgICAvLyByZXNldCBiZWZvcmUg
YWRkaW5nIGVhY2ggbmV3IG1peGluIHRvIHBpY2t1cCBjb25jYXRzIGZyb20gcHJldmlvdXMKKyAg
ICBjb25jYXRzID0gdmFsdWVzW2NvbmNhdFByb3BdIHx8IGJhc2VbY29uY2F0UHJvcF07CisgICAg
aWYgKHByb3BzW2NvbmNhdFByb3BdKSB7CisgICAgICBjb25jYXRzID0gY29uY2F0cyA/IGNvbmNh
dHMuY29uY2F0KHByb3BzW2NvbmNhdFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3BdOworICAgIH0K
KworICAgIHJldHVybiBjb25jYXRzOworICB9CisKKyAgZnVuY3Rpb24gZ2l2ZURlc2NyaXB0b3JT
dXBlcihtZXRhLCBrZXksIHByb3BlcnR5LCB2YWx1ZXMsIGRlc2NzLCBiYXNlKSB7CisgICAgdmFy
IHN1cGVyUHJvcGVydHk7CisKKyAgICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJyaWRlIG1l
dGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCisgICAgaWYgKHZhbHVlc1trZXld
ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3Ig
aW4gYSBwYXJlbnQgbWl4aW4KKyAgICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOworICAg
IH0KKworICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIGlu
IGEgcGFyZW50IG1peGluLCBmaW5kCisgICAgLy8gaXQgb24gdGhlIG9yaWdpbmFsIG9iamVjdC4K
KyAgICBpZiAoIXN1cGVyUHJvcGVydHkpIHsKKyAgICAgIHZhciBwb3NzaWJsZURlc2MgPSBiYXNl
W2tleV07CisgICAgICB2YXIgc3VwZXJEZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5
cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0
b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIHN1cGVyUHJvcGVydHkgPSBz
dXBlckRlc2M7CisgICAgfQorCisgICAgaWYgKHN1cGVyUHJvcGVydHkgPT09IHVuZGVmaW5lZCB8
fCAhKHN1cGVyUHJvcGVydHkgaW5zdGFuY2VvZiBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVk
UHJvcGVydHkpKSB7CisgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgLy8gU2lu
Y2UgbXVsdGlwbGUgbWl4aW5zIG1heSBpbmhlcml0IGZyb20gdGhlIHNhbWUgcGFyZW50LCB3ZSBu
ZWVkCisgICAgLy8gdG8gY2xvbmUgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHNvIHRoYXQgb3RoZXIg
bWl4aW5zIGRvIG5vdCByZWNlaXZlCisgICAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KKyAgICBw
cm9wZXJ0eSA9IE9iamVjdC5jcmVhdGUocHJvcGVydHkpOworICAgIHByb3BlcnR5Ll9nZXR0ZXIg
PSBfZW1iZXJNZXRhbFV0aWxzLndyYXAocHJvcGVydHkuX2dldHRlciwgc3VwZXJQcm9wZXJ0eS5f
Z2V0dGVyKTsKKyAgICBpZiAoc3VwZXJQcm9wZXJ0eS5fc2V0dGVyKSB7CisgICAgICBpZiAocHJv
cGVydHkuX3NldHRlcikgeworICAgICAgICBwcm9wZXJ0eS5fc2V0dGVyID0gX2VtYmVyTWV0YWxV
dGlscy53cmFwKHByb3BlcnR5Ll9zZXR0ZXIsIHN1cGVyUHJvcGVydHkuX3NldHRlcik7CisgICAg
ICB9IGVsc2UgeworICAgICAgICBwcm9wZXJ0eS5fc2V0dGVyID0gc3VwZXJQcm9wZXJ0eS5fc2V0
dGVyOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgfQorCisgIGZ1
bmN0aW9uIGdpdmVNZXRob2RTdXBlcihvYmosIGtleSwgbWV0aG9kLCB2YWx1ZXMsIGRlc2NzKSB7
CisgICAgdmFyIHN1cGVyTWV0aG9kOworCisgICAgLy8gTWV0aG9kcyBvdmVyd3JpdGUgY29tcHV0
ZWQgcHJvcGVydGllcywgYW5kIGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCisgICAgaWYgKGRl
c2NzW2tleV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgbWV0
aG9kIGluIGEgcGFyZW50IG1peGluCisgICAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXldOwor
ICAgIH0KKworICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBpbiBh
IHBhcmVudCBtaXhpbiwgZmluZCBpdCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QKKyAg
ICBzdXBlck1ldGhvZCA9IHN1cGVyTWV0aG9kIHx8IG9ialtrZXldOworCisgICAgLy8gT25seSB3
cmFwIHRoZSBuZXcgbWV0aG9kIGlmIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2FzIGEgZnVuY3Rpb24K
KyAgICBpZiAoc3VwZXJNZXRob2QgPT09IHVuZGVmaW5lZCB8fCAnZnVuY3Rpb24nICE9PSB0eXBl
b2Ygc3VwZXJNZXRob2QpIHsKKyAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcmV0
dXJuIF9lbWJlck1ldGFsVXRpbHMud3JhcChtZXRob2QsIHN1cGVyTWV0aG9kKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGFwcGx5Q29uY2F0ZW5hdGVkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZh
bHVlcykgeworICAgIHZhciBiYXNlVmFsdWUgPSB2YWx1ZXNba2V5XSB8fCBvYmpba2V5XTsKKwor
ICAgIGlmIChiYXNlVmFsdWUpIHsKKyAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYmFz
ZVZhbHVlLmNvbmNhdCkgeworICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09
IHVuZGVmaW5lZCkgeworICAgICAgICAgIHJldHVybiBiYXNlVmFsdWU7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgcmV0dXJuIGJhc2VWYWx1ZS5jb25jYXQodmFsdWUpOworICAgICAgICB9
CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxVdGlscy5tYWtlQXJy
YXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICByZXR1cm4gX2VtYmVyTWV0YWxVdGlscy5tYWtlQXJyYXkodmFsdWUpOworICAgIH0KKyAgfQor
CisgIGZ1bmN0aW9uIGFwcGx5TWVyZ2VkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZhbHVl
cykgeworICAgIHZhciBiYXNlVmFsdWUgPSB2YWx1ZXNba2V5XSB8fCBvYmpba2V5XTsKKworICAg
IF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoQXJy
YXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgLy8gdXNlIGNvbmRpdGlvbmFsIHRvIGF2b2lk
IHN0cmluZ2lmeWluZyBldmVyeSB0aW1lCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0
KCdZb3UgcGFzc2VkIGluIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AgYXMgdGhlIHZh
bHVlIGZvciBgJyArIGtleSArICdgIGJ1dCBgJyArIGtleSArICdgIGNhbm5vdCBiZSBhbiBBcnJh
eScsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGlmICghYmFzZVZhbHVlKSB7Cisg
ICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgdmFyIG5ld0Jhc2UgPSBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBiYXNlVmFsdWUpOworICAgIHZhciBoYXNGdW5jdGlvbiA9IGZh
bHNlOworCisgICAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZS5o
YXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAg
ICAgdmFyIHByb3BWYWx1ZSA9IHZhbHVlW3Byb3BdOworICAgICAgaWYgKGlzTWV0aG9kKHByb3BW
YWx1ZSkpIHsKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmb3IgQ29tcHV0ZWQgUHJvcGVydGll
cywgZXRjPworICAgICAgICBoYXNGdW5jdGlvbiA9IHRydWU7CisgICAgICAgIG5ld0Jhc2VbcHJv
cF0gPSBnaXZlTWV0aG9kU3VwZXIob2JqLCBwcm9wLCBwcm9wVmFsdWUsIGJhc2VWYWx1ZSwge30p
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3QmFzZVtwcm9wXSA9IHByb3BWYWx1ZTsKKyAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzRnVuY3Rpb24pIHsKKyAgICAgIG5ld0Jhc2UuX3N1
cGVyID0gUk9PVDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3QmFzZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHZhbHVlLCBtZXRhLCBkZXNjcywg
dmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncykgeworICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9l
bWJlck1ldGFsUHJvcGVydGllcy5EZXNjcmlwdG9yKSB7CisgICAgICBpZiAodmFsdWUgPT09IFJF
UVVJUkVEICYmIGRlc2NzW2tleV0pIHsKKyAgICAgICAgcmV0dXJuIENPTlRJTlVFOworICAgICAg
fQorCisgICAgICAvLyBXcmFwIGRlc2NyaXB0b3IgZnVuY3Rpb24gdG8gaW1wbGVtZW50CisgICAg
ICAvLyBfc3VwZXIoKSBpZiBuZWVkZWQKKyAgICAgIGlmICh2YWx1ZS5fZ2V0dGVyKSB7CisgICAg
ICAgIHZhbHVlID0gZ2l2ZURlc2NyaXB0b3JTdXBlcihtZXRhLCBrZXksIHZhbHVlLCB2YWx1ZXMs
IGRlc2NzLCBiYXNlKTsKKyAgICAgIH0KKworICAgICAgZGVzY3Nba2V5XSA9IHZhbHVlOworICAg
ICAgdmFsdWVzW2tleV0gPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjb25j
YXRzICYmIGNvbmNhdHMuaW5kZXhPZihrZXkpID49IDAgfHwga2V5ID09PSAnY29uY2F0ZW5hdGVk
UHJvcGVydGllcycgfHwga2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycpIHsKKyAgICAgICAgdmFs
dWUgPSBhcHBseUNvbmNhdGVuYXRlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2YWx1ZSwgdmFsdWVz
KTsKKyAgICAgIH0gZWxzZSBpZiAobWVyZ2luZ3MgJiYgbWVyZ2luZ3MuaW5kZXhPZihrZXkpID49
IDApIHsKKyAgICAgICAgdmFsdWUgPSBhcHBseU1lcmdlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2
YWx1ZSwgdmFsdWVzKTsKKyAgICAgIH0gZWxzZSBpZiAoaXNNZXRob2QodmFsdWUpKSB7CisgICAg
ICAgIHZhbHVlID0gZ2l2ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcywgZGVz
Y3MpOworICAgICAgfQorCisgICAgICBkZXNjc1trZXldID0gdW5kZWZpbmVkOworICAgICAgdmFs
dWVzW2tleV0gPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBtZXJnZU1peGlucyht
aXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UsIGtleXMpIHsKKyAgICB2YXIgY3VycmVudE1p
eGluLCBwcm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywgbWV0YTsKKworICAgIGZ1bmN0aW9u
IHJlbW92ZUtleXMoa2V5TmFtZSkgeworICAgICAgZGVsZXRlIGRlc2NzW2tleU5hbWVdOworICAg
ICAgZGVsZXRlIHZhbHVlc1trZXlOYW1lXTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBpID0gMCwg
bCA9IG1peGlucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGN1cnJlbnRNaXhpbiA9IG1p
eGluc1tpXTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdFeHBlY3RlZCBoYXNoIG9y
IE1peGluIGluc3RhbmNlLCBnb3QgJyArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChj
dXJyZW50TWl4aW4pLCB0eXBlb2YgY3VycmVudE1peGluID09PSAnb2JqZWN0JyAmJiBjdXJyZW50
TWl4aW4gIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGN1cnJlbnRN
aXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOworCisgICAgICBwcm9wcyA9IG1peGluUHJvcGVy
dGllcyhtLCBjdXJyZW50TWl4aW4pOworICAgICAgaWYgKHByb3BzID09PSBDT05USU5VRSkgewor
ICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb3BzKSB7CisgICAgICAg
IG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEubWV0YShiYXNlKTsKKyAgICAgICAgaWYgKGJhc2Uud2ls
bE1lcmdlTWl4aW4pIHsKKyAgICAgICAgICBiYXNlLndpbGxNZXJnZU1peGluKHByb3BzKTsKKyAg
ICAgICAgfQorICAgICAgICBjb25jYXRzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdj
b25jYXRlbmF0ZWRQcm9wZXJ0aWVzJywgcHJvcHMsIHZhbHVlcywgYmFzZSk7CisgICAgICAgIG1l
cmdpbmdzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdtZXJnZWRQcm9wZXJ0aWVzJywg
cHJvcHMsIHZhbHVlcywgYmFzZSk7CisKKyAgICAgICAgZm9yIChrZXkgaW4gcHJvcHMpIHsKKyAg
ICAgICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBrZXlzLnB1c2goa2V5KTsKKyAgICAgICAg
ICBhZGROb3JtYWxpemVkUHJvcGVydHkoYmFzZSwga2V5LCBwcm9wc1trZXldLCBtZXRhLCBkZXNj
cywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5ncyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBt
YW51YWxseSBjb3B5IHRvU3RyaW5nKCkgYmVjYXVzZSBzb21lIEpTIGVuZ2luZXMgZG8gbm90IGVu
dW1lcmF0ZSBpdAorICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykp
IHsKKyAgICAgICAgICBiYXNlLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7CisgICAgICAgIH0K
KyAgICAgIH0gZWxzZSBpZiAoY3VycmVudE1peGluLm1peGlucykgeworICAgICAgICBtZXJnZU1p
eGlucyhjdXJyZW50TWl4aW4ubWl4aW5zLCBtLCBkZXNjcywgdmFsdWVzLCBiYXNlLCBrZXlzKTsK
KyAgICAgICAgaWYgKGN1cnJlbnRNaXhpbi5fd2l0aG91dCkgeworICAgICAgICAgIGN1cnJlbnRN
aXhpbi5fd2l0aG91dC5mb3JFYWNoKHJlbW92ZUtleXMpOworICAgICAgICB9CisgICAgICB9Cisg
ICAgfQorICB9CisKKyAgdmFyIElTX0JJTkRJTkcgPSAvXi4rQmluZGluZyQvOworCisgIGZ1bmN0
aW9uIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBtKSB7CisgICAgaWYgKElTX0JJTkRJ
TkcudGVzdChrZXkpKSB7CisgICAgICBtLndyaXRlQmluZGluZ3Moa2V5LCB2YWx1ZSk7CisgICAg
fQorICB9CisKKyAgZnVuY3Rpb24gY29ubmVjdFN0cmVhbUJpbmRpbmcob2JqLCBrZXksIHN0cmVh
bSkgeworICAgIHZhciBvbk5vdGlmeSA9IGZ1bmN0aW9uIChzdHJlYW0pIHsKKyAgICAgIF9lbWJl
ck1ldGFsT2JzZXJ2ZXIuX3N1c3BlbmRPYnNlcnZlcihvYmosIGtleSwgbnVsbCwgZGlkQ2hhbmdl
LCBmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnRyeVNldChv
YmosIGtleSwgc3RyZWFtLnZhbHVlKCkpOworICAgICAgfSk7CisgICAgfTsKKworICAgIHZhciBk
aWRDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICBzdHJlYW0uc2V0VmFsdWUoX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iaiwga2V5KSwgb25Ob3RpZnkpOworICAgIH07CisKKyAgICAv
LyBJbml0aWFsaXplIHZhbHVlCisgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KG9iaiwg
a2V5LCBzdHJlYW0udmFsdWUoKSk7CisKKyAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2Vy
dmVyKG9iaiwga2V5LCBudWxsLCBkaWRDaGFuZ2UpOworCisgICAgc3RyZWFtLnN1YnNjcmliZShv
bk5vdGlmeSk7CisKKyAgICBpZiAob2JqLl9zdHJlYW1CaW5kaW5nU3Vic2NyaXB0aW9ucyA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICBvYmouX3N0cmVhbUJpbmRpbmdTdWJzY3JpcHRpb25zID0gbmV3
IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICB9CisKKyAgICBvYmouX3N0
cmVhbUJpbmRpbmdTdWJzY3JpcHRpb25zW2tleV0gPSBvbk5vdGlmeTsKKyAgfQorCisgIGZ1bmN0
aW9uIGNvbm5lY3RCaW5kaW5ncyhvYmosIG0pIHsKKyAgICAvLyBUT0RPIE1peGluLmFwcGx5KGlu
c3RhbmNlKSBzaG91bGQgZGlzY29ubmVjdCBiaW5kaW5nIGlmIGV4aXN0cworICAgIG0uZm9yRWFj
aEJpbmRpbmdzKGZ1bmN0aW9uIChrZXksIGJpbmRpbmcpIHsKKyAgICAgIGlmIChiaW5kaW5nKSB7
CisgICAgICAgIHZhciB0byA9IGtleS5zbGljZSgwLCAtNyk7IC8vIHN0cmlwIEJpbmRpbmcgb2Zm
IGVuZAorICAgICAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0oYmluZGlu
ZykpIHsKKyAgICAgICAgICBjb25uZWN0U3RyZWFtQmluZGluZyhvYmosIHRvLCBiaW5kaW5nKTsK
KyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9m
IF9lbWJlck1ldGFsQmluZGluZy5CaW5kaW5nKSB7CisgICAgICAgICAgYmluZGluZyA9IGJpbmRp
bmcuY29weSgpOyAvLyBjb3B5IHByb3RvdHlwZXMnIGluc3RhbmNlCisgICAgICAgICAgYmluZGlu
Zy50byh0byk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gYmluZGluZyBpcyBzdHJp
bmcgcGF0aAorICAgICAgICAgIGJpbmRpbmcgPSBuZXcgX2VtYmVyTWV0YWxCaW5kaW5nLkJpbmRp
bmcodG8sIGJpbmRpbmcpOworICAgICAgICB9CisgICAgICAgIGJpbmRpbmcuY29ubmVjdChvYmop
OworICAgICAgICBvYmpba2V5XSA9IGJpbmRpbmc7CisgICAgICB9CisgICAgfSk7CisgICAgLy8g
bWFyayBhcyBhcHBsaWVkCisgICAgbS5jbGVhckJpbmRpbmdzKCk7CisgIH0KKworICBmdW5jdGlv
biBmaW5pc2hQYXJ0aWFsKG9iaiwgbSkgeworICAgIGNvbm5lY3RCaW5kaW5ncyhvYmosIG0gfHwg
X2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKSk7CisgICAgcmV0dXJuIG9iajsKKyAgfQorCisgIGZ1
bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcykgeworICAgIHZh
ciBhbHRLZXkgPSBkZXNjLm1ldGhvZE5hbWU7CisgICAgdmFyIHZhbHVlOworICAgIHZhciBwb3Nz
aWJsZURlc2M7CisgICAgaWYgKGRlc2NzW2FsdEtleV0gfHwgdmFsdWVzW2FsdEtleV0pIHsKKyAg
ICAgIHZhbHVlID0gdmFsdWVzW2FsdEtleV07CisgICAgICBkZXNjID0gZGVzY3NbYWx0S2V5XTsK
KyAgICB9IGVsc2UgaWYgKChwb3NzaWJsZURlc2MgPSBvYmpbYWx0S2V5XSkgJiYgcG9zc2libGVE
ZXNjICE9PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3Np
YmxlRGVzYy5pc0Rlc2NyaXB0b3IpIHsKKyAgICAgIGRlc2MgPSBwb3NzaWJsZURlc2M7CisgICAg
ICB2YWx1ZSA9IHVuZGVmaW5lZDsKKyAgICB9IGVsc2UgeworICAgICAgZGVzYyA9IHVuZGVmaW5l
ZDsKKyAgICAgIHZhbHVlID0gb2JqW2FsdEtleV07CisgICAgfQorCisgICAgcmV0dXJuIHsgZGVz
YzogZGVzYywgdmFsdWU6IHZhbHVlIH07CisgIH0KKworICBmdW5jdGlvbiB1cGRhdGVPYnNlcnZl
cnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lciwgcGF0aHNLZXksIHVw
ZGF0ZU1ldGhvZCkgeworICAgIHZhciBwYXRocyA9IG9ic2VydmVyT3JMaXN0ZW5lcltwYXRoc0tl
eV07CisKKyAgICBpZiAocGF0aHMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aHMu
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHVwZGF0ZU1ldGhvZChvYmosIHBhdGhzW2ld
LCBudWxsLCBrZXkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlcGxhY2VP
YnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lcikgeworICAg
IHZhciBwcmV2ID0gb2JqW2tleV07CisKKyAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHBy
ZXYpIHsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgcHJldiwg
J19fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXycsIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3JlbW92ZUJl
Zm9yZU9ic2VydmVyKTsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtl
eSwgcHJldiwgJ19fZW1iZXJfb2JzZXJ2ZXNfXycsIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3Zl
T2JzZXJ2ZXIpOworICAgICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBw
cmV2LCAnX19lbWJlcl9saXN0ZW5zX18nLCBfZW1iZXJNZXRhbEV2ZW50cy5yZW1vdmVMaXN0ZW5l
cik7CisgICAgfQorCisgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYnNlcnZlck9yTGlz
dGVuZXIpIHsKKyAgICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgb2Jz
ZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fJywgX2VtYmVyTWV0YWxP
YnNlcnZlci5fYWRkQmVmb3JlT2JzZXJ2ZXIpOworICAgICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlz
dGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVyX29ic2VydmVzX18n
LCBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKTsKKyAgICAgIHVwZGF0ZU9ic2VydmVy
c0FuZExpc3RlbmVycyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9saXN0
ZW5zX18nLCBfZW1iZXJNZXRhbEV2ZW50cy5hZGRMaXN0ZW5lcik7CisgICAgfQorICB9CisKKyAg
ZnVuY3Rpb24gYXBwbHlNaXhpbihvYmosIG1peGlucywgcGFydGlhbCkgeworICAgIHZhciBkZXNj
cyA9IHt9OworICAgIHZhciB2YWx1ZXMgPSB7fTsKKyAgICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0
YS5tZXRhKG9iaik7CisgICAgdmFyIGtleXMgPSBbXTsKKyAgICB2YXIga2V5LCB2YWx1ZSwgZGVz
YzsKKworICAgIG9iai5fc3VwZXIgPSBST09UOworCisgICAgLy8gR28gdGhyb3VnaCBhbGwgbWl4
aW5zIGFuZCBoYXNoZXMgcGFzc2VkIGluLCBhbmQ6CisgICAgLy8KKyAgICAvLyAqIEhhbmRsZSBj
b25jYXRlbmF0ZWQgcHJvcGVydGllcworICAgIC8vICogSGFuZGxlIG1lcmdlZCBwcm9wZXJ0aWVz
CisgICAgLy8gKiBTZXQgdXAgX3N1cGVyIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeQorICAgIC8vICog
U2V0IHVwIGNvbXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCisgICAgLy8gKiBDb3B5aW5nIGB0
b1N0cmluZ2AgaW4gYnJva2VuIGJyb3dzZXJzCisgICAgbWVyZ2VNaXhpbnMobWl4aW5zLCBtLCBk
ZXNjcywgdmFsdWVzLCBvYmosIGtleXMpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlz
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAga2V5ID0ga2V5c1tpXTsKKyAgICAgIGlmIChr
ZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwgIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Cisg
ICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBkZXNjID0gZGVzY3Nba2V5XTsKKyAg
ICAgIHZhbHVlID0gdmFsdWVzW2tleV07CisKKyAgICAgIGlmIChkZXNjID09PSBSRVFVSVJFRCkg
eworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGRlc2MgJiYgZGVz
YyBpbnN0YW5jZW9mIEFsaWFzKSB7CisgICAgICAgIHZhciBmb2xsb3dlZCA9IGZvbGxvd0FsaWFz
KG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcyk7CisgICAgICAgIGRlc2MgPSBmb2xsb3dlZC5k
ZXNjOworICAgICAgICB2YWx1ZSA9IGZvbGxvd2VkLnZhbHVlOworICAgICAgfQorCisgICAgICBp
ZiAoZGVzYyA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAg
Y29udGludWU7CisgICAgICB9CisKKyAgICAgIHJlcGxhY2VPYnNlcnZlcnNBbmRMaXN0ZW5lcnMo
b2JqLCBrZXksIHZhbHVlKTsKKyAgICAgIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBt
KTsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwg
ZGVzYywgdmFsdWUsIG0pOworICAgIH0KKworICAgIGlmICghcGFydGlhbCkgeworICAgICAgLy8g
ZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBlCisgICAgICBmaW5pc2hQYXJ0aWFsKG9iaiwgbSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG9iajsKKyAgfQorCisgIC8qKgorICAgIEBtZXRob2QgbWl4aW4K
KyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJhbSBtaXhpbnMqCisgICAg
QHJldHVybiBvYmoKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIG1peGluKG9iaikg
eworICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xl
biA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykgewor
ICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgfQorCisgICAgYXBw
bHlNaXhpbihvYmosIGFyZ3MsIGZhbHNlKTsKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgLyoq
CisgICAgVGhlIGBFbWJlci5NaXhpbmAgY2xhc3MgYWxsb3dzIHlvdSB0byBjcmVhdGUgbWl4aW5z
LCB3aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZQorICAgIGFkZGVkIHRvIG90aGVyIGNsYXNzZXMuIEZv
ciBpbnN0YW5jZSwKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5FZGl0YWJsZSA9IEVt
YmVyLk1peGluLmNyZWF0ZSh7CisgICAgICBlZGl0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgY29u
c29sZS5sb2coJ3N0YXJ0aW5nIHRvIGVkaXQnKTsKKyAgICAgICAgdGhpcy5zZXQoJ2lzRWRpdGlu
ZycsIHRydWUpOworICAgICAgfSwKKyAgICAgIGlzRWRpdGluZzogZmFsc2UKKyAgICB9KTsKKyAg
CisgICAgLy8gTWl4IG1peGlucyBpbnRvIGNsYXNzZXMgYnkgcGFzc2luZyB0aGVtIGFzIHRoZSBm
aXJzdCBhcmd1bWVudHMgdG8KKyAgICAvLyAuZXh0ZW5kLgorICAgIEFwcC5Db21tZW50VmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEFwcC5FZGl0YWJsZSwgeworICAgICAgdGVtcGxhdGU6IEVtYmVy
LkhhbmRsZWJhcnMuY29tcGlsZSgne3sjaWYgdmlldy5pc0VkaXRpbmd9fS4uLnt7ZWxzZX19Li4u
e3svaWZ9fScpCisgICAgfSk7CisgIAorICAgIGNvbW1lbnRWaWV3ID0gQXBwLkNvbW1lbnRWaWV3
LmNyZWF0ZSgpOworICAgIGNvbW1lbnRWaWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRpbmcg
dG8gZWRpdCcKKyAgICBgYGAKKyAgCisgICAgTm90ZSB0aGF0IE1peGlucyBhcmUgY3JlYXRlZCB3
aXRoIGBFbWJlci5NaXhpbi5jcmVhdGVgLCBub3QKKyAgICBgRW1iZXIuTWl4aW4uZXh0ZW5kYC4K
KyAgCisgICAgTm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlw
ZSBzbyBhcnJheXMgYW5kIG9iamVjdCBsaXRlcmFscworICAgIGRlZmluZWQgYXMgcHJvcGVydGll
cyB3aWxsIGJlIHNoYXJlZCBhbW9uZ3N0IG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIG1peGlu
LgorICAgIElmIHlvdSB3YW50IHRvIGRlZmluZSBhIHByb3BlcnR5IGluIGEgbWl4aW4gdGhhdCBp
cyBub3Qgc2hhcmVkLCB5b3UgY2FuIGRlZmluZQorICAgIGl0IGVpdGhlciBhcyBhIGNvbXB1dGVk
IHByb3BlcnR5IG9yIGhhdmUgaXQgYmUgY3JlYXRlZCBvbiBpbml0aWFsaXphdGlvbiBvZiB0aGUg
b2JqZWN0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy9maWx0ZXJzIGFycmF5IHdpbGwg
YmUgc2hhcmVkIGFtb25nc3QgYW55IG9iamVjdCBpbXBsZW1lbnRpbmcgbWl4aW4KKyAgICBBcHAu
RmlsdGVyYWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CisgICAgICBmaWx0ZXJzOiBFbWJlci5B
KCkKKyAgICB9KTsKKyAgCisgICAgLy9maWx0ZXJzIHdpbGwgYmUgYSBzZXBhcmF0ZSAgYXJyYXkg
Zm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1peGluCisgICAgQXBwLkZpbHRlcmFi
bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgZmlsdGVyczogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7cmV0dXJuIEVtYmVyLkEoKTt9KQorICAgIH0pOworICAKKyAgICAvL2ZpbHRl
cnMgd2lsbCBiZSBjcmVhdGVkIGFzIGEgc2VwYXJhdGUgYXJyYXkgZHVyaW5nIHRoZSBvYmplY3Qn
cyBpbml0aWFsaXphdGlvbgorICAgIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKKyAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLl9zdXBlciguLi5hcmd1
bWVudHMpOworICAgICAgICB0aGlzLnNldCgiZmlsdGVycyIsIEVtYmVyLkEoKSk7CisgICAgICB9
CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBNaXhpbgorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gTWl4aW4oYXJncywgcHJvcGVy
dGllcykgeworICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisKKyAgICB2YXIgbGVu
Z3RoID0gYXJncyAmJiBhcmdzLmxlbmd0aDsKKworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAg
ICB2YXIgbSA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB4ID0gYXJnc1tpXTsKKyAgICAgICAgaWYgKHgg
aW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgICAgIG1baV0gPSB4OworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIG1baV0gPSBuZXcgTWl4aW4odW5kZWZpbmVkLCB4KTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICB0aGlzLm1peGlucyA9IG07CisgICAgfSBlbHNlIHsKKyAgICAgIHRo
aXMubWl4aW5zID0gdW5kZWZpbmVkOworICAgIH0KKyAgICB0aGlzLm93bmVyQ29uc3RydWN0b3Ig
PSB1bmRlZmluZWQ7CisgICAgdGhpcy5fd2l0aG91dCA9IHVuZGVmaW5lZDsKKyAgICB0aGlzW19l
bWJlck1ldGFsVXRpbHMuR1VJRF9LRVldID0gbnVsbDsKKyAgICB0aGlzW19lbWJlck1ldGFsVXRp
bHMuR1VJRF9LRVkgKyAnX25hbWUnXSA9IG51bGw7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZWJ1
Z1NlYWwodGhpcyk7CisgIH0KKworICBNaXhpbi5fYXBwbHkgPSBhcHBseU1peGluOworCisgIE1p
eGluLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uIChvYmopIHsKKyAgICB2YXIgYXJncyA9IGFfc2xp
Y2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBhcHBseU1peGluKG9iaiwgYXJncywg
dHJ1ZSk7CisgIH07CisKKyAgTWl4aW4uZmluaXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7CisK
KyAgLy8gRVM2VE9ETzogdGhpcyByZWxpZXMgb24gYSBnbG9iYWwgc3RhdGU/CisgIF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0LmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7CisKKyAgLyoqCisg
ICAgQG1ldGhvZCBjcmVhdGUKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIGFyZ3VtZW50cyoKKyAg
ICBAcHVibGljCisgICovCisgIE1peGluLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAvLyBF
UzZUT0RPOiB0aGlzIHJlbGllcyBvbiBhIGdsb2JhbCBzdGF0ZT8KKyAgICBfZW1iZXJNZXRhbENv
cmUuZGVmYXVsdC5hbnlVbnByb2Nlc3NlZE1peGlucyA9IHRydWU7CisgICAgdmFyIE0gPSB0aGlz
OworCisgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHsKKyAgICAgIGFyZ3Nb
X2tleTJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE0oYXJn
cywgdW5kZWZpbmVkKTsKKyAgfTsKKworICB2YXIgTWl4aW5Qcm90b3R5cGUgPSBNaXhpbi5wcm90
b3R5cGU7CisKKyAgLyoqCisgICAgQG1ldGhvZCByZW9wZW4KKyAgICBAcGFyYW0gYXJndW1lbnRz
KgorICAgIEBwcml2YXRlCisgICovCisgIE1peGluUHJvdG90eXBlLnJlb3BlbiA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB2YXIgY3VycmVudE1peGluOworCisgICAgaWYgKHRoaXMucHJvcGVydGllcykg
eworICAgICAgY3VycmVudE1peGluID0gbmV3IE1peGluKHVuZGVmaW5lZCwgdGhpcy5wcm9wZXJ0
aWVzKTsKKyAgICAgIHRoaXMucHJvcGVydGllcyA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMubWl4
aW5zID0gW2N1cnJlbnRNaXhpbl07CisgICAgfSBlbHNlIGlmICghdGhpcy5taXhpbnMpIHsKKyAg
ICAgIHRoaXMubWl4aW5zID0gW107CisgICAgfQorCisgICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5s
ZW5ndGg7CisgICAgdmFyIG1peGlucyA9IHRoaXMubWl4aW5zOworICAgIHZhciBpZHg7CisKKyAg
ICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICAgIGN1cnJlbnRNaXhpbiA9
IGFyZ3VtZW50c1tpZHhdOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0V4cGVjdGVk
IGhhc2ggb3IgTWl4aW4gaW5zdGFuY2UsIGdvdCAnICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu
Zy5jYWxsKGN1cnJlbnRNaXhpbiksIHR5cGVvZiBjdXJyZW50TWl4aW4gPT09ICdvYmplY3QnICYm
IGN1cnJlbnRNaXhpbiAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
Y3VycmVudE1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7CisKKyAgICAgIGlmIChjdXJyZW50
TWl4aW4gaW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgICBtaXhpbnMucHVzaChjdXJyZW50TWl4
aW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWl4aW5zLnB1c2gobmV3IE1peGluKHVuZGVm
aW5lZCwgY3VycmVudE1peGluKSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7
CisgIH07CisKKyAgLyoqCisgICAgQG1ldGhvZCBhcHBseQorICAgIEBwYXJhbSBvYmoKKyAgICBA
cmV0dXJuIGFwcGxpZWQgb2JqZWN0CisgICAgQHByaXZhdGUKKyAgKi8KKyAgTWl4aW5Qcm90b3R5
cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBb
dGhpc10sIGZhbHNlKTsKKyAgfTsKKworICBNaXhpblByb3RvdHlwZS5hcHBseVBhcnRpYWwgPSBm
dW5jdGlvbiAob2JqKSB7CisgICAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBbdGhpc10sIHRydWUp
OworICB9OworCisgIE1peGluUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gTWl4aW5fdG9T
dHJpbmcoKSB7CisgICAgcmV0dXJuICcodW5rbm93biBtaXhpbiknOworICB9OworCisgIGZ1bmN0
aW9uIF9kZXRlY3QoY3VyTWl4aW4sIHRhcmdldE1peGluLCBzZWVuKSB7CisgICAgdmFyIGd1aWQg
PSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IoY3VyTWl4aW4pOworCisgICAgaWYgKHNlZW5bZ3Vp
ZF0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2VlbltndWlkXSA9IHRydWU7
CisKKyAgICBpZiAoY3VyTWl4aW4gPT09IHRhcmdldE1peGluKSB7CisgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgdmFyIG1peGlucyA9IGN1ck1peGluLm1peGluczsKKyAgICB2YXIgbG9j
ID0gbWl4aW5zID8gbWl4aW5zLmxlbmd0aCA6IDA7CisgICAgd2hpbGUgKC0tbG9jID49IDApIHsK
KyAgICAgIGlmIChfZGV0ZWN0KG1peGluc1tsb2NdLCB0YXJnZXRNaXhpbiwgc2VlbikpIHsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAg
fQorCisgIC8qKgorICAgIEBtZXRob2QgZGV0ZWN0CisgICAgQHBhcmFtIG9iagorICAgIEByZXR1
cm4ge0Jvb2xlYW59CisgICAgQHByaXZhdGUKKyAgKi8KKyAgTWl4aW5Qcm90b3R5cGUuZGV0ZWN0
ID0gZnVuY3Rpb24gKG9iaikgeworICAgIGlmICghb2JqKSB7CisgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIGlmIChvYmogaW5zdGFuY2VvZiBNaXhpbikgeworICAgICAgcmV0dXJuIF9k
ZXRlY3Qob2JqLCB0aGlzLCB7fSk7CisgICAgfQorICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRh
LnBlZWtNZXRhKG9iaik7CisgICAgaWYgKCFtKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIHJldHVybiAhIW0ucGVla01peGlucyhfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhp
cykpOworICB9OworCisgIE1peGluUHJvdG90eXBlLndpdGhvdXQgPSBmdW5jdGlvbiAoKSB7Cisg
ICAgdmFyIHJldCA9IG5ldyBNaXhpbihbdGhpc10pOworCisgICAgZm9yICh2YXIgX2xlbjMgPSBh
cmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwg
X2xlbjM7IF9rZXkzKyspIHsKKyAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTsK
KyAgICB9CisKKyAgICByZXQuX3dpdGhvdXQgPSBhcmdzOworICAgIHJldHVybiByZXQ7CisgIH07
CisKKyAgZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgeworICAgIGlmIChzZWVuW19l
bWJlck1ldGFsVXRpbHMuZ3VpZEZvcihtaXhpbildKSB7CisgICAgICByZXR1cm47CisgICAgfQor
ICAgIHNlZW5bX2VtYmVyTWV0YWxVdGlscy5ndWlkRm9yKG1peGluKV0gPSB0cnVlOworCisgICAg
aWYgKG1peGluLnByb3BlcnRpZXMpIHsKKyAgICAgIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKG1p
eGluLnByb3BlcnRpZXMpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7
IGkrKykgeworICAgICAgICB2YXIga2V5ID0gcHJvcHNbaV07CisgICAgICAgIHJldFtrZXldID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1peGluLm1peGlucykgeworICAgICAgbWl4
aW4ubWl4aW5zLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgcmV0dXJuIF9rZXlzKHJl
dCwgeCwgc2Vlbik7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBNaXhpblByb3RvdHlwZS5r
ZXlzID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBrZXlzID0ge307CisgICAgdmFyIHNlZW4gPSB7
fTsKKworICAgIF9rZXlzKGtleXMsIHRoaXMsIHNlZW4pOworICAgIHZhciByZXQgPSBPYmplY3Qu
a2V5cyhrZXlzKTsKKyAgICByZXR1cm4gcmV0OworICB9OworCisgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKE1peGluUHJvdG90eXBlKTsKKworICAvLyByZXR1cm5zIHRoZSBtaXhpbnMgY3Vy
cmVudGx5IGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QKKyAgLy8gVE9ETzogTWFrZSBF
bWJlci5taXhpbgorICBNaXhpbi5taXhpbnMgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgdmFyIG0g
PSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICB2YXIgcmV0ID0gW107CisgICAg
aWYgKCFtKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG0uZm9yRWFjaE1peGlu
cyhmdW5jdGlvbiAoa2V5LCBjdXJyZW50TWl4aW4pIHsKKyAgICAgIC8vIHNraXAgcHJpbWl0aXZl
IG1peGlucyBzaW5jZSB0aGVzZSBhcmUgYWx3YXlzIGFub255bW91cworICAgICAgaWYgKCFjdXJy
ZW50TWl4aW4ucHJvcGVydGllcykgeworICAgICAgICByZXQucHVzaChjdXJyZW50TWl4aW4pOwor
ICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIHJldDsKKyAgfTsKKworICBleHBvcnRzLlJF
UVVJUkVEID0gUkVRVUlSRUQgPSBuZXcgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLkRlc2NyaXB0b3Io
KTsKKyAgUkVRVUlSRUQudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICcoUmVx
dWlyZWQgUHJvcGVydHkpJzsKKyAgfTsKKworICAvKioKKyAgICBEZW5vdGVzIGEgcmVxdWlyZWQg
cHJvcGVydHkgZm9yIGEgbWl4aW4KKyAgCisgICAgQG1ldGhvZCByZXF1aXJlZAorICAgIEBmb3Ig
RW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlcXVpcmVkKCkgeworICAg
IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdFbWJlci5yZXF1aXJlZCBpcyBkZXByZWNhdGVk
IGFzIGl0cyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgYW5kIHVucmVsaWFibGUuJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1tZXRhbC5yZXF1aXJlZCcsIHVudGlsOiAnMy4wLjAnIH0pOworICAgIHJl
dHVybiBSRVFVSVJFRDsKKyAgfQorCisgIGZ1bmN0aW9uIEFsaWFzKG1ldGhvZE5hbWUpIHsKKyAg
ICB0aGlzLmlzRGVzY3JpcHRvciA9IHRydWU7CisgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9k
TmFtZTsKKyAgfQorCisgIEFsaWFzLnByb3RvdHlwZSA9IG5ldyBfZW1iZXJNZXRhbFByb3BlcnRp
ZXMuRGVzY3JpcHRvcigpOworCisgIC8qKgorICAgIE1ha2VzIGEgbWV0aG9kIGF2YWlsYWJsZSB2
aWEgYW4gYWRkaXRpb25hbCBuYW1lLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBl
cnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgbmFtZTogZnVuY3Rpb24oKSB7Cisg
ICAgICAgIHJldHVybiAnVG9taHVkYSBLYXR6ZGFsZSc7CisgICAgICB9LAorICAgICAgbW9uaWtl
cjogRW1iZXIuYWxpYXNNZXRob2QoJ25hbWUnKQorICAgIH0pOworICAKKyAgICB2YXIgZ29vZEd1
eSA9IEFwcC5QZXJzb24uY3JlYXRlKCk7CisgIAorICAgIGdvb2RHdXkubmFtZSgpOyAgICAvLyAn
VG9taHVkYSBLYXR6ZGFsZScKKyAgICBnb29kR3V5Lm1vbmlrZXIoKTsgLy8gJ1RvbWh1ZGEgS2F0
emRhbGUnCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgYWxpYXNNZXRob2QKKyAgICBAZm9yIEVt
YmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIHRv
IGFsaWFzCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGFsaWFzTWV0aG9kKG1ldGhv
ZE5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOworICB9CisKKyAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgorICAvLyBPQlNFUlZFUiBIRUxQRVIKKyAgLy8KKworICAvKioKKyAgICBTcGVjaWZ5IGEgbWV0
aG9kIHRoYXQgb2JzZXJ2ZXMgcHJvcGVydHkgY2hhbmdlcy4KKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgdmFsdWVPYnNlcnZlcjogRW1iZXIu
b2JzZXJ2ZXIoJ3ZhbHVlJywgZnVuY3Rpb24oKSB7CisgICAgICAgIC8vIEV4ZWN1dGVzIHdoZW5l
dmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICAgIH0pCisgICAgfSk7CisgICAg
YGBgCisgIAorICAgIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2
ZXNgIGlmIHByb3RvdHlwZSBleHRlbnNpb25zIGFyZQorICAgIGVuYWJsZWQuCisgIAorICAgIEBt
ZXRob2Qgb2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3Bl
cnR5TmFtZXMqCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYworICAgIEByZXR1cm4gZnVuYwor
ICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBvYnNlcnZlcigpIHsKKyAgICBmb3IgKHZh
ciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0g
MDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykgeworICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVu
dHNbX2tleTRdOworICAgIH0KKworICAgIHZhciBmdW5jID0gYXJncy5zbGljZSgtMSlbMF07Cisg
ICAgdmFyIHBhdGhzOworCisgICAgdmFyIGFkZFdhdGNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChw
YXRoKSB7CisgICAgICBwYXRocy5wdXNoKHBhdGgpOworICAgIH07CisgICAgdmFyIF9wYXRocyA9
IGFyZ3Muc2xpY2UoMCwgLTEpOworCisgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24n
KSB7CisgICAgICAvLyByZXZlcnQgdG8gb2xkLCBzb2Z0LWRlcHJlY2F0ZWQgYXJndW1lbnQgb3Jk
ZXJpbmcKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdQYXNzaW5nIHRoZSBkZXBl
bmRlbnRLZXlzIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbiBFbWJlci5vYnNlcnZlciBp
cyBkZXByZWNhdGVkLiBFbnN1cmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBsYXN0IGFy
Z3VtZW50LicsIGZhbHNlLCB7IGlkOiAnZW1iZXItbWV0YWwub2JzZXJ2ZXItYXJndW1lbnQtb3Jk
ZXInLCB1bnRpbDogJzMuMC4wJyB9KTsKKworICAgICAgZnVuYyA9IGFyZ3NbMF07CisgICAgICBf
cGF0aHMgPSBhcmdzLnNsaWNlKDEpOworICAgIH0KKworICAgIHBhdGhzID0gW107CisKKyAgICBm
b3IgKHZhciBpID0gMDsgaSA8IF9wYXRocy5sZW5ndGg7ICsraSkgeworICAgICAgX2VtYmVyTWV0
YWxFeHBhbmRfcHJvcGVydGllcy5kZWZhdWx0KF9wYXRoc1tpXSwgYWRkV2F0Y2hlZFByb3BlcnR5
KTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHsKKyAgICAg
IHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ0VtYmVyLm9ic2VydmVyIGNhbGxl
ZCB3aXRob3V0IGEgZnVuY3Rpb24nKTsKKyAgICB9CisKKyAgICBmdW5jLl9fZW1iZXJfb2JzZXJ2
ZXNfXyA9IHBhdGhzOworICAgIHJldHVybiBmdW5jOworICB9CisKKyAgLyoqCisgICAgU3BlY2lm
eSBhIG1ldGhvZCB0aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHZhbHVlT2JzZXJ2ZXI6
IEVtYmVyLmltbWVkaWF0ZU9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgeworICAgICAgICAv
LyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCisgICAgICB9
KQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBJbiB0aGUgZnV0dXJlLCBgRW1iZXIub2JzZXJ2
ZXJgIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0aGlzIGV2ZW50LAorICAgIGBFbWJlci5p
bW1lZGlhdGVPYnNlcnZlcmAgd2lsbCBtYWludGFpbiB0aGUgc3luY2hyb25vdXMgYmVoYXZpb3Iu
CisgIAorICAgIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNJ
bW1lZGlhdGVseWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgICAgZW5hYmxlZC4KKyAg
CisgICAgQG1ldGhvZCBfaW1tZWRpYXRlT2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBh
cmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYwor
ICAgIEBkZXByZWNhdGVkIFVzZSBgRW1iZXIub2JzZXJ2ZXJgIGluc3RlYWQuCisgICAgQHJldHVy
biBmdW5jCisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBfaW1tZWRpYXRlT2JzZXJ2
ZXIoKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1VzYWdlIG9mIGBFbWJlci5p
bW1lZGlhdGVPYnNlcnZlcmAgaXMgZGVwcmVjYXRlZCwgdXNlIGBFbWJlci5vYnNlcnZlcmAgaW5z
dGVhZC4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLW1ldGFsLmltbWVkaWF0ZS1vYnNlcnZlcicsIHVu
dGlsOiAnMy4wLjAnIH0pOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldOworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0ltbWVkaWF0ZSBvYnNlcnZlcnMgbXVzdCBvYnNlcnZl
IGludGVybmFsIHByb3BlcnRpZXMgb25seSwgbm90IHByb3BlcnRpZXMgb24gb3RoZXIgb2JqZWN0
cy4nLCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyB8fCBhcmcuaW5kZXhPZignLicpID09PSAtMSk7
CisgICAgfQorCisgICAgcmV0dXJuIG9ic2VydmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cisg
IH0KKworICAvKioKKyAgICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5IGFyZSBjYWxsZWQgd2l0
aCB0aGUgYXJndW1lbnRzIGBvYmpgLCBga2V5TmFtZWAuCisgIAorICAgIE5vdGUsIGBAZWFjaC5w
cm9wZXJ0eWAgb2JzZXJ2ZXIgaXMgY2FsbGVkIHBlciBlYWNoIGFkZCBvciByZXBsYWNlIG9mIGFu
IGVsZW1lbnQKKyAgICBhbmQgaXQncyBub3QgY2FsbGVkIHdpdGggYSBzcGVjaWZpYyBlbnVtZXJh
dGlvbiBpdGVtLgorICAKKyAgICBBIGBfYmVmb3JlT2JzZXJ2ZXJgIGZpcmVzIGJlZm9yZSBhIHBy
b3BlcnR5IGNoYW5nZXMuCisgIAorICAgIEEgYF9iZWZvcmVPYnNlcnZlcmAgaXMgYW4gYWx0ZXJu
YXRpdmUgZm9ybSBvZiBgLm9ic2VydmVzQmVmb3JlKClgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgQXBwLlBlcnNvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBmcmllbmRz
OiBbeyBuYW1lOiAnVG9tJyB9LCB7IG5hbWU6ICdTdGVmYW4nIH0sIHsgbmFtZTogJ0tyaXMnIH1d
LAorICAKKyAgICAgIHZhbHVlRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGVudC52YWx1
ZScsIGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgeworICAgICAgICAgIC8vIG9ubHkgcnVuIGlmIHVw
ZGF0aW5nIGEgdmFsdWUgYWxyZWFkeSBpbiB0aGUgRE9NCisgICAgICAgICAgaWYgKHRoaXMuZ2V0
KCdzdGF0ZScpID09PSAnaW5ET00nKSB7CisgICAgICAgICAgICB2YXIgY29sb3IgPSBvYmouZ2V0
KGtleU5hbWUpID4gdGhpcy5jaGFuZ2luZ0Zyb20gPyAnZ3JlZW4nIDogJ3JlZCc7CisgICAgICAg
ICAgICAvLyBsb2dpYworICAgICAgICAgIH0KKyAgICAgIH0pLAorICAKKyAgICAgIGZyaWVuZHNE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdmcmllbmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKKyAgICAgICAgLy8gc29tZSBsb2dpYworICAgICAgICAvLyBvYmouZ2V0
KGtleU5hbWUpIHJldHVybnMgZnJpZW5kcyBhcnJheQorICAgICAgfSkKKyAgICB9KTsKKyAgICBg
YGAKKyAgCisgICAgQWxzbyBhdmFpbGFibGUgYXMgYEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZl
c0JlZm9yZWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCisgICAgZW5hYmxlZC4KKyAgCisg
ICAgQG1ldGhvZCBiZWZvcmVPYnNlcnZlcgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge1N0
cmluZ30gcHJvcGVydHlOYW1lcyoKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jCisgICAgQHJl
dHVybiBmdW5jCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0
aW9uIF9iZWZvcmVPYnNlcnZlcigpIHsKKyAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5s
ZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tl
eTUrKykgeworICAgICAgYXJnc1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdOworICAgIH0KKwor
ICAgIHZhciBmdW5jID0gYXJncy5zbGljZSgtMSlbMF07CisgICAgdmFyIHBhdGhzOworCisgICAg
dmFyIGFkZFdhdGNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBwYXRocy5w
dXNoKHBhdGgpOworICAgIH07CisKKyAgICB2YXIgX3BhdGhzID0gYXJncy5zbGljZSgwLCAtMSk7
CisKKyAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgIC8vIHJldmVy
dCB0byBvbGQsIHNvZnQtZGVwcmVjYXRlZCBhcmd1bWVudCBvcmRlcmluZworCisgICAgICBmdW5j
ID0gYXJnc1swXTsKKyAgICAgIF9wYXRocyA9IGFyZ3Muc2xpY2UoMSk7CisgICAgfQorCisgICAg
cGF0aHMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3BhdGhzLmxlbmd0aDsgKytp
KSB7CisgICAgICBfZW1iZXJNZXRhbEV4cGFuZF9wcm9wZXJ0aWVzLmRlZmF1bHQoX3BhdGhzW2ld
LCBhZGRXYXRjaGVkUHJvcGVydHkpOworICAgIH0KKworICAgIGlmICh0eXBlb2YgZnVuYyAhPT0g
J2Z1bmN0aW9uJykgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkVy
cm9yKCdFbWJlci5iZWZvcmVPYnNlcnZlciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uJyk7Cisg
ICAgfQorCisgICAgZnVuYy5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsKKyAgICBy
ZXR1cm4gZnVuYzsKKyAgfQorCisgIGV4cG9ydHMuSVNfQklORElORyA9IElTX0JJTkRJTkc7Cisg
IGV4cG9ydHMuTWl4aW4gPSBNaXhpbjsKKyAgZXhwb3J0cy5yZXF1aXJlZCA9IHJlcXVpcmVkOwor
ICBleHBvcnRzLlJFUVVJUkVEID0gUkVRVUlSRUQ7Cit9KTsKKy8vIHdhcm4sIGFzc2VydCwgd3Jh
cCwgZXQ7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVyLW1ldGFsL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxXYXRjaGluZywgX2VtYmVyTWV0YWxFdmVudHMpIHsKKyAgJ3VzZSBzdHJp
Y3QnOworCisgIGV4cG9ydHMuYWRkT2JzZXJ2ZXIgPSBhZGRPYnNlcnZlcjsKKyAgZXhwb3J0cy5v
YnNlcnZlcnNGb3IgPSBvYnNlcnZlcnNGb3I7CisgIGV4cG9ydHMucmVtb3ZlT2JzZXJ2ZXIgPSBy
ZW1vdmVPYnNlcnZlcjsKKyAgZXhwb3J0cy5fYWRkQmVmb3JlT2JzZXJ2ZXIgPSBfYWRkQmVmb3Jl
T2JzZXJ2ZXI7CisgIGV4cG9ydHMuX3N1c3BlbmRPYnNlcnZlciA9IF9zdXNwZW5kT2JzZXJ2ZXI7
CisgIGV4cG9ydHMuX3N1c3BlbmRPYnNlcnZlcnMgPSBfc3VzcGVuZE9ic2VydmVyczsKKyAgZXhw
b3J0cy5fcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIgPSBfcmVtb3ZlQmVmb3JlT2JzZXJ2ZXI7CisKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICB2YXIgQUZURVJfT0JTRVJWRVJT
ID0gJzpjaGFuZ2UnOworICB2YXIgQkVGT1JFX09CU0VSVkVSUyA9ICc6YmVmb3JlJzsKKworICBm
dW5jdGlvbiBjaGFuZ2VFdmVudChrZXlOYW1lKSB7CisgICAgcmV0dXJuIGtleU5hbWUgKyBBRlRF
Ul9PQlNFUlZFUlM7CisgIH0KKworICBmdW5jdGlvbiBiZWZvcmVFdmVudChrZXlOYW1lKSB7Cisg
ICAgcmV0dXJuIGtleU5hbWUgKyBCRUZPUkVfT0JTRVJWRVJTOworICB9CisKKyAgLyoqCisgICAg
QG1ldGhvZCBhZGRPYnNlcnZlcgorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAg
QHBhcmFtIHtTdHJpbmd9IF9wYXRoCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdl
dAorICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQorICAgIEBwdWJsaWMKKyAg
Ki8KKworICBmdW5jdGlvbiBhZGRPYnNlcnZlcihvYmosIF9wYXRoLCB0YXJnZXQsIG1ldGhvZCkg
eworICAgIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3Bh
dGgpLCB0YXJnZXQsIG1ldGhvZCk7CisgICAgX2VtYmVyTWV0YWxXYXRjaGluZy53YXRjaChvYmos
IF9wYXRoKTsKKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZnVuY3Rpb24gb2JzZXJ2ZXJz
Rm9yKG9iaiwgcGF0aCkgeworICAgIHJldHVybiBfZW1iZXJNZXRhbEV2ZW50cy5saXN0ZW5lcnNG
b3Iob2JqLCBjaGFuZ2VFdmVudChwYXRoKSk7CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIHJl
bW92ZU9ic2VydmVyCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0g
e1N0cmluZ30gcGF0aAorICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQKKyAgICBA
cGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KKyAgICBAcHVibGljCisgICovCisKKyAg
ZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXIob2JqLCBwYXRoLCB0YXJnZXQsIG1ldGhvZCkgeworICAg
IF9lbWJlck1ldGFsV2F0Y2hpbmcudW53YXRjaChvYmosIHBhdGgpOworICAgIF9lbWJlck1ldGFs
RXZlbnRzLnJlbW92ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0
aG9kKTsKKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAgQG1ldGhvZCBfYWRk
QmVmb3JlT2JzZXJ2ZXIKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIG9iagorICAgIEBwYXJh
bSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldAorICAg
IEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQorICAgIEBkZXByZWNhdGVkCisgICAg
QHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBfYWRkQmVmb3JlT2JzZXJ2ZXIob2JqLCBwYXRo
LCB0YXJnZXQsIG1ldGhvZCkgeworICAgIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyKG9i
aiwgYmVmb3JlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kKTsKKyAgICBfZW1iZXJNZXRhbFdh
dGNoaW5nLndhdGNoKG9iaiwgcGF0aCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8v
IFN1c3BlbmQgb2JzZXJ2ZXIgZHVyaW5nIGNhbGxiYWNrLgorICAvLworICAvLyBUaGlzIHNob3Vs
ZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHRhcmdldCBvZiB0aGUgb2JzZXJ2ZXIKKyAgLy8gd2hpbGUg
aXQgaXMgc2V0dGluZyB0aGUgb2JzZXJ2ZWQgcGF0aC4KKworICBmdW5jdGlvbiBfc3VzcGVuZE9i
c2VydmVyKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJu
IF9lbWJlck1ldGFsRXZlbnRzLnN1c3BlbmRMaXN0ZW5lcihvYmosIGNoYW5nZUV2ZW50KHBhdGgp
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOworICB9CisKKyAgZnVuY3Rpb24gX3N1c3BlbmRP
YnNlcnZlcnMob2JqLCBwYXRocywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CisgICAgdmFy
IGV2ZW50cyA9IHBhdGhzLm1hcChjaGFuZ2VFdmVudCk7CisgICAgcmV0dXJuIF9lbWJlck1ldGFs
RXZlbnRzLnN1c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudHMsIHRhcmdldCwgbWV0aG9kLCBjYWxs
YmFjayk7CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIHJlbW92ZUJlZm9yZU9ic2VydmVyCisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBvYmoKKyAgICBAcGFyYW0ge1N0cmluZ30gcGF0aAor
ICAgIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXQKKyAgICBAcGFyYW0ge0Z1bmN0aW9u
fFN0cmluZ30gW21ldGhvZF0KKyAgICBAZGVwcmVjYXRlZAorICAgIEBwcml2YXRlCisgICovCisK
KyAgZnVuY3Rpb24gX3JlbW92ZUJlZm9yZU9ic2VydmVyKG9iaiwgcGF0aCwgdGFyZ2V0LCBtZXRo
b2QpIHsKKyAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLnVud2F0Y2gob2JqLCBwYXRoKTsKKyAgICBf
ZW1iZXJNZXRhbEV2ZW50cy5yZW1vdmVMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KHBhdGgpLCB0
YXJnZXQsIG1ldGhvZCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLW1ldGFsL29ic2VydmVyX3NldCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC91dGlscycs
ICdlbWJlci1tZXRhbC9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKgorICAgIHRo
aXMub2JzZXJ2ZXJTZXQgPSB7CisgICAgICBbc2VuZGVyR3VpZF06IHsgLy8gdmFyaWFibGUgbmFt
ZTogYGtleVNldGAKKyAgICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKKyAgICAgIH0KKyAgICB9
LAorICAgIHRoaXMub2JzZXJ2ZXJzID0gWworICAgICAgeworICAgICAgICBzZW5kZXI6IG9iaiwK
KyAgICAgICAga2V5TmFtZToga2V5TmFtZSwKKyAgICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUs
CisgICAgICAgIGxpc3RlbmVyczogWworICAgICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgZmxhZ3Nd
CisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAuLi4KKyAgICBdCisgICovCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IE9ic2VydmVyU2V0OworCisgIGZ1bmN0aW9uIE9ic2VydmVyU2V0KCkgeworICAg
IHRoaXMuY2xlYXIoKTsKKyAgfQorCisgIE9ic2VydmVyU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5j
dGlvbiAoc2VuZGVyLCBrZXlOYW1lLCBldmVudE5hbWUpIHsKKyAgICB2YXIgb2JzZXJ2ZXJTZXQg
PSB0aGlzLm9ic2VydmVyU2V0OworICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyczsK
KyAgICB2YXIgc2VuZGVyR3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcihzZW5kZXIpOwor
ICAgIHZhciBrZXlTZXQgPSBvYnNlcnZlclNldFtzZW5kZXJHdWlkXTsKKyAgICB2YXIgaW5kZXg7
CisKKyAgICBpZiAoIWtleVNldCkgeworICAgICAgb2JzZXJ2ZXJTZXRbc2VuZGVyR3VpZF0gPSBr
ZXlTZXQgPSB7fTsKKyAgICB9CisgICAgaW5kZXggPSBrZXlTZXRba2V5TmFtZV07CisgICAgaWYg
KGluZGV4ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGluZGV4ID0gb2JzZXJ2ZXJzLnB1c2goewor
ICAgICAgICBzZW5kZXI6IHNlbmRlciwKKyAgICAgICAga2V5TmFtZToga2V5TmFtZSwKKyAgICAg
ICAgZXZlbnROYW1lOiBldmVudE5hbWUsCisgICAgICAgIGxpc3RlbmVyczogW10KKyAgICAgIH0p
IC0gMTsKKyAgICAgIGtleVNldFtrZXlOYW1lXSA9IGluZGV4OworICAgIH0KKyAgICByZXR1cm4g
b2JzZXJ2ZXJzW2luZGV4XS5saXN0ZW5lcnM7CisgIH07CisKKyAgT2JzZXJ2ZXJTZXQucHJvdG90
eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2Vy
dmVyczsKKyAgICB2YXIgaSwgbGVuLCBvYnNlcnZlciwgc2VuZGVyOworICAgIHRoaXMuY2xlYXIo
KTsKKyAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKKyAgICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJzW2ldOworICAgICAgc2VuZGVyID0gb2JzZXJ2
ZXIuc2VuZGVyOworICAgICAgaWYgKHNlbmRlci5pc0Rlc3Ryb3lpbmcgfHwgc2VuZGVyLmlzRGVz
dHJveWVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxF
dmVudHMuc2VuZEV2ZW50KHNlbmRlciwgb2JzZXJ2ZXIuZXZlbnROYW1lLCBbc2VuZGVyLCBvYnNl
cnZlci5rZXlOYW1lXSwgb2JzZXJ2ZXIubGlzdGVuZXJzKTsKKyAgICB9CisgIH07CisKKyAgT2Jz
ZXJ2ZXJTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMub2JzZXJ2
ZXJTZXQgPSB7fTsKKyAgICB0aGlzLm9ic2VydmVycyA9IFtdOworICB9OworfSk7CitlbmlmZWQo
J2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY2FjaGUn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ2FjaGUpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHMuaXNHbG9iYWwgPSBpc0dsb2JhbDsKKyAgZXhwb3J0cy5pc0dsb2JhbFBh
dGggPSBpc0dsb2JhbFBhdGg7CisgIGV4cG9ydHMuaGFzVGhpcyA9IGhhc1RoaXM7CisgIGV4cG9y
dHMuaXNQYXRoID0gaXNQYXRoOworICBleHBvcnRzLmdldEZpcnN0S2V5ID0gZ2V0Rmlyc3RLZXk7
CisgIGV4cG9ydHMuZ2V0VGFpbFBhdGggPSBnZXRUYWlsUGF0aDsKKworICB2YXIgSVNfR0xPQkFM
ID0gL15bQS1aJF0vOworICB2YXIgSVNfR0xPQkFMX1BBVEggPSAvXltBLVokXS4qW1wuXS87Cisg
IHZhciBIQVNfVEhJUyA9ICd0aGlzLic7CisKKyAgdmFyIGlzR2xvYmFsQ2FjaGUgPSBuZXcgX2Vt
YmVyTWV0YWxDYWNoZS5kZWZhdWx0KDEwMDAsIGZ1bmN0aW9uIChrZXkpIHsKKyAgICByZXR1cm4g
SVNfR0xPQkFMLnRlc3Qoa2V5KTsKKyAgfSk7CisKKyAgdmFyIGlzR2xvYmFsUGF0aENhY2hlID0g
bmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7CisgICAg
cmV0dXJuIElTX0dMT0JBTF9QQVRILnRlc3Qoa2V5KTsKKyAgfSk7CisKKyAgdmFyIGhhc1RoaXND
YWNoZSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkg
eworICAgIHJldHVybiBrZXkubGFzdEluZGV4T2YoSEFTX1RISVMsIDApID09PSAwOworICB9KTsK
KworICB2YXIgZmlyc3REb3RJbmRleENhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtleS5pbmRleE9mKCcuJyk7Cisg
IH0pOworCisgIHZhciBmaXJzdEtleUNhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAocGF0aCkgeworICAgIHZhciBpbmRleCA9IGZpcnN0RG90SW5kZXhD
YWNoZS5nZXQocGF0aCk7CisgICAgaWYgKGluZGV4ID09PSAtMSkgeworICAgICAgcmV0dXJuIHBh
dGg7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGluZGV4KTsKKyAg
ICB9CisgIH0pOworCisgIHZhciB0YWlsUGF0aENhY2hlID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUu
ZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAocGF0aCkgeworICAgIHZhciBpbmRleCA9IGZpcnN0RG90
SW5kZXhDYWNoZS5nZXQocGF0aCk7CisgICAgaWYgKGluZGV4ICE9PSAtMSkgeworICAgICAgcmV0
dXJuIHBhdGguc2xpY2UoaW5kZXggKyAxKTsKKyAgICB9CisgIH0pOworCisgIHZhciBjYWNoZXMg
PSB7CisgICAgaXNHbG9iYWxDYWNoZTogaXNHbG9iYWxDYWNoZSwKKyAgICBpc0dsb2JhbFBhdGhD
YWNoZTogaXNHbG9iYWxQYXRoQ2FjaGUsCisgICAgaGFzVGhpc0NhY2hlOiBoYXNUaGlzQ2FjaGUs
CisgICAgZmlyc3REb3RJbmRleENhY2hlOiBmaXJzdERvdEluZGV4Q2FjaGUsCisgICAgZmlyc3RL
ZXlDYWNoZTogZmlyc3RLZXlDYWNoZSwKKyAgICB0YWlsUGF0aENhY2hlOiB0YWlsUGF0aENhY2hl
CisgIH07CisKKyAgZXhwb3J0cy5jYWNoZXMgPSBjYWNoZXM7CisKKyAgZnVuY3Rpb24gaXNHbG9i
YWwocGF0aCkgeworICAgIHJldHVybiBpc0dsb2JhbENhY2hlLmdldChwYXRoKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGlzR2xvYmFsUGF0aChwYXRoKSB7CisgICAgcmV0dXJuIGlzR2xvYmFsUGF0aENh
Y2hlLmdldChwYXRoKTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhc1RoaXMocGF0aCkgeworICAgIHJl
dHVybiBoYXNUaGlzQ2FjaGUuZ2V0KHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gaXNQYXRoKHBh
dGgpIHsKKyAgICByZXR1cm4gZmlyc3REb3RJbmRleENhY2hlLmdldChwYXRoKSAhPT0gLTE7Cisg
IH0KKworICBmdW5jdGlvbiBnZXRGaXJzdEtleShwYXRoKSB7CisgICAgcmV0dXJuIGZpcnN0S2V5
Q2FjaGUuZ2V0KHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gZ2V0VGFpbFBhdGgocGF0aCkgewor
ICAgIHJldHVybiB0YWlsUGF0aENhY2hlLmdldChwYXRoKTsKKyAgfQorfSk7CitlbmlmZWQoJ2Vt
YmVyLW1ldGFsL3Byb3BlcnRpZXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAn
ZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9l
bWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9l
dmVudHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5EZXNjcmlwdG9yID0gRGVzY3JpcHRvcjsKKyAgZXhwb3J0cy5N
QU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OID0gTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTjsKKyAg
ZXhwb3J0cy5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9O
OworICBleHBvcnRzLklOSEVSSVRJTkdfR0VUVEVSX0ZVTkNUSU9OID0gSU5IRVJJVElOR19HRVRU
RVJfRlVOQ1RJT047CisgIGV4cG9ydHMuZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsK
KworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCisgIC8vIERFU0NSSVBUT1IKKyAgLy8KKworICAvKioKKyAgICBPYmplY3RzIG9m
IHRoaXMgdHlwZSBjYW4gaW1wbGVtZW50IGFuIGludGVyZmFjZSB0byByZXNwb25kIHRvIHJlcXVl
c3RzIHRvCisgICAgZ2V0IGFuZCBzZXQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRs
ZXMgc2ltcGxlIHByb3BlcnRpZXMuCisgIAorICAgIEBjbGFzcyBEZXNjcmlwdG9yCisgICAgQHBy
aXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBEZXNjcmlwdG9yKCkgeworICAgIHRoaXMuaXNEZXNj
cmlwdG9yID0gdHJ1ZTsKKyAgfQorCisgIHZhciBSRURFRklORV9TVVBQT1JURUQgPSAoZnVuY3Rp
b24gKCkgeworICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGFsZ2VyL2tpYmFuYS9jb21taXQv
YjdlMzVlNjczN2RmNTg1NTg1MzMyODU3YTRjMzk3ZGMyMDZlN2ZmOQorICAgIHZhciBhID0gT2Jq
ZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCB7CisgICAgICBwcm9wOiB7CisgICAgICAgIGNv
bmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgdmFsdWU6IDEKKyAgICAgIH0KKyAgICB9KTsKKwor
ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCAncHJvcCcsIHsKKyAgICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZSwKKyAgICAgIHZhbHVlOiAyCisgICAgfSk7CisKKyAgICByZXR1cm4gYS5wcm9wID09
PSAyOworICB9KSgpOworICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIERFRklOSU5HIFBST1BFUlRJRVMgQVBJCisgIC8v
CisKKyAgZnVuY3Rpb24gTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTihuYW1lKSB7CisgICAgZnVu
Y3Rpb24gU0VUVEVSX0ZVTkNUSU9OKHZhbHVlKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnWW91IG11c3QgdXNlIEVtYmVyLnNldCgpIHRvIHNldCB0aGUgYCcgKyBuYW1lICsgJ2Ag
cHJvcGVydHkgKG9mICcgKyB0aGlzICsgJykgdG8gYCcgKyB2YWx1ZSArICdgLicsIGZhbHNlKTsK
KyAgICB9CisKKyAgICBTRVRURVJfRlVOQ1RJT04uaXNNYW5kYXRvcnlTZXR0ZXIgPSB0cnVlOwor
ICAgIHJldHVybiBTRVRURVJfRlVOQ1RJT047CisgIH0KKworICBmdW5jdGlvbiBERUZBVUxUX0dF
VFRFUl9GVU5DVElPTihuYW1lKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uIEdFVFRFUl9GVU5DVElP
TigpIHsKKyAgICAgIHZhciBtZXRhID0gdGhpc1snX19lbWJlcl9tZXRhX18nXTsKKyAgICAgIHJl
dHVybiBtZXRhICYmIG1ldGEucGVla1ZhbHVlcyhuYW1lKTsKKyAgICB9OworICB9CisKKyAgZnVu
Y3Rpb24gSU5IRVJJVElOR19HRVRURVJfRlVOQ1RJT04obmFtZSkgeworICAgIGZ1bmN0aW9uIElH
RVRURVJfRlVOQ1RJT04oKSB7CisgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBl
T2YodGhpcyk7CisgICAgICByZXR1cm4gcHJvdG8gJiYgcHJvdG9bbmFtZV07CisgICAgfQorCisg
ICAgSUdFVFRFUl9GVU5DVElPTi5pc0luaGVyaXRpbmdHZXR0ZXIgPSB0cnVlOworICAgIHJldHVy
biBJR0VUVEVSX0ZVTkNUSU9OOworICB9CisKKyAgLyoqCisgICAgTk9URTogVGhpcyBpcyBhIGxv
dy1sZXZlbCBtZXRob2QgdXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgQVBJLiBZb3UgYWxtb3N0
CisgICAgbmV2ZXIgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkIHlv
dSBzaG91bGQgdXNlCisgICAgYEVtYmVyLm1peGluKClgIHRvIGRlZmluZSBuZXcgcHJvcGVydGll
cy4KKyAgCisgICAgRGVmaW5lcyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBFUzUKKyAgICBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClgIG1l
dGhvZCBleGNlcHQgdGhhdCBpdCBjYW4gYWxzbyBhY2NlcHQgY29tcHV0ZWQKKyAgICBwcm9wZXJ0
aWVzIGFuZCBvdGhlciBzcGVjaWFsIGRlc2NyaXB0b3JzLgorICAKKyAgICBOb3JtYWxseSB0aGlz
IG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRlcnMuIEhvd2V2ZXIgaWYgeW91IHBhc3Mg
YW4KKyAgICBpbnN0YW5jZSBvZiBgRGVzY3JpcHRvcmAgYXMgdGhlIHRoaXJkIHBhcmFtIHRoZW4g
eW91IGNhbiBwYXNzIGFuCisgICAgb3B0aW9uYWwgdmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0
ZXIuIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbgorICAgIGNyZWF0aW5nIG5ldyBk
ZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0eS4KKyAgCisgICAgIyMgRXhhbXBsZXMK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIEVTNSBjb21wYXRpYmxlIG1vZGUKKyAgICBF
bWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnZmlyc3ROYW1lJywgeworICAgICAgd3JpdGFi
bGU6IHRydWUsCisgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAorICAgICAgZW51bWVyYWJsZTog
dHJ1ZSwKKyAgICAgIHZhbHVlOiAnQ2hhcmxlcycKKyAgICB9KTsKKyAgCisgICAgLy8gZGVmaW5l
IGEgc2ltcGxlIHByb3BlcnR5CisgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2xh
c3ROYW1lJywgdW5kZWZpbmVkLCAnSm9sbGV5Jyk7CisgIAorICAgIC8vIGRlZmluZSBhIGNvbXB1
dGVkIHByb3BlcnR5CisgICAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1l
JywgRW1iZXIuY29tcHV0ZWQoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsIGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlzLmxhc3ROYW1lOworICAgIH0pKTsK
KyAgICBgYGAKKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Cisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdCB0byBkZWZp
bmUgdGhpcyBwcm9wZXJ0eSBvbi4gVGhpcyBtYXkgYmUgYSBwcm90b3R5cGUuCisgICAgQHBhcmFt
IHtTdHJpbmd9IGtleU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgQHBhcmFtIHtE
ZXNjcmlwdG9yfSBbZGVzY10gYW4gaW5zdGFuY2Ugb2YgYERlc2NyaXB0b3JgICh0eXBpY2FsbHkg
YQorICAgICAgY29tcHV0ZWQgcHJvcGVydHkpIG9yIGFuIEVTNSBkZXNjcmlwdG9yLgorICAgICAg
WW91IG11c3QgcHJvdmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJvdGguCisgICAgQHBhcmFt
IHsqfSBbZGF0YV0gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBkZXNjcmlwdG9yLCB0aGF0IHdpbGwK
KyAgICAgIGJlY29tZSB0aGUgZXhwbGljaXQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS4KKyAgKi8K
KworICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MsIGRhdGEsIG1l
dGEpIHsKKyAgICB2YXIgcG9zc2libGVEZXNjLCBleGlzdGluZ0Rlc2MsIHdhdGNoaW5nLCB2YWx1
ZTsKKworICAgIGlmICghbWV0YSkgeworICAgICAgbWV0YSA9IF9lbWJlck1ldGFsTWV0YS5tZXRh
KG9iaik7CisgICAgfQorICAgIHZhciB3YXRjaEVudHJ5ID0gbWV0YS5wZWVrV2F0Y2hpbmcoa2V5
TmFtZSk7CisgICAgcG9zc2libGVEZXNjID0gb2JqW2tleU5hbWVdOworICAgIGV4aXN0aW5nRGVz
YyA9IHBvc3NpYmxlRGVzYyAhPT0gbnVsbCAmJiB0eXBlb2YgcG9zc2libGVEZXNjID09PSAnb2Jq
ZWN0JyAmJiBwb3NzaWJsZURlc2MuaXNEZXNjcmlwdG9yID8gcG9zc2libGVEZXNjIDogdW5kZWZp
bmVkOworCisgICAgd2F0Y2hpbmcgPSB3YXRjaEVudHJ5ICE9PSB1bmRlZmluZWQgJiYgd2F0Y2hF
bnRyeSA+IDA7CisKKyAgICBpZiAoZXhpc3RpbmdEZXNjKSB7CisgICAgICBleGlzdGluZ0Rlc2Mu
dGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKKyAgICB9CisKKyAgICBpZiAoZGVzYyBpbnN0YW5jZW9m
IERlc2NyaXB0b3IpIHsKKyAgICAgIHZhbHVlID0gZGVzYzsKKworICAgICAgaWYgKHdhdGNoaW5n
KSB7CisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKKyAgICAg
ICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAg
ICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICB2YWx1ZTogdmFsdWUKKyAgICAgICAg
fSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvYmpba2V5TmFtZV0gPSB2YWx1ZTsKKyAgICAg
IH0KKworICAgICAgaWYgKGRlc2Muc2V0dXApIHsKKyAgICAgICAgZGVzYy5zZXR1cChvYmosIGtl
eU5hbWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7
CisgICAgICAgIHZhbHVlID0gZGF0YTsKKworICAgICAgICBpZiAod2F0Y2hpbmcpIHsKKyAgICAg
ICAgICBtZXRhLndyaXRlVmFsdWVzKGtleU5hbWUsIGRhdGEpOworCisgICAgICAgICAgdmFyIGRl
ZmF1bHREZXNjcmlwdG9yID0geworICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAg
ICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHNldDogTUFOREFUT1JZX1NF
VFRFUl9GVU5DVElPTihrZXlOYW1lKSwKKyAgICAgICAgICAgIGdldDogREVGQVVMVF9HRVRURVJf
RlVOQ1RJT04oa2V5TmFtZSkKKyAgICAgICAgICB9OworCisgICAgICAgICAgaWYgKFJFREVGSU5F
X1NVUFBPUlRFRCkgeworICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5
TmFtZSwgZGVmYXVsdERlc2NyaXB0b3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBoYW5kbGVCcm9rZW5QaGFudG9tRGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBkZWZhdWx0
RGVzY3JpcHRvcik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9i
altrZXlOYW1lXSA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZh
bHVlID0gZGVzYzsKKworICAgICAgICAvLyBmYWxsYmFjayB0byBFUzUKKyAgICAgICAgT2JqZWN0
LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgZGVzYyk7CisgICAgICB9CisgICAgfQorCisg
ICAgLy8gaWYga2V5IGlzIGJlaW5nIHdhdGNoZWQsIG92ZXJyaWRlIGNoYWlucyB0aGF0CisgICAg
Ly8gd2VyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm90b3R5cGUKKyAgICBpZiAod2F0Y2hpbmcp
IHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLm92ZXJyaWRlQ2hhaW5zKG9iaiwg
a2V5TmFtZSwgbWV0YSk7CisgICAgfQorCisgICAgLy8gVGhlIGB2YWx1ZWAgcGFzc2VkIHRvIHRo
ZSBgZGlkRGVmaW5lUHJvcGVydHlgIGhvb2sgaXMKKyAgICAvLyBlaXRoZXIgdGhlIGRlc2NyaXB0
b3Igb3IgZGF0YSwgd2hpY2hldmVyIHdhcyBwYXNzZWQuCisgICAgaWYgKG9iai5kaWREZWZpbmVQ
cm9wZXJ0eSkgeworICAgICAgb2JqLmRpZERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgdmFs
dWUpOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgZnVuY3Rpb24gaGFuZGxl
QnJva2VuUGhhbnRvbURlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgZGVzYykgeworICAgIC8v
IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvaXNzdWVzLzExODU2CisgICAgT2Jq
ZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdy
aXRhYmxlOiB0cnVlLCB2YWx1ZTogJ2lDcnknIH0pOworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
eShvYmosIGtleU5hbWUsIGRlc2MpOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvcHJv
cGVydHlfZXZlbnRzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL21ldGEnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyX3Nl
dCcsICdlbWJlci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFs
VXRpbHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxFdmVudHMsIF9lbWJlck1ldGFsT2Jz
ZXJ2ZXJfc2V0LCBfZW1iZXJNZXRhbFN5bWJvbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFy
IFBST1BFUlRZX0RJRF9DSEFOR0UgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZhdWx0KCdQUk9QRVJU
WV9ESURfQ0hBTkdFJyk7CisKKyAgZXhwb3J0cy5QUk9QRVJUWV9ESURfQ0hBTkdFID0gUFJPUEVS
VFlfRElEX0NIQU5HRTsKKyAgdmFyIGJlZm9yZU9ic2VydmVyU2V0ID0gbmV3IF9lbWJlck1ldGFs
T2JzZXJ2ZXJfc2V0LmRlZmF1bHQoKTsKKyAgdmFyIG9ic2VydmVyU2V0ID0gbmV3IF9lbWJlck1l
dGFsT2JzZXJ2ZXJfc2V0LmRlZmF1bHQoKTsKKyAgdmFyIGRlZmVycmVkID0gMDsKKworICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
CisgIC8vIFBST1BFUlRZIENIQU5HRVMKKyAgLy8KKworICAvKioKKyAgICBUaGlzIGZ1bmN0aW9u
IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhbiBvYmplY3QgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh
bmdlLgorICAgIEl0IHdpbGwgbm90aWZ5IGFueSBiZWZvcmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJl
IGNhY2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCisgIAorICAgIE5vcm1hbGx5IHlvdSB3aWxsIG5v
dCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgYnV0IGlmIGZvciBzb21lCisgICAg
cmVhc29uIHlvdSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4gaW52b2tl
IHRoaXMgbWV0aG9kCisgICAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVydHlEaWRD
aGFuZ2UoKWAgd2hpY2ggeW91IHNob3VsZCBjYWxsIGp1c3QKKyAgICBhZnRlciB0aGUgcHJvcGVy
dHkgdmFsdWUgY2hhbmdlcy4KKyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eVdpbGxDaGFuZ2UKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhl
IHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU
aGUgcHJvcGVydHkga2V5IChvciBwYXRoKSB0aGF0IHdpbGwgY2hhbmdlLgorICAgIEByZXR1cm4g
e3ZvaWR9CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZnVuY3Rpb24gcHJvcGVydHlXaWxsQ2hhbmdl
KG9iaiwga2V5TmFtZSkgeworICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9i
aik7CisgICAgdmFyIHdhdGNoaW5nID0gbSAmJiBtLnBlZWtXYXRjaGluZyhrZXlOYW1lKSA+IDAg
fHwga2V5TmFtZSA9PT0gJ2xlbmd0aCc7CisgICAgdmFyIHByb3RvID0gbSAmJiBtLnByb3RvOwor
ICAgIHZhciBwb3NzaWJsZURlc2MgPSBvYmpba2V5TmFtZV07CisgICAgdmFyIGRlc2MgPSBwb3Nz
aWJsZURlc2MgIT09IG51bGwgJiYgdHlwZW9mIHBvc3NpYmxlRGVzYyA9PT0gJ29iamVjdCcgJiYg
cG9zc2libGVEZXNjLmlzRGVzY3JpcHRvciA/IHBvc3NpYmxlRGVzYyA6IHVuZGVmaW5lZDsKKwor
ICAgIGlmICghd2F0Y2hpbmcpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHJv
dG8gPT09IG9iaikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkZXNjICYmIGRl
c2Mud2lsbENoYW5nZSkgeworICAgICAgZGVzYy53aWxsQ2hhbmdlKG9iaiwga2V5TmFtZSk7Cisg
ICAgfQorCisgICAgZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKKyAg
ICBjaGFpbnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7CisgICAgbm90aWZ5QmVmb3JlT2Jz
ZXJ2ZXJzKG9iaiwga2V5TmFtZSk7CisgIH0KKworICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlz
IGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KKyAgICBJ
dCB3aWxsIG5vdGlmeSBhbnkgb2JzZXJ2ZXJzIGFuZCBjbGVhciBjYWNoZXMgYW1vbmcgb3RoZXIg
dGhpbmdzLgorICAKKyAgICBOb3JtYWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMg
bWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Igc29tZQorICAgIHJlYXNvbiB5b3UgY2FuJ3QgZGly
ZWN0bHkgd2F0Y2ggYSBwcm9wZXJ0eSB5b3UgY2FuIGludm9rZSB0aGlzIG1ldGhvZAorICAgIG1h
bnVhbGx5IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSgpYCB3aGljaCB5b3Ug
c2hvdWxkIGNhbGwganVzdAorICAgIGJlZm9yZSB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4K
KyAgCisgICAgQG1ldGhvZCBwcm9wZXJ0eURpZENoYW5nZQorICAgIEBmb3IgRW1iZXIKKyAgICBA
cGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydHkgdGhhdCB3aWxs
IGNoYW5nZQorICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgKG9y
IHBhdGgpIHRoYXQgd2lsbCBjaGFuZ2UuCisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHJpdmF0
ZQorICAqLworICBmdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpIHsKKyAg
ICB2YXIgbSA9IF9lbWJlck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgIHZhciB3YXRjaGlu
ZyA9IG0gJiYgbS5wZWVrV2F0Y2hpbmcoa2V5TmFtZSkgPiAwIHx8IGtleU5hbWUgPT09ICdsZW5n
dGgnOworICAgIHZhciBwcm90byA9IG0gJiYgbS5wcm90bzsKKyAgICB2YXIgcG9zc2libGVEZXNj
ID0gb2JqW2tleU5hbWVdOworICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYm
IHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2Ny
aXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICBpZiAocHJvdG8gPT09IG9i
aikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHNob3VsZG4ndCB0aGlzIG1lYW4g
dGhhdCB3ZSdyZSB3YXRjaGluZyB0aGlzIGtleT8KKyAgICBpZiAoZGVzYyAmJiBkZXNjLmRpZENo
YW5nZSkgeworICAgICAgZGVzYy5kaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKTsKKyAgICB9CisKKyAg
ICBpZiAob2JqW1BST1BFUlRZX0RJRF9DSEFOR0VdKSB7CisgICAgICBvYmpbUFJPUEVSVFlfRElE
X0NIQU5HRV0oa2V5TmFtZSk7CisgICAgfQorCisgICAgaWYgKCF3YXRjaGluZyAmJiBrZXlOYW1l
ICE9PSAnbGVuZ3RoJykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtICYmIG0u
aGFzRGVwcyhrZXlOYW1lKSkgeworICAgICAgZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGtl
eU5hbWUsIG0pOworICAgIH0KKworICAgIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUsIG0s
IGZhbHNlKTsKKyAgICBub3RpZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKKyAgfQorCisgIHZh
ciBXSUxMX1NFRU4sIERJRF9TRUVOOworICAvLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBp
cyBhYm91dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNhY2hlIG9mIGFueSBkZXBlbmRlbnQga2V5
cyAoYW5kIG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9mIGNoYW5nZXMsIGV0Yy4uLikKKyAgZnVu
Y3Rpb24gZGVwZW5kZW50S2V5c1dpbGxDaGFuZ2Uob2JqLCBkZXBLZXksIG1ldGEpIHsKKyAgICBp
ZiAob2JqLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICht
ZXRhICYmIG1ldGEuaGFzRGVwcyhkZXBLZXkpKSB7CisgICAgICB2YXIgc2VlbiA9IFdJTExfU0VF
TjsKKyAgICAgIHZhciB0b3AgPSAhc2VlbjsKKworICAgICAgaWYgKHRvcCkgeworICAgICAgICBz
ZWVuID0gV0lMTF9TRUVOID0ge307CisgICAgICB9CisKKyAgICAgIGl0ZXJEZXBzKHByb3BlcnR5
V2lsbENoYW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOworCisgICAgICBpZiAodG9wKSB7
CisgICAgICAgIFdJTExfU0VFTiA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8g
Y2FsbGVkIHdoZW5ldmVyIGEgcHJvcGVydHkgaGFzIGp1c3QgY2hhbmdlZCB0byB1cGRhdGUgZGVw
ZW5kZW50IGtleXMKKyAgZnVuY3Rpb24gZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRlcEtl
eSwgbWV0YSkgeworICAgIGlmIChvYmouaXNEZXN0cm95aW5nKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKG1ldGEgJiYgbWV0YS5oYXNEZXBzKGRlcEtleSkpIHsKKyAgICAgIHZh
ciBzZWVuID0gRElEX1NFRU47CisgICAgICB2YXIgdG9wID0gIXNlZW47CisKKyAgICAgIGlmICh0
b3ApIHsKKyAgICAgICAgc2VlbiA9IERJRF9TRUVOID0ge307CisgICAgICB9CisKKyAgICAgIGl0
ZXJEZXBzKHByb3BlcnR5RGlkQ2hhbmdlLCBvYmosIGRlcEtleSwgc2VlbiwgbWV0YSk7CisKKyAg
ICAgIGlmICh0b3ApIHsKKyAgICAgICAgRElEX1NFRU4gPSBudWxsOworICAgICAgfQorICAgIH0K
KyAgfQorCisgIGZ1bmN0aW9uIGl0ZXJEZXBzKG1ldGhvZCwgb2JqLCBkZXBLZXksIHNlZW4sIG1l
dGEpIHsKKyAgICB2YXIgcG9zc2libGVEZXNjLCBkZXNjOworICAgIHZhciBndWlkID0gX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKG9iaik7CisgICAgdmFyIGN1cnJlbnQgPSBzZWVuW2d1aWRdOwor
CisgICAgaWYgKCFjdXJyZW50KSB7CisgICAgICBjdXJyZW50ID0gc2VlbltndWlkXSA9IHt9Owor
ICAgIH0KKworICAgIGlmIChjdXJyZW50W2RlcEtleV0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBjdXJyZW50W2RlcEtleV0gPSB0cnVlOworCisgICAgbWV0YS5mb3JFYWNoSW5EZXBz
KGRlcEtleSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwb3NzaWJsZURlc2MgPSBvYmpba2V5XTsK
KyAgICAgIGRlc2MgPSBwb3NzaWJsZURlc2MgIT09IG51bGwgJiYgdHlwZW9mIHBvc3NpYmxlRGVz
YyA9PT0gJ29iamVjdCcgJiYgcG9zc2libGVEZXNjLmlzRGVzY3JpcHRvciA/IHBvc3NpYmxlRGVz
YyA6IHVuZGVmaW5lZDsKKworICAgICAgaWYgKGRlc2MgJiYgZGVzYy5fc3VzcGVuZGVkID09PSBv
YmopIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBtZXRob2Qob2JqLCBrZXkp
OworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gY2hhaW5zV2lsbENoYW5nZShvYmosIGtleU5h
bWUsIG0pIHsKKyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYg
KGMpIHsKKyAgICAgIGMubm90aWZ5KGtleU5hbWUsIGZhbHNlLCBwcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNoYWluc0RpZENoYW5nZShvYmosIGtleU5hbWUs
IG0pIHsKKyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYgKGMp
IHsKKyAgICAgIGMubm90aWZ5KGtleU5hbWUsIHRydWUsIHByb3BlcnR5RGlkQ2hhbmdlKTsKKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBvdmVycmlkZUNoYWlucyhvYmosIGtleU5hbWUsIG0pIHsK
KyAgICB2YXIgYyA9IG0ucmVhZGFibGVDaGFpbldhdGNoZXJzKCk7CisgICAgaWYgKGMpIHsKKyAg
ICAgIGMucmV2YWxpZGF0ZShrZXlOYW1lKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICBAbWV0
aG9kIGJlZ2luUHJvcGVydHlDaGFuZ2VzCisgICAgQGNoYWluYWJsZQorICAgIEBwcml2YXRlCisg
ICovCisgIGZ1bmN0aW9uIGJlZ2luUHJvcGVydHlDaGFuZ2VzKCkgeworICAgIGRlZmVycmVkKys7
CisgIH0KKworICAvKioKKyAgICBAbWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcworICAgIEBwcml2
YXRlCisgICovCisgIGZ1bmN0aW9uIGVuZFByb3BlcnR5Q2hhbmdlcygpIHsKKyAgICBkZWZlcnJl
ZC0tOworICAgIGlmIChkZWZlcnJlZCA8PSAwKSB7CisgICAgICBiZWZvcmVPYnNlcnZlclNldC5j
bGVhcigpOworICAgICAgb2JzZXJ2ZXJTZXQuZmx1c2goKTsKKyAgICB9CisgIH0KKworICAvKioK
KyAgICBNYWtlIGEgc2VyaWVzIG9mIHByb3BlcnR5IGNoYW5nZXMgdG9nZXRoZXIgaW4gYW4KKyAg
ICBleGNlcHRpb24tc2FmZSB3YXkuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5j
aGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgeworICAgICAgb2JqMS5zZXQoJ2ZvbycsIG1heUJs
b3dVcFdoZW5TZXQpOworICAgICAgb2JqMi5zZXQoJ2JhcicsIGJheik7CisgICAgfSk7CisgICAg
YGBgCisgIAorICAgIEBtZXRob2QgY2hhbmdlUHJvcGVydGllcworICAgIEBwYXJhbSB7RnVuY3Rp
b259IGNhbGxiYWNrCisgICAgQHBhcmFtIFtiaW5kaW5nXQorICAgIEBwcml2YXRlCisgICovCisg
IGZ1bmN0aW9uIGNoYW5nZVByb3BlcnRpZXMoY2FsbGJhY2ssIGJpbmRpbmcpIHsKKyAgICBiZWdp
blByb3BlcnR5Q2hhbmdlcygpOworICAgIHRyeSB7CisgICAgICBjYWxsYmFjay5jYWxsKGJpbmRp
bmcpOworICAgIH0gZmluYWxseSB7CisgICAgICBlbmRQcm9wZXJ0eUNoYW5nZXMuY2FsbChiaW5k
aW5nKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBub3RpZnlCZWZvcmVPYnNlcnZlcnMob2Jq
LCBrZXlOYW1lKSB7CisgICAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsKKyAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICB2YXIgZXZlbnROYW1lID0ga2V5TmFtZSArICc6YmVmb3JlJzsKKyAgICB2
YXIgbGlzdGVuZXJzLCBhZGRlZDsKKyAgICBpZiAoZGVmZXJyZWQpIHsKKyAgICAgIGxpc3RlbmVy
cyA9IGJlZm9yZU9ic2VydmVyU2V0LmFkZChvYmosIGtleU5hbWUsIGV2ZW50TmFtZSk7CisgICAg
ICBhZGRlZCA9IF9lbWJlck1ldGFsRXZlbnRzLmFjY3VtdWxhdGVMaXN0ZW5lcnMob2JqLCBldmVu
dE5hbWUsIGxpc3RlbmVycyk7CisgICAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQob2Jq
LCBldmVudE5hbWUsIFtvYmosIGtleU5hbWVdLCBhZGRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAg
IF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFt
ZV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG5vdGlmeU9ic2VydmVycyhvYmosIGtleU5h
bWUpIHsKKyAgICBpZiAob2JqLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIHZhciBldmVudE5hbWUgPSBrZXlOYW1lICsgJzpjaGFuZ2UnOworICAgIHZhciBsaXN0
ZW5lcnM7CisgICAgaWYgKGRlZmVycmVkKSB7CisgICAgICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNl
dC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOworICAgICAgX2VtYmVyTWV0YWxFdmVudHMu
YWNjdW11bGF0ZUxpc3RlbmVycyhvYmosIGV2ZW50TmFtZSwgbGlzdGVuZXJzKTsKKyAgICB9IGVs
c2UgeworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBb
b2JqLCBrZXlOYW1lXSk7CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5wcm9wZXJ0eVdpbGxDaGFu
Z2UgPSBwcm9wZXJ0eVdpbGxDaGFuZ2U7CisgIGV4cG9ydHMucHJvcGVydHlEaWRDaGFuZ2UgPSBw
cm9wZXJ0eURpZENoYW5nZTsKKyAgZXhwb3J0cy5vdmVycmlkZUNoYWlucyA9IG92ZXJyaWRlQ2hh
aW5zOworICBleHBvcnRzLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVnaW5Qcm9wZXJ0eUNoYW5n
ZXM7CisgIGV4cG9ydHMuZW5kUHJvcGVydHlDaGFuZ2VzID0gZW5kUHJvcGVydHlDaGFuZ2VzOwor
ICBleHBvcnRzLmNoYW5nZVByb3BlcnRpZXMgPSBjaGFuZ2VQcm9wZXJ0aWVzOworfSk7Citlbmlm
ZWQoJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9k
ZWJ1ZycsICdlbWJlci1tZXRhbC9wYXRoX2NhY2hlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFBhdGhfY2FjaGUpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXItbWV0YWwKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXQgPSBn
ZXQ7CisgIGV4cG9ydHMuX2dldFBhdGggPSBfZ2V0UGF0aDsKKyAgZXhwb3J0cy5nZXRXaXRoRGVm
YXVsdCA9IGdldFdpdGhEZWZhdWx0OworCisgIHZhciBBTExPV0FCTEVfVFlQRVMgPSB7CisgICAg
b2JqZWN0OiB0cnVlLAorICAgIGZ1bmN0aW9uOiB0cnVlLAorICAgIHN0cmluZzogdHJ1ZQorICB9
OworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4KKyAgLy8gR0VUIEFORCBTRVQKKyAgLy8KKyAgLy8gSWYgd2UgYXJlIG9uIGEg
cGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIHVzZSB0aG9zZS4KKyAgLy8g
T3RoZXJ3aXNlIHNpbXVsYXRlIGFjY2Vzc29ycyBieSBsb29raW5nIHVwIHRoZSBwcm9wZXJ0eSBk
aXJlY3RseSBvbiB0aGUKKyAgLy8gb2JqZWN0LgorCisgIC8qKgorICAgIEdldHMgdGhlIHZhbHVl
IG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0ZWQs
CisgICAgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZC4gSWYgdGhlIHByb3BlcnR5IGlzIG5v
dCBkZWZpbmVkIGJ1dCB0aGUKKyAgICBvYmplY3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Qcm9w
ZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQuCisgIAorICAgIElmIHlvdSBw
bGFuIHRvIHJ1biBvbiBJRTggYW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2Ug
dGhpcworICAgIG1ldGhvZCBhbnl0aW1lIHlvdSB3YW50IHRvIHJldHJpZXZlIGEgcHJvcGVydHkg
b24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0CisgICAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRl
LiAoUHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlICdfJworICAgIGFyZSBj
b25zaWRlcmVkIHByaXZhdGUuKQorICAKKyAgICBPbiBhbGwgbmV3ZXIgYnJvd3NlcnMsIHlvdSBv
bmx5IG5lZWQgdG8gdXNlIHRoaXMgbWV0aG9kIHRvIHJldHJpZXZlCisgICAgcHJvcGVydGllcyBp
ZiB0aGUgcHJvcGVydHkgbWlnaHQgbm90IGJlIGRlZmluZWQgb24gdGhlIG9iamVjdCBhbmQgeW91
IHdhbnQKKyAgICB0byByZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5YCBoYW5kbGVyLiBPdGhl
cndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcworICAgIG1ldGhvZC4KKyAgCisgICAgTm90ZSB0aGF0
IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRlZmluZWRgLCB0aGlzIG1ldGhvZCB3aWxsIHRo
cm93CisgICAgYW4gZXJyb3IuCisgIAorICAgIEBtZXRob2QgZ2V0CisgICAgQGZvciBFbWJlcgor
ICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSBmcm9tLgorICAg
IEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmV0cmlldmUKKyAg
ICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBgbnVsbGAuCisgICAgQHB1
YmxpYworICAqLworCisgIGZ1bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKKyAgICBfZW1iZXJN
ZXRhbERlYnVnLmFzc2VydCgnR2V0IG11c3QgYmUgY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czsg
YW4gb2JqZWN0IGFuZCBhIHByb3BlcnR5IGtleScsIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpOwor
ICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgY2FsbCBnZXQgd2l0aCBcJycgKyBr
ZXlOYW1lICsgJ1wnIG9uIGFuIHVuZGVmaW5lZCBvYmplY3QuJywgb2JqICE9PSB1bmRlZmluZWQg
JiYgb2JqICE9PSBudWxsKTsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGtleSBw
cm92aWRlZCB0byBnZXQgbXVzdCBiZSBhIHN0cmluZywgeW91IHBhc3NlZCAnICsga2V5TmFtZSwg
dHlwZW9mIGtleU5hbWUgPT09ICdzdHJpbmcnKTsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnXCd0aGlzXCcgaW4gcGF0aHMgaXMgbm90IHN1cHBvcnRlZCcsICFfZW1iZXJNZXRhbFBhdGhf
Y2FjaGUuaGFzVGhpcyhrZXlOYW1lKSk7CisKKyAgICAvLyBIZWxwZXJzIHRoYXQgb3BlcmF0ZSB3
aXRoICd0aGlzJyB3aXRoaW4gYW4gI2VhY2gKKyAgICBpZiAoa2V5TmFtZSA9PT0gJycpIHsKKyAg
ICAgIHJldHVybiBvYmo7CisgICAgfQorCisgICAgdmFyIHZhbHVlID0gb2JqW2tleU5hbWVdOwor
ICAgIHZhciBkZXNjID0gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0
JyAmJiB2YWx1ZS5pc0Rlc2NyaXB0b3IgPyB2YWx1ZSA6IHVuZGVmaW5lZDsKKyAgICB2YXIgcmV0
OworCisgICAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiBfZW1iZXJNZXRhbFBhdGhfY2FjaGUu
aXNQYXRoKGtleU5hbWUpKSB7CisgICAgICByZXR1cm4gX2dldFBhdGgob2JqLCBrZXlOYW1lKTsK
KyAgICB9CisKKyAgICBpZiAoZGVzYykgeworICAgICAgcmV0dXJuIGRlc2MuZ2V0KG9iaiwga2V5
TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IHZhbHVlOworCisgICAgICBpZiAocmV0
ID09PSB1bmRlZmluZWQgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGlu
IG9iaikgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai51bmtub3duUHJvcGVydHkpIHsKKyAg
ICAgICAgcmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7CisgICAgICB9CisKKyAg
ICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gX2dldFBhdGgocm9vdCwg
cGF0aCkgeworICAgIHZhciBvYmogPSByb290OworICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQo
Jy4nKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKKyAg
ICAgIGlmICghaXNHZXR0YWJsZShvYmopKSB7CisgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Cisg
ICAgICB9CisKKyAgICAgIG9iaiA9IGdldChvYmosIHBhcnRzW2ldKTsKKworICAgICAgaWYgKG9i
aiAmJiBvYmouaXNEZXN0cm95ZWQpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgZnVuY3Rpb24gaXNHZXR0YWJs
ZShvYmopIHsKKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gQUxMT1dBQkxFX1RZUEVTW3R5cGVvZiBvYmpdOworICB9CisKKyAg
LyoqCisgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGZyb20gYW4gT2JqZWN0
LCBvciBhIGRlZmF1bHQgdmFsdWUgaW4gdGhlCisgICAgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eSBy
ZXR1cm5zIGB1bmRlZmluZWRgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuZ2V0
V2l0aERlZmF1bHQocGVyc29uLCAnbGFzdE5hbWUnLCAnRG9lJyk7CisgICAgYGBgCisgIAorICAg
IEBtZXRob2QgZ2V0V2l0aERlZmF1bHQKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIGZyb20uCisgICAgQHBhcmFtIHtTdHJpbmd9
IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCisgICAgQHBhcmFt
IHtPYmplY3R9IGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0
eSB2YWx1ZSBpcyB1bmRlZmluZWQKKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBwcm9wZXJ0eSB2
YWx1ZSBvciB0aGUgZGVmYXVsdFZhbHVlLgorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlv
biBnZXRXaXRoRGVmYXVsdChyb290LCBrZXksIGRlZmF1bHRWYWx1ZSkgeworICAgIHZhciB2YWx1
ZSA9IGdldChyb290LCBrZXkpOworCisgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAg
ICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGdldDsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9zZXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
ZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3Bl
cnR5X2V2ZW50cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL3BhdGhfY2FjaGUnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1t
ZXRhbC91dGlscycsICdlbWJlci1tZXRhbC90YWdzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dCwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2Vt
YmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxQYXRoX2NhY2hlLCBfZW1iZXJNZXRhbE1ldGEsIF9l
bWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsVGFncykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5zZXQgPSBzZXQ7CisgIGV4cG9ydHMudHJ5U2V0ID0gdHJ5U2V0OworCisgIC8qKgor
ICAgIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LCByZXNwZWN0aW5n
IGNvbXB1dGVkIHByb3BlcnRpZXMKKyAgICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBhbmQgb3Ro
ZXIgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIElmIHRoZQorICAgIHByb3BlcnR5IGlzIG5vdCBk
ZWZpbmVkIGJ1dCB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBzZXRVbmtub3duUHJvcGVydHlg
CisgICAgbWV0aG9kIHRoZW4gdGhhdCB3aWxsIGJlIGludm9rZWQgYXMgd2VsbC4KKyAgCisgICAg
QG1ldGhvZCBzZXQKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUg
b2JqZWN0IHRvIG1vZGlmeS4KKyAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVy
dHkga2V5IHRvIHNldAorICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0
CisgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIHZhbHVlLgorICAgIEBwdWJsaWMKKyAg
Ki8KKworICBmdW5jdGlvbiBzZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSwgdG9sZXJhbnQpIHsKKyAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnU2V0IG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWUg
b3IgZm91ciBhcmd1bWVudHM7IGFuIG9iamVjdCwgYSBwcm9wZXJ0eSBrZXksIGEgdmFsdWUgYW5k
IHRvbGVyYW50IHRydWUvZmFsc2UnLCBhcmd1bWVudHMubGVuZ3RoID09PSAzIHx8IGFyZ3VtZW50
cy5sZW5ndGggPT09IDQpOworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgY2Fs
bCBzZXQgd2l0aCBcJycgKyBrZXlOYW1lICsgJ1wnIG9uIGFuIHVuZGVmaW5lZCBvYmplY3QuJywg
b2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsKTsKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydCgnVGhlIGtleSBwcm92aWRlZCB0byBzZXQgbXVzdCBiZSBhIHN0cmluZywgeW91IHBh
c3NlZCAnICsga2V5TmFtZSwgdHlwZW9mIGtleU5hbWUgPT09ICdzdHJpbmcnKTsKKyAgICBfZW1i
ZXJNZXRhbERlYnVnLmFzc2VydCgnXCd0aGlzXCcgaW4gcGF0aHMgaXMgbm90IHN1cHBvcnRlZCcs
ICFfZW1iZXJNZXRhbFBhdGhfY2FjaGUuaGFzVGhpcyhrZXlOYW1lKSk7CisKKyAgICB2YXIgbWV0
YSA9IHVuZGVmaW5lZCwKKyAgICAgICAgcG9zc2libGVEZXNjID0gdW5kZWZpbmVkLAorICAgICAg
ICBkZXNjID0gdW5kZWZpbmVkOworCisgICAgaWYgKG9iaikgeworICAgICAgbWV0YSA9IF9lbWJl
ck1ldGFsTWV0YS5wZWVrTWV0YShvYmopOworICAgICAgcG9zc2libGVEZXNjID0gb2JqW2tleU5h
bWVdOworICAgICAgZGVzYyA9IHBvc3NpYmxlRGVzYyAhPT0gbnVsbCAmJiB0eXBlb2YgcG9zc2li
bGVEZXNjID09PSAnb2JqZWN0JyAmJiBwb3NzaWJsZURlc2MuaXNEZXNjcmlwdG9yID8gcG9zc2li
bGVEZXNjIDogdW5kZWZpbmVkOworICAgICAgX2VtYmVyTWV0YWxUYWdzLm1hcmtPYmplY3RBc0Rp
cnR5KG1ldGEpOworICAgIH0KKworICAgIHZhciBpc1Vua25vd24sIGN1cnJlbnRWYWx1ZTsKKyAg
ICBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkICYmIF9lbWJlck1ldGFsUGF0aF9jYWNoZS5pc1BhdGgo
a2V5TmFtZSkpIHsKKyAgICAgIHJldHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRv
bGVyYW50KTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY2FsbGluZyBz
ZXQgb24gZGVzdHJveWVkIG9iamVjdDogJyArIF9lbWJlck1ldGFsVXRpbHMudG9TdHJpbmcob2Jq
KSArICcuJyArIGtleU5hbWUgKyAnID0gJyArIF9lbWJlck1ldGFsVXRpbHMudG9TdHJpbmcodmFs
dWUpLCAhb2JqLmlzRGVzdHJveWVkKTsKKworICAgIGlmIChkZXNjKSB7CisgICAgICBkZXNjLnNl
dChvYmosIGtleU5hbWUsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHZhbHVlICE9
PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqW2tleU5hbWVdID09
PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlzVW5r
bm93biA9ICdvYmplY3QnID09PSB0eXBlb2Ygb2JqICYmICEoa2V5TmFtZSBpbiBvYmopOworCisg
ICAgICAvLyBzZXRVbmtub3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlzIGFuIG9iamVj
dCwKKyAgICAgIC8vIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBhbmQgdGhl
CisgICAgICAvLyBgc2V0VW5rbm93blByb3BlcnR5YCBtZXRob2QgZXhpc3RzIG9uIHRoZSBvYmpl
Y3QKKyAgICAgIGlmIChpc1Vua25vd24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZXRV
bmtub3duUHJvcGVydHkpIHsKKyAgICAgICAgb2JqLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1l
LCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKG1ldGEgJiYgbWV0YS5wZWVrV2F0Y2hpbmcoa2V5
TmFtZSkgPiAwKSB7CisgICAgICAgIGlmIChtZXRhLnByb3RvICE9PSBvYmopIHsKKyAgICAgICAg
ICBjdXJyZW50VmFsdWUgPSBvYmpba2V5TmFtZV07CisgICAgICAgIH0KKyAgICAgICAgLy8gb25s
eSB0cmlnZ2VyIGEgY2hhbmdlIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAorICAgICAgICBpZiAo
dmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlf
ZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZShvYmosIGtleU5hbWUpOworCisgICAgICAgICAgaWYg
KGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5TmFtZSBpbiBvYmopIHx8ICFPYmpl
Y3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBrZXlOYW1lKSkgewor
ICAgICAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLmRlZmluZVByb3BlcnR5KG9iaiwga2V5
TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkgc2V0dGVyCisgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBfZW1iZXJNZXRhbFV0aWxz
Lmxvb2t1cERlc2NyaXB0b3Iob2JqLCBrZXlOYW1lKTsKKyAgICAgICAgICAgICAgdmFyIGlzTWFu
ZGF0b3J5U2V0dGVyID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnNldCAmJiBkZXNjcmlwdG9y
LnNldC5pc01hbmRhdG9yeVNldHRlcjsKKyAgICAgICAgICAgICAgaWYgKGlzTWFuZGF0b3J5U2V0
dGVyKSB7CisgICAgICAgICAgICAgICAgbWV0YS53cml0ZVZhbHVlcyhrZXlOYW1lLCB2YWx1ZSk7
CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2JqW2tleU5hbWVdID0g
dmFsdWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5RGlkQ2hhbmdlKG9iaiwga2V5TmFtZSk7Cisg
ICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9ialtrZXlOYW1lXSA9IHZhbHVlOwor
ICAgICAgICBpZiAob2JqW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BFUlRZX0RJRF9D
SEFOR0VdKSB7CisgICAgICAgICAgb2JqW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BF
UlRZX0RJRF9DSEFOR0VdKGtleU5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHNldFBhdGgocm9vdCwgcGF0aCwgdmFs
dWUsIHRvbGVyYW50KSB7CisgICAgdmFyIGtleU5hbWU7CisKKyAgICAvLyBnZXQgdGhlIGxhc3Qg
cGFydCBvZiB0aGUgcGF0aAorICAgIGtleU5hbWUgPSBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4
T2YoJy4nKSArIDEpOworCisgICAgLy8gZ2V0IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXJ0Cisg
ICAgcGF0aCA9IHBhdGggPT09IGtleU5hbWUgPyBrZXlOYW1lIDogcGF0aC5zbGljZSgwLCBwYXRo
Lmxlbmd0aCAtIChrZXlOYW1lLmxlbmd0aCArIDEpKTsKKworICAgIC8vIHVubGVzcyB0aGUgcGF0
aCBpcyB0aGlzLCBsb29rIHVwIHRoZSBmaXJzdCBwYXJ0IHRvCisgICAgLy8gZ2V0IHRoZSByb290
CisgICAgaWYgKHBhdGggIT09ICd0aGlzJykgeworICAgICAgcm9vdCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0Ll9nZXRQYXRoKHJvb3QsIHBhdGgpOworICAgIH0KKworICAgIGlmICgha2V5TmFt
ZSB8fCBrZXlOYW1lLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFs
RXJyb3IuZGVmYXVsdCgnUHJvcGVydHkgc2V0IGZhaWxlZDogWW91IHBhc3NlZCBhbiBlbXB0eSBw
YXRoJyk7CisgICAgfQorCisgICAgaWYgKCFyb290KSB7CisgICAgICBpZiAodG9sZXJhbnQpIHsK
KyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJl
ck1ldGFsRXJyb3IuZGVmYXVsdCgnUHJvcGVydHkgc2V0IGZhaWxlZDogb2JqZWN0IGluIHBhdGgg
IicgKyBwYXRoICsgJyIgY291bGQgbm90IGJlIGZvdW5kIG9yIHdhcyBkZXN0cm95ZWQuJyk7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNldChyb290LCBrZXlOYW1lLCB2YWx1ZSk7Cisg
IH0KKworICAvKioKKyAgICBFcnJvci10b2xlcmFudCBmb3JtIG9mIGBFbWJlci5zZXRgLiBXaWxs
IG5vdCBibG93IHVwIGlmIGFueSBwYXJ0IG9mIHRoZQorICAgIGNoYWluIGlzIGB1bmRlZmluZWRg
LCBgbnVsbGAsIG9yIGRlc3Ryb3llZC4KKyAgCisgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3
aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1heSB0cnkgdG8gdXBkYXRlIGFmdGVyCisgICAg
YW4gb2JqZWN0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgCisgICAgQG1ldGhvZCB0cnlTZXQKKyAg
ICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBtb2Rp
ZnkuCisgICAgQHBhcmFtIHtTdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gc2V0Cisg
ICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKKyAgICBAcHVibGljCisg
ICovCisKKyAgZnVuY3Rpb24gdHJ5U2V0KHJvb3QsIHBhdGgsIHZhbHVlKSB7CisgICAgcmV0dXJu
IHNldChyb290LCBwYXRoLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KK30pOworZW5pZmVkKCJlbWJlci1t
ZXRhbC9yZXBsYWNlIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ug
c3RyaWN0IjsKKworICBleHBvcnRzLl9yZXBsYWNlID0gX3JlcGxhY2U7CisgIGV4cG9ydHMuZGVm
YXVsdCA9IHJlcGxhY2U7CisgIHZhciBzcGxpY2UgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlOwor
CisgIGZ1bmN0aW9uIF9yZXBsYWNlKGFycmF5LCBpZHgsIGFtdCwgb2JqZWN0cykgeworICAgIHZh
ciBhcmdzID0gW10uY29uY2F0KG9iamVjdHMpOworICAgIHZhciByZXQgPSBbXTsKKyAgICAvLyBo
dHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTY1ODgK
KyAgICB2YXIgc2l6ZSA9IDYwMDAwOworICAgIHZhciBzdGFydCA9IGlkeDsKKyAgICB2YXIgZW5k
cyA9IGFtdDsKKyAgICB2YXIgY291bnQsIGNodW5rOworCisgICAgd2hpbGUgKGFyZ3MubGVuZ3Ro
KSB7CisgICAgICBjb3VudCA9IGVuZHMgPiBzaXplID8gc2l6ZSA6IGVuZHM7CisgICAgICBpZiAo
Y291bnQgPD0gMCkgeworICAgICAgICBjb3VudCA9IDA7CisgICAgICB9CisKKyAgICAgIGNodW5r
ID0gYXJncy5zcGxpY2UoMCwgc2l6ZSk7CisgICAgICBjaHVuayA9IFtzdGFydCwgY291bnRdLmNv
bmNhdChjaHVuayk7CisKKyAgICAgIHN0YXJ0ICs9IHNpemU7CisgICAgICBlbmRzIC09IGNvdW50
OworCisgICAgICByZXQgPSByZXQuY29uY2F0KHNwbGljZS5hcHBseShhcnJheSwgY2h1bmspKTsK
KyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qKgorICAgIFJlcGxhY2VzIG9iamVj
dHMgaW4gYW4gYXJyYXkgd2l0aCB0aGUgcGFzc2VkIG9iamVjdHMuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIHZhciBhcnJheSA9IFsxLDIsM107CisgICAgICBFbWJlci5FbnVtZXJhYmxl
VXRpbHMucmVwbGFjZShhcnJheSwgMSwgMiwgWzQsIDVdKTsgLy8gWzEsIDQsIDVdCisgIAorICAg
ICAgdmFyIGFycmF5ID0gWzEsMiwzXTsKKyAgICAgIEVtYmVyLkVudW1lcmFibGVVdGlscy5yZXBs
YWNlKGFycmF5LCAxLCAxLCBbNCwgNV0pOyAvLyBbMSwgNCwgNSwgM10KKyAgCisgICAgICB2YXIg
YXJyYXkgPSBbMSwyLDNdOworICAgICAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2UoYXJy
YXksIDEwLCAxLCBbNCwgNV0pOyAvLyBbMSwgMiwgMywgNCwgNV0KKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCByZXBsYWNlCisgICAgQGRlcHJlY2F0ZWQKKyAgICBAcGFyYW0ge0FycmF5fSBhcnJh
eSBUaGUgYXJyYXkgdGhlIG9iamVjdHMgc2hvdWxkIGJlIGluc2VydGVkIGludG8uCisgICAgQHBh
cmFtIHtOdW1iZXJ9IGlkeCBTdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdG8gcmVwbGFjZS4g
SWYgKmlkeCogPj0KKyAgICBsZW5ndGgsIHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFy
cmF5LgorICAgIEBwYXJhbSB7TnVtYmVyfSBhbXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgc2hv
dWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXksCisgICAgc3RhcnRpbmcgYXQgKmlkeCoKKyAg
ICBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBvYmplY3Rz
IHRoYXQgc2hvdWxkIGJlCisgICAgaW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoKKyAg
CisgICAgQHJldHVybiB7QXJyYXl9IFRoZSBtb2RpZmllZCBhcnJheS4KKyAgICBAcHVibGljCisg
ICovCisKKyAgZnVuY3Rpb24gcmVwbGFjZShhcnJheSwgaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAg
ICBpZiAoYXJyYXkucmVwbGFjZSkgeworICAgICAgcmV0dXJuIGFycmF5LnJlcGxhY2UoaWR4LCBh
bXQsIG9iamVjdHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gX3JlcGxhY2UoYXJyYXks
IGlkeCwgYW10LCBvYmplY3RzKTsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRh
bC9ydW5fbG9vcCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50
cycsICdiYWNrYnVybmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9l
bWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZXZl
bnRzLCBfYmFja2J1cm5lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gcnVuOworCisgIGZ1bmN0aW9uIG9uQmVnaW4oY3VycmVudCkgeworICAgIHJ1bi5jdXJyZW50
UnVuTG9vcCA9IGN1cnJlbnQ7CisgIH0KKworICBmdW5jdGlvbiBvbkVuZChjdXJyZW50LCBuZXh0
KSB7CisgICAgcnVuLmN1cnJlbnRSdW5Mb29wID0gbmV4dDsKKyAgfQorCisgIC8vIEVTNlRPRE86
IHNob3VsZCBCYWNrYnVybmVyIGJlY29tZSBlczY/CisgIHZhciBiYWNrYnVybmVyID0gbmV3IF9i
YWNrYnVybmVyLmRlZmF1bHQoWydzeW5jJywgJ2FjdGlvbnMnLCAnZGVzdHJveSddLCB7CisgICAg
R1VJRF9LRVk6IF9lbWJlck1ldGFsVXRpbHMuR1VJRF9LRVksCisgICAgc3luYzogeworICAgICAg
YmVmb3JlOiBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblByb3BlcnR5Q2hhbmdlcywK
KyAgICAgIGFmdGVyOiBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5lbmRQcm9wZXJ0eUNoYW5n
ZXMKKyAgICB9LAorICAgIGRlZmF1bHRRdWV1ZTogJ2FjdGlvbnMnLAorICAgIG9uQmVnaW46IG9u
QmVnaW4sCisgICAgb25FbmQ6IG9uRW5kLAorICAgIG9uRXJyb3JUYXJnZXQ6IF9lbWJlck1ldGFs
Q29yZS5kZWZhdWx0LAorICAgIG9uRXJyb3JNZXRob2Q6ICdvbmVycm9yJworICB9KTsKKworICAv
LyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uCisgIC8vIHJ1biAtIHRoaXMgaXMgaWRlYWxseSB0aGUgb25seSBwdWJsaWMgQVBJIHRoZSBk
ZXYgc2VlcworICAvLworCisgIC8qKgorICAgIFJ1bnMgdGhlIHBhc3NlZCB0YXJnZXQgYW5kIG1l
dGhvZCBpbnNpZGUgb2YgYSBSdW5Mb29wLCBlbnN1cmluZyBhbnkKKyAgICBkZWZlcnJlZCBhY3Rp
b25zIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBkYXRlcyBhcmUgZmx1c2hlZCBhdCB0
aGUKKyAgICBlbmQuCisgIAorICAgIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQgdG8gaW52
b2tlIHRoaXMgbWV0aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCisgICAgeW91IGFyZSBpbXBsZW1l
bnRpbmcgcmF3IGV2ZW50IGhhbmRsZXJzIHdoZW4gaW50ZXJmYWNpbmcgd2l0aCBvdGhlcgorICAg
IGxpYnJhcmllcyBvciBwbHVnaW5zLCB5b3Ugc2hvdWxkIHByb2JhYmx5IHdyYXAgYWxsIG9mIHlv
dXIgY29kZSBpbnNpZGUgdGhpcworICAgIGNhbGwuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBydW4oZnVuY3Rpb24oKSB7CisgICAgICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGVkIHdpdGhpbiBh
IFJ1bkxvb3AKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQGNsYXNzIHJ1bgorICAgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgICBAc3RhdGljCisgICAgQGNvbnN0cnVjdG9yCisgICAgQHBhcmFtIHtP
YmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gY2FsbAorICAgIEBwYXJhbSB7RnVu
Y3Rpb258U3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGludm9rZS4KKyAgICAgIE1heSBiZSBhIGZ1
bmN0aW9uIG9yIGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZworICAgICAgdGhlbiBpdCB3
aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KKyAgICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgeW91IHdpc2ggdG8gcGFzcyB0byB0
aGUgbWV0aG9kLgorICAgIEByZXR1cm4ge09iamVjdH0gcmV0dXJuIHZhbHVlIGZyb20gaW52b2tp
bmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4KKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
cnVuKCkgeworICAgIHJldHVybiBiYWNrYnVybmVyLnJ1bi5hcHBseShiYWNrYnVybmVyLCBhcmd1
bWVudHMpOworICB9CisKKyAgLyoqCisgICAgSWYgbm8gcnVuLWxvb3AgaXMgcHJlc2VudCwgaXQg
Y3JlYXRlcyBhIG5ldyBvbmUuIElmIGEgcnVuIGxvb3AgaXMKKyAgICBwcmVzZW50IGl0IHdpbGwg
cXVldWUgaXRzZWxmIHRvIHJ1biBvbiB0aGUgZXhpc3RpbmcgcnVuLWxvb3BzIGFjdGlvbgorICAg
IHF1ZXVlLgorICAKKyAgICBQbGVhc2Ugbm90ZTogVGhpcyBpcyBub3QgZm9yIG5vcm1hbCB1c2Fn
ZSwgYW5kIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKyAgCisgICAgSWYgaW52b2tlZCB3aGVu
IG5vdCB3aXRoaW4gYSBydW4gbG9vcDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5q
b2luKGZ1bmN0aW9uKCkgeworICAgICAgLy8gY3JlYXRlcyBhIG5ldyBydW4tbG9vcAorICAgIH0p
OworICAgIGBgYAorICAKKyAgICBBbHRlcm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGluIGFuIGV4
aXN0aW5nIHJ1biBsb29wOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuKGZ1bmN0aW9u
KCkgeworICAgICAgLy8gY3JlYXRlcyBhIG5ldyBydW4tbG9vcAorICAgICAgcnVuLmpvaW4oZnVu
Y3Rpb24oKSB7CisgICAgICAgIC8vIGpvaW5zIHdpdGggdGhlIGV4aXN0aW5nIHJ1bi1sb29wLCBh
bmQgcXVldWVzIGZvciBpbnZvY2F0aW9uIG9uCisgICAgICAgIC8vIHRoZSBleGlzdGluZyBydW4t
bG9vcHMgYWN0aW9uIHF1ZXVlLgorICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IEBtZXRob2Qgam9pbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
W3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbnxT
dHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gaW52b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24g
b3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUg
bG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJn
cypdIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRo
b2QuCisgICAgQHJldHVybiB7T2JqZWN0fSBSZXR1cm4gdmFsdWUgZnJvbSBpbnZva2luZyB0aGUg
cGFzc2VkIGZ1bmN0aW9uLiBQbGVhc2Ugbm90ZSwKKyAgICB3aGVuIGNhbGxlZCB3aXRoaW4gYW4g
ZXhpc3RpbmcgbG9vcCwgbm8gcmV0dXJuIHZhbHVlIGlzIHBvc3NpYmxlLgorICAgIEBwdWJsaWMK
KyAgKi8KKyAgcnVuLmpvaW4gPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIGJhY2tidXJuZXIu
am9pbi5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8qKgorICAgIEFs
bG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBjb250ZXh0IHRvIGNhbGwgdGhlIHNwZWNpZmllZCBm
dW5jdGlvbiBpbiB3aGlsZQorICAgIGFkZGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoYXQgZnVuY3Rp
b24gdG8gdGhlIEVtYmVyIHJ1biBsb29wLiBUaGlzIGFiaWxpdHkKKyAgICBtYWtlcyB0aGlzIG1l
dGhvZCBhIGdyZWF0IHdheSB0byBhc3luY2hyb25vdXNseSBpbnRlZ3JhdGUgdGhpcmQtcGFydHkg
bGlicmFyaWVzCisgICAgaW50byB5b3VyIEVtYmVyIGFwcGxpY2F0aW9uLgorICAKKyAgICBgcnVu
LmJpbmRgIHRha2VzIHR3byBtYWluIGFyZ3VtZW50cywgdGhlIGRlc2lyZWQgY29udGV4dCBhbmQg
dGhlIGZ1bmN0aW9uIHRvCisgICAgaW52b2tlIGluIHRoYXQgY29udGV4dC4gQW55IGFkZGl0aW9u
YWwgYXJndW1lbnRzIHdpbGwgYmUgc3VwcGxpZWQgYXMgYXJndW1lbnRzCisgICAgdG8gdGhlIGZ1
bmN0aW9uIHRoYXQgaXMgcGFzc2VkIGluLgorICAKKyAgICBMZXQncyB1c2UgdGhlIGNyZWF0aW9u
IG9mIGEgVGlueU1DRSBjb21wb25lbnQgYXMgYW4gZXhhbXBsZS4gQ3VycmVudGx5LAorICAgIFRp
bnlNQ0UgcHJvdmlkZXMgYSBzZXR1cCBjb25maWd1cmF0aW9uIG9wdGlvbiB3ZSBjYW4gdXNlIHRv
IGRvIHNvbWUgcHJvY2Vzc2luZworICAgIGFmdGVyIHRoZSBUaW55TUNFIGluc3RhbmNlIGlzIGlu
aXRpYWxpemVkIGJ1dCBiZWZvcmUgaXQgaXMgYWN0dWFsbHkgcmVuZGVyZWQuCisgICAgV2UgY2Fu
IHVzZSB0aGF0IHNldHVwIG9wdGlvbiB0byBkbyBzb21lIGFkZGl0aW9uYWwgc2V0dXAgZm9yIG91
ciBjb21wb25lbnQuCisgICAgVGhlIGNvbXBvbmVudCBpdHNlbGYgY291bGQgbG9vayBzb21ldGhp
bmcgbGlrZSB0aGUgZm9sbG93aW5nOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJp
Y2hUZXh0RWRpdG9yQ29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBp
bml0aWFsaXplVGlueU1DRTogRW1iZXIub24oJ2RpZEluc2VydEVsZW1lbnQnLCBmdW5jdGlvbigp
IHsKKyAgICAgICAgdGlueW1jZS5pbml0KHsKKyAgICAgICAgICBzZWxlY3RvcjogJyMnICsgdGhp
cy4kKCkucHJvcCgnaWQnKSwKKyAgICAgICAgICBzZXR1cDogRW1iZXIucnVuLmJpbmQodGhpcywg
dGhpcy5zZXR1cEVkaXRvcikKKyAgICAgICAgfSk7CisgICAgICB9KSwKKyAgCisgICAgICBzZXR1
cEVkaXRvcjogZnVuY3Rpb24oZWRpdG9yKSB7CisgICAgICAgIHRoaXMuc2V0KCdlZGl0b3InLCBl
ZGl0b3IpOworICAKKyAgICAgICAgZWRpdG9yLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBjaGFuZ2VkIScpOworICAgICAgICB9KTsKKyAg
ICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSW4gdGhpcyBleGFtcGxlLCB3ZSB1c2Ug
RW1iZXIucnVuLmJpbmQgdG8gYmluZCB0aGUgc2V0dXBFZGl0b3IgbWV0aG9kIHRvIHRoZQorICAg
IGNvbnRleHQgb2YgdGhlIEFwcC5SaWNoVGV4dEVkaXRvckNvbXBvbmVudCBhbmQgdG8gaGF2ZSB0
aGUgaW52b2NhdGlvbiBvZiB0aGF0CisgICAgbWV0aG9kIGJlIHNhZmVseSBoYW5kbGVkIGFuZCBl
eGVjdXRlZCBieSB0aGUgRW1iZXIgcnVuIGxvb3AuCisgIAorICAgIEBtZXRob2QgYmluZAorICAg
IEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9m
IG1ldGhvZCB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBNZXRo
b2QgdG8gaW52b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlv
dSBwYXNzIGEgc3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBw
YXNzZWQgdGFyZ2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFs
IGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgQHJldHVybiB7
RnVuY3Rpb259IHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3aWxsIGFsd2F5cyBoYXZlIGEg
cGFydGljdWxhciBjb250ZXh0CisgICAgQHNpbmNlIDEuNC4wCisgICAgQHB1YmxpYworICAqLwor
ICBydW4uYmluZCA9IGZ1bmN0aW9uICgpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRz
Lmxlbmd0aCwgY3VycmllZCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9r
ZXkrKykgeworICAgICAgY3VycmllZFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisK
KyAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVu
dHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7
IF9rZXkyKyspIHsKKyAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAg
ICAgfQorCisgICAgICByZXR1cm4gcnVuLmpvaW4uYXBwbHkocnVuLCBjdXJyaWVkLmNvbmNhdChh
cmdzKSk7CisgICAgfTsKKyAgfTsKKworICBydW4uYmFja2J1cm5lciA9IGJhY2tidXJuZXI7Cisg
IHJ1bi5jdXJyZW50UnVuTG9vcCA9IG51bGw7CisgIHJ1bi5xdWV1ZXMgPSBiYWNrYnVybmVyLnF1
ZXVlTmFtZXM7CisKKyAgLyoqCisgICAgQmVnaW5zIGEgbmV3IFJ1bkxvb3AuIEFueSBkZWZlcnJl
ZCBhY3Rpb25zIGludm9rZWQgYWZ0ZXIgdGhlIGJlZ2luIHdpbGwKKyAgICBiZSBidWZmZXJlZCB1
bnRpbCB5b3UgaW52b2tlIGEgbWF0Y2hpbmcgY2FsbCB0byBgcnVuLmVuZCgpYC4gVGhpcyBpcwor
ICAgIGEgbG93ZXItbGV2ZWwgd2F5IHRvIHVzZSBhIFJ1bkxvb3AgaW5zdGVhZCBvZiB1c2luZyBg
cnVuKClgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuLmJlZ2luKCk7CisgICAgLy8g
Y29kZSB0byBiZSBleGVjdXRlZCB3aXRoaW4gYSBSdW5Mb29wCisgICAgcnVuLmVuZCgpOworICAg
IGBgYAorICAKKyAgICBAbWV0aG9kIGJlZ2luCisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHVi
bGljCisgICovCisgIHJ1bi5iZWdpbiA9IGZ1bmN0aW9uICgpIHsKKyAgICBiYWNrYnVybmVyLmJl
Z2luKCk7CisgIH07CisKKyAgLyoqCisgICAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBj
YWxsZWQgc29tZXRpbWUgYWZ0ZXIgeW91IGNhbGwKKyAgICBgcnVuLmJlZ2luKClgIHRvIGZsdXNo
IGFueSBkZWZlcnJlZCBhY3Rpb25zLiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgd2F5CisgICAgdG8g
dXNlIGEgUnVuTG9vcCBpbnN0ZWFkIG9mIHVzaW5nIGBydW4oKWAuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBydW4uYmVnaW4oKTsKKyAgICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGVkIHdpdGhp
biBhIFJ1bkxvb3AKKyAgICBydW4uZW5kKCk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZW5k
CisgICAgQHJldHVybiB7dm9pZH0KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5lbmQgPSBmdW5j
dGlvbiAoKSB7CisgICAgYmFja2J1cm5lci5lbmQoKTsKKyAgfTsKKworICAvKioKKyAgICBBcnJh
eSBvZiBuYW1lZCBxdWV1ZXMuIFRoaXMgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hp
Y2ggcXVldWVzCisgICAgYXJlIGZsdXNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgUnVuTG9vcC4gWW91
IGNhbiBkZWZpbmUgeW91ciBvd24gcXVldWVzIGJ5CisgICAgc2ltcGx5IGFkZGluZyB0aGUgcXVl
dWUgbmFtZSB0byB0aGlzIGFycmF5LiBOb3JtYWxseSB5b3Ugc2hvdWxkIG5vdCBuZWVkCisgICAg
dG8gaW5zcGVjdCBvciBtb2RpZnkgdGhpcyBwcm9wZXJ0eS4KKyAgCisgICAgQHByb3BlcnR5IHF1
ZXVlcworICAgIEB0eXBlIEFycmF5CisgICAgQGRlZmF1bHQgWydzeW5jJywgJ2FjdGlvbnMnLCAn
ZGVzdHJveSddCisgICAgQHByaXZhdGUKKyAgKi8KKworICAvKioKKyAgICBBZGRzIHRoZSBwYXNz
ZWQgdGFyZ2V0L21ldGhvZCBhbmQgYW55IG9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgbmFtZWQK
KyAgICBxdWV1ZSB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBJZiB5
b3UgaGF2ZSBub3QgYWxyZWFkeQorICAgIHN0YXJ0ZWQgYSBSdW5Mb29wIHdoZW4gY2FsbGluZyB0
aGlzIG1ldGhvZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UKKyAgICBhdXRvbWF0aWNhbGx5
LgorICAKKyAgICBBdCB0aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMgc2NoZWR1bGVk
IGluIHRoaXMgd2F5IHdpbGwgYmUgaW52b2tlZC4KKyAgICBNZXRob2RzIHdpbGwgYmUgaW52b2tl
ZCBpbiBhbiBvcmRlciBtYXRjaGluZyB0aGUgbmFtZWQgcXVldWVzIGRlZmluZWQgaW4KKyAgICB0
aGUgYHJ1bi5xdWV1ZXNgIHByb3BlcnR5LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVu
LnNjaGVkdWxlKCdzeW5jJywgdGhpcywgZnVuY3Rpb24oKSB7CisgICAgICAvLyB0aGlzIHdpbGwg
YmUgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4gYmluZGluZ3MgYXJl
IHN5bmNlZAorICAgICAgY29uc29sZS5sb2coJ3NjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlJyk7Cisg
ICAgfSk7CisgIAorICAgIHJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIGZ1bmN0aW9uKCkg
eworICAgICAgLy8gdGhpcyB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSAnYWN0aW9ucycgcXVldWUs
IGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2VkLgorICAgICAgY29uc29sZS5sb2coJ3NjaGVkdWxl
ZCBvbiBhY3Rpb25zIHF1ZXVlJyk7CisgICAgfSk7CisgIAorICAgIC8vIE5vdGUgdGhlIGZ1bmN0
aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBiYXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4K
KyAgICAvLyBPdXRwdXQgd291bGQgYmU6CisgICAgLy8gICBzY2hlZHVsZWQgb24gc3luYyBxdWV1
ZQorICAgIC8vICAgc2NoZWR1bGVkIG9uIGFjdGlvbnMgcXVldWUKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBzY2hlZHVsZQorICAgIEBwYXJhbSB7U3RyaW5nfSBxdWV1ZSBUaGUgbmFtZSBvZiB0
aGUgcXVldWUgdG8gc2NoZWR1bGUgYWdhaW5zdC4KKyAgICAgIERlZmF1bHQgcXVldWVzIGFyZSAn
c3luYycgYW5kICdhY3Rpb25zJworICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQg
b2JqZWN0IHRvIHVzZSBhcyB0aGUgY29udGV4dCB3aGVuIGludm9raW5nIGEgbWV0aG9kLgorICAg
IEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuIElm
IHlvdSBwYXNzIGEgc3RyaW5nIGl0CisgICAgICB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZSB0YXJn
ZXQgb2JqZWN0IGF0IHRoZSB0aW1lIHRoZSBzY2hlZHVsZWQgaXRlbSBpcworICAgICAgaW52b2tl
ZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZnVuY3Rpb24uCisgICAgQHBhcmFt
IHtPYmplY3R9IFthcmd1bWVudHMqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRv
IHRoZSBxdWV1ZWQgbWV0aG9kLgorICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHB1YmxpYworICAq
LworICBydW4uc2NoZWR1bGUgPSBmdW5jdGlvbiAoKSAvKiBxdWV1ZSwgdGFyZ2V0LCBtZXRob2Qg
Ki97CisgICAgY2hlY2tBdXRvUnVuKCk7CisgICAgYmFja2J1cm5lci5zY2hlZHVsZS5hcHBseShi
YWNrYnVybmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8vIFVzZWQgYnkgZ2xvYmFsIHRlc3Qg
dGVhcmRvd24KKyAgcnVuLmhhc1NjaGVkdWxlZFRpbWVycyA9IGZ1bmN0aW9uICgpIHsKKyAgICBy
ZXR1cm4gYmFja2J1cm5lci5oYXNUaW1lcnMoKTsKKyAgfTsKKworICAvLyBVc2VkIGJ5IGdsb2Jh
bCB0ZXN0IHRlYXJkb3duCisgIHJ1bi5jYW5jZWxUaW1lcnMgPSBmdW5jdGlvbiAoKSB7CisgICAg
YmFja2J1cm5lci5jYW5jZWxUaW1lcnMoKTsKKyAgfTsKKworICAvKioKKyAgICBJbW1lZGlhdGVs
eSBmbHVzaGVzIGFueSBldmVudHMgc2NoZWR1bGVkIGluIHRoZSAnc3luYycgcXVldWUuIEJpbmRp
bmdzCisgICAgdXNlIHRoaXMgcXVldWUgc28gdGhpcyBtZXRob2QgaXMgYSB1c2VmdWwgd2F5IHRv
IGltbWVkaWF0ZWx5IGZvcmNlIGFsbAorICAgIGJpbmRpbmdzIGluIHRoZSBhcHBsaWNhdGlvbiB0
byBzeW5jLgorICAKKyAgICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYW55dGltZSB5b3Ug
bmVlZCBhbnkgY2hhbmdlZCBzdGF0ZSB0byBwcm9wYWdhdGUKKyAgICB0aHJvdWdob3V0IHRoZSBh
cHAgaW1tZWRpYXRlbHkgd2l0aG91dCByZXBhaW50aW5nIHRoZSBVSSAod2hpY2ggaGFwcGVucwor
ICAgIGluIHRoZSBsYXRlciAncmVuZGVyJyBxdWV1ZSBhZGRlZCBieSB0aGUgYGVtYmVyLXZpZXdz
YCBwYWNrYWdlKS4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5zeW5jKCk7CisgICAg
YGBgCisgIAorICAgIEBtZXRob2Qgc3luYworICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHByaXZh
dGUKKyAgKi8KKyAgcnVuLnN5bmMgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKGJhY2tidXJuZXIu
Y3VycmVudEluc3RhbmNlKSB7CisgICAgICBiYWNrYnVybmVyLmN1cnJlbnRJbnN0YW5jZS5xdWV1
ZXMuc3luYy5mbHVzaCgpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICBJbnZva2VzIHRoZSBw
YXNzZWQgdGFyZ2V0L21ldGhvZCBhbmQgb3B0aW9uYWwgYXJndW1lbnRzIGFmdGVyIGEgc3BlY2lm
aWVkCisgICAgcGVyaW9kIG9mIHRpbWUuIFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlzIG1ldGhv
ZCBtdXN0IGFsd2F5cyBiZSBhIG51bWJlcgorICAgIG9mIG1pbGxpc2Vjb25kcy4KKyAgCisgICAg
WW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUg
YWN0aW9uIGFmdGVyIGEKKyAgICBwZXJpb2Qgb2YgdGltZSBpbnN0ZWFkIG9mIHVzaW5nIGBzZXRU
aW1lb3V0KClgLiBUaGlzIG1ldGhvZCB3aWxsIGVuc3VyZSB0aGF0CisgICAgaXRlbXMgdGhhdCBl
eHBpcmUgZHVyaW5nIHRoZSBzYW1lIHNjcmlwdCBleGVjdXRpb24gY3ljbGUgYWxsIGV4ZWN1dGUK
KyAgICB0b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyBh
IHJlYWwgc2V0VGltZW91dC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHJ1bi5sYXRlciht
eUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gY29kZSBoZXJlIHdpbGwgZXhlY3V0ZSB3
aXRoaW4gYSBSdW5Mb29wIGluIGFib3V0IDUwMG1zIHdpdGggdGhpcyA9PSBteUNvbnRleHQKKyAg
ICB9LCA1MDApOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxhdGVyCisgICAgQHBhcmFtIHtP
YmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCisgICAgQHBhcmFtIHtG
dW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICAgIElmIHlv
dSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCisgICAgICB0YXJnZXQg
YXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgIEBwYXJhbSB7T2JqZWN0fSBb
YXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgorICAgIEBw
YXJhbSB7TnVtYmVyfSB3YWl0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KKyAgICBA
cmV0dXJuIHsqfSBUaW1lciBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIGNhbmNlbGxpbmcsIHNlZSBg
cnVuLmNhbmNlbGAuCisgICAgQHB1YmxpYworICAqLworICBydW4ubGF0ZXIgPSBmdW5jdGlvbiAo
KSAvKnRhcmdldCwgbWV0aG9kKi97CisgICAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBwbHko
YmFja2J1cm5lciwgYXJndW1lbnRzKTsKKyAgfTsKKworICAvKioKKyAgICBTY2hlZHVsZSBhIGZ1
bmN0aW9uIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhlIGN1cnJlbnQgUnVuTG9vcC4gVGhpcyBp
cyBlcXVpdmFsZW50CisgICAgdG8gY2FsbGluZyBgc2NoZWR1bGVPbmNlYCB3aXRoIHRoZSAiYWN0
aW9ucyIgcXVldWUuCisgIAorICAgIEBtZXRob2Qgb25jZQorICAgIEBwYXJhbSB7T2JqZWN0fSBb
dGFyZ2V0XSBUaGUgdGFyZ2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgIEBwYXJhbSB7
RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgICBJZiB5
b3UgcGFzcyBhIHN0cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQorICAgICAgdGFyZ2V0
IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KKyAgICBAcGFyYW0ge09iamVjdH0g
W2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KKyAgICBA
cmV0dXJuIHtPYmplY3R9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywg
c2VlIGBydW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5vbmNlID0gZnVuY3Rp
b24gKCkgeworICAgIGNoZWNrQXV0b1J1bigpOworCisgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1
bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xl
bjM7IF9rZXkzKyspIHsKKyAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTsKKyAg
ICB9CisKKyAgICBhcmdzLnVuc2hpZnQoJ2FjdGlvbnMnKTsKKyAgICByZXR1cm4gYmFja2J1cm5l
ci5zY2hlZHVsZU9uY2UuYXBwbHkoYmFja2J1cm5lciwgYXJncyk7CisgIH07CisKKyAgLyoqCisg
ICAgU2NoZWR1bGVzIGEgZnVuY3Rpb24gdG8gcnVuIG9uZSB0aW1lIGluIGEgZ2l2ZW4gcXVldWUg
b2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4KKyAgICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhl
IHNhbWUgcXVldWUvdGFyZ2V0L21ldGhvZCBjb21iaW5hdGlvbiB3aWxsIGhhdmUKKyAgICBubyBl
ZmZlY3QgKHBhc3QgdGhlIGluaXRpYWwgY2FsbCkuCisgIAorICAgIE5vdGUgdGhhdCBhbHRob3Vn
aCB5b3UgY2FuIHBhc3Mgb3B0aW9uYWwgYXJndW1lbnRzIHRoZXNlIHdpbGwgbm90IGJlCisgICAg
Y29uc2lkZXJlZCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuIE5ldyBhcmd1bWVudHMgd2ls
bCByZXBsYWNlIHByZXZpb3VzCisgICAgY2FsbHMuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBmdW5jdGlvbiBzYXlIaSgpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdoaScpOworICAgIH0KKyAg
CisgICAgcnVuKGZ1bmN0aW9uKCkgeworICAgICAgcnVuLnNjaGVkdWxlT25jZSgnYWZ0ZXJSZW5k
ZXInLCBteUNvbnRleHQsIHNheUhpKTsKKyAgICAgIHJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVu
ZGVyJywgbXlDb250ZXh0LCBzYXlIaSk7CisgICAgICAvLyBzYXlIaSB3aWxsIG9ubHkgYmUgZXhl
Y3V0ZWQgb25jZSwgaW4gdGhlIGFmdGVyUmVuZGVyIHF1ZXVlIG9mIHRoZSBSdW5Mb29wCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIEFsc28gbm90ZSB0aGF0IHBhc3NpbmcgYW4gYW5vbnltb3Vz
IGZ1bmN0aW9uIHRvIGBydW4uc2NoZWR1bGVPbmNlYCB3aWxsCisgICAgbm90IHByZXZlbnQgYWRk
aXRpb25hbCBjYWxscyB3aXRoIGFuIGlkZW50aWNhbCBhbm9ueW1vdXMgZnVuY3Rpb24gZnJvbQor
ICAgIHNjaGVkdWxpbmcgdGhlIGl0ZW1zIG11bHRpcGxlIHRpbWVzLCBlLmcuOgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gc2NoZWR1bGVJdCgpIHsKKyAgICAgIHJ1bi5zY2hl
ZHVsZU9uY2UoJ2FjdGlvbnMnLCBteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgICBjb25z
b2xlLmxvZygnQ2xvc3VyZScpOworICAgICAgfSk7CisgICAgfQorICAKKyAgICBzY2hlZHVsZUl0
KCk7CisgICAgc2NoZWR1bGVJdCgpOworICAKKyAgICAvLyAiQ2xvc3VyZSIgd2lsbCBwcmludCB0
d2ljZSwgZXZlbiB0aG91Z2ggd2UncmUgdXNpbmcgYHJ1bi5zY2hlZHVsZU9uY2VgLAorICAgIC8v
IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdlIHBhc3MgdG8gaXQgaXMgYW5vbnltb3VzIGFuZCB3b24n
dCBtYXRjaCB0aGUKKyAgICAvLyBwcmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24uCisgICAg
YGBgCisgIAorICAgIEF2YWlsYWJsZSBxdWV1ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZv
dW5kIGF0IGBydW4ucXVldWVzYAorICAKKyAgICBAbWV0aG9kIHNjaGVkdWxlT25jZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBh
Z2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUgJ3N5bmMnIGFuZCAnYWN0aW9ucycuCisgICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2YgdGhlIG1ldGhvZCB0byBpbnZva2Uu
CisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9r
ZS4KKyAgICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhl
CisgICAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgIEBw
YXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0
aW1lb3V0LgorICAgIEByZXR1cm4ge09iamVjdH0gVGltZXIgaW5mb3JtYXRpb24gZm9yIHVzZSBp
biBjYW5jZWxsaW5nLCBzZWUgYHJ1bi5jYW5jZWxgLgorICAgIEBwdWJsaWMKKyAgKi8KKyAgcnVu
LnNjaGVkdWxlT25jZSA9IGZ1bmN0aW9uICgpIC8qcXVldWUsIHRhcmdldCwgbWV0aG9kKi97Cisg
ICAgY2hlY2tBdXRvUnVuKCk7CisgICAgcmV0dXJuIGJhY2tidXJuZXIuc2NoZWR1bGVPbmNlLmFw
cGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7CisgIH07CisKKyAgLyoqCisgICAgU2NoZWR1bGVz
IGFuIGl0ZW0gdG8gcnVuIGZyb20gd2l0aGluIGEgc2VwYXJhdGUgcnVuIGxvb3AsIGFmdGVyCisg
ICAgY29udHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiBUaGlzIGlzIGVxdWl2
YWxlbnQgdG8gY2FsbGluZworICAgIGBydW4ubGF0ZXJgIHdpdGggYSB3YWl0IHRpbWUgb2YgMW1z
LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlv
bigpIHsKKyAgICAgIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG5leHQgcnVuIGxvb3As
CisgICAgICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3VycmVudCBvbmUK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgTXVsdGlwbGUgb3BlcmF0aW9ucyBzY2hlZHVsZWQg
d2l0aCBgcnVuLm5leHRgIHdpbGwgY29hbGVzY2UKKyAgICBpbnRvIHRoZSBzYW1lIGxhdGVyIHJ1
biBsb29wLCBhbG9uZyB3aXRoIGFueSBvdGhlciBvcGVyYXRpb25zCisgICAgc2NoZWR1bGVkIGJ5
IGBydW4ubGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQorICAgIHRpbWUg
dGhhdCBgcnVuLm5leHRgIG9wZXJhdGlvbnMgd2lsbCBmaXJlLgorICAKKyAgICBOb3RlIHRoYXQg
dGhlcmUgYXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0byB1c2luZyBgcnVuLm5leHRgLgorICAgIEZv
ciBpbnN0YW5jZSwgaWYgeW91J2QgbGlrZSB0byBzY2hlZHVsZSBhbiBvcGVyYXRpb24gdG8gaGFw
cGVuCisgICAgYWZ0ZXIgYWxsIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGF2ZSBjb21wbGV0ZWQg
d2l0aGluIHRoZSBjdXJyZW50CisgICAgcnVuIGxvb3AsIHlvdSBjYW4gbWFrZSB1c2Ugb2YgdGhl
IGBhZnRlclJlbmRlcmAgcnVuIGxvb3AgcXVldWUgKGFkZGVkCisgICAgYnkgdGhlIGBlbWJlci12
aWV3c2AgcGFja2FnZSwgYWxvbmcgd2l0aCB0aGUgcHJlY2VkaW5nIGByZW5kZXJgIHF1ZXVlCisg
ICAgd2hlcmUgYWxsIHRoZSBET00gZWxlbWVudCBvcGVyYXRpb25zIGhhcHBlbikuCisgIAorICAg
IEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJl
ci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICAgIGRpZEluc2VydEVsZW1lbnQoKSB7CisgICAgICAg
IHRoaXMuX3N1cGVyKC4uLmFyZ3VtZW50cyk7CisgICAgICAgIHJ1bi5zY2hlZHVsZU9uY2UoJ2Fm
dGVyUmVuZGVyJywgdGhpcywgJ3Byb2Nlc3NDaGlsZEVsZW1lbnRzJyk7CisgICAgICB9LAorICAK
KyAgICAgIHByb2Nlc3NDaGlsZEVsZW1lbnRzKCkgeworICAgICAgICAvLyAuLi4gZG8gc29tZXRo
aW5nIHdpdGggY29tcG9uZW50J3MgY2hpbGQgY29tcG9uZW50CisgICAgICAgIC8vIGVsZW1lbnRz
IGFmdGVyIHRoZXkndmUgZmluaXNoZWQgcmVuZGVyaW5nLCB3aGljaAorICAgICAgICAvLyBjYW4n
dCBiZSBkb25lIHdpdGhpbiB0aGlzIGNvbXBvbmVudCdzCisgICAgICAgIC8vIGBkaWRJbnNlcnRF
bGVtZW50YCBob29rIGJlY2F1c2UgdGhhdCBnZXRzIHJ1bgorICAgICAgICAvLyBiZWZvcmUgdGhl
IGNoaWxkIGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgRE9NLgorICAgICAgfQorICAg
IH0pOworICAgIGBgYAorICAKKyAgICBPbmUgYmVuZWZpdCBvZiB0aGUgYWJvdmUgYXBwcm9hY2gg
Y29tcGFyZWQgdG8gdXNpbmcgYHJ1bi5uZXh0YCBpcworICAgIHRoYXQgeW91IHdpbGwgYmUgYWJs
ZSB0byBwZXJmb3JtIERPTS9DU1Mgb3BlcmF0aW9ucyBiZWZvcmUgdW5wcm9jZXNzZWQKKyAgICBl
bGVtZW50cyBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlbiwgd2hpY2ggbWF5IHByZXZlbnQgZmxp
Y2tlcmluZyBvcgorICAgIG90aGVyIGFydGlmYWN0cyBjYXVzZWQgYnkgZGVsYXlpbmcgcHJvY2Vz
c2luZyB1bnRpbCBhZnRlciByZW5kZXJpbmcuCisgIAorICAgIFRoZSBvdGhlciBtYWpvciBiZW5l
Zml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0IGBydW4ubmV4dGAKKyAgICBpbnRyb2R1
Y2VzIGFuIGVsZW1lbnQgb2Ygbm9uLWRldGVybWluaXNtLCB3aGljaCBjYW4gbWFrZSB0aGluZ3Mg
bXVjaAorICAgIGhhcmRlciB0byB0ZXN0LCBkdWUgdG8gaXRzIHJlbGlhbmNlIG9uIGBzZXRUaW1l
b3V0YDsgaXQncyBtdWNoIGhhcmRlcgorICAgIHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Ygc2No
ZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBzY2hlZHVsZWQKKyAgICBvdXRzaWRlIG9m
IHRoZSBjdXJyZW50IHJ1biBsb29wLCBpLmUuIHdpdGggYHJ1bi5uZXh0YC4KKyAgCisgICAgQG1l
dGhvZCBuZXh0CisgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2Qg
dG8gaW52b2tlCisgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9k
IHRvIGludm9rZS4KKyAgICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2
ZWQgb24gdGhlCisgICAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2Vk
LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNz
IHRvIHRoZSB0aW1lb3V0LgorICAgIEByZXR1cm4ge09iamVjdH0gVGltZXIgaW5mb3JtYXRpb24g
Zm9yIHVzZSBpbiBjYW5jZWxsaW5nLCBzZWUgYHJ1bi5jYW5jZWxgLgorICAgIEBwdWJsaWMKKyAg
Ki8KKyAgcnVuLm5leHQgPSBmdW5jdGlvbiAoKSB7CisgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1
bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xl
bjQ7IF9rZXk0KyspIHsKKyAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTsKKyAg
ICB9CisKKyAgICBhcmdzLnB1c2goMSk7CisgICAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBw
bHkoYmFja2J1cm5lciwgYXJncyk7CisgIH07CisKKyAgLyoqCisgICAgQ2FuY2VscyBhIHNjaGVk
dWxlZCBpdGVtLiBNdXN0IGJlIGEgdmFsdWUgcmV0dXJuZWQgYnkgYHJ1bi5sYXRlcigpYCwKKyAg
ICBgcnVuLm9uY2UoKWAsIGBydW4uc2NoZWR1bGVPbmNlKClgLCBgcnVuLm5leHQoKWAsIGBydW4u
ZGVib3VuY2UoKWAsIG9yCisgICAgYHJ1bi50aHJvdHRsZSgpYC4KKyAgCisgICAgYGBgamF2YXNj
cmlwdAorICAgIHZhciBydW5OZXh0ID0gcnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpIHsK
KyAgICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisgICAgfSk7CisgIAorICAgIHJ1bi5jYW5j
ZWwocnVuTmV4dCk7CisgIAorICAgIHZhciBydW5MYXRlciA9IHJ1bi5sYXRlcihteUNvbnRleHQs
IGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKKyAgICB9LCA1MDAp
OworICAKKyAgICBydW4uY2FuY2VsKHJ1bkxhdGVyKTsKKyAgCisgICAgdmFyIHJ1blNjaGVkdWxl
T25jZSA9IHJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgbXlDb250ZXh0LCBmdW5jdGlv
bigpIHsKKyAgICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCisgICAgfSk7CisgIAorICAgIHJ1
bi5jYW5jZWwocnVuU2NoZWR1bGVPbmNlKTsKKyAgCisgICAgdmFyIHJ1bk9uY2UgPSBydW4ub25j
ZShteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQK
KyAgICB9KTsKKyAgCisgICAgcnVuLmNhbmNlbChydW5PbmNlKTsKKyAgCisgICAgdmFyIHRocm90
dGxlID0gcnVuLnRocm90dGxlKG15Q29udGV4dCwgZnVuY3Rpb24oKSB7CisgICAgICAvLyB3aWxs
IG5vdCBiZSBleGVjdXRlZAorICAgIH0sIDEsIGZhbHNlKTsKKyAgCisgICAgcnVuLmNhbmNlbCh0
aHJvdHRsZSk7CisgIAorICAgIHZhciBkZWJvdW5jZSA9IHJ1bi5kZWJvdW5jZShteUNvbnRleHQs
IGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKKyAgICB9LCAxKTsK
KyAgCisgICAgcnVuLmNhbmNlbChkZWJvdW5jZSk7CisgIAorICAgIHZhciBkZWJvdW5jZUltbWVk
aWF0ZSA9IHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIGZ1bmN0aW9uKCkgeworICAgICAgLy8gd2ls
bCBiZSBleGVjdXRlZCBzaW5jZSB3ZSBwYXNzZWQgaW4gdHJ1ZSAoaW1tZWRpYXRlKQorICAgIH0s
IDEwMCwgdHJ1ZSk7CisgIAorICAgIC8vIHRoZSAxMDBtcyBkZWxheSB1bnRpbCB0aGlzIG1ldGhv
ZCBjYW4gYmUgY2FsbGVkIGFnYWluIHdpbGwgYmUgY2FuY2VsbGVkCisgICAgcnVuLmNhbmNlbChk
ZWJvdW5jZUltbWVkaWF0ZSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgY2FuY2VsCisgICAg
QHBhcmFtIHtPYmplY3R9IHRpbWVyIFRpbWVyIG9iamVjdCB0byBjYW5jZWwKKyAgICBAcmV0dXJu
IHtCb29sZWFufSB0cnVlIGlmIGNhbmNlbGxlZCBvciBmYWxzZS91bmRlZmluZWQgaWYgaXQgd2Fz
bid0IGZvdW5kCisgICAgQHB1YmxpYworICAqLworICBydW4uY2FuY2VsID0gZnVuY3Rpb24gKHRp
bWVyKSB7CisgICAgcmV0dXJuIGJhY2tidXJuZXIuY2FuY2VsKHRpbWVyKTsKKyAgfTsKKworICAv
KioKKyAgICBEZWxheSBjYWxsaW5nIHRoZSB0YXJnZXQgbWV0aG9kIHVudGlsIHRoZSBkZWJvdW5j
ZSBwZXJpb2QgaGFzIGVsYXBzZWQKKyAgICB3aXRoIG5vIGFkZGl0aW9uYWwgZGVib3VuY2UgY2Fs
bHMuIElmIGBkZWJvdW5jZWAgaXMgY2FsbGVkIGFnYWluIGJlZm9yZQorICAgIHRoZSBzcGVjaWZp
ZWQgdGltZSBoYXMgZWxhcHNlZCwgdGhlIHRpbWVyIGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBl
cmlvZAorICAgIG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUgdGhlIHRhcmdldCBtZXRob2QgaXMgY2Fs
bGVkLgorICAKKyAgICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIGFuIGV2ZW50IG1h
eSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAgICBidXQgdGhlIGFjdGlvbiBzaG91bGQgb25s
eSBiZSBjYWxsZWQgb25jZSB3aGVuIHRoZSBldmVudCBpcyBkb25lIGZpcmluZy4KKyAgICBBIGNv
bW1vbiBleGFtcGxlIGlzIGZvciBzY3JvbGwgZXZlbnRzIHdoZXJlIHlvdSBvbmx5IHdhbnQgdXBk
YXRlcyB0bworICAgIGhhcHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vhc2VkLgorICAKKyAgICBg
YGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gd2hvUmFuKCkgeworICAgICAgY29uc29sZS5sb2co
dGhpcy5uYW1lICsgJyByYW4uJyk7CisgICAgfQorICAKKyAgICB2YXIgbXlDb250ZXh0ID0geyBu
YW1lOiAnZGVib3VuY2UnIH07CisgIAorICAgIHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIHdob1Jh
biwgMTUwKTsKKyAgCisgICAgLy8gbGVzcyB0aGFuIDE1MG1zIHBhc3NlcworICAgIHJ1bi5kZWJv
dW5jZShteUNvbnRleHQsIHdob1JhbiwgMTUwKTsKKyAgCisgICAgLy8gMTUwbXMgcGFzc2VzCisg
ICAgLy8gd2hvUmFuIGlzIGludm9rZWQgd2l0aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNv
bnNvbGUgbG9ncyAnZGVib3VuY2UgcmFuLicgb25lIHRpbWUuCisgICAgYGBgCisgIAorICAgIElt
bWVkaWF0ZSBhbGxvd3MgeW91IHRvIHJ1biB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHksIGJ1dCBk
ZWJvdW5jZQorICAgIG90aGVyIGNhbGxzIGZvciB0aGlzIGZ1bmN0aW9uIHVudGlsIHRoZSB3YWl0
IHRpbWUgaGFzIGVsYXBzZWQuIElmCisgICAgYGRlYm91bmNlYCBpcyBjYWxsZWQgYWdhaW4gYmVm
b3JlIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwKKyAgICB0aGUgdGltZXIgaXMgcmVz
ZXQgYW5kIHRoZSBlbnRpcmUgcGVyaW9kIG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUKKyAgICB0aGUg
bWV0aG9kIGNhbiBiZSBjYWxsZWQgYWdhaW4uCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBm
dW5jdGlvbiB3aG9SYW4oKSB7CisgICAgICBjb25zb2xlLmxvZyh0aGlzLm5hbWUgKyAnIHJhbi4n
KTsKKyAgICB9CisgIAorICAgIHZhciBteUNvbnRleHQgPSB7IG5hbWU6ICdkZWJvdW5jZScgfTsK
KyAgCisgICAgcnVuLmRlYm91bmNlKG15Q29udGV4dCwgd2hvUmFuLCAxNTAsIHRydWUpOworICAK
KyAgICAvLyBjb25zb2xlIGxvZ3MgJ2RlYm91bmNlIHJhbi4nIG9uZSB0aW1lIGltbWVkaWF0ZWx5
LgorICAgIC8vIDEwMG1zIHBhc3NlcworICAgIHJ1bi5kZWJvdW5jZShteUNvbnRleHQsIHdob1Jh
biwgMTUwLCB0cnVlKTsKKyAgCisgICAgLy8gMTUwbXMgcGFzc2VzIGFuZCBub3RoaW5nIGVsc2Ug
aXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGFuZAorICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMgbm8g
bG9uZ2VyIGJlaW5nIHdhdGNoZWQKKyAgICBydW4uZGVib3VuY2UobXlDb250ZXh0LCB3aG9SYW4s
IDE1MCwgdHJ1ZSk7CisgIAorICAgIC8vIGNvbnNvbGUgbG9ncyAnZGVib3VuY2UgcmFuLicgb25l
IHRpbWUgaW1tZWRpYXRlbHkuCisgICAgLy8gMTUwbXMgcGFzc2VzIGFuZCBub3RoaW5nIGVsc2Ug
aXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIGFuZAorICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMgbm8g
bG9uZ2VyIGJlaW5nIHdhdGNoZWQKKyAgCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgZGVib3Vu
Y2UKKyAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZv
a2UKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52
b2tlLgorICAgICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEg
c3RyaW5nCisgICAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFy
Z2V0LgorICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBw
YXNzIHRvIHRoZSB0aW1lb3V0LgorICAgIEBwYXJhbSB7TnVtYmVyfSB3YWl0IE51bWJlciBvZiBt
aWxsaXNlY29uZHMgdG8gd2FpdC4KKyAgICBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZSBUcmln
Z2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGluZyBpbnN0ZWFkCisgICAgICBvZiB0aGUgdHJh
aWxpbmcgZWRnZSBvZiB0aGUgd2FpdCBpbnRlcnZhbC4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAg
QHJldHVybiB7QXJyYXl9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywg
c2VlIGBydW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi5kZWJvdW5jZSA9IGZ1
bmN0aW9uICgpIHsKKyAgICByZXR1cm4gYmFja2J1cm5lci5kZWJvdW5jZS5hcHBseShiYWNrYnVy
bmVyLCBhcmd1bWVudHMpOworICB9OworCisgIC8qKgorICAgIEVuc3VyZSB0aGF0IHRoZSB0YXJn
ZXQgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbgorICAgIHRoZSBz
cGVjaWZpZWQgc3BhY2luZyBwZXJpb2QuIFRoZSB0YXJnZXQgbWV0aG9kIGlzIGNhbGxlZCBpbW1l
ZGlhdGVseS4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uIHdob1JhbigpIHsK
KyAgICAgIGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOworICAgIH0KKyAgCisgICAg
dmFyIG15Q29udGV4dCA9IHsgbmFtZTogJ3Rocm90dGxlJyB9OworICAKKyAgICBydW4udGhyb3R0
bGUobXlDb250ZXh0LCB3aG9SYW4sIDE1MCk7CisgICAgLy8gd2hvUmFuIGlzIGludm9rZWQgd2l0
aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNvbnNvbGUgbG9ncyAndGhyb3R0bGUgcmFuLicK
KyAgCisgICAgLy8gNTBtcyBwYXNzZXMKKyAgICBydW4udGhyb3R0bGUobXlDb250ZXh0LCB3aG9S
YW4sIDE1MCk7CisgIAorICAgIC8vIDUwbXMgcGFzc2VzCisgICAgcnVuLnRocm90dGxlKG15Q29u
dGV4dCwgd2hvUmFuLCAxNTApOworICAKKyAgICAvLyAxNTBtcyBwYXNzZXMKKyAgICBydW4udGhy
b3R0bGUobXlDb250ZXh0LCB3aG9SYW4sIDE1MCk7CisgICAgLy8gd2hvUmFuIGlzIGludm9rZWQg
d2l0aCBjb250ZXh0IG15Q29udGV4dAorICAgIC8vIGNvbnNvbGUgbG9ncyAndGhyb3R0bGUgcmFu
LicKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCB0aHJvdHRsZQorICAgIEBwYXJhbSB7T2JqZWN0
fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGludm9rZQorICAgIEBwYXJhbSB7RnVuY3Rp
b258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCisgICAgICBNYXkgYmUgYSBm
dW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcKKyAgICAgIHRoZW4gaXQg
d2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBhc3NlZCB0YXJnZXQuCisgICAgQHBhcmFtIHtPYmpl
Y3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCisg
ICAgQHBhcmFtIHtOdW1iZXJ9IHNwYWNpbmcgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzcGFj
ZSBvdXQgcmVxdWVzdHMuCisgICAgQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgVHJpZ2dlciB0
aGUgZnVuY3Rpb24gb24gdGhlIGxlYWRpbmcgaW5zdGVhZAorICAgICAgb2YgdGhlIHRyYWlsaW5n
IGVkZ2Ugb2YgdGhlIHdhaXQgaW50ZXJ2YWwuIERlZmF1bHRzIHRvIHRydWUuCisgICAgQHJldHVy
biB7QXJyYXl9IFRpbWVyIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywgc2VlIGBy
dW4uY2FuY2VsYC4KKyAgICBAcHVibGljCisgICovCisgIHJ1bi50aHJvdHRsZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgICByZXR1cm4gYmFja2J1cm5lci50aHJvdHRsZS5hcHBseShiYWNrYnVybmVyLCBh
cmd1bWVudHMpOworICB9OworCisgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBhdXRvcnVuIGR1
cmluZyB0ZXN0aW5nCisgIGZ1bmN0aW9uIGNoZWNrQXV0b1J1bigpIHsKKyAgICBpZiAoIXJ1bi5j
dXJyZW50UnVuTG9vcCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBoYXZl
IHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4tbG9vcFwncyBh
dXRvcnVuLiAnICsgJ1lvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5jaHJv
bm91cyBzaWRlLWVmZmVjdHMgaW4gYSBydW4nLCAhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQudGVz
dGluZyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGFm
dGVyIHRoZSBzcGVjaWZpZWQgcXVldWUuCisgIAorICAgIFRoZSBxdWV1ZSB0byBhZGQgd2lsbCBv
bmx5IGJlIGFkZGVkIG9uY2UuCisgIAorICAgIEBtZXRob2QgX2FkZFF1ZXVlCisgICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGFkZC4KKyAgICBAcGFyYW0g
e1N0cmluZ30gYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIGFkZCBhZnRlci4KKyAgICBA
cHJpdmF0ZQorICAqLworICBydW4uX2FkZFF1ZXVlID0gZnVuY3Rpb24gKG5hbWUsIGFmdGVyKSB7
CisgICAgaWYgKHJ1bi5xdWV1ZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHsKKyAgICAgIHJ1bi5x
dWV1ZXMuc3BsaWNlKHJ1bi5xdWV1ZXMuaW5kZXhPZihhZnRlcikgKyAxLCAwLCBuYW1lKTsKKyAg
ICB9CisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzJywgJ2VtYmVyLW1ldGFsL3Byb3Bl
cnR5X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMs
IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmRlZmF1bHQgPSBzZXRQcm9wZXJ0aWVzOworCisgIC8qKgorICAgIFNldCBhIGxpc3Qgb2YgcHJv
cGVydGllcyBvbiBhbiBvYmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUKKyAg
ICBhIHNpbmdsZSBgYmVnaW5Qcm9wZXJ0eUNoYW5nZXNgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2Vz
YCBiYXRjaCwgc28KKyAgICBvYnNlcnZlcnMgd2lsbCBiZSBidWZmZXJlZC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBhbk9iamVjdCA9IEVtYmVyLk9iamVjdC5jcmVhdGUoKTsKKyAg
CisgICAgYW5PYmplY3Quc2V0UHJvcGVydGllcyh7CisgICAgICBmaXJzdE5hbWU6ICdTdGFubGV5
JywKKyAgICAgIGxhc3ROYW1lOiAnU3R1YXJ0JywKKyAgICAgIGFnZTogMjEKKyAgICB9KTsKKyAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCisgICAgQHBhcmFtIG9iagorICAg
IEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzCisgICAgQHJldHVybiBwcm9wZXJ0aWVzCisgICAg
QHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNldFByb3BlcnRpZXMob2JqLCBwcm9wZXJ0aWVz
KSB7CisgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHR5cGVvZiBwcm9wZXJ0aWVzICE9PSAnb2JqZWN0
JykgeworICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQorICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfZXZlbnRzLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBy
b3BzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7CisgICAgICB2YXIgcHJvcGVydHlOYW1lOwor
CisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHByb3BzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wc1tpXTsKKworICAgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQob2JqLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnRpZXNbcHJvcGVydHlOYW1l
XSk7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1tZXRhbC9zdHJlYW1zL2RlcGVuZGVuY3knLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLW1ldGFsL3N0cmVh
bXMvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsQXNzaWduLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykgeworICAndXNlIHN0cmljdCc7CisK
KyAgLyoqCisgICAgQG1vZHVsZSBlbWJlci1tZXRhbAorICAqLworCisgIC8qKgorICAgIEBwcml2
YXRlCisgICAgQGNsYXNzIERlcGVuZGVuY3kKKyAgICBAbmFtZXNwYWNlIEVtYmVyLnN0cmVhbXMK
KyAgICBAY29uc3RydWN0b3IKKyAgKi8KKyAgZnVuY3Rpb24gRGVwZW5kZW5jeShkZXBlbmRlciwg
ZGVwZW5kZWUpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnRGVwZW5kZW5jeSBlcnJv
cjogRGVwZW5kZXIgbXVzdCBiZSBhIHN0cmVhbScsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmlz
U3RyZWFtKGRlcGVuZGVyKSk7CisKKyAgICB0aGlzLm5leHQgPSBudWxsOworICAgIHRoaXMucHJl
diA9IG51bGw7CisgICAgdGhpcy5kZXBlbmRlciA9IGRlcGVuZGVyOworICAgIHRoaXMuZGVwZW5k
ZWUgPSBkZXBlbmRlZTsKKyAgICB0aGlzLnVuc3Vic2NyaXB0aW9uID0gbnVsbDsKKyAgfQorCisg
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoRGVwZW5kZW5jeS5wcm90b3R5cGUsIHsKKyAgICBz
dWJzY3JpYmU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdE
ZXBlbmRlbmN5IGVycm9yOiBEZXBlbmRlbmN5IHRyaWVkIHRvIHN1YnNjcmliZSB3aGlsZSBhbHJl
YWR5IHN1YnNjcmliZWQnLCAhdGhpcy51bnN1YnNjcmlwdGlvbik7CisKKyAgICAgIHRoaXMudW5z
dWJzY3JpcHRpb24gPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5zdWJzY3JpYmUodGhpcy5kZXBl
bmRlZSwgdGhpcy5kZXBlbmRlci5ub3RpZnksIHRoaXMuZGVwZW5kZXIpOworICAgIH0sCisKKyAg
ICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKHRoaXMudW5zdWJzY3JpcHRp
b24pIHsKKyAgICAgICAgdGhpcy51bnN1YnNjcmlwdGlvbigpOworICAgICAgICB0aGlzLnVuc3Vi
c2NyaXB0aW9uID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVwbGFjZTogZnVuY3Rp
b24gKGRlcGVuZGVlKSB7CisgICAgICBpZiAodGhpcy5kZXBlbmRlZSAhPT0gZGVwZW5kZWUpIHsK
KyAgICAgICAgdGhpcy5kZXBlbmRlZSA9IGRlcGVuZGVlOworCisgICAgICAgIGlmICh0aGlzLnVu
c3Vic2NyaXB0aW9uKSB7CisgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOworICAgICAgICAg
IHRoaXMuc3Vic2NyaWJlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIGdldFZhbHVlOiBmdW5jdGlv
biAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZCh0aGlzLmRl
cGVuZGVlKTsKKyAgICB9LAorCisgICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkgeworICAg
ICAgcmV0dXJuIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnNldFZhbHVlKHRoaXMuZGVwZW5kZWUs
IHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBkZXN0cm95KCkgeworICAgIC8vICAgdmFyIG5leHQg
PSB0aGlzLm5leHQ7CisgICAgLy8gICB2YXIgcHJldiA9IHRoaXMucHJldjsKKworICAgIC8vICAg
aWYgKHByZXYpIHsKKyAgICAvLyAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAvLyAgIH0gZWxz
ZSB7CisgICAgLy8gICAgIHRoaXMuZGVwZW5kZXIuZGVwZW5kZW5jeUhlYWQgPSBuZXh0OworICAg
IC8vICAgfQorCisgICAgLy8gICBpZiAobmV4dCkgeworICAgIC8vICAgICBuZXh0LnByZXYgPSBw
cmV2OworICAgIC8vICAgfSBlbHNlIHsKKyAgICAvLyAgICAgdGhpcy5kZXBlbmRlci5kZXBlbmRl
bmN5VGFpbCA9IHByZXY7CisgICAgLy8gICB9CisKKyAgICAvLyAgIHRoaXMudW5zdWJzY3JpYmUo
KTsKKyAgICAvLyB9CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IERlcGVuZGVuY3k7Cit9
KTsKK2VuaWZlZCgnZW1iZXItbWV0YWwvc3RyZWFtcy9rZXktc3RyZWFtJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwv
c3RyZWFtcy9zdHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0sIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICBmdW5jdGlvbiBsYWJlbEZvcihzb3VyY2UsIGtleSkgeworICAgIHJldHVybiBzb3VyY2UubGFi
ZWwgPyBzb3VyY2UubGFiZWwgKyAnLicgKyBrZXkgOiBrZXk7CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uZGVmYXVsdC5leHRlbmQoeworICAgIGlu
aXQ6IGZ1bmN0aW9uIChzb3VyY2UsIGtleSkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3Nl
cnQoJ0tleVN0cmVhbSBlcnJvcjogc291cmNlIG11c3QgYmUgYSBzdHJlYW0nLCBfZW1iZXJNZXRh
bFN0cmVhbXNVdGlscy5pc1N0cmVhbShzb3VyY2UpKTsgLy8gVE9ETzogVGhpcyBpc24ndCBuZWNl
c3NhcnkuCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnS2V5U3RyZWFtIGVycm9yOiBr
ZXkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAm
JiBrZXkubGVuZ3RoID4gMCk7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnS2V5U3Ry
ZWFtIGVycm9yOiBrZXkgbXVzdCBub3QgaGF2ZSBhIFwnLlwnJywga2V5LmluZGV4T2YoJy4nKSA9
PT0gLTEpOworCisgICAgICB2YXIgbGFiZWwgPSBsYWJlbEZvcihzb3VyY2UsIGtleSk7CisKKyAg
ICAgIHRoaXMucGF0aCA9IGxhYmVsOworICAgICAgdGhpcy5vYnNlcnZlZE9iamVjdCA9IG51bGw7
CisgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIHRoaXMuc291cmNlRGVwID0gdGhpcy5hZGRN
dXRhYmxlRGVwZW5kZW5jeShzb3VyY2UpOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAg
IH0sCisKKyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhp
cy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIHZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsK
KworICAgICAgaWYgKCFvYmplY3QgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICAg
IHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQob2JqZWN0LCB0aGlzLmtleSk7Cisg
ICAgICB9CisKKyAgICAgIHJldHVybiBvYmplY3RbdGhpcy5rZXldOworICAgIH0sCisKKyAgICBz
ZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5zb3Vy
Y2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmIChvYmplY3QpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxQcm9wZXJ0eV9zZXQuc2V0KG9iamVjdCwgdGhpcy5rZXksIHZhbHVlKTsKKyAgICAgIH0KKyAg
ICB9LAorCisgICAgc2V0U291cmNlOiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICB0aGlzLnNv
dXJjZURlcC5yZXBsYWNlKHNvdXJjZSk7CisgICAgICB0aGlzLm5vdGlmeSgpOworICAgIH0sCisK
KyAgICBfc3VwZXIkcmV2YWxpZGF0ZTogX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQu
cHJvdG90eXBlLnJldmFsaWRhdGUsCisKKyAgICByZXZhbGlkYXRlOiBmdW5jdGlvbiAodmFsdWUp
IHsKKyAgICAgIHRoaXMuX3N1cGVyJHJldmFsaWRhdGUodmFsdWUpOworCisgICAgICB2YXIgb2Jq
ZWN0ID0gdGhpcy5zb3VyY2VEZXAuZ2V0VmFsdWUoKTsKKyAgICAgIGlmIChvYmplY3QgIT09IHRo
aXMub2JzZXJ2ZWRPYmplY3QpIHsKKyAgICAgICAgdGhpcy5fY2xlYXJPYnNlcnZlZE9iamVjdCgp
OworCisgICAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKG9iamVjdCwgdGhpcy5r
ZXksIHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgICB0aGlzLm9ic2VydmVkT2JqZWN0ID0g
b2JqZWN0OworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIF9zdXBlciRkZWFjdGl2
YXRlOiBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uZGVmYXVsdC5wcm90b3R5cGUuZGVhY3RpdmF0
ZSwKKworICAgIF9jbGVhck9ic2VydmVkT2JqZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAo
dGhpcy5vYnNlcnZlZE9iamVjdCkgeworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92
ZU9ic2VydmVyKHRoaXMub2JzZXJ2ZWRPYmplY3QsIHRoaXMua2V5LCB0aGlzLCB0aGlzLm5vdGlm
eSk7CisgICAgICAgIHRoaXMub2JzZXJ2ZWRPYmplY3QgPSBudWxsOworICAgICAgfQorICAgIH0s
CisKKyAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlciRkZWFj
dGl2YXRlKCk7CisgICAgICB0aGlzLl9jbGVhck9ic2VydmVkT2JqZWN0KCk7CisgICAgfQorICB9
KTsKK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9zdHJlYW1zL3Byb3h5LXN0cmVhbScsIFsnZXhw
b3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3RyZWFt
cy9zdHJlYW0nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3Qs
IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFBy
b3h5U3RyZWFtID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kKHsKKyAg
ICBpbml0OiBmdW5jdGlvbiAoc291cmNlLCBsYWJlbCkgeworICAgICAgdGhpcy5sYWJlbCA9IGxh
YmVsOworICAgICAgdGhpcy5zb3VyY2VEZXAgPSB0aGlzLmFkZE11dGFibGVEZXBlbmRlbmN5KHNv
dXJjZSk7CisgICAgfSwKKworICAgIGNvbXB1dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVy
biB0aGlzLnNvdXJjZURlcC5nZXRWYWx1ZSgpOworICAgIH0sCisKKyAgICBzZXRWYWx1ZTogZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgICB0aGlzLnNvdXJjZURlcC5zZXRWYWx1ZSh2YWx1ZSk7Cisg
ICAgfSwKKworICAgIHNldFNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgdmFyIGRp
ZENoYW5nZSA9IHRoaXMuc291cmNlRGVwLnJlcGxhY2Uoc291cmNlKTsKKyAgICAgIGlmIChkaWRD
aGFuZ2UgfHwgIShzb3VyY2UgaW5zdGFuY2VvZiBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRl
ZmF1bHQpKSB7CisgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgY2hhbmdlZCwgd2UgbXVzdCBub3Rp
ZnkuIElmIHRoZSBzb3VyY2UgaXMgbm90CisgICAgICAgIC8vIGFuIEVtYmVyLk9iamVjdCwgd2Ug
bXVzdCBhbHNvIG5vdGlmeSwgYmVjYXVzZSBpdCBjb3VsZCBoYXZlCisgICAgICAgIC8vIGludGVy
aW9yIG11dGFiaWxpdHkgdGhhdCBpcyBvdGhlcndpc2Ugbm90IGJlaW5nIG9ic2VydmVkLgorICAg
ICAgICB0aGlzLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgUHJveHlTdHJl
YW0uZXh0ZW5kID0gX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLmRlZmF1bHQuZXh0ZW5kOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IFByb3h5U3RyZWFtOworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFs
L3N0cmVhbXMvc3RyZWFtJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wYXRoX2NhY2hlJywgJ2VtYmVyLW1ldGFsL29i
c2VydmVyJywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnLCAnZW1iZXItbWV0YWwvZW1wdHlf
b2JqZWN0JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Vic2NyaWJlcicsICdlbWJlci1tZXRhbC9z
dHJlYW1zL2RlcGVuZGVuY3knLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAncmVxdWlyZScsICdlbWJl
ci1tZXRhbC9zeW1ib2wnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQXNzaWduLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFBhdGhfY2FjaGUsIF9lbWJlck1ldGFsT2JzZXJ2
ZXIsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2Vt
YmVyTWV0YWxTdHJlYW1zU3Vic2NyaWJlciwgX2VtYmVyTWV0YWxTdHJlYW1zRGVwZW5kZW5jeSwg
X2VtYmVyTWV0YWxVdGlscywgX3JlcXVpcmUsIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLndyYXAgPSB3cmFwOworICB2YXIgSVNfU1RSRUFNID0gX2Vt
YmVyTWV0YWxTeW1ib2wuZGVmYXVsdCgnSVNfU1RSRUFNJyk7CisKKyAgZXhwb3J0cy5JU19TVFJF
QU0gPSBJU19TVFJFQU07CisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKwor
ICAvKioKKyAgICBAcHJpdmF0ZQorICAgIEBjbGFzcyBTdHJlYW0KKyAgICBAbmFtZXNwYWNlIEVt
YmVyLnN0cmVhbQorICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5jdGlvbiBCYXNpY1N0cmVh
bShsYWJlbCkgeworICAgIHRoaXMuX2luaXQobGFiZWwpOworICB9CisKKyAgdmFyIEtleVN0cmVh
bTsKKyAgdmFyIFByb3h5TWl4aW47CisKKyAgQmFzaWNTdHJlYW0ucHJvdG90eXBlID0geworICAg
IF9pbml0OiBmdW5jdGlvbiAobGFiZWwpIHsKKyAgICAgIHRoaXNbSVNfU1RSRUFNXSA9IHRydWU7
CisgICAgICB0aGlzLmxhYmVsID0gbWFrZUxhYmVsKGxhYmVsKTsKKyAgICAgIHRoaXMuaXNBY3Rp
dmUgPSBmYWxzZTsKKyAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7CisgICAgICB0aGlzLmlzRGVz
dHJveWVkID0gZmFsc2U7CisgICAgICB0aGlzLmNhY2hlID0gdW5kZWZpbmVkOworICAgICAgdGhp
cy5jaGlsZHJlbiA9IHVuZGVmaW5lZDsKKyAgICAgIHRoaXMuc3Vic2NyaWJlckhlYWQgPSBudWxs
OworICAgICAgdGhpcy5zdWJzY3JpYmVyVGFpbCA9IG51bGw7CisgICAgICB0aGlzLmRlcGVuZGVu
Y3lIZWFkID0gbnVsbDsKKyAgICAgIHRoaXMuZGVwZW5kZW5jeVRhaWwgPSBudWxsOworICAgICAg
dGhpcy5vYnNlcnZlZFByb3h5ID0gbnVsbDsKKyAgICAgIHRoaXMuX19lbWJlcl9tZXRhX18gPSBu
dWxsOworICAgICAgdGhpc1tfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZXSA9IG51bGw7CisgICAg
fSwKKworICAgIF9tYWtlQ2hpbGRTdHJlYW06IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIEtleVN0
cmVhbSA9IEtleVN0cmVhbSB8fCBfcmVxdWlyZS5kZWZhdWx0KCdlbWJlci1tZXRhbC9zdHJlYW1z
L2tleS1zdHJlYW0nKS5kZWZhdWx0OworICAgICAgcmV0dXJuIG5ldyBLZXlTdHJlYW0odGhpcywg
a2V5KTsKKyAgICB9LAorCisgICAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAg
IGRlbGV0ZSB0aGlzLmNoaWxkcmVuW2tleV07CisgICAgfSwKKworICAgIGdldEtleTogZnVuY3Rp
b24gKGtleSkgeworICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeworICAg
ICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQo
KTsKKyAgICAgIH0KKworICAgICAgdmFyIGtleVN0cmVhbSA9IHRoaXMuY2hpbGRyZW5ba2V5XTsK
KworICAgICAgaWYgKGtleVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGtleVN0cmVh
bSA9IHRoaXMuX21ha2VDaGlsZFN0cmVhbShrZXkpOworICAgICAgICB0aGlzLmNoaWxkcmVuW2tl
eV0gPSBrZXlTdHJlYW07CisgICAgICB9CisKKyAgICAgIHJldHVybiBrZXlTdHJlYW07CisgICAg
fSwKKworICAgIGdldDogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBmaXJzdEtleSA9IF9l
bWJlck1ldGFsUGF0aF9jYWNoZS5nZXRGaXJzdEtleShwYXRoKTsKKyAgICAgIHZhciB0YWlsUGF0
aCA9IF9lbWJlck1ldGFsUGF0aF9jYWNoZS5nZXRUYWlsUGF0aChwYXRoKTsKKworICAgICAgaWYg
KHRoaXMuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICB0aGlzLmNoaWxkcmVuID0g
bmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIH0KKworICAgICAg
dmFyIGtleVN0cmVhbSA9IHRoaXMuY2hpbGRyZW5bZmlyc3RLZXldOworCisgICAgICBpZiAoa2V5
U3RyZWFtID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAga2V5U3RyZWFtID0gdGhpcy5fbWFrZUNo
aWxkU3RyZWFtKGZpcnN0S2V5LCBwYXRoKTsKKyAgICAgICAgdGhpcy5jaGlsZHJlbltmaXJzdEtl
eV0gPSBrZXlTdHJlYW07CisgICAgICB9CisKKyAgICAgIGlmICh0YWlsUGF0aCA9PT0gdW5kZWZp
bmVkKSB7CisgICAgICAgIHJldHVybiBrZXlTdHJlYW07CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4ga2V5U3RyZWFtLmdldCh0YWlsUGF0aCk7CisgICAgICB9CisgICAgfSwKKworICAg
IHZhbHVlOiBmdW5jdGlvbiAoKSB7CisgICAgICAvLyBUT0RPOiBFbnN1cmUgdmFsdWUgaXMgbmV2
ZXIgY2FsbGVkIG9uIGEgZGVzdHJveWVkIHN0cmVhbQorICAgICAgLy8gc28gdGhhdCB3ZSBjYW4g
dW5jb21tZW50IHRoaXMgYXNzZXJ0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIGFzc2VydCgiU3Ry
ZWFtIGVycm9yOiB2YWx1ZSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gd2FzIGRlc3Ryb3ll
ZCIsICF0aGlzLmlzRGVzdHJveWVkKTsKKworICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmxv
Y2suIFRoaXMgd2lsbCByZXF1aXJlIGVuc3VyaW5nIHdlIGFyZQorICAgICAgLy8gbm90IHRyZWF0
aW5nIHN0cmVhbXMgYXMgInZvbGF0aWxlIiBhbnl3aGVyZS4KKyAgICAgIGlmICghdGhpcy5pc0Fj
dGl2ZSkgeworICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlOworICAgICAgfQorCisgICAgICB2
YXIgd2lsbFJldmFsaWRhdGUgPSBmYWxzZTsKKworICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlICYm
IHRoaXMuc3Vic2NyaWJlckhlYWQpIHsKKyAgICAgICAgdGhpcy5hY3RpdmF0ZSgpOworICAgICAg
ICB3aWxsUmV2YWxpZGF0ZSA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmICh0aGlzLmlzRGly
dHkpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHsKKyAgICAgICAgICB3aWxsUmV2YWxp
ZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jb21w
dXRlKCk7CisgICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlOworICAgICAgfQorCisgICAgICBp
ZiAod2lsbFJldmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy5yZXZhbGlkYXRlKHRoaXMuY2FjaGUp
OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jYWNoZTsKKyAgICB9LAorCisgICAgYWRk
TXV0YWJsZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChvYmplY3QpIHsKKyAgICAgIHZhciBkZXBlbmRl
bmN5ID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc0RlcGVuZGVuY3kuZGVmYXVsdCh0aGlzLCBvYmpl
Y3QpOworCisgICAgICBpZiAodGhpcy5pc0FjdGl2ZSkgeworICAgICAgICBkZXBlbmRlbmN5LnN1
YnNjcmliZSgpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5kZXBlbmRlbmN5SGVhZCA9PT0g
bnVsbCkgeworICAgICAgICB0aGlzLmRlcGVuZGVuY3lIZWFkID0gdGhpcy5kZXBlbmRlbmN5VGFp
bCA9IGRlcGVuZGVuY3k7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdGFpbCA9IHRoaXMu
ZGVwZW5kZW5jeVRhaWw7CisgICAgICAgIHRhaWwubmV4dCA9IGRlcGVuZGVuY3k7CisgICAgICAg
IGRlcGVuZGVuY3kucHJldiA9IHRhaWw7CisgICAgICAgIHRoaXMuZGVwZW5kZW5jeVRhaWwgPSBk
ZXBlbmRlbmN5OworICAgICAgfQorCisgICAgICByZXR1cm4gZGVwZW5kZW5jeTsKKyAgICB9LAor
CisgICAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKG9iamVjdCkgeworICAgICAgaWYgKF9lbWJl
ck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKG9iamVjdCkpIHsKKyAgICAgICAgdGhpcy5hZGRN
dXRhYmxlRGVwZW5kZW5jeShvYmplY3QpOworICAgICAgfQorICAgIH0sCisKKyAgICBzdWJzY3Jp
YmVEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5ID0gdGhp
cy5kZXBlbmRlbmN5SGVhZDsKKyAgICAgIHdoaWxlIChkZXBlbmRlbmN5KSB7CisgICAgICAgIHZh
ciBuZXh0ID0gZGVwZW5kZW5jeS5uZXh0OworICAgICAgICBkZXBlbmRlbmN5LnN1YnNjcmliZSgp
OworICAgICAgICBkZXBlbmRlbmN5ID0gbmV4dDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgdW5z
dWJzY3JpYmVEZXBlbmRlbmNpZXM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkZXBlbmRlbmN5
ID0gdGhpcy5kZXBlbmRlbmN5SGVhZDsKKyAgICAgIHdoaWxlIChkZXBlbmRlbmN5KSB7CisgICAg
ICAgIHZhciBuZXh0ID0gZGVwZW5kZW5jeS5uZXh0OworICAgICAgICBkZXBlbmRlbmN5LnVuc3Vi
c2NyaWJlKCk7CisgICAgICAgIGRlcGVuZGVuY3kgPSBuZXh0OworICAgICAgfQorICAgIH0sCisK
KyAgICBtYXliZURlYWN0aXZhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICghdGhpcy5zdWJz
Y3JpYmVySGVhZCAmJiB0aGlzLmlzQWN0aXZlKSB7CisgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBm
YWxzZTsKKyAgICAgICAgdGhpcy51bnN1YnNjcmliZURlcGVuZGVuY2llcygpOworICAgICAgICB0
aGlzLmRlYWN0aXZhdGUoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgYWN0aXZhdGU6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlOworICAgICAgdGhpcy5zdWJzY3Jp
YmVEZXBlbmRlbmNpZXMoKTsKKyAgICB9LAorCisgICAgcmV2YWxpZGF0ZTogZnVuY3Rpb24gKHZh
bHVlKSB7CisgICAgICBpZiAodmFsdWUgIT09IHRoaXMub2JzZXJ2ZWRQcm94eSkgeworICAgICAg
ICB0aGlzLl9jbGVhck9ic2VydmVkUHJveHkoKTsKKworICAgICAgICBQcm94eU1peGluID0gUHJv
eHlNaXhpbiB8fCBfcmVxdWlyZS5kZWZhdWx0KCdlbWJlci1ydW50aW1lL21peGlucy8tcHJveHkn
KS5kZWZhdWx0OworCisgICAgICAgIGlmIChQcm94eU1peGluLmRldGVjdCh2YWx1ZSkpIHsKKyAg
ICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVyKHZhbHVlLCAnY29udGVudCcs
IHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgICB0aGlzLm9ic2VydmVkUHJveHkgPSB2YWx1
ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisKKyAgICBfY2xlYXJPYnNlcnZlZFByb3h5
OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5vYnNlcnZlZFByb3h5KSB7CisgICAgICAg
IF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcy5vYnNlcnZlZFByb3h5LCAn
Y29udGVudCcsIHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgICAgICAgdGhpcy5vYnNlcnZlZFByb3h5
ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgZGVhY3RpdmF0ZTogZnVuY3Rpb24gKCkg
eworICAgICAgdGhpcy5fY2xlYXJPYnNlcnZlZFByb3h5KCk7CisgICAgfSwKKworICAgIGNvbXB1
dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtIGVycm9yOiBj
b21wdXRlIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIH0sCisKKyAgICBzZXRWYWx1ZTogZnVuY3Rp
b24gKCkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJlYW0gZXJyb3I6IHNldFZhbHVlIG5v
dCBpbXBsZW1lbnRlZCcpOworICAgIH0sCisKKyAgICBub3RpZnk6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRoaXMubm90aWZ5RXhjZXB0KCk7CisgICAgfSwKKworICAgIG5vdGlmeUV4Y2VwdDogZnVu
Y3Rpb24gKGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKSB7CisgICAgICBpZiAoIXRoaXMu
aXNEaXJ0eSkgeworICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlOworICAgICAgICB0aGlzLm5v
dGlmeVN1YnNjcmliZXJzKGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdHJpZWQgdG8gc3Vic2NyaWJlIHRv
IGEgc3RyZWFtIGJ1dCB0aGUgY2FsbGJhY2sgcHJvdmlkZWQgd2FzIG5vdCBhIGZ1bmN0aW9uLics
IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyk7CisKKyAgICAgIHZhciBzdWJzY3JpYmVy
ID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1N1YnNjcmliZXIuZGVmYXVsdChjYWxsYmFjaywgY29u
dGV4dCwgdGhpcyk7CisgICAgICBpZiAodGhpcy5zdWJzY3JpYmVySGVhZCA9PT0gbnVsbCkgewor
ICAgICAgICB0aGlzLnN1YnNjcmliZXJIZWFkID0gdGhpcy5zdWJzY3JpYmVyVGFpbCA9IHN1YnNj
cmliZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdGFpbCA9IHRoaXMuc3Vic2NyaWJl
clRhaWw7CisgICAgICAgIHRhaWwubmV4dCA9IHN1YnNjcmliZXI7CisgICAgICAgIHN1YnNjcmli
ZXIucHJldiA9IHRhaWw7CisgICAgICAgIHRoaXMuc3Vic2NyaWJlclRhaWwgPSBzdWJzY3JpYmVy
OworICAgICAgfQorCisgICAgICB2YXIgc3RyZWFtID0gdGhpczsKKyAgICAgIHJldHVybiBmdW5j
dGlvbiAocHJ1bmUpIHsKKyAgICAgICAgc3Vic2NyaWJlci5yZW1vdmVGcm9tKHN0cmVhbSk7Cisg
ICAgICAgIGlmIChwcnVuZSkgeworICAgICAgICAgIHN0cmVhbS5wcnVuZSgpOworICAgICAgICB9
CisgICAgICB9OworICAgIH0sCisKKyAgICBwcnVuZTogZnVuY3Rpb24gKCkgeworICAgICAgaWYg
KHRoaXMuc3Vic2NyaWJlckhlYWQgPT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5kZXN0cm95KHRy
dWUpOworICAgICAgfQorICAgIH0sCisKKyAgICB1bnN1YnNjcmliZTogZnVuY3Rpb24gKGNhbGxi
YWNrLCBjb250ZXh0KSB7CisgICAgICB2YXIgc3Vic2NyaWJlciA9IHRoaXMuc3Vic2NyaWJlckhl
YWQ7CisKKyAgICAgIHdoaWxlIChzdWJzY3JpYmVyKSB7CisgICAgICAgIHZhciBuZXh0ID0gc3Vi
c2NyaWJlci5uZXh0OworICAgICAgICBpZiAoc3Vic2NyaWJlci5jYWxsYmFjayA9PT0gY2FsbGJh
Y2sgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09PSBjb250ZXh0KSB7CisgICAgICAgICAgc3Vic2Ny
aWJlci5yZW1vdmVGcm9tKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN1YnNjcmliZXIgPSBu
ZXh0OworICAgICAgfQorICAgIH0sCisKKyAgICBub3RpZnlTdWJzY3JpYmVyczogZnVuY3Rpb24g
KGNhbGxiYWNrVG9Ta2lwLCBjb250ZXh0VG9Ta2lwKSB7CisgICAgICB2YXIgc3Vic2NyaWJlciA9
IHRoaXMuc3Vic2NyaWJlckhlYWQ7CisKKyAgICAgIHdoaWxlIChzdWJzY3JpYmVyKSB7CisgICAg
ICAgIHZhciBuZXh0ID0gc3Vic2NyaWJlci5uZXh0OworCisgICAgICAgIHZhciBjYWxsYmFjayA9
IHN1YnNjcmliZXIuY2FsbGJhY2s7CisgICAgICAgIHZhciBjb250ZXh0ID0gc3Vic2NyaWJlci5j
b250ZXh0OworCisgICAgICAgIHN1YnNjcmliZXIgPSBuZXh0OworCisgICAgICAgIGlmIChjYWxs
YmFjayA9PT0gY2FsbGJhY2tUb1NraXAgJiYgY29udGV4dCA9PT0gY29udGV4dFRvU2tpcCkgewor
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT09
IHVuZGVmaW5lZCkgeworICAgICAgICAgIGNhbGxiYWNrKHRoaXMpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdGhpcyk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgZGVzdHJveTogZnVuY3Rpb24gKHBydW5lKSB7CisgICAgICBp
ZiAoIXRoaXMuaXNEZXN0cm95ZWQpIHsKKyAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7
CisKKyAgICAgICAgdGhpcy5zdWJzY3JpYmVySGVhZCA9IHRoaXMuc3Vic2NyaWJlclRhaWwgPSBu
dWxsOworICAgICAgICB0aGlzLm1heWJlRGVhY3RpdmF0ZSgpOworCisgICAgICAgIHZhciBkZXBl
bmRlbmNpZXMgPSB0aGlzLmRlcGVuZGVuY2llczsKKworICAgICAgICBpZiAoZGVwZW5kZW5jaWVz
KSB7CisgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBkZXBlbmRlbmNpZXMubGVuZ3RoOyBp
IDwgbDsgaSsrKSB7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXNbaV0ocHJ1bmUpOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0K
KyAgfTsKKworICBCYXNpY1N0cmVhbS5leHRlbmQgPSBmdW5jdGlvbiAob2JqZWN0KSB7CisgICAg
dmFyIENoaWxkID0gZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5faW5pdCgpOworICAgICAgdGhp
cy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
ZGVidWdTZWFsKHRoaXMpOworICAgIH07CisKKyAgICBDaGlsZC5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKHRoaXMucHJvdG90eXBlKTsKKworICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQo
Q2hpbGQucHJvdG90eXBlLCBvYmplY3QpOworICAgIENoaWxkLmV4dGVuZCA9IEJhc2ljU3RyZWFt
LmV4dGVuZDsKKyAgICByZXR1cm4gQ2hpbGQ7CisgIH07CisKKyAgdmFyIFN0cmVhbSA9IEJhc2lj
U3RyZWFtLmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGZuLCBsYWJlbCkgeworICAgICAg
dGhpcy5fY29tcHV0ZSA9IGZuOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0sCisK
KyAgICBjb21wdXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5fY29tcHV0ZSgp
OworICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgS2luZCwgcGFyYW0pIHsK
KyAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0odmFsdWUpKSB7CisgICAg
ICByZXR1cm4gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgS2luZCh2YWx1
ZSwgcGFyYW0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1ha2VMYWJlbChsYWJlbCkgewor
ICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gJyhubyBsYWJlbCkn
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorICB9CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gQmFzaWNTdHJlYW07CisgIGV4cG9ydHMuU3RyZWFtID0gU3RyZWFtOwor
fSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3N0cmVhbXMvc3Vic2NyaWJlcicsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQXNz
aWduKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBAbW9kdWxlIGVtYmVyLW1ldGFs
CisgICovCisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAY2xhc3MgU3Vic2NyaWJlcgorICAg
IEBuYW1lc3BhY2UgRW1iZXIuc3RyZWFtcworICAgIEBjb25zdHJ1Y3RvcgorICAqLworICBmdW5j
dGlvbiBTdWJzY3JpYmVyKGNhbGxiYWNrLCBjb250ZXh0KSB7CisgICAgdGhpcy5uZXh0ID0gbnVs
bDsKKyAgICB0aGlzLnByZXYgPSBudWxsOworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsK
KyAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24u
ZGVmYXVsdChTdWJzY3JpYmVyLnByb3RvdHlwZSwgeworICAgIHJlbW92ZUZyb206IGZ1bmN0aW9u
IChzdHJlYW0pIHsKKyAgICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0OworICAgICAgdmFyIHByZXYg
PSB0aGlzLnByZXY7CisKKyAgICAgIGlmIChwcmV2KSB7CisgICAgICAgIHByZXYubmV4dCA9IG5l
eHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0uc3Vic2NyaWJlckhlYWQgPSBuZXh0
OworICAgICAgfQorCisgICAgICBpZiAobmV4dCkgeworICAgICAgICBuZXh0LnByZXYgPSBwcmV2
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtLnN1YnNjcmliZXJUYWlsID0gcHJldjsK
KyAgICAgIH0KKworICAgICAgc3RyZWFtLm1heWJlRGVhY3RpdmF0ZSgpOworICAgIH0KKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gU3Vic2NyaWJlcjsKK30pOworZW5pZmVkKCdlbWJlci1t
ZXRhbC9zdHJlYW1zL3V0aWxzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2Vt
YmVyLW1ldGFsL3N0cmVhbXMvc3RyZWFtJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bERlYnVnLCBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuaXNTdHJlYW0gPSBpc1N0cmVhbTsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJz
Y3JpYmU7CisgIGV4cG9ydHMudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKKyAgZXhwb3J0cy5y
ZWFkID0gcmVhZDsKKyAgZXhwb3J0cy5yZWFkQXJyYXkgPSByZWFkQXJyYXk7CisgIGV4cG9ydHMu
cmVhZEhhc2ggPSByZWFkSGFzaDsKKyAgZXhwb3J0cy5zY2FuQXJyYXkgPSBzY2FuQXJyYXk7Cisg
IGV4cG9ydHMuc2Nhbkhhc2ggPSBzY2FuSGFzaDsKKyAgZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7
CisgIGV4cG9ydHMubGFiZWxzRm9yID0gbGFiZWxzRm9yOworICBleHBvcnRzLmxhYmVsc0Zvck9i
amVjdCA9IGxhYmVsc0Zvck9iamVjdDsKKyAgZXhwb3J0cy5sYWJlbEZvciA9IGxhYmVsRm9yOwor
ICBleHBvcnRzLm9yID0gb3I7CisgIGV4cG9ydHMuYWRkRGVwZW5kZW5jeSA9IGFkZERlcGVuZGVu
Y3k7CisgIGV4cG9ydHMuemlwID0gemlwOworICBleHBvcnRzLnppcEhhc2ggPSB6aXBIYXNoOwor
ICBleHBvcnRzLmNoYWluID0gY2hhaW47CisgIGV4cG9ydHMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsK
KworICAvKgorICAgQ2hlY2sgd2hldGhlciBhbiBvYmplY3QgaXMgYSBzdHJlYW0gb3Igbm90Lgor
ICAKKyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIGlzU3Ry
ZWFtCisgICBAcGFyYW0ge09iamVjdHxTdHJlYW19IG9iamVjdCBPYmplY3QgdG8gY2hlY2sgd2hl
dGhlciBpdCBpcyBhIHN0cmVhbS4KKyAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUg
b2JqZWN0IGlzIGEgc3RyZWFtLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgKi8KKworICBmdW5jdGlv
biBpc1N0cmVhbShvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtfZW1iZXJN
ZXRhbFN0cmVhbXNTdHJlYW0uSVNfU1RSRUFNXTsKKyAgfQorCisgIC8qCisgICBBIG1ldGhvZCBv
ZiBzdWJzY3JpYmluZyB0byBhIHN0cmVhbSB3aGljaCBpcyBzYWZlIGZvciB1c2Ugd2l0aCBhIG5v
bi1zdHJlYW0KKyAgIG9iamVjdC4gSWYgYSBub24tc3RyZWFtIG9iamVjdCBpcyBwYXNzZWQsIHRo
ZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgIAorICAgQHB1YmxpYworICAgQGZvciBFbWJlci5z
dHJlYW0KKyAgIEBmdW5jdGlvbiBzdWJzY3JpYmUKKyAgIEBwYXJhbSB7T2JqZWN0fFN0cmVhbX0g
b2JqZWN0IE9iamVjdCBvciBzdHJlYW0gdG8gcG90ZW50aWFsbHkgc3Vic2NyaWJlIHRvLgorICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gcnVuIHdoZW4gc3RyZWFtIHZh
bHVlIGNoYW5nZXMuCisgICBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIHRoZSBjYWxsYmFjayB3
aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhpcyBjb250ZXh0IGlmIGl0CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgorICAgKi8KKworICBmdW5jdGlvbiBzdWJzY3JpYmUo
b2JqZWN0LCBjYWxsYmFjaywgY29udGV4dCkgeworICAgIGlmIChvYmplY3QgJiYgb2JqZWN0W19l
bWJlck1ldGFsU3RyZWFtc1N0cmVhbS5JU19TVFJFQU1dKSB7CisgICAgICByZXR1cm4gb2JqZWN0
LnN1YnNjcmliZShjYWxsYmFjaywgY29udGV4dCk7CisgICAgfQorICB9CisKKyAgLyoKKyAgIEEg
bWV0aG9kIG9mIHVuc3Vic2NyaWJpbmcgZnJvbSBhIHN0cmVhbSB3aGljaCBpcyBzYWZlIGZvciB1
c2Ugd2l0aCBhIG5vbi1zdHJlYW0KKyAgIG9iamVjdC4gSWYgYSBub24tc3RyZWFtIG9iamVjdCBp
cyBwYXNzZWQsIHRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgIAorICAgQHByaXZhdGUKKyAg
IEBmb3IgRW1iZXIuc3RyZWFtCisgICBAZnVuY3Rpb24gdW5zdWJzY3JpYmUKKyAgIEBwYXJhbSB7
T2JqZWN0fFN0cmVhbX0gb2JqZWN0IE9iamVjdCBvciBzdHJlYW0gdG8gcG90ZW50aWFsbHkgdW5z
dWJzY3JpYmUgZnJvbS4KKyAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIG9y
aWdpbmFsbHkgcGFzc2VkIHRvIGBzdWJzY3JpYmUoKWAuCisgICBAcGFyYW0ge09iamVjdH0gW2Nv
bnRleHRdIE9iamVjdCBvcmlnaW5hbGx5IHBhc3NlZCB0byBgc3Vic2NyaWJlKClgLgorICAgKi8K
KworICBmdW5jdGlvbiB1bnN1YnNjcmliZShvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7Cisg
ICAgaWYgKG9iamVjdCAmJiBvYmplY3RbX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLklTX1NUUkVB
TV0pIHsKKyAgICAgIG9iamVjdC51bnN1YnNjcmliZShjYWxsYmFjaywgY29udGV4dCk7CisgICAg
fQorICB9CisKKyAgLyoKKyAgIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIHN0cmVhbSwgb3IgaW4g
dGhlIGNhc2Ugd2hlcmUgYSBub24tc3RyZWFtIG9iamVjdCBpcyBwYXNzZWQsCisgICByZXR1cm4g
dGhlIG9iamVjdCBpdHNlbGYuCisgIAorICAgQHByaXZhdGUKKyAgIEBmb3IgRW1iZXIuc3RyZWFt
CisgICBAZnVuY3Rpb24gcmVhZAorICAgQHBhcmFtIHtPYmplY3R8U3RyZWFtfSBvYmplY3QgT2Jq
ZWN0IHRvIHJldHVybiB0aGUgdmFsdWUgb2YuCisgICBAcmV0dXJuIFRoZSBzdHJlYW0ncyBjdXJy
ZW50IHZhbHVlLCBvciB0aGUgbm9uLXN0cmVhbSBvYmplY3QgaXRzZWxmLgorICAgKi8KKworICBm
dW5jdGlvbiByZWFkKG9iamVjdCkgeworICAgIGlmIChvYmplY3QgJiYgb2JqZWN0W19lbWJlck1l
dGFsU3RyZWFtc1N0cmVhbS5JU19TVFJFQU1dKSB7CisgICAgICByZXR1cm4gb2JqZWN0LnZhbHVl
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorICB9CisKKyAg
LyoKKyAgIE1hcCBhbiBhcnJheSwgcmVwbGFjaW5nIGFueSBzdHJlYW1zIHdpdGggdGhlaXIgdmFs
dWVzLgorICAKKyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9u
IHJlYWRBcnJheQorICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlYWQgdmFs
dWVzIGZyb20KKyAgIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheSBvZiB0aGUgc2FtZSBsZW5n
dGggd2l0aCB0aGUgdmFsdWVzIG9mIG5vbi1zdHJlYW0KKyAgICAgICAgICAgICAgICAgICBvYmpl
Y3RzIG1hcHBlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9ucyB1bnRvdWNoZWQsIGFuZAor
ICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZXMgb2Ygc3RyZWFtIG9iamVjdHMgcmV0YWluaW5n
IHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgYW5kIHJlcGxhY2Vk
IHdpdGggdGhlIHN0cmVhbSdzIGN1cnJlbnQgdmFsdWUuCisgICAqLworCisgIGZ1bmN0aW9uIHJl
YWRBcnJheShhcnJheSkgeworICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisgICAgdmFy
IHJldCA9IG5ldyBBcnJheShsZW5ndGgpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3Ro
OyBpKyspIHsKKyAgICAgIHJldFtpXSA9IHJlYWQoYXJyYXlbaV0pOworICAgIH0KKyAgICByZXR1
cm4gcmV0OworICB9CisKKyAgLyoKKyAgIE1hcCBhIGhhc2gsIHJlcGxhY2luZyBhbnkgc3RyZWFt
IHByb3BlcnR5IHZhbHVlcyB3aXRoIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoYXQKKyAgIHN0cmVh
bS4KKyAgCisgICBAcHJpdmF0ZQorICAgQGZvciBFbWJlci5zdHJlYW0KKyAgIEBmdW5jdGlvbiBy
ZWFkSGFzaAorICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgaGFzaCB0byByZWFkIGtleXMg
YW5kIHZhbHVlcyBmcm9tLgorICAgQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCB0
aGUgc2FtZSBrZXlzIGFzIHRoZSBwYXNzZWQgb2JqZWN0LiBUaGUKKyAgICAgICAgICAgICAgICAg
ICAgcHJvcGVydHkgdmFsdWVzIGluIHRoZSBuZXcgb2JqZWN0IGFyZSB0aGUgb3JpZ2luYWwgdmFs
dWVzIGluCisgICAgICAgICAgICAgICAgICAgIHRoZSBjYXNlIG9mIG5vbi1zdHJlYW0gb2JqZWN0
cywgYW5kIHRoZSBzdHJlYW1zJyBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBp
biB0aGUgY2FzZSBvZiBzdHJlYW0gb2JqZWN0cy4KKyAgICovCisKKyAgZnVuY3Rpb24gcmVhZEhh
c2gob2JqZWN0KSB7CisgICAgdmFyIHJldCA9IHt9OworICAgIGZvciAodmFyIGtleSBpbiBvYmpl
Y3QpIHsKKyAgICAgIHJldFtrZXldID0gcmVhZChvYmplY3Rba2V5XSk7CisgICAgfQorICAgIHJl
dHVybiByZXQ7CisgIH0KKworICAvKgorICAgQ2hlY2sgd2hldGhlciBhbiBhcnJheSBjb250YWlu
cyBhbnkgc3RyZWFtIHZhbHVlcy4KKyAgCisgICBAcHJpdmF0ZQorICAgQGZvciBFbWJlci5zdHJl
YW0KKyAgIEBmdW5jdGlvbiBzY2FuQXJyYXkKKyAgIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFycmF5
IGdpdmVuIHRvIGEgaGFuZGxlYmFycyBoZWxwZXIuCisgICBAcmV0dXJuIHtCb29sZWFufSBgdHJ1
ZWAgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGEgc3RyZWFtL2JvdW5kIHZhbHVlLCBgZmFsc2VgCisg
ICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICovCisKKyAgZnVuY3Rpb24gc2NhbkFy
cmF5KGFycmF5KSB7CisgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKyAgICB2YXIgY29u
dGFpbnNTdHJlYW0gPSBmYWxzZTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBp
KyspIHsKKyAgICAgIGlmIChpc1N0cmVhbShhcnJheVtpXSkpIHsKKyAgICAgICAgY29udGFpbnNT
dHJlYW0gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gY29udGFpbnNTdHJlYW07CisgIH0KKworICAvKgorICAgQ2hlY2sgd2hldGhlciBhIGhhc2gg
aGFzIGFueSBzdHJlYW0gcHJvcGVydHkgdmFsdWVzLgorICAKKyAgIEBwcml2YXRlCisgICBAZm9y
IEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIHNjYW5IYXNoCisgICBAcGFyYW0ge09iamVjdH0g
aGFzaCAiaGFzaCIgYXJndW1lbnQgZ2l2ZW4gdG8gYSBoYW5kbGViYXJzIGhlbHBlci4KKyAgIEBy
ZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGEgc3RyZWFtL2Jv
dW5kIHZhbHVlLCBgZmFsc2VgCisgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICAq
LworCisgIGZ1bmN0aW9uIHNjYW5IYXNoKGhhc2gpIHsKKyAgICB2YXIgY29udGFpbnNTdHJlYW0g
PSBmYWxzZTsKKworICAgIGZvciAodmFyIHByb3AgaW4gaGFzaCkgeworICAgICAgaWYgKGlzU3Ry
ZWFtKGhhc2hbcHJvcF0pKSB7CisgICAgICAgIGNvbnRhaW5zU3RyZWFtID0gdHJ1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRhaW5zU3RyZWFtOwor
ICB9CisKKyAgdmFyIENvbmNhdFN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5kZWZh
dWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKGFycmF5LCBzZXBhcmF0b3IpIHsKKyAg
ICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKyAgICAgIHRoaXMuc2VwYXJhdG9yID0gc2VwYXJhdG9y
OworCisgICAgICAvLyBVc2VkIGJ5IGFuZ2xlIGJyYWNrZXQgY29tcG9uZW50cyB0byBkZXRlY3Qg
YW4gYXR0cmlidXRlIHdhcyBwcm92aWRlZAorICAgICAgLy8gYXMgYSBzdHJpbmcgbGl0ZXJhbC4K
KyAgICAgIHRoaXMuaXNDb25jYXQgPSB0cnVlOworICAgIH0sCisKKyAgICBsYWJlbDogZnVuY3Rp
b24gKCkgeworICAgICAgdmFyIGxhYmVscyA9IGxhYmVsc0Zvcih0aGlzLmFycmF5KTsKKyAgICAg
IHJldHVybiAnY29uY2F0KFsnICsgbGFiZWxzLmpvaW4oJywgJykgKyAnXTsgc2VwYXJhdG9yPScg
KyBpbnNwZWN0KHRoaXMuc2VwYXJhdG9yKSArICcpJzsKKyAgICB9LAorCisgICAgY29tcHV0ZTog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGNvbmNhdChyZWFkQXJyYXkodGhpcy5hcnJheSks
IHRoaXMuc2VwYXJhdG9yKTsKKyAgICB9CisgIH0pOworCisgIC8qCisgICBKb2luIGFuIGFycmF5
LCB3aXRoIGFueSBzdHJlYW1zIHJlcGxhY2VkIGJ5IHRoZWlyIGN1cnJlbnQgdmFsdWVzLgorICAK
KyAgIEBwcml2YXRlCisgICBAZm9yIEVtYmVyLnN0cmVhbQorICAgQGZ1bmN0aW9uIGNvbmNhdAor
ICAgQHBhcmFtIHtBcnJheX0gYXJyYXkgQW4gYXJyYXkgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUg
c3RyZWFtIG9iamVjdHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIG9yIG1vcmUg
bm9uLXN0cmVhbSBvYmplY3RzLgorICAgQHBhcmFtIHtTdHJpbmd9IHNlcGFyYXRvciBTdHJpbmcg
dG8gYmUgdXNlZCB0byBqb2luIGFycmF5IGVsZW1lbnRzLgorICAgQHJldHVybiB7U3RyaW5nfSBT
dHJpbmcgd2l0aCBhcnJheSBlbGVtZW50cyBjb25jYXRlbmF0ZWQgYW5kIGpvaW5lZCBieSB0aGUK
KyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgc2VwYXJhdG9yLCBhbmQgYW55IHN0cmVhbSBh
cnJheSBtZW1iZXJzIGhhdmluZyBiZWVuCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5
IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJlYW0uCisgICAqLworCisgIGZ1bmN0aW9uIGNv
bmNhdChhcnJheSwgc2VwYXJhdG9yKSB7CisgICAgLy8gVE9ETzogQ3JlYXRlIHN1YmNsYXNzIENv
bmNhdFN0cmVhbSA8IFN0cmVhbS4gRGVmZXIKKyAgICAvLyBzdWJzY3JpYmluZyB0byBzdHJlYW1z
IHVudGlsIHRoZSB2YWx1ZSgpIGlzIGNhbGxlZC4KKyAgICB2YXIgaGFzU3RyZWFtID0gc2NhbkFy
cmF5KGFycmF5KTsKKyAgICBpZiAoaGFzU3RyZWFtKSB7CisgICAgICB2YXIgc3RyZWFtID0gbmV3
IENvbmNhdFN0cmVhbShhcnJheSwgc2VwYXJhdG9yKTsKKworICAgICAgZm9yICh2YXIgaSA9IDAs
IGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgYWRkRGVwZW5kZW5jeShz
dHJlYW0sIGFycmF5W2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICB9
IGVsc2UgeworICAgICAgcmV0dXJuIGFycmF5LmpvaW4oc2VwYXJhdG9yKTsKKyAgICB9CisgIH0K
KworICBmdW5jdGlvbiBsYWJlbHNGb3Ioc3RyZWFtcykgeworICAgIHZhciBsYWJlbHMgPSBbXTsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3RyZWFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgIHZhciBzdHJlYW0gPSBzdHJlYW1zW2ldOworICAgICAgbGFiZWxzLnB1c2gobGFiZWxG
b3Ioc3RyZWFtKSk7CisgICAgfQorCisgICAgcmV0dXJuIGxhYmVsczsKKyAgfQorCisgIGZ1bmN0
aW9uIGxhYmVsc0Zvck9iamVjdChzdHJlYW1zKSB7CisgICAgdmFyIGxhYmVscyA9IFtdOworCisg
ICAgZm9yICh2YXIgcHJvcCBpbiBzdHJlYW1zKSB7CisgICAgICBsYWJlbHMucHVzaChwcm9wICsg
JzogJyArIGluc3BlY3Qoc3RyZWFtc1twcm9wXSkpOworICAgIH0KKworICAgIHJldHVybiBsYWJl
bHMubGVuZ3RoID8gJ3sgJyArIGxhYmVscy5qb2luKCcsICcpICsgJyB9JyA6ICd7fSc7CisgIH0K
KworICBmdW5jdGlvbiBsYWJlbEZvcihtYXliZVN0cmVhbSkgeworICAgIGlmIChpc1N0cmVhbSht
YXliZVN0cmVhbSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBtYXliZVN0cmVhbTsKKyAgICAgIHJl
dHVybiB0eXBlb2Ygc3RyZWFtLmxhYmVsID09PSAnZnVuY3Rpb24nID8gc3RyZWFtLmxhYmVsKCkg
OiBzdHJlYW0ubGFiZWw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbnNwZWN0KG1heWJl
U3RyZWFtKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlKSB7CisgICAg
c3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKKyAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgIHJl
dHVybiAnIicgKyB2YWx1ZSArICciJzsKKyAgICAgIGNhc2UgJ29iamVjdCc6CisgICAgICAgIHJl
dHVybiAneyAuLi4gfSc7CisgICAgICBjYXNlICdmdW5jdGlvbic6CisgICAgICAgIHJldHVybiAn
ZnVuY3Rpb24oKSB7IC4uLiB9JzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTdHJp
bmcodmFsdWUpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG9yKGZpcnN0LCBzZWNvbmQpIHsK
KyAgICB2YXIgc3RyZWFtID0gbmV3IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5TdHJlYW0oZnVu
Y3Rpb24gKCkgeworICAgICAgcmV0dXJuIGZpcnN0LnZhbHVlKCkgfHwgc2Vjb25kLnZhbHVlKCk7
CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGxhYmVsRm9yKGZpcnN0KSArICcg
fHwgJyArIGxhYmVsRm9yKHNlY29uZCk7CisgICAgfSk7CisKKyAgICBzdHJlYW0uYWRkRGVwZW5k
ZW5jeShmaXJzdCk7CisgICAgc3RyZWFtLmFkZERlcGVuZGVuY3koc2Vjb25kKTsKKworICAgIHJl
dHVybiBzdHJlYW07CisgIH0KKworICBmdW5jdGlvbiBhZGREZXBlbmRlbmN5KHN0cmVhbSwgZGVw
ZW5kZW5jeSkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5ub3QgYWRkIGEgc3Ry
ZWFtIGFzIGEgZGVwZW5kZW5jeSB0byBhIG5vbi1zdHJlYW0nLCBpc1N0cmVhbShzdHJlYW0pIHx8
ICFpc1N0cmVhbShkZXBlbmRlbmN5KSk7CisgICAgaWYgKGlzU3RyZWFtKHN0cmVhbSkpIHsKKyAg
ICAgIHN0cmVhbS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgIH0KKyAgfQorCisgIGZ1
bmN0aW9uIHppcChzdHJlYW1zLCBjYWxsYmFjaywgbGFiZWwpIHsKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnTXVzdCBjYWxsIHppcCB3aXRoIGEgbGFiZWwnLCAhIWxhYmVsKTsKKworICAg
IHZhciBzdHJlYW0gPSBuZXcgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLlN0cmVhbShmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYXJyYXkgPSByZWFkQXJyYXkoc3RyZWFtcyk7CisgICAgICByZXR1
cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhhcnJheSkgOiBhcnJheTsKKyAgICB9LCBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gbGFiZWwgKyAnKCcgKyBsYWJlbHNGb3Ioc3RyZWFtcykgKyAnKSc7
CisgICAgfSk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHN0cmVhbXMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICBzdHJlYW0uYWRkRGVwZW5kZW5jeShzdHJlYW1zW2ldKTsKKyAgICB9
CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgZnVuY3Rpb24gemlwSGFzaChvYmplY3Qs
IGNhbGxiYWNrLCBsYWJlbCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdNdXN0IGNh
bGwgemlwSGFzaCB3aXRoIGEgbGFiZWwnLCAhIWxhYmVsKTsKKworICAgIHZhciBzdHJlYW0gPSBu
ZXcgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLlN0cmVhbShmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgaGFzaCA9IHJlYWRIYXNoKG9iamVjdCk7CisgICAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxs
YmFjayhoYXNoKSA6IGhhc2g7CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIGxh
YmVsICsgJygnICsgbGFiZWxzRm9yT2JqZWN0KG9iamVjdCkgKyAnKSc7CisgICAgfSk7CisKKyAg
ICBmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgeworICAgICAgc3RyZWFtLmFkZERlcGVuZGVuY3ko
b2JqZWN0W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgLyoq
CisgICBHZW5lcmF0ZSBhIG5ldyBzdHJlYW0gYnkgcHJvdmlkaW5nIGEgc291cmNlIHN0cmVhbSBh
bmQgYSBmdW5jdGlvbiB0aGF0IGNhbgorICAgYmUgdXNlZCB0byB0cmFuc2Zvcm0gdGhlIHN0cmVh
bSdzIHZhbHVlLiBJbiB0aGUgY2FzZSBvZiBhIG5vbi1zdHJlYW0gb2JqZWN0LAorICAgcmV0dXJu
cyB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi4KKyAgCisgICBUaGUgdmFsdWUgdG8gdHJhbnNm
b3JtIHdvdWxkIHR5cGljYWxseSBiZSBhdmFpbGFibGUgdG8gdGhlIGZ1bmN0aW9uIHlvdSBwYXNz
CisgICB0byBgY2hhaW4oKWAgdmlhIHNjb3BlLiBGb3IgZXhhbXBsZToKKyAgCisgICBgYGBqYXZh
c2NyaXB0CisgICAgICAgdmFyIHNvdXJjZSA9IC4uLjsgIC8vIHN0cmVhbSByZXR1cm5pbmcgYSBu
dW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgbnVtZXJpYyAobm9u
LXN0cmVhbSkgb2JqZWN0CisgICAgICAgdmFyIHJlc3VsdCA9IGNoYWluKHNvdXJjZSwgZnVuY3Rp
b24oKSB7CisgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gcmVhZChzb3VyY2UpOworICAgICAg
ICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSArIDE7CisgICAgICAgfSk7CisgICBgYGAKKyAgCisgICBJ
biB0aGUgZXhhbXBsZSwgcmVzdWx0IGlzIGEgc3RyZWFtIGlmIHNvdXJjZSBpcyBhIHN0cmVhbSwg
b3IgYSBudW1iZXIgb2YKKyAgIHNvdXJjZSB3YXMgbnVtZXJpYy4KKyAgCisgICBAcHJpdmF0ZQor
ICAgQGZvciBFbWJlci5zdHJlYW0KKyAgIEBmdW5jdGlvbiBjaGFpbgorICAgQHBhcmFtIHtPYmpl
Y3R8U3RyZWFtfSB2YWx1ZSBBIHN0cmVhbSBvciBub24tc3RyZWFtIG9iamVjdC4KKyAgIEBwYXJh
bSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGJlIHJ1biB3aGVuIHRoZSBzdHJlYW0gdmFsdWUg
Y2hhbmdlcywgb3IgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJ1biBvbmNlIGluIHRo
ZSBjYXNlIG9mIGEgbm9uLXN0cmVhbSBvYmplY3QuCisgICBAcmV0dXJuIHtPYmplY3R8U3RyZWFt
fSBJbiB0aGUgY2FzZSBvZiBhIHN0cmVhbSBgdmFsdWVgIHBhcmFtZXRlciwgYSBuZXcKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0aGF0IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRo
ZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRl
ZCBmdW5jdGlvbiBgZm5gLiBJbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub24tc3RyZWFtIG9iamVjdCwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvdmlkZWQK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGBmbmAuCisgICAqLworCisgIGZ1
bmN0aW9uIGNoYWluKHZhbHVlLCBmbiwgbGFiZWwpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnTXVzdCBjYWxsIGNoYWluIHdpdGggYSBsYWJlbCcsICEhbGFiZWwpOworICAgIGlmIChp
c1N0cmVhbSh2YWx1ZSkpIHsKKyAgICAgIHZhciBzdHJlYW0gPSBuZXcgX2VtYmVyTWV0YWxTdHJl
YW1zU3RyZWFtLlN0cmVhbShmbiwgZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gbGFiZWwg
KyAnKCcgKyBsYWJlbEZvcih2YWx1ZSkgKyAnKSc7CisgICAgICB9KTsKKyAgICAgIHN0cmVhbS5h
ZGREZXBlbmRlbmN5KHZhbHVlKTsKKyAgICAgIHJldHVybiBzdHJlYW07CisgICAgfSBlbHNlIHsK
KyAgICAgIHJldHVybiBmbigpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHNldFZhbHVlKG9i
amVjdCwgdmFsdWUpIHsKKyAgICBpZiAob2JqZWN0ICYmIG9iamVjdFtfZW1iZXJNZXRhbFN0cmVh
bXNTdHJlYW0uSVNfU1RSRUFNXSkgeworICAgICAgb2JqZWN0LnNldFZhbHVlKHZhbHVlKTsKKyAg
ICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC9zeW1ib2wnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHN5bWJvbDsKKworICBm
dW5jdGlvbiBzeW1ib2woZGVidWdOYW1lKSB7CisgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgdXNp
bmcgcGxhdGZvcm0gc3ltYm9scywgYnV0IHdlIGRvIG5vdAorICAgIC8vIHdhbnQgdG8gcmVxdWly
ZSBub24tZW51bWVyYWJpbGl0eSBmb3IgdGhpcyBBUEksIHdoaWNoCisgICAgLy8gd291bGQgaW50
cm9kdWNlIGEgbGFyZ2UgY29zdC4KKworICAgIHJldHVybiBfZW1iZXJNZXRhbFV0aWxzLmludGVy
bihkZWJ1Z05hbWUgKyAnIFtpZD0nICsgX2VtYmVyTWV0YWxVdGlscy5HVUlEX0tFWSArIE1hdGgu
Zmxvb3IoTWF0aC5yYW5kb20oKSAqIG5ldyBEYXRlKCkpICsgJ10nKTsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLW1ldGFsL3RhZ3MnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdy
ZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbE1ldGEsIF9yZXF1aXJlMikg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy50YWdGb3IgPSB0YWdGb3I7CisKKyAgdmFy
IGhhc0dsaW1tZXIgPSBfcmVxdWlyZTIuaGFzKCdnbGltbWVyLXJlZmVyZW5jZScpOworICB2YXIg
Q09OU1RBTlRfVEFHID0gdW5kZWZpbmVkLAorICAgICAgQ1VSUkVOVF9UQUcgPSB1bmRlZmluZWQs
CisgICAgICBEaXJ0eWFibGVUYWcgPSB1bmRlZmluZWQsCisgICAgICBtYWtlVGFnID0gdW5kZWZp
bmVkOworCisgIHZhciBtYXJrT2JqZWN0QXNEaXJ0eSA9IHVuZGVmaW5lZDsKKworICBleHBvcnRz
Lm1hcmtPYmplY3RBc0RpcnR5ID0gbWFya09iamVjdEFzRGlydHk7CisKKyAgZnVuY3Rpb24gdGFn
Rm9yKG9iamVjdCwgX21ldGEpIHsKKyAgICBpZiAoIWhhc0dsaW1tZXIpIHsKKyAgICAgIHRocm93
IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgdGFnRm9yIHdpdGhvdXQgR2xpbW1lcicpOworICAgIH0K
KworICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHsKKyAgICAg
IHZhciBtZXRhID0gX21ldGEgfHwgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqZWN0KTsKKyAgICAg
IHJldHVybiBtZXRhLndyaXRhYmxlVGFnKG1ha2VUYWcpOworICAgIH0gZWxzZSB7CisgICAgICBy
ZXR1cm4gQ09OU1RBTlRfVEFHOworICAgIH0KKyAgfQorCisgIGlmIChoYXNHbGltbWVyKSB7Cisg
ICAgdmFyIF9yZXF1aXJlID0gX3JlcXVpcmUyLmRlZmF1bHQoJ2dsaW1tZXItcmVmZXJlbmNlJyk7
CisKKyAgICBEaXJ0eWFibGVUYWcgPSBfcmVxdWlyZS5EaXJ0eWFibGVUYWc7CisgICAgQ09OU1RB
TlRfVEFHID0gX3JlcXVpcmUuQ09OU1RBTlRfVEFHOworICAgIENVUlJFTlRfVEFHID0gX3JlcXVp
cmUuQ1VSUkVOVF9UQUc7CisKKyAgICBtYWtlVGFnID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0
dXJuIG5ldyBEaXJ0eWFibGVUYWcoKTsKKyAgICB9OworCisgICAgZXhwb3J0cy5tYXJrT2JqZWN0
QXNEaXJ0eSA9IG1hcmtPYmplY3RBc0RpcnR5ID0gZnVuY3Rpb24gKG1ldGEpIHsKKyAgICAgIHZh
ciB0YWcgPSBtZXRhICYmIG1ldGEucmVhZGFibGVUYWcoKSB8fCBDVVJSRU5UX1RBRzsKKyAgICAg
IHRhZy5kaXJ0eSgpOworICAgIH07CisgIH0gZWxzZSB7CisgICAgZXhwb3J0cy5tYXJrT2JqZWN0
QXNEaXJ0eSA9IG1hcmtPYmplY3RBc0RpcnR5ID0gZnVuY3Rpb24gKCkge307CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1tZXRhbC91dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0
cykgeworICAnbm8gdXNlIHN0cmljdCc7CisgIC8vIFJlbW92ZSAidXNlIHN0cmljdCI7IGZyb20g
dHJhbnNwaWxlZCBtb2R1bGUgdW50aWwKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTEzODAzOCBpcyBmaXhlZAorCisgIC8qKgorICBAbW9kdWxlIGVtYmVyLW1l
dGFsCisgICovCisKKyAgLyoqCisgICAgUHJldmlvdXNseSB3ZSB1c2VkIGBFbWJlci4kLnV1aWRg
LCBob3dldmVyIGAkLnV1aWRgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbQorICAgIGpRdWVyeSBtYXN0
ZXIuIFdlJ2xsIGp1c3QgYm9vdHN0cmFwIG91ciBvd24gdXVpZCBub3cuCisgIAorICAgIEBwcml2
YXRlCisgICAgQHJldHVybiB7TnVtYmVyfSB0aGUgdXVpZAorICAqLworICBleHBvcnRzLnV1aWQg
PSB1dWlkOworICBleHBvcnRzLmludGVybiA9IGludGVybjsKKyAgZXhwb3J0cy5nZW5lcmF0ZUd1
aWQgPSBnZW5lcmF0ZUd1aWQ7CisgIGV4cG9ydHMuZ3VpZEZvciA9IGd1aWRGb3I7CisgIGV4cG9y
dHMud3JhcCA9IHdyYXA7CisgIGV4cG9ydHMudHJ5SW52b2tlID0gdHJ5SW52b2tlOworICBleHBv
cnRzLm1ha2VBcnJheSA9IG1ha2VBcnJheTsKKyAgZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDsK
KyAgZXhwb3J0cy5hcHBseVN0ciA9IGFwcGx5U3RyOworICBleHBvcnRzLmxvb2t1cERlc2NyaXB0
b3IgPSBsb29rdXBEZXNjcmlwdG9yOworICBleHBvcnRzLnRvU3RyaW5nID0gdG9TdHJpbmc7Cisg
IHZhciBfdXVpZCA9IDA7CisKKyAgLyoqCisgICAgR2VuZXJhdGVzIGEgdW5pdmVyc2FsbHkgdW5p
cXVlIGlkZW50aWZpZXIuIFRoaXMgbWV0aG9kCisgICAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEVt
YmVyIGZvciBhc3Npc3Rpbmcgd2l0aAorICAgIHRoZSBnZW5lcmF0aW9uIG9mIEdVSUQncyBhbmQg
b3RoZXIgdW5pcXVlIGlkZW50aWZpZXJzLgorICAKKyAgICBAcHVibGljCisgICAgQHJldHVybiB7
TnVtYmVyfSBbZGVzY3JpcHRpb25dCisgICAqLworCisgIGZ1bmN0aW9uIHV1aWQoKSB7CisgICAg
cmV0dXJuICsrX3V1aWQ7CisgIH0KKworICAvKioKKyAgICBQcmVmaXggdXNlZCBmb3IgZ3VpZHMg
dGhyb3VnaCBvdXQgRW1iZXIuCisgICAgQHByaXZhdGUKKyAgICBAcHJvcGVydHkgR1VJRF9QUkVG
SVgKKyAgICBAZm9yIEVtYmVyCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGZpbmFsCisgICovCisg
IHZhciBHVUlEX1BSRUZJWCA9ICdlbWJlcic7CisKKyAgLy8gVXNlZCBmb3IgZ3VpZCBnZW5lcmF0
aW9uLi4uCisgIHZhciBudW1iZXJDYWNoZSA9IFtdOworICB2YXIgc3RyaW5nQ2FjaGUgPSB7fTsK
KworICAvKioKKyAgICBTdHJvbmdseSBoaW50IHJ1bnRpbWVzIHRvIGludGVybiB0aGUgcHJvdmlk
ZWQgc3RyaW5nLgorICAKKyAgICBXaGVuIGRvIEkgbmVlZCB0byB1c2UgdGhpcyBmdW5jdGlvbj8K
KyAgCisgICAgRm9yIHRoZSBtb3N0IHBhcnQsIG5ldmVyLiBQcmUtbWF0dXJlIG9wdGltaXphdGlv
biBpcyBiYWQsIGFuZCBvZnRlbiB0aGUKKyAgICBydW50aW1lIGRvZXMgZXhhY3RseSB3aGF0IHlv
dSBuZWVkIGl0IHRvLCBhbmQgbW9yZSBvZnRlbiB0aGUgdHJhZGUtb2ZmIGlzbid0CisgICAgd29y
dGggaXQuCisgIAorICAgIFdoeT8KKyAgCisgICAgUnVudGltZXMgc3RvcmUgc3RyaW5ncyBpbiBh
dCBsZWFzdCAyIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnM6CisgICAgUm9wZXMgYW5kIFN5bWJv
bHMgKGludGVybmVkIHN0cmluZ3MpLiBUaGUgUm9wZSBwcm92aWRlcyBhIG1lbW9yeSBlZmZpY2ll
bnQKKyAgICBkYXRhLXN0cnVjdHVyZSBmb3Igc3RyaW5ncyBjcmVhdGVkIGZyb20gY29uY2F0ZW5h
dGlvbiBvciBzb21lIG90aGVyIHN0cmluZworICAgIG1hbmlwdWxhdGlvbiBsaWtlIHNwbGl0dGlu
Zy4KKyAgCisgICAgVW5mb3J0dW5hdGVseSBjaGVja2luZyBlcXVhbGl0eSBvZiBkaWZmZXJlbnQg
cm9wZXMgY2FuIGJlIHF1aXRlIGNvc3RseSBhcworICAgIHJ1bnRpbWVzIG11c3QgcmVzb3J0IHRv
IGNsZXZlciBzdHJpbmcgY29tcGFyaXNvbiBhbGdvcml0aG1zLiBUaGVzZQorICAgIGFsZ29yaXRo
bXMgdHlwaWNhbGx5IGNvc3QgaW4gcHJvcG9ydGlvbiB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJp
bmcuCisgICAgTHVja2lseSwgdGhpcyBpcyB3aGVyZSB0aGUgU3ltYm9scyAoaW50ZXJuZWQgc3Ry
aW5ncykgc2hpbmUuIEFzIFN5bWJvbHMgYXJlCisgICAgdW5pcXVlIGJ5IHRoZWlyIHN0cmluZyBj
b250ZW50LCBlcXVhbGl0eSBjaGVja3MgY2FuIGJlIGRvbmUgYnkgcG9pbnRlcgorICAgIGNvbXBh
cmlzb24uCisgIAorICAgIEhvdyBkbyBJIGtub3cgaWYgbXkgc3RyaW5nIGlzIGEgcm9wZSBvciBz
eW1ib2w/CisgIAorICAgIFR5cGljYWxseSAod2FybmluZyBnZW5lcmFsIHN3ZWVwaW5nIHN0YXRl
bWVudCwgYnV0IHRydXRoeSBpbiBydW50aW1lcyBhdAorICAgIHByZXNlbnQpIHN0YXRpYyBzdHJp
bmdzIGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUgSlMgc291cmNlIGFyZSBpbnRlcm5lZC4KKyAgICBT
dHJpbmdzIG9mdGVuIHVzZWQgZm9yIGNvbXBhcmlzb25zIGNhbiBiZSBpbnRlcm5lZCBhdCBydW50
aW1lIGlmIHNvbWUKKyAgICBjcml0ZXJpYSBhcmUgbWV0LiAgT25lIG9mIHRoZXNlIGNyaXRlcmlh
IGNhbiBiZSB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIHJvcGUuCisgICAgRm9yIGV4YW1wbGUsIGlu
IGNocm9tZSAzOCBhIHJvcGUgbG9uZ2VyIHRoZW4gMTIgY2hhcmFjdGVycyB3aWxsIG5vdAorICAg
IGludGVybiwgbm9yIHdpbGwgc2VnbWVudHMgb2YgdGhhdCByb3BlLgorICAKKyAgICBTb21lIG51
bWJlcnM6IGh0dHA6Ly9qc3BlcmYuY29tL2V2YWwtdnMta2V5cy84CisgIAorICAgIEtub3duIFRy
aWNr4oSiCisgIAorICAgIEBwcml2YXRlCisgICAgQHJldHVybiB7U3RyaW5nfSBpbnRlcm5lZCB2
ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBzdHJpbmcKKyAgKi8KKworICBmdW5jdGlvbiBpbnRlcm4o
c3RyKSB7CisgICAgdmFyIG9iaiA9IHt9OworICAgIG9ialtzdHJdID0gMTsKKyAgICBmb3IgKHZh
ciBrZXkgaW4gb2JqKSB7CisgICAgICBpZiAoa2V5ID09PSBzdHIpIHsKKyAgICAgICAgcmV0dXJu
IGtleTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8qKgorICAg
IEEgdW5pcXVlIGtleSB1c2VkIHRvIGFzc2lnbiBndWlkcyBhbmQgb3RoZXIgcHJpdmF0ZSBtZXRh
ZGF0YSB0byBvYmplY3RzLgorICAgIElmIHlvdSBpbnNwZWN0IGFuIG9iamVjdCBpbiB5b3VyIGJy
b3dzZXIgZGVidWdnZXIgeW91IHdpbGwgb2Z0ZW4gc2VlIHRoZXNlLgorICAgIFRoZXkgY2FuIGJl
IHNhZmVseSBpZ25vcmVkLgorICAKKyAgICBPbiBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQsIHRo
ZXNlIHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGggZW51bWVyYXRpb24KKyAgICBkaXNhYmxlZCBz
byB0aGV5IHdvbid0IHNob3cgdXAgd2hlbiB5b3UgaXRlcmF0ZSBvdmVyIHlvdXIgcHJvcGVydGll
cy4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAcHJvcGVydHkgR1VJRF9LRVkKKyAgICBAZm9yIEVt
YmVyCisgICAgQHR5cGUgU3RyaW5nCisgICAgQGZpbmFsCisgICovCisgIHZhciBHVUlEX0tFWSA9
IGludGVybignX19lbWJlcicgKyArbmV3IERhdGUoKSk7CisKKyAgdmFyIEdVSURfREVTQyA9IHsK
KyAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgZW51bWVy
YWJsZTogZmFsc2UsCisgICAgdmFsdWU6IG51bGwKKyAgfTsKKworICBleHBvcnRzLkdVSURfREVT
QyA9IEdVSURfREVTQzsKKyAgdmFyIG51bGxEZXNjcmlwdG9yID0geworICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZSwKKyAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICBlbnVtZXJhYmxlOiBmYWxzZSwKKyAg
ICB2YWx1ZTogbnVsbAorICB9OworCisgIHZhciBHVUlEX0tFWV9QUk9QRVJUWSA9IHsKKyAgICBu
YW1lOiBHVUlEX0tFWSwKKyAgICBkZXNjcmlwdG9yOiBudWxsRGVzY3JpcHRvcgorICB9OworCisg
IGV4cG9ydHMuR1VJRF9LRVlfUFJPUEVSVFkgPSBHVUlEX0tFWV9QUk9QRVJUWTsKKyAgLyoqCisg
ICAgR2VuZXJhdGVzIGEgbmV3IGd1aWQsIG9wdGlvbmFsbHkgc2F2aW5nIHRoZSBndWlkIHRvIHRo
ZSBvYmplY3QgdGhhdCB5b3UKKyAgICBwYXNzIGluLiBZb3Ugd2lsbCByYXJlbHkgbmVlZCB0byB1
c2UgdGhpcyBtZXRob2QuIEluc3RlYWQgeW91IHNob3VsZAorICAgIGNhbGwgYEVtYmVyLmd1aWRG
b3Iob2JqKWAsIHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBndWlkIGlmIGF2YWlsYWJsZS4KKyAg
CisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGdlbmVyYXRlR3VpZAorICAgIEBmb3IgRW1iZXIK
KyAgICBAcGFyYW0ge09iamVjdH0gW29ial0gT2JqZWN0IHRoZSBndWlkIHdpbGwgYmUgdXNlZCBm
b3IuIElmIHBhc3NlZCBpbiwgdGhlIGd1aWQgd2lsbAorICAgICAgYmUgc2F2ZWQgb24gdGhlIG9i
amVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlvdSBwYXNzIHRoZSBzYW1lIG9iamVjdAorICAgICAg
YWdhaW4uCisgIAorICAgICAgSWYgbm8gb2JqZWN0IGlzIHBhc3NlZCwganVzdCBnZW5lcmF0ZSBh
IG5ldyBndWlkLgorICAgIEBwYXJhbSB7U3RyaW5nfSBbcHJlZml4XSBQcmVmaXggdG8gcGxhY2Ug
aW4gZnJvbnQgb2YgdGhlIGd1aWQuIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCisgICAgICBzZXBh
cmF0ZSB0aGUgZ3VpZCBpbnRvIHNlcGFyYXRlIG5hbWVzcGFjZXMuCisgICAgQHJldHVybiB7U3Ry
aW5nfSB0aGUgZ3VpZAorICAqLworCisgIGZ1bmN0aW9uIGdlbmVyYXRlR3VpZChvYmosIHByZWZp
eCkgeworICAgIGlmICghcHJlZml4KSB7CisgICAgICBwcmVmaXggPSBHVUlEX1BSRUZJWDsKKyAg
ICB9CisKKyAgICB2YXIgcmV0ID0gcHJlZml4ICsgdXVpZCgpOworICAgIGlmIChvYmopIHsKKyAg
ICAgIGlmIChvYmpbR1VJRF9LRVldID09PSBudWxsKSB7CisgICAgICAgIG9ialtHVUlEX0tFWV0g
PSByZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBHVUlEX0RFU0MudmFsdWUgPSByZXQ7Cisg
ICAgICAgIGlmIChvYmouX19kZWZpbmVOb25FbnVtZXJhYmxlKSB7CisgICAgICAgICAgb2JqLl9f
ZGVmaW5lTm9uRW51bWVyYWJsZShHVUlEX0tFWV9QUk9QRVJUWSk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgR1VJRF9LRVksIEdVSURfREVT
Qyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisg
IC8qKgorICAgIFJldHVybnMgYSB1bmlxdWUgaWQgZm9yIHRoZSBvYmplY3QuIElmIHRoZSBvYmpl
Y3QgZG9lcyBub3QgeWV0IGhhdmUgYSBndWlkLAorICAgIG9uZSB3aWxsIGJlIGFzc2lnbmVkIHRv
IGl0LiBZb3UgY2FuIGNhbGwgdGhpcyBvbiBhbnkgb2JqZWN0LAorICAgIGBFbWJlci5PYmplY3Rg
LWJhc2VkIG9yIG5vdCwgYnV0IGJlIGF3YXJlIHRoYXQgaXQgd2lsbCBhZGQgYSBgX2d1aWRgCisg
ICAgcHJvcGVydHkuCisgIAorICAgIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBtZXRob2Qgb24gRE9N
IEVsZW1lbnQgb2JqZWN0cy4KKyAgCisgICAgQHB1YmxpYworICAgIEBtZXRob2QgZ3VpZEZvcgor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIGFueSBvYmplY3QsIHN0cmlu
ZywgbnVtYmVyLCBFbGVtZW50LCBvciBwcmltaXRpdmUKKyAgICBAcmV0dXJuIHtTdHJpbmd9IHRo
ZSB1bmlxdWUgZ3VpZCBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgKi8KKworICBmdW5jdGlvbiBndWlk
Rm9yKG9iaikgeworICAgIGlmIChvYmogJiYgb2JqW0dVSURfS0VZXSkgeworICAgICAgcmV0dXJu
IG9ialtHVUlEX0tFWV07CisgICAgfQorCisgICAgLy8gc3BlY2lhbCBjYXNlcyB3aGVyZSB3ZSBk
b24ndCB3YW50IHRvIGFkZCBhIGtleSB0byBvYmplY3QKKyAgICBpZiAob2JqID09PSB1bmRlZmlu
ZWQpIHsKKyAgICAgIHJldHVybiAnKHVuZGVmaW5lZCknOworICAgIH0KKworICAgIGlmIChvYmog
PT09IG51bGwpIHsKKyAgICAgIHJldHVybiAnKG51bGwpJzsKKyAgICB9CisKKyAgICB2YXIgcmV0
OworICAgIHZhciB0eXBlID0gdHlwZW9mIG9iajsKKworICAgIC8vIERvbid0IGFsbG93IHByb3Rv
dHlwZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRvIGNoYW5nZSB0aGUgZ3VpZEZvcgorICAgIHN3
aXRjaCAodHlwZSkgeworICAgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgICAgcmV0ID0gbnVtYmVy
Q2FjaGVbb2JqXTsKKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIHJldCA9IG51bWJl
ckNhY2hlW29ial0gPSAnbnUnICsgb2JqOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJl
dDsKKworICAgICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAgcmV0ID0gc3RyaW5nQ2FjaGVbb2Jq
XTsKKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIHJldCA9IHN0cmluZ0NhY2hlW29i
al0gPSAnc3QnICsgdXVpZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwor
ICAgICAgY2FzZSAnYm9vbGVhbic6CisgICAgICAgIHJldHVybiBvYmogPyAnKHRydWUpJyA6ICco
ZmFsc2UpJzsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG9iaiA9PT0gT2JqZWN0KSB7
CisgICAgICAgICAgcmV0dXJuICcoT2JqZWN0KSc7CisgICAgICAgIH0KKworICAgICAgICBpZiAo
b2JqID09PSBBcnJheSkgeworICAgICAgICAgIHJldHVybiAnKEFycmF5KSc7CisgICAgICAgIH0K
KworICAgICAgICByZXQgPSBHVUlEX1BSRUZJWCArIHV1aWQoKTsKKworICAgICAgICBpZiAob2Jq
W0dVSURfS0VZXSA9PT0gbnVsbCkgeworICAgICAgICAgIG9ialtHVUlEX0tFWV0gPSByZXQ7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1VJRF9ERVNDLnZhbHVlID0gcmV0OworCisgICAg
ICAgICAgaWYgKG9iai5fX2RlZmluZU5vbkVudW1lcmFibGUpIHsKKyAgICAgICAgICAgIG9iai5f
X2RlZmluZU5vbkVudW1lcmFibGUoR1VJRF9LRVlfUFJPUEVSVFkpOworICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJ
RF9ERVNDKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAg
ICB9CisgIH0KKworICB2YXIgSEFTX1NVUEVSX1BBVFRFUk4gPSAvXC4oX3N1cGVyfGNhbGxcKHRo
aXN8YXBwbHlcKHRoaXMpLzsKKyAgdmFyIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUu
dG9TdHJpbmc7CisKKyAgdmFyIGNoZWNrSGFzU3VwZXIgPSAoZnVuY3Rpb24gKCkgeworICAgIHZh
ciBzb3VyY2VBdmFpbGFibGUgPSBmblRvU3RyaW5nLmNhbGwoZnVuY3Rpb24gKCkgeworICAgICAg
cmV0dXJuIHRoaXM7CisgICAgfSkuaW5kZXhPZigncmV0dXJuIHRoaXMnKSA+IC0xOworCisgICAg
aWYgKHNvdXJjZUF2YWlsYWJsZSkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrSGFzU3Vw
ZXIoZnVuYykgeworICAgICAgICByZXR1cm4gSEFTX1NVUEVSX1BBVFRFUk4udGVzdChmblRvU3Ry
aW5nLmNhbGwoZnVuYykpOworICAgICAgfTsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb24g
Y2hlY2tIYXNTdXBlcigpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH07CisgIH0pKCk7CisK
KyAgZXhwb3J0cy5jaGVja0hhc1N1cGVyID0gY2hlY2tIYXNTdXBlcjsKKyAgZnVuY3Rpb24gUk9P
VCgpIHt9CisgIFJPT1QuX19oYXNTdXBlciA9IGZhbHNlOworCisgIGZ1bmN0aW9uIGhhc1N1cGVy
KGZ1bmMpIHsKKyAgICBpZiAoZnVuYy5fX2hhc1N1cGVyID09PSB1bmRlZmluZWQpIHsKKyAgICAg
IGZ1bmMuX19oYXNTdXBlciA9IGNoZWNrSGFzU3VwZXIoZnVuYyk7CisgICAgfQorICAgIHJldHVy
biBmdW5jLl9faGFzU3VwZXI7CisgIH0KKworICAvKioKKyAgICBXcmFwcyB0aGUgcGFzc2VkIGZ1
bmN0aW9uIHNvIHRoYXQgYHRoaXMuX3N1cGVyYCB3aWxsIHBvaW50IHRvIHRoZSBzdXBlckZ1bmMK
KyAgICB3aGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGlzIGlzIHRoZSBwcmltaXRpdmUg
d2UgdXNlIHRvIGltcGxlbWVudAorICAgIGNhbGxzIHRvIHN1cGVyLgorICAKKyAgICBAcHJpdmF0
ZQorICAgIEBtZXRob2Qgd3JhcAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYWxsCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJG
dW5jIFRoZSBzdXBlciBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gd3JhcHBlZCBm
dW5jdGlvbi4KKyAgKi8KKworICBmdW5jdGlvbiB3cmFwKGZ1bmMsIHN1cGVyRnVuYykgeworICAg
IGlmICghaGFzU3VwZXIoZnVuYykpIHsKKyAgICAgIHJldHVybiBmdW5jOworICAgIH0KKyAgICAv
LyBlbnN1cmUgYW4gdW53cmFwcGVkIHN1cGVyIHRoYXQgY2FsbHMgX3N1cGVyIGlzIHdyYXBwZWQg
d2l0aCBhIHRlcm1pbmFsIF9zdXBlcgorICAgIGlmICghc3VwZXJGdW5jLndyYXBwZWRGdW5jdGlv
biAmJiBoYXNTdXBlcihzdXBlckZ1bmMpKSB7CisgICAgICByZXR1cm4gX3dyYXAoZnVuYywgX3dy
YXAoc3VwZXJGdW5jLCBST09UKSk7CisgICAgfQorICAgIHJldHVybiBfd3JhcChmdW5jLCBzdXBl
ckZ1bmMpOworICB9CisKKyAgZnVuY3Rpb24gX3dyYXAoZnVuYywgc3VwZXJGdW5jKSB7CisgICAg
ZnVuY3Rpb24gc3VwZXJXcmFwcGVyKCkgeworICAgICAgdmFyIG9yaWcgPSB0aGlzLl9zdXBlcjsK
KyAgICAgIHRoaXMuX3N1cGVyID0gc3VwZXJGdW5jOworICAgICAgdmFyIHJldCA9IGZ1bmMuYXBw
bHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3N1cGVyID0gb3JpZzsKKyAgICAgIHJl
dHVybiByZXQ7CisgICAgfQorCisgICAgc3VwZXJXcmFwcGVyLndyYXBwZWRGdW5jdGlvbiA9IGZ1
bmM7CisgICAgc3VwZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNfXyA9IGZ1bmMuX19lbWJlcl9v
YnNlcnZlc19fOworICAgIHN1cGVyV3JhcHBlci5fX2VtYmVyX29ic2VydmVzQmVmb3JlX18gPSBm
dW5jLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXzsKKyAgICBzdXBlcldyYXBwZXIuX19lbWJlcl9s
aXN0ZW5zX18gPSBmdW5jLl9fZW1iZXJfbGlzdGVuc19fOworCisgICAgcmV0dXJuIHN1cGVyV3Jh
cHBlcjsKKyAgfQorCisgIC8qKgorICAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGBtZXRob2ROYW1l
YCBleGlzdHMgb24gdGhlIGBvYmpgLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGZv
byA9IHsgYmFyOiBmdW5jdGlvbigpIHsgcmV0dXJuICdiYXInOyB9LCBiYXo6IG51bGwgfTsKKyAg
CisgICAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JhcicpOyAvLyB0cnVlCisgICAgRW1iZXIuY2Fu
SW52b2tlKGZvbywgJ2JheicpOyAvLyBmYWxzZQorICAgIEVtYmVyLmNhbkludm9rZShmb28sICdi
YXQnKTsgLy8gZmFsc2UKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjYW5JbnZva2UKKyAgICBA
Zm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZv
ciB0aGUgbWV0aG9kCisgICAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBu
YW1lIHRvIGNoZWNrIGZvcgorICAgIEByZXR1cm4ge0Jvb2xlYW59CisgICAgQHByaXZhdGUKKyAg
Ki8KKyAgZnVuY3Rpb24gY2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkgeworICAgIHJldHVybiAh
IShvYmogJiYgdHlwZW9mIG9ialttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7CisgIH0KKwor
ICAvKioKKyAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBgbWV0aG9kTmFtZWAgZXhpc3RzIG9uIHRo
ZSBgb2JqYCwKKyAgICBhbmQgaWYgaXQgZG9lcywgaW52b2tlcyBpdCB3aXRoIHRoZSBhcmd1bWVu
dHMgcGFzc2VkLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIGQgPSBuZXcgRGF0ZSgn
MDMvMTUvMjAxMycpOworICAKKyAgICBFbWJlci50cnlJbnZva2UoZCwgJ2dldFRpbWUnKTsgICAg
ICAgICAgICAgIC8vIDEzNjMzMjAwMDAwMDAKKyAgICBFbWJlci50cnlJbnZva2UoZCwgJ3NldEZ1
bGxZZWFyJywgWzIwMTRdKTsgIC8vIDEzOTQ4NTYwMDAwMDAKKyAgICBFbWJlci50cnlJbnZva2Uo
ZCwgJ25vU3VjaE1ldGhvZCcsIFsyMDE0XSk7IC8vIHVuZGVmaW5lZAorICAgIGBgYAorICAKKyAg
ICBAbWV0aG9kIHRyeUludm9rZQorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0g
b2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBtZXRob2QKKyAgICBAcGFyYW0ge1N0cmlu
Z30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2hlY2sgZm9yCisgICAgQHBhcmFtIHtB
cnJheX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kCisgICAgQHJl
dHVybiB7Kn0gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgaW52b2tlZCBtZXRob2Qgb3IgdW5kZWZp
bmVkIGlmIGl0IGNhbm5vdCBiZSBpbnZva2VkCisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0
aW9uIHRyeUludm9rZShvYmosIG1ldGhvZE5hbWUsIGFyZ3MpIHsKKyAgICBpZiAoY2FuSW52b2tl
KG9iaiwgbWV0aG9kTmFtZSkpIHsKKyAgICAgIHJldHVybiBhcmdzID8gYXBwbHlTdHIob2JqLCBt
ZXRob2ROYW1lLCBhcmdzKSA6IGFwcGx5U3RyKG9iaiwgbWV0aG9kTmFtZSk7CisgICAgfQorICB9
CisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBU
WVBJTkcgJiBBUlJBWSBNRVNTQUdJTkcKKyAgLy8KKworICB2YXIgb2JqZWN0VG9TdHJpbmcgPSBP
YmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCisgIC8qKgorICAgIEZvcmNlcyB0aGUgcGFzc2Vk
IG9iamVjdCB0byBiZSBwYXJ0IG9mIGFuIGFycmF5LiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkK
KyAgICBhbiBhcnJheSwgaXQgd2lsbCByZXR1cm4gdGhlIG9iamVjdC4gT3RoZXJ3aXNlLCBpdCB3
aWxsIGFkZCB0aGUgb2JqZWN0IHRvCisgICAgYW4gYXJyYXkuIElmIG9iaiBpcyBgbnVsbGAgb3Ig
YHVuZGVmaW5lZGAsIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgRW1iZXIubWFrZUFycmF5KCk7ICAgICAgICAgICAgLy8gW10KKyAgICBF
bWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAvLyBbXQorICAgIEVtYmVyLm1ha2VBcnJheSh1
bmRlZmluZWQpOyAgIC8vIFtdCisgICAgRW1iZXIubWFrZUFycmF5KCdsaW5kc2F5Jyk7ICAgLy8g
WydsaW5kc2F5J10KKyAgICBFbWJlci5tYWtlQXJyYXkoWzEsIDIsIDQyXSk7ICAvLyBbMSwgMiwg
NDJdCisgIAorICAgIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5jcmVhdGUoeyBj
b250ZW50OiBbXSB9KTsKKyAgCisgICAgRW1iZXIubWFrZUFycmF5KGNvbnRyb2xsZXIpID09PSBj
b250cm9sbGVyOyAgLy8gdHJ1ZQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1ha2VBcnJheQor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0ge09iamVjdH0gb2JqIHRoZSBvYmplY3QKKyAgICBA
cmV0dXJuIHtBcnJheX0KKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIG1ha2VBcnJh
eShvYmopIHsKKyAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgICByZXR1cm4gW107CisgICAgfQorICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgPyBv
YmogOiBbb2JqXTsKKyAgfQorCisgIC8qKgorICAgIENvbnZlbmllbmNlIG1ldGhvZCB0byBpbnNw
ZWN0IGFuIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgY29udmVydCB0
aGUgb2JqZWN0IGludG8gYSB1c2VmdWwgc3RyaW5nIGRlc2NyaXB0aW9uLgorICAKKyAgICBJdCBp
cyBhIHByZXR0eSBzaW1wbGUgaW1wbGVtZW50YXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBt
b3JlIHJvYnVzdCwKKyAgICB1c2Ugc29tZXRoaW5nIGxpa2UgSlNEdW1wOiBodHRwczovL2dpdGh1
Yi5jb20vTlYvanNEdW1wCisgIAorICAgIEBtZXRob2QgaW5zcGVjdAorICAgIEBmb3IgRW1iZXIK
KyAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgeW91IHdhbnQgdG8gaW5zcGVjdC4K
KyAgICBAcmV0dXJuIHtTdHJpbmd9IEEgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdAorICAgIEBz
aW5jZSAxLjQuMAorICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gaW5zcGVjdChvYmop
IHsKKyAgICBpZiAob2JqID09PSBudWxsKSB7CisgICAgICByZXR1cm4gJ251bGwnOworICAgIH0K
KyAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJldHVybiAndW5kZWZpbmVkJzsK
KyAgICB9CisgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuICdbJyAr
IG9iaiArICddJzsKKyAgICB9CisgICAgLy8gZm9yIG5vbiBvYmplY3RzCisgICAgdmFyIHR5cGUg
PSB0eXBlb2Ygb2JqOworICAgIGlmICh0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnc3lt
Ym9sJykgeworICAgICAgcmV0dXJuICcnICsgb2JqOworICAgIH0KKyAgICAvLyBvdmVycmlkZGVu
IHRvU3RyaW5nCisgICAgaWYgKHR5cGVvZiBvYmoudG9TdHJpbmcgPT09ICdmdW5jdGlvbicgJiYg
b2JqLnRvU3RyaW5nICE9PSBvYmplY3RUb1N0cmluZykgeworICAgICAgcmV0dXJuIG9iai50b1N0
cmluZygpOworICAgIH0KKworICAgIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPT09IHt9
LnRvU3RyaW5nCisgICAgdmFyIHY7CisgICAgdmFyIHJldCA9IFtdOworICAgIGZvciAodmFyIGtl
eSBpbiBvYmopIHsKKyAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAg
ICB2ID0gb2JqW2tleV07CisgICAgICAgIGlmICh2ID09PSAndG9TdHJpbmcnKSB7CisgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0gLy8gaWdub3JlIHVzZWxlc3MgaXRlbXMKKyAgICAgICAg
aWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgdiA9ICdmdW5jdGlvbigp
IHsgLi4uIH0nOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYudG9TdHJp
bmcgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICByZXQucHVzaChrZXkgKyAnOiAnICsgb2Jq
ZWN0VG9TdHJpbmcuY2FsbCh2KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0LnB1
c2goa2V5ICsgJzogJyArIHYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVy
biAneycgKyByZXQuam9pbignLCAnKSArICd9JzsKKyAgfQorCisgIC8qKgorICAgIEBwYXJhbSB7
T2JqZWN0fSB0IHRhcmdldAorICAgIEBwYXJhbSB7U3RyaW5nfSBtIG1ldGhvZAorICAgIEBwYXJh
bSB7QXJyYXl9IGEgYXJncworICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gYXBwbHlT
dHIodCwgbSwgYSkgeworICAgIHZhciBsID0gYSAmJiBhLmxlbmd0aDsKKyAgICBpZiAoIWEgfHwg
IWwpIHsKKyAgICAgIHJldHVybiB0W21dKCk7CisgICAgfQorICAgIHN3aXRjaCAobCkgeworICAg
ICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gdFttXShhWzBdKTsKKyAgICAgIGNhc2UgMjoKKyAg
ICAgICAgcmV0dXJuIHRbbV0oYVswXSwgYVsxXSk7CisgICAgICBjYXNlIDM6CisgICAgICAgIHJl
dHVybiB0W21dKGFbMF0sIGFbMV0sIGFbMl0pOworICAgICAgY2FzZSA0OgorICAgICAgICByZXR1
cm4gdFttXShhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAg
cmV0dXJuIHRbbV0oYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7CisgICAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm4gdFttXS5hcHBseSh0LCBhKTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBsb29rdXBEZXNjcmlwdG9yKG9iaiwga2V5TmFtZSkgeworICAgIHZhciBjdXJyZW50ID0g
b2JqOworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVj
dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VycmVudCwga2V5TmFtZSk7CisKKyAgICAgIGlm
IChkZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgfQorCisg
ICAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpOworICAgIH0KKwor
ICAgIHJldHVybiBudWxsOworICB9CisKKyAgLy8gQSBgdG9TdHJpbmdgIHV0aWwgZnVuY3Rpb24g
dGhhdCBzdXBwb3J0cyBvYmplY3RzIHdpdGhvdXQgYSBgdG9TdHJpbmdgCisgIC8vIG1ldGhvZCwg
ZS5nLiBhbiBvYmplY3QgY3JlYXRlZCB3aXRoIGBPYmplY3QuY3JlYXRlKG51bGwpYC4KKworICBm
dW5jdGlvbiB0b1N0cmluZyhvYmopIHsKKyAgICBpZiAob2JqICYmIG9iai50b1N0cmluZykgewor
ICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4g
b2JqZWN0VG9TdHJpbmcuY2FsbChvYmopOworICAgIH0KKyAgfQorCisgIGV4cG9ydHMuR1VJRF9L
RVkgPSBHVUlEX0tFWTsKKyAgZXhwb3J0cy5tYWtlQXJyYXkgPSBtYWtlQXJyYXk7CisgIGV4cG9y
dHMuY2FuSW52b2tlID0gY2FuSW52b2tlOworfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3dhdGNo
X2tleScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9t
ZXRhJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvdXRpbHMnXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRmVhdHVyZXMsIF9lbWJlck1ldGFsTWV0YSwgX2Vt
YmVyTWV0YWxQcm9wZXJ0aWVzLCBfZW1iZXJNZXRhbFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLndhdGNoS2V5ID0gd2F0Y2hLZXk7CisgIGV4cG9ydHMudW53YXRjaEtleSA9
IHVud2F0Y2hLZXk7CisKKyAgdmFyIGhhbmRsZU1hbmRhdG9yeVNldHRlciA9IHVuZGVmaW5lZDsK
KworICBmdW5jdGlvbiB3YXRjaEtleShvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgICAvLyBjYW4n
dCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCisgICAgaWYgKGtleU5h
bWUgPT09ICdsZW5ndGgnICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIHZhciBtID0gbWV0YSB8fCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopOwor
CisgICAgLy8gYWN0aXZhdGUgd2F0Y2hpbmcgZmlyc3QgdGltZQorICAgIGlmICghbS5wZWVrV2F0
Y2hpbmcoa2V5TmFtZSkpIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhrZXlOYW1lLCAxKTsKKwor
ICAgICAgdmFyIHBvc3NpYmxlRGVzYyA9IG9ialtrZXlOYW1lXTsKKyAgICAgIHZhciBkZXNjID0g
cG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3Qn
ICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7
CisgICAgICBpZiAoZGVzYyAmJiBkZXNjLndpbGxXYXRjaCkgeworICAgICAgICBkZXNjLndpbGxX
YXRjaChvYmosIGtleU5hbWUpOworICAgICAgfQorCisgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0g
dHlwZW9mIG9iai53aWxsV2F0Y2hQcm9wZXJ0eSkgeworICAgICAgICBvYmoud2lsbFdhdGNoUHJv
cGVydHkoa2V5TmFtZSk7CisgICAgICB9CisKKyAgICAgIC8vIE5PVEU6IHRoaXMgaXMgZHJvcHBl
ZCBmb3IgcHJvZCArIG1pbmlmaWVkIGJ1aWxkcworICAgICAgaGFuZGxlTWFuZGF0b3J5U2V0dGVy
KG0sIG9iaiwga2V5TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhr
ZXlOYW1lLCAobS5wZWVrV2F0Y2hpbmcoa2V5TmFtZSkgfHwgMCkgKyAxKTsKKyAgICB9CisgIH0K
KworICAvLyBGdXR1cmUgdHJhdmVsZXIsIGFsdGhvdWdoIHRoaXMgY29kZSBsb29rcyBzY2FyeS4g
SXQgbWVyZWx5IGV4aXN0cyBpbgorICAvLyBkZXZlbG9wbWVudCB0byBhaWQgaW4gZGV2ZWxvcG1l
bnQgYXNlcnRpb25zLiBQcm9kdWN0aW9uIGJ1aWxkcyBvZgorICAvLyBlbWJlciBzdHJpcCB0aGlz
IGVudGlyZSBibG9jayBvdXQKKyAgaGFuZGxlTWFuZGF0b3J5U2V0dGVyID0gZnVuY3Rpb24gaGFu
ZGxlTWFuZGF0b3J5U2V0dGVyKG0sIG9iaiwga2V5TmFtZSkgeworICAgIHZhciBkZXNjcmlwdG9y
ID0gX2VtYmVyTWV0YWxVdGlscy5sb29rdXBEZXNjcmlwdG9yKG9iaiwga2V5TmFtZSk7CisgICAg
dmFyIGNvbmZpZ3VyYWJsZSA9IGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6
IHRydWU7CisgICAgdmFyIGlzV3JpdGFibGUgPSBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci53cml0
YWJsZSA6IHRydWU7CisgICAgdmFyIGhhc1ZhbHVlID0gZGVzY3JpcHRvciA/ICd2YWx1ZScgaW4g
ZGVzY3JpcHRvciA6IHRydWU7CisgICAgdmFyIHBvc3NpYmxlRGVzYyA9IGRlc2NyaXB0b3IgJiYg
ZGVzY3JpcHRvci52YWx1ZTsKKyAgICB2YXIgaXNEZXNjcmlwdG9yID0gcG9zc2libGVEZXNjICE9
PSBudWxsICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVz
Yy5pc0Rlc2NyaXB0b3I7CisKKyAgICBpZiAoaXNEZXNjcmlwdG9yKSB7CisgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gdGhpcyB4IGluIFkgZGVvcHRzLCBzbyBrZWVwaW5nIGl0IGluIHRo
aXMgZnVuY3Rpb24gaXMgYmV0dGVyOworICAgIGlmIChjb25maWd1cmFibGUgJiYgaXNXcml0YWJs
ZSAmJiBoYXNWYWx1ZSAmJiBrZXlOYW1lIGluIG9iaikgeworICAgICAgdmFyIGRlc2MgPSB7Cisg
ICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgZW51bWVyYWJsZTogT2JqZWN0LnBy
b3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwga2V5TmFtZSksCisgICAgICAg
IHNldDogX2VtYmVyTWV0YWxQcm9wZXJ0aWVzLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04oa2V5
TmFtZSksCisgICAgICAgIGdldDogdW5kZWZpbmVkCisgICAgICB9OworCisgICAgICBpZiAoT2Jq
ZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5TmFtZSkpIHsKKyAgICAg
ICAgbS53cml0ZVZhbHVlcyhrZXlOYW1lLCBvYmpba2V5TmFtZV0pOworICAgICAgICBkZXNjLmdl
dCA9IF9lbWJlck1ldGFsUHJvcGVydGllcy5ERUZBVUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1l
KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MuZ2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0
aWVzLklOSEVSSVRJTkdfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUpOworICAgICAgfQorCisgICAg
ICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCBkZXNjKTsKKyAgICB9CisgIH07
CisKKyAgZnVuY3Rpb24gdW53YXRjaEtleShvYmosIGtleU5hbWUsIG1ldGEpIHsKKyAgICB2YXIg
bSA9IG1ldGEgfHwgX2VtYmVyTWV0YWxNZXRhLm1ldGEob2JqKTsKKyAgICB2YXIgY291bnQgPSBt
LnBlZWtXYXRjaGluZyhrZXlOYW1lKTsKKyAgICBpZiAoY291bnQgPT09IDEpIHsKKyAgICAgIG0u
d3JpdGVXYXRjaGluZyhrZXlOYW1lLCAwKTsKKworICAgICAgdmFyIHBvc3NpYmxlRGVzYyA9IG9i
altrZXlOYW1lXTsKKyAgICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxsICYmIHR5
cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rlc2NyaXB0
b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChkZXNjICYmIGRlc2Mu
ZGlkVW53YXRjaCkgeworICAgICAgICBkZXNjLmRpZFVud2F0Y2gob2JqLCBrZXlOYW1lKTsKKyAg
ICAgIH0KKworICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkVW53YXRjaFBy
b3BlcnR5KSB7CisgICAgICAgIG9iai5kaWRVbndhdGNoUHJvcGVydHkoa2V5TmFtZSk7CisgICAg
ICB9CisKKyAgICAgIC8vIEl0IGlzIHRydWUsIHRoZSBmb2xsb3dpbmcgY29kZSBsb29rcyBxdWl0
ZSBXQVQuIEJ1dCBoYXZlIG5vIGZlYXIsIEl0CisgICAgICAvLyBleGlzdHMgcHVyZWx5IHRvIGlt
cHJvdmUgZGV2ZWxvcG1lbnQgZXJnb25vbWljcyBhbmQgaXMgcmVtb3ZlZCBmcm9tCisgICAgICAv
LyBlbWJlci5taW4uanMgYW5kIGVtYmVyLnByb2QuanMgYnVpbGRzLgorICAgICAgLy8KKyAgICAg
IC8vIFNvbWUgZnVydGhlciBjb250ZXh0OiBPbmNlIGEgcHJvcGVydHkgaXMgd2F0Y2hlZCBieSBl
bWJlciwgYnlwYXNzaW5nIGBzZXRgCisgICAgICAvLyBmb3IgbXV0YXRpb24sIHdpbGwgYnlwYXNz
IG9ic2VydmF0aW9uLiBUaGlzIGNvZGUgZXhpc3RzIHRvIGFzc2VydCB3aGVuCisgICAgICAvLyB0
aGF0IG9jY3VycywgYW5kIGF0dGVtcHQgdG8gcHJvdmlkZSBtb3JlIGhlbHBmdWwgZmVlZGJhY2su
IFRoZSBhbHRlcm5hdGl2ZQorICAgICAgLy8gaXMgdHJpY2t5IHRvIGRlYnVnIHBhcnRpYWxseSBv
YnNlcnZhYmxlIHByb3BlcnRpZXMuCisgICAgICBpZiAoIWRlc2MgJiYga2V5TmFtZSBpbiBvYmop
IHsKKyAgICAgICAgdmFyIG1heWJlTWFuZGF0b3J5RGVzY3JpcHRvciA9IF9lbWJlck1ldGFsVXRp
bHMubG9va3VwRGVzY3JpcHRvcihvYmosIGtleU5hbWUpOworCisgICAgICAgIGlmIChtYXliZU1h
bmRhdG9yeURlc2NyaXB0b3Iuc2V0ICYmIG1heWJlTWFuZGF0b3J5RGVzY3JpcHRvci5zZXQuaXNN
YW5kYXRvcnlTZXR0ZXIpIHsKKyAgICAgICAgICBpZiAobWF5YmVNYW5kYXRvcnlEZXNjcmlwdG9y
LmdldCAmJiBtYXliZU1hbmRhdG9yeURlc2NyaXB0b3IuZ2V0LmlzSW5oZXJpdGluZ0dldHRlcikg
eworICAgICAgICAgICAgZGVsZXRlIG9ialtrZXlOYW1lXTsKKyAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5TmFtZSwgeworICAgICAg
ICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICAgIGVudW1lcmFibGU6IE9i
amVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIGtleU5hbWUpLAor
ICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgdmFsdWU6IG0ucGVl
a1ZhbHVlcyhrZXlOYW1lKQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtLmRlbGV0ZUZy
b21WYWx1ZXMoa2V5TmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAg
fSBlbHNlIGlmIChjb3VudCA+IDEpIHsKKyAgICAgIG0ud3JpdGVXYXRjaGluZyhrZXlOYW1lLCBj
b3VudCAtIDEpOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLW1ldGFsL3dhdGNoX3Bh
dGgnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWV0YScsICdlbWJlci1tZXRhbC9jaGFpbnMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxDaGFpbnMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMud2F0Y2hQYXRoID0gd2F0Y2hQYXRoOwor
ICBleHBvcnRzLnVud2F0Y2hQYXRoID0gdW53YXRjaFBhdGg7CisKKyAgLy8gZ2V0IHRoZSBjaGFp
bnMgZm9yIHRoZSBjdXJyZW50IG9iamVjdC4gSWYgdGhlIGN1cnJlbnQgb2JqZWN0IGhhcworICAv
LyBjaGFpbnMgaW5oZXJpdGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBiZSBjbG9uZWQgYW5k
IHJlY29uZmlndXJlZCBmb3IKKyAgLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgorICBmdW5jdGlvbiBj
aGFpbnNGb3Iob2JqLCBtZXRhKSB7CisgICAgcmV0dXJuIChtZXRhIHx8IF9lbWJlck1ldGFsTWV0
YS5tZXRhKG9iaikpLndyaXRhYmxlQ2hhaW5zKG1ha2VDaGFpbk5vZGUpOworICB9CisKKyAgZnVu
Y3Rpb24gbWFrZUNoYWluTm9kZShvYmopIHsKKyAgICByZXR1cm4gbmV3IF9lbWJlck1ldGFsQ2hh
aW5zLkNoYWluTm9kZShudWxsLCBudWxsLCBvYmopOworICB9CisKKyAgZnVuY3Rpb24gd2F0Y2hQ
YXRoKG9iaiwga2V5UGF0aCwgbWV0YSkgeworICAgIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBB
cnJheSAtIGl0IGlzIHNwZWNpYWwuLi4KKyAgICBpZiAoa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYg
QXJyYXkuaXNBcnJheShvYmopKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG0g
PSBtZXRhIHx8IF9lbWJlck1ldGFsTWV0YS5tZXRhKG9iaik7CisgICAgdmFyIGNvdW50ZXIgPSBt
LnBlZWtXYXRjaGluZyhrZXlQYXRoKSB8fCAwOworICAgIGlmICghY291bnRlcikgeworICAgICAg
Ly8gYWN0aXZhdGUgd2F0Y2hpbmcgZmlyc3QgdGltZQorICAgICAgbS53cml0ZVdhdGNoaW5nKGtl
eVBhdGgsIDEpOworICAgICAgY2hhaW5zRm9yKG9iaiwgbSkuYWRkKGtleVBhdGgpOworICAgIH0g
ZWxzZSB7CisgICAgICBtLndyaXRlV2F0Y2hpbmcoa2V5UGF0aCwgY291bnRlciArIDEpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIHVud2F0Y2hQYXRoKG9iaiwga2V5UGF0aCwgbWV0YSkgewor
ICAgIHZhciBtID0gbWV0YSB8fCBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopOworICAgIHZhciBj
b3VudGVyID0gbS5wZWVrV2F0Y2hpbmcoa2V5UGF0aCkgfHwgMDsKKworICAgIGlmIChjb3VudGVy
ID09PSAxKSB7CisgICAgICBtLndyaXRlV2F0Y2hpbmcoa2V5UGF0aCwgMCk7CisgICAgICBjaGFp
bnNGb3Iob2JqLCBtKS5yZW1vdmUoa2V5UGF0aCk7CisgICAgfSBlbHNlIGlmIChjb3VudGVyID4g
MSkgeworICAgICAgbS53cml0ZVdhdGNoaW5nKGtleVBhdGgsIGNvdW50ZXIgLSAxKTsKKyAgICB9
CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC93YXRjaGluZycsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9jaGFpbnMnLCAnZW1iZXItbWV0YWwvd2F0Y2hfa2V5JywgJ2VtYmVyLW1ldGFs
L3dhdGNoX3BhdGgnLCAnZW1iZXItbWV0YWwvcGF0aF9jYWNoZScsICdlbWJlci1tZXRhbC9tZXRh
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENoYWlucywgX2VtYmVyTWV0YWxXYXRj
aF9rZXksIF9lbWJlck1ldGFsV2F0Y2hfcGF0aCwgX2VtYmVyTWV0YWxQYXRoX2NhY2hlLCBfZW1i
ZXJNZXRhbE1ldGEpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXItbWV0YWwKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5pc1dhdGNoaW5nID0gaXNXYXRjaGluZzsKKyAgZXhw
b3J0cy53YXRjaGVyQ291bnQgPSB3YXRjaGVyQ291bnQ7CisgIGV4cG9ydHMudW53YXRjaCA9IHVu
d2F0Y2g7CisgIGV4cG9ydHMuZGVzdHJveSA9IGRlc3Ryb3k7CisKKyAgLyoqCisgICAgU3RhcnRz
IHdhdGNoaW5nIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBXaGVuZXZlciB0aGUgcHJvcGVydHkg
Y2hhbmdlcywKKyAgICBpbnZva2VzIGBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2VgIGFuZCBgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2VgLiBUaGlzIGlzIHRoZQorICAgIHByaW1pdGl2ZSB1c2VkIGJ5
IG9ic2VydmVycyBhbmQgZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91IHdpbGwgbmV2ZXIgY2Fs
bAorICAgIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIHVzZSBoaWdoZXIgbGV2ZWwg
bWV0aG9kcyBsaWtlCisgICAgYEVtYmVyLmFkZE9ic2VydmVyKClgCisgIAorICAgIEBwcml2YXRl
CisgICAgQG1ldGhvZCB3YXRjaAorICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gb2JqCisgICAg
QHBhcmFtIHtTdHJpbmd9IF9rZXlQYXRoCisgICovCisgIGZ1bmN0aW9uIHdhdGNoKG9iaiwgX2tl
eVBhdGgsIG0pIHsKKyAgICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBz
cGVjaWFsLi4uCisgICAgaWYgKF9rZXlQYXRoID09PSAnbGVuZ3RoJyAmJiBBcnJheS5pc0FycmF5
KG9iaikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIV9lbWJlck1ldGFsUGF0
aF9jYWNoZS5pc1BhdGgoX2tleVBhdGgpKSB7CisgICAgICBfZW1iZXJNZXRhbFdhdGNoX2tleS53
YXRjaEtleShvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0
YWxXYXRjaF9wYXRoLndhdGNoUGF0aChvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9CisgIH0KKwor
ICBleHBvcnRzLndhdGNoID0gd2F0Y2g7CisKKyAgZnVuY3Rpb24gaXNXYXRjaGluZyhvYmosIGtl
eSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAg
cmV0dXJuIChtZXRhICYmIG1ldGEucGVla1dhdGNoaW5nKGtleSkpID4gMDsKKyAgfQorCisgIGZ1
bmN0aW9uIHdhdGNoZXJDb3VudChvYmosIGtleSkgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0
YWxNZXRhLnBlZWtNZXRhKG9iaik7CisgICAgcmV0dXJuIG1ldGEgJiYgbWV0YS5wZWVrV2F0Y2hp
bmcoa2V5KSB8fCAwOworICB9CisKKyAgZnVuY3Rpb24gdW53YXRjaChvYmosIF9rZXlQYXRoLCBt
KSB7CisgICAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMgc3BlY2lhbC4u
LgorICAgIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgQXJyYXkuaXNBcnJheShvYmopKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFfZW1iZXJNZXRhbFBhdGhfY2FjaGUu
aXNQYXRoKF9rZXlQYXRoKSkgeworICAgICAgX2VtYmVyTWV0YWxXYXRjaF9rZXkudW53YXRjaEtl
eShvYmosIF9rZXlQYXRoLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0YWxXYXRj
aF9wYXRoLnVud2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgsIG0pOworICAgIH0KKyAgfQorCisgIHZh
ciBOT0RFX1NUQUNLID0gW107CisKKyAgLyoqCisgICAgVGVhcnMgZG93biB0aGUgbWV0YSBvbiBh
biBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgTXVsdGlw
bGUgY2FsbHMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgCisgICAgQG1ldGhvZCBkZXN0cm95Cisg
ICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogIHRoZSBvYmplY3QgdG8gZGVz
dHJveQorICAgIEByZXR1cm4ge3ZvaWR9CisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlv
biBkZXN0cm95KG9iaikgeworICAgIHZhciBtZXRhID0gX2VtYmVyTWV0YWxNZXRhLnBlZWtNZXRh
KG9iaik7CisgICAgdmFyIG5vZGUsIG5vZGVzLCBrZXksIG5vZGVPYmplY3Q7CisKKyAgICBpZiAo
bWV0YSkgeworICAgICAgX2VtYmVyTWV0YWxNZXRhLmRlbGV0ZU1ldGEob2JqKTsKKyAgICAgIC8v
IHJlbW92ZSBjaGFpbldhdGNoZXJzIHRvIHJlbW92ZSBjaXJjdWxhciByZWZlcmVuY2VzIHRoYXQg
d291bGQgcHJldmVudCBHQworICAgICAgbm9kZSA9IG1ldGEucmVhZGFibGVDaGFpbnMoKTsKKyAg
ICAgIGlmIChub2RlKSB7CisgICAgICAgIE5PREVfU1RBQ0sucHVzaChub2RlKTsKKyAgICAgICAg
Ly8gcHJvY2VzcyB0cmVlCisgICAgICAgIHdoaWxlIChOT0RFX1NUQUNLLmxlbmd0aCA+IDApIHsK
KyAgICAgICAgICBub2RlID0gTk9ERV9TVEFDSy5wb3AoKTsKKyAgICAgICAgICAvLyBwdXNoIGNo
aWxkcmVuCisgICAgICAgICAgbm9kZXMgPSBub2RlLl9jaGFpbnM7CisgICAgICAgICAgaWYgKG5v
ZGVzKSB7CisgICAgICAgICAgICBmb3IgKGtleSBpbiBub2RlcykgeworICAgICAgICAgICAgICBp
ZiAobm9kZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgTk9ERV9TVEFD
Sy5wdXNoKG5vZGVzW2tleV0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgfQorICAgICAgICAgIC8vIHJlbW92ZSBjaGFpbldhdGNoZXIgaW4gbm9kZSBvYmplY3QK
KyAgICAgICAgICBpZiAobm9kZS5fd2F0Y2hpbmcpIHsKKyAgICAgICAgICAgIG5vZGVPYmplY3Qg
PSBub2RlLl9vYmplY3Q7CisgICAgICAgICAgICBpZiAobm9kZU9iamVjdCkgeworICAgICAgICAg
ICAgICBfZW1iZXJNZXRhbENoYWlucy5yZW1vdmVDaGFpbldhdGNoZXIobm9kZU9iamVjdCwgbm9k
ZS5fa2V5LCBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1tZXRhbC93ZWFrX21hcCcsIFsn
ZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJl
ci1tZXRhbC9tZXRhJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1i
ZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbE1ldGEpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFdlYWtNYXA7CisKKyAgdmFyIGlkID0gMDsKKyAgZnVuY3Rpb24gVU5E
RUZJTkVEKCkge30KKworICAvKgorICAgKiBAcHJpdmF0ZQorICAgKiBAY2xhc3MgRW1iZXIuV2Vh
a01hcAorICAgKgorICAgKiBBIHBhcnRpYWwgcG9seWZpbGwgZm9yIFtXZWFrTWFwXShodHRwOi8v
d3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtd2Vha21hcC1vYmpl
Y3RzKS4KKyAgICoKKyAgICogVGhlcmUgaXMgYSBzbWFsbCBidXQgaW1wb3J0YW50IGNhdmVhdC4g
VGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlCisgICAqIHdlYWsgbWFwIHdpbGwg
bGl2ZSBsb25nZXIgKGluIHRoZSBzZW5zZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24pIHRoYW4gYWxs
IG9mIGl0cworICAgKiBrZXlzLCBvdGhlcndpc2UgaXQgaXMgcG9zc2libGUgdG8gbGVhayB0aGUg
dmFsdWVzIHN0b3JlZCBpbiB0aGUgd2VhayBtYXAuIEluCisgICAqIHByYWN0aWNlLCBtb3N0IHVz
ZSBjYXNlcyBzYXRpc2Z5IHRoaXMgbGltaXRhdGlvbiB3aGljaCBpcyB3aHkgaXQgaXMgaW5jbHVk
ZWQKKyAgICogaW4gZW1iZXItbWV0YWwuCisgICAqLworCisgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7
CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0ludm9raW5nIHRoZSBXZWFrTWFwIGNvbnN0
cnVjdG9yIHdpdGggYXJndW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJywgYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMCk7CisKKyAgICB0aGlzLl9pZCA9IF9lbWJlck1ldGFsVXRpbHMu
R1VJRF9LRVkgKyBpZCsrOworICB9CisKKyAgLyoKKyAgICogQG1ldGhvZCBnZXQKKyAgICogQHBh
cmFtIGtleSB7T2JqZWN0IHwgRnVuY3Rpb259CisgICAqIEByZXR1cm4ge0FueX0gc3RvcmVkIHZh
bHVlCisgICAqLworICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAob2JqKSB7Cisg
ICAgdmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAobWV0
YSkgeworICAgICAgdmFyIG1hcCA9IG1ldGEucmVhZGFibGVXZWFrKCk7CisgICAgICBpZiAobWFw
KSB7CisgICAgICAgIGlmIChtYXBbdGhpcy5faWRdID09PSBVTkRFRklORUQpIHsKKyAgICAgICAg
ICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hcFt0aGlz
Ll9pZF07CisgICAgICB9CisgICAgfQorICB9OworCisgIC8qCisgICAqIEBtZXRob2Qgc2V0Cisg
ICAqIEBwYXJhbSBrZXkge09iamVjdCB8IEZ1bmN0aW9ufQorICAgKiBAcGFyYW0gdmFsdWUge0Fu
eX0KKyAgICogQHJldHVybiB7V2Vha01hcH0gdGhlIHdlYWsgbWFwCisgICAqLworICBXZWFrTWFw
LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob2JqLCB2YWx1ZSkgeworICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdVbmNhdWdodCBUeXBlRXJyb3I6IEludmFsaWQgdmFsdWUgdXNlZCBhcyB3
ZWFrIG1hcCBrZXknLCBvYmogJiYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiBv
YmogPT09ICdmdW5jdGlvbicpKTsKKworICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7Cisg
ICAgICB2YWx1ZSA9IFVOREVGSU5FRDsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbE1ldGEubWV0
YShvYmopLndyaXRhYmxlV2VhaygpW3RoaXMuX2lkXSA9IHZhbHVlOworCisgICAgcmV0dXJuIHRo
aXM7CisgIH07CisKKyAgLyoKKyAgICogQG1ldGhvZCBoYXMKKyAgICogQHBhcmFtIGtleSB7T2Jq
ZWN0IHwgRnVuY3Rpb259CisgICAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIHRoZSBrZXkgZXhpc3Rz
CisgICAqLworICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAob2JqKSB7CisgICAg
dmFyIG1ldGEgPSBfZW1iZXJNZXRhbE1ldGEucGVla01ldGEob2JqKTsKKyAgICBpZiAobWV0YSkg
eworICAgICAgdmFyIG1hcCA9IG1ldGEucmVhZGFibGVXZWFrKCk7CisgICAgICBpZiAobWFwKSB7
CisgICAgICAgIHJldHVybiBtYXBbdGhpcy5faWRdICE9PSB1bmRlZmluZWQ7CisgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9OworCisgIC8qCisgICAqIEBtZXRob2QgZGVs
ZXRlCisgICAqIEBwYXJhbSBrZXkge09iamVjdCB8IEZ1bmN0aW9ufQorICAgKiBAcmV0dXJuIHti
b29sZWFufSBpZiB0aGUga2V5IHdhcyBkZWxldGVkCisgICAqLworICBXZWFrTWFwLnByb3RvdHlw
ZS5kZWxldGUgPSBmdW5jdGlvbiAob2JqKSB7CisgICAgaWYgKHRoaXMuaGFzKG9iaikpIHsKKyAg
ICAgIGRlbGV0ZSBfZW1iZXJNZXRhbE1ldGEubWV0YShvYmopLndyaXRhYmxlV2VhaygpW3RoaXMu
X2lkXTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMvaGVs
cGVycy9xdWVyeS1wYXJhbXMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1i
ZXItcm91dGluZy9zeXN0ZW0vcXVlcnlfcGFyYW1zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJSb3V0aW5nU3lzdGVtUXVlcnlfcGFyYW1zKSB7CisgIC8qKgor
ICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcm91dGluZy1odG1sYmFycworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnF1ZXJ5UGFyYW1zSGVscGVyID0gcXVl
cnlQYXJhbXNIZWxwZXI7CisKKyAgLyoqCisgICAgVGhpcyBpcyBhIGhlbHBlciB0byBiZSB1c2Vk
IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGxpbmstdG8gaGVscGVyLgorICAgIEl0IHdpbGwgc3Vw
cGx5IHVybCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHRoZSB0YXJnZXQgcm91dGUuCisgIAorICAgIEV4
YW1wbGUKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bvc3RzJyAocXVl
cnktcGFyYW1zIGRpcmVjdGlvbj0iYXNjIil9fVNvcnR7ey9saW5rLXRvfX0KKyAgICBgYGAKKyAg
CisgICAgQG1ldGhvZCBxdWVyeS1wYXJhbXMKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxw
ZXJzCisgICAgQHBhcmFtIHtPYmplY3R9IGhhc2ggdGFrZXMgYSBoYXNoIG9mIHF1ZXJ5IHBhcmFt
ZXRlcnMKKyAgICBAcmV0dXJuIHtPYmplY3R9IEEgYFF1ZXJ5UGFyYW1zYCBvYmplY3QgZm9yIGB7
e2xpbmstdG99fWAKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gcXVlcnlQYXJhbXNI
ZWxwZXIocGFyYW1zLCBoYXNoKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBg
cXVlcnktcGFyYW1zYCBoZWxwZXIgb25seSBhY2NlcHRzIGhhc2ggcGFyYW1ldGVycywgZS5nLiAo
cXVlcnktcGFyYW1zIHF1ZXJ5UGFyYW1Qcm9wZXJ0eU5hbWU9XCdmb29cJykgYXMgb3Bwb3NlZCB0
byBqdXN0IChxdWVyeS1wYXJhbXMgXCdmb29cJyknLCBwYXJhbXMubGVuZ3RoID09PSAwKTsKKwor
ICAgIHJldHVybiBfZW1iZXJSb3V0aW5nU3lzdGVtUXVlcnlfcGFyYW1zLmRlZmF1bHQuY3JlYXRl
KHsKKyAgICAgIHZhbHVlczogaGFzaAorICAgIH0pOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXIt
cm91dGluZy1odG1sYmFycy9pbmRleCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywg
J2VtYmVyLWh0bWxiYXJzL2hlbHBlcnMnLCAnZW1iZXItaHRtbGJhcnMva2V5d29yZHMnLCAnZW1i
ZXItcm91dGluZy1odG1sYmFycy9oZWxwZXJzL3F1ZXJ5LXBhcmFtcycsICdlbWJlci1yb3V0aW5n
LWh0bWxiYXJzL2tleXdvcmRzL2FjdGlvbicsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzL2tleXdv
cmRzL2VsZW1lbnQtYWN0aW9uJywgJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvcmVu
ZGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlckh0bWxiYXJz
SGVscGVycywgX2VtYmVySHRtbGJhcnNLZXl3b3JkcywgX2VtYmVyUm91dGluZ0h0bWxiYXJzSGVs
cGVyc1F1ZXJ5UGFyYW1zLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0FjdGlvbiwgX2Vt
YmVyUm91dGluZ0h0bWxiYXJzS2V5d29yZHNFbGVtZW50QWN0aW9uLCBfZW1iZXJSb3V0aW5nSHRt
bGJhcnNLZXl3b3Jkc1JlbmRlcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJvdXRpbmctaHRtbGJhcnMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAg
X2VtYmVySHRtbGJhcnNIZWxwZXJzLnJlZ2lzdGVySGVscGVyKCdxdWVyeS1wYXJhbXMnLCBfZW1i
ZXJSb3V0aW5nSHRtbGJhcnNIZWxwZXJzUXVlcnlQYXJhbXMucXVlcnlQYXJhbXNIZWxwZXIpOwor
CisgIF9lbWJlckh0bWxiYXJzS2V5d29yZHMucmVnaXN0ZXJLZXl3b3JkKCdhY3Rpb24nLCBfZW1i
ZXJSb3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0FjdGlvbi5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkcy5yZWdpc3RlcktleXdvcmQoJ0BlbGVtZW50X2FjdGlvbicsIF9lbWJlclJvdXRp
bmdIdG1sYmFyc0tleXdvcmRzRWxlbWVudEFjdGlvbi5kZWZhdWx0KTsKKyAgX2VtYmVySHRtbGJh
cnNLZXl3b3Jkcy5yZWdpc3RlcktleXdvcmQoJ3JlbmRlcicsIF9lbWJlclJvdXRpbmdIdG1sYmFy
c0tleXdvcmRzUmVuZGVyLmRlZmF1bHQpOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1l
dGFsQ29yZS5kZWZhdWx0OworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5
d29yZHMvYWN0aW9uJywgWydleHBvcnRzJywgJ2h0bWxiYXJzLXJ1bnRpbWUvaG9va3MnLCAnZW1i
ZXItcm91dGluZy1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWFjdGlvbiddLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnNLZXl3
b3Jkc0Nsb3N1cmVBY3Rpb24pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVs
ZSBlbWJlci10ZW1wbGF0ZXMKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
VGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgcHJvdmlkZXMgYSB3YXkgdG8gcGFzcyB0cmlnZ2VycyBm
b3IgYmVoYXZpb3IgKHVzdWFsbHkKKyAgICBqdXN0IGEgZnVuY3Rpb24pIGJldHdlZW4gY29tcG9u
ZW50cywgYW5kIGludG8gY29tcG9uZW50cyBmcm9tIGNvbnRyb2xsZXJzLgorICAKKyAgICAjIyMg
UGFzc2luZyBmdW5jdGlvbnMgd2l0aCB0aGUgYWN0aW9uIGhlbHBlcgorICAKKyAgICBUaGVyZSBh
cmUgdGhyZWUgY29udGV4dHMgYW4gYWN0aW9uIGhlbHBlciBjYW4gYmUgdXNlZCBpbi4gVGhlIGZp
cnN0IHR3bworICAgIGNvbnRleHRzIHRvIGRpc2N1c3MgYXJlIGF0dHJpYnV0ZSBjb250ZXh0LCBh
bmQgSGFuZGxlYmFycyB2YWx1ZSBjb250ZXh0LgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3shIEFuIGV4YW1wbGUgb2YgYXR0cmlidXRlIGNvbnRleHQgfX0KKyAgICA8ZGl2IG9uY2xpY2s9
e3thY3Rpb24gInNhdmUifX0+PC9kaXY+CisgICAge3shIEV4YW1wbGVzIG9mIEhhbmRsZWJhcnMg
dmFsdWUgY29udGV4dCB9fQorICAgIHt7aW5wdXQgb24taW5wdXQ9KGFjdGlvbiAic2F2ZSIpfX0K
KyAgICB7e3lpZWxkIChhY3Rpb24gInJlZnJlc2hEYXRhIikgYW5kQW5vdGhlclBhcmFtfX0KKyAg
ICBgYGAKKyAgCisgICAgSW4gdGhlc2UgY29udGV4dHMsCisgICAgdGhlIGhlbHBlciBpcyBjYWxs
ZWQgYSAiY2xvc3VyZSBhY3Rpb24iIGhlbHBlci4gSXRzIGJlaGF2aW9yIGlzIHNpbXBsZToKKyAg
ICBJZiBwYXNzZWQgYSBmdW5jdGlvbiBuYW1lLCByZWFkIHRoYXQgZnVuY3Rpb24gb2ZmIHRoZSBg
YWN0aW9uc2AgcHJvcGVydHkKKyAgICBvZiB0aGUgY3VycmVudCBjb250ZXh0LiBPbmNlIHRoYXQg
ZnVuY3Rpb24gaXMgcmVhZCAob3IgaWYgYSBmdW5jdGlvbiB3YXMKKyAgICBwYXNzZWQpLCBjcmVh
dGUgYSBjbG9zdXJlIG92ZXIgdGhhdCBmdW5jdGlvbiBhbmQgYW55IGFyZ3VtZW50cy4KKyAgCisg
ICAgVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBhbiBhY3Rpb24gaGVscGVyIHVzZWQgdGhpcyB3YXkg
aXMgc2ltcGx5IGEgZnVuY3Rpb24uCisgICAgRm9yIGV4YW1wbGUsIGluIHRoZSBhdHRyaWJ1dGUg
Y29udGV4dDoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBBbiBleGFtcGxlIG9mIGF0
dHJpYnV0ZSBjb250ZXh0IH19CisgICAgPGRpdiBvbmNsaWNrPXt7YWN0aW9uICJzYXZlIn19Pjwv
ZGl2PgorICAgIGBgYAorICAKKyAgICBUaGUgcmVzdWx0aW5nIHRlbXBsYXRlIHJlbmRlciBsb2dp
YyB3b3VsZCBiZToKKyAgCisgICAgYGBganMKKyAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnZGl2Jyk7CisgICAgdmFyIGFjdGlvbkZ1bmN0aW9uID0gKGZ1bmN0aW9uKGNvbnRl
eHQpeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5h
Y3Rpb25zLnNhdmUuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsKKyAgICAgIH07CisgICAgfSko
Y29udGV4dCk7CisgICAgZGl2Lm9uY2xpY2sgPSBhY3Rpb25GdW5jdGlvbjsKKyAgICBgYGAKKyAg
CisgICAgVGh1cyB3aGVuIHRoZSBkaXYgaXMgY2xpY2tlZCwgdGhlIGFjdGlvbiBvbiB0aGF0IGNv
bnRleHQgaXMgY2FsbGVkLgorICAgIEJlY2F1c2UgdGhlIGBhY3Rpb25GdW5jdGlvbmAgaXMganVz
dCBhIGZ1bmN0aW9uLCBjbG9zdXJlIGFjdGlvbnMgY2FuIGJlCisgICAgcGFzc2VkIGJldHdlZW4g
Y29tcG9uZW50cyBhbmQgc3RpbGwgZXhlY3V0ZSBpbiB0aGUgY29ycmVjdCBjb250ZXh0LgorICAK
KyAgICBIZXJlIGlzIGFuIGV4YW1wbGUgYWN0aW9uIGhhbmRsZXIgb24gYSBjb21wb25lbnQ6Cisg
IAorICAgIGBgYGpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7
CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHNhdmUoKSB7CisgICAgICAgICAgdGhpcy5nZXQo
J21vZGVsJykuc2F2ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgYGBgCisg
IAorICAgIEFjdGlvbnMgYXJlIGFsd2F5cyBsb29rZWQgdXAgb24gdGhlIGBhY3Rpb25zYCBwcm9w
ZXJ0eSBvZiB0aGUgY3VycmVudCBjb250ZXh0LgorICAgIFRoaXMgYXZvaWRzIGNvbGxpc2lvbnMg
aW4gdGhlIG5hbWluZyBvZiBjb21tb24gYWN0aW9ucywgc3VjaCBhcyBgZGVzdHJveWAuCisgIAor
ICAgIFR3byBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGBhY3Rpb25gIGhlbHBlciB3aGVu
IGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkuCisgIAorICAgICogYHRhcmdldD1zb21lUHJvcGVydHlg
IHdpbGwgbG9vayB0byBgc29tZVByb3BlcnR5YCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50CisgICAg
ICBjb250ZXh0IGZvciB0aGUgYGFjdGlvbnNgIGhhc2guIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVu
IHRhcmdldHRpbmcgYQorICAgICAgc2VydmljZSBmb3IgYWN0aW9ucy4KKyAgICAqIGB2YWx1ZT0i
dGFyZ2V0LnZhbHVlImAgd2lsbCByZWFkIHRoZSBwYXRoIGB0YXJnZXQudmFsdWVgIG9mZiB0aGUg
Zmlyc3QKKyAgICAgIGFyZ3VtZW50IHRvIHRoZSBhY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQgYW5k
IHJld3JpdGUgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICB0byBiZSB0aGF0IHZhbHVlLiBUaGlz
IGlzIHVzZWZ1bCB3aGVuIGF0dGFjaGluZyBhY3Rpb25zIHRvIGV2ZW50IGxpc3RlbmVycy4KKyAg
CisgICAgIyMjIEludm9raW5nIGFuIGFjdGlvbgorICAKKyAgICBDbG9zdXJlIGFjdGlvbnMgY3Vy
cnkgYm90aCB0aGVpciBzY29wZSBhbmQgYW55IGFyZ3VtZW50cy4gV2hlbiBpbnZva2VkLCBhbnkK
KyAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgY3Vycmll
ZCBsaXN0LgorICAKKyAgICBBY3Rpb25zIHNob3VsZCBiZSBpbnZva2VkIHVzaW5nIHRoZSBbc2Vu
ZEFjdGlvbl0oL2FwaS9jbGFzc2VzL0VtYmVyLkNvbXBvbmVudC5odG1sI21ldGhvZF9zZW5kQWN0
aW9uKQorICAgIG1ldGhvZC4gVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBzZW5kQWN0aW9uYCBpcyB0
aGUgYWN0aW9uIHRvIGJlIGNhbGxlZCwgYW5kCisgICAgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJl
IHBhc3NlZCB0byB0aGUgYWN0aW9uIGZ1bmN0aW9uLiBUaGlzIGhhcyBpbnRlcmVzdGluZworICAg
IHByb3BlcnRpZXMgY29tYmluZWQgd2l0aCBjdXJyeWluZyBvZiBhcmd1bWVudHMuIEZvciBleGFt
cGxlOgorICAKKyAgICBgYGBqcworICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5l
eHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICAvLyBVc2FnZSB7e2lucHV0IG9uLWlu
cHV0PShhY3Rpb24gKGFjdGlvbiAnc2V0TmFtZScgbW9kZWwpIHZhbHVlPSJ0YXJnZXQudmFsdWUi
KX19CisgICAgICAgIHNldE5hbWUobW9kZWwsIG5hbWUpIHsKKyAgICAgICAgICBtb2RlbC5zZXQo
J25hbWUnLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBUaGUgZmlyc3QgYXJndW1lbnQgKGBtb2RlbGApIHdhcyBjdXJyaWVkIG92ZXIsIGFuZCB0
aGUgcnVuLXRpbWUgYXJndW1lbnQgKGBldmVudGApCisgICAgYmVjb21lcyBhIHNlY29uZCBhcmd1
bWVudC4gQWN0aW9uIGNhbGxzIGNhbiBiZSBuZXN0ZWQgdGhpcyB3YXkgYmVjYXVzZSBlYWNoIHNp
bXBseQorICAgIHJldHVybnMgYSBmdW5jdGlvbi4gQW55IGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQg
dG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGluY2x1ZGluZworICAgIG90aGVyIGFjdGlvbnMu
CisgIAorICAgIEFjdGlvbnMgaW52b2tlZCB3aXRoIGBzZW5kQWN0aW9uYCBoYXZlIHRoZSBzYW1l
IGN1cnJ5aW5nIGJlaGF2aW9yIGFzIGRlbW9uc3RyYXRlZAorICAgIHdpdGggYG9uLWlucHV0YCBh
Ym92ZS4gRm9yIGV4YW1wbGU6CisgIAorICAgIGBgYGpzCisgICAgZXhwb3J0IGRlZmF1bHQgRW1i
ZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICBhY3Rpb25zOiB7CisgICAgICAgIHNldE5hbWUo
bW9kZWwsIG5hbWUpIHsKKyAgICAgICAgICBtb2RlbC5zZXQoJ25hbWUnLCBuYW1lKTsKKyAgICAg
ICAgfQorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBgYGBoYW5kbGViYXJzCisg
ICAge3tteS1pbnB1dCBzdWJtaXQ9KGFjdGlvbiAnc2V0TmFtZScgbW9kZWwpfX0KKyAgICBgYGAK
KyAgCisgICAgYGBganMKKyAgICAvLyBhcHAvY29tcG9uZW50cy9teS1jb21wb25lbnQuanMKKyAg
ICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKKyAgICAgIGNsaWNrKCkg
eworICAgICAgICAvLyBOb3RlIHRoYXQgbW9kZWwgaXMgbm90IHBhc3NlZCwgaXQgd2FzIGN1cnJp
ZWQgaW4gdGhlIHRlbXBsYXRlCisgICAgICAgIHRoaXMuc2VuZEFjdGlvbignc3VibWl0JywgJ2Jv
YicpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICAjIyMgQXR0YWNoaW5nIGFj
dGlvbnMgdG8gRE9NIGVsZW1lbnRzCisgIAorICAgIFRoZSB0aGlyZCBjb250ZXh0IG9mIHRoZSBg
e3thY3Rpb259fWAgaGVscGVyIGNhbiBiZSBjYWxsZWQgImVsZW1lbnQgc3BhY2UiLgorICAgIEZv
ciBleGFtcGxlOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3shIEFuIGV4YW1wbGUgb2Yg
ZWxlbWVudCBzcGFjZSB9fQorICAgIDxkaXYge3thY3Rpb24gInNhdmUifX0+PC9kaXY+CisgICAg
YGBgCisgIAorICAgIFVzZWQgdGhpcyB3YXksIHRoZSBge3thY3Rpb259fWAgaGVscGVyIHByb3Zp
ZGVzIGEgdXNlZnVsIHNob3J0Y3V0IGZvcgorICAgIHJlZ2lzdGVyaW5nIGFuIEhUTUwgZWxlbWVu
dCBpbiBhIHRlbXBsYXRlIGZvciBhIHNpbmdsZSBET00gZXZlbnQgYW5kCisgICAgZm9yd2FyZGlu
ZyB0aGF0IGludGVyYWN0aW9uIHRvIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQgKGNvbnRyb2xsZXIg
b3IgY29tcG9uZW50KS4KKyAgCisgICAgSWYgdGhlIGNvbnRleHQgb2YgYSB0ZW1wbGF0ZSBpcyBh
IGNvbnRyb2xsZXIsIGFjdGlvbnMgdXNlZCB0aGlzIHdheSB3aWxsCisgICAgYnViYmxlIHRvIHJv
dXRlcyB3aGVuIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IGltcGxlbWVudCB0aGUgc3BlY2lmaWVk
IGFjdGlvbi4KKyAgICBPbmNlIGFuIGFjdGlvbiBoaXRzIGEgcm91dGUsIGl0IHdpbGwgYnViYmxl
IHRocm91Z2ggdGhlIHJvdXRlIGhpZXJhcmNoeS4KKyAgCisgICAgIyMjIEV2ZW50IFByb3BhZ2F0
aW9uCisgIAorICAgIGB7e2FjdGlvbn19YCBoZWxwZXJzIGNhbGxlZCBpbiBlbGVtZW50IHNwYWNl
IGNhbiBjb250cm9sIGV2ZW50IGJ1YmJsaW5nLiBOb3RlCisgICAgdGhhdCB0aGUgY2xvc3VyZSBz
dHlsZSBhY3Rpb25zIGNhbm5vdC4KKyAgCisgICAgRXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIHRo
ZSBhY3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCisgICAgYC5wcmV2ZW50RGVm
YXVsdCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGRvIHNvIGluIHlvdXIg
ZXZlbnQKKyAgICBoYW5kbGVycy4gSWYgeW91IG5lZWQgdG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRp
b24gKHRvIGhhbmRsZSBmaWxlIGlucHV0cyBmb3IKKyAgICBleGFtcGxlKSB5b3UgY2FuIHN1cHBs
eSB0aGUgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBvcHRpb24gdG8gdGhlIGB7e2FjdGlvbn19YCBo
ZWxwZXI6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IHt7YWN0aW9uICJzYXlIZWxs
byIgcHJldmVudERlZmF1bHQ9ZmFsc2V9fT4KKyAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiAvPgor
ICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPgorICAgIDwvZGl2PgorICAgIGBgYAorICAK
KyAgICBUbyBkaXNhYmxlIGJ1YmJsaW5nLCBwYXNzIGBidWJibGVzPWZhbHNlYCB0byB0aGUgaGVs
cGVyOgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGJ1dHRvbiB7e2FjdGlvbiAnZWRpdCcg
cG9zdCBidWJibGVzPWZhbHNlfX0+RWRpdDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBUbyBk
aXNhYmxlIGJ1YmJsaW5nIHdpdGggY2xvc3VyZSBzdHlsZSBhY3Rpb25zIHlvdSBtdXN0IGNyZWF0
ZSB5b3VyIG93bgorICAgIHdyYXBwZXIgaGVscGVyIHRoYXQgbWFrZXMgdXNlIG9mIGBldmVudC5z
dG9wUHJvcGFnYXRpb24oKWA6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IG9uY2xp
Y2s9e3tkaXNhYmxlLWJ1YmJsaW5nIChhY3Rpb24gInNheUhlbGxvIil9fT5IZWxsbzwvZGl2Pgor
ICAgIGBgYAorICAKKyAgICBgYGBqcworICAgIC8vIGFwcC9oZWxwZXJzL2Rpc2FibGUtYnViYmxp
bmcuanMKKyAgICBpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworICAKKyAgICBleHBvcnQgZnVu
Y3Rpb24gZGlzYWJsZUJ1YmJsaW5nKFthY3Rpb25dKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24o
ZXZlbnQpIHsKKyAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgIAorICAgICAgICBy
ZXR1cm4gYWN0aW9uKGV2ZW50KTsKKyAgICAgIH07CisgICAgfQorICAKKyAgICBleHBvcnQgZGVm
YXVsdCBFbWJlci5IZWxwZXIuaGVscGVyKGRpc2FibGVCdWJibGluZyk7CisgICAgYGBgCisgIAor
ICAgIElmIHlvdSBuZWVkIHRoZSBkZWZhdWx0IGhhbmRsZXIgdG8gdHJpZ2dlciB5b3Ugc2hvdWxk
IGVpdGhlciByZWdpc3RlciB5b3VyCisgICAgb3duIGV2ZW50IGhhbmRsZXIsIG9yIHVzZSBldmVu
dCBtZXRob2RzIG9uIHlvdXIgdmlldyBjbGFzcy4gU2VlCisgICAgWyJSZXNwb25kaW5nIHRvIEJy
b3dzZXIgRXZlbnRzIl0oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCN0b2NfcmVzcG9uZGlu
Zy10by1icm93c2VyLWV2ZW50cykKKyAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgRW1iZXIu
VmlldyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgCisgICAgIyMjIFNwZWNpZnlpbmcgRE9NIGV2
ZW50IHR5cGUKKyAgCisgICAgYHt7YWN0aW9ufX1gIGhlbHBlcnMgY2FsbGVkIGluIGVsZW1lbnQg
c3BhY2UgY2FuIHNwZWNpZnkgYW4gZXZlbnQgdHlwZS4KKyAgCisgICAgQnkgZGVmYXVsdCB0aGUg
YHt7YWN0aW9ufX1gIGhlbHBlciByZWdpc3RlcnMgZm9yIERPTSBgY2xpY2tgIGV2ZW50cy4gWW91
IGNhbgorICAgIHN1cHBseSBhbiBgb25gIG9wdGlvbiB0byB0aGUgaGVscGVyIHRvIHNwZWNpZnkg
YSBkaWZmZXJlbnQgRE9NIGV2ZW50IG5hbWU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8
ZGl2IHt7YWN0aW9uICJhbkFjdGlvbk5hbWUiIG9uPSJkb3VibGVDbGljayJ9fT4KKyAgICAgIGNs
aWNrIG1lCisgICAgPC9kaXY+CisgICAgYGBgCisgIAorICAgIFNlZSBbIkV2ZW50IE5hbWVzIl0o
L2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCN0b2NfZXZlbnQtbmFtZXMpIGZvciBhIGxpc3Qg
b2YKKyAgICBhY2NlcHRhYmxlIERPTSBldmVudCBuYW1lcy4KKyAgCisgICAgIyMjIFNwZWNpZnlp
bmcgd2hpdGVsaXN0ZWQgbW9kaWZpZXIga2V5cworICAKKyAgICBge3thY3Rpb259fWAgaGVscGVy
cyBjYWxsZWQgaW4gZWxlbWVudCBzcGFjZSBjYW4gc3BlY2lmeSBtb2RpZmllciBrZXlzLgorICAK
KyAgICBCeSBkZWZhdWx0IHRoZSBge3thY3Rpb259fWAgaGVscGVyIHdpbGwgaWdub3JlIGNsaWNr
IGV2ZW50cyB3aXRoIHByZXNzZWQgbW9kaWZpZXIKKyAgICBrZXlzLiBZb3UgY2FuIHN1cHBseSBh
biBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGtleXMgc2hvdWxkIG5vdCBi
ZSBpZ25vcmVkLgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAgPGRpdiB7e2FjdGlvbiAiYW5B
Y3Rpb25OYW1lIiBhbGxvd2VkS2V5cz0iYWx0In19PgorICAgICAgY2xpY2sgbWUKKyAgICA8L2Rp
dj4KKyAgICBgYGAKKyAgCisgICAgVGhpcyB3YXkgdGhlIGFjdGlvbiB3aWxsIGZpcmUgd2hlbiBj
bGlja2luZyB3aXRoIHRoZSBhbHQga2V5IHByZXNzZWQgZG93bi4KKyAgCisgICAgQWx0ZXJuYXRp
dmVseSwgc3VwcGx5ICJhbnkiIHRvIHRoZSBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBhY2NlcHQg
YW55IGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVyIGtleXMuCisgIAorICAgIGBgYGhhbmRsZWJhcnMK
KyAgICA8ZGl2IHt7YWN0aW9uICJhbkFjdGlvbk5hbWUiIGFsbG93ZWRLZXlzPSJhbnkifX0+Cisg
ICAgICBjbGljayBtZSB3aXRoIGFueSBrZXkgcHJlc3NlZAorICAgIDwvZGl2PgorICAgIGBgYAor
ICAKKyAgICAjIyMgU3BlY2lmeWluZyBhIFRhcmdldAorICAKKyAgICBBIGB0YXJnZXRgIG9wdGlv
biBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIGhlbHBlciB0byBjaGFuZ2UKKyAgICB3aGljaCBvYmpl
Y3Qgd2lsbCByZWNlaXZlIHRoZSBtZXRob2QgY2FsbC4gVGhpcyBvcHRpb24gbXVzdCBiZSBhIHBh
dGgKKyAgICB0byBhbiBvYmplY3QsIGFjY2Vzc2libGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dDoK
KyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7ISBhcHAvdGVtcGxhdGVzL2FwcGxpY2F0aW9u
LmhicyB9fQorICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgdGFyZ2V0PXNvbWVTZXJ2
aWNlfX0+CisgICAgICBjbGljayBtZQorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgLy8gYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpzCisgICAgZXhw
b3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgc29tZVNlcnZpY2U6
IEVtYmVyLmluamVjdC5zZXJ2aWNlKCkKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhv
ZCBhY3Rpb24KKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHB1YmxpYwor
ICAqLworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBzY29wZSwg
cGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgeworICAgIGlmIChtb3Jw
aCkgeworICAgICAgX2h0bWxiYXJzUnVudGltZUhvb2tzLmtleXdvcmQoJ0BlbGVtZW50X2FjdGlv
bicsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2
aXNpdG9yKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBfZW1iZXJS
b3V0aW5nSHRtbGJhcnNLZXl3b3Jkc0Nsb3N1cmVBY3Rpb24uZGVmYXVsdChtb3JwaCwgZW52LCBz
Y29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgIH07Cit9
KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy1odG1sYmFycy9rZXl3b3Jkcy9jbG9zdXJlLWFjdGlv
bicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9zdHJlYW1zL3N0cmVhbScsICdlbWJlci1tZXRh
bC9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCcsICdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9nZXQnLCAnZW1iZXItaHRtbGJhcnMvaG9va3Mvc3ViZXhwcicsICdlbWJlci1tZXRhbC9l
cnJvcicsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcsICdlbWJlci1tZXRhbC9pbnN0cnVtZW50YXRp
b24nLCAnZW1iZXItbWV0YWwvaXNfbm9uZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscywgX2VtYmVyTWV0YWxTeW1i
b2wsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJIdG1sYmFyc0hvb2tzU3ViZXhwciwg
X2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxJbnN0cnVt
ZW50YXRpb24sIF9lbWJlck1ldGFsSXNfbm9uZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gY2xvc3VyZUFjdGlvbjsKKyAgdmFyIElOVk9LRSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0lOVk9LRScpOworICBleHBvcnRzLklOVk9LRSA9IElOVk9LRTsKKyAg
dmFyIEFDVElPTiA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0FDVElPTicpOworCisgIGV4
cG9ydHMuQUNUSU9OID0gQUNUSU9OOworCisgIGZ1bmN0aW9uIGNsb3N1cmVBY3Rpb24obW9ycGgs
IGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsK
KyAgICB2YXIgcyA9IG5ldyBfZW1iZXJNZXRhbFN0cmVhbXNTdHJlYW0uU3RyZWFtKGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciByYXdBY3Rpb24gPSBwYXJhbXNbMF07CisgICAgICB2YXIgYWN0aW9u
QXJndW1lbnRzID0gX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZEFycmF5KHBhcmFtcy5zbGlj
ZSgxLCBwYXJhbXMubGVuZ3RoKSk7CisKKyAgICAgIHZhciB0YXJnZXQgPSB1bmRlZmluZWQsCisg
ICAgICAgICAgYWN0aW9uID0gdW5kZWZpbmVkLAorICAgICAgICAgIHZhbHVlUGF0aCA9IHVuZGVm
aW5lZDsKKworICAgICAgaWYgKF9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KHJhd0FjdGlvbikp
IHsKKyAgICAgICAgdmFyIGxhYmVsID0gX2VtYmVySHRtbGJhcnNIb29rc1N1YmV4cHIubGFiZWxG
b3JTdWJleHByKHBhcmFtcywgaGFzaCwgJ2FjdGlvbicpOworICAgICAgICB0aHJvdyBuZXcgX2Vt
YmVyTWV0YWxFcnJvci5kZWZhdWx0KCdBY3Rpb24gcGFzc2VkIGlzIG51bGwgb3IgdW5kZWZpbmVk
IGluICcgKyBsYWJlbCArICcgZnJvbSAnICsgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChz
Y29wZS5nZXRTZWxmKCkpICsgJy4nKTsKKyAgICAgIH0gZWxzZSBpZiAocmF3QWN0aW9uW0lOVk9L
RV0pIHsKKyAgICAgICAgLy8gb24tY2hhbmdlPXt7YWN0aW9uIChtdXQgbmFtZSl9fQorICAgICAg
ICB0YXJnZXQgPSByYXdBY3Rpb247CisgICAgICAgIGFjdGlvbiA9IHJhd0FjdGlvbltJTlZPS0Vd
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb24tY2hhbmdlPXt7YWN0aW9uIHNldE5hbWV9
fQorICAgICAgICAvLyBlbGVtZW50LXNwYWNlIGFjdGlvbnMgbG9vayB0byAiY29udHJvbGxlciIg
dGhlbiB0YXJnZXQuIEhlcmUgd2Ugb25seQorICAgICAgICAvLyBsb29rIHRvICJ0YXJnZXQiLgor
ICAgICAgICB0YXJnZXQgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHNjb3BlLmdldFNl
bGYoKSk7CisgICAgICAgIGFjdGlvbiA9IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQocmF3
QWN0aW9uKTsKKyAgICAgICAgdmFyIGFjdGlvblR5cGUgPSB0eXBlb2YgYWN0aW9uOworCisgICAg
ICAgIGlmIChhY3Rpb25UeXBlID09PSAnc3RyaW5nJykgeworICAgICAgICAgIHZhciBhY3Rpb25O
YW1lID0gYWN0aW9uOworICAgICAgICAgIGFjdGlvbiA9IG51bGw7CisgICAgICAgICAgLy8gb24t
Y2hhbmdlPXt7YWN0aW9uICdzZXROYW1lJ319CisgICAgICAgICAgaWYgKGhhc2gudGFyZ2V0KSB7
CisgICAgICAgICAgICAvLyBvbi1jaGFuZ2U9e3thY3Rpb24gJ3NldE5hbWUnIHRhcmdldD1hbHRl
cm5hdGl2ZUNvbXBvbmVudH19CisgICAgICAgICAgICB0YXJnZXQgPSBfZW1iZXJNZXRhbFN0cmVh
bXNVdGlscy5yZWFkKGhhc2gudGFyZ2V0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRh
cmdldC5hY3Rpb25zKSB7CisgICAgICAgICAgICBhY3Rpb24gPSB0YXJnZXQuYWN0aW9uc1thY3Rp
b25OYW1lXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFjdGlvbikgeworICAgICAg
ICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnQW4gYWN0aW9uIG5hbWVk
IFwnJyArIGFjdGlvbk5hbWUgKyAnXCcgd2FzIG5vdCBmb3VuZCBpbiAnICsgdGFyZ2V0ICsgJy4n
KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uICYmIHR5cGVvZiBhY3Rp
b25bSU5WT0tFXSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHRhcmdldCA9IGFjdGlvbjsK
KyAgICAgICAgICBhY3Rpb24gPSBhY3Rpb25bSU5WT0tFXTsKKyAgICAgICAgfSBlbHNlIGlmIChh
Y3Rpb25UeXBlICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1l
dGFsRXJyb3IuZGVmYXVsdCgnQW4gYWN0aW9uIGNvdWxkIG5vdCBiZSBtYWRlIGZvciBgJyArIHJh
d0FjdGlvbi5sYWJlbCArICdgIGluICcgKyB0YXJnZXQgKyAnLiBQbGVhc2UgY29uZmlybSB0aGF0
IHlvdSBhcmUgdXNpbmcgZWl0aGVyIGEgcXVvdGVkIGFjdGlvbiBuYW1lIChpLmUuIGAoYWN0aW9u
IFwnJyArIHJhd0FjdGlvbi5sYWJlbCArICdcJylgKSBvciBhIGZ1bmN0aW9uIGF2YWlsYWJsZSBp
biAnICsgdGFyZ2V0ICsgJy4nKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaGFz
aC52YWx1ZSkgeworICAgICAgICAvLyA8YnV0dG9uIG9uLWtleXByZXNzPXt7YWN0aW9uIChtdXQg
bmFtZSkgdmFsdWU9IndoaWNoIn19CisgICAgICAgIC8vIG9uLWtleXByZXNzIGlzIG5vdCBldmVu
IGFuIEVtYmVyIGZlYXR1cmUgeWV0CisgICAgICAgIHZhbHVlUGF0aCA9IF9lbWJlck1ldGFsU3Ry
ZWFtc1V0aWxzLnJlYWQoaGFzaC52YWx1ZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBjcmVh
dGVDbG9zdXJlQWN0aW9uKHRoaXMsIHRhcmdldCwgYWN0aW9uLCB2YWx1ZVBhdGgsIGFjdGlvbkFy
Z3VtZW50cyk7CisgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlckh0bWxi
YXJzSG9va3NTdWJleHByLmxhYmVsRm9yU3ViZXhwcihwYXJhbXMsIGhhc2gsICdhY3Rpb24nKTsK
KyAgICB9KTsKKworICAgIHBhcmFtcy5mb3JFYWNoKHMuYWRkRGVwZW5kZW5jeSwgcyk7CisgICAg
T2JqZWN0LmtleXMoaGFzaCkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgcmV0dXJu
IHMuYWRkRGVwZW5kZW5jeShpdGVtKTsKKyAgICB9KTsKKworICAgIHJldHVybiBzOworICB9CisK
KyAgZnVuY3Rpb24gY3JlYXRlQ2xvc3VyZUFjdGlvbihzdHJlYW0sIHRhcmdldCwgYWN0aW9uLCB2
YWx1ZVBhdGgsIGFjdGlvbkFyZ3VtZW50cykgeworICAgIHZhciBjbG9zdXJlQWN0aW9uOworCisg
ICAgaWYgKGFjdGlvbkFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisgICAgICBjbG9zdXJlQWN0aW9u
ID0gZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgYXJncyA9IGFjdGlvbkFyZ3VtZW50czsKKwor
ICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGFzc2VkQXJndW1lbnRz
ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAg
ICAgcGFzc2VkQXJndW1lbnRzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKHBhc3NlZEFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgYXJn
cyA9IGFjdGlvbkFyZ3VtZW50cy5jb25jYXQocGFzc2VkQXJndW1lbnRzKTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAodmFsdWVQYXRoICYmIGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgIGFy
Z3NbMF0gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJnc1swXSwgdmFsdWVQYXRoKTsK
KyAgICAgICAgfQorCisgICAgICAgIHZhciBwYXlsb2FkID0geyB0YXJnZXQ6IHRhcmdldCwgYXJn
czogYXJncywgbGFiZWw6IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLmxhYmVsRm9yKHN0cmVhbSkg
fTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsSW5zdHJ1bWVudGF0aW9uLmZsYWdnZWRJbnN0
cnVtZW50KCdpbnRlcmFjdGlvbi5lbWJlci1hY3Rpb24nLCBwYXlsb2FkLCBmdW5jdGlvbiAoKSB7
CisgICAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5qb2luLmFwcGx5
KF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdCwgW3RhcmdldCwgYWN0aW9uXS5jb25jYXQoYXJn
cykpOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb3N1cmVB
Y3Rpb24gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRz
Lmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBf
a2V5MisrKSB7CisgICAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlUGF0aCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAg
ICAgICAgICBhcmdzWzBdID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGFyZ3NbMF0sIHZh
bHVlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGF5bG9hZCA9IHsgdGFyZ2V0OiB0
YXJnZXQsIGFyZ3M6IGFyZ3MsIGxhYmVsOiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5sYWJlbEZv
cihzdHJlYW0pIH07CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbEluc3RydW1lbnRhdGlvbi5m
bGFnZ2VkSW5zdHJ1bWVudCgnaW50ZXJhY3Rpb24uZW1iZXItYWN0aW9uJywgcGF5bG9hZCwgZnVu
Y3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQu
am9pbi5hcHBseShfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQsIFt0YXJnZXQsIGFjdGlvbl0u
Y29uY2F0KGFyZ3MpKTsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0KKworICAgIGNsb3N1
cmVBY3Rpb25bQUNUSU9OXSA9IHRydWU7CisKKyAgICByZXR1cm4gY2xvc3VyZUFjdGlvbjsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctaHRtbGJhcnMva2V5d29yZHMvZWxlbWVudC1h
Y3Rpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvdXRp
bHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcs
ICdlbWJlci12aWV3cy9zdHJlYW1zL3V0aWxzJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS91dGlscycs
ICdlbWJlci12aWV3cy9zeXN0ZW0vYWN0aW9uX21hbmFnZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsU3RyZWFtc1V0
aWxzLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJWaWV3c1N0cmVhbXNVdGlscywgX2VtYmVy
Vmlld3NTeXN0ZW1VdGlscywgX2VtYmVyVmlld3NTeXN0ZW1BY3Rpb25fbWFuYWdlcikgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0geworICAgIHNldHVwU3RhdGU6IGZ1
bmN0aW9uIChzdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgZ2V0
U3RyZWFtID0gZW52Lmhvb2tzLmdldDsKKyAgICAgIHZhciByZWFkID0gZW52Lmhvb2tzLmdldFZh
bHVlOworCisgICAgICB2YXIgYWN0aW9uTmFtZSA9IHJlYWQocGFyYW1zWzBdKTsKKworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBzcGVjaWZpZWQgYSBxdW90ZWxlc3MgcGF0aCB0
byB0aGUge3thY3Rpb259fSBoZWxwZXIgJyArICd3aGljaCBkaWQgbm90IHJlc29sdmUgdG8gYW4g
YWN0aW9uIG5hbWUgKGEgc3RyaW5nKS4gJyArICdQZXJoYXBzIHlvdSBtZWFudCB0byB1c2UgYSBx
dW90ZWQgYWN0aW9uTmFtZT8gKGUuZy4ge3thY3Rpb24gXCdzYXZlXCd9fSkuJywgdHlwZW9mIGFj
dGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAnZnVuY3Rpb24n
KTsKKworICAgICAgdmFyIGFjdGlvbkFyZ3MgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAxLCBs
ID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBhY3Rpb25BcmdzLnB1c2go
X2VtYmVyVmlld3NTdHJlYW1zVXRpbHMucmVhZFVud3JhcHBlZE1vZGVsKHBhcmFtc1tpXSkpOwor
ICAgICAgfQorCisgICAgICB2YXIgdGFyZ2V0OworICAgICAgaWYgKGhhc2gudGFyZ2V0KSB7Cisg
ICAgICAgIGlmICh0eXBlb2YgaGFzaC50YXJnZXQgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAg
dGFyZ2V0ID0gcmVhZChnZXRTdHJlYW0oZW52LCBzY29wZSwgaGFzaC50YXJnZXQpKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICB0YXJnZXQgPSByZWFkKGhhc2gudGFyZ2V0KTsKKyAgICAg
ICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0ID0gcmVhZChzY29wZS5nZXRMb2Nh
bCgnY29udHJvbGxlcicpKSB8fCByZWFkKHNjb3BlLmdldFNlbGYoKSk7CisgICAgICB9CisKKyAg
ICAgIHJldHVybiB7IGFjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGFjdGlvbkFyZ3M6IGFjdGlvbkFy
Z3MsIHRhcmdldDogdGFyZ2V0IH07CisgICAgfSwKKworICAgIGlzU3RhYmxlOiBmdW5jdGlvbiAo
c3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkgeworICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfSwKKworICAgIHJlbmRlcjogZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywg
aGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBhY3Rpb25JZCA9
IGVudi5kb20uZ2V0QXR0cmlidXRlKG5vZGUuZWxlbWVudCwgJ2RhdGEtZW1iZXItYWN0aW9uJykg
fHwgX2VtYmVyTWV0YWxVdGlscy51dWlkKCk7CisKKyAgICAgIEFjdGlvbkhlbHBlci5yZWdpc3Rl
ckFjdGlvbih7CisgICAgICAgIGFjdGlvbklkOiBhY3Rpb25JZCwKKyAgICAgICAgbm9kZTogbm9k
ZSwKKyAgICAgICAgZXZlbnROYW1lOiBoYXNoLm9uIHx8ICdjbGljaycsCisgICAgICAgIGJ1YmJs
ZXM6IGhhc2guYnViYmxlcywKKyAgICAgICAgcHJldmVudERlZmF1bHQ6IGhhc2gucHJldmVudERl
ZmF1bHQsCisgICAgICAgIHdpdGhLZXlDb2RlOiBoYXNoLndpdGhLZXlDb2RlLAorICAgICAgICBh
bGxvd2VkS2V5czogaGFzaC5hbGxvd2VkS2V5cworICAgICAgfSk7CisKKyAgICAgIG5vZGUuY2xl
YW51cCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgQWN0aW9uSGVscGVyLnVucmVnaXN0ZXJBY3Rp
b24oYWN0aW9uSWQpOworICAgICAgfTsKKworICAgICAgZW52LmRvbS5zZXRBdHRyaWJ1dGUobm9k
ZS5lbGVtZW50LCAnZGF0YS1lbWJlci1hY3Rpb24nLCBhY3Rpb25JZCk7CisgICAgfQorICB9Owor
ICB2YXIgQWN0aW9uSGVscGVyID0ge307CisKKyAgZXhwb3J0cy5BY3Rpb25IZWxwZXIgPSBBY3Rp
b25IZWxwZXI7CisgIC8vIHJlZ2lzdGVyZWRBY3Rpb25zIGlzIHJlLWV4cG9ydGVkIGZvciBjb21w
YXRpYmlsaXR5IHdpdGggb2xkZXIgcGx1Z2lucworICAvLyB0aGF0IHdlcmUgdXNpbmcgdGhpcyB1
bmRvY3VtZW50ZWQgQVBJLgorICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnMgPSBfZW1i
ZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLmRlZmF1bHQucmVnaXN0ZXJlZEFjdGlvbnM7CisK
KyAgQWN0aW9uSGVscGVyLnJlZ2lzdGVyQWN0aW9uID0gZnVuY3Rpb24gKF9yZWYpIHsKKyAgICB2
YXIgYWN0aW9uSWQgPSBfcmVmLmFjdGlvbklkOworICAgIHZhciBub2RlID0gX3JlZi5ub2RlOwor
ICAgIHZhciBldmVudE5hbWUgPSBfcmVmLmV2ZW50TmFtZTsKKyAgICB2YXIgcHJldmVudERlZmF1
bHQgPSBfcmVmLnByZXZlbnREZWZhdWx0OworICAgIHZhciBidWJibGVzID0gX3JlZi5idWJibGVz
OworICAgIHZhciBhbGxvd2VkS2V5cyA9IF9yZWYuYWxsb3dlZEtleXM7CisKKyAgICB2YXIgYWN0
aW9ucyA9IF9lbWJlclZpZXdzU3lzdGVtQWN0aW9uX21hbmFnZXIuZGVmYXVsdC5yZWdpc3RlcmVk
QWN0aW9uc1thY3Rpb25JZF07CisKKyAgICBpZiAoIWFjdGlvbnMpIHsKKyAgICAgIGFjdGlvbnMg
PSBfZW1iZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLmRlZmF1bHQucmVnaXN0ZXJlZEFjdGlv
bnNbYWN0aW9uSWRdID0gW107CisgICAgfQorCisgICAgYWN0aW9ucy5wdXNoKHsKKyAgICAgIGV2
ZW50TmFtZTogZXZlbnROYW1lLAorICAgICAgaGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50KSB7Cisg
ICAgICAgIGlmICghaXNBbGxvd2VkRXZlbnQoZXZlbnQsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LnJlYWQoYWxsb3dlZEtleXMpKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQocHJldmVudERlZmF1
bHQpICE9PSBmYWxzZSkgeworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMucmVhZChidWJibGVz
KSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAg
ICAgfQorCisgICAgICAgIHZhciBfbm9kZSRnZXRTdGF0ZSA9IG5vZGUuZ2V0U3RhdGUoKTsKKwor
ICAgICAgICB2YXIgdGFyZ2V0ID0gX25vZGUkZ2V0U3RhdGUudGFyZ2V0OworICAgICAgICB2YXIg
YWN0aW9uTmFtZSA9IF9ub2RlJGdldFN0YXRlLmFjdGlvbk5hbWU7CisgICAgICAgIHZhciBhY3Rp
b25BcmdzID0gX25vZGUkZ2V0U3RhdGUuYWN0aW9uQXJnczsKKworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQoZnVuY3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigpIHsKKyAgICAg
ICAgICBpZiAodHlwZW9mIGFjdGlvbk5hbWUgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAg
IGFjdGlvbk5hbWUuYXBwbHkodGFyZ2V0LCBhY3Rpb25BcmdzKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhcmdldC5zZW5kKSB7CisgICAgICAgICAg
ICB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIFthY3Rpb25OYW1lXS5jb25jYXQoYWN0aW9uQXJn
cykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnVGhlIGFjdGlvbiBcJycgKyBhY3Rpb25OYW1lICsgJ1wnIGRpZCBub3QgZXhpc3Qgb24g
JyArIHRhcmdldCwgdHlwZW9mIHRhcmdldFthY3Rpb25OYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7CisK
KyAgICAgICAgICAgIHRhcmdldFthY3Rpb25OYW1lXS5hcHBseSh0YXJnZXQsIGFjdGlvbkFyZ3Mp
OworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1
cm4gYWN0aW9uSWQ7CisgIH07CisKKyAgQWN0aW9uSGVscGVyLnVucmVnaXN0ZXJBY3Rpb24gPSBm
dW5jdGlvbiAoYWN0aW9uSWQpIHsKKyAgICBkZWxldGUgX2VtYmVyVmlld3NTeXN0ZW1BY3Rpb25f
bWFuYWdlci5kZWZhdWx0LnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklkXTsKKyAgfTsKKworICB2
YXIgTU9ESUZJRVJTID0gWydhbHQnLCAnc2hpZnQnLCAnbWV0YScsICdjdHJsJ107CisgIHZhciBQ
T0lOVEVSX0VWRU5UX1RZUEVfUkVHRVggPSAvXmNsaWNrfG1vdXNlfHRvdWNoLzsKKworICBmdW5j
dGlvbiBpc0FsbG93ZWRFdmVudChldmVudCwgYWxsb3dlZEtleXMpIHsKKyAgICBpZiAodHlwZW9m
IGFsbG93ZWRLZXlzID09PSAndW5kZWZpbmVkJykgeworICAgICAgaWYgKFBPSU5URVJfRVZFTlRf
VFlQRV9SRUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJWaWV3
c1N5c3RlbVV0aWxzLmlzU2ltcGxlQ2xpY2soZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgYWxsb3dlZEtleXMgPSAnJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWxsb3dlZEtl
eXMuaW5kZXhPZignYW55JykgPj0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgZm9yICh2YXIgaSA9IDAsIGwgPSBNT0RJRklFUlMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Cisg
ICAgICBpZiAoZXZlbnRbTU9ESUZJRVJTW2ldICsgJ0tleSddICYmIGFsbG93ZWRLZXlzLmluZGV4
T2YoTU9ESUZJRVJTW2ldKSA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91
dGluZy1odG1sYmFycy9rZXl3b3Jkcy9yZW5kZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
ZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2VtcHR5X29i
amVjdCcsICdlbWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9zdHJlYW1zL3V0aWxzJywg
J2VtYmVyLXJ1bnRpbWUvc3lzdGVtL3N0cmluZycsICdlbWJlci1yb3V0aW5nL3N5c3RlbS9nZW5l
cmF0ZV9jb250cm9sbGVyJywgJ2VtYmVyLWh0bWxiYXJzL25vZGUtbWFuYWdlcnMvdmlldy1ub2Rl
LW1hbmFnZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbEVtcHR5X29iamVjdCwgX2VtYmVyTWV0YWxFcnJv
ciwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcsIF9l
bWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVyLCBfZW1iZXJIdG1sYmFyc05vZGVN
YW5hZ2Vyc1ZpZXdOb2RlTWFuYWdlcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBDYWxsaW5nIGBge3tyZW5kZXJ9fWBgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgd2lsbCBp
bnNlcnQgYW5vdGhlcgorICAgIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgbmFt
ZS4gVGhlIGluc2VydGVkIHRlbXBsYXRlIHdpbGwKKyAgICBhY2Nlc3MgaXRzIHByb3BlcnRpZXMg
b24gaXRzIG93biBjb250cm9sbGVyIChyYXRoZXIgdGhhbiB0aGUgY29udHJvbGxlcgorICAgIG9m
IHRoZSBwYXJlbnQgdGVtcGxhdGUpLgorICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1l
IG5hbWUgZXhpc3RzLCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4KKyAgICBOb3Rl
OiBBIGdpdmVuIGNvbnRyb2xsZXIgbWF5IG9ubHkgYmUgdXNlZCAqb25jZSogaW4geW91ciBhcHAg
aW4gdGhpcyBtYW5uZXIuCisgICAgQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyb2xs
ZXIgd2lsbCBiZSBjcmVhdGVkIGZvciB5b3UuCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIEFwcC5OYXZpZ2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKKyAgICAgIHdobzogIndvcmxkIgorICAgIH0pOworICAgIGBgYAorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAgPCEtLSBuYXZpZ2F0aW9uLmhicyAtLT4KKyAgICBIZWxsbywge3t3
aG99fS4KKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIDwhLS0gYXBwbGljYXRp
b24uaGJzIC0tPgorICAgIDxoMT5NeSBncmVhdCBhcHA8L2gxPgorICAgIHt7cmVuZGVyICJuYXZp
Z2F0aW9uIn19CisgICAgYGBgCisgIAorICAgIGBgYGh0bWwKKyAgICA8aDE+TXkgZ3JlYXQgYXBw
PC9oMT4KKyAgICA8ZGl2IGNsYXNzPSdlbWJlci12aWV3Jz4KKyAgICAgIEhlbGxvLCB3b3JsZC4K
KyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgT3B0aW9uYWxseSB5b3UgbWF5IHByb3ZpZGUg
YSBzZWNvbmQgYXJndW1lbnQ6IGEgcHJvcGVydHkgcGF0aAorICAgIHRoYXQgd2lsbCBiZSBib3Vu
ZCB0byB0aGUgYG1vZGVsYCBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbGxlci4KKyAgICBJZiBhIGBt
b2RlbGAgcHJvcGVydHkgcGF0aCBpcyBzcGVjaWZpZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2Ugb2Yg
dGhlCisgICAgY29udHJvbGxlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7e3JlbmRlcn19YCBjYW4g
YmUgdXNlZCBtdWx0aXBsZSB0aW1lcworICAgIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgCisgICAg
Rm9yIGV4YW1wbGUgaWYgeW91IGhhZCB0aGlzIGBhdXRob3JgIHRlbXBsYXRlLgorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAgPGRpdiBjbGFzcz0iYXV0aG9yIj4KKyAgICAgIFdyaXR0ZW4gYnkg
e3tmaXJzdE5hbWV9fSB7e2xhc3ROYW1lfX0uCisgICAgICBUb3RhbCBQb3N0czoge3twb3N0Q291
bnR9fQorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBZb3UgY291bGQgcmVuZGVyIGl0IGlu
c2lkZSB0aGUgYHBvc3RgIHRlbXBsYXRlIHVzaW5nIHRoZSBgcmVuZGVyYCBoZWxwZXIuCisgIAor
ICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8ZGl2IGNsYXNzPSJwb3N0Ij4KKyAgICAgIDxoMT57e3Rp
dGxlfX08L2gxPgorICAgICAgPGRpdj57e2JvZHl9fTwvZGl2PgorICAgICAge3tyZW5kZXIgImF1
dGhvciIgYXV0aG9yfX0KKyAgICA8L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZW5k
ZXIKKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtTdHJpbmd9
IG5hbWUKKyAgICBAcGFyYW0ge09iamVjdD99IGNvbnRleHQKKyAgICBAcGFyYW0ge0hhc2h9IG9w
dGlvbnMKKyAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCisgICAgQHB1YmxpYworICAq
LworICBleHBvcnRzLmRlZmF1bHQgPSB7CisgICAgd2lsbFJlbmRlcjogZnVuY3Rpb24gKHJlbmRl
ck5vZGUsIGVudikgeworICAgICAgaWYgKGVudi52aWV3Lm93bmVyVmlldy5fb3V0bGV0cykgewor
ICAgICAgICAvLyBXZSBtYWtlIHN1cmUgd2Ugd2lsbCBnZXQgZGlydGllZCB3aGVuIG91dGxldCBz
dGF0ZSBjaGFuZ2VzLgorICAgICAgICBlbnYudmlldy5vd25lclZpZXcuX291dGxldHMucHVzaChy
ZW5kZXJOb2RlKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc2V0dXBTdGF0ZTogZnVuY3Rpb24g
KHByZXZTdGF0ZSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgICB2YXIgbmFtZSA9
IHBhcmFtc1swXTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBmaXJzdCBh
cmd1bWVudCBvZiB7e3JlbmRlcn19IG11c3QgYmUgcXVvdGVkLCBlLmcuIHt7cmVuZGVyICJzaWRl
YmFyIn19LicsIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyk7CisKKyAgICAgIHJldHVybiB7Cisg
ICAgICAgIHBhcmVudFZpZXc6IGVudi52aWV3LAorICAgICAgICBtYW5hZ2VyOiBwcmV2U3RhdGUu
bWFuYWdlciwKKyAgICAgICAgY29udHJvbGxlcjogcHJldlN0YXRlLmNvbnRyb2xsZXIsCisgICAg
ICAgIGNoaWxkT3V0bGV0U3RhdGU6IGNoaWxkT3V0bGV0U3RhdGUobmFtZSwgZW52KQorICAgICAg
fTsKKyAgICB9LAorCisgICAgY2hpbGRFbnY6IGZ1bmN0aW9uIChzdGF0ZSwgZW52KSB7CisgICAg
ICByZXR1cm4gZW52LmNoaWxkV2l0aE91dGxldFN0YXRlKHN0YXRlLmNoaWxkT3V0bGV0U3RhdGUp
OworICAgIH0sCisKKyAgICBpc1N0YWJsZTogZnVuY3Rpb24gKGxhc3RTdGF0ZSwgbmV4dFN0YXRl
KSB7CisgICAgICByZXR1cm4gaXNTdGFibGUobGFzdFN0YXRlLmNoaWxkT3V0bGV0U3RhdGUsIG5l
eHRTdGF0ZS5jaGlsZE91dGxldFN0YXRlKTsKKyAgICB9LAorCisgICAgaXNFbXB0eTogZnVuY3Rp
b24gKHN0YXRlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIHJlbmRlcjog
ZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBzdGF0ZSA9IG5vZGUuZ2V0U3RhdGUoKTsKKyAgICAg
IHZhciBuYW1lID0gcGFyYW1zWzBdOworICAgICAgdmFyIGNvbnRleHQgPSBwYXJhbXNbMV07CisK
KyAgICAgIHZhciBvd25lciA9IGVudi5vd25lcjsKKworICAgICAgLy8gVGhlIHJlbmRlciBrZXl3
b3JkIHByZXN1bWVzIGl0IGNhbiB3b3JrIHdpdGhvdXQgYSByb3V0ZXIuIFRoaXMgaXMgcmVhbGx5
CisgICAgICAvLyBvbmx5IHRvIHNhdGlzZnkgdGhlIHRlc3Q6CisgICAgICAvLworICAgICAgLy8g
ICAgIHt7dmlld319IHNob3VsZCBub3Qgb3ZlcnJpZGUgY2xhc3MgYmluZGluZ3MgZGVmaW5lZCBv
biBhIGNoaWxkIHZpZXciCisgICAgICAvLworICAgICAgdmFyIHJvdXRlciA9IG93bmVyLmxvb2t1
cCgncm91dGVyOm1haW4nKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBz
ZWNvbmQgYXJndW1lbnQgb2Yge3tyZW5kZXJ9fSBtdXN0IGJlIGEgcGF0aCwgZS5nLiB7e3JlbmRl
ciAicG9zdCIgcG9zdH19LicsIHBhcmFtcy5sZW5ndGggPCAyIHx8IF9lbWJlck1ldGFsU3RyZWFt
c1V0aWxzLmlzU3RyZWFtKHBhcmFtc1sxXSkpOworCisgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9
PT0gMSkgeworICAgICAgICAvLyB1c2UgdGhlIHNpbmdsZXRvbiBjb250cm9sbGVyCisgICAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2FuIG9ubHkgdXNlIHRoZSB7e3JlbmRlcn19
IGhlbHBlciBvbmNlIHdpdGhvdXQgYSBtb2RlbCBvYmplY3QgYXMgJyArICdpdHMgc2Vjb25kIGFy
Z3VtZW50LCBhcyBpbiB7e3JlbmRlciAicG9zdCIgcG9zdH19LicsICFyb3V0ZXIgfHwgIXJvdXRl
ci5fbG9va3VwQWN0aXZlQ29tcG9uZW50Tm9kZShuYW1lKSk7CisgICAgICB9IGVsc2UgaWYgKHBh
cmFtcy5sZW5ndGggIT09IDIpIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3Iu
ZGVmYXVsdCgnWW91IG11c3QgcGFzcyBhIHRlbXBsYXRlTmFtZSB0byByZW5kZXInKTsKKyAgICAg
IH0KKworICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9ICd0ZW1wbGF0ZTonICsgbmFtZTsKKyAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdXNlZCBge3tyZW5kZXIgXCcnICsgbmFtZSAr
ICdcJ319YCwgYnV0IFwnJyArIG5hbWUgKyAnXCcgY2FuIG5vdCBiZSAnICsgJ2ZvdW5kIGFzIGVp
dGhlciBhIHRlbXBsYXRlIG9yIGEgdmlldy4nLCBvd25lci5oYXNSZWdpc3RyYXRpb24oJ3ZpZXc6
JyArIG5hbWUpIHx8IG93bmVyLmhhc1JlZ2lzdHJhdGlvbih0ZW1wbGF0ZU5hbWUpIHx8ICEhdGVt
cGxhdGUpOworCisgICAgICB2YXIgdmlldyA9IG93bmVyLmxvb2t1cCgndmlldzonICsgbmFtZSk7
CisgICAgICBpZiAoIXZpZXcpIHsKKyAgICAgICAgdmlldyA9IG93bmVyLmxvb2t1cCgndmlldzpk
ZWZhdWx0Jyk7CisgICAgICB9CisgICAgICB2YXIgdmlld0hhc1RlbXBsYXRlU3BlY2lmaWVkID0g
dmlldyAmJiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAndGVtcGxhdGUnKTsK
KyAgICAgIGlmICghdGVtcGxhdGUgJiYgIXZpZXdIYXNUZW1wbGF0ZVNwZWNpZmllZCkgeworICAg
ICAgICB0ZW1wbGF0ZSA9IG93bmVyLmxvb2t1cCh0ZW1wbGF0ZU5hbWUpOworICAgICAgfQorCisg
ICAgICBpZiAodmlldykgeworICAgICAgICB2aWV3Lm93bmVyVmlldyA9IGVudi52aWV3Lm93bmVy
VmlldzsKKyAgICAgIH0KKworICAgICAgLy8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCisg
ICAgICB2YXIgY29udHJvbGxlck5hbWU7CisgICAgICB2YXIgY29udHJvbGxlckZ1bGxOYW1lOwor
CisgICAgICBpZiAoaGFzaC5jb250cm9sbGVyKSB7CisgICAgICAgIGNvbnRyb2xsZXJOYW1lID0g
aGFzaC5jb250cm9sbGVyOworICAgICAgICBjb250cm9sbGVyRnVsbE5hbWUgPSAnY29udHJvbGxl
cjonICsgY29udHJvbGxlck5hbWU7CisgICAgICAgIGRlbGV0ZSBoYXNoLmNvbnRyb2xsZXI7CisK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBjb250cm9sbGVyIG5hbWUgeW91
IHN1cHBsaWVkIFwnJyArIGNvbnRyb2xsZXJOYW1lICsgJ1wnICcgKyAnZGlkIG5vdCByZXNvbHZl
IHRvIGEgY29udHJvbGxlci4nLCBvd25lci5oYXNSZWdpc3RyYXRpb24oY29udHJvbGxlckZ1bGxO
YW1lKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb250cm9sbGVyTmFtZSA9IG5hbWU7Cisg
ICAgICAgIGNvbnRyb2xsZXJGdWxsTmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFt
ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHRhcmdldCA9IHJvdXRlcjsKKyAgICAgIHZhciBjb250
cm9sbGVyOworCisgICAgICAvLyBjaG9vc2UgbmFtZQorICAgICAgaWYgKHBhcmFtcy5sZW5ndGgg
PiAxKSB7CisgICAgICAgIHZhciBmYWN0b3J5ID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoY29udHJv
bGxlckZ1bGxOYW1lKSB8fCBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5n
ZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSk7CisKKyAgICAg
ICAgY29udHJvbGxlciA9IGZhY3RvcnkuY3JlYXRlKHsKKyAgICAgICAgICBtb2RlbDogX2VtYmVy
TWV0YWxTdHJlYW1zVXRpbHMucmVhZChjb250ZXh0KSwKKyAgICAgICAgICB0YXJnZXQ6IHRhcmdl
dAorICAgICAgICB9KTsKKworICAgICAgICBub2RlLmFkZERlc3RydWN0aW9uKGNvbnRyb2xsZXIp
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udHJvbGxlciA9IG93bmVyLmxvb2t1cChjb250
cm9sbGVyRnVsbE5hbWUpIHx8IF9lbWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVy
LmRlZmF1bHQob3duZXIsIGNvbnRyb2xsZXJOYW1lKTsKKworICAgICAgICBjb250cm9sbGVyLnNl
dFByb3BlcnRpZXMoeworICAgICAgICAgIHRhcmdldDogdGFyZ2V0CisgICAgICAgIH0pOworICAg
ICAgfQorCisgICAgICBpZiAodmlldykgeworICAgICAgICB2aWV3LnNldCgnY29udHJvbGxlcics
IGNvbnRyb2xsZXIpOworICAgICAgfQorICAgICAgc3RhdGUuY29udHJvbGxlciA9IGNvbnRyb2xs
ZXI7CisKKyAgICAgIGhhc2gudmlld05hbWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmNh
bWVsaXplKG5hbWUpOworCisgICAgICBpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUucmF3KSB7Cisg
ICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmF3OworICAgICAgfQorCisgICAgICB2YXIgb3B0
aW9ucyA9IHsKKyAgICAgICAgbGF5b3V0OiBudWxsLAorICAgICAgICBzZWxmOiBjb250cm9sbGVy
CisgICAgICB9OworCisgICAgICBpZiAodmlldykgeworICAgICAgICBvcHRpb25zLmNvbXBvbmVu
dCA9IHZpZXc7CisgICAgICB9CisKKyAgICAgIHZhciBub2RlTWFuYWdlciA9IF9lbWJlckh0bWxi
YXJzTm9kZU1hbmFnZXJzVmlld05vZGVNYW5hZ2VyLmRlZmF1bHQuY3JlYXRlKG5vZGUsIGVudiwg
aGFzaCwgb3B0aW9ucywgc3RhdGUucGFyZW50VmlldywgbnVsbCwgbnVsbCwgdGVtcGxhdGUpOwor
ICAgICAgc3RhdGUubWFuYWdlciA9IG5vZGVNYW5hZ2VyOworCisgICAgICBpZiAocm91dGVyICYm
IHBhcmFtcy5sZW5ndGggPT09IDEpIHsKKyAgICAgICAgcm91dGVyLl9jb25uZWN0QWN0aXZlQ29t
cG9uZW50Tm9kZShuYW1lLCBub2RlTWFuYWdlcik7CisgICAgICB9CisKKyAgICAgIG5vZGVNYW5h
Z2VyLnJlbmRlcihlbnYsIGhhc2gsIHZpc2l0b3IpOworICAgIH0sCisKKyAgICByZXJlbmRlcjog
ZnVuY3Rpb24gKG5vZGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpIHsKKyAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkgeworICAgICAgICB2
YXIgbW9kZWwgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHBhcmFtc1sxXSk7CisgICAg
ICAgIG5vZGUuZ2V0U3RhdGUoKS5jb250cm9sbGVyLnNldCgnbW9kZWwnLCBtb2RlbCk7CisgICAg
ICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGNoaWxkT3V0bGV0U3RhdGUobmFtZSwgZW52
KSB7CisgICAgdmFyIHRvcExldmVsID0gZW52LnZpZXcub3duZXJWaWV3OworICAgIGlmICghdG9w
TGV2ZWwgfHwgIXRvcExldmVsLm91dGxldFN0YXRlKSB7CisgICAgICByZXR1cm47CisgICAgfQor
CisgICAgdmFyIG91dGxldFN0YXRlID0gdG9wTGV2ZWwub3V0bGV0U3RhdGU7CisgICAgaWYgKCFv
dXRsZXRTdGF0ZS5tYWluKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHNlbGVj
dGVkT3V0bGV0U3RhdGUgPSBvdXRsZXRTdGF0ZS5tYWluLm91dGxldHNbJ19fZW1iZXJfb3JwaGFu
c19fJ107CisgICAgaWYgKCFzZWxlY3RlZE91dGxldFN0YXRlKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorICAgIHZhciBtYXRjaGVkID0gc2VsZWN0ZWRPdXRsZXRTdGF0ZS5vdXRsZXRzW25hbWVd
OworICAgIGlmIChtYXRjaGVkKSB7CisgICAgICB2YXIgY2hpbGRTdGF0ZSA9IG5ldyBfZW1iZXJN
ZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgICAgICBjaGlsZFN0YXRlW21hdGNoZWQucmVu
ZGVyLm91dGxldF0gPSBtYXRjaGVkOworICAgICAgbWF0Y2hlZC53YXNVc2VkID0gdHJ1ZTsKKyAg
ICAgIHJldHVybiBjaGlsZFN0YXRlOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGlzU3RhYmxl
KGEsIGIpIHsKKyAgICBpZiAoIWEgJiYgIWIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICBpZiAoIWEgfHwgIWIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9y
ICh2YXIgb3V0bGV0TmFtZSBpbiBhKSB7CisgICAgICBpZiAoIWlzU3RhYmxlT3V0bGV0KGFbb3V0
bGV0TmFtZV0sIGJbb3V0bGV0TmFtZV0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBpc1N0YWJsZU91
dGxldChhLCBiKSB7CisgICAgaWYgKCFhICYmICFiKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgaWYgKCFhIHx8ICFiKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGEgPSBhLnJlbmRlcjsKKyAgICBiID0gYi5yZW5kZXI7CisgICAgZm9yICh2YXIga2V5IGluIGEp
IHsKKyAgICAgIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgLy8gbmFtZSBp
cyBvbmx5IGhlcmUgZm9yIGxvZ2dpbmcgJiBkZWJ1Z2dpbmcuIElmIHR3byBkaWZmZXJlbnQKKyAg
ICAgICAgLy8gbmFtZXMgcmVzdWx0IGluIG90aGVyd2lzZSBpZGVudGljYWwgc3RhdGVzLCB0aGV5
J3JlIHN0aWxsCisgICAgICAgIC8vIGlkZW50aWNhbC4KKyAgICAgICAgaWYgKGFba2V5XSAhPT0g
YltrZXldICYmIGtleSAhPT0gJ25hbWUnKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2VuaWZl
ZCgnZW1iZXItcm91dGluZy12aWV3cy9jb21wb25lbnRzL2xpbmstdG8nLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9jb21wdXRl
ZCcsICdlbWJlci1tZXRhbC9jb21wdXRlZF9tYWNyb3MnLCAnZW1iZXItdmlld3Mvc3lzdGVtL3V0
aWxzJywgJ2VtYmVyLXZpZXdzL2NvbXBvbmVudHMvY29tcG9uZW50JywgJ2VtYmVyLXJ1bnRpbWUv
aW5qZWN0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL3NlcnZpY2UnLCAnZW1iZXItcnVudGltZS9t
aXhpbnMvY29udHJvbGxlcicsICdlbWJlci1odG1sYmFycy9ub2RlLW1hbmFnZXJzL2NvbXBvbmVu
dC1ub2RlLW1hbmFnZXInLCAnZW1iZXItaHRtbGJhcnMvdGVtcGxhdGVzL2xpbmstdG8nLCAncmVx
dWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcywgX2VtYmVyTWV0
YWxMb2dnZXIsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbENvbXB1dGVkX21hY3JvcywgX2VtYmVyVmlld3NT
eXN0ZW1VdGlscywgX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1iZXJSdW50aW1l
SW5qZWN0LCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyUnVudGltZU1peGluc0Nv
bnRyb2xsZXIsIF9lbWJlckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIs
IF9lbWJlckh0bWxiYXJzVGVtcGxhdGVzTGlua1RvLCBfcmVxdWlyZSkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlcworICAqLworCisgIC8qKgor
ICAgIFRoZSBge3tsaW5rLXRvfX1gIGNvbXBvbmVudCByZW5kZXJzIGEgbGluayB0byB0aGUgc3Vw
cGxpZWQKKyAgICBgcm91dGVOYW1lYCBwYXNzaW5nIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgbW9k
ZWwgdG8gdGhlCisgICAgcm91dGUgYXMgaXRzIGBtb2RlbGAgY29udGV4dCBvZiB0aGUgcm91dGUu
IFRoZSBibG9jaworICAgIGZvciBge3tsaW5rLXRvfX1gIGJlY29tZXMgdGhlIGlubmVySFRNTCBv
ZiB0aGUgcmVuZGVyZWQKKyAgICBlbGVtZW50OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAg
e3sjbGluay10byAncGhvdG9HYWxsZXJ5J319CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3Rvcwor
ICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBZb3UgY2FuIGFsc28gdXNlIGFuIGlu
bGluZSBmb3JtIG9mIGB7e2xpbmstdG99fWAgY29tcG9uZW50IGJ5CisgICAgcGFzc2luZyB0aGUg
bGluayB0ZXh0IGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICAgIHRvIHRoZSBjb21wb25lbnQ6Cisg
IAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2xpbmstdG8gJ0dyZWF0IEhhbXN0ZXIgUGhvdG9z
JyAncGhvdG9HYWxsZXJ5J319CisgICAgYGBgCisgIAorICAgIEJvdGggd2lsbCByZXN1bHQgaW46
CisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MiPgorICAgICAg
R3JlYXQgSGFtc3RlciBQaG90b3MKKyAgICA8L2E+CisgICAgYGBgCisgIAorICAgICMjIyBTdXBw
bHlpbmcgYSB0YWdOYW1lCisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIHJlbmRlcnMgYW4g
YDxhPmAgZWxlbWVudC4gVGhpcyBjYW4KKyAgICBiZSBvdmVycmlkZGVuIGZvciBhIHNpbmdsZSB1
c2Ugb2YgYHt7bGluay10b319YCBieSBzdXBwbHlpbmcKKyAgICBhIGB0YWdOYW1lYCBvcHRpb246
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIHRh
Z05hbWU9ImxpIn19CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcworICAgIHt7L2xpbmstdG99
fQorICAgIGBgYAorICAKKyAgICBgYGBodG1sCisgICAgPGxpPgorICAgICAgR3JlYXQgSGFtc3Rl
ciBQaG90b3MKKyAgICA8L2xpPgorICAgIGBgYAorICAKKyAgICBUbyBvdmVycmlkZSB0aGlzIG9w
dGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIHNlZQorICAgICJPdmVycmlkaW5nIEFw
cGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgorICAKKyAgICAjIyMgRGlzYWJsaW5nIHRoZSBgbGlu
ay10b2AgY29tcG9uZW50CisgICAgQnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIGlzIGVuYWJsZWQu
CisgICAgYW55IHBhc3NlZCB2YWx1ZSB0byB0aGUgYGRpc2FibGVkYCBjb21wb25lbnQgcHJvcGVy
dHkgd2lsbCBkaXNhYmxlCisgICAgdGhlIGBsaW5rLXRvYCBjb21wb25lbnQuCisgIAorICAgIHN0
YXRpYyB1c2U6IHRoZSBgZGlzYWJsZWRgIG9wdGlvbjoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWQ9dHJ1ZX19CisgICAgICBHcmVh
dCBIYW1zdGVyIFBob3RvcworICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBkeW5h
bWljIHVzZTogdGhlIGBkaXNhYmxlZFdoZW5gIG9wdGlvbjoKKyAgCisgICAgYGBgaGFuZGxlYmFy
cworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWRXaGVuPWNvbnRyb2xsZXIu
c29tZVByb3BlcnR5fX0KKyAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAge3svbGluay10
b319CisgICAgYGBgCisgIAorICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2FibGVkYCB3aWxs
IGRpc2FibGUgaXQgZXhjZXB0IGB1bmRlZmluZWRgLgorICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkg
YHRydWVgIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBjb21wb25lbnQgeW91IGNhbgorICAgIG92ZXJy
aWRlIHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBFbWJlci5MaW5rQ29tcG9uZW50YC4KKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLkxpbmtDb21wb25lbnQucmVvcGVuKHsKKyAgICAg
IGRpc2FibGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAg
IGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgdGhpcy5zZXQoJ19pc0Rpc2Fi
bGVkJywgdmFsdWUgPT09IHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZSA9
PT0gdHJ1ZSA/IGdldCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7CisgICAgICB9KQor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBzZWUgIk92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lk
ZSBEZWZhdWx0cyIgZm9yIG1vcmUuCisgIAorICAgICMjIyBIYW5kbGluZyBgaHJlZmAKKyAgICBg
e3tsaW5rLXRvfX1gIHdpbGwgdXNlIHlvdXIgYXBwbGljYXRpb24ncyBSb3V0ZXIgdG8KKyAgICBm
aWxsIHRoZSBlbGVtZW50J3MgYGhyZWZgIHByb3BlcnR5IHdpdGggYSB1cmwgdGhhdAorICAgIG1h
dGNoZXMgdGhlIHBhdGggdG8gdGhlIHN1cHBsaWVkIGByb3V0ZU5hbWVgIGZvciB5b3VyCisgICAg
cm91dGVyJ3MgY29uZmlndXJlZCBgTG9jYXRpb25gIHNjaGVtZSwgd2hpY2ggZGVmYXVsdHMKKyAg
ICB0byBFbWJlci5IYXNoTG9jYXRpb24uCisgIAorICAgICMjIyBIYW5kbGluZyBjdXJyZW50IHJv
dXRlCisgICAgYHt7bGluay10b319YCB3aWxsIGFwcGx5IGEgQ1NTIGNsYXNzIG5hbWUgb2YgJ2Fj
dGl2ZScKKyAgICB3aGVuIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgbWF0Y2hlcwor
ICAgIHRoZSBzdXBwbGllZCByb3V0ZU5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRp
b24ncworICAgIGN1cnJlbnQgcm91dGUgaXMgJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIHRoZSBmb2xs
b3dpbmcKKyAgICB1c2Ugb2YgYHt7bGluay10b319YDoKKyAgCisgICAgYGBgaGFuZGxlYmFycwor
ICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnfX0KKyAgICAgIEdyZWF0IEhhbXN0
ZXIgUGhvdG9zCisgICAge3svbGluay10b319CisgICAgYGBgCisgIAorICAgIHdpbGwgcmVzdWx0
IGluCisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MvdGhpcy13
ZWVrIiBjbGFzcz0iYWN0aXZlIj4KKyAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCisgICAgPC9h
PgorICAgIGBgYAorICAKKyAgICBUaGUgQ1NTIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIGNs
YXNzZXMgY2FuIGJlIGN1c3RvbWl6ZWQKKyAgICBmb3IgYSBzaW5nbGUgdXNlIG9mIGB7e2xpbmst
dG99fWAgYnkgcGFzc2luZyBhbiBgYWN0aXZlQ2xhc3NgCisgICAgb3B0aW9uOgorICAKKyAgICBg
YGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LnJlY2VudCcgYWN0aXZl
Q2xhc3M9ImN1cnJlbnQtdXJsIn19CisgICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcworICAgIHt7
L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICBgYGBodG1sCisgICAgPGEgaHJlZj0iL2hhbXN0
ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KKyAgICAgIEdyZWF0IEhh
bXN0ZXIgUGhvdG9zCisgICAgPC9hPgorICAgIGBgYAorICAKKyAgICBUbyBvdmVycmlkZSB0aGlz
IG9wdGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIHNlZQorICAgICJPdmVycmlkaW5n
IEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgorICAKKyAgICAjIyMgS2VlcGluZyBhIGxpbmsg
YWN0aXZlIGZvciBvdGhlciByb3V0ZXMKKyAgCisgICAgSWYgeW91IG5lZWQgYSBsaW5rIHRvIGJl
ICdhY3RpdmUnIGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1hdGNoCisgICAgdGhlIGN1cnJlbnQgcm91
dGUsIHlvdSBjYW4gdXNlIHRoZSBgY3VycmVudC13aGVuYCBhcmd1bWVudC4KKyAgCisgICAgYGBg
aGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgY3VycmVudC13aGVuPSdw
aG90b3MnfX0KKyAgICAgIFBob3RvIEdhbGxlcnkKKyAgICB7ey9saW5rLXRvfX0KKyAgICBgYGAK
KyAgCisgICAgVGhpcyBtYXkgYmUgaGVscGZ1bCBmb3Iga2VlcGluZyBsaW5rcyBhY3RpdmUgZm9y
OgorICAKKyAgICAqIG5vbi1uZXN0ZWQgcm91dGVzIHRoYXQgYXJlIGxvZ2ljYWxseSByZWxhdGVk
CisgICAgKiBzb21lIHNlY29uZGFyeSBtZW51IGFwcHJvYWNoZXMKKyAgICAqICd0b3AgbmF2aWdh
dGlvbicgd2l0aCAnc3ViIG5hdmlnYXRpb24nIHNjZW5hcmlvcworICAKKyAgICBBIGxpbmsgd2ls
bCBiZSBhY3RpdmUgaWYgYGN1cnJlbnQtd2hlbmAgaXMgYHRydWVgIG9yIHRoZSBjdXJyZW50Cisg
ICAgcm91dGUgaXMgdGhlIHJvdXRlIHRoaXMgbGluayB3b3VsZCB0cmFuc2l0aW9uIHRvLgorICAK
KyAgICBUbyBtYXRjaCBtdWx0aXBsZSByb3V0ZXMgJ3NwYWNlLXNlcGFyYXRlJyB0aGUgcm91dGVz
OgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICAge3sjbGluay10byAnZ2FsbGVyeScgY3VycmVu
dC13aGVuPSdwaG90b3MgZHJhd2luZ3MgcGFpbnRpbmdzJ319CisgICAgICBBcnQgR2FsbGVyeQor
ICAgIHt7L2xpbmstdG99fQorICAgIGBgYAorICAKKyAgICAjIyMgU3VwcGx5aW5nIGEgbW9kZWwK
KyAgICBBbiBvcHRpb25hbCBtb2RlbCBhcmd1bWVudCBjYW4gYmUgdXNlZCBmb3Igcm91dGVzIHdo
b3NlCisgICAgcGF0aHMgY29udGFpbiBkeW5hbWljIHNlZ21lbnRzLiBUaGlzIGFyZ3VtZW50IHdp
bGwgYmVjb21lCisgICAgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtlZCByb3V0ZToKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIFJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0
aGlzLnJvdXRlKCJwaG90b0dhbGxlcnkiLCB7cGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19p
ZCJ9KTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xp
bmstdG8gJ3Bob3RvR2FsbGVyeScgYVBob3RvfX0KKyAgICAgIHt7YVBob3RvLnRpdGxlfX0KKyAg
ICB7ey9saW5rLXRvfX0KKyAgICBgYGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9o
YW1zdGVyLXBob3Rvcy80MiI+CisgICAgICBUb21zdGVyCisgICAgPC9hPgorICAgIGBgYAorICAK
KyAgICAjIyMgU3VwcGx5aW5nIG11bHRpcGxlIG1vZGVscworICAgIEZvciBkZWVwLWxpbmtpbmcg
dG8gcm91dGUgcGF0aHMgdGhhdCBjb250YWluIG11bHRpcGxlCisgICAgZHluYW1pYyBzZWdtZW50
cywgbXVsdGlwbGUgbW9kZWwgYXJndW1lbnRzIGNhbiBiZSB1c2VkLgorICAgIEFzIHRoZSByb3V0
ZXIgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgcm91dGUgcGF0aCwgZWFjaAorICAgIHN1cHBsaWVk
IG1vZGVsIGFyZ3VtZW50IHdpbGwgYmVjb21lIHRoZSBjb250ZXh0IGZvciB0aGUKKyAgICByb3V0
ZSB3aXRoIHRoZSBkeW5hbWljIHNlZ21lbnRzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoInBob3RvR2FsbGVyeSIs
IHsgcGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19pZCIgfSwgZnVuY3Rpb24oKSB7CisgICAg
ICAgIHRoaXMucm91dGUoImNvbW1lbnQiLCB7cGF0aDogImNvbW1lbnRzLzpjb21tZW50X2lkIn0p
OworICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgICAgVGhpcyBhcmd1bWVudCB3aWxsIGJl
Y29tZSB0aGUgbW9kZWwgY29udGV4dCBvZiB0aGUgbGlua2VkIHJvdXRlOgorICAKKyAgICBgYGBo
YW5kbGViYXJzCisgICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LmNvbW1lbnQnIGFQaG90byBj
b21tZW50fX0KKyAgICAgIHt7Y29tbWVudC5ib2R5fX0KKyAgICB7ey9saW5rLXRvfX0KKyAgICBg
YGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9jb21t
ZW50cy83MTgiPgorICAgICAgQSsrKyB3b3VsZCBzbnVnZ2xlIGFnYWluLgorICAgIDwvYT4KKyAg
ICBgYGAKKyAgCisgICAgIyMjIFN1cHBseWluZyBhbiBleHBsaWNpdCBkeW5hbWljIHNlZ21lbnQg
dmFsdWUKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIG1vZGVsIG9iamVjdCBhdmFpbGFibGUgdG8g
cGFzcyB0byBge3tsaW5rLXRvfX1gLAorICAgIGFuIG9wdGlvbmFsIHN0cmluZyBvciBpbnRlZ2Vy
IGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgZm9yIHJvdXRlcyB3aG9zZQorICAgIHBhdGhzIGNvbnRh
aW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgdmFsdWUK
KyAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoInBob3RvR2FsbGVyeSIs
IHsgcGF0aDogImhhbXN0ZXItcGhvdG9zLzpwaG90b19pZCIgfSk7CisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQ
aG90b0lkfX0KKyAgICAgIHt7YVBob3RvLnRpdGxlfX0KKyAgICB7ey9saW5rLXRvfX0KKyAgICBg
YGAKKyAgCisgICAgYGBgaHRtbAorICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80MiI+Cisg
ICAgICBUb21zdGVyCisgICAgPC9hPgorICAgIGBgYAorICAKKyAgICBXaGVuIHRyYW5zaXRpb25p
bmcgaW50byB0aGUgbGlua2VkIHJvdXRlLCB0aGUgYG1vZGVsYCBob29rIHdpbGwKKyAgICBiZSB0
cmlnZ2VyZWQgd2l0aCBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVy
LgorICAKKyAgICAjIyMgQWxsb3dpbmcgRGVmYXVsdCBBY3Rpb24KKyAgCisgICBCeSBkZWZhdWx0
IHRoZSBge3tsaW5rLXRvfX1gIGNvbXBvbmVudCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBicm93c2Vy
IGFjdGlvbgorICAgYnkgY2FsbGluZyBgcHJldmVudERlZmF1bHQoKWAgYXMgdGhpcyBzb3J0IG9m
IGFjdGlvbiBidWJibGluZyBpcyBub3JtYWxseQorICAgaGFuZGxlZCBpbnRlcm5hbGx5IGFuZCB3
ZSBkbyBub3Qgd2FudCB0byB0YWtlIHRoZSBicm93c2VyIHRvIGEgbmV3IFVSTCAoZm9yCisgICBl
eGFtcGxlKS4KKyAgCisgICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHNw
ZWNpZnkgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBpbgorICAgeW91ciB0ZW1wbGF0ZToKKyAgCisg
ICAgYGBgaGFuZGxlYmFycworICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgYVBob3RvSWQg
cHJldmVudERlZmF1bHQ9ZmFsc2V9fQorICAgICAge3thUGhvdG9JZC50aXRsZX19CisgICAge3sv
bGluay10b319CisgICAgYGBgCisgIAorICAgICMjIyBPdmVycmlkaW5nIGF0dHJpYnV0ZXMKKyAg
ICBZb3UgY2FuIG92ZXJyaWRlIGFueSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgYEVtYmVyLkxpbmtD
b21wb25lbnRgCisgICAgdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGB7e2xpbmstdG99fWAgY29t
cG9uZW50IGJ5IHBhc3NpbmcKKyAgICBrZXkvdmFsdWUgcGFpcnMsIGxpa2Ugc286CisgIAorICAg
IGBgYGhhbmRsZWJhcnMKKyAgICB7eyNsaW5rLXRvICBhUGhvdG8gdGFnTmFtZT0nbGknIHRpdGxl
PSdGb2xsb3dpbmcgdGhpcyBsaW5rIHdpbGwgY2hhbmdlIHlvdXIgbGlmZScgY2xhc3NOYW1lcz0n
cGljIHN3ZWV0J319CisgICAgICBVaC1tYXppbmchCisgICAge3svbGluay10b319CisgICAgYGBg
CisgIAorICAgIFNlZSBbRW1iZXIuTGlua0NvbXBvbmVudF0oL2FwaS9jbGFzc2VzL0VtYmVyLkxp
bmtDb21wb25lbnQuaHRtbCkgZm9yIGEKKyAgICBjb21wbGV0ZSBsaXN0IG9mIG92ZXJyaWRlYWJs
ZSBwcm9wZXJ0aWVzLiBCZSBzdXJlIHRvIGFsc28KKyAgICBjaGVjayBvdXQgaW5oZXJpdGVkIHBy
b3BlcnRpZXMgb2YgYExpbmtDb21wb25lbnRgLgorICAKKyAgICAjIyMgT3ZlcnJpZGluZyBBcHBs
aWNhdGlvbi13aWRlIERlZmF1bHRzCisgICAgYGB7e2xpbmstdG99fWBgIGNyZWF0ZXMgYW4gaW5z
dGFuY2Ugb2YgYEVtYmVyLkxpbmtDb21wb25lbnRgCisgICAgZm9yIHJlbmRlcmluZy4gVG8gb3Zl
cnJpZGUgb3B0aW9ucyBmb3IgeW91ciBlbnRpcmUKKyAgICBhcHBsaWNhdGlvbiwgcmVvcGVuIGBF
bWJlci5MaW5rQ29tcG9uZW50YCBhbmQgc3VwcGx5IHRoZQorICAgIGRlc2lyZWQgdmFsdWVzOgor
ICAKKyAgICBgYGAgamF2YXNjcmlwdAorICAgIEVtYmVyLkxpbmtDb21wb25lbnQucmVvcGVuKHsK
KyAgICAgIGFjdGl2ZUNsYXNzOiAiaXMtYWN0aXZlIiwKKyAgICAgIHRhZ05hbWU6ICdsaScKKyAg
ICB9KQorICAgIGBgYAorICAKKyAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRo
ZSBkZWZhdWx0IGV2ZW50IGluCisgICAgdGhpcyBtYW5uZXI6CisgIAorICAgIGBgYCBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuTGlua0NvbXBvbmVudC5yZW9wZW4oeworICAgICAgZXZlbnROYW1lOiAn
Y3VzdG9tRXZlbnROYW1lJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGxpbmst
dG8KKyAgICBAZm9yIEVtYmVyLlRlbXBsYXRlcy5oZWxwZXJzCisgICAgQHBhcmFtIHtTdHJpbmd9
IHJvdXRlTmFtZQorICAgIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0qCisgICAgQHBhcmFtIFtv
cHRpb25zXSB7T2JqZWN0fSBIYW5kbGViYXJzIGtleS92YWx1ZSBwYWlycyBvZiBvcHRpb25zLCB5
b3UgY2FuIG92ZXJyaWRlIGFueSBwcm9wZXJ0eSBvZiBFbWJlci5MaW5rQ29tcG9uZW50CisgICAg
QHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZworICAgIEBzZWUge0VtYmVyLkxpbmtDb21wb25l
bnR9CisgICAgQHB1YmxpYworICAqLworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJt
b2R1bGUgZW1iZXItcm91dGluZy12aWV3cworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICB2
YXIgbGF5b3V0ID0gX2VtYmVySHRtbGJhcnNUZW1wbGF0ZXNMaW5rVG8uZGVmYXVsdDsKKworICAv
KioKKyAgICBgRW1iZXIuTGlua0NvbXBvbmVudGAgcmVuZGVycyBhbiBlbGVtZW50IHdob3NlIGBj
bGlja2AgZXZlbnQgdHJpZ2dlcnMgYQorICAgIHRyYW5zaXRpb24gb2YgdGhlIGFwcGxpY2F0aW9u
J3MgaW5zdGFuY2Ugb2YgYEVtYmVyLlJvdXRlcmAgdG8KKyAgICBhIHN1cHBsaWVkIHJvdXRlIGJ5
IG5hbWUuCisgIAorICAgIGBFbWJlci5MaW5rQ29tcG9uZW50YCBjb21wb25lbnRzIGFyZSBpbnZv
a2VkIHdpdGgge3sjbGluay10b319LiBQcm9wZXJ0aWVzCisgICAgb2YgdGhpcyBjbGFzcyBjYW4g
YmUgb3ZlcnJpZGRlbiB3aXRoIGByZW9wZW5gIHRvIGN1c3RvbWl6ZSBhcHBsaWNhdGlvbi13aWRl
CisgICAgYmVoYXZpb3IuCisgIAorICAgIEBjbGFzcyBMaW5rQ29tcG9uZW50CisgICAgQG5hbWVz
cGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEBzZWUge0VtYmVy
LlRlbXBsYXRlcy5oZWxwZXJzLmxpbmstdG99CisgICAgQHByaXZhdGUKKyAgKiovCisgIHZhciBM
aW5rQ29tcG9uZW50ID0gX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LmRlZmF1bHQuZXh0
ZW5kKHsKKyAgICBsYXlvdXQ6IGxheW91dCwKKworICAgIHRhZ05hbWU6ICdhJywKKworICAgIC8q
KgorICAgICAgQGRlcHJlY2F0ZWQgVXNlIGN1cnJlbnQtd2hlbiBpbnN0ZWFkLgorICAgICAgQHBy
b3BlcnR5IGN1cnJlbnRXaGVuCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY3VycmVudFdo
ZW46IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLmRlcHJlY2F0aW5nQWxpYXMoJ2N1cnJlbnQt
d2hlbicsIHsgaWQ6ICdlbWJlci1yb3V0aW5nLXZpZXcuZGVwcmVjYXRlZC1jdXJyZW50LXdoZW4n
LCB1bnRpbDogJzMuMC4wJyB9KSwKKworICAgIC8qKgorICAgICAgVXNlZCB0byBkZXRlcm1pbmUg
d2hlbiB0aGlzIGBMaW5rQ29tcG9uZW50YCBpcyBhY3RpdmUuCisgICAgICAgQHByb3BlcnR5IGN1
cnJlbnRXaGVuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICAnY3VycmVudC13aGVuJzogbnVs
bCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRpdGxlYCBhdHRyaWJ1dGUgb2YgdGhlIGBM
aW5rQ29tcG9uZW50YCdzIEhUTUwgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkgdGl0bGUKKyAg
ICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqKi8KKyAgICB0aXRsZTogbnVs
bCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHJlbGAgYXR0cmlidXRlIG9mIHRoZSBgTGlu
a0NvbXBvbmVudGAncyBIVE1MIGVsZW1lbnQuCisgICAgICAgQHByb3BlcnR5IHJlbAorICAgICAg
QGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICoqLworICAgIHJlbDogbnVsbCwKKwor
ICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUgb2YgdGhlIGBMaW5r
Q29tcG9uZW50YCdzIEhUTUwgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkgdGFiaW5kZXgKKyAg
ICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqKi8KKyAgICB0YWJpbmRleDog
bnVsbCwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgYHRhcmdldGAgYXR0cmlidXRlIG9mIHRo
ZSBgTGlua0NvbXBvbmVudGAncyBIVE1MIGVsZW1lbnQuCisgICAgICAgQHNpbmNlIDEuOC4wCisg
ICAgICBAcHJvcGVydHkgdGFyZ2V0CisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGlj
CisgICAgKiovCisgICAgdGFyZ2V0OiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgQ1NTIGNs
YXNzIHRvIGFwcGx5IHRvIGBMaW5rQ29tcG9uZW50YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGFjdGl2
ZWAKKyAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KKyAgICAgICBAcHJvcGVydHkgYWN0aXZlQ2xh
c3MKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgYWN0aXZlCisgICAgICBAcHJp
dmF0ZQorICAgICoqLworICAgIGFjdGl2ZUNsYXNzOiAnYWN0aXZlJywKKworICAgIC8qKgorICAg
ICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBgTGlua0NvbXBvbmVudGAncyBlbGVtZW50IHdo
ZW4gaXRzIGBsb2FkaW5nYAorICAgICAgcHJvcGVydHkgaXMgYHRydWVgLgorICAgICAgIEBwcm9w
ZXJ0eSBsb2FkaW5nQ2xhc3MKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgbG9h
ZGluZworICAgICAgQHByaXZhdGUKKyAgICAqKi8KKyAgICBsb2FkaW5nQ2xhc3M6ICdsb2FkaW5n
JywKKworICAgIC8qKgorICAgICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBhIGBMaW5rQ29t
cG9uZW50YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGRpc2FibGVkYAorICAgICAgcHJvcGVydHkgaXMg
YHRydWVgLgorICAgICAgIEBwcm9wZXJ0eSBkaXNhYmxlZENsYXNzCisgICAgICBAdHlwZSBTdHJp
bmcKKyAgICAgIEBkZWZhdWx0IGRpc2FibGVkCisgICAgICBAcHJpdmF0ZQorICAgICoqLworICAg
IGRpc2FibGVkQ2xhc3M6ICdkaXNhYmxlZCcsCisgICAgX2lzRGlzYWJsZWQ6IGZhbHNlLAorCisg
ICAgLyoqCisgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGBMaW5rQ29tcG9uZW50YCB3aWxs
IHRyaWdnZXIgcm91dGluZyB2aWEKKyAgICAgIHRoZSBgcmVwbGFjZVdpdGhgIHJvdXRpbmcgc3Ry
YXRlZ3kuCisgICAgICAgQHByb3BlcnR5IHJlcGxhY2UKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAg
ICAgIEBkZWZhdWx0IGZhbHNlCisgICAgICBAcHVibGljCisgICAgKiovCisgICAgcmVwbGFjZTog
ZmFsc2UsCisKKyAgICAvKioKKyAgICAgIEJ5IGRlZmF1bHQgdGhlIGB7e2xpbmstdG99fWAgY29t
cG9uZW50IHdpbGwgYmluZCB0byB0aGUgYGhyZWZgIGFuZAorICAgICAgYHRpdGxlYCBhdHRyaWJ1
dGVzLiBJdCdzIGRpc2NvdXJhZ2VkIHRoYXQgeW91IG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAor
ICAgICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0aGUgYXJyYXkgaWYgbmVlZGVkLgorICAg
ICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVCaW5kaW5ncworICAgICAgQHR5cGUgQXJyYXkgfCBTdHJp
bmcKKyAgICAgIEBkZWZhdWx0IFsndGl0bGUnLCAncmVsJywgJ3RhYmluZGV4JywgJ3RhcmdldCdd
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydocmVmJywg
J3RpdGxlJywgJ3JlbCcsICd0YWJpbmRleCcsICd0YXJnZXQnXSwKKworICAgIC8qKgorICAgICAg
QnkgZGVmYXVsdCB0aGUgYHt7bGluay10b319YCBjb21wb25lbnQgd2lsbCBiaW5kIHRvIHRoZSBg
YWN0aXZlYCwgYGxvYWRpbmdgLAorICAgICAgYW5kIGBkaXNhYmxlZGAgY2xhc3Nlcy4gSXQgaXMg
ZGlzY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhlc2UgZGlyZWN0bHkuCisgICAgICAgQHByb3BlcnR5
IGNsYXNzTmFtZUJpbmRpbmdzCisgICAgICBAdHlwZSBBcnJheQorICAgICAgQGRlZmF1bHQgWydh
Y3RpdmUnLCAnbG9hZGluZycsICdkaXNhYmxlZCcsICdlbWJlci10cmFuc2l0aW9uaW5nLWluJywg
J2VtYmVyLXRyYW5zaXRpb25pbmctb3V0J10KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ2FjdGl2ZScsICdsb2FkaW5nJywgJ2Rpc2FibGVkJywgJ3RyYW5z
aXRpb25pbmdJbicsICd0cmFuc2l0aW9uaW5nT3V0J10sCisKKyAgICAvKioKKyAgICAgIEJ5IGRl
ZmF1bHQgdGhlIGB7e2xpbmstdG99fWAgY29tcG9uZW50IHJlc3BvbmRzIHRvIHRoZSBgY2xpY2tg
IGV2ZW50LiBZb3UKKyAgICAgIGNhbiBvdmVycmlkZSB0aGlzIGdsb2JhbGx5IGJ5IHNldHRpbmcg
dGhpcyBwcm9wZXJ0eSB0byB5b3VyIGN1c3RvbQorICAgICAgZXZlbnQgbmFtZS4KKyAgICAgICBU
aGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgb24gbW9iaWxlIHdoZW4gb25lIHdhbnRzIHRvIGF2
b2lkIHRoZSAzMDBtcworICAgICAgY2xpY2sgZGVsYXkgdXNpbmcgc29tZSBzb3J0IG9mIGN1c3Rv
bSBgdGFwYCBldmVudC4KKyAgICAgICBAcHJvcGVydHkgZXZlbnROYW1lCisgICAgICBAdHlwZSBT
dHJpbmcKKyAgICAgIEBkZWZhdWx0IGNsaWNrCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAg
ZXZlbnROYW1lOiAnY2xpY2snLAorCisgICAgLy8gdGhpcyBpcyBkb2MnZWQgaGVyZSBzbyBpdCBz
aG93cyB1cCBpbiB0aGUgZXZlbnRzCisgICAgLy8gc2VjdGlvbiBvZiB0aGUgQVBJIGRvY3VtZW50
YXRpb24sIHdoaWNoIGlzIHdoZXJlCisgICAgLy8gcGVvcGxlIHdpbGwgbGlrZWx5IGdvIGxvb2tp
bmcgZm9yIGl0LgorICAgIC8qKgorICAgICAgVHJpZ2dlcnMgdGhlIGBMaW5rQ29tcG9uZW50YCdz
IHJvdXRpbmcgYmVoYXZpb3IuIElmCisgICAgICBgZXZlbnROYW1lYCBpcyBjaGFuZ2VkIHRvIGEg
dmFsdWUgb3RoZXIgdGhhbiBgY2xpY2tgCisgICAgICB0aGUgcm91dGluZyBiZWhhdmlvciB3aWxs
IHRyaWdnZXIgb24gdGhhdCBjdXN0b20gZXZlbnQKKyAgICAgIGluc3RlYWQuCisgICAgICAgQGV2
ZW50IGNsaWNrCisgICAgICBAcHJpdmF0ZQorICAgICovCisKKyAgICAvKioKKyAgICAgIEFuIG92
ZXJyaWRhYmxlIG1ldGhvZCBjYWxsZWQgd2hlbiBgTGlua0NvbXBvbmVudGAgb2JqZWN0cyBhcmUg
aW5zdGFudGlhdGVkLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgQXBwLk15TGlua0NvbXBvbmVudCA9IEVtYmVyLkxpbmtDb21wb25lbnQuZXh0ZW5kKHsKKyAg
ICAgICAgaW5pdDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIoLi4uYXJndW1l
bnRzKTsKKyAgICAgICAgICBFbWJlci5Mb2dnZXIubG9nKCdFdmVudCBpcyAnICsgdGhpcy5nZXQo
J2V2ZW50TmFtZScpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBO
T1RFOiBJZiB5b3UgZG8gb3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1ld29yayBjbGFzcyBsaWtl
IGBFbWJlci5WaWV3YCwKKyAgICAgIGJlIHN1cmUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoLi4uYXJn
dW1lbnRzKWAgaW4geW91cgorICAgICAgYGluaXRgIGRlY2xhcmF0aW9uISBJZiB5b3UgZG9uJ3Qs
IEVtYmVyIG1heSBub3QgaGF2ZSBhbiBvcHBvcnR1bml0eSB0bworICAgICAgZG8gaW1wb3J0YW50
IHNldHVwIHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFuZ2UgYmVoYXZpb3IgaW4geW91cgorICAg
ICAgYXBwbGljYXRpb24uCisgICAgICAgQG1ldGhvZCBpbml0CisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKworICAgICAgLy8gTWFwIGRlc2lyZWQgZXZlbnQgbmFtZSB0byBpbnZv
a2UgZnVuY3Rpb24KKyAgICAgIHZhciBldmVudE5hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2V2ZW50TmFtZScpOworICAgICAgdGhpcy5vbihldmVudE5hbWUsIHRoaXMs
IHRoaXMuX2ludm9rZSk7CisgICAgfSwKKworICAgIF9yb3V0aW5nOiBfZW1iZXJSdW50aW1lSW5q
ZWN0LmRlZmF1bHQuc2VydmljZSgnLXJvdXRpbmcnKSwKKworICAgIC8qKgorICAgICAgQWNjZXNz
ZWQgYXMgYSBjbGFzc25hbWUgYmluZGluZyB0byBhcHBseSB0aGUgYExpbmtDb21wb25lbnRgJ3Mg
YGRpc2FibGVkQ2xhc3NgCisgICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVuIHRo
ZSBsaW5rIGlzIGRpc2FibGVkLgorICAgICAgIFdoZW4gYHRydWVgIGludGVyYWN0aW9ucyB3aXRo
IHRoZSBlbGVtZW50IHdpbGwgbm90IHRyaWdnZXIgcm91dGUgY2hhbmdlcy4KKyAgICAgIEBwcm9w
ZXJ0eSBkaXNhYmxlZAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGRpc2FibGVkOiBfZW1i
ZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICAgIGdldDogZnVuY3Rpb24gKGtleSwgdmFs
dWUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rp
b24gKGtleSwgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKKyAg
ICAgICAgICB0aGlzLnNldCgnX2lzRGlzYWJsZWQnLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAg
ICAgICByZXR1cm4gdmFsdWUgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Rp
c2FibGVkQ2xhc3MnKSA6IGZhbHNlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2NvbXB1dGVB
Y3RpdmU6IGZ1bmN0aW9uIChyb3V0ZXJTdGF0ZSkgeworICAgICAgaWYgKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbG9hZGluZycpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgIH0KKworICAgICAgdmFyIHJvdXRpbmcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ19yb3V0aW5nJyk7CisgICAgICB2YXIgbW9kZWxzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKyAgICAgIHZhciByZXNvbHZlZFF1ZXJ5UGFy
YW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyZXNvbHZlZFF1ZXJ5UGFy
YW1zJyk7CisKKyAgICAgIHZhciBjdXJyZW50V2hlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY3VycmVudC13aGVuJyk7CisgICAgICB2YXIgaXNDdXJyZW50V2hlblNwZWNp
ZmllZCA9ICEhY3VycmVudFdoZW47CisgICAgICBjdXJyZW50V2hlbiA9IGN1cnJlbnRXaGVuIHx8
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7
CisgICAgICBjdXJyZW50V2hlbiA9IGN1cnJlbnRXaGVuLnNwbGl0KCcgJyk7CisKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBsZW4gPSBjdXJyZW50V2hlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykgewor
ICAgICAgICBpZiAocm91dGluZy5pc0FjdGl2ZUZvclJvdXRlKG1vZGVscywgcmVzb2x2ZWRRdWVy
eVBhcmFtcywgY3VycmVudFdoZW5baV0sIHJvdXRlclN0YXRlLCBpc0N1cnJlbnRXaGVuU3BlY2lm
aWVkKSkgeworICAgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ2FjdGl2ZUNsYXNzJyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJp
bmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rQ29tcG9uZW50YCdzIGBhY3RpdmVDbGFzc2AKKyAgICAg
IENTUyBgY2xhc3NgIHRvIHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZlLgorICAg
ICAgIEEgYExpbmtDb21wb25lbnRgIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4gaXRzIGBjdXJy
ZW50V2hlbmAgcHJvcGVydHkgaXMgYHRydWVgCisgICAgICBvciB0aGUgYXBwbGljYXRpb24ncyBj
dXJyZW50IHJvdXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtDb21wb25lbnRgIHdvdWxkIHRyaWdn
ZXIKKyAgICAgIHRyYW5zaXRpb25zIGludG8uCisgICAgICAgVGhlIGBjdXJyZW50V2hlbmAgcHJv
cGVydHkgY2FuIG1hdGNoIGFnYWluc3QgbXVsdGlwbGUgcm91dGVzIGJ5IHNlcGFyYXRpbmcKKyAg
ICAgIHJvdXRlIG5hbWVzIHVzaW5nIHRoZSBgIGAgKHNwYWNlKSBjaGFyYWN0ZXIuCisgICAgICAg
QHByb3BlcnR5IGFjdGl2ZQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGFjdGl2ZTogX2Vt
YmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnYXR0cnMucGFyYW1zJywgJ19yb3V0aW5nLmN1cnJl
bnRTdGF0ZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9Db21wb25lbnRBY3RpdmUoKSB7CisgICAg
ICB2YXIgY3VycmVudFN0YXRlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdf
cm91dGluZy5jdXJyZW50U3RhdGUnKTsKKyAgICAgIGlmICghY3VycmVudFN0YXRlKSB7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVB
Y3RpdmUoY3VycmVudFN0YXRlKTsKKyAgICB9KSwKKworICAgIHdpbGxCZUFjdGl2ZTogX2VtYmVy
TWV0YWxDb21wdXRlZC5jb21wdXRlZCgnX3JvdXRpbmcudGFyZ2V0U3RhdGUnLCBmdW5jdGlvbiBj
b21wdXRlTGlua1RvQ29tcG9uZW50V2lsbEJlQWN0aXZlKCkgeworICAgICAgdmFyIHJvdXRpbmcg
PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ19yb3V0aW5nJyk7CisgICAgICB2
YXIgdGFyZ2V0U3RhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGluZywgJ3Rh
cmdldFN0YXRlJyk7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRp
bmcsICdjdXJyZW50U3RhdGUnKSA9PT0gdGFyZ2V0U3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgfQorCisgICAgICByZXR1cm4gISF0aGlzLl9jb21wdXRlQWN0aXZlKHRhcmdldFN0YXRl
KTsKKyAgICB9KSwKKworICAgIHRyYW5zaXRpb25pbmdJbjogX2VtYmVyTWV0YWxDb21wdXRlZC5j
b21wdXRlZCgnYWN0aXZlJywgJ3dpbGxCZUFjdGl2ZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9D
b21wb25lbnRUcmFuc2l0aW9uaW5nSW4oKSB7CisgICAgICB2YXIgd2lsbEJlQWN0aXZlID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd3aWxsQmVBY3RpdmUnKTsKKyAgICAgIGlm
ICh0eXBlb2Ygd2lsbEJlQWN0aXZlID09PSAndW5kZWZpbmVkJykgeworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiAhX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdhY3RpdmUnKSAmJiB3aWxsQmVBY3RpdmUgJiYgJ2VtYmVyLXRyYW5zaXRpb25p
bmctaW4nOworICAgIH0pLAorCisgICAgdHJhbnNpdGlvbmluZ091dDogX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZCgnYWN0aXZlJywgJ3dpbGxCZUFjdGl2ZScsIGZ1bmN0aW9uIGNvbXB1dGVM
aW5rVG9Db21wb25lbnRUcmFuc2l0aW9uaW5nT3V0KCkgeworICAgICAgdmFyIHdpbGxCZUFjdGl2
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnd2lsbEJlQWN0aXZlJyk7Cisg
ICAgICBpZiAodHlwZW9mIHdpbGxCZUFjdGl2ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdhY3RpdmUnKSAmJiAhd2lsbEJlQWN0aXZlICYmICdlbWJlci10cmFu
c2l0aW9uaW5nLW91dCc7CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIEV2ZW50IGhhbmRsZXIg
dGhhdCBpbnZva2VzIHRoZSBsaW5rLCBhY3RpdmF0aW5nIHRoZSBhc3NvY2lhdGVkIHJvdXRlLgor
ICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIF9pbnZva2UKKyAgICAgIEBwYXJhbSB7RXZl
bnR9IGV2ZW50CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgX2ludm9rZTogZnVuY3Rpb24g
KGV2ZW50KSB7CisgICAgICBpZiAoIV9lbWJlclZpZXdzU3lzdGVtVXRpbHMuaXNTaW1wbGVDbGlj
ayhldmVudCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZhciBw
cmV2ZW50RGVmYXVsdCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncHJldmVu
dERlZmF1bHQnKTsKKyAgICAgIHZhciB0YXJnZXRBdHRyaWJ1dGUgPSBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQodGhpcywgJ3RhcmdldCcpOworCisgICAgICBpZiAocHJldmVudERlZmF1bHQg
IT09IGZhbHNlKSB7CisgICAgICAgIGlmICghdGFyZ2V0QXR0cmlidXRlIHx8IHRhcmdldEF0dHJp
YnV0ZSA9PT0gJ19zZWxmJykgeworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnYnViYmxlcycpID09PSBmYWxzZSkgeworICAgICAgICBldmVudC5zdG9wUHJvcGFn
YXRpb24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnX2lzRGlzYWJsZWQnKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9
CisKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmcn
KSkgeworICAgICAgICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0Lndhcm4oJ1RoaXMgbGluay10
byBpcyBpbiBhbiBpbmFjdGl2ZSBsb2FkaW5nIHN0YXRlIGJlY2F1c2UgYXQgbGVhc3Qgb25lIG9m
IGl0cyBwYXJhbWV0ZXJzIHByZXNlbnRseSBoYXMgYSBudWxsL3VuZGVmaW5lZCB2YWx1ZSwgb3Ig
dGhlIHByb3ZpZGVkIHJvdXRlIG5hbWUgaXMgaW52YWxpZC4nKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICBpZiAodGFyZ2V0QXR0cmlidXRlICYmIHRhcmdldEF0dHJp
YnV0ZSAhPT0gJ19zZWxmJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAg
ICAgIHZhciByb3V0aW5nID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcm91
dGluZycpOworICAgICAgdmFyIHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAgICB2YXIgbW9kZWxz
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKyAgICAgIHZh
ciBxdWVyeVBhcmFtVmFsdWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdx
dWVyeVBhcmFtcy52YWx1ZXMnKTsKKyAgICAgIHZhciBzaG91bGRSZXBsYWNlID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyZXBsYWNlJyk7CisKKyAgICAgIHJvdXRpbmcudHJh
bnNpdGlvblRvKHF1YWxpZmllZFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtVmFsdWVzLCBz
aG91bGRSZXBsYWNlKTsKKyAgICB9LAorCisgICAgcXVlcnlQYXJhbXM6IG51bGwsCisKKyAgICBx
dWFsaWZpZWRSb3V0ZU5hbWU6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoJ3RhcmdldFJv
dXRlTmFtZScsICdfcm91dGluZy5jdXJyZW50U3RhdGUnLCBmdW5jdGlvbiBjb21wdXRlTGlua1Rv
Q29tcG9uZW50UXVhbGlmaWVkUm91dGVOYW1lKCkgeworICAgICAgdmFyIHBhcmFtcyA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncGFyYW1zJykuc2xpY2UoKTsKKyAgICAgIHZh
ciBsYXN0UGFyYW0gPSBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdOworICAgICAgaWYgKGxhc3RQ
YXJhbSAmJiBsYXN0UGFyYW0uaXNRdWVyeVBhcmFtcykgeworICAgICAgICBwYXJhbXMucG9wKCk7
CisgICAgICB9CisgICAgICB2YXIgb25seVF1ZXJ5UGFyYW1zU3VwcGxpZWQgPSB0aGlzW19lbWJl
ckh0bWxiYXJzTm9kZU1hbmFnZXJzQ29tcG9uZW50Tm9kZU1hbmFnZXIuSEFTX0JMT0NLXSA/IHBh
cmFtcy5sZW5ndGggPT09IDAgOiBwYXJhbXMubGVuZ3RoID09PSAxOworICAgICAgaWYgKG9ubHlR
dWVyeVBhcmFtc1N1cHBsaWVkKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ19yb3V0aW5nLmN1cnJlbnRSb3V0ZU5hbWUnKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3RhcmdldFJvdXRl
TmFtZScpOworICAgIH0pLAorCisgICAgcmVzb2x2ZWRRdWVyeVBhcmFtczogX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZCgncXVlcnlQYXJhbXMnLCBmdW5jdGlvbiBjb21wdXRlTGlua1RvQ29t
cG9uZW50UmVzb2x2ZWRRdWVyeVBhcmFtcygpIHsKKyAgICAgIHZhciByZXNvbHZlZFF1ZXJ5UGFy
YW1zID0ge307CisgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ3F1ZXJ5UGFyYW1zJyk7CisKKyAgICAgIGlmICghcXVlcnlQYXJhbXMpIHsK
KyAgICAgICAgcmV0dXJuIHJlc29sdmVkUXVlcnlQYXJhbXM7CisgICAgICB9CisKKyAgICAgIHZh
ciB2YWx1ZXMgPSBxdWVyeVBhcmFtcy52YWx1ZXM7CisgICAgICBmb3IgKHZhciBrZXkgaW4gdmFs
dWVzKSB7CisgICAgICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlZFF1ZXJ5UGFyYW1zW2tl
eV0gPSB2YWx1ZXNba2V5XTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc29sdmVkUXVlcnlQ
YXJhbXM7CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIFNldHMgdGhlIGVsZW1lbnQncyBgaHJl
ZmAgYXR0cmlidXRlIHRvIHRoZSB1cmwgZm9yCisgICAgICB0aGUgYExpbmtDb21wb25lbnRgJ3Mg
dGFyZ2V0ZWQgcm91dGUuCisgICAgICAgSWYgdGhlIGBMaW5rQ29tcG9uZW50YCdzIGB0YWdOYW1l
YCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3RoZXIKKyAgICAgIHRoYW4gYGFgLCB0aGlzIHByb3Bl
cnR5IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICBAcHJvcGVydHkgaHJlZgorICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIGhyZWY6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoJ21vZGVs
cycsICdxdWFsaWZpZWRSb3V0ZU5hbWUnLCBmdW5jdGlvbiBjb21wdXRlTGlua1RvQ29tcG9uZW50
SHJlZigpIHsKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Rh
Z05hbWUnKSAhPT0gJ2EnKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFy
IHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
cXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAgICB2YXIgbW9kZWxzID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdtb2RlbHMnKTsKKworICAgICAgaWYgKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbG9hZGluZycpKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmdIcmVmJyk7CisgICAgICB9CisKKyAg
ICAgIHZhciByb3V0aW5nID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcm91
dGluZycpOworICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdxdWVyeVBhcmFtcy52YWx1ZXMnKTsKKyAgICAgIHJldHVybiByb3V0aW5nLmdl
bmVyYXRlVVJMKHF1YWxpZmllZFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcyk7CisgICAg
fSksCisKKyAgICBsb2FkaW5nOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKCdfbW9kZWxz
QXJlTG9hZGVkJywgJ3F1YWxpZmllZFJvdXRlTmFtZScsIGZ1bmN0aW9uIGNvbXB1dGVMaW5rVG9D
b21wb25lbnRMb2FkaW5nKCkgeworICAgICAgdmFyIHF1YWxpZmllZFJvdXRlTmFtZSA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVhbGlmaWVkUm91dGVOYW1lJyk7CisgICAg
ICB2YXIgbW9kZWxzQXJlTG9hZGVkID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdfbW9kZWxzQXJlTG9hZGVkJyk7CisKKyAgICAgIGlmICghbW9kZWxzQXJlTG9hZGVkIHx8IHF1
YWxpZmllZFJvdXRlTmFtZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQodGhpcywgJ2xvYWRpbmdDbGFzcycpOworICAgICAgfQorICAgIH0pLAor
CisgICAgX21vZGVsc0FyZUxvYWRlZDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnbW9k
ZWxzJywgZnVuY3Rpb24gY29tcHV0ZUxpbmtUb0NvbXBvbmVudE1vZGVsc0FyZUxvYWRlZCgpIHsK
KyAgICAgIHZhciBtb2RlbHMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ21v
ZGVscycpOworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBtb2RlbHMubGVuZ3RoOyBpIDwgbDsg
aSsrKSB7CisgICAgICAgIGlmIChtb2RlbHNbaV0gPT0gbnVsbCkgeworICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
KSwKKworICAgIF9nZXRNb2RlbHM6IGZ1bmN0aW9uIChwYXJhbXMpIHsKKyAgICAgIHZhciBtb2Rl
bENvdW50ID0gcGFyYW1zLmxlbmd0aCAtIDE7CisgICAgICB2YXIgbW9kZWxzID0gbmV3IEFycmF5
KG1vZGVsQ291bnQpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsQ291bnQ7IGkr
KykgeworICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbXNbaSArIDFdOworCisgICAgICAgIHdoaWxl
IChfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdCh2YWx1ZSkpIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnUHJvdmlkaW5nIGB7e2xpbmst
dG99fWAgd2l0aCBhIHBhcmFtIHRoYXQgaXMgd3JhcHBlZCBpbiBhIGNvbnRyb2xsZXIgaXMgZGVw
cmVjYXRlZC4gJyArICh0aGlzLnBhcmVudFZpZXcgPyAnUGxlYXNlIHVwZGF0ZSBgJyArIHRoaXMu
cGFyZW50VmlldyArICdgIHRvIHVzZSBge3tsaW5rLXRvICJwb3N0IiBzb21lQ29udHJvbGxlci5t
b2RlbH19YCBpbnN0ZWFkLicgOiAnJyksIGZhbHNlLCB7IGlkOiAnZW1iZXItcm91dGluZy12aWV3
cy5jb250cm9sbGVyLXdyYXBwZWQtcGFyYW0nLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgICAg
ICB2YWx1ZSA9IHZhbHVlLmdldCgnbW9kZWwnKTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGVs
c1tpXSA9IHZhbHVlOworICAgICAgfQorCisgICAgICByZXR1cm4gbW9kZWxzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8gdXNlIHdoaWxlIGEgbGlu
ay10byBpcyBsb2FkaW5nLgorICAgICAgT25seSBhcHBsaWVzIHdoZW4gdGFnTmFtZSBpcyAnYScK
KyAgICAgICBAcHJvcGVydHkgbG9hZGluZ0hyZWYKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAg
QGRlZmF1bHQgIworICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGxvYWRpbmdIcmVmOiAnIycs
CisKKyAgICB3aWxsUmVuZGVyOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVlcnlQYXJhbXMg
PSB1bmRlZmluZWQ7CisKKyAgICAgIC8vIERvIG5vdCBtdXRhdGUgcGFyYW1zIGluIHBsYWNlCisg
ICAgICB2YXIgcGFyYW1zID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdwYXJh
bXMnKS5zbGljZSgpOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IG11c3Qg
cHJvdmlkZSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHRvIHRoZSBsaW5rLXRvIGNvbXBvbmVudC4n
LCBwYXJhbXMubGVuZ3RoKTsKKworICAgICAgdmFyIGRpc2FibGVkV2hlbiA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnZGlzYWJsZWRXaGVuJyk7CisgICAgICBpZiAoZGlzYWJs
ZWRXaGVuICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGhpcy5zZXQoJ2Rpc2FibGVkJywgZGlz
YWJsZWRXaGVuKTsKKyAgICAgIH0KKworICAgICAgLy8gUHJvY2VzcyB0aGUgcG9zaXRpb25hbCBh
cmd1bWVudHMsIGluIG9yZGVyLgorICAgICAgLy8gMS4gSW5saW5lIGxpbmsgdGl0bGUgY29tZXMg
Zmlyc3QsIGlmIHByZXNlbnQuCisgICAgICBpZiAoIXRoaXNbX2VtYmVySHRtbGJhcnNOb2RlTWFu
YWdlcnNDb21wb25lbnROb2RlTWFuYWdlci5IQVNfQkxPQ0tdKSB7CisgICAgICAgIHRoaXMuc2V0
KCdsaW5rVGl0bGUnLCBwYXJhbXMuc2hpZnQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIDIuIGB0
YXJnZXRSb3V0ZU5hbWVgIGlzIG5vdyBhbHdheXMgYXQgaW5kZXggMC4KKyAgICAgIHRoaXMuc2V0
KCd0YXJnZXRSb3V0ZU5hbWUnLCBwYXJhbXNbMF0pOworCisgICAgICAvLyAzLiBUaGUgbGFzdCBh
cmd1bWVudCAoaWYgc3RpbGwgcmVtYWluaW5nKSBpcyB0aGUgYHF1ZXJ5UGFyYW1zYCBvYmplY3Qu
CisgICAgICB2YXIgbGFzdFBhcmFtID0gcGFyYW1zW3BhcmFtcy5sZW5ndGggLSAxXTsKKworICAg
ICAgaWYgKGxhc3RQYXJhbSAmJiBsYXN0UGFyYW0uaXNRdWVyeVBhcmFtcykgeworICAgICAgICBx
dWVyeVBhcmFtcyA9IHBhcmFtcy5wb3AoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHF1ZXJ5
UGFyYW1zID0ge307CisgICAgICB9CisgICAgICB0aGlzLnNldCgncXVlcnlQYXJhbXMnLCBxdWVy
eVBhcmFtcyk7CisKKyAgICAgIC8vIDQuIEFueSByZW1haW5pbmcgaW5kaWNlcyAoZXhjZXB0aW5n
IGB0YXJnZXRSb3V0ZU5hbWVgIGF0IDApIGFyZSBgbW9kZWxzYC4KKyAgICAgIGlmIChwYXJhbXMu
bGVuZ3RoID4gMSkgeworICAgICAgICB0aGlzLnNldCgnbW9kZWxzJywgdGhpcy5fZ2V0TW9kZWxz
KHBhcmFtcykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zZXQoJ21vZGVscycsIFtd
KTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIExpbmtDb21wb25lbnQudG9TdHJpbmcgPSBm
dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuICdMaW5rQ29tcG9uZW50JzsKKyAgfTsKKworICBMaW5r
Q29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICBwb3NpdGlvbmFsUGFyYW1zOiAncGFyYW1zJwor
ICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBMaW5rQ29tcG9uZW50OworfSk7CisvLyBjcmVh
dGVzIGluamVjdC5zZXJ2aWNlCitlbmlmZWQoJ2VtYmVyLXJvdXRpbmctdmlld3MvaW5kZXgnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1yb3V0aW5nLXZpZXdzL2NvbXBv
bmVudHMvbGluay10bycsICdlbWJlci1yb3V0aW5nLXZpZXdzL3ZpZXdzL291dGxldCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJSb3V0aW5nVmlld3NDb21wb25l
bnRzTGlua1RvLCBfZW1iZXJSb3V0aW5nVmlld3NWaWV3c091dGxldCkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmctdmlld3MKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuTGlua0NvbXBvbmVudCA9
IF9lbWJlclJvdXRpbmdWaWV3c0NvbXBvbmVudHNMaW5rVG8uZGVmYXVsdDsKKyAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQuT3V0bGV0VmlldyA9IF9lbWJlclJvdXRpbmdWaWV3c1ZpZXdzT3V0bGV0
Lk91dGxldFZpZXc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy12aWV3cy92aWV3cy9vdXRsZXQnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItdmlld3Mvdmlld3MvdmlldycsICdlbWJlci1odG1sYmFycy90ZW1wbGF0
ZXMvdG9wLWxldmVsLXZpZXcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzVmlld3NW
aWV3LCBfZW1iZXJIdG1sYmFyc1RlbXBsYXRlc1RvcExldmVsVmlldykgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmctdmlld3MKKyAgKi8KKworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIENvcmVPdXRsZXRWaWV3ID0gX2VtYmVyVmlld3NWaWV3c1Zp
ZXcuZGVmYXVsdC5leHRlbmQoeworICAgIGRlZmF1bHRUZW1wbGF0ZTogX2VtYmVySHRtbGJhcnNU
ZW1wbGF0ZXNUb3BMZXZlbFZpZXcuZGVmYXVsdCwKKworICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHRoaXMuX3N1cGVyKCk7CisgICAgICB0aGlzLl9vdXRsZXRzID0gW107CisgICAgfSwK
KworICAgIHNldE91dGxldFN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpIHsKKyAgICAgIHRoaXMub3V0
bGV0U3RhdGUgPSB7IG1haW46IHN0YXRlIH07CisKKyAgICAgIGlmICh0aGlzLmVudikgeworICAg
ICAgICB0aGlzLmVudi5vdXRsZXRTdGF0ZSA9IHRoaXMub3V0bGV0U3RhdGU7CisgICAgICB9CisK
KyAgICAgIGlmICh0aGlzLmxhc3RSZXN1bHQpIHsKKyAgICAgICAgdGhpcy5kaXJ0eU91dGxldHMo
KTsKKyAgICAgICAgdGhpcy5fb3V0bGV0cyA9IFtdOworCisgICAgICAgIHRoaXMuc2NoZWR1bGVS
ZXZhbGlkYXRlKG51bGwsIG51bGwpOworICAgICAgfQorICAgIH0sCisKKyAgICBkaXJ0eU91dGxl
dHM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIERpcnR5IGFueSByZW5kZXIgbm9kZXMgdGhhdCBj
b3JyZXNwb25kIHRvIG91dGxldHMKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0
bGV0cy5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlzLl9vdXRsZXRzW2ldLmlzRGlydHkgPSB0
cnVlOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZXhwb3J0cy5Db3JlT3V0bGV0VmlldyA9
IENvcmVPdXRsZXRWaWV3OworICB2YXIgT3V0bGV0VmlldyA9IENvcmVPdXRsZXRWaWV3LmV4dGVu
ZCh7IHRhZ05hbWU6ICcnIH0pOworICBleHBvcnRzLk91dGxldFZpZXcgPSBPdXRsZXRWaWV3Owor
fSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvZXh0L2NvbnRyb2xsZXInLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRyb2xs
ZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJS
dW50aW1lTWl4aW5zQ29udHJvbGxlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBt
b2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisgICovCisKKyAgX2VtYmVy
UnVudGltZU1peGluc0NvbnRyb2xsZXIuZGVmYXVsdC5yZW9wZW4oeworICAgIGNvbmNhdGVuYXRl
ZFByb3BlcnRpZXM6IFsncXVlcnlQYXJhbXMnXSwKKworICAgIC8qKgorICAgICAgRGVmaW5lcyB3
aGljaCBxdWVyeSBwYXJhbWV0ZXJzIHRoZSBjb250cm9sbGVyIGFjY2VwdHMuCisgICAgICBJZiB5
b3UgZ2l2ZSB0aGUgbmFtZXMgYFsnY2F0ZWdvcnknLCdwYWdlJ11gIGl0IHdpbGwgYmluZAorICAg
ICAgdGhlIHZhbHVlcyBvZiB0aGVzZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIHRoZSB2YXJpYWJsZXMK
KyAgICAgIGB0aGlzLmNhdGVnb3J5YCBhbmQgYHRoaXMucGFnZWAKKyAgICAgICBAcHJvcGVydHkg
cXVlcnlQYXJhbXMKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHF1ZXJ5UGFyYW1zOiBudWxs
LAorCisgICAgLyoqCisgICAgICBAcHJvcGVydHkgX3FwRGVsZWdhdGUKKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICBfcXBEZWxlZ2F0ZTogbnVsbCwgLy8gc2V0IGJ5IHJvdXRlCisKKyAgICAv
KioKKyAgICAgIEBtZXRob2QgX3FwQ2hhbmdlZAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAg
IF9xcENoYW5nZWQ6IGZ1bmN0aW9uIChjb250cm9sbGVyLCBfcHJvcCkgeworICAgICAgdmFyIHBy
b3AgPSBfcHJvcC5zdWJzdHIoMCwgX3Byb3AubGVuZ3RoIC0gMyk7CisKKyAgICAgIHZhciBkZWxl
Z2F0ZSA9IGNvbnRyb2xsZXIuX3FwRGVsZWdhdGU7CisgICAgICB2YXIgdmFsdWUgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoY29udHJvbGxlciwgcHJvcCk7CisgICAgICBkZWxlZ2F0ZShw
cm9wLCB2YWx1ZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVHJhbnNpdGlvbiB0aGUgYXBw
bGljYXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBUaGUgcm91dGUgbWF5CisgICAgICBiZSBlaXRo
ZXIgYSBzaW5nbGUgcm91dGUgb3Igcm91dGUgcGF0aDoKKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzJyk7CisgICAgICBh
Q29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsK
KyAgICAgIGBgYAorICAgICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0
ZSBpbiBxdWVzdGlvbi4gVGhlIG1vZGVsCisgICAgICB3aWxsIGJlIHNlcmlhbGl6ZWQgaW50byB0
aGUgVVJMIHVzaW5nIHRoZSBgc2VyaWFsaXplYCBob29rIG9mCisgICAgICB0aGUgcm91dGU6Cisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUo
J2Jsb2dQb3N0JywgYVBvc3QpOworICAgICAgYGBgCisgICAgICAgSWYgYSBsaXRlcmFsIGlzIHBh
c3NlZCAoc3VjaCBhcyBhIG51bWJlciBvciBhIHN0cmluZyksIGl0IHdpbGwKKyAgICAgIGJlIHRy
ZWF0ZWQgYXMgYW4gaWRlbnRpZmllciBpbnN0ZWFkLiBJbiB0aGlzIGNhc2UsIHRoZSBgbW9kZWxg
CisgICAgICBob29rIG9mIHRoZSByb3V0ZSB3aWxsIGJlIHRyaWdnZXJlZDoKKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3Qn
LCAxKTsKKyAgICAgIGBgYAorICAgICAgIE11bHRpcGxlIG1vZGVscyB3aWxsIGJlIGFwcGxpZWQg
bGFzdCB0byBmaXJzdCByZWN1cnNpdmVseSB1cCB0aGUKKyAgICAgIHJvdXRlIHRyZWUuCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAg
ICAgIHRoaXMucm91dGUoJ2Jsb2dQb3N0JywgeyBwYXRoOiAnOmJsb2dQb3N0SWQnIH0sIGZ1bmN0
aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ2Jsb2dDb21tZW50JywgeyBwYXRoOiAnOmJs
b2dDb21tZW50SWQnLCByZXNldE5hbWVzcGFjZTogdHJ1ZSB9KTsKKyAgICAgICAgfSk7CisgICAg
ICB9KTsKKyAgICAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ0NvbW1lbnQn
LCBhUG9zdCwgYUNvbW1lbnQpOworICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUo
J2Jsb2dDb21tZW50JywgMSwgMTMpOworICAgICAgYGBgCisgICAgICAgSXQgaXMgYWxzbyBwb3Nz
aWJsZSB0byBwYXNzIGEgVVJMIChhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGEKKyAgICAgIGAv
YCkuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcyBh
bmQKKyAgICAgIHNob3VsZCByYXJlbHkgYmUgdXNlZCBpbiBwcm9kdWN0aW9uIGNvZGUuCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJy8n
KTsKKyAgICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCcvYmxvZy9wb3N0LzEvY29t
bWVudC8xMycpOworICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJy9ibG9nL3Bv
c3RzP3NvcnQ9dGl0bGUnKTsKKyAgICAgIGBgYAorICAgICAgIEFuIG9wdGlvbnMgaGFzaCB3aXRo
IGEgYHF1ZXJ5UGFyYW1zYCBwcm9wZXJ0eSBtYXkgYmUgcHJvdmlkZWQgYXMKKyAgICAgIHRoZSBm
aW5hbCBhcmd1bWVudCB0byBhZGQgcXVlcnkgcGFyYW1ldGVycyB0byB0aGUgZGVzdGluYXRpb24g
VVJMLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIGFDb250cm9sbGVyLnRyYW5zaXRpb25U
b1JvdXRlKCdibG9nUG9zdCcsIDEsIHsKKyAgICAgICAgcXVlcnlQYXJhbXM6IHtzaG93Q29tbWVu
dHM6ICd0cnVlJ30KKyAgICAgIH0pOworICAgICAgIC8vIGlmIHlvdSBqdXN0IHdhbnQgdG8gdHJh
bnNpdGlvbiB0aGUgcXVlcnkgcGFyYW1ldGVycyB3aXRob3V0IGNoYW5naW5nIHRoZSByb3V0ZQor
ICAgICAgYUNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoe3F1ZXJ5UGFyYW1zOiB7c29ydDog
J2RhdGUnfX0pOworICAgICAgYGBgCisgICAgICAgU2VlIGFsc28gW3JlcGxhY2VSb3V0ZV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLkNvbnRyb2xsZXJNaXhpbi5odG1sI21ldGhvZF9yZXBsYWNlUm91dGUp
LgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZSBvciBh
IFVSTAorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgb3IgaWRl
bnRpZmllcihzKSB0byBiZSB1c2VkCisgICAgICAgIHdoaWxlIHRyYW5zaXRpb25pbmcgdG8gdGhl
IHJvdXRlLgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBoYXNoIHdp
dGggYSBxdWVyeVBhcmFtcyBwcm9wZXJ0eQorICAgICAgICBjb250YWluaW5nIGEgbWFwcGluZyBv
ZiBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICBAZm9yIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgorICAg
ICAgQG1ldGhvZCB0cmFuc2l0aW9uVG9Sb3V0ZQorICAgICAgQHB1YmxpYworICAgICovCisgICAg
dHJhbnNpdGlvblRvUm91dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIHRhcmdldCBtYXkgYmUg
ZWl0aGVyIGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgorICAgICAgdmFyIHRhcmdldCA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGFyZ2V0Jyk7CisgICAgICB2YXIg
bWV0aG9kID0gdGFyZ2V0LnRyYW5zaXRpb25Ub1JvdXRlIHx8IHRhcmdldC50cmFuc2l0aW9uVG87
CisgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZSB3aGlsZSByZXBs
YWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KKyAgICAgIFRoaXMgd2lsbCByZXBs
YWNlIHRoZSBjdXJyZW50IGhpc3RvcnkgZW50cnkgaW5zdGVhZCBvZiBhZGRpbmcgYSBuZXcgb25l
LgorICAgICAgQmVzaWRlIHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBgdHJhbnNpdGlvblRvUm91
dGVgIGluIGFsbCBvdGhlciByZXNwZWN0cy4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBh
Q29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0cycpOworICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCdibG9nUG9zdHMucmVjZW50RW50cmllcycpOworICAgICAgYGBgCisgICAg
ICAgT3B0aW9uYWxseSBzdXBwbHkgYSBtb2RlbCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBU
aGUgbW9kZWwKKyAgICAgIHdpbGwgYmUgc2VyaWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhl
IGBzZXJpYWxpemVgIGhvb2sgb2YKKyAgICAgIHRoZSByb3V0ZToKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgYVBvc3QpOwor
ICAgICAgYGBgCisgICAgICAgSWYgYSBsaXRlcmFsIGlzIHBhc3NlZCAoc3VjaCBhcyBhIG51bWJl
ciBvciBhIHN0cmluZyksIGl0IHdpbGwKKyAgICAgIGJlIHRyZWF0ZWQgYXMgYW4gaWRlbnRpZmll
ciBpbnN0ZWFkLiBJbiB0aGlzIGNhc2UsIHRoZSBgbW9kZWxgCisgICAgICBob29rIG9mIHRoZSBy
b3V0ZSB3aWxsIGJlIHRyaWdnZXJlZDoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBhQ29u
dHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgMSk7CisgICAgICBgYGAKKyAgICAgICBN
dWx0aXBsZSBtb2RlbHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkg
dXAgdGhlCisgICAgICByb3V0ZSB0cmVlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdibG9nUG9zdCcs
IHsgcGF0aDogJzpibG9nUG9zdElkJyB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aGlzLnJv
dXRlKCdibG9nQ29tbWVudCcsIHsgcGF0aDogJzpibG9nQ29tbWVudElkJywgcmVzZXROYW1lc3Bh
Y2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCdibG9nQ29tbWVudCcsIGFQb3N0LCBhQ29tbWVudCk7CisgICAgICBhQ29u
dHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dDb21tZW50JywgMSwgMTMpOworICAgICAgYGBgCisg
ICAgICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgVVJMIChhIHN0cmluZyB0aGF0IHN0
YXJ0cyB3aXRoIGEKKyAgICAgIGAvYCkuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5k
IGRlYnVnZ2luZyBwdXJwb3NlcyBhbmQKKyAgICAgIHNob3VsZCByYXJlbHkgYmUgdXNlZCBpbiBw
cm9kdWN0aW9uIGNvZGUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgYUNvbnRyb2xsZXIu
cmVwbGFjZVJvdXRlKCcvJyk7CisgICAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJy9ibG9n
L3Bvc3QvMS9jb21tZW50LzEzJyk7CisgICAgICBgYGAKKyAgICAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgb3IgYSBVUkwKKyAgICAgIEBwYXJhbSB7Li4uT2Jq
ZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIG9yIGlkZW50aWZpZXIocykgdG8gYmUgdXNlZAorICAg
ICAgd2hpbGUgdHJhbnNpdGlvbmluZyB0byB0aGUgcm91dGUuCisgICAgICBAZm9yIEVtYmVyLkNv
bnRyb2xsZXJNaXhpbgorICAgICAgQG1ldGhvZCByZXBsYWNlUm91dGUKKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICByZXBsYWNlUm91dGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIHRhcmdl
dCBtYXkgYmUgZWl0aGVyIGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgorICAgICAgdmFy
IHRhcmdldCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGFyZ2V0Jyk7Cisg
ICAgICB2YXIgbWV0aG9kID0gdGFyZ2V0LnJlcGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdp
dGg7CisgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9s
bGVyLmRlZmF1bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9leHQvcnVuX2xvb3AnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsUnVuX2xvb3ApIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9kdWxl
IGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKworICAvLyBBZGQgYSBuZXcg
bmFtZWQgcXVldWUgYWZ0ZXIgdGhlICdhY3Rpb25zJyBxdWV1ZSAod2hlcmUgUlNWUCBwcm9taXNl
cworICAvLyByZXNvbHZlKSwgd2hpY2ggaXMgdXNlZCBpbiByb3V0ZXIgdHJhbnNpdGlvbnMgdG8g
cHJldmVudCB1bm5lY2Vzc2FyeQorICAvLyBsb2FkaW5nIHN0YXRlIGVudHJ5IGlmIGFsbCBjb250
ZXh0IHByb21pc2VzIHJlc29sdmUgb24gdGhlCisgIC8vICdhY3Rpb25zJyBxdWV1ZSBmaXJzdC4K
KyAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Ll9hZGRRdWV1ZSgncm91dGVyVHJhbnNpdGlv
bnMnLCAnYWN0aW9ucycpOworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvaW5kZXgnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1yb3V0aW5nL2V4dC9ydW5fbG9vcCcs
ICdlbWJlci1yb3V0aW5nL2V4dC9jb250cm9sbGVyJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24v
YXBpJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vbm9uZV9sb2NhdGlvbicsICdlbWJlci1yb3V0
aW5nL2xvY2F0aW9uL2hhc2hfbG9jYXRpb24nLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi9oaXN0
b3J5X2xvY2F0aW9uJywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2NhdGlvbicsICdl
bWJlci1yb3V0aW5nL3N5c3RlbS9nZW5lcmF0ZV9jb250cm9sbGVyJywgJ2VtYmVyLXJvdXRpbmcv
c3lzdGVtL2NvbnRyb2xsZXJfZm9yJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCcsICdlbWJl
ci1yb3V0aW5nL3N5c3RlbS9yb3V0ZXInLCAnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGUnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUm91dGluZ0V4dFJ1bl9s
b29wLCBfZW1iZXJSb3V0aW5nRXh0Q29udHJvbGxlciwgX2VtYmVyUm91dGluZ0xvY2F0aW9uQXBp
LCBfZW1iZXJSb3V0aW5nTG9jYXRpb25Ob25lX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRp
b25IYXNoX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nTG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLCBf
ZW1iZXJSb3V0aW5nTG9jYXRpb25BdXRvX2xvY2F0aW9uLCBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlciwgX2VtYmVyUm91dGluZ1N5c3RlbUNvbnRyb2xsZXJfZm9yLCBfZW1i
ZXJSb3V0aW5nU3lzdGVtRHNsLCBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGVyLCBfZW1iZXJSb3V0
aW5nU3lzdGVtUm91dGUpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1yb3V0aW5nCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LkxvY2F0aW9uID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uQXBpLmRlZmF1bHQ7Cisg
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkF1dG9Mb2NhdGlvbiA9IF9lbWJlclJvdXRpbmdMb2Nh
dGlvbkF1dG9fbG9jYXRpb24uZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFz
aExvY2F0aW9uID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uSGFzaF9sb2NhdGlvbi5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5IaXN0b3J5TG9jYXRpb24gPSBfZW1iZXJSb3V0aW5n
TG9jYXRpb25IaXN0b3J5X2xvY2F0aW9uLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0Lk5vbmVMb2NhdGlvbiA9IF9lbWJlclJvdXRpbmdMb2NhdGlvbk5vbmVfbG9jYXRpb24uZGVm
YXVsdDsKKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5jb250cm9sbGVyRm9yID0gX2VtYmVy
Um91dGluZ1N5c3RlbUNvbnRyb2xsZXJfZm9yLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LmdlbmVyYXRlQ29udHJvbGxlckZhY3RvcnkgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5OworICBfZW1iZXJNZXRh
bENvcmUuZGVmYXVsdC5nZW5lcmF0ZUNvbnRyb2xsZXIgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2Vu
ZXJhdGVfY29udHJvbGxlci5kZWZhdWx0OworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5Sb3V0
ZXJEU0wgPSBfZW1iZXJSb3V0aW5nU3lzdGVtRHNsLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LlJvdXRlciA9IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXIuZGVmYXVsdDsKKyAg
X2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuUm91dGUgPSBfZW1iZXJSb3V0aW5nU3lzdGVtUm91dGUu
ZGVmYXVsdDsKKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdDsK
K30pOworCisvLyBFUzZUT0RPOiBDbGVhbnVwIG1vZHVsZXMgd2l0aCBzaWRlLWVmZmVjdHMgYmVs
b3cKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi9hcGknLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZW52aXJvbm1lbnQnLCAnZW1iZXItcm91dGlu
Zy9sb2NhdGlvbi91dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBf
ZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVy
LXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAgICBFbWJlci5Mb2NhdGlvbiByZXR1cm5zIGFuIGlu
c3RhbmNlIG9mIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mCisgICAgdGhlIGBsb2NhdGlv
bmAgQVBJLgorICAKKyAgICAjIyBJbXBsZW1lbnRhdGlvbnMKKyAgCisgICAgWW91IGNhbiBwYXNz
IGFuIGltcGxlbWVudGF0aW9uIG5hbWUgKGBoYXNoYCwgYGhpc3RvcnlgLCBgbm9uZWApIHRvIGZv
cmNlIGEKKyAgICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4geW91ciBh
cHBsaWNhdGlvbi4KKyAgCisgICAgIyMjIEhhc2hMb2NhdGlvbgorICAKKyAgICBVc2luZyBgSGFz
aExvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgd2l0aCBhIGAjYCAoaGFzaCBzaWduKSBzZXBhcmF0
aW5nIHRoZQorICAgIHNlcnZlciBzaWRlIFVSTCBwb3J0aW9uIG9mIHRoZSBVUkwgZnJvbSB0aGUg
cG9ydGlvbiB0aGF0IGlzIHVzZWQgYnkgRW1iZXIuCisgICAgVGhpcyByZWxpZXMgdXBvbiB0aGUg
YGhhc2hjaGFuZ2VgIGV2ZW50IGV4aXN0aW5nIGluIHRoZSBicm93c2VyLgorICAKKyAgICBFeGFt
cGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24o
KSB7CisgICAgICB0aGlzLnJvdXRlKCdwb3N0cycsIGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlz
LnJvdXRlKCduZXcnKTsKKyAgICAgIH0pOworICAgIH0pOworICAKKyAgICBBcHAuUm91dGVyLnJl
b3Blbih7CisgICAgICBsb2NhdGlvbjogJ2hhc2gnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvIy9wb3N0cy9uZXdgLgor
ICAKKyAgICAjIyMgSGlzdG9yeUxvY2F0aW9uCisgIAorICAgIFVzaW5nIGBIaXN0b3J5TG9jYXRp
b25gIHJlc3VsdHMgaW4gVVJMcyB0aGF0IGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEKKyAg
ICBzdGFuZGFyZCBVUkwuIFRoaXMgcmVsaWVzIHVwb24gdGhlIGJyb3dzZXIncyBgaGlzdG9yeWAg
QVBJLgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlJv
dXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnJvdXRlKCdwb3N0cycsIGZ1bmN0aW9u
KCkgeworICAgICAgICB0aGlzLnJvdXRlKCduZXcnKTsKKyAgICAgIH0pOworICAgIH0pOworICAK
KyAgICBBcHAuUm91dGVyLnJlb3Blbih7CisgICAgICBsb2NhdGlvbjogJ2hpc3RvcnknCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJs
IG9mIGAvcG9zdHMvbmV3YC4KKyAgCisgICAgS2VlcCBpbiBtaW5kIHRoYXQgeW91ciBzZXJ2ZXIg
bXVzdCBzZXJ2ZSB0aGUgRW1iZXIgYXBwIGF0IGFsbCB0aGUgcm91dGVzIHlvdQorICAgIGRlZmlu
ZS4KKyAgCisgICAgIyMjIEF1dG9Mb2NhdGlvbgorICAKKyAgICBVc2luZyBgQXV0b0xvY2F0aW9u
YCwgdGhlIHJvdXRlciB3aWxsIHVzZSB0aGUgYmVzdCBMb2NhdGlvbiBjbGFzcyBzdXBwb3J0ZWQg
YnkKKyAgICB0aGUgYnJvd3NlciBpdCBpcyBydW5uaW5nIGluLgorICAKKyAgICBCcm93c2VycyB0
aGF0IHN1cHBvcnQgdGhlIGBoaXN0b3J5YCBBUEkgd2lsbCB1c2UgYEhpc3RvcnlMb2NhdGlvbmAs
IHRob3NlIHRoYXQKKyAgICBkbyBub3QsIGJ1dCBzdGlsbCBzdXBwb3J0IHRoZSBgaGFzaGNoYW5n
ZWAgZXZlbnQgd2lsbCB1c2UgYEhhc2hMb2NhdGlvbmAsIGFuZAorICAgIGluIHRoZSByYXJlIGNh
c2UgbmVpdGhlciBpcyBzdXBwb3J0ZWQgd2lsbCB1c2UgYE5vbmVMb2NhdGlvbmAuCisgIAorICAg
IEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgIHRoaXMucm91dGUoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7CisgICAgICAg
IHRoaXMucm91dGUoJ25ldycpOworICAgICAgfSk7CisgICAgfSk7CisgIAorICAgIEFwcC5Sb3V0
ZXIucmVvcGVuKHsKKyAgICAgIGxvY2F0aW9uOiAnYXV0bycKKyAgICB9KTsKKyAgICBgYGAKKyAg
CisgICAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhIHBvc3RzLm5ldyB1cmwgb2YgYC9wb3N0cy9uZXdg
IGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdAorICAgIHN1cHBvcnQgdGhlIGBoaXN0b3J5YCBhcGkg
b3IgYC8jL3Bvc3RzL25ld2AgZm9yIG9sZGVyIG9uZXMsIGxpa2UgSW50ZXJuZXQKKyAgICBFeHBs
b3JlciA5IGFuZCBiZWxvdy4KKyAgCisgICAgV2hlbiBhIHVzZXIgdmlzaXRzIGEgbGluayB0byB5
b3VyIGFwcGxpY2F0aW9uLCB0aGV5IHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgIHVwZ3JhZGVk
IG9yIGRvd25ncmFkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGBMb2NhdGlvbmAgY2xhc3MsIHdpdGgg
dGhlIFVSTAorICAgIHRyYW5zZm9ybWVkIGFjY29yZGluZ2x5LCBpZiBuZWVkZWQuCisgIAorICAg
IEtlZXAgaW4gbWluZCB0aGF0IHNpbmNlIHNvbWUgb2YgeW91ciB1c2VycyB3aWxsIHVzZSBgSGlz
dG9yeUxvY2F0aW9uYCwgeW91cgorICAgIHNlcnZlciBtdXN0IHNlcnZlIHRoZSBFbWJlciBhcHAg
YXQgYWxsIHRoZSByb3V0ZXMgeW91IGRlZmluZS4KKyAgCisgICAgIyMjIE5vbmVMb2NhdGlvbgor
ICAKKyAgICBVc2luZyBgTm9uZUxvY2F0aW9uYCBjYXVzZXMgRW1iZXIgdG8gbm90IHN0b3JlIHRo
ZSBhcHBsaWNhdGlvbnMgVVJMIHN0YXRlCisgICAgaW4gdGhlIGFjdHVhbCBVUkwuIFRoaXMgaXMg
Z2VuZXJhbGx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGFuZCBpcyBvbmUKKyAgICBvZiB0
aGUgY2hhbmdlcyBtYWRlIHdoZW4gY2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KKyAg
CisgICAgIyMgTG9jYXRpb24gQVBJCisgIAorICAgIEVhY2ggbG9jYXRpb24gaW1wbGVtZW50YXRp
b24gbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgCisgICAgKiBpbXBsZW1l
bnRhdGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGlt
cGxlbWVudGF0aW9uLgorICAgICogZ2V0VVJMOiByZXR1cm5zIHRoZSBjdXJyZW50IFVSTC4KKyAg
ICAqIHNldFVSTChwYXRoKTogc2V0cyB0aGUgY3VycmVudCBVUkwuCisgICAgKiByZXBsYWNlVVJM
KHBhdGgpOiByZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0aW9uYWwpLgorICAgICogb25VcGRh
dGVVUkwoY2FsbGJhY2spOiB0cmlnZ2VycyB0aGUgY2FsbGJhY2sgd2hlbiB0aGUgVVJMIGNoYW5n
ZXMuCisgICAgKiBmb3JtYXRVUkwodXJsKTogZm9ybWF0cyBgdXJsYCB0byBiZSBwbGFjZWQgaW50
byBgaHJlZmAgYXR0cmlidXRlLgorICAgICogZGV0ZWN0KCkgKG9wdGlvbmFsKTogaW5zdHJ1Y3Rz
IHRoZSBsb2NhdGlvbiB0byBkbyBhbnkgZmVhdHVyZSBkZXRlY3Rpb24KKyAgICAgICAgbmVjZXNz
YXJ5LiBJZiB0aGUgbG9jYXRpb24gbmVlZHMgdG8gcmVkaXJlY3QgdG8gYSBkaWZmZXJlbnQgVVJM
LCBpdAorICAgICAgICBjYW4gY2FuY2VsIHJvdXRpbmcgYnkgc2V0dGluZyB0aGUgYGNhbmNlbFJv
dXRlclNldHVwYCBwcm9wZXJ0eSBvbiBpdHNlbGYKKyAgICAgICAgdG8gYGZhbHNlYC4KKyAgCisg
ICAgQ2FsbGluZyBzZXRVUkwgb3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRl
VVJMIGNhbGxiYWNrcy4KKyAgCisgICAgIyMgQ3VzdG9tIGltcGxlbWVudGF0aW9uCisgIAorICAg
IEVtYmVyIHNjYW5zIGBhcHAvbG9jYXRpb25zLypgIGZvciBleHRlbmRpbmcgdGhlIExvY2F0aW9u
IEFQSS4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGltcG9y
dCBFbWJlciBmcm9tICdlbWJlcic7CisgIAorICAgIGV4cG9ydCBkZWZhdWx0IEVtYmVyLkhpc3Rv
cnlMb2NhdGlvbi5leHRlbmQoeworICAgICAgaW1wbGVtZW50YXRpb246ICdoaXN0b3J5LXVybC1s
b2dnaW5nJywKKyAgCisgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICAg
IGNvbnNvbGUubG9nKHBhdGgpOworICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgTG9jYXRp
b24KKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICov
CisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICAvKioKKyAgICAgVGhpcyBpcyBkZXByZWNhdGVk
IGluIGZhdm9yIG9mIHVzaW5nIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbgor
ICAgICBpbXBsZW1lbnRhdGlvbiBhcyBkZXNpcmVkLgorICAgICAgRm9yIGV4YW1wbGU6CisgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgIC8vIEdpdmVuIGEgbG9jYXRpb24gcmVnaXN0ZXJlZCBhcyBm
b2xsb3dzOgorICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnktdGVzdCcs
IEhpc3RvcnlUZXN0TG9jYXRpb24pOworICAgICAgLy8gWW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBp
bnN0YW5jZSB2aWE6CisgICAgIGNvbnRhaW5lci5sb29rdXAoJ2xvY2F0aW9uOmhpc3RvcnktdGVz
dCcpOworICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGNyZWF0ZQorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9wdGlvbnMKKyAgICAgIEByZXR1cm4ge09iamVjdH0gYW4gaW5zdGFuY2Ugb2YgYW4gaW1w
bGVtZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAgQVBJCisgICAgICBAZGVwcmVjYXRlZCBVc2Ug
dGhlIGNvbnRhaW5lciB0byBsb29rdXAgdGhlIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIHRoYXQg
eW91CisgICAgICBuZWVkLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNyZWF0ZTogZnVu
Y3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYg
b3B0aW9ucy5pbXBsZW1lbnRhdGlvbjsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdF
bWJlci5Mb2NhdGlvbi5jcmVhdGU6IHlvdSBtdXN0IHNwZWNpZnkgYSBcJ2ltcGxlbWVudGF0aW9u
XCcgb3B0aW9uJywgISFpbXBsZW1lbnRhdGlvbik7CisKKyAgICAgIHZhciBpbXBsZW1lbnRhdGlv
bkNsYXNzID0gdGhpcy5pbXBsZW1lbnRhdGlvbnNbaW1wbGVtZW50YXRpb25dOworICAgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLkxvY2F0aW9uLmNyZWF0ZTogJyArIGltcGxlbWVu
dGF0aW9uICsgJyBpcyBub3QgYSB2YWxpZCBpbXBsZW1lbnRhdGlvbicsICEhaW1wbGVtZW50YXRp
b25DbGFzcyk7CisKKyAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbkNsYXNzLmNyZWF0ZS5hcHBs
eShpbXBsZW1lbnRhdGlvbkNsYXNzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBpbXBsZW1l
bnRhdGlvbnM6IHt9LAorICAgIF9sb2NhdGlvbjogX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZh
dWx0LmxvY2F0aW9uLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2Nh
dGlvbi5oYXNoYCBieSBwYXJzaW5nIGxvY2F0aW9uLmhyZWYgc2luY2UgYnJvd3NlcnMKKyAgICAg
IGluY29uc2lzdGVudGx5IFVSTC1kZWNvZGUgYGxvY2F0aW9uLmhhc2hgLgorICAgICAgIGh0dHBz
Oi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ4MzMwNAorICAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIGdldEhhc2gKKyAgICAgIEBzaW5jZSAxLjQuMAorICAgICov
CisgICAgX2dldEhhc2g6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSb3V0aW5n
TG9jYXRpb25VdGlsLmdldEhhc2godGhpcy5sb2NhdGlvbik7CisgICAgfQorICB9OworfSk7Citl
bmlmZWQoJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXV0b19sb2NhdGlvbicsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXIt
bWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL3V0aWxzJywgJ2NvbnRhaW5lci9vd25l
cicsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItbWV0YWwvZW52aXJvbm1l
bnQnLCAnZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQsIF9lbWJlck1ldGFsVXRpbHMsIF9jb250YWluZXJPd25lciwgX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdCwgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyUm91dGluZ0xvY2F0
aW9uVXRpbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRIaXN0b3J5UGF0aCA9
IGdldEhpc3RvcnlQYXRoOworICBleHBvcnRzLmdldEhhc2hQYXRoID0gZ2V0SGFzaFBhdGg7CisK
KyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCisgICov
CisKKyAgLyoqCisgICAgRW1iZXIuQXV0b0xvY2F0aW9uIHdpbGwgc2VsZWN0IHRoZSBiZXN0IGxv
Y2F0aW9uIG9wdGlvbiBiYXNlZCBvZmYgYnJvd3NlcgorICAgIHN1cHBvcnQgd2l0aCB0aGUgcHJp
b3JpdHkgb3JkZXI6IGhpc3RvcnksIGhhc2gsIG5vbmUuCisgIAorICAgIENsZWFuIHB1c2hTdGF0
ZSBwYXRocyBhY2Nlc3NlZCBieSBoYXNoY2hhbmdlLW9ubHkgYnJvd3NlcnMgd2lsbCBiZSByZWRp
cmVjdGVkCisgICAgdG8gdGhlIGhhc2gtZXF1aXZhbGVudCBhbmQgdmljZSB2ZXJzYSBzbyBmdXR1
cmUgdHJhbnNpdGlvbnMgYXJlIGNvbnNpc3RlbnQuCisgIAorICAgIEtlZXAgaW4gbWluZCB0aGF0
IHNpbmNlIHNvbWUgb2YgeW91ciB1c2VycyB3aWxsIHVzZSBgSGlzdG9yeUxvY2F0aW9uYCwgeW91
cgorICAgIHNlcnZlciBtdXN0IHNlcnZlIHRoZSBFbWJlciBhcHAgYXQgYWxsIHRoZSByb3V0ZXMg
eW91IGRlZmluZS4KKyAgCisgICAgQGNsYXNzIEF1dG9Mb2NhdGlvbgorICAgIEBuYW1lc3BhY2Ug
RW1iZXIKKyAgICBAc3RhdGljCisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0
ID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFRoZSBicm93c2VyJ3MgYGxvY2F0aW9uYCBvYmplY3QuIFRo
aXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAgICAgIGB3aW5kb3cubG9jYXRpb25gLCBi
dXQgbWF5IGJlIG92ZXJyaWRkZW4gZm9yIHRlc3RpbmcuCisgICAgICAgQHByb3BlcnR5IGxvY2F0
aW9uCisgICAgICBAZGVmYXVsdCBlbnZpcm9ubWVudC5sb2NhdGlvbgorICAgICovCisgICAgbG9j
YXRpb246IF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5sb2NhdGlvbiwKKworICAgIC8q
KgorICAgICAgQHByaXZhdGUKKyAgICAgICBUaGUgYnJvd3NlcidzIGBoaXN0b3J5YCBvYmplY3Qu
IFRoaXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAgICAgIGB3aW5kb3cuaGlzdG9yeWAs
IGJ1dCBtYXkgYmUgb3ZlcnJpZGRlbiBmb3IgdGVzdGluZy4KKyAgICAgICBAc2luY2UgMS41LjEK
KyAgICAgIEBwcm9wZXJ0eSBoaXN0b3J5CisgICAgICBAZGVmYXVsdCBlbnZpcm9ubWVudC5oaXN0
b3J5CisgICAgKi8KKyAgICBoaXN0b3J5OiBfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQu
aGlzdG9yeSwKKworICAgIC8qKgorICAgICBAcHJpdmF0ZQorICAgICAgVGhlIHVzZXIgYWdlbnQn
cyBnbG9iYWwgdmFyaWFibGUuIEluIGJyb3dzZXJzLCB0aGlzIHdpbGwgYmUgYHdpbmRvd2AuCisg
ICAgICBAc2luY2UgMS4xMQorICAgICBAcHJvcGVydHkgZ2xvYmFsCisgICAgIEBkZWZhdWx0IGVu
dmlyb25tZW50Lmdsb2JhbAorICAgICovCisgICAgZ2xvYmFsOiBfZW1iZXJNZXRhbEVudmlyb25t
ZW50LmRlZmF1bHQuZ2xvYmFsLAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIFRo
ZSBicm93c2VyJ3MgYHVzZXJBZ2VudGAuIFRoaXMgaXMgdHlwaWNhbGx5IGVxdWl2YWxlbnQgdG8K
KyAgICAgIGBuYXZpZ2F0b3IudXNlckFnZW50YCwgYnV0IG1heSBiZSBvdmVycmlkZGVuIGZvciB0
ZXN0aW5nLgorICAgICAgIEBzaW5jZSAxLjUuMQorICAgICAgQHByb3BlcnR5IHVzZXJBZ2VudAor
ICAgICAgQGRlZmF1bHQgZW52aXJvbm1lbnQuaGlzdG9yeQorICAgICovCisgICAgdXNlckFnZW50
OiBfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQudXNlckFnZW50LAorCisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSB0aGUgcm91dGVy
IHRvIGtub3cgd2hldGhlciB0byBjYW5jZWwgdGhlIHJvdXRpbmcKKyAgICAgIHNldHVwIHByb2Nl
c3MsIHdoaWNoIGlzIG5lZWRlZCB3aGlsZSB3ZSByZWRpcmVjdCB0aGUgYnJvd3Nlci4KKyAgICAg
ICBAc2luY2UgMS41LjEKKyAgICAgIEBwcm9wZXJ0eSBjYW5jZWxSb3V0ZXJTZXR1cAorICAgICAg
QGRlZmF1bHQgZmFsc2UKKyAgICAqLworICAgIGNhbmNlbFJvdXRlclNldHVwOiBmYWxzZSwKKwor
ICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBXaWxsIGJlIHByZS1wZW5kZWQgdG8gcGF0
aCB1cG9uIHN0YXRlIGNoYW5nZS4KKyAgICAgICBAc2luY2UgMS41LjEKKyAgICAgIEBwcm9wZXJ0
eSByb290VVJMCisgICAgICBAZGVmYXVsdCAnLycKKyAgICAqLworICAgIHJvb3RVUkw6ICcvJywK
KworICAgIC8qKgorICAgICBDYWxsZWQgYnkgdGhlIHJvdXRlciB0byBpbnN0cnVjdCB0aGUgbG9j
YXRpb24gdG8gZG8gYW55IGZlYXR1cmUgZGV0ZWN0aW9uCisgICAgIG5lY2Vzc2FyeS4gSW4gdGhl
IGNhc2Ugb2YgQXV0b0xvY2F0aW9uLCB3ZSBkZXRlY3Qgd2hldGhlciB0byB1c2UgaGlzdG9yeQor
ICAgICBvciBoYXNoIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucy4KKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBkZXRlY3Q6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb290VVJMID0gdGhp
cy5yb290VVJMOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgncm9vdFVSTCBtdXN0
IGVuZCB3aXRoIGEgdHJhaWxpbmcgZm9yd2FyZCBzbGFzaCBlLmcuICIvYXBwLyInLCByb290VVJM
LmNoYXJBdChyb290VVJMLmxlbmd0aCAtIDEpID09PSAnLycpOworCisgICAgICB2YXIgaW1wbGVt
ZW50YXRpb24gPSBkZXRlY3RJbXBsZW1lbnRhdGlvbih7CisgICAgICAgIGxvY2F0aW9uOiB0aGlz
LmxvY2F0aW9uLAorICAgICAgICBoaXN0b3J5OiB0aGlzLmhpc3RvcnksCisgICAgICAgIHVzZXJB
Z2VudDogdGhpcy51c2VyQWdlbnQsCisgICAgICAgIHJvb3RVUkw6IHJvb3RVUkwsCisgICAgICAg
IGRvY3VtZW50TW9kZTogdGhpcy5kb2N1bWVudE1vZGUsCisgICAgICAgIGdsb2JhbDogdGhpcy5n
bG9iYWwKKyAgICAgIH0pOworCisgICAgICBpZiAoaW1wbGVtZW50YXRpb24gPT09IGZhbHNlKSB7
CisgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnY2FuY2VsUm91dGVy
U2V0dXAnLCB0cnVlKTsKKyAgICAgICAgaW1wbGVtZW50YXRpb24gPSAnbm9uZSc7CisgICAgICB9
CisKKyAgICAgIHZhciBjb25jcmV0ZSA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKS5s
b29rdXAoJ2xvY2F0aW9uOicgKyBpbXBsZW1lbnRhdGlvbik7CisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQoY29uY3JldGUsICdyb290VVJMJywgcm9vdFVSTCk7CisKKyAgICAgIF9l
bWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDb3VsZCBub3QgZmluZCBsb2NhdGlvbiBcJycgKyBpbXBs
ZW1lbnRhdGlvbiArICdcJy4nLCAhIWNvbmNyZXRlKTsKKworICAgICAgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9zZXQuc2V0KHRoaXMsICdjb25jcmV0ZUltcGxlbWVudGF0aW9uJywgY29uY3JldGUpOwor
ICAgIH0sCisKKyAgICBpbml0U3RhdGU6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0aW9u
KCdpbml0U3RhdGUnKSwKKyAgICBnZXRVUkw6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0
aW9uKCdnZXRVUkwnKSwKKyAgICBzZXRVUkw6IGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0
aW9uKCdzZXRVUkwnKSwKKyAgICByZXBsYWNlVVJMOiBkZWxlZ2F0ZVRvQ29uY3JldGVJbXBsZW1l
bnRhdGlvbigncmVwbGFjZVVSTCcpLAorICAgIG9uVXBkYXRlVVJMOiBkZWxlZ2F0ZVRvQ29uY3Jl
dGVJbXBsZW1lbnRhdGlvbignb25VcGRhdGVVUkwnKSwKKyAgICBmb3JtYXRVUkw6IGRlbGVnYXRl
VG9Db25jcmV0ZUltcGxlbWVudGF0aW9uKCdmb3JtYXRVUkwnKSwKKworICAgIHdpbGxEZXN0cm95
OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29uY3JldGVJbXBsZW1lbnRhdGlvbiA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29uY3JldGVJbXBsZW1lbnRhdGlvbicpOwor
CisgICAgICBpZiAoY29uY3JldGVJbXBsZW1lbnRhdGlvbikgeworICAgICAgICBjb25jcmV0ZUlt
cGxlbWVudGF0aW9uLmRlc3Ryb3koKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGZ1bmN0
aW9uIGRlbGVnYXRlVG9Db25jcmV0ZUltcGxlbWVudGF0aW9uKG1ldGhvZE5hbWUpIHsKKyAgICBy
ZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNvbmNyZXRlSW1wbGVtZW50YXRpb24gPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbmNyZXRlSW1wbGVtZW50YXRpb24n
KTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdBdXRvTG9jYXRpb25cJ3MgZGV0ZWN0
KCkgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGhvb2tz
LicsICEhY29uY3JldGVJbXBsZW1lbnRhdGlvbik7CisKKyAgICAgIGZvciAodmFyIF9sZW4gPSBh
cmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xl
bjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAg
ICB9CisKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFV0aWxzLnRyeUludm9rZShjb25jcmV0ZUlt
cGxlbWVudGF0aW9uLCBtZXRob2ROYW1lLCBhcmdzKTsKKyAgICB9OworICB9CisKKyAgLyoKKyAg
ICBHaXZlbiB0aGUgYnJvd3NlcidzIGBsb2NhdGlvbmAsIGBoaXN0b3J5YCBhbmQgYHVzZXJBZ2Vu
dGAsIGFuZCBhIGNvbmZpZ3VyZWQKKyAgICByb290IFVSTCwgdGhpcyBmdW5jdGlvbiBkZXRlY3Rz
IHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIFtIaXN0b3J5CisgICAgQVBJXShodHRw
czovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGlzdG9yeSkgYW5k
IHJldHVybnMgYQorICAgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIExvY2F0aW9uIG9iamVjdCB0
byB1c2UgYmFzZWQgb24gaXRzIGRldGVybWluYXRpb24uCisgIAorICAgIEZvciBleGFtcGxlLCBp
ZiB0aGUgcGFnZSBsb2FkcyBpbiBhbiBldmVyZ3JlZW4gYnJvd3NlciwgdGhpcyBmdW5jdGlvbiB3
b3VsZAorICAgIHJldHVybiB0aGUgc3RyaW5nICJoaXN0b3J5IiwgbWVhbmluZyB0aGUgaGlzdG9y
eSBBUEkgYW5kIHRodXMgSGlzdG9yeUxvY2F0aW9uCisgICAgc2hvdWxkIGJlIHVzZWQuIElmIHRo
ZSBwYWdlIGlzIGxvYWRlZCBpbiBJRTgsIGl0IHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAi
aGFzaCwiIGluZGljYXRpbmcgdGhhdCB0aGUgSGlzdG9yeSBBUEkgc2hvdWxkIGJlIHNpbXVsYXRl
ZCBieSBtYW5pcHVsYXRpbmcgdGhlCisgICAgaGFzaCBwb3J0aW9uIG9mIHRoZSBsb2NhdGlvbi4K
KyAgCisgICovCisKKyAgZnVuY3Rpb24gZGV0ZWN0SW1wbGVtZW50YXRpb24ob3B0aW9ucykgewor
ICAgIHZhciBsb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247CisgICAgdmFyIHVzZXJBZ2VudCA9
IG9wdGlvbnMudXNlckFnZW50OworICAgIHZhciBoaXN0b3J5ID0gb3B0aW9ucy5oaXN0b3J5Owor
ICAgIHZhciBkb2N1bWVudE1vZGUgPSBvcHRpb25zLmRvY3VtZW50TW9kZTsKKyAgICB2YXIgZ2xv
YmFsID0gb3B0aW9ucy5nbG9iYWw7CisgICAgdmFyIHJvb3RVUkwgPSBvcHRpb25zLnJvb3RVUkw7
CisKKyAgICB2YXIgaW1wbGVtZW50YXRpb24gPSAnbm9uZSc7CisgICAgdmFyIGNhbmNlbFJvdXRl
clNldHVwID0gZmFsc2U7CisgICAgdmFyIGN1cnJlbnRQYXRoID0gX2VtYmVyUm91dGluZ0xvY2F0
aW9uVXRpbC5nZXRGdWxsUGF0aChsb2NhdGlvbik7CisKKyAgICBpZiAoX2VtYmVyUm91dGluZ0xv
Y2F0aW9uVXRpbC5zdXBwb3J0c0hpc3RvcnkodXNlckFnZW50LCBoaXN0b3J5KSkgeworICAgICAg
dmFyIGhpc3RvcnlQYXRoID0gZ2V0SGlzdG9yeVBhdGgocm9vdFVSTCwgbG9jYXRpb24pOworCisg
ICAgICAvLyBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBoaXN0b3J5IGFuZCB3ZSBoYXZlIGEgaGlz
dG9yeSBwYXRoLCB3ZSBjYW4gdXNlCisgICAgICAvLyB0aGUgaGlzdG9yeSBsb2NhdGlvbiB3aXRo
IG5vIHJlZGlyZWN0cy4KKyAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gaGlzdG9yeVBhdGgpIHsK
KyAgICAgICAgcmV0dXJuICdoaXN0b3J5JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChj
dXJyZW50UGF0aC5zdWJzdHIoMCwgMikgPT09ICcvIycpIHsKKyAgICAgICAgICBoaXN0b3J5LnJl
cGxhY2VTdGF0ZSh7IHBhdGg6IGhpc3RvcnlQYXRoIH0sIG51bGwsIGhpc3RvcnlQYXRoKTsKKyAg
ICAgICAgICBpbXBsZW1lbnRhdGlvbiA9ICdoaXN0b3J5JzsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICBjYW5jZWxSb3V0ZXJTZXR1cCA9IHRydWU7CisgICAgICAgICAgX2VtYmVyUm91dGlu
Z0xvY2F0aW9uVXRpbC5yZXBsYWNlUGF0aChsb2NhdGlvbiwgaGlzdG9yeVBhdGgpOworICAgICAg
ICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLnN1
cHBvcnRzSGFzaENoYW5nZShkb2N1bWVudE1vZGUsIGdsb2JhbCkpIHsKKyAgICAgIHZhciBoYXNo
UGF0aCA9IGdldEhhc2hQYXRoKHJvb3RVUkwsIGxvY2F0aW9uKTsKKworICAgICAgLy8gQmUgc3Vy
ZSB3ZSdyZSB1c2luZyBhIGhhc2hlZCBwYXRoLCBvdGhlcndpc2UgbGV0J3Mgc3dpdGNoIG92ZXIg
aXQgdG8gc28KKyAgICAgIC8vIHdlIHN0YXJ0IG9mZiBjbGVhbiBhbmQgY29uc2lzdGVudC4gV2Un
bGwgY291bnQgYW4gaW5kZXggcGF0aCB3aXRoIG5vCisgICAgICAvLyBoYXNoIGFzICJnb29kIGVu
b3VnaCIgYXMgd2VsbC4KKyAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gaGFzaFBhdGggfHwgY3Vy
cmVudFBhdGggPT09ICcvJyAmJiBoYXNoUGF0aCA9PT0gJy8jLycpIHsKKyAgICAgICAgaW1wbGVt
ZW50YXRpb24gPSAnaGFzaCc7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdXIgVVJMIGlz
bid0IGluIHRoZSBleHBlY3RlZCBoYXNoLXN1cHBvcnRlZCBmb3JtYXQsIHNvIHdlIHdhbnQgdG8K
KyAgICAgICAgLy8gY2FuY2VsIHRoZSByb3V0ZXIgc2V0dXAgYW5kIHJlcGxhY2UgdGhlIFVSTCB0
byBzdGFydCBvZmYgY2xlYW4KKyAgICAgICAgY2FuY2VsUm91dGVyU2V0dXAgPSB0cnVlOworICAg
ICAgICBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLnJlcGxhY2VQYXRoKGxvY2F0aW9uLCBoYXNo
UGF0aCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhbmNlbFJvdXRlclNldHVwKSB7Cisg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwor
ICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBw
YXRoIGFzIGl0IHNob3VsZCBhcHBlYXIgZm9yIEhpc3RvcnlMb2NhdGlvbiBzdXBwb3J0ZWQKKyAg
ICBicm93c2Vycy4gVGhpcyBtYXkgdmVyeSB3ZWxsIGRpZmZlciBmcm9tIHRoZSByZWFsIGN1cnJl
bnQgcGF0aCAoZS5nLiBpZiBpdAorICAgIHN0YXJ0cyBvZmYgYXMgYSBoYXNoZWQgVVJMKQorICAq
LworCisgIGZ1bmN0aW9uIGdldEhpc3RvcnlQYXRoKHJvb3RVUkwsIGxvY2F0aW9uKSB7CisgICAg
dmFyIHBhdGggPSBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLmdldFBhdGgobG9jYXRpb24pOwor
ICAgIHZhciBoYXNoID0gX2VtYmVyUm91dGluZ0xvY2F0aW9uVXRpbC5nZXRIYXNoKGxvY2F0aW9u
KTsKKyAgICB2YXIgcXVlcnkgPSBfZW1iZXJSb3V0aW5nTG9jYXRpb25VdGlsLmdldFF1ZXJ5KGxv
Y2F0aW9uKTsKKyAgICB2YXIgcm9vdFVSTEluZGV4ID0gcGF0aC5pbmRleE9mKHJvb3RVUkwpOwor
ICAgIHZhciByb3V0ZUhhc2gsIGhhc2hQYXJ0czsKKworICAgIF9lbWJlck1ldGFsRGVidWcuYXNz
ZXJ0KCdQYXRoICcgKyBwYXRoICsgJyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBwcm92aWRlZCBy
b290VVJMICcgKyByb290VVJMLCByb290VVJMSW5kZXggPT09IDApOworCisgICAgLy8gQnkgY29u
dmVudGlvbiwgRW1iZXIuanMgcm91dGVzIHVzaW5nIEhhc2hMb2NhdGlvbiBhcmUgcmVxdWlyZWQg
dG8gc3RhcnQKKyAgICAvLyB3aXRoIGAjL2AuIEFueXRoaW5nIGVsc2Ugc2hvdWxkIE5PVCBiZSBj
b25zaWRlcmVkIGEgcm91dGUgYW5kIHNob3VsZAorICAgIC8vIGJlIHBhc3NlZCBzdHJhaWdodCB0
aHJvdWdoLCB3aXRob3V0IHRyYW5zZm9ybWF0aW9uLgorICAgIGlmIChoYXNoLnN1YnN0cigwLCAy
KSA9PT0gJyMvJykgeworICAgICAgLy8gVGhlcmUgY291bGQgYmUgZXh0cmEgaGFzaCBzZWdtZW50
cyBhZnRlciB0aGUgcm91dGUKKyAgICAgIGhhc2hQYXJ0cyA9IGhhc2guc3Vic3RyKDEpLnNwbGl0
KCcjJyk7CisgICAgICAvLyBUaGUgZmlyc3Qgb25lIGlzIGFsd2F5cyB0aGUgcm91dGUgdXJsCisg
ICAgICByb3V0ZUhhc2ggPSBoYXNoUGFydHMuc2hpZnQoKTsKKworICAgICAgLy8gSWYgdGhlIHBh
dGggYWxyZWFkeSBoYXMgYSB0cmFpbGluZyBzbGFzaCwgcmVtb3ZlIHRoZSBvbmUKKyAgICAgIC8v
IGZyb20gdGhlIGhhc2hlZCByb3V0ZSBzbyB3ZSBkb24ndCBkb3VibGUgdXAuCisgICAgICBpZiAo
cGF0aC5zbGljZSgtMSkgPT09ICcvJykgeworICAgICAgICByb3V0ZUhhc2ggPSByb3V0ZUhhc2gu
c3Vic3RyKDEpOworICAgICAgfQorCisgICAgICAvLyBUaGlzIGlzIHRoZSAiZXhwZWN0ZWQiIGZp
bmFsIG9yZGVyCisgICAgICBwYXRoID0gcGF0aCArIHJvdXRlSGFzaCArIHF1ZXJ5OworCisgICAg
ICBpZiAoaGFzaFBhcnRzLmxlbmd0aCkgeworICAgICAgICBwYXRoICs9ICcjJyArIGhhc2hQYXJ0
cy5qb2luKCcjJyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBhdGggPSBwYXRoICsg
cXVlcnkgKyBoYXNoOworICAgIH0KKworICAgIHJldHVybiBwYXRoOworICB9CisKKyAgLyoqCisg
ICAgQHByaXZhdGUKKyAgCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoIGFzIGl0IHNob3Vs
ZCBhcHBlYXIgZm9yIEhhc2hMb2NhdGlvbiBzdXBwb3J0ZWQKKyAgICBicm93c2Vycy4gVGhpcyBt
YXkgdmVyeSB3ZWxsIGRpZmZlciBmcm9tIHRoZSByZWFsIGN1cnJlbnQgcGF0aC4KKyAgCisgICAg
QG1ldGhvZCBfZ2V0SGFzaFBhdGgKKyAgKi8KKworICBmdW5jdGlvbiBnZXRIYXNoUGF0aChyb290
VVJMLCBsb2NhdGlvbikgeworICAgIHZhciBwYXRoID0gcm9vdFVSTDsKKyAgICB2YXIgaGlzdG9y
eVBhdGggPSBnZXRIaXN0b3J5UGF0aChyb290VVJMLCBsb2NhdGlvbik7CisgICAgdmFyIHJvdXRl
UGF0aCA9IGhpc3RvcnlQYXRoLnN1YnN0cihyb290VVJMLmxlbmd0aCk7CisKKyAgICBpZiAocm91
dGVQYXRoICE9PSAnJykgeworICAgICAgaWYgKHJvdXRlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykg
eworICAgICAgICByb3V0ZVBhdGggPSAnLycgKyByb3V0ZVBhdGg7CisgICAgICB9CisKKyAgICAg
IHBhdGggKz0gJyMnICsgcm91dGVQYXRoOworICAgIH0KKworICAgIHJldHVybiBwYXRoOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi9oYXNoX2xvY2F0aW9uJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9zZXQnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1i
ZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0JywgJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24vYXBpJywg
J2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxSdW5f
bG9vcCwgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXBpLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSkgeworICAndXNlIHN0
cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1yb3V0
aW5nCisgICovCisKKyAgLyoqCisgICAgYEVtYmVyLkhhc2hMb2NhdGlvbmAgaW1wbGVtZW50cyB0
aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2VyJ3MKKyAgICBoYXNoLiBBdCBwcmVzZW50
LCBpdCByZWxpZXMgb24gYSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCisgICAg
YnJvd3Nlci4KKyAgCisgICAgQGNsYXNzIEhhc2hMb2NhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1i
ZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBv
cnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsK
KyAgICBpbXBsZW1lbnRhdGlvbjogJ2hhc2gnLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgewor
ICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMsICdsb2NhdGlvbicsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX2xvY2F0aW9uJykgfHwgd2luZG93LmxvY2F0
aW9uKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIFJldHVybnMg
bm9ybWFsaXplZCBsb2NhdGlvbi5oYXNoCisgICAgICAgQHNpbmNlIDEuNS4xCisgICAgICBAbWV0
aG9kIGdldEhhc2gKKyAgICAqLworICAgIGdldEhhc2g6IF9lbWJlclJvdXRpbmdMb2NhdGlvbkFw
aS5kZWZhdWx0Ll9nZXRIYXNoLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBub3JtYWxp
emVkIFVSTCwgY29uc3RydWN0ZWQgZnJvbSBgbG9jYXRpb24uaGFzaGAuCisgICAgICAgZS5nLiBg
Iy9mb29gID0+IGAvZm9vYCBhcyB3ZWxsIGFzIGAjL2ZvbyNiYXJgID0+IGAvZm9vI2JhcmAuCisg
ICAgICAgQnkgY29udmVudGlvbiwgaGFzaGVkIHBhdGhzIG11c3QgYmVnaW4gd2l0aCBhIGZvcndh
cmQgc2xhc2gsIG90aGVyd2lzZSB0aGV5CisgICAgICBhcmUgbm90IHRyZWF0ZWQgYXMgYSBwYXRo
IHNvIHdlIGNhbiBkaXN0aW5ndWlzaCBpbnRlbnQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgZ2V0VVJMCisgICAgKi8KKyAgICBnZXRVUkw6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBvcmlnaW5hbFBhdGggPSB0aGlzLmdldEhhc2goKS5zdWJzdHIoMSk7CisgICAgICB2YXIgb3V0
UGF0aCA9IG9yaWdpbmFsUGF0aDsKKworICAgICAgaWYgKG91dFBhdGguY2hhckF0KDApICE9PSAn
LycpIHsKKyAgICAgICAgb3V0UGF0aCA9ICcvJzsKKworICAgICAgICAvLyBPbmx5IGFkZCB0aGUg
IyBpZiB0aGUgcGF0aCBpc24ndCBlbXB0eS4KKyAgICAgICAgLy8gV2UgZG8gTk9UIHdhbnQgYC8j
YCBzaW5jZSB0aGUgYW1wZXJzYW5kCisgICAgICAgIC8vIGlzIG9ubHkgaW5jbHVkZWQgKGNvbnZl
bnRpb25hbGx5KSB3aGVuCisgICAgICAgIC8vIHRoZSBsb2NhdGlvbi5oYXNoIGhhcyBhIHZhbHVl
CisgICAgICAgIGlmIChvcmlnaW5hbFBhdGgpIHsKKyAgICAgICAgICBvdXRQYXRoICs9ICcjJyAr
IG9yaWdpbmFsUGF0aDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gb3V0UGF0
aDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBTZXQgdGhlIGBsb2NhdGlvbi5oYXNoYCBhbmQg
cmVtZW1iZXJzIHdoYXQgd2FzIHNldC4gVGhpcyBwcmV2ZW50cworICAgICAgYG9uVXBkYXRlVVJM
YCBjYWxsYmFja3MgZnJvbSB0cmlnZ2VyaW5nIHdoZW4gdGhlIGhhc2ggd2FzIHNldCBieQorICAg
ICAgYEhhc2hMb2NhdGlvbmAuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgc2V0VVJM
CisgICAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQorICAgICovCisgICAgc2V0VVJMOiBmdW5jdGlv
biAocGF0aCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsb2Nh
dGlvbicpLmhhc2ggPSBwYXRoOworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRo
aXMsICdsYXN0U2V0VVJMJywgcGF0aCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVXNlcyBs
b2NhdGlvbi5yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZAor
ICAgICAgb3IgaGlzdG9yeSBtb2RpZmljYXRpb24uCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBt
ZXRob2QgcmVwbGFjZVVSTAorICAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAg
IHJlcGxhY2VVUkw6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xvY2F0aW9uJykucmVwbGFjZSgnIycgKyBwYXRoKTsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3
aGVuIHRoZSBoYXNoIGNoYW5nZXMuIFRoZXNlCisgICAgICBjYWxsYmFja3Mgd2lsbCBleGVjdXRl
IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgYmFjayBvciBmb3J3YXJkCisgICAgICBidXR0b24s
IGJ1dCBub3QgYWZ0ZXIgYHNldFVSTGAgaXMgaW52b2tlZC4KKyAgICAgICBAcHJpdmF0ZQorICAg
ICAgQG1ldGhvZCBvblVwZGF0ZVVSTAorICAgICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0K
KyAgICAqLworICAgIG9uVXBkYXRlVVJMOiBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgIHZh
ciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBndWlkID0gX2VtYmVyTWV0YWxVdGlscy5ndWlk
Rm9yKHRoaXMpOworCisgICAgICBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KHdpbmRv
dykub24oJ2hhc2hjaGFuZ2UuZW1iZXItbG9jYXRpb24tJyArIGd1aWQsIGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KGZ1bmN0aW9uICgpIHsKKyAgICAg
ICAgICB2YXIgcGF0aCA9IF90aGlzLmdldFVSTCgpOworICAgICAgICAgIGlmIChfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQoX3RoaXMsICdsYXN0U2V0VVJMJykgPT09IHBhdGgpIHsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQoX3RoaXMsICdsYXN0U2V0VVJMJywgbnVsbCk7CisKKyAgICAgICAgICBjYWxs
YmFjayhwYXRoKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBh
cyBwYXJ0CisgICAgICBvZiBhbiBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0ZS4KKyAgICAgICBU
aGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7e2FjdGlvbn19IGhlbHBl
cgorICAgICAgdG8gZ2VuZXJhdGUgYSBVUkwgYmFzZWQgb24gYW4gZXZlbnQuCisgICAgICAgQHBy
aXZhdGUKKyAgICAgIEBtZXRob2QgZm9ybWF0VVJMCisgICAgICBAcGFyYW0gdXJsIHtTdHJpbmd9
CisgICAgKi8KKyAgICBmb3JtYXRVUkw6IGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgIHJldHVybiAn
IycgKyB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2xlYW5zIHVwIHRoZSBIYXNoTG9j
YXRpb24gZXZlbnQgbGlzdGVuZXIuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgd2ls
bERlc3Ryb3kKKyAgICAqLworICAgIHdpbGxEZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2VtYmVy
Vmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9mZignaGFzaGNoYW5nZS5lbWJlci1s
b2NhdGlvbi0nICsgZ3VpZCk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1yb3V0
aW5nL2xvY2F0aW9uL2hpc3RvcnlfbG9jYXRpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwv
cHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC91
dGlscycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcm91dGluZy9sb2Nh
dGlvbi9hcGknLCAnZW1iZXItdmlld3Mvc3lzdGVtL2pxdWVyeSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1i
ZXJNZXRhbFV0aWxzLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSb3V0aW5nTG9j
YXRpb25BcGksIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8K
KworICB2YXIgcG9wc3RhdGVGaXJlZCA9IGZhbHNlOworCisgIC8qKgorICAgIEVtYmVyLkhpc3Rv
cnlMb2NhdGlvbiBpbXBsZW1lbnRzIHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJyb3dzZXIn
cworICAgIGhpc3RvcnkucHVzaFN0YXRlIEFQSS4KKyAgCisgICAgQGNsYXNzIEhpc3RvcnlMb2Nh
dGlvbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKyAg
ICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lzdGVt
T2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbXBsZW1lbnRhdGlvbjogJ2hpc3RvcnknLAor
CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQu
c2V0KHRoaXMsICdsb2NhdGlvbicsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
bG9jYXRpb24nKSB8fCB3aW5kb3cubG9jYXRpb24pOworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQuc2V0KHRoaXMsICdiYXNlVVJMJywgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVs
dCgnYmFzZScpLmF0dHIoJ2hyZWYnKSB8fCAnJyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
VXNlZCB0byBzZXQgc3RhdGUgb24gZmlyc3QgY2FsbCB0byBzZXRVUkwKKyAgICAgICBAcHJpdmF0
ZQorICAgICAgQG1ldGhvZCBpbml0U3RhdGUKKyAgICAqLworICAgIGluaXRTdGF0ZTogZnVuY3Rp
b24gKCkgeworICAgICAgdmFyIGhpc3RvcnkgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcywgJ2hpc3RvcnknKSB8fCB3aW5kb3cuaGlzdG9yeTsKKyAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCAnaGlzdG9yeScsIGhpc3RvcnkpOworCisgICAgICBpZiAoaGlz
dG9yeSAmJiAnc3RhdGUnIGluIGhpc3RvcnkpIHsKKyAgICAgICAgdGhpcy5zdXBwb3J0c0hpc3Rv
cnkgPSB0cnVlOworICAgICAgfQorCisgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh0aGlzLmZvcm1h
dFVSTCh0aGlzLmdldFVSTCgpKSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgV2lsbCBiZSBw
cmUtcGVuZGVkIHRvIHBhdGggdXBvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgICBAcHJvcGVydHkgcm9v
dFVSTAorICAgICAgQGRlZmF1bHQgJy8nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgcm9v
dFVSTDogJy8nLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlv
bi5wYXRobmFtZWAgd2l0aG91dCBgcm9vdFVSTGAgb3IgYGJhc2VVUkxgCisgICAgICAgQHByaXZh
dGUKKyAgICAgIEBtZXRob2QgZ2V0VVJMCisgICAgICBAcmV0dXJuIHVybCB7U3RyaW5nfQorICAg
ICovCisgICAgZ2V0VVJMOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbG9jYXRpb24gPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xvY2F0aW9uJyk7CisgICAgICB2YXIgcGF0
aCA9IGxvY2F0aW9uLnBhdGhuYW1lOworCisgICAgICB2YXIgcm9vdFVSTCA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm9vdFVSTCcpOworICAgICAgdmFyIGJhc2VVUkwgPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Jhc2VVUkwnKTsKKworICAgICAgLy8g
cmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgaWYgdGhleSBleGlzdHMKKyAgICAgIHJvb3RVUkwgPSBy
b290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKKyAgICAgIGJhc2VVUkwgPSBiYXNlVVJMLnJlcGxh
Y2UoL1wvJC8sICcnKTsKKworICAgICAgLy8gcmVtb3ZlIGJhc2VVUkwgYW5kIHJvb3RVUkwgZnJv
bSBzdGFydCBvZiBwYXRoCisgICAgICB2YXIgdXJsID0gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAo
J14nICsgYmFzZVVSTCArICcoPz0vfCQpJyksICcnKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsg
cm9vdFVSTCArICcoPz0vfCQpJyksICcnKTsKKworICAgICAgdmFyIHNlYXJjaCA9IGxvY2F0aW9u
LnNlYXJjaCB8fCAnJzsKKyAgICAgIHVybCArPSBzZWFyY2g7CisgICAgICB1cmwgKz0gdGhpcy5n
ZXRIYXNoKCk7CisKKyAgICAgIHJldHVybiB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
VXNlcyBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvIHVwZGF0ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdl
IHJlbG9hZC4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBzZXRVUkwKKyAgICAgIEBw
YXJhbSBwYXRoIHtTdHJpbmd9CisgICAgKi8KKyAgICBzZXRVUkw6IGZ1bmN0aW9uIChwYXRoKSB7
CisgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7CisgICAgICBwYXRoID0gdGhpcy5m
b3JtYXRVUkwocGF0aCk7CisKKyAgICAgIGlmICghc3RhdGUgfHwgc3RhdGUucGF0aCAhPT0gcGF0
aCkgeworICAgICAgICB0aGlzLnB1c2hTdGF0ZShwYXRoKTsKKyAgICAgIH0KKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBVc2VzIGBoaXN0b3J5LnJlcGxhY2VTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1
cmwgd2l0aG91dCBhIHBhZ2UgcmVsb2FkCisgICAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlvbi4K
KyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCByZXBsYWNlVVJMCisgICAgICBAcGFyYW0g
cGF0aCB7U3RyaW5nfQorICAgICovCisgICAgcmVwbGFjZVVSTDogZnVuY3Rpb24gKHBhdGgpIHsK
KyAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTsKKyAgICAgIHBhdGggPSB0aGlzLmZv
cm1hdFVSTChwYXRoKTsKKworICAgICAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5wYXRoICE9PSBwYXRo
KSB7CisgICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHBhdGgpOworICAgICAgfQorICAgIH0sCisK
KyAgICAvKioKKyAgICAgIEdldCB0aGUgY3VycmVudCBgaGlzdG9yeS5zdGF0ZWAuIENoZWNrcyBm
b3IgaWYgYSBwb2x5ZmlsbCBpcworICAgICAgcmVxdWlyZWQgYW5kIGlmIHNvIGZldGNoZXMgdGhp
cy5faGlzdG9yeVN0YXRlLiBUaGUgc3RhdGUgcmV0dXJuZWQKKyAgICAgIGZyb20gZ2V0U3RhdGUg
bWF5IGJlIG51bGwgaWYgYW4gaWZyYW1lIGhhcyBjaGFuZ2VkIGEgd2luZG93J3MKKyAgICAgIGhp
c3RvcnkuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZ2V0U3RhdGUKKyAgICAgIEBy
ZXR1cm4gc3RhdGUge09iamVjdH0KKyAgICAqLworICAgIGdldFN0YXRlOiBmdW5jdGlvbiAoKSB7
CisgICAgICBpZiAodGhpcy5zdXBwb3J0c0hpc3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaGlzdG9yeScpLnN0YXRlOworICAgICAgfQor
CisgICAgICByZXR1cm4gdGhpcy5faGlzdG9yeVN0YXRlOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgUHVzaGVzIGEgbmV3IHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCBwdXNo
U3RhdGUKKyAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAgIHB1c2hTdGF0ZTog
ZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OworCisg
ICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2hpc3RvcnknKS5wdXNoU3Rh
dGUoc3RhdGUsIG51bGwsIHBhdGgpOworCisgICAgICB0aGlzLl9oaXN0b3J5U3RhdGUgPSBzdGF0
ZTsKKworICAgICAgLy8gdXNlZCBmb3Igd2Via2l0IHdvcmthcm91bmQKKyAgICAgIHRoaXMuX3By
ZXZpb3VzVVJMID0gdGhpcy5nZXRVUkwoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgIFJlcGxh
Y2VzIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAgQG1ldGhvZCByZXBs
YWNlU3RhdGUKKyAgICAgQHBhcmFtIHBhdGgge1N0cmluZ30KKyAgICAqLworICAgIHJlcGxhY2VT
dGF0ZTogZnVuY3Rpb24gKHBhdGgpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9
OworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdoaXN0b3J5JykucmVw
bGFjZVN0YXRlKHN0YXRlLCBudWxsLCBwYXRoKTsKKworICAgICAgdGhpcy5faGlzdG9yeVN0YXRl
ID0gc3RhdGU7CisKKyAgICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCisgICAgICB0
aGlzLl9wcmV2aW91c1VSTCA9IHRoaXMuZ2V0VVJMKCk7CisgICAgfSwKKworICAgIC8qKgorICAg
ICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBicm93c2Vy
CisgICAgICBoaXN0b3J5IGNoYW5nZXMsIGluY2x1ZGluZyB1c2luZyBmb3J3YXJkIGFuZCBiYWNr
IGJ1dHRvbnMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb25VcGRhdGVVUkwKKyAg
ICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259CisgICAgKi8KKyAgICBvblVwZGF0ZVVSTDog
ZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisgICAgICB2
YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2VtYmVy
Vmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9uKCdwb3BzdGF0ZS5lbWJlci1sb2Nh
dGlvbi0nICsgZ3VpZCwgZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgLy8gSWdub3JlIGluaXRpYWwg
cGFnZSBsb2FkIHBvcHN0YXRlIGV2ZW50IGluIENocm9tZQorICAgICAgICBpZiAoIXBvcHN0YXRl
RmlyZWQpIHsKKyAgICAgICAgICBwb3BzdGF0ZUZpcmVkID0gdHJ1ZTsKKyAgICAgICAgICBpZiAo
X3RoaXMuZ2V0VVJMKCkgPT09IF90aGlzLl9wcmV2aW91c1VSTCkgeworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayhfdGhpcy5nZXRV
UkwoKSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBVc2VkIHdoZW4gdXNp
bmcgYHt7YWN0aW9ufX1gIGhlbHBlci4gIFRoZSB1cmwgaXMgYWx3YXlzIGFwcGVuZGVkIHRvIHRo
ZSByb290VVJMLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGZvcm1hdFVSTAorICAg
ICAgQHBhcmFtIHVybCB7U3RyaW5nfQorICAgICAgQHJldHVybiBmb3JtYXR0ZWQgdXJsIHtTdHJp
bmd9CisgICAgKi8KKyAgICBmb3JtYXRVUkw6IGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgIHZhciBy
b290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290VVJMJyk7Cisg
ICAgICB2YXIgYmFzZVVSTCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYmFz
ZVVSTCcpOworCisgICAgICBpZiAodXJsICE9PSAnJykgeworICAgICAgICAvLyByZW1vdmUgdHJh
aWxpbmcgc2xhc2hlcyBpZiB0aGV5IGV4aXN0cworICAgICAgICByb290VVJMID0gcm9vdFVSTC5y
ZXBsYWNlKC9cLyQvLCAnJyk7CisgICAgICAgIGJhc2VVUkwgPSBiYXNlVVJMLnJlcGxhY2UoL1wv
JC8sICcnKTsKKyAgICAgIH0gZWxzZSBpZiAoYmFzZVVSTC5tYXRjaCgvXlwvLykgJiYgcm9vdFVS
TC5tYXRjaCgvXlwvLykpIHsKKyAgICAgICAgLy8gaWYgYmFzZVVSTCBhbmQgcm9vdFVSTCBib3Ro
IHN0YXJ0IHdpdGggYSBzbGFzaAorICAgICAgICAvLyAuLi4gcmVtb3ZlIHRyYWlsaW5nIHNsYXNo
IGZyb20gYmFzZVVSTCBpZiBpdCBleGlzdHMKKyAgICAgICAgYmFzZVVSTCA9IGJhc2VVUkwucmVw
bGFjZSgvXC8kLywgJycpOworICAgICAgfQorCisgICAgICByZXR1cm4gYmFzZVVSTCArIHJvb3RV
UkwgKyB1cmw7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2xlYW5zIHVwIHRoZSBIaXN0b3J5
TG9jYXRpb24gZXZlbnQgbGlzdGVuZXIuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qg
d2lsbERlc3Ryb3kKKyAgICAqLworICAgIHdpbGxEZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAg
ICB2YXIgZ3VpZCA9IF9lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcih0aGlzKTsKKworICAgICAgX2Vt
YmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdCh3aW5kb3cpLm9mZigncG9wc3RhdGUuZW1iZXIt
bG9jYXRpb24tJyArIGd1aWQpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisg
ICAgICAgUmV0dXJucyBub3JtYWxpemVkIGxvY2F0aW9uLmhhc2gKKyAgICAgICBAbWV0aG9kIGdl
dEhhc2gKKyAgICAqLworICAgIGdldEhhc2g6IF9lbWJlclJvdXRpbmdMb2NhdGlvbkFwaS5kZWZh
dWx0Ll9nZXRIYXNoCisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvbG9jYXRpb24v
bm9uZV9sb2NhdGlvbicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLXJ1
bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1
ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1i
ZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAg
ICBFbWJlci5Ob25lTG9jYXRpb24gZG9lcyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvd3Nlci4g
SXQgaXMgdXNlZnVsIGZvcgorICAgIHRlc3RpbmcsIG9yIHdoZW4geW91IG5lZWQgdG8gbWFuYWdl
IHN0YXRlIHdpdGggeW91ciBSb3V0ZXIsIGJ1dCB0ZW1wb3JhcmlseQorICAgIGRvbid0IHdhbnQg
aXQgdG8gbXVjayB3aXRoIHRoZSBVUkwgKGZvciBleGFtcGxlIHdoZW4geW91IGVtYmVkIHlvdXIK
KyAgICBhcHBsaWNhdGlvbiBpbiBhIGxhcmdlciBwYWdlKS4KKyAgCisgICAgQGNsYXNzIE5vbmVM
b2NhdGlvbgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3QK
KyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50aW1lU3lz
dGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbXBsZW1lbnRhdGlvbjogJ25vbmUnLAor
ICAgIHBhdGg6ICcnLAorCisgICAgZGV0ZWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcm9v
dFVSTCA9IHRoaXMucm9vdFVSTDsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ3Jv
b3RVUkwgbXVzdCBlbmQgd2l0aCBhIHRyYWlsaW5nIGZvcndhcmQgc2xhc2ggZS5nLiAiL2FwcC8i
Jywgcm9vdFVSTC5jaGFyQXQocm9vdFVSTC5sZW5ndGggLSAxKSA9PT0gJy8nKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBXaWxsIGJlIHByZS1wZW5kZWQgdG8gcGF0aC4KKyAgICAgICBAcHJp
dmF0ZQorICAgICAgQHByb3BlcnR5IHJvb3RVUkwKKyAgICAgIEBkZWZhdWx0ICcvJworICAgICov
CisgICAgcm9vdFVSTDogJy8nLAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50
IHBhdGggd2l0aG91dCBgcm9vdFVSTGAuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qg
Z2V0VVJMCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHBhdGgKKyAgICAqLworICAgIGdldFVSTDog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhdGggPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ3BhdGgnKTsKKyAgICAgIHZhciByb290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdyb290VVJMJyk7CisKKyAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBz
bGFzaGVzIGlmIHRoZXkgZXhpc3RzCisgICAgICByb290VVJMID0gcm9vdFVSTC5yZXBsYWNlKC9c
LyQvLCAnJyk7CisKKyAgICAgIC8vIHJlbW92ZSByb290VVJMIGZyb20gdXJsCisgICAgICByZXR1
cm4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsgcm9vdFVSTCArICcoPz0vfCQpJyksICcn
KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBTZXQgdGhlIHBhdGggYW5kIHJlbWVtYmVycyB3
aGF0IHdhcyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCisgICAgICB0byBjaGFuZ2UgdGhlIHBhdGgg
d2lsbCBub3QgaW52b2tlIHRoZSBgdXBkYXRlVVJMYCBjYWxsYmFjay4KKyAgICAgICBAcHJpdmF0
ZQorICAgICAgQG1ldGhvZCBzZXRVUkwKKyAgICAgIEBwYXJhbSBwYXRoIHtTdHJpbmd9CisgICAg
Ki8KKyAgICBzZXRVUkw6IGZ1bmN0aW9uIChwYXRoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQodGhpcywgJ3BhdGgnLCBwYXRoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgcGF0aCBjaGFuZ2Vz
LiBUaGVzZQorICAgICAgY2FsbGJhY2tzIHdpbGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNz
ZXMgdGhlIGJhY2sgb3IgZm9yd2FyZAorICAgICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBzZXRV
UkxgIGlzIGludm9rZWQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2Qgb25VcGRhdGVV
UkwKKyAgICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259CisgICAgKi8KKyAgICBvblVwZGF0
ZVVSTDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0g
Y2FsbGJhY2s7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgcGF0aCBhbmQgY2Fs
bHMgdGhlIGB1cGRhdGVVUkxgIGNhbGxiYWNrLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0
aG9kIGhhbmRsZVVSTAorICAgICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlvbn0KKyAgICAqLwor
ICAgIGhhbmRsZVVSTDogZnVuY3Rpb24gKHVybCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQuc2V0KHRoaXMsICdwYXRoJywgdXJsKTsKKyAgICAgIHRoaXMudXBkYXRlQ2FsbGJhY2so
dXJsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0
byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0CisgICAgICBvZiBhbiBlbGVtZW50J3Mg
YGhyZWZgIGF0dHJpYnV0ZS4KKyAgICAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVu
IHVzaW5nIHRoZSB7e2FjdGlvbn19IGhlbHBlcgorICAgICAgdG8gZ2VuZXJhdGUgYSBVUkwgYmFz
ZWQgb24gYW4gZXZlbnQuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRob2QgZm9ybWF0VVJM
CisgICAgICBAcGFyYW0gdXJsIHtTdHJpbmd9CisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHVybAor
ICAgICovCisgICAgZm9ybWF0VVJMOiBmdW5jdGlvbiAodXJsKSB7CisgICAgICB2YXIgcm9vdFVS
TCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm9vdFVSTCcpOworCisgICAg
ICBpZiAodXJsICE9PSAnJykgeworICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBp
ZiB0aGV5IGV4aXN0cworICAgICAgICByb290VVJMID0gcm9vdFVSTC5yZXBsYWNlKC9cLyQvLCAn
Jyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByb290VVJMICsgdXJsOworICAgIH0KKyAgfSk7
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9sb2NhdGlvbi91dGlsJywgWydleHBvcnRzJ10s
IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFJldHVy
bnMgdGhlIGN1cnJlbnQgYGxvY2F0aW9uLnBhdGhuYW1lYCwgbm9ybWFsaXplZCBmb3IgSUUgaW5j
b25zaXN0ZW5jaWVzLgorICAqLworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRQYXRo
ID0gZ2V0UGF0aDsKKyAgZXhwb3J0cy5nZXRRdWVyeSA9IGdldFF1ZXJ5OworICBleHBvcnRzLmdl
dEhhc2ggPSBnZXRIYXNoOworICBleHBvcnRzLmdldEZ1bGxQYXRoID0gZ2V0RnVsbFBhdGg7Cisg
IGV4cG9ydHMuZ2V0T3JpZ2luID0gZ2V0T3JpZ2luOworICBleHBvcnRzLnN1cHBvcnRzSGFzaENo
YW5nZSA9IHN1cHBvcnRzSGFzaENoYW5nZTsKKyAgZXhwb3J0cy5zdXBwb3J0c0hpc3RvcnkgPSBz
dXBwb3J0c0hpc3Rvcnk7CisgIGV4cG9ydHMucmVwbGFjZVBhdGggPSByZXBsYWNlUGF0aDsKKwor
ICBmdW5jdGlvbiBnZXRQYXRoKGxvY2F0aW9uKSB7CisgICAgdmFyIHBhdGhuYW1lID0gbG9jYXRp
b24ucGF0aG5hbWU7CisgICAgLy8gVmFyaW91cyB2ZXJzaW9ucyBvZiBJRS9PcGVyYSBkb24ndCBh
bHdheXMgcmV0dXJuIGEgbGVhZGluZyBzbGFzaAorICAgIGlmIChwYXRobmFtZS5jaGFyQXQoMCkg
IT09ICcvJykgeworICAgICAgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gcGF0aG5hbWU7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBS
ZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlvbi5zZWFyY2hgLgorICAqLworCisgIGZ1bmN0aW9u
IGdldFF1ZXJ5KGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIGxvY2F0aW9uLnNlYXJjaDsKKyAgfQor
CisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFJldHVybnMgdGhlIGN1cnJlbnQgYGxvY2F0
aW9uLmhhc2hgIGJ5IHBhcnNpbmcgbG9jYXRpb24uaHJlZiBzaW5jZSBicm93c2VycworICAgIGlu
Y29uc2lzdGVudGx5IFVSTC1kZWNvZGUgYGxvY2F0aW9uLmhhc2hgLgorICAKKyAgICBTaG91bGQg
YmUgcGFzc2VkIHRoZSBicm93c2VyJ3MgYGxvY2F0aW9uYCBvYmplY3QgYXMgdGhlIGZpcnN0IGFy
Z3VtZW50LgorICAKKyAgICBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNn
aT9pZD00ODMzMDQKKyAgKi8KKworICBmdW5jdGlvbiBnZXRIYXNoKGxvY2F0aW9uKSB7CisgICAg
dmFyIGhyZWYgPSBsb2NhdGlvbi5ocmVmOworICAgIHZhciBoYXNoSW5kZXggPSBocmVmLmluZGV4
T2YoJyMnKTsKKworICAgIGlmIChoYXNoSW5kZXggPT09IC0xKSB7CisgICAgICByZXR1cm4gJyc7
CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBocmVmLnN1YnN0cihoYXNoSW5kZXgpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGxvY2F0aW9uKSB7CisgICAgcmV0dXJu
IGdldFBhdGgobG9jYXRpb24pICsgZ2V0UXVlcnkobG9jYXRpb24pICsgZ2V0SGFzaChsb2NhdGlv
bik7CisgIH0KKworICBmdW5jdGlvbiBnZXRPcmlnaW4obG9jYXRpb24pIHsKKyAgICB2YXIgb3Jp
Z2luID0gbG9jYXRpb24ub3JpZ2luOworCisgICAgLy8gT2xkZXIgYnJvd3NlcnMsIGVzcGVjaWFs
bHkgSUUsIGRvbid0IGhhdmUgb3JpZ2luCisgICAgaWYgKCFvcmlnaW4pIHsKKyAgICAgIG9yaWdp
biA9IGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3RuYW1lOworCisgICAg
ICBpZiAobG9jYXRpb24ucG9ydCkgeworICAgICAgICBvcmlnaW4gKz0gJzonICsgbG9jYXRpb24u
cG9ydDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3JpZ2luOworICB9CisKKyAgLyoK
KyAgICBgZG9jdW1lbnRNb2RlYCBvbmx5IGV4aXN0IGluIEludGVybmV0IEV4cGxvcmVyLCBhbmQg
aXQncyB0ZXN0ZWQgYmVjYXVzZSBJRTggcnVubmluZyBpbgorICAgIElFNyBjb21wYXRpYmlsaXR5
IG1vZGUgY2xhaW1zIHRvIHN1cHBvcnQgYG9uaGFzaGNoYW5nZWAgYnV0IGFjdHVhbGx5IGRvZXMg
bm90LgorICAKKyAgICBgZ2xvYmFsYCBpcyBhbiBvYmplY3QgdGhhdCBtYXkgaGF2ZSBhbiBgb25o
YXNoY2hhbmdlYCBwcm9wZXJ0eS4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAZnVuY3Rpb24gc3Vw
cG9ydHNIYXNoQ2hhbmdlCisgICovCisKKyAgZnVuY3Rpb24gc3VwcG9ydHNIYXNoQ2hhbmdlKGRv
Y3VtZW50TW9kZSwgZ2xvYmFsKSB7CisgICAgcmV0dXJuICdvbmhhc2hjaGFuZ2UnIGluIGdsb2Jh
bCAmJiAoZG9jdW1lbnRNb2RlID09PSB1bmRlZmluZWQgfHwgZG9jdW1lbnRNb2RlID4gNyk7Cisg
IH0KKworICAvKgorICAgIGB1c2VyQWdlbnRgIGlzIGEgdXNlciBhZ2VudCBzdHJpbmcuIFdlIHVz
ZSB1c2VyIGFnZW50IHRlc3RpbmcgaGVyZSwgYmVjYXVzZQorICAgIHRoZSBzdG9jayBBbmRyb2lk
IGJyb3dzZXIgaXMga25vd24gdG8gaGF2ZSBidWdneSB2ZXJzaW9ucyBvZiB0aGUgSGlzdG9yeSBB
UEksCisgICAgaW4gc29tZSBBbmRyb2lkIHZlcnNpb25zLgorICAKKyAgICBAcHJpdmF0ZQorICAg
IEBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkKKyAgKi8KKworICBmdW5jdGlvbiBzdXBwb3J0c0hp
c3RvcnkodXNlckFnZW50LCBoaXN0b3J5KSB7CisgICAgLy8gQm9vc3RlZCBmcm9tIE1vZGVybml6
cjogaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVh
dHVyZS1kZXRlY3RzL2hpc3RvcnkuanMKKyAgICAvLyBUaGUgc3RvY2sgYnJvd3NlciBvbiBBbmRy
b2lkIDIuMiAmIDIuMywgYW5kIDQuMC54IHJldHVybnMgcG9zaXRpdmUgb24gaGlzdG9yeSBzdXBw
b3J0CisgICAgLy8gVW5mb3J0dW5hdGVseSBzdXBwb3J0IGlzIHJlYWxseSBidWdneSBhbmQgdGhl
cmUgaXMgbm8gY2xlYW4gd2F5IHRvIGRldGVjdAorICAgIC8vIHRoZXNlIGJ1Z3MsIHNvIHdlIGZh
bGwgYmFjayB0byBhIHVzZXIgYWdlbnQgc25pZmYgOigKKworICAgIC8vIFdlIG9ubHkgd2FudCBB
bmRyb2lkIDIgYW5kIDQuMCwgc3RvY2sgYnJvd3NlciwgYW5kIG5vdCBDaHJvbWUgd2hpY2ggaWRl
bnRpZmllcworICAgIC8vIGl0c2VsZiBhcyAnTW9iaWxlIFNhZmFyaScgYXMgd2VsbCwgbm9yIFdp
bmRvd3MgUGhvbmUuCisgICAgaWYgKCh1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCAyLicpICE9
PSAtMSB8fCB1c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCA0LjAnKSAhPT0gLTEpICYmIHVzZXJB
Z2VudC5pbmRleE9mKCdNb2JpbGUgU2FmYXJpJykgIT09IC0xICYmIHVzZXJBZ2VudC5pbmRleE9m
KCdDaHJvbWUnKSA9PT0gLTEgJiYgdXNlckFnZW50LmluZGV4T2YoJ1dpbmRvd3MgUGhvbmUnKSA9
PT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gISEoaGlz
dG9yeSAmJiAncHVzaFN0YXRlJyBpbiBoaXN0b3J5KTsKKyAgfQorCisgIC8qKgorICAgIFJlcGxh
Y2VzIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBtYWtpbmcgc3VyZSB3ZSBleHBsaWNpdGx5IGluY2x1
ZGUgdGhlIG9yaWdpbgorICAgIHRvIHByZXZlbnQgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQg
b3JpZ2luLgorICAKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9uIHJlcGxhY2VQYXRo
KGxvY2F0aW9uLCBwYXRoKSB7CisgICAgbG9jYXRpb24ucmVwbGFjZShnZXRPcmlnaW4obG9jYXRp
b24pICsgcGF0aCk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1yb3V0aW5nL3NlcnZpY2VzL3Jv
dXRpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsICdlbWJl
ci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvY29tcHV0ZWRfbWFjcm9zJywgJ2Vt
YmVyLXJvdXRpbmcvdXRpbHMnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQs
IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9lbWJlck1l
dGFsQXNzaWduKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
cm91dGluZworICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgUm91dGlu
ZyBzZXJ2aWNlIGlzIHVzZWQgYnkgTGlua0NvbXBvbmVudCwgYW5kIHByb3ZpZGVzIGZhY2lsaXRp
ZXMgZm9yCisgICAgdGhlIGNvbXBvbmVudC92aWV3IGxheWVyIHRvIGludGVyYWN0IHdpdGggdGhl
IHJvdXRlci4KKyAgCisgICAgV2hpbGUgc3RpbGwgcHJpdmF0ZSwgdGhpcyBzZXJ2aWNlIGNhbiBl
dmVudHVhbGx5IGJlIG9wZW5lZCB1cCwgYW5kIHByb3ZpZGVzCisgICAgdGhlIHNldCBvZiBBUEkg
bmVlZGVkIGZvciBjb21wb25lbnRzIHRvIGNvbnRyb2wgcm91dGluZyB3aXRob3V0IGludGVyYWN0
aW5nCisgICAgd2l0aCByb3V0ZXIgaW50ZXJuYWxzLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBj
bGFzcyBSb3V0aW5nU2VydmljZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJSdW50
aW1lU3lzdGVtU2VydmljZS5kZWZhdWx0LmV4dGVuZCh7CisgICAgcm91dGVyOiBudWxsLAorCisg
ICAgdGFyZ2V0U3RhdGU6IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9zLnJlYWRPbmx5KCdyb3V0
ZXIudGFyZ2V0U3RhdGUnKSwKKyAgICBjdXJyZW50U3RhdGU6IF9lbWJlck1ldGFsQ29tcHV0ZWRf
bWFjcm9zLnJlYWRPbmx5KCdyb3V0ZXIuY3VycmVudFN0YXRlJyksCisgICAgY3VycmVudFJvdXRl
TmFtZTogX2VtYmVyTWV0YWxDb21wdXRlZF9tYWNyb3MucmVhZE9ubHkoJ3JvdXRlci5jdXJyZW50
Um91dGVOYW1lJyksCisgICAgY3VycmVudFBhdGg6IF9lbWJlck1ldGFsQ29tcHV0ZWRfbWFjcm9z
LnJlYWRPbmx5KCdyb3V0ZXIuY3VycmVudFBhdGgnKSwKKworICAgIGF2YWlsYWJsZVJvdXRlczog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJykucm91dGVyLnJlY29nbml6ZXIubmFtZXMpOworICAg
IH0sCisKKyAgICBoYXNSb3V0ZTogZnVuY3Rpb24gKHJvdXRlTmFtZSkgeworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJykuaGFzUm91dGUocm91
dGVOYW1lKTsKKyAgICB9LAorCisgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAocm91dGVOYW1l
LCBtb2RlbHMsIHF1ZXJ5UGFyYW1zLCBzaG91bGRSZXBsYWNlKSB7CisgICAgICB2YXIgcm91dGVy
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb3V0ZXInKTsKKworICAgICAg
dmFyIHRyYW5zaXRpb24gPSByb3V0ZXIuX2RvVHJhbnNpdGlvbihyb3V0ZU5hbWUsIG1vZGVscywg
cXVlcnlQYXJhbXMpOworCisgICAgICBpZiAoc2hvdWxkUmVwbGFjZSkgeworICAgICAgICB0cmFu
c2l0aW9uLm1ldGhvZCgncmVwbGFjZScpOworICAgICAgfQorICAgIH0sCisKKyAgICBub3JtYWxp
emVRdWVyeVBhcmFtczogZnVuY3Rpb24gKHJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykg
eworICAgICAgdmFyIHJvdXRlciA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
cm91dGVyJyk7CisgICAgICByb3V0ZXIuX3ByZXBhcmVRdWVyeVBhcmFtcyhyb3V0ZU5hbWUsIG1v
ZGVscywgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBnZW5lcmF0ZVVSTDogZnVuY3Rpb24g
KHJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFyIHJvdXRlciA9IF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncm91dGVyJyk7CisgICAgICBpZiAoIXJv
dXRlci5yb3V0ZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgdmlz
aWJsZVF1ZXJ5UGFyYW1zID0ge307CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHZp
c2libGVRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpOworCisgICAgICB0aGlzLm5vcm1hbGl6ZVF1
ZXJ5UGFyYW1zKHJvdXRlTmFtZSwgbW9kZWxzLCB2aXNpYmxlUXVlcnlQYXJhbXMpOworCisgICAg
ICB2YXIgYXJncyA9IF9lbWJlclJvdXRpbmdVdGlscy5yb3V0ZUFyZ3Mocm91dGVOYW1lLCBtb2Rl
bHMsIHZpc2libGVRdWVyeVBhcmFtcyk7CisgICAgICByZXR1cm4gcm91dGVyLmdlbmVyYXRlLmFw
cGx5KHJvdXRlciwgYXJncyk7CisgICAgfSwKKworICAgIGlzQWN0aXZlRm9yUm91dGU6IGZ1bmN0
aW9uIChjb250ZXh0cywgcXVlcnlQYXJhbXMsIHJvdXRlTmFtZSwgcm91dGVyU3RhdGUsIGlzQ3Vy
cmVudFdoZW5TcGVjaWZpZWQpIHsKKyAgICAgIHZhciByb3V0ZXIgPSBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQodGhpcywgJ3JvdXRlcicpOworCisgICAgICB2YXIgaGFuZGxlcnMgPSByb3V0
ZXIucm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3Iocm91dGVOYW1lKTsKKyAgICAgIHZhciBs
ZWFmTmFtZSA9IGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXI7CisgICAgICB2
YXIgbWF4aW11bUNvbnRleHRzID0gbnVtYmVyT2ZDb250ZXh0c0FjY2VwdGVkQnlIYW5kbGVyKHJv
dXRlTmFtZSwgaGFuZGxlcnMpOworCisgICAgICAvLyBOT1RFOiBhbnkgdWdsaW5lc3MgaW4gdGhl
IGNhbGN1bGF0aW9uIG9mIGFjdGl2ZW5lc3MgaXMgbGFyZ2VseQorICAgICAgLy8gZHVlIHRvIHRo
ZSBmYWN0IHRoYXQgd2Ugc3VwcG9ydCBhdXRvbWF0aWMgbm9ybWFsaXppbmcgb2YKKyAgICAgIC8v
IGByZXNvdXJjZWAgLT4gYHJlc291cmNlLmluZGV4YCwgZXZlbiB0aG91Z2ggdGhlcmUgbWlnaHQg
YmUKKyAgICAgIC8vIGR5bmFtaWMgc2VnbWVudHMgLyBxdWVyeSBwYXJhbXMgZGVmaW5lZCBvbiBg
cmVzb3VyY2UuaW5kZXhgCisgICAgICAvLyB3aGljaCBjb21wbGljYXRlcyAoYW5kIG1ha2VzIHNv
bWV3aGF0IGFtYmlndW91cykgdGhlIGNhbGN1bGF0aW9uCisgICAgICAvLyBvZiBhY3RpdmVuZXNz
IGZvciBsaW5rcyB0aGF0IGxpbmsgdG8gYHJlc291cmNlYCBpbnN0ZWFkIG9mCisgICAgICAvLyBk
aXJlY3RseSB0byBgcmVzb3VyY2UuaW5kZXhgLgorCisgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZl
IGVub3VnaCBjb250ZXh0cyByZXZlcnQgYmFjayB0byBmdWxsIHJvdXRlIG5hbWUKKyAgICAgIC8v
IHRoaXMgaXMgYmVjYXVzZSB0aGUgbGVhZiByb3V0ZSB3aWxsIHVzZSBvbmUgb2YgdGhlIGNvbnRl
eHRzCisgICAgICBpZiAoY29udGV4dHMubGVuZ3RoID4gbWF4aW11bUNvbnRleHRzKSB7CisgICAg
ICAgIHJvdXRlTmFtZSA9IGxlYWZOYW1lOworICAgICAgfQorCisgICAgICByZXR1cm4gcm91dGVy
U3RhdGUuaXNBY3RpdmVJbnRlbnQocm91dGVOYW1lLCBjb250ZXh0cywgcXVlcnlQYXJhbXMsICFp
c0N1cnJlbnRXaGVuU3BlY2lmaWVkKTsKKyAgICB9CisgIH0pOworCisgIGZ1bmN0aW9uIG51bWJl
ck9mQ29udGV4dHNBY2NlcHRlZEJ5SGFuZGxlcihoYW5kbGVyLCBoYW5kbGVySW5mb3MpIHsKKyAg
ICB2YXIgcmVxID0gMDsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJJbmZvcy5sZW5n
dGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHJlcSA9IHJlcSArIGhhbmRsZXJJbmZvc1tpXS5uYW1l
cy5sZW5ndGg7CisgICAgICBpZiAoaGFuZGxlckluZm9zW2ldLmhhbmRsZXIgPT09IGhhbmRsZXIp
IHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlcTsKKyAg
fQorfSk7CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2NhY2hlJywgWydleHBvcnRzJywg
J2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
UnVudGltZVN5c3RlbU9iamVjdCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW5p
dDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5jYWNoZSA9IHt9OworICAgIH0sCisgICAgaGFz
OiBmdW5jdGlvbiAoYnVja2V0S2V5KSB7CisgICAgICByZXR1cm4gYnVja2V0S2V5IGluIHRoaXMu
Y2FjaGU7CisgICAgfSwKKyAgICBzdGFzaDogZnVuY3Rpb24gKGJ1Y2tldEtleSwga2V5LCB2YWx1
ZSkgeworICAgICAgdmFyIGJ1Y2tldCA9IHRoaXMuY2FjaGVbYnVja2V0S2V5XTsKKyAgICAgIGlm
ICghYnVja2V0KSB7CisgICAgICAgIGJ1Y2tldCA9IHRoaXMuY2FjaGVbYnVja2V0S2V5XSA9IHt9
OworICAgICAgfQorICAgICAgYnVja2V0W2tleV0gPSB2YWx1ZTsKKyAgICB9LAorICAgIGxvb2t1
cDogZnVuY3Rpb24gKGJ1Y2tldEtleSwgcHJvcCwgZGVmYXVsdFZhbHVlKSB7CisgICAgICB2YXIg
Y2FjaGUgPSB0aGlzLmNhY2hlOworICAgICAgaWYgKCEoYnVja2V0S2V5IGluIGNhY2hlKSkgewor
ICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgdmFyIGJ1Y2tldCA9
IGNhY2hlW2J1Y2tldEtleV07CisgICAgICBpZiAocHJvcCBpbiBidWNrZXQpIHsKKyAgICAgICAg
cmV0dXJuIGJ1Y2tldFtwcm9wXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkZWZh
dWx0VmFsdWU7CisgICAgICB9CisgICAgfSwKKyAgICBjYWNoZTogbnVsbAorICB9KTsKK30pOwor
ZW5pZmVkKCJlbWJlci1yb3V0aW5nL3N5c3RlbS9jb250cm9sbGVyX2ZvciIsIFsiZXhwb3J0cyJd
LCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAvKioKKyAgICBGaW5kcyBhIGNvbnRyb2xsZXIg
aW5zdGFuY2UuCisgIAorICAgIEBmb3IgRW1iZXIKKyAgICBAbWV0aG9kIGNvbnRyb2xsZXJGb3IK
KyAgICBAcHJpdmF0ZQorICAqLworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5kZWZhdWx0
ID0gY29udHJvbGxlckZvcjsKKworICBmdW5jdGlvbiBjb250cm9sbGVyRm9yKGNvbnRhaW5lciwg
Y29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlvbnMpIHsKKyAgICByZXR1cm4gY29udGFpbmVyLmxv
b2t1cCgiY29udHJvbGxlcjoiICsgY29udHJvbGxlck5hbWUsIGxvb2t1cE9wdGlvbnMpOworICB9
Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vZHNsJywgWydleHBvcnRzJywgJ2Vt
YmVyLW1ldGFsL2RlYnVnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnKSB7
CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICBmdW5jdGlvbiBEU0wobmFtZSwgb3B0aW9ucykgewor
ICAgIHRoaXMucGFyZW50ID0gbmFtZTsKKyAgICB0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0ZXMg
PSBvcHRpb25zICYmIG9wdGlvbnMuZW5hYmxlTG9hZGluZ1N1YnN0YXRlczsKKyAgICB0aGlzLm1h
dGNoZXMgPSBbXTsKKyAgICB0aGlzLmV4cGxpY2l0SW5kZXggPSB1bmRlZmluZWQ7CisgICAgdGhp
cy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IERTTDsKKwor
ICBEU0wucHJvdG90eXBlID0geworICAgIHJvdXRlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywg
Y2FsbGJhY2spIHsKKyAgICAgIHZhciBkdW1teUVycm9yUm91dGUgPSAnL191bnVzZWRfZHVtbXlf
ZXJyb3JfcGF0aF9yb3V0ZV8nICsgbmFtZSArICcvOmVycm9yJzsKKyAgICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7CisgICAg
ICAgIGNhbGxiYWNrID0gb3B0aW9uczsKKyAgICAgICAgb3B0aW9ucyA9IHt9OworICAgICAgfQor
CisgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICBvcHRpb25zID0g
e307CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdcJycgKyBuYW1l
ICsgJ1wnIGNhbm5vdCBiZSB1c2VkIGFzIGEgcm91dGUgbmFtZS4nLCAoZnVuY3Rpb24gKCkgewor
ICAgICAgICBpZiAob3B0aW9ucy5vdmVycmlkZU5hbWVBc3NlcnRpb24gPT09IHRydWUpIHsKKyAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBbJ2FycmF5
JywgJ2Jhc2ljJywgJ29iamVjdCcsICdhcHBsaWNhdGlvbiddLmluZGV4T2YobmFtZSkgPT09IC0x
OworICAgICAgfSkoKSk7CisKKyAgICAgIGlmICh0aGlzLmVuYWJsZUxvYWRpbmdTdWJzdGF0ZXMp
IHsKKyAgICAgICAgY3JlYXRlUm91dGUodGhpcywgbmFtZSArICdfbG9hZGluZycsIHsgcmVzZXRO
YW1lc3BhY2U6IG9wdGlvbnMucmVzZXROYW1lc3BhY2UgfSk7CisgICAgICAgIGNyZWF0ZVJvdXRl
KHRoaXMsIG5hbWUgKyAnX2Vycm9yJywgeyBwYXRoOiBkdW1teUVycm9yUm91dGUgfSk7CisgICAg
ICB9CisKKyAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICB2YXIgZnVsbE5hbWUgPSBnZXRG
dWxsTmFtZSh0aGlzLCBuYW1lLCBvcHRpb25zLnJlc2V0TmFtZXNwYWNlKTsKKyAgICAgICAgdmFy
IGRzbCA9IG5ldyBEU0woZnVsbE5hbWUsIHRoaXMub3B0aW9ucyk7CisKKyAgICAgICAgY3JlYXRl
Um91dGUoZHNsLCAnbG9hZGluZycpOworICAgICAgICBjcmVhdGVSb3V0ZShkc2wsICdlcnJvcics
IHsgcGF0aDogZHVtbXlFcnJvclJvdXRlIH0pOworCisgICAgICAgIGNhbGxiYWNrLmNhbGwoZHNs
KTsKKworICAgICAgICBjcmVhdGVSb3V0ZSh0aGlzLCBuYW1lLCBvcHRpb25zLCBkc2wuZ2VuZXJh
dGUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjcmVhdGVSb3V0ZSh0aGlzLCBuYW1lLCBv
cHRpb25zKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcHVzaDogZnVuY3Rpb24gKHVybCwgbmFt
ZSwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTsKKyAgICAg
IGlmICh1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFd
ID09PSAnaW5kZXgnKSB7CisgICAgICAgIHRoaXMuZXhwbGljaXRJbmRleCA9IHRydWU7CisgICAg
ICB9CisKKyAgICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmwsIG5hbWUsIGNhbGxiYWNrXSk7Cisg
ICAgfSwKKworICAgIHJlc291cmNlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywgY2FsbGJhY2sp
IHsKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09
PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsKKyAgICAgICAgb3B0
aW9ucyA9IHt9OworICAgICAgfQorCisgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkg
eworICAgICAgICBvcHRpb25zID0ge307CisgICAgICB9CisKKyAgICAgIG9wdGlvbnMucmVzZXRO
YW1lc3BhY2UgPSB0cnVlOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ3RoaXMu
cmVzb3VyY2UoKSBpcyBkZXByZWNhdGVkLiBVc2UgdGhpcy5yb3V0ZShcJ25hbWVcJywgeyByZXNl
dE5hbWVzcGFjZTogdHJ1ZSB9LCBmdW5jdGlvbiAoKSB7fSkgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJvdXRpbmcucm91dGVyLXJlc291cmNlJywgdW50aWw6ICczLjAuMCcgfSk7Cisg
ICAgICB0aGlzLnJvdXRlKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKTsKKyAgICB9LAorCisgICAg
Z2VuZXJhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBkc2xNYXRjaGVzID0gdGhpcy5tYXRj
aGVzOworCisgICAgICBpZiAoIXRoaXMuZXhwbGljaXRJbmRleCkgeworICAgICAgICB0aGlzLnJv
dXRlKCdpbmRleCcsIHsgcGF0aDogJy8nIH0pOworICAgICAgfQorCisgICAgICByZXR1cm4gZnVu
Y3Rpb24gKG1hdGNoKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZHNsTWF0Y2hlcy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICB2YXIgZHNsTWF0Y2ggPSBkc2xNYXRjaGVz
W2ldOworICAgICAgICAgIG1hdGNoKGRzbE1hdGNoWzBdKS50byhkc2xNYXRjaFsxXSwgZHNsTWF0
Y2hbMl0pOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBj
YW5OZXN0KGRzbCkgeworICAgIHJldHVybiBkc2wucGFyZW50ICYmIGRzbC5wYXJlbnQgIT09ICdh
cHBsaWNhdGlvbic7CisgIH0KKworICBmdW5jdGlvbiBnZXRGdWxsTmFtZShkc2wsIG5hbWUsIHJl
c2V0TmFtZXNwYWNlKSB7CisgICAgaWYgKGNhbk5lc3QoZHNsKSAmJiByZXNldE5hbWVzcGFjZSAh
PT0gdHJ1ZSkgeworICAgICAgcmV0dXJuIGRzbC5wYXJlbnQgKyAnLicgKyBuYW1lOworICAgIH0g
ZWxzZSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjcmVh
dGVSb3V0ZShkc2wsIG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7CisgICAgb3B0aW9ucyA9IG9w
dGlvbnMgfHwge307CisKKyAgICB2YXIgZnVsbE5hbWUgPSBnZXRGdWxsTmFtZShkc2wsIG5hbWUs
IG9wdGlvbnMucmVzZXROYW1lc3BhY2UpOworCisgICAgaWYgKHR5cGVvZiBvcHRpb25zLnBhdGgg
IT09ICdzdHJpbmcnKSB7CisgICAgICBvcHRpb25zLnBhdGggPSAnLycgKyBuYW1lOworICAgIH0K
KworICAgIGRzbC5wdXNoKG9wdGlvbnMucGF0aCwgZnVsbE5hbWUsIGNhbGxiYWNrKTsKKyAgfQor
CisgIERTTC5tYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICB2YXIgZHNsID0gbmV3IERT
TCgpOworICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsKKyAgICByZXR1cm4gZHNsOworICB9OworfSk7
CitlbmlmZWQoJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2dlbmVyYXRlX2NvbnRyb2xsZXInLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0J10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZW5lcmF0ZUNvbnRyb2xsZXJG
YWN0b3J5ID0gZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeTsKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
Z2VuZXJhdGVDb250cm9sbGVyOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItcm91dGluZworICAqLworCisgIC8qKgorICAgIEdlbmVyYXRlcyBhIGNvbnRyb2xs
ZXIgZmFjdG9yeQorICAKKyAgICBAZm9yIEVtYmVyCisgICAgQG1ldGhvZCBnZW5lcmF0ZUNvbnRy
b2xsZXJGYWN0b3J5CisgICAgQHByaXZhdGUKKyAgKi8KKworICBmdW5jdGlvbiBnZW5lcmF0ZUNv
bnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSwgY29udGV4dCkgeworICAgIHZh
ciBGYWN0b3J5LCBmdWxsTmFtZTsKKworICAgIEZhY3RvcnkgPSBvd25lci5fbG9va3VwRmFjdG9y
eSgnY29udHJvbGxlcjpiYXNpYycpLmV4dGVuZCh7CisgICAgICBpc0dlbmVyYXRlZDogdHJ1ZSwK
KyAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAnKGdlbmVyYXRl
ZCAnICsgY29udHJvbGxlck5hbWUgKyAnIGNvbnRyb2xsZXIpJzsKKyAgICAgIH0KKyAgICB9KTsK
KworICAgIGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOworCisgICAg
b3duZXIucmVnaXN0ZXIoZnVsbE5hbWUsIEZhY3RvcnkpOworCisgICAgcmV0dXJuIEZhY3Rvcnk7
CisgIH0KKworICAvKioKKyAgICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRlcyBhIGNvbnRyb2xs
ZXIuCisgIAorICAgIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY29udHJvbGxlciBmYWN0b3J5
IGlzIGRlcml2ZWQKKyAgICBmcm9tIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBhbiBh
cnJheSBhbiBhcnJheSBjb250cm9sbGVyCisgICAgaXMgZ2VuZXJhdGVkLCBpZiBhbiBvYmplY3Qs
IGFuIG9iamVjdCBjb250cm9sbGVyIG90aGVyd2lzZSwgYSBiYXNpYworICAgIGNvbnRyb2xsZXIg
aXMgZ2VuZXJhdGVkLgorICAKKyAgICBAZm9yIEVtYmVyCisgICAgQG1ldGhvZCBnZW5lcmF0ZUNv
bnRyb2xsZXIKKyAgICBAcHJpdmF0ZQorICAgIEBzaW5jZSAxLjMuMAorICAqLworCisgIGZ1bmN0
aW9uIGdlbmVyYXRlQ29udHJvbGxlcihvd25lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpIHsK
KyAgICBnZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KG93bmVyLCBjb250cm9sbGVyTmFtZSwgY29u
dGV4dCk7CisKKyAgICB2YXIgZnVsbE5hbWUgPSAnY29udHJvbGxlcjonICsgY29udHJvbGxlck5h
bWU7CisgICAgdmFyIGluc3RhbmNlID0gb3duZXIubG9va3VwKGZ1bGxOYW1lKTsKKworICAgIGlm
IChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaW5zdGFuY2UsICduYW1lc3BhY2UuTE9HX0FD
VElWRV9HRU5FUkFUSU9OJykpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuaW5mbygnZ2VuZXJh
dGVkIC0+ICcgKyBmdWxsTmFtZSwgeyBmdWxsTmFtZTogZnVsbE5hbWUgfSk7CisgICAgfQorCisg
ICAgcmV0dXJuIGluc3RhbmNlOworICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0
ZW0vcXVlcnlfcGFyYW1zJywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVj
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCkgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGltZVN5c3RlbU9i
amVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaXNRdWVyeVBhcmFtczogdHJ1ZSwKKyAgICB2YWx1
ZXM6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGUn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL2dl
dF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAnZW1iZXItbWV0YWwvY29tcHV0
ZWQnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXIt
bWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9jb3B5JywgJ2VtYmVyLXJ1bnRpbWUvc3lz
dGVtL3N0cmluZycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGlt
ZS9zeXN0ZW0vbmF0aXZlX2FycmF5JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQnLCAn
ZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRsZXInLCAnZW1iZXItcm91dGluZy9zeXN0
ZW0vZ2VuZXJhdGVfY29udHJvbGxlcicsICdlbWJlci1yb3V0aW5nL3V0aWxzJywgJ2NvbnRhaW5l
ci9vd25lcicsICdlbWJlci1tZXRhbC9pc19lbXB0eSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1i
ZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQsIF9lbWJlck1ldGFsR2V0X3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsSXNfbm9uZSwgX2Vt
YmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxBc3NpZ24sIF9lbWJlclJ1bnRpbWVVdGlscywg
X2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyUnVudGltZUNvcHksIF9lbWJlclJ1bnRpbWVTeXN0
ZW1TdHJpbmcsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXksIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLCBfZW1iZXJSdW50aW1lTWl4
aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJvdXRpbmdTeXN0ZW1HZW5lcmF0ZV9jb250cm9sbGVy
LCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxJc19lbXB0
eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNs
aWNlOworCisgIGZ1bmN0aW9uIEsoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKyAgKi8KKworICAv
KioKKyAgICBUaGUgYEVtYmVyLlJvdXRlYCBjbGFzcyBpcyB1c2VkIHRvIGRlZmluZSBpbmRpdmlk
dWFsIHJvdXRlcy4gUmVmZXIgdG8KKyAgICB0aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6Ly9lbWJl
cmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZvciBkb2N1bWVudGF0aW9uLgorICAKKyAgICBAY2xh
c3MgUm91dGUKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0
CisgICAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgorICAgIEB1c2VzIEVtYmVyLkV2ZW50ZWQK
KyAgICBAcHVibGljCisgICovCisgIHZhciBSb3V0ZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmpl
Y3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9oYW5kbGVyLmRlZmF1
bHQsIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLmRlZmF1bHQsIHsKKyAgICAvKioKKyAgICAg
IENvbmZpZ3VyYXRpb24gaGFzaCBmb3IgdGhpcyByb3V0ZSdzIHF1ZXJ5UGFyYW1zLiBUaGUgcG9z
c2libGUKKyAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgdGhlaXIgZGVmYXVsdHMgYXJl
IGFzIGZvbGxvd3MKKyAgICAgIChhc3N1bWluZyBhIHF1ZXJ5IHBhcmFtIHdob3NlIGNvbnRyb2xs
ZXIgcHJvcGVydHkgaXMgYHBhZ2VgKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBxdWVy
eVBhcmFtczogeworICAgICAgICBwYWdlOiB7CisgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgY29u
dHJvbGxlciBxdWVyeSBwYXJhbSBwcm9wZXJ0aWVzIGRvbid0CisgICAgICAgICAgLy8gY2F1c2Ug
YSBmdWxsIHRyYW5zaXRpb24gd2hlbiB0aGV5IGFyZSBjaGFuZ2VkLCBidXQKKyAgICAgICAgICAv
LyByYXRoZXIgb25seSBjYXVzZSB0aGUgVVJMIHRvIHVwZGF0ZS4gU2V0dGluZworICAgICAgICAg
IC8vIGByZWZyZXNoTW9kZWxgIHRvIHRydWUgd2lsbCBjYXVzZSBhbiAiaW4tcGxhY2UiCisgICAg
ICAgICAgLy8gdHJhbnNpdGlvbiB0byBvY2N1ciwgd2hlcmVieSB0aGUgbW9kZWwgaG9va3MgZm9y
CisgICAgICAgICAgLy8gdGhpcyByb3V0ZSAoYW5kIGFueSBjaGlsZCByb3V0ZXMpIHdpbGwgcmUt
ZmlyZSwgYWxsb3dpbmcKKyAgICAgICAgICAvLyB5b3UgdG8gcmVsb2FkIG1vZGVscyAoZS5nLiwg
ZnJvbSB0aGUgc2VydmVyKSB1c2luZyB0aGUKKyAgICAgICAgICAvLyB1cGRhdGVkIHF1ZXJ5IHBh
cmFtIHZhbHVlcy4KKyAgICAgICAgICByZWZyZXNoTW9kZWw6IGZhbHNlLAorICAgICAgICAgICAv
LyBCeSBkZWZhdWx0LCBjaGFuZ2VzIHRvIGNvbnRyb2xsZXIgcXVlcnkgcGFyYW0gcHJvcGVydGll
cworICAgICAgICAgIC8vIGNhdXNlIHRoZSBVUkwgdG8gdXBkYXRlIHZpYSBgcHVzaFN0YXRlYCwg
d2hpY2ggbWVhbnMgYW4KKyAgICAgICAgICAvLyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJy
b3dzZXIncyBoaXN0b3J5LCBhbGxvd2luZworICAgICAgICAgIC8vIHlvdSB0byB1c2UgdGhlIGJh
Y2sgYnV0dG9uIHRvIHJlc3RvcmUgdGhlIGFwcCB0byB0aGUKKyAgICAgICAgICAvLyBwcmV2aW91
cyBzdGF0ZSBiZWZvcmUgdGhlIHF1ZXJ5IHBhcmFtIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgorICAg
ICAgICAgIC8vIFNldHRpbmcgYHJlcGxhY2VgIHRvIHRydWUgd2lsbCB1c2UgYHJlcGxhY2VTdGF0
ZWAgKG9yIGl0cworICAgICAgICAgIC8vIGhhc2ggbG9jYXRpb24gZXF1aXZhbGVudCksIHdoaWNo
IGNhdXNlcyBubyBicm93c2VyIGhpc3RvcnkKKyAgICAgICAgICAvLyBpdGVtIHRvIGJlIGFkZGVk
LiBUaGlzIG9wdGlvbnMgbmFtZSBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUKKyAgICAgICAgICAvLyB0
aGUgc2FtZSBhcyB0aGUgYGxpbmstdG9gIGhlbHBlcidzIGByZXBsYWNlYCBvcHRpb24uCisgICAg
ICAgICAgcmVwbGFjZTogZmFsc2UsCisgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBxdWVy
eSBwYXJhbSBVUkwga2V5IGlzIHRoZSBzYW1lIG5hbWUgYXMKKyAgICAgICAgICAvLyB0aGUgY29u
dHJvbGxlciBwcm9wZXJ0eSBuYW1lLiBVc2UgYGFzYCB0byBzcGVjaWZ5IGEKKyAgICAgICAgICAv
LyBkaWZmZXJlbnQgVVJMIGtleS4KKyAgICAgICAgICBhczogJ3BhZ2UnCisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBxdWVyeVBhcmFtcworICAgICAgQGZv
ciBFbWJlci5Sb3V0ZQorICAgICAgQHR5cGUgT2JqZWN0CisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICBxdWVyeVBhcmFtczoge30sCisKKyAgICAvKioKKyAgICAgIFRoZSBuYW1lIG9mIHRoZSBy
b3V0ZSwgZG90LWRlbGltaXRlZC4KKyAgICAgICBGb3IgZXhhbXBsZSwgYSByb3V0ZSBmb3VuZCBh
dCBgYXBwL3JvdXRlcy9wb3N0cy9wb3N0LmpzYCBvcgorICAgICAgYGFwcC9wb3N0cy9wb3N0L3Jv
dXRlLmpzYCAod2l0aCBwb2RzKSB3aWxsIGhhdmUgYSBgcm91dGVOYW1lYCBvZgorICAgICAgYHBv
c3RzLnBvc3RgLgorICAgICAgIEBwcm9wZXJ0eSByb3V0ZU5hbWUKKyAgICAgIEBmb3IgRW1iZXIu
Um91dGUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAv
KioKKyAgICAgIEBwcml2YXRlCisgICAgICAgQHByb3BlcnR5IF9xcAorICAgICovCisgICAgX3Fw
OiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBf
dGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBjb250cm9sbGVyUHJvdG8sIGNvbWJpbmVkUXVlcnlQ
YXJhbWV0ZXJDb25maWd1cmF0aW9uOworCisgICAgICB2YXIgY29udHJvbGxlck5hbWUgPSB0aGlz
LmNvbnRyb2xsZXJOYW1lIHx8IHRoaXMucm91dGVOYW1lOworICAgICAgdmFyIGRlZmluZWRDb250
cm9sbGVyQ2xhc3MgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykuX2xvb2t1cEZhY3Rv
cnkoJ2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lKTsKKyAgICAgIHZhciBxdWVyeVBhcmFt
ZXRlckNvbmZpZ3VyYXRvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncXVl
cnlQYXJhbXMnKTsKKyAgICAgIHZhciBoYXNSb3V0ZXJEZWZpbmVkUXVlcnlQYXJhbXMgPSAhIU9i
amVjdC5rZXlzKHF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJhdG9uKS5sZW5ndGg7CisKKyAgICAgIGlm
IChkZWZpbmVkQ29udHJvbGxlckNsYXNzKSB7CisgICAgICAgIC8vIHRoZSBkZXZlbG9wZXIgaGFz
IGF1dGhvcmVkIGEgY29udHJvbGxlciBjbGFzcyBpbiB0aGVpciBhcHBsaWNhdGlvbiBmb3IgdGhp
cyByb3V0ZQorICAgICAgICAvLyBhY2Nlc3MgdGhlIHByb3RvdHlwZSwgZmluZCBpdHMgcXVlcnkg
cGFyYW1zIGFuZCBub3JtYWxpemUgdGhlaXIgb2JqZWN0IHNoYXBlCisgICAgICAgIC8vIHRoZW0g
bWVyZ2UgaW4gdGhlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhlIHJvdXRlLiBBcyBhIG1lcmdlZFByb3Bl
cnR5LCBSb3V0ZSNxdWVyeVBhcmFtcyBpcyBhbHdheXMKKyAgICAgICAgLy8gYXQgbGVhc3QgYHt9
YAorICAgICAgICBjb250cm9sbGVyUHJvdG8gPSBkZWZpbmVkQ29udHJvbGxlckNsYXNzLnByb3Rv
KCk7CisKKyAgICAgICAgdmFyIGNvbnRyb2xsZXJEZWZpbmVkUXVlcnlQYXJhbWV0ZXJDb25maWd1
cmF0aW9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXJQcm90bywgJ3F1
ZXJ5UGFyYW1zJyk7CisgICAgICAgIHZhciBub3JtYWxpemVkQ29udHJvbGxlclF1ZXJ5UGFyYW1l
dGVyQ29uZmlndXJhdGlvbiA9IF9lbWJlclJvdXRpbmdVdGlscy5ub3JtYWxpemVDb250cm9sbGVy
UXVlcnlQYXJhbXMoY29udHJvbGxlckRlZmluZWRRdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRpb24p
OworICAgICAgICBjb21iaW5lZFF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJhdGlvbiA9IG1lcmdlRWFj
aFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRDb250cm9sbGVyUXVlcnlQYXJhbWV0ZXJDb25maWd1cmF0
aW9uLCBxdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRvbik7CisgICAgICB9IGVsc2UgaWYgKGhhc1Jv
dXRlckRlZmluZWRRdWVyeVBhcmFtcykgeworICAgICAgICAvLyB0aGUgZGV2ZWxvcGVyIGhhcyBu
b3QgZGVmaW5lZCBhIGNvbnRyb2xsZXIgYnV0ICpoYXMqIHN1cHBsaWVkIHJvdXRlIHF1ZXJ5IHBh
cmFtcy4KKyAgICAgICAgLy8gR2VuZXJhdGUgYSBjbGFzcyBmb3IgdGhlbSBzbyB3ZSBjYW4gbGF0
ZXIgaW5zZXJ0IGRlZmF1bHQgdmFsdWVzCisgICAgICAgIHZhciBnZW5lcmF0ZWRDb250cm9sbGVy
Q2xhc3MgPSBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5nZW5lcmF0ZUNv
bnRyb2xsZXJGYWN0b3J5KF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKSwgY29udHJvbGxl
ck5hbWUpOworICAgICAgICBjb250cm9sbGVyUHJvdG8gPSBnZW5lcmF0ZWRDb250cm9sbGVyQ2xh
c3MucHJvdG8oKTsKKyAgICAgICAgY29tYmluZWRRdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRpb24g
PSBxdWVyeVBhcmFtZXRlckNvbmZpZ3VyYXRvbjsKKyAgICAgIH0KKworICAgICAgdmFyIHFwcyA9
IFtdOworICAgICAgdmFyIG1hcCA9IHt9OworICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBbXTsK
KworICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gY29tYmluZWRRdWVyeVBhcmFtZXRlckNvbmZp
Z3VyYXRpb24pIHsKKyAgICAgICAgaWYgKCFjb21iaW5lZFF1ZXJ5UGFyYW1ldGVyQ29uZmlndXJh
dGlvbi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIHRvIHN1cHBvcnQgdGhlIGR1YmlvdXMgZmVhdHVyZSBvZiB1
c2luZyB1bmtub3duUHJvcGVydHkKKyAgICAgICAgLy8gb24gcXVlcnlQYXJhbXMgY29uZmlndXJh
dGlvbgorICAgICAgICBpZiAocHJvcE5hbWUgPT09ICd1bmtub3duUHJvcGVydHknIHx8IHByb3BO
YW1lID09PSAnX3N1cGVyJykgeworICAgICAgICAgIC8vIHBvc3NpYmxlIHRvZG86IGlzc3VlIGRl
cHJlY2F0aW9uIHdhcm5pbmc/CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg
ICAgICB2YXIgZGVzYyA9IGNvbWJpbmVkUXVlcnlQYXJhbWV0ZXJDb25maWd1cmF0aW9uW3Byb3BO
YW1lXTsKKworICAgICAgICB2YXIgc2NvcGUgPSBkZXNjLnNjb3BlIHx8ICdtb2RlbCc7CisgICAg
ICAgIHZhciBwYXJ0czsKKworICAgICAgICBpZiAoc2NvcGUgPT09ICdjb250cm9sbGVyJykgewor
ICAgICAgICAgIHBhcnRzID0gW107CisgICAgICAgIH0KKworICAgICAgICB2YXIgdXJsS2V5ID0g
ZGVzYy5hcyB8fCB0aGlzLnNlcmlhbGl6ZVF1ZXJ5UGFyYW1LZXkocHJvcE5hbWUpOworICAgICAg
ICB2YXIgZGVmYXVsdFZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xs
ZXJQcm90bywgcHJvcE5hbWUpOworCisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRW
YWx1ZSkpIHsKKyAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0
aXZlX2FycmF5LkEoZGVmYXVsdFZhbHVlLnNsaWNlKCkpOworICAgICAgICB9CisKKyAgICAgICAg
dmFyIHR5cGUgPSBkZXNjLnR5cGUgfHwgX2VtYmVyUnVudGltZVV0aWxzLnR5cGVPZihkZWZhdWx0
VmFsdWUpOworCisgICAgICAgIHZhciBkZWZhdWx0VmFsdWVTZXJpYWxpemVkID0gdGhpcy5zZXJp
YWxpemVRdWVyeVBhcmFtKGRlZmF1bHRWYWx1ZSwgdXJsS2V5LCB0eXBlKTsKKyAgICAgICAgdmFy
IHNjb3BlZFByb3BlcnR5TmFtZSA9IGNvbnRyb2xsZXJOYW1lICsgJzonICsgcHJvcE5hbWU7Cisg
ICAgICAgIHZhciBxcCA9IHsKKyAgICAgICAgICB1bmRlY29yYXRlZERlZmF1bHRWYWx1ZTogX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXJQcm90bywgcHJvcE5hbWUpLAorICAg
ICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLAorICAgICAgICAgIHNlcmlhbGl6ZWRE
ZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZVNlcmlhbGl6ZWQsCisgICAgICAgICAgc2VyaWFsaXpl
ZFZhbHVlOiBkZWZhdWx0VmFsdWVTZXJpYWxpemVkLAorCisgICAgICAgICAgdHlwZTogdHlwZSwK
KyAgICAgICAgICB1cmxLZXk6IHVybEtleSwKKyAgICAgICAgICBwcm9wOiBwcm9wTmFtZSwKKyAg
ICAgICAgICBzY29wZWRQcm9wZXJ0eU5hbWU6IHNjb3BlZFByb3BlcnR5TmFtZSwKKyAgICAgICAg
ICBjdHJsOiBjb250cm9sbGVyTmFtZSwKKyAgICAgICAgICByb3V0ZTogdGhpcywKKyAgICAgICAg
ICBwYXJ0czogcGFydHMsIC8vIHByb3ZpZGVkIGxhdGVyIHdoZW4gc3Rhc2hOYW1lcyBpcyBjYWxs
ZWQgaWYgJ21vZGVsJyBzY29wZQorICAgICAgICAgIHZhbHVlczogbnVsbCwgLy8gcHJvdmlkZWQg
bGF0ZXIgd2hlbiBzZXR1cCBpcyBjYWxsZWQuIG5vIGlkZWEgd2h5LgorICAgICAgICAgIHNjb3Bl
OiBzY29wZSwKKyAgICAgICAgICBwcmVmaXg6ICcnCisgICAgICAgIH07CisKKyAgICAgICAgbWFw
W3Byb3BOYW1lXSA9IG1hcFt1cmxLZXldID0gbWFwW3Njb3BlZFByb3BlcnR5TmFtZV0gPSBxcDsK
KyAgICAgICAgcXBzLnB1c2gocXApOworICAgICAgICBwcm9wZXJ0eU5hbWVzLnB1c2gocHJvcE5h
bWUpOworICAgICAgfQorCisgICAgICByZXR1cm4geworICAgICAgICBxcHM6IHFwcywKKyAgICAg
ICAgbWFwOiBtYXAsCisgICAgICAgIHByb3BlcnR5TmFtZXM6IHByb3BlcnR5TmFtZXMsCisgICAg
ICAgIHN0YXRlczogeworICAgICAgICAgIC8qCisgICAgICAgICAgICBDYWxsZWQgd2hlbiBhIHF1
ZXJ5IHBhcmFtZXRlciBjaGFuZ2VzIGluIHRoZSBVUkwsIHRoaXMgcm91dGUgY2FyZXMKKyAgICAg
ICAgICAgIGFib3V0IHRoYXQgcXVlcnkgcGFyYW1ldGVyLCBidXQgdGhlIHJvdXRlIGlzIG5vdCBj
dXJyZW50bHkKKyAgICAgICAgICAgIGluIHRoZSBhY3RpdmUgcm91dGUgaGllcmFyY2h5LgorICAg
ICAgICAgICovCisgICAgICAgICAgaW5hY3RpdmU6IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkgewor
ICAgICAgICAgICAgdmFyIHFwID0gbWFwW3Byb3BdOworICAgICAgICAgICAgX3RoaXMuX3FwQ2hh
bmdlZChwcm9wLCB2YWx1ZSwgcXApOworICAgICAgICAgIH0sCisgICAgICAgICAgLyoKKyAgICAg
ICAgICAgIENhbGxlZCB3aGVuIGEgcXVlcnkgcGFyYW1ldGVyIGNoYW5nZXMgaW4gdGhlIFVSTCwg
dGhpcyByb3V0ZSBjYXJlcworICAgICAgICAgICAgYWJvdXQgdGhhdCBxdWVyeSBwYXJhbWV0ZXIs
IGFuZCB0aGUgcm91dGUgaXMgY3VycmVudGx5CisgICAgICAgICAgICBpbiB0aGUgYWN0aXZlIHJv
dXRlIGhpZXJhcmNoeS4KKyAgICAgICAgICAqLworICAgICAgICAgIGFjdGl2ZTogZnVuY3Rpb24g
KHByb3AsIHZhbHVlKSB7CisgICAgICAgICAgICB2YXIgcXAgPSBtYXBbcHJvcF07CisgICAgICAg
ICAgICBfdGhpcy5fcXBDaGFuZ2VkKHByb3AsIHZhbHVlLCBxcCk7CisgICAgICAgICAgICByZXR1
cm4gX3RoaXMuX2FjdGl2ZVFQQ2hhbmdlZChtYXBbcHJvcF0sIHZhbHVlKTsKKyAgICAgICAgICB9
LAorICAgICAgICAgIC8qCisgICAgICAgICAgICBDYWxsZWQgd2hlbiBhIHZhbHVlIG9mIGEgcXVl
cnkgcGFyYW1ldGVyIHRoaXMgcm91dGUgaGFuZGxlcyBjaGFuZ2VzIGluIGEgY29udHJvbGxlcgor
ICAgICAgICAgICAgYW5kIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgaW4gdGhlIGFjdGl2ZSByb3V0
ZSBoaWVyYXJjaHkuCisgICAgICAgICAgKi8KKyAgICAgICAgICBhbGxvd092ZXJyaWRlczogZnVu
Y3Rpb24gKHByb3AsIHZhbHVlKSB7CisgICAgICAgICAgICB2YXIgcXAgPSBtYXBbcHJvcF07Cisg
ICAgICAgICAgICBfdGhpcy5fcXBDaGFuZ2VkKHByb3AsIHZhbHVlLCBxcCk7CisgICAgICAgICAg
ICByZXR1cm4gX3RoaXMuX3VwZGF0aW5nUVBDaGFuZ2VkKG1hcFtwcm9wXSk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9OworICAgIH0pLAorCisgICAgLyoqCisgICAgICBAcHJpdmF0
ZQorICAgICAgIEBwcm9wZXJ0eSBfbmFtZXMKKyAgICAqLworICAgIF9uYW1lczogbnVsbCwKKwor
ICAgIC8qKgorICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIF9zdGFzaE5hbWVzCisgICAg
Ki8KKyAgICBfc3Rhc2hOYW1lczogZnVuY3Rpb24gKF9oYW5kbGVySW5mbywgZHluYW1pY1BhcmVu
dCkgeworICAgICAgdmFyIGhhbmRsZXJJbmZvID0gX2hhbmRsZXJJbmZvOworICAgICAgaWYgKHRo
aXMuX25hbWVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBuYW1lcyA9
IHRoaXMuX25hbWVzID0gaGFuZGxlckluZm8uX25hbWVzOworCisgICAgICBpZiAoIW5hbWVzLmxl
bmd0aCkgeworICAgICAgICBoYW5kbGVySW5mbyA9IGR5bmFtaWNQYXJlbnQ7CisgICAgICAgIG5h
bWVzID0gaGFuZGxlckluZm8gJiYgaGFuZGxlckluZm8uX25hbWVzIHx8IFtdOworICAgICAgfQor
CisgICAgICB2YXIgcXBzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAu
cXBzJyk7CisgICAgICB2YXIgbGVuID0gcXBzLmxlbmd0aDsKKworICAgICAgdmFyIG5hbWVQYXRo
cyA9IG5ldyBBcnJheShuYW1lcy5sZW5ndGgpOworICAgICAgZm9yICh2YXIgYSA9IDAsIG5sZW4g
PSBuYW1lcy5sZW5ndGg7IGEgPCBubGVuOyArK2EpIHsKKyAgICAgICAgbmFtZVBhdGhzW2FdID0g
aGFuZGxlckluZm8ubmFtZSArICcuJyArIG5hbWVzW2FdOworICAgICAgfQorCisgICAgICBmb3Ig
KHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHZhciBxcCA9IHFwc1tpXTsKKyAg
ICAgICAgaWYgKHFwLnNjb3BlID09PSAnbW9kZWwnKSB7CisgICAgICAgICAgcXAucGFydHMgPSBu
YW1lUGF0aHM7CisgICAgICAgIH0KKyAgICAgICAgcXAucHJlZml4ID0gcXAuY3RybDsKKyAgICAg
IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIEBwcm9wZXJ0eSBf
YWN0aXZlUVBDaGFuZ2VkCisgICAgKi8KKyAgICBfYWN0aXZlUVBDaGFuZ2VkOiBmdW5jdGlvbiAo
cXAsIHZhbHVlKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByb3V0
ZXIuX2FjdGl2ZVFQQ2hhbmdlZChxcC5zY29wZWRQcm9wZXJ0eU5hbWUsIHZhbHVlKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBfdXBkYXRpbmdRUENo
YW5nZWQKKyAgICAqLworICAgIF91cGRhdGluZ1FQQ2hhbmdlZDogZnVuY3Rpb24gKHFwKSB7Cisg
ICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByb3V0ZXIuX3VwZGF0aW5nUVBD
aGFuZ2VkKHFwLnVybEtleSk7CisgICAgfSwKKworICAgIG1lcmdlZFByb3BlcnRpZXM6IFsncXVl
cnlQYXJhbXMnXSwKKworICAgIC8qKgorICAgICAgUmV0cmlldmVzIHBhcmFtZXRlcnMsIGZvciBj
dXJyZW50IHJvdXRlIHVzaW5nIHRoZSBzdGF0ZS5wYXJhbXMKKyAgICAgIHZhcmlhYmxlIGFuZCBn
ZXRRdWVyeVBhcmFtc0ZvciwgdXNpbmcgdGhlIHN1cHBsaWVkIHJvdXRlTmFtZS4KKyAgICAgICBA
bWV0aG9kIHBhcmFtc0ZvcgorICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKKyAgICAgIEBwdWJs
aWMKKyAgICAqLworICAgIHBhcmFtc0ZvcjogZnVuY3Rpb24gKG5hbWUpIHsKKyAgICAgIHZhciBy
b3V0ZSA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKS5sb29rdXAoJ3JvdXRlOicgKyBu
YW1lKTsKKworICAgICAgaWYgKCFyb3V0ZSkgeworICAgICAgICByZXR1cm4ge307CisgICAgICB9
CisKKyAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5z
aXRpb247CisgICAgICB2YXIgc3RhdGUgPSB0cmFuc2l0aW9uID8gdHJhbnNpdGlvbi5zdGF0ZSA6
IHRoaXMucm91dGVyLnJvdXRlci5zdGF0ZTsKKworICAgICAgdmFyIHBhcmFtcyA9IHt9OworICAg
ICAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChwYXJhbXMsIHN0YXRlLnBhcmFtc1tuYW1lXSk7
CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHBhcmFtcywgZ2V0UXVlcnlQYXJhbXNG
b3Iocm91dGUsIHN0YXRlKSk7CisKKyAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgU2VyaWFsaXplcyB0aGUgcXVlcnkgcGFyYW1ldGVyIGtleQorICAgICAgIEBt
ZXRob2Qgc2VyaWFsaXplUXVlcnlQYXJhbUtleQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGNvbnRy
b2xsZXJQcm9wZXJ0eU5hbWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBzZXJpYWxpemVR
dWVyeVBhcmFtS2V5OiBmdW5jdGlvbiAoY29udHJvbGxlclByb3BlcnR5TmFtZSkgeworICAgICAg
cmV0dXJuIGNvbnRyb2xsZXJQcm9wZXJ0eU5hbWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
U2VyaWFsaXplcyB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGJhc2VkIG9uIGRlZmF1bHRW
YWx1ZVR5cGUKKyAgICAgICBAbWV0aG9kIHNlcmlhbGl6ZVF1ZXJ5UGFyYW0KKyAgICAgIEBwYXJh
bSB7T2JqZWN0fSB2YWx1ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHVybEtleQorICAgICAgQHBh
cmFtIHtTdHJpbmd9IGRlZmF1bHRWYWx1ZVR5cGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBzZXJpYWxpemVRdWVyeVBhcmFtOiBmdW5jdGlvbiAodmFsdWUsIHVybEtleSwgZGVmYXVsdFZh
bHVlVHlwZSkgeworICAgICAgLy8gdXJsS2V5IGlzbid0IHVzZWQgaGVyZSwgYnV0IGFueW9uZSBv
dmVycmlkaW5nCisgICAgICAvLyBjYW4gdXNlIGl0IHRvIHByb3ZpZGUgc2VyaWFsaXphdGlvbiBz
cGVjaWZpYworICAgICAgLy8gdG8gYSBjZXJ0YWluIHF1ZXJ5IHBhcmFtLgorICAgICAgaWYgKGRl
ZmF1bHRWYWx1ZVR5cGUgPT09ICdhcnJheScpIHsKKyAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5n
aWZ5KHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAnJyArIHZhbHVlOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIERlc2VyaWFsaXplcyB2YWx1ZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVy
IGJhc2VkIG9uIGRlZmF1bHRWYWx1ZVR5cGUKKyAgICAgICBAbWV0aG9kIGRlc2VyaWFsaXplUXVl
cnlQYXJhbQorICAgICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCisgICAgICBAcGFyYW0ge1N0cmlu
Z30gdXJsS2V5CisgICAgICBAcGFyYW0ge1N0cmluZ30gZGVmYXVsdFZhbHVlVHlwZQorICAgICAg
QHByaXZhdGUKKyAgICAqLworICAgIGRlc2VyaWFsaXplUXVlcnlQYXJhbTogZnVuY3Rpb24gKHZh
bHVlLCB1cmxLZXksIGRlZmF1bHRWYWx1ZVR5cGUpIHsKKyAgICAgIC8vIHVybEtleSBpc24ndCB1
c2VkIGhlcmUsIGJ1dCBhbnlvbmUgb3ZlcnJpZGluZworICAgICAgLy8gY2FuIHVzZSBpdCB0byBw
cm92aWRlIGRlc2VyaWFsaXphdGlvbiBzcGVjaWZpYworICAgICAgLy8gdG8gYSBjZXJ0YWluIHF1
ZXJ5IHBhcmFtLgorCisgICAgICAvLyBVc2UgdGhlIGRlZmF1bHRWYWx1ZVR5cGUgb2YgdGhlIGRl
ZmF1bHQgdmFsdWUgKHRoZSBpbml0aWFsIHZhbHVlIGFzc2lnbmVkIHRvIGEKKyAgICAgIC8vIGNv
bnRyb2xsZXIgcXVlcnkgcGFyYW0gcHJvcGVydHkpLCB0byBpbnRlbGxpZ2VudGx5IGRlc2VyaWFs
aXplIGFuZCBjYXN0LgorICAgICAgaWYgKGRlZmF1bHRWYWx1ZVR5cGUgPT09ICdib29sZWFuJykg
eworICAgICAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTsKKyAgICAg
IH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlVHlwZSA9PT0gJ251bWJlcicpIHsKKyAgICAgICAgcmV0
dXJuIE51bWJlcih2YWx1ZSkudmFsdWVPZigpOworICAgICAgfSBlbHNlIGlmIChkZWZhdWx0VmFs
dWVUeXBlID09PSAnYXJyYXknKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lU3lzdGVt
TmF0aXZlX2FycmF5LkEoSlNPTi5wYXJzZSh2YWx1ZSkpOworICAgICAgfQorICAgICAgcmV0dXJu
IHZhbHVlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgICAgQHByb3Bl
cnR5IF9vcHRpb25zRm9yUXVlcnlQYXJhbQorICAgICovCisgICAgX29wdGlvbnNGb3JRdWVyeVBh
cmFtOiBmdW5jdGlvbiAocXApIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ3F1ZXJ5UGFyYW1zLicgKyBxcC51cmxLZXkpIHx8IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAncXVlcnlQYXJhbXMuJyArIHFwLnByb3ApIHx8IHt9OworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byByZXNldCBjb250cm9s
bGVyIHZhbHVlcyBlaXRoZXIgd2hlbiB0aGUgbW9kZWwKKyAgICAgIGNoYW5nZXMgb3IgdGhlIHJv
dXRlIGlzIGV4aXRpbmcuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkFydGljbGVz
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICAvLyAuLi4KKyAgICAgICAgIHJl
c2V0Q29udHJvbGxlcjogZnVuY3Rpb24oY29udHJvbGxlciwgaXNFeGl0aW5nLCB0cmFuc2l0aW9u
KSB7CisgICAgICAgICAgaWYgKGlzRXhpdGluZykgeworICAgICAgICAgICAgY29udHJvbGxlci5z
ZXQoJ3BhZ2UnLCAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAg
YGBgCisgICAgICAgQG1ldGhvZCByZXNldENvbnRyb2xsZXIKKyAgICAgIEBwYXJhbSB7Q29udHJv
bGxlcn0gY29udHJvbGxlciBpbnN0YW5jZQorICAgICAgQHBhcmFtIHtCb29sZWFufSBpc0V4aXRp
bmcKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSB0cmFuc2l0aW9uCisgICAgICBAc2luY2UgMS43LjAK
KyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlc2V0Q29udHJvbGxlcjogSywKKworICAgIC8q
KgorICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIGV4aXQKKyAgICAqLworICAgIGV4aXQ6
IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpOworICAgICAgdGhpcy50cmln
Z2VyKCdkZWFjdGl2YXRlJyk7CisgICAgICB0aGlzLnRlYXJkb3duVmlld3MoKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIEBtZXRob2QgX3Jlc2V0CisgICAgICBA
c2luY2UgMS43LjAKKyAgICAqLworICAgIF9yZXNldDogZnVuY3Rpb24gKGlzRXhpdGluZywgdHJh
bnNpdGlvbikgeworICAgICAgdmFyIGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXI7CisgICAg
ICBjb250cm9sbGVyLl9xcERlbGVnYXRlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRo
aXMsICdfcXAuc3RhdGVzLmluYWN0aXZlJyk7CisKKyAgICAgIHRoaXMucmVzZXRDb250cm9sbGVy
KGNvbnRyb2xsZXIsIGlzRXhpdGluZywgdHJhbnNpdGlvbik7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgQHByaXZhdGUKKyAgICAgICBAbWV0aG9kIGVudGVyCisgICAgKi8KKyAgICBlbnRlcjog
ZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdOworICAgICAgdGhpcy5h
Y3RpdmF0ZSgpOworICAgICAgdGhpcy50cmlnZ2VyKCdhY3RpdmF0ZScpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFRoZSBuYW1lIG9mIHRoZSB2aWV3IHRvIHVzZSBieSBkZWZhdWx0IHdoZW4g
cmVuZGVyaW5nIHRoaXMgcm91dGVzIHRlbXBsYXRlLgorICAgICAgIFdoZW4gcmVuZGVyaW5nIGEg
dGVtcGxhdGUsIHRoZSByb3V0ZSB3aWxsLCBieSBkZWZhdWx0LCBkZXRlcm1pbmUgdGhlCisgICAg
ICB0ZW1wbGF0ZSBhbmQgdmlldyB0byB1c2UgZnJvbSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgaXRz
ZWxmLiBJZiB5b3UgbmVlZCB0bworICAgICAgZGVmaW5lIGEgc3BlY2lmaWMgdmlldywgc2V0IHRo
aXMgcHJvcGVydHkuCisgICAgICAgVGhpcyBpcyB1c2VmdWwgd2hlbiBtdWx0aXBsZSByb3V0ZXMg
d291bGQgYmVuZWZpdCBmcm9tIHVzaW5nIHRoZSBzYW1lIHZpZXcKKyAgICAgIGJlY2F1c2UgaXQg
ZG9lc24ndCByZXF1aXJlIGEgY3VzdG9tIGByZW5kZXJUZW1wbGF0ZWAgbWV0aG9kLiBGb3IgZXhh
bXBsZSwKKyAgICAgIHRoZSBmb2xsb3dpbmcgcm91dGVzIHdpbGwgYWxsIHJlbmRlciB1c2luZyB0
aGUgYEFwcC5Qb3N0c0xpc3RWaWV3YCB2aWV3OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IHZhciBQb3N0c0xpc3QgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICB2aWV3TmFtZTog
J3Bvc3RzTGlzdCcKKyAgICAgIH0pOworICAgICAgIEFwcC5Qb3N0c0luZGV4Um91dGUgPSBQb3N0
c0xpc3QuZXh0ZW5kKCk7CisgICAgICBBcHAuUG9zdHNBcmNoaXZlZFJvdXRlID0gUG9zdHNMaXN0
LmV4dGVuZCgpOworICAgICAgYGBgCisgICAgICAgQHByb3BlcnR5IHZpZXdOYW1lCisgICAgICBA
dHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBzaW5jZSAxLjQuMAorICAg
ICAgQHB1YmxpYworICAgICovCisgICAgdmlld05hbWU6IG51bGwsCisKKyAgICAvKioKKyAgICAg
IFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byB1c2UgYnkgZGVmYXVsdCB3aGVuIHJlbmRlcmlu
ZyB0aGlzIHJvdXRlcworICAgICAgdGVtcGxhdGUuCisgICAgICAgVGhpcyBpcyBzaW1pbGFyIHdp
dGggYHZpZXdOYW1lYCwgYnV0IGlzIHVzZWZ1bCB3aGVuIHlvdSBqdXN0IHdhbnQgYSBjdXN0b20K
KyAgICAgIHRlbXBsYXRlIHdpdGhvdXQgYSB2aWV3LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIHZhciBQb3N0c0xpc3QgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICB0ZW1wbGF0
ZU5hbWU6ICdwb3N0cy9saXN0JworICAgICAgfSk7CisgICAgICAgQXBwLlBvc3RzSW5kZXhSb3V0
ZSA9IFBvc3RzTGlzdC5leHRlbmQoKTsKKyAgICAgIEFwcC5Qb3N0c0FyY2hpdmVkUm91dGUgPSBQ
b3N0c0xpc3QuZXh0ZW5kKCk7CisgICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgdGVtcGxhdGVO
YW1lCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBzaW5j
ZSAxLjQuMAorICAgICAgQHB1YmxpYworICAgICovCisgICAgdGVtcGxhdGVOYW1lOiBudWxsLAor
CisgICAgLyoqCisgICAgICBUaGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciB0byBhc3NvY2lhdGUg
d2l0aCB0aGlzIHJvdXRlLgorICAgICAgIEJ5IGRlZmF1bHQsIEVtYmVyIHdpbGwgbG9va3VwIGEg
cm91dGUncyBjb250cm9sbGVyIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZQorICAgICAgb2YgdGhlIHJv
dXRlIChpLmUuIGBBcHAuUG9zdENvbnRyb2xsZXJgIGZvciBgQXBwLlBvc3RSb3V0ZWApLiBIb3dl
dmVyLAorICAgICAgaWYgeW91IHdvdWxkIGxpa2UgdG8gZGVmaW5lIGEgc3BlY2lmaWMgY29udHJv
bGxlciB0byB1c2UsIHlvdSBjYW4gZG8gc28KKyAgICAgIHVzaW5nIHRoaXMgcHJvcGVydHkuCisg
ICAgICAgVGhpcyBpcyB1c2VmdWwgaW4gbWFueSB3YXlzLCBhcyB0aGUgY29udHJvbGxlciBzcGVj
aWZpZWQgd2lsbCBiZToKKyAgICAgICAqIHBhc3NlZCB0byB0aGUgYHNldHVwQ29udHJvbGxlcmAg
bWV0aG9kLgorICAgICAgKiB1c2VkIGFzIHRoZSBjb250cm9sbGVyIGZvciB0aGUgdmlldyBiZWlu
ZyByZW5kZXJlZCBieSB0aGUgcm91dGUuCisgICAgICAqIHJldHVybmVkIGZyb20gYSBjYWxsIHRv
IGBjb250cm9sbGVyRm9yYCBmb3IgdGhlIHJvdXRlLgorICAgICAgIEBwcm9wZXJ0eSBjb250cm9s
bGVyTmFtZQorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBA
c2luY2UgMS40LjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNvbnRyb2xsZXJOYW1lOiBu
dWxsLAorCisgICAgLyoqCisgICAgICBUaGUgYHdpbGxUcmFuc2l0aW9uYCBhY3Rpb24gaXMgZmly
ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkKKyAgICAgIGF0dGVtcHRlZCB0cmFuc2l0aW9uIHdp
dGggYSBgVHJhbnNpdGlvbmAgb2JqZWN0IGFzIHRoZSBzb2xlCisgICAgICBhcmd1bWVudC4gVGhp
cyBhY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFib3J0aW5nLCByZWRpcmVjdGluZywKKyAgICAgIG9y
IGRlY29yYXRpbmcgdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0
ZXMuCisgICAgICAgQSBnb29kIGV4YW1wbGUgaXMgcHJldmVudGluZyBuYXZpZ2F0aW9uIHdoZW4g
YSBmb3JtIGlzCisgICAgICBoYWxmLWZpbGxlZCBvdXQ6CisgICAgICAgYGBgamF2YXNjcmlwdAor
ICAgICAgQXBwLkNvbnRhY3RGb3JtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAg
ICBhY3Rpb25zOiB7CisgICAgICAgICAgd2lsbFRyYW5zaXRpb246IGZ1bmN0aW9uKHRyYW5zaXRp
b24pIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0KCd1c2VySGFzRW50ZXJl
ZERhdGEnKSkgeworICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGxheU5hdmlnYXRp
b25Db25maXJtKCk7CisgICAgICAgICAgICAgIHRyYW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAg
ICAgWW91IGNhbiBhbHNvIHJlZGlyZWN0IGVsc2V3aGVyZSBieSBjYWxsaW5nCisgICAgICBgdGhp
cy50cmFuc2l0aW9uVG8oJ2Vsc2V3aGVyZScpYCBmcm9tIHdpdGhpbiBgd2lsbFRyYW5zaXRpb25g
LgorICAgICAgTm90ZSB0aGF0IGB3aWxsVHJhbnNpdGlvbmAgd2lsbCBub3QgYmUgZmlyZWQgZm9y
IHRoZQorICAgICAgcmVkaXJlY3RpbmcgYHRyYW5zaXRpb25Ub2AsIHNpbmNlIGB3aWxsVHJhbnNp
dGlvbmAgZG9lc24ndAorICAgICAgZmlyZSB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSB0cmFuc2l0
aW9uIHVuZGVyd2F5LiBJZiB5b3Ugd2FudAorICAgICAgc3Vic2VxdWVudCBgd2lsbFRyYW5zaXRp
b25gIGFjdGlvbnMgdG8gZmlyZSBmb3IgdGhlIHJlZGlyZWN0aW5nCisgICAgICB0cmFuc2l0aW9u
LCB5b3UgbXVzdCBmaXJzdCBleHBsaWNpdGx5IGNhbGwKKyAgICAgIGB0cmFuc2l0aW9uLmFib3J0
KClgLgorICAgICAgIFRvIGFsbG93IHRoZSBgd2lsbFRyYW5zaXRpb25gIGV2ZW50IHRvIGNvbnRp
bnVlIGJ1YmJsaW5nIHRvIHRoZSBwYXJlbnQKKyAgICAgIHJvdXRlLCB1c2UgYHJldHVybiB0cnVl
O2AuIFdoZW4gdGhlIGB3aWxsVHJhbnNpdGlvbmAgbWV0aG9kIGhhcyBhCisgICAgICByZXR1cm4g
dmFsdWUgb2YgYHRydWVgIHRoZW4gdGhlIHBhcmVudCByb3V0ZSdzIGB3aWxsVHJhbnNpdGlvbmAg
bWV0aG9kCisgICAgICB3aWxsIGJlIGZpcmVkLCBlbmFibGluZyAiYnViYmxpbmciIGJlaGF2aW9y
IGZvciB0aGUgZXZlbnQuCisgICAgICAgQGV2ZW50IHdpbGxUcmFuc2l0aW9uCisgICAgICBAcGFy
YW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAg
LyoqCisgICAgICBUaGUgYGRpZFRyYW5zaXRpb25gIGFjdGlvbiBpcyBmaXJlZCBhZnRlciBhIHRy
YW5zaXRpb24gaGFzCisgICAgICBzdWNjZXNzZnVsbHkgYmVlbiBjb21wbGV0ZWQuIFRoaXMgb2Nj
dXJzIGFmdGVyIHRoZSBub3JtYWwgbW9kZWwKKyAgICAgIGhvb2tzIChgYmVmb3JlTW9kZWxgLCBg
bW9kZWxgLCBgYWZ0ZXJNb2RlbGAsIGBzZXR1cENvbnRyb2xsZXJgKQorICAgICAgaGF2ZSByZXNv
bHZlZC4gVGhlIGBkaWRUcmFuc2l0aW9uYCBhY3Rpb24gaGFzIG5vIGFyZ3VtZW50cywKKyAgICAg
IGhvd2V2ZXIsIGl0IGNhbiBiZSB1c2VmdWwgZm9yIHRyYWNraW5nIHBhZ2Ugdmlld3Mgb3IgcmVz
ZXR0aW5nCisgICAgICBzdGF0ZSBvbiB0aGUgY29udHJvbGxlci4KKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBBcHAuTG9naW5Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAg
IGFjdGlvbnM6IHsKKyAgICAgICAgICBkaWRUcmFuc2l0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICAgIHRoaXMuY29udHJvbGxlci5nZXQoJ2Vycm9ycy5iYXNlJykuY2xlYXIoKTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOyAvLyBCdWJibGUgdGhlIGRpZFRyYW5zaXRpb24gZXZlbnQKKyAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQGV2ZW50
IGRpZFRyYW5zaXRpb24KKyAgICAgIEBzaW5jZSAxLjIuMAorICAgICAgQHB1YmxpYworICAgICov
CisKKyAgICAvKioKKyAgICAgIFRoZSBgbG9hZGluZ2AgYWN0aW9uIGlzIGZpcmVkIG9uIHRoZSBy
b3V0ZSB3aGVuIGEgcm91dGUncyBgbW9kZWxgCisgICAgICBob29rIHJldHVybnMgYSBwcm9taXNl
IHRoYXQgaXMgbm90IGFscmVhZHkgcmVzb2x2ZWQuIFRoZSBjdXJyZW50CisgICAgICBgVHJhbnNp
dGlvbmAgb2JqZWN0IGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSByb3V0ZSB0aGF0Cisg
ICAgICB0cmlnZ2VyZWQgdGhlIGxvYWRpbmcgZXZlbnQgaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIu
CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJl
ci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgbG9hZGluZzog
ZnVuY3Rpb24odHJhbnNpdGlvbiwgcm91dGUpIHsKKyAgICAgICAgICAgIGxldCBjb250cm9sbGVy
ID0gdGhpcy5jb250cm9sbGVyRm9yKCdmb28nKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0
KCdjdXJyZW50bHlMb2FkaW5nJywgdHJ1ZSk7CisgICAgICAgICAgICAgdHJhbnNpdGlvbi5maW5h
bGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICBjb250cm9sbGVyLnNldCgnY3VycmVudGx5
TG9hZGluZycsIGZhbHNlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAZXZlbnQgbG9hZGluZworICAgICAgQHBh
cmFtIHtUcmFuc2l0aW9ufSB0cmFuc2l0aW9uCisgICAgICBAcGFyYW0ge0VtYmVyLlJvdXRlfSBy
b3V0ZSBUaGUgcm91dGUgdGhhdCB0cmlnZ2VyZWQgdGhlIGxvYWRpbmcgZXZlbnQKKyAgICAgIEBz
aW5jZSAxLjIuMAorICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAvKioKKyAgICAgIFdoZW4g
YXR0ZW1wdGluZyB0byB0cmFuc2l0aW9uIGludG8gYSByb3V0ZSwgYW55IG9mIHRoZSBob29rcwor
ICAgICAgbWF5IHJldHVybiBhIHByb21pc2UgdGhhdCByZWplY3RzLCBhdCB3aGljaCBwb2ludCBh
biBgZXJyb3JgCisgICAgICBhY3Rpb24gd2lsbCBiZSBmaXJlZCBvbiB0aGUgcGFydGlhbGx5LWVu
dGVyZWQgcm91dGVzLCBhbGxvd2luZworICAgICAgZm9yIHBlci1yb3V0ZSBlcnJvciBoYW5kbGlu
ZyBsb2dpYywgb3Igc2hhcmVkIGVycm9yIGhhbmRsaW5nCisgICAgICBsb2dpYyBkZWZpbmVkIG9u
IGEgcGFyZW50IHJvdXRlLgorICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBlcnJvciBo
YW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkCisgICAgICBmb3IgcmVqZWN0ZWQgcHJvbWlzZXMg
ZnJvbSB0aGUgdmFyaW91cyBob29rcyBvbiB0aGUgcm91dGUsCisgICAgICBhcyB3ZWxsIGFzIGFu
eSB1bmhhbmRsZWQgZXJyb3JzIGZyb20gY2hpbGQgcm91dGVzOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIEFwcC5BZG1pblJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAg
YmVmb3JlTW9kZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJl
amVjdCgnYmFkIHRoaW5ncyEnKTsKKyAgICAgICAgfSwKKyAgICAgICAgIGFjdGlvbnM6IHsKKyAg
ICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IsIHRyYW5zaXRpb24pIHsKKyAgICAgICAgICAg
IC8vIEFzc3VtaW5nIHdlIGdvdCBoZXJlIGR1ZSB0byB0aGUgZXJyb3IgaW4gYGJlZm9yZU1vZGVs
YCwKKyAgICAgICAgICAgIC8vIHdlIGNhbiBleHBlY3QgdGhhdCBlcnJvciA9PT0gImJhZCB0aGlu
Z3MhIiwKKyAgICAgICAgICAgIC8vIGJ1dCBhIHByb21pc2UgbW9kZWwgcmVqZWN0aW5nIHdvdWxk
IGFsc28KKyAgICAgICAgICAgIC8vIGNhbGwgdGhpcyBob29rLCBhcyB3b3VsZCBhbnkgZXJyb3Jz
IGVuY291bnRlcmVkCisgICAgICAgICAgICAvLyBpbiBgYWZ0ZXJNb2RlbGAuCisgICAgICAgICAg
ICAgLy8gVGhlIGBlcnJvcmAgaG9vayBpcyBhbHNvIHByb3ZpZGVkIHRoZSBmYWlsZWQKKyAgICAg
ICAgICAgIC8vIGB0cmFuc2l0aW9uYCwgd2hpY2ggY2FuIGJlIHN0b3JlZCBhbmQgbGF0ZXIKKyAg
ICAgICAgICAgIC8vIGAucmV0cnkoKWBkIGlmIGRlc2lyZWQuCisgICAgICAgICAgICAgdGhpcy50
cmFuc2l0aW9uVG8oJ2xvZ2luJyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIGBlcnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJsZSB1cCBhbGwgdGhl
IHdheSB0byBgQXBwbGljYXRpb25Sb3V0ZWAKKyAgICAgIHdpbGwgZmlyZSBhIGRlZmF1bHQgZXJy
b3IgaGFuZGxlciB0aGF0IGxvZ3MgdGhlIGVycm9yLiBZb3UgY2FuCisgICAgICBzcGVjaWZ5IHlv
dXIgb3duIGdsb2JhbCBkZWZhdWx0IGVycm9yIGhhbmRsZXIgYnkgb3ZlcnJpZGluZyB0aGUKKyAg
ICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBwbGljYXRpb25Sb3V0ZWA6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
eworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yLCB0
cmFuc2l0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoJ2Jhbm5lcicpLmRp
c3BsYXlFcnJvcihlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgYGBgCisgICAgICBAZXZlbnQgZXJyb3IKKyAgICAgIEBwYXJhbSB7RXJyb3J9
IGVycm9yCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEBwdWJs
aWMKKyAgICAqLworCisgICAgLyoqCisgICAgICBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVu
IHRoZSByb3V0ZXIgZW50ZXJzIHRoZSByb3V0ZS4gSXQgaXMKKyAgICAgIG5vdCBleGVjdXRlZCB3
aGVuIHRoZSBtb2RlbCBmb3IgdGhlIHJvdXRlIGNoYW5nZXMuCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAg
ICAgICBjb2xsZWN0QW5hbHl0aWNzOiBmdW5jdGlvbigpeworICAgICAgICAgIGNvbGxlY3RBbmFs
eXRpY3MoKTsKKyAgICAgICAgfS5vbignYWN0aXZhdGUnKQorICAgICAgfSk7CisgICAgICBgYGAK
KyAgICAgICBAZXZlbnQgYWN0aXZhdGUKKyAgICAgIEBzaW5jZSAxLjkuMAorICAgICAgQHB1Ymxp
YworICAgICovCisKKyAgICAvKioKKyAgICAgIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4g
dGhlIHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMKKyAgICAgIHJvdXRlLiBJdCBpcyBub3Qg
ZXhlY3V0ZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK
KyAgICAgICAgdHJhY2tQYWdlTGVhdmVBbmFseXRpY3M6IGZ1bmN0aW9uKCl7CisgICAgICAgICAg
dHJhY2tQYWdlTGVhdmVBbmFseXRpY3MoKTsKKyAgICAgICAgfS5vbignZGVhY3RpdmF0ZScpCisg
ICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBldmVudCBkZWFjdGl2YXRlCisgICAgICBAc2lu
Y2UgMS45LjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAgLyoqCisgICAgICBUaGUgY29u
dHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KKyAgICAgICBFeGFtcGxlCisgICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLkZvcm1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rp
b24odHJhbnNpdGlvbikgeworICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5nZXQoJ3Vz
ZXJIYXNFbnRlcmVkRGF0YScpICYmCisgICAgICAgICAgICAgICAgIWNvbmZpcm0oJ0FyZSB5b3Ug
c3VyZSB5b3Ugd2FudCB0byBhYmFuZG9uIHByb2dyZXNzPycpKSB7CisgICAgICAgICAgICAgIHRy
YW5zaXRpb24uYWJvcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8v
IEJ1YmJsZSB0aGUgYHdpbGxUcmFuc2l0aW9uYCBhY3Rpb24gc28gdGhhdAorICAgICAgICAgICAg
ICAvLyBwYXJlbnQgcm91dGVzIGNhbiBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gYWJvcnQuCisg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgY29udHJvbGxl
cgorICAgICAgQHR5cGUgRW1iZXIuQ29udHJvbGxlcgorICAgICAgQHNpbmNlIDEuNi4wCisgICAg
ICBAcHVibGljCisgICAgKi8KKworICAgIGFjdGlvbnM6IHsKKworICAgICAgcXVlcnlQYXJhbXNE
aWRDaGFuZ2U6IGZ1bmN0aW9uIChjaGFuZ2VkLCB0b3RhbFByZXNlbnQsIHJlbW92ZWQpIHsKKyAg
ICAgICAgdmFyIHFwTWFwID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAn
KS5tYXA7CisKKyAgICAgICAgdmFyIHRvdGFsQ2hhbmdlZCA9IE9iamVjdC5rZXlzKGNoYW5nZWQp
LmNvbmNhdChPYmplY3Qua2V5cyhyZW1vdmVkKSk7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBs
ZW4gPSB0b3RhbENoYW5nZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICB2YXIg
cXAgPSBxcE1hcFt0b3RhbENoYW5nZWRbaV1dOworICAgICAgICAgIGlmIChxcCAmJiBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcy5fb3B0aW9uc0ZvclF1ZXJ5UGFyYW0ocXApLCAncmVm
cmVzaE1vZGVsJykgJiYgdGhpcy5yb3V0ZXIuY3VycmVudFN0YXRlKSB7CisgICAgICAgICAgICB0
aGlzLnJlZnJlc2goKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgIH0sCisKKyAgICAgIGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZTogZnVuY3Rp
b24gKHBhcmFtcywgZmluYWxQYXJhbXMsIHRyYW5zaXRpb24pIHsKKyAgICAgICAgaWYgKHRoaXMu
cm91dGVOYW1lICE9PSAnYXBwbGljYXRpb24nKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBUcmFuc2l0aW9uIG9iamVjdCBpcyBhYnNlbnQgZm9yIGlu
dGVybWVkaWF0ZSB0cmFuc2l0aW9ucy4KKyAgICAgICAgaWYgKCF0cmFuc2l0aW9uKSB7CisgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IHRy
YW5zaXRpb24uc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7CisgICAgICAgIHZhciBxcE1ldGEgPSByb3V0ZXIuX3F1ZXJ5UGFyYW1zRm9yKGhhbmRs
ZXJJbmZvc1toYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSk7CisgICAgICAgIHZhciBjaGFu
Z2VzID0gcm91dGVyLl9xcFVwZGF0ZXM7CisgICAgICAgIHZhciByZXBsYWNlVXJsOworCisgICAg
ICAgIF9lbWJlclJvdXRpbmdVdGlscy5zdGFzaFBhcmFtTmFtZXMocm91dGVyLCBoYW5kbGVySW5m
b3MpOworCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBxcE1ldGEucXBzLmxlbmd0aDsg
aSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgdmFyIHFwID0gcXBNZXRhLnFwc1tpXTsKKyAgICAg
ICAgICB2YXIgcm91dGUgPSBxcC5yb3V0ZTsKKyAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJv
dXRlLmNvbnRyb2xsZXI7CisgICAgICAgICAgdmFyIHByZXNlbnRLZXkgPSBxcC51cmxLZXkgaW4g
cGFyYW1zICYmIHFwLnVybEtleTsKKworICAgICAgICAgIC8vIERvIGEgcmV2ZXJzZSBsb29rdXAg
dG8gc2VlIGlmIHRoZSBjaGFuZ2VkIHF1ZXJ5CisgICAgICAgICAgLy8gcGFyYW0gVVJMIGtleSBj
b3JyZXNwb25kcyB0byBhIFFQIHByb3BlcnR5IG9uCisgICAgICAgICAgLy8gdGhpcyBjb250cm9s
bGVyLgorICAgICAgICAgIHZhciB2YWx1ZSwgc3ZhbHVlOworICAgICAgICAgIGlmIChjaGFuZ2Vz
ICYmIHFwLnVybEtleSBpbiBjaGFuZ2VzKSB7CisgICAgICAgICAgICAvLyBWYWx1ZSB1cGRhdGVk
IGluL2JlZm9yZSBzZXR1cENvbnRyb2xsZXIKKyAgICAgICAgICAgIHZhbHVlID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbnRyb2xsZXIsIHFwLnByb3ApOworICAgICAgICAgICAgc3Zh
bHVlID0gcm91dGUuc2VyaWFsaXplUXVlcnlQYXJhbSh2YWx1ZSwgcXAudXJsS2V5LCBxcC50eXBl
KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByZXNlbnRLZXkpIHsKKyAg
ICAgICAgICAgICAgc3ZhbHVlID0gcGFyYW1zW3ByZXNlbnRLZXldOworICAgICAgICAgICAgICB2
YWx1ZSA9IHJvdXRlLmRlc2VyaWFsaXplUXVlcnlQYXJhbShzdmFsdWUsIHFwLnVybEtleSwgcXAu
dHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBObyBRUCBwcm92
aWRlZDsgdXNlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICAgIHN2YWx1ZSA9IHFwLnNlcmlh
bGl6ZWREZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgIHZhbHVlID0gY29weURlZmF1bHRWYWx1
ZShxcC5kZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAg
ICAgIGNvbnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
cm91dGUsICdfcXAuc3RhdGVzLmluYWN0aXZlJyk7CisKKyAgICAgICAgICB2YXIgdGhpc1F1ZXJ5
UGFyYW1DaGFuZ2VkID0gc3ZhbHVlICE9PSBxcC5zZXJpYWxpemVkVmFsdWU7CisgICAgICAgICAg
aWYgKHRoaXNRdWVyeVBhcmFtQ2hhbmdlZCkgeworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24u
cXVlcnlQYXJhbXNPbmx5ICYmIHJlcGxhY2VVcmwgIT09IGZhbHNlKSB7CisgICAgICAgICAgICAg
IHZhciBvcHRpb25zID0gcm91dGUuX29wdGlvbnNGb3JRdWVyeVBhcmFtKHFwKTsKKyAgICAgICAg
ICAgICAgdmFyIHJlcGxhY2VDb25maWdWYWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dChvcHRpb25zLCAncmVwbGFjZScpOworICAgICAgICAgICAgICBpZiAocmVwbGFjZUNvbmZpZ1Zh
bHVlKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZVVybCA9IHRydWU7CisgICAgICAgICAgICAg
IH0gZWxzZSBpZiAocmVwbGFjZUNvbmZpZ1ZhbHVlID09PSBmYWxzZSkgeworICAgICAgICAgICAg
ICAgIC8vIEV4cGxpY2l0IHB1c2hTdGF0ZSB3aW5zIG92ZXIgYW55IG90aGVyIHJlcGxhY2VTdGF0
ZXMuCisgICAgICAgICAgICAgICAgcmVwbGFjZVVybCA9IGZhbHNlOworICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dChjb250cm9sbGVyLCBxcC5wcm9wLCB2YWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAg
Ly8gU3Rhc2ggY3VycmVudCBzZXJpYWxpemVkIHZhbHVlIG9mIGNvbnRyb2xsZXIuCisgICAgICAg
ICAgcXAuc2VyaWFsaXplZFZhbHVlID0gc3ZhbHVlOworCisgICAgICAgICAgdmFyIHRoaXNRdWVy
eVBhcmFtSGFzRGVmYXVsdFZhbHVlID0gcXAuc2VyaWFsaXplZERlZmF1bHRWYWx1ZSA9PT0gc3Zh
bHVlOworICAgICAgICAgIGlmICghdGhpc1F1ZXJ5UGFyYW1IYXNEZWZhdWx0VmFsdWUpIHsKKyAg
ICAgICAgICAgIGZpbmFsUGFyYW1zLnB1c2goeworICAgICAgICAgICAgICB2YWx1ZTogc3ZhbHVl
LAorICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLAorICAgICAgICAgICAgICBrZXk6IHByZXNl
bnRLZXkgfHwgcXAudXJsS2V5CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAocmVwbGFjZVVybCkgeworICAgICAgICAgIHRyYW5zaXRpb24ubWV0
aG9kKCdyZXBsYWNlJyk7CisgICAgICAgIH0KKworICAgICAgICBxcE1ldGEucXBzLmZvckVhY2go
ZnVuY3Rpb24gKHFwKSB7CisgICAgICAgICAgdmFyIHJvdXRlUXBNZXRhID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHFwLnJvdXRlLCAnX3FwJyk7CisgICAgICAgICAgdmFyIGZpbmFsaXpl
ZENvbnRyb2xsZXIgPSBxcC5yb3V0ZS5jb250cm9sbGVyOworICAgICAgICAgIGZpbmFsaXplZENv
bnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGVR
cE1ldGEsICdzdGF0ZXMuYWN0aXZlJyk7CisgICAgICAgIH0pOworCisgICAgICAgIHJvdXRlci5f
cXBVcGRhdGVzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGlz
IGhvb2sgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcm91dGVyIGNvbXBsZXRlbHkgZXhpdHMgdGhpcyBy
b3V0ZS4gSXQgaXMKKyAgICAgIG5vdCBleGVjdXRlZCB3aGVuIHRoZSBtb2RlbCBmb3IgdGhlIHJv
dXRlIGNoYW5nZXMuCisgICAgICAgQG1ldGhvZCBkZWFjdGl2YXRlCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBkZWFjdGl2YXRlOiBLLAorCisgICAgLyoqCisgICAgICBUaGlzIGhvb2sgaXMg
ZXhlY3V0ZWQgd2hlbiB0aGUgcm91dGVyIGVudGVycyB0aGUgcm91dGUuIEl0IGlzIG5vdCBleGVj
dXRlZAorICAgICAgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2VzLgorICAgICAg
IEBtZXRob2QgYWN0aXZhdGUKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGFjdGl2YXRlOiBL
LAorCisgICAgLyoqCisgICAgICBUcmFuc2l0aW9uIHRoZSBhcHBsaWNhdGlvbiBpbnRvIGFub3Ro
ZXIgcm91dGUuIFRoZSByb3V0ZSBtYXkKKyAgICAgIGJlIGVpdGhlciBhIHNpbmdsZSByb3V0ZSBv
ciByb3V0ZSBwYXRoOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNpdGlv
blRvKCdibG9nUG9zdHMnKTsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nUG9zdHMucmVj
ZW50RW50cmllcycpOworICAgICAgYGBgCisgICAgICAgT3B0aW9uYWxseSBzdXBwbHkgYSBtb2Rl
bCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBUaGUgbW9kZWwKKyAgICAgIHdpbGwgYmUgc2Vy
aWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhlIGBzZXJpYWxpemVgIGhvb2sgb2YKKyAgICAg
IHRoZSByb3V0ZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB0aGlzLnRyYW5zaXRpb25U
bygnYmxvZ1Bvc3QnLCBhUG9zdCk7CisgICAgICBgYGAKKyAgICAgICBJZiBhIGxpdGVyYWwgaXMg
cGFzc2VkIChzdWNoIGFzIGEgbnVtYmVyIG9yIGEgc3RyaW5nKSwgaXQgd2lsbAorICAgICAgYmUg
dHJlYXRlZCBhcyBhbiBpZGVudGlmaWVyIGluc3RlYWQuIEluIHRoaXMgY2FzZSwgdGhlIGBtb2Rl
bGAKKyAgICAgIGhvb2sgb2YgdGhlIHJvdXRlIHdpbGwgYmUgdHJpZ2dlcmVkOgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nUG9zdCcsIDEpOworICAg
ICAgYGBgCisgICAgICAgTXVsdGlwbGUgbW9kZWxzIHdpbGwgYmUgYXBwbGllZCBsYXN0IHRvIGZp
cnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQorICAgICAgcm91dGUgdHJlZS4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5y
b3V0ZSgnYmxvZ1Bvc3QnLCB7IHBhdGg6JzpibG9nUG9zdElkJyB9LCBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICB0aGlzLnJvdXRlKCdibG9nQ29tbWVudCcsIHsgcGF0aDogJzpibG9nQ29tbWVudElk
JywgcmVzZXROYW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAg
ICAgdGhpcy50cmFuc2l0aW9uVG8oJ2Jsb2dDb21tZW50JywgYVBvc3QsIGFDb21tZW50KTsKKyAg
ICAgIHRoaXMudHJhbnNpdGlvblRvKCdibG9nQ29tbWVudCcsIDEsIDEzKTsKKyAgICAgIGBgYAor
ICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcGFzcyBhIFVSTCAoYSBzdHJpbmcgdGhhdCBz
dGFydHMgd2l0aCBhCisgICAgICBgL2ApLiBUaGlzIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nIGFu
ZCBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kCisgICAgICBzaG91bGQgcmFyZWx5IGJlIHVzZWQgaW4g
cHJvZHVjdGlvbiBjb2RlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHRoaXMudHJhbnNp
dGlvblRvKCcvJyk7CisgICAgICB0aGlzLnRyYW5zaXRpb25UbygnL2Jsb2cvcG9zdC8xL2NvbW1l
bnQvMTMnKTsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKCcvYmxvZy9wb3N0cz9zb3J0PXRpdGxl
Jyk7CisgICAgICBgYGAKKyAgICAgICBBbiBvcHRpb25zIGhhc2ggd2l0aCBhIGBxdWVyeVBhcmFt
c2AgcHJvcGVydHkgbWF5IGJlIHByb3ZpZGVkIGFzCisgICAgICB0aGUgZmluYWwgYXJndW1lbnQg
dG8gYWRkIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIGRlc3RpbmF0aW9uIFVSTC4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB0aGlzLnRyYW5zaXRpb25UbygnYmxvZ1Bvc3QnLCAxLCB7Cisg
ICAgICAgIHF1ZXJ5UGFyYW1zOiB7c2hvd0NvbW1lbnRzOiAndHJ1ZSd9CisgICAgICB9KTsKKyAg
ICAgICAvLyBpZiB5b3UganVzdCB3YW50IHRvIHRyYW5zaXRpb24gdGhlIHF1ZXJ5IHBhcmFtZXRl
cnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgcm91dGUKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKHtx
dWVyeVBhcmFtczoge3NvcnQ6ICdkYXRlJ319KTsKKyAgICAgIGBgYAorICAgICAgIFNlZSBhbHNv
IFtyZXBsYWNlV2l0aF0oI21ldGhvZF9yZXBsYWNlV2l0aCkuCisgICAgICAgU2ltcGxlIFRyYW5z
aXRpb24gRXhhbXBsZQorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdpbmRleCcpOworICAgICAgICB0aGlz
LnJvdXRlKCdzZWNyZXQnKTsKKyAgICAgICAgdGhpcy5yb3V0ZSgnZm91ck9oRm91cicsIHsgcGF0
aDogJyo6JyB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIG1vdmVUb1NlY3JldDog
ZnVuY3Rpb24oY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQoKSkgeworICAg
ICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubygnc2VjcmV0JywgY29udGV4dCk7CisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygnZm91ck9oRm91
cicpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBUcmFuc2l0aW9uIHRvIGEgbmVzdGVkIHJvdXRlCisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRo
aXMucm91dGUoJ2FydGljbGVzJywgeyBwYXRoOiAnL2FydGljbGVzJyB9LCBmdW5jdGlvbigpIHsK
KyAgICAgICAgICB0aGlzLnJvdXRlKCduZXcnKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAg
ICAgICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGFjdGlv
bnM6IHsKKyAgICAgICAgICB0cmFuc2l0aW9uVG9OZXdBcnRpY2xlOiBmdW5jdGlvbigpIHsKKyAg
ICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdhcnRpY2xlcy5uZXcnKTsKKyAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgTXVsdGlwbGUgTW9kZWxz
IEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgnaW5kZXgnKTsKKyAgICAgICAgIHRoaXMucm91
dGUoJ2JyZWFrZmFzdCcsIHsgcGF0aDogJzpicmVha2Zhc3RJZCcgfSwgZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgdGhpcy5yb3V0ZSgnY2VyZWFsJywgeyBwYXRoOiAnOmNlcmVhbElkJywgcmVzZXRO
YW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAgQXBwLklu
ZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAg
ICAgICAgbW92ZVRvQ2hvY29sYXRlQ2VyZWFsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZh
ciBjZXJlYWwgPSB7IGNlcmVhbElkOiAnQ2hvY29sYXRlWXVtbWluZXNzJyB9OworICAgICAgICAg
ICAgdmFyIGJyZWFrZmFzdCA9IHsgYnJlYWtmYXN0SWQ6ICdDZXJlYWxBbmRNaWxrJyB9OworICAg
ICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdjZXJlYWwnLCBicmVha2Zhc3QsIGNlcmVhbCk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIE5l
c3RlZCBSb3V0ZSB3aXRoIFF1ZXJ5IFN0cmluZyBFeGFtcGxlCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucm91dGUo
J2ZydWl0cycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ2FwcGxlcycpOwor
ICAgICAgICB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHRyYW5zaXRpb25Ub0Fw
cGxlczogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygnZnJ1aXRz
LmFwcGxlcycsIHtxdWVyeVBhcmFtczoge2NvbG9yOiAncmVkJ319KTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCB0cmFuc2l0aW9u
VG8KKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZSBvciBh
IFVSTAorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgb3IgaWRl
bnRpZmllcihzKSB0byBiZSB1c2VkIHdoaWxlCisgICAgICAgIHRyYW5zaXRpb25pbmcgdG8gdGhl
IHJvdXRlLgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBoYXNoIHdp
dGggYSBxdWVyeVBhcmFtcyBwcm9wZXJ0eQorICAgICAgICBjb250YWluaW5nIGEgbWFwcGluZyBv
ZiBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGUgdHJhbnNp
dGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgICAgYXR0ZW1wdGVkIHRyYW5z
aXRpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHRyYW5zaXRpb25UbzogZnVuY3Rpb24g
KG5hbWUsIGNvbnRleHQpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKKyAgICAg
IHJldHVybiByb3V0ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJndW1lbnRzKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBQZXJmb3JtIGEgc3luY2hyb25vdXMgdHJhbnNpdGlvbiBp
bnRvIGFub3RoZXIgcm91dGUgd2l0aG91dCBhdHRlbXB0aW5nCisgICAgICB0byByZXNvbHZlIHBy
b21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1cnJlbnRseSBhY3RpdmUKKyAg
ICAgIGFzeW5jaHJvbm91cyB0cmFuc2l0aW9ucyAoaS5lLiByZWd1bGFyIHRyYW5zaXRpb25zIGNh
dXNlZCBieQorICAgICAgYHRyYW5zaXRpb25Ub2Agb3IgVVJMIGNoYW5nZXMpLgorICAgICAgIFRo
aXMgbWV0aG9kIGlzIGhhbmR5IGZvciBwZXJmb3JtaW5nIGludGVybWVkaWF0ZSB0cmFuc2l0aW9u
cyBvbiB0aGUKKyAgICAgIHdheSB0byBhIGZpbmFsIGRlc3RpbmF0aW9uIHJvdXRlLCBhbmQgaXMg
Y2FsbGVkIGludGVybmFsbHkgYnkgdGhlCisgICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBv
ZiB0aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRsZXJzLgorICAgICAgIEBtZXRob2QgaW50
ZXJtZWRpYXRlVHJhbnNpdGlvblRvCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFt
ZSBvZiB0aGUgcm91dGUKKyAgICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVs
KHMpIHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlvbmluZworICAgICAgdG8gdGhlIHJvdXRlLgor
ICAgICAgQHNpbmNlIDEuMi4wCisgICAgICBAcHVibGljCisgICAgICovCisgICAgaW50ZXJtZWRp
YXRlVHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7CisgICAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJvdXRl
ciwgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZWZyZXNoIHRoZSBtb2Rl
bCBvbiB0aGlzIHJvdXRlIGFuZCBhbnkgY2hpbGQgcm91dGVzLCBmaXJpbmcgdGhlCisgICAgICBg
YmVmb3JlTW9kZWxgLCBgbW9kZWxgLCBhbmQgYGFmdGVyTW9kZWxgIGhvb2tzIGluIGEgc2ltaWxh
ciBmYXNoaW9uCisgICAgICB0byBob3cgcm91dGVzIGFyZSBlbnRlcmVkIHdoZW4gdHJhbnNpdGlv
bmluZyBpbiBmcm9tIG90aGVyIHJvdXRlLgorICAgICAgVGhlIGN1cnJlbnQgcm91dGUgcGFyYW1z
IChlLmcuIGBhcnRpY2xlX2lkYCkgd2lsbCBiZSBwYXNzZWQgaW4KKyAgICAgIHRvIHRoZSByZXNw
ZWN0aXZlIG1vZGVsIGhvb2tzLCBhbmQgaWYgYSBkaWZmZXJlbnQgbW9kZWwgaXMgcmV0dXJuZWQs
CisgICAgICBgc2V0dXBDb250cm9sbGVyYCBhbmQgYXNzb2NpYXRlZCByb3V0ZSBob29rcyB3aWxs
IHJlLWZpcmUgYXMgd2VsbC4KKyAgICAgICBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbWV0aG9k
IGlzIHJlLXF1ZXJ5aW5nIHRoZSBzZXJ2ZXIgZm9yIHRoZQorICAgICAgbGF0ZXN0IGluZm9ybWF0
aW9uIHVzaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgd2hlbiB0aGUgcm91dGUKKyAgICAgIHdh
cyBmaXJzdCBlbnRlcmVkLgorICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UgYG1vZGVs
YCBob29rcyB0byBmaXJlIGV2ZW4gb24gcm91dGVzCisgICAgICB0aGF0IHdlcmUgcHJvdmlkZWQg
YSBtb2RlbCBvYmplY3Qgd2hlbiB0aGUgcm91dGUgd2FzIGluaXRpYWxseQorICAgICAgZW50ZXJl
ZC4KKyAgICAgICBAbWV0aG9kIHJlZnJlc2gKKyAgICAgIEByZXR1cm4ge1RyYW5zaXRpb259IHRo
ZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAgICBhdHRlbXB0
ZWQgdHJhbnNpdGlvbgorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgICov
CisgICAgcmVmcmVzaDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnJv
dXRlci5yZWZyZXNoKHRoaXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRyYW5zaXRpb24g
aW50byBhbm90aGVyIHJvdXRlIHdoaWxlIHJlcGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGlmIHBv
c3NpYmxlLgorICAgICAgVGhpcyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRy
eSBpbnN0ZWFkIG9mIGFkZGluZyBhIG5ldyBvbmUuCisgICAgICBCZXNpZGUgdGhhdCwgaXQgaXMg
aWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9gIGluIGFsbCBvdGhlciByZXNwZWN0cy4gU2VlCisg
ICAgICAndHJhbnNpdGlvblRvJyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcg
bXVsdGlwbGUgbW9kZWxzLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgnaW5k
ZXgnKTsKKyAgICAgICAgdGhpcy5yb3V0ZSgnc2VjcmV0Jyk7CisgICAgICB9KTsKKyAgICAgICBB
cHAuU2VjcmV0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhZnRlck1vZGVs
OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBpZiAoIWF1dGhvcml6ZWQoKSl7CisgICAgICAgICAg
ICB0aGlzLnJlcGxhY2VXaXRoKCdpbmRleCcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlcGxhY2VXaXRoCisgICAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUgb3IgYSBVUkwKKyAgICAgIEBw
YXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMpIG9yIGlkZW50aWZpZXIocykgdG8g
YmUgdXNlZCB3aGlsZQorICAgICAgICB0cmFuc2l0aW9uaW5nIHRvIHRoZSByb3V0ZS4KKyAgICAg
IEByZXR1cm4ge1RyYW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdp
dGggdGhpcworICAgICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0
aGlzLnJvdXRlcjsKKyAgICAgIHJldHVybiByb3V0ZXIucmVwbGFjZVdpdGguYXBwbHkocm91dGVy
LCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNlbmRzIGFuIGFjdGlvbiB0
byB0aGUgcm91dGVyLCB3aGljaCB3aWxsIGRlbGVnYXRlIGl0IHRvIHRoZSBjdXJyZW50bHkKKyAg
ICAgIGFjdGl2ZSByb3V0ZSBoaWVyYXJjaHkgcGVyIHRoZSBidWJibGluZyBydWxlcyBleHBsYWlu
ZWQgdW5kZXIgYGFjdGlvbnNgLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgn
aW5kZXgnKTsKKyAgICAgIH0pOworICAgICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHRyYWNrOiBmdW5j
dGlvbihhcmcpIHsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGFyZywgJ3dhcyBjbGlja2VkJyk7
CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgICBBcHAuSW5kZXhSb3V0
ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICB0
cmFja0lmRGVidWc6IGZ1bmN0aW9uKGFyZykgeworICAgICAgICAgICAgaWYgKGRlYnVnKSB7Cisg
ICAgICAgICAgICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOworICAgICAgICAgICAgfQorICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IHNlbmQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
dG8gdHJpZ2dlcgorICAgICAgQHBhcmFtIHsuLi4qfSBhcmdzCisgICAgICBAcHVibGljCisgICAg
Ki8KKyAgICBzZW5kOiBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1l
bnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9r
ZXkrKykgeworICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQor
CisgICAgICBpZiAodGhpcy5yb3V0ZXIgJiYgdGhpcy5yb3V0ZXIucm91dGVyIHx8ICFfZW1iZXJN
ZXRhbENvcmUuZGVmYXVsdC50ZXN0aW5nKSB7CisgICAgICAgIHZhciBfcm91dGVyOworCisgICAg
ICAgIChfcm91dGVyID0gdGhpcy5yb3V0ZXIpLnNlbmQuYXBwbHkoX3JvdXRlciwgYXJncyk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF07CisgICAgICAgIGFyZ3Mg
PSBzbGljZS5jYWxsKGFyZ3MsIDEpOworICAgICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb25z
W25hbWVdOworICAgICAgICBpZiAoYWN0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0
aW9uc1tuYW1lXS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0s
CisKKyAgICAvKioKKyAgICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRl
ci5qcworICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHNldHVwCisgICAgKi8KKyAgICBz
ZXR1cDogZnVuY3Rpb24gKGNvbnRleHQsIHRyYW5zaXRpb24pIHsKKyAgICAgIHZhciBjb250cm9s
bGVyOworCisgICAgICB2YXIgY29udHJvbGxlck5hbWUgPSB0aGlzLmNvbnRyb2xsZXJOYW1lIHx8
IHRoaXMucm91dGVOYW1lOworICAgICAgdmFyIGRlZmluZWRDb250cm9sbGVyID0gdGhpcy5jb250
cm9sbGVyRm9yKGNvbnRyb2xsZXJOYW1lLCB0cnVlKTsKKworICAgICAgaWYgKCFkZWZpbmVkQ29u
dHJvbGxlcikgeworICAgICAgICBjb250cm9sbGVyID0gdGhpcy5nZW5lcmF0ZUNvbnRyb2xsZXIo
Y29udHJvbGxlck5hbWUsIGNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udHJv
bGxlciA9IGRlZmluZWRDb250cm9sbGVyOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ24gdGhl
IHJvdXRlJ3MgY29udHJvbGxlciBzbyB0aGF0IGl0IGNhbiBtb3JlIGVhc2lseSBiZQorICAgICAg
Ly8gcmVmZXJlbmNlZCBpbiBhY3Rpb24gaGFuZGxlcnMuIFNpZGUgZWZmZWN0cy4gU2lkZSBlZmZl
Y3RzIGV2ZXJ5d2hlcmUuCisgICAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgeworICAgICAgICB2
YXIgcHJvcE5hbWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdfcXAucHJv
cGVydHlOYW1lcycpOworICAgICAgICBhZGRRdWVyeVBhcmFtc09ic2VydmVycyhjb250cm9sbGVy
LCBwcm9wTmFtZXMpOworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAg
ICAgfQorCisgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodGhpcywgJ19xcCcpOworCisgICAgICB2YXIgc3RhdGVzID0gcXVlcnlQYXJhbXMuc3RhdGVz
OworICAgICAgaWYgKHRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBtb2RlbCBk
ZXAgdmFsdWVzIHVzZWQgdG8gY2FsY3VsYXRlIGNhY2hlIGtleXMuCisgICAgICAgIF9lbWJlclJv
dXRpbmdVdGlscy5zdGFzaFBhcmFtTmFtZXModGhpcy5yb3V0ZXIsIHRyYW5zaXRpb24uc3RhdGUu
aGFuZGxlckluZm9zKTsKKworICAgICAgICB2YXIgcGFyYW1zID0gdHJhbnNpdGlvbi5wYXJhbXM7
CisgICAgICAgIHZhciBhbGxQYXJhbXMgPSBxdWVyeVBhcmFtcy5wcm9wZXJ0eU5hbWVzOworICAg
ICAgICB2YXIgY2FjaGUgPSB0aGlzLl9idWNrZXRDYWNoZTsKKworICAgICAgICBhbGxQYXJhbXMu
Zm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeworICAgICAgICAgIHZhciBhUXAgPSBxdWVyeVBhcmFt
cy5tYXBbcHJvcF07CisKKyAgICAgICAgICBhUXAudmFsdWVzID0gcGFyYW1zOworICAgICAgICAg
IHZhciBjYWNoZUtleSA9IF9lbWJlclJvdXRpbmdVdGlscy5jYWxjdWxhdGVDYWNoZUtleShhUXAu
cHJlZml4LCBhUXAucGFydHMsIGFRcC52YWx1ZXMpOworCisgICAgICAgICAgaWYgKGNhY2hlKSB7
CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBjYWNoZS5sb29rdXAoY2FjaGVLZXksIHByb3AsIGFR
cC51bmRlY29yYXRlZERlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbFByb3Bl
cnR5X3NldC5zZXQoY29udHJvbGxlciwgcHJvcCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAg
ICAgfSk7CisgICAgICB9CisKKyAgICAgIGNvbnRyb2xsZXIuX3FwRGVsZWdhdGUgPSBzdGF0ZXMu
YWxsb3dPdmVycmlkZXM7CisKKyAgICAgIGlmICh0cmFuc2l0aW9uKSB7CisgICAgICAgIHZhciBx
cFZhbHVlcyA9IGdldFF1ZXJ5UGFyYW1zRm9yKHRoaXMsIHRyYW5zaXRpb24uc3RhdGUpOworICAg
ICAgICBjb250cm9sbGVyLnNldFByb3BlcnRpZXMocXBWYWx1ZXMpOworICAgICAgfQorCisgICAg
ICB0aGlzLnNldHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBjb250ZXh0LCB0cmFuc2l0aW9uKTsK
KworICAgICAgaWYgKCF0aGlzLl9lbnZpcm9ubWVudCB8fCB0aGlzLl9lbnZpcm9ubWVudC5vcHRp
b25zLnNob3VsZFJlbmRlcikgeworICAgICAgICB0aGlzLnJlbmRlclRlbXBsYXRlKGNvbnRyb2xs
ZXIsIGNvbnRleHQpOworICAgICAgfQorICAgIH0sCisKKyAgICAvKgorICAgICAgQ2FsbGVkIHdo
ZW4gYSBxdWVyeSBwYXJhbWV0ZXIgZm9yIHRoaXMgcm91dGUgY2hhbmdlcywgcmVnYXJkbGVzcyBv
ZiB3aGV0aGVyIHRoZSByb3V0ZQorICAgICAgaXMgY3VycmVudGx5IHBhcnQgb2YgdGhlIGFjdGl2
ZSByb3V0ZSBoaWVyYXJjaHkuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHF1ZXJ5IHBhcmFtZXRlcidz
CisgICAgICB2YWx1ZSBpbiB0aGUgY2FjaGUgc28gaWYgdGhpcyByb3V0ZSBiZWNvbWVzIGFjdGl2
ZSwgdGhlIGNhY2hlIHZhbHVlIGhhcyBiZWVuIHVwZGF0ZWQuCisgICAgKi8KKyAgICBfcXBDaGFu
Z2VkOiBmdW5jdGlvbiAocHJvcCwgdmFsdWUsIHFwKSB7CisgICAgICBpZiAoIXFwKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNhY2hlS2V5ID0gX2VtYmVyUm91dGlu
Z1V0aWxzLmNhbGN1bGF0ZUNhY2hlS2V5KHFwLnByZWZpeCB8fCAnJywgcXAucGFydHMsIHFwLnZh
bHVlcyk7CisKKyAgICAgIC8vIFVwZGF0ZSBtb2RlbC1kZXAgY2FjaGUKKyAgICAgIHZhciBjYWNo
ZSA9IHRoaXMuX2J1Y2tldENhY2hlOworICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgIGNhY2hl
LnN0YXNoKGNhY2hlS2V5LCBwcm9wLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSwKKyAgICAvKioK
KyAgICAgIFRoaXMgaG9vayBpcyB0aGUgZmlyc3Qgb2YgdGhlIHJvdXRlIGVudHJ5IHZhbGlkYXRp
b24gaG9va3MKKyAgICAgIGNhbGxlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB0cmFuc2l0
aW9uIGludG8gYSByb3V0ZQorICAgICAgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4gSXQgaXMgY2Fs
bGVkIGJlZm9yZSBgbW9kZWxgIGFuZAorICAgICAgYGFmdGVyTW9kZWxgLCBhbmQgaXMgYXBwcm9w
cmlhdGUgZm9yIGNhc2VzIHdoZW46CisgICAgICAgMSkgQSBkZWNpc2lvbiBjYW4gYmUgbWFkZSB0
byByZWRpcmVjdCBlbHNld2hlcmUgd2l0aG91dAorICAgICAgICAgbmVlZGluZyB0byByZXNvbHZl
IHRoZSBtb2RlbCBmaXJzdC4KKyAgICAgIDIpIEFueSBhc3luYyBvcGVyYXRpb25zIG5lZWQgdG8g
b2NjdXIgZmlyc3QgYmVmb3JlIHRoZQorICAgICAgICAgbW9kZWwgaXMgYXR0ZW1wdGVkIHRvIGJl
IHJlc29sdmVkLgorICAgICAgIFRoaXMgaG9vayBpcyBwcm92aWRlZCB0aGUgY3VycmVudCBgdHJh
bnNpdGlvbmAgYXR0ZW1wdAorICAgICAgYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSB1c2Vk
IHRvIGAuYWJvcnQoKWAgdGhlIHRyYW5zaXRpb24sCisgICAgICBzYXZlIGl0IGZvciBhIGxhdGVy
IGAucmV0cnkoKWAsIG9yIHJldHJpZXZlIHZhbHVlcyBzZXQKKyAgICAgIG9uIGl0IGZyb20gYSBw
cmV2aW91cyBob29rLiBZb3UgY2FuIGFsc28ganVzdCBjYWxsCisgICAgICBgdGhpcy50cmFuc2l0
aW9uVG9gIHRvIGFub3RoZXIgcm91dGUgdG8gaW1wbGljaXRseQorICAgICAgYWJvcnQgdGhlIGB0
cmFuc2l0aW9uYC4KKyAgICAgICBZb3UgY2FuIHJldHVybiBhIHByb21pc2UgZnJvbSB0aGlzIGhv
b2sgdG8gcGF1c2UgdGhlCisgICAgICB0cmFuc2l0aW9uIHVudGlsIHRoZSBwcm9taXNlIHJlc29s
dmVzIChvciByZWplY3RzKS4gVGhpcyBjb3VsZAorICAgICAgYmUgdXNlZnVsLCBmb3IgaW5zdGFu
Y2UsIGZvciByZXRyaWV2aW5nIGFzeW5jIGNvZGUgZnJvbQorICAgICAgdGhlIHNlcnZlciB0aGF0
IGlzIHJlcXVpcmVkIHRvIGVudGVyIGEgcm91dGUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGJlZm9yZU1v
ZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7CisgICAgICAgICAgaWYgKCFBcHAuUG9zdCkgewor
ICAgICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0U2NyaXB0KCcvbW9kZWxzL3Bvc3QuanMnKTsK
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSWYg
YEFwcC5Qb3N0YCBkb2Vzbid0IGV4aXN0IGluIHRoZSBhYm92ZSBleGFtcGxlLAorICAgICAgYGJl
Zm9yZU1vZGVsYCB3aWxsIHVzZSBqUXVlcnkncyBgZ2V0U2NyaXB0YCwgd2hpY2gKKyAgICAgIHJl
dHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNlcnZlciBoYXMKKyAgICAg
IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgYW5kIGV4ZWN1dGVkIHRoZSBjb2RlIGZyb20gdGhlCisg
ICAgICBzZXJ2ZXIuIE5vdGUgdGhhdCBpZiBhbiBlcnJvciB3ZXJlIHRvIG9jY3VyLCBpdCB3b3Vs
ZAorICAgICAgYmUgcGFzc2VkIHRvIHRoZSBgZXJyb3JgIGhvb2sgb24gYEVtYmVyLlJvdXRlYCwg
YnV0CisgICAgICBpdCdzIGFsc28gcG9zc2libGUgdG8gaGFuZGxlIGVycm9ycyBzcGVjaWZpYyB0
bworICAgICAgYGJlZm9yZU1vZGVsYCByaWdodCBmcm9tIHdpdGhpbiB0aGUgaG9vayAodG8gZGlz
dGluZ3Vpc2gKKyAgICAgIGZyb20gdGhlIHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBv
ZiB0aGUgYGVycm9yYAorICAgICAgaG9vayk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
QXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIGJlZm9yZU1vZGVs
OiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7CisgICAgICAgICAgaWYgKCFBcHAuUG9zdCkgeworICAg
ICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0
U2NyaXB0KCdwb3N0LmpzJykudGhlbihudWxsLCBmdW5jdGlvbihlKSB7CisgICAgICAgICAgICAg
IHNlbGYudHJhbnNpdGlvblRvKCdoZWxwJyk7CisgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQg
dGhlIGFib3ZlIHRyYW5zaXRpb25UbyB3aWxsIGltcGxpY2l0bHkKKyAgICAgICAgICAgICAgLy8g
aGFsdCB0aGUgdHJhbnNpdGlvbi4gSWYgeW91IHdlcmUgdG8gcmV0dXJuCisgICAgICAgICAgICAg
IC8vIG5vdGhpbmcgZnJvbSB0aGlzIHByb21pc2UgcmVqZWN0IGhhbmRsZXIsCisgICAgICAgICAg
ICAgIC8vIGFjY29yZGluZyB0byBwcm9taXNlIHNlbWFudGljcywgdGhhdCB3b3VsZAorICAgICAg
ICAgICAgICAvLyBjb252ZXJ0IHRoZSByZWplY3QgaW50byBhIHJlc29sdmUgYW5kIHRoZQorICAg
ICAgICAgICAgICAvLyB0cmFuc2l0aW9uIHdvdWxkIGNvbnRpbnVlLiBUbyBwcm9wYWdhdGUgdGhl
CisgICAgICAgICAgICAgIC8vIGVycm9yIHNvIHRoYXQgaXQnZCBiZSBoYW5kbGVkIGJ5IHRoZSBg
ZXJyb3JgCisgICAgICAgICAgICAgIC8vIGhvb2ssIHlvdSB3b3VsZCBoYXZlIHRvCisgICAgICAg
ICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdChlKTsKKyAgICAgICAgICAgIH0pOworICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGJlZm9yZU1vZGVsCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgaG9vayBp
cworICAgICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhl
IHRyYW5zaXRpb24KKyAgICAgICAgcmVzb2x2ZXMuIE90aGVyd2lzZSwgbm9uLXByb21pc2UgcmV0
dXJuIHZhbHVlcyBhcmUgbm90CisgICAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCisgICAgICBA
cHVibGljCisgICAgKi8KKyAgICBiZWZvcmVNb2RlbDogSywKKworICAgIC8qKgorICAgICAgVGhp
cyBob29rIGlzIGNhbGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9kZWwgaGFzIHJlc29sdmVkLgor
ICAgICAgSXQgZm9sbG93cyBpZGVudGljYWwgYXN5bmMvcHJvbWlzZSBzZW1hbnRpY3MgdG8gYGJl
Zm9yZU1vZGVsYAorICAgICAgYnV0IGlzIHByb3ZpZGVkIHRoZSByb3V0ZSdzIHJlc29sdmVkIG1v
ZGVsIGluIGFkZGl0aW9uIHRvCisgICAgICB0aGUgYHRyYW5zaXRpb25gLCBhbmQgaXMgdGhlcmVm
b3JlIHN1aXRlZCB0byBwZXJmb3JtaW5nCisgICAgICBsb2dpYyB0aGF0IGNhbiBvbmx5IHRha2Ug
cGxhY2UgYWZ0ZXIgdGhlIG1vZGVsIGhhcyBhbHJlYWR5CisgICAgICByZXNvbHZlZC4KKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICAgIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKHBvc3RzLCB0cmFuc2l0aW9uKSB7Cisg
ICAgICAgICAgaWYgKHBvc3RzLmdldCgnbGVuZ3RoJykgPT09IDEpIHsKKyAgICAgICAgICAgIHRo
aXMudHJhbnNpdGlvblRvKCdwb3N0LnNob3cnLCBwb3N0cy5nZXQoJ2ZpcnN0T2JqZWN0JykpOwor
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBSZWZl
ciB0byBkb2N1bWVudGF0aW9uIGZvciBgYmVmb3JlTW9kZWxgIGZvciBhIGRlc2NyaXB0aW9uCisg
ICAgICBvZiB0cmFuc2l0aW9uLXBhdXNpbmcgc2VtYW50aWNzIHdoZW4gYSBwcm9taXNlIGlzIHJl
dHVybmVkCisgICAgICBmcm9tIHRoaXMgaG9vay4KKyAgICAgICBAbWV0aG9kIGFmdGVyTW9kZWwK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSByZXNvbHZlZE1vZGVsIHRoZSB2YWx1ZSByZXR1cm5lZCBm
cm9tIGBtb2RlbGAsCisgICAgICAgIG9yIGl0cyByZXNvbHZlZCB2YWx1ZSBpZiBpdCB3YXMgYSBw
cm9taXNlCisgICAgICBAcGFyYW0ge1RyYW5zaXRpb259IHRyYW5zaXRpb24KKyAgICAgIEByZXR1
cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgaG9vayBpcworICAg
ICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhlIHRyYW5z
aXRpb24KKyAgICAgICAgcmVzb2x2ZXMuIE90aGVyd2lzZSwgbm9uLXByb21pc2UgcmV0dXJuIHZh
bHVlcyBhcmUgbm90CisgICAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCisgICAgICBAcHVibGlj
CisgICAgICovCisgICAgYWZ0ZXJNb2RlbDogSywKKworICAgIC8qKgorICAgICAgQSBob29rIHlv
dSBjYW4gaW1wbGVtZW50IHRvIG9wdGlvbmFsbHkgcmVkaXJlY3QgdG8gYW5vdGhlciByb3V0ZS4K
KyAgICAgICBJZiB5b3UgY2FsbCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20gaW5zaWRlIG9mIHRo
aXMgaG9vaywgdGhpcyByb3V0ZQorICAgICAgd2lsbCBub3QgYmUgZW50ZXJlZCBpbiBmYXZvciBv
ZiB0aGUgb3RoZXIgaG9vay4KKyAgICAgICBgcmVkaXJlY3RgIGFuZCBgYWZ0ZXJNb2RlbGAgYmVo
YXZlIHZlcnkgc2ltaWxhcmx5IGFuZCBhcmUKKyAgICAgIGNhbGxlZCBhbG1vc3QgYXQgdGhlIHNh
bWUgdGltZSwgYnV0IHRoZXkgaGF2ZSBhbiBpbXBvcnRhbnQKKyAgICAgIGRpc3RpbmN0aW9uIGlu
IHRoZSBjYXNlIHRoYXQsIGZyb20gb25lIG9mIHRoZXNlIGhvb2tzLCBhCisgICAgICByZWRpcmVj
dCBpbnRvIGEgY2hpbGQgcm91dGUgb2YgdGhpcyByb3V0ZSBvY2N1cnM6IHJlZGlyZWN0cworICAg
ICAgZnJvbSBgYWZ0ZXJNb2RlbGAgZXNzZW50aWFsbHkgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBh
dHRlbXB0CisgICAgICB0byBlbnRlciB0aGlzIHJvdXRlLCBhbmQgd2lsbCByZXN1bHQgaW4gdGhp
cyByb3V0ZSdzIGBiZWZvcmVNb2RlbGAsCisgICAgICBgbW9kZWxgLCBhbmQgYGFmdGVyTW9kZWxg
IGhvb2tzIGJlaW5nIGZpcmVkIGFnYWluIHdpdGhpbgorICAgICAgdGhlIG5ldywgcmVkaXJlY3Rp
bmcgdHJhbnNpdGlvbi4gUmVkaXJlY3RzIHRoYXQgb2NjdXIgd2l0aGluCisgICAgICB0aGUgYHJl
ZGlyZWN0YCBob29rLCBvbiB0aGUgb3RoZXIgaGFuZCwgd2lsbCBfbm90XyBjYXVzZQorICAgICAg
dGhlc2UgaG9va3MgdG8gYmUgZmlyZWQgYWdhaW4gdGhlIHNlY29uZCB0aW1lIGFyb3VuZDsgaW4K
KyAgICAgIG90aGVyIHdvcmRzLCBieSB0aGUgdGltZSB0aGUgYHJlZGlyZWN0YCBob29rIGhhcyBi
ZWVuIGNhbGxlZCwKKyAgICAgIGJvdGggdGhlIHJlc29sdmVkIG1vZGVsIGFuZCBhdHRlbXB0ZWQg
ZW50cnkgaW50byB0aGlzIHJvdXRlCisgICAgICBhcmUgY29uc2lkZXJlZCB0byBiZSBmdWxseSB2
YWxpZGF0ZWQuCisgICAgICAgQG1ldGhvZCByZWRpcmVjdAorICAgICAgQHBhcmFtIHtPYmplY3R9
IG1vZGVsIHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZQorICAgICAgQHBhcmFtIHtUcmFuc2l0aW9u
fSB0cmFuc2l0aW9uIHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1
cnJlbnQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVkaXJlY3Q6IEss
CisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNoYW5nZWQgYnkg
cm91dGVyLmpzLgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIGNvbnRleHREaWRDaGFu
Z2UKKyAgICAqLworICAgIGNvbnRleHREaWRDaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRo
aXMuY3VycmVudE1vZGVsID0gdGhpcy5jb250ZXh0OworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBjb252ZXJ0IHRoZSBVUkwgaW50byB0aGUgbW9k
ZWwgZm9yCisgICAgICB0aGlzIHJvdXRlLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdwb3N0JywgeyBw
YXRoOiAnL3Bvc3RzLzpwb3N0X2lkJyB9KTsKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAg
VGhlIG1vZGVsIGZvciB0aGUgYHBvc3RgIHJvdXRlIGlzIGBzdG9yZS5maW5kUmVjb3JkKCdwb3N0
JywgcGFyYW1zLnBvc3RfaWQpYC4KKyAgICAgICBCeSBkZWZhdWx0LCBpZiB5b3VyIHJvdXRlIGhh
cyBhIGR5bmFtaWMgc2VnbWVudCBlbmRpbmcgaW4gYF9pZGA6CisgICAgICAgKiBUaGUgbW9kZWwg
Y2xhc3MgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChgcG9zdF9pZGAncworICAgICAg
ICBjbGFzcyBpcyBgQXBwLlBvc3RgKQorICAgICAgKiBUaGUgZmluZCBtZXRob2QgaXMgY2FsbGVk
IG9uIHRoZSBtb2RlbCBjbGFzcyB3aXRoIHRoZSB2YWx1ZSBvZgorICAgICAgICB0aGUgZHluYW1p
YyBzZWdtZW50LgorICAgICAgIE5vdGUgdGhhdCBmb3Igcm91dGVzIHdpdGggZHluYW1pYyBzZWdt
ZW50cywgdGhpcyBob29rIGlzIG5vdCBhbHdheXMKKyAgICAgIGV4ZWN1dGVkLiBJZiB0aGUgcm91
dGUgaXMgZW50ZXJlZCB0aHJvdWdoIGEgdHJhbnNpdGlvbiAoZS5nLiB3aGVuCisgICAgICB1c2lu
ZyB0aGUgYGxpbmstdG9gIEhhbmRsZWJhcnMgaGVscGVyIG9yIHRoZSBgdHJhbnNpdGlvblRvYCBt
ZXRob2QKKyAgICAgIG9mIHJvdXRlcyksIGFuZCBhIG1vZGVsIGNvbnRleHQgaXMgYWxyZWFkeSBw
cm92aWRlZCB0aGlzIGhvb2sKKyAgICAgIGlzIG5vdCBjYWxsZWQuCisgICAgICAgQSBtb2RlbCBj
b250ZXh0IGRvZXMgbm90IGluY2x1ZGUgYSBwcmltaXRpdmUgc3RyaW5nIG9yIG51bWJlciwKKyAg
ICAgIHdoaWNoIGRvZXMgY2F1c2UgdGhlIG1vZGVsIGhvb2sgdG8gYmUgY2FsbGVkLgorICAgICAg
IFJvdXRlcyB3aXRob3V0IGR5bmFtaWMgc2VnbWVudHMgd2lsbCBhbHdheXMgZXhlY3V0ZSB0aGUg
bW9kZWwgaG9vay4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBubyBkeW5hbWljIHNl
Z21lbnQsIG1vZGVsIGhvb2sgYWx3YXlzIGNhbGxlZAorICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3RzJyk7CisgICAgICAgLy8gbW9kZWwgcGFzc2VkIGluLCBzbyBtb2RlbCBob29rIG5vdCBj
YWxsZWQKKyAgICAgIHRoZVBvc3QgPSBzdG9yZS5maW5kUmVjb3JkKCdwb3N0JywgMSk7CisgICAg
ICB0aGlzLnRyYW5zaXRpb25UbygncG9zdCcsIHRoZVBvc3QpOworICAgICAgIC8vIGludGVnZXIg
cGFzc2VkIGluLCBtb2RlbCBob29rIGlzIGNhbGxlZAorICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3QnLCAxKTsKKyAgICAgICAvLyBtb2RlbCBpZCBwYXNzZWQgaW4sIG1vZGVsIGhvb2sgaXMg
Y2FsbGVkCisgICAgICAvLyB1c2VmdWwgZm9yIGZvcmNpbmcgdGhlIGhvb2sgdG8gZXhlY3V0ZQor
ICAgICAgdGhlUG9zdCA9IHN0b3JlLmZpbmRSZWNvcmQoJ3Bvc3QnLCAxKTsKKyAgICAgIHRoaXMu
dHJhbnNpdGlvblRvKCdwb3N0JywgdGhlUG9zdC5pZCk7CisgICAgICBgYGAKKyAgICAgICAgVGhp
cyBob29rIGZvbGxvd3MgdGhlIGFzeW5jaHJvbm91cy9wcm9taXNlIHNlbWFudGljcworICAgICAg
ZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgYmVmb3JlTW9kZWxgLiBJbiBwYXJ0
aWN1bGFyLAorICAgICAgaWYgYSBwcm9taXNlIHJldHVybmVkIGZyb20gYG1vZGVsYCBmYWlscywg
dGhlIGVycm9yIHdpbGwgYmUKKyAgICAgIGhhbmRsZWQgYnkgdGhlIGBlcnJvcmAgaG9vayBvbiBg
RW1iZXIuUm91dGVgLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgbW9kZWw6IGZ1
bmN0aW9uKHBhcmFtcykgeworICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmZpbmRSZWNvcmQo
J3Bvc3QnLCBwYXJhbXMucG9zdF9pZCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBg
CisgICAgICAgQG1ldGhvZCBtb2RlbAorICAgICAgQHBhcmFtIHtPYmplY3R9IHBhcmFtcyB0aGUg
cGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgVVJMCisgICAgICBAcGFyYW0ge1RyYW5zaXRp
b259IHRyYW5zaXRpb24KKyAgICAgIEByZXR1cm4ge09iamVjdHxQcm9taXNlfSB0aGUgbW9kZWwg
Zm9yIHRoaXMgcm91dGUuIElmCisgICAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5lZCwgdGhlIHRy
YW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAorICAgICAgICB0aGUgcHJvbWlzZSByZXNvbHZlcywg
YW5kIHRoZSByZXNvbHZlZCB2YWx1ZSBvZiB0aGUgcHJvbWlzZQorICAgICAgICB3aWxsIGJlIHVz
ZWQgYXMgdGhlIG1vZGVsIGZvciB0aGlzIHJvdXRlLgorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgbW9kZWw6IGZ1bmN0aW9uIChwYXJhbXMsIHRyYW5zaXRpb24pIHsKKyAgICAgIHZhciBtYXRj
aCwgbmFtZSwgc2F3UGFyYW1zLCB2YWx1ZTsKKyAgICAgIHZhciBxdWVyeVBhcmFtcyA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX3FwLm1hcCcpOworCisgICAgICBmb3IgKHZh
ciBwcm9wIGluIHBhcmFtcykgeworICAgICAgICBpZiAocHJvcCA9PT0gJ3F1ZXJ5UGFyYW1zJyB8
fCBxdWVyeVBhcmFtcyAmJiBwcm9wIGluIHF1ZXJ5UGFyYW1zKSB7CisgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF0Y2ggPSBwcm9wLm1hdGNoKC9eKC4qKV9p
ZCQvKSkgeworICAgICAgICAgIG5hbWUgPSBtYXRjaFsxXTsKKyAgICAgICAgICB2YWx1ZSA9IHBh
cmFtc1twcm9wXTsKKyAgICAgICAgfQorICAgICAgICBzYXdQYXJhbXMgPSB0cnVlOworICAgICAg
fQorCisgICAgICBpZiAoIW5hbWUgJiYgc2F3UGFyYW1zKSB7CisgICAgICAgIHJldHVybiBfZW1i
ZXJSdW50aW1lQ29weS5kZWZhdWx0KHBhcmFtcyk7CisgICAgICB9IGVsc2UgaWYgKCFuYW1lKSB7
CisgICAgICAgIGlmICh0cmFuc2l0aW9uLnJlc29sdmVJbmRleCA8IDEpIHsKKyAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgcGFyZW50TW9kZWwgPSB0cmFuc2l0aW9u
LnN0YXRlLmhhbmRsZXJJbmZvc1t0cmFuc2l0aW9uLnJlc29sdmVJbmRleCAtIDFdLmNvbnRleHQ7
CisKKyAgICAgICAgcmV0dXJuIHBhcmVudE1vZGVsOworICAgICAgfQorCisgICAgICByZXR1cm4g
dGhpcy5maW5kTW9kZWwobmFtZSwgdmFsdWUpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBw
cml2YXRlCisgICAgICBAbWV0aG9kIGRlc2VyaWFsaXplCisgICAgICBAcGFyYW0ge09iamVjdH0g
cGFyYW1zIHRoZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkwKKyAgICAgIEBwYXJh
bSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgorICAgICAgQHJldHVybiB7T2JqZWN0fFByb21pc2V9
IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4KKyAgICAgICBSb3V0ZXIuanMgaG9vay4KKyAgICAg
Ki8KKyAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24gKHBhcmFtcywgdHJhbnNpdGlvbikgeworICAg
ICAgcmV0dXJuIHRoaXMubW9kZWwodGhpcy5wYXJhbXNGb3IodGhpcy5yb3V0ZU5hbWUpLCB0cmFu
c2l0aW9uKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQG1ldGhvZCBmaW5kTW9kZWwKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtb2RlbCB0eXBlCisgICAgICBAcGFyYW0ge09i
amVjdH0gdmFsdWUgdGhlIHZhbHVlIHBhc3NlZCB0byBmaW5kCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgZmluZE1vZGVsOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgc3RvcmUgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3N0b3JlJyk7CisgICAgICByZXR1cm4gc3Rv
cmUuZmluZC5hcHBseShzdG9yZSwgYXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBTdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVyc2lzdGVuY2UgbGli
cmFyaWVzIHRvIGluamVjdCB0aGVtc2VsdmVzLgorICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgc3Rv
cmUgcHJvcGVydHkgcHJvdmlkZXMgdGhlIGV4YWN0IHNhbWUgZnVuY3Rpb25hbGl0eSBwcmV2aW91
c2x5CisgICAgICBpbiB0aGUgbW9kZWwgaG9vay4KKyAgICAgICBDdXJyZW50bHksIHRoZSByZXF1
aXJlZCBpbnRlcmZhY2UgaXM6CisgICAgICAgYHN0b3JlLmZpbmQobW9kZWxOYW1lLCBmaW5kQXJn
dW1lbnRzKWAKKyAgICAgICBAbWV0aG9kIHN0b3JlCisgICAgICBAcGFyYW0ge09iamVjdH0gc3Rv
cmUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBzdG9yZTogX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVyT3du
ZXIuZ2V0T3duZXIodGhpcyk7CisgICAgICB2YXIgcm91dGVOYW1lID0gdGhpcy5yb3V0ZU5hbWU7
CisgICAgICB2YXIgbmFtZXNwYWNlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdyb3V0ZXIubmFtZXNwYWNlJyk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIGZpbmQ6IGZ1
bmN0aW9uIChuYW1lLCB2YWx1ZSkgeworICAgICAgICAgIHZhciBtb2RlbENsYXNzID0gb3duZXIu
X2xvb2t1cEZhY3RvcnkoJ21vZGVsOicgKyBuYW1lKTsKKworICAgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdZb3UgdXNlZCB0aGUgZHluYW1pYyBzZWdtZW50ICcgKyBuYW1lICsgJ19p
ZCBpbiB5b3VyIHJvdXRlICcgKyByb3V0ZU5hbWUgKyAnLCBidXQgJyArIG5hbWVzcGFjZSArICcu
JyArIF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuY2xhc3NpZnkobmFtZSkgKyAnIGRpZCBub3Qg
ZXhpc3QgYW5kIHlvdSBkaWQgbm90IG92ZXJyaWRlIHlvdXIgcm91dGVcJ3MgYG1vZGVsYCBob29r
LicsICEhbW9kZWxDbGFzcyk7CisKKyAgICAgICAgICBpZiAoIW1vZGVsQ2xhc3MpIHsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVn
LmFzc2VydChfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmNsYXNzaWZ5KG5hbWUpICsgJyBoYXMg
bm8gbWV0aG9kIGBmaW5kYC4nLCB0eXBlb2YgbW9kZWxDbGFzcy5maW5kID09PSAnZnVuY3Rpb24n
KTsKKworICAgICAgICAgIHJldHVybiBtb2RlbENsYXNzLmZpbmQodmFsdWUpOworICAgICAgICB9
CisgICAgICB9OworICAgIH0pLAorCisgICAgLyoqCisgICAgICBBIGhvb2sgeW91IGNhbiBpbXBs
ZW1lbnQgdG8gY29udmVydCB0aGUgcm91dGUncyBtb2RlbCBpbnRvIHBhcmFtZXRlcnMKKyAgICAg
IGZvciB0aGUgVVJMLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJvdXRlKCdwb3N0JywgeyBwYXRoOiAnL3Bvc3Rz
Lzpwb3N0X2lkJyB9KTsKKyAgICAgIH0pOworICAgICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5S
b3V0ZS5leHRlbmQoeworICAgICAgICBtb2RlbDogZnVuY3Rpb24ocGFyYW1zKSB7CisgICAgICAg
ICAgLy8gdGhlIHNlcnZlciByZXR1cm5zIGB7IGlkOiAxMiB9YAorICAgICAgICAgIHJldHVybiBF
bWJlci4kLmdldEpTT04oJy9wb3N0cy8nICsgcGFyYW1zLnBvc3RfaWQpOworICAgICAgICB9LAor
ICAgICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihtb2RlbCkgeworICAgICAgICAgIC8vIHRoaXMg
d2lsbCBtYWtlIHRoZSBVUkwgYC9wb3N0cy8xMmAKKyAgICAgICAgICByZXR1cm4geyBwb3N0X2lk
OiBtb2RlbC5pZCB9OworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIFRo
ZSBkZWZhdWx0IGBzZXJpYWxpemVgIG1ldGhvZCB3aWxsIGluc2VydCB0aGUgbW9kZWwncyBgaWRg
IGludG8gdGhlCisgICAgICByb3V0ZSdzIGR5bmFtaWMgc2VnbWVudCAoaW4gdGhpcyBjYXNlLCBg
OnBvc3RfaWRgKSBpZiB0aGUgc2VnbWVudCBjb250YWlucyAnX2lkJy4KKyAgICAgIElmIHRoZSBy
b3V0ZSBoYXMgbXVsdGlwbGUgZHluYW1pYyBzZWdtZW50cyBvciBkb2VzIG5vdCBjb250YWluICdf
aWQnLCBgc2VyaWFsaXplYAorICAgICAgd2lsbCByZXR1cm4gYEVtYmVyLmdldFByb3BlcnRpZXMo
bW9kZWwsIHBhcmFtcylgCisgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYHRyYW5z
aXRpb25Ub2AgaXMgY2FsbGVkIHdpdGggYSBjb250ZXh0CisgICAgICBpbiBvcmRlciB0byBwb3B1
bGF0ZSB0aGUgVVJMLgorICAgICAgIEBtZXRob2Qgc2VyaWFsaXplCisgICAgICBAcGFyYW0ge09i
amVjdH0gbW9kZWwgdGhlIHJvdXRlcyBtb2RlbAorICAgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1z
IGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1cnJlbnQKKyAgICAgICAgcm91
dGUgKGluIHRoZSBleGFtcGxlLCBgWydwb3N0X2lkJ11gLgorICAgICAgQHJldHVybiB7T2JqZWN0
fSB0aGUgc2VyaWFsaXplZCBwYXJhbWV0ZXJzCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBz
ZXJpYWxpemU6IGZ1bmN0aW9uIChtb2RlbCwgcGFyYW1zKSB7CisgICAgICBpZiAocGFyYW1zLmxl
bmd0aCA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKCFtb2RlbCkg
eworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBuYW1lID0gcGFyYW1zWzBd
OworICAgICAgdmFyIG9iamVjdCA9IHt9OworCisgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0g
MSkgeworICAgICAgICBpZiAobmFtZSBpbiBtb2RlbCkgeworICAgICAgICAgIG9iamVjdFtuYW1l
XSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChtb2RlbCwgbmFtZSk7CisgICAgICAgIH0g
ZWxzZSBpZiAoL19pZCQvLnRlc3QobmFtZSkpIHsKKyAgICAgICAgICBvYmplY3RbbmFtZV0gPSBf
ZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobW9kZWwsICdpZCcpOworICAgICAgICB9CisgICAg
ICB9IGVsc2UgeworICAgICAgICBvYmplY3QgPSBfZW1iZXJNZXRhbEdldF9wcm9wZXJ0aWVzLmRl
ZmF1bHQobW9kZWwsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvYmplY3Q7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQSBob29rIHlvdSBjYW4gdXNlIHRvIHNldHVwIHRoZSBj
b250cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyBj
YWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUgYW5kIHRoZQor
ICAgICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9vay4KKyAgICAgICBCeSBkZWZh
dWx0LCB0aGUgYHNldHVwQ29udHJvbGxlcmAgaG9vayBzZXRzIHRoZSBgbW9kZWxgIHByb3BlcnR5
IG9mCisgICAgICB0aGUgY29udHJvbGxlciB0byB0aGUgYG1vZGVsYC4KKyAgICAgICBJZiB5b3Ug
aW1wbGVtZW50IHRoZSBgc2V0dXBDb250cm9sbGVyYCBob29rIGluIHlvdXIgUm91dGUsIGl0IHdp
bGwKKyAgICAgIHByZXZlbnQgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLiBJZiB5b3Ugd2FudCB0byBw
cmVzZXJ2ZSB0aGF0IGJlaGF2aW9yCisgICAgICB3aGVuIGltcGxlbWVudGluZyB5b3VyIGBzZXR1
cENvbnRyb2xsZXJgIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gY2FsbAorICAgICAgYF9zdXBlcmA6
CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBob3Rvc1JvdXRlID0gRW1iZXIuUm91
dGUuZXh0ZW5kKHsKKyAgICAgICAgbW9kZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVy
biB0aGlzLnN0b3JlLmZpbmRBbGwoJ3Bob3RvJyk7CisgICAgICAgIH0sCisgICAgICAgICBzZXR1
cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIG1vZGVsKSB7CisgICAgICAgICAgLy8g
Q2FsbCBfc3VwZXIgZm9yIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgICAgICB0aGlzLl9zdXBlcihj
b250cm9sbGVyLCBtb2RlbCk7CisgICAgICAgICAgLy8gSW1wbGVtZW50IHlvdXIgY3VzdG9tIHNl
dHVwIGFmdGVyCisgICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCdhcHBsaWNhdGlvbicpLnNl
dCgnc2hvd2luZ1Bob3RvcycsIHRydWUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBg
YAorICAgICAgIFRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdpbGwgYmUgb25lIHJlc29sdmVkIGJh
c2VkIG9uIHRoZSBuYW1lCisgICAgICBvZiB0aGlzIHJvdXRlLgorICAgICAgIElmIG5vIGV4cGxp
Y2l0IGNvbnRyb2xsZXIgaXMgZGVmaW5lZCwgRW1iZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0
ZSBvbmUuCisgICAgICAgQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIHJvdXRlcjoKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAg
ICAgdGhpcy5yb3V0ZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0cy86cG9zdF9pZCcgfSk7CisgICAg
ICB9KTsKKyAgICAgIGBgYAorICAgICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCBhIGNvbnRyb2xs
ZXIgbmFtZWQgYEFwcC5Qb3N0Q29udHJvbGxlcmAgd291bGQKKyAgICAgIGJlIHVzZWQgaWYgaXQg
aXMgZGVmaW5lZC4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGEgYmFzaWMgYEVtYmVyLkNvbnRyb2xs
ZXJgCisgICAgICBpbnN0YW5jZSB3b3VsZCBiZSB1c2VkLgorICAgICAgIEV4YW1wbGUKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5k
KHsKKyAgICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkg
eworICAgICAgICAgIGNvbnRyb2xsZXIuc2V0KCdtb2RlbCcsIG1vZGVsKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHNldHVwQ29udHJvbGxlcgorICAg
ICAgQHBhcmFtIHtDb250cm9sbGVyfSBjb250cm9sbGVyIGluc3RhbmNlCisgICAgICBAcGFyYW0g
e09iamVjdH0gbW9kZWwKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNldHVwQ29udHJvbGxl
cjogZnVuY3Rpb24gKGNvbnRyb2xsZXIsIGNvbnRleHQsIHRyYW5zaXRpb24pIHsKKyAgICAgIGlm
IChjb250cm9sbGVyICYmIGNvbnRleHQgIT09IHVuZGVmaW5lZCkgeworICAgICAgICBfZW1iZXJN
ZXRhbFByb3BlcnR5X3NldC5zZXQoY29udHJvbGxlciwgJ21vZGVsJywgY29udGV4dCk7CisgICAg
ICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgY29udHJvbGxlciBmb3Ig
YSBwYXJ0aWN1bGFyIHJvdXRlIG9yIG5hbWUuCisgICAgICAgVGhlIGNvbnRyb2xsZXIgaW5zdGFu
Y2UgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkLCBlaXRoZXIgdGhyb3VnaCBlbnRlcmlu
ZyB0aGUKKyAgICAgIGFzc29jaWF0ZWQgcm91dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJvbGxl
cmAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7CisgICAgICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rpb24oY29udHJvbGxl
ciwgcG9zdCkgeworICAgICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIsIHBvc3QpOworICAg
ICAgICAgIHRoaXMuY29udHJvbGxlckZvcigncG9zdHMnKS5zZXQoJ2N1cnJlbnRQb3N0JywgcG9z
dCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBjb250
cm9sbGVyRm9yCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91
dGUgb3IgY29udHJvbGxlcgorICAgICAgQHJldHVybiB7RW1iZXIuQ29udHJvbGxlcn0KKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIGNvbnRyb2xsZXJGb3I6IGZ1bmN0aW9uIChuYW1lLCBfc2tp
cEFzc2VydCkgeworICAgICAgdmFyIG93bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRo
aXMpOworICAgICAgdmFyIHJvdXRlID0gb3duZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSk7Cisg
ICAgICB2YXIgY29udHJvbGxlcjsKKworICAgICAgaWYgKHJvdXRlICYmIHJvdXRlLmNvbnRyb2xs
ZXJOYW1lKSB7CisgICAgICAgIG5hbWUgPSByb3V0ZS5jb250cm9sbGVyTmFtZTsKKyAgICAgIH0K
KworICAgICAgY29udHJvbGxlciA9IG93bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgbmFtZSk7
CisKKyAgICAgIC8vIE5PVEU6IFdlJ3JlIHNwZWNpZmljYWxseSBjaGVja2luZyB0aGF0IHNraXBB
c3NlcnQgaXMgdHJ1ZSwgYmVjYXVzZSBhY2NvcmRpbmcKKyAgICAgIC8vICAgdG8gdGhlIG9sZCBB
UEkgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIG1vZGVsLiBXZSBkbyBub3Qgd2FudCBwZW9wbGUg
d2hvCisgICAgICAvLyAgIHBhc3NlZCBhIG1vZGVsIHRvIHNraXAgdGhlIGFzc2VydGlvbi4KKyAg
ICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgY29udHJvbGxlciBuYW1lZCBcJycgKyBu
YW1lICsgJ1wnIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlIHRoYXQgdGhpcyByb3V0ZSBl
eGlzdHMgYW5kIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZCBhdCBsZWFzdCBvbmNlLiBJZiB5b3Ug
YXJlIGFjY2Vzc2luZyBhIGNvbnRyb2xsZXIgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlLCBt
YWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgY2xhc3MgaXMgZXhwbGljaXRseSBkZWZpbmVkLicsIGNv
bnRyb2xsZXIgfHwgX3NraXBBc3NlcnQgPT09IHRydWUpOworCisgICAgICByZXR1cm4gY29udHJv
bGxlcjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBHZW5lcmF0ZXMgYSBjb250cm9sbGVyIGZv
ciBhIHJvdXRlLgorICAgICAgIEV4YW1wbGUKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBB
cHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgc2V0dXBDb250cm9s
bGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIo
Y29udHJvbGxlciwgcG9zdCk7CisgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbnRyb2xsZXIoJ3Bv
c3RzJywgcG9zdCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBnZW5lcmF0ZUNvbnRyb2xsZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBu
YW1lIG9mIHRoZSBjb250cm9sbGVyCisgICAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwgdGhlIG1v
ZGVsIHRvIGluZmVyIHRoZSB0eXBlIG9mIHRoZSBjb250cm9sbGVyIChvcHRpb25hbCkKKyAgICAg
IEBwcml2YXRlCisgICAgKi8KKyAgICBnZW5lcmF0ZUNvbnRyb2xsZXI6IGZ1bmN0aW9uIChuYW1l
LCBtb2RlbCkgeworICAgICAgdmFyIG93bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRo
aXMpOworCisgICAgICBtb2RlbCA9IG1vZGVsIHx8IHRoaXMubW9kZWxGb3IobmFtZSk7CisKKyAg
ICAgIHJldHVybiBfZW1iZXJSb3V0aW5nU3lzdGVtR2VuZXJhdGVfY29udHJvbGxlci5kZWZhdWx0
KG93bmVyLCBuYW1lLCBtb2RlbCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0
aGUgcmVzb2x2ZWQgbW9kZWwgb2YgYSBwYXJlbnQgKG9yIGFueSBhbmNlc3Rvcikgcm91dGUKKyAg
ICAgIGluIGEgcm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEgdHJhbnNpdGlvbiwgYWxsIHJvdXRl
cworICAgICAgbXVzdCByZXNvbHZlIGEgbW9kZWwgb2JqZWN0LCBhbmQgaWYgYSByb3V0ZQorICAg
ICAgbmVlZHMgYWNjZXNzIHRvIGEgcGFyZW50IHJvdXRlJ3MgbW9kZWwgaW4gb3JkZXIgdG8KKyAg
ICAgIHJlc29sdmUgYSBtb2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9kZWwgZnJvbSBhIHBhcmVu
dCksCisgICAgICBpdCBjYW4gY2FsbCBgdGhpcy5tb2RlbEZvcih0aGVOYW1lT2ZQYXJlbnRSb3V0
ZSlgIHRvCisgICAgICByZXRyaWV2ZSBpdC4gSWYgdGhlIGFuY2VzdG9yIHJvdXRlJ3MgbW9kZWwg
d2FzIGEgcHJvbWlzZSwKKyAgICAgIGl0cyByZXNvbHZlZCByZXN1bHQgaXMgcmV0dXJuZWQuCisg
ICAgICAgRXhhbXBsZQorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5Sb3V0ZXIubWFw
KGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucm91dGUoJ3Bvc3QnLCB7IHBhdGg6ICcvcG9z
dC86cG9zdF9pZCcgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnJvdXRlKCdjb21t
ZW50cycsIHsgcmVzZXROYW1lc3BhY2U6IHRydWUgfSk7CisgICAgICAgICAgfSk7CisgICAgICB9
KTsKKyAgICAgICBBcHAuQ29tbWVudHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAg
ICAgICAgYWZ0ZXJNb2RlbDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB0aGlzLnNldCgncG9z
dCcsIHRoaXMubW9kZWxGb3IoJ3Bvc3QnKSk7CisgICAgICAgICAgfQorICAgICAgfSk7CisgICAg
ICBgYGAKKyAgICAgICBAbWV0aG9kIG1vZGVsRm9yCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVs
IG9iamVjdAorICAgICAgQHB1YmxpYworICAgICovCisgICAgbW9kZWxGb3I6IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgICB2YXIgcm91dGUgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcyku
bG9va3VwKCdyb3V0ZTonICsgbmFtZSk7CisgICAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMucm91
dGVyID8gdGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5zaXRpb24gOiBudWxsOworCisgICAg
ICAvLyBJZiB3ZSBhcmUgbWlkLXRyYW5zaXRpb24sIHdlIHdhbnQgdG8gdHJ5IGFuZCBsb29rIHVw
CisgICAgICAvLyByZXNvbHZlZCBwYXJlbnQgY29udGV4dHMgb24gdGhlIGN1cnJlbnQgdHJhbnNp
dGlvbkV2ZW50LgorICAgICAgaWYgKHRyYW5zaXRpb24pIHsKKyAgICAgICAgdmFyIG1vZGVsTG9v
a3VwTmFtZSA9IHJvdXRlICYmIHJvdXRlLnJvdXRlTmFtZSB8fCBuYW1lOworICAgICAgICBpZiAo
dHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVscy5oYXNPd25Qcm9wZXJ0eShtb2RlbExvb2t1cE5hbWUp
KSB7CisgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxMb29r
dXBOYW1lXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gcm91dGUgJiYgcm91
dGUuY3VycmVudE1vZGVsOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEEgaG9vayB5b3UgY2Fu
IHVzZSB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAg
ICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1cnJl
bnQgcm91dGUgYW5kIHRoZQorICAgICAgbW9kZWwgc3VwcGxpZWQgYnkgdGhlIGBtb2RlbGAgaG9v
ay4gQnkgZGVmYXVsdCwgaXQgcmVuZGVycyB0aGUgcm91dGUncworICAgICAgdGVtcGxhdGUsIGNv
bmZpZ3VyZWQgd2l0aCB0aGUgY29udHJvbGxlciBmb3IgdGhlIHJvdXRlLgorICAgICAgIFRoaXMg
bWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIHNldCB1cCBhbmQgcmVuZGVyIGFkZGl0aW9uYWwg
b3IKKyAgICAgIGFsdGVybmF0aXZlIHRlbXBsYXRlcy4KKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgICAgIHJlbmRl
clRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgeworICAgICAgICAgIHZhciBm
YXZDb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyRm9yKCdmYXZvcml0ZVBvc3QnKTsKKyAgICAg
ICAgICAgLy8gUmVuZGVyIHRoZSBgZmF2b3JpdGVQb3N0YCB0ZW1wbGF0ZSBpbnRvCisgICAgICAg
ICAgLy8gdGhlIG91dGxldCBgcG9zdHNgLCBhbmQgZGlzcGxheSB0aGUgYGZhdm9yaXRlUG9zdGAK
KyAgICAgICAgICAvLyBjb250cm9sbGVyLgorICAgICAgICAgIHRoaXMucmVuZGVyKCdmYXZvcml0
ZVBvc3QnLCB7CisgICAgICAgICAgICBvdXRsZXQ6ICdwb3N0cycsCisgICAgICAgICAgICBjb250
cm9sbGVyOiBmYXZDb250cm9sbGVyCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0p
OworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCByZW5kZXJUZW1wbGF0ZQorICAgICAgQHBhcmFt
IHtPYmplY3R9IGNvbnRyb2xsZXIgdGhlIHJvdXRlJ3MgY29udHJvbGxlcgorICAgICAgQHBhcmFt
IHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24gKGNvbnRyb2xsZXIsIG1vZGVsKSB7CisgICAg
ICB0aGlzLnJlbmRlcigpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIGByZW5kZXJgIGlzIHVz
ZWQgdG8gcmVuZGVyIGEgdGVtcGxhdGUgaW50byBhIHJlZ2lvbiBvZiBhbm90aGVyIHRlbXBsYXRl
CisgICAgICAoaW5kaWNhdGVkIGJ5IGFuIGB7e291dGxldH19YCkuIGByZW5kZXJgIGlzIHVzZWQg
Ym90aCBkdXJpbmcgdGhlIGVudHJ5CisgICAgICBwaGFzZSBvZiByb3V0aW5nICh2aWEgdGhlIGBy
ZW5kZXJUZW1wbGF0ZWAgaG9vaykgYW5kIGxhdGVyIGluIHJlc3BvbnNlIHRvCisgICAgICB1c2Vy
IGludGVyYWN0aW9uLgorICAgICAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1p
bmltYWwgcm91dGVyIGFuZCB0ZW1wbGF0ZXM6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
Um91dGVyLm1hcChmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgncGhvdG9zJyk7Cisg
ICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIDwhLS0gYXBw
bGljYXRpb24uaGJzIC0tPgorICAgICAgPGRpdiBjbGFzcz0nc29tZXRoaW5nLWluLXRoZS1hcHAt
aGJzJz4KKyAgICAgICAge3tvdXRsZXQgImFuT3V0bGV0TmFtZSJ9fQorICAgICAgPC9kaXY+Cisg
ICAgICBgYGAKKyAgICAgICBgYGBoYW5kbGViYXJzCisgICAgICA8IS0tIHBob3Rvcy5oYnMgLS0+
CisgICAgICA8aDE+UGhvdG9zPC9oMT4KKyAgICAgIGBgYAorICAgICAgIFlvdSBjYW4gcmVuZGVy
IGBwaG90b3MuaGJzYCBpbnRvIHRoZSBgImFuT3V0bGV0TmFtZSJgIG91dGxldCBvZgorICAgICAg
YGFwcGxpY2F0aW9uLmhic2AgYnkgY2FsbGluZyBgcmVuZGVyYDoKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAvLyBwb3N0cyByb3V0ZQorICAgICAgRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAg
ICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRoaXMucmVuZGVy
KCdwaG90b3MnLCB7CisgICAgICAgICAgICBpbnRvOiAnYXBwbGljYXRpb24nLAorICAgICAgICAg
ICAgb3V0bGV0OiAnYW5PdXRsZXROYW1lJworICAgICAgICAgIH0pCisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgYGBgCisgICAgICAgYHJlbmRlcmAgYWRkaXRpb25hbGx5IGFsbG93cyB5b3Ug
dG8gc3VwcGx5IHdoaWNoIGB2aWV3YCwgYGNvbnRyb2xsZXJgLCBhbmQKKyAgICAgIGBtb2RlbGAg
b2JqZWN0cyBzaG91bGQgYmUgbG9hZGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmVk
IHRlbXBsYXRlLgorICAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBwb3N0cyByb3V0ZQor
ICAgICAgRW1iZXIuUm91dGUuZXh0ZW5kKHsKKyAgICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0
aW9uKGNvbnRyb2xsZXIsIG1vZGVsKXsKKyAgICAgICAgICB0aGlzLnJlbmRlcigncG9zdHMnLCB7
ICAgIC8vIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIsIHJlZmVyZW5jZWQgYnkgbmFtZQorICAgICAg
ICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJywgICAgLy8gdGhlIHRlbXBsYXRlIHRvIHJlbmRlciBp
bnRvLCByZWZlcmVuY2VkIGJ5IG5hbWUKKyAgICAgICAgICAgIG91dGxldDogJ2FuT3V0bGV0TmFt
ZScsIC8vIHRoZSBvdXRsZXQgaW5zaWRlIGBvcHRpb25zLnRlbXBsYXRlYCB0byByZW5kZXIgaW50
by4KKyAgICAgICAgICAgIHZpZXc6ICdhVmlld05hbWUnLCAgICAgIC8vIHRoZSB2aWV3IHRvIHVz
ZSBmb3IgdGhpcyB0ZW1wbGF0ZSwgcmVmZXJlbmNlZCBieSBuYW1lCisgICAgICAgICAgICBjb250
cm9sbGVyOiAnc29tZUNvbnRyb2xsZXJOYW1lJywgLy8gdGhlIGNvbnRyb2xsZXIgdG8gdXNlIGZv
ciB0aGlzIHRlbXBsYXRlLCByZWZlcmVuY2VkIGJ5IG5hbWUKKyAgICAgICAgICAgIG1vZGVsOiBt
b2RlbCAgICAgICAgICAgIC8vIHRoZSBtb2RlbCB0byBzZXQgb24gYG9wdGlvbnMuY29udHJvbGxl
cmAuCisgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAg
ICBUaGUgc3RyaW5nIHZhbHVlcyBwcm92aWRlZCBmb3IgdGhlIHRlbXBsYXRlIG5hbWUsIHZpZXcs
IGFuZCBjb250cm9sbGVyCisgICAgICB3aWxsIGV2ZW50dWFsbHkgcGFzcyB0aHJvdWdoIHRvIHRo
ZSByZXNvbHZlciBmb3IgbG9va3VwLiBTZWUKKyAgICAgIEVtYmVyLlJlc29sdmVyIGZvciBob3cg
dGhlc2UgYXJlIG1hcHBlZCB0byBKYXZhU2NyaXB0IG9iamVjdHMgaW4geW91cgorICAgICAgYXBw
bGljYXRpb24uCisgICAgICAgTm90IGFsbCBvcHRpb25zIG5lZWQgdG8gYmUgcGFzc2VkIHRvIGBy
ZW5kZXJgLiBEZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQKKyAgICAgIGJhc2VkIG9uIHRoZSBu
YW1lIG9mIHRoZSByb3V0ZSBzcGVjaWZpZWQgaW4gdGhlIHJvdXRlciBvciB0aGUgUm91dGUncwor
ICAgICAgYGNvbnRyb2xsZXJOYW1lYCwgYHZpZXdOYW1lYCBhbmQgYHRlbXBsYXRlTmFtZWAgcHJv
cGVydGllcy4KKyAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICAvLyByb3V0ZXIKKyAgICAgIFJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMu
cm91dGUoJ2luZGV4Jyk7CisgICAgICAgIHRoaXMucm91dGUoJ3Bvc3QnLCB7IHBhdGg6ICcvcG9z
dHMvOnBvc3RfaWQnIH0pOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAvLyBwb3N0IHJvdXRlCisgICAgICBQb3N0Um91dGUgPSBBcHAuUm91dGUuZXh0
ZW5kKHsKKyAgICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHRo
aXMucmVuZGVyKCk7IC8vIGFsbCBkZWZhdWx0cyBhcHBseQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIFRoZSBuYW1lIG9mIHRoZSBgUG9zdFJvdXRlYCwgZGVmaW5lZCBi
eSB0aGUgcm91dGVyLCBpcyBgcG9zdGAuCisgICAgICAgVGhlIGZvbGxvd2luZyBlcXVpdmFsZW50
IGRlZmF1bHQgb3B0aW9ucyB3aWxsIGJlIGFwcGxpZWQgd2hlbgorICAgICAgdGhlIFJvdXRlIGNh
bGxzIGByZW5kZXJgOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIC8vCisgICAgICB0aGlz
LnJlbmRlcigncG9zdCcsIHsgIC8vIHRoZSB0ZW1wbGF0ZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCAn
cG9zdCcgUm91dGUKKyAgICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJywgLy8gdGhlIHBhcmVudCBy
b3V0ZSB0byAncG9zdCcgUm91dGUKKyAgICAgICAgb3V0bGV0OiAnbWFpbicsICAgICAgLy8ge3tv
dXRsZXR9fSBhbmQge3tvdXRsZXQgJ21haW4nfX0gYXJlIHN5bm9ueW1vdXMsCisgICAgICAgIHZp
ZXc6ICdwb3N0JywgICAgICAgIC8vIHRoZSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3Bvc3Qn
IFJvdXRlCisgICAgICAgIGNvbnRyb2xsZXI6ICdwb3N0JywgIC8vIHRoZSBjb250cm9sbGVyIGFz
c29jaWF0ZWQgd2l0aCB0aGUgJ3Bvc3QnIFJvdXRlCisgICAgICB9KQorICAgICAgYGBgCisgICAg
ICAgQnkgZGVmYXVsdCB0aGUgY29udHJvbGxlcidzIGBtb2RlbGAgd2lsbCBiZSB0aGUgcm91dGUn
cyBtb2RlbCwgc28gaXQgZG9lcyBub3QKKyAgICAgIG5lZWQgdG8gYmUgcGFzc2VkIHVubGVzcyB5
b3Ugd2lzaCB0byBjaGFuZ2Ugd2hpY2ggbW9kZWwgaXMgYmVpbmcgdXNlZC4KKyAgICAgICBAbWV0
aG9kIHJlbmRlcgorICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRl
bXBsYXRlIHRvIHJlbmRlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSB0aGUgb3B0
aW9ucworICAgICAgQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmludG9dIHRoZSB0ZW1wbGF0ZSB0
byByZW5kZXIgaW50bywKKyAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IG5hbWUu
IERlZmF1bHRzIHRvIHRoZSBwYXJlbnQgdGVtcGxhdGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBb
b3B0aW9ucy5vdXRsZXRdIHRoZSBvdXRsZXQgaW5zaWRlIGBvcHRpb25zLnRlbXBsYXRlYCB0byBy
ZW5kZXIgaW50by4KKyAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAnbWFpbicKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuY29udHJvbGxlcl0gdGhlIGNvbnRy
b2xsZXIgdG8gdXNlIGZvciB0aGlzIHRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgIHJl
ZmVyZW5jZWQgYnkgbmFtZSBvciBhcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2UuIERlZmF1bHRzIHRv
IHRoZSBSb3V0ZSdzIHBhaXJlZCBjb250cm9sbGVyCisgICAgICBAcGFyYW0ge09iamVjdH0gW29w
dGlvbnMubW9kZWxdIHRoZSBtb2RlbCBvYmplY3QgdG8gc2V0IG9uIGBvcHRpb25zLmNvbnRyb2xs
ZXJgLgorICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUg
b2YgdGhlIFJvdXRlJ3MgbW9kZWwgaG9vaworICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVu
ZGVyOiBmdW5jdGlvbiAoX25hbWUsIG9wdGlvbnMpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcu
YXNzZXJ0KCdUaGUgbmFtZSBpbiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGlzIHVuZGVmaW5lZCcsIGFy
Z3VtZW50cy5sZW5ndGggPiAwID8gIV9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KGFyZ3VtZW50
c1swXSkgOiB0cnVlKTsKKworICAgICAgdmFyIG5hbWVQYXNzZWQgPSB0eXBlb2YgX25hbWUgPT09
ICdzdHJpbmcnICYmICEhX25hbWU7CisgICAgICB2YXIgaXNEZWZhdWx0UmVuZGVyID0gYXJndW1l
bnRzLmxlbmd0aCA9PT0gMCB8fCBfZW1iZXJNZXRhbElzX2VtcHR5LmRlZmF1bHQoYXJndW1lbnRz
WzBdKTsKKyAgICAgIHZhciBuYW1lOworCisgICAgICBpZiAodHlwZW9mIF9uYW1lID09PSAnb2Jq
ZWN0JyAmJiAhb3B0aW9ucykgeworICAgICAgICBuYW1lID0gdGhpcy5yb3V0ZU5hbWU7CisgICAg
ICAgIG9wdGlvbnMgPSBfbmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5hbWUgPSBfbmFt
ZTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlbmRlck9wdGlvbnMgPSBidWlsZFJlbmRlck9wdGlv
bnModGhpcywgbmFtZVBhc3NlZCwgaXNEZWZhdWx0UmVuZGVyLCBuYW1lLCBvcHRpb25zKTsKKyAg
ICAgIHRoaXMuY29ubmVjdGlvbnMucHVzaChyZW5kZXJPcHRpb25zKTsKKyAgICAgIF9lbWJlck1l
dGFsUnVuX2xvb3AuZGVmYXVsdC5vbmNlKHRoaXMucm91dGVyLCAnX3NldE91dGxldHMnKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBEaXNjb25uZWN0cyBhIHZpZXcgdGhhdCBoYXMgYmVlbiBy
ZW5kZXJlZCBpbnRvIGFuIG91dGxldC4KKyAgICAgICBZb3UgbWF5IHBhc3MgYW55IG9yIGFsbCBv
ZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gYGRpc2Nvbm5lY3RPdXRsZXRgOgorICAgICAgICog
YG91dGxldGA6IHRoZSBuYW1lIG9mIHRoZSBvdXRsZXQgdG8gY2xlYXIgKGRlZmF1bHQ6ICdtYWlu
JykKKyAgICAgICogYHBhcmVudFZpZXdgOiB0aGUgbmFtZSBvZiB0aGUgdmlldyBjb250YWluaW5n
IHRoZSBvdXRsZXQgdG8gY2xlYXIKKyAgICAgICAgIChkZWZhdWx0OiB0aGUgdmlldyByZW5kZXJl
ZCBieSB0aGUgcGFyZW50IHJvdXRlKQorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBBcHAuUm91dGUuZXh0ZW5kKHsKKyAg
ICAgICAgYWN0aW9uczogeworICAgICAgICAgIHNob3dNb2RhbDogZnVuY3Rpb24oZXZ0KSB7Cisg
ICAgICAgICAgICB0aGlzLnJlbmRlcihldnQubW9kYWxOYW1lLCB7CisgICAgICAgICAgICAgIG91
dGxldDogJ21vZGFsJywKKyAgICAgICAgICAgICAgaW50bzogJ2FwcGxpY2F0aW9uJworICAgICAg
ICAgICAgfSk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBoaWRlTW9kYWw6IGZ1bmN0aW9uKGV2
dCkgeworICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0T3V0bGV0KHsKKyAgICAgICAgICAgICAg
b3V0bGV0OiAnbW9kYWwnLAorICAgICAgICAgICAgICBwYXJlbnRWaWV3OiAnYXBwbGljYXRpb24n
CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgYGBgCisgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwYXNzIHRoZSBgb3V0bGV0YCBu
YW1lIGRpcmVjdGx5IGFzIGEgc3RyaW5nLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgaGlkZU1vZGFsOiBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgdGhpcy5k
aXNjb25uZWN0T3V0bGV0KCdtb2RhbCcpOworICAgICAgfQorICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBkaXNjb25uZWN0T3V0bGV0CisgICAgICBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlv
bnMgdGhlIG9wdGlvbnMgaGFzaCBvciBvdXRsZXQgbmFtZQorICAgICAgQHB1YmxpYworICAgICov
CisgICAgZGlzY29ubmVjdE91dGxldDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKKyAgICAgIHZhciBv
dXRsZXROYW1lOworICAgICAgdmFyIHBhcmVudFZpZXc7CisgICAgICBpZiAoIW9wdGlvbnMgfHwg
dHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIG91dGxldE5hbWUgPSBvcHRp
b25zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0bGV0TmFtZSA9IG9wdGlvbnMub3V0bGV0
OworICAgICAgICBwYXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRWaWV3OworCisgICAgICAgIGlm
IChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmluZGV4T2YoJ291dGxldCcpICE9PSAt
MSAmJiB0eXBlb2Ygb3B0aW9ucy5vdXRsZXQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAg
dGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91IHBhc3NlZCB1bmRlZmluZWQg
YXMgdGhlIG91dGxldCBuYW1lLicpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwYXJlbnRW
aWV3ID0gcGFyZW50VmlldyAmJiBwYXJlbnRWaWV3LnJlcGxhY2UoL1wvL2csICcuJyk7CisgICAg
ICBvdXRsZXROYW1lID0gb3V0bGV0TmFtZSB8fCAnbWFpbic7CisgICAgICB0aGlzLl9kaXNjb25u
ZWN0T3V0bGV0KG91dGxldE5hbWUsIHBhcmVudFZpZXcpOworICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCB0aGlzLnJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcy5sZW5ndGg7IGkrKykg
eworICAgICAgICAvLyBUaGlzIG5vbi1sb2NhbCBzdGF0ZSBtdW5naW5nIGlzIHNhZGx5IG5lY2Vz
c2FyeSB0byBtYWludGFpbgorICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgg
b3VyIGV4aXN0aW5nIHNlbWFudGljcywgd2hpY2ggYWxsb3cKKyAgICAgICAgLy8gYW55IHJvdXRl
IHRvIGRpc2Nvbm5lY3RPdXRsZXQgdGhpbmdzIG9yaWdpbmFsbHkgcmVuZGVyZWQgYnkgYW55Cisg
ICAgICAgIC8vIG90aGVyIHJvdXRlLiBUaGlzIHNob3VsZCBhbGwgZ2V0IGN1dCBpbiAyLjAuCisg
ICAgICAgIHRoaXMucm91dGVyLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zW2ldLmhhbmRsZXIu
X2Rpc2Nvbm5lY3RPdXRsZXQob3V0bGV0TmFtZSwgcGFyZW50Vmlldyk7CisgICAgICB9CisgICAg
fSwKKworICAgIF9kaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbiAob3V0bGV0TmFtZSwgcGFyZW50
VmlldykgeworICAgICAgdmFyIHBhcmVudCA9IHBhcmVudFJvdXRlKHRoaXMpOworICAgICAgaWYg
KHBhcmVudCAmJiBwYXJlbnRWaWV3ID09PSBwYXJlbnQucm91dGVOYW1lKSB7CisgICAgICAgIHBh
cmVudFZpZXcgPSB1bmRlZmluZWQ7CisgICAgICB9CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNvbm5lY3Rpb24g
PSB0aGlzLmNvbm5lY3Rpb25zW2ldOworICAgICAgICBpZiAoY29ubmVjdGlvbi5vdXRsZXQgPT09
IG91dGxldE5hbWUgJiYgY29ubmVjdGlvbi5pbnRvID09PSBwYXJlbnRWaWV3KSB7CisgICAgICAg
ICAgLy8gVGhpcyBuZXV0ZXJzIHRoZSBkaXNjb25uZWN0ZWQgb3V0bGV0IHN1Y2ggdGhhdCBpdCBk
b2Vzbid0CisgICAgICAgICAgLy8gcmVuZGVyIGFueXRoaW5nLCBidXQgaXQgbGVhdmVzIGFuIGVu
dHJ5IGluIHRoZSBvdXRsZXQKKyAgICAgICAgICAvLyBoaWVyYXJjaHkgc28gdGhhdCBhbnkgZXhp
c3Rpbmcgb3RoZXIgcmVuZGVycyB0aGF0IHRhcmdldCBpdAorICAgICAgICAgIC8vIGRvbid0IHN1
ZGRlbmx5IGJsb3cgdXAuIFRoZXkgd2lsbCBzdGlsbCBzdGljayB0aGVtc2VsdmVzCisgICAgICAg
ICAgLy8gaW50byBpdHMgb3V0bGV0cywgd2hpY2ggd29uJ3QgcmVuZGVyIGFueXdoZXJlLiBBbGwg
b2YgdGhpcworICAgICAgICAgIC8vIHN0YXRlZnVsbmVzcyBzaG91bGQgZ2V0IHRoZSBtYWNoZXRl
IGluIDIuMC4KKyAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25zW2ldID0geworICAgICAgICAgICAg
b3duZXI6IGNvbm5lY3Rpb24ub3duZXIsCisgICAgICAgICAgICBpbnRvOiBjb25uZWN0aW9uLmlu
dG8sCisgICAgICAgICAgICBvdXRsZXQ6IGNvbm5lY3Rpb24ub3V0bGV0LAorICAgICAgICAgICAg
bmFtZTogY29ubmVjdGlvbi5uYW1lLAorICAgICAgICAgICAgY29udHJvbGxlcjogdW5kZWZpbmVk
LAorICAgICAgICAgICAgdGVtcGxhdGU6IHVuZGVmaW5lZCwKKyAgICAgICAgICAgIFZpZXdDbGFz
czogdW5kZWZpbmVkCisgICAgICAgICAgfTsKKyAgICAgICAgICBfZW1iZXJNZXRhbFJ1bl9sb29w
LmRlZmF1bHQub25jZSh0aGlzLnJvdXRlciwgJ19zZXRPdXRsZXRzJyk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICB9LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRo
aXMudGVhcmRvd25WaWV3cygpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisg
ICAgICAgQG1ldGhvZCB0ZWFyZG93blZpZXdzCisgICAgKi8KKyAgICB0ZWFyZG93blZpZXdzOiBm
dW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5jb25uZWN0aW9ucyAmJiB0aGlzLmNvbm5lY3Rp
b25zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdOworICAgICAg
ICBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLnJvdXRlciwgJ19zZXRPdXRs
ZXRzJyk7CisgICAgICB9CisgICAgfQorICB9KTsKKworICBfZW1iZXJSdW50aW1lTWl4aW5zQWN0
aW9uX2hhbmRsZXIuZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMoUm91dGUpOworCisgIFJvdXRl
LnJlb3BlbkNsYXNzKHsKKyAgICBpc1JvdXRlRmFjdG9yeTogdHJ1ZQorICB9KTsKKworICBmdW5j
dGlvbiBwYXJlbnRSb3V0ZShyb3V0ZSkgeworICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJ
bmZvRm9yKHJvdXRlLCByb3V0ZS5yb3V0ZXIucm91dGVyLnN0YXRlLmhhbmRsZXJJbmZvcywgLTEp
OworICAgIHJldHVybiBoYW5kbGVySW5mbyAmJiBoYW5kbGVySW5mby5oYW5kbGVyOworICB9CisK
KyAgZnVuY3Rpb24gaGFuZGxlckluZm9Gb3Iocm91dGUsIGhhbmRsZXJJbmZvcywgX29mZnNldCkg
eworICAgIGlmICghaGFuZGxlckluZm9zKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAg
dmFyIG9mZnNldCA9IF9vZmZzZXQgfHwgMDsKKyAgICB2YXIgY3VycmVudDsKKyAgICBmb3IgKHZh
ciBpID0gMCwgbCA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGN1
cnJlbnQgPSBoYW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKKyAgICAgIGlmIChjdXJyZW50ID09PSBy
b3V0ZSkgeworICAgICAgICByZXR1cm4gaGFuZGxlckluZm9zW2kgKyBvZmZzZXRdOworICAgICAg
fQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkUmVuZGVyT3B0aW9ucyhyb3V0ZSwgbmFt
ZVBhc3NlZCwgaXNEZWZhdWx0UmVuZGVyLCBuYW1lLCBvcHRpb25zKSB7CisgICAgdmFyIGNvbnRy
b2xsZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udHJvbGxlcjsKKyAgICB2YXIgdGVtcGxhdGVO
YW1lOworICAgIHZhciB2aWV3TmFtZTsKKyAgICB2YXIgVmlld0NsYXNzOworICAgIHZhciB0ZW1w
bGF0ZTsKKyAgICB2YXIgTE9HX1ZJRVdfTE9PS1VQUyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldChyb3V0ZS5yb3V0ZXIsICduYW1lc3BhY2UuTE9HX1ZJRVdfTE9PS1VQUycpOworICAgIHZh
ciBpbnRvID0gb3B0aW9ucyAmJiBvcHRpb25zLmludG8gJiYgb3B0aW9ucy5pbnRvLnJlcGxhY2Uo
L1wvL2csICcuJyk7CisgICAgdmFyIG91dGxldCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5vdXRsZXQg
fHwgJ21haW4nOworICAgIHZhciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcihyb3V0
ZSk7CisKKyAgICBpZiAobmFtZSkgeworICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXC8vZywg
Jy4nKTsKKyAgICAgIHRlbXBsYXRlTmFtZSA9IG5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5h
bWUgPSByb3V0ZS5yb3V0ZU5hbWU7CisgICAgICB0ZW1wbGF0ZU5hbWUgPSByb3V0ZS50ZW1wbGF0
ZU5hbWUgfHwgbmFtZTsKKyAgICB9CisKKyAgICBpZiAoIWNvbnRyb2xsZXIpIHsKKyAgICAgIGlm
IChuYW1lUGFzc2VkKSB7CisgICAgICAgIGNvbnRyb2xsZXIgPSBvd25lci5sb29rdXAoJ2NvbnRy
b2xsZXI6JyArIG5hbWUpIHx8IHJvdXRlLmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJvdXRlTmFt
ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRyb2xsZXIgPSByb3V0ZS5jb250cm9sbGVy
TmFtZSB8fCBvd25lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpOworICAgICAgfQorICAg
IH0KKworICAgIGlmICh0eXBlb2YgY29udHJvbGxlciA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHZh
ciBjb250cm9sbGVyTmFtZSA9IGNvbnRyb2xsZXI7CisgICAgICBjb250cm9sbGVyID0gb3duZXIu
bG9va3VwKCdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZSk7CisgICAgICBpZiAoIWNvbnRy
b2xsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91
IHBhc3NlZCBgY29udHJvbGxlcjogXCcnICsgY29udHJvbGxlck5hbWUgKyAnXCdgIGludG8gdGhl
IGByZW5kZXJgIG1ldGhvZCwgYnV0IG5vIHN1Y2ggY29udHJvbGxlciBjb3VsZCBiZSBmb3VuZC4n
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRp
b25zKS5pbmRleE9mKCdvdXRsZXQnKSAhPT0gLTEgJiYgdHlwZW9mIG9wdGlvbnMub3V0bGV0ID09
PSAndW5kZWZpbmVkJykgeworICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnWW91IHBhc3NlZCB1bmRlZmluZWQgYXMgdGhlIG91dGxldCBuYW1lLicpOworICAgIH0KKwor
ICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubW9kZWwpIHsKKyAgICAgIGNvbnRyb2xsZXIuc2V0
KCdtb2RlbCcsIG9wdGlvbnMubW9kZWwpOworICAgIH0KKworICAgIHZpZXdOYW1lID0gb3B0aW9u
cyAmJiBvcHRpb25zLnZpZXcgfHwgbmFtZVBhc3NlZCAmJiBuYW1lIHx8IHJvdXRlLnZpZXdOYW1l
IHx8IG5hbWU7CisgICAgVmlld0NsYXNzID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoJ3ZpZXc6JyAr
IHZpZXdOYW1lKTsKKyAgICB0ZW1wbGF0ZSA9IG93bmVyLmxvb2t1cCgndGVtcGxhdGU6JyArIHRl
bXBsYXRlTmFtZSk7CisKKyAgICB2YXIgcGFyZW50OworICAgIGlmIChpbnRvICYmIChwYXJlbnQg
PSBwYXJlbnRSb3V0ZShyb3V0ZSkpICYmIGludG8gPT09IHBhcmVudFJvdXRlKHJvdXRlKS5yb3V0
ZU5hbWUpIHsKKyAgICAgIGludG8gPSB1bmRlZmluZWQ7CisgICAgfQorCisgICAgdmFyIHJlbmRl
ck9wdGlvbnMgPSB7CisgICAgICBvd25lcjogb3duZXIsCisgICAgICBpbnRvOiBpbnRvLAorICAg
ICAgb3V0bGV0OiBvdXRsZXQsCisgICAgICBuYW1lOiBuYW1lLAorICAgICAgY29udHJvbGxlcjog
Y29udHJvbGxlciwKKyAgICAgIFZpZXdDbGFzczogVmlld0NsYXNzLAorICAgICAgdGVtcGxhdGU6
IHRlbXBsYXRlIHx8IHJvdXRlLl90b3BMZXZlbFZpZXdUZW1wbGF0ZQorICAgIH07CisKKyAgICB2
YXIgQ29tcG9uZW50ID0gdW5kZWZpbmVkOworCisgICAgaWYgKCFWaWV3Q2xhc3MgJiYgIXRlbXBs
YXRlICYmICFDb21wb25lbnQpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDb3Vs
ZCBub3QgZmluZCAiJyArIG5hbWUgKyAnIiB0ZW1wbGF0ZSwgdmlldywgb3IgY29tcG9uZW50Lics
IGlzRGVmYXVsdFJlbmRlcik7CisgICAgICBpZiAoTE9HX1ZJRVdfTE9PS1VQUykgeworICAgICAg
ICB2YXIgZnVsbE5hbWUgPSAndGVtcGxhdGU6JyArIG5hbWU7CisgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuaW5mbygnQ291bGQgbm90IGZpbmQgIicgKyBuYW1lICsgJyIgdGVtcGxhdGUgb3Igdmll
dy4gTm90aGluZyB3aWxsIGJlIHJlbmRlcmVkJywgeyBmdWxsTmFtZTogZnVsbE5hbWUgfSk7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlck9wdGlvbnM7CisgIH0KKworICBmdW5j
dGlvbiBnZXRGdWxsUXVlcnlQYXJhbXMocm91dGVyLCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5m
dWxsUXVlcnlQYXJhbXMpIHsKKyAgICAgIHJldHVybiBzdGF0ZS5mdWxsUXVlcnlQYXJhbXM7Cisg
ICAgfQorCisgICAgc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zID0ge307CisgICAgX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdChzdGF0ZS5mdWxsUXVlcnlQYXJhbXMsIHN0YXRlLnF1ZXJ5UGFyYW1zKTsK
KworICAgIHZhciB0YXJnZXRSb3V0ZU5hbWUgPSBzdGF0ZS5oYW5kbGVySW5mb3Nbc3RhdGUuaGFu
ZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWU7CisgICAgcm91dGVyLl9kZXNlcmlhbGl6ZVF1ZXJ5
UGFyYW1zKHRhcmdldFJvdXRlTmFtZSwgc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zKTsKKyAgICByZXR1
cm4gc3RhdGUuZnVsbFF1ZXJ5UGFyYW1zOworICB9CisKKyAgZnVuY3Rpb24gZ2V0UXVlcnlQYXJh
bXNGb3Iocm91dGUsIHN0YXRlKSB7CisgICAgc3RhdGUucXVlcnlQYXJhbXNGb3IgPSBzdGF0ZS5x
dWVyeVBhcmFtc0ZvciB8fCB7fTsKKyAgICB2YXIgbmFtZSA9IHJvdXRlLnJvdXRlTmFtZTsKKwor
ICAgIGlmIChzdGF0ZS5xdWVyeVBhcmFtc0ZvcltuYW1lXSkgeworICAgICAgcmV0dXJuIHN0YXRl
LnF1ZXJ5UGFyYW1zRm9yW25hbWVdOworICAgIH0KKworICAgIHZhciBmdWxsUXVlcnlQYXJhbXMg
PSBnZXRGdWxsUXVlcnlQYXJhbXMocm91dGUucm91dGVyLCBzdGF0ZSk7CisKKyAgICB2YXIgcGFy
YW1zID0gc3RhdGUucXVlcnlQYXJhbXNGb3JbbmFtZV0gPSB7fTsKKworICAgIC8vIENvcHkgb3Zl
ciBhbGwgdGhlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhpcyByb3V0ZS9jb250cm9sbGVyIGludG8gcGFy
YW1zIGhhc2guCisgICAgdmFyIHFwTWV0YSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChy
b3V0ZSwgJ19xcCcpOworICAgIHZhciBxcHMgPSBxcE1ldGEucXBzOworICAgIGZvciAodmFyIGkg
PSAwLCBsZW4gPSBxcHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgIC8vIFB1dCBkZXNl
cmlhbGl6ZWQgcXAgb24gcGFyYW1zIGhhc2guCisgICAgICB2YXIgcXAgPSBxcHNbaV07CisKKyAg
ICAgIHZhciBxcFZhbHVlV2FzUGFzc2VkSW4gPSAocXAucHJvcCBpbiBmdWxsUXVlcnlQYXJhbXMp
OworICAgICAgcGFyYW1zW3FwLnByb3BdID0gcXBWYWx1ZVdhc1Bhc3NlZEluID8gZnVsbFF1ZXJ5
UGFyYW1zW3FwLnByb3BdIDogY29weURlZmF1bHRWYWx1ZShxcC5kZWZhdWx0VmFsdWUpOworICAg
IH0KKworICAgIHJldHVybiBwYXJhbXM7CisgIH0KKworICBmdW5jdGlvbiBjb3B5RGVmYXVsdFZh
bHVlKHZhbHVlKSB7CisgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHZhbHVlLnNsaWNlKCkpOworICAg
IH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvKgorICAgIE1lcmdlcyBhbGwgcXVlcnkg
cGFyYW1ldGVycyBmcm9tIGEgY29udHJvbGxlciB3aXRoIHRob3NlIGZyb20KKyAgICBhIHJvdXRl
LCByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IGFuZCBhdm9pZGluZyBhbnkgbXV0YXRpb25zIHRvCisg
ICAgdGhlIGV4aXN0aW5nIG9iamVjdHMuCisgICovCisgIGZ1bmN0aW9uIG1lcmdlRWFjaFF1ZXJ5
UGFyYW1zKGNvbnRyb2xsZXJRUCwgcm91dGVRUCkgeworICAgIHZhciBrZXlzQWxyZWFkeU1lcmdl
ZE9yU2tpcHBhYmxlOworICAgIHZhciBxcHMgPSB7fTsKKworICAgIGtleXNBbHJlYWR5TWVyZ2Vk
T3JTa2lwcGFibGUgPSB7CisgICAgICBkZWZhdWx0VmFsdWU6IHRydWUsCisgICAgICB0eXBlOiB0
cnVlLAorICAgICAgc2NvcGU6IHRydWUsCisgICAgICBhczogdHJ1ZQorICAgIH07CisKKyAgICAv
LyBmaXJzdCBsb29wIG92ZXIgYWxsIGNvbnRyb2xsZXIgcXBzLCBtZXJnaW5nIHRoZW0gd2l0aCBh
bnkgbWF0Y2hpbmcgcm91dGUgcXBzCisgICAgLy8gaW50byBhIG5ldyBlbXB0eSBvYmplY3QgdG8g
YXZvaWQgbXV0YXRpbmcuCisgICAgZm9yICh2YXIgY3FwTmFtZSBpbiBjb250cm9sbGVyUVApIHsK
KyAgICAgIGlmICghY29udHJvbGxlclFQLmhhc093blByb3BlcnR5KGNxcE5hbWUpKSB7CisgICAg
ICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2YXIgbmV3Q29udHJvbGxlclBhcmFtZXRl
ckNvbmZpZ3VyYXRpb24gPSB7fTsKKyAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQobmV3
Q29udHJvbGxlclBhcmFtZXRlckNvbmZpZ3VyYXRpb24sIGNvbnRyb2xsZXJRUFtjcXBOYW1lXSk7
CisgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KG5ld0NvbnRyb2xsZXJQYXJhbWV0ZXJD
b25maWd1cmF0aW9uLCByb3V0ZVFQW2NxcE5hbWVdKTsKKworICAgICAgcXBzW2NxcE5hbWVdID0g
bmV3Q29udHJvbGxlclBhcmFtZXRlckNvbmZpZ3VyYXRpb247CisKKyAgICAgIC8vIGFsbG93cyB1
cyB0byBza2lwIHRoaXMgUVAgd2hlbiB3ZSBjaGVjayByb3V0ZSBRUHMuCisgICAgICBrZXlzQWxy
ZWFkeU1lcmdlZE9yU2tpcHBhYmxlW2NxcE5hbWVdID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBs
b29wIG92ZXIgYWxsIHJvdXRlIHFwcywgc2tpcHBpbmcgdGhvc2UgdGhhdCB3ZXJlIG1lcmdlZCBp
biB0aGUgZmlyc3QgcGFzcworICAgIC8vIGJlY2F1c2UgdGhleSBhbHNvIGFwcGVhciBpbiBjb250
cm9sbGVyIHFwcworICAgIGZvciAodmFyIHJxcE5hbWUgaW4gcm91dGVRUCkgeworICAgICAgaWYg
KCFyb3V0ZVFQLmhhc093blByb3BlcnR5KHJxcE5hbWUpIHx8IGtleXNBbHJlYWR5TWVyZ2VkT3JT
a2lwcGFibGVbcnFwTmFtZV0pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAg
IHZhciBuZXdSb3V0ZVBhcmFtZXRlckNvbmZpZ3VyYXRpb24gPSB7fTsKKyAgICAgIF9lbWJlck1l
dGFsQXNzaWduLmRlZmF1bHQobmV3Um91dGVQYXJhbWV0ZXJDb25maWd1cmF0aW9uLCByb3V0ZVFQ
W3JxcE5hbWVdLCBjb250cm9sbGVyUVBbcnFwTmFtZV0pOworICAgICAgcXBzW3JxcE5hbWVdID0g
bmV3Um91dGVQYXJhbWV0ZXJDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBxcHM7
CisgIH0KKworICBmdW5jdGlvbiBhZGRRdWVyeVBhcmFtc09ic2VydmVycyhjb250cm9sbGVyLCBw
cm9wTmFtZXMpIHsKKyAgICBwcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeworICAg
ICAgY29udHJvbGxlci5hZGRPYnNlcnZlcihwcm9wICsgJy5bXScsIGNvbnRyb2xsZXIsIGNvbnRy
b2xsZXIuX3FwQ2hhbmdlZCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZXByZWNhdGVR
dWVyeVBhcmFtRGVmYXVsdFZhbHVlc1NldE9uQ29udHJvbGxlcihjb250cm9sbGVyTmFtZSwgcm91
dGVOYW1lLCBwcm9wTmFtZSkgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdDb25m
aWd1cmluZyBxdWVyeSBwYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZXMgb24gY29udHJvbGxlcnMgaXMg
ZGVwcmVjYXRlZC4gUGxlYXNlIG1vdmUgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgXCcnICsg
cHJvcE5hbWUgKyAnXCcgZnJvbSB0aGUgXCcnICsgY29udHJvbGxlck5hbWUgKyAnXCcgY29udHJv
bGxlciB0byB0aGUgXCcnICsgcm91dGVOYW1lICsgJ1wnIHJvdXRlIGluIHRoZSBmb3JtYXQ6IHtx
dWVyeVBhcmFtczogJyArIHByb3BOYW1lICsgJzoge2RlZmF1bHRWYWx1ZTogPGRlZmF1bHQgdmFs
dWU+IH19JywgZmFsc2UsIHsgaWQ6ICdlbWJlci1yb3V0aW5nLmRlcHJlY2F0ZS1xdWVyeS1wYXJh
bS1kZWZhdWx0LXZhbHVlcy1zZXQtb24tY29udHJvbGxlcicsIHVudGlsOiAnMy4wLjAnIH0pOwor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUm91dGU7Cit9KTsKKy8vIEZFQVRVUkVTLCBBLCBk
ZXByZWNhdGUsIGFzc2VydCwgTG9nZ2VyCisKKy8vIGFwcGx5IGRlZmF1bHQgdmFsdWVzIHRvIGNv
bnRyb2xsZXJzCisvLyBkZXRlY3QgdGhhdCBkZWZhdWx0IHZhbHVlIGRlZmluZWQgb24gcm91dGVy
IGNvbmZpZworCisvLyBkZXRlY3QgdGhhdCBwcm9wZXJ0eSB3YXMgbm90IGRlZmluZWQgb24gY29u
dHJvbGxlcgorZW5pZmVkKCdlbWJlci1yb3V0aW5nL3N5c3RlbS9yb3V0ZXInLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFs
L2Vycm9yJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9zZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmpl
Y3QnLCAnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVy
LW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1y
dW50aW1lL21peGlucy9ldmVudGVkJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL2RzbCcsICdlbWJl
ci1yb3V0aW5nL2xvY2F0aW9uL2FwaScsICdlbWJlci1yb3V0aW5nL3V0aWxzJywgJ2VtYmVyLW1l
dGFsL3V0aWxzJywgJ2VtYmVyLXJvdXRpbmcvc3lzdGVtL3JvdXRlcl9zdGF0ZScsICdjb250YWlu
ZXIvb3duZXInLCAnZW1iZXItbWV0YWwvZGljdGlvbmFyeScsICdyb3V0ZXInLCAncm91dGVyL3Ry
YW5zaXRpb24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTG9nZ2VyLCBfZW1iZXJN
ZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxF
bXB0eV9vYmplY3QsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsQXNzaWduLCBfZW1i
ZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LCBfZW1iZXJSdW50aW1l
TWl4aW5zRXZlbnRlZCwgX2VtYmVyUm91dGluZ1N5c3RlbURzbCwgX2VtYmVyUm91dGluZ0xvY2F0
aW9uQXBpLCBfZW1iZXJSb3V0aW5nVXRpbHMsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlclJvdXRp
bmdTeXN0ZW1Sb3V0ZXJfc3RhdGUsIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxEaWN0aW9u
YXJ5LCBfcm91dGVyNCwgX3JvdXRlclRyYW5zaXRpb24pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMudHJpZ2dlckV2ZW50ID0gdHJpZ2dlckV2ZW50OworCisgIGZ1bmN0aW9uIEsoKSB7
CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICB2YXIgc2xpY2UgPSBbXS5zbGljZTsKKworICAv
KioKKyAgICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0aGUgYXBwbGljYXRpb24g
c3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCisgICAgdGhlIFtyb3V0aW5nIGd1aWRlXShodHRwOi8v
ZW1iZXJqcy5jb20vZ3VpZGVzL3JvdXRpbmcvKSBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgCisgICAg
QGNsYXNzIFJvdXRlcgorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5P
YmplY3QKKyAgICBAdXNlcyBFbWJlci5FdmVudGVkCisgICAgQHB1YmxpYworICAqLworICB2YXIg
RW1iZXJSb3V0ZXIgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKF9l
bWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLmRlZmF1bHQsIHsKKyAgICAvKioKKyAgICAgIFRoZSBg
bG9jYXRpb25gIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHR5cGUgb2YgVVJMJ3MgdGhhdCB5b3Vy
CisgICAgICBhcHBsaWNhdGlvbiB3aWxsIHVzZS4KKyAgICAgICBUaGUgZm9sbG93aW5nIGxvY2F0
aW9uIHR5cGVzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlOgorICAgICAgICogYGhpc3RvcnlgIC0g
dXNlIHRoZSBicm93c2VyJ3MgaGlzdG9yeSBBUEkgdG8gbWFrZSB0aGUgVVJMcyBsb29rIGp1c3Qg
bGlrZSBhbnkgc3RhbmRhcmQgVVJMCisgICAgICAqIGBoYXNoYCAtIHVzZSBgI2AgdG8gc2VwYXJh
dGUgdGhlIHNlcnZlciBwYXJ0IG9mIHRoZSBVUkwgZnJvbSB0aGUgRW1iZXIgcGFydDogYC9ibG9n
LyMvcG9zdHMvbmV3YAorICAgICAgKiBgbm9uZWAgLSBkbyBub3Qgc3RvcmUgdGhlIEVtYmVyIFVS
TCBpbiB0aGUgYWN0dWFsIGJyb3dzZXIgVVJMIChtYWlubHkgdXNlZCBmb3IgdGVzdGluZykKKyAg
ICAgICogYGF1dG9gIC0gdXNlIHRoZSBiZXN0IG9wdGlvbiBiYXNlZCBvbiBicm93c2VyIGNhcGFi
aWxpdGVzOiBgaGlzdG9yeWAgaWYgcG9zc2libGUsIHRoZW4gYGhhc2hgIGlmIHBvc3NpYmxlLCBv
dGhlcndpc2UgYG5vbmVgCisgICAgICAgTm90ZTogSWYgdXNpbmcgZW1iZXItY2xpLCB0aGlzIHZh
bHVlIGlzIGRlZmF1bHRlZCB0byBgYXV0b2AgYnkgdGhlIGBsb2NhdGlvblR5cGVgIHNldHRpbmcg
b2YgYC9jb25maWcvZW52aXJvbm1lbnQuanNgCisgICAgICAgQHByb3BlcnR5IGxvY2F0aW9uCisg
ICAgICBAZGVmYXVsdCAnaGFzaCcKKyAgICAgIEBzZWUge0VtYmVyLkxvY2F0aW9ufQorICAgICAg
QHB1YmxpYworICAgICovCisgICAgbG9jYXRpb246ICdoYXNoJywKKworICAgIC8qKgorICAgICBS
ZXByZXNlbnRzIHRoZSBVUkwgb2YgdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uLCBvZnRlbiAn
LycuIFRoaXMgcHJlZml4IGlzCisgICAgIGFzc3VtZWQgb24gYWxsIHJvdXRlcyBkZWZpbmVkIG9u
IHRoaXMgcm91dGVyLgorICAgICAgQHByb3BlcnR5IHJvb3RVUkwKKyAgICAgQGRlZmF1bHQgJy8n
CisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJvb3RVUkw6ICcvJywKKworICAgIF9pbml0Um91
dGVySnM6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlciA9IG5l
dyBfcm91dGVyNC5kZWZhdWx0KCk7CisgICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0gdHJpZ2dl
ckV2ZW50OworCisgICAgICByb3V0ZXIuX3RyaWdnZXJXaWxsQ2hhbmdlQ29udGV4dCA9IEs7Cisg
ICAgICByb3V0ZXIuX3RyaWdnZXJXaWxsTGVhdmUgPSBLOworCisgICAgICB2YXIgZHNsQ2FsbGJh
Y2tzID0gdGhpcy5jb25zdHJ1Y3Rvci5kc2xDYWxsYmFja3MgfHwgW0tdOworICAgICAgdmFyIGRz
bCA9IHRoaXMuX2J1aWxkRFNMKCk7CisKKyAgICAgIGRzbC5yb3V0ZSgnYXBwbGljYXRpb24nLCB7
IHBhdGg6ICcvJywgcmVzZXROYW1lc3BhY2U6IHRydWUsIG92ZXJyaWRlTmFtZUFzc2VydGlvbjog
dHJ1ZSB9LCBmdW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHNsQ2Fs
bGJhY2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgZHNsQ2FsbGJhY2tzW2ldLmNhbGwodGhp
cyk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICduYW1lc3BhY2UuTE9HX1RSQU5TSVRJT05TX0lOVEVSTkFMJykpIHsK
KyAgICAgICAgcm91dGVyLmxvZyA9IF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQuZGVidWc7Cisg
ICAgICB9CisKKyAgICAgIHJvdXRlci5tYXAoZHNsLmdlbmVyYXRlKCkpOworICAgIH0sCisKKyAg
ICBfYnVpbGREU0w6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBtb2R1bGVCYXNlZFJlc29sdmVy
ID0gdGhpcy5faGFzTW9kdWxlQmFzZWRSZXNvbHZlcigpOworCisgICAgICByZXR1cm4gbmV3IF9l
bWJlclJvdXRpbmdTeXN0ZW1Ec2wuZGVmYXVsdChudWxsLCB7CisgICAgICAgIGVuYWJsZUxvYWRp
bmdTdWJzdGF0ZXM6ICEhbW9kdWxlQmFzZWRSZXNvbHZlcgorICAgICAgfSk7CisgICAgfSwKKwor
ICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CisKKyAgICAgIHRoaXMuX2FjdGl2ZVZpZXdzID0ge307CisgICAgICB0aGlzLl9x
cENhY2hlID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHRo
aXMuX3Jlc2V0UXVldWVkUXVlcnlQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICB0aGlzLl9oYW5k
bGVkRXJyb3JzID0gX2VtYmVyTWV0YWxEaWN0aW9uYXJ5LmRlZmF1bHQobnVsbCk7CisgICAgfSwK
KworICAgIC8qCisgICAgICBSZXNldHMgYWxsIHBlbmRpbmcgcXVlcnkgcGFyYW10ZXIgY2hhbmdl
cy4KKyAgICAgIENhbGxlZCBhZnRlciB0cmFuc2l0aW9uaW5nIHRvIGEgbmV3IHJvdXRlCisgICAg
ICBiYXNlZCBvbiBxdWVyeSBwYXJhbWV0ZXIgY2hhbmdlcy4KKyAgICAqLworICAgIF9yZXNldFF1
ZXVlZFF1ZXJ5UGFyYW1ldGVyQ2hhbmdlczogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fcXVl
dWVkUVBDaGFuZ2VzID0ge307CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVwcmVzZW50cyB0
aGUgY3VycmVudCBVUkwuCisgICAgICAgQG1ldGhvZCB1cmwKKyAgICAgIEByZXR1cm4ge1N0cmlu
Z30gVGhlIGN1cnJlbnQgVVJMLgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHVybDogX2Vt
YmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsb2NhdGlvbicpLmdldFVSTCgpOworICAg
IH0pLAorCisgICAgX2hhc01vZHVsZUJhc2VkUmVzb2x2ZXI6IGZ1bmN0aW9uICgpIHsKKyAgICAg
IHZhciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKworICAgICAgaWYg
KCFvd25lcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciBy
ZXNvbHZlciA9IG93bmVyLmFwcGxpY2F0aW9uICYmIG93bmVyLmFwcGxpY2F0aW9uLl9fcmVnaXN0
cnlfXyAmJiBvd25lci5hcHBsaWNhdGlvbi5fX3JlZ2lzdHJ5X18ucmVzb2x2ZXI7CisKKyAgICAg
IGlmICghcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAg
ICByZXR1cm4gISFyZXNvbHZlci5tb2R1bGVCYXNlZFJlc29sdmVyOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIEluaXRpYWxpemVzIHRoZSBjdXJyZW50IHJvdXRlciBpbnN0YW5jZSBhbmQgc2V0
cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCisgICAgICBldmVudCBsaXN0ZW5lcnMgdXNlZCBieSB0
aGUgaW5zdGFuY2VzIGBsb2NhdGlvbmAgaW1wbGVtZW50YXRpb24uCisgICAgICAgQSBwcm9wZXJ0
eSBuYW1lZCBgaW5pdGlhbFVSTGAgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlh
bCBVUkwuCisgICAgICBJZiBubyB2YWx1ZSBpcyBmb3VuZCBgL2Agd2lsbCBiZSB1c2VkLgorICAg
ICAgIEBtZXRob2Qgc3RhcnRSb3V0aW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgc3Rh
cnRSb3V0aW5nOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaW5pdGlhbFVSTCA9IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaW5pdGlhbFVSTCcpOworCisgICAgICBpZiAodGhp
cy5zZXR1cFJvdXRlcigpKSB7CisgICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFVSTCA9PT0gJ3Vu
ZGVmaW5lZCcpIHsKKyAgICAgICAgICBpbml0aWFsVVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdsb2NhdGlvbicpLmdldFVSTCgpOworICAgICAgICB9CisgICAgICAgIHZh
ciBpbml0aWFsVHJhbnNpdGlvbiA9IHRoaXMuaGFuZGxlVVJMKGluaXRpYWxVUkwpOworICAgICAg
ICBpZiAoaW5pdGlhbFRyYW5zaXRpb24gJiYgaW5pdGlhbFRyYW5zaXRpb24uZXJyb3IpIHsKKyAg
ICAgICAgICB0aHJvdyBpbml0aWFsVHJhbnNpdGlvbi5lcnJvcjsKKyAgICAgICAgfQorICAgICAg
fQorICAgIH0sCisKKyAgICBzZXR1cFJvdXRlcjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF90
aGlzID0gdGhpczsKKworICAgICAgdGhpcy5faW5pdFJvdXRlckpzKCk7CisgICAgICB0aGlzLl9z
ZXR1cExvY2F0aW9uKCk7CisKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjsKKyAgICAg
IHZhciBsb2NhdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbG9jYXRp
b24nKTsKKworICAgICAgLy8gQWxsb3cgdGhlIExvY2F0aW9uIGNsYXNzIHRvIGNhbmNlbCB0aGUg
cm91dGVyIHNldHVwIHdoaWxlIGl0IHJlZnJlc2hlcworICAgICAgLy8gdGhlIHBhZ2UKKyAgICAg
IGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQobG9jYXRpb24sICdjYW5jZWxSb3V0ZXJT
ZXR1cCcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgdGhpcy5f
c2V0dXBSb3V0ZXIocm91dGVyLCBsb2NhdGlvbik7CisKKyAgICAgIGxvY2F0aW9uLm9uVXBkYXRl
VVJMKGZ1bmN0aW9uICh1cmwpIHsKKyAgICAgICAgX3RoaXMuaGFuZGxlVVJMKHVybCk7CisgICAg
ICB9KTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSGFu
ZGxlcyB1cGRhdGluZyB0aGUgcGF0aHMgYW5kIG5vdGlmeWluZyBhbnkgbGlzdGVuZXJzIG9mIHRo
ZSBVUkwKKyAgICAgIGNoYW5nZS4KKyAgICAgICBUcmlnZ2VycyB0aGUgcm91dGVyIGxldmVsIGBk
aWRUcmFuc2l0aW9uYCBob29rLgorICAgICAgIEZvciBleGFtcGxlLCB0byBub3RpZnkgZ29vZ2xl
IGFuYWx5dGljcyB3aGVuIHRoZSByb3V0ZSBjaGFuZ2VzLAorICAgICAgeW91IGNvdWxkIHVzZSB0
aGlzIGhvb2suICAoTm90ZTogcmVxdWlyZXMgYWxzbyBpbmNsdWRpbmcgR0Egc2NyaXB0cywgZXRj
LikKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgUm91dGVyID0gRW1iZXIuUm91dGVy
LmV4dGVuZCh7CisgICAgICAgIGxvY2F0aW9uOiBjb25maWcubG9jYXRpb25UeXBlLAorICAgICAg
ICAgZGlkVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGhpcy5fc3VwZXIoLi4u
YXJndW1lbnRzKTsKKyAgICAgICAgICAgcmV0dXJuIGdhKCdzZW5kJywgJ3BhZ2V2aWV3Jywgewor
ICAgICAgICAgICAgJ3BhZ2UnOiB0aGlzLmdldCgndXJsJyksCisgICAgICAgICAgICAndGl0bGUn
OiB0aGlzLmdldCgndXJsJykKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGRpZFRyYW5zaXRpb24KKyAgICAgIEBwdWJsaWMKKyAg
ICAgIEBzaW5jZSAxLjIuMAorICAgICovCisgICAgZGlkVHJhbnNpdGlvbjogZnVuY3Rpb24gKGlu
Zm9zKSB7CisgICAgICB1cGRhdGVQYXRocyh0aGlzKTsKKworICAgICAgdGhpcy5fY2FuY2VsU2xv
d1RyYW5zaXRpb25UaW1lcigpOworCisgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCd1
cmwnKTsKKyAgICAgIHRoaXMuc2V0KCdjdXJyZW50U3RhdGUnLCB0aGlzLnRhcmdldFN0YXRlKTsK
KworICAgICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1bmxvb3Agc28gdXJsIHdpbGwgYmUgYWNjdXJh
dGUuIFNlZW1zCisgICAgICAvLyBsZXNzIHN1cnByaXNpbmcgdGhhbiBkaWRUcmFuc2l0aW9uIGJl
aW5nIG91dCBvZiBzeW5jLgorICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm9uY2Uo
dGhpcywgdGhpcy50cmlnZ2VyLCAnZGlkVHJhbnNpdGlvbicpOworCisgICAgICBpZiAoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJVElPTlMp
IHsKKyAgICAgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVsdC5sb2coJ1RyYW5zaXRpb25lZCBp
bnRvIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgJ1wnJyk7CisgICAgICB9
CisgICAgfSwKKworICAgIF9zZXRPdXRsZXRzOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgaGFu
ZGxlckluZm9zID0gdGhpcy5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvczsKKyAgICAgIHZhciBy
b3V0ZTsKKyAgICAgIHZhciBkZWZhdWx0UGFyZW50U3RhdGU7CisgICAgICB2YXIgbGl2ZVJvdXRl
cyA9IG51bGw7CisKKyAgICAgIGlmICghaGFuZGxlckluZm9zKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVySW5mb3MubGVuZ3Ro
OyBpKyspIHsKKyAgICAgICAgcm91dGUgPSBoYW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKKyAgICAg
ICAgdmFyIGNvbm5lY3Rpb25zID0gcm91dGUuY29ubmVjdGlvbnM7CisgICAgICAgIHZhciBvd25T
dGF0ZTsKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0aW9ucy5sZW5ndGg7IGor
KykgeworICAgICAgICAgIHZhciBhcHBlbmRlZCA9IGFwcGVuZExpdmVSb3V0ZShsaXZlUm91dGVz
LCBkZWZhdWx0UGFyZW50U3RhdGUsIGNvbm5lY3Rpb25zW2pdKTsKKyAgICAgICAgICBsaXZlUm91
dGVzID0gYXBwZW5kZWQubGl2ZVJvdXRlczsKKyAgICAgICAgICBpZiAoYXBwZW5kZWQub3duU3Rh
dGUucmVuZGVyLm5hbWUgPT09IHJvdXRlLnJvdXRlTmFtZSB8fCBhcHBlbmRlZC5vd25TdGF0ZS5y
ZW5kZXIub3V0bGV0ID09PSAnbWFpbicpIHsKKyAgICAgICAgICAgIG93blN0YXRlID0gYXBwZW5k
ZWQub3duU3RhdGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25uZWN0
aW9ucy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICBvd25TdGF0ZSA9IHJlcHJlc2VudEVtcHR5
Um91dGUobGl2ZVJvdXRlcywgZGVmYXVsdFBhcmVudFN0YXRlLCByb3V0ZSk7CisgICAgICAgIH0K
KyAgICAgICAgZGVmYXVsdFBhcmVudFN0YXRlID0gb3duU3RhdGU7CisgICAgICB9CisgICAgICBp
ZiAoIXRoaXMuX3RvcGxldmVsVmlldykgeworICAgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVy
T3duZXIuZ2V0T3duZXIodGhpcyk7CisgICAgICAgIHZhciBPdXRsZXRWaWV3ID0gb3duZXIuX2xv
b2t1cEZhY3RvcnkoJ3ZpZXc6LW91dGxldCcpOworICAgICAgICB0aGlzLl90b3BsZXZlbFZpZXcg
PSBPdXRsZXRWaWV3LmNyZWF0ZSgpOworICAgICAgICB0aGlzLl90b3BsZXZlbFZpZXcuc2V0T3V0
bGV0U3RhdGUobGl2ZVJvdXRlcyk7CisgICAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyLmxvb2t1
cCgnLWFwcGxpY2F0aW9uLWluc3RhbmNlOm1haW4nKTsKKyAgICAgICAgaW5zdGFuY2UuZGlkQ3Jl
YXRlUm9vdFZpZXcodGhpcy5fdG9wbGV2ZWxWaWV3KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IHRoaXMuX3RvcGxldmVsVmlldy5zZXRPdXRsZXRTdGF0ZShsaXZlUm91dGVzKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBIYW5kbGVzIG5vdGlmeWluZyBhbnkgbGlzdGVuZXJz
IG9mIGFuIGltcGVuZGluZyBVUkwKKyAgICAgIGNoYW5nZS4KKyAgICAgICBUcmlnZ2VycyB0aGUg
cm91dGVyIGxldmVsIGB3aWxsVHJhbnNpdGlvbmAgaG9vay4KKyAgICAgICBAbWV0aG9kIHdpbGxU
cmFuc2l0aW9uCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMS4wCisgICAgKi8KKyAg
ICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rpb24gKG9sZEluZm9zLCBuZXdJbmZvcywgdHJhbnNpdGlv
bikgeworICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0Lm9uY2UodGhpcywgdGhpcy50
cmlnZ2VyLCAnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0aW9uKTsKKworICAgICAgaWYgKF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNlJykuTE9HX1RSQU5TSVRJT05T
KSB7CisgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQubG9nKCdQcmVwYXJpbmcgdG8g
dHJhbnNpdGlvbiBmcm9tIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgob2xkSW5mb3MpICsg
J1wnIHRvIFwnJyArIEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgobmV3SW5mb3MpICsgJ1wnJyk7Cisg
ICAgICB9CisgICAgfSwKKworICAgIGhhbmRsZVVSTDogZnVuY3Rpb24gKHVybCkgeworICAgICAg
Ly8gVW50aWwgd2UgaGF2ZSBhbiBlbWJlci1pZGlvbWF0aWMgd2F5IG9mIGFjY2Vzc2luZyAjaGFz
aGVzLCB3ZSBuZWVkIHRvCisgICAgICAvLyByZW1vdmUgaXQgYmVjYXVzZSByb3V0ZXIuanMgZG9l
c24ndCBrbm93IGhvdyB0byBoYW5kbGUgaXQuCisgICAgICB1cmwgPSB1cmwuc3BsaXQoLyMoLisp
Py8pWzBdOworICAgICAgcmV0dXJuIHRoaXMuX2RvVVJMVHJhbnNpdGlvbignaGFuZGxlVVJMJywg
dXJsKTsKKyAgICB9LAorCisgICAgX2RvVVJMVHJhbnNpdGlvbjogZnVuY3Rpb24gKHJvdXRlckpz
TWV0aG9kLCB1cmwpIHsKKyAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXJbcm91dGVy
SnNNZXRob2RdKHVybCB8fCAnLycpOworICAgICAgZGlkQmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRp
b24sIHRoaXMpOworICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgVHJhbnNpdGlvbiB0aGUgYXBwbGljYXRpb24gaW50byBhbm90aGVyIHJvdXRlLiBUaGUg
cm91dGUgbWF5CisgICAgICBiZSBlaXRoZXIgYSBzaW5nbGUgcm91dGUgb3Igcm91dGUgcGF0aDoK
KyAgICAgICBTZWUgW1JvdXRlLnRyYW5zaXRpb25Ub10oaHR0cDovL2VtYmVyanMuY29tL2FwaS9j
bGFzc2VzL0VtYmVyLlJvdXRlLmh0bWwjbWV0aG9kX3RyYW5zaXRpb25UbykgZm9yIG1vcmUgaW5m
by4KKyAgICAgICBAbWV0aG9kIHRyYW5zaXRpb25UbworICAgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIG9yIGEgVVJMCisgICAgICBAcGFyYW0gey4uLk9iamVj
dH0gbW9kZWxzIHRoZSBtb2RlbChzKSBvciBpZGVudGlmaWVyKHMpIHRvIGJlIHVzZWQgd2hpbGUK
KyAgICAgICAgdHJhbnNpdGlvbmluZyB0byB0aGUgcm91dGUuCisgICAgICBAcGFyYW0ge09iamVj
dH0gW29wdGlvbnNdIG9wdGlvbmFsIGhhc2ggd2l0aCBhIHF1ZXJ5UGFyYW1zIHByb3BlcnR5Cisg
ICAgICAgIGNvbnRhaW5pbmcgYSBtYXBwaW5nIG9mIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgIEBy
ZXR1cm4ge1RyYW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGgg
dGhpcworICAgICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgorICAgICAgQHB1YmxpYworICAgICov
CisgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcXVlcnlQYXJhbXM7
CisKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tl
eV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIGlmIChyZXNlbWJsZXNVUkwo
YXJnc1swXSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RvVVJMVHJhbnNpdGlvbigndHJhbnNp
dGlvblRvJywgYXJnc1swXSk7CisgICAgICB9CisKKyAgICAgIHZhciBwb3NzaWJsZVF1ZXJ5UGFy
YW1zID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdOworICAgICAgaWYgKHBvc3NpYmxlUXVlcnlQYXJh
bXMgJiYgcG9zc2libGVRdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgncXVlcnlQYXJhbXMnKSkg
eworICAgICAgICBxdWVyeVBhcmFtcyA9IGFyZ3MucG9wKCkucXVlcnlQYXJhbXM7CisgICAgICB9
IGVsc2UgeworICAgICAgICBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgfQorCisgICAgICB2YXIg
dGFyZ2V0Um91dGVOYW1lID0gYXJncy5zaGlmdCgpOworICAgICAgcmV0dXJuIHRoaXMuX2RvVHJh
bnNpdGlvbih0YXJnZXRSb3V0ZU5hbWUsIGFyZ3MsIHF1ZXJ5UGFyYW1zKTsKKyAgICB9LAorCisg
ICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgX3Jv
dXRlcjsKKworICAgICAgKF9yb3V0ZXIgPSB0aGlzLnJvdXRlcikuaW50ZXJtZWRpYXRlVHJhbnNp
dGlvblRvLmFwcGx5KF9yb3V0ZXIsIGFyZ3VtZW50cyk7CisKKyAgICAgIHVwZGF0ZVBhdGhzKHRo
aXMpOworCisgICAgICB2YXIgaW5mb3MgPSB0aGlzLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9z
OworICAgICAgaWYgKF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbmFtZXNwYWNl
JykuTE9HX1RSQU5TSVRJT05TKSB7CisgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1bHQu
bG9nKCdJbnRlcm1lZGlhdGUtdHJhbnNpdGlvbmVkIGludG8gXCcnICsgRW1iZXJSb3V0ZXIuX3Jv
dXRlUGF0aChpbmZvcykgKyAnXCcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVwbGFjZVdp
dGg6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Uby5hcHBseSh0
aGlzLCBhcmd1bWVudHMpLm1ldGhvZCgncmVwbGFjZScpOworICAgIH0sCisKKyAgICBnZW5lcmF0
ZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF9yb3V0ZXIyOworCisgICAgICB2YXIgdXJsID0g
KF9yb3V0ZXIyID0gdGhpcy5yb3V0ZXIpLmdlbmVyYXRlLmFwcGx5KF9yb3V0ZXIyLCBhcmd1bWVu
dHMpOworICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uZm9ybWF0VVJMKHVybCk7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgc3VwcGxpZWQgcm91dGUgaXMgY3Vy
cmVudGx5IGFjdGl2ZS4KKyAgICAgICBAbWV0aG9kIGlzQWN0aXZlCisgICAgICBAcGFyYW0gcm91
dGVOYW1lCisgICAgICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAocm91dGVOYW1lKSB7CisgICAgICB2YXIgcm91dGVyID0g
dGhpcy5yb3V0ZXI7CisgICAgICByZXR1cm4gcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwg
YXJndW1lbnRzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBbiBhbHRlcm5hdGl2ZSBmb3Jt
IG9mIGBpc0FjdGl2ZWAgdGhhdCBkb2Vzbid0IHJlcXVpcmUKKyAgICAgIG1hbnVhbCBjb25jYXRl
bmF0aW9uIG9mIHRoZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZQorICAgICAgYXJyYXkuCisgICAg
ICAgQG1ldGhvZCBpc0FjdGl2ZUludGVudAorICAgICAgQHBhcmFtIHJvdXRlTmFtZQorICAgICAg
QHBhcmFtIG1vZGVscworICAgICAgQHBhcmFtIHF1ZXJ5UGFyYW1zCisgICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAgIEBzaW5jZSAxLjcuMAorICAgICovCisgICAg
aXNBY3RpdmVJbnRlbnQ6IGZ1bmN0aW9uIChyb3V0ZU5hbWUsIG1vZGVscywgcXVlcnlQYXJhbXMp
IHsKKyAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5pc0FjdGl2ZUludGVudChyb3V0ZU5h
bWUsIG1vZGVscywgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBzZW5kOiBmdW5jdGlvbiAo
bmFtZSwgY29udGV4dCkgeworICAgICAgdmFyIF9yb3V0ZXIzOworCisgICAgICAoX3JvdXRlcjMg
PSB0aGlzLnJvdXRlcikudHJpZ2dlci5hcHBseShfcm91dGVyMywgYXJndW1lbnRzKTsKKyAgICB9
LAorCisgICAgLyoqCisgICAgICBEb2VzIHRoaXMgcm91dGVyIGluc3RhbmNlIGhhdmUgdGhlIGdp
dmVuIHJvdXRlLgorICAgICAgIEBtZXRob2QgaGFzUm91dGUKKyAgICAgIEByZXR1cm4ge0Jvb2xl
YW59CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaGFzUm91dGU6IGZ1bmN0aW9uIChyb3V0
ZSkgeworICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmhhc1JvdXRlKHJvdXRlKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSByb3V0ZXIgYnkgY2xlYXJp
bmcgdGhlIGN1cnJlbnQgcm91dGUKKyAgICAgIGhhbmRsZXJzIGFuZCBkZWFjdGl2YXRpbmcgdGhl
bS4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCByZXNldAorICAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5yb3V0ZXIpIHsKKyAgICAgICAgdGhp
cy5yb3V0ZXIucmVzZXQoKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl90b3BsZXZlbFZpZXcpIHsKKyAgICAgICAgdGhp
cy5fdG9wbGV2ZWxWaWV3LmRlc3Ryb3koKTsKKyAgICAgICAgdGhpcy5fdG9wbGV2ZWxWaWV3ID0g
bnVsbDsKKyAgICAgIH0KKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
CisgICAgICB0aGlzLnJlc2V0KCk7CisgICAgfSwKKworICAgIF9sb29rdXBBY3RpdmVDb21wb25l
bnROb2RlOiBmdW5jdGlvbiAodGVtcGxhdGVOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5fYWN0
aXZlVmlld3NbdGVtcGxhdGVOYW1lXTsKKyAgICB9LAorCisgICAgLyoKKyAgICAgIENhbGxlZCB3
aGVuIGFuIGFjdGl2ZSByb3V0ZSdzIHF1ZXJ5IHBhcmFtZXRlciBoYXMgY2hhbmdlZC4KKyAgICAg
IFRoZXNlIGNoYW5nZXMgYXJlIGJhdGNoZWQgaW50byBhIHJ1bmxvb3AgcnVuIGFuZCB0cmlnZ2Vy
CisgICAgICBhIHNpbmdsZSB0cmFuc2l0aW9uLgorICAgICovCisgICAgX2FjdGl2ZVFQQ2hhbmdl
ZDogZnVuY3Rpb24gKHF1ZXJ5UGFyYW1ldGVyTmFtZSwgbmV3VmFsdWUpIHsKKyAgICAgIHRoaXMu
X3F1ZXVlZFFQQ2hhbmdlc1txdWVyeVBhcmFtZXRlck5hbWVdID0gbmV3VmFsdWU7CisgICAgICBf
ZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQub25jZSh0aGlzLCB0aGlzLl9maXJlUXVlcnlQYXJh
bVRyYW5zaXRpb24pOworICAgIH0sCisKKyAgICBfdXBkYXRpbmdRUENoYW5nZWQ6IGZ1bmN0aW9u
IChxdWVyeVBhcmFtZXRlck5hbWUpIHsKKyAgICAgIGlmICghdGhpcy5fcXBVcGRhdGVzKSB7Cisg
ICAgICAgIHRoaXMuX3FwVXBkYXRlcyA9IHt9OworICAgICAgfQorICAgICAgdGhpcy5fcXBVcGRh
dGVzW3F1ZXJ5UGFyYW1ldGVyTmFtZV0gPSB0cnVlOworICAgIH0sCisKKyAgICAvKgorICAgICAg
VHJpZ2dlcnMgYSB0cmFuc2l0aW9uIHRvIGEgcm91dGUgYmFzZWQgb24gcXVlcnkgcGFyYW1ldGVy
IGNoYW5nZXMuCisgICAgICBUaGlzIGlzIGNhbGxlZCBvbmNlIHBlciBydW5sb29wLCB0byBiYXRj
aCBjaGFuZ2VzLgorICAgICAgIGUuZy4KKyAgICAgICBpZiB0aGVzZSBtZXRob2RzIGFyZSBjYWxs
ZWQgaW4gc3VjY2Vzc2lvbjoKKyAgICAgIHRoaXMuX2FjdGl2ZVFQQ2hhbmdlZCgnZm9vJywgJzEw
Jyk7CisgICAgICAgIC8vIHJlc3VsdHMgaW4gX3F1ZXVlZFFQQ2hhbmdlcyA9IHtmb286ICcxMCd9
CisgICAgICB0aGlzLl9hY3RpdmVRUENoYW5nZWQoJ2JhcicsIGZhbHNlKTsKKyAgICAgICAgLy8g
cmVzdWx0cyBpbiBfcXVldWVkUVBDaGFuZ2VzID0ge2ZvbzogJzEwJywgYmFyOiBmYWxzZX0KKyAg
ICAgICAgX3F1ZXVlZFFQQ2hhbmdlcyB3aWxsIHJlcHJlc2VudCBib3RoIG9mIHRoZXNlIGNoYW5n
ZXMKKyAgICAgIGFuZCB0aGUgdHJhbnNpdGlvbiB1c2luZyBgdHJhbnNpdGlvblRvYCB3aWxsIGJl
IHRyaWdnZXJlZAorICAgICAgb25jZS4KKyAgICAqLworICAgIF9maXJlUXVlcnlQYXJhbVRyYW5z
aXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMudHJhbnNpdGlvblRvKHsgcXVlcnlQYXJh
bXM6IHRoaXMuX3F1ZXVlZFFQQ2hhbmdlcyB9KTsKKyAgICAgIHRoaXMuX3Jlc2V0UXVldWVkUXVl
cnlQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgfSwKKworICAgIF9jb25uZWN0QWN0aXZlQ29tcG9u
ZW50Tm9kZTogZnVuY3Rpb24gKHRlbXBsYXRlTmFtZSwgY29tcG9uZW50Tm9kZSkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Nhbm5vdCBjb25uZWN0IGFuIGFjdGl2ZVZpZXcgdGhh
dCBhbHJlYWR5IGV4aXN0cycsICF0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdKTsKKwor
ICAgICAgdmFyIF9hY3RpdmVWaWV3cyA9IHRoaXMuX2FjdGl2ZVZpZXdzOworICAgICAgZnVuY3Rp
b24gZGlzY29ubmVjdEFjdGl2ZVZpZXcoKSB7CisgICAgICAgIGRlbGV0ZSBfYWN0aXZlVmlld3Nb
dGVtcGxhdGVOYW1lXTsKKyAgICAgIH0KKworICAgICAgdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxh
dGVOYW1lXSA9IGNvbXBvbmVudE5vZGU7CisgICAgICBjb21wb25lbnROb2RlLnJlbmRlck5vZGUu
YWRkRGVzdHJ1Y3Rpb24oeyBkZXN0cm95OiBkaXNjb25uZWN0QWN0aXZlVmlldyB9KTsKKyAgICB9
LAorCisgICAgX3NldHVwTG9jYXRpb246IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBsb2NhdGlv
biA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbG9jYXRpb24nKTsKKyAgICAg
IHZhciByb290VVJMID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290VVJM
Jyk7CisgICAgICB2YXIgb3duZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcyk7CisK
KyAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGxvY2F0aW9uICYmIG93bmVyKSB7CisgICAg
ICAgIHZhciByZXNvbHZlZExvY2F0aW9uID0gb3duZXIubG9va3VwKCdsb2NhdGlvbjonICsgbG9j
YXRpb24pOworCisgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHJlc29sdmVkTG9j
YXRpb24pIHsKKyAgICAgICAgICBsb2NhdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dCh0aGlzLCAnbG9jYXRpb24nLCByZXNvbHZlZExvY2F0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRlZCByZWdpc3RyYXRpb24gb2YgY3VzdG9t
IGxvY2F0aW9uIEFQSSdzCisgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7CisgICAgICAgICAgICBp
bXBsZW1lbnRhdGlvbjogbG9jYXRpb24KKyAgICAgICAgICB9OworCisgICAgICAgICAgbG9jYXRp
b24gPSBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywgJ2xvY2F0aW9uJywgX2VtYmVy
Um91dGluZ0xvY2F0aW9uQXBpLmRlZmF1bHQuY3JlYXRlKG9wdGlvbnMpKTsKKyAgICAgICAgfQor
ICAgICAgfQorCisgICAgICBpZiAobG9jYXRpb24gIT09IG51bGwgJiYgdHlwZW9mIGxvY2F0aW9u
ID09PSAnb2JqZWN0JykgeworICAgICAgICBpZiAocm9vdFVSTCkgeworICAgICAgICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LnNldChsb2NhdGlvbiwgJ3Jvb3RVUkwnLCByb290VVJMKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIEFsbG93IHRoZSBsb2NhdGlvbiB0byBkbyBhbnkgZmVhdHVy
ZSBkZXRlY3Rpb24sIHN1Y2ggYXMgQXV0b0xvY2F0aW9uCisgICAgICAgIC8vIGRldGVjdGluZyBo
aXN0b3J5IHN1cHBvcnQuIFRoaXMgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gc2V0IGl0cworICAgICAg
ICAvLyBgY2FuY2VsUm91dGVyU2V0dXBgIHByb3BlcnR5IHdoaWNoIGFib3J0cyByb3V0aW5nLgor
ICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmRldGVjdCA9PT0gJ2Z1bmN0aW9uJykgeworICAg
ICAgICAgIGxvY2F0aW9uLmRldGVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZW5zdXJl
IHRoYXQgaW5pdFN0YXRlIGlzIGNhbGxlZCBBRlRFUiB0aGUgcm9vdFVSTCBpcyBzZXQgb24KKyAg
ICAgICAgLy8gdGhlIGxvY2F0aW9uIGluc3RhbmNlCisgICAgICAgIGlmICh0eXBlb2YgbG9jYXRp
b24uaW5pdFN0YXRlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgbG9jYXRpb24uaW5pdFN0
YXRlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgX2dldEhhbmRsZXJGdW5j
dGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CisKKyAgICAgIHZh
ciBzZWVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHZh
ciBvd25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKyAgICAgIHZhciBEZWZh
dWx0Um91dGUgPSBvd25lci5fbG9va3VwRmFjdG9yeSgncm91dGU6YmFzaWMnKTsKKworICAgICAg
cmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgIHZhciByb3V0ZU5hbWUgPSAncm91dGU6
JyArIG5hbWU7CisgICAgICAgIHZhciBoYW5kbGVyID0gb3duZXIubG9va3VwKHJvdXRlTmFtZSk7
CisKKyAgICAgICAgaWYgKHNlZW5bbmFtZV0pIHsKKyAgICAgICAgICByZXR1cm4gaGFuZGxlcjsK
KyAgICAgICAgfQorCisgICAgICAgIHNlZW5bbmFtZV0gPSB0cnVlOworCisgICAgICAgIGlmICgh
aGFuZGxlcikgeworICAgICAgICAgIG93bmVyLnJlZ2lzdGVyKHJvdXRlTmFtZSwgRGVmYXVsdFJv
dXRlLmV4dGVuZCgpKTsKKyAgICAgICAgICBoYW5kbGVyID0gb3duZXIubG9va3VwKHJvdXRlTmFt
ZSk7CisKKyAgICAgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KF90aGlzMiwg
J25hbWVzcGFjZS5MT0dfQUNUSVZFX0dFTkVSQVRJT04nKSkgeworICAgICAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5pbmZvKCdnZW5lcmF0ZWQgLT4gJyArIHJvdXRlTmFtZSwgeyBmdWxsTmFtZTog
cm91dGVOYW1lIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZXIu
cm91dGVOYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICB9OworICAg
IH0sCisKKyAgICBfc2V0dXBSb3V0ZXI6IGZ1bmN0aW9uIChyb3V0ZXIsIGxvY2F0aW9uKSB7Cisg
ICAgICB2YXIgbGFzdFVSTDsKKyAgICAgIHZhciBlbWJlclJvdXRlciA9IHRoaXM7CisKKyAgICAg
IHJvdXRlci5nZXRIYW5kbGVyID0gdGhpcy5fZ2V0SGFuZGxlckZ1bmN0aW9uKCk7CisKKyAgICAg
IHZhciBkb1VwZGF0ZVVSTCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbG9jYXRpb24uc2V0VVJM
KGxhc3RVUkwpOworICAgICAgfTsKKworICAgICAgcm91dGVyLnVwZGF0ZVVSTCA9IGZ1bmN0aW9u
IChwYXRoKSB7CisgICAgICAgIGxhc3RVUkwgPSBwYXRoOworICAgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQub25jZShkb1VwZGF0ZVVSTCk7CisgICAgICB9OworCisgICAgICBpZiAo
bG9jYXRpb24ucmVwbGFjZVVSTCkgeworICAgICAgICB2YXIgZG9SZXBsYWNlVVJMID0gZnVuY3Rp
b24gKCkgeworICAgICAgICAgIGxvY2F0aW9uLnJlcGxhY2VVUkwobGFzdFVSTCk7CisgICAgICAg
IH07CisKKyAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwgPSBmdW5jdGlvbiAocGF0aCkgeworICAg
ICAgICAgIGxhc3RVUkwgPSBwYXRoOworICAgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVm
YXVsdC5vbmNlKGRvUmVwbGFjZVVSTCk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHJv
dXRlci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKGluZm9zKSB7CisgICAgICAgIGVtYmVyUm91
dGVyLmRpZFRyYW5zaXRpb24oaW5mb3MpOworICAgICAgfTsKKworICAgICAgcm91dGVyLndpbGxU
cmFuc2l0aW9uID0gZnVuY3Rpb24gKG9sZEluZm9zLCBuZXdJbmZvcywgdHJhbnNpdGlvbikgewor
ICAgICAgICBlbWJlclJvdXRlci53aWxsVHJhbnNpdGlvbihvbGRJbmZvcywgbmV3SW5mb3MsIHRy
YW5zaXRpb24pOworICAgICAgfTsKKyAgICB9LAorCisgICAgX3NlcmlhbGl6ZVF1ZXJ5UGFyYW1z
OiBmdW5jdGlvbiAodGFyZ2V0Um91dGVOYW1lLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFyIGdy
b3VwZWRCeVVybEtleSA9IHt9OworCisgICAgICBmb3JFYWNoUXVlcnlQYXJhbSh0aGlzLCB0YXJn
ZXRSb3V0ZU5hbWUsIHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgcXApIHsKKyAg
ICAgICAgdmFyIHVybEtleSA9IHFwLnVybEtleTsKKyAgICAgICAgaWYgKCFncm91cGVkQnlVcmxL
ZXlbdXJsS2V5XSkgeworICAgICAgICAgIGdyb3VwZWRCeVVybEtleVt1cmxLZXldID0gW107Cisg
ICAgICAgIH0KKyAgICAgICAgZ3JvdXBlZEJ5VXJsS2V5W3VybEtleV0ucHVzaCh7CisgICAgICAg
ICAgcXA6IHFwLAorICAgICAgICAgIHZhbHVlOiB2YWx1ZQorICAgICAgICB9KTsKKyAgICAgICAg
ZGVsZXRlIHF1ZXJ5UGFyYW1zW2tleV07CisgICAgICB9KTsKKworICAgICAgZm9yICh2YXIga2V5
IGluIGdyb3VwZWRCeVVybEtleSkgeworICAgICAgICB2YXIgcXBzID0gZ3JvdXBlZEJ5VXJsS2V5
W2tleV07CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3VcJ3JlIG5vdCBhbGxv
d2VkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBjb250cm9sbGVyIHByb3BlcnR5IG1hcCB0byB0aGUg
c2FtZSBxdWVyeSBwYXJhbSBrZXksIGJ1dCBib3RoIGAnICsgcXBzWzBdLnFwLnNjb3BlZFByb3Bl
cnR5TmFtZSArICdgIGFuZCBgJyArIChxcHNbMV0gPyBxcHNbMV0ucXAuc2NvcGVkUHJvcGVydHlO
YW1lIDogJycpICsgJ2AgbWFwIHRvIGAnICsgcXBzWzBdLnFwLnVybEtleSArICdgLiBZb3UgY2Fu
IGZpeCB0aGlzIGJ5IG1hcHBpbmcgb25lIG9mIHRoZSBjb250cm9sbGVyIHByb3BlcnRpZXMgdG8g
YSBkaWZmZXJlbnQgcXVlcnkgcGFyYW0ga2V5IHZpYSB0aGUgYGFzYCBjb25maWcgb3B0aW9uLCBl
LmcuIGAnICsgcXBzWzBdLnFwLnByb3AgKyAnOiB7IGFzOiBcJ290aGVyLScgKyBxcHNbMF0ucXAu
cHJvcCArICdcJyB9YCcsIHFwcy5sZW5ndGggPD0gMSk7CisgICAgICAgIHZhciBxcCA9IHFwc1sw
XS5xcDsKKyAgICAgICAgcXVlcnlQYXJhbXNbcXAudXJsS2V5XSA9IHFwLnJvdXRlLnNlcmlhbGl6
ZVF1ZXJ5UGFyYW0ocXBzWzBdLnZhbHVlLCBxcC51cmxLZXksIHFwLnR5cGUpOworICAgICAgfQor
ICAgIH0sCisKKyAgICBfZGVzZXJpYWxpemVRdWVyeVBhcmFtczogZnVuY3Rpb24gKHRhcmdldFJv
dXRlTmFtZSwgcXVlcnlQYXJhbXMpIHsKKyAgICAgIGZvckVhY2hRdWVyeVBhcmFtKHRoaXMsIHRh
cmdldFJvdXRlTmFtZSwgcXVlcnlQYXJhbXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBxcCkgewor
ICAgICAgICBkZWxldGUgcXVlcnlQYXJhbXNba2V5XTsKKyAgICAgICAgcXVlcnlQYXJhbXNbcXAu
cHJvcF0gPSBxcC5yb3V0ZS5kZXNlcmlhbGl6ZVF1ZXJ5UGFyYW0odmFsdWUsIHFwLnVybEtleSwg
cXAudHlwZSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgX3BydW5lRGVmYXVsdFF1ZXJ5UGFy
YW1WYWx1ZXM6IGZ1bmN0aW9uICh0YXJnZXRSb3V0ZU5hbWUsIHF1ZXJ5UGFyYW1zKSB7CisgICAg
ICB2YXIgcXBzID0gdGhpcy5fcXVlcnlQYXJhbXNGb3IodGFyZ2V0Um91dGVOYW1lKTsKKyAgICAg
IGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgeworICAgICAgICB2YXIgcXAgPSBxcHMubWFw
W2tleV07CisgICAgICAgIGlmIChxcCAmJiBxcC5zZXJpYWxpemVkRGVmYXVsdFZhbHVlID09PSBx
dWVyeVBhcmFtc1trZXldKSB7CisgICAgICAgICAgZGVsZXRlIHF1ZXJ5UGFyYW1zW2tleV07Cisg
ICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAgX2RvVHJhbnNpdGlvbjogZnVuY3Rpb24g
KF90YXJnZXRSb3V0ZU5hbWUsIG1vZGVscywgX3F1ZXJ5UGFyYW1zKSB7CisgICAgICB2YXIgdGFy
Z2V0Um91dGVOYW1lID0gX3RhcmdldFJvdXRlTmFtZSB8fCBfZW1iZXJSb3V0aW5nVXRpbHMuZ2V0
QWN0aXZlVGFyZ2V0TmFtZSh0aGlzLnJvdXRlcik7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgnVGhlIHJvdXRlICcgKyB0YXJnZXRSb3V0ZU5hbWUgKyAnIHdhcyBub3QgZm91bmQnLCB0
YXJnZXRSb3V0ZU5hbWUgJiYgdGhpcy5yb3V0ZXIuaGFzUm91dGUodGFyZ2V0Um91dGVOYW1lKSk7
CisKKyAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgLy8gbWVyZ2UgaW4gYW55IHF1
ZXJ5UGFyYW1zIGZyb20gdGhlIGFjdGl2ZSB0cmFuc2l0aW9uIHdoaWNoIGNvdWxkIGluY2x1ZGUK
KyAgICAgIC8vIHF1ZXJ5cGFyYW1zIGZyb20gdGhlIHVybCBvbiBpbml0aWFsIGxvYWQuCisgICAg
ICBpZiAodGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbikgeworICAgICAgICBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHF1ZXJ5UGFyYW1zLCB0aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9u
LnF1ZXJ5UGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVs
dChxdWVyeVBhcmFtcywgX3F1ZXJ5UGFyYW1zKTsKKyAgICAgIHRoaXMuX3ByZXBhcmVRdWVyeVBh
cmFtcyh0YXJnZXRSb3V0ZU5hbWUsIG1vZGVscywgcXVlcnlQYXJhbXMpOworCisgICAgICB2YXIg
dHJhbnNpdGlvbkFyZ3MgPSBfZW1iZXJSb3V0aW5nVXRpbHMucm91dGVBcmdzKHRhcmdldFJvdXRl
TmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcyk7CisgICAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMu
cm91dGVyLnRyYW5zaXRpb25Uby5hcHBseSh0aGlzLnJvdXRlciwgdHJhbnNpdGlvbkFyZ3MpOwor
CisgICAgICBkaWRCZWdpblRyYW5zaXRpb24odHJhbnNpdGlvbiwgdGhpcyk7CisKKyAgICAgIHJl
dHVybiB0cmFuc2l0aW9uOworICAgIH0sCisKKyAgICBfcHJlcGFyZVF1ZXJ5UGFyYW1zOiBmdW5j
dGlvbiAodGFyZ2V0Um91dGVOYW1lLCBtb2RlbHMsIHF1ZXJ5UGFyYW1zKSB7CisgICAgICB0aGlz
Ll9oeWRyYXRlVW5zdXBwbGllZFF1ZXJ5UGFyYW1zKHRhcmdldFJvdXRlTmFtZSwgbW9kZWxzLCBx
dWVyeVBhcmFtcyk7CisgICAgICB0aGlzLl9zZXJpYWxpemVRdWVyeVBhcmFtcyh0YXJnZXRSb3V0
ZU5hbWUsIHF1ZXJ5UGFyYW1zKTsKKyAgICAgIHRoaXMuX3BydW5lRGVmYXVsdFF1ZXJ5UGFyYW1W
YWx1ZXModGFyZ2V0Um91dGVOYW1lLCBxdWVyeVBhcmFtcyk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJucyBhIG1lcmdlZCBxdWVyeSBwYXJhbXMgbWV0YSBvYmplY3QgZm9yIGEgZ2l2
ZW4gcm91dGUuCisgICAgICBVc2VmdWwgZm9yIGFza2luZyBhIHJvdXRlIHdoYXQgaXRzIGtub3du
IHF1ZXJ5IHBhcmFtcyBhcmUuCisgICAgICAgQHByaXZhdGUKKyAgICAgKi8KKyAgICBfcXVlcnlQ
YXJhbXNGb3I6IGZ1bmN0aW9uIChsZWFmUm91dGVOYW1lKSB7CisgICAgICBpZiAodGhpcy5fcXBD
YWNoZVtsZWFmUm91dGVOYW1lXSkgeworICAgICAgICByZXR1cm4gdGhpcy5fcXBDYWNoZVtsZWFm
Um91dGVOYW1lXTsKKyAgICAgIH0KKworICAgICAgdmFyIG1hcCA9IHt9OworICAgICAgdmFyIHFw
cyA9IFtdOworICAgICAgdGhpcy5fcXBDYWNoZVtsZWFmUm91dGVOYW1lXSA9IHsKKyAgICAgICAg
bWFwOiBtYXAsCisgICAgICAgIHFwczogcXBzCisgICAgICB9OworCisgICAgICB2YXIgcm91dGVy
anMgPSB0aGlzLnJvdXRlcjsKKyAgICAgIHZhciByZWNvZ0hhbmRsZXJJbmZvcyA9IHJvdXRlcmpz
LnJlY29nbml6ZXIuaGFuZGxlcnNGb3IobGVhZlJvdXRlTmFtZSk7CisKKyAgICAgIGZvciAodmFy
IGkgPSAwLCBsZW4gPSByZWNvZ0hhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewor
ICAgICAgICB2YXIgcmVjb2dIYW5kbGVyID0gcmVjb2dIYW5kbGVySW5mb3NbaV07CisgICAgICAg
IHZhciByb3V0ZSA9IHJvdXRlcmpzLmdldEhhbmRsZXIocmVjb2dIYW5kbGVyLmhhbmRsZXIpOwor
ICAgICAgICB2YXIgcXBNZXRhID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRlLCAn
X3FwJyk7CisKKyAgICAgICAgaWYgKCFxcE1ldGEpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQobWFwLCBxcE1ldGEu
bWFwKTsKKyAgICAgICAgcXBzLnB1c2guYXBwbHkocXBzLCBxcE1ldGEucXBzKTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcXBzOiBxcHMsCisgICAgICAgIG1hcDogbWFwCisg
ICAgICB9OworICAgIH0sCisKKyAgICBfaHlkcmF0ZVVuc3VwcGxpZWRRdWVyeVBhcmFtczogZnVu
Y3Rpb24gKGxlYWZSb3V0ZU5hbWUsIGNvbnRleHRzLCBxdWVyeVBhcmFtcykgeworICAgICAgdmFy
IHN0YXRlID0gY2FsY3VsYXRlUG9zdFRyYW5zaXRpb25TdGF0ZSh0aGlzLCBsZWFmUm91dGVOYW1l
LCBjb250ZXh0cyk7CisgICAgICB2YXIgaGFuZGxlckluZm9zID0gc3RhdGUuaGFuZGxlckluZm9z
OworICAgICAgdmFyIGFwcENhY2hlID0gdGhpcy5fYnVja2V0Q2FjaGU7CisgICAgICBfZW1iZXJS
b3V0aW5nVXRpbHMuc3Rhc2hQYXJhbU5hbWVzKHRoaXMsIGhhbmRsZXJJbmZvcyk7CisKKyAgICAg
IGZvciAodmFyIGkgPSAwLCBsZW4gPSBoYW5kbGVySW5mb3MubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKKyAgICAgICAgdmFyIHJvdXRlID0gaGFuZGxlckluZm9zW2ldLmhhbmRsZXI7CisgICAgICAg
IHZhciBxcE1ldGEgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGUsICdfcXAnKTsK
KworICAgICAgICBmb3IgKHZhciBqID0gMCwgcXBMZW4gPSBxcE1ldGEucXBzLmxlbmd0aDsgaiA8
IHFwTGVuOyArK2opIHsKKyAgICAgICAgICB2YXIgcXAgPSBxcE1ldGEucXBzW2pdOworCisgICAg
ICAgICAgdmFyIHByZXNlbnRQcm9wID0gcXAucHJvcCBpbiBxdWVyeVBhcmFtcyAmJiBxcC5wcm9w
IHx8IHFwLnNjb3BlZFByb3BlcnR5TmFtZSBpbiBxdWVyeVBhcmFtcyAmJiBxcC5zY29wZWRQcm9w
ZXJ0eU5hbWU7CisKKyAgICAgICAgICBpZiAocHJlc2VudFByb3ApIHsKKyAgICAgICAgICAgIGlm
IChwcmVzZW50UHJvcCAhPT0gcXAuc2NvcGVkUHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICAg
IHF1ZXJ5UGFyYW1zW3FwLnNjb3BlZFByb3BlcnR5TmFtZV0gPSBxdWVyeVBhcmFtc1twcmVzZW50
UHJvcF07CisgICAgICAgICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtc1twcmVzZW50UHJvcF07Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBjYWNoZUtl
eSA9IF9lbWJlclJvdXRpbmdVdGlscy5jYWxjdWxhdGVDYWNoZUtleShxcC5jdHJsLCBxcC5wYXJ0
cywgc3RhdGUucGFyYW1zKTsKKyAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW3FwLnNjb3BlZFByb3Bl
cnR5TmFtZV0gPSBhcHBDYWNoZS5sb29rdXAoY2FjaGVLZXksIHFwLnByb3AsIHFwLmRlZmF1bHRW
YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKworICAgIF9z
Y2hlZHVsZUxvYWRpbmdFdmVudDogZnVuY3Rpb24gKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7
CisgICAgICB0aGlzLl9jYW5jZWxTbG93VHJhbnNpdGlvblRpbWVyKCk7CisgICAgICB0aGlzLl9z
bG93VHJhbnNpdGlvblRpbWVyID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
T25jZSgncm91dGVyVHJhbnNpdGlvbnMnLCB0aGlzLCAnX2hhbmRsZVNsb3dUcmFuc2l0aW9uJywg
dHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOworICAgIH0sCisKKyAgICBjdXJyZW50U3RhdGU6IG51
bGwsCisgICAgdGFyZ2V0U3RhdGU6IG51bGwsCisKKyAgICBfaGFuZGxlU2xvd1RyYW5zaXRpb246
IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAgaWYgKCF0aGlzLnJv
dXRlci5hY3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgIC8vIERvbid0IGZpcmUgYW4gZXZlbnQg
aWYgd2UndmUgc2luY2UgbW92ZWQgb24gZnJvbQorICAgICAgICAvLyB0aGUgdHJhbnNpdGlvbiB0
aGF0IHB1dCB1cyBpbiBhIGxvYWRpbmcgc3RhdGUuCisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KworICAgICAgdGhpcy5zZXQoJ3RhcmdldFN0YXRlJywgX2VtYmVyUm91dGluZ1N5c3RlbVJvdXRl
cl9zdGF0ZS5kZWZhdWx0LmNyZWF0ZSh7CisgICAgICAgIGVtYmVyUm91dGVyOiB0aGlzLAorICAg
ICAgICByb3V0ZXJKczogdGhpcy5yb3V0ZXIsCisgICAgICAgIHJvdXRlckpzU3RhdGU6IHRoaXMu
cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24uc3RhdGUKKyAgICAgIH0pKTsKKworICAgICAgdHJhbnNp
dGlvbi50cmlnZ2VyKHRydWUsICdsb2FkaW5nJywgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwor
ICAgIH0sCisKKyAgICBfY2FuY2VsU2xvd1RyYW5zaXRpb25UaW1lcjogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXIpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxSdW5fbG9vcC5kZWZhdWx0LmNhbmNlbCh0aGlzLl9zbG93VHJhbnNpdGlvblRpbWVyKTsKKyAg
ICAgIH0KKyAgICAgIHRoaXMuX3Nsb3dUcmFuc2l0aW9uVGltZXIgPSBudWxsOworICAgIH0sCisK
KyAgICAvLyBUaGVzZSB0aHJlZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVuc3VyZSBl
cnJvcnMgYXJlbid0CisgICAgLy8gcmUtcmFpc2VkIGlmIHRoZXkncmUgaGFuZGxlZCBpbiBhIHJv
dXRlJ3MgZXJyb3IgYWN0aW9uLgorICAgIF9tYXJrRXJyb3JBc0hhbmRsZWQ6IGZ1bmN0aW9uIChl
cnJvckd1aWQpIHsKKyAgICAgIHRoaXMuX2hhbmRsZWRFcnJvcnNbZXJyb3JHdWlkXSA9IHRydWU7
CisgICAgfSwKKworICAgIF9pc0Vycm9ySGFuZGxlZDogZnVuY3Rpb24gKGVycm9yR3VpZCkgewor
ICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZWRFcnJvcnNbZXJyb3JHdWlkXTsKKyAgICB9LAorCisg
ICAgX2NsZWFySGFuZGxlZEVycm9yOiBmdW5jdGlvbiAoZXJyb3JHdWlkKSB7CisgICAgICBkZWxl
dGUgdGhpcy5faGFuZGxlZEVycm9yc1tlcnJvckd1aWRdOworICAgIH0KKyAgfSk7CisKKyAgLyoK
KyAgICBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyByb290LXdhcmQsIHN0YXJ0aW5nCisg
ICAgZnJvbSAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBwcm92aWRlZCBgb3JpZ2luUm91dGVgLgor
ICAKKyAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgY2FsbGJhY2sgZmlyZWQgcmVxdWVzdGVk
CisgICAgdG8gYnViYmxlIHVwd2FyZC4KKyAgCisgICAgQHByaXZhdGUKKyAgICovCisgIGZ1bmN0
aW9uIGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBjYWxsYmFjaykg
eworICAgIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9uLnN0YXRlLmhhbmRsZXJJbmZvczsK
KyAgICB2YXIgb3JpZ2luUm91dGVGb3VuZCA9IGZhbHNlOworICAgIHZhciBoYW5kbGVySW5mbywg
cm91dGU7CisKKyAgICBmb3IgKHZhciBpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGkgPj0g
MDsgLS1pKSB7CisgICAgICBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKKyAgICAgIHJv
dXRlID0gaGFuZGxlckluZm8uaGFuZGxlcjsKKworICAgICAgaWYgKCFvcmlnaW5Sb3V0ZUZvdW5k
KSB7CisgICAgICAgIGlmIChvcmlnaW5Sb3V0ZSA9PT0gcm91dGUpIHsKKyAgICAgICAgICBvcmln
aW5Sb3V0ZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAg
IH0KKworICAgICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBoYW5kbGVySW5mb3NbaSArIDFdLmhhbmRs
ZXIpICE9PSB0cnVlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBUaGVzZSBnZXQgaW52b2tlZCB3aGVuIGFuIGFj
dGlvbiBidWJibGVzIGFib3ZlIEFwcGxpY2F0aW9uUm91dGUKKyAgLy8gYW5kIGFyZSBub3QgbWVh
bnQgdG8gYmUgb3ZlcnJpZGFibGUuCisgIHZhciBkZWZhdWx0QWN0aW9uSGFuZGxlcnMgPSB7CisK
KyAgICB3aWxsUmVzb2x2ZU1vZGVsOiBmdW5jdGlvbiAodHJhbnNpdGlvbiwgb3JpZ2luUm91dGUp
IHsKKyAgICAgIG9yaWdpblJvdXRlLnJvdXRlci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJhbnNp
dGlvbiwgb3JpZ2luUm91dGUpOworICAgIH0sCisKKyAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9y
LCB0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIGFu
IGFwcHJvcHJpYXRlIGVycm9yIHN1YnN0YXRlIHRvIGVudGVyLgorICAgICAgdmFyIHJvdXRlciA9
IG9yaWdpblJvdXRlLnJvdXRlcjsKKworICAgICAgdmFyIHRyeVRvcExldmVsID0gZm9yRWFjaFJv
dXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRpb24sIGZ1bmN0aW9uIChyb3V0ZSwgY2hpbGRS
b3V0ZSkgeworICAgICAgICB2YXIgY2hpbGRFcnJvclJvdXRlTmFtZSA9IGZpbmRDaGlsZFJvdXRl
TmFtZShyb3V0ZSwgY2hpbGRSb3V0ZSwgJ2Vycm9yJyk7CisgICAgICAgIGlmIChjaGlsZEVycm9y
Um91dGVOYW1lKSB7CisgICAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25Ubyhj
aGlsZEVycm9yUm91dGVOYW1lLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSk7CisKKyAgICAgIGlmICh0cnlUb3BMZXZl
bCkgeworICAgICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVsIGVycm9yIHN0YXRlIHRvIGVudGVy
LgorICAgICAgICBpZiAocm91dGVIYXNCZWVuRGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0ZXIsICdh
cHBsaWNhdGlvbl9lcnJvcicpKSB7CisgICAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5z
aXRpb25UbygnYXBwbGljYXRpb25fZXJyb3InLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxvZ0Vycm9yKGVycm9yLCAnRXJyb3Igd2hpbGUg
cHJvY2Vzc2luZyByb3V0ZTogJyArIHRyYW5zaXRpb24udGFyZ2V0TmFtZSk7CisgICAgfSwKKwor
ICAgIGxvYWRpbmc6IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgeworICAgICAg
Ly8gQXR0ZW1wdCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGxvYWRpbmcgc3Vic3RhdGUgdG8gZW50
ZXIuCisgICAgICB2YXIgcm91dGVyID0gb3JpZ2luUm91dGUucm91dGVyOworCisgICAgICB2YXIg
dHJ5VG9wTGV2ZWwgPSBmb3JFYWNoUm91dGVBYm92ZShvcmlnaW5Sb3V0ZSwgdHJhbnNpdGlvbiwg
ZnVuY3Rpb24gKHJvdXRlLCBjaGlsZFJvdXRlKSB7CisgICAgICAgIHZhciBjaGlsZExvYWRpbmdS
b3V0ZU5hbWUgPSBmaW5kQ2hpbGRSb3V0ZU5hbWUocm91dGUsIGNoaWxkUm91dGUsICdsb2FkaW5n
Jyk7CisKKyAgICAgICAgaWYgKGNoaWxkTG9hZGluZ1JvdXRlTmFtZSkgeworICAgICAgICAgIHJv
dXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8oY2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKKyAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBidWJibGUgYWJv
dmUgcGl2b3Qgcm91dGUuCisgICAgICAgIGlmICh0cmFuc2l0aW9uLnBpdm90SGFuZGxlciAhPT0g
cm91dGUpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisK
KyAgICAgIGlmICh0cnlUb3BMZXZlbCkgeworICAgICAgICAvLyBDaGVjayBmb3IgdG9wLWxldmVs
IGxvYWRpbmcgc3RhdGUgdG8gZW50ZXIuCisgICAgICAgIGlmIChyb3V0ZUhhc0JlZW5EZWZpbmVk
KG9yaWdpblJvdXRlLnJvdXRlciwgJ2FwcGxpY2F0aW9uX2xvYWRpbmcnKSkgeworICAgICAgICAg
IHJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8oJ2FwcGxpY2F0aW9uX2xvYWRpbmcnKTsK
KyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAg
ZnVuY3Rpb24gbG9nRXJyb3IoX2Vycm9yLCBpbml0aWFsTWVzc2FnZSkgeworICAgIHZhciBlcnJv
ckFyZ3MgPSBbXTsKKyAgICB2YXIgZXJyb3I7CisgICAgaWYgKF9lcnJvciAmJiB0eXBlb2YgX2Vy
cm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgX2Vycm9yLmVycm9yVGhyb3duID09PSAnb2JqZWN0
JykgeworICAgICAgZXJyb3IgPSBfZXJyb3IuZXJyb3JUaHJvd247CisgICAgfSBlbHNlIHsKKyAg
ICAgIGVycm9yID0gX2Vycm9yOworICAgIH0KKworICAgIGlmIChpbml0aWFsTWVzc2FnZSkgewor
ICAgICAgZXJyb3JBcmdzLnB1c2goaW5pdGlhbE1lc3NhZ2UpOworICAgIH0KKworICAgIGlmIChl
cnJvcikgeworICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHsKKyAgICAgICAgZXJyb3JBcmdzLnB1
c2goZXJyb3IubWVzc2FnZSk7CisgICAgICB9CisgICAgICBpZiAoZXJyb3Iuc3RhY2spIHsKKyAg
ICAgICAgZXJyb3JBcmdzLnB1c2goZXJyb3Iuc3RhY2spOworICAgICAgfQorCisgICAgICBpZiAo
dHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykgeworICAgICAgICBlcnJvckFyZ3MucHVzaChlcnJv
cik7CisgICAgICB9CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxMb2dnZXIuZGVmYXVsdC5lcnJv
ci5hcHBseSh0aGlzLCBlcnJvckFyZ3MpOworICB9CisKKyAgZnVuY3Rpb24gZmluZENoaWxkUm91
dGVOYW1lKHBhcmVudFJvdXRlLCBvcmlnaW5hdGluZ0NoaWxkUm91dGUsIG5hbWUpIHsKKyAgICB2
YXIgcm91dGVyID0gcGFyZW50Um91dGUucm91dGVyOworICAgIHZhciBjaGlsZE5hbWU7CisgICAg
dmFyIHRhcmdldENoaWxkUm91dGVOYW1lID0gb3JpZ2luYXRpbmdDaGlsZFJvdXRlLnJvdXRlTmFt
ZS5zcGxpdCgnLicpLnBvcCgpOworICAgIHZhciBuYW1lc3BhY2UgPSBwYXJlbnRSb3V0ZS5yb3V0
ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicgPyAnJyA6IHBhcmVudFJvdXRlLnJvdXRlTmFtZSArICcu
JzsKKworICAgIC8vIEZpcnN0LCB0cnkgYSBuYW1lZCBsb2FkaW5nIHN0YXRlLCBlLmcuICdmb29f
bG9hZGluZycKKyAgICBjaGlsZE5hbWUgPSBuYW1lc3BhY2UgKyB0YXJnZXRDaGlsZFJvdXRlTmFt
ZSArICdfJyArIG5hbWU7CisgICAgaWYgKHJvdXRlSGFzQmVlbkRlZmluZWQocm91dGVyLCBjaGls
ZE5hbWUpKSB7CisgICAgICByZXR1cm4gY2hpbGROYW1lOworICAgIH0KKworICAgIC8vIFNlY29u
ZCwgdHJ5IGdlbmVyYWwgbG9hZGluZyBzdGF0ZSwgZS5nLiAnbG9hZGluZycKKyAgICBjaGlsZE5h
bWUgPSBuYW1lc3BhY2UgKyBuYW1lOworICAgIGlmIChyb3V0ZUhhc0JlZW5EZWZpbmVkKHJvdXRl
ciwgY2hpbGROYW1lKSkgeworICAgICAgcmV0dXJuIGNoaWxkTmFtZTsKKyAgICB9CisgIH0KKwor
ICBmdW5jdGlvbiByb3V0ZUhhc0JlZW5EZWZpbmVkKHJvdXRlciwgbmFtZSkgeworICAgIHZhciBv
d25lciA9IF9jb250YWluZXJPd25lci5nZXRPd25lcihyb3V0ZXIpOworICAgIHJldHVybiByb3V0
ZXIuaGFzUm91dGUobmFtZSkgJiYgKG93bmVyLmhhc1JlZ2lzdHJhdGlvbigndGVtcGxhdGU6JyAr
IG5hbWUpIHx8IG93bmVyLmhhc1JlZ2lzdHJhdGlvbigncm91dGU6JyArIG5hbWUpKTsKKyAgfQor
CisgIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChoYW5kbGVySW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFy
Z3MpIHsKKyAgICB2YXIgbmFtZSA9IGFyZ3Muc2hpZnQoKTsKKworICAgIGlmICghaGFuZGxlcklu
Zm9zKSB7CisgICAgICBpZiAoaWdub3JlRmFpbHVyZSkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDYW5cJ3QgdHJp
Z2dlciBhY3Rpb24gXCcnICsgbmFtZSArICdcJyBiZWNhdXNlIHlvdXIgYXBwIGhhc25cJ3QgZmlu
aXNoZWQgdHJhbnNpdGlvbmluZyBpbnRvIGl0cyBmaXJzdCByb3V0ZS4gVG8gdHJpZ2dlciBhbiBh
Y3Rpb24gb24gZGVzdGluYXRpb24gcm91dGVzIGR1cmluZyBhIHRyYW5zaXRpb24sIHlvdSBjYW4g
Y2FsbCBgLnNlbmQoKWAgb24gdGhlIGBUcmFuc2l0aW9uYCBvYmplY3QgcGFzc2VkIHRvIHRoZSBg
bW9kZWwvYmVmb3JlTW9kZWwvYWZ0ZXJNb2RlbGAgaG9va3MuJyk7CisgICAgfQorCisgICAgdmFy
IGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOworICAgIHZhciBoYW5kbGVySW5mbywgaGFuZGxlcjsK
KworICAgIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0p
IHsKKyAgICAgIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgaGFuZGxlciA9
IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisKKyAgICAgIGlmIChoYW5kbGVyLmFjdGlvbnMgJiYgaGFu
ZGxlci5hY3Rpb25zW25hbWVdKSB7CisgICAgICAgIGlmIChoYW5kbGVyLmFjdGlvbnNbbmFtZV0u
YXBwbHkoaGFuZGxlciwgYXJncykgPT09IHRydWUpIHsKKyAgICAgICAgICBldmVudFdhc0hhbmRs
ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGhp
dCBoZXJlIGlmIGEgbm9uLWJ1YmJsaW5nIGVycm9yIGFjdGlvbiBpcyB0cmlnZ2VyZWQgb24gYSBy
b3V0ZS4KKyAgICAgICAgICBpZiAobmFtZSA9PT0gJ2Vycm9yJykgeworICAgICAgICAgICAgdmFy
IGVycm9ySWQgPSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IoYXJnc1swXSk7CisgICAgICAgICAg
ICBoYW5kbGVyLnJvdXRlci5fbWFya0Vycm9yQXNIYW5kbGVkKGVycm9ySWQpOworICAgICAgICAg
IH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoZGVmYXVsdEFjdGlvbkhhbmRsZXJzW25hbWVdKSB7CisgICAgICBkZWZhdWx0QWN0aW9uSGFu
ZGxlcnNbbmFtZV0uYXBwbHkobnVsbCwgYXJncyk7CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYgIWlnbm9yZUZhaWx1cmUpIHsKKyAgICAgIHRocm93
IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ05vdGhpbmcgaGFuZGxlZCB0aGUgYWN0aW9u
IFwnJyArIG5hbWUgKyAnXCcuIElmIHlvdSBkaWQgaGFuZGxlIHRoZSBhY3Rpb24sIHRoaXMgZXJy
b3IgY2FuIGJlIGNhdXNlZCBieSByZXR1cm5pbmcgdHJ1ZSBmcm9tIGFuIGFjdGlvbiBoYW5kbGVy
IGluIGEgY29udHJvbGxlciwgY2F1c2luZyB0aGUgYWN0aW9uIHRvIGJ1YmJsZS4nKTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBjYWxjdWxhdGVQb3N0VHJhbnNpdGlvblN0YXRlKGVtYmVyUm91
dGVyLCBsZWFmUm91dGVOYW1lLCBjb250ZXh0cykgeworICAgIHZhciByb3V0ZXJqcyA9IGVtYmVy
Um91dGVyLnJvdXRlcjsKKyAgICB2YXIgc3RhdGUgPSByb3V0ZXJqcy5hcHBseUludGVudChsZWFm
Um91dGVOYW1lLCBjb250ZXh0cyk7CisgICAgdmFyIGhhbmRsZXJJbmZvcyA9IHN0YXRlLmhhbmRs
ZXJJbmZvczsKKyAgICB2YXIgcGFyYW1zID0gc3RhdGUucGFyYW1zOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAg
dmFyIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgaWYgKCFoYW5kbGVySW5m
by5pc1Jlc29sdmVkKSB7CisgICAgICAgIGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm8uYmVjb21l
UmVzb2x2ZWQobnVsbCwgaGFuZGxlckluZm8uY29udGV4dCk7CisgICAgICB9CisgICAgICBwYXJh
bXNbaGFuZGxlckluZm8ubmFtZV0gPSBoYW5kbGVySW5mby5wYXJhbXM7CisgICAgfQorICAgIHJl
dHVybiBzdGF0ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZVBhdGhzKHJvdXRlcikgeworICAg
IHZhciBpbmZvcyA9IHJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvczsKKyAgICB2YXIg
cGF0aCA9IEVtYmVyUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpOworICAgIHZhciBjdXJyZW50Um91
dGVOYW1lID0gaW5mb3NbaW5mb3MubGVuZ3RoIC0gMV0ubmFtZTsKKworICAgIF9lbWJlck1ldGFs
UHJvcGVydHlfc2V0LnNldChyb3V0ZXIsICdjdXJyZW50UGF0aCcsIHBhdGgpOworICAgIF9lbWJl
ck1ldGFsUHJvcGVydHlfc2V0LnNldChyb3V0ZXIsICdjdXJyZW50Um91dGVOYW1lJywgY3VycmVu
dFJvdXRlTmFtZSk7CisKKyAgICB2YXIgYXBwQ29udHJvbGxlciA9IF9jb250YWluZXJPd25lci5n
ZXRPd25lcihyb3V0ZXIpLmxvb2t1cCgnY29udHJvbGxlcjphcHBsaWNhdGlvbicpOworCisgICAg
aWYgKCFhcHBDb250cm9sbGVyKSB7CisgICAgICAvLyBhcHBDb250cm9sbGVyIG1pZ2h0IG5vdCBl
eGlzdCB3aGVuIHRvcC1sZXZlbCBsb2FkaW5nL2Vycm9yCisgICAgICAvLyBzdWJzdGF0ZXMgaGF2
ZSBiZWVuIGVudGVyZWQgc2luY2UgQXBwbGljYXRpb25Sb3V0ZSBoYXNuJ3QKKyAgICAgIC8vIGFj
dHVhbGx5IGJlZW4gZW50ZXJlZCBhdCB0aGF0IHBvaW50LgorICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmICghKCdjdXJyZW50UGF0aCcgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQcm9wZXJ0eShhcHBDb250cm9sbGVyLCAnY3VycmVu
dFBhdGgnKTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoYXBwQ29u
dHJvbGxlciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7CisKKyAgICBpZiAoISgnY3VycmVudFJvdXRl
TmFtZScgaW4gYXBwQ29udHJvbGxlcikpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5k
ZWZpbmVQcm9wZXJ0eShhcHBDb250cm9sbGVyLCAnY3VycmVudFJvdXRlTmFtZScpOworICAgIH0K
KworICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldChhcHBDb250cm9sbGVyLCAnY3VycmVu
dFJvdXRlTmFtZScsIGN1cnJlbnRSb3V0ZU5hbWUpOworICB9CisKKyAgRW1iZXJSb3V0ZXIucmVv
cGVuQ2xhc3MoeworICAgIHJvdXRlcjogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIGBSb3V0
ZXIubWFwYCBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGRlZmluZSBtYXBwaW5ncyBmcm9tIFVSTHMg
dG8gcm91dGVzCisgICAgICBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUaGVzZSBtYXBwaW5ncyBhcmUg
ZGVmaW5lZCB3aXRoaW4gdGhlCisgICAgICBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiB1c2lu
ZyBgdGhpcy5yb3V0ZWAuCisgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBv
ZiB0aGUgcm91dGUgd2hpY2ggaXMgdXNlZCBieSBkZWZhdWx0IGFzIHRoZQorICAgICAgcGF0aCBu
YW1lIGFzIHdlbGwuCisgICAgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIG9wdGlvbmFs
IG9wdGlvbnMgaGFzaC4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlOgorICAgICAgICAqIGBwYXRoYDog
YWxsb3dzIHlvdSB0byBwcm92aWRlIHlvdXIgb3duIHBhdGggYXMgd2VsbCBhcyBtYXJrIGR5bmFt
aWMKKyAgICAgICAgICBzZWdtZW50cy4KKyAgICAgICAgKiBgcmVzZXROYW1lc3BhY2VgOiBmYWxz
ZSBieSBkZWZhdWx0OyB3aGVuIG5lc3Rpbmcgcm91dGVzLCBlbWJlciB3aWxsCisgICAgICAgICAg
Y29tYmluZSB0aGUgcm91dGUgbmFtZXMgdG8gZm9ybSB0aGUgZnVsbHktcXVhbGlmaWVkIHJvdXRl
IG5hbWUsIHdoaWNoIGlzCisgICAgICAgICAgdXNlZCB3aXRoIGB7e2xpbmstdG99fWAgb3IgbWFu
dWFsbHkgdHJhbnNpdGlvbmluZyB0byByb3V0ZXMuIFNldHRpbmcKKyAgICAgICAgICBgcmVzZXRO
YW1lc3BhY2U6IHRydWVgIHdpbGwgY2F1c2UgdGhlIHJvdXRlIG5vdCB0byBpbmhlcml0IGZyb20g
aXRzCisgICAgICAgICAgcGFyZW50IHJvdXRlJ3MgbmFtZXMuIFRoaXMgaXMgaGFuZHkgZm9yIHJl
c291cmNlcyB3aGljaCBjYW4gYmUgYWNjZXNzZWQKKyAgICAgICAgICBpbiBtdWx0aXBsZSBwbGFj
ZXMgYXMgd2VsbCBhcyBwcmV2ZW50aW5nIGV4dHJlbWVseSBsb25nIHJvdXRlIG5hbWVzLgorICAg
ICAgICAgIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBhY3R1YWwgVVJMIHBhdGggYmVoYXZpb3IgaXMg
c3RpbGwgcmV0YWluZWQuCisgICAgICAgVGhlIHRoaXJkIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9u
LCB3aGljaCBjYW4gYmUgdXNlZCB0byBuZXN0IHJvdXRlcy4KKyAgICAgIE5lc3RlZCByb3V0ZXMs
IGJ5IGRlZmF1bHQsIHdpbGwgaGF2ZSB0aGUgcGFyZW50IHJvdXRlIHRyZWUncyByb3V0ZSBuYW1l
IGFuZAorICAgICAgcGF0aCBwcmVwZW5kZWQgdG8gaXQncyBvd24uCisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKXsKKyAgICAgICAgdGhpcy5yb3V0
ZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0Lzpwb3N0X2lkJyB9LCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICB0aGlzLnJvdXRlKCdlZGl0Jyk7CisgICAgICAgICAgdGhpcy5yb3V0ZSgnY29tbWVudHMn
LCB7IHJlc2V0TmFtZXNwYWNlOiB0cnVlIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdGhp
cy5yb3V0ZSgnbmV3Jyk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBGb3IgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGFuZCBleGFt
cGxlcyBwbGVhc2Ugc2VlCisgICAgICBbdGhlIGd1aWRlc10oaHR0cDovL2VtYmVyanMuY29tL2d1
aWRlcy9yb3V0aW5nL2RlZmluaW5nLXlvdXItcm91dGVzLykuCisgICAgICAgQG1ldGhvZCBtYXAK
KyAgICAgIEBwYXJhbSBjYWxsYmFjaworICAgICAgQHB1YmxpYworICAgICovCisgICAgbWFwOiBm
dW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAgIGlmICghdGhpcy5kc2xDYWxsYmFja3MpIHsKKyAg
ICAgICAgdGhpcy5kc2xDYWxsYmFja3MgPSBbXTsKKyAgICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7
IGRzbENhbGxiYWNrczogdGhpcy5kc2xDYWxsYmFja3MgfSk7CisgICAgICB9CisKKyAgICAgIHRo
aXMuZHNsQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOworCisgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LAorCisgICAgX3JvdXRlUGF0aDogZnVuY3Rpb24gKGhhbmRsZXJJbmZvcykgeworICAgICAg
dmFyIHBhdGggPSBbXTsKKworICAgICAgLy8gV2UgaGF2ZSB0byBoYW5kbGUgY29hbGVzY2luZyBy
ZXNvdXJjZSBuYW1lcyB0aGF0CisgICAgICAvLyBhcmUgcHJlZml4ZWQgd2l0aCB0aGVpciBwYXJl
bnQncyBuYW1lcywgZS5nLgorICAgICAgLy8gWydmb28nLCAnZm9vLmJhci5iYXonXSA9PiAnZm9v
LmJhci5iYXonLCBub3QgJ2Zvby5mb28uYmFyLmJheicKKworICAgICAgZnVuY3Rpb24gaW50ZXJz
ZWN0aW9uTWF0Y2hlcyhhMSwgYTIpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGEx
Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkg
eworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdmFyIG5hbWUsIG5hbWVQYXJ0cywg
b2xkTmFtZVBhcnRzOworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBoYW5kbGVySW5mb3MubGVu
Z3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIG5hbWUgPSBoYW5kbGVySW5mb3NbaV0ubmFtZTsK
KyAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLicpOworICAgICAgICBvbGROYW1lUGFy
dHMgPSBzbGljZS5jYWxsKHBhdGgpOworCisgICAgICAgIHdoaWxlIChvbGROYW1lUGFydHMubGVu
Z3RoKSB7CisgICAgICAgICAgaWYgKGludGVyc2VjdGlvbk1hdGNoZXMob2xkTmFtZVBhcnRzLCBu
YW1lUGFydHMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAg
b2xkTmFtZVBhcnRzLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwYXRoLnB1c2guYXBw
bHkocGF0aCwgbmFtZVBhcnRzLnNsaWNlKG9sZE5hbWVQYXJ0cy5sZW5ndGgpKTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHBhdGguam9pbignLicpOworICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rp
b24gZGlkQmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRpb24sIHJvdXRlcikgeworICAgIHZhciByb3V0
ZXJTdGF0ZSA9IF9lbWJlclJvdXRpbmdTeXN0ZW1Sb3V0ZXJfc3RhdGUuZGVmYXVsdC5jcmVhdGUo
eworICAgICAgZW1iZXJSb3V0ZXI6IHJvdXRlciwKKyAgICAgIHJvdXRlckpzOiByb3V0ZXIucm91
dGVyLAorICAgICAgcm91dGVySnNTdGF0ZTogdHJhbnNpdGlvbi5zdGF0ZQorICAgIH0pOworCisg
ICAgaWYgKCFyb3V0ZXIuY3VycmVudFN0YXRlKSB7CisgICAgICByb3V0ZXIuc2V0KCdjdXJyZW50
U3RhdGUnLCByb3V0ZXJTdGF0ZSk7CisgICAgfQorICAgIHJvdXRlci5zZXQoJ3RhcmdldFN0YXRl
Jywgcm91dGVyU3RhdGUpOworCisgICAgdHJhbnNpdGlvbi5wcm9taXNlID0gdHJhbnNpdGlvbi5j
YXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKKyAgICAgIHZhciBlcnJvcklkID0gX2VtYmVyTWV0YWxV
dGlscy5ndWlkRm9yKGVycm9yKTsKKworICAgICAgaWYgKHJvdXRlci5faXNFcnJvckhhbmRsZWQo
ZXJyb3JJZCkpIHsKKyAgICAgICAgcm91dGVyLl9jbGVhckhhbmRsZWRFcnJvcihlcnJvcklkKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGVycm9yOworICAgICAgfQorICAgIH0pOwor
ICB9CisKKyAgZnVuY3Rpb24gcmVzZW1ibGVzVVJMKHN0cikgeworICAgIHJldHVybiB0eXBlb2Yg
c3RyID09PSAnc3RyaW5nJyAmJiAoc3RyID09PSAnJyB8fCBzdHIuY2hhckF0KDApID09PSAnLycp
OworICB9CisKKyAgZnVuY3Rpb24gZm9yRWFjaFF1ZXJ5UGFyYW0ocm91dGVyLCB0YXJnZXRSb3V0
ZU5hbWUsIHF1ZXJ5UGFyYW1zLCBjYWxsYmFjaykgeworICAgIHZhciBxcENhY2hlID0gcm91dGVy
Ll9xdWVyeVBhcmFtc0Zvcih0YXJnZXRSb3V0ZU5hbWUpOworCisgICAgZm9yICh2YXIga2V5IGlu
IHF1ZXJ5UGFyYW1zKSB7CisgICAgICBpZiAoIXF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KGtl
eSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgdmFsdWUgPSBxdWVy
eVBhcmFtc1trZXldOworICAgICAgdmFyIHFwID0gcXBDYWNoZS5tYXBba2V5XTsKKworICAgICAg
aWYgKHFwKSB7CisgICAgICAgIGNhbGxiYWNrKGtleSwgdmFsdWUsIHFwKTsKKyAgICAgIH0KKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kTGl2ZVJvdXRlKGxpdmVSb3V0ZXMsIG5hbWUpIHsK
KyAgICBpZiAoIWxpdmVSb3V0ZXMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIHN0
YWNrID0gW2xpdmVSb3V0ZXNdOworICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CisgICAg
ICB2YXIgdGVzdCA9IHN0YWNrLnNoaWZ0KCk7CisgICAgICBpZiAodGVzdC5yZW5kZXIubmFtZSA9
PT0gbmFtZSkgeworICAgICAgICByZXR1cm4gdGVzdDsKKyAgICAgIH0KKyAgICAgIHZhciBvdXRs
ZXRzID0gdGVzdC5vdXRsZXRzOworICAgICAgZm9yICh2YXIgb3V0bGV0TmFtZSBpbiBvdXRsZXRz
KSB7CisgICAgICAgIHN0YWNrLnB1c2gob3V0bGV0c1tvdXRsZXROYW1lXSk7CisgICAgICB9Cisg
ICAgfQorICB9CisKKyAgZnVuY3Rpb24gYXBwZW5kTGl2ZVJvdXRlKGxpdmVSb3V0ZXMsIGRlZmF1
bHRQYXJlbnRTdGF0ZSwgcmVuZGVyT3B0aW9ucykgeworICAgIHZhciB0YXJnZXQ7CisgICAgdmFy
IG15U3RhdGUgPSB7CisgICAgICByZW5kZXI6IHJlbmRlck9wdGlvbnMsCisgICAgICBvdXRsZXRz
OiBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpCisgICAgfTsKKyAgICBpZiAo
cmVuZGVyT3B0aW9ucy5pbnRvKSB7CisgICAgICB0YXJnZXQgPSBmaW5kTGl2ZVJvdXRlKGxpdmVS
b3V0ZXMsIHJlbmRlck9wdGlvbnMuaW50byk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhcmdldCA9
IGRlZmF1bHRQYXJlbnRTdGF0ZTsKKyAgICB9CisgICAgaWYgKHRhcmdldCkgeworICAgICAgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRhcmdldC5vdXRsZXRzLCByZW5kZXJPcHRpb25zLm91
dGxldCwgbXlTdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZW5kZXJPcHRpb25zLmlu
dG8pIHsKKyAgICAgICAgLy8gTWVnYWhheCB0aW1lLiBQb3N0LTIuMC1icmVha2luZy1jaGFuZ2Vz
LCB3ZSB3aWxsIGp1c3QgYXNzZXJ0CisgICAgICAgIC8vIHJpZ2h0IGhlcmUgdGhhdCB0aGUgdXNl
ciB0cmllZCB0byB0YXJnZXQgYSBub25leGlzdGVudAorICAgICAgICAvLyB0aGluZy4gQnV0IGZv
ciBub3cgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBgcmVuZGVyYAorICAgICAgICAvLyBo
ZWxwZXIsIGFuZCBwZW9wbGUgYXJlIGFsbG93ZWQgdG8gdGFyZ2V0IHRlbXBsYXRlcyByZW5kZXJl
ZAorICAgICAgICAvLyBieSB0aGUgcmVuZGVyIGhlbHBlci4gU28gaW5zdGVhZCB3ZSBkZWZlciBk
b2luZyBhbnl0aW5nIHdpdGgKKyAgICAgICAgLy8gdGhlc2Ugb3JwaGFuIHJlbmRlcnMgdW50aWwg
YWZ0ZXJSZW5kZXIuCisgICAgICAgIGFwcGVuZE9ycGhhbihsaXZlUm91dGVzLCByZW5kZXJPcHRp
b25zLmludG8sIG15U3RhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGl2ZVJvdXRlcyA9
IG15U3RhdGU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB7CisgICAgICBsaXZlUm91dGVz
OiBsaXZlUm91dGVzLAorICAgICAgb3duU3RhdGU6IG15U3RhdGUKKyAgICB9OworICB9CisKKyAg
ZnVuY3Rpb24gYXBwZW5kT3JwaGFuKGxpdmVSb3V0ZXMsIGludG8sIG15U3RhdGUpIHsKKyAgICBp
ZiAoIWxpdmVSb3V0ZXMub3V0bGV0cy5fX2VtYmVyX29ycGhhbnNfXykgeworICAgICAgbGl2ZVJv
dXRlcy5vdXRsZXRzLl9fZW1iZXJfb3JwaGFuc19fID0geworICAgICAgICByZW5kZXI6IHsKKyAg
ICAgICAgICBuYW1lOiAnX19lbWJlcl9vcnBoYW5zX18nCisgICAgICAgIH0sCisgICAgICAgIG91
dGxldHM6IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCkKKyAgICAgIH07Cisg
ICAgfQorICAgIGxpdmVSb3V0ZXMub3V0bGV0cy5fX2VtYmVyX29ycGhhbnNfXy5vdXRsZXRzW2lu
dG9dID0gbXlTdGF0ZTsKKyAgICBfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGUo
J2FmdGVyUmVuZGVyJywgZnVuY3Rpb24gKCkgeworICAgICAgLy8gYHdhc1VzZWRgIGdldHMgc2V0
IGJ5IHRoZSByZW5kZXIgaGVscGVyLiBTZWUgdGhlIGZ1bmN0aW9uCisgICAgICAvLyBgaW1wZXJz
b25hdGVBbk91dGxldGAuCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGF0dGVt
cHRlZCB0byByZW5kZXIgaW50byBcJycgKyBpbnRvICsgJ1wnIGJ1dCBpdCB3YXMgbm90IGZvdW5k
JywgbGl2ZVJvdXRlcy5vdXRsZXRzLl9fZW1iZXJfb3JwaGFuc19fLm91dGxldHNbaW50b10ud2Fz
VXNlZCk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiByZXByZXNlbnRFbXB0eVJvdXRlKGxp
dmVSb3V0ZXMsIGRlZmF1bHRQYXJlbnRTdGF0ZSwgcm91dGUpIHsKKyAgICAvLyB0aGUgcm91dGUg
ZGlkbid0IHJlbmRlciBhbnl0aGluZworICAgIHZhciBhbHJlYWR5QXBwZW5kZWQgPSBmaW5kTGl2
ZVJvdXRlKGxpdmVSb3V0ZXMsIHJvdXRlLnJvdXRlTmFtZSk7CisgICAgaWYgKGFscmVhZHlBcHBl
bmRlZCkgeworICAgICAgLy8gQnV0IHNvbWUgb3RoZXIgcm91dGUgaGFzIGFscmVhZHkgcmVuZGVy
ZWQgb3VyIGRlZmF1bHQKKyAgICAgIC8vIHRlbXBsYXRlLCBzbyB0aGF0IGJlY29tZXMgdGhlIGRl
ZmF1bHQgdGFyZ2V0IGZvciBhbnkKKyAgICAgIC8vIGNoaWxkcmVuIHdlIG1heSBoYXZlLgorICAg
ICAgcmV0dXJuIGFscmVhZHlBcHBlbmRlZDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ3JlYXRl
IGFuIGVudHJ5IHRvIHJlcHJlc2VudCBvdXIgZGVmYXVsdCB0ZW1wbGF0ZSBuYW1lLAorICAgICAg
Ly8ganVzdCBzbyBvdGhlciByb3V0ZXMgY2FuIHRhcmdldCBpdCBhbmQgaW5oZXJpdCBpdHMgcGxh
Y2UKKyAgICAgIC8vIGluIHRoZSBvdXRsZXQgaGllcmFyY2h5LgorICAgICAgZGVmYXVsdFBhcmVu
dFN0YXRlLm91dGxldHMubWFpbiA9IHsKKyAgICAgICAgcmVuZGVyOiB7CisgICAgICAgICAgbmFt
ZTogcm91dGUucm91dGVOYW1lLAorICAgICAgICAgIG91dGxldDogJ21haW4nCisgICAgICAgIH0s
CisgICAgICAgIG91dGxldHM6IHt9CisgICAgICB9OworICAgICAgcmV0dXJuIGRlZmF1bHRQYXJl
bnRTdGF0ZTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBFbWJlclJvdXRlcjsK
K30pOworCisvKioKK0Btb2R1bGUgZW1iZXIKK0BzdWJtb2R1bGUgZW1iZXItcm91dGluZworKi8K
K2VuaWZlZCgnZW1iZXItcm91dGluZy9zeXN0ZW0vcm91dGVyX3N0YXRlJywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2lzX2VtcHR5JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdl
bWJlci1tZXRhbC9hc3NpZ24nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsSXNfZW1w
dHksIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlck1ldGFsQXNzaWduKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICB2YXIga2V5cyA9IE9iamVjdC5rZXlzOworCisgIHZhciBSb3V0ZXJT
dGF0ZSA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIGVt
YmVyUm91dGVyOiBudWxsLAorICAgIHJvdXRlckpzOiBudWxsLAorICAgIHJvdXRlckpzU3RhdGU6
IG51bGwsCisKKyAgICBpc0FjdGl2ZUludGVudDogZnVuY3Rpb24gKHJvdXRlTmFtZSwgbW9kZWxz
LCBxdWVyeVBhcmFtcywgcXVlcnlQYXJhbXNNdXN0TWF0Y2gpIHsKKyAgICAgIHZhciBzdGF0ZSA9
IHRoaXMucm91dGVySnNTdGF0ZTsKKyAgICAgIGlmICghdGhpcy5yb3V0ZXJKcy5pc0FjdGl2ZUlu
dGVudChyb3V0ZU5hbWUsIG1vZGVscywgbnVsbCwgc3RhdGUpKSB7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgIH0KKworICAgICAgdmFyIGVtcHR5UXVlcnlQYXJhbXMgPSBfZW1iZXJNZXRh
bElzX2VtcHR5LmRlZmF1bHQoa2V5cyhxdWVyeVBhcmFtcykpOworCisgICAgICBpZiAocXVlcnlQ
YXJhbXNNdXN0TWF0Y2ggJiYgIWVtcHR5UXVlcnlQYXJhbXMpIHsKKyAgICAgICAgdmFyIHZpc2li
bGVRdWVyeVBhcmFtcyA9IHt9OworICAgICAgICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHZp
c2libGVRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpOworCisgICAgICAgIHRoaXMuZW1iZXJSb3V0
ZXIuX3ByZXBhcmVRdWVyeVBhcmFtcyhyb3V0ZU5hbWUsIG1vZGVscywgdmlzaWJsZVF1ZXJ5UGFy
YW1zKTsKKyAgICAgICAgcmV0dXJuIHNoYWxsb3dFcXVhbCh2aXNpYmxlUXVlcnlQYXJhbXMsIHN0
YXRlLnF1ZXJ5UGFyYW1zKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICB9KTsKKworICBmdW5jdGlvbiBzaGFsbG93RXF1YWwoYSwgYikgeworICAgIHZhciBrOworICAg
IGZvciAoayBpbiBhKSB7CisgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrKSAmJiBhW2tdICE9
PSBiW2tdKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9y
IChrIGluIGIpIHsKKyAgICAgIGlmIChiLmhhc093blByb3BlcnR5KGspICYmIGFba10gIT09IGJb
a10pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IFJvdXRlclN0YXRlOworfSk7Citlbmlm
ZWQoJ2VtYmVyLXJvdXRpbmcvdXRpbHMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvYXNzaWdu
JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWxBc3NpZ24sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLnJvdXRlQXJncyA9IHJvdXRlQXJnczsKKyAgZXhwb3J0cy5nZXRBY3RpdmVU
YXJnZXROYW1lID0gZ2V0QWN0aXZlVGFyZ2V0TmFtZTsKKyAgZXhwb3J0cy5zdGFzaFBhcmFtTmFt
ZXMgPSBzdGFzaFBhcmFtTmFtZXM7CisgIGV4cG9ydHMuY2FsY3VsYXRlQ2FjaGVLZXkgPSBjYWxj
dWxhdGVDYWNoZUtleTsKKyAgZXhwb3J0cy5ub3JtYWxpemVDb250cm9sbGVyUXVlcnlQYXJhbXMg
PSBub3JtYWxpemVDb250cm9sbGVyUXVlcnlQYXJhbXM7CisKKyAgZnVuY3Rpb24gcm91dGVBcmdz
KHRhcmdldFJvdXRlTmFtZSwgbW9kZWxzLCBxdWVyeVBhcmFtcykgeworICAgIHZhciBhcmdzID0g
W107CisgICAgaWYgKHR5cGVvZiB0YXJnZXRSb3V0ZU5hbWUgPT09ICdzdHJpbmcnKSB7CisgICAg
ICBhcmdzLnB1c2goJycgKyB0YXJnZXRSb3V0ZU5hbWUpOworICAgIH0KKyAgICBhcmdzLnB1c2gu
YXBwbHkoYXJncywgbW9kZWxzKTsKKyAgICBhcmdzLnB1c2goeyBxdWVyeVBhcmFtczogcXVlcnlQ
YXJhbXMgfSk7CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKworICBmdW5jdGlvbiBnZXRBY3RpdmVU
YXJnZXROYW1lKHJvdXRlcikgeworICAgIHZhciBoYW5kbGVySW5mb3MgPSByb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbiA/IHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uLnN0YXRlLmhhbmRsZXJJbmZvcyA6
IHJvdXRlci5zdGF0ZS5oYW5kbGVySW5mb3M7CisgICAgcmV0dXJuIGhhbmRsZXJJbmZvc1toYW5k
bGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZTsKKyAgfQorCisgIGZ1bmN0aW9uIHN0YXNoUGFyYW1O
YW1lcyhyb3V0ZXIsIGhhbmRsZXJJbmZvcykgeworICAgIGlmIChoYW5kbGVySW5mb3MuX25hbWVz
U3Rhc2hlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgaGVscGVyIGV4
aXN0cyBiZWNhdXNlIHJvdXRlci5qcy9yb3V0ZS1yZWNvZ25pemVyLmpzIGF3a3dhcmRseQorICAg
IC8vIGtlZXBzIHNlcGFyYXRlIGEgaGFuZGxlckluZm8ncyBsaXN0IG9mIHBhcmFtZXRlciBuYW1l
cyBkZXBlbmRpbmcKKyAgICAvLyBvbiB3aGV0aGVyIGEgVVJMIHRyYW5zaXRpb24gb3IgbmFtZWQg
dHJhbnNpdGlvbiBpcyBoYXBwZW5pbmcuCisgICAgLy8gSG9wZWZ1bGx5IHdlIGNhbiByZW1vdmUg
dGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIHZhciB0YXJnZXRSb3V0ZU5hbWUgPSBoYW5kbGVySW5m
b3NbaGFuZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWU7CisgICAgdmFyIHJlY29nSGFuZGxlcnMg
PSByb3V0ZXIucm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGFyZ2V0Um91dGVOYW1lKTsK
KyAgICB2YXIgZHluYW1pY1BhcmVudCA9IG51bGw7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVu
ID0gaGFuZGxlckluZm9zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CisgICAgICB2YXIgaGFuZGxl
ckluZm8gPSBoYW5kbGVySW5mb3NbaV07CisgICAgICB2YXIgbmFtZXMgPSByZWNvZ0hhbmRsZXJz
W2ldLm5hbWVzOworCisgICAgICBpZiAobmFtZXMubGVuZ3RoKSB7CisgICAgICAgIGR5bmFtaWNQ
YXJlbnQgPSBoYW5kbGVySW5mbzsKKyAgICAgIH0KKworICAgICAgaGFuZGxlckluZm8uX25hbWVz
ID0gbmFtZXM7CisKKyAgICAgIHZhciByb3V0ZSA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAg
ICByb3V0ZS5fc3Rhc2hOYW1lcyhoYW5kbGVySW5mbywgZHluYW1pY1BhcmVudCk7CisgICAgfQor
CisgICAgaGFuZGxlckluZm9zLl9uYW1lc1N0YXNoZWQgPSB0cnVlOworICB9CisKKyAgZnVuY3Rp
b24gX2NhbGN1bGF0ZUNhY2hlVmFsdWVQcmVmaXgocHJlZml4LCBwYXJ0KSB7CisgICAgLy8gY2Fs
Y3VsYXRlcyB0aGUgZG90IHNlcGVyYXRlZCBzZWN0aW9ucyBmcm9tIHByZWZpeCB0aGF0IGFyZSBh
bHNvCisgICAgLy8gYXQgdGhlIHN0YXJ0IG9mIHBhcnQgLSB3aGljaCBnaXZlcyB1cyB0aGUgcm91
dGUgbmFtZQorCisgICAgLy8gZ2l2ZW4gOiBwcmVmaXggPSBzaXRlLmFydGljbGUuY29tbWVudHMs
IHBhcnQgPSBzaXRlLmFydGljbGUuaWQKKyAgICAvLyAgICAgIC0gcmV0dXJuczogc2l0ZS5hcnRp
Y2xlICh1c2UgZ2V0KHZhbHVlc1tzaXRlLmFydGljbGVdLCAnaWQnKSB0byBnZXQgdGhlIGR5bmFt
aWMgcGFydCAtIHVzZWQgYmVsb3cpCisKKyAgICAvLyBnaXZlbiA6IHByZWZpeCA9IHNpdGUuYXJ0
aWNsZSwgcGFydCA9IHNpdGUuYXJ0aWNsZS5pZAorICAgIC8vICAgICAgLSByZXR1cm5zOiBzaXRl
LmFydGljbGUuICh1c2UgZ2V0KHZhbHVlc1tzaXRlLmFydGljbGVdLCAnaWQnKSB0byBnZXQgdGhl
IGR5bmFtaWMgcGFydCAtIHVzZWQgYmVsb3cpCisKKyAgICB2YXIgcHJlZml4UGFydHMgPSBwcmVm
aXguc3BsaXQoJy4nKTsKKyAgICB2YXIgY3VyclByZWZpeCA9ICcnOworCisgICAgZm9yICh2YXIg
aSA9IDAsIGxlbiA9IHByZWZpeFBhcnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICB2
YXIgY3VyclBhcnQgPSBwcmVmaXhQYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbignLicpOworICAg
ICAgaWYgKHBhcnQuaW5kZXhPZihjdXJyUGFydCkgIT09IDApIHsKKyAgICAgICAgYnJlYWs7Cisg
ICAgICB9CisgICAgICBjdXJyUHJlZml4ID0gY3VyclBhcnQ7CisgICAgfQorCisgICAgcmV0dXJu
IGN1cnJQcmVmaXg7CisgIH0KKworICAvKgorICAgIFN0b2xlbiBmcm9tIENvbnRyb2xsZXIKKyAg
Ki8KKworICBmdW5jdGlvbiBjYWxjdWxhdGVDYWNoZUtleShwcmVmaXgsIF9wYXJ0cywgdmFsdWVz
KSB7CisgICAgdmFyIHBhcnRzID0gX3BhcnRzIHx8IFtdOworICAgIHZhciBzdWZmaXhlcyA9ICcn
OworICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkg
eworICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHZhciBjYWNoZVZhbHVlUHJlZml4
ID0gX2NhbGN1bGF0ZUNhY2hlVmFsdWVQcmVmaXgocHJlZml4LCBwYXJ0KTsKKyAgICAgIHZhciB2
YWx1ZTsKKyAgICAgIGlmICh2YWx1ZXMpIHsKKyAgICAgICAgaWYgKGNhY2hlVmFsdWVQcmVmaXgg
JiYgY2FjaGVWYWx1ZVByZWZpeCBpbiB2YWx1ZXMpIHsKKyAgICAgICAgICB2YXIgcGFydFJlbW92
ZWRQcmVmaXggPSBwYXJ0LmluZGV4T2YoY2FjaGVWYWx1ZVByZWZpeCkgPT09IDAgPyBwYXJ0LnN1
YnN0cihjYWNoZVZhbHVlUHJlZml4Lmxlbmd0aCArIDEpIDogcGFydDsKKyAgICAgICAgICB2YWx1
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2YWx1ZXNbY2FjaGVWYWx1ZVByZWZpeF0s
IHBhcnRSZW1vdmVkUHJlZml4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWx1ZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2YWx1ZXMsIHBhcnQpOworICAgICAgICB9Cisg
ICAgICB9CisgICAgICBzdWZmaXhlcyArPSAnOjonICsgcGFydCArICc6JyArIHZhbHVlOworICAg
IH0KKyAgICByZXR1cm4gcHJlZml4ICsgc3VmZml4ZXMucmVwbGFjZShBTExfUEVSSU9EU19SRUdF
WCwgJy0nKTsKKyAgfQorCisgIHZhciBBTExfUEVSSU9EU19SRUdFWCA9IC9cLi9nOworCisgIC8q
CisgICAgQ29udHJvbGxlci1kZWZpbmVkIHF1ZXJ5IHBhcmFtZXRlcnMgY2FuIGNvbWUgaW4gdGhy
ZWUgc2hhcGVzOgorICAKKyAgICBBcnJheQorICAgICAgcXVlcnlQYXJhbXM6IFsnZm9vJywgJ2Jh
ciddCisgICAgQXJyYXkgb2Ygc2ltcGxlIG9iamVjdHMgd2hlcmUgdmFsdWUgaXMgYW4gYWxpYXMK
KyAgICAgIHF1ZXJ5UGFyYW1zOiBbCisgICAgICAgIHsKKyAgICAgICAgICAnZm9vJzogJ3JlbmFt
ZV9mb29fdG9fdGhpcycKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICdiYXInOiAn
Y2FsbF9iYXJfdGhpc19pbnN0ZWFkJworICAgICAgICB9CisgICAgICBdCisgICAgQXJyYXkgb2Yg
ZnVsbHkgZGVmaW5lZCBvYmplY3RzCisgICAgICBxdWVyeVBhcmFtczogWworICAgICAgICB7Cisg
ICAgICAgICAgJ2Zvbyc6IHsKKyAgICAgICAgICAgIGFzOiAncmVuYW1lX2Zvb190b190aGlzJwor
ICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICdiYXInOiB7Cisg
ICAgICAgICAgICBhczogJ2NhbGxfYmFyX3RoaXNfaW5zdGVhZCcsCisgICAgICAgICAgICBzY29w
ZTogJ2NvbnRyb2xsZXInCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgIAorICAg
IFRoaXMgaGVscGVyIG5vcm1hbGl6ZXMgYWxsIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBpbnRvIHRo
ZQorICAgICdBcnJheSBvZiBmdWxseSBkZWZpbmVkIG9iamVjdHMnIHN0eWxlLgorICAqLworCisg
IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRyb2xsZXJRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykgewor
ICAgIGlmIChxdWVyeVBhcmFtcy5fcXBNYXApIHsKKyAgICAgIHJldHVybiBxdWVyeVBhcmFtcy5f
cXBNYXA7CisgICAgfQorCisgICAgdmFyIHFwTWFwID0gcXVlcnlQYXJhbXMuX3FwTWFwID0ge307
CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcXVlcnlQYXJhbXMubGVuZ3RoOyBpIDwgbGVu
OyArK2kpIHsKKyAgICAgIGFjY3VtdWxhdGVRdWVyeVBhcmFtRGVzY3JpcHRvcnMocXVlcnlQYXJh
bXNbaV0sIHFwTWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcXBNYXA7CisgIH0KKworICBmdW5j
dGlvbiBhY2N1bXVsYXRlUXVlcnlQYXJhbURlc2NyaXB0b3JzKF9kZXNjLCBhY2N1bSkgeworICAg
IHZhciBkZXNjID0gX2Rlc2M7CisgICAgdmFyIHRtcDsKKyAgICBpZiAodHlwZW9mIGRlc2MgPT09
ICdzdHJpbmcnKSB7CisgICAgICB0bXAgPSB7fTsKKyAgICAgIHRtcFtkZXNjXSA9IHsgYXM6IG51
bGwgfTsKKyAgICAgIGRlc2MgPSB0bXA7CisgICAgfQorCisgICAgZm9yICh2YXIga2V5IGluIGRl
c2MpIHsKKyAgICAgIGlmICghZGVzYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHNpbmdsZURlc2MgPSBkZXNjW2tleV07CisgICAg
ICBpZiAodHlwZW9mIHNpbmdsZURlc2MgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHNpbmdsZURl
c2MgPSB7IGFzOiBzaW5nbGVEZXNjIH07CisgICAgICB9CisKKyAgICAgIHRtcCA9IGFjY3VtW2tl
eV0gfHwgeyBhczogbnVsbCwgc2NvcGU6ICdtb2RlbCcgfTsKKyAgICAgIF9lbWJlck1ldGFsQXNz
aWduLmRlZmF1bHQodG1wLCBzaW5nbGVEZXNjKTsKKworICAgICAgYWNjdW1ba2V5XSA9IHRtcDsK
KyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL2NvbXBhcmUnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItcnVudGltZS91dGlscycsICdlbWJlci1ydW50aW1lL21peGlucy9jb21wYXJh
YmxlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlclJ1bnRp
bWVNaXhpbnNDb21wYXJhYmxlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBjb21wYXJlOworCisgIHZhciBUWVBFX09SREVSID0geworICAgICd1bmRlZmluZWQnOiAw
LAorICAgICdudWxsJzogMSwKKyAgICAnYm9vbGVhbic6IDIsCisgICAgJ251bWJlcic6IDMsCisg
ICAgJ3N0cmluZyc6IDQsCisgICAgJ2FycmF5JzogNSwKKyAgICAnb2JqZWN0JzogNiwKKyAgICAn
aW5zdGFuY2UnOiA3LAorICAgICdmdW5jdGlvbic6IDgsCisgICAgJ2NsYXNzJzogOSwKKyAgICAn
ZGF0ZSc6IDEwCisgIH07CisKKyAgLy8KKyAgLy8gdGhlIHNwYWNlc2hpcCBvcGVyYXRvcgorICAv
LworICAvLyAgICAgICAgICAgICAgICAgICAgICBgLiBfX18KKyAgLy8gICAgICAgICAgICAgICAg
ICAgICBfXywnIF9fYC4gICAgICAgICAgICAgICAgXy4uLS0tLS4uLi5fX19fCisgIC8vICAgICAg
ICAgX18uLi4tLS4nYGA7LiAgICwuICAgO2BgLS0uLl9fICAgICAuJyAgICAsLS5fICAgIF8uLScK
KyAgLy8gICBfLi4tJyctLS0tLS0tJyAgIGAnICAgYCcgICBgJyAgICAgTyBgYC0nJy5fICAgKCw7
JykgXywnCisgIC8vICwnX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAg
XGAtLl9gLScsJworICAvLyAgYC5fICAgICAgICAgICAgICBgYGBgYGBgYGBgYC0tLS0tLS4uLl9f
XyAgICctLi5fJy06CisgIC8vICAgICBgYGAtLS4uXyAgICAgICwuICAgICAgICAgICAgICAgICAg
ICAgYGBgYC0tLi4uX19cLS4KKyAgLy8gICAgICAgICAgICAgYC4tLS4gYC1gICJJTkZJTklUWSBJ
UyBMRVNTICAgICBfX19fICAgIHwgIHxgCisgIC8vICAgICAgICAgICAgICAgYC4gYC4gICBUSEFO
IEJFWU9ORCIgICAgICAgICwnYGBgYGAuICA7ICA7YAorICAvLyAgICAgICAgICAgICAgICAgYC5f
YC4gICAgICAgIF9fX19fX19fX18gICBgLiAgICAgIFwnX18vYAorICAvLyAgICAgICAgICAgICAg
ICAgICAgYC06Ll9fX19fL19fX19fXy9fX18vX19fX2AuICAgICBcICBgCisgIC8vICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIGAuXyAgICBgLiAgICBcCisgIC8vICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBgLl9fX19fX19fX2AtLiAgIGAuICAgYC5fX18KKyAg
Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1N0ICBgLS0t
LS0tJ2AKKyAgZnVuY3Rpb24gc3BhY2VzaGlwKGEsIGIpIHsKKyAgICB2YXIgZGlmZiA9IGEgLSBi
OworICAgIHJldHVybiAoZGlmZiA+IDApIC0gKGRpZmYgPCAwKTsKKyAgfQorCisgIC8qKgorICAg
Q29tcGFyZXMgdHdvIGphdmFzY3JpcHQgdmFsdWVzIGFuZCByZXR1cm5zOgorICAKKyAgICAtIC0x
IGlmIHRoZSBmaXJzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwKKyAgICAtIDAgaWYgYm90
aCBhcmUgZXF1YWwsCisgICAgLSAxIGlmIHRoZSBmaXJzdCBpcyBncmVhdGVyIHRoYW4gdGhlIHNl
Y29uZC4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywg
J2hlbGxvJyk7ICAvLyAwCisgICAgRW1iZXIuY29tcGFyZSgnYWJjJywgJ2RmZycpOyAgICAgIC8v
IC0xCisgICAgRW1iZXIuY29tcGFyZSgyLCAxKTsgICAgICAgICAgICAgIC8vIDEKKyAgICBgYGAK
KyAgCisgICBJZiB0aGUgdHlwZXMgb2YgdGhlIHR3byBvYmplY3RzIGFyZSBkaWZmZXJlbnQgcHJl
Y2VkZW5jZSBvY2N1cnMgaW4gdGhlCisgICBmb2xsb3dpbmcgb3JkZXIsIHdpdGggdHlwZXMgZWFy
bGllciBpbiB0aGUgbGlzdCBjb25zaWRlcmVkIGA8YCB0eXBlcworICAgbGF0ZXIgaW4gdGhlIGxp
c3Q6CisgIAorICAgIC0gdW5kZWZpbmVkCisgICAgLSBudWxsCisgICAgLSBib29sZWFuCisgICAg
LSBudW1iZXIKKyAgICAtIHN0cmluZworICAgIC0gYXJyYXkKKyAgICAtIG9iamVjdAorICAgIC0g
aW5zdGFuY2UKKyAgICAtIGZ1bmN0aW9uCisgICAgLSBjbGFzcworICAgIC0gZGF0ZQorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgRW1iZXIuY29tcGFyZSgnaGVsbG8nLCA1MCk7ICAgICAgIC8v
IDEKKyAgICBFbWJlci5jb21wYXJlKDUwLCAnaGVsbG8nKTsgICAgICAgLy8gLTEKKyAgICBgYGAK
KyAgCisgICBAbWV0aG9kIGNvbXBhcmUKKyAgIEBmb3IgRW1iZXIKKyAgIEBwYXJhbSB7T2JqZWN0
fSB2IEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUKKyAgIEBwYXJhbSB7T2JqZWN0fSB3IFNlY29uZCB2
YWx1ZSB0byBjb21wYXJlCisgICBAcmV0dXJuIHtOdW1iZXJ9IC0xIGlmIHYgPCB3LCAwIGlmIHYg
PSB3IGFuZCAxIGlmIHYgPiB3LgorICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvbXBh
cmUodiwgdykgeworICAgIGlmICh2ID09PSB3KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisK
KyAgICB2YXIgdHlwZTEgPSBfZW1iZXJSdW50aW1lVXRpbHMudHlwZU9mKHYpOworICAgIHZhciB0
eXBlMiA9IF9lbWJlclJ1bnRpbWVVdGlscy50eXBlT2Yodyk7CisKKyAgICBpZiAoX2VtYmVyUnVu
dGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdCkgeworICAgICAgaWYgKHR5cGUxID09PSAnaW5z
dGFuY2UnICYmIF9lbWJlclJ1bnRpbWVNaXhpbnNDb21wYXJhYmxlLmRlZmF1bHQuZGV0ZWN0KHYp
ICYmIHYuY29uc3RydWN0b3IuY29tcGFyZSkgeworICAgICAgICByZXR1cm4gdi5jb25zdHJ1Y3Rv
ci5jb21wYXJlKHYsIHcpOworICAgICAgfQorCisgICAgICBpZiAodHlwZTIgPT09ICdpbnN0YW5j
ZScgJiYgX2VtYmVyUnVudGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdC5kZXRlY3QodykgJiYg
dy5jb25zdHJ1Y3Rvci5jb21wYXJlKSB7CisgICAgICAgIHJldHVybiB3LmNvbnN0cnVjdG9yLmNv
bXBhcmUodywgdikgKiAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgcmVzID0gc3BhY2Vz
aGlwKFRZUEVfT1JERVJbdHlwZTFdLCBUWVBFX09SREVSW3R5cGUyXSk7CisKKyAgICBpZiAocmVz
ICE9PSAwKSB7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHR5cGVzIGFyZSBl
cXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5vdworICAgIHN3aXRjaCAodHlwZTEp
IHsKKyAgICAgIGNhc2UgJ2Jvb2xlYW4nOgorICAgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgICAg
cmV0dXJuIHNwYWNlc2hpcCh2LCB3KTsKKworICAgICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAg
cmV0dXJuIHNwYWNlc2hpcCh2LmxvY2FsZUNvbXBhcmUodyksIDApOworCisgICAgICBjYXNlICdh
cnJheSc6CisgICAgICAgIHZhciB2TGVuID0gdi5sZW5ndGg7CisgICAgICAgIHZhciB3TGVuID0g
dy5sZW5ndGg7CisgICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2TGVuLCB3TGVuKTsKKworICAg
ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgdmFyIHIgPSBj
b21wYXJlKHZbaV0sIHdbaV0pOworICAgICAgICAgIGlmIChyICE9PSAwKSB7CisgICAgICAgICAg
ICByZXR1cm4gcjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGwgZWxl
bWVudHMgYXJlIGVxdWFsIG5vdworICAgICAgICAvLyBzaG9ydGVyIGFycmF5IHNob3VsZCBiZSBv
cmRlcmVkIGZpcnN0CisgICAgICAgIHJldHVybiBzcGFjZXNoaXAodkxlbiwgd0xlbik7CisKKyAg
ICAgIGNhc2UgJ2luc3RhbmNlJzoKKyAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVNaXhpbnNDb21w
YXJhYmxlLmRlZmF1bHQgJiYgX2VtYmVyUnVudGltZU1peGluc0NvbXBhcmFibGUuZGVmYXVsdC5k
ZXRlY3QodikpIHsKKyAgICAgICAgICByZXR1cm4gdi5jb21wYXJlKHYsIHcpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiAwOworCisgICAgICBjYXNlICdkYXRlJzoKKyAgICAgICAgcmV0dXJu
IHNwYWNlc2hpcCh2LmdldFRpbWUoKSwgdy5nZXRUaW1lKCkpOworCisgICAgICBkZWZhdWx0Ogor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1l
L2NvbXB1dGVkL3JlZHVjZV9jb21wdXRlZF9tYWNyb3MnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVy
LXJ1bnRpbWUvY29tcGFyZScsICdlbWJlci1ydW50aW1lL3V0aWxzJywgJ2VtYmVyLXJ1bnRpbWUv
c3lzdGVtL25hdGl2ZV9hcnJheScsICdlbWJlci1tZXRhbC9pc19ub25lJywgJ2VtYmVyLW1ldGFs
L2dldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2VtcHR5X29iamVjdCcsICdlbWJlci1tZXRh
bC91dGlscycsICdlbWJlci1tZXRhbC93ZWFrX21hcCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2Vt
YmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsRXJyb3Is
IF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlclJ1bnRpbWVD
b21wYXJlLCBfZW1iZXJSdW50aW1lVXRpbHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJy
YXksIF9lbWJlck1ldGFsSXNfbm9uZSwgX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcywgX2VtYmVy
TWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsV2Vha19tYXAp
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisg
ICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuc3VtID0gc3VtOworICBleHBvcnRz
Lm1heCA9IG1heDsKKyAgZXhwb3J0cy5taW4gPSBtaW47CisgIGV4cG9ydHMubWFwID0gbWFwOwor
ICBleHBvcnRzLm1hcEJ5ID0gbWFwQnk7CisgIGV4cG9ydHMuZmlsdGVyID0gZmlsdGVyOworICBl
eHBvcnRzLmZpbHRlckJ5ID0gZmlsdGVyQnk7CisgIGV4cG9ydHMudW5pcSA9IHVuaXE7CisgIGV4
cG9ydHMudW5pcUJ5ID0gdW5pcUJ5OworICBleHBvcnRzLmludGVyc2VjdCA9IGludGVyc2VjdDsK
KyAgZXhwb3J0cy5zZXREaWZmID0gc2V0RGlmZjsKKyAgZXhwb3J0cy5jb2xsZWN0ID0gY29sbGVj
dDsKKyAgZXhwb3J0cy5zb3J0ID0gc29ydDsKKworICBmdW5jdGlvbiByZWR1Y2VNYWNybyhkZXBl
bmRlbnRLZXksIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0
YWxDb21wdXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXkgKyAnLltdJywgZnVuY3Rpb24gKCkgewor
ICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdmFyIGFyciA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOworCisgICAgICBpZiAoYXJyID09PSBu
dWxsIHx8IHR5cGVvZiBhcnIgIT09ICdvYmplY3QnKSB7CisgICAgICAgIHJldHVybiBpbml0aWFs
VmFsdWU7CisgICAgICB9CisKKyAgICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChwcmV2
aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGluZGV4LCBhcnJheSkgeworICAgICAgICByZXR1cm4g
Y2FsbGJhY2suY2FsbChfdGhpcywgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlLCBpbmRleCwg
YXJyYXkpOworICAgICAgfSwgaW5pdGlhbFZhbHVlKTsKKyAgICB9KS5yZWFkT25seSgpOworICB9
CisKKyAgZnVuY3Rpb24gYXJyYXlNYWNybyhkZXBlbmRlbnRLZXksIGNhbGxiYWNrKSB7CisgICAg
Ly8gVGhpcyBpcyBhIGJpdCB1Z2x5CisgICAgdmFyIHByb3BlcnR5TmFtZTsKKyAgICBpZiAoL0Bl
YWNoLy50ZXN0KGRlcGVuZGVudEtleSkpIHsKKyAgICAgIHByb3BlcnR5TmFtZSA9IGRlcGVuZGVu
dEtleS5yZXBsYWNlKC9cLkBlYWNoLiokLywgJycpOworICAgIH0gZWxzZSB7CisgICAgICBwcm9w
ZXJ0eU5hbWUgPSBkZXBlbmRlbnRLZXk7CisgICAgICBkZXBlbmRlbnRLZXkgKz0gJy5bXSc7Cisg
ICAgfQorCisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZGVwZW5kZW50
S2V5LCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgcHJvcGVydHlOYW1lKTsKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRp
bHMuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXkuQShjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlKSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKCk7Cisg
ICAgICB9CisgICAgfSkucmVhZE9ubHkoKTsKKyAgfQorCisgIGZ1bmN0aW9uIG11bHRpQXJyYXlN
YWNybyhkZXBlbmRlbnRLZXlzLCBjYWxsYmFjaykgeworICAgIHZhciBhcmdzID0gZGVwZW5kZW50
S2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeworICAgICAgcmV0dXJuIGtleSArICcuW10nOworICAg
IH0pOworCisgICAgYXJncy5wdXNoKGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJS
dW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoY2FsbGJhY2suY2FsbCh0aGlzLCBkZXBlbmRlbnRL
ZXlzKSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRl
ZC5hcHBseSh0aGlzLCBhcmdzKS5yZWFkT25seSgpOworICB9CisKKyAgLyoqCisgICAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzCisgICAgaW4g
dGhlIGRlcGVuZGVudCBhcnJheS4KKyAgCisgICAgQG1ldGhvZCBzdW0KKyAgICBAZm9yIEVtYmVy
LmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHZhbHVlcyBp
biB0aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyAgICBAc2luY2UgMS40LjAKKyAgICBAcHVibGlj
CisgICovCisKKyAgZnVuY3Rpb24gc3VtKGRlcGVuZGVudEtleSkgeworICAgIHJldHVybiByZWR1
Y2VNYWNybyhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uIChzdW0sIGl0ZW0pIHsKKyAgICAgIHJldHVy
biBzdW0gKyBpdGVtOworICAgIH0sIDApOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBw
cm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlCisgICAgZGVw
ZW5kZW50IGFycmF5LiBUaGlzIHdpbGwgcmV0dXJuIGAtSW5maW5pdHlgIHdoZW4gdGhlIGRlcGVu
ZGVudAorICAgIGFycmF5IGlzIGVtcHR5LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFy
IFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgY2hpbGRBZ2VzOiBFbWJlci5j
b21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJyksCisgICAgICBtYXhDaGlsZEFnZTogRW1i
ZXIuY29tcHV0ZWQubWF4KCdjaGlsZEFnZXMnKQorICAgIH0pOworICAKKyAgICB2YXIgbG9yZEJ5
cm9uID0gUGVyc29uLmNyZWF0ZSh7IGNoaWxkcmVuOiBbXSB9KTsKKyAgCisgICAgbG9yZEJ5cm9u
LmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gLUluZmluaXR5CisgICAgbG9yZEJ5cm9uLmdldCgnY2hp
bGRyZW4nKS5wdXNoT2JqZWN0KHsKKyAgICAgIG5hbWU6ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFn
ZTogNworICAgIH0pOworICAgIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIDcKKyAg
ICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7CisgICAgICBuYW1lOiAn
QWxsZWdyYSBCeXJvbicsCisgICAgICBhZ2U6IDUKKyAgICB9LCB7CisgICAgICBuYW1lOiAnRWxp
emFiZXRoIE1lZG9yYSBMZWlnaCcsCisgICAgICBhZ2U6IDgKKyAgICB9XSk7CisgICAgbG9yZEJ5
cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gOAorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1h
eAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50
S2V5CisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgdGhlIGxh
cmdlc3QgdmFsdWUgaW4gdGhlIGRlcGVuZGVudEtleSdzIGFycmF5CisgICAgQHB1YmxpYworICAq
LworCisgIGZ1bmN0aW9uIG1heChkZXBlbmRlbnRLZXkpIHsKKyAgICByZXR1cm4gcmVkdWNlTWFj
cm8oZGVwZW5kZW50S2V5LCBmdW5jdGlvbiAobWF4LCBpdGVtKSB7CisgICAgICByZXR1cm4gTWF0
aC5tYXgobWF4LCBpdGVtKTsKKyAgICB9LCAtSW5maW5pdHkpOworICB9CisKKyAgLyoqCisgICAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgaW4g
dGhlCisgICAgZGVwZW5kZW50IGFycmF5LiBUaGlzIHdpbGwgcmV0dXJuIGBJbmZpbml0eWAgd2hl
biB0aGUgZGVwZW5kZW50CisgICAgYXJyYXkgaXMgZW1wdHkuCisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBjaGlsZEFn
ZXM6IEVtYmVyLmNvbXB1dGVkLm1hcEJ5KCdjaGlsZHJlbicsICdhZ2UnKSwKKyAgICAgIG1pbkNo
aWxkQWdlOiBFbWJlci5jb21wdXRlZC5taW4oJ2NoaWxkQWdlcycpCisgICAgfSk7CisgIAorICAg
IHZhciBsb3JkQnlyb24gPSBQZXJzb24uY3JlYXRlKHsgY2hpbGRyZW46IFtdIH0pOworICAKKyAg
ICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScpOyAvLyBJbmZpbml0eQorICAgIGxvcmRCeXJv
bi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7CisgICAgICBuYW1lOiAnQXVndXN0YSBBZGEg
Qnlyb24nLCBhZ2U6IDcKKyAgICB9KTsKKyAgICBsb3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScp
OyAvLyA3CisgICAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbeworICAg
ICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgICAgYWdlOiA1CisgICAgfSwgeworICAgICAg
bmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgICAgYWdlOiA4CisgICAgfV0pOwor
ICAgIGxvcmRCeXJvbi5nZXQoJ21pbkNoaWxkQWdlJyk7IC8vIDUKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBtaW4KKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9
IGRlcGVuZGVudEtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1
dGVzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiB0aGUgZGVwZW5kZW50S2V5J3MgYXJyYXkKKyAgICBA
cHVibGljCisgICovCisKKyAgZnVuY3Rpb24gbWluKGRlcGVuZGVudEtleSkgeworICAgIHJldHVy
biByZWR1Y2VNYWNybyhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uIChtaW4sIGl0ZW0pIHsKKyAgICAg
IHJldHVybiBNYXRoLm1pbihtaW4sIGl0ZW0pOworICAgIH0sIEluZmluaXR5KTsKKyAgfQorCisg
IC8qKgorICAgIFJldHVybnMgYW4gYXJyYXkgbWFwcGVkIHZpYSB0aGUgY2FsbGJhY2sKKyAgCisg
ICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93
aW5nIHNpZ25hdHVyZS4KKyAgICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRl
cmF0aW9uLgorICAgIGBpbmRleGAgaXMgdGhlIGludGVnZXIgaW5kZXggb2YgdGhlIGN1cnJlbnQg
aXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rp
b24oaXRlbSwgaW5kZXgpOworICAgIGBgYAorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
ZXhjaXRpbmdDaG9yZXM6IEVtYmVyLmNvbXB1dGVkLm1hcCgnY2hvcmVzJywgZnVuY3Rpb24oY2hv
cmUsIGluZGV4KSB7CisgICAgICAgIHJldHVybiBjaG9yZS50b1VwcGVyQ2FzZSgpICsgJyEnOwor
ICAgICAgfSkKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7
CisgICAgICBjaG9yZXM6IFsnY2xlYW4nLCAnd3JpdGUgbW9yZSB1bml0IHRlc3RzJ10KKyAgICB9
KTsKKyAgCisgICAgaGFtc3Rlci5nZXQoJ2V4Y2l0aW5nQ2hvcmVzJyk7IC8vIFsnQ0xFQU4hJywg
J1dSSVRFIE1PUkUgVU5JVCBURVNUUyEnXQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIG1hcAor
ICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5
CisgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBwZWQgdmlhIHRoZSBjYWxsYmFjaworICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBtYXAoZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgeworICAg
IHJldHVybiBhcnJheU1hY3JvKGRlcGVuZGVudEtleSwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAg
ICByZXR1cm4gdmFsdWUubWFwKGNhbGxiYWNrLCB0aGlzKTsKKyAgICB9KTsKKyAgfQorCisgIC8q
KgorICAgIFJldHVybnMgYW4gYXJyYXkgbWFwcGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
eworICAgICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdl
JykKKyAgICB9KTsKKyAgCisgICAgdmFyIGxvcmRCeXJvbiA9IFBlcnNvbi5jcmVhdGUoeyBjaGls
ZHJlbjogW10gfSk7CisgIAorICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbXQor
ICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7IG5hbWU6ICdBdWd1c3Rh
IEFkYSBCeXJvbicsIGFnZTogNyB9KTsKKyAgICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsg
Ly8gWzddCisgICAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbeworICAg
ICAgbmFtZTogJ0FsbGVncmEgQnlyb24nLAorICAgICAgYWdlOiA1CisgICAgfSwgeworICAgICAg
bmFtZTogJ0VsaXphYmV0aCBNZWRvcmEgTGVpZ2gnLAorICAgICAgYWdlOiA4CisgICAgfV0pOwor
ICAgIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbNywgNSwgOF0KKyAgICBgYGAKKyAg
CisgICAgQG1ldGhvZCBtYXBCeQorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0g
e1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5Cisg
ICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gYW4gYXJyYXkgbWFwcGVkIHRvIHRo
ZSBzcGVjaWZpZWQga2V5CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIG1hcEJ5KGRl
cGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
RW1iZXIuY29tcHV0ZWQubWFwQnkgZXhwZWN0cyBhIHByb3BlcnR5IHN0cmluZyBmb3IgaXRzIHNl
Y29uZCBhcmd1bWVudCwgJyArICdwZXJoYXBzIHlvdSBtZWFudCB0byB1c2UgIm1hcCInLCB0eXBl
b2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnKTsKKworICAgIHJldHVybiBtYXAoZGVwZW5kZW50
S2V5ICsgJy5AZWFjaC4nICsgcHJvcGVydHlLZXksIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICBy
ZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsKKyAg
ICB9KTsKKyAgfQorCisgIC8qKgorICAgIEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBjYWxsYmFj
ay4KKyAgCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0
aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4KKyAgICBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBp
biB0aGUgaXRlcmF0aW9uLgorICAgIGBpbmRleGAgaXMgdGhlIGludGVnZXIgaW5kZXggb2YgdGhl
IGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgIGBhcnJheWAgaXMgdGhlIGRlcGVu
ZGFudCBhcnJheSBpdHNlbGYuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBmdW5jdGlvbihp
dGVtLCBpbmRleCwgYXJyYXkpOworICAgIGBgYAorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAg
dmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgIHJlbWFpbmluZ0Nob3Jl
czogRW1iZXIuY29tcHV0ZWQuZmlsdGVyKCdjaG9yZXMnLCBmdW5jdGlvbihjaG9yZSwgaW5kZXgs
IGFycmF5KSB7CisgICAgICAgIHJldHVybiAhY2hvcmUuZG9uZTsKKyAgICAgIH0pCisgICAgfSk7
CisgIAorICAgIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoeworICAgICAgY2hvcmVzOiBb
CisgICAgICAgIHsgbmFtZTogJ2Nvb2snLCBkb25lOiB0cnVlIH0sCisgICAgICAgIHsgbmFtZTog
J2NsZWFuJywgZG9uZTogdHJ1ZSB9LAorICAgICAgICB7IG5hbWU6ICd3cml0ZSBtb3JlIHVuaXQg
dGVzdHMnLCBkb25lOiBmYWxzZSB9CisgICAgICBdCisgICAgfSk7CisgIAorICAgIGhhbXN0ZXIu
Z2V0KCdyZW1haW5pbmdDaG9yZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3Rz
JywgZG9uZTogZmFsc2V9XQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbHRlcgorICAgIEBm
b3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5CisgICAg
QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFBy
b3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rp
b24gZmlsdGVyKGRlcGVuZGVudEtleSwgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gYXJyYXlNYWNy
byhkZXBlbmRlbnRLZXksIGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlLmZp
bHRlcihjYWxsYmFjaywgdGhpcyk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBGaWx0ZXJz
IHRoZSBhcnJheSBieSB0aGUgcHJvcGVydHkgYW5kIHZhbHVlCisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgcmVtYWlu
aW5nQ2hvcmVzOiBFbWJlci5jb21wdXRlZC5maWx0ZXJCeSgnY2hvcmVzJywgJ2RvbmUnLCBmYWxz
ZSkKKyAgICB9KTsKKyAgCisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAg
ICBjaG9yZXM6IFsKKyAgICAgICAgeyBuYW1lOiAnY29vaycsIGRvbmU6IHRydWUgfSwKKyAgICAg
ICAgeyBuYW1lOiAnY2xlYW4nLCBkb25lOiB0cnVlIH0sCisgICAgICAgIHsgbmFtZTogJ3dyaXRl
IG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6IGZhbHNlIH0KKyAgICAgIF0KKyAgICB9KTsKKyAgCisg
ICAgaGFtc3Rlci5nZXQoJ3JlbWFpbmluZ0Nob3JlcycpOyAvLyBbeyBuYW1lOiAnd3JpdGUgbW9y
ZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2UgfV0KKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBm
aWx0ZXJCeQorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5CisgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5CisgICAgQHBhcmFtIHsq
fSB2YWx1ZQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoZSBmaWx0ZXJl
ZCBhcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiBmaWx0ZXJCeShkZXBlbmRl
bnRLZXksIHByb3BlcnR5S2V5LCB2YWx1ZSkgeworICAgIHZhciBjYWxsYmFjazsKKworICAgIGlm
IChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CisgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChp
dGVtKSB7CisgICAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbSwg
cHJvcGVydHlLZXkpOworICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgY2FsbGJhY2sgPSBm
dW5jdGlvbiAoaXRlbSkgeworICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KGl0ZW0sIHByb3BlcnR5S2V5KSA9PT0gdmFsdWU7CisgICAgICB9OworICAgIH0KKworICAg
IHJldHVybiBmaWx0ZXIoZGVwZW5kZW50S2V5ICsgJy5AZWFjaC4nICsgcHJvcGVydHlLZXksIGNh
bGxiYWNrKTsKKyAgfQorCisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0
dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgdW5pcXVlCisgICAgZWxlbWVudHMgZnJvbSBv
bmUgb3IgbW9yZSBkZXBlbmRlbnQgYXJyYXlzLgorICAKKyAgICBFeGFtcGxlCisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAg
ICAgdW5pcXVlRnJ1aXRzOiBFbWJlci5jb21wdXRlZC51bmlxKCdmcnVpdHMnKQorICAgIH0pOwor
ICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKHsKKyAgICAgIGZydWl0czogWwor
ICAgICAgICAnYmFuYW5hJywKKyAgICAgICAgJ2dyYXBlJywKKyAgICAgICAgJ2thbGUnLAorICAg
ICAgICAnYmFuYW5hJworICAgICAgXQorICAgIH0pOworICAKKyAgICBoYW1zdGVyLmdldCgndW5p
cXVlRnJ1aXRzJyk7IC8vIFsnYmFuYW5hJywgJ2dyYXBlJywgJ2thbGUnXQorICAgIGBgYAorICAK
KyAgICBAbWV0aG9kIHVuaXEKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtT
dHJpbmd9IHByb3BlcnR5S2V5KgorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9
IGNvbXB1dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHVuaXF1ZSBlbGVtZW50cyBm
cm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24g
dW5pcSgpIHsKKyAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFy
cmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgYXJnc1tf
a2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICB9CisKKyAgICByZXR1cm4gbXVsdGlBcnJheU1h
Y3JvKGFyZ3MsIGZ1bmN0aW9uIChkZXBlbmRlbnRLZXlzKSB7CisgICAgICB2YXIgX3RoaXMyID0g
dGhpczsKKworICAgICAgdmFyIHVuaXEgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKworICAgICAgZGVwZW5kZW50S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChkZXBlbmRlbnRL
ZXkpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KF90
aGlzMiwgZGVwZW5kZW50S2V5KTsKKyAgICAgICAgaWYgKF9lbWJlclJ1bnRpbWVVdGlscy5pc0Fy
cmF5KHZhbHVlKSkgeworICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsK
KyAgICAgICAgICAgIGlmICh1bmlxLmluZGV4T2YoaXRlbSkgPT09IC0xKSB7CisgICAgICAgICAg
ICAgIHVuaXEucHVzaChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAg
ICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiB1bmlxOworICAgIH0pOworICB9CisKKyAg
LyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdp
dGggYWxsIHRoZSB1bmlxdWUKKyAgICBlbGVtZW50cyBmcm9tIGFuIGFycmF5LCB3aXRoIHVuaXF1
ZW5lc3MgZGV0ZXJtaW5lZCBieSBzcGVjaWZpYyBrZXkuCisgICAgRXhhbXBsZQorICAgIGBgYGph
dmFzY3JpcHQKKyAgICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAg
dW5pcXVlRnJ1aXRzOiBFbWJlci5jb21wdXRlZC51bmlxQnkoJ2ZydWl0cycsICdpZCcpCisgICAg
fSk7CisgICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAgICBmcnVpdHM6IFsK
KyAgICAgICAgeyBpZDogMSwgJ2JhbmFuYScgfSwKKyAgICAgICAgeyBpZDogMiwgJ2dyYXBlJyB9
LAorICAgICAgICB7IGlkOiAzLCAncGVhY2gnIH0sCisgICAgICAgIHsgaWQ6IDEsICdiYW5hbmEn
IH0KKyAgICAgIF0KKyAgICB9KTsKKyAgICBoYW1zdGVyLmdldCgndW5pcXVlRnJ1aXRzJyk7IC8v
IFsgeyBpZDogMSwgJ2JhbmFuYScgfSwgeyBpZDogMiwgJ2dyYXBlJyB9LCB7IGlkOiAzLCAncGVh
Y2gnIH1dCisgICAgYGBgCisgICAgQG1ldGhvZCB1bmlxQnkKKyAgICBAZm9yIEVtYmVyLmNvbXB1
dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQorICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wZXJ0eUtleQorICAgIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1
dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRo
ZSBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gdW5pcUJ5
KGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZChkZXBlbmRlbnRLZXkgKyAnLltdJywgZnVuY3Rpb24gKCkgeworICAgICAg
dmFyIHVuaXEgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIHZh
ciBzZWVuID0gbmV3IF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LmRlZmF1bHQoKTsKKyAgICAgIHZh
ciBsaXN0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7
CisgICAgICBpZiAoX2VtYmVyUnVudGltZVV0aWxzLmlzQXJyYXkobGlzdCkpIHsKKyAgICAgICAg
bGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgdmFyIGd1aWQgPSBfZW1i
ZXJNZXRhbFV0aWxzLmd1aWRGb3IoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGl0ZW0sIHBy
b3BlcnR5S2V5KSk7CisgICAgICAgICAgaWYgKCEoZ3VpZCBpbiBzZWVuKSkgeworICAgICAgICAg
ICAgc2VlbltndWlkXSA9IHRydWU7CisgICAgICAgICAgICB1bmlxLnB1c2goaXRlbSk7CisgICAg
ICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB1bmlxOworICAgIH0p
LnJlYWRPbmx5KCk7CisgIH0KKworICAvKioKKyAgICBBbGlhcyBmb3IgW0VtYmVyLmNvbXB1dGVk
LnVuaXFdKC9hcGkvI21ldGhvZF9jb21wdXRlZF91bmlxKS4KKyAgCisgICAgQG1ldGhvZCB1bmlv
bgorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlL
ZXkqCisgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcg
YXJyYXkgd2l0aCBhbGwgdGhlCisgICAgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVuZGVu
dCBhcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIHVuaW9uID0gdW5pcTsKKworICBleHBv
cnRzLnVuaW9uID0gdW5pb247CisgIC8qKgorICAgIEEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gg
cmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgZHVwbGljYXRlZAorICAgIGVsZW1lbnRz
IGZyb20gdHdvIG9yIG1vcmUgZGVwZW5kZW50IGFycmF5cy4KKyAgCisgICAgRXhhbXBsZQorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIG9iaiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewor
ICAgICAgZnJpZW5kc0luQ29tbW9uOiBFbWJlci5jb21wdXRlZC5pbnRlcnNlY3QoJ2FkYUZyaWVu
ZHMnLCAnY2hhcmxlc0ZyaWVuZHMnKQorICAgIH0pLmNyZWF0ZSh7CisgICAgICBhZGFGcmllbmRz
OiBbJ0NoYXJsZXMgQmFiYmFnZScsICdKb2huIEhvYmhvdXNlJywgJ1dpbGxpYW0gS2luZycsICdN
YXJ5IFNvbWVydmlsbGUnXSwKKyAgICAgIGNoYXJsZXNGcmllbmRzOiBbJ1dpbGxpYW0gS2luZycs
ICdNYXJ5IFNvbWVydmlsbGUnLCAnQWRhIExvdmVsYWNlJywgJ0dlb3JnZSBQZWFjb2NrJ10KKyAg
ICB9KTsKKyAgCisgICAgb2JqLmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsnV2lsbGlhbSBL
aW5nJywgJ01hcnkgU29tZXJ2aWxsZSddCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgaW50ZXJz
ZWN0CisgICAgQGZvciBFbWJlci5jb21wdXRlZAorICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0
eUtleSoKKyAgICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5l
dyBhcnJheSB3aXRoIGFsbCB0aGUKKyAgICBkdXBsaWNhdGVkIGVsZW1lbnRzIGZyb20gdGhlIGRl
cGVuZGVudCBhcnJheXMKKyAgICBAcHVibGljCisgICovCisKKyAgZnVuY3Rpb24gaW50ZXJzZWN0
KCkgeworICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5
KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICBhcmdz
W19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgfQorCisgICAgcmV0dXJuIG11bHRpQXJy
YXlNYWNybyhhcmdzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5cykgeworICAgICAgdmFyIF90aGlz
MyA9IHRoaXM7CisKKyAgICAgIHZhciBhcnJheXMgPSBkZXBlbmRlbnRLZXlzLm1hcChmdW5jdGlv
biAoZGVwZW5kZW50S2V5KSB7CisgICAgICAgIHZhciBhcnJheSA9IF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LmdldChfdGhpczMsIGRlcGVuZGVudEtleSk7CisKKyAgICAgICAgcmV0dXJuIF9lbWJl
clJ1bnRpbWVVdGlscy5pc0FycmF5KGFycmF5KSA/IGFycmF5IDogW107CisgICAgICB9KTsKKwor
ICAgICAgdmFyIHJlc3VsdHMgPSBhcnJheXMucG9wKCkuZmlsdGVyKGZ1bmN0aW9uIChjYW5kaWRh
dGUpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICB2YXIgYXJyYXkgPSBhcnJh
eXNbaV07CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykg
eworICAgICAgICAgICAgaWYgKGFycmF5W2pdID09PSBjYW5kaWRhdGUpIHsKKyAgICAgICAgICAg
ICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYXRp
dmVfYXJyYXkuQShyZXN1bHRzKTsKKyAgICB9KTsKKyAgfQorCisgIC8qKgorICAgIEEgY29tcHV0
ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKKyAgICBw
cm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0aGF0IGFyZSBub3QgaW4g
dGhlIHNlY29uZAorICAgIGRlcGVuZGVudCBhcnJheS4KKyAgCisgICAgRXhhbXBsZQorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
KyAgICAgIGxpa2VzOiBbJ2JhbmFuYScsICdncmFwZScsICdrYWxlJ10sCisgICAgICB3YW50czog
RW1iZXIuY29tcHV0ZWQuc2V0RGlmZignbGlrZXMnLCAnZnJ1aXRzJykKKyAgICB9KTsKKyAgCisg
ICAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7CisgICAgICBmcnVpdHM6IFsKKyAgICAg
ICAgJ2dyYXBlJywKKyAgICAgICAgJ2thbGUnLAorICAgICAgXQorICAgIH0pOworICAKKyAgICBo
YW1zdGVyLmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEnXQorICAgIGBgYAorICAKKyAgICBAbWV0
aG9kIHNldERpZmYKKyAgICBAZm9yIEVtYmVyLmNvbXB1dGVkCisgICAgQHBhcmFtIHtTdHJpbmd9
IHNldEFQcm9wZXJ0eQorICAgIEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVydHkKKyAgICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFs
bCB0aGUKKyAgICBpdGVtcyBmcm9tIHRoZSBmaXJzdCBkZXBlbmRlbnQgYXJyYXkgdGhhdCBhcmUg
bm90IGluIHRoZSBzZWNvbmQKKyAgICBkZXBlbmRlbnQgYXJyYXkKKyAgICBAcHVibGljCisgICov
CisKKyAgZnVuY3Rpb24gc2V0RGlmZihzZXRBUHJvcGVydHksIHNldEJQcm9wZXJ0eSkgeworICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAyKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0
YWxFcnJvci5kZWZhdWx0KCdzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkgdHdvIGRlcGVuZGVudCBh
cnJheXMuJyk7CisgICAgfQorCisgICAgcmV0dXJuIF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0
ZWQoc2V0QVByb3BlcnR5ICsgJy5bXScsIHNldEJQcm9wZXJ0eSArICcuW10nLCBmdW5jdGlvbiAo
KSB7CisgICAgICB2YXIgc2V0QSA9IHRoaXMuZ2V0KHNldEFQcm9wZXJ0eSk7CisgICAgICB2YXIg
c2V0QiA9IHRoaXMuZ2V0KHNldEJQcm9wZXJ0eSk7CisKKyAgICAgIGlmICghX2VtYmVyUnVudGlt
ZVV0aWxzLmlzQXJyYXkoc2V0QSkpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0
ZW1OYXRpdmVfYXJyYXkuQSgpOworICAgICAgfQorICAgICAgaWYgKCFfZW1iZXJSdW50aW1lVXRp
bHMuaXNBcnJheShzZXRCKSkgeworICAgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbU5h
dGl2ZV9hcnJheS5BKHNldEEpOworICAgICAgfQorCisgICAgICByZXR1cm4gc2V0QS5maWx0ZXIo
ZnVuY3Rpb24gKHgpIHsKKyAgICAgICAgcmV0dXJuIHNldEIuaW5kZXhPZih4KSA9PT0gLTE7Cisg
ICAgICB9KTsKKyAgICB9KS5yZWFkT25seSgpOworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRl
ZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcworICAgIGZvciB0aGUg
cHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnRpZXMuCisgIAorICAgIEV4YW1wbGUKKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Cisg
ICAgICBjbG90aGVzOiBFbWJlci5jb21wdXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQnKQorICAg
IH0pOworICAKKyAgICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CisgIAorICAgIGhh
bXN0ZXIuZ2V0KCdjbG90aGVzJyk7IC8vIFtudWxsLCBudWxsXQorICAgIGhhbXN0ZXIuc2V0KCdo
YXQnLCAnQ2FtcCBIYXQnKTsKKyAgICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGlydCcp
OworICAgIGhhbXN0ZXIuZ2V0KCdjbG90aGVzJyk7IC8vIFsnQ2FtcCBIYXQnLCAnQ2FtcCBTaGly
dCddCisgICAgYGBgCisgIAorICAgIEBtZXRob2QgY29sbGVjdAorICAgIEBmb3IgRW1iZXIuY29t
cHV0ZWQKKyAgICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5KgorICAgIEByZXR1cm4ge0Vt
YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG1hcHMKKyAgICB2
YWx1ZXMgb2YgYWxsIHBhc3NlZCBpbiBwcm9wZXJ0aWVzIHRvIGFuIGFycmF5LgorICAgIEBwdWJs
aWMKKyAgKi8KKworICBmdW5jdGlvbiBjb2xsZWN0KCkgeworICAgIGZvciAodmFyIF9sZW4zID0g
YXJndW1lbnRzLmxlbmd0aCwgZGVwZW5kZW50S2V5cyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAw
OyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7CisgICAgICBkZXBlbmRlbnRLZXlzW19rZXkzXSA9
IGFyZ3VtZW50c1tfa2V5M107CisgICAgfQorCisgICAgcmV0dXJuIG11bHRpQXJyYXlNYWNybyhk
ZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcHJvcGVydGllcyA9IF9lbWJl
ck1ldGFsR2V0X3Byb3BlcnRpZXMuZGVmYXVsdCh0aGlzLCBkZXBlbmRlbnRLZXlzKTsKKyAgICAg
IHZhciByZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIGZv
ciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093
blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1
bHQocHJvcGVydGllc1trZXldKSkgeworICAgICAgICAgICAgcmVzLnB1c2gobnVsbCk7CisgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNba2V5XSk7Cisg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzOworICAgIH0p
OworICB9CisKKyAgLyoqCisgICAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEg
bmV3IGFycmF5IHdpdGggYWxsIHRoZQorICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVw
ZW5kZW50IGFycmF5IHNvcnRlZCBiYXNlZCBvbiBhIHByb3BlcnR5CisgICAgb3Igc29ydCBmdW5j
dGlvbi4KKyAgCisgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2
ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIGZ1
bmN0aW9uKGl0ZW1BLCBpdGVtQik7CisgICAgYGBgCisgIAorICAgIC0gYGl0ZW1BYCB0aGUgZmly
c3QgaXRlbSB0byBjb21wYXJlLgorICAgIC0gYGl0ZW1CYCB0aGUgc2Vjb25kIGl0ZW0gdG8gY29t
cGFyZS4KKyAgCisgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG5lZ2F0aXZlIG51bWJl
ciAoZS5nLiBgLTFgKSB3aGVuIGBpdGVtQWAgc2hvdWxkIGNvbWUgYmVmb3JlCisgICAgYGl0ZW1C
YC4gSXQgc2hvdWxkIHJldHVybiBwb3NpdGl2ZSBudW1iZXIgKGUuZy4gYDFgKSB3aGVuIGBpdGVt
QWAgc2hvdWxkIGNvbWUgYWZ0ZXIKKyAgICBgaXRlbUJgLiBJZiB0aGUgYGl0ZW1BYCBhbmQgYGl0
ZW1CYCBhcmUgZXF1YWwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGAwYC4KKyAgCisgICAg
VGhlcmVmb3JlLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBhcmluZyBzb21lIG51bWVyaWMgdmFs
dWVzLCBzaW1wbGUgYGl0ZW1BIC0gaXRlbUJgIG9yCisgICAgYGl0ZW1BLmdldCggJ2ZvbycgKSAt
IGl0ZW1CLmdldCggJ2ZvbycgKWAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBzZXJpZXMgb2YgYGlm
YC4KKyAgCisgICAgRXhhbXBsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIFRvRG9M
aXN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAvLyB1c2luZyBzdGFuZGFyZCBhc2Nl
bmRpbmcgc29ydAorICAgICAgdG9kb3NTb3J0aW5nOiBbJ25hbWUnXSwKKyAgICAgIHNvcnRlZFRv
ZG9zOiBFbWJlci5jb21wdXRlZC5zb3J0KCd0b2RvcycsICd0b2Rvc1NvcnRpbmcnKSwKKyAgCisg
ICAgICAvLyB1c2luZyBkZXNjZW5kaW5nIHNvcnQKKyAgICAgIHRvZG9zU29ydGluZ0Rlc2M6IFsn
bmFtZTpkZXNjJ10sCisgICAgICBzb3J0ZWRUb2Rvc0Rlc2M6IEVtYmVyLmNvbXB1dGVkLnNvcnQo
J3RvZG9zJywgJ3RvZG9zU29ydGluZ0Rlc2MnKSwKKyAgCisgICAgICAvLyB1c2luZyBhIGN1c3Rv
bSBzb3J0IGZ1bmN0aW9uCisgICAgICBwcmlvcml0eVRvZG9zOiBFbWJlci5jb21wdXRlZC5zb3J0
KCd0b2RvcycsIGZ1bmN0aW9uKGEsIGIpeworICAgICAgICBpZiAoYS5wcmlvcml0eSA+IGIucHJp
b3JpdHkpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhLnByaW9y
aXR5IDwgYi5wcmlvcml0eSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9KQorICAgIH0pOworICAKKyAgICB2YXIgdG9kb0xp
c3QgPSBUb0RvTGlzdC5jcmVhdGUoe3RvZG9zOiBbCisgICAgICB7IG5hbWU6ICdVbml0IFRlc3Qn
LCBwcmlvcml0eTogMiB9LAorICAgICAgeyBuYW1lOiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5
OiAzIH0sCisgICAgICB7IG5hbWU6ICdSZWxlYXNlJywgcHJpb3JpdHk6IDEgfQorICAgIF19KTsK
KyAgCisgICAgdG9kb0xpc3QuZ2V0KCdzb3J0ZWRUb2RvcycpOyAgICAgIC8vIFt7IG5hbWU6J0Rv
Y3VtZW50YXRpb24nLCBwcmlvcml0eTozIH0sIHsgbmFtZTonUmVsZWFzZScsIHByaW9yaXR5OjEg
fSwgeyBuYW1lOidVbml0IFRlc3QnLCBwcmlvcml0eToyIH1dCisgICAgdG9kb0xpc3QuZ2V0KCdz
b3J0ZWRUb2Rvc0Rlc2MnKTsgIC8vIFt7IG5hbWU6J1VuaXQgVGVzdCcsIHByaW9yaXR5OjIgfSwg
eyBuYW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MSB9LCB7IG5hbWU6J0RvY3VtZW50YXRpb24nLCBw
cmlvcml0eTozIH1dCisgICAgdG9kb0xpc3QuZ2V0KCdwcmlvcml0eVRvZG9zJyk7ICAgIC8vIFt7
IG5hbWU6J1JlbGVhc2UnLCBwcmlvcml0eToxIH0sIHsgbmFtZTonVW5pdCBUZXN0JywgcHJpb3Jp
dHk6MiB9LCB7IG5hbWU6J0RvY3VtZW50YXRpb24nLCBwcmlvcml0eTozIH1dCisgICAgYGBgCisg
IAorICAgIEBtZXRob2Qgc29ydAorICAgIEBmb3IgRW1iZXIuY29tcHV0ZWQKKyAgICBAcGFyYW0g
e1N0cmluZ30gaXRlbXNLZXkKKyAgICBAcGFyYW0ge1N0cmluZyBvciBGdW5jdGlvbn0gc29ydERl
ZmluaXRpb24gYSBkZXBlbmRlbnQga2V5IHRvIGFuCisgICAgYXJyYXkgb2Ygc29ydCBwcm9wZXJ0
aWVzIChhZGQgYDpkZXNjYCB0byB0aGUgYXJyYXlzIHNvcnQgcHJvcGVydGllcyB0byBzb3J0IGRl
c2NlbmRpbmcpIG9yIGEgZnVuY3Rpb24gdG8gdXNlIHdoZW4gc29ydGluZworICAgIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IHNvcnRlZCBhcnJheSBiYXNl
ZAorICAgIG9uIHRoZSBzb3J0IHByb3BlcnR5IGFycmF5IG9yIGNhbGxiYWNrIGZ1bmN0aW9uCisg
ICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIHNvcnQoaXRlbXNLZXksIHNvcnREZWZpbml0
aW9uKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLmNvbXB1dGVkLnNvcnQg
cmVxdWlyZXMgdHdvIGFyZ3VtZW50czogYW4gYXJyYXkga2V5IHRvIHNvcnQgYW5kICcgKyAnZWl0
aGVyIGEgc29ydCBwcm9wZXJ0aWVzIGtleSBvciBzb3J0IGZ1bmN0aW9uJywgYXJndW1lbnRzLmxl
bmd0aCA9PT0gMik7CisKKyAgICBpZiAodHlwZW9mIHNvcnREZWZpbml0aW9uID09PSAnZnVuY3Rp
b24nKSB7CisgICAgICByZXR1cm4gY3VzdG9tU29ydChpdGVtc0tleSwgc29ydERlZmluaXRpb24p
OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcHJvcGVydHlTb3J0KGl0ZW1zS2V5LCBzb3J0
RGVmaW5pdGlvbik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY3VzdG9tU29ydChpdGVtc0tl
eSwgY29tcGFyYXRvcikgeworICAgIHJldHVybiBhcnJheU1hY3JvKGl0ZW1zS2V5LCBmdW5jdGlv
biAodmFsdWUpIHsKKyAgICAgIHZhciBfdGhpczQgPSB0aGlzOworCisgICAgICByZXR1cm4gdmFs
dWUuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uICh4LCB5KSB7CisgICAgICAgIHJldHVybiBjb21wYXJh
dG9yLmNhbGwoX3RoaXM0LCB4LCB5KTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKyAgLy8g
VGhpcyBvbmUgbmVlZHMgdG8gZHluYW1pY2FsbHkgc2V0IHVwIGFuZCB0ZWFyIGRvd24gb2JzZXJ2
ZXJzIG9uIHRoZSBpdGVtc0tleQorICAvLyBkZXBlbmRpbmcgb24gdGhlIHNvcnRQcm9wZXJ0aWVz
CisgIGZ1bmN0aW9uIHByb3BlcnR5U29ydChpdGVtc0tleSwgc29ydFByb3BlcnRpZXNLZXkpIHsK
KyAgICB2YXIgY3AgPSBuZXcgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFByb3BlcnR5KGZ1
bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBfdGhpczUgPSB0aGlzOworCisgICAgICB2YXIgaXRl
bXNLZXlJc0F0VGhpcyA9IGl0ZW1zS2V5ID09PSAnQHRoaXMnOworICAgICAgdmFyIHNvcnRQcm9w
ZXJ0aWVzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIHNvcnRQcm9wZXJ0aWVz
S2V5KTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBzb3J0IGRlZmluaXRp
b24gZm9yIFwnJyArIGtleSArICdcJyBvbiAnICsgdGhpcyArICcgbXVzdCBiZSBhIGZ1bmN0aW9u
IG9yIGFuIGFycmF5IG9mIHN0cmluZ3MnLCBfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShzb3J0
UHJvcGVydGllcykgJiYgc29ydFByb3BlcnRpZXMuZXZlcnkoZnVuY3Rpb24gKHMpIHsKKyAgICAg
ICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJzsKKyAgICAgIH0pKTsKKworICAgICAgdmFy
IG5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcyA9IG5vcm1hbGl6ZVNvcnRQcm9wZXJ0aWVzKHNvcnRQ
cm9wZXJ0aWVzKTsKKworICAgICAgLy8gQWRkL3JlbW92ZSBwcm9wZXJ0eSBvYnNlcnZlcnMgYXMg
cmVxdWlyZWQuCisgICAgICB2YXIgYWN0aXZlT2JzZXJ2ZXJzTWFwID0gY3AuX2FjdGl2ZU9ic2Vy
dmVyTWFwIHx8IChjcC5fYWN0aXZlT2JzZXJ2ZXJNYXAgPSBuZXcgX2VtYmVyTWV0YWxXZWFrX21h
cC5kZWZhdWx0KCkpOworICAgICAgdmFyIGFjdGl2ZU9ic2VydmVycyA9IGFjdGl2ZU9ic2VydmVy
c01hcC5nZXQodGhpcyk7CisKKyAgICAgIGlmIChhY3RpdmVPYnNlcnZlcnMpIHsKKyAgICAgICAg
YWN0aXZlT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24gKGFyZ3MpIHsKKyAgICAgICAgICBfZW1i
ZXJNZXRhbE9ic2VydmVyLnJlbW92ZU9ic2VydmVyLmFwcGx5KG51bGwsIGFyZ3MpOworICAgICAg
ICB9KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc29ydFByb3BlcnR5RGlkQ2hhbmdlKCkg
eworICAgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKGtleSk7CisgICAgICB9CisKKyAg
ICAgIGFjdGl2ZU9ic2VydmVycyA9IG5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcy5tYXAoZnVuY3Rp
b24gKF9yZWYpIHsKKyAgICAgICAgdmFyIHByb3AgPSBfcmVmWzBdOworCisgICAgICAgIHZhciBw
YXRoID0gaXRlbXNLZXlJc0F0VGhpcyA/ICdAZWFjaC4nICsgcHJvcCA6IGl0ZW1zS2V5ICsgJy5A
ZWFjaC4nICsgcHJvcDsKKyAgICAgICAgdmFyIGFyZ3MgPSBbX3RoaXM1LCBwYXRoLCBzb3J0UHJv
cGVydHlEaWRDaGFuZ2VdOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9ic2VydmVy
LmFwcGx5KG51bGwsIGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICAgIH0pOworCisg
ICAgICBhY3RpdmVPYnNlcnZlcnNNYXAuc2V0KHRoaXMsIGFjdGl2ZU9ic2VydmVycyk7CisKKyAg
ICAgIC8vIFNvcnQgYW5kIHJldHVybiB0aGUgYXJyYXkuCisgICAgICB2YXIgaXRlbXMgPSBpdGVt
c0tleUlzQXRUaGlzID8gdGhpcyA6IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBp
dGVtc0tleSk7CisKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNBcnJheShpdGVtcykp
IHsKKyAgICAgICAgcmV0dXJuIHNvcnRCeU5vcm1hbGl6ZWRTb3J0UHJvcGVydGllcyhpdGVtcywg
bm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEoKTsKKyAgICAgIH0KKyAgICB9KTsK
KworICAgIGNwLl9hY3RpdmVPYnNlcnZlck1hcCA9IHVuZGVmaW5lZDsKKworICAgIHJldHVybiBj
cC5wcm9wZXJ0eShzb3J0UHJvcGVydGllc0tleSArICcuW10nKS5yZWFkT25seSgpOworICB9CisK
KyAgZnVuY3Rpb24gbm9ybWFsaXplU29ydFByb3BlcnRpZXMoc29ydFByb3BlcnRpZXMpIHsKKyAg
ICByZXR1cm4gc29ydFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwKSB7CisgICAgICB2YXIgX3Ak
c3BsaXQgPSBwLnNwbGl0KCc6Jyk7CisKKyAgICAgIHZhciBwcm9wID0gX3Akc3BsaXRbMF07Cisg
ICAgICB2YXIgZGlyZWN0aW9uID0gX3Akc3BsaXRbMV07CisKKyAgICAgIGRpcmVjdGlvbiA9IGRp
cmVjdGlvbiB8fCAnYXNjJzsKKworICAgICAgcmV0dXJuIFtwcm9wLCBkaXJlY3Rpb25dOworICAg
IH0pOworICB9CisKKyAgZnVuY3Rpb24gc29ydEJ5Tm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzKGl0
ZW1zLCBub3JtYWxpemVkU29ydFByb3BlcnRpZXMpIHsKKyAgICByZXR1cm4gX2VtYmVyUnVudGlt
ZVN5c3RlbU5hdGl2ZV9hcnJheS5BKGl0ZW1zLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoaXRlbUEs
IGl0ZW1CKSB7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vcm1hbGl6ZWRTb3J0UHJvcGVy
dGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgX25vcm1hbGl6ZWRTb3J0UHJvcGVydGll
cyRpID0gbm9ybWFsaXplZFNvcnRQcm9wZXJ0aWVzW2ldOworICAgICAgICB2YXIgcHJvcCA9IF9u
b3JtYWxpemVkU29ydFByb3BlcnRpZXMkaVswXTsKKyAgICAgICAgdmFyIGRpcmVjdGlvbiA9IF9u
b3JtYWxpemVkU29ydFByb3BlcnRpZXMkaVsxXTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gX2Vt
YmVyUnVudGltZUNvbXBhcmUuZGVmYXVsdChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRl
bUEsIHByb3ApLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoaXRlbUIsIHByb3ApKTsKKyAg
ICAgICAgaWYgKHJlc3VsdCAhPT0gMCkgeworICAgICAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09
ICdkZXNjJyA/IC0xICogcmVzdWx0IDogcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisKKyAg
ICAgIHJldHVybiAwOworICAgIH0pKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUv
Y29udHJvbGxlcnMvY29udHJvbGxlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1Zycs
ICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29u
dHJvbGxlcicsICdlbWJlci1ydW50aW1lL2luamVjdCcsICdlbWJlci1ydW50aW1lL21peGlucy9h
Y3Rpb25faGFuZGxlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2Vt
YmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVyUnVudGltZU1peGluc0NvbnRyb2xsZXIsIF9l
bWJlclJ1bnRpbWVJbmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlcikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCisgICovCisKKyAgLyoqCisgICAgQGNsYXNzIENvbnRyb2xsZXIKKyAgICBA
bmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAgQHVzZXMgRW1i
ZXIuQ29udHJvbGxlck1peGluCisgICAgQHB1YmxpYworICAqLworICB2YXIgQ29udHJvbGxlciA9
IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1p
eGluc0NvbnRyb2xsZXIuZGVmYXVsdCk7CisKKyAgX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9o
YW5kbGVyLmRlcHJlY2F0ZVVuZGVyc2NvcmVBY3Rpb25zKENvbnRyb2xsZXIpOworCisgIGZ1bmN0
aW9uIGNvbnRyb2xsZXJJbmplY3Rpb25IZWxwZXIoZmFjdG9yeSkgeworICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdEZWZpbmluZyBhbiBpbmplY3RlZCBjb250cm9sbGVyIHByb3BlcnR5IG9u
IGEgJyArICdub24tY29udHJvbGxlciBpcyBub3QgYWxsb3dlZC4nLCBfZW1iZXJSdW50aW1lTWl4
aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdChmYWN0b3J5LlByb3RvdHlwZU1peGluKSk7Cisg
IH0KKworICAvKioKKyAgICBDcmVhdGVzIGEgcHJvcGVydHkgdGhhdCBsYXppbHkgbG9va3MgdXAg
YW5vdGhlciBjb250cm9sbGVyIGluIHRoZSBjb250YWluZXIuCisgICAgQ2FuIG9ubHkgYmUgdXNl
ZCB3aGVuIGRlZmluaW5nIGFub3RoZXIgY29udHJvbGxlci4KKyAgCisgICAgRXhhbXBsZToKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5Qb3N0Q29udHJvbGxlciA9IEVtYmVyLkNvbnRy
b2xsZXIuZXh0ZW5kKHsKKyAgICAgIHBvc3RzOiBFbWJlci5pbmplY3QuY29udHJvbGxlcigpCisg
ICAgfSk7CisgICAgYGBgCisgIAorICAgIFRoaXMgZXhhbXBsZSB3aWxsIGNyZWF0ZSBhIGBwb3N0
c2AgcHJvcGVydHkgb24gdGhlIGBwb3N0YCBjb250cm9sbGVyIHRoYXQKKyAgICBsb29rcyB1cCB0
aGUgYHBvc3RzYCBjb250cm9sbGVyIGluIHRoZSBjb250YWluZXIsIG1ha2luZyBpdCBlYXN5IHRv
CisgICAgcmVmZXJlbmNlIG90aGVyIGNvbnRyb2xsZXJzLiBUaGlzIGlzIGZ1bmN0aW9uYWxseSBl
cXVpdmFsZW50IHRvOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBvc3RDb250cm9s
bGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgbmVlZHM6ICdwb3N0cycsCisg
ICAgICBwb3N0czogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXJzLnBvc3RzJykKKyAg
ICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjb250cm9sbGVyCisgICAgQHNpbmNlIDEu
MTAuMAorICAgIEBmb3IgRW1iZXIuaW5qZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgKG9w
dGlvbmFsKSBuYW1lIG9mIHRoZSBjb250cm9sbGVyIHRvIGluamVjdCwgZGVmYXVsdHMKKyAgICAg
ICAgICAgdG8gdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEByZXR1cm4ge0VtYmVyLkluamVjdGVk
UHJvcGVydHl9IGluamVjdGlvbiBkZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYworICAq
LworICBfZW1iZXJSdW50aW1lSW5qZWN0LmNyZWF0ZUluamVjdGlvbkhlbHBlcignY29udHJvbGxl
cicsIGNvbnRyb2xsZXJJbmplY3Rpb25IZWxwZXIpOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IENv
bnRyb2xsZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9jb3B5JywgWydleHBvcnRzJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJl
ci1ydW50aW1lL21peGlucy9jb3B5YWJsZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxEZWJ1ZywgX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVyUnVudGltZU1peGluc0Nv
cHlhYmxlKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBjb3B5Owor
CisgIGZ1bmN0aW9uIF9jb3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7CisgICAgdmFyIHJl
dCwgbG9jLCBrZXk7CisKKyAgICAvLyBwcmltaXRpdmUgZGF0YSB0eXBlcyBhcmUgaW1tdXRhYmxl
LCBqdXN0IHJldHVybiB0aGVtLgorICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBv
YmogPT09IG51bGwpIHsKKyAgICAgIHJldHVybiBvYmo7CisgICAgfQorCisgICAgLy8gYXZvaWQg
Y3ljbGljYWwgbG9vcHMKKyAgICBpZiAoZGVlcCAmJiAobG9jID0gc2Vlbi5pbmRleE9mKG9iaikp
ID49IDApIHsKKyAgICAgIHJldHVybiBjb3BpZXNbbG9jXTsKKyAgICB9CisKKyAgICBfZW1iZXJN
ZXRhbERlYnVnLmFzc2VydCgnQ2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0aGF0IGRvZXMg
bm90IGltcGxlbWVudCBFbWJlci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2YgX2VtYmVyUnVu
dGltZVN5c3RlbU9iamVjdC5kZWZhdWx0KSB8fCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUu
ZGVmYXVsdCAmJiBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdC5kZXRlY3Qob2Jq
KSk7CisKKyAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVjdCBh
IG5hdGl2ZSBhcnJheSBvbmx5LiBBbnkgb3RoZXIKKyAgICAvLyBvYmplY3Qgd2lsbCBuZWVkIHRv
IGltcGxlbWVudCBDb3B5YWJsZS4KKyAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CisgICAg
ICByZXQgPSBvYmouc2xpY2UoKTsKKworICAgICAgaWYgKGRlZXApIHsKKyAgICAgICAgbG9jID0g
cmV0Lmxlbmd0aDsKKworICAgICAgICB3aGlsZSAoLS1sb2MgPj0gMCkgeworICAgICAgICAgIHJl
dFtsb2NdID0gX2NvcHkocmV0W2xvY10sIGRlZXAsIHNlZW4sIGNvcGllcyk7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKF9lbWJlclJ1bnRpbWVNaXhpbnNDb3B5YWJsZS5kZWZh
dWx0ICYmIF9lbWJlclJ1bnRpbWVNaXhpbnNDb3B5YWJsZS5kZWZhdWx0LmRldGVjdChvYmopKSB7
CisgICAgICByZXQgPSBvYmouY29weShkZWVwLCBzZWVuLCBjb3BpZXMpOworICAgIH0gZWxzZSBp
ZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgcmV0ID0gbmV3IERhdGUob2JqLmdldFRp
bWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IHt9OworCisgICAgICBmb3IgKGtleSBp
biBvYmopIHsKKyAgICAgICAgLy8gc3VwcG9ydCBOdWxsIHByb3RvdHlwZQorICAgICAgICBpZiAo
IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsKKyAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXZlbnRzIGJyb3dzZXJz
IHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCisgICAgICAgIC8vIGNv
cHlpbmcgaW50ZXJuYWwgRW1iZXIgcHJvcGVydGllcworICAgICAgICBpZiAoa2V5LnN1YnN0cmlu
ZygwLCAyKSA9PT0gJ19fJykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAg
ICAgICAgcmV0W2tleV0gPSBkZWVwID8gX2NvcHkob2JqW2tleV0sIGRlZXAsIHNlZW4sIGNvcGll
cykgOiBvYmpba2V5XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVlcCkgeworICAgICAg
c2Vlbi5wdXNoKG9iaik7CisgICAgICBjb3BpZXMucHVzaChyZXQpOworICAgIH0KKworICAgIHJl
dHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIHRo
ZSBwYXNzZWQgb2JqZWN0LiBBIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IGlzCisgICAgcmV0dXJu
ZWQgaWYgdGhlIG9wdGlvbmFsIGBkZWVwYCBhcmd1bWVudCBpcyBgdHJ1ZWAuCisgIAorICAgIElm
IHRoZSBwYXNzZWQgb2JqZWN0IGltcGxlbWVudHMgdGhlIGBFbWJlci5Db3B5YWJsZWAgaW50ZXJm
YWNlLCB0aGVuIHRoaXMKKyAgICBmdW5jdGlvbiB3aWxsIGRlbGVnYXRlIHRvIHRoZSBvYmplY3Qn
cyBgY29weSgpYCBtZXRob2QgYW5kIHJldHVybiB0aGUKKyAgICByZXN1bHQuIFNlZSBgRW1iZXIu
Q29weWFibGVgIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgIAorICAgIEZvciBwcmltaXRpdmUgdmFs
dWVzICh3aGljaCBhcmUgaW1tdXRhYmxlIGluIEphdmFTY3JpcHQpLCB0aGUgcGFzc2VkIG9iamVj
dAorICAgIGlzIHNpbXBseSByZXR1cm5lZC4KKyAgCisgICAgQG1ldGhvZCBjb3B5CisgICAgQGZv
ciBFbWJlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZQorICAg
IEBwYXJhbSB7Qm9vbGVhbn0gW2RlZXA9ZmFsc2VdIElmIHRydWUsIGEgZGVlcCBjb3B5IG9mIHRo
ZSBvYmplY3QgaXMgbWFkZS4KKyAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBjb3BpZWQgb2JqZWN0
CisgICAgQHB1YmxpYworICAqLworCisgIGZ1bmN0aW9uIGNvcHkob2JqLCBkZWVwKSB7CisgICAg
Ly8gZmFzdCBwYXRocworICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmogPT09
IG51bGwpIHsKKyAgICAgIHJldHVybiBvYmo7IC8vIGNhbid0IGNvcHkgcHJpbWl0aXZlcworICAg
IH0KKworICAgIGlmIChfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdCAmJiBfZW1i
ZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdC5kZXRlY3Qob2JqKSkgeworICAgICAgcmV0
dXJuIG9iai5jb3B5KGRlZXApOworICAgIH0KKworICAgIHJldHVybiBfY29weShvYmosIGRlZXAs
IGRlZXAgPyBbXSA6IG51bGwsIGRlZXAgPyBbXSA6IG51bGwpOworICB9Cit9KTsKK2VuaWZlZCgi
ZW1iZXItcnVudGltZS9jb3JlIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
ICJ1c2Ugc3RyaWN0IjsKK30pOworLyoqCitAbW9kdWxlIGVtYmVyCitAc3VibW9kdWxlIGVtYmVy
LXJ1bnRpbWUKKyovCitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvZXh0L2Z1bmN0aW9uJywgWydleHBv
cnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2Vt
YmVyTWV0YWxNaXhpbikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVt
YmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIGFfc2xpY2UgPSBB
cnJheS5wcm90b3R5cGUuc2xpY2U7CisgIHZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9u
LnByb3RvdHlwZTsKKworICBpZiAoX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRVhURU5EX1BST1RP
VFlQRVMgPT09IHRydWUgfHwgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRVhURU5EX1BST1RPVFlQ
RVMuRnVuY3Rpb24pIHsKKyAgICAvKioKKyAgICAgIFRoZSBgcHJvcGVydHlgIGV4dGVuc2lvbiBv
ZiBKYXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzIGF2YWlsYWJsZQorICAgICAgd2hl
biBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5G
dW5jdGlvbmAgaXMKKyAgICAgIGB0cnVlYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAg
Q29tcHV0ZWQgcHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJlYXQgYSBmdW5jdGlvbiBsaWtlIGEg
cHJvcGVydHk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgTXlBcHAuUHJlc2lkZW50ID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIGZpcnN0TmFtZTogJycsCisgICAgICAgIGxh
c3ROYW1lOiAgJycsCisgICAgICAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAgICAg
cmV0dXJuIHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSArICcgJyArIHRoaXMuZ2V0KCdsYXN0TmFtZScp
OworICAgICAgICB9LnByb3BlcnR5KCkgLy8gQ2FsbCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVu
Y3Rpb24gYXMgYSBwcm9wZXJ0eQorICAgICAgfSk7CisgICAgICAgdmFyIHByZXNpZGVudCA9IE15
QXBwLlByZXNpZGVudC5jcmVhdGUoeworICAgICAgICBmaXJzdE5hbWU6ICdCYXJhY2snLAorICAg
ICAgICBsYXN0TmFtZTogJ09iYW1hJworICAgICAgfSk7CisgICAgICAgcHJlc2lkZW50LmdldCgn
ZnVsbE5hbWUnKTsgLy8gJ0JhcmFjayBPYmFtYScKKyAgICAgIGBgYAorICAgICAgIFRyZWF0aW5n
IGEgZnVuY3Rpb24gbGlrZSBhIHByb3BlcnR5IGlzIHVzZWZ1bCBiZWNhdXNlIHRoZXkgY2FuIHdv
cmsgd2l0aAorICAgICAgYmluZGluZ3MsIGp1c3QgbGlrZSBhbnkgb3RoZXIgcHJvcGVydHkuCisg
ICAgICAgTWFueSBjb21wdXRlZCBwcm9wZXJ0aWVzIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG90aGVy
IHByb3BlcnRpZXMuIEZvcgorICAgICAgZXhhbXBsZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRo
ZSBgZnVsbE5hbWVgIHByb3BlcnR5IGRlcGVuZHMgb24KKyAgICAgIGBmaXJzdE5hbWVgIGFuZCBg
bGFzdE5hbWVgIHRvIGRldGVybWluZSBpdHMgdmFsdWUuIFlvdSBjYW4gdGVsbCBFbWJlcgorICAg
ICAgYWJvdXQgdGhlc2UgZGVwZW5kZW5jaWVzIGxpa2UgdGhpczoKKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICBNeUFwcC5QcmVzaWRlbnQgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAg
ICAgZmlyc3ROYW1lOiAnJywKKyAgICAgICAgbGFzdE5hbWU6ICAnJywKKyAgICAgICAgIGZ1bGxO
YW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScp
ICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CisgICAgICAgICAgIC8vIFRlbGwgRW1iZXIu
anMgdGhhdCB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGRlcGVuZHMgb24gZmlyc3ROYW1lCisgICAg
ICAgICAgLy8gYW5kIGxhc3ROYW1lCisgICAgICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICds
YXN0TmFtZScpCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIE1ha2Ugc3VyZSB5b3UgbGlz
dCB0aGVzZSBkZXBlbmRlbmNpZXMgc28gRW1iZXIga25vd3Mgd2hlbiB0byB1cGRhdGUKKyAgICAg
IGJpbmRpbmdzIHRoYXQgY29ubmVjdCB0byBhIGNvbXB1dGVkIHByb3BlcnR5LiBDaGFuZ2luZyBh
IGRlcGVuZGVuY3kKKyAgICAgIHdpbGwgbm90IGltbWVkaWF0ZWx5IHRyaWdnZXIgYW4gdXBkYXRl
IG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSwgYnV0CisgICAgICB3aWxsIGluc3RlYWQgY2xlYXIg
dGhlIGNhY2hlIHNvIHRoYXQgaXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBuZXh0IGBnZXRgCisgICAg
ICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5LgorICAgICAgIFNlZSBbRW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eV0oL2FwaS9jbGFzc2VzL0VtYmVyLkNvbXB1dGVkUHJvcGVydHkuaHRtbCksIFtFbWJl
ci5jb21wdXRlZF0oL2FwaS9jbGFzc2VzL0VtYmVyLmNvbXB1dGVkLmh0bWwpLgorICAgICAgIEBt
ZXRob2QgcHJvcGVydHkKKyAgICAgIEBmb3IgRnVuY3Rpb24KKyAgICAgIEBwdWJsaWMKKyAgICAq
LworICAgIEZ1bmN0aW9uUHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24gKCkgeworICAgICAg
dmFyIHJldCA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQodGhpcyk7CisgICAgICAvLyBD
b21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5wcm9wZXJ0eSBleHBhbmRzIHByb3BlcnRpZXM7IG5v
IG5lZWQgZm9yIHVzIHRvCisgICAgICAvLyBkbyBzbyBoZXJlLgorICAgICAgcmV0dXJuIHJldC5w
cm9wZXJ0eS5hcHBseShyZXQsIGFyZ3VtZW50cyk7CisgICAgfTsKKworICAgIC8qKgorICAgICAg
VGhlIGBvYnNlcnZlc2AgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5
cGUgaXMgYXZhaWxhYmxlCisgICAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3Ig
YEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcworICAgICAgdHJ1ZSwgd2hpY2gg
aXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBvYnNlcnZlIHByb3BlcnR5IGNoYW5nZXMg
c2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAorICAgICAgY2FsbCB0byB0aGUgZW5kIG9m
IHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgorICAg
ICAgRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuT2JqZWN0
LmV4dGVuZCh7CisgICAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICAg
IC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKKyAgICAg
ICAgfS5vYnNlcnZlcygndmFsdWUnKQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJbiB0
aGUgZnV0dXJlIHRoaXMgbWV0aG9kIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLgorICAgICAgIFNl
ZSBgRW1iZXIub2JzZXJ2ZXJgLgorICAgICAgIEBtZXRob2Qgb2JzZXJ2ZXMKKyAgICAgIEBmb3Ig
RnVuY3Rpb24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIEZ1bmN0aW9uUHJvdG90eXBlLm9i
c2VydmVzID0gZnVuY3Rpb24gKCkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5s
ZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5Kysp
IHsKKyAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKKyAgICAgIH0KKworICAg
ICAgYXJncy5wdXNoKHRoaXMpOworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2
ZXIuYXBwbHkodGhpcywgYXJncyk7CisgICAgfTsKKworICAgIEZ1bmN0aW9uUHJvdG90eXBlLl9v
YnNlcnZlc0ltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ0ltbWVkaWF0ZSBvYnNlcnZlcnMgbXVzdCBvYnNlcnZlIGludGVybmFsIHByb3Bl
cnRpZXMgb25seSwgJyArICdub3QgcHJvcGVydGllcyBvbiBvdGhlciBvYmplY3RzLicsIGZ1bmN0
aW9uIGNoZWNrSXNJbnRlcm5hbFByb3BlcnR5KCkgeworICAgICAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICBpZiAoYXJndW1l
bnRzW2ldLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KTsK
KworICAgICAgLy8gb2JzZXJ2ZXMgaGFuZGxlcyBwcm9wZXJ0eSBleHBhbnNpb24KKyAgICAgIHJl
dHVybiB0aGlzLm9ic2VydmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICAv
KioKKyAgICAgIFRoZSBgb2JzZXJ2ZXNJbW1lZGlhdGVseWAgZXh0ZW5zaW9uIG9mIEphdmFzY3Jp
cHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMKKyAgICAgIGF2YWlsYWJsZSB3aGVuIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFU2Agb3IKKyAgICAgIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5j
dGlvbmAgaXMgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBvYnNl
cnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzSW1tZWRp
YXRlbHlgCisgICAgICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25z
IGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCisgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgICAgdmFsdWVP
YnNlcnZlcjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgLy8gRXhlY3V0ZXMgaW1tZWRpYXRlbHkg
YWZ0ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcworICAgICAgICB9Lm9ic2VydmVzSW1t
ZWRpYXRlbHkoJ3ZhbHVlJykKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSW4gdGhlIGZ1
dHVyZSwgYG9ic2VydmVzYCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4gSW4gdGhpcyBldmVudCwK
KyAgICAgIGBvYnNlcnZlc0ltbWVkaWF0ZWx5YCB3aWxsIG1haW50YWluIHRoZSBzeW5jaHJvbm91
cyBiZWhhdmlvci4KKyAgICAgICBTZWUgYEVtYmVyLmltbWVkaWF0ZU9ic2VydmVyYC4KKyAgICAg
ICBAbWV0aG9kIG9ic2VydmVzSW1tZWRpYXRlbHkKKyAgICAgIEBmb3IgRnVuY3Rpb24KKyAgICAg
IEBkZXByZWNhdGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgRnVuY3Rpb25Qcm90b3R5
cGUub2JzZXJ2ZXNJbW1lZGlhdGVseSA9IF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlRnVuYygn
RnVuY3Rpb24jb2JzZXJ2ZXNJbW1lZGlhdGVseSBpcyBkZXByZWNhdGVkLiBVc2UgRnVuY3Rpb24j
b2JzZXJ2ZXMgaW5zdGVhZCcsIHsgaWQ6ICdlbWJlci1ydW50aW1lLmV4dC1mdW5jdGlvbicsIHVu
dGlsOiAnMy4wLjAnIH0sIEZ1bmN0aW9uUHJvdG90eXBlLl9vYnNlcnZlc0ltbWVkaWF0ZWx5KTsK
KworICAgIC8qKgorICAgICAgVGhlIGBvbmAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5j
dGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCisgICAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJP
VE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcworICAgICAg
dHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAgICAgWW91IGNhbiBsaXN0ZW4gZm9yIGV2
ZW50cyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb25gIGNhbGwgdG8gdGhlIGVuZCBvZgorICAgICAg
eW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgb3IgbWl4aW5zIHRoYXQgeW91IHdy
aXRlLiBGb3IgZXhhbXBsZToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5NaXhp
bi5jcmVhdGUoeworICAgICAgICBkb1NvbWV0aGluZ1dpdGhFbGVtZW50OiBmdW5jdGlvbigpIHsK
KyAgICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgImRpZEluc2VydEVsZW1lbnQiIGV2
ZW50IGZpcmVzCisgICAgICAgIH0ub24oJ2RpZEluc2VydEVsZW1lbnQnKQorICAgICAgfSk7Cisg
ICAgICBgYGAKKyAgICAgICBTZWUgYEVtYmVyLm9uYC4KKyAgICAgICBAbWV0aG9kIG9uCisgICAg
ICBAZm9yIEZ1bmN0aW9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBGdW5jdGlvblByb3Rv
dHlwZS5vbiA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBldmVudHMgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX19lbWJlcl9saXN0ZW5zX18gPSBldmVudHM7CisKKyAg
ICAgIHJldHVybiB0aGlzOworICAgIH07CisgIH0KK30pOworLy8gRW1iZXIuRVhURU5EX1BST1RP
VFlQRVMKK2VuaWZlZCgnZW1iZXItcnVudGltZS9leHQvcnN2cCcsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbC9jb3JlJywgJ3JlcXVpcmUnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvbG9nZ2VyJywgJ2VtYmVyLW1ldGFsL3J1bl9sb29wJywgJ3JzdnAnXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX3JlcXVpcmUsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJl
ck1ldGFsTG9nZ2VyLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfcnN2cCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5vbmVycm9yRGVmYXVsdCA9IG9uZXJyb3JEZWZhdWx0OworICBleHBv
cnRzLmFmdGVyID0gYWZ0ZXI7CisKKyAgdmFyIHRlc3RNb2R1bGVOYW1lID0gJ2VtYmVyLXRlc3Rp
bmcvdGVzdCc7CisgIHZhciBUZXN0OworCisgIHZhciBhc3luY1N0YXJ0ID0gZnVuY3Rpb24gKCkg
eworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0ICYmIF9lbWJlck1ldGFsQ29y
ZS5kZWZhdWx0LlRlc3QuYWRhcHRlcikgeworICAgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
VGVzdC5hZGFwdGVyLmFzeW5jU3RhcnQoKTsKKyAgICB9CisgIH07CisKKyAgdmFyIGFzeW5jRW5k
ID0gZnVuY3Rpb24gKCkgeworICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0ICYm
IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LlRlc3QuYWRhcHRlcikgeworICAgICAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQuVGVzdC5hZGFwdGVyLmFzeW5jRW5kKCk7CisgICAgfQorICB9OworCisg
IF9yc3ZwLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlvbiAoY2FsbGJhY2ssIHByb21pc2UpIHsK
KyAgICB2YXIgYXN5bmMgPSAhX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmN1cnJlbnRSdW5M
b29wOworCisgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRlc3RpbmcgJiYgYXN5bmMp
IHsKKyAgICAgIGFzeW5jU3RhcnQoKTsKKyAgICB9CisKKyAgICBfZW1iZXJNZXRhbFJ1bl9sb29w
LmRlZmF1bHQuYmFja2J1cm5lci5zY2hlZHVsZSgnYWN0aW9ucycsIGZ1bmN0aW9uICgpIHsKKyAg
ICAgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC50ZXN0aW5nICYmIGFzeW5jKSB7CisgICAg
ICAgIGFzeW5jRW5kKCk7CisgICAgICB9CisgICAgICBjYWxsYmFjayhwcm9taXNlKTsKKyAgICB9
KTsKKyAgfSk7CisKKyAgZnVuY3Rpb24gb25lcnJvckRlZmF1bHQocmVhc29uKSB7CisgICAgdmFy
IGVycm9yOworCisgICAgaWYgKHJlYXNvbiAmJiByZWFzb24uZXJyb3JUaHJvd24pIHsKKyAgICAg
IC8vIGpxWEhSIHByb3ZpZGVzIHRoaXMKKyAgICAgIGVycm9yID0gcmVhc29uLmVycm9yVGhyb3du
OworICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgZXJyb3Ig
PSBuZXcgRXJyb3IoZXJyb3IpOworICAgICAgfQorICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5
KGVycm9yLCAnX19yZWFzb25fd2l0aF9lcnJvcl90aHJvd25fXycsIHsKKyAgICAgICAgdmFsdWU6
IHJlYXNvbiwKKyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UKKyAgICAgIH0pOworICAgIH0gZWxz
ZSB7CisgICAgICBlcnJvciA9IHJlYXNvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IgJiYgZXJy
b3IubmFtZSA9PT0gJ1VucmVjb2duaXplZFVSTEVycm9yJykgeworICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ1RoZSBVUkwgXCcnICsgZXJyb3IubWVzc2FnZSArICdcJyBkaWQgbm90IG1h
dGNoIGFueSByb3V0ZXMgaW4geW91ciBhcHBsaWNhdGlvbicsIGZhbHNlKTsKKyAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoZXJyb3IgJiYgZXJyb3IubmFtZSAhPT0gJ1RyYW5zaXRpb25B
Ym9ydGVkJykgeworICAgICAgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnRlc3RpbmcpIHsK
KyAgICAgICAgLy8gRVM2VE9ETzogcmVtb3ZlIHdoZW4gcG9zc2libGUKKyAgICAgICAgaWYgKCFU
ZXN0ICYmIF9yZXF1aXJlLmhhcyh0ZXN0TW9kdWxlTmFtZSkpIHsKKyAgICAgICAgICBUZXN0ID0g
X3JlcXVpcmUuZGVmYXVsdCh0ZXN0TW9kdWxlTmFtZSlbJ2RlZmF1bHQnXTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChUZXN0ICYmIFRlc3QuYWRhcHRlcikgeworICAgICAgICAgIFRlc3QuYWRh
cHRlci5leGNlcHRpb24oZXJyb3IpOworICAgICAgICAgIF9lbWJlck1ldGFsTG9nZ2VyLmRlZmF1
bHQuZXJyb3IoZXJyb3Iuc3RhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93
IGVycm9yOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0Lm9uZXJyb3IpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQub25lcnJvcihl
cnJvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfZW1iZXJNZXRhbExvZ2dlci5kZWZhdWx0
LmVycm9yKGVycm9yLnN0YWNrKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBh
ZnRlcihjYikgeworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZShfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQucXVldWVzW19lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVs
dC5xdWV1ZXMubGVuZ3RoIC0gMV0sIGNiKTsKKyAgfQorCisgIF9yc3ZwLm9uKCdlcnJvcicsIG9u
ZXJyb3JEZWZhdWx0KTsKKyAgX3JzdnAuY29uZmlndXJlKCdhZnRlcicsIGFmdGVyKTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBfcnN2cDsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL2V4dC9z
dHJpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1ydW50aW1lL3N5
c3RlbS9zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVy
UnVudGltZVN5c3RlbVN0cmluZykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFN0cmlu
Z1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7CisKKyAgaWYgKF9lbWJlck1ldGFsQ29yZS5k
ZWZhdWx0LkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVYVEVORF9QUk9UT1RZUEVTLlN0cmluZykgeworICAgIC8qKgorICAgICAgU2VlIFtFbWJl
ci5TdHJpbmcuZm10XSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2ZtdCku
CisgICAgICAgQG1ldGhvZCBmbXQKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQor
ICAgICAgQGRlcHJlY2F0ZWQKKyAgICAqLworICAgIFN0cmluZ1Byb3RvdHlwZS5mbXQgPSBmdW5j
dGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9
IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAgICAgICBh
cmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZXR1cm4gX2Vt
YmVyUnVudGltZVN5c3RlbVN0cmluZy5mbXQodGhpcywgYXJncyk7CisgICAgfTsKKworICAgIC8q
KgorICAgICAgU2VlIFtFbWJlci5TdHJpbmcud10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5o
dG1sI21ldGhvZF93KS4KKyAgICAgICBAbWV0aG9kIHcKKyAgICAgIEBmb3IgU3RyaW5nCisgICAg
ICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLncgPSBmdW5jdGlvbiAoKSB7
CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy53KHRoaXMpOworICAgIH07
CisKKyAgICAvKioKKyAgICAgIFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9jbGFzc2VzL0Vt
YmVyLlN0cmluZy5odG1sI21ldGhvZF9sb2MpLgorICAgICAgIEBtZXRob2QgbG9jCisgICAgICBA
Zm9yIFN0cmluZworICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIFN0cmluZ1Byb3RvdHlwZS5s
b2MgPSBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIr
KykgeworICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgICB9CisK
KyAgICAgIHJldHVybiBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmxvYyh0aGlzLCBhcmdzKTsK
KyAgICB9OworCisgICAgLyoqCisgICAgICBTZWUgW0VtYmVyLlN0cmluZy5jYW1lbGl6ZV0oL2Fw
aS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYW1lbGl6ZSkuCisgICAgICAgQG1l
dGhvZCBjYW1lbGl6ZQorICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8K
KyAgICBTdHJpbmdQcm90b3R5cGUuY2FtZWxpemUgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1
cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmluZy5jYW1lbGl6ZSh0aGlzKTsKKyAgICB9OworCisg
ICAgLyoqCisgICAgICBTZWUgW0VtYmVyLlN0cmluZy5kZWNhbWVsaXplXSgvYXBpL2NsYXNzZXMv
RW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2RlY2FtZWxpemUpLgorICAgICAgIEBtZXRob2QgZGVj
YW1lbGl6ZQorICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBT
dHJpbmdQcm90b3R5cGUuZGVjYW1lbGl6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBf
ZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRlY2FtZWxpemUodGhpcyk7CisgICAgfTsKKworICAg
IC8qKgorICAgICAgU2VlIFtFbWJlci5TdHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rhc2hlcml6ZSkuCisgICAgICAgQG1ldGhvZCBkYXNoZXJp
emUKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5n
UHJvdG90eXBlLmRhc2hlcml6ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJS
dW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZSh0aGlzKTsKKyAgICB9OworCisgICAgLyoqCisg
ICAgICBTZWUgW0VtYmVyLlN0cmluZy51bmRlcnNjb3JlXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3Ry
aW5nLmh0bWwjbWV0aG9kX3VuZGVyc2NvcmUpLgorICAgICAgIEBtZXRob2QgdW5kZXJzY29yZQor
ICAgICAgQGZvciBTdHJpbmcKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBTdHJpbmdQcm90
b3R5cGUudW5kZXJzY29yZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJSdW50
aW1lU3lzdGVtU3RyaW5nLnVuZGVyc2NvcmUodGhpcyk7CisgICAgfTsKKworICAgIC8qKgorICAg
ICAgU2VlIFtFbWJlci5TdHJpbmcuY2xhc3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcu
aHRtbCNtZXRob2RfY2xhc3NpZnkpLgorICAgICAgIEBtZXRob2QgY2xhc3NpZnkKKyAgICAgIEBm
b3IgU3RyaW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLmNs
YXNzaWZ5ID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRpbWVTeXN0ZW1T
dHJpbmcuY2xhc3NpZnkodGhpcyk7CisgICAgfTsKKworICAgIC8qKgorICAgICAgU2VlIFtFbWJl
ci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhv
ZF9jYXBpdGFsaXplKS4KKyAgICAgICBAbWV0aG9kIGNhcGl0YWxpemUKKyAgICAgIEBmb3IgU3Ry
aW5nCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgU3RyaW5nUHJvdG90eXBlLmNhcGl0YWxp
emUgPSBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZVN5c3RlbVN0cmlu
Zy5jYXBpdGFsaXplKHRoaXMpOworICAgIH07CisgIH0KK30pOworLy8gRW1iZXIuRVhURU5EX1BS
T1RPVFlQRVMKK2VuaWZlZCgnZW1iZXItcnVudGltZS9pbmRleCcsIFsnZXhwb3J0cycsICdlbWJl
ci1tZXRhbCcsICdlbWJlci1ydW50aW1lL2lzLWVxdWFsJywgJ2VtYmVyLXJ1bnRpbWUvY29tcGFy
ZScsICdlbWJlci1ydW50aW1lL2NvcHknLCAnZW1iZXItcnVudGltZS9pbmplY3QnLCAnZW1iZXIt
cnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcs
ICdlbWJlci1ydW50aW1lL3N5c3RlbS9jb250YWluZXInLCAnZW1iZXItcnVudGltZS9zeXN0ZW0v
YXJyYXlfcHJveHknLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0X3Byb3h5JywgJ2VtYmVy
LXJ1bnRpbWUvc3lzdGVtL2NvcmVfb2JqZWN0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2
ZV9hcnJheScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vbGF6eV9sb2FkJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5JywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL2NvbXBhcmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29weWFibGUn
LCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1ydW50aW1lL21peGlu
cy9mcmVlemFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvLXByb3h5JywgJ2VtYmVyLXJ1bnRp
bWUvbWl4aW5zL29ic2VydmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRs
ZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvbXV0YWJsZV9lbnVtZXJhYmxlJywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL211dGFibGVfYXJyYXknLCAnZW1iZXItcnVudGltZS9taXhpbnMvdGFyZ2V0
X2FjdGlvbl9zdXBwb3J0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2V2ZW50ZWQnLCAnZW1iZXIt
cnVudGltZS9taXhpbnMvcHJvbWlzZV9wcm94eScsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdl
bWJlci1ydW50aW1lL2NvbXB1dGVkL3JlZHVjZV9jb21wdXRlZF9tYWNyb3MnLCAnZW1iZXItcnVu
dGltZS9jb250cm9sbGVycy9jb250cm9sbGVyJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRy
b2xsZXInLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsICdlbWJlci1ydW50aW1lL2V4
dC9yc3ZwJywgJ2VtYmVyLXJ1bnRpbWUvZXh0L3N0cmluZycsICdlbWJlci1ydW50aW1lL2V4dC9m
dW5jdGlvbicsICdlbWJlci1ydW50aW1lL3V0aWxzJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL3Jl
Z2lzdHJ5X3Byb3h5JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRhaW5lcl9wcm94eScsICdl
bWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWwsIF9lbWJlclJ1bnRpbWVJc0VxdWFsLCBfZW1iZXJSdW50aW1lQ29tcGFyZSwgX2VtYmVy
UnVudGltZUNvcHksIF9lbWJlclJ1bnRpbWVJbmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1l
c3BhY2UsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVTeXN0ZW1Db250
YWluZXIsIF9lbWJlclJ1bnRpbWVTeXN0ZW1BcnJheV9wcm94eSwgX2VtYmVyUnVudGltZVN5c3Rl
bU9iamVjdF9wcm94eSwgX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1iZXJSdW50
aW1lU3lzdGVtTmF0aXZlX2FycmF5LCBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLCBfZW1iZXJS
dW50aW1lU3lzdGVtTGF6eV9sb2FkLCBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXksIF9lbWJlclJ1
bnRpbWVNaXhpbnNDb21wYXJhYmxlLCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUsIF9lbWJl
clJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLCBfZW1iZXJSdW50aW1lTWl4aW5zRnJlZXphYmxlLCBf
ZW1iZXJSdW50aW1lTWl4aW5zUHJveHksIF9lbWJlclJ1bnRpbWVNaXhpbnNPYnNlcnZhYmxlLCBf
ZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRh
YmxlX2VudW1lcmFibGUsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJS
dW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJSdW50aW1lTWl4aW5zRXZl
bnRlZCwgX2VtYmVyUnVudGltZU1peGluc1Byb21pc2VfcHJveHksIF9lbWJlck1ldGFsRmVhdHVy
ZXMsIF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MsIF9lbWJlclJ1
bnRpbWVDb250cm9sbGVyc0NvbnRyb2xsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9sbGVy
LCBfZW1iZXJSdW50aW1lU3lzdGVtU2VydmljZSwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9lbWJl
clJ1bnRpbWVFeHRTdHJpbmcsIF9lbWJlclJ1bnRpbWVFeHRGdW5jdGlvbiwgX2VtYmVyUnVudGlt
ZVV0aWxzLCBfZW1iZXJSdW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHksIF9lbWJlclJ1bnRpbWVN
aXhpbnNDb250YWluZXJfcHJveHksIF9lbWJlclJ1bnRpbWVTdHJpbmdfcmVnaXN0cnkpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisK
KyAgLy8gQkVHSU4gSU1QT1JUUworICAndXNlIHN0cmljdCc7CisKKyAgLy8gRU5EIElNUE9SVFMK
KworICAvLyBCRUdJTiBFWFBPUlRTCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuY29tcGFyZSA9IF9l
bWJlclJ1bnRpbWVDb21wYXJlLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuY29weSA9
IF9lbWJlclJ1bnRpbWVDb3B5LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuaXNFcXVh
bCA9IF9lbWJlclJ1bnRpbWVJc0VxdWFsLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVs
dC5pbmplY3QgPSBfZW1iZXJSdW50aW1lSW5qZWN0LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwu
ZGVmYXVsdC5BcnJheSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5kZWZhdWx0OworCisgIF9l
bWJlck1ldGFsLmRlZmF1bHQuQ29tcGFyYWJsZSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb21wYXJh
YmxlLmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQ29weWFibGUgPSBfZW1iZXJSdW50
aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LkZyZWV6
YWJsZSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUuRnJlZXphYmxlOworICBfZW1iZXJN
ZXRhbC5kZWZhdWx0LkZST1pFTl9FUlJPUiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUu
RlJPWkVOX0VSUk9SOworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuTXV0YWJsZUVudW1lcmFibGUg
PSBfZW1iZXJSdW50aW1lTWl4aW5zTXV0YWJsZV9lbnVtZXJhYmxlLmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsLmRlZmF1bHQuTXV0YWJsZUFycmF5ID0gX2VtYmVyUnVudGltZU1peGluc011dGFibGVf
YXJyYXkuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LlRhcmdldEFjdGlvblN1cHBv
cnQgPSBfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LmRlZmF1bHQ7Cisg
IF9lbWJlck1ldGFsLmRlZmF1bHQuRXZlbnRlZCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVk
LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5Qcm9taXNlUHJveHlNaXhpbiA9IF9l
bWJlclJ1bnRpbWVNaXhpbnNQcm9taXNlX3Byb3h5LmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwu
ZGVmYXVsdC5PYnNlcnZhYmxlID0gX2VtYmVyUnVudGltZU1peGluc09ic2VydmFibGUuZGVmYXVs
dDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LnR5cGVPZiA9IF9lbWJlclJ1bnRpbWVVdGlscy50
eXBlT2Y7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuaXNBcnJheSA9IF9lbWJlclJ1bnRpbWVVdGls
cy5pc0FycmF5OworCisgIC8vIEVTNlRPRE86IHRoaXMgc2VlbXMgYSBsZXNzIHRoYW4gaWRlYWwg
d2F5L3BsYWNlIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIEVtYmVyLmNvbXB1dGVkCisgIHZhciBFbUNv
bXB1dGVkID0gX2VtYmVyTWV0YWwuZGVmYXVsdC5jb21wdXRlZDsKKworICBFbUNvbXB1dGVkLnN1
bSA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3Muc3VtOworICBF
bUNvbXB1dGVkLm1pbiA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNy
b3MubWluOworICBFbUNvbXB1dGVkLm1heCA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9j
b21wdXRlZF9tYWNyb3MubWF4OworICBFbUNvbXB1dGVkLm1hcCA9IF9lbWJlclJ1bnRpbWVDb21w
dXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MubWFwOworICBFbUNvbXB1dGVkLnNvcnQgPSBfZW1i
ZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2VfY29tcHV0ZWRfbWFjcm9zLnNvcnQ7CisgIEVtQ29tcHV0
ZWQuc2V0RGlmZiA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3Mu
c2V0RGlmZjsKKyAgRW1Db21wdXRlZC5tYXBCeSA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVj
ZV9jb21wdXRlZF9tYWNyb3MubWFwQnk7CisgIEVtQ29tcHV0ZWQuZmlsdGVyID0gX2VtYmVyUnVu
dGltZUNvbXB1dGVkUmVkdWNlX2NvbXB1dGVkX21hY3Jvcy5maWx0ZXI7CisgIEVtQ29tcHV0ZWQu
ZmlsdGVyQnkgPSBfZW1iZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2VfY29tcHV0ZWRfbWFjcm9zLmZp
bHRlckJ5OworICBFbUNvbXB1dGVkLnVuaXEgPSBfZW1iZXJSdW50aW1lQ29tcHV0ZWRSZWR1Y2Vf
Y29tcHV0ZWRfbWFjcm9zLnVuaXE7CisKKyAgRW1Db21wdXRlZC51bmlvbiA9IF9lbWJlclJ1bnRp
bWVDb21wdXRlZFJlZHVjZV9jb21wdXRlZF9tYWNyb3MudW5pb247CisgIEVtQ29tcHV0ZWQuaW50
ZXJzZWN0ID0gX2VtYmVyUnVudGltZUNvbXB1dGVkUmVkdWNlX2NvbXB1dGVkX21hY3Jvcy5pbnRl
cnNlY3Q7CisgIEVtQ29tcHV0ZWQuY29sbGVjdCA9IF9lbWJlclJ1bnRpbWVDb21wdXRlZFJlZHVj
ZV9jb21wdXRlZF9tYWNyb3MuY29sbGVjdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0LlN0cmlu
ZyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1TdHJpbmcuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVm
YXVsdC5PYmplY3QgPSBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQ7CisgIF9lbWJl
ck1ldGFsLmRlZmF1bHQuQ29udGFpbmVyID0gX2VtYmVyUnVudGltZVN5c3RlbUNvbnRhaW5lci5D
b250YWluZXI7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuUmVnaXN0cnkgPSBfZW1iZXJSdW50aW1l
U3lzdGVtQ29udGFpbmVyLlJlZ2lzdHJ5OworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuZ2V0T3du
ZXIgPSBfZW1iZXJSdW50aW1lU3lzdGVtQ29udGFpbmVyLmdldE93bmVyOworICBfZW1iZXJNZXRh
bC5kZWZhdWx0LnNldE93bmVyID0gX2VtYmVyUnVudGltZVN5c3RlbUNvbnRhaW5lci5zZXRPd25l
cjsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0Ll9SZWdpc3RyeVByb3h5TWl4aW4gPSBfZW1iZXJS
dW50aW1lTWl4aW5zUmVnaXN0cnlfcHJveHkuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVs
dC5fQ29udGFpbmVyUHJveHlNaXhpbiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNDb250YWluZXJfcHJv
eHkuZGVmYXVsdDsKKworICBfZW1iZXJNZXRhbC5kZWZhdWx0Lk5hbWVzcGFjZSA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1OYW1lc3BhY2UuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5FbnVt
ZXJhYmxlID0gX2VtYmVyUnVudGltZU1peGluc0VudW1lcmFibGUuZGVmYXVsdDsKKyAgX2VtYmVy
TWV0YWwuZGVmYXVsdC5BcnJheVByb3h5ID0gX2VtYmVyUnVudGltZVN5c3RlbUFycmF5X3Byb3h5
LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuT2JqZWN0UHJveHkgPSBfZW1iZXJSdW50
aW1lU3lzdGVtT2JqZWN0X3Byb3h5LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQWN0
aW9uSGFuZGxlciA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlci5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbC5kZWZhdWx0LkNvcmVPYmplY3QgPSBfZW1iZXJSdW50aW1lU3lzdGVtQ29y
ZV9vYmplY3QuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5OYXRpdmVBcnJheSA9IF9l
bWJlclJ1bnRpbWVTeXN0ZW1OYXRpdmVfYXJyYXkuZGVmYXVsdDsKKyAgLy8gRVM2VE9ETzogQ3Vy
cmVudGx5IHdlIG11c3QgcmVseSBvbiB0aGUgZ2xvYmFsIGZyb20gZW1iZXItbWV0YWwvY29yZSB0
byBhdm9pZCBjaXJjdWxhciBkZXBzCisgIC8vIEVtYmVyLkEgPSBBOworICBfZW1iZXJNZXRhbC5k
ZWZhdWx0Lm9uTG9hZCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQub25Mb2FkOworICBf
ZW1iZXJNZXRhbC5kZWZhdWx0LnJ1bkxvYWRIb29rcyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5
X2xvYWQucnVuTG9hZEhvb2tzOworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuQ29udHJvbGxlciA9
IF9lbWJlclJ1bnRpbWVDb250cm9sbGVyc0NvbnRyb2xsZXIuZGVmYXVsdDsKKyAgX2VtYmVyTWV0
YWwuZGVmYXVsdC5Db250cm9sbGVyTWl4aW4gPSBfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxl
ci5kZWZhdWx0OworCisgIF9lbWJlck1ldGFsLmRlZmF1bHQuU2VydmljZSA9IF9lbWJlclJ1bnRp
bWVTeXN0ZW1TZXJ2aWNlLmRlZmF1bHQ7CisKKyAgX2VtYmVyTWV0YWwuZGVmYXVsdC5fUHJveHlN
aXhpbiA9IF9lbWJlclJ1bnRpbWVNaXhpbnNQcm94eS5kZWZhdWx0OworCisgIF9lbWJlck1ldGFs
LmRlZmF1bHQuUlNWUCA9IF9lbWJlclJ1bnRpbWVFeHRSc3ZwLmRlZmF1bHQ7CisgIC8vIEVORCBF
WFBPUlRTCisKKyAgLyoqCisgICAgRGVmaW5lcyB0aGUgaGFzaCBvZiBsb2NhbGl6ZWQgc3RyaW5n
cyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuIFVzZWQgYnkKKyAgICB0aGUgYEVtYmVyLlN0cmlu
Zy5sb2MoKWAgaGVscGVyLiBUbyBsb2NhbGl6ZSwgYWRkIHN0cmluZyB2YWx1ZXMgdG8gdGhpcwor
ICAgIGhhc2guCisgIAorICAgIEBwcm9wZXJ0eSBTVFJJTkdTCisgICAgQGZvciBFbWJlcgorICAg
IEB0eXBlIE9iamVjdAorICAgIEBwcml2YXRlCisgICovCisgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
eShfZW1iZXJNZXRhbC5kZWZhdWx0LCAnU1RSSU5HUycsIHsKKyAgICBjb25maWd1cmFibGU6IGZh
bHNlLAorICAgIGdldDogX2VtYmVyUnVudGltZVN0cmluZ19yZWdpc3RyeS5nZXRTdHJpbmdzLAor
ICAgIHNldDogX2VtYmVyUnVudGltZVN0cmluZ19yZWdpc3RyeS5zZXRTdHJpbmdzCisgIH0pOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsLmRlZmF1bHQ7Cit9KTsKKy8vIGp1c3Qg
Zm9yIHNpZGUgZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5SU1ZQCisvLyBqdXN0IGZvciBzaWRl
IGVmZmVjdCBvZiBleHRlbmRpbmcgU3RyaW5nLnByb3RvdHlwZQorLy8ganVzdCBmb3Igc2lkZSBl
ZmZlY3Qgb2YgZXh0ZW5kaW5nIEZ1bmN0aW9uLnByb3RvdHlwZQorZW5pZmVkKCdlbWJlci1ydW50
aW1lL2luamVjdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRh
bC9pbmplY3RlZF9wcm9wZXJ0eSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1
ZywgX2VtYmVyTWV0YWxJbmplY3RlZF9wcm9wZXJ0eSkgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gaW5qZWN0OworICBleHBvcnRzLmNyZWF0ZUluamVjdGlvbkhlbHBl
ciA9IGNyZWF0ZUluamVjdGlvbkhlbHBlcjsKKyAgZXhwb3J0cy52YWxpZGF0ZVByb3BlcnR5SW5q
ZWN0aW9ucyA9IHZhbGlkYXRlUHJvcGVydHlJbmplY3Rpb25zOworCisgIC8qKgorICAgIE5hbWVz
cGFjZSBmb3IgaW5qZWN0aW9uIGhlbHBlciBtZXRob2RzLgorICAKKyAgICBAY2xhc3MgaW5qZWN0
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzdGF0aWMKKyAgICBAcHVibGljCisgICovCisK
KyAgZnVuY3Rpb24gaW5qZWN0KCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdJbmpl
Y3RlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY3JlYXRlZCB0aHJvdWdoIGhlbHBlcnMsIHNlZSBcJycg
KyBPYmplY3Qua2V5cyhpbmplY3QpLmpvaW4oJyInLCAnIicpICsgJ1wnJyk7CisgIH0KKworICAv
LyBEaWN0aW9uYXJ5IG9mIGluamVjdGlvbiB2YWxpZGF0aW9ucyBieSB0eXBlLCBhZGRlZCB0byBi
eSBgY3JlYXRlSW5qZWN0aW9uSGVscGVyYAorICB2YXIgdHlwZVZhbGlkYXRvcnMgPSB7fTsKKwor
ICAvKioKKyAgICBUaGlzIG1ldGhvZCBhbGxvd3Mgb3RoZXIgRW1iZXIgbW9kdWxlcyB0byByZWdp
c3RlciBpbmplY3Rpb24gaGVscGVycyBmb3IgYQorICAgIGdpdmVuIGNvbnRhaW5lciB0eXBlLiBI
ZWxwZXJzIGFyZSBleHBvcnRlZCB0byB0aGUgYGluamVjdGAgbmFtZXNwYWNlIGFzIHRoZQorICAg
IGNvbnRhaW5lciB0eXBlIGl0c2VsZi4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIGNy
ZWF0ZUluamVjdGlvbkhlbHBlcgorICAgIEBzaW5jZSAxLjEwLjAKKyAgICBAZm9yIEVtYmVyCisg
ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGNvbnRhaW5lciB0eXBlIHRoZSBoZWxwZXIgd2ls
bCBpbmplY3QKKyAgICBAcGFyYW0ge0Z1bmN0aW9ufSB2YWxpZGF0b3IgQSB2YWxpZGF0aW9uIGNh
bGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgYXQgbWl4aW4tdGltZQorICAqLworCisgIGZ1bmN0aW9u
IGNyZWF0ZUluamVjdGlvbkhlbHBlcih0eXBlLCB2YWxpZGF0b3IpIHsKKyAgICB0eXBlVmFsaWRh
dG9yc1t0eXBlXSA9IHZhbGlkYXRvcjsKKworICAgIGluamVjdFt0eXBlXSA9IGZ1bmN0aW9uIChu
YW1lKSB7CisgICAgICByZXR1cm4gbmV3IF9lbWJlck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVm
YXVsdCh0eXBlLCBuYW1lKTsKKyAgICB9OworICB9CisKKyAgLyoqCisgICAgVmFsaWRhdGlvbiBm
dW5jdGlvbiB0aGF0IHJ1bnMgcGVyLXR5cGUgdmFsaWRhdGlvbiBmdW5jdGlvbnMgb25jZSBmb3Ig
ZWFjaAorICAgIGluamVjdGVkIHR5cGUgZW5jb3VudGVyZWQuCisgIAorICAgIEBwcml2YXRlCisg
ICAgQG1ldGhvZCB2YWxpZGF0ZVByb3BlcnR5SW5qZWN0aW9ucworICAgIEBzaW5jZSAxLjEwLjAK
KyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmplY3R9IGZhY3RvcnkgVGhlIGZhY3Rvcnkg
b2JqZWN0CisgICovCisKKyAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUluamVjdGlvbnMoZmFj
dG9yeSkgeworICAgIHZhciBwcm90byA9IGZhY3RvcnkucHJvdG8oKTsKKyAgICB2YXIgdHlwZXMg
PSBbXTsKKyAgICB2YXIga2V5LCBkZXNjLCB2YWxpZGF0b3IsIGksIGw7CisKKyAgICBmb3IgKGtl
eSBpbiBwcm90bykgeworICAgICAgZGVzYyA9IHByb3RvW2tleV07CisgICAgICBpZiAoZGVzYyBp
bnN0YW5jZW9mIF9lbWJlck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVmYXVsdCAmJiB0eXBlcy5p
bmRleE9mKGRlc2MudHlwZSkgPT09IC0xKSB7CisgICAgICAgIHR5cGVzLnB1c2goZGVzYy50eXBl
KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHlwZXMubGVuZ3RoKSB7CisgICAgICBmb3Ig
KGkgPSAwLCBsID0gdHlwZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhbGlkYXRv
ciA9IHR5cGVWYWxpZGF0b3JzW3R5cGVzW2ldXTsKKworICAgICAgICBpZiAodHlwZW9mIHZhbGlk
YXRvciA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHZhbGlkYXRvcihmYWN0b3J5KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItcnVudGltZS9pcy1lcXVhbCcsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhw
b3J0cykgeworICAvKioKKyAgICBDb21wYXJlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIHRydWUg
aWYgdGhleSBhcmUgZXF1YWwuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5pc0Vx
dWFsKCdoZWxsbycsICdoZWxsbycpOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgRW1i
ZXIuaXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UK
KyAgICBgYGAKKyAgCisgICAgYGlzRXF1YWxgIGlzIGEgbW9yZSBzcGVjaWZpYyBjb21wYXJpc29u
IHRoYW4gYSB0cmlwbGUgZXF1YWwgY29tcGFyaXNvbi4KKyAgICBJdCB3aWxsIGNhbGwgdGhlIGBp
c0VxdWFsYCBpbnN0YW5jZSBtZXRob2Qgb24gdGhlIG9iamVjdHMgYmVpbmcKKyAgICBjb21wYXJl
ZCwgYWxsb3dpbmcgZmluZXIgY29udHJvbCBvdmVyIHdoZW4gb2JqZWN0cyBzaG91bGQgYmUgY29u
c2lkZXJlZAorICAgIGVxdWFsIHRvIGVhY2ggb3RoZXIuCisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBsZXQgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICBpc0VxdWFsKG90
aGVyKSB7IHJldHVybiB0aGlzLnNzbiA9PSBvdGhlci5zc247IH0KKyAgICB9KTsKKyAgCisgICAg
bGV0IHBlcnNvbkEgPSBQZXJzb24uY3JlYXRlKHtuYW1lOiAnTXVoYW1tYWQgQWxpJywgc3NuOiAn
MTIzLTQ1LTY3ODknfSk7CisgICAgbGV0IHBlcnNvbkIgPSBQZXJzb24uY3JlYXRlKHtuYW1lOiAn
Q2Fzc2l1cyBDbGF5Jywgc3NuOiAnMTIzLTQ1LTY3ODknfSk7CisgIAorICAgIEVtYmVyLmlzRXF1
YWwocGVyc29uQSwgcGVyc29uQik7IC8vIHRydWUKKyAgICBgYGAKKyAgCisgICAgRHVlIHRvIHRo
ZSBleHBlbnNlIG9mIGFycmF5IGNvbXBhcmlzb25zLCBjb2xsZWN0aW9ucyB3aWxsIG5ldmVyIGJl
IGVxdWFsIHRvCisgICAgZWFjaCBvdGhlciBldmVuIGlmIGVhY2ggb2YgdGhlaXIgaXRlbXMgYXJl
IGVxdWFsIHRvIGVhY2ggb3RoZXIuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5p
c0VxdWFsKFs0LCAyXSwgWzQsIDJdKTsgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQorICAg
IGBgYAorICAKKyAgICBAbWV0aG9kIGlzRXF1YWwKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFt
IHtPYmplY3R9IGEgZmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICBAcGFyYW0ge09iamVjdH0g
YiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICBAcmV0dXJuIHtCb29sZWFufQorICAgIEBw
dWJsaWMKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGlzRXF1
YWw7CisKKyAgZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7CisgICAgaWYgKGEgJiYgdHlwZW9mIGEu
aXNFcXVhbCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgcmV0dXJuIGEuaXNFcXVhbChiKTsKKyAg
ICB9CisKKyAgICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHsK
KyAgICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCk7CisgICAgfQorCisgICAg
cmV0dXJuIGEgPT09IGI7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy8t
cHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJv
cGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJlci1tZXRhbC9tZXRh
JywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycs
ICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0aWVzJywgJ2VtYmVy
LW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3N5bWJvbCddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsT2JzZXJ2ZXIsIF9lbWJlck1l
dGFsUHJvcGVydHlfZXZlbnRzLCBfZW1iZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbFByb3Bl
cnRpZXMsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ug
c3RyaWN0JzsKKworICB2YXIgX01peGluJGNyZWF0ZTsKKworICBleHBvcnRzLmlzUHJveHkgPSBp
c1Byb3h5OworCisgIHZhciBJU19QUk9YWSA9IF9lbWJlck1ldGFsU3ltYm9sLmRlZmF1bHQoJ0lT
X1BST1hZJyk7CisKKyAgZnVuY3Rpb24gaXNQcm94eSh2YWx1ZSkgeworICAgIHJldHVybiB2YWx1
ZSAmJiB2YWx1ZVtJU19QUk9YWV07CisgIH0KKworICBmdW5jdGlvbiBjb250ZW50UHJvcGVydHlX
aWxsQ2hhbmdlKGNvbnRlbnQsIGNvbnRlbnRLZXkpIHsKKyAgICB2YXIga2V5ID0gY29udGVudEtl
eS5zbGljZSg4KTsgLy8gcmVtb3ZlICJjb250ZW50LiIKKyAgICBpZiAoa2V5IGluIHRoaXMpIHsK
KyAgICAgIHJldHVybjsKKyAgICB9IC8vIGlmIHNoYWRvd2VkIGluIHByb3h5CisgICAgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CisgIH0K
KworICBmdW5jdGlvbiBjb250ZW50UHJvcGVydHlEaWRDaGFuZ2UoY29udGVudCwgY29udGVudEtl
eSkgeworICAgIHZhciBrZXkgPSBjb250ZW50S2V5LnNsaWNlKDgpOyAvLyByZW1vdmUgImNvbnRl
bnQuIgorICAgIGlmIChrZXkgaW4gdGhpcykgeworICAgICAgcmV0dXJuOworICAgIH0gLy8gaWYg
c2hhZG93ZWQgaW4gcHJveHkKKyAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0
eURpZENoYW5nZSh0aGlzLCBrZXkpOworICB9CisKKyAgLyoqCisgICAgYEVtYmVyLlByb3h5TWl4
aW5gIGZvcndhcmRzIGFsbCBwcm9wZXJ0aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94eSBpdHNl
bGYKKyAgICB0byBhIHByb3hpZWQgYGNvbnRlbnRgIG9iamVjdC4gIFNlZSBFbWJlci5PYmplY3RQ
cm94eSBmb3IgbW9yZSBkZXRhaWxzLgorICAKKyAgICBAY2xhc3MgUHJveHlNaXhpbgorICAgIEBu
YW1lc3BhY2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHt9LCBfTWl4aW4k
Y3JlYXRlW0lTX1BST1hZXSA9IHRydWUsIF9NaXhpbiRjcmVhdGUuY29udGVudCA9IG51bGwsIF9N
aXhpbiRjcmVhdGUuX2NvbnRlbnREaWRDaGFuZ2UgPSBfZW1iZXJNZXRhbE1peGluLm9ic2VydmVy
KCdjb250ZW50JywgZnVuY3Rpb24gKCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdD
YW5cJ3Qgc2V0IFByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50JykgIT09IHRoaXMpOworICB9KSwgX01peGluJGNyZWF0
ZS5pc1RydXRoeSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQuYm9vbCgnY29udGVudCcp
LCBfTWl4aW4kY3JlYXRlLl9kZWJ1Z0NvbnRhaW5lcktleSA9IG51bGwsIF9NaXhpbiRjcmVhdGUu
d2lsbFdhdGNoUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkg
PSAnY29udGVudC4nICsga2V5OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX2FkZEJlZm9yZU9i
c2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIodGhpcywgY29udGVudEtleSwg
bnVsbCwgY29udGVudFByb3BlcnR5RGlkQ2hhbmdlKTsKKyAgfSwgX01peGluJGNyZWF0ZS5kaWRV
bndhdGNoUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnRLZXkgPSAn
Y29udGVudC4nICsga2V5OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuX3JlbW92ZUJlZm9yZU9i
c2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Up
OworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywgY29udGVudEtl
eSwgbnVsbCwgY29udGVudFByb3BlcnR5RGlkQ2hhbmdlKTsKKyAgfSwgX01peGluJGNyZWF0ZS51
bmtub3duUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5KSB7CisgICAgdmFyIGNvbnRlbnQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbnRlbnQnKTsKKyAgICBpZiAoY29udGVu
dCkgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1lvdSBhdHRlbXB0ZWQgdG8g
YWNjZXNzIGAnICsga2V5ICsgJ2AgZnJvbSBgJyArIHRoaXMgKyAnYCwgYnV0IG9iamVjdCBwcm94
eWluZyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBtb2RlbC4nICsga2V5ICsgJ2AgaW5zdGVh
ZC4nLCAhdGhpcy5pc0NvbnRyb2xsZXIsIHsgaWQ6ICdlbWJlci1ydW50aW1lLmNvbnRyb2xsZXIt
cHJveHknLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQoY29udGVudCwga2V5KTsKKyAgICB9CisgIH0sIF9NaXhpbiRjcmVhdGUuc2V0
VW5rbm93blByb3BlcnR5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICB2YXIgbSA9IF9l
bWJlck1ldGFsTWV0YS5tZXRhKHRoaXMpOworICAgIGlmIChtLnByb3RvID09PSB0aGlzKSB7Cisg
ICAgICAvLyBpZiBtYXJrZWQgYXMgcHJvdG90eXBlIHRoZW4ganVzdCBkZWZpbmVQcm9wZXJ0eQor
ICAgICAgLy8gcmF0aGVyIHRoYW4gZGVsZWdhdGUKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydGll
cy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIG51bGwsIHZhbHVlKTsKKyAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICB9CisKKyAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY29udGVudCcpOworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdDYW5u
b3QgZGVsZWdhdGUgc2V0KFwnJyArIGtleSArICdcJywgJyArIHZhbHVlICsgJykgdG8gdGhlIFwn
Y29udGVudFwnIHByb3BlcnR5IG9mIG9iamVjdCBwcm94eSAnICsgdGhpcyArICc6IGl0cyBcJ2Nv
bnRlbnRcJyBpcyB1bmRlZmluZWQuJywgY29udGVudCk7CisKKyAgICBfZW1iZXJNZXRhbERlYnVn
LmRlcHJlY2F0ZSgnWW91IGF0dGVtcHRlZCB0byBzZXQgYCcgKyBrZXkgKyAnYCBmcm9tIGAnICsg
dGhpcyArICdgLCBidXQgb2JqZWN0IHByb3h5aW5nIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ug
YG1vZGVsLicgKyBrZXkgKyAnYCBpbnN0ZWFkLicsICF0aGlzLmlzQ29udHJvbGxlciwgeyBpZDog
J2VtYmVyLXJ1bnRpbWUuY29udHJvbGxlci1wcm94eScsIHVudGlsOiAnMy4wLjAnIH0pOworICAg
IHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoY29udGVudCwga2V5LCB2YWx1ZSk7
CisgIH0sIF9NaXhpbiRjcmVhdGUpKTsKK30pOworCisvKioKKyAgVGhlIG9iamVjdCB3aG9zZSBw
cm9wZXJ0aWVzIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgQHByb3BlcnR5IGNvbnRlbnQKKyAgQHR5
cGUgRW1iZXIuT2JqZWN0CisgIEBkZWZhdWx0IG51bGwKKyAgQHByaXZhdGUKKyovCitlbmlmZWQo
J2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FjdGlvbl9oYW5kbGVyJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxN
aXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIK
KyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMuZGVwcmVjYXRlVW5kZXJzY29yZUFjdGlvbnMgPSBkZXByZWNhdGVVbmRlcnNjb3Jl
QWN0aW9uczsKKworICAvKioKKyAgICBgRW1iZXIuQWN0aW9uSGFuZGxlcmAgaXMgYXZhaWxhYmxl
IG9uIHNvbWUgZmFtaWxpYXIgY2xhc3NlcyBpbmNsdWRpbmcKKyAgICBgRW1iZXIuUm91dGVgLCBg
RW1iZXIuVmlld2AsIGBFbWJlci5Db21wb25lbnRgLCBhbmQgYEVtYmVyLkNvbnRyb2xsZXJgLgor
ICAgIChJbnRlcm5hbGx5IHRoZSBtaXhpbiBpcyB1c2VkIGJ5IGBFbWJlci5Db3JlVmlld2AsIGBF
bWJlci5Db250cm9sbGVyTWl4aW5gLAorICAgIGFuZCBgRW1iZXIuUm91dGVgIGFuZCBhdmFpbGFi
bGUgdG8gdGhlIGFib3ZlIGNsYXNzZXMgdGhyb3VnaAorICAgIGluaGVyaXRhbmNlLikKKyAgCisg
ICAgQGNsYXNzIEFjdGlvbkhhbmRsZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHByaXZh
dGUKKyAgKi8KKyAgdmFyIEFjdGlvbkhhbmRsZXIgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNy
ZWF0ZSh7CisgICAgbWVyZ2VkUHJvcGVydGllczogWydhY3Rpb25zJ10sCisKKyAgICAvKioKKyAg
ICAgIFRoZSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucywga2V5ZWQgYnkgbmFtZSwgYXZhaWxhYmxl
IG9uIHRoaXMKKyAgICAgIGBBY3Rpb25IYW5kbGVyYCBhcyBhY3Rpb24gdGFyZ2V0cy4KKyAgICAg
ICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBpbnZva2VkIHdoZW4gYSBtYXRjaGluZyBge3thY3Rp
b259fWAgaXMgdHJpZ2dlcmVkCisgICAgICBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIGFuZCB0aGUg
YXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIGlzIHRoaXMgcm91dGUuCisgICAgICAgQWN0aW9u
cyBjYW4gYWxzbyBiZSBpbnZva2VkIGZyb20gb3RoZXIgcGFydHMgb2YgeW91ciBhcHBsaWNhdGlv
bgorICAgICAgdmlhIGBBY3Rpb25IYW5kbGVyI3NlbmRgLgorICAgICAgIFRoZSBgYWN0aW9uc2Ag
aGFzaCB3aWxsIGluaGVyaXQgYWN0aW9uIGhhbmRsZXJzIGZyb20KKyAgICAgIHRoZSBgYWN0aW9u
c2AgaGFzaCBkZWZpbmVkIG9uIGV4dGVuZGVkIHBhcmVudCBjbGFzc2VzCisgICAgICBvciBtaXhp
bnMgcmF0aGVyIHRoYW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgaGFzaCwgZS5nLjoKKyAgICAg
ICBgYGBqcworICAgICAgQXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJlci5NaXhpbi5jcmVhdGUo
eworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgZGlzcGxheUJhbm5lcjogZnVuY3Rpb24o
bXNnKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
IH0pOworICAgICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNh
bkRpc3BsYXlCYW5uZXIsIHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIHBsYXlNdXNp
YzogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgIH0pOworICAgICAgIC8vIGBXZWxjb21lUm91dGVgLCB3aGVuIGFjdGl2ZSwgd2ls
bCBiZSBhYmxlIHRvIHJlc3BvbmQKKyAgICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2UgdGhl
IGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQgcmF0aGVyCisgICAgICAvLyB0aGVuIHJlcGxhY2VkIHdo
ZW4gZXh0ZW5kaW5nIG1peGlucyAvIHBhcmVudCBjbGFzc2VzLgorICAgICAgdGhpcy5zZW5kKCdk
aXNwbGF5QmFubmVyJyk7CisgICAgICB0aGlzLnNlbmQoJ3BsYXlNdXNpYycpOworICAgICAgYGBg
CisgICAgICAgV2l0aGluIGEgQ29udHJvbGxlciwgUm91dGUsIFZpZXcgb3IgQ29tcG9uZW50J3Mg
YWN0aW9uIGhhbmRsZXIsCisgICAgICB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0IGlz
IHRoZSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvcgorICAgICAgQ29tcG9uZW50IG9iamVjdDoK
KyAgICAgICBgYGBqcworICAgICAgQXBwLlNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7
CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7Cisg
ICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJGb3IoInNvbmciKTsKKyAgICAgICAgICAgIHRoaXMu
dHJhbnNpdGlvblRvKCJvdGhlci5yb3V0ZSIpOworICAgICAgICAgICAgLi4uCisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEl0IGlzIGFsc28gcG9z
c2libGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoLi4uYXJndW1lbnRzKWAgZnJvbSB3aXRoaW4gYW4K
KyAgICAgIGFjdGlvbiBoYW5kbGVyIGlmIGl0IG92ZXJyaWRlcyBhIGhhbmRsZXIgZGVmaW5lZCBv
biBhIHBhcmVudAorICAgICAgY2xhc3Mgb3IgbWl4aW46CisgICAgICAgVGFrZSBmb3IgZXhhbXBs
ZSB0aGUgZm9sbG93aW5nIHJvdXRlczoKKyAgICAgICBgYGBqcworICAgICAgQXBwLkRlYnVnUm91
dGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAg
ZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNvbnNvbGUu
ZGVidWcoInRyb2xvbG8iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVn
Um91dGUsIHsKKyAgICAgICAgYWN0aW9uczogeworICAgICAgICAgIGRlYnVnUm91dGVJbmZvcm1h
dGlvbjogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91
dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVidWdSb3V0ZQorICAgICAgICAgICAgdGhp
cy5fc3VwZXIoLi4uYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAvLyBzaG93IGFkZGl0aW9uYWwg
YW5ub3lhbmNlCisgICAgICAgICAgICB3aW5kb3cuYWxlcnQoLi4uKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgIyMgQnViYmxpbmcKKyAgICAg
ICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVy
IGRlZmluZWQKKyAgICAgIG9uIHRoZSBgYWN0aW9uc2AgaGFzaCBoYW5kbGVzIGl0LiBUbyBjb250
aW51ZSBidWJibGluZyB0aGUgYWN0aW9uLAorICAgICAgeW91IG11c3QgcmV0dXJuIGB0cnVlYCBm
cm9tIHRoZSBoYW5kbGVyOgorICAgICAgIGBgYGpzCisgICAgICBBcHAuUm91dGVyLm1hcChmdW5j
dGlvbigpIHsKKyAgICAgICAgdGhpcy5yb3V0ZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgICB0aGlzLnJvdXRlKCJzb25nIik7CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICAg
QXBwLkFsYnVtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7
CisgICAgICAgICAgc3RhcnRQbGF5aW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRl
LmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBzdGFydFBsYXlpbmc6IGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgLy8gLi4uCisgICAgICAgICAgICAgaWYgKGFjdGlvblNo
b3VsZEFsc29CZVRyaWdnZXJlZE9uUGFyZW50Um91dGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBhY3Rpb25zCisgICAgICBAdHlwZSBPYmplY3QK
KyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqLworCisgICAgLyoqCisg
ICAgICBUcmlnZ2VycyBhIG5hbWVkIGFjdGlvbiBvbiB0aGUgYEFjdGlvbkhhbmRsZXJgLiBBbnkg
cGFyYW1ldGVycworICAgICAgc3VwcGxpZWQgYWZ0ZXIgdGhlIGBhY3Rpb25OYW1lYCBzdHJpbmcg
d2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzCisgICAgICB0byB0aGUgYWN0aW9uIHRhcmdldCBm
dW5jdGlvbi4KKyAgICAgICBJZiB0aGUgYEFjdGlvbkhhbmRsZXJgIGhhcyBpdHMgYHRhcmdldGAg
cHJvcGVydHkgc2V0LCBhY3Rpb25zIG1heQorICAgICAgYnViYmxlIHRvIHRoZSBgdGFyZ2V0YC4g
QnViYmxpbmcgaGFwcGVucyB3aGVuIGFuIGBhY3Rpb25OYW1lYCBjYW4KKyAgICAgIG5vdCBiZSBm
b3VuZCBpbiB0aGUgYEFjdGlvbkhhbmRsZXJgJ3MgYGFjdGlvbnNgIGhhc2ggb3IgaWYgdGhlCisg
ICAgICBhY3Rpb24gdGFyZ2V0IGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLgorICAgICAgIEV4YW1w
bGUKKyAgICAgICBgYGBqcworICAgICAgQXBwLldlbGNvbWVSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4
dGVuZCh7CisgICAgICAgIGFjdGlvbnM6IHsKKyAgICAgICAgICBwbGF5VGhlbWU6IGZ1bmN0aW9u
KCkgeworICAgICAgICAgICAgIHRoaXMuc2VuZCgncGxheU11c2ljJywgJ3RoZW1lLm1wMycpOwor
ICAgICAgICAgIH0sCisgICAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbih0cmFjaykgeworICAg
ICAgICAgICAgLy8gLi4uCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAg
IGBgYAorICAgICAgIEBtZXRob2Qgc2VuZAorICAgICAgQHBhcmFtIHtTdHJpbmd9IGFjdGlvbk5h
bWUgVGhlIGFjdGlvbiB0byB0cmlnZ2VyCisgICAgICBAcGFyYW0geyp9IGNvbnRleHQgYSBjb250
ZXh0IHRvIHNlbmQgd2l0aCB0aGUgYWN0aW9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBz
ZW5kOiBmdW5jdGlvbiAoYWN0aW9uTmFtZSkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3Vt
ZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkg
PSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJn
dW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICB2YXIgdGFyZ2V0OworCisgICAgICBpZiAo
dGhpcy5hY3Rpb25zICYmIHRoaXMuYWN0aW9uc1thY3Rpb25OYW1lXSkgeworICAgICAgICB2YXIg
c2hvdWxkQnViYmxlID0gdGhpcy5hY3Rpb25zW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3Mp
ID09PSB0cnVlOworICAgICAgICBpZiAoIXNob3VsZEJ1YmJsZSkgeworICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAodGFyZ2V0ID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd0YXJnZXQnKSkgeworICAgICAgICB2YXIgX3RhcmdldDsK
KworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGB0YXJnZXRgIGZvciAnICsg
dGhpcyArICcgKCcgKyB0YXJnZXQgKyAnKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRgIG1ldGhvZCcs
IHR5cGVvZiB0YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJyk7CisgICAgICAgIChfdGFyZ2V0ID0g
dGFyZ2V0KS5zZW5kLmFwcGx5KF90YXJnZXQsIGFyZ3VtZW50cyk7CisgICAgICB9CisgICAgfSwK
KworICAgIHdpbGxNZXJnZU1peGluOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAgICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdTcGVjaWZ5aW5nIGBfYWN0aW9uc2AgYW5kIGBhY3Rpb25zYCBpbiB0
aGUgc2FtZSBtaXhpbiBpcyBub3Qgc3VwcG9ydGVkLicsICFwcm9wcy5hY3Rpb25zIHx8ICFwcm9w
cy5fYWN0aW9ucyk7CisKKyAgICAgIGlmIChwcm9wcy5fYWN0aW9ucykgeworICAgICAgICBfZW1i
ZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnU3BlY2lmeWluZyBhY3Rpb25zIGluIGBfYWN0aW9uc2Ag
aXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBgYWN0aW9uc2AgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJ1bnRpbWUuYWN0aW9uLWhhbmRsZXItX2FjdGlvbnMnLCB1bnRpbDogJzMuMC4w
JyB9KTsKKworICAgICAgICBwcm9wcy5hY3Rpb25zID0gcHJvcHMuX2FjdGlvbnM7CisgICAgICAg
IGRlbGV0ZSBwcm9wcy5fYWN0aW9uczsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IEFjdGlvbkhhbmRsZXI7CisKKyAgZnVuY3Rpb24gZGVwcmVjYXRlVW5kZXJz
Y29yZUFjdGlvbnMoZmFjdG9yeSkgeworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWN0b3J5
LnByb3RvdHlwZSwgJ19hY3Rpb25zJywgeworICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAg
ICAgZW51bWVyYWJsZTogZmFsc2UsCisgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeworICAg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBzZXQgYF9hY3Rpb25zYCBv
biAnICsgdGhpcyArICcsIHBsZWFzZSB1c2UgYGFjdGlvbnNgIGluc3RlYWQuJyk7CisgICAgICB9
LAorICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdVc2FnZSBvZiBgX2FjdGlvbnNgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgYWN0aW9uc2Ag
aW5zdGVhZC4nLCBmYWxzZSwgeyBpZDogJ2VtYmVyLXJ1bnRpbWUuYWN0aW9uLWhhbmRsZXItX2Fj
dGlvbnMnLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnYWN0aW9ucycpOworICAgICAgfQorICAgIH0pOworICB9Cit9
KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9taXhpbnMvYXJyYXknLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9zeW1ib2wnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2lzX25vbmUnLCAn
ZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1tZXRhbC9taXhpbicsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVy
LW1ldGFsL21ldGEnLCAnZW1iZXItbWV0YWwvdGFncycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9l
YWNoX3Byb3h5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1l
dGFsU3ltYm9sLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxDb21wdXRlZCwg
X2VtYmVyTWV0YWxJc19ub25lLCBfZW1iZXJSdW50aW1lTWl4aW5zRW51bWVyYWJsZSwgX2VtYmVy
TWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRXZlbnRz
LCBfZW1iZXJNZXRhbE1ldGEsIF9lbWJlck1ldGFsVGFncywgX2VtYmVyUnVudGltZVN5c3RlbUVh
Y2hfcHJveHkpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisgICovCisKKyAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAvLyBIRUxQRVJTCisgIC8vCisgICd1c2Ugc3RyaWN0
JzsKKworICB2YXIgX01peGluJGNyZWF0ZTsKKworICBleHBvcnRzLmFkZEFycmF5T2JzZXJ2ZXIg
PSBhZGRBcnJheU9ic2VydmVyOworICBleHBvcnRzLnJlbW92ZUFycmF5T2JzZXJ2ZXIgPSByZW1v
dmVBcnJheU9ic2VydmVyOworICBleHBvcnRzLm9iamVjdEF0ID0gb2JqZWN0QXQ7CisgIGV4cG9y
dHMuaXNFbWJlckFycmF5ID0gaXNFbWJlckFycmF5OworCisgIGZ1bmN0aW9uIGFycmF5T2JzZXJ2
ZXJzSGVscGVyKG9iaiwgdGFyZ2V0LCBvcHRzLCBvcGVyYXRpb24sIG5vdGlmeSkgeworICAgIHZh
ciB3aWxsQ2hhbmdlID0gb3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UgfHwgJ2FycmF5V2lsbENoYW5n
ZSc7CisgICAgdmFyIGRpZENoYW5nZSA9IG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UgfHwgJ2FycmF5
RGlkQ2hhbmdlJzsKKyAgICB2YXIgaGFzT2JzZXJ2ZXJzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KG9iaiwgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7CisKKyAgICBpZiAoaGFzT2JzZXJ2ZXJz
ID09PSBub3RpZnkpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5
V2lsbENoYW5nZShvYmosICdoYXNBcnJheU9ic2VydmVycycpOworICAgIH0KKworICAgIG9wZXJh
dGlvbihvYmosICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKKyAgICBvcGVy
YXRpb24ob2JqLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgIGlm
IChoYXNPYnNlcnZlcnMgPT09IG5vdGlmeSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9l
dmVudHMucHJvcGVydHlEaWRDaGFuZ2Uob2JqLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKKyAgICB9
CisKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgZnVuY3Rpb24gYWRkQXJyYXlPYnNlcnZlcihh
cnJheSwgdGFyZ2V0LCBvcHRzKSB7CisgICAgcmV0dXJuIGFycmF5T2JzZXJ2ZXJzSGVscGVyKGFy
cmF5LCB0YXJnZXQsIG9wdHMsIF9lbWJlck1ldGFsRXZlbnRzLmFkZExpc3RlbmVyLCBmYWxzZSk7
CisgIH0KKworICBmdW5jdGlvbiByZW1vdmVBcnJheU9ic2VydmVyKGFycmF5LCB0YXJnZXQsIG9w
dHMpIHsKKyAgICByZXR1cm4gYXJyYXlPYnNlcnZlcnNIZWxwZXIoYXJyYXksIHRhcmdldCwgb3B0
cywgX2VtYmVyTWV0YWxFdmVudHMucmVtb3ZlTGlzdGVuZXIsIHRydWUpOworICB9CisKKyAgZnVu
Y3Rpb24gb2JqZWN0QXQoY29udGVudCwgaWR4KSB7CisgICAgaWYgKGNvbnRlbnQub2JqZWN0QXQp
IHsKKyAgICAgIHJldHVybiBjb250ZW50Lm9iamVjdEF0KGlkeCk7CisgICAgfQorCisgICAgcmV0
dXJuIGNvbnRlbnRbaWR4XTsKKyAgfQorCisgIHZhciBFTUJFUl9BUlJBWSA9IF9lbWJlck1ldGFs
U3ltYm9sLmRlZmF1bHQoJ0VNQkVSX0FSUkFZJyk7CisKKyAgZnVuY3Rpb24gaXNFbWJlckFycmF5
KG9iaikgeworICAgIHJldHVybiBvYmogJiYgISFvYmpbRU1CRVJfQVJSQVldOworICB9CisKKyAg
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgorICAvLyBBUlJBWQorICAvLworICAvKioKKyAgICBUaGlzIG1peGluIGltcGxlbWVudHMg
T2JzZXJ2ZXItZnJpZW5kbHkgQXJyYXktbGlrZSBiZWhhdmlvci4gSXQgaXMgbm90IGEKKyAgICBj
b25jcmV0ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IGNhbiBiZSB1c2VkIHVwIGJ5IG90aGVyIGNs
YXNzZXMgdGhhdCB3YW50CisgICAgdG8gYXBwZWFyIGxpa2UgYXJyYXlzLgorICAKKyAgICBGb3Ig
ZXhhbXBsZSwgQXJyYXlQcm94eSBpcyBhIGNvbmNyZXRlIGNsYXNzZXMgdGhhdCBjYW4KKyAgICBi
ZSBpbnN0YW50aWF0ZWQgdG8gaW1wbGVtZW50IGFycmF5LWxpa2UgYmVoYXZpb3IuIEJvdGggb2Yg
dGhlc2UgY2xhc3NlcyB1c2UKKyAgICB0aGUgQXJyYXkgTWl4aW4gYnkgd2F5IG9mIHRoZSBNdXRh
YmxlQXJyYXkgbWl4aW4sIHdoaWNoIGFsbG93cyBvYnNlcnZhYmxlCisgICAgY2hhbmdlcyB0byBi
ZSBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGFycmF5LgorICAKKyAgICBVbmxpa2UgYEVtYmVyLkVu
dW1lcmFibGUsYCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9kcyBzcGVjaWZpY2FsbHkgZm9yCisg
ICAgY29sbGVjdGlvbnMgdGhhdCBwcm92aWRlIGluZGV4LW9yZGVyZWQgYWNjZXNzIHRvIHRoZWly
IGNvbnRlbnRzLiBXaGVuIHlvdQorICAgIGFyZSBkZXNpZ25pbmcgY29kZSB0aGF0IG5lZWRzIHRv
IGFjY2VwdCBhbnkga2luZCBvZiBBcnJheS1saWtlIG9iamVjdCwgeW91CisgICAgc2hvdWxkIHVz
ZSB0aGVzZSBtZXRob2RzIGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZlcyBiZWNhdXNlIHRoZXNl
IHdpbGwKKyAgICBwcm9wZXJseSBub3RpZnkgb2JzZXJ2ZXJzIG9mIGNoYW5nZXMgdG8gdGhlIGFy
cmF5LgorICAKKyAgICBBbHRob3VnaCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2llbnQsIHRoZXkg
ZG8gYWRkIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gdG8KKyAgICB5b3VyIGFwcGxpY2F0aW9uIHNv
IGl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGVtIG9ubHkgd2hlbiB5b3UgbmVlZCB0aGUKKyAg
ICBmbGV4aWJpbGl0eSBvZiB1c2luZyBib3RoIHRydWUgSmF2YVNjcmlwdCBhcnJheXMgYW5kICJ2
aXJ0dWFsIiBhcnJheXMgc3VjaAorICAgIGFzIGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9ucy4K
KyAgCisgICAgWW91IGNhbiB1c2UgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB0
byBhY2Nlc3MgYW5kIG1vZGlmeSBhcnJheQorICAgIGNvbnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5
IHdheS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQorICAgIG1lbWJlcnNo
aXAgb2YgYW4gYXJyYXkgY2hhbmdlcyBieSB1c2luZyBgLm9ic2VydmVzKCdteUFycmF5LltdJylg
LgorICAKKyAgICBUbyBzdXBwb3J0IGBFbWJlci5BcnJheWAgaW4geW91ciBvd24gY2xhc3MsIHlv
dSBtdXN0IG92ZXJyaWRlIHR3bworICAgIHByaW1pdGl2ZXMgdG8gdXNlIGl0OiBgbGVuZ3RoKClg
IGFuZCBgb2JqZWN0QXQoKWAuCisgIAorICAgIE5vdGUgdGhhdCB0aGUgRW1iZXIuQXJyYXkgbWl4
aW4gYWxzbyBpbmNvcnBvcmF0ZXMgdGhlIGBFbWJlci5FbnVtZXJhYmxlYAorICAgIG1peGluLiBB
bGwgYEVtYmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJlIGFsc28gZW51bWVyYWJsZS4KKyAgCisg
ICAgQGNsYXNzIEFycmF5CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEB1c2VzIEVtYmVyLkVu
dW1lcmFibGUKKyAgICBAc2luY2UgRW1iZXIgMC45LjAKKyAgICBAcHVibGljCisgICovCisgIGV4
cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRp
bWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQsIChfTWl4aW4kY3JlYXRlID0ge30sIF9NaXhpbiRj
cmVhdGVbRU1CRVJfQVJSQVldID0gdHJ1ZSwgX01peGluJGNyZWF0ZS5sZW5ndGggPSBudWxsLCBf
TWl4aW4kY3JlYXRlLm9iamVjdEF0ID0gZnVuY3Rpb24gKGlkeCkgeworICAgIGlmIChpZHggPCAw
IHx8IGlkeCA+PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7
CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQodGhpcywgaWR4KTsKKyAgfSwgX01peGluJGNyZWF0ZS5vYmplY3Rz
QXQgPSBmdW5jdGlvbiAoaW5kZXhlcykgeworICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICBy
ZXR1cm4gaW5kZXhlcy5tYXAoZnVuY3Rpb24gKGlkeCkgeworICAgICAgcmV0dXJuIG9iamVjdEF0
KF90aGlzLCBpZHgpOworICAgIH0pOworICB9LCBfTWl4aW4kY3JlYXRlLm5leHRPYmplY3QgPSBm
dW5jdGlvbiAoaWR4KSB7CisgICAgcmV0dXJuIG9iamVjdEF0KHRoaXMsIGlkeCk7CisgIH0sIF9N
aXhpbiRjcmVhdGVbJ1tdJ10gPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICBn
ZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisgICAgc2V0
OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAgdGhpcy5yZXBsYWNlKDAsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIHZhbHVlKTsKKyAgICAgIHJldHVy
biB0aGlzOworICAgIH0KKyAgfSksIF9NaXhpbiRjcmVhdGUuZmlyc3RPYmplY3QgPSBfZW1iZXJN
ZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gb2JqZWN0QXQo
dGhpcywgMCk7CisgIH0pLnJlYWRPbmx5KCksIF9NaXhpbiRjcmVhdGUubGFzdE9iamVjdCA9IF9l
bWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBvYmpl
Y3RBdCh0aGlzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpIC0g
MSk7CisgIH0pLnJlYWRPbmx5KCksIF9NaXhpbiRjcmVhdGUuY29udGFpbnMgPSBmdW5jdGlvbiAo
b2JqKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihvYmopID49IDA7CisgIH0sIF9NaXhpbiRj
cmVhdGUuc2xpY2UgPSBmdW5jdGlvbiAoYmVnaW5JbmRleCwgZW5kSW5kZXgpIHsKKyAgICB2YXIg
cmV0ID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQSgpOworICAgIHZhciBsZW5ndGggPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworCisgICAgaWYgKF9lbWJl
ck1ldGFsSXNfbm9uZS5kZWZhdWx0KGJlZ2luSW5kZXgpKSB7CisgICAgICBiZWdpbkluZGV4ID0g
MDsKKyAgICB9CisKKyAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoZW5kSW5kZXgp
IHx8IGVuZEluZGV4ID4gbGVuZ3RoKSB7CisgICAgICBlbmRJbmRleCA9IGxlbmd0aDsKKyAgICB9
CisKKyAgICBpZiAoYmVnaW5JbmRleCA8IDApIHsKKyAgICAgIGJlZ2luSW5kZXggPSBsZW5ndGgg
KyBiZWdpbkluZGV4OworICAgIH0KKworICAgIGlmIChlbmRJbmRleCA8IDApIHsKKyAgICAgIGVu
ZEluZGV4ID0gbGVuZ3RoICsgZW5kSW5kZXg7CisgICAgfQorCisgICAgd2hpbGUgKGJlZ2luSW5k
ZXggPCBlbmRJbmRleCkgeworICAgICAgcmV0W3JldC5sZW5ndGhdID0gb2JqZWN0QXQodGhpcywg
YmVnaW5JbmRleCsrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworICB9LCBfTWl4aW4kY3Jl
YXRlLmluZGV4T2YgPSBmdW5jdGlvbiAob2JqZWN0LCBzdGFydEF0KSB7CisgICAgdmFyIGxlbiA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgdmFyIGlk
eDsKKworICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHN0YXJ0QXQgPSAw
OworICAgIH0KKworICAgIGlmIChzdGFydEF0IDwgMCkgeworICAgICAgc3RhcnRBdCArPSBsZW47
CisgICAgfQorCisgICAgZm9yIChpZHggPSBzdGFydEF0OyBpZHggPCBsZW47IGlkeCsrKSB7Cisg
ICAgICBpZiAob2JqZWN0QXQodGhpcywgaWR4KSA9PT0gb2JqZWN0KSB7CisgICAgICAgIHJldHVy
biBpZHg7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworICB9LCBfTWl4aW4kY3Jl
YXRlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gKG9iamVjdCwgc3RhcnRBdCkgeworICAgIHZhciBs
ZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworICAgIHZh
ciBpZHg7CisKKyAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0QXQgPj0gbGVu
KSB7CisgICAgICBzdGFydEF0ID0gbGVuIC0gMTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRBdCA8
IDApIHsKKyAgICAgIHN0YXJ0QXQgKz0gbGVuOworICAgIH0KKworICAgIGZvciAoaWR4ID0gc3Rh
cnRBdDsgaWR4ID49IDA7IGlkeC0tKSB7CisgICAgICBpZiAob2JqZWN0QXQodGhpcywgaWR4KSA9
PT0gb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIC0xOworICB9LCBfTWl4aW4kY3JlYXRlLmFkZEFycmF5T2JzZXJ2ZXIgPSBmdW5jdGlv
biAodGFyZ2V0LCBvcHRzKSB7CisgICAgcmV0dXJuIGFkZEFycmF5T2JzZXJ2ZXIodGhpcywgdGFy
Z2V0LCBvcHRzKTsKKyAgfSwgX01peGluJGNyZWF0ZS5yZW1vdmVBcnJheU9ic2VydmVyID0gZnVu
Y3Rpb24gKHRhcmdldCwgb3B0cykgeworICAgIHJldHVybiByZW1vdmVBcnJheU9ic2VydmVyKHRo
aXMsIHRhcmdldCwgb3B0cyk7CisgIH0sIF9NaXhpbiRjcmVhdGUuaGFzQXJyYXlPYnNlcnZlcnMg
PSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4g
X2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6Y2hhbmdlJykgfHwg
X2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdAYXJyYXk6YmVmb3JlJyk7Cisg
IH0pLCBfTWl4aW4kY3JlYXRlLmFycmF5Q29udGVudFdpbGxDaGFuZ2UgPSBmdW5jdGlvbiAoc3Rh
cnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KSB7CisgICAgdmFyIHJlbW92aW5nLCBsaW07CisKKyAg
ICAvLyBpZiBubyBhcmdzIGFyZSBwYXNzZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hhbmdlcworICAg
IGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBzdGFydElkeCA9IDA7CisgICAg
ICByZW1vdmVBbXQgPSBhZGRBbXQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlbW92
ZUFtdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJlbW92ZUFtdCA9IC0xOworICAgICAgfQor
CisgICAgICBpZiAoYWRkQW10ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgYWRkQW10ID0gLTE7
CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMuX19lYWNoKSB7CisgICAgICB0aGlzLl9f
ZWFjaC5hcnJheVdpbGxDaGFuZ2UodGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KTsK
KyAgICB9CisKKyAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQodGhpcywgJ0BhcnJheTpi
ZWZvcmUnLCBbdGhpcywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10XSk7CisKKyAgICBpZiAo
c3RhcnRJZHggPj0gMCAmJiByZW1vdmVBbXQgPj0gMCAmJiBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKSkgeworICAgICAgcmVtb3Zpbmcg
PSBbXTsKKyAgICAgIGxpbSA9IHN0YXJ0SWR4ICsgcmVtb3ZlQW10OworCisgICAgICBmb3IgKHZh
ciBpZHggPSBzdGFydElkeDsgaWR4IDwgbGltOyBpZHgrKykgeworICAgICAgICByZW1vdmluZy5w
dXNoKG9iamVjdEF0KHRoaXMsIGlkeCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBy
ZW1vdmluZyA9IHJlbW92ZUFtdDsKKyAgICB9CisKKyAgICB0aGlzLmVudW1lcmFibGVDb250ZW50
V2lsbENoYW5nZShyZW1vdmluZywgYWRkQW10KTsKKworICAgIHJldHVybiB0aGlzOworICB9LCBf
TWl4aW4kY3JlYXRlLmFycmF5Q29udGVudERpZENoYW5nZSA9IGZ1bmN0aW9uIChzdGFydElkeCwg
cmVtb3ZlQW10LCBhZGRBbXQpIHsKKyAgICB2YXIgYWRkaW5nLCBsaW07CisKKyAgICBfZW1iZXJN
ZXRhbFRhZ3MubWFya09iamVjdEFzRGlydHkoX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcykpOwor
CisgICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMK
KyAgICBpZiAoc3RhcnRJZHggPT09IHVuZGVmaW5lZCkgeworICAgICAgc3RhcnRJZHggPSAwOwor
ICAgICAgcmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChy
ZW1vdmVBbXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICByZW1vdmVBbXQgPSAtMTsKKyAgICAg
IH0KKworICAgICAgaWYgKGFkZEFtdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGFkZEFtdCA9
IC0xOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGFydElkeCA+PSAwICYmIGFkZEFtdCA+
PSAwICYmIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9i
c2VydmVycycpKSB7CisgICAgICBhZGRpbmcgPSBbXTsKKyAgICAgIGxpbSA9IHN0YXJ0SWR4ICsg
YWRkQW10OworCisgICAgICBmb3IgKHZhciBpZHggPSBzdGFydElkeDsgaWR4IDwgbGltOyBpZHgr
KykgeworICAgICAgICBhZGRpbmcucHVzaChvYmplY3RBdCh0aGlzLCBpZHgpKTsKKyAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgYWRkaW5nID0gYWRkQW10OworICAgIH0KKworICAgIHRoaXMu
ZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlQW10LCBhZGRpbmcpOworCisgICAgaWYg
KHRoaXMuX19lYWNoKSB7CisgICAgICB0aGlzLl9fZWFjaC5hcnJheURpZENoYW5nZSh0aGlzLCBz
dGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXQpOworICAgIH0KKworICAgIF9lbWJlck1ldGFsRXZl
bnRzLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmNoYW5nZScsIFt0aGlzLCBzdGFydElkeCwgcmVt
b3ZlQW10LCBhZGRBbXRdKTsKKworICAgIHZhciBsZW5ndGggPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworICAgIHZhciBjYWNoZWRGaXJzdCA9IF9lbWJlck1l
dGFsQ29tcHV0ZWQuY2FjaGVGb3IodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7CisgICAgdmFyIGNhY2hl
ZExhc3QgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNhY2hlRm9yKHRoaXMsICdsYXN0T2JqZWN0Jyk7
CisKKyAgICBpZiAob2JqZWN0QXQodGhpcywgMCkgIT09IGNhY2hlZEZpcnN0KSB7CisgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2ZpcnN0
T2JqZWN0Jyk7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENo
YW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0QXQodGhp
cywgbGVuZ3RoIC0gMSkgIT09IGNhY2hlZExhc3QpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVy
dHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVjdCcpOworICAgICAg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RP
YmplY3QnKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwgX01peGluJGNyZWF0ZVsn
QGVhY2gnXSA9IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAg
IC8vIFRPRE8gdXNlIFN5bWJvbCBvciBhZGQgdG8gbWV0YQorICAgIGlmICghdGhpcy5fX2VhY2gp
IHsKKyAgICAgIHRoaXMuX19lYWNoID0gbmV3IF9lbWJlclJ1bnRpbWVTeXN0ZW1FYWNoX3Byb3h5
LmRlZmF1bHQodGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX19lYWNoOworICB9KS52
b2xhdGlsZSgpLCBfTWl4aW4kY3JlYXRlKSk7Cit9KTsKKy8vIEVTNlRPRE86IEVtYmVyLkEKKwor
LyoqCisgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFw
cGx5IHRoaXMgbWl4aW4uCisgICBZb3VyIGFycmF5IG11c3Qgc3VwcG9ydCB0aGUgYGxlbmd0aGAg
cHJvcGVydHkuIFlvdXIgcmVwbGFjZSBtZXRob2RzIHNob3VsZAorICBzZXQgdGhpcyBwcm9wZXJ0
eSB3aGVuZXZlciBpdCBjaGFuZ2VzLgorICAgQHByb3BlcnR5IHtOdW1iZXJ9IGxlbmd0aAorICBA
cHVibGljCisqLworCisvKioKKyAgUmV0dXJucyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBgaW5k
ZXhgLiBJZiB0aGUgZ2l2ZW4gYGluZGV4YCBpcyBuZWdhdGl2ZQorICBvciBpcyBncmVhdGVyIG9y
IGVxdWFsIHRoYW4gdGhlIGFycmF5IGxlbmd0aCwgcmV0dXJucyBgdW5kZWZpbmVkYC4KKyAgIFRo
aXMgaXMgb25lIG9mIHRoZSBwcmltaXRpdmVzIHlvdSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0
IGBFbWJlci5BcnJheWAuCisgIElmIHlvdXIgb2JqZWN0IHN1cHBvcnRzIHJldHJpZXZpbmcgdGhl
IHZhbHVlIG9mIGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgpYAorICAoaS5lLiBgbXlBcnJheS5n
ZXQoMClgKSwgdGhlbiB5b3UgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCisg
IHlvdXJzZWxmLgorICAgYGBgamF2YXNjcmlwdAorICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycs
ICdkJ107CisgICBhcnIub2JqZWN0QXQoMCk7ICAgLy8gJ2EnCisgIGFyci5vYmplY3RBdCgzKTsg
ICAvLyAnZCcKKyAgYXJyLm9iamVjdEF0KC0xKTsgIC8vIHVuZGVmaW5lZAorICBhcnIub2JqZWN0
QXQoNCk7ICAgLy8gdW5kZWZpbmVkCisgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQK
KyAgYGBgCisgICBAbWV0aG9kIG9iamVjdEF0CisgIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGlu
ZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVybi4KKyAgQHJldHVybiB7Kn0gaXRlbSBhdCBpbmRleCBv
ciB1bmRlZmluZWQKKyAgQHB1YmxpYworKi8KKworLyoqCisgIFRoaXMgcmV0dXJucyB0aGUgb2Jq
ZWN0cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMsIHVzaW5nIGBvYmplY3RBdGAuCisgICBgYGBq
YXZhc2NyaXB0CisgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107CisgICBhcnIub2Jq
ZWN0c0F0KFswLCAxLCAyXSk7ICAvLyBbJ2EnLCAnYicsICdjJ10KKyAgYXJyLm9iamVjdHNBdChb
MiwgMywgNF0pOyAgLy8gWydjJywgJ2QnLCB1bmRlZmluZWRdCisgIGBgYAorICAgQG1ldGhvZCBv
YmplY3RzQXQKKyAgQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBBbiBhcnJheSBvZiBpbmRleGVzIG9m
IGl0ZW1zIHRvIHJldHVybi4KKyAgQHJldHVybiB7QXJyYXl9CisgIEBwdWJsaWMKKyAqLworCisv
LyBvdmVycmlkZXMgRW1iZXIuRW51bWVyYWJsZSB2ZXJzaW9uCisKKy8qKgorICBUaGlzIGlzIHRo
ZSBoYW5kbGVyIGZvciB0aGUgc3BlY2lhbCBhcnJheSBjb250ZW50IHByb3BlcnR5LiBJZiB5b3Ug
Z2V0CisgIHRoaXMgcHJvcGVydHksIGl0IHdpbGwgcmV0dXJuIHRoaXMuIElmIHlvdSBzZXQgdGhp
cyBwcm9wZXJ0eSB0byBhIG5ldworICBhcnJheSwgaXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50
IGNvbnRlbnQuCisgICBUaGlzIHByb3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0
eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxlYC4KKyAgIEBwcm9wZXJ0eSBbXQorICBAcmV0
dXJuIHRoaXMKKyAgQHB1YmxpYworKi8KKworLy8gb3B0aW1pemVkIHZlcnNpb24gZnJvbSBFbnVt
ZXJhYmxlCisKKy8vIEFkZCBhbnkgZXh0cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0aGF0IGFy
ZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWluIEFycmF5LgorLyoqCisgIFJldHVybnMgYSBuZXcgYXJy
YXkgdGhhdCBpcyBhIHNsaWNlIG9mIHRoZSByZWNlaXZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbgor
ICB1c2VzIHRoZSBvYnNlcnZhYmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG9iamVj
dHMgZm9yIHRoZSBuZXcKKyAgc2xpY2UuCisgICBgYGBqYXZhc2NyaXB0CisgIHZhciBhcnIgPSBb
J3JlZCcsICdncmVlbicsICdibHVlJ107CisgICBhcnIuc2xpY2UoMCk7ICAgICAgIC8vIFsncmVk
JywgJ2dyZWVuJywgJ2JsdWUnXQorICBhcnIuc2xpY2UoMCwgMik7ICAgIC8vIFsncmVkJywgJ2dy
ZWVuJ10KKyAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBbJ2dyZWVuJywgJ2JsdWUnXQorICBgYGAK
KyAgIEBtZXRob2Qgc2xpY2UKKyAgQHBhcmFtIHtOdW1iZXJ9IGJlZ2luSW5kZXggKE9wdGlvbmFs
KSBpbmRleCB0byBiZWdpbiBzbGljaW5nIGZyb20uCisgIEBwYXJhbSB7TnVtYmVyfSBlbmRJbmRl
eCAoT3B0aW9uYWwpIGluZGV4IHRvIGVuZCB0aGUgc2xpY2UgYXQgKGJ1dCBub3QgaW5jbHVkZWQp
LgorICBAcmV0dXJuIHtBcnJheX0gTmV3IGFycmF5IHdpdGggc3BlY2lmaWVkIHNsaWNlCisgIEBw
dWJsaWMKKyovCisKKy8qKgorICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0
J3MgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgSWYgbm8gYHN0YXJ0QXRgIGFyZ3VtZW50IGlzIGdpdmVu
LCB0aGUgc3RhcnRpbmcgbG9jYXRpb24gdG8KKyAgc2VhcmNoIGlzIDAuIElmIGl0J3MgbmVnYXRp
dmUsIHdpbGwgY291bnQgYmFja3dhcmQgZnJvbQorICB0aGUgZW5kIG9mIHRoZSBhcnJheS4gUmV0
dXJucyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KKyAgIGBgYGphdmFzY3JpcHQKKyAgdmFyIGFy
ciA9IFsnYScsICdiJywgJ2MnLCAnZCcsICdhJ107CisgICBhcnIuaW5kZXhPZignYScpOyAgICAg
ICAvLyAgMAorICBhcnIuaW5kZXhPZigneicpOyAgICAgICAvLyAtMQorICBhcnIuaW5kZXhPZign
YScsIDIpOyAgICAvLyAgNAorICBhcnIuaW5kZXhPZignYScsIC0xKTsgICAvLyAgNAorICBhcnIu
aW5kZXhPZignYicsIDMpOyAgICAvLyAtMQorICBhcnIuaW5kZXhPZignYScsIDEwMCk7ICAvLyAt
MQorICBgYGAKKyAgIEBtZXRob2QgaW5kZXhPZgorICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRo
ZSBpdGVtIHRvIHNlYXJjaCBmb3IKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwg
c3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKKyAgQHJldHVybiB7TnVtYmVy
fSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAgQHB1YmxpYworKi8KKworLyoqCisgIFJldHVy
bnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QncyBsYXN0IG9jY3VycmVuY2UuCisgIElm
IG5vIGBzdGFydEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHNlYXJjaCBzdGFydHMgZnJvbQor
ICB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgaXQncyBuZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNrd2Fy
ZAorICBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlz
IGZvdW5kLgorICAgYGBgamF2YXNjcmlwdAorICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycsICdk
JywgJ2EnXTsKKyAgIGFyci5sYXN0SW5kZXhPZignYScpOyAgICAgICAvLyAgNAorICBhcnIubGFz
dEluZGV4T2YoJ3onKTsgICAgICAgLy8gLTEKKyAgYXJyLmxhc3RJbmRleE9mKCdhJywgMik7ICAg
IC8vICAwCisgIGFyci5sYXN0SW5kZXhPZignYScsIC0xKTsgICAvLyAgNAorICBhcnIubGFzdElu
ZGV4T2YoJ2InLCAzKTsgICAgLy8gIDEKKyAgYXJyLmxhc3RJbmRleE9mKCdhJywgMTAwKTsgIC8v
ICA0CisgIGBgYAorICAgQG1ldGhvZCBsYXN0SW5kZXhPZgorICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0IHRoZSBpdGVtIHRvIHNlYXJjaCBmb3IKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0
aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKKyAgQHJldHVybiB7
TnVtYmVyfSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQKKyAgQHB1YmxpYworKi8KKworLy8gLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgor
Ly8gQVJSQVkgT0JTRVJWRVJTCisvLworCisvKioKKyAgQWRkcyBhbiBhcnJheSBvYnNlcnZlciB0
byB0aGUgcmVjZWl2aW5nIGFycmF5LiBUaGUgYXJyYXkgb2JzZXJ2ZXIgb2JqZWN0CisgIG5vcm1h
bGx5IG11c3QgaW1wbGVtZW50IHR3byBtZXRob2RzOgorICAgKiBgYXJyYXlXaWxsQ2hhbmdlKG9i
c2VydmVkT2JqLCBzdGFydCwgcmVtb3ZlQ291bnQsIGFkZENvdW50KWAgLSBUaGlzIG1ldGhvZCB3
aWxsIGJlCisgICAgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KKyAg
KiBgYXJyYXlEaWRDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291
bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICBjYWxsZWQganVzdCBhZnRlciB0aGUgYXJy
YXkgaXMgbW9kaWZpZWQuCisgICBCb3RoIGNhbGxiYWNrcyB3aWxsIGJlIHBhc3NlZCB0aGUgb2Jz
ZXJ2ZWQgb2JqZWN0LCBzdGFydGluZyBpbmRleCBvZiB0aGUKKyAgY2hhbmdlIGFzIHdlbGwgYXMg
YSBjb3VudCBvZiB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQuIFlvdSBjYW4gdXNl
CisgIHRoZXNlIGNhbGxiYWNrcyB0byBvcHRpb25hbGx5IGluc3BlY3QgdGhlIGFycmF5IGR1cmlu
ZyB0aGUgY2hhbmdlLCBjbGVhcgorICBjYWNoZXMsIG9yIGRvIGFueSBvdGhlciBib29ra2VlcGlu
ZyBuZWNlc3NhcnkuCisgICBJbiBhZGRpdGlvbiB0byBwYXNzaW5nIGEgdGFyZ2V0LCB5b3UgY2Fu
IGFsc28gaW5jbHVkZSBhbiBvcHRpb25zIGhhc2gKKyAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3Zl
cnJpZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiB0aGUKKyAgdGFy
Z2V0LgorICAgQG1ldGhvZCBhZGRBcnJheU9ic2VydmVyCisgIEBwYXJhbSB7T2JqZWN0fSB0YXJn
ZXQgVGhlIG9ic2VydmVyIG9iamVjdC4KKyAgQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwg
aGFzaCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nCisgICAgYHdpbGxDaGFuZ2Vg
IGFuZCBgZGlkQ2hhbmdlYCBvcHRpb24uCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgorICBAcHVibGljCisqLworCisvKioKKyAgUmVtb3ZlcyBhbiBhcnJheSBvYnNlcnZlciBmcm9t
IHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKKyAgcmVnaXN0ZXJlZC4gQ2Fs
bGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIG9iamVjdCB3aWxs
CisgIGhhdmUgbm8gZWZmZWN0LgorICAgQG1ldGhvZCByZW1vdmVBcnJheU9ic2VydmVyCisgIEBw
YXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBvYnNlcnZpbmcgdGhlIGFycmF5LgorICBA
cGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBoYXNoIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9u
cyBpbmNsdWRpbmcKKyAgICBgd2lsbENoYW5nZWAgYW5kIGBkaWRDaGFuZ2VgIG9wdGlvbi4KKyAg
QHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgIEBwdWJsaWMKKyovCisKKy8qKgorICBC
ZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdh
dGNoaW5nIGNoYW5nZXMKKyAgb24gdGhlIGFycmF5LgorICAgQHByb3BlcnR5IHtCb29sZWFufSBo
YXNBcnJheU9ic2VydmVycworICBAcHVibGljCisqLworCisvKioKKyAgSWYgeW91IGFyZSBpbXBs
ZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlz
CisgIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgY29udGVudCBjaGFuZ2VzIHRvIG5vdGlm
eSBhbnkgb2JzZXJ2ZXJzIGFuZAorICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMu
IFBhc3MgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKKyAgYXMgd2VsbCBhcyBhIGRl
bHRhIG9mIHRoZSBhbW91bnRzIHRvIGNoYW5nZS4KKyAgIEBtZXRob2QgYXJyYXlDb250ZW50V2ls
bENoYW5nZQorICBAcGFyYW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5nIGluZGV4IGlu
IHRoZSBhcnJheSB0aGF0IHdpbGwgY2hhbmdlLgorICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlQW10
IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHlvdQorICAgIHBh
c3MgYG51bGxgIGFzc3VtZXMgMAorICBAcGFyYW0ge051bWJlcn0gYWRkQW10IFRoZSBudW1iZXIg
b2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkLiBJZiB5b3UKKyAgICBwYXNzIGBudWxsYCBhc3N1
bWVzIDAuCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICBAcHVibGljCisqLwor
CisvKioKKyAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMg
YEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCisgIG1ldGhvZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBj
b250ZW50IGNoYW5nZXMgdG8gbm90aWZ5IGFueSBvYnNlcnZlcnMgYW5kCisgIGludmFsaWRhdGUg
YW55IHJlbGF0ZWQgcHJvcGVydGllcy4gUGFzcyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGNo
YW5nZQorICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMgdG8gY2hhbmdlLgorICAg
QG1ldGhvZCBhcnJheUNvbnRlbnREaWRDaGFuZ2UKKyAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4
IFRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkgdGhhdCBkaWQgY2hhbmdlLgorICBAcGFy
YW0ge051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92
ZWQuIElmIHlvdQorICAgIHBhc3MgYG51bGxgIGFzc3VtZXMgMAorICBAcGFyYW0ge051bWJlcn0g
YWRkQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLiBJZiB5b3UKKyAgICBw
YXNzIGBudWxsYCBhc3N1bWVzIDAuCisgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgor
ICBAcHVibGljCisqLworCisvKioKKyAgUmV0dXJucyBhIHNwZWNpYWwgb2JqZWN0IHRoYXQgY2Fu
IGJlIHVzZWQgdG8gb2JzZXJ2ZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMKKyAgb24gdGhlIGFycmF5
LiBKdXN0IGdldCBhbiBlcXVpdmFsZW50IHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IGFuZCBpdCB3
aWxsCisgIHJldHVybiBhbiBlbnVtZXJhYmxlIHRoYXQgbWFwcyBhdXRvbWF0aWNhbGx5IHRvIHRo
ZSBuYW1lZCBrZXkgb24gdGhlCisgIG1lbWJlciBvYmplY3RzLgorICAgYEBlYWNoYCBzaG91bGQg
b25seSBiZSB1c2VkIGluIGEgbm9uLXRlcm1pbmFsIGNvbnRleHQuIEV4YW1wbGU6CisgICBgYGBq
YXZhc2NyaXB0CisgIG15TWV0aG9kOiBjb21wdXRlZCgncG9zdHMuQGVhY2guYXV0aG9yJywgZnVu
Y3Rpb24oKXsKKyAgICAuLi4KKyAgfSk7CisgIGBgYAorICAgSWYgeW91IG1lcmVseSB3YW50IHRv
IHdhdGNoIGZvciB0aGUgYXJyYXkgYmVpbmcgY2hhbmdlZCwgbGlrZSBhbiBvYmplY3QgYmVpbmcK
KyAgcmVwbGFjZWQsIGFkZGVkIG9yIHJlbW92ZWQsIHVzZSBgW11gIGluc3RlYWQgb2YgYEBlYWNo
YC4KKyAgIGBgYGphdmFzY3JpcHQKKyAgbXlNZXRob2Q6IGNvbXB1dGVkKCdwb3N0cy5bXScsIGZ1
bmN0aW9uKCl7CisgICAgLi4uCisgIH0pOworICBgYGAKKyAgIEBwcm9wZXJ0eSBAZWFjaAorICBA
cHVibGljCisqLworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb21wYXJhYmxlJywgWydl
eHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbE1peGluKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgor
ICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvKioKKyAgICBJbXBsZW1lbnRz
IHNvbWUgc3RhbmRhcmQgbWV0aG9kcyBmb3IgY29tcGFyaW5nIG9iamVjdHMuIEFkZCB0aGlzIG1p
eGluIHRvCisgICAgYW55IGNsYXNzIHlvdSBjcmVhdGUgdGhhdCBjYW4gY29tcGFyZSBpdHMgaW5z
dGFuY2VzLgorICAKKyAgICBZb3Ugc2hvdWxkIGltcGxlbWVudCB0aGUgYGNvbXBhcmUoKWAgbWV0
aG9kLgorICAKKyAgICBAY2xhc3MgQ29tcGFyYWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAg
ICBAc2luY2UgRW1iZXIgMC45CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0
ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworCisgICAgLyoqCisgICAgICBfX1Jl
cXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1p
eGluLgorICAgICAgIE92ZXJyaWRlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJp
c29uIG9mIHRoZSB0d28gcGFyYW1ldGVycy4gVGhlCisgICAgICBjb21wYXJlIG1ldGhvZCBzaG91
bGQgcmV0dXJuOgorICAgICAgIC0gYC0xYCBpZiBgYSA8IGJgCisgICAgICAtIGAwYCBpZiBgYSA9
PSBiYAorICAgICAgLSBgMWAgaWYgYGEgPiBiYAorICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRp
b24gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIGNvbXBhcmUKKyAgICAgIEBw
YXJhbSBhIHtPYmplY3R9IHRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZQorICAgICAgQHBhcmFt
IGIge09iamVjdH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQorICAgICAgQHJldHVybiB7
TnVtYmVyfSB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgY29tcGFyZTogbnVsbAorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1l
L21peGlucy9jb250YWluZXJfcHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcnVuX2xv
b3AnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlck1ldGFsUnVuX2xvb3AsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1l
dGFsTWl4aW4pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1y
dW50aW1lCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmJ1aWxkRmFrZUNvbnRh
aW5lcldpdGhEZXByZWNhdGlvbnMgPSBidWlsZEZha2VDb250YWluZXJXaXRoRGVwcmVjYXRpb25z
OworCisgIC8qKgorICAgIENvbnRhaW5lclByb3h5TWl4aW4gaXMgdXNlZCB0byBwcm92aWRlIHB1
YmxpYyBhY2Nlc3MgdG8gc3BlY2lmaWMKKyAgICBjb250YWluZXIgZnVuY3Rpb25hbGl0eS4KKyAg
CisgICAgQGNsYXNzIENvbnRhaW5lclByb3h5TWl4aW4KKyAgICBAcHJpdmF0ZQorICAqLworICBl
eHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgLyoq
CisgICAgIFRoZSBjb250YWluZXIgc3RvcmVzIHN0YXRlLgorICAgICAgQHByaXZhdGUKKyAgICAg
QHByb3BlcnR5IHtFbWJlci5Db250YWluZXJ9IF9fY29udGFpbmVyX18KKyAgICAgKi8KKyAgICBf
X2NvbnRhaW5lcl9fOiBudWxsLAorCisgICAgLyoqCisgICAgIFJldHVybnMgYW4gb2JqZWN0IHRo
YXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBvd25lciB0byBhCisgICAgIG1hbnVhbGx5IGNy
ZWF0ZWQgaW5zdGFuY2UuCisgICAgICBFeGFtcGxlOgorICAgICAgYGBgCisgICAgIGxldCBvd25l
ciA9IEVtYmVyLmdldE93bmVyKHRoaXMpOworICAgICAgVXNlci5jcmVhdGUoCisgICAgICAgb3du
ZXIub3duZXJJbmplY3Rpb24oKSwKKyAgICAgICB7IHVzZXJuYW1lOiAncndqYmx1ZScgfQorICAg
ICApCisgICAgIGBgYAorICAgICAgQHB1YmxpYworICAgICBAbWV0aG9kIG93bmVySW5qZWN0aW9u
CisgICAgIEByZXR1cm4ge09iamVjdH0KKyAgICAqLworICAgIG93bmVySW5qZWN0aW9uOiBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5fX2NvbnRhaW5lcl9fLm93bmVySW5qZWN0aW9u
KCk7CisgICAgfSwKKworICAgIC8qKgorICAgICBHaXZlbiBhIGZ1bGxOYW1lIHJldHVybiBhIGNv
cnJlc3BvbmRpbmcgaW5zdGFuY2UuCisgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgZm9y
IGxvb2t1cCB0byByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgIFRoZSBzaW5nbGV0
b24gaXMgc2NvcGVkIHRvIHRoZSBjb250YWluZXIsIGFsbG93aW5nIG11bHRpcGxlIGNvbnRhaW5l
cnMKKyAgICAgdG8gYWxsIGhhdmUgdGhlaXIgb3duIGxvY2FsbHkgc2NvcGVkIHNpbmdsZXRvbnMu
CisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciByZWdpc3RyeSA9IG5ldyBSZWdpc3RyeSgp
OworICAgICB2YXIgY29udGFpbmVyID0gcmVnaXN0cnkuY29udGFpbmVyKCk7CisgICAgICByZWdp
c3RyeS5yZWdpc3RlcignYXBpOnR3aXR0ZXInLCBUd2l0dGVyKTsKKyAgICAgIHZhciB0d2l0dGVy
ID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInKTsKKyAgICAgIHR3aXR0ZXIgaW5zdGFu
Y2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCisgICAgICAvLyBieSBkZWZhdWx0IHRoZSBjb250YWlu
ZXIgd2lsbCByZXR1cm4gc2luZ2xldG9ucworICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIu
bG9va3VwKCdhcGk6dHdpdHRlcicpOworICAgICB0d2l0dGVyMiBpbnN0YW5jZW9mIFR3aXR0ZXI7
IC8vID0+IHRydWUKKyAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IHRydWUKKyAgICAg
YGBgCisgICAgICBJZiBzaW5nbGV0b25zIGFyZSBub3Qgd2FudGVkIGFuIG9wdGlvbmFsIGZsYWcg
Y2FuIGJlIHByb3ZpZGVkIGF0IGxvb2t1cC4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgdmFy
IHJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KCk7CisgICAgIHZhciBjb250YWluZXIgPSByZWdpc3Ry
eS5jb250YWluZXIoKTsKKyAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3
aXR0ZXIpOworICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicsIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVy
Lmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7CisgICAgICB0d2l0
dGVyID09PSB0d2l0dGVyMjsgLy89PiBmYWxzZQorICAgICBgYGAKKyAgICAgIEBwdWJsaWMKKyAg
ICAgQG1ldGhvZCBsb29rdXAKKyAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgIEByZXR1cm4ge2FueX0KKyAgICAgKi8KKyAgICBs
b29rdXA6IGZ1bmN0aW9uIChmdWxsTmFtZSwgb3B0aW9ucykgeworICAgICAgcmV0dXJuIHRoaXMu
X19jb250YWluZXJfXy5sb29rdXAoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgR2l2ZW4gYSBmdWxsTmFtZSByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9y
eS4KKyAgICAgIEBwcml2YXRlCisgICAgIEBtZXRob2QgX2xvb2t1cEZhY3RvcnkKKyAgICAgQHBh
cmFtIHtTdHJpbmd9IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge2FueX0KKyAgICAgKi8KKyAgICBf
bG9va3VwRmFjdG9yeTogZnVuY3Rpb24gKGZ1bGxOYW1lLCBvcHRpb25zKSB7CisgICAgICByZXR1
cm4gdGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUsIG9wdGlvbnMpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgQHByaXZhdGUKKyAgICAgKi8KKyAgICB3aWxsRGVzdHJv
eTogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRz
KTsKKworICAgICAgaWYgKHRoaXMuX19jb250YWluZXJfXykgeworICAgICAgICBfZW1iZXJNZXRh
bFJ1bl9sb29wLmRlZmF1bHQodGhpcy5fX2NvbnRhaW5lcl9fLCAnZGVzdHJveScpOworICAgICAg
fQorICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rpb24gYnVpbGRGYWtlQ29udGFpbmVyV2l0aERlcHJl
Y2F0aW9ucyhjb250YWluZXIpIHsKKyAgICB2YXIgZmFrZUNvbnRhaW5lciA9IHt9OworICAgIHZh
ciBwcm9wZXJ0eU1hcHBpbmdzID0geworICAgICAgbG9va3VwOiAnbG9va3VwJywKKyAgICAgIGxv
b2t1cEZhY3Rvcnk6ICdfbG9va3VwRmFjdG9yeScKKyAgICB9OworCisgICAgZm9yICh2YXIgY29u
dGFpbmVyUHJvcGVydHkgaW4gcHJvcGVydHlNYXBwaW5ncykgeworICAgICAgZmFrZUNvbnRhaW5l
cltjb250YWluZXJQcm9wZXJ0eV0gPSBidWlsZEZha2VDb250YWluZXJGdW5jdGlvbihjb250YWlu
ZXIsIGNvbnRhaW5lclByb3BlcnR5LCBwcm9wZXJ0eU1hcHBpbmdzW2NvbnRhaW5lclByb3BlcnR5
XSk7CisgICAgfQorCisgICAgcmV0dXJuIGZha2VDb250YWluZXI7CisgIH0KKworICBmdW5jdGlv
biBidWlsZEZha2VDb250YWluZXJGdW5jdGlvbihjb250YWluZXIsIGNvbnRhaW5lclByb3BlcnR5
LCBvd25lclByb3BlcnR5KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyB0aGUgaW5qZWN0ZWQgYGNvbnRhaW5lcmAgaXMg
ZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgYGdldE93bmVyYCBoZWxwZXIgdG8gYWNjZXNzIHRo
ZSBvd25lciBvZiB0aGlzIG9iamVjdCBhbmQgdGhlbiBjYWxsIGAnICsgb3duZXJQcm9wZXJ0eSAr
ICdgIGluc3RlYWQuJywgZmFsc2UsIHsKKyAgICAgICAgaWQ6ICdlbWJlci1hcHBsaWNhdGlvbi5p
bmplY3RlZC1jb250YWluZXInLAorICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgdXJs
OiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19pbmplY3RlZC1jb250
YWluZXItYWNjZXNzJworICAgICAgfSk7CisgICAgICByZXR1cm4gY29udGFpbmVyW2NvbnRhaW5l
clByb3BlcnR5XS5hcHBseShjb250YWluZXIsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2NvbnRyb2xsZXInLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItbWV0YWwvYWxpYXMnLCAnZW1iZXItcnVudGltZS9t
aXhpbnMvYWN0aW9uX2hhbmRsZXInLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29udHJvbGxlcl9j
b250ZW50X21vZGVsX2FsaWFzX2RlcHJlY2F0aW9uJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbEFsaWFzLCBfZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9u
X2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVNaXhpbnNDb250cm9sbGVyX2NvbnRlbnRfbW9kZWxfYWxp
YXNfZGVwcmVjYXRpb24pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIEBjbGFzcyBD
b250cm9sbGVyTWl4aW4KKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuQWN0
aW9uSGFuZGxlcgorICAgIEBwcml2YXRlCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJl
ck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxl
ci5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5zQ29udHJvbGxlcl9jb250ZW50X21vZGVsX2Fs
aWFzX2RlcHJlY2F0aW9uLmRlZmF1bHQsIHsKKyAgICAvKiBkdWNrdHlwZSBhcyBhIGNvbnRyb2xs
ZXIgKi8KKyAgICBpc0NvbnRyb2xsZXI6IHRydWUsCisKKyAgICAvKioKKyAgICAgIFRoZSBvYmpl
Y3QgdG8gd2hpY2ggYWN0aW9ucyBmcm9tIHRoZSB2aWV3IHNob3VsZCBiZSBzZW50LgorICAgICAg
IEZvciBleGFtcGxlLCB3aGVuIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZSB1c2VzIHRoZSBge3thY3Rp
b259fWAgaGVscGVyLAorICAgICAgaXQgd2lsbCBhdHRlbXB0IHRvIHNlbmQgdGhlIGFjdGlvbiB0
byB0aGUgdmlldydzIGNvbnRyb2xsZXIncyBgdGFyZ2V0YC4KKyAgICAgICBCeSBkZWZhdWx0LCB0
aGUgdmFsdWUgb2YgdGhlIHRhcmdldCBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHJvdXRlciwgYW5k
CisgICAgICBpcyBpbmplY3RlZCB3aGVuIGEgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQuIFRo
aXMgaW5qZWN0aW9uIGlzIGFwcGxpZWQKKyAgICAgIGFzIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9u
J3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gSW4gbW9zdCBjYXNlcyB0aGUKKyAgICAgIGB0YXJn
ZXRgIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gdGhlIGxvZ2ljYWwgY29u
c3VtZXIgb2YKKyAgICAgIGFjdGlvbnMgZm9yIHRoZSBjb250cm9sbGVyLgorICAgICAgIEBwcm9w
ZXJ0eSB0YXJnZXQKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIHRhcmdldDogbnVsbCwKKworICAgIHBhcmVudENvbnRyb2xsZXI6IG51bGwsCisKKyAgICBz
dG9yZTogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIGNvbnRyb2xsZXIncyBjdXJyZW50IG1v
ZGVsLiBXaGVuIHJldHJpZXZpbmcgb3IgbW9kaWZ5aW5nIGEgY29udHJvbGxlcidzCisgICAgICBt
b2RlbCwgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgY29udGVu
dGAgcHJvcGVydHkuCisgICAgICAgQHByb3BlcnR5IG1vZGVsCisgICAgICBAcHVibGljCisgICAg
ICovCisgICAgbW9kZWw6IG51bGwsCisKKyAgICAvKioKKyAgICAgIEBwcml2YXRlCisgICAgKi8K
KyAgICBjb250ZW50OiBfZW1iZXJNZXRhbEFsaWFzLmRlZmF1bHQoJ21vZGVsJykKKworICB9KTsK
K30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb250cm9sbGVyX2NvbnRlbnRfbW9k
ZWxfYWxpYXNfZGVwcmVjYXRpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAn
ZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlck1ldGFsTWl4aW4pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qCisgICAgVGhlIENv
bnRyb2xsZXJDb250ZW50TW9kZWxBbGlhc0RlcHJlY2F0aW9uIG1peGluIGlzIHVzZWQgdG8gcHJv
dmlkZSBhIHVzZWZ1bAorICAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBzcGVjaWZ5aW5nIGBj
b250ZW50YCBkaXJlY3RseSBvbiBhIGBFbWJlci5Db250cm9sbGVyYAorICAgICh3aXRob3V0IGFs
c28gc3BlY2lmeWluZyBgbW9kZWxgKS4KKyAgCisgICAgRW1iZXIgdmVyc2lvbnMgcHJpb3IgdG8g
MS43IHVzZWQgYG1vZGVsYCBhcyBhbiBhbGlhcyBvZiBgY29udGVudGAsIGJ1dCBkdWUgdG8KKyAg
ICBtdWNoIGNvbmZ1c2lvbiB0aGlzIGFsaWFzIHdhcyByZXZlcnNlZCAoc28gYGNvbnRlbnRgIGlz
IG5vdyBhbiBhbGlhcyBvZiBgbW9kZWwpLgorICAKKyAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIG1h
bnkgY2F2ZWF0cyB3aXRoIG1vZGVsL2NvbnRlbnQsIGFuZCBhbHNvIHNldHMgYQorICAgIHNpbXBs
ZSBncm91bmQgcnVsZTogTmV2ZXIgc2V0IGEgY29udHJvbGxlcnMgY29udGVudCwgcmF0aGVyIGFs
d2F5cyBzZXQKKyAgICBpdHMgbW9kZWwgYW5kIGVtYmVyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5n
LgorICAKKyAgICBVc2VkIGludGVybmFsbHkgYnkgRW1iZXIgaW4gYEVtYmVyLkNvbnRyb2xsZXJg
LgorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0
ZSh7CisgICAgLyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIE1vdmVzIGBjb250ZW50YCB0byBg
bW9kZWxgICBhdCBleHRlbmQgdGltZSBpZiBhIGBtb2RlbGAgaXMgbm90IGFsc28gc3BlY2lmaWVk
LgorICAgICAgIE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseSBtb2RpZmllcyB0aGUgbWl4aW4gdGhl
bXNlbHZlcywgd2hpY2ggaXMgdGVjaG5pY2FsbHkKKyAgICAgIGR1YmlvdXMgYnV0IGlzIHByYWN0
aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZQorICAg
ICAgZnV0dXJlLgorICAgICAgIEBtZXRob2Qgd2lsbE1lcmdlTWl4aW4KKyAgICAgIEBzaW5jZSAx
LjQuMAorICAgICovCisgICAgd2lsbE1lcmdlTWl4aW46IGZ1bmN0aW9uIChwcm9wcykgeworICAg
ICAgLy8gQ2FsbGluZyBzdXBlciBpcyBvbmx5IE9LIGhlcmUgc2luY2Ugd2UgS05PVyB0aGF0Cisg
ICAgICAvLyB0aGVyZSBpcyBhbm90aGVyIE1peGluIGxvYWRlZCBmaXJzdC4KKyAgICAgIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIHZhciBtb2RlbFNwZWNpZmll
ZCA9ICEhcHJvcHMubW9kZWw7CisKKyAgICAgIGlmIChwcm9wcy5jb250ZW50ICYmICFtb2RlbFNw
ZWNpZmllZCkgeworICAgICAgICBwcm9wcy5tb2RlbCA9IHByb3BzLmNvbnRlbnQ7CisgICAgICAg
IGRlbGV0ZSBwcm9wc1snY29udGVudCddOworCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVw
cmVjYXRlKCdEbyBub3Qgc3BlY2lmeSBgY29udGVudGAgb24gYSBDb250cm9sbGVyLCB1c2UgYG1v
ZGVsYCBpbnN0ZWFkLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItcnVudGltZS53aWxsLW1lcmdlLW1p
eGluJywgdW50aWw6ICczLjAuMCcgfSk7CisgICAgICB9CisgICAgfQorICB9KTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9jb3B5YWJsZScsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvbWl4
aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvZnJlZXphYmxlJywgJ2VtYmVyLW1ldGFsL2Vycm9y
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZU1peGluc0ZyZWV6YWJsZSwg
X2VtYmVyTWV0YWxFcnJvcikgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxl
IGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgSW1w
bGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvcHlpbmcgYW4gb2JqZWN0LiBBZGQg
dGhpcyBtaXhpbiB0bworICAgIGFueSBvYmplY3QgeW91IGNyZWF0ZSB0aGF0IGNhbiBjcmVhdGUg
YSBjb3B5IG9mIGl0c2VsZi4gVGhpcyBtaXhpbiBpcworICAgIGFkZGVkIGF1dG9tYXRpY2FsbHkg
dG8gdGhlIGJ1aWx0LWluIGFycmF5LgorICAKKyAgICBZb3Ugc2hvdWxkIGdlbmVyYWxseSBpbXBs
ZW1lbnQgdGhlIGBjb3B5KClgIG1ldGhvZCB0byByZXR1cm4gYSBjb3B5IG9mIHRoZQorICAgIHJl
Y2VpdmVyLgorICAKKyAgICBOb3RlIHRoYXQgYGZyb3plbkNvcHkoKWAgd2lsbCBvbmx5IHdvcmsg
aWYgeW91IGFsc28gaW1wbGVtZW50CisgICAgYEVtYmVyLkZyZWV6YWJsZWAuCisgIAorICAgIEBj
bGFzcyBDb3B5YWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAc2luY2UgRW1iZXIgMC45
CisgICAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhp
bi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBp
bXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBwbHkgdGhpcyBtaXhpbi4KKyAgICAgICBPdmVycmlk
ZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNlaXZlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlv
biByYWlzZXMKKyAgICAgIGFuIGV4Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIGNvcHkKKyAgICAg
IEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBpZiBgdHJ1ZWAsIGEgZGVlcCBjb3B5IG9mIHRoZSBvYmpl
Y3Qgc2hvdWxkIGJlIG1hZGUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gY29weSBvZiByZWNlaXZl
cgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGNvcHk6IG51bGwsCisKKyAgICAvKioKKyAg
ICAgIElmIHRoZSBvYmplY3QgaW1wbGVtZW50cyBgRW1iZXIuRnJlZXphYmxlYCwgdGhlbiB0aGlz
IHdpbGwgcmV0dXJuIGEgbmV3CisgICAgICBjb3B5IGlmIHRoZSBvYmplY3QgaXMgbm90IGZyb3pl
biBhbmQgdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgZnJvemVuLgorICAgICAgIFJhaXNl
cyBhbiBleGNlcHRpb24gaWYgeW91IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIGEgb2JqZWN0
IHRoYXQgZG9lcworICAgICAgbm90IHN1cHBvcnQgZnJlZXppbmcuCisgICAgICAgWW91IHNob3Vs
ZCB1c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IHdhbnQgYSBjb3B5IG9mIGEgZnJlZXphYmxl
IG9iamVjdAorICAgICAgc2luY2UgYSBmcmVlemFibGUgb2JqZWN0IGNhbiBzaW1wbHkgcmV0dXJu
IGl0c2VsZiB3aXRob3V0IGFjdHVhbGx5CisgICAgICBjb25zdW1pbmcgbW9yZSBtZW1vcnkuCisg
ICAgICAgQG1ldGhvZCBmcm96ZW5Db3B5CisgICAgICBAcmV0dXJuIHtPYmplY3R9IGNvcHkgb2Yg
cmVjZWl2ZXIgb3IgcmVjZWl2ZXIKKyAgICAgIEBkZXByZWNhdGVkIFVzZSBgT2JqZWN0LmZyZWV6
ZWAgaW5zdGVhZC4KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmcm96ZW5Db3B5OiBmdW5j
dGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnYGZyb3plbkNvcHlg
IGlzIGRlcHJlY2F0ZWQsIHVzZSBgT2JqZWN0LmZyZWV6ZWAgaW5zdGVhZC4nLCBmYWxzZSwgeyBp
ZDogJ2VtYmVyLXJ1bnRpbWUuZnJvemVuLWNvcHknLCB1bnRpbDogJzMuMC4wJyB9KTsKKyAgICAg
IGlmIChfZW1iZXJSdW50aW1lTWl4aW5zRnJlZXphYmxlLkZyZWV6YWJsZSAmJiBfZW1iZXJSdW50
aW1lTWl4aW5zRnJlZXphYmxlLkZyZWV6YWJsZS5kZXRlY3QodGhpcykpIHsKKyAgICAgICAgcmV0
dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNGcm96ZW4nKSA/IHRoaXMg
OiB0aGlzLmNvcHkoKS5mcmVlemUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5l
dyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQodGhpcyArICcgZG9lcyBub3Qgc3VwcG9ydCBmcmVl
emluZycpOworICAgICAgfQorICAgIH0KKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGlt
ZS9taXhpbnMvZW51bWVyYWJsZScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9n
ZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2Vt
YmVyLW1ldGFsL3V0aWxzJywgJ2VtYmVyLW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2Vt
cHR5X29iamVjdCcsICdlbWJlci1tZXRhbC9mZWF0dXJlcycsICdlbWJlci1tZXRhbC9wcm9wZXJ0
eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXZlbnRzJywgJ2VtYmVyLXJ1bnRpbWUvY29tcGFyZScs
ICdyZXF1aXJlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsVXRp
bHMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlck1ldGFsRW1wdHlfb2JqZWN0LCBfZW1iZXJN
ZXRhbEZlYXR1cmVzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cywgX2VtYmVyTWV0YWxFdmVu
dHMsIF9lbWJlclJ1bnRpbWVDb21wYXJlLCBfcmVxdWlyZSkgeworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIEhF
TFBFUlMKKyAgLy8KKworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIF9lbWJlckEgPSB1bmRlZmlu
ZWQ7CisKKyAgZnVuY3Rpb24gZW1iZXJBKCkgeworICAgIHJldHVybiAoX2VtYmVyQSB8fCAoX2Vt
YmVyQSA9IF9yZXF1aXJlLmRlZmF1bHQoJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL25hdGl2ZV9hcnJh
eScpLkEpKSgpOworICB9CisKKyAgdmFyIGNvbnRleHRzID0gW107CisKKyAgZnVuY3Rpb24gcG9w
Q3R4KCkgeworICAgIHJldHVybiBjb250ZXh0cy5sZW5ndGggPT09IDAgPyB7fSA6IGNvbnRleHRz
LnBvcCgpOworICB9CisKKyAgZnVuY3Rpb24gcHVzaEN0eChjdHgpIHsKKyAgICBjb250ZXh0cy5w
dXNoKGN0eCk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBmdW5jdGlvbiBpdGVyKGtleSwg
dmFsdWUpIHsKKyAgICB2YXIgdmFsdWVQcm92aWRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDI7
CisKKyAgICBmdW5jdGlvbiBpKGl0ZW0pIHsKKyAgICAgIHZhciBjdXIgPSBfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQoaXRlbSwga2V5KTsKKyAgICAgIHJldHVybiB2YWx1ZVByb3ZpZGVkID8g
dmFsdWUgPT09IGN1ciA6ICEhY3VyOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAg
LyoqCisgICAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIGltcGxlbWVu
dGVkIGJ5IGVudW1lcmFibGUgb2JqZWN0cworICAgIGluIEVtYmVyLiBNb3N0IG9mIHRoZXNlIG1l
dGhvZHMgZm9sbG93IHRoZSBzdGFuZGFyZCBBcnJheSBpdGVyYXRpb24KKyAgICBBUEkgZGVmaW5l
ZCB1cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGZlYXR1
cmVzIHRoYXQKKyAgICBjYW5ub3QgYmUgZW11bGF0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgSmF2
YVNjcmlwdCkuCisgIAorICAgIFRoaXMgbWl4aW4gaXMgYXBwbGllZCBhdXRvbWF0aWNhbGx5IHRv
IHRoZSBBcnJheSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlvdQorICAgIGNhbiB1c2UgYW55IG9m
IHRoZXNlIG1ldGhvZHMgb24gc2ltcGxlIGFycmF5cy4gSWYgQXJyYXkgYWxyZWFkeSBpbXBsZW1l
bnRzCisgICAgb25lIG9mIHRoZXNlIG1ldGhvZHMsIHRoZSBtaXhpbiB3aWxsIG5vdCBvdmVycmlk
ZSB0aGVtLgorICAKKyAgICAjIyBXcml0aW5nIFlvdXIgT3duIEVudW1lcmFibGUKKyAgCisgICAg
VG8gbWFrZSB5b3VyIG93biBjdXN0b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5lZWQgdHdvIGl0
ZW1zOgorICAKKyAgICAxLiBZb3UgbXVzdCBoYXZlIGEgbGVuZ3RoIHByb3BlcnR5LiBUaGlzIHBy
b3BlcnR5IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIKKyAgICAgICB0aGUgbnVtYmVyIG9mIGl0ZW1z
IGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdlcy4gSWYgeW91IHVzZSB0aGlzCisgICAg
ICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFzcywgeW91IHNob3VsZCBiZSBzdXJlIHRv
IGNoYW5nZSB0aGUgbGVuZ3RoCisgICAgICAgcHJvcGVydHkgdXNpbmcgYHNldCgpLmAKKyAgCisg
ICAgMi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9jdW1lbnRhdGlv
bi4KKyAgCisgICAgT25jZSB5b3UgaGF2ZSB0aGVzZSB0d28gbWV0aG9kcyBpbXBsZW1lbnRlZCwg
YXBwbHkgdGhlIGBFbWJlci5FbnVtZXJhYmxlYCBtaXhpbgorICAgIHRvIHlvdXIgY2xhc3MgYW5k
IHlvdSB3aWxsIGJlIGFibGUgdG8gZW51bWVyYXRlIHRoZSBjb250ZW50cyBvZiB5b3VyIG9iamVj
dAorICAgIGxpa2UgYW55IG90aGVyIGNvbGxlY3Rpb24uCisgIAorICAgICMjIFVzaW5nIEVtYmVy
IEVudW1lcmF0aW9uIHdpdGggT3RoZXIgTGlicmFyaWVzCisgIAorICAgIE1hbnkgb3RoZXIgbGli
cmFyaWVzIHByb3ZpZGUgc29tZSBraW5kIG9mIGl0ZXJhdG9yIG9yIGVudW1lcmF0aW9uIGxpa2UK
KyAgICBmYWNpbGl0eS4gVGhpcyBpcyBvZnRlbiB3aGVyZSB0aGUgbW9zdCBjb21tb24gQVBJIGNv
bmZsaWN0cyBvY2N1ci4KKyAgICBFbWJlcidzIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBhcyBmcmll
bmRseSBhcyBwb3NzaWJsZSB3aXRoIG90aGVyCisgICAgbGlicmFyaWVzIGJ5IGltcGxlbWVudGlu
ZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkgY29ycmVzcG9uZCB0byB0aGUKKyAgICBKYXZhU2Ny
aXB0IDEuOCBBUEkuCisgIAorICAgIEBjbGFzcyBFbnVtZXJhYmxlCisgICAgQG5hbWVzcGFjZSBF
bWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAcHJpdmF0ZQorICAqLworICB2YXIgRW51
bWVyYWJsZSA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAg
ICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBwbHkg
dGhpcyBtaXhpbi4KKyAgICAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gbWFrZSB5b3VyIGNs
YXNzIGVudW1lcmFibGUuCisgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgcmVwZWF0
ZWRseSBkdXJpbmcgZW51bWVyYXRpb24uIFRoZSBpbmRleCB2YWx1ZQorICAgICAgd2lsbCBhbHdh
eXMgYmVnaW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9ub3RvbmljYWxseS4gWW91IGRvbid0IGhh
dmUgdG8KKyAgICAgIHJlbHkgb24gdGhlIGluZGV4IHZhbHVlIHRvIGRldGVybWluZSB3aGF0IG9i
amVjdCB0byByZXR1cm4sIGJ1dCB5b3Ugc2hvdWxkCisgICAgICBhbHdheXMgY2hlY2sgdGhlIHZh
bHVlIGFuZCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgd2hlbiB5b3Ugc2VlIHRoZQorICAgICAg
cmVxdWVzdGVkIGluZGV4IGlzIDAuCisgICAgICAgVGhlIGBwcmV2aW91c09iamVjdGAgaXMgdGhl
IG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IGNhbGwKKyAgICAgIHRvIGBu
ZXh0T2JqZWN0YCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLiBUaGlzIGlzIGEgdXNlZnVsIHdh
eSB0bworICAgICAgbWFuYWdlIGl0ZXJhdGlvbiBpZiB5b3UgYXJlIHRyYWNpbmcgYSBsaW5rZWQg
bGlzdCwgZm9yIGV4YW1wbGUuCisgICAgICAgRmluYWxseSB0aGUgY29udGV4dCBwYXJhbWV0ZXIg
d2lsbCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKKyAgICAgIGEgInNjcmF0
Y2hwYWQiIHRvIG1haW50YWluIGFueSBvdGhlciBzdGF0ZSB5b3UgbmVlZCBpbiBvcmRlciB0byBp
dGVyYXRlCisgICAgICBwcm9wZXJseS4gVGhlIGNvbnRleHQgb2JqZWN0IGlzIHJldXNlZCBhbmQg
aXMgbm90IHJlc2V0IGJldHdlZW4KKyAgICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJlIHlvdSBz
ZXR1cCB0aGUgY29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKKyAgICAgIHRoZSBp
bmRleCBwYXJhbWV0ZXIgaXMgMC4KKyAgICAgICBHZW5lcmFsbHkgaXRlcmF0b3JzIHdpbGwgY29u
dGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhlIGluZGV4CisgICAgICByZWFjaGVz
IHRoZSBjdXJyZW50IGxlbmd0aC0xLiBJZiB5b3UgcnVuIG91dCBvZiBkYXRhIGJlZm9yZSB0aGlz
CisgICAgICB0aW1lIGZvciBzb21lIHJlYXNvbiwgeW91IHNob3VsZCBzaW1wbHkgcmV0dXJuIHVu
ZGVmaW5lZC4KKyAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhv
ZCBzaW1wbHkgbG9va3MgdXAgdGhlIGluZGV4LgorICAgICAgVGhpcyB3b3JrcyBncmVhdCBvbiBh
bnkgQXJyYXktbGlrZSBvYmplY3RzLgorICAgICAgIEBtZXRob2QgbmV4dE9iamVjdAorICAgICAg
QHBhcmFtIHtOdW1iZXJ9IGluZGV4IHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBpdGVyYXRpb24K
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSBwcmV2aW91c09iamVjdCB0aGUgdmFsdWUgcmV0dXJuZWQg
YnkgdGhlIGxhc3QgY2FsbCB0bworICAgICAgICBgbmV4dE9iamVjdGAuCisgICAgICBAcGFyYW0g
e09iamVjdH0gY29udGV4dCBhIGNvbnRleHQgb2JqZWN0IHlvdSBjYW4gdXNlIHRvIG1haW50YWlu
IHN0YXRlLgorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGl0
ZXJhdGlvbiBvciB1bmRlZmluZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBuZXh0T2Jq
ZWN0OiBudWxsLAorCisgICAgLyoqCisgICAgICBIZWxwZXIgbWV0aG9kIHJldHVybnMgdGhlIGZp
cnN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gVGhpcyBpcyB1c3VhbGx5CisgICAgICB1c2Vk
IGJ5IGJpbmRpbmdzIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgZnJhbWV3b3JrIHRvIGV4dHJhY3Qg
YSBzaW5nbGUKKyAgICAgIG9iamVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250YWlucyBvbmx5IG9u
ZSBpdGVtLgorICAgICAgIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IHNob3VsZCBp
bXBsZW1lbnQgaXQgc28gdGhhdCBpdCB3aWxsCisgICAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1l
IHZhbHVlIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQorICAgICAg
Y29udGFpbnMgb25seSBvbmUgb2JqZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVy
biB0aGF0IG9iamVjdC4KKyAgICAgIElmIHlvdXIgZW51bWVyYWJsZSBpcyBlbXB0eSwgdGhpcyBt
ZXRob2Qgc2hvdWxkIHJldHVybiBgdW5kZWZpbmVkYC4KKyAgICAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYyddOworICAgICAgYXJyLmdldCgnZmlyc3RPYmpl
Y3QnKTsgIC8vICdhJworICAgICAgIHZhciBhcnIgPSBbXTsKKyAgICAgIGFyci5nZXQoJ2ZpcnN0
T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBmaXJz
dE9iamVjdAorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgb2JqZWN0IG9yIHVuZGVmaW5lZAor
ICAgICAgQHJlYWRPbmx5CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBmaXJzdE9iamVjdDog
X2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCgnW10nLCBmdW5jdGlvbiAoKSB7CisgICAgICBp
ZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSA9PT0gMCkgewor
ICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICAvLyBoYW5kbGUgZ2Vu
ZXJpYyBlbnVtZXJhYmxlcworICAgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKKyAgICAgIHZh
ciByZXQgPSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwgY29udGV4dCk7CisKKyAgICAgIHB1c2hD
dHgoY29udGV4dCk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSkucmVhZE9ubHkoKSwKKwor
ICAgIC8qKgorICAgICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBsYXN0IG9iamVjdCBmcm9t
IGEgY29sbGVjdGlvbi4gSWYgeW91ciBlbnVtZXJhYmxlCisgICAgICBjb250YWlucyBvbmx5IG9u
ZSBvYmplY3QsIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoYXQgb2JqZWN0Lgor
ICAgICAgSWYgeW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0
dXJuIGB1bmRlZmluZWRgLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBhcnIgPSBb
J2EnLCAnYicsICdjJ107CisgICAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAnYycKKyAg
ICAgICB2YXIgYXJyID0gW107CisgICAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1bmRl
ZmluZWQKKyAgICAgIGBgYAorICAgICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0CisgICAgICBAcmV0
dXJuIHtPYmplY3R9IHRoZSBsYXN0IG9iamVjdCBvciB1bmRlZmluZWQKKyAgICAgIEByZWFkT25s
eQorICAgICAgQHB1YmxpYworICAgICovCisgICAgbGFzdE9iamVjdDogX2VtYmVyTWV0YWxDb21w
dXRlZC5jb21wdXRlZCgnW10nLCBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKTsKKworICAgICAgaWYgKGxlbiA9
PT0gMCkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorCisgICAgICB2YXIg
Y29udGV4dCA9IHBvcEN0eCgpOworICAgICAgdmFyIGlkeCA9IDA7CisgICAgICB2YXIgbGFzdCA9
IG51bGw7CisgICAgICB2YXIgY3VyOworCisgICAgICBkbyB7CisgICAgICAgIGxhc3QgPSBjdXI7
CisgICAgICAgIGN1ciA9IHRoaXMubmV4dE9iamVjdChpZHgrKywgbGFzdCwgY29udGV4dCk7Cisg
ICAgICB9IHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCk7CisKKyAgICAgIHB1c2hDdHgoY29udGV4
dCk7CisKKyAgICAgIHJldHVybiBsYXN0OworICAgIH0pLnJlYWRPbmx5KCksCisKKyAgICAvKioK
KyAgICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBwYXNzZWQgb2JqZWN0IGNhbiBiZSBmb3VuZCBp
biB0aGUgcmVjZWl2ZXIuIFRoZQorICAgICAgZGVmYXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0
aHJvdWdoIHRoZSBlbnVtZXJhYmxlIHVudGlsIHRoZSBvYmplY3QKKyAgICAgIGlzIGZvdW5kLiBZ
b3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB3aXRoIGEgbW9yZSBlZmZpY2llbnQgdmVyc2lv
bi4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYydd
OworICAgICAgIGFyci5jb250YWlucygnYScpOyAvLyB0cnVlCisgICAgICBhcnIuY29udGFpbnMo
J3onKTsgLy8gZmFsc2UKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgY29udGFpbnMKKyAgICAg
IEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgICAgQHJl
dHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIG9iamVjdCBpcyBmb3VuZCBpbiBlbnVtZXJhYmxlLgor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgY29udGFpbnM6IGZ1bmN0aW9uIChvYmopIHsKKyAg
ICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICByZXR1
cm4gaXRlbSA9PT0gb2JqOworICAgICAgfSk7CisKKyAgICAgIHJldHVybiBmb3VuZCAhPT0gdW5k
ZWZpbmVkOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGVu
dW1lcmFibGUsIGNhbGxpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbiBvbiBlYWNoCisgICAgICBpdGVt
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUgYGZvckVhY2goKWAgbWV0aG9kIGRlZmlu
ZWQgaW4KKyAgICAgIEphdmFTY3JpcHQgMS42LgorICAgICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAorICAg
ICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKKyAgICAgIGBgYAorICAgICAgIC0g
YGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGlu
ZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgZW51
bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KKyAgICAgICBOb3RlIHRo
YXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9u
YWwgdGFyZ2V0CisgICAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhl
IGNvbnRleHQuIFRoaXMgaXMgYSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9y
IGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBm
b3JFYWNoCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQorICAgICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYwor
ICAgICovCisgICAgZm9yRWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAg
IGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdGhyb3cgbmV3
IFR5cGVFcnJvcigpOworICAgICAgfQorCisgICAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgpOwor
ICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3Ro
Jyk7CisgICAgICB2YXIgbGFzdCA9IG51bGw7CisKKyAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVm
aW5lZCkgeworICAgICAgICB0YXJnZXQgPSBudWxsOworICAgICAgfQorCisgICAgICBmb3IgKHZh
ciBpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgIHZhciBuZXh0ID0gdGhpcy5u
ZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29udGV4dCk7CisgICAgICAgIGNhbGxiYWNrLmNhbGwodGFy
Z2V0LCBuZXh0LCBpZHgsIHRoaXMpOworICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgIH0KKwor
ICAgICAgbGFzdCA9IG51bGw7CisgICAgICBjb250ZXh0ID0gcHVzaEN0eChjb250ZXh0KTsKKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWxpYXMgZm9yIGBt
YXBCeWAKKyAgICAgICBAbWV0aG9kIGdldEVhY2gKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkg
bmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFy
cmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgZ2V0RWFjaDogX2VtYmVyTWV0YWxNaXhp
bi5hbGlhc01ldGhvZCgnbWFwQnknKSwKKworICAgIC8qKgorICAgICAgU2V0cyB0aGUgdmFsdWUg
b24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlci4gVGhpcyBpcyBtb3JlCisgICAg
ICBlZmZpY2llbnQgdGhhbiB1c2luZyBvdGhlciBtZXRob2RzIGRlZmluZWQgb24gdGhpcyBoZWxw
ZXIuIElmIHRoZSBvYmplY3QKKyAgICAgIGltcGxlbWVudHMgRW1iZXIuT2JzZXJ2YWJsZSwgdGhl
IHZhbHVlIHdpbGwgYmUgY2hhbmdlZCB0byBgc2V0KCksYCBvdGhlcndpc2UKKyAgICAgIGl0IHdp
bGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0cyBhcmUgc2tpcHBlZC4KKyAgICAgICBA
bWV0aG9kIHNldEVhY2gKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQK
KyAgICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgb2JqZWN0IHRvIHNldAorICAgICAgQHJl
dHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgc2V0RWFj
aDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZvckVhY2goZnVu
Y3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KGl0ZW0s
IGtleSwgdmFsdWUpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgTWFwcyBh
bGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB0byBhbm90aGVyIHZhbHVlLCByZXR1
cm5pbmcKKyAgICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFw
KClgIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhv
ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisg
ICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAg
LSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBg
aW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBl
bnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNo
b3VsZCByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRp
b24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Cisg
ICAgICBvYmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQuIFRo
aXMgaXMgYSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFj
Y2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBtYXAKKyAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgICBA
cGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgICBA
cmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4KKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIG1hcDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHZhciByZXQgPSBl
bWJlckEoKTsKKworICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh4LCBpZHgsIGkpIHsKKyAg
ICAgICAgcmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LCBpKTsKKyAgICAg
IH0pOworCisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNpbWls
YXIgdG8gbWFwLCB0aGlzIHNwZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9m
IHRoZSBuYW1lZAorICAgICAgcHJvcGVydHkgb24gYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlv
bi4KKyAgICAgICBAbWV0aG9kIG1hcEJ5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IG5hbWUg
b2YgdGhlIHByb3BlcnR5CisgICAgICBAcmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4K
KyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG1hcEJ5OiBmdW5jdGlvbiAoa2V5KSB7CisgICAg
ICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKG5leHQpIHsKKyAgICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldChuZXh0LCBrZXkpOworICAgICAgfSk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMgaW4g
dGhlIGVudW1lcmF0aW9uIHRoYXQgdGhlIHBhc3NlZAorICAgICAgZnVuY3Rpb24gcmV0dXJucyB0
cnVlIGZvci4gVGhpcyBtZXRob2QgY29ycmVzcG9uZHMgdG8gYGZpbHRlcigpYCBkZWZpbmVkIGlu
CisgICAgICBKYXZhU2NyaXB0IDEuNi4KKyAgICAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBw
cm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICAgIHBh
cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdW5j
dGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgICBgYGAKKyAgICAgICAtIGBpdGVt
YCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBpbmRleGAg
aXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGVudW1lcmFi
bGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgSXQgc2hvdWxkIHJl
dHVybiBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0cywgYGZhbHNlYAor
ICAgICAgb3RoZXJ3aXNlLgorICAgICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNhbGxi
YWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKKyAgICAgIG9iamVjdCB0
aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qg
d2F5CisgICAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBj
dXJyZW50IG9iamVjdC4KKyAgICAgICBAbWV0aG9kIGZpbHRlcgorICAgICAgQHBhcmFtIHtGdW5j
dGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKKyAgICAgIEByZXR1cm4ge0Fy
cmF5fSBBIGZpbHRlcmVkIGFycmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgZmlsdGVy
OiBmdW5jdGlvbiAoY2FsbGJhY2ssIHRhcmdldCkgeworICAgICAgdmFyIHJldCA9IGVtYmVyQSgp
OworCisgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHgsIGlkeCwgaSkgeworICAgICAgICBp
ZiAoY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSkpIHsKKyAgICAgICAgICByZXQucHVz
aCh4KTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwK
KworICAgIC8qKgorICAgICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMg
aW4gdGhlIGVudW1lcmF0aW9uIHdoZXJlIHRoZSBwYXNzZWQKKyAgICAgIGZ1bmN0aW9uIHJldHVy
bnMgZmFsc2UuIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIGZpbHRlcigpLgorICAgICAg
IFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2lu
ZyBzaWduYXR1cmUgKGFsbAorICAgICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgorICAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsK
KyAgICAgIGBgYAorICAgICAgIC0gKml0ZW0qIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0
ZXJhdGlvbi4KKyAgICAgIC0gKmluZGV4KiBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRl
cmF0aW9uCisgICAgICAtICplbnVtZXJhYmxlKiBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRz
ZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gYSBmYWxzZXkgdmFsdWUgdG8gaW5jbHVkZSB0
aGUgaXRlbSBpbiB0aGUgcmVzdWx0cy4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8g
YSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgICBv
YmplY3QgdGhhdCB3aWxsIGJlIHNldCBhcyAidGhpcyIgb24gdGhlIGNvbnRleHQuIFRoaXMgaXMg
YSBnb29kIHdheQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0
byB0aGUgY3VycmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCByZWplY3QKKyAgICAgIEBwYXJh
bSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCisgICAgICBAcGFy
YW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCisgICAgICBAcmV0
dXJuIHtBcnJheX0gQSByZWplY3RlZCBhcnJheS4KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IHJlamVjdDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHJldHVybiB0aGlz
LmZpbHRlcihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJldHVybiAhY2FsbGJhY2suYXBwbHkodGFy
Z2V0LCBhcmd1bWVudHMpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0
dXJucyBhbiBhcnJheSB3aXRoIGp1c3QgdGhlIGl0ZW1zIHdpdGggdGhlIG1hdGNoZWQgcHJvcGVy
dHkuIFlvdQorICAgICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGgg
dGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCisgICAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHBy
b3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KKyAgICAgICBAbWV0aG9kIGZpbHRlckJ5
CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgICBA
cGFyYW0geyp9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgorICAgICAg
QHJldHVybiB7QXJyYXl9IGZpbHRlcmVkIGFycmF5CisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICBmaWx0ZXJCeTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZp
bHRlcihpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0
aHkgdmFsdWVzIGZvcgorICAgICAga2V5LiAgWW91IGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29u
ZCBhcmd1bWVudCB3aXRoIHRoZSB0YXJnZXQgdmFsdWUuICBPdGhlcndpc2UKKyAgICAgIHRoaXMg
d2lsbCBtYXRjaCBhbnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gZmFsc2UuCisgICAgICAg
QG1ldGhvZCByZWplY3RCeQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkg
dG8gdGVzdAorICAgICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8g
dGVzdCBhZ2FpbnN0LgorICAgICAgQHJldHVybiB7QXJyYXl9IHJlamVjdGVkIGFycmF5CisgICAg
ICBAcHVibGljCisgICAgKi8KKyAgICByZWplY3RCeTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsK
KyAgICAgIHZhciBleGFjdFZhbHVlID0gZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXkpID09PSB2YWx1ZTsKKyAgICAg
IH07CisKKyAgICAgIHZhciBoYXNWYWx1ZSA9IGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgIHJl
dHVybiAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChpdGVtLCBrZXkpOworICAgICAgfTsK
KworICAgICAgdmFyIHVzZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyBleGFjdFZhbHVlIDog
aGFzVmFsdWU7CisKKyAgICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGZvciB3aGlj
aCB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgorICAgICAgVGhpcyBtZXRob2Qgd29ya3Mgc2lt
aWxhciB0byB0aGUgYGZpbHRlcigpYCBtZXRob2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEuNgor
ICAgICAgZXhjZXB0IHRoYXQgaXQgd2lsbCBzdG9wIHdvcmtpbmcgb24gdGhlIGFycmF5IG9uY2Ug
YSBtYXRjaCBpcyBmb3VuZC4KKyAgICAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRl
IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKKyAgICAgIHBhcmFtZXRl
cnMgYXJlIG9wdGlvbmFsKToKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdW5jdGlvbihp
dGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CisgICAgICBgYGAKKyAgICAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBpbmRleGAgaXMgdGhl
IGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KKyAgICAgIC0gYGVudW1lcmFibGVgIGlz
IHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCisgICAgICAgSXQgc2hvdWxkIHJldHVybiB0
aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKKyAg
ICAgIG90aGVyd2lzZS4KKyAgICAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFj
aywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CisgICAgICBvYmplY3QgdGhh
dCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQuIFRoaXMgaXMgYSBnb29kIHdh
eQorICAgICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3Vy
cmVudCBvYmplY3QuCisgICAgICAgQG1ldGhvZCBmaW5kCisgICAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9
IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAgICAgQHJldHVybiB7T2JqZWN0
fSBGb3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgLgorICAgICAgQHB1YmxpYworICAgICovCisgICAg
ZmluZDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0YXJnZXQpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpOworCisgICAgICBpZiAodGFy
Z2V0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICAgIH0KKwor
ICAgICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKKyAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwor
ICAgICAgdmFyIGxhc3QgPSBudWxsOworICAgICAgdmFyIG5leHQsIHJldDsKKworICAgICAgZm9y
ICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuICYmICFmb3VuZDsgaWR4KyspIHsKKyAgICAgICAgbmV4
dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNvbnRleHQpOworCisgICAgICAgIGlmIChm
b3VuZCA9IGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRoaXMpKSB7CisgICAgICAg
ICAgcmV0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAg
fQorCisgICAgICBuZXh0ID0gbGFzdCA9IG51bGw7CisgICAgICBjb250ZXh0ID0gcHVzaEN0eChj
b250ZXh0KTsKKworICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBS
ZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHdpdGggYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgcGFzc2Vk
IHZhbHVlLiBZb3UKKyAgICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3
aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVyd2lzZQorICAgICAgdGhpcyB3aWxsIG1hdGNoIGFu
eSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCisgICAgICAgVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBtb3JlIGdlbmVyaWMgYGZpbmQoKWAgbWV0aG9kLgorICAgICAg
IEBtZXRob2QgZmluZEJ5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0
byB0ZXN0CisgICAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0
ZXN0IGFnYWluc3QuCisgICAgICBAcmV0dXJuIHtPYmplY3R9IGZvdW5kIGl0ZW0gb3IgYHVuZGVm
aW5lZGAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGZpbmRCeTogZnVuY3Rpb24gKGtleSwg
dmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLmZpbmQoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFz
c2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZXZlcnkgaXRlbSBpbiB0aGUKKyAgICAgIGVu
dW1lcmF0aW9uLiBUaGlzIGNvcnJlc3BvbmRzIHdpdGggdGhlIGBldmVyeSgpYCBtZXRob2QgaW4g
SmF2YVNjcmlwdCAxLjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBz
aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJz
IGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24oaXRl
bSwgaW5kZXgsIGVudW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgaXRlbWAgaXMgdGhl
IGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVtZXJhYmxlYCBpcyB0
aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gdGhl
IGB0cnVlYCBvciBgZmFsc2VgLgorICAgICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNh
bGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKKyAgICAgIG9iamVj
dCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdv
b2Qgd2F5CisgICAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRo
ZSBjdXJyZW50IG9iamVjdC4KKyAgICAgICBFeGFtcGxlIFVzYWdlOgorICAgICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIGlmIChwZW9wbGUuZXZlcnkoaXNFbmdpbmVlcikpIHsKKyAgICAgICAgUGF5
Y2hlY2tzLmFkZEJpZ0JvbnVzKCk7CisgICAgICB9CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGV2ZXJ5CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g
ZXhlY3V0ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0
IHRvIHVzZQorICAgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIGV2ZXJ5OiBmdW5jdGlvbiAoY2FsbGJhY2ssIHRhcmdldCkgeworICAgICAgcmV0dXJuICF0
aGlzLmZpbmQoZnVuY3Rpb24gKHgsIGlkeCwgaSkgeworICAgICAgICByZXR1cm4gIWNhbGxiYWNr
LmNhbGwodGFyZ2V0LCB4LCBpZHgsIGkpOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBwcm9wZXJ0eSByZXNvbHZlcyB0byB0
aGUgdmFsdWUgb2YgdGhlIHNlY29uZAorICAgICAgYXJndW1lbnQgZm9yIGFsbCBpdGVtcyBpbiB0
aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIKKyAgICAg
IHRoYW4gdXNpbmcgYSBjYWxsYmFjay4KKyAgICAgICBAbWV0aG9kIGlzRXZlcnkKKyAgICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4gRGVmYXVsdHMgdG8g
YHRydWVgCisgICAgICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHNpbmNlIDEuMy4wCisgICAg
ICBAcHVibGljCisgICAgKi8KKyAgICBpc0V2ZXJ5OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewor
ICAgICAgcmV0dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0
aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCisgICAgICBlbnVtZXJhdGlvbi4g
VGhpcyBjb3JyZXNwb25kcyB3aXRoIHRoZSBgc29tZSgpYCBtZXRob2QgaW4gSmF2YVNjcmlwdCAx
LjYuCisgICAgICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0
aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25h
bCk6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVu
dW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRl
bSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4
IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJs
ZSBvYmplY3QgaXRzZWxmLgorICAgICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBp
bmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCisgICAgICBvdGhlcndpc2Uu
CisgICAgICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxz
byBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAorICAgICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKKyAgICAgIHRvIGdp
dmUgeW91ciBpdGVyYXRvciBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Lgor
ICAgICAgIFVzYWdlIEV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgaWYgKHBl
b3BsZS5hbnkoaXNNYW5hZ2VyKSkgeworICAgICAgICBQYXljaGVja3MuYWRkQmlnZ2VyQm9udXMo
KTsKKyAgICAgIH0KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgYW55CisgICAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgICAgQHBhcmFt
IHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQorICAgICAgQHJldHVy
biB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAg
Zm9yIGFueSBpdGVtCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBhbnk6IGZ1bmN0aW9uIChj
YWxsYmFjaywgdGFyZ2V0KSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdsZW5ndGgnKTsKKyAgICAgIHZhciBjb250ZXh0ID0gcG9wQ3R4KCk7Cisg
ICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICAgIHZhciBsYXN0ID0gbnVsbDsKKyAgICAgIHZh
ciBuZXh0LCBpZHg7CisKKyAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkgeworICAgICAg
ICB0YXJnZXQgPSBudWxsOworICAgICAgfQorCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxl
biAmJiAhZm91bmQ7IGlkeCsrKSB7CisgICAgICAgIG5leHQgPSB0aGlzLm5leHRPYmplY3QoaWR4
LCBsYXN0LCBjb250ZXh0KTsKKyAgICAgICAgZm91bmQgPSBjYWxsYmFjay5jYWxsKHRhcmdldCwg
bmV4dCwgaWR4LCB0aGlzKTsKKyAgICAgICAgbGFzdCA9IG5leHQ7CisgICAgICB9CisKKyAgICAg
IG5leHQgPSBsYXN0ID0gbnVsbDsKKyAgICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQpOwor
ICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgYHRy
dWVgIGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gdGhlIHZhbHVlIG9mIHRoZSBz
ZWNvbmQKKyAgICAgIGFyZ3VtZW50IGZvciBhbnkgaXRlbSBpbiB0aGUgZW51bWVyYWJsZS4gVGhp
cyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIKKyAgICAgIHRoYW4gdXNpbmcgYSBjYWxs
YmFjay4KKyAgICAgICBAbWV0aG9kIGlzQW55CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBwcm9wZXJ0eSB0byB0ZXN0CisgICAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25h
bCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuIERlZmF1bHRzIHRvIGB0cnVlYAorICAgICAgQHJldHVy
biB7Qm9vbGVhbn0KKyAgICAgIEBzaW5jZSAxLjMuMAorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaXNBbnk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gdGhpcy5hbnko
aXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBU
aGlzIHdpbGwgY29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9yIGludG8gYSBzaW5n
bGUgdmFsdWUuIEl0CisgICAgICBpcyBhIHVzZWZ1bCB3YXkgdG8gY29sbGVjdCBhIHN1bW1hcnkg
dmFsdWUgZnJvbSBhbiBlbnVtZXJhdGlvbi4gVGhpcworICAgICAgY29ycmVzcG9uZHMgdG8gdGhl
IGByZWR1Y2UoKWAgbWV0aG9kIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjguCisgICAgICAgVGhl
IGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZSAoYWxsCisgICAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgZnVuY3Rpb24ocHJldmlvdXNWYWx1ZSwgaXRlbSwgaW5kZXgsIGVu
dW1lcmFibGUpOworICAgICAgYGBgCisgICAgICAgLSBgcHJldmlvdXNWYWx1ZWAgaXMgdGhlIHZh
bHVlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gdGhlIGl0ZXJhdG9yLgorICAgICAgLSBg
aXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgorICAgICAgLSBgaW5k
ZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCisgICAgICAtIGBlbnVt
ZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgorICAgICAgIFJldHVybiB0
aGUgbmV3IGN1bXVsYXRpdmUgdmFsdWUuCisgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGNhbGxi
YWNrIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFsVmFsdWVgLiBBbiBlcnJvcgorICAgICAg
d2lsbCBiZSByYWlzZWQgaWYgeW91IGRvIG5vdCBwYXNzIGFuIGluaXRpYWwgdmFsdWUgYW5kIHRo
ZSBlbnVtZXJhdG9yIGlzCisgICAgICBlbXB0eS4KKyAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRo
ZSBvdGhlciBtZXRob2RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8KKyAgICAg
IHBhc3MgYSB0YXJnZXQgb2JqZWN0IHRvIHNldCBhcyB0aGlzIGZvciB0aGUgY2FsbGJhY2suIEl0
J3MgcGFydCBvZiB0aGUKKyAgICAgIHNwZWMuIFNvcnJ5LgorICAgICAgIEBtZXRob2QgcmVkdWNl
CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0
ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIGZvciB0
aGUgcmVkdWNlCisgICAgICBAcGFyYW0ge1N0cmluZ30gcmVkdWNlclByb3BlcnR5IGludGVybmFs
IHVzZSBvbmx5LgorICAgICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1ZS4KKyAg
ICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlZHVjZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBpbml0
aWFsVmFsdWUsIHJlZHVjZXJQcm9wZXJ0eSkgeworICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAh
PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CisgICAgICB9
CisKKyAgICAgIHZhciByZXQgPSBpbml0aWFsVmFsdWU7CisKKyAgICAgIHRoaXMuZm9yRWFjaChm
dW5jdGlvbiAoaXRlbSwgaSkgeworICAgICAgICByZXQgPSBjYWxsYmFjayhyZXQsIGl0ZW0sIGks
IHRoaXMsIHJlZHVjZXJQcm9wZXJ0eSk7CisgICAgICB9LCB0aGlzKTsKKworICAgICAgcmV0dXJu
IHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBJbnZva2VzIHRoZSBuYW1lZCBtZXRob2Qg
b24gZXZlcnkgb2JqZWN0IGluIHRoZSByZWNlaXZlciB0aGF0CisgICAgICBpbXBsZW1lbnRzIGl0
LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUgaW1wbGVtZW50YXRpb24gaW4KKyAgICAg
IFByb3RvdHlwZSAxLjYuCisgICAgICAgQG1ldGhvZCBpbnZva2UKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICAgIEBwYXJhbSB7T2Jq
ZWN0Li4ufSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGFzIHdlbGwuCisgICAgICBA
cmV0dXJuIHtBcnJheX0gcmV0dXJuIHZhbHVlcyBmcm9tIGNhbGxpbmcgaW52b2tlLgorICAgICAg
QHB1YmxpYworICAgICovCisgICAgaW52b2tlOiBmdW5jdGlvbiAobWV0aG9kTmFtZSkgeworICAg
ICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4g
MSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICB2
YXIgcmV0ID0gZW1iZXJBKCk7CisKKyAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoeCwgaWR4
KSB7CisgICAgICAgIHZhciBtZXRob2QgPSB4ICYmIHhbbWV0aG9kTmFtZV07CisKKyAgICAgICAg
aWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBtZXRob2QpIHsKKyAgICAgICAgICByZXRbaWR4XSA9
IGFyZ3MgPyBtZXRob2QuYXBwbHkoeCwgYXJncykgOiB4W21ldGhvZE5hbWVdKCk7CisgICAgICAg
IH0KKyAgICAgIH0sIHRoaXMpOworCisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIFNpbXBseSBjb252ZXJ0cyB0aGUgZW51bWVyYWJsZSBpbnRvIGEgZ2VudWluZSBh
cnJheS4gVGhlIG9yZGVyIGlzIG5vdAorICAgICAgZ3VhcmFudGVlZC4gQ29ycmVzcG9uZHMgdG8g
dGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBieSBQcm90b3R5cGUuCisgICAgICAgQG1ldGhvZCB0b0Fy
cmF5CisgICAgICBAcmV0dXJuIHtBcnJheX0gdGhlIGVudW1lcmFibGUgYXMgYW4gYXJyYXkuCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7CisgICAgICB2
YXIgcmV0ID0gZW1iZXJBKCk7CisKKyAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobywgaWR4
KSB7CisgICAgICAgIHJldFtpZHhdID0gbzsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gcmV0
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgYSBjb3B5IG9mIHRoZSBhcnJheSB3
aXRoIGFsbCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGVsZW1lbnRzIHJlbW92ZWQuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGFyciA9IFsnYScsIG51bGwsICdjJywgdW5kZWZpbmVk
XTsKKyAgICAgIGFyci5jb21wYWN0KCk7ICAvLyBbJ2EnLCAnYyddCisgICAgICBgYGAKKyAgICAg
ICBAbWV0aG9kIGNvbXBhY3QKKyAgICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91
dCBudWxsIGFuZCB1bmRlZmluZWQgZWxlbWVudHMuCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICBjb21wYWN0OiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rp
b24gKHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOworICAgICAgfSk7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgZXhj
bHVkZXMgdGhlIHBhc3NlZCB2YWx1ZS4gVGhlIGRlZmF1bHQKKyAgICAgIGltcGxlbWVudGF0aW9u
IHJldHVybnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlwZSB1bmxlc3MK
KyAgICAgIHRoZSByZWNlaXZlciBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZS4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYScsICdjJ107CisgICAg
ICBhcnIud2l0aG91dCgnYScpOyAgLy8gWydiJywgJ2MnXQorICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCB3aXRob3V0CisgICAgICBAcGFyYW0ge09iamVjdH0gdmFsdWUKKyAgICAgIEByZXR1cm4g
e0VtYmVyLkVudW1lcmFibGV9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB3aXRob3V0OiBm
dW5jdGlvbiAodmFsdWUpIHsKKyAgICAgIGlmICghdGhpcy5jb250YWlucyh2YWx1ZSkpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgIH0KKworICAgICAgdmFy
IHJldCA9IGVtYmVyQSgpOworCisgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGspIHsKKyAg
ICAgICAgaWYgKGsgIT09IHZhbHVlKSB7CisgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0gazsK
KyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB1
bmlxdWUgdmFsdWVzLiBUaGUgZGVmYXVsdAorICAgICAgaW1wbGVtZW50YXRpb24gcmV0dXJucyBh
biBhcnJheSByZWdhcmRsZXNzIG9mIHRoZSByZWNlaXZlciB0eXBlLgorICAgICAgIGBgYGphdmFz
Y3JpcHQKKyAgICAgIHZhciBhcnIgPSBbJ2EnLCAnYScsICdiJywgJ2InXTsKKyAgICAgIGFyci51
bmlxKCk7ICAvLyBbJ2EnLCAnYiddCisgICAgICBgYGAKKyAgICAgICBUaGlzIG9ubHkgd29ya3Mg
b24gcHJpbWl0aXZlIGRhdGEgdHlwZXMsIGUuZy4gU3RyaW5ncywgTnVtYmVycywgZXRjLgorICAg
ICAgIEBtZXRob2QgdW5pcQorICAgICAgQHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIHVuaXE6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciByZXQg
PSBlbWJlckEoKTsKKworICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CisgICAgICAg
IGlmIChyZXQuaW5kZXhPZihrKSA8IDApIHsKKyAgICAgICAgICByZXQucHVzaChrKTsKKyAgICAg
ICAgfQorICAgICAgfSk7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIHRyaWdnZXIgYW55dGltZSB0aGUgZW51bWVyYWJsZSdz
IGNvbnRlbnQgY2hhbmdlcy4KKyAgICAgIFlvdSBjYW4gb2JzZXJ2ZSB0aGlzIHByb3BlcnR5IHRv
IGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIGVudW1lcmFibGUncworICAgICAgY29udGVu
dC4KKyAgICAgICBGb3IgcGxhaW4gZW51bWVyYWJsZXMsIHRoaXMgcHJvcGVydHkgaXMgcmVhZCBv
bmx5LiBgQXJyYXlgIG92ZXJyaWRlcworICAgICAgdGhpcyBtZXRob2QuCisgICAgICAgQHByb3Bl
cnR5IFtdCisgICAgICBAdHlwZSBBcnJheQorICAgICAgQHJldHVybiB0aGlzCisgICAgICBAcHJp
dmF0ZQorICAgICovCisgICAgJ1tdJzogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCh7Cisg
ICAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9
CisgICAgfSksCisKKyAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAgLy8gRU5VTUVSQUJMRSBPQlNFUlZFUlMKKyAgICAv
LworCisgICAgLyoqCisgICAgICBSZWdpc3RlcnMgYW4gZW51bWVyYWJsZSBvYnNlcnZlci4gTXVz
dCBpbXBsZW1lbnQgYEVtYmVyLkVudW1lcmFibGVPYnNlcnZlcmAKKyAgICAgIG1peGluLgorICAg
ICAgIEBtZXRob2QgYWRkRW51bWVyYWJsZU9ic2VydmVyCisgICAgICBAcGFyYW0ge09iamVjdH0g
dGFyZ2V0CisgICAgICBAcGFyYW0ge09iamVjdH0gW29wdHNdCisgICAgICBAcmV0dXJuIHRoaXMK
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhZGRFbnVtZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0
aW9uICh0YXJnZXQsIG9wdHMpIHsKKyAgICAgIHZhciB3aWxsQ2hhbmdlID0gb3B0cyAmJiBvcHRz
LndpbGxDaGFuZ2UgfHwgJ2VudW1lcmFibGVXaWxsQ2hhbmdlJzsKKyAgICAgIHZhciBkaWRDaGFu
Z2UgPSBvcHRzICYmIG9wdHMuZGlkQ2hhbmdlIHx8ICdlbnVtZXJhYmxlRGlkQ2hhbmdlJzsKKyAg
ICAgIHZhciBoYXNPYnNlcnZlcnMgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKworICAgICAgaWYgKCFoYXNPYnNlcnZlcnMpIHsK
KyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRo
aXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1l
dGFsRXZlbnRzLmFkZExpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQs
IHdpbGxDaGFuZ2UpOworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuYWRkTGlzdGVuZXIodGhpcywg
J0BlbnVtZXJhYmxlOmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgICAgaWYgKCFo
YXNPYnNlcnZlcnMpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVy
dHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVtb3ZlcyBhIHJl
Z2lzdGVyZWQgZW51bWVyYWJsZSBvYnNlcnZlci4KKyAgICAgICBAbWV0aG9kIHJlbW92ZUVudW1l
cmFibGVPYnNlcnZlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAorICAgICAgQHBhcmFt
IHtPYmplY3R9IFtvcHRzXQorICAgICAgQHJldHVybiB0aGlzCisgICAgICBAcHJpdmF0ZQorICAg
ICovCisgICAgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyOiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRz
KSB7CisgICAgICB2YXIgd2lsbENoYW5nZSA9IG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlIHx8ICdl
bnVtZXJhYmxlV2lsbENoYW5nZSc7CisgICAgICB2YXIgZGlkQ2hhbmdlID0gb3B0cyAmJiBvcHRz
LmRpZENoYW5nZSB8fCAnZW51bWVyYWJsZURpZENoYW5nZSc7CisgICAgICB2YXIgaGFzT2JzZXJ2
ZXJzID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2Jz
ZXJ2ZXJzJyk7CisKKyAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJhYmxl
T2JzZXJ2ZXJzJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLnJlbW92ZUxp
c3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwor
ICAgICAgX2VtYmVyTWV0YWxFdmVudHMucmVtb3ZlTGlzdGVuZXIodGhpcywgJ0BlbnVtZXJhYmxl
OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKKworICAgICAgaWYgKGhhc09ic2VydmVycykg
eworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0
aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOworICAgICAgfQorCisgICAgICByZXR1cm4g
dGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhl
IGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKKyAgICAgIG9u
IHRoZSBhcnJheS4KKyAgICAgICBAcHJvcGVydHkgaGFzRW51bWVyYWJsZU9ic2VydmVycworICAg
ICAgQHR5cGUgQm9vbGVhbgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGhhc0VudW1lcmFi
bGVPYnNlcnZlcnM6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQoZnVuY3Rpb24gKCkgewor
ICAgICAgcmV0dXJuIF9lbWJlck1ldGFsRXZlbnRzLmhhc0xpc3RlbmVycyh0aGlzLCAnQGVudW1l
cmFibGU6Y2hhbmdlJykgfHwgX2VtYmVyTWV0YWxFdmVudHMuaGFzTGlzdGVuZXJzKHRoaXMsICdA
ZW51bWVyYWJsZTpiZWZvcmUnKTsKKyAgICB9KSwKKworICAgIC8qKgorICAgICAgSW52b2tlIHRo
aXMgbWV0aG9kIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50cyBvZiB5b3VyIGVudW1lcmFibGUgd2ls
bAorICAgICAgY2hhbmdlLiBZb3UgY2FuIGVpdGhlciBvbWl0IHRoZSBwYXJhbWV0ZXJzIGNvbXBs
ZXRlbHkgb3IgcGFzcyB0aGUgb2JqZWN0cworICAgICAgdG8gYmUgcmVtb3ZlZCBvciBhZGRlZCBp
ZiBhdmFpbGFibGUgb3IganVzdCBhIGNvdW50LgorICAgICAgIEBtZXRob2QgZW51bWVyYWJsZUNv
bnRlbnRXaWxsQ2hhbmdlCisgICAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSBy
ZW1vdmluZyBBbiBlbnVtZXJhYmxlIG9mIHRoZSBvYmplY3RzIHRvCisgICAgICAgIGJlIHJlbW92
ZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSByZW1vdmVkLgorICAgICAgQHBhcmFtIHtF
bWJlci5FbnVtZXJhYmxlfE51bWJlcn0gYWRkaW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVj
dHMgdG8gYmUKKyAgICAgICAgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBiZSBhZGRl
ZC4KKyAgICAgIEBjaGFpbmFibGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBlbnVtZXJh
YmxlQ29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChyZW1vdmluZywgYWRkaW5nKSB7CisgICAg
ICB2YXIgcmVtb3ZlQ250LCBhZGRDbnQsIGhhc0RlbHRhOworCisgICAgICBpZiAoJ251bWJlcicg
PT09IHR5cGVvZiByZW1vdmluZykgeworICAgICAgICByZW1vdmVDbnQgPSByZW1vdmluZzsKKyAg
ICAgIH0gZWxzZSBpZiAocmVtb3ZpbmcpIHsKKyAgICAgICAgcmVtb3ZlQ250ID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHJlbW92aW5nLCAnbGVuZ3RoJyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOworICAgICAgfQorCisgICAgICBpZiAo
J251bWJlcicgPT09IHR5cGVvZiBhZGRpbmcpIHsKKyAgICAgICAgYWRkQ250ID0gYWRkaW5nOwor
ICAgICAgfSBlbHNlIGlmIChhZGRpbmcpIHsKKyAgICAgICAgYWRkQ250ID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KGFkZGluZywgJ2xlbmd0aCcpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgYWRkQ250ID0gYWRkaW5nID0gLTE7CisgICAgICB9CisKKyAgICAgIGhhc0RlbHRhID0gYWRk
Q250IDwgMCB8fCByZW1vdmVDbnQgPCAwIHx8IGFkZENudCAtIHJlbW92ZUNudCAhPT0gMDsKKwor
ICAgICAgaWYgKHJlbW92aW5nID09PSAtMSkgeworICAgICAgICByZW1vdmluZyA9IG51bGw7Cisg
ICAgICB9CisKKyAgICAgIGlmIChhZGRpbmcgPT09IC0xKSB7CisgICAgICAgIGFkZGluZyA9IG51
bGw7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5
V2lsbENoYW5nZSh0aGlzLCAnW10nKTsKKworICAgICAgaWYgKGhhc0RlbHRhKSB7CisgICAgICAg
IF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGVu
Z3RoJyk7CisgICAgICB9CisKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLnNlbmRFdmVudCh0aGlz
LCAnQGVudW1lcmFibGU6YmVmb3JlJywgW3RoaXMsIHJlbW92aW5nLCBhZGRpbmddKTsKKworICAg
ICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSW52b2tlIHRoaXMgbWV0
aG9kIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHlvdXIgZW51bWVyYWJsZSBoYXMgY2hhbmdlZC4KKyAg
ICAgIFRoaXMgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyB3YXRjaGluZyBmb3IgY29udGVudCBj
aGFuZ2VzLiBJZiB5b3UgYXJlCisgICAgICBpbXBsZW1lbnRpbmcgYW4gb3JkZXJlZCBlbnVtZXJh
YmxlIChzdWNoIGFzIGFuIGFycmF5KSwgYWxzbyBwYXNzIHRoZQorICAgICAgc3RhcnQgYW5kIGVu
ZCB2YWx1ZXMgd2hlcmUgdGhlIGNvbnRlbnQgY2hhbmdlZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2Vk
IHRvCisgICAgICBub3RpZnkgcmFuZ2Ugb2JzZXJ2ZXJzLgorICAgICAgIEBtZXRob2QgZW51bWVy
YWJsZUNvbnRlbnREaWRDaGFuZ2UKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZXxOdW1i
ZXJ9IHJlbW92aW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8KKyAgICAgICAgYmUg
cmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCisgICAgICBAcGFy
YW0ge0VtYmVyLkVudW1lcmFibGV8TnVtYmVyfSBhZGRpbmcgIEFuIGVudW1lcmFibGUgb2YgdGhl
IG9iamVjdHMgdG8KKyAgICAgICAgYmUgYWRkZWQgb3IgdGhlIG51bWJlciBvZiBpdGVtcyB0byBi
ZSBhZGRlZC4KKyAgICAgIEBjaGFpbmFibGUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBl
bnVtZXJhYmxlQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24gKHJlbW92aW5nLCBhZGRpbmcpIHsK
KyAgICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVsdGE7CisKKyAgICAgIGlmICgnbnVt
YmVyJyA9PT0gdHlwZW9mIHJlbW92aW5nKSB7CisgICAgICAgIHJlbW92ZUNudCA9IHJlbW92aW5n
OworICAgICAgfSBlbHNlIGlmIChyZW1vdmluZykgeworICAgICAgICByZW1vdmVDbnQgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIHJlbW92ZUNudCA9IHJlbW92aW5nID0gLTE7CisgICAgICB9CisKKyAgICAg
IGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGFkZGluZykgeworICAgICAgICBhZGRDbnQgPSBhZGRp
bmc7CisgICAgICB9IGVsc2UgaWYgKGFkZGluZykgeworICAgICAgICBhZGRDbnQgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQoYWRkaW5nLCAnbGVuZ3RoJyk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBhZGRDbnQgPSBhZGRpbmcgPSAtMTsKKyAgICAgIH0KKworICAgICAgaGFzRGVsdGEg
PSBhZGRDbnQgPCAwIHx8IHJlbW92ZUNudCA8IDAgfHwgYWRkQ250IC0gcmVtb3ZlQ250ICE9PSAw
OworCisgICAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSB7CisgICAgICAgIHJlbW92aW5nID0gbnVs
bDsKKyAgICAgIH0KKworICAgICAgaWYgKGFkZGluZyA9PT0gLTEpIHsKKyAgICAgICAgYWRkaW5n
ID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KHRo
aXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCBbdGhpcywgcmVtb3ZpbmcsIGFkZGluZ10pOworCisg
ICAgICBpZiAoaGFzRGVsdGEpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMu
cHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xlbmd0aCcpOworICAgICAgfQorCisgICAgICBfZW1i
ZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnW10nKTsKKwor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ29udmVydHMgdGhl
IGVudW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQgc29ydHMgYnkgdGhlIGtleXMKKyAgICAgIHNw
ZWNpZmllZCBpbiB0aGUgYXJndW1lbnQuCisgICAgICAgWW91IG1heSBwcm92aWRlIG11bHRpcGxl
IGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHByb3BlcnRpZXMuCisgICAgICAgQG1ldGhv
ZCBzb3J0QnkKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lKHMpIHRvIHNvcnQg
b24KKyAgICAgIEByZXR1cm4ge0FycmF5fSBUaGUgc29ydGVkIGFycmF5LgorICAgICAgQHNpbmNl
IDEuMi4wCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBzb3J0Qnk6IGZ1bmN0aW9uICgpIHsK
KyAgICAgIHZhciBzb3J0S2V5cyA9IGFyZ3VtZW50czsKKworICAgICAgcmV0dXJuIHRoaXMudG9B
cnJheSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBzb3J0S2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBrZXkgPSBzb3J0S2V5c1tp
XTsKKyAgICAgICAgICB2YXIgcHJvcEEgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYSwg
a2V5KTsKKyAgICAgICAgICB2YXIgcHJvcEIgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
Yiwga2V5KTsKKyAgICAgICAgICAvLyByZXR1cm4gMSBvciAtMSBlbHNlIGNvbnRpbnVlIHRvIHRo
ZSBuZXh0IHNvcnRLZXkKKyAgICAgICAgICB2YXIgY29tcGFyZVZhbHVlID0gX2VtYmVyUnVudGlt
ZUNvbXBhcmUuZGVmYXVsdChwcm9wQSwgcHJvcEIpOworCisgICAgICAgICAgaWYgKGNvbXBhcmVW
YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9KTsKKyAgICB9CisgIH0pOworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEVudW1lcmFibGU7Cit9KTsKKworLyoqCisgIFJldHVybnMgYSBu
ZXcgZW51bWVyYWJsZSB0aGF0IGNvbnRhaW5zIG9ubHkgaXRlbXMgY29udGFpbmluZyBhIHVuaXF1
ZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBh
biBhcnJheSByZWdhcmRsZXNzIG9mIHRoZSByZWNlaXZlciB0eXBlLgorICAgYGBgamF2YXNjcmlw
dAorICB2YXIgYXJyID0gW3sgdmFsdWU6ICdhJyB9LCB7IHZhbHVlOiAnYScgfSwgeyB2YWx1ZTog
J2InIH0sIHsgdmFsdWU6ICdiJyB9XTsKKyAgYXJyLnVuaXFCeSgndmFsdWUnKTsgIC8vIFt7IHZh
bHVlOiAnYScgfSwgeyB2YWx1ZTogJ2InIH1dCisgIGBgYAorICAgQG1ldGhvZCB1bmlxQnkKKyAg
QHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KKyAgQHB1YmxpYworKi8KK2VuaWZlZCgnZW1iZXIt
cnVudGltZS9taXhpbnMvZXZlbnRlZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9taXhpbics
ICdlbWJlci1tZXRhbC9ldmVudHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsTWl4
aW4sIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAvKioKKyAg
ICBUaGlzIG1peGluIGFsbG93cyBmb3IgRW1iZXIgb2JqZWN0cyB0byBzdWJzY3JpYmUgdG8gYW5k
IGVtaXQgZXZlbnRzLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQXBwLlBlcnNvbiA9IEVt
YmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgeworICAgICAgZ3JlZXQ6IGZ1bmN0aW9u
KCkgeworICAgICAgICAvLyAuLi4KKyAgICAgICAgdGhpcy50cmlnZ2VyKCdncmVldCcpOworICAg
ICAgfQorICAgIH0pOworICAKKyAgICB2YXIgcGVyc29uID0gQXBwLlBlcnNvbi5jcmVhdGUoKTsK
KyAgCisgICAgcGVyc29uLm9uKCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgICAgY29uc29sZS5s
b2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKKyAgICB9KTsKKyAgCisgICAgcGVyc29uLmdy
ZWV0KCk7CisgIAorICAgIC8vIG91dHB1dHM6ICdPdXIgcGVyc29uIGhhcyBncmVldGVkJworICAg
IGBgYAorICAKKyAgICBZb3UgY2FuIGFsc28gY2hhaW4gbXVsdGlwbGUgZXZlbnQgc3Vic2NyaXB0
aW9uczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHBlcnNvbi5vbignZ3JlZXQnLCBmdW5j
dGlvbigpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdPdXIgcGVyc29uIGhhcyBncmVldGVkJyk7Cisg
ICAgfSkub25lKCdncmVldCcsIGZ1bmN0aW9uKCkgeworICAgICAgY29uc29sZS5sb2coJ09mZmVy
IG9uZS10aW1lIHNwZWNpYWwnKTsKKyAgICB9KS5vZmYoJ2V2ZW50JywgdGhpcywgZm9yZ2V0VGhp
cyk7CisgICAgYGBgCisgIAorICAgIEBjbGFzcyBFdmVudGVkCisgICAgQG5hbWVzcGFjZSBFbWJl
cgorICAgIEBwdWJsaWMKKyAgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4
aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAgICBTdWJzY3JpYmVzIHRvIGEgbmFtZWQg
ZXZlbnQgd2l0aCBnaXZlbiBmdW5jdGlvbi4KKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgcGVy
c29uLm9uKCdkaWRMb2FkJywgZnVuY3Rpb24oKSB7CisgICAgICAgLy8gZmlyZWQgb25jZSB0aGUg
cGVyc29uIGhhcyBsb2FkZWQKKyAgICAgfSk7CisgICAgIGBgYAorICAgICAgQW4gb3B0aW9uYWwg
dGFyZ2V0IGNhbiBiZSBwYXNzZWQgaW4gYXMgdGhlIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwKKyAg
ICAgYmUgc2V0IGFzIHRoZSAidGhpcyIgZm9yIHRoZSBjYWxsYmFjay4gVGhpcyBpcyBhIGdvb2Qg
d2F5IHRvIGdpdmUgeW91cgorICAgICBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0cmln
Z2VyaW5nIHRoZSBldmVudC4gV2hlbiB0aGUgdGFyZ2V0CisgICAgIHBhcmFtZXRlciBpcyB1c2Vk
IHRoZSBjYWxsYmFjayBiZWNvbWVzIHRoZSB0aGlyZCBhcmd1bWVudC4KKyAgICAgIEBtZXRob2Qg
b24KKyAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CisgICAg
IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgInRoaXMiIGJpbmRpbmcgZm9yIHRoZSBjYWxs
YmFjaworICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1
dGUKKyAgICAgQHJldHVybiB0aGlzCisgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG9uOiBmdW5j
dGlvbiAobmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIF9lbWJlck1ldGFsRXZlbnRzLmFk
ZExpc3RlbmVyKHRoaXMsIG5hbWUsIHRhcmdldCwgbWV0aG9kKTsKKyAgICAgIHJldHVybiB0aGlz
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFN1YnNjcmliZXMgYSBmdW5jdGlvbiB0byBhIG5h
bWVkIGV2ZW50IGFuZCB0aGVuIGNhbmNlbHMgdGhlIHN1YnNjcmlwdGlvbgorICAgICAgYWZ0ZXIg
dGhlIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4gSXQgaXMgZ29vZCB0byB1c2Ug
YGBvbmVgYCB3aGVuCisgICAgICB5b3Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCB0aW1lIGFu
IGV2ZW50IGhhcyB0YWtlbiBwbGFjZS4KKyAgICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIG9w
dGlvbmFsIDJuZCBhcmd1bWVudCB0aGF0IHdpbGwgYmVjb21lIHRoZSAidGhpcyIKKyAgICAgIHZh
bHVlIGZvciB0aGUgY2FsbGJhY2suIElmIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIHRoZW4gdGhl
IDNyZCBhcmd1bWVudAorICAgICAgYmVjb21lcyB0aGUgZnVuY3Rpb24uCisgICAgICAgQG1ldGhv
ZCBvbmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudAor
ICAgICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAidGhpcyIgYmluZGluZyBmb3IgdGhl
IGNhbGxiYWNrCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgVGhlIGNhbGxiYWNrIHRv
IGV4ZWN1dGUKKyAgICAgIEByZXR1cm4gdGhpcworICAgICAgQHB1YmxpYworICAgICovCisgICAg
b25lOiBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIGlmICghbWV0aG9k
KSB7CisgICAgICAgIG1ldGhvZCA9IHRhcmdldDsKKyAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAg
ICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwg
dGFyZ2V0LCBtZXRob2QsIHRydWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgVHJpZ2dlcnMgYSBuYW1lZCBldmVudCBmb3IgdGhlIG9iamVjdC4gQW55IGFk
ZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICB3aWxsIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRv
IHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byB0aGUKKyAgICAgIGV2ZW50Lgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHBlcnNvbi5vbignZGlkRWF0JywgZnVuY3Rpb24o
Zm9vZCkgeworICAgICAgICBjb25zb2xlLmxvZygncGVyc29uIGF0ZSBzb21lICcgKyBmb29kKTsK
KyAgICAgIH0pOworICAgICAgIHBlcnNvbi50cmlnZ2VyKCdkaWRFYXQnLCAnYnJvY2NvbGknKTsK
KyAgICAgICAvLyBvdXRwdXRzOiBwZXJzb24gYXRlIHNvbWUgYnJvY2NvbGkKKyAgICAgIGBgYAor
ICAgICAgQG1ldGhvZCB0cmlnZ2VyCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFt
ZSBvZiB0aGUgZXZlbnQKKyAgICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlvbmFsIGFy
Z3VtZW50cyB0byBwYXNzIG9uCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0cmlnZ2VyOiBm
dW5jdGlvbiAobmFtZSkgeworICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgs
IGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwg
X2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXld
OworICAgICAgfQorCisgICAgICBfZW1iZXJNZXRhbEV2ZW50cy5zZW5kRXZlbnQodGhpcywgbmFt
ZSwgYXJncyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQ2FuY2VscyBzdWJzY3JpcHRpb24g
Zm9yIGdpdmVuIG5hbWUsIHRhcmdldCwgYW5kIG1ldGhvZC4KKyAgICAgICBAbWV0aG9kIG9mZgor
ICAgICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CisgICAgICBA
cGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHN1YnNjcmlwdGlvbgorICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBmdW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0
aW9uCisgICAgICBAcmV0dXJuIHRoaXMKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG9mZjog
ZnVuY3Rpb24gKG5hbWUsIHRhcmdldCwgbWV0aG9kKSB7CisgICAgICBfZW1iZXJNZXRhbEV2ZW50
cy5yZW1vdmVMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7CisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDaGVja3MgdG8gc2VlIGlmIG9iamVj
dCBoYXMgYW55IHN1YnNjcmlwdGlvbnMgZm9yIG5hbWVkIGV2ZW50LgorICAgICAgIEBtZXRob2Qg
aGFzCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQKKyAg
ICAgIEByZXR1cm4ge0Jvb2xlYW59IGRvZXMgdGhlIG9iamVjdCBoYXZlIGEgc3Vic2NyaXB0aW9u
IGZvciBldmVudAorICAgICAgQHB1YmxpYworICAgICAqLworICAgIGhhczogZnVuY3Rpb24gKG5h
bWUpIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbEV2ZW50cy5oYXNMaXN0ZW5lcnModGhpcywg
bmFtZSk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9m
cmVlemFibGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
bWl4aW4nLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X3NldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxN
aXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0KSB7
CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGUgYEVtYmVyLkZyZWV6YWJsZWAg
bWl4aW4gaW1wbGVtZW50cyBzb21lIGJhc2ljIG1ldGhvZHMgZm9yIG1hcmtpbmcgYW4KKyAgICBv
YmplY3QgYXMgZnJvemVuLiBPbmNlIGFuIG9iamVjdCBpcyBmcm96ZW4gaXQgc2hvdWxkIGJlIHJl
YWQgb25seS4gTm8gY2hhbmdlcworICAgIG1heSBiZSBtYWRlIHRoZSBpbnRlcm5hbCBzdGF0ZSBv
ZiB0aGUgb2JqZWN0LgorICAKKyAgICAjIyBFbmZvcmNlbWVudAorICAKKyAgICBUbyBmdWxseSBz
dXBwb3J0IGZyZWV6aW5nIGluIHlvdXIgc3ViY2xhc3MsIHlvdSBtdXN0IGluY2x1ZGUgdGhpcyBt
aXhpbiBhbmQKKyAgICBvdmVycmlkZSBhbnkgbWV0aG9kIHRoYXQgbWlnaHQgYWx0ZXIgYW55IHBy
b3BlcnR5IG9uIHRoZSBvYmplY3QgdG8gaW5zdGVhZAorICAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4g
WW91IGNhbiBjaGVjayB0aGUgc3RhdGUgb2YgYW4gb2JqZWN0IGJ5IGNoZWNraW5nIHRoZQorICAg
IGBpc0Zyb3plbmAgcHJvcGVydHkuCisgIAorICAgIEFsdGhvdWdoIGZ1dHVyZSB2ZXJzaW9ucyBv
ZiBKYXZhU2NyaXB0IG1heSBzdXBwb3J0IGxhbmd1YWdlLWxldmVsIGZyZWV6aW5nCisgICAgb2Jq
ZWN0IG9iamVjdHMsIHRoYXQgaXMgbm90IHRoZSBjYXNlIHRvZGF5LiBFdmVuIGlmIGFuIG9iamVj
dCBpcyBmcmVlemFibGUsCisgICAgaXQgaXMgc3RpbGwgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8g
bW9kaWZ5IHRoZSBvYmplY3QsIGV2ZW4gdGhvdWdoIGl0IGNvdWxkCisgICAgYnJlYWsgb3RoZXIg
cGFydHMgb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0IGRvIG5vdCBleHBlY3QgYSBmcm96ZW4gb2Jq
ZWN0IHRvCisgICAgY2hhbmdlLiBJdCBpcywgdGhlcmVmb3JlLCB2ZXJ5IGltcG9ydGFudCB0aGF0
IHlvdSBhbHdheXMgcmVzcGVjdCB0aGUKKyAgICBgaXNGcm96ZW5gIHByb3BlcnR5IG9uIGFsbCBm
cmVlemFibGUgb2JqZWN0cy4KKyAgCisgICAgIyMgRXhhbXBsZSBVc2FnZQorICAKKyAgICBUaGUg
ZXhhbXBsZSBiZWxvdyBzaG93cyBhIHNpbXBsZSBvYmplY3QgdGhhdCBpbXBsZW1lbnQgdGhlIGBF
bWJlci5GcmVlemFibGVgCisgICAgcHJvdG9jb2wuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBDb250YWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5GcmVlemFibGUsIHsKKyAgICAg
IGZpcnN0TmFtZTogbnVsbCwKKyAgICAgIGxhc3ROYW1lOiBudWxsLAorICAKKyAgICAgIC8vIHN3
YXBzIHRoZSBuYW1lcworICAgICAgc3dhcE5hbWVzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYg
KHRoaXMuZ2V0KCdpc0Zyb3plbicpKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7CisgICAgICAg
IHZhciB0bXAgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7CisgICAgICAgIHRoaXMuc2V0KCdmaXJz
dE5hbWUnLCB0aGlzLmdldCgnbGFzdE5hbWUnKSk7CisgICAgICAgIHRoaXMuc2V0KCdsYXN0TmFt
ZScsIHRtcCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAKKyAgICB9KTsKKyAg
CisgICAgYyA9IENvbnRhY3QuY3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIsIGxhc3ROYW1lOiAi
RG9lIiB9KTsKKyAgICBjLnN3YXBOYW1lcygpOyAgLy8gcmV0dXJucyBjCisgICAgYy5mcmVlemUo
KTsKKyAgICBjLnN3YXBOYW1lcygpOyAgLy8gRVhDRVBUSU9OCisgICAgYGBgCisgIAorICAgICMj
IENvcHlpbmcKKyAgCisgICAgVXN1YWxseSB0aGUgYEVtYmVyLkZyZWV6YWJsZWAgcHJvdG9jb2wg
aXMgaW1wbGVtZW50ZWQgaW4gY29vcGVyYXRpb24gd2l0aCB0aGUKKyAgICBgRW1iZXIuQ29weWFi
bGVgIHByb3RvY29sLCB3aGljaCBkZWZpbmVzIGEgYGZyb3plbkNvcHkoKWAgbWV0aG9kIHRoYXQg
d2lsbAorICAgIHJldHVybiBhIGZyb3plbiBvYmplY3QsIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50
cyB0aGlzIG1ldGhvZCBhcyB3ZWxsLgorICAKKyAgICBAY2xhc3MgRnJlZXphYmxlCisgICAgQG5h
bWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSBFbWJlciAwLjkKKyAgICBAZGVwcmVjYXRlZCBVc2Ug
YE9iamVjdC5mcmVlemVgIGluc3RlYWQuCisgICAgQHByaXZhdGUKKyAgKi8KKyAgdmFyIEZyZWV6
YWJsZSA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKworICAgIGluaXQ6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdgRW1iZXIuRnJlZXph
YmxlYCBpcyBkZXByZWNhdGVkLCB1c2UgYE9iamVjdC5mcmVlemVgIGluc3RlYWQuJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1ydW50aW1lLmZyZWV6YWJsZS1pbml0JywgdW50aWw6ICczLjAuMCcgfSk7
CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFNldCB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIGZyb3plbi4gVXNl
IHRoaXMgcHJvcGVydHkgdG8gZGV0ZWN0CisgICAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZy
b3plbiBvciBub3QuCisgICAgICAgQHByb3BlcnR5IGlzRnJvemVuCisgICAgICBAdHlwZSBCb29s
ZWFuCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgaXNGcm96ZW46IGZhbHNlLAorCisgICAg
LyoqCisgICAgICBGcmVlemVzIHRoZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4g
Y2FsbGVkIHRoZSBvYmplY3Qgc2hvdWxkCisgICAgICBubyBsb25nZXIgYWxsb3cgYW55IHByb3Bl
cnRpZXMgdG8gYmUgZWRpdGVkLgorICAgICAgIEBtZXRob2QgZnJlZXplCisgICAgICBAcmV0dXJu
IHtPYmplY3R9IHJlY2VpdmVyCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZnJlZXplOiBm
dW5jdGlvbiAoKSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMs
ICdpc0Zyb3plbicpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywgJ2lzRnJvemVuJywgdHJ1ZSk7CisgICAg
ICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgfSk7CisKKyAgZXhwb3J0cy5GcmVlemFibGUgPSBG
cmVlemFibGU7CisgIHZhciBGUk9aRU5fRVJST1IgPSAnRnJvemVuIG9iamVjdCBjYW5ub3QgYmUg
bW9kaWZpZWQuJzsKKyAgZXhwb3J0cy5GUk9aRU5fRVJST1IgPSBGUk9aRU5fRVJST1I7Cit9KTsK
K2VuaWZlZCgnZW1iZXItcnVudGltZS9taXhpbnMvbXV0YWJsZV9hcnJheScsIFsnZXhwb3J0cycs
ICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXIt
bWV0YWwvbWl4aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvYXJyYXknLCAnZW1iZXItcnVudGlt
ZS9taXhpbnMvbXV0YWJsZV9lbnVtZXJhYmxlJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2VudW1l
cmFibGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1i
ZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXks
IF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2VudW1lcmFibGUsIF9lbWJlclJ1bnRpbWVNaXhp
bnNFbnVtZXJhYmxlKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQorICAqLworCisgIC8vIHJlcXVpcmUoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2Fy
cmF5Jyk7CisgIC8vIHJlcXVpcmUoJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL211dGFibGVfZW51bWVy
YWJsZScpOworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gQ09OU1RBTlRTCisgIC8vCisKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIHZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gJ0luZGV4IG91dCBvZiByYW5nZSc7
CisgIHZhciBFTVBUWSA9IFtdOworCisgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgLy8gSEVMUEVSUworICAvLworCisgIC8q
KgorICAgIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlpbmcgYXJyYXktbGlr
ZSBvYmplY3RzLiBUaGVzZSBtZXRob2RzCisgICAgY2FuIGJlIGFwcGxpZWQgb25seSB0byBhIGNv
bGxlY3Rpb24gdGhhdCBrZWVwcyBpdHMgaXRlbXMgaW4gYW4gb3JkZXJlZCBzZXQuCisgICAgSXQg
YnVpbGRzIHVwb24gdGhlIEFycmF5IG1peGluIGFuZCBhZGRzIG1ldGhvZHMgdG8gbW9kaWZ5IHRo
ZSBhcnJheS4KKyAgICBPbmUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3Mg
aW5jbHVkZSBBcnJheVByb3h5LgorICAKKyAgICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBt
ZXRob2RzIGluIHRoaXMgY2xhc3MgdG8gbW9kaWZ5IGFycmF5cyBzbyB0aGF0CisgICAgY2hhbmdl
cyBhcmUgb2JzZXJ2YWJsZS4gVGhpcyBhbGxvd3MgdGhlIGJpbmRpbmcgc3lzdGVtIGluIEVtYmVy
IHRvIGZ1bmN0aW9uCisgICAgY29ycmVjdGx5LgorICAKKyAgCisgICAgTm90ZSB0aGF0IGFuIEFy
cmF5IGNhbiBjaGFuZ2UgZXZlbiBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhpbi4K
KyAgICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IGltcGxlbWVudCBhIFNwYXJzZUFycmF5IHRoYXQg
Y2Fubm90IGJlIGRpcmVjdGx5CisgICAgbW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWluZyBl
bnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCisgIAorICAgIEBjbGFzcyBN
dXRhYmxlQXJyYXkKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuQXJyYXkK
KyAgICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoX2VtYmVyUnVu
dGltZU1peGluc0FycmF5LmRlZmF1bHQsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2VudW1l
cmFibGUuZGVmYXVsdCwgeworCisgICAgLyoqCisgICAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0
IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorICAgICAgIFRoaXMg
aXMgb25lIG9mIHRoZSBwcmltaXRpdmVzIHlvdSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0IGBF
bWJlci5BcnJheWAuCisgICAgICBZb3Ugc2hvdWxkIHJlcGxhY2UgYW10IG9iamVjdHMgc3RhcnRl
ZCBhdCBpZHggd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUKKyAgICAgIHBhc3NlZCBhcnJheS4gWW91
IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAKKyAg
ICAgICBAbWV0aG9kIHJlcGxhY2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggU3RhcnRpbmcg
aW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElmCisgICAgICAgIGlkeCA+PSBsZW5ndGgs
IHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgICAgQHBhcmFtIHtOdW1i
ZXJ9IGFtdCBOdW1iZXIgb2YgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tCisg
ICAgICAgIHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCouCisgICAgICBAcGFyYW0ge0FycmF5
fSBvYmplY3RzIEFuIGFycmF5IG9mIHplcm8gb3IgbW9yZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJl
CisgICAgICAgIGluc2VydGVkIGludG8gdGhlIGFycmF5IGF0ICppZHgqCisgICAgICBAcHVibGlj
CisgICAgKi8KKyAgICByZXBsYWNlOiBudWxsLAorCisgICAgLyoqCisgICAgICBSZW1vdmUgYWxs
IGVsZW1lbnRzIGZyb20gdGhlIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKKyAgICAgIHdh
bnQgdG8gcmV1c2UgYW4gZXhpc3RpbmcgYXJyYXkgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUg
aXQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJywgJ2dy
ZWVuJywgJ2JsdWUnXTsKKyAgICAgICBjb2xvci5sZW5ndGgoKTsgICAvLyAgMworICAgICAgY29s
b3JzLmNsZWFyKCk7ICAgLy8gIFtdCisgICAgICBjb2xvcnMubGVuZ3RoKCk7ICAvLyAgMAorICAg
ICAgYGBgCisgICAgICAgQG1ldGhvZCBjbGVhcgorICAgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9
IEFuIGVtcHR5IEFycmF5LgorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2xlYXI6IGZ1bmN0
aW9uICgpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ2xlbmd0aCcpOworICAgICAgaWYgKGxlbiA9PT0gMCkgeworICAgICAgICByZXR1cm4gdGhp
czsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgRU1QVFkpOworICAgICAg
cmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhpcyB3aWxsIHVzZSB0aGUg
cHJpbWl0aXZlIGByZXBsYWNlKClgIG1ldGhvZCB0byBpbnNlcnQgYW4gb2JqZWN0IGF0IHRoZQor
ICAgICAgc3BlY2lmaWVkIGluZGV4LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBj
b2xvcnMgPSBbJ3JlZCcsICdncmVlbicsICdibHVlJ107CisgICAgICAgY29sb3JzLmluc2VydEF0
KDIsICd5ZWxsb3cnKTsgIC8vIFsncmVkJywgJ2dyZWVuJywgJ3llbGxvdycsICdibHVlJ10KKyAg
ICAgIGNvbG9ycy5pbnNlcnRBdCg1LCAnb3JhbmdlJyk7ICAvLyBFcnJvcjogSW5kZXggb3V0IG9m
IHJhbmdlCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGluc2VydEF0CisgICAgICBAcGFyYW0g
e051bWJlcn0gaWR4IGluZGV4IG9mIGluc2VydCB0aGUgb2JqZWN0IGF0LgorICAgICAgQHBhcmFt
IHtPYmplY3R9IG9iamVjdCBvYmplY3QgdG8gaW5zZXJ0CisgICAgICBAcmV0dXJuIHtFbWJlci5B
cnJheX0gcmVjZWl2ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGluc2VydEF0OiBmdW5j
dGlvbiAoaWR4LCBvYmplY3QpIHsKKyAgICAgIGlmIChpZHggPiBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7CisgICAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRh
bEVycm9yLmRlZmF1bHQoT1VUX09GX1JBTkdFX0VYQ0VQVElPTik7CisgICAgICB9CisKKyAgICAg
IHRoaXMucmVwbGFjZShpZHgsIDAsIFtvYmplY3RdKTsKKyAgICAgIHJldHVybiB0aGlzOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJlbW92ZSBhbiBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBp
bmRleCB1c2luZyB0aGUgYHJlcGxhY2UoKWAgcHJpbWl0aXZlCisgICAgICBtZXRob2QuIFlvdSBj
YW4gcGFzcyBlaXRoZXIgYSBzaW5nbGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgor
ICAgICAgIElmIHlvdSBwYXNzIGEgc3RhcnQgYW5kIGxlbmd0aCB0aGF0IGlzIGJleW9uZCB0aGUK
KyAgICAgIGxlbmd0aCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGBPVVRfT0ZfUkFOR0VfRVhD
RVBUSU9OYC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQn
LCAnZ3JlZW4nLCAnYmx1ZScsICd5ZWxsb3cnLCAnb3JhbmdlJ107CisgICAgICAgY29sb3JzLnJl
bW92ZUF0KDApOyAgICAgLy8gWydncmVlbicsICdibHVlJywgJ3llbGxvdycsICdvcmFuZ2UnXQor
ICAgICAgY29sb3JzLnJlbW92ZUF0KDIsIDIpOyAgLy8gWydncmVlbicsICdibHVlJ10KKyAgICAg
IGNvbG9ycy5yZW1vdmVBdCg0LCAyKTsgIC8vIEVycm9yOiBJbmRleCBvdXQgb2YgcmFuZ2UKKyAg
ICAgIGBgYAorICAgICAgIEBtZXRob2QgcmVtb3ZlQXQKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBz
dGFydCBpbmRleCwgc3RhcnQgb2YgcmFuZ2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBsZW4gbGVu
Z3RoIG9mIHBhc3NpbmcgcmFuZ2UKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgorICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChzdGFydCwg
bGVuKSB7CisgICAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkgeworICAgICAgICBp
ZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlz
LCAnbGVuZ3RoJykpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZh
dWx0KE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmFz
dCBjYXNlCisgICAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGxlbiA9
IDE7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlcGxhY2Uoc3RhcnQsIGxlbiwgRU1QVFkp
OworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBQdXNoIHRoZSBvYmplY3Qgb250byB0aGUgZW5kIG9mIHRoZSBhcnJheS4gV29ya3MganVzdCBs
aWtlIGBwdXNoKClgIGJ1dCBpdAorICAgICAgaXMgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQnLCAnZ3JlZW4nXTsKKyAgICAgICBj
b2xvcnMucHVzaE9iamVjdCgnYmxhY2snKTsgICAgIC8vIFsncmVkJywgJ2dyZWVuJywgJ2JsYWNr
J10KKyAgICAgIGNvbG9ycy5wdXNoT2JqZWN0KFsneWVsbG93J10pOyAgLy8gWydyZWQnLCAnZ3Jl
ZW4nLCBbJ3llbGxvdyddXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwdXNoT2JqZWN0Cisg
ICAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gcHVzaAorICAgICAgQHJldHVybiBvYmplY3Qg
c2FtZSBvYmplY3QgcGFzc2VkIGFzIGEgcGFyYW0KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAg
IHB1c2hPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgIHRoaXMuaW5zZXJ0QXQoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSwgb2JqKTsKKyAgICAgIHJldHVy
biBvYmo7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWRkIHRoZSBvYmplY3RzIGluIHRoZSBw
YXNzZWQgbnVtZXJhYmxlIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBEZWZlcnMKKyAgICAgIG5v
dGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRk
ZWQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJ107Cisg
ICAgICAgY29sb3JzLnB1c2hPYmplY3RzKFsneWVsbG93JywgJ29yYW5nZSddKTsgIC8vIFsncmVk
JywgJ3llbGxvdycsICdvcmFuZ2UnXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwdXNoT2Jq
ZWN0cworICAgICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBvYmplY3Rz
IHRvIGFkZAorICAgICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCisgICAgICBAcHVi
bGljCisgICAgKi8KKyAgICBwdXNoT2JqZWN0czogZnVuY3Rpb24gKG9iamVjdHMpIHsKKyAgICAg
IGlmICghKF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQuZGV0ZWN0KG9iamVj
dHMpIHx8IEFycmF5LmlzQXJyYXkob2JqZWN0cykpKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBl
RXJyb3IoJ011c3QgcGFzcyBFbWJlci5FbnVtZXJhYmxlIHRvIEVtYmVyLk11dGFibGVBcnJheSNw
dXNoT2JqZWN0cycpOworICAgICAgfQorICAgICAgdGhpcy5yZXBsYWNlKF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOworICAgICAgcmV0dXJu
IHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUG9wIG9iamVjdCBmcm9tIGFycmF5IG9y
IG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0IGxpa2UgYHBvcCgpYCBidXQKKyAgICAg
IGl0IGlzIEtWTy1jb21wbGlhbnQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNv
bG9ycyA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXTsKKyAgICAgICBjb2xvcnMucG9wT2JqZWN0
KCk7ICAgLy8gJ2JsdWUnCisgICAgICBjb25zb2xlLmxvZyhjb2xvcnMpOyAgLy8gWydyZWQnLCAn
Z3JlZW4nXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBwb3BPYmplY3QKKyAgICAgIEByZXR1
cm4gb2JqZWN0CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBwb3BPYmplY3Q6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciBsZW4gPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J2xlbmd0aCcpOworICAgICAgaWYgKGxlbiA9PT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgIH0KKworICAgICAgdmFyIHJldCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5vYmpl
Y3RBdCh0aGlzLCBsZW4gLSAxKTsKKyAgICAgIHRoaXMucmVtb3ZlQXQobGVuIC0gMSwgMSk7Cisg
ICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNoaWZ0IGFuIG9iamVj
dCBmcm9tIHN0YXJ0IG9mIGFycmF5IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0
CisgICAgICBsaWtlIGBzaGlmdCgpYCBidXQgaXQgaXMgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29sb3JzID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSdd
OworICAgICAgIGNvbG9ycy5zaGlmdE9iamVjdCgpOyAgLy8gJ3JlZCcKKyAgICAgIGNvbnNvbGUu
bG9nKGNvbG9ycyk7ICAgLy8gWydncmVlbicsICdibHVlJ10KKyAgICAgIGBgYAorICAgICAgIEBt
ZXRob2Qgc2hpZnRPYmplY3QKKyAgICAgIEByZXR1cm4gb2JqZWN0CisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzaGlmdE9iamVjdDogZnVuY3Rpb24gKCkgeworICAgICAgaWYgKF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJykgPT09IDApIHsKKyAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciByZXQgPSBfZW1iZXJSdW50aW1lTWl4aW5z
QXJyYXkub2JqZWN0QXQodGhpcywgMCk7CisgICAgICB0aGlzLnJlbW92ZUF0KDApOworICAgICAg
cmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBVbnNoaWZ0IGFuIG9iamVjdCB0
byBzdGFydCBvZiBhcnJheS4gV29ya3MganVzdCBsaWtlIGB1bnNoaWZ0KClgIGJ1dCBpdCBpcwor
ICAgICAgS1ZPLWNvbXBsaWFudC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgY29s
b3JzID0gWydyZWQnXTsKKyAgICAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgneWVsbG93Jyk7ICAg
IC8vIFsneWVsbG93JywgJ3JlZCddCisgICAgICBjb2xvcnMudW5zaGlmdE9iamVjdChbJ2JsYWNr
J10pOyAgIC8vIFtbJ2JsYWNrJ10sICd5ZWxsb3cnLCAncmVkJ10KKyAgICAgIGBgYAorICAgICAg
IEBtZXRob2QgdW5zaGlmdE9iamVjdAorICAgICAgQHBhcmFtIHsqfSBvYmogb2JqZWN0IHRvIHVu
c2hpZnQKKyAgICAgIEByZXR1cm4gb2JqZWN0IHNhbWUgb2JqZWN0IHBhc3NlZCBhcyBhIHBhcmFt
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB1bnNoaWZ0T2JqZWN0OiBmdW5jdGlvbiAob2Jq
KSB7CisgICAgICB0aGlzLmluc2VydEF0KDAsIG9iaik7CisgICAgICByZXR1cm4gb2JqOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEFkZHMgdGhlIG5hbWVkIG9iamVjdHMgdG8gdGhlIGJlZ2lu
bmluZyBvZiB0aGUgYXJyYXkuIERlZmVycyBub3RpZnlpbmcKKyAgICAgIG9ic2VydmVycyB1bnRp
bCBhbGwgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgdmFyIGNvbG9ycyA9IFsncmVkJ107CisgICAgICAgY29sb3JzLnVuc2hpZnRPYmplY3RzKFsn
YmxhY2snLCAnd2hpdGUnXSk7ICAgLy8gWydibGFjaycsICd3aGl0ZScsICdyZWQnXQorICAgICAg
Y29sb3JzLnVuc2hpZnRPYmplY3RzKCd5ZWxsb3cnKTsgLy8gVHlwZSBFcnJvcjogJ3VuZGVmaW5l
ZCcgaXMgbm90IGEgZnVuY3Rpb24KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgdW5zaGlmdE9i
amVjdHMKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0
cyB0byBhZGQKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1
YmxpYworICAgICovCisgICAgdW5zaGlmdE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7Cisg
ICAgICB0aGlzLnJlcGxhY2UoMCwgMCwgb2JqZWN0cyk7CisgICAgICByZXR1cm4gdGhpczsKKyAg
ICB9LAorCisgICAgLyoqCisgICAgICBSZXZlcnNlIG9iamVjdHMgaW4gdGhlIGFycmF5LiBXb3Jr
cyBqdXN0IGxpa2UgYHJldmVyc2UoKWAgYnV0IGl0IGlzCisgICAgICBLVk8tY29tcGxpYW50Lgor
ICAgICAgIEBtZXRob2QgcmV2ZXJzZU9iamVjdHMKKyAgICAgIEByZXR1cm4ge0VtYmVyLkFycmF5
fSByZWNlaXZlcgorICAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJldmVyc2VPYmplY3RzOiBm
dW5jdGlvbiAoKSB7CisgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0
KHRoaXMsICdsZW5ndGgnKTsKKyAgICAgIGlmIChsZW4gPT09IDApIHsKKyAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgICB9CisKKyAgICAgIHZhciBvYmplY3RzID0gdGhpcy50b0FycmF5KCkucmV2
ZXJzZSgpOworICAgICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7CisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBSZXBsYWNlIGFsbCB0aGUgcmVjZWl2
ZXIncyBjb250ZW50IHdpdGggY29udGVudCBvZiB0aGUgYXJndW1lbnQuCisgICAgICBJZiBhcmd1
bWVudCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3aWxsIGJlIGNsZWFyZWQuCisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNvbG9ycyA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUn
XTsKKyAgICAgICBjb2xvcnMuc2V0T2JqZWN0cyhbJ2JsYWNrJywgJ3doaXRlJ10pOyAgLy8gWydi
bGFjaycsICd3aGl0ZSddCisgICAgICBjb2xvcnMuc2V0T2JqZWN0cyhbXSk7ICAgICAgICAgICAg
ICAgICAgLy8gW10KKyAgICAgIGBgYAorICAgICAgIEBtZXRob2Qgc2V0T2JqZWN0cworICAgICAg
QHBhcmFtIHtFbWJlci5BcnJheX0gb2JqZWN0cyBhcnJheSB3aG9zZSBjb250ZW50IHdpbGwgYmUg
dXNlZCBmb3IgcmVwbGFjaW5nCisgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVy
CisgICAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIgd2l0aCB0aGUgbmV3IGNvbnRl
bnQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNldE9iamVjdHM6IGZ1bmN0aW9uIChvYmpl
Y3RzKSB7CisgICAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMuY2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnbGVuZ3RoJyk7CisgICAgICB0aGlzLnJlcGxhY2UoMCwgbGVu
LCBvYmplY3RzKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAg
Ly8gSU1QTEVNRU5UIEVtYmVyLk11dGFibGVFbnVtZXJhYmxlCisgICAgLy8KKworICAgIC8qKgor
ICAgICAgUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiBhbiBvYmplY3QgaW4gdGhlIGFycmF5Lgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBjaXRpZXMgPSBbJ0NoaWNhZ28nLCAnQmVy
bGluJywgJ0xpbWEnLCAnQ2hpY2FnbyddOworICAgICAgIGNpdGllcy5yZW1vdmVPYmplY3QoJ0No
aWNhZ28nKTsgIC8vIFsnQmVybGluJywgJ0xpbWEnXQorICAgICAgY2l0aWVzLnJlbW92ZU9iamVj
dCgnTGltYScpOyAgICAgLy8gWydCZXJsaW4nXQorICAgICAgY2l0aWVzLnJlbW92ZU9iamVjdCgn
VG9reW8nKSAgICAgLy8gWydCZXJsaW4nXQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCByZW1v
dmVPYmplY3QKKyAgICAgIEBwYXJhbSB7Kn0gb2JqIG9iamVjdCB0byByZW1vdmUKKyAgICAgIEBy
ZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAg
cmVtb3ZlT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CisgICAgICB2YXIgbG9jID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsZW5ndGgnKSB8fCAwOworICAgICAgd2hpbGUgKC0t
bG9jID49IDApIHsKKyAgICAgICAgdmFyIGN1ck9iamVjdCA9IF9lbWJlclJ1bnRpbWVNaXhpbnNB
cnJheS5vYmplY3RBdCh0aGlzLCBsb2MpOworCisgICAgICAgIGlmIChjdXJPYmplY3QgPT09IG9i
aikgeworICAgICAgICAgIHRoaXMucmVtb3ZlQXQobG9jKTsKKyAgICAgICAgfQorICAgICAgfQor
ICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUHVzaCB0aGUgb2Jq
ZWN0IG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgaWYgaXQgaXMgbm90IGFscmVhZHkKKyAgICAg
IHByZXNlbnQgaW4gdGhlIGFycmF5LgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBj
aXRpZXMgPSBbJ0NoaWNhZ28nLCAnQmVybGluJ107CisgICAgICAgY2l0aWVzLmFkZE9iamVjdCgn
TGltYScpOyAgICAvLyBbJ0NoaWNhZ28nLCAnQmVybGluJywgJ0xpbWEnXQorICAgICAgY2l0aWVz
LmFkZE9iamVjdCgnQmVybGluJyk7ICAvLyBbJ0NoaWNhZ28nLCAnQmVybGluJywgJ0xpbWEnXQor
ICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBhZGRPYmplY3QKKyAgICAgIEBwYXJhbSB7Kn0gb2Jq
IG9iamVjdCB0byBhZGQsIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLkFycmF5fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JqZWN0
OiBmdW5jdGlvbiAob2JqKSB7CisgICAgICBpZiAoIXRoaXMuY29udGFpbnMob2JqKSkgeworICAg
ICAgICB0aGlzLnB1c2hPYmplY3Qob2JqKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7
CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxl
X2VudW1lcmFibGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJs
ZScsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLCBfZW1iZXJN
ZXRhbE1peGluLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cykgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCisg
ICovCisKKyAgLyoqCisgICAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWlu
ZyBnZW5lcmljIGVudW1lcmFibGVzLiBUaGVzZSBtZXRob2RzCisgICAgY2FuIGJlIGFwcGxpZWQg
dG8gYW4gb2JqZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBvcmRlcmVkIG9yCisgICAg
dW5vcmRlcmVkLgorICAKKyAgICBOb3RlIHRoYXQgYW4gRW51bWVyYWJsZSBjYW4gY2hhbmdlIGV2
ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCisgICAgRm9yIGV4YW1wbGUs
IGEgTWFwcGVkRW51bWVyYWJsZSBjYW5ub3QgYmUgZGlyZWN0bHkgbW9kaWZpZWQgYnV0IGlmIGl0
cworICAgIHVuZGVybHlpbmcgZW51bWVyYWJsZSBjaGFuZ2VzLCBpdCB3aWxsIGNoYW5nZSBhbHNv
LgorICAKKyAgICAjIyBBZGRpbmcgT2JqZWN0cworICAKKyAgICBUbyBhZGQgYW4gb2JqZWN0IHRv
IGFuIGVudW1lcmFibGUsIHVzZSB0aGUgYGFkZE9iamVjdCgpYCBtZXRob2QuIFRoaXMKKyAgICBt
ZXRob2Qgd2lsbCBvbmx5IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJhYmxlIGlmIHRoZSBv
YmplY3QgaXMgbm90CisgICAgYWxyZWFkeSBwcmVzZW50IGFuZCBpcyBvZiBhIHR5cGUgc3VwcG9y
dGVkIGJ5IHRoZSBlbnVtZXJhYmxlLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgc2V0LmFk
ZE9iamVjdChjb250YWN0KTsKKyAgICBgYGAKKyAgCisgICAgIyMgUmVtb3ZpbmcgT2JqZWN0cwor
ICAKKyAgICBUbyByZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBg
cmVtb3ZlT2JqZWN0KClgIG1ldGhvZC4gVGhpcworICAgIHdpbGwgb25seSByZW1vdmUgdGhlIG9i
amVjdCBpZiBpdCBpcyBwcmVzZW50IGluIHRoZSBlbnVtZXJhYmxlLCBvdGhlcndpc2UKKyAgICB0
aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgc2V0
LnJlbW92ZU9iamVjdChjb250YWN0KTsKKyAgICBgYGAKKyAgCisgICAgIyMgSW1wbGVtZW50aW5n
IEluIFlvdXIgT3duIENvZGUKKyAgCisgICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2Jq
ZWN0IGFuZCB3YW50IHRvIHN1cHBvcnQgdGhpcyBBUEksIGp1c3QgaW5jbHVkZQorICAgIHRoaXMg
bWl4aW4gaW4geW91ciBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2RzLiBJ
biB5b3VyIHVuaXQKKyAgICB0ZXN0cywgYmUgc3VyZSB0byBhcHBseSB0aGUgRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KKyAgCisgICAgQGNsYXNzIE11dGFibGVF
bnVtZXJhYmxlCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEB1c2VzIEVtYmVyLkVudW1lcmFi
bGUKKyAgICBAcHVibGljCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4
aW4uTWl4aW4uY3JlYXRlKF9lbWJlclJ1bnRpbWVNaXhpbnNFbnVtZXJhYmxlLmRlZmF1bHQsIHsK
KworICAgIC8qKgorICAgICAgX19SZXF1aXJlZC5fXyBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBt
ZXRob2QgdG8gYXBwbHkgdGhpcyBtaXhpbi4KKyAgICAgICBBdHRlbXB0cyB0byBhZGQgdGhlIHBh
c3NlZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgbm90CisgICAgICBh
bHJlYWR5IHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMgcHJlc2Vu
dCwgdGhpcyBtZXRob2QKKyAgICAgIGhhcyBubyBlZmZlY3QuCisgICAgICAgSWYgdGhlIHBhc3Nl
ZCBvYmplY3QgaXMgb2YgYSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlY2VpdmVyLAorICAg
ICAgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgIEBt
ZXRob2QgYWRkT2JqZWN0CisgICAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3Qg
dG8gYWRkIHRvIHRoZSBlbnVtZXJhYmxlLgorICAgICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFz
c2VkIG9iamVjdAorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JqZWN0OiBudWxsLAor
CisgICAgLyoqCisgICAgICBBZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJs
ZSB0byB0aGUgcmVjZWl2ZXIuCisgICAgICAgQG1ldGhvZCBhZGRPYmplY3RzCisgICAgICBAcGFy
YW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgorICAgICAg
QHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRk
T2JqZWN0czogZnVuY3Rpb24gKG9iamVjdHMpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisK
KyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRo
aXMpOworICAgICAgb2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgcmV0
dXJuIF90aGlzLmFkZE9iamVjdChvYmopOworICAgICAgfSk7CisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X2V2ZW50cy5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyk7CisgICAgICByZXR1cm4gdGhp
czsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBfX1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxl
bWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1peGluLgorICAgICAgIEF0dGVtcHRzIHRv
IHJlbW92ZSB0aGUgcGFzc2VkIG9iamVjdCBmcm9tIHRoZSByZWNlaXZlciBjb2xsZWN0aW9uIGlm
IHRoZQorICAgICAgb2JqZWN0IGlzIHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBv
YmplY3QgaXMgbm90IHByZXNlbnQsCisgICAgICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0Lgor
ICAgICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5
IHRoZSByZWNlaXZlciwKKyAgICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4
Y2VwdGlvbi4KKyAgICAgICBAbWV0aG9kIHJlbW92ZU9iamVjdAorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnVtZXJhYmxlLgorICAg
ICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIG9iamVjdAorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgcmVtb3ZlT2JqZWN0OiBudWxsLAorCisgICAgLyoqCisgICAgICBSZW1vdmVzIGVh
Y2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSBmcm9tIHRoZSByZWNlaXZlci4KKyAg
ICAgICBAbWV0aG9kIHJlbW92ZU9iamVjdHMKKyAgICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJs
ZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byByZW1vdmUKKyAgICAgIEByZXR1cm4ge09iamVjdH0g
cmVjZWl2ZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlbW92ZU9iamVjdHM6IGZ1bmN0
aW9uIChvYmplY3RzKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5iZWdpblBy
b3BlcnR5Q2hhbmdlcyh0aGlzKTsKKyAgICAgIGZvciAodmFyIGkgPSBvYmplY3RzLmxlbmd0aCAt
IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHRoaXMucmVtb3ZlT2JqZWN0KG9iamVjdHNbaV0p
OworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMuZW5kUHJvcGVydHlD
aGFuZ2VzKHRoaXMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICB9KTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL21peGlucy9vYnNlcnZhYmxlJywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvZ2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwv
c2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItbWV0YWwvZXZlbnRz
JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2ZW50cycsICdlbWJlci1tZXRhbC9vYnNlcnZlcics
ICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9pc19ub25lJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9zZXQsIF9lbWJlck1ldGFsR2V0X3Byb3BlcnRpZXMsIF9lbWJlck1l
dGFsU2V0X3Byb3BlcnRpZXMsIF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsRXZlbnRzLCBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cywgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVyTWV0
YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxJc19ub25lKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVy
CisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvKioKKyAgICAjIyBPdmVydmlldworICAKKyAgICBUaGlzIG1peGluIHByb3ZpZGVzIHByb3Bl
cnRpZXMgYW5kIHByb3BlcnR5IG9ic2VydmluZyBmdW5jdGlvbmFsaXR5LCBjb3JlCisgICAgZmVh
dHVyZXMgb2YgdGhlIEVtYmVyIG9iamVjdCBtb2RlbC4KKyAgCisgICAgUHJvcGVydGllcyBhbmQg
b2JzZXJ2ZXJzIGFsbG93IG9uZSBvYmplY3QgdG8gb2JzZXJ2ZSBjaGFuZ2VzIHRvIGEKKyAgICBw
cm9wZXJ0eSBvbiBhbm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFs
IHdheXMgdGhhdAorICAgIG1vZGVscywgY29udHJvbGxlcnMgYW5kIHZpZXdzIGNvbW11bmljYXRl
IHdpdGggZWFjaCBvdGhlciBpbiBhbiBFbWJlcgorICAgIGFwcGxpY2F0aW9uLgorICAKKyAgICBB
bnkgb2JqZWN0IHRoYXQgaGFzIHRoaXMgbWl4aW4gYXBwbGllZCBjYW4gYmUgdXNlZCBpbiBvYnNl
cnZlcgorICAgIG9wZXJhdGlvbnMuIFRoYXQgaW5jbHVkZXMgYEVtYmVyLk9iamVjdGAgYW5kIG1v
c3Qgb2JqZWN0cyB5b3Ugd2lsbAorICAgIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIg
RW1iZXIgYXBwbGljYXRpb24uCisgIAorICAgIE5vdGUgdGhhdCB5b3Ugd2lsbCBub3QgZ2VuZXJh
bGx5IGFwcGx5IHRoaXMgbWl4aW4gdG8gY2xhc3NlcyB5b3Vyc2VsZiwKKyAgICBidXQgeW91IHdp
bGwgdXNlIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBz
byBpdAorICAgIGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyB0byB1c2UgaXQuCisgIAor
ICAgICMjIFVzaW5nIGBnZXQoKWAgYW5kIGBzZXQoKWAKKyAgCisgICAgQmVjYXVzZSBvZiBFbWJl
cidzIHN1cHBvcnQgZm9yIGJpbmRpbmdzIGFuZCBvYnNlcnZlcnMsIHlvdSB3aWxsIGFsd2F5cwor
ICAgIGFjY2VzcyBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCBhbmQgc2V0IHByb3Bl
cnRpZXMgdXNpbmcgdGhlCisgICAgc2V0IG1ldGhvZC4gVGhpcyBhbGxvd3MgdGhlIG9ic2Vydmlu
ZyBvYmplY3RzIHRvIGJlIG5vdGlmaWVkIGFuZAorICAgIGNvbXB1dGVkIHByb3BlcnRpZXMgdG8g
YmUgaGFuZGxlZCBwcm9wZXJseS4KKyAgCisgICAgTW9yZSBkb2N1bWVudGF0aW9uIGFib3V0IGBn
ZXRgIGFuZCBgc2V0YCBhcmUgYmVsb3cuCisgIAorICAgICMjIE9ic2VydmluZyBQcm9wZXJ0eSBD
aGFuZ2VzCisgIAorICAgIFlvdSB0eXBpY2FsbHkgb2JzZXJ2ZSBwcm9wZXJ0eSBjaGFuZ2VzIHNp
bXBseSBieSB1c2luZyB0aGUgYEVtYmVyLm9ic2VydmVyYAorICAgIGZ1bmN0aW9uIGluIGNsYXNz
ZXMgdGhhdCB5b3Ugd3JpdGUuCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZh
c2NyaXB0CisgICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICB2YWx1ZU9ic2VydmVyOiBF
bWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIHJldikg
eworICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFu
Z2VzCisgICAgICAgIC8vIFNlZSB0aGUgYWRkT2JzZXJ2ZXIgbWV0aG9kIGZvciBtb3JlIGluZm9y
bWF0aW9uIGFib3V0IHRoZSBjYWxsYmFjayBhcmd1bWVudHMKKyAgICAgIH0pCisgICAgfSk7Cisg
ICAgYGBgCisgIAorICAgIEFsdGhvdWdoIHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHdheSB0byBh
ZGQgYW4gb2JzZXJ2ZXIsIHRoaXMgY2FwYWJpbGl0eQorICAgIGlzIGFjdHVhbGx5IGJ1aWx0IGlu
dG8gdGhlIGBFbWJlci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0d28gbWV0aG9kcworICAgIGRl
ZmluZWQgaW4gdGhpcyBtaXhpbjogYGFkZE9ic2VydmVyYCBhbmQgYHJlbW92ZU9ic2VydmVyYC4g
WW91IGNhbiB1c2UKKyAgICB0aGVzZSB0d28gbWV0aG9kcyB0byBhZGQgYW5kIHJlbW92ZSBvYnNl
cnZlcnMgeW91cnNlbGYgaWYgeW91IG5lZWQgdG8KKyAgICBkbyBzbyBhdCBydW50aW1lLgorICAK
KyAgICBUbyBhZGQgYW4gb2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHksIGNhbGw6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBvYmplY3QuYWRkT2JzZXJ2ZXIoJ3Byb3BlcnR5S2V5JywgdGFyZ2V0
T2JqZWN0LCB0YXJnZXRBY3Rpb24pCisgICAgYGBgCisgIAorICAgIFRoaXMgd2lsbCBjYWxsIHRo
ZSBgdGFyZ2V0QWN0aW9uYCBtZXRob2Qgb24gdGhlIGB0YXJnZXRPYmplY3RgIHdoZW5ldmVyCisg
ICAgdGhlIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNoYW5nZXMuCisgIAorICAgIE5vdGUg
dGhhdCBpZiBgcHJvcGVydHlLZXlgIGlzIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBvYnNlcnZl
ciB3aWxsIGJlCisgICAgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBwcm9wZXJ0eSBkZXBlbmRlbmNp
ZXMgYXJlIGNoYW5nZWQsIGV2ZW4gaWYgdGhlCisgICAgcmVzdWx0aW5nIHZhbHVlIG9mIHRoZSBj
b21wdXRlZCBwcm9wZXJ0eSBpcyB1bmNoYW5nZWQuIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgYmVj
YXVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBub3QgY29tcHV0ZWQgdW50aWwgYGdldGAgaXMg
Y2FsbGVkLgorICAKKyAgICBAY2xhc3MgT2JzZXJ2YWJsZQorICAgIEBuYW1lc3BhY2UgRW1iZXIK
KyAgICBAcHVibGljCisgICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFsTWl4aW4u
TWl4aW4uY3JlYXRlKHsKKworICAgIC8qKgorICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBh
IHByb3BlcnR5IGZyb20gdGhlIG9iamVjdC4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5
IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtrZXlOYW1lXWAgb3IgYG9iamVjdC5rZXlOYW1lYCwK
KyAgICAgIGhvd2V2ZXIgaXQgc3VwcG9ydHMgYm90aCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCB0
aGUgdW5rbm93blByb3BlcnR5CisgICAgICBoYW5kbGVyLgorICAgICAgIEJlY2F1c2UgYGdldGAg
dW5pZmllcyB0aGUgc3ludGF4IGZvciBhY2Nlc3NpbmcgYWxsIHRoZXNlIGtpbmRzCisgICAgICBv
ZiBwcm9wZXJ0aWVzLCBpdCBjYW4gbWFrZSBtYW55IHJlZmFjdG9yaW5ncyBlYXNpZXIsIHN1Y2gg
YXMgcmVwbGFjaW5nIGEKKyAgICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJv
cGVydHksIG9yIHZpY2UgdmVyc2EuCisgICAgICAgIyMjIENvbXB1dGVkIFByb3BlcnRpZXMKKyAg
ICAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBtZXRob2RzIGRlZmluZWQgd2l0aCB0aGUgYHBy
b3BlcnR5YCBtb2RpZmllcgorICAgICAgZGVjbGFyZWQgYXQgdGhlIGVuZCwgc3VjaCBhczoKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAg
IHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUn
KTsKKyAgICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCisgICAgICBgYGAK
KyAgICAgICBXaGVuIHlvdSBjYWxsIGBnZXRgIG9uIGEgY29tcHV0ZWQgcHJvcGVydHksIHRoZSBm
dW5jdGlvbiB3aWxsIGJlCisgICAgICBjYWxsZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBi
ZSByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbgorICAgICAgaXRzZWxmLgorICAgICAg
ICMjIyBVbmtub3duIFByb3BlcnRpZXMKKyAgICAgICBMaWtld2lzZSwgaWYgeW91IHRyeSB0byBj
YWxsIGBnZXRgIG9uIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMKKyAgICAgIGB1bmRlZmluZWRg
LCB0aGUgYHVua25vd25Qcm9wZXJ0eSgpYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG9i
amVjdC4KKyAgICAgIElmIHRoaXMgbWV0aG9kIHJldHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4g
YHVuZGVmaW5lZGAsIGl0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgIGluc3RlYWQuIFRoaXMgYWxs
b3dzIHlvdSB0byBpbXBsZW1lbnQgInZpcnR1YWwiIHByb3BlcnRpZXMgdGhhdCBhcmUKKyAgICAg
IG5vdCBkZWZpbmVkIHVwZnJvbnQuCisgICAgICAgQG1ldGhvZCBnZXQKKyAgICAgIEBwYXJhbSB7
U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQorICAgICAgQHJldHVybiB7
T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdW5kZWZpbmVkLgorICAgICAgQHB1YmxpYwor
ICAgICovCisgICAgZ2V0OiBmdW5jdGlvbiAoa2V5TmFtZSkgeworICAgICAgcmV0dXJuIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBUbyBnZXQgdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBwcm9wZXJ0aWVzIGF0IG9uY2Us
IGNhbGwgYGdldFByb3BlcnRpZXNgCisgICAgICB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzIG9yIGFu
IGFycmF5OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHJlY29yZC5nZXRQcm9wZXJ0aWVz
KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZScpOworICAgICAgLy8geyBmaXJzdE5h
bWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0KKyAgICAgIGBg
YAorICAgICAgIGlzIGVxdWl2YWxlbnQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
cmVjb3JkLmdldFByb3BlcnRpZXMoWydmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZSdd
KTsKKyAgICAgIC8vIHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29k
ZTogJzEwMDExJyB9CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGdldFByb3BlcnRpZXMKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMgdG8gZ2V0CisgICAgICBA
cmV0dXJuIHtPYmplY3R9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBnZXRQcm9wZXJ0aWVz
OiBmdW5jdGlvbiAoKSB7CisgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwg
YXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgeworICAg
ICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOworICAgICAgfQorCisgICAgICByZXR1
cm4gX2VtYmVyTWV0YWxHZXRfcHJvcGVydGllcy5kZWZhdWx0LmFwcGx5KG51bGwsIFt0aGlzXS5j
b25jYXQoYXJncykpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNldHMgdGhlIHByb3ZpZGVk
IGtleSBvciBwYXRoIHRvIHRoZSB2YWx1ZS4KKyAgICAgICBUaGlzIG1ldGhvZCBpcyBnZW5lcmFs
bHkgdmVyeSBzaW1pbGFyIHRvIGNhbGxpbmcgYG9iamVjdFtrZXldID0gdmFsdWVgIG9yCisgICAg
ICBgb2JqZWN0LmtleSA9IHZhbHVlYCwgZXhjZXB0IHRoYXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBm
b3IgY29tcHV0ZWQKKyAgICAgIHByb3BlcnRpZXMsIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClg
IG1ldGhvZCBhbmQgcHJvcGVydHkgb2JzZXJ2ZXJzLgorICAgICAgICMjIyBDb21wdXRlZCBQcm9w
ZXJ0aWVzCisgICAgICAgSWYgeW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGhh
cyBhIGNvbXB1dGVkIHByb3BlcnR5IGhhbmRsZXIKKyAgICAgIGRlZmluZWQgKHNlZSB0aGUgYGdl
dCgpYCBtZXRob2QgZm9yIGFuIGV4YW1wbGUpLCB0aGVuIGBzZXQoKWAgd2lsbCBjYWxsCisgICAg
ICB0aGF0IG1ldGhvZCwgcGFzc2luZyBib3RoIHRoZSB2YWx1ZSBhbmQga2V5IGluc3RlYWQgb2Yg
c2ltcGx5IGNoYW5naW5nCisgICAgICB0aGUgdmFsdWUgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBm
b3IgdGhvc2UgdGltZXMgd2hlbiB5b3UgbmVlZCB0bworICAgICAgaW1wbGVtZW50IGEgcHJvcGVy
dHkgdGhhdCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBtZW1iZXIKKyAgICAgIHByb3BlcnRp
ZXMuCisgICAgICAgIyMjIFVua25vd24gUHJvcGVydGllcworICAgICAgIElmIHlvdSB0cnkgdG8g
c2V0IGEgdmFsdWUgb24gYSBrZXkgdGhhdCBpcyB1bmRlZmluZWQgaW4gdGhlIHRhcmdldAorICAg
ICAgb2JqZWN0LCB0aGVuIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClgIGhhbmRsZXIgd2lsbCBi
ZSBjYWxsZWQgaW5zdGVhZC4gVGhpcworICAgICAgZ2l2ZXMgeW91IGFuIG9wcG9ydHVuaXR5IHRv
IGltcGxlbWVudCBjb21wbGV4ICJ2aXJ0dWFsIiBwcm9wZXJ0aWVzIHRoYXQKKyAgICAgIGFyZSBu
b3QgcHJlZGVmaW5lZCBvbiB0aGUgb2JqZWN0LiBJZiBgc2V0VW5rbm93blByb3BlcnR5KClgIHJl
dHVybnMKKyAgICAgIHVuZGVmaW5lZCwgdGhlbiBgc2V0KClgIHdpbGwgc2ltcGx5IHNldCB0aGUg
dmFsdWUgb24gdGhlIG9iamVjdC4KKyAgICAgICAjIyMgUHJvcGVydHkgT2JzZXJ2ZXJzCisgICAg
ICAgSW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHByb3BlcnR5LCBgc2V0KClgIHdpbGwgYWxz
byByZWdpc3RlciBhIHByb3BlcnR5CisgICAgICBjaGFuZ2Ugd2l0aCB0aGUgb2JqZWN0LiBVbmxl
c3MgeW91IGhhdmUgcGxhY2VkIHRoaXMgY2FsbCBpbnNpZGUgb2YgYQorICAgICAgYGJlZ2luUHJv
cGVydHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxvY2FsIiBv
YnNlcnZlcnMKKyAgICAgIChpLmUuIG9ic2VydmVyIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlIHNh
bWUgb2JqZWN0KSwgd2lsbCBiZSBjYWxsZWQKKyAgICAgIGltbWVkaWF0ZWx5LiBBbnkgInJlbW90
ZSIgb2JzZXJ2ZXJzIChpLmUuIG9ic2VydmVyIG1ldGhvZHMgZGVjbGFyZWQgb24KKyAgICAgIGFu
b3RoZXIgb2JqZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBs
YXRlciB0aW1lIGluIGEKKyAgICAgIGNvYWxlc2NlZCBtYW5uZXIuCisgICAgICAgQG1ldGhvZCBz
ZXQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSB0byBzZXQKKyAg
ICAgIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IG9yIGBudWxsYC4KKyAg
ICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHBhc3NlZCB2YWx1ZQorICAgICAgQHB1YmxpYworICAg
ICovCisgICAgc2V0OiBmdW5jdGlvbiAoa2V5TmFtZSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIFNldHMgYSBsaXN0IG9mIHByb3BlcnRpZXMgYXQgb25jZS4gVGhl
c2UgcHJvcGVydGllcyBhcmUgc2V0IGluc2lkZQorICAgICAgYSBzaW5nbGUgYGJlZ2luUHJvcGVy
dHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCisgICAgICBvYnNl
cnZlcnMgd2lsbCBiZSBidWZmZXJlZC4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICByZWNv
cmQuc2V0UHJvcGVydGllcyh7IGZpcnN0TmFtZTogJ0NoYXJsZXMnLCBsYXN0TmFtZTogJ0pvbGxl
eScgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHNldFByb3BlcnRpZXMKKyAgICAgIEBw
YXJhbSB7T2JqZWN0fSBoYXNoIHRoZSBoYXNoIG9mIGtleXMgYW5kIHZhbHVlcyB0byBzZXQKKyAg
ICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHBhc3NlZCBpbiBoYXNoCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoaGFzaCkgeworICAgICAgcmV0dXJu
IF9lbWJlck1ldGFsU2V0X3Byb3BlcnRpZXMuZGVmYXVsdCh0aGlzLCBoYXNoKTsKKyAgICB9LAor
CisgICAgLyoqCisgICAgICBCZWdpbnMgYSBncm91cGluZyBvZiBwcm9wZXJ0eSBjaGFuZ2VzLgor
ICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNoYW5nZXMg
c28gdGhhdCBub3RpZmljYXRpb25zCisgICAgICB3aWxsIG5vdCBiZSBzZW50IHVudGlsIHRoZSBj
aGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAgICBsYXJnZSBu
dW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91bGQgY2Fs
bCB0aGlzCisgICAgICBtZXRob2QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhbmdlcyB0byBi
ZWdpbiBkZWZlcnJpbmcgY2hhbmdlCisgICAgICBub3RpZmljYXRpb25zLiBXaGVuIHlvdSBhcmUg
ZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbAorICAgICAgYGVuZFByb3BlcnR5Q2hhbmdlcygpYCB0
byBkZWxpdmVyIHRoZSBkZWZlcnJlZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgZW5kCisgICAg
ICBkZWZlcnJpbmcuCisgICAgICAgQG1ldGhvZCBiZWdpblByb3BlcnR5Q2hhbmdlcworICAgICAg
QHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBi
ZWdpblByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9ldmVudHMuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKTsKKyAgICAgIHJldHVybiB0aGlzOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEVuZHMgYSBncm91cGluZyBvZiBwcm9wZXJ0eSBjaGFu
Z2VzLgorICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNo
YW5nZXMgc28gdGhhdCBub3RpZmljYXRpb25zCisgICAgICB3aWxsIG5vdCBiZSBzZW50IHVudGls
IHRoZSBjaGFuZ2VzIGFyZSBmaW5pc2hlZC4gSWYgeW91IHBsYW4gdG8gbWFrZSBhCisgICAgICBs
YXJnZSBudW1iZXIgb2YgY2hhbmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91
bGQgY2FsbAorICAgICAgYGJlZ2luUHJvcGVydHlDaGFuZ2VzKClgIGF0IHRoZSBiZWdpbm5pbmcg
b2YgdGhlIGNoYW5nZXMgdG8gZGVmZXIgY2hhbmdlCisgICAgICBub3RpZmljYXRpb25zLiBXaGVu
IHlvdSBhcmUgZG9uZSBtYWtpbmcgY2hhbmdlcywgY2FsbCB0aGlzIG1ldGhvZCB0bworICAgICAg
ZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZCBkZWZlcnJp
bmcuCisgICAgICAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKKyAgICAgIEByZXR1cm4ge0Vt
YmVyLk9ic2VydmFibGV9CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZW5kUHJvcGVydHlD
aGFuZ2VzOiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5l
bmRQcm9wZXJ0eUNoYW5nZXMoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lzdGVtIHRoYXQgYSBwcm9wZXJ0eSBpcyBh
Ym91dCB0byBjaGFuZ2UuCisgICAgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBhIHZh
bHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAorICAgICAgYWN0dWFsbHkgY2FsbGlu
ZyBgZ2V0KClgIG9yIGBzZXQoKWAgb24gaXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgdGhp
cworICAgICAgbWV0aG9kIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGlu
ZyB0aGVzZSB0d28gbWV0aG9kcworICAgICAgdG9nZXRoZXIgd2lsbCBub3RpZnkgYWxsIG9ic2Vy
dmVycyB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgcG90ZW50aWFsbHkKKyAgICAgIGNoYW5nZWQgdmFs
dWUuCisgICAgICAgTm90ZSB0aGF0IHlvdSBtdXN0IGFsd2F5cyBjYWxsIGBwcm9wZXJ0eVdpbGxD
aGFuZ2VgIGFuZCBgcHJvcGVydHlEaWRDaGFuZ2VgCisgICAgICBhcyBhIHBhaXIuIElmIHlvdSBk
byBub3QsIGl0IG1heSBnZXQgdGhlIHByb3BlcnR5IGNoYW5nZSBncm91cHMgb3V0IG9mCisgICAg
ICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQgbW9yZSBvZnRl
biB0aGFuIHlvdSB3b3VsZAorICAgICAgbGlrZS4KKyAgICAgICBAbWV0aG9kIHByb3BlcnR5V2ls
bENoYW5nZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtleSB0
aGF0IGlzIGFib3V0IHRvIGNoYW5nZS4KKyAgICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgcHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlv
biAoa2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlX
aWxsQ2hhbmdlKHRoaXMsIGtleU5hbWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgTm90aWZ5IHRoZSBvYnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5
IGhhcyBqdXN0IGNoYW5nZWQuCisgICAgICAgU29tZXRpbWVzIHlvdSBuZWVkIHRvIGNoYW5nZSBh
IHZhbHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAorICAgICAgYWN0dWFsbHkgY2Fs
bGluZyBgZ2V0KClgIG9yIGBzZXQoKWAgb24gaXQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2Ug
dGhpcworICAgICAgbWV0aG9kIGFuZCBgcHJvcGVydHlXaWxsQ2hhbmdlKClgIGluc3RlYWQuIENh
bGxpbmcgdGhlc2UgdHdvIG1ldGhvZHMKKyAgICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBv
YnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5CisgICAgICBjaGFuZ2Vk
IHZhbHVlLgorICAgICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJvcGVydHlX
aWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAorICAgICAgYXMgYSBwYWlyLiBJZiB5
b3UgZG8gbm90LCBpdCBtYXkgZ2V0IHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZ3JvdXBzIG91dCBvZgor
ICAgICAgb3JkZXIgYW5kIGNhdXNlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZGVsaXZlcmVkIG1vcmUg
b2Z0ZW4gdGhhbiB5b3Ugd291bGQKKyAgICAgIGxpa2UuCisgICAgICAgQG1ldGhvZCBwcm9wZXJ0
eURpZENoYW5nZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtl
eSB0aGF0IGhhcyBqdXN0IGNoYW5nZWQuCisgICAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxl
fQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHByb3BlcnR5RGlkQ2hhbmdlOiBmdW5jdGlv
biAoa2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJvcGVydHlE
aWRDaGFuZ2UodGhpcywga2V5TmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxsQ2hh
bmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYCBpbgorICAgICAgc3VjY2Vzc2lvbi4KKyAgICAg
ICBAbWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdlCisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5
TmFtZSBUaGUgcHJvcGVydHkga2V5IHRvIGJlIG5vdGlmaWVkIGFib3V0LgorICAgICAgQHJldHVy
biB7RW1iZXIuT2JzZXJ2YWJsZX0KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIG5vdGlmeVBy
b3BlcnR5Q2hhbmdlOiBmdW5jdGlvbiAoa2V5TmFtZSkgeworICAgICAgdGhpcy5wcm9wZXJ0eVdp
bGxDaGFuZ2Uoa2V5TmFtZSk7CisgICAgICB0aGlzLnByb3BlcnR5RGlkQ2hhbmdlKGtleU5hbWUp
OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQWRkcyBhbiBv
YnNlcnZlciBvbiBhIHByb3BlcnR5LgorICAgICAgIFRoaXMgaXMgdGhlIGNvcmUgbWV0aG9kIHVz
ZWQgdG8gcmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHkuCisgICAgICAgT25jZSB5
b3UgY2FsbCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhlIGtleSdzIHZhbHVlIGlzIHNldCwgeW91
ciBvYnNlcnZlcgorICAgICAgd2lsbCBiZSBub3RpZmllZC4gTm90ZSB0aGF0IHRoZSBvYnNlcnZl
cnMgYXJlIHRyaWdnZXJlZCBhbnkgdGltZSB0aGUKKyAgICAgIHZhbHVlIGlzIHNldCwgcmVnYXJk
bGVzcyBvZiB3aGV0aGVyIGl0IGhhcyBhY3R1YWxseSBjaGFuZ2VkLiBZb3VyCisgICAgICBvYnNl
cnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQuCisgICAgICAgWW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgdG8gdGhpcyBtZXRob2QuIFRo
ZQorICAgICAgY29udGV4dCB3aWxsIGJlIHBhc3NlZCB0byB5b3VyIG9ic2VydmVyIG1ldGhvZCB3
aGVuZXZlciBpdCBpcyB0cmlnZ2VyZWQuCisgICAgICBOb3RlIHRoYXQgaWYgeW91IGFkZCB0aGUg
c2FtZSB0YXJnZXQvbWV0aG9kIHBhaXIgb24gYSBrZXkgbXVsdGlwbGUgdGltZXMKKyAgICAgIHdp
dGggZGlmZmVyZW50IGNvbnRleHQgcGFyYW1ldGVycywgeW91ciBvYnNlcnZlciB3aWxsIG9ubHkg
YmUgY2FsbGVkIG9uY2UKKyAgICAgIHdpdGggdGhlIGxhc3QgY29udGV4dCB5b3UgcGFzc2VkLgor
ICAgICAgICMjIyBPYnNlcnZlciBNZXRob2RzCisgICAgICAgT2JzZXJ2ZXIgbWV0aG9kcyB5b3Ug
cGFzcyBzaG91bGQgZ2VuZXJhbGx5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgaWYKKyAg
ICAgIHlvdSBkbyBub3QgcGFzcyBhIGBjb250ZXh0YCBwYXJhbWV0ZXI6CisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgZm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUs
IHJldikgeyB9OworICAgICAgYGBgCisgICAgICAgVGhlIHNlbmRlciBpcyB0aGUgb2JqZWN0IHRo
YXQgY2hhbmdlZC4gVGhlIGtleSBpcyB0aGUgcHJvcGVydHkgdGhhdAorICAgICAgY2hhbmdlcy4g
VGhlIHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUg
cmV2CisgICAgICBpcyB0aGUgbGFzdCBwcm9wZXJ0eSByZXZpc2lvbiBvZiB0aGUgb2JqZWN0IHdo
ZW4gaXQgY2hhbmdlZCwgd2hpY2ggeW91IGNhbgorICAgICAgdXNlIHRvIGRldGVjdCBpZiB0aGUg
a2V5IHZhbHVlIGhhcyByZWFsbHkgY2hhbmdlZCBvciBub3QuCisgICAgICAgSWYgeW91IHBhc3Mg
YSBgY29udGV4dGAgcGFyYW1ldGVyLCB0aGUgY29udGV4dCB3aWxsIGJlIHBhc3NlZCBiZWZvcmUg
dGhlCisgICAgICByZXZpc2lvbiBsaWtlIHNvOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IGZvb0RpZENoYW5nZTogZnVuY3Rpb24oc2VuZGVyLCBrZXksIHZhbHVlLCBjb250ZXh0LCByZXYp
IHsgfTsKKyAgICAgIGBgYAorICAgICAgIFVzdWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdGhlIHZh
bHVlLCBjb250ZXh0IG9yIHJldmlzaW9uIHBhcmFtZXRlcnMgYXQKKyAgICAgIHRoZSBlbmQuIElu
IHRoaXMgY2FzZSwgaXQgaXMgY29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0
YWtlCisgICAgICBvbmx5IGEgc2VuZGVyIGFuZCBrZXkgdmFsdWUgYXMgcGFyYW1ldGVycyBvciwg
aWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluCisgICAgICBhbnkgb2YgdGhlc2UgdmFsdWVzLCB0
byB3cml0ZSBhbiBvYnNlcnZlciB0aGF0IGhhcyBubyBwYXJhbWV0ZXJzIGF0IGFsbC4KKyAgICAg
ICBAbWV0aG9kIGFkZE9ic2VydmVyCisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkg
dG8gb2JzZXJ2ZXIKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmpl
Y3QgdG8gaW52b2tlCisgICAgICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBt
ZXRob2QgdG8gaW52b2tlLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgYWRkT2JzZXJ2ZXI6
IGZ1bmN0aW9uIChrZXksIHRhcmdldCwgbWV0aG9kKSB7CisgICAgICBfZW1iZXJNZXRhbE9ic2Vy
dmVyLmFkZE9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2QpOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJlbW92ZSBhbiBvYnNlcnZlciB5b3UgaGF2ZSBwcmV2aW91c2x5IHJlZ2lz
dGVyZWQgb24gdGhpcyBvYmplY3QuIFBhc3MKKyAgICAgIHRoZSBzYW1lIGtleSwgdGFyZ2V0LCBh
bmQgbWV0aG9kIHlvdSBwYXNzZWQgdG8gYGFkZE9ic2VydmVyKClgIGFuZCB5b3VyCisgICAgICB0
YXJnZXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zLgorICAgICAgIEBtZXRo
b2QgcmVtb3ZlT2JzZXJ2ZXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBv
YnNlcnZlcgorICAgICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0
byBpbnZva2UKKyAgICAgIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXRob2QgVGhlIG1ldGhv
ZCB0byBpbnZva2UuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZW1vdmVPYnNlcnZlcjog
ZnVuY3Rpb24gKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKKyAgICAgIF9lbWJlck1ldGFsT2JzZXJ2
ZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywga2V5LCB0YXJnZXQsIG1ldGhvZCk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBjdXJyZW50bHkgaGFz
IG9ic2VydmVycyByZWdpc3RlcmVkIGZvciBhCisgICAgICBwYXJ0aWN1bGFyIGtleS4gWW91IGNh
biB1c2UgdGhpcyBtZXRob2QgdG8gcG90ZW50aWFsbHkgZGVmZXIgcGVyZm9ybWluZworICAgICAg
YW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBzb21lb25lIGJlZ2lucyBvYnNlcnZpbmcgYSBwYXJ0
aWN1bGFyIHByb3BlcnR5CisgICAgICBvbiB0aGUgb2JqZWN0LgorICAgICAgIEBtZXRob2QgaGFz
T2JzZXJ2ZXJGb3IKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgS2V5IHRvIGNoZWNrCisgICAg
ICBAcmV0dXJuIHtCb29sZWFufQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGhhc09ic2Vy
dmVyRm9yOiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxFdmVudHMu
aGFzTGlzdGVuZXJzKHRoaXMsIGtleSArICc6Y2hhbmdlJyk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LCBvciBhIGRlZmF1bHQgdmFs
dWUgaW4gdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgIHByb3BlcnR5IHJldHVybnMgYHVuZGVmaW5l
ZGAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgcGVyc29uLmdldFdpdGhEZWZhdWx0KCds
YXN0TmFtZScsICdEb2UnKTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgZ2V0V2l0aERlZmF1
bHQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0
eSB0byByZXRyaWV2ZQorICAgICAgQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRWYWx1ZSBUaGUgdmFs
dWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmRlZmluZWQKKyAgICAgIEBy
ZXR1cm4ge09iamVjdH0gVGhlIHByb3BlcnR5IHZhbHVlIG9yIHRoZSBkZWZhdWx0VmFsdWUuCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICBnZXRXaXRoRGVmYXVsdDogZnVuY3Rpb24gKGtleU5h
bWUsIGRlZmF1bHRWYWx1ZSkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldFdpdGhEZWZhdWx0KHRoaXMsIGtleU5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgfSwKKwor
ICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50
IHZhbHVlIHBsdXMgc29tZSBhbW91bnQuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgcGVy
c29uLmluY3JlbWVudFByb3BlcnR5KCdhZ2UnKTsKKyAgICAgIHRlYW0uaW5jcmVtZW50UHJvcGVy
dHkoJ3Njb3JlJywgMik7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGluY3JlbWVudFByb3Bl
cnR5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVy
dHkgdG8gaW5jcmVtZW50CisgICAgICBAcGFyYW0ge051bWJlcn0gaW5jcmVtZW50IFRoZSBhbW91
bnQgdG8gaW5jcmVtZW50IGJ5LiBEZWZhdWx0cyB0byAxCisgICAgICBAcmV0dXJuIHtOdW1iZXJ9
IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGluY3Jl
bWVudFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5TmFtZSwgaW5jcmVtZW50KSB7CisgICAgICBpZiAo
X2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoaW5jcmVtZW50KSkgeworICAgICAgICBpbmNyZW1l
bnQgPSAxOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ011c3QgcGFz
cyBhIG51bWVyaWMgdmFsdWUgdG8gaW5jcmVtZW50UHJvcGVydHknLCAhaXNOYU4ocGFyc2VGbG9h
dChpbmNyZW1lbnQpKSAmJiBpc0Zpbml0ZShpbmNyZW1lbnQpKTsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgKHBhcnNlRmxvYXQoX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsIGtleU5hbWUpKSB8fCAwKSArIGluY3JlbWVudCk7
CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRv
IHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIHNvbWUgYW1vdW50LgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIHBsYXllci5kZWNyZW1lbnRQcm9wZXJ0eSgnbGl2ZXMnKTsKKyAgICAgIG9yYy5k
ZWNyZW1lbnRQcm9wZXJ0eSgnaGVhbHRoJywgNSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGRlY3JlbWVudFByb3BlcnR5CisgICAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFt
ZSBvZiB0aGUgcHJvcGVydHkgdG8gZGVjcmVtZW50CisgICAgICBAcGFyYW0ge051bWJlcn0gZGVj
cmVtZW50IFRoZSBhbW91bnQgdG8gZGVjcmVtZW50IGJ5LiBEZWZhdWx0cyB0byAxCisgICAgICBA
cmV0dXJuIHtOdW1iZXJ9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgIGRlY3JlbWVudFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5TmFtZSwgZGVjcmVtZW50
KSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxJc19ub25lLmRlZmF1bHQoZGVjcmVtZW50KSkgewor
ICAgICAgICBkZWNyZW1lbnQgPSAxOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ011c3QgcGFzcyBhIG51bWVyaWMgdmFsdWUgdG8gZGVjcmVtZW50UHJvcGVydHknLCAh
aXNOYU4ocGFyc2VGbG9hdChkZWNyZW1lbnQpKSAmJiBpc0Zpbml0ZShkZWNyZW1lbnQpKTsKKyAg
ICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywga2V5TmFtZSwgKF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCBrZXlOYW1lKSB8fCAwKSAtIGRlY3JlbWVu
dCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4g
cHJvcGVydHkgdG8gdGhlIG9wcG9zaXRlIG9mIGl0cworICAgICAgY3VycmVudCB2YWx1ZS4KKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2FycERy
aXZlRW5nYWdlZCcpOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCB0b2dnbGVQcm9wZXJ0eQor
ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRv
IHRvZ2dsZQorICAgICAgQHJldHVybiB7Qm9vbGVhbn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQor
ICAgICAgQHB1YmxpYworICAgICovCisgICAgdG9nZ2xlUHJvcGVydHk6IGZ1bmN0aW9uIChrZXlO
YW1lKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0KHRoaXMsIGtl
eU5hbWUsICFfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywga2V5TmFtZSkpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZSBvZiBhIGNvbXB1
dGVkIHByb3BlcnR5LCBpZiBpdCBleGlzdHMuCisgICAgICBUaGlzIGFsbG93cyB5b3UgdG8gaW5z
cGVjdCB0aGUgdmFsdWUgb2YgYSBjb21wdXRlZCBwcm9wZXJ0eQorICAgICAgd2l0aG91dCBhY2Np
ZGVudGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKKyAgICAgIGdlbmVy
YXRlZCBsYXppbHkuCisgICAgICAgQG1ldGhvZCBjYWNoZUZvcgorICAgICAgQHBhcmFtIHtTdHJp
bmd9IGtleU5hbWUKKyAgICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGNhY2hlZCB2YWx1ZSBvZiB0
aGUgY29tcHV0ZWQgcHJvcGVydHksIGlmIGFueQorICAgICAgQHB1YmxpYworICAgICovCisgICAg
Y2FjaGVGb3I6IGZ1bmN0aW9uIChrZXlOYW1lKSB7CisgICAgICByZXR1cm4gX2VtYmVyTWV0YWxD
b21wdXRlZC5jYWNoZUZvcih0aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgLy8gaW50ZW5k
ZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICAgIG9ic2VydmVyc0ZvcktleTogZnVuY3Rpb24g
KGtleU5hbWUpIHsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbE9ic2VydmVyLm9ic2VydmVyc0Zv
cih0aGlzLCBrZXlOYW1lKTsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRp
bWUvbWl4aW5zL3Byb21pc2VfcHJveHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3NldF9wcm9wZXJ0aWVzJywgJ2VtYmVyLW1ldGFsL2NvbXB1
dGVkJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL2Vycm9yJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxTZXRfcHJvcGVy
dGllcywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxF
cnJvcikgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIG5vdCA9IF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQubm90OworICB2YXIgb3IgPSBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVk
Lm9yOworCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3VibW9kdWxlIGVtYmVyLXJ1
bnRpbWUKKyAgKi8KKworICBmdW5jdGlvbiB0YXAocHJveHksIHByb21pc2UpIHsKKyAgICBfZW1i
ZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQocHJveHksIHsKKyAgICAgIGlzRnVsZmlsbGVk
OiBmYWxzZSwKKyAgICAgIGlzUmVqZWN0ZWQ6IGZhbHNlCisgICAgfSk7CisKKyAgICByZXR1cm4g
cHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJv
cGVydGllcy5kZWZhdWx0KHByb3h5LCB7CisgICAgICAgIGNvbnRlbnQ6IHZhbHVlLAorICAgICAg
ICBpc0Z1bGZpbGxlZDogdHJ1ZQorICAgICAgfSk7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAg
fSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgX2VtYmVyTWV0YWxTZXRfcHJvcGVydGllcy5k
ZWZhdWx0KHByb3h5LCB7CisgICAgICAgIHJlYXNvbjogcmVhc29uLAorICAgICAgICBpc1JlamVj
dGVkOiB0cnVlCisgICAgICB9KTsKKyAgICAgIHRocm93IHJlYXNvbjsKKyAgICB9LCAnRW1iZXI6
IFByb21pc2VQcm94eScpOworICB9CisKKyAgLyoqCisgICAgQSBsb3cgbGV2ZWwgbWl4aW4gbWFr
aW5nIE9iamVjdFByb3h5IHByb21pc2UtYXdhcmUuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICB2YXIgT2JqZWN0UHJvbWlzZVByb3h5ID0gRW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKEVtYmVy
LlByb21pc2VQcm94eU1peGluKTsKKyAgCisgICAgdmFyIHByb3h5ID0gT2JqZWN0UHJvbWlzZVBy
b3h5LmNyZWF0ZSh7CisgICAgICBwcm9taXNlOiAkLmdldEpTT04oJy9zb21lL3JlbW90ZS9kYXRh
Lmpzb24nKQorICAgIH0pOworICAKKyAgICBwcm94eS50aGVuKGZ1bmN0aW9uKGpzb24peworICAg
ICAgIC8vIHRoZSBqc29uCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAgLy8gdGhl
IHJlYXNvbiB3aHkgeW91IGhhdmUgbm8ganNvbgorICAgIH0pOworICAgIGBgYAorICAKKyAgICB0
aGUgcHJveHkgaGFzIGJpbmRhYmxlIGF0dHJpYnV0ZXMgd2hpY2gKKyAgICB0cmFjayB0aGUgcHJv
bWlzZXMgbGlmZSBjeWNsZQorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgcHJveHkuZ2V0KCdp
c1BlbmRpbmcnKSAgIC8vPT4gdHJ1ZQorICAgIHByb3h5LmdldCgnaXNTZXR0bGVkJykgIC8vPT4g
ZmFsc2UKKyAgICBwcm94eS5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQorICAgIHByb3h5
LmdldCgnaXNGdWxmaWxsZWQnKSAvLz0+IGZhbHNlCisgICAgYGBgCisgIAorICAgIFdoZW4gdGhl
ICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKKyAgICB3
aXRoIGpzb24sIHRoZSBsaWZlIGN5Y2xlIGF0dHJpYnV0ZXMgd2lsbCB1cGRhdGUgYWNjb3JkaW5n
bHkuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBwcm94eS5nZXQoJ2lzUGVuZGluZycpICAg
Ly89PiBmYWxzZQorICAgIHByb3h5LmdldCgnaXNTZXR0bGVkJykgICAvLz0+IHRydWUKKyAgICBw
cm94eS5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQorICAgIHByb3h5LmdldCgnaXNGdWxm
aWxsZWQnKSAvLz0+IHRydWUKKyAgICBgYGAKKyAgCisgICAgQXMgdGhlIHByb3h5IGlzIGFuIE9i
amVjdFByb3h5LCBhbmQgdGhlIGpzb24gbm93IGl0cyBjb250ZW50LAorICAgIGFsbCB0aGUganNv
biBwcm9wZXJ0aWVzIHdpbGwgYmUgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIHByb3h5Lgor
ICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8gQXNzdW1pbmcgdGhlIGZvbGxvd2luZyBqc29u
OgorICAgIHsKKyAgICAgIGZpcnN0TmFtZTogJ1N0ZWZhbicsCisgICAgICBsYXN0TmFtZTogJ1Bl
bm5lcicKKyAgICB9CisgIAorICAgIC8vIGJvdGggcHJvcGVydGllcyB3aWxsIGFjY2Vzc2libGUg
b24gdGhlIHByb3h5CisgICAgcHJveHkuZ2V0KCdmaXJzdE5hbWUnKSAvLz0+ICdTdGVmYW4nCisg
ICAgcHJveHkuZ2V0KCdsYXN0TmFtZScpICAvLz0+ICdQZW5uZXInCisgICAgYGBgCisgIAorICAg
IEBjbGFzcyBFbWJlci5Qcm9taXNlUHJveHlNaXhpbgorICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhw
b3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgor
ICAgICAgSWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyByZWplY3RlZCB0aGlzIHdpbGwgY29udGFp
biB0aGUgcmVhc29uCisgICAgICBwcm92aWRlZC4KKyAgICAgICBAcHJvcGVydHkgcmVhc29uCisg
ICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICByZWFzb246IG51
bGwsCisKKyAgICAvKioKKyAgICAgIE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxl
ZCB0aGlzIHdpbGwgYmVjb21lIGBmYWxzZWAuCisgICAgICAgQHByb3BlcnR5IGlzUGVuZGluZwor
ICAgICAgQGRlZmF1bHQgdHJ1ZQorICAgICAgQHB1YmxpYworICAgICovCisgICAgaXNQZW5kaW5n
OiBub3QoJ2lzU2V0dGxlZCcpLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIE9uY2UgdGhl
IHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxlZCB0aGlzIHdpbGwgYmVjb21lIGB0cnVlYC4KKyAg
ICAgICBAcHJvcGVydHkgaXNTZXR0bGVkCisgICAgICBAZGVmYXVsdCBmYWxzZQorICAgICAgQHB1
YmxpYworICAgICovCisgICAgaXNTZXR0bGVkOiBvcignaXNSZWplY3RlZCcsICdpc0Z1bGZpbGxl
ZCcpLnJlYWRPbmx5KCksCisKKyAgICAvKioKKyAgICAgIFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0
aGUgcHJveGllZCBwcm9taXNlIGlzIHJlamVjdGVkLgorICAgICAgIEBwcm9wZXJ0eSBpc1JlamVj
dGVkCisgICAgICBAZGVmYXVsdCBmYWxzZQorICAgICAgQHB1YmxpYworICAgICovCisgICAgaXNS
ZWplY3RlZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0
aGUgcHJveGllZCBwcm9taXNlIGlzIGZ1bGZpbGxlZC4KKyAgICAgICBAcHJvcGVydHkgaXNGdWxm
aWxsZWQKKyAgICAgIEBkZWZhdWx0IGZhbHNlCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBp
c0Z1bGZpbGxlZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIFRoZSBwcm9taXNlIHdob3NlIGZ1
bGZpbGxtZW50IHZhbHVlIGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmplY3QuCisgICAgICAg
VGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCB1cG9uIGNyZWF0aW9uLCBhbmQgc2hvdWxk
IG5vdCBiZQorICAgICAgY2hhbmdlZCBvbmNlIGNyZWF0ZWQuCisgICAgICAgRXhhbXBsZToKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoRW1iZXIu
UHJvbWlzZVByb3h5TWl4aW4pLmNyZWF0ZSh7CisgICAgICAgIHByb21pc2U6IDx0aGVuYWJsZT4K
KyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgQHByb3BlcnR5IHByb21pc2UKKyAgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIHByb21pc2U6IF9lbWJlck1ldGFsQ29tcHV0ZWQuY29tcHV0ZWQo
eworICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRh
bEVycm9yLmRlZmF1bHQoJ1Byb21pc2VQcm94eVwncyBwcm9taXNlIG11c3QgYmUgc2V0Jyk7Cisg
ICAgICB9LAorICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCBwcm9taXNlKSB7CisgICAgICAgIHJl
dHVybiB0YXAodGhpcywgcHJvbWlzZSk7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAg
ICAgIEFuIGFsaWFzIHRvIHRoZSBwcm94aWVkIHByb21pc2UncyBgdGhlbmAuCisgICAgICAgU2Vl
IFJTVlAuUHJvbWlzZS50aGVuLgorICAgICAgIEBtZXRob2QgdGhlbgorICAgICAgQHBhcmFtIHtG
dW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KKyAgICAgIEBw
dWJsaWMKKyAgICAqLworICAgIHRoZW46IHByb21pc2VBbGlhcygndGhlbicpLAorCisgICAgLyoq
CisgICAgICBBbiBhbGlhcyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KKyAgICAg
ICBTZWUgUlNWUC5Qcm9taXNlLmNhdGNoLgorICAgICAgIEBtZXRob2QgY2F0Y2gKKyAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Cisg
ICAgICBAc2luY2UgMS4zLjAKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgICdjYXRjaCc6IHBy
b21pc2VBbGlhcygnY2F0Y2gnKSwKKworICAgIC8qKgorICAgICAgQW4gYWxpYXMgdG8gdGhlIHBy
b3hpZWQgcHJvbWlzZSdzIGBmaW5hbGx5YC4KKyAgICAgICBTZWUgUlNWUC5Qcm9taXNlLmZpbmFs
bHkuCisgICAgICAgQG1ldGhvZCBmaW5hbGx5CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs
YmFjaworICAgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgICAgQHNpbmNlIDEuMy4wCisg
ICAgICBAcHVibGljCisgICAgKi8KKyAgICAnZmluYWxseSc6IHByb21pc2VBbGlhcygnZmluYWxs
eScpCisKKyAgfSk7CisKKyAgZnVuY3Rpb24gcHJvbWlzZUFsaWFzKG5hbWUpIHsKKyAgICByZXR1
cm4gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHByb21pc2UgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ3Byb21pc2UnKTsKKyAgICAgIHJldHVybiBwcm9taXNlW25hbWVdLmFw
cGx5KHByb21pc2UsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVy
LXJ1bnRpbWUvbWl4aW5zL3JlZ2lzdHJ5X3Byb3h5JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L2RlYnVnJywgJ2VtYmVyLW1ldGFsL21peGluJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJN
ZXRhbERlYnVnLCBfZW1iZXJNZXRhbE1peGluKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisg
IEBzdWJtb2R1bGUgZW1iZXItcnVudGltZQorICAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLmJ1aWxkRmFrZVJlZ2lzdHJ5V2l0aERlcHJlY2F0aW9ucyA9IGJ1aWxkRmFrZVJlZ2lz
dHJ5V2l0aERlcHJlY2F0aW9uczsKKworICAvKioKKyAgICBSZWdpc3RyeVByb3h5TWl4aW4gaXMg
dXNlZCB0byBwcm92aWRlIHB1YmxpYyBhY2Nlc3MgdG8gc3BlY2lmaWMKKyAgICByZWdpc3RyeSBm
dW5jdGlvbmFsaXR5LgorICAKKyAgICBAY2xhc3MgUmVnaXN0cnlQcm94eU1peGluCisgICAgQHBy
aXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5j
cmVhdGUoeworICAgIF9fcmVnaXN0cnlfXzogbnVsbCwKKworICAgIC8qKgorICAgICBHaXZlbiBh
IGZ1bGxOYW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgorICAgICAgQHB1Ymxp
YworICAgICBAbWV0aG9kIHJlc29sdmVSZWdpc3RyYXRpb24KKyAgICAgQHBhcmFtIHtTdHJpbmd9
IGZ1bGxOYW1lCisgICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBmdWxsTmFtZSdzIGZhY3RvcnkKKyAg
ICAgKi8KKyAgICByZXNvbHZlUmVnaXN0cmF0aW9uOiByZWdpc3RyeUFsaWFzKCdyZXNvbHZlJyks
CisKKyAgICAvKioKKyAgICAgIFJlZ2lzdGVycyBhIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBm
b3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gKHdpdGgKKyAgICAgIGBpbmplY3RgKSBvciBmb3Igc2Vy
dmljZSBsb29rdXAuIEVhY2ggZmFjdG9yeSBpcyByZWdpc3RlcmVkIHdpdGgKKyAgICAgIGEgZnVs
bCBuYW1lIGluY2x1ZGluZyB0d28gcGFydHM6IGB0eXBlOm5hbWVgLgorICAgICAgIEEgc2ltcGxl
IGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEFwcCA9IEVtYmVyLkFw
cGxpY2F0aW9uLmNyZWF0ZSgpOworICAgICAgIEFwcC5PcmFuZ2UgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKCk7CisgICAgICBBcHAucmVnaXN0ZXIoJ2ZydWl0OmZhdm9yaXRlJywgQXBwLk9yYW5nZSk7
CisgICAgICBgYGAKKyAgICAgICBFbWJlciB3aWxsIHJlc29sdmUgZmFjdG9yaWVzIGZyb20gdGhl
IGBBcHBgIG5hbWVzcGFjZSBhdXRvbWF0aWNhbGx5LgorICAgICAgRm9yIGV4YW1wbGUgYEFwcC5D
YXJzQ29udHJvbGxlcmAgd2lsbCBiZSBkaXNjb3ZlcmVkIGFuZCByZXR1cm5lZCBpZgorICAgICAg
YW4gYXBwbGljYXRpb24gcmVxdWVzdHMgYGNvbnRyb2xsZXI6Y2Fyc2AuCisgICAgICAgQW4gZXhh
bXBsZSBvZiByZWdpc3RlcmluZyBhIGNvbnRyb2xsZXIgd2l0aCBhIG5vbi1zdGFuZGFyZCBuYW1l
OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNhdGlv
bi5jcmVhdGUoKTsKKyAgICAgIHZhciBTZXNzaW9uID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQo
KTsKKyAgICAgICBBcHAucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6c2Vzc2lvbicsIFNlc3Npb24pOwor
ICAgICAgIC8vIFRoZSBTZXNzaW9uIGNvbnRyb2xsZXIgY2FuIG5vdyBiZSB0cmVhdGVkIGxpa2Ug
YSBub3JtYWwgY29udHJvbGxlciwKKyAgICAgIC8vIGRlc3BpdGUgaXRzIG5vbi1zdGFuZGFyZCBu
YW1lLgorICAgICAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIu
ZXh0ZW5kKHsKKyAgICAgICAgbmVlZHM6IFsnc2Vzc2lvbiddCisgICAgICB9KTsKKyAgICAgIGBg
YAorICAgICAgIFJlZ2lzdGVyZWQgZmFjdG9yaWVzIGFyZSAqKmluc3RhbnRpYXRlZCoqIGJ5IGhh
dmluZyBgY3JlYXRlYAorICAgICAgY2FsbGVkIG9uIHRoZW0uIEFkZGl0aW9uYWxseSB0aGV5IGFy
ZSAqKnNpbmdsZXRvbnMqKiwgZWFjaCB0aW1lCisgICAgICB0aGV5IGFyZSBsb29rZWQgdXAgdGhl
eSByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UuCisgICAgICAgU29tZSBleGFtcGxlcyBtb2RpZnlp
bmcgdGhhdCBkZWZhdWx0IGJlaGF2aW9yOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZh
ciBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAgICBBcHAuUGVyc29uID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCgpOworICAgICAgQXBwLk9yYW5nZSA9IEVtYmVyLk9iamVjdC5l
eHRlbmQoKTsKKyAgICAgIEFwcC5FbWFpbCA9IEVtYmVyLk9iamVjdC5leHRlbmQoKTsKKyAgICAg
IEFwcC5zZXNzaW9uID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSgpOworICAgICAgIEFwcC5yZWdpc3Rl
cignbW9kZWw6dXNlcicsIEFwcC5QZXJzb24sIHsgc2luZ2xldG9uOiBmYWxzZSB9KTsKKyAgICAg
IEFwcC5yZWdpc3RlcignZnJ1aXQ6ZmF2b3JpdGUnLCBBcHAuT3JhbmdlKTsKKyAgICAgIEFwcC5y
ZWdpc3RlcignY29tbXVuaWNhdGlvbjptYWluJywgQXBwLkVtYWlsLCB7IHNpbmdsZXRvbjogZmFs
c2UgfSk7CisgICAgICBBcHAucmVnaXN0ZXIoJ3Nlc3Npb24nLCBBcHAuc2Vzc2lvbiwgeyBpbnN0
YW50aWF0ZTogZmFsc2UgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlZ2lzdGVyCisg
ICAgICBAcGFyYW0gIGZ1bGxOYW1lIHtTdHJpbmd9IHR5cGU6bmFtZSAoZS5nLiwgJ21vZGVsOnVz
ZXInKQorICAgICAgQHBhcmFtICBmYWN0b3J5IHtGdW5jdGlvbn0gKGUuZy4sIEFwcC5QZXJzb24p
CisgICAgICBAcGFyYW0gIG9wdGlvbnMge09iamVjdH0gKG9wdGlvbmFsKSBkaXNhYmxlIGluc3Rh
bnRpYXRpb24gb3Igc2luZ2xldG9uIHVzYWdlCisgICAgICBAcHVibGljCisgICAgICovCisgICAg
cmVnaXN0ZXI6IHJlZ2lzdHJ5QWxpYXMoJ3JlZ2lzdGVyJyksCisKKyAgICAvKioKKyAgICAgVW5y
ZWdpc3RlciBhIGZhY3RvcnkuCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgIHZhciBBcHAgPSBF
bWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAgdmFyIFVzZXIgPSBFbWJlci5PYmplY3Qu
ZXh0ZW5kKCk7CisgICAgIEFwcC5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOworICAgICAg
QXBwLnJlc29sdmVSZWdpc3RyYXRpb24oJ21vZGVsOnVzZXInKS5jcmVhdGUoKSBpbnN0YW5jZW9m
IFVzZXIgLy89PiB0cnVlCisgICAgICBBcHAudW5yZWdpc3RlcignbW9kZWw6dXNlcicpCisgICAg
IEFwcC5yZXNvbHZlUmVnaXN0cmF0aW9uKCdtb2RlbDp1c2VyJykgPT09IHVuZGVmaW5lZCAvLz0+
IHRydWUKKyAgICAgYGBgCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgdW5yZWdpc3Rlcgor
ICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgKi8KKyAgICB1bnJlZ2lzdGVyOiBy
ZWdpc3RyeUFsaWFzKCd1bnJlZ2lzdGVyJyksCisKKyAgICAvKioKKyAgICAgQ2hlY2sgaWYgYSBm
YWN0b3J5IGlzIHJlZ2lzdGVyZWQuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgaGFzUmVn
aXN0cmF0aW9uCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICAqLworICAgIGhhc1JlZ2lzdHJhdGlvbjogcmVnaXN0cnlBbGlhcygnaGFz
JyksCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXIgYW4gb3B0aW9uIGZvciBhIHBhcnRpY3VsYXIg
ZmFjdG9yeS4KKyAgICAgIEBwdWJsaWMKKyAgICAgQG1ldGhvZCByZWdpc3Rlck9wdGlvbgorICAg
ICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKKyAgICAgQHBhcmFtIHtTdHJpbmd9IG9wdGlvbk5h
bWUKKyAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKKyAgICAgKi8KKyAgICByZWdpc3Rlck9w
dGlvbjogcmVnaXN0cnlBbGlhcygnb3B0aW9uJyksCisKKyAgICAvKioKKyAgICAgUmV0dXJuIGEg
c3BlY2lmaWMgcmVnaXN0ZXJlZCBvcHRpb24gZm9yIGEgcGFydGljdWxhciBmYWN0b3J5LgorICAg
ICAgQHB1YmxpYworICAgICBAbWV0aG9kIHJlZ2lzdGVyZWRPcHRpb24KKyAgICAgQHBhcmFtICB7
U3RyaW5nfSBmdWxsTmFtZQorICAgICBAcGFyYW0gIHtTdHJpbmd9IG9wdGlvbk5hbWUKKyAgICAg
QHJldHVybiB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXJlZE9wdGlvbjog
cmVnaXN0cnlBbGlhcygnZ2V0T3B0aW9uJyksCisKKyAgICAvKioKKyAgICAgUmVnaXN0ZXIgb3B0
aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGZhY3RvcnkuCisgICAgICBAcHVibGljCisgICAgIEBtZXRo
b2QgcmVnaXN0ZXJPcHRpb25zCisgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQorICAgICBA
cGFyYW0ge09iamVjdH0gb3B0aW9ucworICAgICAqLworICAgIHJlZ2lzdGVyT3B0aW9uczogcmVn
aXN0cnlBbGlhcygnb3B0aW9ucycpLAorCisgICAgLyoqCisgICAgIFJldHVybiByZWdpc3RlcmVk
IG9wdGlvbnMgZm9yIGEgcGFydGljdWxhciBmYWN0b3J5LgorICAgICAgQHB1YmxpYworICAgICBA
bWV0aG9kIHJlZ2lzdGVyZWRPcHRpb25zCisgICAgIEBwYXJhbSAge1N0cmluZ30gZnVsbE5hbWUK
KyAgICAgQHJldHVybiB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0ZXJlZE9w
dGlvbnM6IHJlZ2lzdHJ5QWxpYXMoJ2dldE9wdGlvbnMnKSwKKworICAgIC8qKgorICAgICBBbGxv
dyByZWdpc3RlcmluZyBvcHRpb25zIGZvciBhbGwgZmFjdG9yaWVzIG9mIGEgdHlwZS4KKyAgICAg
IGBgYGphdmFzY3JpcHQKKyAgICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OworICAgICB2YXIgYXBwSW5zdGFuY2UgPSBBcHAuYnVpbGRJbnN0YW5jZSgpOworICAgICAgLy8g
aWYgYWxsIG9mIHR5cGUgYGNvbm5lY3Rpb25gIG11c3Qgbm90IGJlIHNpbmdsZXRvbnMKKyAgICAg
YXBwSW5zdGFuY2Uub3B0aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFs
c2UgfSk7CisgICAgICBhcHBJbnN0YW5jZS5yZWdpc3RlcignY29ubmVjdGlvbjp0d2l0dGVyJywg
VHdpdHRlckNvbm5lY3Rpb24pOworICAgICBhcHBJbnN0YW5jZS5yZWdpc3RlcignY29ubmVjdGlv
bjpmYWNlYm9vaycsIEZhY2Vib29rQ29ubmVjdGlvbik7CisgICAgICB2YXIgdHdpdHRlciA9IGFw
cEluc3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7CisgICAgIHZhciB0d2l0dGVy
MiA9IGFwcEluc3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7CisgICAgICB0d2l0
dGVyID09PSB0d2l0dGVyMjsgLy8gPT4gZmFsc2UKKyAgICAgIHZhciBmYWNlYm9vayA9IGFwcElu
c3RhbmNlLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOworICAgICB2YXIgZmFjZWJvb2sy
ID0gYXBwSW5zdGFuY2UubG9va3VwKCdjb25uZWN0aW9uOmZhY2Vib29rJyk7CisgICAgICBmYWNl
Ym9vayA9PT0gZmFjZWJvb2syOyAvLyA9PiBmYWxzZQorICAgICBgYGAKKyAgICAgIEBwdWJsaWMK
KyAgICAgQG1ldGhvZCByZWdpc3Rlck9wdGlvbnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5n
fSB0eXBlCisgICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCisgICAgICovCisgICAgcmVnaXN0
ZXJPcHRpb25zRm9yVHlwZTogcmVnaXN0cnlBbGlhcygnb3B0aW9uc0ZvclR5cGUnKSwKKworICAg
IC8qKgorICAgICBSZXR1cm4gdGhlIHJlZ2lzdGVyZWQgb3B0aW9ucyBmb3IgYWxsIGZhY3Rvcmll
cyBvZiBhIHR5cGUuCisgICAgICBAcHVibGljCisgICAgIEBtZXRob2QgcmVnaXN0ZXJlZE9wdGlv
bnNGb3JUeXBlCisgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgICAgIEByZXR1cm4ge09iamVj
dH0gb3B0aW9ucworICAgICAqLworICAgIHJlZ2lzdGVyZWRPcHRpb25zRm9yVHlwZTogcmVnaXN0
cnlBbGlhcygnZ2V0T3B0aW9uc0ZvclR5cGUnKSwKKworICAgIC8qKgorICAgICAgRGVmaW5lIGEg
ZGVwZW5kZW5jeSBpbmplY3Rpb24gb250byBhIHNwZWNpZmljIGZhY3Rvcnkgb3IgYWxsIGZhY3Rv
cmllcworICAgICAgb2YgYSB0eXBlLgorICAgICAgIFdoZW4gRW1iZXIgaW5zdGFudGlhdGVzIGEg
Y29udHJvbGxlciwgdmlldywgb3Igb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudAorICAgICAgaXQg
Y2FuIGF0dGFjaCBhIGRlcGVuZGVuY3kgdG8gdGhhdCBjb21wb25lbnQuIFRoaXMgaXMgb2Z0ZW4g
dXNlZCB0bworICAgICAgcHJvdmlkZSBzZXJ2aWNlcyB0byBhIHNldCBvZiBmcmFtZXdvcmsgY29t
cG9uZW50cy4KKyAgICAgICBBbiBleGFtcGxlIG9mIHByb3ZpZGluZyBhIHNlc3Npb24gb2JqZWN0
IHRvIGFsbCBjb250cm9sbGVyczoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgQXBw
ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7CisgICAgICB2YXIgU2Vzc2lvbiA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoeyBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlIH0pOworICAgICAgIC8vIEEg
ZmFjdG9yeSBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGl0IGNhbiBiZSBpbmplY3RlZAorICAg
ICAgQXBwLnJlZ2lzdGVyKCdzZXNzaW9uOm1haW4nLCBTZXNzaW9uKTsKKyAgICAgICAvLyBJbmpl
Y3QgJ3Nlc3Npb246bWFpbicgb250byBhbGwgZmFjdG9yaWVzIG9mIHRoZSB0eXBlICdjb250cm9s
bGVyJworICAgICAgLy8gd2l0aCB0aGUgbmFtZSAnc2Vzc2lvbicKKyAgICAgIEFwcC5pbmplY3Qo
J2NvbnRyb2xsZXInLCAnc2Vzc2lvbicsICdzZXNzaW9uOm1haW4nKTsKKyAgICAgICBBcHAuSW5k
ZXhDb250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAgICAgICBpc0xvZ2dl
ZEluOiBFbWJlci5jb21wdXRlZC5hbGlhcygnc2Vzc2lvbi5pc0F1dGhlbnRpY2F0ZWQnKQorICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJbmplY3Rpb25zIGNhbiBhbHNvIGJlIHBlcmZvcm1l
ZCBvbiBzcGVjaWZpYyBmYWN0b3JpZXMuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBw
LmluamVjdCg8ZnVsbF9uYW1lIG9yIHR5cGU+LCA8cHJvcGVydHkgbmFtZT4sIDxmdWxsX25hbWU+
KQorICAgICAgQXBwLmluamVjdCgncm91dGUnLCAnc291cmNlJywgJ3NvdXJjZTptYWluJykKKyAg
ICAgIEFwcC5pbmplY3QoJ3JvdXRlOmFwcGxpY2F0aW9uJywgJ2VtYWlsJywgJ21vZGVsOmVtYWls
JykKKyAgICAgIGBgYAorICAgICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaW5qZWN0
aW9ucyBjYW4gb25seSBiZSBwZXJmb3JtZWQgb24KKyAgICAgIGNsYXNzZXMgdGhhdCBhcmUgaW5z
dGFudGlhdGVkIGJ5IEVtYmVyIGl0c2VsZi4gSW5zdGFudGlhdGluZyBhIGNsYXNzCisgICAgICBk
aXJlY3RseSAodmlhIGBjcmVhdGVgIG9yIGBuZXdgKSBieXBhc3NlcyB0aGUgZGVwZW5kZW5jeSBp
bmplY3Rpb24KKyAgICAgIHN5c3RlbS4KKyAgICAgICAqKk5vdGU6KiogRW1iZXItRGF0YSBpbnN0
YW50aWF0ZXMgaXRzIG1vZGVscyBpbiBhIHVuaXF1ZSBtYW5uZXIsIGFuZCBjb25zZXF1ZW50bHkK
KyAgICAgIGluamVjdGlvbnMgb250byBtb2RlbHMgKG9yIGFsbCBtb2RlbHMpIHdpbGwgbm90IHdv
cmsgYXMgZXhwZWN0ZWQuIEluamVjdGlvbnMKKyAgICAgIG9uIG1vZGVscyBjYW4gYmUgZW5hYmxl
ZCBieSBzZXR0aW5nIGBFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlNgCisgICAgICB0byBg
dHJ1ZWAuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBpbmplY3QKKyAgICAgIEBwYXJh
bSAgZmFjdG9yeU5hbWVPclR5cGUge1N0cmluZ30KKyAgICAgIEBwYXJhbSAgcHJvcGVydHkge1N0
cmluZ30KKyAgICAgIEBwYXJhbSAgaW5qZWN0aW9uTmFtZSB7U3RyaW5nfQorICAgICoqLworICAg
IGluamVjdDogcmVnaXN0cnlBbGlhcygnaW5qZWN0aW9uJykKKyAgfSk7CisKKyAgZnVuY3Rpb24g
cmVnaXN0cnlBbGlhcyhuYW1lKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIHZh
ciBfcmVnaXN0cnlfXzsKKworICAgICAgcmV0dXJuIChfcmVnaXN0cnlfXyA9IHRoaXMuX19yZWdp
c3RyeV9fKVtuYW1lXS5hcHBseShfcmVnaXN0cnlfXywgYXJndW1lbnRzKTsKKyAgICB9OworICB9
CisKKyAgZnVuY3Rpb24gYnVpbGRGYWtlUmVnaXN0cnlXaXRoRGVwcmVjYXRpb25zKGluc3RhbmNl
LCB0eXBlRm9yTWVzc2FnZSkgeworICAgIHZhciBmYWtlUmVnaXN0cnkgPSB7fTsKKyAgICB2YXIg
cmVnaXN0cnlQcm9wcyA9IHsKKyAgICAgIHJlc29sdmU6ICdyZXNvbHZlUmVnaXN0cmF0aW9uJywK
KyAgICAgIHJlZ2lzdGVyOiAncmVnaXN0ZXInLAorICAgICAgdW5yZWdpc3RlcjogJ3VucmVnaXN0
ZXInLAorICAgICAgaGFzOiAnaGFzUmVnaXN0cmF0aW9uJywKKyAgICAgIG9wdGlvbjogJ3JlZ2lz
dGVyT3B0aW9uJywKKyAgICAgIG9wdGlvbnM6ICdyZWdpc3Rlck9wdGlvbnMnLAorICAgICAgZ2V0
T3B0aW9uczogJ3JlZ2lzdGVyZWRPcHRpb25zJywKKyAgICAgIG9wdGlvbnNGb3JUeXBlOiAncmVn
aXN0ZXJPcHRpb25zRm9yVHlwZScsCisgICAgICBnZXRPcHRpb25zRm9yVHlwZTogJ3JlZ2lzdGVy
ZWRPcHRpb25zRm9yVHlwZScsCisgICAgICBpbmplY3Rpb246ICdpbmplY3QnCisgICAgfTsKKwor
ICAgIGZvciAodmFyIGRlcHJlY2F0ZWRQcm9wZXJ0eSBpbiByZWdpc3RyeVByb3BzKSB7CisgICAg
ICBmYWtlUmVnaXN0cnlbZGVwcmVjYXRlZFByb3BlcnR5XSA9IGJ1aWxkRmFrZVJlZ2lzdHJ5RnVu
Y3Rpb24oaW5zdGFuY2UsIHR5cGVGb3JNZXNzYWdlLCBkZXByZWNhdGVkUHJvcGVydHksIHJlZ2lz
dHJ5UHJvcHNbZGVwcmVjYXRlZFByb3BlcnR5XSk7CisgICAgfQorCisgICAgcmV0dXJuIGZha2VS
ZWdpc3RyeTsKKyAgfQorCisgIGZ1bmN0aW9uIGJ1aWxkRmFrZVJlZ2lzdHJ5RnVuY3Rpb24oaW5z
dGFuY2UsIHR5cGVGb3JNZXNzYWdlLCBkZXByZWNhdGVkUHJvcGVydHksIG5vbkRlcHJlY2F0ZWRQ
cm9wZXJ0eSkgeworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1iZXJNZXRhbERl
YnVnLmRlcHJlY2F0ZSgnVXNpbmcgYCcgKyB0eXBlRm9yTWVzc2FnZSArICcucmVnaXN0cnkuJyAr
IGRlcHJlY2F0ZWRQcm9wZXJ0eSArICdgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYCcgKyB0
eXBlRm9yTWVzc2FnZSArICcuJyArIG5vbkRlcHJlY2F0ZWRQcm9wZXJ0eSArICdgIGluc3RlYWQu
JywgZmFsc2UsIHsKKyAgICAgICAgaWQ6ICdlbWJlci1hcHBsaWNhdGlvbi5hcHAtaW5zdGFuY2Ut
cmVnaXN0cnknLAorICAgICAgICB1bnRpbDogJzMuMC4wJywKKyAgICAgICAgdXJsOiAnaHR0cDov
L2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54LyN0b2NfZW1iZXItYXBwbGljYXRpb24tcmVn
aXN0cnktZW1iZXItYXBwbGljYXRpb25pbnN0YW5jZS1yZWdpc3RyeScKKyAgICAgIH0pOworICAg
ICAgcmV0dXJuIGluc3RhbmNlW25vbkRlcHJlY2F0ZWRQcm9wZXJ0eV0uYXBwbHkoaW5zdGFuY2Us
IGFyZ3VtZW50cyk7CisgICAgfTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvbWl4
aW5zL3RhcmdldF9hY3Rpb25fc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3Jl
JywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJl
ci1tZXRhbC9taXhpbicsICdlbWJlci1tZXRhbC9jb21wdXRlZCddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxDb21wdXRlZCkgeworICAvKioKKyAg
QG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgLyoqCisgIGBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1p
eGluIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xhc3MKKyAgdG8gYWRkIGEgYHRyaWdnZXJB
Y3Rpb25gIG1ldGhvZCB3aXRoIHNlbWFudGljcyBzaW1pbGFyIHRvIHRoZSBIYW5kbGViYXJzCisg
IGB7e2FjdGlvbn19YCBoZWxwZXIuIEluIG5vcm1hbCBFbWJlciB1c2FnZSwgdGhlIGB7e2FjdGlv
bn19YCBoZWxwZXIgaXMKKyAgdXN1YWxseSB0aGUgYmVzdCBjaG9pY2UuIFRoaXMgbWl4aW4gaXMg
bW9zdCBvZnRlbiB1c2VmdWwgd2hlbiB5b3UgYXJlCisgIGRvaW5nIG1vcmUgY29tcGxleCBldmVu
dCBoYW5kbGluZyBpbiBWaWV3IG9iamVjdHMuCisgIAorICBTZWUgYWxzbyBgRW1iZXIuVmlld1Rh
cmdldEFjdGlvblN1cHBvcnRgLCB3aGljaCBoYXMKKyAgdmlldy1hd2FyZSBkZWZhdWx0cyBmb3Ig
dGFyZ2V0IGFuZCBhY3Rpb25Db250ZXh0LgorICAKKyAgQGNsYXNzIFRhcmdldEFjdGlvblN1cHBv
cnQKKyAgQG5hbWVzcGFjZSBFbWJlcgorICBAZXh0ZW5kcyBFbWJlci5NaXhpbgorICBAcHJpdmF0
ZQorICAqLworICB2YXIgVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IF9lbWJlck1ldGFsTWl4aW4uTWl4
aW4uY3JlYXRlKHsKKyAgICB0YXJnZXQ6IG51bGwsCisgICAgYWN0aW9uOiBudWxsLAorICAgIGFj
dGlvbkNvbnRleHQ6IG51bGwsCisKKyAgICB0YXJnZXRPYmplY3Q6IF9lbWJlck1ldGFsQ29tcHV0
ZWQuY29tcHV0ZWQoJ3RhcmdldCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl90YXJn
ZXRPYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldE9iamVjdDsKKyAgICAgIH0K
KworICAgICAgdmFyIHRhcmdldCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
dGFyZ2V0Jyk7CisKKyAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykgeworICAg
ICAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgdGFyZ2V0
KTsKKyAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB2YWx1ZSA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5sb29r
dXAsIHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9
IGVsc2UgeworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgfQorICAgIH0pLAorCisgICAg
YWN0aW9uQ29udGV4dE9iamVjdDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZChmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYWN0aW9uQ29udGV4dCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnYWN0aW9uQ29udGV4dCcpOworCisgICAgICBpZiAodHlwZW9mIGFjdGlvbkNv
bnRleHQgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCBhY3Rpb25Db250ZXh0KTsKKyAgICAgICAgaWYgKHZhbHVlID09
PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB2YWx1ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5sb29rdXAsIGFjdGlvbkNvbnRleHQpOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJl
dHVybiBhY3Rpb25Db250ZXh0OworICAgICAgfQorICAgIH0pLnByb3BlcnR5KCdhY3Rpb25Db250
ZXh0JyksCisKKyAgICAvKioKKyAgICBTZW5kIGFuIGBhY3Rpb25gIHdpdGggYW4gYGFjdGlvbkNv
bnRleHRgIHRvIGEgYHRhcmdldGAuIFRoZSBhY3Rpb24sIGFjdGlvbkNvbnRleHQKKyAgICBhbmQg
dGFyZ2V0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LiBG
b3IgZXhhbXBsZToKKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9uVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICAgIHRh
cmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKKyAgICAgIGFjdGlvbjog
J3NhdmUnLAorICAgICAgYWN0aW9uQ29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRl
eHQnKSwKKyAgICAgIGNsaWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0
aW9uKCk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50
IGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50
IGNvbnRyb2xsZXIKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgICAgVGhlIGB0YXJnZXRg
LCBgYWN0aW9uYCwgYW5kIGBhY3Rpb25Db250ZXh0YCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJvcGVy
dGllcyBvZgorICAgIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1bWVudCB0byBgdHJpZ2dlckFjdGlv
bmAgYXMgd2VsbC4KKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9uVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAgICAgIGNs
aWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKKyAgICAgICAg
ICBhY3Rpb246ICdzYXZlJywKKyAgICAgICAgICB0YXJnZXQ6IHRoaXMuZ2V0KCdjb250cm9sbGVy
JyksCisgICAgICAgICAgYWN0aW9uQ29udGV4dDogdGhpcy5nZXQoJ2NvbnRleHQnKQorICAgICAg
ICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQg
Y29udGV4dAorICAgICAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgorICAgICAg
fQorICAgIH0pOworICAgIGBgYAorICAgICBUaGUgYGFjdGlvbkNvbnRleHRgIGRlZmF1bHRzIHRv
IHRoZSBvYmplY3QgeW91IGFyZSBtaXhpbmcgYFRhcmdldEFjdGlvblN1cHBvcnRgIGludG8uCisg
ICAgQnV0IGB0YXJnZXRgIGFuZCBgYWN0aW9uYCBtdXN0IGJlIHNwZWNpZmllZCBlaXRoZXIgYXMg
cHJvcGVydGllcyBvciB3aXRoIHRoZSBhcmd1bWVudAorICAgIHRvIGB0cmlnZ2VyQWN0aW9uYCwg
b3IgYSBjb21iaW5hdGlvbjoKKyAgICAgYGBgamF2YXNjcmlwdAorICAgIEFwcC5TYXZlQnV0dG9u
VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKKyAg
ICAgIHRhcmdldDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKKyAgICAgIGNs
aWNrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKKyAgICAgICAg
ICBhY3Rpb246ICdzYXZlJworICAgICAgICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24s
IGFsb25nIHdpdGggYSByZWZlcmVuY2UgdG8gYHRoaXNgLAorICAgICAgICAgICAgLy8gdG8gdGhl
IGN1cnJlbnQgY29udHJvbGxlcgorICAgICAgfQorICAgIH0pOworICAgIGBgYAorICAgICBAbWV0
aG9kIHRyaWdnZXJBY3Rpb24KKyAgICBAcGFyYW0gb3B0cyB7T2JqZWN0fSAob3B0aW9uYWwsIHdp
dGggdGhlIG9wdGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQgYW5kL29yIGFjdGlvbkNvbnRleHQp
CisgICAgQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYWN0aW9uIHdhcyBzZW50IHN1Y2Nl
c3NmdWxseSBhbmQgZGlkIG5vdCByZXR1cm4gZmFsc2UKKyAgICBAcHJpdmF0ZQorICAgICovCisg
ICAgdHJpZ2dlckFjdGlvbjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIG9wdHMgPSBhcmd1bWVu
dHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3Vt
ZW50c1swXTsKKworICAgICAgdmFyIGFjdGlvbiA9IG9wdHMuYWN0aW9uIHx8IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYWN0aW9uJyk7CisgICAgICB2YXIgdGFyZ2V0ID0gb3B0
cy50YXJnZXQgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICd0YXJnZXRPYmpl
Y3QnKTsKKyAgICAgIHZhciBhY3Rpb25Db250ZXh0ID0gb3B0cy5hY3Rpb25Db250ZXh0OworCisg
ICAgICBmdW5jdGlvbiBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsKKyAgICAgICAgdmFyIHJl
dCA9IFtdOworICAgICAgICBpZiAoYWN0aW9uTmFtZSkgeworICAgICAgICAgIHJldC5wdXNoKGFj
dGlvbk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldC5jb25jYXQob3B0aW9u
cyk7CisgICAgICB9CisKKyAgICAgIGlmICh0eXBlb2YgYWN0aW9uQ29udGV4dCA9PT0gJ3VuZGVm
aW5lZCcpIHsKKyAgICAgICAgYWN0aW9uQ29udGV4dCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnYWN0aW9uQ29udGV4dE9iamVjdCcpIHx8IHRoaXM7CisgICAgICB9CisKKyAg
ICAgIGlmICh0YXJnZXQgJiYgYWN0aW9uKSB7CisgICAgICAgIHZhciByZXQ7CisKKyAgICAgICAg
aWYgKHRhcmdldC5zZW5kKSB7CisgICAgICAgICAgcmV0ID0gdGFyZ2V0LnNlbmQuYXBwbHkodGFy
Z2V0LCBhcmdzKGFjdGlvbkNvbnRleHQsIGFjdGlvbikpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdUaGUgYWN0aW9uIFwnJyArIGFjdGlvbiAr
ICdcJyBkaWQgbm90IGV4aXN0IG9uICcgKyB0YXJnZXQsIHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9
PT0gJ2Z1bmN0aW9uJyk7CisgICAgICAgICAgcmV0ID0gdGFyZ2V0W2FjdGlvbl0uYXBwbHkodGFy
Z2V0LCBhcmdzKGFjdGlvbkNvbnRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQg
IT09IGZhbHNlKSB7CisgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiByZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICB9CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBUYXJnZXRBY3Rpb25TdXBw
b3J0OworfSk7CisvLyBFbWJlci5sb29rdXAKK2VuaWZlZCgiZW1iZXItcnVudGltZS9zdHJpbmdf
cmVnaXN0cnkiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLy8gU1RBVEUg
d2l0aGluIGEgbW9kdWxlIGlzIGZyb3duZWQgYXBvbiwgdGhpcyBleGlzdHMKKyAgLy8gdG8gc3Vw
cG9ydCBFbWJlci5TVFJJTkdTIGJ1dCBzaGllbGQgZW1iZXIgaW50ZXJuYWxzIGZyb20gdGhpcyBs
ZWdhY3kgZ2xvYmFsCisgIC8vIEFQSS4KKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMuc2V0
U3RyaW5ncyA9IHNldFN0cmluZ3M7CisgIGV4cG9ydHMuZ2V0U3RyaW5ncyA9IGdldFN0cmluZ3M7
CisgIGV4cG9ydHMuZ2V0ID0gZ2V0OworICB2YXIgU1RSSU5HUyA9IHt9OworCisgIGZ1bmN0aW9u
IHNldFN0cmluZ3Moc3RyaW5ncykgeworICAgIFNUUklOR1MgPSBzdHJpbmdzOworICB9CisKKyAg
ZnVuY3Rpb24gZ2V0U3RyaW5ncygpIHsKKyAgICByZXR1cm4gU1RSSU5HUzsKKyAgfQorCisgIGZ1
bmN0aW9uIGdldChuYW1lKSB7CisgICAgcmV0dXJuIFNUUklOR1NbbmFtZV07CisgIH0KK30pOwor
ZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9hcHBsaWNhdGlvbicsIFsnZXhwb3J0cycsICdl
bWJlci1ydW50aW1lL3N5c3RlbS9uYW1lc3BhY2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJl
clJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1OYW1lc3BhY2UuZGVmYXVsdC5leHRlbmQoKTsK
K30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9hcnJheV9wcm94eScsIFsnZXhwb3J0
cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1i
ZXItcnVudGltZS91dGlscycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9t
aXhpbicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9ldmVudHMnLCAnZW1iZXItbWV0YWwvZXJyb3In
LCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL211
dGFibGVfYXJyYXknLCAnZW1iZXItcnVudGltZS9taXhpbnMvZW51bWVyYWJsZScsICdlbWJlci1t
ZXRhbC9hbGlhcycsICdlbWJlci1ydW50aW1lL21peGlucy9hcnJheSddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1
bnRpbWVVdGlscywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9ldmVudHMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlclJ1bnRpbWVTeXN0
ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJSdW50aW1l
TWl4aW5zRW51bWVyYWJsZSwgX2VtYmVyTWV0YWxBbGlhcywgX2VtYmVyUnVudGltZU1peGluc0Fy
cmF5KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICB2YXIgT1VUX09GX1JBTkdFX0VYQ0VQVElP
TiA9ICdJbmRleCBvdXQgb2YgcmFuZ2UnOworICB2YXIgRU1QVFkgPSBbXTsKKworICBmdW5jdGlv
biBLKCkgeworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAgQW4gQXJyYXlQcm94
eSB3cmFwcyBhbnkgb3RoZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFu
ZC9vcgorICAgIGBFbWJlci5NdXRhYmxlQXJyYXksYCBmb3J3YXJkaW5nIGFsbCByZXF1ZXN0cy4g
VGhpcyBtYWtlcyBpdCB2ZXJ5IHVzZWZ1bCBmb3IKKyAgICBhIG51bWJlciBvZiBiaW5kaW5nIHVz
ZSBjYXNlcyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKKyAgICBvdXQg
dGhlIHVuZGVybHlpbmcgYXJyYXkgaXMgdXNlZnVsLgorICAKKyAgICBBIHNpbXBsZSBleGFtcGxl
IG9mIHVzYWdlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHBldHMgPSBbJ2RvZycs
ICdjYXQnLCAnZmlzaCddOworICAgIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsg
Y29udGVudDogRW1iZXIuQShwZXRzKSB9KTsKKyAgCisgICAgYXAuZ2V0KCdmaXJzdE9iamVjdCcp
OyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdkb2cnCisgICAgYXAuc2V0KCdjb250ZW50Jywg
WydhbW9lYmEnLCAncGFyYW1lY2l1bSddKTsKKyAgICBhcC5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gJ2Ftb2ViYScKKyAgICBgYGAKKyAgCisgICAgVGhpcyBj
bGFzcyBjYW4gYWxzbyBiZSB1c2VmdWwgYXMgYSBsYXllciB0byB0cmFuc2Zvcm0gdGhlIGNvbnRl
bnRzIG9mCisgICAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFjY2Vzc2VkLiBUaGlzIGNhbiBiZSBk
b25lIGJ5IG92ZXJyaWRpbmcKKyAgICBgb2JqZWN0QXRDb250ZW50YDoKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIHZhciBwZXRzID0gWydkb2cnLCAnY2F0JywgJ2Zpc2gnXTsKKyAgICB2YXIg
YXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7CisgICAgICAgIGNvbnRlbnQ6IEVtYmVyLkEo
cGV0cyksCisgICAgICAgIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7CisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbnRlbnQnKS5vYmplY3RBdChpZHgpLnRvVXBwZXJDYXNl
KCk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgCisgICAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAv
LyAuICdET0cnCisgICAgYGBgCisgIAorICAgIEBjbGFzcyBBcnJheVByb3h5CisgICAgQG5hbWVz
cGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEB1c2VzIEVtYmVyLk11
dGFibGVBcnJheQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIEFycmF5UHJveHkgPSBfZW1iZXJS
dW50aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRh
YmxlX2FycmF5LmRlZmF1bHQsIHsKKworICAgIC8qKgorICAgICAgVGhlIGNvbnRlbnQgYXJyYXku
IE11c3QgYmUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgIGFuZC9vcgor
ICAgICAgYEVtYmVyLk11dGFibGVBcnJheS5gCisgICAgICAgQHByb3BlcnR5IGNvbnRlbnQKKyAg
ICAgIEB0eXBlIEVtYmVyLkFycmF5CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29udGVu
dDogbnVsbCwKKworICAgIC8qKgorICAgICBUaGUgYXJyYXkgdGhhdCB0aGUgcHJveHkgcHJldGVu
ZHMgdG8gYmUuIEluIHRoZSBkZWZhdWx0IGBBcnJheVByb3h5YAorICAgICBpbXBsZW1lbnRhdGlv
biwgdGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBgQXJyYXlQ
cm94eWAKKyAgICAgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgdG8gcHJvdmlkZSB0aGluZ3Mg
bGlrZSBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcuCisgICAgICBAcHJvcGVydHkgYXJyYW5nZWRDb250
ZW50CisgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhcnJhbmdlZENvbnRlbnQ6IF9lbWJlck1l
dGFsQWxpYXMuZGVmYXVsdCgnY29udGVudCcpLAorCisgICAgLyoqCisgICAgICBTaG91bGQgYWN0
dWFsbHkgcmV0cmlldmUgdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhl
CisgICAgICBjb250ZW50LiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNz
ZXMgdG8gdHJhbnNmb3JtIHRoZQorICAgICAgY29udGVudCBpdGVtIHRvIHNvbWV0aGluZyBuZXcu
CisgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjb250ZW50IGlzIG5v
bi1gbnVsbGAuCisgICAgICAgQG1ldGhvZCBvYmplY3RBdENvbnRlbnQKKyAgICAgIEBwYXJhbSB7
TnVtYmVyfSBpZHggVGhlIGluZGV4IHRvIHJldHJpZXZlLgorICAgICAgQHJldHVybiB7T2JqZWN0
fSB0aGUgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vbmUgZm91bmQKKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkub2JqZWN0QXQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwgaWR4KTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBTaG91bGQgYWN0dWFsbHkgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgb24g
dGhlIGNvbnRlbnQgYXJyYXkuCisgICAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlu
IHN1YmNsYXNzZXMgdG8gdHJhbnNmb3JtIHRoZSBjb250ZW50IGl0ZW0KKyAgICAgIGludG8gc29t
ZXRoaW5nIG5ldy4KKyAgICAgICBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNv
bnRlbnQgaXMgbm9uLWBudWxsYC4KKyAgICAgICBAbWV0aG9kIHJlcGxhY2VDb250ZW50CisgICAg
ICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBzdGFydGluZyBpbmRleAorICAgICAgQHBhcmFtIHtO
dW1iZXJ9IGFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBjb250ZW50
LgorICAgICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBPcHRpb25hbCBhcnJheSBvZiBvYmplY3Rz
IHRvIGluc2VydCBvciBudWxsIGlmIG5vCisgICAgICAgIG9iamVjdHMuCisgICAgICBAcmV0dXJu
IHt2b2lkfQorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHJlcGxhY2VDb250ZW50OiBmdW5j
dGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LmdldCh0aGlzLCAnY29udGVudCcpLnJlcGxhY2UoaWR4LCBhbXQsIG9iamVjdHMpOworICAgIH0s
CisKKyAgICAvKioKKyAgICAgIEludm9rZWQgd2hlbiB0aGUgY29udGVudCBwcm9wZXJ0eSBpcyBh
Ym91dCB0byBjaGFuZ2UuIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IHRoZQorICAgICAgZW50aXJl
IGFycmF5IGNvbnRlbnQgd2lsbCBjaGFuZ2UuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgX2NvbnRlbnRXaWxsQ2hhbmdlCisgICAgKi8KKyAgICBfY29udGVudFdpbGxDaGFuZ2U6IF9l
bWJlck1ldGFsTWl4aW4uX2JlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24gKCkgewor
ICAgICAgdGhpcy5fdGVhcmRvd25Db250ZW50KCk7CisgICAgfSksCisKKyAgICBfdGVhcmRvd25D
b250ZW50OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudCcpOworCisgICAgICBpZiAoY29udGVudCkgewor
ICAgICAgICBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkucmVtb3ZlQXJyYXlPYnNlcnZlcihjb250
ZW50LCB0aGlzLCB7CisgICAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFu
Z2UnLAorICAgICAgICAgIGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURpZENoYW5nZScKKyAgICAg
ICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdG8gaW1w
bGVtZW50IGNvbnRlbnQgYXJyYXkgYHdpbGxDaGFuZ2VgIG9ic2VydmVyLgorICAgICAgIEBtZXRo
b2QgY29udGVudEFycmF5V2lsbENoYW5nZQorICAgICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IGNv
bnRlbnRBcnJheSB0aGUgY29udGVudCBhcnJheQorICAgICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0
IHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSByZW1v
dmVDb3VudCBjb3VudCBvZiBpdGVtcyByZW1vdmVkCisgICAgICBAcGFyYW0ge051bWJlcn0gYWRk
Q291bnQgY291bnQgb2YgaXRlbXMgYWRkZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBj
b250ZW50QXJyYXlXaWxsQ2hhbmdlOiBLLAorICAgIC8qKgorICAgICAgT3ZlcnJpZGUgdG8gaW1w
bGVtZW50IGNvbnRlbnQgYXJyYXkgYGRpZENoYW5nZWAgb2JzZXJ2ZXIuCisgICAgICAgQG1ldGhv
ZCBjb250ZW50QXJyYXlEaWRDaGFuZ2UKKyAgICAgICBAcGFyYW0ge0VtYmVyLkFycmF5fSBjb250
ZW50QXJyYXkgdGhlIGNvbnRlbnQgYXJyYXkKKyAgICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFydCBz
dGFydGluZyBpbmRleCBvZiB0aGUgY2hhbmdlCisgICAgICBAcGFyYW0ge051bWJlcn0gcmVtb3Zl
Q291bnQgY291bnQgb2YgaXRlbXMgcmVtb3ZlZAorICAgICAgQHBhcmFtIHtOdW1iZXJ9IGFkZENv
dW50IGNvdW50IG9mIGl0ZW1zIGFkZGVkCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29u
dGVudEFycmF5RGlkQ2hhbmdlOiBLLAorCisgICAgLyoqCisgICAgICBJbnZva2VkIHdoZW4gdGhl
IGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgdGhlCisg
ICAgICBlbnRpcmUgYXJyYXkgY29udGVudCBoYXMgY2hhbmdlZC4KKyAgICAgICBAcHJpdmF0ZQor
ICAgICAgQG1ldGhvZCBfY29udGVudERpZENoYW5nZQorICAgICovCisgICAgX2NvbnRlbnREaWRD
aGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbiAoKSB7
CisgICAgICB2YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
Y29udGVudCcpOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FuXCd0IHNldCBB
cnJheVByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgY29udGVudCAhPT0gdGhpcyk7CisKKyAg
ICAgIHRoaXMuX3NldHVwQ29udGVudCgpOworICAgIH0pLAorCisgICAgX3NldHVwQ29udGVudDog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNvbnRlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dl
dC5nZXQodGhpcywgJ2NvbnRlbnQnKTsKKworICAgICAgaWYgKGNvbnRlbnQpIHsKKyAgICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0FycmF5UHJveHkgZXhwZWN0cyBhbiBBcnJheSBvciBF
bWJlci5BcnJheVByb3h5LCBidXQgeW91IHBhc3NlZCAnICsgdHlwZW9mIGNvbnRlbnQsIF9lbWJl
clJ1bnRpbWVVdGlscy5pc0FycmF5KGNvbnRlbnQpIHx8IGNvbnRlbnQuaXNEZXN0cm95ZWQpOwor
CisgICAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRBcnJheU9ic2VydmVyKGNvbnRl
bnQsIHRoaXMsIHsKKyAgICAgICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5n
ZScsCisgICAgICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAg
ICB9KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6
IF9lbWJlck1ldGFsTWl4aW4uX2JlZm9yZU9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5j
dGlvbiAoKSB7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgIHZhciBsZW4gPSBhcnJh
bmdlZENvbnRlbnQgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJyYW5nZWRDb250ZW50
LCAnbGVuZ3RoJykgOiAwOworCisgICAgICB0aGlzLmFycmFuZ2VkQ29udGVudEFycmF5V2lsbENo
YW5nZSh0aGlzLCAwLCBsZW4sIHVuZGVmaW5lZCk7CisgICAgICB0aGlzLmFycmFuZ2VkQ29udGVu
dFdpbGxDaGFuZ2UodGhpcyk7CisKKyAgICAgIHRoaXMuX3RlYXJkb3duQXJyYW5nZWRDb250ZW50
KGFycmFuZ2VkQ29udGVudCk7CisgICAgfSksCisKKyAgICBfYXJyYW5nZWRDb250ZW50RGlkQ2hh
bmdlOiBfZW1iZXJNZXRhbE1peGluLm9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgIHZhciBsZW4gPSBhcnJhbmdl
ZENvbnRlbnQgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoYXJyYW5nZWRDb250ZW50LCAn
bGVuZ3RoJykgOiAwOworCisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ2FuXCd0IHNl
dCBBcnJheVByb3h5XCdzIGNvbnRlbnQgdG8gaXRzZWxmJywgYXJyYW5nZWRDb250ZW50ICE9PSB0
aGlzKTsKKworICAgICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKKworICAgICAgdGhp
cy5hcnJhbmdlZENvbnRlbnREaWRDaGFuZ2UodGhpcyk7CisgICAgICB0aGlzLmFycmFuZ2VkQ29u
dGVudEFycmF5RGlkQ2hhbmdlKHRoaXMsIDAsIHVuZGVmaW5lZCwgbGVuKTsKKyAgICB9KSwKKwor
ICAgIF9zZXR1cEFycmFuZ2VkQ29udGVudDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFycmFu
Z2VkQ29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYXJyYW5nZWRD
b250ZW50Jyk7CisKKyAgICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKKyAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0FycmF5UHJveHkgZXhwZWN0cyBhbiBBcnJheSBvciBFbWJlci5B
cnJheVByb3h5LCBidXQgeW91IHBhc3NlZCAnICsgdHlwZW9mIGFycmFuZ2VkQ29udGVudCwgX2Vt
YmVyUnVudGltZVV0aWxzLmlzQXJyYXkoYXJyYW5nZWRDb250ZW50KSB8fCBhcnJhbmdlZENvbnRl
bnQuaXNEZXN0cm95ZWQpOworCisgICAgICAgIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5hZGRB
cnJheU9ic2VydmVyKGFycmFuZ2VkQ29udGVudCwgdGhpcywgeworICAgICAgICAgIHdpbGxDaGFu
Z2U6ICdhcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2UnLAorICAgICAgICAgIGRpZENoYW5n
ZTogJ2FycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJworICAgICAgICB9KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgX3RlYXJkb3duQXJyYW5nZWRDb250ZW50OiBmdW5jdGlvbiAoKSB7Cisg
ICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRo
aXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKworICAgICAgaWYgKGFycmFuZ2VkQ29udGVudCkgewor
ICAgICAgICBfZW1iZXJSdW50aW1lTWl4aW5zQXJyYXkucmVtb3ZlQXJyYXlPYnNlcnZlcihhcnJh
bmdlZENvbnRlbnQsIHRoaXMsIHsKKyAgICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRDb250
ZW50QXJyYXlXaWxsQ2hhbmdlJywKKyAgICAgICAgICBkaWRDaGFuZ2U6ICdhcnJhbmdlZENvbnRl
bnRBcnJheURpZENoYW5nZScKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIGFy
cmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEssCisgICAgYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdl
OiBLLAorCisgICAgb2JqZWN0QXQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVybiBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2NvbnRlbnQnKSAmJiB0aGlzLm9iamVjdEF0
Q29udGVudChpZHgpOworICAgIH0sCisKKyAgICBsZW5ndGg6IF9lbWJlck1ldGFsQ29tcHV0ZWQu
Y29tcHV0ZWQoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CisgICAgICBy
ZXR1cm4gYXJyYW5nZWRDb250ZW50ID8gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGFycmFu
Z2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKKyAgICAgIC8vIE5vIGRlcGVuZGVuY2llcyBzaW5j
ZSBFbnVtZXJhYmxlIG5vdGlmaWVzIGxlbmd0aCBvZiBjaGFuZ2UKKyAgICB9KSwKKworICAgIF9y
ZXBsYWNlOiBmdW5jdGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIHZhciBjb250ZW50
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50Jyk7CisgICAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVGhlIGNvbnRlbnQgcHJvcGVydHkgb2YgJyArIHRoaXMu
Y29uc3RydWN0b3IgKyAnIHNob3VsZCBiZSBzZXQgYmVmb3JlIG1vZGlmeWluZyBpdCcsIGNvbnRl
bnQpOworICAgICAgaWYgKGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5yZXBsYWNlQ29udGVudChp
ZHgsIGFtdCwgb2JqZWN0cyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0s
CisKKyAgICByZXBsYWNlOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSA9PT0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250ZW50JykpIHsKKyAgICAgICAgdGhpcy5fcmVwbGFjZS5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3
IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnVXNpbmcgcmVwbGFjZSBvbiBhbiBhcnJhbmdlZCBB
cnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLicpOworICAgICAgfQorICAgIH0sCisKKyAgICBfaW5z
ZXJ0QXQ6IGZ1bmN0aW9uIChpZHgsIG9iamVjdCkgeworICAgICAgaWYgKGlkeCA+IF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudC5sZW5ndGgnKSkgeworICAgICAgICB0
aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KE9VVF9PRl9SQU5HRV9FWENFUFRJT04p
OworICAgICAgfQorCisgICAgICB0aGlzLl9yZXBsYWNlKGlkeCwgMCwgW29iamVjdF0pOworICAg
ICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIGluc2VydEF0OiBmdW5jdGlvbiAoaWR4LCBv
YmplY3QpIHsKKyAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Fy
cmFuZ2VkQ29udGVudCcpID09PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2Nv
bnRlbnQnKSkgeworICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnVXNpbmcgaW5zZXJ0QXQgb24gYW4gYXJyYW5nZWQgQXJyYXlQcm94eSBpcyBub3QgYWxsb3dl
ZC4nKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChzdGFydCwg
bGVuKSB7CisgICAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkgeworICAgICAgICB2
YXIgY29udGVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY29udGVudCcp
OworICAgICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKKyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsK
KyAgICAgICAgdmFyIGk7CisKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xlbmd0aCcpKSB7CisgICAgICAgICAgdGhy
b3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdChPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OKTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAg
IGxlbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIGluZGljZXMg
aW4gb3JpZ2luYWwgY29udGVudCB0byByZW1vdmUKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkg
PCBzdGFydCArIGxlbjsgaSsrKSB7CisgICAgICAgICAgLy8gVXNlIGFycmFuZ2VkQ29udGVudCBo
ZXJlIHNvIHdlIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIG9iamVjdHMgdHJhbnNmb3JtZWQgYnkgb2Jq
ZWN0QXRDb250ZW50CisgICAgICAgICAgaW5kaWNlcy5wdXNoKGNvbnRlbnQuaW5kZXhPZihfZW1i
ZXJSdW50aW1lTWl4aW5zQXJyYXkub2JqZWN0QXQoYXJyYW5nZWRDb250ZW50LCBpKSkpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIGluZGlj
ZXMgd2lsbCBjaGFuZ2UKKyAgICAgICAgaW5kaWNlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7Cisg
ICAgICAgICAgcmV0dXJuIGIgLSBhOworICAgICAgICB9KTsKKworICAgICAgICBfZW1iZXJNZXRh
bFByb3BlcnR5X2V2ZW50cy5iZWdpblByb3BlcnR5Q2hhbmdlcygpOworICAgICAgICBmb3IgKGkg
PSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHRoaXMuX3JlcGxhY2Uo
aW5kaWNlc1tpXSwgMSwgRU1QVFkpOworICAgICAgICB9CisgICAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfZXZlbnRzLmVuZFByb3BlcnR5Q2hhbmdlcygpOworICAgICAgfQorCisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgcHVzaE9iamVjdDogZnVuY3Rpb24gKG9iaikgeworICAg
ICAgdGhpcy5faW5zZXJ0QXQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdjb250
ZW50Lmxlbmd0aCcpLCBvYmopOworICAgICAgcmV0dXJuIG9iajsKKyAgICB9LAorCisgICAgcHVz
aE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7CisgICAgICBpZiAoIShfZW1iZXJSdW50aW1l
TWl4aW5zRW51bWVyYWJsZS5kZWZhdWx0LmRldGVjdChvYmplY3RzKSB8fCBfZW1iZXJSdW50aW1l
VXRpbHMuaXNBcnJheShvYmplY3RzKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcign
TXVzdCBwYXNzIEVtYmVyLkVudW1lcmFibGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1c2hPYmpl
Y3RzJyk7CisgICAgICB9CisgICAgICB0aGlzLl9yZXBsYWNlKF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCAnbGVuZ3RoJyksIDAsIG9iamVjdHMpOworICAgICAgcmV0dXJuIHRoaXM7
CisgICAgfSwKKworICAgIHNldE9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3RzKSB7CisgICAgICBp
ZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKTsK
KyAgICAgIH0KKworICAgICAgdmFyIGxlbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0
aGlzLCAnbGVuZ3RoJyk7CisgICAgICB0aGlzLl9yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgdW5zaGlmdE9iamVjdDogZnVuY3Rpb24g
KG9iaikgeworICAgICAgdGhpcy5faW5zZXJ0QXQoMCwgb2JqKTsKKyAgICAgIHJldHVybiBvYmo7
CisgICAgfSwKKworICAgIHVuc2hpZnRPYmplY3RzOiBmdW5jdGlvbiAob2JqZWN0cykgeworICAg
ICAgdGhpcy5fcmVwbGFjZSgwLCAwLCBvYmplY3RzKTsKKyAgICAgIHJldHVybiB0aGlzOworICAg
IH0sCisKKyAgICBzbGljZTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGFyciA9IHRoaXMudG9B
cnJheSgpOworICAgICAgcmV0dXJuIGFyci5zbGljZS5hcHBseShhcnIsIGFyZ3VtZW50cyk7Cisg
ICAgfSwKKworICAgIGFycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24gKGl0
ZW0sIGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKKyAgICAgIHRoaXMuYXJyYXlDb250ZW50
V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KTsKKyAgICB9LAorCisgICAgYXJy
YW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uIChpdGVtLCBpZHgsIHJlbW92ZWRD
bnQsIGFkZGVkQ250KSB7CisgICAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5nZShpZHgsIHJl
bW92ZWRDbnQsIGFkZGVkQ250KTsKKyAgICB9LAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgewor
ICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIHRoaXMuX3Nl
dHVwQ29udGVudCgpOworICAgICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKKyAgICB9
LAorCisgICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3RlYXJkb3du
QXJyYW5nZWRDb250ZW50KCk7CisgICAgICB0aGlzLl90ZWFyZG93bkNvbnRlbnQoKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IEFycmF5UHJveHk7Cit9KTsKK2VuaWZlZCgn
ZW1iZXItcnVudGltZS9zeXN0ZW0vY29udGFpbmVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L3Byb3BlcnR5X3NldCcsICdjb250YWluZXIvcmVnaXN0cnknLCAnY29udGFpbmVyL2NvbnRhaW5l
cicsICdjb250YWluZXIvb3duZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LCBfY29udGFpbmVyUmVnaXN0cnksIF9jb250YWluZXJDb250YWluZXIsIF9jb250
YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgX2NvbnRhaW5lclJlZ2lzdHJ5LmRl
ZmF1bHQuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworICBfY29udGFpbmVyQ29u
dGFpbmVyLmRlZmF1bHQuc2V0ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9zZXQuc2V0OworCisgIGV4
cG9ydHMuUmVnaXN0cnkgPSBfY29udGFpbmVyUmVnaXN0cnkuZGVmYXVsdDsKKyAgZXhwb3J0cy5D
b250YWluZXIgPSBfY29udGFpbmVyQ29udGFpbmVyLmRlZmF1bHQ7CisgIGV4cG9ydHMuZ2V0T3du
ZXIgPSBfY29udGFpbmVyT3duZXIuZ2V0T3duZXI7CisgIGV4cG9ydHMuc2V0T3duZXIgPSBfY29u
dGFpbmVyT3duZXIuc2V0T3duZXI7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9zeXN0ZW0v
Y29yZV9vYmplY3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvZmVhdHVyZXMnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5
X2dldCcsICdlbWJlci1tZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9tZXRhJywgJ2VtYmVyLW1l
dGFsL2NoYWlucycsICdlbWJlci1tZXRhbC9ldmVudHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAn
ZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItcnVudGltZS9taXhpbnMvYWN0aW9uX2hhbmRsZXIn
LCAnZW1iZXItbWV0YWwvcHJvcGVydGllcycsICdlbWJlci1tZXRhbC9iaW5kaW5nJywgJ2VtYmVy
LW1ldGFsL2NvbXB1dGVkJywgJ2VtYmVyLW1ldGFsL2luamVjdGVkX3Byb3BlcnR5JywgJ2VtYmVy
LW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLW1ldGFsL3dhdGNoaW5nJywgJ2VtYmVyLW1ldGFsL2Nv
cmUnLCAnZW1iZXItcnVudGltZS9pbmplY3QnLCAnZW1iZXItbWV0YWwvc3ltYm9sJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEZlYXR1cmVzLCBfZW1i
ZXJNZXRhbEFzc2lnbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsVXRpbHMs
IF9lbWJlck1ldGFsTWV0YSwgX2VtYmVyTWV0YWxDaGFpbnMsIF9lbWJlck1ldGFsRXZlbnRzLCBf
ZW1iZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJSdW50aW1lTWl4aW5zQWN0
aW9uX2hhbmRsZXIsIF9lbWJlck1ldGFsUHJvcGVydGllcywgX2VtYmVyTWV0YWxCaW5kaW5nLCBf
ZW1iZXJNZXRhbENvbXB1dGVkLCBfZW1iZXJNZXRhbEluamVjdGVkX3Byb3BlcnR5LCBfZW1iZXJN
ZXRhbFJ1bl9sb29wLCBfZW1iZXJNZXRhbFdhdGNoaW5nLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJl
clJ1bnRpbWVJbmplY3QsIF9lbWJlck1ldGFsU3ltYm9sKSB7CisgICdubyB1c2Ugc3RyaWN0JzsK
KyAgLy8gUmVtb3ZlICJ1c2Ugc3RyaWN0IjsgZnJvbSB0cmFuc3BpbGVkIG1vZHVsZSB1bnRpbAor
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDM4IGlzIGZp
eGVkCisKKyAgLyoqCisgICAgQG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItcnVu
dGltZQorICAqLworCisgIC8vIHVzaW5nIGVtYmVyLW1ldGFsL2xpYi9tYWluIGhlcmUgdG8gZW5z
dXJlIHRoYXQgZW1iZXItZGVidWcgaXMgc2V0dXAKKyAgLy8gaWYgcHJlc2VudAorCisgIHZhciBf
TWl4aW4kY3JlYXRlOworCisgIHZhciBQT1NUX0lOSVQgPSBfZW1iZXJNZXRhbFN5bWJvbC5kZWZh
dWx0KCdQT1NUX0lOSVQnKTsKKyAgZXhwb3J0cy5QT1NUX0lOSVQgPSBQT1NUX0lOSVQ7CisgIHZh
ciBzY2hlZHVsZSA9IF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdC5zY2hlZHVsZTsKKyAgdmFy
IGFwcGx5TWl4aW4gPSBfZW1iZXJNZXRhbE1peGluLk1peGluLl9hcHBseTsKKyAgdmFyIGZpbmlz
aFBhcnRpYWwgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmZpbmlzaFBhcnRpYWw7CisgIHZhciBy
ZW9wZW4gPSBfZW1iZXJNZXRhbE1peGluLk1peGluLnByb3RvdHlwZS5yZW9wZW47CisgIHZhciBo
YXNDYWNoZWRDb21wdXRlZFByb3BlcnRpZXMgPSBmYWxzZTsKKworICBmdW5jdGlvbiBtYWtlQ3Rv
cigpIHsKKyAgICAvLyBOb3RlOiBhdm9pZCBhY2Nlc3NpbmcgYW55IHByb3BlcnRpZXMgb24gdGhl
IG9iamVjdCBzaW5jZSBpdCBtYWtlcyB0aGUKKyAgICAvLyBtZXRob2QgYSBsb3QgZmFzdGVyLiBU
aGlzIGlzIGdsdWUgY29kZSBzbyB3ZSB3YW50IGl0IHRvIGJlIGFzIGZhc3QgYXMKKyAgICAvLyBw
b3NzaWJsZS4KKworICAgIHZhciB3YXNBcHBsaWVkID0gZmFsc2U7CisgICAgdmFyIGluaXRQcm9w
ZXJ0aWVzOworCisgICAgdmFyIENsYXNzID0gZnVuY3Rpb24gKCkgeworICAgICAgaWYgKCF3YXNB
cHBsaWVkKSB7CisgICAgICAgIENsYXNzLnByb3RvKCk7IC8vIHByZXBhcmUgcHJvdG90eXBlLi4u
CisgICAgICB9CisKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICBp
bml0UHJvcGVydGllcyA9IFthcmd1bWVudHNbMF1dOworICAgICAgfQorCisgICAgICB0aGlzLl9f
ZGVmaW5lTm9uRW51bWVyYWJsZShfZW1iZXJNZXRhbFV0aWxzLkdVSURfS0VZX1BST1BFUlRZKTsK
KyAgICAgIHZhciBtID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcyk7CisgICAgICB2YXIgcHJv
dG8gPSBtLnByb3RvOworICAgICAgbS5wcm90byA9IHRoaXM7CisgICAgICBpZiAoaW5pdFByb3Bl
cnRpZXMpIHsKKyAgICAgICAgLy8gY2FwdHVyZSBsb2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUg
Y2xvc2VkIG92ZXIgdmFyaWFibGUKKyAgICAgICAgdmFyIHByb3BzID0gaW5pdFByb3BlcnRpZXM7
CisgICAgICAgIGluaXRQcm9wZXJ0aWVzID0gbnVsbDsKKworICAgICAgICB2YXIgY29uY2F0ZW5h
dGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllczsKKyAgICAgICAgdmFy
IG1lcmdlZFByb3BlcnRpZXMgPSB0aGlzLm1lcmdlZFByb3BlcnRpZXM7CisKKyAgICAgICAgZm9y
ICh2YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgICB2
YXIgcHJvcGVydGllcyA9IHByb3BzW2ldOworCisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ0VtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIG1peGluZyBpbiBv
dGhlciAnICsgJ2RlZmluaXRpb25zLCB1c2UgLmV4dGVuZCAmIC5jcmVhdGUgc2VwYXJhdGVseSBp
bnN0ZWFkLicsICEocHJvcGVydGllcyBpbnN0YW5jZW9mIF9lbWJlck1ldGFsTWl4aW4uTWl4aW4p
KTsKKworICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPT0gJ29iamVjdCcgJiYgcHJv
cGVydGllcyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0
YWxFcnJvci5kZWZhdWx0KCdFbWJlci5PYmplY3QuY3JlYXRlIG9ubHkgYWNjZXB0cyBvYmplY3Rz
LicpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghcHJvcGVydGllcykgeworICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIGtleU5hbWVzID0g
T2JqZWN0LmtleXMocHJvcGVydGllcyk7CisKKyAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGwg
PSBrZXlOYW1lcy5sZW5ndGg7IGogPCBsbDsgaisrKSB7CisgICAgICAgICAgICB2YXIga2V5TmFt
ZSA9IGtleU5hbWVzW2pdOworICAgICAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydGllc1trZXlO
YW1lXTsKKworICAgICAgICAgICAgaWYgKF9lbWJlck1ldGFsTWl4aW4uSVNfQklORElORy50ZXN0
KGtleU5hbWUpKSB7CisgICAgICAgICAgICAgIG0ud3JpdGVCaW5kaW5ncyhrZXlOYW1lLCB2YWx1
ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZURlc2MgPSB0aGlz
W2tleU5hbWVdOworICAgICAgICAgICAgdmFyIGRlc2MgPSBwb3NzaWJsZURlc2MgIT09IG51bGwg
JiYgdHlwZW9mIHBvc3NpYmxlRGVzYyA9PT0gJ29iamVjdCcgJiYgcG9zc2libGVEZXNjLmlzRGVz
Y3JpcHRvciA/IHBvc3NpYmxlRGVzYyA6IHVuZGVmaW5lZDsKKworICAgICAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0VtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRz
IGRlZmluaW5nIGNvbXB1dGVkICcgKyAncHJvcGVydGllcy4gRGVmaW5lIGNvbXB1dGVkIHByb3Bl
cnRpZXMgdXNpbmcgZXh0ZW5kKCkgb3IgcmVvcGVuKCkgJyArICdiZWZvcmUgY2FsbGluZyBjcmVh
dGUoKS4nLCAhKHZhbHVlIGluc3RhbmNlb2YgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFBy
b3BlcnR5KSk7CisgICAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnRW1iZXIuT2Jq
ZWN0LmNyZWF0ZSBubyBsb25nZXIgc3VwcG9ydHMgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGNhbGwg
X3N1cGVyLicsICEodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLnRvU3RyaW5n
KCkuaW5kZXhPZignLl9zdXBlcicpICE9PSAtMSkpOworICAgICAgICAgICAgX2VtYmVyTWV0YWxE
ZWJ1Zy5hc3NlcnQoJ2BhY3Rpb25zYCBtdXN0IGJlIHByb3ZpZGVkIGF0IGV4dGVuZCB0aW1lLCBu
b3QgYXQgY3JlYXRlIHRpbWUsICcgKyAnd2hlbiBFbWJlci5BY3Rpb25IYW5kbGVyIGlzIHVzZWQg
KGkuZS4gdmlld3MsIGNvbnRyb2xsZXJzICYgcm91dGVzKS4nLCAhKGtleU5hbWUgPT09ICdhY3Rp
b25zJyAmJiBfZW1iZXJSdW50aW1lTWl4aW5zQWN0aW9uX2hhbmRsZXIuZGVmYXVsdC5kZXRlY3Qo
dGhpcykpKTsKKworICAgICAgICAgICAgaWYgKGNvbmNhdGVuYXRlZFByb3BlcnRpZXMgJiYgY29u
Y2F0ZW5hdGVkUHJvcGVydGllcy5sZW5ndGggPiAwICYmIGNvbmNhdGVuYXRlZFByb3BlcnRpZXMu
aW5kZXhPZihrZXlOYW1lKSA+PSAwKSB7CisgICAgICAgICAgICAgIHZhciBiYXNlVmFsdWUgPSB0
aGlzW2tleU5hbWVdOworCisgICAgICAgICAgICAgIGlmIChiYXNlVmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VWYWx1ZS5jb25jYXQpIHsKKyAg
ICAgICAgICAgICAgICAgIHZhbHVlID0gYmFzZVZhbHVlLmNvbmNhdCh2YWx1ZSk7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlID0gX2VtYmVyTWV0YWxV
dGlscy5tYWtlQXJyYXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9lbWJl
ck1ldGFsVXRpbHMubWFrZUFycmF5KHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAobWVyZ2VkUHJvcGVydGllcyAmJiBtZXJnZWRQcm9wZXJ0
aWVzLmxlbmd0aCAmJiBtZXJnZWRQcm9wZXJ0aWVzLmluZGV4T2Yoa2V5TmFtZSkgPj0gMCkgewor
ICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHRoaXNba2V5TmFtZV07CisKKyAgICAg
ICAgICAgICAgdmFsdWUgPSBfZW1iZXJNZXRhbEFzc2lnbi5kZWZhdWx0KHt9LCBvcmlnaW5hbFZh
bHVlLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXNjKSB7Cisg
ICAgICAgICAgICAgIGRlc2Muc2V0KHRoaXMsIGtleU5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXRVbmtub3duUHJvcGVy
dHkgPT09ICdmdW5jdGlvbicgJiYgIShrZXlOYW1lIGluIHRoaXMpKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwgdmFsdWUpOworICAgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydGllcy5kZWZpbmVQ
cm9wZXJ0eSh0aGlzLCBrZXlOYW1lLCBudWxsLCB2YWx1ZSk7IC8vIHNldHVwIG1hbmRhdG9yeSBz
ZXR0ZXIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgfQorCisgICAgICBmaW5pc2hQYXJ0aWFsKHRoaXMsIG0pOworCisgICAgICB2
YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKworICAgICAgaWYgKGxlbmd0aCA9PT0gMCkg
eworICAgICAgICB0aGlzLmluaXQoKTsKKyAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7
CisgICAgICAgIHRoaXMuaW5pdChhcmd1bWVudHNbMF0pOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gdjggYnVnIHBvdGVudGlhbGx5IGluY29ycmVjdGx5IGRlb3B0cyB0aGlzIGZ1bmN0aW9u
OiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzcwOQorICAg
ICAgICAvLyB3ZSBtYXkgd2FudCB0byBrZWVwIHRoaXMgYXJvdW5kIHRpbGwgdGhpcyBhZ2VzIG91
dCBvbiBtb2JpbGUKKyAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICAg
ICAgZm9yICh2YXIgeCA9IDA7IHggPCBsZW5ndGg7IHgrKykgeworICAgICAgICAgIGFyZ3NbeF0g
PSBhcmd1bWVudHNbeF07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMs
IGFyZ3MpOworICAgICAgfQorCisgICAgICB0aGlzW1BPU1RfSU5JVF0oKTsKKworICAgICAgbS5w
cm90byA9IHByb3RvOworICAgICAgX2VtYmVyTWV0YWxDaGFpbnMuZmluaXNoQ2hhaW5zKHRoaXMp
OworICAgICAgX2VtYmVyTWV0YWxFdmVudHMuc2VuZEV2ZW50KHRoaXMsICdpbml0Jyk7CisgICAg
fTsKKworICAgIENsYXNzLnRvU3RyaW5nID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5wcm90b3R5
cGUudG9TdHJpbmc7CisgICAgQ2xhc3Mud2lsbFJlb3BlbiA9IGZ1bmN0aW9uICgpIHsKKyAgICAg
IGlmICh3YXNBcHBsaWVkKSB7CisgICAgICAgIENsYXNzLlByb3RvdHlwZU1peGluID0gX2VtYmVy
TWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoQ2xhc3MuUHJvdG90eXBlTWl4aW4pOworICAgICAgfQor
CisgICAgICB3YXNBcHBsaWVkID0gZmFsc2U7CisgICAgfTsKKworICAgIENsYXNzLl9pbml0UHJv
cGVydGllcyA9IGZ1bmN0aW9uIChhcmdzKSB7CisgICAgICBpbml0UHJvcGVydGllcyA9IGFyZ3M7
CisgICAgfTsKKworICAgIENsYXNzLnByb3RvID0gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHN1
cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNsYXNzOworICAgICAgaWYgKHN1cGVyY2xhc3MpIHsKKyAg
ICAgICAgc3VwZXJjbGFzcy5wcm90bygpOworICAgICAgfQorCisgICAgICBpZiAoIXdhc0FwcGxp
ZWQpIHsKKyAgICAgICAgd2FzQXBwbGllZCA9IHRydWU7CisgICAgICAgIENsYXNzLlByb3RvdHlw
ZU1peGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOworICAgICAgfQorCisgICAgICBy
ZXR1cm4gdGhpcy5wcm90b3R5cGU7CisgICAgfTsKKworICAgIHJldHVybiBDbGFzczsKKyAgfQor
CisgIC8qKgorICAgIEBjbGFzcyBDb3JlT2JqZWN0CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAg
IEBwdWJsaWMKKyAgKi8KKyAgdmFyIENvcmVPYmplY3QgPSBtYWtlQ3RvcigpOworICBDb3JlT2Jq
ZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiAnRW1iZXIuQ29yZU9iamVj
dCc7CisgIH07CisgIENvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4gPSBfZW1iZXJNZXRhbE1peGlu
Lk1peGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHsKKyAgICByZW9wZW46IGZ1bmN0aW9uICgp
IHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXko
X2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAgICAgIGFyZ3NbX2tl
eV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIGFwcGx5TWl4aW4odGhpcywg
YXJncywgdHJ1ZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgaW5zdGFudGlh
dGVkLiBCeSBkZWZhdWx0LAorICAgICAgZG9lcyBub3RoaW5nIHVubGVzcyBpdCBpcyBvdmVycmlk
ZGVuIGR1cmluZyBjbGFzcyBkZWZpbml0aW9uLgorICAgICAgIEV4YW1wbGU6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAg
ICAgICBpbml0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBhbGVydCgnTmFtZSBpcyAnICsgdGhp
cy5nZXQoJ25hbWUnKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIHZhciBzdGV2ZSA9
IEFwcC5QZXJzb24uY3JlYXRlKHsKKyAgICAgICAgbmFtZTogIlN0ZXZlIgorICAgICAgfSk7Cisg
ICAgICAgLy8gYWxlcnRzICdOYW1lIGlzIFN0ZXZlJy4KKyAgICAgIGBgYAorICAgICAgIE5PVEU6
IElmIHlvdSBkbyBvdmVycmlkZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVt
YmVyLlZpZXdgLAorICAgICAgYmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlciguLi5hcmd1bWVu
dHMpYCBpbiB5b3VyCisgICAgICBgaW5pdGAgZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1i
ZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvCisgICAgICBkbyBpbXBvcnRhbnQgc2V0
dXAgd29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCisgICAgICBh
cHBsaWNhdGlvbi4KKyAgICAgICBAbWV0aG9kIGluaXQKKyAgICAgIEBwdWJsaWMKKyAgICAqLwor
ICAgIGluaXQ6IGZ1bmN0aW9uICgpIHt9CisKKyAgfSwgX01peGluJGNyZWF0ZVtQT1NUX0lOSVRd
ID0gZnVuY3Rpb24gKCkge30sIF9NaXhpbiRjcmVhdGUuX19kZWZpbmVOb25FbnVtZXJhYmxlID0g
ZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHBy
b3BlcnR5Lm5hbWUsIHByb3BlcnR5LmRlc2NyaXB0b3IpOworICAgIC8vdGhpc1twcm9wZXJ0eS5u
YW1lXSA9IHByb3BlcnR5LmRlc2NyaXB0b3IudmFsdWU7CisgIH0sIF9NaXhpbiRjcmVhdGUuY29u
Y2F0ZW5hdGVkUHJvcGVydGllcyA9IG51bGwsIF9NaXhpbiRjcmVhdGUubWVyZ2VkUHJvcGVydGll
cyA9IG51bGwsIF9NaXhpbiRjcmVhdGUuaXNEZXN0cm95ZWQgPSBmYWxzZSwgX01peGluJGNyZWF0
ZS5pc0Rlc3Ryb3lpbmcgPSBmYWxzZSwgX01peGluJGNyZWF0ZS5kZXN0cm95ID0gZnVuY3Rpb24g
KCkgeworICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeworICAgICAgcmV0dXJuOworICAgIH0K
KyAgICB0aGlzLmlzRGVzdHJveWluZyA9IHRydWU7CisKKyAgICBzY2hlZHVsZSgnYWN0aW9ucycs
IHRoaXMsIHRoaXMud2lsbERlc3Ryb3kpOworICAgIHNjaGVkdWxlKCdkZXN0cm95JywgdGhpcywg
dGhpcy5fc2NoZWR1bGVkRGVzdHJveSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sIF9NaXhpbiRj
cmVhdGUud2lsbERlc3Ryb3kgPSBfZW1iZXJNZXRhbENvcmUuSywgX01peGluJGNyZWF0ZS5fc2No
ZWR1bGVkRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKKyAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkg
eworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfZW1iZXJNZXRhbFdhdGNoaW5nLmRlc3Ryb3ko
dGhpcyk7CisgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7CisgIH0sIF9NaXhpbiRjcmVhdGUu
YmluZCA9IGZ1bmN0aW9uICh0bywgZnJvbSkgeworICAgIGlmICghKGZyb20gaW5zdGFuY2VvZiBf
ZW1iZXJNZXRhbEJpbmRpbmcuQmluZGluZykpIHsKKyAgICAgIGZyb20gPSBfZW1iZXJNZXRhbEJp
bmRpbmcuQmluZGluZy5mcm9tKGZyb20pOworICAgIH0KKyAgICBmcm9tLnRvKHRvKS5jb25uZWN0
KHRoaXMpOworICAgIHJldHVybiBmcm9tOworICB9LCBfTWl4aW4kY3JlYXRlLnRvU3RyaW5nID0g
ZnVuY3Rpb24gKCkgeworICAgIHZhciBoYXNUb1N0cmluZ0V4dGVuc2lvbiA9IHR5cGVvZiB0aGlz
LnRvU3RyaW5nRXh0ZW5zaW9uID09PSAnZnVuY3Rpb24nOworICAgIHZhciBleHRlbnNpb24gPSBo
YXNUb1N0cmluZ0V4dGVuc2lvbiA/ICc6JyArIHRoaXMudG9TdHJpbmdFeHRlbnNpb24oKSA6ICcn
OworICAgIHZhciByZXQgPSAnPCcgKyB0aGlzLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkgKyAnOicg
KyBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhpcykgKyBleHRlbnNpb24gKyAnPic7CisKKyAg
ICByZXR1cm4gcmV0OworICB9LCBfTWl4aW4kY3JlYXRlKSk7CisKKyAgQ29yZU9iamVjdC5Qcm90
b3R5cGVNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsKKworICBDb3JlT2JqZWN0
Ll9fc3VwZXJfXyA9IG51bGw7CisKKyAgdmFyIENsYXNzTWl4aW5Qcm9wcyA9IHsKKworICAgIENs
YXNzTWl4aW46IF9lbWJlck1ldGFsTWl4aW4uUkVRVUlSRUQsCisKKyAgICBQcm90b3R5cGVNaXhp
bjogX2VtYmVyTWV0YWxNaXhpbi5SRVFVSVJFRCwKKworICAgIGlzQ2xhc3M6IHRydWUsCisKKyAg
ICBpc01ldGhvZDogZmFsc2UsCisKKyAgICAvKioKKyAgICAgIENyZWF0ZXMgYSBuZXcgc3ViY2xh
c3MuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoeworICAgICAgICBzYXk6IGZ1bmN0aW9uKHRoaW5nKSB7CisgICAgICAgICAgYWxl
cnQodGhpbmcpOworICAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlz
IGRlZmluZXMgYSBuZXcgc3ViY2xhc3Mgb2YgRW1iZXIuT2JqZWN0OiBgQXBwLlBlcnNvbmAuIEl0
IGNvbnRhaW5zIG9uZSBtZXRob2Q6IGBzYXkoKWAuCisgICAgICAgWW91IGNhbiBhbHNvIGNyZWF0
ZSBhIHN1YmNsYXNzIGZyb20gYW55IGV4aXN0aW5nIGNsYXNzIGJ5IGNhbGxpbmcgaXRzIGBleHRl
bmQoKWAgbWV0aG9kLgorICAgICAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0
ZSBhIHN1YmNsYXNzIG9mIEVtYmVyJ3MgYnVpbHQtaW4gYEVtYmVyLlZpZXdgIGNsYXNzOgorICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEFwcC5QZXJzb25WaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgICB0YWdOYW1lOiAnbGknLAorICAgICAgICBjbGFzc05hbWVCaW5kaW5nczog
Wydpc0FkbWluaXN0cmF0b3InXQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBXaGVuIGRl
ZmluaW5nIGEgc3ViY2xhc3MsIHlvdSBjYW4gb3ZlcnJpZGUgbWV0aG9kcyBidXQgc3RpbGwgYWNj
ZXNzIHRoZQorICAgICAgaW1wbGVtZW50YXRpb24gb2YgeW91ciBwYXJlbnQgY2xhc3MgYnkgY2Fs
bGluZyB0aGUgc3BlY2lhbCBgX3N1cGVyKClgIG1ldGhvZDoKKyAgICAgICBgYGBqYXZhc2NyaXB0
CisgICAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIHNheTog
ZnVuY3Rpb24odGhpbmcpIHsKKyAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7
CisgICAgICAgICAgYWxlcnQobmFtZSArICcgc2F5czogJyArIHRoaW5nKTsKKyAgICAgICAgfQor
ICAgICAgfSk7CisgICAgICAgQXBwLlNvbGRpZXIgPSBBcHAuUGVyc29uLmV4dGVuZCh7CisgICAg
ICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKKyAgICAgICAgICB0aGlzLl9zdXBlcih0aGluZyAr
ICIsIHNpciEiKTsKKyAgICAgICAgfSwKKyAgICAgICAgbWFyY2g6IGZ1bmN0aW9uKG51bWJlck9m
SG91cnMpIHsKKyAgICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBtYXJjaGVzIGZv
ciAnICsgbnVtYmVyT2ZIb3VycyArICcgaG91cnMuJyk7CisgICAgICAgIH0KKyAgICAgIH0pOwor
ICAgICAgIHZhciB5ZWh1ZGEgPSBBcHAuU29sZGllci5jcmVhdGUoeworICAgICAgICBuYW1lOiAi
WWVodWRhIEthdHoiCisgICAgICB9KTsKKyAgICAgICB5ZWh1ZGEuc2F5KCJZZXMiKTsgIC8vIGFs
ZXJ0cyAiWWVodWRhIEthdHogc2F5czogWWVzLCBzaXIhIgorICAgICAgYGBgCisgICAgICAgVGhl
IGBjcmVhdGUoKWAgb24gbGluZSAjMTcgY3JlYXRlcyBhbiAqaW5zdGFuY2UqIG9mIHRoZSBgQXBw
LlNvbGRpZXJgIGNsYXNzLgorICAgICAgVGhlIGBleHRlbmQoKWAgb24gbGluZSAjOCBjcmVhdGVz
IGEgKnN1YmNsYXNzKiBvZiBgQXBwLlBlcnNvbmAuIEFueSBpbnN0YW5jZQorICAgICAgb2YgdGhl
IGBBcHAuUGVyc29uYCBjbGFzcyB3aWxsICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRob2Qu
CisgICAgICAgWW91IGNhbiBhbHNvIHBhc3MgYE1peGluYCBjbGFzc2VzIHRvIGFkZCBhZGRpdGlv
bmFsIHByb3BlcnRpZXMgdG8gdGhlIHN1YmNsYXNzLgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKKyAgICAgICAgc2F5OiBmdW5j
dGlvbih0aGluZykgeworICAgICAgICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykgKyAnIHNheXM6
ICcgKyB0aGluZyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5TaW5naW5nTWl4
aW4gPSBNaXhpbi5jcmVhdGUoeworICAgICAgICBzaW5nOiBmdW5jdGlvbih0aGluZyl7CisgICAg
ICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgc2luZ3M6IGxhIGxhIGxhICcgKyB0aGlu
Zyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIEFwcC5Ccm9hZHdheVN0YXIgPSBBcHAu
UGVyc29uLmV4dGVuZChBcHAuU2luZ2luZ01peGluLCB7CisgICAgICAgIGRhbmNlOiBmdW5jdGlv
bigpIHsKKyAgICAgICAgICBhbGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBkYW5jZXM6IHRhcCB0
YXAgdGFwIHRhcCAnKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBU
aGUgYEFwcC5Ccm9hZHdheVN0YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1ldGhvZHM6IGBzYXko
KWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClgLgorICAgICAgIEBtZXRob2QgZXh0ZW5kCisgICAg
ICBAc3RhdGljCisgICAgICAgQHBhcmFtIHtNaXhpbn0gW21peGluc10qIE9uZSBvciBtb3JlIE1p
eGluIGNsYXNzZXMKKyAgICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzXSogT2JqZWN0IGNv
bnRhaW5pbmcgdmFsdWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBjbGFzcworICAgICAgQHB1Ymxp
YworICAgICovCisgICAgZXh0ZW5kOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgQ2xhc3MgPSBt
YWtlQ3RvcigpOworICAgICAgdmFyIHByb3RvOworICAgICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHRoaXMuQ2xhc3NNaXhpbik7CisgICAgICBDbGFz
cy5Qcm90b3R5cGVNaXhpbiA9IF9lbWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHRoaXMuUHJv
dG90eXBlTWl4aW4pOworCisgICAgICBDbGFzcy5DbGFzc01peGluLm93bmVyQ29uc3RydWN0b3Ig
PSBDbGFzczsKKyAgICAgIENsYXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBD
bGFzczsKKworICAgICAgcmVvcGVuLmFwcGx5KENsYXNzLlByb3RvdHlwZU1peGluLCBhcmd1bWVu
dHMpOworCisgICAgICBDbGFzcy5zdXBlcmNsYXNzID0gdGhpczsKKyAgICAgIENsYXNzLl9fc3Vw
ZXJfXyA9IHRoaXMucHJvdG90eXBlOworCisgICAgICBwcm90byA9IENsYXNzLnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpOworICAgICAgcHJvdG8uY29uc3RydWN0b3Ig
PSBDbGFzczsKKyAgICAgIF9lbWJlck1ldGFsVXRpbHMuZ2VuZXJhdGVHdWlkKHByb3RvKTsKKyAg
ICAgIF9lbWJlck1ldGFsTWV0YS5tZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0aGlzIHdp
bGwgZGlzYWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCisKKyAgICAgIENsYXNzLkNsYXNzTWl4
aW4uYXBwbHkoQ2xhc3MpOworICAgICAgcmV0dXJuIENsYXNzOworICAgIH0sCisKKyAgICAvKioK
KyAgICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy4gQWNjZXB0cyBlaXRoZXIgbm8g
YXJndW1lbnRzLCBvciBhbiBvYmplY3QKKyAgICAgIGNvbnRhaW5pbmcgdmFsdWVzIHRvIGluaXRp
YWxpemUgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBvYmplY3Qgd2l0aC4KKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAg
IGhlbGxvV29ybGQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGFsZXJ0KCJIaSwgbXkgbmFtZSBp
cyAiICsgdGhpcy5nZXQoJ25hbWUnKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgIHZh
ciB0b20gPSBBcHAuUGVyc29uLmNyZWF0ZSh7CisgICAgICAgIG5hbWU6ICdUb20gRGFsZScKKyAg
ICAgIH0pOworICAgICAgIHRvbS5oZWxsb1dvcmxkKCk7IC8vIGFsZXJ0cyAiSGksIG15IG5hbWUg
aXMgVG9tIERhbGUiLgorICAgICAgYGBgCisgICAgICAgYGNyZWF0ZWAgd2lsbCBjYWxsIHRoZSBg
aW5pdGAgZnVuY3Rpb24gaWYgZGVmaW5lZCBkdXJpbmcKKyAgICAgIGBFbWJlci5BbnlPYmplY3Qu
ZXh0ZW5kYAorICAgICAgIElmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIGBjcmVhdGVgLCBp
dCB3aWxsIG5vdCBzZXQgdmFsdWVzIHRvIHRoZSBuZXcKKyAgICAgIGluc3RhbmNlIGR1cmluZyBp
bml0aWFsaXphdGlvbjoKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgbm9OYW1lID0g
QXBwLlBlcnNvbi5jcmVhdGUoKTsKKyAgICAgIG5vTmFtZS5oZWxsb1dvcmxkKCk7IC8vIGFsZXJ0
cyB1bmRlZmluZWQKKyAgICAgIGBgYAorICAgICAgIE5PVEU6IEZvciBwZXJmb3JtYW5jZSByZWFz
b25zLCB5b3UgY2Fubm90IGRlY2xhcmUgbWV0aG9kcyBvciBjb21wdXRlZAorICAgICAgcHJvcGVy
dGllcyBkdXJpbmcgYGNyZWF0ZWAuIFlvdSBzaG91bGQgaW5zdGVhZCBkZWNsYXJlIG1ldGhvZHMg
YW5kIGNvbXB1dGVkCisgICAgICBwcm9wZXJ0aWVzIHdoZW4gdXNpbmcgYGV4dGVuZGAuCisgICAg
ICAgQG1ldGhvZCBjcmVhdGUKKyAgICAgIEBzdGF0aWMKKyAgICAgIEBwYXJhbSBbYXJndW1lbnRz
XSoKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkgeworICAg
ICAgdmFyIEMgPSB0aGlzOworCisgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5n
dGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIr
KykgeworICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CisgICAgICB9CisK
KyAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdGhpcy5faW5pdFByb3BlcnRp
ZXMoYXJncyk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEMoKTsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBBdWdtZW50cyBhIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIHdpdGggYWRkaXRp
b25hbAorICAgICAgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25zOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CisgICAgICAgIG5hbWU6
ICdhbiBvYmplY3QnCisgICAgICB9KTsKKyAgICAgICBvID0gTXlPYmplY3QuY3JlYXRlKCk7Cisg
ICAgICBvLmdldCgnbmFtZScpOyAvLyAnYW4gb2JqZWN0JworICAgICAgIE15T2JqZWN0LnJlb3Bl
bih7CisgICAgICAgIHNheTogZnVuY3Rpb24obXNnKXsKKyAgICAgICAgICBjb25zb2xlLmxvZyht
c2cpOworICAgICAgICB9CisgICAgICB9KQorICAgICAgIG8yID0gTXlPYmplY3QuY3JlYXRlKCk7
CisgICAgICBvMi5zYXkoImhlbGxvIik7IC8vIGxvZ3MgImhlbGxvIgorICAgICAgIG8uc2F5KCJn
b29kYnllIik7IC8vIGxvZ3MgImdvb2RieWUiCisgICAgICBgYGAKKyAgICAgICBUbyBhZGQgZnVu
Y3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRvIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYsCisgICAgICBz
ZWUgYHJlb3BlbkNsYXNzYAorICAgICAgIEBtZXRob2QgcmVvcGVuCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICByZW9wZW46IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMud2lsbFJlb3Blbigp
OworICAgICAgcmVvcGVuLmFwcGx5KHRoaXMuUHJvdG90eXBlTWl4aW4sIGFyZ3VtZW50cyk7Cisg
ICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBdWdtZW50cyBhIGNv
bnN0cnVjdG9yJ3Mgb3duIHByb3BlcnRpZXMgYW5kIGZ1bmN0aW9uczoKKyAgICAgICBgYGBqYXZh
c2NyaXB0CisgICAgICBNeU9iamVjdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoeworICAgICAgICBu
YW1lOiAnYW4gb2JqZWN0JworICAgICAgfSk7CisgICAgICAgTXlPYmplY3QucmVvcGVuQ2xhc3Mo
eworICAgICAgICBjYW5CdWlsZDogZmFsc2UKKyAgICAgIH0pOworICAgICAgIE15T2JqZWN0LmNh
bkJ1aWxkOyAvLyBmYWxzZQorICAgICAgbyA9IE15T2JqZWN0LmNyZWF0ZSgpOworICAgICAgYGBg
CisgICAgICAgSW4gb3RoZXIgd29yZHMsIHRoaXMgY3JlYXRlcyBzdGF0aWMgcHJvcGVydGllcyBh
bmQgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MuCisgICAgICBUaGVzZSBhcmUgb25seSBhdmFpbGFi
bGUgb24gdGhlIGNsYXNzIGFuZCBub3Qgb24gYW55IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCisg
ICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRl
bmQoeworICAgICAgICBuYW1lIDogIiIsCisgICAgICAgIHNheUhlbGxvIDogZnVuY3Rpb24oKSB7
CisgICAgICAgICAgYWxlcnQoIkhlbGxvLiBNeSBuYW1lIGlzICIgKyB0aGlzLmdldCgnbmFtZScp
KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgQXBwLlBlcnNvbi5yZW9wZW5DbGFzcyh7
CisgICAgICAgIHNwZWNpZXMgOiAiSG9tbyBzYXBpZW5zIiwKKyAgICAgICAgY3JlYXRlUGVyc29u
OiBmdW5jdGlvbihuZXdQZXJzb25zTmFtZSl7CisgICAgICAgICAgcmV0dXJuIEFwcC5QZXJzb24u
Y3JlYXRlKHsKKyAgICAgICAgICAgIG5hbWU6bmV3UGVyc29uc05hbWUKKyAgICAgICAgICB9KTsK
KyAgICAgICAgfQorICAgICAgfSk7CisgICAgICAgdmFyIHRvbSA9IEFwcC5QZXJzb24uY3JlYXRl
KHsKKyAgICAgICAgbmFtZSA6ICJUb20gRGFsZSIKKyAgICAgIH0pOworICAgICAgdmFyIHllaHVk
YSA9IEFwcC5QZXJzb24uY3JlYXRlUGVyc29uKCJZZWh1ZGEgS2F0eiIpOworICAgICAgIHRvbS5z
YXlIZWxsbygpOyAvLyAiSGVsbG8uIE15IG5hbWUgaXMgVG9tIERhbGUiCisgICAgICB5ZWh1ZGEu
c2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBLYXR6IgorICAgICAgYWxl
cnQoQXBwLlBlcnNvbi5zcGVjaWVzKTsgLy8gIkhvbW8gc2FwaWVucyIKKyAgICAgIGBgYAorICAg
ICAgIE5vdGUgdGhhdCBgc3BlY2llc2AgYW5kIGBjcmVhdGVQZXJzb25gIGFyZSAqbm90KiB2YWxp
ZCBvbiB0aGUgYHRvbWAgYW5kIGB5ZWh1ZGFgCisgICAgICB2YXJpYWJsZXMuIFRoZXkgYXJlIG9u
bHkgdmFsaWQgb24gYEFwcC5QZXJzb25gLgorICAgICAgIFRvIGFkZCBmdW5jdGlvbnMgYW5kIHBy
b3BlcnRpZXMgdG8gaW5zdGFuY2VzIG9mCisgICAgICBhIGNvbnN0cnVjdG9yIGJ5IGV4dGVuZGlu
ZyB0aGUgY29uc3RydWN0b3IncyBwcm90b3R5cGUKKyAgICAgIHNlZSBgcmVvcGVuYAorICAgICAg
IEBtZXRob2QgcmVvcGVuQ2xhc3MKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHJlb3BlbkNs
YXNzOiBmdW5jdGlvbiAoKSB7CisgICAgICByZW9wZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBh
cmd1bWVudHMpOworICAgICAgYXBwbHlNaXhpbih0aGlzLCBhcmd1bWVudHMsIGZhbHNlKTsKKyAg
ICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICBkZXRlY3Q6IGZ1bmN0aW9uIChvYmopIHsK
KyAgICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2Ygb2JqKSB7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PT0g
dGhpcykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIG9iaiA9
IG9iai5zdXBlcmNsYXNzOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisK
KyAgICBkZXRlY3RJbnN0YW5jZTogZnVuY3Rpb24gKG9iaikgeworICAgICAgcmV0dXJuIG9iaiBp
bnN0YW5jZW9mIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgSW4gc29tZSBjYXNlcywg
eW91IG1heSB3YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aCBhZGRpdGlv
bmFsCisgICAgICBtZXRhZGF0YSBhYm91dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVl
cyB0aGV5IG9wZXJhdGUgb24uIEZvcgorICAgICAgZXhhbXBsZSwgY29tcHV0ZWQgcHJvcGVydHkg
ZnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuCisgICAgICBu
byBsb25nZXIgYXZhaWxhYmxlIGZvciBpbnRyb3NwZWN0aW9uLgorICAgICAgIFlvdSBjYW4gcGFz
cyBhIGhhc2ggb2YgdGhlc2UgdmFsdWVzIHRvIGEgY29tcHV0ZWQgcHJvcGVydHkgbGlrZSB0aGlz
OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHBlcnNvbjogZnVuY3Rpb24oKSB7CisgICAg
ICAgIHZhciBwZXJzb25JZCA9IHRoaXMuZ2V0KCdwZXJzb25JZCcpOworICAgICAgICByZXR1cm4g
QXBwLlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7CisgICAgICB9LnByb3BlcnR5KCku
bWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKKyAgICAgIGBgYAorICAgICAgIE9uY2UgeW91J3Zl
IGRvbmUgdGhpcywgeW91IGNhbiByZXRyaWV2ZSB0aGUgdmFsdWVzIHNhdmVkIHRvIHRoZSBjb21w
dXRlZAorICAgICAgcHJvcGVydHkgZnJvbSB5b3VyIGNsYXNzIGxpa2UgdGhpczoKKyAgICAgICBg
YGBqYXZhc2NyaXB0CisgICAgICBNeUNsYXNzLm1ldGFGb3JQcm9wZXJ0eSgncGVyc29uJyk7Cisg
ICAgICBgYGAKKyAgICAgICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBoYXNoIHRoYXQg
d2FzIHBhc3NlZCB0byBgbWV0YSgpYC4KKyAgICAgICBAc3RhdGljCisgICAgICBAbWV0aG9kIG1l
dGFGb3JQcm9wZXJ0eQorICAgICAgQHBhcmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lCisg
ICAgICBAcHJpdmF0ZQorICAgICovCisgICAgbWV0YUZvclByb3BlcnR5OiBmdW5jdGlvbiAoa2V5
KSB7CisgICAgICB2YXIgcHJvdG8gPSB0aGlzLnByb3RvKCk7CisgICAgICB2YXIgcG9zc2libGVE
ZXNjID0gcHJvdG9ba2V5XTsKKyAgICAgIHZhciBkZXNjID0gcG9zc2libGVEZXNjICE9PSBudWxs
ICYmIHR5cGVvZiBwb3NzaWJsZURlc2MgPT09ICdvYmplY3QnICYmIHBvc3NpYmxlRGVzYy5pc0Rl
c2NyaXB0b3IgPyBwb3NzaWJsZURlc2MgOiB1bmRlZmluZWQ7CisKKyAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdtZXRhRm9yUHJvcGVydHkoKSBjb3VsZCBub3QgZmluZCBhIGNvbXB1dGVk
IHByb3BlcnR5ICcgKyAnd2l0aCBrZXkgXCcnICsga2V5ICsgJ1wnLicsICEhZGVzYyAmJiBkZXNj
IGluc3RhbmNlb2YgX2VtYmVyTWV0YWxDb21wdXRlZC5Db21wdXRlZFByb3BlcnR5KTsKKyAgICAg
IHJldHVybiBkZXNjLl9tZXRhIHx8IHt9OworICAgIH0sCisKKyAgICBfY29tcHV0ZWRQcm9wZXJ0
aWVzOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKKyAgICAgIGhh
c0NhY2hlZENvbXB1dGVkUHJvcGVydGllcyA9IHRydWU7CisgICAgICB2YXIgcHJvdG8gPSB0aGlz
LnByb3RvKCk7CisgICAgICB2YXIgcHJvcGVydHk7CisgICAgICB2YXIgcHJvcGVydGllcyA9IFtd
OworCisgICAgICBmb3IgKHZhciBuYW1lIGluIHByb3RvKSB7CisgICAgICAgIHByb3BlcnR5ID0g
cHJvdG9bbmFtZV07CisKKyAgICAgICAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmlzRGVzY3Jp
cHRvcikgeworICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh7CisgICAgICAgICAgICBuYW1lOiBu
YW1lLAorICAgICAgICAgICAgbWV0YTogcHJvcGVydHkuX21ldGEKKyAgICAgICAgICB9KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfSkucmVhZE9u
bHkoKSwKKworICAgIC8qKgorICAgICAgSXRlcmF0ZSBvdmVyIGVhY2ggY29tcHV0ZWQgcHJvcGVy
dHkgZm9yIHRoZSBjbGFzcywgcGFzc2luZyBpdHMgbmFtZQorICAgICAgYW5kIGFueSBhc3NvY2lh
dGVkIG1ldGFkYXRhIChzZWUgYG1ldGFGb3JQcm9wZXJ0eWApIHRvIHRoZSBjYWxsYmFjay4KKyAg
ICAgICBAc3RhdGljCisgICAgICBAbWV0aG9kIGVhY2hDb21wdXRlZFByb3BlcnR5CisgICAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjaworICAgICAgQHBhcmFtIHtPYmplY3R9IGJpbmRpbmcK
KyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBlYWNoQ29tcHV0ZWRQcm9wZXJ0eTogZnVuY3Rp
b24gKGNhbGxiYWNrLCBiaW5kaW5nKSB7CisgICAgICB2YXIgcHJvcGVydHk7CisgICAgICB2YXIg
ZW1wdHkgPSB7fTsKKworICAgICAgdmFyIHByb3BlcnRpZXMgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ19jb21wdXRlZFByb3BlcnRpZXMnKTsKKworICAgICAgZm9yICh2YXIg
aSA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAg
ICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldOworICAgICAgICBjYWxsYmFjay5jYWxsKGJp
bmRpbmcgfHwgdGhpcywgcHJvcGVydHkubmFtZSwgcHJvcGVydHkubWV0YSB8fCBlbXB0eSk7Cisg
ICAgICB9CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGluamVjdGVkUHJvcGVydHlBc3NlcnRp
b24oKSB7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ0luamVjdGVkIHByb3BlcnRpZXMg
YXJlIGludmFsaWQnLCBfZW1iZXJSdW50aW1lSW5qZWN0LnZhbGlkYXRlUHJvcGVydHlJbmplY3Rp
b25zKHRoaXMpKTsKKyAgfQorCisgIF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlv
biAoKSB7CisgICAgLyoqCisgICAgICBQcm92aWRlcyBsb29rdXAtdGltZSB0eXBlIHZhbGlkYXRp
b24gZm9yIGluamVjdGVkIHByb3BlcnRpZXMuCisgICAgICAgQHByaXZhdGUKKyAgICAgIEBtZXRo
b2QgX29uTG9va3VwCisgICAgKi8KKyAgICBDbGFzc01peGluUHJvcHMuX29uTG9va3VwID0gaW5q
ZWN0ZWRQcm9wZXJ0eUFzc2VydGlvbjsKKyAgfSk7CisKKyAgLyoqCisgICAgUmV0dXJucyBhIGhh
c2ggb2YgcHJvcGVydHkgbmFtZXMgYW5kIGNvbnRhaW5lciBuYW1lcyB0aGF0IGluamVjdGVkCisg
ICAgcHJvcGVydGllcyB3aWxsIGxvb2t1cCBvbiB0aGUgY29udGFpbmVyIGxhemlseS4KKyAgCisg
ICAgQG1ldGhvZCBfbGF6eUluamVjdGlvbnMKKyAgICBAcmV0dXJuIHtPYmplY3R9IEhhc2ggb2Yg
YWxsIGxhenkgaW5qZWN0ZWQgcHJvcGVydHkga2V5cyB0byBjb250YWluZXIgbmFtZXMKKyAgICBA
cHJpdmF0ZQorICAqLworICBDbGFzc01peGluUHJvcHMuX2xhenlJbmplY3Rpb25zID0gZnVuY3Rp
b24gKCkgeworICAgIHZhciBpbmplY3Rpb25zID0ge307CisgICAgdmFyIHByb3RvID0gdGhpcy5w
cm90bygpOworICAgIHZhciBrZXksIGRlc2M7CisKKyAgICBmb3IgKGtleSBpbiBwcm90bykgewor
ICAgICAgZGVzYyA9IHByb3RvW2tleV07CisgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIF9lbWJl
ck1ldGFsSW5qZWN0ZWRfcHJvcGVydHkuZGVmYXVsdCkgeworICAgICAgICBpbmplY3Rpb25zW2tl
eV0gPSBkZXNjLnR5cGUgKyAnOicgKyAoZGVzYy5uYW1lIHx8IGtleSk7CisgICAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIGluamVjdGlvbnM7CisgIH07CisKKyAgdmFyIENsYXNzTWl4aW4gPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShDbGFzc01peGluUHJvcHMpOworCisgIENsYXNz
TWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmplY3Q7CisKKyAgQ29yZU9iamVjdC5DbGFz
c01peGluID0gQ2xhc3NNaXhpbjsKKworICBDbGFzc01peGluLmFwcGx5KENvcmVPYmplY3QpOwor
CisgIENvcmVPYmplY3QucmVvcGVuKHsKKyAgICBkaWREZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24g
KHByb3RvLCBrZXksIHZhbHVlKSB7CisgICAgICBpZiAoaGFzQ2FjaGVkQ29tcHV0ZWRQcm9wZXJ0
aWVzID09PSBmYWxzZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAodmFs
dWUgaW5zdGFuY2VvZiBfZW1iZXJNZXRhbENvbXB1dGVkLkNvbXB1dGVkUHJvcGVydHkpIHsKKyAg
ICAgICAgdmFyIGNhY2hlID0gX2VtYmVyTWV0YWxNZXRhLm1ldGEodGhpcy5jb25zdHJ1Y3Rvciku
cmVhZGFibGVDYWNoZSgpOworCisgICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5fY29tcHV0ZWRQ
cm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICBjYWNoZS5fY29tcHV0ZWRQcm9w
ZXJ0aWVzID0gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBDb3JlT2JqZWN0OworfSk7CisKKy8vIE5PVEU6IHRoaXMgb2Jq
ZWN0IHNob3VsZCBuZXZlciBiZSBpbmNsdWRlZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgYEVtYmVy
Lk9iamVjdGAuCisvLyBXZSBvbmx5IGRlZmluZSB0aGlzIHNlcGFyYXRlbHkgc28gdGhhdCBgRW1i
ZXIuU2V0YCBjYW4gZGVwZW5kIG9uIGl0LgorCisvKioKKyAgRGVmaW5lcyB0aGUgcHJvcGVydGll
cyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MKKyAgKGluc3Rl
YWQgb2Ygb3ZlcnJpZGRlbikuCisgICBCeSBkZWZhdWx0LCB3aGVuIHlvdSBleHRlbmQgYW4gRW1i
ZXIgY2xhc3MgYSBwcm9wZXJ0eSBkZWZpbmVkIGluCisgIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMg
YSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBpcyBkZWZpbmVkCisgIGluIHRoZSBz
dXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVm
ZXJhYmxlCisgIHRvIGJ1aWxkIHVwIGEgcHJvcGVydHkncyB2YWx1ZSBieSBjb21iaW5pbmcgdGhl
IHN1cGVyY2xhc3MnIHByb3BlcnR5CisgIHZhbHVlIHdpdGggdGhlIHN1YmNsYXNzJyB2YWx1ZS4g
QW4gZXhhbXBsZSBvZiB0aGlzIGluIHVzZSB3aXRoaW4gRW1iZXIKKyAgaXMgdGhlIGBjbGFzc05h
bWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIuVmlld2AuCisgICBIZXJlIGlzIHNvbWUgc2FtcGxlIGNv
ZGUgc2hvd2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29uY2F0ZW5hdGVkCisgIHByb3Bl
cnR5IGFuZCBhIG5vcm1hbCBvbmU6CisgICBgYGBqYXZhc2NyaXB0CisgIEFwcC5CYXJWaWV3ID0g
RW1iZXIuVmlldy5leHRlbmQoeworICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydi
YXInXSwKKyAgICBjbGFzc05hbWVzOiBbJ2JhciddCisgIH0pOworICAgQXBwLkZvb0JhclZpZXcg
PSBBcHAuQmFyVmlldy5leHRlbmQoeworICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTog
Wydmb28nXSwKKyAgICBjbGFzc05hbWVzOiBbJ2ZvbyddCisgIH0pOworICAgdmFyIGZvb0JhclZp
ZXcgPSBBcHAuRm9vQmFyVmlldy5jcmVhdGUoKTsKKyAgZm9vQmFyVmlldy5nZXQoJ3NvbWVOb25D
b25jYXRlbmF0ZWRQcm9wZXJ0eScpOyAvLyBbJ2ZvbyddCisgIGZvb0JhclZpZXcuZ2V0KCdjbGFz
c05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJ10KKyAgYGBgCisgICBUaGlz
IGJlaGF2aW9yIGV4dGVuZHMgdG8gb2JqZWN0IGNyZWF0aW9uIGFzIHdlbGwuIENvbnRpbnVpbmcg
dGhlCisgIGFib3ZlIGV4YW1wbGU6CisgICBgYGBqYXZhc2NyaXB0CisgIHZhciB2aWV3ID0gQXBw
LkZvb0JhclZpZXcuY3JlYXRlKHsKKyAgICBzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHk6IFsn
YmF6J10sCisgICAgY2xhc3NOYW1lczogWydiYXonXQorICB9KQorICB2aWV3LmdldCgnc29tZU5v
bkNvbmNhdGVuYXRlZFByb3BlcnR5Jyk7IC8vIFsnYmF6J10KKyAgdmlldy5nZXQoJ2NsYXNzTmFt
ZXMnKTsgLy8gWydlbWJlci12aWV3JywgJ2JhcicsICdmb28nLCAnYmF6J10KKyAgYGBgCisgIEFk
ZGluZyBhIHNpbmdsZSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBhbiBhcnJheSB3aWxsIGp1c3QgYWRk
IGl0IGluIHRoZSBhcnJheToKKyAgIGBgYGphdmFzY3JpcHQKKyAgdmFyIHZpZXcgPSBBcHAuRm9v
QmFyVmlldy5jcmVhdGUoeworICAgIGNsYXNzTmFtZXM6ICdiYXonCisgIH0pCisgIHZpZXcuZ2V0
KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJywgJ2JheiddCisg
IGBgYAorICAgVXNpbmcgdGhlIGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2Ug
Y2FuIHRlbGwgRW1iZXIgdG8gbWl4IHRoZQorICBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzLgor
ICAgSW4gYEVtYmVyLlZpZXdgIHRoZSBgY2xhc3NOYW1lQmluZGluZ3NgIGFuZCBgYXR0cmlidXRl
QmluZGluZ3NgIHByb3BlcnRpZXMKKyAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlv
biB0byBgY2xhc3NOYW1lc2AuCisgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3Ug
dG8gdXNlIHRocm91Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKKyAgYWx0aG91Z2ggdHlw
aWNhbCBhcHAgZGV2ZWxvcGVycyBhcmUgbGlrZWx5IHRvIHVzZSBpdCBpbmZyZXF1ZW50bHkuIFNp
bmNlCisgIGl0IGNoYW5nZXMgZXhwZWN0YXRpb25zIGFib3V0IGJlaGF2aW9yIG9mIHByb3BlcnRp
ZXMsIHlvdSBzaG91bGQgcHJvcGVybHkKKyAgZG9jdW1lbnQgaXRzIHVzYWdlIGluIGVhY2ggaW5k
aXZpZHVhbCBjb25jYXRlbmF0ZWQgcHJvcGVydHkgKHRvIG5vdAorICBtaXNsZWFkIHlvdXIgdXNl
cnMgdG8gdGhpbmsgdGhleSBjYW4gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGluIGEgc3ViY2xhc3Mp
LgorICAgQHByb3BlcnR5IGNvbmNhdGVuYXRlZFByb3BlcnRpZXMKKyAgQHR5cGUgQXJyYXkKKyAg
QGRlZmF1bHQgbnVsbAorICBAcHVibGljCisqLworCisvKioKKyAgRGVmaW5lcyB0aGUgcHJvcGVy
dGllcyB0aGF0IHdpbGwgYmUgbWVyZ2VkIGZyb20gdGhlIHN1cGVyY2xhc3MKKyAgKGluc3RlYWQg
b2Ygb3ZlcnJpZGRlbikuCisgICBCeSBkZWZhdWx0LCB3aGVuIHlvdSBleHRlbmQgYW4gRW1iZXIg
Y2xhc3MgYSBwcm9wZXJ0eSBkZWZpbmVkIGluCisgIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMgYSBw
cm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBpcyBkZWZpbmVkCisgIGluIHRoZSBzdXBl
cmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBpdCBpcyBwcmVmZXJh
YmxlCisgIHRvIGJ1aWxkIHVwIGEgcHJvcGVydHkncyB2YWx1ZSBieSBtZXJnaW5nIHRoZSBzdXBl
cmNsYXNzIHByb3BlcnR5IHZhbHVlCisgIHdpdGggdGhlIHN1YmNsYXNzIHByb3BlcnR5J3MgdmFs
dWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ugd2l0aGluIEVtYmVyCisgIGlzIHRoZSBgcXVl
cnlQYXJhbXNgIHByb3BlcnR5IG9mIHJvdXRlcy4KKyAgIEhlcmUgaXMgc29tZSBzYW1wbGUgY29k
ZSBzaG93aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBtZXJnZWQKKyAgcHJvcGVydHkgYW5k
IGEgbm9ybWFsIG9uZToKKyAgIGBgYGphdmFzY3JpcHQKKyAgQXBwLkJhclJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKKyAgICBzb21lTm9uTWVyZ2VkUHJvcGVydHk6IHsKKyAgICAgIG5vbk1l
cmdlZDogJ3N1cGVyY2xhc3MgdmFsdWUgb2Ygbm9uTWVyZ2VkJworICAgIH0sCisgICAgcXVlcnlQ
YXJhbXM6IHsKKyAgICAgIHBhZ2U6IHtyZXBsYWNlOiBmYWxzZX0sCisgICAgICBsaW1pdDoge3Jl
cGxhY2U6IHRydWV9CisgICAgfQorICB9KTsKKyAgIEFwcC5Gb29CYXJSb3V0ZSA9IEFwcC5CYXJS
b3V0ZS5leHRlbmQoeworICAgIHNvbWVOb25NZXJnZWRQcm9wZXJ0eTogeworICAgICAgY29tcGxl
dGVseU5vbk1lcmdlZDogJ3N1YmNsYXNzIHZhbHVlIG9mIG5vbk1lcmdlZCcKKyAgICB9LAorICAg
IHF1ZXJ5UGFyYW1zOiB7CisgICAgICBsaW1pdDoge3JlcGxhY2U6IGZhbHNlfQorICAgIH0KKyAg
fSk7CisgICB2YXIgZm9vQmFyUm91dGUgPSBBcHAuRm9vQmFyUm91dGUuY3JlYXRlKCk7CisgICBm
b29CYXJSb3V0ZS5nZXQoJ3NvbWVOb25NZXJnZWRQcm9wZXJ0eScpOworICAvLyA9PiB7IGNvbXBs
ZXRlbHlOb25NZXJnZWQ6ICdzdWJjbGFzcyB2YWx1ZSBvZiBub25NZXJnZWQnIH0KKyAgLy8KKyAg
Ly8gTm90ZSB0aGUgZW50aXJlIG9iamVjdCwgaW5jbHVkaW5nIHRoZSBub25NZXJnZWQgcHJvcGVy
dHkgb2YKKyAgLy8gdGhlIHN1cGVyY2xhc3Mgb2JqZWN0LCBoYXMgYmVlbiByZXBsYWNlZAorICAg
Zm9vQmFyUm91dGUuZ2V0KCdxdWVyeVBhcmFtcycpOworICAvLyA9PiB7CisgIC8vICAgcGFnZTog
e3JlcGxhY2U6IGZhbHNlfSwKKyAgLy8gICBsaW1pdDoge3JlcGxhY2U6IGZhbHNlfQorICAvLyB9
CisgIC8vCisgIC8vIE5vdGUgdGhlIHBhZ2UgcmVtYWlucyBmcm9tIHRoZSBzdXBlcmNsYXNzLCBh
bmQgdGhlCisgIC8vIGBsaW1pdGAgcHJvcGVydHkncyB2YWx1ZSBvZiBgZmFsc2VgIGhhcyBiZWVu
IG1lcmdlZCBmcm9tCisgIC8vIHRoZSBzdWJjbGFzcy4KKyAgYGBgCisgICBUaGlzIGJlaGF2aW9y
IGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nIG9iamVjdCBgY3JlYXRlYCBjYWxscy4gSXQgaXMgb25s
eQorICBhdmFpbGFibGUgYXQgYGV4dGVuZGAgdGltZS4KKyAgIFRoaXMgZmVhdHVyZSBpcyBhdmFp
bGFibGUgZm9yIHlvdSB0byB1c2UgdGhyb3VnaG91dCB0aGUgRW1iZXIgb2JqZWN0IG1vZGVsLAor
ICBhbHRob3VnaCB0eXBpY2FsIGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGlu
ZnJlcXVlbnRseS4gU2luY2UKKyAgaXQgY2hhbmdlcyBleHBlY3RhdGlvbnMgYWJvdXQgYmVoYXZp
b3Igb2YgcHJvcGVydGllcywgeW91IHNob3VsZCBwcm9wZXJseQorICBkb2N1bWVudCBpdHMgdXNh
Z2UgaW4gZWFjaCBpbmRpdmlkdWFsIG1lcmdlZCBwcm9wZXJ0eSAodG8gbm90CisgIG1pc2xlYWQg
eW91ciB1c2VycyB0byB0aGluayB0aGV5IGNhbiBvdmVycmlkZSB0aGUgcHJvcGVydHkgaW4gYSBz
dWJjbGFzcykuCisgICBAcHJvcGVydHkgbWVyZ2VkUHJvcGVydGllcworICBAdHlwZSBBcnJheQor
ICBAZGVmYXVsdCBudWxsCisgIEBwdWJsaWMKKyovCisKKy8qKgorICBEZXN0cm95ZWQgb2JqZWN0
IHByb3BlcnR5IGZsYWcuCisgICBpZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgb2JzZXJ2
ZXJzIGFuZCBiaW5kaW5ncyB3ZXJlIGFscmVhZHkKKyAgcmVtb3ZlZCBieSB0aGUgZWZmZWN0IG9m
IGNhbGxpbmcgdGhlIGBkZXN0cm95KClgIG1ldGhvZC4KKyAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3ll
ZAorICBAZGVmYXVsdCBmYWxzZQorICBAcHVibGljCisqLworCisvKioKKyAgRGVzdHJ1Y3Rpb24g
c2NoZWR1bGVkIGZsYWcuIFRoZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgor
ICAgVGhlIG9iamVjdCBzdGF5cyBpbnRhY3QgdW50aWwgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3Ag
YXQgd2hpY2ggcG9pbnQKKyAgdGhlIGBpc0Rlc3Ryb3llZGAgZmxhZyBpcyBzZXQuCisgICBAcHJv
cGVydHkgaXNEZXN0cm95aW5nCisgIEBkZWZhdWx0IGZhbHNlCisgIEBwdWJsaWMKKyovCisKKy8q
KgorICBEZXN0cm95cyBhbiBvYmplY3QgYnkgc2V0dGluZyB0aGUgYGlzRGVzdHJveWVkYCBmbGFn
IGFuZCByZW1vdmluZyBpdHMKKyAgbWV0YWRhdGEsIHdoaWNoIGVmZmVjdGl2ZWx5IGRlc3Ryb3lz
IG9ic2VydmVycyBhbmQgYmluZGluZ3MuCisgICBJZiB5b3UgdHJ5IHRvIHNldCBhIHByb3BlcnR5
IG9uIGEgZGVzdHJveWVkIG9iamVjdCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUKKyAgcmFpc2VkLgor
ICAgTm90ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGVuZCBvZiB0aGUg
cnVuIGxvb3AgYW5kIGRvZXMgbm90CisgIGhhcHBlbiBpbW1lZGlhdGVseS4gIEl0IHdpbGwgc2V0
IGFuIGlzRGVzdHJveWluZyBmbGFnIGltbWVkaWF0ZWx5LgorICAgQG1ldGhvZCBkZXN0cm95Cisg
IEByZXR1cm4ge0VtYmVyLk9iamVjdH0gcmVjZWl2ZXIKKyAgQHB1YmxpYworKi8KKworLyoqCisg
IE92ZXJyaWRlIHRvIGltcGxlbWVudCB0ZWFyZG93bi4KKyAgIEBtZXRob2Qgd2lsbERlc3Ryb3kK
KyAgQHB1YmxpYworKi8KKworLyoqCisgIEludm9rZWQgYnkgdGhlIHJ1biBsb29wIHRvIGFjdHVh
bGx5IGRlc3Ryb3kgdGhlIG9iamVjdC4gVGhpcyBpcworICBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlv
biBieSB0aGUgYGRlc3Ryb3lgIG1ldGhvZC4KKyAgIEBwcml2YXRlCisgIEBtZXRob2QgX3NjaGVk
dWxlZERlc3Ryb3kKKyovCisKKy8qKgorICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9u
IHdoaWNoIGF0dGVtcHRzIHRvIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbgorICB0aGFuIEphdmFz
Y3JpcHQncyBgdG9TdHJpbmdgIHR5cGljYWxseSBkb2VzLCBpbiBhIGdlbmVyaWMgd2F5IGZvciBh
bGwgRW1iZXIKKyAgb2JqZWN0cy4KKyAgIGBgYGphdmFzY3JpcHQKKyAgQXBwLlBlcnNvbiA9IEVt
Lk9iamVjdC5leHRlbmQoKQorICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCisgIHBlcnNv
bi50b1N0cmluZygpIC8vPT4gIjxBcHAuUGVyc29uOmVtYmVyMTAyND4iCisgIGBgYAorICAgSWYg
dGhlIG9iamVjdCdzIGNsYXNzIGlzIG5vdCBkZWZpbmVkIG9uIGFuIEVtYmVyIG5hbWVzcGFjZSwg
aXQgd2lsbAorICBpbmRpY2F0ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdpc3RlcmVkIHN1
cGVyY2xhc3M6CisgIGBgYGphdmFzY3JpcHQKKyAgU3R1ZGVudCA9IEFwcC5QZXJzb24uZXh0ZW5k
KCkKKyAgc3R1ZGVudCA9IFN0dWRlbnQuY3JlYXRlKCkKKyAgc3R1ZGVudC50b1N0cmluZygpIC8v
PT4gIjwoc3ViY2xhc3Mgb2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1PiIKKyAgYGBgCisgICBJZiB0
aGUgbWV0aG9kIGB0b1N0cmluZ0V4dGVuc2lvbmAgaXMgZGVmaW5lZCwgaXRzIHJldHVybiB2YWx1
ZSB3aWxsIGJlCisgIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisgICBgYGBqYXZhc2NyaXB0Cisg
IEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5leHRlbmQoeworICAgIHRvU3RyaW5nRXh0ZW5zaW9u
OiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmdldCgnZnVsbE5hbWUnKTsKKyAgICB9
CisgIH0pOworICB0ZWFjaGVyID0gQXBwLlRlYWNoZXIuY3JlYXRlKCkKKyAgdGVhY2hlci50b1N0
cmluZygpOyAvLz0+ICI8QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxlPiIKKyAgYGBgCisg
ICBAbWV0aG9kIHRvU3RyaW5nCisgIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0
aW9uCisgIEBwdWJsaWMKKyovCitlbmlmZWQoJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL2VhY2hfcHJv
eHknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVy
dHlfZ2V0JywgJ2VtYmVyLW1ldGFsL29ic2VydmVyJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2V2
ZW50cycsICdlbWJlci1tZXRhbC9lbXB0eV9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMv
YXJyYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbE9ic2VydmVyLCBfZW1iZXJNZXRhbFByb3BlcnR5X2V2
ZW50cywgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheSkg
eworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgVGhpcyBpcyB0aGUgb2JqZWN0IGluc3Rh
bmNlIHJldHVybmVkIHdoZW4geW91IGdldCB0aGUgYEBlYWNoYCBwcm9wZXJ0eSBvbiBhbgorICAg
IGFycmF5LiBJdCB1c2VzIHRoZSB1bmtub3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRvbWF0aWNh
bGx5IGNyZWF0ZQorICAgIEVhY2hBcnJheSBpbnN0YW5jZXMgZm9yIHByb3BlcnR5IG5hbWVzLgor
ICAgIEBjbGFzcyBFYWNoUHJveHkKKyAgICBAcHJpdmF0ZQorICAqLworICBmdW5jdGlvbiBFYWNo
UHJveHkoY29udGVudCkgeworICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50OworICAgIHRoaXMu
X2tleXMgPSB1bmRlZmluZWQ7CisgICAgdGhpcy5fX2VtYmVyX21ldGFfXyA9IG51bGw7CisgIH0K
KworICBFYWNoUHJveHkucHJvdG90eXBlID0geworICAgIF9fZGVmaW5lTm9uRW51bWVyYWJsZTog
ZnVuY3Rpb24gKHByb3BlcnR5KSB7CisgICAgICB0aGlzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVy
dHkuZGVzY3JpcHRvci52YWx1ZTsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIEFSUkFZIENI
QU5HRVMKKyAgICAvLyBJbnZva2VzIHdoZW5ldmVyIHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiBj
aGFuZ2VzLgorCisgICAgYXJyYXlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAoY29udGVudCwgaWR4LCBy
ZW1vdmVkQ250LCBhZGRlZENudCkgeworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAg
ICAgdmFyIGxpbSA9IHJlbW92ZWRDbnQgPiAwID8gaWR4ICsgcmVtb3ZlZENudCA6IC0xOworICAg
ICAgZm9yICh2YXIga2V5IGluIGtleXMpIHsKKyAgICAgICAgaWYgKGxpbSA+IDApIHsKKyAgICAg
ICAgICByZW1vdmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5LCB0aGlzLCBpZHgs
IGxpbSk7CisgICAgICAgIH0KKyAgICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CisgICAgICB9CisgICAgfSwKKworICAgIGFycmF5
RGlkQ2hhbmdlOiBmdW5jdGlvbiAoY29udGVudCwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENudCkg
eworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAgdmFyIGxpbSA9IGFkZGVkQ250
ID4gMCA/IGlkeCArIGFkZGVkQ250IDogLTE7CisgICAgICBmb3IgKHZhciBrZXkgaW4ga2V5cykg
eworICAgICAgICBpZiAobGltID4gMCkgeworICAgICAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVu
dEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsKKyAgICAgICAgfQorICAgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X2V2ZW50cy5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOwor
ICAgICAgfQorICAgIH0sCisKKyAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgICAgLy8gTElTVEVOIEZPUiBORVcgT0JTRVJW
RVJTIEFORCBPVEhFUiBFVkVOVCBMSVNURU5FUlMKKyAgICAvLyBTdGFydCBtb25pdG9yaW5nIGtl
eXMgYmFzZWQgb24gd2hvIGlzIGxpc3RlbmluZy4uLgorCisgICAgd2lsbFdhdGNoUHJvcGVydHk6
IGZ1bmN0aW9uIChwcm9wZXJ0eSkgeworICAgICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRL
ZXkocHJvcGVydHkpOworICAgIH0sCisKKyAgICBkaWRVbndhdGNoUHJvcGVydHk6IGZ1bmN0aW9u
IChwcm9wZXJ0eSkgeworICAgICAgdGhpcy5zdG9wT2JzZXJ2aW5nQ29udGVudEtleShwcm9wZXJ0
eSk7CisgICAgfSwKKworICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICAvLyBDT05URU5UIEtFWSBPQlNFUlZJTkcKKyAg
ICAvLyBBY3R1YWwgd2F0Y2gga2V5cyBvbiB0aGUgc291cmNlIGNvbnRlbnQuCisKKyAgICBiZWdp
bk9ic2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uIChrZXlOYW1lKSB7CisgICAgICB2YXIga2V5
cyA9IHRoaXMuX2tleXM7CisgICAgICBpZiAoIWtleXMpIHsKKyAgICAgICAga2V5cyA9IHRoaXMu
X2tleXMgPSBuZXcgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QuZGVmYXVsdCgpOworICAgICAgfQor
CisgICAgICBpZiAoIWtleXNba2V5TmFtZV0pIHsKKyAgICAgICAga2V5c1trZXlOYW1lXSA9IDE7
CisgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudDsKKyAgICAgICAgdmFyIGxlbiA9
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChjb250ZW50LCAnbGVuZ3RoJyk7CisKKyAgICAg
ICAgYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHRoaXMsIDAsIGxl
bik7CisgICAgICB9IGVsc2UgeworICAgICAgICBrZXlzW2tleU5hbWVdKys7CisgICAgICB9Cisg
ICAgfSwKKworICAgIHN0b3BPYnNlcnZpbmdDb250ZW50S2V5OiBmdW5jdGlvbiAoa2V5TmFtZSkg
eworICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOworICAgICAgaWYgKGtleXMgJiYga2V5c1tr
ZXlOYW1lXSA+IDAgJiYgLS1rZXlzW2tleU5hbWVdIDw9IDApIHsKKyAgICAgICAgdmFyIGNvbnRl
bnQgPSB0aGlzLl9jb250ZW50OworICAgICAgICB2YXIgbGVuID0gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KGNvbnRlbnQsICdsZW5ndGgnKTsKKworICAgICAgICByZW1vdmVPYnNlcnZlckZv
ckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgdGhpcywgMCwgbGVuKTsKKyAgICAgIH0KKyAg
ICB9LAorCisgICAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChvYmosIGtleU5hbWUp
IHsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCBrZXlOYW1lKTsKKyAgICB9LAorCisgICAgY29udGVudEtleURpZENoYW5nZTogZnVuY3Rp
b24gKG9iaiwga2V5TmFtZSkgeworICAgICAgX2VtYmVyTWV0YWxQcm9wZXJ0eV9ldmVudHMucHJv
cGVydHlEaWRDaGFuZ2UodGhpcywga2V5TmFtZSk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9u
IGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBs
b2MpIHsKKyAgICB3aGlsZSAoLS1sb2MgPj0gaWR4KSB7CisgICAgICB2YXIgaXRlbSA9IF9lbWJl
clJ1bnRpbWVNaXhpbnNBcnJheS5vYmplY3RBdChjb250ZW50LCBsb2MpOworICAgICAgaWYgKGl0
ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1doZW4gdXNpbmcgQGVhY2gg
dG8gb2JzZXJ2ZSB0aGUgYXJyYXkgJyArIGNvbnRlbnQgKyAnLCB0aGUgYXJyYXkgbXVzdCByZXR1
cm4gYW4gb2JqZWN0JywgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKTsKKyAgICAgICAgX2VtYmVy
TWV0YWxPYnNlcnZlci5fYWRkQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdj
b250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLmFkZE9i
c2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOworICAg
ICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtl
eShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKKyAgICB3aGlsZSAoLS1sb2Mg
Pj0gaWR4KSB7CisgICAgICB2YXIgaXRlbSA9IF9lbWJlclJ1bnRpbWVNaXhpbnNBcnJheS5vYmpl
Y3RBdChjb250ZW50LCBsb2MpOworICAgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxPYnNlcnZlci5fcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdj
b250ZW50S2V5V2lsbENoYW5nZScpOworICAgICAgICBfZW1iZXJNZXRhbE9ic2VydmVyLnJlbW92
ZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOwor
ICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IEVhY2hQcm94eTsKK30p
OworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnLCBbJ2V4cG9ydHMnLCAn
ZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9uYXRpdmVfYXJyYXknXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyUnVudGltZVN5c3RlbU5h
dGl2ZV9hcnJheSkgeworICAvKmdsb2JhbHMgQ3VzdG9tRXZlbnQgKi8KKworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5vbkxvYWQgPSBvbkxvYWQ7CisgIGV4cG9ydHMucnVuTG9hZEhvb2tz
ID0gcnVuTG9hZEhvb2tzOworCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICB2YXIgbG9hZEhvb2tzID0gX2VtYmVyTWV0YWxD
b3JlLmRlZmF1bHQuRU5WLkVNQkVSX0xPQURfSE9PS1MgfHwge307CisgIHZhciBsb2FkZWQgPSB7
fTsKKyAgdmFyIF9sb2FkZWQgPSBsb2FkZWQ7CisKKyAgZXhwb3J0cy5fbG9hZGVkID0gX2xvYWRl
ZDsKKyAgLyoqCisgICAgRGV0ZWN0cyB3aGVuIGEgc3BlY2lmaWMgcGFja2FnZSBvZiBFbWJlciAo
ZS5nLiAnRW1iZXIuQXBwbGljYXRpb24nKQorICAgIGhhcyBmdWxseSBsb2FkZWQgYW5kIGlzIGF2
YWlsYWJsZSBmb3IgZXh0ZW5zaW9uLgorICAKKyAgICBUaGUgcHJvdmlkZWQgYGNhbGxiYWNrYCB3
aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmFtZWAgcGFzc2VkCisgICAgcmVzb2x2ZWQgZnJvbSBh
IHN0cmluZyBpbnRvIHRoZSBvYmplY3Q6CisgIAorICAgIGBgYCBqYXZhc2NyaXB0CisgICAgRW1i
ZXIub25Mb2FkKCdFbWJlci5BcHBsaWNhdGlvbicgZnVuY3Rpb24oaGJhcnMpIHsKKyAgICAgIGhi
YXJzLnJlZ2lzdGVySGVscGVyKC4uLik7CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRo
b2Qgb25Mb2FkCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5hbWUg
b2YgaG9vaworICAgIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIGJlIGNh
bGxlZAorICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gb25Mb2FkKG5hbWUsIGNhbGxi
YWNrKSB7CisgICAgdmFyIG9iamVjdCA9IGxvYWRlZFtuYW1lXTsKKworICAgIGxvYWRIb29rc1tu
YW1lXSA9IGxvYWRIb29rc1tuYW1lXSB8fCBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5
LkEoKTsKKyAgICBsb2FkSG9va3NbbmFtZV0ucHVzaE9iamVjdChjYWxsYmFjayk7CisKKyAgICBp
ZiAob2JqZWN0KSB7CisgICAgICBjYWxsYmFjayhvYmplY3QpOworICAgIH0KKyAgfQorCisgIC8q
KgorICAgIENhbGxlZCB3aGVuIGFuIEVtYmVyLmpzIHBhY2thZ2UgKGUuZyBFbWJlci5BcHBsaWNh
dGlvbikgaGFzIGZpbmlzaGVkCisgICAgbG9hZGluZy4gVHJpZ2dlcnMgYW55IGNhbGxiYWNrcyBy
ZWdpc3RlcmVkIGZvciB0aGlzIGV2ZW50LgorICAKKyAgICBAbWV0aG9kIHJ1bkxvYWRIb29rcwor
ICAgIEBmb3IgRW1iZXIKKyAgICBAcGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1lIG9mIGhvb2sKKyAg
ICBAcGFyYW0gb2JqZWN0IHtPYmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNhbGxiYWNrcworICAg
IEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gcnVuTG9hZEhvb2tzKG5hbWUsIG9iamVjdCkg
eworICAgIGxvYWRlZFtuYW1lXSA9IG9iamVjdDsKKworICAgIGlmICh0eXBlb2Ygd2luZG93ID09
PSAnb2JqZWN0JyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicg
JiYgdHlwZW9mIEN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7CisgICAgICB2YXIgZXZlbnQg
PSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwgeyBkZXRhaWw6IG9iamVjdCwgbmFtZTogbmFtZSB9KTsK
KyAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBpZiAobG9h
ZEhvb2tzW25hbWVdKSB7CisgICAgICBsb2FkSG9va3NbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAo
Y2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG9iamVjdCk7CisgICAgICB9KTsK
KyAgICB9CisgIH0KK30pOworLy8gRW1iZXIuRU5WLkVNQkVSX0xPQURfSE9PS1MKK2VuaWZlZCgn
ZW1iZXItcnVudGltZS9zeXN0ZW0vbmFtZXNwYWNlJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFs
L2NvcmUnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3V0aWxzJywg
J2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwg
X2VtYmVyTWV0YWxVdGlscywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZVN5c3RlbU9i
amVjdCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRp
bWUKKyAgKi8KKworICAvLyBFbWJlci5sb29rdXAsIEVtYmVyLkJPT1RFRCwgRW1iZXIuTkFNRV9L
RVksIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zCisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgICBBIE5hbWVzcGFjZSBpcyBhbiBvYmplY3QgdXN1YWxseSB1c2VkIHRvIGNvbnRhaW4gb3Ro
ZXIgb2JqZWN0cyBvciBtZXRob2RzCisgICAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFt
ZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFjZSBhbnl0aW1lIHlvdSB3YW50CisgICAgdG8gZGVmaW5l
IG9uZSBvZiB0aGVzZSBuZXcgY29udGFpbmVycy4KKyAgCisgICAgIyBFeGFtcGxlIFVzYWdlCisg
IAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeUZyYW1ld29yayA9IEVtYmVyLk5hbWVzcGFjZS5j
cmVhdGUoeworICAgICAgVkVSU0lPTjogJzEuMC4wJworICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBAY2xhc3MgTmFtZXNwYWNlCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVt
YmVyLk9iamVjdAorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIE5hbWVzcGFjZSA9IF9lbWJlclJ1
bnRpbWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoeworICAgIGlzTmFtZXNwYWNlOiB0cnVl
LAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgTmFtZXNwYWNlLk5BTUVTUEFDRVMu
cHVzaCh0aGlzKTsKKyAgICAgIE5hbWVzcGFjZS5QUk9DRVNTRUQgPSBmYWxzZTsKKyAgICB9LAor
CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBuYW1lID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICduYW1lJykgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdtb2R1bGVQcmVmaXgnKTsKKyAgICAgIGlmIChuYW1lKSB7CisgICAgICAg
IHJldHVybiBuYW1lOworICAgICAgfQorCisgICAgICBmaW5kTmFtZXNwYWNlcygpOworICAgICAg
cmV0dXJuIHRoaXNbTkFNRV9LRVldOworICAgIH0sCisKKyAgICBuYW1lQ2xhc3NlczogZnVuY3Rp
b24gKCkgeworICAgICAgcHJvY2Vzc05hbWVzcGFjZShbdGhpcy50b1N0cmluZygpXSwgdGhpcywg
e30pOworICAgIH0sCisKKyAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgbmFt
ZXNwYWNlcyA9IE5hbWVzcGFjZS5OQU1FU1BBQ0VTOworICAgICAgdmFyIHRvU3RyaW5nID0gdGhp
cy50b1N0cmluZygpOworCisgICAgICBpZiAodG9TdHJpbmcpIHsKKyAgICAgICAgX2VtYmVyTWV0
YWxDb3JlLmRlZmF1bHQubG9va3VwW3RvU3RyaW5nXSA9IHVuZGVmaW5lZDsKKyAgICAgICAgZGVs
ZXRlIE5hbWVzcGFjZS5OQU1FU1BBQ0VTX0JZX0lEW3RvU3RyaW5nXTsKKyAgICAgIH0KKyAgICAg
IG5hbWVzcGFjZXMuc3BsaWNlKG5hbWVzcGFjZXMuaW5kZXhPZih0aGlzKSwgMSk7CisgICAgICB0
aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgfSk7CisKKyAgTmFt
ZXNwYWNlLnJlb3BlbkNsYXNzKHsKKyAgICBOQU1FU1BBQ0VTOiBbX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHRdLAorICAgIE5BTUVTUEFDRVNfQllfSUQ6IHt9LAorICAgIFBST0NFU1NFRDogZmFsc2Us
CisgICAgcHJvY2Vzc0FsbDogcHJvY2Vzc0FsbE5hbWVzcGFjZXMsCisgICAgYnlOYW1lOiBmdW5j
dGlvbiAobmFtZSkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5CT09URUQp
IHsKKyAgICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIE5BTUVTUEFDRVNfQllfSURbbmFtZV07CisgICAgfQorICB9KTsKKworICB2YXIgTkFNRVNQ
QUNFU19CWV9JRCA9IE5hbWVzcGFjZS5OQU1FU1BBQ0VTX0JZX0lEOworCisgIHZhciBoYXNPd25Q
cm9wID0gKHt9KS5oYXNPd25Qcm9wZXJ0eTsKKworICBmdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNl
KHBhdGhzLCByb290LCBzZWVuKSB7CisgICAgdmFyIGlkeCA9IHBhdGhzLmxlbmd0aDsKKworICAg
IE5BTUVTUEFDRVNfQllfSURbcGF0aHMuam9pbignLicpXSA9IHJvb3Q7CisKKyAgICAvLyBMb29w
IG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1lc3BhY2UsIGxvb2tpbmcgZm9yIGNsYXNz
ZXMKKyAgICBmb3IgKHZhciBrZXkgaW4gcm9vdCkgeworICAgICAgaWYgKCFoYXNPd25Qcm9wLmNh
bGwocm9vdCwga2V5KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBv
YmogPSByb290W2tleV07CisKKyAgICAgIC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBgRW1i
ZXJgIG5hbWVzcGFjZSwgZm9yIGV4YW1wbGUsIHRoZQorICAgICAgLy8gYHBhdGhzYCB3aWxsIHN0
YXJ0IHdpdGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJhdGlvbiB0aHJvdWdoCisgICAgICAvLyB0
aGUgbG9vcCB3aWxsIHVwZGF0ZSB0aGUgKipzZWNvbmQqKiBlbGVtZW50IG9mIHRoaXMgbGlzdCB3
aXRoCisgICAgICAvLyB0aGUga2V5LCBzbyBwcm9jZXNzaW5nIGBFbWJlci5WaWV3YCB3aWxsIG1h
a2UgdGhlIEFycmF5CisgICAgICAvLyBgWydFbWJlcicsICdWaWV3J11gLgorICAgICAgcGF0aHNb
aWR4XSA9IGtleTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSBmb3VuZCBhbiB1bnByb2Nlc3NlZCBj
bGFzcworICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcgJiYg
IW9ialtOQU1FX0tFWV0pIHsKKyAgICAgICAgLy8gUmVwbGFjZSB0aGUgY2xhc3MnIGB0b1N0cmlu
Z2Agd2l0aCB0aGUgZG90LXNlcGFyYXRlZCBwYXRoCisgICAgICAgIC8vIGFuZCBzZXQgaXRzIGBO
QU1FX0tFWWAKKyAgICAgICAgb2JqW05BTUVfS0VZXSA9IHBhdGhzLmpvaW4oJy4nKTsKKworICAg
ICAgICAvLyBTdXBwb3J0IG5lc3RlZCBuYW1lc3BhY2VzCisgICAgICB9IGVsc2UgaWYgKG9iaiAm
JiBvYmouaXNOYW1lc3BhY2UpIHsKKyAgICAgICAgICAvLyBTa2lwIGFsaWFzZWQgbmFtZXNwYWNl
cworICAgICAgICAgIGlmIChzZWVuW19lbWJlck1ldGFsVXRpbHMuZ3VpZEZvcihvYmopXSkgewor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHNlZW5bX2VtYmVy
TWV0YWxVdGlscy5ndWlkRm9yKG9iaildID0gdHJ1ZTsKKworICAgICAgICAgIC8vIFByb2Nlc3Mg
dGhlIGNoaWxkIG5hbWVzcGFjZQorICAgICAgICAgIHByb2Nlc3NOYW1lc3BhY2UocGF0aHMsIG9i
aiwgc2Vlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXRocy5sZW5ndGggPSBpZHg7IC8v
IGN1dCBvdXQgbGFzdCBpdGVtCisgIH0KKworICB2YXIgU1RBUlRTX1dJVEhfVVBQRVJDQVNFID0g
L15bQS1aXS87CisKKyAgZnVuY3Rpb24gdHJ5SXNOYW1lc3BhY2UobG9va3VwLCBwcm9wKSB7Cisg
ICAgdHJ5IHsKKyAgICAgIHZhciBvYmogPSBsb29rdXBbcHJvcF07CisgICAgICByZXR1cm4gb2Jq
ICYmIG9iai5pc05hbWVzcGFjZSAmJiBvYmo7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy8g
Y29udGludWUKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kTmFtZXNwYWNlcygpIHsKKyAg
ICB2YXIgbG9va3VwID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQubG9va3VwOworICAgIHZhciBv
Ymo7CisKKyAgICBpZiAoTmFtZXNwYWNlLlBST0NFU1NFRCkgeworICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGZvciAodmFyIHByb3AgaW4gbG9va3VwKSB7CisgICAgICAvLyBPbmx5IHByb2Nl
c3MgZW50aXRpZXMgdGhhdCBzdGFydCB3aXRoIHVwcGVyY2FzZSBBLVoKKyAgICAgIGlmICghU1RB
UlRTX1dJVEhfVVBQRVJDQVNFLnRlc3QocHJvcCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAg
ICB9CisKKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHNvbWUgdmVyc2lvbnMgb2YgSUUgZG9uJ3Qg
c3VwcG9ydCB3aW5kb3cuaGFzT3duUHJvcGVydHkKKyAgICAgIGlmIChsb29rdXAuaGFzT3duUHJv
cGVydHkgJiYgIWxvb2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgICBjb250aW51
ZTsKKyAgICAgIH0KKworICAgICAgLy8gQXQgdGltZXMgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFj
Y2VzcyBjZXJ0YWluIHByb3BlcnRpZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCisgICAgICAvLyBU
aGVyZSBhcmUgYWxzbyB0aW1lcyB3aGVyZSBldmVuIGlmIHdlIGNhbiBhY2Nlc3MgdGhlbSwgd2Ug
YXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAgb2JqID0g
dHJ5SXNOYW1lc3BhY2UobG9va3VwLCBwcm9wKTsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAg
b2JqW05BTUVfS0VZXSA9IHByb3A7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIE5BTUVf
S0VZID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuTkFNRV9LRVkgPSBfZW1iZXJNZXRhbFV0aWxz
LkdVSURfS0VZICsgJ19uYW1lJzsKKworICBmdW5jdGlvbiBzdXBlckNsYXNzU3RyaW5nKG1peGlu
KSB7CisgICAgdmFyIHN1cGVyY2xhc3MgPSBtaXhpbi5zdXBlcmNsYXNzOworICAgIGlmIChzdXBl
cmNsYXNzKSB7CisgICAgICBpZiAoc3VwZXJjbGFzc1tOQU1FX0tFWV0pIHsKKyAgICAgICAgcmV0
dXJuIHN1cGVyY2xhc3NbTkFNRV9LRVldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJu
IHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAg
ICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjbGFzc1RvU3RyaW5nKCkgewor
ICAgIGlmICghX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuQk9PVEVEICYmICF0aGlzW05BTUVfS0VZ
XSkgeworICAgICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKTsKKyAgICB9CisKKyAgICB2YXIgcmV0
OworCisgICAgaWYgKHRoaXNbTkFNRV9LRVldKSB7CisgICAgICByZXQgPSB0aGlzW05BTUVfS0VZ
XTsKKyAgICB9IGVsc2UgaWYgKHRoaXMuX3RvU3RyaW5nKSB7CisgICAgICByZXQgPSB0aGlzLl90
b1N0cmluZzsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHN0ciA9IHN1cGVyQ2xhc3NTdHJpbmco
dGhpcyk7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIHJldCA9ICcoc3ViY2xhc3Mgb2YgJyAr
IHN0ciArICcpJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9ICcodW5rbm93biBtaXhp
biknOworICAgICAgfQorICAgICAgdGhpcy50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOwor
ICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzQWxsTmFt
ZXNwYWNlcygpIHsKKyAgICB2YXIgdW5wcm9jZXNzZWROYW1lc3BhY2VzID0gIU5hbWVzcGFjZS5Q
Uk9DRVNTRUQ7CisgICAgdmFyIHVucHJvY2Vzc2VkTWl4aW5zID0gX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuYW55VW5wcm9jZXNzZWRNaXhpbnM7CisKKyAgICBpZiAodW5wcm9jZXNzZWROYW1lc3Bh
Y2VzKSB7CisgICAgICBmaW5kTmFtZXNwYWNlcygpOworICAgICAgTmFtZXNwYWNlLlBST0NFU1NF
RCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcyB8fCB1bnBy
b2Nlc3NlZE1peGlucykgeworICAgICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1lc3BhY2UuTkFNRVNQ
QUNFUzsKKyAgICAgIHZhciBuYW1lc3BhY2U7CisKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0g
bmFtZXNwYWNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgbmFtZXNwYWNlID0gbmFt
ZXNwYWNlc1tpXTsKKyAgICAgICAgcHJvY2Vzc05hbWVzcGFjZShbbmFtZXNwYWNlLnRvU3RyaW5n
KCldLCBuYW1lc3BhY2UsIHt9KTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxDb3JlLmRl
ZmF1bHQuYW55VW5wcm9jZXNzZWRNaXhpbnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBmdW5j
dGlvbiBtYWtlVG9TdHJpbmcocmV0KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAg
IHJldHVybiByZXQ7CisgICAgfTsKKyAgfQorCisgIF9lbWJlck1ldGFsTWl4aW4uTWl4aW4ucHJv
dG90eXBlLnRvU3RyaW5nID0gY2xhc3NUb1N0cmluZzsgLy8gRVM2VE9ETzogYWx0ZXJpbmcgaW1w
b3J0ZWQgb2JqZWN0cy4gU0JCLgorCisgIGV4cG9ydHMuZGVmYXVsdCA9IE5hbWVzcGFjZTsKK30p
OworZW5pZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9uYXRpdmVfYXJyYXknLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJlci1tZXRhbC9yZXBsYWNlJywgJ2VtYmVyLW1ldGFs
L3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1ydW50aW1lL21peGlu
cy9hcnJheScsICdlbWJlci1ydW50aW1lL21peGlucy9tdXRhYmxlX2FycmF5JywgJ2VtYmVyLXJ1
bnRpbWUvbWl4aW5zL29ic2VydmFibGUnLCAnZW1iZXItcnVudGltZS9taXhpbnMvY29weWFibGUn
LCAnZW1iZXItcnVudGltZS9taXhpbnMvZnJlZXphYmxlJywgJ2VtYmVyLXJ1bnRpbWUvY29weSdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3JlLCBfZW1iZXJNZXRhbFJlcGxhY2Us
IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1l
TWl4aW5zQXJyYXksIF9lbWJlclJ1bnRpbWVNaXhpbnNNdXRhYmxlX2FycmF5LCBfZW1iZXJSdW50
aW1lTWl4aW5zT2JzZXJ2YWJsZSwgX2VtYmVyUnVudGltZU1peGluc0NvcHlhYmxlLCBfZW1iZXJS
dW50aW1lTWl4aW5zRnJlZXphYmxlLCBfZW1iZXJSdW50aW1lQ29weSkgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0
cmljdCc7CisKKyAgLy8gQWRkIEVtYmVyLkFycmF5IHRvIEFycmF5LnByb3RvdHlwZS4gUmVtb3Zl
IG1ldGhvZHMgd2l0aCBuYXRpdmUKKyAgLy8gaW1wbGVtZW50YXRpb25zIGFuZCBzdXBwbHkgc29t
ZSBtb3JlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBnZW5lcmljIG1ldGhvZHMKKyAgLy8gYmVjYXVz
ZSB0aGV5IGFyZSBzbyBjb21tb24uCisKKyAgLyoqCisgICAgVGhlIE5hdGl2ZUFycmF5IG1peGlu
IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCB0byBtYWtlIHRoZSBuYXRpdmUKKyAgICBB
cnJheSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJheSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQg
QVBJcy4gVW5sZXNzIHlvdQorICAgIGhhdmUgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvciBg
RW1iZXIuRVhURU5EX1BST1RPVFlQRVMuQXJyYXlgIHNldCB0bworICAgIGZhbHNlLCB0aGlzIHdp
bGwgYmUgYXBwbGllZCBhdXRvbWF0aWNhbGx5LiBPdGhlcndpc2UgeW91IGNhbiBhcHBseSB0aGUg
bWl4aW4KKyAgICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVtYmVyLk5hdGl2ZUFycmF5LmFwcGx5
KEFycmF5LnByb3RvdHlwZSlgLgorICAKKyAgICBAY2xhc3MgTmF0aXZlQXJyYXkKKyAgICBAbmFt
ZXNwYWNlIEVtYmVyCisgICAgQHVzZXMgRW1iZXIuTXV0YWJsZUFycmF5CisgICAgQHVzZXMgRW1i
ZXIuT2JzZXJ2YWJsZQorICAgIEB1c2VzIEVtYmVyLkNvcHlhYmxlCisgICAgQHB1YmxpYworICAq
LworICB2YXIgTmF0aXZlQXJyYXkgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShfZW1i
ZXJSdW50aW1lTWl4aW5zTXV0YWJsZV9hcnJheS5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5z
T2JzZXJ2YWJsZS5kZWZhdWx0LCBfZW1iZXJSdW50aW1lTWl4aW5zQ29weWFibGUuZGVmYXVsdCwg
eworCisgICAgLy8gYmVjYXVzZSBsZW5ndGggaXMgYSBidWlsdC1pbiBwcm9wZXJ0eSB3ZSBuZWVk
IHRvIGtub3cgdG8ganVzdCBnZXQgdGhlCisgICAgLy8gb3JpZ2luYWwgcHJvcGVydHkuCisgICAg
Z2V0OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgeworICAg
ICAgICByZXR1cm4gdGhpcy5sZW5ndGg7CisgICAgICB9IGVsc2UgaWYgKCdudW1iZXInID09PSB0
eXBlb2Yga2V5KSB7CisgICAgICAgIHJldHVybiB0aGlzW2tleV07CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoa2V5KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAg
b2JqZWN0QXQ6IGZ1bmN0aW9uIChpZHgpIHsKKyAgICAgIHJldHVybiB0aGlzW2lkeF07CisgICAg
fSwKKworICAgIC8vIHByaW1pdGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KKyAgICByZXBsYWNlOiBm
dW5jdGlvbiAoaWR4LCBhbXQsIG9iamVjdHMpIHsKKyAgICAgIGlmICh0aGlzLmlzRnJvemVuKSB7
CisgICAgICAgIHRocm93IF9lbWJlclJ1bnRpbWVNaXhpbnNGcmVlemFibGUuRlJPWkVOX0VSUk9S
OworICAgICAgfQorCisgICAgICAvLyBpZiB3ZSByZXBsYWNlZCBleGFjdGx5IHRoZSBzYW1lIG51
bWJlciBvZiBpdGVtcywgdGhlbiBwYXNzIG9ubHkgdGhlCisgICAgICAvLyByZXBsYWNlZCByYW5n
ZS4gT3RoZXJ3aXNlLCBwYXNzIHRoZSBmdWxsIHJlbWFpbmluZyBhcnJheSBsZW5ndGgKKyAgICAg
IC8vIHNpbmNlIGV2ZXJ5dGhpbmcgaGFzIHNoaWZ0ZWQKKyAgICAgIHZhciBsZW4gPSBvYmplY3Rz
ID8gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KG9iamVjdHMsICdsZW5ndGgnKSA6IDA7Cisg
ICAgICB0aGlzLmFycmF5Q29udGVudFdpbGxDaGFuZ2UoaWR4LCBhbXQsIGxlbik7CisKKyAgICAg
IGlmIChsZW4gPT09IDApIHsKKyAgICAgICAgdGhpcy5zcGxpY2UoaWR4LCBhbXQpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgX2VtYmVyTWV0YWxSZXBsYWNlLl9yZXBsYWNlKHRoaXMsIGlkeCwg
YW10LCBvYmplY3RzKTsKKyAgICAgIH0KKworICAgICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFu
Z2UoaWR4LCBhbXQsIGxlbik7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgLy8g
SWYgeW91IGFzayBmb3IgYW4gdW5rbm93biBwcm9wZXJ0eSwgdGhlbiB0cnkgdG8gY29sbGVjdCB0
aGUgdmFsdWUKKyAgICAvLyBmcm9tIG1lbWJlciBpdGVtcy4KKyAgICB1bmtub3duUHJvcGVydHk6
IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICB2YXIgcmV0OyAvLyA9IHRoaXMucmVkdWNl
ZFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYg
cmV0ID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgcmV0ID0gdGhpc1trZXldID0gdmFsdWU7Cisg
ICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICBpbmRleE9mOiBBcnJheS5w
cm90b3R5cGUuaW5kZXhPZiwKKyAgICBsYXN0SW5kZXhPZjogQXJyYXkucHJvdG90eXBlLmxhc3RJ
bmRleE9mLAorCisgICAgY29weTogZnVuY3Rpb24gKGRlZXApIHsKKyAgICAgIGlmIChkZWVwKSB7
CisgICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICAgIHJl
dHVybiBfZW1iZXJSdW50aW1lQ29weS5kZWZhdWx0KGl0ZW0sIHRydWUpOworICAgICAgICB9KTsK
KyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoKTsKKyAgICB9CisgIH0pOworCisg
IC8vIFJlbW92ZSBhbnkgbWV0aG9kcyBpbXBsZW1lbnRlZCBuYXRpdmVseSBzbyB3ZSBkb24ndCBv
dmVycmlkZSB0aGVtCisgIHZhciBpZ25vcmUgPSBbJ2xlbmd0aCddOworICBOYXRpdmVBcnJheS5r
ZXlzKCkuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkgeworICAgIGlmIChBcnJheS5wcm90
b3R5cGVbbWV0aG9kTmFtZV0pIHsKKyAgICAgIGlnbm9yZS5wdXNoKG1ldGhvZE5hbWUpOworICAg
IH0KKyAgfSk7CisKKyAgZXhwb3J0cy5OYXRpdmVBcnJheSAvLyBUT0RPOiBvbmx5IHVzZSBkZWZh
dWx0IGV4cG9ydAorICAgPSBOYXRpdmVBcnJheSA9IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHko
TmF0aXZlQXJyYXksIGlnbm9yZSk7CisKKyAgLyoqCisgICAgQ3JlYXRlcyBhbiBgRW1iZXIuTmF0
aXZlQXJyYXlgIGZyb20gYW4gQXJyYXkgbGlrZSBvYmplY3QuCisgICAgRG9lcyBub3QgbW9kaWZ5
IHRoZSBvcmlnaW5hbCBvYmplY3QuIEVtYmVyLkEgaXMgbm90IG5lZWRlZCBpZgorICAgIGBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFU2AgaXMgYHRydWVgICh0aGUgZGVmYXVsdCB2YWx1ZSkuIEhvd2V2
ZXIsCisgICAgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIEVtYmVyLkEgd2hlbiBjcmVh
dGluZyBhZGRvbnMgZm9yCisgICAgZW1iZXIgb3Igd2hlbiB5b3UgY2FuIG5vdCBndWFyYW50ZWUg
dGhhdCBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgCisgICAgd2lsbCBiZSBgdHJ1ZWAuCisgIAor
ICAgIEV4YW1wbGUKKyAgCisgICAgYGBganMKKyAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21w
b25lbnQuZXh0ZW5kKHsKKyAgICAgIHRhZ05hbWU6ICd1bCcsCisgICAgICBjbGFzc05hbWVzOiBb
J3BhZ2luYXRpb24nXSwKKyAgCisgICAgICBpbml0KCkgeworICAgICAgICB0aGlzLl9zdXBlcigu
Li5hcmd1bWVudHMpOworICAKKyAgICAgICAgaWYgKCF0aGlzLmdldCgnY29udGVudCcpKSB7Cisg
ICAgICAgICAgdGhpcy5zZXQoJ2NvbnRlbnQnLCBFbWJlci5BKCkpOworICAgICAgICB9CisgICAg
ICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2QgQQorICAgIEBmb3IgRW1iZXIK
KyAgICBAcmV0dXJuIHtFbWJlci5OYXRpdmVBcnJheX0KKyAgICBAcHVibGljCisgICovCisgIHZh
ciBBOworCisgIGlmIChfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUyA9
PT0gdHJ1ZSB8fCBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FWFRFTkRfUFJPVE9UWVBFUy5BcnJh
eSkgeworICAgIE5hdGl2ZUFycmF5LmFwcGx5KEFycmF5LnByb3RvdHlwZSk7CisgICAgZXhwb3J0
cy4gLy8gRVM2VE9ETzogU2V0dGluZyBBIG9udG8gdGhlIG9iamVjdCByZXR1cm5lZCBieSBlbWJl
ci1tZXRhbC9jb3JlIHRvIGF2b2lkIGNpcmNsZXMKKyAgICBBID0gQSA9IGZ1bmN0aW9uIChhcnIp
IHsKKyAgICAgIHJldHVybiBhcnIgfHwgW107CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBleHBv
cnRzLkEgPSBBID0gZnVuY3Rpb24gKGFycikgeworICAgICAgaWYgKCFhcnIpIHsKKyAgICAgICAg
YXJyID0gW107CisgICAgICB9CisgICAgICByZXR1cm4gX2VtYmVyUnVudGltZU1peGluc0FycmF5
LmRlZmF1bHQuZGV0ZWN0KGFycikgPyBhcnIgOiBOYXRpdmVBcnJheS5hcHBseShhcnIpOworICAg
IH07CisgIH0KKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5BID0gQTtleHBvcnRzLkEgPSBB
OworICBleHBvcnRzLk5hdGl2ZUFycmF5ID0gTmF0aXZlQXJyYXk7CisgIGV4cG9ydHMuZGVmYXVs
dCA9IE5hdGl2ZUFycmF5OworfSk7CisvLyBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUworZW5pZmVk
KCdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItcnVudGlt
ZS9zeXN0ZW0vY29yZV9vYmplY3QnLCAnZW1iZXItcnVudGltZS9taXhpbnMvb2JzZXJ2YWJsZSdd
LCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1i
ZXJSdW50aW1lTWl4aW5zT2JzZXJ2YWJsZSkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBA
c3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoq
CisgICAgYEVtYmVyLk9iamVjdGAgaXMgdGhlIG1haW4gYmFzZSBjbGFzcyBmb3IgYWxsIEVtYmVy
IG9iamVjdHMuIEl0IGlzIGEgc3ViY2xhc3MKKyAgICBvZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0
aCB0aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFwcGxpZWQuIEZvciBkZXRhaWxzLAorICAg
IHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBvZiB0aGVzZS4KKyAgCisgICAgQGNsYXNz
IE9iamVjdAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAZXh0ZW5kcyBFbWJlci5Db3JlT2Jq
ZWN0CisgICAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFy
IEVtYmVyT2JqZWN0ID0gX2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LmRlZmF1bHQuZXh0
ZW5kKF9lbWJlclJ1bnRpbWVNaXhpbnNPYnNlcnZhYmxlLmRlZmF1bHQpOworICBFbWJlck9iamVj
dC50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gJ0VtYmVyLk9iamVjdCc7Cisg
IH07CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW1iZXJPYmplY3Q7Cit9KTsKK2VuaWZlZCgnZW1i
ZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0X3Byb3h5JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRp
bWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50aW1lL21peGlucy8tcHJveHknXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhp
bnNQcm94eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgYEVtYmVyLk9iamVjdFBy
b3h5YCBmb3J3YXJkcyBhbGwgcHJvcGVydGllcyBub3QgZGVmaW5lZCBieSB0aGUgcHJveHkgaXRz
ZWxmCisgICAgdG8gYSBwcm94aWVkIGBjb250ZW50YCBvYmplY3QuCisgIAorICAgIGBgYGphdmFz
Y3JpcHQKKyAgICBvYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIG5hbWU6ICdG
b28nCisgICAgfSk7CisgIAorICAgIHByb3h5ID0gRW1iZXIuT2JqZWN0UHJveHkuY3JlYXRlKHsK
KyAgICAgIGNvbnRlbnQ6IG9iamVjdAorICAgIH0pOworICAKKyAgICAvLyBBY2Nlc3MgYW5kIGNo
YW5nZSBleGlzdGluZyBwcm9wZXJ0aWVzCisgICAgcHJveHkuZ2V0KCduYW1lJykgICAgICAgICAg
Ly8gJ0ZvbycKKyAgICBwcm94eS5zZXQoJ25hbWUnLCAnQmFyJyk7CisgICAgb2JqZWN0LmdldCgn
bmFtZScpICAgICAgICAgLy8gJ0JhcicKKyAgCisgICAgLy8gQ3JlYXRlIG5ldyAnZGVzY3JpcHRp
b24nIHByb3BlcnR5IG9uIGBvYmplY3RgCisgICAgcHJveHkuc2V0KCdkZXNjcmlwdGlvbicsICdG
b28gaXMgYSB3aGl6Ym9vIGJheicpOworICAgIG9iamVjdC5nZXQoJ2Rlc2NyaXB0aW9uJykgIC8v
ICdGb28gaXMgYSB3aGl6Ym9vIGJheicKKyAgICBgYGAKKyAgCisgICAgV2hpbGUgYGNvbnRlbnRg
IGlzIHVuc2V0LCBzZXR0aW5nIGEgcHJvcGVydHkgdG8gYmUgZGVsZWdhdGVkIHdpbGwgdGhyb3cg
YW4KKyAgICBFcnJvci4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHByb3h5ID0gRW1iZXIu
T2JqZWN0UHJveHkuY3JlYXRlKHsKKyAgICAgIGNvbnRlbnQ6IG51bGwsCisgICAgICBmbGFnOiBu
dWxsCisgICAgfSk7CisgICAgcHJveHkuc2V0KCdmbGFnJywgdHJ1ZSk7CisgICAgcHJveHkuZ2V0
KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQorICAgIHByb3h5LmdldCgnZm9vJyk7ICAgICAgICAg
IC8vIHVuZGVmaW5lZAorICAgIHByb3h5LnNldCgnZm9vJywgJ2RhdGEnKTsgIC8vIHRocm93cyBF
cnJvcgorICAgIGBgYAorICAKKyAgICBEZWxlZ2F0ZWQgcHJvcGVydGllcyBjYW4gYmUgYm91bmQg
dG8gYW5kIHdpbGwgY2hhbmdlIHdoZW4gY29udGVudCBpcyB1cGRhdGVkLgorICAKKyAgICBDb21w
dXRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBwcm94eSBpdHNlbGYgY2FuIGRlcGVuZCBvbiBkZWxlZ2F0
ZWQgcHJvcGVydGllcy4KKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFByb3h5V2l0aENvbXB1
dGVkUHJvcGVydHkgPSBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoeworICAgICAgZnVsbE5hbWU6
IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFt
ZScpLAorICAgICAgICAgICAgbGFzdE5hbWUgPSB0aGlzLmdldCgnbGFzdE5hbWUnKTsKKyAgICAg
ICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFtZSkgeworICAgICAgICAgIHJldHVybiBmaXJzdE5h
bWUgKyAnICcgKyBsYXN0TmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlyc3ROYW1l
IHx8IGxhc3ROYW1lOworICAgICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykK
KyAgICB9KTsKKyAgCisgICAgcHJveHkgPSBQcm94eVdpdGhDb21wdXRlZFByb3BlcnR5LmNyZWF0
ZSgpOworICAKKyAgICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyB1bmRlZmluZWQKKyAgICBw
cm94eS5zZXQoJ2NvbnRlbnQnLCB7CisgICAgICBmaXJzdE5hbWU6ICdUb20nLCBsYXN0TmFtZTog
J0RhbGUnCisgICAgfSk7IC8vIHRyaWdnZXJzIHByb3BlcnR5IGNoYW5nZSBmb3IgZnVsbE5hbWUg
b24gcHJveHkKKyAgCisgICAgcHJveHkuZ2V0KCdmdWxsTmFtZScpOyAgLy8gJ1RvbSBEYWxlJwor
ICAgIGBgYAorICAKKyAgICBAY2xhc3MgT2JqZWN0UHJveHkKKyAgICBAbmFtZXNwYWNlIEVtYmVy
CisgICAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CisgICAgQGV4dGVuZHMgRW1iZXIuX1Byb3h5TWl4
aW4KKyAgICBAcHVibGljCisgICovCisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZChfZW1iZXJSdW50aW1lTWl4aW5zUHJveHkuZGVm
YXVsdCk7Cit9KTsKK2VuaWZlZCgnZW1iZXItcnVudGltZS9zeXN0ZW0vc2VydmljZScsIFsnZXhw
b3J0cycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9vYmplY3QnLCAnZW1iZXItcnVudGltZS9pbmpl
Y3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJl
clJ1bnRpbWVJbmplY3QpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgIENyZWF0ZXMg
YSBwcm9wZXJ0eSB0aGF0IGxhemlseSBsb29rcyB1cCBhIHNlcnZpY2UgaW4gdGhlIGNvbnRhaW5l
ci4gVGhlcmUKKyAgICBhcmUgbm8gcmVzdHJpY3Rpb25zIGFzIHRvIHdoYXQgb2JqZWN0cyBhIHNl
cnZpY2UgY2FuIGJlIGluamVjdGVkIGludG8uCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7CisgICAgICBhdXRoTWFuYWdlcjogRW1iZXIuaW5qZWN0LnNlcnZpY2UoJ2F1dGgnKSwKKyAg
CisgICAgICBtb2RlbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgnYXV0
aE1hbmFnZXInKS5maW5kQ3VycmVudFVzZXIoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAK
KyAgCisgICAgVGhpcyBleGFtcGxlIHdpbGwgY3JlYXRlIGFuIGBhdXRoTWFuYWdlcmAgcHJvcGVy
dHkgb24gdGhlIGFwcGxpY2F0aW9uIHJvdXRlCisgICAgdGhhdCBsb29rcyB1cCB0aGUgYGF1dGhg
IHNlcnZpY2UgaW4gdGhlIGNvbnRhaW5lciwgbWFraW5nIGl0IGVhc2lseQorICAgIGFjY2Vzc2li
bGUgaW4gdGhlIGBtb2RlbGAgaG9vay4KKyAgCisgICAgQG1ldGhvZCBzZXJ2aWNlCisgICAgQHNp
bmNlIDEuMTAuMAorICAgIEBmb3IgRW1iZXIuaW5qZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgKG9wdGlvbmFsKSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGluamVjdCwgZGVmYXVsdHMgdG8K
KyAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmFtZQorICAgIEByZXR1cm4ge0VtYmVyLkluamVj
dGVkUHJvcGVydHl9IGluamVjdGlvbiBkZXNjcmlwdG9yIGluc3RhbmNlCisgICAgQHB1YmxpYwor
ICAqLworICBfZW1iZXJSdW50aW1lSW5qZWN0LmNyZWF0ZUluamVjdGlvbkhlbHBlcignc2Vydmlj
ZScpOworCisgIC8qKgorICAgIEBjbGFzcyBTZXJ2aWNlCisgICAgQG5hbWVzcGFjZSBFbWJlcgor
ICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBzaW5jZSAxLjEwLjAKKyAgICBAcHVibGlj
CisgICovCisgIHZhciBTZXJ2aWNlID0gX2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0
LmV4dGVuZCgpOworCisgIFNlcnZpY2UucmVvcGVuQ2xhc3MoeworICAgIGlzU2VydmljZUZhY3Rv
cnk6IHRydWUKKyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gU2VydmljZTsKK30pOworZW5p
ZmVkKCdlbWJlci1ydW50aW1lL3N5c3RlbS9zdHJpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvdXRpbHMnLCAnZW1iZXItcnVudGltZS91dGlscycsICdl
bWJlci1ydW50aW1lL3N0cmluZ19yZWdpc3RyeScsICdlbWJlci1tZXRhbC9jYWNoZSddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxVdGlscywgX2VtYmVy
UnVudGltZVV0aWxzLCBfZW1iZXJSdW50aW1lU3RyaW5nX3JlZ2lzdHJ5LCBfZW1iZXJNZXRhbENh
Y2hlKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItcnVudGlt
ZQorICAqLworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFNUUklOR19EQVNIRVJJWkVfUkVHRVhQ
ID0gL1sgX10vZzsKKworICB2YXIgU1RSSU5HX0RBU0hFUklaRV9DQUNIRSA9IG5ldyBfZW1iZXJN
ZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24gKGtleSkgeworICAgIHJldHVybiBkZWNh
bWVsaXplKGtleSkucmVwbGFjZShTVFJJTkdfREFTSEVSSVpFX1JFR0VYUCwgJy0nKTsKKyAgfSk7
CisKKyAgdmFyIFNUUklOR19DQU1FTElaRV9SRUdFWFBfMSA9IC8oXC18XF98XC58XHMpKyguKT8v
ZzsKKyAgdmFyIFNUUklOR19DQU1FTElaRV9SRUdFWFBfMiA9IC8oXnxcLykoW0EtWl0pL2c7CisK
KyAgdmFyIENBTUVMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAw
LCBmdW5jdGlvbiAoa2V5KSB7CisgICAgcmV0dXJuIGtleS5yZXBsYWNlKFNUUklOR19DQU1FTEla
RV9SRUdFWFBfMSwgZnVuY3Rpb24gKG1hdGNoLCBzZXBhcmF0b3IsIGNocikgeworICAgICAgcmV0
dXJuIGNociA/IGNoci50b1VwcGVyQ2FzZSgpIDogJyc7CisgICAgfSkucmVwbGFjZShTVFJJTkdf
Q0FNRUxJWkVfUkVHRVhQXzIsIGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBjaHIpIHsKKyAg
ICAgIHJldHVybiBtYXRjaC50b0xvd2VyQ2FzZSgpOworICAgIH0pOworICB9KTsKKworICB2YXIg
U1RSSU5HX0NMQVNTSUZZX1JFR0VYUF8xID0gL14oXC18XykrKC4pPy87CisgIHZhciBTVFJJTkdf
Q0xBU1NJRllfUkVHRVhQXzIgPSAvKC4pKFwtfFxffFwufFxzKSsoLik/L2c7CisgIHZhciBTVFJJ
TkdfQ0xBU1NJRllfUkVHRVhQXzMgPSAvKF58XC98XC4pKFthLXpdKS9nOworCisgIHZhciBDTEFT
U0lGWV9DQUNIRSA9IG5ldyBfZW1iZXJNZXRhbENhY2hlLmRlZmF1bHQoMTAwMCwgZnVuY3Rpb24g
KHN0cikgeworICAgIHZhciByZXBsYWNlMSA9IGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBj
aHIpIHsKKyAgICAgIHJldHVybiBjaHIgPyAnXycgKyBjaHIudG9VcHBlckNhc2UoKSA6ICcnOwor
ICAgIH07CisgICAgdmFyIHJlcGxhY2UyID0gZnVuY3Rpb24gKG1hdGNoLCBpbml0aWFsQ2hhciwg
c2VwYXJhdG9yLCBjaHIpIHsKKyAgICAgIHJldHVybiBpbml0aWFsQ2hhciArIChjaHIgPyBjaHIu
dG9VcHBlckNhc2UoKSA6ICcnKTsKKyAgICB9OworICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgn
LycpOworICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGkgPCBsZW47IGkr
KykgeworICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlKFNUUklOR19DTEFTU0lGWV9S
RUdFWFBfMSwgcmVwbGFjZTEpLnJlcGxhY2UoU1RSSU5HX0NMQVNTSUZZX1JFR0VYUF8yLCByZXBs
YWNlMik7CisgICAgfQorICAgIHJldHVybiBwYXJ0cy5qb2luKCcvJykucmVwbGFjZShTVFJJTkdf
Q0xBU1NJRllfUkVHRVhQXzMsIGZ1bmN0aW9uIChtYXRjaCwgc2VwYXJhdG9yLCBjaHIpIHsKKyAg
ICAgIHJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpOworICAgIH0pOworICB9KTsKKworICB2YXIg
U1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzEgPSAvKFthLXpcZF0pKFtBLVpdKykvZzsKKyAgdmFy
IFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yID0gL1wtfFxzKy9nOworCisgIHZhciBVTkRFUlND
T1JFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAo
c3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8x
LCAnJDFfJDInKS5yZXBsYWNlKFNUUklOR19VTkRFUlNDT1JFX1JFR0VYUF8yLCAnXycpLnRvTG93
ZXJDYXNlKCk7CisgIH0pOworCisgIHZhciBTVFJJTkdfQ0FQSVRBTElaRV9SRUdFWFAgPSAvKF58
XC8pKFthLXpdKS9nOworCisgIHZhciBDQVBJVEFMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFs
Q2FjaGUuZGVmYXVsdCgxMDAwLCBmdW5jdGlvbiAoc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBs
YWNlKFNUUklOR19DQVBJVEFMSVpFX1JFR0VYUCwgZnVuY3Rpb24gKG1hdGNoLCBzZXBhcmF0b3Is
IGNocikgeworICAgICAgcmV0dXJuIG1hdGNoLnRvVXBwZXJDYXNlKCk7CisgICAgfSk7CisgIH0p
OworCisgIHZhciBTVFJJTkdfREVDQU1FTElaRV9SRUdFWFAgPSAvKFthLXpcZF0pKFtBLVpdKS9n
OworCisgIHZhciBERUNBTUVMSVpFX0NBQ0hFID0gbmV3IF9lbWJlck1ldGFsQ2FjaGUuZGVmYXVs
dCgxMDAwLCBmdW5jdGlvbiAoc3RyKSB7CisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklOR19E
RUNBTUVMSVpFX1JFR0VYUCwgJyQxXyQyJykudG9Mb3dlckNhc2UoKTsKKyAgfSk7CisKKyAgZnVu
Y3Rpb24gX2ZtdChzdHIsIGZvcm1hdHMpIHsKKyAgICB2YXIgY2FjaGVkRm9ybWF0cyA9IGZvcm1h
dHM7CisKKyAgICBpZiAoIV9lbWJlclJ1bnRpbWVVdGlscy5pc0FycmF5KGNhY2hlZEZvcm1hdHMp
IHx8IGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CisgICAgICBjYWNoZWRGb3JtYXRzID0gbmV3IEFy
cmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTsKKworICAgICAgZm9yICh2YXIgaSA9IDEsIGwgPSBh
cmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGNhY2hlZEZvcm1hdHNbaSAt
IDFdID0gYXJndW1lbnRzW2ldOworICAgICAgfQorICAgIH0KKworICAgIC8vIGZpcnN0LCByZXBs
YWNlIGFueSBPUkRFUkVEIHJlcGxhY2VtZW50cy4KKyAgICB2YXIgaWR4ID0gMDsgLy8gdGhlIGN1
cnJlbnQgaW5kZXggZm9yIG5vbi1udW1lcmljYWwgcmVwbGFjZW1lbnRzCisgICAgcmV0dXJuIHN0
ci5yZXBsYWNlKC8lQChbMC05XSspPy9nLCBmdW5jdGlvbiAocywgYXJnSW5kZXgpIHsKKyAgICAg
IGFyZ0luZGV4ID0gYXJnSW5kZXggPyBwYXJzZUludChhcmdJbmRleCwgMTApIC0gMSA6IGlkeCsr
OworICAgICAgcyA9IGNhY2hlZEZvcm1hdHNbYXJnSW5kZXhdOworICAgICAgcmV0dXJuIHMgPT09
IG51bGwgPyAnKG51bGwpJyA6IHMgPT09IHVuZGVmaW5lZCA/ICcnIDogX2VtYmVyTWV0YWxVdGls
cy5pbnNwZWN0KHMpOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gZm10KHN0ciwgZm9ybWF0
cykgeworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdFbWJlci5TdHJpbmcuZm10IGlz
IGRlcHJlY2F0ZWQsIHVzZSBFUzYgdGVtcGxhdGUgc3RyaW5ncyBpbnN0ZWFkLicsIGZhbHNlLCB7
IGlkOiAnZW1iZXItc3RyaW5nLXV0aWxzLmZtdCcsIHVudGlsOiAnMy4wLjAnLCB1cmw6ICdodHRw
Oi8vYmFiZWxqcy5pby9kb2NzL2xlYXJuLWVzMjAxNS8jdGVtcGxhdGUtc3RyaW5ncycgfSk7Cisg
ICAgcmV0dXJuIF9mbXQuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOworICB9CisKKyAgZnVu
Y3Rpb24gbG9jKHN0ciwgZm9ybWF0cykgeworICAgIGlmICghX2VtYmVyUnVudGltZVV0aWxzLmlz
QXJyYXkoZm9ybWF0cykgfHwgYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKKyAgICAgIGZvcm1hdHMg
PSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOworICAgIH0KKworICAg
IHN0ciA9IF9lbWJlclJ1bnRpbWVTdHJpbmdfcmVnaXN0cnkuZ2V0KHN0cikgfHwgc3RyOworICAg
IHJldHVybiBfZm10KHN0ciwgZm9ybWF0cyk7CisgIH0KKworICBmdW5jdGlvbiB3KHN0cikgewor
ICAgIHJldHVybiBzdHIuc3BsaXQoL1xzKy8pOworICB9CisKKyAgZnVuY3Rpb24gZGVjYW1lbGl6
ZShzdHIpIHsKKyAgICByZXR1cm4gREVDQU1FTElaRV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisg
IGZ1bmN0aW9uIGRhc2hlcml6ZShzdHIpIHsKKyAgICByZXR1cm4gU1RSSU5HX0RBU0hFUklaRV9D
QUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNhbWVsaXplKHN0cikgeworICAgIHJl
dHVybiBDQU1FTElaRV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNsYXNzaWZ5
KHN0cikgeworICAgIHJldHVybiBDTEFTU0lGWV9DQUNIRS5nZXQoc3RyKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHVuZGVyc2NvcmUoc3RyKSB7CisgICAgcmV0dXJuIFVOREVSU0NPUkVfQ0FDSEUuZ2V0
KHN0cik7CisgIH0KKworICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikgeworICAgIHJldHVybiBD
QVBJVEFMSVpFX0NBQ0hFLmdldChzdHIpOworICB9CisKKyAgLyoqCisgICAgRGVmaW5lcyBzdHJp
bmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5nIHN0cmluZyBmb3JtYXR0aW5nIGFuZCBsb2NhbGl6
YXRpb24uCisgICAgVW5sZXNzIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmdgIGlzIGBm
YWxzZWAgdGhlc2UgbWV0aG9kcyB3aWxsIGFsc28gYmUKKyAgICBhZGRlZCB0byB0aGUgYFN0cmlu
Zy5wcm90b3R5cGVgIGFzIHdlbGwuCisgIAorICAgIEBjbGFzcyBTdHJpbmcKKyAgICBAbmFtZXNw
YWNlIEVtYmVyCisgICAgQHN0YXRpYworICAgIEBwdWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZh
dWx0ID0geworICAgIC8qKgorICAgICAgQXBwbHkgZm9ybWF0dGluZyBvcHRpb25zIHRvIHRoZSBz
dHJpbmcuIFRoaXMgd2lsbCBsb29rIGZvciBvY2N1cnJlbmNlcworICAgICAgb2YgIiVAIiBpbiB5
b3VyIHN0cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggdGhlIGFyZ3VtZW50cyB5b3UgcGFz
cyBpbnRvCisgICAgICB0aGlzIG1ldGhvZC4gSWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgc3Bl
Y2lmaWMgb3JkZXIgb2YgcmVwbGFjZW1lbnQsCisgICAgICB5b3UgY2FuIGFkZCBhIG51bWJlciBh
ZnRlciB0aGUga2V5IGFzIHdlbGwgdG8gaW5kaWNhdGUgd2hpY2ggYXJndW1lbnQKKyAgICAgIHlv
dSB3YW50IHRvIGluc2VydC4KKyAgICAgICBPcmRlcmVkIGluc2VydGlvbnMgYXJlIG1vc3QgdXNl
ZnVsIHdoZW4gYnVpbGRpbmcgbG9jIHN0cmluZ3Mgd2hlcmUgdmFsdWVzCisgICAgICB5b3UgbmVl
ZCB0byBpbnNlcnQgbWF5IGFwcGVhciBpbiBkaWZmZXJlbnQgb3JkZXJzLgorICAgICAgIGBgYGph
dmFzY3JpcHQKKyAgICAgICJIZWxsbyAlQCAlQCIuZm10KCdKb2huJywgJ0RvZScpOyAgICAgLy8g
IkhlbGxvIEpvaG4gRG9lIgorICAgICAgIkhlbGxvICVAMiwgJUAxIi5mbXQoJ0pvaG4nLCAnRG9l
Jyk7ICAvLyAiSGVsbG8gRG9lLCBKb2huIgorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBmbXQK
KyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKKyAgICAgIEBw
YXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBvbGF0
ZSBpbnRvIHN0cmluZy4KKyAgICAgIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIHN0cmluZwor
ICAgICAgQHB1YmxpYworICAgICAgQGRlcHJlY2F0ZWQgVXNlIEVTNiB0ZW1wbGF0ZSBzdHJpbmdz
IGluc3RlYWQ6IGh0dHA6Ly9iYWJlbGpzLmlvL2RvY3MvbGVhcm4tZXMyMDE1LyN0ZW1wbGF0ZS1z
dHJpbmdzCisgICAgKi8KKyAgICBmbXQ6IGZtdCwKKworICAgIC8qKgorICAgICAgRm9ybWF0cyB0
aGUgcGFzc2VkIHN0cmluZywgYnV0IGZpcnN0IGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhlIGxv
Y2FsaXplZAorICAgICAgc3RyaW5ncyBoYXNoLiBUaGlzIGlzIGEgY29udmVuaWVudCB3YXkgdG8g
bG9jYWxpemUgdGV4dC4gU2VlCisgICAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBmb3IgbW9yZSBp
bmZvcm1hdGlvbiBvbiBmb3JtYXR0aW5nLgorICAgICAgIE5vdGUgdGhhdCBpdCBpcyB0cmFkaXRp
b25hbCBidXQgbm90IHJlcXVpcmVkIHRvIHByZWZpeCBsb2NhbGl6ZWQgc3RyaW5nCisgICAgICBr
ZXlzIHdpdGggYW4gdW5kZXJzY29yZSBvciBvdGhlciBjaGFyYWN0ZXIgc28geW91IGNhbiBlYXNp
bHkgaWRlbnRpZnkKKyAgICAgIGxvY2FsaXplZCBzdHJpbmdzLgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIEVtYmVyLlNUUklOR1MgPSB7CisgICAgICAgICdfSGVsbG8gV29ybGQnOiAnQm9u
am91ciBsZSBtb25kZScsCisgICAgICAgICdfSGVsbG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcK
KyAgICAgIH07CisgICAgICAgRW1iZXIuU3RyaW5nLmxvYygiX0hlbGxvIFdvcmxkIik7ICAvLyAn
Qm9uam91ciBsZSBtb25kZSc7CisgICAgICBFbWJlci5TdHJpbmcubG9jKCJfSGVsbG8gJUAgJUAi
LCBbIkpvaG4iLCAiU21pdGgiXSk7ICAvLyAiQm9uam91ciBKb2huIFNtaXRoIjsKKyAgICAgIGBg
YAorICAgICAgIEBtZXRob2QgbG9jCisgICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJp
bmcgdG8gZm9ybWF0CisgICAgICBAcGFyYW0ge0FycmF5fSBmb3JtYXRzIE9wdGlvbmFsIGFycmF5
IG9mIHBhcmFtZXRlcnMgdG8gaW50ZXJwb2xhdGUgaW50byBzdHJpbmcuCisgICAgICBAcmV0dXJu
IHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIGxv
YzogbG9jLAorCisgICAgLyoqCisgICAgICBTcGxpdHMgYSBzdHJpbmcgaW50byBzZXBhcmF0ZSB1
bml0cyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKKyAgICAgIGVtcHR5IHN0
cmluZ3MgaW4gdGhlIHByb2Nlc3MuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNw
bGl0IHRoYXQKKyAgICAgIGlzIG1vc3RseSB1c2VmdWwgd2hlbiBhcHBsaWVkIHRvIHRoZSBgU3Ry
aW5nLnByb3RvdHlwZWAuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuU3RyaW5n
LncoImFscGhhIGJldGEgZ2FtbWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeworICAgICAgICBj
b25zb2xlLmxvZyhrZXkpOworICAgICAgfSk7CisgICAgICAgLy8gPiBhbHBoYQorICAgICAgLy8g
PiBiZXRhCisgICAgICAvLyA+IGdhbW1hCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHcKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBzcGxpdAorICAgICAgQHJldHVy
biB7QXJyYXl9IGFycmF5IGNvbnRhaW5pbmcgdGhlIHNwbGl0IHN0cmluZ3MKKyAgICAgIEBwdWJs
aWMKKyAgICAqLworICAgIHc6IHcsCisKKyAgICAvKioKKyAgICAgIENvbnZlcnRzIGEgY2FtZWxp
emVkIHN0cmluZyBpbnRvIGFsbCBsb3dlciBjYXNlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy4K
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAnaW5uZXJIVE1MJy5kZWNhbWVsaXplKCk7ICAg
ICAgICAgICAvLyAnaW5uZXJfaHRtbCcKKyAgICAgICdhY3Rpb25fbmFtZScuZGVjYW1lbGl6ZSgp
OyAgICAgICAgLy8gJ2FjdGlvbl9uYW1lJworICAgICAgJ2Nzcy1jbGFzcy1uYW1lJy5kZWNhbWVs
aXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkgZmF2b3JpdGUgaXRlbXMn
LmRlY2FtZWxpemUoKTsgIC8vICdteSBmYXZvcml0ZSBpdGVtcycKKyAgICAgIGBgYAorICAgICAg
IEBtZXRob2QgZGVjYW1lbGl6ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5n
IHRvIGRlY2FtZWxpemUuCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBz
dHJpbmcuCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBkZWNhbWVsaXplOiBkZWNhbWVsaXpl
LAorCisgICAgLyoqCisgICAgICBSZXBsYWNlcyB1bmRlcnNjb3Jlcywgc3BhY2VzLCBvciBjYW1l
bENhc2Ugd2l0aCBkYXNoZXMuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgJ2lubmVySFRN
TCcuZGFzaGVyaXplKCk7ICAgICAgICAgIC8vICdpbm5lci1odG1sJworICAgICAgJ2FjdGlvbl9u
YW1lJy5kYXNoZXJpemUoKTsgICAgICAgIC8vICdhY3Rpb24tbmFtZScKKyAgICAgICdjc3MtY2xh
c3MtbmFtZScuZGFzaGVyaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkg
ZmF2b3JpdGUgaXRlbXMnLmRhc2hlcml6ZSgpOyAgLy8gJ215LWZhdm9yaXRlLWl0ZW1zJworICAg
ICAgJ3ByaXZhdGVEb2NzL293bmVySW52b2ljZScuZGFzaGVyaXplKCk7IC8vICdwcml2YXRlLWRv
Y3Mvb3duZXItaW52b2ljZScKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgZGFzaGVyaXplCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gZGFzaGVyaXplLgorICAgICAg
QHJldHVybiB7U3RyaW5nfSB0aGUgZGFzaGVyaXplZCBzdHJpbmcuCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBkYXNoZXJpemU6IGRhc2hlcml6ZSwKKworICAgIC8qKgorICAgICAgUmV0dXJu
cyB0aGUgbG93ZXJDYW1lbENhc2UgZm9ybSBvZiBhIHN0cmluZy4KKyAgICAgICBgYGBqYXZhc2Ny
aXB0CisgICAgICAnaW5uZXJIVE1MJy5jYW1lbGl6ZSgpOyAgICAgICAgICAvLyAnaW5uZXJIVE1M
JworICAgICAgJ2FjdGlvbl9uYW1lJy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbk5hbWUn
CisgICAgICAnY3NzLWNsYXNzLW5hbWUnLmNhbWVsaXplKCk7ICAgICAvLyAnY3NzQ2xhc3NOYW1l
JworICAgICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jYW1lbGl6ZSgpOyAgLy8gJ215RmF2b3JpdGVJ
dGVtcycKKyAgICAgICdNeSBGYXZvcml0ZSBJdGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZhdm9y
aXRlSXRlbXMnCisgICAgICAncHJpdmF0ZS1kb2NzL293bmVyLWludm9pY2UnLmNhbWVsaXplKCk7
IC8vICdwcml2YXRlRG9jcy9vd25lckludm9pY2UnCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9k
IGNhbWVsaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FtZWxp
emUuCisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjYW1lbGl6ZWQgc3RyaW5nLgorICAgICAg
QHB1YmxpYworICAgICovCisgICAgY2FtZWxpemU6IGNhbWVsaXplLAorCisgICAgLyoqCisgICAg
ICBSZXR1cm5zIHRoZSBVcHBlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgorICAgICAgIGBg
YGphdmFzY3JpcHQKKyAgICAgICdpbm5lckhUTUwnLmNsYXNzaWZ5KCk7ICAgICAgICAgIC8vICdJ
bm5lckhUTUwnCisgICAgICAnYWN0aW9uX25hbWUnLmNsYXNzaWZ5KCk7ICAgICAgICAvLyAnQWN0
aW9uTmFtZScKKyAgICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3NpZnkoKTsgICAgIC8vICdDc3ND
bGFzc05hbWUnCisgICAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNsYXNzaWZ5KCk7ICAvLyAnTXlG
YXZvcml0ZUl0ZW1zJworICAgICAgJ3ByaXZhdGUtZG9jcy9vd25lci1pbnZvaWNlJy5jbGFzc2lm
eSgpOyAvLyAnUHJpdmF0ZURvY3MvT3duZXJJbnZvaWNlJworICAgICAgYGBgCisgICAgICAgQG1l
dGhvZCBjbGFzc2lmeQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGNs
YXNzaWZ5CisgICAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lmaWVkIHN0cmluZworICAg
ICAgQHB1YmxpYworICAgICovCisgICAgY2xhc3NpZnk6IGNsYXNzaWZ5LAorCisgICAgLyoqCisg
ICAgICBNb3JlIGdlbmVyYWwgdGhhbiBkZWNhbWVsaXplLiBSZXR1cm5zIHRoZSBsb3dlclxfY2Fz
ZVxfYW5kXF91bmRlcnNjb3JlZAorICAgICAgZm9ybSBvZiBhIHN0cmluZy4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICAnaW5uZXJIVE1MJy51bmRlcnNjb3JlKCk7ICAgICAgICAgIC8vICdp
bm5lcl9odG1sJworICAgICAgJ2FjdGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAgICAvLyAn
YWN0aW9uX25hbWUnCisgICAgICAnY3NzLWNsYXNzLW5hbWUnLnVuZGVyc2NvcmUoKTsgICAgIC8v
ICdjc3NfY2xhc3NfbmFtZScKKyAgICAgICdteSBmYXZvcml0ZSBpdGVtcycudW5kZXJzY29yZSgp
OyAgLy8gJ215X2Zhdm9yaXRlX2l0ZW1zJworICAgICAgJ3ByaXZhdGVEb2NzL293bmVySW52b2lj
ZScudW5kZXJzY29yZSgpOyAvLyAncHJpdmF0ZV9kb2NzL293bmVyX2ludm9pY2UnCisgICAgICBg
YGAKKyAgICAgICBAbWV0aG9kIHVuZGVyc2NvcmUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIg
VGhlIHN0cmluZyB0byB1bmRlcnNjb3JlLgorICAgICAgQHJldHVybiB7U3RyaW5nfSB0aGUgdW5k
ZXJzY29yZWQgc3RyaW5nLgorICAgICAgQHB1YmxpYworICAgICovCisgICAgdW5kZXJzY29yZTog
dW5kZXJzY29yZSwKKworICAgIC8qKgorICAgICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQgZm9y
bSBvZiBhIHN0cmluZworICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICdpbm5lckhUTUwnLmNh
cGl0YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhUTUwnCisgICAgICAnYWN0aW9uX25hbWUnLmNh
cGl0YWxpemUoKSAgICAgICAvLyAnQWN0aW9uX25hbWUnCisgICAgICAnY3NzLWNsYXNzLW5hbWUn
LmNhcGl0YWxpemUoKSAgICAvLyAnQ3NzLWNsYXNzLW5hbWUnCisgICAgICAnbXkgZmF2b3JpdGUg
aXRlbXMnLmNhcGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUgaXRlbXMnCisgICAgICAncHJpdmF0
ZURvY3Mvb3duZXJJbnZvaWNlJy5jYXBpdGFsaXplKCk7IC8vICdQcml2YXRlRG9jcy9vd25lcklu
dm9pY2UnCisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIGNhcGl0YWxpemUKKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLgorICAgICAgQHJldHVybiB7
U3RyaW5nfSBUaGUgY2FwaXRhbGl6ZWQgc3RyaW5nLgorICAgICAgQHB1YmxpYworICAgICovCisg
ICAgY2FwaXRhbGl6ZTogY2FwaXRhbGl6ZQorICB9OworICBleHBvcnRzLmZtdCA9IGZtdDsKKyAg
ZXhwb3J0cy5sb2MgPSBsb2M7CisgIGV4cG9ydHMudyA9IHc7CisgIGV4cG9ydHMuZGVjYW1lbGl6
ZSA9IGRlY2FtZWxpemU7CisgIGV4cG9ydHMuZGFzaGVyaXplID0gZGFzaGVyaXplOworICBleHBv
cnRzLmNhbWVsaXplID0gY2FtZWxpemU7CisgIGV4cG9ydHMuY2xhc3NpZnkgPSBjbGFzc2lmeTsK
KyAgZXhwb3J0cy51bmRlcnNjb3JlID0gdW5kZXJzY29yZTsKKyAgZXhwb3J0cy5jYXBpdGFsaXpl
ID0gY2FwaXRhbGl6ZTsKK30pOworZW5pZmVkKCdlbWJlci1ydW50aW1lL3V0aWxzJywgWydleHBv
cnRzJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FycmF5JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVt
L29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyUnVudGltZU1peGluc0FycmF5LCBf
ZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LmlzQXJyYXkgPSBpc0FycmF5OworICBleHBvcnRzLnR5cGVPZiA9IHR5cGVPZjsKKworICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgIC8vIFRZUElORyAmIEFS
UkFZIE1FU1NBR0lORworICAvLworICB2YXIgVFlQRV9NQVAgPSB7CisgICAgJ1tvYmplY3QgQm9v
bGVhbl0nOiAnYm9vbGVhbicsCisgICAgJ1tvYmplY3QgTnVtYmVyXSc6ICdudW1iZXInLAorICAg
ICdbb2JqZWN0IFN0cmluZ10nOiAnc3RyaW5nJywKKyAgICAnW29iamVjdCBGdW5jdGlvbl0nOiAn
ZnVuY3Rpb24nLAorICAgICdbb2JqZWN0IEFycmF5XSc6ICdhcnJheScsCisgICAgJ1tvYmplY3Qg
RGF0ZV0nOiAnZGF0ZScsCisgICAgJ1tvYmplY3QgUmVnRXhwXSc6ICdyZWdleHAnLAorICAgICdb
b2JqZWN0IE9iamVjdF0nOiAnb2JqZWN0JworICB9OworCisgIHZhciB0b1N0cmluZyA9IE9iamVj
dC5wcm90b3R5cGUudG9TdHJpbmc7CisKKyAgLyoqCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBw
YXNzZWQgb2JqZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UuCisgIAorICAgIE9iamVjdHMg
YXJlIGNvbnNpZGVyZWQgQXJyYXktbGlrZSBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1
ZToKKyAgCisgICAgICAtIHRoZSBvYmplY3QgaXMgYSBuYXRpdmUgQXJyYXkKKyAgICAgIC0gdGhl
IG9iamVjdCBoYXMgYW4gb2JqZWN0QXQgcHJvcGVydHkKKyAgICAgIC0gdGhlIG9iamVjdCBpcyBh
biBPYmplY3QsIGFuZCBoYXMgYSBsZW5ndGggcHJvcGVydHkKKyAgCisgICAgVW5saWtlIGBFbWJl
ci50eXBlT2ZgIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBldmVuIGlmIHRoZSBwYXNzZWQgb2Jq
ZWN0IGlzCisgICAgbm90IGZvcm1hbGx5IGFuIGFycmF5IGJ1dCBhcHBlYXJzIHRvIGJlIGFycmF5
LWxpa2UgKGkuZS4gaW1wbGVtZW50cyBgRW1iZXIuQXJyYXlgKQorICAKKyAgICBgYGBqYXZhc2Ny
aXB0CisgICAgRW1iZXIuaXNBcnJheSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGZhbHNlCisgICAgRW1iZXIuaXNBcnJheShbXSk7ICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUKKyAgICBFbWJlci5pc0FycmF5KEVtYmVy
LkFycmF5UHJveHkuY3JlYXRlKHsgY29udGVudDogW10gfSkpOyAgLy8gdHJ1ZQorICAgIGBgYAor
ICAKKyAgICBAbWV0aG9kIGlzQXJyYXkKKyAgICBAZm9yIEVtYmVyCisgICAgQHBhcmFtIHtPYmpl
Y3R9IG9iaiBUaGUgb2JqZWN0IHRvIHRlc3QKKyAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlm
IHRoZSBwYXNzZWQgb2JqZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UKKyAgICBAcHVibGlj
CisgICovCisKKyAgZnVuY3Rpb24gaXNBcnJheShvYmopIHsKKyAgICBpZiAoIW9iaiB8fCBvYmou
c2V0SW50ZXJ2YWwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKEFycmF5
LmlzQXJyYXkob2JqKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChfZW1i
ZXJSdW50aW1lTWl4aW5zQXJyYXkuZGVmYXVsdC5kZXRlY3Qob2JqKSkgeworICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgdmFyIHR5cGUgPSB0eXBlT2Yob2JqKTsKKyAgICBpZiAoJ2Fy
cmF5JyA9PT0gdHlwZSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvYmou
bGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgJ29iamVjdCcgPT09IHR5cGUpIHsKKyAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICBSZXR1
cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIG9iamVjdC4KKyAgCisgICAgVXNl
IHRoaXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBlIG9m
IGFuIGl0ZW0uCisgICAgSXQgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFjcm9zcyBhbGwg
YnJvd3NlcnMgYW5kIGluY2x1ZGVzIGEgYml0CisgICAgbW9yZSBkZXRhaWwuIEhlcmUgaXMgd2hh
dCB3aWxsIGJlIHJldHVybmVkOgorICAKKyAgICAgICAgfCBSZXR1cm4gVmFsdWUgIHwgTWVhbmlu
ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAg
IHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tfAorICAgICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0
aXZlIG9yIFN0cmluZyBvYmplY3QuICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAnbnVt
YmVyJyAgICAgIHwgTnVtYmVyIHByaW1pdGl2ZSBvciBOdW1iZXIgb2JqZWN0LiAgICAgICAgICAg
ICAgICAgICB8CisgICAgICAgIHwgJ2Jvb2xlYW4nICAgICB8IEJvb2xlYW4gcHJpbWl0aXZlIG9y
IEJvb2xlYW4gb2JqZWN0LiAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICdudWxsJyAgICAg
ICAgfCBOdWxsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHwKKyAgICAgICAgfCAndW5kZWZpbmVkJyAgIHwgVW5kZWZpbmVkIHZhbHVlICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgJ2Z1bmN0aW9uJyAgICB8IEEg
ZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAg
ICAgICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAncmVnZXhwJyAgICAgIHwgQW4gaW5zdGFu
Y2Ugb2YgUmVnRXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwg
J2RhdGUnICAgICAgICB8IEFuIGluc3RhbmNlIG9mIERhdGUgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAorICAgICAgICB8ICdjbGFzcycgICAgICAgfCBBbiBFbWJlciBjbGFzcyAo
Y3JlYXRlZCB1c2luZyBFbWJlci5PYmplY3QuZXh0ZW5kKCkpIHwKKyAgICAgICAgfCAnaW5zdGFu
Y2UnICAgIHwgQW4gRW1iZXIgb2JqZWN0IGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisgICAgICAgIHwgJ2Vycm9yJyAgICAgICB8IEFuIGluc3RhbmNlIG9mIHRoZSBFcnJv
ciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICB8ICdvYmplY3QnICAgICAg
fCBBIEphdmFTY3JpcHQgb2JqZWN0IG5vdCBpbmhlcml0aW5nIGZyb20gRW1iZXIuT2JqZWN0IHwK
KyAgCisgICAgRXhhbXBsZXM6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci50eXBl
T2YoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCisgICAgRW1iZXIudHlw
ZU9mKG51bGwpOyAgICAgICAgICAgICAgICAgICAvLyAnbnVsbCcKKyAgICBFbWJlci50eXBlT2Yo
dW5kZWZpbmVkKTsgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCisgICAgRW1iZXIudHlwZU9m
KCdtaWNoYWVsJyk7ICAgICAgICAgICAgICAvLyAnc3RyaW5nJworICAgIEVtYmVyLnR5cGVPZihu
ZXcgU3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmluZycKKyAgICBFbWJlci50eXBlT2YoMTAx
KTsgICAgICAgICAgICAgICAgICAgIC8vICdudW1iZXInCisgICAgRW1iZXIudHlwZU9mKG5ldyBO
dW1iZXIoMTAxKSk7ICAgICAgICAvLyAnbnVtYmVyJworICAgIEVtYmVyLnR5cGVPZih0cnVlKTsg
ICAgICAgICAgICAgICAgICAgLy8gJ2Jvb2xlYW4nCisgICAgRW1iZXIudHlwZU9mKG5ldyBCb29s
ZWFuKHRydWUpKTsgICAgICAvLyAnYm9vbGVhbicKKyAgICBFbWJlci50eXBlT2YoRW1iZXIubWFr
ZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKKyAgICBFbWJlci50eXBlT2YoWzEsIDIsIDkw
XSk7ICAgICAgICAgICAgIC8vICdhcnJheScKKyAgICBFbWJlci50eXBlT2YoL2FiYy8pOyAgICAg
ICAgICAgICAgICAgIC8vICdyZWdleHAnCisgICAgRW1iZXIudHlwZU9mKG5ldyBEYXRlKCkpOyAg
ICAgICAgICAgICAvLyAnZGF0ZScKKyAgICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmV4dGVu
ZCgpKTsgIC8vICdjbGFzcycKKyAgICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmNyZWF0ZSgp
KTsgIC8vICdpbnN0YW5jZScKKyAgICBFbWJlci50eXBlT2YobmV3IEVycm9yKCd0ZWFtb2NpbCcp
KTsgIC8vICdlcnJvcicKKyAgCisgICAgLy8gJ25vcm1hbCcgSmF2YVNjcmlwdCBvYmplY3QKKyAg
ICBFbWJlci50eXBlT2YoeyBhOiAnYicgfSk7ICAgICAgICAgICAgIC8vICdvYmplY3QnCisgICAg
YGBgCisgIAorICAgIEBtZXRob2QgdHlwZU9mCisgICAgQGZvciBFbWJlcgorICAgIEBwYXJhbSB7
T2JqZWN0fSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrCisgICAgQHJldHVybiB7U3RyaW5nfSB0aGUg
dHlwZQorICAgIEBwdWJsaWMKKyAgKi8KKworICBmdW5jdGlvbiB0eXBlT2YoaXRlbSkgeworICAg
IGlmIChpdGVtID09PSBudWxsKSB7CisgICAgICByZXR1cm4gJ251bGwnOworICAgIH0KKyAgICBp
ZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7CisgICAg
fQorICAgIHZhciByZXQgPSBUWVBFX01BUFt0b1N0cmluZy5jYWxsKGl0ZW0pXSB8fCAnb2JqZWN0
JzsKKworICAgIGlmIChyZXQgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGlmIChfZW1iZXJSdW50
aW1lU3lzdGVtT2JqZWN0LmRlZmF1bHQuZGV0ZWN0KGl0ZW0pKSB7CisgICAgICAgIHJldCA9ICdj
bGFzcyc7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT09ICdvYmplY3QnKSB7CisgICAg
ICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgIHJldCA9ICdlcnJvcic7Cisg
ICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBfZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0
LmRlZmF1bHQpIHsKKyAgICAgICAgcmV0ID0gJ2luc3RhbmNlJzsKKyAgICAgIH0gZWxzZSBpZiAo
aXRlbSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgcmV0ID0gJ2RhdGUnOworICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiByZXQ7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9jb21wYXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9jb21wYXQvcHJlY29tcGlsZScsICdlbWJlci10ZW1wbGF0ZS1j
b21waWxlci9zeXN0ZW0vY29tcGlsZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0v
dGVtcGxhdGUnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyVGVt
cGxhdGVDb21waWxlckNvbXBhdFByZWNvbXBpbGUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0
ZW1Db21waWxlLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtVGVtcGxhdGUpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBFbWJlckhhbmRsZWJhcnMgPSBfZW1iZXJNZXRhbENvcmUuZGVm
YXVsdC5IYW5kbGViYXJzID0gX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuSGFuZGxlYmFycyB8fCB7
fTsKKworICBFbWJlckhhbmRsZWJhcnMucHJlY29tcGlsZSA9IF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJDb21wYXRQcmVjb21waWxlLmRlZmF1bHQ7CisgIEVtYmVySGFuZGxlYmFycy5jb21waWxlID0g
X2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGUuZGVmYXVsdDsKKyAgRW1iZXJIYW5k
bGViYXJzLnRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBsYXRlLmRl
ZmF1bHQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvY29tcGF0L3ByZWNv
bXBpbGUnLCBbJ2V4cG9ydHMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9z
eXN0ZW0vY29tcGlsZV9vcHRpb25zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcmVxdWlyZSwgX2Vt
YmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0aW9ucykgeworICAvKioKKyAgQG1v
ZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisg
ICd1c2Ugc3RyaWN0JzsKKworICB2YXIgY29tcGlsZSwgY29tcGlsZVNwZWM7CisKKyAgZXhwb3J0
cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHN0cmluZykgeworICAgIGlmICgoIWNvbXBpbGUgfHwgIWNv
bXBpbGVTcGVjKSAmJiBfcmVxdWlyZS5oYXMoJ2h0bWxiYXJzLWNvbXBpbGVyL2NvbXBpbGVyJykp
IHsKKyAgICAgIHZhciBDb21waWxlciA9IF9yZXF1aXJlLmRlZmF1bHQoJ2h0bWxiYXJzLWNvbXBp
bGVyL2NvbXBpbGVyJyk7CisKKyAgICAgIGNvbXBpbGUgPSBDb21waWxlci5jb21waWxlOworICAg
ICAgY29tcGlsZVNwZWMgPSBDb21waWxlci5jb21waWxlU3BlYzsKKyAgICB9CisKKyAgICBpZiAo
IWNvbXBpbGUgfHwgIWNvbXBpbGVTcGVjKSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5v
dCBjYWxsIGBwcmVjb21waWxlYCB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBjb21waWxlciBsb2FkZWQu
IFBsZWFzZSBsb2FkIGBlbWJlci10ZW1wbGF0ZS1jb21waWxlci5qc2AgcHJpb3IgdG8gY2FsbGlu
ZyBgcHJlY29tcGlsZWAuJyk7CisgICAgfQorCisgICAgdmFyIGFzT2JqZWN0ID0gYXJndW1lbnRz
WzFdID09PSB1bmRlZmluZWQgPyB0cnVlIDogYXJndW1lbnRzWzFdOworICAgIHZhciBjb21waWxl
RnVuYyA9IGFzT2JqZWN0ID8gY29tcGlsZSA6IGNvbXBpbGVTcGVjOworCisgICAgcmV0dXJuIGNv
bXBpbGVGdW5jKHN0cmluZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0
aW9ucy5kZWZhdWx0KCkpOworICB9OworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBp
bGVyL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsJywgJ2VtYmVyLXRlbXBsYXRlLWNv
bXBpbGVyL3N5c3RlbS9wcmVjb21waWxlJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3Rl
bS9jb21waWxlJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS90ZW1wbGF0ZScsICdl
bWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVy
L3BsdWdpbnMvdHJhbnNmb3JtLW9sZC1iaW5kaW5nLXN5bnRheCcsICdlbWJlci10ZW1wbGF0ZS1j
b21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1vbGQtY2xhc3MtYmluZGluZy1zeW50YXgnLCAnZW1i
ZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0taXRlbS1jbGFzcycsICdlbWJl
ci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1jbG9zdXJlLWNvbXBvbmVudC1h
dHRycy1pbnRvLW11dCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9y
bS1jb21wb25lbnQtYXR0cnMtaW50by1tdXQnLCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1
Z2lucy90cmFuc2Zvcm0tY29tcG9uZW50LWN1cmx5LXRvLXJlYWRvbmx5JywgJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWFuZ2xlLWJyYWNrZXQtY29tcG9uZW50cycs
ICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pbnB1dC1vbi10by1v
bkV2ZW50JywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLXRvcC1s
ZXZlbC1jb21wb25lbnRzJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvZGVwcmVj
YXRlLXJlbmRlci1tb2RlbCcsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3ByZXZl
bnQtcmVuZGVyLWJsb2NrJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNm
b3JtLWlubGluZS1saW5rLXRvJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNz
ZXJ0LW5vLXZpZXctYW5kLWNvbnRyb2xsZXItcGF0aHMnLCAnZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvcGx1Z2lucy9hc3NlcnQtbm8tdmlldy1oZWxwZXInLCAnZW1iZXItdGVtcGxhdGUtY29tcGls
ZXIvcGx1Z2lucy9hc3NlcnQtbm8tZWFjaC1pbicsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9j
b21wYXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsLCBfZW1iZXJUZW1wbGF0ZUNv
bXBpbGVyU3lzdGVtUHJlY29tcGlsZSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBp
bGUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSwgX2VtYmVyVGVtcGxhdGVD
b21waWxlclBsdWdpbnMsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xk
QmluZGluZ1N5bnRheCwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1PbGRD
bGFzc0JpbmRpbmdTeW50YXgsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3Jt
SXRlbUNsYXNzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1RyYW5zZm9ybUNsb3N1cmVD
b21wb25lbnRBdHRyc0ludG9NdXQsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNm
b3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0LCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1Ry
YW5zZm9ybUNvbXBvbmVudEN1cmx5VG9SZWFkb25seSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBs
dWdpbnNUcmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyUGx1Z2luc1RyYW5zZm9ybUlucHV0T25Ub09uRXZlbnQsIF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJQbHVnaW5zVHJhbnNmb3JtVG9wTGV2ZWxDb21wb25lbnRzLCBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyUGx1Z2luc0RlcHJlY2F0ZVJlbmRlck1vZGVsLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1
Z2luc1ByZXZlbnRSZW5kZXJCbG9jaywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFu
c2Zvcm1JbmxpbmVMaW5rVG8sIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zQXNzZXJ0Tm9W
aWV3QW5kQ29udHJvbGxlclBhdGhzLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0Fzc2Vy
dE5vVmlld0hlbHBlciwgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNBc3NlcnROb0VhY2hJ
biwgX2VtYmVyVGVtcGxhdGVDb21waWxlckNvbXBhdCkgeworICAndXNlIHN0cmljdCc7CisKKyAg
X2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xkQmluZGluZ1N5bnRheC5kZWZhdWx0
KTsKKyAgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcs
IF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zVHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3lu
dGF4LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBs
dWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1JdGVtQ2xh
c3MuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zLnJlZ2lzdGVyUGx1
Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc1RyYW5zZm9ybUNsb3N1cmVD
b21wb25lbnRBdHRyc0ludG9NdXQuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQ
bHVnaW5zLnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lu
c1RyYW5zZm9ybUNvbXBvbmVudEF0dHJzSW50b011dC5kZWZhdWx0KTsKKyAgX2VtYmVyVGVtcGxh
dGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJlclRlbXBsYXRlQ29t
cGlsZXJQbHVnaW5zVHJhbnNmb3JtQ29tcG9uZW50Q3VybHlUb1JlYWRvbmx5LmRlZmF1bHQpOwor
ICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdpbignYXN0JywgX2Vt
YmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRz
LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdp
bignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1JbnB1dE9uVG9P
bkV2ZW50LmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdpc3Rl
clBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1Ub3BM
ZXZlbENvbXBvbmVudHMuZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5z
LnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0RlcHJl
Y2F0ZVJlbmRlck1vZGVsLmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lu
cy5yZWdpc3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNQcmV2
ZW50UmVuZGVyQmxvY2suZGVmYXVsdCk7CisgIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5z
LnJlZ2lzdGVyUGx1Z2luKCdhc3QnLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2luc0Fzc2Vy
dE5vRWFjaEluLmRlZmF1bHQpOworICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyUGx1Z2lucy5yZWdp
c3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdpbnNUcmFuc2Zvcm1J
bmxpbmVMaW5rVG8uZGVmYXVsdCk7CisKKyAgaWYgKCFfZW1iZXJNZXRhbC5kZWZhdWx0LkVOVi5f
RU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQpIHsKKyAgICBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVy
UGx1Z2lucy5yZWdpc3RlclBsdWdpbignYXN0JywgX2VtYmVyVGVtcGxhdGVDb21waWxlclBsdWdp
bnNBc3NlcnROb1ZpZXdBbmRDb250cm9sbGVyUGF0aHMuZGVmYXVsdCk7CisgICAgX2VtYmVyVGVt
cGxhdGVDb21waWxlclBsdWdpbnMucmVnaXN0ZXJQbHVnaW4oJ2FzdCcsIF9lbWJlclRlbXBsYXRl
Q29tcGlsZXJQbHVnaW5zQXNzZXJ0Tm9WaWV3SGVscGVyLmRlZmF1bHQpOworICB9CisKKyAgZXhw
b3J0cy5fRW1iZXIgPSBfZW1iZXJNZXRhbC5kZWZhdWx0OworICBleHBvcnRzLnByZWNvbXBpbGUg
PSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtUHJlY29tcGlsZS5kZWZhdWx0OworICBleHBv
cnRzLmNvbXBpbGUgPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ29tcGlsZS5kZWZhdWx0
OworICBleHBvcnRzLnRlbXBsYXRlID0gX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbVRlbXBs
YXRlLmRlZmF1bHQ7CisgIGV4cG9ydHMucmVnaXN0ZXJQbHVnaW4gPSBfZW1iZXJUZW1wbGF0ZUNv
bXBpbGVyUGx1Z2lucy5yZWdpc3RlclBsdWdpbjsKK30pOworCisvLyB1c2VkIGZvciBhZGRpbmcg
RW1iZXIuSGFuZGxlYmFycy5jb21waWxlIGZvciBiYWNrd2FyZHMgY29tcGF0CitlbmlmZWQoJ2Vt
YmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4
cG9ydHMpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci10ZW1w
bGF0ZS1jb21waWxlcgorICAqLworCisgIC8qKgorICAgQHByaXZhdGUKKyAgIEBwcm9wZXJ0eSBo
ZWxwZXJzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnJlZ2lzdGVyUGx1Z2lu
ID0gcmVnaXN0ZXJQbHVnaW47CisgIHZhciBwbHVnaW5zID0geworICAgIGFzdDogW10KKyAgfTsK
KworICAvKioKKyAgICBBZGRzIGFuIEFTVCBwbHVnaW4gdG8gYmUgdXNlZCBieSBFbWJlci5IVE1M
QmFycy5jb21waWxlLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgcmVnaXN0ZXJBU1RQ
bHVnaW4KKyAgKi8KKworICBmdW5jdGlvbiByZWdpc3RlclBsdWdpbih0eXBlLCBQbHVnaW4pIHsK
KyAgICBpZiAoIXBsdWdpbnNbdHlwZV0pIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1w
dGluZyB0byByZWdpc3RlciAiJyArIFBsdWdpbiArICciIGFzICInICsgdHlwZSArICciIHdoaWNo
IGlzIG5vdCBhIHZhbGlkIEhUTUxCYXJzIHBsdWdpbiB0eXBlLicpOworICAgIH0KKworICAgIHBs
dWdpbnNbdHlwZV0ucHVzaChQbHVnaW4pOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcGx1
Z2luczsKK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL2Fzc2Vy
dC1uby1lYWNoLWluJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0
YWwvZGVidWcnLCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2Nh
dGlvbi1kaXNwbGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJl
ck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlv
bkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIEFzc2VydE5vRWFjaElu
KCkgeworICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50
c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CisKKyAgICB0aGlzLnN5bnRh
eCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIEFzc2VydE5v
RWFjaEluLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBBc3NlcnROb0VhY2hJbl90cmFu
c2Zvcm0oYXN0KSB7CisgICAgaWYgKCEhX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQuRU5WLl9FTkFC
TEVfTEVHQUNZX1ZJRVdfU1VQUE9SVCkgeworICAgICAgcmV0dXJuIGFzdDsKKyAgICB9CisgICAg
dmFyIHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKyAgICB2YXIgbW9kdWxlTmFt
ZSA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kdWxlTmFtZTsKKworICAgIHdhbGtl
ci52aXNpdChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUp
KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGFzc2VydEhlbHBlcihtb2R1bGVO
YW1lLCBub2RlKTsKKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rp
b24gYXNzZXJ0SGVscGVyKG1vZHVsZU5hbWUsIG5vZGUpIHsKKyAgICB2YXIgbW9kdWxlSW5mbyA9
IF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVm
YXVsdChtb2R1bGVOYW1lLCBub2RlLmxvYyk7CisgICAgdmFyIHNpbmd1bGFyID0gbm9kZS5wYXJh
bXNbMF0ub3JpZ2luYWw7CisgICAgdmFyIHBsdXJhbCA9IG5vZGUucGFyYW1zWzJdLm9yaWdpbmFs
OworCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1VzaW5nIHt7I2VhY2ggJyArIHNpbmd1
bGFyICsgJyBpbiAnICsgcGx1cmFsICsgJ319ICcgKyBtb2R1bGVJbmZvICsgJ2lzIG5vIGxvbmdl
ciBzdXBwb3J0ZWQgaW4gRW1iZXIgMi4wKywgcGxlYXNlIHVzZSB7eyNlYWNoICcgKyBwbHVyYWwg
KyAnIGFzIHwnICsgc2luZ3VsYXIgKyAnfH19Jyk7CisgIH0KKworICBmdW5jdGlvbiB2YWxpZGF0
ZShub2RlKSB7CisgICAgcmV0dXJuIChub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcgfHwg
bm9kZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSAmJiBub2RlLnBhdGgub3JpZ2luYWwg
PT09ICdlYWNoJyAmJiBub2RlLnBhcmFtcy5sZW5ndGggPT09IDMgJiYgbm9kZS5wYXJhbXNbMV0u
dHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJyAmJiBub2RlLnBhcmFtc1sxXS5vcmlnaW5hbCA9PT0g
J2luJzsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9IEFzc2VydE5vRWFjaEluOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNzZXJ0LW5vLXZpZXctYW5k
LWNvbnRyb2xsZXItcGF0aHMnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29yZScsICdlbWJl
ci1tZXRhbC9kZWJ1ZycsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRl
LWxvY2F0aW9uLWRpc3BsYXknXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNhbGN1bGF0ZUxv
Y2F0aW9uRGlzcGxheSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rpb24gQXNzZXJ0Tm9W
aWV3QW5kQ29udHJvbGxlclBhdGhzKCkgeworICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxl
bmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNb
MF07CisKKyAgICAvLyBzZXQgbGF0ZXIgd2l0aGluIEhUTUxCYXJzIHRvIHRoZSBzeW50YXggcGFj
a2FnZQorICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25z
OworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRyYW5zZm9ybQorICAg
IEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgKi8KKyAgQXNz
ZXJ0Tm9WaWV3QW5kQ29udHJvbGxlclBhdGhzLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlv
biBBc3NlcnROb1ZpZXdBbmRDb250cm9sbGVyUGF0aHNfdHJhbnNmb3JtKGFzdCkgeworICAgIHZh
ciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50YXguV2Fsa2VyKCk7CisgICAgdmFyIG1vZHVsZU5hbWUg
PSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm1vZHVsZU5hbWU7CisKKyAgICB3YWxrZXIu
dmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkg
eworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGFzc2VydFBhdGgobW9kdWxlTmFt
ZSwgbm9kZSwgbm9kZS5wYXRoKTsKKyAgICAgIGFzc2VydFBhdGhzKG1vZHVsZU5hbWUsIG5vZGUs
IG5vZGUucGFyYW1zKTsKKyAgICAgIGFzc2VydEhhc2gobW9kdWxlTmFtZSwgbm9kZSwgbm9kZS5o
YXNoKTsKKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gYXNz
ZXJ0SGFzaChtb2R1bGVOYW1lLCBub2RlLCBoYXNoKSB7CisgICAgaWYgKCFoYXNoIHx8ICFoYXNo
LnBhaXJzKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHZhciBpLCBsLCBwYWlyLCBwYXRo
czsKKyAgICBmb3IgKGkgPSAwLCBsID0gaGFzaC5wYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgIHBhaXIgPSBoYXNoLnBhaXJzW2ldOworICAgICAgcGF0aHMgPSBwYWlyLnZhbHVlLnBh
cmFtczsKKyAgICAgIGFzc2VydFBhdGhzKG1vZHVsZU5hbWUsIHBhaXIsIHBhdGhzKTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRQYXRocyhtb2R1bGVOYW1lLCBub2RlLCBwYXRocykg
eworICAgIGlmICghcGF0aHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIGksIGws
IHBhdGg7CisgICAgZm9yIChpID0gMCwgbCA9IHBhdGhzLmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgcGF0aCA9IHBhdGhzW2ldOworICAgICAgYXNzZXJ0UGF0aChtb2R1bGVOYW1lLCBub2Rl
LCBwYXRoKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRQYXRoKG1vZHVsZU5hbWUs
IG5vZGUsIHBhdGgpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVXNpbmcgYHt7JyAr
IChwYXRoICYmIHBhdGgudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJyAmJiBwYXRoLnBhcnRzWzBd
KSArICd9fWAgb3IgYW55IHBhdGggYmFzZWQgb24gaXQgJyArIF9lbWJlclRlbXBsYXRlQ29tcGls
ZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVmYXVsdChtb2R1bGVOYW1lLCBub2Rl
LmxvYykgKyAnaGFzIGJlZW4gcmVtb3ZlZCBpbiBFbWJlciAyLjAnLCAoZnVuY3Rpb24gKCkgewor
ICAgICAgdmFyIG5vQXNzZXJ0aW9uID0gdHJ1ZTsKKworICAgICAgLy8gYWxsb3cgb3B0LW91dCBv
ZiB0aGUgYXNzZXJ0aW9uIHdoZW4gbGVnYWN5IGFkZG9ucyBhcmUgcHJlc2VudAorICAgICAgdmFy
IHZpZXdLZXl3b3JkID0gcGF0aCAmJiBwYXRoLnR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicgJiYg
cGF0aC5wYXJ0cyAmJiBwYXRoLnBhcnRzWzBdOworICAgICAgaWYgKHZpZXdLZXl3b3JkID09PSAn
dmlldycpIHsKKyAgICAgICAgbm9Bc3NlcnRpb24gPSBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5F
TlYuX0VOQUJMRV9MRUdBQ1lfVklFV19TVVBQT1JUOworICAgICAgfQorCisgICAgICByZXR1cm4g
bm9Bc3NlcnRpb247CisgICAgfSkoKSwgeworICAgICAgaWQ6IHBhdGgucGFydHMgJiYgcGF0aC5w
YXJ0c1swXSA9PT0gJ3ZpZXcnID8gJ3ZpZXcua2V5d29yZC52aWV3JyA6ICd2aWV3LmtleXdvcmQu
Y29udHJvbGxlcicsCisgICAgICB1bnRpbDogJzIuMC4wJworICAgIH0pOworICB9CisKKyAgZnVu
Y3Rpb24gdmFsaWRhdGUobm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdNdXN0YWNo
ZVN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnOworICB9CisKKyAg
ZXhwb3J0cy5kZWZhdWx0ID0gQXNzZXJ0Tm9WaWV3QW5kQ29udHJvbGxlclBhdGhzOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvYXNzZXJ0LW5vLXZpZXctaGVs
cGVyJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItbWV0YWwvZGVidWcn
LCAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2NhdGlvbi1kaXNw
bGF5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbENvcmUsIF9lbWJlck1ldGFsRGVi
dWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIEFzc2VydE5vVmlld0hlbHBlcigpIHsK
KyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0g
PT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgLy8gc2V0IGxhdGVyIHdp
dGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBhY2thZ2UKKyAgICB0aGlzLnN5bnRheCA9IG51
bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIC8qKgorICAgIEBwcml2
YXRlCisgICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0gYXN0IFRoZSBBU1Qg
dG8gYmUgdHJhbnNmb3JtZWQuCisgICovCisgIEFzc2VydE5vVmlld0hlbHBlci5wcm90b3R5cGUu
dHJhbnNmb3JtID0gZnVuY3Rpb24gQXNzZXJ0Tm9WaWV3SGVscGVyX3RyYW5zZm9ybShhc3QpIHsK
KyAgICBpZiAoISFfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5FTlYuX0VOQUJMRV9MRUdBQ1lfVklF
V19TVVBQT1JUKSB7CisgICAgICByZXR1cm4gYXN0OworICAgIH0KKyAgICB2YXIgd2Fsa2VyID0g
bmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworICAgIHZhciBtb2R1bGVOYW1lID0gdGhpcy5vcHRp
b25zICYmIHRoaXMub3B0aW9ucy5tb2R1bGVOYW1lOworCisgICAgd2Fsa2VyLnZpc2l0KGFzdCwg
ZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUobm9kZSkpIHsKKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICBhc3NlcnRIZWxwZXIobW9kdWxlTmFtZSwgbm9kZSk7
CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIGFzc2VydEhl
bHBlcihtb2R1bGVOYW1lLCBub2RlKSB7CisgICAgdmFyIHBhcmFtVmFsdWUgPSBub2RlLnBhcmFt
cy5sZW5ndGggJiYgbm9kZS5wYXJhbXNbMF0udmFsdWU7CisKKyAgICBpZiAoIXBhcmFtVmFsdWUp
IHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ1VzaW5nIHRoZSBge3t2aWV3ICJzdHJpbmcifX1gIGhlbHBlciBpcyByZW1vdmVkIGlu
IDIuMC4gJyArIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRp
c3BsYXkuZGVmYXVsdChtb2R1bGVOYW1lLCBub2RlLmxvYyksIF9lbWJlck1ldGFsQ29yZS5kZWZh
dWx0LkVOVi5fRU5BQkxFX0xFR0FDWV9WSUVXX1NVUFBPUlQsIHsgaWQ6ICd2aWV3LmhlbHBlcics
IHVudGlsOiAnMi4wLjAnIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5v
ZGUpIHsKKyAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyB8fCBu
b2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcpICYmIG5vZGUucGF0aC5wYXJ0c1swXSA9PT0g
J3ZpZXcnOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQXNzZXJ0Tm9WaWV3SGVscGVyOwor
fSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvZGVwcmVjYXRlLXJl
bmRlci1tb2RlbCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci10ZW1w
bGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXknXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0
ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IERlcHJlY2F0ZVJlbmRlck1vZGVsOworCisgIGZ1bmN0aW9uIERlcHJlY2F0
ZVJlbmRlck1vZGVsKG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgICAgdGhp
cy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIERlcHJlY2F0ZVJlbmRlck1vZGVsLnByb3Rv
dHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBEZXByZWNhdGVSZW5kZXJNb2RlbF90cmFuc2Zvcm0o
YXN0KSB7CisgICAgdmFyIG1vZHVsZU5hbWUgPSB0aGlzLm9wdGlvbnMubW9kdWxlTmFtZTsKKyAg
ICB2YXIgd2Fsa2VyID0gbmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworCisgICAgd2Fsa2VyLnZp
c2l0KGFzdCwgZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUobm9kZSkpIHsK
KyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlYWNoKG5vZGUucGFyYW1zLCBmdW5j
dGlvbiAocGFyYW0pIHsKKyAgICAgICAgaWYgKHBhcmFtLnR5cGUgIT09ICdQYXRoRXhwcmVzc2lv
bicpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlcHJlY2F0ZShkZXByZWNhdGlvbk1lc3NhZ2UobW9kdWxlTmFtZSwgbm9kZSwgcGFy
YW0pLCBmYWxzZSwgeworICAgICAgICAgIGlkOiAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIuZGVw
cmVjYXRlLXJlbmRlci1tb2RlbCcsCisgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAg
ICAgdXJsOiAnaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19tb2RlbC1w
YXJhbS1pbi1jb2RlLXJlbmRlci1jb2RlLWhlbHBlcicKKyAgICAgICAgfSk7CisgICAgICB9KTsK
KyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUo
bm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcgJiYg
bm9kZS5wYXRoLm9yaWdpbmFsID09PSAncmVuZGVyJyAmJiBub2RlLnBhcmFtcy5sZW5ndGggPiAx
OworICB9CisKKyAgZnVuY3Rpb24gZWFjaChsaXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFy
IGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxp
c3RbaV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGRlcHJlY2F0aW9uTWVzc2FnZShtb2R1
bGVOYW1lLCBub2RlLCBwYXJhbSkgeworICAgIHZhciBzb3VyY2VJbmZvcm1hdGlvbiA9IF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkuZGVmYXVsdCht
b2R1bGVOYW1lLCBub2RlLmxvYyk7CisgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBub2RlLnBhcmFt
c1swXS5vcmlnaW5hbDsKKyAgICB2YXIgbW9kZWxOYW1lID0gcGFyYW0ub3JpZ2luYWw7CisgICAg
dmFyIG9yaWdpbmFsID0gJ3t7cmVuZGVyICInICsgY29tcG9uZW50TmFtZSArICciICcgKyBtb2Rl
bE5hbWUgKyAnfX0nOworICAgIHZhciBwcmVmZXJyZWQgPSAne3snICsgY29tcG9uZW50TmFtZSAr
ICcgbW9kZWw9JyArIG1vZGVsTmFtZSArICd9fSc7CisKKyAgICByZXR1cm4gJ1BsZWFzZSByZWZh
Y3RvciBgJyArIG9yaWdpbmFsICsgJ2AgdG8gYSBjb21wb25lbnQgYW5kIGludm9rZSB2aWEnICsg
KCcgYCcgKyBwcmVmZXJyZWQgKyAnYC4gJyArIHNvdXJjZUluZm9ybWF0aW9uKTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvcHJldmVudC1yZW5kZXIt
YmxvY2snLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZXJyb3InLCAnZW1iZXItdGVtcGxhdGUt
Y29tcGlsZXIvc3lzdGVtL2NhbGN1bGF0ZS1sb2NhdGlvbi1kaXNwbGF5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2Fs
Y3VsYXRlTG9jYXRpb25EaXNwbGF5KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRl
ZmF1bHQgPSBQcmV2ZW50UmVuZGVyQmxvY2s7CisKKyAgZnVuY3Rpb24gUHJldmVudFJlbmRlckJs
b2NrKG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKKyAgfQorCisgIFByZXZlbnRSZW5kZXJCbG9jay5wcm90b3R5cGUudHJhbnNm
b3JtID0gZnVuY3Rpb24gUHJldmVudFJlbmRlckJsb2NrX3RyYW5zZm9ybShhc3QpIHsKKyAgICB2
YXIgbW9kdWxlTmFtZSA9IHRoaXMub3B0aW9ucy5tb2R1bGVOYW1lOworICAgIHZhciB3YWxrZXIg
PSBuZXcgdGhpcy5zeW50YXguV2Fsa2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5j
dGlvbiAobm9kZSkgeworICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1
cm47CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQo
YXNzZXJ0aW9uTWVzc2FnZShtb2R1bGVOYW1lLCBub2RlKSk7CisgICAgfSk7CisKKyAgICByZXR1
cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4g
bm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnICYmIG5vZGUucGF0aC5vcmlnaW5hbCA9PT0g
J3JlbmRlcic7CisgIH0KKworICBmdW5jdGlvbiBhc3NlcnRpb25NZXNzYWdlKG1vZHVsZU5hbWUs
IG5vZGUpIHsKKyAgICB2YXIgc291cmNlSW5mb3JtYXRpb24gPSBfZW1iZXJUZW1wbGF0ZUNvbXBp
bGVyU3lzdGVtQ2FsY3VsYXRlTG9jYXRpb25EaXNwbGF5LmRlZmF1bHQobW9kdWxlTmFtZSwgbm9k
ZS5sb2MpOworCisgICAgcmV0dXJuICdVc2FnZSBvZiBgcmVuZGVyYCBpbiBibG9jayBmb3JtIGlz
IHVuc3VwcG9ydGVkICcgKyBzb3VyY2VJbmZvcm1hdGlvbiArICcuJzsKKyAgfQorfSk7Citlbmlm
ZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWFuZ2xlLWJyYWNr
ZXQtY29tcG9uZW50cycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNl
IHN0cmljdCc7CisKKyAgZnVuY3Rpb24gVHJhbnNmb3JtQW5nbGVCcmFja2V0Q29tcG9uZW50cygp
IHsKKyAgICAvLyBzZXQgbGF0ZXIgd2l0aGluIEhUTUxCYXJzIHRvIHRoZSBzeW50YXggcGFja2Fn
ZQorICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisg
ICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0gYXN0IFRoZSBBU1QgdG8gYmUg
dHJhbnNmb3JtZWQuCisgICovCisgIFRyYW5zZm9ybUFuZ2xlQnJhY2tldENvbXBvbmVudHMucHJv
dG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUFuZ2xlQnJhY2tldENvbXBvbmVu
dHNfdHJhbnNmb3JtKGFzdCkgeworICAgIHZhciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50YXguV2Fs
a2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgeworICAgICAg
aWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAg
IG5vZGUudGFnID0gJzwnICsgbm9kZS50YWcgKyAnPic7CisgICAgfSk7CisKKyAgICByZXR1cm4g
YXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9k
ZS50eXBlID09PSAnQ29tcG9uZW50Tm9kZSc7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBU
cmFuc2Zvcm1BbmdsZUJyYWNrZXRDb21wb25lbnRzOworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWNsb3N1cmUtY29tcG9uZW50LWF0dHJzLWlu
dG8tbXV0JywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1DbG9zdXJlQ29tcG9uZW50QXR0cnNJbnRvTXV0KCkg
eworICAgIC8vIHNldCBsYXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNrYWdl
CisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAg
ICBAbWV0aG9kIHRyYW5zZm9ybQorICAgIEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0
cmFuc2Zvcm1lZC4KKyAgKi8KKyAgVHJhbnNmb3JtQ2xvc3VyZUNvbXBvbmVudEF0dHJzSW50b011
dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gVHJhbnNmb3JtQ2xvc3VyZUNvbXBvbmVu
dEF0dHJzSW50b011dF90cmFuc2Zvcm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5i
dWlsZGVyczsKKworICAgIHRoaXMuc3ludGF4LnRyYXZlcnNlKGFzdCwgeworICAgICAgU3ViRXhw
cmVzc2lvbjogZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgICAgaWYgKGlzQ29tcG9uZW50Q2xvc3Vy
ZShub2RlKSkgeworICAgICAgICAgIG11dFBhcmFtZXRlcnMoYiwgbm9kZSk7CisgICAgICAgIH0K
KyAgICAgIH0KKyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24g
aXNDb21wb25lbnRDbG9zdXJlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnU3Vi
RXhwcmVzc2lvbicgJiYgbm9kZS5wYXRoLm9yaWdpbmFsID09PSAnY29tcG9uZW50JzsKKyAgfQor
CisgIGZ1bmN0aW9uIG11dFBhcmFtZXRlcnMoYnVpbGRlciwgbm9kZSkgeworICAgIGZvciAodmFy
IGkgPSAxOyBpIDwgbm9kZS5wYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChub2RlLnBh
cmFtc1tpXS50eXBlID09PSAnUGF0aEV4cHJlc3Npb24nKSB7CisgICAgICAgIG5vZGUucGFyYW1z
W2ldID0gYnVpbGRlci5zZXhwcihidWlsZGVyLnBhdGgoJ0BtdXQnKSwgW25vZGUucGFyYW1zW2ld
XSk7CisgICAgICB9CisgICAgfQorCisgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9u
IChwYWlyKSB7CisgICAgICB2YXIgdmFsdWUgPSBwYWlyLnZhbHVlOworCisgICAgICBpZiAodmFs
dWUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJykgeworICAgICAgICBwYWlyLnZhbHVlID0gYnVp
bGRlci5zZXhwcihidWlsZGVyLnBhdGgoJ0BtdXQnKSwgW3BhaXIudmFsdWVdKTsKKyAgICAgIH0K
KyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGVhY2gobGlzdCwgY2FsbGJhY2spIHsKKyAgICBm
b3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBjYWxs
YmFjayhsaXN0W2ldKTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBUcmFuc2Zv
cm1DbG9zdXJlQ29tcG9uZW50QXR0cnNJbnRvTXV0OworfSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBs
YXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWNvbXBvbmVudC1hdHRycy1pbnRvLW11dCcs
IFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAg
ZnVuY3Rpb24gVHJhbnNmb3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0KCkgeworICAgIC8vIHNldCBs
YXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNrYWdlCisgICAgdGhpcy5zeW50
YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRyYW5z
Zm9ybQorICAgIEBwYXJhbSB7QVNUfSBhc3QgVGhlIEFTVCB0byBiZSB0cmFuc2Zvcm1lZC4KKyAg
Ki8KKyAgVHJhbnNmb3JtQ29tcG9uZW50QXR0cnNJbnRvTXV0LnByb3RvdHlwZS50cmFuc2Zvcm0g
PSBmdW5jdGlvbiBUcmFuc2Zvcm1Db21wb25lbnRBdHRyc0ludG9NdXRfdHJhbnNmb3JtKGFzdCkg
eworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7CisgICAgdmFyIHdhbGtlciA9IG5l
dyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52aXNpdChhc3QsIGZ1bmN0aW9u
IChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7CisgICAgICAgIHJldHVybjsK
KyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9uIChwYWlyKSB7
CisgICAgICAgIHZhciB2YWx1ZSA9IHBhaXIudmFsdWU7CisKKyAgICAgICAgaWYgKHZhbHVlLnR5
cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHsKKyAgICAgICAgICBwYWlyLnZhbHVlID0gYi5zZXhw
cihiLnBhdGgoJ0BtdXQnKSwgW3BhaXIudmFsdWVdKTsKKyAgICAgICAgfQorICAgICAgfSk7Cisg
ICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5v
ZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnIHx8IG5vZGUu
dHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JzsKKyAgfQorCisgIGZ1bmN0aW9uIGVhY2gobGlz
dCwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICBjYWxsYmFjayhsaXN0W2ldKTsKKyAgICB9CisgIH0KKworICBleHBv
cnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1Db21wb25lbnRBdHRyc0ludG9NdXQ7Cit9KTsKK2VuaWZl
ZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tY29tcG9uZW50LWN1
cmx5LXRvLXJlYWRvbmx5JywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1
c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1Db21wb25lbnRDdXJseVRvUmVhZG9u
bHkoKSB7CisgICAgLy8gc2V0IGxhdGVyIHdpdGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBh
Y2thZ2UKKyAgICB0aGlzLnN5bnRheCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0
ZQorICAgIEBtZXRob2QgdHJhbnNmb3JtCisgICAgQHBhcmFtIHtBU1R9IGFzdCBUaGUgQVNUIHRv
IGJlIHRyYW5zZm9ybWVkLgorICAqLworICBUcmFuc2Zvcm1Db21wb25lbnRDdXJseVRvUmVhZG9u
bHkucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUNvbXBvbmV0bkN1cmx5
VG9SZWFkb25seV90cmFuc2Zvcm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5idWls
ZGVyczsKKyAgICB2YXIgd2Fsa2VyID0gbmV3IHRoaXMuc3ludGF4LldhbGtlcigpOworCisgICAg
d2Fsa2VyLnZpc2l0KGFzdCwgZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgIGlmICghdmFsaWRhdGUo
bm9kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBlYWNoKG5vZGUuYXR0
cmlidXRlcywgZnVuY3Rpb24gKGF0dHIpIHsKKyAgICAgICAgaWYgKGF0dHIudmFsdWUudHlwZSAh
PT0gJ011c3RhY2hlU3RhdGVtZW50JykgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoYXR0ci52YWx1ZS5wYXJhbXMubGVuZ3RoIHx8IGF0dHIudmFsdWUuaGFzaC5w
YWlycy5sZW5ndGgpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBh
dHRyLnZhbHVlID0gYi5tdXN0YWNoZShiLnBhdGgoJ3JlYWRvbmx5JyksIFthdHRyLnZhbHVlLnBh
dGhdLCBudWxsLCAhYXR0ci52YWx1ZS5lc2NhcGUpOworICAgICAgfSk7CisgICAgfSk7CisKKyAg
ICByZXR1cm4gYXN0OworICB9OworCisgIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICBy
ZXR1cm4gbm9kZS50eXBlID09PSAnQ29tcG9uZW50Tm9kZSc7CisgIH0KKworICBmdW5jdGlvbiBl
YWNoKGxpc3QsIGNhbGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0
aDsgaSA8IGw7IGkrKykgeworICAgICAgY2FsbGJhY2sobGlzdFtpXSk7CisgICAgfQorICB9CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNmb3JtQ29tcG9uZW50Q3VybHlUb1JlYWRvbmx5Owor
fSk7CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWlu
bGluZS1saW5rLXRvJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ug
c3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1JbmxpbmVMaW5rVG87CisK
KyAgZnVuY3Rpb24gVHJhbnNmb3JtSW5saW5lTGlua1RvKG9wdGlvbnMpIHsKKyAgICB0aGlzLm9w
dGlvbnMgPSBvcHRpb25zOworICAgIHRoaXMuc3ludGF4ID0gbnVsbDsKKyAgfQorCisgIFRyYW5z
Zm9ybUlubGluZUxpbmtUby5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gVHJhbnNmb3Jt
SW5saW5lTGlua1RvX3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIgX3N5bnRheCA9IHRoaXMuc3lu
dGF4OworICAgIHZhciB0cmF2ZXJzZSA9IF9zeW50YXgudHJhdmVyc2U7CisgICAgdmFyIGIgPSBf
c3ludGF4LmJ1aWxkZXJzOworCisgICAgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKGNvbnRlbnQsIGxv
YykgeworICAgICAgcmV0dXJuIGIucHJvZ3JhbShbYnVpbGRTdGF0ZW1lbnQoY29udGVudCwgbG9j
KV0sIG51bGwsIGxvYyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoY29u
dGVudCwgbG9jKSB7CisgICAgICBzd2l0Y2ggKGNvbnRlbnQudHlwZSkgeworICAgICAgICBjYXNl
ICdQYXRoRXhwcmVzc2lvbic6CisgICAgICAgICAgcmV0dXJuIGIubXVzdGFjaGUoY29udGVudCwg
bnVsbCwgbnVsbCwgbnVsbCwgbG9jKTsKKworICAgICAgICBjYXNlICdTdWJFeHByZXNzaW9uJzoK
KyAgICAgICAgICByZXR1cm4gYi5tdXN0YWNoZShjb250ZW50LnBhdGgsIGNvbnRlbnQucGFyYW1z
LCBjb250ZW50Lmhhc2gsIG51bGwsIGxvYyk7CisKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgY2Fz
ZSBoYW5kbGVzIGxpdGVyYWxzLgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBi
LnRleHQoJycgKyBjb250ZW50LnZhbHVlLCBsb2MpOworICAgICAgfQorICAgIH0KKworICAgIGZ1
bmN0aW9uIHVuc2FmZUh0bWwoZXhwcikgeworICAgICAgcmV0dXJuIGIuc2V4cHIoJy1odG1sLXNh
ZmUnLCBbZXhwcl0pOworICAgIH0KKworICAgIHRyYXZlcnNlKGFzdCwgeworICAgICAgTXVzdGFj
aGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChub2RlKSB7CisgICAgICAgIGlmIChub2RlLnBhdGgub3Jp
Z2luYWwgPT09ICdsaW5rLXRvJykgeworICAgICAgICAgIHZhciBjb250ZW50ID0gbm9kZS5lc2Nh
cGVkID8gbm9kZS5wYXJhbXNbMF0gOiB1bnNhZmVIdG1sKG5vZGUucGFyYW1zWzBdKTsKKyAgICAg
ICAgICByZXR1cm4gYi5ibG9jaygnbGluay10bycsIG5vZGUucGFyYW1zLnNsaWNlKDEpLCBub2Rl
Lmhhc2gsIGJ1aWxkUHJvZ3JhbShjb250ZW50LCBub2RlLmxvYyksIG51bGwsIG5vZGUubG9jKTsK
KyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIGFzdDsKKyAgfTsKK30p
OworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS1pbnB1
dC1vbi10by1vbkV2ZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVy
LXRlbXBsYXRlLWNvbXBpbGVyL3N5c3RlbS9jYWxjdWxhdGUtbG9jYXRpb24tZGlzcGxheSddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyVGVtcGxhdGVDb21waWxl
clN5c3RlbUNhbGN1bGF0ZUxvY2F0aW9uRGlzcGxheSkgeworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICBAbW9kdWxlIGVtYmVyCisgICBAc3VibW9kdWxlIGVtYmVyLWh0bWxiYXJzCisgICov
CisKKyAgLyoqCisgICAgQW4gSFRNTEJhcnMgQVNUIHRyYW5zZm9ybWF0aW9uIHRoYXQgcmVwbGFj
ZXMgYWxsIGluc3RhbmNlcyBvZgorICAKKyAgICBgYGBoYW5kbGViYXJzCisgICB7e2lucHV0IG9u
PSJlbnRlciIgYWN0aW9uPSJkb1N0dWZmIn19CisgICB7e2lucHV0IG9uPSJrZXktcHJlc3MiIGFj
dGlvbj0iZG9TdHVmZiJ9fQorICAgIGBgYAorICAKKyAgICB3aXRoCisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgIHt7aW5wdXQgZW50ZXI9ImRvU3R1ZmYifX0KKyAgIHt7aW5wdXQga2V5LXByZXNz
PSJkb1N0dWZmIn19CisgICAgYGBgCisgIAorICAgIEBwcml2YXRlCisgICAgQGNsYXNzIFRyYW5z
Zm9ybUlucHV0T25Ub09uRXZlbnQKKyAgKi8KKyAgZnVuY3Rpb24gVHJhbnNmb3JtSW5wdXRPblRv
T25FdmVudCgpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBh
cmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdOworCisgICAgLy8g
c2V0IGxhdGVyIHdpdGhpbiBIVE1MQmFycyB0byB0aGUgc3ludGF4IHBhY2thZ2UKKyAgICB0aGlz
LnN5bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIC8q
KgorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCB0cmFuc2Zvcm0KKyAgICBAcGFyYW0ge0FTVH0g
YXN0IFRoZSBBU1QgdG8gYmUgdHJhbnNmb3JtZWQuCisgICovCisgIFRyYW5zZm9ybUlucHV0T25U
b09uRXZlbnQucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybUlucHV0T25U
b09uRXZlbnRfdHJhbnNmb3JtKGFzdCkgeworICAgIHZhciBwbHVnaW5Db250ZXh0ID0gdGhpczsK
KyAgICB2YXIgYiA9IHBsdWdpbkNvbnRleHQuc3ludGF4LmJ1aWxkZXJzOworICAgIHZhciB3YWxr
ZXIgPSBuZXcgcGx1Z2luQ29udGV4dC5zeW50YXguV2Fsa2VyKCk7CisgICAgdmFyIG1vZHVsZU5h
bWUgPSBwbHVnaW5Db250ZXh0Lm9wdGlvbnMubW9kdWxlTmFtZTsKKworICAgIHdhbGtlci52aXNp
dChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAocGx1Z2luQ29udGV4dC52YWxpZGF0
ZShub2RlKSkgeworICAgICAgICB2YXIgYWN0aW9uID0gaGFzaFBhaXJGb3JLZXkobm9kZS5oYXNo
LCAnYWN0aW9uJyk7CisgICAgICAgIHZhciBvbiA9IGhhc2hQYWlyRm9yS2V5KG5vZGUuaGFzaCwg
J29uJyk7CisgICAgICAgIHZhciBvbkV2ZW50ID0gaGFzaFBhaXJGb3JLZXkobm9kZS5oYXNoLCAn
b25FdmVudCcpOworICAgICAgICB2YXIgbm9ybWFsaXplZE9uID0gb24gfHwgb25FdmVudDsKKyAg
ICAgICAgdmFyIG1vZHVsZUluZm8gPSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2FsY3Vs
YXRlTG9jYXRpb25EaXNwbGF5LmRlZmF1bHQobW9kdWxlTmFtZSwgbm9kZS5sb2MpOworCisgICAg
ICAgIGlmIChub3JtYWxpemVkT24gJiYgbm9ybWFsaXplZE9uLnZhbHVlLnR5cGUgIT09ICdTdHJp
bmdMaXRlcmFsJykgeworICAgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2lu
ZyBhIGR5bmFtaWMgdmFsdWUgZm9yIFwnI3tub3JtYWxpemVkT24ua2V5fT1cJyB3aXRoIHRoZSBc
J3t7aW5wdXR9fVwnIGhlbHBlciAnICsgbW9kdWxlSW5mbyArICdpcyBkZXByZWNhdGVkLicsIGZh
bHNlLCB7IGlkOiAnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIudHJhbnNmb3JtLWlucHV0LW9uLXRv
LW9uRXZlbnQuZHluYW1pYy12YWx1ZScsIHVudGlsOiAnMy4wLjAnIH0pOworCisgICAgICAgICAg
bm9ybWFsaXplZE9uLmtleSA9ICdvbkV2ZW50JzsKKyAgICAgICAgICByZXR1cm47IC8vIGV4aXQg
ZWFybHksIGFzIHdlIGNhbm5vdCB0cmFuc2Zvcm0gZnVydGhlcgorICAgICAgICB9CisKKyAgICAg
ICAgcmVtb3ZlRnJvbUhhc2gobm9kZS5oYXNoLCBub3JtYWxpemVkT24pOworICAgICAgICByZW1v
dmVGcm9tSGFzaChub2RlLmhhc2gsIGFjdGlvbik7CisKKyAgICAgICAgaWYgKCFhY3Rpb24pIHsK
KyAgICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnVXNpbmcgXCd7e2lucHV0ICcg
KyBub3JtYWxpemVkT24ua2V5ICsgJz0iJyArIG5vcm1hbGl6ZWRPbi52YWx1ZS52YWx1ZSArICci
IC4uLn19XCcgd2l0aG91dCBzcGVjaWZ5aW5nIGFuIGFjdGlvbiAnICsgbW9kdWxlSW5mbyArICd3
aWxsIGRvIG5vdGhpbmcuJywgZmFsc2UsIHsgaWQ6ICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci50
cmFuc2Zvcm0taW5wdXQtb24tdG8tb25FdmVudC5uby1hY3Rpb24nLCB1bnRpbDogJzMuMC4wJyB9
KTsKKworICAgICAgICAgIHJldHVybjsgLy8gZXhpdCBlYXJseSwgaWYgbm8gYWN0aW9uIHdhcyBh
dmFpbGFibGUgdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgICAgICB9CisKKyAgICAgICAgdmFy
IHNwZWNpZmllZE9uID0gbm9ybWFsaXplZE9uID8gbm9ybWFsaXplZE9uLmtleSArICc9IicgKyBu
b3JtYWxpemVkT24udmFsdWUudmFsdWUgKyAnIiAnIDogJyc7CisgICAgICAgIGlmIChub3JtYWxp
emVkT24gJiYgbm9ybWFsaXplZE9uLnZhbHVlLnZhbHVlID09PSAna2V5UHJlc3MnKSB7CisgICAg
ICAgICAgLy8gdXNpbmcgYGtleVByZXNzYCBpbiB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50IHdp
bGwKKyAgICAgICAgICAvLyBjbG9iYmVyIHRoZSBrZXlQcmVzcyBldmVudCBoYW5kbGVyCisgICAg
ICAgICAgbm9ybWFsaXplZE9uLnZhbHVlLnZhbHVlID0gJ2tleS1wcmVzcyc7CisgICAgICAgIH0K
KworICAgICAgICB2YXIgZXhwZWN0ZWQgPSAobm9ybWFsaXplZE9uID8gbm9ybWFsaXplZE9uLnZh
bHVlLnZhbHVlIDogJ2VudGVyJykgKyAnPSInICsgYWN0aW9uLnZhbHVlLm9yaWdpbmFsICsgJyIn
OworCisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdVc2luZyBcJ3t7aW5wdXQg
JyArIHNwZWNpZmllZE9uICsgJ2FjdGlvbj0iJyArIGFjdGlvbi52YWx1ZS5vcmlnaW5hbCArICci
fX1cJyAnICsgbW9kdWxlSW5mbyArICdpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwne3tpbnB1
dCAnICsgZXhwZWN0ZWQgKyAnfX1cJyBpbnN0ZWFkLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItdGVt
cGxhdGUtY29tcGlsZXIudHJhbnNmb3JtLWlucHV0LW9uLXRvLW9uRXZlbnQubm9ybWFsaXplZC1v
bicsIHVudGlsOiAnMy4wLjAnIH0pOworICAgICAgICBpZiAoIW5vcm1hbGl6ZWRPbikgeworICAg
ICAgICAgIG5vcm1hbGl6ZWRPbiA9IGIucGFpcignb25FdmVudCcsIGIuc3RyaW5nKCdlbnRlcicp
KTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUuaGFzaC5wYWlycy5wdXNoKGIucGFpcihub3Jt
YWxpemVkT24udmFsdWUudmFsdWUsIGFjdGlvbi52YWx1ZSkpOworICAgICAgfQorICAgIH0pOwor
CisgICAgcmV0dXJuIGFzdDsKKyAgfTsKKworICBUcmFuc2Zvcm1JbnB1dE9uVG9PbkV2ZW50LnBy
b3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIFRyYW5zZm9ybVdpdGhBc1RvSGFzaF92YWxpZGF0
ZShub2RlKSB7CisgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JyAm
JiBub2RlLnBhdGgub3JpZ2luYWwgPT09ICdpbnB1dCcgJiYgKGhhc2hQYWlyRm9yS2V5KG5vZGUu
aGFzaCwgJ2FjdGlvbicpIHx8IGhhc2hQYWlyRm9yS2V5KG5vZGUuaGFzaCwgJ29uJykgfHwgaGFz
aFBhaXJGb3JLZXkobm9kZS5oYXNoLCAnb25FdmVudCcpKTsKKyAgfTsKKworICBmdW5jdGlvbiBo
YXNoUGFpckZvcktleShoYXNoLCBrZXkpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhc2gu
cGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgcGFpciA9IGhhc2gucGFpcnNb
aV07CisgICAgICBpZiAocGFpci5rZXkgPT09IGtleSkgeworICAgICAgICByZXR1cm4gcGFpcjsK
KyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmdW5jdGlvbiBy
ZW1vdmVGcm9tSGFzaChoYXNoLCBwYWlyVG9SZW1vdmUpIHsKKyAgICB2YXIgbmV3UGFpcnMgPSBb
XTsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhhc2gucGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICB2YXIgcGFpciA9IGhhc2gucGFpcnNbaV07CisKKyAgICAgIGlmIChwYWlyICE9
PSBwYWlyVG9SZW1vdmUpIHsKKyAgICAgICAgbmV3UGFpcnMucHVzaChwYWlyKTsKKyAgICAgIH0K
KyAgICB9CisKKyAgICBoYXNoLnBhaXJzID0gbmV3UGFpcnM7CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBUcmFuc2Zvcm1JbnB1dE9uVG9PbkV2ZW50OworfSk7CitlbmlmZWQoJ2VtYmVyLXRl
bXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLWl0ZW0tY2xhc3MnLCBbJ2V4cG9ydHMn
XSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVm
YXVsdCA9IFRyYW5zZm9ybUl0ZW1DbGFzczsKKworICBmdW5jdGlvbiBUcmFuc2Zvcm1JdGVtQ2xh
c3MoKSB7CisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgVHJhbnNmb3JtSXRlbUNs
YXNzLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1JdGVtQ2xhc3NfdHJh
bnNmb3JtKGFzdCkgeworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7CisgICAgdmFy
IHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52aXNpdChh
c3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0
aW9uIChwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBwYWlyLmtleTsKKyAgICAgICAgdmFyIHZh
bHVlID0gcGFpci52YWx1ZTsKKworICAgICAgICBpZiAoa2V5ICE9PSAnaXRlbUNsYXNzJykgewor
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0g
J1N0cmluZ0xpdGVyYWwnKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgdmFyIHByb3BOYW1lID0gdmFsdWUub3JpZ2luYWw7CisgICAgICAgIHZhciBwYXJhbXMgPSBb
dmFsdWVdOworICAgICAgICB2YXIgc2V4cHJQYXJhbXMgPSBbYi5zdHJpbmcocHJvcE5hbWUpLCBi
LnBhdGgocHJvcE5hbWUpXTsKKworICAgICAgICBwYXJhbXMucHVzaChiLnNleHByKGIuc3RyaW5n
KCctbm9ybWFsaXplLWNsYXNzJyksIHNleHByUGFyYW1zKSk7CisgICAgICAgIHZhciBzZXhwciA9
IGIuc2V4cHIoYi5zdHJpbmcoJ2lmJyksIHBhcmFtcyk7CisKKyAgICAgICAgcGFpci52YWx1ZSA9
IHNleHByOworICAgICAgfSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9OworCisg
IGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gJ0Js
b2NrU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpICYmIG5v
ZGUucGF0aC5vcmlnaW5hbCA9PT0gJ2NvbGxlY3Rpb24nOworICB9CisKKyAgZnVuY3Rpb24gZWFj
aChsaXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7
IGkgPCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxpc3RbaV0pOworICAgIH0KKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3BsdWdpbnMvdHJhbnNmb3JtLW9sZC1i
aW5kaW5nLXN5bnRheCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci10
ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3BsYXknXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJT
eXN0ZW1DYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFRyYW5zZm9ybU9sZEJpbmRpbmdTeW50YXg7CisKKyAgZnVuY3Rpb24g
VHJhbnNmb3JtT2xkQmluZGluZ1N5bnRheChvcHRpb25zKSB7CisgICAgdGhpcy5zeW50YXggPSBu
dWxsOworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KKworICBUcmFuc2Zvcm1PbGRC
aW5kaW5nU3ludGF4LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiBUcmFuc2Zvcm1PbGRC
aW5kaW5nU3ludGF4X3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIgbW9kdWxlTmFtZSA9IHRoaXMu
b3B0aW9ucy5tb2R1bGVOYW1lOworICAgIHZhciBiID0gdGhpcy5zeW50YXguYnVpbGRlcnM7Cisg
ICAgdmFyIHdhbGtlciA9IG5ldyB0aGlzLnN5bnRheC5XYWxrZXIoKTsKKworICAgIHdhbGtlci52
aXNpdChhc3QsIGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAoIXZhbGlkYXRlKG5vZGUpKSB7
CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMs
IGZ1bmN0aW9uIChwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBwYWlyLmtleTsKKyAgICAgICAg
dmFyIHZhbHVlID0gcGFpci52YWx1ZTsKKworICAgICAgICB2YXIgc291cmNlSW5mb3JtYXRpb24g
PSBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lzdGVtQ2FsY3VsYXRlTG9jYXRpb25EaXNwbGF5LmRl
ZmF1bHQobW9kdWxlTmFtZSwgcGFpci5sb2MpOworCisgICAgICAgIGlmIChrZXkgPT09ICdjbGFz
c0JpbmRpbmcnKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgX2Vt
YmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1NldHRpbmcgXCdhdHRyaWJ1dGVCaW5kaW5nc1wnIHZpYSB0
ZW1wbGF0ZSBoZWxwZXJzIGlzIG5vdCBhbGxvd2VkICcgKyBzb3VyY2VJbmZvcm1hdGlvbiwga2V5
ICE9PSAnYXR0cmlidXRlQmluZGluZ3MnKTsKKworICAgICAgICBpZiAoa2V5LnN1YnN0cigtNykg
PT09ICdCaW5kaW5nJykgeworICAgICAgICAgIHZhciBuZXdLZXkgPSBrZXkuc2xpY2UoMCwgLTcp
OworCisgICAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXByZWNhdGUoJ1lvdVwncmUgdXNpbmcg
bGVnYWN5IGJpbmRpbmcgc3ludGF4OiAnICsga2V5ICsgJz0nICsgZXhwclRvU3RyaW5nKHZhbHVl
KSArICcgJyArIHNvdXJjZUluZm9ybWF0aW9uICsgJy4gUGxlYXNlIHJlcGxhY2Ugd2l0aCAnICsg
bmV3S2V5ICsgJz0nICsgdmFsdWUub3JpZ2luYWwsIGZhbHNlLCB7IGlkOiAnZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIudHJhbnNmb3JtLW9sZC1iaW5kaW5nLXN5bnRheCcsIHVudGlsOiAnMy4wLjAn
IH0pOworCisgICAgICAgICAgcGFpci5rZXkgPSBuZXdLZXk7CisgICAgICAgICAgaWYgKHZhbHVl
LnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykgeworICAgICAgICAgICAgcGFpci52YWx1ZSA9IGIu
cGF0aCh2YWx1ZS5vcmlnaW5hbCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsK
KyAgICB9KTsKKworICAgIHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gdmFsaWRhdGUo
bm9kZSkgeworICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcgfHwgbm9k
ZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnOworICB9CisKKyAgZnVuY3Rpb24gZWFjaChs
aXN0LCBjYWxsYmFjaykgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKKyAgICAgIGNhbGxiYWNrKGxpc3RbaV0pOworICAgIH0KKyAgfQorCisgIGZ1
bmN0aW9uIGV4cHJUb1N0cmluZyhleHByKSB7CisgICAgc3dpdGNoIChleHByLnR5cGUpIHsKKyAg
ICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOgorICAgICAgICByZXR1cm4gJyInICsgZXhwci5vcmln
aW5hbCArICciJzsKKyAgICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzoKKyAgICAgICAgcmV0dXJu
IGV4cHIub3JpZ2luYWw7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUt
Y29tcGlsZXIvcGx1Z2lucy90cmFuc2Zvcm0tb2xkLWNsYXNzLWJpbmRpbmctc3ludGF4JywgWydl
eHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzLmRlZmF1bHQgPSBUcmFuc2Zvcm1PbGRDbGFzc0JpbmRpbmdTeW50YXg7CisKKyAgZnVuY3Rp
b24gVHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3ludGF4KG9wdGlvbnMpIHsKKyAgICB0aGlzLnN5
bnRheCA9IG51bGw7CisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgfQorCisgIFRyYW5z
Zm9ybU9sZENsYXNzQmluZGluZ1N5bnRheC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24g
VHJhbnNmb3JtT2xkQ2xhc3NCaW5kaW5nU3ludGF4X3RyYW5zZm9ybShhc3QpIHsKKyAgICB2YXIg
YiA9IHRoaXMuc3ludGF4LmJ1aWxkZXJzOworICAgIHZhciB3YWxrZXIgPSBuZXcgdGhpcy5zeW50
YXguV2Fsa2VyKCk7CisKKyAgICB3YWxrZXIudmlzaXQoYXN0LCBmdW5jdGlvbiAobm9kZSkgewor
ICAgICAgaWYgKCF2YWxpZGF0ZShub2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisK
KyAgICAgIHZhciBhbGxPZlRoZU1pY3Jvc3ludGF4ZXMgPSBbXTsKKyAgICAgIHZhciBhbGxPZlRo
ZU1pY3Jvc3ludGF4SW5kZXhlcyA9IFtdOworICAgICAgdmFyIGNsYXNzUGFpciA9IHVuZGVmaW5l
ZDsKKworICAgICAgZWFjaChub2RlLmhhc2gucGFpcnMsIGZ1bmN0aW9uIChwYWlyLCBpbmRleCkg
eworICAgICAgICB2YXIga2V5ID0gcGFpci5rZXk7CisKKyAgICAgICAgaWYgKGtleSA9PT0gJ2Ns
YXNzQmluZGluZycgfHwga2V5ID09PSAnY2xhc3NOYW1lQmluZGluZ3MnKSB7CisgICAgICAgICAg
YWxsT2ZUaGVNaWNyb3N5bnRheEluZGV4ZXMucHVzaChpbmRleCk7CisgICAgICAgICAgYWxsT2ZU
aGVNaWNyb3N5bnRheGVzLnB1c2gocGFpcik7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAn
Y2xhc3MnKSB7CisgICAgICAgICAgY2xhc3NQYWlyID0gcGFpcjsKKyAgICAgICAgfQorICAgICAg
fSk7CisKKyAgICAgIGlmIChhbGxPZlRoZU1pY3Jvc3ludGF4ZXMubGVuZ3RoID09PSAwKSB7Cisg
ICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGNsYXNzVmFsdWUgPSBbXTsKKwor
ICAgICAgaWYgKGNsYXNzUGFpcikgeworICAgICAgICBjbGFzc1ZhbHVlLnB1c2goY2xhc3NQYWly
LnZhbHVlKTsKKyAgICAgICAgY2xhc3NWYWx1ZS5wdXNoKGIuc3RyaW5nKCcgJykpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgY2xhc3NQYWlyID0gYi5wYWlyKCdjbGFzcycsIG51bGwpOworICAg
ICAgICBub2RlLmhhc2gucGFpcnMucHVzaChjbGFzc1BhaXIpOworICAgICAgfQorCisgICAgICBl
YWNoKGFsbE9mVGhlTWljcm9zeW50YXhJbmRleGVzLCBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgICAg
ICAgbm9kZS5oYXNoLnBhaXJzLnNwbGljZShpbmRleCwgMSk7CisgICAgICB9KTsKKworICAgICAg
ZWFjaChhbGxPZlRoZU1pY3Jvc3ludGF4ZXMsIGZ1bmN0aW9uIChfcmVmKSB7CisgICAgICAgIHZh
ciB2YWx1ZSA9IF9yZWYudmFsdWU7CisgICAgICAgIHZhciBsb2MgPSBfcmVmLmxvYzsKKworICAg
ICAgICB2YXIgc2V4cHJzID0gW107CisgICAgICAgIC8vIFRPRE86IGFkZCBoZWxwZnVsIGRlcHJl
Y2F0aW9uIHdoZW4gYm90aCBgY2xhc3NOYW1lc2AgYW5kIGBjbGFzc05hbWVCaW5kaW5nc2AgY2Fu
CisgICAgICAgIC8vIGJlIHJlbW92ZWQuCisKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdT
dHJpbmdMaXRlcmFsJykgeworICAgICAgICAgIHZhciBtaWNyb3N5bnRheCA9IHBhcnNlTWljcm9z
eW50YXgodmFsdWUub3JpZ2luYWwpOworCisgICAgICAgICAgYnVpbGRTZXhwcnMobWljcm9zeW50
YXgsIHNleHBycywgYik7CisKKyAgICAgICAgICBjbGFzc1ZhbHVlLnB1c2guYXBwbHkoY2xhc3NW
YWx1ZSwgc2V4cHJzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHZhciBoYXNoID0g
Yi5oYXNoKCk7CisgICAgICBjbGFzc1BhaXIudmFsdWUgPSBiLnNleHByKGIuc3RyaW5nKCdjb25j
YXQnKSwgY2xhc3NWYWx1ZSwgaGFzaCk7CisgICAgfSk7CisKKyAgICByZXR1cm4gYXN0OworICB9
OworCisgIGZ1bmN0aW9uIGJ1aWxkU2V4cHJzKG1pY3Jvc3ludGF4LCBzZXhwcnMsIGIpIHsKKyAg
ICBmb3IgKHZhciBpID0gMCwgbCA9IG1pY3Jvc3ludGF4Lmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgdmFyIF9taWNyb3N5bnRheCRpID0gbWljcm9zeW50YXhbaV07CisgICAgICB2YXIgcHJv
cE5hbWUgPSBfbWljcm9zeW50YXgkaVswXTsKKyAgICAgIHZhciBhY3RpdmVDbGFzcyA9IF9taWNy
b3N5bnRheCRpWzFdOworICAgICAgdmFyIGluYWN0aXZlQ2xhc3MgPSBfbWljcm9zeW50YXgkaVsy
XTsKKworICAgICAgdmFyIHNleHByID0gdW5kZWZpbmVkOworCisgICAgICAvLyA6bXktY2xhc3Mt
bmFtZSBtaWNyb3N5bnRheCBmb3Igc3RhdGljIHZhbHVlcworICAgICAgaWYgKHByb3BOYW1lID09
PSAnJykgeworICAgICAgICBzZXhwciA9IGIuc3RyaW5nKGFjdGl2ZUNsYXNzKTsKKyAgICAgIH0g
ZWxzZSB7CisgICAgICAgIHZhciBwYXJhbXMgPSBbYi5wYXRoKHByb3BOYW1lKV07CisKKyAgICAg
ICAgaWYgKGFjdGl2ZUNsYXNzKSB7CisgICAgICAgICAgcGFyYW1zLnB1c2goYi5zdHJpbmcoYWN0
aXZlQ2xhc3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgc2V4cHJQYXJhbXMg
PSBbYi5zdHJpbmcocHJvcE5hbWUpLCBiLnBhdGgocHJvcE5hbWUpXTsKKworICAgICAgICAgIHZh
ciBoYXNoID0gYi5oYXNoKCk7CisgICAgICAgICAgaWYgKGFjdGl2ZUNsYXNzICE9PSB1bmRlZmlu
ZWQpIHsKKyAgICAgICAgICAgIGhhc2gucGFpcnMucHVzaChiLnBhaXIoJ2FjdGl2ZUNsYXNzJywg
Yi5zdHJpbmcoYWN0aXZlQ2xhc3MpKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGlu
YWN0aXZlQ2xhc3MgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgaGFzaC5wYWlycy5wdXNo
KGIucGFpcignaW5hY3RpdmVDbGFzcycsIGIuc3RyaW5nKGluYWN0aXZlQ2xhc3MpKSk7CisgICAg
ICAgICAgfQorCisgICAgICAgICAgcGFyYW1zLnB1c2goYi5zZXhwcihiLnN0cmluZygnLW5vcm1h
bGl6ZS1jbGFzcycpLCBzZXhwclBhcmFtcywgaGFzaCkpOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKGluYWN0aXZlQ2xhc3MpIHsKKyAgICAgICAgICBwYXJhbXMucHVzaChiLnN0cmluZyhpbmFj
dGl2ZUNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXhwciA9IGIuc2V4cHIoYi5zdHJp
bmcoJ2lmJyksIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIHNleHBycy5wdXNoKHNleHByKTsK
KyAgICAgIHNleHBycy5wdXNoKGIuc3RyaW5nKCcgJykpOworICAgIH0KKyAgfQorCisgIGZ1bmN0
aW9uIHZhbGlkYXRlKG5vZGUpIHsKKyAgICByZXR1cm4gbm9kZS50eXBlID09PSAnQmxvY2tTdGF0
ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ011c3RhY2hlU3RhdGVtZW50JzsKKyAgfQorCisgIGZ1
bmN0aW9uIGVhY2gobGlzdCwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxp
c3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBjYWxsYmFjayhsaXN0W2ldLCBpKTsKKyAg
ICB9CisgIH0KKworICBmdW5jdGlvbiBwYXJzZU1pY3Jvc3ludGF4KHN0cmluZykgeworICAgIHZh
ciBzZWdtZW50cyA9IHN0cmluZy5zcGxpdCgnICcpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwg
PSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHNlZ21lbnRzW2ldID0gc2Vn
bWVudHNbaV0uc3BsaXQoJzonKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VnbWVudHM7CisgIH0K
K30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9wbHVnaW5zL3RyYW5zZm9ybS10
b3AtbGV2ZWwtY29tcG9uZW50cycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rpb24gVHJhbnNmb3JtVG9wTGV2ZWxDb21wb25lbnRz
KCkgeworICAgIC8vIHNldCBsYXRlciB3aXRoaW4gSFRNTEJhcnMgdG8gdGhlIHN5bnRheCBwYWNr
YWdlCisgICAgdGhpcy5zeW50YXggPSBudWxsOworICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUK
KyAgICBAbWV0aG9kIHRyYW5zZm9ybQorICAgIEBwYXJhbSB7QVNUfSBUaGUgQVNUIHRvIGJlIHRy
YW5zZm9ybWVkLgorICAqLworICBUcmFuc2Zvcm1Ub3BMZXZlbENvbXBvbmVudHMucHJvdG90eXBl
LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIFRyYW5zZm9ybVRvcExldmVsQ29tcG9uZW50c190cmFuc2Zv
cm0oYXN0KSB7CisgICAgdmFyIGIgPSB0aGlzLnN5bnRheC5idWlsZGVyczsKKworICAgIGhhc1Np
bmdsZUNvbXBvbmVudE5vZGUoYXN0LCBmdW5jdGlvbiAoY29tcG9uZW50KSB7CisgICAgICBpZiAo
Y29tcG9uZW50LnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgeworICAgICAgICBjb21wb25lbnQu
dGFnID0gJ0AnICsgY29tcG9uZW50LnRhZzsKKyAgICAgICAgY29tcG9uZW50LmlzU3RhdGljID0g
dHJ1ZTsKKyAgICAgIH0KKyAgICB9LCBmdW5jdGlvbiAoZWxlbWVudCkgeworICAgICAgdmFyIGhh
c1RyaXBsZUN1cmxpZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXMuc29tZShmdW5jdGlvbiAoYXR0cikg
eworICAgICAgICByZXR1cm4gYXR0ci52YWx1ZS5lc2NhcGVkID09PSBmYWxzZTsKKyAgICAgIH0p
OworCisgICAgICBpZiAoZWxlbWVudC5tb2RpZmllcnMubGVuZ3RoIHx8IGhhc1RyaXBsZUN1cmxp
ZXMpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAv
LyBUT0RPOiBQcm9wZXJseSBjb3B5IGxvYyBmcm9tIGNoaWxkcmVuCisgICAgICAgIHZhciBwcm9n
cmFtID0gYi5wcm9ncmFtKGVsZW1lbnQuY2hpbGRyZW4pOworICAgICAgICB2YXIgY29tcG9uZW50
ID0gYi5jb21wb25lbnQoJ0A8JyArIGVsZW1lbnQudGFnICsgJz4nLCBlbGVtZW50LmF0dHJpYnV0
ZXMsIHByb2dyYW0sIGVsZW1lbnQubG9jKTsKKyAgICAgICAgY29tcG9uZW50LmlzU3RhdGljID0g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgIH0KKyAgICB9KTsKKworICAg
IHJldHVybiBhc3Q7CisgIH07CisKKyAgZnVuY3Rpb24gaGFzU2luZ2xlQ29tcG9uZW50Tm9kZShw
cm9ncmFtLCBjb21wb25lbnRDYWxsYmFjaywgZWxlbWVudENhbGxiYWNrKSB7CisgICAgdmFyIGxv
YyA9IHByb2dyYW0ubG9jOworICAgIHZhciBib2R5ID0gcHJvZ3JhbS5ib2R5OworCisgICAgaWYg
KCFsb2MgfHwgbG9jLnN0YXJ0LmxpbmUgIT09IDEgfHwgbG9jLnN0YXJ0LmNvbHVtbiAhPT0gMCkg
eworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBsYXN0Q29tcG9uZW50Tm9kZSA9IHVu
ZGVmaW5lZDsKKyAgICB2YXIgbGFzdEluZGV4ID0gdW5kZWZpbmVkOworICAgIHZhciBub2RlQ291
bnQgPSAwOworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkr
KykgeworICAgICAgdmFyIGN1cnIgPSBib2R5W2ldOworCisgICAgICAvLyB0ZXh0IG5vZGUgd2l0
aCB3aGl0ZXNwYWNlIG9ubHkKKyAgICAgIGlmIChjdXJyLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYg
L15bXHNdKiQvLnRlc3QoY3Vyci5jaGFycykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9
CisKKyAgICAgIC8vIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzIGlmIHdlJ3ZlIGJlZW4gaGVy
ZSBiZWZvcmUKKyAgICAgIGlmIChub2RlQ291bnQrKyA+IDApIHsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgfQorCisgICAgICBpZiAoY3Vyci50eXBlID09PSAnQ29tcG9uZW50Tm9kZScg
fHwgY3Vyci50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7CisgICAgICAgIGxhc3RDb21wb25lbnRO
b2RlID0gY3VycjsKKyAgICAgICAgbGFzdEluZGV4ID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAoIWxhc3RDb21wb25lbnROb2RlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKGxhc3RDb21wb25lbnROb2RlLnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgeworICAgICAg
Y29tcG9uZW50Q2FsbGJhY2sobGFzdENvbXBvbmVudE5vZGUpOworICAgIH0KKyAgfQorCisgIGV4
cG9ydHMuZGVmYXVsdCA9IFRyYW5zZm9ybVRvcExldmVsQ29tcG9uZW50czsKK30pOworZW5pZmVk
KCdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0ZW0vY2FsY3VsYXRlLWxvY2F0aW9uLWRpc3Bs
YXknLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IGNhbGN1bGF0ZUxvY2F0aW9uRGlzcGxheTsKKworICBmdW5j
dGlvbiBjYWxjdWxhdGVMb2NhdGlvbkRpc3BsYXkobW9kdWxlTmFtZSwgX2xvYykgeworICAgIHZh
ciBsb2MgPSBfbG9jIHx8IHt9OworCisgICAgdmFyIF9yZWYgPSBsb2Muc3RhcnQgfHwge307CisK
KyAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47CisgICAgdmFyIGxpbmUgPSBfcmVmLmxpbmU7
CisKKyAgICB2YXIgbW9kdWxlSW5mbyA9ICcnOworICAgIGlmIChtb2R1bGVOYW1lKSB7CisgICAg
ICBtb2R1bGVJbmZvICs9ICdcJycgKyBtb2R1bGVOYW1lICsgJ1wnICc7CisgICAgfQorCisgICAg
aWYgKGxpbmUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IHVuZGVmaW5lZCkgeworICAgICAg
aWYgKG1vZHVsZU5hbWUpIHsKKyAgICAgICAgLy8gb25seSBwcmVwZW5kIEAgaWYgdGhlIG1vZHVs
ZU5hbWUgd2FzIHByZXNlbnQKKyAgICAgICAgbW9kdWxlSW5mbyArPSAnQCAnOworICAgICAgfQor
ICAgICAgbW9kdWxlSW5mbyArPSAnTCcgKyBsaW5lICsgJzpDJyArIGNvbHVtbjsKKyAgICB9CisK
KyAgICBpZiAobW9kdWxlSW5mbykgeworICAgICAgbW9kdWxlSW5mbyA9ICcoJyArIG1vZHVsZUlu
Zm8gKyAnKSAnOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVJbmZvOworICB9Cit9KTsKK2Vu
aWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NvbXBpbGUnLCBbJ2V4cG9ydHMn
LCAnZW1iZXItbWV0YWwvZmVhdHVyZXMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21w
aWxlci9zeXN0ZW0vY29tcGlsZV9vcHRpb25zJywgJ2VtYmVyLXRlbXBsYXRlLWNvbXBpbGVyL3N5
c3RlbS90ZW1wbGF0ZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJlcywg
X3JlcXVpcmUsIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1Db21waWxlX29wdGlvbnMsIF9l
bWJlclRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZSkgeworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIHZhciBjb21waWxlOworCisgIC8qKgorICAgIFVzZXMgSFRNTEJhcnMg
YGNvbXBpbGVgIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBzdHJpbmcgaW50byBhIGNvbXBpbGVkIHRl
bXBsYXRlLgorICAKKyAgICBUaGlzIGlzIG5vdCBwcmVzZW50IGluIHByb2R1Y3Rpb24gYnVpbGRz
LgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgY29tcGlsZQorICAgIEBwYXJhbSB7U3Ry
aW5nfSB0ZW1wbGF0ZVN0cmluZyBUaGlzIGlzIHRoZSBzdHJpbmcgdG8gYmUgY29tcGlsZWQgYnkg
SFRNTEJhcnMuCisgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhpcyBpcyBhbiBvcHRpb25z
IGhhc2ggdG8gYXVnbWVudCB0aGUgY29tcGlsZXIgb3B0aW9ucy4KKyAgKi8KKworICBleHBvcnRz
LmRlZmF1bHQgPSBmdW5jdGlvbiAodGVtcGxhdGVTdHJpbmcsIG9wdGlvbnMpIHsKKyAgICBpZiAo
IWNvbXBpbGUgJiYgX3JlcXVpcmUuaGFzKCdodG1sYmFycy1jb21waWxlci9jb21waWxlcicpKSB7
CisgICAgICBjb21waWxlID0gX3JlcXVpcmUuZGVmYXVsdCgnaHRtbGJhcnMtY29tcGlsZXIvY29t
cGlsZXInKS5jb21waWxlOworICAgIH0KKworICAgIGlmICghY29tcGlsZSkgeworICAgICAgdGhy
b3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBgY29tcGlsZWAgd2l0aG91dCB0aGUgdGVtcGxhdGUg
Y29tcGlsZXIgbG9hZGVkLiBQbGVhc2UgbG9hZCBgZW1iZXItdGVtcGxhdGUtY29tcGlsZXIuanNg
IHByaW9yIHRvIGNhbGxpbmcgYGNvbXBpbGVgLicpOworICAgIH0KKworICAgIHZhciB0ZW1wbGF0
ZVNwZWMgPSBjb21waWxlKHRlbXBsYXRlU3RyaW5nLCBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVyU3lz
dGVtQ29tcGlsZV9vcHRpb25zLmRlZmF1bHQob3B0aW9ucykpOworCisgICAgcmV0dXJuIF9lbWJl
clRlbXBsYXRlQ29tcGlsZXJTeXN0ZW1UZW1wbGF0ZS5kZWZhdWx0KHRlbXBsYXRlU3BlYyk7Cisg
IH07Cit9KTsKK2VuaWZlZCgnZW1iZXItdGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL2NvbXBpbGVf
b3B0aW9ucycsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItdGVtcGxh
dGUtY29tcGlsZXIvcGx1Z2lucyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3Np
Z24sIF9lbWJlclRlbXBsYXRlQ29tcGlsZXJQbHVnaW5zKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdGVtcGxhdGUtY29tcGlsZXIKKyAgKi8KKworICAndXNl
IHN0cmljdCc7CisKKyAgdmFyIGNvbXBpbGVPcHRpb25zID0gdW5kZWZpbmVkOworICB2YXIgZnJh
Z21lbnRSZWFzb24gPSB1bmRlZmluZWQ7CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICBAcHJv
cGVydHkgY29tcGlsZU9wdGlvbnMKKyAgKi8KKyAgY29tcGlsZU9wdGlvbnMgPSBmdW5jdGlvbiAo
X29wdGlvbnMpIHsKKyAgICB2YXIgZGlzYWJsZUNvbXBvbmVudEdlbmVyYXRpb24gPSB0cnVlOwor
CisgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CisgICAgLy8gV2hlbiBjYWxsaW5nIGBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoKWAgYSBzZWNvbmQgYXJndW1lbnQgb2YgYHRydWVgCisgICAg
Ly8gaGFkIGEgc3BlY2lhbCBtZWFuaW5nIChsb25nIHNpbmNlIGxvc3QpLCB0aGlzIGp1c3QgZ2F1
cmRzIGFnYWluc3QKKyAgICAvLyBgb3B0aW9uc2AgYmVpbmcgdHJ1ZSwgYW5kIGNhdXNpbmcgYW4g
ZXJyb3IgZHVyaW5nIGNvbXBpbGF0aW9uLgorICAgIGlmIChfb3B0aW9ucyA9PT0gdHJ1ZSkgewor
ICAgICAgb3B0aW9ucyA9IHt9OworICAgIH0gZWxzZSB7CisgICAgICBvcHRpb25zID0gX2VtYmVy
TWV0YWxBc3NpZ24uZGVmYXVsdCh7fSwgX29wdGlvbnMpOworICAgIH0KKworICAgIG9wdGlvbnMu
ZGlzYWJsZUNvbXBvbmVudEdlbmVyYXRpb24gPSBkaXNhYmxlQ29tcG9uZW50R2VuZXJhdGlvbjsK
KworICAgIHZhciBwbHVnaW5zID0geworICAgICAgYXN0OiBfZW1iZXJUZW1wbGF0ZUNvbXBpbGVy
UGx1Z2lucy5kZWZhdWx0LmFzdC5zbGljZSgpCisgICAgfTsKKworICAgIGlmIChvcHRpb25zLnBs
dWdpbnMgJiYgb3B0aW9ucy5wbHVnaW5zLmFzdCkgeworICAgICAgcGx1Z2lucy5hc3QgPSBwbHVn
aW5zLmFzdC5jb25jYXQob3B0aW9ucy5wbHVnaW5zLmFzdCk7CisgICAgfQorICAgIG9wdGlvbnMu
cGx1Z2lucyA9IHBsdWdpbnM7CisKKyAgICBvcHRpb25zLmJ1aWxkTWV0YSA9IGZ1bmN0aW9uIGJ1
aWxkTWV0YShwcm9ncmFtKSB7CisgICAgICByZXR1cm4geworICAgICAgICBmcmFnbWVudFJlYXNv
bjogZnJhZ21lbnRSZWFzb24ocHJvZ3JhbSksCisgICAgICAgIHJldmlzaW9uOiAnRW1iZXJAMi42
LjInLAorICAgICAgICBsb2M6IHByb2dyYW0ubG9jLAorICAgICAgICBtb2R1bGVOYW1lOiBvcHRp
b25zLm1vZHVsZU5hbWUKKyAgICAgIH07CisgICAgfTsKKworICAgIHJldHVybiBvcHRpb25zOwor
ICB9OworCisgIGZyYWdtZW50UmVhc29uID0gZnVuY3Rpb24gKHByb2dyYW0pIHsKKyAgICB2YXIg
bG9jID0gcHJvZ3JhbS5sb2M7CisgICAgdmFyIGJvZHkgPSBwcm9ncmFtLmJvZHk7CisKKyAgICBp
ZiAoIWxvYyB8fCBsb2Muc3RhcnQubGluZSAhPT0gMSB8fCBsb2Muc3RhcnQuY29sdW1uICE9PSAw
KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFyIGNhbmRpZGF0ZSA9IHVu
ZGVmaW5lZDsKKyAgICB2YXIgbm9kZUNvdW50ID0gMDsKKworICAgIHZhciBwcm9ibGVtcyA9IHt9
OworCisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykgewor
ICAgICAgdmFyIGN1cnIgPSBib2R5W2ldOworCisgICAgICAvLyB0ZXh0IG5vZGUgd2l0aCB3aGl0
ZXNwYWNlIG9ubHkKKyAgICAgIGlmIChjdXJyLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgL15bXHNd
KiQvLnRlc3QoY3Vyci5jaGFycykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAg
ICAgIC8vIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzIGlmIHdlJ3ZlIGJlZW4gaGVyZSBiZWZv
cmUKKyAgICAgIGlmIChub2RlQ291bnQrKyA+IDApIHsKKyAgICAgICAgcHJvYmxlbXNbJ211bHRp
cGxlLW5vZGVzJ10gPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoY3Vyci50eXBlID09PSAn
Q29tcG9uZW50Tm9kZScgfHwgY3Vyci50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7CisgICAgICAg
IGNhbmRpZGF0ZSA9IGN1cnI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcm9ibGVtc1snd3Jv
bmctdHlwZSddID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobm9kZUNvdW50ID09
PSAwKSB7CisgICAgICByZXR1cm4geyBuYW1lOiAnbWlzc2luZy13cmFwcGVyJywgcHJvYmxlbXM6
IFsnZW1wdHktYm9keSddIH07CisgICAgfQorCisgICAgdmFyIHByb2JsZW1MaXN0ID0gT2JqZWN0
LmtleXMocHJvYmxlbXMpOworICAgIGlmIChwcm9ibGVtTGlzdC5sZW5ndGgpIHsKKyAgICAgIHJl
dHVybiB7IG5hbWU6ICdtaXNzaW5nLXdyYXBwZXInLCBwcm9ibGVtczogcHJvYmxlbUxpc3QgfTsK
KyAgICB9CisKKyAgICBpZiAoY2FuZGlkYXRlLnR5cGUgPT09ICdDb21wb25lbnROb2RlJykgewor
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlLm1vZGlmaWVycy5s
ZW5ndGgpIHsKKyAgICAgIHJldHVybiB7IG5hbWU6ICdtb2RpZmllcnMnLCBtb2RpZmllcnM6IGNh
bmRpZGF0ZS5tb2RpZmllcnMubWFwKGZ1bmN0aW9uIChtKSB7CisgICAgICAgICAgcmV0dXJuIG0u
cGF0aC5vcmlnaW5hbDsKKyAgICAgICAgfSkgfTsKKyAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5h
dHRyaWJ1dGVzLnNvbWUoZnVuY3Rpb24gKGF0dHIpIHsKKyAgICAgIHJldHVybiAhYXR0ci52YWx1
ZS5lc2NhcGVkOworICAgIH0pKSB7CisgICAgICByZXR1cm4geyBuYW1lOiAndHJpcGxlLWN1cmxp
ZXMnIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gY29tcGlsZU9wdGlvbnM7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dGVtcGxhdGUtY29tcGlsZXIvc3lzdGVtL3ByZWNvbXBpbGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
bWV0YWwvZmVhdHVyZXMnLCAncmVxdWlyZScsICdlbWJlci10ZW1wbGF0ZS1jb21waWxlci9zeXN0
ZW0vY29tcGlsZV9vcHRpb25zJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbEZlYXR1
cmVzLCBfcmVxdWlyZSwgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0aW9u
cykgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBjb21waWxlU3BlYzsK
KworICAvKioKKyAgICBVc2VzIEhUTUxCYXJzIGBjb21waWxlYCBmdW5jdGlvbiB0byBwcm9jZXNz
IGEgc3RyaW5nIGludG8gYSBjb21waWxlZCB0ZW1wbGF0ZSBzdHJpbmcuCisgICAgVGhlIHJldHVy
bmVkIHN0cmluZyBtdXN0IGJlIHBhc3NlZCB0aHJvdWdoIGBFbWJlci5IVE1MQmFycy50ZW1wbGF0
ZWAuCisgIAorICAgIFRoaXMgaXMgbm90IHByZXNlbnQgaW4gcHJvZHVjdGlvbiBidWlsZHMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBwcmVjb21waWxlCisgICAgQHBhcmFtIHtTdHJp
bmd9IHRlbXBsYXRlU3RyaW5nIFRoaXMgaXMgdGhlIHN0cmluZyB0byBiZSBjb21waWxlZCBieSBI
VE1MQmFycy4KKyAgKi8KKworICBleHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAodGVtcGxhdGVT
dHJpbmcsIG9wdGlvbnMpIHsKKyAgICBpZiAoIWNvbXBpbGVTcGVjICYmIF9yZXF1aXJlLmhhcygn
aHRtbGJhcnMtY29tcGlsZXIvY29tcGlsZXInKSkgeworICAgICAgY29tcGlsZVNwZWMgPSBfcmVx
dWlyZS5kZWZhdWx0KCdodG1sYmFycy1jb21waWxlci9jb21waWxlcicpLmNvbXBpbGVTcGVjOwor
ICAgIH0KKworICAgIGlmICghY29tcGlsZVNwZWMpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcign
Q2Fubm90IGNhbGwgYGNvbXBpbGVTcGVjYCB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBjb21waWxlciBs
b2FkZWQuIFBsZWFzZSBsb2FkIGBlbWJlci10ZW1wbGF0ZS1jb21waWxlci5qc2AgcHJpb3IgdG8g
Y2FsbGluZyBgY29tcGlsZVNwZWNgLicpOworICAgIH0KKworICAgIHJldHVybiBjb21waWxlU3Bl
Yyh0ZW1wbGF0ZVN0cmluZywgX2VtYmVyVGVtcGxhdGVDb21waWxlclN5c3RlbUNvbXBpbGVfb3B0
aW9ucy5kZWZhdWx0KG9wdGlvbnMpKTsKKyAgfTsKK30pOworZW5pZmVkKCdlbWJlci10ZW1wbGF0
ZS1jb21waWxlci9zeXN0ZW0vdGVtcGxhdGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZmVh
dHVyZXMnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxGZWF0dXJl
cywgX3JlcXVpcmUyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlbXBsYXRlLWNvbXBpbGVyCisgICovCisKKyAgLyoqCisg
ICAgQXVnbWVudHMgdGhlIGRlZmF1bHQgcHJlY29tcGlsZWQgb3V0cHV0IG9mIGFuIEhUTUxCYXJz
IHRlbXBsYXRlIHdpdGgKKyAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRlZCBieSBFbWJl
ci4KKyAgCisgICAgQHByaXZhdGUKKyAgICBAbWV0aG9kIHRlbXBsYXRlCisgICAgQHBhcmFtIHtG
dW5jdGlvbn0gdGVtcGxhdGVTcGVjIFRoaXMgaXMgdGhlIGNvbXBpbGVkIEhUTUxCYXJzIHRlbXBs
YXRlIHNwZWMuCisgICovCisKKyAgdmFyIHRlbXBsYXRlID0gdW5kZWZpbmVkOworCisgIHZhciBf
cmVxdWlyZSA9IF9yZXF1aXJlMi5kZWZhdWx0KCdodG1sYmFycy1ydW50aW1lL2hvb2tzJyk7CisK
KyAgdmFyIHdyYXAgPSBfcmVxdWlyZS53cmFwOworCisgIHRlbXBsYXRlID0gZnVuY3Rpb24gKHRl
bXBsYXRlU3BlYykgeworICAgIGlmICghdGVtcGxhdGVTcGVjLnJlbmRlcikgeworICAgICAgdGVt
cGxhdGVTcGVjID0gd3JhcCh0ZW1wbGF0ZVNwZWMpOworICAgIH0KKworICAgIHRlbXBsYXRlU3Bl
Yy5pc1RvcCA9IHRydWU7CisgICAgdGVtcGxhdGVTcGVjLmlzTWV0aG9kID0gZmFsc2U7CisKKyAg
ICByZXR1cm4gdGVtcGxhdGVTcGVjOworICB9OworICBleHBvcnRzLmRlZmF1bHQgPSB0ZW1wbGF0
ZTsKK30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2FkYXB0ZXJzL2FkYXB0ZXInLCBbJ2V4cG9y
dHMnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2JqZWN0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJSdW50aW1lU3lzdGVtT2JqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlv
biBLKCkgeworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICBAbW9kdWxlIGVtYmVy
CisgICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICAvKioKKyAgICBUaGUgcHJp
bWFyeSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gY3JlYXRlIGhvb2tzIHRoYXQgY2FuIGJl
IGltcGxlbWVudGVkCisgICAgYnkgYW4gYWRhcHRlciBmb3IgdmFyaW91cyB0ZXN0IGZyYW1ld29y
a3MuCisgIAorICAgIEBjbGFzcyBBZGFwdGVyCisgICAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Cisg
ICAgQHB1YmxpYworICAqLworICB2YXIgQWRhcHRlciA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmpl
Y3QuZGVmYXVsdC5leHRlbmQoeworICAgIC8qKgorICAgICAgVGhpcyBjYWxsYmFjayB3aWxsIGJl
IGNhbGxlZCB3aGVuZXZlciBhbiBhc3luYyBvcGVyYXRpb24gaXMgYWJvdXQgdG8gc3RhcnQuCisg
ICAgICAgT3ZlcnJpZGUgdGhpcyB0byBjYWxsIHlvdXIgZnJhbWV3b3JrJ3MgbWV0aG9kcyB0aGF0
IGhhbmRsZSBhc3luYworICAgICAgb3BlcmF0aW9ucy4KKyAgICAgICBAcHVibGljCisgICAgICBA
bWV0aG9kIGFzeW5jU3RhcnQKKyAgICAqLworICAgIGFzeW5jU3RhcnQ6IEssCisKKyAgICAvKioK
KyAgICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5bmMgb3Bl
cmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBhc3lu
Y0VuZAorICAgICovCisgICAgYXN5bmNFbmQ6IEssCisKKyAgICAvKioKKyAgICAgIE92ZXJyaWRl
IHRoaXMgbWV0aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1ld29yaydzIGZhbHNlIGFzc2VydGlv
bi4KKyAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBv
Y2N1cnMgY2F1c2luZyB0aGUgdGVzdGluZworICAgICAgcHJvbWlzZSB0byBmYWlsLgorICAgICAg
IFFVbml0IGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgICBleGNlcHRpb246
IGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgICAgb2soZmFsc2UsIGVycm9yKTsKKyAgICAgICAg
fTsKKyAgICAgIGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBtZXRob2QgZXhjZXB0aW9uCisg
ICAgICBAcGFyYW0ge1N0cmluZ30gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCisg
ICAgKi8KKyAgICBleGNlcHRpb246IGZ1bmN0aW9uIChlcnJvcikgeworICAgICAgdGhyb3cgZXJy
b3I7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBBZGFwdGVyOworfSk7Citl
bmlmZWQoJ2VtYmVyLXRlc3RpbmcvYWRhcHRlcnMvcXVuaXQnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
dGVzdGluZy9hZGFwdGVycy9hZGFwdGVyJywgJ2VtYmVyLW1ldGFsL3V0aWxzJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJUZXN0aW5nQWRhcHRlcnNBZGFwdGVyLCBfZW1iZXJNZXRhbFV0aWxz
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMg
dGhlIG1ldGhvZHMgZGVmaW5lZCBieSBFbWJlci5UZXN0LkFkYXB0ZXIgZm9yIHRoZQorICAgIFFV
bml0IHRlc3RpbmcgZnJhbWV3b3JrLgorICAKKyAgICBAY2xhc3MgUVVuaXRBZGFwdGVyCisgICAg
QG5hbWVzcGFjZSBFbWJlci5UZXN0CisgICAgQGV4dGVuZHMgRW1iZXIuVGVzdC5BZGFwdGVyCisg
ICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJUZXN0aW5nQWRhcHRl
cnNBZGFwdGVyLmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBhc3luY1N0YXJ0OiBmdW5jdGlvbiAoKSB7
CisgICAgICBRVW5pdC5zdG9wKCk7CisgICAgfSwKKyAgICBhc3luY0VuZDogZnVuY3Rpb24gKCkg
eworICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICB9LAorICAgIGV4Y2VwdGlvbjogZnVuY3Rpb24g
KGVycm9yKSB7CisgICAgICBvayhmYWxzZSwgX2VtYmVyTWV0YWxVdGlscy5pbnNwZWN0KGVycm9y
KSk7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2hlbHBlcnMnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Vycm9y
JywgJ2VtYmVyLW1ldGFsL3J1bl9sb29wJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAn
ZW1iZXItdGVzdGluZy90ZXN0JywgJ2VtYmVyLXJ1bnRpbWUvZXh0L3JzdnAnLCAnZW1iZXItbWV0
YWwvZmVhdHVyZXMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
LCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFJ1bl9sb29wLCBfZW1iZXJWaWV3c1N5c3Rl
bUpxdWVyeSwgX2VtYmVyVGVzdGluZ1Rlc3QsIF9lbWJlclJ1bnRpbWVFeHRSc3ZwLCBfZW1iZXJN
ZXRhbEZlYXR1cmVzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBlbWJl
cgorICBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICB2YXIgaGVscGVyID0gX2Vt
YmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC5yZWdpc3RlckhlbHBlcjsKKyAgdmFyIGFzeW5jSGVscGVy
ID0gX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC5yZWdpc3RlckFzeW5jSGVscGVyOworCisgIHZh
ciBrZXlib2FyZEV2ZW50VHlwZXMsIG1vdXNlRXZlbnRUeXBlcywgYnVpbGRLZXlib2FyZEV2ZW50
LCBidWlsZE1vdXNlRXZlbnQsIGJ1aWxkQmFzaWNFdmVudCwgZmlyZUV2ZW50LCBmb2N1czsKKwor
ICB2YXIgZGVmYXVsdEV2ZW50T3B0aW9ucyA9IHsgY2FuQnViYmxlOiB0cnVlLCBjYW5jZWxhYmxl
OiB0cnVlIH07CisgIGtleWJvYXJkRXZlbnRUeXBlcyA9IFsna2V5ZG93bicsICdrZXlwcmVzcycs
ICdrZXl1cCddOworICBtb3VzZUV2ZW50VHlwZXMgPSBbJ2NsaWNrJywgJ21vdXNlZG93bicsICdt
b3VzZXVwJywgJ2RibGNsaWNrJywgJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZScsICdtb3VzZW1v
dmUnLCAnbW91c2VvdXQnLCAnbW91c2VvdmVyJ107CisKKyAgYnVpbGRLZXlib2FyZEV2ZW50ID0g
ZnVuY3Rpb24gYnVpbGRLZXlib2FyZEV2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFy
Z3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDog
YXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gdW5kZWZpbmVkOworICAgIHRyeSB7Cisg
ICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdLZXlFdmVudHMnKTsKKyAgICAgIHZh
ciBldmVudE9wdHMgPSBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZCh7fSwg
ZGVmYXVsdEV2ZW50T3B0aW9ucywgb3B0aW9ucyk7CisgICAgICBldmVudC5pbml0S2V5RXZlbnQo
dHlwZSwgZXZlbnRPcHRzLmNhbkJ1YmJsZSwgZXZlbnRPcHRzLmNhbmNlbGFibGUsIHdpbmRvdywg
ZXZlbnRPcHRzLmN0cmxLZXksIGV2ZW50T3B0cy5hbHRLZXksIGV2ZW50T3B0cy5zaGlmdEtleSwg
ZXZlbnRPcHRzLm1ldGFLZXksIGV2ZW50T3B0cy5rZXlDb2RlLCBldmVudE9wdHMuY2hhckNvZGUp
OworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGV2ZW50ID0gYnVpbGRCYXNpY0V2ZW50KHR5cGUs
IG9wdGlvbnMpOworICAgIH0KKyAgICByZXR1cm4gZXZlbnQ7CisgIH07CisKKyAgYnVpbGRNb3Vz
ZUV2ZW50ID0gZnVuY3Rpb24gYnVpbGRNb3VzZUV2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9u
cyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/
IHt9IDogYXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gdW5kZWZpbmVkOworICAgIHRy
eSB7CisgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpOwor
ICAgICAgdmFyIGV2ZW50T3B0cyA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQuZXh0
ZW5kKHt9LCBkZWZhdWx0RXZlbnRPcHRpb25zLCBvcHRpb25zKTsKKyAgICAgIGV2ZW50LmluaXRN
b3VzZUV2ZW50KHR5cGUsIGV2ZW50T3B0cy5jYW5CdWJibGUsIGV2ZW50T3B0cy5jYW5jZWxhYmxl
LCB3aW5kb3csIGV2ZW50T3B0cy5kZXRhaWwsIGV2ZW50T3B0cy5zY3JlZW5YLCBldmVudE9wdHMu
c2NyZWVuWSwgZXZlbnRPcHRzLmNsaWVudFgsIGV2ZW50T3B0cy5jbGllbnRZLCBldmVudE9wdHMu
Y3RybEtleSwgZXZlbnRPcHRzLmFsdEtleSwgZXZlbnRPcHRzLnNoaWZ0S2V5LCBldmVudE9wdHMu
bWV0YUtleSwgZXZlbnRPcHRzLmJ1dHRvbiwgZXZlbnRPcHRzLnJlbGF0ZWRUYXJnZXQpOworICAg
IH0gY2F0Y2ggKGUpIHsKKyAgICAgIGV2ZW50ID0gYnVpbGRCYXNpY0V2ZW50KHR5cGUsIG9wdGlv
bnMpOworICAgIH0KKyAgICByZXR1cm4gZXZlbnQ7CisgIH07CisKKyAgYnVpbGRCYXNpY0V2ZW50
ID0gZnVuY3Rpb24gYnVpbGRCYXNpY0V2ZW50KHR5cGUpIHsKKyAgICB2YXIgb3B0aW9ucyA9IGFy
Z3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDog
YXJndW1lbnRzWzFdOworCisgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2
ZW50cycpOworICAgIGV2ZW50LmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKTsKKyAgICBfZW1i
ZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZChldmVudCwgb3B0aW9ucyk7CisgICAg
cmV0dXJuIGV2ZW50OworICB9OworCisgIGZpcmVFdmVudCA9IGZ1bmN0aW9uIGZpcmVFdmVudChl
bGVtZW50LCB0eXBlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIg
fHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1syXTsKKworICAg
IGlmICghZWxlbWVudCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgZXZlbnQgPSB1
bmRlZmluZWQ7CisgICAgaWYgKGtleWJvYXJkRXZlbnRUeXBlcy5pbmRleE9mKHR5cGUpID4gLTEp
IHsKKyAgICAgIGV2ZW50ID0gYnVpbGRLZXlib2FyZEV2ZW50KHR5cGUsIG9wdGlvbnMpOworICAg
IH0gZWxzZSBpZiAobW91c2VFdmVudFR5cGVzLmluZGV4T2YodHlwZSkgPiAtMSkgeworICAgICAg
dmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICAgICAgdmFyIHgg
PSByZWN0LmxlZnQgKyAxOworICAgICAgdmFyIHkgPSByZWN0LnRvcCArIDE7CisgICAgICB2YXIg
c2ltdWxhdGVkQ29vcmRpbmF0ZXMgPSB7CisgICAgICAgIHNjcmVlblg6IHggKyA1LAorICAgICAg
ICBzY3JlZW5ZOiB5ICsgOTUsCisgICAgICAgIGNsaWVudFg6IHgsCisgICAgICAgIGNsaWVudFk6
IHkKKyAgICAgIH07CisgICAgICBldmVudCA9IGJ1aWxkTW91c2VFdmVudCh0eXBlLCBfZW1iZXJW
aWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0LmV4dGVuZChzaW11bGF0ZWRDb29yZGluYXRlcywgb3B0
aW9ucykpOworICAgIH0gZWxzZSB7CisgICAgICBldmVudCA9IGJ1aWxkQmFzaWNFdmVudCh0eXBl
LCBvcHRpb25zKTsKKyAgICB9CisgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAg
fTsKKworICBmb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKGVsKSB7CisgICAgaWYgKCFlbCkgeworICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgJGVsID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnku
ZGVmYXVsdChlbCk7CisgICAgaWYgKCRlbC5pcygnOmlucHV0LCBbY29udGVudGVkaXRhYmxlPXRy
dWVdJykpIHsKKyAgICAgIHZhciB0eXBlID0gJGVsLnByb3AoJ3R5cGUnKTsKKyAgICAgIGlmICh0
eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdyYWRpbycgJiYgdHlwZSAhPT0gJ2hpZGRl
bicpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KG51bGwsIGZ1bmN0aW9u
ICgpIHsKKyAgICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IHRyaWdnZXIgdGhlIGBmb2N1c2lu
YCBldmVudCBpZiB0aGUgd2luZG93CisgICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSBmb2N1cy4g
SWYgdGhlIGRvY3VtZW50IGRvZXNuJ3QgaGF2ZSBmb2N1cyBqdXN0CisgICAgICAgICAgLy8gdXNl
IHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgorCisgICAgICAgICAgaWYgKCFkb2N1bWVudC5o
YXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICBlbC5mb2N1cygp
OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZWwudHJpZ2dlcignZm9jdXNpbicp
OworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9OworCisgIGZ1
bmN0aW9uIGN1cnJlbnRSb3V0ZU5hbWUoYXBwKSB7CisgICAgdmFyIHJvdXRpbmdTZXJ2aWNlID0g
YXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdzZXJ2aWNlOi1yb3V0aW5nJyk7CisKKyAgICByZXR1
cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRpbmdTZXJ2aWNlLCAnY3VycmVudFJv
dXRlTmFtZScpOworICB9CisKKyAgZnVuY3Rpb24gY3VycmVudFBhdGgoYXBwKSB7CisgICAgdmFy
IHJvdXRpbmdTZXJ2aWNlID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdzZXJ2aWNlOi1yb3V0
aW5nJyk7CisKKyAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJvdXRpbmdT
ZXJ2aWNlLCAnY3VycmVudFBhdGgnKTsKKyAgfQorCisgIGZ1bmN0aW9uIGN1cnJlbnRVUkwoYXBw
KSB7CisgICAgdmFyIHJvdXRlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1cCgncm91dGVyOm1h
aW4nKTsKKworICAgIHJldHVybiBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocm91dGVyLCAn
bG9jYXRpb24nKS5nZXRVUkwoKTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhdXNlVGVzdCgpIHsKKyAg
ICBfZW1iZXJUZXN0aW5nVGVzdC5kZWZhdWx0LmFkYXB0ZXIuYXN5bmNTdGFydCgpOworICAgIHJl
dHVybiBuZXcgX2VtYmVyUnVudGltZUV4dFJzdnAuZGVmYXVsdC5Qcm9taXNlKGZ1bmN0aW9uICgp
IHt9LCAnVGVzdEFkYXB0ZXIgcGF1c2VkIHByb21pc2UnKTsKKyAgfQorCisgIGZ1bmN0aW9uIHZp
c2l0KGFwcCwgdXJsKSB7CisgICAgdmFyIHJvdXRlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1
cCgncm91dGVyOm1haW4nKTsKKyAgICB2YXIgc2hvdWxkSGFuZGxlVVJMID0gZmFsc2U7CisKKyAg
ICBhcHAuYm9vdCgpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgcm91dGVyLmxvY2F0aW9uLnNl
dFVSTCh1cmwpOworCisgICAgICBpZiAoc2hvdWxkSGFuZGxlVVJMKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsUnVuX2xvb3AuZGVmYXVsdChhcHAuX19kZXByZWNhdGVkSW5zdGFuY2VfXywgJ2hhbmRs
ZVVSTCcsIHVybCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoYXBwLl9yZWFkaW5lc3NE
ZWZlcnJhbHMgPiAwKSB7CisgICAgICByb3V0ZXJbJ2luaXRpYWxVUkwnXSA9IHVybDsKKyAgICAg
IF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChhcHAsICdhZHZhbmNlUmVhZGluZXNzJyk7Cisg
ICAgICBkZWxldGUgcm91dGVyWydpbml0aWFsVVJMJ107CisgICAgfSBlbHNlIHsKKyAgICAgIHNo
b3VsZEhhbmRsZVVSTCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVy
cy53YWl0KCk7CisgIH0KKworICBmdW5jdGlvbiBjbGljayhhcHAsIHNlbGVjdG9yLCBjb250ZXh0
KSB7CisgICAgdmFyICRlbCA9IGFwcC50ZXN0SGVscGVycy5maW5kV2l0aEFzc2VydChzZWxlY3Rv
ciwgY29udGV4dCk7CisgICAgdmFyIGVsID0gJGVsWzBdOworCisgICAgX2VtYmVyTWV0YWxSdW5f
bG9vcC5kZWZhdWx0KG51bGwsIGZpcmVFdmVudCwgZWwsICdtb3VzZWRvd24nKTsKKworICAgIGZv
Y3VzKGVsKTsKKworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxsLCBmaXJlRXZl
bnQsIGVsLCAnbW91c2V1cCcpOworICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxs
LCBmaXJlRXZlbnQsIGVsLCAnY2xpY2snKTsKKworICAgIHJldHVybiBhcHAudGVzdEhlbHBlcnMu
d2FpdCgpOworICB9CisKKyAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGFwcCwgc2VsZWN0b3IsIGNv
bnRleHRPclR5cGUsIHR5cGVPck9wdGlvbnMsIHBvc3NpYmxlT3B0aW9ucykgeworICAgIHZhciBh
cml0eSA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgdmFyIGNvbnRleHQsIHR5cGUsIG9wdGlvbnM7
CisKKyAgICBpZiAoYXJpdHkgPT09IDMpIHsKKyAgICAgIC8vIGNvbnRleHQgYW5kIG9wdGlvbnMg
YXJlIG9wdGlvbmFsLCBzbyB0aGlzIGlzCisgICAgICAvLyBhcHAsIHNlbGVjdG9yLCB0eXBlCisg
ICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgIHR5cGUgPSBjb250ZXh0T3JUeXBlOworICAgICAg
b3B0aW9ucyA9IHt9OworICAgIH0gZWxzZSBpZiAoYXJpdHkgPT09IDQpIHsKKyAgICAgIC8vIGNv
bnRleHQgYW5kIG9wdGlvbnMgYXJlIG9wdGlvbmFsLCBzbyB0aGlzIGlzCisgICAgICBpZiAodHlw
ZW9mIHR5cGVPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7CisgICAgICAgIC8vIGVpdGhlcgorICAg
ICAgICAvLyBhcHAsIHNlbGVjdG9yLCB0eXBlLCBvcHRpb25zCisgICAgICAgIGNvbnRleHQgPSBu
dWxsOworICAgICAgICB0eXBlID0gY29udGV4dE9yVHlwZTsKKyAgICAgICAgb3B0aW9ucyA9IHR5
cGVPck9wdGlvbnM7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBvcgorICAgICAgICAvLyBh
cHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0eXBlCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0T3JU
eXBlOworICAgICAgICB0eXBlID0gdHlwZU9yT3B0aW9uczsKKyAgICAgICAgb3B0aW9ucyA9IHt9
OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb250ZXh0ID0gY29udGV4dE9yVHlwZTsK
KyAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zOworICAgICAgb3B0aW9ucyA9IHBvc3NpYmxlT3B0
aW9uczsKKyAgICB9CisKKyAgICB2YXIgJGVsID0gYXBwLnRlc3RIZWxwZXJzLmZpbmRXaXRoQXNz
ZXJ0KHNlbGVjdG9yLCBjb250ZXh0KTsKKyAgICB2YXIgZWwgPSAkZWxbMF07CisKKyAgICBfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQobnVsbCwgZmlyZUV2ZW50LCBlbCwgdHlwZSwgb3B0aW9u
cyk7CisKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLndhaXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGtleUV2ZW50KGFwcCwgc2VsZWN0b3IsIGNvbnRleHRPclR5cGUsIHR5cGVPcktleUNvZGUs
IGtleUNvZGUpIHsKKyAgICB2YXIgY29udGV4dCwgdHlwZTsKKworICAgIGlmICh0eXBlb2Yga2V5
Q29kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAga2V5
Q29kZSA9IHR5cGVPcktleUNvZGU7CisgICAgICB0eXBlID0gY29udGV4dE9yVHlwZTsKKyAgICB9
IGVsc2UgeworICAgICAgY29udGV4dCA9IGNvbnRleHRPclR5cGU7CisgICAgICB0eXBlID0gdHlw
ZU9yS2V5Q29kZTsKKyAgICB9CisKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLnRyaWdnZXJF
dmVudChzZWxlY3RvciwgY29udGV4dCwgdHlwZSwgeyBrZXlDb2RlOiBrZXlDb2RlLCB3aGljaDog
a2V5Q29kZSB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbGxJbihhcHAsIHNlbGVjdG9yLCBjb250
ZXh0T3JUZXh0LCB0ZXh0KSB7CisgICAgdmFyICRlbCwgZWwsIGNvbnRleHQ7CisgICAgaWYgKHR5
cGVvZiB0ZXh0ID09PSAndW5kZWZpbmVkJykgeworICAgICAgdGV4dCA9IGNvbnRleHRPclRleHQ7
CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRleHQgPSBjb250ZXh0T3JUZXh0OworICAgIH0KKyAg
ICAkZWwgPSBhcHAudGVzdEhlbHBlcnMuZmluZFdpdGhBc3NlcnQoc2VsZWN0b3IsIGNvbnRleHQp
OworICAgIGVsID0gJGVsWzBdOworICAgIGZvY3VzKGVsKTsKKyAgICBfZW1iZXJNZXRhbFJ1bl9s
b29wLmRlZmF1bHQoZnVuY3Rpb24gKCkgeworICAgICAgJGVsLnZhbCh0ZXh0KTsKKyAgICAgIGZp
cmVFdmVudChlbCwgJ2lucHV0Jyk7CisgICAgICBmaXJlRXZlbnQoZWwsICdjaGFuZ2UnKTsKKyAg
ICB9KTsKKyAgICByZXR1cm4gYXBwLnRlc3RIZWxwZXJzLndhaXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGZpbmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgJGVs
ID0gYXBwLnRlc3RIZWxwZXJzLmZpbmQoc2VsZWN0b3IsIGNvbnRleHQpOworICAgIGlmICgkZWwu
bGVuZ3RoID09PSAwKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0
KCdFbGVtZW50ICcgKyBzZWxlY3RvciArICcgbm90IGZvdW5kLicpOworICAgIH0KKyAgICByZXR1
cm4gJGVsOworICB9CisKKyAgZnVuY3Rpb24gZmluZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7
CisgICAgdmFyICRlbDsKKyAgICBjb250ZXh0ID0gY29udGV4dCB8fCBfZW1iZXJNZXRhbFByb3Bl
cnR5X2dldC5nZXQoYXBwLCAncm9vdEVsZW1lbnQnKTsKKyAgICAkZWwgPSBhcHAuJChzZWxlY3Rv
ciwgY29udGV4dCk7CisKKyAgICByZXR1cm4gJGVsOworICB9CisKKyAgZnVuY3Rpb24gYW5kVGhl
bihhcHAsIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVycy53YWl0KGNhbGxi
YWNrKGFwcCkpOworICB9CisKKyAgZnVuY3Rpb24gd2FpdChhcHAsIHZhbHVlKSB7CisgICAgcmV0
dXJuIG5ldyBfZW1iZXJSdW50aW1lRXh0UnN2cC5kZWZhdWx0LlByb21pc2UoZnVuY3Rpb24gKHJl
c29sdmUpIHsKKyAgICAgIHZhciByb3V0ZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ3Jv
dXRlcjptYWluJyk7CisKKyAgICAgIC8vIEV2ZXJ5IDEwbXMsIHBvbGwgZm9yIHRoZSBhc3luYyB0
aGluZyB0byBoYXZlIGZpbmlzaGVkCisgICAgICB2YXIgd2F0Y2hlciA9IHNldEludGVydmFsKGZ1
bmN0aW9uICgpIHsKKyAgICAgICAgLy8gMS4gSWYgdGhlIHJvdXRlciBpcyBsb2FkaW5nLCBrZWVw
IHBvbGxpbmcKKyAgICAgICAgdmFyIHJvdXRlcklzTG9hZGluZyA9IHJvdXRlci5yb3V0ZXIgJiYg
ISFyb3V0ZXIucm91dGVyLmFjdGl2ZVRyYW5zaXRpb247CisgICAgICAgIGlmIChyb3V0ZXJJc0xv
YWRpbmcpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiBJ
ZiB0aGVyZSBhcmUgcGVuZGluZyBBamF4IHJlcXVlc3RzLCBrZWVwIHBvbGxpbmcKKyAgICAgICAg
aWYgKF9lbWJlclRlc3RpbmdUZXN0LmRlZmF1bHQucGVuZGluZ0FqYXhSZXF1ZXN0cykgeworICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDMuIElmIHRoZXJlIGFyZSBz
Y2hlZHVsZWQgdGltZXJzIG9yIHdlIGFyZSBpbnNpZGUgb2YgYSBydW4gbG9vcCwga2VlcCBwb2xs
aW5nCisgICAgICAgIGlmIChfZW1iZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuaGFzU2NoZWR1bGVk
VGltZXJzKCkgfHwgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LmN1cnJlbnRSdW5Mb29wKSB7
CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChfZW1iZXJUZXN0aW5n
VGVzdC5kZWZhdWx0LndhaXRlcnMgJiYgX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdC53YWl0ZXJz
LmFueShmdW5jdGlvbiAod2FpdGVyKSB7CisgICAgICAgICAgdmFyIGNvbnRleHQgPSB3YWl0ZXJb
MF07CisgICAgICAgICAgdmFyIGNhbGxiYWNrID0gd2FpdGVyWzFdOworICAgICAgICAgIHJldHVy
biAhY2FsbGJhY2suY2FsbChjb250ZXh0KTsKKyAgICAgICAgfSkpIHsKKyAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RvcCBwb2xsaW5nCisgICAgICAgIGNsZWFySW50
ZXJ2YWwod2F0Y2hlcik7CisKKyAgICAgICAgLy8gU3luY2hyb25vdXNseSByZXNvbHZlIHRoZSBw
cm9taXNlCisgICAgICAgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVsdChudWxsLCByZXNvbHZl
LCB2YWx1ZSk7CisgICAgICB9LCAxMCk7CisgICAgfSk7CisgIH0KKworICAvKioKKyAgICBMb2Fk
cyBhIHJvdXRlLCBzZXRzIHVwIGFueSBjb250cm9sbGVycywgYW5kIHJlbmRlcnMgYW55IHRlbXBs
YXRlcyBhc3NvY2lhdGVkCisgICAgd2l0aCB0aGUgcm91dGUgYXMgdGhvdWdoIGEgcmVhbCB1c2Vy
IGhhZCB0cmlnZ2VyZWQgdGhlIHJvdXRlIGNoYW5nZSB3aGlsZQorICAgIHVzaW5nIHlvdXIgYXBw
LgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmlzaXQoJ3Bv
c3RzL2luZGV4JykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgIC8vIGFzc2VydCBzb21ldGhpbmcK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCB2aXNpdAorICAgIEBwYXJhbSB7U3Ry
aW5nfSB1cmwgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNl
fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ3Zpc2l0JywgdmlzaXQpOworCisg
IC8qKgorICAgIENsaWNrcyBhbiBlbGVtZW50IGFuZCB0cmlnZ2VycyBhbnkgYWN0aW9ucyB0cmln
Z2VyZWQgYnkgdGhlIGVsZW1lbnQncyBgY2xpY2tgCisgICAgZXZlbnQuCisgIAorICAgIEV4YW1w
bGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBjbGljaygnLnNvbWUtalF1ZXJ5LXNlbGVj
dG9yJykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgIC8vIGFzc2VydCBzb21ldGhpbmcKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBjbGljaworICAgIEBwYXJhbSB7U3RyaW5nfSBz
ZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisg
ICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxw
ZXIoJ2NsaWNrJywgY2xpY2spOworCisgIC8qKgorICAgIFNpbXVsYXRlcyBhIGtleSBldmVudCwg
ZS5nLiBga2V5cHJlc3NgLCBga2V5ZG93bmAsIGBrZXl1cGAgd2l0aCB0aGUgZGVzaXJlZCBrZXlD
b2RlCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBrZXlFdmVu
dCgnLnNvbWUtalF1ZXJ5LXNlbGVjdG9yJywgJ2tleXByZXNzJywgMTMpLnRoZW4oZnVuY3Rpb24o
KSB7CisgICAgIC8vIGFzc2VydCBzb21ldGhpbmcKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAg
QG1ldGhvZCBrZXlFdmVudAorICAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2Vs
ZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisgICAgQHBhcmFtIHtTdHJpbmd9
IHR5cGUgdGhlIHR5cGUgb2Yga2V5IGV2ZW50LCBlLmcuIGBrZXlwcmVzc2AsIGBrZXlkb3duYCwg
YGtleXVwYAorICAgIEBwYXJhbSB7TnVtYmVyfSBrZXlDb2RlIHRoZSBrZXlDb2RlIG9mIHRoZSBz
aW11bGF0ZWQga2V5IGV2ZW50CisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBzaW5j
ZSAxLjUuMAorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ2tleUV2ZW50Jywga2V5
RXZlbnQpOworCisgIC8qKgorICAgIEZpbGxzIGluIGFuIGlucHV0IGVsZW1lbnQgd2l0aCBzb21l
IHRleHQuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBmaWxs
SW4oJyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20nKS50aGVuKGZ1bmN0aW9uKCkgeworICAgICAg
Ly8gYXNzZXJ0IHNvbWV0aGluZworICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZp
bGxJbgorICAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZmluZGlu
ZyBhbiBpbnB1dCBlbGVtZW50IG9uIHRoZSBET00KKyAgICB0byBmaWxsIHRleHQgd2l0aAorICAg
IEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRoZSBpbnB1dCBlbGVt
ZW50CisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5
bmNIZWxwZXIoJ2ZpbGxJbicsIGZpbGxJbik7CisKKyAgLyoqCisgICAgRmluZHMgYW4gZWxlbWVu
dCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXBwJ3MgY29udGFpbmVyIGVsZW1lbnQuIEEgc2ltcGxl
IGFsaWFzCisgICAgZm9yIGBhcHAuJChzZWxlY3RvcilgLgorICAKKyAgICBFeGFtcGxlOgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyICRlbCA9IGZpbmQoJy5teS1zZWxlY3RvcicpOwor
ICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbmQKKyAgICBAcGFyYW0ge1N0cmluZ30gc2VsZWN0
b3IgalF1ZXJ5IHN0cmluZyBzZWxlY3RvciBmb3IgZWxlbWVudCBsb29rdXAKKyAgICBAcmV0dXJu
IHtPYmplY3R9IGpRdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIHRoZSBx
dWVyeQorICAgIEBwdWJsaWMKKyAgKi8KKyAgaGVscGVyKCdmaW5kJywgZmluZCk7CisKKyAgLyoq
CisgICAgTGlrZSBgZmluZGAsIGJ1dCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgc2Vs
ZWN0b3IgcmV0dXJucyBubyByZXN1bHRzLgorICAKKyAgICBFeGFtcGxlOgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KCcuZG9lc250LWV4aXN0Jyk7
IC8vIHRocm93cyBlcnJvcgorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGZpbmRXaXRoQXNzZXJ0
CisgICAgQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxlY3RvciBzdHJpbmcgZm9y
IGZpbmRpbmcgYW4gZWxlbWVudCB3aXRoaW4KKyAgICB0aGUgRE9NCisgICAgQHJldHVybiB7T2Jq
ZWN0fSBqUXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkK
KyAgICBAdGhyb3dzIHtFcnJvcn0gdGhyb3dzIGVycm9yIGlmIGpRdWVyeSBvYmplY3QgcmV0dXJu
ZWQgaGFzIGEgbGVuZ3RoIG9mIDAKKyAgICBAcHVibGljCisgICovCisgIGhlbHBlcignZmluZFdp
dGhBc3NlcnQnLCBmaW5kV2l0aEFzc2VydCk7CisKKyAgLyoqCisgICAgQ2F1c2VzIHRoZSBydW4g
bG9vcCB0byBwcm9jZXNzIGFueSBwZW5kaW5nIGV2ZW50cy4gVGhpcyBpcyB1c2VkIHRvIGVuc3Vy
ZSB0aGF0CisgICAgYW55IGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBvdGhlciBoZWxwZXJzIChvciB5
b3VyIGFzc2VydGlvbnMpIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgIAorICAgIFRoaXMgaXMgbW9z
dCBvZnRlbiB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBoZWxwZXIgZnVuY3Rpb25z
IChzZWUgJ2NsaWNrJywKKyAgICAnZmlsbEluJywndmlzaXQnLGV0YykuCisgIAorICAgIEV4YW1w
bGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBFbWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNI
ZWxwZXIoJ2xvZ2luVXNlcicsIGZ1bmN0aW9uKGFwcCwgdXNlcm5hbWUsIHBhc3N3b3JkKSB7Cisg
ICAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUnKQorICAgICAgLmZpbGxJbignI3VzZXJuYW1l
JywgdXNlcm5hbWUpCisgICAgICAuZmlsbEluKCcjcGFzc3dvcmQnLCBwYXNzd29yZCkKKyAgICAg
IC5jbGljaygnLnN1Ym1pdCcpCisgIAorICAgICAgcmV0dXJuIGFwcC50ZXN0SGVscGVycy53YWl0
KCk7CisgICAgfSk7CisgIAorICAgIEBtZXRob2Qgd2FpdAorICAgIEBwYXJhbSB7T2JqZWN0fSB2
YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisgICAgQHJldHVybiB7UlNWUC5Qcm9taXNl
fQorICAgIEBwdWJsaWMKKyAgKi8KKyAgYXN5bmNIZWxwZXIoJ3dhaXQnLCB3YWl0KTsKKyAgYXN5
bmNIZWxwZXIoJ2FuZFRoZW4nLCBhbmRUaGVuKTsKKworICAvKioKKyAgICBSZXR1cm5zIHRoZSBj
dXJyZW50bHkgYWN0aXZlIHJvdXRlIG5hbWUuCisgIAorICBFeGFtcGxlOgorICAKKyAgYGBgamF2
YXNjcmlwdAorICBmdW5jdGlvbiB2YWxpZGF0ZVJvdXRlTmFtZSgpIHsKKyAgICBlcXVhbChjdXJy
ZW50Um91dGVOYW1lKCksICdzb21lLnBhdGgnLCAiY29ycmVjdCByb3V0ZSB3YXMgdHJhbnNpdGlv
bmVkIGludG8uIik7CisgIH0KKyAgCisgIHZpc2l0KCcvc29tZS9wYXRoJykudGhlbih2YWxpZGF0
ZVJvdXRlTmFtZSkKKyAgYGBgCisgIAorICBAbWV0aG9kIGN1cnJlbnRSb3V0ZU5hbWUKKyAgQHJl
dHVybiB7T2JqZWN0fSBUaGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0ZS4KKyAg
QHNpbmNlIDEuNS4wCisgIEBwdWJsaWMKKyAgKi8KKyAgaGVscGVyKCdjdXJyZW50Um91dGVOYW1l
JywgY3VycmVudFJvdXRlTmFtZSk7CisKKyAgLyoqCisgICAgUmV0dXJucyB0aGUgY3VycmVudCBw
YXRoLgorICAKKyAgRXhhbXBsZToKKyAgCisgIGBgYGphdmFzY3JpcHQKKyAgZnVuY3Rpb24gdmFs
aWRhdGVVUkwoKSB7CisgICAgZXF1YWwoY3VycmVudFBhdGgoKSwgJ3NvbWUucGF0aC5pbmRleCcs
ICJjb3JyZWN0IHBhdGggd2FzIHRyYW5zaXRpb25lZCBpbnRvLiIpOworICB9CisgIAorICBjbGlj
aygnI3NvbWUtbGluay1pZCcpLnRoZW4odmFsaWRhdGVVUkwpOworICBgYGAKKyAgCisgIEBtZXRo
b2QgY3VycmVudFBhdGgKKyAgQHJldHVybiB7T2JqZWN0fSBUaGUgY3VycmVudGx5IGFjdGl2ZSBw
YXRoLgorICBAc2luY2UgMS41LjAKKyAgQHB1YmxpYworICAqLworICBoZWxwZXIoJ2N1cnJlbnRQ
YXRoJywgY3VycmVudFBhdGgpOworCisgIC8qKgorICAgIFJldHVybnMgdGhlIGN1cnJlbnQgVVJM
LgorICAKKyAgRXhhbXBsZToKKyAgCisgIGBgYGphdmFzY3JpcHQKKyAgZnVuY3Rpb24gdmFsaWRh
dGVVUkwoKSB7CisgICAgZXF1YWwoY3VycmVudFVSTCgpLCAnL3NvbWUvcGF0aCcsICJjb3JyZWN0
IFVSTCB3YXMgdHJhbnNpdGlvbmVkIGludG8uIik7CisgIH0KKyAgCisgIGNsaWNrKCcjc29tZS1s
aW5rLWlkJykudGhlbih2YWxpZGF0ZVVSTCk7CisgIGBgYAorICAKKyAgQG1ldGhvZCBjdXJyZW50
VVJMCisgIEByZXR1cm4ge09iamVjdH0gVGhlIGN1cnJlbnRseSBhY3RpdmUgVVJMLgorICBAc2lu
Y2UgMS41LjAKKyAgQHB1YmxpYworICAqLworICBoZWxwZXIoJ2N1cnJlbnRVUkwnLCBjdXJyZW50
VVJMKTsKKworICAvKioKKyAgIFBhdXNlcyB0aGUgY3VycmVudCB0ZXN0IC0gdGhpcyBpcyB1c2Vm
dWwgZm9yIGRlYnVnZ2luZyB3aGlsZSB0ZXN0aW5nIG9yIGZvciB0ZXN0LWRyaXZpbmcuCisgICBJ
dCBhbGxvd3MgeW91IHRvIGluc3BlY3QgdGhlIHN0YXRlIG9mIHlvdXIgYXBwbGljYXRpb24gYXQg
YW55IHBvaW50LgorICAKKyAgIEV4YW1wbGUgKFRoZSB0ZXN0IHdpbGwgcGF1c2UgYmVmb3JlIGNs
aWNraW5nIHRoZSBidXR0b24pOgorICAKKyAgIGBgYGphdmFzY3JpcHQKKyAgIHZpc2l0KCcvJykK
KyAgIHJldHVybiBwYXVzZVRlc3QoKTsKKyAgCisgICBjbGljaygnLmJ0bicpOworICAgYGBgCisg
IAorICAgQHNpbmNlIDEuOS4wCisgICBAbWV0aG9kIHBhdXNlVGVzdAorICAgQHJldHVybiB7T2Jq
ZWN0fSBBIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIHJlc29sdmUKKyAgIEBwdWJsaWMKKyAgKi8K
KyAgaGVscGVyKCdwYXVzZVRlc3QnLCBwYXVzZVRlc3QpOworCisgIC8qKgorICAgIFRyaWdnZXJz
IHRoZSBnaXZlbiBET00gZXZlbnQgb24gdGhlIGVsZW1lbnQgaWRlbnRpZmllZCBieSB0aGUgcHJv
dmlkZWQgc2VsZWN0b3IuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICB0cmlnZ2VyRXZlbnQoJyNzb21lLWVsZW0taWQnLCAnYmx1cicpOworICAgIGBgYAorICAK
KyAgICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgYGtleUV2ZW50YCBo
ZWxwZXIgbGlrZSBzbzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHRyaWdnZXJFdmVudCgn
I3NvbWUtZWxlbS1pZCcsICdrZXlwcmVzcycsIHsga2V5Q29kZTogMTMgfSk7CisgICAgYGBgCisg
IAorICAgQG1ldGhvZCB0cmlnZ2VyRXZlbnQKKyAgIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBq
UXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCisgICBAcGFyYW0g
e1N0cmluZ30gW2NvbnRleHRdIGpRdWVyeSBzZWxlY3RvciB0aGF0IHdpbGwgbGltaXQgdGhlIHNl
bGVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIGZpbmQgb25s
eSB3aXRoaW4gdGhlIGNvbnRleHQncyBjaGlsZHJlbgorICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUg
VGhlIGV2ZW50IHR5cGUgdG8gYmUgdHJpZ2dlcmVkLgorICAgQHBhcmFtIHtPYmplY3R9IFtvcHRp
b25zXSBUaGUgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8galF1ZXJ5LkV2ZW50LgorICAgQHJldHVy
biB7UlNWUC5Qcm9taXNlfQorICAgQHNpbmNlIDEuNS4wCisgICBAcHVibGljCisgICovCisgIGFz
eW5jSGVscGVyKCd0cmlnZ2VyRXZlbnQnLCB0cmlnZ2VyRXZlbnQpOworfSk7CisKKy8vIEZpcmVm
b3ggZG9lcyBub3QgdHJpZ2dlciB0aGUgYGZvY3VzaW5gIGV2ZW50IGlmIHRoZSB3aW5kb3cKKy8v
IGRvZXMgbm90IGhhdmUgZm9jdXMuIElmIHRoZSBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZm9jdXMg
anVzdAorLy8gdXNlIHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgorZW5pZmVkKCdlbWJlci10
ZXN0aW5nL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItdGVz
dGluZy9pbml0aWFsaXplcnMnLCAnZW1iZXItdGVzdGluZy9zdXBwb3J0JywgJ2VtYmVyLXRlc3Rp
bmcvc2V0dXBfZm9yX3Rlc3RpbmcnLCAnZW1iZXItdGVzdGluZy90ZXN0JywgJ2VtYmVyLXRlc3Rp
bmcvYWRhcHRlcnMvYWRhcHRlcicsICdlbWJlci10ZXN0aW5nL2FkYXB0ZXJzL3F1bml0JywgJ2Vt
YmVyLXRlc3RpbmcvaGVscGVycyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb3Jl
LCBfZW1iZXJUZXN0aW5nSW5pdGlhbGl6ZXJzLCBfZW1iZXJUZXN0aW5nU3VwcG9ydCwgX2VtYmVy
VGVzdGluZ1NldHVwX2Zvcl90ZXN0aW5nLCBfZW1iZXJUZXN0aW5nVGVzdCwgX2VtYmVyVGVzdGlu
Z0FkYXB0ZXJzQWRhcHRlciwgX2VtYmVyVGVzdGluZ0FkYXB0ZXJzUXVuaXQsIF9lbWJlclRlc3Rp
bmdIZWxwZXJzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBhZGRzIGhlbHBlcnMgdG8gaGVs
cGVycyBvYmplY3QgaW4gVGVzdAorCisgIC8qKgorICAgIEBtb2R1bGUgZW1iZXIKKyAgICBAc3Vi
bW9kdWxlIGVtYmVyLXRlc3RpbmcKKyAgKi8KKworICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5U
ZXN0ID0gX2VtYmVyVGVzdGluZ1Rlc3QuZGVmYXVsdDsKKyAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1
bHQuVGVzdC5BZGFwdGVyID0gX2VtYmVyVGVzdGluZ0FkYXB0ZXJzQWRhcHRlci5kZWZhdWx0Owor
ICBfZW1iZXJNZXRhbENvcmUuZGVmYXVsdC5UZXN0LlFVbml0QWRhcHRlciA9IF9lbWJlclRlc3Rp
bmdBZGFwdGVyc1F1bml0LmRlZmF1bHQ7CisgIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LnNldHVw
Rm9yVGVzdGluZyA9IF9lbWJlclRlc3RpbmdTZXR1cF9mb3JfdGVzdGluZy5kZWZhdWx0OworfSk7
CisvLyB0byBzZXR1cCBpbml0aWFsaXplcgorLy8gdG8gaGFuZGxlIHZhcmlvdXMgZWRnZSBjYXNl
cworZW5pZmVkKCdlbWJlci10ZXN0aW5nL2luaXRpYWxpemVycycsIFsnZXhwb3J0cycsICdlbWJl
ci1ydW50aW1lL3N5c3RlbS9sYXp5X2xvYWQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclJ1
bnRpbWVTeXN0ZW1MYXp5X2xvYWQpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBuYW1lID0g
J2RlZmVyUmVhZGluZXNzIGluIGB0ZXN0aW5nYCBtb2RlJzsKKworICBfZW1iZXJSdW50aW1lU3lz
dGVtTGF6eV9sb2FkLm9uTG9hZCgnRW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbiAoQXBwbGlj
YXRpb24pIHsKKyAgICBpZiAoIUFwcGxpY2F0aW9uLmluaXRpYWxpemVyc1tuYW1lXSkgeworICAg
ICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoeworICAgICAgICBuYW1lOiBuYW1lLAorCisgICAg
ICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChhcHBsaWNhdGlvbikgeworICAgICAgICAgIGlmIChh
cHBsaWNhdGlvbi50ZXN0aW5nKSB7CisgICAgICAgICAgICBhcHBsaWNhdGlvbi5kZWZlclJlYWRp
bmVzcygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9KTsK
K30pOworZW5pZmVkKCdlbWJlci10ZXN0aW5nL3NldHVwX2Zvcl90ZXN0aW5nJywgWydleHBvcnRz
JywgJ2VtYmVyLW1ldGFsL2NvcmUnLCAnZW1iZXItdGVzdGluZy9hZGFwdGVycy9xdW5pdCcsICdl
bWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRh
bENvcmUsIF9lbWJlclRlc3RpbmdBZGFwdGVyc1F1bml0LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVy
eSkgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gc2V0dXBGb3JUZXN0
aW5nOworCisgIHZhciBUZXN0LCByZXF1ZXN0czsKKworICBmdW5jdGlvbiBpbmNyZW1lbnRBamF4
UGVuZGluZ1JlcXVlc3RzKF8sIHhocikgeworICAgIHJlcXVlc3RzLnB1c2goeGhyKTsKKyAgICBU
ZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSByZXF1ZXN0cy5sZW5ndGg7CisgIH0KKworICBmdW5j
dGlvbiBkZWNyZW1lbnRBamF4UGVuZGluZ1JlcXVlc3RzKF8sIHhocikgeworICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmICh4aHIgPT09IHJl
cXVlc3RzW2ldKSB7CisgICAgICAgIHJlcXVlc3RzLnNwbGljZShpLCAxKTsKKyAgICAgIH0KKyAg
ICB9CisgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzID0gcmVxdWVzdHMubGVuZ3RoOworICB9
CisKKyAgLyoqCisgICAgU2V0cyBFbWJlciB1cCBmb3IgdGVzdGluZy4gVGhpcyBpcyB1c2VmdWwg
dG8gcGVyZm9ybQorICAgIGJhc2ljIHNldHVwIHN0ZXBzIGluIG9yZGVyIHRvIHVuaXQgdGVzdC4K
KyAgCisgICAgVXNlIGBBcHAuc2V0dXBGb3JUZXN0aW5nYCB0byBwZXJmb3JtIGludGVncmF0aW9u
IHRlc3RzIChmdWxsCisgICAgYXBwbGljYXRpb24gdGVzdGluZykuCisgIAorICAgIEBtZXRob2Qg
c2V0dXBGb3JUZXN0aW5nCisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBzaW5jZSAxLjUuMAor
ICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gc2V0dXBGb3JUZXN0aW5nKCkgeworICAg
IGlmICghVGVzdCkgeworICAgICAgVGVzdCA9IHJlcXVpcmVNb2R1bGUoJ2VtYmVyLXRlc3Rpbmcv
dGVzdCcpWydkZWZhdWx0J107CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxDb3JlLmRlZmF1bHQu
dGVzdGluZyA9IHRydWU7CisKKyAgICAvLyBpZiBhZGFwdGVyIGlzIG5vdCBtYW51YWxseSBzZXQg
ZGVmYXVsdCB0byBRVW5pdAorICAgIGlmICghVGVzdC5hZGFwdGVyKSB7CisgICAgICBUZXN0LmFk
YXB0ZXIgPSBfZW1iZXJUZXN0aW5nQWRhcHRlcnNRdW5pdC5kZWZhdWx0LmNyZWF0ZSgpOworICAg
IH0KKworICAgIHJlcXVlc3RzID0gW107CisgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzID0g
cmVxdWVzdHMubGVuZ3RoOworCisgICAgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChk
b2N1bWVudCkub2ZmKCdhamF4U2VuZCcsIGluY3JlbWVudEFqYXhQZW5kaW5nUmVxdWVzdHMpOwor
ICAgIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoZG9jdW1lbnQpLm9mZignYWpheENv
bXBsZXRlJywgZGVjcmVtZW50QWpheFBlbmRpbmdSZXF1ZXN0cyk7CisgICAgX2VtYmVyVmlld3NT
eXN0ZW1KcXVlcnkuZGVmYXVsdChkb2N1bWVudCkub24oJ2FqYXhTZW5kJywgaW5jcmVtZW50QWph
eFBlbmRpbmdSZXF1ZXN0cyk7CisgICAgX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChk
b2N1bWVudCkub24oJ2FqYXhDb21wbGV0ZScsIGRlY3JlbWVudEFqYXhQZW5kaW5nUmVxdWVzdHMp
OworICB9Cit9KTsKKworLy8gaW1wb3J0IFRlc3QgZnJvbSAiZW1iZXItdGVzdGluZy90ZXN0Ijsg
IC8vIEVTNlRPRE86IGZpeCB3aGVuIGN5Y2xlcyBhcmUgc3VwcG9ydGVkCitlbmlmZWQoJ2VtYmVy
LXRlc3Rpbmcvc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJl
ci12aWV3cy9zeXN0ZW0vanF1ZXJ5JywgJ2VtYmVyLW1ldGFsL2Vudmlyb25tZW50J10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwg
X2VtYmVyTWV0YWxFbnZpcm9ubWVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAg
QG1vZHVsZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworICAqLworCisgIHZh
ciAkID0gX2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdDsKKworICAvKioKKyAgICBUaGlz
IG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3ggYW5kIHRyaWdnZXJzIHRoZSBjbGljayBldmVudCB0
byBmaXJlIHRoZQorICAgIHBhc3NlZCBpbiBoYW5kbGVyLiBJdCBpcyB1c2VkIHRvIGNvcnJlY3Qg
Zm9yIGEgYnVnIGluIG9sZGVyIHZlcnNpb25zCisgICAgb2YgalF1ZXJ5IChlLmcgMS44LjMpLgor
ICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgdGVzdENoZWNrYm94Q2xpY2sKKyAgKi8KKyAg
ZnVuY3Rpb24gdGVzdENoZWNrYm94Q2xpY2soaGFuZGxlcikgeworICAgICQoJzxpbnB1dCB0eXBl
PSJjaGVja2JveCI+JykuY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6ICctMTAwMHB4
JywgdG9wOiAnLTEwMDBweCcgfSkuYXBwZW5kVG8oJ2JvZHknKS5vbignY2xpY2snLCBoYW5kbGVy
KS50cmlnZ2VyKCdjbGljaycpLnJlbW92ZSgpOworICB9CisKKyAgaWYgKF9lbWJlck1ldGFsRW52
aXJvbm1lbnQuZGVmYXVsdC5oYXNET00pIHsKKyAgICAkKGZ1bmN0aW9uICgpIHsKKyAgICAgIC8q
CisgICAgICAgIERldGVybWluZSB3aGV0aGVyIGEgY2hlY2tib3ggY2hlY2tlZCB1c2luZyBqUXVl
cnkncyAiY2xpY2siIG1ldGhvZCB3aWxsIGhhdmUKKyAgICAgICAgdGhlIGNvcnJlY3QgdmFsdWUg
Zm9yIGl0cyBjaGVja2VkIHByb3BlcnR5LgorICAgICAgICAgSWYgd2UgZGV0ZXJtaW5lIHRoYXQg
dGhlIGN1cnJlbnQgalF1ZXJ5IHZlcnNpb24gZXhoaWJpdHMgdGhpcyBiZWhhdmlvciwKKyAgICAg
ICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkgYXMgaW4gdGhlIGNvbW1pdCBmb3IgdGhlIGFj
dHVhbCBmaXg6CisgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1p
dC8xZmIyZjkyLgorICAgICAgKi8KKyAgICAgIHRlc3RDaGVja2JveENsaWNrKGZ1bmN0aW9uICgp
IHsKKyAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQgJiYgISQuZXZlbnQuc3BlY2lhbC5jbGljaykg
eworICAgICAgICAgICQuZXZlbnQuc3BlY2lhbC5jbGljayA9IHsKKyAgICAgICAgICAgIC8vIEZv
ciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJp
Z2h0CisgICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIGlm
ICgkLm5vZGVOYW1lKHRoaXMsICdpbnB1dCcpICYmIHRoaXMudHlwZSA9PT0gJ2NoZWNrYm94JyAm
JiB0aGlzLmNsaWNrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGljaygpOworICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgIH07CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICAvLyBUcnkgYWdhaW4gdG8g
dmVyaWZ5IHRoYXQgdGhlIHBhdGNoIHRvb2sgZWZmZWN0IG9yIGJsb3cgdXAuCisgICAgICB0ZXN0
Q2hlY2tib3hDbGljayhmdW5jdGlvbiAoKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcud2Fy
bignY2xpY2tlZCBjaGVja2JveGVzIHNob3VsZCBiZSBjaGVja2VkISB0aGUgalF1ZXJ5IHBhdGNo
IGRpZG5cJ3Qgd29yaycsIHRoaXMuY2hlY2tlZCwgeyBpZDogJ2VtYmVyLXRlc3RpbmcudGVzdC1j
aGVja2JveC1jbGljaycgfSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgfQorfSk7CitlbmlmZWQo
J2VtYmVyLXRlc3RpbmcvdGVzdCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9ydW5fbG9vcCcs
ICdlbWJlci1ydW50aW1lL2V4dC9yc3ZwJywgJ2VtYmVyLXRlc3Rpbmcvc2V0dXBfZm9yX3Rlc3Rp
bmcnLCAnZW1iZXItYXBwbGljYXRpb24vc3lzdGVtL2FwcGxpY2F0aW9uJywgJ2VtYmVyLXJ1bnRp
bWUvc3lzdGVtL25hdGl2ZV9hcnJheSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxS
dW5fbG9vcCwgX2VtYmVyUnVudGltZUV4dFJzdnAsIF9lbWJlclRlc3RpbmdTZXR1cF9mb3JfdGVz
dGluZywgX2VtYmVyQXBwbGljYXRpb25TeXN0ZW1BcHBsaWNhdGlvbiwgX2VtYmVyUnVudGltZVN5
c3RlbU5hdGl2ZV9hcnJheSkgeworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICAgQG1vZHVs
ZSBlbWJlcgorICAgIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZworICAqLworICB2YXIgaGVscGVy
cyA9IHt9OworICB2YXIgaW5qZWN0SGVscGVyc0NhbGxiYWNrcyA9IFtdOworCisgIC8qKgorICAg
IFRoaXMgaXMgYSBjb250YWluZXIgZm9yIGFuIGFzc29ydG1lbnQgb2YgdGVzdGluZyByZWxhdGVk
IGZ1bmN0aW9uYWxpdHk6CisgIAorICAgICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0ZXN0IGFkYXB0
ZXIgKGZvciB5b3VyIGZyYW1ld29yayBvZiBjaG9pY2UpLgorICAgICogUmVnaXN0ZXIvVW5yZWdp
c3RlciBhZGRpdGlvbmFsIHRlc3QgaGVscGVycy4KKyAgICAqIFNldHVwIGNhbGxiYWNrcyB0byBi
ZSBmaXJlZCB3aGVuIHRoZSB0ZXN0IGhlbHBlcnMgYXJlIGluamVjdGVkIGludG8KKyAgICAgIHlv
dXIgYXBwbGljYXRpb24uCisgIAorICAgIEBjbGFzcyBUZXN0CisgICAgQG5hbWVzcGFjZSBFbWJl
cgorICAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIFRlc3QgPSB7CisgICAgLyoqCisgICAgICBIYXNo
IGNvbnRhaW5pbmcgYWxsIGtub3duIHRlc3QgaGVscGVycy4KKyAgICAgICBAcHJvcGVydHkgX2hl
bHBlcnMKKyAgICAgIEBwcml2YXRlCisgICAgICBAc2luY2UgMS43LjAKKyAgICAqLworICAgIF9o
ZWxwZXJzOiBoZWxwZXJzLAorCisgICAgLyoqCisgICAgICBgcmVnaXN0ZXJIZWxwZXJgIGlzIHVz
ZWQgdG8gcmVnaXN0ZXIgYSB0ZXN0IGhlbHBlciB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICAg
IHdoZW4gYEFwcC5pbmplY3RUZXN0SGVscGVyc2AgaXMgY2FsbGVkLgorICAgICAgIFRoZSBoZWxw
ZXIgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IEFwcGxpY2F0
aW9uIGFzCisgICAgICB0aGUgZmlyc3QgcGFyYW1ldGVyLgorICAgICAgIEZvciBleGFtcGxlOgor
ICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJIZWxwZXIoJ2Jv
b3QnLCBmdW5jdGlvbihhcHApIHsKKyAgICAgICAgRW1iZXIucnVuKGFwcCwgYXBwLmFkdmFuY2VS
ZWFkaW5lc3MpOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlzIGhlbHBlciBjYW4g
bGF0ZXIgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIGJlY2F1c2UgaXQgd2lsbCBiZQorICAg
ICAgY2FsbGVkIHdpdGggYGFwcGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4KKyAgICAgICBgYGBq
YXZhc2NyaXB0CisgICAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKKyAgICAg
IEFwcC5pbmplY3RUZXN0SGVscGVycygpOworICAgICAgYm9vdCgpOworICAgICAgYGBgCisgICAg
ICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZWdpc3RlckhlbHBlcgorICAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhlbHBlciBtZXRob2QgdG8gYWRkLgorICAgICAg
QHBhcmFtIHtGdW5jdGlvbn0gaGVscGVyTWV0aG9kCisgICAgICBAcGFyYW0gb3B0aW9ucyB7T2Jq
ZWN0fQorICAgICovCisgICAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIChuYW1lLCBoZWxwZXJN
ZXRob2QpIHsKKyAgICAgIGhlbHBlcnNbbmFtZV0gPSB7CisgICAgICAgIG1ldGhvZDogaGVscGVy
TWV0aG9kLAorICAgICAgICBtZXRhOiB7IHdhaXQ6IGZhbHNlIH0KKyAgICAgIH07CisgICAgfSwK
KworICAgIC8qKgorICAgICAgYHJlZ2lzdGVyQXN5bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0
ZXIgYW4gYXN5bmMgdGVzdCBoZWxwZXIgdGhhdCB3aWxsIGJlIGluamVjdGVkCisgICAgICB3aGVu
IGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KKyAgICAgICBUaGUgaGVscGVyIG1l
dGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBh
cworICAgICAgdGhlIGZpcnN0IHBhcmFtZXRlci4KKyAgICAgICBGb3IgZXhhbXBsZToKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICBFbWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNIZWxwZXIoJ2Jv
b3QnLCBmdW5jdGlvbihhcHApIHsKKyAgICAgICAgRW1iZXIucnVuKGFwcCwgYXBwLmFkdmFuY2VS
ZWFkaW5lc3MpOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGUgYWR2YW50YWdlIG9m
IGFuIGFzeW5jIGhlbHBlciBpcyB0aGF0IGl0IHdpbGwgbm90IHJ1bgorICAgICAgdW50aWwgdGhl
IGxhc3QgYXN5bmMgaGVscGVyIGhhcyBjb21wbGV0ZWQuICBBbGwgYXN5bmMgaGVscGVycworICAg
ICAgYWZ0ZXIgaXQgd2lsbCB3YWl0IGZvciBpdCBjb21wbGV0ZSBiZWZvcmUgcnVubmluZy4KKyAg
ICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgRW1iZXIuVGVz
dC5yZWdpc3RlckFzeW5jSGVscGVyKCdkZWxldGVQb3N0JywgZnVuY3Rpb24oYXBwLCBwb3N0SWQp
IHsKKyAgICAgICAgY2xpY2soJy5kZWxldGUtJyArIHBvc3RJZCk7CisgICAgICB9KTsKKyAgICAg
ICAvLyAuLi4gaW4geW91ciB0ZXN0CisgICAgICB2aXNpdCgnL3Bvc3QvMicpOworICAgICAgZGVs
ZXRlUG9zdCgyKTsKKyAgICAgIHZpc2l0KCcvcG9zdC8zJyk7CisgICAgICBkZWxldGVQb3N0KDMp
OworICAgICAgYGBgCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZWdpc3RlckFzeW5j
SGVscGVyCisgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVy
IG1ldGhvZCB0byBhZGQuCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKKyAg
ICAgIEBzaW5jZSAxLjIuMAorICAgICovCisgICAgcmVnaXN0ZXJBc3luY0hlbHBlcjogZnVuY3Rp
b24gKG5hbWUsIGhlbHBlck1ldGhvZCkgeworICAgICAgaGVscGVyc1tuYW1lXSA9IHsKKyAgICAg
ICAgbWV0aG9kOiBoZWxwZXJNZXRob2QsCisgICAgICAgIG1ldGE6IHsgd2FpdDogdHJ1ZSB9Cisg
ICAgICB9OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRk
ZWQgaGVscGVyIG1ldGhvZC4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYGphdmFzY3JpcHQK
KyAgICAgIEVtYmVyLlRlc3QudW5yZWdpc3RlckhlbHBlcignd2FpdCcpOworICAgICAgYGBgCisg
ICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCB1bnJlZ2lzdGVySGVscGVyCisgICAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgaGVscGVyIHRvIHJlbW92ZS4KKyAgICAqLworICAgIHVucmVn
aXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICBkZWxldGUgaGVscGVyc1tuYW1l
XTsKKyAgICAgIGRlbGV0ZSBUZXN0LlByb21pc2UucHJvdG90eXBlW25hbWVdOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFVzZWQgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdo
ZW5ldmVyIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgCisgICAgICBpcyBjYWxsZWQuCisgICAgICAg
VGhlIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBhcyBhbiBh
cmd1bWVudC4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIEVt
YmVyLlRlc3Qub25JbmplY3RIZWxwZXJzKGZ1bmN0aW9uKCkgeworICAgICAgICBFbWJlci4kKGRv
Y3VtZW50KS5hamF4U2VuZChmdW5jdGlvbigpIHsKKyAgICAgICAgICBUZXN0LnBlbmRpbmdBamF4
UmVxdWVzdHMrKzsKKyAgICAgICAgfSk7CisgICAgICAgICBFbWJlci4kKGRvY3VtZW50KS5hamF4
Q29tcGxldGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3Rz
LS07CisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAcHVibGljCisg
ICAgICBAbWV0aG9kIG9uSW5qZWN0SGVscGVycworICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs
bGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAgICAqLworICAgIG9uSW5qZWN0SGVs
cGVyczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tz
LnB1c2goY2FsbGJhY2spOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRoaXMgcmV0dXJucyBh
IHRoZW5hYmxlIHRhaWxvcmVkIGZvciB0ZXN0aW5nLiAgSXQgY2F0Y2hlcyBmYWlsZWQKKyAgICAg
IGBvblN1Y2Nlc3NgIGNhbGxiYWNrcyBhbmQgaW52b2tlcyB0aGUgYEVtYmVyLlRlc3QuYWRhcHRl
ci5leGNlcHRpb25gCisgICAgICBjYWxsYmFjayBpbiB0aGUgbGFzdCBjaGFpbmVkIHRoZW4uCisg
ICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3Vj
aCBhcyBgd2FpdGAuCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCBwcm9taXNlCisgICAg
ICBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlciBUaGUgZnVuY3Rpb24gdXNlZCB0byByZXNvbHZl
IHRoZSBwcm9taXNlLgorICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEFuIG9wdGlvbmFsIHN0
cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHByb21pc2UuCisgICAgKi8KKyAgICBwcm9taXNlOiBm
dW5jdGlvbiAocmVzb2x2ZXIsIGxhYmVsKSB7CisgICAgICB2YXIgZnVsbExhYmVsID0gJ0VtYmVy
LlRlc3QucHJvbWlzZTogJyArIChsYWJlbCB8fCAnPFVua25vd24gUHJvbWlzZT4nKTsKKyAgICAg
IHJldHVybiBuZXcgVGVzdC5Qcm9taXNlKHJlc29sdmVyLCBmdWxsTGFiZWwpOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgVXNlZCB0byBhbGxvdyBlbWJlci10ZXN0aW5nIHRvIGNvbW11bmljYXRl
IHdpdGggYSBzcGVjaWZpYyB0ZXN0aW5nCisgICAgIGZyYW1ld29yay4KKyAgICAgIFlvdSBjYW4g
bWFudWFsbHkgc2V0IGl0IGJlZm9yZSBjYWxsaW5nIGBBcHAuc2V0dXBGb3JUZXN0aW5nKClgLgor
ICAgICAgRXhhbXBsZToKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgRW1iZXIuVGVzdC5hZGFw
dGVyID0gTXlDdXN0b21BZGFwdGVyLmNyZWF0ZSgpCisgICAgIGBgYAorICAgICAgSWYgeW91IGRv
IG5vdCBzZXQgaXQsIGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRvIGBFbWJlci5UZXN0LlFV
bml0QWRhcHRlcmAuCisgICAgICBAcHVibGljCisgICAgIEBwcm9wZXJ0eSBhZGFwdGVyCisgICAg
IEB0eXBlIHtDbGFzc30gVGhlIGFkYXB0ZXIgdG8gYmUgdXNlZC4KKyAgICAgQGRlZmF1bHQgRW1i
ZXIuVGVzdC5RVW5pdEFkYXB0ZXIKKyAgICAqLworICAgIGFkYXB0ZXI6IG51bGwsCisKKyAgICAv
KioKKyAgICAgIFJlcGxhY2VtZW50IGZvciBgRW1iZXIuUlNWUC5yZXNvbHZlYAorICAgICAgVGhl
IG9ubHkgZGlmZmVyZW5jZSBpcyB0aGlzIHVzZXMKKyAgICAgIGFuIGluc3RhbmNlIG9mIGBFbWJl
ci5UZXN0LlByb21pc2VgCisgICAgICAgQHB1YmxpYworICAgICAgQG1ldGhvZCByZXNvbHZlCisg
ICAgICBAcGFyYW0ge01peGVkfSBUaGUgdmFsdWUgdG8gcmVzb2x2ZQorICAgICAgQHNpbmNlIDEu
Mi4wCisgICAgKi8KKyAgICByZXNvbHZlOiBmdW5jdGlvbiAodmFsKSB7CisgICAgICByZXR1cm4g
VGVzdC5wcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZl
KHZhbCk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgVGhpcyBhbGxvd3Mg
ZW1iZXItdGVzdGluZyB0byBwbGF5IG5pY2VseSB3aXRoIG90aGVyIGFzeW5jaHJvbm91cworICAg
ICAgIGV2ZW50cywgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIHdhaXRpbmcgZm9yIGEg
Q1NTMworICAgICAgIHRyYW5zaXRpb24gb3IgYW4gSW5kZXhEQiB0cmFuc2FjdGlvbi4KKyAgICAg
ICAgRm9yIGV4YW1wbGU6CisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICBFbWJlci5UZXN0
LnJlZ2lzdGVyV2FpdGVyKGZ1bmN0aW9uKCkgeworICAgICAgICAgcmV0dXJuIG15UGVuZGluZ1Ry
YW5zYWN0aW9ucygpID09IDA7CisgICAgICAgfSk7CisgICAgICAgYGBgCisgICAgICAgVGhlIGBj
b250ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYHRo
aXNgCisgICAgICAgd2l0aCB3aGljaCB5b3VyIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZC4KKyAg
ICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICBFbWJlci5U
ZXN0LnJlZ2lzdGVyV2FpdGVyKE15REIsIE15REIuaGFzUGVuZGluZ1RyYW5zYWN0aW9ucyk7Cisg
ICAgICAgYGBgCisgICAgICAgIEBwdWJsaWMKKyAgICAgICBAbWV0aG9kIHJlZ2lzdGVyV2FpdGVy
CisgICAgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgKG9wdGlvbmFsKQorICAgICAgIEBwYXJh
bSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICAgQHNpbmNlIDEuMi4wCisgICAgKi8KKyAgICBy
ZWdpc3RlcldhaXRlcjogZnVuY3Rpb24gKGNvbnRleHQsIGNhbGxiYWNrKSB7CisgICAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICBjYWxsYmFjayA9IGNvbnRleHQ7Cisg
ICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgfQorICAgICAgaWYgKCF0aGlzLndhaXRlcnMp
IHsKKyAgICAgICAgdGhpcy53YWl0ZXJzID0gX2VtYmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJh
eS5BKCk7CisgICAgICB9CisgICAgICB0aGlzLndhaXRlcnMucHVzaChbY29udGV4dCwgY2FsbGJh
Y2tdKTsKKyAgICB9LAorICAgIC8qKgorICAgICAgIGB1bnJlZ2lzdGVyV2FpdGVyYCBpcyB1c2Vk
IHRvIHVucmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdhcworICAgICAgIHJlZ2lzdGVyZWQgd2l0
aCBgcmVnaXN0ZXJXYWl0ZXJgLgorICAgICAgICBAcHVibGljCisgICAgICAgQG1ldGhvZCB1bnJl
Z2lzdGVyV2FpdGVyCisgICAgICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgKG9wdGlvbmFsKQor
ICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCisgICAgICAgQHNpbmNlIDEuMi4wCisg
ICAgKi8KKyAgICB1bnJlZ2lzdGVyV2FpdGVyOiBmdW5jdGlvbiAoY29udGV4dCwgY2FsbGJhY2sp
IHsKKyAgICAgIGlmICghdGhpcy53YWl0ZXJzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICAgIGNhbGxiYWNrID0g
Y29udGV4dDsKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgICB9CisgICAgICB0aGlzLndh
aXRlcnMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LkEodGhpcy53YWl0ZXJzLmZp
bHRlcihmdW5jdGlvbiAoZWx0KSB7CisgICAgICAgIHJldHVybiAhKGVsdFswXSA9PT0gY29udGV4
dCAmJiBlbHRbMV0gPT09IGNhbGxiYWNrKTsKKyAgICAgIH0pKTsKKyAgICB9CisgIH07CisKKyAg
ZnVuY3Rpb24gaGVscGVyKGFwcCwgbmFtZSkgeworICAgIHZhciBmbiA9IGhlbHBlcnNbbmFtZV0u
bWV0aG9kOworICAgIHZhciBtZXRhID0gaGVscGVyc1tuYW1lXS5tZXRhOworCisgICAgcmV0dXJu
IGZ1bmN0aW9uICgpIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBh
cmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CisgICAg
ICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CisgICAgICB9CisKKyAgICAgIHZhciBs
YXN0UHJvbWlzZTsKKworICAgICAgYXJncy51bnNoaWZ0KGFwcCk7CisKKyAgICAgIC8vIHNvbWUg
aGVscGVycyBhcmUgbm90IGFzeW5jIGFuZAorICAgICAgLy8gbmVlZCB0byByZXR1cm4gYSB2YWx1
ZSBpbW1lZGlhdGVseS4KKyAgICAgIC8vIGV4YW1wbGU6IGBmaW5kYAorICAgICAgaWYgKCFtZXRh
LndhaXQpIHsKKyAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGFwcCwgYXJncyk7CisgICAgICB9CisK
KyAgICAgIGxhc3RQcm9taXNlID0gcnVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIFRl
c3QucmVzb2x2ZShUZXN0Lmxhc3RQcm9taXNlKTsKKyAgICAgIH0pOworCisgICAgICAvLyB3YWl0
IGZvciBsYXN0IGhlbHBlcidzIHByb21pc2UgdG8gcmVzb2x2ZSBhbmQgdGhlbgorICAgICAgLy8g
ZXhlY3V0ZS4gVG8gYmUgc2FmZSwgd2UgbmVlZCB0byB0ZWxsIHRoZSBhZGFwdGVyIHdlJ3JlIGdv
aW5nCisgICAgICAvLyBhc3luY2hyb25vdXMgaGVyZSwgYmVjYXVzZSBmbiBtYXkgbm90IGJlIGlu
dm9rZWQgYmVmb3JlIHdlCisgICAgICAvLyByZXR1cm4uCisgICAgICBUZXN0LmFkYXB0ZXIuYXN5
bmNTdGFydCgpOworICAgICAgcmV0dXJuIGxhc3RQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgewor
ICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwLCBhcmdzKTsKKyAgICAgIH0pLmZpbmFsbHkoZnVu
Y3Rpb24gKCkgeworICAgICAgICBUZXN0LmFkYXB0ZXIuYXN5bmNFbmQoKTsKKyAgICAgIH0pOwor
ICAgIH07CisgIH0KKworICBmdW5jdGlvbiBydW4oZm4pIHsKKyAgICBpZiAoIV9lbWJlck1ldGFs
UnVuX2xvb3AuZGVmYXVsdC5jdXJyZW50UnVuTG9vcCkgeworICAgICAgcmV0dXJuIF9lbWJlck1l
dGFsUnVuX2xvb3AuZGVmYXVsdChmbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmbigp
OworICAgIH0KKyAgfQorCisgIF9lbWJlckFwcGxpY2F0aW9uU3lzdGVtQXBwbGljYXRpb24uZGVm
YXVsdC5yZW9wZW4oeworICAgIC8qKgorICAgICBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIHRoZSB0
ZXN0aW5nIGhlbHBlcnMgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBUaGVzZQorICAgICBh
cmUgY3JlYXRlZCBvbmNlIHlvdSBjYWxsIGBpbmplY3RUZXN0SGVscGVyc2Agb24geW91ciBgRW1i
ZXIuQXBwbGljYXRpb25gCisgICAgIGluc3RhbmNlLiBUaGUgaW5jbHVkZWQgaGVscGVycyBhcmUg
YWxzbyBhdmFpbGFibGUgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQorICAgICBkZWZhdWx0LCBi
dXQgY2FuIGJlIHVzZWQgZnJvbSB0aGlzIG9iamVjdCBvbiB0aGUgaW5kaXZpZHVhbCBhcHBsaWNh
dGlvbiBhbHNvLgorICAgICAgIEBwcm9wZXJ0eSB0ZXN0SGVscGVycworICAgICAgQHR5cGUge09i
amVjdH0KKyAgICAgIEBkZWZhdWx0IHt9CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0ZXN0
SGVscGVyczoge30sCisKKyAgICAvKioKKyAgICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4g
dGhlIG9yaWdpbmFsIG1ldGhvZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQKKyAgICAgb24gdGhlIGBo
ZWxwZXJDb250YWluZXJgIGJlZm9yZSBgaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KKyAg
ICAgIFdoZW4gYHJlbW92ZVRlc3RIZWxwZXJzYCBpcyBjYWxsZWQsIHRoZXNlIG1ldGhvZHMgYXJl
IHJlc3RvcmVkIHRvIHRoZQorICAgICBgaGVscGVyQ29udGFpbmVyYC4KKyAgICAgICBAcHJvcGVy
dHkgb3JpZ2luYWxNZXRob2RzCisgICAgICBAdHlwZSB7T2JqZWN0fQorICAgICAgQGRlZmF1bHQg
e30KKyAgICAgIEBwcml2YXRlCisgICAgICBAc2luY2UgMS4zLjAKKyAgICAqLworICAgIG9yaWdp
bmFsTWV0aG9kczoge30sCisKKyAgICAvKioKKyAgICBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB3
aGV0aGVyIG9yIG5vdCB0aGlzIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBpbgorICAgIHRlc3Rp
bmcgbW9kZS4gVGhpcyBpcyBzZXQgd2hlbiBgc2V0dXBGb3JUZXN0aW5nYCBpcyBjYWxsZWQgb24g
dGhlIGN1cnJlbnQKKyAgICBhcHBsaWNhdGlvbi4KKyAgICAgQHByb3BlcnR5IHRlc3RpbmcKKyAg
ICBAdHlwZSB7Qm9vbGVhbn0KKyAgICBAZGVmYXVsdCBmYWxzZQorICAgIEBzaW5jZSAxLjMuMAor
ICAgIEBwdWJsaWMKKyAgICAqLworICAgIHRlc3Rpbmc6IGZhbHNlLAorCisgICAgLyoqCisgICAg
ICBUaGlzIGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxpY2F0aW9uLCBzbyB0
aGF0IHlvdSBjYW4gc3RhcnQKKyAgICAgIHRoZSBhcHAgd2hlbiB5b3VyIHRlc3RzIGFyZSByZWFk
eSB0byBydW4uIEl0IGFsc28gc2V0cyB0aGUgcm91dGVyJ3MKKyAgICAgIGxvY2F0aW9uIHRvICdu
b25lJywgc28gdGhhdCB0aGUgd2luZG93J3MgbG9jYXRpb24gd2lsbCBub3QgYmUgbW9kaWZpZWQK
KyAgICAgIChwcmV2ZW50aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJldHdl
ZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQorICAgICAgd2l0aCB5b3VyIHRlc3RpbmcgZnJhbWV3
b3JrKS4KKyAgICAgICBFeGFtcGxlOgorICAgICAgIGBgYAorICAgICAgQXBwLnNldHVwRm9yVGVz
dGluZygpOworICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBzZXR1cEZvclRlc3RpbmcKKyAgICAg
IEBwdWJsaWMKKyAgICAqLworICAgIHNldHVwRm9yVGVzdGluZzogZnVuY3Rpb24gKCkgeworICAg
ICAgX2VtYmVyVGVzdGluZ1NldHVwX2Zvcl90ZXN0aW5nLmRlZmF1bHQoKTsKKworICAgICAgdGhp
cy50ZXN0aW5nID0gdHJ1ZTsKKworICAgICAgdGhpcy5Sb3V0ZXIucmVvcGVuKHsKKyAgICAgICAg
bG9jYXRpb246ICdub25lJworICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhp
cyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRhaW5lciB0byBpbmplY3QgdGhlIHRlc3QgaGVscGVy
cyBpbnRvLiBCeQorICAgICAgZGVmYXVsdCB0aGUgaGVscGVycyBhcmUgaW5qZWN0ZWQgaW50byBg
d2luZG93YC4KKyAgICAgICBAcHJvcGVydHkgaGVscGVyQ29udGFpbmVyCisgICAgICBAdHlwZSB7
T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRlc3QgaGVscGVycy4KKyAgICAgIEBk
ZWZhdWx0IHdpbmRvdworICAgICAgQHNpbmNlIDEuMi4wCisgICAgICBAcHJpdmF0ZQorICAgICov
CisgICAgaGVscGVyQ29udGFpbmVyOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGlzIGluamVj
dHMgdGhlIHRlc3QgaGVscGVycyBpbnRvIHRoZSBgaGVscGVyQ29udGFpbmVyYCBvYmplY3QuIElm
IGFuIG9iamVjdCBpcyBwcm92aWRlZAorICAgICAgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBoZWxw
ZXJDb250YWluZXIuIElmIGBoZWxwZXJDb250YWluZXJgIGlzIG5vdCBzZXQgaXQgd2lsbCBkZWZh
dWx0CisgICAgICB0byBgd2luZG93YC4gSWYgYSBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGhh
cyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBpdCB3aWxsIGJlIGNhY2hlZAorICAgICAgKHNvIHRoYXQg
aXQgY2FuIGJlIHJlc2V0IGlmIHRoZSBoZWxwZXIgaXMgcmVtb3ZlZCB3aXRoIGB1bnJlZ2lzdGVy
SGVscGVyYCBvcgorICAgICAgYHJlbW92ZVRlc3RIZWxwZXJzYCkuCisgICAgICAgQW55IGNhbGxi
YWNrcyByZWdpc3RlcmVkIHdpdGggYG9uSW5qZWN0SGVscGVyc2Agd2lsbCBiZSBjYWxsZWQgb25j
ZSB0aGUKKyAgICAgIGhlbHBlcnMgaGF2ZSBiZWVuIGluamVjdGVkLgorICAgICAgIEV4YW1wbGU6
CisgICAgICBgYGAKKyAgICAgIEFwcC5pbmplY3RUZXN0SGVscGVycygpOworICAgICAgYGBgCisg
ICAgICAgQG1ldGhvZCBpbmplY3RUZXN0SGVscGVycworICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaW5qZWN0VGVzdEhlbHBlcnM6IGZ1bmN0aW9uIChoZWxwZXJDb250YWluZXIpIHsKKyAgICAg
IGlmIChoZWxwZXJDb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5oZWxwZXJDb250YWluZXIgPSBo
ZWxwZXJDb250YWluZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmhlbHBlckNvbnRh
aW5lciA9IHdpbmRvdzsKKyAgICAgIH0KKworICAgICAgdGhpcy5yZW9wZW4oeworICAgICAgICB3
aWxsRGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisgICAgICAgICAgdGhpcy5yZW1vdmVUZXN0SGVscGVycygpOworICAg
ICAgICB9CisgICAgICB9KTsKKworICAgICAgdGhpcy50ZXN0SGVscGVycyA9IHt9OworICAgICAg
Zm9yICh2YXIgbmFtZSBpbiBoZWxwZXJzKSB7CisgICAgICAgIHRoaXMub3JpZ2luYWxNZXRob2Rz
W25hbWVdID0gdGhpcy5oZWxwZXJDb250YWluZXJbbmFtZV07CisgICAgICAgIHRoaXMudGVzdEhl
bHBlcnNbbmFtZV0gPSB0aGlzLmhlbHBlckNvbnRhaW5lcltuYW1lXSA9IGhlbHBlcih0aGlzLCBu
YW1lKTsKKyAgICAgICAgcHJvdG9XcmFwKFRlc3QuUHJvbWlzZS5wcm90b3R5cGUsIG5hbWUsIGhl
bHBlcih0aGlzLCBuYW1lKSwgaGVscGVyc1tuYW1lXS5tZXRhLndhaXQpOworICAgICAgfQorCisg
ICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGluamVjdEhlbHBlcnNDYWxsYmFja3MubGVuZ3RoOyBp
IDwgbDsgaSsrKSB7CisgICAgICAgIGluamVjdEhlbHBlcnNDYWxsYmFja3NbaV0odGhpcyk7Cisg
ICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhpcyByZW1vdmVzIGFsbCBoZWxwZXJz
IHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQsIGFuZCByZXNldHMgYW5kIGZ1bmN0aW9ucworICAg
ICAgdGhhdCB3ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBlcnMuCisgICAgICAgRXhhbXBsZToK
KyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBBcHAucmVtb3ZlVGVzdEhlbHBlcnMoKTsKKyAg
ICAgIGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBtZXRob2QgcmVtb3ZlVGVzdEhlbHBlcnMK
KyAgICAqLworICAgIHJlbW92ZVRlc3RIZWxwZXJzOiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAo
IXRoaXMuaGVscGVyQ29udGFpbmVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAg
ICAgZm9yICh2YXIgbmFtZSBpbiBoZWxwZXJzKSB7CisgICAgICAgIHRoaXMuaGVscGVyQ29udGFp
bmVyW25hbWVdID0gdGhpcy5vcmlnaW5hbE1ldGhvZHNbbmFtZV07CisgICAgICAgIGRlbGV0ZSBU
ZXN0LlByb21pc2UucHJvdG90eXBlW25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy50ZXN0SGVs
cGVyc1tuYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVdOwor
ICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgLy8gVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIG5l
ZWRlZAorICAvLyBCdXQgc3RpbGwgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAg
Ly8gb2YgaGVscGVyIGNoYWluaW5nCisgIGZ1bmN0aW9uIHByb3RvV3JhcChwcm90bywgbmFtZSwg
Y2FsbGJhY2ssIGlzQXN5bmMpIHsKKyAgICBwcm90b1tuYW1lXSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4y
KSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CisgICAgICAgIGFyZ3NbX2tl
eTJdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzQXN5bmMpIHsK
KyAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcmV0
dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAg
ICB9OworICB9CisKKyAgVGVzdC5Qcm9taXNlID0gZnVuY3Rpb24gKCkgeworICAgIF9lbWJlclJ1
bnRpbWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAg
IFRlc3QubGFzdFByb21pc2UgPSB0aGlzOworICB9OworCisgIFRlc3QuUHJvbWlzZS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKF9lbWJlclJ1bnRpbWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5w
cm90b3R5cGUpOworICBUZXN0LlByb21pc2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGVzdC5Q
cm9taXNlOworICBUZXN0LlByb21pc2UucmVzb2x2ZSA9IFRlc3QucmVzb2x2ZTsKKworICAvLyBQ
YXRjaCBgdGhlbmAgdG8gaXNvbGF0ZSBhc3luYyBtZXRob2RzCisgIC8vIHNwZWNpZmljYWxseSBg
RW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAKKyAgdmFyIG9yaWdpbmFsVGhlbiA9IF9lbWJlclJ1bnRp
bWVFeHRSc3ZwLmRlZmF1bHQuUHJvbWlzZS5wcm90b3R5cGUudGhlbjsKKyAgVGVzdC5Qcm9taXNl
LnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CisgICAg
cmV0dXJuIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIGZ1bmN0aW9uICh2YWwpIHsKKyAgICAgIHJl
dHVybiBpc29sYXRlKG9uU3VjY2VzcywgdmFsKTsKKyAgICB9LCBvbkZhaWx1cmUpOworICB9Owor
CisgIC8vIFRoaXMgbWV0aG9kIGlzb2xhdGVzIG5lc3RlZCBhc3luYyBtZXRob2RzCisgIC8vIHNv
IHRoYXQgdGhleSBkb24ndCBjb25mbGljdCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCisgIC8v
CisgIC8vIDEuIFNldCBgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAgdG8gbnVsbAorICAvLyAyLiBJ
bnZva2UgbWV0aG9kCisgIC8vIDMuIFJldHVybiB0aGUgbGFzdCBwcm9taXNlIGNyZWF0ZWQgZHVy
aW5nIG1ldGhvZAorICBmdW5jdGlvbiBpc29sYXRlKGZuLCB2YWwpIHsKKyAgICB2YXIgdmFsdWUs
IGxhc3RQcm9taXNlOworCisgICAgLy8gUmVzZXQgbGFzdFByb21pc2UgZm9yIG5lc3RlZCBoZWxw
ZXJzCisgICAgVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7CisKKyAgICB2YWx1ZSA9IGZuKHZhbCk7
CisKKyAgICBsYXN0UHJvbWlzZSA9IFRlc3QubGFzdFByb21pc2U7CisgICAgVGVzdC5sYXN0UHJv
bWlzZSA9IG51bGw7CisKKyAgICAvLyBJZiB0aGUgbWV0aG9kIHJldHVybmVkIGEgcHJvbWlzZQor
ICAgIC8vIHJldHVybiB0aGF0IHByb21pc2UuIElmIG5vdCwKKyAgICAvLyByZXR1cm4gdGhlIGxh
c3QgYXN5bmMgaGVscGVyJ3MgcHJvbWlzZQorICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5j
ZW9mIFRlc3QuUHJvbWlzZSB8fCAhbGFzdFByb21pc2UpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJ1bihmdW5jdGlvbiAoKSB7CisgICAgICAgIHJl
dHVybiBUZXN0LnJlc29sdmUobGFzdFByb21pc2UpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAg
ICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBUZXN0OworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL2NvbXBh
dC9hdHRycy1wcm94eScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1t
ZXRhbC9zeW1ib2wnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfZXZlbnRzJ10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbFN5bWJvbCwgX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9ldmVudHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVwcmVjYXRp
b24gPSBkZXByZWNhdGlvbjsKKworICBmdW5jdGlvbiBkZXByZWNhdGlvbihrZXkpIHsKKyAgICBy
ZXR1cm4gJ1lvdSB0cmllZCB0byBsb29rIHVwIGFuIGF0dHJpYnV0ZSBkaXJlY3RseSBvbiB0aGUg
Y29tcG9uZW50LiBUaGlzIGlzIGRlcHJlY2F0ZWQuIFVzZSBhdHRycy4nICsga2V5ICsgJyBpbnN0
ZWFkLic7CisgIH0KKworICB2YXIgTVVUQUJMRV9DRUxMID0gX2VtYmVyTWV0YWxTeW1ib2wuZGVm
YXVsdCgnTVVUQUJMRV9DRUxMJyk7CisKKyAgZXhwb3J0cy5NVVRBQkxFX0NFTEwgPSBNVVRBQkxF
X0NFTEw7CisgIGZ1bmN0aW9uIGlzQ2VsbCh2YWwpIHsKKyAgICByZXR1cm4gdmFsICYmIHZhbFtN
VVRBQkxFX0NFTExdOworICB9CisKKyAgdmFyIEF0dHJzUHJveHlNaXhpbiA9IHsKKyAgICBhdHRy
czogbnVsbCwKKworICAgIGdldEF0dHI6IGZ1bmN0aW9uIChrZXkpIHsKKyAgICAgIHZhciBhdHRy
cyA9IHRoaXMuYXR0cnM7CisgICAgICBpZiAoIWF0dHJzKSB7CisgICAgICAgIHJldHVybjsKKyAg
ICAgIH0KKyAgICAgIHJldHVybiB0aGlzLmdldEF0dHJGb3IoYXR0cnMsIGtleSk7CisgICAgfSwK
KworICAgIGdldEF0dHJGb3I6IGZ1bmN0aW9uIChhdHRycywga2V5KSB7CisgICAgICB2YXIgdmFs
ID0gYXR0cnNba2V5XTsKKyAgICAgIHJldHVybiBpc0NlbGwodmFsKSA/IHZhbC52YWx1ZSA6IHZh
bDsKKyAgICB9LAorCisgICAgc2V0QXR0cjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKKyAgICAg
IHZhciBhdHRycyA9IHRoaXMuYXR0cnM7CisgICAgICB2YXIgdmFsID0gYXR0cnNba2V5XTsKKwor
ICAgICAgaWYgKCFpc0NlbGwodmFsKSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBj
YW5cJ3QgdXBkYXRlIGF0dHJzLicgKyBrZXkgKyAnLCBiZWNhdXNlIGl0XCdzIG5vdCBtdXRhYmxl
Jyk7CisgICAgICB9CisKKyAgICAgIHZhbC51cGRhdGUodmFsdWUpOworICAgIH0sCisKKyAgICBf
cHJvcGFnYXRlQXR0cnNUb1RoaXM6IGZ1bmN0aW9uIChhdHRycykgeworICAgICAgdGhpcy5faXNE
aXNwYXRjaGluZ0F0dHJzID0gdHJ1ZTsKKyAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhhdHRycyk7
CisgICAgICB0aGlzLl9pc0Rpc3BhdGNoaW5nQXR0cnMgPSBmYWxzZTsKKyAgICB9CisgIH07CisK
KyAgQXR0cnNQcm94eU1peGluW19lbWJlck1ldGFsUHJvcGVydHlfZXZlbnRzLlBST1BFUlRZX0RJ
RF9DSEFOR0VdID0gZnVuY3Rpb24gKGtleSkgeworICAgIGlmICh0aGlzLl9pc0FuZ2xlQnJhY2tl
dCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodGhpcy5faXNEaXNwYXRjaGluZ0F0
dHJzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMuX2N1cnJlbnRTdGF0
ZSkgeworICAgICAgdGhpcy5fY3VycmVudFN0YXRlLmxlZ2FjeVByb3BlcnR5RGlkQ2hhbmdlKHRo
aXMsIGtleSk7CisgICAgfQorICB9OworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlck1ldGFs
TWl4aW4uTWl4aW4uY3JlYXRlKEF0dHJzUHJveHlNaXhpbik7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dmlld3MvY29tcG9uZW50X2xvb2t1cCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb3JlJywg
J2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJl
ci1odG1sYmFycy9zeXN0ZW0vbG9va3VwLWhlbHBlcicsICdjb250YWluZXIvb3duZXInXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsQ29yZSwgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVy
UnVudGltZVN5c3RlbU9iamVjdCwgX2VtYmVySHRtbGJhcnNTeXN0ZW1Mb29rdXBIZWxwZXIsIF9j
b250YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
X2VtYmVyUnVudGltZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisgICAgaW52YWxpZE5h
bWU6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICBpZiAoIV9lbWJlckh0bWxiYXJzU3lzdGVtTG9v
a3VwSGVscGVyLkNPTlRBSU5TX0RBU0hfQ0FDSEUuZ2V0KG5hbWUpKSB7CisgICAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IHVzZSBcJycgKyBuYW1lICsgJ1wnIGFzIGEg
Y29tcG9uZW50IG5hbWUuIENvbXBvbmVudCBuYW1lcyBtdXN0IGNvbnRhaW4gYSBoeXBoZW4uJyk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0sCisKKyAgICBsb29rdXBGYWN0
b3J5OiBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHsKKyAgICAgIG93bmVyID0gb3duZXIgfHwgX2Nv
bnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworCisgICAgICB2YXIgZnVsbE5hbWUgPSAnY29t
cG9uZW50OicgKyBuYW1lOworICAgICAgdmFyIHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6
Y29tcG9uZW50cy8nICsgbmFtZTsKKyAgICAgIHZhciB0ZW1wbGF0ZVJlZ2lzdGVyZWQgPSBvd25l
ciAmJiBvd25lci5oYXNSZWdpc3RyYXRpb24odGVtcGxhdGVGdWxsTmFtZSk7CisKKyAgICAgIGlm
ICh0ZW1wbGF0ZVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgb3duZXIuaW5qZWN0KGZ1bGxOYW1lLCAn
bGF5b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7CisgICAgICB9CisKKyAgICAgIHZhciBDb21wb25l
bnQgPSBvd25lci5fbG9va3VwRmFjdG9yeShmdWxsTmFtZSk7CisKKyAgICAgIC8vIE9ubHkgdHJl
YXQgYXMgYSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBjb21wb25lbnQKKyAgICAgIC8vIG9yIGEg
dGVtcGxhdGUgaGFzIGJlZW4gcmVnaXN0ZXJlZC4KKyAgICAgIGlmICh0ZW1wbGF0ZVJlZ2lzdGVy
ZWQgfHwgQ29tcG9uZW50KSB7CisgICAgICAgIGlmICghQ29tcG9uZW50KSB7CisgICAgICAgICAg
b3duZXIucmVnaXN0ZXIoZnVsbE5hbWUsIF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LkNvbXBvbmVu
dCk7CisgICAgICAgICAgQ29tcG9uZW50ID0gb3duZXIuX2xvb2t1cEZhY3RvcnkoZnVsbE5hbWUp
OworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb21wb25lbnQ7CisgICAgICB9CisgICAgfSwK
KworICAgIGNvbXBvbmVudEZvcjogZnVuY3Rpb24gKG5hbWUsIG93bmVyLCBvcHRpb25zKSB7Cisg
ICAgICBpZiAodGhpcy5pbnZhbGlkTmFtZShuYW1lKSkgeworICAgICAgICByZXR1cm47CisgICAg
ICB9CisKKyAgICAgIHZhciBmdWxsTmFtZSA9ICdjb21wb25lbnQ6JyArIG5hbWU7CisgICAgICBy
ZXR1cm4gb3duZXIuX2xvb2t1cEZhY3RvcnkoZnVsbE5hbWUsIG9wdGlvbnMpOworICAgIH0sCisK
KyAgICBsYXlvdXRGb3I6IGZ1bmN0aW9uIChuYW1lLCBvd25lciwgb3B0aW9ucykgeworICAgICAg
aWYgKHRoaXMuaW52YWxpZE5hbWUobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQor
CisgICAgICB2YXIgdGVtcGxhdGVGdWxsTmFtZSA9ICd0ZW1wbGF0ZTpjb21wb25lbnRzLycgKyBu
YW1lOworICAgICAgcmV0dXJuIG93bmVyLmxvb2t1cCh0ZW1wbGF0ZUZ1bGxOYW1lLCBvcHRpb25z
KTsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL2NvbXBvbmVudHMvY29t
cG9uZW50JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1ldGFsL2Vu
dmlyb25tZW50JywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL3RhcmdldF9hY3Rpb25fc3VwcG9ydCcs
ICdlbWJlci12aWV3cy92aWV3cy92aWV3JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdl
bWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvaXNfbm9uZScsICdlbWJlci1t
ZXRhbC91dGlscycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci12aWV3cy9jb21wYXQv
YXR0cnMtcHJveHknLCAnY29udGFpbmVyL293bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVudmlyb25tZW50LCBfZW1iZXJSdW50aW1lTWl4aW5z
VGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJWaWV3c1ZpZXdzVmlldywgX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbElzX25vbmUs
IF9lbWJlck1ldGFsVXRpbHMsIF9lbWJlck1ldGFsQ29tcHV0ZWQsIF9lbWJlclZpZXdzQ29tcGF0
QXR0cnNQcm94eSwgX2NvbnRhaW5lck93bmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5j
dGlvbiB2YWxpZGF0ZUFjdGlvbihjb21wb25lbnQsIGFjdGlvbk5hbWUpIHsKKyAgICBpZiAoYWN0
aW9uTmFtZSAmJiBhY3Rpb25OYW1lW19lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eS5NVVRBQkxF
X0NFTExdKSB7CisgICAgICBhY3Rpb25OYW1lID0gYWN0aW9uTmFtZS52YWx1ZTsKKyAgICB9Cisg
ICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1RoZSBkZWZhdWx0IGFjdGlvbiB3YXMgdHJpZ2dl
cmVkIG9uIHRoZSBjb21wb25lbnQgJyArIGNvbXBvbmVudC50b1N0cmluZygpICsgJywgYnV0IHRo
ZSBhY3Rpb24gbmFtZSAoJyArIGFjdGlvbk5hbWUgKyAnKSB3YXMgbm90IGEgc3RyaW5nLicsIF9l
bWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KGFjdGlvbk5hbWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1l
ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ2Z1bmN0aW9uJyk7CisgICAg
cmV0dXJuIGFjdGlvbk5hbWU7CisgIH0KKworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3Vi
bW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgLyoqCisgICAgQW4gYEVtYmVyLkNvbXBvbmVu
dGAgaXMgYSB2aWV3IHRoYXQgaXMgY29tcGxldGVseQorICAgIGlzb2xhdGVkLiBQcm9wZXJ0aWVz
IGFjY2Vzc2VkIGluIGl0cyB0ZW1wbGF0ZXMgZ28KKyAgICB0byB0aGUgdmlldyBvYmplY3QgYW5k
IGFjdGlvbnMgYXJlIHRhcmdldGVkIGF0CisgICAgdGhlIHZpZXcgb2JqZWN0LiBUaGVyZSBpcyBu
byBhY2Nlc3MgdG8gdGhlCisgICAgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250cm9s
bGVyOyBhbGwKKyAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIG11c3QgYmUgcGFzc2VkIGluLgor
ICAKKyAgICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFuIGBFbWJlci5Db21wb25lbnRgIGlz
IHZpYQorICAgIGEgdGVtcGxhdGUuIElmIHlvdSBuYW1lIGEgdGVtcGxhdGUKKyAgICBgY29tcG9u
ZW50cy9teS1mb29gLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZQorICAgIGB7e215LWZvb319YCBp
biBvdGhlciB0ZW1wbGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQorICAgIGFuIGluc3RhbmNlIG9mIHRo
ZSBpc29sYXRlZCBjb21wb25lbnQuCisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICB7e2FwcC1w
cm9maWxlIHBlcnNvbj1jdXJyZW50VXNlcn19CisgICAgYGBgCisgIAorICAgIGBgYGhhbmRsZWJh
cnMKKyAgICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRlIC0tPgorICAgIDxoMT57e3BlcnNvbi50
aXRsZX19PC9oMT4KKyAgICA8aW1nIHNyYz17e3BlcnNvbi5hdmF0YXJ9fT4KKyAgICA8cCBjbGFz
cz0nc2lnbmF0dXJlJz57e3BlcnNvbi5zaWduYXR1cmV9fTwvcD4KKyAgICBgYGAKKyAgCisgICAg
WW91IGNhbiB1c2UgYHlpZWxkYCBpbnNpZGUgYSB0ZW1wbGF0ZSB0bworICAgIGluY2x1ZGUgdGhl
ICoqY29udGVudHMqKiBvZiBhbnkgYmxvY2sgYXR0YWNoZWQgdG8KKyAgICB0aGUgY29tcG9uZW50
LiBUaGUgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUKKyAgICBjb250ZXh0IG9mIHRoZSBz
dXJyb3VuZGluZyBjb250ZXh0IG9yIG91dGVyIGNvbnRyb2xsZXI6CisgIAorICAgIGBgYGhhbmRs
ZWJhcnMKKyAgICB7eyNhcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9fQorICAgICAgPHA+
QWRtaW4gbW9kZTwvcD4KKyAgICAgIHt7ISBFeGVjdXRlZCBpbiB0aGUgY29udHJvbGxlcidzIGNv
bnRleHQuIH19CisgICAge3svYXBwLXByb2ZpbGV9fQorICAgIGBgYAorICAKKyAgICBgYGBoYW5k
bGViYXJzCisgICAgPCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4KKyAgICA8aDE+e3twZXJz
b24udGl0bGV9fTwvaDE+CisgICAge3shIEV4ZWN1dGVkIGluIHRoZSBjb21wb25lbnQncyBjb250
ZXh0LiB9fQorICAgIHt7eWllbGR9fSB7eyEgYmxvY2sgY29udGVudHMgfX0KKyAgICBgYGAKKyAg
CisgICAgSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb21wb25lbnQsIGluIG9yZGVyIHRv
CisgICAgaGFuZGxlIGV2ZW50cyBvciBhY3Rpb25zLCB5b3UgaW1wbGVtZW50IGEgc3ViY2xhc3MK
KyAgICBvZiBgRW1iZXIuQ29tcG9uZW50YCBuYW1lZCBhZnRlciB0aGUgbmFtZSBvZiB0aGUKKyAg
ICBjb21wb25lbnQuIE5vdGUgdGhhdCBgQ29tcG9uZW50YCBuZWVkcyB0byBiZSBhcHBlbmRlZCB0
byB0aGUgbmFtZSBvZgorICAgIHlvdXIgc3ViY2xhc3MgbGlrZSBgQXBwUHJvZmlsZUNvbXBvbmVu
dGAuCisgIAorICAgIEZvciBleGFtcGxlLCB5b3UgY291bGQgaW1wbGVtZW50IHRoZSBhY3Rpb24K
KyAgICBgaGVsbG9gIGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21wb25lbnQ6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICBBcHAuQXBwUHJvZmlsZUNvbXBvbmVudCA9IEVtYmVyLkNvbXBvbmVu
dC5leHRlbmQoeworICAgICAgYWN0aW9uczogeworICAgICAgICBoZWxsbzogZnVuY3Rpb24obmFt
ZSkgeworICAgICAgICAgIGNvbnNvbGUubG9nKCJIZWxsbyIsIG5hbWUpOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEFuZCB0aGVuIHVzZSBpdCBpbiB0aGUg
Y29tcG9uZW50J3MgdGVtcGxhdGU6CisgIAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICA8IS0tIGFw
cC1wcm9maWxlIHRlbXBsYXRlIC0tPgorICAKKyAgICA8aDE+e3twZXJzb24udGl0bGV9fTwvaDE+
CisgICAge3t5aWVsZH19IDwhLS0gYmxvY2sgY29udGVudHMgLS0+CisgIAorICAgIDxidXR0b24g
e3thY3Rpb24gJ2hlbGxvJyBwZXJzb24ubmFtZX19PgorICAgICAgU2F5IEhlbGxvIHRvIHt7cGVy
c29uLm5hbWV9fQorICAgIDwvYnV0dG9uPgorICAgIGBgYAorICAKKyAgICBDb21wb25lbnRzIG11
c3QgaGF2ZSBhIGAtYCBpbiB0aGVpciBuYW1lIHRvIGF2b2lkCisgICAgY29uZmxpY3RzIHdpdGgg
YnVpbHQtaW4gY29udHJvbHMgdGhhdCB3cmFwIEhUTUwKKyAgICBlbGVtZW50cy4gVGhpcyBpcyBj
b25zaXN0ZW50IHdpdGggdGhlIHNhbWUKKyAgICByZXF1aXJlbWVudCBpbiB3ZWIgY29tcG9uZW50
cy4KKyAgCisgICAgQGNsYXNzIENvbXBvbmVudAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBA
ZXh0ZW5kcyBFbWJlci5WaWV3CisgICAgQHVzZXMgRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBv
cnQKKyAgICBAcHVibGljCisgICovCisgIHZhciBDb21wb25lbnQgPSBfZW1iZXJWaWV3c1ZpZXdz
Vmlldy5kZWZhdWx0LmV4dGVuZChfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBw
b3J0LmRlZmF1bHQsIHsKKyAgICBpc0NvbXBvbmVudDogdHJ1ZSwKKyAgICAvKgorICAgICAgVGhp
cyBpcyBzZXQgc28gdGhhdCB0aGUgcHJvdG8gaW5zcGVjdGlvbiBpbiBhcHBlbmRUZW1wbGF0ZWRW
aWV3IGRvZXMgbm90CisgICAgICB0aGluayB0aGF0IGl0IHNob3VsZCBzZXQgdGhlIGNvbXBvbmVu
dCdzIGBjb250ZXh0YCB0byB0aGF0IG9mIHRoZSBwYXJlbnQgdmlldy4KKyAgICAqLworICAgIGNv
bnRyb2xsZXI6IG51bGwsCisgICAgY29udGV4dDogbnVsbCwKKworICAgIGluc3RydW1lbnROYW1l
OiAnY29tcG9uZW50JywKKyAgICBpbnN0cnVtZW50RGlzcGxheTogX2VtYmVyTWV0YWxDb21wdXRl
ZC5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5fZGVidWdDb250YWluZXJL
ZXkpIHsKKyAgICAgICAgcmV0dXJuICd7eycgKyB0aGlzLl9kZWJ1Z0NvbnRhaW5lcktleS5zcGxp
dCgnOicpWzFdICsgJ319JzsKKyAgICAgIH0KKyAgICB9KSwKKworICAgIGluaXQ6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhp
cywgJ2NvbnRyb2xsZXInLCB0aGlzKTsKKyAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNl
dCh0aGlzLCAnY29udGV4dCcsIHRoaXMpOworCisgICAgICBpZiAoIXRoaXMubGF5b3V0ICYmIHRo
aXMubGF5b3V0TmFtZSAmJiBfY29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykpIHsKKyAgICAg
ICAgdmFyIGxheW91dE5hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2xh
eW91dE5hbWUnKTsKKworICAgICAgICB0aGlzLmxheW91dCA9IHRoaXMudGVtcGxhdGVGb3JOYW1l
KGxheW91dE5hbWUpOworICAgICAgfQorCisgICAgICAvLyBJZiBhIGBkZWZhdWx0TGF5b3V0YCB3
YXMgc3BlY2lmaWVkIG1vdmUgaXQgdG8gdGhlIGBsYXlvdXRgIHByb3AuCisgICAgICAvLyBgbGF5
b3V0YCBpcyBubyBsb25nZXIgYSBDUCwgc28gdGhpcyBqdXN0IGVuc3VyZXMgdGhhdCB0aGUgYGRl
ZmF1bHRMYXlvdXRgCisgICAgICAvLyBsb2dpYyBpcyBzdXBwb3J0ZWQgd2l0aCBhIGRlcHJlY2F0
aW9uCisgICAgICBpZiAodGhpcy5kZWZhdWx0TGF5b3V0ICYmICF0aGlzLmxheW91dCkgeworICAg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmRlcHJlY2F0ZSgnU3BlY2lmeWluZyBgZGVmYXVsdExheW91
dGAgdG8gJyArIHRoaXMgKyAnIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxheW91dGAgaW5z
dGVhZC4nLCBmYWxzZSwgeworICAgICAgICAgIGlkOiAnZW1iZXItdmlld3MuY29tcG9uZW50LmRl
ZmF1bHRMYXlvdXQnLAorICAgICAgICAgIHVudGlsOiAnMy4wLjAnLAorICAgICAgICAgIHVybDog
J2h0dHA6Ly9lbWJlcmpzLmNvbS9kZXByZWNhdGlvbnMvdjIueC8jdG9jX2VtYmVyLWNvbXBvbmVu
dC1kZWZhdWx0bGF5b3V0JworICAgICAgICB9KTsKKworICAgICAgICB0aGlzLmxheW91dCA9IHRo
aXMuZGVmYXVsdExheW91dDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgaW4gYSB0YWdsZXNzIGNv
bXBvbmVudCwgYXNzZXJ0IHRoYXQgbm8gZXZlbnQgaGFuZGxlcnMgYXJlIGRlZmluZWQKKyAgICAg
IF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2FuIG5vdCBkZWZpbmUgYSBmdW5jdGlvbiB0
aGF0IGhhbmRsZXMgRE9NIGV2ZW50cyBpbiB0aGUgYCcgKyB0aGlzICsgJ2AgdGFnbGVzcyBjb21w
b25lbnQgc2luY2UgaXQgZG9lc25cJ3QgaGF2ZSBhbnkgRE9NIGVsZW1lbnQuJywgdGhpcy50YWdO
YW1lICE9PSAnJyB8fCAhX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTSB8fCAh
KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIGV2ZW50RGlzcGF0Y2hlciA9IF9jb250YWluZXJP
d25lci5nZXRPd25lcihfdGhpcykubG9va3VwKCdldmVudF9kaXNwYXRjaGVyOm1haW4nKTsKKyAg
ICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50RGlzcGF0Y2hlciAmJiBldmVudERpc3BhdGNoZXIuX2Zp
bmFsRXZlbnRzIHx8IHt9OworCisgICAgICAgIGZvciAodmFyIGtleSBpbiBldmVudHMpIHsKKyAg
ICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGV2ZW50c1trZXldOworCisgICAgICAgICAgaWYgKHR5
cGVvZiBfdGhpc1ttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgICAgcmV0
dXJuIHRydWU7IC8vIGluZGljYXRlIHRoYXQgdGhlIGFzc2VydGlvbiBzaG91bGQgYmUgdHJpZ2dl
cmVkCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KSgpKTsKKyAgICB9LAorCisgICAg
dGVtcGxhdGU6IG51bGwsCisgICAgbGF5b3V0TmFtZTogbnVsbCwKKyAgICBsYXlvdXQ6IG51bGws
CisKKyAgICAvKioKKyAgICAgIElmIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGluc2VydGVk
IGludG8gdGhlIERPTSBvZiBhIHBhcmVudCB2aWV3LCB0aGlzCisgICAgICBwcm9wZXJ0eSB3aWxs
IHBvaW50IHRvIHRoZSBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgdmlldy4KKyAgICAgICBAcHJv
cGVydHkgdGFyZ2V0T2JqZWN0CisgICAgICBAdHlwZSBFbWJlci5Db250cm9sbGVyCisgICAgICBA
ZGVmYXVsdCBudWxsCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgdGFyZ2V0T2JqZWN0OiBf
ZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKCdjb250cm9sbGVyJywgZnVuY3Rpb24gKGtleSkg
eworICAgICAgaWYgKHRoaXMuX3RhcmdldE9iamVjdCkgeworICAgICAgICByZXR1cm4gdGhpcy5f
dGFyZ2V0T2JqZWN0OworICAgICAgfQorICAgICAgaWYgKHRoaXMuX2NvbnRyb2xsZXIpIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xsZXI7CisgICAgICB9CisgICAgICB2YXIgcGFyZW50
VmlldyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAncGFyZW50VmlldycpOwor
ICAgICAgcmV0dXJuIHBhcmVudFZpZXcgPyBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFy
ZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7CisgICAgfSksCisKKyAgICAvKioKKyAgICAg
IENhbGxzIGFuIGFjdGlvbiBwYXNzZWQgdG8gYSBjb21wb25lbnQuCisgICAgICAgRm9yIGV4YW1w
bGUgYSBjb21wb25lbnQgZm9yIHBsYXlpbmcgb3IgcGF1c2luZyBtdXNpYyBtYXkgdHJhbnNsYXRl
IGNsaWNrIGV2ZW50cworICAgICAgaW50byBhY3Rpb24gbm90aWZpY2F0aW9ucyBvZiAicGxheSIg
b3IgInN0b3AiIGRlcGVuZGluZyBvbiBzb21lIGludGVybmFsIHN0YXRlCisgICAgICBvZiB0aGUg
Y29tcG9uZW50OgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIC8vIGFwcC9jb21wb25lbnRz
L3BsYXktYnV0dG9uLmpzCisgICAgICBleHBvcnQgZGVmYXVsdCBFbWJlci5Db21wb25lbnQuZXh0
ZW5kKHsKKyAgICAgICAgY2xpY2soKSB7CisgICAgICAgICAgaWYgKHRoaXMuZ2V0KCdpc1BsYXlp
bmcnKSkgeworICAgICAgICAgICAgdGhpcy5zZW5kQWN0aW9uKCdwbGF5Jyk7CisgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuc2VuZEFjdGlvbignc3RvcCcpOworICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGUgYWN0aW9ucyAi
cGxheSIgYW5kICJzdG9wIiBtdXN0IGJlIHBhc3NlZCB0byB0aGlzIGBwbGF5LWJ1dHRvbmAgY29t
cG9uZW50OgorICAgICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIHt7ISBhcHAvdGVtcGxhdGVzL2Fw
cGxpY2F0aW9uLmhicyB9fQorICAgICAge3twbGF5LWJ1dHRvbiBwbGF5PShhY3Rpb24gIm11c2lj
U3RhcnRlZCIpIHN0b3A9KGFjdGlvbiAibXVzaWNTdG9wcGVkIil9fQorICAgICAgYGBgCisgICAg
ICAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIGEgYnJvd3NlciBgY2xpY2tgIGV2ZW50IGl0
IHRyYW5zbGF0ZSB0aGlzCisgICAgICBpbnRlcmFjdGlvbiBpbnRvIGFwcGxpY2F0aW9uLXNwZWNp
ZmljIHNlbWFudGljcyAoInBsYXkiIG9yICJzdG9wIikgYW5kCisgICAgICBjYWxscyB0aGUgc3Bl
Y2lmaWVkIGFjdGlvbi4KKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBhcHAvY29udHJv
bGxlci9hcHBsaWNhdGlvbi5qcworICAgICAgZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxl
ci5leHRlbmQoeworICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAgbXVzaWNTdGFydGVkKCkg
eworICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHBsYXkgYnV0dG9uIGlzIGNsaWNrZWQK
KyAgICAgICAgICAgIC8vIGFuZCB0aGUgbXVzaWMgc3RhcnRlZCBwbGF5aW5nCisgICAgICAgICAg
fSwKKyAgICAgICAgICBtdXNpY1N0b3BwZWQoKSB7CisgICAgICAgICAgICAvLyBjYWxsZWQgd2hl
biB0aGUgcGxheSBidXR0b24gaXMgY2xpY2tlZAorICAgICAgICAgICAgLy8gYW5kIHRoZSBtdXNp
YyBzdG9wcGVkIHBsYXlpbmcKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAg
ICAgYGBgCisgICAgICAgSWYgbm8gYWN0aW9uIGlzIHBhc3NlZCB0byBgc2VuZEFjdGlvbmAgYSBk
ZWZhdWx0IG5hbWUgb2YgImFjdGlvbiIKKyAgICAgIGlzIGFzc3VtZWQuCisgICAgICAgYGBgamF2
YXNjcmlwdAorICAgICAgLy8gYXBwL2NvbXBvbmVudHMvbmV4dC1idXR0b24uanMKKyAgICAgIGV4
cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoeworICAgICAgICBjbGljaygpIHsK
KyAgICAgICAgICB0aGlzLnNlbmRBY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAg
ICBgYGAKKyAgICAgICBgYGBoYW5kbGViYXJzCisgICAgICB7eyEgYXBwL3RlbXBsYXRlcy9hcHBs
aWNhdGlvbi5oYnMgfX0KKyAgICAgIHt7bmV4dC1idXR0b24gYWN0aW9uPShhY3Rpb24gInBsYXlO
ZXh0U29uZ0luQWxidW0iKX19CisgICAgICBgYGAKKyAgICAgICBgYGBqYXZhc2NyaXB0CisgICAg
ICAvLyBhcHAvY29udHJvbGxlcnMvYXBwbGljYXRpb24uanMKKyAgICAgIEFwcC5BcHBsaWNhdGlv
bkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgICAgIGFjdGlvbnM6
IHsKKyAgICAgICAgICBwbGF5TmV4dFNvbmdJbkFsYnVtKCkgeworICAgICAgICAgICAgLi4uCisg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEBtZXRo
b2Qgc2VuZEFjdGlvbgorICAgICAgQHBhcmFtIFthY3Rpb25dIHtTdHJpbmd9IHRoZSBhY3Rpb24g
dG8gY2FsbAorICAgICAgQHBhcmFtIFtwYXJhbXNdIHsqfSBhcmd1bWVudHMgZm9yIHRoZSBhY3Rp
b24KKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHNlbmRBY3Rpb246IGZ1bmN0aW9uIChhY3Rp
b24pIHsKKyAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZXh0cyA9
IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBf
a2V5KyspIHsKKyAgICAgICAgY29udGV4dHNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwor
ICAgICAgfQorCisgICAgICB2YXIgYWN0aW9uTmFtZTsKKworICAgICAgLy8gU2VuZCB0aGUgZGVm
YXVsdCBhY3Rpb24KKyAgICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCkgeworICAgICAgICBh
Y3Rpb24gPSAnYWN0aW9uJzsKKyAgICAgIH0KKyAgICAgIGFjdGlvbk5hbWUgPSBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldC5nZXQodGhpcywgJ2F0dHJzLicgKyBhY3Rpb24pIHx8IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldCh0aGlzLCBhY3Rpb24pOworICAgICAgYWN0aW9uTmFtZSA9IHZhbGlk
YXRlQWN0aW9uKHRoaXMsIGFjdGlvbk5hbWUpOworCisgICAgICAvLyBJZiBubyBhY3Rpb24gbmFt
ZSBmb3IgdGhhdCBhY3Rpb24gY291bGQgYmUgZm91bmQsIGp1c3QgYWJvcnQuCisgICAgICBpZiAo
YWN0aW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwor
ICAgICAgaWYgKHR5cGVvZiBhY3Rpb25OYW1lID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGFj
dGlvbk5hbWUuYXBwbHkodW5kZWZpbmVkLCBjb250ZXh0cyk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oeworICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwK
KyAgICAgICAgICBhY3Rpb25Db250ZXh0OiBjb250ZXh0cworICAgICAgICB9KTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgc2VuZDogZnVuY3Rpb24gKGFjdGlvbk5hbWUpIHsKKyAgICAgIGZvciAo
dmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMSA/IF9s
ZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHsKKyAgICAg
ICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTsKKyAgICAgIH0KKworICAgICAg
dmFyIHRhcmdldDsKKyAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbnMgJiYgdGhpcy5hY3Rp
b25zW2FjdGlvbk5hbWVdOworCisgICAgICBpZiAoYWN0aW9uKSB7CisgICAgICAgIHZhciBzaG91
bGRCdWJibGUgPSBhY3Rpb24uYXBwbHkodGhpcywgYXJncykgPT09IHRydWU7CisgICAgICAgIGlm
ICghc2hvdWxkQnViYmxlKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9
CisKKyAgICAgIGlmICh0YXJnZXQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywg
J3RhcmdldCcpKSB7CisgICAgICAgIHZhciBfdGFyZ2V0OworCisgICAgICAgIF9lbWJlck1ldGFs
RGVidWcuYXNzZXJ0KCdUaGUgYHRhcmdldGAgZm9yICcgKyB0aGlzICsgJyAoJyArIHRhcmdldCAr
ICcpIGRvZXMgbm90IGhhdmUgYSBgc2VuZGAgbWV0aG9kJywgdHlwZW9mIHRhcmdldC5zZW5kID09
PSAnZnVuY3Rpb24nKTsKKyAgICAgICAgKF90YXJnZXQgPSB0YXJnZXQpLnNlbmQuYXBwbHkoX3Rh
cmdldCwgYXJndW1lbnRzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghYWN0aW9uKSB7
CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKF9lbWJlck1ldGFsVXRpbHMuaW5zcGVjdCh0aGlz
KSArICcgaGFkIG5vIGFjdGlvbiBoYW5kbGVyIGZvcjogJyArIGFjdGlvbk5hbWUpOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICBSZXR1cm5zIHRydWUgd2hlbiB0
aGUgY29tcG9uZW50IHdhcyBpbnZva2VkIHdpdGggYSBibG9jayB0ZW1wbGF0ZS4KKyAgICAgICBF
eGFtcGxlIChgaGFzQmxvY2tgIHdpbGwgYmUgYGZhbHNlYCk6CisgICAgICAgYGBgaGJzCisgICAg
ICB7eyEgdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAgICAgIHt7Zm9vLWJhcn19Cisg
ICAgICAge3shIHRlbXBsYXRlcy9jb21wb25lbnRzL2Zvby1iYXIuaGJzIH19CisgICAgICB7eyNp
ZiBoYXNCbG9ja319CisgICAgICAgIFRoaXMgd2lsbCBub3QgYmUgcHJpbnRlZCwgYmVjYXVzZSBu
byBibG9jayB3YXMgcHJvdmlkZWQKKyAgICAgIHt7L2lmfX0KKyAgICAgIGBgYAorICAgICAgIEV4
YW1wbGUgKGBoYXNCbG9ja2Agd2lsbCBiZSBgdHJ1ZWApOgorICAgICAgIGBgYGhicworICAgICAg
e3shIHRlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMgfX0KKyAgICAgICB7eyNmb28tYmFyfX0KKyAg
ICAgICAgSGkhCisgICAgICB7ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVzL2NvbXBv
bmVudHMvZm9vLWJhci5oYnMgfX0KKyAgICAgIHt7I2lmIGhhc0Jsb2NrfX0KKyAgICAgICAgVGhp
cyB3aWxsIGJlIHByaW50ZWQgYmVjYXVzZSBhIGJsb2NrIHdhcyBwcm92aWRlZAorICAgICAgICB7
e3lpZWxkfX0KKyAgICAgIHt7L2lmfX0KKyAgICAgIGBgYAorICAgICAgIFRoaXMgaGVscGVyIGFj
Y2VwdHMgYW4gYXJndW1lbnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYmxvY2sgd2Ugd2FudCB0byBj
aGVjayB0aGUgcHJlc2VuY2Ugb2YuCisgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcg
Zm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgb3B0aW9uYWwgaW52ZXJzZSBibG9jayBpbiBjb21wb25l
bnRzLgorICAgICAgIGBgYGhicworICAgICAge3shIHRlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMg
fX0KKyAgICAgICB7eyNmb28tYmFyfX0KKyAgICAgICAgSGkhCisgICAgICB7e2Vsc2V9fQorICAg
ICAgICBXaGF0J3MgdXA/CisgICAgICB7ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVz
L2NvbXBvbmVudHMvZm9vLWJhci5oYnMgfX0KKyAgICAgIHt7eWllbGR9fQorICAgICAge3sjaWYg
KGhhc0Jsb2NrICJpbnZlcnNlIil9fQorICAgICAgICB7e3lpZWxkIHRvPSJpbnZlcnNlIn19Cisg
ICAgICB7e2Vsc2V9fQorICAgICAgICBIb3cgYXJlIHlvdT8KKyAgICAgIHt7L2lmfX0KKyAgICAg
IGBgYAorICAgICAgIEBwdWJsaWMKKyAgICAgIEBwcm9wZXJ0eSBoYXNCbG9jaworICAgICAgQHBh
cmFtIHtTdHJpbmd9IFtibG9ja05hbWU9ImRlZmF1bHQiXSBUaGUgbmFtZSBvZiB0aGUgYmxvY2sg
dG8gY2hlY2sgcHJlc2VuY2Ugb2YuCisgICAgICBAcmV0dXJucyBCb29sZWFuCisgICAgICBAc2lu
Y2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgUmV0dXJucyB0cnVlIHdoZW4gdGhl
IGNvbXBvbmVudCB3YXMgaW52b2tlZCB3aXRoIGEgYmxvY2sgcGFyYW1ldGVyCisgICAgICBzdXBw
bGllZC4KKyAgICAgICBFeGFtcGxlIChgaGFzQmxvY2tQYXJhbXNgIHdpbGwgYmUgYGZhbHNlYCk6
CisgICAgICAgYGBgaGJzCisgICAgICB7eyEgdGVtcGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQor
ICAgICAgIHt7I2Zvby1iYXJ9fQorICAgICAgICBObyBibG9jayBwYXJhbWV0ZXIuCisgICAgICB7
ey9mb28tYmFyfX0KKyAgICAgICB7eyEgdGVtcGxhdGVzL2NvbXBvbmVudHMvZm9vLWJhci5oYnMg
fX0KKyAgICAgIHt7I2lmIGhhc0Jsb2NrUGFyYW1zfX0KKyAgICAgICAgVGhpcyB3aWxsIG5vdCBi
ZSBwcmludGVkLCBiZWNhdXNlIG5vIGJsb2NrIHdhcyBwcm92aWRlZAorICAgICAgICB7e3lpZWxk
IHRoaXN9fQorICAgICAge3svaWZ9fQorICAgICAgYGBgCisgICAgICAgRXhhbXBsZSAoYGhhc0Js
b2NrUGFyYW1zYCB3aWxsIGJlIGB0cnVlYCk6CisgICAgICAgYGBgaGJzCisgICAgICB7eyEgdGVt
cGxhdGVzL2FwcGxpY2F0aW9uLmhicyB9fQorICAgICAgIHt7I2Zvby1iYXIgYXMgfGZvb3x9fQor
ICAgICAgICBIaSEKKyAgICAgIHt7L2Zvby1iYXJ9fQorICAgICAgIHt7ISB0ZW1wbGF0ZXMvY29t
cG9uZW50cy9mb28tYmFyLmhicyB9fQorICAgICAge3sjaWYgaGFzQmxvY2tQYXJhbXN9fQorICAg
ICAgICBUaGlzIHdpbGwgYmUgcHJpbnRlZCBiZWNhdXNlIGEgYmxvY2sgd2FzIHByb3ZpZGVkCisg
ICAgICAgIHt7eWllbGQgdGhpc319CisgICAgICB7ey9pZn19CisgICAgICBgYGAKKyAgICAgIEBw
dWJsaWMKKyAgICAgIEBwcm9wZXJ0eSBoYXNCbG9ja1BhcmFtcworICAgICAgQHJldHVybnMgQm9v
bGVhbgorICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIEVuYWJs
ZXMgY29tcG9uZW50cyB0byB0YWtlIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cwor
ICAgICAgIEZvciBleGFtcGxlIGEgY29tcG9uZW50IHRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnMg
d2l0aCB0aGUgbmFtZXMKKyAgICAgIGBuYW1lYCBhbmQgYGFnZWA6CisgICAgICAgYGBgamF2YXNj
cmlwdAorICAgICAgbGV0IE15Q29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZDsKKyAg
ICAgIE15Q29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICAgICAgcG9zaXRpb25hbFBhcmFtczog
WyduYW1lJywgJ2FnZSddCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgIEl0IGNhbiB0aGVu
IGJlIGludm9rZWQgbGlrZSB0aGlzOgorICAgICAgIGBgYGhicworICAgICAge3tteS1jb21wb25l
bnQgIkpvaG4iIDM4fX0KKyAgICAgIGBgYAorICAgICAgIFRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBy
ZWZlcmVkIHRvIGp1c3QgbGlrZSBuYW1lZCBwYXJhbWV0ZXJzOgorICAgICAgIGBgYGhicworICAg
ICAgTmFtZToge3thdHRycy5uYW1lfX0sIEFnZToge3thdHRycy5hZ2V9fS4KKyAgICAgIGBgYAor
ICAgICAgIFVzaW5nIGEgc3RyaW5nIGluc3RlYWQgb2YgYW4gYXJyYXkgYWxsb3dzIGZvciBhbiBh
cmJpdHJhcnkgbnVtYmVyIG9mCisgICAgICBwYXJhbWV0ZXJzOgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIGxldCBNeUNvbXBvbmVudCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQ7CisgICAg
ICBNeUNvbXBvbmVudC5yZW9wZW5DbGFzcyh7CisgICAgICAgIHBvc2l0aW9uYWxQYXJhbXM6ICdu
YW1lcycKKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICAgSXQgY2FuIHRoZW4gYmUgaW52b2tl
ZCBsaWtlIHRoaXM6CisgICAgICAgYGBgaGJzCisgICAgICB7e215LWNvbXBvbmVudCAiSm9obiIg
Ik1pY2hhZWwiICJTY290dCJ9fQorICAgICAgYGBgCisgICAgICAgVGhlIHBhcmFtZXRlcnMgY2Fu
IHRoZW4gYmUgcmVmZXJlZCB0byBieSBlbnVtZXJhdGluZyBvdmVyIHRoZSBsaXN0OgorICAgICAg
IGBgYGhicworICAgICAge3sjZWFjaCBhdHRycy5uYW1lcyBhcyB8bmFtZXx9fXt7bmFtZX19e3sv
ZWFjaH19CisgICAgICBgYGAKKyAgICAgICBAc3RhdGljCisgICAgICBAcHVibGljCisgICAgICBA
cHJvcGVydHkgcG9zaXRpb25hbFBhcmFtcworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisK
KyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGVzIHBhc3NlZCBpbnRvIHRo
ZSBjb21wb25lbnQgaGF2ZSBiZWVuIHVwZGF0ZWQuCisgICAgICBDYWxsZWQgYm90aCBkdXJpbmcg
dGhlIGluaXRpYWwgcmVuZGVyIG9mIGEgY29udGFpbmVyIGFuZCBkdXJpbmcgYSByZXJlbmRlci4K
KyAgICAgIENhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIG9ic2VydmVyOyBjb2RlIHBsYWNlZCBo
ZXJlIHdpbGwgYmUgZXhlY3V0ZWQKKyAgICAgIGV2ZXJ5IHRpbWUgYW55IGF0dHJpYnV0ZSB1cGRh
dGVzLgorICAgICAgIEBtZXRob2QgZGlkUmVjZWl2ZUF0dHJzCisgICAgICBAcHVibGljCisgICAg
ICBAc2luY2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhl
IGF0dHJpYnV0ZXMgcGFzc2VkIGludG8gdGhlIGNvbXBvbmVudCBoYXZlIGJlZW4gdXBkYXRlZC4K
KyAgICAgIENhbGxlZCBib3RoIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgb2YgYSBjb250YWlu
ZXIgYW5kIGR1cmluZyBhIHJlcmVuZGVyLgorICAgICAgQ2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2Yg
YW4gb2JzZXJ2ZXI7IGNvZGUgcGxhY2VkIGhlcmUgd2lsbCBiZSBleGVjdXRlZAorICAgICAgZXZl
cnkgdGltZSBhbnkgYXR0cmlidXRlIHVwZGF0ZXMuCisgICAgICAgQGV2ZW50IGRpZFJlY2VpdmVB
dHRycworICAgICAgQHB1YmxpYworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAv
KioKKyAgICAgIENhbGxlZCBhZnRlciBhIGNvbXBvbmVudCBoYXMgYmVlbiByZW5kZXJlZCwgYm90
aCBvbiBpbml0aWFsIHJlbmRlciBhbmQKKyAgICAgIGluIHN1YnNlcXVlbnQgcmVyZW5kZXJzLgor
ICAgICAgIEBtZXRob2QgZGlkUmVuZGVyCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4x
My4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIGFmdGVyIGEgY29tcG9uZW50IGhh
cyBiZWVuIHJlbmRlcmVkLCBib3RoIG9uIGluaXRpYWwgcmVuZGVyIGFuZAorICAgICAgaW4gc3Vi
c2VxdWVudCByZXJlbmRlcnMuCisgICAgICAgQGV2ZW50IGRpZFJlbmRlcgorICAgICAgQHB1Ymxp
YworICAgICAgQHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIENhbGxlZCBi
ZWZvcmUgYSBjb21wb25lbnQgaGFzIGJlZW4gcmVuZGVyZWQsIGJvdGggb24gaW5pdGlhbCByZW5k
ZXIgYW5kCisgICAgICBpbiBzdWJzZXF1ZW50IHJlcmVuZGVycy4KKyAgICAgICBAbWV0aG9kIHdp
bGxSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5jZSAxLjEzLjAKKyAgICAqLworCisg
ICAgLyoqCisgICAgICBDYWxsZWQgYmVmb3JlIGEgY29tcG9uZW50IGhhcyBiZWVuIHJlbmRlcmVk
LCBib3RoIG9uIGluaXRpYWwgcmVuZGVyIGFuZAorICAgICAgaW4gc3Vic2VxdWVudCByZXJlbmRl
cnMuCisgICAgICAgQGV2ZW50IHdpbGxSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAgIEBzaW5j
ZSAxLjEzLjAKKyAgICAqLworCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiB0aGUgYXR0cmli
dXRlcyBwYXNzZWQgaW50byB0aGUgY29tcG9uZW50IGhhdmUgYmVlbiBjaGFuZ2VkLgorICAgICAg
Q2FsbGVkIG9ubHkgZHVyaW5nIGEgcmVyZW5kZXIsIG5vdCBkdXJpbmcgYW4gaW5pdGlhbCByZW5k
ZXIuCisgICAgICAgQG1ldGhvZCBkaWRVcGRhdGVBdHRycworICAgICAgQHB1YmxpYworICAgICAg
QHNpbmNlIDEuMTMuMAorICAgICovCisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBh
dHRyaWJ1dGVzIHBhc3NlZCBpbnRvIHRoZSBjb21wb25lbnQgaGF2ZSBiZWVuIGNoYW5nZWQuCisg
ICAgICBDYWxsZWQgb25seSBkdXJpbmcgYSByZXJlbmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFs
IHJlbmRlci4KKyAgICAgICBAZXZlbnQgZGlkVXBkYXRlQXR0cnMKKyAgICAgIEBwdWJsaWMKKyAg
ICAgIEBzaW5jZSAxLjEzLjAKKyAgICAqLworCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiB0
aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBhbmQgcmVyZW5kZXIgaXRzZWxmLgorICAg
ICAgQ2FsbGVkIG9ubHkgZHVyaW5nIGEgcmVyZW5kZXIsIG5vdCBkdXJpbmcgYW4gaW5pdGlhbCBy
ZW5kZXIuCisgICAgICAgQG1ldGhvZCB3aWxsVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBA
c2luY2UgMS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNv
bXBvbmVudCBpcyBhYm91dCB0byB1cGRhdGUgYW5kIHJlcmVuZGVyIGl0c2VsZi4KKyAgICAgIENh
bGxlZCBvbmx5IGR1cmluZyBhIHJlcmVuZGVyLCBub3QgZHVyaW5nIGFuIGluaXRpYWwgcmVuZGVy
LgorICAgICAgIEBldmVudCB3aWxsVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2Ug
MS4xMy4wCisgICAgKi8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVu
dCBoYXMgdXBkYXRlZCBhbmQgcmVyZW5kZXJlZCBpdHNlbGYuCisgICAgICBDYWxsZWQgb25seSBk
dXJpbmcgYSByZXJlbmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFsIHJlbmRlci4KKyAgICAgICBA
ZXZlbnQgZGlkVXBkYXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMy4wCisgICAg
Ki8KKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgdXBkYXRl
ZCBhbmQgcmVyZW5kZXJlZCBpdHNlbGYuCisgICAgICBDYWxsZWQgb25seSBkdXJpbmcgYSByZXJl
bmRlciwgbm90IGR1cmluZyBhbiBpbml0aWFsIHJlbmRlci4KKyAgICAgICBAZXZlbnQgZGlkVXBk
YXRlCisgICAgICBAcHVibGljCisgICAgICBAc2luY2UgMS4xMy4wCisgICAgKi8KKyAgfSk7CisK
KyAgQ29tcG9uZW50LnJlb3BlbkNsYXNzKHsKKyAgICBpc0NvbXBvbmVudEZhY3Rvcnk6IHRydWUK
KyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQ29tcG9uZW50OworfSk7CitlbmlmZWQoJ2Vt
YmVyLXZpZXdzL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyLXJ1bnRpbWUnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2pxdWVyeScsICdlbWJlci12aWV3cy9zeXN0ZW0vdXRpbHMnLCAnZW1iZXItdmll
d3Mvc3lzdGVtL2V4dCcsICdlbWJlci1tZXRhbC12aWV3cycsICdlbWJlci12aWV3cy9jb21wb25l
bnRzL2NvbXBvbmVudCcsICdlbWJlci12aWV3cy9zeXN0ZW0vZXZlbnRfZGlzcGF0Y2hlcicsICdl
bWJlci12aWV3cy9taXhpbnMvdmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQnLCAnZW1iZXItdmll
d3MvY29tcG9uZW50X2xvb2t1cCcsICdlbWJlci12aWV3cy92aWV3cy9jaGVja2JveCcsICdlbWJl
ci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3RleHRfZmll
bGQnLCAnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9hcmVhJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJSdW50aW1lLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyVmlld3NTeXN0ZW1V
dGlscywgX2VtYmVyVmlld3NTeXN0ZW1FeHQsIF9lbWJlck1ldGFsVmlld3MsIF9lbWJlclZpZXdz
Q29tcG9uZW50c0NvbXBvbmVudCwgX2VtYmVyVmlld3NTeXN0ZW1FdmVudF9kaXNwYXRjaGVyLCBf
ZW1iZXJWaWV3c01peGluc1ZpZXdfdGFyZ2V0X2FjdGlvbl9zdXBwb3J0LCBfZW1iZXJWaWV3c0Nv
bXBvbmVudF9sb29rdXAsIF9lbWJlclZpZXdzVmlld3NDaGVja2JveCwgX2VtYmVyVmlld3NNaXhp
bnNUZXh0X3N1cHBvcnQsIF9lbWJlclZpZXdzVmlld3NUZXh0X2ZpZWxkLCBfZW1iZXJWaWV3c1Zp
ZXdzVGV4dF9hcmVhKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1i
ZXItdmlld3MKKyAgKi8KKworICAvLyBCRUdJTiBJTVBPUlRTCisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvLyBFTkQgSU1QT1JUUworCisgIC8qKgorICAgIEFsaWFzIGZvciBqUXVlcnkKKyAgCisgICAg
QG1ldGhvZCAkCisgICAgQGZvciBFbWJlcgorICAgQHB1YmxpYworICAqLworCisgIC8vIEJFR0lO
IEVYUE9SVFMKKyAgX2VtYmVyUnVudGltZS5kZWZhdWx0LiQgPSBfZW1iZXJWaWV3c1N5c3RlbUpx
dWVyeS5kZWZhdWx0OworCisgIF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5WaWV3VGFyZ2V0QWN0aW9u
U3VwcG9ydCA9IF9lbWJlclZpZXdzTWl4aW5zVmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQuZGVm
YXVsdDsKKworICB2YXIgVmlld1V0aWxzID0gX2VtYmVyUnVudGltZS5kZWZhdWx0LlZpZXdVdGls
cyA9IHt9OworICBWaWV3VXRpbHMuaXNTaW1wbGVDbGljayA9IF9lbWJlclZpZXdzU3lzdGVtVXRp
bHMuaXNTaW1wbGVDbGljazsKKyAgVmlld1V0aWxzLmdldFZpZXdDbGllbnRSZWN0cyA9IF9lbWJl
clZpZXdzU3lzdGVtVXRpbHMuZ2V0Vmlld0NsaWVudFJlY3RzOworICBWaWV3VXRpbHMuZ2V0Vmll
d0JvdW5kaW5nQ2xpZW50UmVjdCA9IF9lbWJlclZpZXdzU3lzdGVtVXRpbHMuZ2V0Vmlld0JvdW5k
aW5nQ2xpZW50UmVjdDsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuX1JlbmRlcmVyID0gX2Vt
YmVyTWV0YWxWaWV3cy5SZW5kZXJlcjsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuQ2hlY2ti
b3ggPSBfZW1iZXJWaWV3c1ZpZXdzQ2hlY2tib3guZGVmYXVsdDsKKyAgX2VtYmVyUnVudGltZS5k
ZWZhdWx0LlRleHRGaWVsZCA9IF9lbWJlclZpZXdzVmlld3NUZXh0X2ZpZWxkLmRlZmF1bHQ7Cisg
IF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5UZXh0QXJlYSA9IF9lbWJlclZpZXdzVmlld3NUZXh0X2Fy
ZWEuZGVmYXVsdDsKKworICBfZW1iZXJSdW50aW1lLmRlZmF1bHQuVGV4dFN1cHBvcnQgPSBfZW1i
ZXJWaWV3c01peGluc1RleHRfc3VwcG9ydC5kZWZhdWx0OworICBfZW1iZXJSdW50aW1lLmRlZmF1
bHQuQ29tcG9uZW50TG9va3VwID0gX2VtYmVyVmlld3NDb21wb25lbnRfbG9va3VwLmRlZmF1bHQ7
CisgIF9lbWJlclJ1bnRpbWUuZGVmYXVsdC5Db21wb25lbnQgPSBfZW1iZXJWaWV3c0NvbXBvbmVu
dHNDb21wb25lbnQuZGVmYXVsdDsKKyAgX2VtYmVyUnVudGltZS5kZWZhdWx0LkV2ZW50RGlzcGF0
Y2hlciA9IF9lbWJlclZpZXdzU3lzdGVtRXZlbnRfZGlzcGF0Y2hlci5kZWZhdWx0OworCisgIC8v
IEVORCBFWFBPUlRTCisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGltZS5kZWZhdWx0
OworfSk7CisvLyBmb3IgdGhlIHNpZGUgZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5ydW4ucXVl
dWVzCitlbmlmZWQoJ2VtYmVyLXZpZXdzL21peGlucy9hcmlhX3JvbGVfc3VwcG9ydCcsIFsnZXhw
b3J0cycsICdlbWJlci1tZXRhbC9taXhpbiddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxNaXhpbikgeworICAvKioKKyAgIEBtb2R1bGUgZW1iZXIKKyAgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgICBAY2xhc3MgQXJpYVJv
bGVTdXBwb3J0CisgICBAbmFtZXNwYWNlIEVtYmVyCisgICBAcHJpdmF0ZQorICAqLworICBleHBv
cnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnYXJpYVJvbGU6cm9sZSddLAorCisgICAgLyoqCisgICAgIFRoZSBXQUkt
QVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5IHRoaXMgdmlldy4gRm9yIGV4
YW1wbGUsIGEKKyAgICAgYnV0dG9uIG1heSBoYXZlIGEgcm9sZSBvZiB0eXBlICdidXR0b24nLCBv
ciBhIHBhbmUgbWF5IGhhdmUgYSByb2xlIG9mCisgICAgIHR5cGUgJ2FsZXJ0ZGlhbG9nJy4gVGhp
cyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSBzb2Z0d2FyZSB0byBoZWxwCisgICAgIHZp
c3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUgcmljaCB3ZWIgYXBwbGljYXRpb25zLgor
ICAgICAgVGhlIGZ1bGwgbGlzdCBvZiB2YWxpZCBXQUktQVJJQSByb2xlcyBpcyBhdmFpbGFibGUg
YXQ6CisgICAgIFtodHRwOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRl
Z29yaXphdGlvbl0oaHR0cDovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvcm9sZXMjcm9sZXNfY2F0
ZWdvcml6YXRpb24pCisgICAgICBAcHJvcGVydHkgYXJpYVJvbGUKKyAgICAgQHR5cGUgU3RyaW5n
CisgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgQHB1YmxpYworICAgICovCisgICAgYXJpYVJvbGU6
IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVz
X3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwv
bWl4aW4nLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vbmF0aXZlX2FycmF5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1l
U3lzdGVtTmF0aXZlX2FycmF5KSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1
bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBFTVBUWV9BUlJB
WSA9IFtdOworCisgIC8qKgorICAgIEBjbGFzcyBDbGFzc05hbWVzU3VwcG9ydAorICAgIEBuYW1l
c3BhY2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1i
ZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgY29uY2F0ZW5hdGVkUHJvcGVydGllczog
WydjbGFzc05hbWVzJywgJ2NsYXNzTmFtZUJpbmRpbmdzJ10sCisKKyAgICBpbml0OiBmdW5jdGlv
biAoKSB7CisgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAg
ICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnT25seSBhcnJheXMgYXJlIGFsbG93ZWQgZm9yIFwn
Y2xhc3NOYW1lQmluZGluZ3NcJycsIEFycmF5LmlzQXJyYXkodGhpcy5jbGFzc05hbWVCaW5kaW5n
cykpOworICAgICAgdGhpcy5jbGFzc05hbWVCaW5kaW5ncyA9IF9lbWJlclJ1bnRpbWVTeXN0ZW1O
YXRpdmVfYXJyYXkuQSh0aGlzLmNsYXNzTmFtZUJpbmRpbmdzLnNsaWNlKCkpOworCisgICAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnT25seSBhcnJheXMgb2Ygc3RhdGljIGNsYXNzIHN0cmlu
Z3MgYXJlIGFsbG93ZWQgZm9yIFwnY2xhc3NOYW1lc1wnLiBGb3IgZHluYW1pYyBjbGFzc2VzLCB1
c2UgXCdjbGFzc05hbWVCaW5kaW5nc1wnLicsIEFycmF5LmlzQXJyYXkodGhpcy5jbGFzc05hbWVz
KSk7CisgICAgICB0aGlzLmNsYXNzTmFtZXMgPSBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2Fy
cmF5LkEodGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IFN0YW5kYXJkIENTUyBjbGFzcyBuYW1lcyB0byBhcHBseSB0byB0aGUgdmlldydzIG91dGVyIGVs
ZW1lbnQuIFRoaXMKKyAgICAgIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkgaW5oZXJpdHMgYW55IGNs
YXNzIG5hbWVzIGRlZmluZWQgYnkgdGhlIHZpZXcncworICAgICAgc3VwZXJjbGFzc2VzIGFzIHdl
bGwuCisgICAgICAgQHByb3BlcnR5IGNsYXNzTmFtZXMKKyAgICAgIEB0eXBlIEFycmF5CisgICAg
ICBAZGVmYXVsdCBbJ2VtYmVyLXZpZXcnXQorICAgICAgQHB1YmxpYworICAgICovCisgICAgY2xh
c3NOYW1lczogWydlbWJlci12aWV3J10sCisKKyAgICAvKioKKyAgICAgIEEgbGlzdCBvZiBwcm9w
ZXJ0aWVzIG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGNsYXNzIG5hbWVzLiBJZiB0aGUgcHJvcGVy
dHkKKyAgICAgIGlzIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhhdCBzdHJpbmcgd2ls
bCBiZSBhcHBsaWVkIGFzIGEgY2xhc3MKKyAgICAgIG5hbWUuCisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgLy8gQXBwbGllcyB0aGUgJ2hpZ2gnIGNsYXNzIHRvIHRoZSB2aWV3IGVsZW1lbnQK
KyAgICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
cHJpb3JpdHknXSwKKyAgICAgICAgcHJpb3JpdHk6ICdoaWdoJworICAgICAgfSk7CisgICAgICBg
YGAKKyAgICAgICBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGEgQm9vbGVhbiwgdGhl
IG5hbWUgb2YgdGhhdCBwcm9wZXJ0eSBpcworICAgICAgYWRkZWQgYXMgYSBkYXNoZXJpemVkIGNs
YXNzIG5hbWUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgLy8gQXBwbGllcyB0aGUgJ2lz
LXVyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAorICAgICAgRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc1VyZ2VudCddLAorICAgICAgICBp
c1VyZ2VudDogdHJ1ZQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBJZiB5b3Ugd291bGQg
cHJlZmVyIHRvIHVzZSBhIGN1c3RvbSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkYXNoZXJpemVkCisg
ICAgICBwcm9wZXJ0eSBuYW1lLCB5b3UgY2FuIHBhc3MgYSBiaW5kaW5nIGxpa2UgdGhpczoKKyAg
ICAgICBgYGBqYXZhc2NyaXB0CisgICAgICAvLyBBcHBsaWVzIHRoZSAndXJnZW50JyBjbGFzcyB0
byB0aGUgdmlldyBlbGVtZW50CisgICAgICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50OnVyZ2VudCddLAorICAgICAgICBpc1VyZ2VudDog
dHJ1ZQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUaGlzIGxpc3Qgb2YgcHJvcGVydGll
cyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgdmlldydzIHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgorICAg
ICAgIEBwcm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncworICAgICAgQHR5cGUgQXJyYXkKKyAgICAg
IEBkZWZhdWx0IFtdCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBjbGFzc05hbWVCaW5kaW5n
czogRU1QVFlfQVJSQVkKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3MvbWl4aW5zL2lu
c3RydW1lbnRhdGlvbl9zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJywg
J2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0
YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQpIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1i
ZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisKKyAg
LyoqCisgICAgQGNsYXNzIEluc3RydW1lbnRhdGlvblN1cHBvcnQKKyAgICBAbmFtZXNwYWNlIEVt
YmVyCisgICAgQHB1YmxpYworICAqLworICB2YXIgSW5zdHJ1bWVudGF0aW9uU3VwcG9ydCA9IF9l
bWJlck1ldGFsTWl4aW4uTWl4aW4uY3JlYXRlKHsKKyAgICAvKioKKyAgICAgIFVzZWQgdG8gaWRl
bnRpZnkgdGhpcyB2aWV3IGR1cmluZyBkZWJ1Z2dpbmcKKyAgICAgICBAcHJvcGVydHkgaW5zdHJ1
bWVudERpc3BsYXkKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisg
ICAgaW5zdHJ1bWVudERpc3BsYXk6ICcnLAorCisgICAgaW5zdHJ1bWVudE5hbWU6ICd2aWV3JywK
KworICAgIGluc3RydW1lbnREZXRhaWxzOiBmdW5jdGlvbiAoaGFzaCkgeworICAgICAgaGFzaC50
ZW1wbGF0ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGVtcGxhdGVOYW1l
Jyk7CisgICAgICB0aGlzLl9zdXBlcihoYXNoKTsKKyAgICB9CisgIH0pOworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IEluc3RydW1lbnRhdGlvblN1cHBvcnQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmll
d3MvbWl4aW5zL2xlZ2FjeV9jaGlsZF92aWV3c19zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9zZXQnLCAnY29udGFpbmVyL293bmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1i
ZXJNZXRhbE1peGluLCBfZW1iZXJNZXRhbFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9zZXQsIF9jb250YWluZXJPd25lcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5k
ZWZhdWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIGxpbmtDaGlsZDog
ZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBpZiAoIWluc3RhbmNlW19jb250YWluZXJPd25l
ci5PV05FUl0pIHsKKyAgICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKGluc3RhbmNlLCBf
Y29udGFpbmVyT3duZXIuZ2V0T3duZXIodGhpcykpOworICAgICAgfQorCisgICAgICBpZiAoX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGluc3RhbmNlLCAncGFyZW50VmlldycpICE9PSB0aGlz
KSB7CisgICAgICAgIC8vIGxpbmtDaGlsZCBzaG91bGQgYmUgaWRlbXBvdGVudAorICAgICAgICBf
ZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQoaW5zdGFuY2UsICdwYXJlbnRWaWV3JywgdGhpcyk7
CisgICAgICAgIGluc3RhbmNlLnRyaWdnZXIoJ3BhcmVudFZpZXdEaWRDaGFuZ2UnKTsKKyAgICAg
IH0KKyAgICAgIGluc3RhbmNlLm93bmVyVmlldyA9IHRoaXMub3duZXJWaWV3OworICAgIH0sCisK
KyAgICB1bmxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBfZW1iZXJNZXRh
bFByb3BlcnR5X3NldC5zZXQoaW5zdGFuY2UsICdwYXJlbnRWaWV3JywgbnVsbCk7CisgICAgICBp
bnN0YW5jZS50cmlnZ2VyKCdwYXJlbnRWaWV3RGlkQ2hhbmdlJyk7CisgICAgfQorICB9KTsKK30p
OworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvbGVnYWN5X3ZpZXdfc3VwcG9ydCcsIFsnZXhw
b3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9taXhpbicsICdlbWJlci1t
ZXRhbC9wcm9wZXJ0eV9nZXQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcs
IF9lbWJlck1ldGFsTWl4aW4sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0KSB7CisgIC8qKgorICBA
bW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJp
Y3QnOworCisgIC8qKgorICAgIEBjbGFzcyBMZWdhY3lWaWV3U3VwcG9ydAorICAgIEBuYW1lc3Bh
Y2UgRW1iZXIKKyAgICBAcHJpdmF0ZQorICAqLworICB2YXIgTGVnYWN5Vmlld1N1cHBvcnQgPSBf
ZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAgbXV0YXRlQ2hpbGRWaWV3czogZnVu
Y3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgY2hpbGRWaWV3cyA9IF9lbWJlck1ldGFsUHJv
cGVydHlfZ2V0LmdldCh0aGlzLCAnY2hpbGRWaWV3cycpOworICAgICAgdmFyIGlkeCA9IGNoaWxk
Vmlld3MubGVuZ3RoOworICAgICAgdmFyIHZpZXc7CisKKyAgICAgIHdoaWxlICgtLWlkeCA+PSAw
KSB7CisgICAgICAgIHZpZXcgPSBjaGlsZFZpZXdzW2lkeF07CisgICAgICAgIGNhbGxiYWNrKHRo
aXMsIHZpZXcsIGlkeCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgIFJlbW92ZXMgYWxsIGNoaWxkcmVuIGZyb20gdGhlIGBwYXJlbnRWaWV3
YC4KKyAgICAgICBAbWV0aG9kIHJlbW92ZUFsbENoaWxkcmVuCisgICAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSByZWNlaXZlcgorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHJlbW92ZUFsbENo
aWxkcmVuOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdz
KGZ1bmN0aW9uIChwYXJlbnRWaWV3LCB2aWV3KSB7CisgICAgICAgIHBhcmVudFZpZXcucmVtb3Zl
Q2hpbGQodmlldyk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgZGVzdHJveUFsbENoaWxkcmVu
OiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0
aW9uIChwYXJlbnRWaWV3LCB2aWV3KSB7CisgICAgICAgIHZpZXcuZGVzdHJveSgpOworICAgICAg
fSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9y
IHdob3NlIHBhcmVudCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAgYGtsYXNzYC4KKyAgICAgICBA
bWV0aG9kIG5lYXJlc3RDaGlsZE9mCisgICAgICBAcGFyYW0ge0NsYXNzfSBrbGFzcyBTdWJjbGFz
cyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5WaWV3IGl0c2VsZikKKyAgICAgIEByZXR1cm4gRW1i
ZXIuVmlldworICAgICAgQGRlcHJlY2F0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBu
ZWFyZXN0Q2hpbGRPZjogZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVn
LmRlcHJlY2F0ZSgnbmVhcmVzdENoaWxkT2YgaGFzIGJlZW4gZGVwcmVjYXRlZC4nLCBmYWxzZSwg
eyBpZDogJ2VtYmVyLXZpZXdzLm5lYXJlc3QtY2hpbGQtb2YnLCB1bnRpbDogJzMuMC4wJyB9KTsK
KworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3Bh
cmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYgKF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAncGFyZW50VmlldycpIGluc3RhbmNlb2Yga2xhc3Mp
IHsKKyAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQorICAgICAgICB2aWV3ID0gX2Vt
YmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7CisgICAgICB9Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQg
aXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkCisgICAgICBjbGFzcy4KKyAgICAgICBAbWV0
aG9kIG5lYXJlc3RJbnN0YW5jZU9mCisgICAgICBAcGFyYW0ge0NsYXNzfSBrbGFzcyBTdWJjbGFz
cyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5WaWV3IGl0c2VsZikKKyAgICAgIEByZXR1cm4gRW1i
ZXIuVmlldworICAgICAgQGRlcHJlY2F0ZWQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBu
ZWFyZXN0SW5zdGFuY2VPZjogZnVuY3Rpb24gKGtsYXNzKSB7CisgICAgICBfZW1iZXJNZXRhbERl
YnVnLmRlcHJlY2F0ZSgnbmVhcmVzdEluc3RhbmNlT2YgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBi
ZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBVc2UgbmVhcmVzdE9mVHlwZS4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLXZpZXdzLm5lYXJlc3QtaW5zdGFuY2Utb2YnLCB1bnRpbDogJzMuMC4w
JyB9KTsKKworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhp
cywgJ3BhcmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYgKHZp
ZXcgaW5zdGFuY2VvZiBrbGFzcykgeworICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9
CisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ3BhcmVu
dFZpZXcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBJZiBhIHZhbHVlIHRo
YXQgYWZmZWN0cyB0ZW1wbGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhlIHZpZXcgc2hvdWxkIGJl
CisgICAgICByZS1yZW5kZXJlZCB0byByZWZsZWN0IHRoZSBuZXcgdmFsdWUuCisgICAgICAgQG1l
dGhvZCBfY29udGV4dERpZENoYW5nZQorICAgICAgQHByaXZhdGUKKyAgICAgIEBwcml2YXRlCisg
ICAgKi8KKyAgICBfY29udGV4dERpZENoYW5nZTogX2VtYmVyTWV0YWxNaXhpbi5vYnNlcnZlcign
Y29udGV4dCcsIGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMucmVyZW5kZXIoKTsKKyAgICB9KQor
ICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBMZWdhY3lWaWV3U3VwcG9ydDsKK30pOworZW5p
ZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdGVtcGxhdGVfcmVuZGVyaW5nX3N1cHBvcnQnLCBbJ2V4
cG9ydHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsTWl4aW4pIHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12
aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisKKyAgLy8gQ2lyY3VsYXIgZGVwCisgIHZhciBf
cmVuZGVyVmlldzsKKworICAvKioKKyAgICBAY2xhc3MgVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBwcml2YXRlCisgICovCisgIHZhciBUZW1wbGF0
ZVJlbmRlcmluZ1N1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZSh7CisgICAg
LyoqCisgICAgICBDYWxsZWQgb24geW91ciB2aWV3IHdoZW4gaXQgc2hvdWxkIHB1c2ggc3RyaW5n
cyBvZiBIVE1MIGludG8gYQorICAgICAgYEVtYmVyLlJlbmRlckJ1ZmZlcmAuIE1vc3QgdXNlcnMg
d2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZSBgdGVtcGxhdGVgCisgICAgICBvciBgdGVtcGxhdGVO
YW1lYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgQnkgZGVmYXVs
dCwgYEVtYmVyLlZpZXdgIHdpbGwgbG9vayBmb3IgYSBmdW5jdGlvbiBpbiB0aGUgYHRlbXBsYXRl
YAorICAgICAgcHJvcGVydHkgYW5kIGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBvZiBgY29udGV4
dGAuIFRoZSB2YWx1ZSBvZgorICAgICAgYGNvbnRleHRgIHdpbGwgYmUgdGhlIHZpZXcncyBjb250
cm9sbGVyIHVubGVzcyB5b3Ugb3ZlcnJpZGUgaXQuCisgICAgICAgQG1ldGhvZCByZW5kZXJCbG9j
aworICAgICAgQHBhcmFtIHtFbWJlci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlciBUaGUgcmVuZGVyIGJ1
ZmZlcgorICAgICAgQHByaXZhdGUKKyAgICAqLworCisgICAgcmVuZGVyQmxvY2s6IGZ1bmN0aW9u
IChibG9jaywgcmVuZGVyTm9kZSkgeworICAgICAgaWYgKF9yZW5kZXJWaWV3ID09PSB1bmRlZmlu
ZWQpIHsKKyAgICAgICAgX3JlbmRlclZpZXcgPSByZXF1aXJlKCdlbWJlci1odG1sYmFycy9zeXN0
ZW0vcmVuZGVyLXZpZXcnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9yZW5kZXJWaWV3LnJl
bmRlckhUTUxCYXJzQmxvY2sodGhpcywgYmxvY2ssIHJlbmRlck5vZGUpOworICAgIH0KKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0OworfSk7Citl
bmlmZWQoJ2VtYmVyLXZpZXdzL21peGlucy90ZXh0X3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X3NldCcsICdlbWJl
ci1tZXRhbC9taXhpbicsICdlbWJlci1ydW50aW1lL21peGlucy90YXJnZXRfYWN0aW9uX3N1cHBv
cnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJN
ZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVudGltZU1peGluc1Rh
cmdldF9hY3Rpb25fc3VwcG9ydCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9k
dWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBLRVlfRVZF
TlRTID0geworICAgIDEzOiAnaW5zZXJ0TmV3bGluZScsCisgICAgMjc6ICdjYW5jZWwnCisgIH07
CisKKyAgLyoqCisgICAgYFRleHRTdXBwb3J0YCBpcyBhIHNoYXJlZCBtaXhpbiB1c2VkIGJ5IGJv
dGggYEVtYmVyLlRleHRGaWVsZGAgYW5kCisgICAgYEVtYmVyLlRleHRBcmVhYC4gYFRleHRTdXBw
b3J0YCBhZGRzIGEgbnVtYmVyIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyB5b3UgdG8KKyAgICBzcGVj
aWZ5IGEgY29udHJvbGxlciBhY3Rpb24gdG8gaW52b2tlIHdoZW4gYSBjZXJ0YWluIGV2ZW50IGlz
IGZpcmVkIG9uIHlvdXIKKyAgICB0ZXh0IGZpZWxkIG9yIHRleHRhcmVhLiBUaGUgc3BlY2lmZWQg
Y29udHJvbGxlciBhY3Rpb24gd291bGQgZ2V0IHRoZSBjdXJyZW50CisgICAgdmFsdWUgb2YgdGhl
IGZpZWxkIHBhc3NlZCBpbiBhcyB0aGUgb25seSBhcmd1bWVudCB1bmxlc3MgdGhlIHZhbHVlIG9m
CisgICAgdGhlIGZpZWxkIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIHRoZSBpbnN0YW5jZSBvZiB0
aGUgZmllbGQgaXRzZWxmIGlzIHBhc3NlZAorICAgIGluIGFzIHRoZSBvbmx5IGFyZ3VtZW50Lgor
ICAKKyAgICBMZXQncyB1c2UgdGhlIHByZXNzaW5nIG9mIHRoZSBlc2NhcGUga2V5IGFzIGFuIGV4
YW1wbGUuIElmIHlvdSB3YW50ZWQgdG8KKyAgICBpbnZva2UgYSBjb250cm9sbGVyIGFjdGlvbiB3
aGVuIGEgdXNlciBwcmVzc2VzIHRoZSBlc2NhcGUga2V5IHdoaWxlIG9uIHlvdXIKKyAgICBmaWVs
ZCwgeW91IHdvdWxkIHVzZSB0aGUgYGVzY2FwZS1wcmVzc2AgYXR0cmlidXRlIG9uIHlvdXIgZmll
bGQgbGlrZSBzbzoKKyAgCisgICAgYGBgaGFuZGxlYmFycworICAgICAge3shIGFwcGxpY2F0aW9u
Lmhic319CisgIAorICAgICAge3tpbnB1dCBlc2NhcGUtcHJlc3M9J2FsZXJ0VXNlcid9fQorICAg
IGBgYAorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0
aW9uLmNyZWF0ZSgpOworICAKKyAgICAgICAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVt
YmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICAgICAgICBhY3Rpb25zOiB7CisgICAgICAgICAg
ICBhbGVydFVzZXI6IGZ1bmN0aW9uICggY3VycmVudFZhbHVlICkgeworICAgICAgICAgICAgICBh
bGVydCggJ2VzY2FwZSBwcmVzc2VkLCBjdXJyZW50IHZhbHVlOiAnICsgY3VycmVudFZhbHVlICk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBgYGAKKyAgCisg
ICAgVGhlIGZvbGxvd2luZyBjaGFydCBpcyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB3aGF0
IHRha2VzIHBsYWNlIHdoZW4gdGhlCisgICAgZXNjYXBlIGtleSBpcyBwcmVzc2VkIGluIHRoaXMg
c2NlbmFyaW86CisgIAorICAgIGBgYAorICAgIFRoZSBUZW1wbGF0ZQorICAgICstLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAg
ICB8IGVzY2FwZS1wcmVzcz0nYWxlcnRVc2VyJyAgfAorICAgIHwgICAgICAgICAgICAgICAgICAg
ICAgICAgICB8ICAgICAgICAgIFRleHRTdXBwb3J0IE1peGluCisgICAgKy0tLS0rLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSsgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r
CisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYW5jZWwgbWV0
aG9kICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8ICAgICAgZXNjYXBlIGJ1dHRvbiBwcmVz
c2VkICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICArLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfCBjaGVja3MgZm9yIHRoZSBgZXNjYXBlLXBy
ZXNzYCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhdHRy
aWJ1dGUgYW5kIHB1bGxzIG91dCB0aGUgICB8CisgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSsgfCBgYWxlcnRVc2VyYCB2YWx1ZSAgICAgICAgICAgICB8CisgICAgICAg
ICB8ICAgICBhY3Rpb24gbmFtZSAnYWxlcnRVc2VyJyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0rCisgICAgICAgICB8ICAgICBzZW50IHRvIGNvbnRyb2xsZXIKKyAgICAgICAg
IHYKKyAgICBDb250cm9sbGVyCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSArCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisgICAgfCAgYWN0aW9uczogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8
CisgICAgfCAgICAgYWxlcnRVc2VyOiBmdW5jdGlvbiggY3VycmVudFZhbHVlICl7ICB8CisgICAg
fCAgICAgICBhbGVydCggJ3RoZSBlc2Mga2V5IHdhcyBwcmVzc2VkIScgKSB8CisgICAgfCAgICAg
fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgfSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgYGBgCisgIAorICAgIEhlcmUgYXJlIHRoZSBldmVu
dHMgdGhhdCB3ZSBjdXJyZW50bHkgc3VwcG9ydCBhbG9uZyB3aXRoIHRoZSBuYW1lIG9mIHRoZQor
ICAgIGF0dHJpYnV0ZSB5b3Ugd291bGQgbmVlZCB0byB1c2Ugb24geW91ciBmaWVsZC4gVG8gcmVp
dGVyYXRlLCB5b3Ugd291bGQgdXNlIHRoZQorICAgIGF0dHJpYnV0ZSBuYW1lIGxpa2Ugc286Cisg
IAorICAgIGBgYGhhbmRsZWJhcnMKKyAgICAgIHt7aW5wdXQgYXR0cmlidXRlLW5hbWU9J2NvbnRy
b2xsZXJBY3Rpb24nfX0KKyAgICBgYGAKKyAgCisgICAgYGBgCisgICAgKy0tLS0tLS0tLS0tLS0t
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAg
ICAgICAgICAgICB8CisgICAgfCBldmVudCAgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgbmFtZSB8
CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBuZXcg
bGluZSBpbnNlcnRlZCAgfCBpbnNlcnQtbmV3bGluZSB8CisgICAgfCAgICAgICAgICAgICAgICAg
ICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBlbnRlciBrZXkgcHJlc3NlZCAgfCBpbnNlcnQt
bmV3bGluZSB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cisg
ICAgfCBjYW5jZWwga2V5IHByZXNzZWQgfCBlc2NhcGUtcHJlc3MgICB8CisgICAgfCAgICAgICAg
ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBmb2N1c2luICAgICAgICAgICAg
fCBmb2N1cy1pbiAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg
ICAgICB8CisgICAgfCBmb2N1c291dCAgICAgICAgICAgfCBmb2N1cy1vdXQgICAgICB8CisgICAg
fCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBrZXlwcmVzcyAg
ICAgICAgICAgfCBrZXktcHJlc3MgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAg
ICAgICAgICAgICAgICB8CisgICAgfCBrZXl1cCAgICAgICAgICAgICAgfCBrZXktdXAgICAgICAg
ICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgfCBr
ZXlkb3duICAgICAgICAgICAgfCBrZXktZG93biAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0t
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgYGBgCisgIAorICAgIEBjbGFzcyBUZXh0U3Vw
cG9ydAorICAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgICBAdXNlcyBFbWJlci5UYXJnZXRBY3Rpb25T
dXBwb3J0CisgICAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KKyAgICBAcHJpdmF0ZQorICAqLworICB2
YXIgVGV4dFN1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShfZW1iZXJSdW50
aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9zdXBwb3J0LmRlZmF1bHQsIHsKKyAgICB2YWx1ZTogJycs
CisKKyAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydhdXRvY2FwaXRhbGl6ZScsICdhdXRvY29ycmVj
dCcsICdhdXRvZm9jdXMnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdtYXhsZW5ndGgnLCAncGxhY2Vo
b2xkZXInLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnc2VsZWN0aW9uRGlyZWN0aW9uJywgJ3Nw
ZWxsY2hlY2snLCAndGFiaW5kZXgnLCAndGl0bGUnXSwKKyAgICBwbGFjZWhvbGRlcjogbnVsbCwK
KyAgICBkaXNhYmxlZDogZmFsc2UsCisgICAgbWF4bGVuZ3RoOiBudWxsLAorCisgICAgaW5pdDog
ZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
KyAgICAgIHRoaXMub24oJ3Bhc3RlJywgdGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdl
KTsKKyAgICAgIHRoaXMub24oJ2N1dCcsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5n
ZSk7CisgICAgICB0aGlzLm9uKCdpbnB1dCcsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENo
YW5nZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdo
ZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleS4KKyAgICAgICBUaGlzIGlzIHNpbWls
YXIgdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBmaXJlZCB3aGVuCisgICAgICB0
aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5IHdoZW4gZWRpdGluZyBhIHRleHQgZmllbGQs
IGFuZCBzZW5kcworICAgICAgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBhcyB0aGUgY29udGV4dC4K
KyAgICAgICBAcHJvcGVydHkgYWN0aW9uCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZh
dWx0IG51bGwKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhY3Rpb246IG51bGwsCisKKyAg
ICAvKioKKyAgICAgIFRoZSBldmVudCB0aGF0IHNob3VsZCBzZW5kIHRoZSBhY3Rpb24uCisgICAg
ICAgT3B0aW9ucyBhcmU6CisgICAgICAgKiBgZW50ZXJgOiB0aGUgdXNlciBwcmVzc2VkIGVudGVy
CisgICAgICAqIGBrZXlQcmVzc2A6IHRoZSB1c2VyIHByZXNzZWQgYSBrZXkKKyAgICAgICBAcHJv
cGVydHkgb25FdmVudAorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBlbnRlcgor
ICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIG9uRXZlbnQ6ICdlbnRlcicsCisKKyAgICAvKioK
KyAgICAgIFdoZXRoZXIgdGhlIGBrZXlVcGAgZXZlbnQgdGhhdCB0cmlnZ2VycyBhbiBgYWN0aW9u
YCB0byBiZSBzZW50IGNvbnRpbnVlcworICAgICAgcHJvcGFnYXRpbmcgdG8gb3RoZXIgdmlld3Mu
CisgICAgICAgQnkgZGVmYXVsdCwgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5
IG9uIHRoZWlyIGtleWJvYXJkIGFuZAorICAgICAgdGhlIHRleHQgZmllbGQgaGFzIGFuIGBhY3Rp
b25gIHNldCwgdGhlIGFjdGlvbiB3aWxsIGJlIHNlbnQgdG8gdGhlIHZpZXcncworICAgICAgY29u
dHJvbGxlciBhbmQgdGhlIGtleSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcuCisgICAgICAg
SWYgeW91IHdvdWxkIGxpa2UgcGFyZW50IHZpZXdzIHRvIHJlY2VpdmUgdGhlIGBrZXlVcGAgZXZl
bnQgZXZlbiBhZnRlciBhbgorICAgICAgYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQsIHNldCBg
YnViYmxlc2AgdG8gdHJ1ZS4KKyAgICAgICBAcHJvcGVydHkgYnViYmxlcworICAgICAgQHR5cGUg
Qm9vbGVhbgorICAgICAgQGRlZmF1bHQgZmFsc2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBidWJibGVzOiBmYWxzZSwKKworICAgIGludGVycHJldEtleUV2ZW50czogZnVuY3Rpb24gKGV2
ZW50KSB7CisgICAgICB2YXIgbWFwID0gS0VZX0VWRU5UUzsKKyAgICAgIHZhciBtZXRob2QgPSBt
YXBbZXZlbnQua2V5Q29kZV07CisKKyAgICAgIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSgp
OworICAgICAgaWYgKG1ldGhvZCkgeworICAgICAgICByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50
KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX2VsZW1lbnRWYWx1ZURpZENoYW5nZTogZnVuY3Rp
b24gKCkgeworICAgICAgLy8gVXNpbmcgcmVhZERPTUF0dHIgd2lsbCBlbnN1cmUgdGhhdCBIVE1M
QmFycyBrbm93cyB0aGUgbGFzdAorICAgICAgLy8gdmFsdWUuCisgICAgICBfZW1iZXJNZXRhbFBy
b3BlcnR5X3NldC5zZXQodGhpcywgJ3ZhbHVlJywgdGhpcy5yZWFkRE9NQXR0cigndmFsdWUnKSk7
CisgICAgfSwKKworICAgIGNoYW5nZTogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICB0aGlzLl9l
bGVtZW50VmFsdWVEaWRDaGFuZ2UoZXZlbnQpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFs
bG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xsZXIgYWN0aW9uIHRvIGludm9rZSB3aGVuIGVp
dGhlciB0aGUgYGVudGVyYAorICAgICAga2V5IGlzIHByZXNzZWQgb3IsIGluIHRoZSBjYXNlIG9m
IHRoZSBmaWVsZCBiZWluZyBhIHRleHRhcmVhLCB3aGVuIGEgbmV3bGluZQorICAgICAgaXMgaW5z
ZXJ0ZWQuIFRvIHVzZSB0aGlzIG1ldGhvZCwgZ2l2ZSB5b3VyIGZpZWxkIGFuIGBpbnNlcnQtbmV3
bGluZWAKKyAgICAgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlIHNob3Vs
ZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uCisgICAgICBpbiB5b3VyIGNvbnRyb2xsZXIgdGhh
dCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIHVz
ZSB0aGUgYGluc2VydC1uZXdsaW5lYCBhdHRyaWJ1dGUsIHBsZWFzZQorICAgICAgcmVmZXJlbmNl
IHRoZSBleGFtcGxlIG5lYXIgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCisgICAgICAgQG1ldGhvZCBp
bnNlcnROZXdsaW5lCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAgICAgQHByaXZhdGUK
KyAgICAqLworICAgIGluc2VydE5ld2xpbmU6IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgc2Vu
ZEFjdGlvbignZW50ZXInLCB0aGlzLCBldmVudCk7CisgICAgICBzZW5kQWN0aW9uKCdpbnNlcnQt
bmV3bGluZScsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBbGxvd3Mg
eW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgZXNj
YXBlIGJ1dHRvbgorICAgICAgaXMgcHJlc3NlZC4gVG8gdXNlIHRoaXMgbWV0aG9kLCBnaXZlIHlv
dXIgZmllbGQgYW4gYGVzY2FwZS1wcmVzc2AKKyAgICAgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9m
IHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uCisgICAgICBp
biB5b3VyIGNvbnRyb2xsZXIgdGhhdCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFu
IGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGVzY2FwZS1wcmVzc2AgYXR0cmlidXRlLCBwbGVh
c2UgcmVmZXJlbmNlCisgICAgICB0aGUgZXhhbXBsZSBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmaWxl
LgorICAgICAgIEBtZXRob2QgY2FuY2VsCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAg
ICAgQHByaXZhdGUKKyAgICAqLworICAgIGNhbmNlbDogZnVuY3Rpb24gKGV2ZW50KSB7CisgICAg
ICBzZW5kQWN0aW9uKCdlc2NhcGUtcHJlc3MnLCB0aGlzLCBldmVudCk7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgY29udHJvbGxlciBhY3Rpb24gdG8g
aW52b2tlIHdoZW4gYSBmaWVsZCByZWNlaXZlcworICAgICAgZm9jdXMuIFRvIHVzZSB0aGlzIG1l
dGhvZCwgZ2l2ZSB5b3VyIGZpZWxkIGEgYGZvY3VzLWluYCBhdHRyaWJ1dGUuIFRoZSB2YWx1ZQor
ICAgICAgb2YgdGhhdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
aW4geW91ciBjb250cm9sbGVyCisgICAgICB0aGF0IHlvdSB3aXNoIHRvIGludm9rZS4KKyAgICAg
ICBGb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gdXNlIHRoZSBgZm9jdXMtaW5gIGF0dHJpYnV0ZSwg
cGxlYXNlIHJlZmVyZW5jZSB0aGUKKyAgICAgIGV4YW1wbGUgbmVhciB0aGUgdG9wIG9mIHRoaXMg
ZmlsZS4KKyAgICAgICBAbWV0aG9kIGZvY3VzSW4KKyAgICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50
CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgZm9jdXNJbjogZnVuY3Rpb24gKGV2ZW50KSB7
CisgICAgICBzZW5kQWN0aW9uKCdmb2N1cy1pbicsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0
byBpbnZva2Ugd2hlbiBhIGZpZWxkIGxvc2VzCisgICAgICBmb2N1cy4gVG8gdXNlIHRoaXMgbWV0
aG9kLCBnaXZlIHlvdXIgZmllbGQgYSBgZm9jdXMtb3V0YCBhdHRyaWJ1dGUuIFRoZSB2YWx1ZQor
ICAgICAgb2YgdGhhdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24g
aW4geW91ciBjb250cm9sbGVyCisgICAgICB0aGF0IHlvdSB3aXNoIHRvIGludm9rZS4KKyAgICAg
ICBGb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gdXNlIHRoZSBgZm9jdXMtb3V0YCBhdHRyaWJ1dGUs
IHBsZWFzZSByZWZlcmVuY2UgdGhlCisgICAgICBleGFtcGxlIG5lYXIgdGhlIHRvcCBvZiB0aGlz
IGZpbGUuCisgICAgICAgQG1ldGhvZCBmb2N1c091dAorICAgICAgQHBhcmFtIHtFdmVudH0gZXZl
bnQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmb2N1c091dDogZnVuY3Rpb24gKGV2ZW50
KSB7CisgICAgICB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UoZXZlbnQpOworICAgICAgc2Vu
ZEFjdGlvbignZm9jdXMtb3V0JywgdGhpcywgZXZlbnQpOworICAgIH0sCisKKyAgICAvKioKKyAg
ICAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xsZXIgYWN0aW9uIHRvIGludm9rZSB3
aGVuIGEga2V5IGlzIHByZXNzZWQuCisgICAgICBUbyB1c2UgdGhpcyBtZXRob2QsIGdpdmUgeW91
ciBmaWVsZCBhIGBrZXktcHJlc3NgIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mCisgICAgICB0aGF0
IGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbiB5b3VyIGNvbnRy
b2xsZXIgeW91CisgICAgICB0aGF0IHdpc2ggdG8gaW52b2tlLgorICAgICAgIEZvciBhbiBleGFt
cGxlIG9uIGhvdyB0byB1c2UgdGhlIGBrZXktcHJlc3NgIGF0dHJpYnV0ZSwgcGxlYXNlIHJlZmVy
ZW5jZSB0aGUKKyAgICAgIGV4YW1wbGUgbmVhciB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KKyAgICAg
ICBAbWV0aG9kIGtleVByZXNzCisgICAgICBAcGFyYW0ge0V2ZW50fSBldmVudAorICAgICAgQHBy
aXZhdGUKKyAgICAqLworICAgIGtleVByZXNzOiBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgIHNl
bmRBY3Rpb24oJ2tleS1wcmVzcycsIHRoaXMsIGV2ZW50KTsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBBbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjb250cm9sbGVyIGFjdGlvbiB0byBpbnZva2Ug
d2hlbiBhIGtleS11cCBldmVudCBpcworICAgICAgZmlyZWQuIFRvIHVzZSB0aGlzIG1ldGhvZCwg
Z2l2ZSB5b3VyIGZpZWxkIGEgYGtleS11cGAgYXR0cmlidXRlLiBUaGUgdmFsdWUKKyAgICAgIG9m
IHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIGluIHlvdXIg
Y29udHJvbGxlcgorICAgICAgdGhhdCB5b3Ugd2lzaCB0byBpbnZva2UuCisgICAgICAgRm9yIGFu
IGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGtleS11cGAgYXR0cmlidXRlLCBwbGVhc2UgcmVm
ZXJlbmNlIHRoZQorICAgICAgZXhhbXBsZSBuZWFyIHRoZSB0b3Agb2YgdGhpcyBmaWxlLgorICAg
ICAgIEBtZXRob2Qga2V5VXAKKyAgICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50CisgICAgICBAcHJp
dmF0ZQorICAgICovCisgICAga2V5VXA6IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgdGhpcy5p
bnRlcnByZXRLZXlFdmVudHMoZXZlbnQpOworCisgICAgICB0aGlzLnNlbmRBY3Rpb24oJ2tleS11
cCcsIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndmFsdWUnKSwgZXZlbnQpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbnRyb2xs
ZXIgYWN0aW9uIHRvIGludm9rZSB3aGVuIGEga2V5LWRvd24gZXZlbnQgaXMKKyAgICAgIGZpcmVk
LiBUbyB1c2UgdGhpcyBtZXRob2QsIGdpdmUgeW91ciBmaWVsZCBhIGBrZXktZG93bmAgYXR0cmli
dXRlLiBUaGUgdmFsdWUKKyAgICAgIG9mIHRoYXQgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgbmFt
ZSBvZiB0aGUgYWN0aW9uIGluIHlvdXIgY29udHJvbGxlciB0aGF0CisgICAgICB5b3Ugd2lzaCB0
byBpbnZva2UuCisgICAgICAgRm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYGtleS1k
b3duYCBhdHRyaWJ1dGUsIHBsZWFzZSByZWZlcmVuY2UgdGhlCisgICAgICBleGFtcGxlIG5lYXIg
dGhlIHRvcCBvZiB0aGlzIGZpbGUuCisgICAgICAgQG1ldGhvZCBrZXlEb3duCisgICAgICBAcGFy
YW0ge0V2ZW50fSBldmVudAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIGtleURvd246IGZ1
bmN0aW9uIChldmVudCkgeworICAgICAgdGhpcy5zZW5kQWN0aW9uKCdrZXktZG93bicsIF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndmFsdWUnKSwgZXZlbnQpOworICAgIH0KKyAg
fSk7CisKKyAgLy8gSW4gcHJpbmNpcGxlLCB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1
dCB0aGUgbGVnYWN5CisgIC8vIHNlbmRBY3Rpb24gc2VtYW50aWNzIGZvciBUZXh0RmllbGQgYXJl
IGRpZmZlcmVudCBmcm9tCisgIC8vIHRoZSBjb21wb25lbnQgc2VtYW50aWNzIHNvIHRoaXMgbWV0
aG9kIG5vcm1hbGl6ZXMgdGhlbS4KKyAgZnVuY3Rpb24gc2VuZEFjdGlvbihldmVudE5hbWUsIHZp
ZXcsIGV2ZW50KSB7CisgICAgdmFyIGFjdGlvbiA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh2aWV3LCAnYXR0cnMuJyArIGV2ZW50TmFtZSkgfHwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQu
Z2V0KHZpZXcsIGV2ZW50TmFtZSk7CisgICAgdmFyIG9uID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHZpZXcsICdvbkV2ZW50Jyk7CisgICAgdmFyIHZhbHVlID0gX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQuZ2V0KHZpZXcsICd2YWx1ZScpOworCisgICAgLy8gYmFjay1jb21wYXQgc3VwcG9y
dCBmb3Iga2V5UHJlc3MgYXMgYW4gZXZlbnQgbmFtZSBldmVuIHRob3VnaAorICAgIC8vIGl0J3Mg
YWxzbyBhIG1ldGhvZCBuYW1lIHRoYXQgY29uc3VtZXMgdGhlIGV2ZW50IChhbmQgdGhlcmVmb3Jl
CisgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggc2VuZEFjdGlvbiBzZW1hbnRpY3MpLgorICAgIGlm
IChvbiA9PT0gZXZlbnROYW1lIHx8IG9uID09PSAna2V5UHJlc3MnICYmIGV2ZW50TmFtZSA9PT0g
J2tleS1wcmVzcycpIHsKKyAgICAgIHZpZXcuc2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOwor
ICAgIH0KKworICAgIHZpZXcuc2VuZEFjdGlvbihldmVudE5hbWUsIHZhbHVlKTsKKworICAgIGlm
IChhY3Rpb24gfHwgb24gPT09IGV2ZW50TmFtZSkgeworICAgICAgaWYgKCFfZW1iZXJNZXRhbFBy
b3BlcnR5X2dldC5nZXQodmlldywgJ2J1YmJsZXMnKSkgeworICAgICAgICBldmVudC5zdG9wUHJv
cGFnYXRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBU
ZXh0U3VwcG9ydDsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlld19jaGlsZF92
aWV3c19zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2RlYnVnJywgJ2VtYmVyLW1l
dGFsL21peGluJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9w
ZXJ0eV9zZXQnLCAnZW1iZXItbWV0YWwvc2V0X3Byb3BlcnRpZXMnLCAnZW1iZXItcnVudGltZS9z
eXN0ZW0vbmF0aXZlX2FycmF5JywgJ2NvbnRhaW5lci9vd25lciddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVz
LCBfZW1iZXJSdW50aW1lU3lzdGVtTmF0aXZlX2FycmF5LCBfY29udGFpbmVyT3duZXIpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIEVNUFRZX0FSUkFZID0gW107CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAgQXJy
YXkgb2YgY2hpbGQgdmlld3MuIFlvdSBzaG91bGQgbmV2ZXIgZWRpdCB0aGlzIGFycmF5IGRpcmVj
dGx5LgorICAgICAgSW5zdGVhZCwgdXNlIGBhcHBlbmRDaGlsZGAgYW5kIGByZW1vdmVGcm9tUGFy
ZW50YC4KKyAgICAgICBAcHJvcGVydHkgY2hpbGRWaWV3cworICAgICAgQHR5cGUgQXJyYXkKKyAg
ICAgIEBkZWZhdWx0IFtdCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY2hpbGRWaWV3czog
RU1QVFlfQVJSQVksCisKKyAgICBpbml0OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBl
ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCisgICAgICAvLyBzZXR1cCBjaGlsZCB2aWV3cy4g
YmUgc3VyZSB0byBjbG9uZSB0aGUgY2hpbGQgdmlld3MgYXJyYXkgZmlyc3QKKyAgICAgIC8vIDIu
MFRPRE86IFJlbW92ZSBFbWJlci5BKCkgaGVyZQorICAgICAgdGhpcy5jaGlsZFZpZXdzID0gX2Vt
YmVyUnVudGltZVN5c3RlbU5hdGl2ZV9hcnJheS5BKHRoaXMuY2hpbGRWaWV3cy5zbGljZSgpKTsK
KyAgICAgIHRoaXMub3duZXJWaWV3ID0gdGhpcy5vd25lclZpZXcgfHwgdGhpczsKKyAgICB9LAor
CisgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB0aGlzLmxpbmtDaGls
ZCh2aWV3KTsKKyAgICAgIHRoaXMuY2hpbGRWaWV3cy5wdXNoKHZpZXcpOworICAgIH0sCisKKyAg
ICBkZXN0cm95Q2hpbGQ6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3LmRlc3Ryb3koKTsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBSZW1vdmVzIHRoZSBjaGlsZCB2aWV3IGZyb20gdGhl
IHBhcmVudCB2aWV3LgorICAgICAgIEBtZXRob2QgcmVtb3ZlQ2hpbGQKKyAgICAgIEBwYXJhbSB7
RW1iZXIuVmlld30gdmlldworICAgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAg
ICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW1vdmVDaGlsZDogZnVuY3Rpb24gKHZpZXcpIHsK
KyAgICAgIC8vIElmIHdlJ3JlIGRlc3Ryb3lpbmcsIHRoZSBlbnRpcmUgc3VidHJlZSB3aWxsIGJl
CisgICAgICAvLyBmcmVlZCwgYW5kIHRoZSBET00gd2lsbCBiZSBoYW5kbGVkIHNlcGFyYXRlbHks
CisgICAgICAvLyBzbyBubyBuZWVkIHRvIG1lc3Mgd2l0aCBjaGlsZFZpZXdzLgorICAgICAgaWYg
KHRoaXMuaXNEZXN0cm95aW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAg
Ly8gdXBkYXRlIHBhcmVudCBub2RlCisgICAgICB0aGlzLnVubGlua0NoaWxkKHZpZXcpOworCisg
ICAgICAvLyByZW1vdmUgdmlldyBmcm9tIGNoaWxkVmlld3MgYXJyYXkuCisgICAgICB2YXIgY2hp
bGRWaWV3cyA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnY2hpbGRWaWV3cycp
OworCisgICAgICB2YXIgaW5kZXggPSBjaGlsZFZpZXdzLmluZGV4T2Yodmlldyk7CisgICAgICBp
ZiAoaW5kZXggIT09IC0xKSB7CisgICAgICAgIGNoaWxkVmlld3Muc3BsaWNlKGluZGV4LCAxKTsK
KyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
SW5zdGFudGlhdGVzIGEgdmlldyB0byBiZSBhZGRlZCB0byB0aGUgY2hpbGRWaWV3cyBhcnJheSBk
dXJpbmcgdmlldworICAgICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbCBub3Qg
Y2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSB1bmxlc3MKKyAgICAgIHlvdSBhcmUgb3ZlcnJpZGlu
ZyBgY3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKKyAgICAg
IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBjb3JyZWN0IHNldHRpbmdzIG9uIHRoZSBuZXcg
dmlldyBpbnN0YW5jZSB0bworICAgICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC4KKyAg
ICAgICBAbWV0aG9kIGNyZWF0ZUNoaWxkVmlldworICAgICAgQHBhcmFtIHtDbGFzc3xTdHJpbmd9
IHZpZXdDbGFzcworICAgICAgQHBhcmFtIHtPYmplY3R9IFthdHRyc10gQXR0cmlidXRlcyB0byBh
ZGQKKyAgICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IG5ldyBpbnN0YW5jZQorICAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24gKG1heWJlVmlld0NsYXNz
KSB7CisgICAgICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRz
WzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTsKKworICAgICAgaWYgKCFtYXli
ZVZpZXdDbGFzcykgeworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjcmVhdGVDaGlsZFZp
ZXdzIGZpcnN0IGFyZ3VtZW50IG11c3QgZXhpc3QnKTsKKyAgICAgIH0KKworICAgICAgdmFyIG93
bmVyID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworCisgICAgICBpZiAobWF5YmVW
aWV3Q2xhc3MuaXNWaWV3ICYmIG1heWJlVmlld0NsYXNzLnBhcmVudFZpZXcgPT09IHRoaXMgJiYg
X2NvbnRhaW5lck93bmVyLmdldE93bmVyKG1heWJlVmlld0NsYXNzKSA9PT0gb3duZXIpIHsKKyAg
ICAgICAgcmV0dXJuIG1heWJlVmlld0NsYXNzOworICAgICAgfQorCisgICAgICB2YXIgdmlldzsK
KworICAgICAgYXR0cnMucGFyZW50VmlldyA9IHRoaXM7CisgICAgICBhdHRycy5yZW5kZXJlciA9
IHRoaXMucmVuZGVyZXI7CisgICAgICBhdHRycy5fdmlld1JlZ2lzdHJ5ID0gdGhpcy5fdmlld1Jl
Z2lzdHJ5OworCisgICAgICBpZiAobWF5YmVWaWV3Q2xhc3MuaXNWaWV3RmFjdG9yeSkgeworICAg
ICAgICBfY29udGFpbmVyT3duZXIuc2V0T3duZXIoYXR0cnMsIG93bmVyKTsKKworICAgICAgICB2
aWV3ID0gbWF5YmVWaWV3Q2xhc3MuY3JlYXRlKGF0dHJzKTsKKworICAgICAgICBpZiAodmlldy52
aWV3TmFtZSkgeworICAgICAgICAgIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCB2
aWV3LnZpZXdOYW1lLCB2aWV3KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgnc3RyaW5n
JyA9PT0gdHlwZW9mIG1heWJlVmlld0NsYXNzKSB7CisgICAgICAgIHZhciBmdWxsTmFtZSA9ICd2
aWV3OicgKyBtYXliZVZpZXdDbGFzczsKKyAgICAgICAgdmFyIFZpZXdLbGFzcyA9IG93bmVyLl9s
b29rdXBGYWN0b3J5KGZ1bGxOYW1lKTsKKworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2Vy
dCgnQ291bGQgbm90IGZpbmQgdmlldzogXCcnICsgZnVsbE5hbWUgKyAnXCcnLCAhIVZpZXdLbGFz
cyk7CisKKyAgICAgICAgdmlldyA9IFZpZXdLbGFzcy5jcmVhdGUoYXR0cnMpOworICAgICAgfSBl
bHNlIHsKKyAgICAgICAgdmlldyA9IG1heWJlVmlld0NsYXNzOworICAgICAgICBfZW1iZXJNZXRh
bERlYnVnLmFzc2VydCgnWW91IG11c3QgcGFzcyBpbnN0YW5jZSBvciBzdWJjbGFzcyBvZiBWaWV3
Jywgdmlldy5pc1ZpZXcpOworCisgICAgICAgIF9jb250YWluZXJPd25lci5zZXRPd25lcihhdHRy
cywgb3duZXIpOworICAgICAgICBfZW1iZXJNZXRhbFNldF9wcm9wZXJ0aWVzLmRlZmF1bHQodmll
dywgYXR0cnMpOworICAgICAgfQorCisgICAgICB0aGlzLmxpbmtDaGlsZCh2aWV3KTsKKworICAg
ICAgcmV0dXJuIHZpZXc7CisgICAgfSwKKworICAgIGxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3Rh
bmNlKSB7CisgICAgICBpZiAoIWluc3RhbmNlW19jb250YWluZXJPd25lci5PV05FUl0pIHsKKyAg
ICAgICAgX2NvbnRhaW5lck93bmVyLnNldE93bmVyKGluc3RhbmNlLCBfY29udGFpbmVyT3duZXIu
Z2V0T3duZXIodGhpcykpOworICAgICAgfQorCisgICAgICBpbnN0YW5jZS5wYXJlbnRWaWV3ID0g
dGhpczsKKyAgICAgIGluc3RhbmNlLm93bmVyVmlldyA9IHRoaXMub3duZXJWaWV3OworICAgIH0s
CisKKyAgICB1bmxpbmtDaGlsZDogZnVuY3Rpb24gKGluc3RhbmNlKSB7CisgICAgICBpbnN0YW5j
ZS5wYXJlbnRWaWV3ID0gbnVsbDsKKyAgICB9CisgIH0pOworfSk7CitlbmlmZWQoJ2VtYmVyLXZp
ZXdzL21peGlucy92aWV3X2NvbnRleHRfc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRh
bC9taXhpbicsICdlbWJlci1tZXRhbC9jb21wdXRlZCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9n
ZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLXZpZXdzL21peGlucy9sZWdh
Y3lfdmlld19zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxQcm9w
ZXJ0eV9nZXQsIF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJWaWV3c01peGluc0xlZ2Fj
eV92aWV3X3N1cHBvcnQsIF9lbWJlck1ldGFsRXZlbnRzKSB7CisgIC8qKgorICBAbW9kdWxlIGVt
YmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBWaWV3Q29udGV4dFN1cHBvcnQgPSBfZW1iZXJNZXRhbE1peGluLk1peGluLmNyZWF0ZShf
ZW1iZXJWaWV3c01peGluc0xlZ2FjeV92aWV3X3N1cHBvcnQuZGVmYXVsdCwgeworICAgIC8qKgor
ICAgICAgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNjZXNzIHByb3Bl
cnRpZXMuCisgICAgICAgVGhpcyBvYmplY3Qgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRl
IGZ1bmN0aW9uIGVhY2ggdGltZSB0aGUgcmVuZGVyCisgICAgICBtZXRob2QgaXMgY2FsbGVkLCBi
dXQgaXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKKyAg
ICAgIHRvIGRvIHdpdGggaXQuCisgICAgICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSB2
aWV3J3MgY29udHJvbGxlci4KKyAgICAgICBAcHJvcGVydHkgY29udGV4dAorICAgICAgQHR5cGUg
T2JqZWN0CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY29udGV4dDogX2VtYmVyTWV0YWxD
b21wdXRlZC5jb21wdXRlZCh7CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0
dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnX2NvbnRleHQnKTsKKyAgICAg
IH0sCisgICAgICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CisgICAgICAgIF9lbWJlck1l
dGFsUHJvcGVydHlfc2V0LnNldCh0aGlzLCAnX2NvbnRleHQnLCB2YWx1ZSk7CisgICAgICAgIHJl
dHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9KSwKKworICAgIC8qKgorICAgICAgUHJpdmF0ZSBj
b3B5IG9mIHRoZSB2aWV3J3MgdGVtcGxhdGUgY29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRpcmVj
dGx5CisgICAgICBieSBIYW5kbGViYXJzIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgb2JzZXJ2ZXIg
dGhhdCBjYXVzZXMgdGhlIHZpZXcKKyAgICAgIHRvIGJlIHJlLXJlbmRlcmVkLgorICAgICAgIFRo
ZSBjb250ZXh0IG9mIGEgdmlldyBpcyBsb29rZWQgdXAgYXMgZm9sbG93czoKKyAgICAgICAxLiBT
dXBwbGllZCBjb250ZXh0ICh1c3VhbGx5IGJ5IEhhbmRsZWJhcnMpCisgICAgICAyLiBTcGVjaWZp
ZWQgY29udHJvbGxlcgorICAgICAgMy4gYHBhcmVudFZpZXdgJ3MgY29udGV4dAorICAgICAgIFRo
ZSBjb2RlIGluIEhhbmRsZWJhcnMgdGhhdCBvdmVycmlkZXMgdGhlIGBfY29udGV4dGAgcHJvcGVy
dHkgZmlyc3QKKyAgICAgIGNoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgdmlldyBoYXMgYSBzcGVj
aWZpZWQgY29udHJvbGxlci4gVGhpcyBpcworICAgICAgc29tZXRoaW5nIG9mIGEgaGFjayBhbmQg
c2hvdWxkIGJlIHJldmlzaXRlZC4KKyAgICAgICBAcHJvcGVydHkgX2NvbnRleHQKKyAgICAgIEBw
cml2YXRlCisgICAgKi8KKyAgICBfY29udGV4dDogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRl
ZCh7CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHBhcmVudFZpZXcsIGNv
bnRyb2xsZXI7CisKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodGhpcywgJ2NvbnRyb2xsZXInKSkgeworICAgICAgICAgIHJldHVybiBjb250cm9s
bGVyOworICAgICAgICB9CisKKyAgICAgICAgcGFyZW50VmlldyA9IHRoaXMucGFyZW50VmlldzsK
KyAgICAgICAgaWYgKHBhcmVudFZpZXcpIHsKKyAgICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KHBhcmVudFZpZXcsICdfY29udGV4dCcpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiBudWxsOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rpb24gKGtleSwgdmFs
dWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2Nv
bnRyb2xsZXI6IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBjb250cm9sbGVyIG1hbmFnaW5n
IHRoaXMgdmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgYmUKKyAgICAgIG1h
ZGUgYXZhaWxhYmxlIGZvciB1c2UgYnkgdGhlIHRlbXBsYXRlLgorICAgICAgIEBwcm9wZXJ0eSBj
b250cm9sbGVyCisgICAgICBAdHlwZSBPYmplY3QKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAg
ICBjb250cm9sbGVyOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNvbXB1dGVkKHsKKyAgICAgIGdldDog
ZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAodGhpcy5fY29udHJvbGxlcikgeworICAgICAgICAg
IHJldHVybiB0aGlzLl9jb250cm9sbGVyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRo
aXMucGFyZW50VmlldyA/IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLnBhcmVudFZp
ZXcsICdjb250cm9sbGVyJykgOiBudWxsOworICAgICAgfSwKKyAgICAgIHNldDogZnVuY3Rpb24g
KF8sIHZhbHVlKSB7CisgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIgPSB2YWx1ZTsKKyAgICAgICAg
cmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0pLAorCisgICAgX2xlZ2FjeUNvbnRyb2xsZXJE
aWRDaGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2NvbnRyb2xsZXInLCBmdW5jdGlv
biAoKSB7CisgICAgICB0aGlzLmNoaWxkVmlld3MuZm9yRWFjaChmdW5jdGlvbiAodmlldykgewor
ICAgICAgICByZXR1cm4gdmlldy5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgnY29udHJvbGxlcicpOwor
ICAgICAgfSk7CisgICAgfSksCisKKyAgICBfbm90aWZ5Q29udHJvbGxlckNoYW5nZTogX2VtYmVy
TWV0YWxFdmVudHMub24oJ3BhcmVudFZpZXdEaWRDaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CisgICAg
ICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdjb250cm9sbGVyJyk7CisgICAgfSkKKyAgfSk7
CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVmlld0NvbnRleHRTdXBwb3J0OworfSk7CitlbmlmZWQo
J2VtYmVyLXZpZXdzL21peGlucy92aWV3X3N0YXRlX3N1cHBvcnQnLCBbJ2V4cG9ydHMnLCAnZW1i
ZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvbWl4aW4nXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsTWl4aW4pIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIHZhciBWaWV3U3RhdGVTdXBwb3J0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUo
eworICAgIHRyYW5zaXRpb25UbzogZnVuY3Rpb24gKHN0YXRlKSB7CisgICAgICBfZW1iZXJNZXRh
bERlYnVnLmRlcHJlY2F0ZSgnRW1iZXIuVmlldyN0cmFuc2l0aW9uVG8gaGFzIGJlZW4gZGVwcmVj
YXRlZCwgaXQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5JywgZmFsc2UsIHsgaWQ6ICdlbWJlci12
aWV3cy52aWV3LXRyYW5zaXRpb24tdG8nLCB1bnRpbDogJzIuNC4wJyB9KTsKKyAgICAgIHRoaXMu
X3RyYW5zaXRpb25UbyhzdGF0ZSk7CisgICAgfSwKKworICAgIF90cmFuc2l0aW9uVG86IGZ1bmN0
aW9uIChzdGF0ZSkgeworICAgICAgdmFyIHByaW9yU3RhdGUgPSB0aGlzLl9jdXJyZW50U3RhdGU7
CisgICAgICB2YXIgY3VycmVudFN0YXRlID0gdGhpcy5fY3VycmVudFN0YXRlID0gdGhpcy5fc3Rh
dGVzW3N0YXRlXTsKKyAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7CisKKyAgICAgIGlmIChwcmlv
clN0YXRlICYmIHByaW9yU3RhdGUuZXhpdCkgeworICAgICAgICBwcmlvclN0YXRlLmV4aXQodGhp
cyk7CisgICAgICB9CisgICAgICBpZiAoY3VycmVudFN0YXRlLmVudGVyKSB7CisgICAgICAgIGN1
cnJlbnRTdGF0ZS5lbnRlcih0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGV4cG9y
dHMuZGVmYXVsdCA9IFZpZXdTdGF0ZVN1cHBvcnQ7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mv
bWl4aW5zL3ZpZXdfc3VwcG9ydCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdl
bWJlci1tZXRhbC9lcnJvcicsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0
YWwvcnVuX2xvb3AnLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItbWV0YWwvdXRpbHMn
LCAnZW1iZXItbWV0YWwvY29tcHV0ZWQnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItcnVu
dGltZS9zeXN0ZW0vY29yZV9vYmplY3QnLCAnZW1iZXItbWV0YWwvc3ltYm9sJywgJ2NvbnRhaW5l
ci9vd25lcicsICdlbWJlci12aWV3cy9zeXN0ZW0vanF1ZXJ5J10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRhbEVycm9yLCBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldCwgX2VtYmVyTWV0YWxSdW5fbG9vcCwgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVyTWV0
YWxVdGlscywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyUnVu
dGltZVN5c3RlbUNvcmVfb2JqZWN0LCBfZW1iZXJNZXRhbFN5bWJvbCwgX2NvbnRhaW5lck93bmVy
LCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIF9N
aXhpbiRjcmVhdGU7CisKKyAgdmFyIElOSVRfV0FTX0NBTExFRCA9IF9lbWJlck1ldGFsU3ltYm9s
LmRlZmF1bHQoJ0lOSVRfV0FTX0NBTExFRCcpOworCisgIGZ1bmN0aW9uIEsoKSB7CisgICAgcmV0
dXJuIHRoaXM7CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBfZW1iZXJNZXRhbE1peGluLk1p
eGluLmNyZWF0ZSgoX01peGluJGNyZWF0ZSA9IHsKKyAgICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVz
OiBbJ2F0dHJpYnV0ZUJpbmRpbmdzJ10sCisKKyAgICAvKioKKyAgICAgIEBwcm9wZXJ0eSBpc1Zp
ZXcKKyAgICAgIEB0eXBlIEJvb2xlYW4KKyAgICAgIEBkZWZhdWx0IHRydWUKKyAgICAgIEBzdGF0
aWMKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBpc1ZpZXc6IHRydWUsCisKKyAgICAvLyAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
CisgICAgLy8gVEVNUExBVEUgU1VQUE9SVAorICAgIC8vCisKKyAgICAvKioKKyAgICAgIFRoZSBu
YW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUgaXMgcHJvdmlkZWQu
CisgICAgICAgQnkgZGVmYXVsdCBgRW1iZXIuVmlld2Agd2lsbCBsb29rdXAgYSB0ZW1wbGF0ZSB3
aXRoIHRoaXMgbmFtZSBpbgorICAgICAgYEVtYmVyLlRFTVBMQVRFU2AgKGEgc2hhcmVkIGdsb2Jh
bCBvYmplY3QpLgorICAgICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZU5hbWUKKyAgICAgIEB0eXBlIFN0
cmluZworICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHRl
bXBsYXRlTmFtZTogbnVsbCwKKworICAgIC8qKgorICAgICAgVGhlIG5hbWUgb2YgdGhlIGxheW91
dCB0byBsb29rdXAgaWYgbm8gbGF5b3V0IGlzIHByb3ZpZGVkLgorICAgICAgIEJ5IGRlZmF1bHQg
YEVtYmVyLlZpZXdgIHdpbGwgbG9va3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgaW4KKyAg
ICAgIGBFbWJlci5URU1QTEFURVNgIChhIHNoYXJlZCBnbG9iYWwgb2JqZWN0KS4KKyAgICAgICBA
cHJvcGVydHkgbGF5b3V0TmFtZQorICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBu
dWxsCisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAgbGF5b3V0TmFtZTogbnVsbCwKKworICAg
IC8qKgorICAgICAgVGhlIHRlbXBsYXRlIHVzZWQgdG8gcmVuZGVyIHRoZSB2aWV3LiBUaGlzIHNo
b3VsZCBiZSBhIGZ1bmN0aW9uIHRoYXQKKyAgICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4
dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBzdHJpbmcgb2YgSFRNTCB0aGF0CisgICAgICB3aWxs
IGJlIGluc2VydGVkIGludG8gdGhlIERPTSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IHZpZXcuCisg
ICAgICAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3Bl
cnR5IGluc3RlYWQgb2Ygc2V0dGluZworICAgICAgdGhlIHRlbXBsYXRlIHlvdXJzZWxmLgorICAg
ICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZQorICAgICAgQHR5cGUgRnVuY3Rpb24KKyAgICAgIEBwcml2
YXRlCisgICAgKi8KKyAgICB0ZW1wbGF0ZTogX2VtYmVyTWV0YWxDb21wdXRlZC5jb21wdXRlZCh7
CisgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAndGVtcGxhdGVOYW1lJyk7CisgICAgICAg
IHZhciB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKHRlbXBsYXRlTmFtZSwgJ3RlbXBs
YXRlJyk7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVkIHRo
ZSB0ZW1wbGF0ZU5hbWUgJyArIHRlbXBsYXRlTmFtZSArICcgZm9yICcgKyB0aGlzICsgJywgYnV0
IGl0IGRpZCBub3QgZXhpc3QuJywgIXRlbXBsYXRlTmFtZSB8fCAhIXRlbXBsYXRlKTsKKyAgICAg
ICAgcmV0dXJuIHRlbXBsYXRlIHx8IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAn
ZGVmYXVsdFRlbXBsYXRlJyk7CisgICAgICB9LAorICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2
YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIHJl
dHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxQcm9wZXJ0
eV9nZXQuZ2V0KHRoaXMsIGtleSk7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAgICAg
IEEgdmlldyBtYXkgY29udGFpbiBhIGxheW91dC4gQSBsYXlvdXQgaXMgYSByZWd1bGFyIHRlbXBs
YXRlIGJ1dAorICAgICAgc3VwZXJzZWRlcyB0aGUgYHRlbXBsYXRlYCBwcm9wZXJ0eSBkdXJpbmcg
cmVuZGVyaW5nLiBJdCBpcyB0aGUKKyAgICAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBsYXlvdXQg
dGVtcGxhdGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAKKyAgICAgIHByb3BlcnR5IGZyb20g
dGhlIHZpZXcgKG9yIGFsdGVybmF0aXZlbHksIGNhbGwgYEhhbmRsZWJhcnMuaGVscGVycy55aWVs
ZGAsCisgICAgICBge3t5aWVsZH19YCkgdG8gcmVuZGVyIGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0
aW9uLgorICAgICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZpZXcgdGhhdCBoYXMgYSBzaGFyZWQg
d3JhcHBlciwgYnV0IHdoaWNoIGRlbGVnYXRlcworICAgICAgdGhlIHJlbmRlcmluZyBvZiB0aGUg
Y29udGVudHMgb2YgdGhlIHdyYXBwZXIgdG8gdGhlIGB0ZW1wbGF0ZWAgcHJvcGVydHkKKyAgICAg
IG9uIGEgc3ViY2xhc3MuCisgICAgICAgQHByb3BlcnR5IGxheW91dAorICAgICAgQHR5cGUgRnVu
Y3Rpb24KKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBsYXlvdXQ6IF9lbWJlck1ldGFsQ29t
cHV0ZWQuY29tcHV0ZWQoeworICAgICAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7CisgICAgICAgIHZh
ciBsYXlvdXROYW1lID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdsYXlvdXRO
YW1lJyk7CisgICAgICAgIHZhciBsYXlvdXQgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZShsYXlvdXRO
YW1lLCAnbGF5b3V0Jyk7CisKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBz
cGVjaWZpZWQgdGhlIGxheW91dE5hbWUgJyArIGxheW91dE5hbWUgKyAnIGZvciAnICsgdGhpcyAr
ICcsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LicsICFsYXlvdXROYW1lIHx8ICEhbGF5b3V0KTsKKwor
ICAgICAgICByZXR1cm4gbGF5b3V0IHx8IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlz
LCAnZGVmYXVsdExheW91dCcpOworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5
LCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgfSksCisKKyAg
ICB0ZW1wbGF0ZUZvck5hbWU6IGZ1bmN0aW9uIChuYW1lLCB0eXBlKSB7CisgICAgICBpZiAoIW5h
bWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ3RlbXBsYXRlTmFtZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gcGVyaW9kczog
JyArIG5hbWUsIG5hbWUuaW5kZXhPZignLicpID09PSAtMSk7CisKKyAgICAgIHZhciBvd25lciA9
IF9jb250YWluZXJPd25lci5nZXRPd25lcih0aGlzKTsKKworICAgICAgaWYgKCFvd25lcikgewor
ICAgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDb250YWluZXIgd2Fz
IG5vdCBmb3VuZCB3aGVuIGxvb2tpbmcgdXAgYSB2aWV3cyB0ZW1wbGF0ZS4gJyArICdUaGlzIGlz
IG1vc3QgbGlrZWx5IGR1ZSB0byBtYW51YWxseSBpbnN0YW50aWF0aW5nIGFuIEVtYmVyLlZpZXcu
ICcgKyAnU2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQScpOworICAgICAgfQorCisgICAgICByZXR1
cm4gb3duZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7CisgICAgfSwKKworICAgIC8qKgor
ICAgICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2Yg
dGhlIHByb3ZpZGVkCisgICAgICBjbGFzcyBvciBtaXhpbi4KKyAgICAgICBAbWV0aG9kIG5lYXJl
c3RPZlR5cGUKKyAgICAgIEBwYXJhbSB7Q2xhc3MsTWl4aW59IGtsYXNzIFN1YmNsYXNzIG9mIEVt
YmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKSwKKyAgICAgICAgICAgICBvciBhbiBpbnN0
YW5jZSBvZiBFbWJlci5NaXhpbi4KKyAgICAgIEByZXR1cm4gRW1iZXIuVmlldworICAgICAgQHBy
aXZhdGUKKyAgICAqLworICAgIG5lYXJlc3RPZlR5cGU6IGZ1bmN0aW9uIChrbGFzcykgeworICAg
ICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodGhpcywgJ3BhcmVudFZp
ZXcnKTsKKyAgICAgIHZhciBpc09mVHlwZSA9IGtsYXNzIGluc3RhbmNlb2YgX2VtYmVyTWV0YWxN
aXhpbi5NaXhpbiA/IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICAgIHJldHVybiBrbGFzcy5kZXRl
Y3Qodmlldyk7CisgICAgICB9IDogZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgICAgcmV0dXJuIGts
YXNzLmRldGVjdCh2aWV3LmNvbnN0cnVjdG9yKTsKKyAgICAgIH07CisKKyAgICAgIHdoaWxlICh2
aWV3KSB7CisgICAgICAgIGlmIChpc09mVHlwZSh2aWV3KSkgeworICAgICAgICAgIHJldHVybiB2
aWV3OworICAgICAgICB9CisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eS4K
KyAgICAgICBAbWV0aG9kIG5lYXJlc3RXaXRoUHJvcGVydHkKKyAgICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wZXJ0eSBBIHByb3BlcnR5IG5hbWUKKyAgICAgIEByZXR1cm4gRW1iZXIuVmlldworICAg
ICAgQHByaXZhdGUKKyAgICAqLworICAgIG5lYXJlc3RXaXRoUHJvcGVydHk6IGZ1bmN0aW9uIChw
cm9wZXJ0eSkgeworICAgICAgdmFyIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQo
dGhpcywgJ3BhcmVudFZpZXcnKTsKKworICAgICAgd2hpbGUgKHZpZXcpIHsKKyAgICAgICAgaWYg
KHByb3BlcnR5IGluIHZpZXcpIHsKKyAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQor
ICAgICAgICB2aWV3ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHZpZXcsICdwYXJlbnRW
aWV3Jyk7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVuZGVycyB0aGUgdmll
dyBhZ2Fpbi4gVGhpcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQorICAgICAg
dmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmlldyBpcyBpbiB0aGUg
RE9NLCB0aGUKKyAgICAgIHJlbmRlcmluZyBwcm9jZXNzIHdpbGwgYmUgZGVmZXJyZWQgdG8gZ2l2
ZSBiaW5kaW5ncyBhIGNoYW5jZQorICAgICAgdG8gc3luY2hyb25pemUuCisgICAgICAgSWYgY2hp
bGRyZW4gd2VyZSBhZGRlZCBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzIHVzaW5nIGBhcHBl
bmRDaGlsZGAsCisgICAgICBgcmVyZW5kZXJgIHdpbGwgcmVtb3ZlIHRoZW0sIGJlY2F1c2UgdGhl
eSB3aWxsIGJlIGFkZGVkIGFnYWluCisgICAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJlbmRl
cmAuCisgICAgICAgSW4gZ2VuZXJhbCwgaWYgdGhlIGRpc3BsYXkgb2YgeW91ciB2aWV3IGNoYW5n
ZXMsIHlvdSBzaG91bGQgbW9kaWZ5CisgICAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5z
dGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgorICAgICAgYmUg
c2xvdy4KKyAgICAgICBAbWV0aG9kIHJlcmVuZGVyCisgICAgICBAcHVibGljCisgICAgKi8KKyAg
ICByZXJlbmRlcjogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0
ZS5yZXJlbmRlcih0aGlzKTsKKyAgICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgIC8vIEVMRU1FTlQgU1VQ
UE9SVAorICAgIC8vCisKKyAgICAvKioKKyAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgRE9NIGVs
ZW1lbnQgZm9yIHRoZSB2aWV3LgorICAgICAgIEBwcm9wZXJ0eSBlbGVtZW50CisgICAgICBAdHlw
ZSBET01FbGVtZW50CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBlbGVtZW50OiBudWxsLAor
CisgICAgLyoqCisgICAgICBSZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3Mg
ZWxlbWVudC4gSWYgeW91IHBhc3MgaW4gYSBzZWxlY3RvcgorICAgICAgc3RyaW5nLCB0aGlzIG1l
dGhvZCB3aWxsIHJldHVybiBhIGpRdWVyeSBvYmplY3QsIHVzaW5nIHRoZSBjdXJyZW50IGVsZW1l
bnQKKyAgICAgIGFzIGl0cyBidWZmZXIuCisgICAgICAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgYHZp
ZXcuJCgnbGknKWAgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAg
IGFsbCBvZiB0aGUgYGxpYCBlbGVtZW50cyBpbnNpZGUgdGhlIERPTSBlbGVtZW50IG9mIHRoaXMg
dmlldy4KKyAgICAgICBAbWV0aG9kICQKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBbc2VsZWN0b3Jd
IGEgalF1ZXJ5LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nCisgICAgICBAcmV0dXJuIHtqUXVl
cnl9IHRoZSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgRE9NIG5vZGUKKyAgICAgIEBwdWJsaWMKKyAg
ICAqLworICAgICQ6IGZ1bmN0aW9uIChzZWwpIHsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNz
ZXJ0KCdZb3UgY2Fubm90IGFjY2VzcyB0aGlzLiQoKSBvbiBhIGNvbXBvbmVudCB3aXRoIGB0YWdO
YW1lOiBcJ1wnYCBzcGVjaWZpZWQuJywgdGhpcy50YWdOYW1lICE9PSAnJyk7CisgICAgICByZXR1
cm4gdGhpcy5fY3VycmVudFN0YXRlLiQodGhpcywgc2VsKTsKKyAgICB9LAorCisgICAgZm9yRWFj
aENoaWxkVmlldzogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICB2YXIgY2hpbGRWaWV3cyA9
IHRoaXMuY2hpbGRWaWV3czsKKworICAgICAgaWYgKCFjaGlsZFZpZXdzKSB7CisgICAgICAgIHJl
dHVybiB0aGlzOworICAgICAgfQorCisgICAgICB2YXIgbGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7
CisgICAgICB2YXIgdmlldywgaWR4OworCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsg
aWR4KyspIHsKKyAgICAgICAgdmlldyA9IGNoaWxkVmlld3NbaWR4XTsKKyAgICAgICAgY2FsbGJh
Y2sodmlldyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAv
KioKKyAgICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgcGFy
ZW50IGVsZW1lbnQuCisgICAgICAgSWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbiBIVE1MIHJl
cHJlc2VudGF0aW9uIHlldCwgYGNyZWF0ZUVsZW1lbnQoKWAKKyAgICAgIHdpbGwgYmUgY2FsbGVk
IGF1dG9tYXRpY2FsbHkuCisgICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1
bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCisgICAgICBlbGVtZW50IHdpbGwg
bm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBo
YXZlCisgICAgICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nLgorICAgICAgIFRoaXMgaXMgbm90IHR5
cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgeW91IHdpbGwgbmVlZCB0byBjYWxsIGRpcmVjdGx5IHdo
ZW4KKyAgICAgIGJ1aWxkaW5nIHlvdXIgYXBwbGljYXRpb24uIElmIHlvdSBkbyBuZWVkIHRvIHVz
ZSBgYXBwZW5kVG9gLCBiZSBzdXJlIHRoYXQKKyAgICAgIHRoZSB0YXJnZXQgZWxlbWVudCB5b3Ug
YXJlIHByb3ZpZGluZyBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYEVtYmVyLkFwcGxpY2F0aW9uYAor
ICAgICAgYW5kIGRvZXMgbm90IGhhdmUgYW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGlzIGFzc29j
aWF0ZWQgd2l0aCBhbiBFbWJlciB2aWV3LgorICAgICAgIEBtZXRob2QgYXBwZW5kVG8KKyAgICAg
IEBwYXJhbSB7U3RyaW5nfERPTUVsZW1lbnR8alF1ZXJ5fSBBIHNlbGVjdG9yLCBlbGVtZW50LCBI
VE1MIHN0cmluZywgb3IgalF1ZXJ5IG9iamVjdAorICAgICAgQHJldHVybiB7RW1iZXIuVmlld30g
cmVjZWl2ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBhcHBlbmRUbzogZnVuY3Rpb24g
KHNlbGVjdG9yKSB7CisgICAgICB2YXIgJCA9IHRoaXMuX2Vudmlyb25tZW50ID8gdGhpcy5fZW52
aXJvbm1lbnQub3B0aW9ucy5qUXVlcnkgOiBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0
OworCisgICAgICBpZiAoJCkgeworICAgICAgICB2YXIgdGFyZ2V0ID0gJChzZWxlY3Rvcik7CisK
KyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSB0cmllZCB0byBhcHBlbmQgdG8g
KCcgKyBzZWxlY3RvciArICcpIGJ1dCB0aGF0IGlzblwndCBpbiB0aGUgRE9NJywgdGFyZ2V0Lmxl
bmd0aCA+IDApOworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCBh
cHBlbmQgdG8gYW4gZXhpc3RpbmcgRW1iZXIuVmlldy4nLCAhdGFyZ2V0LmlzKCcuZW1iZXItdmll
dycpICYmICF0YXJnZXQucGFyZW50cygpLmlzKCcuZW1iZXItdmlldycpKTsKKworICAgICAgICB0
aGlzLnJlbmRlcmVyLmFwcGVuZFRvKHRoaXMsIHRhcmdldFswXSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICB2YXIgdGFyZ2V0ID0gc2VsZWN0b3I7CisKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ1lvdSB0cmllZCB0byBhcHBlbmQgdG8gYSBzZWxlY3RvciBzdHJpbmcgKCcgKyBz
ZWxlY3RvciArICcpIGluIGFuIGVudmlyb25tZW50IHdpdGhvdXQgalF1ZXJ5JywgdHlwZW9mIHRh
cmdldCAhPT0gJ3N0cmluZycpOworICAgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IHRyaWVkIHRvIGFwcGVuZCB0byBhIG5vbi1FbGVtZW50ICgnICsgc2VsZWN0b3IgKyAnKSBpbiBh
biBlbnZpcm9ubWVudCB3aXRob3V0IGpRdWVyeScsIHR5cGVvZiBzZWxlY3Rvci5hcHBlbmRDaGls
ZCA9PT0gJ2Z1bmN0aW9uJyk7CisKKyAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRUbyh0aGlz
LCB0YXJnZXQpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAg
LyoqCisgICAgICBAcHJpdmF0ZQorICAgICAgIENyZWF0ZXMgYSBuZXcgRE9NIGVsZW1lbnQsIHJl
bmRlcnMgdGhlIHZpZXcgaW50byBpdCwgdGhlbiByZXR1cm5zIHRoZQorICAgICAgZWxlbWVudC4K
KyAgICAgICBCeSBkZWZhdWx0LCB0aGUgZWxlbWVudCBjcmVhdGVkIGFuZCByZW5kZXJlZCBpbnRv
IHdpbGwgYmUgYSBgQk9EWWAgZWxlbWVudCwKKyAgICAgIHNpbmNlIHRoaXMgaXMgdGhlIGRlZmF1
bHQgY29udGV4dCB0aGF0IHZpZXdzIGFyZSByZW5kZXJlZCBpbnRvIHdoZW4gYmVpbmcKKyAgICAg
IGluc2VydGVkIGRpcmVjdGx5IGludG8gdGhlIERPTS4KKyAgICAgICBgYGBqcworICAgICAgdmFy
IGVsZW1lbnQgPSB2aWV3LnJlbmRlclRvRWxlbWVudCgpOworICAgICAgZWxlbWVudC50YWdOYW1l
OyAvLyA9PiAiQk9EWSIKKyAgICAgIGBgYAorICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGtp
bmQgb2YgZWxlbWVudCByZW5kZXJlZCBpbnRvIGFuZCByZXR1cm5lZCBieQorICAgICAgc3BlY2lm
eWluZyBhbiBvcHRpb25hbCB0YWcgbmFtZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICAg
YGBganMKKyAgICAgIHZhciBlbGVtZW50ID0gdmlldy5yZW5kZXJUb0VsZW1lbnQoJ3RhYmxlJyk7
CisgICAgICBlbGVtZW50LnRhZ05hbWU7IC8vID0+ICJUQUJMRSIKKyAgICAgIGBgYAorICAgICAg
IFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZW5kZXIgdGhlIHZpZXcgaW50
byBhbiBlbGVtZW50IHRoYXQKKyAgICAgIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQncyBib2R5LiBJ
bnN0ZWFkLCBhIG5ldyBgYm9keWAgZWxlbWVudCwgZGV0YWNoZWQgZnJvbQorICAgICAgdGhlIERP
TSBpcyByZXR1cm5lZC4gRmFzdEJvb3QgdXNlcyB0aGlzIHRvIHNlcmlhbGl6ZSB0aGUgcmVuZGVy
ZWQgdmlldyBpbnRvCisgICAgICBhIHN0cmluZyBmb3IgdHJhbnNtaXNzaW9uIG92ZXIgdGhlIG5l
dHdvcmsuCisgICAgICAgYGBganMKKyAgICAgIGFwcC52aXNpdCgnLycpLnRoZW4oZnVuY3Rpb24o
aW5zdGFuY2UpIHsKKyAgICAgICAgdmFyIGVsZW1lbnQ7CisgICAgICAgIEVtYmVyLnJ1bihmdW5j
dGlvbigpIHsKKyAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyVG9FbGVtZW50KGluc3RhbmNlKTsK
KyAgICAgICAgfSk7CisgICAgICAgICByZXMuc2VuZChzZXJpYWxpemUoZWxlbWVudCkpOworICAg
ICAgfSk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIHJlbmRlclRvRWxlbWVudAorICAgICAg
QHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUg
YW5kIHJlbmRlciBpbnRvLiBEZWZhdWx0cyB0byAiYm9keSIuCisgICAgICBAcmV0dXJuIHtIVE1M
Qm9keUVsZW1lbnR9IGVsZW1lbnQKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW5kZXJU
b0VsZW1lbnQ6IGZ1bmN0aW9uICh0YWdOYW1lKSB7CisgICAgICB0YWdOYW1lID0gdGFnTmFtZSB8
fCAnYm9keSc7CisKKyAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5yZW5kZXJlci5fZG9tLmNyZWF0
ZUVsZW1lbnQodGFnTmFtZSk7CisKKyAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kVG8odGhpcywg
ZWxlbWVudCk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBSZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50IHdp
dGggdGhpcyB2aWV3J3MKKyAgICAgIGVsZW1lbnQuIElmIHRoZSB2aWV3IGRvZXMgbm90IGhhdmUg
YW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsCisgICAgICB0aGUgZWxlbWVudCB3aWxsIGJlIGdl
bmVyYXRlZCBhdXRvbWF0aWNhbGx5LgorICAgICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBqdXN0
IHNjaGVkdWxlcyB0aGUgdmlldyB0byBiZSBhcHBlbmRlZDsgdGhlIERPTQorICAgICAgZWxlbWVu
dCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhbGwgYmlu
ZGluZ3MgaGF2ZQorICAgICAgZmluaXNoZWQgc3luY2hyb25pemluZworICAgICAgIEBtZXRob2Qg
cmVwbGFjZUluCisgICAgICBAcGFyYW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0gdGFyZ2V0
IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0CisgICAg
ICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlZAorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIHJlcGxhY2VJbjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CisgICAgICB2YXIgdGFyZ2V0ID0g
X2VtYmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWxlY3Rvcik7CisKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgdHJpZWQgdG8gcmVwbGFjZSBpbiAoJyArIHNlbGVjdG9y
ICsgJykgYnV0IHRoYXQgaXNuXCd0IGluIHRoZSBET00nLCB0YXJnZXQubGVuZ3RoID4gMCk7Cisg
ICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91IGNhbm5vdCByZXBsYWNlIGFuIGV4aXN0
aW5nIEVtYmVyLlZpZXcuJywgIXRhcmdldC5pcygnLmVtYmVyLXZpZXcnKSAmJiAhdGFyZ2V0LnBh
cmVudHMoKS5pcygnLmVtYmVyLXZpZXcnKSk7CisKKyAgICAgIHRoaXMucmVuZGVyZXIucmVwbGFj
ZUluKHRoaXMsIHRhcmdldFswXSk7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIEFwcGVuZHMgdGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBkb2N1bWVudCBi
b2R5LiBJZiB0aGUgdmlldyBkb2VzCisgICAgICBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0
aW9uIHlldAorICAgICAgdGhlIGVsZW1lbnQgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxs
eS4KKyAgICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgdGhlIGByb290RWxlbWVudGAgcHJv
cGVydHksIHlvdSBtdXN0IGFwcGVuZAorICAgICAgdGhlIHZpZXcgd2l0aGluIHRoYXQgZWxlbWVu
dC4gUmVuZGVyaW5nIHZpZXdzIG91dHNpZGUgb2YgdGhlIGByb290RWxlbWVudGAKKyAgICAgIGlz
IG5vdCBzdXBwb3J0ZWQuCisgICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1
bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCisgICAgICBlbGVtZW50IHdpbGwg
bm90IGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5IHVudGlsIGFsbCBiaW5kaW5ncyBo
YXZlCisgICAgICBmaW5pc2hlZCBzeW5jaHJvbml6aW5nLgorICAgICAgIEBtZXRob2QgYXBwZW5k
CisgICAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgorICAgICAgQHByaXZhdGUKKyAg
ICAqLworICAgIGFwcGVuZDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXBwZW5k
VG8oZG9jdW1lbnQuYm9keSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgUmVtb3ZlcyB0aGUg
dmlldydzIGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB0byB3aGljaCBpdCBpcyBhdHRhY2hlZC4K
KyAgICAgICBAbWV0aG9kIHJlbW92ZQorICAgICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2
ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIC8vIFdoYXQgd2Ugc2hvdWxkIHJlYWxseSBkbyBoZXJlIGlzIHdhaXQgdW50aWwgdGhlIGVu
ZCBvZiB0aGUgcnVuIGxvb3AKKyAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBo
YXMgYmVlbiByZS1hcHBlbmRlZCB0byBhIGRpZmZlcmVudAorICAgICAgLy8gZWxlbWVudC4KKyAg
ICAgIC8vIEluIHRoZSBpbnRlcmltLCB3ZSB3aWxsIGp1c3QgcmUtcmVuZGVyIGlmIHRoYXQgaGFw
cGVucy4gSXQgaXMgbW9yZQorICAgICAgLy8gaW1wb3J0YW50IHRoYW4gZWxlbWVudHMgZ2V0IGdh
cmJhZ2UgY29sbGVjdGVkLgorICAgICAgaWYgKCF0aGlzLnJlbW92ZWRGcm9tRE9NKSB7CisgICAg
ICAgIHRoaXMuZGVzdHJveUVsZW1lbnQoKTsKKyAgICAgIH0KKworICAgICAgLy8gU2V0IGZsYWcg
dG8gYXZvaWQgZnV0dXJlIHJlbmRlcnMKKyAgICAgIHRoaXMuX3dpbGxJbnNlcnQgPSBmYWxzZTsK
KyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGUgSFRNTCBgaWRgIG9mIHRoZSB2aWV3J3MgZWxl
bWVudCBpbiB0aGUgRE9NLiBZb3UgY2FuIHByb3ZpZGUgdGhpcworICAgICAgdmFsdWUgeW91cnNl
bGYgYnV0IGl0IG11c3QgYmUgdW5pcXVlIChqdXN0IGFzIGluIEhUTUwpOgorICAgICAgIGBgYGhh
bmRsZWJhcnMKKyAgICAgICAge3tteS1jb21wb25lbnQgZWxlbWVudElkPSJhLXJlYWxseS1jb29s
LWlkIn19CisgICAgICBgYGAKKyAgICAgICBJZiBub3QgbWFudWFsbHkgc2V0IGEgZGVmYXVsdCB2
YWx1ZSB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZXdvcmsuCisgICAgICAgT25jZSByZW5k
ZXJlZCBhbiBlbGVtZW50J3MgYGVsZW1lbnRJZGAgaXMgY29uc2lkZXJlZCBpbW11dGFibGUgYW5k
IHlvdQorICAgICAgc2hvdWxkIG5ldmVyIGNoYW5nZSBpdC4gSWYgeW91IG5lZWQgdG8gY29tcHV0
ZSBhIGR5bmFtaWMgdmFsdWUgZm9yIHRoZQorICAgICAgYGVsZW1lbnRJZGAsIHlvdSBzaG91bGQg
ZG8gdGhpcyB3aGVuIHRoZSBjb21wb25lbnQgb3IgZWxlbWVudCBpcyBiZWluZworICAgICAgaW5z
dGFudGlhdGVkOgorICAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAgICAgZXhwb3J0IGRlZmF1bHQg
RW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7CisgICAgICAgICAgc2V0RWxlbWVudElkOiBFbWJlci5v
bignaW5pdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXQo
J2luZGV4Jyk7CisgICAgICAgICAgICB0aGlzLnNldCgnZWxlbWVudElkJywgJ2NvbXBvbmVudC1p
ZCcgKyBpbmRleCk7CisgICAgICAgICAgfSkKKyAgICAgICAgfSk7CisgICAgICBgYGAKKyAgICAg
ICBAcHJvcGVydHkgZWxlbWVudElkCisgICAgICBAdHlwZSBTdHJpbmcKKyAgICAgIEBwdWJsaWMK
KyAgICAqLworICAgIGVsZW1lbnRJZDogbnVsbCwKKworICAgIC8qKgorICAgICAgQXR0ZW1wdHMg
dG8gZGlzY292ZXIgdGhlIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVmYXVs
dAorICAgICAgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yIGFuIGVsZW1lbnQgd2l0aCBhbiBJRCBv
ZiBgZWxlbWVudElkYCAob3IgdGhlCisgICAgICB2aWV3J3MgZ3VpZCBpZiBgZWxlbWVudElkYCBp
cyBudWxsKS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bworICAgICAgcHJvdmlkZSB5
b3VyIG93biBmb3JtIG9mIGxvb2t1cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRpc2Nv
dmVyIHlvdXIKKyAgICAgIGVsZW1lbnQgdXNpbmcgYSBDU1MgY2xhc3MgbmFtZSBpbnN0ZWFkIG9m
IGFuIElELgorICAgICAgIEBtZXRob2QgZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQKKyAgICAg
IEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50RWxlbWVudCBUaGUgcGFyZW50J3MgRE9NIGVsZW1l
bnQKKyAgICAgIEByZXR1cm4ge0RPTUVsZW1lbnR9IFRoZSBkaXNjb3ZlcmVkIGVsZW1lbnQKKyAg
ICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBmaW5kRWxlbWVudEluUGFyZW50RWxlbWVudDogZnVu
Y3Rpb24gKHBhcmVudEVsZW0pIHsKKyAgICAgIHZhciBpZCA9ICcjJyArIHRoaXMuZWxlbWVudElk
OworICAgICAgcmV0dXJuIF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoaWQpWzBdIHx8
IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoaWQsIHBhcmVudEVsZW0pWzBdOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIENyZWF0ZXMgYSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhl
IHZpZXcgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3MgYnkKKyAgICAgIHJlY3Vyc2l2ZWx5IGNh
bGxpbmcgdGhlIGByZW5kZXIoKWAgbWV0aG9kLiBPbmNlIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQs
CisgICAgICBpdCBzZXRzIHRoZSBgZWxlbWVudGAgcHJvcGVydHkgb2YgdGhlIHZpZXcgdG8gdGhl
IHJlbmRlcmVkIGVsZW1lbnQuCisgICAgICAgQWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gaW5z
ZXJ0ZWQgaW50byB0aGUgRE9NLCBgZGlkSW5zZXJ0RWxlbWVudGAgd2lsbAorICAgICAgYmUgY2Fs
bGVkIG9uIHRoaXMgdmlldyBhbmQgYWxsIG9mIGl0cyBjaGlsZCB2aWV3cy4KKyAgICAgICBAbWV0
aG9kIGNyZWF0ZUVsZW1lbnQKKyAgICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCisg
ICAgICBAcHJpdmF0ZQorICAgICovCisgICAgY3JlYXRlRWxlbWVudDogZnVuY3Rpb24gKCkgewor
ICAgICAgaWYgKHRoaXMuZWxlbWVudCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0K
KworICAgICAgdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMpOworCisgICAgICByZXR1
cm4gdGhpczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hlbiBhIHZpZXcgaXMg
Z29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NLgorICAgICAgIEBldmVudCB3
aWxsSW5zZXJ0RWxlbWVudAorICAgICAgQHB1YmxpYworICAgICovCisgICAgd2lsbEluc2VydEVs
ZW1lbnQ6IEssCisKKyAgICAvKioKKyAgICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRo
ZSB2aWV3IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTQorICAgICAgb3IgYWZ0ZXIgdGhl
IHZpZXcgd2FzIHJlLXJlbmRlcmVkLiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueQor
ICAgICAgc2V0IHVwIHRoYXQgcmVxdWlyZXMgYW4gZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQgYm9k
eS4KKyAgICAgICBXaGVuIGEgdmlldyBoYXMgY2hpbGRyZW4sIGRpZEluc2VydEVsZW1lbnQgd2ls
bCBiZSBjYWxsZWQgb24gdGhlCisgICAgICBjaGlsZCB2aWV3KHMpIGZpcnN0LCBidWJibGluZyB1
cHdhcmRzIHRocm91Z2ggdGhlIGhpZXJhcmNoeS4KKyAgICAgICBAZXZlbnQgZGlkSW5zZXJ0RWxl
bWVudAorICAgICAgQHB1YmxpYworICAgICovCisgICAgZGlkSW5zZXJ0RWxlbWVudDogSywKKwor
ICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIHZpZXcgaXMgYWJvdXQgdG8gcmVyZW5kZXIs
IGJ1dCBiZWZvcmUgYW55dGhpbmcgaGFzCisgICAgICBiZWVuIHRvcm4gZG93bi4gVGhpcyBpcyBh
IGdvb2Qgb3Bwb3J0dW5pdHkgdG8gdGVhciBkb3duIGFueSBtYW51YWwKKyAgICAgIG9ic2VydmVy
cyB5b3UgaGF2ZSBpbnN0YWxsZWQgYmFzZWQgb24gdGhlIERPTSBzdGF0ZQorICAgICAgIEBldmVu
dCB3aWxsQ2xlYXJSZW5kZXIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdpbGxDbGVhclJl
bmRlcjogSywKKworICAgIC8qKgorICAgICAgRGVzdHJveXMgYW55IGV4aXN0aW5nIGVsZW1lbnQg
YWxvbmcgd2l0aCB0aGUgZWxlbWVudCBmb3IgYW55IGNoaWxkIHZpZXdzCisgICAgICBhcyB3ZWxs
LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIGVsZW1lbnQsIHRoZW4gdGhp
cyBtZXRob2QKKyAgICAgIHdpbGwgZG8gbm90aGluZy4KKyAgICAgICBJZiB5b3UgaW1wbGVtZW50
IGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgb24geW91ciB2aWV3LCB0aGVuIHRoaXMgbWV0aG9kIHdp
bGwKKyAgICAgIGJlIGludm9rZWQgb24geW91ciB2aWV3IGJlZm9yZSB5b3VyIGVsZW1lbnQgaXMg
ZGVzdHJveWVkIHRvIGdpdmUgeW91IGEKKyAgICAgIGNoYW5jZSB0byBjbGVhbiB1cCBhbnkgZXZl
bnQgaGFuZGxlcnMsIGV0Yy4KKyAgICAgICBJZiB5b3Ugd3JpdGUgYSBgd2lsbERlc3Ryb3lFbGVt
ZW50KClgIGhhbmRsZXIsIHlvdSBjYW4gYXNzdW1lIHRoYXQgeW91cgorICAgICAgYGRpZEluc2Vy
dEVsZW1lbnQoKWAgaGFuZGxlciB3YXMgY2FsbGVkIGVhcmxpZXIgZm9yIHRoZSBzYW1lIGVsZW1l
bnQuCisgICAgICAgWW91IHNob3VsZCBub3QgY2FsbCBvciBvdmVycmlkZSB0aGlzIG1ldGhvZCB5
b3Vyc2VsZiwgYnV0IHlvdSBtYXkKKyAgICAgIHdhbnQgdG8gaW1wbGVtZW50IHRoZSBhYm92ZSBj
YWxsYmFja3MuCisgICAgICAgQG1ldGhvZCBkZXN0cm95RWxlbWVudAorICAgICAgQHJldHVybiB7
RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBkZXN0cm95
RWxlbWVudDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZS5k
ZXN0cm95RWxlbWVudCh0aGlzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBDYWxsZWQgd2hl
biB0aGUgZWxlbWVudCBvZiB0aGUgdmlldyBpcyBnb2luZyB0byBiZSBkZXN0cm95ZWQuIE92ZXJy
aWRlCisgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0ZWFyZG93biB0aGF0IHJlcXVpcmVz
IGFuIGVsZW1lbnQsIGxpa2UgcmVtb3ZpbmcKKyAgICAgIGV2ZW50IGxpc3RlbmVycy4KKyAgICAg
ICBQbGVhc2Ugbm90ZTogYW55IHByb3BlcnR5IGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhpcyBldmVu
dCB3aWxsIGhhdmUgbm8KKyAgICAgIGVmZmVjdCBvbiBvYmplY3Qgb2JzZXJ2ZXJzLgorICAgICAg
IEBldmVudCB3aWxsRGVzdHJveUVsZW1lbnQKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHdp
bGxEZXN0cm95RWxlbWVudDogSywKKworICAgIC8qKgorICAgICAgQ2FsbGVkIHdoZW4gdGhlIHBh
cmVudFZpZXcgcHJvcGVydHkgaGFzIGNoYW5nZWQuCisgICAgICAgQGV2ZW50IHBhcmVudFZpZXdE
aWRDaGFuZ2UKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBwYXJlbnRWaWV3RGlkQ2hhbmdl
OiBLLAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLgorICAgIC8vIFNUQU5EQVJEIFJFTkRFUiBQUk9QRVJUSUVTCisgICAg
Ly8KKworICAgIC8qKgorICAgICAgVGFnIG5hbWUgZm9yIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVu
dC4gVGhlIHRhZyBuYW1lIGlzIG9ubHkgdXNlZCB3aGVuIGFuCisgICAgICBlbGVtZW50IGlzIGZp
cnN0IGNyZWF0ZWQuIElmIHlvdSBjaGFuZ2UgdGhlIGB0YWdOYW1lYCBmb3IgYW4gZWxlbWVudCwg
eW91CisgICAgICBtdXN0IGRlc3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSB2aWV3IGVsZW1lbnQuCisg
ICAgICAgQnkgZGVmYXVsdCwgdGhlIHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBgPGRpdj5gIHRh
ZyBmb3Igdmlld3MuCisgICAgICAgQHByb3BlcnR5IHRhZ05hbWUKKyAgICAgIEB0eXBlIFN0cmlu
ZworICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHB1YmxpYworICAgICovCisKKyAgICAvLyBX
ZSBsZWF2ZSB0aGlzIG51bGwgYnkgZGVmYXVsdCBzbyB3ZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5j
ZSBiZXR3ZWVuCisgICAgLy8gdGhlIGRlZmF1bHQgY2FzZSBhbmQgYSB1c2VyLXNwZWNpZmllZCB0
YWcuCisgICAgdGFnTmFtZTogbnVsbCwKKworICAgIC8qCisgICAgICBVc2VkIHRvIHNwZWNpZnkg
YSBkZWZhdWx0IHRhZ05hbWUgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGV4dGVuZGluZwor
ICAgICAgb3IgaW52b2tpbmcgZnJvbSBhIHRlbXBsYXRlLgorICAgICAgIEBwcm9wZXJ0eSBfZGVm
YXVsdFRhZ05hbWUKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKworICAgIC8qKgorICAgICAgTm9y
bWFsbHksIEVtYmVyJ3MgY29tcG9uZW50IG1vZGVsIGlzICJ3cml0ZS1vbmx5Ii4gVGhlIGNvbXBv
bmVudCB0YWtlcyBhCisgICAgICBidW5jaCBvZiBhdHRyaWJ1dGVzIHRoYXQgaXQgZ290IHBhc3Nl
ZCBpbiwgYW5kIHVzZXMgdGhlbSB0byByZW5kZXIgaXRzCisgICAgICB0ZW1wbGF0ZS4KKyAgICAg
ICBPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIG1vZGVsIGlzIHRoYXQgaWYgeW91IHRyeSB0byBz
ZXQgYSB2YWx1ZSB0byB0aGUKKyAgICAgIHNhbWUgdGhpbmcgYXMgbGFzdCB0aW1lLCBFbWJlciAo
dGhyb3VnaCBIVE1MQmFycykgd2lsbCBhdm9pZCBkb2luZyBhbnkKKyAgICAgIHdvcmsgb24gdGhl
IERPTS4KKyAgICAgICBUaGlzIGlzIG5vdCBqdXN0IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9u
LiBJZiBhbiBhdHRyaWJ1dGUgaGFzIG5vdAorICAgICAgY2hhbmdlZCwgaXQgaXMgaW1wb3J0YW50
IG5vdCB0byBjbG9iYmVyIHRoZSBlbGVtZW50J3MgImhpZGRlbiBzdGF0ZSIuCisgICAgICBGb3Ig
ZXhhbXBsZSwgaWYgeW91IHNldCBhbiBpbnB1dCdzIGB2YWx1ZWAgdG8gdGhlIHNhbWUgdmFsdWUg
YXMgYmVmb3JlLAorICAgICAgaXQgd2lsbCBjbG9iYmVyIHNlbGVjdGlvbiBzdGF0ZSBhbmQgY3Vy
c29yIHBvc2l0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAgICAgIHNldHRpbmcgYW4gYXR0cmlidXRl
IGlzIG5vdCAqKmFsd2F5cyoqIGlkZW1wb3RlbnQuCisgICAgICAgVGhpcyBtZXRob2QgcHJvdmlk
ZXMgYSB3YXkgdG8gcmVhZCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIGFuZCBhbHNvCisgICAgICB1
cGRhdGUgdGhlIGxhc3QgdmFsdWUgRW1iZXIga25vd3MgYWJvdXQgYXQgdGhlIHNhbWUgdGltZS4g
VGhpcyBtYWtlcworICAgICAgc2V0dGluZyBhbiBhdHRyaWJ1dGUgaWRlbXBvdGVudC4KKyAgICAg
ICBJbiBwYXJ0aWN1bGFyLCB3aGF0IHRoaXMgbWVhbnMgaXMgdGhhdCBpZiB5b3UgZ2V0IGFuIGA8
aW5wdXQ+YCBlbGVtZW50J3MKKyAgICAgIGB2YWx1ZWAgYXR0cmlidXRlIGFuZCB0aGVuIHJlLXJl
bmRlciB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSwKKyAgICAgIGl0IHdpbGwgYXZv
aWQgY2xvYmJlcmluZyB0aGUgY3Vyc29yIGFuZCBzZWxlY3Rpb24gcG9zaXRpb24uCisgICAgICAg
U2luY2UgbW9zdCBhdHRyaWJ1dGUgc2V0cyBhcmUgaWRlbXBvdGVudCBpbiB0aGUgYnJvd3Nlciwg
eW91IHR5cGljYWxseQorICAgICAgY2FuIGdldCBhd2F5IHdpdGggcmVhZGluZyBhdHRyaWJ1dGVz
IHVzaW5nIGpRdWVyeSwgYnV0IHRoZSBtb3N0IHJlbGlhYmxlCisgICAgICB3YXkgdG8gZG8gc28g
aXMgdGhyb3VnaCB0aGlzIG1ldGhvZC4KKyAgICAgICBAbWV0aG9kIHJlYWRET01BdHRyCisgICAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICBA
cmV0dXJuIFN0cmluZworICAgICAgQHB1YmxpYworICAgICovCisgICAgcmVhZERPTUF0dHI6IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgYXR0ciA9IHRoaXMuX3JlbmRlck5vZGUuY2hpbGRO
b2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuYXR0ck5h
bWUgPT09IG5hbWU7CisgICAgICB9KVswXTsKKyAgICAgIGlmICghYXR0cikgeworICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhdHRyLmdldENvbnRlbnQoKTsKKyAg
ICB9LAorCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgorICAgIC8vIENPUkUgRElTUExBWSBNRVRIT0RTCisgICAgLy8KKworICAg
IC8qKgorICAgICAgU2V0dXAgYSB2aWV3LCBidXQgZG8gbm90IGZpbmlzaCB3YWtpbmcgaXQgdXAu
CisgICAgICAgKiBjb25maWd1cmUgYGNoaWxkVmlld3NgCisgICAgICAqIHJlZ2lzdGVyIHRoZSB2
aWV3IHdpdGggdGhlIGdsb2JhbCB2aWV3cyBoYXNoLCB3aGljaCBpcyB1c2VkIGZvciBldmVudAor
ICAgICAgICBkaXNwYXRjaAorICAgICAgIEBtZXRob2QgaW5pdAorICAgICAgQHByaXZhdGUKKyAg
ICAqLworICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisKKyAgICAgIGlmICghdGhpcy5lbGVtZW50SWQpIHsKKyAgICAgICAg
dGhpcy5lbGVtZW50SWQgPSBfZW1iZXJNZXRhbFV0aWxzLmd1aWRGb3IodGhpcyk7CisgICAgICB9
CisKKyAgICAgIHRoaXMuc2NoZWR1bGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7CisKKyAgICAgIHRo
aXNbSU5JVF9XQVNfQ0FMTEVEXSA9IHRydWU7CisKKyAgICAgIGlmICh0eXBlb2YgdGhpcy5kaWRJ
bml0QXR0cnMgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5kZXBy
ZWNhdGUoJ1tERVBSRUNBVEVEXSBkaWRJbml0QXR0cnMgY2FsbGVkIGluICcgKyB0aGlzLnRvU3Ry
aW5nKCkgKyAnLicsIGZhbHNlLCB7CisgICAgICAgICAgaWQ6ICdlbWJlci12aWV3cy5kaWQtaW5p
dC1hdHRycycsCisgICAgICAgICAgdW50aWw6ICczLjAuMCcsCisgICAgICAgICAgdXJsOiAnaHR0
cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92Mi54I3RvY19lbWJlci1jb21wb25lbnQtZGlk
aW5pdGF0dHJzJworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyTWV0YWxEZWJ1
Zy5hc3NlcnQoJ1VzaW5nIGEgY3VzdG9tIGAucmVuZGVyYCBmdW5jdGlvbiBpcyBubyBsb25nZXIg
c3VwcG9ydGVkLicsICF0aGlzLnJlbmRlcik7CisgICAgfQorCisgIH0sIF9NaXhpbiRjcmVhdGVb
X2VtYmVyUnVudGltZVN5c3RlbUNvcmVfb2JqZWN0LlBPU1RfSU5JVF0gPSBmdW5jdGlvbiAoKSB7
CisgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgIF9lbWJlck1l
dGFsRGVidWcuYXNzZXJ0KCdZb3UgbXVzdCBjYWxsIGB0aGlzLl9zdXBlciguLi5hcmd1bWVudHMp
O2Agd2hlbiBpbXBsZW1lbnRpbmcgYGluaXRgIGluIGEgY29tcG9uZW50LiBQbGVhc2UgdXBkYXRl
ICcgKyB0aGlzICsgJyB0byBjYWxsIGB0aGlzLl9zdXBlcmAgZnJvbSBgaW5pdGAuJywgdGhpc1tJ
TklUX1dBU19DQUxMRURdKTsKKworICAgIHRoaXMucmVuZGVyZXIuY29tcG9uZW50SW5pdEF0dHJz
KHRoaXMsIHRoaXMuYXR0cnMgfHwge30pOworICB9LCBfTWl4aW4kY3JlYXRlLl9fZGVmaW5lTm9u
RW51bWVyYWJsZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkgeworICAgIHRoaXNbcHJvcGVydHkubmFt
ZV0gPSBwcm9wZXJ0eS5kZXNjcmlwdG9yLnZhbHVlOworICB9LCBfTWl4aW4kY3JlYXRlLnJldmFs
aWRhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5yZW5kZXJlci5yZXZhbGlkYXRlVG9wTGV2
ZWxWaWV3KHRoaXMpOworICAgIHRoaXMuc2NoZWR1bGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7Cisg
IH0sIF9NaXhpbiRjcmVhdGUuc2NoZWR1bGVSZXZhbGlkYXRlID0gZnVuY3Rpb24gKG5vZGUsIGxh
YmVsLCBtYW51YWxSZXJlbmRlcikgeworICAgIGlmIChub2RlICYmICF0aGlzLl9kaXNwYXRjaGlu
ZyAmJiB0aGlzLmVudi5yZW5kZXJlZE5vZGVzLmhhcyhub2RlKSkgeworICAgICAgaWYgKG1hbnVh
bFJlcmVuZGVyKSB7CisgICAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdZb3UgbWFu
dWFsbHkgcmVyZW5kZXJlZCAnICsgbGFiZWwgKyAnIChhIHBhcmVudCBjb21wb25lbnQpIGZyb20g
YSBjaGlsZCBjb21wb25lbnQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy4gVGhpcyByYXJl
bHkgd29ya2VkIGluIEVtYmVyIDEueCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEVtYmVyIDMuMCcs
IGZhbHNlLCB7IGlkOiAnZW1iZXItdmlld3MubWFudWFsLXBhcmVudC1yZXJlbmRlcicsIHVudGls
OiAnMy4wLjAnIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5k
ZXByZWNhdGUoJ1lvdSBtb2RpZmllZCAnICsgbGFiZWwgKyAnIHR3aWNlIGluIGEgc2luZ2xlIHJl
bmRlci4gVGhpcyB3YXMgdW5yZWxpYWJsZSBpbiBFbWJlciAxLnggYW5kIHdpbGwgYmUgcmVtb3Zl
ZCBpbiBFbWJlciAzLjAnLCBmYWxzZSwgeyBpZDogJ2VtYmVyLXZpZXdzLnJlbmRlci1kb3VibGUt
bW9kaWZ5JywgdW50aWw6ICczLjAuMCcgfSk7CisgICAgICB9CisgICAgICBfZW1iZXJNZXRhbFJ1
bl9sb29wLmRlZmF1bHQuc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCB0aGlzLnJldmFsaWRh
dGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVj
YXRlKCdBIHByb3BlcnR5IG9mICcgKyB0aGlzICsgJyB3YXMgbW9kaWZpZWQgaW5zaWRlIHRoZSAn
ICsgdGhpcy5fZGlzcGF0Y2hpbmcgKyAnIGhvb2suIFlvdSBzaG91bGQgbmV2ZXIgY2hhbmdlIHBy
b3BlcnRpZXMgb24gY29tcG9uZW50cywgc2VydmljZXMgb3IgbW9kZWxzIGR1cmluZyAnICsgdGhp
cy5fZGlzcGF0Y2hpbmcgKyAnIGJlY2F1c2UgaXQgY2F1c2VzIHNpZ25pZmljYW50IHBlcmZvcm1h
bmNlIGRlZ3JhZGF0aW9uLicsICF0aGlzLl9kaXNwYXRjaGluZywgeyBpZDogJ2VtYmVyLXZpZXdz
LmRpc3BhdGNoaW5nLW1vZGlmeS1wcm9wZXJ0eScsIHVudGlsOiAnMy4wLjAnIH0pOworCisgICAg
aWYgKCF0aGlzLnNjaGVkdWxlZFJldmFsaWRhdGlvbiB8fCB0aGlzLl9kaXNwYXRjaGluZykgewor
ICAgICAgdGhpcy5zY2hlZHVsZWRSZXZhbGlkYXRpb24gPSB0cnVlOworICAgICAgX2VtYmVyTWV0
YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgdGhpcy5yZXZh
bGlkYXRlKTsKKyAgICB9CisgIH0sIF9NaXhpbiRjcmVhdGUudGVtcGxhdGVSZW5kZXJlciA9IG51
bGwsIF9NaXhpbiRjcmVhdGUucmVtb3ZlRnJvbVBhcmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICB2
YXIgcGFyZW50ID0gdGhpcy5wYXJlbnRWaWV3OworCisgICAgLy8gUmVtb3ZlIERPTSBlbGVtZW50
IGZyb20gcGFyZW50CisgICAgdGhpcy5yZW1vdmUoKTsKKworICAgIGlmIChwYXJlbnQpIHsKKyAg
ICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7Cisg
IH0sIF9NaXhpbiRjcmVhdGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKKyAgICAvLyBnZXQgcGFy
ZW50VmlldyBiZWZvcmUgY2FsbGluZyBzdXBlciBiZWNhdXNlIGl0J2xsIGJlIGRlc3Ryb3llZAor
ICAgIHZhciBwYXJlbnRWaWV3ID0gdGhpcy5wYXJlbnRWaWV3OworICAgIHZhciB2aWV3TmFtZSA9
IHRoaXMudmlld05hbWU7CisKKyAgICBpZiAoIXRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgZnJvbSBub24t
dmlydHVhbCBwYXJlbnQgdmlldyBpZiB2aWV3TmFtZSB3YXMgc3BlY2lmaWVkCisgICAgaWYgKHZp
ZXdOYW1lICYmIHBhcmVudFZpZXcpIHsKKyAgICAgIHBhcmVudFZpZXcuc2V0KHZpZXdOYW1lLCBu
dWxsKTsKKyAgICB9CisKKyAgICAvLyBEZXN0cm95IEhUTUxiYXJzIHRlbXBsYXRlCisgICAgaWYg
KHRoaXMubGFzdFJlc3VsdCkgeworICAgICAgdGhpcy5sYXN0UmVzdWx0LmRlc3Ryb3koKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfSwgX01peGluJGNyZWF0ZS5oYW5kbGVFdmVudCA9
IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2dCkgeworICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3Rh
dGUuaGFuZGxlRXZlbnQodGhpcywgZXZlbnROYW1lLCBldnQpOworICB9LCBfTWl4aW4kY3JlYXRl
Ll9yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgn
QXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGEgdmlldyB3aXRoIGFuIGlkIGFscmVhZHkgaW4gdXNlOiAn
ICsgdGhpcy5lbGVtZW50SWQsICF0aGlzLl92aWV3UmVnaXN0cnlbdGhpcy5lbGVtZW50SWRdKTsK
KyAgICB0aGlzLl92aWV3UmVnaXN0cnlbdGhpcy5lbGVtZW50SWRdID0gdGhpczsKKyAgfSwgX01p
eGluJGNyZWF0ZS5fdW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHsKKyAgICBkZWxldGUgdGhpcy5f
dmlld1JlZ2lzdHJ5W3RoaXMuZWxlbWVudElkXTsKKyAgfSwgX01peGluJGNyZWF0ZS5yZWdpc3Rl
ck9ic2VydmVyID0gZnVuY3Rpb24gKHJvb3QsIHBhdGgsIHRhcmdldCwgb2JzZXJ2ZXIpIHsKKyAg
ICBpZiAoIW9ic2VydmVyICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKKyAgICAg
IG9ic2VydmVyID0gdGFyZ2V0OworICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBp
ZiAoIXJvb3QgfHwgdHlwZW9mIHJvb3QgIT09ICdvYmplY3QnKSB7CisgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgdmFyIHNjaGVkdWxlZE9ic2VydmVyID0gdGhpcy5fd3JhcEFzU2NoZWR1bGVk
KG9ic2VydmVyKTsKKworICAgIF9lbWJlck1ldGFsT2JzZXJ2ZXIuYWRkT2JzZXJ2ZXIocm9vdCwg
cGF0aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZlcik7CisKKyAgICB0aGlzLm9uZSgnd2lsbENs
ZWFyUmVuZGVyJywgZnVuY3Rpb24gKCkgeworICAgICAgX2VtYmVyTWV0YWxPYnNlcnZlci5yZW1v
dmVPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2VydmVyKTsKKyAgICB9
KTsKKyAgfSwgX01peGluJGNyZWF0ZS5fd3JhcEFzU2NoZWR1bGVkID0gZnVuY3Rpb24gKGZuKSB7
CisgICAgdmFyIHZpZXcgPSB0aGlzOworICAgIHZhciBzdGF0ZUNoZWNrZWRGbiA9IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHZpZXcuX2N1cnJlbnRTdGF0ZS5pbnZva2VPYnNlcnZlcih0aGlzLCBmbik7
CisgICAgfTsKKyAgICB2YXIgc2NoZWR1bGVkRm4gPSBmdW5jdGlvbiAoKSB7CisgICAgICBfZW1i
ZXJNZXRhbFJ1bl9sb29wLmRlZmF1bHQuc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCBzdGF0
ZUNoZWNrZWRGbik7CisgICAgfTsKKyAgICByZXR1cm4gc2NoZWR1bGVkRm47CisgIH0sIF9NaXhp
biRjcmVhdGUpKTsKK30pOworLyoKKyBUaGlzIGlzIGEgc3BlY2lhbCBob29rIGltcGxlbWVudGVk
IGluIENvcmVPYmplY3QsIHRoYXQgYWxsb3dzIFZpZXdzL0NvbXBvbmVudHMKKyB0byBoYXZlIGEg
d2F5IHRvIGVuc3VyZSB0aGF0IGBpbml0YCBmaXJlcyBiZWZvcmUgYGRpZEluaXRBdHRyc2AgLyBg
ZGlkUmVjZWl2ZUF0dHJzYAorIChzbyB0aGF0IGB0aGlzLl9zdXBlcmAgaW4gaW5pdCBkb2VzIG5v
dCB0cmlnZ2VyIGBkaWRSZWNlaXZlQXR0cnNgIGJlZm9yZSB0aGUgY2xhc3NlcworIG93biBgaW5p
dGAgaXMgZmluaXNoZWQpLgorICBAbWV0aG9kIF9fcG9zdEluaXRJbml0aWFsaXphdGlvbgorIEBw
cml2YXRlCisgKi8KKworLyoqCisgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVudFZp
ZXdgLCBpZiBvbmUgaXMgZm91bmQuIE90aGVyd2lzZQorICBkb2VzIG5vdGhpbmcuCisgICBAbWV0
aG9kIHJlbW92ZUZyb21QYXJlbnQKKyAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKKyAg
QHByaXZhdGUKKyovCisKKy8qKgorICBZb3UgbXVzdCBjYWxsIGBkZXN0cm95YCBvbiBhIHZpZXcg
dG8gZGVzdHJveSB0aGUgdmlldyAoYW5kIGFsbCBvZiBpdHMKKyAgY2hpbGQgdmlld3MpLiBUaGlz
IHdpbGwgcmVtb3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVudCBub2RlLCB0aGVuIG1ha2UKKyAg
c3VyZSB0aGF0IHRoZSBET00gZWxlbWVudCBtYW5hZ2VkIGJ5IHRoZSB2aWV3IGNhbiBiZSByZWxl
YXNlZCBieSB0aGUKKyAgbWVtb3J5IG1hbmFnZXIuCisgICBAbWV0aG9kIGRlc3Ryb3kKKyAgQHBy
aXZhdGUKKyovCisKKy8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KKy8vIEVWRU5UIEhBTkRMSU5HCisvLworCisvKioKKyAgSGFuZGxlIGV2
ZW50cyBmcm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgICBAbWV0aG9kIGhhbmRsZUV2ZW50
CisgIEBwYXJhbSBldmVudE5hbWUge1N0cmluZ30KKyAgQHBhcmFtIGV2dCB7RXZlbnR9CisgIEBw
cml2YXRlCisqLworCisvKioKKyAgUmVnaXN0ZXJzIHRoZSB2aWV3IGluIHRoZSB2aWV3IHJlZ2lz
dHJ5LCBrZXllZCBvbiB0aGUgdmlldydzIGBlbGVtZW50SWRgLgorICBUaGlzIGlzIHVzZWQgYnkg
dGhlIEV2ZW50RGlzcGF0Y2hlciB0byBsb2NhdGUgdGhlIHZpZXcgaW4gcmVzcG9uc2UgdG8KKyAg
ZXZlbnRzLgorICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgdGhlIHZp
ZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUKKyAgRE9NLgorICAgQG1ldGhvZCBfcmVnaXN0
ZXIKKyAgQHByaXZhdGUKKyovCisKKy8qKgorICBSZW1vdmVzIHRoZSB2aWV3IGZyb20gdGhlIHZp
ZXcgcmVnaXN0cnkuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZQorICB2aWV3IGlzIHJl
bW92ZWQgZnJvbSBET00uCisgICBAbWV0aG9kIF91bnJlZ2lzdGVyCisgIEBwcml2YXRlCisqLwor
ZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlld190YXJnZXRfYWN0aW9uX3N1cHBvcnQnLCBb
J2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvbWl4aW4nLCAnZW1iZXItcnVudGltZS9taXhpbnMvdGFy
Z2V0X2FjdGlvbl9zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2FsaWFzJ10sIGZ1bmN0aW9uIChleHBv
cnRzLCBfZW1iZXJNZXRhbE1peGluLCBfZW1iZXJSdW50aW1lTWl4aW5zVGFyZ2V0X2FjdGlvbl9z
dXBwb3J0LCBfZW1iZXJNZXRhbEFsaWFzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAg
YEVtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGluIHRoYXQgY2FuIGJlIGlu
Y2x1ZGVkIGluIGEKKyAgdmlldyBjbGFzcyB0byBhZGQgYSBgdHJpZ2dlckFjdGlvbmAgbWV0aG9k
IHdpdGggc2VtYW50aWNzIHNpbWlsYXIgdG8KKyAgdGhlIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1g
IGhlbHBlci4gSXQgcHJvdmlkZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMKKyAgZm9yIHRoZSBhY3Rp
b24ncyB0YXJnZXQ6IHRoZSB2aWV3J3MgY29udHJvbGxlcjsgYW5kIHRoZSBjb250ZXh0IHRoYXQg
aXMKKyAgc2VudCB3aXRoIHRoZSBhY3Rpb246IHRoZSB2aWV3J3MgY29udGV4dC4KKyAgCisgIE5v
dGU6IEluIG5vcm1hbCBFbWJlciB1c2FnZSwgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgaXMgdXN1
YWxseSB0aGUgYmVzdAorICBjaG9pY2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRlbiB1c2VmdWwg
d2hlbiB5b3UgYXJlIGRvaW5nIG1vcmUgY29tcGxleAorICBldmVudCBoYW5kbGluZyBpbiBjdXN0
b20gVmlldyBzdWJjbGFzc2VzLgorICAKKyAgRm9yIGV4YW1wbGU6CisgIAorICBgYGBqYXZhc2Ny
aXB0CisgIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlZpZXdU
YXJnZXRBY3Rpb25TdXBwb3J0LCB7CisgICAgYWN0aW9uOiAnc2F2ZScsCisgICAgY2xpY2s6IGZ1
bmN0aW9uKCkgeworICAgICAgdGhpcy50cmlnZ2VyQWN0aW9uKCk7IC8vIFNlbmRzIHRoZSBgc2F2
ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCisgICAgfQorICB9KTsK
KyAgYGBgCisgIAorICBUaGUgYGFjdGlvbmAgY2FuIGJlIHByb3ZpZGVkIGFzIHByb3BlcnRpZXMg
b2YgYW4gb3B0aW9uYWwgb2JqZWN0IGFyZ3VtZW50CisgIHRvIGB0cmlnZ2VyQWN0aW9uYCBhcyB3
ZWxsLgorICAKKyAgYGBgamF2YXNjcmlwdAorICBBcHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgeworICAgIGNsaWNrOiBm
dW5jdGlvbigpIHsKKyAgICAgIHRoaXMudHJpZ2dlckFjdGlvbih7CisgICAgICAgIGFjdGlvbjog
J3NhdmUnCisgICAgICB9KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGgg
dGhlIGN1cnJlbnQgY29udGV4dAorICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xs
ZXIKKyAgICB9CisgIH0pOworICBgYGAKKyAgCisgIEBjbGFzcyBWaWV3VGFyZ2V0QWN0aW9uU3Vw
cG9ydAorICBAbmFtZXNwYWNlIEVtYmVyCisgIEBleHRlbmRzIEVtYmVyLlRhcmdldEFjdGlvblN1
cHBvcnQKKyAgQHByaXZhdGUKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyTWV0YWxN
aXhpbi5NaXhpbi5jcmVhdGUoX2VtYmVyUnVudGltZU1peGluc1RhcmdldF9hY3Rpb25fc3VwcG9y
dC5kZWZhdWx0LCB7CisgICAgLyoqCisgICAgIEBwcm9wZXJ0eSB0YXJnZXQKKyAgICAgQHByaXZh
dGUKKyAgICAqLworICAgIHRhcmdldDogX2VtYmVyTWV0YWxBbGlhcy5kZWZhdWx0KCdjb250cm9s
bGVyJyksCisgICAgLyoqCisgICAgIEBwcm9wZXJ0eSBhY3Rpb25Db250ZXh0CisgICAgIEBwcml2
YXRlCisgICAgKi8KKyAgICBhY3Rpb25Db250ZXh0OiBfZW1iZXJNZXRhbEFsaWFzLmRlZmF1bHQo
J2NvbnRleHQnKQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9taXhpbnMvdmlzaWJp
bGl0eV9zdXBwb3J0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL21peGluJywgJ2VtYmVyLW1l
dGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9ydW5fbG9vcCddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyTWV0YWxNaXhpbiwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1l
dGFsUnVuX2xvb3ApIHsKKyAgLyoqCisgICBAbW9kdWxlIGVtYmVyCisgICBAc3VibW9kdWxlIGVt
YmVyLXZpZXdzCisgICovCisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBLKCkgeworICAg
IHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICBAY2xhc3MgVmlzaWJpbGl0eVN1cHBvcnQK
KyAgIEBuYW1lc3BhY2UgRW1iZXIKKyAgIEBwdWJsaWMKKyAgKi8KKyAgdmFyIFZpc2liaWxpdHlT
dXBwb3J0ID0gX2VtYmVyTWV0YWxNaXhpbi5NaXhpbi5jcmVhdGUoeworICAgIC8qKgorICAgICAg
SWYgYGZhbHNlYCwgdGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVuIGluIERPTS4KKyAgICAgICBA
cHJvcGVydHkgaXNWaXNpYmxlCisgICAgICBAdHlwZSBCb29sZWFuCisgICAgICBAZGVmYXVsdCBu
dWxsCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBpc1Zpc2libGU6IHRydWUsCisKKyAgICBi
ZWNhbWVWaXNpYmxlOiBLLAorICAgIGJlY2FtZUhpZGRlbjogSywKKworICAgIC8qKgorICAgICAg
V2hlbiB0aGUgdmlldydzIGBpc1Zpc2libGVgIHByb3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUg
dmlzaWJpbGl0eQorICAgICAgZWxlbWVudCBvZiB0aGUgYWN0dWFsIERPTSBlbGVtZW50LgorICAg
ICAgIEBtZXRob2QgX2lzVmlzaWJsZURpZENoYW5nZQorICAgICAgQHByaXZhdGUKKyAgICAqLwor
ICAgIF9pc1Zpc2libGVEaWRDaGFuZ2U6IF9lbWJlck1ldGFsTWl4aW4ub2JzZXJ2ZXIoJ2lzVmlz
aWJsZScsIGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNWaXNpYmxlJykpIHsKKyAgICAgICAgcmV0
dXJuOworICAgICAgfQorICAgICAgX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0LnNjaGVkdWxl
T25jZSgncmVuZGVyJywgdGhpcywgdGhpcy5fdG9nZ2xlVmlzaWJpbGl0eSk7CisgICAgfSksCisK
KyAgICBfdG9nZ2xlVmlzaWJpbGl0eTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyICRlbCA9IHRo
aXMuJCgpOworICAgICAgdmFyIGlzVmlzaWJsZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh0aGlzLCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IGlz
VmlzaWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIEl0J3MgaW1w
b3J0YW50IHRvIGtlZXAgdGhlc2UgaW4gc3luYywgZXZlbiBpZiB3ZSBkb24ndCB5ZXQgaGF2ZQor
ICAgICAgLy8gYW4gZWxlbWVudCBpbiB0aGUgRE9NIHRvIG1hbmlwdWxhdGU6CisgICAgICB0aGlz
Ll9pc1Zpc2libGUgPSBpc1Zpc2libGU7CisKKyAgICAgIGlmICghJGVsKSB7CisgICAgICAgIHJl
dHVybjsKKyAgICAgIH0KKworICAgICAgJGVsLnRvZ2dsZShpc1Zpc2libGUpOworCisgICAgICBp
ZiAodGhpcy5faXNBbmNlc3RvckhpZGRlbigpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0K
KworICAgICAgaWYgKGlzVmlzaWJsZSkgeworICAgICAgICB0aGlzLl9ub3RpZnlCZWNhbWVWaXNp
YmxlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLl9ub3RpZnlCZWNhbWVIaWRkZW4o
KTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX25vdGlmeUJlY2FtZVZpc2libGU6IGZ1bmN0aW9u
ICgpIHsKKyAgICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmlzaWJsZScpOworCisgICAgICB0aGlz
LmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgICAgdmFyIGlzVmlzaWJs
ZSA9IF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh2aWV3LCAnaXNWaXNpYmxlJyk7CisKKyAg
ICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpc1Zpc2libGUgPT09IG51bGwpIHsKKyAgICAgICAgICB2
aWV3Ll9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0s
CisKKyAgICBfbm90aWZ5QmVjYW1lSGlkZGVuOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLnRy
aWdnZXIoJ2JlY2FtZUhpZGRlbicpOworICAgICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1bmN0
aW9uICh2aWV3KSB7CisgICAgICAgIHZhciBpc1Zpc2libGUgPSBfZW1iZXJNZXRhbFByb3BlcnR5
X2dldC5nZXQodmlldywgJ2lzVmlzaWJsZScpOworCisgICAgICAgIGlmIChpc1Zpc2libGUgfHwg
aXNWaXNpYmxlID09PSBudWxsKSB7CisgICAgICAgICAgdmlldy5fbm90aWZ5QmVjYW1lSGlkZGVu
KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0sCisKKyAgICBfaXNBbmNlc3RvckhpZGRl
bjogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHBhcmVudCA9IF9lbWJlck1ldGFsUHJvcGVydHlf
Z2V0LmdldCh0aGlzLCAncGFyZW50VmlldycpOworCisgICAgICB3aGlsZSAocGFyZW50KSB7Cisg
ICAgICAgIGlmIChfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFyZW50LCAnaXNWaXNpYmxl
JykgPT09IGZhbHNlKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAg
ICAgICBwYXJlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQocGFyZW50LCAncGFyZW50
VmlldycpOworICAgICAgfQorCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBWaXNpYmlsaXR5U3VwcG9ydDsKK30pOworZW5pZmVkKCdlbWJl
ci12aWV3cy9zdHJlYW1zL2NsYXNzX25hbWVfYmluZGluZycsIFsnZXhwb3J0cycsICdlbWJlci1t
ZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvdXRp
bHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscycsICdlbWJlci1ydW50aW1lL3N5c3RlbS9z
dHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFV0aWxzLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscywg
X2VtYmVyUnVudGltZVN5c3RlbVN0cmluZykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0
cy5wYXJzZVByb3BlcnR5UGF0aCA9IHBhcnNlUHJvcGVydHlQYXRoOworICBleHBvcnRzLmNsYXNz
U3RyaW5nRm9yVmFsdWUgPSBjbGFzc1N0cmluZ0ZvclZhbHVlOworICBleHBvcnRzLnN0cmVhbWlm
eUNsYXNzTmFtZUJpbmRpbmcgPSBzdHJlYW1pZnlDbGFzc05hbWVCaW5kaW5nOworCisgIC8qKgor
ICAgIFBhcnNlIGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xkcyB0aGUgcGFy
c2VkIHByb3BlcnRpZXMuCisgIAorICAgIEZvciBleGFtcGxlIGEgcGF0aCBsaWtlICJjb250ZW50
LmlzRW5hYmxlZDplbmFibGVkOmRpc2FibGVkIiB3aWxsIHJldHVybiB0aGUKKyAgICBmb2xsb3dp
bmcgb2JqZWN0OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeworICAgICAgcGF0aDogImNv
bnRlbnQuaXNFbmFibGVkIiwKKyAgICAgIGNsYXNzTmFtZTogImVuYWJsZWQiLAorICAgICAgZmFs
c3lDbGFzc05hbWU6ICJkaXNhYmxlZCIsCisgICAgICBjbGFzc05hbWVzOiAiOmVuYWJsZWQ6ZGlz
YWJsZWQiCisgICAgfQorICAgIGBgYAorICAKKyAgICBAbWV0aG9kIHBhcnNlUHJvcGVydHlQYXRo
CisgICAgQHN0YXRpYworICAgIEBwcml2YXRlCisgICovCisKKyAgZnVuY3Rpb24gcGFyc2VQcm9w
ZXJ0eVBhdGgocGF0aCkgeworICAgIHZhciBzcGxpdCA9IHBhdGguc3BsaXQoJzonKTsKKyAgICB2
YXIgcHJvcGVydHlQYXRoID0gc3BsaXRbMF07CisgICAgdmFyIGNsYXNzTmFtZXMgPSAnJzsKKyAg
ICB2YXIgY2xhc3NOYW1lLCBmYWxzeUNsYXNzTmFtZTsKKworICAgIC8vIGNoZWNrIGlmIHRoZSBw
cm9wZXJ0eSBpcyBkZWZpbmVkIGFzIHByb3A6Y2xhc3Mgb3IgcHJvcDp0cnVlQ2xhc3M6ZmFsc2VD
bGFzcworICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7CisgICAgICBjbGFzc05hbWUgPSBzcGxp
dFsxXTsKKyAgICAgIGlmIChzcGxpdC5sZW5ndGggPT09IDMpIHsKKyAgICAgICAgZmFsc3lDbGFz
c05hbWUgPSBzcGxpdFsyXTsKKyAgICAgIH0KKworICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNs
YXNzTmFtZTsKKyAgICAgIGlmIChmYWxzeUNsYXNzTmFtZSkgeworICAgICAgICBjbGFzc05hbWVz
ICs9ICc6JyArIGZhbHN5Q2xhc3NOYW1lOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7
CisgICAgICBwYXRoOiBwcm9wZXJ0eVBhdGgsCisgICAgICBjbGFzc05hbWVzOiBjbGFzc05hbWVz
LAorICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgPT09ICcnID8gdW5kZWZpbmVkIDogY2xhc3NO
YW1lLAorICAgICAgZmFsc3lDbGFzc05hbWU6IGZhbHN5Q2xhc3NOYW1lCisgICAgfTsKKyAgfQor
CisgIC8qKgorICAgIEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBnaXZlbiB2YWx1ZSwgYmFzZWQg
b24gdGhlIHBhdGgsIG9wdGlvbmFsCisgICAgYGNsYXNzTmFtZWAgYW5kIG9wdGlvbmFsIGBmYWxz
eUNsYXNzTmFtZWAuCisgIAorICAgIC0gaWYgYSBgY2xhc3NOYW1lYCBvciBgZmFsc3lDbGFzc05h
bWVgIGhhcyBiZWVuIHNwZWNpZmllZDoKKyAgICAgIC0gaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBh
bmQgYGNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAgICBgY2xhc3NOYW1lYCBp
cyByZXR1cm5lZAorICAgICAgLSBpZiB0aGUgdmFsdWUgaXMgZmFsc3kgYW5kIGBmYWxzeUNsYXNz
TmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAgICBgZmFsc3lDbGFzc05hbWVgIGlzIHJl
dHVybmVkCisgICAgICAtIG90aGVyd2lzZSBgbnVsbGAgaXMgcmV0dXJuZWQKKyAgICAtIGlmIHRo
ZSB2YWx1ZSBpcyBgdHJ1ZWAsIHRoZSBkYXNoZXJpemVkIGxhc3QgcGFydCBvZiB0aGUgc3VwcGxp
ZWQgcGF0aAorICAgICAgaXMgcmV0dXJuZWQKKyAgICAtIGlmIHRoZSB2YWx1ZSBpcyBub3QgYGZh
bHNlYCwgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZhbHVlYAorICAgICAgaXMgcmV0dXJu
ZWQKKyAgICAtIGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVzIGFwcGx5LCBgbnVsbGAgaXMgcmV0
dXJuZWQKKyAgCisgICAgQG1ldGhvZCBjbGFzc1N0cmluZ0ZvclZhbHVlCisgICAgQHBhcmFtIHBh
dGgKKyAgICBAcGFyYW0gdmFsCisgICAgQHBhcmFtIGNsYXNzTmFtZQorICAgIEBwYXJhbSBmYWxz
eUNsYXNzTmFtZQorICAgIEBzdGF0aWMKKyAgICBAcHJpdmF0ZQorICAqLworCisgIGZ1bmN0aW9u
IGNsYXNzU3RyaW5nRm9yVmFsdWUocGF0aCwgdmFsLCBjbGFzc05hbWUsIGZhbHN5Q2xhc3NOYW1l
KSB7CisgICAgaWYgKF9lbWJlck1ldGFsVXRpbHMuaXNBcnJheSh2YWwpKSB7CisgICAgICB2YWwg
PSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmFsLCAnbGVuZ3RoJykgIT09IDA7CisgICAg
fQorCisgICAgLy8gV2hlbiB1c2luZyB0aGUgY29sb24gc3ludGF4LCBldmFsdWF0ZSB0aGUgdHJ1
dGhpbmVzcyBvciBmYWxzaW5lc3MKKyAgICAvLyBvZiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHdo
aWNoIGNsYXNzTmFtZSB0byByZXR1cm4KKyAgICBpZiAoY2xhc3NOYW1lIHx8IGZhbHN5Q2xhc3NO
YW1lKSB7CisgICAgICBpZiAoY2xhc3NOYW1lICYmICEhdmFsKSB7CisgICAgICAgIHJldHVybiBj
bGFzc05hbWU7CisgICAgICB9IGVsc2UgaWYgKGZhbHN5Q2xhc3NOYW1lICYmICF2YWwpIHsKKyAg
ICAgICAgcmV0dXJuIGZhbHN5Q2xhc3NOYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHZhbHVlIGlzIGEgQm9vbGVhbiBhbmQg
dHJ1ZSwgcmV0dXJuIHRoZSBkYXNoZXJpemVkIHByb3BlcnR5CisgICAgICAvLyBuYW1lLgorICAg
IH0gZWxzZSBpZiAodmFsID09PSB0cnVlKSB7CisgICAgICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0
eSBwYXRoIHRvIGJlIHN1aXRhYmxlIGZvciB1c2UKKyAgICAgICAgLy8gYXMgYSBjbGFzcyBuYW1l
LiBGb3IgZXhhcGxlLCBjb250ZW50LmZvby5iYXJCYXoKKyAgICAgICAgLy8gYmVjb21lcyBiYXIt
YmF6LgorICAgICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7CisgICAgICAgIHJldHVy
biBfZW1iZXJSdW50aW1lU3lzdGVtU3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgg
LSAxXSk7CisKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmYWxzZSwgdW5kZWZpbmVk
LCBvciBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gdmFsdWUgb2YgdGhlIHBy
b3BlcnR5LgorICAgICAgfSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZhbCAhPSBudWxsKSB7
CisgICAgICAgICAgcmV0dXJuIHZhbDsKKworICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZGlzcGxh
eS4gUmV0dXJuIG51bGwgc28gdGhhdCB0aGUgb2xkIGNsYXNzIGlzIHJlbW92ZWQKKyAgICAgICAg
ICAvLyBidXQgbm8gbmV3IGNsYXNzIGlzIGFkZGVkLgorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICB9CisKKyAgZnVuY3Rpb24gc3RyZWFt
aWZ5Q2xhc3NOYW1lQmluZGluZyh2aWV3LCBjbGFzc05hbWVCaW5kaW5nLCBwcmVmaXgpIHsKKyAg
ICBwcmVmaXggPSBwcmVmaXggfHwgJyc7CisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ2Ns
YXNzTmFtZUJpbmRpbmdzIG11c3Qgbm90IGhhdmUgc3BhY2VzIGluIHRoZW0uIE11bHRpcGxlIGNs
YXNzIG5hbWUgYmluZGluZ3MgY2FuIGJlIHByb3ZpZGVkIGFzIGVsZW1lbnRzIG9mIGFuIGFycmF5
LCBlLmcuIFtcJ2Zvb1wnLCBcJzpiYXJcJ10nLCBjbGFzc05hbWVCaW5kaW5nLmluZGV4T2YoJyAn
KSA9PT0gLTEpOworICAgIHZhciBwYXJzZWRQYXRoID0gcGFyc2VQcm9wZXJ0eVBhdGgoY2xhc3NO
YW1lQmluZGluZyk7CisgICAgaWYgKHBhcnNlZFBhdGgucGF0aCA9PT0gJycpIHsKKyAgICAgIHJl
dHVybiBjbGFzc1N0cmluZ0ZvclZhbHVlKHBhcnNlZFBhdGgucGF0aCwgdHJ1ZSwgcGFyc2VkUGF0
aC5jbGFzc05hbWUsIHBhcnNlZFBhdGguZmFsc3lDbGFzc05hbWUpOworICAgIH0gZWxzZSB7Cisg
ICAgICB2YXIgcGF0aFZhbHVlID0gdmlldy5nZXRTdHJlYW0ocHJlZml4ICsgcGFyc2VkUGF0aC5w
YXRoKTsKKyAgICAgIHJldHVybiBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5jaGFpbihwYXRoVmFs
dWUsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzU3RyaW5nRm9yVmFsdWUocGFy
c2VkUGF0aC5wYXRoLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHBhdGhWYWx1ZSksIHBh
cnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKKyAgICAgIH0p
OworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N0cmVhbXMvc2hvdWxkX2Rp
c3BsYXknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJv
cGVydHlfZ2V0JywgJ2VtYmVyLXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItbWV0YWwvc3RyZWFtcy9z
dHJlYW0nLCAnZW1iZXItbWV0YWwvc3RyZWFtcy91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1bnRpbWVV
dGlscywgX2VtYmVyTWV0YWxTdHJlYW1zU3RyZWFtLCBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscykg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gc2hvdWxkRGlzcGxheTsK
KworICB2YXIgU2hvdWxkRGlzcGxheVN0cmVhbSA9IF9lbWJlck1ldGFsU3RyZWFtc1N0cmVhbS5k
ZWZhdWx0LmV4dGVuZCh7CisgICAgaW5pdDogZnVuY3Rpb24gKHByZWRpY2F0ZSkgeworICAgICAg
X2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1Nob3VsZERpc3BsYXlTdHJlYW0gZXJyb3I6IHByZWRp
Y2F0ZSBtdXN0IGJlIGEgc3RyZWFtJywgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMuaXNTdHJlYW0o
cHJlZGljYXRlKSk7CisKKyAgICAgIHZhciBpc1RydXRoeSA9IHByZWRpY2F0ZS5nZXQoJ2lzVHJ1
dGh5Jyk7CisKKyAgICAgIHRoaXMuaW5pdCgpOworICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVk
aWNhdGU7CisgICAgICB0aGlzLmlzVHJ1dGh5ID0gaXNUcnV0aHk7CisgICAgICB0aGlzLmxlbmd0
aERlcCA9IG51bGw7CisKKyAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShwcmVkaWNhdGUpOworICAg
ICAgdGhpcy5hZGREZXBlbmRlbmN5KGlzVHJ1dGh5KTsKKyAgICB9LAorCisgICAgY29tcHV0ZTog
ZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHRydXRoeSA9IF9lbWJlck1ldGFsU3RyZWFtc1V0aWxz
LnJlYWQodGhpcy5pc1RydXRoeSk7CisKKyAgICAgIGlmICh0eXBlb2YgdHJ1dGh5ID09PSAnYm9v
bGVhbicpIHsKKyAgICAgICAgcmV0dXJuIHRydXRoeTsKKyAgICAgIH0KKworICAgICAgaWYgKHRo
aXMubGVuZ3RoRGVwKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aERlcC5nZXRWYWx1ZSgp
ICE9PSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICEhX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMucmVhZCh0aGlzLnByZWRpY2F0ZSk7CisgICAgICB9CisgICAgfSwKKworICAgIHJl
dmFsaWRhdGU6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmIChfZW1iZXJSdW50aW1lVXRpbHMuaXNB
cnJheShfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFkKHRoaXMucHJlZGljYXRlKSkpIHsKKyAg
ICAgICAgaWYgKCF0aGlzLmxlbmd0aERlcCkgeworICAgICAgICAgIHRoaXMubGVuZ3RoRGVwID0g
dGhpcy5hZGRNdXRhYmxlRGVwZW5kZW5jeSh0aGlzLnByZWRpY2F0ZS5nZXQoJ2xlbmd0aCcpKTsK
KyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoRGVwKSB7
CisgICAgICAgICAgdGhpcy5sZW5ndGhEZXAuZGVzdHJveSgpOworICAgICAgICAgIHRoaXMubGVu
Z3RoRGVwID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZnVu
Y3Rpb24gc2hvdWxkRGlzcGxheShwcmVkaWNhdGUpIHsKKyAgICBpZiAoX2VtYmVyTWV0YWxTdHJl
YW1zVXRpbHMuaXNTdHJlYW0ocHJlZGljYXRlKSkgeworICAgICAgcmV0dXJuIG5ldyBTaG91bGRE
aXNwbGF5U3RyZWFtKHByZWRpY2F0ZSk7CisgICAgfQorCisgICAgdmFyIHR5cGUgPSB0eXBlb2Yg
cHJlZGljYXRlOworCisgICAgaWYgKHR5cGUgPT09ICdib29sZWFuJykgeworICAgICAgcmV0dXJu
IHByZWRpY2F0ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZSAmJiB0eXBlID09PSAnb2JqZWN0JyAm
JiBwcmVkaWNhdGUgIT09IG51bGwpIHsKKyAgICAgIHZhciBpc1RydXRoeSA9IF9lbWJlck1ldGFs
UHJvcGVydHlfZ2V0LmdldChwcmVkaWNhdGUsICdpc1RydXRoeScpOworICAgICAgaWYgKHR5cGVv
ZiBpc1RydXRoeSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgICAgIHJldHVybiBpc1RydXRoeTsKKyAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoX2VtYmVyUnVudGltZVV0aWxzLmlzQXJyYXkocHJlZGlj
YXRlKSkgeworICAgICAgcmV0dXJuIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldChwcmVkaWNh
dGUsICdsZW5ndGgnKSAhPT0gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICEhcHJlZGlj
YXRlOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N0cmVhbXMvdXRpbHMn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0JywgJ2VtYmVyLW1ldGFsL3N0cmVhbXMvdXRpbHMnLCAnZW1iZXItcnVudGltZS9taXhpbnMv
Y29udHJvbGxlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVy
TWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlck1ldGFsU3RyZWFtc1V0aWxzLCBfZW1iZXJSdW50aW1l
TWl4aW5zQ29udHJvbGxlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5yZWFkVmll
d0ZhY3RvcnkgPSByZWFkVmlld0ZhY3Rvcnk7CisgIGV4cG9ydHMucmVhZENvbXBvbmVudEZhY3Rv
cnkgPSByZWFkQ29tcG9uZW50RmFjdG9yeTsKKyAgZXhwb3J0cy5yZWFkVW53cmFwcGVkTW9kZWwg
PSByZWFkVW53cmFwcGVkTW9kZWw7CisKKyAgZnVuY3Rpb24gcmVhZFZpZXdGYWN0b3J5KG9iamVj
dCwgb3duZXIpIHsKKyAgICB2YXIgdmFsdWUgPSBfZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5yZWFk
KG9iamVjdCk7CisgICAgdmFyIHZpZXdDbGFzczsKKworICAgIGlmICh0eXBlb2YgdmFsdWUgPT09
ICdzdHJpbmcnKSB7CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnVmlldyByZXF1aXJl
cyBhbiBvd25lciB0byByZXNvbHZlIHZpZXdzIG5vdCBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgY29u
dGV4dCcsICEhb3duZXIpOworICAgICAgdmlld0NsYXNzID0gb3duZXIuX2xvb2t1cEZhY3Rvcnko
J3ZpZXc6JyArIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdmlld0NsYXNzID0gdmFsdWU7
CisgICAgfQorCisgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQodmFsdWUgKyAnIG11c3QgYmUg
YSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBFbWJlci5WaWV3LCBub3QgJyArIHZpZXdDbGFz
cywgKGZ1bmN0aW9uICh2aWV3Q2xhc3MpIHsKKyAgICAgIHJldHVybiB2aWV3Q2xhc3MgJiYgKHZp
ZXdDbGFzcy5pc1ZpZXdGYWN0b3J5IHx8IHZpZXdDbGFzcy5pc1ZpZXcgfHwgdmlld0NsYXNzLmlz
Q29tcG9uZW50RmFjdG9yeSB8fCB2aWV3Q2xhc3MuaXNDb21wb25lbnQpOworICAgIH0pKHZpZXdD
bGFzcykpOworCisgICAgcmV0dXJuIHZpZXdDbGFzczsKKyAgfQorCisgIGZ1bmN0aW9uIHJlYWRD
b21wb25lbnRGYWN0b3J5KG5hbWVPclN0cmVhbSwgb3duZXIpIHsKKyAgICB2YXIgbmFtZSA9IF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLnJlYWQobmFtZU9yU3RyZWFtKTsKKyAgICB2YXIgY29tcG9u
ZW50TG9va3VwID0gb3duZXIubG9va3VwKCdjb21wb25lbnQtbG9va3VwOm1haW4nKTsKKyAgICBf
ZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnQ291bGQgbm90IGZpbmQgXCdjb21wb25lbnQtbG9va3Vw
Om1haW5cJyBvbiB0aGUgcHJvdmlkZWQgY29udGFpbmVyLCAnICsgJ3doaWNoIGlzIG5lY2Vzc2Fy
eSBmb3IgcGVyZm9ybWluZyBjb21wb25lbnQgbG9va3VwcycsIGNvbXBvbmVudExvb2t1cCk7CisK
KyAgICByZXR1cm4gY29tcG9uZW50TG9va3VwLmxvb2t1cEZhY3RvcnkobmFtZSwgb3duZXIpOwor
ICB9CisKKyAgZnVuY3Rpb24gcmVhZFVud3JhcHBlZE1vZGVsKG9iamVjdCkgeworICAgIGlmIChf
ZW1iZXJNZXRhbFN0cmVhbXNVdGlscy5pc1N0cmVhbShvYmplY3QpKSB7CisgICAgICB2YXIgcmVz
dWx0ID0gb2JqZWN0LnZhbHVlKCk7CisKKyAgICAgIC8vIElmIHRoZSBwYXRoIGlzIGV4YWN0bHkg
YGNvbnRyb2xsZXJgIHRoZW4gd2UgZG9uJ3QgdW53cmFwIGl0LgorICAgICAgaWYgKG9iamVjdC5s
YWJlbCAhPT0gJ2NvbnRyb2xsZXInKSB7CisgICAgICAgIHdoaWxlIChfZW1iZXJSdW50aW1lTWl4
aW5zQ29udHJvbGxlci5kZWZhdWx0LmRldGVjdChyZXN1bHQpKSB7CisgICAgICAgICAgcmVzdWx0
ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHJlc3VsdCwgJ21vZGVsJyk7CisgICAgICAg
IH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIG9iamVjdDsKKyAgICB9CisgIH0KK30pOworZW5pZmVkKCJlbWJlci12aWV3cy9zeXN0
ZW0vYWN0aW9uX21hbmFnZXIiLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworCisg
ICJ1c2Ugc3RyaWN0IjsKKworICBmdW5jdGlvbiBBY3Rpb25NYW5hZ2VyKCkge30KKworICAvKioK
KyAgICBHbG9iYWwgYWN0aW9uIGlkIGhhc2guCisgIAorICAgIEBwcml2YXRlCisgICAgQHByb3Bl
cnR5IHJlZ2lzdGVyZWRBY3Rpb25zCisgICAgQHR5cGUgT2JqZWN0CisgICovCisgIEFjdGlvbk1h
bmFnZXIucmVnaXN0ZXJlZEFjdGlvbnMgPSB7fTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBBY3Rp
b25NYW5hZ2VyOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N5c3RlbS9idWlsZC1jb21wb25l
bnQtdGVtcGxhdGUnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0
YWwvcHJvcGVydHlfZ2V0JywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdodG1sYmFycy1ydW50aW1l
JywgJ2VtYmVyLWh0bWxiYXJzL2hvb2tzL2dldC12YWx1ZScsICdlbWJlci1tZXRhbC9zdHJlYW1z
L3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJNZXRh
bFByb3BlcnR5X2dldCwgX2VtYmVyTWV0YWxBc3NpZ24sIF9odG1sYmFyc1J1bnRpbWUsIF9lbWJl
ckh0bWxiYXJzSG9va3NHZXRWYWx1ZSwgX2VtYmVyTWV0YWxTdHJlYW1zVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGJ1aWxkQ29tcG9uZW50VGVtcGxhdGU7
CisgIGV4cG9ydHMuYnVpbGRIVE1MVGVtcGxhdGUgPSBidWlsZEhUTUxUZW1wbGF0ZTsKKworICBm
dW5jdGlvbiBidWlsZENvbXBvbmVudFRlbXBsYXRlKF9yZWYsIGF0dHJzLCBjb250ZW50KSB7Cisg
ICAgdmFyIGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50OworICAgIHZhciB0YWdOYW1lID0gX3Jl
Zi50YWdOYW1lOworICAgIHZhciBsYXlvdXQgPSBfcmVmLmxheW91dDsKKyAgICB2YXIgaXNBbmds
ZUJyYWNrZXQgPSBfcmVmLmlzQW5nbGVCcmFja2V0OworICAgIHZhciBpc0NvbXBvbmVudEVsZW1l
bnQgPSBfcmVmLmlzQ29tcG9uZW50RWxlbWVudDsKKyAgICB2YXIgb3V0ZXJBdHRycyA9IF9yZWYu
b3V0ZXJBdHRyczsKKworICAgIHZhciBibG9ja1RvUmVuZGVyLCBtZXRhOworCisgICAgaWYgKGNv
bXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICBjb21wb25lbnQgPSBudWxsOworICAgIH0K
KworICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LnJhdykgeworICAgICAgdmFyIHlpZWxkVG8gPSBj
cmVhdGVDb250ZW50QmxvY2tzKGNvbnRlbnQudGVtcGxhdGVzLCBjb250ZW50LnNjb3BlLCBjb250
ZW50LnNlbGYsIGNvbXBvbmVudCk7CisgICAgICBibG9ja1RvUmVuZGVyID0gY3JlYXRlTGF5b3V0
QmxvY2sobGF5b3V0LnJhdywgeWllbGRUbywgY29udGVudC5zZWxmLCBjb21wb25lbnQsIGF0dHJz
KTsKKyAgICAgIG1ldGEgPSBsYXlvdXQucmF3Lm1ldGE7CisgICAgfSBlbHNlIGlmIChjb250ZW50
LnRlbXBsYXRlcyAmJiBjb250ZW50LnRlbXBsYXRlcy5kZWZhdWx0KSB7CisgICAgICBibG9ja1Rv
UmVuZGVyID0gY3JlYXRlQ29udGVudEJsb2NrKGNvbnRlbnQudGVtcGxhdGVzLmRlZmF1bHQsIGNv
bnRlbnQuc2NvcGUsIGNvbnRlbnQuc2VsZiwgY29tcG9uZW50KTsKKyAgICAgIG1ldGEgPSBjb250
ZW50LnRlbXBsYXRlcy5kZWZhdWx0Lm1ldGE7CisgICAgfQorCisgICAgaWYgKGNvbXBvbmVudCAm
JiAhY29tcG9uZW50Ll9pc0FuZ2xlQnJhY2tldCB8fCBpc0NvbXBvbmVudEVsZW1lbnQpIHsKKyAg
ICAgIHRhZ05hbWUgPSB0YWdOYW1lIHx8IHRhZ05hbWVGb3IoY29tcG9uZW50KTsKKworICAgICAg
Ly8gSWYgdGhpcyBpcyBub3QgYSB0YWdsZXNzIGNvbXBvbmVudCwgd2UgbmVlZCB0byBjcmVhdGUg
dGhlIHdyYXBwaW5nCisgICAgICAvLyBlbGVtZW50LiBXZSB1c2UgYG1hbnVhbEVsZW1lbnRgIHRv
IGNyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgcmVwcmVzZW50cworICAgICAgLy8gdGhlIHdyYXBwaW5n
IGVsZW1lbnQgYW5kIHlpZWxkcyB0byB0aGUgcHJldmlvdXMgYmxvY2suCisgICAgICBpZiAodGFn
TmFtZSAhPT0gJycpIHsKKyAgICAgICAgaWYgKGlzQ29tcG9uZW50RWxlbWVudCkgeworICAgICAg
ICAgIGF0dHJzID0gbWVyZ2VBdHRycyhhdHRycywgb3V0ZXJBdHRycyk7CisgICAgICAgIH0KKyAg
ICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBub3JtYWxpemVDb21wb25lbnRBdHRyaWJ1dGVzKGNvbXBv
bmVudCwgaXNBbmdsZUJyYWNrZXQsIGF0dHJzKTsKKyAgICAgICAgdmFyIGVsZW1lbnRUZW1wbGF0
ZSA9IF9odG1sYmFyc1J1bnRpbWUuaW50ZXJuYWwubWFudWFsRWxlbWVudCh0YWdOYW1lLCBhdHRy
aWJ1dGVzKTsKKyAgICAgICAgZWxlbWVudFRlbXBsYXRlLm1ldGEgPSBtZXRhOworCisgICAgICAg
IGJsb2NrVG9SZW5kZXIgPSBjcmVhdGVFbGVtZW50QmxvY2soZWxlbWVudFRlbXBsYXRlLCBibG9j
a1RvUmVuZGVyLCBjb21wb25lbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsaWRhdGVU
YWdsZXNzQ29tcG9uZW50KGNvbXBvbmVudCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gdGFn
TmFtZSBpcyBvbmUgb2Y6CisgICAgLy8gICAqIGB1bmRlZmluZWRgIGlmIG5vIGNvbXBvbmVudCBp
cyBwcmVzZW50CisgICAgLy8gICAqIHRoZSBmYWxzeSB2YWx1ZSAiIiBpZiBzZXQgZXhwbGljaXRs
eSBvbiB0aGUgY29tcG9uZW50CisgICAgLy8gICAqIGFuIGFjdHVhbCB0YWdOYW1lIHNldCBleHBs
aWNpdGx5IG9uIHRoZSBjb21wb25lbnQKKyAgICByZXR1cm4geyBjcmVhdGVkRWxlbWVudDogISF0
YWdOYW1lLCBibG9jazogYmxvY2tUb1JlbmRlciB9OworICB9CisKKyAgZnVuY3Rpb24gYnVpbGRI
VE1MVGVtcGxhdGUodGFnTmFtZSwgX2F0dHJzLCBjb250ZW50KSB7CisgICAgdmFyIGF0dHJzID0g
e307CisKKyAgICBmb3IgKHZhciBwcm9wIGluIF9hdHRycykgeworICAgICAgdmFyIHZhbCA9IF9h
dHRyc1twcm9wXTsKKworICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7CisgICAg
ICAgIGF0dHJzW3Byb3BdID0gdmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXR0cnNbcHJv
cF0gPSBbJ3ZhbHVlJywgdmFsXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2hpbGRUZW1w
bGF0ZSA9IGNvbnRlbnQudGVtcGxhdGVzLmRlZmF1bHQ7CisgICAgdmFyIGVsZW1lbnRUZW1wbGF0
ZSA9IF9odG1sYmFyc1J1bnRpbWUuaW50ZXJuYWwubWFudWFsRWxlbWVudCh0YWdOYW1lLCBhdHRy
cywgY2hpbGRUZW1wbGF0ZS5pc0VtcHR5KTsKKworICAgIGlmIChjaGlsZFRlbXBsYXRlLmlzRW1w
dHkpIHsKKyAgICAgIHJldHVybiBibG9ja0ZvcihlbGVtZW50VGVtcGxhdGUsIHsgc2NvcGU6IGNv
bnRlbnQuc2NvcGUgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBibG9ja1RvUmVuZGVyID0g
YmxvY2tGb3IoY29udGVudC50ZW1wbGF0ZXMuZGVmYXVsdCwgY29udGVudCk7CisgICAgICByZXR1
cm4gYmxvY2tGb3IoZWxlbWVudFRlbXBsYXRlLCB7IHlpZWxkVG86IGJsb2NrVG9SZW5kZXIsIHNj
b3BlOiBjb250ZW50LnNjb3BlIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1lcmdlQXR0
cnMoaW5uZXJBdHRycywgb3V0ZXJBdHRycykgeworICAgIHZhciByZXN1bHQgPSBfZW1iZXJNZXRh
bEFzc2lnbi5kZWZhdWx0KHt9LCBpbm5lckF0dHJzLCBvdXRlckF0dHJzKTsKKworICAgIGlmIChp
bm5lckF0dHJzLmNsYXNzICYmIG91dGVyQXR0cnMuY2xhc3MpIHsKKyAgICAgIHJlc3VsdC5jbGFz
cyA9IFsnc3ViZXhwcicsICctam9pbi1jbGFzc2VzJywgW1sndmFsdWUnLCBpbm5lckF0dHJzLmNs
YXNzXSwgWyd2YWx1ZScsIG91dGVyQXR0cnMuY2xhc3NdXSwgW11dOworICAgIH0KKworICAgIHJl
dHVybiByZXN1bHQ7CisgIH0KKworICBmdW5jdGlvbiBibG9ja0Zvcih0ZW1wbGF0ZSwgb3B0aW9u
cykgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdCVUc6IE11c3QgcGFzcyBhIHRlbXBs
YXRlIHRvIGJsb2NrRm9yJywgISF0ZW1wbGF0ZSk7CisgICAgcmV0dXJuIF9odG1sYmFyc1J1bnRp
bWUuaW50ZXJuYWwuYmxvY2tGb3IoX2h0bWxiYXJzUnVudGltZS5yZW5kZXIsIHRlbXBsYXRlLCBv
cHRpb25zKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRCbG9jayh0ZW1wbGF0ZSwg
c2NvcGUsIHNlbGYsIGNvbXBvbmVudCkgeworICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdC
VUc6IGJ1aWxkQ29tcG9uZW50VGVtcGxhdGUgY2FuIHRha2UgYSBzY29wZSBvciBhIHNlbGYsIGJ1
dCBub3QgYm90aCcsICEoc2NvcGUgJiYgc2VsZikpOworCisgICAgcmV0dXJuIGJsb2NrRm9yKHRl
bXBsYXRlLCB7CisgICAgICBzY29wZTogc2NvcGUsCisgICAgICBzZWxmOiBzZWxmLAorICAgICAg
b3B0aW9uczogeyB2aWV3OiBjb21wb25lbnQgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24g
Y3JlYXRlQ29udGVudEJsb2Nrcyh0ZW1wbGF0ZXMsIHNjb3BlLCBzZWxmLCBjb21wb25lbnQpIHsK
KyAgICBpZiAoIXRlbXBsYXRlcykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgb3V0
cHV0ID0ge307CisgICAgZm9yICh2YXIgbmFtZSBpbiB0ZW1wbGF0ZXMpIHsKKyAgICAgIGlmICh0
ZW1wbGF0ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgdmFyIHRlbXBsYXRlID0g
dGVtcGxhdGVzW25hbWVdOworICAgICAgICBpZiAodGVtcGxhdGUpIHsKKyAgICAgICAgICBvdXRw
dXRbbmFtZV0gPSBjcmVhdGVDb250ZW50QmxvY2sodGVtcGxhdGVzW25hbWVdLCBzY29wZSwgc2Vs
ZiwgY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0
cHV0OworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlTGF5b3V0QmxvY2sodGVtcGxhdGUsIHlpZWxk
VG8sIHNlbGYsIGNvbXBvbmVudCwgYXR0cnMpIHsKKyAgICByZXR1cm4gYmxvY2tGb3IodGVtcGxh
dGUsIHsKKyAgICAgIHlpZWxkVG86IHlpZWxkVG8sCisKKyAgICAgIC8vIElmIHdlIGhhdmUgYW4g
b2xkLXN0eWxlIENvbnRyb2xsZXIgd2l0aCBhIHRlbXBsYXRlIGl0IHdpbGwgYmUKKyAgICAgIC8v
IHBhc3NlZCBhcyBvdXIgYHNlbGZgIGFyZ3VtZW50LCBhbmQgaXQgc2hvdWxkIGJlIHRoZSBjb250
ZXh0IGZvcgorICAgICAgLy8gdGhlIHRlbXBsYXRlLiBPdGhlcndpc2UsIHdlIG11c3QgaGF2ZSBh
IHJlYWwgQ29tcG9uZW50IGFuZCBpdAorICAgICAgLy8gc2hvdWxkIGJlIGl0cyBvd24gdGVtcGxh
dGUgY29udGV4dC4KKyAgICAgIHNlbGY6IHNlbGYgfHwgY29tcG9uZW50LAorCisgICAgICBvcHRp
b25zOiB7IHZpZXc6IGNvbXBvbmVudCwgYXR0cnM6IGF0dHJzIH0KKyAgICB9KTsKKyAgfQorCisg
IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0ZW1wbGF0ZSwgeWllbGRUbywgY29tcG9uZW50
KSB7CisgICAgcmV0dXJuIGJsb2NrRm9yKHRlbXBsYXRlLCB7CisgICAgICB5aWVsZFRvOiB5aWVs
ZFRvLAorICAgICAgc2VsZjogY29tcG9uZW50LAorICAgICAgb3B0aW9uczogeyB2aWV3OiBjb21w
b25lbnQgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gdGFnTmFtZUZvcih2aWV3KSB7Cisg
ICAgdmFyIHRhZ05hbWUgPSB2aWV3LnRhZ05hbWU7CisKKyAgICBpZiAodGFnTmFtZSAhPT0gbnVs
bCAmJiB0eXBlb2YgdGFnTmFtZSA9PT0gJ29iamVjdCcgJiYgdGFnTmFtZS5pc0Rlc2NyaXB0b3Ip
IHsKKyAgICAgIHRhZ05hbWUgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ3Rh
Z05hbWUnKTsKKyAgICAgIF9lbWJlck1ldGFsRGVidWcuZGVwcmVjYXRlKCdJbiB0aGUgZnV0dXJl
IHVzaW5nIGEgY29tcHV0ZWQgcHJvcGVydHkgdG8gZGVmaW5lIHRhZ05hbWUgd2lsbCBub3QgYmUg
cGVybWl0dGVkLiBUaGF0IHZhbHVlIHdpbGwgYmUgcmVzcGVjdGVkLCBidXQgY2hhbmdpbmcgaXQg
d2lsbCBub3QgdXBkYXRlIHRoZSBlbGVtZW50LicsICF0YWdOYW1lLCB7IGlkOiAnZW1iZXItdmll
d3MuY29tcHV0ZWQtdGFnLW5hbWUnLCB1bnRpbDogJzIuMC4wJyB9KTsKKyAgICB9CisKKyAgICBp
ZiAodGFnTmFtZSA9PT0gbnVsbCB8fCB0YWdOYW1lID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHRh
Z05hbWUgPSB2aWV3Ll9kZWZhdWx0VGFnTmFtZSB8fCAnZGl2JzsKKyAgICB9CisKKyAgICByZXR1
cm4gdGFnTmFtZTsKKyAgfQorCisgIC8vIFRha2VzIGEgY29tcG9uZW50IGFuZCBidWlsZHMgYSBu
b3JtYWxpemVkIHNldCBvZiBhdHRyaWJ1dGUKKyAgLy8gYmluZGluZ3MgY29uc3VtYWJsZSBieSBI
VE1MQmFycycgYGF0dHJpYnV0ZWAgaG9vay4KKyAgZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50
QXR0cmlidXRlcyhjb21wb25lbnQsIGlzQW5nbGVCcmFja2V0LCBhdHRycykgeworICAgIHZhciBu
b3JtYWxpemVkID0ge307CisgICAgdmFyIGF0dHJpYnV0ZUJpbmRpbmdzID0gY29tcG9uZW50LmF0
dHJpYnV0ZUJpbmRpbmdzOworICAgIHZhciBzdHJlYW1CYXNlUGF0aCA9IGNvbXBvbmVudC5pc0Nv
bXBvbmVudCA/ICcnIDogJ3ZpZXcuJzsKKyAgICB2YXIgaSwgbDsKKworICAgIGlmIChhdHRycy5p
ZCAmJiBfZW1iZXJIdG1sYmFyc0hvb2tzR2V0VmFsdWUuZGVmYXVsdChhdHRycy5pZCkpIHsKKyAg
ICAgIC8vIERvIG5vdCBhbGxvdyBiaW5kaW5nIHRvIHRoZSBgaWRgCisgICAgICBub3JtYWxpemVk
LmlkID0gX2VtYmVySHRtbGJhcnNIb29rc0dldFZhbHVlLmRlZmF1bHQoYXR0cnMuaWQpOworICAg
ICAgY29tcG9uZW50LmVsZW1lbnRJZCA9IG5vcm1hbGl6ZWQuaWQ7CisgICAgfSBlbHNlIHsKKyAg
ICAgIG5vcm1hbGl6ZWQuaWQgPSBjb21wb25lbnQuZWxlbWVudElkOworICAgIH0KKworICAgIGlm
IChhdHRyaWJ1dGVCaW5kaW5ncykgeworICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJpYnV0ZUJp
bmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICB2YXIgYXR0ciA9IGF0dHJpYnV0
ZUJpbmRpbmdzW2ldOworICAgICAgICB2YXIgY29sb25JbmRleCA9IGF0dHIuaW5kZXhPZignOicp
OworCisgICAgICAgIHZhciBhdHRyTmFtZSwgZXhwcmVzc2lvbjsKKyAgICAgICAgaWYgKGNvbG9u
SW5kZXggIT09IC0xKSB7CisgICAgICAgICAgdmFyIGF0dHJQcm9wZXJ0eSA9IGF0dHIuc3Vic3Ry
aW5nKDAsIGNvbG9uSW5kZXgpOworICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5zdWJzdHJpbmco
Y29sb25JbmRleCArIDEpOworICAgICAgICAgIGV4cHJlc3Npb24gPSBbJ2dldCcsICcnICsgc3Ry
ZWFtQmFzZVBhdGggKyBhdHRyUHJvcGVydHldOworICAgICAgICB9IGVsc2UgaWYgKGF0dHJzW2F0
dHJdKSB7CisgICAgICAgICAgLy8gVE9ETzogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLngsIHdl
IHByb2JhYmx5IG5lZWQgdG8gYHNldGAKKyAgICAgICAgICAvLyB0aGUgY29tcG9uZW50J3MgYXR0
cmlidXRlIGhlcmUgaWYgaXQgaXMgYSBDUCwgYnV0IHdlIGFsc28KKyAgICAgICAgICAvLyBwcm9i
YWJseSB3YW50IHRvIHN1c3BlbmQgb2JzZXJ2ZXJzIGFuZCBhbGxvdyB0aGUKKyAgICAgICAgICAv
LyB3aWxsVXBkYXRlQXR0cnMgbG9naWMgdG8gdHJpZ2dlciBvYnNlcnZlcnMgYXQgdGhlIGNvcnJl
Y3QgdGltZS4KKyAgICAgICAgICBhdHRyTmFtZSA9IGF0dHI7CisgICAgICAgICAgZXhwcmVzc2lv
biA9IFsndmFsdWUnLCBhdHRyc1thdHRyXV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
YXR0ck5hbWUgPSBhdHRyOworICAgICAgICAgIGV4cHJlc3Npb24gPSBbJ2dldCcsICcnICsgc3Ry
ZWFtQmFzZVBhdGggKyBhdHRyXTsKKyAgICAgICAgfQorCisgICAgICAgIF9lbWJlck1ldGFsRGVi
dWcuYXNzZXJ0KCdZb3UgY2Fubm90IHVzZSBjbGFzcyBhcyBhbiBhdHRyaWJ1dGVCaW5kaW5nLCB1
c2UgY2xhc3NOYW1lQmluZGluZ3MgaW5zdGVhZC4nLCBhdHRyTmFtZSAhPT0gJ2NsYXNzJyk7CisK
KyAgICAgICAgbm9ybWFsaXplZFthdHRyTmFtZV0gPSBleHByZXNzaW9uOworICAgICAgfQorICAg
IH0KKworICAgIGlmIChpc0FuZ2xlQnJhY2tldCkgeworICAgICAgZm9yICh2YXIgcHJvcCBpbiBh
dHRycykgeworICAgICAgICB2YXIgdmFsID0gYXR0cnNbcHJvcF07CisgICAgICAgIGlmICghdmFs
KSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZW9m
IHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsLmlzQ29uY2F0KSB7CisgICAgICAgICAgbm9ybWFsaXpl
ZFtwcm9wXSA9IFsndmFsdWUnLCB2YWxdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGF0dHJzLnRhZ05hbWUpIHsKKyAgICAgIGNvbXBvbmVudC50YWdOYW1lID0gYXR0cnMu
dGFnTmFtZTsKKyAgICB9CisKKyAgICB2YXIgbm9ybWFsaXplZENsYXNzID0gbm9ybWFsaXplQ2xh
c3MoY29tcG9uZW50LCBhdHRycywgc3RyZWFtQmFzZVBhdGgpOworCisgICAgaWYgKG5vcm1hbGl6
ZWRDbGFzcykgeworICAgICAgbm9ybWFsaXplZC5jbGFzcyA9IG5vcm1hbGl6ZWRDbGFzczsKKyAg
ICB9CisKKyAgICBpZiAoX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KGNvbXBvbmVudCwgJ2lz
VmlzaWJsZScpID09PSBmYWxzZSkgeworICAgICAgdmFyIGhpZGRlblN0eWxlID0gWydzdWJleHBy
JywgJy1odG1sLXNhZmUnLCBbJ2Rpc3BsYXk6IG5vbmU7J10sIFtdXTsKKyAgICAgIHZhciBleGlz
dGluZ1N0eWxlID0gbm9ybWFsaXplZC5zdHlsZTsKKworICAgICAgaWYgKGV4aXN0aW5nU3R5bGUp
IHsKKyAgICAgICAgbm9ybWFsaXplZC5zdHlsZSA9IFsnc3ViZXhwcicsICdjb25jYXQnLCBbZXhp
c3RpbmdTdHlsZSwgJyAnLCBoaWRkZW5TdHlsZV0sIFtdXTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIG5vcm1hbGl6ZWQuc3R5bGUgPSBoaWRkZW5TdHlsZTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gbm9ybWFsaXplZDsKKyAgfQorCisgIGZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzKGNv
bXBvbmVudCwgYXR0cnMsIHN0cmVhbUJhc2VQYXRoKSB7CisgICAgdmFyIGksIGw7CisgICAgdmFy
IG5vcm1hbGl6ZWRDbGFzcyA9IFtdOworICAgIHZhciBjbGFzc05hbWVzID0gX2VtYmVyTWV0YWxQ
cm9wZXJ0eV9nZXQuZ2V0KGNvbXBvbmVudCwgJ2NsYXNzTmFtZXMnKTsKKyAgICB2YXIgY2xhc3NO
YW1lQmluZGluZ3MgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQoY29tcG9uZW50LCAnY2xh
c3NOYW1lQmluZGluZ3MnKTsKKworICAgIGlmIChhdHRycy5jbGFzcykgeworICAgICAgaWYgKF9l
bWJlck1ldGFsU3RyZWFtc1V0aWxzLmlzU3RyZWFtKGF0dHJzLmNsYXNzKSkgeworICAgICAgICBu
b3JtYWxpemVkQ2xhc3MucHVzaChbJ3N1YmV4cHInLCAnLW5vcm1hbGl6ZS1jbGFzcycsIFtbJ3Zh
bHVlJywgYXR0cnMuY2xhc3MucGF0aF0sIFsndmFsdWUnLCBhdHRycy5jbGFzc11dLCBbXV0pOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9ybWFsaXplZENsYXNzLnB1c2goYXR0cnMuY2xhc3Mp
OworICAgICAgfQorICAgIH0KKworICAgIGlmIChhdHRycy5jbGFzc0JpbmRpbmcpIHsKKyAgICAg
IG5vcm1hbGl6ZUNsYXNzZXMoYXR0cnMuY2xhc3NCaW5kaW5nLnNwbGl0KCcgJyksIG5vcm1hbGl6
ZWRDbGFzcywgc3RyZWFtQmFzZVBhdGgpOworICAgIH0KKworICAgIGlmIChjbGFzc05hbWVzKSB7
CisgICAgICBmb3IgKGkgPSAwLCBsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
KyAgICAgICAgbm9ybWFsaXplZENsYXNzLnB1c2goY2xhc3NOYW1lc1tpXSk7CisgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGNsYXNzTmFtZUJpbmRpbmdzKSB7CisgICAgICBub3JtYWxpemVDbGFz
c2VzKGNsYXNzTmFtZUJpbmRpbmdzLCBub3JtYWxpemVkQ2xhc3MsIHN0cmVhbUJhc2VQYXRoKTsK
KyAgICB9CisKKyAgICBpZiAobm9ybWFsaXplQ2xhc3MubGVuZ3RoKSB7CisgICAgICByZXR1cm4g
WydzdWJleHByJywgJy1qb2luLWNsYXNzZXMnLCBub3JtYWxpemVkQ2xhc3MsIFtdXTsKKyAgICB9
CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVDbGFzc2VzKGNsYXNzZXMsIG91dHB1dCwgc3Ry
ZWFtQmFzZVBhdGgpIHsKKyAgICB2YXIgaSwgbDsKKworICAgIGZvciAoaSA9IDAsIGwgPSBjbGFz
c2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzZXNb
aV07CisgICAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnY2xhc3NOYW1lQmluZGluZ3MgbXVz
dCBub3QgaGF2ZSBzcGFjZXMgaW4gdGhlbS4gTXVsdGlwbGUgY2xhc3MgbmFtZSBiaW5kaW5ncyBj
YW4gYmUgcHJvdmlkZWQgYXMgZWxlbWVudHMgb2YgYW4gYXJyYXksIGUuZy4gW1wnZm9vXCcsIFwn
OmJhclwnXScsIGNsYXNzTmFtZS5pbmRleE9mKCcgJykgPT09IC0xKTsKKworICAgICAgdmFyIF9j
bGFzc05hbWUkc3BsaXQgPSBjbGFzc05hbWUuc3BsaXQoJzonKTsKKworICAgICAgdmFyIHByb3BO
YW1lID0gX2NsYXNzTmFtZSRzcGxpdFswXTsKKyAgICAgIHZhciBhY3RpdmVDbGFzcyA9IF9jbGFz
c05hbWUkc3BsaXRbMV07CisgICAgICB2YXIgaW5hY3RpdmVDbGFzcyA9IF9jbGFzc05hbWUkc3Bs
aXRbMl07CisKKyAgICAgIC8vIExlZ2FjeSA6Y2xhc3MgbWljcm9zeW50YXggZm9yIHN0YXRpYyBj
bGFzcyBuYW1lcworICAgICAgaWYgKHByb3BOYW1lID09PSAnJykgeworICAgICAgICBvdXRwdXQu
cHVzaChhY3RpdmVDbGFzcyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB2
YXIgcHJvcCA9ICcnICsgc3RyZWFtQmFzZVBhdGggKyBwcm9wTmFtZTsKKworICAgICAgb3V0cHV0
LnB1c2goWydzdWJleHByJywgJy1ub3JtYWxpemUtY2xhc3MnLCBbCisgICAgICAvLyBwYXJhbXMK
KyAgICAgIFsndmFsdWUnLCBwcm9wTmFtZV0sIFsnZ2V0JywgcHJvcF1dLCBbCisgICAgICAvLyBo
YXNoCisgICAgICAnYWN0aXZlQ2xhc3MnLCBhY3RpdmVDbGFzcywgJ2luYWN0aXZlQ2xhc3MnLCBp
bmFjdGl2ZUNsYXNzXV0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHZhbGlkYXRlVGFnbGVz
c0NvbXBvbmVudChjb21wb25lbnQpIHsKKyAgICBfZW1iZXJNZXRhbERlYnVnLmFzc2VydCgnWW91
IGNhbm5vdCB1c2UgYGNsYXNzTmFtZUJpbmRpbmdzYCBvbiBhIHRhZy1sZXNzIGNvbXBvbmVudDog
JyArIGNvbXBvbmVudC50b1N0cmluZygpLCAoZnVuY3Rpb24gKCkgeworICAgICAgdmFyIGNsYXNz
TmFtZUJpbmRpbmdzID0gY29tcG9uZW50LmNsYXNzTmFtZUJpbmRpbmdzOworICAgICAgcmV0dXJu
ICFjbGFzc05hbWVCaW5kaW5ncyB8fCBjbGFzc05hbWVCaW5kaW5ncy5sZW5ndGggPT09IDA7Cisg
ICAgfSkoKSk7CisgIH0KK30pOworZW5pZmVkKCdlbWJlci12aWV3cy9zeXN0ZW0vZXZlbnRfZGlz
cGF0Y2hlcicsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9w
cm9wZXJ0eV9nZXQnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlfc2V0JywgJ2VtYmVyLW1ldGFsL2lz
X25vbmUnLCAnZW1iZXItbWV0YWwvcnVuX2xvb3AnLCAnZW1iZXItcnVudGltZS9zeXN0ZW0vb2Jq
ZWN0JywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItdmlld3Mvc3lzdGVtL2Fj
dGlvbl9tYW5hZ2VyJywgJ2VtYmVyLXZpZXdzL3ZpZXdzL3ZpZXcnLCAnZW1iZXItbWV0YWwvYXNz
aWduJywgJ2NvbnRhaW5lci9vd25lcicsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQs
IF9lbWJlck1ldGFsUHJvcGVydHlfc2V0LCBfZW1iZXJNZXRhbElzX25vbmUsIF9lbWJlck1ldGFs
UnVuX2xvb3AsIF9lbWJlclJ1bnRpbWVTeXN0ZW1PYmplY3QsIF9lbWJlclZpZXdzU3lzdGVtSnF1
ZXJ5LCBfZW1iZXJWaWV3c1N5c3RlbUFjdGlvbl9tYW5hZ2VyLCBfZW1iZXJWaWV3c1ZpZXdzVmll
dywgX2VtYmVyTWV0YWxBc3NpZ24sIF9jb250YWluZXJPd25lciwgX2VtYmVyTWV0YWxFbnZpcm9u
bWVudCkgeworICAvKioKKyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdz
CisgICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBST09UX0VMRU1FTlRfQ0xBU1MgPSAn
ZW1iZXItYXBwbGljYXRpb24nOworICB2YXIgUk9PVF9FTEVNRU5UX1NFTEVDVE9SID0gJy4nICsg
Uk9PVF9FTEVNRU5UX0NMQVNTOworCisgIC8qKgorICAgIGBFbWJlci5FdmVudERpc3BhdGNoZXJg
IGhhbmRsZXMgZGVsZWdhdGluZyBicm93c2VyIGV2ZW50cyB0byB0aGVpcgorICAgIGNvcnJlc3Bv
bmRpbmcgYEVtYmVyLlZpZXdzLmAgRm9yIGV4YW1wbGUsIHdoZW4geW91IGNsaWNrIG9uIGEgdmll
dywKKyAgICBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBlbnN1cmVzIHRoYXQgdGhhdCB2aWV3J3Mg
YG1vdXNlRG93bmAgbWV0aG9kIGdldHMKKyAgICBjYWxsZWQuCisgIAorICAgIEBjbGFzcyBFdmVu
dERpc3BhdGNoZXIKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQHByaXZhdGUKKyAgICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyUnVudGlt
ZVN5c3RlbU9iamVjdC5kZWZhdWx0LmV4dGVuZCh7CisKKyAgICAvKioKKyAgICAgIFRoZSBzZXQg
b2YgZXZlbnRzIG5hbWVzIChhbmQgYXNzb2NpYXRlZCBoYW5kbGVyIGZ1bmN0aW9uIG5hbWVzKSB0
byBiZSBzZXR1cAorICAgICAgYW5kIGRpc3BhdGNoZWQgYnkgdGhlIGBFdmVudERpc3BhdGNoZXJg
LiBNb2RpZmljYXRpb25zIHRvIHRoaXMgbGlzdCBjYW4gYmUgZG9uZQorICAgICAgYXQgc2V0dXAg
dGltZSwgZ2VuZXJhbGx5IHZpYSB0aGUgYEVtYmVyLkFwcGxpY2F0aW9uLmN1c3RvbUV2ZW50c2Ag
aGFzaC4KKyAgICAgICBUbyBhZGQgbmV3IGV2ZW50cyB0byBiZSBsaXN0ZW5lZCB0bzoKKyAgICAg
ICBgYGBqYXZhc2NyaXB0CisgICAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRl
KHsKKyAgICAgICAgY3VzdG9tRXZlbnRzOiB7CisgICAgICAgICAgcGFzdGU6ICdwYXN0ZScKKyAg
ICAgICAgfQorICAgICAgfSk7CisgICAgICBgYGAKKyAgICAgICBUbyBwcmV2ZW50IGRlZmF1bHQg
ZXZlbnRzIGZyb20gYmVpbmcgbGlzdGVuZWQgdG86CisgICAgICAgYGBgamF2YXNjcmlwdAorICAg
ICAgdmFyIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7CisgICAgICAgIGN1c3RvbUV2
ZW50czogeworICAgICAgICAgIG1vdXNlZW50ZXI6IG51bGwsCisgICAgICAgICAgbW91c2VsZWF2
ZTogbnVsbAorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgICAgQHByb3BlcnR5
IGV2ZW50cworICAgICAgQHR5cGUgT2JqZWN0CisgICAgICBAcHJpdmF0ZQorICAgICovCisgICAg
ZXZlbnRzOiB7CisgICAgICB0b3VjaHN0YXJ0OiAndG91Y2hTdGFydCcsCisgICAgICB0b3VjaG1v
dmU6ICd0b3VjaE1vdmUnLAorICAgICAgdG91Y2hlbmQ6ICd0b3VjaEVuZCcsCisgICAgICB0b3Vj
aGNhbmNlbDogJ3RvdWNoQ2FuY2VsJywKKyAgICAgIGtleWRvd246ICdrZXlEb3duJywKKyAgICAg
IGtleXVwOiAna2V5VXAnLAorICAgICAga2V5cHJlc3M6ICdrZXlQcmVzcycsCisgICAgICBtb3Vz
ZWRvd246ICdtb3VzZURvd24nLAorICAgICAgbW91c2V1cDogJ21vdXNlVXAnLAorICAgICAgY29u
dGV4dG1lbnU6ICdjb250ZXh0TWVudScsCisgICAgICBjbGljazogJ2NsaWNrJywKKyAgICAgIGRi
bGNsaWNrOiAnZG91YmxlQ2xpY2snLAorICAgICAgbW91c2Vtb3ZlOiAnbW91c2VNb3ZlJywKKyAg
ICAgIGZvY3VzaW46ICdmb2N1c0luJywKKyAgICAgIGZvY3Vzb3V0OiAnZm9jdXNPdXQnLAorICAg
ICAgbW91c2VlbnRlcjogJ21vdXNlRW50ZXInLAorICAgICAgbW91c2VsZWF2ZTogJ21vdXNlTGVh
dmUnLAorICAgICAgc3VibWl0OiAnc3VibWl0JywKKyAgICAgIGlucHV0OiAnaW5wdXQnLAorICAg
ICAgY2hhbmdlOiAnY2hhbmdlJywKKyAgICAgIGRyYWdzdGFydDogJ2RyYWdTdGFydCcsCisgICAg
ICBkcmFnOiAnZHJhZycsCisgICAgICBkcmFnZW50ZXI6ICdkcmFnRW50ZXInLAorICAgICAgZHJh
Z2xlYXZlOiAnZHJhZ0xlYXZlJywKKyAgICAgIGRyYWdvdmVyOiAnZHJhZ092ZXInLAorICAgICAg
ZHJvcDogJ2Ryb3AnLAorICAgICAgZHJhZ2VuZDogJ2RyYWdFbmQnCisgICAgfSwKKworICAgIC8q
KgorICAgICAgVGhlIHJvb3QgRE9NIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNo
b3VsZCBiZSBhdHRhY2hlZC4gRXZlbnQKKyAgICAgIGxpc3RlbmVycyB3aWxsIGJlIGF0dGFjaGVk
IHRvIHRoZSBkb2N1bWVudCB1bmxlc3MgdGhpcyBpcyBvdmVycmlkZGVuLgorICAgICAgIENhbiBi
ZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgorICAgICAg
IFRoZSBkZWZhdWx0IGJvZHkgaXMgYSBzdHJpbmcgc2luY2UgdGhpcyBtYXkgYmUgZXZhbHVhdGVk
IGJlZm9yZSBkb2N1bWVudC5ib2R5CisgICAgICBleGlzdHMgaW4gdGhlIERPTS4KKyAgICAgICBA
cHJpdmF0ZQorICAgICAgQHByb3BlcnR5IHJvb3RFbGVtZW50CisgICAgICBAdHlwZSBET01FbGVt
ZW50CisgICAgICBAZGVmYXVsdCAnYm9keScKKyAgICAqLworICAgIHJvb3RFbGVtZW50OiAnYm9k
eScsCisKKyAgICAvKioKKyAgICAgIEl0IGVuYWJsZXMgZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQg
dG8gdGhlIHZpZXcncyBgZXZlbnRNYW5hZ2VyLmAgV2hlbiBwcmVzZW50LAorICAgICAgdGhpcyBv
YmplY3QgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGhhbmRsaW5nIG9mIGV2ZW50cyBvbiB0aGUgdmll
dyBpdHNlbGYuCisgICAgICAgTm90ZSB0aGF0IG1vc3QgRW1iZXIgYXBwbGljYXRpb25zIGRvIG5v
dCB1c2UgdGhpcyBmZWF0dXJlLiBJZiB5b3VyIGFwcCBhbHNvCisgICAgICBkb2VzIG5vdCB1c2Ug
aXQsIGNvbnNpZGVyIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBnYWluIHNvbWUg
cGVyZm9ybWFuY2UKKyAgICAgIGltcHJvdmVtZW50IGJ5IGFsbG93aW5nIHRoZSBFdmVudERpc3Bh
dGNoZXIgdG8gc2tpcCB0aGUgc2VhcmNoIGZvciB0aGUKKyAgICAgIGBldmVudE1hbmFnZXJgIG9u
IHRoZSB2aWV3IHRyZWUuCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIEV2ZW50RGlz
cGF0Y2hlciA9IEVtLkV2ZW50RGlzcGF0Y2hlci5leHRlbmQoeworICAgICAgICBldmVudHM6IHsK
KyAgICAgICAgICAgIGNsaWNrICAgICAgIDogJ2NsaWNrJywKKyAgICAgICAgICAgIGZvY3VzaW4g
ICAgIDogJ2ZvY3VzSW4nLAorICAgICAgICAgICAgZm9jdXNvdXQgICAgOiAnZm9jdXNPdXQnLAor
ICAgICAgICAgICAgY2hhbmdlICAgICAgOiAnY2hhbmdlJworICAgICAgICB9LAorICAgICAgICBj
YW5EaXNwYXRjaFRvRXZlbnRNYW5hZ2VyOiBmYWxzZQorICAgICAgfSk7CisgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFpbicsIEV2ZW50RGlzcGF0Y2hlcik7Cisg
ICAgICBgYGAKKyAgICAgICBAcHJvcGVydHkgY2FuRGlzcGF0Y2hUb0V2ZW50TWFuYWdlcgorICAg
ICAgQHR5cGUgYm9vbGVhbgorICAgICAgQGRlZmF1bHQgJ3RydWUnCisgICAgICBAc2luY2UgMS43
LjAKKyAgICAgIEBwcml2YXRlCisgICAgKi8KKyAgICBjYW5EaXNwYXRjaFRvRXZlbnRNYW5hZ2Vy
OiB0cnVlLAorCisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5fc3VwZXIoKTsK
KyAgICAgIF9lbWJlck1ldGFsRGVidWcuYXNzZXJ0KCdFdmVudERpc3BhdGNoZXIgc2hvdWxkIG5l
dmVyIGJlIGluc3RhbnRpYXRlZCBpbiBmYXN0Ym9vdCBtb2RlLiBQbGVhc2UgcmVwb3J0IHRoaXMg
YXMgYW4gRW1iZXIgYnVnLicsIF9lbWJlck1ldGFsRW52aXJvbm1lbnQuZGVmYXVsdC5oYXNET00p
OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBz
dGFuZGFyZCBicm93c2VyIGV2ZW50cy4KKyAgICAgICBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVy
IHRoZSBicm93c2VyIHNlbmRzIGEgYERPTUNvbnRlbnRSZWFkeWAgZXZlbnQuIEJ5CisgICAgICBk
ZWZhdWx0LCBpdCB3aWxsIHNldCB1cCBhbGwgb2YgdGhlIGxpc3RlbmVycyBvbiB0aGUgZG9jdW1l
bnQgYm9keS4gSWYgeW91CisgICAgICB3b3VsZCBsaWtlIHRvIHJlZ2lzdGVyIHRoZSBsaXN0ZW5l
cnMgb24gYSBkaWZmZXJlbnQgZWxlbWVudCwgc2V0IHRoZSBldmVudAorICAgICAgZGlzcGF0Y2hl
cidzIGByb290YCBwcm9wZXJ0eS4KKyAgICAgICBAcHJpdmF0ZQorICAgICAgQG1ldGhvZCBzZXR1
cAorICAgICAgQHBhcmFtIGFkZGVkRXZlbnRzIHtPYmplY3R9CisgICAgKi8KKyAgICBzZXR1cDog
ZnVuY3Rpb24gKGFkZGVkRXZlbnRzLCByb290RWxlbWVudCkgeworICAgICAgdmFyIGV2ZW50Owor
ICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2ZpbmFsRXZlbnRzID0gX2VtYmVyTWV0YWxBc3NpZ24u
ZGVmYXVsdCh7fSwgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdldmVudHMnKSwg
YWRkZWRFdmVudHMpOworCisgICAgICBpZiAoIV9lbWJlck1ldGFsSXNfbm9uZS5kZWZhdWx0KHJv
b3RFbGVtZW50KSkgeworICAgICAgICBfZW1iZXJNZXRhbFByb3BlcnR5X3NldC5zZXQodGhpcywg
J3Jvb3RFbGVtZW50Jywgcm9vdEVsZW1lbnQpOworICAgICAgfQorCisgICAgICByb290RWxlbWVu
dCA9IF9lbWJlclZpZXdzU3lzdGVtSnF1ZXJ5LmRlZmF1bHQoX2VtYmVyTWV0YWxQcm9wZXJ0eV9n
ZXQuZ2V0KHRoaXMsICdyb290RWxlbWVudCcpKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5h
c3NlcnQoJ1lvdSBjYW5ub3QgdXNlIHRoZSBzYW1lIHJvb3QgZWxlbWVudCAoJyArIChyb290RWxl
bWVudC5zZWxlY3RvciB8fCByb290RWxlbWVudFswXS50YWdOYW1lKSArICcpIG11bHRpcGxlIHRp
bWVzIGluIGFuIEVtYmVyLkFwcGxpY2F0aW9uJywgIXJvb3RFbGVtZW50LmlzKFJPT1RfRUxFTUVO
VF9TRUxFQ1RPUikpOworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1lvdSBjYW5ub3Qg
bWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlz
IGEgZGVzY2VuZGVudCBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxl
bWVudC5jbG9zZXN0KFJPT1RfRUxFTUVOVF9TRUxFQ1RPUikubGVuZ3RoKTsKKyAgICAgIF9lbWJl
ck1ldGFsRGVidWcuYXNzZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcgRW1iZXIuQXBwbGljYXRp
b24gdXNpbmcgYSByb290IGVsZW1lbnQgdGhhdCBpcyBhbiBhbmNlc3RvciBvZiBhbiBleGlzdGlu
ZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxlbWVudC5maW5kKFJPT1RfRUxFTUVOVF9TRUxF
Q1RPUikubGVuZ3RoKTsKKworICAgICAgcm9vdEVsZW1lbnQuYWRkQ2xhc3MoUk9PVF9FTEVNRU5U
X0NMQVNTKTsKKworICAgICAgX2VtYmVyTWV0YWxEZWJ1Zy5hc3NlcnQoJ1VuYWJsZSB0byBhZGQg
XCcnICsgUk9PVF9FTEVNRU5UX0NMQVNTICsgJ1wnIGNsYXNzIHRvIHJvb3RFbGVtZW50LiBNYWtl
IHN1cmUgeW91IHNldCByb290RWxlbWVudCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50IGluIHRo
ZSBib2R5LicsIHJvb3RFbGVtZW50LmlzKFJPT1RfRUxFTUVOVF9TRUxFQ1RPUikpOworCisgICAg
ICBmb3IgKGV2ZW50IGluIGV2ZW50cykgeworICAgICAgICBpZiAoZXZlbnRzLmhhc093blByb3Bl
cnR5KGV2ZW50KSkgeworICAgICAgICAgIHRoaXMuc2V0dXBIYW5kbGVyKHJvb3RFbGVtZW50LCBl
dmVudCwgZXZlbnRzW2V2ZW50XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorCisgICAg
LyoqCisgICAgICBSZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIHJvb3RFbGVtZW50
LiBJZiB0aGUgZ2l2ZW4gZXZlbnQgaXMKKyAgICAgIHRyaWdnZXJlZCwgdGhlIHByb3ZpZGVkIGV2
ZW50IGhhbmRsZXIgd2lsbCBiZSB0cmlnZ2VyZWQgb24gdGhlIHRhcmdldCB2aWV3LgorICAgICAg
IElmIHRoZSB0YXJnZXQgdmlldyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGV2ZW50IGhhbmRsZXIs
IG9yIGlmIHRoZSBoYW5kbGVyCisgICAgICByZXR1cm5zIGBmYWxzZWAsIHRoZSBwYXJlbnQgdmll
dyB3aWxsIGJlIGNhbGxlZC4gVGhlIGV2ZW50IHdpbGwgY29udGludWUgdG8KKyAgICAgIGJ1YmJs
ZSB0byBlYWNoIHN1Y2Nlc3NpdmUgcGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0aGUgdG9w
LgorICAgICAgIEBwcml2YXRlCisgICAgICBAbWV0aG9kIHNldHVwSGFuZGxlcgorICAgICAgQHBh
cmFtIHtFbGVtZW50fSByb290RWxlbWVudAorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50IHRo
ZSBicm93c2VyLW9yaWdpbmF0ZWQgZXZlbnQgdG8gbGlzdGVuIHRvCisgICAgICBAcGFyYW0ge1N0
cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdmll
dworICAgICovCisgICAgc2V0dXBIYW5kbGVyOiBmdW5jdGlvbiAocm9vdEVsZW1lbnQsIGV2ZW50
LCBldmVudE5hbWUpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKworICAgICAgdmFyIG93bmVy
ID0gX2NvbnRhaW5lck93bmVyLmdldE93bmVyKHRoaXMpOworICAgICAgdmFyIHZpZXdSZWdpc3Ry
eSA9IG93bmVyICYmIG93bmVyLmxvb2t1cCgnLXZpZXctcmVnaXN0cnk6bWFpbicpIHx8IF9lbWJl
clZpZXdzVmlld3NWaWV3LmRlZmF1bHQudmlld3M7CisKKyAgICAgIGlmIChldmVudE5hbWUgPT09
IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICByb290RWxlbWVudC5v
bihldmVudCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcnLCBmdW5jdGlvbiAoZXZ0LCB0cmlnZ2Vy
aW5nTWFuYWdlcikgeworICAgICAgICB2YXIgdmlldyA9IHZpZXdSZWdpc3RyeVt0aGlzLmlkXTsK
KyAgICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgdmFyIG1hbmFnZXIgPSBzZWxm
LmNhbkRpc3BhdGNoVG9FdmVudE1hbmFnZXIgPyBzZWxmLl9maW5kTmVhcmVzdEV2ZW50TWFuYWdl
cih2aWV3LCBldmVudE5hbWUpIDogbnVsbDsKKworICAgICAgICBpZiAobWFuYWdlciAmJiBtYW5h
Z2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikgeworICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2Rp
c3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcpOworICAgICAgICB9IGVs
c2UgaWYgKHZpZXcpIHsKKyAgICAgICAgICByZXN1bHQgPSBzZWxmLl9idWJibGVFdmVudCh2aWV3
LCBldnQsIGV2ZW50TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgICAgfSk7CisKKyAgICAgIHJvb3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJlcicsICdbZGF0
YS1lbWJlci1hY3Rpb25dJywgZnVuY3Rpb24gKGV2dCkgeworICAgICAgICB2YXIgYWN0aW9uSWQg
PSBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRy
KCdkYXRhLWVtYmVyLWFjdGlvbicpOworICAgICAgICB2YXIgYWN0aW9ucyA9IF9lbWJlclZpZXdz
U3lzdGVtQWN0aW9uX21hbmFnZXIuZGVmYXVsdC5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07
CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgYWN0aW9ucyBoZXJlIHNpbmNlIGlu
IHNvbWUgY2FzZXMsIGpRdWVyeSB3aWxsIHRyaWdnZXIKKyAgICAgICAgLy8gYW4gZXZlbnQgb24g
YHJlbW92ZUNoaWxkYCAoaS5lLiBmb2N1c291dCkgYWZ0ZXIgd2UndmUgYWxyZWFkeSB0b3JuIGRv
d24gdGhlCisgICAgICAgIC8vIGFjdGlvbiBoYW5kbGVycyBmb3IgdGhlIHZpZXcuCisgICAgICAg
IGlmICghYWN0aW9ucykgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAg
IGZvciAodmFyIGluZGV4ID0gMCwgX2xlbmd0aCA9IGFjdGlvbnMubGVuZ3RoOyBpbmRleCA8IF9s
ZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpbmRleF07
CisKKyAgICAgICAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5ldmVudE5hbWUgPT09IGV2ZW50TmFt
ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5oYW5kbGVyKGV2dCk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9LAorCisgICAgX2ZpbmROZWFyZXN0RXZlbnRN
YW5hZ2VyOiBmdW5jdGlvbiAodmlldywgZXZlbnROYW1lKSB7CisgICAgICB2YXIgbWFuYWdlciA9
IG51bGw7CisKKyAgICAgIHdoaWxlICh2aWV3KSB7CisgICAgICAgIG1hbmFnZXIgPSBfZW1iZXJN
ZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywgJ2V2ZW50TWFuYWdlcicpOworICAgICAgICBpZiAo
bWFuYWdlciAmJiBtYW5hZ2VyW2V2ZW50TmFtZV0pIHsKKyAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorCisgICAgICAgIHZpZXcgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywg
J3BhcmVudFZpZXcnKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1hbmFnZXI7CisgICAgfSwK
KworICAgIF9kaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAob2JqZWN0LCBldnQsIGV2ZW50TmFtZSwg
dmlldykgeworICAgICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICAgIHZhciBoYW5kbGVyID0g
b2JqZWN0W2V2ZW50TmFtZV07CisgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlv
bicpIHsKKyAgICAgICAgcmVzdWx0ID0gX2VtYmVyTWV0YWxSdW5fbG9vcC5kZWZhdWx0KG9iamVj
dCwgaGFuZGxlciwgZXZ0LCB2aWV3KTsKKyAgICAgICAgLy8gRG8gbm90IHByZXZlbnREZWZhdWx0
IGluIGV2ZW50TWFuYWdlcnMuCisgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAg
IH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IHRoaXMuX2J1YmJsZUV2ZW50KHZpZXcsIGV2dCwg
ZXZlbnROYW1lKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9LAorCisg
ICAgX2J1YmJsZUV2ZW50OiBmdW5jdGlvbiAodmlldywgZXZ0LCBldmVudE5hbWUpIHsKKyAgICAg
IHJldHVybiB2aWV3LmhhbmRsZUV2ZW50KGV2ZW50TmFtZSwgZXZ0KTsKKyAgICB9LAorCisgICAg
ZGVzdHJveTogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHJvb3RFbGVtZW50ID0gX2VtYmVyTWV0
YWxQcm9wZXJ0eV9nZXQuZ2V0KHRoaXMsICdyb290RWxlbWVudCcpOworICAgICAgX2VtYmVyVmll
d3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChyb290RWxlbWVudCkub2ZmKCcuZW1iZXInLCAnKionKS5y
ZW1vdmVDbGFzcyhST09UX0VMRU1FTlRfQ0xBU1MpOworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVy
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlv
biAoKSB7CisgICAgICByZXR1cm4gJyhFdmVudERpc3BhdGNoZXIpJzsKKyAgICB9CisgIH0pOwor
fSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3N5c3RlbS9leHQnLCBbJ2V4cG9ydHMnLCAnZW1iZXIt
bWV0YWwvcnVuX2xvb3AnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsUnVuX2xvb3Ap
IHsKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAq
LworCisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBBZGQgYSBuZXcgbmFtZWQgcXVldWUgZm9yIHJl
bmRlcmluZyB2aWV3cyB0aGF0IGhhcHBlbnMKKyAgLy8gYWZ0ZXIgYmluZGluZ3MgaGF2ZSBzeW5j
ZWQsIGFuZCBhIHF1ZXVlIGZvciBzY2hlZHVsaW5nIGFjdGlvbnMKKyAgLy8gdGhhdCBzaG91bGQg
b2NjdXIgYWZ0ZXIgdmlldyByZW5kZXJpbmcuCisgIF9lbWJlck1ldGFsUnVuX2xvb3AuZGVmYXVs
dC5fYWRkUXVldWUoJ3JlbmRlcicsICdhY3Rpb25zJyk7CisgIF9lbWJlck1ldGFsUnVuX2xvb3Au
ZGVmYXVsdC5fYWRkUXVldWUoJ2FmdGVyUmVuZGVyJywgJ3JlbmRlcicpOworfSk7CitlbmlmZWQo
J2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvY29y
ZScsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
TWV0YWxDb3JlLCBfZW1iZXJNZXRhbEVudmlyb25tZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICB2YXIgalF1ZXJ5OworCisgIGlmIChfZW1iZXJNZXRhbEVudmlyb25tZW50LmRlZmF1bHQuaGFz
RE9NKSB7CisgICAgLy8gbWFpbkNvbnRleHQgaXMgc2V0IGluIGBwYWNrYWdlL2xvYWRlci9saWIv
bWFpbi5qc2AgdG8gdGhlIGB0aGlzYCBjb250ZXh0IGJlZm9yZSBlbnRlcmluZyBzdHJpY3QgbW9k
ZQorICAgIGpRdWVyeSA9IF9lbWJlck1ldGFsQ29yZS5kZWZhdWx0LmltcG9ydHMgJiYgX2VtYmVy
TWV0YWxDb3JlLmRlZmF1bHQuaW1wb3J0cy5qUXVlcnkgfHwgbWFpbkNvbnRleHQgJiYgbWFpbkNv
bnRleHQualF1ZXJ5OyAvL2pzaGludCBpZ25vcmU6bGluZQorICAgIGlmICghalF1ZXJ5ICYmIHR5
cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICBqUXVlcnkgPSByZXF1aXJlKCdq
cXVlcnknKTsKKyAgICB9CisKKyAgICBpZiAoalF1ZXJ5KSB7CisgICAgICAvLyBodHRwOi8vd3d3
LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9kbmQuaHRt
bCNkbmRldmVudHMKKyAgICAgIHZhciBkcmFnRXZlbnRzID0gWydkcmFnc3RhcnQnLCAnZHJhZycs
ICdkcmFnZW50ZXInLCAnZHJhZ2xlYXZlJywgJ2RyYWdvdmVyJywgJ2Ryb3AnLCAnZHJhZ2VuZCdd
OworCisgICAgICAvLyBDb3BpZXMgdGhlIGBkYXRhVHJhbnNmZXJgIHByb3BlcnR5IGZyb20gYSBi
cm93c2VyIGV2ZW50IG9iamVjdCBvbnRvIHRoZQorICAgICAgLy8galF1ZXJ5IGV2ZW50IG9iamVj
dCBmb3IgdGhlIHNwZWNpZmllZCBldmVudHMKKyAgICAgIGRyYWdFdmVudHMuZm9yRWFjaChmdW5j
dGlvbiAoZXZlbnROYW1lKSB7CisgICAgICAgIGpRdWVyeS5ldmVudC5maXhIb29rc1tldmVudE5h
bWVdID0geworICAgICAgICAgIHByb3BzOiBbJ2RhdGFUcmFuc2ZlciddCisgICAgICAgIH07Cisg
ICAgICB9KTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRlZmF1bHQgPSBqUXVlcnk7Cit9KTsK
KworLy8gRVM2VE9ETzogdGhlIGZ1bmN0aW9ucyBvbiBFbnVtZXJhYmxlVXRpbHMgbmVlZCB0aGVp
ciBvd24gZXhwb3J0cworZW5pZmVkKCdlbWJlci12aWV3cy9zeXN0ZW0vbG9va3VwX3BhcnRpYWwn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvZXJyb3InXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRGVidWcsIF9lbWJlck1ldGFsRXJyb3IpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGxvb2t1cFBhcnRpYWw7CisK
KyAgZnVuY3Rpb24gbG9va3VwUGFydGlhbChlbnYsIHRlbXBsYXRlTmFtZSkgeworICAgIGlmICh0
ZW1wbGF0ZU5hbWUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBu
YW1lUGFydHMgPSB0ZW1wbGF0ZU5hbWUuc3BsaXQoJy8nKTsKKyAgICB2YXIgbGFzdFBhcnQgPSBu
YW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0aCAtIDFdOworCisgICAgbmFtZVBhcnRzW25hbWVQYXJ0
cy5sZW5ndGggLSAxXSA9ICdfJyArIGxhc3RQYXJ0OworCisgICAgdmFyIHVuZGVyc2NvcmVkTmFt
ZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CisgICAgdmFyIHRlbXBsYXRlID0gdGVtcGxhdGVGb3Io
ZW52LCB1bmRlcnNjb3JlZE5hbWUsIHRlbXBsYXRlTmFtZSk7CisKKyAgICBfZW1iZXJNZXRhbERl
YnVnLmFzc2VydCgnVW5hYmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgIicgKyB0ZW1wbGF0
ZU5hbWUgKyAnIicsICEhdGVtcGxhdGUpOworCisgICAgcmV0dXJuIHRlbXBsYXRlOworICB9CisK
KyAgZnVuY3Rpb24gdGVtcGxhdGVGb3IoZW52LCB1bmRlcnNjb3JlZCwgbmFtZSkgeworICAgIGlm
ICghbmFtZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfZW1iZXJNZXRhbERlYnVnLmFz
c2VydCgndGVtcGxhdGVOYW1lcyBhcmUgbm90IGFsbG93ZWQgdG8gY29udGFpbiBwZXJpb2RzOiAn
ICsgbmFtZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKKworICAgIGlmICghZW52Lm93bmVy
KSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0KCdDb250YWluZXIg
d2FzIG5vdCBmb3VuZCB3aGVuIGxvb2tpbmcgdXAgYSB2aWV3cyB0ZW1wbGF0ZS4gJyArICdUaGlz
IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byBtYW51YWxseSBpbnN0YW50aWF0aW5nIGFuIEVtYmVyLlZp
ZXcuICcgKyAnU2VlOiBodHRwOi8vZ2l0LmlvL0VLUHBuQScpOworICAgIH0KKworICAgIHJldHVy
biBlbnYub3duZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgdW5kZXJzY29yZWQpIHx8IGVudi5vd25l
ci5sb29rdXAoJ3RlbXBsYXRlOicgKyBuYW1lKTsKKyAgfQorfSk7CitlbmlmZWQoJ2VtYmVyLXZp
ZXdzL3N5c3RlbS9wbGF0Zm9ybScsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9lbnZpcm9ubWVu
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxFbnZpcm9ubWVudCkgeworICAndXNl
IHN0cmljdCc7CisKKyAgLy8gSUUgNi83IGhhdmUgYnVncyBhcm91bmQgc2V0dGluZyBuYW1lcyBv
biBpbnB1dHMgZHVyaW5nIGNyZWF0aW9uLgorICAvLyBGcm9tIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9pZS9tczUzNjM4OSh2PXZzLjg1KS5hc3B4OgorICAvLyAiVG8g
aW5jbHVkZSB0aGUgTkFNRSBhdHRyaWJ1dGUgYXQgcnVuIHRpbWUgb24gb2JqZWN0cyBjcmVhdGVk
IHdpdGggdGhlIGNyZWF0ZUVsZW1lbnQgbWV0aG9kLCB1c2UgdGhlIGVUYWcuIgorICB2YXIgY2Fu
U2V0TmFtZU9uSW5wdXRzID0gX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RPTSAm
JiAoZnVuY3Rpb24gKCkgeworICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKTsKKyAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOworCisg
ICAgZWwuc2V0QXR0cmlidXRlKCduYW1lJywgJ2ZvbycpOworICAgIGRpdi5hcHBlbmRDaGlsZChl
bCk7CisKKyAgICByZXR1cm4gISFkaXYuaW5uZXJIVE1MLm1hdGNoKCdmb28nKTsKKyAgfSkoKTsK
KyAgZXhwb3J0cy5jYW5TZXROYW1lT25JbnB1dHMgPSBjYW5TZXROYW1lT25JbnB1dHM7Cit9KTsK
K2VuaWZlZCgiZW1iZXItdmlld3Mvc3lzdGVtL3V0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9u
IChleHBvcnRzKSB7CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5pc1NpbXBsZUNsaWNr
ID0gaXNTaW1wbGVDbGljazsKKyAgZXhwb3J0cy5nZXRWaWV3Q2xpZW50UmVjdHMgPSBnZXRWaWV3
Q2xpZW50UmVjdHM7CisgIGV4cG9ydHMuZ2V0Vmlld0JvdW5kaW5nQ2xpZW50UmVjdCA9IGdldFZp
ZXdCb3VuZGluZ0NsaWVudFJlY3Q7CisKKyAgZnVuY3Rpb24gaXNTaW1wbGVDbGljayhldmVudCkg
eworICAgIHZhciBtb2RpZmllciA9IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwg
ZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXk7CisgICAgdmFyIHNlY29uZGFyeUNsaWNrID0g
ZXZlbnQud2hpY2ggPiAxOyAvLyBJRTkgbWF5IHJldHVybiB1bmRlZmluZWQKKworICAgIHJldHVy
biAhbW9kaWZpZXIgJiYgIXNlY29uZGFyeUNsaWNrOworICB9CisKKyAgLyoqCisgICAgQHByaXZh
dGUKKyAgICBAbWV0aG9kIGdldFZpZXdSYW5nZQorICAgIEBwYXJhbSB7RW1iZXIuVmlld30gdmll
dworICAqLworICBmdW5jdGlvbiBnZXRWaWV3UmFuZ2UodmlldykgeworICAgIHZhciByYW5nZSA9
IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUodmlldy5f
cmVuZGVyTm9kZS5maXJzdE5vZGUpOworICAgIHJhbmdlLnNldEVuZEFmdGVyKHZpZXcuX3JlbmRl
ck5vZGUubGFzdE5vZGUpOworICAgIHJldHVybiByYW5nZTsKKyAgfQorCisgIC8qKgorICAgIGBn
ZXRWaWV3Q2xpZW50UmVjdHNgIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3NpdGlv
biBvZiB0aGUgYm9yZGVyCisgICAgYm94IGVkZ2VzIG9mIGEgdmlldyByZWxhdGl2ZSB0byB0aGUg
dmlld3BvcnQuCisgIAorICAgIEl0IGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBkZXZl
bG9wbWVudCB0b29scyBsaWtlIHRoZSBFbWJlciBJbnNwZWN0b3IKKyAgICBhbmQgbWF5IG5vdCB3
b3JrIG9uIG9sZGVyIGJyb3dzZXJzLgorICAKKyAgICBAcHJpdmF0ZQorICAgIEBtZXRob2QgZ2V0
Vmlld0NsaWVudFJlY3RzCisgICAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3CisgICovCisKKyAg
ZnVuY3Rpb24gZ2V0Vmlld0NsaWVudFJlY3RzKHZpZXcpIHsKKyAgICB2YXIgcmFuZ2UgPSBnZXRW
aWV3UmFuZ2Uodmlldyk7CisgICAgcmV0dXJuIHJhbmdlLmdldENsaWVudFJlY3RzKCk7CisgIH0K
KworICAvKioKKyAgICBgZ2V0Vmlld0JvdW5kaW5nQ2xpZW50UmVjdGAgcHJvdmlkZXMgaW5mb3Jt
YXRpb24gYWJvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgIGJvdW5kaW5nIGJvcmRlciBib3gg
ZWRnZXMgb2YgYSB2aWV3IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgCisgICAgSXQgaXMg
b25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGRldmVsb3BtZW50IHRvb2xzIGxpa2UgdGhlIEVt
YmVyIElucHNlY3RvcgorICAgIGFuZCBtYXkgbm90IHdvcmsgb24gb2xkZXIgYnJvd3NlcnMuCisg
IAorICAgIEBwcml2YXRlCisgICAgQG1ldGhvZCBnZXRWaWV3Qm91bmRpbmdDbGllbnRSZWN0Cisg
ICAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3CisgICovCisKKyAgZnVuY3Rpb24gZ2V0Vmlld0Jv
dW5kaW5nQ2xpZW50UmVjdCh2aWV3KSB7CisgICAgdmFyIHJhbmdlID0gZ2V0Vmlld1JhbmdlKHZp
ZXcpOworICAgIHJldHVybiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgfQorfSk7
CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3ZpZXdzL2NoZWNrYm94JywgWydleHBvcnRzJywgJ2VtYmVy
LW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci1tZXRhbC9wcm9wZXJ0eV9zZXQnLCAnZW1iZXIt
dmlld3MvY29tcG9uZW50cy9jb21wb25lbnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1l
dGFsUHJvcGVydHlfZ2V0LCBfZW1iZXJNZXRhbFByb3BlcnR5X3NldCwgX2VtYmVyVmlld3NDb21w
b25lbnRzQ29tcG9uZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgQG1vZHVsZSBl
bWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgLyoqCisgICAgVGhlIGlu
dGVybmFsIGNsYXNzIHVzZWQgdG8gY3JlYXRlIHRleHQgaW5wdXRzIHdoZW4gdGhlIGB7e2lucHV0
fX1gCisgICAgaGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2YgYGNoZWNrYm94YC4KKyAgCisg
ICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVycy5pbnB1dF0oL2FwaS9jbGFzc2VzL0VtYmVy
LlRlbXBsYXRlcy5oZWxwZXJzLmh0bWwjbWV0aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRldGFpbHMu
CisgIAorICAgICMjIERpcmVjdCBtYW5pcHVsYXRpb24gb2YgYGNoZWNrZWRgCisgIAorICAgIFRo
ZSBgY2hlY2tlZGAgYXR0cmlidXRlIG9mIGFuIGBFbWJlci5DaGVja2JveGAgb2JqZWN0IHNob3Vs
ZCBhbHdheXMgYmUgc2V0CisgICAgdGhyb3VnaCB0aGUgRW1iZXIgb2JqZWN0IG9yIGJ5IGludGVy
YWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKKyAgICByZXByZXNlbnRhdGlvbiB2aWEg
dGhlIG1vdXNlLCBrZXlib2FyZCwgb3IgdG91Y2guIFVwZGF0aW5nIHRoZSB2YWx1ZSBvZiB0aGUK
KyAgICBjaGVja2JveCB2aWEgalF1ZXJ5IHdpbGwgcmVzdWx0IGluIHRoZSBjaGVja2VkIHZhbHVl
IG9mIHRoZSBvYmplY3QgYW5kIGl0cworICAgIGVsZW1lbnQgbG9zaW5nIHN5bmNocm9uaXphdGlv
bi4KKyAgCisgICAgIyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMKKyAgCisgICAg
QmVjYXVzZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBh
bmQgYGxheW91dE5hbWVgCisgICAgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUg
W0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwpJ3MKKyAgICBsYXlvdXQg
c2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgCisgICAgQGNsYXNzIENoZWNrYm94Cisg
ICAgQG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEBw
dWJsaWMKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0gX2VtYmVyVmlld3NDb21wb25lbnRzQ29t
cG9uZW50LmRlZmF1bHQuZXh0ZW5kKHsKKyAgICBpbnN0cnVtZW50RGlzcGxheTogJ3t7aW5wdXQg
dHlwZT0iY2hlY2tib3gifX0nLAorCisgICAgY2xhc3NOYW1lczogWydlbWJlci1jaGVja2JveCdd
LAorCisgICAgdGFnTmFtZTogJ2lucHV0JywKKworICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5
cGUnLCAnY2hlY2tlZCcsICdpbmRldGVybWluYXRlJywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4Jywg
J25hbWUnLCAnYXV0b2ZvY3VzJywgJ3JlcXVpcmVkJywgJ2Zvcm0nXSwKKworICAgIHR5cGU6ICdj
aGVja2JveCcsCisgICAgY2hlY2tlZDogZmFsc2UsCisgICAgZGlzYWJsZWQ6IGZhbHNlLAorICAg
IGluZGV0ZXJtaW5hdGU6IGZhbHNlLAorCisgICAgZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rpb24g
KCkgeworICAgICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIF9l
bWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnZWxlbWVudCcpLmluZGV0ZXJtaW5hdGUg
PSAhIV9lbWJlck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaW5kZXRlcm1pbmF0ZScpOwor
ICAgIH0sCisKKyAgICBjaGFuZ2U6IGZ1bmN0aW9uICgpIHsKKyAgICAgIF9lbWJlck1ldGFsUHJv
cGVydHlfc2V0LnNldCh0aGlzLCAnY2hlY2tlZCcsIHRoaXMuJCgpLnByb3AoJ2NoZWNrZWQnKSk7
CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdlbWJlci12aWV3cy92aWV3cy9jb3JlX3ZpZXcn
LCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvZGVidWcnLCAnZW1iZXItbWV0YWwvcHJvcGVydHlf
Z2V0JywgJ2VtYmVyLXJ1bnRpbWUvc3lzdGVtL29iamVjdCcsICdlbWJlci1ydW50aW1lL21peGlu
cy9ldmVudGVkJywgJ2VtYmVyLXJ1bnRpbWUvbWl4aW5zL2FjdGlvbl9oYW5kbGVyJywgJ2VtYmVy
LXJ1bnRpbWUvdXRpbHMnLCAnZW1iZXItbWV0YWwtdmlld3MnLCAnZW1iZXItdmlld3Mvdmlld3Mv
c3RhdGVzJywgJ2h0bWxiYXJzLXJ1bnRpbWUnLCAncmVxdWlyZSddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyTWV0YWxEZWJ1ZywgX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQsIF9lbWJlclJ1bnRp
bWVTeXN0ZW1PYmplY3QsIF9lbWJlclJ1bnRpbWVNaXhpbnNFdmVudGVkLCBfZW1iZXJSdW50aW1l
TWl4aW5zQWN0aW9uX2hhbmRsZXIsIF9lbWJlclJ1bnRpbWVVdGlscywgX2VtYmVyTWV0YWxWaWV3
cywgX2VtYmVyVmlld3NWaWV3c1N0YXRlcywgX2h0bWxiYXJzUnVudGltZSwgX3JlcXVpcmUpIHsK
KyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIE5vcm1hbGx5LCB0aGUgcmVuZGVyZXIgaXMgaW5qZWN0
ZWQgYnkgdGhlIGNvbnRhaW5lciB3aGVuIHRoZSB2aWV3IGlzIGxvb2tlZAorICAvLyB1cC4gSG93
ZXZlciwgaWYgc29tZW9uZSBjcmVhdGVzIGEgdmlldyB3aXRob3V0IGxvb2tpbmcgaXQgdXAgdmlh
IHRoZQorICAvLyBjb250YWluZXIgKGUuZy4gYEVtYmVyLlZpZXcuY3JlYXRlKCkuYXBwZW5kKClg
KSB0aGVuIHdlIGNyZWF0ZSBhIGZhbGxiYWNrCisgIC8vIERPTSByZW5kZXJlciB0aGF0IGlzIHNo
YXJlZC4gSW4gZ2VuZXJhbCwgdGhpcyBwYXRoIHNob3VsZCBiZSBhdm9pZGVkIHNpbmNlCisgIC8v
IHZpZXdzIGNyZWF0ZWQgdGhpcyB3YXkgY2Fubm90IHJ1biBpbiBhIG5vZGUgZW52aXJvbm1lbnQu
CisgIHZhciByZW5kZXJlcjsKKworICAvKioKKyAgICBgRW1iZXIuQ29yZVZpZXdgIGlzIGFuIGFi
c3RyYWN0IGNsYXNzIHRoYXQgZXhpc3RzIHRvIGdpdmUgdmlldy1saWtlIGJlaGF2aW9yCisgICAg
dG8gYm90aCBFbWJlcidzIG1haW4gdmlldyBjbGFzcyBgRW1iZXIuVmlld2AgYW5kIG90aGVyIGNs
YXNzZXMgdGhhdCBkb24ndCBuZWVkCisgICAgdGhlIGZ1bGx5IGZ1bmN0aW9uYWx0aXkgb2YgYEVt
YmVyLlZpZXdgLgorICAKKyAgICBVbmxlc3MgeW91IGhhdmUgc3BlY2lmaWMgbmVlZHMgZm9yIGBD
b3JlVmlld2AsIHlvdSB3aWxsIHVzZSBgRW1iZXIuVmlld2AKKyAgICBpbiB5b3VyIGFwcGxpY2F0
aW9ucy4KKyAgCisgICAgQGNsYXNzIENvcmVWaWV3CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAg
IEBleHRlbmRzIEVtYmVyLk9iamVjdAorICAgIEBkZXByZWNhdGVkIFVzZSBgRW1iZXIuVmlld2Ag
aW5zdGVhZC4KKyAgICBAdXNlcyBFbWJlci5FdmVudGVkCisgICAgQHVzZXMgRW1iZXIuQWN0aW9u
SGFuZGxlcgorICAgIEBwcml2YXRlCisgICovCisgIHZhciBDb3JlVmlldyA9IF9lbWJlclJ1bnRp
bWVTeXN0ZW1PYmplY3QuZGVmYXVsdC5leHRlbmQoX2VtYmVyUnVudGltZU1peGluc0V2ZW50ZWQu
ZGVmYXVsdCwgX2VtYmVyUnVudGltZU1peGluc0FjdGlvbl9oYW5kbGVyLmRlZmF1bHQsIHsKKyAg
ICBpc1ZpZXc6IHRydWUsCisKKyAgICBfc3RhdGVzOiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzLmNs
b25lU3RhdGVzKF9lbWJlclZpZXdzVmlld3NTdGF0ZXMuc3RhdGVzKSwKKworICAgIGluaXQ6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cisg
ICAgICB0aGlzLl9zdGF0ZSA9ICdwcmVSZW5kZXInOworICAgICAgdGhpcy5fY3VycmVudFN0YXRl
ID0gdGhpcy5fc3RhdGVzLnByZVJlbmRlcjsKKyAgICAgIHRoaXMuX2lzVmlzaWJsZSA9IF9lbWJl
ck1ldGFsUHJvcGVydHlfZ2V0LmdldCh0aGlzLCAnaXNWaXNpYmxlJyk7CisKKyAgICAgIC8vIEZh
bGxiYWNrIGZvciBsZWdhY3kgY2FzZXMgd2hlcmUgdGhlIHZpZXcgd2FzIGNyZWF0ZWQgZGlyZWN0
bHkKKyAgICAgIC8vIHZpYSBgY3JlYXRlKClgIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCB0aGUg
Y29udGFpbmVyLgorICAgICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7CisgICAgICAgIHZhciBET01I
ZWxwZXIgPSBkb21IZWxwZXIoKTsKKyAgICAgICAgcmVuZGVyZXIgPSByZW5kZXJlciB8fCBfZW1i
ZXJNZXRhbFZpZXdzLkludGVyYWN0aXZlUmVuZGVyZXIuY3JlYXRlKHsgZG9tOiBuZXcgRE9NSGVs
cGVyKCkgfSk7CisgICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKKyAgICAgIH0KKwor
ICAgICAgdGhpcy5fZGVzdHJveWluZ1N1YnRyZWVGb3JWaWV3ID0gbnVsbDsKKyAgICAgIHRoaXMu
X2Rpc3BhdGNoaW5nID0gbnVsbDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBJZiB0aGUgdmll
dyBpcyBjdXJyZW50bHkgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIG9mIGEgcGFyZW50IHZpZXcsIHRo
aXMKKyAgICAgIHByb3BlcnR5IHdpbGwgcG9pbnQgdG8gdGhlIHBhcmVudCBvZiB0aGUgdmlldy4K
KyAgICAgICBAcHJvcGVydHkgcGFyZW50VmlldworICAgICAgQHR5cGUgRW1iZXIuVmlldworICAg
ICAgQGRlZmF1bHQgbnVsbAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHBhcmVudFZpZXc6
IG51bGwsCisKKyAgICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmlldycsCisKKyAgICBpbnN0cnVt
ZW50RGV0YWlsczogZnVuY3Rpb24gKGhhc2gpIHsKKyAgICAgIGhhc2gub2JqZWN0ID0gdGhpcy50
b1N0cmluZygpOworICAgICAgaGFzaC5jb250YWluZXJLZXkgPSB0aGlzLl9kZWJ1Z0NvbnRhaW5l
cktleTsKKyAgICAgIGhhc2gudmlldyA9IHRoaXM7CisgICAgfSwKKworICAgIC8qKgorICAgICAg
T3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20gYEVtYmVyLkV2ZW50ZWRgIHRv
CisgICAgICBhbHNvIGNhbGwgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgIEBt
ZXRob2QgdHJpZ2dlcgorICAgICAgQHBhcmFtIG5hbWUge1N0cmluZ30KKyAgICAgIEBwcml2YXRl
CisgICAgKi8KKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLl9zdXBlci5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgdmFyIG5hbWUgPSBhcmd1bWVudHNbMF07Cisg
ICAgICB2YXIgbWV0aG9kID0gdGhpc1tuYW1lXTsKKyAgICAgIGlmIChtZXRob2QpIHsKKyAgICAg
ICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgICAgIHZhciBhcmdzID0gbmV3
IEFycmF5KGxlbmd0aCAtIDEpOworICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICAgIH0KKyAgICB9
LAorCisgICAgaGFzOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIF9lbWJlclJ1bnRp
bWVVdGlscy50eXBlT2YodGhpc1tuYW1lXSkgPT09ICdmdW5jdGlvbicgfHwgdGhpcy5fc3VwZXIo
bmFtZSk7CisgICAgfSwKKworICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmICgh
dGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgeworICAgICAgICByZXR1cm47Cisg
ICAgICB9CisKKyAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZS5jbGVhbnVwKHRoaXMpOworCisgICAg
ICAvLyBJZiB0aGUgZGVzdHJveWluZ1N1YnRyZWVGb3JWaWV3IHByb3BlcnR5IGlzIG5vdCBzZXQg
YnV0IHdlIGhhdmUgYW4KKyAgICAgIC8vIGFzc29jaWF0ZWQgcmVuZGVyIG5vZGUsIGl0IG1lYW5z
IHRoaXMgdmlldyBpcyBiZWluZyBkZXN0cm95ZWQgZnJvbSB1c2VyCisgICAgICAvLyBjb2RlIGFu
ZCBub3QgdmlhIGEgY2hhbmdlIGluIHRoZSB0ZW1wbGF0aW5nIGxheWVyIChsaWtlIGFuIHt7aWZ9
fQorICAgICAgLy8gYmVjb21pbmcgZmFsc3ksIGZvciBleGFtcGxlKS4gIEluIHRoaXMgY2FzZSwg
aXQgaXMgb3VyIHJlc3BvbnNpYmlsaXR5IHRvCisgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbnkg
cmVuZGVyIG5vZGVzIGNyZWF0ZWQgYXMgcGFydCBvZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MKKyAg
ICAgIC8vIGFyZSBjbGVhbmVkIHVwLgorICAgICAgaWYgKCF0aGlzLm93bmVyVmlldy5fZGVzdHJv
eWluZ1N1YnRyZWVGb3JWaWV3ICYmIHRoaXMuX3JlbmRlck5vZGUpIHsKKyAgICAgICAgX2VtYmVy
TWV0YWxEZWJ1Zy5hc3NlcnQoJ0JVRzogUmVuZGVyIG5vZGUgZXhpc3RzIHdpdGhvdXQgY29uY29t
aXRhbnQgZW52LicsIHRoaXMub3duZXJWaWV3LmVudik7CisgICAgICAgIF9odG1sYmFyc1J1bnRp
bWUuaW50ZXJuYWwuY2xlYXJNb3JwaCh0aGlzLl9yZW5kZXJOb2RlLCB0aGlzLm93bmVyVmlldy5l
bnYsIHRydWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0pOwor
CisgIF9lbWJlclJ1bnRpbWVNaXhpbnNBY3Rpb25faGFuZGxlci5kZXByZWNhdGVVbmRlcnNjb3Jl
QWN0aW9ucyhDb3JlVmlldyk7CisKKyAgQ29yZVZpZXcucmVvcGVuQ2xhc3MoeworICAgIGlzVmll
d0ZhY3Rvcnk6IHRydWUKKyAgfSk7CisKKyAgdmFyIF9kb21IZWxwZXI7CisgIGZ1bmN0aW9uIGRv
bUhlbHBlcigpIHsKKyAgICByZXR1cm4gX2RvbUhlbHBlciA9IF9kb21IZWxwZXIgfHwgX3JlcXVp
cmUuZGVmYXVsdCgnZW1iZXItaHRtbGJhcnMvc3lzdGVtL2RvbS1oZWxwZXInKS5kZWZhdWx0Owor
ICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gQ29yZVZpZXc7Cit9KTsKK2VuaWZlZCgnZW1iZXIt
dmlld3Mvdmlld3Mvc3RhdGVzJywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Fzc2lnbicsICdl
bWJlci12aWV3cy92aWV3cy9zdGF0ZXMvZGVmYXVsdCcsICdlbWJlci12aWV3cy92aWV3cy9zdGF0
ZXMvcHJlX3JlbmRlcicsICdlbWJlci12aWV3cy92aWV3cy9zdGF0ZXMvaGFzX2VsZW1lbnQnLCAn
ZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2luX2RvbScsICdlbWJlci12aWV3cy92aWV3cy9zdGF0
ZXMvZGVzdHJveWluZyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxBc3NpZ24sIF9l
bWJlclZpZXdzVmlld3NTdGF0ZXNEZWZhdWx0LCBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzUHJlX3Jl
bmRlciwgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0hhc19lbGVtZW50LCBfZW1iZXJWaWV3c1ZpZXdz
U3RhdGVzSW5fZG9tLCBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVzdHJveWluZykgeworICAndXNl
IHN0cmljdCc7CisKKyAgZXhwb3J0cy5jbG9uZVN0YXRlcyA9IGNsb25lU3RhdGVzOworCisgIGZ1
bmN0aW9uIGNsb25lU3RhdGVzKGZyb20pIHsKKyAgICB2YXIgaW50byA9IHt9OworCisgICAgaW50
by5fZGVmYXVsdCA9IHt9OworICAgIGludG8ucHJlUmVuZGVyID0gT2JqZWN0LmNyZWF0ZShpbnRv
Ll9kZWZhdWx0KTsKKyAgICBpbnRvLmRlc3Ryb3lpbmcgPSBPYmplY3QuY3JlYXRlKGludG8uX2Rl
ZmF1bHQpOworICAgIGludG8uaGFzRWxlbWVudCA9IE9iamVjdC5jcmVhdGUoaW50by5fZGVmYXVs
dCk7CisgICAgaW50by5pbkRPTSA9IE9iamVjdC5jcmVhdGUoaW50by5oYXNFbGVtZW50KTsKKwor
ICAgIGZvciAodmFyIHN0YXRlTmFtZSBpbiBmcm9tKSB7CisgICAgICBpZiAoIWZyb20uaGFzT3du
UHJvcGVydHkoc3RhdGVOYW1lKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAg
IF9lbWJlck1ldGFsQXNzaWduLmRlZmF1bHQoaW50b1tzdGF0ZU5hbWVdLCBmcm9tW3N0YXRlTmFt
ZV0pOworICAgIH0KKworICAgIHJldHVybiBpbnRvOworICB9CisKKyAgdmFyIHN0YXRlcyA9IHsK
KyAgICBfZGVmYXVsdDogX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVsdCwKKyAg
ICBwcmVSZW5kZXI6IF9lbWJlclZpZXdzVmlld3NTdGF0ZXNQcmVfcmVuZGVyLmRlZmF1bHQsCisg
ICAgaW5ET006IF9lbWJlclZpZXdzVmlld3NTdGF0ZXNJbl9kb20uZGVmYXVsdCwKKyAgICBoYXNF
bGVtZW50OiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzSGFzX2VsZW1lbnQuZGVmYXVsdCwKKyAgICBk
ZXN0cm95aW5nOiBfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVzdHJveWluZy5kZWZhdWx0CisgIH07
CisgIGV4cG9ydHMuc3RhdGVzID0gc3RhdGVzOworfSk7CitlbmlmZWQoJ2VtYmVyLXZpZXdzL3Zp
ZXdzL3N0YXRlcy9kZWZhdWx0JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsL2Vycm9yJywgJ2Vt
YmVyLW1ldGFsL3Byb3BlcnR5X2dldCcsICdlbWJlci12aWV3cy9jb21wYXQvYXR0cnMtcHJveHkn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsRXJyb3IsIF9lbWJlck1ldGFsUHJvcGVy
dHlfZ2V0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8K
KyAgZXhwb3J0cy5kZWZhdWx0ID0geworICAgIC8vIGFwcGVuZENoaWxkIGlzIG9ubHkgbGVnYWwg
d2hpbGUgcmVuZGVyaW5nIHRoZSBidWZmZXIuCisgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uICgp
IHsKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9yLmRlZmF1bHQoJ1lvdSBjYW5cJ3Qg
dXNlIGFwcGVuZENoaWxkIG91dHNpZGUgb2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzJyk7CisgICAg
fSwKKworICAgICQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAg
fSwKKworICAgIGdldEVsZW1lbnQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiBudWxsOwor
ICAgIH0sCisKKyAgICBsZWdhY3lQcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24gKHZpZXcsIGtl
eSkgeworICAgICAgdmFyIGF0dHJzID0gdmlldy5hdHRyczsKKyAgICAgIGlmIChhdHRycyAmJiBr
ZXkgaW4gYXR0cnMpIHsKKyAgICAgICAgdmFyIHBvc3NpYmxlQ2VsbCA9IGF0dHJzW2tleV07CisK
KyAgICAgICAgaWYgKHBvc3NpYmxlQ2VsbCAmJiBwb3NzaWJsZUNlbGxbX2VtYmVyVmlld3NDb21w
YXRBdHRyc1Byb3h5Lk1VVEFCTEVfQ0VMTF0pIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBfZW1i
ZXJNZXRhbFByb3BlcnR5X2dldC5nZXQodmlldywga2V5KTsKKyAgICAgICAgICBpZiAodmFsdWUg
PT09IHBvc3NpYmxlQ2VsbC52YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
IH0KKyAgICAgICAgICBwb3NzaWJsZUNlbGwudXBkYXRlKHZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgIH0sCisKKyAgICAvLyBIYW5kbGUgZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlz
cGF0Y2hlcmAKKyAgICBoYW5kbGVFdmVudDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRy
dWU7IC8vIGNvbnRpbnVlIGV2ZW50IHByb3BhZ2F0aW9uCisgICAgfSwKKworICAgIGNsZWFudXA6
IGZ1bmN0aW9uICgpIHt9LAorICAgIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbiAoKSB7fSwKKwor
ICAgIHJlcmVuZGVyOiBmdW5jdGlvbiAodmlldykgeworICAgICAgdmlldy5yZW5kZXJlci5lbnN1
cmVWaWV3Tm90UmVuZGVyaW5nKHZpZXcpOworICAgIH0sCisgICAgaW52b2tlT2JzZXJ2ZXI6IGZ1
bmN0aW9uICgpIHt9CisgIH07Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVz
L2Rlc3Ryb3lpbmcnLCBbJ2V4cG9ydHMnLCAnZW1iZXItbWV0YWwvYXNzaWduJywgJ2VtYmVyLXZp
ZXdzL3ZpZXdzL3N0YXRlcy9kZWZhdWx0JywgJ2VtYmVyLW1ldGFsL2Vycm9yJ10sIGZ1bmN0aW9u
IChleHBvcnRzLCBfZW1iZXJNZXRhbEFzc2lnbiwgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1
bHQsIF9lbWJlck1ldGFsRXJyb3IpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9k
dWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXItdmlld3MKKyAgKi8KKworICB2YXIgZGVzdHJv
eWluZyA9IE9iamVjdC5jcmVhdGUoX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVs
dCk7CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChkZXN0cm95aW5nLCB7CisgICAgYXBw
ZW5kQ2hpbGQ6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRocm93IG5ldyBfZW1iZXJNZXRhbEVycm9y
LmRlZmF1bHQoJ1lvdSBjYW5cJ3QgY2FsbCBhcHBlbmRDaGlsZCBvbiBhIHZpZXcgYmVpbmcgZGVz
dHJveWVkJyk7CisgICAgfSwKKyAgICByZXJlbmRlcjogZnVuY3Rpb24gKCkgeworICAgICAgdGhy
b3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVsdCgnWW91IGNhblwndCBjYWxsIHJlcmVuZGVy
IG9uIGEgdmlldyBiZWluZyBkZXN0cm95ZWQnKTsKKyAgICB9LAorICAgIGRlc3Ryb3lFbGVtZW50
OiBmdW5jdGlvbiAoKSB7CisgICAgICB0aHJvdyBuZXcgX2VtYmVyTWV0YWxFcnJvci5kZWZhdWx0
KCdZb3UgY2FuXCd0IGNhbGwgZGVzdHJveUVsZW1lbnQgb24gYSB2aWV3IGJlaW5nIGRlc3Ryb3ll
ZCcpOworICAgIH0KKyAgfSk7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGVzdHJveWluZzsKK30p
OworZW5pZmVkKCdlbWJlci12aWV3cy92aWV3cy9zdGF0ZXMvaGFzX2VsZW1lbnQnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2RlZmF1bHQnLCAnZW1iZXItbWV0YWwvYXNz
aWduJywgJ2VtYmVyLXZpZXdzL3N5c3RlbS9qcXVlcnknLCAnZW1iZXItbWV0YWwvcnVuX2xvb3An
LCAnZW1iZXItbWV0YWwvaW5zdHJ1bWVudGF0aW9uJywgJ2VtYmVyLW1ldGFsL3Byb3BlcnR5X2dl
dCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQsIF9l
bWJlck1ldGFsQXNzaWduLCBfZW1iZXJWaWV3c1N5c3RlbUpxdWVyeSwgX2VtYmVyTWV0YWxSdW5f
bG9vcCwgX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24sIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgaGFzRWxlbWVudCA9IE9iamVjdC5jcmVhdGUo
X2VtYmVyVmlld3NWaWV3c1N0YXRlc0RlZmF1bHQuZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxB
c3NpZ24uZGVmYXVsdChoYXNFbGVtZW50LCB7CisgICAgJDogZnVuY3Rpb24gKHZpZXcsIHNlbCkg
eworICAgICAgdmFyIGVsZW0gPSB2aWV3LmVsZW1lbnQ7CisgICAgICByZXR1cm4gc2VsID8gX2Vt
YmVyVmlld3NTeXN0ZW1KcXVlcnkuZGVmYXVsdChzZWwsIGVsZW0pIDogX2VtYmVyVmlld3NTeXN0
ZW1KcXVlcnkuZGVmYXVsdChlbGVtKTsKKyAgICB9LAorCisgICAgZ2V0RWxlbWVudDogZnVuY3Rp
b24gKHZpZXcpIHsKKyAgICAgIHZhciBwYXJlbnQgPSBfZW1iZXJNZXRhbFByb3BlcnR5X2dldC5n
ZXQodmlldywgJ3BhcmVudFZpZXcnKTsKKyAgICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgcGFy
ZW50ID0gX2VtYmVyTWV0YWxQcm9wZXJ0eV9nZXQuZ2V0KHBhcmVudCwgJ2VsZW1lbnQnKTsKKyAg
ICAgIH0KKyAgICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHZpZXcuZmluZEVsZW1l
bnRJblBhcmVudEVsZW1lbnQocGFyZW50KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZW1iZXJW
aWV3c1N5c3RlbUpxdWVyeS5kZWZhdWx0KCcjJyArIF9lbWJlck1ldGFsUHJvcGVydHlfZ2V0Lmdl
dCh2aWV3LCAnZWxlbWVudElkJykpWzBdOworICAgIH0sCisKKyAgICAvLyBvbmNlIHRoZSB2aWV3
IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSwgcmVyZW5kZXJpbmcgaXMKKyAgICAvLyBk
ZWZlcnJlZCB0byBhbGxvdyBiaW5kaW5ncyB0byBzeW5jaHJvbml6ZS4KKyAgICByZXJlbmRlcjog
ZnVuY3Rpb24gKHZpZXcpIHsKKyAgICAgIHZpZXcucmVuZGVyZXIuZW5zdXJlVmlld05vdFJlbmRl
cmluZyh2aWV3KTsKKyAgICAgIHZpZXcucmVuZGVyZXIucmVyZW5kZXIodmlldyk7CisgICAgfSwK
KworICAgIGNsZWFudXA6IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3Ll9jdXJyZW50U3Rh
dGUuZGVzdHJveUVsZW1lbnQodmlldyk7CisgICAgfSwKKworICAgIC8vIG9uY2UgdGhlIHZpZXcg
aXMgYWxyZWFkeSBpbiB0aGUgRE9NLCBkZXN0cm95aW5nIGl0IHJlbW92ZXMgaXQKKyAgICAvLyBm
cm9tIHRoZSBET00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8gdGhl
CisgICAgLy8gcHJlUmVuZGVyIHN0YXRlIGlmIGluRE9NLgorCisgICAgZGVzdHJveUVsZW1lbnQ6
IGZ1bmN0aW9uICh2aWV3KSB7CisgICAgICB2aWV3LnJlbmRlcmVyLnJlbW92ZSh2aWV3LCBmYWxz
ZSk7CisgICAgICByZXR1cm4gdmlldzsKKyAgICB9LAorCisgICAgLy8gSGFuZGxlIGV2ZW50cyBm
cm9tIGBFbWJlci5FdmVudERpc3BhdGNoZXJgCisgICAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uICh2
aWV3LCBldmVudE5hbWUsIGV2ZW50KSB7CisgICAgICBpZiAodmlldy5oYXMoZXZlbnROYW1lKSkg
eworICAgICAgICAvLyBIYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIHJlLWRpc3BhdGNoIGV2ZW50
cywgc28gd2UgZG9uJ3QKKyAgICAgICAgLy8gcHJldmVudERlZmF1bHQgb3Igc3RvcFByb3BhZ2F0
aW9uLgorICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxJbnN0cnVtZW50YXRpb24uZmxhZ2dlZElu
c3RydW1lbnQoJ2ludGVyYWN0aW9uLicgKyBldmVudE5hbWUsIHsgZXZlbnQ6IGV2ZW50LCB2aWV3
OiB2aWV3IH0sIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICByZXR1cm4gX2VtYmVyTWV0YWxSdW5f
bG9vcC5kZWZhdWx0LmpvaW4odmlldywgdmlldy50cmlnZ2VyLCBldmVudE5hbWUsIGV2ZW50KTsK
KyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY29u
dGludWUgZXZlbnQgcHJvcGFnYXRpb24KKyAgICAgIH0KKyAgICB9LAorCisgICAgaW52b2tlT2Jz
ZXJ2ZXI6IGZ1bmN0aW9uICh0YXJnZXQsIG9ic2VydmVyKSB7CisgICAgICBvYnNlcnZlci5jYWxs
KHRhcmdldCk7CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBoYXNFbGVtZW50
OworfSk7CisKKy8qKgorQG1vZHVsZSBlbWJlcgorQHN1Ym1vZHVsZSBlbWJlci12aWV3cworKi8K
K2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2luX2RvbScsIFsnZXhwb3J0cycsICdl
bWJlci1tZXRhbC9kZWJ1ZycsICdlbWJlci1tZXRhbC9hc3NpZ24nLCAnZW1iZXItbWV0YWwvZXJy
b3InLCAnZW1iZXItbWV0YWwvb2JzZXJ2ZXInLCAnZW1iZXItdmlld3Mvdmlld3Mvc3RhdGVzL2hh
c19lbGVtZW50J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJNZXRhbERlYnVnLCBfZW1iZXJN
ZXRhbEFzc2lnbiwgX2VtYmVyTWV0YWxFcnJvciwgX2VtYmVyTWV0YWxPYnNlcnZlciwgX2VtYmVy
Vmlld3NWaWV3c1N0YXRlc0hhc19lbGVtZW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioK
KyAgQG1vZHVsZSBlbWJlcgorICBAc3VibW9kdWxlIGVtYmVyLXZpZXdzCisgICovCisKKyAgdmFy
IGluRE9NID0gT2JqZWN0LmNyZWF0ZShfZW1iZXJWaWV3c1ZpZXdzU3RhdGVzSGFzX2VsZW1lbnQu
ZGVmYXVsdCk7CisKKyAgX2VtYmVyTWV0YWxBc3NpZ24uZGVmYXVsdChpbkRPTSwgeworICAgIGVu
dGVyOiBmdW5jdGlvbiAodmlldykgeworICAgICAgLy8gUmVnaXN0ZXIgdGhlIHZpZXcgZm9yIGV2
ZW50IGhhbmRsaW5nLiBUaGlzIGhhc2ggaXMgdXNlZCBieQorICAgICAgLy8gRW1iZXIuRXZlbnRE
aXNwYXRjaGVyIHRvIGRpc3BhdGNoIGluY29taW5nIGV2ZW50cy4KKyAgICAgIGlmICh2aWV3LnRh
Z05hbWUgIT09ICcnKSB7CisgICAgICAgIHZpZXcuX3JlZ2lzdGVyKCk7CisgICAgICB9CisKKyAg
ICAgIF9lbWJlck1ldGFsRGVidWcucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAgICAgIF9l
bWJlck1ldGFsT2JzZXJ2ZXIuX2FkZEJlZm9yZU9ic2VydmVyKHZpZXcsICdlbGVtZW50SWQnLCBm
dW5jdGlvbiAoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IF9lbWJlck1ldGFsRXJyb3IuZGVmYXVs
dCgnQ2hhbmdpbmcgYSB2aWV3XCdzIGVsZW1lbnRJZCBhZnRlciBjcmVhdGlvbiBpcyBub3QgYWxs
b3dlZCcpOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBleGl0OiBmdW5j
dGlvbiAodmlldykgeworICAgICAgdmlldy5fdW5yZWdpc3RlcigpOworICAgIH0KKyAgfSk7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gaW5ET007Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmll
d3Mvc3RhdGVzL3ByZV9yZW5kZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXItdmlld3Mvdmlld3Mvc3Rh
dGVzL2RlZmF1bHQnLCAnZW1iZXItbWV0YWwvYXNzaWduJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBf
ZW1iZXJWaWV3c1ZpZXdzU3RhdGVzRGVmYXVsdCwgX2VtYmVyTWV0YWxBc3NpZ24pIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVyCisgIEBzdWJtb2R1bGUgZW1iZXIt
dmlld3MKKyAgKi8KKworICB2YXIgcHJlUmVuZGVyID0gT2JqZWN0LmNyZWF0ZShfZW1iZXJWaWV3
c1ZpZXdzU3RhdGVzRGVmYXVsdC5kZWZhdWx0KTsKKworICBfZW1iZXJNZXRhbEFzc2lnbi5kZWZh
dWx0KHByZVJlbmRlciwgeworICAgIGxlZ2FjeVByb3BlcnR5RGlkQ2hhbmdlOiBmdW5jdGlvbiAo
dmlldywga2V5KSB7fQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBwcmVSZW5kZXI7Cit9
KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3MvdGV4dF9hcmVhJywgWydleHBvcnRzJywgJ2Vt
YmVyLXZpZXdzL2NvbXBvbmVudHMvY29tcG9uZW50JywgJ2VtYmVyLXZpZXdzL21peGlucy90ZXh0
X3N1cHBvcnQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlclZpZXdzQ29tcG9uZW50c0NvbXBv
bmVudCwgX2VtYmVyVmlld3NNaXhpbnNUZXh0X3N1cHBvcnQpIHsKKyAgLyoqCisgIEBtb2R1bGUg
ZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAndXNlIHN0cmljdCc7CisK
KyAgLyoqCisgICAgVGhlIGludGVybmFsIGNsYXNzIHVzZWQgdG8gY3JlYXRlIHRleHRhcmVhIGVs
ZW1lbnQgd2hlbiB0aGUgYHt7dGV4dGFyZWF9fWAKKyAgICBoZWxwZXIgaXMgdXNlZC4KKyAgCisg
ICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVycy50ZXh0YXJlYV0oL2FwaS9jbGFzc2VzL0Vt
YmVyLlRlbXBsYXRlcy5oZWxwZXJzLmh0bWwjbWV0aG9kX3RleHRhcmVhKSAgZm9yIHVzYWdlIGRl
dGFpbHMuCisgIAorICAgICMjIExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCisgIAor
ICAgIEJlY2F1c2UgSFRNTCBgdGV4dGFyZWFgIGVsZW1lbnRzIGRvIG5vdCBjb250YWluIGlubmVy
IEhUTUwgdGhlIGBsYXlvdXRgIGFuZAorICAgIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdpbGwg
bm90IGJlIGFwcGxpZWQuIFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcu
aHRtbCkncworICAgIGxheW91dCBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAKKyAg
ICBAY2xhc3MgVGV4dEFyZWEKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1i
ZXIuQ29tcG9uZW50CisgICAgQHVzZXMgRW1iZXIuVGV4dFN1cHBvcnQKKyAgICBAcHVibGljCisg
ICovCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9lbWJlclZpZXdzQ29tcG9uZW50c0NvbXBvbmVudC5k
ZWZhdWx0LmV4dGVuZChfZW1iZXJWaWV3c01peGluc1RleHRfc3VwcG9ydC5kZWZhdWx0LCB7Cisg
ICAgaW5zdHJ1bWVudERpc3BsYXk6ICd7e3RleHRhcmVhfX0nLAorCisgICAgY2xhc3NOYW1lczog
WydlbWJlci10ZXh0LWFyZWEnXSwKKworICAgIHRhZ05hbWU6ICd0ZXh0YXJlYScsCisgICAgYXR0
cmlidXRlQmluZGluZ3M6IFsncm93cycsICdjb2xzJywgJ25hbWUnLCAnc2VsZWN0aW9uRW5kJywg
J3NlbGVjdGlvblN0YXJ0JywgJ3dyYXAnLCAnbGFuZycsICdkaXInLCAndmFsdWUnXSwKKyAgICBy
b3dzOiBudWxsLAorICAgIGNvbHM6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmll
d3Mvdmlld3MvdGV4dF9maWVsZCcsIFsnZXhwb3J0cycsICdlbWJlci1tZXRhbC9jb21wdXRlZCcs
ICdlbWJlci1tZXRhbC9lbnZpcm9ubWVudCcsICdlbWJlci12aWV3cy9jb21wb25lbnRzL2NvbXBv
bmVudCcsICdlbWJlci12aWV3cy9taXhpbnMvdGV4dF9zdXBwb3J0JywgJ2VtYmVyLW1ldGFsL2Vt
cHR5X29iamVjdCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyTWV0YWxDb21wdXRlZCwgX2Vt
YmVyTWV0YWxFbnZpcm9ubWVudCwgX2VtYmVyVmlld3NDb21wb25lbnRzQ29tcG9uZW50LCBfZW1i
ZXJWaWV3c01peGluc1RleHRfc3VwcG9ydCwgX2VtYmVyTWV0YWxFbXB0eV9vYmplY3QpIHsKKyAg
LyoqCisgIEBtb2R1bGUgZW1iZXIKKyAgQHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIGlucHV0VHlwZVRlc3RFbGVtZW50OworICB2YXIgaW5wdXRU
eXBlcyA9IG5ldyBfZW1iZXJNZXRhbEVtcHR5X29iamVjdC5kZWZhdWx0KCk7CisgIGZ1bmN0aW9u
IGNhblNldFR5cGVPZklucHV0KHR5cGUpIHsKKyAgICBpZiAodHlwZSBpbiBpbnB1dFR5cGVzKSB7
CisgICAgICByZXR1cm4gaW5wdXRUeXBlc1t0eXBlXTsKKyAgICB9CisKKyAgICAvLyBpZiBydW5u
aW5nIGluIG91dHNpZGUgb2YgYSBicm93c2VyIGFsd2F5cyByZXR1cm4gdGhlCisgICAgLy8gb3Jp
Z2luYWwgdHlwZQorICAgIGlmICghX2VtYmVyTWV0YWxFbnZpcm9ubWVudC5kZWZhdWx0Lmhhc0RP
TSkgeworICAgICAgaW5wdXRUeXBlc1t0eXBlXSA9IHR5cGU7CisKKyAgICAgIHJldHVybiB0eXBl
OworICAgIH0KKworICAgIGlmICghaW5wdXRUeXBlVGVzdEVsZW1lbnQpIHsKKyAgICAgIGlucHV0
VHlwZVRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKKyAgICB9
CisKKyAgICB0cnkgeworICAgICAgaW5wdXRUeXBlVGVzdEVsZW1lbnQudHlwZSA9IHR5cGU7Cisg
ICAgfSBjYXRjaCAoZSkge30KKworICAgIHJldHVybiBpbnB1dFR5cGVzW3R5cGVdID0gaW5wdXRU
eXBlVGVzdEVsZW1lbnQudHlwZSA9PT0gdHlwZTsKKyAgfQorCisgIC8qKgorICAKKyAgICBUaGUg
aW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5w
dXR9fWAKKyAgICBoZWxwZXIgaXMgdXNlZCB3aXRoIGB0eXBlYCBvZiBgdGV4dGAuCisgIAorICAg
IFNlZSBbRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaW5wdXRdKC9hcGkvY2xhc3Nlcy9FbWJlci5U
ZW1wbGF0ZXMuaGVscGVycy5odG1sI21ldGhvZF9pbnB1dCkgIGZvciB1c2FnZSBkZXRhaWxzLgor
ICAKKyAgICAjIyBMYXlvdXQgYW5kIExheW91dE5hbWUgcHJvcGVydGllcworICAKKyAgICBCZWNh
dXNlIEhUTUwgYGlucHV0YCBlbGVtZW50cyBhcmUgc2VsZiBjbG9zaW5nIGBsYXlvdXRgIGFuZCBg
bGF5b3V0TmFtZWAKKyAgICBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1i
ZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncworICAgIGxheW91dCBzZWN0
aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAKKyAgICBAY2xhc3MgVGV4dEZpZWxkCisgICAg
QG5hbWVzcGFjZSBFbWJlcgorICAgIEBleHRlbmRzIEVtYmVyLkNvbXBvbmVudAorICAgIEB1c2Vz
IEVtYmVyLlRleHRTdXBwb3J0CisgICAgQHB1YmxpYworICAqLworICBleHBvcnRzLmRlZmF1bHQg
PSBfZW1iZXJWaWV3c0NvbXBvbmVudHNDb21wb25lbnQuZGVmYXVsdC5leHRlbmQoX2VtYmVyVmll
d3NNaXhpbnNUZXh0X3N1cHBvcnQuZGVmYXVsdCwgeworICAgIGluc3RydW1lbnREaXNwbGF5OiAn
e3tpbnB1dCB0eXBlPSJ0ZXh0In19JywKKworICAgIGNsYXNzTmFtZXM6IFsnZW1iZXItdGV4dC1m
aWVsZCddLAorICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgYXR0cmlidXRlQmluZGluZ3M6IFsn
YWNjZXB0JywgJ2F1dG9jb21wbGV0ZScsICdhdXRvc2F2ZScsICdkaXInLCAnZm9ybWFjdGlvbics
ICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJn
ZXQnLCAnaGVpZ2h0JywgJ2lucHV0bW9kZScsICdsYW5nJywgJ2xpc3QnLCAnbWF4JywgJ21pbics
ICdtdWx0aXBsZScsICduYW1lJywgJ3BhdHRlcm4nLCAnc2l6ZScsICdzdGVwJywgJ3R5cGUnLCAn
dmFsdWUnLCAnd2lkdGgnXSwKKworICAgIGRlZmF1bHRMYXlvdXQ6IG51bGwsCisKKyAgICAvKioK
KyAgICAgIFRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4gQXMgdGhl
IHVzZXIgaW5wdXRzIHRleHQsIHRoaXMKKyAgICAgIHByb3BlcnR5IGlzIHVwZGF0ZWQgbGl2ZS4K
KyAgICAgICBAcHJvcGVydHkgdmFsdWUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1
bHQgIiIKKyAgICAgIEBwdWJsaWMKKyAgICAqLworICAgIHZhbHVlOiAnJywKKworICAgIC8qKgor
ICAgICAgVGhlIGB0eXBlYCBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCisgICAgICAg
QHByb3BlcnR5IHR5cGUKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1bHQgInRleHQi
CisgICAgICBAcHVibGljCisgICAgKi8KKyAgICB0eXBlOiBfZW1iZXJNZXRhbENvbXB1dGVkLmNv
bXB1dGVkKHsKKyAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICByZXR1cm4gJ3RleHQn
OworICAgICAgfSwKKworICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeworICAgICAg
ICB2YXIgdHlwZSA9ICd0ZXh0JzsKKworICAgICAgICBpZiAoY2FuU2V0VHlwZU9mSW5wdXQodmFs
dWUpKSB7CisgICAgICAgICAgdHlwZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0
dXJuIHR5cGU7CisgICAgICB9CisgICAgfSksCisKKyAgICAvKioKKyAgICAgIFRoZSBgc2l6ZWAg
b2YgdGhlIHRleHQgZmllbGQgaW4gY2hhcmFjdGVycy4KKyAgICAgICBAcHJvcGVydHkgc2l6ZQor
ICAgICAgQHR5cGUgU3RyaW5nCisgICAgICBAZGVmYXVsdCBudWxsCisgICAgICBAcHVibGljCisg
ICAgKi8KKyAgICBzaXplOiBudWxsLAorCisgICAgLyoqCisgICAgICBUaGUgYHBhdHRlcm5gIGF0
dHJpYnV0ZSBvZiBpbnB1dCBlbGVtZW50LgorICAgICAgIEBwcm9wZXJ0eSBwYXR0ZXJuCisgICAg
ICBAdHlwZSBTdHJpbmcKKyAgICAgIEBkZWZhdWx0IG51bGwKKyAgICAgIEBwdWJsaWMKKyAgICAq
LworICAgIHBhdHRlcm46IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBgbWluYCBhdHRyaWJ1
dGUgb2YgaW5wdXQgZWxlbWVudCB1c2VkIHdpdGggYHR5cGU9Im51bWJlciJgIG9yIGB0eXBlPSJy
YW5nZSJgLgorICAgICAgIEBwcm9wZXJ0eSBtaW4KKyAgICAgIEB0eXBlIFN0cmluZworICAgICAg
QGRlZmF1bHQgbnVsbAorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgKi8K
KyAgICBtaW46IG51bGwsCisKKyAgICAvKioKKyAgICAgIFRoZSBgbWF4YCBhdHRyaWJ1dGUgb2Yg
aW5wdXQgZWxlbWVudCB1c2VkIHdpdGggYHR5cGU9Im51bWJlciJgIG9yIGB0eXBlPSJyYW5nZSJg
LgorICAgICAgIEBwcm9wZXJ0eSBtYXgKKyAgICAgIEB0eXBlIFN0cmluZworICAgICAgQGRlZmF1
bHQgbnVsbAorICAgICAgQHNpbmNlIDEuNC4wCisgICAgICBAcHVibGljCisgICAgKi8KKyAgICBt
YXg6IG51bGwKKyAgfSk7Cit9KTsKK2VuaWZlZCgnZW1iZXItdmlld3Mvdmlld3MvdmlldycsIFsn
ZXhwb3J0cycsICdlbWJlci12aWV3cy9zeXN0ZW0vZXh0JywgJ2VtYmVyLXZpZXdzL3ZpZXdzL2Nv
cmVfdmlldycsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19jb250ZXh0X3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL3ZpZXdfY2hpbGRfdmlld3Nfc3VwcG9ydCcsICdlbWJlci12aWV3cy9t
aXhpbnMvbGVnYWN5X2NoaWxkX3ZpZXdzX3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5zL3Zp
ZXdfc3RhdGVfc3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvdGVtcGxhdGVfcmVuZGVyaW5n
X3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5zL2NsYXNzX25hbWVzX3N1cHBvcnQnLCAnZW1i
ZXItdmlld3MvbWl4aW5zL2xlZ2FjeV92aWV3X3N1cHBvcnQnLCAnZW1iZXItdmlld3MvbWl4aW5z
L2luc3RydW1lbnRhdGlvbl9zdXBwb3J0JywgJ2VtYmVyLXZpZXdzL21peGlucy9hcmlhX3JvbGVf
c3VwcG9ydCcsICdlbWJlci12aWV3cy9taXhpbnMvdmlzaWJpbGl0eV9zdXBwb3J0JywgJ2VtYmVy
LXZpZXdzL2NvbXBhdC9hdHRycy1wcm94eScsICdlbWJlci12aWV3cy9taXhpbnMvdmlld19zdXBw
b3J0J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJWaWV3c1N5c3RlbUV4dCwgX2VtYmVyVmll
d3NWaWV3c0NvcmVfdmlldywgX2VtYmVyVmlld3NNaXhpbnNWaWV3X2NvbnRleHRfc3VwcG9ydCwg
X2VtYmVyVmlld3NNaXhpbnNWaWV3X2NoaWxkX3ZpZXdzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4
aW5zTGVnYWN5X2NoaWxkX3ZpZXdzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zVmlld19zdGF0
ZV9zdXBwb3J0LCBfZW1iZXJWaWV3c01peGluc1RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0LCBf
ZW1iZXJWaWV3c01peGluc0NsYXNzX25hbWVzX3N1cHBvcnQsIF9lbWJlclZpZXdzTWl4aW5zTGVn
YWN5X3ZpZXdfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNJbnN0cnVtZW50YXRpb25fc3VwcG9y
dCwgX2VtYmVyVmlld3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydCwgX2VtYmVyVmlld3NNaXhpbnNW
aXNpYmlsaXR5X3N1cHBvcnQsIF9lbWJlclZpZXdzQ29tcGF0QXR0cnNQcm94eSwgX2VtYmVyVmll
d3NNaXhpbnNWaWV3X3N1cHBvcnQpIHsKKyAgLy8galF1ZXJ5LCBFbWJlci5sb29rdXAsCisgIC8v
IEVtYmVyLkVOVgorICAndXNlIHN0cmljdCc7CisKKyAgLyoqCisgIEBtb2R1bGUgZW1iZXIKKyAg
QHN1Ym1vZHVsZSBlbWJlci12aWV3cworICAqLworCisgIC8qKgorICAgIGBFbWJlci5WaWV3YCBp
cyB0aGUgY2xhc3MgaW4gRW1iZXIgcmVzcG9uc2libGUgZm9yIGVuY2Fwc3VsYXRpbmcgdGVtcGxh
dGVzIG9mCisgICAgSFRNTCBjb250ZW50LCBjb21iaW5pbmcgdGVtcGxhdGVzIHdpdGggZGF0YSB0
byByZW5kZXIgYXMgc2VjdGlvbnMgb2YgYSBwYWdlJ3MKKyAgICBET00sIGFuZCByZWdpc3Rlcmlu
ZyBhbmQgcmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBldmVudHMuCisgIAorICAgICMjIEhU
TUwgVGFnCisgIAorICAgIFRoZSBkZWZhdWx0IEhUTUwgdGFnIG5hbWUgdXNlZCBmb3IgYSB2aWV3
J3MgRE9NIHJlcHJlc2VudGF0aW9uIGlzIGBkaXZgLiBUaGlzCisgICAgY2FuIGJlIGN1c3RvbWl6
ZWQgYnkgc2V0dGluZyB0aGUgYHRhZ05hbWVgIHByb3BlcnR5LiBUaGUgZm9sbG93aW5nIHZpZXcK
KyAgICBjbGFzczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFBhcmFncmFwaFZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAnZW0nCisgICAgfSk7CisgICAgYGBg
CisgIAorICAgIFdvdWxkIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCB0aGUgZm9sbG93aW5nIEhU
TUw6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZW0gaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZp
ZXciPjwvZW0+CisgICAgYGBgCisgIAorICAgICMjIEhUTUwgYGNsYXNzYCBBdHRyaWJ1dGUKKyAg
CisgICAgVGhlIEhUTUwgYGNsYXNzYCBhdHRyaWJ1dGUgb2YgYSB2aWV3J3MgdGFnIGNhbiBiZSBz
ZXQgYnkgcHJvdmlkaW5nIGEKKyAgICBgY2xhc3NOYW1lc2AgcHJvcGVydHkgdGhhdCBpcyBzZXQg
dG8gYW4gYXJyYXkgb2Ygc3RyaW5nczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15Vmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAn
bXktb3RoZXItY2xhc3MnXQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAg
IGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IG15LWNsYXNz
IG15LW90aGVyLWNsYXNzIj48L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgYGNsYXNzYCBhdHRyaWJ1
dGUgdmFsdWVzIGNhbiBhbHNvIGJlIHNldCBieSBwcm92aWRpbmcgYSBgY2xhc3NOYW1lQmluZGlu
Z3NgCisgICAgcHJvcGVydHkgc2V0IHRvIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMgZm9y
IHRoZSB2aWV3LiBUaGUgcmV0dXJuIHZhbHVlCisgICAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxs
IGJlIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHZhbHVlIGZvciB0aGUgdmlldydzIGBjbGFzc2AKKyAg
ICBhdHRyaWJ1dGUuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGNvbXB1dGVkIHByb3BlcnRpZXM6
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydwcm9wZXJ0eUEnLCAncHJvcGVydHlCJ10sCisg
ICAgICBwcm9wZXJ0eUE6ICdmcm9tLWEnLAorICAgICAgcHJvcGVydHlCOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKHNvbWVMb2dpYykgeyByZXR1cm4gJ2Zyb20tYic7
IH0KKyAgICAgIH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZp
ZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBg
aHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZnJvbS1hIGZyb20t
YiI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIElmIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUg
YmluZGluZyByZXR1cm5zIGEgYm9vbGVhbiB0aGUgcHJvcGVydHkgbmFtZQorICAgIGl0c2VsZiB3
aWxsIGJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIFRo
ZSBjbGFzcyBuYW1lCisgICAgd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlIHZhbHVlIGlzIGBmYWxz
ZWAgb3IgYHVuZGVmaW5lZGAuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydob3ZlcmVkJ10s
CisgICAgICBob3ZlcmVkOiB0cnVlCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAg
CisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgaG92
ZXJlZCI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIFdoZW4gdXNpbmcgYm9vbGVhbiBjbGFzcyBu
YW1lIGJpbmRpbmdzIHlvdSBjYW4gc3VwcGx5IGEgc3RyaW5nIHZhbHVlIG90aGVyCisgICAgdGhh
biB0aGUgcHJvcGVydHkgbmFtZSBmb3IgdXNlIGFzIHRoZSBgY2xhc3NgIEhUTUwgYXR0cmlidXRl
IGJ5IGFwcGVuZGluZyB0aGUKKyAgICBwcmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIgY2hhcmFj
dGVyIHdoZW4gZGVmaW5pbmcgdGhlIGJpbmRpbmc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAg
ICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczog
Wydhd2Vzb21lOnNvLXZlcnktY29vbCddLAorICAgICAgYXdlc29tZTogdHJ1ZQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhU
TUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJl
cjEiIGNsYXNzPSJlbWJlci12aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+CisgICAgYGBgCisgIAor
ICAgIEJvb2xlYW4gdmFsdWUgY2xhc3MgbmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBuYW1l
cyBhcmUgaW4gYQorICAgIGNhbWVsQ2FzZS1zdHlsZSBmb3JtYXQgd2lsbCBiZSBjb252ZXJ0ZWQg
dG8gYSBkYXNoZXJpemVkIGZvcm1hdDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15Vmll
dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJn
ZW50J10sCisgICAgICBpc1VyZ2VudDogdHJ1ZQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBX
aWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24g
b2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12
aWV3IGlzLXVyZ2VudCI+PC9kaXY+CisgICAgYGBgCisgIAorICAgIENsYXNzIG5hbWUgYmluZGlu
Z3MgY2FuIGFsc28gcmVmZXIgdG8gb2JqZWN0IHZhbHVlcyB0aGF0IGFyZSBmb3VuZCBieQorICAg
IHRyYXZlcnNpbmcgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB2aWV3IGl0c2VsZjoKKyAgCisgICAg
YGBgamF2YXNjcmlwdAorICAgIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGNs
YXNzTmFtZUJpbmRpbmdzOiBbJ21lc3NhZ2VzLmVtcHR5J10KKyAgICAgIG1lc3NhZ2VzOiBFbWJl
ci5PYmplY3QuY3JlYXRlKHsKKyAgICAgICAgZW1wdHk6IHRydWUKKyAgICAgIH0pCisgICAgfSk7
CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVt
YmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZW1wdHkiPjwvZGl2PgorICAgIGBgYAorICAKKyAgICBJ
ZiB5b3Ugd2FudCB0byBhZGQgYSBjbGFzcyBuYW1lIGZvciBhIHByb3BlcnR5IHdoaWNoIGV2YWx1
YXRlcyB0byB0cnVlIGFuZAorICAgIGFuZCBhIGRpZmZlcmVudCBjbGFzcyBuYW1lIGlmIGl0IGV2
YWx1YXRlcyB0byBmYWxzZSwgeW91IGNhbiBwYXNzIGEgYmluZGluZworICAgIGxpa2UgdGhpczoK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIC8vIEFwcGxpZXMgJ2VuYWJsZWQnIGNsYXNzIHdo
ZW4gaXNFbmFibGVkIGlzIHRydWUgYW5kICdkaXNhYmxlZCcgd2hlbiBpc0VuYWJsZWQgaXMgZmFs
c2UKKyAgICBFbWJlci5WaWV3LmV4dGVuZCh7CisgICAgICBjbGFzc05hbWVCaW5kaW5nczogWydp
c0VuYWJsZWQ6ZW5hYmxlZDpkaXNhYmxlZCddCisgICAgICBpc0VuYWJsZWQ6IHRydWUKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAgPGRpdiBpZD0i
ZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBlbmFibGVkIj48L2Rpdj4KKyAgICBgYGAKKyAgCisg
ICAgV2hlbiBpc0VuYWJsZWQgaXMgYGZhbHNlYCwgdGhlIHJlc3VsdGluZyBIVE1MIHJlcHJlc2Vu
dGF0aW9uIGxvb2tzIGxpa2UKKyAgICB0aGlzOgorICAKKyAgICBgYGBodG1sCisgICAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+CisgICAgYGBgCisg
IAorICAgIFRoaXMgc3ludGF4IG9mZmVycyB0aGUgY29udmVuaWVuY2UgdG8gYWRkIGEgY2xhc3Mg
aWYgYSBwcm9wZXJ0eSBpcyBgZmFsc2VgOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgLy8g
QXBwbGllcyBubyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBpcyB0cnVlIGFuZCBjbGFzcyAnZGlzYWJs
ZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCisgICAgRW1iZXIuVmlldy5leHRlbmQoeworICAg
ICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNFbmFibGVkOjpkaXNhYmxlZCddCisgICAgICBpc0Vu
YWJsZWQ6IHRydWUKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBo
dG1sCisgICAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+PC9kaXY+CisgICAg
YGBgCisgIAorICAgIFdoZW4gdGhlIGBpc0VuYWJsZWRgIHByb3BlcnR5IG9uIHRoZSB2aWV3IGlz
IHNldCB0byBgZmFsc2VgLCBpdCB3aWxsIHJlc3VsdAorICAgIGluIHZpZXcgaW5zdGFuY2VzIHdp
dGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZGlzYWJsZWQiPjwvZGl2PgorICAgIGBgYAor
ICAKKyAgICBVcGRhdGVzIHRvIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUgYmluZGluZyB3aWxs
IHJlc3VsdCBpbiBhdXRvbWF0aWMKKyAgICB1cGRhdGUgb2YgdGhlICBIVE1MIGBjbGFzc2AgYXR0
cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTAorICAgIHJlcHJlc2VudGF0aW9uLiBJ
ZiB0aGUgdmFsdWUgYmVjb21lcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgIHRoZSBjbGFzcyBuYW1l
CisgICAgd2lsbCBiZSByZW1vdmVkLgorICAKKyAgICBCb3RoIGBjbGFzc05hbWVzYCBhbmQgYGNs
YXNzTmFtZUJpbmRpbmdzYCBhcmUgY29uY2F0ZW5hdGVkIHByb3BlcnRpZXMuIFNlZQorICAgIFtF
bWJlci5PYmplY3RdKC9hcGkvY2xhc3Nlcy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRhdGlv
biBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVz
LgorICAKKyAgICAjIyBIVE1MIEF0dHJpYnV0ZXMKKyAgCisgICAgVGhlIEhUTUwgYXR0cmlidXRl
IHNlY3Rpb24gb2YgYSB2aWV3J3MgdGFnIGNhbiBiZSBzZXQgYnkgcHJvdmlkaW5nIGFuCisgICAg
YGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8gYW4gYXJyYXkgb2YgcHJvcGVydHkg
bmFtZXMgb24gdGhlIHZpZXcuCisgICAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0
aWVzIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHZpZXcncworICAgIEhUTUwgYXNz
b2NpYXRlZCBhdHRyaWJ1dGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBbmNob3JWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2EnLAorICAgICAgYXR0cmli
dXRlQmluZGluZ3M6IFsnaHJlZiddLAorICAgICAgaHJlZjogJ2h0dHA6Ly9nb29nbGUuY29tJwor
ICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3
aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8YSBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20iPjwv
YT4KKyAgICBgYGAKKyAgCisgICAgT25lIHByb3BlcnR5IGNhbiBiZSBtYXBwZWQgb24gdG8gYW5v
dGhlciBieSBwbGFjaW5nIGEgIjoiIGJldHdlZW4KKyAgICB0aGUgc291cmNlIHByb3BlcnR5IGFu
ZCB0aGUgZGVzdGluYXRpb24gcHJvcGVydHk6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBB
bmNob3JWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2EnLAorICAg
ICAgYXR0cmlidXRlQmluZGluZ3M6IFsndXJsOmhyZWYnXSwKKyAgICAgIHVybDogJ2h0dHA6Ly9n
b29nbGUuY29tJworICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiB2aWV3
IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0
bWwKKyAgICA8YSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dv
b2dsZS5jb20iPjwvYT4KKyAgICBgYGAKKyAgCisgICAgTmFtZXNwYWNlZCBhdHRyaWJ1dGVzIChl
LmcuIGB4bGluazpocmVmYCkgYXJlIHN1cHBvcnRlZCwgYnV0IGhhdmUgdG8gYmUKKyAgICBtYXBw
ZWQsIHNpbmNlIGA6YCBpcyBub3QgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yIHByb3BlcnRpZXMgaW4g
SmF2YXNjcmlwdDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFVzZVZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAndXNlJywKKyAgICAgIGF0dHJpYnV0ZUJpbmRp
bmdzOiBbJ3hsaW5rSHJlZjp4bGluazpocmVmJ10sCisgICAgICB4bGlua0hyZWY6ICcjdHJpYW5n
bGUnCisgICAgfSk7CisgICAgYGBgCisgICAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMg
d2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAgPHVz
ZSB4bGluazpocmVmPSIjdHJpYW5nbGUiPjwvdXNlPgorICAgIGBgYAorICAKKyAgICBJZiB0aGUg
cmV0dXJuIHZhbHVlIG9mIGFuIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9uaXRvcmVkIHByb3BlcnR5
IGlzIGEgYm9vbGVhbgorICAgIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEg
Y29lcmNlZCBzdHJpbmc6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBNeVRleHRJbnB1dCA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRhZ05hbWU6ICdpbnB1dCcsCisgICAgICBhdHRy
aWJ1dGVCaW5kaW5nczogWydkaXNhYmxlZCddLAorICAgICAgZGlzYWJsZWQ6IGZhbHNlCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIGEgdmlldyBpbnN0YW5jZSB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAgIGBgYGh0bWwKKyAgICA8aW5wdXQg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciIGRpc2FibGVkPSJmYWxzZSIgLz4KKyAgICBg
YGAKKyAgCisgICAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBjYW4gcmVmZXIgdG8gY29tcHV0ZWQgcHJv
cGVydGllczoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIE15VGV4dElucHV0ID0gRW1iZXIu
Vmlldy5leHRlbmQoeworICAgICAgdGFnTmFtZTogJ2lucHV0JywKKyAgICAgIGF0dHJpYnV0ZUJp
bmRpbmdzOiBbJ2Rpc2FibGVkJ10sCisgICAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oKSB7CisgICAgICAgIGlmIChzb21lTG9naWMpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgIH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFRvIHByZXZlbnQgc2V0dGluZyBh
biBhdHRyaWJ1dGUgYWx0b2dldGhlciwgdXNlIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhcyB0aGUK
KyAgICByZXR1cm4gdmFsdWUgb2YgdGhlIGBhdHRyaWJ1dGVCaW5kaW5nc2AgbW9uaXRvcmVkIHBy
b3BlcnR5OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgTXlUZXh0SW5wdXQgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0YWdOYW1lOiAnZm9ybScsCisgICAgICBhdHRyaWJ1dGVCaW5k
aW5nczogWydub3ZhbGlkYXRlJ10sCisgICAgICBub3ZhbGlkYXRlOiBudWxsCisgICAgfSk7Cisg
ICAgYGBgCisgIAorICAgIFVwZGF0ZXMgdG8gdGhlIHByb3BlcnR5IG9mIGFuIGF0dHJpYnV0ZSBi
aW5kaW5nIHdpbGwgcmVzdWx0IGluIGF1dG9tYXRpYworICAgIHVwZGF0ZSBvZiB0aGUgIEhUTUwg
YXR0cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTCByZXByZXNlbnRhdGlvbi4KKyAg
CisgICAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBpcyBhIGNvbmNhdGVuYXRlZCBwcm9wZXJ0eS4gU2Vl
IFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nlcy9FbWJlci5PYmplY3QuaHRtbCkKKyAgICBkb2N1
bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0
aWVzLgorICAKKyAgICAjIyBUZW1wbGF0ZXMKKyAgCisgICAgVGhlIEhUTUwgY29udGVudHMgb2Yg
YSB2aWV3J3MgcmVuZGVyZWQgcmVwcmVzZW50YXRpb24gYXJlIGRldGVybWluZWQgYnkgaXRzCisg
ICAgdGVtcGxhdGUuIFRlbXBsYXRlcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBh
biBvcHRpb25hbCBjb250ZXh0CisgICAgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9m
IEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIHdpdGhpbiB0aGUKKyAgICB2aWV3J3MgdGFnLiBN
b3N0IHR5cGljYWxseSBpbiBFbWJlciB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBjb21waWxlZAor
ICAgIHRlbXBsYXRlLgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSFRNTEJhcnMuY29tcGlsZSgnSSBh
bSB0aGUgdGVtcGxhdGUnKQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBp
biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CisgIAorICAg
IGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIGFtIHRo
ZSB0ZW1wbGF0ZTwvZGl2PgorICAgIGBgYAorICAKKyAgICBXaXRoaW4gYW4gRW1iZXIgYXBwbGlj
YXRpb24gaXMgbW9yZSBjb21tb24gdG8gZGVmaW5lIGEgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgYXMK
KyAgICBwYXJ0IG9mIGEgcGFnZToKKyAgCisgICAgYGBgaHRtbAorICAgIDxzY3JpcHQgdHlwZT0n
dGV4dC94LWhhbmRsZWJhcnMnIGRhdGEtdGVtcGxhdGUtbmFtZT0nc29tZS10ZW1wbGF0ZSc+Cisg
ICAgICBIZWxsbworICAgIDwvc2NyaXB0PgorICAgIGBgYAorICAKKyAgICBBbmQgYXNzb2NpYXRl
IGl0IGJ5IG5hbWUgdXNpbmcgYSB2aWV3J3MgYHRlbXBsYXRlTmFtZWAgcHJvcGVydHk6CisgIAor
ICAgIGBgYGphdmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAg
IHRlbXBsYXRlTmFtZTogJ3NvbWUtdGVtcGxhdGUnCisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IElmIHlvdSBoYXZlIG5lc3RlZCByb3V0ZXMsIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxs
IGxvb2sgbGlrZSB0aGlzOgorICAKKyAgICBgYGBodG1sCisgICAgPHNjcmlwdCB0eXBlPSd0ZXh0
L3gtaGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdwb3N0cy9uZXcnPgorICAgICAgPGgx
Pk5ldyBQb3N0PC9oMT4KKyAgICA8L3NjcmlwdD4KKyAgICBgYGAKKyAgCisgICAgQW5kIGB0ZW1w
bGF0ZU5hbWVgIHByb3BlcnR5OgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBF
bWJlci5WaWV3LmV4dGVuZCh7CisgICAgICB0ZW1wbGF0ZU5hbWU6ICdwb3N0cy9uZXcnCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIFVzaW5nIGEgdmFsdWUgZm9yIGB0ZW1wbGF0ZU5hbWVgIHRo
YXQgZG9lcyBub3QgaGF2ZSBhIHRlbXBsYXRlCisgICAgd2l0aCBhIG1hdGNoaW5nIGBkYXRhLXRl
bXBsYXRlLW5hbWVgIGF0dHJpYnV0ZSB3aWxsIHRocm93IGFuIGVycm9yLgorICAKKyAgICBGb3Ig
dmlld3MgY2xhc3NlcyB0aGF0IG1heSBoYXZlIGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5n
LiBhcyB0aGUgYmxvY2sKKyAgICBwb3J0aW9uIG9mIGEgYHt7dmlld319YCBoZWxwZXIgY2FsbCBp
biBhbm90aGVyIHRlbXBsYXRlIG9yIGluCisgICAgYSBzdWJjbGFzcyksIHlvdSBjYW4gcHJvdmlk
ZSBhIGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5IHNldCB0byBjb21waWxlZAorICAgIHRlbXBs
YXRlIGZ1bmN0aW9uLiBJZiBhIHRlbXBsYXRlIGlzIG5vdCBsYXRlciBwcm92aWRlZCBmb3IgdGhl
IHZpZXcgaW5zdGFuY2UKKyAgICB0aGUgYGRlZmF1bHRUZW1wbGF0ZWAgdmFsdWUgd2lsbCBiZSB1
c2VkOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVu
ZCh7CisgICAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhUTUxCYXJzLmNvbXBpbGUoJ0kgd2Fz
IHRoZSBkZWZhdWx0JyksCisgICAgICB0ZW1wbGF0ZTogbnVsbCwKKyAgICAgIHRlbXBsYXRlTmFt
ZTogbnVsbAorICAgIH0pOworICAgIGBgYAorICAKKyAgICBXaWxsIHJlc3VsdCBpbiBpbnN0YW5j
ZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgorICAKKyAgICBgYGBodG1sCisgICAg
PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIGRlZmF1bHQ8L2Rp
dj4KKyAgICBgYGAKKyAgCisgICAgSWYgYSBgdGVtcGxhdGVgIG9yIGB0ZW1wbGF0ZU5hbWVgIGlz
IHByb3ZpZGVkIGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyAgICBgZGVmYXVsdFRlbXBs
YXRlYDoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCdJIHdh
cyB0aGUgZGVmYXVsdCcpCisgICAgfSk7CisgIAorICAgIGFWaWV3ID0gQVZpZXcuY3JlYXRlKHsK
KyAgICAgIHRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCdJIHdhcyB0aGUgdGVtcGxh
dGUsIG5vdCBkZWZhdWx0JykKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQg
aW4gdGhlIGZvbGxvd2luZyBIVE1MIHJlcHJlc2VudGF0aW9uIHdoZW4gcmVuZGVyZWQ6CisgIAor
ICAgIGBgYGh0bWwKKyAgICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij5JIHdh
cyB0aGUgdGVtcGxhdGUsIG5vdCBkZWZhdWx0PC9kaXY+CisgICAgYGBgCisgIAorICAgICMjIFZp
ZXcgQ29udGV4dAorICAKKyAgICBUaGUgZGVmYXVsdCBjb250ZXh0IG9mIHRoZSBjb21waWxlZCB0
ZW1wbGF0ZSBpcyB0aGUgdmlldydzIGNvbnRyb2xsZXI6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIHRlbXBsYXRlOiBFbWJlci5I
VE1MQmFycy5jb21waWxlKCdIZWxsbyB7e2V4Y2l0ZWRHcmVldGluZ319JykKKyAgICB9KTsKKyAg
CisgICAgYUNvbnRyb2xsZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKKyAgICAgIGZpcnN0TmFt
ZTogJ0JhcnJ5JywKKyAgICAgIGV4Y2l0ZWRHcmVldGluZzogRW1iZXIuY29tcHV0ZWQoJ2NvbnRl
bnQuZmlyc3ROYW1lJywgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29u
dGVudC5maXJzdE5hbWUnKSArICchISEnOworICAgICAgfSkKKyAgICB9KTsKKyAgCisgICAgYVZp
ZXcgPSBBVmlldy5jcmVhdGUoeworICAgICAgY29udHJvbGxlcjogYUNvbnRyb2xsZXIKKyAgICB9
KTsKKyAgICBgYGAKKyAgCisgICAgV2lsbCByZXN1bHQgaW4gYW4gSFRNTCByZXByZXNlbnRhdGlv
biBvZjoKKyAgCisgICAgYGBgaHRtbAorICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVy
LXZpZXciPkhlbGxvIEJhcnJ5ISEhPC9kaXY+CisgICAgYGBgCisgIAorICAgIEEgY29udGV4dCBj
YW4gYWxzbyBiZSBleHBsaWNpdGx5IHN1cHBsaWVkIHRocm91Z2ggdGhlIHZpZXcncyBgY29udGV4
dGAKKyAgICBwcm9wZXJ0eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5vciBg
Y29udHJvbGxlcmAgcHJvcGVydGllcywgdGhlCisgICAgYHBhcmVudFZpZXdgJ3MgY29udGV4dCB3
aWxsIGJlIHVzZWQuCisgIAorICAgICMjIExheW91dHMKKyAgCisgICAgVmlld3MgY2FuIGhhdmUg
YSBzZWNvbmRhcnkgdGVtcGxhdGUgdGhhdCB3cmFwcyB0aGVpciBtYWluIHRlbXBsYXRlLiBMaWtl
CisgICAgcHJpbWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0
ICBhY2NlcHRzIGFuIG9wdGlvbmFsCisgICAgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMg
YSBzdHJpbmcgb2YgSFRNTCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW5zaWRlCisgICAgdmlldydz
IHRhZy4gVmlld3Mgd2hvc2UgSFRNTCBlbGVtZW50IGlzIHNlbGYgY2xvc2luZyAoZS5nLiBgPGlu
cHV0IC8+YCkKKyAgICBjYW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBwcm9wZXJ0eSB3aWxs
IGJlIGlnbm9yZWQuCisgIAorICAgIE1vc3QgdHlwaWNhbGx5IGluIEVtYmVyIGEgbGF5b3V0IHdp
bGwgYmUgYSBjb21waWxlZCB0ZW1wbGF0ZS4KKyAgCisgICAgQSB2aWV3J3MgbGF5b3V0IGNhbiBi
ZSBzZXQgZGlyZWN0bHkgd2l0aCB0aGUgYGxheW91dGAgcHJvcGVydHkgb3IgcmVmZXJlbmNlCisg
ICAgYW4gZXhpc3RpbmcgdGVtcGxhdGUgYnkgbmFtZSB3aXRoIHRoZSBgbGF5b3V0TmFtZWAgcHJv
cGVydHkuCisgIAorICAgIEEgdGVtcGxhdGUgdXNlZCBhcyBhIGxheW91dCBtdXN0IGNvbnRhaW4g
YSBzaW5nbGUgdXNlIG9mIHRoZQorICAgIGB7e3lpZWxkfX1gIGhlbHBlci4gVGhlIEhUTUwgY29u
dGVudHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQgYHRlbXBsYXRlYCB3aWxsIGJlCisgICAgaW5zZXJ0
ZWQgYXQgdGhpcyBsb2NhdGlvbjoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIEFWaWV3V2l0
aExheW91dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIGxheW91dDogRW1iZXIuSFRNTEJh
cnMuY29tcGlsZSgiPGRpdiBjbGFzcz0nbXktZGVjb3JhdGl2ZS1jbGFzcyc+e3t5aWVsZH19PC9k
aXY+IiksCisgICAgICB0ZW1wbGF0ZTogRW1iZXIuSFRNTEJhcnMuY29tcGlsZSgiSSBnb3Qgd3Jh
cHBlZCIpCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5z
dGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKKyAgCisgICAgYGBgaHRtbAor
ICAgIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgorICAgICAgPGRpdiBjbGFz
cz0ibXktZGVjb3JhdGl2ZS1jbGFzcyI+CisgICAgICAgIEkgZ290IHdyYXBwZWQKKyAgICAgIDwv
ZGl2PgorICAgIDwvZGl2PgorICAgIGBgYAorICAKKyAgICBTZWUgW0VtYmVyLlRlbXBsYXRlcy5o
ZWxwZXJzLnlpZWxkXSgvYXBpL2NsYXNzZXMvRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaHRtbCNt
ZXRob2RfeWllbGQpCisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIAorICAgICMjIFJlc3Bv
bmRpbmcgdG8gQnJvd3NlciBFdmVudHMKKyAgCisgICAgVmlld3MgY2FuIHJlc3BvbmQgdG8gdXNl
ci1pbml0aWF0ZWQgZXZlbnRzIGluIG9uZSBvZiB0aHJlZSB3YXlzOiBtZXRob2QKKyAgICBpbXBs
ZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5hZ2VyLCBhbmQgdGhyb3VnaCBge3thY3Rp
b259fWAgaGVscGVyIHVzZQorICAgIGluIHRoZWlyIHRlbXBsYXRlIG9yIGxheW91dC4KKyAgCisg
ICAgIyMjIE1ldGhvZCBJbXBsZW1lbnRhdGlvbgorICAKKyAgICBWaWV3cyBjYW4gcmVzcG9uZCB0
byB1c2VyLWluaXRpYXRlZCBldmVudHMgYnkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIHRoYXQKKyAg
ICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJl
IHBhc3NlZCBhcyB0aGUKKyAgICBhcmd1bWVudCB0byB0aGlzIG1ldGhvZC4KKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoeworICAgICAgY2xpY2s6
IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaW5z
dGFuY2UncworICAgICAgICAvLyByZW5kZXJlZCBlbGVtZW50IGlzIGNsaWNrZWQKKyAgICAgIH0K
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgIyMjIEV2ZW50IE1hbmFnZXJzCisgIAorICAgIFZp
ZXdzIGNhbiBkZWZpbmUgYW4gb2JqZWN0IGFzIHRoZWlyIGBldmVudE1hbmFnZXJgIHByb3BlcnR5
LiBUaGlzIG9iamVjdCBjYW4KKyAgICB0aGVuIGltcGxlbWVudCBtZXRob2RzIHRoYXQgbWF0Y2gg
dGhlIGRlc2lyZWQgZXZlbnQgbmFtZXMuIE1hdGNoaW5nIGV2ZW50cworICAgIHRoYXQgb2NjdXIg
b24gdGhlIHZpZXcncyByZW5kZXJlZCBIVE1MIG9yIHRoZSByZW5kZXJlZCBIVE1MIG9mIGFueSBv
ZiBpdHMgRE9NCisgICAgZGVzY2VuZGFudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbWV0aG9kLiBBIGBq
UXVlcnkuRXZlbnRgIG9iamVjdCB3aWxsIGJlIHBhc3NlZAorICAgIGFzIHRoZSBmaXJzdCBhcmd1
bWVudCB0byB0aGUgbWV0aG9kIGFuZCBhbiAgYEVtYmVyLlZpZXdgIG9iamVjdCBhcyB0aGUKKyAg
ICBzZWNvbmQuIFRoZSBgRW1iZXIuVmlld2Agd2lsbCBiZSB0aGUgdmlldyB3aG9zZSByZW5kZXJl
ZCBIVE1MIHdhcyBpbnRlcmFjdGVkCisgICAgd2l0aC4gVGhpcyBtYXkgYmUgdGhlIHZpZXcgd2l0
aCB0aGUgYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgb3Igb25lIG9mIGl0cworICAgIGRlc2NlbmRh
bnQgdmlld3MuCisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKKyAgICAgIGV2ZW50TWFuYWdlcjogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CisgICAg
ICAgIGRvdWJsZUNsaWNrOiBmdW5jdGlvbihldmVudCwgdmlldykgeworICAgICAgICAgIC8vIHdp
bGwgYmUgY2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UncworICAgICAgICAgIC8vIHJlbmRlcmVkIGVs
ZW1lbnQgb3IgYW55IHJlbmRlcmluZworICAgICAgICAgIC8vIG9mIHRoaXMgdmlldydzIGRlc2Nl
bmRhbnQKKyAgICAgICAgICAvLyBlbGVtZW50cyBpcyBjbGlja2VkCisgICAgICAgIH0KKyAgICAg
IH0pCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEFuIGV2ZW50IGRlZmluZWQgZm9yIGFuIGV2
ZW50IG1hbmFnZXIgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZW50cyBvZiB0aGUKKyAgICBzYW1l
IG5hbWUgaGFuZGxlZCB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIHZpZXcuCisgIAorICAgIGBgYGph
dmFzY3JpcHQKKyAgICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAgIG1vdXNlRW50
ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgbmV2ZXIgdHJpZ2dlci4KKyAg
ICAgIH0sCisgICAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoeworICAgICAg
ICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCwgdmlldykgeworICAgICAgICAgIC8vIHRha2Vz
IHByZWNlZGVuY2Ugb3ZlciBBVmlldyNtb3VzZUVudGVyCisgICAgICAgIH0KKyAgICAgIH0pCisg
ICAgfSk7CisgICAgYGBgCisgIAorICAgIFNpbWlsYXJseSBhIHZpZXcncyBldmVudCBtYW5hZ2Vy
IHdpbGwgdGFrZSBwcmVjZWRlbmNlIGZvciBldmVudHMgb2YgYW55IHZpZXdzCisgICAgcmVuZGVy
ZWQgYXMgYSBkZXNjZW5kYW50LiBBIG1ldGhvZCBuYW1lIHRoYXQgbWF0Y2hlcyBhbiBldmVudCBu
YW1lIHdpbGwgbm90CisgICAgYmUgY2FsbGVkIGlmIHRoZSB2aWV3IGluc3RhbmNlIHdhcyByZW5k
ZXJlZCBpbnNpZGUgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gb2YKKyAgICBhIHZpZXcgdGhhdCBo
YXMgYW4gYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkgZGVmaW5lZCB0aGF0IGhhbmRsZXMgZXZlbnRz
IG9mIHRoZQorICAgIG5hbWUuIEV2ZW50cyBub3QgaGFuZGxlZCBieSB0aGUgZXZlbnQgbWFuYWdl
ciB3aWxsIHN0aWxsIHRyaWdnZXIgbWV0aG9kIGNhbGxzCisgICAgb24gdGhlIGRlc2NlbmRhbnQu
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgQXBwID0gRW1iZXIuQXBwbGljYXRpb24u
Y3JlYXRlKCk7CisgICAgQXBwLk91dGVyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKKyAgICAg
IHRlbXBsYXRlOiBFbWJlci5IVE1MQmFycy5jb21waWxlKCJvdXRlciB7eyN2aWV3ICdpbm5lcid9
fWlubmVye3svdmlld319IG91dGVyIiksCisgICAgICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVj
dC5jcmVhdGUoeworICAgICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbihldmVudCwgdmlldykgewor
ICAgICAgICAgIC8vIHZpZXcgbWlnaHQgYmUgaW5zdGFuY2Ugb2YgZWl0aGVyCisgICAgICAgICAg
Ly8gT3V0ZXJWaWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcgb24KKyAgICAgICAgICAvLyB3aGVy
ZSBvbiB0aGUgcGFnZSB0aGUgdXNlciBpbnRlcmFjdGlvbiBvY2N1cnJlZAorICAgICAgICB9Cisg
ICAgICB9KQorICAgIH0pOworICAKKyAgICBBcHAuSW5uZXJWaWV3ID0gRW1iZXIuVmlldy5leHRl
bmQoeworICAgICAgY2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIHdpbGwgYmUg
Y2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQorICAgICAgICAvLyBhbiBPdXRlclZpZXcgYmVjYXVz
ZSBPdXRlclZpZXcncworICAgICAgICAvLyBldmVudE1hbmFnZXIgZG9lc24ndCBoYW5kbGUgY2xp
Y2sgZXZlbnRzCisgICAgICB9LAorICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsK
KyAgICAgICAgLy8gd2lsbCBuZXZlciBiZSBjYWxsZWQgaWYgcmVuZGVyZWQgaW5zaWRlCisgICAg
ICAgIC8vIGFuIE91dGVyVmlldy4KKyAgICAgIH0KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAg
IyMjIGB7e2FjdGlvbn19YCBIZWxwZXIKKyAgCisgICAgU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVs
cGVycy5hY3Rpb25dKC9hcGkvY2xhc3Nlcy9FbWJlci5UZW1wbGF0ZXMuaGVscGVycy5odG1sI21l
dGhvZF9hY3Rpb24pLgorICAKKyAgICAjIyMgRXZlbnQgTmFtZXMKKyAgCisgICAgQWxsIG9mIHRo
ZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVzIGRlc2NyaWJlZCBhYm92ZSByZXNwb25kIHRvIHRo
ZSBzYW1lIHNldAorICAgIG9mIGV2ZW50cy4gVGhlIG5hbWVzIG9mIHRoZSBidWlsdC1pbiBldmVu
dHMgYXJlIGxpc3RlZCBiZWxvdy4gKFRoZSBoYXNoIG9mCisgICAgYnVpbHQtaW4gZXZlbnRzIGV4
aXN0cyBpbiBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYC4pIEFkZGl0aW9uYWwsIGN1c3RvbSBldmVu
dHMKKyAgICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2luZyBgRW1iZXIuQXBwbGljYXRpb24uY3Vz
dG9tRXZlbnRzYC4KKyAgCisgICAgVG91Y2ggZXZlbnRzOgorICAKKyAgICAqIGB0b3VjaFN0YXJ0
YAorICAgICogYHRvdWNoTW92ZWAKKyAgICAqIGB0b3VjaEVuZGAKKyAgICAqIGB0b3VjaENhbmNl
bGAKKyAgCisgICAgS2V5Ym9hcmQgZXZlbnRzCisgIAorICAgICogYGtleURvd25gCisgICAgKiBg
a2V5VXBgCisgICAgKiBga2V5UHJlc3NgCisgIAorICAgIE1vdXNlIGV2ZW50cworICAKKyAgICAq
IGBtb3VzZURvd25gCisgICAgKiBgbW91c2VVcGAKKyAgICAqIGBjb250ZXh0TWVudWAKKyAgICAq
IGBjbGlja2AKKyAgICAqIGBkb3VibGVDbGlja2AKKyAgICAqIGBtb3VzZU1vdmVgCisgICAgKiBg
Zm9jdXNJbmAKKyAgICAqIGBmb2N1c091dGAKKyAgICAqIGBtb3VzZUVudGVyYAorICAgICogYG1v
dXNlTGVhdmVgCisgIAorICAgIEZvcm0gZXZlbnRzOgorICAKKyAgICAqIGBzdWJtaXRgCisgICAg
KiBgY2hhbmdlYAorICAgICogYGZvY3VzSW5gCisgICAgKiBgZm9jdXNPdXRgCisgICAgKiBgaW5w
dXRgCisgIAorICAgIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOgorICAKKyAgICAqIGBkcmFn
U3RhcnRgCisgICAgKiBgZHJhZ2AKKyAgICAqIGBkcmFnRW50ZXJgCisgICAgKiBgZHJhZ0xlYXZl
YAorICAgICogYGRyYWdPdmVyYAorICAgICogYGRyYWdFbmRgCisgICAgKiBgZHJvcGAKKyAgCisg
ICAgIyMgYHt7dmlld319YCBIZWxwZXIKKyAgCisgICAgT3RoZXIgYEVtYmVyLlZpZXdgIGluc3Rh
bmNlcyBjYW4gYmUgaW5jbHVkZWQgYXMgcGFydCBvZiBhIHZpZXcncyB0ZW1wbGF0ZSBieQorICAg
IHVzaW5nIHRoZSBge3t2aWV3fX1gIGhlbHBlci4gU2VlIFtFbWJlci5UZW1wbGF0ZXMuaGVscGVy
cy52aWV3XSgvYXBpL2NsYXNzZXMvRW1iZXIuVGVtcGxhdGVzLmhlbHBlcnMuaHRtbCNtZXRob2Rf
dmlldykKKyAgICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgCisgICAgQGNsYXNzIFZp
ZXcKKyAgICBAbmFtZXNwYWNlIEVtYmVyCisgICAgQGV4dGVuZHMgRW1iZXIuQ29yZVZpZXcKKyAg
ICBAZGVwcmVjYXRlZCBTZWUgaHR0cDovL2VtYmVyanMuY29tL2RlcHJlY2F0aW9ucy92MS54LyN0
b2NfZW1iZXItdmlldworICAgIEB1c2VzIEVtYmVyLlZpZXdTdXBwb3J0CisgICAgQHVzZXMgRW1i
ZXIuVmlld0NvbnRleHRTdXBwb3J0CisgICAgQHVzZXMgRW1iZXIuVmlld0NoaWxkVmlld3NTdXBw
b3J0CisgICAgQHVzZXMgRW1iZXIuVGVtcGxhdGVSZW5kZXJpbmdTdXBwb3J0CisgICAgQHVzZXMg
RW1iZXIuQ2xhc3NOYW1lc1N1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5BdHRyaWJ1dGVCaW5kaW5n
c1N1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5MZWdhY3lWaWV3U3VwcG9ydAorICAgIEB1c2VzIEVt
YmVyLkluc3RydW1lbnRhdGlvblN1cHBvcnQKKyAgICBAdXNlcyBFbWJlci5WaXNpYmlsaXR5U3Vw
cG9ydAorICAgIEB1c2VzIEVtYmVyLkFyaWFSb2xlU3VwcG9ydAorICAgIEBwdWJsaWMKKyAgKi8K
KyAgLy8ganNjczpkaXNhYmxlIHZhbGlkYXRlSW5kZW50YXRpb24KKyAgdmFyIFZpZXcgPSBfZW1i
ZXJWaWV3c1ZpZXdzQ29yZV92aWV3LmRlZmF1bHQuZXh0ZW5kKF9lbWJlclZpZXdzTWl4aW5zVmll
d19jb250ZXh0X3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNWaWV3X2NoaWxkX3Zp
ZXdzX3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNMZWdhY3lfY2hpbGRfdmlld3Nf
c3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1ZpZXdfc3RhdGVfc3VwcG9ydC5kZWZh
dWx0LCBfZW1iZXJWaWV3c01peGluc1RlbXBsYXRlX3JlbmRlcmluZ19zdXBwb3J0LmRlZmF1bHQs
IF9lbWJlclZpZXdzTWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3
c01peGluc0xlZ2FjeV92aWV3X3N1cHBvcnQuZGVmYXVsdCwgX2VtYmVyVmlld3NNaXhpbnNJbnN0
cnVtZW50YXRpb25fc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGluc1Zpc2liaWxpdHlf
c3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c0NvbXBhdEF0dHJzUHJveHkuZGVmYXVsdCwgX2Vt
YmVyVmlld3NNaXhpbnNBcmlhX3JvbGVfc3VwcG9ydC5kZWZhdWx0LCBfZW1iZXJWaWV3c01peGlu
c1ZpZXdfc3VwcG9ydC5kZWZhdWx0LCB7CisgICAgaW5pdDogZnVuY3Rpb24gKCkgeworICAgICAg
dGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgaWYgKCF0aGlzLl92
aWV3UmVnaXN0cnkpIHsKKyAgICAgICAgdGhpcy5fdmlld1JlZ2lzdHJ5ID0gVmlldy52aWV3czsK
KyAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBHaXZlbiBhIHByb3BlcnR5IG5hbWUs
IHJldHVybnMgYSBkYXNoZXJpemVkIHZlcnNpb24gb2YgdGhhdAorICAgICAgcHJvcGVydHkgbmFt
ZSBpZiB0aGUgcHJvcGVydHkgZXZhbHVhdGVzIHRvIGEgbm9uLWZhbHN5IHZhbHVlLgorICAgICAg
IEZvciBleGFtcGxlLCBpZiB0aGUgdmlldyBoYXMgcHJvcGVydHkgYGlzVXJnZW50YCB0aGF0IGV2
YWx1YXRlcyB0byB0cnVlLAorICAgICAgcGFzc2luZyBgaXNVcmdlbnRgIHRvIHRoaXMgbWV0aG9k
IHdpbGwgcmV0dXJuIGAiaXMtdXJnZW50ImAuCisgICAgICAgQG1ldGhvZCBfY2xhc3NTdHJpbmdG
b3JQcm9wZXJ0eQorICAgICAgQHBhcmFtIHByb3BlcnR5CisgICAgICBAcHJpdmF0ZQorICAgICov
CisgICAgX2NsYXNzU3RyaW5nRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChwYXJzZWRQYXRoKSB7Cisg
ICAgICByZXR1cm4gVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXJzZWRQYXRoLnBhdGgsIHBh
cnNlZFBhdGguc3RyZWFtLnZhbHVlKCksIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRo
LmZhbHN5Q2xhc3NOYW1lKTsKKyAgICB9CisgIH0pOworCisgIC8vIGpzY3M6ZW5hYmxlIHZhbGlk
YXRlSW5kZW50YXRpb24KKworICAvKgorICAgIERlc2NyaWJlIGhvdyB0aGUgc3BlY2lmaWVkIGFj
dGlvbnMgc2hvdWxkIGJlaGF2ZSBpbiB0aGUgdmFyaW91cworICAgIHN0YXRlcyB0aGF0IGEgdmll
dyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKKyAgCisgICAgKiBwcmVSZW5kZXI6IHdo
ZW4gYSB2aWV3IGlzIGZpcnN0IGluc3RhbnRpYXRlZCwgYW5kIGFmdGVyIGl0cworICAgICAgZWxl
bWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0aGUgcHJlUmVuZGVyIHN0YXRlCisgICAgKiBp
bkJ1ZmZlcjogb25jZSBhIHZpZXcgaGFzIGJlZW4gcmVuZGVyZWQsIGJ1dCBiZWZvcmUgaXQgaGFz
CisgICAgICBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSwgaXQgaXMgaW4gdGhlIGluQnVmZmVy
IHN0YXRlCisgICAgKiBoYXNFbGVtZW50OiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2
aWV3IGlzIGNyZWF0ZWQsCisgICAgICBhbmQgaXMgcmVhZHkgdG8gYmUgaW5zZXJ0ZWQKKyAgICAq
IGluRE9NOiBvbmNlIGEgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBET00gaXQgaXMg
aW4KKyAgICAgIHRoZSBpbkRPTSBzdGF0ZS4gQSB2aWV3IHNwZW5kcyB0aGUgdmFzdCBtYWpvcml0
eSBvZiBpdHMKKyAgICAgIGV4aXN0ZW5jZSBpbiB0aGlzIHN0YXRlLgorICAgICogZGVzdHJveWVk
OiBvbmNlIGEgdmlldyBoYXMgYmVlbiBkZXN0cm95ZWQgKHVzaW5nIHRoZSBkZXN0cm95CisgICAg
ICBtZXRob2QpLCBpdCBpcyBpbiB0aGlzIHN0YXRlLiBObyBmdXJ0aGVyIGFjdGlvbnMgY2FuIGJl
IGludm9rZWQKKyAgICAgIG9uIGEgZGVzdHJveWVkIHZpZXcuCisgICovCisKKyAgLy8gaW4gdGhl
IGRlc3Ryb3llZCBzdGF0ZSwgZXZlcnl0aGluZyBpcyBpbGxlZ2FsCisKKyAgLy8gYmVmb3JlIHJl
bmRlcmluZyBoYXMgYmVndW4sIGFsbCBsZWdhbCBtYW5pcHVsYXRpb25zIGFyZSBub29wcy4KKwor
ICAvLyBpbnNpZGUgdGhlIGJ1ZmZlciwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgZG9uZSBvbiB0
aGUgYnVmZmVyCisKKyAgLy8gb25jZSB0aGUgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCBpbnRvIHRo
ZSBET00sIGxlZ2FsIG1hbmlwdWxhdGlvbnMKKyAgLy8gYXJlIGRvbmUgb24gdGhlIERPTSBlbGVt
ZW50LgorCisgIFZpZXcucmVvcGVuQ2xhc3MoeworICAgIC8qKgorICAgICAgR2xvYmFsIHZpZXdz
IGhhc2gKKyAgICAgICBAcHJvcGVydHkgdmlld3MKKyAgICAgIEBzdGF0aWMKKyAgICAgIEB0eXBl
IE9iamVjdAorICAgICAgQHByaXZhdGUKKyAgICAqLworICAgIHZpZXdzOiB7fQorICB9KTsKKwor
ICBleHBvcnRzLmRlZmF1bHQgPSBWaWV3OworICBleHBvcnRzLlZpZXdDb250ZXh0U3VwcG9ydCA9
IF9lbWJlclZpZXdzTWl4aW5zVmlld19jb250ZXh0X3N1cHBvcnQuZGVmYXVsdDsKKyAgZXhwb3J0
cy5WaWV3Q2hpbGRWaWV3c1N1cHBvcnQgPSBfZW1iZXJWaWV3c01peGluc1ZpZXdfY2hpbGRfdmll
d3Nfc3VwcG9ydC5kZWZhdWx0OworICBleHBvcnRzLlZpZXdTdGF0ZVN1cHBvcnQgPSBfZW1iZXJW
aWV3c01peGluc1ZpZXdfc3RhdGVfc3VwcG9ydC5kZWZhdWx0OworICBleHBvcnRzLlRlbXBsYXRl
UmVuZGVyaW5nU3VwcG9ydCA9IF9lbWJlclZpZXdzTWl4aW5zVGVtcGxhdGVfcmVuZGVyaW5nX3N1
cHBvcnQuZGVmYXVsdDsKKyAgZXhwb3J0cy5DbGFzc05hbWVzU3VwcG9ydCA9IF9lbWJlclZpZXdz
TWl4aW5zQ2xhc3NfbmFtZXNfc3VwcG9ydC5kZWZhdWx0OworfSk7CisvLyBmb3IgdGhlIHNpZGUg
ZWZmZWN0IG9mIGV4dGVuZGluZyBFbWJlci5ydW4ucXVldWVzCitlbmlmZWQoJ2VtYmVyL2luZGV4
JywgWydleHBvcnRzJywgJ2VtYmVyLW1ldGFsJywgJ2VtYmVyLXJ1bnRpbWUnLCAnZW1iZXItdmll
d3MnLCAnZW1iZXItcm91dGluZycsICdlbWJlci1hcHBsaWNhdGlvbicsICdlbWJlci1leHRlbnNp
b24tc3VwcG9ydCcsICdlbWJlci1odG1sYmFycycsICdlbWJlci1yb3V0aW5nLWh0bWxiYXJzJywg
J2VtYmVyLXJvdXRpbmctdmlld3MnLCAncmVxdWlyZScsICdlbWJlci1ydW50aW1lL3N5c3RlbS9s
YXp5X2xvYWQnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlck1ldGFsLCBfZW1iZXJSdW50aW1l
LCBfZW1iZXJWaWV3cywgX2VtYmVyUm91dGluZywgX2VtYmVyQXBwbGljYXRpb24sIF9lbWJlckV4
dGVuc2lvblN1cHBvcnQsIF9lbWJlckh0bWxiYXJzLCBfZW1iZXJSb3V0aW5nSHRtbGJhcnMsIF9l
bWJlclJvdXRpbmdWaWV3cywgX3JlcXVpcmUsIF9lbWJlclJ1bnRpbWVTeXN0ZW1MYXp5X2xvYWQp
IHsKKyAgLy8gcmVxdWlyZSB0aGUgbWFpbiBlbnRyeSBwb2ludHMgZm9yIGVhY2ggb2YgdGhlc2Ug
cGFja2FnZXMKKyAgLy8gdGhpcyBpcyBzbyB0aGF0IHRoZSBnbG9iYWwgZXhwb3J0cyBvY2N1ciBw
cm9wZXJseQorICAndXNlIHN0cmljdCc7CisKKyAgaWYgKF9yZXF1aXJlLmhhcygnZW1iZXItdGVt
cGxhdGUtY29tcGlsZXInKSkgeworICAgIF9yZXF1aXJlLmRlZmF1bHQoJ2VtYmVyLXRlbXBsYXRl
LWNvbXBpbGVyJyk7CisgIH0KKworICAvLyBkbyB0aGlzIHRvIGVuc3VyZSB0aGF0IEVtYmVyLlRl
c3QgaXMgZGVmaW5lZCBwcm9wZXJseSBvbiB0aGUgZ2xvYmFsCisgIC8vIGlmIGl0IGlzIHByZXNl
bnQuCisgIGlmIChfcmVxdWlyZS5oYXMoJ2VtYmVyLXRlc3RpbmcnKSkgeworICAgIF9yZXF1aXJl
LmRlZmF1bHQoJ2VtYmVyLXRlc3RpbmcnKTsKKyAgfQorCisgIF9lbWJlclJ1bnRpbWVTeXN0ZW1M
YXp5X2xvYWQucnVuTG9hZEhvb2tzKCdFbWJlcicpOworCisgIC8qKgorICBAbW9kdWxlIGVtYmVy
CisgICovCit9KTsKK2VuaWZlZCgnaHRtbGJhcnMtcnVudGltZScsIFsnZXhwb3J0cycsICdodG1s
YmFycy1ydW50aW1lL2hvb2tzJywgJ2h0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyJywgJ2h0bWxiYXJz
LXV0aWwvbW9ycGgtdXRpbHMnLCAnaHRtbGJhcnMtdXRpbC90ZW1wbGF0ZS11dGlscyddLCBmdW5j
dGlvbiAoZXhwb3J0cywgX2h0bWxiYXJzUnVudGltZUhvb2tzLCBfaHRtbGJhcnNSdW50aW1lUmVu
ZGVyLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBpbnRlcm5hbCA9IHsKKyAgICBibG9ja0Zvcjog
X2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRpbHMuYmxvY2tGb3IsCisgICAgbWFudWFsRWxlbWVudDog
X2h0bWxiYXJzUnVudGltZVJlbmRlci5tYW51YWxFbGVtZW50LAorICAgIGhvc3RCbG9jazogX2h0
bWxiYXJzUnVudGltZUhvb2tzLmhvc3RCbG9jaywKKyAgICBjb250aW51ZUJsb2NrOiBfaHRtbGJh
cnNSdW50aW1lSG9va3MuY29udGludWVCbG9jaywKKyAgICBob3N0WWllbGRXaXRoU2hhZG93VGVt
cGxhdGU6IF9odG1sYmFyc1J1bnRpbWVIb29rcy5ob3N0WWllbGRXaXRoU2hhZG93VGVtcGxhdGUs
CisgICAgdmlzaXRDaGlsZHJlbjogX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMudmlzaXRDaGlsZHJl
biwKKyAgICB2YWxpZGF0ZUNoaWxkTW9ycGhzOiBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscy52YWxp
ZGF0ZUNoaWxkTW9ycGhzLAorICAgIGNsZWFyTW9ycGg6IF9odG1sYmFyc1V0aWxUZW1wbGF0ZVV0
aWxzLmNsZWFyTW9ycGgKKyAgfTsKKworICBleHBvcnRzLmhvb2tzID0gX2h0bWxiYXJzUnVudGlt
ZUhvb2tzLmRlZmF1bHQ7CisgIGV4cG9ydHMucmVuZGVyID0gX2h0bWxiYXJzUnVudGltZVJlbmRl
ci5kZWZhdWx0OworICBleHBvcnRzLmludGVybmFsID0gaW50ZXJuYWw7Cit9KTsKK2VuaWZlZCgn
aHRtbGJhcnMtcnVudGltZS9leHByZXNzaW9uLXZpc2l0b3InLCBbJ2V4cG9ydHMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMpIHsKKyAgLyoqCisgICAgIyBFeHByZXNzaW9uIE5vZGVzOgorICAKKyAgICBU
aGVzZSBub2RlcyBhcmUgbm90IGRpcmVjdGx5IHJlc3BvbnNpYmxlIGZvciBhbnkgcGFydCBvZiB0
aGUgRE9NLCBidXQgYXJlCisgICAgZXZlbnR1YWxseSBwYXNzZWQgdG8gYSBTdGF0ZW1lbnQgTm9k
ZS4KKyAgCisgICAgKiBnZXQKKyAgICAqIHN1YmV4cHIKKyAgICAqIGNvbmNhdAorICAqLworCisg
ICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmFjY2VwdFBhcmFtcyA9IGFjY2VwdFBhcmFtczsK
KyAgZXhwb3J0cy5hY2NlcHRIYXNoID0gYWNjZXB0SGFzaDsKKworICBmdW5jdGlvbiBhY2NlcHRQ
YXJhbXMobm9kZXMsIGVudiwgc2NvcGUpIHsKKyAgICB2YXIgYXJyYXkgPSBbXTsKKworICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBhcnJh
eS5wdXNoKGFjY2VwdEV4cHJlc3Npb24obm9kZXNbaV0sIGVudiwgc2NvcGUpLnZhbHVlKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gYXJyYXk7CisgIH0KKworICBmdW5jdGlvbiBhY2NlcHRIYXNoKHBh
aXJzLCBlbnYsIHNjb3BlKSB7CisgICAgdmFyIG9iamVjdCA9IHt9OworCisgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKKyAgICAgIHZhciBrZXkg
PSBwYWlyc1tpXTsKKyAgICAgIHZhciB2YWx1ZSA9IHBhaXJzW2kgKyAxXTsKKyAgICAgIG9iamVj
dFtrZXldID0gYWNjZXB0RXhwcmVzc2lvbih2YWx1ZSwgZW52LCBzY29wZSkudmFsdWU7CisgICAg
fQorCisgICAgcmV0dXJuIG9iamVjdDsKKyAgfQorCisgIGZ1bmN0aW9uIGFjY2VwdEV4cHJlc3Np
b24obm9kZSwgZW52LCBzY29wZSkgeworICAgIHZhciByZXQgPSB7IHZhbHVlOiBudWxsIH07CisK
KyAgICAvLyBQcmltaXRpdmUgbGl0ZXJhbHMgYXJlIHVuYW1iaWd1b3VzbHkgbm9uLWFycmF5IHJl
cHJlc2VudGF0aW9ucyBvZgorICAgIC8vIHRoZW1zZWx2ZXMuCisgICAgaWYgKHR5cGVvZiBub2Rl
ICE9PSAnb2JqZWN0JyB8fCBub2RlID09PSBudWxsKSB7CisgICAgICByZXQudmFsdWUgPSBub2Rl
OworICAgIH0gZWxzZSB7CisgICAgICByZXQudmFsdWUgPSBldmFsdWF0ZU5vZGUobm9kZSwgZW52
LCBzY29wZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGZ1bmN0aW9uIGV2
YWx1YXRlTm9kZShub2RlLCBlbnYsIHNjb3BlKSB7CisgICAgc3dpdGNoIChub2RlWzBdKSB7Cisg
ICAgICAvLyBjYW4gYmUgdXNlZCBieSBtYW51YWxFbGVtZW50CisgICAgICBjYXNlICd2YWx1ZSc6
CisgICAgICAgIHJldHVybiBub2RlWzFdOworICAgICAgY2FzZSAnZ2V0JzoKKyAgICAgICAgcmV0
dXJuIGV2YWx1YXRlR2V0KG5vZGUsIGVudiwgc2NvcGUpOworICAgICAgY2FzZSAnc3ViZXhwcic6
CisgICAgICAgIHJldHVybiBldmFsdWF0ZVN1YmV4cHIobm9kZSwgZW52LCBzY29wZSk7CisgICAg
ICBjYXNlICdjb25jYXQnOgorICAgICAgICByZXR1cm4gZXZhbHVhdGVDb25jYXQobm9kZSwgZW52
LCBzY29wZSk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZXZhbHVhdGVHZXQobm9kZSwgZW52
LCBzY29wZSkgeworICAgIHZhciBwYXRoID0gbm9kZVsxXTsKKworICAgIHJldHVybiBlbnYuaG9v
a3MuZ2V0KGVudiwgc2NvcGUsIHBhdGgpOworICB9CisKKyAgZnVuY3Rpb24gZXZhbHVhdGVTdWJl
eHByKG5vZGUsIGVudiwgc2NvcGUpIHsKKyAgICB2YXIgcGF0aCA9IG5vZGVbMV07CisgICAgdmFy
IHJhd1BhcmFtcyA9IG5vZGVbMl07CisgICAgdmFyIHJhd0hhc2ggPSBub2RlWzNdOworCisgICAg
dmFyIHBhcmFtcyA9IGFjY2VwdFBhcmFtcyhyYXdQYXJhbXMsIGVudiwgc2NvcGUpOworICAgIHZh
ciBoYXNoID0gYWNjZXB0SGFzaChyYXdIYXNoLCBlbnYsIHNjb3BlKTsKKworICAgIHJldHVybiBl
bnYuaG9va3Muc3ViZXhwcihlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gpOworICB9CisK
KyAgZnVuY3Rpb24gZXZhbHVhdGVDb25jYXQobm9kZSwgZW52LCBzY29wZSkgeworICAgIHZhciBy
YXdQYXJ0cyA9IG5vZGVbMV07CisKKyAgICB2YXIgcGFydHMgPSBhY2NlcHRQYXJhbXMocmF3UGFy
dHMsIGVudiwgc2NvcGUpOworCisgICAgcmV0dXJuIGVudi5ob29rcy5jb25jYXQoZW52LCBwYXJ0
cyk7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFycy1ydW50aW1lL2hvb2tzIiwgWyJleHBvcnRz
IiwgImh0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyIiwgIm1vcnBoLXJhbmdlL21vcnBoLWxpc3QiLCAi
aHRtbGJhcnMtdXRpbC9vYmplY3QtdXRpbHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11dGlscyIs
ICJodG1sYmFycy11dGlsL3RlbXBsYXRlLXV0aWxzIl0sIGZ1bmN0aW9uIChleHBvcnRzLCBfaHRt
bGJhcnNSdW50aW1lUmVuZGVyLCBfbW9ycGhSYW5nZU1vcnBoTGlzdCwgX2h0bWxiYXJzVXRpbE9i
amVjdFV0aWxzLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzVXRpbFRlbXBsYXRl
VXRpbHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIGV4cG9ydHMud3JhcCA9IHdyYXA7CisgIGV4
cG9ydHMud3JhcEZvckhlbHBlciA9IHdyYXBGb3JIZWxwZXI7CisgIGV4cG9ydHMuY3JlYXRlU2Nv
cGUgPSBjcmVhdGVTY29wZTsKKyAgZXhwb3J0cy5jcmVhdGVGcmVzaFNjb3BlID0gY3JlYXRlRnJl
c2hTY29wZTsKKyAgZXhwb3J0cy5iaW5kU2hhZG93U2NvcGUgPSBiaW5kU2hhZG93U2NvcGU7Cisg
IGV4cG9ydHMuY3JlYXRlQ2hpbGRTY29wZSA9IGNyZWF0ZUNoaWxkU2NvcGU7CisgIGV4cG9ydHMu
YmluZFNlbGYgPSBiaW5kU2VsZjsKKyAgZXhwb3J0cy51cGRhdGVTZWxmID0gdXBkYXRlU2VsZjsK
KyAgZXhwb3J0cy5iaW5kTG9jYWwgPSBiaW5kTG9jYWw7CisgIGV4cG9ydHMudXBkYXRlTG9jYWwg
PSB1cGRhdGVMb2NhbDsKKyAgZXhwb3J0cy5iaW5kQmxvY2sgPSBiaW5kQmxvY2s7CisgIGV4cG9y
dHMuYmxvY2sgPSBibG9jazsKKyAgZXhwb3J0cy5jb250aW51ZUJsb2NrID0gY29udGludWVCbG9j
azsKKyAgZXhwb3J0cy5ob3N0QmxvY2sgPSBob3N0QmxvY2s7CisgIGV4cG9ydHMuaGFuZGxlUmVk
aXJlY3QgPSBoYW5kbGVSZWRpcmVjdDsKKyAgZXhwb3J0cy5oYW5kbGVLZXl3b3JkID0gaGFuZGxl
S2V5d29yZDsKKyAgZXhwb3J0cy5saW5rUmVuZGVyTm9kZSA9IGxpbmtSZW5kZXJOb2RlOworICBl
eHBvcnRzLmlubGluZSA9IGlubGluZTsKKyAgZXhwb3J0cy5rZXl3b3JkID0ga2V5d29yZDsKKyAg
ZXhwb3J0cy5pbnZva2VIZWxwZXIgPSBpbnZva2VIZWxwZXI7CisgIGV4cG9ydHMuY2xhc3NpZnkg
PSBjbGFzc2lmeTsKKyAgZXhwb3J0cy5wYXJ0aWFsID0gcGFydGlhbDsKKyAgZXhwb3J0cy5yYW5n
ZSA9IHJhbmdlOworICBleHBvcnRzLmVsZW1lbnQgPSBlbGVtZW50OworICBleHBvcnRzLmF0dHJp
YnV0ZSA9IGF0dHJpYnV0ZTsKKyAgZXhwb3J0cy5zdWJleHByID0gc3ViZXhwcjsKKyAgZXhwb3J0
cy5nZXQgPSBnZXQ7CisgIGV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7CisgIGV4cG9ydHMuZ2V0
QmxvY2sgPSBnZXRCbG9jazsKKyAgZXhwb3J0cy5nZXRDaGlsZCA9IGdldENoaWxkOworICBleHBv
cnRzLmdldFZhbHVlID0gZ2V0VmFsdWU7CisgIGV4cG9ydHMuZ2V0Q2VsbE9yVmFsdWUgPSBnZXRD
ZWxsT3JWYWx1ZTsKKyAgZXhwb3J0cy5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgIGV4cG9ydHMu
Y29uY2F0ID0gY29uY2F0OworICBleHBvcnRzLmhhc0hlbHBlciA9IGhhc0hlbHBlcjsKKyAgZXhw
b3J0cy5sb29rdXBIZWxwZXIgPSBsb29rdXBIZWxwZXI7CisgIGV4cG9ydHMuYmluZFNjb3BlID0g
YmluZFNjb3BlOworICBleHBvcnRzLnVwZGF0ZVNjb3BlID0gdXBkYXRlU2NvcGU7CisKKyAgLyoq
CisgICAgSFRNTEJhcnMgZGVsZWdhdGVzIHRoZSBydW50aW1lIGJlaGF2aW9yIG9mIGEgdGVtcGxh
dGUgdG8KKyAgICBob29rcyBwcm92aWRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudC4gVGhlc2Ug
aG9va3MgZXhwbGFpbgorICAgIHRoZSBsZXhpY2FsIGVudmlyb25tZW50IG9mIGEgSGFuZGxlYmFy
cyB0ZW1wbGF0ZSwgdGhlIGludGVybmFsCisgICAgcmVwcmVzZW50YXRpb24gb2YgcmVmZXJlbmNl
cywgYW5kIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFuCisgICAgSFRNTEJhcnMgdGVtcGxhdGUg
YW5kIHRoZSBET00gaXQgaXMgbWFuYWdpbmcuCisgIAorICAgIFdoaWxlIEhUTUxCYXJzIGhvc3Qg
aG9va3MgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoaXMgaW50ZXJuYWwKKyAgICBtYWNoaW5lcnks
IHRlbXBsYXRlcyBhbmQgaGVscGVycyBoYXZlIGFjY2VzcyB0byB0aGUgYWJzdHJhY3Rpb24KKyAg
ICBwcm92aWRlZCBieSB0aGUgaG9zdCBob29rcy4KKyAgCisgICAgIyMgVGhlIExleGljYWwgRW52
aXJvbm1lbnQKKyAgCisgICAgVGhlIGRlZmF1bHQgbGV4aWNhbCBlbnZpcm9ubWVudCBvZiBhbiBI
VE1MQmFycyB0ZW1wbGF0ZSBpbmNsdWRlczoKKyAgCisgICAgKiBBbnkgbG9jYWwgdmFyaWFibGVz
LCBwcm92aWRlZCBieSAqYmxvY2sgYXJndW1lbnRzKgorICAgICogVGhlIGN1cnJlbnQgdmFsdWUg
b2YgYHNlbGZgCisgIAorICAgICMjIFNpbXBsZSBOZXN0aW5nCisgIAorICAgIExldCdzIGxvb2sg
YXQgYSBzaW1wbGUgdGVtcGxhdGUgd2l0aCBhIG5lc3RlZCBibG9jazoKKyAgCisgICAgYGBgaGJz
CisgICAgPGgxPnt7dGl0bGV9fTwvaDE+CisgIAorICAgIHt7I2lmIGF1dGhvcn19CisgICAgICA8
cCBjbGFzcz0iYnlsaW5lIj57e2F1dGhvcn19PC9wPgorICAgIHt7L2lmfX0KKyAgICBgYGAKKyAg
CisgICAgSW4gdGhpcyBjYXNlLCB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudCBhdCB0aGUgdG9wLWxl
dmVsIG9mIHRoZQorICAgIHRlbXBsYXRlIGRvZXMgbm90IGNoYW5nZSBpbnNpZGUgb2YgdGhlIGBp
ZmAgYmxvY2suIFRoaXMgaXMKKyAgICBhY2hpZXZlZCB2aWEgYW4gaW1wbGVtZW50YXRpb24gb2Yg
YGlmYCB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKyAgCisgICAgYGBganMKKyAgICByZWdpc3Rlckhl
bHBlcignaWYnLCBmdW5jdGlvbihwYXJhbXMpIHsKKyAgICAgIGlmICghIXBhcmFtc1swXSkgewor
ICAgICAgICByZXR1cm4gdGhpcy55aWVsZCgpOworICAgICAgfQorICAgIH0pOworICAgIGBgYAor
ICAKKyAgICBBIGNhbGwgdG8gYHRoaXMueWllbGRgIGludm9rZXMgdGhlIGNoaWxkIHRlbXBsYXRl
IHVzaW5nIHRoZQorICAgIGN1cnJlbnQgbGV4aWNhbCBlbnZpcm9ubWVudC4KKyAgCisgICAgIyMg
QmxvY2sgQXJndW1lbnRzCisgIAorICAgIEl0IGlzIHBvc3NpYmxlIGZvciBuZXN0ZWQgYmxvY2tz
IHRvIGludHJvZHVjZSBuZXcgbG9jYWwKKyAgICB2YXJpYWJsZXM6CisgIAorICAgIGBgYGhicwor
ICAgIHt7I2NvdW50LWNhbGxzIGFzIHxpfH19CisgICAgPGgxPnt7dGl0bGV9fTwvaDE+CisgICAg
PHA+Q2FsbGVkIHt7aX19IHRpbWVzPC9wPgorICAgIHt7L2NvdW50fX0KKyAgICBgYGAKKyAgCisg
ICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgY2hpbGQgYmxvY2sgaW5oZXJpdHMgaXRzIHN1cnJvdW5k
aW5nCisgICAgbGV4aWNhbCBlbnZpcm9ubWVudCwgYnV0IGF1Z21lbnRzIGl0IHdpdGggYSBzaW5n
bGUgbmV3CisgICAgdmFyaWFibGUgYmluZGluZy4KKyAgCisgICAgVGhlIGltcGxlbWVudGF0aW9u
IG9mIGBjb3VudC1jYWxsc2Agc3VwcGxpZXMgdGhlIHZhbHVlIG9mCisgICAgYGlgLCBidXQgZG9l
cyBub3Qgb3RoZXJ3aXNlIGFsdGVyIHRoZSBlbnZpcm9ubWVudDoKKyAgCisgICAgYGBganMKKyAg
ICB2YXIgY291bnQgPSAwOworICAgIHJlZ2lzdGVySGVscGVyKCdjb3VudC1jYWxscycsIGZ1bmN0
aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMueWllbGQoWyArK2NvdW50IF0pOworICAgIH0pOwor
ICAgIGBgYAorICAqLworCisgIGZ1bmN0aW9uIHdyYXAodGVtcGxhdGUpIHsKKyAgICBpZiAodGVt
cGxhdGUgPT09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVy
biB7CisgICAgICBtZXRhOiB0ZW1wbGF0ZS5tZXRhLAorICAgICAgYXJpdHk6IHRlbXBsYXRlLmFy
aXR5LAorICAgICAgcmF3OiB0ZW1wbGF0ZSwKKyAgICAgIHJlbmRlcjogZnVuY3Rpb24gKHNlbGYs
IGVudiwgb3B0aW9ucywgYmxvY2tBcmd1bWVudHMpIHsKKyAgICAgICAgdmFyIHNjb3BlID0gZW52
Lmhvb2tzLmNyZWF0ZUZyZXNoU2NvcGUoKTsKKworICAgICAgICB2YXIgY29udGV4dHVhbEVsZW1l
bnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dHVhbEVsZW1lbnQ7CisgICAgICAgIHZhciBy
ZW5kZXJPcHRpb25zID0gbmV3IF9odG1sYmFyc1J1bnRpbWVSZW5kZXIuUmVuZGVyT3B0aW9ucyhu
dWxsLCBzZWxmLCBibG9ja0FyZ3VtZW50cywgY29udGV4dHVhbEVsZW1lbnQpOworCisgICAgICAg
IHJldHVybiBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUsIGVudiwgc2Nv
cGUsIHJlbmRlck9wdGlvbnMpOworICAgICAgfQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiB3
cmFwRm9ySGVscGVyKHRlbXBsYXRlLCBlbnYsIHNjb3BlLCBtb3JwaCwgcmVuZGVyU3RhdGUsIHZp
c2l0b3IpIHsKKyAgICBpZiAoIXRlbXBsYXRlKSB7CisgICAgICByZXR1cm4ge307CisgICAgfQor
CisgICAgdmFyIHlpZWxkQXJncyA9IHlpZWxkVGVtcGxhdGUodGVtcGxhdGUsIGVudiwgc2NvcGUs
IG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcik7CisKKyAgICByZXR1cm4geworICAgICAgbWV0
YTogdGVtcGxhdGUubWV0YSwKKyAgICAgIGFyaXR5OiB0ZW1wbGF0ZS5hcml0eSwKKyAgICAgICd5
aWVsZCc6IHlpZWxkQXJncywgLy8gcXVvdGVkIHNpbmNlIGl0J3MgYSByZXNlcnZlZCB3b3JkLCBz
ZWUgaXNzdWUgIzQyMAorICAgICAgeWllbGRJdGVtOiB5aWVsZEl0ZW0odGVtcGxhdGUsIGVudiwg
c2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvciksCisgICAgICByYXc6IHRlbXBsYXRl
LAorCisgICAgICByZW5kZXI6IGZ1bmN0aW9uIChzZWxmLCBibG9ja0FyZ3VtZW50cykgeworICAg
ICAgICB5aWVsZEFyZ3MoYmxvY2tBcmd1bWVudHMsIHNlbGYpOworICAgICAgfQorICAgIH07Cisg
IH0KKworICAvLyBDYWxsZWQgYnkgYSB1c2VyLWxhbmQgaGVscGVyIHRvIHJlbmRlciBhIHRlbXBs
YXRlLgorICBmdW5jdGlvbiB5aWVsZFRlbXBsYXRlKHRlbXBsYXRlLCBlbnYsIHBhcmVudFNjb3Bl
LCBtb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3IpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKGJs
b2NrQXJndW1lbnRzLCBzZWxmKSB7CisgICAgICAvLyBSZW5kZXIgc3RhdGUgaXMgdXNlZCB0byB0
cmFjayB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGhlbHBlciAoc2luY2UgaXQKKyAgICAgIC8vIG1heSBj
YWxsIGludG8gdXMgbXVsdGlwbGUgdGltZXMpLiBBcyB0aGUgdXNlci1sYW5kIGhlbHBlciBjYWxs
cworICAgICAgLy8gaW50byBsaWJyYXJ5IGNvZGUsIHdlIHRyYWNrIHdoYXQgbmVlZHMgdG8gYmUg
Y2xlYW5lZCB1cCBhZnRlciB0aGUKKyAgICAgIC8vIGhlbHBlciBoYXMgcmV0dXJuZWQuCisgICAg
ICAvLworICAgICAgLy8gSGVyZSwgd2UgcmVtZW1iZXIgdGhhdCBhIHRlbXBsYXRlIGhhcyBiZWVu
IHlpZWxkZWQgYW5kIHNvIHdlIGRvIG5vdAorICAgICAgLy8gbmVlZCB0byByZW1vdmUgdGhlIHBy
ZXZpb3VzIHRlbXBsYXRlLiAoSWYgbm8gdGVtcGxhdGUgaXMgeWllbGRlZAorICAgICAgLy8gdGhp
cyByZW5kZXIgYnkgdGhlIGhlbHBlciwgd2UgYXNzdW1lIG5vdGhpbmcgc2hvdWxkIGJlIHNob3du
IGFuZAorICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyByZW5kZXJlZCB0ZW1wbGF0ZXMuKQor
ICAgICAgcmVuZGVyU3RhdGUubW9ycGhUb0NsZWFyID0gbnVsbDsKKworICAgICAgLy8gSW4gdGhp
cyBjb25kaXRpb25hbCBpcyB0cnVlLCBpdCBtZWFucyB0aGF0IG9uIHRoZSBwcmV2aW91cyByZW5k
ZXJpbmcgcGFzcworICAgICAgLy8gdGhlIGhlbHBlciB5aWVsZGVkIG11bHRpcGxlIGl0ZW1zIHZp
YSBgeWllbGRJdGVtKClgLCBidXQgdGhpcyB0aW1lIHRoZXkKKyAgICAgIC8vIGFyZSB5aWVsZGlu
ZyBhIHNpbmdsZSB0ZW1wbGF0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBtYXJrIHRoZSBtb3JwaCBsaXN0
IGZvcgorICAgICAgLy8gY2xlYW51cCBzbyBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4KKyAg
ICAgIGlmIChtb3JwaC5tb3JwaExpc3QpIHsKKyAgICAgICAgX2h0bWxiYXJzVXRpbFRlbXBsYXRl
VXRpbHMuY2xlYXJNb3JwaExpc3QobW9ycGgubW9ycGhMaXN0LCBtb3JwaCwgZW52KTsKKyAgICAg
ICAgcmVuZGVyU3RhdGUubW9ycGhMaXN0VG9DbGVhciA9IG51bGw7CisgICAgICB9CisKKyAgICAg
IHZhciBzY29wZSA9IHBhcmVudFNjb3BlOworCisgICAgICBpZiAobW9ycGgubGFzdFlpZWxkZWQg
JiYgaXNTdGFibGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgbW9ycGgubGFzdFlpZWxkZWQpKSB7CisgICAg
ICAgIHJldHVybiBtb3JwaC5sYXN0UmVzdWx0LnJldmFsaWRhdGVXaXRoKGVudiwgdW5kZWZpbmVk
LCBzZWxmLCBibG9ja0FyZ3VtZW50cywgdmlzaXRvcik7CisgICAgICB9CisKKyAgICAgIC8vIENo
ZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFjdHVhbGx5ICoqbmVlZCoqIGEgbmV3IHNjb3BlLCBh
bmQgY2FuJ3QKKyAgICAgIC8vIHNoYXJlIHRoZSBwYXJlbnQgc2NvcGUuIE5vdGUgdGhhdCB3ZSBu
ZWVkIHRvIG1vdmUgdGhpcyBjaGVjayBpbnRvCisgICAgICAvLyBhIGhvc3QgaG9vaywgYmVjYXVz
ZSB0aGUgaG9zdCdzIG5vdGlvbiBvZiBzY29wZSBtYXkgcmVxdWlyZSBhIG5ldworICAgICAgLy8g
c2NvcGUgaW4gbW9yZSBjYXNlcyB0aGFuIHRoZSBvbmVzIHdlIGNhbiBkZXRlcm1pbmUgc3RhdGlj
YWxseS4KKyAgICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQgfHwgcGFyZW50U2NvcGUgPT09IG51
bGwgfHwgdGVtcGxhdGUuYXJpdHkpIHsKKyAgICAgICAgc2NvcGUgPSBlbnYuaG9va3MuY3JlYXRl
Q2hpbGRTY29wZShwYXJlbnRTY29wZSk7CisgICAgICB9CisKKyAgICAgIG1vcnBoLmxhc3RZaWVs
ZGVkID0geyBzZWxmOiBzZWxmLCB0ZW1wbGF0ZTogdGVtcGxhdGUsIHNoYWRvd1RlbXBsYXRlOiBu
dWxsIH07CisKKyAgICAgIC8vIFJlbmRlciB0aGUgdGVtcGxhdGUgdGhhdCB3YXMgc2VsZWN0ZWQg
YnkgdGhlIGhlbHBlcgorICAgICAgdmFyIHJlbmRlck9wdGlvbnMgPSBuZXcgX2h0bWxiYXJzUnVu
dGltZVJlbmRlci5SZW5kZXJPcHRpb25zKG1vcnBoLCBzZWxmLCBibG9ja0FyZ3VtZW50cyk7Cisg
ICAgICBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUsIGVudiwgc2NvcGUs
IHJlbmRlck9wdGlvbnMpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiB5aWVsZEl0ZW0odGVt
cGxhdGUsIGVudiwgcGFyZW50U2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcikgewor
ICAgIC8vIEluaXRpYWxpemUgc3RhdGUgdGhhdCB0cmFja3MgbXVsdGlwbGUgaXRlbXMgYmVpbmcK
KyAgICAvLyB5aWVsZGVkIGluLgorICAgIHZhciBjdXJyZW50TW9ycGggPSBudWxsOworCisgICAg
Ly8gQ2FuZGlkYXRlIG1vcnBocyBmb3IgZGVsZXRpb24uCisgICAgdmFyIGNhbmRpZGF0ZXMgPSB7
fTsKKworICAgIC8vIFJldXNlIGV4aXN0aW5nIE1vcnBoTGlzdCBpZiB0aGlzIGlzIG5vdCBhIGZp
cnN0LXRpbWUKKyAgICAvLyByZW5kZXIuCisgICAgdmFyIG1vcnBoTGlzdCA9IG1vcnBoLm1vcnBo
TGlzdDsKKyAgICBpZiAobW9ycGhMaXN0KSB7CisgICAgICBjdXJyZW50TW9ycGggPSBtb3JwaExp
c3QuZmlyc3RDaGlsZE1vcnBoOworICAgIH0KKworICAgIC8vIEFkdmFuY2VzIHRoZSBjdXJyZW50
TW9ycGggcG9pbnRlciB0byB0aGUgbW9ycGggaW4gdGhlIHByZXZpb3VzbHktcmVuZGVyZWQKKyAg
ICAvLyBsaXN0IHRoYXQgbWF0Y2hlcyB0aGUgeWllbGRlZCBrZXkuIFdoaWxlIGRvaW5nIHNvLCBp
dCBtYXJrcyBhbnkgbW9ycGhzCisgICAgLy8gdGhhdCBpdCBhZHZhbmNlcyBwYXN0IGFzIGNhbmRp
ZGF0ZXMgZm9yIGRlbGV0aW9uLiBBc3N1bWluZyB0aG9zZSBtb3JwaHMKKyAgICAvLyBhcmUgbm90
IHlpZWxkZWQgaW4gbGF0ZXIsIHRoZXkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBwcnVuZSBzdGVw
IGR1cmluZworICAgIC8vIGNsZWFudXAuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgaGVscGVyIGZ1
bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgbW9ycGggYmVpbmcgc2Vla2VkIHRvIGlzCisgICAgLy8g
Z3VhcmFudGVlZCB0byBleGlzdCBpbiB0aGUgcHJldmlvdXMgTW9ycGhMaXN0OyBpZiB0aGlzIGlz
IGNhbGxlZCBhbmQgdGhlCisgICAgLy8gbW9ycGggZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgcmVz
dWx0IGluIGFuIGluZmluaXRlIGxvb3AKKyAgICBmdW5jdGlvbiBhZHZhbmNlVG9LZXkoa2V5KSB7
CisgICAgICB2YXIgc2VlayA9IGN1cnJlbnRNb3JwaDsKKworICAgICAgd2hpbGUgKHNlZWsua2V5
ICE9PSBrZXkpIHsKKyAgICAgICAgY2FuZGlkYXRlc1tzZWVrLmtleV0gPSBzZWVrOworICAgICAg
ICBzZWVrID0gc2Vlay5uZXh0TW9ycGg7CisgICAgICB9CisKKyAgICAgIGN1cnJlbnRNb3JwaCA9
IHNlZWsubmV4dE1vcnBoOworICAgICAgcmV0dXJuIHNlZWs7CisgICAgfQorCisgICAgcmV0dXJu
IGZ1bmN0aW9uIChfa2V5LCBibG9ja0FyZ3VtZW50cywgc2VsZikgeworICAgICAgaWYgKHR5cGVv
ZiBfa2V5ICE9PSAnc3RyaW5nJykgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0
IHByb3ZpZGUgYSBzdHJpbmcga2V5IHdoZW4gY2FsbGluZyBgeWllbGRJdGVtYDsgeW91IHByb3Zp
ZGVkICIgKyBfa2V5KTsKKyAgICAgIH0KKworICAgICAgLy8gQXQgbGVhc3Qgb25lIGl0ZW0gaGFz
IGJlZW4geWllbGRlZCwgc28gd2UgZG8gbm90IHdob2xlc2FsZQorICAgICAgLy8gY2xlYXIgdGhl
IGxhc3QgTW9ycGhMaXN0IGJ1dCBpbnN0ZWFkIGFwcGx5IGEgcHJ1bmUgb3BlcmF0aW9uLgorICAg
ICAgcmVuZGVyU3RhdGUubW9ycGhMaXN0VG9DbGVhciA9IG51bGw7CisgICAgICBtb3JwaC5sYXN0
WWllbGRlZCA9IG51bGw7CisKKyAgICAgIHZhciBtb3JwaExpc3QsIG1vcnBoTWFwOworCisgICAg
ICBpZiAoIW1vcnBoLm1vcnBoTGlzdCkgeworICAgICAgICBtb3JwaC5tb3JwaExpc3QgPSBuZXcg
X21vcnBoUmFuZ2VNb3JwaExpc3QuZGVmYXVsdCgpOworICAgICAgICBtb3JwaC5tb3JwaE1hcCA9
IHt9OworICAgICAgICBtb3JwaC5zZXRNb3JwaExpc3QobW9ycGgubW9ycGhMaXN0KTsKKyAgICAg
IH0KKworICAgICAgbW9ycGhMaXN0ID0gbW9ycGgubW9ycGhMaXN0OworICAgICAgbW9ycGhNYXAg
PSBtb3JwaC5tb3JwaE1hcDsKKworICAgICAgLy8gQSBtYXAgb2YgbW9ycGhzIHRoYXQgaGF2ZSBi
ZWVuIHlpZWxkZWQgaW4gb24gdGhpcworICAgICAgLy8gcmVuZGVyaW5nIHBhc3MuIEFueSBtb3Jw
aHMgdGhhdCBkbyBub3QgbWFrZSBpdCBpbnRvCisgICAgICAvLyB0aGlzIGxpc3Qgd2lsbCBiZSBw
cnVuZWQgZnJvbSB0aGUgTW9ycGhMaXN0IGR1cmluZyB0aGUgY2xlYW51cAorICAgICAgLy8gcHJv
Y2Vzcy4KKyAgICAgIHZhciBoYW5kbGVkTW9ycGhzID0gcmVuZGVyU3RhdGUuaGFuZGxlZE1vcnBo
czsKKyAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7CisKKyAgICAgIGlmIChfa2V5IGluIGhhbmRs
ZWRNb3JwaHMpIHsKKyAgICAgICAgLy8gSW4gdGhpcyBicmFuY2ggd2UgYXJlIGRlYWxpbmcgd2l0
aCBhIGR1cGxpY2F0ZSBrZXkuIFRoZSBzdHJhdGVneQorICAgICAgICAvLyBpcyB0byB0YWtlIHRo
ZSBvcmlnaW5hbCBrZXkgYW5kIGFwcGVuZCBhIGNvdW50ZXIgdG8gaXQgdGhhdCBpcworICAgICAg
ICAvLyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBrZXkgaXMgcmV1c2VkLiBJbiBvcmRlciB0
byBncmVhdGx5CisgICAgICAgIC8vIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGNvbGxpZGluZyB3aXRo
IGFub3RoZXIgdmFsaWQga2V5IHdlIGFsc28gYWRkCisgICAgICAgIC8vIGFuIGV4dHJhIHN0cmlu
ZyAiLS16OG1TMmh2RFcwQS0tIiB0byB0aGUgbmV3IGtleS4KKyAgICAgICAgdmFyIGNvbGxpc2lv
bnMgPSByZW5kZXJTdGF0ZS5jb2xsaXNpb25zOworICAgICAgICBpZiAoY29sbGlzaW9ucyA9PT0g
dW5kZWZpbmVkKSB7CisgICAgICAgICAgY29sbGlzaW9ucyA9IHJlbmRlclN0YXRlLmNvbGxpc2lv
bnMgPSB7fTsKKyAgICAgICAgfQorICAgICAgICB2YXIgY291bnQgPSBjb2xsaXNpb25zW19rZXld
IHwgMDsKKyAgICAgICAgY29sbGlzaW9uc1tfa2V5XSA9ICsrY291bnQ7CisKKyAgICAgICAga2V5
ID0gX2tleSArICctLXo4bVMyaHZEVzBBLS0nICsgY291bnQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBrZXkgPSBfa2V5OworICAgICAgfQorCisgICAgICBpZiAoY3VycmVudE1vcnBoICYmIGN1
cnJlbnRNb3JwaC5rZXkgPT09IGtleSkgeworICAgICAgICB5aWVsZFRlbXBsYXRlKHRlbXBsYXRl
LCBlbnYsIHBhcmVudFNjb3BlLCBjdXJyZW50TW9ycGgsIHJlbmRlclN0YXRlLCB2aXNpdG9yKShi
bG9ja0FyZ3VtZW50cywgc2VsZik7CisgICAgICAgIGN1cnJlbnRNb3JwaCA9IGN1cnJlbnRNb3Jw
aC5uZXh0TW9ycGg7CisgICAgICAgIGhhbmRsZWRNb3JwaHNba2V5XSA9IGN1cnJlbnRNb3JwaDsK
KyAgICAgIH0gZWxzZSBpZiAobW9ycGhNYXBba2V5XSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAg
IHZhciBmb3VuZE1vcnBoID0gbW9ycGhNYXBba2V5XTsKKworICAgICAgICBpZiAoa2V5IGluIGNh
bmRpZGF0ZXMpIHsKKyAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IHNhdyB0aGlzIG1vcnBoLCBt
b3ZlIGl0IGZvcndhcmQgdG8gdGhpcyBwb3NpdGlvbgorICAgICAgICAgIG1vcnBoTGlzdC5pbnNl
cnRCZWZvcmVNb3JwaChmb3VuZE1vcnBoLCBjdXJyZW50TW9ycGgpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgIC8vIE90aGVyd2lzZSwgbW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkIHRvIHRo
ZSBleGlzdGluZyBtb3JwaCBmb3IgdGhpcyBrZXkKKyAgICAgICAgICBhZHZhbmNlVG9LZXkoa2V5
KTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWRNb3JwaHNbZm91bmRNb3JwaC5rZXldID0g
Zm91bmRNb3JwaDsKKyAgICAgICAgeWllbGRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZW52LCBwYXJlbnRT
Y29wZSwgZm91bmRNb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3IpKGJsb2NrQXJndW1lbnRzLCBz
ZWxmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBjaGlsZE1vcnBoID0gX2h0bWxiYXJz
UnVudGltZVJlbmRlci5jcmVhdGVDaGlsZE1vcnBoKGVudi5kb20sIG1vcnBoKTsKKyAgICAgICAg
Y2hpbGRNb3JwaC5rZXkgPSBrZXk7CisgICAgICAgIG1vcnBoTWFwW2tleV0gPSBoYW5kbGVkTW9y
cGhzW2tleV0gPSBjaGlsZE1vcnBoOworICAgICAgICBtb3JwaExpc3QuaW5zZXJ0QmVmb3JlTW9y
cGgoY2hpbGRNb3JwaCwgY3VycmVudE1vcnBoKTsKKyAgICAgICAgeWllbGRUZW1wbGF0ZSh0ZW1w
bGF0ZSwgZW52LCBwYXJlbnRTY29wZSwgY2hpbGRNb3JwaCwgcmVuZGVyU3RhdGUsIHZpc2l0b3Ip
KGJsb2NrQXJndW1lbnRzLCBzZWxmKTsKKyAgICAgIH0KKworICAgICAgcmVuZGVyU3RhdGUubW9y
cGhMaXN0VG9QcnVuZSA9IG1vcnBoTGlzdDsKKyAgICAgIG1vcnBoLmNoaWxkTm9kZXMgPSBudWxs
OworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBpc1N0YWJsZVRlbXBsYXRlKHRlbXBsYXRlLCBs
YXN0WWllbGRlZCkgeworICAgIHJldHVybiAhbGFzdFlpZWxkZWQuc2hhZG93VGVtcGxhdGUgJiYg
dGVtcGxhdGUgPT09IGxhc3RZaWVsZGVkLnRlbXBsYXRlOworICB9CisgIGZ1bmN0aW9uIG9wdGlv
bnNGb3IodGVtcGxhdGUsIGludmVyc2UsIGVudiwgc2NvcGUsIG1vcnBoLCB2aXNpdG9yKSB7Cisg
ICAgLy8gSWYgdGhlcmUgd2FzIGEgdGVtcGxhdGUgeWllbGRlZCBsYXN0IHRpbWUsIHNldCBtb3Jw
aFRvQ2xlYXIgc28gaXQgd2lsbCBiZSBjbGVhcmVkCisgICAgLy8gaWYgbm8gdGVtcGxhdGUgaXMg
eWllbGRlZCBvbiB0aGlzIHJlbmRlci4KKyAgICB2YXIgbW9ycGhUb0NsZWFyID0gbW9ycGgubGFz
dFJlc3VsdCA/IG1vcnBoIDogbnVsbDsKKyAgICB2YXIgcmVuZGVyU3RhdGUgPSBuZXcgX2h0bWxi
YXJzVXRpbFRlbXBsYXRlVXRpbHMuUmVuZGVyU3RhdGUobW9ycGhUb0NsZWFyLCBtb3JwaC5tb3Jw
aExpc3QgfHwgbnVsbCk7CisKKyAgICByZXR1cm4geworICAgICAgdGVtcGxhdGVzOiB7CisgICAg
ICAgIHRlbXBsYXRlOiB3cmFwRm9ySGVscGVyKHRlbXBsYXRlLCBlbnYsIHNjb3BlLCBtb3JwaCwg
cmVuZGVyU3RhdGUsIHZpc2l0b3IpLAorICAgICAgICBpbnZlcnNlOiB3cmFwRm9ySGVscGVyKGlu
dmVyc2UsIGVudiwgc2NvcGUsIG1vcnBoLCByZW5kZXJTdGF0ZSwgdmlzaXRvcikKKyAgICAgIH0s
CisgICAgICByZW5kZXJTdGF0ZTogcmVuZGVyU3RhdGUKKyAgICB9OworICB9CisKKyAgZnVuY3Rp
b24gdGhpc0ZvcihvcHRpb25zKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGFyaXR5OiBvcHRpb25z
LnRlbXBsYXRlLmFyaXR5LAorICAgICAgJ3lpZWxkJzogb3B0aW9ucy50ZW1wbGF0ZS55aWVsZCwg
Ly8gcXVvdGVkIHNpbmNlIGl0J3MgYSByZXNlcnZlZCB3b3JkLCBzZWUgaXNzdWUgIzQyMAorICAg
ICAgeWllbGRJdGVtOiBvcHRpb25zLnRlbXBsYXRlLnlpZWxkSXRlbSwKKyAgICAgIHlpZWxkSW46
IG9wdGlvbnMudGVtcGxhdGUueWllbGRJbgorICAgIH07CisgIH0KKworICAvKioKKyAgICBIb3N0
IEhvb2s6IGNyZWF0ZVNjb3BlCisgIAorICAgIEBwYXJhbSB7U2NvcGU/fSBwYXJlbnRTY29wZQor
ICAgIEByZXR1cm4gU2NvcGUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG8gZW50ZXJpbmcgYSBuZXcg
SFRNTEJhcnMgYmxvY2suCisgIAorICAgIFRoaXMgaG9vayBpcyBpbnZva2VkIHdoZW4gYSBibG9j
ayBpcyBlbnRlcmVkIHdpdGgKKyAgICBhIG5ldyBgc2VsZmAgb3IgYWRkaXRpb25hbCBsb2NhbCB2
YXJpYWJsZXMuCisgIAorICAgIFdoZW4gaW52b2tlZCBmb3IgYSB0b3AtbGV2ZWwgdGVtcGxhdGUs
IHRoZQorICAgIGBwYXJlbnRTY29wZWAgaXMgYG51bGxgLCBhbmQgdGhpcyBob29rIHNob3VsZCBy
ZXR1cm4KKyAgICBhIGZyZXNoIFNjb3BlLgorICAKKyAgICBXaGVuIGludm9rZWQgZm9yIGEgY2hp
bGQgdGVtcGxhdGUsIHRoZSBgcGFyZW50U2NvcGVgCisgICAgaXMgdGhlIHNjb3BlIGZvciB0aGUg
cGFyZW50IGVudmlyb25tZW50LgorICAKKyAgICBOb3RlIHRoYXQgdGhlIGBTY29wZWAgaXMgYW4g
b3BhcXVlIHZhbHVlIHRoYXQgaXMKKyAgICBwYXNzZWQgdG8gb3RoZXIgaG9zdCBob29rcy4gRm9y
IGV4YW1wbGUsIHRoZSBgZ2V0YAorICAgIGhvb2sgdXNlcyB0aGUgc2NvcGUgdG8gcmV0cmlldmUg
YSB2YWx1ZSBmb3IgYSBnaXZlbgorICAgIHNjb3BlIGFuZCB2YXJpYWJsZSBuYW1lLgorICAqLwor
CisgIGZ1bmN0aW9uIGNyZWF0ZVNjb3BlKGVudiwgcGFyZW50U2NvcGUpIHsKKyAgICBpZiAocGFy
ZW50U2NvcGUpIHsKKyAgICAgIHJldHVybiBlbnYuaG9va3MuY3JlYXRlQ2hpbGRTY29wZShwYXJl
bnRTY29wZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbnYuaG9va3MuY3JlYXRlRnJl
c2hTY29wZSgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUZyZXNoU2NvcGUoKSB7
CisgICAgLy8gYmVjYXVzZSBgaW5gIGNoZWNrcyBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFu
Y2UsIGtlZXAgYQorICAgIC8vIHNlcGFyYXRlIGRpY3Rpb25hcnkgdG8gdHJhY2sgd2hldGhlciBh
IGxvY2FsIHdhcyBib3VuZC4KKyAgICAvLyBTZWUgYGJpbmRMb2NhbGAgZm9yIG1vcmUgaW5mb3Jt
YXRpb24uCisgICAgcmV0dXJuIHsgc2VsZjogbnVsbCwgYmxvY2tzOiB7fSwgbG9jYWxzOiB7fSwg
bG9jYWxQcmVzZW50OiB7fSB9OworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kU2hh
ZG93U2NvcGUKKyAgCisgICAgQHBhcmFtIHtTY29wZT99IHBhcmVudFNjb3BlCisgICAgQHJldHVy
biBTY29wZQorICAKKyAgICBDb3JyZXNwb25kcyB0byByZW5kZXJpbmcgYSBuZXcgdGVtcGxhdGUg
aW50byBhbiBleGlzdGluZworICAgIHJlbmRlciB0cmVlLCBidXQgd2l0aCBhIG5ldyB0b3AtbGV2
ZWwgbGV4aWNhbCBzY29wZS4gVGhpcworICAgIHRlbXBsYXRlIGlzIGNhbGxlZCB0aGUgInNoYWRv
dyByb290Ii4KKyAgCisgICAgSWYgYSBzaGFkb3cgdGVtcGxhdGUgaW52b2tlcyBge3t5aWVsZH19
YCwgaXQgd2lsbCByZW5kZXIKKyAgICB0aGUgYmxvY2sgcHJvdmlkZWQgdG8gdGhlIHNoYWRvdyBy
b290IGluIHRoZSBvcmlnaW5hbAorICAgIGxleGljYWwgc2NvcGUuCisgIAorICAgIGBgYGhicwor
ICAgIHt7IS0tIHBvc3QgdGVtcGxhdGUgLS19fQorICAgIDxwPnt7cHJvcHMudGl0bGV9fTwvcD4K
KyAgICB7e3lpZWxkfX0KKyAgCisgICAge3shLS0gYmxvZyB0ZW1wbGF0ZSAtLX19CisgICAge3sj
cG9zdCB0aXRsZT0iSGVsbG8gd29ybGQifX0KKyAgICAgIDxwPmJ5IHt7YnlsaW5lfX08L3A+Cisg
ICAgICA8YXJ0aWNsZT5UaGlzIGlzIG15IGZpcnN0IHBvc3Q8L2FydGljbGU+CisgICAge3svcG9z
dH19CisgIAorICAgIHt7I3Bvc3QgdGl0bGU9Ikdvb2RieWUgd29ybGQifX0KKyAgICAgIDxwPmJ5
IHt7YnlsaW5lfX08L3A+CisgICAgICA8YXJ0aWNsZT5UaGlzIGlzIG15IGxhc3QgcG9zdDwvYXJ0
aWNsZT4KKyAgICB7ey9wb3N0fX0KKyAgICBgYGAKKyAgCisgICAgYGBganMKKyAgICBoZWxwZXJz
LnBvc3QgPSBmdW5jdGlvbihwYXJhbXMsIGhhc2gsIG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMu
dGVtcGxhdGUueWllbGRJbihwb3N0VGVtcGxhdGUsIHsgcHJvcHM6IGhhc2ggfSk7CisgICAgfTsK
KyAgCisgICAgYmxvZy5yZW5kZXIoeyBieWxpbmU6ICJZZWh1ZGEgS2F0eiIgfSk7CisgICAgYGBg
CisgIAorICAgIFByb2R1Y2VzOgorICAKKyAgICBgYGBodG1sCisgICAgPHA+SGVsbG8gd29ybGQ8
L3A+CisgICAgPHA+YnkgWWVodWRhIEthdHo8L3A+CisgICAgPGFydGljbGU+VGhpcyBpcyBteSBm
aXJzdCBwb3N0PC9hcnRpY2xlPgorICAKKyAgICA8cD5Hb29kYnllIHdvcmxkPC9wPgorICAgIDxw
PmJ5IFllaHVkYSBLYXR6PC9wPgorICAgIDxhcnRpY2xlPlRoaXMgaXMgbXkgbGFzdCBwb3N0PC9h
cnRpY2xlPgorICAgIGBgYAorICAKKyAgICBJbiBzaG9ydCwgYHlpZWxkSW5gIGNyZWF0ZXMgYSBu
ZXcgdG9wLWxldmVsIHNjb3BlIGZvciB0aGUKKyAgICBwcm92aWRlZCB0ZW1wbGF0ZSBhbmQgcmVu
ZGVycyBpdCwgbWFraW5nIHRoZSBvcmlnaW5hbCBibG9jaworICAgIGF2YWlsYWJsZSB0byBge3t5
aWVsZH19YCBpbiB0aGF0IHRlbXBsYXRlLgorICAqLworCisgIGZ1bmN0aW9uIGJpbmRTaGFkb3dT
Y29wZShlbnYgLyosIHBhcmVudFNjb3BlLCBzaGFkb3dTY29wZSAqLykgeworICAgIHJldHVybiBl
bnYuaG9va3MuY3JlYXRlRnJlc2hTY29wZSgpOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlQ2hp
bGRTY29wZShwYXJlbnQpIHsKKyAgICB2YXIgc2NvcGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7
CisgICAgc2NvcGUubG9jYWxzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQubG9jYWxzKTsKKyAgICBz
Y29wZS5sb2NhbFByZXNlbnQgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5sb2NhbFByZXNlbnQpOwor
ICAgIHNjb3BlLmJsb2NrcyA9IE9iamVjdC5jcmVhdGUocGFyZW50LmJsb2Nrcyk7CisgICAgcmV0
dXJuIHNjb3BlOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kU2VsZgorICAKKyAg
ICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7YW55fSBzZWxmCisgIAorICAgIENv
cnJlc3BvbmRzIHRvIGVudGVyaW5nIGEgdGVtcGxhdGUuCisgIAorICAgIFRoaXMgaG9vayBpcyBp
bnZva2VkIHdoZW4gdGhlIGBzZWxmYCB2YWx1ZSBmb3IgYSBzY29wZSBpcyByZWFkeSB0byBiZSBi
b3VuZC4KKyAgCisgICAgVGhlIGhvc3QgbXVzdCBlbnN1cmUgdGhhdCBjaGlsZCBzY29wZXMgcmVm
bGVjdCB0aGUgY2hhbmdlIHRvIHRoZSBgc2VsZmAgaW4KKyAgICBmdXR1cmUgY2FsbHMgdG8gdGhl
IGBnZXRgIGhvb2suCisgICovCisKKyAgZnVuY3Rpb24gYmluZFNlbGYoZW52LCBzY29wZSwgc2Vs
ZikgeworICAgIHNjb3BlLnNlbGYgPSBzZWxmOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlU2Vs
ZihlbnYsIHNjb3BlLCBzZWxmKSB7CisgICAgZW52Lmhvb2tzLmJpbmRTZWxmKGVudiwgc2NvcGUs
IHNlbGYpOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBiaW5kTG9jYWwKKyAgCisgICAg
QHBhcmFtIHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBA
cGFyYW0ge1N0cmluZ30gbmFtZQorICAgIEBwYXJhbSB7YW55fSB2YWx1ZQorICAKKyAgICBDb3Jy
ZXNwb25kcyB0byBlbnRlcmluZyBhIHRlbXBsYXRlIHdpdGggYmxvY2sgYXJndW1lbnRzLgorICAK
KyAgICBUaGlzIGhvb2sgaXMgaW52b2tlZCB3aGVuIGEgbG9jYWwgdmFyaWFibGUgZm9yIGEgc2Nv
cGUgaGFzIGJlZW4gcHJvdmlkZWQuCisgIAorICAgIFRoZSBob3N0IG11c3QgZW5zdXJlIHRoYXQg
Y2hpbGQgc2NvcGVzIHJlZmxlY3QgdGhlIGNoYW5nZSBpbiBmdXR1cmUgY2FsbHMKKyAgICB0byB0
aGUgYGdldGAgaG9vay4KKyAgKi8KKworICBmdW5jdGlvbiBiaW5kTG9jYWwoZW52LCBzY29wZSwg
bmFtZSwgdmFsdWUpIHsKKyAgICBzY29wZS5sb2NhbFByZXNlbnRbbmFtZV0gPSB0cnVlOworICAg
IHNjb3BlLmxvY2Fsc1tuYW1lXSA9IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlTG9j
YWwoZW52LCBzY29wZSwgbmFtZSwgdmFsdWUpIHsKKyAgICBlbnYuaG9va3MuYmluZExvY2FsKGVu
diwgc2NvcGUsIG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgSG9vazogYmlu
ZEJsb2NrCisgIAorICAgIEBwYXJhbSB7RW52aXJvbm1lbnR9IGVudgorICAgIEBwYXJhbSB7U2Nv
cGV9IHNjb3BlCisgICAgQHBhcmFtIHtGdW5jdGlvbn0gYmxvY2sKKyAgCisgICAgQ29ycmVzcG9u
ZHMgdG8gZW50ZXJpbmcgYSBzaGFkb3cgdGVtcGxhdGUgdGhhdCB3YXMgaW52b2tlZCBieSBhIGJs
b2NrIGhlbHBlciB3aXRoCisgICAgYHlpZWxkSW5gLgorICAKKyAgICBUaGlzIGhvb2sgaXMgaW52
b2tlZCB3aXRoIGFuIG9wYXF1ZSBibG9jayB0aGF0IHdpbGwgYmUgcGFzc2VkIGFsb25nCisgICAg
dG8gdGhlIHNoYWRvdyB0ZW1wbGF0ZSwgYW5kIGluc2VydGVkIGludG8gdGhlIHNoYWRvdyB0ZW1w
bGF0ZSB3aGVuCisgICAgYHt7eWllbGR9fWAgaXMgdXNlZC4gT3B0aW9uYWxseSBwcm92aWRlIGEg
bm9uLWRlZmF1bHQgYmxvY2sgbmFtZQorICAgIHRoYXQgY2FuIGJlIHRhcmdldGVkIGJ5IGB7e3lp
ZWxkIHRvPWJsb2NrTmFtZX19YC4KKyAgKi8KKworICBmdW5jdGlvbiBiaW5kQmxvY2soZW52LCBz
Y29wZSwgYmxvY2spIHsKKyAgICB2YXIgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBh
cmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/ICdkZWZhdWx0JyA6IGFyZ3VtZW50c1szXTsKKwor
ICAgIHNjb3BlLmJsb2Nrc1tuYW1lXSA9IGJsb2NrOworICB9CisKKyAgLyoqCisgICAgSG9zdCBI
b29rOiBibG9jaworICAKKyAgICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBA
cGFyYW0ge0Vudmlyb25tZW50fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBw
YXJhbSB7U3RyaW5nfSBwYXRoCisgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1zCisgICAgQHBhcmFt
IHtPYmplY3R9IGhhc2gKKyAgICBAcGFyYW0ge0Jsb2NrfSBibG9jaworICAgIEBwYXJhbSB7Qmxv
Y2t9IGVsc2VCbG9jaworICAKKyAgICBDb3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisg
ICAge3sjaGVscGVyIHBhcmFtMSBwYXJhbTIga2V5MT12YWwxIGtleTI9dmFsMn19CisgICAgICB7
eyEtLSBjaGlsZCB0ZW1wbGF0ZSAtLX19CisgICAge3svaGVscGVyfX0KKyAgICBgYGAKKyAgCisg
ICAgVGhpcyBob3N0IGhvb2sgaXMgYSB3b3JraG9yc2Ugb2YgdGhlIHN5c3RlbS4gSXQgaXMgaW52
b2tlZAorICAgIHdoZW5ldmVyIGEgYmxvY2sgaXMgZW5jb3VudGVyZWQsIGFuZCBpcyByZXNwb25z
aWJsZSBmb3IKKyAgICByZXNvbHZpbmcgdGhlIGhlbHBlciB0byBjYWxsLCBhbmQgdGhlbiBpbnZv
a2UgaXQuCisgIAorICAgIFRoZSBoZWxwZXIgc2hvdWxkIGJlIGludm9rZWQgd2l0aDoKKyAgCisg
ICAgLSBge0FycmF5fSBwYXJhbXNgOiB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGhlbHBl
cgorICAgICAgaW4gdGhlIHRlbXBsYXRlLgorICAgIC0gYHtPYmplY3R9IGhhc2hgOiBhbiBvYmpl
Y3QgY29udGFpbmluZyB0aGUga2V5cyBhbmQgdmFsdWVzIHBhc3NlZAorICAgICAgaW4gdGhlIGhh
c2ggcG9zaXRpb24gaW4gdGhlIHRlbXBsYXRlLgorICAKKyAgICBUaGUgdmFsdWVzIGluIGBwYXJh
bXNgIGFuZCBgaGFzaGAgd2lsbCBhbHJlYWR5IGJlIHJlc29sdmVkCisgICAgdGhyb3VnaCBhIHBy
ZXZpb3VzIGNhbGwgdG8gdGhlIGBnZXRgIGhvc3QgaG9vay4KKyAgCisgICAgVGhlIGhlbHBlciBz
aG91bGQgYmUgaW52b2tlZCB3aXRoIGEgYHRoaXNgIHZhbHVlIHRoYXQgaXMKKyAgICBhbiBvYmpl
Y3Qgd2l0aCBvbmUgZmllbGQ6CisgIAorICAgIGB7RnVuY3Rpb259IHlpZWxkYDogd2hlbiBpbnZv
a2VkLCB0aGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZQorICAgIGJsb2NrIHdpdGggdGhlIGN1cnJl
bnQgc2NvcGUuIEl0IHRha2VzIGFuIG9wdGlvbmFsIGFycmF5IG9mCisgICAgYmxvY2sgcGFyYW1l
dGVycy4gSWYgYmxvY2sgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQsIEhUTUxCYXJzCisgICAgd2ls
bCBpbnZva2UgdGhlIGBiaW5kTG9jYWxgIGhvc3QgaG9vayB0byBiaW5kIHRoZSBzdXBwbGllZAor
ICAgIHZhbHVlcyB0byB0aGUgYmxvY2sgYXJndW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSB0ZW1wbGF0
ZS4KKyAgCisgICAgSW4gZ2VuZXJhbCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYGJs
b2NrYCBzaG91bGQgd29yaworICAgIGZvciBtb3N0IGhvc3QgZW52aXJvbm1lbnRzLiBJdCBkZWxl
Z2F0ZXMgdG8gb3RoZXIgaG9zdCBob29rcworICAgIHdoZXJlIGFwcHJvcHJpYXRlLCBhbmQgcHJv
cGVybHkgaW52b2tlcyB0aGUgaGVscGVyIHdpdGggdGhlCisgICAgYXBwcm9wcmlhdGUgYXJndW1l
bnRzLgorICAqLworCisgIGZ1bmN0aW9uIGJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBw
YXJhbXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSB7CisgICAgaWYgKGhhbmRs
ZVJlZGlyZWN0KG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXMsIGhhc2gsIHRlbXBsYXRl
LCBpbnZlcnNlLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRp
bnVlQmxvY2sobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUs
IGludmVyc2UsIHZpc2l0b3IpOworICB9CisKKyAgZnVuY3Rpb24gY29udGludWVCbG9jayhtb3Jw
aCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlz
aXRvcikgeworICAgIGhvc3RCbG9jayhtb3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIGludmVy
c2UsIG51bGwsIHZpc2l0b3IsIGZ1bmN0aW9uIChvcHRpb25zKSB7CisgICAgICB2YXIgaGVscGVy
ID0gZW52Lmhvb2tzLmxvb2t1cEhlbHBlcihlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICAgIHJldHVy
biBlbnYuaG9va3MuaW52b2tlSGVscGVyKG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yLCBwYXJh
bXMsIGhhc2gsIGhlbHBlciwgb3B0aW9ucy50ZW1wbGF0ZXMsIHRoaXNGb3Iob3B0aW9ucy50ZW1w
bGF0ZXMpKTsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGhvc3RCbG9jayhtb3JwaCwgZW52
LCBzY29wZSwgdGVtcGxhdGUsIGludmVyc2UsIHNoYWRvd09wdGlvbnMsIHZpc2l0b3IsIGNhbGxi
YWNrKSB7CisgICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zRm9yKHRlbXBsYXRlLCBpbnZlcnNlLCBl
bnYsIHNjb3BlLCBtb3JwaCwgdmlzaXRvcik7CisgICAgX2h0bWxiYXJzVXRpbFRlbXBsYXRlVXRp
bHMucmVuZGVyQW5kQ2xlYW51cChtb3JwaCwgZW52LCBvcHRpb25zLCBzaGFkb3dPcHRpb25zLCBj
YWxsYmFjayk7CisgIH0KKworICBmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBz
Y29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcikgewor
ICAgIGlmICghcGF0aCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZhciBy
ZWRpcmVjdCA9IGVudi5ob29rcy5jbGFzc2lmeShlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICBpZiAo
cmVkaXJlY3QpIHsKKyAgICAgIHN3aXRjaCAocmVkaXJlY3QpIHsKKyAgICAgICAgY2FzZSAnY29t
cG9uZW50JzoKKyAgICAgICAgICBlbnYuaG9va3MuY29tcG9uZW50KG1vcnBoLCBlbnYsIHNjb3Bl
LCBwYXRoLCBwYXJhbXMsIGhhc2gsIHsgZGVmYXVsdDogdGVtcGxhdGUsIGludmVyc2U6IGludmVy
c2UgfSwgdmlzaXRvcik7YnJlYWs7CisgICAgICAgIGNhc2UgJ2lubGluZSc6CisgICAgICAgICAg
ZW52Lmhvb2tzLmlubGluZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB2
aXNpdG9yKTticmVhazsKKyAgICAgICAgY2FzZSAnYmxvY2snOgorICAgICAgICAgIGVudi5ob29r
cy5ibG9jayhtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwg
aW52ZXJzZSwgdmlzaXRvcik7YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJJbnRlcm5hbCBIVE1MQmFycyByZWRpcmVjdGlvbiB0byAiICsgcmVkaXJl
Y3QgKyAiIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGlmIChoYW5kbGVLZXl3b3JkKHBhdGgsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJh
bXMsIGhhc2gsIHRlbXBsYXRlLCBpbnZlcnNlLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZnVuY3Rpb24gaGFuZGxl
S2V5d29yZChwYXRoLCBtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwg
aW52ZXJzZSwgdmlzaXRvcikgeworICAgIHZhciBrZXl3b3JkID0gZW52Lmhvb2tzLmtleXdvcmRz
W3BhdGhdOworICAgIGlmICgha2V5d29yZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIGlmICh0eXBlb2Yga2V5d29yZCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgcmV0dXJu
IGtleXdvcmQobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVy
c2UsIHZpc2l0b3IpOworICAgIH0KKworICAgIGlmIChrZXl3b3JkLndpbGxSZW5kZXIpIHsKKyAg
ICAgIGtleXdvcmQud2lsbFJlbmRlcihtb3JwaCwgZW52KTsKKyAgICB9CisKKyAgICB2YXIgbGFz
dFN0YXRlLCBuZXdTdGF0ZTsKKyAgICBpZiAoa2V5d29yZC5zZXR1cFN0YXRlKSB7CisgICAgICBs
YXN0U3RhdGUgPSBfaHRtbGJhcnNVdGlsT2JqZWN0VXRpbHMuc2hhbGxvd0NvcHkobW9ycGguZ2V0
U3RhdGUoKSk7CisgICAgICBuZXdTdGF0ZSA9IG1vcnBoLnNldFN0YXRlKGtleXdvcmQuc2V0dXBT
dGF0ZShsYXN0U3RhdGUsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCkpOworICAgIH0KKworICAg
IGlmIChrZXl3b3JkLmNoaWxkRW52KSB7CisgICAgICAvLyBCdWlsZCB0aGUgY2hpbGQgZW52aXJv
bm1lbnQuLi4KKyAgICAgIGVudiA9IGtleXdvcmQuY2hpbGRFbnYobW9ycGguZ2V0U3RhdGUoKSwg
ZW52KTsKKworICAgICAgLy8gLi50aGVuIHNhdmUgb2ZmIHRoZSBjaGlsZCBlbnYgYnVpbGRlciBv
biB0aGUgcmVuZGVyIG5vZGUuIElmIHRoZSByZW5kZXIKKyAgICAgIC8vIG5vZGUgdHJlZSBpcyBy
ZS1yZW5kZXJlZCBhbmQgdGhpcyBub2RlIGlzIG5vdCBkaXJ0eSwgdGhlIGNoaWxkIGVudgorICAg
ICAgLy8gYnVpbGRlciB3aWxsIHN0aWxsIGJlIGludm9rZWQgc28gdGhhdCBjaGlsZCBkaXJ0eSBy
ZW5kZXIgbm9kZXMgc3RpbGwgZ2V0CisgICAgICAvLyB0aGUgY29ycmVjdCBjaGlsZCBlbnYuCisg
ICAgICBtb3JwaC5idWlsZENoaWxkRW52ID0ga2V5d29yZC5jaGlsZEVudjsKKyAgICB9CisKKyAg
ICB2YXIgZmlyc3RUaW1lID0gIW1vcnBoLnJlbmRlcmVkOworCisgICAgaWYgKGtleXdvcmQuaXNF
bXB0eSkgeworICAgICAgdmFyIGlzRW1wdHkgPSBrZXl3b3JkLmlzRW1wdHkobW9ycGguZ2V0U3Rh
dGUoKSwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgaWYgKGlzRW1wdHkpIHsK
KyAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHsKKyAgICAgICAgICBfaHRtbGJhcnNVdGlsVGVtcGxh
dGVVdGlscy5jbGVhck1vcnBoKG1vcnBoLCBlbnYsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlyc3RUaW1lKSB7Cisg
ICAgICBpZiAoa2V5d29yZC5yZW5kZXIpIHsKKyAgICAgICAga2V5d29yZC5yZW5kZXIobW9ycGgs
IGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOwor
ICAgICAgfQorICAgICAgbW9ycGgucmVuZGVyZWQgPSB0cnVlOworICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgdmFyIGlzU3RhYmxlOworICAgIGlmIChrZXl3b3JkLmlzU3RhYmxlKSB7
CisgICAgICBpc1N0YWJsZSA9IGtleXdvcmQuaXNTdGFibGUobGFzdFN0YXRlLCBuZXdTdGF0ZSk7
CisgICAgfSBlbHNlIHsKKyAgICAgIGlzU3RhYmxlID0gc3RhYmxlU3RhdGUobGFzdFN0YXRlLCBu
ZXdTdGF0ZSk7CisgICAgfQorCisgICAgaWYgKGlzU3RhYmxlKSB7CisgICAgICBpZiAoa2V5d29y
ZC5yZXJlbmRlcikgeworICAgICAgICB2YXIgbmV3RW52ID0ga2V5d29yZC5yZXJlbmRlcihtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7
CisgICAgICAgIGVudiA9IG5ld0VudiB8fCBlbnY7CisgICAgICB9CisgICAgICBfaHRtbGJhcnNV
dGlsTW9ycGhVdGlscy52YWxpZGF0ZUNoaWxkTW9ycGhzKGVudiwgbW9ycGgsIHZpc2l0b3IpOwor
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIF9odG1sYmFyc1V0aWxUZW1w
bGF0ZVV0aWxzLmNsZWFyTW9ycGgobW9ycGgsIGVudiwgZmFsc2UpOworICAgIH0KKworICAgIC8v
IElmIHRoZSBub2RlIGlzIHVuc3RhYmxlLCByZS1yZW5kZXIgZnJvbSBzY3JhdGNoCisgICAgaWYg
KGtleXdvcmQucmVuZGVyKSB7CisgICAgICBrZXl3b3JkLnJlbmRlcihtb3JwaCwgZW52LCBzY29w
ZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwgdmlzaXRvcik7CisgICAgICBtb3Jw
aC5yZW5kZXJlZCA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBm
dW5jdGlvbiBzdGFibGVTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpIHsKKyAgICBpZiAoX2h0bWxi
YXJzVXRpbE9iamVjdFV0aWxzLmtleUxlbmd0aChvbGRTdGF0ZSkgIT09IF9odG1sYmFyc1V0aWxP
YmplY3RVdGlscy5rZXlMZW5ndGgobmV3U3RhdGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgZm9yICh2YXIgcHJvcCBpbiBvbGRTdGF0ZSkgeworICAgICAgaWYgKG9sZFN0
YXRlW3Byb3BdICE9PSBuZXdTdGF0ZVtwcm9wXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmdW5jdGlvbiBsaW5r
UmVuZGVyTm9kZSgpIC8qIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJhbXMsIGhhc2ggKi97CisgICAg
cmV0dXJuOworICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBpbmxpbmUKKyAgCisgICAgQHBh
cmFtIHtSZW5kZXJOb2RlfSByZW5kZXJOb2RlCisgICAgQHBhcmFtIHtFbnZpcm9ubWVudH0gZW52
CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0ge1N0cmluZ30gcGF0aAorICAg
IEBwYXJhbSB7QXJyYXl9IHBhcmFtcworICAgIEBwYXJhbSB7SGFzaH0gaGFzaAorICAKKyAgICBD
b3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisgICAge3toZWxwZXIgcGFyYW0xIHBhcmFt
MiBrZXkxPXZhbDEga2V5Mj12YWwyfX0KKyAgICBgYGAKKyAgCisgICAgVGhpcyBob3N0IGhvb2sg
aXMgc2ltaWxhciB0byB0aGUgYGJsb2NrYCBob3N0IGhvb2ssIGJ1dCBpdAorICAgIGludm9rZXMg
aGVscGVycyB0aGF0IGRvIG5vdCBzdXBwbHkgYW4gYXR0YWNoZWQgYmxvY2suCisgIAorICAgIExp
a2UgdGhlIGBibG9ja2AgaG9vaywgdGhlIGhlbHBlciBzaG91bGQgYmUgaW52b2tlZCB3aXRoOgor
ICAKKyAgICAtIGB7QXJyYXl9IHBhcmFtc2A6IHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUg
aGVscGVyCisgICAgICBpbiB0aGUgdGVtcGxhdGUuCisgICAgLSBge09iamVjdH0gaGFzaGA6IGFu
IG9iamVjdCBjb250YWluaW5nIHRoZSBrZXlzIGFuZCB2YWx1ZXMgcGFzc2VkCisgICAgICBpbiB0
aGUgaGFzaCBwb3NpdGlvbiBpbiB0aGUgdGVtcGxhdGUuCisgIAorICAgIFRoZSB2YWx1ZXMgaW4g
YHBhcmFtc2AgYW5kIGBoYXNoYCB3aWxsIGFscmVhZHkgYmUgcmVzb2x2ZWQKKyAgICB0aHJvdWdo
IGEgcHJldmlvdXMgY2FsbCB0byB0aGUgYGdldGAgaG9zdCBob29rLgorICAKKyAgICBJbiBnZW5l
cmFsLCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaW5saW5lYCBzaG91bGQgd29yawor
ICAgIGZvciBtb3N0IGhvc3QgZW52aXJvbm1lbnRzLiBJdCBkZWxlZ2F0ZXMgdG8gb3RoZXIgaG9z
dCBob29rcworICAgIHdoZXJlIGFwcHJvcHJpYXRlLCBhbmQgcHJvcGVybHkgaW52b2tlcyB0aGUg
aGVscGVyIHdpdGggdGhlCisgICAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorICAKKyAgICBUaGUg
ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaW5saW5lYCBhbHNvIG1ha2VzIGBwYXJ0aWFsYAor
ICAgIGEga2V5d29yZC4gSW5zdGVhZCBvZiBpbnZva2luZyBhIGhlbHBlciBuYW1lZCBgcGFydGlh
bGAsCisgICAgaXQgaW52b2tlcyB0aGUgYHBhcnRpYWxgIGhvc3QgaG9vay4KKyAgKi8KKworICBm
dW5jdGlvbiBpbmxpbmUobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgdmlz
aXRvcikgeworICAgIGlmIChoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwg
cGFyYW1zLCBoYXNoLCBudWxsLCBudWxsLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIHZhciB2YWx1ZSA9IHVuZGVmaW5lZCwKKyAgICAgICAgaGFzVmFsdWUgPSB1bmRl
ZmluZWQ7CisgICAgaWYgKG1vcnBoLmxpbmtlZFJlc3VsdCkgeworICAgICAgdmFsdWUgPSBlbnYu
aG9va3MuZ2V0VmFsdWUobW9ycGgubGlua2VkUmVzdWx0KTsKKyAgICAgIGhhc1ZhbHVlID0gdHJ1
ZTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zRm9yKG51bGwsIG51
bGwsIGVudiwgc2NvcGUsIG1vcnBoKTsKKworICAgICAgdmFyIGhlbHBlciA9IGVudi5ob29rcy5s
b29rdXBIZWxwZXIoZW52LCBzY29wZSwgcGF0aCk7CisgICAgICB2YXIgcmVzdWx0ID0gZW52Lmhv
b2tzLmludm9rZUhlbHBlcihtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvciwgcGFyYW1zLCBoYXNo
LCBoZWxwZXIsIG9wdGlvbnMudGVtcGxhdGVzLCB0aGlzRm9yKG9wdGlvbnMudGVtcGxhdGVzKSk7
CisKKyAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmxpbmspIHsKKyAgICAgICAgbW9ycGgubGlu
a2VkUmVzdWx0ID0gcmVzdWx0LnZhbHVlOworICAgICAgICBfaHRtbGJhcnNVdGlsTW9ycGhVdGls
cy5saW5rUGFyYW1zKGVudiwgc2NvcGUsIG1vcnBoLCAnQGNvbnRlbnQtaGVscGVyJywgW21vcnBo
LmxpbmtlZFJlc3VsdF0sIG51bGwpOworICAgICAgfQorCisgICAgICBpZiAocmVzdWx0ICYmICd2
YWx1ZScgaW4gcmVzdWx0KSB7CisgICAgICAgIHZhbHVlID0gZW52Lmhvb2tzLmdldFZhbHVlKHJl
c3VsdC52YWx1ZSk7CisgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoaGFzVmFsdWUpIHsKKyAgICAgIGlmIChtb3JwaC5sYXN0VmFsdWUgIT09IHZhbHVl
KSB7CisgICAgICAgIG1vcnBoLnNldENvbnRlbnQodmFsdWUpOworICAgICAgfQorICAgICAgbW9y
cGgubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24ga2V5d29yZChw
YXRoLCBtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zLCBoYXNoLCB0ZW1wbGF0ZSwgaW52ZXJzZSwg
dmlzaXRvcikgeworICAgIGhhbmRsZUtleXdvcmQocGF0aCwgbW9ycGgsIGVudiwgc2NvcGUsIHBh
cmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0b3IpOworICB9CisKKyAgZnVuY3Rp
b24gaW52b2tlSGVscGVyKG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yLCBfcGFyYW1zLCBfaGFz
aCwgaGVscGVyLCB0ZW1wbGF0ZXMsIGNvbnRleHQpIHsKKyAgICB2YXIgcGFyYW1zID0gbm9ybWFs
aXplQXJyYXkoZW52LCBfcGFyYW1zKTsKKyAgICB2YXIgaGFzaCA9IG5vcm1hbGl6ZU9iamVjdChl
bnYsIF9oYXNoKTsKKyAgICByZXR1cm4geyB2YWx1ZTogaGVscGVyLmNhbGwoY29udGV4dCwgcGFy
YW1zLCBoYXNoLCB0ZW1wbGF0ZXMpIH07CisgIH0KKworICBmdW5jdGlvbiBub3JtYWxpemVBcnJh
eShlbnYsIGFycmF5KSB7CisgICAgdmFyIG91dCA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpOwor
CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAg
ICAgIG91dFtpXSA9IGVudi5ob29rcy5nZXRDZWxsT3JWYWx1ZShhcnJheVtpXSk7CisgICAgfQor
CisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChlbnYs
IG9iamVjdCkgeworICAgIHZhciBvdXQgPSB7fTsKKworICAgIGZvciAodmFyIHByb3AgaW4gb2Jq
ZWN0KSB7CisgICAgICBvdXRbcHJvcF0gPSBlbnYuaG9va3MuZ2V0Q2VsbE9yVmFsdWUob2JqZWN0
W3Byb3BdKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgZnVuY3Rpb24gY2xh
c3NpZnkoKSAvKiBlbnYsIHNjb3BlLCBwYXRoICoveworICAgIHJldHVybiBudWxsOworICB9CisK
KyAgdmFyIGtleXdvcmRzID0geworICAgIHBhcnRpYWw6IGZ1bmN0aW9uIChtb3JwaCwgZW52LCBz
Y29wZSwgcGFyYW1zKSB7CisgICAgICB2YXIgdmFsdWUgPSBlbnYuaG9va3MucGFydGlhbChtb3Jw
aCwgZW52LCBzY29wZSwgcGFyYW1zWzBdKTsKKyAgICAgIG1vcnBoLnNldENvbnRlbnQodmFsdWUp
OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8vIHF1b3RlZCBzaW5jZSBpdCdz
IGEgcmVzZXJ2ZWQgd29yZCwgc2VlIGlzc3VlICM0MjAKKyAgICAneWllbGQnOiBmdW5jdGlvbiAo
bW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcywgaGFzaCwgdGVtcGxhdGUsIGludmVyc2UsIHZpc2l0
b3IpIHsKKyAgICAgIC8vIHRoZSBjdXJyZW50IHNjb3BlIGlzIHByb3ZpZGVkIHB1cmVseSBmb3Ig
dGhlIGNyZWF0aW9uIG9mIHNoYWRvdworICAgICAgLy8gc2NvcGVzOyBpdCBzaG91bGQgbm90IGJl
IHByb3ZpZGVkIHRvIHVzZXIgY29kZS4KKworICAgICAgdmFyIHRvID0gZW52Lmhvb2tzLmdldFZh
bHVlKGhhc2gudG8pIHx8ICdkZWZhdWx0JzsKKyAgICAgIHZhciBibG9jayA9IGVudi5ob29rcy5n
ZXRCbG9jayhzY29wZSwgdG8pOworCisgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgYmxvY2su
aW52b2tlKGVudiwgcGFyYW1zLCBoYXNoLnNlbGYsIG1vcnBoLCBzY29wZSwgdmlzaXRvcik7Cisg
ICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgaGFzQmxvY2s6IGZ1bmN0
aW9uIChtb3JwaCwgZW52LCBzY29wZSwgcGFyYW1zKSB7CisgICAgICB2YXIgbmFtZSA9IGVudi5o
b29rcy5nZXRWYWx1ZShwYXJhbXNbMF0pIHx8ICdkZWZhdWx0JzsKKyAgICAgIHJldHVybiAhIWVu
di5ob29rcy5nZXRCbG9jayhzY29wZSwgbmFtZSk7CisgICAgfSwKKworICAgIGhhc0Jsb2NrUGFy
YW1zOiBmdW5jdGlvbiAobW9ycGgsIGVudiwgc2NvcGUsIHBhcmFtcykgeworICAgICAgdmFyIG5h
bWUgPSBlbnYuaG9va3MuZ2V0VmFsdWUocGFyYW1zWzBdKSB8fCAnZGVmYXVsdCc7CisgICAgICB2
YXIgYmxvY2sgPSBlbnYuaG9va3MuZ2V0QmxvY2soc2NvcGUsIG5hbWUpOworICAgICAgcmV0dXJu
ICEhKGJsb2NrICYmIGJsb2NrLmFyaXR5KTsKKyAgICB9CisKKyAgfTsKKworICBleHBvcnRzLmtl
eXdvcmRzID0ga2V5d29yZHM7CisgIC8qKgorICAgIEhvc3QgSG9vazogcGFydGlhbAorICAKKyAg
ICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBAcGFyYW0ge0Vudmlyb25tZW50
fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7U3RyaW5nfSBwYXRo
CisgIAorICAgIENvcnJlc3BvbmRzIHRvOgorICAKKyAgICBgYGBoYnMKKyAgICB7e3BhcnRpYWwg
ImxvY2F0aW9uIn19CisgICAgYGBgCisgIAorICAgIFRoaXMgaG9zdCBob29rIGlzIGludm9rZWQg
YnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YKKyAgICB0aGUgYGlubGluZWAgaG9vay4g
VGhpcyBtYWtlcyBgcGFydGlhbGAgYSBrZXl3b3JkIGluIGFuCisgICAgSFRNTEJhcnMgZW52aXJv
bm1lbnQgdXNpbmcgdGhlIGRlZmF1bHQgYGlubGluZWAgaG9zdCBob29rLgorICAKKyAgICBJdCBp
cyBpbXBsZW1lbnRlZCBhcyBhIGhvc3QgaG9vayBzbyB0aGF0IGl0IGNhbiByZXRyaWV2ZQorICAg
IHRoZSBuYW1lZCBwYXJ0aWFsIG91dCBvZiB0aGUgYEVudmlyb25tZW50YC4gSGVscGVycywgaW4K
KyAgICBjb250cmFzdCwgb25seSBoYXZlIGFjY2VzcyB0byB0aGUgdmFsdWVzIHBhc3NlZCBpbiB0
byB0aGVtLAorICAgIGFuZCBub3QgdG8gdGhlIGFtYmllbnQgbGV4aWNhbCBlbnZpcm9ubWVudC4K
KyAgCisgICAgVGhlIGhvc3QgaG9vayBzaG91bGQgaW52b2tlIHRoZSByZWZlcmVuY2VkIHBhcnRp
YWwgd2l0aAorICAgIHRoZSBhbWJpZW50IGBzZWxmYC4KKyAgKi8KKworICBmdW5jdGlvbiBwYXJ0
aWFsKHJlbmRlck5vZGUsIGVudiwgc2NvcGUsIHBhdGgpIHsKKyAgICB2YXIgdGVtcGxhdGUgPSBl
bnYucGFydGlhbHNbcGF0aF07CisgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihzY29wZS5zZWxm
LCBlbnYsIHt9KS5mcmFnbWVudDsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgaG9vazogcmFuZ2UK
KyAgCisgICAgQHBhcmFtIHtSZW5kZXJOb2RlfSByZW5kZXJOb2RlCisgICAgQHBhcmFtIHtFbnZp
cm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0ge2FueX0g
dmFsdWUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG86CisgIAorICAgIGBgYGhicworICAgIHt7Y29u
dGVudH19CisgICAge3t7dW5lc2NhcGVkfX19CisgICAgYGBgCisgIAorICAgIFRoaXMgaG9vayBp
cyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYSByZW5kZXIgbm9kZQorICAgIHRoYXQgcmVwcmVz
ZW50cyBhIHJhbmdlIG9mIGNvbnRlbnQgd2l0aCBhIHZhbHVlLgorICAqLworCisgIGZ1bmN0aW9u
IHJhbmdlKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCB2YWx1ZSwgdmlzaXRvcikgeworICAgIGlm
IChoYW5kbGVSZWRpcmVjdChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgW10sIHt9LCBudWxsLCBu
dWxsLCB2aXNpdG9yKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhbHVlID0gZW52
Lmhvb2tzLmdldFZhbHVlKHZhbHVlKTsKKworICAgIGlmIChtb3JwaC5sYXN0VmFsdWUgIT09IHZh
bHVlKSB7CisgICAgICBtb3JwaC5zZXRDb250ZW50KHZhbHVlKTsKKyAgICB9CisKKyAgICBtb3Jw
aC5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgIEhvc3QgaG9vazogZWxlbWVu
dAorICAKKyAgICBAcGFyYW0ge1JlbmRlck5vZGV9IHJlbmRlck5vZGUKKyAgICBAcGFyYW0ge0Vu
dmlyb25tZW50fSBlbnYKKyAgICBAcGFyYW0ge1Njb3BlfSBzY29wZQorICAgIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoCisgICAgQHBhcmFtIHtBcnJheX0gcGFyYW1zCisgICAgQHBhcmFtIHtIYXNofSBo
YXNoCisgIAorICAgIENvcnJlc3BvbmRzIHRvOgorICAKKyAgICBgYGBoYnMKKyAgICA8ZGl2IHt7
YmluZC1hdHRyIGZvbz1iYXJ9fT48L2Rpdj4KKyAgICBgYGAKKyAgCisgICAgVGhpcyBob29rIGlz
IHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyBhIGhlbHBlciB0aGF0CisgICAgbW9kaWZpZXMgYW4g
ZWxlbWVudC4KKyAgCisgICAgSXRzIHB1cnBvc2UgaXMgbGFyZ2VseSBsZWdhY3kgc3VwcG9ydCBm
b3IgYXdrd2FyZAorICAgIGlkaW9tcyB0aGF0IGJlY2FtZSBjb21tb24gd2hlbiB1c2luZyB0aGUg
c3RyaW5nLWJhc2VkCisgICAgSGFuZGxlYmFycyBlbmdpbmUuCisgIAorICAgIE1vc3Qgb2YgdGhl
IHVzZXMgb2YgdGhlIGBlbGVtZW50YCBob29rIGFyZSBleHBlY3RlZAorICAgIHRvIGJlIHN1cGVy
c2VkZWQgYnkgY29tcG9uZW50IHN5bnRheCBhbmQgdGhlCisgICAgYGF0dHJpYnV0ZWAgaG9vay4K
KyAgKi8KKworICBmdW5jdGlvbiBlbGVtZW50KG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJh
bXMsIGhhc2gsIHZpc2l0b3IpIHsKKyAgICBpZiAoaGFuZGxlUmVkaXJlY3QobW9ycGgsIGVudiwg
c2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCwgbnVsbCwgbnVsbCwgdmlzaXRvcikpIHsKKyAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaGVscGVyID0gZW52Lmhvb2tzLmxvb2t1cEhlbHBl
cihlbnYsIHNjb3BlLCBwYXRoKTsKKyAgICBpZiAoaGVscGVyKSB7CisgICAgICBlbnYuaG9va3Mu
aW52b2tlSGVscGVyKG51bGwsIGVudiwgc2NvcGUsIG51bGwsIHBhcmFtcywgaGFzaCwgaGVscGVy
LCB7IGVsZW1lbnQ6IG1vcnBoLmVsZW1lbnQgfSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAg
SG9zdCBob29rOiBhdHRyaWJ1dGUKKyAgCisgICAgQHBhcmFtIHtSZW5kZXJOb2RlfSByZW5kZXJO
b2RlCisgICAgQHBhcmFtIHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUKKyAgICBAcGFyYW0ge2FueX0gdmFsdWUKKyAgCisgICAgQ29ycmVzcG9uZHMgdG86CisgIAor
ICAgIGBgYGhicworICAgIDxkaXYgZm9vPXt7YmFyfX0+PC9kaXY+CisgICAgYGBgCisgIAorICAg
IFRoaXMgaG9vayBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYSByZW5kZXIgbm9kZQorICAg
IHRoYXQgcmVwcmVzZW50cyBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHdpdGggYSB2YWx1ZS4KKyAg
CisgICAgSXQgcmVjZWl2ZXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyB3ZWxsIGFzIGFu
CisgICAgYWxyZWFkeS1yZXNvbHZlZCB2YWx1ZSwgYW5kIHNob3VsZCB1cGRhdGUgdGhlIHJlbmRl
cgorICAgIG5vZGUgd2l0aCB0aGUgdmFsdWUgaWYgYXBwcm9wcmlhdGUuCisgICovCisKKyAgZnVu
Y3Rpb24gYXR0cmlidXRlKG1vcnBoLCBlbnYsIHNjb3BlLCBuYW1lLCB2YWx1ZSkgeworICAgIHZh
bHVlID0gZW52Lmhvb2tzLmdldFZhbHVlKHZhbHVlKTsKKworICAgIGlmIChtb3JwaC5sYXN0VmFs
dWUgIT09IHZhbHVlKSB7CisgICAgICBtb3JwaC5zZXRDb250ZW50KHZhbHVlKTsKKyAgICB9CisK
KyAgICBtb3JwaC5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIHN1YmV4cHIo
ZW52LCBzY29wZSwgaGVscGVyTmFtZSwgcGFyYW1zLCBoYXNoKSB7CisgICAgdmFyIGhlbHBlciA9
IGVudi5ob29rcy5sb29rdXBIZWxwZXIoZW52LCBzY29wZSwgaGVscGVyTmFtZSk7CisgICAgdmFy
IHJlc3VsdCA9IGVudi5ob29rcy5pbnZva2VIZWxwZXIobnVsbCwgZW52LCBzY29wZSwgbnVsbCwg
cGFyYW1zLCBoYXNoLCBoZWxwZXIsIHt9KTsKKyAgICBpZiAocmVzdWx0ICYmICd2YWx1ZScgaW4g
cmVzdWx0KSB7CisgICAgICByZXR1cm4gZW52Lmhvb2tzLmdldFZhbHVlKHJlc3VsdC52YWx1ZSk7
CisgICAgfQorICB9CisKKyAgLyoqCisgICAgSG9zdCBIb29rOiBnZXQKKyAgCisgICAgQHBhcmFt
IHtFbnZpcm9ubWVudH0gZW52CisgICAgQHBhcmFtIHtTY29wZX0gc2NvcGUKKyAgICBAcGFyYW0g
e1N0cmluZ30gcGF0aAorICAKKyAgICBDb3JyZXNwb25kcyB0bzoKKyAgCisgICAgYGBgaGJzCisg
ICAge3tmb28uYmFyfX0KKyAgICAgIF4KKyAgCisgICAge3toZWxwZXIgZm9vLmJhciBrZXk9dmFs
dWV9fQorICAgICAgICAgICAgIF4gICAgICAgICAgIF4KKyAgICBgYGAKKyAgCisgICAgVGhpcyBo
b29rIGlzIHRoZSAibGVhZiIgaG9vayBvZiB0aGUgc3lzdGVtLiBJdCBpcyB1c2VkIHRvCisgICAg
cmVzb2x2ZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICovCisKKyAg
ZnVuY3Rpb24gZ2V0KGVudiwgc2NvcGUsIHBhdGgpIHsKKyAgICBpZiAocGF0aCA9PT0gJycpIHsK
KyAgICAgIHJldHVybiBzY29wZS5zZWxmOworICAgIH0KKworICAgIHZhciBrZXlzID0gcGF0aC5z
cGxpdCgnLicpOworICAgIHZhciB2YWx1ZSA9IGVudi5ob29rcy5nZXRSb290KHNjb3BlLCBrZXlz
WzBdKVswXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewor
ICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIHZhbHVlID0gZW52Lmhvb2tzLmdldENoaWxkKHZh
bHVlLCBrZXlzW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFJvb3Qoc2Nv
cGUsIGtleSkgeworICAgIGlmIChzY29wZS5sb2NhbFByZXNlbnRba2V5XSkgeworICAgICAgcmV0
dXJuIFtzY29wZS5sb2NhbHNba2V5XV07CisgICAgfSBlbHNlIGlmIChzY29wZS5zZWxmKSB7Cisg
ICAgICByZXR1cm4gW3Njb3BlLnNlbGZba2V5XV07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVy
biBbdW5kZWZpbmVkXTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRCbG9jayhzY29wZSwg
a2V5KSB7CisgICAgcmV0dXJuIHNjb3BlLmJsb2Nrc1trZXldOworICB9CisKKyAgZnVuY3Rpb24g
Z2V0Q2hpbGQodmFsdWUsIGtleSkgeworICAgIHJldHVybiB2YWx1ZVtrZXldOworICB9CisKKyAg
ZnVuY3Rpb24gZ2V0VmFsdWUocmVmZXJlbmNlKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAg
fQorCisgIGZ1bmN0aW9uIGdldENlbGxPclZhbHVlKHJlZmVyZW5jZSkgeworICAgIHJldHVybiBy
ZWZlcmVuY2U7CisgIH0KKworICBmdW5jdGlvbiBjb21wb25lbnQobW9ycGgsIGVudiwgc2NvcGUs
IHRhZ05hbWUsIHBhcmFtcywgYXR0cnMsIHRlbXBsYXRlcywgdmlzaXRvcikgeworICAgIGlmIChl
bnYuaG9va3MuaGFzSGVscGVyKGVudiwgc2NvcGUsIHRhZ05hbWUpKSB7CisgICAgICByZXR1cm4g
ZW52Lmhvb2tzLmJsb2NrKG1vcnBoLCBlbnYsIHNjb3BlLCB0YWdOYW1lLCBwYXJhbXMsIGF0dHJz
LCB0ZW1wbGF0ZXMuZGVmYXVsdCwgdGVtcGxhdGVzLmludmVyc2UsIHZpc2l0b3IpOworICAgIH0K
KworICAgIGNvbXBvbmVudEZhbGxiYWNrKG1vcnBoLCBlbnYsIHNjb3BlLCB0YWdOYW1lLCBhdHRy
cywgdGVtcGxhdGVzLmRlZmF1bHQpOworICB9CisKKyAgZnVuY3Rpb24gY29uY2F0KGVudiwgcGFy
YW1zKSB7CisgICAgdmFyIHZhbHVlID0gIiI7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJh
bXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YWx1ZSArPSBlbnYuaG9va3MuZ2V0VmFs
dWUocGFyYW1zW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgZnVuY3Rp
b24gY29tcG9uZW50RmFsbGJhY2sobW9ycGgsIGVudiwgc2NvcGUsIHRhZ05hbWUsIGF0dHJzLCB0
ZW1wbGF0ZSkgeworICAgIHZhciBlbGVtZW50ID0gZW52LmRvbS5jcmVhdGVFbGVtZW50KHRhZ05h
bWUpOworICAgIGZvciAodmFyIG5hbWUgaW4gYXR0cnMpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0
cmlidXRlKG5hbWUsIGVudi5ob29rcy5nZXRWYWx1ZShhdHRyc1tuYW1lXSkpOworICAgIH0KKyAg
ICB2YXIgZnJhZ21lbnQgPSBfaHRtbGJhcnNSdW50aW1lUmVuZGVyLmRlZmF1bHQodGVtcGxhdGUs
IGVudiwgc2NvcGUsIHt9KS5mcmFnbWVudDsKKyAgICBlbGVtZW50LmFwcGVuZENoaWxkKGZyYWdt
ZW50KTsKKyAgICBtb3JwaC5zZXROb2RlKGVsZW1lbnQpOworICB9CisKKyAgZnVuY3Rpb24gaGFz
SGVscGVyKGVudiwgc2NvcGUsIGhlbHBlck5hbWUpIHsKKyAgICByZXR1cm4gZW52LmhlbHBlcnNb
aGVscGVyTmFtZV0gIT09IHVuZGVmaW5lZDsKKyAgfQorCisgIGZ1bmN0aW9uIGxvb2t1cEhlbHBl
cihlbnYsIHNjb3BlLCBoZWxwZXJOYW1lKSB7CisgICAgcmV0dXJuIGVudi5oZWxwZXJzW2hlbHBl
ck5hbWVdOworICB9CisKKyAgZnVuY3Rpb24gYmluZFNjb3BlKCkgLyogZW52LCBzY29wZSAqL3sK
KyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIGhvc3Qtc3BlY2lmaWVkIGV4
dGVuc2lvbnMgdG8gc2NvcGUKKyAgICAvLyBvdGhlciB0aGFuIGBzZWxmYCwgYGxvY2Fsc2AgYW5k
IGBibG9ja2AuCisgIH0KKworICBmdW5jdGlvbiB1cGRhdGVTY29wZShlbnYsIHNjb3BlKSB7Cisg
ICAgZW52Lmhvb2tzLmJpbmRTY29wZShlbnYsIHNjb3BlKTsKKyAgfQorCisgIGV4cG9ydHMuZGVm
YXVsdCA9IHsKKyAgICAvLyBmdW5kYW1lbnRhbCBob29rcyB0aGF0IHlvdSB3aWxsIGxpa2VseSB3
YW50IHRvIG92ZXJyaWRlCisgICAgYmluZExvY2FsOiBiaW5kTG9jYWwsCisgICAgYmluZFNlbGY6
IGJpbmRTZWxmLAorICAgIGJpbmRTY29wZTogYmluZFNjb3BlLAorICAgIGNsYXNzaWZ5OiBjbGFz
c2lmeSwKKyAgICBjb21wb25lbnQ6IGNvbXBvbmVudCwKKyAgICBjb25jYXQ6IGNvbmNhdCwKKyAg
ICBjcmVhdGVGcmVzaFNjb3BlOiBjcmVhdGVGcmVzaFNjb3BlLAorICAgIGdldENoaWxkOiBnZXRD
aGlsZCwKKyAgICBnZXRSb290OiBnZXRSb290LAorICAgIGdldEJsb2NrOiBnZXRCbG9jaywKKyAg
ICBnZXRWYWx1ZTogZ2V0VmFsdWUsCisgICAgZ2V0Q2VsbE9yVmFsdWU6IGdldENlbGxPclZhbHVl
LAorICAgIGtleXdvcmRzOiBrZXl3b3JkcywKKyAgICBsaW5rUmVuZGVyTm9kZTogbGlua1JlbmRl
ck5vZGUsCisgICAgcGFydGlhbDogcGFydGlhbCwKKyAgICBzdWJleHByOiBzdWJleHByLAorCisg
ICAgLy8gZnVuZGFtZW50YWwgaG9va3Mgd2l0aCBnb29kIGRlZmF1bHQgYmVoYXZpb3IKKyAgICBi
aW5kQmxvY2s6IGJpbmRCbG9jaywKKyAgICBiaW5kU2hhZG93U2NvcGU6IGJpbmRTaGFkb3dTY29w
ZSwKKyAgICB1cGRhdGVMb2NhbDogdXBkYXRlTG9jYWwsCisgICAgdXBkYXRlU2VsZjogdXBkYXRl
U2VsZiwKKyAgICB1cGRhdGVTY29wZTogdXBkYXRlU2NvcGUsCisgICAgY3JlYXRlQ2hpbGRTY29w
ZTogY3JlYXRlQ2hpbGRTY29wZSwKKyAgICBoYXNIZWxwZXI6IGhhc0hlbHBlciwKKyAgICBsb29r
dXBIZWxwZXI6IGxvb2t1cEhlbHBlciwKKyAgICBpbnZva2VIZWxwZXI6IGludm9rZUhlbHBlciwK
KyAgICBjbGVhbnVwUmVuZGVyTm9kZTogbnVsbCwKKyAgICBkZXN0cm95UmVuZGVyTm9kZTogbnVs
bCwKKyAgICB3aWxsQ2xlYW51cFRyZWU6IG51bGwsCisgICAgZGlkQ2xlYW51cFRyZWU6IG51bGws
CisgICAgd2lsbFJlbmRlck5vZGU6IG51bGwsCisgICAgZGlkUmVuZGVyTm9kZTogbnVsbCwKKwor
ICAgIC8vIGRlcml2ZWQgaG9va3MKKyAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZSwKKyAgICBibG9j
azogYmxvY2ssCisgICAgY3JlYXRlU2NvcGU6IGNyZWF0ZVNjb3BlLAorICAgIGVsZW1lbnQ6IGVs
ZW1lbnQsCisgICAgZ2V0OiBnZXQsCisgICAgaW5saW5lOiBpbmxpbmUsCisgICAgcmFuZ2U6IHJh
bmdlLAorICAgIGtleXdvcmQ6IGtleXdvcmQKKyAgfTsKK30pOworZW5pZmVkKCJodG1sYmFycy1y
dW50aW1lL21vcnBoIiwgWyJleHBvcnRzIiwgIm1vcnBoLXJhbmdlIl0sIGZ1bmN0aW9uIChleHBv
cnRzLCBfbW9ycGhSYW5nZSkgeworICAidXNlIHN0cmljdCI7CisKKyAgdmFyIGd1aWQgPSAxOwor
CisgIGZ1bmN0aW9uIEhUTUxCYXJzTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkg
eworICAgIHRoaXMuc3VwZXIkY29uc3RydWN0b3IoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVu
dCk7CisKKyAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLm93bmVyTm9kZSA9
IG51bGw7CisgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7CisgICAgdGhpcy5pc1N1YnRyZWVEaXJ0
eSA9IGZhbHNlOworICAgIHRoaXMubGFzdFlpZWxkZWQgPSBudWxsOworICAgIHRoaXMubGFzdFJl
c3VsdCA9IG51bGw7CisgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOworICAgIHRoaXMuYnVpbGRD
aGlsZEVudiA9IG51bGw7CisgICAgdGhpcy5tb3JwaExpc3QgPSBudWxsOworICAgIHRoaXMubW9y
cGhNYXAgPSBudWxsOworICAgIHRoaXMua2V5ID0gbnVsbDsKKyAgICB0aGlzLmxpbmtlZFBhcmFt
cyA9IG51bGw7CisgICAgdGhpcy5saW5rZWRSZXN1bHQgPSBudWxsOworICAgIHRoaXMuY2hpbGRO
b2RlcyA9IG51bGw7CisgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOworICAgIHRoaXMuZ3VpZCA9
ICJyYW5nZSIgKyBndWlkKys7CisgICAgdGhpcy5zZWVuID0gZmFsc2U7CisgIH0KKworICBIVE1M
QmFyc01vcnBoLmVtcHR5ID0gZnVuY3Rpb24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQp
IHsKKyAgICB2YXIgbW9ycGggPSBuZXcgSFRNTEJhcnNNb3JwaChkb21IZWxwZXIsIGNvbnRleHR1
YWxFbGVtZW50KTsKKyAgICBtb3JwaC5jbGVhcigpOworICAgIHJldHVybiBtb3JwaDsKKyAgfTsK
KworICBIVE1MQmFyc01vcnBoLmNyZWF0ZSA9IGZ1bmN0aW9uIChkb21IZWxwZXIsIGNvbnRleHR1
YWxFbGVtZW50LCBub2RlKSB7CisgICAgdmFyIG1vcnBoID0gbmV3IEhUTUxCYXJzTW9ycGgoZG9t
SGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguc2V0Tm9kZShub2RlKTsKKyAg
ICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgSFRNTEJhcnNNb3JwaC5hdHRhY2ggPSBmdW5jdGlv
biAoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCwgZmlyc3ROb2RlLCBsYXN0Tm9kZSkgewor
ICAgIHZhciBtb3JwaCA9IG5ldyBIVE1MQmFyc01vcnBoKGRvbUhlbHBlciwgY29udGV4dHVhbEVs
ZW1lbnQpOworICAgIG1vcnBoLnNldFJhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUpOworICAgIHJl
dHVybiBtb3JwaDsKKyAgfTsKKworICB2YXIgcHJvdG90eXBlID0gSFRNTEJhcnNNb3JwaC5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKF9tb3JwaFJhbmdlLmRlZmF1bHQucHJvdG90eXBlKTsKKyAg
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSFRNTEJhcnNNb3JwaDsKKyAgcHJvdG90eXBlLnN1cGVy
JGNvbnN0cnVjdG9yID0gX21vcnBoUmFuZ2UuZGVmYXVsdDsKKworICBwcm90b3R5cGUuZ2V0U3Rh
dGUgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYgKCF0aGlzLl9zdGF0ZSkgeworICAgICAgdGhpcy5f
c3RhdGUgPSB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5fc3RhdGU7CisgIH07CisKKyAg
cHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7CisgICAgLypqc2hpbnQg
LVcwOTMgKi8KKworICAgIHJldHVybiB0aGlzLl9zdGF0ZSA9IG5ld1N0YXRlOworICB9OworCisg
IGV4cG9ydHMuZGVmYXVsdCA9IEhUTUxCYXJzTW9ycGg7Cit9KTsKK2VuaWZlZCgiaHRtbGJhcnMt
cnVudGltZS9ub2RlLXZpc2l0b3IiLCBbImV4cG9ydHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11
dGlscyIsICJodG1sYmFycy1ydW50aW1lL2V4cHJlc3Npb24tdmlzaXRvciJdLCBmdW5jdGlvbiAo
ZXhwb3J0cywgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMsIF9odG1sYmFyc1J1bnRpbWVFeHByZXNz
aW9uVmlzaXRvcikgeworICAidXNlIHN0cmljdCI7CisKKyAgLyoqCisgICAgTm9kZSBjbGFzc2lm
aWNhdGlvbjoKKyAgCisgICAgIyBQcmltYXJ5IFN0YXRlbWVudCBOb2RlczoKKyAgCisgICAgVGhl
c2Ugbm9kZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBhIHJlbmRlciBub2RlIHRoYXQgcmVwcmVzZW50
cyBhIG1vcnBoLXJhbmdlLgorICAKKyAgICAqIGJsb2NrCisgICAgKiBpbmxpbmUKKyAgICAqIGNv
bnRlbnQKKyAgICAqIGVsZW1lbnQKKyAgICAqIGNvbXBvbmVudAorICAKKyAgICAjIExlYWYgU3Rh
dGVtZW50IE5vZGVzOgorICAKKyAgICBUaGlzIG5vZGUgaXMgcmVzcG9uc2libGUgZm9yIGEgcmVu
ZGVyIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbW9ycGgtYXR0ci4KKyAgCisgICAgKiBhdHRyaWJ1
dGUKKyAgKi8KKworICBmdW5jdGlvbiBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNjb3BlLCBtb3Jw
aCwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgaWYgKG1vcnBoLmxpbmtlZFBhcmFtcykgewor
ICAgICAgcGFyYW1zID0gbW9ycGgubGlua2VkUGFyYW1zLnBhcmFtczsKKyAgICAgIGhhc2ggPSBt
b3JwaC5saW5rZWRQYXJhbXMuaGFzaDsKKyAgICB9IGVsc2UgeworICAgICAgcGFyYW1zID0gcGFy
YW1zICYmIF9odG1sYmFyc1J1bnRpbWVFeHByZXNzaW9uVmlzaXRvci5hY2NlcHRQYXJhbXMocGFy
YW1zLCBlbnYsIHNjb3BlKTsKKyAgICAgIGhhc2ggPSBoYXNoICYmIF9odG1sYmFyc1J1bnRpbWVF
eHByZXNzaW9uVmlzaXRvci5hY2NlcHRIYXNoKGhhc2gsIGVudiwgc2NvcGUpOworICAgIH0KKwor
ICAgIF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXMoZW52LCBzY29wZSwgbW9ycGgs
IHBhdGgsIHBhcmFtcywgaGFzaCk7CisgICAgcmV0dXJuIFtwYXJhbXMsIGhhc2hdOworICB9CisK
KyAgdmFyIEFsd2F5c0RpcnR5VmlzaXRvciA9IHsKKworICAgIGJsb2NrOiBmdW5jdGlvbiAobm9k
ZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0
aCA9IG5vZGVbMV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBoYXNo
ID0gbm9kZVszXTsKKyAgICAgIHZhciB0ZW1wbGF0ZUlkID0gbm9kZVs0XTsKKyAgICAgIHZhciBp
bnZlcnNlSWQgPSBub2RlWzVdOworCisgICAgICB2YXIgcGFyYW1zQW5kSGFzaCA9IGxpbmtQYXJh
bXNBbmRIYXNoKGVudiwgc2NvcGUsIG1vcnBoLCBwYXRoLCBwYXJhbXMsIGhhc2gpOworCisgICAg
ICBtb3JwaC5pc0RpcnR5ID0gbW9ycGguaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAgICAgIGVu
di5ob29rcy5ibG9jayhtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwg
cGFyYW1zQW5kSGFzaFsxXSwgdGVtcGxhdGVJZCA9PT0gbnVsbCA/IG51bGwgOiB0ZW1wbGF0ZS50
ZW1wbGF0ZXNbdGVtcGxhdGVJZF0sIGludmVyc2VJZCA9PT0gbnVsbCA/IG51bGwgOiB0ZW1wbGF0
ZS50ZW1wbGF0ZXNbaW52ZXJzZUlkXSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIGlubGluZTog
ZnVuY3Rpb24gKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIg
cGF0aCA9IG5vZGVbMV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBo
YXNoID0gbm9kZVszXTsKKworICAgICAgdmFyIHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5k
SGFzaChlbnYsIHNjb3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgbW9y
cGguaXNEaXJ0eSA9IG1vcnBoLmlzU3VidHJlZURpcnR5ID0gZmFsc2U7CisgICAgICBlbnYuaG9v
a3MuaW5saW5lKG1vcnBoLCBlbnYsIHNjb3BlLCBwYXRoLCBwYXJhbXNBbmRIYXNoWzBdLCBwYXJh
bXNBbmRIYXNoWzFdLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgY29udGVudDogZnVuY3Rpb24g
KG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0aCA9IG5v
ZGVbMV07CisKKyAgICAgIG1vcnBoLmlzRGlydHkgPSBtb3JwaC5pc1N1YnRyZWVEaXJ0eSA9IGZh
bHNlOworCisgICAgICBpZiAoaXNIZWxwZXIoZW52LCBzY29wZSwgcGF0aCkpIHsKKyAgICAgICAg
ZW52Lmhvb2tzLmlubGluZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgW10sIHt9LCB2aXNpdG9y
KTsKKyAgICAgICAgaWYgKG1vcnBoLmxpbmtlZFJlc3VsdCkgeworICAgICAgICAgIF9odG1sYmFy
c1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXMoZW52LCBzY29wZSwgbW9ycGgsICdAY29udGVudC1o
ZWxwZXInLCBbbW9ycGgubGlua2VkUmVzdWx0XSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgcGFyYW1zID0gdW5kZWZpbmVkOworICAgICAg
aWYgKG1vcnBoLmxpbmtlZFBhcmFtcykgeworICAgICAgICBwYXJhbXMgPSBtb3JwaC5saW5rZWRQ
YXJhbXMucGFyYW1zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW1zID0gW2Vudi5ob29r
cy5nZXQoZW52LCBzY29wZSwgcGF0aCldOworICAgICAgfQorCisgICAgICBfaHRtbGJhcnNVdGls
TW9ycGhVdGlscy5saW5rUGFyYW1zKGVudiwgc2NvcGUsIG1vcnBoLCAnQHJhbmdlJywgcGFyYW1z
LCBudWxsKTsKKyAgICAgIGVudi5ob29rcy5yYW5nZShtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwg
cGFyYW1zWzBdLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgZWxlbWVudDogZnVuY3Rpb24gKG5v
ZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKSB7CisgICAgICB2YXIgcGF0aCA9IG5vZGVb
MV07CisgICAgICB2YXIgcGFyYW1zID0gbm9kZVsyXTsKKyAgICAgIHZhciBoYXNoID0gbm9kZVsz
XTsKKworICAgICAgdmFyIHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNj
b3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKTsKKworICAgICAgbW9ycGguaXNEaXJ0eSA9
IG1vcnBoLmlzU3VidHJlZURpcnR5ID0gZmFsc2U7CisgICAgICBlbnYuaG9va3MuZWxlbWVudCht
b3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwgcGFyYW1zQW5kSGFzaFsx
XSwgdmlzaXRvcik7CisgICAgfSwKKworICAgIGF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG1v
cnBoLCBlbnYsIHNjb3BlKSB7CisgICAgICB2YXIgbmFtZSA9IG5vZGVbMV07CisgICAgICB2YXIg
dmFsdWUgPSBub2RlWzJdOworCisgICAgICB2YXIgcGFyYW1zQW5kSGFzaCA9IGxpbmtQYXJhbXNB
bmRIYXNoKGVudiwgc2NvcGUsIG1vcnBoLCAnQGF0dHJpYnV0ZScsIFt2YWx1ZV0sIG51bGwpOwor
CisgICAgICBtb3JwaC5pc0RpcnR5ID0gbW9ycGguaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAg
ICAgIGVudi5ob29rcy5hdHRyaWJ1dGUobW9ycGgsIGVudiwgc2NvcGUsIG5hbWUsIHBhcmFtc0Fu
ZEhhc2hbMF1bMF0pOworICAgIH0sCisKKyAgICBjb21wb25lbnQ6IGZ1bmN0aW9uIChub2RlLCBt
b3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIHZpc2l0b3IpIHsKKyAgICAgIHZhciBwYXRoID0g
bm9kZVsxXTsKKyAgICAgIHZhciBhdHRycyA9IG5vZGVbMl07CisgICAgICB2YXIgdGVtcGxhdGVJ
ZCA9IG5vZGVbM107CisgICAgICB2YXIgaW52ZXJzZUlkID0gbm9kZVs0XTsKKworICAgICAgdmFy
IHBhcmFtc0FuZEhhc2ggPSBsaW5rUGFyYW1zQW5kSGFzaChlbnYsIHNjb3BlLCBtb3JwaCwgcGF0
aCwgW10sIGF0dHJzKTsKKyAgICAgIHZhciB0ZW1wbGF0ZXMgPSB7CisgICAgICAgIGRlZmF1bHQ6
IHRlbXBsYXRlLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSwKKyAgICAgICAgaW52ZXJzZTogdGVtcGxh
dGUudGVtcGxhdGVzW2ludmVyc2VJZF0KKyAgICAgIH07CisKKyAgICAgIG1vcnBoLmlzRGlydHkg
PSBtb3JwaC5pc1N1YnRyZWVEaXJ0eSA9IGZhbHNlOworICAgICAgZW52Lmhvb2tzLmNvbXBvbmVu
dChtb3JwaCwgZW52LCBzY29wZSwgcGF0aCwgcGFyYW1zQW5kSGFzaFswXSwgcGFyYW1zQW5kSGFz
aFsxXSwgdGVtcGxhdGVzLCB2aXNpdG9yKTsKKyAgICB9LAorCisgICAgYXR0cmlidXRlczogZnVu
Y3Rpb24gKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCBwYXJlbnRNb3JwaCwgdmlzaXRvcikgewor
ICAgICAgdmFyIHRlbXBsYXRlID0gbm9kZVsxXTsKKworICAgICAgZW52Lmhvb2tzLmF0dHJpYnV0
ZXMobW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCBwYXJlbnRNb3JwaCwgdmlzaXRvcik7Cisg
ICAgfQorCisgIH07CisKKyAgZXhwb3J0cy5BbHdheXNEaXJ0eVZpc2l0b3IgPSBBbHdheXNEaXJ0
eVZpc2l0b3I7CisgIGV4cG9ydHMuZGVmYXVsdCA9IHsKKyAgICBibG9jazogZnVuY3Rpb24gKG5v
ZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB0ZW1wbGF0ZSwgdmlzaXRvcikgeworICAgICAgZGlydHlD
aGVjayhlbnYsIG1vcnBoLCB2aXNpdG9yLCBmdW5jdGlvbiAodmlzaXRvcikgeworICAgICAgICBB
bHdheXNEaXJ0eVZpc2l0b3IuYmxvY2sobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRl
LCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBpbmxpbmU6IGZ1bmN0aW9uIChu
b2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdmlzaXRvcikgeworICAgICAgZGlydHlDaGVjayhlbnYs
IG1vcnBoLCB2aXNpdG9yLCBmdW5jdGlvbiAodmlzaXRvcikgeworICAgICAgICBBbHdheXNEaXJ0
eVZpc2l0b3IuaW5saW5lKG5vZGUsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9yKTsKKyAgICAg
IH0pOworICAgIH0sCisKKyAgICBjb250ZW50OiBmdW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwg
c2NvcGUsIHZpc2l0b3IpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgdmlzaXRvciwg
ZnVuY3Rpb24gKHZpc2l0b3IpIHsKKyAgICAgICAgQWx3YXlzRGlydHlWaXNpdG9yLmNvbnRlbnQo
bm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHZpc2l0b3IpOworICAgICAgfSk7CisgICAgfSwKKwor
ICAgIGVsZW1lbnQ6IGZ1bmN0aW9uIChub2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUs
IHZpc2l0b3IpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgdmlzaXRvciwgZnVuY3Rp
b24gKHZpc2l0b3IpIHsKKyAgICAgICAgQWx3YXlzRGlydHlWaXNpdG9yLmVsZW1lbnQobm9kZSwg
bW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0s
CisKKyAgICBhdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBtb3JwaCwgZW52LCBzY29wZSwgdGVt
cGxhdGUpIHsKKyAgICAgIGRpcnR5Q2hlY2soZW52LCBtb3JwaCwgbnVsbCwgZnVuY3Rpb24gKCkg
eworICAgICAgICBBbHdheXNEaXJ0eVZpc2l0b3IuYXR0cmlidXRlKG5vZGUsIG1vcnBoLCBlbnYs
IHNjb3BlLCB0ZW1wbGF0ZSk7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgY29tcG9uZW50OiBm
dW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKSB7Cisg
ICAgICBkaXJ0eUNoZWNrKGVudiwgbW9ycGgsIHZpc2l0b3IsIGZ1bmN0aW9uICh2aXNpdG9yKSB7
CisgICAgICAgIEFsd2F5c0RpcnR5VmlzaXRvci5jb21wb25lbnQobm9kZSwgbW9ycGgsIGVudiwg
c2NvcGUsIHRlbXBsYXRlLCB2aXNpdG9yKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBhdHRy
aWJ1dGVzOiBmdW5jdGlvbiAobm9kZSwgbW9ycGgsIGVudiwgc2NvcGUsIHBhcmVudE1vcnBoLCB2
aXNpdG9yKSB7CisgICAgICBBbHdheXNEaXJ0eVZpc2l0b3IuYXR0cmlidXRlcyhub2RlLCBtb3Jw
aCwgZW52LCBzY29wZSwgcGFyZW50TW9ycGgsIHZpc2l0b3IpOworICAgIH0KKyAgfTsKKworICBm
dW5jdGlvbiBkaXJ0eUNoZWNrKF9lbnYsIG1vcnBoLCB2aXNpdG9yLCBjYWxsYmFjaykgeworICAg
IHZhciBpc0RpcnR5ID0gbW9ycGguaXNEaXJ0eTsKKyAgICB2YXIgaXNTdWJ0cmVlRGlydHkgPSBt
b3JwaC5pc1N1YnRyZWVEaXJ0eTsKKyAgICB2YXIgZW52ID0gX2VudjsKKworICAgIGlmIChpc1N1
YnRyZWVEaXJ0eSkgeworICAgICAgdmlzaXRvciA9IEFsd2F5c0RpcnR5VmlzaXRvcjsKKyAgICB9
CisKKyAgICBpZiAoaXNEaXJ0eSB8fCBpc1N1YnRyZWVEaXJ0eSkgeworICAgICAgY2FsbGJhY2so
dmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtb3JwaC5idWlsZENoaWxkRW52KSB7
CisgICAgICAgIGVudiA9IG1vcnBoLmJ1aWxkQ2hpbGRFbnYobW9ycGguZ2V0U3RhdGUoKSwgZW52
KTsKKyAgICAgIH0KKyAgICAgIF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLnZhbGlkYXRlQ2hpbGRN
b3JwaHMoZW52LCBtb3JwaCwgdmlzaXRvcik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gaXNI
ZWxwZXIoZW52LCBzY29wZSwgcGF0aCkgeworICAgIHJldHVybiBlbnYuaG9va3Mua2V5d29yZHNb
cGF0aF0gIT09IHVuZGVmaW5lZCB8fCBlbnYuaG9va3MuaGFzSGVscGVyKGVudiwgc2NvcGUsIHBh
dGgpOworICB9Cit9KTsKK2VuaWZlZCgiaHRtbGJhcnMtcnVudGltZS9yZW5kZXIiLCBbImV4cG9y
dHMiLCAiaHRtbGJhcnMtdXRpbC9tb3JwaC11dGlscyIsICJodG1sYmFycy1ydW50aW1lL25vZGUt
dmlzaXRvciIsICJodG1sYmFycy1ydW50aW1lL21vcnBoIiwgImh0bWxiYXJzLXV0aWwvdGVtcGxh
dGUtdXRpbHMiLCAiaHRtbGJhcnMtdXRpbC92b2lkLXRhZy1uYW1lcyJdLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMsIF9odG1sYmFyc1J1bnRpbWVOb2RlVmlzaXRv
ciwgX2h0bWxiYXJzUnVudGltZU1vcnBoLCBfaHRtbGJhcnNVdGlsVGVtcGxhdGVVdGlscywgX2h0
bWxiYXJzVXRpbFZvaWRUYWdOYW1lcykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5k
ZWZhdWx0ID0gcmVuZGVyOworICBleHBvcnRzLlJlbmRlck9wdGlvbnMgPSBSZW5kZXJPcHRpb25z
OworICBleHBvcnRzLm1hbnVhbEVsZW1lbnQgPSBtYW51YWxFbGVtZW50OworICBleHBvcnRzLmF0
dGFjaEF0dHJpYnV0ZXMgPSBhdHRhY2hBdHRyaWJ1dGVzOworICBleHBvcnRzLmNyZWF0ZUNoaWxk
TW9ycGggPSBjcmVhdGVDaGlsZE1vcnBoOworICBleHBvcnRzLmdldENhY2hlZEZyYWdtZW50ID0g
Z2V0Q2FjaGVkRnJhZ21lbnQ7CisKKyAgdmFyIHN2Z05hbWVzcGFjZSA9ICJodHRwOi8vd3d3Lncz
Lm9yZy8yMDAwL3N2ZyI7CisKKyAgZnVuY3Rpb24gcmVuZGVyKHRlbXBsYXRlLCBlbnYsIHNjb3Bl
LCBvcHRpb25zKSB7CisgICAgdmFyIGRvbSA9IGVudi5kb207CisgICAgdmFyIGNvbnRleHR1YWxF
bGVtZW50OworCisgICAgaWYgKG9wdGlvbnMpIHsKKyAgICAgIGlmIChvcHRpb25zLnJlbmRlck5v
ZGUpIHsKKyAgICAgICAgY29udGV4dHVhbEVsZW1lbnQgPSBvcHRpb25zLnJlbmRlck5vZGUuY29u
dGV4dHVhbEVsZW1lbnQ7CisgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY29udGV4dHVhbEVsZW1l
bnQpIHsKKyAgICAgICAgY29udGV4dHVhbEVsZW1lbnQgPSBvcHRpb25zLmNvbnRleHR1YWxFbGVt
ZW50OworICAgICAgfQorICAgIH0KKworICAgIGRvbS5kZXRlY3ROYW1lc3BhY2UoY29udGV4dHVh
bEVsZW1lbnQpOworCisgICAgdmFyIHJlbmRlclJlc3VsdCA9IFJlbmRlclJlc3VsdC5idWlsZChl
bnYsIHNjb3BlLCB0ZW1wbGF0ZSwgb3B0aW9ucywgY29udGV4dHVhbEVsZW1lbnQpOworICAgIHJl
bmRlclJlc3VsdC5yZW5kZXIoKTsKKworICAgIHJldHVybiByZW5kZXJSZXN1bHQ7CisgIH0KKwor
ICBmdW5jdGlvbiBSZW5kZXJPcHRpb25zKHJlbmRlck5vZGUsIHNlbGYsIGJsb2NrQXJndW1lbnRz
LCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMucmVuZGVyTm9kZSA9IHJlbmRlck5vZGUg
fHwgbnVsbDsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICAgIHRoaXMuYmxvY2tBcmd1bWVudHMg
PSBibG9ja0FyZ3VtZW50cyB8fCBudWxsOworICAgIHRoaXMuY29udGV4dHVhbEVsZW1lbnQgPSBj
b250ZXh0dWFsRWxlbWVudCB8fCBudWxsOworICB9CisKKyAgZnVuY3Rpb24gUmVuZGVyUmVzdWx0
KGVudiwgc2NvcGUsIG9wdGlvbnMsIHJvb3ROb2RlLCBvd25lck5vZGUsIG5vZGVzLCBmcmFnbWVu
dCwgdGVtcGxhdGUsIHNob3VsZFNldENvbnRlbnQpIHsKKyAgICB0aGlzLnJvb3QgPSByb290Tm9k
ZTsKKyAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisKKyAgICB0aGlzLm5vZGVzID0gbm9k
ZXM7CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgIHRoaXMuc3RhdGVtZW50cyA9
IHRlbXBsYXRlLnN0YXRlbWVudHMuc2xpY2UoKTsKKyAgICB0aGlzLmVudiA9IGVudjsKKyAgICB0
aGlzLnNjb3BlID0gc2NvcGU7CisgICAgdGhpcy5zaG91bGRTZXRDb250ZW50ID0gc2hvdWxkU2V0
Q29udGVudDsKKworICAgIGlmIChvcHRpb25zLnNlbGYgIT09IHVuZGVmaW5lZCkgeworICAgICAg
dGhpcy5iaW5kU2VsZihvcHRpb25zLnNlbGYpOworICAgIH0KKyAgICBpZiAob3B0aW9ucy5ibG9j
a0FyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLmJpbmRMb2NhbHMob3B0aW9u
cy5ibG9ja0FyZ3VtZW50cyk7CisgICAgfQorCisgICAgdGhpcy5pbml0aWFsaXplTm9kZXMob3du
ZXJOb2RlKTsKKyAgfQorCisgIFJlbmRlclJlc3VsdC5idWlsZCA9IGZ1bmN0aW9uIChlbnYsIHNj
b3BlLCB0ZW1wbGF0ZSwgb3B0aW9ucywgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgZG9t
ID0gZW52LmRvbTsKKyAgICB2YXIgZnJhZ21lbnQgPSBnZXRDYWNoZWRGcmFnbWVudCh0ZW1wbGF0
ZSwgZW52KTsKKyAgICB2YXIgbm9kZXMgPSB0ZW1wbGF0ZS5idWlsZFJlbmRlck5vZGVzKGRvbSwg
ZnJhZ21lbnQsIGNvbnRleHR1YWxFbGVtZW50KTsKKworICAgIHZhciByb290Tm9kZSwgb3duZXJO
b2RlLCBzaG91bGRTZXRDb250ZW50OworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZW5k
ZXJOb2RlKSB7CisgICAgICByb290Tm9kZSA9IG9wdGlvbnMucmVuZGVyTm9kZTsKKyAgICAgIG93
bmVyTm9kZSA9IHJvb3ROb2RlLm93bmVyTm9kZTsKKyAgICAgIHNob3VsZFNldENvbnRlbnQgPSB0
cnVlOworICAgIH0gZWxzZSB7CisgICAgICByb290Tm9kZSA9IGRvbS5jcmVhdGVNb3JwaChudWxs
LCBmcmFnbWVudC5maXJzdENoaWxkLCBmcmFnbWVudC5sYXN0Q2hpbGQsIGNvbnRleHR1YWxFbGVt
ZW50KTsKKyAgICAgIG93bmVyTm9kZSA9IHJvb3ROb2RlOworICAgICAgcm9vdE5vZGUub3duZXJO
b2RlID0gb3duZXJOb2RlOworICAgICAgc2hvdWxkU2V0Q29udGVudCA9IGZhbHNlOworICAgIH0K
KworICAgIGlmIChyb290Tm9kZS5jaGlsZE5vZGVzKSB7CisgICAgICBfaHRtbGJhcnNVdGlsTW9y
cGhVdGlscy52aXNpdENoaWxkcmVuKHJvb3ROb2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uIChub2Rl
KSB7CisgICAgICAgIF9odG1sYmFyc1V0aWxUZW1wbGF0ZVV0aWxzLmNsZWFyTW9ycGgobm9kZSwg
ZW52LCB0cnVlKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHJvb3ROb2RlLmNoaWxkTm9kZXMg
PSBub2RlczsKKyAgICByZXR1cm4gbmV3IFJlbmRlclJlc3VsdChlbnYsIHNjb3BlLCBvcHRpb25z
LCByb290Tm9kZSwgb3duZXJOb2RlLCBub2RlcywgZnJhZ21lbnQsIHRlbXBsYXRlLCBzaG91bGRT
ZXRDb250ZW50KTsKKyAgfTsKKworICBmdW5jdGlvbiBtYW51YWxFbGVtZW50KHRhZ05hbWUsIGF0
dHJpYnV0ZXMsIF9pc0VtcHR5KSB7CisgICAgdmFyIHN0YXRlbWVudHMgPSBbXTsKKworICAgIGZv
ciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7CisgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNb
a2V5XSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBz
dGF0ZW1lbnRzLnB1c2goWyJhdHRyaWJ1dGUiLCBrZXksIGF0dHJpYnV0ZXNba2V5XV0pOworICAg
IH0KKworICAgIHZhciBpc0VtcHR5ID0gX2lzRW1wdHkgfHwgX2h0bWxiYXJzVXRpbFZvaWRUYWdO
YW1lcy5kZWZhdWx0W3RhZ05hbWVdOworCisgICAgaWYgKCFpc0VtcHR5KSB7CisgICAgICBzdGF0
ZW1lbnRzLnB1c2goWydjb250ZW50JywgJ3lpZWxkJ10pOworICAgIH0KKworICAgIHZhciB0ZW1w
bGF0ZSA9IHsKKyAgICAgIGFyaXR5OiAwLAorICAgICAgY2FjaGVkRnJhZ21lbnQ6IG51bGwsCisg
ICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCisgICAgICBidWlsZEZyYWdtZW50OiBmdW5jdGlvbiBi
dWlsZEZyYWdtZW50KGRvbSkgeworICAgICAgICB2YXIgZWwwID0gZG9tLmNyZWF0ZURvY3VtZW50
RnJhZ21lbnQoKTsKKyAgICAgICAgaWYgKHRhZ05hbWUgPT09ICdzdmcnKSB7CisgICAgICAgICAg
ZG9tLnNldE5hbWVzcGFjZShzdmdOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIHZhciBl
bDEgPSBkb20uY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKKworICAgICAgICBmb3IgKHZhciBrZXkg
aW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1trZXldICE9
PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAg
ICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWwxLCBrZXksIGF0dHJpYnV0ZXNba2V5XSk7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoIWlzRW1wdHkpIHsKKyAgICAgICAgICB2YXIgZWwyID0gZG9tLmNy
ZWF0ZUNvbW1lbnQoIiIpOworICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChlbDEsIGVsMik7Cisg
ICAgICAgIH0KKworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworCisgICAgICAg
IHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rpb24g
YnVpbGRSZW5kZXJOb2Rlcyhkb20sIGZyYWdtZW50KSB7CisgICAgICAgIHZhciBlbGVtZW50ID0g
ZG9tLmNoaWxkQXQoZnJhZ21lbnQsIFswXSk7CisgICAgICAgIHZhciBtb3JwaHMgPSBbXTsKKwor
ICAgICAgICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBl
b2YgYXR0cmlidXRlc1trZXldID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgfQorICAgICAgICAgIG1vcnBocy5wdXNoKGRvbS5jcmVhdGVBdHRyTW9ycGgo
ZWxlbWVudCwga2V5KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRW1wdHkpIHsKKyAg
ICAgICAgICBtb3JwaHMucHVzaChkb20uY3JlYXRlTW9ycGhBdChlbGVtZW50LCAwLCAwKSk7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRl
bWVudHM6IHN0YXRlbWVudHMsCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBb
XQorICAgIH07CisKKyAgICByZXR1cm4gdGVtcGxhdGU7CisgIH0KKworICBmdW5jdGlvbiBhdHRh
Y2hBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHsKKyAgICB2YXIgc3RhdGVtZW50cyA9IFtdOworCisg
ICAgZm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHsKKyAgICAgIGlmICh0eXBlb2YgYXR0cmli
dXRlc1trZXldID09PSAnc3RyaW5nJykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAg
ICAgIHN0YXRlbWVudHMucHVzaChbImF0dHJpYnV0ZSIsIGtleSwgYXR0cmlidXRlc1trZXldXSk7
CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlID0geworICAgICAgYXJpdHk6IDAsCisgICAgICBj
YWNoZWRGcmFnbWVudDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1
aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBl
bDAgPSB0aGlzLmVsZW1lbnQ7CisgICAgICAgIGlmIChlbDAubmFtZXNwYWNlVVJJID09PSAiaHR0
cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSB7CisgICAgICAgICAgZG9tLnNldE5hbWVzcGFjZShz
dmdOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGtleSBpbiBhdHRyaWJ1
dGVzKSB7CisgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09ICdzdHJpbmcn
KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9tLnNl
dEF0dHJpYnV0ZShlbDAsIGtleSwgYXR0cmlidXRlc1trZXldKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHJldHVybiBlbDA7CisgICAgICB9LAorICAgICAgYnVpbGRSZW5kZXJOb2RlczogZnVuY3Rp
b24gYnVpbGRSZW5kZXJOb2Rlcyhkb20pIHsKKyAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVs
ZW1lbnQ7CisgICAgICAgIHZhciBtb3JwaHMgPSBbXTsKKworICAgICAgICBmb3IgKHZhciBrZXkg
aW4gYXR0cmlidXRlcykgeworICAgICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1trZXldID09
PSAnc3RyaW5nJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAg
ICAgIG1vcnBocy5wdXNoKGRvbS5jcmVhdGVBdHRyTW9ycGgoZWxlbWVudCwga2V5KSk7CisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4gbW9ycGhzOworICAgICAgfSwKKyAgICAgIHN0YXRlbWVu
dHM6IHN0YXRlbWVudHMsCisgICAgICBsb2NhbHM6IFtdLAorICAgICAgdGVtcGxhdGVzOiBbXSwK
KyAgICAgIGVsZW1lbnQ6IG51bGwKKyAgICB9OworCisgICAgcmV0dXJuIHRlbXBsYXRlOworICB9
CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlwZS5pbml0aWFsaXplTm9kZXMgPSBmdW5jdGlvbiAo
b3duZXJOb2RlKSB7CisgICAgdmFyIGNoaWxkTm9kZXMgPSB0aGlzLnJvb3QuY2hpbGROb2RlczsK
KworICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKKyAgICAgIGNoaWxkTm9kZXNbaV0ub3duZXJOb2RlID0gb3duZXJOb2RlOworICAgIH0KKyAg
fTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB0aGlzLnJvb3QubGFzdFJlc3VsdCA9IHRoaXM7CisgICAgdGhpcy5yb290LnJlbmRlcmVkID0g
dHJ1ZTsKKyAgICB0aGlzLnBvcHVsYXRlTm9kZXMoX2h0bWxiYXJzUnVudGltZU5vZGVWaXNpdG9y
LkFsd2F5c0RpcnR5VmlzaXRvcik7CisKKyAgICBpZiAodGhpcy5zaG91bGRTZXRDb250ZW50ICYm
IHRoaXMucm9vdC5zZXRDb250ZW50KSB7CisgICAgICB0aGlzLnJvb3Quc2V0Q29udGVudCh0aGlz
LmZyYWdtZW50KTsKKyAgICB9CisgIH07CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlwZS5kaXJ0
eSA9IGZ1bmN0aW9uICgpIHsKKyAgICBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscy52aXNpdENoaWxk
cmVuKFt0aGlzLnJvb3RdLCBmdW5jdGlvbiAobm9kZSkgeworICAgICAgbm9kZS5pc0RpcnR5ID0g
dHJ1ZTsKKyAgICB9KTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBlLnJldmFsaWRh
dGUgPSBmdW5jdGlvbiAoZW52LCBzZWxmLCBibG9ja0FyZ3VtZW50cywgc2NvcGUpIHsKKyAgICB0
aGlzLnJldmFsaWRhdGVXaXRoKGVudiwgc2NvcGUsIHNlbGYsIGJsb2NrQXJndW1lbnRzLCBfaHRt
bGJhcnNSdW50aW1lTm9kZVZpc2l0b3IuZGVmYXVsdCk7CisgIH07CisKKyAgUmVuZGVyUmVzdWx0
LnByb3RvdHlwZS5yZXJlbmRlciA9IGZ1bmN0aW9uIChlbnYsIHNlbGYsIGJsb2NrQXJndW1lbnRz
LCBzY29wZSkgeworICAgIHRoaXMucmV2YWxpZGF0ZVdpdGgoZW52LCBzY29wZSwgc2VsZiwgYmxv
Y2tBcmd1bWVudHMsIF9odG1sYmFyc1J1bnRpbWVOb2RlVmlzaXRvci5BbHdheXNEaXJ0eVZpc2l0
b3IpOworICB9OworCisgIFJlbmRlclJlc3VsdC5wcm90b3R5cGUucmV2YWxpZGF0ZVdpdGggPSBm
dW5jdGlvbiAoZW52LCBzY29wZSwgc2VsZiwgYmxvY2tBcmd1bWVudHMsIHZpc2l0b3IpIHsKKyAg
ICBpZiAoZW52ICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHRoaXMuZW52ID0gZW52OworICAgIH0K
KyAgICBpZiAoc2NvcGUgIT09IHVuZGVmaW5lZCkgeworICAgICAgdGhpcy5zY29wZSA9IHNjb3Bl
OworICAgIH0KKyAgICB0aGlzLnVwZGF0ZVNjb3BlKCk7CisKKyAgICBpZiAoc2VsZiAhPT0gdW5k
ZWZpbmVkKSB7CisgICAgICB0aGlzLnVwZGF0ZVNlbGYoc2VsZik7CisgICAgfQorICAgIGlmIChi
bG9ja0FyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICB0aGlzLnVwZGF0ZUxvY2Fscyhi
bG9ja0FyZ3VtZW50cyk7CisgICAgfQorCisgICAgdGhpcy5wb3B1bGF0ZU5vZGVzKHZpc2l0b3Ip
OworICB9OworCisgIFJlbmRlclJlc3VsdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgp
IHsKKyAgICB2YXIgcm9vdE5vZGUgPSB0aGlzLnJvb3Q7CisgICAgX2h0bWxiYXJzVXRpbFRlbXBs
YXRlVXRpbHMuY2xlYXJNb3JwaChyb290Tm9kZSwgdGhpcy5lbnYsIHRydWUpOworICB9OworCisg
IFJlbmRlclJlc3VsdC5wcm90b3R5cGUucG9wdWxhdGVOb2RlcyA9IGZ1bmN0aW9uICh2aXNpdG9y
KSB7CisgICAgdmFyIGVudiA9IHRoaXMuZW52OworICAgIHZhciBzY29wZSA9IHRoaXMuc2NvcGU7
CisgICAgdmFyIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTsKKyAgICB2YXIgbm9kZXMgPSB0aGlz
Lm5vZGVzOworICAgIHZhciBzdGF0ZW1lbnRzID0gdGhpcy5zdGF0ZW1lbnRzOworICAgIHZhciBp
LCBsOworCisgICAgZm9yIChpID0gMCwgbCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICB2YXIgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKKyAgICAgIHZhciBtb3Jw
aCA9IG5vZGVzW2ldOworCisgICAgICBpZiAoZW52Lmhvb2tzLndpbGxSZW5kZXJOb2RlKSB7Cisg
ICAgICAgIGVudi5ob29rcy53aWxsUmVuZGVyTm9kZShtb3JwaCwgZW52LCBzY29wZSk7CisgICAg
ICB9CisKKyAgICAgIHN3aXRjaCAoc3RhdGVtZW50WzBdKSB7CisgICAgICAgIGNhc2UgJ2Jsb2Nr
JzoKKyAgICAgICAgICB2aXNpdG9yLmJsb2NrKHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUs
IHRlbXBsYXRlLCB2aXNpdG9yKTticmVhazsKKyAgICAgICAgY2FzZSAnaW5saW5lJzoKKyAgICAg
ICAgICB2aXNpdG9yLmlubGluZShzdGF0ZW1lbnQsIG1vcnBoLCBlbnYsIHNjb3BlLCB2aXNpdG9y
KTticmVhazsKKyAgICAgICAgY2FzZSAnY29udGVudCc6CisgICAgICAgICAgdmlzaXRvci5jb250
ZW50KHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUsIHZpc2l0b3IpO2JyZWFrOworICAgICAg
ICBjYXNlICdlbGVtZW50JzoKKyAgICAgICAgICB2aXNpdG9yLmVsZW1lbnQoc3RhdGVtZW50LCBt
b3JwaCwgZW52LCBzY29wZSwgdGVtcGxhdGUsIHZpc2l0b3IpO2JyZWFrOworICAgICAgICBjYXNl
ICdhdHRyaWJ1dGUnOgorICAgICAgICAgIHZpc2l0b3IuYXR0cmlidXRlKHN0YXRlbWVudCwgbW9y
cGgsIGVudiwgc2NvcGUpO2JyZWFrOworICAgICAgICBjYXNlICdjb21wb25lbnQnOgorICAgICAg
ICAgIHZpc2l0b3IuY29tcG9uZW50KHN0YXRlbWVudCwgbW9ycGgsIGVudiwgc2NvcGUsIHRlbXBs
YXRlLCB2aXNpdG9yKTticmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGVudi5ob29rcy5kaWRS
ZW5kZXJOb2RlKSB7CisgICAgICAgIGVudi5ob29rcy5kaWRSZW5kZXJOb2RlKG1vcnBoLCBlbnYs
IHNjb3BlKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgUmVuZGVyUmVzdWx0LnByb3RvdHlw
ZS5iaW5kU2NvcGUgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5lbnYuaG9va3MuYmluZFNjb3Bl
KHRoaXMuZW52LCB0aGlzLnNjb3BlKTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90eXBl
LnVwZGF0ZVNjb3BlID0gZnVuY3Rpb24gKCkgeworICAgIHRoaXMuZW52Lmhvb2tzLnVwZGF0ZVNj
b3BlKHRoaXMuZW52LCB0aGlzLnNjb3BlKTsKKyAgfTsKKworICBSZW5kZXJSZXN1bHQucHJvdG90
eXBlLmJpbmRTZWxmID0gZnVuY3Rpb24gKHNlbGYpIHsKKyAgICB0aGlzLmVudi5ob29rcy5iaW5k
U2VsZih0aGlzLmVudiwgdGhpcy5zY29wZSwgc2VsZik7CisgIH07CisKKyAgUmVuZGVyUmVzdWx0
LnByb3RvdHlwZS51cGRhdGVTZWxmID0gZnVuY3Rpb24gKHNlbGYpIHsKKyAgICB0aGlzLmVudi5o
b29rcy51cGRhdGVTZWxmKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBzZWxmKTsKKyAgfTsKKworICBS
ZW5kZXJSZXN1bHQucHJvdG90eXBlLmJpbmRMb2NhbHMgPSBmdW5jdGlvbiAoYmxvY2tBcmd1bWVu
dHMpIHsKKyAgICB2YXIgbG9jYWxOYW1lcyA9IHRoaXMudGVtcGxhdGUubG9jYWxzOworCisgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBsb2NhbE5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgdGhpcy5lbnYuaG9va3MuYmluZExvY2FsKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBsb2NhbE5h
bWVzW2ldLCBibG9ja0FyZ3VtZW50c1tpXSk7CisgICAgfQorICB9OworCisgIFJlbmRlclJlc3Vs
dC5wcm90b3R5cGUudXBkYXRlTG9jYWxzID0gZnVuY3Rpb24gKGJsb2NrQXJndW1lbnRzKSB7Cisg
ICAgdmFyIGxvY2FsTmFtZXMgPSB0aGlzLnRlbXBsYXRlLmxvY2FsczsKKworICAgIGZvciAodmFy
IGkgPSAwLCBsID0gbG9jYWxOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHRoaXMu
ZW52Lmhvb2tzLnVwZGF0ZUxvY2FsKHRoaXMuZW52LCB0aGlzLnNjb3BlLCBsb2NhbE5hbWVzW2ld
LCBibG9ja0FyZ3VtZW50c1tpXSk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGluaXRpYWxp
emVOb2RlKG5vZGUsIG93bmVyKSB7CisgICAgbm9kZS5vd25lck5vZGUgPSBvd25lcjsKKyAgfQor
CisgIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkTW9ycGgoZG9tLCBwYXJlbnRNb3JwaCwgY29udGV4dHVh
bEVsZW1lbnQpIHsKKyAgICB2YXIgbW9ycGggPSBfaHRtbGJhcnNSdW50aW1lTW9ycGguZGVmYXVs
dC5lbXB0eShkb20sIGNvbnRleHR1YWxFbGVtZW50IHx8IHBhcmVudE1vcnBoLmNvbnRleHR1YWxF
bGVtZW50KTsKKyAgICBpbml0aWFsaXplTm9kZShtb3JwaCwgcGFyZW50TW9ycGgub3duZXJOb2Rl
KTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH0KKworICBmdW5jdGlvbiBnZXRDYWNoZWRGcmFnbWVu
dCh0ZW1wbGF0ZSwgZW52KSB7CisgICAgdmFyIGRvbSA9IGVudi5kb20sCisgICAgICAgIGZyYWdt
ZW50OworICAgIGlmIChlbnYudXNlRnJhZ21lbnRDYWNoZSAmJiBkb20uY2FuQ2xvbmUpIHsKKyAg
ICAgIGlmICh0ZW1wbGF0ZS5jYWNoZWRGcmFnbWVudCA9PT0gbnVsbCkgeworICAgICAgICBmcmFn
bWVudCA9IHRlbXBsYXRlLmJ1aWxkRnJhZ21lbnQoZG9tKTsKKyAgICAgICAgaWYgKHRlbXBsYXRl
Lmhhc1JlbmRlcmVkKSB7CisgICAgICAgICAgdGVtcGxhdGUuY2FjaGVkRnJhZ21lbnQgPSBmcmFn
bWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0ZW1wbGF0ZS5oYXNSZW5kZXJlZCA9
IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0ZW1wbGF0ZS5jYWNoZWRGcmFn
bWVudCkgeworICAgICAgICBmcmFnbWVudCA9IGRvbS5jbG9uZU5vZGUodGVtcGxhdGUuY2FjaGVk
RnJhZ21lbnQsIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIWZyYWdtZW50KSB7Cisg
ICAgICBmcmFnbWVudCA9IHRlbXBsYXRlLmJ1aWxkRnJhZ21lbnQoZG9tKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZnJhZ21lbnQ7CisgIH0KK30pOworZW5pZmVkKCdodG1sYmFycy11dGlsJywgWydl
eHBvcnRzJywgJ2h0bWxiYXJzLXV0aWwvc2FmZS1zdHJpbmcnLCAnaHRtbGJhcnMtdXRpbC9oYW5k
bGViYXJzL3V0aWxzJywgJ2h0bWxiYXJzLXV0aWwvbmFtZXNwYWNlcycsICdodG1sYmFycy11dGls
L21vcnBoLXV0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfaHRtbGJhcnNVdGlsU2FmZVN0cmlu
ZywgX2h0bWxiYXJzVXRpbEhhbmRsZWJhcnNVdGlscywgX2h0bWxiYXJzVXRpbE5hbWVzcGFjZXMs
IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRz
LlNhZmVTdHJpbmcgPSBfaHRtbGJhcnNVdGlsU2FmZVN0cmluZy5kZWZhdWx0OworICBleHBvcnRz
LmVzY2FwZUV4cHJlc3Npb24gPSBfaHRtbGJhcnNVdGlsSGFuZGxlYmFyc1V0aWxzLmVzY2FwZUV4
cHJlc3Npb247CisgIGV4cG9ydHMuZ2V0QXR0ck5hbWVzcGFjZSA9IF9odG1sYmFyc1V0aWxOYW1l
c3BhY2VzLmdldEF0dHJOYW1lc3BhY2U7CisgIGV4cG9ydHMudmFsaWRhdGVDaGlsZE1vcnBocyA9
IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLnZhbGlkYXRlQ2hpbGRNb3JwaHM7CisgIGV4cG9ydHMu
bGlua1BhcmFtcyA9IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmxpbmtQYXJhbXM7CisgIGV4cG9y
dHMuZHVtcCA9IF9odG1sYmFyc1V0aWxNb3JwaFV0aWxzLmR1bXA7Cit9KTsKK2VuaWZlZCgnaHRt
bGJhcnMtdXRpbC9hcnJheS11dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5mb3JFYWNoID0gZm9yRWFjaDsKKyAgZXhw
b3J0cy5tYXAgPSBtYXA7CisKKyAgZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIGJp
bmRpbmcpIHsKKyAgICB2YXIgaSwgbDsKKyAgICBpZiAoYmluZGluZyA9PT0gdW5kZWZpbmVkKSB7
CisgICAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAg
ICAgIGNhbGxiYWNrKGFycmF5W2ldLCBpLCBhcnJheSk7CisgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgIGZvciAoaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAg
ICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBhcnJheVtpXSwgaSwgYXJyYXkpOworICAgICAgfQor
ICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIG1hcChhcnJheSwgY2FsbGJhY2spIHsKKyAgICB2YXIg
b3V0cHV0ID0gW107CisgICAgdmFyIGksIGw7CisKKyAgICBmb3IgKGkgPSAwLCBsID0gYXJyYXku
bGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBvdXRwdXQucHVzaChjYWxsYmFjayhhcnJheVtp
XSwgaSwgYXJyYXkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisKKyAgdmFy
IGdldElkeDsKKyAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CisgICAgZ2V0SWR4ID0g
ZnVuY3Rpb24gKGFycmF5LCBvYmosIGZyb20pIHsKKyAgICAgIHJldHVybiBhcnJheS5pbmRleE9m
KG9iaiwgZnJvbSk7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBnZXRJZHggPSBmdW5jdGlvbiAo
YXJyYXksIG9iaiwgZnJvbSkgeworICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCB8fCBmcm9t
ID09PSBudWxsKSB7CisgICAgICAgIGZyb20gPSAwOworICAgICAgfSBlbHNlIGlmIChmcm9tIDwg
MCkgeworICAgICAgICBmcm9tID0gTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoICsgZnJvbSk7Cisg
ICAgICB9CisgICAgICBmb3IgKHZhciBpID0gZnJvbSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7
IGkrKykgeworICAgICAgICBpZiAoYXJyYXlbaV0gPT09IG9iaikgeworICAgICAgICAgIHJldHVy
biBpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfTsKKyAgfQor
CisgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyYXkpIHsKKyAg
ICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gJ1tvYmpl
Y3QgQXJyYXldJzsKKyAgfTsKKworICBleHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5OworICB2YXIg
aW5kZXhPZkFycmF5ID0gZ2V0SWR4OworICBleHBvcnRzLmluZGV4T2ZBcnJheSA9IGluZGV4T2ZB
cnJheTsKK30pOworZW5pZmVkKCdodG1sYmFycy11dGlsL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgLy8gQnVpbGQgb3V0IG91ciBi
YXNpYyBTYWZlU3RyaW5nIHR5cGUKKyAgJ3VzZSBzdHJpY3QnOworCisgIGZ1bmN0aW9uIFNhZmVT
dHJpbmcoc3RyaW5nKSB7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KKworICBTYWZl
U3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9
IGZ1bmN0aW9uICgpIHsKKyAgICByZXR1cm4gJycgKyB0aGlzLnN0cmluZzsKKyAgfTsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBTYWZlU3RyaW5nOworfSk7CitlbmlmZWQoJ2h0bWxiYXJzLXV0aWwv
aGFuZGxlYmFycy91dGlscycsIFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7CisgIGV4cG9ydHMuaW5k
ZXhPZiA9IGluZGV4T2Y7CisgIGV4cG9ydHMuZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJl
c3Npb247CisgIGV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7CisgIGV4cG9ydHMuYmxvY2tQYXJh
bXMgPSBibG9ja1BhcmFtczsKKyAgZXhwb3J0cy5hcHBlbmRDb250ZXh0UGF0aCA9IGFwcGVuZENv
bnRleHRQYXRoOworICB2YXIgZXNjYXBlID0geworICAgICcmJzogJyZhbXA7JywKKyAgICAnPCc6
ICcmbHQ7JywKKyAgICAnPic6ICcmZ3Q7JywKKyAgICAnIic6ICcmcXVvdDsnLAorICAgICInIjog
JyYjeDI3OycsCisgICAgJ2AnOiAnJiN4NjA7JworICB9OworCisgIHZhciBiYWRDaGFycyA9IC9b
Jjw+IidgXS9nLAorICAgICAgcG9zc2libGUgPSAvWyY8PiInYF0vOworCisgIGZ1bmN0aW9uIGVz
Y2FwZUNoYXIoY2hyKSB7CisgICAgcmV0dXJuIGVzY2FwZVtjaHJdOworICB9CisKKyAgZnVuY3Rp
b24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykgeworICAgIGZvciAodmFyIGkgPSAxOyBp
IDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gYXJndW1l
bnRzW2ldKSB7CisgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNh
bGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7CisgICAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNb
aV1ba2V5XTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvYmo7Cisg
IH0KKworICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOworCisgIGV4
cG9ydHMudG9TdHJpbmcgPSB0b1N0cmluZzsKKyAgLy8gU291cmNlZCBmcm9tIGxvZGFzaAorICAv
LyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0Uu
dHh0CisgIC8qZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSwgbm8tdmFyICovCisgIHZhciBpc0Z1
bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0g
J2Z1bmN0aW9uJzsKKyAgfTsKKyAgLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENo
cm9tZSBhbmQgU2FmYXJpCisgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCisgIGlmIChpc0Z1
bmN0aW9uKC94LykpIHsKKyAgICBleHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uID0gZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24n
ICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOworICAgIH07
CisgIH0KKyAgdmFyIGlzRnVuY3Rpb247CisgIGV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rp
b247CisgIC8qZXNsaW50LWVuYWJsZSBmdW5jLXN0eWxlLCBuby12YXIgKi8KKworICAvKiBpc3Rh
bmJ1bCBpZ25vcmUgbmV4dCAqLworICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVu
Y3Rpb24gKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29i
amVjdCcgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA6IGZhbHNl
OworICB9OworCisgIGV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7CisgIC8vIE9sZGVyIElFIHZl
cnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1l
bnQgb3VyIG93biwgc2FkbHkuCisKKyAgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHsK
KyAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIGlmIChhcnJheVtpXSA9PT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAg
ICB9CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZ1bmN0aW9uIGVzY2FwZUV4cHJl
c3Npb24oc3RyaW5nKSB7CisgICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7Cisg
ICAgICAvLyBkb24ndCBlc2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBz
YWZlCisgICAgICBpZiAoc3RyaW5nICYmIHN0cmluZy50b0hUTUwpIHsKKyAgICAgICAgcmV0dXJu
IHN0cmluZy50b0hUTUwoKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyaW5nID09IG51bGwpIHsKKyAg
ICAgICAgcmV0dXJuICcnOworICAgICAgfSBlbHNlIGlmICghc3RyaW5nKSB7CisgICAgICAgIHJl
dHVybiBzdHJpbmcgKyAnJzsKKyAgICAgIH0KKworICAgICAgLy8gRm9yY2UgYSBzdHJpbmcgY29u
dmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5k
CisgICAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhp
bmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWYKKyAgICAgIC8vIGFuIG9iamVjdCdzIHRv
IHN0cmluZyBoYXMgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGl0LgorICAgICAgc3RyaW5nID0gJycg
KyBzdHJpbmc7CisgICAgfQorCisgICAgaWYgKCFwb3NzaWJsZS50ZXN0KHN0cmluZykpIHsKKyAg
ICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRD
aGFycywgZXNjYXBlQ2hhcik7CisgIH0KKworICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7Cisg
ICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAg
fSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHsKKyAgICAg
IHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICB9CisKKyAgZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHsKKyAgICBwYXJhbXMu
cGF0aCA9IGlkczsKKyAgICByZXR1cm4gcGFyYW1zOworICB9CisKKyAgZnVuY3Rpb24gYXBwZW5k
Q29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7CisgICAgcmV0dXJuIChjb250ZXh0UGF0aCA/
IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFy
cy11dGlsL21vcnBoLXV0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7Cisg
IC8qZ2xvYmFscyBjb25zb2xlKi8KKworICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy52aXNp
dENoaWxkcmVuID0gdmlzaXRDaGlsZHJlbjsKKyAgZXhwb3J0cy52YWxpZGF0ZUNoaWxkTW9ycGhz
ID0gdmFsaWRhdGVDaGlsZE1vcnBoczsKKyAgZXhwb3J0cy5saW5rUGFyYW1zID0gbGlua1BhcmFt
czsKKyAgZXhwb3J0cy5kdW1wID0gZHVtcDsKKworICBmdW5jdGlvbiB2aXNpdENoaWxkcmVuKG5v
ZGVzLCBjYWxsYmFjaykgeworICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZXMgPSBub2Rlcy5zbGljZSgpOworCisg
ICAgd2hpbGUgKG5vZGVzLmxlbmd0aCkgeworICAgICAgdmFyIG5vZGUgPSBub2Rlcy5wb3AoKTsK
KyAgICAgIGNhbGxiYWNrKG5vZGUpOworCisgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7Cisg
ICAgICAgIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIG5vZGUuY2hpbGROb2Rlcyk7CisgICAgICB9
IGVsc2UgaWYgKG5vZGUuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICAgIHZhciBjdXJyZW50ID0g
bm9kZS5maXJzdENoaWxkTW9ycGg7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAg
ICAgICBub2Rlcy5wdXNoKGN1cnJlbnQpOworICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5l
eHRNb3JwaDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChub2RlLm1vcnBoTGlzdCkgewor
ICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUubW9ycGhMaXN0LmZpcnN0Q2hpbGRNb3JwaDsKKwor
ICAgICAgICB3aGlsZSAoY3VycmVudCkgeworICAgICAgICAgIG5vZGVzLnB1c2goY3VycmVudCk7
CisgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgICB9CisgICAg
ICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZE1vcnBocyhlbnYsIG1v
cnBoLCB2aXNpdG9yKSB7CisgICAgdmFyIG1vcnBoTGlzdCA9IG1vcnBoLm1vcnBoTGlzdDsKKyAg
ICBpZiAobW9ycGgubW9ycGhMaXN0KSB7CisgICAgICB2YXIgY3VycmVudCA9IG1vcnBoTGlzdC5m
aXJzdENoaWxkTW9ycGg7CisKKyAgICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICAgIHZhciBu
ZXh0ID0gY3VycmVudC5uZXh0TW9ycGg7CisgICAgICAgIHZhbGlkYXRlQ2hpbGRNb3JwaHMoZW52
LCBjdXJyZW50LCB2aXNpdG9yKTsKKyAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICB9Cisg
ICAgfSBlbHNlIGlmIChtb3JwaC5sYXN0UmVzdWx0KSB7CisgICAgICBtb3JwaC5sYXN0UmVzdWx0
LnJldmFsaWRhdGVXaXRoKGVudiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdmlz
aXRvcik7CisgICAgfSBlbHNlIGlmIChtb3JwaC5jaGlsZE5vZGVzKSB7CisgICAgICAvLyBUaGlz
IG1lYW5zIHRoYXQgdGhlIGNoaWxkTm9kZXMgd2VyZSB3aXJlZCB1cCBtYW51YWxseQorICAgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBtb3JwaC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykg
eworICAgICAgICB2YWxpZGF0ZUNoaWxkTW9ycGhzKGVudiwgbW9ycGguY2hpbGROb2Rlc1tpXSwg
dmlzaXRvcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbGlua1BhcmFtcyhl
bnYsIHNjb3BlLCBtb3JwaCwgcGF0aCwgcGFyYW1zLCBoYXNoKSB7CisgICAgaWYgKG1vcnBoLmxp
bmtlZFBhcmFtcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlbnYuaG9va3Mu
bGlua1JlbmRlck5vZGUobW9ycGgsIGVudiwgc2NvcGUsIHBhdGgsIHBhcmFtcywgaGFzaCkpIHsK
KyAgICAgIG1vcnBoLmxpbmtlZFBhcmFtcyA9IHsgcGFyYW1zOiBwYXJhbXMsIGhhc2g6IGhhc2gg
fTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkdW1wKG5vZGUpIHsKKyAgICBjb25zb2xlLmdy
b3VwKG5vZGUsIG5vZGUuaXNEaXJ0eSk7CisKKyAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7Cisg
ICAgICBtYXAobm9kZS5jaGlsZE5vZGVzLCBkdW1wKTsKKyAgICB9IGVsc2UgaWYgKG5vZGUuZmly
c3RDaGlsZE1vcnBoKSB7CisgICAgICB2YXIgY3VycmVudCA9IG5vZGUuZmlyc3RDaGlsZE1vcnBo
OworCisgICAgICB3aGlsZSAoY3VycmVudCkgeworICAgICAgICBkdW1wKGN1cnJlbnQpOworICAg
ICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0TW9ycGg7CisgICAgICB9CisgICAgfSBlbHNlIGlm
IChub2RlLm1vcnBoTGlzdCkgeworICAgICAgZHVtcChub2RlLm1vcnBoTGlzdCk7CisgICAgfQor
CisgICAgY29uc29sZS5ncm91cEVuZCgpOworICB9CisKKyAgZnVuY3Rpb24gbWFwKG5vZGVzLCBj
YikgeworICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7
CisgICAgICBjYihub2Rlc1tpXSk7CisgICAgfQorICB9Cit9KTsKK2VuaWZlZCgnaHRtbGJhcnMt
dXRpbC9uYW1lc3BhY2VzJywgWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8v
IHJlZiBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjLUxDL25hbWVzcGFjZXMuaHRtbAorICAn
dXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5nZXRBdHRyTmFtZXNwYWNlID0gZ2V0QXR0ck5hbWVz
cGFjZTsKKyAgdmFyIGRlZmF1bHROYW1lc3BhY2VzID0geworICAgIGh0bWw6ICdodHRwOi8vd3d3
LnczLm9yZy8xOTk5L3hodG1sJywKKyAgICBtYXRobWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4
L01hdGgvTWF0aE1MJywKKyAgICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsCisg
ICAgeGxpbms6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywKKyAgICB4bWw6ICdodHRw
Oi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnCisgIH07CisKKyAgZnVuY3Rpb24gZ2V0
QXR0ck5hbWVzcGFjZShhdHRyTmFtZSwgZGV0ZWN0ZWROYW1lc3BhY2UpIHsKKyAgICBpZiAoZGV0
ZWN0ZWROYW1lc3BhY2UpIHsKKyAgICAgIHJldHVybiBkZXRlY3RlZE5hbWVzcGFjZTsKKyAgICB9
CisKKyAgICB2YXIgbmFtZXNwYWNlOworCisgICAgdmFyIGNvbG9uSW5kZXggPSBhdHRyTmFtZS5p
bmRleE9mKCc6Jyk7CisgICAgaWYgKGNvbG9uSW5kZXggIT09IC0xKSB7CisgICAgICB2YXIgcHJl
Zml4ID0gYXR0ck5hbWUuc2xpY2UoMCwgY29sb25JbmRleCk7CisgICAgICBuYW1lc3BhY2UgPSBk
ZWZhdWx0TmFtZXNwYWNlc1twcmVmaXhdOworICAgIH0KKworICAgIHJldHVybiBuYW1lc3BhY2Ug
fHwgbnVsbDsKKyAgfQorfSk7CitlbmlmZWQoImh0bWxiYXJzLXV0aWwvb2JqZWN0LXV0aWxzIiwg
WyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBl
eHBvcnRzLm1lcmdlID0gbWVyZ2U7CisgIGV4cG9ydHMuc2hhbGxvd0NvcHkgPSBzaGFsbG93Q29w
eTsKKyAgZXhwb3J0cy5rZXlTZXQgPSBrZXlTZXQ7CisgIGV4cG9ydHMua2V5TGVuZ3RoID0ga2V5
TGVuZ3RoOworCisgIGZ1bmN0aW9uIG1lcmdlKG9wdGlvbnMsIGRlZmF1bHRzKSB7CisgICAgZm9y
ICh2YXIgcHJvcCBpbiBkZWZhdWx0cykgeworICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVy
dHkocHJvcCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBvcHRpb25zW3By
b3BdID0gZGVmYXVsdHNbcHJvcF07CisgICAgfQorICAgIHJldHVybiBvcHRpb25zOworICB9CisK
KyAgZnVuY3Rpb24gc2hhbGxvd0NvcHkob2JqKSB7CisgICAgcmV0dXJuIG1lcmdlKHt9LCBvYmop
OworICB9CisKKyAgZnVuY3Rpb24ga2V5U2V0KG9iaikgeworICAgIHZhciBzZXQgPSB7fTsKKwor
ICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CisgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5
KHByb3ApKSB7CisgICAgICAgIHNldFtwcm9wXSA9IHRydWU7CisgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIHNldDsKKyAgfQorCisgIGZ1bmN0aW9uIGtleUxlbmd0aChvYmopIHsKKyAgICB2
YXIgY291bnQgPSAwOworCisgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICAgIGlmIChv
YmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAg
ICB9CisKKyAgICByZXR1cm4gY291bnQ7CisgIH0KK30pOworZW5pZmVkKCJodG1sYmFycy11dGls
L3F1b3RpbmciLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJp
Y3QiOworCisgIGV4cG9ydHMuaGFzaCA9IGhhc2g7CisgIGV4cG9ydHMucmVwZWF0ID0gcmVwZWF0
OworICBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CisgICAgc3RyID0gc3RyLnJlcGxhY2Uo
L1xcL2csICJcXFxcIik7CisgICAgc3RyID0gc3RyLnJlcGxhY2UoLyIvZywgJ1xcIicpOworICAg
IHN0ciA9IHN0ci5yZXBsYWNlKC9cbi9nLCAiXFxuIik7CisgICAgcmV0dXJuIHN0cjsKKyAgfQor
CisgIGV4cG9ydHMuZXNjYXBlU3RyaW5nID0gZXNjYXBlU3RyaW5nOworCisgIGZ1bmN0aW9uIHN0
cmluZyhzdHIpIHsKKyAgICByZXR1cm4gJyInICsgZXNjYXBlU3RyaW5nKHN0cikgKyAnIic7Cisg
IH0KKworICBleHBvcnRzLnN0cmluZyA9IHN0cmluZzsKKworICBmdW5jdGlvbiBhcnJheShhKSB7
CisgICAgcmV0dXJuICJbIiArIGEgKyAiXSI7CisgIH0KKworICBleHBvcnRzLmFycmF5ID0gYXJy
YXk7CisKKyAgZnVuY3Rpb24gaGFzaChwYWlycykgeworICAgIHJldHVybiAieyIgKyBwYWlycy5q
b2luKCIsICIpICsgIn0iOworICB9CisKKyAgZnVuY3Rpb24gcmVwZWF0KGNoYXJzLCB0aW1lcykg
eworICAgIHZhciBzdHIgPSAiIjsKKyAgICB3aGlsZSAodGltZXMtLSkgeworICAgICAgc3RyICs9
IGNoYXJzOworICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9Cit9KTsKK2VuaWZlZCgnaHRtbGJh
cnMtdXRpbC9zYWZlLXN0cmluZycsIFsnZXhwb3J0cycsICdodG1sYmFycy11dGlsL2hhbmRsZWJh
cnMvc2FmZS1zdHJpbmcnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9odG1sYmFyc1V0aWxIYW5kbGVi
YXJzU2FmZVN0cmluZykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
X2h0bWxiYXJzVXRpbEhhbmRsZWJhcnNTYWZlU3RyaW5nLmRlZmF1bHQ7Cit9KTsKK2VuaWZlZCgi
aHRtbGJhcnMtdXRpbC90ZW1wbGF0ZS11dGlscyIsIFsiZXhwb3J0cyIsICJodG1sYmFycy11dGls
L21vcnBoLXV0aWxzIiwgImh0bWxiYXJzLXJ1bnRpbWUvcmVuZGVyIl0sIGZ1bmN0aW9uIChleHBv
cnRzLCBfaHRtbGJhcnNVdGlsTW9ycGhVdGlscywgX2h0bWxiYXJzUnVudGltZVJlbmRlcikgewor
ICAidXNlIHN0cmljdCI7CisKKyAgZXhwb3J0cy5SZW5kZXJTdGF0ZSA9IFJlbmRlclN0YXRlOwor
ICBleHBvcnRzLmJsb2NrRm9yID0gYmxvY2tGb3I7CisgIGV4cG9ydHMucmVuZGVyQW5kQ2xlYW51
cCA9IHJlbmRlckFuZENsZWFudXA7CisgIGV4cG9ydHMuY2xlYXJNb3JwaCA9IGNsZWFyTW9ycGg7
CisgIGV4cG9ydHMuY2xlYXJNb3JwaExpc3QgPSBjbGVhck1vcnBoTGlzdDsKKworICBmdW5jdGlv
biBSZW5kZXJTdGF0ZShyZW5kZXJOb2RlLCBtb3JwaExpc3QpIHsKKyAgICAvLyBUaGUgbW9ycGgg
bGlzdCB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIGNhbiBiZQorICAgIC8vIGRlc3Ryb3ll
ZC4KKyAgICB0aGlzLm1vcnBoTGlzdFRvQ2xlYXIgPSBtb3JwaExpc3Q7CisKKyAgICAvLyBUaGUg
bW9ycGggbGlzdCB0aGF0IG5lZWRzIHRvIGJlIHBydW5lZCBvZiBhbnkgaXRlbXMKKyAgICAvLyB0
aGF0IHdlcmUgbm90IHlpZWxkZWQgb24gYSBzdWJzZXF1ZW50IHJlbmRlci4KKyAgICB0aGlzLm1v
cnBoTGlzdFRvUHJ1bmUgPSBudWxsOworCisgICAgLy8gQSBtYXAgb2YgbW9ycGhzIGZvciBlYWNo
IGl0ZW0geWllbGRlZCBpbiBkdXJpbmcgdGhpcworICAgIC8vIHJlbmRlcmluZyBwYXNzLiBBbnkg
bW9ycGhzIGluIHRoZSBET00gYnV0IG5vdCBpbiB0aGlzIG1hcAorICAgIC8vIHdpbGwgYmUgcHJ1
bmVkIGR1cmluZyBjbGVhbnVwLgorICAgIHRoaXMuaGFuZGxlZE1vcnBocyA9IHt9OworICAgIHRo
aXMuY29sbGlzaW9ucyA9IHVuZGVmaW5lZDsKKworICAgIC8vIFRoZSBtb3JwaCB0byBjbGVhciBv
bmNlIHJlbmRlcmluZyBpcyBjb21wbGV0ZS4gQnkKKyAgICAvLyBkZWZhdWx0LCB3ZSBzZXQgdGhp
cyB0byB0aGUgcHJldmlvdXMgbW9ycGggKHRvIGNhdGNoCisgICAgLy8gdGhlIGNhc2Ugd2hlcmUg
bm90aGluZyBpcyB5aWVsZGVkOyBpbiB0aGF0IGNhc2UsIHdlCisgICAgLy8gc2hvdWxkIGp1c3Qg
Y2xlYXIgdGhlIG1vcnBoKS4gT3RoZXJ3aXNlIHRoaXMgZ2V0cyBzZXQKKyAgICAvLyB0byBudWxs
IGlmIGFueXRoaW5nIGlzIHJlbmRlcmVkLgorICAgIHRoaXMubW9ycGhUb0NsZWFyID0gcmVuZGVy
Tm9kZTsKKworICAgIHRoaXMuc2hhZG93T3B0aW9ucyA9IG51bGw7CisgIH0KKworICBmdW5jdGlv
biBCbG9jayhyZW5kZXIsIHRlbXBsYXRlLCBibG9ja09wdGlvbnMpIHsKKyAgICB0aGlzLnJlbmRl
ciA9IHJlbmRlcjsKKyAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CisgICAgdGhpcy5ibG9j
a09wdGlvbnMgPSBibG9ja09wdGlvbnM7CisgICAgdGhpcy5hcml0eSA9IHRlbXBsYXRlLmFyaXR5
OworICB9CisKKyAgQmxvY2sucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChlbnYsIGJsb2Nr
QXJndW1lbnRzLCBfc2VsZiwgcmVuZGVyTm9kZSwgcGFyZW50U2NvcGUsIHZpc2l0b3IpIHsKKyAg
ICBpZiAocmVuZGVyTm9kZS5sYXN0UmVzdWx0KSB7CisgICAgICByZW5kZXJOb2RlLmxhc3RSZXN1
bHQucmV2YWxpZGF0ZVdpdGgoZW52LCB1bmRlZmluZWQsIF9zZWxmLCBibG9ja0FyZ3VtZW50cywg
dmlzaXRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX2ZpcnN0UmVuZGVyKGVudiwgYmxv
Y2tBcmd1bWVudHMsIF9zZWxmLCByZW5kZXJOb2RlLCBwYXJlbnRTY29wZSk7CisgICAgfQorICB9
OworCisgIEJsb2NrLnByb3RvdHlwZS5fZmlyc3RSZW5kZXIgPSBmdW5jdGlvbiAoZW52LCBibG9j
a0FyZ3VtZW50cywgX3NlbGYsIHJlbmRlck5vZGUsIHBhcmVudFNjb3BlKSB7CisgICAgdmFyIG9w
dGlvbnMgPSB7IHJlbmRlclN0YXRlOiBuZXcgUmVuZGVyU3RhdGUocmVuZGVyTm9kZSkgfTsKKyAg
ICB2YXIgcmVuZGVyID0gdGhpcy5yZW5kZXI7CisgICAgdmFyIHRlbXBsYXRlID0gdGhpcy50ZW1w
bGF0ZTsKKyAgICB2YXIgc2NvcGUgPSB0aGlzLmJsb2NrT3B0aW9ucy5zY29wZTsKKworICAgIHZh
ciBzaGFkb3dTY29wZSA9IHNjb3BlID8gZW52Lmhvb2tzLmNyZWF0ZUNoaWxkU2NvcGUoc2NvcGUp
IDogZW52Lmhvb2tzLmNyZWF0ZUZyZXNoU2NvcGUoKTsKKworICAgIGVudi5ob29rcy5iaW5kU2hh
ZG93U2NvcGUoZW52LCBwYXJlbnRTY29wZSwgc2hhZG93U2NvcGUsIHRoaXMuYmxvY2tPcHRpb25z
Lm9wdGlvbnMpOworCisgICAgaWYgKF9zZWxmICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGVudi5o
b29rcy5iaW5kU2VsZihlbnYsIHNoYWRvd1Njb3BlLCBfc2VsZik7CisgICAgfSBlbHNlIGlmICh0
aGlzLmJsb2NrT3B0aW9ucy5zZWxmICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIGVudi5ob29rcy5i
aW5kU2VsZihlbnYsIHNoYWRvd1Njb3BlLCB0aGlzLmJsb2NrT3B0aW9ucy5zZWxmKTsKKyAgICB9
CisKKyAgICBiaW5kQmxvY2tzKGVudiwgc2hhZG93U2NvcGUsIHRoaXMuYmxvY2tPcHRpb25zLnlp
ZWxkVG8pOworCisgICAgcmVuZGVyQW5kQ2xlYW51cChyZW5kZXJOb2RlLCBlbnYsIG9wdGlvbnMs
IG51bGwsIGZ1bmN0aW9uICgpIHsKKyAgICAgIG9wdGlvbnMucmVuZGVyU3RhdGUubW9ycGhUb0Ns
ZWFyID0gbnVsbDsKKyAgICAgIHZhciByZW5kZXJPcHRpb25zID0gbmV3IF9odG1sYmFyc1J1bnRp
bWVSZW5kZXIuUmVuZGVyT3B0aW9ucyhyZW5kZXJOb2RlLCB1bmRlZmluZWQsIGJsb2NrQXJndW1l
bnRzKTsKKyAgICAgIHJlbmRlcih0ZW1wbGF0ZSwgZW52LCBzaGFkb3dTY29wZSwgcmVuZGVyT3B0
aW9ucyk7CisgICAgfSk7CisgIH07CisKKyAgZnVuY3Rpb24gYmxvY2tGb3IocmVuZGVyLCB0ZW1w
bGF0ZSwgYmxvY2tPcHRpb25zKSB7CisgICAgcmV0dXJuIG5ldyBCbG9jayhyZW5kZXIsIHRlbXBs
YXRlLCBibG9ja09wdGlvbnMpOworICB9CisKKyAgZnVuY3Rpb24gYmluZEJsb2NrcyhlbnYsIHNo
YWRvd1Njb3BlLCBibG9ja3MpIHsKKyAgICBpZiAoIWJsb2NrcykgeworICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBpZiAoYmxvY2tzIGluc3RhbmNlb2YgQmxvY2spIHsKKyAgICAgIGVudi5ob29r
cy5iaW5kQmxvY2soZW52LCBzaGFkb3dTY29wZSwgYmxvY2tzKTsKKyAgICB9IGVsc2UgeworICAg
ICAgZm9yICh2YXIgbmFtZSBpbiBibG9ja3MpIHsKKyAgICAgICAgaWYgKGJsb2Nrcy5oYXNPd25Q
cm9wZXJ0eShuYW1lKSkgeworICAgICAgICAgIGVudi5ob29rcy5iaW5kQmxvY2soZW52LCBzaGFk
b3dTY29wZSwgYmxvY2tzW25hbWVdLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0K
KyAgfQorCisgIGZ1bmN0aW9uIHJlbmRlckFuZENsZWFudXAobW9ycGgsIGVudiwgb3B0aW9ucywg
c2hhZG93T3B0aW9ucywgY2FsbGJhY2spIHsKKyAgICAvLyBUaGUgUmVuZGVyU3RhdGUgb2JqZWN0
IGlzIHVzZWQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoZQorICAgIC8vIGhl
bHBlciBvciBob29rIGJlaW5nIGludm9rZWQgaGFzIHlpZWxkZWQuIE9uY2UgaXQgaGFzIGZpbmlz
aGVkIGVpdGhlcgorICAgIC8vIHlpZWxkaW5nIG11bHRpcGxlIGl0ZW1zICh2aWEgeWllbGRJdGVt
KSBvciBhIHNpbmdsZSB0ZW1wbGF0ZSAodmlhCisgICAgLy8geWllbGRUZW1wbGF0ZSksIHdlIGRl
dGVjdCB3aGF0IHdhcyByZW5kZXJlZCBhbmQgaG93IGl0IGRpZmZlcnMgZnJvbQorICAgIC8vIHRo
ZSBwcmV2aW91cyByZW5kZXIsIGNsZWFuaW5nIHVwIG9sZCBzdGF0ZSBpbiBET00gYXMgYXBwcm9w
cmlhdGUuCisgICAgdmFyIHJlbmRlclN0YXRlID0gb3B0aW9ucy5yZW5kZXJTdGF0ZTsKKyAgICBy
ZW5kZXJTdGF0ZS5jb2xsaXNpb25zID0gdW5kZWZpbmVkOworICAgIHJlbmRlclN0YXRlLnNoYWRv
d09wdGlvbnMgPSBzaGFkb3dPcHRpb25zOworCisgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjaywg
aW5zdHJ1Y3RpbmcgaXQgdG8gc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGl0CisgICAgLy8g
cmVuZGVycyBpbnRvIFJlbmRlclN0YXRlLgorICAgIHZhciByZXN1bHQgPSBjYWxsYmFjayhvcHRp
b25zKTsKKworICAgIC8vIFRoZSBob29rIGNhbiBvcHQtb3V0IG9mIGNsZWFudXAgaWYgaXQgaGFu
ZGxlZCBjbGVhbnVwIGl0c2VsZi4KKyAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5oYW5kbGVkKSB7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG1vcnBoTWFwID0gbW9ycGgubW9ycGhN
YXA7CisKKyAgICAvLyBXYWxrIHRoZSBtb3JwaCBsaXN0LCBjbGVhcmluZyBhbnkgaXRlbXMgdGhh
dCB3ZXJlIHlpZWxkZWQgaW4gYSBwcmV2aW91cworICAgIC8vIHJlbmRlciBidXQgd2VyZSBub3Qg
eWllbGRlZCBkdXJpbmcgdGhpcyByZW5kZXIuCisgICAgdmFyIG1vcnBoTGlzdCA9IHJlbmRlclN0
YXRlLm1vcnBoTGlzdFRvUHJ1bmU7CisgICAgaWYgKG1vcnBoTGlzdCkgeworICAgICAgdmFyIGhh
bmRsZWRNb3JwaHMgPSByZW5kZXJTdGF0ZS5oYW5kbGVkTW9ycGhzOworICAgICAgdmFyIGl0ZW0g
PSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgICB3aGlsZSAoaXRlbSkgeworICAg
ICAgICB2YXIgbmV4dCA9IGl0ZW0ubmV4dE1vcnBoOworCisgICAgICAgIC8vIElmIHdlIGRvbid0
IHNlZSB0aGUga2V5IGluIGhhbmRsZWRNb3JwaHMsIGl0IHdhc24ndAorICAgICAgICAvLyB5aWVs
ZGVkIGluIGFuZCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBpdCBmcm9tIERPTS4KKyAgICAgICAgaWYg
KCEoaXRlbS5rZXkgaW4gaGFuZGxlZE1vcnBocykpIHsKKyAgICAgICAgICBtb3JwaE1hcFtpdGVt
LmtleV0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgY2xlYXJNb3JwaChpdGVtLCBlbnYsIHRydWUp
OworICAgICAgICAgIGl0ZW0uZGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlbSA9
IG5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgbW9ycGhMaXN0ID0gcmVuZGVyU3RhdGUubW9y
cGhMaXN0VG9DbGVhcjsKKyAgICBpZiAobW9ycGhMaXN0KSB7CisgICAgICBjbGVhck1vcnBoTGlz
dChtb3JwaExpc3QsIG1vcnBoLCBlbnYpOworICAgIH0KKworICAgIHZhciB0b0NsZWFyID0gcmVu
ZGVyU3RhdGUubW9ycGhUb0NsZWFyOworICAgIGlmICh0b0NsZWFyKSB7CisgICAgICBjbGVhck1v
cnBoKHRvQ2xlYXIsIGVudik7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY2xlYXJNb3JwaCht
b3JwaCwgZW52LCBkZXN0cm95U2VsZikgeworICAgIHZhciBjbGVhbnVwID0gZW52Lmhvb2tzLmNs
ZWFudXBSZW5kZXJOb2RlOworICAgIHZhciBkZXN0cm95ID0gZW52Lmhvb2tzLmRlc3Ryb3lSZW5k
ZXJOb2RlOworICAgIHZhciB3aWxsQ2xlYW51cCA9IGVudi5ob29rcy53aWxsQ2xlYW51cFRyZWU7
CisgICAgdmFyIGRpZENsZWFudXAgPSBlbnYuaG9va3MuZGlkQ2xlYW51cFRyZWU7CisKKyAgICBm
dW5jdGlvbiBkZXN0cm95Tm9kZShub2RlKSB7CisgICAgICBpZiAoY2xlYW51cCkgeworICAgICAg
ICBjbGVhbnVwKG5vZGUpOworICAgICAgfQorICAgICAgaWYgKGRlc3Ryb3kpIHsKKyAgICAgICAg
ZGVzdHJveShub2RlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2lsbENsZWFudXApIHsK
KyAgICAgIHdpbGxDbGVhbnVwKGVudiwgbW9ycGgsIGRlc3Ryb3lTZWxmKTsKKyAgICB9CisgICAg
aWYgKGNsZWFudXApIHsKKyAgICAgIGNsZWFudXAobW9ycGgpOworICAgIH0KKyAgICBpZiAoZGVz
dHJveVNlbGYgJiYgZGVzdHJveSkgeworICAgICAgZGVzdHJveShtb3JwaCk7CisgICAgfQorCisg
ICAgX2h0bWxiYXJzVXRpbE1vcnBoVXRpbHMudmlzaXRDaGlsZHJlbihtb3JwaC5jaGlsZE5vZGVz
LCBkZXN0cm95Tm9kZSk7CisKKyAgICAvLyBUT0RPOiBEZWFsIHdpdGggbG9naWNhbCBjaGlsZHJl
biB0aGF0IGFyZSBub3QgaW4gdGhlIERPTSB0cmVlCisgICAgbW9ycGguY2xlYXIoKTsKKyAgICBp
ZiAoZGlkQ2xlYW51cCkgeworICAgICAgZGlkQ2xlYW51cChlbnYsIG1vcnBoLCBkZXN0cm95U2Vs
Zik7CisgICAgfQorCisgICAgbW9ycGgubGFzdFJlc3VsdCA9IG51bGw7CisgICAgbW9ycGgubGFz
dFlpZWxkZWQgPSBudWxsOworICAgIG1vcnBoLmNoaWxkTm9kZXMgPSBudWxsOworICB9CisKKyAg
ZnVuY3Rpb24gY2xlYXJNb3JwaExpc3QobW9ycGhMaXN0LCBtb3JwaCwgZW52KSB7CisgICAgdmFy
IGl0ZW0gPSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgd2hpbGUgKGl0ZW0pIHsK
KyAgICAgIHZhciBuZXh0ID0gaXRlbS5uZXh0TW9ycGg7CisgICAgICBtb3JwaC5tb3JwaE1hcFtp
dGVtLmtleV0gPSB1bmRlZmluZWQ7CisgICAgICBjbGVhck1vcnBoKGl0ZW0sIGVudiwgdHJ1ZSk7
CisgICAgICBpdGVtLmRlc3Ryb3koKTsKKworICAgICAgaXRlbSA9IG5leHQ7CisgICAgfQorCisg
ICAgLy8gUmVtb3ZlIHRoZSBNb3JwaExpc3QgZnJvbSB0aGUgbW9ycGguCisgICAgbW9ycGhMaXN0
LmNsZWFyKCk7CisgICAgbW9ycGgubW9ycGhMaXN0ID0gbnVsbDsKKyAgfQorfSk7CitlbmlmZWQo
Imh0bWxiYXJzLXV0aWwvdm9pZC10YWctbmFtZXMiLCBbImV4cG9ydHMiLCAiaHRtbGJhcnMtdXRp
bC9hcnJheS11dGlscyJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2h0bWxiYXJzVXRpbEFycmF5VXRp
bHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIC8vIFRoZSBIVE1MIGVsZW1lbnRzIGluIHRoaXMg
bGlzdCBhcmUgc3BlY2VkIGJ5CisgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtbWFya3Vw
L3N5bnRheC5odG1sI3N5bnRheC1lbGVtZW50cywKKyAgLy8gYW5kIHdpbGwgYmUgZm9yY2VkIHRv
IGNsb3NlIHJlZ2FyZGxlc3Mgb2YgaWYgdGhleSBoYXZlIGEKKyAgLy8gc2VsZi1jbG9zaW5nIC8+
IGF0IHRoZSBlbmQuCisgIHZhciB2b2lkVGFnTmFtZXMgPSAiYXJlYSBiYXNlIGJyIGNvbCBjb21t
YW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFj
ayB3YnIiOworICB2YXIgdm9pZE1hcCA9IHt9OworCisgIF9odG1sYmFyc1V0aWxBcnJheVV0aWxz
LmZvckVhY2godm9pZFRhZ05hbWVzLnNwbGl0KCIgIiksIGZ1bmN0aW9uICh0YWdOYW1lKSB7Cisg
ICAgdm9pZE1hcFt0YWdOYW1lXSA9IHRydWU7CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IHZvaWRNYXA7Cit9KTsKK2VuaWZlZCgibW9ycGgtYXR0ciIsIFsiZXhwb3J0cyIsICJtb3JwaC1h
dHRyL3Nhbml0aXplLWF0dHJpYnV0ZS12YWx1ZSIsICJkb20taGVscGVyL3Byb3AiLCAiZG9tLWhl
bHBlci9idWlsZC1odG1sLWRvbSIsICJodG1sYmFycy11dGlsIl0sIGZ1bmN0aW9uIChleHBvcnRz
LCBfbW9ycGhBdHRyU2FuaXRpemVBdHRyaWJ1dGVWYWx1ZSwgX2RvbUhlbHBlclByb3AsIF9kb21I
ZWxwZXJCdWlsZEh0bWxEb20sIF9odG1sYmFyc1V0aWwpIHsKKyAgInVzZSBzdHJpY3QiOworCisg
IGZ1bmN0aW9uIGdldFByb3BlcnR5KCkgeworICAgIHJldHVybiB0aGlzLmRvbUhlbHBlci5nZXRQ
cm9wZXJ0eVN0cmljdCh0aGlzLmVsZW1lbnQsIHRoaXMuYXR0ck5hbWUpOworICB9CisKKyAgZnVu
Y3Rpb24gdXBkYXRlUHJvcGVydHkodmFsdWUpIHsKKyAgICBpZiAodGhpcy5fcmVuZGVyZWRJbml0
aWFsbHkgPT09IHRydWUgfHwgIV9kb21IZWxwZXJQcm9wLmlzQXR0clJlbW92YWxWYWx1ZSh2YWx1
ZSkpIHsKKyAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50OworICAgICAgdmFyIGF0dHJO
YW1lID0gdGhpcy5hdHRyTmFtZTsKKworICAgICAgaWYgKGF0dHJOYW1lID09PSAndmFsdWUnICYm
IGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBlbGVtZW50LnZhbHVlID09PSB2YWx1ZSkg
eworICAgICAgICAvLyBEbyBub3RoaW5nLiBBdHRlbXB0cyB0byBhdm9pZCBhY2NpZGVudGx5IGNo
YW5naW5nIHRoZSBpbnB1dCBjdXJzb3IgbG9jYXRpb24uCisgICAgICAgIC8vIFNlZSBodHRwczov
L2dpdGh1Yi5jb20vdGlsZGVpby9odG1sYmFycy9wdWxsLzQ0NyBmb3IgbW9yZSBkZXRhaWxzLgor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBkbyBub3QgcmVuZGVyIGlmIGluaXRpYWwgdmFs
dWUgaXMgdW5kZWZpbmVkIG9yIG51bGwKKyAgICAgICAgICB0aGlzLmRvbUhlbHBlci5zZXRQcm9w
ZXJ0eVN0cmljdChlbGVtZW50LCBhdHRyTmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQor
CisgICAgdGhpcy5fcmVuZGVyZWRJbml0aWFsbHkgPSB0cnVlOworICB9CisKKyAgZnVuY3Rpb24g
Z2V0QXR0cmlidXRlKCkgeworICAgIHJldHVybiB0aGlzLmRvbUhlbHBlci5nZXRBdHRyaWJ1dGUo
dGhpcy5lbGVtZW50LCB0aGlzLmF0dHJOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUF0
dHJpYnV0ZSh2YWx1ZSkgeworICAgIGlmIChfZG9tSGVscGVyUHJvcC5pc0F0dHJSZW1vdmFsVmFs
dWUodmFsdWUpKSB7CisgICAgICB0aGlzLmRvbUhlbHBlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5l
bGVtZW50LCB0aGlzLmF0dHJOYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5kb21IZWxw
ZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgdGhpcy5hdHRyTmFtZSwgdmFsdWUpOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5TKCkgeworICAgIHJldHVybiB0aGlz
LmRvbUhlbHBlci5nZXRBdHRyaWJ1dGVOUyh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZXNwYWNlLCB0
aGlzLmF0dHJOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZU5TKHZhbHVl
KSB7CisgICAgaWYgKF9kb21IZWxwZXJQcm9wLmlzQXR0clJlbW92YWxWYWx1ZSh2YWx1ZSkpIHsK
KyAgICAgIHRoaXMuZG9tSGVscGVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsIHRoaXMu
YXR0ck5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmRvbUhlbHBlci5zZXRBdHRyaWJ1
dGVOUyh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZXNwYWNlLCB0aGlzLmF0dHJOYW1lLCB2YWx1ZSk7
CisgICAgfQorICB9CisKKyAgdmFyIFVOU0VUID0geyB1bnNldDogdHJ1ZSB9OworCisgIHZhciBn
dWlkID0gMTsKKworICBBdHRyTW9ycGguY3JlYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGF0dHJO
YW1lLCBkb21IZWxwZXIsIG5hbWVzcGFjZSkgeworICAgIHZhciBucyA9IF9odG1sYmFyc1V0aWwu
Z2V0QXR0ck5hbWVzcGFjZShhdHRyTmFtZSwgbmFtZXNwYWNlKTsKKworICAgIGlmIChucykgewor
ICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVOU0F0dHJNb3JwaChlbGVtZW50LCBhdHRyTmFtZSwg
ZG9tSGVscGVyLCBucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjcmVhdGVOb25OYW1l
c3BhY2VkQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpOworICAgIH0KKyAg
fTsKKworICBmdW5jdGlvbiBjcmVhdGVOb25OYW1lc3BhY2VkQXR0ck1vcnBoKGVsZW1lbnQsIGF0
dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB2YXIgX25vcm1hbGl6ZVByb3BlcnR5ID0gX2RvbUhl
bHBlclByb3Aubm9ybWFsaXplUHJvcGVydHkoZWxlbWVudCwgYXR0ck5hbWUpOworCisgICAgdmFy
IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplUHJvcGVydHkubm9ybWFsaXplZDsKKyAgICB2YXIgdHlw
ZSA9IF9ub3JtYWxpemVQcm9wZXJ0eS50eXBlOworCisgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNl
VVJJID09PSBfZG9tSGVscGVyQnVpbGRIdG1sRG9tLnN2Z05hbWVzcGFjZSB8fCBhdHRyTmFtZSA9
PT0gJ3N0eWxlJyB8fCB0eXBlID09PSAnYXR0cicpIHsKKyAgICAgIHJldHVybiBuZXcgQXR0cmli
dXRlQXR0ck1vcnBoKGVsZW1lbnQsIG5vcm1hbGl6ZWQsIGRvbUhlbHBlcik7CisgICAgfSBlbHNl
IHsKKyAgICAgIHJldHVybiBuZXcgUHJvcGVydHlBdHRyTW9ycGgoZWxlbWVudCwgbm9ybWFsaXpl
ZCwgZG9tSGVscGVyKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBBdHRyTW9ycGgoZWxlbWVu
dCwgYXR0ck5hbWUsIGRvbUhlbHBlcikgeworICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Cisg
ICAgdGhpcy5kb21IZWxwZXIgPSBkb21IZWxwZXI7CisgICAgdGhpcy5hdHRyTmFtZSA9IGF0dHJO
YW1lOworICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkOworICAgIHRoaXMuaXNEaXJ0eSA9IGZh
bHNlOworICAgIHRoaXMuaXNTdWJ0cmVlRGlydHkgPSBmYWxzZTsKKyAgICB0aGlzLmVzY2FwZWQg
PSB0cnVlOworICAgIHRoaXMubGFzdFZhbHVlID0gVU5TRVQ7CisgICAgdGhpcy5sYXN0UmVzdWx0
ID0gbnVsbDsKKyAgICB0aGlzLmxhc3RZaWVsZGVkID0gbnVsbDsKKyAgICB0aGlzLmNoaWxkTm9k
ZXMgPSBudWxsOworICAgIHRoaXMubGlua2VkUGFyYW1zID0gbnVsbDsKKyAgICB0aGlzLmxpbmtl
ZFJlc3VsdCA9IG51bGw7CisgICAgdGhpcy5ndWlkID0gImF0dHIiICsgZ3VpZCsrOworICAgIHRo
aXMuc2VlbiA9IGZhbHNlOworICAgIHRoaXMub3duZXJOb2RlID0gbnVsbDsKKyAgICB0aGlzLnJl
bmRlcmVkID0gZmFsc2U7CisgICAgdGhpcy5fcmVuZGVyZWRJbml0aWFsbHkgPSBmYWxzZTsKKyAg
ICB0aGlzLm5hbWVzcGFjZSA9IHVuZGVmaW5lZDsKKyAgICB0aGlzLmRpZEluaXQoKTsKKyAgfQor
CisgIEF0dHJNb3JwaC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgaWYg
KCF0aGlzLl9zdGF0ZSkgeworICAgICAgdGhpcy5fc3RhdGUgPSB7fTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdGhpcy5fc3RhdGU7CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS5zZXRTdGF0
ZSA9IGZ1bmN0aW9uIChuZXdTdGF0ZSkgeworICAgIC8qanNoaW50IC1XMDkzICovCisKKyAgICBy
ZXR1cm4gdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTsKKyAgfTsKKworICBBdHRyTW9ycGgucHJvdG90
eXBlLmRpZEluaXQgPSBmdW5jdGlvbiAoKSB7fTsKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS53aWxs
U2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHt9OworCisgIEF0dHJNb3JwaC5wcm90b3R5cGUuc2V0
Q29udGVudCA9IGZ1bmN0aW9uICh2YWx1ZSkgeworICAgIHRoaXMud2lsbFNldENvbnRlbnQodmFs
dWUpOworCisgICAgaWYgKHRoaXMubGFzdFZhbHVlID09PSB2YWx1ZSkgeworICAgICAgcmV0dXJu
OworICAgIH0KKyAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOworCisgICAgaWYgKHRoaXMuZXNj
YXBlZCkgeworICAgICAgdmFyIHNhbml0aXplZCA9IF9tb3JwaEF0dHJTYW5pdGl6ZUF0dHJpYnV0
ZVZhbHVlLnNhbml0aXplQXR0cmlidXRlVmFsdWUodGhpcy5kb21IZWxwZXIsIHRoaXMuZWxlbWVu
dCwgdGhpcy5hdHRyTmFtZSwgdmFsdWUpOworICAgICAgdGhpcy5fdXBkYXRlKHNhbml0aXplZCwg
dGhpcy5uYW1lc3BhY2UpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl91cGRhdGUodmFsdWUs
IHRoaXMubmFtZXNwYWNlKTsKKyAgICB9CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlwZS5n
ZXRDb250ZW50ID0gZnVuY3Rpb24gKCkgeworICAgIHZhciB2YWx1ZSA9IHRoaXMubGFzdFZhbHVl
ID0gdGhpcy5fZ2V0KCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIC8vIHJlbmRlckFu
ZENsZWFudXAgY2FsbHMgYGNsZWFyYCBvbiBhbGwgaXRlbXMgaW4gdGhlIG1vcnBoIG1hcAorICAv
LyBqdXN0IGJlZm9yZSBjYWxsaW5nIGBkZXN0cm95YCBvbiB0aGUgbW9ycGguCisgIC8vCisgIC8v
IEFzIGEgZnV0dXJlIHJlZmFjdG9yIHRoaXMgY291bGQgYmUgY2hhbmdlZCB0byBzZXQgdGhlIHBy
b3BlcnR5CisgIC8vIGJhY2sgdG8gaXRzIG9yaWdpbmFsL2RlZmF1bHQgdmFsdWUuCisgIEF0dHJN
b3JwaC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7fTsKKworICBBdHRyTW9ycGgucHJv
dG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5lbGVtZW50ID0gbnVsbDsK
KyAgICB0aGlzLmRvbUhlbHBlciA9IG51bGw7CisgIH07CisKKyAgQXR0ck1vcnBoLnByb3RvdHlw
ZS5fJHN1cGVyQXR0ck1vcnBoID0gQXR0ck1vcnBoOworCisgIGZ1bmN0aW9uIFByb3BlcnR5QXR0
ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB0aGlzLl8kc3VwZXJB
dHRyTW9ycGgoZWxlbWVudCwgYXR0ck5hbWUsIGRvbUhlbHBlcik7CisgIH0KKworICBQcm9wZXJ0
eUF0dHJNb3JwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0dHJNb3JwaC5wcm90b3R5cGUp
OworICBQcm9wZXJ0eUF0dHJNb3JwaC5wcm90b3R5cGUuX3VwZGF0ZSA9IHVwZGF0ZVByb3BlcnR5
OworICBQcm9wZXJ0eUF0dHJNb3JwaC5wcm90b3R5cGUuX2dldCA9IGdldFByb3BlcnR5OworCisg
IGZ1bmN0aW9uIEF0dHJpYnV0ZU5TQXR0ck1vcnBoKGVsZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxw
ZXIsIG5hbWVzcGFjZSkgeworICAgIHRoaXMuXyRzdXBlckF0dHJNb3JwaChlbGVtZW50LCBhdHRy
TmFtZSwgZG9tSGVscGVyKTsKKyAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKyAgfQor
CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXR0ck1v
cnBoLnByb3RvdHlwZSk7CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZS5fdXBkYXRl
ID0gdXBkYXRlQXR0cmlidXRlTlM7CisgIEF0dHJpYnV0ZU5TQXR0ck1vcnBoLnByb3RvdHlwZS5f
Z2V0ID0gZ2V0QXR0cmlidXRlTlM7CisKKyAgZnVuY3Rpb24gQXR0cmlidXRlQXR0ck1vcnBoKGVs
ZW1lbnQsIGF0dHJOYW1lLCBkb21IZWxwZXIpIHsKKyAgICB0aGlzLl8kc3VwZXJBdHRyTW9ycGgo
ZWxlbWVudCwgYXR0ck5hbWUsIGRvbUhlbHBlcik7CisgIH0KKworICBBdHRyaWJ1dGVBdHRyTW9y
cGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdHRyTW9ycGgucHJvdG90eXBlKTsKKyAgQXR0
cmlidXRlQXR0ck1vcnBoLnByb3RvdHlwZS5fdXBkYXRlID0gdXBkYXRlQXR0cmlidXRlOworICBB
dHRyaWJ1dGVBdHRyTW9ycGgucHJvdG90eXBlLl9nZXQgPSBnZXRBdHRyaWJ1dGU7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gQXR0ck1vcnBoOworICBleHBvcnRzLnNhbml0aXplQXR0cmlidXRlVmFs
dWUgPSBfbW9ycGhBdHRyU2FuaXRpemVBdHRyaWJ1dGVWYWx1ZS5zYW5pdGl6ZUF0dHJpYnV0ZVZh
bHVlOworfSk7CitlbmlmZWQoJ21vcnBoLWF0dHIvc2FuaXRpemUtYXR0cmlidXRlLXZhbHVlJywg
WydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qIGpzaGludCBzY3JpcHR1cmw6
dHJ1ZSAqLworCisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLnNhbml0aXplQXR0cmlidXRl
VmFsdWUgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlOworICB2YXIgYmFkUHJvdG9jb2xzID0gewor
ICAgICdqYXZhc2NyaXB0Oic6IHRydWUsCisgICAgJ3Zic2NyaXB0Oic6IHRydWUKKyAgfTsKKwor
ICB2YXIgYmFkVGFncyA9IHsKKyAgICAnQSc6IHRydWUsCisgICAgJ0JPRFknOiB0cnVlLAorICAg
ICdMSU5LJzogdHJ1ZSwKKyAgICAnSU1HJzogdHJ1ZSwKKyAgICAnSUZSQU1FJzogdHJ1ZSwKKyAg
ICAnQkFTRSc6IHRydWUsCisgICAgJ0ZPUk0nOiB0cnVlCisgIH07CisKKyAgdmFyIGJhZFRhZ3NG
b3JEYXRhVVJJID0geworICAgICdFTUJFRCc6IHRydWUKKyAgfTsKKworICB2YXIgYmFkQXR0cmli
dXRlcyA9IHsKKyAgICAnaHJlZic6IHRydWUsCisgICAgJ3NyYyc6IHRydWUsCisgICAgJ2JhY2tn
cm91bmQnOiB0cnVlLAorICAgICdhY3Rpb24nOiB0cnVlCisgIH07CisKKyAgZXhwb3J0cy5iYWRB
dHRyaWJ1dGVzID0gYmFkQXR0cmlidXRlczsKKyAgdmFyIGJhZEF0dHJpYnV0ZXNGb3JEYXRhVVJJ
ID0geworICAgICdzcmMnOiB0cnVlCisgIH07CisKKyAgZnVuY3Rpb24gc2FuaXRpemVBdHRyaWJ1
dGVWYWx1ZShkb20sIGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHsKKyAgICB2YXIgdGFnTmFt
ZTsKKworICAgIGlmICghZWxlbWVudCkgeworICAgICAgdGFnTmFtZSA9IG51bGw7CisgICAgfSBl
bHNlIHsKKyAgICAgIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAg
ICB9CisKKyAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9IVE1MKSB7CisgICAgICByZXR1cm4gdmFs
dWUudG9IVE1MKCk7CisgICAgfQorCisgICAgaWYgKCh0YWdOYW1lID09PSBudWxsIHx8IGJhZFRh
Z3NbdGFnTmFtZV0pICYmIGJhZEF0dHJpYnV0ZXNbYXR0cmlidXRlXSkgeworICAgICAgdmFyIHBy
b3RvY29sID0gZG9tLnByb3RvY29sRm9yVVJMKHZhbHVlKTsKKyAgICAgIGlmIChiYWRQcm90b2Nv
bHNbcHJvdG9jb2xdID09PSB0cnVlKSB7CisgICAgICAgIHJldHVybiAndW5zYWZlOicgKyB2YWx1
ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFkVGFnc0ZvckRhdGFVUklbdGFnTmFtZV0g
JiYgYmFkQXR0cmlidXRlc0ZvckRhdGFVUklbYXR0cmlidXRlXSkgeworICAgICAgcmV0dXJuICd1
bnNhZmU6JyArIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfSk7Citl
bmlmZWQoJ21vcnBoLXJhbmdlJywgWydleHBvcnRzJywgJ21vcnBoLXJhbmdlL3V0aWxzJ10sIGZ1
bmN0aW9uIChleHBvcnRzLCBfbW9ycGhSYW5nZVV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICAvLyBjb25zdHJ1Y3RvciBqdXN0IGluaXRpYWxpemVzIHRoZSBmaWVsZHMKKyAgLy8gdXNlIG9u
ZSBvZiB0aGUgc3RhdGljIGluaXRpYWxpemVycyB0byBjcmVhdGUgYSB2YWxpZCBtb3JwaC4KKyAg
ZnVuY3Rpb24gTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCkgeworICAgIHRoaXMu
ZG9tSGVscGVyID0gZG9tSGVscGVyOworICAgIC8vIGNvbnRleHQgaWYgY29udGVudCBpZiBjdXJy
ZW50IGNvbnRlbnQgaXMgZGV0YWNoZWQKKyAgICB0aGlzLmNvbnRleHR1YWxFbGVtZW50ID0gY29u
dGV4dHVhbEVsZW1lbnQ7CisgICAgLy8gaW5jbHVzaXZlIHJhbmdlIG9mIG1vcnBoCisgICAgLy8g
dGhlc2Ugc2hvdWxkIGJlIG5vZGVUeXBlIDEsIDMsIG9yIDgKKyAgICB0aGlzLmZpcnN0Tm9kZSA9
IG51bGw7CisgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7CisKKyAgICAvLyBmbGFnIHRvIGZvcmNl
IHRleHQgdG8gc2V0Q29udGVudCB0byBiZSB0cmVhdGVkIGFzIGh0bWwKKyAgICB0aGlzLnBhcnNl
VGV4dEFzSFRNTCA9IGZhbHNlOworCisgICAgLy8gbW9ycGggbGlzdCBncmFwaAorICAgIHRoaXMu
cGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICB0aGlzLnByZXZpb3VzTW9ycGggPSBudWxsOwor
ICAgIHRoaXMubmV4dE1vcnBoID0gbnVsbDsKKyAgfQorCisgIE1vcnBoLmVtcHR5ID0gZnVuY3Rp
b24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQpIHsKKyAgICB2YXIgbW9ycGggPSBuZXcg
TW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguY2xlYXIoKTsK
KyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgTW9ycGguY3JlYXRlID0gZnVuY3Rpb24gKGRv
bUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQsIG5vZGUpIHsKKyAgICB2YXIgbW9ycGggPSBuZXcg
TW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7CisgICAgbW9ycGguc2V0Tm9kZShu
b2RlKTsKKyAgICByZXR1cm4gbW9ycGg7CisgIH07CisKKyAgTW9ycGguYXR0YWNoID0gZnVuY3Rp
b24gKGRvbUhlbHBlciwgY29udGV4dHVhbEVsZW1lbnQsIGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsK
KyAgICB2YXIgbW9ycGggPSBuZXcgTW9ycGgoZG9tSGVscGVyLCBjb250ZXh0dWFsRWxlbWVudCk7
CisgICAgbW9ycGguc2V0UmFuZ2UoZmlyc3ROb2RlLCBsYXN0Tm9kZSk7CisgICAgcmV0dXJuIG1v
cnBoOworICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24gTW9y
cGgkc2V0Q29udGVudChjb250ZW50KSB7CisgICAgaWYgKGNvbnRlbnQgPT09IG51bGwgfHwgY29u
dGVudCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm4gdGhpcy5jbGVhcigpOworICAgIH0K
KworICAgIHZhciB0eXBlID0gdHlwZW9mIGNvbnRlbnQ7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgICBjYXNlICdzdHJpbmcnOgorICAgICAgICBpZiAodGhpcy5wYXJzZVRleHRBc0hUTUwpIHsK
KyAgICAgICAgICByZXR1cm4gdGhpcy5kb21IZWxwZXIuc2V0TW9ycGhIVE1MKHRoaXMsIGNvbnRl
bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnNldFRleHQoY29udGVudCk7Cisg
ICAgICBjYXNlICdvYmplY3QnOgorICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQubm9kZVR5cGUg
PT09ICdudW1iZXInKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Tm9kZShjb250ZW50KTsK
KyAgICAgICAgfQorICAgICAgICAvKiBIYW5kbGViYXJzLlNhZmVTdHJpbmcgKi8KKyAgICAgICAg
aWYgKHR5cGVvZiBjb250ZW50LnRvSFRNTCA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICAgIHJl
dHVybiB0aGlzLnNldEhUTUwoY29udGVudC50b0hUTUwoKSk7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHRoaXMucGFyc2VUZXh0QXNIVE1MKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0SFRN
TChjb250ZW50LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAvKiBmYWxscyB0aHJvdWdo
ICovCisgICAgICBjYXNlICdib29sZWFuJzoKKyAgICAgIGNhc2UgJ251bWJlcic6CisgICAgICAg
IHJldHVybiB0aGlzLnNldFRleHQoY29udGVudC50b1N0cmluZygpKTsKKyAgICAgIGNhc2UgJ2Z1
bmN0aW9uJzoKKyAgICAgICAgcmFpc2VDYW5ub3RCaW5kVG9GdW5jdGlvbihjb250ZW50KTsKKyAg
ICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vuc3VwcG9ydGVkIGNv
bnRlbnQnKTsKKyAgICB9CisgIH07CisKKyAgZnVuY3Rpb24gcmFpc2VDYW5ub3RCaW5kVG9GdW5j
dGlvbihjb250ZW50KSB7CisgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGNvbnRlbnQubmFtZTsKKyAg
ICB2YXIgbWVzc2FnZTsKKworICAgIGlmIChmdW5jdGlvbk5hbWUpIHsKKyAgICAgIG1lc3NhZ2Ug
PSAnVW5zdXBwb3J0ZWQgQ29udGVudDogQ2Fubm90IGJpbmQgdG8gZnVuY3Rpb24gYCcgKyBmdW5j
dGlvbk5hbWUgKyAnYCc7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UgPSAnVW5zdXBwb3J0
ZWQgQ29udGVudDogQ2Fubm90IGJpbmQgdG8gZnVuY3Rpb24nOworICAgIH0KKworICAgIHRocm93
IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7CisgIH0KKworICBNb3JwaC5wcm90b3R5cGUuY2xlYXIg
PSBmdW5jdGlvbiBNb3JwaCRjbGVhcigpIHsKKyAgICB2YXIgbm9kZSA9IHRoaXMuc2V0Tm9kZSh0
aGlzLmRvbUhlbHBlci5jcmVhdGVDb21tZW50KCcnKSk7CisgICAgcmV0dXJuIG5vZGU7CisgIH07
CisKKyAgTW9ycGgucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiBNb3JwaCRzZXRUZXh0KHRl
eHQpIHsKKyAgICB2YXIgZmlyc3ROb2RlID0gdGhpcy5maXJzdE5vZGU7CisgICAgdmFyIGxhc3RO
b2RlID0gdGhpcy5sYXN0Tm9kZTsKKworICAgIGlmIChmaXJzdE5vZGUgJiYgbGFzdE5vZGUgPT09
IGZpcnN0Tm9kZSAmJiBmaXJzdE5vZGUubm9kZVR5cGUgPT09IDMpIHsKKyAgICAgIGZpcnN0Tm9k
ZS5ub2RlVmFsdWUgPSB0ZXh0OworICAgICAgcmV0dXJuIGZpcnN0Tm9kZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdGhpcy5zZXROb2RlKHRleHQgPyB0aGlzLmRvbUhlbHBlci5jcmVhdGVUZXh0Tm9k
ZSh0ZXh0KSA6IHRoaXMuZG9tSGVscGVyLmNyZWF0ZUNvbW1lbnQoJycpKTsKKyAgfTsKKworICBN
b3JwaC5wcm90b3R5cGUuc2V0Tm9kZSA9IGZ1bmN0aW9uIE1vcnBoJHNldE5vZGUobmV3Tm9kZSkg
eworICAgIHZhciBmaXJzdE5vZGUsIGxhc3ROb2RlOworICAgIHN3aXRjaCAobmV3Tm9kZS5ub2Rl
VHlwZSkgeworICAgICAgY2FzZSAzOgorICAgICAgICBmaXJzdE5vZGUgPSBuZXdOb2RlOworICAg
ICAgICBsYXN0Tm9kZSA9IG5ld05vZGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMToK
KyAgICAgICAgZmlyc3ROb2RlID0gbmV3Tm9kZS5maXJzdENoaWxkOworICAgICAgICBsYXN0Tm9k
ZSA9IG5ld05vZGUubGFzdENoaWxkOworICAgICAgICBpZiAoZmlyc3ROb2RlID09PSBudWxsKSB7
CisgICAgICAgICAgZmlyc3ROb2RlID0gdGhpcy5kb21IZWxwZXIuY3JlYXRlQ29tbWVudCgnJyk7
CisgICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChmaXJzdE5vZGUpOworICAgICAgICAgIGxh
c3ROb2RlID0gZmlyc3ROb2RlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVm
YXVsdDoKKyAgICAgICAgZmlyc3ROb2RlID0gbmV3Tm9kZTsKKyAgICAgICAgbGFzdE5vZGUgPSBu
ZXdOb2RlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB0aGlzLnNldFJhbmdlKGZpcnN0
Tm9kZSwgbGFzdE5vZGUpOworCisgICAgcmV0dXJuIG5ld05vZGU7CisgIH07CisKKyAgTW9ycGgu
cHJvdG90eXBlLnNldFJhbmdlID0gZnVuY3Rpb24gKGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsKKyAg
ICB2YXIgcHJldmlvdXNGaXJzdE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKyAgICBpZiAocHJldmlv
dXNGaXJzdE5vZGUgIT09IG51bGwpIHsKKworICAgICAgdmFyIHBhcmVudE5vZGUgPSBwcmV2aW91
c0ZpcnN0Tm9kZS5wYXJlbnROb2RlOworICAgICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHsK
KyAgICAgICAgX21vcnBoUmFuZ2VVdGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgZmlyc3RO
b2RlLCBsYXN0Tm9kZSwgcHJldmlvdXNGaXJzdE5vZGUpOworICAgICAgICBfbW9ycGhSYW5nZVV0
aWxzLmNsZWFyKHBhcmVudE5vZGUsIHByZXZpb3VzRmlyc3ROb2RlLCB0aGlzLmxhc3ROb2RlKTsK
KyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmZpcnN0Tm9kZSA9IGZpcnN0Tm9kZTsKKyAgICB0
aGlzLmxhc3ROb2RlID0gbGFzdE5vZGU7CisKKyAgICBpZiAodGhpcy5wYXJlbnRNb3JwaExpc3Qp
IHsKKyAgICAgIHRoaXMuX3N5bmNGaXJzdE5vZGUoKTsKKyAgICAgIHRoaXMuX3N5bmNMYXN0Tm9k
ZSgpOworICAgIH0KKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9u
IE1vcnBoJGRlc3Ryb3koKSB7CisgICAgdGhpcy51bmxpbmsoKTsKKworICAgIHZhciBmaXJzdE5v
ZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKyAgICB2YXIgbGFzdE5vZGUgPSB0aGlzLmxhc3ROb2RlOwor
ICAgIHZhciBwYXJlbnROb2RlID0gZmlyc3ROb2RlICYmIGZpcnN0Tm9kZS5wYXJlbnROb2RlOwor
CisgICAgdGhpcy5maXJzdE5vZGUgPSBudWxsOworICAgIHRoaXMubGFzdE5vZGUgPSBudWxsOwor
CisgICAgX21vcnBoUmFuZ2VVdGlscy5jbGVhcihwYXJlbnROb2RlLCBmaXJzdE5vZGUsIGxhc3RO
b2RlKTsKKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUudW5saW5rID0gZnVuY3Rpb24gTW9ycGgk
dW5saW5rKCkgeworICAgIHZhciBwYXJlbnRNb3JwaExpc3QgPSB0aGlzLnBhcmVudE1vcnBoTGlz
dDsKKyAgICB2YXIgcHJldmlvdXNNb3JwaCA9IHRoaXMucHJldmlvdXNNb3JwaDsKKyAgICB2YXIg
bmV4dE1vcnBoID0gdGhpcy5uZXh0TW9ycGg7CisKKyAgICBpZiAocHJldmlvdXNNb3JwaCkgewor
ICAgICAgaWYgKG5leHRNb3JwaCkgeworICAgICAgICBwcmV2aW91c01vcnBoLm5leHRNb3JwaCA9
IG5leHRNb3JwaDsKKyAgICAgICAgbmV4dE1vcnBoLnByZXZpb3VzTW9ycGggPSBwcmV2aW91c01v
cnBoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlvdXNNb3JwaC5uZXh0TW9ycGggPSBu
dWxsOworICAgICAgICBwYXJlbnRNb3JwaExpc3QubGFzdENoaWxkTW9ycGggPSBwcmV2aW91c01v
cnBoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobmV4dE1vcnBoKSB7CisgICAg
ICAgIG5leHRNb3JwaC5wcmV2aW91c01vcnBoID0gbnVsbDsKKyAgICAgICAgcGFyZW50TW9ycGhM
aXN0LmZpcnN0Q2hpbGRNb3JwaCA9IG5leHRNb3JwaDsKKyAgICAgIH0gZWxzZSBpZiAocGFyZW50
TW9ycGhMaXN0KSB7CisgICAgICAgIHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaCA9IHBh
cmVudE1vcnBoTGlzdC5maXJzdENoaWxkTW9ycGggPSBudWxsOworICAgICAgfQorICAgIH0KKwor
ICAgIHRoaXMucGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICB0aGlzLm5leHRNb3JwaCA9IG51
bGw7CisgICAgdGhpcy5wcmV2aW91c01vcnBoID0gbnVsbDsKKworICAgIGlmIChwYXJlbnRNb3Jw
aExpc3QgJiYgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaCkgeworICAgICAgaWYgKCFwYXJl
bnRNb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICAgIC8vIGxpc3QgaXMgZW1wdHkK
KyAgICAgICAgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5jbGVhcigpOworICAgICAgICBy
ZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJlbnRNb3JwaExpc3QuZmlyc3RDaGls
ZE1vcnBoLl9zeW5jRmlyc3ROb2RlKCk7CisgICAgICAgIHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hp
bGRNb3JwaC5fc3luY0xhc3ROb2RlKCk7CisgICAgICB9CisgICAgfQorICB9OworCisgIE1vcnBo
LnByb3RvdHlwZS5zZXRIVE1MID0gZnVuY3Rpb24gKHRleHQpIHsKKyAgICB2YXIgZnJhZ21lbnQg
PSB0aGlzLmRvbUhlbHBlci5wYXJzZUhUTUwodGV4dCwgdGhpcy5jb250ZXh0dWFsRWxlbWVudCk7
CisgICAgcmV0dXJuIHRoaXMuc2V0Tm9kZShmcmFnbWVudCk7CisgIH07CisKKyAgTW9ycGgucHJv
dG90eXBlLnNldE1vcnBoTGlzdCA9IGZ1bmN0aW9uIE1vcnBoJGFwcGVuZE1vcnBoTGlzdChtb3Jw
aExpc3QpIHsKKyAgICBtb3JwaExpc3QubW91bnRlZE1vcnBoID0gdGhpczsKKyAgICB0aGlzLmNs
ZWFyKCk7CisKKyAgICB2YXIgb3JpZ2luYWxGaXJzdE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTsKKwor
ICAgIGlmIChtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoKSB7CisgICAgICB0aGlzLmZpcnN0Tm9k
ZSA9IG1vcnBoTGlzdC5maXJzdENoaWxkTW9ycGguZmlyc3ROb2RlOworICAgICAgdGhpcy5sYXN0
Tm9kZSA9IG1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaC5sYXN0Tm9kZTsKKworICAgICAgdmFyIGN1
cnJlbnQgPSBtb3JwaExpc3QuZmlyc3RDaGlsZE1vcnBoOworCisgICAgICB3aGlsZSAoY3VycmVu
dCkgeworICAgICAgICB2YXIgbmV4dCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgICBjdXJy
ZW50Lmluc2VydEJlZm9yZU5vZGUob3JpZ2luYWxGaXJzdE5vZGUsIG51bGwpOworICAgICAgICBj
dXJyZW50ID0gbmV4dDsKKyAgICAgIH0KKyAgICAgIG9yaWdpbmFsRmlyc3ROb2RlLnBhcmVudE5v
ZGUucmVtb3ZlQ2hpbGQob3JpZ2luYWxGaXJzdE5vZGUpOworICAgIH0KKyAgfTsKKworICBNb3Jw
aC5wcm90b3R5cGUuX3N5bmNGaXJzdE5vZGUgPSBmdW5jdGlvbiBNb3JwaCRzeW5jRmlyc3ROb2Rl
KCkgeworICAgIHZhciBtb3JwaCA9IHRoaXM7CisgICAgdmFyIHBhcmVudE1vcnBoTGlzdDsKKyAg
ICB3aGlsZSAocGFyZW50TW9ycGhMaXN0ID0gbW9ycGgucGFyZW50TW9ycGhMaXN0KSB7CisgICAg
ICBpZiAocGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaCA9PT0gbnVsbCkgeworICAgICAgICBi
cmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaCAhPT0gcGFyZW50TW9ycGhMaXN0LmZpcnN0
Q2hpbGRNb3JwaCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaC5m
aXJzdE5vZGUgPT09IHBhcmVudE1vcnBoTGlzdC5tb3VudGVkTW9ycGguZmlyc3ROb2RlKSB7Cisg
ICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwYXJlbnRNb3JwaExpc3QubW91bnRlZE1v
cnBoLmZpcnN0Tm9kZSA9IG1vcnBoLmZpcnN0Tm9kZTsKKworICAgICAgbW9ycGggPSBwYXJlbnRN
b3JwaExpc3QubW91bnRlZE1vcnBoOworICAgIH0KKyAgfTsKKworICBNb3JwaC5wcm90b3R5cGUu
X3N5bmNMYXN0Tm9kZSA9IGZ1bmN0aW9uIE1vcnBoJHN5bmNMYXN0Tm9kZSgpIHsKKyAgICB2YXIg
bW9ycGggPSB0aGlzOworICAgIHZhciBwYXJlbnRNb3JwaExpc3Q7CisgICAgd2hpbGUgKHBhcmVu
dE1vcnBoTGlzdCA9IG1vcnBoLnBhcmVudE1vcnBoTGlzdCkgeworICAgICAgaWYgKHBhcmVudE1v
cnBoTGlzdC5tb3VudGVkTW9ycGggPT09IG51bGwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9
CisgICAgICBpZiAobW9ycGggIT09IHBhcmVudE1vcnBoTGlzdC5sYXN0Q2hpbGRNb3JwaCkgewor
ICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtb3JwaC5sYXN0Tm9kZSA9PT0gcGFy
ZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5sYXN0Tm9kZSkgeworICAgICAgICBicmVhazsKKyAg
ICAgIH0KKworICAgICAgcGFyZW50TW9ycGhMaXN0Lm1vdW50ZWRNb3JwaC5sYXN0Tm9kZSA9IG1v
cnBoLmxhc3ROb2RlOworCisgICAgICBtb3JwaCA9IHBhcmVudE1vcnBoTGlzdC5tb3VudGVkTW9y
cGg7CisgICAgfQorICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5pbnNlcnRCZWZvcmVOb2RlID0g
ZnVuY3Rpb24gTW9ycGgkaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnROb2RlLCByZWZOb2RlKSB7Cisg
ICAgX21vcnBoUmFuZ2VVdGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgdGhpcy5maXJzdE5v
ZGUsIHRoaXMubGFzdE5vZGUsIHJlZk5vZGUpOworICB9OworCisgIE1vcnBoLnByb3RvdHlwZS5h
cHBlbmRUb05vZGUgPSBmdW5jdGlvbiBNb3JwaCRhcHBlbmRUb05vZGUocGFyZW50Tm9kZSkgewor
ICAgIF9tb3JwaFJhbmdlVXRpbHMuaW5zZXJ0QmVmb3JlKHBhcmVudE5vZGUsIHRoaXMuZmlyc3RO
b2RlLCB0aGlzLmxhc3ROb2RlLCBudWxsKTsKKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBN
b3JwaDsKK30pOworZW5pZmVkKCdtb3JwaC1yYW5nZS9tb3JwaC1saXN0JywgWydleHBvcnRzJywg
J21vcnBoLXJhbmdlL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfbW9ycGhSYW5nZVV0aWxz
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBNb3JwaExpc3QoKSB7CisgICAgLy8g
bW9ycGggZ3JhcGgKKyAgICB0aGlzLmZpcnN0Q2hpbGRNb3JwaCA9IG51bGw7CisgICAgdGhpcy5s
YXN0Q2hpbGRNb3JwaCA9IG51bGw7CisKKyAgICB0aGlzLm1vdW50ZWRNb3JwaCA9IG51bGw7Cisg
IH0KKworICB2YXIgcHJvdG90eXBlID0gTW9ycGhMaXN0LnByb3RvdHlwZTsKKworICBwcm90b3R5
cGUuY2xlYXIgPSBmdW5jdGlvbiBNb3JwaExpc3QkY2xlYXIoKSB7CisgICAgdmFyIGN1cnJlbnQg
PSB0aGlzLmZpcnN0Q2hpbGRNb3JwaDsKKworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICB2
YXIgbmV4dCA9IGN1cnJlbnQubmV4dE1vcnBoOworICAgICAgY3VycmVudC5wcmV2aW91c01vcnBo
ID0gbnVsbDsKKyAgICAgIGN1cnJlbnQubmV4dE1vcnBoID0gbnVsbDsKKyAgICAgIGN1cnJlbnQu
cGFyZW50TW9ycGhMaXN0ID0gbnVsbDsKKyAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0KKwor
ICAgIHRoaXMuZmlyc3RDaGlsZE1vcnBoID0gdGhpcy5sYXN0Q2hpbGRNb3JwaCA9IG51bGw7Cisg
IH07CisKKyAgcHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBNb3JwaExpc3QkZGVzdHJveSgp
IHt9OworCisgIHByb3RvdHlwZS5hcHBlbmRNb3JwaCA9IGZ1bmN0aW9uIE1vcnBoTGlzdCRhcHBl
bmRNb3JwaChtb3JwaCkgeworICAgIHRoaXMuaW5zZXJ0QmVmb3JlTW9ycGgobW9ycGgsIG51bGwp
OworICB9OworCisgIHByb3RvdHlwZS5pbnNlcnRCZWZvcmVNb3JwaCA9IGZ1bmN0aW9uIE1vcnBo
TGlzdCRpbnNlcnRCZWZvcmVNb3JwaChtb3JwaCwgcmVmZXJlbmNlTW9ycGgpIHsKKyAgICBpZiAo
bW9ycGgucGFyZW50TW9ycGhMaXN0ICE9PSBudWxsKSB7CisgICAgICBtb3JwaC51bmxpbmsoKTsK
KyAgICB9CisgICAgaWYgKHJlZmVyZW5jZU1vcnBoICYmIHJlZmVyZW5jZU1vcnBoLnBhcmVudE1v
cnBoTGlzdCAhPT0gdGhpcykgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbW9ycGggYmVm
b3JlIHdoaWNoIHRoZSBuZXcgbW9ycGggaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQg
b2YgdGhpcyBtb3JwaC4nKTsKKyAgICB9CisKKyAgICB2YXIgbW91bnRlZE1vcnBoID0gdGhpcy5t
b3VudGVkTW9ycGg7CisKKyAgICBpZiAobW91bnRlZE1vcnBoKSB7CisKKyAgICAgIHZhciBwYXJl
bnROb2RlID0gbW91bnRlZE1vcnBoLmZpcnN0Tm9kZS5wYXJlbnROb2RlOworICAgICAgdmFyIHJl
ZmVyZW5jZU5vZGUgPSByZWZlcmVuY2VNb3JwaCA/IHJlZmVyZW5jZU1vcnBoLmZpcnN0Tm9kZSA6
IG1vdW50ZWRNb3JwaC5sYXN0Tm9kZS5uZXh0U2libGluZzsKKworICAgICAgX21vcnBoUmFuZ2VV
dGlscy5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgbW9ycGguZmlyc3ROb2RlLCBtb3JwaC5sYXN0
Tm9kZSwgcmVmZXJlbmNlTm9kZSk7CisKKyAgICAgIC8vIHdhcyBub3QgaW4gbGlzdCBtb2RlIHJl
cGxhY2UgY3VycmVudCBjb250ZW50CisgICAgICBpZiAoIXRoaXMuZmlyc3RDaGlsZE1vcnBoKSB7
CisgICAgICAgIF9tb3JwaFJhbmdlVXRpbHMuY2xlYXIodGhpcy5tb3VudGVkTW9ycGguZmlyc3RO
b2RlLnBhcmVudE5vZGUsIHRoaXMubW91bnRlZE1vcnBoLmZpcnN0Tm9kZSwgdGhpcy5tb3VudGVk
TW9ycGgubGFzdE5vZGUpOworICAgICAgfQorICAgIH0KKworICAgIG1vcnBoLnBhcmVudE1vcnBo
TGlzdCA9IHRoaXM7CisKKyAgICB2YXIgcHJldmlvdXNNb3JwaCA9IHJlZmVyZW5jZU1vcnBoID8g
cmVmZXJlbmNlTW9ycGgucHJldmlvdXNNb3JwaCA6IHRoaXMubGFzdENoaWxkTW9ycGg7CisgICAg
aWYgKHByZXZpb3VzTW9ycGgpIHsKKyAgICAgIHByZXZpb3VzTW9ycGgubmV4dE1vcnBoID0gbW9y
cGg7CisgICAgICBtb3JwaC5wcmV2aW91c01vcnBoID0gcHJldmlvdXNNb3JwaDsKKyAgICB9IGVs
c2UgeworICAgICAgdGhpcy5maXJzdENoaWxkTW9ycGggPSBtb3JwaDsKKyAgICB9CisKKyAgICBp
ZiAocmVmZXJlbmNlTW9ycGgpIHsKKyAgICAgIHJlZmVyZW5jZU1vcnBoLnByZXZpb3VzTW9ycGgg
PSBtb3JwaDsKKyAgICAgIG1vcnBoLm5leHRNb3JwaCA9IHJlZmVyZW5jZU1vcnBoOworICAgIH0g
ZWxzZSB7CisgICAgICB0aGlzLmxhc3RDaGlsZE1vcnBoID0gbW9ycGg7CisgICAgfQorCisgICAg
dGhpcy5maXJzdENoaWxkTW9ycGguX3N5bmNGaXJzdE5vZGUoKTsKKyAgICB0aGlzLmxhc3RDaGls
ZE1vcnBoLl9zeW5jTGFzdE5vZGUoKTsKKyAgfTsKKworICBwcm90b3R5cGUucmVtb3ZlQ2hpbGRN
b3JwaCA9IGZ1bmN0aW9uIE1vcnBoTGlzdCRyZW1vdmVDaGlsZE1vcnBoKG1vcnBoKSB7CisgICAg
aWYgKG1vcnBoLnBhcmVudE1vcnBoTGlzdCAhPT0gdGhpcykgeworICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJDYW5ub3QgcmVtb3ZlIGEgbW9ycGggZnJvbSBhIHBhcmVudCBpdCBpcyBub3QgaW5zaWRl
IG9mIik7CisgICAgfQorCisgICAgbW9ycGguZGVzdHJveSgpOworICB9OworCisgIGV4cG9ydHMu
ZGVmYXVsdCA9IE1vcnBoTGlzdDsKK30pOworZW5pZmVkKCdtb3JwaC1yYW5nZS9tb3JwaC1saXN0
LnVtZCcsIFsnZXhwb3J0cycsICdtb3JwaC1yYW5nZS9tb3JwaC1saXN0J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfbW9ycGhSYW5nZU1vcnBoTGlzdCkgeworICAndXNlIHN0cmljdCc7CisKKyAgKGZ1
bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CisgICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5j
dGlvbicgJiYgZGVmaW5lLmFtZCkgeworICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTsKKyAgICB9
IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgeworICAgICAgbW9kdWxlLmV4
cG9ydHMgPSBmYWN0b3J5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJvb3QuTW9ycGhMaXN0ID0g
ZmFjdG9yeSgpOworICAgIH0KKyAgfSkodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7CisgICAgcmV0
dXJuIF9tb3JwaFJhbmdlTW9ycGhMaXN0LmRlZmF1bHQ7CisgIH0pOworfSk7CitlbmlmZWQoIm1v
cnBoLXJhbmdlL3V0aWxzIiwgWyJleHBvcnRzIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8v
IGluY2x1c2l2ZSBvZiBib3RoIG5vZGVzCisgICJ1c2Ugc3RyaWN0IjsKKworICBleHBvcnRzLmNs
ZWFyID0gY2xlYXI7CisgIGV4cG9ydHMuaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlOworCisg
IGZ1bmN0aW9uIGNsZWFyKHBhcmVudE5vZGUsIGZpcnN0Tm9kZSwgbGFzdE5vZGUpIHsKKyAgICBp
ZiAoIXBhcmVudE5vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbm9kZSA9
IGZpcnN0Tm9kZTsKKyAgICB2YXIgbmV4dE5vZGU7CisgICAgZG8geworICAgICAgbmV4dE5vZGUg
PSBub2RlLm5leHRTaWJsaW5nOworICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsK
KyAgICAgIGlmIChub2RlID09PSBsYXN0Tm9kZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0K
KyAgICAgIG5vZGUgPSBuZXh0Tm9kZTsKKyAgICB9IHdoaWxlIChub2RlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBmaXJzdE5vZGUsIGxhc3ROb2RlLCByZWZO
b2RlKSB7CisgICAgdmFyIG5vZGUgPSBmaXJzdE5vZGU7CisgICAgdmFyIG5leHROb2RlOworICAg
IGRvIHsKKyAgICAgIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgIHBhcmVudE5v
ZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpOworICAgICAgaWYgKG5vZGUgPT09IGxhc3RO
b2RlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbm9kZSA9IG5leHROb2RlOwor
ICAgIH0gd2hpbGUgKG5vZGUpOworICB9Cit9KTsKK2VuaWZlZCgncm91dGUtcmVjb2duaXplcics
IFsnZXhwb3J0cycsICdyb3V0ZS1yZWNvZ25pemVyL2RzbCddLCBmdW5jdGlvbiAoZXhwb3J0cywg
X3JvdXRlUmVjb2duaXplckRzbCkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIHNwZWNpYWxz
ID0gWycvJywgJy4nLCAnKicsICcrJywgJz8nLCAnfCcsICcoJywgJyknLCAnWycsICddJywgJ3sn
LCAnfScsICdcXCddOworCisgIHZhciBlc2NhcGVSZWdleCA9IG5ldyBSZWdFeHAoJyhcXCcgKyBz
cGVjaWFscy5qb2luKCd8XFwnKSArICcpJywgJ2cnKTsKKworICBmdW5jdGlvbiBpc0FycmF5KHRl
c3QpIHsKKyAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRlc3QpID09
PSAiW29iamVjdCBBcnJheV0iOworICB9CisKKyAgLy8gQSBTZWdtZW50IHJlcHJlc2VudHMgYSBz
ZWdtZW50IGluIHRoZSBvcmlnaW5hbCByb3V0ZSBkZXNjcmlwdGlvbi4KKyAgLy8gRWFjaCBTZWdt
ZW50IHR5cGUgcHJvdmlkZXMgYW4gYGVhY2hDaGFyYCBhbmQgYHJlZ2V4YCBtZXRob2QuCisgIC8v
CisgIC8vIFRoZSBgZWFjaENoYXJgIG1ldGhvZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoIG9u
ZSBvciBtb3JlIGNoYXJhY3RlcgorICAvLyBzcGVjaWZpY2F0aW9ucy4gQSBjaGFyYWN0ZXIgc3Bl
Y2lmaWNhdGlvbiBjb25zdW1lcyBvbmUgb3IgbW9yZSBpbnB1dAorICAvLyBjaGFyYWN0ZXJzLgor
ICAvLworICAvLyBUaGUgYHJlZ2V4YCBtZXRob2QgcmV0dXJucyBhIHJlZ2V4IGZyYWdtZW50IGZv
ciB0aGUgc2VnbWVudC4gSWYgdGhlCisgIC8vIHNlZ21lbnQgaXMgYSBkeW5hbWljIG9mIHN0YXIg
c2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFsc28gaW5jbHVkZXMKKyAgLy8gYSBjYXB0dXJl
LgorICAvLworICAvLyBBIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgorICAvLwor
ICAvLyAqIGB2YWxpZENoYXJzYDogYSBTdHJpbmcgd2l0aCBhIGxpc3Qgb2YgYWxsIHZhbGlkIGNo
YXJhY3RlcnMsIG9yCisgIC8vICogYGludmFsaWRDaGFyc2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0
IG9mIGFsbCBpbnZhbGlkIGNoYXJhY3RlcnMKKyAgLy8gKiBgcmVwZWF0YDogdHJ1ZSBpZiB0aGUg
Y2hhcmFjdGVyIHNwZWNpZmljYXRpb24gY2FuIHJlcGVhdAorCisgIGZ1bmN0aW9uIFN0YXRpY1Nl
Z21lbnQoc3RyaW5nKSB7CisgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgIH0KKyAgU3RhdGlj
U2VnbWVudC5wcm90b3R5cGUgPSB7CisgICAgZWFjaENoYXI6IGZ1bmN0aW9uIChjYWxsYmFjaykg
eworICAgICAgdmFyIHN0cmluZyA9IHRoaXMuc3RyaW5nLAorICAgICAgICAgIGNoOworCisgICAg
ICBmb3IgKHZhciBpID0gMCwgbCA9IHN0cmluZy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAg
ICAgY2ggPSBzdHJpbmcuY2hhckF0KGkpOworICAgICAgICBjYWxsYmFjayh7IHZhbGlkQ2hhcnM6
IGNoIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICByZWdleDogZnVuY3Rpb24gKCkgeworICAg
ICAgcmV0dXJuIHRoaXMuc3RyaW5nLnJlcGxhY2UoZXNjYXBlUmVnZXgsICdcXCQxJyk7CisgICAg
fSwKKworICAgIGdlbmVyYXRlOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdHJp
bmc7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIER5bmFtaWNTZWdtZW50KG5hbWUpIHsKKyAg
ICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisgIER5bmFtaWNTZWdtZW50LnByb3RvdHlwZSA9IHsK
KyAgICBlYWNoQ2hhcjogZnVuY3Rpb24gKGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjayh7IGlu
dmFsaWRDaGFyczogIi8iLCByZXBlYXQ6IHRydWUgfSk7CisgICAgfSwKKworICAgIHJlZ2V4OiBm
dW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gIihbXi9dKykiOworICAgIH0sCisKKyAgICBnZW5l
cmF0ZTogZnVuY3Rpb24gKHBhcmFtcykgeworICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVd
OworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7CisgICAgdGhp
cy5uYW1lID0gbmFtZTsKKyAgfQorICBTdGFyU2VnbWVudC5wcm90b3R5cGUgPSB7CisgICAgZWFj
aENoYXI6IGZ1bmN0aW9uIChjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2soeyBpbnZhbGlkQ2hh
cnM6ICIiLCByZXBlYXQ6IHRydWUgfSk7CisgICAgfSwKKworICAgIHJlZ2V4OiBmdW5jdGlvbiAo
KSB7CisgICAgICByZXR1cm4gIiguKykiOworICAgIH0sCisKKyAgICBnZW5lcmF0ZTogZnVuY3Rp
b24gKHBhcmFtcykgeworICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOworICAgIH0KKyAg
fTsKKworICBmdW5jdGlvbiBFcHNpbG9uU2VnbWVudCgpIHt9CisgIEVwc2lsb25TZWdtZW50LnBy
b3RvdHlwZSA9IHsKKyAgICBlYWNoQ2hhcjogZnVuY3Rpb24gKCkge30sCisgICAgcmVnZXg6IGZ1
bmN0aW9uICgpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9LAorICAgIGdlbmVyYXRlOiBmdW5j
dGlvbiAoKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIHBh
cnNlKHJvdXRlLCBuYW1lcywgdHlwZXMpIHsKKyAgICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90
IHN0YXJ0aW5nIHdpdGggYSAiLyIuIFJlY29nbml0aW9uIHdpbGwKKyAgICAvLyBhbHNvIG5vcm1h
bGl6ZS4KKyAgICBpZiAocm91dGUuY2hhckF0KDApID09PSAiLyIpIHsKKyAgICAgIHJvdXRlID0g
cm91dGUuc3Vic3RyKDEpOworICAgIH0KKworICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNwbGl0
KCIvIiksCisgICAgICAgIHJlc3VsdHMgPSBbXTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0g
c2VnbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgc2VnbWVudCA9IHNlZ21l
bnRzW2ldLAorICAgICAgICAgIG1hdGNoOworCisgICAgICBpZiAobWF0Y2ggPSBzZWdtZW50Lm1h
dGNoKC9eOihbXlwvXSspJC8pKSB7CisgICAgICAgIHJlc3VsdHMucHVzaChuZXcgRHluYW1pY1Nl
Z21lbnQobWF0Y2hbMV0pKTsKKyAgICAgICAgbmFtZXMucHVzaChtYXRjaFsxXSk7CisgICAgICAg
IHR5cGVzLmR5bmFtaWNzKys7CisgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gc2VnbWVudC5tYXRj
aCgvXlwqKFteXC9dKykkLykpIHsKKyAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGFyU2VnbWVu
dChtYXRjaFsxXSkpOworICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFdKTsKKyAgICAgICAgdHlw
ZXMuc3RhcnMrKzsKKyAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gIiIpIHsKKyAgICAgICAg
cmVzdWx0cy5wdXNoKG5ldyBFcHNpbG9uU2VnbWVudCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAg
ICAgIHJlc3VsdHMucHVzaChuZXcgU3RhdGljU2VnbWVudChzZWdtZW50KSk7CisgICAgICAgIHR5
cGVzLnN0YXRpY3MrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0czsKKyAg
fQorCisgIC8vIEEgU3RhdGUgaGFzIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYW5kIChgY2hh
clNwZWNgKSBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlCisgIC8vIHN1YnNlcXVlbnQgc3RhdGVzIChg
bmV4dFN0YXRlc2ApLgorICAvLworICAvLyBJZiBhIFN0YXRlIGlzIGFuIGFjY2VwdGluZyBzdGF0
ZSwgaXQgd2lsbCBhbHNvIGhhdmUgc2V2ZXJhbCBhZGRpdGlvbmFsCisgIC8vIHByb3BlcnRpZXM6
CisgIC8vCisgIC8vICogYHJlZ2V4YDogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2Vk
IHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIHBhdGhzCisgIC8vICAgdGhhdCByZWFjaGVkIHRo
aXMgYWNjZXB0aW5nIHN0YXRlLgorICAvLyAqIGBoYW5kbGVyc2A6IEluZm9ybWF0aW9uIG9uIGhv
dyB0byBjb252ZXJ0IHRoZSBsaXN0IG9mIGNhcHR1cmVzIGludG8gY2FsbHMKKyAgLy8gICB0byBy
ZWdpc3RlcmVkIGhhbmRsZXJzIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgIC8vICog
YHR5cGVzYDogSG93IG1hbnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVudHMgaW4gdGhp
cyByb3V0ZS4gVXNlZCB0bworICAvLyAgIGRlY2lkZSB3aGljaCByb3V0ZSB0byB1c2UgaWYgbXVs
dGlwbGUgcmVnaXN0ZXJlZCByb3V0ZXMgbWF0Y2ggYSBwYXRoLgorICAvLworICAvLyBDdXJyZW50
bHksIFN0YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBuZXh0U3Rh
dGVzYCBhbmQKKyAgLy8gY29tcGFyaW5nIGEgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gYWdhaW5z
dCBhIGNoYXJhY3Rlci4gQSBtb3JlIGVmZmljaWVudAorICAvLyBpbXBsZW1lbnRhdGlvbiB3b3Vs
ZCB1c2UgYSBoYXNoIG9mIGtleXMgcG9pbnRpbmcgYXQgb25lIG9yIG1vcmUgbmV4dCBzdGF0ZXMu
CisKKyAgZnVuY3Rpb24gU3RhdGUoY2hhclNwZWMpIHsKKyAgICB0aGlzLmNoYXJTcGVjID0gY2hh
clNwZWM7CisgICAgdGhpcy5uZXh0U3RhdGVzID0gW107CisgIH0KKworICBTdGF0ZS5wcm90b3R5
cGUgPSB7CisgICAgZ2V0OiBmdW5jdGlvbiAoY2hhclNwZWMpIHsKKyAgICAgIHZhciBuZXh0U3Rh
dGVzID0gdGhpcy5uZXh0U3RhdGVzOworCisgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5leHRT
dGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhciBjaGlsZCA9IG5leHRTdGF0
ZXNbaV07CisKKyAgICAgICAgdmFyIGlzRXF1YWwgPSBjaGlsZC5jaGFyU3BlYy52YWxpZENoYXJz
ID09PSBjaGFyU3BlYy52YWxpZENoYXJzOworICAgICAgICBpc0VxdWFsID0gaXNFcXVhbCAmJiBj
aGlsZC5jaGFyU3BlYy5pbnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLmludmFsaWRDaGFyczsKKwor
ICAgICAgICBpZiAoaXNFcXVhbCkgeworICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAg
fQorICAgICAgfQorICAgIH0sCisKKyAgICBwdXQ6IGZ1bmN0aW9uIChjaGFyU3BlYykgeworICAg
ICAgdmFyIHN0YXRlOworCisgICAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24g
YWxyZWFkeSBleGlzdHMgaW4gYSBjaGlsZCBvZiB0aGUgY3VycmVudAorICAgICAgLy8gc3RhdGUs
IGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCisgICAgICBpZiAoc3RhdGUgPSB0aGlzLmdldChjaGFy
U3BlYykpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgfQorCisgICAgICAvLyBNYWtl
IGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFjdGVyIHNwZWMKKyAgICAgIHN0YXRlID0gbmV3IFN0
YXRlKGNoYXJTcGVjKTsKKworICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGls
ZCBvZiB0aGUgY3VycmVudCBzdGF0ZQorICAgICAgdGhpcy5uZXh0U3RhdGVzLnB1c2goc3RhdGUp
OworCisgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIHJlcGVhdHMsIGlu
c2VydCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hpbGQKKyAgICAgIC8vIG9mIGl0c2VsZi4gTm90ZSB0
aGF0IHRoaXMgd2lsbCBub3QgdHJpZ2dlciBhbiBpbmZpbml0ZSBsb29wIGJlY2F1c2UgZWFjaAor
ICAgICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVjb2duaXRpb24gY29uc3VtZXMgYSBjaGFyYWN0
ZXIuCisgICAgICBpZiAoY2hhclNwZWMucmVwZWF0KSB7CisgICAgICAgIHN0YXRlLm5leHRTdGF0
ZXMucHVzaChzdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybiB0aGUgbmV3IHN0YXRl
CisgICAgICByZXR1cm4gc3RhdGU7CisgICAgfSwKKworICAgIC8vIEZpbmQgYSBsaXN0IG9mIGNo
aWxkIHN0YXRlcyBtYXRjaGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIKKyAgICBtYXRjaDogZnVuY3Rp
b24gKGNoKSB7CisgICAgICAvLyBERUJVRyAiUHJvY2Vzc2luZyBgIiArIGNoICsgImA6IgorICAg
ICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXMsCisgICAgICAgICAgY2hpbGQsCisg
ICAgICAgICAgY2hhclNwZWMsCisgICAgICAgICAgY2hhcnM7CisKKyAgICAgIC8vIERFQlVHICIg
ICIgKyBkZWJ1Z1N0YXRlKHRoaXMpCisgICAgICB2YXIgcmV0dXJuZWQgPSBbXTsKKworICAgICAg
Zm9yICh2YXIgaSA9IDAsIGwgPSBuZXh0U3RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAg
ICAgICBjaGlsZCA9IG5leHRTdGF0ZXNbaV07CisKKyAgICAgICAgY2hhclNwZWMgPSBjaGlsZC5j
aGFyU3BlYzsKKworICAgICAgICBpZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hh
cnMpICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIGlmIChjaGFycy5pbmRleE9mKGNoKSAh
PT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybmVkLnB1c2goY2hpbGQpOworICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hhclNwZWMuaW52YWxpZENoYXJz
KSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICBpZiAoY2hhcnMuaW5kZXhPZihjaCkgPT09
IC0xKSB7CisgICAgICAgICAgICByZXR1cm5lZC5wdXNoKGNoaWxkKTsKKyAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJldHVybmVkOworICAgIH0KKworICAg
IC8qKiBJRiBERUJVRworICAgICwgZGVidWc6IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNoYXJT
cGVjID0gdGhpcy5jaGFyU3BlYywKKyAgICAgICAgICBkZWJ1ZyA9ICJbIiwKKyAgICAgICAgICBj
aGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMgfHwgY2hhclNwZWMuaW52YWxpZENoYXJzOworICAg
ICAgIGlmIChjaGFyU3BlYy5pbnZhbGlkQ2hhcnMpIHsgZGVidWcgKz0gIl4iOyB9CisgICAgICBk
ZWJ1ZyArPSBjaGFyczsKKyAgICAgIGRlYnVnICs9ICJdIjsKKyAgICAgICBpZiAoY2hhclNwZWMu
cmVwZWF0KSB7IGRlYnVnICs9ICIrIjsgfQorICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9Cisg
ICAgRU5EIElGICoqLworICB9OworCisgIC8qKiBJRiBERUJVRworICBmdW5jdGlvbiBkZWJ1Zyhs
b2cpIHsKKyAgICBjb25zb2xlLmxvZyhsb2cpOworICB9CisgIAorICBmdW5jdGlvbiBkZWJ1Z1N0
YXRlKHN0YXRlKSB7CisgICAgcmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKG4p
IHsKKyAgICAgIGlmIChuLm5leHRTdGF0ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiAiKCAiICsg
bi5kZWJ1ZygpICsgIiBbYWNjZXB0aW5nXSApIjsgfQorICAgICAgcmV0dXJuICIoICIgKyBuLmRl
YnVnKCkgKyAiIDx0aGVuPiAiICsgbi5uZXh0U3RhdGVzLm1hcChmdW5jdGlvbihzKSB7IHJldHVy
biBzLmRlYnVnKCkgfSkuam9pbigiIG9yICIpICsgIiApIjsKKyAgICB9KS5qb2luKCIsICIpCisg
IH0KKyAgRU5EIElGICoqLworCisgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBuYWl2ZSBzdHJhdGVn
eSwgYnV0IHNob3VsZCB3b3JrIGluIGEgbG90IG9mIGNhc2VzCisgIC8vIEEgYmV0dGVyIHN0cmF0
ZWd5IHdvdWxkIHByb3Blcmx5IHJlc29sdmUgL3Bvc3RzLzppZC9uZXcgYW5kIC9wb3N0cy9lZGl0
LzppZC4KKyAgLy8KKyAgLy8gVGhpcyBzdHJhdGVneSBnZW5lcmFsbHkgcHJlZmVycyBtb3JlIHN0
YXRpYyBhbmQgbGVzcyBkeW5hbWljIG1hdGNoaW5nLgorICAvLyBTcGVjaWZpY2FsbHksIGl0Cisg
IC8vCisgIC8vICAqIHByZWZlcnMgZmV3ZXIgc3RhcnMgdG8gbW9yZSwgdGhlbgorICAvLyAgKiBw
cmVmZXJzIHVzaW5nIHN0YXJzIGZvciBsZXNzIG9mIHRoZSBtYXRjaCB0byBtb3JlLCB0aGVuCisg
IC8vICAqIHByZWZlcnMgZmV3ZXIgZHluYW1pYyBzZWdtZW50cyB0byBtb3JlLCB0aGVuCisgIC8v
ICAqIHByZWZlcnMgbW9yZSBzdGF0aWMgc2VnbWVudHMgdG8gbW9yZQorICBmdW5jdGlvbiBzb3J0
U29sdXRpb25zKHN0YXRlcykgeworICAgIHJldHVybiBzdGF0ZXMuc29ydChmdW5jdGlvbiAoYSwg
YikgeworICAgICAgaWYgKGEudHlwZXMuc3RhcnMgIT09IGIudHlwZXMuc3RhcnMpIHsKKyAgICAg
ICAgcmV0dXJuIGEudHlwZXMuc3RhcnMgLSBiLnR5cGVzLnN0YXJzOworICAgICAgfQorCisgICAg
ICBpZiAoYS50eXBlcy5zdGFycykgeworICAgICAgICBpZiAoYS50eXBlcy5zdGF0aWNzICE9PSBi
LnR5cGVzLnN0YXRpY3MpIHsKKyAgICAgICAgICByZXR1cm4gYi50eXBlcy5zdGF0aWNzIC0gYS50
eXBlcy5zdGF0aWNzOworICAgICAgICB9CisgICAgICAgIGlmIChhLnR5cGVzLmR5bmFtaWNzICE9
PSBiLnR5cGVzLmR5bmFtaWNzKSB7CisgICAgICAgICAgcmV0dXJuIGIudHlwZXMuZHluYW1pY3Mg
LSBhLnR5cGVzLmR5bmFtaWNzOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChhLnR5
cGVzLmR5bmFtaWNzICE9PSBiLnR5cGVzLmR5bmFtaWNzKSB7CisgICAgICAgIHJldHVybiBhLnR5
cGVzLmR5bmFtaWNzIC0gYi50eXBlcy5keW5hbWljczsKKyAgICAgIH0KKyAgICAgIGlmIChhLnR5
cGVzLnN0YXRpY3MgIT09IGIudHlwZXMuc3RhdGljcykgeworICAgICAgICByZXR1cm4gYi50eXBl
cy5zdGF0aWNzIC0gYS50eXBlcy5zdGF0aWNzOworICAgICAgfQorCisgICAgICByZXR1cm4gMDsK
KyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3RhdGVzLCBjaCkgewor
ICAgIHZhciBuZXh0U3RhdGVzID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IHN0YXRl
cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHZhciBzdGF0ZSA9IHN0YXRlc1tpXTsKKwor
ICAgICAgbmV4dFN0YXRlcyA9IG5leHRTdGF0ZXMuY29uY2F0KHN0YXRlLm1hdGNoKGNoKSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIG5leHRTdGF0ZXM7CisgIH0KKworICB2YXIgb0NyZWF0ZSA9IE9i
amVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKHByb3RvKSB7CisgICAgZnVuY3Rpb24gRigpIHt9Cisg
ICAgRi5wcm90b3R5cGUgPSBwcm90bzsKKyAgICByZXR1cm4gbmV3IEYoKTsKKyAgfTsKKworICBm
dW5jdGlvbiBSZWNvZ25pemVSZXN1bHRzKHF1ZXJ5UGFyYW1zKSB7CisgICAgdGhpcy5xdWVyeVBh
cmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9OworICB9CisgIFJlY29nbml6ZVJlc3VsdHMucHJvdG90
eXBlID0gb0NyZWF0ZSh7CisgICAgc3BsaWNlOiBBcnJheS5wcm90b3R5cGUuc3BsaWNlLAorICAg
IHNsaWNlOiBBcnJheS5wcm90b3R5cGUuc2xpY2UsCisgICAgcHVzaDogQXJyYXkucHJvdG90eXBl
LnB1c2gsCisgICAgbGVuZ3RoOiAwLAorICAgIHF1ZXJ5UGFyYW1zOiBudWxsCisgIH0pOworCisg
IGZ1bmN0aW9uIGZpbmRIYW5kbGVyKHN0YXRlLCBwYXRoLCBxdWVyeVBhcmFtcykgeworICAgIHZh
ciBoYW5kbGVycyA9IHN0YXRlLmhhbmRsZXJzLAorICAgICAgICByZWdleCA9IHN0YXRlLnJlZ2V4
OworICAgIHZhciBjYXB0dXJlcyA9IHBhdGgubWF0Y2gocmVnZXgpLAorICAgICAgICBjdXJyZW50
Q2FwdHVyZSA9IDE7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBSZWNvZ25pemVSZXN1bHRzKHF1ZXJ5
UGFyYW1zKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLAorICAgICAgICAgIG5h
bWVzID0gaGFuZGxlci5uYW1lcywKKyAgICAgICAgICBwYXJhbXMgPSB7fTsKKworICAgICAgZm9y
ICh2YXIgaiA9IDAsIG0gPSBuYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICAgICAgcGFy
YW1zW25hbWVzW2pdXSA9IGNhcHR1cmVzW2N1cnJlbnRDYXB0dXJlKytdOworICAgICAgfQorCisg
ICAgICByZXN1bHQucHVzaCh7IGhhbmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFyYW1zOiBwYXJh
bXMsIGlzRHluYW1pYzogISFuYW1lcy5sZW5ndGggfSk7CisgICAgfQorCisgICAgcmV0dXJuIHJl
c3VsdDsKKyAgfQorCisgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50
KSB7CisgICAgc2VnbWVudC5lYWNoQ2hhcihmdW5jdGlvbiAoY2gpIHsKKyAgICAgIHZhciBzdGF0
ZTsKKworICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dChjaCk7CisgICAgfSk7
CisKKyAgICByZXR1cm4gY3VycmVudFN0YXRlOworICB9CisKKyAgZnVuY3Rpb24gZGVjb2RlUXVl
cnlQYXJhbVBhcnQocGFydCkgeworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEv
aW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQorICAgIHBhcnQgPSBwYXJ0LnJlcGxhY2Uo
L1wrL2dtLCAnJTIwJyk7CisgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTsKKyAg
fQorCisgIC8vIFRoZSBtYWluIGludGVyZmFjZQorCisgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBm
dW5jdGlvbiAoKSB7CisgICAgdGhpcy5yb290U3RhdGUgPSBuZXcgU3RhdGUoKTsKKyAgICB0aGlz
Lm5hbWVzID0ge307CisgIH07CisKKyAgUm91dGVSZWNvZ25pemVyLnByb3RvdHlwZSA9IHsKKyAg
ICBhZGQ6IGZ1bmN0aW9uIChyb3V0ZXMsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBjdXJyZW50U3Rh
dGUgPSB0aGlzLnJvb3RTdGF0ZSwKKyAgICAgICAgICByZWdleCA9ICJeIiwKKyAgICAgICAgICB0
eXBlcyA9IHsgc3RhdGljczogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0sCisgICAgICAgICAg
aGFuZGxlcnMgPSBbXSwKKyAgICAgICAgICBhbGxTZWdtZW50cyA9IFtdLAorICAgICAgICAgIG5h
bWU7CisKKyAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsKKworICAgICAgZm9yICh2YXIgaSA9IDAs
IGwgPSByb3V0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIHZhciByb3V0ZSA9IHJv
dXRlc1tpXSwKKyAgICAgICAgICAgIG5hbWVzID0gW107CisKKyAgICAgICAgdmFyIHNlZ21lbnRz
ID0gcGFyc2Uocm91dGUucGF0aCwgbmFtZXMsIHR5cGVzKTsKKworICAgICAgICBhbGxTZWdtZW50
cyA9IGFsbFNlZ21lbnRzLmNvbmNhdChzZWdtZW50cyk7CisKKyAgICAgICAgZm9yICh2YXIgaiA9
IDAsIG0gPSBzZWdtZW50cy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICAgICAgICB2YXIgc2Vn
bWVudCA9IHNlZ21lbnRzW2pdOworCisgICAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBF
cHNpbG9uU2VnbWVudCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisg
ICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOworCisgICAgICAgICAgLy8gQWRkIGEgIi8iIGZvciB0
aGUgbmV3IHNlZ21lbnQKKyAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0
KHsgdmFsaWRDaGFyczogIi8iIH0pOworICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKKworICAgICAg
ICAgIC8vIEFkZCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWdtZW50IHRvIHRoZSBORkEgYW5k
IHJlZ2V4CisgICAgICAgICAgY3VycmVudFN0YXRlID0gYWRkU2VnbWVudChjdXJyZW50U3RhdGUs
IHNlZ21lbnQpOworICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZhciBoYW5kbGVyID0geyBoYW5kbGVyOiByb3V0ZS5oYW5kbGVyLCBuYW1l
czogbmFtZXMgfTsKKyAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKGlzRW1wdHkpIHsKKyAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRl
LnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsKKyAgICAgICAgcmVnZXggKz0gIi8iOworICAgICAg
fQorCisgICAgICBjdXJyZW50U3RhdGUuaGFuZGxlcnMgPSBoYW5kbGVyczsKKyAgICAgIGN1cnJl
bnRTdGF0ZS5yZWdleCA9IG5ldyBSZWdFeHAocmVnZXggKyAiJCIpOworICAgICAgY3VycmVudFN0
YXRlLnR5cGVzID0gdHlwZXM7CisKKyAgICAgIGlmIChuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25z
LmFzKSB7CisgICAgICAgIHRoaXMubmFtZXNbbmFtZV0gPSB7CisgICAgICAgICAgc2VnbWVudHM6
IGFsbFNlZ21lbnRzLAorICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycworICAgICAgICB9Owor
ICAgICAgfQorICAgIH0sCisKKyAgICBoYW5kbGVyc0ZvcjogZnVuY3Rpb24gKG5hbWUpIHsKKyAg
ICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0sCisgICAgICAgICAgcmVzdWx0ID0gW107
CisgICAgICBpZiAoIXJvdXRlKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMg
bm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0g
MCwgbCA9IHJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICByZXN1
bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfSwKKworICAgIGhhc1JvdXRlOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0
dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKKyAgICB9LAorCisgICAgZ2VuZXJhdGU6IGZ1bmN0aW9u
IChuYW1lLCBwYXJhbXMpIHsKKyAgICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNbbmFtZV0sCisg
ICAgICAgICAgb3V0cHV0ID0gIiI7CisgICAgICBpZiAoIXJvdXRlKSB7CisgICAgICAgIHRocm93
IG5ldyBFcnJvcigiVGhlcmUgaXMgbm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOworICAgICAgfQor
CisgICAgICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zZWdtZW50czsKKworICAgICAgZm9yICh2YXIg
aSA9IDAsIGwgPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgICAgdmFyIHNl
Z21lbnQgPSBzZWdtZW50c1tpXTsKKworICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVw
c2lsb25TZWdtZW50KSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAg
ICBvdXRwdXQgKz0gIi8iOworICAgICAgICBvdXRwdXQgKz0gc2VnbWVudC5nZW5lcmF0ZShwYXJh
bXMpOworICAgICAgfQorCisgICAgICBpZiAob3V0cHV0LmNoYXJBdCgwKSAhPT0gJy8nKSB7Cisg
ICAgICAgIG91dHB1dCA9ICcvJyArIG91dHB1dDsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFt
cyAmJiBwYXJhbXMucXVlcnlQYXJhbXMpIHsKKyAgICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJh
dGVRdWVyeVN0cmluZyhwYXJhbXMucXVlcnlQYXJhbXMsIHJvdXRlLmhhbmRsZXJzKTsKKyAgICAg
IH0KKworICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9LAorCisgICAgZ2VuZXJhdGVRdWVyeVN0
cmluZzogZnVuY3Rpb24gKHBhcmFtcywgaGFuZGxlcnMpIHsKKyAgICAgIHZhciBwYWlycyA9IFtd
OworICAgICAgdmFyIGtleXMgPSBbXTsKKyAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHsK
KyAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAga2V5
cy5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGtleXMuc29ydCgpOworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKKyAg
ICAgICAga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1zW2tleV07Cisg
ICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTsKKyAgICAgICAg
aWYgKGlzQXJyYXkodmFsdWUpKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGwgPSB2YWx1
ZS5sZW5ndGg7IGogPCBsOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBhcnJheVBhaXIgPSBrZXkg
KyAnW10nICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKTsKKyAgICAgICAgICAg
IHBhaXJzLnB1c2goYXJyYXlQYWlyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgcGFpciArPSAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworICAgICAg
ICAgIHBhaXJzLnB1c2gocGFpcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHBh
aXJzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisKKyAgICAg
IHJldHVybiAiPyIgKyBwYWlycy5qb2luKCImIik7CisgICAgfSwKKworICAgIHBhcnNlUXVlcnlT
dHJpbmc6IGZ1bmN0aW9uIChxdWVyeVN0cmluZykgeworICAgICAgdmFyIHBhaXJzID0gcXVlcnlT
dHJpbmcuc3BsaXQoIiYiKSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHt9OworICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgcGFpciA9
IHBhaXJzW2ldLnNwbGl0KCc9JyksCisgICAgICAgICAgICBrZXkgPSBkZWNvZGVRdWVyeVBhcmFt
UGFydChwYWlyWzBdKSwKKyAgICAgICAgICAgIGtleUxlbmd0aCA9IGtleS5sZW5ndGgsCisgICAg
ICAgICAgICBpc0FycmF5ID0gZmFsc2UsCisgICAgICAgICAgICB2YWx1ZTsKKyAgICAgICAgaWYg
KHBhaXIubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgdmFsdWUgPSAndHJ1ZSc7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgLy9IYW5kbGUgYXJyYXlzCisgICAgICAgICAgaWYgKGtleUxl
bmd0aCA+IDIgJiYga2V5LnNsaWNlKGtleUxlbmd0aCAtIDIpID09PSAnW10nKSB7CisgICAgICAg
ICAgICBpc0FycmF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGtleSA9IGtleS5zbGljZSgwLCBrZXlM
ZW5ndGggLSAyKTsKKyAgICAgICAgICAgIGlmICghcXVlcnlQYXJhbXNba2V5XSkgeworICAgICAg
ICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gW107CisgICAgICAgICAgICB9CisgICAgICAgICAg
fQorICAgICAgICAgIHZhbHVlID0gcGFpclsxXSA/IGRlY29kZVF1ZXJ5UGFyYW1QYXJ0KHBhaXJb
MV0pIDogJyc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQXJyYXkpIHsKKyAgICAgICAgICBx
dWVyeVBhcmFtc1trZXldLnB1c2godmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
IHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0
dXJuIHF1ZXJ5UGFyYW1zOworICAgIH0sCisKKyAgICByZWNvZ25pemU6IGZ1bmN0aW9uIChwYXRo
KSB7CisgICAgICB2YXIgc3RhdGVzID0gW3RoaXMucm9vdFN0YXRlXSwKKyAgICAgICAgICBwYXRo
TGVuLAorICAgICAgICAgIGksCisgICAgICAgICAgbCwKKyAgICAgICAgICBxdWVyeVN0YXJ0LAor
ICAgICAgICAgIHF1ZXJ5UGFyYW1zID0ge30sCisgICAgICAgICAgaXNTbGFzaERyb3BwZWQgPSBm
YWxzZTsKKworICAgICAgcXVlcnlTdGFydCA9IHBhdGguaW5kZXhPZignPycpOworICAgICAgaWYg
KHF1ZXJ5U3RhcnQgIT09IC0xKSB7CisgICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHBhdGguc3Vi
c3RyKHF1ZXJ5U3RhcnQgKyAxLCBwYXRoLmxlbmd0aCk7CisgICAgICAgIHBhdGggPSBwYXRoLnN1
YnN0cigwLCBxdWVyeVN0YXJ0KTsKKyAgICAgICAgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlUXVl
cnlTdHJpbmcocXVlcnlTdHJpbmcpOworICAgICAgfQorCisgICAgICBwYXRoID0gZGVjb2RlVVJJ
KHBhdGgpOworCisgICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCisKKyAgICAgIGlmIChwYXRoLmNo
YXJBdCgwKSAhPT0gIi8iKSB7CisgICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOworICAgICAgfQor
CisgICAgICBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CisgICAgICBpZiAocGF0aExlbiA+IDEgJiYg
cGF0aC5jaGFyQXQocGF0aExlbiAtIDEpID09PSAiLyIpIHsKKyAgICAgICAgcGF0aCA9IHBhdGgu
c3Vic3RyKDAsIHBhdGhMZW4gLSAxKTsKKyAgICAgICAgaXNTbGFzaERyb3BwZWQgPSB0cnVlOwor
ICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IGkgPCBsOyBpKysp
IHsKKyAgICAgICAgc3RhdGVzID0gcmVjb2duaXplQ2hhcihzdGF0ZXMsIHBhdGguY2hhckF0KGkp
KTsKKyAgICAgICAgaWYgKCFzdGF0ZXMubGVuZ3RoKSB7CisgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRU5EIERFQlVHIEdST1VQCisKKyAgICAgIHZhciBz
b2x1dGlvbnMgPSBbXTsKKyAgICAgIGZvciAoaSA9IDAsIGwgPSBzdGF0ZXMubGVuZ3RoOyBpIDwg
bDsgaSsrKSB7CisgICAgICAgIGlmIChzdGF0ZXNbaV0uaGFuZGxlcnMpIHsKKyAgICAgICAgICBz
b2x1dGlvbnMucHVzaChzdGF0ZXNbaV0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0
YXRlcyA9IHNvcnRTb2x1dGlvbnMoc29sdXRpb25zKTsKKworICAgICAgdmFyIHN0YXRlID0gc29s
dXRpb25zWzBdOworCisgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKKyAgICAg
ICAgLy8gaWYgYSB0cmFpbGluZyBzbGFzaCB3YXMgZHJvcHBlZCBhbmQgYSBzdGFyIHNlZ21lbnQg
aXMgdGhlIGxhc3Qgc2VnbWVudAorICAgICAgICAvLyBzcGVjaWZpZWQsIHB1dCB0aGUgdHJhaWxp
bmcgc2xhc2ggYmFjaworICAgICAgICBpZiAoaXNTbGFzaERyb3BwZWQgJiYgc3RhdGUucmVnZXgu
c291cmNlLnNsaWNlKC01KSA9PT0gIiguKykkIikgeworICAgICAgICAgIHBhdGggPSBwYXRoICsg
Ii8iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5kSGFuZGxlcihzdGF0ZSwgcGF0aCwg
cXVlcnlQYXJhbXMpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBSb3V0ZVJlY29nbml6ZXIu
cHJvdG90eXBlLm1hcCA9IF9yb3V0ZVJlY29nbml6ZXJEc2wuZGVmYXVsdDsKKworICBSb3V0ZVJl
Y29nbml6ZXIuVkVSU0lPTiA9ICcwLjEuNSc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gUm91dGVS
ZWNvZ25pemVyOworfSk7CitlbmlmZWQoInJvdXRlLXJlY29nbml6ZXIvZHNsIiwgWyJleHBvcnRz
Il0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBmdW5jdGlvbiBU
YXJnZXQocGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUpIHsKKyAgICB0aGlzLnBhdGggPSBwYXRoOwor
ICAgIHRoaXMubWF0Y2hlciA9IG1hdGNoZXI7CisgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRl
OworICB9CisKKyAgVGFyZ2V0LnByb3RvdHlwZSA9IHsKKyAgICB0bzogZnVuY3Rpb24gKHRhcmdl
dCwgY2FsbGJhY2spIHsKKyAgICAgIHZhciBkZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisKKyAg
ICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS53aWxsQWRkUm91dGUpIHsKKyAgICAgICAgdGFy
Z2V0ID0gZGVsZWdhdGUud2lsbEFkZFJvdXRlKHRoaXMubWF0Y2hlci50YXJnZXQsIHRhcmdldCk7
CisgICAgICB9CisKKyAgICAgIHRoaXMubWF0Y2hlci5hZGQodGhpcy5wYXRoLCB0YXJnZXQpOwor
CisgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0g
MCkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IG11c3QgaGF2ZSBhbiBhcmd1bWVu
dCBpbiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIGB0b2AiKTsKKyAgICAgICAgfQorICAgICAgICB0
aGlzLm1hdGNoZXIuYWRkQ2hpbGQodGhpcy5wYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCB0aGlzLmRl
bGVnYXRlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfTsKKworICBm
dW5jdGlvbiBNYXRjaGVyKHRhcmdldCkgeworICAgIHRoaXMucm91dGVzID0ge307CisgICAgdGhp
cy5jaGlsZHJlbiA9IHt9OworICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICB9CisKKyAgTWF0
Y2hlci5wcm90b3R5cGUgPSB7CisgICAgYWRkOiBmdW5jdGlvbiAocGF0aCwgaGFuZGxlcikgewor
ICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOworICAgIH0sCisKKyAgICBhZGRDaGls
ZDogZnVuY3Rpb24gKHBhdGgsIHRhcmdldCwgY2FsbGJhY2ssIGRlbGVnYXRlKSB7CisgICAgICB2
YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7CisgICAgICB0aGlzLmNoaWxkcmVuW3Bh
dGhdID0gbWF0Y2hlcjsKKworICAgICAgdmFyIG1hdGNoID0gZ2VuZXJhdGVNYXRjaChwYXRoLCBt
YXRjaGVyLCBkZWxlZ2F0ZSk7CisKKyAgICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5jb250
ZXh0RW50ZXJlZCkgeworICAgICAgICBkZWxlZ2F0ZS5jb250ZXh0RW50ZXJlZCh0YXJnZXQsIG1h
dGNoKTsKKyAgICAgIH0KKworICAgICAgY2FsbGJhY2sobWF0Y2gpOworICAgIH0KKyAgfTsKKwor
ICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hlciwgZGVsZWdhdGUp
IHsKKyAgICByZXR1cm4gZnVuY3Rpb24gKHBhdGgsIG5lc3RlZENhbGxiYWNrKSB7CisgICAgICB2
YXIgZnVsbFBhdGggPSBzdGFydGluZ1BhdGggKyBwYXRoOworCisgICAgICBpZiAobmVzdGVkQ2Fs
bGJhY2spIHsKKyAgICAgICAgbmVzdGVkQ2FsbGJhY2soZ2VuZXJhdGVNYXRjaChmdWxsUGF0aCwg
bWF0Y2hlciwgZGVsZWdhdGUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcg
VGFyZ2V0KHN0YXJ0aW5nUGF0aCArIHBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKTsKKyAgICAgIH0K
KyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gYWRkUm91dGUocm91dGVBcnJheSwgcGF0aCwgaGFu
ZGxlcikgeworICAgIHZhciBsZW4gPSAwOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gcm91dGVB
cnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGxlbiArPSByb3V0ZUFycmF5W2ldLnBh
dGgubGVuZ3RoOworICAgIH0KKworICAgIHBhdGggPSBwYXRoLnN1YnN0cihsZW4pOworICAgIHZh
ciByb3V0ZSA9IHsgcGF0aDogcGF0aCwgaGFuZGxlcjogaGFuZGxlciB9OworICAgIHJvdXRlQXJy
YXkucHVzaChyb3V0ZSk7CisgIH0KKworICBmdW5jdGlvbiBlYWNoUm91dGUoYmFzZVJvdXRlLCBt
YXRjaGVyLCBjYWxsYmFjaywgYmluZGluZykgeworICAgIHZhciByb3V0ZXMgPSBtYXRjaGVyLnJv
dXRlczsKKworICAgIGZvciAodmFyIHBhdGggaW4gcm91dGVzKSB7CisgICAgICBpZiAocm91dGVz
Lmhhc093blByb3BlcnR5KHBhdGgpKSB7CisgICAgICAgIHZhciByb3V0ZUFycmF5ID0gYmFzZVJv
dXRlLnNsaWNlKCk7CisgICAgICAgIGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIHJvdXRlc1tw
YXRoXSk7CisKKyAgICAgICAgaWYgKG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0pIHsKKyAgICAgICAg
ICBlYWNoUm91dGUocm91dGVBcnJheSwgbWF0Y2hlci5jaGlsZHJlbltwYXRoXSwgY2FsbGJhY2ss
IGJpbmRpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmlu
ZGluZywgcm91dGVBcnJheSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBl
eHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFkZFJvdXRlQ2FsbGJhY2spIHsK
KyAgICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVyKCk7CisKKyAgICBjYWxsYmFjayhnZW5lcmF0
ZU1hdGNoKCIiLCBtYXRjaGVyLCB0aGlzLmRlbGVnYXRlKSk7CisKKyAgICBlYWNoUm91dGUoW10s
IG1hdGNoZXIsIGZ1bmN0aW9uIChyb3V0ZSkgeworICAgICAgaWYgKGFkZFJvdXRlQ2FsbGJhY2sp
IHsKKyAgICAgICAgYWRkUm91dGVDYWxsYmFjayh0aGlzLCByb3V0ZSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICB0aGlzLmFkZChyb3V0ZSk7CisgICAgICB9CisgICAgfSwgdGhpcyk7CisgIH07
Cit9KTsKK2VuaWZlZCgncm91dGVyJywgWydleHBvcnRzJywgJ3JvdXRlci9yb3V0ZXInXSwgZnVu
Y3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJSb3V0ZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4
cG9ydHMuZGVmYXVsdCA9IF9yb3V0ZXJSb3V0ZXIuZGVmYXVsdDsKK30pOworZW5pZmVkKCdyb3V0
ZXIvaGFuZGxlci1pbmZvJywgWydleHBvcnRzJywgJ3JvdXRlci91dGlscycsICdyc3ZwL3Byb21p
c2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJVdGlscywgX3JzdnBQcm9taXNlKSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBIYW5kbGVySW5mbyhfcHJvcHMpIHsKKyAgICB2
YXIgcHJvcHMgPSBfcHJvcHMgfHwge307CisgICAgX3JvdXRlclV0aWxzLm1lcmdlKHRoaXMsIHBy
b3BzKTsKKyAgICB0aGlzLmluaXRpYWxpemUocHJvcHMpOworICB9CisKKyAgSGFuZGxlckluZm8u
cHJvdG90eXBlID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFuZGxlcjogbnVsbCwKKyAgICBw
YXJhbXM6IG51bGwsCisgICAgY29udGV4dDogbnVsbCwKKworICAgIC8vIEluamVjdGVkIGJ5IHRo
ZSBoYW5kbGVyIGluZm8gZmFjdG9yeS4KKyAgICBmYWN0b3J5OiBudWxsLAorCisgICAgaW5pdGlh
bGl6ZTogZnVuY3Rpb24gKCkge30sCisKKyAgICBsb2c6IGZ1bmN0aW9uIChwYXlsb2FkLCBtZXNz
YWdlKSB7CisgICAgICBpZiAocGF5bG9hZC5sb2cpIHsKKyAgICAgICAgcGF5bG9hZC5sb2codGhp
cy5uYW1lICsgJzogJyArIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0sCisKKyAgICBwcm9taXNl
TGFiZWw6IGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgcmV0dXJuIF9yb3V0ZXJVdGlscy5wcm9t
aXNlTGFiZWwoIiciICsgdGhpcy5uYW1lICsgIicgIiArIGxhYmVsKTsKKyAgICB9LAorCisgICAg
Z2V0VW5yZXNvbHZlZDogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwK
KworICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMucGFyYW1z
IHx8IHt9OworICAgIH0sCisKKyAgICByZXNvbHZlOiBmdW5jdGlvbiAoc2hvdWxkQ29udGludWUs
IHBheWxvYWQpIHsKKyAgICAgIHZhciBjaGVja0ZvckFib3J0ID0gX3JvdXRlclV0aWxzLmJpbmQo
dGhpcywgdGhpcy5jaGVja0ZvckFib3J0LCBzaG91bGRDb250aW51ZSksCisgICAgICAgICAgYmVm
b3JlTW9kZWwgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0aGlzLnJ1bkJlZm9yZU1vZGVsSG9v
aywgcGF5bG9hZCksCisgICAgICAgICAgbW9kZWwgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0
aGlzLmdldE1vZGVsLCBwYXlsb2FkKSwKKyAgICAgICAgICBhZnRlck1vZGVsID0gX3JvdXRlclV0
aWxzLmJpbmQodGhpcywgdGhpcy5ydW5BZnRlck1vZGVsSG9vaywgcGF5bG9hZCksCisgICAgICAg
ICAgYmVjb21lUmVzb2x2ZWQgPSBfcm91dGVyVXRpbHMuYmluZCh0aGlzLCB0aGlzLmJlY29tZVJl
c29sdmVkLCBwYXlsb2FkKTsKKworICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJl
c29sdmUodW5kZWZpbmVkLCB0aGlzLnByb21pc2VMYWJlbCgiU3RhcnQgaGFuZGxlciIpKS50aGVu
KGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBmb3IgYWJvcnQi
KSkudGhlbihiZWZvcmVNb2RlbCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkJlZm9yZSBtb2Rl
bCIpKS50aGVuKGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBp
ZiBhYm9ydGVkIGR1cmluZyAnYmVmb3JlTW9kZWwnIGhvb2siKSkudGhlbihtb2RlbCwgbnVsbCwg
dGhpcy5wcm9taXNlTGFiZWwoIk1vZGVsIikpLnRoZW4oY2hlY2tGb3JBYm9ydCwgbnVsbCwgdGhp
cy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQgaW4gJ21vZGVsJyBob29rIikpLnRoZW4o
YWZ0ZXJNb2RlbCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkFmdGVyIG1vZGVsIikpLnRoZW4o
Y2hlY2tGb3JBYm9ydCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQg
aW4gJ2FmdGVyTW9kZWwnIGhvb2siKSkudGhlbihiZWNvbWVSZXNvbHZlZCwgbnVsbCwgdGhpcy5w
cm9taXNlTGFiZWwoIkJlY29tZSByZXNvbHZlZCIpKTsKKyAgICB9LAorCisgICAgcnVuQmVmb3Jl
TW9kZWxIb29rOiBmdW5jdGlvbiAocGF5bG9hZCkgeworICAgICAgaWYgKHBheWxvYWQudHJpZ2dl
cikgeworICAgICAgICBwYXlsb2FkLnRyaWdnZXIodHJ1ZSwgJ3dpbGxSZXNvbHZlTW9kZWwnLCBw
YXlsb2FkLCB0aGlzLmhhbmRsZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMucnVuU2hh
cmVkTW9kZWxIb29rKHBheWxvYWQsICdiZWZvcmVNb2RlbCcsIFtdKTsKKyAgICB9LAorCisgICAg
cnVuQWZ0ZXJNb2RlbEhvb2s6IGZ1bmN0aW9uIChwYXlsb2FkLCByZXNvbHZlZE1vZGVsKSB7Cisg
ICAgICAvLyBTdGFzaCB0aGUgcmVzb2x2ZWQgbW9kZWwgb24gdGhlIHBheWxvYWQuCisgICAgICAv
LyBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycyB0byBzd2FwIG91dAorICAgICAgLy8g
dGhlIHJlc29sdmVkIG1vZGVsIGluIGFmdGVyTW9kZWwuCisgICAgICB2YXIgbmFtZSA9IHRoaXMu
bmFtZTsKKyAgICAgIHRoaXMuc3Rhc2hSZXNvbHZlZE1vZGVsKHBheWxvYWQsIHJlc29sdmVkTW9k
ZWwpOworCisgICAgICByZXR1cm4gdGhpcy5ydW5TaGFyZWRNb2RlbEhvb2socGF5bG9hZCwgJ2Fm
dGVyTW9kZWwnLCBbcmVzb2x2ZWRNb2RlbF0pLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAv
LyBJZ25vcmUgdGhlIGZ1bGZpbGxlZCB2YWx1ZSByZXR1cm5lZCBmcm9tIGFmdGVyTW9kZWwuCisg
ICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgc3Rhc2hlZCBpbiByZXNvbHZlZE1vZGVscywgd2hp
Y2gKKyAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIHN3YXBwZWQgb3V0IGluIGFmdGVyTW9kZWwu
CisgICAgICAgIHJldHVybiBwYXlsb2FkLnJlc29sdmVkTW9kZWxzW25hbWVdOworICAgICAgfSwg
bnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgcmV0
dXJuIG1vZGVsIHZhbHVlIikpOworICAgIH0sCisKKyAgICBydW5TaGFyZWRNb2RlbEhvb2s6IGZ1
bmN0aW9uIChwYXlsb2FkLCBob29rTmFtZSwgYXJncykgeworICAgICAgdGhpcy5sb2cocGF5bG9h
ZCwgImNhbGxpbmcgIiArIGhvb2tOYW1lICsgIiBob29rIik7CisKKyAgICAgIGlmICh0aGlzLnF1
ZXJ5UGFyYW1zKSB7CisgICAgICAgIGFyZ3MucHVzaCh0aGlzLnF1ZXJ5UGFyYW1zKTsKKyAgICAg
IH0KKyAgICAgIGFyZ3MucHVzaChwYXlsb2FkKTsKKworICAgICAgdmFyIHJlc3VsdCA9IF9yb3V0
ZXJVdGlscy5hcHBseUhvb2sodGhpcy5oYW5kbGVyLCBob29rTmFtZSwgYXJncyk7CisKKyAgICAg
IGlmIChyZXN1bHQgJiYgcmVzdWx0LmlzVHJhbnNpdGlvbikgeworICAgICAgICByZXN1bHQgPSBu
dWxsOworICAgICAgfQorCisgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2
ZShyZXN1bHQsIHRoaXMucHJvbWlzZUxhYmVsKCJSZXNvbHZlIHZhbHVlIHJldHVybmVkIGZyb20g
b25lIG9mIHRoZSBtb2RlbCBob29rcyIpKTsKKyAgICB9LAorCisgICAgLy8gb3ZlcnJpZGRlbiBi
eSBzdWJjbGFzc2VzCisgICAgZ2V0TW9kZWw6IG51bGwsCisKKyAgICBjaGVja0ZvckFib3J0OiBm
dW5jdGlvbiAoc2hvdWxkQ29udGludWUsIHByb21pc2VWYWx1ZSkgeworICAgICAgcmV0dXJuIF9y
c3ZwUHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoc2hvdWxkQ29udGludWUoKSwgdGhpcy5wcm9taXNl
TGFiZWwoIkNoZWNrIGZvciBhYm9ydCIpKS50aGVuKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgLy8g
V2UgZG9uJ3QgY2FyZSBhYm91dCBzaG91bGRDb250aW51ZSdzIHJlc29sdmUgdmFsdWU7CisgICAg
ICAgIC8vIHBhc3MgYWxvbmcgdGhlIG9yaWdpbmFsIHZhbHVlIHBhc3NlZCB0byB0aGlzIGZuLgor
ICAgICAgICByZXR1cm4gcHJvbWlzZVZhbHVlOworICAgICAgfSwgbnVsbCwgdGhpcy5wcm9taXNl
TGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgY29udGludWUiKSk7CisgICAgfSwK
KworICAgIHN0YXNoUmVzb2x2ZWRNb2RlbDogZnVuY3Rpb24gKHBheWxvYWQsIHJlc29sdmVkTW9k
ZWwpIHsKKyAgICAgIHBheWxvYWQucmVzb2x2ZWRNb2RlbHMgPSBwYXlsb2FkLnJlc29sdmVkTW9k
ZWxzIHx8IHt9OworICAgICAgcGF5bG9hZC5yZXNvbHZlZE1vZGVsc1t0aGlzLm5hbWVdID0gcmVz
b2x2ZWRNb2RlbDsKKyAgICB9LAorCisgICAgYmVjb21lUmVzb2x2ZWQ6IGZ1bmN0aW9uIChwYXls
b2FkLCByZXNvbHZlZENvbnRleHQpIHsKKyAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnNlcmlhbGl6
ZShyZXNvbHZlZENvbnRleHQpOworCisgICAgICBpZiAocGF5bG9hZCkgeworICAgICAgICB0aGlz
LnN0YXNoUmVzb2x2ZWRNb2RlbChwYXlsb2FkLCByZXNvbHZlZENvbnRleHQpOworICAgICAgICBw
YXlsb2FkLnBhcmFtcyA9IHBheWxvYWQucGFyYW1zIHx8IHt9OworICAgICAgICBwYXlsb2FkLnBh
cmFtc1t0aGlzLm5hbWVdID0gcGFyYW1zOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5m
YWN0b3J5KCdyZXNvbHZlZCcsIHsKKyAgICAgICAgY29udGV4dDogcmVzb2x2ZWRDb250ZXh0LAor
ICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCisgICAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlciwK
KyAgICAgICAgcGFyYW1zOiBwYXJhbXMKKyAgICAgIH0pOworICAgIH0sCisKKyAgICBzaG91bGRT
dXBlcmNlZGU6IGZ1bmN0aW9uIChvdGhlcikgeworICAgICAgLy8gUHJlZmVyIHRoaXMgbmV3ZXIg
aGFuZGxlckluZm8gb3ZlciBgb3RoZXJgIGlmOgorICAgICAgLy8gMSkgVGhlIG90aGVyIG9uZSBk
b2Vzbid0IGV4aXN0CisgICAgICAvLyAyKSBUaGUgbmFtZXMgZG9uJ3QgbWF0Y2gKKyAgICAgIC8v
IDMpIFRoaXMgaGFuZGxlciBoYXMgYSBjb250ZXh0IHRoYXQgZG9lc24ndCBtYXRjaAorICAgICAg
Ly8gICAgdGhlIG90aGVyIG9uZSAob3IgdGhlIG90aGVyIG9uZSBkb2Vzbid0IGhhdmUgb25lKS4K
KyAgICAgIC8vIDQpIFRoaXMgaGFuZGxlciBoYXMgcGFyYW1ldGVycyB0aGF0IGRvbid0IG1hdGNo
IHRoZSBvdGhlci4KKyAgICAgIGlmICghb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICB9CisKKyAgICAgIHZhciBjb250ZXh0c01hdGNoID0gb3RoZXIuY29udGV4dCA9PT0gdGhp
cy5jb250ZXh0OworICAgICAgcmV0dXJuIG90aGVyLm5hbWUgIT09IHRoaXMubmFtZSB8fCB0aGlz
Lmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgIWNvbnRleHRzTWF0Y2ggfHwgdGhpcy5oYXNP
d25Qcm9wZXJ0eSgncGFyYW1zJykgJiYgIXBhcmFtc01hdGNoKHRoaXMucGFyYW1zLCBvdGhlci5w
YXJhbXMpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBwYXJhbXNNYXRjaChhLCBiKSB7Cisg
ICAgaWYgKCFhIF4gIWIpIHsKKyAgICAgIC8vIE9ubHkgb25lIGlzIG51bGwuCisgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFhKSB7CisgICAgICAvLyBCb3RoIG11c3QgYmUg
bnVsbC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE5vdGU6IHRoaXMgYXNz
dW1lcyB0aGF0IGJvdGggcGFyYW1zIGhhdmUgdGhlIHNhbWUKKyAgICAvLyBudW1iZXIgb2Yga2V5
cywgYnV0IHNpbmNlIHdlJ3JlIGNvbXBhcmluZyB0aGUKKyAgICAvLyBzYW1lIGhhbmRsZXJzLCB0
aGV5IHNob3VsZC4KKyAgICBmb3IgKHZhciBrIGluIGEpIHsKKyAgICAgIGlmIChhLmhhc093blBy
b3BlcnR5KGspICYmIGFba10gIT09IGJba10pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGV4cG9ydHMuZGVmYXVsdCA9
IEhhbmRsZXJJbmZvOworfSk7CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScs
IFsnZXhwb3J0cycsICdyb3V0ZXIvaGFuZGxlci1pbmZvL3Jlc29sdmVkLWhhbmRsZXItaW5mbycs
ICdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQtaGFuZGxlci1pbmZvLWJ5LW9iamVjdCcs
ICdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQtaGFuZGxlci1pbmZvLWJ5LXBhcmFtJ10s
IGZ1bmN0aW9uIChleHBvcnRzLCBfcm91dGVySGFuZGxlckluZm9SZXNvbHZlZEhhbmRsZXJJbmZv
LCBfcm91dGVySGFuZGxlckluZm9VbnJlc29sdmVkSGFuZGxlckluZm9CeU9iamVjdCwgX3JvdXRl
ckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJhbSkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgaGFuZGxlckluZm9GYWN0b3J5LmtsYXNzZXMgPSB7CisgICAgcmVzb2x2ZWQ6IF9y
b3V0ZXJIYW5kbGVySW5mb1Jlc29sdmVkSGFuZGxlckluZm8uZGVmYXVsdCwKKyAgICBwYXJhbTog
X3JvdXRlckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJhbS5kZWZhdWx0LAor
ICAgIG9iamVjdDogX3JvdXRlckhhbmRsZXJJbmZvVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlPYmpl
Y3QuZGVmYXVsdAorICB9OworCisgIGZ1bmN0aW9uIGhhbmRsZXJJbmZvRmFjdG9yeShuYW1lLCBw
cm9wcykgeworICAgIHZhciBDdG9yID0gaGFuZGxlckluZm9GYWN0b3J5LmtsYXNzZXNbbmFtZV0s
CisgICAgICAgIGhhbmRsZXJJbmZvID0gbmV3IEN0b3IocHJvcHMgfHwge30pOworICAgIGhhbmRs
ZXJJbmZvLmZhY3RvcnkgPSBoYW5kbGVySW5mb0ZhY3Rvcnk7CisgICAgcmV0dXJuIGhhbmRsZXJJ
bmZvOworICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gaGFuZGxlckluZm9GYWN0b3J5OworfSk7
CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vcmVzb2x2ZWQtaGFuZGxlci1pbmZvJywgWydl
eHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91dGVyL3V0aWxzJywgJ3JzdnAvcHJv
bWlzZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlckhhbmRsZXJJbmZvLCBfcm91dGVyVXRp
bHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0cmljdCc7CisKKyAgdmFyIFJlc29sdmVkSGFu
ZGxlckluZm8gPSBfcm91dGVyVXRpbHMuc3ViY2xhc3MoX3JvdXRlckhhbmRsZXJJbmZvLmRlZmF1
bHQsIHsKKyAgICByZXNvbHZlOiBmdW5jdGlvbiAoc2hvdWxkQ29udGludWUsIHBheWxvYWQpIHsK
KyAgICAgIC8vIEEgUmVzb2x2ZWRIYW5kbGVySW5mbyBqdXN0IHJlc29sdmVkIHdpdGggaXRzZWxm
LgorICAgICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5yZXNvbHZlZE1vZGVscykgeworICAgICAg
ICBwYXlsb2FkLnJlc29sdmVkTW9kZWxzW3RoaXMubmFtZV0gPSB0aGlzLmNvbnRleHQ7CisgICAg
ICB9CisgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0aGlzLCB0aGlz
LnByb21pc2VMYWJlbCgiUmVzb2x2ZSIpKTsKKyAgICB9LAorCisgICAgZ2V0VW5yZXNvbHZlZDog
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeSgncGFyYW0nLCB7CisgICAg
ICAgIG5hbWU6IHRoaXMubmFtZSwKKyAgICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLAorICAg
ICAgICBwYXJhbXM6IHRoaXMucGFyYW1zCisgICAgICB9KTsKKyAgICB9LAorCisgICAgaXNSZXNv
bHZlZDogdHJ1ZQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBSZXNvbHZlZEhhbmRsZXJJ
bmZvOworfSk7CitlbmlmZWQoJ3JvdXRlci9oYW5kbGVyLWluZm8vdW5yZXNvbHZlZC1oYW5kbGVy
LWluZm8tYnktb2JqZWN0JywgWydleHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91
dGVyL3V0aWxzJywgJ3JzdnAvcHJvbWlzZSddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlckhh
bmRsZXJJbmZvLCBfcm91dGVyVXRpbHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0cmljdCc7
CisKKyAgdmFyIFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5T2JqZWN0ID0gX3JvdXRlclV0aWxzLnN1
YmNsYXNzKF9yb3V0ZXJIYW5kbGVySW5mby5kZWZhdWx0LCB7CisgICAgZ2V0TW9kZWw6IGZ1bmN0
aW9uIChwYXlsb2FkKSB7CisgICAgICB0aGlzLmxvZyhwYXlsb2FkLCB0aGlzLm5hbWUgKyAiOiBy
ZXNvbHZpbmcgcHJvdmlkZWQgbW9kZWwiKTsKKyAgICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVm
YXVsdC5yZXNvbHZlKHRoaXMuY29udGV4dCk7CisgICAgfSwKKworICAgIGluaXRpYWxpemU6IGZ1
bmN0aW9uIChwcm9wcykgeworICAgICAgdGhpcy5uYW1lcyA9IHByb3BzLm5hbWVzIHx8IFtdOwor
ICAgICAgdGhpcy5jb250ZXh0ID0gcHJvcHMuY29udGV4dDsKKyAgICB9LAorCisgICAgLyoqCisg
ICAgICBAcHJpdmF0ZQorICAgICAgIFNlcmlhbGl6ZXMgYSBoYW5kbGVyIHVzaW5nIGl0cyBjdXN0
b20gYHNlcmlhbGl6ZWAgbWV0aG9kIG9yCisgICAgICBieSBhIGRlZmF1bHQgdGhhdCBsb29rcyB1
cCB0aGUgZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSBmcm9tCisgICAgICB0aGUgZHluYW1pYyBzZWdt
ZW50LgorICAgICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgbW9kZWwgdG8gYmUgc2VyaWFs
aXplZCBmb3IgdGhpcyBoYW5kbGVyCisgICAgKi8KKyAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIChf
bW9kZWwpIHsKKyAgICAgIHZhciBtb2RlbCA9IF9tb2RlbCB8fCB0aGlzLmNvbnRleHQsCisgICAg
ICAgICAgbmFtZXMgPSB0aGlzLm5hbWVzLAorICAgICAgICAgIGhhbmRsZXIgPSB0aGlzLmhhbmRs
ZXI7CisKKyAgICAgIHZhciBvYmplY3QgPSB7fTsKKyAgICAgIGlmIChfcm91dGVyVXRpbHMuaXNQ
YXJhbShtb2RlbCkpIHsKKyAgICAgICAgb2JqZWN0W25hbWVzWzBdXSA9IG1vZGVsOworICAgICAg
ICByZXR1cm4gb2JqZWN0OworICAgICAgfQorCisgICAgICAvLyBVc2UgY3VzdG9tIHNlcmlhbGl6
ZSBpZiBpdCBleGlzdHMuCisgICAgICBpZiAoaGFuZGxlci5zZXJpYWxpemUpIHsKKyAgICAgICAg
cmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKG1vZGVsLCBuYW1lcyk7CisgICAgICB9CisKKyAgICAg
IGlmIChuYW1lcy5sZW5ndGggIT09IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisg
ICAgICB2YXIgbmFtZSA9IG5hbWVzWzBdOworCisgICAgICBpZiAoL19pZCQvLnRlc3QobmFtZSkp
IHsKKyAgICAgICAgb2JqZWN0W25hbWVdID0gbW9kZWwuaWQ7CisgICAgICB9IGVsc2UgeworICAg
ICAgICBvYmplY3RbbmFtZV0gPSBtb2RlbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvYmplY3Q7
CisgICAgfQorICB9KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBVbnJlc29sdmVkSGFuZGxlcklu
Zm9CeU9iamVjdDsKK30pOworZW5pZmVkKCdyb3V0ZXIvaGFuZGxlci1pbmZvL3VucmVzb2x2ZWQt
aGFuZGxlci1pbmZvLWJ5LXBhcmFtJywgWydleHBvcnRzJywgJ3JvdXRlci9oYW5kbGVyLWluZm8n
LCAncm91dGVyL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcm91dGVySGFuZGxlckluZm8s
IF9yb3V0ZXJVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gR2VuZXJhdGVkIGJ5IFVS
TCB0cmFuc2l0aW9ucyBhbmQgbm9uLWR5bmFtaWMgcm91dGUgc2VnbWVudHMgaW4gbmFtZWQgVHJh
bnNpdGlvbnMuCisgIHZhciBVbnJlc29sdmVkSGFuZGxlckluZm9CeVBhcmFtID0gX3JvdXRlclV0
aWxzLnN1YmNsYXNzKF9yb3V0ZXJIYW5kbGVySW5mby5kZWZhdWx0LCB7CisgICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24gKHByb3BzKSB7CisgICAgICB0aGlzLnBhcmFtcyA9IHByb3BzLnBhcmFtcyB8
fCB7fTsKKyAgICB9LAorCisgICAgZ2V0TW9kZWw6IGZ1bmN0aW9uIChwYXlsb2FkKSB7CisgICAg
ICB2YXIgZnVsbFBhcmFtcyA9IHRoaXMucGFyYW1zOworICAgICAgaWYgKHBheWxvYWQgJiYgcGF5
bG9hZC5xdWVyeVBhcmFtcykgeworICAgICAgICBmdWxsUGFyYW1zID0ge307CisgICAgICAgIF9y
b3V0ZXJVdGlscy5tZXJnZShmdWxsUGFyYW1zLCB0aGlzLnBhcmFtcyk7CisgICAgICAgIGZ1bGxQ
YXJhbXMucXVlcnlQYXJhbXMgPSBwYXlsb2FkLnF1ZXJ5UGFyYW1zOworICAgICAgfQorCisgICAg
ICB2YXIgaGFuZGxlciA9IHRoaXMuaGFuZGxlcjsKKyAgICAgIHZhciBob29rTmFtZSA9IF9yb3V0
ZXJVdGlscy5yZXNvbHZlSG9vayhoYW5kbGVyLCAnZGVzZXJpYWxpemUnKSB8fCBfcm91dGVyVXRp
bHMucmVzb2x2ZUhvb2soaGFuZGxlciwgJ21vZGVsJyk7CisKKyAgICAgIHJldHVybiB0aGlzLnJ1
blNoYXJlZE1vZGVsSG9vayhwYXlsb2FkLCBob29rTmFtZSwgW2Z1bGxQYXJhbXNdKTsKKyAgICB9
CisgIH0pOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFy
YW07Cit9KTsKK2VuaWZlZCgncm91dGVyL3JvdXRlcicsIFsnZXhwb3J0cycsICdyb3V0ZS1yZWNv
Z25pemVyJywgJ3JzdnAvcHJvbWlzZScsICdyb3V0ZXIvdXRpbHMnLCAncm91dGVyL3RyYW5zaXRp
b24tc3RhdGUnLCAncm91dGVyL3RyYW5zaXRpb24nLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50
L25hbWVkLXRyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFuc2l0aW9uLWludGVudC91cmwt
dHJhbnNpdGlvbi1pbnRlbnQnLCAncm91dGVyL2hhbmRsZXItaW5mbyddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX3JvdXRlUmVjb2duaXplciwgX3JzdnBQcm9taXNlLCBfcm91dGVyVXRpbHMsIF9yb3V0
ZXJUcmFuc2l0aW9uU3RhdGUsIF9yb3V0ZXJUcmFuc2l0aW9uLCBfcm91dGVyVHJhbnNpdGlvbklu
dGVudE5hbWVkVHJhbnNpdGlvbkludGVudCwgX3JvdXRlclRyYW5zaXRpb25JbnRlbnRVcmxUcmFu
c2l0aW9uSW50ZW50LCBfcm91dGVySGFuZGxlckluZm8pIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IHZhciBwb3AgPSBBcnJheS5wcm90b3R5cGUucG9wOworCisgIGZ1bmN0aW9uIFJvdXRlcihfb3B0
aW9ucykgeworICAgIHZhciBvcHRpb25zID0gX29wdGlvbnMgfHwge307CisgICAgdGhpcy5nZXRI
YW5kbGVyID0gb3B0aW9ucy5nZXRIYW5kbGVyIHx8IHRoaXMuZ2V0SGFuZGxlcjsKKyAgICB0aGlz
LnVwZGF0ZVVSTCA9IG9wdGlvbnMudXBkYXRlVVJMIHx8IHRoaXMudXBkYXRlVVJMOworICAgIHRo
aXMucmVwbGFjZVVSTCA9IG9wdGlvbnMucmVwbGFjZVVSTCB8fCB0aGlzLnJlcGxhY2VVUkw7Cisg
ICAgdGhpcy5kaWRUcmFuc2l0aW9uID0gb3B0aW9ucy5kaWRUcmFuc2l0aW9uIHx8IHRoaXMuZGlk
VHJhbnNpdGlvbjsKKyAgICB0aGlzLndpbGxUcmFuc2l0aW9uID0gb3B0aW9ucy53aWxsVHJhbnNp
dGlvbiB8fCB0aGlzLndpbGxUcmFuc2l0aW9uOworICAgIHRoaXMuZGVsZWdhdGUgPSBvcHRpb25z
LmRlbGVnYXRlIHx8IHRoaXMuZGVsZWdhdGU7CisgICAgdGhpcy50cmlnZ2VyRXZlbnQgPSBvcHRp
b25zLnRyaWdnZXJFdmVudCB8fCB0aGlzLnRyaWdnZXJFdmVudDsKKyAgICB0aGlzLmxvZyA9IG9w
dGlvbnMubG9nIHx8IHRoaXMubG9nOworCisgICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IF9yb3V0
ZVJlY29nbml6ZXIuZGVmYXVsdCgpOworICAgIHRoaXMucmVzZXQoKTsKKyAgfQorCisgIGZ1bmN0
aW9uIGdldFRyYW5zaXRpb25CeUludGVudChpbnRlbnQsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAg
dmFyIHdhc1RyYW5zaXRpb25pbmcgPSAhIXRoaXMuYWN0aXZlVHJhbnNpdGlvbjsKKyAgICB2YXIg
b2xkU3RhdGUgPSB3YXNUcmFuc2l0aW9uaW5nID8gdGhpcy5hY3RpdmVUcmFuc2l0aW9uLnN0YXRl
IDogdGhpcy5zdGF0ZTsKKyAgICB2YXIgbmV3VHJhbnNpdGlvbjsKKworICAgIHZhciBuZXdTdGF0
ZSA9IGludGVudC5hcHBseVRvU3RhdGUob2xkU3RhdGUsIHRoaXMucmVjb2duaXplciwgdGhpcy5n
ZXRIYW5kbGVyLCBpc0ludGVybWVkaWF0ZSk7CisgICAgdmFyIHF1ZXJ5UGFyYW1DaGFuZ2VsaXN0
ID0gX3JvdXRlclV0aWxzLmdldENoYW5nZWxpc3Qob2xkU3RhdGUucXVlcnlQYXJhbXMsIG5ld1N0
YXRlLnF1ZXJ5UGFyYW1zKTsKKworICAgIGlmIChoYW5kbGVySW5mb3NFcXVhbChuZXdTdGF0ZS5o
YW5kbGVySW5mb3MsIG9sZFN0YXRlLmhhbmRsZXJJbmZvcykpIHsKKworICAgICAgLy8gVGhpcyBp
cyBhIG5vLW9wIHRyYW5zaXRpb24uIFNlZSBpZiBxdWVyeSBwYXJhbXMgY2hhbmdlZC4KKyAgICAg
IGlmIChxdWVyeVBhcmFtQ2hhbmdlbGlzdCkgeworICAgICAgICBuZXdUcmFuc2l0aW9uID0gdGhp
cy5xdWVyeVBhcmFtc1RyYW5zaXRpb24ocXVlcnlQYXJhbUNoYW5nZWxpc3QsIHdhc1RyYW5zaXRp
b25pbmcsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7CisgICAgICAgIGlmIChuZXdUcmFuc2l0aW9uKSB7
CisgICAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgIH0KKwor
ICAgICAgLy8gTm8tb3AuIE5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHRyYW5zaXRpb24uCisgICAg
ICByZXR1cm4gdGhpcy5hY3RpdmVUcmFuc2l0aW9uIHx8IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5U
cmFuc2l0aW9uKHRoaXMpOworICAgIH0KKworICAgIGlmIChpc0ludGVybWVkaWF0ZSkgeworICAg
ICAgc2V0dXBDb250ZXh0cyh0aGlzLCBuZXdTdGF0ZSk7CisgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQ3JlYXRlIGEgbmV3IHRyYW5zaXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uIHJvdXRl
LgorICAgIG5ld1RyYW5zaXRpb24gPSBuZXcgX3JvdXRlclRyYW5zaXRpb24uVHJhbnNpdGlvbih0
aGlzLCBpbnRlbnQsIG5ld1N0YXRlKTsKKworICAgIC8vIEFib3J0IGFuZCB1c3VycCBhbnkgcHJl
dmlvdXNseSBhY3RpdmUgdHJhbnNpdGlvbi4KKyAgICBpZiAodGhpcy5hY3RpdmVUcmFuc2l0aW9u
KSB7CisgICAgICB0aGlzLmFjdGl2ZVRyYW5zaXRpb24uYWJvcnQoKTsKKyAgICB9CisgICAgdGhp
cy5hY3RpdmVUcmFuc2l0aW9uID0gbmV3VHJhbnNpdGlvbjsKKworICAgIC8vIFRyYW5zaXRpb24g
cHJvbWlzZXMgYnkgZGVmYXVsdCByZXNvbHZlIHdpdGggcmVzb2x2ZWQgc3RhdGUuCisgICAgLy8g
Rm9yIG91ciBwdXJwb3Nlcywgc3dhcCBvdXQgdGhlIHByb21pc2UgdG8gcmVzb2x2ZQorICAgIC8v
IGFmdGVyIHRoZSB0cmFuc2l0aW9uIGhhcyBiZWVuIGZpbmFsaXplZC4KKyAgICBuZXdUcmFuc2l0
aW9uLnByb21pc2UgPSBuZXdUcmFuc2l0aW9uLnByb21pc2UudGhlbihmdW5jdGlvbiAocmVzdWx0
KSB7CisgICAgICByZXR1cm4gZmluYWxpemVUcmFuc2l0aW9uKG5ld1RyYW5zaXRpb24sIHJlc3Vs
dC5zdGF0ZSk7CisgICAgfSwgbnVsbCwgX3JvdXRlclV0aWxzLnByb21pc2VMYWJlbCgiU2V0dGxl
IHRyYW5zaXRpb24gcHJvbWlzZSB3aGVuIHRyYW5zaXRpb24gaXMgZmluYWxpemVkIikpOworCisg
ICAgaWYgKCF3YXNUcmFuc2l0aW9uaW5nKSB7CisgICAgICBub3RpZnlFeGlzdGluZ0hhbmRsZXJz
KHRoaXMsIG5ld1N0YXRlLCBuZXdUcmFuc2l0aW9uKTsKKyAgICB9CisKKyAgICBmaXJlUXVlcnlQ
YXJhbURpZENoYW5nZSh0aGlzLCBuZXdTdGF0ZSwgcXVlcnlQYXJhbUNoYW5nZWxpc3QpOworCisg
ICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgIH0KKworICBSb3V0ZXIucHJvdG90eXBlID0gewor
CisgICAgLyoqCisgICAgICBUaGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSByb3V0ZXIuIFRo
ZSBBUEkgaXMgZXNzZW50aWFsbHkKKyAgICAgIHRoZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2Qg
aW4gYHJvdXRlLXJlY29nbml6ZXJgLgorICAgICAgIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBT
dHJpbmcgaGFuZGxlciBhdCB0aGUgbGFzdCBgLnRvKClgCisgICAgICBjYWxsIGFuZCB1c2VzIGl0
IGFzIHRoZSBuYW1lIG9mIHRoZSB3aG9sZSByb3V0ZS4KKyAgICAgICBAcGFyYW0ge0Z1bmN0aW9u
fSBjYWxsYmFjaworICAgICovCisgICAgbWFwOiBmdW5jdGlvbiAoY2FsbGJhY2spIHsKKyAgICAg
IHRoaXMucmVjb2duaXplci5kZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisKKyAgICAgIHRoaXMu
cmVjb2duaXplci5tYXAoY2FsbGJhY2ssIGZ1bmN0aW9uIChyZWNvZ25pemVyLCByb3V0ZXMpIHsK
KyAgICAgICAgZm9yICh2YXIgaSA9IHJvdXRlcy5sZW5ndGggLSAxLCBwcm9jZWVkID0gdHJ1ZTsg
aSA+PSAwICYmIHByb2NlZWQ7IC0taSkgeworICAgICAgICAgIHZhciByb3V0ZSA9IHJvdXRlc1tp
XTsKKyAgICAgICAgICByZWNvZ25pemVyLmFkZChyb3V0ZXMsIHsgYXM6IHJvdXRlLmhhbmRsZXIg
fSk7CisgICAgICAgICAgcHJvY2VlZCA9IHJvdXRlLnBhdGggPT09ICcvJyB8fCByb3V0ZS5wYXRo
ID09PSAnJyB8fCByb3V0ZS5oYW5kbGVyLnNsaWNlKC02KSA9PT0gJy5pbmRleCc7CisgICAgICAg
IH0KKyAgICAgIH0pOworICAgIH0sCisKKyAgICBoYXNSb3V0ZTogZnVuY3Rpb24gKHJvdXRlKSB7
CisgICAgICByZXR1cm4gdGhpcy5yZWNvZ25pemVyLmhhc1JvdXRlKHJvdXRlKTsKKyAgICB9LAor
CisgICAgZ2V0SGFuZGxlcjogZnVuY3Rpb24gKCkge30sCisKKyAgICBxdWVyeVBhcmFtc1RyYW5z
aXRpb246IGZ1bmN0aW9uIChjaGFuZ2VsaXN0LCB3YXNUcmFuc2l0aW9uaW5nLCBvbGRTdGF0ZSwg
bmV3U3RhdGUpIHsKKyAgICAgIHZhciByb3V0ZXIgPSB0aGlzOworCisgICAgICBmaXJlUXVlcnlQ
YXJhbURpZENoYW5nZSh0aGlzLCBuZXdTdGF0ZSwgY2hhbmdlbGlzdCk7CisKKyAgICAgIGlmICgh
d2FzVHJhbnNpdGlvbmluZyAmJiB0aGlzLmFjdGl2ZVRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8g
T25lIG9mIHRoZSBoYW5kbGVycyBpbiBxdWVyeVBhcmFtc0RpZENoYW5nZQorICAgICAgICAvLyBj
YXVzZWQgYSB0cmFuc2l0aW9uLiBKdXN0IHJldHVybiB0aGF0IHRyYW5zaXRpb24uCisgICAgICAg
IHJldHVybiB0aGlzLmFjdGl2ZVRyYW5zaXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICAv
LyBSdW5uaW5nIHF1ZXJ5UGFyYW1zRGlkQ2hhbmdlIGRpZG4ndCBjaGFuZ2UgYW55dGhpbmcuCisg
ICAgICAgIC8vIEp1c3QgdXBkYXRlIHF1ZXJ5IHBhcmFtcyBhbmQgYmUgb24gb3VyIHdheS4KKwor
ICAgICAgICAvLyBXZSBoYXZlIHRvIHJldHVybiBhIG5vb3AgdHJhbnNpdGlvbiB0aGF0IHdpbGwK
KyAgICAgICAgLy8gcGVyZm9ybSBhIFVSTCB1cGRhdGUgYXQgdGhlIGVuZC4gVGhpcyBnaXZlcwor
ICAgICAgICAvLyB0aGUgdXNlciB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIHVybCB1cGRhdGUKKyAg
ICAgICAgLy8gbWV0aG9kIChkZWZhdWx0IGlzIHJlcGxhY2VTdGF0ZSkuCisgICAgICAgIHZhciBu
ZXdUcmFuc2l0aW9uID0gbmV3IF9yb3V0ZXJUcmFuc2l0aW9uLlRyYW5zaXRpb24odGhpcyk7Cisg
ICAgICAgIG5ld1RyYW5zaXRpb24ucXVlcnlQYXJhbXNPbmx5ID0gdHJ1ZTsKKworICAgICAgICBv
bGRTdGF0ZS5xdWVyeVBhcmFtcyA9IGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZSh0aGlzLCBuZXdT
dGF0ZS5oYW5kbGVySW5mb3MsIG5ld1N0YXRlLnF1ZXJ5UGFyYW1zLCBuZXdUcmFuc2l0aW9uKTsK
KworICAgICAgICBuZXdUcmFuc2l0aW9uLnByb21pc2UgPSBuZXdUcmFuc2l0aW9uLnByb21pc2Uu
dGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgICAgdXBkYXRlVVJMKG5ld1RyYW5zaXRp
b24sIG9sZFN0YXRlLCB0cnVlKTsKKyAgICAgICAgICBpZiAocm91dGVyLmRpZFRyYW5zaXRpb24p
IHsKKyAgICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uKHJvdXRlci5jdXJyZW50SGFuZGxl
ckluZm9zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAg
fSwgbnVsbCwgX3JvdXRlclV0aWxzLnByb21pc2VMYWJlbCgiVHJhbnNpdGlvbiBjb21wbGV0ZSIp
KTsKKyAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CisgICAgICB9CisgICAgfSwKKworICAg
IC8vIE5PVEU6IHRoaXMgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBoZXJlCisgICAg
Ly8gaXQgc2hhbGwgcmVtYWluIHVudGlsIG91ciBFUzYgdHJhbnNwaWxlciBjYW4KKyAgICAvLyBo
YW5kbGUgY3ljbGljYWwgZGVwcy4KKyAgICB0cmFuc2l0aW9uQnlJbnRlbnQ6IGZ1bmN0aW9uIChp
bnRlbnQsIGlzSW50ZXJtZWRpYXRlKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gZ2V0
VHJhbnNpdGlvbkJ5SW50ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9IGNhdGNo
IChlKSB7CisgICAgICAgIHJldHVybiBuZXcgX3JvdXRlclRyYW5zaXRpb24uVHJhbnNpdGlvbih0
aGlzLCBpbnRlbnQsIG51bGwsIGUpOworICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAg
IENsZWFycyB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IHJvdXRlIGhhbmRsZXJzIGFuZCB0cmlnZ2Vy
cyBleGl0CisgICAgICBvbiBlYWNoIG9mIHRoZW0gc3RhcnRpbmcgYXQgdGhlIGxlYWYgYW5kIHRy
YXZlcnNpbmcgdXAgdGhyb3VnaAorICAgICAgaXRzIGFuY2VzdG9ycy4KKyAgICAqLworICAgIHJl
c2V0OiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAodGhpcy5zdGF0ZSkgeworICAgICAgICBfcm91
dGVyVXRpbHMuZm9yRWFjaCh0aGlzLnN0YXRlLmhhbmRsZXJJbmZvcy5zbGljZSgpLnJldmVyc2Uo
KSwgZnVuY3Rpb24gKGhhbmRsZXJJbmZvKSB7CisgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5k
bGVySW5mby5oYW5kbGVyOworICAgICAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVy
LCAnZXhpdCcpOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5zdGF0ZSA9IG5l
dyBfcm91dGVyVHJhbnNpdGlvblN0YXRlLmRlZmF1bHQoKTsKKyAgICAgIHRoaXMuY3VycmVudEhh
bmRsZXJJbmZvcyA9IG51bGw7CisgICAgfSwKKworICAgIGFjdGl2ZVRyYW5zaXRpb246IG51bGws
CisKKyAgICAvKioKKyAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8uaGFuZGxlcjsKKyAg
ICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1
YWxseQorICAgICAgdmlhIHRoZSBiYWNrIGFuZCBmb3J3YXJkIGJ1dHRvbikuCisgICAgICAgUmV0
dXJucyBhbiBBcnJheSBvZiBoYW5kbGVycyBhbmQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZAor
ICAgICAgd2l0aCB0aG9zZSBwYXJhbWV0ZXJzLgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwg
YSBVUkwgdG8gcHJvY2VzcworICAgICAgIEByZXR1cm4ge0FycmF5fSBhbiBBcnJheSBvZiBgW2hh
bmRsZXIsIHBhcmFtZXRlcl1gIHR1cGxlcworICAgICovCisgICAgaGFuZGxlVVJMOiBmdW5jdGlv
biAodXJsKSB7CisgICAgICAvLyBQZXJmb3JtIGEgVVJMLWJhc2VkIHRyYW5zaXRpb24sIGJ1dCBk
b24ndCBjaGFuZ2UKKyAgICAgIC8vIHRoZSBVUkwgYWZ0ZXJ3YXJkLCBzaW5jZSBpdCBhbHJlYWR5
IGhhcHBlbmVkLgorICAgICAgdmFyIGFyZ3MgPSBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1
bWVudHMpOworICAgICAgaWYgKHVybC5jaGFyQXQoMCkgIT09ICcvJykgeworICAgICAgICBhcmdz
WzBdID0gJy8nICsgdXJsOworICAgICAgfQorCisgICAgICByZXR1cm4gZG9UcmFuc2l0aW9uKHRo
aXMsIGFyZ3MpLm1ldGhvZChudWxsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBIb29rIHBv
aW50IGZvciB1cGRhdGluZyB0aGUgVVJMLgorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBV
UkwgdG8gdXBkYXRlIHRvCisgICAgKi8KKyAgICB1cGRhdGVVUkw6IGZ1bmN0aW9uICgpIHsKKyAg
ICAgIHRocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworICAg
IH0sCisKKyAgICAvKioKKyAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxhY2luZyB0aGUgY3VycmVu
dCBVUkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKKyAgICAgICBCeSBkZWZhdWx0IHRoaXMgYmVo
YXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAorICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwg
YSBVUkwgdG8gdXBkYXRlIHRvCisgICAgKi8KKyAgICByZXBsYWNlVVJMOiBmdW5jdGlvbiAodXJs
KSB7CisgICAgICB0aGlzLnVwZGF0ZVVSTCh1cmwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAg
IFRyYW5zaXRpb24gaW50byB0aGUgc3BlY2lmaWVkIG5hbWVkIHJvdXRlLgorICAgICAgIElmIG5l
Y2Vzc2FyeSwgdHJpZ2dlciB0aGUgZXhpdCBjYWxsYmFjayBvbiBhbnkgaGFuZGxlcnMKKyAgICAg
IHRoYXQgYXJlIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGUgdGFyZ2V0IHJvdXRlLgorICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQorICAgICovCisg
ICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgcmV0dXJuIGRvVHJhbnNp
dGlvbih0aGlzLCBhcmd1bWVudHMpOworICAgIH0sCisKKyAgICBpbnRlcm1lZGlhdGVUcmFuc2l0
aW9uVG86IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICByZXR1cm4gZG9UcmFuc2l0aW9uKHRoaXMs
IGFyZ3VtZW50cywgdHJ1ZSk7CisgICAgfSwKKworICAgIHJlZnJlc2g6IGZ1bmN0aW9uIChwaXZv
dEhhbmRsZXIpIHsKKyAgICAgIHZhciBzdGF0ZSA9IHRoaXMuYWN0aXZlVHJhbnNpdGlvbiA/IHRo
aXMuYWN0aXZlVHJhbnNpdGlvbi5zdGF0ZSA6IHRoaXMuc3RhdGU7CisgICAgICB2YXIgaGFuZGxl
ckluZm9zID0gc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgdmFyIHBhcmFtcyA9IHt9OworICAg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsr
aSkgeworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV07CisgICAgICAg
IHBhcmFtc1toYW5kbGVySW5mby5uYW1lXSA9IGhhbmRsZXJJbmZvLnBhcmFtcyB8fCB7fTsKKyAg
ICAgIH0KKworICAgICAgX3JvdXRlclV0aWxzLmxvZyh0aGlzLCAiU3RhcnRpbmcgYSByZWZyZXNo
IHRyYW5zaXRpb24iKTsKKyAgICAgIHZhciBpbnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25J
bnRlbnROYW1lZFRyYW5zaXRpb25JbnRlbnQuZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGhhbmRs
ZXJJbmZvc1toYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSwKKyAgICAgICAgcGl2b3RIYW5k
bGVyOiBwaXZvdEhhbmRsZXIgfHwgaGFuZGxlckluZm9zWzBdLmhhbmRsZXIsCisgICAgICAgIGNv
bnRleHRzOiBbXSwgLy8gVE9ETyBjb2xsZWN0IGNvbnRleHRzLi4uPworICAgICAgICBxdWVyeVBh
cmFtczogdGhpcy5fY2hhbmdlZFF1ZXJ5UGFyYW1zIHx8IHN0YXRlLnF1ZXJ5UGFyYW1zIHx8IHt9
CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvbkJ5SW50ZW50KGludGVu
dCwgZmFsc2UpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIElkZW50aWNhbCB0byBgdHJhbnNp
dGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAorICAg
ICAgaWYgcG9zc2libGUuCisgICAgICAgVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgcHJpbWFyaWx5
IGZvciB1c2Ugd2l0aCBgcmVwbGFjZVN0YXRlYC4KKyAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFt
ZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKKyAgICAqLworICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlv
biAobmFtZSkgeworICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMpLm1l
dGhvZCgncmVwbGFjZScpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIFRha2UgYSBuYW1lZCBy
b3V0ZSBhbmQgY29udGV4dCBvYmplY3RzIGFuZCBnZW5lcmF0ZSBhCisgICAgICBVUkwuCisgICAg
ICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIHRvIGdlbmVyYXRl
CisgICAgICAgIGEgVVJMIGZvcgorICAgICAgQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHMgYSBs
aXN0IG9mIG9iamVjdHMgdG8gc2VyaWFsaXplCisgICAgICAgQHJldHVybiB7U3RyaW5nfSBhIFVS
TAorICAgICovCisgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uIChoYW5kbGVyTmFtZSkgeworCisgICAg
ICB2YXIgcGFydGl0aW9uZWRBcmdzID0gX3JvdXRlclV0aWxzLmV4dHJhY3RRdWVyeVBhcmFtcyhf
cm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSwKKyAgICAgICAgICBzdXBwbGll
ZFBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1swXSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBh
cnRpdGlvbmVkQXJnc1sxXTsKKworICAgICAgLy8gQ29uc3RydWN0IGEgVHJhbnNpdGlvbkludGVu
dCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbXMKKyAgICAgIC8vIGFuZCBhcHBseSBpdCB0byB0aGUg
cHJlc2VudCBzdGF0ZSBvZiB0aGUgcm91dGVyLgorICAgICAgdmFyIGludGVudCA9IG5ldyBfcm91
dGVyVHJhbnNpdGlvbkludGVudE5hbWVkVHJhbnNpdGlvbkludGVudC5kZWZhdWx0KHsgbmFtZTog
aGFuZGxlck5hbWUsIGNvbnRleHRzOiBzdXBwbGllZFBhcmFtcyB9KTsKKyAgICAgIHZhciBzdGF0
ZSA9IGludGVudC5hcHBseVRvU3RhdGUodGhpcy5zdGF0ZSwgdGhpcy5yZWNvZ25pemVyLCB0aGlz
LmdldEhhbmRsZXIpOworICAgICAgdmFyIHBhcmFtcyA9IHt9OworCisgICAgICBmb3IgKHZhciBp
ID0gMCwgbGVuID0gc3RhdGUuaGFuZGxlckluZm9zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7Cisg
ICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHN0YXRlLmhhbmRsZXJJbmZvc1tpXTsKKyAgICAgICAg
dmFyIGhhbmRsZXJQYXJhbXMgPSBoYW5kbGVySW5mby5zZXJpYWxpemUoKTsKKyAgICAgICAgX3Jv
dXRlclV0aWxzLm1lcmdlKHBhcmFtcywgaGFuZGxlclBhcmFtcyk7CisgICAgICB9CisgICAgICBw
YXJhbXMucXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtczsKKworICAgICAgcmV0dXJuIHRoaXMucmVj
b2duaXplci5nZW5lcmF0ZShoYW5kbGVyTmFtZSwgcGFyYW1zKTsKKyAgICB9LAorCisgICAgYXBw
bHlJbnRlbnQ6IGZ1bmN0aW9uIChoYW5kbGVyTmFtZSwgY29udGV4dHMpIHsKKyAgICAgIHZhciBp
bnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25JbnRlbnROYW1lZFRyYW5zaXRpb25JbnRlbnQu
ZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGhhbmRsZXJOYW1lLAorICAgICAgICBjb250ZXh0czog
Y29udGV4dHMKKyAgICAgIH0pOworCisgICAgICB2YXIgc3RhdGUgPSB0aGlzLmFjdGl2ZVRyYW5z
aXRpb24gJiYgdGhpcy5hY3RpdmVUcmFuc2l0aW9uLnN0YXRlIHx8IHRoaXMuc3RhdGU7CisgICAg
ICByZXR1cm4gaW50ZW50LmFwcGx5VG9TdGF0ZShzdGF0ZSwgdGhpcy5yZWNvZ25pemVyLCB0aGlz
LmdldEhhbmRsZXIpOworICAgIH0sCisKKyAgICBpc0FjdGl2ZUludGVudDogZnVuY3Rpb24gKGhh
bmRsZXJOYW1lLCBjb250ZXh0cywgcXVlcnlQYXJhbXMsIF9zdGF0ZSkgeworICAgICAgdmFyIHN0
YXRlID0gX3N0YXRlIHx8IHRoaXMuc3RhdGUsCisgICAgICAgICAgdGFyZ2V0SGFuZGxlckluZm9z
ID0gc3RhdGUuaGFuZGxlckluZm9zLAorICAgICAgICAgIGZvdW5kID0gZmFsc2UsCisgICAgICAg
ICAgbmFtZXMsCisgICAgICAgICAgb2JqZWN0LAorICAgICAgICAgIGhhbmRsZXJJbmZvLAorICAg
ICAgICAgIGhhbmRsZXJPYmosCisgICAgICAgICAgaSwKKyAgICAgICAgICBsZW47CisKKyAgICAg
IGlmICghdGFyZ2V0SGFuZGxlckluZm9zLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICB9CisKKyAgICAgIHZhciB0YXJnZXRIYW5kbGVyID0gdGFyZ2V0SGFuZGxlckluZm9z
W3RhcmdldEhhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lOworICAgICAgdmFyIHJlY29nSGFu
ZGxlcnMgPSB0aGlzLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodGFyZ2V0SGFuZGxlcik7CisKKyAg
ICAgIHZhciBpbmRleCA9IDA7CisgICAgICBmb3IgKGxlbiA9IHJlY29nSGFuZGxlcnMubGVuZ3Ro
OyBpbmRleCA8IGxlbjsgKytpbmRleCkgeworICAgICAgICBoYW5kbGVySW5mbyA9IHRhcmdldEhh
bmRsZXJJbmZvc1tpbmRleF07CisgICAgICAgIGlmIChoYW5kbGVySW5mby5uYW1lID09PSBoYW5k
bGVyTmFtZSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAg
IGlmIChpbmRleCA9PT0gcmVjb2dIYW5kbGVycy5sZW5ndGgpIHsKKyAgICAgICAgLy8gVGhlIHBy
b3ZpZGVkIHJvdXRlIG5hbWUgaXNuJ3QgZXZlbiBpbiB0aGUgcm91dGUgaGllcmFyY2h5LgorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHZhciB0ZXN0U3RhdGUgPSBuZXcg
X3JvdXRlclRyYW5zaXRpb25TdGF0ZS5kZWZhdWx0KCk7CisgICAgICB0ZXN0U3RhdGUuaGFuZGxl
ckluZm9zID0gdGFyZ2V0SGFuZGxlckluZm9zLnNsaWNlKDAsIGluZGV4ICsgMSk7CisgICAgICBy
ZWNvZ0hhbmRsZXJzID0gcmVjb2dIYW5kbGVycy5zbGljZSgwLCBpbmRleCArIDEpOworCisgICAg
ICB2YXIgaW50ZW50ID0gbmV3IF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50TmFtZWRUcmFuc2l0aW9u
SW50ZW50LmRlZmF1bHQoeworICAgICAgICBuYW1lOiB0YXJnZXRIYW5kbGVyLAorICAgICAgICBj
b250ZXh0czogY29udGV4dHMKKyAgICAgIH0pOworCisgICAgICB2YXIgbmV3U3RhdGUgPSBpbnRl
bnQuYXBwbHlUb0hhbmRsZXJzKHRlc3RTdGF0ZSwgcmVjb2dIYW5kbGVycywgdGhpcy5nZXRIYW5k
bGVyLCB0YXJnZXRIYW5kbGVyLCB0cnVlLCB0cnVlKTsKKworICAgICAgdmFyIGhhbmRsZXJzRXF1
YWwgPSBoYW5kbGVySW5mb3NFcXVhbChuZXdTdGF0ZS5oYW5kbGVySW5mb3MsIHRlc3RTdGF0ZS5o
YW5kbGVySW5mb3MpOworICAgICAgaWYgKCFxdWVyeVBhcmFtcyB8fCAhaGFuZGxlcnNFcXVhbCkg
eworICAgICAgICByZXR1cm4gaGFuZGxlcnNFcXVhbDsKKyAgICAgIH0KKworICAgICAgLy8gR2V0
IGEgaGFzaCBvZiBRUHMgdGhhdCB3aWxsIHN0aWxsIGJlIGFjdGl2ZSBvbiBuZXcgcm91dGUKKyAg
ICAgIHZhciBhY3RpdmVRUHNPbk5ld0hhbmRsZXIgPSB7fTsKKyAgICAgIF9yb3V0ZXJVdGlscy5t
ZXJnZShhY3RpdmVRUHNPbk5ld0hhbmRsZXIsIHF1ZXJ5UGFyYW1zKTsKKworICAgICAgdmFyIGFj
dGl2ZVF1ZXJ5UGFyYW1zID0gc3RhdGUucXVlcnlQYXJhbXM7CisgICAgICBmb3IgKHZhciBrZXkg
aW4gYWN0aXZlUXVlcnlQYXJhbXMpIHsKKyAgICAgICAgaWYgKGFjdGl2ZVF1ZXJ5UGFyYW1zLmhh
c093blByb3BlcnR5KGtleSkgJiYgYWN0aXZlUVBzT25OZXdIYW5kbGVyLmhhc093blByb3BlcnR5
KGtleSkpIHsKKyAgICAgICAgICBhY3RpdmVRUHNPbk5ld0hhbmRsZXJba2V5XSA9IGFjdGl2ZVF1
ZXJ5UGFyYW1zW2tleV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGhhbmRs
ZXJzRXF1YWwgJiYgIV9yb3V0ZXJVdGlscy5nZXRDaGFuZ2VsaXN0KGFjdGl2ZVFQc09uTmV3SGFu
ZGxlciwgcXVlcnlQYXJhbXMpOworICAgIH0sCisKKyAgICBpc0FjdGl2ZTogZnVuY3Rpb24gKGhh
bmRsZXJOYW1lKSB7CisgICAgICB2YXIgcGFydGl0aW9uZWRBcmdzID0gX3JvdXRlclV0aWxzLmV4
dHJhY3RRdWVyeVBhcmFtcyhfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsK
KyAgICAgIHJldHVybiB0aGlzLmlzQWN0aXZlSW50ZW50KGhhbmRsZXJOYW1lLCBwYXJ0aXRpb25l
ZEFyZ3NbMF0sIHBhcnRpdGlvbmVkQXJnc1sxXSk7CisgICAgfSwKKworICAgIHRyaWdnZXI6IGZ1
bmN0aW9uIChuYW1lKSB7CisgICAgICB2YXIgYXJncyA9IF9yb3V0ZXJVdGlscy5zbGljZS5jYWxs
KGFyZ3VtZW50cyk7CisgICAgICBfcm91dGVyVXRpbHMudHJpZ2dlcih0aGlzLCB0aGlzLmN1cnJl
bnRIYW5kbGVySW5mb3MsIGZhbHNlLCBhcmdzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBI
b29rIHBvaW50IGZvciBsb2dnaW5nIHRyYW5zaXRpb24gc3RhdHVzIHVwZGF0ZXMuCisgICAgICAg
QHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nLgorICAgICovCisgICAg
bG9nOiBudWxsCisgIH07CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgRmlyZXMgcXVl
cnlQYXJhbXNEaWRDaGFuZ2UgZXZlbnQKKyAgKi8KKyAgZnVuY3Rpb24gZmlyZVF1ZXJ5UGFyYW1E
aWRDaGFuZ2Uocm91dGVyLCBuZXdTdGF0ZSwgcXVlcnlQYXJhbUNoYW5nZWxpc3QpIHsKKyAgICAv
LyBJZiBxdWVyeVBhcmFtcyBjaGFuZ2VkIHRyaWdnZXIgZXZlbnQKKyAgICBpZiAocXVlcnlQYXJh
bUNoYW5nZWxpc3QpIHsKKworICAgICAgLy8gVGhpcyBpcyBhIGxpdHRsZSBoYWNreSBidXQgd2Ug
bmVlZCBzb21lIHdheSBvZiBzdG9yaW5nCisgICAgICAvLyBjaGFuZ2VkIHF1ZXJ5IHBhcmFtcyBn
aXZlbiB0aGF0IG5vIGFjdGl2ZVRyYW5zaXRpb24KKyAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8g
aGF2ZSBvY2N1cnJlZC4KKyAgICAgIHJvdXRlci5fY2hhbmdlZFF1ZXJ5UGFyYW1zID0gcXVlcnlQ
YXJhbUNoYW5nZWxpc3QuYWxsOworICAgICAgX3JvdXRlclV0aWxzLnRyaWdnZXIocm91dGVyLCBu
ZXdTdGF0ZS5oYW5kbGVySW5mb3MsIHRydWUsIFsncXVlcnlQYXJhbXNEaWRDaGFuZ2UnLCBxdWVy
eVBhcmFtQ2hhbmdlbGlzdC5jaGFuZ2VkLCBxdWVyeVBhcmFtQ2hhbmdlbGlzdC5hbGwsIHF1ZXJ5
UGFyYW1DaGFuZ2VsaXN0LnJlbW92ZWRdKTsKKyAgICAgIHJvdXRlci5fY2hhbmdlZFF1ZXJ5UGFy
YW1zID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBU
YWtlcyBhbiBBcnJheSBvZiBgSGFuZGxlckluZm9gcywgZmlndXJlcyBvdXQgd2hpY2ggb25lcyBh
cmUKKyAgICBleGl0aW5nLCBlbnRlcmluZywgb3IgY2hhbmdpbmcgY29udGV4dHMsIGFuZCBjYWxs
cyB0aGUKKyAgICBwcm9wZXIgaGFuZGxlciBob29rcy4KKyAgCisgICAgRm9yIGV4YW1wbGUsIGNv
bnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJlZSBvZiBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIGlzCisg
ICAgZm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0IGhhbmRsZXMuCisgIAorICAgIGBgYAor
ICAgIHx+aW5kZXggKCIvIikKKyAgICB8IHx+cG9zdHMgKCIvcG9zdHMiKQorICAgIHwgfCB8LXNo
b3dQb3N0ICgiLzppZCIpCisgICAgfCB8IHwtbmV3UG9zdCAoIi9uZXciKQorICAgIHwgfCB8LWVk
aXRQb3N0ICgiL2VkaXQiKQorICAgIHwgfH5hYm91dCAoIi9hYm91dC86aWQiKQorICAgIGBgYAor
ICAKKyAgICBDb25zaWRlciB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb25zOgorICAKKyAgICAxLiBB
IFVSTCB0cmFuc2l0aW9uIHRvIGAvcG9zdHMvMWAuCisgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGAq
bW9kZWxgIGNhbGxiYWNrcyBvbiB0aGUKKyAgICAgICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQg
YHNob3dQb3N0YCBoYW5kbGVycworICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgZW50ZXJgIGNhbGxi
YWNrIG9uIHRoZSBzYW1lCisgICAgICAgMy4gVHJpZ2dlcnMgdGhlIGBzZXR1cGAgY2FsbGJhY2sg
b24gdGhlIHNhbWUKKyAgICAyLiBBIGRpcmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAorICAg
ICAgIDEuIFRyaWdnZXJzIHRoZSBgZXhpdGAgY2FsbGJhY2sgb24gYHNob3dQb3N0YAorICAgICAg
IDIuIFRyaWdnZXJzIHRoZSBgZW50ZXJgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAgICAgIDMu
IFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAorICAgIDMuIEEgZGly
ZWN0IHRyYW5zaXRpb24gdG8gYGFib3V0YCB3aXRoIGEgc3BlY2lmaWVkCisgICAgICAgY29udGV4
dCBvYmplY3QKKyAgICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQ
b3N0YAorICAgICAgICAgIGFuZCBgcG9zdHNgCisgICAgICAgMi4gVHJpZ2dlcnMgdGhlIGBzZXJp
YWxpemVgIGNhbGxiYWNrIG9uIGBhYm91dGAKKyAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVy
YCBjYWxsYmFjayBvbiBgYWJvdXRgCisgICAgICAgNC4gVHJpZ2dlcnMgdGhlIGBzZXR1cGAgY2Fs
bGJhY2sgb24gYGFib3V0YAorICAKKyAgICBAcGFyYW0ge1JvdXRlcn0gdHJhbnNpdGlvbgorICAg
IEBwYXJhbSB7VHJhbnNpdGlvblN0YXRlfSBuZXdTdGF0ZQorICAqLworICBmdW5jdGlvbiBzZXR1
cENvbnRleHRzKHJvdXRlciwgbmV3U3RhdGUsIHRyYW5zaXRpb24pIHsKKyAgICB2YXIgcGFydGl0
aW9uID0gcGFydGl0aW9uSGFuZGxlcnMocm91dGVyLnN0YXRlLCBuZXdTdGF0ZSk7CisgICAgdmFy
IGksIGwsIGhhbmRsZXI7CisKKyAgICBmb3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLmV4aXRlZC5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGhhbmRsZXIgPSBwYXJ0aXRpb24uZXhpdGVkW2ld
LmhhbmRsZXI7CisgICAgICBkZWxldGUgaGFuZGxlci5jb250ZXh0OworCisgICAgICBfcm91dGVy
VXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ3Jlc2V0JywgdHJ1ZSwgdHJhbnNpdGlvbik7CisgICAg
ICBfcm91dGVyVXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ2V4aXQnLCB0cmFuc2l0aW9uKTsKKyAg
ICB9CisKKyAgICB2YXIgb2xkU3RhdGUgPSByb3V0ZXIub2xkU3RhdGUgPSByb3V0ZXIuc3RhdGU7
CisgICAgcm91dGVyLnN0YXRlID0gbmV3U3RhdGU7CisgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5m
b3MgPSByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyA9IHBhcnRpdGlvbi51bmNoYW5nZWQuc2xp
Y2UoKTsKKworICAgIHRyeSB7CisgICAgICBmb3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLnJlc2V0
Lmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICBoYW5kbGVyID0gcGFydGl0aW9uLnJlc2V0
W2ldLmhhbmRsZXI7CisgICAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVyLCAncmVz
ZXQnLCBmYWxzZSwgdHJhbnNpdGlvbik7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDAsIGwg
PSBwYXJ0aXRpb24udXBkYXRlZENvbnRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICAg
IGhhbmRsZXJFbnRlcmVkT3JVcGRhdGVkKGN1cnJlbnRIYW5kbGVySW5mb3MsIHBhcnRpdGlvbi51
cGRhdGVkQ29udGV4dFtpXSwgZmFsc2UsIHRyYW5zaXRpb24pOworICAgICAgfQorCisgICAgICBm
b3IgKGkgPSAwLCBsID0gcGFydGl0aW9uLmVudGVyZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Cisg
ICAgICAgIGhhbmRsZXJFbnRlcmVkT3JVcGRhdGVkKGN1cnJlbnRIYW5kbGVySW5mb3MsIHBhcnRp
dGlvbi5lbnRlcmVkW2ldLCB0cnVlLCB0cmFuc2l0aW9uKTsKKyAgICAgIH0KKyAgICB9IGNhdGNo
IChlKSB7CisgICAgICByb3V0ZXIuc3RhdGUgPSBvbGRTdGF0ZTsKKyAgICAgIHJvdXRlci5jdXJy
ZW50SGFuZGxlckluZm9zID0gb2xkU3RhdGUuaGFuZGxlckluZm9zOworICAgICAgdGhyb3cgZTsK
KyAgICB9CisKKyAgICByb3V0ZXIuc3RhdGUucXVlcnlQYXJhbXMgPSBmaW5hbGl6ZVF1ZXJ5UGFy
YW1DaGFuZ2Uocm91dGVyLCBjdXJyZW50SGFuZGxlckluZm9zLCBuZXdTdGF0ZS5xdWVyeVBhcmFt
cywgdHJhbnNpdGlvbik7CisgIH0KKworICAvKioKKyAgICBAcHJpdmF0ZQorICAKKyAgICBIZWxw
ZXIgbWV0aG9kIHVzZWQgYnkgc2V0dXBDb250ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVkaXJl
Y3RzCisgICAgdGhhdCBtYXkgaGFwcGVuIGluIGVudGVyL3NldHVwLgorICAqLworICBmdW5jdGlv
biBoYW5kbGVyRW50ZXJlZE9yVXBkYXRlZChjdXJyZW50SGFuZGxlckluZm9zLCBoYW5kbGVySW5m
bywgZW50ZXIsIHRyYW5zaXRpb24pIHsKKworICAgIHZhciBoYW5kbGVyID0gaGFuZGxlckluZm8u
aGFuZGxlciwKKyAgICAgICAgY29udGV4dCA9IGhhbmRsZXJJbmZvLmNvbnRleHQ7CisKKyAgICBp
ZiAoZW50ZXIpIHsKKyAgICAgIF9yb3V0ZXJVdGlscy5jYWxsSG9vayhoYW5kbGVyLCAnZW50ZXIn
LCB0cmFuc2l0aW9uKTsKKyAgICB9CisgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5p
c0Fib3J0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5UcmFuc2l0aW9u
QWJvcnRlZCgpOworICAgIH0KKworICAgIGhhbmRsZXIuY29udGV4dCA9IGNvbnRleHQ7CisgICAg
X3JvdXRlclV0aWxzLmNhbGxIb29rKGhhbmRsZXIsICdjb250ZXh0RGlkQ2hhbmdlJyk7CisKKyAg
ICBfcm91dGVyVXRpbHMuY2FsbEhvb2soaGFuZGxlciwgJ3NldHVwJywgY29udGV4dCwgdHJhbnNp
dGlvbik7CisgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKKyAg
ICAgIHRocm93IG5ldyBfcm91dGVyVHJhbnNpdGlvbi5UcmFuc2l0aW9uQWJvcnRlZCgpOworICAg
IH0KKworICAgIGN1cnJlbnRIYW5kbGVySW5mb3MucHVzaChoYW5kbGVySW5mbyk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIG9uZSBVUkwgdG8KKyAgICBh
bm90aGVyIHRvIGRldGVybWluZSB3aGljaCBoYW5kbGVycyBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSwK
KyAgICB3aGljaCBoYW5kbGVycyBhcmUgbmV3bHkgYWN0aXZlLCBhbmQgd2hpY2ggaGFuZGxlcnMg
cmVtYWluCisgICAgYWN0aXZlIGJ1dCBoYXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4KKyAgCisg
ICAgVGFrZSBhIGxpc3Qgb2Ygb2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5kIHBhcnRp
dGlvbgorICAgIHRoZW0gaW50byBmb3VyIGJ1Y2tldHM6CisgIAorICAgICogdW5jaGFuZ2VkOiB0
aGUgaGFuZGxlciB3YXMgYWN0aXZlIGluIGJvdGggdGhlIG9sZCBhbmQKKyAgICAgIG5ldyBVUkws
IGFuZCBpdHMgY29udGV4dCByZW1haW5zIHRoZSBzYW1lCisgICAgKiB1cGRhdGVkIGNvbnRleHQ6
IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUKKyAgICAgIG9sZCBhbmQgbmV3IFVS
TCwgYnV0IGl0cyBjb250ZXh0IGNoYW5nZWQuIFRoZSBoYW5kbGVyJ3MKKyAgICAgIGBzZXR1cGAg
bWV0aG9kLCBpZiBhbnksIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG5ldworICAgICAgY29udGV4
dC4KKyAgICAqIGV4aXRlZDogdGhlIGhhbmRsZXIgd2FzIGFjdGl2ZSBpbiB0aGUgb2xkIFVSTCwg
YnV0IGlzCisgICAgICBubyBsb25nZXIgYWN0aXZlLgorICAgICogZW50ZXJlZDogdGhlIGhhbmRs
ZXIgd2FzIG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkwsIGJ1dAorICAgICAgaXMgbm93IGFjdGl2
ZS4KKyAgCisgICAgVGhlIFBhcnRpdGlvbmVkSGFuZGxlcnMgc3RydWN0dXJlIGhhcyBmb3VyIGZp
ZWxkczoKKyAgCisgICAgKiBgdXBkYXRlZENvbnRleHRgOiBhIGxpc3Qgb2YgYEhhbmRsZXJJbmZv
YCBvYmplY3RzIHRoYXQKKyAgICAgIHJlcHJlc2VudCBoYW5kbGVycyB0aGF0IHJlbWFpbiBhY3Rp
dmUgYnV0IGhhdmUgYSBjaGFuZ2VkCisgICAgICBjb250ZXh0CisgICAgKiBgZW50ZXJlZGA6IGEg
bGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKyAgICAgIGhhbmRs
ZXJzIHRoYXQgYXJlIG5ld2x5IGFjdGl2ZQorICAgICogYGV4aXRlZGA6IGEgbGlzdCBvZiBgSGFu
ZGxlckluZm9gIG9iamVjdHMgdGhhdCBhcmUgbm8KKyAgICAgIGxvbmdlciBhY3RpdmUuCisgICAg
KiBgdW5jaGFuZ2VkYDogYSBsaXN0IG9mIGBIYW5kZXJJbmZvYCBvYmplY3RzIHRoYXQgcmVtYWlu
IGFjdGl2ZS4KKyAgCisgICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG9sZEhhbmRsZXJz
IGEgbGlzdCBvZiB0aGUgaGFuZGxlcgorICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91
cyBVUkwgKG9yIGBbXWAgaWYgdGhpcyBpcyB0aGUKKyAgICAgIGZpcnN0IGhhbmRsZWQgdHJhbnNp
dGlvbikKKyAgICBAcGFyYW0ge0FycmF5W0hhbmRsZXJJbmZvXX0gbmV3SGFuZGxlcnMgYSBsaXN0
IG9mIHRoZSBoYW5kbGVyCisgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBVUkwKKyAgCisg
ICAgQHJldHVybiB7UGFydGl0aW9ufQorICAqLworICBmdW5jdGlvbiBwYXJ0aXRpb25IYW5kbGVy
cyhvbGRTdGF0ZSwgbmV3U3RhdGUpIHsKKyAgICB2YXIgb2xkSGFuZGxlcnMgPSBvbGRTdGF0ZS5o
YW5kbGVySW5mb3M7CisgICAgdmFyIG5ld0hhbmRsZXJzID0gbmV3U3RhdGUuaGFuZGxlckluZm9z
OworCisgICAgdmFyIGhhbmRsZXJzID0geworICAgICAgdXBkYXRlZENvbnRleHQ6IFtdLAorICAg
ICAgZXhpdGVkOiBbXSwKKyAgICAgIGVudGVyZWQ6IFtdLAorICAgICAgdW5jaGFuZ2VkOiBbXQor
ICAgIH07CisKKyAgICB2YXIgaGFuZGxlckNoYW5nZWQsCisgICAgICAgIGNvbnRleHRDaGFuZ2Vk
ID0gZmFsc2UsCisgICAgICAgIGksCisgICAgICAgIGw7CisKKyAgICBmb3IgKGkgPSAwLCBsID0g
bmV3SGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICB2YXIgb2xkSGFuZGxlciA9
IG9sZEhhbmRsZXJzW2ldLAorICAgICAgICAgIG5ld0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsK
KworICAgICAgaWYgKCFvbGRIYW5kbGVyIHx8IG9sZEhhbmRsZXIuaGFuZGxlciAhPT0gbmV3SGFu
ZGxlci5oYW5kbGVyKSB7CisgICAgICAgIGhhbmRsZXJDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0K
KworICAgICAgaWYgKGhhbmRsZXJDaGFuZ2VkKSB7CisgICAgICAgIGhhbmRsZXJzLmVudGVyZWQu
cHVzaChuZXdIYW5kbGVyKTsKKyAgICAgICAgaWYgKG9sZEhhbmRsZXIpIHsKKyAgICAgICAgICBo
YW5kbGVycy5leGl0ZWQudW5zaGlmdChvbGRIYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgfSBl
bHNlIGlmIChjb250ZXh0Q2hhbmdlZCB8fCBvbGRIYW5kbGVyLmNvbnRleHQgIT09IG5ld0hhbmRs
ZXIuY29udGV4dCkgeworICAgICAgICBjb250ZXh0Q2hhbmdlZCA9IHRydWU7CisgICAgICAgIGhh
bmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2gobmV3SGFuZGxlcik7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBoYW5kbGVycy51bmNoYW5nZWQucHVzaChvbGRIYW5kbGVyKTsKKyAgICAgIH0KKyAg
ICB9CisKKyAgICBmb3IgKGkgPSBuZXdIYW5kbGVycy5sZW5ndGgsIGwgPSBvbGRIYW5kbGVycy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhh
bmRsZXJzW2ldKTsKKyAgICB9CisKKyAgICBoYW5kbGVycy5yZXNldCA9IGhhbmRsZXJzLnVwZGF0
ZWRDb250ZXh0LnNsaWNlKCk7CisgICAgaGFuZGxlcnMucmVzZXQucmV2ZXJzZSgpOworCisgICAg
cmV0dXJuIGhhbmRsZXJzOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlVVJMKHRyYW5zaXRpb24s
IHN0YXRlLCBpbnB1dFVybCkgeworICAgIHZhciB1cmxNZXRob2QgPSB0cmFuc2l0aW9uLnVybE1l
dGhvZDsKKworICAgIGlmICghdXJsTWV0aG9kKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgdmFyIHJvdXRlciA9IHRyYW5zaXRpb24ucm91dGVyLAorICAgICAgICBoYW5kbGVySW5mb3Mg
PSBzdGF0ZS5oYW5kbGVySW5mb3MsCisgICAgICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm9z
W2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lLAorICAgICAgICBwYXJhbXMgPSB7fTsKKwor
ICAgIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsK
KyAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXTsKKyAgICAgIF9yb3V0ZXJV
dGlscy5tZXJnZShwYXJhbXMsIGhhbmRsZXJJbmZvLnBhcmFtcyk7CisgICAgICBpZiAoaGFuZGxl
ckluZm8uaGFuZGxlci5pbmFjY2Vzc2libGVCeVVSTCkgeworICAgICAgICB1cmxNZXRob2QgPSBu
dWxsOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1cmxNZXRob2QpIHsKKyAgICAgIHBhcmFt
cy5xdWVyeVBhcmFtcyA9IHRyYW5zaXRpb24uX3Zpc2libGVRdWVyeVBhcmFtcyB8fCBzdGF0ZS5x
dWVyeVBhcmFtczsKKyAgICAgIHZhciB1cmwgPSByb3V0ZXIucmVjb2duaXplci5nZW5lcmF0ZSho
YW5kbGVyTmFtZSwgcGFyYW1zKTsKKworICAgICAgaWYgKHVybE1ldGhvZCA9PT0gJ3JlcGxhY2Un
KSB7CisgICAgICAgIHJvdXRlci5yZXBsYWNlVVJMKHVybCk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICByb3V0ZXIudXBkYXRlVVJMKHVybCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoq
CisgICAgQHByaXZhdGUKKyAgCisgICAgVXBkYXRlcyB0aGUgVVJMIChpZiBuZWNlc3NhcnkpIGFu
ZCBjYWxscyBgc2V0dXBDb250ZXh0c2AKKyAgICB0byB1cGRhdGUgdGhlIHJvdXRlcidzIGFycmF5
IG9mIGBjdXJyZW50SGFuZGxlckluZm9zYC4KKyAgICovCisgIGZ1bmN0aW9uIGZpbmFsaXplVHJh
bnNpdGlvbih0cmFuc2l0aW9uLCBuZXdTdGF0ZSkgeworCisgICAgdHJ5IHsKKyAgICAgIF9yb3V0
ZXJVdGlscy5sb2codHJhbnNpdGlvbi5yb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJSZXNv
bHZlZCBhbGwgbW9kZWxzIG9uIGRlc3RpbmF0aW9uIHJvdXRlOyBmaW5hbGl6aW5nIHRyYW5zaXRp
b24uIik7CisKKyAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKKyAgICAgICAg
ICBoYW5kbGVySW5mb3MgPSBuZXdTdGF0ZS5oYW5kbGVySW5mb3MsCisgICAgICAgICAgc2VxID0g
dHJhbnNpdGlvbi5zZXF1ZW5jZTsKKworICAgICAgLy8gUnVuIGFsbCB0aGUgbmVjZXNzYXJ5IGVu
dGVyL3NldHVwL2V4aXQgaG9va3MKKyAgICAgIHNldHVwQ29udGV4dHMocm91dGVyLCBuZXdTdGF0
ZSwgdHJhbnNpdGlvbik7CisKKyAgICAgIC8vIENoZWNrIGlmIGEgcmVkaXJlY3Qgb2NjdXJyZWQg
aW4gZW50ZXIvc2V0dXAKKyAgICAgIGlmICh0cmFuc2l0aW9uLmlzQWJvcnRlZCkgeworICAgICAg
ICAvLyBUT0RPOiBjbGVhbmVyIHdheT8gZGlzdGluZ3Vpc2ggYi93IHRhcmdldEhhbmRsZXJJbmZv
cz8KKyAgICAgICAgcm91dGVyLnN0YXRlLmhhbmRsZXJJbmZvcyA9IHJvdXRlci5jdXJyZW50SGFu
ZGxlckluZm9zOworICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KF9y
b3V0ZXJUcmFuc2l0aW9uLmxvZ0Fib3J0KHRyYW5zaXRpb24pKTsKKyAgICAgIH0KKworICAgICAg
dXBkYXRlVVJMKHRyYW5zaXRpb24sIG5ld1N0YXRlLCB0cmFuc2l0aW9uLmludGVudC51cmwpOwor
CisgICAgICB0cmFuc2l0aW9uLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICByb3V0ZXIuYWN0aXZl
VHJhbnNpdGlvbiA9IG51bGw7CisKKyAgICAgIF9yb3V0ZXJVdGlscy50cmlnZ2VyKHJvdXRlciwg
cm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUsIFsnZGlkVHJhbnNpdGlvbiddKTsKKwor
ICAgICAgaWYgKHJvdXRlci5kaWRUcmFuc2l0aW9uKSB7CisgICAgICAgIHJvdXRlci5kaWRUcmFu
c2l0aW9uKHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zKTsKKyAgICAgIH0KKworICAgICAgX3Jv
dXRlclV0aWxzLmxvZyhyb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJUUkFOU0lUSU9OIENP
TVBMRVRFLiIpOworCisgICAgICAvLyBSZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhhbmRsZXIuCisg
ICAgICByZXR1cm4gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVy
OworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBfcm91dGVyVHJh
bnNpdGlvbi5UcmFuc2l0aW9uQWJvcnRlZCkpIHsKKyAgICAgICAgLy92YXIgZXJyb25lb3VzSGFu
ZGxlciA9IGhhbmRsZXJJbmZvcy5wb3AoKTsKKyAgICAgICAgdmFyIGluZm9zID0gdHJhbnNpdGlv
bi5zdGF0ZS5oYW5kbGVySW5mb3M7CisgICAgICAgIHRyYW5zaXRpb24udHJpZ2dlcih0cnVlLCAn
ZXJyb3InLCBlLCB0cmFuc2l0aW9uLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVyKTsK
KyAgICAgICAgdHJhbnNpdGlvbi5hYm9ydCgpOworICAgICAgfQorCisgICAgICB0aHJvdyBlOwor
ICAgIH0KKyAgfQorCisgIC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIEJlZ2lucyBhbmQgcmV0
dXJucyBhIFRyYW5zaXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkCisgICAgYXJndW1lbnRzLiBB
Y2NlcHRzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSBvZiBib3RoIFVSTAorICAgIHRyYW5zaXRpb25z
IGFuZCBuYW1lZCB0cmFuc2l0aW9ucy4KKyAgCisgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgor
ICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gYXJncyBhcmd1bWVudHMgcGFzc2VkIHRvIHRyYW5z
aXRpb25UbywKKyAgICAgIHJlcGxhY2VXaXRoLCBvciBoYW5kbGVVUkwKKyAgKi8KKyAgZnVuY3Rp
b24gZG9UcmFuc2l0aW9uKHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlhdGUpIHsKKyAgICAvLyBO
b3JtYWxpemUgYmxhbmsgdHJhbnNpdGlvbnMgdG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCisgICAg
dmFyIG5hbWUgPSBhcmdzWzBdIHx8ICcvJzsKKworICAgIHZhciBsYXN0QXJnID0gYXJnc1thcmdz
Lmxlbmd0aCAtIDFdOworICAgIHZhciBxdWVyeVBhcmFtcyA9IHt9OworICAgIGlmIChsYXN0QXJn
ICYmIGxhc3RBcmcuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFyYW1zJykpIHsKKyAgICAgIHF1ZXJ5
UGFyYW1zID0gcG9wLmNhbGwoYXJncykucXVlcnlQYXJhbXM7CisgICAgfQorCisgICAgdmFyIGlu
dGVudDsKKyAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHsKKworICAgICAgX3JvdXRlclV0aWxz
LmxvZyhyb3V0ZXIsICJVcGRhdGluZyBxdWVyeSBwYXJhbXMiKTsKKworICAgICAgLy8gQSBxdWVy
eSBwYXJhbSB1cGRhdGUgaXMgcmVhbGx5IGp1c3QgYSB0cmFuc2l0aW9uCisgICAgICAvLyBpbnRv
IHRoZSByb3V0ZSB5b3UncmUgYWxyZWFkeSBvbi4KKyAgICAgIHZhciBoYW5kbGVySW5mb3MgPSBy
b3V0ZXIuc3RhdGUuaGFuZGxlckluZm9zOworICAgICAgaW50ZW50ID0gbmV3IF9yb3V0ZXJUcmFu
c2l0aW9uSW50ZW50TmFtZWRUcmFuc2l0aW9uSW50ZW50LmRlZmF1bHQoeworICAgICAgICBuYW1l
OiBoYW5kbGVySW5mb3NbaGFuZGxlckluZm9zLmxlbmd0aCAtIDFdLm5hbWUsCisgICAgICAgIGNv
bnRleHRzOiBbXSwKKyAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zCisgICAgICB9KTsK
KyAgICB9IGVsc2UgaWYgKG5hbWUuY2hhckF0KDApID09PSAnLycpIHsKKworICAgICAgX3JvdXRl
clV0aWxzLmxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0cmFuc2l0aW9uIHRvICIgKyBuYW1l
KTsKKyAgICAgIGludGVudCA9IG5ldyBfcm91dGVyVHJhbnNpdGlvbkludGVudFVybFRyYW5zaXRp
b25JbnRlbnQuZGVmYXVsdCh7IHVybDogbmFtZSB9KTsKKyAgICB9IGVsc2UgeworCisgICAgICBf
cm91dGVyVXRpbHMubG9nKHJvdXRlciwgIkF0dGVtcHRpbmcgdHJhbnNpdGlvbiB0byAiICsgbmFt
ZSk7CisgICAgICBpbnRlbnQgPSBuZXcgX3JvdXRlclRyYW5zaXRpb25JbnRlbnROYW1lZFRyYW5z
aXRpb25JbnRlbnQuZGVmYXVsdCh7CisgICAgICAgIG5hbWU6IGFyZ3NbMF0sCisgICAgICAgIGNv
bnRleHRzOiBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmdzLCAxKSwKKyAgICAgICAgcXVlcnlQ
YXJhbXM6IHF1ZXJ5UGFyYW1zCisgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gcm91dGVy
LnRyYW5zaXRpb25CeUludGVudChpbnRlbnQsIGlzSW50ZXJtZWRpYXRlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGhhbmRsZXJJbmZvc0VxdWFsKGhhbmRsZXJJbmZvcywgb3RoZXJIYW5kbGVySW5mb3Mp
IHsKKyAgICBpZiAoaGFuZGxlckluZm9zLmxlbmd0aCAhPT0gb3RoZXJIYW5kbGVySW5mb3MubGVu
Z3RoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDAs
IGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgaWYgKGhh
bmRsZXJJbmZvc1tpXSAhPT0gb3RoZXJIYW5kbGVySW5mb3NbaV0pIHsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZ1bmN0
aW9uIGZpbmFsaXplUXVlcnlQYXJhbUNoYW5nZShyb3V0ZXIsIHJlc29sdmVkSGFuZGxlcnMsIG5l
d1F1ZXJ5UGFyYW1zLCB0cmFuc2l0aW9uKSB7CisgICAgLy8gV2UgZmlyZSBhIGZpbmFsaXplUXVl
cnlQYXJhbUNoYW5nZSBldmVudCB3aGljaAorICAgIC8vIGdpdmVzIHRoZSBuZXcgcm91dGUgaGll
cmFyY2h5IGEgY2hhbmNlIHRvIHRlbGwKKyAgICAvLyB1cyB3aGljaCBxdWVyeSBwYXJhbXMgaXQn
cyBjb25zdW1pbmcgYW5kIHdoYXQKKyAgICAvLyB0aGVpciBmaW5hbCB2YWx1ZXMgYXJlLiBJZiBh
IHF1ZXJ5IHBhcmFtIGlzCisgICAgLy8gbm8gbG9uZ2VyIGNvbnN1bWVkIGluIHRoZSBmaW5hbCBy
b3V0ZSBoaWVyYXJjaHksCisgICAgLy8gaXRzIHNlcmlhbGl6ZWQgc2VnbWVudCB3aWxsIGJlIHJl
bW92ZWQKKyAgICAvLyBmcm9tIHRoZSBVUkwuCisKKyAgICBmb3IgKHZhciBrIGluIG5ld1F1ZXJ5
UGFyYW1zKSB7CisgICAgICBpZiAobmV3UXVlcnlQYXJhbXMuaGFzT3duUHJvcGVydHkoaykgJiYg
bmV3UXVlcnlQYXJhbXNba10gPT09IG51bGwpIHsKKyAgICAgICAgZGVsZXRlIG5ld1F1ZXJ5UGFy
YW1zW2tdOworICAgICAgfQorICAgIH0KKworICAgIHZhciBmaW5hbFF1ZXJ5UGFyYW1zQXJyYXkg
PSBbXTsKKyAgICBfcm91dGVyVXRpbHMudHJpZ2dlcihyb3V0ZXIsIHJlc29sdmVkSGFuZGxlcnMs
IHRydWUsIFsnZmluYWxpemVRdWVyeVBhcmFtQ2hhbmdlJywgbmV3UXVlcnlQYXJhbXMsIGZpbmFs
UXVlcnlQYXJhbXNBcnJheSwgdHJhbnNpdGlvbl0pOworCisgICAgaWYgKHRyYW5zaXRpb24pIHsK
KyAgICAgIHRyYW5zaXRpb24uX3Zpc2libGVRdWVyeVBhcmFtcyA9IHt9OworICAgIH0KKworICAg
IHZhciBmaW5hbFF1ZXJ5UGFyYW1zID0ge307CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGZp
bmFsUXVlcnlQYXJhbXNBcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgdmFyIHFw
ID0gZmluYWxRdWVyeVBhcmFtc0FycmF5W2ldOworICAgICAgZmluYWxRdWVyeVBhcmFtc1txcC5r
ZXldID0gcXAudmFsdWU7CisgICAgICBpZiAodHJhbnNpdGlvbiAmJiBxcC52aXNpYmxlICE9PSBm
YWxzZSkgeworICAgICAgICB0cmFuc2l0aW9uLl92aXNpYmxlUXVlcnlQYXJhbXNbcXAua2V5XSA9
IHFwLnZhbHVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmluYWxRdWVyeVBhcmFtczsK
KyAgfQorCisgIGZ1bmN0aW9uIG5vdGlmeUV4aXN0aW5nSGFuZGxlcnMocm91dGVyLCBuZXdTdGF0
ZSwgbmV3VHJhbnNpdGlvbikgeworICAgIHZhciBvbGRIYW5kbGVycyA9IHJvdXRlci5zdGF0ZS5o
YW5kbGVySW5mb3MsCisgICAgICAgIGNoYW5naW5nID0gW10sCisgICAgICAgIGxlYXZpbmdJbmRl
eCA9IG51bGwsCisgICAgICAgIGxlYXZpbmcsCisgICAgICAgIGxlYXZpbmdDaGVja2VyLAorICAg
ICAgICBpLAorICAgICAgICBvbGRIYW5kbGVyTGVuLAorICAgICAgICBvbGRIYW5kbGVyLAorICAg
ICAgICBuZXdIYW5kbGVyOworCisgICAgb2xkSGFuZGxlckxlbiA9IG9sZEhhbmRsZXJzLmxlbmd0
aDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2xkSGFuZGxlckxlbjsgaSsrKSB7CisgICAgICBvbGRI
YW5kbGVyID0gb2xkSGFuZGxlcnNbaV07CisgICAgICBuZXdIYW5kbGVyID0gbmV3U3RhdGUuaGFu
ZGxlckluZm9zW2ldOworCisgICAgICBpZiAoIW5ld0hhbmRsZXIgfHwgb2xkSGFuZGxlci5uYW1l
ICE9PSBuZXdIYW5kbGVyLm5hbWUpIHsKKyAgICAgICAgbGVhdmluZ0luZGV4ID0gaTsKKyAgICAg
ICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghbmV3SGFuZGxlci5pc1Jlc29sdmVkKSB7
CisgICAgICAgIGNoYW5naW5nLnB1c2gob2xkSGFuZGxlcik7CisgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGxlYXZpbmdJbmRleCAhPT0gbnVsbCkgeworICAgICAgbGVhdmluZyA9IG9sZEhhbmRs
ZXJzLnNsaWNlKGxlYXZpbmdJbmRleCwgb2xkSGFuZGxlckxlbik7CisgICAgICBsZWF2aW5nQ2hl
Y2tlciA9IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgIGZvciAodmFyIGggPSAwLCBsZW4gPSBs
ZWF2aW5nLmxlbmd0aDsgaCA8IGxlbjsgaCsrKSB7CisgICAgICAgICAgaWYgKGxlYXZpbmdbaF0u
bmFtZSA9PT0gbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH07CisgICAgfQorCisgICAg
X3JvdXRlclV0aWxzLnRyaWdnZXIocm91dGVyLCBvbGRIYW5kbGVycywgdHJ1ZSwgWyd3aWxsVHJh
bnNpdGlvbicsIG5ld1RyYW5zaXRpb25dKTsKKworICAgIGlmIChyb3V0ZXIud2lsbFRyYW5zaXRp
b24pIHsKKyAgICAgIHJvdXRlci53aWxsVHJhbnNpdGlvbihvbGRIYW5kbGVycywgbmV3U3RhdGUu
aGFuZGxlckluZm9zLCBuZXdUcmFuc2l0aW9uKTsKKyAgICB9CisgIH0KKworICBleHBvcnRzLmRl
ZmF1bHQgPSBSb3V0ZXI7Cit9KTsKK2VuaWZlZCgncm91dGVyL3RyYW5zaXRpb24taW50ZW50Jywg
WydleHBvcnRzJywgJ3JvdXRlci91dGlscyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JvdXRlclV0
aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBUcmFuc2l0aW9uSW50ZW50KHBy
b3BzKSB7CisgICAgdGhpcy5pbml0aWFsaXplKHByb3BzKTsKKworICAgIC8vIFRPRE86IHdhdAor
ICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YSB8fCB7fTsKKyAgfQorCisgIFRyYW5zaXRpb25JbnRl
bnQucHJvdG90eXBlID0geworICAgIGluaXRpYWxpemU6IG51bGwsCisgICAgYXBwbHlUb1N0YXRl
OiBudWxsCisgIH07CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNpdGlvbkludGVudDsKK30p
OworZW5pZmVkKCdyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQvbmFtZWQtdHJhbnNpdGlvbi1pbnRl
bnQnLCBbJ2V4cG9ydHMnLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFu
c2l0aW9uLXN0YXRlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScsICdyb3V0ZXIvdXRp
bHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50LCBfcm91dGVy
VHJhbnNpdGlvblN0YXRlLCBfcm91dGVySGFuZGxlckluZm9GYWN0b3J5LCBfcm91dGVyVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IF9yb3V0ZXJVdGlscy5z
dWJjbGFzcyhfcm91dGVyVHJhbnNpdGlvbkludGVudC5kZWZhdWx0LCB7CisgICAgbmFtZTogbnVs
bCwKKyAgICBwaXZvdEhhbmRsZXI6IG51bGwsCisgICAgY29udGV4dHM6IG51bGwsCisgICAgcXVl
cnlQYXJhbXM6IG51bGwsCisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAg
ICAgIHRoaXMubmFtZSA9IHByb3BzLm5hbWU7CisgICAgICB0aGlzLnBpdm90SGFuZGxlciA9IHBy
b3BzLnBpdm90SGFuZGxlcjsKKyAgICAgIHRoaXMuY29udGV4dHMgPSBwcm9wcy5jb250ZXh0cyB8
fCBbXTsKKyAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSBwcm9wcy5xdWVyeVBhcmFtczsKKyAgICB9
LAorCisgICAgYXBwbHlUb1N0YXRlOiBmdW5jdGlvbiAob2xkU3RhdGUsIHJlY29nbml6ZXIsIGdl
dEhhbmRsZXIsIGlzSW50ZXJtZWRpYXRlKSB7CisKKyAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3Mg
PSBfcm91dGVyVXRpbHMuZXh0cmFjdFF1ZXJ5UGFyYW1zKFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlz
LmNvbnRleHRzKSksCisgICAgICAgICAgcHVyZUFyZ3MgPSBwYXJ0aXRpb25lZEFyZ3NbMF0sCisg
ICAgICAgICAgcXVlcnlQYXJhbXMgPSBwYXJ0aXRpb25lZEFyZ3NbMV0sCisgICAgICAgICAgaGFu
ZGxlcnMgPSByZWNvZ25pemVyLmhhbmRsZXJzRm9yKHB1cmVBcmdzWzBdKTsKKworICAgICAgdmFy
IHRhcmdldFJvdXRlTmFtZSA9IGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXI7
CisKKyAgICAgIHJldHVybiB0aGlzLmFwcGx5VG9IYW5kbGVycyhvbGRTdGF0ZSwgaGFuZGxlcnMs
IGdldEhhbmRsZXIsIHRhcmdldFJvdXRlTmFtZSwgaXNJbnRlcm1lZGlhdGUpOworICAgIH0sCisK
KyAgICBhcHBseVRvSGFuZGxlcnM6IGZ1bmN0aW9uIChvbGRTdGF0ZSwgaGFuZGxlcnMsIGdldEhh
bmRsZXIsIHRhcmdldFJvdXRlTmFtZSwgaXNJbnRlcm1lZGlhdGUsIGNoZWNraW5nSWZBY3RpdmUp
IHsKKworICAgICAgdmFyIGksIGxlbjsKKyAgICAgIHZhciBuZXdTdGF0ZSA9IG5ldyBfcm91dGVy
VHJhbnNpdGlvblN0YXRlLmRlZmF1bHQoKTsKKyAgICAgIHZhciBvYmplY3RzID0gdGhpcy5jb250
ZXh0cy5zbGljZSgwKTsKKworICAgICAgdmFyIGludmFsaWRhdGVJbmRleCA9IGhhbmRsZXJzLmxl
bmd0aDsKKworICAgICAgLy8gUGl2b3QgaGFuZGxlcnMgYXJlIHByb3ZpZGVkIGZvciByZWZyZXNo
IHRyYW5zaXRpb25zCisgICAgICBpZiAodGhpcy5waXZvdEhhbmRsZXIpIHsKKyAgICAgICAgZm9y
IChpID0gMCwgbGVuID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAg
ICBpZiAoZ2V0SGFuZGxlcihoYW5kbGVyc1tpXS5oYW5kbGVyKSA9PT0gdGhpcy5waXZvdEhhbmRs
ZXIpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVJbmRleCA9IGk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHBpdm90SGFu
ZGxlckZvdW5kID0gIXRoaXMucGl2b3RIYW5kbGVyOworCisgICAgICBmb3IgKGkgPSBoYW5kbGVy
cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICB2YXIgcmVzdWx0ID0gaGFuZGxl
cnNbaV07CisgICAgICAgIHZhciBuYW1lID0gcmVzdWx0LmhhbmRsZXI7CisgICAgICAgIHZhciBo
YW5kbGVyID0gZ2V0SGFuZGxlcihuYW1lKTsKKworICAgICAgICB2YXIgb2xkSGFuZGxlckluZm8g
PSBvbGRTdGF0ZS5oYW5kbGVySW5mb3NbaV07CisgICAgICAgIHZhciBuZXdIYW5kbGVySW5mbyA9
IG51bGw7CisKKyAgICAgICAgaWYgKHJlc3VsdC5uYW1lcy5sZW5ndGggPiAwKSB7CisgICAgICAg
ICAgaWYgKGkgPj0gaW52YWxpZGF0ZUluZGV4KSB7CisgICAgICAgICAgICBuZXdIYW5kbGVySW5m
byA9IHRoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5mbyhuYW1lLCBoYW5kbGVyLCByZXN1bHQubmFt
ZXMsIG9iamVjdHMsIG9sZEhhbmRsZXJJbmZvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgbmV3SGFuZGxlckluZm8gPSB0aGlzLmdldEhhbmRsZXJJbmZvRm9yRHluYW1pY1NlZ21l
bnQobmFtZSwgaGFuZGxlciwgcmVzdWx0Lm5hbWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5mbywg
dGFyZ2V0Um91dGVOYW1lLCBpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgLy8gVGhpcyByb3V0ZSBoYXMgbm8gZHluYW1pYyBzZWdtZW50LgorICAgICAgICAgIC8v
IFRoZXJlZm9yZSB0cmVhdCBhcyBhIHBhcmFtLWJhc2VkIGhhbmRsZXJJbmZvCisgICAgICAgICAg
Ly8gd2l0aCBlbXB0eSBwYXJhbXMuIFRoaXMgd2lsbCBjYXVzZSB0aGUgYG1vZGVsYAorICAgICAg
ICAgIC8vIGhvb2sgdG8gYmUgY2FsbGVkIHdpdGggZW1wdHkgcGFyYW1zLCB3aGljaCBpcyBkZXNp
cmFibGUuCisgICAgICAgICAgbmV3SGFuZGxlckluZm8gPSB0aGlzLmNyZWF0ZVBhcmFtSGFuZGxl
ckluZm8obmFtZSwgaGFuZGxlciwgcmVzdWx0Lm5hbWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5m
byk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hlY2tpbmdJZkFjdGl2ZSkgeworICAgICAg
ICAgIC8vIElmIHdlJ3JlIHBlcmZvcm1pbmcgYW4gaXNBY3RpdmUgY2hlY2ssIHdlIHdhbnQgdG8K
KyAgICAgICAgICAvLyBzZXJpYWxpemUgVVJMIHBhcmFtcyB3aXRoIHRoZSBwcm92aWRlZCBjb250
ZXh0LCBidXQKKyAgICAgICAgICAvLyBpZ25vcmUgbWlzbWF0Y2hlcyBiZXR3ZWVuIG9sZCBhbmQg
bmV3IGNvbnRleHQuCisgICAgICAgICAgbmV3SGFuZGxlckluZm8gPSBuZXdIYW5kbGVySW5mby5i
ZWNvbWVSZXNvbHZlZChudWxsLCBuZXdIYW5kbGVySW5mby5jb250ZXh0KTsKKyAgICAgICAgICB2
YXIgb2xkQ29udGV4dCA9IG9sZEhhbmRsZXJJbmZvICYmIG9sZEhhbmRsZXJJbmZvLmNvbnRleHQ7
CisgICAgICAgICAgaWYgKHJlc3VsdC5uYW1lcy5sZW5ndGggPiAwICYmIG5ld0hhbmRsZXJJbmZv
LmNvbnRleHQgPT09IG9sZENvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIElmIGNvbnRleHRzIG1h
dGNoIGluIGlzQWN0aXZlIHRlc3QsIGFzc3VtZSBwYXJhbXMgYWxzbyBtYXRjaC4KKyAgICAgICAg
ICAgIC8vIFRoaXMgYWxsb3dzIGZvciBmbGV4aWJpbGl0eSBpbiBub3QgcmVxdWlyaW5nIHRoYXQg
ZXZlcnkgbGFzdAorICAgICAgICAgICAgLy8gaGFuZGxlciBwcm92aWRlIGEgYHNlcmlhbGl6ZWAg
bWV0aG9kCisgICAgICAgICAgICBuZXdIYW5kbGVySW5mby5wYXJhbXMgPSBvbGRIYW5kbGVySW5m
byAmJiBvbGRIYW5kbGVySW5mby5wYXJhbXM7CisgICAgICAgICAgfQorICAgICAgICAgIG5ld0hh
bmRsZXJJbmZvLmNvbnRleHQgPSBvbGRDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgdmFy
IGhhbmRsZXJUb1VzZSA9IG9sZEhhbmRsZXJJbmZvOworICAgICAgICBpZiAoaSA+PSBpbnZhbGlk
YXRlSW5kZXggfHwgbmV3SGFuZGxlckluZm8uc2hvdWxkU3VwZXJjZWRlKG9sZEhhbmRsZXJJbmZv
KSkgeworICAgICAgICAgIGludmFsaWRhdGVJbmRleCA9IE1hdGgubWluKGksIGludmFsaWRhdGVJ
bmRleCk7CisgICAgICAgICAgaGFuZGxlclRvVXNlID0gbmV3SGFuZGxlckluZm87CisgICAgICAg
IH0KKworICAgICAgICBpZiAoaXNJbnRlcm1lZGlhdGUgJiYgIWNoZWNraW5nSWZBY3RpdmUpIHsK
KyAgICAgICAgICBoYW5kbGVyVG9Vc2UgPSBoYW5kbGVyVG9Vc2UuYmVjb21lUmVzb2x2ZWQobnVs
bCwgaGFuZGxlclRvVXNlLmNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgbmV3U3RhdGUu
aGFuZGxlckluZm9zLnVuc2hpZnQoaGFuZGxlclRvVXNlKTsKKyAgICAgIH0KKworICAgICAgaWYg
KG9iamVjdHMubGVuZ3RoID4gMCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk1vcmUgY29u
dGV4dCBvYmplY3RzIHdlcmUgcGFzc2VkIHRoYW4gdGhlcmUgYXJlIGR5bmFtaWMgc2VnbWVudHMg
Zm9yIHRoZSByb3V0ZTogIiArIHRhcmdldFJvdXRlTmFtZSk7CisgICAgICB9CisKKyAgICAgIGlm
ICghaXNJbnRlcm1lZGlhdGUpIHsKKyAgICAgICAgdGhpcy5pbnZhbGlkYXRlQ2hpbGRyZW4obmV3
U3RhdGUuaGFuZGxlckluZm9zLCBpbnZhbGlkYXRlSW5kZXgpOworICAgICAgfQorCisgICAgICBf
cm91dGVyVXRpbHMubWVyZ2UobmV3U3RhdGUucXVlcnlQYXJhbXMsIHRoaXMucXVlcnlQYXJhbXMg
fHwge30pOworCisgICAgICByZXR1cm4gbmV3U3RhdGU7CisgICAgfSwKKworICAgIGludmFsaWRh
dGVDaGlsZHJlbjogZnVuY3Rpb24gKGhhbmRsZXJJbmZvcywgaW52YWxpZGF0ZUluZGV4KSB7Cisg
ICAgICBmb3IgKHZhciBpID0gaW52YWxpZGF0ZUluZGV4LCBsID0gaGFuZGxlckluZm9zLmxlbmd0
aDsgaSA8IGw7ICsraSkgeworICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3Nb
aV07CisgICAgICAgIGhhbmRsZXJJbmZvc1tpXSA9IGhhbmRsZXJJbmZvc1tpXS5nZXRVbnJlc29s
dmVkKCk7CisgICAgICB9CisgICAgfSwKKworICAgIGdldEhhbmRsZXJJbmZvRm9yRHluYW1pY1Nl
Z21lbnQ6IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyLCBuYW1lcywgb2JqZWN0cywgb2xkSGFuZGxl
ckluZm8sIHRhcmdldFJvdXRlTmFtZSwgaSkgeworCisgICAgICB2YXIgbnVtTmFtZXMgPSBuYW1l
cy5sZW5ndGg7CisgICAgICB2YXIgb2JqZWN0VG9Vc2U7CisgICAgICBpZiAob2JqZWN0cy5sZW5n
dGggPiAwKSB7CisKKyAgICAgICAgLy8gVXNlIHRoZSBvYmplY3RzIHByb3ZpZGVkIGZvciB0aGlz
IHRyYW5zaXRpb24uCisgICAgICAgIG9iamVjdFRvVXNlID0gb2JqZWN0c1tvYmplY3RzLmxlbmd0
aCAtIDFdOworICAgICAgICBpZiAoX3JvdXRlclV0aWxzLmlzUGFyYW0ob2JqZWN0VG9Vc2UpKSB7
CisgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5mbyhuYW1lLCBoYW5k
bGVyLCBuYW1lcywgb2JqZWN0cywgb2xkSGFuZGxlckluZm8pOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgIG9iamVjdHMucG9wKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAob2xk
SGFuZGxlckluZm8gJiYgb2xkSGFuZGxlckluZm8ubmFtZSA9PT0gbmFtZSkgeworICAgICAgICAv
LyBSZXVzZSB0aGUgbWF0Y2hpbmcgb2xkSGFuZGxlckluZm8KKyAgICAgICAgcmV0dXJuIG9sZEhh
bmRsZXJJbmZvOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRoaXMucHJlVHJhbnNpdGlv
blN0YXRlKSB7CisgICAgICAgICAgdmFyIHByZVRyYW5zaXRpb25IYW5kbGVySW5mbyA9IHRoaXMu
cHJlVHJhbnNpdGlvblN0YXRlLmhhbmRsZXJJbmZvc1tpXTsKKyAgICAgICAgICBvYmplY3RUb1Vz
ZSA9IHByZVRyYW5zaXRpb25IYW5kbGVySW5mbyAmJiBwcmVUcmFuc2l0aW9uSGFuZGxlckluZm8u
Y29udGV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJZGVhbGx5IHdlIHNob3Vs
ZCB0aHJvdyB0aGlzIGVycm9yIHRvIHByb3ZpZGUgbWF4aW1hbAorICAgICAgICAgIC8vIGluZm9y
bWF0aW9uIHRvIHRoZSB1c2VyIHRoYXQgbm90IGVub3VnaCBjb250ZXh0IG9iamVjdHMKKyAgICAg
ICAgICAvLyB3ZXJlIHByb3ZpZGVkLCBidXQgdGhpcyBwcm92ZXMgdG9vIGN1bWJlcnNvbWUgaW4g
RW1iZXIKKyAgICAgICAgICAvLyBpbiBjYXNlcyB3aGVyZSBpbm5lciB0ZW1wbGF0ZSBoZWxwZXJz
IGFyZSBldmFsdWF0ZWQKKyAgICAgICAgICAvLyBiZWZvcmUgcGFyZW50IGhlbHBlcnMgdW4tcmVu
ZGVyLCBpbiB3aGljaCBjYXNlcyB0aGlzCisgICAgICAgICAgLy8gZXJyb3Igc29tZXdoYXQgcHJl
bWF0dXJlbHkgZmlyZXMuCisgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoIk5vdCBlbm91Z2gg
Y29udGV4dCBvYmplY3RzIHdlcmUgcHJvdmlkZWQgdG8gY29tcGxldGUgYSB0cmFuc2l0aW9uIHRv
ICIgKyB0YXJnZXRSb3V0ZU5hbWUgKyAiLiBTcGVjaWZpY2FsbHksIHRoZSAiICsgbmFtZSArICIg
cm91dGUgbmVlZHMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgaW50byBpdHMgZHlu
YW1pYyBVUkwgc2VnbWVudHMgWyIgKyBuYW1lcy5qb2luKCcsICcpICsgIl0iKTsKKyAgICAgICAg
ICByZXR1cm4gb2xkSGFuZGxlckluZm87CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0
dXJuIF9yb3V0ZXJIYW5kbGVySW5mb0ZhY3RvcnkuZGVmYXVsdCgnb2JqZWN0JywgeworICAgICAg
ICBuYW1lOiBuYW1lLAorICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAorICAgICAgICBjb250ZXh0
OiBvYmplY3RUb1VzZSwKKyAgICAgICAgbmFtZXM6IG5hbWVzCisgICAgICB9KTsKKyAgICB9LAor
CisgICAgY3JlYXRlUGFyYW1IYW5kbGVySW5mbzogZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIsIG5h
bWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5mbykgeworICAgICAgdmFyIHBhcmFtcyA9IHt9Owor
CisgICAgICAvLyBTb2FrIHVwIGFsbCB0aGUgcHJvdmlkZWQgc3RyaW5nL251bWJlcnMKKyAgICAg
IHZhciBudW1OYW1lcyA9IG5hbWVzLmxlbmd0aDsKKyAgICAgIHdoaWxlIChudW1OYW1lcy0tKSB7
CisKKyAgICAgICAgLy8gT25seSB1c2Ugb2xkIHBhcmFtcyBpZiB0aGUgbmFtZXMgbWF0Y2ggd2l0
aCB0aGUgbmV3IGhhbmRsZXIKKyAgICAgICAgdmFyIG9sZFBhcmFtcyA9IG9sZEhhbmRsZXJJbmZv
ICYmIG5hbWUgPT09IG9sZEhhbmRsZXJJbmZvLm5hbWUgJiYgb2xkSGFuZGxlckluZm8ucGFyYW1z
IHx8IHt9OworCisgICAgICAgIHZhciBwZWVrID0gb2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFd
OworICAgICAgICB2YXIgcGFyYW1OYW1lID0gbmFtZXNbbnVtTmFtZXNdOworICAgICAgICBpZiAo
X3JvdXRlclV0aWxzLmlzUGFyYW0ocGVlaykpIHsKKyAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1l
XSA9ICIiICsgb2JqZWN0cy5wb3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBJ
ZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIG9ubHkgc29tZSBvZiB0aGUgcGFyYW1zCisgICAgICAg
ICAgLy8gd2VyZSBzdHJpbmcvbnVtYmVyIHBhcmFtcywgc28gdHJ5IGFuZCB1c2UgYSBwYXJhbQor
ICAgICAgICAgIC8vIHZhbHVlIGZyb20gYSBwcmV2aW91cyBoYW5kbGVyLgorICAgICAgICAgIGlm
IChvbGRQYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSkgeworICAgICAgICAgICAgcGFy
YW1zW3BhcmFtTmFtZV0gPSBvbGRQYXJhbXNbcGFyYW1OYW1lXTsKKyAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJZb3UgZGlkbid0IHByb3ZpZGUgZW5vdWdo
IHN0cmluZy9udW1lcmljIHBhcmFtZXRlcnMgdG8gc2F0aXNmeSBhbGwgb2YgdGhlIGR5bmFtaWMg
c2VnbWVudHMgZm9yIHJvdXRlICIgKyBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIF9yb3V0ZXJIYW5kbGVySW5mb0ZhY3RvcnkuZGVmYXVsdCgn
cGFyYW0nLCB7CisgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIs
CisgICAgICAgIHBhcmFtczogcGFyYW1zCisgICAgICB9KTsKKyAgICB9CisgIH0pOworfSk7Citl
bmlmZWQoJ3JvdXRlci90cmFuc2l0aW9uLWludGVudC91cmwtdHJhbnNpdGlvbi1pbnRlbnQnLCBb
J2V4cG9ydHMnLCAncm91dGVyL3RyYW5zaXRpb24taW50ZW50JywgJ3JvdXRlci90cmFuc2l0aW9u
LXN0YXRlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8vZmFjdG9yeScsICdyb3V0ZXIvdXRpbHMnLCAn
cm91dGVyL3VucmVjb2duaXplZC11cmwtZXJyb3InXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0
ZXJUcmFuc2l0aW9uSW50ZW50LCBfcm91dGVyVHJhbnNpdGlvblN0YXRlLCBfcm91dGVySGFuZGxl
ckluZm9GYWN0b3J5LCBfcm91dGVyVXRpbHMsIF9yb3V0ZXJVbnJlY29nbml6ZWRVcmxFcnJvcikg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gX3JvdXRlclV0aWxzLnN1
YmNsYXNzKF9yb3V0ZXJUcmFuc2l0aW9uSW50ZW50LmRlZmF1bHQsIHsKKyAgICB1cmw6IG51bGws
CisKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAocHJvcHMpIHsKKyAgICAgIHRoaXMudXJsID0g
cHJvcHMudXJsOworICAgIH0sCisKKyAgICBhcHBseVRvU3RhdGU6IGZ1bmN0aW9uIChvbGRTdGF0
ZSwgcmVjb2duaXplciwgZ2V0SGFuZGxlcikgeworICAgICAgdmFyIG5ld1N0YXRlID0gbmV3IF9y
b3V0ZXJUcmFuc2l0aW9uU3RhdGUuZGVmYXVsdCgpOworCisgICAgICB2YXIgcmVzdWx0cyA9IHJl
Y29nbml6ZXIucmVjb2duaXplKHRoaXMudXJsKSwKKyAgICAgICAgICBxdWVyeVBhcmFtcyA9IHt9
LAorICAgICAgICAgIGksCisgICAgICAgICAgbGVuOworCisgICAgICBpZiAoIXJlc3VsdHMpIHsK
KyAgICAgICAgdGhyb3cgbmV3IF9yb3V0ZXJVbnJlY29nbml6ZWRVcmxFcnJvci5kZWZhdWx0KHRo
aXMudXJsKTsKKyAgICAgIH0KKworICAgICAgdmFyIHN0YXRlc0RpZmZlciA9IGZhbHNlOworCisg
ICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7Cisg
ICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzW2ldOworICAgICAgICB2YXIgbmFtZSA9IHJlc3Vs
dC5oYW5kbGVyOworICAgICAgICB2YXIgaGFuZGxlciA9IGdldEhhbmRsZXIobmFtZSk7CisKKyAg
ICAgICAgaWYgKGhhbmRsZXIuaW5hY2Nlc3NpYmxlQnlVUkwpIHsKKyAgICAgICAgICB0aHJvdyBu
ZXcgX3JvdXRlclVucmVjb2duaXplZFVybEVycm9yLmRlZmF1bHQodGhpcy51cmwpOworICAgICAg
ICB9CisKKyAgICAgICAgdmFyIG5ld0hhbmRsZXJJbmZvID0gX3JvdXRlckhhbmRsZXJJbmZvRmFj
dG9yeS5kZWZhdWx0KCdwYXJhbScsIHsKKyAgICAgICAgICBuYW1lOiBuYW1lLAorICAgICAgICAg
IGhhbmRsZXI6IGhhbmRsZXIsCisgICAgICAgICAgcGFyYW1zOiByZXN1bHQucGFyYW1zCisgICAg
ICAgIH0pOworCisgICAgICAgIHZhciBvbGRIYW5kbGVySW5mbyA9IG9sZFN0YXRlLmhhbmRsZXJJ
bmZvc1tpXTsKKyAgICAgICAgaWYgKHN0YXRlc0RpZmZlciB8fCBuZXdIYW5kbGVySW5mby5zaG91
bGRTdXBlcmNlZGUob2xkSGFuZGxlckluZm8pKSB7CisgICAgICAgICAgc3RhdGVzRGlmZmVyID0g
dHJ1ZTsKKyAgICAgICAgICBuZXdTdGF0ZS5oYW5kbGVySW5mb3NbaV0gPSBuZXdIYW5kbGVySW5m
bzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXdTdGF0ZS5oYW5kbGVySW5mb3NbaV0g
PSBvbGRIYW5kbGVySW5mbzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBfcm91dGVyVXRp
bHMubWVyZ2UobmV3U3RhdGUucXVlcnlQYXJhbXMsIHJlc3VsdHMucXVlcnlQYXJhbXMpOworCisg
ICAgICByZXR1cm4gbmV3U3RhdGU7CisgICAgfQorICB9KTsKK30pOworZW5pZmVkKCdyb3V0ZXIv
dHJhbnNpdGlvbi1zdGF0ZScsIFsnZXhwb3J0cycsICdyb3V0ZXIvaGFuZGxlci1pbmZvJywgJ3Jv
dXRlci91dGlscycsICdyc3ZwL3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yb3V0ZXJI
YW5kbGVySW5mbywgX3JvdXRlclV0aWxzLCBfcnN2cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGZ1bmN0aW9uIFRyYW5zaXRpb25TdGF0ZShvdGhlcikgeworICAgIHRoaXMuaGFuZGxl
ckluZm9zID0gW107CisgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9OworICAgIHRoaXMucGFyYW1z
ID0ge307CisgIH0KKworICBUcmFuc2l0aW9uU3RhdGUucHJvdG90eXBlID0geworICAgIGhhbmRs
ZXJJbmZvczogbnVsbCwKKyAgICBxdWVyeVBhcmFtczogbnVsbCwKKyAgICBwYXJhbXM6IG51bGws
CisKKyAgICBwcm9taXNlTGFiZWw6IGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgdmFyIHRhcmdl
dE5hbWUgPSAnJzsKKyAgICAgIF9yb3V0ZXJVdGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlckluZm9z
LCBmdW5jdGlvbiAoaGFuZGxlckluZm8pIHsKKyAgICAgICAgaWYgKHRhcmdldE5hbWUgIT09ICcn
KSB7CisgICAgICAgICAgdGFyZ2V0TmFtZSArPSAnLic7CisgICAgICAgIH0KKyAgICAgICAgdGFy
Z2V0TmFtZSArPSBoYW5kbGVySW5mby5uYW1lOworICAgICAgfSk7CisgICAgICByZXR1cm4gX3Jv
dXRlclV0aWxzLnByb21pc2VMYWJlbCgiJyIgKyB0YXJnZXROYW1lICsgIic6ICIgKyBsYWJlbCk7
CisgICAgfSwKKworICAgIHJlc29sdmU6IGZ1bmN0aW9uIChzaG91bGRDb250aW51ZSwgcGF5bG9h
ZCkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgLy8gRmlyc3QsIGNhbGN1bGF0ZSBw
YXJhbXMgZm9yIHRoaXMgc3RhdGUuIFRoaXMgaXMgdXNlZnVsCisgICAgICAvLyBpbmZvcm1hdGlv
biB0byBwcm92aWRlIHRvIHRoZSB2YXJpb3VzIHJvdXRlIGhvb2tzLgorICAgICAgdmFyIHBhcmFt
cyA9IHRoaXMucGFyYW1zOworICAgICAgX3JvdXRlclV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVy
SW5mb3MsIGZ1bmN0aW9uIChoYW5kbGVySW5mbykgeworICAgICAgICBwYXJhbXNbaGFuZGxlcklu
Zm8ubmFtZV0gPSBoYW5kbGVySW5mby5wYXJhbXMgfHwge307CisgICAgICB9KTsKKworICAgICAg
cGF5bG9hZCA9IHBheWxvYWQgfHwge307CisgICAgICBwYXlsb2FkLnJlc29sdmVJbmRleCA9IDA7
CisKKyAgICAgIHZhciBjdXJyZW50U3RhdGUgPSB0aGlzOworICAgICAgdmFyIHdhc0Fib3J0ZWQg
PSBmYWxzZTsKKworICAgICAgLy8gVGhlIHByZWx1ZGUgUlNWUC5yZXNvbHZlKCkgYXN5bmNzIHVz
IGludG8gdGhlIHByb21pc2UgbGFuZC4KKyAgICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVmYXVs
dC5yZXNvbHZlKG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJTdGFydCB0cmFuc2l0aW9uIikpLnRo
ZW4ocmVzb2x2ZU9uZUhhbmRsZXJJbmZvLCBudWxsLCB0aGlzLnByb21pc2VMYWJlbCgnUmVzb2x2
ZSBoYW5kbGVyJykpWydjYXRjaCddKGhhbmRsZUVycm9yLCB0aGlzLnByb21pc2VMYWJlbCgnSGFu
ZGxlIGVycm9yJykpOworCisgICAgICBmdW5jdGlvbiBpbm5lclNob3VsZENvbnRpbnVlKCkgewor
ICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVzb2x2ZShzaG91bGRDb250aW51
ZSgpLCBjdXJyZW50U3RhdGUucHJvbWlzZUxhYmVsKCJDaGVjayBpZiBzaG91bGQgY29udGludWUi
KSlbJ2NhdGNoJ10oZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAgIC8vIFdlIGRpc3Rpbmd1
aXNoIGJldHdlZW4gZXJyb3JzIHRoYXQgb2NjdXJyZWQKKyAgICAgICAgICAvLyBkdXJpbmcgcmVz
b2x1dGlvbiAoZS5nLiBiZWZvcmVNb2RlbC9tb2RlbC9hZnRlck1vZGVsKSwKKyAgICAgICAgICAv
LyBhbmQgYWJvcnRzIGR1ZSB0byBhIHJlamVjdGluZyBwcm9taXNlIGZyb20gc2hvdWxkQ29udGlu
dWUoKS4KKyAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gX3Jz
dnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KHJlYXNvbik7CisgICAgICAgIH0sIGN1cnJlbnRTdGF0
ZS5wcm9taXNlTGFiZWwoIkhhbmRsZSBhYm9ydCIpKTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rp
b24gaGFuZGxlRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwb3Nz
aWJsZQorICAgICAgICAvLyByZWplY3QgdmFsdWUgb2YgVHJhbnNpdGlvblN0YXRlI3Jlc29sdmUK
KyAgICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IGN1cnJlbnRTdGF0ZS5oYW5kbGVySW5mb3M7Cisg
ICAgICAgIHZhciBlcnJvckhhbmRsZXJJbmRleCA9IHBheWxvYWQucmVzb2x2ZUluZGV4ID49IGhh
bmRsZXJJbmZvcy5sZW5ndGggPyBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMSA6IHBheWxvYWQucmVz
b2x2ZUluZGV4OworICAgICAgICByZXR1cm4gX3JzdnBQcm9taXNlLmRlZmF1bHQucmVqZWN0KHsK
KyAgICAgICAgICBlcnJvcjogZXJyb3IsCisgICAgICAgICAgaGFuZGxlcldpdGhFcnJvcjogY3Vy
cmVudFN0YXRlLmhhbmRsZXJJbmZvc1tlcnJvckhhbmRsZXJJbmRleF0uaGFuZGxlciwKKyAgICAg
ICAgICB3YXNBYm9ydGVkOiB3YXNBYm9ydGVkLAorICAgICAgICAgIHN0YXRlOiBjdXJyZW50U3Rh
dGUKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHByb2NlZWQocmVzb2x2
ZWRIYW5kbGVySW5mbykgeworICAgICAgICB2YXIgd2FzQWxyZWFkeVJlc29sdmVkID0gY3VycmVu
dFN0YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleF0uaXNSZXNvbHZlZDsKKwor
ICAgICAgICAvLyBTd2FwIHRoZSBwcmV2aW91c2x5IHVucmVzb2x2ZWQgaGFuZGxlckluZm8gd2l0
aAorICAgICAgICAvLyB0aGUgcmVzb2x2ZWQgaGFuZGxlckluZm8KKyAgICAgICAgY3VycmVudFN0
YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleCsrXSA9IHJlc29sdmVkSGFuZGxl
ckluZm87CisKKyAgICAgICAgaWYgKCF3YXNBbHJlYWR5UmVzb2x2ZWQpIHsKKyAgICAgICAgICAv
LyBDYWxsIHRoZSByZWRpcmVjdCBob29rLiBUaGUgcmVhc29uIHdlIGNhbGwgaXQgaGVyZQorICAg
ICAgICAgIC8vIHZzLiBhZnRlck1vZGVsIGlzIHNvIHRoYXQgcmVkaXJlY3RzIGludG8gY2hpbGQK
KyAgICAgICAgICAvLyByb3V0ZXMgZG9uJ3QgcmUtcnVuIHRoZSBtb2RlbCBob29rcyBmb3IgdGhp
cworICAgICAgICAgIC8vIGFscmVhZHktcmVzb2x2ZWQgcm91dGUuCisgICAgICAgICAgdmFyIGhh
bmRsZXIgPSByZXNvbHZlZEhhbmRsZXJJbmZvLmhhbmRsZXI7CisgICAgICAgICAgX3JvdXRlclV0
aWxzLmNhbGxIb29rKGhhbmRsZXIsICdyZWRpcmVjdCcsIHJlc29sdmVkSGFuZGxlckluZm8uY29u
dGV4dCwgcGF5bG9hZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIGFmdGVyIGVu
c3VyaW5nIHRoYXQgdGhlIHJlZGlyZWN0IGhvb2sKKyAgICAgICAgLy8gZGlkbid0IGFib3J0IHRo
aXMgdHJhbnNpdGlvbiBieSB0cmFuc2l0aW9uaW5nIGVsc2V3aGVyZS4KKyAgICAgICAgcmV0dXJu
IGlubmVyU2hvdWxkQ29udGludWUoKS50aGVuKHJlc29sdmVPbmVIYW5kbGVySW5mbywgbnVsbCwg
Y3VycmVudFN0YXRlLnByb21pc2VMYWJlbCgnUmVzb2x2ZSBoYW5kbGVyJykpOworICAgICAgfQor
CisgICAgICBmdW5jdGlvbiByZXNvbHZlT25lSGFuZGxlckluZm8oKSB7CisgICAgICAgIGlmIChw
YXlsb2FkLnJlc29sdmVJbmRleCA9PT0gY3VycmVudFN0YXRlLmhhbmRsZXJJbmZvcy5sZW5ndGgp
IHsKKyAgICAgICAgICAvLyBUaGlzIGlzIGlzIHRoZSBvbmx5IHBvc3NpYmxlCisgICAgICAgICAg
Ly8gZnVsZmlsbCB2YWx1ZSBvZiBUcmFuc2l0aW9uU3RhdGUjcmVzb2x2ZQorICAgICAgICAgIHJl
dHVybiB7CisgICAgICAgICAgICBlcnJvcjogbnVsbCwKKyAgICAgICAgICAgIHN0YXRlOiBjdXJy
ZW50U3RhdGUKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXJJ
bmZvID0gY3VycmVudFN0YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleF07CisK
KyAgICAgICAgcmV0dXJuIGhhbmRsZXJJbmZvLnJlc29sdmUoaW5uZXJTaG91bGRDb250aW51ZSwg
cGF5bG9hZCkudGhlbihwcm9jZWVkLCBudWxsLCBjdXJyZW50U3RhdGUucHJvbWlzZUxhYmVsKCdQ
cm9jZWVkJykpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBU
cmFuc2l0aW9uU3RhdGU7Cit9KTsKK2VuaWZlZCgncm91dGVyL3RyYW5zaXRpb24nLCBbJ2V4cG9y
dHMnLCAncnN2cC9wcm9taXNlJywgJ3JvdXRlci9oYW5kbGVyLWluZm8nLCAncm91dGVyL3V0aWxz
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yb3V0ZXJIYW5kbGVySW5mbywg
X3JvdXRlclV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvKioKKyAgICBBIFRyYW5zaXRp
b24gaXMgYSB0aGVubmFibGUgKGEgcHJvbWlzZS1saWtlIG9iamVjdCkgdGhhdCByZXByZXNlbnRz
CisgICAgYW4gYXR0ZW1wdCB0byB0cmFuc2l0aW9uIHRvIGFub3RoZXIgcm91dGUuIEl0IGNhbiBi
ZSBhYm9ydGVkLCBlaXRoZXIKKyAgICBleHBsaWNpdGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVt
cHRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxlIGEKKyAgICBwcmV2aW91cyBvbmUgaXMgc3Rp
bGwgdW5kZXJ3YXkuIEFuIGFib3J0ZWQgdHJhbnNpdGlvbiBjYW4gYWxzbworICAgIGJlIGByZXRy
eSgpYGQgbGF0ZXIuCisgIAorICAgIEBjbGFzcyBUcmFuc2l0aW9uCisgICAgQGNvbnN0cnVjdG9y
CisgICAgQHBhcmFtIHtPYmplY3R9IHJvdXRlcgorICAgIEBwYXJhbSB7T2JqZWN0fSBpbnRlbnQK
KyAgICBAcGFyYW0ge09iamVjdH0gc3RhdGUKKyAgICBAcGFyYW0ge09iamVjdH0gZXJyb3IKKyAg
ICBAcHJpdmF0ZQorICAgKi8KKyAgZnVuY3Rpb24gVHJhbnNpdGlvbihyb3V0ZXIsIGludGVudCwg
c3RhdGUsIGVycm9yKSB7CisgICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzOworICAgIHRoaXMuc3Rh
dGUgPSBzdGF0ZSB8fCByb3V0ZXIuc3RhdGU7CisgICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7Cisg
ICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXI7CisgICAgdGhpcy5kYXRhID0gdGhpcy5pbnRlbnQgJiYg
dGhpcy5pbnRlbnQuZGF0YSB8fCB7fTsKKyAgICB0aGlzLnJlc29sdmVkTW9kZWxzID0ge307Cisg
ICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9OworCisgICAgaWYgKGVycm9yKSB7CisgICAgICB0aGlz
LnByb21pc2UgPSBfcnN2cFByb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpOworICAgICAgdGhp
cy5lcnJvciA9IGVycm9yOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZSkg
eworICAgICAgdGhpcy5wYXJhbXMgPSBzdGF0ZS5wYXJhbXM7CisgICAgICB0aGlzLnF1ZXJ5UGFy
YW1zID0gc3RhdGUucXVlcnlQYXJhbXM7CisgICAgICB0aGlzLmhhbmRsZXJJbmZvcyA9IHN0YXRl
LmhhbmRsZXJJbmZvczsKKworICAgICAgdmFyIGxlbiA9IHN0YXRlLmhhbmRsZXJJbmZvcy5sZW5n
dGg7CisgICAgICBpZiAobGVuKSB7CisgICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHN0YXRlLmhh
bmRsZXJJbmZvc1tsZW4gLSAxXS5uYW1lOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHN0YXRlLmhhbmRs
ZXJJbmZvc1tpXTsKKworICAgICAgICAvLyBUT0RPOiB0aGlzIGFsbCBzZWVtcyBoYWNreQorICAg
ICAgICBpZiAoIWhhbmRsZXJJbmZvLmlzUmVzb2x2ZWQpIHsKKyAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICB0aGlzLnBpdm90SGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7
CisgICAgICB9CisKKyAgICAgIHRoaXMuc2VxdWVuY2UgPSBUcmFuc2l0aW9uLmN1cnJlbnRTZXF1
ZW5jZSsrOworICAgICAgdGhpcy5wcm9taXNlID0gc3RhdGUucmVzb2x2ZShjaGVja0ZvckFib3J0
LCB0aGlzKVsnY2F0Y2gnXShmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQu
d2FzQWJvcnRlZCB8fCB0cmFuc2l0aW9uLmlzQWJvcnRlZCkgeworICAgICAgICAgIHJldHVybiBf
cnN2cFByb21pc2UuZGVmYXVsdC5yZWplY3QobG9nQWJvcnQodHJhbnNpdGlvbikpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zaXRpb24udHJpZ2dlcignZXJyb3InLCByZXN1bHQu
ZXJyb3IsIHRyYW5zaXRpb24sIHJlc3VsdC5oYW5kbGVyV2l0aEVycm9yKTsKKyAgICAgICAgICB0
cmFuc2l0aW9uLmFib3J0KCk7CisgICAgICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0
LnJlamVjdChyZXN1bHQuZXJyb3IpOworICAgICAgICB9CisgICAgICB9LCBfcm91dGVyVXRpbHMu
cHJvbWlzZUxhYmVsKCdIYW5kbGUgQWJvcnQnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMu
cHJvbWlzZSA9IF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGhpcy5zdGF0ZSk7CisgICAg
ICB0aGlzLnBhcmFtcyA9IHt9OworICAgIH0KKworICAgIGZ1bmN0aW9uIGNoZWNrRm9yQWJvcnQo
KSB7CisgICAgICBpZiAodHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIF9y
c3ZwUHJvbWlzZS5kZWZhdWx0LnJlamVjdCh1bmRlZmluZWQsIF9yb3V0ZXJVdGlscy5wcm9taXNl
TGFiZWwoIlRyYW5zaXRpb24gYWJvcnRlZCAtIHJlamVjdCIpKTsKKyAgICAgIH0KKyAgICB9Cisg
IH0KKworICBUcmFuc2l0aW9uLmN1cnJlbnRTZXF1ZW5jZSA9IDA7CisKKyAgVHJhbnNpdGlvbi5w
cm90b3R5cGUgPSB7CisgICAgdGFyZ2V0TmFtZTogbnVsbCwKKyAgICB1cmxNZXRob2Q6ICd1cGRh
dGUnLAorICAgIGludGVudDogbnVsbCwKKyAgICBwYXJhbXM6IG51bGwsCisgICAgcGl2b3RIYW5k
bGVyOiBudWxsLAorICAgIHJlc29sdmVJbmRleDogMCwKKyAgICBoYW5kbGVySW5mb3M6IG51bGws
CisgICAgcmVzb2x2ZWRNb2RlbHM6IG51bGwsCisgICAgaXNBY3RpdmU6IHRydWUsCisgICAgc3Rh
dGU6IG51bGwsCisgICAgcXVlcnlQYXJhbXNPbmx5OiBmYWxzZSwKKworICAgIGlzVHJhbnNpdGlv
bjogdHJ1ZSwKKworICAgIGlzRXhpdGluZzogZnVuY3Rpb24gKGhhbmRsZXIpIHsKKyAgICAgIHZh
ciBoYW5kbGVySW5mb3MgPSB0aGlzLmhhbmRsZXJJbmZvczsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCBsZW4gPSBoYW5kbGVySW5mb3MubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgdmFy
IGhhbmRsZXJJbmZvID0gaGFuZGxlckluZm9zW2ldOworICAgICAgICBpZiAoaGFuZGxlckluZm8u
bmFtZSA9PT0gaGFuZGxlciB8fCBoYW5kbGVySW5mby5oYW5kbGVyID09PSBoYW5kbGVyKSB7Cisg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUaGUgVHJhbnNpdGlvbidzIGludGVybmFs
IHByb21pc2UuIENhbGxpbmcgYC50aGVuYCBvbiB0aGlzIHByb3BlcnR5CisgICAgICBpcyB0aGF0
IHNhbWUgYXMgY2FsbGluZyBgLnRoZW5gIG9uIHRoZSBUcmFuc2l0aW9uIG9iamVjdCBpdHNlbGYs
IGJ1dAorICAgICAgdGhpcyBwcm9wZXJ0eSBpcyBleHBvc2VkIGZvciB3aGVuIHlvdSB3YW50IHRv
IHBhc3MgYXJvdW5kIGEKKyAgICAgIFRyYW5zaXRpb24ncyBwcm9taXNlLCBidXQgbm90IHRoZSBU
cmFuc2l0aW9uIG9iamVjdCBpdHNlbGYsIHNpbmNlCisgICAgICBUcmFuc2l0aW9uIG9iamVjdCBj
YW4gYmUgZXh0ZXJuYWxseSBgYWJvcnRgZWQsIHdoaWxlIHRoZSBwcm9taXNlCisgICAgICBjYW5u
b3QuCisgICAgICAgQHByb3BlcnR5IHByb21pc2UKKyAgICAgIEB0eXBlIHtPYmplY3R9CisgICAg
ICBAcHVibGljCisgICAgICovCisgICAgcHJvbWlzZTogbnVsbCwKKworICAgIC8qKgorICAgICAg
Q3VzdG9tIHN0YXRlIGNhbiBiZSBzdG9yZWQgb24gYSBUcmFuc2l0aW9uJ3MgYGRhdGFgIG9iamVj
dC4KKyAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVjb3JhdGluZyBhIFRyYW5zaXRpb24g
d2l0aGluIGFuIGVhcmxpZXIKKyAgICAgIGhvb2sgYW5kIHNoYXJlZCB3aXRoIGEgbGF0ZXIgaG9v
ay4gUHJvcGVydGllcyBzZXQgb24gYGRhdGFgIHdpbGwKKyAgICAgIGJlIGNvcGllZCB0byBuZXcg
dHJhbnNpdGlvbnMgZ2VuZXJhdGVkIGJ5IGNhbGxpbmcgYHJldHJ5YCBvbiB0aGlzCisgICAgICB0
cmFuc2l0aW9uLgorICAgICAKKyAgICAgIEBwcm9wZXJ0eSBkYXRhCisgICAgICBAdHlwZSB7T2Jq
ZWN0fQorICAgICAgQHB1YmxpYworICAgICAqLworICAgIGRhdGE6IG51bGwsCisKKyAgICAvKioK
KyAgICAgIEEgc3RhbmRhcmQgcHJvbWlzZSBob29rIHRoYXQgcmVzb2x2ZXMgaWYgdGhlIHRyYW5z
aXRpb24KKyAgICAgIHN1Y2NlZWRzIGFuZCByZWplY3RzIGlmIGl0IGZhaWxzL3JlZGlyZWN0cy9h
Ym9ydHMuCisgICAgICAgRm9yd2FyZHMgdG8gdGhlIGludGVybmFsIGBwcm9taXNlYCBwcm9wZXJ0
eSB3aGljaCB5b3UgY2FuCisgICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0
byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKKyAgICAgIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24g
aXRzZWxmLgorICAgICAgIEBtZXRob2QgdGhlbgorICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25G
dWxmaWxsZWQKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWQKKyAgICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNl
LgorICAgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAg
ICAgIEBwdWJsaWMKKyAgICAgKi8KKyAgICB0aGVuOiBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9u
UmVqZWN0ZWQsIGxhYmVsKSB7CisgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25GdWxm
aWxsZWQsIG9uUmVqZWN0ZWQsIGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgRm9y
d2FyZHMgdG8gdGhlIGludGVybmFsIGBwcm9taXNlYCBwcm9wZXJ0eSB3aGljaCB5b3UgY2FuCisg
ICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRo
ZW5uYWJsZSwKKyAgICAgIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24gaXRzZWxmLgorICAgICAgIEBt
ZXRob2QgY2F0Y2gKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCisgICAgICBA
cGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJv
bWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAgIEByZXR1cm4ge1Byb21pc2V9
CisgICAgICBAcHVibGljCisgICAgICovCisgICAgY2F0Y2g6IGZ1bmN0aW9uIChvblJlamVjdGlv
biwgbGFiZWwpIHsKKyAgICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2gob25SZWplY3Rpb24s
IGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgRm9yd2FyZHMgdG8gdGhlIGludGVy
bmFsIGBwcm9taXNlYCBwcm9wZXJ0eSB3aGljaCB5b3UgY2FuCisgICAgICB1c2UgaW4gc2l0dWF0
aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRoZW5uYWJsZSwKKyAgICAgIGJ1
dCBub3QgdGhlIFRyYW5zaXRpb24gaXRzZWxmLgorICAgICAgIEBtZXRob2QgZmluYWxseQorICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJl
bCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAgICAgVXNlZnVs
IGZvciB0b29saW5nLgorICAgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgICAgIEBwdWJsaWMKKyAg
ICAgKi8KKyAgICBmaW5hbGx5OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGxhYmVsKSB7CisgICAgICBy
ZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoY2FsbGJhY2ssIGxhYmVsKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBBYm9ydHMgdGhlIFRyYW5zaXRpb24uIE5vdGUgeW91IGNhbiBhbHNvIGlt
cGxpY2l0bHkgYWJvcnQgYSB0cmFuc2l0aW9uCisgICAgICBieSBpbml0aWF0aW5nIGFub3RoZXIg
dHJhbnNpdGlvbiB3aGlsZSBhIHByZXZpb3VzIG9uZSBpcyB1bmRlcndheS4KKyAgICAgICBAbWV0
aG9kIGFib3J0CisgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KKyAg
ICAgIEBwdWJsaWMKKyAgICAgKi8KKyAgICBhYm9ydDogZnVuY3Rpb24gKCkgeworICAgICAgaWYg
KHRoaXMuaXNBYm9ydGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAg
X3JvdXRlclV0aWxzLmxvZyh0aGlzLnJvdXRlciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJnZXRO
YW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJvcnRlZCIpOworICAgICAgdGhpcy5pbnRlbnQucHJl
VHJhbnNpdGlvblN0YXRlID0gdGhpcy5yb3V0ZXIuc3RhdGU7CisgICAgICB0aGlzLmlzQWJvcnRl
ZCA9IHRydWU7CisgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7CisgICAgICB0aGlzLnJvdXRl
ci5hY3RpdmVUcmFuc2l0aW9uID0gbnVsbDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisK
KyAgICAvKioKKyAgICAgICBSZXRyaWVzIGEgcHJldmlvdXNseS1hYm9ydGVkIHRyYW5zaXRpb24g
KG1ha2luZyBzdXJlIHRvIGFib3J0IHRoZQorICAgICAgdHJhbnNpdGlvbiBpZiBpdCdzIHN0aWxs
IGFjdGl2ZSkuIFJldHVybnMgYSBuZXcgdHJhbnNpdGlvbiB0aGF0CisgICAgICByZXByZXNlbnRz
IHRoZSBuZXcgYXR0ZW1wdCB0byB0cmFuc2l0aW9uLgorICAgICAgIEBtZXRob2QgcmV0cnkKKyAg
ICAgIEByZXR1cm4ge1RyYW5zaXRpb259IG5ldyB0cmFuc2l0aW9uCisgICAgICBAcHVibGljCisg
ICAgICovCisgICAgcmV0cnk6IGZ1bmN0aW9uICgpIHsKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0
cyBmb3IgbWVyZ2VkIHN0YXRlIHJldHJ5KClzCisgICAgICB0aGlzLmFib3J0KCk7CisgICAgICBy
ZXR1cm4gdGhpcy5yb3V0ZXIudHJhbnNpdGlvbkJ5SW50ZW50KHRoaXMuaW50ZW50LCBmYWxzZSk7
CisgICAgfSwKKworICAgIC8qKgorICAgICAgIFNldHMgdGhlIFVSTC1jaGFuZ2luZyBtZXRob2Qg
dG8gYmUgZW1wbG95ZWQgYXQgdGhlIGVuZCBvZiBhCisgICAgICBzdWNjZXNzZnVsIHRyYW5zaXRp
b24uIEJ5IGRlZmF1bHQsIGEgbmV3IFRyYW5zaXRpb24gd2lsbCBqdXN0CisgICAgICB1c2UgYHVw
ZGF0ZVVSTGAsIGJ1dCBwYXNzaW5nICdyZXBsYWNlJyB0byB0aGlzIG1ldGhvZCB3aWxsCisgICAg
ICBjYXVzZSB0aGUgVVJMIHRvIHVwZGF0ZSB1c2luZyAncmVwbGFjZVdpdGgnIGluc3RlYWQuIE9t
aXR0aW5nCisgICAgICBhIHBhcmFtZXRlciB3aWxsIGRpc2FibGUgdGhlIFVSTCBjaGFuZ2UsIGFs
bG93aW5nIGZvciB0cmFuc2l0aW9ucworICAgICAgdGhhdCBkb24ndCB1cGRhdGUgdGhlIFVSTCBh
dCBjb21wbGV0aW9uICh0aGlzIGlzIGFsc28gdXNlZCBmb3IKKyAgICAgIGhhbmRsZVVSTCwgc2lu
Y2UgdGhlIFVSTCBoYXMgYWxyZWFkeSBjaGFuZ2VkIGJlZm9yZSB0aGUKKyAgICAgIHRyYW5zaXRp
b24gdG9vayBwbGFjZSkuCisgICAgICAgQG1ldGhvZCBtZXRob2QKKyAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBtZXRob2QgdGhlIHR5cGUgb2YgVVJMLWNoYW5naW5nIG1ldGhvZCB0byB1c2UKKyAgICAg
ICAgYXQgdGhlIGVuZCBvZiBhIHRyYW5zaXRpb24uIEFjY2VwdGVkIHZhbHVlcyBhcmUgJ3JlcGxh
Y2UnLAorICAgICAgICBmYWxzeSB2YWx1ZXMsIG9yIGFueSBvdGhlciBub24tZmFsc3kgdmFsdWUg
KHdoaWNoIGlzCisgICAgICAgIGludGVycHJldGVkIGFzIGFuIHVwZGF0ZVVSTCB0cmFuc2l0aW9u
KS4KKyAgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KKyAgICAgIEBw
dWJsaWMKKyAgICAgKi8KKyAgICBtZXRob2Q6IGZ1bmN0aW9uIChtZXRob2QpIHsKKyAgICAgIHRo
aXMudXJsTWV0aG9kID0gbWV0aG9kOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAg
IC8qKgorICAgICAgIEZpcmVzIGFuIGV2ZW50IG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb2x2
ZWQvcmVzb2x2aW5nCisgICAgICBoYW5kbGVycyB3aXRoaW4gdGhpcyB0cmFuc2l0aW9uLiBVc2Vm
dWwgZm9yIGZpcmluZyBldmVudHMKKyAgICAgIG9uIHJvdXRlIGhpZXJhcmNoaWVzIHRoYXQgaGF2
ZW4ndCBmdWxseSBiZWVuIGVudGVyZWQgeWV0LgorICAgICAgIE5vdGU6IFRoaXMgbWV0aG9kIGlz
IGFsc28gYWxpYXNlZCBhcyBgc2VuZGAKKyAgICAgICBAbWV0aG9kIHRyaWdnZXIKKyAgICAgIEBw
YXJhbSB7Qm9vbGVhbn0gW2lnbm9yZUZhaWx1cmU9ZmFsc2VdIGEgYm9vbGVhbiBzcGVjaWZ5aW5n
IHdoZXRoZXIgdW5oYW5kbGVkIGV2ZW50cyB0aHJvdyBhbiBlcnJvcgorICAgICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKKyAgICAgIEBwdWJsaWMK
KyAgICAgKi8KKyAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoaWdub3JlRmFpbHVyZSkgeworICAgICAg
dmFyIGFyZ3MgPSBfcm91dGVyVXRpbHMuc2xpY2UuY2FsbChhcmd1bWVudHMpOworICAgICAgaWYg
KHR5cGVvZiBpZ25vcmVGYWlsdXJlID09PSAnYm9vbGVhbicpIHsKKyAgICAgICAgYXJncy5zaGlm
dCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhyb3cgZXJyb3JzIG9uIHVuaGFuZGxl
ZCB0cmlnZ2VyIGV2ZW50cyBieSBkZWZhdWx0CisgICAgICAgIGlnbm9yZUZhaWx1cmUgPSBmYWxz
ZTsKKyAgICAgIH0KKyAgICAgIF9yb3V0ZXJVdGlscy50cmlnZ2VyKHRoaXMucm91dGVyLCB0aGlz
LnN0YXRlLmhhbmRsZXJJbmZvcy5zbGljZSgwLCB0aGlzLnJlc29sdmVJbmRleCArIDEpLCBpZ25v
cmVGYWlsdXJlLCBhcmdzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBUcmFuc2l0aW9ucyBh
cmUgYWJvcnRlZCBhbmQgdGhlaXIgcHJvbWlzZXMgcmVqZWN0ZWQKKyAgICAgIHdoZW4gcmVkaXJl
Y3RzIG9jY3VyOyB0aGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZQorICAgICAgdGhhdCB3aWxs
IGZvbGxvdyBhbnkgcmVkaXJlY3RzIHRoYXQgb2NjdXIgYW5kIGZ1bGZpbGwKKyAgICAgIHdpdGgg
dGhlIHZhbHVlIGZ1bGZpbGxlZCBieSBhbnkgcmVkaXJlY3RpbmcgdHJhbnNpdGlvbnMKKyAgICAg
IHRoYXQgb2NjdXIuCisgICAgICAgQG1ldGhvZCBmb2xsb3dSZWRpcmVjdHMKKyAgICAgIEByZXR1
cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHNhbWUKKyAgICAg
ICAgdmFsdWUgdGhhdCB0aGUgZmluYWwgcmVkaXJlY3RpbmcgdHJhbnNpdGlvbiBmdWxmaWxscyB3
aXRoCisgICAgICBAcHVibGljCisgICAgICovCisgICAgZm9sbG93UmVkaXJlY3RzOiBmdW5jdGlv
biAoKSB7CisgICAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CisgICAgICByZXR1cm4gdGhp
cy5wcm9taXNlWydjYXRjaCddKGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgaWYgKHJvdXRl
ci5hY3RpdmVUcmFuc2l0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIHJvdXRlci5hY3RpdmVUcmFu
c2l0aW9uLmZvbGxvd1JlZGlyZWN0cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcnN2
cFByb21pc2UuZGVmYXVsdC5yZWplY3QocmVhc29uKTsKKyAgICAgIH0pOworICAgIH0sCisKKyAg
ICB0b1N0cmluZzogZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuICJUcmFuc2l0aW9uIChzZXF1
ZW5jZSAiICsgdGhpcy5zZXF1ZW5jZSArICIpIjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBA
cHJpdmF0ZQorICAgICAqLworICAgIGxvZzogZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKyAgICAgIF9y
b3V0ZXJVdGlscy5sb2codGhpcy5yb3V0ZXIsIHRoaXMuc2VxdWVuY2UsIG1lc3NhZ2UpOworICAg
IH0KKyAgfTsKKworICAvLyBBbGlhcyAndHJpZ2dlcicgYXMgJ3NlbmQnCisgIFRyYW5zaXRpb24u
cHJvdG90eXBlLnNlbmQgPSBUcmFuc2l0aW9uLnByb3RvdHlwZS50cmlnZ2VyOworCisgIC8qKgor
ICAgIEBwcml2YXRlCisgIAorICAgIExvZ3MgYW5kIHJldHVybnMgYSBUcmFuc2l0aW9uQWJvcnRl
ZCBlcnJvci4KKyAgICovCisgIGZ1bmN0aW9uIGxvZ0Fib3J0KHRyYW5zaXRpb24pIHsKKyAgICBf
cm91dGVyVXRpbHMubG9nKHRyYW5zaXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAi
ZGV0ZWN0ZWQgYWJvcnQuIik7CisgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uQWJvcnRlZCgpOwor
ICB9CisKKyAgZnVuY3Rpb24gVHJhbnNpdGlvbkFib3J0ZWQobWVzc2FnZSkgeworICAgIHRoaXMu
bWVzc2FnZSA9IG1lc3NhZ2UgfHwgIlRyYW5zaXRpb25BYm9ydGVkIjsKKyAgICB0aGlzLm5hbWUg
PSAiVHJhbnNpdGlvbkFib3J0ZWQiOworICB9CisKKyAgZXhwb3J0cy5UcmFuc2l0aW9uID0gVHJh
bnNpdGlvbjsKKyAgZXhwb3J0cy5sb2dBYm9ydCA9IGxvZ0Fib3J0OworICBleHBvcnRzLlRyYW5z
aXRpb25BYm9ydGVkID0gVHJhbnNpdGlvbkFib3J0ZWQ7Cit9KTsKK2VuaWZlZCgicm91dGVyL3Vu
cmVjb2duaXplZC11cmwtZXJyb3IiLCBbImV4cG9ydHMiLCAicm91dGVyL3V0aWxzIl0sIGZ1bmN0
aW9uIChleHBvcnRzLCBfcm91dGVyVXRpbHMpIHsKKyAgInVzZSBzdHJpY3QiOworCisgIC8qKgor
ICAgIFByb21pc2UgcmVqZWN0IHJlYXNvbnMgcGFzc2VkIHRvIHByb21pc2UgcmVqZWN0aW9uCisg
ICAgaGFuZGxlcnMgZm9yIGZhaWxlZCB0cmFuc2l0aW9ucy4KKyAgICovCisgIGZ1bmN0aW9uIFVu
cmVjb2duaXplZFVSTEVycm9yKG1lc3NhZ2UpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdl
IHx8ICJVbnJlY29nbml6ZWRVUkxFcnJvciI7CisgICAgdGhpcy5uYW1lID0gIlVucmVjb2duaXpl
ZFVSTEVycm9yIjsKKyAgICBFcnJvci5jYWxsKHRoaXMpOworICB9CisKKyAgVW5yZWNvZ25pemVk
VVJMRXJyb3IucHJvdG90eXBlID0gX3JvdXRlclV0aWxzLm9DcmVhdGUoRXJyb3IucHJvdG90eXBl
KTsKKworICBleHBvcnRzLmRlZmF1bHQgPSBVbnJlY29nbml6ZWRVUkxFcnJvcjsKK30pOworZW5p
ZmVkKCdyb3V0ZXIvdXRpbHMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZXh0cmFjdFF1ZXJ5UGFyYW1zID0gZXh0cmFjdFF1
ZXJ5UGFyYW1zOworICBleHBvcnRzLmxvZyA9IGxvZzsKKyAgZXhwb3J0cy5iaW5kID0gYmluZDsK
KyAgZXhwb3J0cy5mb3JFYWNoID0gZm9yRWFjaDsKKyAgZXhwb3J0cy50cmlnZ2VyID0gdHJpZ2dl
cjsKKyAgZXhwb3J0cy5nZXRDaGFuZ2VsaXN0ID0gZ2V0Q2hhbmdlbGlzdDsKKyAgZXhwb3J0cy5w
cm9taXNlTGFiZWwgPSBwcm9taXNlTGFiZWw7CisgIGV4cG9ydHMuc3ViY2xhc3MgPSBzdWJjbGFz
czsKKyAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOworCisgIHZhciBfaXNBcnJh
eTsKKyAgaWYgKCFBcnJheS5pc0FycmF5KSB7CisgICAgX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkg
eworICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gIltv
YmplY3QgQXJyYXldIjsKKyAgICB9OworICB9IGVsc2UgeworICAgIF9pc0FycmF5ID0gQXJyYXku
aXNBcnJheTsKKyAgfQorCisgIHZhciBpc0FycmF5ID0gX2lzQXJyYXk7CisKKyAgZXhwb3J0cy5p
c0FycmF5ID0gaXNBcnJheTsKKyAgZnVuY3Rpb24gbWVyZ2UoaGFzaCwgb3RoZXIpIHsKKyAgICBm
b3IgKHZhciBwcm9wIGluIG90aGVyKSB7CisgICAgICBpZiAob3RoZXIuaGFzT3duUHJvcGVydHko
cHJvcCkpIHsKKyAgICAgICAgaGFzaFtwcm9wXSA9IG90aGVyW3Byb3BdOworICAgICAgfQorICAg
IH0KKyAgfQorCisgIHZhciBvQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJv
dG8pIHsKKyAgICBmdW5jdGlvbiBGKCkge30KKyAgICBGLnByb3RvdHlwZSA9IHByb3RvOworICAg
IHJldHVybiBuZXcgRigpOworICB9OworCisgIGV4cG9ydHMub0NyZWF0ZSA9IG9DcmVhdGU7Cisg
IC8qKgorICAgIEBwcml2YXRlCisgIAorICAgIEV4dHJhY3RzIHF1ZXJ5IHBhcmFtcyBmcm9tIHRo
ZSBlbmQgb2YgYW4gYXJyYXkKKyAgKiovCisKKyAgZnVuY3Rpb24gZXh0cmFjdFF1ZXJ5UGFyYW1z
KGFycmF5KSB7CisgICAgdmFyIGxlbiA9IGFycmF5ICYmIGFycmF5Lmxlbmd0aCwKKyAgICAgICAg
aGVhZCwKKyAgICAgICAgcXVlcnlQYXJhbXM7CisKKyAgICBpZiAobGVuICYmIGxlbiA+IDAgJiYg
YXJyYXlbbGVuIC0gMV0gJiYgYXJyYXlbbGVuIC0gMV0uaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFy
YW1zJykpIHsKKyAgICAgIHF1ZXJ5UGFyYW1zID0gYXJyYXlbbGVuIC0gMV0ucXVlcnlQYXJhbXM7
CisgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJheSwgMCwgbGVuIC0gMSk7CisgICAgICByZXR1
cm4gW2hlYWQsIHF1ZXJ5UGFyYW1zXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFthcnJh
eSwgbnVsbF07CisgICAgfQorICB9CisKKyAgLyoqCisgICAgQHByaXZhdGUKKyAgCisgICAgQ29l
cmNlcyBxdWVyeSBwYXJhbSBwcm9wZXJ0aWVzIGFuZCBhcnJheSBlbGVtZW50cyBpbnRvIHN0cmlu
Z3MuCisgICoqLworICBmdW5jdGlvbiBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nKHF1ZXJ5UGFy
YW1zKSB7CisgICAgZm9yICh2YXIga2V5IGluIHF1ZXJ5UGFyYW1zKSB7CisgICAgICBpZiAodHlw
ZW9mIHF1ZXJ5UGFyYW1zW2tleV0gPT09ICdudW1iZXInKSB7CisgICAgICAgIHF1ZXJ5UGFyYW1z
W2tleV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV07CisgICAgICB9IGVsc2UgaWYgKGlzQXJyYXko
cXVlcnlQYXJhbXNba2V5XSkpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBxdWVyeVBh
cmFtc1trZXldLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tl
eV1baV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV1baV07CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9CisgIH0KKyAgLyoqCisgICAgQHByaXZhdGUKKyAgICovCisKKyAgZnVuY3Rpb24gbG9nKHJv
dXRlciwgc2VxdWVuY2UsIG1zZykgeworICAgIGlmICghcm91dGVyLmxvZykgeworICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7CisgICAgICBy
b3V0ZXIubG9nKCJUcmFuc2l0aW9uICMiICsgc2VxdWVuY2UgKyAiOiAiICsgbXNnKTsKKyAgICB9
IGVsc2UgeworICAgICAgbXNnID0gc2VxdWVuY2U7CisgICAgICByb3V0ZXIubG9nKG1zZyk7Cisg
ICAgfQorICB9CisKKyAgZnVuY3Rpb24gYmluZChjb250ZXh0LCBmbikgeworICAgIHZhciBib3Vu
ZEFyZ3MgPSBhcmd1bWVudHM7CisgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAg
dmFyIGFyZ3MgPSBzbGljZS5jYWxsKGJvdW5kQXJncywgMik7CisgICAgICBhcmdzLnB1c2godmFs
dWUpOworICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOworICAgIH07CisgIH0K
KworICBmdW5jdGlvbiBpc1BhcmFtKG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0
ID09PSAic3RyaW5nIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIG9iamVj
dCA9PT0gIm51bWJlciIgfHwgb2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyOworICB9CisKKyAgZnVu
Y3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2spIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9
IGFycmF5Lmxlbmd0aDsgaSA8IGwgJiYgZmFsc2UgIT09IGNhbGxiYWNrKGFycmF5W2ldKTsgaSsr
KSB7fQorICB9CisKKyAgZnVuY3Rpb24gdHJpZ2dlcihyb3V0ZXIsIGhhbmRsZXJJbmZvcywgaWdu
b3JlRmFpbHVyZSwgYXJncykgeworICAgIGlmIChyb3V0ZXIudHJpZ2dlckV2ZW50KSB7CisgICAg
ICByb3V0ZXIudHJpZ2dlckV2ZW50KGhhbmRsZXJJbmZvcywgaWdub3JlRmFpbHVyZSwgYXJncyk7
CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7CisK
KyAgICBpZiAoIWhhbmRsZXJJbmZvcykgeworICAgICAgaWYgKGlnbm9yZUZhaWx1cmUpIHsKKyAg
ICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3Qg
dHJpZ2dlciBldmVudCAnIiArIG5hbWUgKyAiJy4gVGhlcmUgYXJlIG5vIGFjdGl2ZSBoYW5kbGVy
cyIpOworICAgIH0KKworICAgIHZhciBldmVudFdhc0hhbmRsZWQgPSBmYWxzZTsKKworICAgIGZv
ciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAg
IHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKKyAgICAgICAgICBoYW5kbGVyID0g
aGFuZGxlckluZm8uaGFuZGxlcjsKKworICAgICAgaWYgKGhhbmRsZXIuZXZlbnRzICYmIGhhbmRs
ZXIuZXZlbnRzW25hbWVdKSB7CisgICAgICAgIGlmIChoYW5kbGVyLmV2ZW50c1tuYW1lXS5hcHBs
eShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1ZSkgeworICAgICAgICAgIGV2ZW50V2FzSGFuZGxlZCA9
IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfQorCisgICAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYgIWlnbm9yZUZhaWx1
cmUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcigiTm90aGluZyBoYW5kbGVkIHRoZSBldmVudCAn
IiArIG5hbWUgKyAiJy4iKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZXRDaGFuZ2VsaXN0
KG9sZE9iamVjdCwgbmV3T2JqZWN0KSB7CisgICAgdmFyIGtleTsKKyAgICB2YXIgcmVzdWx0cyA9
IHsKKyAgICAgIGFsbDoge30sCisgICAgICBjaGFuZ2VkOiB7fSwKKyAgICAgIHJlbW92ZWQ6IHt9
CisgICAgfTsKKworICAgIG1lcmdlKHJlc3VsdHMuYWxsLCBuZXdPYmplY3QpOworCisgICAgdmFy
IGRpZENoYW5nZSA9IGZhbHNlOworICAgIGNvZXJjZVF1ZXJ5UGFyYW1zVG9TdHJpbmcob2xkT2Jq
ZWN0KTsKKyAgICBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nKG5ld09iamVjdCk7CisKKyAgICAv
LyBDYWxjdWxhdGUgcmVtb3ZhbHMKKyAgICBmb3IgKGtleSBpbiBvbGRPYmplY3QpIHsKKyAgICAg
IGlmIChvbGRPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICBpZiAoIW5ld09i
amVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTsK
KyAgICAgICAgICByZXN1bHRzLnJlbW92ZWRba2V5XSA9IG9sZE9iamVjdFtrZXldOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGNoYW5nZXMKKyAgICBmb3Ig
KGtleSBpbiBuZXdPYmplY3QpIHsKKyAgICAgIGlmIChuZXdPYmplY3QuaGFzT3duUHJvcGVydHko
a2V5KSkgeworICAgICAgICBpZiAoaXNBcnJheShvbGRPYmplY3Rba2V5XSkgJiYgaXNBcnJheShu
ZXdPYmplY3Rba2V5XSkpIHsKKyAgICAgICAgICBpZiAob2xkT2JqZWN0W2tleV0ubGVuZ3RoICE9
PSBuZXdPYmplY3Rba2V5XS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuY2hhbmdlZFtr
ZXldID0gbmV3T2JqZWN0W2tleV07CisgICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9sZE9iamVj
dFtrZXldLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgICBpZiAob2xkT2JqZWN0
W2tleV1baV0gIT09IG5ld09iamVjdFtrZXldW2ldKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0
cy5jaGFuZ2VkW2tleV0gPSBuZXdPYmplY3Rba2V5XTsKKyAgICAgICAgICAgICAgICBkaWRDaGFu
Z2UgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChvbGRPYmplY3Rba2V5XSAhPT0gbmV3T2Jq
ZWN0W2tleV0pIHsKKyAgICAgICAgICAgIHJlc3VsdHMuY2hhbmdlZFtrZXldID0gbmV3T2JqZWN0
W2tleV07CisgICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkaWRDaGFuZ2UgJiYgcmVzdWx0czsK
KyAgfQorCisgIGZ1bmN0aW9uIHByb21pc2VMYWJlbChsYWJlbCkgeworICAgIHJldHVybiAnUm91
dGVyOiAnICsgbGFiZWw7CisgIH0KKworICBmdW5jdGlvbiBzdWJjbGFzcyhwYXJlbnRDb25zdHJ1
Y3RvciwgcHJvdG8pIHsKKyAgICBmdW5jdGlvbiBDKHByb3BzKSB7CisgICAgICBwYXJlbnRDb25z
dHJ1Y3Rvci5jYWxsKHRoaXMsIHByb3BzIHx8IHt9KTsKKyAgICB9CisgICAgQy5wcm90b3R5cGUg
PSBvQ3JlYXRlKHBhcmVudENvbnN0cnVjdG9yLnByb3RvdHlwZSk7CisgICAgbWVyZ2UoQy5wcm90
b3R5cGUsIHByb3RvKTsKKyAgICByZXR1cm4gQzsKKyAgfQorCisgIGZ1bmN0aW9uIHJlc29sdmVI
b29rKG9iaiwgaG9va05hbWUpIHsKKyAgICBpZiAoIW9iaikgeworICAgICAgcmV0dXJuOworICAg
IH0KKyAgICB2YXIgdW5kZXJzY29yZWQgPSAiXyIgKyBob29rTmFtZTsKKyAgICByZXR1cm4gb2Jq
W3VuZGVyc2NvcmVkXSAmJiB1bmRlcnNjb3JlZCB8fCBvYmpbaG9va05hbWVdICYmIGhvb2tOYW1l
OworICB9CisKKyAgZnVuY3Rpb24gY2FsbEhvb2sob2JqLCBfaG9va05hbWUsIGFyZzEsIGFyZzIp
IHsKKyAgICB2YXIgaG9va05hbWUgPSByZXNvbHZlSG9vayhvYmosIF9ob29rTmFtZSk7CisgICAg
cmV0dXJuIGhvb2tOYW1lICYmIG9ialtob29rTmFtZV0uY2FsbChvYmosIGFyZzEsIGFyZzIpOwor
ICB9CisKKyAgZnVuY3Rpb24gYXBwbHlIb29rKG9iaiwgX2hvb2tOYW1lLCBhcmdzKSB7CisgICAg
dmFyIGhvb2tOYW1lID0gcmVzb2x2ZUhvb2sob2JqLCBfaG9va05hbWUpOworICAgIGlmIChob29r
TmFtZSkgeworICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7CisgICAgICAgIHJldHVybiBv
YmpbaG9va05hbWVdLmNhbGwob2JqKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09
IDEpIHsKKyAgICAgICAgcmV0dXJuIG9ialtob29rTmFtZV0uY2FsbChvYmosIGFyZ3NbMF0pOwor
ICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikgeworICAgICAgICByZXR1cm4gb2Jq
W2hvb2tOYW1lXS5jYWxsKG9iaiwgYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXR1cm4gb2JqW2hvb2tOYW1lXS5hcHBseShvYmosIGFyZ3MpOworICAgICAgfQor
ICAgIH0KKyAgfQorCisgIGV4cG9ydHMubWVyZ2UgPSBtZXJnZTsKKyAgZXhwb3J0cy5zbGljZSA9
IHNsaWNlOworICBleHBvcnRzLmlzUGFyYW0gPSBpc1BhcmFtOworICBleHBvcnRzLmNvZXJjZVF1
ZXJ5UGFyYW1zVG9TdHJpbmcgPSBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nOworICBleHBvcnRz
LmNhbGxIb29rID0gY2FsbEhvb2s7CisgIGV4cG9ydHMucmVzb2x2ZUhvb2sgPSByZXNvbHZlSG9v
azsKKyAgZXhwb3J0cy5hcHBseUhvb2sgPSBhcHBseUhvb2s7Cit9KTsKK2VuaWZlZCgncnN2cCcs
IFsnZXhwb3J0cycsICdyc3ZwL3Byb21pc2UnLCAncnN2cC9ldmVudHMnLCAncnN2cC9ub2RlJywg
J3JzdnAvYWxsJywgJ3JzdnAvYWxsLXNldHRsZWQnLCAncnN2cC9yYWNlJywgJ3JzdnAvaGFzaCcs
ICdyc3ZwL2hhc2gtc2V0dGxlZCcsICdyc3ZwL3JldGhyb3cnLCAncnN2cC9kZWZlcicsICdyc3Zw
L2NvbmZpZycsICdyc3ZwL21hcCcsICdyc3ZwL3Jlc29sdmUnLCAncnN2cC9yZWplY3QnLCAncnN2
cC9maWx0ZXInLCAncnN2cC9hc2FwJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2Us
IF9yc3ZwRXZlbnRzLCBfcnN2cE5vZGUsIF9yc3ZwQWxsLCBfcnN2cEFsbFNldHRsZWQsIF9yc3Zw
UmFjZSwgX3JzdnBIYXNoLCBfcnN2cEhhc2hTZXR0bGVkLCBfcnN2cFJldGhyb3csIF9yc3ZwRGVm
ZXIsIF9yc3ZwQ29uZmlnLCBfcnN2cE1hcCwgX3JzdnBSZXNvbHZlLCBfcnN2cFJlamVjdCwgX3Jz
dnBGaWx0ZXIsIF9yc3ZwQXNhcCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gZGVmYXVsdHMK
KyAgX3JzdnBDb25maWcuY29uZmlnLmFzeW5jID0gX3JzdnBBc2FwLmRlZmF1bHQ7CisgIF9yc3Zw
Q29uZmlnLmNvbmZpZy5hZnRlciA9IGZ1bmN0aW9uIChjYikgeworICAgIHNldFRpbWVvdXQoY2Is
IDApOworICB9OworICB2YXIgY2FzdCA9IF9yc3ZwUmVzb2x2ZS5kZWZhdWx0OworICBmdW5jdGlv
biBhc3luYyhjYWxsYmFjaywgYXJnKSB7CisgICAgX3JzdnBDb25maWcuY29uZmlnLmFzeW5jKGNh
bGxiYWNrLCBhcmcpOworICB9CisKKyAgZnVuY3Rpb24gb24oKSB7CisgICAgX3JzdnBDb25maWcu
Y29uZmlnWydvbiddLmFwcGx5KF9yc3ZwQ29uZmlnLmNvbmZpZywgYXJndW1lbnRzKTsKKyAgfQor
CisgIGZ1bmN0aW9uIG9mZigpIHsKKyAgICBfcnN2cENvbmZpZy5jb25maWdbJ29mZiddLmFwcGx5
KF9yc3ZwQ29uZmlnLmNvbmZpZywgYXJndW1lbnRzKTsKKyAgfQorCisgIC8vIFNldCB1cCBpbnN0
cnVtZW50YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJPTUlTRV9JTlRSVU1FTlRBVElPTl9fYAor
ICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvd1snX19Q
Uk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fJ10gPT09ICdvYmplY3QnKSB7CisgICAgdmFyIGNhbGxi
YWNrcyA9IHdpbmRvd1snX19QUk9NSVNFX0lOU1RSVU1FTlRBVElPTl9fJ107CisgICAgX3JzdnBD
b25maWcuY29uZmlndXJlKCdpbnN0cnVtZW50JywgdHJ1ZSk7CisgICAgZm9yICh2YXIgZXZlbnRO
YW1lIGluIGNhbGxiYWNrcykgeworICAgICAgaWYgKGNhbGxiYWNrcy5oYXNPd25Qcm9wZXJ0eShl
dmVudE5hbWUpKSB7CisgICAgICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2tzW2V2ZW50TmFtZV0p
OworICAgICAgfQorICAgIH0KKyAgfQorCisgIGV4cG9ydHMuY2FzdCA9IGNhc3Q7CisgIGV4cG9y
dHMuUHJvbWlzZSA9IF9yc3ZwUHJvbWlzZS5kZWZhdWx0OworICBleHBvcnRzLkV2ZW50VGFyZ2V0
ID0gX3JzdnBFdmVudHMuZGVmYXVsdDsKKyAgZXhwb3J0cy5hbGwgPSBfcnN2cEFsbC5kZWZhdWx0
OworICBleHBvcnRzLmFsbFNldHRsZWQgPSBfcnN2cEFsbFNldHRsZWQuZGVmYXVsdDsKKyAgZXhw
b3J0cy5yYWNlID0gX3JzdnBSYWNlLmRlZmF1bHQ7CisgIGV4cG9ydHMuaGFzaCA9IF9yc3ZwSGFz
aC5kZWZhdWx0OworICBleHBvcnRzLmhhc2hTZXR0bGVkID0gX3JzdnBIYXNoU2V0dGxlZC5kZWZh
dWx0OworICBleHBvcnRzLnJldGhyb3cgPSBfcnN2cFJldGhyb3cuZGVmYXVsdDsKKyAgZXhwb3J0
cy5kZWZlciA9IF9yc3ZwRGVmZXIuZGVmYXVsdDsKKyAgZXhwb3J0cy5kZW5vZGVpZnkgPSBfcnN2
cE5vZGUuZGVmYXVsdDsKKyAgZXhwb3J0cy5jb25maWd1cmUgPSBfcnN2cENvbmZpZy5jb25maWd1
cmU7CisgIGV4cG9ydHMub24gPSBvbjsKKyAgZXhwb3J0cy5vZmYgPSBvZmY7CisgIGV4cG9ydHMu
cmVzb2x2ZSA9IF9yc3ZwUmVzb2x2ZS5kZWZhdWx0OworICBleHBvcnRzLnJlamVjdCA9IF9yc3Zw
UmVqZWN0LmRlZmF1bHQ7CisgIGV4cG9ydHMuYXN5bmMgPSBhc3luYzsKKyAgZXhwb3J0cy5tYXAg
PSBfcnN2cE1hcC5kZWZhdWx0OworICBleHBvcnRzLmZpbHRlciA9IF9yc3ZwRmlsdGVyLmRlZmF1
bHQ7Cit9KTsKK2VuaWZlZCgncnN2cC51bWQnLCBbJ2V4cG9ydHMnLCAncnN2cC9wbGF0Zm9ybScs
ICdyc3ZwJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFBsYXRmb3JtLCBfcnN2cCkgeworICAn
dXNlIHN0cmljdCc7CisKKyAgdmFyIFJTVlAgPSB7CisgICAgJ3JhY2UnOiBfcnN2cC5yYWNlLAor
ICAgICdQcm9taXNlJzogX3JzdnAuUHJvbWlzZSwKKyAgICAnYWxsU2V0dGxlZCc6IF9yc3ZwLmFs
bFNldHRsZWQsCisgICAgJ2hhc2gnOiBfcnN2cC5oYXNoLAorICAgICdoYXNoU2V0dGxlZCc6IF9y
c3ZwLmhhc2hTZXR0bGVkLAorICAgICdkZW5vZGVpZnknOiBfcnN2cC5kZW5vZGVpZnksCisgICAg
J29uJzogX3JzdnAub24sCisgICAgJ29mZic6IF9yc3ZwLm9mZiwKKyAgICAnbWFwJzogX3JzdnAu
bWFwLAorICAgICdmaWx0ZXInOiBfcnN2cC5maWx0ZXIsCisgICAgJ3Jlc29sdmUnOiBfcnN2cC5y
ZXNvbHZlLAorICAgICdyZWplY3QnOiBfcnN2cC5yZWplY3QsCisgICAgJ2FsbCc6IF9yc3ZwLmFs
bCwKKyAgICAncmV0aHJvdyc6IF9yc3ZwLnJldGhyb3csCisgICAgJ2RlZmVyJzogX3JzdnAuZGVm
ZXIsCisgICAgJ0V2ZW50VGFyZ2V0JzogX3JzdnAuRXZlbnRUYXJnZXQsCisgICAgJ2NvbmZpZ3Vy
ZSc6IF9yc3ZwLmNvbmZpZ3VyZSwKKyAgICAnYXN5bmMnOiBfcnN2cC5hc3luYworICB9OworCisg
IC8qIGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi8KKyAgaWYg
KHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkgeworICAgIGRl
ZmluZShmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gUlNWUDsKKyAgICB9KTsKKyAgfSBlbHNl
IGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkg
eworICAgIG1vZHVsZVsnZXhwb3J0cyddID0gUlNWUDsKKyAgfSBlbHNlIGlmICh0eXBlb2YgX3Jz
dnBQbGF0Zm9ybS5kZWZhdWx0ICE9PSAndW5kZWZpbmVkJykgeworICAgIF9yc3ZwUGxhdGZvcm0u
ZGVmYXVsdFsnUlNWUCddID0gUlNWUDsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvLWludGVybmFs
JywgWydleHBvcnRzJywgJ3JzdnAvdXRpbHMnLCAncnN2cC9pbnN0cnVtZW50JywgJ3JzdnAvY29u
ZmlnJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFV0aWxzLCBfcnN2cEluc3RydW1lbnQsIF9y
c3ZwQ29uZmlnKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiB3aXRoT3duUHJvbWlz
ZSgpIHsKKyAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5u
b3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpOworICB9CisKKyAgZnVuY3Rpb24gbm9vcCgp
IHt9CisKKyAgdmFyIFBFTkRJTkcgPSB2b2lkIDA7CisgIHZhciBGVUxGSUxMRUQgPSAxOworICB2
YXIgUkVKRUNURUQgPSAyOworCisgIHZhciBHRVRfVEhFTl9FUlJPUiA9IG5ldyBFcnJvck9iamVj
dCgpOworCisgIGZ1bmN0aW9uIGdldFRoZW4ocHJvbWlzZSkgeworICAgIHRyeSB7CisgICAgICBy
ZXR1cm4gcHJvbWlzZS50aGVuOworICAgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgICBHRVRfVEhF
Tl9FUlJPUi5lcnJvciA9IGVycm9yOworICAgICAgcmV0dXJuIEdFVF9USEVOX0VSUk9SOworICAg
IH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyeVRoZW4odGhlbiwgdmFsdWUsIGZ1bGZpbGxtZW50SGFu
ZGxlciwgcmVqZWN0aW9uSGFuZGxlcikgeworICAgIHRyeSB7CisgICAgICB0aGVuLmNhbGwodmFs
dWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7CisgICAgfSBjYXRjaCAo
ZSkgeworICAgICAgcmV0dXJuIGU7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gaGFuZGxlRm9y
ZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7CisgICAgX3JzdnBDb25maWcu
Y29uZmlnLmFzeW5jKGZ1bmN0aW9uIChwcm9taXNlKSB7CisgICAgICB2YXIgc2VhbGVkID0gZmFs
c2U7CisgICAgICB2YXIgZXJyb3IgPSB0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbiAo
dmFsdWUpIHsKKyAgICAgICAgaWYgKHNlYWxlZCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICBzZWFsZWQgPSB0cnVlOworICAgICAgICBpZiAodGhlbmFibGUgIT09IHZh
bHVlKSB7CisgICAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAg
IH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgaWYgKHNlYWxlZCkgeworICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZWFsZWQgPSB0cnVlOworCisgICAgICAgIHJl
amVjdChwcm9taXNlLCByZWFzb24pOworICAgICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9s
YWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTsKKworICAgICAgaWYgKCFzZWFsZWQgJiYgZXJy
b3IpIHsKKyAgICAgICAgc2VhbGVkID0gdHJ1ZTsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIGVy
cm9yKTsKKyAgICAgIH0KKyAgICB9LCBwcm9taXNlKTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRs
ZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7CisgICAgaWYgKHRoZW5hYmxlLl9zdGF0
ZSA9PT0gRlVMRklMTEVEKSB7CisgICAgICBmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1
bHQpOworICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBSRUpFQ1RFRCkgeworICAg
ICAgdGhlbmFibGUuX29uRXJyb3IgPSBudWxsOworICAgICAgcmVqZWN0KHByb21pc2UsIHRoZW5h
YmxlLl9yZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVu
ZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFs
dWUpIHsKKyAgICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAg
fSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTsK
KyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZU1heWJlVGhlbmFibGUo
cHJvbWlzZSwgbWF5YmVUaGVuYWJsZSkgeworICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVj
dG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yKSB7CisgICAgICBoYW5kbGVPd25UaGVuYWJsZShw
cm9taXNlLCBtYXliZVRoZW5hYmxlKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHRoZW4gPSBn
ZXRUaGVuKG1heWJlVGhlbmFibGUpOworCisgICAgICBpZiAodGhlbiA9PT0gR0VUX1RIRU5fRVJS
T1IpIHsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIEdFVF9USEVOX0VSUk9SLmVycm9yKTsKKyAg
ICAgIH0gZWxzZSBpZiAodGhlbiA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGZ1bGZpbGwocHJv
bWlzZSwgbWF5YmVUaGVuYWJsZSk7CisgICAgICB9IGVsc2UgaWYgKF9yc3ZwVXRpbHMuaXNGdW5j
dGlvbih0aGVuKSkgeworICAgICAgICBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5
YmVUaGVuYWJsZSwgdGhlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmdWxmaWxsKHByb21p
c2UsIG1heWJlVGhlbmFibGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHJl
c29sdmUocHJvbWlzZSwgdmFsdWUpIHsKKyAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHsKKyAg
ICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpOworICAgIH0gZWxzZSBpZiAoX3JzdnBVdGlscy5v
YmplY3RPckZ1bmN0aW9uKHZhbHVlKSkgeworICAgICAgaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9t
aXNlLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUp
OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSkgewor
ICAgIGlmIChwcm9taXNlLl9vbkVycm9yKSB7CisgICAgICBwcm9taXNlLl9vbkVycm9yKHByb21p
c2UuX3Jlc3VsdCk7CisgICAgfQorCisgICAgcHVibGlzaChwcm9taXNlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpIHsKKyAgICBpZiAocHJvbWlzZS5fc3RhdGUg
IT09IFBFTkRJTkcpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9taXNlLl9yZXN1
bHQgPSB2YWx1ZTsKKyAgICBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRDsKKworICAgIGlmIChw
cm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHsKKyAgICAgIGlmIChfcnN2cENvbmZp
Zy5jb25maWcuaW5zdHJ1bWVudCkgeworICAgICAgICBfcnN2cEluc3RydW1lbnQuZGVmYXVsdCgn
ZnVsZmlsbGVkJywgcHJvbWlzZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9yc3Zw
Q29uZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNoLCBwcm9taXNlKTsKKyAgICB9CisgIH0KKworICBm
dW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7CisgICAgaWYgKHByb21pc2UuX3N0YXRl
ICE9PSBQRU5ESU5HKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHByb21pc2UuX3N0YXRl
ID0gUkVKRUNURUQ7CisgICAgcHJvbWlzZS5fcmVzdWx0ID0gcmVhc29uOworICAgIF9yc3ZwQ29u
ZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTsKKyAgfQorCisgIGZ1
bmN0aW9uIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlv
bikgeworICAgIHZhciBzdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7CisgICAgdmFy
IGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDsKKworICAgIHBhcmVudC5fb25FcnJvciA9IG51
bGw7CisKKyAgICBzdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7CisgICAgc3Vic2NyaWJlcnNb
bGVuZ3RoICsgRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7CisgICAgc3Vic2NyaWJlcnNbbGVu
Z3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247CisKKyAgICBpZiAobGVuZ3RoID09PSAwICYm
IHBhcmVudC5fc3RhdGUpIHsKKyAgICAgIF9yc3ZwQ29uZmlnLmNvbmZpZy5hc3luYyhwdWJsaXNo
LCBwYXJlbnQpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkgewor
ICAgIHZhciBzdWJzY3JpYmVycyA9IHByb21pc2UuX3N1YnNjcmliZXJzOworICAgIHZhciBzZXR0
bGVkID0gcHJvbWlzZS5fc3RhdGU7CisKKyAgICBpZiAoX3JzdnBDb25maWcuY29uZmlnLmluc3Ry
dW1lbnQpIHsKKyAgICAgIF9yc3ZwSW5zdHJ1bWVudC5kZWZhdWx0KHNldHRsZWQgPT09IEZVTEZJ
TExFRCA/ICdmdWxmaWxsZWQnIDogJ3JlamVjdGVkJywgcHJvbWlzZSk7CisgICAgfQorCisgICAg
aWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIHZhciBjaGlsZCwKKyAgICAgICAgY2FsbGJhY2ssCisgICAgICAgIGRldGFpbCA9IHByb21p
c2UuX3Jlc3VsdDsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3Ro
OyBpICs9IDMpIHsKKyAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07CisgICAgICBjYWxsYmFj
ayA9IHN1YnNjcmliZXJzW2kgKyBzZXR0bGVkXTsKKworICAgICAgaWYgKGNoaWxkKSB7CisgICAg
ICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTsKKyAg
ICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7CisgICAgICB9CisgICAgfQor
CisgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDsKKyAgfQorCisgIGZ1bmN0aW9u
IEVycm9yT2JqZWN0KCkgeworICAgIHRoaXMuZXJyb3IgPSBudWxsOworICB9CisKKyAgdmFyIFRS
WV9DQVRDSF9FUlJPUiA9IG5ldyBFcnJvck9iamVjdCgpOworCisgIGZ1bmN0aW9uIHRyeUNhdGNo
KGNhbGxiYWNrLCBkZXRhaWwpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNhbGxiYWNrKGRl
dGFpbCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgVFJZX0NBVENIX0VSUk9SLmVycm9yID0g
ZTsKKyAgICAgIHJldHVybiBUUllfQ0FUQ0hfRVJST1I7CisgICAgfQorICB9CisKKyAgZnVuY3Rp
b24gaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkgewor
ICAgIHZhciBoYXNDYWxsYmFjayA9IF9yc3ZwVXRpbHMuaXNGdW5jdGlvbihjYWxsYmFjayksCisg
ICAgICAgIHZhbHVlLAorICAgICAgICBlcnJvciwKKyAgICAgICAgc3VjY2VlZGVkLAorICAgICAg
ICBmYWlsZWQ7CisKKyAgICBpZiAoaGFzQ2FsbGJhY2spIHsKKyAgICAgIHZhbHVlID0gdHJ5Q2F0
Y2goY2FsbGJhY2ssIGRldGFpbCk7CisKKyAgICAgIGlmICh2YWx1ZSA9PT0gVFJZX0NBVENIX0VS
Uk9SKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIGVycm9yID0gdmFsdWUuZXJy
b3I7CisgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nl
ZWRlZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgewor
ICAgICAgICByZWplY3QocHJvbWlzZSwgd2l0aE93blByb21pc2UoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFsdWUgPSBkZXRhaWw7CisgICAgICBz
dWNjZWVkZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVO
RElORykgeworICAgICAgLy8gbm9vcAorICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3Vj
Y2VlZGVkKSB7CisgICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpOworICAgICAgfSBlbHNl
IGlmIChmYWlsZWQpIHsKKyAgICAgICAgcmVqZWN0KHByb21pc2UsIGVycm9yKTsKKyAgICAgIH0g
ZWxzZSBpZiAoc2V0dGxlZCA9PT0gRlVMRklMTEVEKSB7CisgICAgICAgIGZ1bGZpbGwocHJvbWlz
ZSwgdmFsdWUpOworICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBSRUpFQ1RFRCkgeworICAg
ICAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpOworICAgICAgfQorICB9CisKKyAgZnVuY3Rpb24g
aW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHsKKyAgICB2YXIgcmVzb2x2ZWQg
PSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21p
c2UodmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc29sdmVkKSB7CisgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKKyAgICAgICAgcmVzb2x2ZShwcm9t
aXNlLCB2YWx1ZSk7CisgICAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikgewor
ICAgICAgICBpZiAocmVzb2x2ZWQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgcmVzb2x2ZWQgPSB0cnVlOworICAgICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTsK
KyAgICAgIH0pOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJlamVjdChwcm9taXNlLCBlKTsK
KyAgICB9CisgIH0KKworICBleHBvcnRzLm5vb3AgPSBub29wOworICBleHBvcnRzLnJlc29sdmUg
PSByZXNvbHZlOworICBleHBvcnRzLnJlamVjdCA9IHJlamVjdDsKKyAgZXhwb3J0cy5mdWxmaWxs
ID0gZnVsZmlsbDsKKyAgZXhwb3J0cy5zdWJzY3JpYmUgPSBzdWJzY3JpYmU7CisgIGV4cG9ydHMu
cHVibGlzaCA9IHB1Ymxpc2g7CisgIGV4cG9ydHMucHVibGlzaFJlamVjdGlvbiA9IHB1Ymxpc2hS
ZWplY3Rpb247CisgIGV4cG9ydHMuaW5pdGlhbGl6ZVByb21pc2UgPSBpbml0aWFsaXplUHJvbWlz
ZTsKKyAgZXhwb3J0cy5pbnZva2VDYWxsYmFjayA9IGludm9rZUNhbGxiYWNrOworICBleHBvcnRz
LkZVTEZJTExFRCA9IEZVTEZJTExFRDsKKyAgZXhwb3J0cy5SRUpFQ1RFRCA9IFJFSkVDVEVEOwor
ICBleHBvcnRzLlBFTkRJTkcgPSBQRU5ESU5HOworfSk7CitlbmlmZWQoJ3JzdnAvYWxsLXNldHRs
ZWQnLCBbJ2V4cG9ydHMnLCAncnN2cC9lbnVtZXJhdG9yJywgJ3JzdnAvcHJvbWlzZScsICdyc3Zw
L3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cEVudW1lcmF0b3IsIF9yc3ZwUHJvbWlz
ZSwgX3JzdnBVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0g
YWxsU2V0dGxlZDsKKworICBmdW5jdGlvbiBBbGxTZXR0bGVkKENvbnN0cnVjdG9yLCBlbnRyaWVz
LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3IoQ29uc3RydWN0b3IsIGVudHJp
ZXMsIGZhbHNlLCAvKiBkb24ndCBhYm9ydCBvbiByZWplY3QgKi9sYWJlbCk7CisgIH0KKworICBB
bGxTZXR0bGVkLnByb3RvdHlwZSA9IF9yc3ZwVXRpbHMub19jcmVhdGUoX3JzdnBFbnVtZXJhdG9y
LmRlZmF1bHQucHJvdG90eXBlKTsKKyAgQWxsU2V0dGxlZC5wcm90b3R5cGUuX3N1cGVyQ29uc3Ry
dWN0b3IgPSBfcnN2cEVudW1lcmF0b3IuZGVmYXVsdDsKKyAgQWxsU2V0dGxlZC5wcm90b3R5cGUu
X21ha2VSZXN1bHQgPSBfcnN2cEVudW1lcmF0b3IubWFrZVNldHRsZWRSZXN1bHQ7CisgIEFsbFNl
dHRsZWQucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0
dXJuIG5ldyBFcnJvcignYWxsU2V0dGxlZCBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5Jyk7
CisgIH07CisKKyAgLyoqCisgICAgYFJTVlAuYWxsU2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNW
UC5hbGxgLCBidXQgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKKyAgICBhIGZhaWwtZmFzdCBtZXRo
b2QsIGl0IHdhaXRzIHVudGlsIGFsbCB0aGUgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQKKyAg
ICBzaG93cyB5b3UgYWxsIHRoZSByZXN1bHRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0
byBoYW5kbGUgbXVsdGlwbGUKKyAgICBwcm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIg
YXMgYSBzZXQuCisgIAorICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdo
ZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KKyAgICBzZXR0bGVkLiBUaGUgcmV0
dXJuIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgdGhlIHN0YXRlcyBvZgor
ICAgIHRoZSBwcm9taXNlcyBwYXNzZWQgaW50byB0aGUgYHByb21pc2VzYCBhcnJheSBhcmd1bWVu
dC4KKyAgCisgICAgRWFjaCBzdGF0ZSBvYmplY3Qgd2lsbCBlaXRoZXIgaW5kaWNhdGUgZnVsZmls
bG1lbnQgb3IgcmVqZWN0aW9uLCBhbmQKKyAgICBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIHZh
bHVlIG9yIHJlYXNvbi4gVGhlIHN0YXRlcyB3aWxsIHRha2Ugb25lIG9mCisgICAgdGhlIGZvbGxv
d2luZyBmb3JtYXRzOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgeyBzdGF0ZTogJ2Z1bGZp
bGxlZCcsIHZhbHVlOiB2YWx1ZSB9CisgICAgICBvcgorICAgIHsgc3RhdGU6ICdyZWplY3RlZCcs
IHJlYXNvbjogcmVhc29uIH0KKyAgICBgYGAKKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwor
ICAgIHZhciBwcm9taXNlMiA9IFJTVlAuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCcyJykpOwor
ICAgIHZhciBwcm9taXNlMyA9IFJTVlAuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCczJykpOwor
ICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAK
KyAgICBSU1ZQLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpeworICAg
ICAgLy8gYXJyYXkgPT0gWworICAgICAgLy8gICB7IHN0YXRlOiAnZnVsZmlsbGVkJywgdmFsdWU6
IDEgfSwKKyAgICAgIC8vICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJvciB9LAor
ICAgICAgLy8gICB7IHN0YXRlOiAncmVqZWN0ZWQnLCByZWFzb246IEVycm9yIH0KKyAgICAgIC8v
IF0KKyAgICAgIC8vIE5vdGUgdGhhdCBmb3IgdGhlIHNlY29uZCBpdGVtLCByZWFzb24ubWVzc2Fn
ZSB3aWxsIGJlICcyJywgYW5kIGZvciB0aGUKKyAgICAgIC8vIHRoaXJkIGl0ZW0sIHJlYXNvbi5t
ZXNzYWdlIHdpbGwgYmUgJzMnLgorICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAvLyBO
b3QgcnVuLiAoVGhpcyBibG9jayB3b3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhbGxTZXR0bGVkIGhh
ZCBmYWlsZWQsCisgICAgICAvLyBmb3IgaW5zdGFuY2UgaWYgcGFzc2VkIGFuIGluY29ycmVjdCBh
cmd1bWVudCB0eXBlLikKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhbGxTZXR0
bGVkCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9IGVudHJp
ZXMKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNj
cmliZXMgdGhlIHByb21pc2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4g
e1Byb21pc2V9IHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiB0aGUg
c2V0dGxlZAorICAgIHN0YXRlcyBvZiB0aGUgY29uc3RpdHVlbnQgcHJvbWlzZXMuCisgICovCisK
KyAgZnVuY3Rpb24gYWxsU2V0dGxlZChlbnRyaWVzLCBsYWJlbCkgeworICAgIHJldHVybiBuZXcg
QWxsU2V0dGxlZChfcnN2cFByb21pc2UuZGVmYXVsdCwgZW50cmllcywgbGFiZWwpLnByb21pc2U7
CisgIH0KK30pOworZW5pZmVkKCJyc3ZwL2FsbCIsIFsiZXhwb3J0cyIsICJyc3ZwL3Byb21pc2Ui
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkgeworICAidXNlIHN0cmljdCI7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gYWxsOworCisgIC8qKgorICAgIFRoaXMgaXMgYSBjb252ZW5p
ZW50IGFsaWFzIGZvciBgUlNWUC5Qcm9taXNlLmFsbGAuCisgIAorICAgIEBtZXRob2QgYWxsCisg
ICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFycmF5
IG9mIHByb21pc2VzLgorICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBbiBvcHRpb25hbCBsYWJl
bC4gVGhpcyBpcyB1c2VmdWwKKyAgICBmb3IgdG9vbGluZy4KKyAgKi8KKworICBmdW5jdGlvbiBh
bGwoYXJyYXksIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LmFsbChh
cnJheSwgbGFiZWwpOworICB9Cit9KTsKK2VuaWZlZCgncnN2cC9hc2FwJywgWydleHBvcnRzJ10s
IGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1
bHQgPSBhc2FwOworICB2YXIgbGVuID0gMDsKKyAgdmFyIHRvU3RyaW5nID0gKHt9KS50b1N0cmlu
ZzsKKyAgdmFyIHZlcnR4TmV4dDsKKworICBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHsK
KyAgICBxdWV1ZVtsZW5dID0gY2FsbGJhY2s7CisgICAgcXVldWVbbGVuICsgMV0gPSBhcmc7Cisg
ICAgbGVuICs9IDI7CisgICAgaWYgKGxlbiA9PT0gMikgeworICAgICAgLy8gSWYgbGVuIGlzIDEs
IHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLgorICAg
ICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVl
IGlzIGZsdXNoZWQsIHRoZXkKKyAgICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1
c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy4KKyAgICAgIHNjaGVkdWxlRmx1c2goKTsKKyAgICB9
CisgIH0KKworICB2YXIgYnJvd3NlcldpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmlu
ZWQnID8gd2luZG93IDogdW5kZWZpbmVkOworICB2YXIgYnJvd3Nlckdsb2JhbCA9IGJyb3dzZXJX
aW5kb3cgfHwge307CisgIHZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGJyb3dzZXJHbG9i
YWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2
ZXI7CisgIHZhciBpc05vZGUgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyAmJiB0eXBl
b2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHt9KS50b1N0cmluZy5jYWxsKHByb2Nlc3Mp
ID09PSAnW29iamVjdCBwcm9jZXNzXSc7CisKKyAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQg
bm90IGluIElFMTAKKyAgdmFyIGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9
PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiYg
dHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJzsKKworICAvLyBub2RlCisgIGZ1
bmN0aW9uIHVzZU5leHRUaWNrKCkgeworICAgIHZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRp
Y2s7CisgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdh
cm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5CisgICAgLy8gc2V0SW1tZWRp
YXRlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgaW5zdGVhZAorICAgIHZhciB2ZXJzaW9uID0gcHJv
Y2Vzcy52ZXJzaW9ucy5ub2RlLm1hdGNoKC9eKD86KFxkKylcLik/KD86KFxkKylcLik/KFwqfFxk
KykkLyk7CisgICAgaWYgKEFycmF5LmlzQXJyYXkodmVyc2lvbikgJiYgdmVyc2lvblsxXSA9PT0g
JzAnICYmIHZlcnNpb25bMl0gPT09ICcxMCcpIHsKKyAgICAgIG5leHRUaWNrID0gc2V0SW1tZWRp
YXRlOworICAgIH0KKyAgICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgbmV4dFRpY2soZmx1
c2gpOworICAgIH07CisgIH0KKworICAvLyB2ZXJ0eAorICBmdW5jdGlvbiB1c2VWZXJ0eFRpbWVy
KCkgeworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICB2ZXJ0eE5leHQoZmx1c2gpOwor
ICAgIH07CisgIH0KKworICBmdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKCkgeworICAgIHZh
ciBpdGVyYXRpb25zID0gMDsKKyAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9u
T2JzZXJ2ZXIoZmx1c2gpOworICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUo
JycpOworICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0p
OworCisgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKKyAgICAgIG5vZGUuZGF0YSA9IGl0ZXJhdGlv
bnMgPSArK2l0ZXJhdGlvbnMgJSAyOworICAgIH07CisgIH0KKworICAvLyB3ZWIgd29ya2VyCisg
IGZ1bmN0aW9uIHVzZU1lc3NhZ2VDaGFubmVsKCkgeworICAgIHZhciBjaGFubmVsID0gbmV3IE1l
c3NhZ2VDaGFubmVsKCk7CisgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmbHVzaDsKKyAg
ICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgw
KTsKKyAgICB9OworICB9CisKKyAgZnVuY3Rpb24gdXNlU2V0VGltZW91dCgpIHsKKyAgICByZXR1
cm4gZnVuY3Rpb24gKCkgeworICAgICAgc2V0VGltZW91dChmbHVzaCwgMSk7CisgICAgfTsKKyAg
fQorCisgIHZhciBxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTsKKyAgZnVuY3Rpb24gZmx1c2goKSB7
CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgdmFyIGNhbGxi
YWNrID0gcXVldWVbaV07CisgICAgICB2YXIgYXJnID0gcXVldWVbaSArIDFdOworCisgICAgICBj
YWxsYmFjayhhcmcpOworCisgICAgICBxdWV1ZVtpXSA9IHVuZGVmaW5lZDsKKyAgICAgIHF1ZXVl
W2kgKyAxXSA9IHVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBsZW4gPSAwOworICB9CisKKyAgZnVu
Y3Rpb24gYXR0ZW1wdFZlcnRleCgpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHIgPSByZXF1aXJl
OworICAgICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTsKKyAgICAgIHZlcnR4TmV4dCA9IHZlcnR4
LnJ1bk9uTG9vcCB8fCB2ZXJ0eC5ydW5PbkNvbnRleHQ7CisgICAgICByZXR1cm4gdXNlVmVydHhU
aW1lcigpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJldHVybiB1c2VTZXRUaW1lb3V0KCk7
CisgICAgfQorICB9CisKKyAgdmFyIHNjaGVkdWxlRmx1c2g7CisgIC8vIERlY2lkZSB3aGF0IGFz
eW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxs
YmFja3M6CisgIGlmIChpc05vZGUpIHsKKyAgICBzY2hlZHVsZUZsdXNoID0gdXNlTmV4dFRpY2so
KTsKKyAgfSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikgeworICAgIHNjaGVkdWxl
Rmx1c2ggPSB1c2VNdXRhdGlvbk9ic2VydmVyKCk7CisgIH0gZWxzZSBpZiAoaXNXb3JrZXIpIHsK
KyAgICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTsKKyAgfSBlbHNlIGlmIChi
cm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlv
bicpIHsKKyAgICBzY2hlZHVsZUZsdXNoID0gYXR0ZW1wdFZlcnRleCgpOworICB9IGVsc2Ugewor
ICAgIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7CisgIH0KK30pOworZW5pZmVkKCdy
c3ZwL2NvbmZpZycsIFsnZXhwb3J0cycsICdyc3ZwL2V2ZW50cyddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX3JzdnBFdmVudHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBjb25maWcgPSB7Cisg
ICAgaW5zdHJ1bWVudDogZmFsc2UKKyAgfTsKKworICBfcnN2cEV2ZW50cy5kZWZhdWx0WydtaXhp
biddKGNvbmZpZyk7CisKKyAgZnVuY3Rpb24gY29uZmlndXJlKG5hbWUsIHZhbHVlKSB7CisgICAg
aWYgKG5hbWUgPT09ICdvbmVycm9yJykgeworICAgICAgLy8gaGFuZGxlIGZvciBsZWdhY3kgdXNl
cnMgdGhhdCBleHBlY3QgdGhlIGFjdHVhbAorICAgICAgLy8gZXJyb3IgdG8gYmUgcGFzc2VkIHRv
IHRoZWlyIGZ1bmN0aW9uIGFkZGVkIHZpYQorICAgICAgLy8gYFJTVlAuY29uZmlndXJlKCdvbmVy
cm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAorICAgICAgY29uZmlnWydvbiddKCdlcnJvcicsIHZh
bHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9
PT0gMikgeworICAgICAgY29uZmlnW25hbWVdID0gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAg
IHJldHVybiBjb25maWdbbmFtZV07CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5jb25maWcgPSBj
b25maWc7CisgIGV4cG9ydHMuY29uZmlndXJlID0gY29uZmlndXJlOworfSk7CitlbmlmZWQoJ3Jz
dnAvZGVmZXInLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJ10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfcnN2cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9
IGRlZmVyOworCisgIC8qKgorICAgIGBSU1ZQLmRlZmVyYCByZXR1cm5zIGFuIG9iamVjdCBzaW1p
bGFyIHRvIGpRdWVyeSdzIGAkLkRlZmVycmVkYC4KKyAgICBgUlNWUC5kZWZlcmAgc2hvdWxkIGJl
IHVzZWQgd2hlbiBwb3J0aW5nIG92ZXIgY29kZSByZWxpYW50IG9uIGAkLkRlZmVycmVkYCdzCisg
ICAgaW50ZXJmYWNlLiBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBgUlNWUC5Qcm9taXNlYCBjb25z
dHJ1Y3RvciBpbnN0ZWFkLgorICAKKyAgICBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gYFJTVlAu
ZGVmZXJgIGlzIGEgcGxhaW4gb2JqZWN0IHdpdGggdGhyZWUgcHJvcGVydGllczoKKyAgCisgICAg
KiBwcm9taXNlIC0gYW4gYFJTVlAuUHJvbWlzZWAuCisgICAgKiByZWplY3QgLSBhIGZ1bmN0aW9u
IHRoYXQgY2F1c2VzIHRoZSBgcHJvbWlzZWAgcHJvcGVydHkgb24gdGhpcyBvYmplY3QgdG8KKyAg
ICAgIGJlY29tZSByZWplY3RlZAorICAgICogcmVzb2x2ZSAtIGEgZnVuY3Rpb24gdGhhdCBjYXVz
ZXMgdGhlIGBwcm9taXNlYCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCB0bworICAgICAgYmVjb21l
IGZ1bGZpbGxlZC4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgIGBgYGphdmFzY3JpcHQKKyAg
ICAgdmFyIGRlZmVycmVkID0gUlNWUC5kZWZlcigpOworICAKKyAgICAgZGVmZXJyZWQucmVzb2x2
ZSgiU3VjY2VzcyEiKTsKKyAgCisgICAgIGRlZmVycmVkLnByb21pc2UudGhlbihmdW5jdGlvbih2
YWx1ZSl7CisgICAgICAgLy8gdmFsdWUgaGVyZSBpcyAiU3VjY2VzcyEiCisgICAgIH0pOworICAg
ICBgYGAKKyAgCisgICAgQG1ldGhvZCBkZWZlcgorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAK
KyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0
aGUgcHJvbWlzZS4KKyAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7T2JqZWN0
fQorICAgKi8KKworICBmdW5jdGlvbiBkZWZlcihsYWJlbCkgeworICAgIHZhciBkZWZlcnJlZCA9
IHt9OworCisgICAgZGVmZXJyZWRbJ3Byb21pc2UnXSA9IG5ldyBfcnN2cFByb21pc2UuZGVmYXVs
dChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CisgICAgICBkZWZlcnJlZFsncmVzb2x2ZSdd
ID0gcmVzb2x2ZTsKKyAgICAgIGRlZmVycmVkWydyZWplY3QnXSA9IHJlamVjdDsKKyAgICB9LCBs
YWJlbCk7CisKKyAgICByZXR1cm4gZGVmZXJyZWQ7CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL2Vu
dW1lcmF0b3InLCBbJ2V4cG9ydHMnLCAncnN2cC91dGlscycsICdyc3ZwLy1pbnRlcm5hbCddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX3JzdnBVdGlscywgX3JzdnBJbnRlcm5hbCkgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5tYWtlU2V0dGxlZFJlc3VsdCA9IG1ha2VTZXR0bGVkUmVzdWx0
OworCisgIGZ1bmN0aW9uIG1ha2VTZXR0bGVkUmVzdWx0KHN0YXRlLCBwb3NpdGlvbiwgdmFsdWUp
IHsKKyAgICBpZiAoc3RhdGUgPT09IF9yc3ZwSW50ZXJuYWwuRlVMRklMTEVEKSB7CisgICAgICBy
ZXR1cm4geworICAgICAgICBzdGF0ZTogJ2Z1bGZpbGxlZCcsCisgICAgICAgIHZhbHVlOiB2YWx1
ZQorICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgc3RhdGU6
ICdyZWplY3RlZCcsCisgICAgICAgIHJlYXNvbjogdmFsdWUKKyAgICAgIH07CisgICAgfQorICB9
CisKKyAgZnVuY3Rpb24gRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQsIGFib3J0T25SZWpl
Y3QsIGxhYmVsKSB7CisgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzOworCisgICAgZW51bWVyYXRv
ci5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yOworICAgIGVudW1lcmF0b3IucHJv
bWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsKKyAgICBl
bnVtZXJhdG9yLl9hYm9ydE9uUmVqZWN0ID0gYWJvcnRPblJlamVjdDsKKworICAgIGlmIChlbnVt
ZXJhdG9yLl92YWxpZGF0ZUlucHV0KGlucHV0KSkgeworICAgICAgZW51bWVyYXRvci5faW5wdXQg
PSBpbnB1dDsKKyAgICAgIGVudW1lcmF0b3IubGVuZ3RoID0gaW5wdXQubGVuZ3RoOworICAgICAg
ZW51bWVyYXRvci5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoOworCisgICAgICBlbnVtZXJhdG9y
Ll9pbml0KCk7CisKKyAgICAgIGlmIChlbnVtZXJhdG9yLmxlbmd0aCA9PT0gMCkgeworICAgICAg
ICBfcnN2cEludGVybmFsLmZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9y
ZXN1bHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bWVyYXRvci5sZW5ndGggPSBlbnVt
ZXJhdG9yLmxlbmd0aCB8fCAwOworICAgICAgICBlbnVtZXJhdG9yLl9lbnVtZXJhdGUoKTsKKyAg
ICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkgeworICAgICAgICAgIF9yc3Zw
SW50ZXJuYWwuZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7
CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX3JzdnBJbnRlcm5hbC5y
ZWplY3QoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl92YWxpZGF0aW9uRXJyb3IoKSk7
CisgICAgfQorICB9CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gRW51bWVyYXRvcjsKKworICBFbnVt
ZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVJbnB1dCA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAg
IHJldHVybiBfcnN2cFV0aWxzLmlzQXJyYXkoaW5wdXQpOworICB9OworCisgIEVudW1lcmF0b3Iu
cHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIG5l
dyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7CisgIH07
CisKKyAgRW51bWVyYXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhp
cy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKKyAgfTsKKworICBFbnVtZXJhdG9y
LnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBlbnVtZXJhdG9y
ID0gdGhpczsKKyAgICB2YXIgbGVuZ3RoID0gZW51bWVyYXRvci5sZW5ndGg7CisgICAgdmFyIHBy
b21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7CisgICAgdmFyIGlucHV0ID0gZW51bWVyYXRvci5f
aW5wdXQ7CisKKyAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50
ZXJuYWwuUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGVudW1lcmF0b3IuX2Vh
Y2hFbnRyeShpbnB1dFtpXSwgaSk7CisgICAgfQorICB9OworCisgIEVudW1lcmF0b3IucHJvdG90
eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbiAoZW50cnksIGkpIHsKKyAgICB2YXIgZW51bWVyYXRv
ciA9IHRoaXM7CisgICAgdmFyIGMgPSBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yOwor
ICAgIGlmIChfcnN2cFV0aWxzLmlzTWF5YmVUaGVuYWJsZShlbnRyeSkpIHsKKyAgICAgIGlmIChl
bnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09IF9yc3ZwSW50ZXJuYWwu
UEVORElORykgeworICAgICAgICBlbnRyeS5fb25FcnJvciA9IG51bGw7CisgICAgICAgIGVudW1l
cmF0b3IuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgZW51bWVyYXRvci5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRy
eSksIGkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnVtZXJhdG9yLl9yZW1haW5p
bmctLTsKKyAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudW1lcmF0b3IuX21ha2VSZXN1
bHQoX3JzdnBJbnRlcm5hbC5GVUxGSUxMRUQsIGksIGVudHJ5KTsKKyAgICB9CisgIH07CisKKyAg
RW51bWVyYXRvci5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uIChzdGF0ZSwgaSwgdmFs
dWUpIHsKKyAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7CisgICAgdmFyIHByb21pc2UgPSBlbnVt
ZXJhdG9yLnByb21pc2U7CisKKyAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50ZXJu
YWwuUEVORElORykgeworICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07CisKKyAgICAgIGlm
IChlbnVtZXJhdG9yLl9hYm9ydE9uUmVqZWN0ICYmIHN0YXRlID09PSBfcnN2cEludGVybmFsLlJF
SkVDVEVEKSB7CisgICAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIHZhbHVlKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudW1lcmF0
b3IuX21ha2VSZXN1bHQoc3RhdGUsIGksIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7CisgICAgICBfcnN2cEludGVybmFsLmZ1
bGZpbGwocHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTsKKyAgICB9CisgIH07CisKKyAgRW51
bWVyYXRvci5wcm90b3R5cGUuX21ha2VSZXN1bHQgPSBmdW5jdGlvbiAoc3RhdGUsIGksIHZhbHVl
KSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIEVudW1lcmF0b3IucHJvdG90eXBlLl93
aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiAocHJvbWlzZSwgaSkgeworICAgIHZhciBlbnVtZXJhdG9y
ID0gdGhpczsKKworICAgIF9yc3ZwSW50ZXJuYWwuc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5l
ZCwgZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoX3JzdnBJ
bnRlcm5hbC5GVUxGSUxMRUQsIGksIHZhbHVlKTsKKyAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7
CisgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoX3JzdnBJbnRlcm5hbC5SRUpFQ1RFRCwgaSwg
cmVhc29uKTsKKyAgICB9KTsKKyAgfTsKK30pOworZW5pZmVkKCdyc3ZwL2V2ZW50cycsIFsnZXhw
b3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAndXNlIHN0cmljdCc7CisKKyAgZnVuY3Rp
b24gaW5kZXhPZihjYWxsYmFja3MsIGNhbGxiYWNrKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGwg
PSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBpZiAoY2FsbGJhY2tzW2ld
ID09PSBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gLTE7CisgIH0KKworICBmdW5jdGlvbiBjYWxsYmFja3NGb3Iob2JqZWN0KSB7Cisg
ICAgdmFyIGNhbGxiYWNrcyA9IG9iamVjdC5fcHJvbWlzZUNhbGxiYWNrczsKKworICAgIGlmICgh
Y2FsbGJhY2tzKSB7CisgICAgICBjYWxsYmFja3MgPSBvYmplY3QuX3Byb21pc2VDYWxsYmFja3Mg
PSB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FsbGJhY2tzOworICB9CisKKyAgLyoqCisgICAg
QGNsYXNzIFJTVlAuRXZlbnRUYXJnZXQKKyAgKi8KKyAgZXhwb3J0cy5kZWZhdWx0ID0geworCisg
ICAgLyoqCisgICAgICBgUlNWUC5FdmVudFRhcmdldC5taXhpbmAgZXh0ZW5kcyBhbiBvYmplY3Qg
d2l0aCBFdmVudFRhcmdldCBtZXRob2RzLiBGb3IKKyAgICAgIEV4YW1wbGU6CisgICAgICAgYGBg
amF2YXNjcmlwdAorICAgICAgdmFyIG9iamVjdCA9IHt9OworICAgICAgIFJTVlAuRXZlbnRUYXJn
ZXQubWl4aW4ob2JqZWN0KTsKKyAgICAgICBvYmplY3Qub24oJ2ZpbmlzaGVkJywgZnVuY3Rpb24o
ZXZlbnQpIHsKKyAgICAgICAgLy8gaGFuZGxlIGV2ZW50CisgICAgICB9KTsKKyAgICAgICBvYmpl
Y3QudHJpZ2dlcignZmluaXNoZWQnLCB7IGRldGFpbDogdmFsdWUgfSk7CisgICAgICBgYGAKKyAg
ICAgICBgRXZlbnRUYXJnZXQubWl4aW5gIGFsc28gd29ya3Mgd2l0aCBwcm90b3R5cGVzOgorICAg
ICAgIGBgYGphdmFzY3JpcHQKKyAgICAgIHZhciBQZXJzb24gPSBmdW5jdGlvbigpIHt9OworICAg
ICAgUlNWUC5FdmVudFRhcmdldC5taXhpbihQZXJzb24ucHJvdG90eXBlKTsKKyAgICAgICB2YXIg
eWVodWRhID0gbmV3IFBlcnNvbigpOworICAgICAgdmFyIHRvbSA9IG5ldyBQZXJzb24oKTsKKyAg
ICAgICB5ZWh1ZGEub24oJ3Bva2UnLCBmdW5jdGlvbihldmVudCkgeworICAgICAgICBjb25zb2xl
LmxvZygnWWVodWRhIHNheXMgT1cnKTsKKyAgICAgIH0pOworICAgICAgIHRvbS5vbigncG9rZScs
IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIGNvbnNvbGUubG9nKCdUb20gc2F5cyBPVycpOwor
ICAgICAgfSk7CisgICAgICAgeWVodWRhLnRyaWdnZXIoJ3Bva2UnKTsKKyAgICAgIHRvbS50cmln
Z2VyKCdwb2tlJyk7CisgICAgICBgYGAKKyAgICAgICBAbWV0aG9kIG1peGluCisgICAgICBAZm9y
IFJTVlAuRXZlbnRUYXJnZXQKKyAgICAgIEBwcml2YXRlCisgICAgICBAcGFyYW0ge09iamVjdH0g
b2JqZWN0IG9iamVjdCB0byBleHRlbmQgd2l0aCBFdmVudFRhcmdldCBtZXRob2RzCisgICAgKi8K
KyAgICAnbWl4aW4nOiBmdW5jdGlvbiAob2JqZWN0KSB7CisgICAgICBvYmplY3RbJ29uJ10gPSB0
aGlzWydvbiddOworICAgICAgb2JqZWN0WydvZmYnXSA9IHRoaXNbJ29mZiddOworICAgICAgb2Jq
ZWN0Wyd0cmlnZ2VyJ10gPSB0aGlzWyd0cmlnZ2VyJ107CisgICAgICBvYmplY3QuX3Byb21pc2VD
YWxsYmFja3MgPSB1bmRlZmluZWQ7CisgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0sCisKKyAg
ICAvKioKKyAgICAgIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYGV2
ZW50TmFtZWAgaXMgdHJpZ2dlcmVkCisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgb2JqZWN0
Lm9uKCdldmVudCcsIGZ1bmN0aW9uKGV2ZW50SW5mbyl7CisgICAgICAgIC8vIGhhbmRsZSB0aGUg
ZXZlbnQKKyAgICAgIH0pOworICAgICAgIG9iamVjdC50cmlnZ2VyKCdldmVudCcpOworICAgICAg
YGBgCisgICAgICAgQG1ldGhvZCBvbgorICAgICAgQGZvciBSU1ZQLkV2ZW50VGFyZ2V0CisgICAg
ICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBuYW1lIG9mIHRoZSBl
dmVudCB0byBsaXN0ZW4gZm9yCisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBmdW5j
dGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICovCisg
ICAgJ29uJzogZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKKyAgICAgIGlmICh0eXBl
b2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJv
cignQ2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7CisgICAgICB9CisKKyAgICAgIHZhciBh
bGxDYWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAgY2FsbGJhY2tzOwor
CisgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXTsKKworICAgICAgaWYg
KCFjYWxsYmFja3MpIHsKKyAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFt
ZV0gPSBbXTsKKyAgICAgIH0KKworICAgICAgaWYgKGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFj
aykgPT09IC0xKSB7CisgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKKyAgICAgIH0K
KyAgICB9LAorCisgICAgLyoqCisgICAgICBZb3UgY2FuIHVzZSBgb2ZmYCB0byBzdG9wIGZpcmlu
ZyBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgZm9yIGFuIGV2ZW50OgorICAgICAgIGBgYGphdmFzY3Jp
cHQKKyAgICAgIGZ1bmN0aW9uIGRvU3R1ZmYoKSB7IC8vIGRvIHN0dWZmISB9CisgICAgICBvYmpl
Y3Qub24oJ3N0dWZmJywgZG9TdHVmZik7CisgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7
IC8vIGRvU3R1ZmYgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAvLyBVbnJlZ2lzdGVyIE9OTFkgdGhl
IGRvU3R1ZmYgY2FsbGJhY2sKKyAgICAgIG9iamVjdC5vZmYoJ3N0dWZmJywgZG9TdHVmZik7Cisg
ICAgICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIE5PVCBiZSBjYWxs
ZWQKKyAgICAgIGBgYAorICAgICAgIElmIHlvdSBkb24ndCBwYXNzIGEgYGNhbGxiYWNrYCBhcmd1
bWVudCB0byBgb2ZmYCwgQUxMIGNhbGxiYWNrcyBmb3IgdGhlCisgICAgICBldmVudCB3aWxsIG5v
dCBiZSBleGVjdXRlZCB3aGVuIHRoZSBldmVudCBmaXJlcy4gRm9yIGV4YW1wbGU6CisgICAgICAg
YGBgamF2YXNjcmlwdAorICAgICAgdmFyIGNhbGxiYWNrMSA9IGZ1bmN0aW9uKCl7fTsKKyAgICAg
IHZhciBjYWxsYmFjazIgPSBmdW5jdGlvbigpe307CisgICAgICAgb2JqZWN0Lm9uKCdzdHVmZics
IGNhbGxiYWNrMSk7CisgICAgICBvYmplY3Qub24oJ3N0dWZmJywgY2FsbGJhY2syKTsKKyAgICAg
ICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gY2FsbGJhY2sxIGFuZCBjYWxsYmFjazIgd2ls
bCBiZSBleGVjdXRlZC4KKyAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicpOworICAgICAgb2JqZWN0
LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2syIHdpbGwgbm90IGJl
IGV4ZWN1dGVkIQorICAgICAgYGBgCisgICAgICAgQG1ldGhvZCBvZmYKKyAgICAgIEBmb3IgUlNW
UC5FdmVudFRhcmdldAorICAgICAgQHByaXZhdGUKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBldmVu
dE5hbWUgZXZlbnQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8KKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3VtZW50LiBJZiBnaXZlbiwgb25seSB0aGUgZnVuY3Rpb24K
KyAgICAgIGdpdmVuIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBldmVudCdzIGNhbGxiYWNrIHF1
ZXVlLiBJZiBubyBgY2FsbGJhY2tgCisgICAgICBhcmd1bWVudCBpcyBnaXZlbiwgYWxsIGNhbGxi
YWNrcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQncyBjYWxsYmFjaworICAgICAgcXVl
dWUuCisgICAgKi8KKyAgICAnb2ZmJzogZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsK
KyAgICAgIHZhciBhbGxDYWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAg
Y2FsbGJhY2tzLAorICAgICAgICAgIGluZGV4OworCisgICAgICBpZiAoIWNhbGxiYWNrKSB7Cisg
ICAgICAgIGFsbENhbGxiYWNrc1tldmVudE5hbWVdID0gW107CisgICAgICAgIHJldHVybjsKKyAg
ICAgIH0KKworICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV07CisKKyAg
ICAgIGluZGV4ID0gaW5kZXhPZihjYWxsYmFja3MsIGNhbGxiYWNrKTsKKworICAgICAgaWYgKGlu
ZGV4ICE9PSAtMSkgeworICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTsKKyAgICAg
IH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICBVc2UgYHRyaWdnZXJgIHRvIGZpcmUgY3VzdG9t
IGV2ZW50cy4gRm9yIGV4YW1wbGU6CisgICAgICAgYGBgamF2YXNjcmlwdAorICAgICAgb2JqZWN0
Lm9uKCdmb28nLCBmdW5jdGlvbigpeworICAgICAgICBjb25zb2xlLmxvZygnZm9vIGV2ZW50IGhh
cHBlbmVkIScpOworICAgICAgfSk7CisgICAgICBvYmplY3QudHJpZ2dlcignZm9vJyk7CisgICAg
ICAvLyAnZm9vIGV2ZW50IGhhcHBlbmVkIScgbG9nZ2VkIHRvIHRoZSBjb25zb2xlCisgICAgICBg
YGAKKyAgICAgICBZb3UgY2FuIGFsc28gcGFzcyBhIHZhbHVlIGFzIGEgc2Vjb25kIGFyZ3VtZW50
IHRvIGB0cmlnZ2VyYCB0aGF0IHdpbGwgYmUKKyAgICAgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0
byBhbGwgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQ6CisgICAgICAgYGBgamF2YXNjcmlw
dAorICAgICAgb2JqZWN0Lm9uKCdmb28nLCBmdW5jdGlvbih2YWx1ZSl7CisgICAgICAgIGNvbnNv
bGUubG9nKHZhbHVlLm5hbWUpOworICAgICAgfSk7CisgICAgICAgb2JqZWN0LnRyaWdnZXIoJ2Zv
bycsIHsgbmFtZTogJ2JhcicgfSk7CisgICAgICAvLyAnYmFyJyBsb2dnZWQgdG8gdGhlIGNvbnNv
bGUKKyAgICAgIGBgYAorICAgICAgIEBtZXRob2QgdHJpZ2dlcgorICAgICAgQGZvciBSU1ZQLkV2
ZW50VGFyZ2V0CisgICAgICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFt
ZSBuYW1lIG9mIHRoZSBldmVudCB0byBiZSB0cmlnZ2VyZWQKKyAgICAgIEBwYXJhbSB7Kn0gb3B0
aW9ucyBvcHRpb25hbCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gYW55IGV2ZW50IGhhbmRsZXJzIGZv
cgorICAgICAgdGhlIGdpdmVuIGBldmVudE5hbWVgCisgICAgKi8KKyAgICAndHJpZ2dlcic6IGZ1
bmN0aW9uIChldmVudE5hbWUsIG9wdGlvbnMpIHsKKyAgICAgIHZhciBhbGxDYWxsYmFja3MgPSBj
YWxsYmFja3NGb3IodGhpcyksCisgICAgICAgICAgY2FsbGJhY2tzLAorICAgICAgICAgIGNhbGxi
YWNrOworCisgICAgICBpZiAoY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0pIHsK
KyAgICAgICAgLy8gRG9uJ3QgY2FjaGUgdGhlIGNhbGxiYWNrcy5sZW5ndGggc2luY2UgaXQgbWF5
IGdyb3cKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTsKKworICAgICAgICAgIGNhbGxi
YWNrKG9wdGlvbnMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworfSk7Citlbmlm
ZWQoJ3JzdnAvZmlsdGVyJywgWydleHBvcnRzJywgJ3JzdnAvcHJvbWlzZScsICdyc3ZwL3V0aWxz
J10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGZpbHRlcjsKKworICAvKioKKyAgIGBS
U1ZQLmZpbHRlcmAgaXMgc2ltaWxhciB0byBKYXZhU2NyaXB0J3MgbmF0aXZlIGBmaWx0ZXJgIG1l
dGhvZCwgZXhjZXB0IHRoYXQgaXQKKyAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29t
ZSBmdWxmaWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBmaWx0ZXJGbmAgb24KKyAgICBlYWNoIGl0
ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAuZmlsdGVyYCByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHdpbGwKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBydW5u
aW5nIGBmaWx0ZXJGbmAgb24gdGhlIHZhbHVlcyB0aGUKKyAgICBwcm9taXNlcyBiZWNvbWUgZnVs
ZmlsbGVkIHdpdGguCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgIAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlz
ZTIgPSBSU1ZQLnJlc29sdmUoMik7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMp
OworICAKKyAgICB2YXIgcHJvbWlzZXMgPSBbcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlM107
CisgIAorICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0peworICAgICAgcmV0dXJuIGl0
ZW0gPiAxOworICAgIH07CisgIAorICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbiku
dGhlbihmdW5jdGlvbihyZXN1bHQpeworICAgICAgLy8gcmVzdWx0IGlzIFsgMiwgMyBdCisgICAg
fSk7CisgICAgYGBgCisgIAorICAgIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBg
UlNWUC5maWx0ZXJgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0IHByb21pc2UKKyAgICB0aGF0IGlz
IHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHBy
b21pc2UncworICAgIHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToKKyAgCisgICAgYGBg
amF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIg
cHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3IoJzInKSk7CisgICAgdmFyIHByb21pc2Uz
ID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCczJykpOworICAgIHZhciBwcm9taXNlcyA9IFsgcHJv
bWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAKKyAgICB2YXIgZmlsdGVyRm4gPSBmdW5j
dGlvbihpdGVtKXsKKyAgICAgIHJldHVybiBpdGVtID4gMTsKKyAgICB9OworICAKKyAgICBSU1ZQ
LmZpbHRlcihwcm9taXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24oYXJyYXkpeworICAgICAg
Ly8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlz
ZXMhCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAvLyByZWFzb24ubWVzc2FnZSA9
PT0gJzInCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBSU1ZQLmZpbHRlcmAgd2lsbCBhbHNv
IHdhaXQgZm9yIGFueSBwcm9taXNlcyByZXR1cm5lZCBmcm9tIGBmaWx0ZXJGbmAuCisgICAgRm9y
IGluc3RhbmNlLCB5b3UgbWF5IHdhbnQgdG8gZmV0Y2ggYSBsaXN0IG9mIHVzZXJzIHRoZW4gcmV0
dXJuIGEgc3Vic2V0CisgICAgb2YgdGhvc2UgdXNlcnMgYmFzZWQgb24gc29tZSBhc3luY2hyb25v
dXMgb3BlcmF0aW9uOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgIAorICAgIHZhciBhbGljZSA9
IHsgbmFtZTogJ2FsaWNlJyB9OworICAgIHZhciBib2IgICA9IHsgbmFtZTogJ2JvYicgfTsKKyAg
ICB2YXIgdXNlcnMgPSBbIGFsaWNlLCBib2IgXTsKKyAgCisgICAgdmFyIHByb21pc2VzID0gdXNl
cnMubWFwKGZ1bmN0aW9uKHVzZXIpeworICAgICAgcmV0dXJuIFJTVlAucmVzb2x2ZSh1c2VyKTsK
KyAgICB9KTsKKyAgCisgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24odXNlcil7CisgICAgICAv
LyBIZXJlLCBBbGljZSBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGEgYmxvZyBwb3N0LCBidXQg
Qm9iIGRvZXMgbm90LgorICAgICAgcmV0dXJuIGdldFByaXZpbGVnZXNGb3JVc2VyKHVzZXIpLnRo
ZW4oZnVuY3Rpb24ocHJpdnMpeworICAgICAgICByZXR1cm4gcHJpdnMuY2FuX2NyZWF0ZV9ibG9n
X3Bvc3QgPT09IHRydWU7CisgICAgICB9KTsKKyAgICB9OworICAgIFJTVlAuZmlsdGVyKHByb21p
c2VzLCBmaWx0ZXJGbikudGhlbihmdW5jdGlvbih1c2Vycyl7CisgICAgICAvLyB0cnVlLCBiZWNh
dXNlIHRoZSBzZXJ2ZXIgdG9sZCB1cyBvbmx5IEFsaWNlIGNhbiBjcmVhdGUgYSBibG9nIHBvc3Qu
CisgICAgICB1c2Vycy5sZW5ndGggPT09IDE7CisgICAgICAvLyBmYWxzZSwgYmVjYXVzZSBBbGlj
ZSBpcyB0aGUgb25seSB1c2VyIHByZXNlbnQgaW4gYHVzZXJzYAorICAgICAgdXNlcnNbMF0gPT09
IGJvYjsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBmaWx0ZXIKKyAgICBAc3Rh
dGljCisgICAgQGZvciBSU1ZQCisgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKKyAgICBAcGFy
YW0ge0Z1bmN0aW9ufSBmaWx0ZXJGbiAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIHJl
c29sdmVkIHZhbHVlIHRvCisgICAgZmlsdGVyIHRoZSBmaW5hbCByZXN1bHRzLgorICAgIEBwYXJh
bSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4g
VXNlZnVsIGZvcgorICAgIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0KKyAgKi8KKwor
ICBmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkgeworICAgIHJldHVy
biBfcnN2cFByb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMsIGxhYmVsKS50aGVuKGZ1bmN0aW9u
ICh2YWx1ZXMpIHsKKyAgICAgIGlmICghX3JzdnBVdGlscy5pc0Z1bmN0aW9uKGZpbHRlckZuKSkg
eworICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24g
YXMgZmlsdGVyJ3Mgc2Vjb25kIGFyZ3VtZW50LiIpOworICAgICAgfQorCisgICAgICB2YXIgbGVu
Z3RoID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgIHZhciBmaWx0ZXJlZCA9IG5ldyBBcnJheShsZW5n
dGgpOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAg
IGZpbHRlcmVkW2ldID0gZmlsdGVyRm4odmFsdWVzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0
dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LmFsbChmaWx0ZXJlZCwgbGFiZWwpLnRoZW4oZnVuY3Rp
b24gKGZpbHRlcmVkKSB7CisgICAgICAgIHZhciByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7
CisgICAgICAgIHZhciBuZXdMZW5ndGggPSAwOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoZmlsdGVyZWRbaV0pIHsKKyAgICAgICAg
ICAgIHJlc3VsdHNbbmV3TGVuZ3RoXSA9IHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG5ld0xlbmd0
aCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdHMubGVuZ3RoID0g
bmV3TGVuZ3RoOworCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgfSk7CisgICAgfSk7
CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL2hhc2gtc2V0dGxlZCcsIFsnZXhwb3J0cycsICdyc3Zw
L3Byb21pc2UnLCAncnN2cC9lbnVtZXJhdG9yJywgJ3JzdnAvcHJvbWlzZS1oYXNoJywgJ3JzdnAv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSwgX3JzdnBFbnVtZXJhdG9y
LCBfcnN2cFByb21pc2VIYXNoLCBfcnN2cFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBl
eHBvcnRzLmRlZmF1bHQgPSBoYXNoU2V0dGxlZDsKKworICBmdW5jdGlvbiBIYXNoU2V0dGxlZChD
b25zdHJ1Y3Rvciwgb2JqZWN0LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3Io
Q29uc3RydWN0b3IsIG9iamVjdCwgZmFsc2UsIGxhYmVsKTsKKyAgfQorCisgIEhhc2hTZXR0bGVk
LnByb3RvdHlwZSA9IF9yc3ZwVXRpbHMub19jcmVhdGUoX3JzdnBQcm9taXNlSGFzaC5kZWZhdWx0
LnByb3RvdHlwZSk7CisgIEhhc2hTZXR0bGVkLnByb3RvdHlwZS5fc3VwZXJDb25zdHJ1Y3RvciA9
IF9yc3ZwRW51bWVyYXRvci5kZWZhdWx0OworICBIYXNoU2V0dGxlZC5wcm90b3R5cGUuX21ha2VS
ZXN1bHQgPSBfcnN2cEVudW1lcmF0b3IubWFrZVNldHRsZWRSZXN1bHQ7CisKKyAgSGFzaFNldHRs
ZWQucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJu
IG5ldyBFcnJvcignaGFzaFNldHRsZWQgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QnKTsK
KyAgfTsKKworICAvKioKKyAgICBgUlNWUC5oYXNoU2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNW
UC5hbGxTZXR0bGVkYCwgYnV0IHRha2VzIGFuIG9iamVjdAorICAgIGluc3RlYWQgb2YgYW4gYXJy
YXkgZm9yIGl0cyBgcHJvbWlzZXNgIGFyZ3VtZW50LgorICAKKyAgICBVbmxpa2UgYFJTVlAuYWxs
YCBvciBgUlNWUC5oYXNoYCwgd2hpY2ggaW1wbGVtZW50IGEgZmFpbC1mYXN0IG1ldGhvZCwKKyAg
ICBidXQgbGlrZSBgUlNWUC5hbGxTZXR0bGVkYCwgYGhhc2hTZXR0bGVkYCB3YWl0cyB1bnRpbCBh
bGwgdGhlCisgICAgY29uc3RpdHVlbnQgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQgdGhlbiBz
aG93cyB5b3UgYWxsIHRoZSByZXN1bHRzCisgICAgd2l0aCB0aGVpciBzdGF0ZXMgYW5kIHZhbHVl
cy9yZWFzb25zLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworICAgIGhhbmRsZSBtdWx0
aXBsZSBwcm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIgYXMgYSBzZXQuCisgIAorICAg
IFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBw
cm9taXNlcyBoYXZlIGJlZW4KKyAgICBzZXR0bGVkLCBvciByZWplY3RlZCBpZiB0aGUgcGFzc2Vk
IHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCisgIAorICAgIFRoZSByZXR1cm5lZCBwcm9taXNlIGlz
IGZ1bGZpbGxlZCB3aXRoIGEgaGFzaCB0aGF0IGhhcyB0aGUgc2FtZSBrZXkgbmFtZXMgYXMKKyAg
ICB0aGUgYHByb21pc2VzYCBvYmplY3QgYXJndW1lbnQuIElmIGFueSBvZiB0aGUgdmFsdWVzIGlu
IHRoZSBvYmplY3QgYXJlIG5vdAorICAgIHByb21pc2VzLCB0aGV5IHdpbGwgYmUgY29waWVkIG92
ZXIgdG8gdGhlIGZ1bGZpbGxlZCBvYmplY3QgYW5kIG1hcmtlZCB3aXRoIHN0YXRlCisgICAgJ2Z1
bGZpbGxlZCcuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2
YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEp
LAorICAgICAgeW91clByb21pc2U6IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDIpLAorICAgICAgdGhl
aXJQcm9taXNlOiBSU1ZQLlByb21pc2UucmVzb2x2ZSgzKSwKKyAgICAgIG5vdEFQcm9taXNlOiA0
CisgICAgfTsKKyAgCisgICAgUlNWUC5oYXNoU2V0dGxlZChwcm9taXNlcykudGhlbihmdW5jdGlv
bihoYXNoKXsKKyAgICAgIC8vIGhhc2ggaGVyZSBpcyBhbiBvYmplY3QgdGhhdCBsb29rcyBsaWtl
OgorICAgICAgLy8geworICAgICAgLy8gICBteVByb21pc2U6IHsgc3RhdGU6ICdmdWxmaWxsZWQn
LCB2YWx1ZTogMSB9LAorICAgICAgLy8gICB5b3VyUHJvbWlzZTogeyBzdGF0ZTogJ2Z1bGZpbGxl
ZCcsIHZhbHVlOiAyIH0sCisgICAgICAvLyAgIHRoZWlyUHJvbWlzZTogeyBzdGF0ZTogJ2Z1bGZp
bGxlZCcsIHZhbHVlOiAzIH0sCisgICAgICAvLyAgIG5vdEFQcm9taXNlOiB7IHN0YXRlOiAnZnVs
ZmlsbGVkJywgdmFsdWU6IDQgfQorICAgICAgLy8gfQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJlamVj
dGVkLCB0aGUgc3RhdGUgd2lsbAorICAgIGJlIHNldCB0byAncmVqZWN0ZWQnIGFuZCB0aGUgcmVh
c29uIGZvciByZWplY3Rpb24gcHJvdmlkZWQuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAgIGBg
YGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJTVlAu
UHJvbWlzZS5yZXNvbHZlKDEpLAorICAgICAgcmVqZWN0ZWRQcm9taXNlOiBSU1ZQLlByb21pc2Uu
cmVqZWN0KG5ldyBFcnJvcigncmVqZWN0aW9uJykpLAorICAgICAgYW5vdGhlclJlamVjdGVkUHJv
bWlzZTogUlNWUC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ21vcmUgcmVqZWN0aW9uJykpLAor
ICAgIH07CisgIAorICAgIFJTVlAuaGFzaFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24o
aGFzaCl7CisgICAgICAvLyBoYXNoIGhlcmUgaXMgYW4gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToK
KyAgICAgIC8vIHsKKyAgICAgIC8vICAgbXlQcm9taXNlOiAgICAgICAgICAgICAgeyBzdGF0ZTog
J2Z1bGZpbGxlZCcsIHZhbHVlOiAxIH0sCisgICAgICAvLyAgIHJlamVjdGVkUHJvbWlzZTogICAg
ICAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJlYXNvbjogRXJyb3IgfSwKKyAgICAgIC8vICAgYW5v
dGhlclJlamVjdGVkUHJvbWlzZTogeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJvciB9
LAorICAgICAgLy8gfQorICAgICAgLy8gTm90ZSB0aGF0IGZvciByZWplY3RlZFByb21pc2UsIHJl
YXNvbi5tZXNzYWdlID09ICdyZWplY3Rpb24nLAorICAgICAgLy8gYW5kIGZvciBhbm90aGVyUmVq
ZWN0ZWRQcm9taXNlLCByZWFzb24ubWVzc2FnZSA9PSAnbW9yZSByZWplY3Rpb24nLgorICAgIH0p
OworICAgIGBgYAorICAKKyAgICBBbiBpbXBvcnRhbnQgbm90ZTogYFJTVlAuaGFzaFNldHRsZWRg
IGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMgdGhhdAorICAgIGFyZSBq
dXN0IGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcy4gYFJTVlAuaGFzaFNldHRsZWRgIHdpbGwgTk9U
IHByZXNlcnZlIHByb3RvdHlwZQorICAgIGNoYWlucy4KKyAgCisgICAgRXhhbXBsZToKKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXsKKyAgICAgIHRo
aXMuZXhhbXBsZSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKCdFeGFtcGxlJyk7CisgICAgfQorICAK
KyAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHsKKyAgICAgIHByb3RvUHJvcGVydHk6IFJT
VlAuUHJvbWlzZS5yZXNvbHZlKCdQcm90byBQcm9wZXJ0eScpCisgICAgfTsKKyAgCisgICAgdmFy
IG15T2JqZWN0ID0gbmV3IE15Q29uc3RydWN0b3IoKTsKKyAgCisgICAgUlNWUC5oYXNoU2V0dGxl
ZChteU9iamVjdCkudGhlbihmdW5jdGlvbihoYXNoKXsKKyAgICAgIC8vIHByb3RvUHJvcGVydHkg
d2lsbCBub3QgYmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUgYW4KKyAgICAg
IC8vIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6CisgICAgICAvLyB7CisgICAgICAvLyAgIGV4YW1w
bGU6IHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogJ0V4YW1wbGUnIH0KKyAgICAgIC8vIH0K
KyAgICAgIC8vCisgICAgICAvLyBoYXNoLmhhc093blByb3BlcnR5KCdwcm90b1Byb3BlcnR5Jyk7
IC8vIGZhbHNlCisgICAgICAvLyAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGhhc2gucHJvdG9Qcm9w
ZXJ0eQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIGhhc2hTZXR0bGVkCisgICAg
QGZvciBSU1ZQCisgICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdAorICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHByb21pc2UuCisgICAg
VXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBp
cyBmdWxmaWxsZWQgd2hlbiB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKKyAgICBo
YXZlIGJlZW4gc2V0dGxlZC4KKyAgICBAc3RhdGljCisgICovCisKKyAgZnVuY3Rpb24gaGFzaFNl
dHRsZWQob2JqZWN0LCBsYWJlbCkgeworICAgIHJldHVybiBuZXcgSGFzaFNldHRsZWQoX3JzdnBQ
cm9taXNlLmRlZmF1bHQsIG9iamVjdCwgbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5pZmVk
KCdyc3ZwL2hhc2gnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJywgJ3JzdnAvcHJvbWlzZS1o
YXNoJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwUHJvbWlzZUhhc2gp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGhhc2g7CisKKyAgLyoq
CisgICAgYFJTVlAuaGFzaGAgaXMgc2ltaWxhciB0byBgUlNWUC5hbGxgLCBidXQgdGFrZXMgYW4g
b2JqZWN0IGluc3RlYWQgb2YgYW4gYXJyYXkKKyAgICBmb3IgaXRzIGBwcm9taXNlc2AgYXJndW1l
bnQuCisgIAorICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxs
IHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KKyAgICBmdWxmaWxsZWQsIG9yIHJlamVjdGVk
IGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC4gVGhlIHJldHVybmVkIHByb21pc2UKKyAg
ICBpcyBmdWxmaWxsZWQgd2l0aCBhIGhhc2ggdGhhdCBoYXMgdGhlIHNhbWUga2V5IG5hbWVzIGFz
IHRoZSBgcHJvbWlzZXNgIG9iamVjdAorICAgIGFyZ3VtZW50LiBJZiBhbnkgb2YgdGhlIHZhbHVl
cyBpbiB0aGUgb2JqZWN0IGFyZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAorICAgIHNpbXBseSBi
ZSBjb3BpZWQgb3ZlciB0byB0aGUgZnVsZmlsbGVkIG9iamVjdC4KKyAgCisgICAgRXhhbXBsZToK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlcyA9IHsKKyAgICAgIG15UHJv
bWlzZTogUlNWUC5yZXNvbHZlKDEpLAorICAgICAgeW91clByb21pc2U6IFJTVlAucmVzb2x2ZSgy
KSwKKyAgICAgIHRoZWlyUHJvbWlzZTogUlNWUC5yZXNvbHZlKDMpLAorICAgICAgbm90QVByb21p
c2U6IDQKKyAgICB9OworICAKKyAgICBSU1ZQLmhhc2gocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24o
aGFzaCl7CisgICAgICAvLyBoYXNoIGhlcmUgaXMgYW4gb2JqZWN0IHRoYXQgbG9va3MgbGlrZToK
KyAgICAgIC8vIHsKKyAgICAgIC8vICAgbXlQcm9taXNlOiAxLAorICAgICAgLy8gICB5b3VyUHJv
bWlzZTogMiwKKyAgICAgIC8vICAgdGhlaXJQcm9taXNlOiAzLAorICAgICAgLy8gICBub3RBUHJv
bWlzZTogNAorICAgICAgLy8gfQorICAgIH0pOworICAgIGBgYGAKKyAgCisgICAgSWYgYW55IG9m
IHRoZSBgcHJvbWlzZXNgIGdpdmVuIHRvIGBSU1ZQLmhhc2hgIGFyZSByZWplY3RlZCwgdGhlIGZp
cnN0IHByb21pc2UKKyAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgdGhlIHJl
YXNvbiB0byB0aGUgcmVqZWN0aW9uIGhhbmRsZXIuCisgIAorICAgIEV4YW1wbGU6CisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZXMgPSB7CisgICAgICBteVByb21pc2U6IFJT
VlAucmVzb2x2ZSgxKSwKKyAgICAgIHJlamVjdGVkUHJvbWlzZTogUlNWUC5yZWplY3QobmV3IEVy
cm9yKCdyZWplY3RlZFByb21pc2UnKSksCisgICAgICBhbm90aGVyUmVqZWN0ZWRQcm9taXNlOiBS
U1ZQLnJlamVjdChuZXcgRXJyb3IoJ2Fub3RoZXJSZWplY3RlZFByb21pc2UnKSksCisgICAgfTsK
KyAgCisgICAgUlNWUC5oYXNoKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGhhc2gpeworICAgICAg
Ly8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlz
ZXMhCisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICAvLyByZWFzb24ubWVzc2FnZSA9
PT0gJ3JlamVjdGVkUHJvbWlzZScKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQW4gaW1wb3J0
YW50IG5vdGU6IGBSU1ZQLmhhc2hgIGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9i
amVjdHMgdGhhdAorICAgIGFyZSBqdXN0IGEgc2V0IG9mIGtleXMgYW5kIHZhbHVlcy4gYFJTVlAu
aGFzaGAgd2lsbCBOT1QgcHJlc2VydmUgcHJvdG90eXBlCisgICAgY2hhaW5zLgorICAKKyAgICBF
eGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgICAgZnVuY3Rpb24gTXlDb25zdHJ1Y3Rv
cigpeworICAgICAgdGhpcy5leGFtcGxlID0gUlNWUC5yZXNvbHZlKCdFeGFtcGxlJyk7CisgICAg
fQorICAKKyAgICBNeUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHsKKyAgICAgIHByb3RvUHJvcGVy
dHk6IFJTVlAucmVzb2x2ZSgnUHJvdG8gUHJvcGVydHknKQorICAgIH07CisgIAorICAgIHZhciBt
eU9iamVjdCA9IG5ldyBNeUNvbnN0cnVjdG9yKCk7CisgIAorICAgIFJTVlAuaGFzaChteU9iamVj
dCkudGhlbihmdW5jdGlvbihoYXNoKXsKKyAgICAgIC8vIHByb3RvUHJvcGVydHkgd2lsbCBub3Qg
YmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUgYW4KKyAgICAgIC8vIG9iamVj
dCB0aGF0IGxvb2tzIGxpa2U6CisgICAgICAvLyB7CisgICAgICAvLyAgIGV4YW1wbGU6ICdFeGFt
cGxlJworICAgICAgLy8gfQorICAgICAgLy8KKyAgICAgIC8vIGhhc2guaGFzT3duUHJvcGVydHko
J3Byb3RvUHJvcGVydHknKTsgLy8gZmFsc2UKKyAgICAgIC8vICd1bmRlZmluZWQnID09PSB0eXBl
b2YgaGFzaC5wcm90b1Byb3BlcnR5CisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEBtZXRob2Qg
aGFzaAorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBAcGFyYW0ge09iamVjdH0gb2Jq
ZWN0CisgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyB0aGF0IGRlc2Ny
aWJlcyB0aGUgcHJvbWlzZS4KKyAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7
UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9m
IGBwcm9taXNlc2AKKyAgICBoYXZlIGJlZW4gZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkg
b2YgdGhlbSBiZWNvbWUgcmVqZWN0ZWQuCisgICovCisKKyAgZnVuY3Rpb24gaGFzaChvYmplY3Qs
IGxhYmVsKSB7CisgICAgcmV0dXJuIG5ldyBfcnN2cFByb21pc2VIYXNoLmRlZmF1bHQoX3JzdnBQ
cm9taXNlLmRlZmF1bHQsIG9iamVjdCwgbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5pZmVk
KCdyc3ZwL2luc3RydW1lbnQnLCBbJ2V4cG9ydHMnLCAncnN2cC9jb25maWcnLCAncnN2cC91dGls
cyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBDb25maWcsIF9yc3ZwVXRpbHMpIHsKKyAgJ3Vz
ZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGluc3RydW1lbnQ7CisKKyAgdmFyIHF1
ZXVlID0gW107CisKKyAgZnVuY3Rpb24gc2NoZWR1bGVGbHVzaCgpIHsKKyAgICBzZXRUaW1lb3V0
KGZ1bmN0aW9uICgpIHsKKyAgICAgIHZhciBlbnRyeTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcXVldWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSBxdWV1ZVtpXTsKKworICAg
ICAgICB2YXIgcGF5bG9hZCA9IGVudHJ5LnBheWxvYWQ7CisKKyAgICAgICAgcGF5bG9hZC5ndWlk
ID0gcGF5bG9hZC5rZXkgKyBwYXlsb2FkLmlkOworICAgICAgICBwYXlsb2FkLmNoaWxkR3VpZCA9
IHBheWxvYWQua2V5ICsgcGF5bG9hZC5jaGlsZElkOworICAgICAgICBpZiAocGF5bG9hZC5lcnJv
cikgeworICAgICAgICAgIHBheWxvYWQuc3RhY2sgPSBwYXlsb2FkLmVycm9yLnN0YWNrOworICAg
ICAgICB9CisKKyAgICAgICAgX3JzdnBDb25maWcuY29uZmlnWyd0cmlnZ2VyJ10oZW50cnkubmFt
ZSwgZW50cnkucGF5bG9hZCk7CisgICAgICB9CisgICAgICBxdWV1ZS5sZW5ndGggPSAwOworICAg
IH0sIDUwKTsKKyAgfQorCisgIGZ1bmN0aW9uIGluc3RydW1lbnQoZXZlbnROYW1lLCBwcm9taXNl
LCBjaGlsZCkgeworICAgIGlmICgxID09PSBxdWV1ZS5wdXNoKHsKKyAgICAgIG5hbWU6IGV2ZW50
TmFtZSwKKyAgICAgIHBheWxvYWQ6IHsKKyAgICAgICAga2V5OiBwcm9taXNlLl9ndWlkS2V5LAor
ICAgICAgICBpZDogcHJvbWlzZS5faWQsCisgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAor
ICAgICAgICBkZXRhaWw6IHByb21pc2UuX3Jlc3VsdCwKKyAgICAgICAgY2hpbGRJZDogY2hpbGQg
JiYgY2hpbGQuX2lkLAorICAgICAgICBsYWJlbDogcHJvbWlzZS5fbGFiZWwsCisgICAgICAgIHRp
bWVTdGFtcDogX3JzdnBVdGlscy5ub3coKSwKKyAgICAgICAgZXJyb3I6IF9yc3ZwQ29uZmlnLmNv
bmZpZ1siaW5zdHJ1bWVudC13aXRoLXN0YWNrIl0gPyBuZXcgRXJyb3IocHJvbWlzZS5fbGFiZWwp
IDogbnVsbAorICAgICAgfSB9KSkgeworICAgICAgc2NoZWR1bGVGbHVzaCgpOworICAgIH0KKyAg
fQorfSk7CitlbmlmZWQoJ3JzdnAvbWFwJywgWydleHBvcnRzJywgJ3JzdnAvcHJvbWlzZScsICdy
c3ZwL3V0aWxzJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFByb21pc2UsIF9yc3ZwVXRpbHMp
IHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IG1hcDsKKworICAvKioK
KyAgIGBSU1ZQLm1hcGAgaXMgc2ltaWxhciB0byBKYXZhU2NyaXB0J3MgbmF0aXZlIGBtYXBgIG1l
dGhvZCwgZXhjZXB0IHRoYXQgaXQKKyAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29t
ZSBmdWxmaWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBtYXBGbmAgb24KKyAgICBlYWNoIGl0ZW0g
aW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAubWFwYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0
IHdpbGwKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGBt
YXBGbmAgb24gdGhlIHZhbHVlcyB0aGUgcHJvbWlzZXMKKyAgICBiZWNvbWUgZnVsZmlsbGVkIHdp
dGguCisgIAorICAgIEZvciBleGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0CisgIAorICAg
IHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQ
LnJlc29sdmUoMik7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMpOworICAgIHZh
ciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOworICAKKyAgICB2
YXIgbWFwRm4gPSBmdW5jdGlvbihpdGVtKXsKKyAgICAgIHJldHVybiBpdGVtICsgMTsKKyAgICB9
OworICAKKyAgICBSU1ZQLm1hcChwcm9taXNlcywgbWFwRm4pLnRoZW4oZnVuY3Rpb24ocmVzdWx0
KXsKKyAgICAgIC8vIHJlc3VsdCBpcyBbIDIsIDMsIDQgXQorICAgIH0pOworICAgIGBgYAorICAK
KyAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAubWFwYCBhcmUgcmVq
ZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCisgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJlIGdp
dmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSByZXR1cm5lZCBwcm9taXNlJ3MKKyAgICByZWplY3Rp
b24gaGFuZGxlci4gRm9yIGV4YW1wbGU6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIg
cHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7CisgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZWpl
Y3QobmV3IEVycm9yKCcyJykpOworICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0KG5ldyBF
cnJvcignMycpKTsKKyAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJv
bWlzZTMgXTsKKyAgCisgICAgdmFyIG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7CisgICAgICByZXR1
cm4gaXRlbSArIDE7CisgICAgfTsKKyAgCisgICAgUlNWUC5tYXAocHJvbWlzZXMsIG1hcEZuKS50
aGVuKGZ1bmN0aW9uKGFycmF5KXsKKyAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1
c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQorICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikg
eworICAgICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICcyJworICAgIH0pOworICAgIGBgYAorICAK
KyAgICBgUlNWUC5tYXBgIHdpbGwgYWxzbyB3YWl0IGlmIGEgcHJvbWlzZSBpcyByZXR1cm5lZCBm
cm9tIGBtYXBGbmAuIEZvciBleGFtcGxlLAorICAgIHNheSB5b3Ugd2FudCB0byBnZXQgYWxsIGNv
bW1lbnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywgYnV0IHlvdSBuZWVkCisgICAgdGhlIGJs
b2cgcG9zdHMgZmlyc3QgYmVjYXVzZSB0aGV5IGNvbnRhaW4gYSB1cmwgdG8gdGhvc2UgY29tbWVu
dHMuCisgIAorICAgIGBgYGphdnNjcmlwdAorICAKKyAgICB2YXIgbWFwRm4gPSBmdW5jdGlvbihi
bG9nUG9zdCl7CisgICAgICAvLyBnZXRDb21tZW50cyBkb2VzIHNvbWUgYWpheCBhbmQgcmV0dXJu
cyBhbiBSU1ZQLlByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQKKyAgICAgIC8vIHdpdGggc29tZSBj
b21tZW50cyBkYXRhCisgICAgICByZXR1cm4gZ2V0Q29tbWVudHMoYmxvZ1Bvc3QuY29tbWVudHNf
dXJsKTsKKyAgICB9OworICAKKyAgICAvLyBnZXRCbG9nUG9zdHMgZG9lcyBzb21lIGFqYXggYW5k
IHJldHVybnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkCisgICAgLy8gd2l0aCBz
b21lIGJsb2cgcG9zdCBkYXRhCisgICAgUlNWUC5tYXAoZ2V0QmxvZ1Bvc3RzKCksIG1hcEZuKS50
aGVuKGZ1bmN0aW9uKGNvbW1lbnRzKXsKKyAgICAgIC8vIGNvbW1lbnRzIGlzIHRoZSByZXN1bHQg
b2YgYXNraW5nIHRoZSBzZXJ2ZXIgZm9yIHRoZSBjb21tZW50cworICAgICAgLy8gb2YgYWxsIGJs
b2cgcG9zdHMgcmV0dXJuZWQgZnJvbSBnZXRCbG9nUG9zdHMoKQorICAgIH0pOworICAgIGBgYAor
ICAKKyAgICBAbWV0aG9kIG1hcAorICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBAcGFy
YW0ge0FycmF5fSBwcm9taXNlcworICAgIEBwYXJhbSB7RnVuY3Rpb259IG1hcEZuIGZ1bmN0aW9u
IHRvIGJlIGNhbGxlZCBvbiBlYWNoIGZ1bGZpbGxlZCBwcm9taXNlLgorICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgorICAg
IFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQg
aXMgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisgICAgYG1hcEZuYCBvbiBl
YWNoIGZ1bGZpbGxlZCBwcm9taXNlIG9yIHZhbHVlIHdoZW4gdGhleSBiZWNvbWUgZnVsZmlsbGVk
LgorICAgICBUaGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIGlmIGFueSBvZiB0aGUgZ2l2ZW4g
YHByb21pc2VzYCBiZWNvbWUgcmVqZWN0ZWQuCisgICAgQHN0YXRpYworICAqLworCisgIGZ1bmN0
aW9uIG1hcChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlz
ZS5kZWZhdWx0LmFsbChwcm9taXNlcywgbGFiZWwpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykgewor
ICAgICAgaWYgKCFfcnN2cFV0aWxzLmlzRnVuY3Rpb24obWFwRm4pKSB7CisgICAgICAgIHRocm93
IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBtYXAncyBzZWNvbmQg
YXJndW1lbnQuIik7CisgICAgICB9CisKKyAgICAgIHZhciBsZW5ndGggPSB2YWx1ZXMubGVuZ3Ro
OworICAgICAgdmFyIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICByZXN1bHRzW2ldID0gbWFwRm4o
dmFsdWVzW2ldKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0
LmFsbChyZXN1bHRzLCBsYWJlbCk7CisgICAgfSk7CisgIH0KK30pOworZW5pZmVkKCdyc3ZwL25v
ZGUnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJywgJ3JzdnAvLWludGVybmFsJywgJ3JzdnAv
dXRpbHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSwgX3JzdnBJbnRlcm5hbCwg
X3JzdnBVdGlscykgeworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gZGVu
b2RlaWZ5OworCisgIGZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlz
ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsg
aSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9i
amVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAm
JiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3Qu
ZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH0KKworICBm
dW5jdGlvbiBSZXN1bHQoKSB7CisgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKKyAgfQorCisg
IHZhciBFUlJPUiA9IG5ldyBSZXN1bHQoKTsKKyAgdmFyIEdFVF9USEVOX0VSUk9SID0gbmV3IFJl
c3VsdCgpOworCisgIGZ1bmN0aW9uIGdldFRoZW4ob2JqKSB7CisgICAgdHJ5IHsKKyAgICAgIHJl
dHVybiBvYmoudGhlbjsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgRVJST1IudmFsdWUg
PSBlcnJvcjsKKyAgICAgIHJldHVybiBFUlJPUjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiB0
cnlBcHBseShmLCBzLCBhKSB7CisgICAgdHJ5IHsKKyAgICAgIGYuYXBwbHkocywgYSk7CisgICAg
fSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIEVSUk9SLnZhbHVlID0gZXJyb3I7CisgICAgICByZXR1
cm4gRVJST1I7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbWFrZU9iamVjdChfLCBhcmd1bWVu
dE5hbWVzKSB7CisgICAgdmFyIG9iaiA9IHt9OworICAgIHZhciBuYW1lOworICAgIHZhciBpOwor
ICAgIHZhciBsZW5ndGggPSBfLmxlbmd0aDsKKyAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW5n
dGgpOworCisgICAgZm9yICh2YXIgeCA9IDA7IHggPCBsZW5ndGg7IHgrKykgeworICAgICAgYXJn
c1t4XSA9IF9beF07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50TmFtZXMu
bGVuZ3RoOyBpKyspIHsKKyAgICAgIG5hbWUgPSBhcmd1bWVudE5hbWVzW2ldOworICAgICAgb2Jq
W25hbWVdID0gYXJnc1tpICsgMV07CisgICAgfQorCisgICAgcmV0dXJuIG9iajsKKyAgfQorCisg
IGZ1bmN0aW9uIGFycmF5UmVzdWx0KF8pIHsKKyAgICB2YXIgbGVuZ3RoID0gXy5sZW5ndGg7Cisg
ICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoIC0gMSk7CisKKyAgICBmb3IgKHZhciBpID0g
MTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBhcmdzW2kgLSAxXSA9IF9baV07CisgICAgfQor
CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKworICBmdW5jdGlvbiB3cmFwVGhlbmFibGUodGhlbiwg
cHJvbWlzZSkgeworICAgIHJldHVybiB7CisgICAgICB0aGVuOiBmdW5jdGlvbiAob25GdWxGaWxs
bWVudCwgb25SZWplY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHRoZW4uY2FsbChwcm9taXNlLCBv
bkZ1bEZpbGxtZW50LCBvblJlamVjdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8q
KgorICAgIGBSU1ZQLmRlbm9kZWlmeWAgdGFrZXMgYSAnbm9kZS1zdHlsZScgZnVuY3Rpb24gYW5k
IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0CisgICAgd2lsbCByZXR1cm4gYW4gYFJTVlAuUHJvbWlz
ZWAuIFlvdSBjYW4gdXNlIGBkZW5vZGVpZnlgIGluIE5vZGUuanMgb3IgdGhlCisgICAgYnJvd3Nl
ciB3aGVuIHlvdSdkIHByZWZlciB0byB1c2UgcHJvbWlzZXMgb3ZlciB1c2luZyBjYWxsYmFja3Mu
IEZvciBleGFtcGxlLAorICAgIGBkZW5vZGVpZnlgIHRyYW5zZm9ybXMgdGhlIGZvbGxvd2luZzoK
KyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgIAor
ICAgIGZzLnJlYWRGaWxlKCdteWZpbGUudHh0JywgZnVuY3Rpb24oZXJyLCBkYXRhKXsKKyAgICAg
IGlmIChlcnIpIHJldHVybiBoYW5kbGVFcnJvcihlcnIpOworICAgICAgaGFuZGxlRGF0YShkYXRh
KTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgaW50bzoKKyAgCisgICAgYGBgamF2YXNjcmlw
dAorICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgICAgdmFyIHJlYWRGaWxlID0gUlNWUC5k
ZW5vZGVpZnkoZnMucmVhZEZpbGUpOworICAKKyAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcpLnRo
ZW4oaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IpOworICAgIGBgYAorICAKKyAgICBJZiB0aGUgbm9k
ZSBmdW5jdGlvbiBoYXMgbXVsdGlwbGUgc3VjY2VzcyBwYXJhbWV0ZXJzLCB0aGVuIGBkZW5vZGVp
ZnlgCisgICAganVzdCByZXR1cm5zIHRoZSBmaXJzdCBvbmU6CisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgcmVxdWVzdCA9IFJTVlAuZGVub2RlaWZ5KHJlcXVpcmUoJ3JlcXVlc3QnKSk7
CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24ocmVz
KSB7CisgICAgICAvLyAuLi4KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSG93ZXZlciwgaWYg
eW91IG5lZWQgYWxsIHN1Y2Nlc3MgcGFyYW1ldGVycywgc2V0dGluZyBgZGVub2RlaWZ5YCdzCisg
ICAgc2Vjb25kIHBhcmFtZXRlciB0byBgdHJ1ZWAgY2F1c2VzIGl0IHRvIHJldHVybiBhbGwgc3Vj
Y2VzcyBwYXJhbWV0ZXJzCisgICAgYXMgYW4gYXJyYXk6CisgIAorICAgIGBgYGphdmFzY3JpcHQK
KyAgICB2YXIgcmVxdWVzdCA9IFJTVlAuZGVub2RlaWZ5KHJlcXVpcmUoJ3JlcXVlc3QnKSwgdHJ1
ZSk7CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24o
cmVzdWx0KSB7CisgICAgICAvLyByZXN1bHRbMF0gLT4gcmVzCisgICAgICAvLyByZXN1bHRbMV0g
LT4gYm9keQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBPciBpZiB5b3UgcGFzcyBpdCBhbiBh
cnJheSB3aXRoIG5hbWVzIGl0IHJldHVybnMgdGhlIHBhcmFtZXRlcnMgYXMgYSBoYXNoOgorICAK
KyAgICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHJlcXVlc3QgPSBSU1ZQLmRlbm9kZWlmeShyZXF1
aXJlKCdyZXF1ZXN0JyksIFsncmVzJywgJ2JvZHknXSk7CisgIAorICAgIHJlcXVlc3QoJ2h0dHA6
Ly9leGFtcGxlLmNvbScpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAvLyByZXN1bHQu
cmVzCisgICAgICAvLyByZXN1bHQuYm9keQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBTb21l
dGltZXMgeW91IG5lZWQgdG8gcmV0YWluIHRoZSBgdGhpc2A6CisgIAorICAgIGBgYGphdmFzY3Jp
cHQKKyAgICB2YXIgYXBwID0gcmVxdWlyZSgnZXhwcmVzcycpKCk7CisgICAgdmFyIHJlbmRlciA9
IFJTVlAuZGVub2RlaWZ5KGFwcC5yZW5kZXIuYmluZChhcHApKTsKKyAgICBgYGAKKyAgCisgICAg
VGhlIGRlbm9kaWZpZWQgZnVuY3Rpb24gaW5oZXJpdHMgZnJvbSB0aGUgb3JpZ2luYWwgZnVuY3Rp
b24uIEl0IHdvcmtzIGluIGFsbAorICAgIGVudmlyb25tZW50cywgZXhjZXB0IElFIDEwIGFuZCBi
ZWxvdy4gQ29uc2VxdWVudGx5IGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbAorICAgIGZ1
bmN0aW9uIGFyZSBhdmFpbGFibGUgdG8geW91LiBIb3dldmVyLCBhbnkgcHJvcGVydGllcyB5b3Ug
Y2hhbmdlIG9uIHRoZQorICAgIGRlbm9kZWlmaWVkIGZ1bmN0aW9uIHdvbid0IGJlIGNoYW5nZWQg
b24gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiBFeGFtcGxlOgorICAKKyAgICBgYGBqYXZhc2NyaXB0
CisgICAgdmFyIHJlcXVlc3QgPSBSU1ZQLmRlbm9kZWlmeShyZXF1aXJlKCdyZXF1ZXN0JykpLAor
ICAgICAgICBjb29raWVKYXIgPSByZXF1ZXN0LmphcigpOyAvLyA8LSBJbmhlcml0YW5jZSBpcyB1
c2VkIGhlcmUKKyAgCisgICAgcmVxdWVzdCgnaHR0cDovL2V4YW1wbGUuY29tJywge2phcjogY29v
a2llSmFyfSkudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIC8vIGNvb2tpZUphci5jb29raWVz
IGhvbGRzIG5vdyB0aGUgY29va2llcyByZXR1cm5lZCBieSBleGFtcGxlLmNvbQorICAgIH0pOwor
ICAgIGBgYAorICAKKyAgICBVc2luZyBgZGVub2RlaWZ5YCBtYWtlcyBpdCBlYXNpZXIgdG8gY29t
cG9zZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbnN0ZWFkCisgICAgb2YgdXNpbmcgY2FsbGJh
Y2tzLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CisgIAorICAgIGZzLnJlYWRGaWxlKCdteWZpbGUudHh0
JywgZnVuY3Rpb24oZXJyLCBkYXRhKXsKKyAgICAgIGlmIChlcnIpIHsgLi4uIH0gLy8gSGFuZGxl
IGVycm9yCisgICAgICBmcy53cml0ZUZpbGUoJ215ZmlsZTIudHh0JywgZGF0YSwgZnVuY3Rpb24o
ZXJyKXsKKyAgICAgICAgaWYgKGVycikgeyAuLi4gfSAvLyBIYW5kbGUgZXJyb3IKKyAgICAgICAg
Y29uc29sZS5sb2coJ2RvbmUnKQorICAgICAgfSk7CisgICAgfSk7CisgICAgYGBgCisgIAorICAg
IHlvdSBjYW4gY2hhaW4gdGhlIG9wZXJhdGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20g
dGhlIHJldHVybmVkIHByb21pc2U6CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgZnMg
PSByZXF1aXJlKCdmcycpOworICAgIHZhciByZWFkRmlsZSA9IFJTVlAuZGVub2RlaWZ5KGZzLnJl
YWRGaWxlKTsKKyAgICB2YXIgd3JpdGVGaWxlID0gUlNWUC5kZW5vZGVpZnkoZnMud3JpdGVGaWxl
KTsKKyAgCisgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0aW9uKGRhdGEpewor
ICAgICAgcmV0dXJuIHdyaXRlRmlsZSgnbXlmaWxlMi50eHQnLCBkYXRhKTsKKyAgICB9KS50aGVu
KGZ1bmN0aW9uKCl7CisgICAgICBjb25zb2xlLmxvZygnZG9uZScpCisgICAgfSkuY2F0Y2goZnVu
Y3Rpb24oZXJyb3IpeworICAgICAgLy8gSGFuZGxlIGVycm9yCisgICAgfSk7CisgICAgYGBgCisg
IAorICAgIEBtZXRob2QgZGVub2RlaWZ5CisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAg
IEBwYXJhbSB7RnVuY3Rpb259IG5vZGVGdW5jIGEgJ25vZGUtc3R5bGUnIGZ1bmN0aW9uIHRoYXQg
dGFrZXMgYSBjYWxsYmFjayBhcworICAgIGl0cyBsYXN0IGFyZ3VtZW50LiBUaGUgY2FsbGJhY2sg
ZXhwZWN0cyBhbiBlcnJvciB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0CisgICAgYXJndW1lbnQg
KGlmIGFuIGVycm9yIG9jY3VycmVkLCBvdGhlcndpc2UgbnVsbCksIGFuZCB0aGUgdmFsdWUgZnJv
bSB0aGUKKyAgICBvcGVyYXRpb24gYXMgaXRzIHNlY29uZCBhcmd1bWVudCAoJ2Z1bmN0aW9uKGVy
ciwgdmFsdWUpeyB9JykuCisgICAgQHBhcmFtIHtCb29sZWFufEFycmF5fSBbb3B0aW9uc10gQW4g
b3B0aW9uYWwgcGFyYW10ZXIgdGhhdCBpZiBzZXQKKyAgICB0byBgdHJ1ZWAgY2F1c2VzIHRoZSBw
cm9taXNlIHRvIGZ1bGZpbGwgd2l0aCB0aGUgY2FsbGJhY2sncyBzdWNjZXNzIGFyZ3VtZW50cwor
ICAgIGFzIGFuIGFycmF5LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgbm9kZSBmdW5jdGlvbiBoYXMg
bXVsdGlwbGUgc3VjY2VzcworICAgIHBhcmFtdGVycy4gSWYgeW91IHNldCB0aGlzIHBhcmFtdGVy
IHRvIGFuIGFycmF5IHdpdGggbmFtZXMsIHRoZSBwcm9taXNlIHdpbGwKKyAgICBmdWxmaWxsIHdp
dGggYSBoYXNoIHdpdGggdGhlc2UgbmFtZXMgYXMga2V5cyBhbmQgdGhlIHN1Y2Nlc3MgcGFyYW1l
dGVycyBhcworICAgIHZhbHVlcy4KKyAgICBAcmV0dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0
aGF0IHdyYXBzIGBub2RlRnVuY2AgdG8gcmV0dXJuIGFuCisgICAgYFJTVlAuUHJvbWlzZWAKKyAg
ICBAc3RhdGljCisgICovCisKKyAgZnVuY3Rpb24gZGVub2RlaWZ5KG5vZGVGdW5jLCBvcHRpb25z
KSB7CisgICAgdmFyIGZuID0gZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHNlbGYgPSB0aGlzOwor
ICAgICAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoOworICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJy
YXkobCArIDEpOworICAgICAgdmFyIGFyZzsKKyAgICAgIHZhciBwcm9taXNlSW5wdXQgPSBmYWxz
ZTsKKworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyArK2kpIHsKKyAgICAgICAgYXJnID0g
YXJndW1lbnRzW2ldOworCisgICAgICAgIGlmICghcHJvbWlzZUlucHV0KSB7CisgICAgICAgICAg
Ly8gVE9ETzogY2xlYW4gdGhpcyB1cAorICAgICAgICAgIHByb21pc2VJbnB1dCA9IG5lZWRzUHJv
bWlzZUlucHV0KGFyZyk7CisgICAgICAgICAgaWYgKHByb21pc2VJbnB1dCA9PT0gR0VUX1RIRU5f
RVJST1IpIHsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IF9yc3ZwUHJvbWlzZS5kZWZhdWx0KF9y
c3ZwSW50ZXJuYWwubm9vcCk7CisgICAgICAgICAgICBfcnN2cEludGVybmFsLnJlamVjdChwLCBH
RVRfVEhFTl9FUlJPUi52YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICB9
IGVsc2UgaWYgKHByb21pc2VJbnB1dCAmJiBwcm9taXNlSW5wdXQgIT09IHRydWUpIHsKKyAgICAg
ICAgICAgIGFyZyA9IHdyYXBUaGVuYWJsZShwcm9taXNlSW5wdXQsIGFyZyk7CisgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIGFyZ3NbaV0gPSBhcmc7CisgICAgICB9CisKKyAgICAgIHZh
ciBwcm9taXNlID0gbmV3IF9yc3ZwUHJvbWlzZS5kZWZhdWx0KF9yc3ZwSW50ZXJuYWwubm9vcCk7
CisKKyAgICAgIGFyZ3NbbF0gPSBmdW5jdGlvbiAoZXJyLCB2YWwpIHsKKyAgICAgICAgaWYgKGVy
cikgX3JzdnBJbnRlcm5hbC5yZWplY3QocHJvbWlzZSwgZXJyKTtlbHNlIGlmIChvcHRpb25zID09
PSB1bmRlZmluZWQpIF9yc3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCB2YWwpO2Vsc2UgaWYg
KG9wdGlvbnMgPT09IHRydWUpIF9yc3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCBhcnJheVJl
c3VsdChhcmd1bWVudHMpKTtlbHNlIGlmIChfcnN2cFV0aWxzLmlzQXJyYXkob3B0aW9ucykpIF9y
c3ZwSW50ZXJuYWwucmVzb2x2ZShwcm9taXNlLCBtYWtlT2JqZWN0KGFyZ3VtZW50cywgb3B0aW9u
cykpO2Vsc2UgX3JzdnBJbnRlcm5hbC5yZXNvbHZlKHByb21pc2UsIHZhbCk7CisgICAgICB9Owor
CisgICAgICBpZiAocHJvbWlzZUlucHV0KSB7CisgICAgICAgIHJldHVybiBoYW5kbGVQcm9taXNl
SW5wdXQocHJvbWlzZSwgYXJncywgbm9kZUZ1bmMsIHNlbGYpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmV0dXJuIGhhbmRsZVZhbHVlSW5wdXQocHJvbWlzZSwgYXJncywgbm9kZUZ1bmMsIHNl
bGYpOworICAgICAgfQorICAgIH07CisKKyAgICBfZGVmYXVsdHMoZm4sIG5vZGVGdW5jKTsKKwor
ICAgIHJldHVybiBmbjsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVZhbHVlSW5wdXQocHJvbWlz
ZSwgYXJncywgbm9kZUZ1bmMsIHNlbGYpIHsKKyAgICB2YXIgcmVzdWx0ID0gdHJ5QXBwbHkobm9k
ZUZ1bmMsIHNlbGYsIGFyZ3MpOworICAgIGlmIChyZXN1bHQgPT09IEVSUk9SKSB7CisgICAgICBf
cnN2cEludGVybmFsLnJlamVjdChwcm9taXNlLCByZXN1bHQudmFsdWUpOworICAgIH0KKyAgICBy
ZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIGZ1bmN0aW9uIGhhbmRsZVByb21pc2VJbnB1dChwcm9t
aXNlLCBhcmdzLCBub2RlRnVuYywgc2VsZikgeworICAgIHJldHVybiBfcnN2cFByb21pc2UuZGVm
YXVsdC5hbGwoYXJncykudGhlbihmdW5jdGlvbiAoYXJncykgeworICAgICAgdmFyIHJlc3VsdCA9
IHRyeUFwcGx5KG5vZGVGdW5jLCBzZWxmLCBhcmdzKTsKKyAgICAgIGlmIChyZXN1bHQgPT09IEVS
Uk9SKSB7CisgICAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIHJlc3VsdC52YWx1
ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICB9KTsKKyAgfQorCisgIGZ1
bmN0aW9uIG5lZWRzUHJvbWlzZUlucHV0KGFyZykgeworICAgIGlmIChhcmcgJiYgdHlwZW9mIGFy
ZyA9PT0gJ29iamVjdCcpIHsKKyAgICAgIGlmIChhcmcuY29uc3RydWN0b3IgPT09IF9yc3ZwUHJv
bWlzZS5kZWZhdWx0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgcmV0dXJuIGdldFRoZW4oYXJnKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcGxhdGZvcm0nLCBb
J2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZh
ciBwbGF0Zm9ybTsKKworICAvKiBnbG9iYWwgc2VsZiAqLworICBpZiAodHlwZW9mIHNlbGYgPT09
ICdvYmplY3QnKSB7CisgICAgcGxhdGZvcm0gPSBzZWxmOworCisgICAgLyogZ2xvYmFsIGdsb2Jh
bCAqLworICB9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnKSB7CisgICAgICBw
bGF0Zm9ybSA9IGdsb2JhbDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdu
byBnbG9iYWw6IGBzZWxmYCBvciBgZ2xvYmFsYCBmb3VuZCcpOworICAgIH0KKworICBleHBvcnRz
LmRlZmF1bHQgPSBwbGF0Zm9ybTsKK30pOworZW5pZmVkKCdyc3ZwL3Byb21pc2UtaGFzaCcsIFsn
ZXhwb3J0cycsICdyc3ZwL2VudW1lcmF0b3InLCAncnN2cC8taW50ZXJuYWwnLCAncnN2cC91dGls
cyddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBFbnVtZXJhdG9yLCBfcnN2cEludGVybmFsLCBf
cnN2cFV0aWxzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBmdW5jdGlvbiBQcm9taXNlSGFzaChD
b25zdHJ1Y3Rvciwgb2JqZWN0LCBsYWJlbCkgeworICAgIHRoaXMuX3N1cGVyQ29uc3RydWN0b3Io
Q29uc3RydWN0b3IsIG9iamVjdCwgdHJ1ZSwgbGFiZWwpOworICB9CisKKyAgZXhwb3J0cy5kZWZh
dWx0ID0gUHJvbWlzZUhhc2g7CisKKyAgUHJvbWlzZUhhc2gucHJvdG90eXBlID0gX3JzdnBVdGls
cy5vX2NyZWF0ZShfcnN2cEVudW1lcmF0b3IuZGVmYXVsdC5wcm90b3R5cGUpOworICBQcm9taXNl
SGFzaC5wcm90b3R5cGUuX3N1cGVyQ29uc3RydWN0b3IgPSBfcnN2cEVudW1lcmF0b3IuZGVmYXVs
dDsKKyAgUHJvbWlzZUhhc2gucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKCkgeworICAgIHRo
aXMuX3Jlc3VsdCA9IHt9OworICB9OworCisgIFByb21pc2VIYXNoLnByb3RvdHlwZS5fdmFsaWRh
dGVJbnB1dCA9IGZ1bmN0aW9uIChpbnB1dCkgeworICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2Yg
aW5wdXQgPT09ICdvYmplY3QnOworICB9OworCisgIFByb21pc2VIYXNoLnByb3RvdHlwZS5fdmFs
aWRhdGlvbkVycm9yID0gZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBuZXcgRXJyb3IoJ1Byb21p
c2UuaGFzaCBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIG9iamVjdCcpOworICB9OworCisgIFByb21p
c2VIYXNoLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24gKCkgeworICAgIHZhciBlbnVt
ZXJhdG9yID0gdGhpczsKKyAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTsKKyAg
ICB2YXIgaW5wdXQgPSBlbnVtZXJhdG9yLl9pbnB1dDsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOwor
CisgICAgZm9yICh2YXIga2V5IGluIGlucHV0KSB7CisgICAgICBpZiAocHJvbWlzZS5fc3RhdGUg
PT09IF9yc3ZwSW50ZXJuYWwuUEVORElORyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3Bl
cnR5LmNhbGwoaW5wdXQsIGtleSkpIHsKKyAgICAgICAgcmVzdWx0cy5wdXNoKHsKKyAgICAgICAg
ICBwb3NpdGlvbjoga2V5LAorICAgICAgICAgIGVudHJ5OiBpbnB1dFtrZXldCisgICAgICAgIH0p
OworICAgICAgfQorICAgIH0KKworICAgIHZhciBsZW5ndGggPSByZXN1bHRzLmxlbmd0aDsKKyAg
ICBlbnVtZXJhdG9yLl9yZW1haW5pbmcgPSBsZW5ndGg7CisgICAgdmFyIHJlc3VsdDsKKworICAg
IGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gX3JzdnBJbnRlcm5hbC5QRU5ESU5H
ICYmIGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTsKKyAgICAg
IGVudW1lcmF0b3IuX2VhY2hFbnRyeShyZXN1bHQuZW50cnksIHJlc3VsdC5wb3NpdGlvbik7Cisg
ICAgfQorICB9OworfSk7CitlbmlmZWQoJ3JzdnAvcHJvbWlzZScsIFsnZXhwb3J0cycsICdyc3Zw
L2NvbmZpZycsICdyc3ZwL2luc3RydW1lbnQnLCAncnN2cC91dGlscycsICdyc3ZwLy1pbnRlcm5h
bCcsICdyc3ZwL3Byb21pc2UvYWxsJywgJ3JzdnAvcHJvbWlzZS9yYWNlJywgJ3JzdnAvcHJvbWlz
ZS9yZXNvbHZlJywgJ3JzdnAvcHJvbWlzZS9yZWplY3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9y
c3ZwQ29uZmlnLCBfcnN2cEluc3RydW1lbnQsIF9yc3ZwVXRpbHMsIF9yc3ZwSW50ZXJuYWwsIF9y
c3ZwUHJvbWlzZUFsbCwgX3JzdnBQcm9taXNlUmFjZSwgX3JzdnBQcm9taXNlUmVzb2x2ZSwgX3Jz
dnBQcm9taXNlUmVqZWN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQg
PSBQcm9taXNlOworCisgIHZhciBndWlkS2V5ID0gJ3JzdnBfJyArIF9yc3ZwVXRpbHMubm93KCkg
KyAnLSc7CisgIHZhciBjb3VudGVyID0gMDsKKworICBmdW5jdGlvbiBuZWVkc1Jlc29sdmVyKCkg
eworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5j
dGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTsK
KyAgfQorCisgIGZ1bmN0aW9uIG5lZWRzTmV3KCkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
IkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVy
YXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0
aW9uLiIpOworICB9CisKKyAgLyoqCisgICAgUHJvbWlzZSBvYmplY3RzIHJlcHJlc2VudCB0aGUg
ZXZlbnR1YWwgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoZQorICAgIHBy
aW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0
aGVuYCBtZXRob2QsIHdoaWNoCisgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVp
dGhlciBhIHByb21pc2XigJlzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb24KKyAgICB3aHkg
dGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC4KKyAgCisgICAgVGVybWlub2xvZ3kKKyAg
ICAtLS0tLS0tLS0tLQorICAKKyAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rp
b24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBz
cGVjaWZpY2F0aW9uLgorICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24g
dGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC4KKyAgICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2Fs
IEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEg
cHJvbWlzZSkuCisgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVz
aW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCisgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQg
aW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLgorICAgIC0gYHNldHRsZWRgIHRo
ZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVk
LgorICAKKyAgICBBIHByb21pc2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6IHBlbmRp
bmcsIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQuCisgIAorICAgIFByb21pc2VzIHRoYXQgYXJlIGZ1
bGZpbGxlZCBoYXZlIGEgZnVsZmlsbG1lbnQgdmFsdWUgYW5kIGFyZSBpbiB0aGUgZnVsZmlsbGVk
CisgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9u
IHJlYXNvbiBhbmQgYXJlIGluIHRoZQorICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVu
dCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLgorICAKKyAgICBQcm9taXNlcyBjYW4gYWxzbyBi
ZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGEKKyAg
ICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxs
IG1hdGNoIHRoZSB2YWx1ZSdzCisgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0
ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsCisgICAgaXRzZWxmIHJlamVj
dCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMg
d2lsbAorICAgIGl0c2VsZiBmdWxmaWxsLgorICAKKyAgCisgICAgQmFzaWMgVXNhZ2U6CisgICAg
LS0tLS0tLS0tLS0tCisgIAorICAgIGBgYGpzCisgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIC8vIG9uIHN1Y2Nlc3MKKyAgICAg
IHJlc29sdmUodmFsdWUpOworICAKKyAgICAgIC8vIG9uIGZhaWx1cmUKKyAgICAgIHJlamVjdChy
ZWFzb24pOworICAgIH0pOworICAKKyAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsK
KyAgICAgIC8vIG9uIGZ1bGZpbGxtZW50CisgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAg
ICAvLyBvbiByZWplY3Rpb24KKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQWR2YW5jZWQgVXNh
Z2U6CisgICAgLS0tLS0tLS0tLS0tLS0tCisgIAorICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJz
dHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXMKKyAgICBgWE1M
SHR0cFJlcXVlc3Rgcy4KKyAgCisgICAgYGBganMKKyAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkg
eworICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Cisg
ICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgCisgICAgICAgIHhoci5v
cGVuKCdHRVQnLCB1cmwpOworICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxl
cjsKKyAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJzsKKyAgICAgICAgeGhyLnNldFJl
cXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7CisgICAgICAgIHhoci5z
ZW5kKCk7CisgIAorICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkgeworICAgICAgICAgIGlmICh0
aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkgeworICAgICAgICAgICAgaWYgKHRoaXMuc3Rh
dHVzID09PSAyMDApIHsKKyAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2dldEpT
T046IGAnICsgdXJsICsgJ2AgZmFpbGVkIHdpdGggc3RhdHVzOiBbJyArIHRoaXMuc3RhdHVzICsg
J10nKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSk7
CisgICAgfQorICAKKyAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNv
bikgeworICAgICAgLy8gb24gZnVsZmlsbG1lbnQKKyAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsK
KyAgICAgIC8vIG9uIHJlamVjdGlvbgorICAgIH0pOworICAgIGBgYAorICAKKyAgICBVbmxpa2Ug
Y2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLgorICAK
KyAgICBgYGBqcworICAgIFByb21pc2UuYWxsKFsKKyAgICAgIGdldEpTT04oJy9wb3N0cycpLAor
ICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJykKKyAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7
CisgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OCisgICAgICB2YWx1ZXNbMV0gLy8gPT4g
Y29tbWVudHNKU09OCisgIAorICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9KTsKKyAgICBgYGAK
KyAgCisgICAgQGNsYXNzIFJTVlAuUHJvbWlzZQorICAgIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29s
dmVyCisgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxp
bmcgdGhlIHByb21pc2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEBjb25zdHJ1Y3Rv
cgorICAqLworCisgIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIsIGxhYmVsKSB7CisgICAgdmFy
IHByb21pc2UgPSB0aGlzOworCisgICAgcHJvbWlzZS5faWQgPSBjb3VudGVyKys7CisgICAgcHJv
bWlzZS5fbGFiZWwgPSBsYWJlbDsKKyAgICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDsKKyAg
ICBwcm9taXNlLl9yZXN1bHQgPSB1bmRlZmluZWQ7CisgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMg
PSBbXTsKKworICAgIGlmIChfcnN2cENvbmZpZy5jb25maWcuaW5zdHJ1bWVudCkgeworICAgICAg
X3JzdnBJbnN0cnVtZW50LmRlZmF1bHQoJ2NyZWF0ZWQnLCBwcm9taXNlKTsKKyAgICB9CisKKyAg
ICBpZiAoX3JzdnBJbnRlcm5hbC5ub29wICE9PSByZXNvbHZlcikgeworICAgICAgaWYgKCFfcnN2
cFV0aWxzLmlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7CisgICAgICAgIG5lZWRzUmVzb2x2ZXIoKTsK
KyAgICAgIH0KKworICAgICAgaWYgKCEocHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7Cisg
ICAgICAgIG5lZWRzTmV3KCk7CisgICAgICB9CisKKyAgICAgIF9yc3ZwSW50ZXJuYWwuaW5pdGlh
bGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpOworICAgIH0KKyAgfQorCisgIFByb21pc2Uu
Y2FzdCA9IF9yc3ZwUHJvbWlzZVJlc29sdmUuZGVmYXVsdDsgLy8gZGVwcmVjYXRlZAorICBQcm9t
aXNlLmFsbCA9IF9yc3ZwUHJvbWlzZUFsbC5kZWZhdWx0OworICBQcm9taXNlLnJhY2UgPSBfcnN2
cFByb21pc2VSYWNlLmRlZmF1bHQ7CisgIFByb21pc2UucmVzb2x2ZSA9IF9yc3ZwUHJvbWlzZVJl
c29sdmUuZGVmYXVsdDsKKyAgUHJvbWlzZS5yZWplY3QgPSBfcnN2cFByb21pc2VSZWplY3QuZGVm
YXVsdDsKKworICBQcm9taXNlLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogUHJvbWlz
ZSwKKworICAgIF9ndWlkS2V5OiBndWlkS2V5LAorCisgICAgX29uRXJyb3I6IGZ1bmN0aW9uIChy
ZWFzb24pIHsKKyAgICAgIHZhciBwcm9taXNlID0gdGhpczsKKyAgICAgIF9yc3ZwQ29uZmlnLmNv
bmZpZy5hZnRlcihmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChwcm9taXNlLl9vbkVycm9yKSB7
CisgICAgICAgICAgX3JzdnBDb25maWcuY29uZmlnWyd0cmlnZ2VyJ10oJ2Vycm9yJywgcmVhc29u
KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgVGhlIHBy
aW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0
aGVuYCBtZXRob2QsCisgICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUg
ZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZQorICAgICAgcmVhc29uIHdo
eSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLgorICAgIAorICAgICAgYGBganMKKyAg
ICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXsKKyAgICAgICAgLy8gdXNlciBpcyBh
dmFpbGFibGUKKyAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8vIHVzZXIgaXMg
dW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5CisgICAgICB9KTsK
KyAgICAgIGBgYAorICAgIAorICAgICAgQ2hhaW5pbmcKKyAgICAgIC0tLS0tLS0tCisgICAgCisg
ICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhp
cyBzZWNvbmQsICdkb3duc3RyZWFtJworICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRo
ZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudAorICAgICAg
b3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBh
biBleGNlcHRpb24uCisgICAgCisgICAgICBgYGBqcworICAgICAgZmluZFVzZXIoKS50aGVuKGZ1
bmN0aW9uICh1c2VyKSB7CisgICAgICAgIHJldHVybiB1c2VyLm5hbWU7CisgICAgICB9LCBmdW5j
dGlvbiAocmVhc29uKSB7CisgICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJzsKKyAgICAgIH0p
LnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7CisgICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVs
ZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXQK
KyAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgCisgICAgICB9KTsKKyAgICAKKyAg
ICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikgeworICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7CisgICAgICB9LCBmdW5jdGlv
biAocmVhc29uKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3Rl
ZCBhbmQgd2UncmUgdW5oYXBweScpOworICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsK
KyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAorICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewor
ICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91
bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLgorICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJl
amVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1
bmhhcHB5Jy4KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgICBJZiB0aGUgZG93bnN0cmVhbSBw
cm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJl
YXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS4KKyAgICAKKyAgICAg
IGBgYGpzCisgICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKKyAgICAgICAg
dGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpOworICAgICAg
fSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAorICAg
ICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZAor
ICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgeworICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFs
RXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZQorICAgICAg
fSk7CisgICAgICBgYGAKKyAgICAKKyAgICAgIEFzc2ltaWxhdGlvbgorICAgICAgLS0tLS0tLS0t
LS0tCisgICAgCisgICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0
ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZQorICAgICAgcmV0cmlldmVkIGFz
eW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNl
IGluIHRoZQorICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3du
c3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmcKKyAgICAgIHVudGlsIHRoZSByZXR1
cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLgor
ICAgIAorICAgICAgYGBganMKKyAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikg
eworICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7CisgICAgICB9KS50
aGVuKGZ1bmN0aW9uIChjb21tZW50cykgeworICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRz
IGFyZSBub3cgYXZhaWxhYmxlCisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAorICAgICAgSWYg
dGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9t
aXNlIHdpbGwgYWxzbyByZWplY3QuCisgICAgCisgICAgICBgYGBqcworICAgICAgZmluZFVzZXIo
KS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7CisgICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1
dGhvcih1c2VyKTsKKyAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7CisgICAgICAg
IC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZh
bHVlIGhlcmUKKyAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKKyAgICAgICAgLy8gSWYgYGZp
bmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZQor
ICAgICAgfSk7CisgICAgICBgYGAKKyAgICAKKyAgICAgIFNpbXBsZSBFeGFtcGxlCisgICAgICAt
LS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgU3luY2hyb25vdXMgRXhhbXBsZQorICAgIAorICAg
ICAgYGBgamF2YXNjcmlwdAorICAgICAgdmFyIHJlc3VsdDsKKyAgICAKKyAgICAgIHRyeSB7Cisg
ICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAg
fSBjYXRjaChyZWFzb24pIHsKKyAgICAgICAgLy8gZmFpbHVyZQorICAgICAgfQorICAgICAgYGBg
CisgICAgCisgICAgICBFcnJiYWNrIEV4YW1wbGUKKyAgICAKKyAgICAgIGBgYGpzCisgICAgICBm
aW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXsKKyAgICAgICAgaWYgKGVycikgeworICAg
ICAgICAgIC8vIGZhaWx1cmUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBzdWNjZXNz
CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgYGBgCisgICAgCisgICAgICBQcm9taXNlIEV4
YW1wbGU7CisgICAgCisgICAgICBgYGBqYXZhc2NyaXB0CisgICAgICBmaW5kUmVzdWx0KCkudGhl
bihmdW5jdGlvbihyZXN1bHQpeworICAgICAgICAvLyBzdWNjZXNzCisgICAgICB9LCBmdW5jdGlv
bihyZWFzb24peworICAgICAgICAvLyBmYWlsdXJlCisgICAgICB9KTsKKyAgICAgIGBgYAorICAg
IAorICAgICAgQWR2YW5jZWQgRXhhbXBsZQorICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAKKyAg
ICAgIFN5bmNocm9ub3VzIEV4YW1wbGUKKyAgICAKKyAgICAgIGBgYGphdmFzY3JpcHQKKyAgICAg
IHZhciBhdXRob3IsIGJvb2tzOworICAgIAorICAgICAgdHJ5IHsKKyAgICAgICAgYXV0aG9yID0g
ZmluZEF1dGhvcigpOworICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3Ip
OworICAgICAgICAvLyBzdWNjZXNzCisgICAgICB9IGNhdGNoKHJlYXNvbikgeworICAgICAgICAv
LyBmYWlsdXJlCisgICAgICB9CisgICAgICBgYGAKKyAgICAKKyAgICAgIEVycmJhY2sgRXhhbXBs
ZQorICAgIAorICAgICAgYGBganMKKyAgICAKKyAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9v
a3MpIHsKKyAgICAKKyAgICAgIH0KKyAgICAKKyAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29u
KSB7CisgICAgCisgICAgICB9CisgICAgCisgICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhv
ciwgZXJyKXsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIGZhaWx1cmUoZXJyKTsKKyAg
ICAgICAgICAvLyBmYWlsdXJlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJ5IHsKKyAg
ICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIp
IHsKKyAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJy
KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAg
ICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChy
ZWFzb24pIHsKKyAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0gY2F0
Y2goZXJyb3IpIHsKKyAgICAgICAgICAgIGZhaWx1cmUoZXJyKTsKKyAgICAgICAgICB9CisgICAg
ICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAor
ICAgICAgUHJvbWlzZSBFeGFtcGxlOworICAgIAorICAgICAgYGBgamF2YXNjcmlwdAorICAgICAg
ZmluZEF1dGhvcigpLgorICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS4KKyAgICAgICAg
dGhlbihmdW5jdGlvbihib29rcyl7CisgICAgICAgICAgLy8gZm91bmQgYm9va3MKKyAgICAgIH0p
LmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25n
CisgICAgICB9KTsKKyAgICAgIGBgYAorICAgIAorICAgICAgQG1ldGhvZCB0aGVuCisgICAgICBA
cGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxtZW50CisgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBv
blJlamVjdGlvbgorICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBm
b3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCisgICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAg
ICBAcmV0dXJuIHtQcm9taXNlfQorICAgICovCisgICAgdGhlbjogZnVuY3Rpb24gKG9uRnVsZmls
bG1lbnQsIG9uUmVqZWN0aW9uLCBsYWJlbCkgeworICAgICAgdmFyIHBhcmVudCA9IHRoaXM7Cisg
ICAgICB2YXIgc3RhdGUgPSBwYXJlbnQuX3N0YXRlOworCisgICAgICBpZiAoc3RhdGUgPT09IF9y
c3ZwSW50ZXJuYWwuRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBfcnN2
cEludGVybmFsLlJFSkVDVEVEICYmICFvblJlamVjdGlvbikgeworICAgICAgICBpZiAoX3JzdnBD
b25maWcuY29uZmlnLmluc3RydW1lbnQpIHsKKyAgICAgICAgICBfcnN2cEluc3RydW1lbnQuZGVm
YXVsdCgnY2hhaW5lZCcsIHBhcmVudCwgcGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gcGFyZW50OworICAgICAgfQorCisgICAgICBwYXJlbnQuX29uRXJyb3IgPSBudWxsOworCisg
ICAgICB2YXIgY2hpbGQgPSBuZXcgcGFyZW50LmNvbnN0cnVjdG9yKF9yc3ZwSW50ZXJuYWwubm9v
cCwgbGFiZWwpOworICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0OworCisgICAgICBp
ZiAoX3JzdnBDb25maWcuY29uZmlnLmluc3RydW1lbnQpIHsKKyAgICAgICAgX3JzdnBJbnN0cnVt
ZW50LmRlZmF1bHQoJ2NoYWluZWQnLCBwYXJlbnQsIGNoaWxkKTsKKyAgICAgIH0KKworICAgICAg
aWYgKHN0YXRlKSB7CisgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tzdGF0ZSAtIDFd
OworICAgICAgICBfcnN2cENvbmZpZy5jb25maWcuYXN5bmMoZnVuY3Rpb24gKCkgeworICAgICAg
ICAgIF9yc3ZwSW50ZXJuYWwuaW52b2tlQ2FsbGJhY2soc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywg
cmVzdWx0KTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfcnN2cEludGVy
bmFsLnN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7
CisgICAgICB9CisKKyAgICAgIHJldHVybiBjaGlsZDsKKyAgICB9LAorCisgICAgLyoqCisgICAg
ICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlv
bilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lCisgICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2Yg
YSB0cnkvY2F0Y2ggc3RhdGVtZW50LgorICAgIAorICAgICAgYGBganMKKyAgICAgIGZ1bmN0aW9u
IGZpbmRBdXRob3IoKXsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRo
YXQgYXV0aG9yJyk7CisgICAgICB9CisgICAgCisgICAgICAvLyBzeW5jaHJvbm91cworICAgICAg
dHJ5IHsKKyAgICAgICAgZmluZEF1dGhvcigpOworICAgICAgfSBjYXRjaChyZWFzb24pIHsKKyAg
ICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgIH0KKyAgICAKKyAgICAgIC8vIGFz
eW5jIHdpdGggcHJvbWlzZXMKKyAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFz
b24peworICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZworICAgICAgfSk7CisgICAgICBg
YGAKKyAgICAKKyAgICAgIEBtZXRob2QgY2F0Y2gKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9u
UmVqZWN0aW9uCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZv
ciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8KKyAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWpl
Y3Rpb24sIGxhYmVsKSB7CisgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWpl
Y3Rpb24sIGxhYmVsKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBgZmluYWxseWAgd2lsbCBi
ZSBpbnZva2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb21pc2UncyBmYXRlIGp1c3QgYXMgbmF0aXZl
CisgICAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzCisgICAgCisgICAgICBTeW5jaHJvbm91
cyBleGFtcGxlOgorICAgIAorICAgICAgYGBganMKKyAgICAgIGZpbmRBdXRob3IoKSB7CisgICAg
ICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBdXRob3IoKTsKKyAgICAgIH0KKyAg
ICAKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBmaW5kQXV0aG9yKCk7IC8vIHN1Y2NlZWQg
b3IgZmFpbAorICAgICAgfSBjYXRjaChlcnJvcikgeworICAgICAgICByZXR1cm4gZmluZE90aGVy
QXV0aGVyKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAvLyBhbHdheXMgcnVucworICAg
ICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICB9CisgICAgICBg
YGAKKyAgICAKKyAgICAgIEFzeW5jaHJvbm91cyBleGFtcGxlOgorICAgIAorICAgICAgYGBganMK
KyAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24peworICAgICAgICByZXR1
cm4gZmluZE90aGVyQXV0aGVyKCk7CisgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCl7CisgICAg
ICAgIC8vIGF1dGhvciB3YXMgZWl0aGVyIGZvdW5kLCBvciBub3QKKyAgICAgIH0pOworICAgICAg
YGBgCisgICAgCisgICAgICBAbWV0aG9kIGZpbmFsbHkKKyAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IGNhbGxiYWNrCisgICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZv
ciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KKyAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICAg
IEByZXR1cm4ge1Byb21pc2V9CisgICAgKi8KKyAgICAnZmluYWxseSc6IGZ1bmN0aW9uIChjYWxs
YmFjaywgbGFiZWwpIHsKKyAgICAgIHZhciBwcm9taXNlID0gdGhpczsKKyAgICAgIHZhciBjb25z
dHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3I7CisKKyAgICAgIHJldHVybiBwcm9taXNlLnRo
ZW4oZnVuY3Rpb24gKHZhbHVlKSB7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5yZXNvbHZl
KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICAgICAgfSk7CisgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CisgICAgICAgIHJldHVy
biBjb25zdHJ1Y3Rvci5yZXNvbHZlKGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24gKCkgeworICAg
ICAgICAgIHRocm93IHJlYXNvbjsKKyAgICAgICAgfSk7CisgICAgICB9LCBsYWJlbCk7CisgICAg
fQorICB9OworfSk7CitlbmlmZWQoJ3JzdnAvcHJvbWlzZS9hbGwnLCBbJ2V4cG9ydHMnLCAncnN2
cC9lbnVtZXJhdG9yJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cEVudW1lcmF0b3IpIHsKKyAg
J3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IGFsbDsKKworICAvKioKKyAgICBg
UlNWUC5Qcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVy
bnMgYSBuZXcgcHJvbWlzZSB3aGljaAorICAgIGlzIGZ1bGZpbGxlZCB3aXRoIGFuIGFycmF5IG9m
IGZ1bGZpbGxtZW50IHZhbHVlcyBmb3IgdGhlIHBhc3NlZCBwcm9taXNlcywgb3IKKyAgICByZWpl
Y3RlZCB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIGJlIHJl
amVjdGVkLiBJdCBjYXN0cyBhbGwKKyAgICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxl
IHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCisgIAorICAgIEV4YW1wbGU6
CisgIAorICAgIGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUo
MSk7CisgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZXNvbHZlKDIpOworICAgIHZhciBwcm9taXNl
MyA9IFJTVlAucmVzb2x2ZSgzKTsKKyAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9t
aXNlMiwgcHJvbWlzZTMgXTsKKyAgCisgICAgUlNWUC5Qcm9taXNlLmFsbChwcm9taXNlcykudGhl
bihmdW5jdGlvbihhcnJheSl7CisgICAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEs
IDIsIDMgXTsKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgSWYgYW55IG9mIHRoZSBgcHJvbWlz
ZXNgIGdpdmVuIHRvIGBSU1ZQLmFsbGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQor
ICAgIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUg
cmV0dXJuZWQgcHJvbWlzZXMncworICAgIHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToK
KyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNl
MSA9IFJTVlAucmVzb2x2ZSgxKTsKKyAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcg
RXJyb3IoIjIiKSk7CisgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIz
IikpOworICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBd
OworICAKKyAgICBSU1ZQLlByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5
KXsKKyAgICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVj
dGVkIHByb21pc2VzIQorICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAvLyBlcnJvci5t
ZXNzYWdlID09PSAiMiIKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCBhbGwKKyAg
ICBAc3RhdGljCisgICAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlcwor
ICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRo
ZSBwcm9taXNlLgorICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KKyAgICBAcmV0dXJuIHtQcm9taXNl
fSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVu
CisgICAgZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkgb2YgdGhlbSBiZWNvbWUgcmVqZWN0
ZWQuCisgICAgQHN0YXRpYworICAqLworCisgIGZ1bmN0aW9uIGFsbChlbnRyaWVzLCBsYWJlbCkg
eworICAgIHJldHVybiBuZXcgX3JzdnBFbnVtZXJhdG9yLmRlZmF1bHQodGhpcywgZW50cmllcywg
dHJ1ZSwgLyogYWJvcnQgb24gcmVqZWN0ICovbGFiZWwpLnByb21pc2U7CisgIH0KK30pOworZW5p
ZmVkKCdyc3ZwL3Byb21pc2UvcmFjZScsIFsnZXhwb3J0cycsICdyc3ZwL3V0aWxzJywgJ3JzdnAv
LWludGVybmFsJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2cFV0aWxzLCBfcnN2cEludGVybmFs
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnRzLmRlZmF1bHQgPSByYWNlOworCisgIC8q
KgorICAgIGBSU1ZQLlByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlz
IHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZQorICAgIGZpcnN0IHBhc3NlZCBwcm9taXNl
IHRvIHNldHRsZS4KKyAgCisgICAgRXhhbXBsZToKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAg
IHZhciBwcm9taXNlMSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0
KXsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgcmVzb2x2ZSgncHJvbWlz
ZSAxJyk7CisgICAgICB9LCAyMDApOworICAgIH0pOworICAKKyAgICB2YXIgcHJvbWlzZTIgPSBu
ZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CisgICAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7CisgICAgICAgIHJlc29sdmUoJ3Byb21pc2UgMicpOworICAgICAgfSwg
MTAwKTsKKyAgICB9KTsKKyAgCisgICAgUlNWUC5Qcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9t
aXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXsKKyAgICAgIC8vIHJlc3VsdCA9PT0gJ3Byb21p
c2UgMicgYmVjYXVzZSBpdCB3YXMgcmVzb2x2ZWQgYmVmb3JlIHByb21pc2UxCisgICAgICAvLyB3
YXMgcmVzb2x2ZWQuCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIGBSU1ZQLlByb21pc2UucmFj
ZWAgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0aGF0IG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdAor
ICAgIHNldHRsZWQgcHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBsZSwgZXZlbiBpZiBvdGhlciBw
cm9taXNlcyBnaXZlbiB0byB0aGUKKyAgICBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50IGFyZSBy
ZXNvbHZlZCwgYnV0IHRoZSBmaXJzdCBzZXR0bGVkIHByb21pc2UgaGFzCisgICAgYmVjb21lIHJl
amVjdGVkIGJlZm9yZSB0aGUgb3RoZXIgcHJvbWlzZXMgYmVjYW1lIGZ1bGZpbGxlZCwgdGhlIHJl
dHVybmVkCisgICAgcHJvbWlzZSB3aWxsIGJlY29tZSByZWplY3RlZDoKKyAgCisgICAgYGBgamF2
YXNjcmlwdAorICAgIHZhciBwcm9taXNlMSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVz
b2x2ZSwgcmVqZWN0KXsKKyAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgcmVz
b2x2ZSgncHJvbWlzZSAxJyk7CisgICAgICB9LCAyMDApOworICAgIH0pOworICAKKyAgICB2YXIg
cHJvbWlzZTIgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Cisg
ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3By
b21pc2UgMicpKTsKKyAgICAgIH0sIDEwMCk7CisgICAgfSk7CisgIAorICAgIFJTVlAuUHJvbWlz
ZS5yYWNlKFtwcm9taXNlMSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CisgICAg
ICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVucworICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAg
ICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ3Byb21pc2UgMicgYmVjYXVzZSBwcm9taXNlIDIgYmVj
YW1lIHJlamVjdGVkIGJlZm9yZQorICAgICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWQK
KyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQW4gZXhhbXBsZSByZWFsLXdvcmxkIHVzZSBjYXNl
IGlzIGltcGxlbWVudGluZyB0aW1lb3V0czoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIFJT
VlAuUHJvbWlzZS5yYWNlKFthamF4KCdmb28uanNvbicpLCB0aW1lb3V0KDUwMDApXSkKKyAgICBg
YGAKKyAgCisgICAgQG1ldGhvZCByYWNlCisgICAgQHN0YXRpYworICAgIEBwYXJhbSB7QXJyYXl9
IGVudHJpZXMgYXJyYXkgb2YgcHJvbWlzZXMgdG8gb2JzZXJ2ZQorICAgIEBwYXJhbSB7U3RyaW5n
fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGRlc2NyaWJpbmcgdGhlIHByb21pc2UgcmV0dXJu
ZWQuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJv
bWlzZSB3aGljaCBzZXR0bGVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgZmlyc3QgcGFzc2VkCisg
ICAgcHJvbWlzZSB0byBzZXR0bGUuCisgICovCisKKyAgZnVuY3Rpb24gcmFjZShlbnRyaWVzLCBs
YWJlbCkgeworICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovCisgICAgdmFyIENvbnN0cnVj
dG9yID0gdGhpczsKKworICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKF9yc3ZwSW50
ZXJuYWwubm9vcCwgbGFiZWwpOworCisgICAgaWYgKCFfcnN2cFV0aWxzLmlzQXJyYXkoZW50cmll
cykpIHsKKyAgICAgIF9yc3ZwSW50ZXJuYWwucmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3Io
J1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7CisgICAgICByZXR1cm4gcHJvbWlz
ZTsKKyAgICB9CisKKyAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7CisKKyAgICBmdW5j
dGlvbiBvbkZ1bGZpbGxtZW50KHZhbHVlKSB7CisgICAgICBfcnN2cEludGVybmFsLnJlc29sdmUo
cHJvbWlzZSwgdmFsdWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNv
bikgeworICAgICAgX3JzdnBJbnRlcm5hbC5yZWplY3QocHJvbWlzZSwgcmVhc29uKTsKKyAgICB9
CisKKyAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IF9yc3ZwSW50ZXJuYWwu
UEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIF9yc3ZwSW50ZXJuYWwuc3Vic2Ny
aWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxs
bWVudCwgb25SZWplY3Rpb24pOworICAgIH0KKworICAgIHJldHVybiBwcm9taXNlOworICB9Cit9
KTsKK2VuaWZlZCgncnN2cC9wcm9taXNlL3JlamVjdCcsIFsnZXhwb3J0cycsICdyc3ZwLy1pbnRl
cm5hbCddLCBmdW5jdGlvbiAoZXhwb3J0cywgX3JzdnBJbnRlcm5hbCkgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmVqZWN0OworCisgIC8qKgorICAgIGBSU1ZQLlBy
b21pc2UucmVqZWN0YCByZXR1cm5zIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBwYXNzZWQg
YHJlYXNvbmAuCisgICAgSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOgorICAKKyAg
ICBgYGBqYXZhc2NyaXB0CisgICAgdmFyIHByb21pc2UgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0
aW9uKHJlc29sdmUsIHJlamVjdCl7CisgICAgICByZWplY3QobmV3IEVycm9yKCdXSE9PUFMnKSk7
CisgICAgfSk7CisgIAorICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7CisgICAgICAv
LyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCEK
KyAgICB9LCBmdW5jdGlvbihyZWFzb24peworICAgICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICdX
SE9PUFMnCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUg
YWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKKyAgCisg
ICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gUlNWUC5Qcm9taXNlLnJlamVjdChu
ZXcgRXJyb3IoJ1dIT09QUycpKTsKKyAgCisgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVl
KXsKKyAgICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlz
IHJlamVjdGVkIQorICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7CisgICAgICAvLyByZWFzb24ubWVz
c2FnZSA9PT0gJ1dIT09QUycKKyAgICB9KTsKKyAgICBgYGAKKyAgCisgICAgQG1ldGhvZCByZWpl
Y3QKKyAgICBAc3RhdGljCisgICAgQHBhcmFtIHsqfSByZWFzb24gdmFsdWUgdGhhdCB0aGUgcmV0
dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGguCisgICAgQHBhcmFtIHtTdHJpbmd9
IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHByb21p
c2UuCisgICAgVXNlZnVsIGZvciB0b29saW5nLgorICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJv
bWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC4KKyAgKi8KKworICBmdW5jdGlv
biByZWplY3QocmVhc29uLCBsYWJlbCkgeworICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICov
CisgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsKKyAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25z
dHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsKKyAgICBfcnN2cEludGVybmFsLnJl
amVjdChwcm9taXNlLCByZWFzb24pOworICAgIHJldHVybiBwcm9taXNlOworICB9Cit9KTsKK2Vu
aWZlZCgncnN2cC9wcm9taXNlL3Jlc29sdmUnLCBbJ2V4cG9ydHMnLCAncnN2cC8taW50ZXJuYWwn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwSW50ZXJuYWwpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHMuZGVmYXVsdCA9IHJlc29sdmU7CisKKyAgLyoqCisgICAgYFJTVlAuUHJvbWlz
ZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdp
dGggdGhlCisgICAgcGFzc2VkIGB2YWx1ZWAuIEl0IGlzIHNob3J0aGFuZCBmb3IgdGhlIGZvbGxv
d2luZzoKKyAgCisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAu
UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpeworICAgICAgcmVzb2x2ZSgxKTsKKyAg
ICB9KTsKKyAgCisgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKKyAgICAgIC8vIHZh
bHVlID09PSAxCisgICAgfSk7CisgICAgYGBgCisgIAorICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0
aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKKyAg
CisgICAgYGBgamF2YXNjcmlwdAorICAgIHZhciBwcm9taXNlID0gUlNWUC5Qcm9taXNlLnJlc29s
dmUoMSk7CisgIAorICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSl7CisgICAgICAvLyB2
YWx1ZSA9PT0gMQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBAbWV0aG9kIHJlc29sdmUKKyAg
ICBAc3RhdGljCisgICAgQHBhcmFtIHsqfSBvYmplY3QgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQg
cHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGgKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAg
ICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRo
YXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCisgICAgYHZhbHVlYAorICAq
LworCisgIGZ1bmN0aW9uIHJlc29sdmUob2JqZWN0LCBsYWJlbCkgeworICAgIC8qanNoaW50IHZh
bGlkdGhpczp0cnVlICovCisgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsKKworICAgIGlmIChv
YmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9y
ID09PSBDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICB2
YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihfcnN2cEludGVybmFsLm5vb3AsIGxhYmVsKTsK
KyAgICBfcnN2cEludGVybmFsLnJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTsKKyAgICByZXR1cm4g
cHJvbWlzZTsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcmFjZScsIFsnZXhwb3J0cycsICdyc3Zw
L3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmFjZTsKKworICAvKioKKyAgICBUaGlzIGlz
IGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5yYWNlYC4KKyAgCisgICAgQG1l
dGhvZCByYWNlCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNWUAorICAgIEBwYXJhbSB7QXJyYXl9
IGFycmF5IEFycmF5IG9mIHByb21pc2VzLgorICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBBbiBv
cHRpb25hbCBsYWJlbC4gVGhpcyBpcyB1c2VmdWwKKyAgICBmb3IgdG9vbGluZy4KKyAgICovCisK
KyAgZnVuY3Rpb24gcmFjZShhcnJheSwgbGFiZWwpIHsKKyAgICByZXR1cm4gX3JzdnBQcm9taXNl
LmRlZmF1bHQucmFjZShhcnJheSwgbGFiZWwpOworICB9Cit9KTsKK2VuaWZlZCgncnN2cC9yZWpl
Y3QnLCBbJ2V4cG9ydHMnLCAncnN2cC9wcm9taXNlJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfcnN2
cFByb21pc2UpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHMuZGVmYXVsdCA9IHJlamVj
dDsKKworICAvKioKKyAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJv
bWlzZS5yZWplY3RgLgorICAKKyAgICBAbWV0aG9kIHJlamVjdAorICAgIEBzdGF0aWMKKyAgICBA
Zm9yIFJTVlAKKyAgICBAcGFyYW0geyp9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBw
cm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC4KKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAg
ICBVc2VmdWwgZm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHJl
amVjdGVkIHdpdGggdGhlIGdpdmVuIGByZWFzb25gLgorICAqLworCisgIGZ1bmN0aW9uIHJlamVj
dChyZWFzb24sIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5kZWZhdWx0LnJlamVj
dChyZWFzb24sIGxhYmVsKTsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvcmVzb2x2ZScsIFsnZXhw
b3J0cycsICdyc3ZwL3Byb21pc2UnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9yc3ZwUHJvbWlzZSkg
eworICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0cy5kZWZhdWx0ID0gcmVzb2x2ZTsKKworICAv
KioKKyAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3IgYFJTVlAuUHJvbWlzZS5yZXNv
bHZlYC4KKyAgCisgICAgQG1ldGhvZCByZXNvbHZlCisgICAgQHN0YXRpYworICAgIEBmb3IgUlNW
UAorICAgIEBwYXJhbSB7Kn0gdmFsdWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3
aWxsIGJlIHJlc29sdmVkIHdpdGgKKyAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwg
c3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KKyAgICBVc2VmdWwg
Zm9yIHRvb2xpbmcuCisgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBi
ZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCisgICAgYHZhbHVlYAorICAqLworCisgIGZ1
bmN0aW9uIHJlc29sdmUodmFsdWUsIGxhYmVsKSB7CisgICAgcmV0dXJuIF9yc3ZwUHJvbWlzZS5k
ZWZhdWx0LnJlc29sdmUodmFsdWUsIGxhYmVsKTsKKyAgfQorfSk7CitlbmlmZWQoInJzdnAvcmV0
aHJvdyIsIFsiZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAvKioKKyAgICBgUlNW
UC5yZXRocm93YCB3aWxsIHJldGhyb3cgYW4gZXJyb3Igb24gdGhlIG5leHQgdHVybiBvZiB0aGUg
SmF2YVNjcmlwdCBldmVudAorICAgIGxvb3AgaW4gb3JkZXIgdG8gYWlkIGRlYnVnZ2luZy4KKyAg
CisgICAgUHJvbWlzZXMgQSsgc3BlY2lmaWVzIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBvY2N1
ciB3aXRoIGEgcHJvbWlzZSBtdXN0IGJlCisgICAgY2F1Z2h0IGJ5IHRoZSBwcm9taXNlcyBpbXBs
ZW1lbnRhdGlvbiBhbmQgYnViYmxlZCB0byB0aGUgbGFzdCBoYW5kbGVyLiBGb3IKKyAgICB0aGlz
IHJlYXNvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzIHNwZWNpZnkgYSBzZWNv
bmQgcmVqZWN0aW9uCisgICAgaGFuZGxlciBmdW5jdGlvbiB0byBgdGhlbmAuIEhvd2V2ZXIsIGBS
U1ZQLnJldGhyb3dgIHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgIG91dHNpZGUgb2YgdGhl
IHByb21pc2UsIHNvIGl0IGJ1YmJsZXMgdXAgdG8geW91ciBjb25zb2xlIGlmIGluIHRoZSBicm93
c2VyLAorICAgIG9yIGRvbWFpbi9jYXVzZSB1bmNhdWdodCBleGNlcHRpb24gaW4gTm9kZS4gYHJl
dGhyb3dgIHdpbGwgYWxzbyB0aHJvdyB0aGUKKyAgICBlcnJvciBhZ2FpbiBzbyB0aGUgZXJyb3Ig
Y2FuIGJlIGhhbmRsZWQgYnkgdGhlIHByb21pc2UgcGVyIHRoZSBzcGVjLgorICAKKyAgICBgYGBq
YXZhc2NyaXB0CisgICAgZnVuY3Rpb24gdGhyb3dzKCl7CisgICAgICB0aHJvdyBuZXcgRXJyb3Io
J1dob29wcyEnKTsKKyAgICB9CisgIAorICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpeworICAgICAgdGhyb3dzKCk7CisgICAgfSk7Cisg
IAorICAgIHByb21pc2UuY2F0Y2goUlNWUC5yZXRocm93KS50aGVuKGZ1bmN0aW9uKCl7CisgICAg
ICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBiZWNhbWUgcmVq
ZWN0ZWQgZHVlIHRvIGFuCisgICAgICAvLyBlcnJvciEKKyAgICB9LCBmdW5jdGlvbiAoZXJyKXsK
KyAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IgaGVyZQorICAgIH0pOworICAgIGBgYAorICAKKyAg
ICBUaGUgJ1dob29wcycgZXJyb3Igd2lsbCBiZSB0aHJvd24gb24gdGhlIG5leHQgdHVybiBvZiB0
aGUgZXZlbnQgbG9vcAorICAgIGFuZCB5b3UgY2FuIHdhdGNoIGZvciBpdCBpbiB5b3VyIGNvbnNv
bGUuIFlvdSBjYW4gYWxzbyBoYW5kbGUgaXQgdXNpbmcgYQorICAgIHJlamVjdGlvbiBoYW5kbGVy
IGdpdmVuIHRvIGAudGhlbmAgb3IgYC5jYXRjaGAgb24gdGhlIHJldHVybmVkIHByb21pc2UuCisg
IAorICAgIEBtZXRob2QgcmV0aHJvdworICAgIEBzdGF0aWMKKyAgICBAZm9yIFJTVlAKKyAgICBA
cGFyYW0ge0Vycm9yfSByZWFzb24gcmVhc29uIHRoZSBwcm9taXNlIGJlY2FtZSByZWplY3RlZC4K
KyAgICBAdGhyb3dzIEVycm9yCisgICAgQHN0YXRpYworICAqLworICAidXNlIHN0cmljdCI7CisK
KyAgZXhwb3J0cy5kZWZhdWx0ID0gcmV0aHJvdzsKKworICBmdW5jdGlvbiByZXRocm93KHJlYXNv
bikgeworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgdGhyb3cgcmVhc29uOwor
ICAgIH0pOworICAgIHRocm93IHJlYXNvbjsKKyAgfQorfSk7CitlbmlmZWQoJ3JzdnAvdXRpbHMn
LCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisg
IGV4cG9ydHMub2JqZWN0T3JGdW5jdGlvbiA9IG9iamVjdE9yRnVuY3Rpb247CisgIGV4cG9ydHMu
aXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CisgIGV4cG9ydHMuaXNNYXliZVRoZW5hYmxlID0gaXNN
YXliZVRoZW5hYmxlOworCisgIGZ1bmN0aW9uIG9iamVjdE9yRnVuY3Rpb24oeCkgeworICAgIHJl
dHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYg
eCAhPT0gbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oeCkgeworICAgIHJldHVy
biB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJzsKKyAgfQorCisgIGZ1bmN0aW9uIGlzTWF5YmVUaGVu
YWJsZSh4KSB7CisgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxs
OworICB9CisKKyAgdmFyIF9pc0FycmF5OworICBpZiAoIUFycmF5LmlzQXJyYXkpIHsKKyAgICBf
aXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7CisgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50
b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nOworICAgIH07CisgIH0gZWxzZSB7
CisgICAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5OworICB9CisKKyAgdmFyIGlzQXJyYXkgPSBf
aXNBcnJheTsKKworICBleHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5OworICAvLyBEYXRlLm5vdyBp
cyBub3QgYXZhaWxhYmxlIGluIGJyb3dzZXJzIDwgSUU5CisgIC8vIGh0dHBzOi8vZGV2ZWxvcGVy
Lm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9P
YmplY3RzL0RhdGUvbm93I0NvbXBhdGliaWxpdHkKKyAgdmFyIG5vdyA9IERhdGUubm93IHx8IGZ1
bmN0aW9uICgpIHsKKyAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgIH07CisKKyAg
ZXhwb3J0cy5ub3cgPSBub3c7CisgIGZ1bmN0aW9uIEYoKSB7fQorCisgIHZhciBvX2NyZWF0ZSA9
IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKG8pIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0
aCA+IDEpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kIGFyZ3VtZW50IG5vdCBzdXBw
b3J0ZWQnKTsKKyAgICB9CisgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JykgeworICAgICAg
dGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QnKTsKKyAgICB9
CisgICAgRi5wcm90b3R5cGUgPSBvOworICAgIHJldHVybiBuZXcgRigpOworICB9OworICBleHBv
cnRzLm9fY3JlYXRlID0gb19jcmVhdGU7Cit9KTsKK2VuaWZlZCgidmVydGV4IiwgWyJleHBvcnRz
Il0sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgIC8qKgorICAgKiBEQUcgVmVydGV4CisgICAqCisg
ICAqIEBjbGFzcyBWZXJ0ZXgKKyAgICogQGNvbnN0cnVjdG9yCisgICAqLworCisgICJ1c2Ugc3Ry
aWN0IjsKKworICBleHBvcnRzLmRlZmF1bHQgPSBWZXJ0ZXg7CisKKyAgZnVuY3Rpb24gVmVydGV4
KG5hbWUpIHsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuaW5jb21pbmcgPSB7fTsK
KyAgICB0aGlzLmluY29taW5nTmFtZXMgPSBbXTsKKyAgICB0aGlzLmhhc091dGdvaW5nID0gZmFs
c2U7CisgICAgdGhpcy52YWx1ZSA9IG51bGw7CisgIH0KK30pOworZW5pZmVkKCJ2aXNpdCIsIFsi
ZXhwb3J0cyJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgZXhw
b3J0cy5kZWZhdWx0ID0gdmlzaXQ7CisKKyAgZnVuY3Rpb24gdmlzaXQodmVydGV4LCBmbiwgdmlz
aXRlZCwgcGF0aCkgeworICAgIHZhciBuYW1lID0gdmVydGV4Lm5hbWU7CisgICAgdmFyIHZlcnRp
Y2VzID0gdmVydGV4LmluY29taW5nOworICAgIHZhciBuYW1lcyA9IHZlcnRleC5pbmNvbWluZ05h
bWVzOworICAgIHZhciBsZW4gPSBuYW1lcy5sZW5ndGg7CisgICAgdmFyIGk7CisKKyAgICBpZiAo
IXZpc2l0ZWQpIHsKKyAgICAgIHZpc2l0ZWQgPSB7fTsKKyAgICB9CisgICAgaWYgKCFwYXRoKSB7
CisgICAgICBwYXRoID0gW107CisgICAgfQorICAgIGlmICh2aXNpdGVkLmhhc093blByb3BlcnR5
KG5hbWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHBhdGgucHVzaChuYW1lKTsKKyAg
ICB2aXNpdGVkW25hbWVdID0gdHJ1ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsK
KyAgICAgIHZpc2l0KHZlcnRpY2VzW25hbWVzW2ldXSwgZm4sIHZpc2l0ZWQsIHBhdGgpOworICAg
IH0KKyAgICBmbih2ZXJ0ZXgsIHBhdGgpOworICAgIHBhdGgucG9wKCk7CisgIH0KK30pOworcmVx
dWlyZU1vZHVsZSgiZW1iZXIiKTsKKworfSgpKTsKKworOyhmdW5jdGlvbigpIHsKKy8qIGdsb2Jh
bHMgZGVmaW5lLCBFbWJlciwgalF1ZXJ5ICovCisKKyAgZnVuY3Rpb24gcHJvY2Vzc0VtYmVyU2hp
bXMoKSB7CisgICAgdmFyIHNoaW1zID0geworICAgICAgJ2VtYmVyJzogeworICAgICAgICAnZGVm
YXVsdCc6IEVtYmVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLWFwcGxpY2F0aW9uJzogeworICAg
ICAgICAnZGVmYXVsdCc6IEVtYmVyLkFwcGxpY2F0aW9uCisgICAgICB9LAorICAgICAgJ2VtYmVy
LWFycmF5JzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkFycmF5CisgICAgICB9LAorICAg
ICAgJ2VtYmVyLWFycmF5L211dGFibGUnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuTXV0
YWJsZUFycmF5CisgICAgICB9LAorICAgICAgJ2VtYmVyLWFycmF5L3V0aWxzJzogeworICAgICAg
ICAnQSc6ICAgICAgICAgICAgRW1iZXIuQSwKKyAgICAgICAgJ2lzRW1iZXJBcnJheSc6IEVtYmVy
LmlzQXJyYXksCisgICAgICAgICd3cmFwJzogICAgICAgICBFbWJlci5tYWtlQXJyYXkKKyAgICAg
IH0sCisgICAgICAnZW1iZXItY29tcG9uZW50JzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVy
LkNvbXBvbmVudAorICAgICAgfSwKKyAgICAgICdlbWJlci1jb21wb25lbnRzL2NoZWNrYm94Jzog
eworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkNoZWNrYm94CisgICAgICB9LAorICAgICAgJ2Vt
YmVyLWNvbXBvbmVudHMvdGV4dC1hcmVhJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlRl
eHRBcmVhCisgICAgICB9LAorICAgICAgJ2VtYmVyLWNvbXBvbmVudHMvdGV4dC1maWVsZCc6IHsK
KyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5UZXh0RmllbGQKKyAgICAgIH0sCisgICAgICAnZW1i
ZXItY29udHJvbGxlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5Db250cm9sbGVyCisg
ICAgICB9LAorICAgICAgJ2VtYmVyLWNvbnRyb2xsZXIvaW5qZWN0JzogeworICAgICAgICAnZGVm
YXVsdCc6IEVtYmVyLmluamVjdC5jb250cm9sbGVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLWNv
bnRyb2xsZXIvcHJveHknOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuQXJyYXlQcm94eQor
ICAgICAgfSwKKyAgICAgICdlbWJlci1jb250cm9sbGVycy9zb3J0YWJsZSc6IHsKKyAgICAgICAg
J2RlZmF1bHQnOiBFbWJlci5Tb3J0YWJsZU1peGluCisgICAgICB9LAorICAgICAgJ2VtYmVyLWRl
YnVnJzogeworICAgICAgICAnbG9nJzogICAgICBFbWJlci5kZWJ1ZywKKyAgICAgICAgJ2luc3Bl
Y3QnOiAgRW1iZXIuaW5zcGVjdCwKKyAgICAgICAgJ3J1bic6ICAgICAgRW1iZXIucnVuSW5EZWJ1
ZywKKyAgICAgICAgJ3dhcm4nOiAgICAgRW1iZXIud2FybgorICAgICAgfSwKKyAgICAgICdlbWJl
ci1kZWJ1Zy9jb250YWluZXItZGVidWctYWRhcHRlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBF
bWJlci5Db250YWluZXJEZWJ1Z0FkYXB0ZXIKKyAgICAgIH0sCisgICAgICAnZW1iZXItZGVidWcv
ZGF0YS1hZGFwdGVyJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkRhdGFBZGFwdGVyCisg
ICAgICB9LAorICAgICAgJ2VtYmVyLWRlcHJlY2F0aW9ucyc6IHsKKyAgICAgICAgJ2RlcHJlY2F0
ZSc6ICAgICAgRW1iZXIuZGVwcmVjYXRlLAorICAgICAgICAnZGVwcmVjYXRlRnVuYyc6ICBFbWJl
ci5kZXByZWNhdGVGdW5jCisgICAgICB9LAorICAgICAgJ2VtYmVyLWVudW1lcmFibGUnOiB7Cisg
ICAgICAgICdkZWZhdWx0JzogRW1iZXIuRW51bWVyYWJsZQorICAgICAgfSwKKyAgICAgICdlbWJl
ci1ldmVudGVkJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkV2ZW50ZWQKKyAgICAgIH0s
CisgICAgICAnZW1iZXItZXZlbnRlZC9vbic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5v
bgorICAgICAgfSwKKyAgICAgICdlbWJlci1nbG9iYWxzLXJlc29sdmVyJzogeworICAgICAgICAn
ZGVmYXVsdCc6IEVtYmVyLkRlZmF1bHRSZXNvbHZlcgorICAgICAgfSwKKyAgICAgICdlbWJlci1o
ZWxwZXInOiB7CisgICAgICAgICdkZWZhdWx0JzogIEVtYmVyLkhlbHBlciwKKyAgICAgICAgJ2hl
bHBlcic6ICAgRW1iZXIuSGVscGVyICYmIEVtYmVyLkhlbHBlci5oZWxwZXIKKyAgICAgIH0sCisg
ICAgICAnZW1iZXItaW5zdHJ1bWVudGF0aW9uJzogeworICAgICAgICAnaW5zdHJ1bWVudCc6ICAg
RW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQsCisgICAgICAgICdyZXNldCc6ICAgICAg
ICBFbWJlci5JbnN0cnVtZW50YXRpb24ucmVzZXQsCisgICAgICAgICdzdWJzY3JpYmUnOiAgICBF
bWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlLAorICAgICAgICAndW5zdWJzY3JpYmUnOiAg
RW1iZXIuSW5zdHJ1bWVudGF0aW9uLnVuc3Vic2NyaWJlCisgICAgICB9LAorICAgICAgJ2VtYmVy
LWxvY2F0aW9ucy9oYXNoJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLkhhc2hMb2NhdGlv
bgorICAgICAgfSwKKyAgICAgICdlbWJlci1sb2NhdGlvbnMvaGlzdG9yeSc6IHsKKyAgICAgICAg
J2RlZmF1bHQnOiBFbWJlci5IaXN0b3J5TG9jYXRpb24KKyAgICAgIH0sCisgICAgICAnZW1iZXIt
bG9jYXRpb25zL25vbmUnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuTm9uZUxvY2F0aW9u
CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1hcCc6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiAgICAg
IEVtYmVyLk1hcCwKKyAgICAgICAgJ3dpdGhEZWZhdWx0JzogIEVtYmVyLk1hcFdpdGhEZWZhdWx0
CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1ldGFsL2Rlc3Ryb3knOiB7CisgICAgICAgICdkZWZh
dWx0JzogRW1iZXIuZGVzdHJveQorICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9ldmVudHMn
OiB7CisgICAgICAgICdhZGRMaXN0ZW5lcic6ICAgIEVtYmVyLmFkZExpc3RlbmVyLAorICAgICAg
ICAncmVtb3ZlTGlzdGVuZXInOiBFbWJlci5yZW1vdmVMaXN0ZW5lciwKKyAgICAgICAgJ3NlbmQn
OiAgICAgICAgICAgRW1iZXIuc2VuZEV2ZW50CisgICAgICB9LAorICAgICAgJ2VtYmVyLW1ldGFs
L2dldCc6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5nZXQsCisgICAgICAgICdnZXRQcm9w
ZXJ0aWVzJzogRW1iZXIuZ2V0UHJvcGVydGllcworICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRh
bC9taXhpbic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiBFbWJlci5NaXhpbgorICAgICAgfSwKKyAg
ICAgICdlbWJlci1tZXRhbC9vYnNlcnZlcic6IHsKKyAgICAgICAgJ2RlZmF1bHQnOiAgICAgICAg
RW1iZXIub2JzZXJ2ZXIsCisgICAgICAgICdhZGRPYnNlcnZlcic6ICAgIEVtYmVyLmFkZE9ic2Vy
dmVyLAorICAgICAgICAncmVtb3ZlT2JzZXJ2ZXInOiBFbWJlci5yZW1vdmVPYnNlcnZlcgorICAg
ICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9vbi1sb2FkJzogeworICAgICAgICAnZGVmYXVsdCc6
ICBFbWJlci5vbkxvYWQsCisgICAgICAgICdydW4nOiAgICAgIEVtYmVyLnJ1bkxvYWRIb29rcwor
ICAgICAgfSwKKyAgICAgICdlbWJlci1tZXRhbC9zZXQnOiB7CisgICAgICAgICdkZWZhdWx0Jzog
ICAgICAgIEVtYmVyLnNldCwKKyAgICAgICAgJ3NldFByb3BlcnRpZXMnOiAgRW1iZXIuc2V0UHJv
cGVydGllcywKKyAgICAgICAgJ3RyeVNldCc6ICAgICAgICAgRW1iZXIudHJ5U2V0CisgICAgICB9
LAorICAgICAgJ2VtYmVyLW1ldGFsL3V0aWxzJzogeworICAgICAgICAnYWxpYXNNZXRob2QnOiAg
RW1iZXIuYWxpYXNNZXRob2QsCisgICAgICAgICdhc3NlcnQnOiAgICAgICBFbWJlci5hc3NlcnQs
CisgICAgICAgICdjYWNoZUZvcic6ICAgICBFbWJlci5jYWNoZUZvciwKKyAgICAgICAgJ2NvcHkn
OiAgICAgICAgIEVtYmVyLmNvcHksCisgICAgICAgICdndWlkRm9yJzogICAgICBFbWJlci5ndWlk
Rm9yCisgICAgICB9LAorICAgICAgJ2VtYmVyLW9iamVjdCc6IHsKKyAgICAgICAgJ2RlZmF1bHQn
OiBFbWJlci5PYmplY3QKKyAgICAgIH0sCisgICAgICAnZW1iZXItcGxhdGZvcm0nOiB7CisgICAg
ICAgICdhc3NpZ24nOiAgICAgICAgIEVtYmVyLm1lcmdlLAorICAgICAgICAnY3JlYXRlJzogICAg
ICAgICBFbWJlci5jcmVhdGUsCisgICAgICAgICdkZWZpbmVQcm9wZXJ0eSc6IEVtYmVyLnBsYXRm
b3JtLmRlZmluZVByb3BlcnR5LAorICAgICAgICAnaGFzQWNjZXNzb3JzJzogICBFbWJlci5wbGF0
Zm9ybS5oYXNQcm9wZXJ0eUFjY2Vzc29ycywKKyAgICAgICAgJ2tleXMnOiAgICAgICAgICAgRW1i
ZXIua2V5cworICAgICAgfSwKKyAgICAgICdlbWJlci1yb3V0ZSc6IHsKKyAgICAgICAgJ2RlZmF1
bHQnOiBFbWJlci5Sb3V0ZQorICAgICAgfSwKKyAgICAgICdlbWJlci1yb3V0ZXInOiB7CisgICAg
ICAgICdkZWZhdWx0JzogRW1iZXIuUm91dGVyCisgICAgICB9LAorICAgICAgJ2VtYmVyLXJ1bmxv
b3AnOiB7CisgICAgICAgICdkZWZhdWx0JzogICAgICBFbWJlci5ydW4sCisgICAgICAgICdiZWdp
bic6ICAgICAgICBFbWJlci5ydW4uYmVnaW4sCisgICAgICAgICdiaW5kJzogICAgICAgICBFbWJl
ci5ydW4uYmluZCwKKyAgICAgICAgJ2NhbmNlbCc6ICAgICAgIEVtYmVyLnJ1bi5jYW5jZWwsCisg
ICAgICAgICdkZWJvdW5jZSc6ICAgICBFbWJlci5ydW4uZGVib3VuY2UsCisgICAgICAgICdlbmQn
OiAgICAgICAgICBFbWJlci5ydW4uZW5kLAorICAgICAgICAnam9pbic6ICAgICAgICAgRW1iZXIu
cnVuLmpvaW4sCisgICAgICAgICdsYXRlcic6ICAgICAgICBFbWJlci5ydW4ubGF0ZXIsCisgICAg
ICAgICduZXh0JzogICAgICAgICBFbWJlci5ydW4ubmV4dCwKKyAgICAgICAgJ29uY2UnOiAgICAg
ICAgIEVtYmVyLnJ1bi5vbmNlLAorICAgICAgICAnc2NoZWR1bGUnOiAgICAgRW1iZXIucnVuLnNj
aGVkdWxlLAorICAgICAgICAnc2NoZWR1bGVPbmNlJzogRW1iZXIucnVuLnNjaGVkdWxlT25jZSwK
KyAgICAgICAgJ3Rocm90dGxlJzogICAgIEVtYmVyLnJ1bi50aHJvdHRsZQorICAgICAgfSwKKyAg
ICAgICdlbWJlci1zZXJ2aWNlJzogeworICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlNlcnZpY2UK
KyAgICAgIH0sCisgICAgICAnZW1iZXItc2VydmljZS9pbmplY3QnOiB7CisgICAgICAgICdkZWZh
dWx0JzogRW1iZXIuaW5qZWN0LnNlcnZpY2UKKyAgICAgIH0sCisgICAgICAnZW1iZXItc2V0L29y
ZGVyZWQnOiB7CisgICAgICAgICdkZWZhdWx0JzogRW1iZXIuT3JkZXJlZFNldAorICAgICAgfSwK
KyAgICAgICdlbWJlci1zdHJpbmcnOiB7CisgICAgICAgICdjYW1lbGl6ZSc6ICAgICBFbWJlci5T
dHJpbmcuY2FtZWxpemUsCisgICAgICAgICdjYXBpdGFsaXplJzogICBFbWJlci5TdHJpbmcuY2Fw
aXRhbGl6ZSwKKyAgICAgICAgJ2NsYXNzaWZ5JzogICAgIEVtYmVyLlN0cmluZy5jbGFzc2lmeSwK
KyAgICAgICAgJ2Rhc2hlcml6ZSc6ICAgIEVtYmVyLlN0cmluZy5kYXNoZXJpemUsCisgICAgICAg
ICdkZWNhbWVsaXplJzogICBFbWJlci5TdHJpbmcuZGVjYW1lbGl6ZSwKKyAgICAgICAgJ2ZtdCc6
ICAgICAgICAgIEVtYmVyLlN0cmluZy5mbXQsCisgICAgICAgICdodG1sU2FmZSc6ICAgICBFbWJl
ci5TdHJpbmcuaHRtbFNhZmUsCisgICAgICAgICdsb2MnOiAgICAgICAgICBFbWJlci5TdHJpbmcu
bG9jLAorICAgICAgICAndW5kZXJzY29yZSc6ICAgRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUsCisg
ICAgICAgICd3JzogICAgICAgICAgICBFbWJlci5TdHJpbmcudworICAgICAgfSwKKyAgICAgICdl
bWJlci11dGlscyc6IHsKKyAgICAgICAgJ2lzQmxhbmsnOiAgICBFbWJlci5pc0JsYW5rLAorICAg
ICAgICAnaXNFbXB0eSc6ICAgIEVtYmVyLmlzRW1wdHksCisgICAgICAgICdpc05vbmUnOiAgICAg
RW1iZXIuaXNOb25lLAorICAgICAgICAnaXNQcmVzZW50JzogIEVtYmVyLmlzUHJlc2VudCwKKyAg
ICAgICAgJ3RyeUludm9rZSc6ICBFbWJlci50cnlJbnZva2UsCisgICAgICAgICd0eXBlT2YnOiAg
ICAgRW1iZXIudHlwZU9mCisgICAgICB9CisgICAgfTsKKworICAgIC8vIHBvcHVsYXRlIGBlbWJl
ci9jb21wdXRlZGAgbmFtZWQgZXhwb3J0cworICAgIHNoaW1zWydlbWJlci1jb21wdXRlZCddID0g
eworICAgICAgJ2RlZmF1bHQnOiBFbWJlci5jb21wdXRlZAorICAgIH07CisgICAgdmFyIGNvbXB1
dGVkTWFjcm9zID0gWworICAgICAgImVtcHR5Iiwibm90RW1wdHkiLCAibm9uZSIsICJub3QiLCAi
Ym9vbCIsICJtYXRjaCIsCisgICAgICAiZXF1YWwiLCAiZ3QiLCAiZ3RlIiwgImx0IiwgImx0ZSIs
ICJhbGlhcyIsICJvbmVXYXkiLAorICAgICAgInJlYWRzIiwgInJlYWRPbmx5IiwgImRlcHJlY2F0
aW5nQWxpYXMiLAorICAgICAgImFuZCIsICJvciIsICJjb2xsZWN0IiwgInN1bSIsICJtaW4iLCAi
bWF4IiwKKyAgICAgICJtYXAiLCAic29ydCIsICJzZXREaWZmIiwgIm1hcEJ5IiwgIm1hcFByb3Bl
cnR5IiwKKyAgICAgICJmaWx0ZXIiLCAiZmlsdGVyQnkiLCAiZmlsdGVyUHJvcGVydHkiLCAidW5p
cSIsCisgICAgICAidW5pb24iLCAiaW50ZXJzZWN0IgorICAgIF07CisgICAgZm9yICh2YXIgaSA9
IDAsIGwgPSBjb21wdXRlZE1hY3Jvcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKyAgICAgIHZhciBr
ZXkgPSBjb21wdXRlZE1hY3Jvc1tpXTsKKyAgICAgIHNoaW1zWydlbWJlci1jb21wdXRlZCddW2tl
eV0gPSBFbWJlci5jb21wdXRlZFtrZXldOworICAgIH0KKworICAgIGZvciAodmFyIG1vZHVsZU5h
bWUgaW4gc2hpbXMpIHsKKyAgICAgIGdlbmVyYXRlTW9kdWxlKG1vZHVsZU5hbWUsIHNoaW1zW21v
ZHVsZU5hbWVdKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzVGVzdFNoaW1zKCkg
eworICAgIGlmIChFbWJlci5UZXN0KSB7CisgICAgICB2YXIgdGVzdFNoaW1zID0geworICAgICAg
ICAnZW1iZXItdGVzdCc6IHsKKyAgICAgICAgICAnZGVmYXVsdCc6IEVtYmVyLlRlc3QKKyAgICAg
ICAgfSwKKyAgICAgICAgJ2VtYmVyLXRlc3QvYWRhcHRlcic6IHsKKyAgICAgICAgICAnZGVmYXVs
dCc6IEVtYmVyLlRlc3QuQWRhcHRlcgorICAgICAgICB9LAorICAgICAgICAnZW1iZXItdGVzdC9x
dW5pdC1hZGFwdGVyJzogeworICAgICAgICAgICdkZWZhdWx0JzogRW1iZXIuVGVzdC5RVW5pdEFk
YXB0ZXIKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgZm9yICh2YXIgbW9kdWxlTmFtZSBp
biB0ZXN0U2hpbXMpIHsKKyAgICAgICAgZ2VuZXJhdGVNb2R1bGUobW9kdWxlTmFtZSwgdGVzdFNo
aW1zW21vZHVsZU5hbWVdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBnZW5l
cmF0ZU1vZHVsZShuYW1lLCB2YWx1ZXMpIHsKKyAgICBkZWZpbmUobmFtZSwgW10sIGZ1bmN0aW9u
KCkgeworICAgICAgJ3VzZSBzdHJpY3QnOworCisgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0p
OworICB9CisKKyAgcHJvY2Vzc0VtYmVyU2hpbXMoKTsKKyAgcHJvY2Vzc1Rlc3RTaGltcygpOwor
ICBnZW5lcmF0ZU1vZHVsZSgnanF1ZXJ5JywgeyAnZGVmYXVsdCc6IHNlbGYualF1ZXJ5IH0pOwor
ICBnZW5lcmF0ZU1vZHVsZSgncnN2cCcsIHsgJ2RlZmF1bHQnOiBFbWJlci5SU1ZQIH0pOworfSko
KTsKKworOy8qIGdsb2JhbHMgZGVmaW5lICovCitkZWZpbmUoJ2VtYmVyL2xvYWQtaW5pdGlhbGl6
ZXJzJywgWydleHBvcnRzJywgJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJywgJ2VtYmVyJ10sIGZ1
bmN0aW9uKGV4cG9ydHMsIGxvYWRJbml0aWFsaXplcnMsIEVtYmVyKSB7CisgIEVtYmVyWydkZWZh
dWx0J10uZGVwcmVjYXRlKAorICAgICdVc2FnZSBvZiBgJyArICdlbWJlci9sb2FkLWluaXRpYWxp
emVycycgKyAnYCBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVwZGF0ZSB0byBgZW1iZXIt
bG9hZC1pbml0aWFsaXplcnNgLicsCisgICAgZmFsc2UsCisgICAgeyBpZDogJ2VtYmVyLWxvYWQt
aW5pdGlhbGl6ZXJzLmxlZ2FjeS1zaGltcycsIHVudGlsOiAnMy4wLjAnIH0KKyAgKTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSBsb2FkSW5pdGlhbGl6ZXJzWydkZWZhdWx0J107Cit9KTsKKwor
Oy8qIGdsb2JhbHMgZGVmaW5lICovCisKK2Z1bmN0aW9uIGNyZWF0ZURlcHJlY2F0ZWRNb2R1bGUo
bW9kdWxlSWQpIHsKKyAgZGVmaW5lKG1vZHVsZUlkLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2
ZXIvcmVzb2x2ZXInLCAnZW1iZXInXSwgZnVuY3Rpb24oZXhwb3J0cywgUmVzb2x2ZXIsIEVtYmVy
KSB7CisgICAgRW1iZXJbJ2RlZmF1bHQnXS5kZXByZWNhdGUoCisgICAgICAnVXNhZ2Ugb2YgYCcg
KyBtb2R1bGVJZCArICdgIG1vZHVsZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXBkYXRlIHRvIGBl
bWJlci1yZXNvbHZlcmAuJywKKyAgICAgIGZhbHNlLAorICAgICAgeyBpZDogJ2VtYmVyLXJlc29s
dmVyLmxlZ2FjeS1zaGltcycsIHVudGlsOiAnMy4wLjAnIH0KKyAgICApOworCisgICAgZXhwb3J0
c1snZGVmYXVsdCddID0gUmVzb2x2ZXJbJ2RlZmF1bHQnXTsKKyAgfSk7Cit9CisKK2NyZWF0ZURl
cHJlY2F0ZWRNb2R1bGUoJ2VtYmVyL3Jlc29sdmVyJyk7CitjcmVhdGVEZXByZWNhdGVkTW9kdWxl
KCdyZXNvbHZlcicpOworCis7ZGVmaW5lKCdlbWJlci1hamF4L2Vycm9ycycsIFsnZXhwb3J0cycs
ICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzLkFqYXhFcnJvciA9IEFqYXhFcnJvcjsKKyAgZXhwb3J0cy5JbnZhbGlkRXJy
b3IgPSBJbnZhbGlkRXJyb3I7CisgIGV4cG9ydHMuVW5hdXRob3JpemVkRXJyb3IgPSBVbmF1dGhv
cml6ZWRFcnJvcjsKKyAgZXhwb3J0cy5Gb3JiaWRkZW5FcnJvciA9IEZvcmJpZGRlbkVycm9yOwor
CisgIHZhciBFbWJlckVycm9yID0gX2VtYmVyWydkZWZhdWx0J10uRXJyb3I7CisKKyAgLyoqCisg
ICAgQGNsYXNzIEFqYXhFcnJvcgorICAgIEBuYW1lc3BhY2UgRFMKKyAgKi8KKworICBmdW5jdGlv
biBBamF4RXJyb3IoZXJyb3JzKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHMubGVuZ3Ro
IDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnQWpheCBvcGVyYXRpb24gZmFp
bGVkJyA6IGFyZ3VtZW50c1sxXTsKKworICAgIEVtYmVyRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdl
KTsKKworICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzIHx8IFt7CisgICAgICB0aXRsZTogJ0FqYXgg
RXJyb3InLAorICAgICAgZGV0YWlsOiBtZXNzYWdlCisgICAgfV07CisgIH0KKworICBBamF4RXJy
b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFbWJlckVycm9yLnByb3RvdHlwZSk7CisKKyAg
ZnVuY3Rpb24gSW52YWxpZEVycm9yKGVycm9ycykgeworICAgIEFqYXhFcnJvci5jYWxsKHRoaXMs
IGVycm9ycywgJ1JlcXVlc3Qgd2FzIHJlamVjdGVkIGJlY2F1c2UgaXQgd2FzIGludmFsaWQnKTsK
KyAgfQorCisgIEludmFsaWRFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFqYXhFcnJv
ci5wcm90b3R5cGUpOworCisgIGZ1bmN0aW9uIFVuYXV0aG9yaXplZEVycm9yKGVycm9ycykgewor
ICAgIEFqYXhFcnJvci5jYWxsKHRoaXMsIGVycm9ycywgJ0FqYXggYXV0aG9yaXphdGlvbiBmYWls
ZWQnKTsKKyAgfQorCisgIFVuYXV0aG9yaXplZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoQWpheEVycm9yLnByb3RvdHlwZSk7CisKKyAgZnVuY3Rpb24gRm9yYmlkZGVuRXJyb3IoZXJy
b3JzKSB7CisgICAgQWpheEVycm9yLmNhbGwodGhpcywgZXJyb3JzLCAnUmVxdWVzdCB3YXMgcmVq
ZWN0ZWQgYmVjYXVzZSB1c2VyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gcGVyZm9ybSB0aGlzIG9wZXJh
dGlvbi4nKTsKKyAgfQorCisgIEZvcmJpZGRlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoQWpheEVycm9yLnByb3RvdHlwZSk7Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9pbmRleCcs
IFsnZXhwb3J0cycsICdlbWJlci1hamF4L3JlcXVlc3QnXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9l
bWJlckFqYXhSZXF1ZXN0KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBPYmplY3QuZGVmaW5lUHJv
cGVydHkoZXhwb3J0cywgJ2RlZmF1bHQnLCB7CisgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAgICBn
ZXQ6IGZ1bmN0aW9uIGdldCgpIHsKKyAgICAgIHJldHVybiBfZW1iZXJBamF4UmVxdWVzdFsnZGVm
YXVsdCddOworICAgIH0KKyAgfSk7Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9tYWtlLXByb21p
c2UnLCBbJ2V4cG9ydHMnLCAnZW1iZXInXSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlcikgewor
ICAndXNlIHN0cmljdCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gbWFrZVByb21pc2U7CisK
KyAgdmFyIHJ1biA9IF9lbWJlclsnZGVmYXVsdCddLnJ1bjsKKyAgdmFyIFJTVlAgPSBfZW1iZXJb
J2RlZmF1bHQnXS5SU1ZQOworCisgIGZ1bmN0aW9uIG1ha2VQcm9taXNlKHNldHRpbmdzKSB7Cisg
ICAgdmFyIHR5cGUgPSBzZXR0aW5ncy50eXBlIHx8ICdHRVQnOworICAgIHJldHVybiBuZXcgUlNW
UC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKKyAgICAgIHNldHRpbmdzLnN1
Y2Nlc3MgPSBtYWtlU3VjY2VzcyhyZXNvbHZlKTsKKyAgICAgIHNldHRpbmdzLmVycm9yID0gbWFr
ZUVycm9yKHJlamVjdCk7CisgICAgICBfZW1iZXJbJ2RlZmF1bHQnXS4kLmFqYXgoc2V0dGluZ3Mp
OworICAgIH0sICdlbWJlci1hamF4OiAnICsgdHlwZSArICcgdG8gJyArIHNldHRpbmdzLnVybCk7
CisgIH0KKworICBmdW5jdGlvbiBtYWtlU3VjY2VzcyhyZXNvbHZlKSB7CisgICAgcmV0dXJuIGZ1
bmN0aW9uIHN1Y2Nlc3MocmVzcG9uc2UsIHRleHRTdGF0dXMsIGpxWEhSKSB7CisgICAgICBydW4o
bnVsbCwgcmVzb2x2ZSwgeworICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCisgICAgICAgIHRl
eHRTdGF0dXM6IHRleHRTdGF0dXMsCisgICAgICAgIGpxWEhSOiBqcVhIUgorICAgICAgfSk7Cisg
ICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIG1ha2VFcnJvcihyZWplY3QpIHsKKyAgICByZXR1cm4g
ZnVuY3Rpb24gZXJyb3IoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7CisgICAgICBy
dW4obnVsbCwgcmVqZWN0LCB7CisgICAgICAgIGpxWEhSOiBqcVhIUiwKKyAgICAgICAgdGV4dFN0
YXR1czogdGV4dFN0YXR1cywKKyAgICAgICAgZXJyb3JUaHJvd246IGVycm9yVGhyb3duCisgICAg
ICB9KTsKKyAgICB9OworICB9Cit9KTsKK2RlZmluZSgnZW1iZXItYWpheC9yYXcnLCBbJ2V4cG9y
dHMnLCAnZW1iZXItYWpheC9tYWtlLXByb21pc2UnLCAnZW1iZXItYWpheC91dGlscy9wYXJzZS1h
cmdzJywgJ2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJBamF4TWFrZVByb21pc2Us
IF9lbWJlckFqYXhVdGlsc1BhcnNlQXJncywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKwor
ICB2YXIgX3NsaWNlZFRvQXJyYXkgPSAoZnVuY3Rpb24gKCkgeworICAgIGZ1bmN0aW9uIHNsaWNl
SXRlcmF0b3IoYXJyLCBpKSB7CisgICAgICB2YXIgX2FyciA9IFtdO3ZhciBfbiA9IHRydWU7dmFy
IF9kID0gZmFsc2U7dmFyIF9lID0gdW5kZWZpbmVkO3RyeSB7CisgICAgICAgIGZvciAodmFyIF9p
ID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRv
bmUpOyBfbiA9IHRydWUpIHsKKyAgICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO2lmIChpICYm
IF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZXJy
KSB7CisgICAgICAgIF9kID0gdHJ1ZTtfZSA9IGVycjsKKyAgICAgIH0gZmluYWxseSB7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgaWYgKCFfbiAmJiBfaVsncmV0dXJuJ10pIF9pWydyZXR1cm4n
XSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGlmIChfZCkgdGhyb3cgX2U7Cisg
ICAgICAgIH0KKyAgICAgIH1yZXR1cm4gX2FycjsKKyAgICB9cmV0dXJuIGZ1bmN0aW9uIChhcnIs
IGkpIHsKKyAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKKyAgICAgICAgcmV0dXJuIGFy
cjsKKyAgICAgIH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7Cisg
ICAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7CisgICAgICB9IGVsc2UgeworICAg
ICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUg
bm9uLWl0ZXJhYmxlIGluc3RhbmNlJyk7CisgICAgICB9CisgICAgfTsKKyAgfSkoKTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSByYXc7CisKKyAgdmFyIGRlcHJlY2F0ZSA9IF9lbWJlclsnZGVm
YXVsdCddLmRlcHJlY2F0ZTsKKworICAvKgorICAgKiBTYW1lIGFzIGByZXF1ZXN0YCBleGNlcHQg
aXQgcmVzb2x2ZXMgYW4gb2JqZWN0IHdpdGggYHtyZXNwb25zZSwgdGV4dFN0YXR1cywKKyAgICog
anFYSFJ9YCwgdXNlZnVsIGlmIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUganFYSFIgb2JqZWN0IGZv
ciBoZWFkZXJzLCBldGMuCisgICAqLworICBmdW5jdGlvbiByYXcoKSB7CisgICAgZGVwcmVjYXRl
KCdlbWJlci1hamF4L3JhdyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZW1i
ZXItYWpheEAyLjAuMCcsIGZhbHNlLCB7IGlkOiAnZW1iZXItYWpheC5yYXcnIH0pOworCisgICAg
dmFyIF9wYXJzZUFyZ3MkYXBwbHkgPSBfZW1iZXJBamF4VXRpbHNQYXJzZUFyZ3NbJ2RlZmF1bHQn
XS5hcHBseShudWxsLCBhcmd1bWVudHMpOworCisgICAgdmFyIF9wYXJzZUFyZ3MkYXBwbHkyID0g
X3NsaWNlZFRvQXJyYXkoX3BhcnNlQXJncyRhcHBseSwgMyk7CisKKyAgICB2YXIgdXJsID0gX3Bh
cnNlQXJncyRhcHBseTJbMF07CisgICAgdmFyIHR5cGUgPSBfcGFyc2VBcmdzJGFwcGx5MlsxXTsK
KyAgICB2YXIgc2V0dGluZ3MgPSBfcGFyc2VBcmdzJGFwcGx5MlsyXTsKKworICAgIGlmICghc2V0
dGluZ3MpIHsKKyAgICAgIHNldHRpbmdzID0ge307CisgICAgfQorICAgIHNldHRpbmdzLnVybCA9
IHVybDsKKyAgICBzZXR0aW5ncy50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gKDAsIF9lbWJlckFq
YXhNYWtlUHJvbWlzZVsnZGVmYXVsdCddKShzZXR0aW5ncyk7CisgIH0KK30pOworZGVmaW5lKCdl
bWJlci1hamF4L3JlcXVlc3QnLCBbJ2V4cG9ydHMnLCAnZW1iZXItYWpheC9yYXcnLCAnZW1iZXIn
XSwgZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlckFqYXhSYXcsIF9lbWJlcikgeworICAndXNlIHN0
cmljdCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gcmVxdWVzdDsKKworICB2YXIgZGVwcmVj
YXRlID0gX2VtYmVyWydkZWZhdWx0J10uZGVwcmVjYXRlOworCisgIC8qCisgICAqIGpRdWVyeS5h
amF4IHdyYXBwZXIsIHN1cHBvcnRzIHRoZSBzYW1lIHNpZ25hdHVyZSBleGNlcHQgcHJvdmlkaW5n
CisgICAqIGBzdWNjZXNzYCBhbmQgYGVycm9yYCBoYW5kbGVycyB3aWxsIHRocm93IGFuIGVycm9y
ICh1c2UgcHJvbWlzZXMgaW5zdGVhZCkKKyAgICogYW5kIGl0IHJlc29sdmVzIG9ubHkgdGhlIHJl
c3BvbnNlIChubyBhY2Nlc3MgdG8ganFYSFIgb3IgdGV4dFN0YXR1cykuCisgICAqLworICBmdW5j
dGlvbiByZXF1ZXN0KCkgeworICAgIGRlcHJlY2F0ZSgnZW1iZXItYWpheC9yZXF1ZXN0IGlzIGRl
cHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBlbWJlci1hamF4QDIuMC4wJywgZmFsc2Us
IHsgaWQ6ICdlbWJlci1hamF4LnJhdycgfSk7CisgICAgcmV0dXJuIF9lbWJlckFqYXhSYXdbJ2Rl
ZmF1bHQnXS5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbiAocmVzdWx0
KSB7CisgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlOworICAgIH0sIG51bGwsICdlbWJlci1h
amF4OiB1bndyYXAgcmF3IGFqYXggcmVzcG9uc2UnKTsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVy
LWFqYXgvc2VydmljZXMvYWpheCcsIFsnZXhwb3J0cycsICdlbWJlcicsICdlbWJlci1hamF4L2Vy
cm9ycycsICdlbWJlci1hamF4L3V0aWxzL3BhcnNlLXJlc3BvbnNlLWhlYWRlcnMnXSwgZnVuY3Rp
b24gKGV4cG9ydHMsIF9lbWJlciwgX2VtYmVyQWpheEVycm9ycywgX2VtYmVyQWpheFV0aWxzUGFy
c2VSZXNwb25zZUhlYWRlcnMpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIHZhciBkZXByZWNhdGUg
PSBfZW1iZXJbJ2RlZmF1bHQnXS5kZXByZWNhdGU7CisgIHZhciBnZXQgPSBfZW1iZXJbJ2RlZmF1
bHQnXS5nZXQ7CisgIHZhciBpc0JsYW5rID0gX2VtYmVyWydkZWZhdWx0J10uaXNCbGFuazsKKwor
ICAvKioKKyAgICAjIyMgSGVhZGVycyBjdXN0b21pemF0aW9uCisgIAorICAgIFNvbWUgQVBJcyBy
ZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBwcm92aWRlIGFuIEFQSSBrZXkuIEFyYml0cmFy
eQorICAgIGhlYWRlcnMgY2FuIGJlIHNldCBhcyBrZXkvdmFsdWUgcGFpcnMgb24gdGhlIGBSRVNU
QWRhcHRlcmAncyBgaGVhZGVyc2AKKyAgICBvYmplY3QgYW5kIEVtYmVyIERhdGEgd2lsbCBzZW5k
IHRoZW0gYWxvbmcgd2l0aCBlYWNoIGFqYXggcmVxdWVzdC4KKyAgCisgICAgYGBgYXBwL3NlcnZp
Y2VzL2FqYXgKKyAgICBpbXBvcnQgQWpheFNlcnZpY2UgZnJvbSAnZW1iZXItYWpheC9zZXJ2aWNl
cy9hamF4JzsKKyAgCisgICAgZXhwb3J0IGRlZmF1bHQgQWpheFNlcnZpY2UuZXh0ZW5kKHsKKyAg
ICAgIGhlYWRlcnM6IHsKKyAgICAgICAgIkFQSV9LRVkiOiAic2VjcmV0IGtleSIsCisgICAgICAg
ICJBTk9USEVSX0hFQURFUiI6ICJTb21lIGhlYWRlciB2YWx1ZSIKKyAgICAgIH0KKyAgICB9KTsK
KyAgICBgYGAKKyAgCisgICAgYGhlYWRlcnNgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjb21wdXRl
ZCBwcm9wZXJ0eSB0byBzdXBwb3J0IGR5bmFtaWMKKyAgICBoZWFkZXJzLgorICAKKyAgICBgYGBh
cHAvc2VydmljZXMvYWpheC5qcworICAgIGltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisgICAg
aW1wb3J0IEFqYXhTZXJ2aWNlIGZyb20gJ2VtYmVyLWFqYXgvc2VydmljZXMvYWpheCc7CisgIAor
ICAgIGV4cG9ydCBkZWZhdWx0IEFqYXhTZXJ2aWNlLmV4dGVuZCh7CisgICAgICBzZXNzaW9uOiBF
bWJlci5pbmplY3Quc2VydmljZSgpLAorICAgICAgaGVhZGVyczogRW1iZXIuY29tcHV0ZWQoInNl
c3Npb24uYXV0aFRva2VuIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAg
ICAgIkFQSV9LRVkiOiB0aGlzLmdldCgic2Vzc2lvbi5hdXRoVG9rZW4iKSwKKyAgICAgICAgICAi
QU5PVEhFUl9IRUFERVIiOiAiU29tZSBoZWFkZXIgdmFsdWUiCisgICAgICAgIH07CisgICAgICB9
KQorICAgIH0pOworICAgIGBgYAorICAKKyAgICBJbiBzb21lIGNhc2VzLCB5b3VyIGR5bmFtaWMg
aGVhZGVycyBtYXkgcmVxdWlyZSBkYXRhIGZyb20gc29tZQorICAgIG9iamVjdCBvdXRzaWRlIG9m
IEVtYmVyJ3Mgb2JzZXJ2ZXIgc3lzdGVtIChmb3IgZXhhbXBsZQorICAgIGBkb2N1bWVudC5jb29r
aWVgKS4gWW91IGNhbiB1c2UgdGhlCisgICAgW3ZvbGF0aWxlXSgvYXBpL2NsYXNzZXMvRW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eS5odG1sI21ldGhvZF92b2xhdGlsZSkKKyAgICBmdW5jdGlvbiB0byBz
ZXQgdGhlIHByb3BlcnR5IGludG8gYSBub24tY2FjaGVkIG1vZGUgY2F1c2luZyB0aGUgaGVhZGVy
cyB0bworICAgIGJlIHJlY29tcHV0ZWQgd2l0aCBldmVyeSByZXF1ZXN0LgorICAKKyAgICBgYGBh
cHAvc2VydmljZXMvYWpheC5qcworICAgIGltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisgICAg
aW1wb3J0IEFqYXhTZXJ2aWNlIGZyb20gJ2VtYmVyLWFqYXgvc2VydmljZXMvYWpheCc7CisgIAor
ICAgIGV4cG9ydCBkZWZhdWx0IEFqYXhTZXJ2aWNlLmV4dGVuZCh7CisgICAgICBzZXNzaW9uOiBF
bWJlci5pbmplY3Quc2VydmljZSgpLAorICAgICAgaGVhZGVyczogRW1iZXIuY29tcHV0ZWQoInNl
c3Npb24uYXV0aFRva2VuIiwgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAg
ICAgIkFQSV9LRVkiOiBFbWJlci5nZXQoZG9jdW1lbnQuY29va2llLm1hdGNoKC9hcGlLZXlcPShb
XjtdKikvKSwgIjEiKSwKKyAgICAgICAgICAiQU5PVEhFUl9IRUFERVIiOiAiU29tZSBoZWFkZXIg
dmFsdWUiCisgICAgICAgIH07CisgICAgICB9KS52b2xhdGlsZSgpCisgICAgfSk7CisgICAgYGBg
CisgIAorICAqKi8KKyAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uU2Vy
dmljZS5leHRlbmQoeworCisgICAgcmVxdWVzdDogZnVuY3Rpb24gcmVxdWVzdCh1cmwsIG9wdGlv
bnMpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHZhciBvcHRzOworCisgICAg
ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcn
KSB7CisgICAgICAgIGRlcHJlY2F0ZSgnZW1iZXItYWpheC9hamF4I3JlcXVlc3QgY2FsbGluZyBy
ZXF1ZXN0IHdpdGggYHR5cGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBl
bWJlci1hamF4QDEuMC4wLiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgdHlwZSBwYXNzIGFuIG9i
amVjdCBsaWtlIHt0eXBlOiBcJ0RFTEVURVwnfScsIGZhbHNlLCB7IGlkOiAnZW1iZXItYWpheC5z
ZXJ2aWNlLnJlcXVlc3QnIH0pOworCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikg
eworICAgICAgICAgIG9wdHMgPSBhcmd1bWVudHNbMl07CisgICAgICAgICAgb3B0cy50eXBlID0g
b3B0aW9uczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvcHRzID0geyB0eXBlOiBvcHRp
b25zIH07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9wdHMgPSBvcHRpb25z
OworICAgICAgfQorCisgICAgICB2YXIgaGFzaCA9IHRoaXMub3B0aW9ucyh1cmwsIG9wdHMpOwor
CisgICAgICByZXR1cm4gbmV3IF9lbWJlclsnZGVmYXVsdCddLlJTVlAuUHJvbWlzZShmdW5jdGlv
biAocmVzb2x2ZSwgcmVqZWN0KSB7CisKKyAgICAgICAgaGFzaC5zdWNjZXNzID0gZnVuY3Rpb24g
KHBheWxvYWQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CisgICAgICAgICAgdmFyIHJlc3BvbnNlID0g
X3RoaXMuaGFuZGxlUmVzcG9uc2UoanFYSFIuc3RhdHVzLCAoMCwgX2VtYmVyQWpheFV0aWxzUGFy
c2VSZXNwb25zZUhlYWRlcnNbJ2RlZmF1bHQnXSkoanFYSFIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJz
KCkpLCBwYXlsb2FkKTsKKworICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIF9lbWJl
ckFqYXhFcnJvcnMuQWpheEVycm9yKSB7CisgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpOwor
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAg
ICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uIChqcVhI
UiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKKyAgICAgICAgICB2YXIgZXJyb3IgPSB1bmRl
ZmluZWQ7CisKKyAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkgeworICAg
ICAgICAgICAgaWYgKGVycm9yVGhyb3duIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAg
ICAgZXJyb3IgPSBlcnJvclRocm93bjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgIGVycm9yID0gX3RoaXMuaGFuZGxlUmVzcG9uc2UoanFYSFIuc3RhdHVzLCAoMCwgX2VtYmVy
QWpheFV0aWxzUGFyc2VSZXNwb25zZUhlYWRlcnNbJ2RlZmF1bHQnXSkoanFYSFIuZ2V0QWxsUmVz
cG9uc2VIZWFkZXJzKCkpLCBfdGhpcy5wYXJzZUVycm9yUmVzcG9uc2UoanFYSFIucmVzcG9uc2VU
ZXh0KSB8fCBlcnJvclRocm93bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAg
ICAgIHJlamVjdChlcnJvcik7CisgICAgICAgIH07CisKKyAgICAgICAgX2VtYmVyWydkZWZhdWx0
J10uJC5hamF4KGhhc2gpOworICAgICAgfSwgJ2VtYmVyLWFqYXg6ICcgKyBoYXNoLnR5cGUgKyAn
IHRvICcgKyB1cmwpOworICAgIH0sCisKKyAgICAvLyBjYWxscyBgcmVxdWVzdCgpYCBidXQgZm9y
Y2VzIGBvcHRpb25zLnR5cGVgIHRvIGBQT1NUYAorICAgIHBvc3Q6IGZ1bmN0aW9uIHBvc3QodXJs
LCBvcHRpb25zKSB7CisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgdGhpcy5fYWRkVHlw
ZVRvT3B0aW9uc0ZvcihvcHRpb25zLCAnUE9TVCcpKTsKKyAgICB9LAorCisgICAgLy8gY2FsbHMg
YHJlcXVlc3QoKWAgYnV0IGZvcmNlcyBgb3B0aW9ucy50eXBlYCB0byBgUFVUYAorICAgIHB1dDog
ZnVuY3Rpb24gcHV0KHVybCwgb3B0aW9ucykgeworICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1
cmwsIHRoaXMuX2FkZFR5cGVUb09wdGlvbnNGb3Iob3B0aW9ucywgJ1BVVCcpKTsKKyAgICB9LAor
CisgICAgLy8gY2FsbHMgYHJlcXVlc3QoKWAgYnV0IGZvcmNlcyBgb3B0aW9ucy50eXBlYCB0byBg
UEFUQ0hgCisgICAgcGF0Y2g6IGZ1bmN0aW9uIHBhdGNoKHVybCwgb3B0aW9ucykgeworICAgICAg
cmV0dXJuIHRoaXMucmVxdWVzdCh1cmwsIHRoaXMuX2FkZFR5cGVUb09wdGlvbnNGb3Iob3B0aW9u
cywgJ1BBVENIJykpOworICAgIH0sCisKKyAgICAvLyBjYWxscyBgcmVxdWVzdCgpYCBidXQgZm9y
Y2VzIGBvcHRpb25zLnR5cGVgIHRvIGBERUxFVEVgCisgICAgZGVsOiBmdW5jdGlvbiBkZWwodXJs
LCBvcHRpb25zKSB7CisgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgdGhpcy5fYWRkVHlw
ZVRvT3B0aW9uc0ZvcihvcHRpb25zLCAnREVMRVRFJykpOworICAgIH0sCisKKyAgICAvLyBmb3Jj
aWJseSBtYW5pcHVsYXRlcyB0aGUgb3B0aW9ucyBoYXNoIHRvIGluY2x1ZGUgdGhlIEhUVFAgbWV0
aG9kIG9uIHRoZSB0eXBlIGtleQorICAgIF9hZGRUeXBlVG9PcHRpb25zRm9yOiBmdW5jdGlvbiBf
YWRkVHlwZVRvT3B0aW9uc0ZvcihvcHRpb25zLCBtZXRob2QpIHsKKyAgICAgIG9wdGlvbnMgPSBv
cHRpb25zIHx8IHt9OworICAgICAgb3B0aW9ucy50eXBlID0gbWV0aG9kOworICAgICAgcmV0dXJu
IG9wdGlvbnM7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCBvcHRpb25zCisgICAg
ICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHVybAorICAgICAgQHBhcmFtIHtPYmpl
Y3R9IG9wdGlvbnMKKyAgICAgIEByZXR1cm4ge09iamVjdH0KKyAgICAqLworICAgIG9wdGlvbnM6
IGZ1bmN0aW9uIG9wdGlvbnModXJsLCBfb3B0aW9ucykgeworICAgICAgdmFyIGhhc2ggPSBfb3B0
aW9ucyB8fCB7fTsKKyAgICAgIGhhc2gudXJsID0gdGhpcy5fYnVpbGRVUkwodXJsKTsKKyAgICAg
IGhhc2gudHlwZSA9IGhhc2gudHlwZSB8fCAnR0VUJzsKKyAgICAgIGhhc2guZGF0YVR5cGUgPSBo
YXNoLmRhdGFUeXBlIHx8ICdqc29uJzsKKyAgICAgIGhhc2guY29udGV4dCA9IHRoaXM7CisKKyAg
ICAgIHZhciBoZWFkZXJzID0gZ2V0KHRoaXMsICdoZWFkZXJzJyk7CisgICAgICBpZiAoaGVhZGVy
cyAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGhhc2guYmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4
aHIpIHsKKyAgICAgICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChr
ZXkpIHsKKyAgICAgICAgICAgIHJldHVybiB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRl
cnNba2V5XSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBoYXNoOworICAgIH0sCisKKyAgICBfYnVpbGRVUkw6IGZ1bmN0aW9uIF9idWlsZFVSTCh1
cmwpIHsKKyAgICAgIHZhciBob3N0ID0gZ2V0KHRoaXMsICdob3N0Jyk7CisgICAgICBpZiAoaXNC
bGFuayhob3N0KSkgeworICAgICAgICByZXR1cm4gdXJsOworICAgICAgfQorICAgICAgdmFyIHN0
YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHNlYXJj
aFN0cmluZywgcG9zaXRpb24pIHsKKyAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiB8fCAwOwor
ICAgICAgICByZXR1cm4gdGhpcy5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pID09PSBw
b3NpdGlvbjsKKyAgICAgIH07CisgICAgICBpZiAoc3RhcnRzV2l0aC5jYWxsKHVybCwgJy8nKSkg
eworICAgICAgICByZXR1cm4gJycgKyBob3N0ICsgdXJsOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIGhvc3QgKyAnLycgKyB1cmw7CisgICAgICB9CisgICAgfSwKKworICAgIC8qKgor
ICAgICBUYWtlcyBhbiBhamF4IHJlc3BvbnNlLCBhbmQgcmV0dXJucyB0aGUganNvbiBwYXlsb2Fk
IG9yIGFuIGVycm9yLgorICAgICAgQnkgZGVmYXVsdCB0aGlzIGhvb2sganVzdCByZXR1cm5zIHRo
ZSBqc29uIHBheWxvYWQgcGFzc2VkIHRvIGl0LgorICAgICBZb3UgbWlnaHQgd2FudCB0byBvdmVy
cmlkZSBpdCBpbiB0d28gY2FzZXM6CisgICAgICAxLiBZb3VyIEFQSSBtaWdodCByZXR1cm4gdXNl
ZnVsIHJlc3VsdHMgaW4gdGhlIHJlc3BvbnNlIGhlYWRlcnMuCisgICAgIFJlc3BvbnNlIGhlYWRl
cnMgYXJlIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAgMi4gWW91ciBB
UEkgbWlnaHQgcmV0dXJuIGVycm9ycyBhcyBzdWNjZXNzZnVsIHJlc3BvbnNlcyB3aXRoIHN0YXR1
cyBjb2RlCisgICAgIDIwMCBhbmQgYW4gRXJyb3JzIHRleHQgb3Igb2JqZWN0LgorICAgICBAbWV0
aG9kIGhhbmRsZVJlc3BvbnNlCisgICAgIEBwYXJhbSAge051bWJlcn0gc3RhdHVzCisgICAgIEBw
YXJhbSAge09iamVjdH0gaGVhZGVycworICAgICBAcGFyYW0gIHtPYmplY3R9IHBheWxvYWQKKyAg
ICAgQHJldHVybiB7T2JqZWN0IHwgRFMuQWRhcHRlckVycm9yfSByZXNwb25zZQorICAgICovCisg
ICAgaGFuZGxlUmVzcG9uc2U6IGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHN0YXR1cywgaGVhZGVy
cywgcGF5bG9hZCkgeworICAgICAgaWYgKHRoaXMuaXNTdWNjZXNzKHN0YXR1cywgaGVhZGVycywg
cGF5bG9hZCkpIHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgICB9IGVsc2UgaWYgKHRo
aXMuaXNVbmF1dGhvcml6ZWQoc3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSkgeworICAgICAgICBy
ZXR1cm4gbmV3IF9lbWJlckFqYXhFcnJvcnMuVW5hdXRob3JpemVkRXJyb3IocGF5bG9hZC5lcnJv
cnMpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRm9yYmlkZGVuKHN0YXR1cywgaGVhZGVycywg
cGF5bG9hZCkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBfZW1iZXJBamF4RXJyb3JzLkZvcmJpZGRl
bkVycm9yKHBheWxvYWQuZXJyb3JzKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ludmFsaWQo
c3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSkgeworICAgICAgICByZXR1cm4gbmV3IF9lbWJlckFq
YXhFcnJvcnMuSW52YWxpZEVycm9yKHBheWxvYWQuZXJyb3JzKTsKKyAgICAgIH0KKworICAgICAg
dmFyIGVycm9ycyA9IHRoaXMubm9ybWFsaXplRXJyb3JSZXNwb25zZShzdGF0dXMsIGhlYWRlcnMs
IHBheWxvYWQpOworCisgICAgICByZXR1cm4gbmV3IF9lbWJlckFqYXhFcnJvcnMuQWpheEVycm9y
KGVycm9ycyk7CisgICAgfSwKKworICAgIC8qKgorICAgICBEZWZhdWx0IGBoYW5kbGVSZXNwb25z
ZWAgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAgICBy
ZXNwb25zZSBpcyBhIGFuIGF1dGhvcml6ZWQgZXJyb3IuCisgICAgIEBtZXRob2QgaXNVbmF1dGhv
cml6ZWQKKyAgICAgQHBhcmFtICB7TnVtYmVyfSBzdGF0dXMKKyAgICAgQHBhcmFtICB7T2JqZWN0
fSBoZWFkZXJzCisgICAgIEBwYXJhbSAge09iamVjdH0gcGF5bG9hZAorICAgICBAcmV0dXJuIHtC
b29sZWFufQorICAgICovCisgICAgaXNVbmF1dGhvcml6ZWQ6IGZ1bmN0aW9uIGlzVW5hdXRob3Jp
emVkKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAqLykgeworICAgICAgcmV0dXJuIHN0YXR1
cyA9PT0gNDAxOworICAgIH0sCisKKyAgICAvKioKKyAgICAgICBEZWZhdWx0IGBoYW5kbGVSZXNw
b25zZWAgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAg
ICAgIHJlc3BvbnNlIGlzIGEgZm9yYmlkZGVuIGVycm9yLgorICAgICAgIEBtZXRob2QgaXNGb3Ji
aWRkZW4KKyAgICAgICBAcGFyYW0gIHtOdW1iZXJ9IHN0YXR1cworICAgICAgIEBwYXJhbSAge09i
amVjdH0gaGVhZGVycworICAgICAgIEBwYXJhbSAge09iamVjdH0gcGF5bG9hZAorICAgICAgIEBy
ZXR1cm4ge0Jvb2xlYW59CisgICAgICovCisgICAgaXNGb3JiaWRkZW46IGZ1bmN0aW9uIGlzRm9y
YmlkZGVuKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAqLykgeworICAgICAgcmV0dXJuIHN0
YXR1cyA9PT0gNDAzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIERlZmF1bHQgYGhhbmRsZVJl
c3BvbnNlYCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoaXMgaG9vayB0byBkZWNpZGUgaWYgdGhlCisg
ICAgICByZXNwb25zZSBpcyBhIGFuIGludmFsaWQgZXJyb3IuCisgICAgICBAbWV0aG9kIGlzSW52
YWxpZAorICAgICAgQHBhcmFtICB7TnVtYmVyfSBzdGF0dXMKKyAgICAgIEBwYXJhbSAge09iamVj
dH0gaGVhZGVycworICAgICAgQHBhcmFtICB7T2JqZWN0fSBwYXlsb2FkCisgICAgICBAcmV0dXJu
IHtCb29sZWFufQorICAgICovCisgICAgaXNJbnZhbGlkOiBmdW5jdGlvbiBpc0ludmFsaWQoc3Rh
dHVzIC8qLCBoZWFkZXJzLCBwYXlsb2FkICovKSB7CisgICAgICByZXR1cm4gc3RhdHVzID09PSA0
MjI7CisgICAgfSwKKworICAgIC8qKgorICAgICBEZWZhdWx0IGBoYW5kbGVSZXNwb25zZWAgaW1w
bGVtZW50YXRpb24gdXNlcyB0aGlzIGhvb2sgdG8gZGVjaWRlIGlmIHRoZQorICAgICByZXNwb25z
ZSBpcyBhIHN1Y2Nlc3MuCisgICAgIEBtZXRob2QgaXNTdWNjZXNzCisgICAgIEBwYXJhbSAge051
bWJlcn0gc3RhdHVzCisgICAgIEBwYXJhbSAge09iamVjdH0gaGVhZGVycworICAgICBAcGFyYW0g
IHtPYmplY3R9IHBheWxvYWQKKyAgICAgQHJldHVybiB7Qm9vbGVhbn0KKyAgICAqLworICAgIGlz
U3VjY2VzczogZnVuY3Rpb24gaXNTdWNjZXNzKHN0YXR1cyAvKiwgaGVhZGVycywgcGF5bG9hZCAq
LykgeworICAgICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1
cyA9PT0gMzA0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRob2QgcGFyc2VFcnJvclJl
c3BvbnNlCisgICAgICBAcHJpdmF0ZQorICAgICAgQHBhcmFtIHtTdHJpbmd9IHJlc3BvbnNlVGV4
dAorICAgICAgQHJldHVybiB7T2JqZWN0fQorICAgICovCisgICAgcGFyc2VFcnJvclJlc3BvbnNl
OiBmdW5jdGlvbiBwYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2VUZXh0KSB7CisgICAgICB2YXIg
anNvbiA9IHJlc3BvbnNlVGV4dDsKKworICAgICAgdHJ5IHsKKyAgICAgICAganNvbiA9IF9lbWJl
clsnZGVmYXVsdCddLiQucGFyc2VKU09OKHJlc3BvbnNlVGV4dCk7CisgICAgICB9IGNhdGNoIChl
KSB7fQorCisgICAgICByZXR1cm4ganNvbjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAbWV0
aG9kIG5vcm1hbGl6ZUVycm9yUmVzcG9uc2UKKyAgICAgIEBwcml2YXRlCisgICAgICBAcGFyYW0g
IHtOdW1iZXJ9IHN0YXR1cworICAgICAgQHBhcmFtICB7T2JqZWN0fSBoZWFkZXJzCisgICAgICBA
cGFyYW0gIHtPYmplY3R9IHBheWxvYWQKKyAgICAgIEByZXR1cm4ge09iamVjdH0gZXJyb3JzIHBh
eWxvYWQKKyAgICAqLworICAgIG5vcm1hbGl6ZUVycm9yUmVzcG9uc2U6IGZ1bmN0aW9uIG5vcm1h
bGl6ZUVycm9yUmVzcG9uc2Uoc3RhdHVzLCBoZWFkZXJzLCBwYXlsb2FkKSB7CisgICAgICBpZiAo
cGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgcGF5bG9hZC5lcnJvcnMp
IHsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQuZXJyb3JzOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgcmV0dXJuIFt7CisgICAgICAgICAgc3RhdHVzOiAnJyArIHN0YXR1cywKKyAgICAgICAgICB0
aXRsZTogIlRoZSBiYWNrZW5kIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIiwKKyAgICAgICAgICBk
ZXRhaWw6ICcnICsgcGF5bG9hZAorICAgICAgICB9XTsKKyAgICAgIH0KKyAgICB9CisgIH0pOwor
fSk7CitkZWZpbmUoImVtYmVyLWFqYXgvdXRpbHMvcGFyc2UtYXJncyIsIFsiZXhwb3J0cyJdLCBm
dW5jdGlvbiAoZXhwb3J0cykgeworICAidXNlIHN0cmljdCI7CisKKyAgdmFyIF9zbGljZWRUb0Fy
cmF5ID0gKGZ1bmN0aW9uICgpIHsKKyAgICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkg
eworICAgICAgdmFyIF9hcnIgPSBbXTt2YXIgX24gPSB0cnVlO3ZhciBfZCA9IGZhbHNlO3ZhciBf
ZSA9IHVuZGVmaW5lZDt0cnkgeworICAgICAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRl
cmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7
CisgICAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0g
aSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBfZCA9
IHRydWU7X2UgPSBlcnI7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgIGlmICghX24gJiYgX2lbInJldHVybiJdKSBfaVsicmV0dXJuIl0oKTsKKyAgICAgICAgfSBm
aW5hbGx5IHsKKyAgICAgICAgICBpZiAoX2QpIHRocm93IF9lOworICAgICAgICB9CisgICAgICB9
cmV0dXJuIF9hcnI7CisgICAgfXJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7CisgICAgICBpZiAo
QXJyYXkuaXNBcnJheShhcnIpKSB7CisgICAgICAgIHJldHVybiBhcnI7CisgICAgICB9IGVsc2Ug
aWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeworICAgICAgICByZXR1cm4gc2xp
Y2VJdGVyYXRvcihhcnIsIGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5
cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0
YW5jZSIpOworICAgICAgfQorICAgIH07CisgIH0pKCk7CisKKyAgZXhwb3J0c1siZGVmYXVsdCJd
ID0gcGFyc2VBcmdzOworCisgIGZ1bmN0aW9uIHBhcnNlQXJncygpIHsKKyAgICB2YXIgYXJncyA9
IFtdLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyk7CisgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7
CisgICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICJzdHJpbmciKSB7CisgICAgICAgIHZhciBf
YXJncyA9IF9zbGljZWRUb0FycmF5KGFyZ3MsIDEpOworCisgICAgICAgIHZhciB1cmwgPSBfYXJn
c1swXTsKKworICAgICAgICByZXR1cm4gW3VybF07CisgICAgICB9IGVsc2UgeworICAgICAgICB2
YXIgX2FyZ3MyID0gX3NsaWNlZFRvQXJyYXkoYXJncywgMSk7CisKKyAgICAgICAgdmFyIG9wdGlv
bnMgPSBfYXJnczJbMF07CisgICAgICAgIHZhciB1cmwgPSBvcHRpb25zLnVybDsKKworICAgICAg
ICBkZWxldGUgb3B0aW9ucy51cmw7CisgICAgICAgIHZhciB0eXBlID0gb3B0aW9ucy50eXBlIHx8
IG9wdGlvbnMubWV0aG9kOworICAgICAgICBkZWxldGUgb3B0aW9ucy50eXBlOworICAgICAgICBk
ZWxldGUgb3B0aW9ucy5tZXRob2Q7CisgICAgICAgIHJldHVybiBbdXJsLCB0eXBlLCBvcHRpb25z
XTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7CisgICAgICB2
YXIgX2FyZ3MzID0gX3NsaWNlZFRvQXJyYXkoYXJncywgMSk7CisKKyAgICAgIHZhciB1cmwgPSBf
YXJnczNbMF07CisKKyAgICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ29iamVjdCcpIHsKKyAg
ICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzWzFdOworICAgICAgICB2YXIgdHlwZSA9IG9wdGlvbnMu
dHlwZSB8fCBvcHRpb25zLm1ldGhvZDsKKyAgICAgICAgZGVsZXRlIG9wdGlvbnMudHlwZTsKKyAg
ICAgICAgZGVsZXRlIG9wdGlvbnMubWV0aG9kOworICAgICAgICByZXR1cm4gW3VybCwgdHlwZSwg
b3B0aW9uc107CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgdHlwZSA9IGFyZ3NbMV07Cisg
ICAgICAgIHJldHVybiBbdXJsLCB0eXBlXTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFy
Z3M7CisgIH0KK30pOworZGVmaW5lKCdlbWJlci1hamF4L3V0aWxzL3BhcnNlLXJlc3BvbnNlLWhl
YWRlcnMnLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3Qn
OworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IHBhcnNlUmVzcG9uc2VIZWFkZXJzOworCisgIGZ1
bmN0aW9uIHBhcnNlUmVzcG9uc2VIZWFkZXJzKGhlYWRlclN0cikgeworICAgIHZhciBoZWFkZXJz
ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBpZiAoIWhlYWRlclN0cikgeworICAgICAgcmV0
dXJuIGhlYWRlcnM7CisgICAgfQorCisgICAgdmFyIGhlYWRlclBhaXJzID0gaGVhZGVyU3RyLnNw
bGl0KCdcclxuJyk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJQYWlycy5sZW5ndGg7
IGkrKykgeworICAgICAgdmFyIGhlYWRlclBhaXIgPSBoZWFkZXJQYWlyc1tpXTsKKyAgICAgIC8v
IENhbid0IHVzZSBzcGxpdCgpIGhlcmUgYmVjYXVzZSBpdCBkb2VzIHRoZSB3cm9uZyB0aGluZwor
ICAgICAgLy8gaWYgdGhlIGhlYWRlciB2YWx1ZSBoYXMgdGhlIHN0cmluZyAiOiAiIGluIGl0Lgor
ICAgICAgdmFyIGluZGV4ID0gaGVhZGVyUGFpci5pbmRleE9mKCc6ICcpOworICAgICAgaWYgKGlu
ZGV4ID4gMCkgeworICAgICAgICB2YXIga2V5ID0gaGVhZGVyUGFpci5zdWJzdHJpbmcoMCwgaW5k
ZXgpOworICAgICAgICB2YXIgdmFsID0gaGVhZGVyUGFpci5zdWJzdHJpbmcoaW5kZXggKyAyKTsK
KyAgICAgICAgaGVhZGVyc1trZXldID0gdmFsOworICAgICAgfQorICAgIH0KKworICAgIHJldHVy
biBoZWFkZXJzOworICB9Cit9KTsKK2RlZmluZSgnZW1iZXItY2xpLWFwcC12ZXJzaW9uL2NvbXBv
bmVudHMvYXBwLXZlcnNpb24nLCBbJ2V4cG9ydHMnLCAnZW1iZXInLCAnZW1iZXItY2xpLWFwcC12
ZXJzaW9uL3RlbXBsYXRlcy9hcHAtdmVyc2lvbiddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVy
LCBfZW1iZXJDbGlBcHBWZXJzaW9uVGVtcGxhdGVzQXBwVmVyc2lvbikgeworICAndXNlIHN0cmlj
dCc7CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gX2VtYmVyWydkZWZhdWx0J10uQ29tcG9uZW50
LmV4dGVuZCh7CisgICAgdGFnTmFtZTogJ3NwYW4nLAorICAgIGxheW91dDogX2VtYmVyQ2xpQXBw
VmVyc2lvblRlbXBsYXRlc0FwcFZlcnNpb25bJ2RlZmF1bHQnXQorICB9KTsKK30pOworZGVmaW5l
KCdlbWJlci1jbGktYXBwLXZlcnNpb24vaW5pdGlhbGl6ZXItZmFjdG9yeScsIFsnZXhwb3J0cycs
ICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsK
KworICBleHBvcnRzWydkZWZhdWx0J10gPSBpbml0aWFsaXplckZhY3Rvcnk7CisKKyAgdmFyIGNs
YXNzaWZ5ID0gX2VtYmVyWydkZWZhdWx0J10uU3RyaW5nLmNsYXNzaWZ5OworCisgIGZ1bmN0aW9u
IGluaXRpYWxpemVyRmFjdG9yeShuYW1lLCB2ZXJzaW9uKSB7CisgICAgdmFyIHJlZ2lzdGVyZWQg
PSBmYWxzZTsKKworICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICBpZiAoIXJlZ2lzdGVy
ZWQgJiYgbmFtZSAmJiB2ZXJzaW9uKSB7CisgICAgICAgIHZhciBhcHBOYW1lID0gY2xhc3NpZnko
bmFtZSk7CisgICAgICAgIF9lbWJlclsnZGVmYXVsdCddLmxpYnJhcmllcy5yZWdpc3RlcihhcHBO
YW1lLCB2ZXJzaW9uKTsKKyAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICB9CisgICAg
fTsKKyAgfQorfSk7CitkZWZpbmUoImVtYmVyLWNsaS1hcHAtdmVyc2lvbi90ZW1wbGF0ZXMvYXBw
LXZlcnNpb24iLCBbImV4cG9ydHMiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgInVzZSBzdHJp
Y3QiOworCisgIGV4cG9ydHNbImRlZmF1bHQiXSA9IEVtYmVyLkhUTUxCYXJzLnRlbXBsYXRlKChm
dW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIG1ldGE6IHsKKyAgICAgICAgImZyYWdt
ZW50UmVhc29uIjogeworICAgICAgICAgICJuYW1lIjogIm1pc3Npbmctd3JhcHBlciIsCisgICAg
ICAgICAgInByb2JsZW1zIjogWyJ3cm9uZy10eXBlIl0KKyAgICAgICAgfSwKKyAgICAgICAgInJl
dmlzaW9uIjogIkVtYmVyQDIuNi4yIiwKKyAgICAgICAgImxvYyI6IHsKKyAgICAgICAgICAic291
cmNlIjogbnVsbCwKKyAgICAgICAgICAic3RhcnQiOiB7CisgICAgICAgICAgICAibGluZSI6IDEs
CisgICAgICAgICAgICAiY29sdW1uIjogMAorICAgICAgICAgIH0sCisgICAgICAgICAgImVuZCI6
IHsKKyAgICAgICAgICAgICJsaW5lIjogMiwKKyAgICAgICAgICAgICJjb2x1bW4iOiAwCisgICAg
ICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibW9kdWxlTmFtZSI6ICJtb2R1bGVzL2VtYmVy
LWNsaS1hcHAtdmVyc2lvbi90ZW1wbGF0ZXMvYXBwLXZlcnNpb24uaGJzIgorICAgICAgfSwKKyAg
ICAgIGlzRW1wdHk6IGZhbHNlLAorICAgICAgYXJpdHk6IDAsCisgICAgICBjYWNoZWRGcmFnbWVu
dDogbnVsbCwKKyAgICAgIGhhc1JlbmRlcmVkOiBmYWxzZSwKKyAgICAgIGJ1aWxkRnJhZ21lbnQ6
IGZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoZG9tKSB7CisgICAgICAgIHZhciBlbDAgPSBkb20uY3Jl
YXRlRG9jdW1lbnRGcmFnbWVudCgpOworICAgICAgICB2YXIgZWwxID0gZG9tLmNyZWF0ZUNvbW1l
bnQoIiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWwwLCBlbDEpOworICAgICAgICB2YXIg
ZWwxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJcbiIpOworICAgICAgICBkb20uYXBwZW5kQ2hpbGQo
ZWwwLCBlbDEpOworICAgICAgICByZXR1cm4gZWwwOworICAgICAgfSwKKyAgICAgIGJ1aWxkUmVu
ZGVyTm9kZXM6IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyTm9kZXMoZG9tLCBmcmFnbWVudCwgY29udGV4
dHVhbEVsZW1lbnQpIHsKKyAgICAgICAgdmFyIG1vcnBocyA9IG5ldyBBcnJheSgxKTsKKyAgICAg
ICAgbW9ycGhzWzBdID0gZG9tLmNyZWF0ZU1vcnBoQXQoZnJhZ21lbnQsIDAsIDAsIGNvbnRleHR1
YWxFbGVtZW50KTsKKyAgICAgICAgZG9tLmluc2VydEJvdW5kYXJ5KGZyYWdtZW50LCAwKTsKKyAg
ICAgICAgcmV0dXJuIG1vcnBoczsKKyAgICAgIH0sCisgICAgICBzdGF0ZW1lbnRzOiBbWyJjb250
ZW50IiwgInZlcnNpb24iLCBbImxvYyIsIFtudWxsLCBbMSwgMF0sIFsxLCAxMV1dXV1dLAorICAg
ICAgbG9jYWxzOiBbXSwKKyAgICAgIHRlbXBsYXRlczogW10KKyAgICB9OworICB9KSgpKTsKK30p
OworZGVmaW5lKCJlbWJlci1pbmZsZWN0b3IvaW5kZXgiLCBbImV4cG9ydHMiLCAiZW1iZXIiLCAi
ZW1iZXItaW5mbGVjdG9yL2xpYi9zeXN0ZW0iLCAiZW1iZXItaW5mbGVjdG9yL2xpYi9leHQvc3Ry
aW5nIl0sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXIsIF9lbWJlckluZmxlY3RvckxpYlN5c3Rl
bSwgX2VtYmVySW5mbGVjdG9yTGliRXh0U3RyaW5nKSB7CisgIC8qIGdsb2JhbCBkZWZpbmUsIG1v
ZHVsZSAqLworCisgICJ1c2Ugc3RyaWN0IjsKKworICBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0u
SW5mbGVjdG9yLmRlZmF1bHRSdWxlcyA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5kZWZhdWx0
UnVsZXM7CisgIF9lbWJlclsiZGVmYXVsdCJdLkluZmxlY3RvciA9IF9lbWJlckluZmxlY3Rvckxp
YlN5c3RlbS5JbmZsZWN0b3I7CisKKyAgX2VtYmVyWyJkZWZhdWx0Il0uU3RyaW5nLnBsdXJhbGl6
ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5wbHVyYWxpemU7CisgIF9lbWJlclsiZGVmYXVs
dCJdLlN0cmluZy5zaW5ndWxhcml6ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5zaW5ndWxh
cml6ZTtleHBvcnRzWyJkZWZhdWx0Il0gPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0uSW5mbGVj
dG9yOworICBleHBvcnRzLnBsdXJhbGl6ZSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5wbHVy
YWxpemU7CisgIGV4cG9ydHMuc2luZ3VsYXJpemUgPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW0u
c2luZ3VsYXJpemU7CisgIGV4cG9ydHMuZGVmYXVsdFJ1bGVzID0gX2VtYmVySW5mbGVjdG9yTGli
U3lzdGVtLmRlZmF1bHRSdWxlczsKKworICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5l
ZCcgJiYgZGVmaW5lLmFtZCkgeworICAgIGRlZmluZSgnZW1iZXItaW5mbGVjdG9yJywgWydleHBv
cnRzJ10sIGZ1bmN0aW9uIChfX2V4cG9ydHNfXykgeworICAgICAgX19leHBvcnRzX19bJ2RlZmF1
bHQnXSA9IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbS5JbmZsZWN0b3I7CisgICAgICByZXR1cm4g
X2VtYmVySW5mbGVjdG9yTGliU3lzdGVtLkluZmxlY3RvcjsKKyAgICB9KTsKKyAgfSBlbHNlIGlm
ICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkgewor
ICAgIG1vZHVsZVsnZXhwb3J0cyddID0gX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtLkluZmxlY3Rv
cjsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvZXh0L3N0cmluZycsIFsn
ZXhwb3J0cycsICdlbWJlcicsICdlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9zdHJpbmcnXSwg
ZnVuY3Rpb24gKGV4cG9ydHMsIF9lbWJlciwgX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtU3RyaW5n
KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBpZiAoX2VtYmVyWydkZWZhdWx0J10uRVhURU5EX1BS
T1RPVFlQRVMgPT09IHRydWUgfHwgX2VtYmVyWydkZWZhdWx0J10uRVhURU5EX1BST1RPVFlQRVMu
U3RyaW5nKSB7CisgICAgLyoqCisgICAgICBTZWUge3sjY3Jvc3NMaW5rICJFbWJlci5TdHJpbmcv
cGx1cmFsaXplIn19e3svY3Jvc3NMaW5rfX0KKyAgICAgICBAbWV0aG9kIHBsdXJhbGl6ZQorICAg
ICAgQGZvciBTdHJpbmcKKyAgICAqLworICAgIFN0cmluZy5wcm90b3R5cGUucGx1cmFsaXplID0g
ZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJuICgwLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1T
dHJpbmcucGx1cmFsaXplKSh0aGlzKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICBTZWUge3sj
Y3Jvc3NMaW5rICJFbWJlci5TdHJpbmcvc2luZ3VsYXJpemUifX17ey9jcm9zc0xpbmt9fQorICAg
ICAgIEBtZXRob2Qgc2luZ3VsYXJpemUKKyAgICAgIEBmb3IgU3RyaW5nCisgICAgKi8KKyAgICBT
dHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXplID0gZnVuY3Rpb24gKCkgeworICAgICAgcmV0dXJu
ICgwLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1TdHJpbmcuc2luZ3VsYXJpemUpKHRoaXMpOwor
ICAgIH07CisgIH0KK30pOworZGVmaW5lKCdlbWJlci1pbmZsZWN0b3IvbGliL2hlbHBlcnMvcGx1
cmFsaXplJywgWydleHBvcnRzJywgJ2VtYmVyLWluZmxlY3RvcicsICdlbWJlci1pbmZsZWN0b3Iv
bGliL3V0aWxzL21ha2UtaGVscGVyJ10sIGZ1bmN0aW9uIChleHBvcnRzLCBfZW1iZXJJbmZsZWN0
b3IsIF9lbWJlckluZmxlY3RvckxpYlV0aWxzTWFrZUhlbHBlcikgeworICAndXNlIHN0cmljdCc7
CisKKyAgLyoqCisgICAqCisgICAqIElmIHlvdSBoYXZlIEVtYmVyIEluZmxlY3RvciAoc3VjaCBh
cyBpZiBFbWJlciBEYXRhIGlzIHByZXNlbnQpLAorICAgKiBwbHVyYWxpemUgYSB3b3JkLiBGb3Ig
ZXhhbXBsZSwgdHVybiAib3giIGludG8gIm94ZW4iLgorICAgKgorICAgKiBFeGFtcGxlOgorICAg
KgorICAgKiB7e3BsdXJhbGl6ZSBjb3VudCBteVByb3BlcnR5fX0KKyAgICoge3twbHVyYWxpemUg
MSAib3hlbiJ9fQorICAgKiB7e3BsdXJhbGl6ZSBteVByb3BlcnR5fX0KKyAgICoge3twbHVyYWxp
emUgIm94In19CisgICAqCisgICAqIEBmb3IgRW1iZXIuSFRNTEJhcnMuaGVscGVycworICAgKiBA
bWV0aG9kIHBsdXJhbGl6ZQorICAgKiBAcGFyYW0ge051bWJlcnxQcm9wZXJ0eX0gW2NvdW50XSBj
b3VudCBvZiBvYmplY3RzCisgICAqIEBwYXJhbSB7U3RyaW5nfFByb3BlcnR5fSB3b3JkIHdvcmQg
dG8gcGx1cmFsaXplCisgICovCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfZW1iZXJJbmZs
ZWN0b3JMaWJVdGlsc01ha2VIZWxwZXJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKHBhcmFtcykgewor
ICAgIHZhciBjb3VudCA9IHVuZGVmaW5lZCwKKyAgICAgICAgd29yZCA9IHVuZGVmaW5lZDsKKwor
ICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAxKSB7CisgICAgICB3b3JkID0gcGFyYW1zWzBdOwor
ICAgICAgcmV0dXJuICgwLCBfZW1iZXJJbmZsZWN0b3IucGx1cmFsaXplKSh3b3JkKTsKKyAgICB9
IGVsc2UgeworICAgICAgY291bnQgPSBwYXJhbXNbMF07CisgICAgICB3b3JkID0gcGFyYW1zWzFd
OworCisgICAgICBpZiAocGFyc2VGbG9hdChjb3VudCkgIT09IDEpIHsKKyAgICAgICAgd29yZCA9
ICgwLCBfZW1iZXJJbmZsZWN0b3IucGx1cmFsaXplKSh3b3JkKTsKKyAgICAgIH0KKworICAgICAg
cmV0dXJuIGNvdW50ICsgIiAiICsgd29yZDsKKyAgICB9CisgIH0pOworfSk7CitkZWZpbmUoJ2Vt
YmVyLWluZmxlY3Rvci9saWIvaGVscGVycy9zaW5ndWxhcml6ZScsIFsnZXhwb3J0cycsICdlbWJl
ci1pbmZsZWN0b3InLCAnZW1iZXItaW5mbGVjdG9yL2xpYi91dGlscy9tYWtlLWhlbHBlciddLCBm
dW5jdGlvbiAoZXhwb3J0cywgX2VtYmVySW5mbGVjdG9yLCBfZW1iZXJJbmZsZWN0b3JMaWJVdGls
c01ha2VIZWxwZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8qKgorICAgKgorICAgKiBJZiB5
b3UgaGF2ZSBFbWJlciBJbmZsZWN0b3IgKHN1Y2ggYXMgaWYgRW1iZXIgRGF0YSBpcyBwcmVzZW50
KSwKKyAgICogc2luZ3VsYXJpemUgYSB3b3JkLiBGb3IgZXhhbXBsZSwgdHVybiAib3hlbiIgaW50
byAib3giLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiB7e3Npbmd1bGFyaXplIG15
UHJvcGVydHl9fQorICAgKiB7e3Npbmd1bGFyaXplICJveGVuIn19CisgICAqCisgICAqIEBmb3Ig
RW1iZXIuSFRNTEJhcnMuaGVscGVycworICAgKiBAbWV0aG9kIHNpbmd1bGFyaXplCisgICAqIEBw
YXJhbSB7U3RyaW5nfFByb3BlcnR5fSB3b3JkIHdvcmQgdG8gc2luZ3VsYXJpemUKKyAgKi8KKyAg
ZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9lbWJlckluZmxlY3RvckxpYlV0aWxzTWFrZUhlbHBl
clsnZGVmYXVsdCddKShmdW5jdGlvbiAocGFyYW1zKSB7CisgICAgcmV0dXJuICgwLCBfZW1iZXJJ
bmZsZWN0b3Iuc2luZ3VsYXJpemUpKHBhcmFtc1swXSk7CisgIH0pOworfSk7CitkZWZpbmUoImVt
YmVyLWluZmxlY3Rvci9saWIvc3lzdGVtIiwgWyJleHBvcnRzIiwgImVtYmVyLWluZmxlY3Rvci9s
aWIvc3lzdGVtL2luZmxlY3RvciIsICJlbWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9zdHJpbmci
LCAiZW1iZXItaW5mbGVjdG9yL2xpYi9zeXN0ZW0vaW5mbGVjdGlvbnMiXSwgZnVuY3Rpb24gKGV4
cG9ydHMsIF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3RvciwgX2VtYmVySW5mbGVjdG9y
TGliU3lzdGVtU3RyaW5nLCBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1JbmZsZWN0aW9ucykgewor
ICAidXNlIHN0cmljdCI7CisKKyAgX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtSW5mbGVjdG9yWyJk
ZWZhdWx0Il0uaW5mbGVjdG9yID0gbmV3IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3Rv
clsiZGVmYXVsdCJdKF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3Rpb25zWyJkZWZhdWx0
Il0pOworCisgIGV4cG9ydHMuSW5mbGVjdG9yID0gX2VtYmVySW5mbGVjdG9yTGliU3lzdGVtSW5m
bGVjdG9yWyJkZWZhdWx0Il07CisgIGV4cG9ydHMuc2luZ3VsYXJpemUgPSBfZW1iZXJJbmZsZWN0
b3JMaWJTeXN0ZW1TdHJpbmcuc2luZ3VsYXJpemU7CisgIGV4cG9ydHMucGx1cmFsaXplID0gX2Vt
YmVySW5mbGVjdG9yTGliU3lzdGVtU3RyaW5nLnBsdXJhbGl6ZTsKKyAgZXhwb3J0cy5kZWZhdWx0
UnVsZXMgPSBfZW1iZXJJbmZsZWN0b3JMaWJTeXN0ZW1JbmZsZWN0aW9uc1siZGVmYXVsdCJdOwor
fSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL2luZmxlY3Rpb25zJywgWydl
eHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBv
cnRzWydkZWZhdWx0J10gPSB7CisgICAgcGx1cmFsczogW1svJC8sICdzJ10sIFsvcyQvaSwgJ3Mn
XSwgWy9eKGF4fHRlc3QpaXMkL2ksICckMWVzJ10sIFsvKG9jdG9wfHZpcil1cyQvaSwgJyQxaSdd
LCBbLyhvY3RvcHx2aXIpaSQvaSwgJyQxaSddLCBbLyhhbGlhc3xzdGF0dXMpJC9pLCAnJDFlcydd
LCBbLyhidSlzJC9pLCAnJDFzZXMnXSwgWy8oYnVmZmFsfHRvbWF0KW8kL2ksICckMW9lcyddLCBb
LyhbdGldKXVtJC9pLCAnJDFhJ10sIFsvKFt0aV0pYSQvaSwgJyQxYSddLCBbL3NpcyQvaSwgJ3Nl
cyddLCBbLyg/OihbXmZdKWZlfChbbHJdKWYpJC9pLCAnJDEkMnZlcyddLCBbLyhoaXZlKSQvaSwg
JyQxcyddLCBbLyhbXmFlaW91eV18cXUpeSQvaSwgJyQxaWVzJ10sIFsvKHh8Y2h8c3N8c2gpJC9p
LCAnJDFlcyddLCBbLyhtYXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQvaSwgJyQxaWNlcyddLCBbL14o
bXxsKW91c2UkL2ksICckMWljZSddLCBbL14obXxsKWljZSQvaSwgJyQxaWNlJ10sIFsvXihveCkk
L2ksICckMWVuJ10sIFsvXihveGVuKSQvaSwgJyQxJ10sIFsvKHF1aXopJC9pLCAnJDF6ZXMnXV0s
CisKKyAgICBzaW5ndWxhcjogW1svcyQvaSwgJyddLCBbLyhzcykkL2ksICckMSddLCBbLyhuKWV3
cyQvaSwgJyQxZXdzJ10sIFsvKFt0aV0pYSQvaSwgJyQxdW0nXSwgWy8oKGEpbmFseXwoYilhfChk
KWlhZ25vfChwKWFyZW50aGV8KHApcm9nbm98KHMpeW5vcHwodCloZSkoc2lzfHNlcykkL2ksICck
MXNpcyddLCBbLyheYW5hbHkpKHNpc3xzZXMpJC9pLCAnJDFzaXMnXSwgWy8oW15mXSl2ZXMkL2ks
ICckMWZlJ10sIFsvKGhpdmUpcyQvaSwgJyQxJ10sIFsvKHRpdmUpcyQvaSwgJyQxJ10sIFsvKFts
cl0pdmVzJC9pLCAnJDFmJ10sIFsvKFteYWVpb3V5XXxxdSlpZXMkL2ksICckMXknXSwgWy8ocyll
cmllcyQvaSwgJyQxZXJpZXMnXSwgWy8obSlvdmllcyQvaSwgJyQxb3ZpZSddLCBbLyh4fGNofHNz
fHNoKWVzJC9pLCAnJDEnXSwgWy9eKG18bClpY2UkL2ksICckMW91c2UnXSwgWy8oYnVzKShlcyk/
JC9pLCAnJDEnXSwgWy8obyllcyQvaSwgJyQxJ10sIFsvKHNob2UpcyQvaSwgJyQxJ10sIFsvKGNy
aXN8dGVzdCkoaXN8ZXMpJC9pLCAnJDFpcyddLCBbL14oYSl4W2llXXMkL2ksICckMXhpcyddLCBb
LyhvY3RvcHx2aXIpKHVzfGkpJC9pLCAnJDF1cyddLCBbLyhhbGlhc3xzdGF0dXMpKGVzKT8kL2ks
ICckMSddLCBbL14ob3gpZW4vaSwgJyQxJ10sIFsvKHZlcnR8aW5kKWljZXMkL2ksICckMWV4J10s
IFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwgWy8ocXVpeil6ZXMkL2ksICckMSddLCBbLyhkYXRh
YmFzZSlzJC9pLCAnJDEnXV0sCisKKyAgICBpcnJlZ3VsYXJQYWlyczogW1sncGVyc29uJywgJ3Bl
b3BsZSddLCBbJ21hbicsICdtZW4nXSwgWydjaGlsZCcsICdjaGlsZHJlbiddLCBbJ3NleCcsICdz
ZXhlcyddLCBbJ21vdmUnLCAnbW92ZXMnXSwgWydjb3cnLCAna2luZSddLCBbJ3pvbWJpZScsICd6
b21iaWVzJ11dLAorCisgICAgdW5jb3VudGFibGU6IFsnZXF1aXBtZW50JywgJ2luZm9ybWF0aW9u
JywgJ3JpY2UnLCAnbW9uZXknLCAnc3BlY2llcycsICdzZXJpZXMnLCAnZmlzaCcsICdzaGVlcCcs
ICdqZWFucycsICdwb2xpY2UnXQorICB9OworfSk7CitkZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9s
aWIvc3lzdGVtL2luZmxlY3RvcicsIFsnZXhwb3J0cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhw
b3J0cywgX2VtYmVyKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICB2YXIgY2FwaXRhbGl6ZSA9IF9l
bWJlclsnZGVmYXVsdCddLlN0cmluZy5jYXBpdGFsaXplOworCisgIHZhciBCTEFOS19SRUdFWCA9
IC9eXHMqJC87CisgIHZhciBMQVNUX1dPUkRfREFTSEVEX1JFR0VYID0gLyhbXHcvLV0rW18vXHMt
XSkoW2EtelxkXSskKS87CisgIHZhciBMQVNUX1dPUkRfQ0FNRUxJWkVEX1JFR0VYID0gLyhbXHcv
XHMtXSspKFtBLVpdW2EtelxkXSokKS87CisgIHZhciBDQU1FTElaRURfUkVHRVggPSAvW0EtWl1b
YS16XGRdKiQvOworCisgIGZ1bmN0aW9uIGxvYWRVbmNvdW50YWJsZShydWxlcywgdW5jb3VudGFi
bGUpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdW5jb3VudGFibGUubGVuZ3RoOyBp
IDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHJ1bGVzLnVuY291bnRhYmxlW3VuY291bnRhYmxlW2ld
LnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBsb2FkSXJy
ZWd1bGFyKHJ1bGVzLCBpcnJlZ3VsYXJQYWlycykgeworICAgIHZhciBwYWlyOworCisgICAgZm9y
ICh2YXIgaSA9IDAsIGxlbmd0aCA9IGlycmVndWxhclBhaXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICBwYWlyID0gaXJyZWd1bGFyUGFpcnNbaV07CisKKyAgICAgIC8vcGx1cmFs
aXppbmcKKyAgICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFp
clsxXTsKKyAgICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzFdLnRvTG93ZXJDYXNlKCldID0gcGFp
clsxXTsKKworICAgICAgLy9zaW5ndWxhcml6aW5nCisgICAgICBydWxlcy5pcnJlZ3VsYXJJbnZl
cnNlW3BhaXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOworICAgICAgcnVsZXMuaXJyZWd1
bGFySW52ZXJzZVtwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFpclswXTsKKyAgICB9CisgIH0K
KworICAvKioKKyAgICBJbmZsZWN0b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHN1
cHBseWluZyBpbmZsZWN0aW9uIHJ1bGVzIGZvciB5b3VyCisgICAgYXBwbGljYXRpb24uIEVtYmVy
IGluY2x1ZGVzIGEgZGVmYXVsdCBzZXQgb2YgaW5mbGVjdGlvbiBydWxlcywgYW5kIHByb3ZpZGVz
IGFuCisgICAgQVBJIGZvciBwcm92aWRpbmcgYWRkaXRpb25hbCBydWxlcy4KKyAgCisgICAgRXhh
bXBsZXM6CisgIAorICAgIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIG5vIHJ1bGVzLgorICAK
KyAgICBgYGBqcworICAgIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5mbGVjdG9yKCk7Cisg
ICAgYGBgCisgIAorICAgIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIHRoZSBkZWZhdWx0IGVt
YmVyIHJ1bGVzZXQuCisgIAorICAgIGBgYGpzCisgICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJl
ci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7CisgIAorICAgIGluZmxl
Y3Rvci5wbHVyYWxpemUoJ2NvdycpOyAvLz0+ICdraW5lJworICAgIGluZmxlY3Rvci5zaW5ndWxh
cml6ZSgna2luZScpOyAvLz0+ICdjb3cnCisgICAgYGBgCisgIAorICAgIENyZWF0aW5nIGFuIGlu
ZmxlY3RvciBhbmQgYWRkaW5nIHJ1bGVzIGxhdGVyLgorICAKKyAgICBgYGBqYXZhc2NyaXB0Cisg
ICAgdmFyIGluZmxlY3RvciA9IEVtYmVyLkluZmxlY3Rvci5pbmZsZWN0b3I7CisgIAorICAgIGlu
ZmxlY3Rvci5wbHVyYWxpemUoJ2FkdmljZScpOyAvLyA9PiAnYWR2aWNlcycKKyAgICBpbmZsZWN0
b3IudW5jb3VudGFibGUoJ2FkdmljZScpOworICAgIGluZmxlY3Rvci5wbHVyYWxpemUoJ2Fkdmlj
ZScpOyAvLyA9PiAnYWR2aWNlJworICAKKyAgICBpbmZsZWN0b3IucGx1cmFsaXplKCdmb3JtdWxh
Jyk7IC8vID0+ICdmb3JtdWxhcycKKyAgICBpbmZsZWN0b3IuaXJyZWd1bGFyKCdmb3JtdWxhJywg
J2Zvcm11bGFlJyk7CisgICAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnZm9ybXVsYScpOyAvLyA9PiAn
Zm9ybXVsYWUnCisgIAorICAgIC8vIHlvdSB3b3VsZCBub3QgbmVlZCB0byBhZGQgdGhlc2UgYXMg
dGhleSBhcmUgdGhlIGRlZmF1bHQgcnVsZXMKKyAgICBpbmZsZWN0b3IucGx1cmFsKC8kLywgJ3Mn
KTsKKyAgICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKKyAgICBgYGAKKyAgCisgICAg
Q3JlYXRpbmcgYW4gaW5mbGVjdG9yIHdpdGggYSBub25kZWZhdWx0IHJ1bGVzZXQuCisgIAorICAg
IGBgYGphdmFzY3JpcHQKKyAgICB2YXIgcnVsZXMgPSB7CisgICAgICBwbHVyYWxzOiAgWyAvJC8s
ICdzJyBdLAorICAgICAgc2luZ3VsYXI6IFsgL1xzJC8sICcnIF0sCisgICAgICBpcnJlZ3VsYXJQ
YWlyczogWworICAgICAgICBbICdjb3cnLCAna2luZScgXQorICAgICAgXSwKKyAgICAgIHVuY291
bnRhYmxlOiBbICdmaXNoJyBdCisgICAgfTsKKyAgCisgICAgdmFyIGluZmxlY3RvciA9IG5ldyBF
bWJlci5JbmZsZWN0b3IocnVsZXMpOworICAgIGBgYAorICAKKyAgICBAY2xhc3MgSW5mbGVjdG9y
CisgICAgQG5hbWVzcGFjZSBFbWJlcgorICAqLworICBmdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNl
dCkgeworICAgIHJ1bGVTZXQgPSBydWxlU2V0IHx8IHt9OworICAgIHJ1bGVTZXQudW5jb3VudGFi
bGUgPSBydWxlU2V0LnVuY291bnRhYmxlIHx8IG1ha2VEaWN0aW9uYXJ5KCk7CisgICAgcnVsZVNl
dC5pcnJlZ3VsYXJQYWlycyA9IHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgfHwgbWFrZURpY3Rpb25h
cnkoKTsKKworICAgIHZhciBydWxlcyA9IHRoaXMucnVsZXMgPSB7CisgICAgICBwbHVyYWxzOiBy
dWxlU2V0LnBsdXJhbHMgfHwgW10sCisgICAgICBzaW5ndWxhcjogcnVsZVNldC5zaW5ndWxhciB8
fCBbXSwKKyAgICAgIGlycmVndWxhcjogbWFrZURpY3Rpb25hcnkoKSwKKyAgICAgIGlycmVndWxh
ckludmVyc2U6IG1ha2VEaWN0aW9uYXJ5KCksCisgICAgICB1bmNvdW50YWJsZTogbWFrZURpY3Rp
b25hcnkoKQorICAgIH07CisKKyAgICBsb2FkVW5jb3VudGFibGUocnVsZXMsIHJ1bGVTZXQudW5j
b3VudGFibGUpOworICAgIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQuaXJyZWd1bGFyUGFp
cnMpOworCisgICAgdGhpcy5lbmFibGVDYWNoZSgpOworICB9CisKKyAgaWYgKCFPYmplY3QuY3Jl
YXRlICYmICFPYmplY3QuY3JlYXRlKG51bGwpLmhhc093blByb3BlcnR5KSB7CisgICAgdGhyb3cg
bmV3IEVycm9yKCJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QuY3JlYXRlKG51
bGwpLCBwbGVhc2UgcG9seWZpbCB3aXRoIGVzNS1zaGFtOiBodHRwOi8vZ2l0LmlvL3lCVTJyZyIp
OworICB9CisKKyAgZnVuY3Rpb24gbWFrZURpY3Rpb25hcnkoKSB7CisgICAgdmFyIGNhY2hlID0g
T2JqZWN0LmNyZWF0ZShudWxsKTsKKyAgICBjYWNoZVsnX2RpY3QnXSA9IG51bGw7CisgICAgZGVs
ZXRlIGNhY2hlWydfZGljdCddOworICAgIHJldHVybiBjYWNoZTsKKyAgfQorCisgIEluZmxlY3Rv
ci5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICBAcHVibGljCisgICAgICAgQXMgaW5mbGVj
dGlvbnMgY2FuIGJlIGNvc3RseSwgYW5kIGNvbW1vbmx5IHRoZSBzYW1lIHN1YnNldCBvZiB3b3Jk
cyBhcmUgcmVwZWF0ZWRseQorICAgICAgaW5mbGVjdGVkIGFuIG9wdGlvbmFsIGNhY2hlIGlzIHBy
b3ZpZGVkLgorICAgICAgIEBtZXRob2QgZW5hYmxlQ2FjaGUKKyAgICAqLworICAgIGVuYWJsZUNh
Y2hlOiBmdW5jdGlvbiBlbmFibGVDYWNoZSgpIHsKKyAgICAgIHRoaXMucHVyZ2VDYWNoZSgpOwor
CisgICAgICB0aGlzLnNpbmd1bGFyaXplID0gZnVuY3Rpb24gKHdvcmQpIHsKKyAgICAgICAgdGhp
cy5fY2FjaGVVc2VkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3NDYWNoZVt3b3JkXSB8
fCAodGhpcy5fc0NhY2hlW3dvcmRdID0gdGhpcy5fc2luZ3VsYXJpemUod29yZCkpOworICAgICAg
fTsKKworICAgICAgdGhpcy5wbHVyYWxpemUgPSBmdW5jdGlvbiAod29yZCkgeworICAgICAgICB0
aGlzLl9jYWNoZVVzZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdGhpcy5fcENhY2hlW3dvcmRd
IHx8ICh0aGlzLl9wQ2FjaGVbd29yZF0gPSB0aGlzLl9wbHVyYWxpemUod29yZCkpOworICAgICAg
fTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBAcHVibGljCisgICAgICAgQG1ldGhvZCBwdXJn
ZWRDYWNoZQorICAgICovCisgICAgcHVyZ2VDYWNoZTogZnVuY3Rpb24gcHVyZ2VDYWNoZSgpIHsK
KyAgICAgIHRoaXMuX2NhY2hlVXNlZCA9IGZhbHNlOworICAgICAgdGhpcy5fc0NhY2hlID0gbWFr
ZURpY3Rpb25hcnkoKTsKKyAgICAgIHRoaXMuX3BDYWNoZSA9IG1ha2VEaWN0aW9uYXJ5KCk7Cisg
ICAgfSwKKworICAgIC8qKgorICAgICAgQHB1YmxpYworICAgICAgZGlzYWJsZSBjYWNoaW5nCisg
ICAgICAgQG1ldGhvZCBkaXNhYmxlQ2FjaGU7CisgICAgKi8KKyAgICBkaXNhYmxlQ2FjaGU6IGZ1
bmN0aW9uIGRpc2FibGVDYWNoZSgpIHsKKyAgICAgIHRoaXMuX3NDYWNoZSA9IG51bGw7CisgICAg
ICB0aGlzLl9wQ2FjaGUgPSBudWxsOworICAgICAgdGhpcy5zaW5ndWxhcml6ZSA9IGZ1bmN0aW9u
ICh3b3JkKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9zaW5ndWxhcml6ZSh3b3JkKTsKKyAgICAg
IH07CisKKyAgICAgIHRoaXMucGx1cmFsaXplID0gZnVuY3Rpb24gKHdvcmQpIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX3BsdXJhbGl6ZSh3b3JkKTsKKyAgICAgIH07CisgICAgfSwKKworICAgIC8q
KgorICAgICAgQG1ldGhvZCBwbHVyYWwKKyAgICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAorICAg
ICAgQHBhcmFtIHtTdHJpbmd9IHN0cmluZworICAgICovCisgICAgcGx1cmFsOiBmdW5jdGlvbiBw
bHVyYWwocmVnZXgsIHN0cmluZykgeworICAgICAgaWYgKHRoaXMuX2NhY2hlVXNlZCkgeworICAg
ICAgICB0aGlzLnB1cmdlQ2FjaGUoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucnVsZXMucGx1cmFs
cy5wdXNoKFtyZWdleCwgc3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKKyAgICB9LAorCisgICAgLyoq
CisgICAgICBAbWV0aG9kIHNpbmd1bGFyCisgICAgICBAcGFyYW0ge1JlZ0V4cH0gcmVnZXgKKyAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcKKyAgICAqLworICAgIHNpbmd1bGFyOiBmdW5jdGlv
biBzaW5ndWxhcihyZWdleCwgc3RyaW5nKSB7CisgICAgICBpZiAodGhpcy5fY2FjaGVVc2VkKSB7
CisgICAgICAgIHRoaXMucHVyZ2VDYWNoZSgpOworICAgICAgfQorICAgICAgdGhpcy5ydWxlcy5z
aW5ndWxhci5wdXNoKFtyZWdleCwgc3RyaW5nLnRvTG93ZXJDYXNlKCldKTsKKyAgICB9LAorCisg
ICAgLyoqCisgICAgICBAbWV0aG9kIHVuY291bnRhYmxlCisgICAgICBAcGFyYW0ge1N0cmluZ30g
cmVnZXgKKyAgICAqLworICAgIHVuY291bnRhYmxlOiBmdW5jdGlvbiB1bmNvdW50YWJsZShzdHJp
bmcpIHsKKyAgICAgIGlmICh0aGlzLl9jYWNoZVVzZWQpIHsKKyAgICAgICAgdGhpcy5wdXJnZUNh
Y2hlKCk7CisgICAgICB9CisgICAgICBsb2FkVW5jb3VudGFibGUodGhpcy5ydWxlcywgW3N0cmlu
Zy50b0xvd2VyQ2FzZSgpXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgQG1ldGhvZCBpcnJl
Z3VsYXIKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5ndWxhcgorICAgICAgQHBhcmFtIHtTdHJp
bmd9IHBsdXJhbAorICAgICovCisgICAgaXJyZWd1bGFyOiBmdW5jdGlvbiBpcnJlZ3VsYXIoc2lu
Z3VsYXIsIHBsdXJhbCkgeworICAgICAgaWYgKHRoaXMuX2NhY2hlVXNlZCkgeworICAgICAgICB0
aGlzLnB1cmdlQ2FjaGUoKTsKKyAgICAgIH0KKyAgICAgIGxvYWRJcnJlZ3VsYXIodGhpcy5ydWxl
cywgW1tzaW5ndWxhciwgcGx1cmFsXV0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBtZXRo
b2QgcGx1cmFsaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gd29yZAorICAgICovCisgICAgcGx1
cmFsaXplOiBmdW5jdGlvbiBwbHVyYWxpemUod29yZCkgeworICAgICAgcmV0dXJuIHRoaXMuX3Bs
dXJhbGl6ZSh3b3JkKTsKKyAgICB9LAorCisgICAgX3BsdXJhbGl6ZTogZnVuY3Rpb24gX3BsdXJh
bGl6ZSh3b3JkKSB7CisgICAgICByZXR1cm4gdGhpcy5pbmZsZWN0KHdvcmQsIHRoaXMucnVsZXMu
cGx1cmFscywgdGhpcy5ydWxlcy5pcnJlZ3VsYXIpOworICAgIH0sCisgICAgLyoqCisgICAgICBA
bWV0aG9kIHNpbmd1bGFyaXplCisgICAgICBAcGFyYW0ge1N0cmluZ30gd29yZAorICAgICovCisg
ICAgc2luZ3VsYXJpemU6IGZ1bmN0aW9uIHNpbmd1bGFyaXplKHdvcmQpIHsKKyAgICAgIHJldHVy
biB0aGlzLl9zaW5ndWxhcml6ZSh3b3JkKTsKKyAgICB9LAorCisgICAgX3Npbmd1bGFyaXplOiBm
dW5jdGlvbiBfc2luZ3VsYXJpemUod29yZCkgeworICAgICAgcmV0dXJuIHRoaXMuaW5mbGVjdCh3
b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCB0aGlzLnJ1bGVzLmlycmVndWxhckludmVyc2UpOwor
ICAgIH0sCisKKyAgICAvKioKKyAgICAgIEBwcm90ZWN0ZWQKKyAgICAgICBAbWV0aG9kIGluZmxl
Y3QKKyAgICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCisgICAgICBAcGFyYW0ge09iamVjdH0gdHlw
ZVJ1bGVzCisgICAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFyCisgICAgKi8KKyAgICBpbmZs
ZWN0OiBmdW5jdGlvbiBpbmZsZWN0KHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7CisgICAg
ICB2YXIgaW5mbGVjdGlvbiwgc3Vic3RpdHV0aW9uLCByZXN1bHQsIGxvd2VyY2FzZSwgd29yZFNw
bGl0LCBmaXJzdFBocmFzZSwgbGFzdFdvcmQsIGlzQmxhbmssIGlzQ2FtZWxpemVkLCBydWxlLCBp
c1VuY291bnRhYmxlOworCisgICAgICBpc0JsYW5rID0gIXdvcmQgfHwgQkxBTktfUkVHRVgudGVz
dCh3b3JkKTsKKworICAgICAgaXNDYW1lbGl6ZWQgPSBDQU1FTElaRURfUkVHRVgudGVzdCh3b3Jk
KTsKKyAgICAgIGZpcnN0UGhyYXNlID0gIiI7CisKKyAgICAgIGlmIChpc0JsYW5rKSB7CisgICAg
ICAgIHJldHVybiB3b3JkOworICAgICAgfQorCisgICAgICBsb3dlcmNhc2UgPSB3b3JkLnRvTG93
ZXJDYXNlKCk7CisgICAgICB3b3JkU3BsaXQgPSBMQVNUX1dPUkRfREFTSEVEX1JFR0VYLmV4ZWMo
d29yZCkgfHwgTEFTVF9XT1JEX0NBTUVMSVpFRF9SRUdFWC5leGVjKHdvcmQpOworCisgICAgICBp
ZiAod29yZFNwbGl0KSB7CisgICAgICAgIGZpcnN0UGhyYXNlID0gd29yZFNwbGl0WzFdOworICAg
ICAgICBsYXN0V29yZCA9IHdvcmRTcGxpdFsyXS50b0xvd2VyQ2FzZSgpOworICAgICAgfQorCisg
ICAgICBpc1VuY291bnRhYmxlID0gdGhpcy5ydWxlcy51bmNvdW50YWJsZVtsb3dlcmNhc2VdIHx8
IHRoaXMucnVsZXMudW5jb3VudGFibGVbbGFzdFdvcmRdOworCisgICAgICBpZiAoaXNVbmNvdW50
YWJsZSkgeworICAgICAgICByZXR1cm4gd29yZDsKKyAgICAgIH0KKworICAgICAgZm9yIChydWxl
IGluIHRoaXMucnVsZXMuaXJyZWd1bGFyKSB7CisgICAgICAgIGlmIChsb3dlcmNhc2UubWF0Y2go
cnVsZSArICIkIikpIHsKKyAgICAgICAgICBzdWJzdGl0dXRpb24gPSBpcnJlZ3VsYXJbcnVsZV07
CisKKyAgICAgICAgICBpZiAoaXNDYW1lbGl6ZWQgJiYgaXJyZWd1bGFyW2xhc3RXb3JkXSkgewor
ICAgICAgICAgICAgc3Vic3RpdHV0aW9uID0gY2FwaXRhbGl6ZShzdWJzdGl0dXRpb24pOworICAg
ICAgICAgICAgcnVsZSA9IGNhcGl0YWxpemUocnVsZSk7CisgICAgICAgICAgfQorCisgICAgICAg
ICAgcmV0dXJuIHdvcmQucmVwbGFjZShydWxlLCBzdWJzdGl0dXRpb24pOworICAgICAgICB9Cisg
ICAgICB9CisKKyAgICAgIGZvciAodmFyIGkgPSB0eXBlUnVsZXMubGVuZ3RoLCBtaW4gPSAwOyBp
ID4gbWluOyBpLS0pIHsKKyAgICAgICAgaW5mbGVjdGlvbiA9IHR5cGVSdWxlc1tpIC0gMV07Cisg
ICAgICAgIHJ1bGUgPSBpbmZsZWN0aW9uWzBdOworCisgICAgICAgIGlmIChydWxlLnRlc3Qod29y
ZCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmZs
ZWN0aW9uID0gaW5mbGVjdGlvbiB8fCBbXTsKKworICAgICAgcnVsZSA9IGluZmxlY3Rpb25bMF07
CisgICAgICBzdWJzdGl0dXRpb24gPSBpbmZsZWN0aW9uWzFdOworCisgICAgICByZXN1bHQgPSB3
b3JkLnJlcGxhY2UocnVsZSwgc3Vic3RpdHV0aW9uKTsKKworICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgIH07CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gSW5mbGVjdG9yOworfSk7Citk
ZWZpbmUoJ2VtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtL3N0cmluZycsIFsnZXhwb3J0cycsICdl
bWJlci1pbmZsZWN0b3IvbGliL3N5c3RlbS9pbmZsZWN0b3InXSwgZnVuY3Rpb24gKGV4cG9ydHMs
IF9lbWJlckluZmxlY3RvckxpYlN5c3RlbUluZmxlY3RvcikgeworICAndXNlIHN0cmljdCc7CisK
KyAgZnVuY3Rpb24gcGx1cmFsaXplKHdvcmQpIHsKKyAgICByZXR1cm4gX2VtYmVySW5mbGVjdG9y
TGliU3lzdGVtSW5mbGVjdG9yWydkZWZhdWx0J10uaW5mbGVjdG9yLnBsdXJhbGl6ZSh3b3JkKTsK
KyAgfQorCisgIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHdvcmQpIHsKKyAgICByZXR1cm4gX2VtYmVy
SW5mbGVjdG9yTGliU3lzdGVtSW5mbGVjdG9yWydkZWZhdWx0J10uaW5mbGVjdG9yLnNpbmd1bGFy
aXplKHdvcmQpOworICB9CisKKyAgZXhwb3J0cy5wbHVyYWxpemUgPSBwbHVyYWxpemU7CisgIGV4
cG9ydHMuc2luZ3VsYXJpemUgPSBzaW5ndWxhcml6ZTsKK30pOworZGVmaW5lKCdlbWJlci1pbmZs
ZWN0b3IvbGliL3V0aWxzL21ha2UtaGVscGVyJywgWydleHBvcnRzJywgJ2VtYmVyJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHNbJ2Rl
ZmF1bHQnXSA9IG1ha2VIZWxwZXI7CisKKyAgZnVuY3Rpb24gbWFrZUhlbHBlcihoZWxwZXJGdW5j
dGlvbikgeworICAgIGlmIChfZW1iZXJbJ2RlZmF1bHQnXS5IZWxwZXIpIHsKKyAgICAgIHJldHVy
biBfZW1iZXJbJ2RlZmF1bHQnXS5IZWxwZXIuaGVscGVyKGhlbHBlckZ1bmN0aW9uKTsKKyAgICB9
CisgICAgaWYgKF9lbWJlclsnZGVmYXVsdCddLkhUTUxCYXJzKSB7CisgICAgICByZXR1cm4gX2Vt
YmVyWydkZWZhdWx0J10uSFRNTEJhcnMubWFrZUJvdW5kSGVscGVyKGhlbHBlckZ1bmN0aW9uKTsK
KyAgICB9CisgICAgcmV0dXJuIF9lbWJlclsnZGVmYXVsdCddLkhhbmRsZWJhcnMubWFrZUJvdW5k
SGVscGVyKGhlbHBlckZ1bmN0aW9uKTsKKyAgfQorfSk7CitkZWZpbmUoJ2VtYmVyLWxvYWQtaW5p
dGlhbGl6ZXJzL2luZGV4JywgWydleHBvcnRzJywgJ2VtYmVyJ10sIGZ1bmN0aW9uIChleHBvcnRz
LCBfZW1iZXIpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1
bmN0aW9uIChhcHAsIHByZWZpeCkgeworICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsg
cHJlZml4ICsgJ1wvKCg/Omluc3RhbmNlLSk/aW5pdGlhbGl6ZXJzKVwvJyk7CisgICAgdmFyIGdl
dEtleXMgPSBPYmplY3Qua2V5cyB8fCBfZW1iZXJbJ2RlZmF1bHQnXS5rZXlzOworCisgICAgZ2V0
S2V5cyhyZXF1aXJlanMuX2Vha19zZWVuKS5tYXAoZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKKyAg
ICAgIHJldHVybiB7CisgICAgICAgIG1vZHVsZU5hbWU6IG1vZHVsZU5hbWUsCisgICAgICAgIG1h
dGNoZXM6IHJlZ2V4LmV4ZWMobW9kdWxlTmFtZSkKKyAgICAgIH07CisgICAgfSkuZmlsdGVyKGZ1
bmN0aW9uIChkZXApIHsKKyAgICAgIHJldHVybiBkZXAubWF0Y2hlcyAmJiBkZXAubWF0Y2hlcy5s
ZW5ndGggPT09IDI7CisgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7CisgICAgICB2YXIg
bW9kdWxlTmFtZSA9IGRlcC5tb2R1bGVOYW1lOworCisgICAgICB2YXIgbW9kdWxlID0gcmVxdWly
ZShtb2R1bGVOYW1lLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgIGlmICghbW9kdWxlKSB7Cisg
ICAgICAgIHRocm93IG5ldyBFcnJvcihtb2R1bGVOYW1lICsgJyBtdXN0IGV4cG9ydCBhbiBpbml0
aWFsaXplci4nKTsKKyAgICAgIH0KKworICAgICAgdmFyIGluaXRpYWxpemVyVHlwZSA9IF9lbWJl
clsnZGVmYXVsdCddLlN0cmluZy5jYW1lbGl6ZShkZXAubWF0Y2hlc1sxXS5zdWJzdHJpbmcoMCwg
ZGVwLm1hdGNoZXNbMV0ubGVuZ3RoIC0gMSkpOworICAgICAgdmFyIGluaXRpYWxpemVyID0gbW9k
dWxlWydkZWZhdWx0J107CisgICAgICBpZiAoIWluaXRpYWxpemVyLm5hbWUpIHsKKyAgICAgICAg
dmFyIGluaXRpYWxpemVyTmFtZSA9IG1vZHVsZU5hbWUubWF0Y2goL1teXC9dK1wvPyQvKVswXTsK
KyAgICAgICAgaW5pdGlhbGl6ZXIubmFtZSA9IGluaXRpYWxpemVyTmFtZTsKKyAgICAgIH0KKwor
ICAgICAgaWYgKGFwcFtpbml0aWFsaXplclR5cGVdKSB7CisgICAgICAgIGFwcFtpbml0aWFsaXpl
clR5cGVdKGluaXRpYWxpemVyKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfTsKK30pOworZGVmaW5l
KCdlbWJlci1yZXNvbHZlci9jb250YWluZXItZGVidWctYWRhcHRlcicsIFsnZXhwb3J0cycsICdl
bWJlcicsICdlbWJlci1yZXNvbHZlci91dGlscy9tb2R1bGUtcmVnaXN0cnknXSwgZnVuY3Rpb24g
KGV4cG9ydHMsIF9lbWJlciwgX2VtYmVyUmVzb2x2ZXJVdGlsc01vZHVsZVJlZ2lzdHJ5KSB7Cisg
ICd1c2Ugc3RyaWN0JzsKKworICB2YXIgQ29udGFpbmVyRGVidWdBZGFwdGVyID0gX2VtYmVyWydk
ZWZhdWx0J10uQ29udGFpbmVyRGVidWdBZGFwdGVyOworCisgIHZhciBNb2R1bGVzQ29udGFpbmVy
RGVidWdBZGFwdGVyID0gbnVsbDsKKworICBmdW5jdGlvbiBnZXRQb2QodHlwZSwga2V5LCBwcmVm
aXgpIHsKKyAgICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2gobmV3IFJlZ0V4cCgnXi8/JyArIHByZWZp
eCArICcvKC4rKS8nICsgdHlwZSArICckJykpOworICAgIGlmIChtYXRjaCkgeworICAgICAgcmV0
dXJuIG1hdGNoWzFdOworICAgIH0KKyAgfQorCisgIC8vIFN1cHBvcnQgRW1iZXIgPCAxLjUtYmV0
YS40CisgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGFmdGVyIDEuNS4wIGlzIHJlbGVhc2VkCisgIGlm
ICh0eXBlb2YgQ29udGFpbmVyRGVidWdBZGFwdGVyICE9PSAndW5kZWZpbmVkJykgeworCisgICAg
LyoKKyAgICAgKiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgc3ViY2xhc3Mgb2YgRW1iZXIuQ29udGFp
bmVyRGVidWdBZGFwdGVyIHRoYXQgYWRkcyB0d28KKyAgICAgKiBpbXBvcnRhbnQgZmVhdHVyZXM6
CisgICAgICoKKyAgICAgKiAgMSkgaXMgYWJsZSBwcm92aWRlIGluamVjdGlvbnMgdG8gY2xhc3Nl
cyB0aGF0IGltcGxlbWVudCBgZXh0ZW5kYAorICAgICAqICAgICAoYXMgaXMgdHlwaWNhbCB3aXRo
IEVtYmVyKS4KKyAgICAgKi8KKworICAgIE1vZHVsZXNDb250YWluZXJEZWJ1Z0FkYXB0ZXIgPSBD
b250YWluZXJEZWJ1Z0FkYXB0ZXIuZXh0ZW5kKHsKKyAgICAgIF9tb2R1bGVSZWdpc3RyeTogbnVs
bCwKKworICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHsKKyAgICAgICAgdGhpcy5fc3VwZXIu
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgICAgICBpZiAoIXRoaXMuX21vZHVsZVJlZ2lz
dHJ5KSB7CisgICAgICAgICAgdGhpcy5fbW9kdWxlUmVnaXN0cnkgPSBuZXcgX2VtYmVyUmVzb2x2
ZXJVdGlsc01vZHVsZVJlZ2lzdHJ5WydkZWZhdWx0J10oKTsKKyAgICAgICAgfQorICAgICAgfSwK
KworICAgICAgLyoqCisgICAgICAgIFRoZSBjb250YWluZXIgb2YgdGhlIGFwcGxpY2F0aW9uIGJl
aW5nIGRlYnVnZ2VkLgorICAgICAgICBUaGlzIHByb3BlcnR5IHdpbGwgYmUgaW5qZWN0ZWQKKyAg
ICAgICAgb24gY3JlYXRpb24uCisgICAgICAgICBAcHJvcGVydHkgY29udGFpbmVyCisgICAgICAg
IEBkZWZhdWx0IG51bGwKKyAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICBUaGUgcmVzb2x2
ZXIgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIGJlaW5nIGRlYnVnZ2VkLiBU
aGlzIHByb3BlcnR5IHdpbGwgYmUgaW5qZWN0ZWQKKyAgICAgICAgb24gY3JlYXRpb24uCisgICAg
ICAgICBAcHJvcGVydHkgcmVzb2x2ZXIKKyAgICAgICAgQGRlZmF1bHQgbnVsbAorICAgICAgKi8K
KworICAgICAgLyoqCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBj
YXRhbG9nIGEgbGlzdCBvZiBhdmFpbGFibGUKKyAgICAgICAgY2xhc3NlcyBpbiB0aGUgcmVzb2x2
ZXIgZm9yIGEgZ2l2ZW4gdHlwZS4KKyAgICAgICAgIEBtZXRob2QgY2FuQ2F0YWxvZ0VudHJpZXNC
eVR5cGUKKyAgICAgICAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUuIGUuZy4gIm1vZGVs
IiwgImNvbnRyb2xsZXIiLCAicm91dGUiCisgICAgICAgIEByZXR1cm4ge2Jvb2xlYW59IHdoZXRo
ZXIgYSBsaXN0IGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlLgorICAgICAgKi8KKyAgICAgIGNh
bkNhdGFsb2dFbnRyaWVzQnlUeXBlOiBmdW5jdGlvbiBjYW5DYXRhbG9nRW50cmllc0J5VHlwZSgp
IC8qIHR5cGUgKi97CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSwKKworICAgICAgLyoq
CisgICAgICAgIFJldHVybnMgdGhlIGF2YWlsYWJsZSBjbGFzc2VzIGEgZ2l2ZW4gdHlwZS4KKyAg
ICAgICAgIEBtZXRob2QgY2F0YWxvZ0VudHJpZXNCeVR5cGUKKyAgICAgICAgQHBhcmFtIHtzdHJp
bmd9IHR5cGUgVGhlIHR5cGUuIGUuZy4gIm1vZGVsIiwgImNvbnRyb2xsZXIiLCAicm91dGUiCisg
ICAgICAgIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjbGFzc2VzLgorICAgICAgKi8KKyAg
ICAgIGNhdGFsb2dFbnRyaWVzQnlUeXBlOiBmdW5jdGlvbiBjYXRhbG9nRW50cmllc0J5VHlwZSh0
eXBlKSB7CisgICAgICAgIHZhciBtb2R1bGVOYW1lcyA9IHRoaXMuX21vZHVsZVJlZ2lzdHJ5Lm1v
ZHVsZU5hbWVzKCk7CisgICAgICAgIHZhciB0eXBlcyA9IF9lbWJlclsnZGVmYXVsdCddLkEoKTsK
KworICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5uYW1lc3BhY2UubW9kdWxlUHJlZml4OworCisg
ICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbW9kdWxlTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsr
KSB7CisgICAgICAgICAgdmFyIGtleSA9IG1vZHVsZU5hbWVzW2ldOworCisgICAgICAgICAgaWYg
KGtleS5pbmRleE9mKHR5cGUpICE9PSAtMSkgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQn
cyBhIHBvZCBtb2R1bGUKKyAgICAgICAgICAgIHZhciBuYW1lID0gZ2V0UG9kKHR5cGUsIGtleSwg
dGhpcy5uYW1lc3BhY2UucG9kTW9kdWxlUHJlZml4IHx8IHByZWZpeCk7CisgICAgICAgICAgICBp
ZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgLy8gTm90IHBvZAorICAgICAgICAgICAgICBuYW1l
ID0ga2V5LnNwbGl0KHR5cGUgKyAncy8nKS5wb3AoKTsKKworICAgICAgICAgICAgICAvLyBTdXBw
b3J0IGZvciBkaWZmZXJlbnQgcHJlZml4IChzdWNoIGFzIGVtYmVyLWNsaSBhZGRvbnMpLgorICAg
ICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhlIGNvZGUgYmVsb3cgd2hlbgorICAgICAgICAgICAg
ICAvLyBodHRwczovL2dpdGh1Yi5jb20vZW1iZXItY2xpL2VtYmVyLXJlc29sdmVyL3B1bGwvODAg
aXMgbWVyZ2VkLgorCisgICAgICAgICAgICAgIC8vdmFyIG1hdGNoID0ga2V5Lm1hdGNoKCdeLz8o
LispLycgKyB0eXBlKTsKKyAgICAgICAgICAgICAgLy9pZiAobWF0Y2ggJiYgbWF0Y2hbMV0gIT09
IHByZWZpeCkgeworICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgcHJlZml4IHN1Y2ggYXMgYW4g
YWRkb24KKyAgICAgICAgICAgICAgLy9uYW1lID0gbWF0Y2hbMV0gKyAnQCcgKyBuYW1lOworICAg
ICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGVzLmFkZE9iamVj
dChuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVzOwor
ICAgICAgfQorICAgIH0pOworICB9CisKKyAgZXhwb3J0c1snZGVmYXVsdCddID0gTW9kdWxlc0Nv
bnRhaW5lckRlYnVnQWRhcHRlcjsKK30pOworZGVmaW5lKCdlbWJlci1yZXNvbHZlci9pbmRleCcs
IFsnZXhwb3J0cycsICdlbWJlci1yZXNvbHZlci9yZXNvbHZlciddLCBmdW5jdGlvbiAoZXhwb3J0
cywgX2VtYmVyUmVzb2x2ZXJSZXNvbHZlcikgeworICAndXNlIHN0cmljdCc7CisKKyAgT2JqZWN0
LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdkZWZhdWx0JywgeworICAgIGVudW1lcmFibGU6IHRy
dWUsCisgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CisgICAgICByZXR1cm4gX2VtYmVyUmVzb2x2
ZXJSZXNvbHZlclsnZGVmYXVsdCddOworICAgIH0KKyAgfSk7Cit9KTsKK2RlZmluZSgnZW1iZXIt
cmVzb2x2ZXIvcmVzb2x2ZXInLCBbJ2V4cG9ydHMnLCAnZW1iZXInLCAnZW1iZXItcmVzb2x2ZXIv
dXRpbHMvbW9kdWxlLXJlZ2lzdHJ5JywgJ2VtYmVyLXJlc29sdmVyL3V0aWxzL2NsYXNzLWZhY3Rv
cnknLCAnZW1iZXItcmVzb2x2ZXIvdXRpbHMvbWFrZS1kaWN0aW9uYXJ5J10sIGZ1bmN0aW9uIChl
eHBvcnRzLCBfZW1iZXIsIF9lbWJlclJlc29sdmVyVXRpbHNNb2R1bGVSZWdpc3RyeSwgX2VtYmVy
UmVzb2x2ZXJVdGlsc0NsYXNzRmFjdG9yeSwgX2VtYmVyUmVzb2x2ZXJVdGlsc01ha2VEaWN0aW9u
YXJ5KSB7CisgIC8qZ2xvYmFscyByZXF1aXJlICovCisKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8q
CisgICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBzdWJjbGFzcyBvZiBFbWJlci5EZWZhdWx0UmVz
b2x2ZXIgdGhhdCBhZGRzIHR3bworICAgKiBpbXBvcnRhbnQgZmVhdHVyZXM6CisgICAqCisgICAq
ICAxKSBUaGUgcmVzb2x2ZXIgbWFrZXMgdGhlIGNvbnRhaW5lciBhd2FyZSBvZiBlczYgbW9kdWxl
cyB2aWEgdGhlIEFNRAorICAgKiAgICAgb3V0cHV0LiBUaGUgbG9hZGVyJ3MgX21vZHVsZUVudHJp
ZXMgaXMgY29uc3VsdGVkIHNvIHRoYXQgY2xhc3NlcyBjYW4gYmUKKyAgICogICAgIHJlc29sdmVk
IGRpcmVjdGx5IHZpYSB0aGUgbW9kdWxlIGxvYWRlciwgd2l0aG91dCBuZWVkaW5nIGEgbWFudWFs
CisgICAqICAgICBgaW1wb3J0YC4KKyAgICogIDIpIGlzIGFibGUgdG8gcHJvdmlkZSBpbmplY3Rp
b25zIHRvIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgYGV4dGVuZGAKKyAgICogICAgIChhcyBpcyB0
eXBpY2FsIHdpdGggRW1iZXIpLgorICAgKi8KKworICB2YXIgX0VtYmVyJFN0cmluZyA9IF9lbWJl
clsnZGVmYXVsdCddLlN0cmluZzsKKyAgdmFyIHVuZGVyc2NvcmUgPSBfRW1iZXIkU3RyaW5nLnVu
ZGVyc2NvcmU7CisgIHZhciBjbGFzc2lmeSA9IF9FbWJlciRTdHJpbmcuY2xhc3NpZnk7CisgIHZh
ciBkYXNoZXJpemUgPSBfRW1iZXIkU3RyaW5nLmRhc2hlcml6ZTsKKyAgdmFyIGdldCA9IF9lbWJl
clsnZGVmYXVsdCddLmdldDsKKyAgdmFyIERlZmF1bHRSZXNvbHZlciA9IF9lbWJlclsnZGVmYXVs
dCddLkRlZmF1bHRSZXNvbHZlcjsKKworICBmdW5jdGlvbiBwYXJzZU5hbWUoZnVsbE5hbWUpIHsK
KyAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLworCisgICAgaWYgKGZ1bGxOYW1lLnBhcnNl
ZE5hbWUgPT09IHRydWUpIHsKKyAgICAgIHJldHVybiBmdWxsTmFtZTsKKyAgICB9CisKKyAgICB2
YXIgcHJlZml4LCB0eXBlLCBuYW1lOworICAgIHZhciBmdWxsTmFtZVBhcnRzID0gZnVsbE5hbWUu
c3BsaXQoJ0AnKTsKKworICAgIC8vIEhUTUxCYXJzIHVzZXMgaGVscGVyOkBjb250ZW50LWhlbHBl
ciB3aGljaCBjb2xsaWRlcworICAgIC8vIHdpdGggZW1iZXItY2xpIG5hbWVzcGFjZSBkZXRlY3Rp
b24uCisgICAgLy8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSBvZiBI
VE1MQmFycy4KKyAgICBpZiAoZnVsbE5hbWUgIT09ICdoZWxwZXI6QGNvbnRlbnQtaGVscGVyJyAm
JiBmdWxsTmFtZVBhcnRzLmxlbmd0aCA9PT0gMikgeworICAgICAgdmFyIHByZWZpeFBhcnRzID0g
ZnVsbE5hbWVQYXJ0c1swXS5zcGxpdCgnOicpOworCisgICAgICBpZiAocHJlZml4UGFydHMubGVu
Z3RoID09PSAyKSB7CisgICAgICAgIHByZWZpeCA9IHByZWZpeFBhcnRzWzFdOworICAgICAgICB0
eXBlID0gcHJlZml4UGFydHNbMF07CisgICAgICAgIG5hbWUgPSBmdWxsTmFtZVBhcnRzWzFdOwor
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IGZ1bGxOYW1lUGFydHNbMV0u
c3BsaXQoJzonKTsKKworICAgICAgICBwcmVmaXggPSBmdWxsTmFtZVBhcnRzWzBdOworICAgICAg
ICB0eXBlID0gbmFtZVBhcnRzWzBdOworICAgICAgICBuYW1lID0gbmFtZVBhcnRzWzFdOworICAg
ICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmdWxsTmFtZVBhcnRzID0gZnVsbE5hbWUuc3BsaXQo
JzonKTsKKyAgICAgIHR5cGUgPSBmdWxsTmFtZVBhcnRzWzBdOworICAgICAgbmFtZSA9IGZ1bGxO
YW1lUGFydHNbMV07CisgICAgfQorCisgICAgdmFyIGZ1bGxOYW1lV2l0aG91dFR5cGUgPSBuYW1l
OworICAgIHZhciBuYW1lc3BhY2UgPSBnZXQodGhpcywgJ25hbWVzcGFjZScpOworICAgIHZhciBy
b290ID0gbmFtZXNwYWNlOworCisgICAgcmV0dXJuIHsKKyAgICAgIHBhcnNlZE5hbWU6IHRydWUs
CisgICAgICBmdWxsTmFtZTogZnVsbE5hbWUsCisgICAgICBwcmVmaXg6IHByZWZpeCB8fCB0aGlz
LnByZWZpeCh7IHR5cGU6IHR5cGUgfSksCisgICAgICB0eXBlOiB0eXBlLAorICAgICAgZnVsbE5h
bWVXaXRob3V0VHlwZTogZnVsbE5hbWVXaXRob3V0VHlwZSwKKyAgICAgIG5hbWU6IG5hbWUsCisg
ICAgICByb290OiByb290LAorICAgICAgcmVzb2x2ZU1ldGhvZE5hbWU6ICJyZXNvbHZlIiArIGNs
YXNzaWZ5KHR5cGUpCisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlc29sdmVPdGhlcihwYXJz
ZWROYW1lKSB7CisgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KKworICAgIF9lbWJlclsn
ZGVmYXVsdCddLmFzc2VydCgnYG1vZHVsZVByZWZpeGAgbXVzdCBiZSBkZWZpbmVkJywgdGhpcy5u
YW1lc3BhY2UubW9kdWxlUHJlZml4KTsKKworICAgIHZhciBub3JtYWxpemVkTW9kdWxlTmFtZSA9
IHRoaXMuZmluZE1vZHVsZU5hbWUocGFyc2VkTmFtZSk7CisKKyAgICBpZiAobm9ybWFsaXplZE1v
ZHVsZU5hbWUpIHsKKyAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gdGhpcy5fZXh0cmFjdERlZmF1
bHRFeHBvcnQobm9ybWFsaXplZE1vZHVsZU5hbWUsIHBhcnNlZE5hbWUpOworCisgICAgICBpZiAo
ZGVmYXVsdEV4cG9ydCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
IEV4cGVjdGVkIHRvIGZpbmQ6ICciICsgcGFyc2VkTmFtZS5mdWxsTmFtZSArICInIHdpdGhpbiAn
IiArIG5vcm1hbGl6ZWRNb2R1bGVOYW1lICsgIicgYnV0IGdvdCAndW5kZWZpbmVkJy4gRGlkIHlv
dSBmb3JnZXQgdG8gYGV4cG9ydCBkZWZhdWx0YCB3aXRoaW4gJyIgKyBub3JtYWxpemVkTW9kdWxl
TmFtZSArICInPyIpOworICAgICAgfQorCisgICAgICBpZiAodGhpcy5zaG91bGRXcmFwSW5DbGFz
c0ZhY3RvcnkoZGVmYXVsdEV4cG9ydCwgcGFyc2VkTmFtZSkpIHsKKyAgICAgICAgZGVmYXVsdEV4
cG9ydCA9ICgwLCBfZW1iZXJSZXNvbHZlclV0aWxzQ2xhc3NGYWN0b3J5WydkZWZhdWx0J10pKGRl
ZmF1bHRFeHBvcnQpOworICAgICAgfQorCisgICAgICByZXR1cm4gZGVmYXVsdEV4cG9ydDsKKyAg
ICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHBhcnNlZE5hbWUpOworICAgIH0K
KyAgfQorCisgIC8vIEVtYmVyLkRlZmF1bHRSZXNvbHZlciBkb2NzOgorICAvLyAgIGh0dHBzOi8v
Z2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2VtYmVyLWFw
cGxpY2F0aW9uL2xpYi9zeXN0ZW0vcmVzb2x2ZXIuanMKKyAgdmFyIFJlc29sdmVyID0gRGVmYXVs
dFJlc29sdmVyLmV4dGVuZCh7CisgICAgcmVzb2x2ZU90aGVyOiByZXNvbHZlT3RoZXIsCisgICAg
cGFyc2VOYW1lOiBwYXJzZU5hbWUsCisgICAgcmVzb2x2ZVRlbXBsYXRlOiByZXNvbHZlT3RoZXIs
CisgICAgcGx1cmFsaXplZFR5cGVzOiBudWxsLAorICAgIG1vZHVsZVJlZ2lzdHJ5OiBudWxsLAor
CisgICAgbWFrZVRvU3RyaW5nOiBmdW5jdGlvbiBtYWtlVG9TdHJpbmcoZmFjdG9yeSwgZnVsbE5h
bWUpIHsKKyAgICAgIHJldHVybiAnJyArIHRoaXMubmFtZXNwYWNlLm1vZHVsZVByZWZpeCArICdA
JyArIGZ1bGxOYW1lICsgJzonOworICAgIH0sCisKKyAgICBzaG91bGRXcmFwSW5DbGFzc0ZhY3Rv
cnk6IGZ1bmN0aW9uIHNob3VsZFdyYXBJbkNsYXNzRmFjdG9yeSgpIC8qIG1vZHVsZSwgcGFyc2Vk
TmFtZSAqL3sKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgaW5pdDogZnVuY3Rp
b24gaW5pdCgpIHsKKyAgICAgIHRoaXMuX3N1cGVyKCk7CisgICAgICB0aGlzLm1vZHVsZUJhc2Vk
UmVzb2x2ZXIgPSB0cnVlOworCisgICAgICBpZiAoIXRoaXMuX21vZHVsZVJlZ2lzdHJ5KSB7Cisg
ICAgICAgIHRoaXMuX21vZHVsZVJlZ2lzdHJ5ID0gbmV3IF9lbWJlclJlc29sdmVyVXRpbHNNb2R1
bGVSZWdpc3RyeVsnZGVmYXVsdCddKCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuX25vcm1hbGl6
ZUNhY2hlID0gKDAsIF9lbWJlclJlc29sdmVyVXRpbHNNYWtlRGljdGlvbmFyeVsnZGVmYXVsdCdd
KSgpOworCisgICAgICB0aGlzLnBsdXJhbGl6ZWRUeXBlcyA9IHRoaXMucGx1cmFsaXplZFR5cGVz
IHx8ICgwLCBfZW1iZXJSZXNvbHZlclV0aWxzTWFrZURpY3Rpb25hcnlbJ2RlZmF1bHQnXSkoKTsK
KworICAgICAgaWYgKCF0aGlzLnBsdXJhbGl6ZWRUeXBlcy5jb25maWcpIHsKKyAgICAgICAgdGhp
cy5wbHVyYWxpemVkVHlwZXMuY29uZmlnID0gJ2NvbmZpZyc7CisgICAgICB9CisgICAgICB0aGlz
Ll9kZXByZWNhdGVkUG9kTW9kdWxlUHJlZml4ID0gZmFsc2U7CisgICAgfSwKKworICAgIG5vcm1h
bGl6ZTogZnVuY3Rpb24gbm9ybWFsaXplKGZ1bGxOYW1lKSB7CisgICAgICByZXR1cm4gdGhpcy5f
bm9ybWFsaXplQ2FjaGVbZnVsbE5hbWVdIHx8ICh0aGlzLl9ub3JtYWxpemVDYWNoZVtmdWxsTmFt
ZV0gPSB0aGlzLl9ub3JtYWxpemUoZnVsbE5hbWUpKTsKKyAgICB9LAorCisgICAgX25vcm1hbGl6
ZTogZnVuY3Rpb24gX25vcm1hbGl6ZShmdWxsTmFtZSkgeworICAgICAgLy8gQSkgQ29udmVydCB1
bmRlcnNjb3JlcyB0byBkYXNoZXMKKyAgICAgIC8vIEIpIENvbnZlcnQgY2FtZWxDYXNlIHRvIGRh
c2gtY2FzZSwgZXhjZXB0IGZvciBoZWxwZXJzIHdoZXJlIHdlIHdhbnQgdG8gYXZvaWQgc2hhZG93
aW5nIGNhbWVsQ2FzZSBleHByZXNzaW9ucworICAgICAgLy8gQykgcmVwbGFjZSBgLmAgd2l0aCBg
L2AgaW4gb3JkZXIgdG8gbWFrZSBuZXN0ZWQgY29udHJvbGxlcnMgd29yayBpbiB0aGUgZm9sbG93
aW5nIGNhc2VzCisgICAgICAvLyAgICAgIDEuIGBuZWVkczogWydwb3N0cy9wb3N0J11gCisgICAg
ICAvLyAgICAgIDIuIGB7e3JlbmRlciAicG9zdHMvcG9zdCJ9fWAKKyAgICAgIC8vICAgICAgMy4g
YHRoaXMucmVuZGVyKCdwb3N0cy9wb3N0JylgIGZyb20gUm91dGUKKworICAgICAgdmFyIHNwbGl0
ID0gZnVsbE5hbWUuc3BsaXQoJzonKTsKKyAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7Cisg
ICAgICAgIGlmIChzcGxpdFswXSA9PT0gJ2hlbHBlcicpIHsKKyAgICAgICAgICByZXR1cm4gc3Bs
aXRbMF0gKyAnOicgKyBzcGxpdFsxXS5yZXBsYWNlKC9fL2csICctJyk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgcmV0dXJuIHNwbGl0WzBdICsgJzonICsgZGFzaGVyaXplKHNwbGl0WzFd
LnJlcGxhY2UoL1wuL2csICcvJykpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAg
ICByZXR1cm4gZnVsbE5hbWU7CisgICAgICB9CisgICAgfSwKKworICAgIHBsdXJhbGl6ZTogZnVu
Y3Rpb24gcGx1cmFsaXplKHR5cGUpIHsKKyAgICAgIHJldHVybiB0aGlzLnBsdXJhbGl6ZWRUeXBl
c1t0eXBlXSB8fCAodGhpcy5wbHVyYWxpemVkVHlwZXNbdHlwZV0gPSB0eXBlICsgJ3MnKTsKKyAg
ICB9LAorCisgICAgcG9kQmFzZWRMb29rdXBXaXRoUHJlZml4OiBmdW5jdGlvbiBwb2RCYXNlZExv
b2t1cFdpdGhQcmVmaXgocG9kUHJlZml4LCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgZnVsbE5h
bWVXaXRob3V0VHlwZSA9IHBhcnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZTsKKworICAgICAg
aWYgKHBhcnNlZE5hbWUudHlwZSA9PT0gJ3RlbXBsYXRlJykgeworICAgICAgICBmdWxsTmFtZVdp
dGhvdXRUeXBlID0gZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9eY29tcG9uZW50c1wvLywg
JycpOworICAgICAgfQorCisgICAgICByZXR1cm4gcG9kUHJlZml4ICsgJy8nICsgZnVsbE5hbWVX
aXRob3V0VHlwZSArICcvJyArIHBhcnNlZE5hbWUudHlwZTsKKyAgICB9LAorCisgICAgcG9kQmFz
ZWRNb2R1bGVOYW1lOiBmdW5jdGlvbiBwb2RCYXNlZE1vZHVsZU5hbWUocGFyc2VkTmFtZSkgewor
ICAgICAgdmFyIHBvZFByZWZpeCA9IHRoaXMubmFtZXNwYWNlLnBvZE1vZHVsZVByZWZpeCB8fCB0
aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7CisKKyAgICAgIHJldHVybiB0aGlzLnBvZEJhc2Vk
TG9va3VwV2l0aFByZWZpeChwb2RQcmVmaXgsIHBhcnNlZE5hbWUpOworICAgIH0sCisKKyAgICBw
b2RCYXNlZENvbXBvbmVudHNJblN1YmRpcjogZnVuY3Rpb24gcG9kQmFzZWRDb21wb25lbnRzSW5T
dWJkaXIocGFyc2VkTmFtZSkgeworICAgICAgdmFyIHBvZFByZWZpeCA9IHRoaXMubmFtZXNwYWNl
LnBvZE1vZHVsZVByZWZpeCB8fCB0aGlzLm5hbWVzcGFjZS5tb2R1bGVQcmVmaXg7CisgICAgICBw
b2RQcmVmaXggPSBwb2RQcmVmaXggKyAnL2NvbXBvbmVudHMnOworCisgICAgICBpZiAocGFyc2Vk
TmFtZS50eXBlID09PSAnY29tcG9uZW50JyB8fCBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5
cGUubWF0Y2goL15jb21wb25lbnRzLykpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucG9kQmFzZWRM
b29rdXBXaXRoUHJlZml4KHBvZFByZWZpeCwgcGFyc2VkTmFtZSk7CisgICAgICB9CisgICAgfSwK
KworICAgIHJlc29sdmVFbmdpbmU6IGZ1bmN0aW9uIHJlc29sdmVFbmdpbmUocGFyc2VkTmFtZSkg
eworICAgICAgdmFyIGVuZ2luZU5hbWUgPSBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5cGU7
CisgICAgICB2YXIgZW5naW5lTW9kdWxlID0gZW5naW5lTmFtZSArICcvZW5naW5lJzsKKworICAg
ICAgaWYgKHRoaXMuX21vZHVsZVJlZ2lzdHJ5LmhhcyhlbmdpbmVNb2R1bGUpKSB7CisgICAgICAg
IHJldHVybiB0aGlzLl9leHRyYWN0RGVmYXVsdEV4cG9ydChlbmdpbmVNb2R1bGUpOworICAgICAg
fQorICAgIH0sCisKKyAgICByZXNvbHZlUm91dGVNYXA6IGZ1bmN0aW9uIHJlc29sdmVSb3V0ZU1h
cChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgZW5naW5lTmFtZSA9IHBhcnNlZE5hbWUuZnVsbE5h
bWVXaXRob3V0VHlwZTsKKyAgICAgIHZhciBlbmdpbmVSb3V0ZXNNb2R1bGUgPSBlbmdpbmVOYW1l
ICsgJy9yb3V0ZXMnOworCisgICAgICBpZiAodGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKGVuZ2lu
ZVJvdXRlc01vZHVsZSkpIHsKKyAgICAgICAgdmFyIHJvdXRlTWFwID0gdGhpcy5fZXh0cmFjdERl
ZmF1bHRFeHBvcnQoZW5naW5lUm91dGVzTW9kdWxlKTsKKworICAgICAgICBfZW1iZXJbJ2RlZmF1
bHQnXS5hc3NlcnQoJ1RoZSByb3V0ZSBtYXAgZm9yICcgKyBlbmdpbmVOYW1lICsgJyBzaG91bGQg
YmUgd3JhcHBlZCBieSBcJ2J1aWxkUm91dGVzXCcgYmVmb3JlIGV4cG9ydGluZy4nLCByb3V0ZU1h
cC5pc1JvdXRlTWFwKTsKKworICAgICAgICByZXR1cm4gcm91dGVNYXA7CisgICAgICB9CisgICAg
fSwKKworICAgIG1haW5Nb2R1bGVOYW1lOiBmdW5jdGlvbiBtYWluTW9kdWxlTmFtZShwYXJzZWRO
YW1lKSB7CisgICAgICAvLyBpZiByb3V0ZXI6bWFpbiBvciBhZGFwdGVyOm1haW4gbG9vayBmb3Ig
YSBtb2R1bGUgd2l0aCBqdXN0IHRoZSB0eXBlIGZpcnN0CisgICAgICB2YXIgdG1wTW9kdWxlTmFt
ZSA9IHBhcnNlZE5hbWUucHJlZml4ICsgJy8nICsgcGFyc2VkTmFtZS50eXBlOworCisgICAgICBp
ZiAocGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlID09PSAnbWFpbicpIHsKKyAgICAgICAg
cmV0dXJuIHRtcE1vZHVsZU5hbWU7CisgICAgICB9CisgICAgfSwKKworICAgIGRlZmF1bHRNb2R1
bGVOYW1lOiBmdW5jdGlvbiBkZWZhdWx0TW9kdWxlTmFtZShwYXJzZWROYW1lKSB7CisgICAgICBy
ZXR1cm4gcGFyc2VkTmFtZS5wcmVmaXggKyAnLycgKyB0aGlzLnBsdXJhbGl6ZShwYXJzZWROYW1l
LnR5cGUpICsgJy8nICsgcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlOworICAgIH0sCisK
KyAgICBwcmVmaXg6IGZ1bmN0aW9uIHByZWZpeChwYXJzZWROYW1lKSB7CisgICAgICB2YXIgdG1w
UHJlZml4ID0gdGhpcy5uYW1lc3BhY2UubW9kdWxlUHJlZml4OworCisgICAgICBpZiAodGhpcy5u
YW1lc3BhY2VbcGFyc2VkTmFtZS50eXBlICsgJ1ByZWZpeCddKSB7CisgICAgICAgIHRtcFByZWZp
eCA9IHRoaXMubmFtZXNwYWNlW3BhcnNlZE5hbWUudHlwZSArICdQcmVmaXgnXTsKKyAgICAgIH0K
KworICAgICAgcmV0dXJuIHRtcFByZWZpeDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICBBIGxp
c3Rpbmcgb2YgZnVuY3Rpb25zIHRvIHRlc3QgZm9yIG1vZHVsZU5hbWUncyBiYXNlZCBvbiB0aGUg
cHJvdmlkZWQKKyAgICAgYHBhcnNlZE5hbWVgLiBUaGlzIGFsbG93cyBlYXN5IGN1c3RvbWl6YXRp
b24gb2YgYWRkaXRpb25hbCBtb2R1bGUgYmFzZWQKKyAgICAgbG9va3VwIHBhdHRlcm5zLgorICAg
ICAgQHByb3BlcnR5IG1vZHVsZU5hbWVMb29rdXBQYXR0ZXJucworICAgICBAcmV0dXJucyB7RW1i
ZXIuQXJyYXl9CisgICAgICovCisgICAgbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zOiBfZW1iZXJb
J2RlZmF1bHQnXS5jb21wdXRlZChmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4gW3RoaXMucG9k
QmFzZWRNb2R1bGVOYW1lLCB0aGlzLnBvZEJhc2VkQ29tcG9uZW50c0luU3ViZGlyLCB0aGlzLm1h
aW5Nb2R1bGVOYW1lLCB0aGlzLmRlZmF1bHRNb2R1bGVOYW1lXTsKKyAgICB9KSwKKworICAgIGZp
bmRNb2R1bGVOYW1lOiBmdW5jdGlvbiBmaW5kTW9kdWxlTmFtZShwYXJzZWROYW1lLCBsb2dnaW5n
RGlzYWJsZWQpIHsKKyAgICAgIHZhciBtb2R1bGVOYW1lTG9va3VwUGF0dGVybnMgPSB0aGlzLmdl
dCgnbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zJyk7CisgICAgICB2YXIgbW9kdWxlTmFtZTsKKwor
ICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBfbGVuZ3RoID0gbW9kdWxlTmFtZUxvb2t1cFBhdHRl
cm5zLmxlbmd0aDsgaW5kZXggPCBfbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgIHZhciBpdGVt
ID0gbW9kdWxlTmFtZUxvb2t1cFBhdHRlcm5zW2luZGV4XTsKKworICAgICAgICB2YXIgdG1wTW9k
dWxlTmFtZSA9IGl0ZW0uY2FsbCh0aGlzLCBwYXJzZWROYW1lKTsKKworICAgICAgICAvLyBhbGxv
dyB0cmVhdCBhbGwgZGFzaGVkIGFuZCBhbGwgdW5kZXJzY29yZWQgYXMgdGhlIHNhbWUgdGhpbmcK
KyAgICAgICAgLy8gc3VwcG9ydHMgY29tcG9uZW50cyB3aXRoIGRhc2hlcyBhbmQgb3RoZXIgc3R1
ZmYgd2l0aCB1bmRlcnNjb3Jlcy4KKyAgICAgICAgaWYgKHRtcE1vZHVsZU5hbWUpIHsKKyAgICAg
ICAgICB0bXBNb2R1bGVOYW1lID0gdGhpcy5jaG9vc2VNb2R1bGVOYW1lKHRtcE1vZHVsZU5hbWUs
IHBhcnNlZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRtcE1vZHVsZU5hbWUgJiYg
dGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKHRtcE1vZHVsZU5hbWUpKSB7CisgICAgICAgICAgbW9k
dWxlTmFtZSA9IHRtcE1vZHVsZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxvZ2dp
bmdEaXNhYmxlZCkgeworICAgICAgICAgIHRoaXMuX2xvZ0xvb2t1cChtb2R1bGVOYW1lLCBwYXJz
ZWROYW1lLCB0bXBNb2R1bGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2R1bGVO
YW1lKSB7CisgICAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWU7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9LAorCisgICAgY2hvb3NlTW9kdWxlTmFtZTogZnVuY3Rpb24gY2hvb3NlTW9kdWxlTmFt
ZShtb2R1bGVOYW1lLCBwYXJzZWROYW1lKSB7CisgICAgICB2YXIgX3RoaXMgPSB0aGlzOworCisg
ICAgICB2YXIgdW5kZXJzY29yZWRNb2R1bGVOYW1lID0gdW5kZXJzY29yZShtb2R1bGVOYW1lKTsK
KworICAgICAgaWYgKG1vZHVsZU5hbWUgIT09IHVuZGVyc2NvcmVkTW9kdWxlTmFtZSAmJiB0aGlz
Ll9tb2R1bGVSZWdpc3RyeS5oYXMobW9kdWxlTmFtZSkgJiYgdGhpcy5fbW9kdWxlUmVnaXN0cnku
aGFzKHVuZGVyc2NvcmVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJv
cigiQW1iaWd1b3VzIG1vZHVsZSBuYW1lczogYCIgKyBtb2R1bGVOYW1lICsgImAgYW5kIGAiICsg
dW5kZXJzY29yZWRNb2R1bGVOYW1lICsgImAiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoaXMu
X21vZHVsZVJlZ2lzdHJ5Lmhhcyhtb2R1bGVOYW1lKSkgeworICAgICAgICByZXR1cm4gbW9kdWxl
TmFtZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5fbW9kdWxlUmVnaXN0cnkuaGFzKHVuZGVyc2Nv
cmVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVyc2NvcmVkTW9kdWxlTmFtZTsK
KyAgICAgIH0KKyAgICAgIC8vIHdvcmthcm91bmQgZm9yIGRhc2hlcml6ZWQgcGFydGlhbHM6Cisg
ICAgICAvLyBzb21ldGhpbmcvc29tZXRoaW5nLy1zb21ldGhpbmcgPT4gc29tZXRoaW5nL3NvbWV0
aGluZy9fc29tZXRoaW5nCisgICAgICB2YXIgcGFydGlhbGl6ZWRNb2R1bGVOYW1lID0gbW9kdWxl
TmFtZS5yZXBsYWNlKC9cLy0oW15cL10qKSQvLCAnL18kMScpOworCisgICAgICBpZiAodGhpcy5f
bW9kdWxlUmVnaXN0cnkuaGFzKHBhcnRpYWxpemVkTW9kdWxlTmFtZSkpIHsKKyAgICAgICAgX2Vt
YmVyWydkZWZhdWx0J10uZGVwcmVjYXRlKCdNb2R1bGVzIHNob3VsZCBub3QgY29udGFpbiB1bmRl
cnNjb3Jlcy4gJyArICdBdHRlbXB0ZWQgdG8gbG9va3VwICInICsgbW9kdWxlTmFtZSArICciIHdo
aWNoICcgKyAnd2FzIG5vdCBmb3VuZC4gUGxlYXNlIHJlbmFtZSAiJyArIHBhcnRpYWxpemVkTW9k
dWxlTmFtZSArICciICcgKyAndG8gIicgKyBtb2R1bGVOYW1lICsgJyIgaW5zdGVhZC4nLCBmYWxz
ZSwgeyBpZDogJ2VtYmVyLXJlc29sdmVyLnVuZGVyc2NvcmVkLW1vZHVsZXMnLCB1bnRpbDogJzMu
MC4wJyB9KTsKKworICAgICAgICByZXR1cm4gcGFydGlhbGl6ZWRNb2R1bGVOYW1lOworICAgICAg
fQorICAgICAgX2VtYmVyWydkZWZhdWx0J10ucnVuSW5EZWJ1ZyhmdW5jdGlvbiAoKSB7CisgICAg
ICAgIHZhciBpc0NhbWVsQ2FzZUhlbHBlciA9IHBhcnNlZE5hbWUudHlwZSA9PT0gJ2hlbHBlcicg
JiYgISFtb2R1bGVOYW1lLm1hdGNoKC9bYS16XStbQS1aXSsvKTsKKyAgICAgICAgaWYgKGlzQ2Ft
ZWxDYXNlSGVscGVyKSB7CisgICAgICAgICAgX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5h
bWVzID0gX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5hbWVzIHx8IFtdOworICAgICAgICAg
IHZhciBhbHJlYWR5V2FybmVkID0gX3RoaXMuX2NhbWVsQ2FzZUhlbHBlcldhcm5lZE5hbWVzLmlu
ZGV4T2YocGFyc2VkTmFtZS5mdWxsTmFtZSkgPiAtMTsKKyAgICAgICAgICBpZiAoIWFscmVhZHlX
YXJuZWQgJiYgX3RoaXMuX21vZHVsZVJlZ2lzdHJ5LmhhcyhkYXNoZXJpemUobW9kdWxlTmFtZSkp
KSB7CisgICAgICAgICAgICBfdGhpcy5fY2FtZWxDYXNlSGVscGVyV2FybmVkTmFtZXMucHVzaChw
YXJzZWROYW1lLmZ1bGxOYW1lKTsKKyAgICAgICAgICAgIF9lbWJlclsnZGVmYXVsdCddLndhcm4o
J0F0dGVtcHRlZCB0byBsb29rdXAgIicgKyBwYXJzZWROYW1lLmZ1bGxOYW1lICsgJyIgd2hpY2gg
JyArICd3YXMgbm90IGZvdW5kLiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBlbWJlci1yZXNvbHZl
ciwgYSBidWcgd291bGQgaGF2ZSAnICsgJ2NhdXNlZCB0aGUgbW9kdWxlIGF0ICInICsgZGFzaGVy
aXplKG1vZHVsZU5hbWUpICsgJyIgdG8gYmUgJyArICdyZXR1cm5lZCBmb3IgdGhpcyBjYW1lbCBj
YXNlIGhlbHBlciBuYW1lLiBUaGlzIGhhcyBiZWVuIGZpeGVkLiAnICsgJ1VzZSB0aGUgZGFzaGVy
aXplZCBuYW1lIHRvIHJlc29sdmUgdGhlIG1vZHVsZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiAnICsg
J3JldHVybmVkIGluIHByZXZpb3VzIHZlcnNpb25zLicsIGZhbHNlLCB7IGlkOiAnZW1iZXItcmVz
b2x2ZXIuY2FtZWxjYXNlLWhlbHBlci1uYW1lcycsIHVudGlsOiAnMy4wLjAnIH0pOworICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIHVzZWQgYnkgRW1i
ZXIuRGVmYXVsdFJlc29sdmVyLnByb3RvdHlwZS5fbG9nTG9va3VwCisgICAgbG9va3VwRGVzY3Jp
cHRpb246IGZ1bmN0aW9uIGxvb2t1cERlc2NyaXB0aW9uKGZ1bGxOYW1lKSB7CisgICAgICB2YXIg
cGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxOYW1lKTsKKworICAgICAgdmFyIG1vZHVs
ZU5hbWUgPSB0aGlzLmZpbmRNb2R1bGVOYW1lKHBhcnNlZE5hbWUsIHRydWUpOworCisgICAgICBy
ZXR1cm4gbW9kdWxlTmFtZTsKKyAgICB9LAorCisgICAgLy8gb25seSBuZWVkZWQgdW50aWwgMS42
LjAtYmV0YS4yIGNhbiBiZSByZXF1aXJlZAorICAgIF9sb2dMb29rdXA6IGZ1bmN0aW9uIF9sb2dM
b29rdXAoZm91bmQsIHBhcnNlZE5hbWUsIGRlc2NyaXB0aW9uKSB7CisgICAgICBpZiAoIV9lbWJl
clsnZGVmYXVsdCddLkVOVi5MT0dfTU9EVUxFX1JFU09MVkVSICYmICFwYXJzZWROYW1lLnJvb3Qu
TE9HX1JFU09MVkVSKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIHN5
bWJvbCwgcGFkZGluZzsKKworICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIHN5bWJvbCA9ICdb
4pyTXSc7CisgICAgICB9IGVsc2UgeworICAgICAgICBzeW1ib2wgPSAnWyBdJzsKKyAgICAgIH0K
KworICAgICAgaWYgKHBhcnNlZE5hbWUuZnVsbE5hbWUubGVuZ3RoID4gNjApIHsKKyAgICAgICAg
cGFkZGluZyA9ICcuJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhZGRpbmcgPSBuZXcgQXJy
YXkoNjAgLSBwYXJzZWROYW1lLmZ1bGxOYW1lLmxlbmd0aCkuam9pbignLicpOworICAgICAgfQor
CisgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7CisgICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5s
b29rdXBEZXNjcmlwdGlvbihwYXJzZWROYW1lKTsKKyAgICAgIH0KKworICAgICAgX2VtYmVyWydk
ZWZhdWx0J10uTG9nZ2VyLmluZm8oc3ltYm9sLCBwYXJzZWROYW1lLmZ1bGxOYW1lLCBwYWRkaW5n
LCBkZXNjcmlwdGlvbik7CisgICAgfSwKKworICAgIGtub3duRm9yVHlwZTogZnVuY3Rpb24ga25v
d25Gb3JUeXBlKHR5cGUpIHsKKyAgICAgIHZhciBtb2R1bGVLZXlzID0gdGhpcy5fbW9kdWxlUmVn
aXN0cnkubW9kdWxlTmFtZXMoKTsKKworICAgICAgdmFyIGl0ZW1zID0gKDAsIF9lbWJlclJlc29s
dmVyVXRpbHNNYWtlRGljdGlvbmFyeVsnZGVmYXVsdCddKSgpOworICAgICAgZm9yICh2YXIgaW5k
ZXggPSAwLCBsZW5ndGggPSBtb2R1bGVLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4
KyspIHsKKyAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtb2R1bGVLZXlzW2luZGV4XTsKKyAgICAg
ICAgdmFyIGZ1bGxuYW1lID0gdGhpcy50cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKHR5cGUs
IG1vZHVsZU5hbWUpOworCisgICAgICAgIGlmIChmdWxsbmFtZSkgeworICAgICAgICAgIGl0ZW1z
W2Z1bGxuYW1lXSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGl0
ZW1zOworICAgIH0sCisKKyAgICB0cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lOiBmdW5jdGlv
biB0cmFuc2xhdGVUb0NvbnRhaW5lckZ1bGxuYW1lKHR5cGUsIG1vZHVsZU5hbWUpIHsKKyAgICAg
IHZhciBwcmVmaXggPSB0aGlzLnByZWZpeCh7IHR5cGU6IHR5cGUgfSk7CisKKyAgICAgIC8vIE5v
dGU6IHVzaW5nIHN0cmluZyBtYW5pcHVsYXRpb24gaGVyZSByYXRoZXIgdGhhbiByZWdleGVzIGZv
ciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAvLyBwb2QgbW9kdWxlcworICAgICAgLy8gJ14n
ICsgcHJlZml4ICsgJy8oLispLycgKyB0eXBlICsgJyQnCisgICAgICB2YXIgcG9kUHJlZml4ID0g
cHJlZml4ICsgJy8nOworICAgICAgdmFyIHBvZFN1ZmZpeCA9ICcvJyArIHR5cGU7CisgICAgICB2
YXIgc3RhcnQgPSBtb2R1bGVOYW1lLmluZGV4T2YocG9kUHJlZml4KTsKKyAgICAgIHZhciBlbmQg
PSBtb2R1bGVOYW1lLmluZGV4T2YocG9kU3VmZml4KTsKKworICAgICAgaWYgKHN0YXJ0ID09PSAw
ICYmIGVuZCA9PT0gbW9kdWxlTmFtZS5sZW5ndGggLSBwb2RTdWZmaXgubGVuZ3RoICYmIG1vZHVs
ZU5hbWUubGVuZ3RoID4gcG9kUHJlZml4Lmxlbmd0aCArIHBvZFN1ZmZpeC5sZW5ndGgpIHsKKyAg
ICAgICAgcmV0dXJuIHR5cGUgKyAnOicgKyBtb2R1bGVOYW1lLnNsaWNlKHN0YXJ0ICsgcG9kUHJl
Zml4Lmxlbmd0aCwgZW5kKTsKKyAgICAgIH0KKworICAgICAgLy8gbm9uLXBvZCBtb2R1bGVzCisg
ICAgICAvLyAnXicgKyBwcmVmaXggKyAnLycgKyBwbHVyYWxpemVkVHlwZSArICcvKC4rKSQnCisg
ICAgICB2YXIgcGx1cmFsaXplZFR5cGUgPSB0aGlzLnBsdXJhbGl6ZSh0eXBlKTsKKyAgICAgIHZh
ciBub25Qb2RQcmVmaXggPSBwcmVmaXggKyAnLycgKyBwbHVyYWxpemVkVHlwZSArICcvJzsKKwor
ICAgICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZihub25Qb2RQcmVmaXgpID09PSAwICYmIG1vZHVs
ZU5hbWUubGVuZ3RoID4gbm9uUG9kUHJlZml4Lmxlbmd0aCkgeworICAgICAgICByZXR1cm4gdHlw
ZSArICc6JyArIG1vZHVsZU5hbWUuc2xpY2Uobm9uUG9kUHJlZml4Lmxlbmd0aCk7CisgICAgICB9
CisgICAgfSwKKworICAgIF9leHRyYWN0RGVmYXVsdEV4cG9ydDogZnVuY3Rpb24gX2V4dHJhY3RE
ZWZhdWx0RXhwb3J0KG5vcm1hbGl6ZWRNb2R1bGVOYW1lKSB7CisgICAgICB2YXIgbW9kdWxlID0g
cmVxdWlyZShub3JtYWxpemVkTW9kdWxlTmFtZSwgbnVsbCwgbnVsbCwgdHJ1ZSAvKiBmb3JjZSBz
eW5jICovKTsKKworICAgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGVbJ2RlZmF1bHQnXSkgeworICAg
ICAgICBtb2R1bGUgPSBtb2R1bGVbJ2RlZmF1bHQnXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJu
IG1vZHVsZTsKKyAgICB9CisgIH0pOworCisgIFJlc29sdmVyLnJlb3BlbkNsYXNzKHsKKyAgICBt
b2R1bGVCYXNlZFJlc29sdmVyOiB0cnVlCisgIH0pOworCisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9
IFJlc29sdmVyOworfSk7CitkZWZpbmUoJ2VtYmVyLXJlc29sdmVyL3V0aWxzL2NsYXNzLWZhY3Rv
cnknLCBbJ2V4cG9ydHMnXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsKKyAgJ3VzZSBzdHJpY3QnOwor
CisgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNsYXNzRmFjdG9yeTsKKworICBmdW5jdGlvbiBjbGFz
c0ZhY3Rvcnkoa2xhc3MpIHsKKyAgICByZXR1cm4geworICAgICAgY3JlYXRlOiBmdW5jdGlvbiBj
cmVhdGUoaW5qZWN0aW9ucykgeworICAgICAgICBpZiAodHlwZW9mIGtsYXNzLmV4dGVuZCA9PT0g
J2Z1bmN0aW9uJykgeworICAgICAgICAgIHJldHVybiBrbGFzcy5leHRlbmQoaW5qZWN0aW9ucyk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGtsYXNzOworICAgICAgICB9Cisg
ICAgICB9CisgICAgfTsKKyAgfQorfSk7CitkZWZpbmUoImVtYmVyLXJlc29sdmVyL3V0aWxzL2Ny
ZWF0ZSIsIFsiZXhwb3J0cyIsICJlbWJlciJdLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7
CisgICJ1c2Ugc3RyaWN0IjsKKworICB2YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBfZW1i
ZXJbImRlZmF1bHQiXS5jcmVhdGU7CisgIGlmICghKGNyZWF0ZSAmJiAhY3JlYXRlKG51bGwpLmhh
c093blByb3BlcnR5KSkgeworICAgIHRocm93IG5ldyBFcnJvcigiVGhpcyBicm93c2VyIGRvZXMg
bm90IHN1cHBvcnQgT2JqZWN0LmNyZWF0ZShudWxsKSwgcGxlYXNlIHBvbHlmaWwgd2l0aCBlczUt
c2hhbTogaHR0cDovL2dpdC5pby95QlUycmciKTsKKyAgfQorCisgIGV4cG9ydHNbImRlZmF1bHQi
XSA9IGNyZWF0ZTsKK30pOworZGVmaW5lKCdlbWJlci1yZXNvbHZlci91dGlscy9tYWtlLWRpY3Rp
b25hcnknLCBbJ2V4cG9ydHMnLCAnZW1iZXItcmVzb2x2ZXIvdXRpbHMvY3JlYXRlJ10sIGZ1bmN0
aW9uIChleHBvcnRzLCBfZW1iZXJSZXNvbHZlclV0aWxzQ3JlYXRlKSB7CisgICd1c2Ugc3RyaWN0
JzsKKworICBleHBvcnRzWydkZWZhdWx0J10gPSBtYWtlRGljdGlvbmFyeTsKKworICBmdW5jdGlv
biBtYWtlRGljdGlvbmFyeSgpIHsKKyAgICB2YXIgY2FjaGUgPSAoMCwgX2VtYmVyUmVzb2x2ZXJV
dGlsc0NyZWF0ZVsnZGVmYXVsdCddKShudWxsKTsKKyAgICBjYWNoZVsnX2RpY3QnXSA9IG51bGw7
CisgICAgZGVsZXRlIGNhY2hlWydfZGljdCddOworICAgIHJldHVybiBjYWNoZTsKKyAgfQorfSk7
CitkZWZpbmUoJ2VtYmVyLXJlc29sdmVyL3V0aWxzL21vZHVsZS1yZWdpc3RyeScsIFsnZXhwb3J0
cycsICdlbWJlciddLCBmdW5jdGlvbiAoZXhwb3J0cywgX2VtYmVyKSB7CisgIC8qZ2xvYmFscyBy
ZXF1aXJlanMsIHJlcXVpcmUgKi8KKworICAndXNlIHN0cmljdCc7CisKKyAgaWYgKHR5cGVvZiBy
ZXF1aXJlanMuZW50cmllcyA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICByZXF1aXJlanMuZW50cmll
cyA9IHJlcXVpcmVqcy5fZWFrX3NlZW47CisgIH0KKworICBmdW5jdGlvbiBNb2R1bGVSZWdpc3Ry
eShlbnRyaWVzKSB7CisgICAgdGhpcy5fZW50cmllcyA9IGVudHJpZXMgfHwgcmVxdWlyZWpzLmVu
dHJpZXM7CisgIH0KKworICBNb2R1bGVSZWdpc3RyeS5wcm90b3R5cGUubW9kdWxlTmFtZXMgPSBm
dW5jdGlvbiBNb2R1bGVSZWdpc3RyeV9tb2R1bGVOYW1lcygpIHsKKyAgICByZXR1cm4gKE9iamVj
dC5rZXlzIHx8IF9lbWJlclsnZGVmYXVsdCddLmtleXMpKHRoaXMuX2VudHJpZXMpOworICB9Owor
CisgIE1vZHVsZVJlZ2lzdHJ5LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBNb2R1bGVSZWdpc3Ry
eV9oYXMobW9kdWxlTmFtZSkgeworICAgIHJldHVybiBtb2R1bGVOYW1lIGluIHRoaXMuX2VudHJp
ZXM7CisgIH07CisKKyAgTW9kdWxlUmVnaXN0cnkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIE1v
ZHVsZVJlZ2lzdHJ5X2dldChtb2R1bGVOYW1lKSB7CisgICAgdmFyIGV4cG9ydE5hbWUgPSBhcmd1
bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnZGVmYXVs
dCcgOiBhcmd1bWVudHNbMV07CisKKyAgICB2YXIgbW9kdWxlID0gcmVxdWlyZShtb2R1bGVOYW1l
KTsKKyAgICByZXR1cm4gbW9kdWxlICYmIG1vZHVsZVtleHBvcnROYW1lXTsKKyAgfTsKKworICBl
eHBvcnRzWydkZWZhdWx0J10gPSBNb2R1bGVSZWdpc3RyeTsKK30pOworOy8qIGpzaGludCBpZ25v
cmU6c3RhcnQgKi8KKworCisKKy8qIGpzaGludCBpZ25vcmU6ZW5kICovCisvLyMgc291cmNlTWFw
cGluZ1VSTD12ZW5kb3IubWFwCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
Lmpzb24gYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGU5OWU0OTgyMmFmMDViNjRlOTZhMTMwZTk5ODcxYjQwOTk4OTA4Y2YuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9ib3dlci5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotewotICAi
bmFtZSI6ICJ0b2RvbXZjLWVtYmVyanMiLAotICAidmVyc2lvbiI6ICIwLjAuMCIsCi0gICJkZXBl
bmRlbmNpZXMiOiB7Ci0gICAgInRvZG9tdmMtY29tbW9uIjogIn4wLjEuNCIsCi0gICAgImpxdWVy
eSI6ICJ+Mi4xLjAiLAotICAgICJoYW5kbGViYXJzIjogIn4xLjMuMCIsCi0gICAgImVtYmVyIjog
In4xLjMuMSIsCi0gICAgImVtYmVyLWRhdGEiOiAiMS4wLjAtYmV0YS42IiwKLSAgICAiZW1iZXIt
bG9jYWxzdG9yYWdlLWFkYXB0ZXIiOiAibGF0ZXN0IgotICB9Ci19CmRpZmYgLS1naXQgYS9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXItZGF0YS9lbWJlci1kYXRhLmpz
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWRhdGEvZW1iZXIt
ZGF0YS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYTlkNzc5NWJhZGY2NDAy
ZDAzNmViYjU5MDkzMTBkNGViMzZjMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvZW1iZXIt
ZGF0YS9lbWJlci1kYXRhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MjAgKzAsMCBAQAotLyoh
Ci0gKiBAb3ZlcnZpZXcgIEVtYmVyIERhdGEKLSAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IDIwMTEt
MjAxNCBUaWxkZSBJbmMuIGFuZCBjb250cmlidXRvcnMuCi0gKiAgICAgICAgICAgIFBvcnRpb25z
IENvcHlyaWdodCAyMDExIExpdmluZ1NvY2lhbCBJbmMuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2Vk
IHVuZGVyIE1JVCBsaWNlbnNlIChzZWUgbGljZW5zZS5qcykKLSAqIEB2ZXJzaW9uICAgMS4wLjAt
YmV0YS42Ci0gKi8KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZGVmaW5lLCByZXF1aXJlTW9kdWxl
OwotCi0oZnVuY3Rpb24oKSB7Ci0gIHZhciByZWdpc3RyeSA9IHt9LCBzZWVuID0ge307Ci0KLSAg
ZGVmaW5lID0gZnVuY3Rpb24obmFtZSwgZGVwcywgY2FsbGJhY2spIHsKLSAgICByZWdpc3RyeVtu
YW1lXSA9IHsgZGVwczogZGVwcywgY2FsbGJhY2s6IGNhbGxiYWNrIH07Ci0gIH07Ci0KLSAgcmVx
dWlyZU1vZHVsZSA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICBpZiAoc2VlbltuYW1lXSkgeyByZXR1
cm4gc2VlbltuYW1lXTsgfQotICAgIHNlZW5bbmFtZV0gPSB7fTsKLQotICAgIHZhciBtb2QsIGRl
cHMsIGNhbGxiYWNrLCByZWlmaWVkICwgZXhwb3J0czsKLQotICAgIG1vZCA9IHJlZ2lzdHJ5W25h
bWVdOwotCi0gICAgaWYgKCFtb2QpIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcigiTW9kdWxlICci
ICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKLSAgICB9Ci0KLSAgICBkZXBzID0gbW9kLmRlcHM7
Ci0gICAgY2FsbGJhY2sgPSBtb2QuY2FsbGJhY2s7Ci0gICAgcmVpZmllZCA9IFtdOwotICAgIGV4
cG9ydHM7Ci0KLSAgICBmb3IgKHZhciBpPTAsIGw9ZGVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICBpZiAoZGVwc1tpXSA9PT0gJ2V4cG9ydHMnKSB7Ci0gICAgICAgIHJlaWZpZWQucHVzaChl
eHBvcnRzID0ge30pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVpZmllZC5wdXNoKHJlcXVp
cmVNb2R1bGUoZGVwc1tpXSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHZhciB2YWx1ZSA9IGNh
bGxiYWNrLmFwcGx5KHRoaXMsIHJlaWZpZWQpOwotICAgIHJldHVybiBzZWVuW25hbWVdID0gZXhw
b3J0cyB8fCB2YWx1ZTsKLSAgfTsKLX0pKCk7Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVs
ZSBlbWJlci1kYXRhCi0qLwotCi0vKioKLSAgQWxsIEVtYmVyIERhdGEgbWV0aG9kcyBhbmQgZnVu
Y3Rpb25zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiB0aGlzIG5hbWVzcGFjZS4KLQotICBAY2xhc3Mg
RFMKLSAgQHN0YXRpYwotKi8KLXZhciBEUzsKLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIERT
KSB7Ci0gIC8qKgotICAgIEBwcm9wZXJ0eSBWRVJTSU9OCi0gICAgQHR5cGUgU3RyaW5nCi0gICAg
QGRlZmF1bHQgJzEuMC4wLWJldGEuNicKLSAgICBAc3RhdGljCi0gICovCi0gIERTID0gRW1iZXIu
TmFtZXNwYWNlLmNyZWF0ZSh7Ci0gICAgVkVSU0lPTjogJzEuMC4wLWJldGEuNicKLSAgfSk7Ci0K
LSAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93KSB7Ci0gICAgd2luZG93LkRTID0g
RFM7Ci0gIH0KLQotICBpZiAoRW1iZXIubGlicmFyaWVzKSB7Ci0gICAgRW1iZXIubGlicmFyaWVz
LnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyIERhdGEnLCBEUy5WRVJTSU9OKTsKLSAgfQotfQot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIFRoaXMgaXMgdXNlZCBpbnRlcm5h
bGx5IHRvIGVuYWJsZSBkZXByZWNhdGlvbiBvZiBjb250YWluZXIgcGF0aHMgYW5kIHByb3ZpZGUK
LSAgYSBkZWNlbnQgbWVzc2FnZSB0byB0aGUgdXNlciBpbmRpY2F0aW5nIGhvdyB0byBmaXggdGhl
IGlzc3VlLgotCi0gIEBjbGFzcyBDb250YWluZXJQcm94eQotICBAbmFtZXNwYWNlIERTCi0gIEBw
cml2YXRlCi0qLwotdmFyIENvbnRhaW5lclByb3h5ID0gZnVuY3Rpb24gKGNvbnRhaW5lcil7Ci0g
IHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotfTsKLQotQ29udGFpbmVyUHJveHkucHJvdG90
eXBlLmFsaWFzZWRGYWN0b3J5ID0gZnVuY3Rpb24ocGF0aCwgcHJlTG9va3VwKSB7Ci0gIHZhciBf
dGhpcyA9IHRoaXM7Ci0KLSAgcmV0dXJuIHtjcmVhdGU6IGZ1bmN0aW9uKCl7IAotICAgIGlmIChw
cmVMb29rdXApIHsgcHJlTG9va3VwKCk7IH0KLQotICAgIHJldHVybiBfdGhpcy5jb250YWluZXIu
bG9va3VwKHBhdGgpOyAKLSAgfX07Ci19OwotCi1Db250YWluZXJQcm94eS5wcm90b3R5cGUucmVn
aXN0ZXJBbGlhcyA9IGZ1bmN0aW9uKHNvdXJjZSwgZGVzdCwgcHJlTG9va3VwKSB7Ci0gIHZhciBm
YWN0b3J5ID0gdGhpcy5hbGlhc2VkRmFjdG9yeShkZXN0LCBwcmVMb29rdXApOwotCi0gIHJldHVy
biB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcihzb3VyY2UsIGZhY3RvcnkpOwotfTsKLQotQ29udGFp
bmVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyRGVwcmVjYXRpb24gPSBmdW5jdGlvbihkZXByZWNh
dGVkLCB2YWxpZCkgewotICB2YXIgcHJlTG9va3VwQ2FsbGJhY2sgPSBmdW5jdGlvbigpewotICAg
IEVtYmVyLmRlcHJlY2F0ZSgiWW91IHRyaWVkIHRvIGxvb2sgdXAgJyIgKyBkZXByZWNhdGVkICsg
IicsICIgKwotICAgICAgICAgICAgICAgICAgICAiYnV0IHRoaXMgaGFzIGJlZW4gZGVwcmVjYXRl
ZCBpbiBmYXZvciBvZiAnIiArIHZhbGlkICsgIicuIiwgZmFsc2UpOwotICB9OwotCi0gIHJldHVy
biB0aGlzLnJlZ2lzdGVyQWxpYXMoZGVwcmVjYXRlZCwgdmFsaWQsIHByZUxvb2t1cENhbGxiYWNr
KTsKLX07Ci0KLUNvbnRhaW5lclByb3h5LnByb3RvdHlwZS5yZWdpc3RlckRlcHJlY2F0aW9ucyA9
IGZ1bmN0aW9uKHByb3h5UGFpcnMpIHsKLSAgZm9yICh2YXIgaSA9IHByb3h5UGFpcnMubGVuZ3Ro
OyBpID4gMDsgaS0tKSB7Ci0gICAgdmFyIHByb3h5UGFpciA9IHByb3h5UGFpcnNbaSAtIDFdLAot
ICAgICAgICBkZXByZWNhdGVkID0gcHJveHlQYWlyWydkZXByZWNhdGVkJ10sCi0gICAgICAgIHZh
bGlkID0gcHJveHlQYWlyWyd2YWxpZCddOwotCi0gICAgdGhpcy5yZWdpc3RlckRlcHJlY2F0aW9u
KGRlcHJlY2F0ZWQsIHZhbGlkKTsKLSAgfQotfTsKLQotRFMuQ29udGFpbmVyUHJveHkgPSBDb250
YWluZXJQcm94eTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIuaXNOb25lOwotCi0vLyBTaW1w
bGUgZGlzcGF0Y2hlciB0byBzdXBwb3J0IG92ZXJyaWRpbmcgdGhlIGFsaWFzZWQKLS8vIG1ldGhv
ZCBpbiBzdWJjbGFzc2VzLgotZnVuY3Rpb24gYWxpYXNNZXRob2QobWV0aG9kTmFtZSkgewotICBy
ZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKLSAgfTsKLX0KLQotLyoqCi0gIEluIEVtYmVyIERhdGEgYSBTZXJpYWxp
emVyIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICByZWNvcmRzIHdoZW4g
dGhleSBhcmUgdHJhbnNmZXJyZWQgaW4gYW5kIG91dCBvZiBhbiBleHRlcm5hbCBzb3VyY2UuCi0g
IFRoaXMgcHJvY2VzcyBpbnZvbHZlcyBub3JtYWxpemluZyBwcm9wZXJ0eSBuYW1lcywgdHJhbnNm
b3JtaW5nCi0gIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIHNlcmlhbGl6aW5nIHJlbGF0aW9uc2hpcHMu
Ci0KLSAgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgRW1iZXIgRGF0YSByZWNvbW1lbmRzIHlvdSB1
c2UgdGhlCi0gIFtSRVNUU2VyaWFsaXplcl0oRFMuUkVTVFNlcmlhbGl6ZXIuaHRtbCkgb3Igb25l
IG9mIGl0cyBzdWJjbGFzc2VzLgotCi0gIGBKU09OU2VyaWFsaXplcmAgaXMgdXNlZnVsIGZvciBz
aW1wbGVyIG9yIGxlZ2FjeSBiYWNrZW5kcyB0aGF0IG1heQotICBub3Qgc3VwcG9ydCB0aGUgaHR0
cDovL2pzb25hcGkub3JnLyBzcGVjLgotCi0gIEBjbGFzcyBKU09OU2VyaWFsaXplcgotICBAbmFt
ZXNwYWNlIERTCi0qLwotRFMuSlNPTlNlcmlhbGl6ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK
LSAgLyoqCi0gICAgVGhlIHByaW1hcnlLZXkgaXMgdXNlZCB3aGVuIHNlcmlhbGl6aW5nIGFuZCBk
ZXNlcmlhbGl6aW5nCi0gICAgZGF0YS4gRW1iZXIgRGF0YSBhbHdheXMgdXNlcyB0aGUgYGlkYCBw
cm9wZXJ0eSB0byBzdG9yZSB0aGUgaWQgb2YKLSAgICB0aGUgcmVjb3JkLiBUaGUgZXh0ZXJuYWwg
c291cmNlIG1heSBub3QgYWx3YXlzIGZvbGxvdyB0aGlzCi0gICAgY29udmVudGlvbi4gSW4gdGhl
c2UgY2FzZXMgaXQgaXMgdXNlZnVsIHRvIG92ZXJyaWRlIHRoZQotICAgIHByaW1hcnlLZXkgcHJv
cGVydHkgdG8gbWF0Y2ggdGhlIHByaW1hcnlLZXkgb2YgeW91ciBleHRlcm5hbAotICAgIHN0b3Jl
LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlv
blNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgcHJpbWFyeUtl
eTogJ19pZCcKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBwcmltYXJ5S2V5Ci0g
ICAgQHR5cGUge1N0cmluZ30KLSAgICBAZGVmYXVsdCAnaWQnCi0gICovCi0gIHByaW1hcnlLZXk6
ICdpZCcsCi0KLSAgLyoqCi0gICBHaXZlbiBhIHN1YmNsYXNzIG9mIGBEUy5Nb2RlbGAgYW5kIGEg
SlNPTiBvYmplY3QgdGhpcyBtZXRob2Qgd2lsbAotICAgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggYXR0
cmlidXRlIG9mIHRoZSBgRFMuTW9kZWxgIGFuZCBpbnZva2UgdGhlCi0gICBgRFMuVHJhbnNmb3Jt
I2Rlc2VyaWFsaXplYCBtZXRob2Qgb24gdGhlIG1hdGNoaW5nIHByb3BlcnR5IG9mIHRoZQotICAg
SlNPTiBvYmplY3QuICBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGFmdGVyIHRoZQot
ICAgc2VyaWFsaXplcidzIGBub3JtYWxpemVgIG1ldGhvZC4KLQotICAgQG1ldGhvZCBhcHBseVRy
YW5zZm9ybXMKLSAgIEBwcml2YXRlCi0gICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0
eXBlCi0gICBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSB0byB0cmFuc2Zvcm0KLSAgIEBy
ZXR1cm4ge09iamVjdH0gZGF0YSBUaGUgdHJhbnNmb3JtZWQgZGF0YSBvYmplY3QKLSAgKi8KLSAg
YXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7Ci0gICAgdHlwZS5lYWNoVHJh
bnNmb3JtZWRBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5LCB0eXBlKSB7Ci0gICAgICB2YXIgdHJhbnNm
b3JtID0gdGhpcy50cmFuc2Zvcm1Gb3IodHlwZSk7Ci0gICAgICBkYXRhW2tleV0gPSB0cmFuc2Zv
cm0uZGVzZXJpYWxpemUoZGF0YVtrZXldKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBk
YXRhOwotICB9LAotCi0gIC8qKgotICAgIE5vcm1hbGl6ZXMgYSBwYXJ0IG9mIHRoZSBKU09OIHBh
eWxvYWQgcmV0dXJuZWQgYnkKLSAgICB0aGUgc2VydmVyLiBZb3Ugc2hvdWxkIG92ZXJyaWRlIHRo
aXMgbWV0aG9kLCBtdW5nZSB0aGUgaGFzaAotICAgIGFuZCBjYWxsIHN1cGVyIGlmIHlvdSBoYXZl
IGdlbmVyaWMgbm9ybWFsaXphdGlvbiB0byBkby4KLQotICAgIEl0IHRha2VzIHRoZSB0eXBlIG9m
IHRoZSByZWNvcmQgdGhhdCBpcyBiZWluZyBub3JtYWxpemVkCi0gICAgKGFzIGEgRFMuTW9kZWwg
Y2xhc3MpLCB0aGUgcHJvcGVydHkgd2hlcmUgdGhlIGhhc2ggd2FzCi0gICAgb3JpZ2luYWxseSBm
b3VuZCwgYW5kIHRoZSBoYXNoIHRvIG5vcm1hbGl6ZS4KLQotICAgIFlvdSBjYW4gdXNlIHRoaXMg
bWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gbm9ybWFsaXplIHVuZGVyc2NvcmVkIGtleXMgdG8gY2Ft
ZWxpemVkCi0gICAgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIG5vcm1hbGl6YXRpb25zLgotCi0g
ICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlh
bGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgbm9ybWFsaXplOiBmdW5j
dGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgICAgIHZhciBmaWVsZHMgPSBFbWJlci5nZXQodHlwZSwg
J2ZpZWxkcycpOwotICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkgewotICAg
ICAgICAgIHZhciBwYXlsb2FkRmllbGQgPSBFbWJlci5TdHJpbmcudW5kZXJzY29yZShmaWVsZCk7
Ci0gICAgICAgICAgaWYgKGZpZWxkID09PSBwYXlsb2FkRmllbGQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICAgICAgICBoYXNoW2ZpZWxkXSA9IGhhc2hbcGF5bG9hZEZpZWxkXTsKLSAgICAgICAgICBkZWxl
dGUgaGFzaFtwYXlsb2FkRmllbGRdOwotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBg
Ci0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gaGFzaAotICAgIEByZXR1cm4ge09iamVjdH0K
LSAgKi8KLSAgbm9ybWFsaXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgaWYgKCFoYXNo
KSB7IHJldHVybiBoYXNoOyB9Ci0KLSAgICB0aGlzLmFwcGx5VHJhbnNmb3Jtcyh0eXBlLCBoYXNo
KTsKLSAgICByZXR1cm4gaGFzaDsKLSAgfSwKLQotICAvLyBTRVJJQUxJWkUKLSAgLyoqCi0gICAg
Q2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgc2F2ZWQgaW4gb3JkZXIgdG8gY29udmVydCB0aGUKLSAg
ICByZWNvcmQgaW50byBKU09OLgotCi0gICAgQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIEpTT04g
b2JqZWN0IHdpdGggYSBrZXkgZm9yCi0gICAgZWFjaCBhdHRyaWJ1dGUgYW5kIGJlbG9uZ3NUbyBy
ZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBtb2RlbDoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgICB0aXRsZTogRFMuYXR0cigpLAotICAgICAgYm9keTogRFMuYXR0cigpLAotCi0gICAgICBh
dXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUg
ZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAgICAgInRpdGxlIjogIlJhaWxzIGlzIHVuYWdp
IiwKLSAgICAgICJib2R5IjogIlJhaWxzPyBPbWFrYXNlPyBPX08iLAotICAgICAgImF1dGhvciI6
IDEyCi0gICAgfQotICAgIGBgYAotCi0gICAgQnkgZGVmYXVsdCwgYXR0cmlidXRlcyBhcmUgcGFz
c2VkIHRocm91Z2ggYXMtaXMsIHVubGVzcwotICAgIHlvdSBzcGVjaWZpZWQgYW4gYXR0cmlidXRl
IHR5cGUgKGBEUy5hdHRyKCdkYXRlJylgKS4gSWYKLSAgICB5b3Ugc3BlY2lmeSBhIHRyYW5zZm9y
bSwgdGhlIEphdmFTY3JpcHQgdmFsdWUgd2lsbCBiZQotICAgIHNlcmlhbGl6ZWQgd2hlbiBpbnNl
cnRlZCBpbnRvIHRoZSBKU09OIGhhc2guCi0KLSAgICBCeSBkZWZhdWx0LCBiZWxvbmdzLXRvIHJl
bGF0aW9uc2hpcHMgYXJlIGNvbnZlcnRlZCBpbnRvCi0gICAgSURzIHdoZW4gaW5zZXJ0ZWQgaW50
byB0aGUgSlNPTiBoYXNoLgotCi0gICAgIyMgSURzCi0KLSAgICBgc2VyaWFsaXplYCB0YWtlcyBh
biBvcHRpb25zIGhhc2ggd2l0aCBhIHNpbmdsZSBvcHRpb246Ci0gICAgYGluY2x1ZGVJZGAuIElm
IHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgYHNlcmlhbGl6ZWAgd2lsbCwKLSAgICBieSBkZWZhdWx0
IGluY2x1ZGUgdGhlIElEIGluIHRoZSBKU09OIG9iamVjdCBpdCBidWlsZHMuCi0KLSAgICBUaGUg
YWRhcHRlciBwYXNzZXMgaW4gYGluY2x1ZGVJZDogdHJ1ZWAgd2hlbiBzZXJpYWxpemluZwotICAg
IGEgcmVjb3JkIGZvciBgY3JlYXRlUmVjb3JkYCwgYnV0IG5vdCBmb3IgYHVwZGF0ZVJlY29yZGAu
Ci0KLSAgICAjIyBDdXN0b21pemF0aW9uCi0KLSAgICBZb3VyIHNlcnZlciBtYXkgZXhwZWN0IGEg
ZGlmZmVyZW50IEpTT04gZm9ybWF0IHRoYW4gdGhlCi0gICAgYnVpbHQtaW4gc2VyaWFsaXphdGlv
biBmb3JtYXQuCi0KLSAgICBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gaW1wbGVtZW50IGBzZXJpYWxp
emVgIHlvdXJzZWxmIGFuZAotICAgIHJldHVybiBhIEpTT04gaGFzaCBvZiB5b3VyIGNob29zaW5n
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05T
ZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHBvc3QsIG9wdGlv
bnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7Ci0gICAgICAgICAgUE9TVF9UVEw6IHBvc3QuZ2V0
KCd0aXRsZScpLAotICAgICAgICAgIFBPU1RfQkRZOiBwb3N0LmdldCgnYm9keScpLAotICAgICAg
ICAgIFBPU1RfQ01TOiBwb3N0LmdldCgnY29tbWVudHMnKS5tYXBQcm9wZXJ0eSgnaWQnKQotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUlkKSB7Ci0gICAgICAgICAganNv
bi5QT1NUX0lEXyA9IHBvc3QuZ2V0KCdpZCcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJu
IGpzb247Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICAjIyBDdXN0b21pemluZyBh
biBBcHAtV2lkZSBTZXJpYWxpemVyCi0KLSAgICBJZiB5b3Ugd2FudCB0byBkZWZpbmUgYSBzZXJp
YWxpemVyIGZvciB5b3VyIGVudGlyZQotICAgIGFwcGxpY2F0aW9uLCB5b3UnbGwgcHJvYmFibHkg
d2FudCB0byB1c2UgYGVhY2hBdHRyaWJ1dGVgCi0gICAgYW5kIGBlYWNoUmVsYXRpb25zaGlwYCBv
biB0aGUgcmVjb3JkLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvblNl
cmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplOiBm
dW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7fTsKLQotICAg
ICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgICAganNv
bltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSk7Ci0gICAgICAg
IH0pCi0KLSAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVs
YXRpb25zaGlwKSB7Ci0gICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFu
eScpIHsKLSAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUobmFtZSldID0gcmVjb3Jk
LmdldChuYW1lKS5tYXBCeSgnaWQnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAg
ICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewotICAgICAgICAgIGpzb24uSURfID0gcmVjb3Jk
LmdldCgnaWQnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqc29uOwotICAgICAgfQot
ICAgIH0pOwotCi0gICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFtZShhdHRyaWJ1dGUpIHsK
LSAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAg
fQotCi0gICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgewotICAgICAgcmV0dXJu
IHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSArICJfSURTIjsKLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBKU09OIHRoYXQg
bG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHsKLSAgICAgICJUSVRM
RSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICJCT0RZIjogIlllcC4gT21ha2FzZS4iLAot
ICAgICAgIkNPTU1FTlRfSURTIjogWyAxLCAyLCAzIF0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICAj
IyBUd2Vha2luZyB0aGUgRGVmYXVsdCBKU09OCi0KLSAgICBJZiB5b3UganVzdCB3YW50IHRvIGRv
IHNvbWUgc21hbGwgdHdlYWtzIG9uIHRoZSBkZWZhdWx0IEpTT04sCi0gICAgeW91IGNhbiBjYWxs
IHN1cGVyIGZpcnN0IGFuZCBtYWtlIHRoZSB0d2Vha3Mgb24gdGhlIHJldHVybmVkCi0gICAgSlNP
Ti4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09O
U2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNvcmQsIG9w
dGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOwotCi0gICAgICAgIGpzb24uc3ViamVjdCA9IGpzb24udGl0bGU7Ci0gICAgICAgIGRl
bGV0ZSBqc29uLnRpdGxlOwotCi0gICAgICAgIHJldHVybiBqc29uOwotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEBy
ZXR1cm4ge09iamVjdH0ganNvbgotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
b3B0aW9ucykgewotICAgIHZhciBqc29uID0ge307Ci0KLSAgICBpZiAob3B0aW9ucyAmJiBvcHRp
b25zLmluY2x1ZGVJZCkgewotICAgICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Ci0KLSAg
ICAgIGlmIChpZCkgewotICAgICAgICBqc29uW2dldCh0aGlzLCAncHJpbWFyeUtleScpXSA9IGlk
OwotICAgICAgfQotICAgIH0KLQotICAgIHJlY29yZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtl
eSwgYXR0cmlidXRlKSB7Ci0gICAgICB0aGlzLnNlcmlhbGl6ZUF0dHJpYnV0ZShyZWNvcmQsIGpz
b24sIGtleSwgYXR0cmlidXRlKTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJlY29yZC5lYWNoUmVs
YXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBpZiAocmVsYXRp
b25zaGlwLmtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0gICAgICAgIHRoaXMuc2VyaWFsaXplQmVs
b25nc1RvKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKTsKLSAgICAgIH0gZWxzZSBpZiAocmVs
YXRpb25zaGlwLmtpbmQgPT09ICdoYXNNYW55JykgewotICAgICAgICB0aGlzLnNlcmlhbGl6ZUhh
c01hbnkocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApOwotICAgICAgfQotICAgIH0sIHRoaXMp
OwotCi0gICAgcmV0dXJuIGpzb247Ci0gIH0sCi0KLSAgLyoqCi0gICBgc2VyaWFsaXplQXR0cmli
dXRlYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgaG93IGBEUy5hdHRyYAotICAgcHJvcGVydGll
cyBhcmUgc2VyaWFsaXplZAotCi0gICBGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudGVkIHRvIGVuc3Vy
ZSBhbGwgeW91IGF0dHJpYnV0ZXMgd2VyZSBhbHdheXMKLSAgIHNlcmlhbGl6ZWQgYXMgcHJvcGVy
dGllcyBvbiBhbiBgYXR0cmlidXRlc2Agb2JqZWN0IHlvdSBjb3VsZAotICAgd3JpdGU6Ci0KLSAg
IGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2Vy
aWFsaXplci5leHRlbmQoewotICAgICBzZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0aW9uKHJlY29y
ZCwganNvbiwga2V5LCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAganNvbi5hdHRyaWJ1dGVzID0ganNv
bi5hdHRyaWJ1dGVzIHx8IHt9OwotICAgICAgIHRoaXMuX3N1cGVyKHJlY29yZCwganNvbi5hdHRy
aWJ1dGVzLCBrZXksIGF0dHJpYnV0ZXMpOwotICAgICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBA
bWV0aG9kIHNlcmlhbGl6ZUF0dHJpYnV0ZQotICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0g
ICBAcGFyYW0ge09iamVjdH0ganNvbgotICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgQHBhcmFt
IHtPYmplY3R9IGF0dHJpYnV0ZQotICAqLwotICBzZXJpYWxpemVBdHRyaWJ1dGU6IGZ1bmN0aW9u
KHJlY29yZCwganNvbiwga2V5LCBhdHRyaWJ1dGUpIHsKLSAgICB2YXIgYXR0cnMgPSBnZXQodGhp
cywgJ2F0dHJzJyk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KSwgdHlwZSA9IGF0
dHJpYnV0ZS50eXBlOwotCi0gICAgaWYgKHR5cGUpIHsKLSAgICAgIHZhciB0cmFuc2Zvcm0gPSB0
aGlzLnRyYW5zZm9ybUZvcih0eXBlKTsKLSAgICAgIHZhbHVlID0gdHJhbnNmb3JtLnNlcmlhbGl6
ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gaWYgcHJvdmlkZWQsIHVzZSB0aGUgbWFwcGluZyBw
cm92aWRlZCBieSBgYXR0cnNgIGluCi0gICAgLy8gdGhlIHNlcmlhbGl6ZXIKLSAgICBrZXkgPSBh
dHRycyAmJiBhdHRyc1trZXldIHx8ICh0aGlzLmtleUZvckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9y
QXR0cmlidXRlKGtleSkgOiBrZXkpOwotCi0gICAganNvbltrZXldID0gdmFsdWU7Ci0gIH0sCi0K
LSAgLyoqCi0gICBgc2VyaWFsaXplQmVsb25nc1RvYCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUg
aG93IGBEUy5iZWxvbmdzVG9gCi0gICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkLgotCi0gICBF
eGFtcGxlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpT
T05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgIHNlcmlhbGl6ZUJlbG9uZ3NUbzogZnVuY3Rpb24o
cmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsKLSAgICAgICB2YXIga2V5ID0gcmVsYXRpb25z
aGlwLmtleTsKLQotICAgICAgIHZhciBiZWxvbmdzVG8gPSBnZXQocmVjb3JkLCBrZXkpOwotCi0g
ICAgICAga2V5ID0gdGhpcy5rZXlGb3JSZWxhdGlvbnNoaXAgPyB0aGlzLmtleUZvclJlbGF0aW9u
c2hpcChrZXksICJiZWxvbmdzVG8iKSA6IGtleTsKLQotICAgICAgIGpzb25ba2V5XSA9IEVtYmVy
LmlzTm9uZShiZWxvbmdzVG8pID8gYmVsb25nc1RvIDogYmVsb25nc1RvLnRvSlNPTigpOwotICAg
ICB9Ci0gICB9KTsKLSAgIGBgYAotCi0gICBAbWV0aG9kIHNlcmlhbGl6ZUJlbG9uZ3NUbwotICAg
QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICBAcGFyYW0ge09iamVjdH0ganNvbgotICAgQHBh
cmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcAotICAqLwotICBzZXJpYWxpemVCZWxvbmdzVG86IGZ1
bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtleSA9IHJlbGF0
aW9uc2hpcC5rZXk7Ci0KLSAgICB2YXIgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLQot
ICAgIGtleSA9IHRoaXMua2V5Rm9yUmVsYXRpb25zaGlwID8gdGhpcy5rZXlGb3JSZWxhdGlvbnNo
aXAoa2V5LCAiYmVsb25nc1RvIikgOiBrZXk7Ci0KLSAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykp
IHsKLSAgICAgIGpzb25ba2V5XSA9IGJlbG9uZ3NUbzsKLSAgICB9IGVsc2UgewotICAgICAganNv
bltrZXldID0gZ2V0KGJlbG9uZ3NUbywgJ2lkJyk7Ci0gICAgfQotCi0gICAgaWYgKHJlbGF0aW9u
c2hpcC5vcHRpb25zLnBvbHltb3JwaGljKSB7Ci0gICAgICB0aGlzLnNlcmlhbGl6ZVBvbHltb3Jw
aGljVHlwZShyZWNvcmQsIGpzb24sIHJlbGF0aW9uc2hpcCk7Ci0gICAgfQotICB9LAotCi0gIC8q
KgotICAgYHNlcmlhbGl6ZUhhc01hbnlgIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBob3cgYERT
Lmhhc01hbnlgCi0gICBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkLgotCi0gICBFeGFtcGxlCi0K
LSAgIGBgYGphdmFzY3JpcHQKLSAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxp
emVyLmV4dGVuZCh7Ci0gICAgIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNv
biwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0g
ICAgICAgaWYgKGtleSA9PT0gJ2NvbW1lbnRzJykgewotICAgICAgICAgcmV0dXJuOwotICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwot
ICAgICAgIH0KLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgQG1ldGhvZCBzZXJpYWxpemVI
YXNNYW55Ci0gICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgIEBwYXJhbSB7T2JqZWN0fSBq
c29uCi0gICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNlcmlhbGl6ZUhh
c01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtl
eSA9IHJlbGF0aW9uc2hpcC5rZXk7Ci0KLSAgICB2YXIgcmVsYXRpb25zaGlwVHlwZSA9IERTLlJl
bGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlKHJlY29yZC5jb25zdHJ1
Y3RvciwgcmVsYXRpb25zaGlwKTsKLQotICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlID09PSAnbWFu
eVRvTm9uZScgfHwgcmVsYXRpb25zaGlwVHlwZSA9PT0gJ21hbnlUb01hbnknKSB7Ci0gICAgICBq
c29uW2tleV0gPSBnZXQocmVjb3JkLCBrZXkpLm1hcEJ5KCdpZCcpOwotICAgICAgLy8gVE9ETyBz
dXBwb3J0IGZvciBwb2x5bW9ycGhpYyBtYW55VG9Ob25lIGFuZCBtYW55VG9NYW55IHJlbGF0aW9u
c2hpcHMKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2Qg
dG8gY3VzdG9taXplIGhvdyBwb2x5bW9ycGhpYyBvYmplY3RzIGFyZQotICAgIHNlcmlhbGl6ZWQu
IE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgcG9seW1vcnBoaWMgaWYKLSAgICBge3BvbHlt
b3JwaGljOiB0cnVlfWAgaXMgcGFzcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZQotICAg
IGBEUy5iZWxvbmdzVG9gIGZ1bmN0aW9uLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5Db21tZW50U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVu
ZCh7Ci0gICAgICBzZXJpYWxpemVQb2x5bW9ycGhpY1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNv
biwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHZhciBrZXkgPSByZWxhdGlvbnNoaXAua2V5LAot
ICAgICAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICAgICAga2V5ID0g
dGhpcy5rZXlGb3JBdHRyaWJ1dGUgPyB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpIDoga2V5Owot
ICAgICAgICBqc29uW2tleSArICJfdHlwZSJdID0gYmVsb25nc1RvLmNvbnN0cnVjdG9yLnR5cGVL
ZXk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICBgYGAKLQotICAgIEBtZXRob2Qgc2VyaWFsaXplUG9s
eW1vcnBoaWNUeXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBhcmFtIHtP
YmplY3R9IGpzb24KLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICovCi0gIHNl
cmlhbGl6ZVBvbHltb3JwaGljVHlwZTogRW1iZXIuSywKLQotICAvLyBFWFRSQUNUCi0KLSAgLyoq
Ci0gICAgVGhlIGBleHRyYWN0YCBtZXRob2QgaXMgdXNlZCB0byBkZXNlcmlhbGl6ZSBwYXlsb2Fk
IGRhdGEgZnJvbSB0aGUKLSAgICBzZXJ2ZXIuIEJ5IGRlZmF1bHQgdGhlIGBKU09OU2VyaWFsaXpl
cmAgZG9lcyBub3QgcHVzaCB0aGUgcmVjb3JkcwotICAgIGludG8gdGhlIHN0b3JlLiBIb3dldmVy
IHJlY29yZHMgdGhhdCBzdWJjbGFzcyBgSlNPTlNlcmlhbGl6ZXJgCi0gICAgc3VjaCBhcyB0aGUg
YFJFU1RTZXJpYWxpemVyYCBtYXkgcHVzaCByZWNvcmRzIGludG8gdGhlIHN0b3JlIGFzCi0gICAg
cGFydCBvZiB0aGUgZXh0cmFjdCBjYWxsLgotCi0gICAgVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRv
IGEgbW9yZSBzcGVjaWZpYyBleHRyYWN0IG1ldGhvZCBiYXNlZCBvbgotICAgIHRoZSBgcmVxdWVz
dFR5cGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBnZXQg
PSBFbWJlci5nZXQ7Ci0gICAgc29ja2V0Lm9uKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkg
ewotICAgICAgdmFyIG1vZGVsTmFtZSA9IG1lc3NhZ2UubW9kZWw7Ci0gICAgICB2YXIgZGF0YSA9
IG1lc3NhZ2UuZGF0YTsKLSAgICAgIHZhciB0eXBlID0gc3RvcmUubW9kZWxGb3IobW9kZWxOYW1l
KTsKLSAgICAgIHZhciBzZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVL
ZXkpOwotICAgICAgdmFyIHJlY29yZCA9IHNlcmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwg
ZGF0YSwgZ2V0KGRhdGEsICdpZCcpLCAnc2luZ2xlJyk7Ci0gICAgICBzdG9yZS5wdXNoKG1vZGVs
TmFtZSwgcmVjb3JkKTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXh0cmFjdAot
ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N
b2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHBhcmFtIHtTdHJp
bmcgb3IgTnVtYmVyfSBpZAotICAgIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VHlwZQotICAgIEBy
ZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0
cmFjdDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSkgewot
ICAgIHRoaXMuZXh0cmFjdE1ldGEoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwotCi0gICAgdmFyIHNw
ZWNpZmljRXh0cmFjdCA9ICJleHRyYWN0IiArIHJlcXVlc3RUeXBlLmNoYXJBdCgwKS50b1VwcGVy
Q2FzZSgpICsgcmVxdWVzdFR5cGUuc3Vic3RyKDEpOwotICAgIHJldHVybiB0aGlzW3NwZWNpZmlj
RXh0cmFjdF0oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kQWxsYCBpcyBhIGhvb2sgaW50byB0aGUgZXh0cmFjdCBt
ZXRob2QgdXNlZCB3aGVuIGEKLSAgICBjYWxsIGlzIG1hZGUgdG8gYERTLlN0b3JlI2ZpbmRBbGxg
LiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCi0gICAgYWxpYXMgZm9yIFtleHRyYWN0QXJy
YXldKCNtZXRob2RfZXh0cmFjdEFycmF5KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmRBbGwK
LSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0Fy
cmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRy
YWN0RmluZEFsbDogYWxpYXNNZXRob2QoJ2V4dHJhY3RBcnJheScpLAotICAvKioKLSAgICBgZXh0
cmFjdEZpbmRRdWVyeWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hl
biBhCi0gICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kUXVlcnlgLiBCeSBkZWZhdWx0
IHRoaXMgbWV0aG9kIGlzIGFuCi0gICAgYWxpYXMgZm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2Rf
ZXh0cmFjdEFycmF5KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmRRdWVyeQotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7QXJyYXl9IGFycmF5
IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCi0gICovCi0gIGV4dHJhY3RGaW5kUXVl
cnk6IGFsaWFzTWV0aG9kKCdleHRyYWN0QXJyYXknKSwKLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5k
TWFueWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAg
Y2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kTWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRo
b2QgaXMKLSAgICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkp
LgotCi0gICAgQG1ldGhvZCBleHRyYWN0RmluZE1hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBk
ZXNlcmlhbGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0RmluZE1hbnk6IGFsaWFzTWV0aG9k
KCdleHRyYWN0QXJyYXknKSwKLSAgLyoqCi0gICAgYGV4dHJhY3RGaW5kSGFzTWFueWAgaXMgYSBo
b29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRl
IHRvIGBEUy5TdG9yZSNmaW5kSGFzTWFueWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMKLSAg
ICBhbGlhcyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkpLgotCi0gICAg
QG1ldGhvZCBleHRyYWN0RmluZEhhc01hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAotICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBhcnJheSBvZiBkZXNlcmlh
bGl6ZWQgb2JqZWN0cwotICAqLwotICBleHRyYWN0RmluZEhhc01hbnk6IGFsaWFzTWV0aG9kKCdl
eHRyYWN0QXJyYXknKSwKLQotICAvKioKLSAgICBgZXh0cmFjdENyZWF0ZVJlY29yZGAgaXMgYSBo
b29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbiBhCi0gICAgY2FsbCBpcyBtYWRl
IHRvIGBEUy5TdG9yZSNjcmVhdGVSZWNvcmRgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzCi0g
ICAgYWxpYXMgZm9yIFtleHRyYWN0U2F2ZV0oI21ldGhvZF9leHRyYWN0U2F2ZSkuCi0KLSAgICBA
bWV0aG9kIGV4dHJhY3RDcmVhdGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVj
dH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBh
eWxvYWQKLSAgKi8KLSAgZXh0cmFjdENyZWF0ZVJlY29yZDogYWxpYXNNZXRob2QoJ2V4dHJhY3RT
YXZlJyksCi0gIC8qKgotICAgIGBleHRyYWN0VXBkYXRlUmVjb3JkYCBpcyBhIGhvb2sgaW50byB0
aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuCi0gICAgYSBjYWxsIGlzIG1hZGUgdG8gYERTLlN0
b3JlI3VwZGF0ZWAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMgYWxpYXMKLSAgICBmb3IgW2V4
dHJhY3RTYXZlXSgjbWV0aG9kX2V4dHJhY3RTYXZlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdFVw
ZGF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAg
QHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9hZAotICAqLwotICBl
eHRyYWN0VXBkYXRlUmVjb3JkOiBhbGlhc01ldGhvZCgnZXh0cmFjdFNhdmUnKSwKLSAgLyoqCi0g
ICAgYGV4dHJhY3REZWxldGVSZWNvcmRgIGlzIGEgaG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhv
ZCB1c2VkIHdoZW4KLSAgICBhIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZGVsZXRlUmVjb3Jk
YC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNhdmVd
KCNtZXRob2RfZXh0cmFjdFNhdmUpLgotCi0gICAgQG1ldGhvZCBleHRyYWN0RGVsZXRlUmVjb3Jk
Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKLSAgICBAcmV0dXJuIHtP
YmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2FkCi0gICovCi0gIGV4dHJhY3REZWxl
dGVSZWNvcmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2F2ZScpLAotCi0gIC8qKgotICAgIGBleHRy
YWN0RmluZGAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAg
IGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhv
ZCBpcwotICAgIGFsaWFzIGZvciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xl
KS4KLQotICAgIEBtZXRob2QgZXh0cmFjdEZpbmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y
ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09i
amVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVk
IHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdEZpbmQ6IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xl
JyksCi0gIC8qKgotICAgIGBleHRyYWN0RmluZEJlbG9uZ3NUb2AgaXMgYSBob29rIGludG8gdGhl
IGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgotICAgIGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9y
ZSNmaW5kQmVsb25nc1RvYC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwotICAgIGFsaWFzIGZv
ciBbZXh0cmFjdFNpbmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2Qg
ZXh0cmFjdEZpbmRCZWxvbmdzVG8KLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBw
YXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5
bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQK
LSAgKi8KLSAgZXh0cmFjdEZpbmRCZWxvbmdzVG86IGFsaWFzTWV0aG9kKCdleHRyYWN0U2luZ2xl
JyksCi0gIC8qKgotICAgIGBleHRyYWN0U2F2ZWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3Qg
bWV0aG9kIHVzZWQgd2hlbiBhIGNhbGwKLSAgICBpcyBtYWRlIHRvIGBEUy5Nb2RlbCNzYXZlYC4g
QnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyBhbGlhcwotICAgIGZvciBbZXh0cmFjdFNpbmdsZV0o
I21ldGhvZF9leHRyYWN0U2luZ2xlKS4KLQotICAgIEBtZXRob2QgZXh0cmFjdFNhdmUKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAgIEByZXR1cm4ge09iamVjdH0g
anNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKLSAgKi8KLSAgZXh0cmFjdFNhdmU6IGFsaWFz
TWV0aG9kKCdleHRyYWN0U2luZ2xlJyksCi0KLSAgLyoqCi0gICAgYGV4dHJhY3RTaW5nbGVgIGlz
IHVzZWQgdG8gZGVzZXJpYWxpemUgYSBzaW5nbGUgcmVjb3JkIHJldHVybmVkCi0gICAgZnJvbSB0
aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAu
UG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewotICAgICAgZXh0cmFj
dFNpbmdsZTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICAgICAgcGF5bG9h
ZC5jb21tZW50cyA9IHBheWxvYWQuX2VtYmVkZGVkLmNvbW1lbnQ7Ci0gICAgICAgIGRlbGV0ZSBw
YXlsb2FkLl9lbWJlZGRlZDsKLQotICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5
cGUsIHBheWxvYWQpOwotICAgICAgfSwKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
ZXh0cmFjdFNpbmdsZQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtz
dWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0g
ICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9hZAotICAqLwot
ICBleHRyYWN0U2luZ2xlOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewotICAgIHJl
dHVybiB0aGlzLm5vcm1hbGl6ZSh0eXBlLCBwYXlsb2FkKTsKLSAgfSwKLQotICAvKioKLSAgICBg
ZXh0cmFjdEFycmF5YCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFuIGFycmF5IG9mIHJlY29yZHMK
LSAgICByZXR1cm5lZCBmcm9tIHRoZSBhZGFwdGVyLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBg
amF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4
dGVuZCh7Ci0gICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2Fk
KSB7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkLm1hcChmdW5jdGlvbihqc29uKSB7Ci0gICAgICAg
ICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNpbmdsZShqc29uKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RBcnJheQotICAg
IEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2Rl
bH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHJldHVybiB7QXJyYXl9
IGFycmF5IEFuIGFycmF5IG9mIGRlc2VyaWFsaXplZCBvYmplY3RzCi0gICovCi0gIGV4dHJhY3RB
cnJheTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKLSAgICByZXR1cm4gdGhpcy5u
b3JtYWxpemUodHlwZSwgcGF5bG9hZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgYGV4dHJhY3RNZXRh
YCBpcyB1c2VkIHRvIGRlc2VyaWFsaXplIGFueSBtZXRhIGluZm9ybWF0aW9uIGluIHRoZQotICAg
IGFkYXB0ZXIgcGF5bG9hZC4gQnkgZGVmYXVsdCBFbWJlciBEYXRhIGV4cGVjdHMgbWV0YSBpbmZv
cm1hdGlvbiB0bwotICAgIGJlIGxvY2F0ZWQgb24gdGhlIGBtZXRhYCBwcm9wZXJ0eSBvZiB0aGUg
cGF5bG9hZCBvYmplY3QuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
QXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIGV4
dHJhY3RNZXRhOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewotICAgICAgICBpZiAo
cGF5bG9hZCAmJiBwYXlsb2FkLl9wYWdpbmF0aW9uKSB7Ci0gICAgICAgICAgc3RvcmUubWV0YUZv
clR5cGUodHlwZSwgcGF5bG9hZC5fcGFnaW5hdGlvbik7Ci0gICAgICAgICAgZGVsZXRlIHBheWxv
YWQuX3BhZ2luYXRpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIEBtZXRob2QgZXh0cmFjdE1ldGEKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAg
IEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0g
cGF5bG9hZAotICAqLwotICBleHRyYWN0TWV0YTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxv
YWQpIHsKLSAgICBpZiAocGF5bG9hZCAmJiBwYXlsb2FkLm1ldGEpIHsKLSAgICAgIHN0b3JlLm1l
dGFGb3JUeXBlKHR5cGUsIHBheWxvYWQubWV0YSk7Ci0gICAgICBkZWxldGUgcGF5bG9hZC5tZXRh
OwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgIGBrZXlGb3JBdHRyaWJ1dGVgIGNhbiBiZSB1c2Vk
IHRvIGRlZmluZSBydWxlcyBmb3IgaG93IHRvIGNvbnZlcnQgYW4KLSAgIGF0dHJpYnV0ZSBuYW1l
IGluIHlvdXIgbW9kZWwgdG8gYSBrZXkgaW4geW91ciBKU09OLgotCi0gICBFeGFtcGxlCi0KLSAg
IGBgYGphdmFzY3JpcHQKLSAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2Vy
aWFsaXplci5leHRlbmQoewotICAgICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIpIHsK
LSAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2Uo
KTsKLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgQG1ldGhvZCBrZXlGb3JBdHRyaWJ1dGUK
LSAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgIEByZXR1cm4ge1N0cmluZ30gbm9ybWFsaXplZCBr
ZXkKLSAgKi8KLQotCi0gIC8qKgotICAgYGtleUZvclJlbGF0aW9uc2hpcGAgY2FuIGJlIHVzZWQg
dG8gZGVmaW5lIGEgY3VzdG9tIGtleSB3aGVuCi0gICBzZXJpYWxpemluZyByZWxhdGlvbnNoaXAg
cHJvcGVydGllcy4gQnkgZGVmYXVsdCBgSlNPTlNlcmlhbGl6ZXJgCi0gICBkb2VzIG5vdCBwcm92
aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgotCi0gICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6
ZXIuZXh0ZW5kKHsKLSAgICAgIGtleUZvclJlbGF0aW9uc2hpcDogZnVuY3Rpb24oa2V5LCByZWxh
dGlvbnNoaXApIHsKLSAgICAgICAgIHJldHVybiAncmVsXycgKyBFbWJlci5TdHJpbmcudW5kZXJz
Y29yZShrZXkpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICBAbWV0aG9kIGtleUZv
clJlbGF0aW9uc2hpcAotICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgQHBhcmFtIHtTdHJpbmd9
IHJlbGF0aW9uc2hpcCB0eXBlCi0gICBAcmV0dXJuIHtTdHJpbmd9IG5vcm1hbGl6ZWQga2V5Ci0g
ICovCi0KLSAgLy8gSEVMUEVSUwotCi0gIC8qKgotICAgQG1ldGhvZCB0cmFuc2Zvcm1Gb3IKLSAg
IEBwcml2YXRlCi0gICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlVHlwZQotICAgQHBhcmFtIHtC
b29sZWFufSBza2lwQXNzZXJ0aW9uCi0gICBAcmV0dXJuIHtEUy5UcmFuc2Zvcm19IHRyYW5zZm9y
bQotICAqLwotICB0cmFuc2Zvcm1Gb3I6IGZ1bmN0aW9uKGF0dHJpYnV0ZVR5cGUsIHNraXBBc3Nl
cnRpb24pIHsKLSAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5jb250YWluZXIubG9va3VwKCd0cmFu
c2Zvcm06JyArIGF0dHJpYnV0ZVR5cGUpOwotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZp
bmQgdHJhbnNmb3JtIGZvciAnIiArIGF0dHJpYnV0ZVR5cGUgKyAiJyIsIHNraXBBc3NlcnRpb24g
fHwgISF0cmFuc2Zvcm0pOwotICAgIHJldHVybiB0cmFuc2Zvcm07Ci0gIH0KLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLXZh
ciBnZXQgPSBFbWJlci5nZXQsIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwg
dW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLCBEUyA9IHdpbmRvdy5EUyA7Ci0K
LS8qKgotICBFeHRlbmQgYEVtYmVyLkRhdGFBZGFwdGVyYCB3aXRoIEVEIHNwZWNpZmljIGNvZGUu
Ci0KLSAgQGNsYXNzIERlYnVnQWRhcHRlcgotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVt
YmVyLkRhdGFBZGFwdGVyCi0gIEBwcml2YXRlCi0qLwotRFMuRGVidWdBZGFwdGVyID0gRW1iZXIu
RGF0YUFkYXB0ZXIuZXh0ZW5kKHsKLSAgZ2V0RmlsdGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0
dXJuIFsKLSAgICAgIHsgbmFtZTogJ2lzTmV3JywgZGVzYzogJ05ldycgfSwKLSAgICAgIHsgbmFt
ZTogJ2lzTW9kaWZpZWQnLCBkZXNjOiAnTW9kaWZpZWQnIH0sCi0gICAgICB7IG5hbWU6ICdpc0Ns
ZWFuJywgZGVzYzogJ0NsZWFuJyB9Ci0gICAgXTsKLSAgfSwKLQotICBkZXRlY3Q6IGZ1bmN0aW9u
KGtsYXNzKSB7Ci0gICAgcmV0dXJuIGtsYXNzICE9PSBEUy5Nb2RlbCAmJiBEUy5Nb2RlbC5kZXRl
Y3Qoa2xhc3MpOwotICB9LAotCi0gIGNvbHVtbnNGb3JUeXBlOiBmdW5jdGlvbih0eXBlKSB7Ci0g
ICAgdmFyIGNvbHVtbnMgPSBbeyBuYW1lOiAnaWQnLCBkZXNjOiAnSWQnIH1dLCBjb3VudCA9IDAs
IHNlbGYgPSB0aGlzOwotICAgIGdldCh0eXBlLCAnYXR0cmlidXRlcycpLmZvckVhY2goZnVuY3Rp
b24obmFtZSwgbWV0YSkgewotICAgICAgICBpZiAoY291bnQrKyA+IHNlbGYuYXR0cmlidXRlTGlt
aXQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIHZhciBkZXNjID0gY2FwaXRhbGl6ZSh1bmRl
cnNjb3JlKG5hbWUpLnJlcGxhY2UoJ18nLCAnICcpKTsKLSAgICAgICAgY29sdW1ucy5wdXNoKHsg
bmFtZTogbmFtZSwgZGVzYzogZGVzYyB9KTsKLSAgICB9KTsKLSAgICByZXR1cm4gY29sdW1uczsK
LSAgfSwKLQotICBnZXRSZWNvcmRzOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgcmV0dXJuIHRoaXMu
Z2V0KCdzdG9yZScpLmFsbCh0eXBlKTsKLSAgfSwKLQotICBnZXRSZWNvcmRDb2x1bW5WYWx1ZXM6
IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciBzZWxmID0gdGhpcywgY291bnQgPSAwLAotICAg
ICAgICBjb2x1bW5WYWx1ZXMgPSB7IGlkOiBnZXQocmVjb3JkLCAnaWQnKSB9OwotCi0gICAgcmVj
b3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBpZiAoY291bnQrKyA+IHNl
bGYuYXR0cmlidXRlTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAg
ICAgdmFyIHZhbHVlID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICAgIGNvbHVtblZhbHVlc1trZXld
ID0gdmFsdWU7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIGNvbHVtblZhbHVlczsKLSAgfSwKLQotICBn
ZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFyIGtleXdvcmRzID0g
W10sIGtleXMgPSBFbWJlci5BKFsnaWQnXSk7Ci0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVu
Y3Rpb24oa2V5KSB7Ci0gICAgICBrZXlzLnB1c2goa2V5KTsKLSAgICB9KTsKLSAgICBrZXlzLmZv
ckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBrZXl3b3Jkcy5wdXNoKGdldChyZWNvcmQsIGtl
eSkpOwotICAgIH0pOwotICAgIHJldHVybiBrZXl3b3JkczsKLSAgfSwKLQotICBnZXRSZWNvcmRG
aWx0ZXJWYWx1ZXM6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJldHVybiB7Ci0gICAgICBpc05l
dzogcmVjb3JkLmdldCgnaXNOZXcnKSwKLSAgICAgIGlzTW9kaWZpZWQ6IHJlY29yZC5nZXQoJ2lz
RGlydHknKSAmJiAhcmVjb3JkLmdldCgnaXNOZXcnKSwKLSAgICAgIGlzQ2xlYW46ICFyZWNvcmQu
Z2V0KCdpc0RpcnR5JykKLSAgICB9OwotICB9LAotCi0gIGdldFJlY29yZENvbG9yOiBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICB2YXIgY29sb3IgPSAnYmxhY2snOwotICAgIGlmIChyZWNvcmQuZ2V0
KCdpc05ldycpKSB7Ci0gICAgICBjb2xvciA9ICdncmVlbic7Ci0gICAgfSBlbHNlIGlmIChyZWNv
cmQuZ2V0KCdpc0RpcnR5JykpIHsKLSAgICAgIGNvbG9yID0gJ2JsdWUnOwotICAgIH0KLSAgICBy
ZXR1cm4gY29sb3I7Ci0gIH0sCi0KLSAgb2JzZXJ2ZVJlY29yZDogZnVuY3Rpb24ocmVjb3JkLCBy
ZWNvcmRVcGRhdGVkKSB7Ci0gICAgdmFyIHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgpLCBzZWxm
ID0gdGhpcywKLSAgICAgICAga2V5c1RvT2JzZXJ2ZSA9IEVtYmVyLkEoWydpZCcsICdpc05ldycs
ICdpc0RpcnR5J10pOwotCi0gICAgcmVjb3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7
Ci0gICAgICBrZXlzVG9PYnNlcnZlLnB1c2goa2V5KTsKLSAgICB9KTsKLQotICAgIGtleXNUb09i
c2VydmUuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKLSAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rp
b24oKSB7Ci0gICAgICAgIHJlY29yZFVwZGF0ZWQoc2VsZi53cmFwUmVjb3JkKHJlY29yZCkpOwot
ICAgICAgfTsKLSAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsK
LSAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJl
bW92ZU9ic2VydmVyKHJlY29yZCwga2V5LCBoYW5kbGVyKTsKLSAgICAgIH0pOwotICAgIH0pOwot
Ci0gICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigpIHsKLSAgICAgIHJlbGVhc2VNZXRob2RzLmZv
ckVhY2goZnVuY3Rpb24oZm4pIHsgZm4oKTsgfSApOwotICAgIH07Ci0KLSAgICByZXR1cm4gcmVs
ZWFzZTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBU
aGUgYERTLlRyYW5zZm9ybWAgY2xhc3MgaXMgdXNlZCB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFs
aXplIG1vZGVsCi0gIGF0dHJpYnV0ZXMgd2hlbiB0aGV5IGFyZSBzYXZlZCBvciBsb2FkZWQgZnJv
bSBhbgotICBhZGFwdGVyLiBTdWJjbGFzc2luZyBgRFMuVHJhbnNmb3JtYCBpcyB1c2VmdWwgZm9y
IGNyZWF0aW5nIGN1c3RvbQotICBhdHRyaWJ1dGVzLiBBbGwgc3ViY2xhc3NlcyBvZiBgRFMuVHJh
bnNmb3JtYCBtdXN0IGltcGxlbWVudCBhCi0gIGBzZXJpYWxpemVgIGFuZCBhIGBkZXNlcmlhbGl6
ZWAgbWV0aG9kLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5SYXdUcmFu
c2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24o
c2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSwKLSAgICBzZXJp
YWxpemU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgewotICAgICAgcmV0dXJuIGRlc2VyaWFsaXpl
ZDsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBVc2FnZQotCi0gIGBgYGphdmFzY3JpcHQKLSAg
dmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuUmVxdWlyZW1lbnQgPSBEUy5Nb2RlbC5leHRlbmQo
ewotICAgIG5hbWU6IGF0dHIoJ3N0cmluZycpLAotICAgIG9wdGlvbnNBcnJheTogYXR0cigncmF3
JykKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBUcmFuc2Zvcm0KLSAgQG5hbWVzcGFjZSBEUwot
ICovCi1EUy5UcmFuc2Zvcm0gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgLyoqCi0gICAgV2hl
biBnaXZlbiBhIGRlc2VyaWFsaXplZCB2YWx1ZSBmcm9tIGEgcmVjb3JkIGF0dHJpYnV0ZSB0aGlz
Ci0gICAgbWV0aG9kIG11c3QgcmV0dXJuIHRoZSBzZXJpYWxpemVkIHZhbHVlLgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJp
YWxpemVkKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuaXNFbXB0eShkZXNlcmlhbGl6ZWQpID8gbnVs
bCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICAgIH0KLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
c2VyaWFsaXplCi0gICAgQHBhcmFtIGRlc2VyaWFsaXplZCBUaGUgZGVzZXJpYWxpemVkIHZhbHVl
Ci0gICAgQHJldHVybiBUaGUgc2VyaWFsaXplZCB2YWx1ZQotICAqLwotICBzZXJpYWxpemU6IEVt
YmVyLnJlcXVpcmVkKCksCi0KLSAgLyoqCi0gICAgV2hlbiBnaXZlbiBhIHNlcmlhbGl6ZSB2YWx1
ZSBmcm9tIGEgSlNPTiBvYmplY3QgdGhpcyBtZXRob2QgbXVzdAotICAgIHJldHVybiB0aGUgZGVz
ZXJpYWxpemVkIHZhbHVlIGZvciB0aGUgcmVjb3JkIGF0dHJpYnV0ZS4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXpl
ZCkgewotICAgICAgcmV0dXJuIGVtcHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJp
YWxpemVkKTsKLSAgICB9Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRlc2VyaWFsaXplCi0gICAg
QHBhcmFtIHNlcmlhbGl6ZWQgVGhlIHNlcmlhbGl6ZWQgdmFsdWUKLSAgICBAcmV0dXJuIFRoZSBk
ZXNlcmlhbGl6ZWQgdmFsdWUKLSAgKi8KLSAgZGVzZXJpYWxpemU6IEVtYmVyLnJlcXVpcmVkKCkK
LQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLS8qKgotICBUaGUgYERTLkJv
b2xlYW5UcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6
ZQotICBib29sZWFuIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0YSByZWNvcmQgb2JqZWN0cy4gVGhp
cyB0cmFuc2Zvcm0gaXMKLSAgdXNlZCB3aGVuIGBib29sZWFuYCBpcyBwYXNzZWQgYXMgdGhlIHR5
cGUgcGFyYW1ldGVyIHRvIHRoZQotICBbRFMuYXR0cl0oLi4vLi4vZGF0YSNtZXRob2RfYXR0cikg
ZnVuY3Rpb24uCi0KLSAgVXNhZ2UKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBhdHRyID0gRFMu
YXR0cjsKLSAgQXBwLlVzZXIgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIGlzQWRtaW46IGF0dHIo
J2Jvb2xlYW4nKSwKLSAgICBuYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICBlbWFpbDogYXR0cign
c3RyaW5nJykKLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBCb29sZWFuVHJhbnNmb3JtCi0gIEBl
eHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNlIERTCi0gKi8KLURTLkJvb2xlYW5UcmFu
c2Zvcm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKLSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNl
cmlhbGl6ZWQpIHsKLSAgICB2YXIgdHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwotCi0gICAgaWYg
KHR5cGUgPT09ICJib29sZWFuIikgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSBl
bHNlIGlmICh0eXBlID09PSAic3RyaW5nIikgewotICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQubWF0
Y2goL150cnVlJHxedCR8XjEkL2kpICE9PSBudWxsOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PT0g
Im51bWJlciIpIHsKLSAgICAgIHJldHVybiBzZXJpYWxpemVkID09PSAxOwotICAgIH0gZWxzZSB7
Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9LAotCi0gIHNlcmlhbGl6ZTogZnVuY3Rp
b24oZGVzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIEJvb2xlYW4oZGVzZXJpYWxpemVkKTsKLSAg
fQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgVGhlIGBEUy5EYXRl
VHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKLSAg
ZGF0ZSBhdHRyaWJ1dGVzIG9uIEVtYmVyIERhdGEgcmVjb3JkIG9iamVjdHMuIFRoaXMgdHJhbnNm
b3JtIGlzIHVzZWQKLSAgd2hlbiBgZGF0ZWAgaXMgcGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRl
ciB0byB0aGUKLSAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuU2NvcmUgPSBE
Uy5Nb2RlbC5leHRlbmQoewotICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKLSAgICBwbGF5ZXI6
IERTLmJlbG9uZ3NUbygncGxheWVyJyksCi0gICAgZGF0ZTogYXR0cignZGF0ZScpCi0gIH0pOwot
ICBgYGAKLQotICBAY2xhc3MgRGF0ZVRyYW5zZm9ybQotICBAZXh0ZW5kcyBEUy5UcmFuc2Zvcm0K
LSAgQG5hbWVzcGFjZSBEUwotICovCi1EUy5EYXRlVHJhbnNmb3JtID0gRFMuVHJhbnNmb3JtLmV4
dGVuZCh7Ci0KLSAgZGVzZXJpYWxpemU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKLSAgICB2YXIg
dHlwZSA9IHR5cGVvZiBzZXJpYWxpemVkOwotCi0gICAgaWYgKHR5cGUgPT09ICJzdHJpbmciKSB7
Ci0gICAgICByZXR1cm4gbmV3IERhdGUoRW1iZXIuRGF0ZS5wYXJzZShzZXJpYWxpemVkKSk7Ci0g
ICAgfSBlbHNlIGlmICh0eXBlID09PSAibnVtYmVyIikgewotICAgICAgcmV0dXJuIG5ldyBEYXRl
KHNlcmlhbGl6ZWQpOwotICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCB8fCBzZXJp
YWxpemVkID09PSB1bmRlZmluZWQpIHsKLSAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJl
c2VudCBpbiB0aGUgZGF0YSwKLSAgICAgIC8vIHJldHVybiB1bmRlZmluZWQsIG5vdCBudWxsLgot
ICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxs
OwotICAgIH0KLSAgfSwKLQotICBzZXJpYWxpemU6IGZ1bmN0aW9uKGRhdGUpIHsKLSAgICBpZiAo
ZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAgIC8vIFNlcmlhbGl6ZSBpdCBhcyBhIG51bWJl
ciB0byBtYWludGFpbiBtaWxsaXNlY29uZCBwcmVjaXNpb24KLSAgICAgIHJldHVybiBOdW1iZXIo
ZGF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi19
KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBlbXB0eSA9IEVtYmVyLmlzRW1w
dHk7Ci0vKioKLSAgVGhlIGBEUy5OdW1iZXJUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2Vy
aWFsaXplIGFuZCBkZXNlcmlhbGl6ZQotICBudW1lcmljIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0
YSByZWNvcmQgb2JqZWN0cy4gVGhpcyB0cmFuc2Zvcm0gaXMKLSAgdXNlZCB3aGVuIGBudW1iZXJg
IGlzIHBhc3NlZCBhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgdG8gdGhlCi0gIFtEUy5hdHRyXSguLi8u
Li9kYXRhI21ldGhvZF9hdHRyKSBmdW5jdGlvbi4KLQotICBVc2FnZQotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgdmFyIGF0dHIgPSBEUy5hdHRyOwotICBBcHAuU2NvcmUgPSBEUy5Nb2RlbC5leHRlbmQo
ewotICAgIHZhbHVlOiBhdHRyKCdudW1iZXInKSwKLSAgICBwbGF5ZXI6IERTLmJlbG9uZ3NUbygn
cGxheWVyJyksCi0gICAgZGF0ZTogYXR0cignZGF0ZScpCi0gIH0pOwotICBgYGAKLQotICBAY2xh
c3MgTnVtYmVyVHJhbnNmb3JtCi0gIEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNl
IERTCi0gKi8KLURTLk51bWJlclRyYW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQoewotCi0g
IGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIGVtcHR5KHNl
cmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsKLSAgfSwKLQotICBzZXJpYWxp
emU6IGZ1bmN0aW9uKGRlc2VyaWFsaXplZCkgewotICAgIHJldHVybiBlbXB0eShkZXNlcmlhbGl6
ZWQpID8gbnVsbCA6IE51bWJlcihkZXNlcmlhbGl6ZWQpOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLXZhciBub25lID0gRW1iZXIuaXNOb25lOwotCi0vKioKLSAgVGhl
IGBEUy5TdHJpbmdUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNl
cmlhbGl6ZQotICBzdHJpbmcgYXR0cmlidXRlcyBvbiBFbWJlciBEYXRhIHJlY29yZCBvYmplY3Rz
LiBUaGlzIHRyYW5zZm9ybSBpcwotICB1c2VkIHdoZW4gYHN0cmluZ2AgaXMgcGFzc2VkIGFzIHRo
ZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKLSAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0
dHIpIGZ1bmN0aW9uLgotCi0gIFVzYWdlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgYXR0ciA9
IERTLmF0dHI7Ci0gIEFwcC5Vc2VyID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBpc0FkbWluOiBh
dHRyKCdib29sZWFuJyksCi0gICAgbmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgZW1haWw6IGF0
dHIoJ3N0cmluZycpCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgU3RyaW5nVHJhbnNmb3JtCi0g
IEBleHRlbmRzIERTLlRyYW5zZm9ybQotICBAbmFtZXNwYWNlIERTCi0gKi8KLURTLlN0cmluZ1Ry
YW5zZm9ybSA9IERTLlRyYW5zZm9ybS5leHRlbmQoewotCi0gIGRlc2VyaWFsaXplOiBmdW5jdGlv
bihzZXJpYWxpemVkKSB7Ci0gICAgcmV0dXJuIG5vbmUoc2VyaWFsaXplZCkgPyBudWxsIDogU3Ry
aW5nKHNlcmlhbGl6ZWQpOwotICB9LAotCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxp
emVkKSB7Ci0gICAgcmV0dXJuIG5vbmUoZGVzZXJpYWxpemVkKSA/IG51bGwgOiBTdHJpbmcoZGVz
ZXJpYWxpemVkKTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSov
Ci0KLXZhciBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qCi0gIFRoaXMgY29kZSByZWdpc3RlcnMgYW4g
aW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlvbi4KLQotICBJZiBhbiBFbWJlci5qcyBkZXZl
bG9wZXIgZGVmaW5lcyBhIHN1YmNsYXNzIG9mIERTLlN0b3JlIG9uIHRoZWlyIGFwcGxpY2F0aW9u
LAotICB0aGlzIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlIGl0IGFuZCBtYWtl
IGl0IGF2YWlsYWJsZSBvbiB0aGUKLSAgcm91dGVyLgotCi0gIEFkZGl0aW9uYWxseSwgYWZ0ZXIg
YW4gYXBwbGljYXRpb24ncyBjb250cm9sbGVycyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHRoZXkgd2ls
bAotICBlYWNoIGhhdmUgdGhlIHN0b3JlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZW0uCi0KLSAgRm9y
IGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93
aW5nIGNsYXNzZXM6Ci0KLSAgQXBwLlN0b3JlID0gRFMuU3RvcmUuZXh0ZW5kKHsKLSAgICBhZGFw
dGVyOiAnY3VzdG9tJwotICB9KTsKLQotICBBcHAuUG9zdHNDb250cm9sbGVyID0gRW1iZXIuQXJy
YXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgLy8gLi4uCi0gIH0pOwotCi0gIFdoZW4gdGhlIGFw
cGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLCBgQXBwLlN0b3JlYCB3aWxsIGF1dG9tYXRpY2FsbHkg
YmUKLSAgaW5zdGFudGlhdGVkLCBhbmQgdGhlIGluc3RhbmNlIG9mIGBBcHAuUG9zdHNDb250cm9s
bGVyYCB3aWxsIGhhdmUgaXRzIGBzdG9yZWAKLSAgcHJvcGVydHkgc2V0IHRvIHRoYXQgaW5zdGFu
Y2UuCi0KLSAgTm90ZSB0aGF0IHRoaXMgY29kZSB3aWxsIG9ubHkgYmUgcnVuIGlmIHRoZSBgZW1i
ZXItYXBwbGljYXRpb25gIHBhY2thZ2UgaXMKLSAgbG9hZGVkLiBJZiBFbWJlciBEYXRhIGlzIGJl
aW5nIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgb3RoZXIgdGhhbiBhCi0gIHR5cGljYWwgYXBwbGlj
YXRpb24gKGUuZy4sIG5vZGUuanMgd2hlcmUgb25seSBgZW1iZXItcnVudGltZWAgaXMgYXZhaWxh
YmxlKSwKLSAgdGhpcyBjb2RlIHdpbGwgYmUgaWdub3JlZC4KLSovCi0KLUVtYmVyLm9uTG9hZCgn
RW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewotICBBcHBsaWNhdGlv
bi5pbml0aWFsaXplcih7Ci0gICAgbmFtZTogInN0b3JlIiwKLQotICAgIGluaXRpYWxpemU6IGZ1
bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lz
dGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRpb24uU3RvcmUgfHwgRFMuU3RvcmUpOwotCi0gICAg
ICAvLyBhbGxvdyBvbGRlciBuYW1lcyB0byBiZSBsb29rZWQgdXAKLQotICAgICAgdmFyIHByb3h5
ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7Ci0gICAgICBwcm94eS5yZWdpc3Rl
ckRlcHJlY2F0aW9ucyhbCi0gICAgICAgIHtkZXByZWNhdGVkOiAnc2VyaWFsaXplcjpfZGVmYXVs
dCcsICB2YWxpZDogJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnfSwKLSAgICAgICAge2RlcHJlY2F0ZWQ6
ICdzZXJpYWxpemVyOl9yZXN0JywgICAgIHZhbGlkOiAnc2VyaWFsaXplcjotcmVzdCd9LAotICAg
ICAgICB7ZGVwcmVjYXRlZDogJ2FkYXB0ZXI6X3Jlc3QnLCAgICAgICAgdmFsaWQ6ICdhZGFwdGVy
Oi1yZXN0J30KLSAgICAgIF0pOwotCi0gICAgICAvLyBuZXcgZ28gZm9yd2FyZCBwYXRocwotICAg
ICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnLCBEUy5KU09OU2Vy
aWFsaXplcik7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjotcmVzdCcs
IERTLlJFU1RTZXJpYWxpemVyKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVy
Oi1yZXN0JywgRFMuUkVTVEFkYXB0ZXIpOwotCi0gICAgICAvLyBFYWdlcmx5IGdlbmVyYXRlIHRo
ZSBzdG9yZSBzbyBkZWZhdWx0U3RvcmUgaXMgcG9wdWxhdGVkLgotICAgICAgLy8gVE9ETzogRG8g
dGhpcyBpbiBhIGZpbmlzaGVyIGhvb2sKLSAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3N0b3JlOm1h
aW4nKTsKLSAgICB9Ci0gIH0pOwotCi0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBu
YW1lOiAidHJhbnNmb3JtcyIsCi0gICAgYmVmb3JlOiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgYXBwbGljYXRpb24u
cmVnaXN0ZXIoJ3RyYW5zZm9ybTpib29sZWFuJywgRFMuQm9vbGVhblRyYW5zZm9ybSk7Ci0gICAg
ICBhcHBsaWNhdGlvbi5yZWdpc3RlcigndHJhbnNmb3JtOmRhdGUnLCBEUy5EYXRlVHJhbnNmb3Jt
KTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06bnVtYmVyJywgRFMuTnVt
YmVyVHJhbnNmb3JtKTsKLSAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06c3Ry
aW5nJywgRFMuU3RyaW5nVHJhbnNmb3JtKTsKLSAgICB9Ci0gIH0pOwotCi0gIEFwcGxpY2F0aW9u
LmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAiZGF0YS1hZGFwdGVyIiwKLSAgICBiZWZvcmU6ICJz
dG9yZSIsCi0KLSAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9u
KSB7Ci0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YS1hZGFwdGVyOm1haW4nLCBEUy5E
ZWJ1Z0FkYXB0ZXIpOwotICAgIH0KLSAgfSk7Ci0KLSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIo
ewotICAgIG5hbWU6ICJpbmplY3RTdG9yZSIsCi0gICAgYmVmb3JlOiAic3RvcmUiLAotCi0gICAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgYXBw
bGljYXRpb24uaW5qZWN0KCdjb250cm9sbGVyJywgJ3N0b3JlJywgJ3N0b3JlOm1haW4nKTsKLSAg
ICAgIGFwcGxpY2F0aW9uLmluamVjdCgncm91dGUnLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwot
ICAgICAgYXBwbGljYXRpb24uaW5qZWN0KCdzZXJpYWxpemVyJywgJ3N0b3JlJywgJ3N0b3JlOm1h
aW4nKTsKLSAgICAgIGFwcGxpY2F0aW9uLmluamVjdCgnZGF0YS1hZGFwdGVyJywgJ3N0b3JlJywg
J3N0b3JlOm1haW4nKTsKLSAgICB9Ci0gIH0pOwotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLS8qKgotICBEYXRlLnBh
cnNlIHdpdGggcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQgZm9yIElTTyA4NjAxIDxodHRwczovL2dp
dGh1Yi5jb20vY3Nub3Zlci9qcy1pc284NjAxPgotCi0gIMKpIDIwMTEgQ29saW4gU25vdmVyIDxo
dHRwOi8vemV0YWZsZWV0LmNvbT4KLQotICBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS4KLQot
ICBAY2xhc3MgRGF0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBzdGF0aWMKLSovCi1FbWJlci5E
YXRlID0gRW1iZXIuRGF0ZSB8fCB7fTsKLQotdmFyIG9yaWdQYXJzZSA9IERhdGUucGFyc2UsIG51
bWVyaWNLZXlzID0gWyAxLCA0LCA1LCA2LCA3LCAxMCwgMTEgXTsKLQotLyoqCi0gIEBtZXRob2Qg
cGFyc2UKLSAgQHBhcmFtIGRhdGUKLSovCi1FbWJlci5EYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRh
dGUpIHsKLSAgICB2YXIgdGltZXN0YW1wLCBzdHJ1Y3QsIG1pbnV0ZXNPZmZzZXQgPSAwOwotCi0g
ICAgLy8gRVM1IMKnMTUuOS40LjIgc3RhdGVzIHRoYXQgdGhlIHN0cmluZyBzaG91bGQgYXR0ZW1w
dCB0byBiZSBwYXJzZWQgYXMgYSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdCBzdHJpbmcKLSAgICAv
LyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGFueSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRl
IHBhcnNpbmcsIHNvIHRoYXTigJlzIHdoYXQgd2UgZG8sIGV2ZW4gaWYgbmF0aXZlCi0gICAgLy8g
aW1wbGVtZW50YXRpb25zIGNvdWxkIGJlIGZhc3RlcgotICAgIC8vICAgICAgICAgICAgICAxIFlZ
WVkgICAgICAgICAgICAgICAgMiBNTSAgICAgICAzIEREICAgICAgICAgICA0IEhIICAgIDUgbW0g
ICAgICAgNiBzcyAgICAgICAgNyBtc2VjICAgICAgICA4IFogOSDCsSAgICAxMCB0ekhIICAgIDEx
IHR6bW0KLSAgICBpZiAoKHN0cnVjdCA9IC9eKFxkezR9fFsrXC1dXGR7Nn0pKD86LShcZHsyfSko
PzotKFxkezJ9KSk/KT8oPzpUKFxkezJ9KTooXGR7Mn0pKD86OihcZHsyfSkoPzpcLihcZHszfSkp
Pyk/KD86KFopfChbK1wtXSkoXGR7Mn0pKD86OihcZHsyfSkpPyk/KT8kLy5leGVjKGRhdGUpKSkg
ewotICAgICAgICAvLyBhdm9pZCBOYU4gdGltZXN0YW1wcyBjYXVzZWQgYnkg4oCcdW5kZWZpbmVk
4oCdIHZhbHVlcyBiZWluZyBwYXNzZWQgdG8gRGF0ZS5VVEMKLSAgICAgICAgZm9yICh2YXIgaSA9
IDAsIGs7IChrID0gbnVtZXJpY0tleXNbaV0pOyArK2kpIHsKLSAgICAgICAgICAgIHN0cnVjdFtr
XSA9ICtzdHJ1Y3Rba10gfHwgMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFsbG93IHVuZGVm
aW5lZCBkYXlzIGFuZCBtb250aHMKLSAgICAgICAgc3RydWN0WzJdID0gKCtzdHJ1Y3RbMl0gfHwg
MSkgLSAxOwotICAgICAgICBzdHJ1Y3RbM10gPSArc3RydWN0WzNdIHx8IDE7Ci0KLSAgICAgICAg
aWYgKHN0cnVjdFs4XSAhPT0gJ1onICYmIHN0cnVjdFs5XSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAg
ICAgICAgICBtaW51dGVzT2Zmc2V0ID0gc3RydWN0WzEwXSAqIDYwICsgc3RydWN0WzExXTsKLQot
ICAgICAgICAgICAgaWYgKHN0cnVjdFs5XSA9PT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgbWlu
dXRlc09mZnNldCA9IDAgLSBtaW51dGVzT2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5VVEMoc3RydWN0WzFdLCBzdHJ1Y3RbMl0sIHN0
cnVjdFszXSwgc3RydWN0WzRdLCBzdHJ1Y3RbNV0gKyBtaW51dGVzT2Zmc2V0LCBzdHJ1Y3RbNl0s
IHN0cnVjdFs3XSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB0aW1lc3RhbXAgPSBvcmln
UGFyc2UgPyBvcmlnUGFyc2UoZGF0ZSkgOiBOYU47Ci0gICAgfQotCi0gICAgcmV0dXJuIHRpbWVz
dGFtcDsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5EYXRlKSB7Ci0gIERhdGUucGFyc2UgPSBFbWJlci5EYXRlLnBh
cnNlOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQSByZWNvcmQgYXJyYXkgaXMgYW4g
YXJyYXkgdGhhdCBjb250YWlucyByZWNvcmRzIG9mIGEgY2VydGFpbiB0eXBlLiBUaGUgcmVjb3Jk
Ci0gIGFycmF5IG1hdGVyaWFsaXplcyByZWNvcmRzIGFzIG5lZWRlZCB3aGVuIHRoZXkgYXJlIHJl
dHJpZXZlZCBmb3IgdGhlIGZpcnN0Ci0gIHRpbWUuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSByZWNv
cmQgYXJyYXlzIHlvdXJzZWxmLiBJbnN0ZWFkLCBhbiBpbnN0YW5jZSBvZgotICBgRFMuUmVjb3Jk
QXJyYXlgIG9yIGl0cyBzdWJjbGFzc2VzIHdpbGwgYmUgcmV0dXJuZWQgYnkgeW91ciBhcHBsaWNh
dGlvbidzIHN0b3JlCi0gIGluIHJlc3BvbnNlIHRvIHF1ZXJpZXMuCi0KLSAgQGNsYXNzIFJlY29y
ZEFycmF5Ci0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIuQXJyYXlQcm94eQotICBA
dXNlcyBFbWJlci5FdmVudGVkCi0qLwotCi1EUy5SZWNvcmRBcnJheSA9IEVtYmVyLkFycmF5UHJv
eHkuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLSAgLyoqCi0gICAgVGhlIG1vZGVsIHR5cGUgY29u
dGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5LgotCi0gICAgQHByb3BlcnR5IHR5cGUKLSAgICBA
dHlwZSBEUy5Nb2RlbAotICAqLwotICB0eXBlOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBhcnJh
eSBvZiBjbGllbnQgaWRzIGJhY2tpbmcgdGhlIHJlY29yZCBhcnJheS4gV2hlbiBhCi0gICAgcmVj
b3JkIGlzIHJlcXVlc3RlZCBmcm9tIHRoZSByZWNvcmQgYXJyYXksIHRoZSByZWNvcmQKLSAgICBm
b3IgdGhlIGNsaWVudCBpZCBhdCB0aGUgc2FtZSBpbmRleCBpcyBtYXRlcmlhbGl6ZWQsIGlmCi0g
ICAgbmVjZXNzYXJ5LCBieSB0aGUgc3RvcmUuCi0KLSAgICBAcHJvcGVydHkgY29udGVudAotICAg
IEBwcml2YXRlCi0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAgKi8KLSAgY29udGVudDogbnVsbCwK
LQotICAvKioKLSAgICBUaGUgZmxhZyB0byBzaWduYWwgYSBgUmVjb3JkQXJyYXlgIGlzIGN1cnJl
bnRseSBsb2FkaW5nIGRhdGEuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIHBlb3BsZSA9IHN0b3JlLmFsbChBcHAuUGVyc29uKTsKLSAgICBwZW9wbGUuZ2V0KCdp
c0xvYWRlZCcpOyAvLyB0cnVlCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkZWQKLSAg
ICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGlzTG9hZGVkOiBmYWxzZSwKLSAgLyoqCi0gICAgVGhl
IGZsYWcgdG8gc2lnbmFsIGEgYFJlY29yZEFycmF5YCBpcyBjdXJyZW50bHkgbG9hZGluZyBkYXRh
LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwZW9wbGUgPSBz
dG9yZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBm
YWxzZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7
IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBpc1VwZGF0aW5nCi0gICAgQHR5cGUg
Qm9vbGVhbgotICAqLwotICBpc1VwZGF0aW5nOiBmYWxzZSwKLQotICAvKioKLSAgICBUaGUgc3Rv
cmUgdGhhdCBjcmVhdGVkIHRoaXMgcmVjb3JkIGFycmF5LgotCi0gICAgQHByb3BlcnR5IHN0b3Jl
Ci0gICAgQHByaXZhdGUKLSAgICBAdHlwZSBEUy5TdG9yZQotICAqLwotICBzdG9yZTogbnVsbCwK
LQotICAvKioKLSAgICBSZXRyaWV2ZXMgYW4gb2JqZWN0IGZyb20gdGhlIGNvbnRlbnQgYnkgaW5k
ZXguCi0KLSAgICBAbWV0aG9kIG9iamVjdEF0Q29udGVudAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtOdW1iZXJ9IGluZGV4Ci0gICAgQHJldHVybiB7RFMuTW9kZWx9IHJlY29yZAotICAqLwot
ICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBn
ZXQodGhpcywgJ2NvbnRlbnQnKTsKLQotICAgIHJldHVybiBjb250ZW50Lm9iamVjdEF0KGluZGV4
KTsKLSAgfSwKLQotICAvKioKLSAgICBVc2VkIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2Yg
YWxsIG9mIHRoZSByZWNvcmRzIGluIHRoaXMgYXJyYXkKLSAgICBmcm9tIHRoZSBhZGFwdGVyLgot
Ci0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwZW9wbGUgPSBzdG9y
ZS5hbGwoQXBwLlBlcnNvbik7Ci0gICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBmYWxz
ZQotICAgIHBlb3BsZS51cGRhdGUoKTsKLSAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7IC8v
IHRydWUKLSAgICBgYGAKLQotICAgIEBtZXRob2QgdXBkYXRlCi0gICovCi0gIHVwZGF0ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNVcGRhdGluZycpKSB7IHJldHVybjsgfQot
Ci0gICAgdmFyIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpLAotICAgICAgICB0eXBlID0gZ2V0
KHRoaXMsICd0eXBlJyk7Ci0KLSAgICByZXR1cm4gc3RvcmUuZmV0Y2hBbGwodHlwZSwgdGhpcyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBhIHJlY29yZCB0byB0aGUgYFJlY29yZEFycmF5YC4K
LQotICAgIEBtZXRob2QgYWRkUmVjb3JkCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0RTLk1v
ZGVsfSByZWNvcmQKLSAgKi8KLSAgYWRkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICBn
ZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3QocmVjb3JkKTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZW1vdmVzIGEgcmVjb3JkIHRvIHRoZSBgUmVjb3JkQXJyYXlgLgotCi0gICAgQG1ldGhvZCBy
ZW1vdmVSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAot
ICAqLwotICByZW1vdmVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGdldCh0aGlzLCAn
Y29udGVudCcpLnJlbW92ZU9iamVjdChyZWNvcmQpOwotICB9LAotCi0gIC8qKgotICAgIFNhdmVz
IGFsbCBvZiB0aGUgcmVjb3JkcyBpbiB0aGUgYFJlY29yZEFycmF5YC4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgbWVzc2FnZXMgPSBzdG9yZS5hbGwoQXBwLk1l
c3NhZ2UpOwotICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkgewotICAgICAg
bWVzc2FnZS5zZXQoJ2hhc0JlZW5TZWVuJywgdHJ1ZSk7Ci0gICAgfSk7Ci0gICAgbWVzc2FnZXMu
c2F2ZSgpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzYXZlCi0gICAgQHJldHVybiB7RFMuUHJv
bWlzZUFycmF5fSBwcm9taXNlCi0gICovCi0gIHNhdmU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBw
cm9taXNlTGFiZWwgPSAiRFM6IFJlY29yZEFycmF5I3NhdmUgIiArIGdldCh0aGlzLCAndHlwZScp
OwotICAgIHZhciBwcm9taXNlID0gRW1iZXIuUlNWUC5hbGwodGhpcy5pbnZva2UoInNhdmUiKSwg
cHJvbWlzZUxhYmVsKS50aGVuKGZ1bmN0aW9uKGFycmF5KSB7Ci0gICAgICByZXR1cm4gRW1iZXIu
QShhcnJheSk7Ci0gICAgfSwgbnVsbCwgIkRTOiBSZWNvcmRBcnJheSNzYXZlIGFwcGx5IEVtYmVy
Lk5hdGl2ZUFycmF5Iik7Ci0KLSAgICByZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHBy
b21pc2U6IHByb21pc2UgfSk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldDsK
LQotLyoqCi0gIFJlcHJlc2VudHMgYSBsaXN0IG9mIHJlY29yZHMgd2hvc2UgbWVtYmVyc2hpcCBp
cyBkZXRlcm1pbmVkIGJ5IHRoZQotICBzdG9yZS4gQXMgcmVjb3JkcyBhcmUgY3JlYXRlZCwgbG9h
ZGVkLCBvciBtb2RpZmllZCwgdGhlIHN0b3JlCi0gIGV2YWx1YXRlcyB0aGVtIHRvIGRldGVybWlu
ZSBpZiB0aGV5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQKLSAgYXJyYXkuCi0KLSAgQGNs
YXNzIEZpbHRlcmVkUmVjb3JkQXJyYXkKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5S
ZWNvcmRBcnJheQotKi8KLURTLkZpbHRlcmVkUmVjb3JkQXJyYXkgPSBEUy5SZWNvcmRBcnJheS5l
eHRlbmQoewotICAvKioKLSAgICBUaGUgZmlsdGVyRnVuY3Rpb24gaXMgYSBmdW5jdGlvbiB1c2Vk
IHRvIHRlc3QgcmVjb3JkcyBmcm9tIHRoZSBzdG9yZSB0bwotICAgIGRldGVybWluZSBpZiB0aGV5
IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSByZWNvcmQgYXJyYXkuCi0KLSAgICBFeGFtcGxlCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFsbFBlb3BsZSA9IHN0b3JlLmFsbCgncGVyc29uJyk7
Ci0gICAgYWxsUGVvcGxlLm1hcEJ5KCduYW1lJyk7IC8vIFsiVG9tIERhbGUiLCAiWWVodWRhIEth
dHoiLCAiVHJlayBHbG93YWNraSJdCi0KLSAgICB2YXIgcGVvcGxlID0gc3RvcmUuZmlsdGVyKCdw
ZXJzb24nLCBmdW5jdGlvbihwZXJzb24pIHsKLSAgICAgIGlmIChwZXJzb24uZ2V0KCduYW1lJyku
bWF0Y2goL0thdHokLykpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB9KTsKLSAgICBwZW9wbGUubWFw
QnkoJ25hbWUnKTsgLy8gWyJZZWh1ZGEgS2F0eiJdCi0KLSAgICB2YXIgbm90S2F0ekZpbHRlciA9
IGZ1bmN0aW9uKHBlcnNvbikgewotICAgICAgcmV0dXJuICFwZXJzb24uZ2V0KCduYW1lJykubWF0
Y2goL0thdHokLyk7Ci0gICAgfTsKLSAgICBwZW9wbGUuc2V0KCdmaWx0ZXJGdW5jdGlvbicsIG5v
dEthdHpGaWx0ZXIpOwotICAgIHBlb3BsZS5tYXBCeSgnbmFtZScpOyAvLyBbIlRvbSBEYWxlIiwg
IlRyZWsgR2xvd2Fja2kiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBmaWx0ZXJGdW5jdGlvbgot
ICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVl
YCBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbiB0aGUgYXJyYXkKLSAgKi8KLSAgZmlsdGVyRnVu
Y3Rpb246IG51bGwsCi0gIGlzTG9hZGVkOiB0cnVlLAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKCkg
ewotICAgIHZhciB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJykudG9TdHJpbmcoKTsKLSAgICB0aHJv
dyBuZXcgRXJyb3IoIlRoZSByZXN1bHQgb2YgYSBjbGllbnQtc2lkZSBmaWx0ZXIgKG9uICIgKyB0
eXBlICsgIikgaXMgaW1tdXRhYmxlLiIpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdXBk
YXRlRmlsdGVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgdXBkYXRlRmlsdGVyOiBFbWJlci5vYnNl
cnZlcihmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFuYWdlciA9IGdldCh0aGlzLCAnbWFuYWdlcicp
OwotICAgIG1hbmFnZXIudXBkYXRlRmlsdGVyKHRoaXMsIGdldCh0aGlzLCAndHlwZScpLCBnZXQo
dGhpcywgJ2ZpbHRlckZ1bmN0aW9uJykpOwotICB9LCAnZmlsdGVyRnVuY3Rpb24nKQotfSk7Ci0K
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBSZXBy
ZXNlbnRzIGFuIG9yZGVyZWQgbGlzdCBvZiByZWNvcmRzIHdob3NlIG9yZGVyIGFuZCBtZW1iZXJz
aGlwIGlzCi0gIGRldGVybWluZWQgYnkgdGhlIGFkYXB0ZXIuIEZvciBleGFtcGxlLCBhIHF1ZXJ5
IHNlbnQgdG8gdGhlIGFkYXB0ZXIKLSAgbWF5IHRyaWdnZXIgYSBzZWFyY2ggb24gdGhlIHNlcnZl
ciwgd2hvc2UgcmVzdWx0cyB3b3VsZCBiZSBsb2FkZWQKLSAgaW50byBhbiBpbnN0YW5jZSBvZiB0
aGUgYEFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheWAuCi0KLSAgQGNsYXNzIEFkYXB0ZXJQb3B1
bGF0ZWRSZWNvcmRBcnJheQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIERTLlJlY29yZEFy
cmF5Ci0qLwotRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5ID0gRFMuUmVjb3JkQXJyYXku
ZXh0ZW5kKHsKLSAgcXVlcnk6IG51bGwsCi0KLSAgcmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0cmluZygpOwotICAgIHRocm93IG5ldyBF
cnJvcigiVGhlIHJlc3VsdCBvZiBhIHNlcnZlciBxdWVyeSAob24gIiArIHR5cGUgKyAiKSBpcyBp
bW11dGFibGUuIik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkCi0gICAgQHByaXZh
dGUKLSAgICBAcGFyYW0ge0FycmF5fSBkYXRhCi0gICovCi0gIGxvYWQ6IGZ1bmN0aW9uKGRhdGEp
IHsKLSAgICB2YXIgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAgIHR5cGUgPSBn
ZXQodGhpcywgJ3R5cGUnKSwKLSAgICAgICAgcmVjb3JkcyA9IHN0b3JlLnB1c2hNYW55KHR5cGUs
IGRhdGEpLAotICAgICAgICBtZXRhID0gc3RvcmUubWV0YWRhdGFGb3IodHlwZSk7Ci0KLSAgICB0
aGlzLnNldFByb3BlcnRpZXMoewotICAgICAgY29udGVudDogRW1iZXIuQShyZWNvcmRzKSwKLSAg
ICAgIGlzTG9hZGVkOiB0cnVlLAotICAgICAgbWV0YTogbWV0YQotICAgIH0pOwotCi0gICAgLy8g
VE9ETzogZG9lcyB0cmlnZ2VyaW5nIGRpZExvYWQgZXZlbnQgc2hvdWxkIGJlIHRoZSBsYXN0IGFj
dGlvbiBvZiB0aGUgcnVuTG9vcD8KLSAgICBFbWJlci5ydW4ub25jZSh0aGlzLCAndHJpZ2dlcics
ICdkaWRMb2FkJyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoq
Ci0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g
RW1iZXIuc2V0OwotdmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Ci0KLS8qKgot
ICBBIGBNYW55QXJyYXlgIGlzIGEgYFJlY29yZEFycmF5YCB0aGF0IHJlcHJlc2VudHMgdGhlIGNv
bnRlbnRzIG9mIGEgaGFzLW1hbnkKLSAgcmVsYXRpb25zaGlwLgotCi0gIFRoZSBgTWFueUFycmF5
YCBpcyBpbnN0YW50aWF0ZWQgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIHRoZSByZWxhdGlvbnNoaXAg
aXMKLSAgcmVxdWVzdGVkLgotCi0gICMjIyBJbnZlcnNlcwotCi0gIE9mdGVuLCB0aGUgcmVsYXRp
b25zaGlwcyBpbiBFbWJlciBEYXRhIGFwcGxpY2F0aW9ucyB3aWxsIGhhdmUKLSAgYW4gaW52ZXJz
ZS4gRm9yIGV4YW1wbGUsIGltYWdpbmUgdGhlIGZvbGxvd2luZyBtb2RlbHMgYXJlCi0gIGRlZmlu
ZWQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUG9zdCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgY29tbWVudHM6IERTLmhhc01hbnkoJ2NvbW1lbnQnKQotICB9KTsKLQotICBBcHAuQ29tbWVu
dCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgcG9zdDogRFMuYmVsb25nc1RvKCdwb3N0JykKLSAg
fSk7Ci0gIGBgYAotCi0gIElmIHlvdSBjcmVhdGVkIGEgbmV3IGluc3RhbmNlIG9mIGBBcHAuUG9z
dGAgYW5kIGFkZGVkCi0gIGEgYEFwcC5Db21tZW50YCByZWNvcmQgdG8gaXRzIGBjb21tZW50c2Ag
aGFzLW1hbnkKLSAgcmVsYXRpb25zaGlwLCB5b3Ugd291bGQgZXhwZWN0IHRoZSBjb21tZW50J3Mg
YHBvc3RgCi0gIHByb3BlcnR5IHRvIGJlIHNldCB0byB0aGUgcG9zdCB0aGF0IGNvbnRhaW5lZAot
ICB0aGUgaGFzLW1hbnkuCi0KLSAgV2UgY2FsbCB0aGUgcmVjb3JkIHRvIHdoaWNoIGEgcmVsYXRp
b25zaGlwIGJlbG9uZ3MgdGhlCi0gIHJlbGF0aW9uc2hpcCdzIF9vd25lcl8uCi0KLSAgQGNsYXNz
IE1hbnlBcnJheQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIERTLlJlY29yZEFycmF5Ci0q
LwotRFMuTWFueUFycmF5ID0gRFMuUmVjb3JkQXJyYXkuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jID0gRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgfSwKLQotICAv
KioKLSAgICBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0KLSAgICBAcHJv
cGVydHkge1N0cmluZ30gbmFtZQotICAgIEBwcml2YXRlCi0gICovCi0gIG5hbWU6IG51bGwsCi0K
LSAgLyoqCi0gICAgVGhlIHJlY29yZCB0byB3aGljaCB0aGlzIHJlbGF0aW9uc2hpcCBiZWxvbmdz
LgotCi0gICAgQHByb3BlcnR5IHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcHJpdmF0ZQotICAqLwot
ICBvd25lcjogbnVsbCwKLQotICAvKioKLSAgICBgdHJ1ZWAgaWYgdGhlIHJlbGF0aW9uc2hpcCBp
cyBwb2x5bW9ycGhpYywgYGZhbHNlYCBvdGhlcndpc2UuCi0KLSAgICBAcHJvcGVydHkge0Jvb2xl
YW59IGlzUG9seW1vcnBoaWMKLSAgICBAcHJpdmF0ZQotICAqLwotICBpc1BvbHltb3JwaGljOiBm
YWxzZSwKLQotICAvLyBMT0FESU5HIFNUQVRFCi0KLSAgaXNMb2FkZWQ6IGZhbHNlLAotCi0gIC8q
KgotICAgIFVzZWQgZm9yIGFzeW5jIGBoYXNNYW55YCBhcnJheXMKLSAgICB0byBrZWVwIHRyYWNr
IG9mIHdoZW4gdGhleSB3aWxsIHJlc29sdmUuCi0KLSAgICBAcHJvcGVydHkge0VtYmVyLlJTVlAu
UHJvbWlzZX0gcHJvbWlzZQotICAgIEBwcml2YXRlCi0gICovCi0gIHByb21pc2U6IG51bGwsCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkaW5nUmVjb3Jkc0NvdW50Ci0gICAgQHBhcmFtIHtOdW1i
ZXJ9IGNvdW50Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgbG9hZGluZ1JlY29yZHNDb3VudDogZnVu
Y3Rpb24oY291bnQpIHsKLSAgICB0aGlzLmxvYWRpbmdSZWNvcmRzQ291bnQgPSBjb3VudDsKLSAg
fSwKLQotICAvKioKLSAgICBAbWV0aG9kIGxvYWRlZFJlY29yZAotICAgIEBwcml2YXRlCi0gICov
Ci0gIGxvYWRlZFJlY29yZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5sb2FkaW5nUmVjb3Jkc0Nv
dW50LS07Ci0gICAgaWYgKHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9PT0gMCkgewotICAgICAg
c2V0KHRoaXMsICdpc0xvYWRlZCcsIHRydWUpOwotICAgICAgdGhpcy50cmlnZ2VyKCdkaWRMb2Fk
Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmV0Y2gKLSAgICBAcHJpdmF0
ZQotICAqLwotICBmZXRjaDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlY29yZHMgPSBnZXQodGhp
cywgJ2NvbnRlbnQnKSwKLSAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAg
ICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICByZXNvbHZlciA9IEVtYmVy
LlJTVlAuZGVmZXIoIkRTOiBNYW55QXJyYXkjZmV0Y2ggIiArIGdldCh0aGlzLCAndHlwZScpKTsK
LQotICAgIHZhciB1bmxvYWRlZFJlY29yZHMgPSByZWNvcmRzLmZpbHRlclByb3BlcnR5KCdpc0Vt
cHR5JywgdHJ1ZSk7Ci0gICAgc3RvcmUuZmV0Y2hNYW55KHVubG9hZGVkUmVjb3Jkcywgb3duZXIs
IHJlc29sdmVyKTsKLSAgfSwKLQotICAvLyBPdmVycmlkZXMgRW1iZXIuQXJyYXkncyByZXBsYWNl
IG1ldGhvZCB0byBpbXBsZW1lbnQKLSAgcmVwbGFjZUNvbnRlbnQ6IGZ1bmN0aW9uKGluZGV4LCBy
ZW1vdmVkLCBhZGRlZCkgewotICAgIC8vIE1hcCB0aGUgYXJyYXkgb2YgcmVjb3JkIG9iamVjdHMg
aW50byBhbiBhcnJheSBvZiAgY2xpZW50IGlkcy4KLSAgICBhZGRlZCA9IG1hcChhZGRlZCwgZnVu
Y3Rpb24ocmVjb3JkKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgYWRkICciICsg
cmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcmVsYXRpb25z
aGlwIChvbmx5ICciICsgdGhpcy50eXBlLnR5cGVLZXkgKyAiJyBhbGxvd2VkKSIsICF0aGlzLnR5
cGUgfHwgcmVjb3JkIGluc3RhbmNlb2YgdGhpcy50eXBlKTsKLSAgICAgIHJldHVybiByZWNvcmQ7
Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICB0aGlzLl9zdXBlcihpbmRleCwgcmVtb3ZlZCwgYWRkZWQp
OwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAg
RW1iZXIucnVuLm9uY2UodGhpcywgJ2ZldGNoJyk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50V2ls
bENoYW5nZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZWQsIGFkZGVkKSB7Ci0gICAgdmFyIG93bmVy
ID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICBuYW1lID0gZ2V0KHRoaXMsICduYW1lJyk7
Ci0KLSAgICBpZiAoIW93bmVyLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAvLyBU
aGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2YgY29kZSB0aGF0IGNvbnRpbnVlcyBpbnNpZGUK
LSAgICAgIC8vIG9mIGFycmF5Q29udGVudERpZENoYW5nZS4gSXQgZ2V0cyBvciBjcmVhdGVzIGEg
Y2hhbmdlIGZyb20KLSAgICAgIC8vIHRoZSBjaGlsZCBvYmplY3QsIGFkZHMgdGhlIGN1cnJlbnQg
b3duZXIgYXMgdGhlIG9sZAotICAgICAgLy8gcGFyZW50IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRp
bWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAotICAgICAgLy8gZnJvbSBhIE1hbnlBcnJheSwgYW5k
IHNldHMgYG5ld1BhcmVudGAgdG8gbnVsbC4KLSAgICAgIC8vCi0gICAgICAvLyBMYXRlciwgaWYg
dGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVyIE1hbnlBcnJheSwKLSAgICAgIC8vIHRoZSBg
YXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3aWxsIHNldCBgbmV3UGFyZW50YCBvbgotICAgICAgLy8g
dGhlIGNoYW5nZS4KLSAgICAgIGZvciAodmFyIGk9aW5kZXg7IGk8aW5kZXgrcmVtb3ZlZDsgaSsr
KSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChp
KTsKLQotICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNo
YW5nZShvd25lciwgcmVjb3JkLCBnZXQodGhpcywgJ3N0b3JlJyksIHsKLSAgICAgICAgICBwYXJl
bnRUeXBlOiBvd25lci5jb25zdHJ1Y3RvciwKLSAgICAgICAgICBjaGFuZ2VUeXBlOiAicmVtb3Zl
IiwKLSAgICAgICAgICBraW5kOiAiaGFzTWFueSIsCi0gICAgICAgICAga2V5OiBuYW1lCi0gICAg
ICAgIH0pOwotCi0gICAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuYWRkKGNoYW5nZSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7Ci0gIH0sCi0KLSAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihpbmRleCwgcmVt
b3ZlZCwgYWRkZWQpIHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwot
Ci0gICAgdmFyIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAotICAgICAgICBuYW1lID0gZ2V0
KHRoaXMsICduYW1lJyksCi0gICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdzdG9yZScpOwotCi0g
ICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcykgewotICAgICAgLy8gVGhpcyBj
b2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBjb2RlIHRoYXQgc3RhcnRlZCBpbgotICAgICAgLy8g
YGFycmF5Q29udGVudFdpbGxDaGFuZ2VgLiBJdCBnZXRzIG9yIGNyZWF0ZXMgYSBjaGFuZ2UKLSAg
ICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwgYW5kIGFkZHMgdGhlIGN1cnJlbnQgb3duZXIg
YXMKLSAgICAgIC8vIHRoZSBuZXcgcGFyZW50LgotICAgICAgZm9yICh2YXIgaT1pbmRleDsgaTxp
bmRleCthZGRlZDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2NvbnRl
bnQnKS5vYmplY3RBdChpKTsKLQotICAgICAgICB2YXIgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlw
Q2hhbmdlLmNyZWF0ZUNoYW5nZShvd25lciwgcmVjb3JkLCBzdG9yZSwgewotICAgICAgICAgIHBh
cmVudFR5cGU6IG93bmVyLmNvbnN0cnVjdG9yLAotICAgICAgICAgIGNoYW5nZVR5cGU6ICJhZGQi
LAotICAgICAgICAgIGtpbmQ6Imhhc01hbnkiLAotICAgICAgICAgIGtleTogbmFtZQotICAgICAg
ICB9KTsKLSAgICAgICAgY2hhbmdlLmhhc01hbnlOYW1lID0gbmFtZTsKLQotICAgICAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2UpOwotICAgICAgfQotCi0gICAgICAvLyBXZSB3YWl0
IHVudGlsIHRoZSBhcnJheSBoYXMgZmluaXNoZWQgYmVpbmcKLSAgICAgIC8vIG11dGF0ZWQgYmVm
b3JlIHN5bmNpbmcgdGhlIE9uZVRvTWFueUNoYW5nZXMgY3JlYXRlZAotICAgICAgLy8gaW4gYXJy
YXlDb250ZW50V2lsbENoYW5nZSwgc28gdGhhdCB0aGUgYXJyYXkKLSAgICAgIC8vIG1lbWJlcnNo
aXAgdGVzdCBpbiB0aGUgc3luYygpIGxvZ2ljIG9wZXJhdGVzCi0gICAgICAvLyBvbiB0aGUgZmlu
YWwgcmVzdWx0cy4KLSAgICAgIHRoaXMuX2NoYW5nZXNUb1N5bmMuZm9yRWFjaChmdW5jdGlvbihj
aGFuZ2UpIHsKLSAgICAgICAgY2hhbmdlLnN5bmMoKTsKLSAgICAgIH0pOwotCi0gICAgICB0aGlz
Ll9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIENyZWF0
ZSBhIGNoaWxkIHJlY29yZCB3aXRoaW4gdGhlIG93bmVyCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJl
Y29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgICBAcmV0dXJu
IHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24oaGFzaCkg
ewotICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKSwKLSAgICAgICAgc3RvcmUgPSBn
ZXQob3duZXIsICdzdG9yZScpLAotICAgICAgICB0eXBlID0gZ2V0KHRoaXMsICd0eXBlJyksCi0g
ICAgICAgIHJlY29yZDsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBhZGQgJyIgKyB0
eXBlLnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcG9seW1vcnBoaWMgcmVsYXRpb25zaGlw
LiIsICFnZXQodGhpcywgJ2lzUG9seW1vcnBoaWMnKSk7Ci0KLSAgICByZWNvcmQgPSBzdG9yZS5j
cmVhdGVSZWNvcmQuY2FsbChzdG9yZSwgdHlwZSwgaGFzaCk7Ci0gICAgdGhpcy5wdXNoT2JqZWN0
KHJlY29yZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9Ci0KLX0pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBFbWJlciovCi0vKmpzaGludCBlcW51bGw6
dHJ1ZSovCi0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgb25jZSA9IEVtYmVyLnJ1bi5vbmNlOwotdmFyIGlz
Tm9uZSA9IEVtYmVyLmlzTm9uZTsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2g7Ci12YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleE9mOwot
dmFyIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5tYXA7Ci12YXIgcmVzb2x2ZSA9IEVtYmVy
LlJTVlAucmVzb2x2ZTsKLXZhciBjb3B5ID0gRW1iZXIuY29weTsKLQotLy8gSW1wbGVtZW50b3Jz
IE5vdGU6Ci0vLwotLy8gICBUaGUgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBhcmUgY29uc2lzdGVu
dGx5IG5hbWVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCi0vLyAgIHNjaGVtZToKLS8vCi0v
LyAgICogK2lkKyBtZWFucyBhbiBpZGVudGlmaWVyIG1hbmFnZWQgYnkgYW4gZXh0ZXJuYWwgc291
cmNlLCBwcm92aWRlZCBpbnNpZGUKLS8vICAgICB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGF0IHNv
dXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJlIHN0cmluZ3MKLS8vICAgICBiZWZv
cmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LgotLy8gICAqICtjbGllbnRJZCsgbWVhbnMgYSB0cmFu
c2llbnQgbnVtZXJpY2FsIGlkZW50aWZpZXIgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkKLS8vICAg
ICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50IHByaW1hcmlseSBiZWNhdXNlIG5ld2x5
IGNyZWF0ZWQgb2JqZWN0cyBtYXkKLS8vICAgICBub3QgeWV0IGhhdmUgYW4gZXh0ZXJuYWxseSBn
ZW5lcmF0ZWQgaWQuCi0vLyAgICogK3JlZmVyZW5jZSsgbWVhbnMgYSByZWNvcmQgcmVmZXJlbmNl
IG9iamVjdCwgd2hpY2ggaG9sZHMgbWV0YWRhdGEgYWJvdXQgYQotLy8gICAgIHJlY29yZCwgZXZl
biBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IG1hdGVyaWFsaXplZC4KLS8vICAgKiArdHlw
ZSsgbWVhbnMgYSBzdWJjbGFzcyBvZiBEUy5Nb2RlbC4KLQotLy8gVXNlZCBieSB0aGUgc3RvcmUg
dG8gbm9ybWFsaXplIElEcyBlbnRlcmluZyB0aGUgc3RvcmUuICBEZXNwaXRlIHRoZSBmYWN0Ci0v
LyB0aGF0IGRldmVsb3BlcnMgbWF5IHByb3ZpZGUgSURzIGFzIG51bWJlcnMgKGUuZy4sIGBzdG9y
ZS5maW5kKFBlcnNvbiwgMSlgKSwKLS8vIGl0IGlzIGltcG9ydGFudCB0aGF0IGludGVybmFsbHkg
d2UgdXNlIHN0cmluZ3MsIHNpbmNlIElEcyBtYXkgYmUgc2VyaWFsaXplZAotLy8gYW5kIGxvc2Ug
dHlwZSBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBFbWJlcidzIHJvdXRlciBtYXkgcHV0IGEg
cmVjb3JkJ3MKLS8vIElEIGludG8gdGhlIFVSTCwgYW5kIGlmIHdlIGxhdGVyIHRyeSB0byBkZXNl
cmlhbGl6ZSB0aGF0IFVSTCBhbmQgZmluZCB0aGUKLS8vIGNvcnJlc3BvbmRpbmcgcmVjb3JkLCB3
ZSB3aWxsIG5vdCBrbm93IGlmIGl0IGlzIGEgc3RyaW5nIG9yIGEgbnVtYmVyLgotdmFyIGNvZXJj
ZUlkID0gZnVuY3Rpb24oaWQpIHsKLSAgcmV0dXJuIGlkID09IG51bGwgPyBudWxsIDogaWQrJyc7
Ci19OwotCi0vKioKLSAgVGhlIHN0b3JlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSBmb3IgcmVj
b3JkcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgotICBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZv
ciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYERTLk1vZGVsYCB0aGF0IHdyYXAKLSAgdGhlIGluZGl2
aWR1YWwgZGF0YSBmb3IgYSByZWNvcmQsIHNvIHRoYXQgdGhleSBjYW4gYmUgYm91bmQgdG8gaW4g
eW91cgotICBIYW5kbGViYXJzIHRlbXBsYXRlcy4KLQotICBEZWZpbmUgeW91ciBhcHBsaWNhdGlv
bidzIHN0b3JlIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIE15QXBwLlN0b3JlID0g
RFMuU3RvcmUuZXh0ZW5kKCk7Ci0gIGBgYAotCi0gIE1vc3QgRW1iZXIuanMgYXBwbGljYXRpb25z
IHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIGBEUy5TdG9yZWAgdGhhdCBpcwotICBhdXRvbWF0aWNh
bGx5IGNyZWF0ZWQgYnkgdGhlaXIgYEVtYmVyLkFwcGxpY2F0aW9uYC4KLQotICBZb3UgY2FuIHJl
dHJpZXZlIG1vZGVscyBmcm9tIHRoZSBzdG9yZSBpbiBzZXZlcmFsIHdheXMuIFRvIHJldHJpZXZl
IGEgcmVjb3JkCi0gIGZvciBhIHNwZWNpZmljIGlkLCB1c2UgYERTLlN0b3JlYCdzIGBmaW5kKClg
IG1ldGhvZDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBwZXJzb24gPSBzdG9yZS5maW5kKCdw
ZXJzb24nLCAxMjMpOwotICBgYGAKLQotICBJZiB5b3VyIGFwcGxpY2F0aW9uIGhhcyBtdWx0aXBs
ZSBgRFMuU3RvcmVgIGluc3RhbmNlcyAoYW4gdW51c3VhbCBjYXNlKSwgeW91IGNhbgotICBzcGVj
aWZ5IHdoaWNoIHN0b3JlIHNob3VsZCBiZSB1c2VkOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IHBlcnNvbiA9IHN0b3JlLmZpbmQoQXBwLlBlcnNvbiwgMTIzKTsKLSAgYGBgCi0KLSAgQnkgZGVm
YXVsdCwgdGhlIHN0b3JlIHdpbGwgdGFsayB0byB5b3VyIGJhY2tlbmQgdXNpbmcgYSBzdGFuZGFy
ZAotICBSRVNUIG1lY2hhbmlzbS4gWW91IGNhbiBjdXN0b21pemUgaG93IHRoZSBzdG9yZSB0YWxr
cyB0byB5b3VyCi0gIGJhY2tlbmQgYnkgc3BlY2lmeWluZyBhIGN1c3RvbSBhZGFwdGVyOgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgIE15QXBwLnN0b3JlID0gRFMuU3RvcmUuY3JlYXRlKHsKLSAgICAg
YWRhcHRlcjogJ015QXBwLkN1c3RvbUFkYXB0ZXInCi0gICB9KTsKLSAgIGBgYAotCi0gIFlvdSBj
YW4gbGVhcm4gbW9yZSBhYm91dCB3cml0aW5nIGEgY3VzdG9tIGFkYXB0ZXIgYnkgcmVhZGluZyB0
aGUgYERTLkFkYXB0ZXJgCi0gIGRvY3VtZW50YXRpb24uCi0KLSAgQGNsYXNzIFN0b3JlCi0gIEBu
YW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotRFMuU3RvcmUgPSBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAgICBAbWV0aG9kIGluaXQKLSAgICBAcHJpdmF0
ZQotICAqLwotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICAvLyBpbnRlcm5hbCBib29ra2VlcGlu
Zzsgbm90IG9ic2VydmFibGUKLSAgICB0aGlzLnR5cGVNYXBzID0ge307Ci0gICAgdGhpcy5yZWNv
cmRBcnJheU1hbmFnZXIgPSBEUy5SZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlKHsKLSAgICAgIHN0
b3JlOiB0aGlzCi0gICAgfSk7Ci0gICAgdGhpcy5fcmVsYXRpb25zaGlwQ2hhbmdlcyA9IHt9Owot
ICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGFkYXB0
ZXIgdG8gdXNlIHRvIGNvbW11bmljYXRlIHRvIGEgYmFja2VuZCBzZXJ2ZXIgb3Igb3RoZXIgcGVy
c2lzdGVuY2UgbGF5ZXIuCi0KLSAgICBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gaW5zdGFu
Y2UsIGNsYXNzLCBvciBzdHJpbmcuCi0KLSAgICBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGBBcHAu
Q3VzdG9tQWRhcHRlcmAgYXMgYSBzdHJpbmcsIGRvOgotCi0gICAgYGBganMKLSAgICBhZGFwdGVy
OiAnY3VzdG9tJwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGFkYXB0ZXIKLSAgICBAZGVmYXVs
dCBEUy5SRVNUQWRhcHRlcgotICAgIEB0eXBlIHtEUy5BZGFwdGVyfFN0cmluZ30KLSAgKi8KLSAg
YWRhcHRlcjogJy1yZXN0JywKLQotICAvKioKLSAgICBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRh
dGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIGEgY3VzdG9tCi0gICAgdHlwZS1zcGVjaWZpYyBzZXJp
YWxpemVyLCBpZiBvbmUgZXhpc3RzLgotCi0gICAgVGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZToK
LQotICAgICogYGluY2x1ZGVJZGA6IGB0cnVlYCBpZiB0aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJl
IGluY2x1ZGVkIGluCi0gICAgICB0aGUgSlNPTiByZXByZXNlbnRhdGlvbgotCi0gICAgQG1ldGhv
ZCBzZXJpYWxpemUKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZCB0
aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGFuIG9w
dGlvbnMgaGFzaAotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykg
ewotICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXJGb3IocmVjb3JkLmNvbnN0cnVjdG9yLnR5cGVL
ZXkpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMg
cHJvcGVydHkgcmV0dXJucyB0aGUgYWRhcHRlciwgYWZ0ZXIgcmVzb2x2aW5nIGEgcG9zc2libGUK
LSAgICBzdHJpbmcga2V5LgotCi0gICAgSWYgdGhlIHN1cHBsaWVkIGBhZGFwdGVyYCB3YXMgYSBj
bGFzcywgb3IgYSBTdHJpbmcgcHJvcGVydHkKLSAgICBwYXRoIHJlc29sdmVkIHRvIGEgY2xhc3Ms
IHRoaXMgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZSB0aGUKLSAgICBjbGFzcy4KLQotICAgIFRo
aXMgcHJvcGVydHkgaXMgY2FjaGVhYmxlLCBzbyB0aGUgc2FtZSBpbnN0YW5jZSBvZiBhIHNwZWNp
ZmllZAotICAgIGFkYXB0ZXIgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBsaWZldGltZSBv
ZiB0aGUgc3RvcmUuCi0KLSAgICBAcHJvcGVydHkgZGVmYXVsdEFkYXB0ZXIKLSAgICBAcHJpdmF0
ZQotICAgIEByZXR1cm5zIERTLkFkYXB0ZXIKLSAgKi8KLSAgZGVmYXVsdEFkYXB0ZXI6IEVtYmVy
LmNvbXB1dGVkKCdhZGFwdGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFkYXB0ZXIgPSBnZXQo
dGhpcywgJ2FkYXB0ZXInKTsKLQotICAgIEVtYmVyLmFzc2VydCgnWW91IHRyaWVkIHRvIHNldCBg
YWRhcHRlcmAgcHJvcGVydHkgdG8gYW4gaW5zdGFuY2Ugb2YgYERTLkFkYXB0ZXJgLCB3aGVyZSBp
dCBzaG91bGQgYmUgYSBuYW1lIG9yIGEgZmFjdG9yeScsICEoYWRhcHRlciBpbnN0YW5jZW9mIERT
LkFkYXB0ZXIpKTsKLQotICAgIGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ3N0cmluZycpIHsKLSAg
ICAgIGFkYXB0ZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyArIGFkYXB0ZXIp
IHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicpIHx8IHRoaXMu
Y29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjotcmVzdCcpOwotICAgIH0KLQotICAgIGlmIChEUy5B
ZGFwdGVyLmRldGVjdChhZGFwdGVyKSkgewotICAgICAgYWRhcHRlciA9IGFkYXB0ZXIuY3JlYXRl
KHsgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lciB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWRh
cHRlcjsKLSAgfSksCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gQ1JFQVRF
IE5FVyBSRUNPUkQgLgotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4KLQotICAvKioKLSAgICBD
cmVhdGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJyZW50IHN0b3JlLiBUaGUgcHJvcGVydGllcyBw
YXNzZWQKLSAgICB0byB0aGlzIG1ldGhvZCBhcmUgc2V0IG9uIHRoZSBuZXdseSBjcmVhdGVkIHJl
Y29yZC4KLQotICAgIFRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBgQXBwLlBvc3RgOgotCi0g
ICAgYGBganMKLSAgICBzdG9yZS5jcmVhdGVSZWNvcmQoJ3Bvc3QnLCB7Ci0gICAgICB0aXRsZTog
IlJhaWxzIGlzIG9tYWthc2UiCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNyZWF0
ZVJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHBy
b3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZQotICAgICAgbmV3bHkg
Y3JlYXRlZCByZWNvcmQuCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAg
Y3JlYXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0aWVzKSB7Ci0gICAgdHlwZSA9IHRo
aXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICBwcm9wZXJ0aWVzID0gY29weShwcm9wZXJ0aWVzKSB8
fCB7fTsKLQotICAgIC8vIElmIHRoZSBwYXNzZWQgcHJvcGVydGllcyBkbyBub3QgaW5jbHVkZSBh
IHByaW1hcnkga2V5LAotICAgIC8vIGdpdmUgdGhlIGFkYXB0ZXIgYW4gb3Bwb3J0dW5pdHkgdG8g
Z2VuZXJhdGUgb25lLiBUeXBpY2FsbHksCi0gICAgLy8gY2xpZW50LXNpZGUgSUQgZ2VuZXJhdG9y
cyB3aWxsIHVzZSBzb21ldGhpbmcgbGlrZSB1dWlkLmpzCi0gICAgLy8gdG8gYXZvaWQgY29uZmxp
Y3RzLgotCi0gICAgaWYgKGlzTm9uZShwcm9wZXJ0aWVzLmlkKSkgewotICAgICAgcHJvcGVydGll
cy5pZCA9IHRoaXMuX2dlbmVyYXRlSWQodHlwZSk7Ci0gICAgfQotCi0gICAgLy8gQ29lcmNlIElE
IHRvIGEgc3RyaW5nCi0gICAgcHJvcGVydGllcy5pZCA9IGNvZXJjZUlkKHByb3BlcnRpZXMuaWQp
OwotCi0gICAgdmFyIHJlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQodHlwZSwgcHJvcGVydGllcy5p
ZCk7Ci0KLSAgICAvLyBNb3ZlIHRoZSByZWNvcmQgb3V0IG9mIGl0cyBpbml0aWFsIGBlbXB0eWAg
c3RhdGUgaW50bwotICAgIC8vIHRoZSBgbG9hZGVkYCBzdGF0ZS4KLSAgICByZWNvcmQubG9hZGVk
RGF0YSgpOwotCi0gICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBvbiB0aGUgcmVj
b3JkLgotICAgIHJlY29yZC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0gICAgcmV0dXJu
IHJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBJZiBwb3NzaWJsZSwgdGhpcyBtZXRob2QgYXNr
cyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBhbiBJRCBmb3IKLSAgICBhIG5ld2x5IGNyZWF0ZWQg
cmVjb3JkLgotCi0gICAgQG1ldGhvZCBfZ2VuZXJhdGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJucyB7U3RyaW5nfSBpZiB0aGUgYWRhcHRlciBj
YW4gZ2VuZXJhdGUgb25lLCBhbiBJRAotICAqLwotICBfZ2VuZXJhdGVJZDogZnVuY3Rpb24odHlw
ZSkgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgaWYg
KGFkYXB0ZXIgJiYgYWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKSB7Ci0gICAgICByZXR1cm4g
YWRhcHRlci5nZW5lcmF0ZUlkRm9yUmVjb3JkKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiBu
dWxsOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIC4gREVMRVRFIFJFQ09S
RCAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBh
IHJlY29yZCBjYW4gYmUgZGVsZXRlZCB2aWEgdGhlIHN0b3JlLgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBwb3N0ID0gc3RvcmUuY3JlYXRlUmVjb3JkKCdwb3N0
JywgewotICAgICAgdGl0bGU6ICJSYWlscyBpcyBvbWFrYXNlIgotICAgIH0pOwotCi0gICAgc3Rv
cmUuZGVsZXRlUmVjb3JkKHBvc3QpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBkZWxldGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBm
dW5jdGlvbihyZWNvcmQpIHsKLSAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRm9yIHN5bW1ldHJ5LCBhIHJlY29yZCBjYW4gYmUgdW5sb2FkZWQgdmlhIHRoZSBz
dG9yZS4gT25seQotICAgIG5vbi1kaXJ0eSByZWNvcmRzIGNhbiBiZSB1bmxvYWRlZC4KLQotICAg
IEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS5maW5kKCdwb3N0JywgMSku
dGhlbihmdW5jdGlvbihwb3N0KSB7Ci0gICAgICBzdG9yZS51bmxvYWRSZWNvcmQocG9zdCk7Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVubG9hZFJlY29yZAotICAgIEBwYXJhbSB7
RFMuTW9kZWx9IHJlY29yZAotICAqLwotICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkg
ewotICAgIHJlY29yZC51bmxvYWRSZWNvcmQoKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4u
Li4uCi0gIC8vIC4gRklORCBSRUNPUkRTIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLgotCi0gIC8q
KgotICAgIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgaW50byBmaW5kaW5nIHJlY29yZHMu
IFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8KLSAgICB0aGlzIG1ldGhvZCBpcyB0aGUgbW9kZWwncyBu
YW1lIGFzIGEgc3RyaW5nLgotCi0gICAgLS0tCi0KLSAgICBUbyBmaW5kIGEgcmVjb3JkIGJ5IElE
LCBwYXNzIHRoZSBgaWRgIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNvbicsIDEpOwotICAgIGBgYAotCi0gICAgVGhlIGBm
aW5kYCBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGEgKipwcm9taXNlKiogdGhhdCB3aWxsIGJl
IHJlc29sdmVkCi0gICAgd2l0aCB0aGUgcmVjb3JkLiBJZiB0aGUgcmVjb3JkIHdhcyBhbHJlYWR5
IGluIHRoZSBzdG9yZSwgdGhlIHByb21pc2Ugd2lsbAotICAgIGJlIHJlc29sdmVkIGltbWVkaWF0
ZWx5LiBPdGhlcndpc2UsIHRoZSBzdG9yZSB3aWxsIGFzayB0aGUgYWRhcHRlcidzIGBmaW5kYAot
ICAgIG1ldGhvZCB0byBmaW5kIHRoZSBuZWNlc3NhcnkgZGF0YS4KLQotICAgIFRoZSBgZmluZGAg
bWV0aG9kIHdpbGwgYWx3YXlzIHJlc29sdmUgaXRzIHByb21pc2Ugd2l0aCB0aGUgc2FtZSBvYmpl
Y3QgZm9yCi0gICAgYSBnaXZlbiB0eXBlIGFuZCBgaWRgLgotCi0gICAgLS0tCi0KLSAgICBUbyBm
aW5kIGFsbCByZWNvcmRzIGZvciBhIHR5cGUsIGNhbGwgYGZpbmRgIHdpdGggbm8gYWRkaXRpb25h
bCBwYXJhbWV0ZXJzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbmQoJ3BlcnNv
bicpOwotICAgIGBgYAotCi0gICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRlcidzIGBmaW5kQWxs
YCBtZXRob2QgdG8gZmluZCB0aGUgcmVjb3JkcyBmb3IgdGhlCi0gICAgZ2l2ZW4gdHlwZSwgYW5k
IHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhlIHNlcnZlcgot
ICAgIHJldHVybnMgdGhlIHZhbHVlcy4KLQotICAgIC0tLQotCi0gICAgVG8gZmluZCBhIHJlY29y
ZCBieSBhIHF1ZXJ5LCBjYWxsIGBmaW5kYCB3aXRoIGEgaGFzaCBhcyB0aGUgc2Vjb25kCi0gICAg
cGFyYW1ldGVyOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHN0b3JlLmZpbmQoQXBwLlBlcnNv
biwgeyBwYWdlOiAxIH0pOwotICAgIGBgYAotCi0gICAgVGhpcyB3aWxsIGFzayB0aGUgYWRhcHRl
cidzIGBmaW5kUXVlcnlgIG1ldGhvZCB0byBmaW5kIHRoZSByZWNvcmRzIGZvcgotICAgIHRoZSBx
dWVyeSwgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhl
IHNlcnZlcgotICAgIHJlc3BvbmRzLgotCi0gICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtT
dHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdHxT
dHJpbmd8SW50ZWdlcnxudWxsfSBpZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAg
Ki8KLSAgZmluZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICBpZiAoaWQgPT09IHVuZGVmaW5l
ZCkgewotICAgICAgcmV0dXJuIHRoaXMuZmluZEFsbCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvLyBX
ZSBhcmUgcGFzc2VkIGEgcXVlcnkgaW5zdGVhZCBvZiBhbiBpZC4KLSAgICBpZiAoRW1iZXIudHlw
ZU9mKGlkKSA9PT0gJ29iamVjdCcpIHsKLSAgICAgIHJldHVybiB0aGlzLmZpbmRRdWVyeSh0eXBl
LCBpZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuZmluZEJ5SWQodHlwZSwgY29lcmNlSWQo
aWQpKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVjb3JkIGZv
ciBhIGdpdmVuIHR5cGUgYW5kIGlkIGNvbWJpbmF0aW9uLgotCi0gICAgQG1ldGhvZCBmaW5kQnlJ
ZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9k
ZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBpZAotICAgIEByZXR1cm4ge1By
b21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEJ5SWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0g
ICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgcmVjb3JkID0gdGhpcy5y
ZWNvcmRGb3JJZCh0eXBlLCBpZCk7Ci0KLSAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZmV0Y2hSZWNv
cmQocmVjb3JkKSB8fCByZXNvbHZlKHJlY29yZCwgIkRTOiBTdG9yZSNmaW5kQnlJZCAiICsgdHlw
ZSArICIgd2l0aCBpZDogIiArIGlkKTsKLSAgICByZXR1cm4gcHJvbWlzZU9iamVjdChwcm9taXNl
KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBtYWtlcyBhIHNlcmllcyBvZiByZXF1
ZXN0cyB0byB0aGUgYWRhcHRlcidzIGBmaW5kYCBtZXRob2QKLSAgICBhbmQgcmV0dXJucyBhIHBy
b21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZXkgYXJlIGFsbCBsb2FkZWQuCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2QgZmluZEJ5SWRzCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAg
ICBAcGFyYW0ge0FycmF5fSBpZHMKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICBmaW5kQnlJZHM6IGZ1bmN0aW9uKHR5cGUsIGlkcykgewotICAgIHZhciBzdG9yZSA9IHRo
aXM7Ci0gICAgdmFyIHByb21pc2VMYWJlbCA9ICJEUzogU3RvcmUjZmluZEJ5SWRzICIgKyB0eXBl
OwotICAgIHJldHVybiBwcm9taXNlQXJyYXkoRW1iZXIuUlNWUC5hbGwobWFwKGlkcywgZnVuY3Rp
b24oaWQpIHsKLSAgICAgIHJldHVybiBzdG9yZS5maW5kQnlJZCh0eXBlLCBpZCk7Ci0gICAgfSkp
LnRoZW4oRW1iZXIuQSwgbnVsbCwgIkRTOiBTdG9yZSNmaW5kQnlJZHMgb2YgIiArIHR5cGUgKyAi
IGNvbXBsZXRlIikpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBi
eSBgZmluZEJ5SWRgIGlmIGl0IGRpc2NvdmVycyB0aGF0IGEgcGFydGljdWxhcgotICAgIHR5cGUv
aWQgcGFpciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0IHRvIGtpY2sgb2ZmIGEgcmVxdWVzdCB0byB0
aGUKLSAgICBhZGFwdGVyLgotCi0gICAgQG1ldGhvZCBmZXRjaFJlY29yZAotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHBy
b21pc2UKLSAgKi8KLSAgZmV0Y2hSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGlmIChp
c05vbmUocmVjb3JkKSkgeyByZXR1cm4gbnVsbDsgfQotICAgIGlmIChyZWNvcmQuX2xvYWRpbmdQ
cm9taXNlKSB7IHJldHVybiByZWNvcmQuX2xvYWRpbmdQcm9taXNlOyB9Ci0gICAgaWYgKCFnZXQo
cmVjb3JkLCAnaXNFbXB0eScpKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgdHlwZSA9IHJl
Y29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAnaWQnKTsKLQotICAg
IHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwotCi0gICAgRW1iZXIuYXNzZXJ0
KCJZb3UgdHJpZWQgdG8gZmluZCBhIHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9y
ICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0
byBmaW5kIGEgcmVjb3JkIGJ1dCB5b3VyIGFkYXB0ZXIgKGZvciAiICsgdHlwZSArICIpIGRvZXMg
bm90IGltcGxlbWVudCAnZmluZCciLCBhZGFwdGVyLmZpbmQpOwotCi0gICAgdmFyIHByb21pc2Ug
PSBfZmluZChhZGFwdGVyLCB0aGlzLCB0eXBlLCBpZCk7Ci0gICAgcmVjb3JkLmxvYWRpbmdEYXRh
KHByb21pc2UpOwotICAgIHJldHVybiBwcm9taXNlOwotICB9LAotCi0gIC8qKgotICAgIEdldCBh
IHJlY29yZCBieSBhIGdpdmVuIHR5cGUgYW5kIElEIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGZldGNo
LgotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCBzeW5jaHJvbm91c2x5IHJldHVybiB0aGUgcmVjb3Jk
IGlmIGl0J3MgYXZhaWxhYmxlLgotICAgIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gbnVsbC4K
LQotICAgIGBgYGpzCi0gICAgdmFyIHBvc3QgPSBzdG9yZS5nZXRCeUlkKCdwb3N0JywgMSk7Ci0g
ICAgYGBgCi0KLSAgICBAbWV0aG9kIGdldEJ5SWQKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJj
bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IGlkCi0g
ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIGdldEJ5SWQ6IGZ1bmN0aW9uKHR5
cGUsIGlkKSB7Ci0gICAgaWYgKHRoaXMuaGFzUmVjb3JkRm9ySWQodHlwZSwgaWQpKSB7Ci0gICAg
ICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0eXBlLCBpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
IHJldHVybiBudWxsOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBj
YWxsZWQgYnkgdGhlIHJlY29yZCdzIGByZWxvYWRgIG1ldGhvZC4KLQotICAgIFRoaXMgbWV0aG9k
IGNhbGxzIHRoZSBhZGFwdGVyJ3MgYGZpbmRgIG1ldGhvZCwgd2hpY2ggcmV0dXJucyBhIHByb21p
c2UuIFdoZW4KLSAgICAqKnRoYXQqKiBwcm9taXNlIHJlc29sdmVzLCBgcmVsb2FkUmVjb3JkYCB3
aWxsIHJlc29sdmUgdGhlIHByb21pc2UgcmV0dXJuZWQKLSAgICBieSB0aGUgcmVjb3JkJ3MgYHJl
bG9hZGAuCi0KLSAgICBAbWV0aG9kIHJlbG9hZFJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAq
LwotICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHZhciB0eXBlID0gcmVj
b3JkLmNvbnN0cnVjdG9yLAotICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUp
LAotICAgICAgICBpZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZ
b3UgY2Fubm90IHJlbG9hZCBhIHJlY29yZCB3aXRob3V0IGFuIElEIiwgaWQpOwotICAgIEVtYmVy
LmFzc2VydCgiWW91IHRyaWVkIHRvIHJlbG9hZCBhIHJlY29yZCBidXQgeW91IGhhdmUgbm8gYWRh
cHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQoIllv
dSB0cmllZCB0byByZWxvYWQgYSByZWNvcmQgYnV0IHlvdXIgYWRhcHRlciBkb2VzIG5vdCBpbXBs
ZW1lbnQgYGZpbmRgIiwgYWRhcHRlci5maW5kKTsKLQotICAgIHJldHVybiBfZmluZChhZGFwdGVy
LCB0aGlzLCB0eXBlLCBpZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgdGFrZXMg
YSBsaXN0IG9mIHJlY29yZHMsIGdyb3VwcyB0aGUgcmVjb3JkcyBieSB0eXBlLAotICAgIGNvbnZl
cnRzIHRoZSByZWNvcmRzIGludG8gSURzLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBhZGFwdGVyJ3Mg
YGZpbmRNYW55YAotICAgIG1ldGhvZC4KLQotICAgIFRoZSByZWNvcmRzIGFyZSBncm91cGVkIGJ5
IHR5cGUgdG8gaW52b2tlIGBmaW5kTWFueWAgb24gYWRhcHRlcnMKLSAgICBmb3IgZWFjaCB1bmlx
dWUgdHlwZSBpbiByZWNvcmRzLgotCi0gICAgSXQgaXMgdXNlZCBib3RoIGJ5IGEgYnJhbmQgbmV3
IHJlbGF0aW9uc2hpcCAodmlhIHRoZSBgZmluZE1hbnlgCi0gICAgbWV0aG9kKSBvciB3aGVuIHRo
ZSBkYXRhIHVuZGVybHlpbmcgYW4gZXhpc3RpbmcgcmVsYXRpb25zaGlwCi0gICAgY2hhbmdlcy4K
LQotICAgIEBtZXRob2QgZmV0Y2hNYW55Ci0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0FycmF5
fSByZWNvcmRzCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge1Jlc29s
dmVyfSByZXNvbHZlcgotICAqLwotICBmZXRjaE1hbnk6IGZ1bmN0aW9uKHJlY29yZHMsIG93bmVy
LCByZXNvbHZlcikgewotICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHsgcmV0dXJuOyB9Ci0KLSAg
ICAvLyBHcm91cCBCeSBUeXBlCi0gICAgdmFyIHJlY29yZHNCeVR5cGVNYXAgPSBFbWJlci5NYXBX
aXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0
dXJuIEVtYmVyLkEoKTsgfQotICAgIH0pOwotCi0gICAgZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICAgIHJlY29yZHNCeVR5cGVNYXAuZ2V0KHJlY29yZC5jb25zdHJ1Y3Rv
cikucHVzaChyZWNvcmQpOwotICAgIH0pOwotCi0gICAgZm9yRWFjaChyZWNvcmRzQnlUeXBlTWFw
LCBmdW5jdGlvbih0eXBlLCByZWNvcmRzKSB7Ci0gICAgICB2YXIgaWRzID0gcmVjb3Jkcy5tYXBQ
cm9wZXJ0eSgnaWQnKSwKLSAgICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUp
OwotCi0gICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIG1hbnkgcmVjb3JkcyBi
dXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsKLSAg
ICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgbWFueSByZWNvcmRzIGJ1dCB5b3Vy
IGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5kTWFueWAiLCBhZGFwdGVyLmZpbmRNYW55
KTsKLQotICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZE1hbnkoYWRhcHRlciwgdGhpcywgdHlw
ZSwgaWRzLCBvd25lcikpOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVy
bnMgdHJ1ZSBpZiBhIHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJRCBpcyBhbHJlYWR5IGxv
YWRlZC4KLQotICAgIEBtZXRob2QgaGFzUmVjb3JkRm9ySWQKLSAgICBAcGFyYW0ge1N0cmluZyBv
ciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9
IGlkCi0gICAgQHJldHVybnMge0Jvb2xlYW59Ci0gICovCi0gIGhhc1JlY29yZEZvcklkOiBmdW5j
dGlvbih0eXBlLCBpZCkgewotICAgIGlkID0gY29lcmNlSWQoaWQpOwotICAgIHR5cGUgPSB0aGlz
Lm1vZGVsRm9yKHR5cGUpOwotICAgIHJldHVybiAhIXRoaXMudHlwZU1hcEZvcih0eXBlKS5pZFRv
UmVjb3JkW2lkXTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGlkIHJlY29yZCBmb3IgYSBn
aXZlbiB0eXBlIGFuZCBJRC4gSWYgb25lIGlzbid0IGFscmVhZHkgbG9hZGVkLAotICAgIGl0IGJ1
aWxkcyBhIG5ldyByZWNvcmQgYW5kIGxlYXZlcyBpdCBpbiB0aGUgYGVtcHR5YCBzdGF0ZS4KLQot
ICAgIEBtZXRob2QgcmVjb3JkRm9ySWQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5n
IG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd8SW50ZWdl
cn0gaWQKLSAgICBAcmV0dXJucyB7RFMuTW9kZWx9IHJlY29yZAotICAqLwotICByZWNvcmRGb3JJ
ZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsK
LQotICAgIGlkID0gY29lcmNlSWQoaWQpOwotCi0gICAgdmFyIHJlY29yZCA9IHRoaXMudHlwZU1h
cEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKLQotICAgIGlmICghcmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKHR5cGUsIGlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
cmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmluZE1hbnkKLSAgICBAcHJpdmF0
ZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IG93bmVyCi0gICAgQHBhcmFtIHtBcnJheX0gcmVjb3Jk
cwotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAg
QHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9IHJl
Y29yZHMKLSAgKi8KLSAgZmluZE1hbnk6IGZ1bmN0aW9uKG93bmVyLCByZWNvcmRzLCB0eXBlLCBy
ZXNvbHZlcikgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotCi0gICAgcmVjb3Jk
cyA9IEVtYmVyLkEocmVjb3Jkcyk7Ci0KLSAgICB2YXIgdW5sb2FkZWRSZWNvcmRzID0gcmVjb3Jk
cy5maWx0ZXJQcm9wZXJ0eSgnaXNFbXB0eScsIHRydWUpLAotICAgICAgICBtYW55QXJyYXkgPSB0
aGlzLnJlY29yZEFycmF5TWFuYWdlci5jcmVhdGVNYW55QXJyYXkodHlwZSwgcmVjb3Jkcyk7Ci0K
LSAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQubG9hZGluZ0RhdGEoKTsKLSAgICB9KTsKLQotICAgIG1hbnlBcnJheS5sb2FkaW5nUmVj
b3Jkc0NvdW50ID0gdW5sb2FkZWRSZWNvcmRzLmxlbmd0aDsKLQotICAgIGlmICh1bmxvYWRlZFJl
Y29yZHMubGVuZ3RoKSB7Ci0gICAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3JkcywgZnVuY3Rpb24o
cmVjb3JkKSB7Ci0gICAgICAgIHRoaXMucmVjb3JkQXJyYXlNYW5hZ2VyLnJlZ2lzdGVyV2FpdGlu
Z1JlY29yZEFycmF5KHJlY29yZCwgbWFueUFycmF5KTsKLSAgICAgIH0sIHRoaXMpOwotCi0gICAg
ICB0aGlzLmZldGNoTWFueSh1bmxvYWRlZFJlY29yZHMsIG93bmVyLCByZXNvbHZlcik7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIGlmIChyZXNvbHZlcikgeyByZXNvbHZlci5yZXNvbHZlKCk7IH0KLSAg
ICAgIG1hbnlBcnJheS5zZXQoJ2lzTG9hZGVkJywgdHJ1ZSk7Ci0gICAgICBFbWJlci5ydW4ub25j
ZShtYW55QXJyYXksICd0cmlnZ2VyJywgJ2RpZExvYWQnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
bWFueUFycmF5OwotICB9LAotCi0gIC8qKgotICAgIElmIGEgcmVsYXRpb25zaGlwIHdhcyBvcmln
aW5hbGx5IHBvcHVsYXRlZCBieSB0aGUgYWRhcHRlciBhcyBhIGxpbmsKLSAgICAoYXMgb3Bwb3Nl
ZCB0byBhIGxpc3Qgb2YgSURzKSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0gICAg
cmVsYXRpb25zaGlwIGlzIGZldGNoZWQuCi0KLSAgICBUaGUgbGluayAod2hpY2ggaXMgdXN1YWxs
eSBhIFVSTCkgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLCBzbyB0aGUKLSAgICBhZGFwdGVy
IGNhbiBtYWtlIHdoYXRldmVyIHJlcXVlc3QgaXQgd2FudHMuCi0KLSAgICBUaGUgdXN1YWwgdXNl
LWNhc2UgaXMgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVnaXN0ZXIgYSBVUkwgYXMgYSBsaW5rLCBhbmQK
LSAgICB0aGVuIHVzZSB0aGF0IFVSTCBpbiB0aGUgZnV0dXJlIHRvIG1ha2UgYSByZXF1ZXN0IGZv
ciB0aGUgcmVsYXRpb25zaGlwLgotCi0gICAgQG1ldGhvZCBmaW5kSGFzTWFueQotICAgIEBwcml2
YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge2FueX0gbGluawot
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBh
cmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9Ci0gICov
Ci0gIGZpbmRIYXNNYW55OiBmdW5jdGlvbihvd25lciwgbGluaywgcmVsYXRpb25zaGlwLCByZXNv
bHZlcikgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVj
dG9yKTsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBoYXNNYW55IHJl
bGF0aW9uc2hpcCBidXQgeW91IGhhdmUgbm8gYWRhcHRlciAoZm9yICIgKyBvd25lci5jb25zdHJ1
Y3RvciArICIpIiwgYWRhcHRlcik7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9h
ZCBhIGhhc01hbnkgcmVsYXRpb25zaGlwIGZyb20gYSBzcGVjaWZpZWQgYGxpbmtgIGluIHRoZSBv
cmlnaW5hbCBwYXlsb2FkIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBmaW5k
SGFzTWFueWAiLCBhZGFwdGVyLmZpbmRIYXNNYW55KTsKLQotICAgIHZhciByZWNvcmRzID0gdGhp
cy5yZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlTWFueUFycmF5KHJlbGF0aW9uc2hpcC50eXBlLCBF
bWJlci5BKFtdKSk7Ci0gICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEhhc01hbnkoYWRhcHRlciwg
dGhpcywgb3duZXIsIGxpbmssIHJlbGF0aW9uc2hpcCkpOwotICAgIHJldHVybiByZWNvcmRzOwot
ICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZmluZEJlbG9uZ3NUbwotICAgIEBwcml2YXRlCi0g
ICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKLSAgICBAcGFyYW0ge2FueX0gbGluawotICAgIEBw
YXJhbSB7UmVsYXRpb25zaGlwfSByZWxhdGlvbnNoaXAKLSAgICBAcGFyYW0ge1Jlc29sdmVyfSBy
ZXNvbHZlcgotICAqLwotICBmaW5kQmVsb25nc1RvOiBmdW5jdGlvbihvd25lciwgbGluaywgcmVs
YXRpb25zaGlwLCByZXNvbHZlcikgewotICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9y
KG93bmVyLmNvbnN0cnVjdG9yKTsKLQotICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxv
YWQgYSBiZWxvbmdzVG8gcmVsYXRpb25zaGlwIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3Ig
IiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBhZGFwdGVyKTsKLSAgICBFbWJlci5hc3NlcnQo
IllvdSB0cmllZCB0byBsb2FkIGEgYmVsb25nc1RvIHJlbGF0aW9uc2hpcCBmcm9tIGEgc3BlY2lm
aWVkIGBsaW5rYCBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZCBidXQgeW91ciBhZGFwdGVyIGRvZXMg
bm90IGltcGxlbWVudCBgZmluZEJlbG9uZ3NUb2AiLCBhZGFwdGVyLmZpbmRCZWxvbmdzVG8pOwot
Ci0gICAgcmVzb2x2ZXIucmVzb2x2ZShfZmluZEJlbG9uZ3NUbyhhZGFwdGVyLCB0aGlzLCBvd25l
ciwgbGluaywgcmVsYXRpb25zaGlwKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2Qg
ZGVsZWdhdGVzIGEgcXVlcnkgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3
aGVyZQotICAgIGFkYXB0ZXItbGV2ZWwgc2VtYW50aWNzIGFyZSBleHBvc2VkIHRvIHRoZSBhcHBs
aWNhdGlvbi4KLQotICAgIEV4cG9zaW5nIHF1ZXJpZXMgdGhpcyB3YXkgc2VlbXMgcHJlZmVyYWJs
ZSB0byBjcmVhdGluZyBhbiBhYnN0cmFjdCBxdWVyeQotICAgIGxhbmd1YWdlIGZvciBhbGwgc2Vy
dmVyLXNpZGUgcXVlcmllcywgYW5kIHRoZW4gcmVxdWlyZSBhbGwgYWRhcHRlcnMgdG8KLSAgICBp
bXBsZW1lbnQgdGhlbS4KLQotICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlLCB3aGlj
aCBpcyByZXNvbHZlZCB3aXRoIGEgYFJlY29yZEFycmF5YAotICAgIG9uY2UgdGhlIHNlcnZlciBy
ZXR1cm5zLgotCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJh
bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHthbnl9
IHF1ZXJ5IGFuIG9wYXF1ZSBxdWVyeSB0byBiZSB1c2VkIGJ5IHRoZSBhZGFwdGVyCi0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHR5cGUs
IHF1ZXJ5KSB7Ci0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2YXIgYXJy
YXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgotICAgICAgLmNyZWF0ZUFkYXB0ZXJQb3B1bGF0
ZWRSZWNvcmRBcnJheSh0eXBlLCBxdWVyeSk7Ci0KLSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRh
cHRlckZvcih0eXBlKSwKLSAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBTdG9yZSNmaW5kUXVl
cnkgIiArIHR5cGUsCi0gICAgICAgIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNl
TGFiZWwpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBhIHF1ZXJ5IGJ1
dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwotICAg
IEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBxdWVyeSBidXQgeW91ciBhZGFwdGVy
IGRvZXMgbm90IGltcGxlbWVudCBgZmluZFF1ZXJ5YCIsIGFkYXB0ZXIuZmluZFF1ZXJ5KTsKLQot
ICAgIHJlc29sdmVyLnJlc29sdmUoX2ZpbmRRdWVyeShhZGFwdGVyLCB0aGlzLCB0eXBlLCBxdWVy
eSwgYXJyYXkpKTsKLQotICAgIHJldHVybiBwcm9taXNlQXJyYXkocmVzb2x2ZXIucHJvbWlzZSk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwg
cmVjb3JkcyBhZGFwdGVyIGNhbiBmaW5kLgotICAgIEl0IHRyaWdnZXJzIHRoZSBhZGFwdGVyJ3Mg
YGZpbmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFuIG9wcG9ydHVuaXR5IHRvIHBvcHVsYXRlCi0g
ICAgdGhlIGFycmF5IHdpdGggcmVjb3JkcyBvZiB0aGF0IHR5cGUuCi0KLSAgICBAbWV0aG9kIGZp
bmRBbGwKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7RFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5
fQotICAqLwotICBmaW5kQWxsOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdHlwZSA9IHRoaXMubW9k
ZWxGb3IodHlwZSk7Ci0KLSAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCh0eXBlLCB0aGlzLmFsbCh0
eXBlKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBmZXRjaEFsbAotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuUmVjb3JkQXJyYXl9
IGFycmF5Ci0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmV0Y2hBbGw6
IGZ1bmN0aW9uKHR5cGUsIGFycmF5KSB7Ci0gICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJG
b3IodHlwZSksCi0gICAgICAgIHNpbmNlVG9rZW4gPSB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0
YWRhdGEuc2luY2U7Ci0KLSAgICBzZXQoYXJyYXksICdpc1VwZGF0aW5nJywgdHJ1ZSk7Ci0KLSAg
ICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGFsbCByZWNvcmRzIGJ1dCB5b3UgaGF2
ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwotICAgIEVtYmVyLmFz
c2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYWxsIHJlY29yZHMgYnV0IHlvdXIgYWRhcHRlciBkb2Vz
IG5vdCBpbXBsZW1lbnQgYGZpbmRBbGxgIiwgYWRhcHRlci5maW5kQWxsKTsKLQotICAgIHJldHVy
biBwcm9taXNlQXJyYXkoX2ZpbmRBbGwoYWRhcHRlciwgdGhpcywgdHlwZSwgc2luY2VUb2tlbikp
OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZGlkVXBkYXRlQWxsCi0gICAgQHBhcmFtIHtE
Uy5Nb2RlbH0gdHlwZQotICAqLwotICBkaWRVcGRhdGVBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICB2YXIgZmluZEFsbENhY2hlID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLmZpbmRBbGxDYWNoZTsK
LSAgICBzZXQoZmluZEFsbENhY2hlLCAnaXNVcGRhdGluZycsIGZhbHNlKTsKLSAgfSwKLQotICAv
KioKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZmlsdGVyZWQgYXJyYXkgdGhhdCBjb250YWlu
cyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMKLSAgICBmb3IgYSBnaXZlbiB0eXBlLgotCi0gICAg
Tm90ZSB0aGF0IGJlY2F1c2UgaXQncyBqdXN0IGEgZmlsdGVyLCBpdCB3aWxsIGhhdmUgYW55IGxv
Y2FsbHkKLSAgICBjcmVhdGVkIHJlY29yZHMgb2YgdGhlIHR5cGUuCi0KLSAgICBBbHNvIG5vdGUg
dGhhdCBtdWx0aXBsZSBjYWxscyB0byBgYWxsYCBmb3IgYSBnaXZlbiB0eXBlIHdpbGwgYWx3YXlz
Ci0gICAgcmV0dXJuIHRoZSBzYW1lIFJlY29yZEFycmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBsb2NhbF9wb3N0cyA9IHN0b3JlLmFsbChBcHAuUG9zdCk7
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFsbAotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9Ci0gICov
Ci0gIGFsbDogZnVuY3Rpb24odHlwZSkgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUp
OwotCi0gICAgdmFyIHR5cGVNYXAgPSB0aGlzLnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGZp
bmRBbGxDYWNoZSA9IHR5cGVNYXAuZmluZEFsbENhY2hlOwotCi0gICAgaWYgKGZpbmRBbGxDYWNo
ZSkgeyByZXR1cm4gZmluZEFsbENhY2hlOyB9Ci0KLSAgICB2YXIgYXJyYXkgPSB0aGlzLnJlY29y
ZEFycmF5TWFuYWdlci5jcmVhdGVSZWNvcmRBcnJheSh0eXBlKTsKLQotICAgIHR5cGVNYXAuZmlu
ZEFsbENhY2hlID0gYXJyYXk7Ci0gICAgcmV0dXJuIGFycmF5OwotICB9LAotCi0KLSAgLyoqCi0g
ICAgVGhpcyBtZXRob2QgdW5sb2FkcyBhbGwgb2YgdGhlIGtub3duIHJlY29yZHMgZm9yIGEgZ2l2
ZW4gdHlwZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS51bmxvYWRBbGwoQXBwLlBv
c3QpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1bmxvYWRBbGwKLSAgICBAcGFyYW0ge1N0cmlu
ZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAqLwotICB1bmxvYWRBbGw6IGZ1bmN0
aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKLQotICAgIHZhciB0
eXBlTWFwID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAotICAgICAgICByZWNvcmRzID0gdHlwZU1h
cC5yZWNvcmRzLnNwbGljZSgwKSwgcmVjb3JkOwotCi0gICAgd2hpbGUocmVjb3JkID0gcmVjb3Jk
cy5wb3AoKSkgewotICAgICAgcmVjb3JkLnVubG9hZFJlY29yZCgpOwotICAgIH0KLQotICAgIHR5
cGVNYXAuZmluZEFsbENhY2hlID0gbnVsbDsKLSAgfSwKLQotICAvKioKLSAgICBUYWtlcyBhIHR5
cGUgYW5kIGZpbHRlciBmdW5jdGlvbiwgYW5kIHJldHVybnMgYSBsaXZlIFJlY29yZEFycmF5IHRo
YXQKLSAgICByZW1haW5zIHVwIHRvIGRhdGUgYXMgbmV3IHJlY29yZHMgYXJlIGxvYWRlZCBpbnRv
IHRoZSBzdG9yZSBvciBjcmVhdGVkCi0gICAgbG9jYWxseS4KLQotICAgIFRoZSBjYWxsYmFjayBm
dW5jdGlvbiB0YWtlcyBhIG1hdGVyaWFsaXplZCByZWNvcmQsIGFuZCByZXR1cm5zIHRydWUKLSAg
ICBpZiB0aGUgcmVjb3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVyIGFuZCBmYWxz
ZSBpZiBpdCBzaG91bGQKLSAgICBub3QuCi0KLSAgICBUaGUgZmlsdGVyIGZ1bmN0aW9uIGlzIGNh
bGxlZCBvbmNlIG9uIGFsbCByZWNvcmRzIGZvciB0aGUgdHlwZSB3aGVuCi0gICAgaXQgaXMgY3Jl
YXRlZCwgYW5kIHRoZW4gb25jZSBvbiBlYWNoIG5ld2x5IGxvYWRlZCBvciBjcmVhdGVkIHJlY29y
ZC4KLQotICAgIElmIGFueSBvZiBhIHJlY29yZCdzIHByb3BlcnRpZXMgY2hhbmdlLCBvciBpZiBp
dCBjaGFuZ2VzIHN0YXRlLCB0aGUKLSAgICBmaWx0ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2Vk
IGFnYWluIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZAotICAgIHN0aWxsIGJlIGluIHRo
ZSBhcnJheS4KLQotICAgIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgcXVlcnkgd2hpY2ggd2ls
bCBiZSB0cmlnZ2VyZWQgYXQgZmlyc3QuIFRoZQotICAgIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhl
IHNlcnZlciBjb3VsZCB0aGVuIGFwcGVhciBpbiB0aGUgZmlsdGVyIGlmIHRoZXkKLSAgICBtYXRj
aCB0aGUgZmlsdGVyIGZ1bmN0aW9uLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIHN0b3JlLmZpbHRlcihBcHAuUG9zdCwge3VucmVhZDogdHJ1ZX0sIGZ1bmN0aW9uKHBv
c3QpIHsKLSAgICAgIHJldHVybiBwb3N0LmdldCgndW5yZWFkJyk7Ci0gICAgfSkudGhlbihmdW5j
dGlvbih1bnJlYWRQb3N0cykgewotICAgICAgdW5yZWFkUG9zdHMuZ2V0KCdsZW5ndGgnKTsgLy8g
NQotICAgICAgdmFyIHVucmVhZFBvc3QgPSB1bnJlYWRQb3N0cy5vYmplY3RBdCgwKTsKLSAgICAg
IHVucmVhZFBvc3Quc2V0KCd1bnJlYWQnLCBmYWxzZSk7Ci0gICAgICB1bnJlYWRQb3N0cy5nZXQo
J2xlbmd0aCcpOyAvLyA0Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGZpbHRlcgot
ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBh
cmFtIHtPYmplY3R9IHF1ZXJ5IG9wdGlvbmFsIHF1ZXJ5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0g
ZmlsdGVyCi0gICAgQHJldHVybiB7RFMuUHJvbWlzZUFycmF5fQotICAqLwotICBmaWx0ZXI6IGZ1
bmN0aW9uKHR5cGUsIHF1ZXJ5LCBmaWx0ZXIpIHsKLSAgICB2YXIgcHJvbWlzZTsKLQotICAgIC8v
IGFsbG93IGFuIG9wdGlvbmFsIHNlcnZlciBxdWVyeQotICAgIGlmIChhcmd1bWVudHMubGVuZ3Ro
ID09PSAzKSB7Ci0gICAgICBwcm9taXNlID0gdGhpcy5maW5kUXVlcnkodHlwZSwgcXVlcnkpOwot
ICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgZmlsdGVyID0g
cXVlcnk7Ci0gICAgfQotCi0gICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICB2
YXIgYXJyYXkgPSB0aGlzLnJlY29yZEFycmF5TWFuYWdlcgotICAgICAgLmNyZWF0ZUZpbHRlcmVk
UmVjb3JkQXJyYXkodHlwZSwgZmlsdGVyKTsKLSAgICBwcm9taXNlID0gcHJvbWlzZSB8fCByZXNv
bHZlKGFycmF5KTsKLQotICAgIHJldHVybiBwcm9taXNlQXJyYXkocHJvbWlzZS50aGVuKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0sIG51bGwsICJEUzogU3RvcmUjZmls
dGVyIG9mICIgKyB0eXBlKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgcmV0dXJu
cyBpZiBhIGNlcnRhaW4gcmVjb3JkIGlzIGFscmVhZHkgbG9hZGVkCi0gICAgaW4gdGhlIHN0b3Jl
LiBVc2UgdGhpcyBmdW5jdGlvbiB0byBrbm93IGJlZm9yZWhhbmQgaWYgYSBmaW5kKCkKLSAgICB3
aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhhdCBpdCB3aWxsIGJlIGEgY2FjaGUgaGl0Lgot
Ci0gICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdG9yZS5yZWNvcmRJc0xv
YWRlZChBcHAuUG9zdCwgMSk7IC8vIGZhbHNlCi0gICAgc3RvcmUuZmluZChBcHAuUG9zdCwgMSku
dGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHN0b3JlLnJlY29yZElzTG9hZGVkKEFwcC5Qb3N0LCAx
KTsgLy8gdHJ1ZQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCByZWNvcmRJc0xvYWRl
ZAotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAg
QHBhcmFtIHtzdHJpbmd9IGlkCi0gICAgQHJldHVybiB7Ym9vbGVhbn0KLSAgKi8KLSAgcmVjb3Jk
SXNMb2FkZWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7Ci0gICAgaWYgKCF0aGlzLmhhc1JlY29yZEZv
cklkKHR5cGUsIGlkKSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICByZXR1cm4gIWdldCh0aGlzLnJl
Y29yZEZvcklkKHR5cGUsIGlkKSwgJ2lzRW1wdHknKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlz
IG1ldGhvZCByZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyB0eXBlLgotCi0gICAg
QG1ldGhvZCBtZXRhZGF0YUZvcgotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSB0eXBlCi0gICAgQHJldHVybiB7b2JqZWN0fQotICAqLwotICBtZXRhZGF0YUZvcjog
ZnVuY3Rpb24odHlwZSkgewotICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwotICAgIHJl
dHVybiB0aGlzLnR5cGVNYXBGb3IodHlwZSkubWV0YWRhdGE7Ci0gIH0sCi0KLSAgLy8gLi4uLi4u
Li4uLi4uCi0gIC8vIC4gVVBEQVRJTkcgLgotICAvLyAuLi4uLi4uLi4uLi4KLQotICAvKioKLSAg
ICBJZiB0aGUgYWRhcHRlciB1cGRhdGVzIGF0dHJpYnV0ZXMgb3IgYWNrbm93bGVkZ2VzIGNyZWF0
aW9uCi0gICAgb3IgZGVsZXRpb24sIHRoZSByZWNvcmQgd2lsbCBub3RpZnkgdGhlIHN0b3JlIHRv
IHVwZGF0ZSBpdHMKLSAgICBtZW1iZXJzaGlwIGluIGFueSBmaWx0ZXJzLgotICAgIFRvIGF2b2lk
IHRocmFzaGluZywgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5IG9uY2UgcGVyCi0KLSAgICBy
dW4gbG9vcCBwZXIgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBkYXRhV2FzVXBkYXRlZAotICAgIEBw
cml2YXRlCi0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJl
Y29yZAotICAqLwotICBkYXRhV2FzVXBkYXRlZDogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7Ci0g
ICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBQRVJTSVNUSU5HIC4KLSAgLy8gLi4uLi4u
Li4uLi4uLi4KLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYHJlY29yZC5z
YXZlYCwgYW5kIGdldHMgcGFzc2VkIGEKLSAgICByZXNvbHZlciBmb3IgdGhlIHByb21pc2UgdGhh
dCBgcmVjb3JkLnNhdmVgIHJldHVybnMuCi0KLSAgICBJdCBzY2hlZHVsZXMgc2F2aW5nIHRvIGhh
cHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcC4KLQotICAgIEBtZXRob2Qgc2NoZWR1bGVT
YXZlCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFy
YW0ge1Jlc29sdmVyfSByZXNvbHZlcgotICAqLwotICBzY2hlZHVsZVNhdmU6IGZ1bmN0aW9uKHJl
Y29yZCwgcmVzb2x2ZXIpIHsKLSAgICByZWNvcmQuYWRhcHRlcldpbGxDb21taXQoKTsKLSAgICB0
aGlzLl9wZW5kaW5nU2F2ZS5wdXNoKFtyZWNvcmQsIHJlc29sdmVyXSk7Ci0gICAgb25jZSh0aGlz
LCAnZmx1c2hQZW5kaW5nU2F2ZScpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGlz
IGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBydW4gbG9vcCwgYW5kCi0gICAgZmx1c2hlcyBhbnkg
cmVjb3JkcyBwYXNzZWQgaW50byBgc2NoZWR1bGVTYXZlYAotCi0gICAgQG1ldGhvZCBmbHVzaFBl
bmRpbmdTYXZlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgZmx1c2hQZW5kaW5nU2F2ZTogZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nU2F2ZS5zbGljZSgpOwotICAg
IHRoaXMuX3BlbmRpbmdTYXZlID0gW107Ci0KLSAgICBmb3JFYWNoKHBlbmRpbmcsIGZ1bmN0aW9u
KHR1cGxlKSB7Ci0gICAgICB2YXIgcmVjb3JkID0gdHVwbGVbMF0sIHJlc29sdmVyID0gdHVwbGVb
MV0sCi0gICAgICAgICAgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcihyZWNvcmQuY29uc3RydWN0
b3IpLAotICAgICAgICAgIG9wZXJhdGlvbjsKLQotICAgICAgaWYgKGdldChyZWNvcmQsICdpc05l
dycpKSB7Ci0gICAgICAgIG9wZXJhdGlvbiA9ICdjcmVhdGVSZWNvcmQnOwotICAgICAgfSBlbHNl
IGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsKLSAgICAgICAgb3BlcmF0aW9uID0gJ2Rl
bGV0ZVJlY29yZCc7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvcGVyYXRpb24gPSAndXBkYXRl
UmVjb3JkJzsKLSAgICAgIH0KLQotICAgICAgcmVzb2x2ZXIucmVzb2x2ZShfY29tbWl0KGFkYXB0
ZXIsIHRoaXMsIG9wZXJhdGlvbiwgcmVjb3JkKSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgdGhlIHByb21pc2UgcmV0dXJuZWQg
YnkgYW4KLSAgICBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBk
ZWxldGVSZWNvcmRgCi0gICAgaXMgcmVzb2x2ZWQuCi0KLSAgICBJZiB0aGUgZGF0YSBwcm92aWRl
cyBhIHNlcnZlci1nZW5lcmF0ZWQgSUQsIGl0IHdpbGwKLSAgICB1cGRhdGUgdGhlIHJlY29yZCBh
bmQgdGhlIHN0b3JlJ3MgaW5kZXhlcy4KLQotICAgIEBtZXRob2QgZGlkU2F2ZVJlY29yZAotICAg
IEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSBpbi1mbGlnaHQgcmVj
b3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEgb3B0aW9uYWwgZGF0YSAoc2VlIGFib3ZlKQot
ICAqLwotICBkaWRTYXZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIGRhdGEpIHsKLSAgICBpZiAo
ZGF0YSkgewotICAgICAgLy8gbm9ybWFsaXplIHJlbGF0aW9uc2hpcCBJRHMgaW50byByZWNvcmRz
Ci0gICAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlwcyh0aGlzLCByZWNvcmQuY29uc3Ry
dWN0b3IsIGRhdGEsIHJlY29yZCk7Ci0KLSAgICAgIHRoaXMudXBkYXRlSWQocmVjb3JkLCBkYXRh
KTsKLSAgICB9Ci0KLSAgICByZWNvcmQuYWRhcHRlckRpZENvbW1pdChkYXRhKTsKLSAgfSwKLQot
ICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5l
ZCBieSBhbgotICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3Ig
YGRlbGV0ZVJlY29yZGAKLSAgICBpcyByZWplY3RlZCB3aXRoIGEgYERTLkludmFsaWRFcnJvcmAu
Ci0KLSAgICBAbWV0aG9kIHJlY29yZFdhc0ludmFsaWQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBlcnJvcnMKLSAgKi8KLSAg
cmVjb3JkV2FzSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkLCBlcnJvcnMpIHsKLSAgICByZWNvcmQu
YWRhcHRlckRpZEludmFsaWRhdGUoZXJyb3JzKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhbgotICAgIGFkYXB0
ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKLSAg
ICBpcyByZWplY3RlZCAod2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGEgYERTLkludmFsaWRFcnJv
cmApLgotCi0gICAgQG1ldGhvZCByZWNvcmRXYXNFcnJvcgotICAgIEBwcml2YXRlCi0gICAgQHBh
cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIHJlY29yZFdhc0Vycm9yOiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICByZWNvcmQuYWRhcHRlckRpZEVycm9yKCk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgV2hlbiBhbiBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNvcmRgIG9yIGBk
ZWxldGVSZWNvcmRgCi0gICAgcmVzb2x2ZXMgd2l0aCBkYXRhLCB0aGlzIG1ldGhvZCBleHRyYWN0
cyB0aGUgSUQgZnJvbSB0aGUgc3VwcGxpZWQKLSAgICBkYXRhLgotCi0gICAgQG1ldGhvZCB1cGRh
dGVJZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBh
cmFtIHtPYmplY3R9IGRhdGEKLSAgKi8KLSAgdXBkYXRlSWQ6IGZ1bmN0aW9uKHJlY29yZCwgZGF0
YSkgewotICAgIHZhciBvbGRJZCA9IGdldChyZWNvcmQsICdpZCcpLAotICAgICAgICBpZCA9IGNv
ZXJjZUlkKGRhdGEuaWQpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJBbiBhZGFwdGVyIGNhbm5vdCBh
c3NpZ24gYSBuZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5IGhhcyBhbiBpZC4gIiArIHJl
Y29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3UgdHJpZWQgdG8gdXBkYXRlIGl0
IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkgaGFwcGVuZWQgYmVjYXVzZSB5b3VyIHNlcnZl
ciByZXR1cm5lZCBkYXRhIGluIHJlc3BvbnNlIHRvIGEgZmluZCBvciB1cGRhdGUgdGhhdCBoYWQg
YSBkaWZmZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIsIG9sZElkID09PSBudWxsIHx8
IGlkID09PSBvbGRJZCk7Ci0KLSAgICB0aGlzLnR5cGVNYXBGb3IocmVjb3JkLmNvbnN0cnVjdG9y
KS5pZFRvUmVjb3JkW2lkXSA9IHJlY29yZDsKLQotICAgIHNldChyZWNvcmQsICdpZCcsIGlkKTsK
LSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEgbWFwIG9mIElEcyB0byBjbGllbnQgSURzIGZv
ciBhIGdpdmVuIHR5cGUuCi0KLSAgICBAbWV0aG9kIHR5cGVNYXBGb3IKLSAgICBAcHJpdmF0ZQot
ICAgIEBwYXJhbSB0eXBlCi0gICAgQHJldHVybiB7T2JqZWN0fSB0eXBlTWFwCi0gICovCi0gIHR5
cGVNYXBGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB2YXIgdHlwZU1hcHMgPSBnZXQodGhpcywg
J3R5cGVNYXBzJyksCi0gICAgICAgIGd1aWQgPSBFbWJlci5ndWlkRm9yKHR5cGUpLAotICAgICAg
ICB0eXBlTWFwOwotCi0gICAgdHlwZU1hcCA9IHR5cGVNYXBzW2d1aWRdOwotCi0gICAgaWYgKHR5
cGVNYXApIHsgcmV0dXJuIHR5cGVNYXA7IH0KLQotICAgIHR5cGVNYXAgPSB7Ci0gICAgICBpZFRv
UmVjb3JkOiB7fSwKLSAgICAgIHJlY29yZHM6IFtdLAotICAgICAgbWV0YWRhdGE6IHt9Ci0gICAg
fTsKLQotICAgIHR5cGVNYXBzW2d1aWRdID0gdHlwZU1hcDsKLQotICAgIHJldHVybiB0eXBlTWFw
OwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBMT0FESU5HIERBVEEgLgot
ICAvLyAuLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgVGhpcyBpbnRlcm5hbCBtZXRob2Qg
aXMgdXNlZCBieSBgcHVzaGAuCi0KLSAgICBAbWV0aG9kIF9sb2FkCi0gICAgQHByaXZhdGUKLSAg
ICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7T2JqZWN0fSBkYXRhCi0gICAgQHBhcmFtIHtCb29sZWFufSBwYXJ0aWFsIHRoZSBkYXRhIHNo
b3VsZCBiZSBtZXJnZWQgaW50bwotICAgICAgdGhlIGV4aXN0aW5nIGRhdGEsIG5vdCByZXBsYWNl
IGl0LgotICAqLwotICBfbG9hZDogZnVuY3Rpb24odHlwZSwgZGF0YSwgcGFydGlhbCkgewotICAg
IHZhciBpZCA9IGNvZXJjZUlkKGRhdGEuaWQpLAotICAgICAgICByZWNvcmQgPSB0aGlzLnJlY29y
ZEZvcklkKHR5cGUsIGlkKTsKLQotICAgIHJlY29yZC5zZXR1cERhdGEoZGF0YSwgcGFydGlhbCk7
Ci0gICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7Ci0K
LSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYSBtb2RlbCBj
bGFzcyBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gVXNlZCBieQotICAgIG1ldGhvZHMgdGhhdCB0YWtl
IGEgdHlwZSBrZXkgKGxpa2UgYGZpbmRgLCBgY3JlYXRlUmVjb3JkYCwKLSAgICBldGMuKQotCi0g
ICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT
Lk1vZGVsfSBrZXkKLSAgICBAcmV0dXJucyB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9Ci0gICovCi0g
IG1vZGVsRm9yOiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgZmFjdG9yeTsKLQotCi0gICAgaWYg
KHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB2YXIgbm9ybWFsaXplZEtleSA9IHRo
aXMuY29udGFpbmVyLm5vcm1hbGl6ZSgnbW9kZWw6JyArIGtleSk7Ci0KLSAgICAgIGZhY3Rvcnkg
PSB0aGlzLmNvbnRhaW5lci5sb29rdXBGYWN0b3J5KG5vcm1hbGl6ZWRLZXkpOwotICAgICAgaWYg
KCFmYWN0b3J5KSB7IHRocm93IG5ldyBFbWJlci5FcnJvcigiTm8gbW9kZWwgd2FzIGZvdW5kIGZv
ciAnIiArIGtleSArICInIik7IH0KLSAgICAgIGZhY3RvcnkudHlwZUtleSA9IG5vcm1hbGl6ZWRL
ZXkuc3BsaXQoJzonLCAyKVsxXTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gQSBmYWN0b3J5IGFs
cmVhZHkgc3VwcGxpZWQuCi0gICAgICBmYWN0b3J5ID0ga2V5OwotICAgIH0KLQotICAgIGZhY3Rv
cnkuc3RvcmUgPSB0aGlzOwotICAgIHJldHVybiBmYWN0b3J5OwotICB9LAotCi0gIC8qKgotICAg
IFB1c2ggc29tZSBkYXRhIGZvciBhIGdpdmVuIHR5cGUgaW50byB0aGUgc3RvcmUuCi0KLSAgICBU
aGlzIG1ldGhvZCBleHBlY3RzIG5vcm1hbGl6ZWQgZGF0YToKLQotICAgICogVGhlIElEIGlzIGEg
a2V5IG5hbWVkIGBpZGAgKGFuIElEIGlzIG1hbmRhdG9yeSkKLSAgICAqIFRoZSBuYW1lcyBvZiBh
dHRyaWJ1dGVzIGFyZSB0aGUgb25lcyB5b3UgdXNlZCBpbgotICAgICAgeW91ciBtb2RlbCdzIGBE
Uy5hdHRyYHMuCi0gICAgKiBZb3VyIHJlbGF0aW9uc2hpcHMgbXVzdCBiZToKLSAgICAgICogcmVw
cmVzZW50ZWQgYXMgSURzIG9yIEFycmF5cyBvZiBJRHMKLSAgICAgICogcmVwcmVzZW50ZWQgYXMg
bW9kZWwgaW5zdGFuY2VzCi0gICAgICAqIHJlcHJlc2VudGVkIGFzIFVSTHMsIHVuZGVyIHRoZSBg
bGlua3NgIGtleQotCi0gICAgRm9yIHRoaXMgbW9kZWw6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Q
ZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1lOiBEUy5hdHRyKCksCi0g
ICAgICBsYXN0TmFtZTogRFMuYXR0cigpLAotCi0gICAgICBjaGlsZHJlbjogRFMuaGFzTWFueSgn
cGVyc29uJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRvIHJlcHJlc2VudCB0aGUgY2hpbGRy
ZW4gYXMgSURzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICBpZDogMSwKLSAgICAgIGZpcnN0
TmFtZTogIlRvbSIsCi0gICAgICBsYXN0TmFtZTogIkRhbGUiLAotICAgICAgY2hpbGRyZW46IFsx
LCAyLCAzXQotICAgIH0KLSAgICBgYGAKLQotICAgIFRvIHJlcHJlc2VudCB0aGUgY2hpbGRyZW4g
cmVsYXRpb25zaGlwIGFzIGEgVVJMOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICBpZDogMSwK
LSAgICAgIGZpcnN0TmFtZTogIlRvbSIsCi0gICAgICBsYXN0TmFtZTogIkRhbGUiLAotICAgICAg
bGlua3M6IHsKLSAgICAgICAgY2hpbGRyZW46ICIvcGVvcGxlLzEvY2hpbGRyZW4iCi0gICAgICB9
Ci0gICAgfQotICAgIGBgYAotCi0gICAgSWYgeW91J3JlIHN0cmVhbWluZyBkYXRhIG9yIGltcGxl
bWVudGluZyBhbiBhZGFwdGVyLAotICAgIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGNvbnZlcnRl
ZCB0aGUgaW5jb21pbmcgZGF0YQotICAgIGludG8gdGhpcyBmb3JtLgotCi0gICAgVGhpcyBtZXRo
b2QgY2FuIGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldwotICAgIHJlY29yZHMsIGFz
IHdlbGwgYXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCi0KLSAgICBAbWV0aG9kIHB1c2gK
LSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBw
YXJhbSB7T2JqZWN0fSBkYXRhCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRo
YXQgd2FzIGNyZWF0ZWQgb3IKLSAgICAgIHVwZGF0ZWQuCi0gICovCi0gIHB1c2g6IGZ1bmN0aW9u
KHR5cGUsIGRhdGEsIF9wYXJ0aWFsKSB7Ci0gICAgLy8gX3BhcnRpYWwgaXMgYW4gaW50ZXJuYWwg
cGFyYW0gdXNlZCBieSBgdXBkYXRlYC4KLSAgICAvLyBJZiBwYXNzZWQsIGl0IG1lYW5zIHRoYXQg
dGhlIGRhdGEgc2hvdWxkIGJlCi0gICAgLy8gbWVyZ2VkIGludG8gdGhlIGV4aXN0aW5nIGRhdGEs
IG5vdCByZXBsYWNlIGl0LgotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBpbmNsdWRlIGFu
IGBpZGAgaW4gYSBoYXNoIHBhc3NlZCB0byBgcHVzaGAiLCBkYXRhLmlkICE9IG51bGwpOwotCi0g
ICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7Ci0KLSAgICAvLyBub3JtYWxpemUgcmVsYXRp
b25zaGlwIElEcyBpbnRvIHJlY29yZHMKLSAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlw
cyh0aGlzLCB0eXBlLCBkYXRhKTsKLQotICAgIHRoaXMuX2xvYWQodHlwZSwgZGF0YSwgX3BhcnRp
YWwpOwotCi0gICAgcmV0dXJuIHRoaXMucmVjb3JkRm9ySWQodHlwZSwgZGF0YS5pZCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUHVzaCBzb21lIHJhdyBkYXRhIGludG8gdGhlIHN0b3JlLgotCi0gICAg
VGhlIGRhdGEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlc2VyaWFsaXplZCB1c2luZyB0aGUKLSAg
ICBzZXJpYWxpemVyIGZvciB0aGUgYHR5cGVgIHBhcmFtLgotCi0gICAgVGhpcyBtZXRob2QgY2Fu
IGJlIHVzZWQgYm90aCB0byBwdXNoIGluIGJyYW5kIG5ldwotICAgIHJlY29yZHMsIGFzIHdlbGwg
YXMgdG8gdXBkYXRlIGV4aXN0aW5nIHJlY29yZHMuCi0KLSAgICBZb3UgY2FuIHB1c2ggaW4gbW9y
ZSB0aGFuIG9uZSB0eXBlIG9mIG9iamVjdCBhdCBvbmNlLgotICAgIEFsbCBvYmplY3RzIHNob3Vs
ZCBiZSBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZQotICAgIHNlcmlhbGl6ZXIuCi0KLSAg
ICBgYGBqcwotICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2RlbFNl
cmlhbGl6ZXI7Ci0KLSAgICB2YXIgcHVzaERhdGEgPSB7Ci0gICAgICBwb3N0czogWwotICAgICAg
ICB7aWQ6IDEsIHBvc3RfdGl0bGU6ICJHcmVhdCBwb3N0IiwgY29tbWVudF9pZHM6IFsyXX0KLSAg
ICAgIF0sCi0gICAgICBjb21tZW50czogWwotICAgICAgICB7aWQ6IDIsIGNvbW1lbnRfYm9keTog
Ikluc2lnaHRmdWwgY29tbWVudCJ9Ci0gICAgICBdCi0gICAgfQotCi0gICAgc3RvcmUucHVzaFBh
eWxvYWQoJ3Bvc3QnLCBwdXNoRGF0YSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHB1c2hQYXls
b2FkCi0gICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9h
ZAotICAgIEByZXR1cm4ge0RTLk1vZGVsfSB0aGUgcmVjb3JkIHRoYXQgd2FzIGNyZWF0ZWQgb3Ig
dXBkYXRlZC4KLSAgKi8KLSAgcHVzaFBheWxvYWQ6IGZ1bmN0aW9uICh0eXBlLCBwYXlsb2FkKSB7
Ci0gICAgdmFyIHNlcmlhbGl6ZXI7Ci0gICAgaWYgKCFwYXlsb2FkKSB7Ci0gICAgICBwYXlsb2Fk
ID0gdHlwZTsKLSAgICAgIHNlcmlhbGl6ZXIgPSBkZWZhdWx0U2VyaWFsaXplcih0aGlzLmNvbnRh
aW5lcik7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgdXNlIGBzdG9yZSNwdXNoUGF5
bG9hZGAgd2l0aG91dCBhIHR5cGUgdW5sZXNzIHlvdXIgZGVmYXVsdCBzZXJpYWxpemVyIGRlZmlu
ZXMgYHB1c2hQYXlsb2FkYCIsIHNlcmlhbGl6ZXIucHVzaFBheWxvYWQpOwotICAgIH0gZWxzZSB7
Ci0gICAgICBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKHR5cGUpOwotICAgIH0KLSAg
ICBzZXJpYWxpemVyLnB1c2hQYXlsb2FkKHRoaXMsIHBheWxvYWQpOwotICB9LAotCi0gIHVwZGF0
ZTogZnVuY3Rpb24odHlwZSwgZGF0YSkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgaW5j
bHVkZSBhbiBgaWRgIGluIGEgaGFzaCBwYXNzZWQgdG8gYHVwZGF0ZWAiLCBkYXRhLmlkICE9IG51
bGwpOwotCi0gICAgcmV0dXJuIHRoaXMucHVzaCh0eXBlLCBkYXRhLCB0cnVlKTsKLSAgfSwKLQot
ICAvKioKLSAgICBJZiB5b3UgaGF2ZSBhbiBBcnJheSBvZiBub3JtYWxpemVkIGRhdGEgdG8gcHVz
aCwKLSAgICB5b3UgY2FuIGNhbGwgYHB1c2hNYW55YCB3aXRoIHRoZSBBcnJheSwgYW5kIGl0IHdp
bGwKLSAgICBjYWxsIGBwdXNoYCByZXBlYXRlZGx5IGZvciB5b3UuCi0KLSAgICBAbWV0aG9kIHB1
c2hNYW55Ci0gICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUK
LSAgICBAcGFyYW0ge0FycmF5fSBkYXRhcwotICAgIEByZXR1cm4ge0FycmF5fQotICAqLwotICBw
dXNoTWFueTogZnVuY3Rpb24odHlwZSwgZGF0YXMpIHsKLSAgICByZXR1cm4gbWFwKGRhdGFzLCBm
dW5jdGlvbihkYXRhKSB7Ci0gICAgICByZXR1cm4gdGhpcy5wdXNoKHR5cGUsIGRhdGEpOwotICAg
IH0sIHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIElmIHlvdSBoYXZlIHNvbWUgbWV0YWRhdGEg
dG8gc2V0IGZvciBhIHR5cGUKLSAgICB5b3UgY2FuIGNhbGwgYG1ldGFGb3JUeXBlYC4KLQotICAg
IEBtZXRob2QgbWV0YUZvclR5cGUKLSAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBE
Uy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2JqZWN0fSBtZXRhZGF0YQotICAqLwotICBtZXRh
Rm9yVHlwZTogZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEpIHsKLSAgICB0eXBlID0gdGhpcy5tb2Rl
bEZvcih0eXBlKTsKLQotICAgIEVtYmVyLm1lcmdlKHRoaXMudHlwZU1hcEZvcih0eXBlKS5tZXRh
ZGF0YSwgbWV0YWRhdGEpOwotICB9LAotCi0gIC8qKgotICAgIEJ1aWxkIGEgYnJhbmQgbmV3IHJl
Y29yZCBmb3IgYSBnaXZlbiB0eXBlLCBJRCwgYW5kCi0gICAgaW5pdGlhbCBkYXRhLgotCi0gICAg
QG1ldGhvZCBidWlsZFJlY29yZAotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBv
ZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBkYXRhCi0gICAgQHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgYnVpbGRS
ZWNvcmQ6IGZ1bmN0aW9uKHR5cGUsIGlkLCBkYXRhKSB7Ci0gICAgdmFyIHR5cGVNYXAgPSB0aGlz
LnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIGlkVG9SZWNvcmQgPSB0eXBlTWFwLmlkVG9SZWNv
cmQ7Ci0KLSAgICBFbWJlci5hc3NlcnQoJ1RoZSBpZCAnICsgaWQgKyAnIGhhcyBhbHJlYWR5IGJl
ZW4gdXNlZCB3aXRoIGFub3RoZXIgcmVjb3JkIG9mIHR5cGUgJyArIHR5cGUudG9TdHJpbmcoKSAr
ICcuJywgIWlkIHx8ICFpZFRvUmVjb3JkW2lkXSk7Ci0KLSAgICAvLyBsb29rdXBGYWN0b3J5IHNo
b3VsZCByZWFsbHkgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNyZWF0ZXMKLSAgICAvLyBpbnN0YW5j
ZXMgd2l0aCB0aGUgaW5qZWN0aW9ucyBhcHBsaWVkCi0gICAgdmFyIHJlY29yZCA9IHR5cGUuX2Ny
ZWF0ZSh7Ci0gICAgICBpZDogaWQsCi0gICAgICBzdG9yZTogdGhpcywKLSAgICAgIGNvbnRhaW5l
cjogdGhpcy5jb250YWluZXIKLSAgICB9KTsKLQotICAgIGlmIChkYXRhKSB7Ci0gICAgICByZWNv
cmQuc2V0dXBEYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8vIGlmIHdlJ3JlIGNyZWF0aW5nIGFu
IGl0ZW0sIHRoaXMgcHJvY2VzcyB3aWxsIGJlIGRvbmUKLSAgICAvLyBsYXRlciwgb25jZSB0aGUg
b2JqZWN0IGhhcyBiZWVuIHBlcnNpc3RlZC4KLSAgICBpZiAoaWQpIHsKLSAgICAgIGlkVG9SZWNv
cmRbaWRdID0gcmVjb3JkOwotICAgIH0KLQotICAgIHR5cGVNYXAucmVjb3Jkcy5wdXNoKHJlY29y
ZCk7Ci0KLSAgICByZXR1cm4gcmVjb3JkOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLgot
ICAvLyAuIERFU1RSVUNUSU9OIC4KLSAgLy8gLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAg
V2hlbiBhIHJlY29yZCBpcyBkZXN0cm95ZWQsIHRoaXMgdW4taW5kZXhlcyBpdCBhbmQKLSAgICBy
ZW1vdmVzIGl0IGZyb20gYW55IHJlY29yZCBhcnJheXMgc28gaXQgY2FuIGJlIEdDZWQuCi0KLSAg
ICBAbWV0aG9kIGRlbWF0ZXJpYWxpemVSZWNvcmQKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7
RFMuTW9kZWx9IHJlY29yZAotICAqLwotICBkZW1hdGVyaWFsaXplUmVjb3JkOiBmdW5jdGlvbihy
ZWNvcmQpIHsKLSAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKLSAgICAgICAgdHlw
ZU1hcCA9IHRoaXMudHlwZU1hcEZvcih0eXBlKSwKLSAgICAgICAgaWQgPSBnZXQocmVjb3JkLCAn
aWQnKTsKLQotICAgIHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXMoKTsKLQotICAgIGlmIChpZCkg
ewotICAgICAgZGVsZXRlIHR5cGVNYXAuaWRUb1JlY29yZFtpZF07Ci0gICAgfQotCi0gICAgdmFy
IGxvYyA9IGluZGV4T2YodHlwZU1hcC5yZWNvcmRzLCByZWNvcmQpOwotICAgIHR5cGVNYXAucmVj
b3Jkcy5zcGxpY2UobG9jLCAxKTsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4KLSAgLy8gLiBSRUxBVElPTlNISVAgQ0hBTkdFUyAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLgotCi0gIGFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcjogZnVuY3Rpb24oY2hpbGRSZWNv
cmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNvcmQsIHBhcmVudEtleSwgY2hhbmdlKSB7Ci0gICAgdmFy
IGNsaWVudElkID0gY2hpbGRSZWNvcmQuY2xpZW50SWQsCi0gICAgICAgIHBhcmVudENsaWVudElk
ID0gcGFyZW50UmVjb3JkID8gcGFyZW50UmVjb3JkIDogcGFyZW50UmVjb3JkOwotICAgIHZhciBr
ZXkgPSBjaGlsZEtleSArIHBhcmVudEtleTsKLSAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX3JlbGF0
aW9uc2hpcENoYW5nZXM7Ci0gICAgaWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykpIHsKLSAgICAg
IGNoYW5nZXNbY2xpZW50SWRdID0ge307Ci0gICAgfQotICAgIGlmICghKHBhcmVudENsaWVudElk
IGluIGNoYW5nZXNbY2xpZW50SWRdKSkgewotICAgICAgY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50
Q2xpZW50SWRdID0ge307Ci0gICAgfQotICAgIGlmICghKGtleSBpbiBjaGFuZ2VzW2NsaWVudElk
XVtwYXJlbnRDbGllbnRJZF0pKSB7Ci0gICAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGll
bnRJZF1ba2V5XSA9IHt9OwotICAgIH0KLSAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGll
bnRJZF1ba2V5XVtjaGFuZ2UuY2hhbmdlVHlwZV0gPSBjaGFuZ2U7Ci0gIH0sCi0KLSAgcmVtb3Zl
UmVsYXRpb25zaGlwQ2hhbmdlRm9yOiBmdW5jdGlvbihjbGllbnRSZWNvcmQsIGNoaWxkS2V5LCBw
YXJlbnRSZWNvcmQsIHBhcmVudEtleSwgdHlwZSkgewotICAgIHZhciBjbGllbnRJZCA9IGNsaWVu
dFJlY29yZC5jbGllbnRJZCwKLSAgICAgICAgcGFyZW50Q2xpZW50SWQgPSBwYXJlbnRSZWNvcmQg
PyBwYXJlbnRSZWNvcmQuY2xpZW50SWQgOiBwYXJlbnRSZWNvcmQ7Ci0gICAgdmFyIGNoYW5nZXMg
PSB0aGlzLl9yZWxhdGlvbnNoaXBDaGFuZ2VzOwotICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBh
cmVudEtleTsKLSAgICBpZiAoIShjbGllbnRJZCBpbiBjaGFuZ2VzKSB8fCAhKHBhcmVudENsaWVu
dElkIGluIGNoYW5nZXNbY2xpZW50SWRdKSB8fCAhKGtleSBpbiBjaGFuZ2VzW2NsaWVudElkXVtw
YXJlbnRDbGllbnRJZF0pKXsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGVsZXRlIGNoYW5n
ZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXVtrZXldW3R5cGVdOwotICB9LAotCi0gIHJlbGF0
aW9uc2hpcENoYW5nZVBhaXJzRm9yOiBmdW5jdGlvbihyZWNvcmQpewotICAgIHZhciB0b1JldHVy
biA9IFtdOwotCi0gICAgaWYoICFyZWNvcmQgKSB7IHJldHVybiB0b1JldHVybjsgfQotCi0gICAg
Ly9UT0RPKElnb3IpIFdoYXQgYWJvdXQgdGhlIG90aGVyIHNpZGUKLSAgICB2YXIgY2hhbmdlc09i
amVjdCA9IHRoaXMuX3JlbGF0aW9uc2hpcENoYW5nZXNbcmVjb3JkLmNsaWVudElkXTsKLSAgICBm
b3IgKHZhciBvYmpLZXkgaW4gY2hhbmdlc09iamVjdCl7Ci0gICAgICBpZihjaGFuZ2VzT2JqZWN0
Lmhhc093blByb3BlcnR5KG9iaktleSkpewotICAgICAgICBmb3IgKHZhciBjaGFuZ2VLZXkgaW4g
Y2hhbmdlc09iamVjdFtvYmpLZXldKXsKLSAgICAgICAgICBpZihjaGFuZ2VzT2JqZWN0W29iaktl
eV0uaGFzT3duUHJvcGVydHkoY2hhbmdlS2V5KSl7Ci0gICAgICAgICAgICB0b1JldHVybi5wdXNo
KGNoYW5nZXNPYmplY3Rbb2JqS2V5XVtjaGFuZ2VLZXldKTsKLSAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvUmV0dXJuOwotICB9LAotCi0gIC8vIC4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBQRVItVFlQRSBBREFQVEVSUwotICAvLyAuLi4u
Li4uLi4uLi4uLi4uLi4uLi4uCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgYWRhcHRlciBmb3Ig
YSBnaXZlbiB0eXBlLgotCi0gICAgQG1ldGhvZCBhZGFwdGVyRm9yCi0gICAgQHByaXZhdGUKLSAg
ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHJldHVybnMgRFMuQWRh
cHRlcgotICAqLwotICBhZGFwdGVyRm9yOiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGNvbnRh
aW5lciA9IHRoaXMuY29udGFpbmVyLCBhZGFwdGVyOwotCi0gICAgaWYgKGNvbnRhaW5lcikgewot
ICAgICAgYWRhcHRlciA9IGNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyArIHR5cGUudHlwZUtl
eSkgfHwgY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjphcHBsaWNhdGlvbicpOwotICAgIH0KLQot
ICAgIHJldHVybiBhZGFwdGVyIHx8IGdldCh0aGlzLCAnZGVmYXVsdEFkYXB0ZXInKTsKLSAgfSwK
LQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gLiBSRUNPUkQgQ0hB
TkdFIE5PVElGSUNBVElPTiAuCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgot
Ci0gIC8qKgotICAgIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcmlhbGl6ZXIgZm9yIGEg
Z2l2ZW4gdHlwZS4gRm9yCi0gICAgZXhhbXBsZSwgYHNlcmlhbGl6ZXJGb3IoJ3BlcnNvbicpYCB3
aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgotICAgIGBBcHAuUGVyc29uU2VyaWFsaXplcmAuCi0K
LSAgICBJZiBubyBgQXBwLlBlcnNvblNlcmlhbGl6ZXJgIGlzIGZvdW5kLCB0aGlzIG1ldGhvZCB3
aWxsIGxvb2sKLSAgICBmb3IgYW4gYEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXJgICh0aGUgZGVm
YXVsdCBzZXJpYWxpemVyIGZvcgotICAgIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uKS4KLQotICAg
IElmIG5vIGBBcHAuQXBwbGljYXRpb25TZXJpYWxpemVyYCBpcyBmb3VuZCwgaXQgd2lsbCBmYWxs
IGJhY2sKLSAgICB0byBhbiBpbnN0YW5jZSBvZiBgRFMuSlNPTlNlcmlhbGl6ZXJgLgotCi0gICAg
QG1ldGhvZCBzZXJpYWxpemVyRm9yCi0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
dHlwZSB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQotICAgIEByZXR1cm4ge0RTLlNlcmlhbGl6ZXJ9
Ci0gICovCi0gIHNlcmlhbGl6ZXJGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICB0eXBlID0gdGhp
cy5tb2RlbEZvcih0eXBlKTsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcih0eXBl
KTsKLQotICAgIHJldHVybiBzZXJpYWxpemVyRm9yKHRoaXMuY29udGFpbmVyLCB0eXBlLnR5cGVL
ZXksIGFkYXB0ZXIgJiYgYWRhcHRlci5kZWZhdWx0U2VyaWFsaXplcik7Ci0gIH0KLX0pOwotCi1m
dW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbnNoaXBzKHN0b3JlLCB0eXBlLCBkYXRhLCByZWNvcmQp
IHsKLSAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7
Ci0gICAgLy8gQSBsaW5rICh1c3VhbGx5IGEgVVJMKSB3YXMgYWxyZWFkeSBwcm92aWRlZCBpbgot
ICAgIC8vIG5vcm1hbGl6ZWQgZm9ybQotICAgIGlmIChkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nb
a2V5XSkgewotICAgICAgaWYgKHJlY29yZCAmJiByZWxhdGlvbnNoaXAub3B0aW9ucy5hc3luYykg
eyByZWNvcmQuX3JlbGF0aW9uc2hpcHNba2V5XSA9IG51bGw7IH0KLSAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICB2YXIga2luZCA9IHJlbGF0aW9uc2hpcC5raW5kLAotICAgICAgICB2YWx1ZSA9
IGRhdGFba2V5XTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7IHJldHVybjsgfQotCi0gICAg
aWYgKGtpbmQgPT09ICdiZWxvbmdzVG8nKSB7Ci0gICAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0
b3JlLCBkYXRhLCBrZXksIHJlbGF0aW9uc2hpcCwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAoa2lu
ZCA9PT0gJ2hhc01hbnknKSB7Ci0gICAgICBkZXNlcmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0
YSwga2V5LCByZWxhdGlvbnNoaXAsIHZhbHVlKTsKLSAgICAgIGFkZFVuc2F2ZWRSZWNvcmRzKHJl
Y29yZCwga2V5LCB2YWx1ZSk7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gZGF0YTsKLX0KLQot
ZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRJZChzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNo
aXAsIGlkKSB7Ci0gIGlmIChpc05vbmUoaWQpIHx8IGlkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsK
LSAgICByZXR1cm47Ci0gIH0KLQotICB2YXIgdHlwZTsKLQotICBpZiAodHlwZW9mIGlkID09PSAn
bnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7Ci0gICAgdHlwZSA9IHR5cGVGb3Io
cmVsYXRpb25zaGlwLCBrZXksIGRhdGEpOwotICAgIGRhdGFba2V5XSA9IHN0b3JlLnJlY29yZEZv
cklkKHR5cGUsIGlkKTsKLSAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7Ci0g
ICAgLy8gcG9seW1vcnBoaWMKLSAgICBkYXRhW2tleV0gPSBzdG9yZS5yZWNvcmRGb3JJZChpZC50
eXBlLCBpZC5pZCk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gdHlwZUZvcihyZWxhdGlvbnNoaXAsIGtl
eSwgZGF0YSkgewotICBpZiAocmVsYXRpb25zaGlwLm9wdGlvbnMucG9seW1vcnBoaWMpIHsKLSAg
ICByZXR1cm4gZGF0YVtrZXkgKyAiVHlwZSJdOwotICB9IGVsc2UgewotICAgIHJldHVybiByZWxh
dGlvbnNoaXAudHlwZTsKLSAgfQotfQotCi1mdW5jdGlvbiBkZXNlcmlhbGl6ZVJlY29yZElkcyhz
dG9yZSwgZGF0YSwga2V5LCByZWxhdGlvbnNoaXAsIGlkcykgewotICBmb3IgKHZhciBpPTAsIGw9
aWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0b3JlLCBp
ZHMsIGksIHJlbGF0aW9uc2hpcCwgaWRzW2ldKTsKLSAgfQotfQotCi0vLyBJZiB0aGVyZSBhcmUg
YW55IHVuc2F2ZWQgcmVjb3JkcyB0aGF0IGFyZSBpbiBhIGhhc01hbnkgdGhleSB3b24ndCBiZQot
Ly8gaW4gdGhlIHBheWxvYWQsIHNvIGFkZCB0aGVtIGJhY2sgaW4gbWFudWFsbHkuCi1mdW5jdGlv
biBhZGRVbnNhdmVkUmVjb3JkcyhyZWNvcmQsIGtleSwgZGF0YSkgewotICBpZihyZWNvcmQpIHsK
LSAgICBkYXRhLnB1c2hPYmplY3RzKHJlY29yZC5nZXQoa2V5KS5maWx0ZXJCeSgnaXNOZXcnKSk7
Ci0gIH0KLX0KLQotLy8gRGVsZWdhdGlvbiB0byB0aGUgYWRhcHRlciBhbmQgcHJvbWlzZSBtYW5h
Z2VtZW50Ci0vKioKLSAgQSBgUHJvbWlzZUFycmF5YCBpcyBhbiBvYmplY3QgdGhhdCBhY3RzIGxp
a2UgYm90aCBhbiBgRW1iZXIuQXJyYXlgCi0gIGFuZCBhIHByb21pc2UuIFdoZW4gdGhlIHByb21p
c2UgaXMgcmVzb2x2ZWQgdGhlIHRoZSByZXN1bHRpbmcgdmFsdWUKLSAgd2lsbCBiZSBzZXQgdG8g
dGhlIGBQcm9taXNlQXJyYXlgJ3MgYGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2VzCi0gIGl0
IGVhc3kgdG8gY3JlYXRlIGRhdGEgYmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VBcnJheWAgdGhh
dCB3aWxsIGJlCi0gIHVwZGF0ZWQgd2hlbiB0aGUgcHJvbWlzZSByZXNvbHZlcy4KLQotICBGb3Ig
bW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIFtFbWJlci5Qcm9taXNlUHJveHlNaXhpbgotICBkb2N1
bWVudGF0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4uaHRtbCkuCi0K
LSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHByb21pc2VBcnJheSA9IERTLlBy
b21pc2VBcnJheS5jcmVhdGUoewotICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3Rl
L2RhdGEuanNvbicpCi0gIH0pOwotCi0gIHByb21pc2VBcnJheS5nZXQoJ2xlbmd0aCcpOyAvLyAw
Ci0KLSAgcHJvbWlzZUFycmF5LnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgcHJvbWlzZUFycmF5Lmdl
dCgnbGVuZ3RoJyk7IC8vIDEwMAotICB9KTsKLSAgYGBgCi0KLSAgQGNsYXNzIFByb21pc2VBcnJh
eQotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLkFycmF5UHJveHkKLSAgQHVzZXMg
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KLSovCi1EUy5Qcm9taXNlQXJyYXkgPSBFbWJlci5BcnJh
eVByb3h5LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7Ci0vKioKLSAgQSBgUHJvbWlz
ZU9iamVjdGAgaXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBsaWtlIGJvdGggYW4gYEVtYmVyLk9iamVj
dGAKLSAgYW5kIGEgcHJvbWlzZS4gV2hlbiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB0aGUgdGhl
IHJlc3VsdGluZyB2YWx1ZQotICB3aWxsIGJlIHNldCB0byB0aGUgYFByb21pc2VPYmplY3RgJ3Mg
YGNvbnRlbnRgIHByb3BlcnR5LiBUaGlzIG1ha2VzCi0gIGl0IGVhc3kgdG8gY3JlYXRlIGRhdGEg
YmluZGluZ3Mgd2l0aCB0aGUgYFByb21pc2VPYmplY3RgIHRoYXQgd2lsbAotICBiZSB1cGRhdGVk
IHdoZW4gdGhlIHByb21pc2UgcmVzb2x2ZXMuCi0KLSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2Vl
IHRoZSBbRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4KLSAgZG9jdW1lbnRhdGlvbl0oL2FwaS9jbGFz
c2VzL0VtYmVyLlByb21pc2VQcm94eU1peGluLmh0bWwpLgotCi0gIEV4YW1wbGUKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBwcm9taXNlT2JqZWN0ID0gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUo
ewotICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUvcmVtb3RlL2RhdGEuanNvbicpCi0gIH0p
OwotCi0gIHByb21pc2VPYmplY3QuZ2V0KCduYW1lJyk7IC8vIG51bGwKLQotICBwcm9taXNlT2Jq
ZWN0LnRoZW4oZnVuY3Rpb24oKSB7Ci0gICAgcHJvbWlzZU9iamVjdC5nZXQoJ25hbWUnKTsgLy8g
J1RvbXN0ZXInCi0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgUHJvbWlzZU9iamVjdAotICBAbmFt
ZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdFByb3h5Ci0gIEB1c2VzIEVtYmVyLlBy
b21pc2VQcm94eU1peGluCi0qLwotRFMuUHJvbWlzZU9iamVjdCA9IEVtYmVyLk9iamVjdFByb3h5
LmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbik7Ci0KLWZ1bmN0aW9uIHByb21pc2VPYmpl
Y3QocHJvbWlzZSkgewotICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNl
OiBwcm9taXNlIH0pOwotfQotCi1mdW5jdGlvbiBwcm9taXNlQXJyYXkocHJvbWlzZSkgewotICBy
ZXR1cm4gRFMuUHJvbWlzZUFycmF5LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2UgfSk7Ci19Ci0K
LWZ1bmN0aW9uIGlzVGhlbmFibGUob2JqZWN0KSB7Ci0gIHJldHVybiBvYmplY3QgJiYgdHlwZW9m
IG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nOwotfQotCi1mdW5jdGlvbiBzZXJpYWxpemVyRm9y
KGNvbnRhaW5lciwgdHlwZSwgZGVmYXVsdFNlcmlhbGl6ZXIpIHsKLSAgcmV0dXJuIGNvbnRhaW5l
ci5sb29rdXAoJ3NlcmlhbGl6ZXI6Jyt0eXBlKSB8fAotICAgICAgICAgICAgICAgICBjb250YWlu
ZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKLSAgICAgICAgICAgICAgICAg
Y29udGFpbmVyLmxvb2t1cCgnc2VyaWFsaXplcjonICsgZGVmYXVsdFNlcmlhbGl6ZXIpIHx8Ci0g
ICAgICAgICAgICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsK
LX0KLQotZnVuY3Rpb24gZGVmYXVsdFNlcmlhbGl6ZXIoY29udGFpbmVyKSB7Ci0gIHJldHVybiBj
b250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9uJykgfHwKLSAgICAgICAgIGNv
bnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnKTsKLX0KLQotZnVuY3Rpb24gc2Vy
aWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSkgewotICB2YXIgc2VyaWFsaXplciA9IGFk
YXB0ZXIuc2VyaWFsaXplciwKLSAgICAgIGRlZmF1bHRTZXJpYWxpemVyID0gYWRhcHRlci5kZWZh
dWx0U2VyaWFsaXplciwKLSAgICAgIGNvbnRhaW5lciA9IGFkYXB0ZXIuY29udGFpbmVyOwotCi0g
IGlmIChjb250YWluZXIgJiYgc2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgc2VyaWFs
aXplciA9IHNlcmlhbGl6ZXJGb3IoY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGRlZmF1bHRTZXJp
YWxpemVyKTsKLSAgfQotCi0gIGlmIChzZXJpYWxpemVyID09PSBudWxsIHx8IHNlcmlhbGl6ZXIg
PT09IHVuZGVmaW5lZCkgewotICAgIHNlcmlhbGl6ZXIgPSB7Ci0gICAgICBleHRyYWN0OiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgeyByZXR1cm4gcGF5bG9hZDsgfQotICAgIH07Ci0g
IH0KLQotICByZXR1cm4gc2VyaWFsaXplcjsKLX0KLQotZnVuY3Rpb24gX2ZpbmQoYWRhcHRlciwg
c3RvcmUsIHR5cGUsIGlkKSB7Ci0gIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5kKHN0b3JlLCB0
eXBlLCBpZCksCi0gICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRl
ciwgdHlwZSk7Ci0KLSAgcmV0dXJuIHJlc29sdmUocHJvbWlzZSwgIkRTOiBIYW5kbGUgQWRhcHRl
ciNmaW5kIG9mICIgKyB0eXBlICsgIiB3aXRoIGlkOiAiICsgaWQpLnRoZW4oZnVuY3Rpb24ocGF5
bG9hZCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91IG1hZGUgYSByZXF1ZXN0IGZvciBhICIgKyB0
eXBlLnR5cGVLZXkgKyAiIHdpdGggaWQgIiArIGlkICsgIiwgYnV0IHRoZSBhZGFwdGVyJ3MgcmVz
cG9uc2UgZGlkIG5vdCBoYXZlIGFueSBkYXRhIiwgcGF5bG9hZCk7Ci0gICAgcGF5bG9hZCA9IHNl
cmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgaWQsICdmaW5kJyk7Ci0KLSAg
ICByZXR1cm4gc3RvcmUucHVzaCh0eXBlLCBwYXlsb2FkKTsKLSAgfSwgZnVuY3Rpb24oZXJyb3Ip
IHsKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuZ2V0QnlJZCh0eXBlLCBpZCk7Ci0gICAgcmVjb3Jk
Lm5vdEZvdW5kKCk7Ci0gICAgdGhyb3cgZXJyb3I7Ci0gIH0sICJEUzogRXh0cmFjdCBwYXlsb2Fk
IG9mICciICsgdHlwZSArICInIik7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kTWFueShhZGFwdGVyLCBz
dG9yZSwgdHlwZSwgaWRzLCBvd25lcikgewotICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZE1h
bnkoc3RvcmUsIHR5cGUsIGlkcywgb3duZXIpLAotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6
ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2Us
ICJEUzogSGFuZGxlIEFkYXB0ZXIjZmluZE1hbnkgb2YgIiArIHR5cGUpLnRoZW4oZnVuY3Rpb24o
cGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUs
IHBheWxvYWQsIG51bGwsICdmaW5kTWFueScpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgcmVz
cG9uc2UgZnJvbSBhIGZpbmRNYW55IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5z
cGVjdChwYXlsb2FkKSwgRW1iZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXknKTsKLQotICAg
IHN0b3JlLnB1c2hNYW55KHR5cGUsIHBheWxvYWQpOwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3Qg
cGF5bG9hZCBvZiAiICsgdHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kSGFzTWFueShhZGFwdGVy
LCBzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApIHsKLSAgdmFyIHByb21pc2UgPSBh
ZGFwdGVyLmZpbmRIYXNNYW55KHN0b3JlLCByZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCksCi0g
ICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgcmVsYXRpb25z
aGlwLnR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0
ZXIjZmluZEhhc01hbnkgb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUp
LnRoZW4oZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJh
Y3Qoc3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZEhhc01hbnkn
KTsKLQotICAgIEVtYmVyLmFzc2VydCgiVGhlIHJlc3BvbnNlIGZyb20gYSBmaW5kSGFzTWFueSBt
dXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5
cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7Ci0KLSAgICB2YXIgcmVjb3JkcyA9IHN0b3JlLnB1
c2hNYW55KHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkKTsKLSAgICByZWNvcmQudXBkYXRlSGFz
TWFueShyZWxhdGlvbnNoaXAua2V5LCByZWNvcmRzKTsKLSAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0
IHBheWxvYWQgb2YgIiArIHJlY29yZCArICIgOiBoYXNNYW55ICIgKyByZWxhdGlvbnNoaXAudHlw
ZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQmVsb25nc1RvKGFkYXB0ZXIsIHN0b3JlLCByZWNvcmQs
IGxpbmssIHJlbGF0aW9uc2hpcCkgewotICB2YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZEJlbG9u
Z3NUbyhzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApLAotICAgICAgc2VyaWFsaXpl
ciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHJlbGF0aW9uc2hpcC50eXBlKTsKLQot
ICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRCZWxvbmdz
VG8gb2YgIiArIHJlY29yZCArICIgOiAiICsgcmVsYXRpb25zaGlwLnR5cGUpLnRoZW4oZnVuY3Rp
b24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHJl
bGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkLCBudWxsLCAnZmluZEJlbG9uZ3NUbycpOwotCi0gICAg
dmFyIHJlY29yZCA9IHN0b3JlLnB1c2gocmVsYXRpb25zaGlwLnR5cGUsIHBheWxvYWQpOwotICAg
IHJlY29yZC51cGRhdGVCZWxvbmdzVG8ocmVsYXRpb25zaGlwLmtleSwgcmVjb3JkKTsKLSAgICBy
ZXR1cm4gcmVjb3JkOwotICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgcmVj
b3JkICsgIiA6ICIgKyByZWxhdGlvbnNoaXAudHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9maW5kQWxs
KGFkYXB0ZXIsIHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7Ci0gIHZhciBwcm9taXNlID0gYWRh
cHRlci5maW5kQWxsKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSwKLSAgICAgIHNlcmlhbGl6ZXIg
PSBzZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVyLCB0eXBlKTsKLQotICByZXR1cm4gcmVzb2x2
ZShwcm9taXNlLCAiRFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRBbGwgb2YgIiArIHR5cGUpLnRoZW4o
ZnVuY3Rpb24ocGF5bG9hZCkgewotICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3Rv
cmUsIHR5cGUsIHBheWxvYWQsIG51bGwsICdmaW5kQWxsJyk7Ci0KLSAgICBFbWJlci5hc3NlcnQo
IlRoZSByZXNwb25zZSBmcm9tIGEgZmluZEFsbCBtdXN0IGJlIGFuIEFycmF5LCBub3QgIiArIEVt
YmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5cGVPZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7
Ci0KLSAgICBzdG9yZS5wdXNoTWFueSh0eXBlLCBwYXlsb2FkKTsKLSAgICBzdG9yZS5kaWRVcGRh
dGVBbGwodHlwZSk7Ci0gICAgcmV0dXJuIHN0b3JlLmFsbCh0eXBlKTsKLSAgfSwgbnVsbCwgIkRT
OiBFeHRyYWN0IHBheWxvYWQgb2YgZmluZEFsbCAiICsgdHlwZSk7Ci19Ci0KLWZ1bmN0aW9uIF9m
aW5kUXVlcnkoYWRhcHRlciwgc3RvcmUsIHR5cGUsIHF1ZXJ5LCByZWNvcmRBcnJheSkgewotICB2
YXIgcHJvbWlzZSA9IGFkYXB0ZXIuZmluZFF1ZXJ5KHN0b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3Jk
QXJyYXkpLAotICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIs
IHR5cGUpOwotCi0gIHJldHVybiByZXNvbHZlKHByb21pc2UsICJEUzogSGFuZGxlIEFkYXB0ZXIj
ZmluZFF1ZXJ5IG9mICIgKyB0eXBlKS50aGVuKGZ1bmN0aW9uKHBheWxvYWQpIHsKLSAgICBwYXls
b2FkID0gc2VyaWFsaXplci5leHRyYWN0KHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBudWxsLCAnZmlu
ZFF1ZXJ5Jyk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9tIGEgZmluZFF1
ZXJ5IG11c3QgYmUgYW4gQXJyYXksIG5vdCAiICsgRW1iZXIuaW5zcGVjdChwYXlsb2FkKSwgRW1i
ZXIudHlwZU9mKHBheWxvYWQpID09PSAnYXJyYXknKTsKLQotICAgIHJlY29yZEFycmF5LmxvYWQo
cGF5bG9hZCk7Ci0gICAgcmV0dXJuIHJlY29yZEFycmF5OwotICB9LCBudWxsLCAiRFM6IEV4dHJh
Y3QgcGF5bG9hZCBvZiBmaW5kUXVlcnkgIiArIHR5cGUpOwotfQotCi1mdW5jdGlvbiBfY29tbWl0
KGFkYXB0ZXIsIHN0b3JlLCBvcGVyYXRpb24sIHJlY29yZCkgewotICB2YXIgdHlwZSA9IHJlY29y
ZC5jb25zdHJ1Y3RvciwKLSAgICAgIHByb21pc2UgPSBhZGFwdGVyW29wZXJhdGlvbl0oc3RvcmUs
IHR5cGUsIHJlY29yZCksCi0gICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIo
YWRhcHRlciwgdHlwZSk7Ci0KLSAgRW1iZXIuYXNzZXJ0KCJZb3VyIGFkYXB0ZXIncyAnIiArIG9w
ZXJhdGlvbiArICInIG1ldGhvZCBtdXN0IHJldHVybiBhIHByb21pc2UsIGJ1dCBpdCByZXR1cm5l
ZCAiICsgcHJvbWlzZSwgaXNUaGVuYWJsZShwcm9taXNlKSk7Ci0KLSAgcmV0dXJuIHByb21pc2Uu
dGhlbihmdW5jdGlvbihwYXlsb2FkKSB7Ci0gICAgaWYgKHBheWxvYWQpIHsgcGF5bG9hZCA9IHNl
cmlhbGl6ZXIuZXh0cmFjdChzdG9yZSwgdHlwZSwgcGF5bG9hZCwgZ2V0KHJlY29yZCwgJ2lkJyks
IG9wZXJhdGlvbik7IH0KLSAgICBzdG9yZS5kaWRTYXZlUmVjb3JkKHJlY29yZCwgcGF5bG9hZCk7
Ci0gICAgcmV0dXJuIHJlY29yZDsKLSAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgaWYgKHJl
YXNvbiBpbnN0YW5jZW9mIERTLkludmFsaWRFcnJvcikgewotICAgICAgc3RvcmUucmVjb3JkV2Fz
SW52YWxpZChyZWNvcmQsIHJlYXNvbi5lcnJvcnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdG9y
ZS5yZWNvcmRXYXNFcnJvcihyZWNvcmQsIHJlYXNvbik7Ci0gICAgfQotCi0gICAgdGhyb3cgcmVh
c29uOwotICB9LCAiRFM6IEV4dHJhY3QgYW5kIG5vdGlmeSBhYm91dCAiICsgb3BlcmF0aW9uICsg
IiBjb21wbGV0aW9uIG9mICIgKyByZWNvcmQpOwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdl
dCwgc2V0ID0gRW1iZXIuc2V0OwotLyoKLSAgVGhpcyBmaWxlIGVuY2Fwc3VsYXRlcyB0aGUgdmFy
aW91cyBzdGF0ZXMgdGhhdCBhIHJlY29yZCBjYW4gdHJhbnNpdGlvbgotICB0aHJvdWdoIGR1cmlu
ZyBpdHMgbGlmZWN5Y2xlLgotKi8KLS8qKgotICAjIyMgU3RhdGUKLQotICBFYWNoIHJlY29yZCBo
YXMgYSBgY3VycmVudFN0YXRlYCBwcm9wZXJ0eSB0aGF0IGV4cGxpY2l0bHkgdHJhY2tzIHdoYXQK
LSAgc3RhdGUgYSByZWNvcmQgaXMgaW4gYXQgYW55IGdpdmVuIHRpbWUuIEZvciBpbnN0YW5jZSwg
aWYgYSByZWNvcmQgaXMKLSAgbmV3bHkgY3JlYXRlZCBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBzZW50
IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNhdmVkLAotICBpdCB3b3VsZCBiZSBpbiB0aGUgYHJvb3Qu
bG9hZGVkLmNyZWF0ZWQudW5jb21taXR0ZWRgIHN0YXRlLiAgSWYgYQotICByZWNvcmQgaGFzIGhh
ZCBsb2NhbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gaXQgdGhhdCBhcmUgaW4gdGhlCi0gIHByb2Nl
c3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSByZWNvcmQgd291bGQgYmUgaW4gdGhlCi0gIGByb290Lmxv
YWRlZC51cGRhdGVkLmluRmxpZ2h0YCBzdGF0ZS4gKFRoZXNlIHN0YXRlIHBhdGhzIHdpbGwgYmUK
LSAgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LikKLQotICBFdmVudHMgYXJlIHNlbnQg
YnkgdGhlIHJlY29yZCBvciBpdHMgc3RvcmUgdG8gdGhlIHJlY29yZCdzCi0gIGBjdXJyZW50U3Rh
dGVgIHByb3BlcnR5LiBIb3cgdGhlIHN0YXRlIHJlYWN0cyB0byB0aGVzZSBldmVudHMgaXMKLSAg
ZGVwZW5kZW50IG9uIHdoaWNoIHN0YXRlIGl0IGlzIGluLiBJbiBzb21lIHN0YXRlcywgY2VydGFp
biBldmVudHMKLSAgd2lsbCBiZSBpbnZhbGlkIGFuZCB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0
byBiZSByYWlzZWQuCi0KLSAgU3RhdGVzIGFyZSBoaWVyYXJjaGljYWwgYW5kIGV2ZXJ5IHN0YXRl
IGlzIGEgc3Vic3RhdGUgb2YgdGhlCi0gIGBSb290U3RhdGVgLiBGb3IgZXhhbXBsZSwgYSByZWNv
cmQgY2FuIGJlIGluIHRoZQotICBgcm9vdC5kZWxldGVkLnVuY29tbWl0dGVkYCBzdGF0ZSwgdGhl
biB0cmFuc2l0aW9uIGludG8gdGhlCi0gIGByb290LmRlbGV0ZWQuaW5GbGlnaHRgIHN0YXRlLiBJ
ZiBhIGNoaWxkIHN0YXRlIGRvZXMgbm90IGltcGxlbWVudAotICBhbiBldmVudCBoYW5kbGVyLCB0
aGUgc3RhdGUgbWFuYWdlciB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBldmVudAotICBvbiBh
bGwgcGFyZW50IHN0YXRlcyB1bnRpbCB0aGUgcm9vdCBzdGF0ZSBpcyByZWFjaGVkLiBUaGUgc3Rh
dGUKLSAgaGllcmFyY2h5IG9mIGEgcmVjb3JkIGlzIGRlc2NyaWJlZCBpbiB0ZXJtcyBvZiBhIHBh
dGggc3RyaW5nLiBZb3UKLSAgY2FuIGRldGVybWluZSBhIHJlY29yZCdzIGN1cnJlbnQgc3RhdGUg
YnkgZ2V0dGluZyB0aGUgc3RhdGUncwotICBgc3RhdGVOYW1lYCBwcm9wZXJ0eToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHJlY29yZC5nZXQoJ2N1cnJlbnRTdGF0ZS5zdGF0ZU5hbWUnKTsKLSAgLy89
PiAicm9vdC5jcmVhdGVkLnVuY29tbWl0dGVkIgotICAgYGBgCi0KLSAgVGhlIGhpZXJhcmNoeSBv
ZiB2YWxpZCBzdGF0ZXMgdGhhdCBzaGlwIHdpdGggZW1iZXIgZGF0YSBsb29rcyBsaWtlCi0gIHRo
aXM6Ci0KLSAgYGBgdGV4dAotICAqIHJvb3QKLSAgICAqIGRlbGV0ZWQKLSAgICAgICogc2F2ZWQK
LSAgICAgICogdW5jb21taXR0ZWQKLSAgICAgICogaW5GbGlnaHQKLSAgICAqIGVtcHR5Ci0gICAg
KiBsb2FkZWQKLSAgICAgICogY3JlYXRlZAotICAgICAgICAqIHVuY29tbWl0dGVkCi0gICAgICAg
ICogaW5GbGlnaHQKLSAgICAgICogc2F2ZWQKLSAgICAgICogdXBkYXRlZAotICAgICAgICAqIHVu
Y29tbWl0dGVkCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAqIGxvYWRpbmcKLSAgYGBgCi0KLSAg
VGhlIGBEUy5Nb2RlbGAgc3RhdGVzIGFyZSB0aGVtc2VsdmVzIHN0YXRlbGVzcy4gV2hhdCB3ZSBt
ZWFuIGlzCi0gIHRoYXQsIHRoZSBoaWVyYXJjaGljYWwgc3RhdGVzIHRoYXQgZWFjaCBvZiAqdGhv
c2UqIHBvaW50cyB0byBpcyBhCi0gIHNoYXJlZCBkYXRhIHN0cnVjdHVyZS4gRm9yIHBlcmZvcm1h
bmNlIHJlYXNvbnMsIGluc3RlYWQgb2YgZWFjaAotICByZWNvcmQgZ2V0dGluZyBpdHMgb3duIGNv
cHkgb2YgdGhlIGhpZXJhcmNoeSBvZiBzdGF0ZXMsIGVhY2ggcmVjb3JkCi0gIHBvaW50cyB0byB0
aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBpbnN0YW5jZS4gSG93IGRvZXMgYSBzdGF0ZQot
ICBrbm93IHdoaWNoIHJlY29yZCBpdCBzaG91bGQgYmUgYWN0aW5nIG9uPyBXZSBwYXNzIHRoZSBy
ZWNvcmQKLSAgaW5zdGFuY2UgaW50byB0aGUgc3RhdGUncyBldmVudCBoYW5kbGVycyBhcyB0aGUg
Zmlyc3QgYXJndW1lbnQuCi0KLSAgVGhlIHJlY29yZCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFt
ZXRlciBpcyB3aGVyZSB5b3Ugc2hvdWxkIHN0YXNoCi0gIHN0YXRlIGFib3V0IHRoZSByZWNvcmQg
aWYgbmVlZGVkOyB5b3Ugc2hvdWxkIG5ldmVyIHN0b3JlIGRhdGEgb24gdGhlIHN0YXRlCi0gIG9i
amVjdCBpdHNlbGYuCi0KLSAgIyMjIEV2ZW50cyBhbmQgRmxhZ3MKLQotICBBIHN0YXRlIG1heSBp
bXBsZW1lbnQgemVybyBvciBtb3JlIGV2ZW50cyBhbmQgZmxhZ3MuCi0KLSAgIyMjIyBFdmVudHMK
LQotICBFdmVudHMgYXJlIG5hbWVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnZva2VkIHdoZW4gc2Vu
dCB0byBhIHJlY29yZC4gVGhlCi0gIHJlY29yZCB3aWxsIGZpcnN0IGxvb2sgZm9yIGEgbWV0aG9k
IHdpdGggdGhlIGdpdmVuIG5hbWUgb24gdGhlCi0gIGN1cnJlbnQgc3RhdGUuIElmIG5vIG1ldGhv
ZCBpcyBmb3VuZCwgaXQgd2lsbCBzZWFyY2ggdGhlIGN1cnJlbnQKLSAgc3RhdGUncyBwYXJlbnQs
IGFuZCB0aGVuIGl0cyBncmFuZHBhcmVudCwgYW5kIHNvIG9uIHVudGlsIHJlYWNoaW5nCi0gIHRo
ZSB0b3Agb2YgdGhlIGhpZXJhcmNoeS4gSWYgdGhlIHJvb3QgaXMgcmVhY2hlZCB3aXRob3V0IGFu
IGV2ZW50Ci0gIGhhbmRsZXIgYmVpbmcgZm91bmQsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNl
ZC4gVGhpcyBjYW4gYmUgdmVyeQotICBoZWxwZnVsIHdoZW4gZGVidWdnaW5nIG5ldyBmZWF0dXJl
cy4KLQotICBIZXJlJ3MgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHN0YXRlIHdpdGgg
YSBgbXlFdmVudGAgZXZlbnQgaGFuZGxlcjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIGFTdGF0ZTog
RFMuU3RhdGUuY3JlYXRlKHsKLSAgICBteUV2ZW50OiBmdW5jdGlvbihtYW5hZ2VyLCBwYXJhbSkg
ewotICAgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIG15RXZlbnQgd2l0aCIsIHBhcmFtKTsKLSAg
ICB9Ci0gIH0pCi0gIGBgYAotCi0gIFRvIHRyaWdnZXIgdGhpcyBldmVudDoKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIHJlY29yZC5zZW5kKCdteUV2ZW50JywgJ2ZvbycpOwotICAvLz0+ICJSZWNlaXZl
ZCBteUV2ZW50IHdpdGggZm9vIgotICBgYGAKLQotICBOb3RlIHRoYXQgYW4gb3B0aW9uYWwgcGFy
YW1ldGVyIGNhbiBiZSBzZW50IHRvIGEgcmVjb3JkJ3MgYHNlbmQoKWAgbWV0aG9kLAotICB3aGlj
aCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byB0aGUgZXZlbnQgaGFu
ZGxlci4KLQotICBFdmVudHMgc2hvdWxkIHRyYW5zaXRpb24gdG8gYSBkaWZmZXJlbnQgc3RhdGUg
aWYgYXBwcm9wcmlhdGUuIFRoaXMgY2FuIGJlCi0gIGRvbmUgYnkgY2FsbGluZyB0aGUgcmVjb3Jk
J3MgYHRyYW5zaXRpb25UbygpYCBtZXRob2Qgd2l0aCBhIHBhdGggdG8gdGhlCi0gIGRlc2lyZWQg
c3RhdGUuIFRoZSBzdGF0ZSBtYW5hZ2VyIHdpbGwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzdGF0
ZSBwYXRoCi0gIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlLiBJZiBubyBzdGF0ZSBpcyBm
b3VuZCBhdCB0aGF0IHBhdGgsIGl0IHdpbGwKLSAgYXR0ZW1wdCB0byByZXNvbHZlIGl0IHJlbGF0
aXZlIHRvIHRoZSBjdXJyZW50IHN0YXRlJ3MgcGFyZW50LCBhbmQgdGhlbiBpdHMKLSAgcGFyZW50
LCBhbmQgc28gb24gdW50aWwgdGhlIHJvb3QgaXMgcmVhY2hlZC4gRm9yIGV4YW1wbGUsIGltYWdp
bmUgYSBoaWVyYXJjaHkKLSAgbGlrZSB0aGlzOgotCi0gICAgICAqIGNyZWF0ZWQKLSAgICAgICAg
KiB1bmNvbW1pdHRlZCA8LS0gY3VycmVudFN0YXRlCi0gICAgICAgICogaW5GbGlnaHQKLSAgICAg
ICogdXBkYXRlZAotICAgICAgICAqIGluRmxpZ2h0Ci0KLSAgSWYgd2UgYXJlIGN1cnJlbnRseSBp
biB0aGUgYHVuY29tbWl0dGVkYCBzdGF0ZSwgY2FsbGluZwotICBgdHJhbnNpdGlvblRvKCdpbkZs
aWdodCcpYCB3b3VsZCB0cmFuc2l0aW9uIHRvIHRoZSBgY3JlYXRlZC5pbkZsaWdodGAgc3RhdGUs
Ci0gIHdoaWxlIGNhbGxpbmcgYHRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpYCB3b3Vs
ZCB0cmFuc2l0aW9uIHRvCi0gIHRoZSBgdXBkYXRlZC5pbkZsaWdodGAgc3RhdGUuCi0KLSAgUmVt
ZW1iZXIgdGhhdCAqb25seSBldmVudHMqIHNob3VsZCBldmVyIGNhdXNlIGEgc3RhdGUgdHJhbnNp
dGlvbi4gWW91IHNob3VsZAotICBuZXZlciBjYWxsIGB0cmFuc2l0aW9uVG8oKWAgZnJvbSBvdXRz
aWRlIGEgc3RhdGUncyBldmVudCBoYW5kbGVyLiBJZiB5b3UgYXJlCi0gIHRlbXB0ZWQgdG8gZG8g
c28sIGNyZWF0ZSBhIG5ldyBldmVudCBhbmQgc2VuZCB0aGF0IHRvIHRoZSBzdGF0ZSBtYW5hZ2Vy
LgotCi0gICMjIyMgRmxhZ3MKLQotICBGbGFncyBhcmUgQm9vbGVhbiB2YWx1ZXMgdGhhdCBjYW4g
YmUgdXNlZCB0byBpbnRyb3NwZWN0IGEgcmVjb3JkJ3MgY3VycmVudAotICBzdGF0ZSBpbiBhIG1v
cmUgdXNlci1mcmllbmRseSB3YXkgdGhhbiBleGFtaW5pbmcgaXRzIHN0YXRlIHBhdGguIEZvciBl
eGFtcGxlLAotICBpbnN0ZWFkIG9mIGRvaW5nIHRoaXM6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2
YXIgc3RhdGVQYXRoID0gcmVjb3JkLmdldCgnc3RhdGVNYW5hZ2VyLmN1cnJlbnRQYXRoJyk7Ci0g
IGlmIChzdGF0ZVBhdGggPT09ICdjcmVhdGVkLmluRmxpZ2h0JykgewotICAgIGRvU29tZXRoaW5n
KCk7Ci0gIH0KLSAgYGBgCi0KLSAgWW91IGNhbiBzYXk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBp
ZiAocmVjb3JkLmdldCgnaXNOZXcnKSAmJiByZWNvcmQuZ2V0KCdpc1NhdmluZycpKSB7Ci0gICAg
ZG9Tb21ldGhpbmcoKTsKLSAgfQotICBgYGAKLQotICBJZiB5b3VyIHN0YXRlIGRvZXMgbm90IHNl
dCBhIHZhbHVlIGZvciBhIGdpdmVuIGZsYWcsIHRoZSB2YWx1ZSB3aWxsCi0gIGJlIGluaGVyaXRl
ZCBmcm9tIGl0cyBwYXJlbnQgKG9yIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgc3RhdGUgaGllcmFy
Y2h5Ci0gIHdoZXJlIGl0IGlzIGRlZmluZWQpLgotCi0gIFRoZSBjdXJyZW50IHNldCBvZiBmbGFn
cyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IGZsYWcsCi0gIGlu
IGFkZGl0aW9uIHRvIHRoZSBhcmVhIGJlbG93LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGVjbGFy
ZSBpdCBpbiB0aGUKLSAgYERTLk1vZGVsYCBjbGFzcy4KLQotCi0gICAqIFtpc0VtcHR5XShEUy5N
b2RlbC5odG1sI3Byb3BlcnR5X2lzRW1wdHkpCi0gICAqIFtpc0xvYWRpbmddKERTLk1vZGVsLmh0
bWwjcHJvcGVydHlfaXNMb2FkaW5nKQotICAgKiBbaXNMb2FkZWRdKERTLk1vZGVsLmh0bWwjcHJv
cGVydHlfaXNMb2FkZWQpCi0gICAqIFtpc0RpcnR5XShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lz
RGlydHkpCi0gICAqIFtpc1NhdmluZ10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc1NhdmluZykK
LSAgICogW2lzRGVsZXRlZF0oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc0RlbGV0ZWQpCi0gICAq
IFtpc05ld10oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc05ldykKLSAgICogW2lzVmFsaWRdKERT
Lk1vZGVsLmh0bWwjcHJvcGVydHlfaXNWYWxpZCkKLQotICBAbmFtZXNwYWNlIERTCi0gIEBjbGFz
cyBSb290U3RhdGUKLSovCi0KLXZhciBoYXNEZWZpbmVkUHJvcGVydGllcyA9IGZ1bmN0aW9uKG9i
amVjdCkgewotICAvLyBJZ25vcmUgaW50ZXJuYWwgcHJvcGVydHkgZGVmaW5lZCBieSBzaW11bGF0
ZWQgYEVtYmVyLmNyZWF0ZWAuCi0gIHZhciBuYW1lcyA9IEVtYmVyLmtleXMob2JqZWN0KTsKLSAg
dmFyIGksIGwsIG5hbWU7Ci0gIGZvciAoaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7Ci0gICAgbmFtZSA9IG5hbWVzW2ldOwotICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVy
dHkobmFtZSkgJiYgb2JqZWN0W25hbWVdKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICByZXR1
cm4gZmFsc2U7Ci19OwotCi12YXIgZGlkU2V0UHJvcGVydHkgPSBmdW5jdGlvbihyZWNvcmQsIGNv
bnRleHQpIHsKLSAgaWYgKGNvbnRleHQudmFsdWUgPT09IGNvbnRleHQub3JpZ2luYWxWYWx1ZSkg
ewotICAgIGRlbGV0ZSByZWNvcmQuX2F0dHJpYnV0ZXNbY29udGV4dC5uYW1lXTsKLSAgICByZWNv
cmQuc2VuZCgncHJvcGVydHlXYXNSZXNldCcsIGNvbnRleHQubmFtZSk7Ci0gIH0gZWxzZSBpZiAo
Y29udGV4dC52YWx1ZSAhPT0gY29udGV4dC5vbGRWYWx1ZSkgewotICAgIHJlY29yZC5zZW5kKCdi
ZWNvbWVEaXJ0eScpOwotICB9Ci0KLSAgcmVjb3JkLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7
Ci19OwotCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vCi0vLyBFYWNoIHN0YXRlIGhhcyBh
IGJvb2xlYW4gdmFsdWUgZm9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotLy8KLS8vICog
aXNMb2FkZWQ6IFRoZSByZWNvcmQgaGFzIGEgcG9wdWxhdGVkIGBkYXRhYCBwcm9wZXJ0eS4gV2hl
biBhCi0vLyAgIHJlY29yZCBpcyBsb2FkZWQgdmlhIGBzdG9yZS5maW5kYCwgYGlzTG9hZGVkYCBp
cyBmYWxzZQotLy8gICB1bnRpbCB0aGUgYWRhcHRlciBzZXRzIGl0LiBXaGVuIGEgcmVjb3JkIGlz
IGNyZWF0ZWQgbG9jYWxseSwKLS8vICAgaXRzIGBpc0xvYWRlZGAgcHJvcGVydHkgaXMgYWx3YXlz
IHRydWUuCi0vLyAqIGlzRGlydHk6IFRoZSByZWNvcmQgaGFzIGxvY2FsIGNoYW5nZXMgdGhhdCBo
YXZlIG5vdCB5ZXQgYmVlbgotLy8gICBzYXZlZCBieSB0aGUgYWRhcHRlci4gVGhpcyBpbmNsdWRl
cyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuCi0vLyAgIGNyZWF0ZWQgKGJ1dCBub3QgeWV0IHNhdmVk
KSBvciBkZWxldGVkLgotLy8gKiBpc1NhdmluZzogVGhlIHJlY29yZCBoYXMgYmVlbiBjb21taXR0
ZWQsIGJ1dAotLy8gICB0aGUgYWRhcHRlciBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgdGhhdCB0
aGUgY2hhbmdlcyBoYXZlCi0vLyAgIGJlZW4gcGVyc2lzdGVkIHRvIHRoZSBiYWNrZW5kLgotLy8g
KiBpc0RlbGV0ZWQ6IFRoZSByZWNvcmQgd2FzIG1hcmtlZCBmb3IgZGVsZXRpb24uIFdoZW4gYGlz
RGVsZXRlZGAKLS8vICAgaXMgdHJ1ZSBhbmQgYGlzRGlydHlgIGlzIHRydWUsIHRoZSByZWNvcmQg
aXMgZGVsZXRlZCBsb2NhbGx5Ci0vLyAgIGJ1dCB0aGUgZGVsZXRpb24gd2FzIG5vdCB5ZXQgcGVy
c2lzdGVkLiBXaGVuIGBpc1NhdmluZ2AgaXMKLS8vICAgdHJ1ZSwgdGhlIGNoYW5nZSBpcyBpbi1m
bGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0eWAgYW5kCi0vLyAgIGBpc1NhdmluZ2AgYXJlIGZhbHNl
LCB0aGUgY2hhbmdlIGhhcyBwZXJzaXN0ZWQuCi0vLyAqIGlzRXJyb3I6IFRoZSBhZGFwdGVyIHJl
cG9ydGVkIHRoYXQgaXQgd2FzIHVuYWJsZSB0byBzYXZlCi0vLyAgIGxvY2FsIGNoYW5nZXMgdG8g
dGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZQotLy8gICByZWNvcmQgaGF2
aW5nIGl0cyBgaXNWYWxpZGAgcHJvcGVydHkgYmVjb21lIGZhbHNlIGlmIHRoZQotLy8gICBhZGFw
dGVyIHJlcG9ydGVkIHRoYXQgc2VydmVyLXNpZGUgdmFsaWRhdGlvbnMgZmFpbGVkLgotLy8gKiBp
c05ldzogVGhlIHJlY29yZCB3YXMgY3JlYXRlZCBvbiB0aGUgY2xpZW50IGFuZCB0aGUgYWRhcHRl
cgotLy8gICBkaWQgbm90IHlldCByZXBvcnQgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVk
LgotLy8gKiBpc1ZhbGlkOiBObyBjbGllbnQtc2lkZSB2YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCBh
bmQgdGhlCi0vLyAgIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55IHNlcnZlci1zaWRlIHZhbGlk
YXRpb24gZmFpbHVyZXMuCi0KLS8vIFRoZSBkaXJ0eSBzdGF0ZSBpcyBhIGFic3RyYWN0IHN0YXRl
IHdob3NlIGZ1bmN0aW9uYWxpdHkgaXMKLS8vIHNoYXJlZCBiZXR3ZWVuIHRoZSBgY3JlYXRlZGAg
YW5kIGB1cGRhdGVkYCBzdGF0ZXMuCi0vLwotLy8gVGhlIGRlbGV0ZWQgc3RhdGUgc2hhcmVzIHRo
ZSBgaXNEaXJ0eWAgZmxhZyB3aXRoIHRoZQotLy8gc3ViY2xhc3NlcyBvZiBgRGlydHlTdGF0ZWAs
IGJ1dCB3aXRoIGEgdmVyeSBkaWZmZXJlbnQKLS8vIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIERp
cnR5IHN0YXRlcyBoYXZlIHRocmVlIGNoaWxkIHN0YXRlczoKLS8vCi0vLyBgdW5jb21taXR0ZWRg
OiB0aGUgc3RvcmUgaGFzIG5vdCB5ZXQgaGFuZGVkIG9mZiB0aGUgcmVjb3JkCi0vLyAgIHRvIGJl
IHNhdmVkLgotLy8gYGluRmxpZ2h0YDogdGhlIHN0b3JlIGhhcyBoYW5kZWQgb2ZmIHRoZSByZWNv
cmQgdG8gYmUgc2F2ZWQsCi0vLyAgIGJ1dCB0aGUgYWRhcHRlciBoYXMgbm90IHlldCBhY2tub3ds
ZWRnZWQgc3VjY2Vzcy4KLS8vIGBpbnZhbGlkYDogdGhlIHJlY29yZCBoYXMgaW52YWxpZCBpbmZv
cm1hdGlvbiBhbmQgY2Fubm90IGJlCi0vLyAgIHNlbmQgdG8gdGhlIGFkYXB0ZXIgeWV0LgotdmFy
IERpcnR5U3RhdGUgPSB7Ci0gIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKLQotICAvLyBG
TEFHUwotICBpc0RpcnR5OiB0cnVlLAotCi0gIC8vIFNVQlNUQVRFUwotCi0gIC8vIFdoZW4gYSBy
ZWNvcmQgZmlyc3QgYmVjb21lcyBkaXJ0eSwgaXQgaXMgYHVuY29tbWl0dGVkYC4KLSAgLy8gVGhp
cyBtZWFucyB0aGF0IHRoZXJlIGFyZSBsb2NhbCBwZW5kaW5nIGNoYW5nZXMsIGJ1dCB0aGV5Ci0g
IC8vIGhhdmUgbm90IHlldCBiZWd1biB0byBiZSBzYXZlZCwgYW5kIGFyZSBub3QgaW52YWxpZC4K
LSAgdW5jb21taXR0ZWQ6IHsKLSAgICAvLyBFVkVOVFMKLSAgICBkaWRTZXRQcm9wZXJ0eTogZGlk
U2V0UHJvcGVydHksCi0KLSAgICBwcm9wZXJ0eVdhc1Jlc2V0OiBmdW5jdGlvbihyZWNvcmQsIG5h
bWUpIHsKLSAgICAgIHZhciBzdGlsbERpcnR5ID0gZmFsc2U7Ci0KLSAgICAgIGZvciAodmFyIHBy
b3AgaW4gcmVjb3JkLl9hdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHN0aWxsRGlydHkgPSB0cnVlOwot
ICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFzdGlsbERpcnR5KSB7IHJlY29y
ZC5zZW5kKCdyb2xsZWRCYWNrJyk7IH0KLSAgICB9LAotCi0gICAgcHVzaGVkRGF0YTogRW1iZXIu
SywKLQotICAgIGJlY29tZURpcnR5OiBFbWJlci5LLAotCi0gICAgd2lsbENvbW1pdDogZnVuY3Rp
b24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbkZsaWdodCcpOwotICAg
IH0sCi0KLSAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCwgcmVzb2x2ZSkgewotICAg
ICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0g
ICAgfSwKLQotICAgIHJvbGxlZEJhY2s6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3Jk
LnRyYW5zaXRpb25UbygnbG9hZGVkLnNhdmVkJyk7Ci0gICAgfSwKLQotICAgIGJlY2FtZUludmFs
aWQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnaW52YWxp
ZCcpOwotICAgIH0sCi0KLSAgICByb2xsYmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQucm9sbGJhY2soKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gT25jZSBhIHJlY29yZCBoYXMg
YmVlbiBoYW5kZWQgb2ZmIHRvIHRoZSBhZGFwdGVyIHRvIGJlCi0gIC8vIHNhdmVkLCBpdCBpcyBp
biB0aGUgJ2luIGZsaWdodCcgc3RhdGUuIENoYW5nZXMgdG8gdGhlCi0gIC8vIHJlY29yZCBjYW5u
b3QgYmUgbWFkZSBkdXJpbmcgdGhpcyB3aW5kb3cuCi0gIGluRmxpZ2h0OiB7Ci0gICAgLy8gRkxB
R1MKLSAgICBpc1NhdmluZzogdHJ1ZSwKLQotICAgIC8vIEVWRU5UUwotICAgIGRpZFNldFByb3Bl
cnR5OiBkaWRTZXRQcm9wZXJ0eSwKLSAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLSAgICBwdXNo
ZWREYXRhOiBFbWJlci5LLAotCi0gICAgLy8gVE9ETzogTW9yZSByb2J1c3Qgc2VtYW50aWNzIGFy
b3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAotICAgIHdpbGxDb21taXQ6IEVtYmVyLkssCi0KLSAg
ICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgdmFyIGRpcnR5VHlwZSA9IGdl
dCh0aGlzLCAnZGlydHlUeXBlJyk7Ci0KLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVk
Jyk7Ci0gICAgICByZWNvcmQuc2VuZCgnaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJywgZGlydHlU
eXBlKTsKLSAgICB9LAotCi0gICAgYmVjYW1lSW52YWxpZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0g
ICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdpbnZhbGlkJyk7Ci0gICAgICByZWNvcmQuc2VuZCgn
aW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzJyk7Ci0gICAgfSwKLQotICAgIGJlY2FtZUVycm9yOiBm
dW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3VuY29tbWl0dGVk
Jyk7Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0g
ICAgfQotICB9LAotCi0gIC8vIEEgcmVjb3JkIGlzIGluIHRoZSBgaW52YWxpZGAgc3RhdGUgd2hl
biBpdHMgY2xpZW50LXNpZGUKLSAgLy8gaW52YWxpZGF0aW9ucyBoYXZlIGZhaWxlZCwgb3IgaWYg
dGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZAotICAvLyB0aGUgdGhlIHJlY29yZCBmYWlsZWQgc2Vy
dmVyLXNpZGUgaW52YWxpZGF0aW9ucy4KLSAgaW52YWxpZDogewotICAgIC8vIEZMQUdTCi0gICAg
aXNWYWxpZDogZmFsc2UsCi0KLSAgICAvLyBFVkVOVFMKLSAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRlZC51bmNvbW1p
dHRlZCcpOwotICAgICAgcmVjb3JkLmNsZWFyUmVsYXRpb25zaGlwcygpOwotICAgIH0sCi0KLSAg
ICBkaWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24ocmVjb3JkLCBjb250ZXh0KSB7Ci0gICAgICBnZXQo
cmVjb3JkLCAnZXJyb3JzJykucmVtb3ZlKGNvbnRleHQubmFtZSk7Ci0KLSAgICAgIGRpZFNldFBy
b3BlcnR5KHJlY29yZCwgY29udGV4dCk7Ci0gICAgfSwKLQotICAgIGJlY29tZURpcnR5OiBFbWJl
ci5LLAotCi0gICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBnZXQocmVj
b3JkLCAnZXJyb3JzJykuY2xlYXIoKTsKLSAgICB9LAotCi0gICAgYmVjYW1lVmFsaWQ6IGZ1bmN0
aW9uKHJlY29yZCkgewotICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndW5jb21taXR0ZWQnKTsK
LSAgICB9LAotCi0gICAgaW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihyZWNvcmQp
IHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2JlY2FtZUludmFsaWQnLCByZWNvcmQpOwot
ICAgIH0KLSAgfQotfTsKLQotLy8gVGhlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQgc3RhdGVzIGFyZSBj
cmVhdGVkIG91dHNpZGUgdGhlIHN0YXRlCi0vLyBjaGFydCBzbyB3ZSBjYW4gcmVvcGVuIHRoZWly
IHN1YnN0YXRlcyBhbmQgYWRkIG1peGlucyBhcwotLy8gbmVjZXNzYXJ5LgotCi1mdW5jdGlvbiBk
ZWVwQ2xvbmUob2JqZWN0KSB7Ci0gIHZhciBjbG9uZSA9IHt9LCB2YWx1ZTsKLQotICBmb3IgKHZh
ciBwcm9wIGluIG9iamVjdCkgewotICAgIHZhbHVlID0gb2JqZWN0W3Byb3BdOwotICAgIGlmICh2
YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7Ci0gICAgICBjbG9uZVtwcm9wXSA9
IGRlZXBDbG9uZSh2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNsb25lW3Byb3BdID0gdmFs
dWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNsb25lOwotfQotCi1mdW5jdGlvbiBtaXhpbihv
cmlnaW5hbCwgaGFzaCkgewotICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICBvcmlnaW5h
bFtwcm9wXSA9IGhhc2hbcHJvcF07Ci0gIH0KLQotICByZXR1cm4gb3JpZ2luYWw7Ci19Ci0KLWZ1
bmN0aW9uIGRpcnR5U3RhdGUob3B0aW9ucykgewotICB2YXIgbmV3U3RhdGUgPSBkZWVwQ2xvbmUo
RGlydHlTdGF0ZSk7Ci0gIHJldHVybiBtaXhpbihuZXdTdGF0ZSwgb3B0aW9ucyk7Ci19Ci0KLXZh
ciBjcmVhdGVkU3RhdGUgPSBkaXJ0eVN0YXRlKHsKLSAgZGlydHlUeXBlOiAnY3JlYXRlZCcsCi0K
LSAgLy8gRkxBR1MKLSAgaXNOZXc6IHRydWUKLX0pOwotCi1jcmVhdGVkU3RhdGUudW5jb21taXR0
ZWQucm9sbGVkQmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNvcmQudHJhbnNpdGlvblRv
KCdkZWxldGVkLnNhdmVkJyk7Ci19OwotCi12YXIgdXBkYXRlZFN0YXRlID0gZGlydHlTdGF0ZSh7
Ci0gIGRpcnR5VHlwZTogJ3VwZGF0ZWQnCi19KTsKLQotY3JlYXRlZFN0YXRlLnVuY29tbWl0dGVk
LmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNvcmQuY2xlYXJSZWxhdGlv
bnNoaXBzKCk7Ci0gIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLX07Ci0K
LWNyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5yb2xsYmFjayA9IGZ1bmN0aW9uKHJlY29yZCkgewot
ICBEaXJ0eVN0YXRlLnVuY29tbWl0dGVkLnJvbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7
Ci0gIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLX07Ci0KLWNyZWF0ZWRT
dGF0ZS51bmNvbW1pdHRlZC5wcm9wZXJ0eVdhc1Jlc2V0ID0gRW1iZXIuSzsKLQotdXBkYXRlZFN0
YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9IGZ1bmN0aW9uKHJlY29yZCkgewotICByZWNv
cmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7Ci0gIHJlY29yZC5jbGVhclJl
bGF0aW9uc2hpcHMoKTsKLX07Ci0KLXZhciBSb290U3RhdGUgPSB7Ci0gIC8vIEZMQUdTCi0gIGlz
RW1wdHk6IGZhbHNlLAotICBpc0xvYWRpbmc6IGZhbHNlLAotICBpc0xvYWRlZDogZmFsc2UsCi0g
IGlzRGlydHk6IGZhbHNlLAotICBpc1NhdmluZzogZmFsc2UsCi0gIGlzRGVsZXRlZDogZmFsc2Us
Ci0gIGlzTmV3OiBmYWxzZSwKLSAgaXNWYWxpZDogdHJ1ZSwKLQotICAvLyBERUZBVUxUIEVWRU5U
UwotCi0gIC8vIFRyeWluZyB0byByb2xsIGJhY2sgaWYgeW91J3JlIG5vdCBpbiB0aGUgZGlydHkg
c3RhdGUKLSAgLy8gZG9lc24ndCBjaGFuZ2UgeW91ciBzdGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlv
dSdyZSBpbiB0aGUKLSAgLy8gaW4tZmxpZ2h0IHN0YXRlLCByb2xsaW5nIGJhY2sgdGhlIHJlY29y
ZCBkb2Vzbid0IG1vdmUKLSAgLy8geW91IG91dCBvZiB0aGUgaW4tZmxpZ2h0IHN0YXRlLgotICBy
b2xsZWRCYWNrOiBFbWJlci5LLAotCi0gIHByb3BlcnR5V2FzUmVzZXQ6IEVtYmVyLkssCi0KLSAg
Ly8gU1VCU1RBVEVTCi0KLSAgLy8gQSByZWNvcmQgYmVnaW5zIGl0cyBsaWZlY3ljbGUgaW4gdGhl
IGBlbXB0eWAgc3RhdGUuCi0gIC8vIElmIGl0cyBkYXRhIHdpbGwgY29tZSBmcm9tIHRoZSBhZGFw
dGVyLCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGxvYWRpbmdgIHN0YXRlLiBP
dGhlcndpc2UsIGlmCi0gIC8vIHRoZSByZWNvcmQgaXMgYmVpbmcgY3JlYXRlZCBvbiB0aGUgY2xp
ZW50LCBpdCB3aWxsCi0gIC8vIHRyYW5zaXRpb24gaW50byB0aGUgYGNyZWF0ZWRgIHN0YXRlLgot
ICBlbXB0eTogewotICAgIGlzRW1wdHk6IHRydWUsCi0KLSAgICAvLyBFVkVOVFMKLSAgICBsb2Fk
aW5nRGF0YTogZnVuY3Rpb24ocmVjb3JkLCBwcm9taXNlKSB7Ci0gICAgICByZWNvcmQuX2xvYWRp
bmdQcm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2xvYWRpbmcn
KTsKLSAgICB9LAotCi0gICAgbG9hZGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICBy
ZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuY3JlYXRlZC51bmNvbW1pdHRlZCcpOwotCi0gICAg
ICByZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAg
ICAgcmVjb3JkLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7Ci0gICAgICB9KTsKLSAgICB9
LAotCi0gICAgcHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQudHJh
bnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2Rp
ZExvYWQnKTsKLSAgICB9Ci0gIH0sCi0KLSAgLy8gQSByZWNvcmQgZW50ZXJzIHRoaXMgc3RhdGUg
d2hlbiB0aGUgc3RvcmUgYXNrcwotICAvLyB0aGUgYWRhcHRlciBmb3IgaXRzIGRhdGEuIEl0IHJl
bWFpbnMgaW4gdGhpcyBzdGF0ZQotICAvLyB1bnRpbCB0aGUgYWRhcHRlciBwcm92aWRlcyB0aGUg
cmVxdWVzdGVkIGRhdGEuCi0gIC8vCi0gIC8vIFVzdWFsbHksIHRoaXMgcHJvY2VzcyBpcyBhc3lu
Y2hyb25vdXMsIHVzaW5nIGFuCi0gIC8vIFhIUiB0byByZXRyaWV2ZSB0aGUgZGF0YS4KLSAgbG9h
ZGluZzogewotICAgIC8vIEZMQUdTCi0gICAgaXNMb2FkaW5nOiB0cnVlLAotCi0gICAgZXhpdDog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICByZWNvcmQuX2xvYWRpbmdQcm9taXNlID0gbnVsbDsK
LSAgICB9LAotCi0gICAgLy8gRVZFTlRTCi0gICAgcHVzaGVkRGF0YTogZnVuY3Rpb24ocmVjb3Jk
KSB7Ci0gICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKLSAgICAgIHJl
Y29yZC50cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKLSAgICAgIHNldChyZWNvcmQsICdpc0Vycm9y
JywgZmFsc2UpOwotICAgIH0sCi0KLSAgICBiZWNhbWVFcnJvcjogZnVuY3Rpb24ocmVjb3JkKSB7
Ci0gICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJlY29yZCk7Ci0gICAg
fSwKLQotICAgIG5vdEZvdW5kOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC50cmFu
c2l0aW9uVG8oJ2VtcHR5Jyk7Ci0gICAgfQotICB9LAotCi0gIC8vIEEgcmVjb3JkIGVudGVycyB0
aGlzIHN0YXRlIHdoZW4gaXRzIGRhdGEgaXMgcG9wdWxhdGVkLgotICAvLyBNb3N0IG9mIGEgcmVj
b3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMKLSAgLy8gb2YgdGhlIGBs
b2FkZWRgIHN0YXRlLgotICBsb2FkZWQ6IHsKLSAgICBpbml0aWFsU3RhdGU6ICdzYXZlZCcsCi0K
LSAgICAvLyBGTEFHUwotICAgIGlzTG9hZGVkOiB0cnVlLAotCi0gICAgLy8gU1VCU1RBVEVTCi0K
LSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwgY2hhbmdlcyB0byBhIHJlY29yZCwgaXQgcmVt
YWlucwotICAgIC8vIGluIHRoZSBgc2F2ZWRgIHN0YXRlLgotICAgIHNhdmVkOiB7Ci0gICAgICBz
ZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHZhciBhdHRycyA9IHJlY29yZC5fYXR0
cmlidXRlcywKLSAgICAgICAgICAgIGlzRGlydHkgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKHZh
ciBwcm9wIGluIGF0dHJzKSB7Ci0gICAgICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KHBy
b3ApKSB7Ci0gICAgICAgICAgICBpc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0RpcnR5KSB7Ci0gICAgICAg
ICAgcmVjb3JkLmFkYXB0ZXJEaWREaXJ0eSgpOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAg
ICAvLyBFVkVOVFMKLSAgICAgIGRpZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0eSwKLQotICAg
ICAgcHVzaGVkRGF0YTogRW1iZXIuSywKLQotICAgICAgYmVjb21lRGlydHk6IGZ1bmN0aW9uKHJl
Y29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1cGRhdGVkLnVuY29tbWl0dGVk
Jyk7Ci0gICAgICB9LAotCi0gICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAg
ICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpOwotICAgICAgfSwK
LQotICAgICAgcmVsb2FkUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlc29sdmUpIHsKLSAgICAg
ICAgcmVzb2x2ZShnZXQocmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7Ci0g
ICAgICB9LAotCi0gICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAg
ICByZWNvcmQudHJhbnNpdGlvblRvKCdkZWxldGVkLnVuY29tbWl0dGVkJyk7Ci0gICAgICAgIHJl
Y29yZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKLSAgICAgIH0sCi0KLSAgICAgIHVubG9hZFJlY29y
ZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIC8vIGNsZWFyIHJlbGF0aW9uc2hpcHMgYmVm
b3JlIG1vdmluZyB0byBkZWxldGVkIHN0YXRlCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBmYWls
cwotICAgICAgICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIHJlY29yZC50
cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKLSAgICAgIH0sCi0KLSAgICAgIGRpZENvbW1p
dDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC5zZW5kKCdpbnZva2VMaWZlY3lj
bGVDYWxsYmFja3MnLCBnZXQocmVjb3JkLCAnbGFzdERpcnR5VHlwZScpKTsKLSAgICAgIH0sCi0K
LSAgICAgIC8vIGxvYWRlZC5zYXZlZC5ub3RGb3VuZCB3b3VsZCBiZSB0cmlnZ2VyZWQgYnkgYSBm
YWlsZWQKLSAgICAgIC8vIGByZWxvYWQoKWAgb24gYW4gdW5jaGFuZ2VkIHJlY29yZAotICAgICAg
bm90Rm91bmQ6IEVtYmVyLksKLQotICAgIH0sCi0KLSAgICAvLyBBIHJlY29yZCBpcyBpbiB0aGlz
IHN0YXRlIGFmdGVyIGl0IGhhcyBiZWVuIGxvY2FsbHkKLSAgICAvLyBjcmVhdGVkIGJ1dCBiZWZv
cmUgdGhlIGFkYXB0ZXIgaGFzIGluZGljYXRlZCB0aGF0Ci0gICAgLy8gaXQgaGFzIGJlZW4gc2F2
ZWQuCi0gICAgY3JlYXRlZDogY3JlYXRlZFN0YXRlLAotCi0gICAgLy8gQSByZWNvcmQgaXMgaW4g
dGhpcyBzdGF0ZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gICAgLy8gc2F2ZWQgdG8gdGhlIHNl
cnZlciwgYnV0IHRoZXJlIGFyZSBuZXcgbG9jYWwgY2hhbmdlcwotICAgIC8vIHRoYXQgaGF2ZSBu
b3QgeWV0IGJlZW4gc2F2ZWQuCi0gICAgdXBkYXRlZDogdXBkYXRlZFN0YXRlCi0gIH0sCi0KLSAg
Ly8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0ZSBpZiBpdCB3YXMgZGVsZXRlZCBmcm9tIHRoZSBz
dG9yZS4KLSAgZGVsZXRlZDogewotICAgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywKLSAg
ICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKLQotICAgIC8vIEZMQUdTCi0gICAgaXNEZWxldGVkOiB0
cnVlLAotICAgIGlzTG9hZGVkOiB0cnVlLAotICAgIGlzRGlydHk6IHRydWUsCi0KLSAgICAvLyBU
UkFOU0lUSU9OUwotICAgIHNldHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgIHJlY29yZC51
cGRhdGVSZWNvcmRBcnJheXMoKTsKLSAgICB9LAotCi0gICAgLy8gU1VCU1RBVEVTCi0KLSAgICAv
LyBXaGVuIGEgcmVjb3JkIGlzIGRlbGV0ZWQsIGl0IGVudGVycyB0aGUgYHN0YXJ0YAotICAgIC8v
IHN0YXRlLiBJdCB3aWxsIGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSByZWNvcmQKLSAgICAvLyBz
dGFydHMgdG8gY29tbWl0LgotICAgIHVuY29tbWl0dGVkOiB7Ci0KLSAgICAgIC8vIEVWRU5UUwot
Ci0gICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnRy
YW5zaXRpb25UbygnaW5GbGlnaHQnKTsKLSAgICAgIH0sCi0KLSAgICAgIHJvbGxiYWNrOiBmdW5j
dGlvbihyZWNvcmQpIHsKLSAgICAgICAgcmVjb3JkLnJvbGxiYWNrKCk7Ci0gICAgICB9LAotCi0g
ICAgICBiZWNvbWVEaXJ0eTogRW1iZXIuSywKLSAgICAgIGRlbGV0ZVJlY29yZDogRW1iZXIuSywK
LQotICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICAgIHJlY29yZC50
cmFuc2l0aW9uVG8oJ2xvYWRlZC5zYXZlZCcpOwotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBB
ZnRlciBhIHJlY29yZCBzdGFydHMgY29tbWl0dGluZywgYnV0Ci0gICAgLy8gYmVmb3JlIHRoZSBh
ZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZSBkZWxldGlvbgotICAgIC8vIGhhcyBzYXZlZCB0byB0
aGUgc2VydmVyLCBhIHJlY29yZCBpcyBpbiB0aGUKLSAgICAvLyBgaW5GbGlnaHRgIHN1YnN0YXRl
IG9mIGBkZWxldGVkYC4KLSAgICBpbkZsaWdodDogewotICAgICAgLy8gRkxBR1MKLSAgICAgIGlz
U2F2aW5nOiB0cnVlLAotCi0gICAgICAvLyBFVkVOVFMKLQotICAgICAgLy8gVE9ETzogTW9yZSBy
b2J1c3Qgc2VtYW50aWNzIGFyb3VuZCBzYXZlLXdoaWxlLWluLWZsaWdodAotICAgICAgd2lsbENv
bW1pdDogRW1iZXIuSywKLSAgICAgIGRpZENvbW1pdDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAg
ICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3NhdmVkJyk7Ci0KLSAgICAgICAgcmVjb3JkLnNlbmQo
J2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOwotICAgICAgfSwKLQotICAgICAgYmVjYW1lRXJy
b3I6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1bmNv
bW1pdHRlZCcpOwotICAgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJl
Y29yZCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8vIE9uY2UgdGhlIGFkYXB0ZXIgaW5kaWNh
dGVzIHRoYXQgdGhlIGRlbGV0aW9uIGhhcwotICAgIC8vIGJlZW4gc2F2ZWQsIHRoZSByZWNvcmQg
ZW50ZXJzIHRoZSBgc2F2ZWRgIHN1YnN0YXRlCi0gICAgLy8gb2YgYGRlbGV0ZWRgLgotICAgIHNh
dmVkOiB7Ci0gICAgICAvLyBGTEFHUwotICAgICAgaXNEaXJ0eTogZmFsc2UsCi0KLSAgICAgIHNl
dHVwOiBmdW5jdGlvbihyZWNvcmQpIHsKLSAgICAgICAgdmFyIHN0b3JlID0gZ2V0KHJlY29yZCwg
J3N0b3JlJyk7Ci0gICAgICAgIHN0b3JlLmRlbWF0ZXJpYWxpemVSZWNvcmQocmVjb3JkKTsKLSAg
ICAgIH0sCi0KLSAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rpb24ocmVjb3Jk
KSB7Ci0gICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZERlbGV0ZScsIHJlY29yZCk7Ci0g
ICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENvbW1pdCcsIHJlY29yZCk7Ci0gICAgICB9
Ci0gICAgfQotICB9LAotCi0gIGludm9rZUxpZmVjeWNsZUNhbGxiYWNrczogZnVuY3Rpb24ocmVj
b3JkLCBkaXJ0eVR5cGUpIHsKLSAgICBpZiAoZGlydHlUeXBlID09PSAnY3JlYXRlZCcpIHsKLSAg
ICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZENyZWF0ZScsIHJlY29yZCk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2RpZFVwZGF0ZScsIHJlY29yZCk7Ci0gICAg
fQotCi0gICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlkQ29tbWl0JywgcmVjb3JkKTsKLSAgfQot
fTsKLQotZnVuY3Rpb24gd2lyZVN0YXRlKG9iamVjdCwgcGFyZW50LCBuYW1lKSB7Ci0gIC8qanNo
aW50IHByb3RvOnRydWUqLwotICAvLyBUT0RPOiBVc2UgT2JqZWN0LmNyZWF0ZSBhbmQgY29weSBp
bnN0ZWFkCi0gIG9iamVjdCA9IG1peGluKHBhcmVudCA/IEVtYmVyLmNyZWF0ZShwYXJlbnQpIDog
e30sIG9iamVjdCk7Ci0gIG9iamVjdC5wYXJlbnRTdGF0ZSA9IHBhcmVudDsKLSAgb2JqZWN0LnN0
YXRlTmFtZSA9IG5hbWU7Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHsKLSAgICBpZiAo
IW9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBwcm9wID09PSAncGFyZW50U3RhdGUnIHx8
IHByb3AgPT09ICdzdGF0ZU5hbWUnKSB7IGNvbnRpbnVlOyB9Ci0gICAgaWYgKHR5cGVvZiBvYmpl
Y3RbcHJvcF0gPT09ICdvYmplY3QnKSB7Ci0gICAgICBvYmplY3RbcHJvcF0gPSB3aXJlU3RhdGUo
b2JqZWN0W3Byb3BdLCBvYmplY3QsIG5hbWUgKyAiLiIgKyBwcm9wKTsKLSAgICB9Ci0gIH0KLQot
ICByZXR1cm4gb2JqZWN0OwotfQotCi1Sb290U3RhdGUgPSB3aXJlU3RhdGUoUm9vdFN0YXRlLCBu
dWxsLCAicm9vdCIpOwotCi1EUy5Sb290U3RhdGUgPSBSb290U3RhdGU7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpc0VtcHR5ID0gRW1iZXIuaXNF
bXB0eTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLS8qKgotICBIb2xkcyB2YWxp
ZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiByZWNvcmQgb3JnYW5pemVkIGJ5IGF0dHJpYnV0ZSBu
YW1lcy4KLQotICBAY2xhc3MgRXJyb3JzCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRW1i
ZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLkVudW1lcmFibGUKLSAgQHVzZXMgRW1iZXIuRXZlbnRl
ZAotICovCi1EUy5FcnJvcnMgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkVudW1lcmFibGUs
IEVtYmVyLkV2ZW50ZWQsIHsKLSAgLyoqCi0gICAgUmVnaXN0ZXIgd2l0aCB0YXJnZXQgaGFuZGxl
cgotCi0gICAgQG1ldGhvZCByZWdpc3RlckhhbmRsZXJzCi0gICAgQHBhcmFtIHtPYmplY3R9IHRh
cmdldAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGJlY2FtZUludmFsaWQKLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSBiZWNhbWVWYWxpZAotICAqLwotICByZWdpc3RlckhhbmRsZXJzOiBmdW5jdGlvbih0
YXJnZXQsIGJlY2FtZUludmFsaWQsIGJlY2FtZVZhbGlkKSB7Ci0gICAgdGhpcy5vbignYmVjYW1l
SW52YWxpZCcsIHRhcmdldCwgYmVjYW1lSW52YWxpZCk7Ci0gICAgdGhpcy5vbignYmVjYW1lVmFs
aWQnLCB0YXJnZXQsIGJlY2FtZVZhbGlkKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJvcGVydHkg
ZXJyb3JzQnlBdHRyaWJ1dGVOYW1lCi0gICAgQHR5cGUge0VtYmVyLk1hcFdpdGhEZWZhdWx0fQot
ICAgIEBwcml2YXRlCi0gICovCi0gIGVycm9yc0J5QXR0cmlidXRlTmFtZTogRW1iZXIucmVkdWNl
Q29tcHV0ZWQoImNvbnRlbnQiLCB7Ci0gICAgaW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHsKLSAg
ICAgIHJldHVybiBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewotICAgICAgICBkZWZhdWx0
VmFsdWU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHJldHVybiBFbWJlci5BKCk7Ci0gICAgICAg
IH0KLSAgICAgIH0pOwotICAgIH0sCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywg
ZXJyb3IpIHsKLSAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmlidXRlKS5wdXNoT2JqZWN0KGVy
cm9yKTsKLQotICAgICAgcmV0dXJuIGVycm9yczsKLSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06
IGZ1bmN0aW9uKGVycm9ycywgZXJyb3IpIHsKLSAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmli
dXRlKS5yZW1vdmVPYmplY3QoZXJyb3IpOwotCi0gICAgICByZXR1cm4gZXJyb3JzOwotICAgIH0K
LSAgfSksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBlcnJvcnMgZm9yIGEgZ2l2ZW4gYXR0cmlidXRl
Ci0KLSAgICBAbWV0aG9kIGVycm9yc0ZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUK
LSAgICBAcmV0dXJucyB7QXJyYXl9Ci0gICovCi0gIGVycm9yc0ZvcjogZnVuY3Rpb24oYXR0cmli
dXRlKSB7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3JzQnlBdHRyaWJ1dGVOYW1lJykuZ2V0
KGF0dHJpYnV0ZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICovCi0gIG1lc3NhZ2VzOiBFbWJlci5jb21w
dXRlZC5tYXBCeSgnY29udGVudCcsICdtZXNzYWdlJyksCi0KLSAgLyoqCi0gICAgQHByb3BlcnR5
IGNvbnRlbnQKLSAgICBAdHlwZSB7QXJyYXl9Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgY29udGVu
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAg
fSksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1bmtub3duUHJvcGVydHkKLSAgICBAcHJpdmF0ZQot
ICAqLwotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSkgewotICAgIHZhciBl
cnJvcnMgPSB0aGlzLmVycm9yc0ZvcihhdHRyaWJ1dGUpOwotICAgIGlmIChpc0VtcHR5KGVycm9y
cykpIHsgcmV0dXJuIG51bGw7IH0KLSAgICByZXR1cm4gZXJyb3JzOwotICB9LAotCi0gIC8qKgot
ICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBwcml2YXRlCi0gICovCi0gIG5leHRPYmplY3Q6
IGZ1bmN0aW9uKGluZGV4LCBwcmV2aW91c09iamVjdCwgY29udGV4dCkgewotICAgIHJldHVybiBn
ZXQodGhpcywgJ2NvbnRlbnQnKS5vYmplY3RBdChpbmRleCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
VG90YWwgbnVtYmVyIG9mIGVycm9ycy4KLQotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlw
ZSB7TnVtYmVyfQotICAgIEByZWFkT25seQotICAqLwotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVk
Lm9uZVdheSgnY29udGVudC5sZW5ndGgnKS5yZWFkT25seSgpLAotCi0gIC8qKgotICAgIEBwcm9w
ZXJ0eSBpc0VtcHR5Ci0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0g
IGlzRW1wdHk6IEVtYmVyLmNvbXB1dGVkLm5vdCgnbGVuZ3RoJykucmVhZE9ubHkoKSwKLQotICAv
KioKLSAgICBBZGRzIGVycm9yIG1lc3NhZ2VzIHRvIGEgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5k
cwotICAgIGBiZWNhbWVJbnZhbGlkYCBldmVudCB0byB0aGUgcmVjb3JkLgotCi0gICAgQG1ldGhv
ZCBhZGQKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCi0gICAgQHBhcmFtIHtBcnJheXxT
dHJpbmd9IG1lc3NhZ2VzCi0gICovCi0gIGFkZDogZnVuY3Rpb24oYXR0cmlidXRlLCBtZXNzYWdl
cykgewotICAgIHZhciB3YXNFbXB0eSA9IGdldCh0aGlzLCAnaXNFbXB0eScpOwotCi0gICAgbWVz
c2FnZXMgPSB0aGlzLl9maW5kT3JDcmVhdGVNZXNzYWdlcyhhdHRyaWJ1dGUsIG1lc3NhZ2VzKTsK
LSAgICBnZXQodGhpcywgJ2NvbnRlbnQnKS5hZGRPYmplY3RzKG1lc3NhZ2VzKTsKLQotICAgIHRo
aXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlKTsKLSAgICB0aGlzLmVudW1lcmFibGVD
b250ZW50RGlkQ2hhbmdlKCk7Ci0KLSAgICBpZiAod2FzRW1wdHkgJiYgIWdldCh0aGlzLCAnaXNF
bXB0eScpKSB7Ci0gICAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUludmFsaWQnKTsKLSAgICB9Ci0g
IH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBfZmluZE9yQ3JlYXRlTWVzc2FnZXMKLSAgICBAcHJp
dmF0ZQotICAqLwotICBfZmluZE9yQ3JlYXRlTWVzc2FnZXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZSwg
bWVzc2FnZXMpIHsKLSAgICB2YXIgZXJyb3JzID0gdGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKTsK
LQotICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXkobWVzc2FnZXMpLm1hcChmdW5jdGlvbihtZXNz
YWdlKSB7Ci0gICAgICByZXR1cm4gZXJyb3JzLmZpbmRCeSgnbWVzc2FnZScsIG1lc3NhZ2UpIHx8
IHsKLSAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGUsCi0gICAgICAgIG1lc3NhZ2U6IG1lc3Nh
Z2UKLSAgICAgIH07Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgZXJy
b3IgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFuZCBzZW5kcwotICAgIGBiZWNh
bWVWYWxpZGAgZXZlbnQgdG8gdGhlIHJlY29yZCBpZiB0aGVyZSBubyBtb3JlIGVycm9ycyBsZWZ0
LgotCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlCi0g
ICovCi0gIHJlbW92ZTogZnVuY3Rpb24oYXR0cmlidXRlKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAn
aXNFbXB0eScpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2Nv
bnRlbnQnKS5yZWplY3RCeSgnYXR0cmlidXRlJywgYXR0cmlidXRlKTsKLSAgICBnZXQodGhpcywg
J2NvbnRlbnQnKS5zZXRPYmplY3RzKGNvbnRlbnQpOwotCi0gICAgdGhpcy5ub3RpZnlQcm9wZXJ0
eUNoYW5nZShhdHRyaWJ1dGUpOwotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2Uo
KTsKLQotICAgIGlmIChnZXQodGhpcywgJ2lzRW1wdHknKSkgewotICAgICAgdGhpcy50cmlnZ2Vy
KCdiZWNhbWVWYWxpZCcpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGFsbCBl
cnJvciBtZXNzYWdlcyBhbmQgc2VuZHMgYGJlY2FtZVZhbGlkYCBldmVudAotICAgIHRvIHRoZSBy
ZWNvcmQuCi0KLSAgICBAbWV0aG9kIGNsZWFyCi0gICovCi0gIGNsZWFyOiBmdW5jdGlvbigpIHsK
LSAgICBpZiAoZ2V0KHRoaXMsICdpc0VtcHR5JykpIHsgcmV0dXJuOyB9Ci0KLSAgICBnZXQodGhp
cywgJ2NvbnRlbnQnKS5jbGVhcigpOwotICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFu
Z2UoKTsKLQotICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmFsaWQnKTsKLSAgfSwKLQotICAvKioK
LSAgICBDaGVja3MgaWYgdGhlcmUgaXMgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBnaXZlbiBhdHRy
aWJ1dGUuCi0KLSAgICBAbWV0aG9kIGhhcwotICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUK
LSAgICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGVyZSBzb21lIGVycm9ycyBvbiBnaXZl
biBhdHRyaWJ1dGUKLSAgKi8KLSAgaGFzOiBmdW5jdGlvbihhdHRyaWJ1dGUpIHsKLSAgICByZXR1
cm4gIWlzRW1wdHkodGhpcy5lcnJvcnNGb3IoYXR0cmlidXRlKSk7Ci0gIH0KLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAotICAgIG1lcmdlID0gRW1iZXIu
bWVyZ2U7Ci0KLXZhciByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUgPSBFbWJlci5jb21wdXRlZCgn
Y3VycmVudFN0YXRlJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICByZXR1cm4gZ2V0KGdldCh0
aGlzLCAnY3VycmVudFN0YXRlJyksIGtleSk7Ci19KS5yZWFkT25seSgpOwotCi0vKioKLQotICBU
aGUgbW9kZWwgY2xhc3MgdGhhdCBhbGwgRW1iZXIgRGF0YSByZWNvcmRzIGRlc2NlbmQgZnJvbS4K
LQotICBAY2xhc3MgTW9kZWwKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBFbWJlci5PYmpl
Y3QKLSAgQHVzZXMgRW1iZXIuRXZlbnRlZAotKi8KLURTLk1vZGVsID0gRW1iZXIuT2JqZWN0LmV4
dGVuZChFbWJlci5FdmVudGVkLCB7Ci0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRy
dWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBlbXB0eWAKLSAgICBzdGF0ZS4gRW1wdHkgaXMgdGhl
IGZpcnN0IHN0YXRlIGFsbCByZWNvcmRzIGVudGVyIGFmdGVyIHRoZXkgaGF2ZQotICAgIGJlZW4g
Y3JlYXRlZC4gTW9zdCByZWNvcmRzIGNyZWF0ZWQgYnkgdGhlIHN0b3JlIHdpbGwgcXVpY2tseQot
ICAgIHRyYW5zaXRpb24gdG8gdGhlIGBsb2FkaW5nYCBzdGF0ZSBpZiBkYXRhIG5lZWRzIHRvIGJl
IGZldGNoZWQgZnJvbQotICAgIHRoZSBzZXJ2ZXIgb3IgdGhlIGBjcmVhdGVkYCBzdGF0ZSBpZiB0
aGUgcmVjb3JkIGlzIGNyZWF0ZWQgb24gdGhlCi0gICAgY2xpZW50LiBBIHJlY29yZCBjYW4gYWxz
byBlbnRlciB0aGUgZW1wdHkgc3RhdGUgaWYgdGhlIGFkYXB0ZXIgaXMKLSAgICB1bmFibGUgdG8g
bG9jYXRlIHRoZSByZWNvcmQuCi0KLSAgICBAcHJvcGVydHkgaXNFbXB0eQotICAgIEB0eXBlIHtC
b29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBpc0VtcHR5OiByZXRyaWV2ZUZyb21DdXJy
ZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSByZWNv
cmQgaXMgaW4gdGhlIGBsb2FkaW5nYCBzdGF0ZS4gQQotICAgIHJlY29yZCBlbnRlcnMgdGhpcyBz
dGF0ZSB3aGVuIHRoZSBzdG9yZSBhc2tzIHRoZSBhZGFwdGVyIGZvciBpdHMKLSAgICBkYXRhLiBJ
dCByZW1haW5zIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIGFkYXB0ZXIgcHJvdmlkZXMgdGhlCi0g
ICAgcmVxdWVzdGVkIGRhdGEuCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkaW5nCi0gICAgQHR5cGUg
e0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzTG9hZGluZzogcmV0cmlldmVGcm9t
Q3VycmVudFN0YXRlLAotICAvKioKLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUg
cmVjb3JkIGlzIGluIHRoZSBgbG9hZGVkYCBzdGF0ZS4gQQotICAgIHJlY29yZCBlbnRlcnMgdGhp
cyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlzIHBvcHVsYXRlZC4gTW9zdCBvZiBhCi0gICAgcmVjb3Jk
J3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMgb2YgdGhlIGBsb2FkZWRgCi0g
ICAgc3RhdGUuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIHJl
Y29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOwotICAgIHJlY29yZC5nZXQoJ2lz
TG9hZGVkJyk7IC8vIHRydWUKLQotICAgIHN0b3JlLmZpbmQoJ21vZGVsJywgMSkudGhlbihmdW5j
dGlvbihtb2RlbCkgewotICAgICAgbW9kZWwuZ2V0KCdpc0xvYWRlZCcpOyAvLyB0cnVlCi0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNMb2FkZWQKLSAgICBAdHlwZSB7Qm9vbGVh
bn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNMb2FkZWQ6IHJldHJpZXZlRnJvbUN1cnJlbnRT
dGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBp
cyBpbiB0aGUgYGRpcnR5YCBzdGF0ZS4gVGhlCi0gICAgcmVjb3JkIGhhcyBsb2NhbCBjaGFuZ2Vz
IHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc2F2ZWQgYnkgdGhlCi0gICAgYWRhcHRlci4gVGhpcyBp
bmNsdWRlcyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgKGJ1dCBub3QgeWV0Ci0gICAg
c2F2ZWQpIG9yIGRlbGV0ZWQuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwpOwotICAgIHJlY29y
ZC5nZXQoJ2lzRGlydHknKTsgLy8gdHJ1ZQotCi0gICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50
aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lzRGlydHknKTsgLy8gZmFs
c2UKLSAgICAgIG1vZGVsLnNldCgnZm9vJywgJ3NvbWUgdmFsdWUnKTsKLSAgICAgIG1vZGVsLnNl
dCgnaXNEaXJ0eScpOyAvLyB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkg
aXNEaXJ0eQotICAgIEB0eXBlIHtCb29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBpc0Rp
cnR5OiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJvcGVy
dHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBzYXZpbmdgIHN0YXRlLiBBCi0gICAg
cmVjb3JkIGVudGVycyB0aGUgc2F2aW5nIHN0YXRlIHdoZW4gYHNhdmVgIGlzIGNhbGxlZCwgYnV0
IHRoZQotICAgIGFkYXB0ZXIgaGFzIG5vdCB5ZXQgYWNrbm93bGVkZ2VkIHRoYXQgdGhlIGNoYW5n
ZXMgaGF2ZSBiZWVuCi0gICAgcGVyc2lzdGVkIHRvIHRoZSBiYWNrZW5kLgotCi0gICAgRXhhbXBs
ZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNv
cmQoQXBwLk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycpOyAvLyBmYWxzZQotICAg
IHZhciBwcm9taXNlID0gcmVjb3JkLnNhdmUoKTsKLSAgICByZWNvcmQuZ2V0KCdpc1NhdmluZycp
OyAvLyB0cnVlCi0gICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgcmVjb3JkLmdl
dCgnaXNTYXZpbmcnKTsgLy8gZmFsc2UKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0
eSBpc1NhdmluZwotICAgIEB0eXBlIHtCb29sZWFufQotICAgIEByZWFkT25seQotICAqLwotICBp
c1NhdmluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotICAvKioKLSAgICBJZiB0aGlzIHBy
b3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgZGVsZXRlZGAgc3RhdGUKLSAg
ICBhbmQgaGFzIGJlZW4gbWFya2VkIGZvciBkZWxldGlvbi4gV2hlbiBgaXNEZWxldGVkYCBpcyB0
cnVlIGFuZAotICAgIGBpc0RpcnR5YCBpcyB0cnVlLCB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQgbG9j
YWxseSBidXQgdGhlIGRlbGV0aW9uCi0gICAgd2FzIG5vdCB5ZXQgcGVyc2lzdGVkLiBXaGVuIGBp
c1NhdmluZ2AgaXMgdHJ1ZSwgdGhlIGNoYW5nZSBpcwotICAgIGluLWZsaWdodC4gV2hlbiBib3Ro
IGBpc0RpcnR5YCBhbmQgYGlzU2F2aW5nYCBhcmUgZmFsc2UsIHRoZQotICAgIGNoYW5nZSBoYXMg
cGVyc2lzdGVkLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBy
ZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBwLk1vZGVsKTsKLSAgICByZWNvcmQuZ2V0KCdp
c0RlbGV0ZWQnKTsgLy8gZmFsc2UKLSAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7Ci0gICAgcmVj
b3JkLmdldCgnaXNEZWxldGVkJyk7IC8vIHRydWUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBp
c0RlbGV0ZWQKLSAgICBAdHlwZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNE
ZWxldGVkOiByZXRyaWV2ZUZyb21DdXJyZW50U3RhdGUsCi0gIC8qKgotICAgIElmIHRoaXMgcHJv
cGVydHkgaXMgYHRydWVgIHRoZSByZWNvcmQgaXMgaW4gdGhlIGBuZXdgIHN0YXRlLiBBCi0gICAg
cmVjb3JkIHdpbGwgYmUgaW4gdGhlIGBuZXdgIHN0YXRlIHdoZW4gaXQgaGFzIGJlZW4gY3JlYXRl
ZCBvbiB0aGUKLSAgICBjbGllbnQgYW5kIHRoZSBhZGFwdGVyIGhhcyBub3QgeWV0IHJlcG9ydCB0
aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkKLSAgICBzYXZlZC4KLQotICAgIEV4YW1wbGUKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5N
b2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnaXNOZXcnKTsgLy8gdHJ1ZQotCi0gICAgcmVjb3JkLnNh
dmUoKS50aGVuKGZ1bmN0aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lzTmV3Jyk7IC8v
IGZhbHNlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNOZXcKLSAgICBAdHlw
ZSB7Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNOZXc6IHJldHJpZXZlRnJvbUN1
cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJl
Y29yZCBpcyBpbiB0aGUgYHZhbGlkYCBzdGF0ZS4gQQotICAgIHJlY29yZCB3aWxsIGJlIGluIHRo
ZSBgdmFsaWRgIHN0YXRlIHdoZW4gbm8gY2xpZW50LXNpZGUKLSAgICB2YWxpZGF0aW9ucyBoYXZl
IGZhaWxlZCBhbmQgdGhlIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55Ci0gICAgc2VydmVyLXNp
ZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KLQotICAgIEBwcm9wZXJ0eSBpc1ZhbGlkCi0gICAgQHR5
cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzVmFsaWQ6IHJldHJpZXZlRnJv
bUN1cnJlbnRTdGF0ZSwKLSAgLyoqCi0gICAgSWYgdGhlIHJlY29yZCBpcyBpbiB0aGUgZGlydHkg
c3RhdGUgdGhpcyBwcm9wZXJ0eSB3aWxsIHJlcG9ydCB3aGF0Ci0gICAga2luZCBvZiBjaGFuZ2Ug
aGFzIGNhdXNlZCBpdCB0byBtb3ZlIGludG8gdGhlIGRpcnR5Ci0gICAgc3RhdGUuIFBvc3NpYmxl
IHZhbHVlcyBhcmU6Ci0KLSAgICAtIGBjcmVhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIGNyZWF0
ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KLSAgICAt
IGB1cGRhdGVkYCBUaGUgcmVjb3JkIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGNsaWVudCBhbmQg
bm90IHlldCBzYXZlZCB0byB0aGUgYWRhcHRlci4KLSAgICAtIGBkZWxldGVkYCBUaGUgcmVjb3Jk
IGhhcyBiZWVuIGRlbGV0ZWQgYnkgdGhlIGNsaWVudCBhbmQgbm90IHlldCBzYXZlZCB0byB0aGUg
YWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVj
b3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdldCgnZGly
dHlUeXBlJyk7IC8vICdjcmVhdGVkJwotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGRpcnR5VHlw
ZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGRpcnR5VHlwZTog
cmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAotCi0gIC8qKgotICAgIElmIGB0cnVlYCB0aGUgYWRh
cHRlciByZXBvcnRlZCB0aGF0IGl0IHdhcyB1bmFibGUgdG8gc2F2ZSBsb2NhbAotICAgIGNoYW5n
ZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIHRoZSByZWNvcmQgaGF2
aW5nCi0gICAgaXRzIGBpc1ZhbGlkYCBwcm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYgdGhlIGFkYXB0
ZXIgcmVwb3J0ZWQgdGhhdAotICAgIHNlcnZlci1zaWRlIHZhbGlkYXRpb25zIGZhaWxlZC4KLQot
ICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0KCdpc0Vycm9y
Jyk7IC8vIGZhbHNlCi0gICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFsdWUnKTsKLSAg
ICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICByZWNvcmQuZ2V0
KCdpc0Vycm9yJyk7IC8vIHRydWUKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBp
c0Vycm9yCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGlzRXJy
b3I6IGZhbHNlLAotICAvKioKLSAgICBJZiBgdHJ1ZWAgdGhlIHN0b3JlIGlzIGF0dGVtcHRpbmcg
dG8gcmVsb2FkIHRoZSByZWNvcmQgZm9ybSB0aGUgYWRhcHRlci4KLQotICAgIEV4YW1wbGUKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycpOyAvLyBmYWxz
ZQotICAgIHJlY29yZC5yZWxvYWQoKTsKLSAgICByZWNvcmQuZ2V0KCdpc1JlbG9hZGluZycpOyAv
LyB0cnVlCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgaXNSZWxvYWRpbmcKLSAgICBAdHlwZSB7
Qm9vbGVhbn0KLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgaXNSZWxvYWRpbmc6IGZhbHNlLAotCi0g
IC8qKgotICAgIFRoZSBgY2xpZW50SWRgIHByb3BlcnR5IGlzIGEgdHJhbnNpZW50IG51bWVyaWNh
bCBpZGVudGlmaWVyCi0gICAgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkgdGhlIGRhdGEgc3RvcmUu
IEl0IGlzIGltcG9ydGFudAotICAgIHByaW1hcmlseSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2Jq
ZWN0cyBtYXkgbm90IHlldCBoYXZlIGFuCi0gICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCi0K
LSAgICBAcHJvcGVydHkgY2xpZW50SWQKLSAgICBAcHJpdmF0ZQotICAgIEB0eXBlIHtOdW1iZXJ8
U3RyaW5nfQotICAqLwotICBjbGllbnRJZDogbnVsbCwKLSAgLyoqCi0gICAgQWxsIGVtYmVyIG1v
ZGVscyBoYXZlIGFuIGlkIHByb3BlcnR5LiBUaGlzIGlzIGFuIGlkZW50aWZpZXIKLSAgICBtYW5h
Z2VkIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJl
Ci0gICAgc3RyaW5ncyBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5LiBOb3RlIHdoZW4gZGVj
bGFyaW5nIHRoZQotICAgIGF0dHJpYnV0ZXMgZm9yIGEgbW9kZWwgaXQgaXMgYW4gZXJyb3IgdG8g
ZGVjbGFyZSBhbiBpZAotICAgIGF0dHJpYnV0ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgcmVjb3JkID0gc3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7Ci0gICAgcmVjb3JkLmdl
dCgnaWQnKTsgLy8gbnVsbAotCi0gICAgc3RvcmUuZmluZCgnbW9kZWwnLCAxKS50aGVuKGZ1bmN0
aW9uKG1vZGVsKSB7Ci0gICAgICBtb2RlbC5nZXQoJ2lkJyk7IC8vICcxJwotICAgIH0pOwotICAg
IGBgYAotCi0gICAgQHByb3BlcnR5IGlkCi0gICAgQHR5cGUge1N0cmluZ30KLSAgKi8KLSAgaWQ6
IG51bGwsCi0gIHRyYW5zYWN0aW9uOiBudWxsLAotICAvKioKLSAgICBAcHJvcGVydHkgY3VycmVu
dFN0YXRlCi0gICAgQHByaXZhdGUKLSAgICBAdHlwZSB7T2JqZWN0fQotICAqLwotICBjdXJyZW50
U3RhdGU6IG51bGwsCi0gIC8qKgotICAgIFdoZW4gdGhlIHJlY29yZCBpcyBpbiB0aGUgYGludmFs
aWRgIHN0YXRlIHRoaXMgb2JqZWN0IHdpbGwgY29udGFpbgotICAgIGFueSBlcnJvcnMgcmV0dXJu
ZWQgYnkgdGhlIGFkYXB0ZXIuIFdoZW4gcHJlc2VudCB0aGUgZXJyb3JzIGhhc2gKLSAgICB0eXBp
Y2FsbHkgY29udGFpbnMga2V5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnZhbGlkIHByb3BlcnR5
IG5hbWVzCi0gICAgYW5kIHZhbHVlcyB3aGljaCBhcmUgYW4gYXJyYXkgb2YgZXJyb3IgbWVzc2Fn
ZXMuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLmdldCgnZXJyb3JzLmxlbmd0aCcp
OyAvLyAwCi0gICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFsaWQgdmFsdWUnKTsKLSAgICByZWNv
cmQuc2F2ZSgpLnRoZW4obnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICByZWNvcmQuZ2V0KCdlcnJv
cnMnKS5nZXQoJ2ZvbycpOyAvLyBbJ2ZvbyBzaG91bGQgYmUgYSBudW1iZXIuJ10KLSAgICB9KTsK
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBlcnJvcnMKLSAgICBAdHlwZSB7T2JqZWN0fQotICAq
LwotICBlcnJvcnM6IG51bGwsCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgSlNPTiByZXByZXNlbnRh
dGlvbiBvZiB0aGUgcmVjb3JkLCB1c2luZyB0aGUgc2VyaWFsaXphdGlvbgotICAgIHN0cmF0ZWd5
IG9mIHRoZSBzdG9yZSdzIGFkYXB0ZXIuCi0KLSAgIGBzZXJpYWxpemVgIHRha2VzIGFuIG9wdGlv
bmFsIGhhc2ggYXMgYSBwYXJhbWV0ZXIsIGN1cnJlbnRseQotICAgIHN1cHBvcnRlZCBvcHRpb25z
IGFyZToKLQotICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91
bGQgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICBKU09OIHJlcHJlc2VudGF0aW9uLgotCi0gICAg
QG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1
cm5zIHtPYmplY3R9IGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2ZSBKU09OIHZh
bHVlcyBvbmx5Ci0gICovCi0gIHNlcmlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZh
ciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKLSAgICByZXR1cm4gc3RvcmUuc2VyaWFsaXpl
KHRoaXMsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFVzZSBbRFMuSlNPTlNlcmlhbGl6
ZXJdKERTLkpTT05TZXJpYWxpemVyLmh0bWwpIHRvCi0gICAgZ2V0IHRoZSBKU09OIHJlcHJlc2Vu
dGF0aW9uIG9mIGEgcmVjb3JkLgotCi0gICAgYHRvSlNPTmAgdGFrZXMgYW4gb3B0aW9uYWwgaGFz
aCBhcyBhIHBhcmFtZXRlciwgY3VycmVudGx5Ci0gICAgc3VwcG9ydGVkIG9wdGlvbnMgYXJlOgot
Ci0gICAgLSBgaW5jbHVkZUlkYDogYHRydWVgIGlmIHRoZSByZWNvcmQncyBJRCBzaG91bGQgYmUg
aW5jbHVkZWQgaW4gdGhlCi0gICAgICBKU09OIHJlcHJlc2VudGF0aW9uLgotCi0gICAgQG1ldGhv
ZCB0b0pTT04KLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm5zIHtPYmpl
Y3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgotICAqLwotICB0b0pTT046
IGZ1bmN0aW9uKG9wdGlvbnMpIHsKLSAgICAvLyBjb250YWluZXIgaXMgZm9yIGxhenkgdHJhbnNm
b3JtIGxvb2t1cHMKLSAgICB2YXIgc2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmNyZWF0
ZSh7IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIgfSk7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZXIu
c2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIEZpcmVkIHdoZW4g
dGhlIHJlY29yZCBpcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgotCi0gICAgQGV2ZW50IGRpZExv
YWQKLSAgKi8KLSAgZGlkTG9hZDogRW1iZXIuSywKLQotICAvKioKLSAgICBGaXJlZCB3aGVuIHRo
ZSByZWNvcmQgaXMgdXBkYXRlZC4KLQotICAgIEBldmVudCBkaWRVcGRhdGUKLSAgKi8KLSAgZGlk
VXBkYXRlOiBFbWJlci5LLAotCi0gIC8qKgotICAgIEZpcmVkIHdoZW4gdGhlIHJlY29yZCBpcyBj
cmVhdGVkLgotCi0gICAgQGV2ZW50IGRpZENyZWF0ZQotICAqLwotICBkaWRDcmVhdGU6IEVtYmVy
LkssCi0KLSAgLyoqCi0gICAgRmlyZWQgd2hlbiB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQuCi0KLSAg
ICBAZXZlbnQgZGlkRGVsZXRlCi0gICovCi0gIGRpZERlbGV0ZTogRW1iZXIuSywKLQotICAvKioK
LSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgYmVjb21lcyBpbnZhbGlkLgotCi0gICAgQGV2ZW50
IGJlY2FtZUludmFsaWQKLSAgKi8KLSAgYmVjYW1lSW52YWxpZDogRW1iZXIuSywKLQotICAvKioK
LSAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgZW50ZXJzIHRoZSBlcnJvciBzdGF0ZS4KLQotICAg
IEBldmVudCBiZWNhbWVFcnJvcgotICAqLwotICBiZWNhbWVFcnJvcjogRW1iZXIuSywKLQotICAv
KioKLSAgICBAcHJvcGVydHkgZGF0YQotICAgIEBwcml2YXRlCi0gICAgQHR5cGUge09iamVjdH0K
LSAgKi8KLSAgZGF0YTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fZGF0
YSA9IHRoaXMuX2RhdGEgfHwge307Ci0gICAgcmV0dXJuIHRoaXMuX2RhdGE7Ci0gIH0pLnByb3Bl
cnR5KCksCi0KLSAgX2RhdGE6IG51bGwsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgc2V0
KHRoaXMsICdjdXJyZW50U3RhdGUnLCBEUy5Sb290U3RhdGUuZW1wdHkpOwotICAgIHZhciBlcnJv
cnMgPSBEUy5FcnJvcnMuY3JlYXRlKCk7Ci0gICAgZXJyb3JzLnJlZ2lzdGVySGFuZGxlcnModGhp
cywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnNlbmQoJ2JlY2FtZUludmFsaWQnKTsKLSAgICB9
LCBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuc2VuZCgnYmVjYW1lVmFsaWQnKTsKLSAgICB9KTsK
LSAgICBzZXQodGhpcywgJ2Vycm9ycycsIGVycm9ycyk7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAg
ICB0aGlzLl9zZXR1cCgpOwotICB9LAotCi0gIF9zZXR1cDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fY2hhbmdlc1RvU3luYyA9IHt9OwotICAgIHRoaXMuX2RlZmVycmVkVHJpZ2dlcnMgPSBbXTsK
LSAgICB0aGlzLl9kYXRhID0ge307Ci0gICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9OwotICAgIHRo
aXMuX2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9OwotICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7
fTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHNlbmQKLSAgICBAcHJpdmF0ZQotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lCi0gICAgQHBhcmFtIHtPYmplY3R9IGNvbnRleHQKLSAgKi8KLSAg
c2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHZhciBjdXJyZW50U3RhdGUgPSBn
ZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpOwotCi0gICAgaWYgKCFjdXJyZW50U3RhdGVbbmFtZV0p
IHsKLSAgICAgIHRoaXMuX3VuaGFuZGxlZEV2ZW50KGN1cnJlbnRTdGF0ZSwgbmFtZSwgY29udGV4
dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZVtuYW1lXSh0aGlzLCBjb250ZXh0
KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHRyYW5zaXRpb25UbwotICAgIEBwcml2YXRl
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgKi8KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlv
bihuYW1lKSB7Ci0gICAgLy8gUE9TU0lCTEUgVE9ETzogUmVtb3ZlIHRoaXMgY29kZSBhbmQgcmVw
bGFjZSB3aXRoCi0gICAgLy8gYWx3YXlzIGhhdmluZyBkaXJlY3QgcmVmZXJlbmNlcyB0byBzdGF0
ZSBvYmplY3RzCi0KLSAgICB2YXIgcGl2b3ROYW1lID0gbmFtZS5zcGxpdCgiLiIsIDEpLAotICAg
ICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywgJ2N1cnJlbnRTdGF0ZScpLAotICAgICAgICBz
dGF0ZSA9IGN1cnJlbnRTdGF0ZTsKLQotICAgIGRvIHsKLSAgICAgIGlmIChzdGF0ZS5leGl0KSB7
IHN0YXRlLmV4aXQodGhpcyk7IH0KLSAgICAgIHN0YXRlID0gc3RhdGUucGFyZW50U3RhdGU7Ci0g
ICAgfSB3aGlsZSAoIXN0YXRlLmhhc093blByb3BlcnR5KHBpdm90TmFtZSkpOwotCi0gICAgdmFy
IHBhdGggPSBuYW1lLnNwbGl0KCIuIik7Ci0KLSAgICB2YXIgc2V0dXBzID0gW10sIGVudGVycyA9
IFtdLCBpLCBsOwotCi0gICAgZm9yIChpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0g
ICAgICBzdGF0ZSA9IHN0YXRlW3BhdGhbaV1dOwotCi0gICAgICBpZiAoc3RhdGUuZW50ZXIpIHsg
ZW50ZXJzLnB1c2goc3RhdGUpOyB9Ci0gICAgICBpZiAoc3RhdGUuc2V0dXApIHsgc2V0dXBzLnB1
c2goc3RhdGUpOyB9Ci0gICAgfQotCi0gICAgZm9yIChpPTAsIGw9ZW50ZXJzLmxlbmd0aDsgaTxs
OyBpKyspIHsKLSAgICAgIGVudGVyc1tpXS5lbnRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBzZXQo
dGhpcywgJ2N1cnJlbnRTdGF0ZScsIHN0YXRlKTsKLQotICAgIGZvciAoaT0wLCBsPXNldHVwcy5s
ZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBzZXR1cHNbaV0uc2V0dXAodGhpcyk7Ci0gICAgfQot
Ci0gICAgdGhpcy51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICB9LAotCi0gIF91bmhhbmRs
ZWRFdmVudDogZnVuY3Rpb24oc3RhdGUsIG5hbWUsIGNvbnRleHQpIHsKLSAgICB2YXIgZXJyb3JN
ZXNzYWdlID0gIkF0dGVtcHRlZCB0byBoYW5kbGUgZXZlbnQgYCIgKyBuYW1lICsgImAgIjsKLSAg
ICBlcnJvck1lc3NhZ2UgICAgKz0gIm9uICIgKyBTdHJpbmcodGhpcykgKyAiIHdoaWxlIGluIHN0
YXRlICI7Ci0gICAgZXJyb3JNZXNzYWdlICAgICs9IHN0YXRlLnN0YXRlTmFtZSArICIuICI7Ci0K
LSAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICBlcnJvck1lc3NhZ2UgICs9
ICJDYWxsZWQgd2l0aCAiICsgRW1iZXIuaW5zcGVjdChjb250ZXh0KSArICIuIjsKLSAgICB9Ci0K
LSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJyb3JNZXNzYWdlKTsKLSAgfSwKLQotICB3aXRo
VHJhbnNhY3Rpb246IGZ1bmN0aW9uKGZuKSB7Ci0gICAgdmFyIHRyYW5zYWN0aW9uID0gZ2V0KHRo
aXMsICd0cmFuc2FjdGlvbicpOwotICAgIGlmICh0cmFuc2FjdGlvbikgeyBmbih0cmFuc2FjdGlv
bik7IH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGxvYWRpbmdEYXRhCi0gICAgQHByaXZh
dGUKLSAgICBAcGFyYW0ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgbG9hZGluZ0RhdGE6IGZ1
bmN0aW9uKHByb21pc2UpIHsKLSAgICB0aGlzLnNlbmQoJ2xvYWRpbmdEYXRhJywgcHJvbWlzZSk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBsb2FkZWREYXRhCi0gICAgQHByaXZhdGUKLSAg
Ki8KLSAgbG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdsb2FkZWREYXRh
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3RGb3VuZAotICAgIEBwcml2YXRlCi0g
ICovCi0gIG5vdEZvdW5kOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ25vdEZvdW5kJyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBwdXNoZWREYXRhCi0gICAgQHByaXZhdGUKLSAg
Ki8KLSAgcHVzaGVkRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5zZW5kKCdwdXNoZWREYXRh
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTWFya3MgdGhlIHJlY29yZCBhcyBkZWxldGVkIGJ1dCBk
b2VzIG5vdCBzYXZlIGl0LiBZb3UgbXVzdCBjYWxsCi0gICAgYHNhdmVgIGFmdGVyd2FyZHMgaWYg
eW91IHdhbnQgdG8gcGVyc2lzdCBpdC4gWW91IG1pZ2h0IHVzZSB0aGlzCi0gICAgbWV0aG9kIGlm
IHlvdSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHN0aWxsIGByb2xsYmFjaygpYCBhCi0gICAg
ZGVsZXRlIGFmdGVyIGl0IHdhcyBtYWRlLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAg
ICAgIGFjdGlvbnM6IHsKLSAgICAgICAgc29mdERlbGV0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgdGhpcy5nZXQoJ21vZGVsJykuZGVsZXRlUmVjb3JkKCk7Ci0gICAgICAgIH0sCi0gICAgICAg
IGNvbmZpcm06IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnNhdmUo
KTsKLSAgICAgICAgfSwKLSAgICAgICAgdW5kbzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhp
cy5nZXQoJ21vZGVsJykucm9sbGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKLSAgKi8KLSAgZGVsZXRlUmVjb3Jk
OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2RlbGV0ZVJlY29yZCcpOwotICB9LAotCi0g
IC8qKgotICAgIFNhbWUgYXMgYGRlbGV0ZVJlY29yZGAsIGJ1dCBzYXZlcyB0aGUgcmVjb3JkIGlt
bWVkaWF0ZWx5LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5N
b2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsK
LSAgICAgICAgZGVsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgY29udHJvbGxlciA9
IHRoaXMuY29udHJvbGxlcjsKLSAgICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5kZXN0cm95UmVj
b3JkKCkudGhlbihmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIudHJhbnNpdGlv
blRvUm91dGUoJ21vZGVsLmluZGV4Jyk7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGVzdHJveVJlY29yZAotICAgIEBy
ZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUg
YWRhcHRlciByZXR1cm5zCi0gICAgc3VjY2Vzc2Z1bGx5IG9yIHJlamVjdGVkIGlmIHRoZSBhZGFw
dGVyIHJldHVybnMgd2l0aCBhbiBlcnJvci4KLSAgKi8KLSAgZGVzdHJveVJlY29yZDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5kZWxldGVSZWNvcmQoKTsKLSAgICByZXR1cm4gdGhpcy5zYXZlKCk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1bmxvYWRSZWNvcmQKLSAgICBAcHJpdmF0ZQot
ICAqLwotICB1bmxvYWRSZWNvcmQ6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmFzc2VydCgiWW91
IGNhbiBvbmx5IHVubG9hZCBhIGxvYWRlZCwgbm9uLWRpcnR5IHJlY29yZC4iLCAhZ2V0KHRoaXMs
ICdpc0RpcnR5JykpOwotCi0gICAgdGhpcy5zZW5kKCd1bmxvYWRSZWNvcmQnKTsKLSAgfSwKLQot
ICAvKioKLSAgICBAbWV0aG9kIGNsZWFyUmVsYXRpb25zaGlwcwotICAgIEBwcml2YXRlCi0gICov
Ci0gIGNsZWFyUmVsYXRpb25zaGlwczogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5lYWNoUmVsYXRp
b25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgaWYgKHJlbGF0aW9u
c2hpcC5raW5kID09PSAnYmVsb25nc1RvJykgewotICAgICAgICBzZXQodGhpcywgbmFtZSwgbnVs
bCk7Ci0gICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsK
LSAgICAgICAgdmFyIGhhc01hbnkgPSB0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcC5u
YW1lXTsKLSAgICAgICAgaWYgKGhhc01hbnkpIHsgaGFzTWFueS5jbGVhcigpOyB9Ci0gICAgICB9
Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNvcmRB
cnJheXMKLSAgICBAcHJpdmF0ZQotICAqLwotICB1cGRhdGVSZWNvcmRBcnJheXM6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMuX3VwZGF0aW5nUmVjb3JkQXJyYXlzTGF0ZXIgPSBmYWxzZTsKLSAgICBn
ZXQodGhpcywgJ3N0b3JlJykuZGF0YVdhc1VwZGF0ZWQodGhpcy5jb25zdHJ1Y3RvciwgdGhpcyk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhbiBvYmplY3QsIHdob3NlIGtleXMgYXJlIGNo
YW5nZWQgcHJvcGVydGllcywgYW5kIHZhbHVlIGlzCi0gICAgYW4gW29sZFByb3AsIG5ld1Byb3Bd
IGFycmF5LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5NYXNj
b3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgbmFtZTogYXR0cignc3RyaW5nJykKLSAgICB9
KTsKLQotICAgIHZhciBwZXJzb24gPSBzdG9yZS5jcmVhdGVSZWNvcmQoJ3BlcnNvbicpOwotICAg
IHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7fQotICAgIHBlcnNvbi5zZXQoJ25hbWUn
LCAnVG9tc3RlcicpOwotICAgIHBlcnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7bmFtZTog
W3VuZGVmaW5lZCwgJ1RvbXN0ZXInXX0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2hhbmdlZEF0
dHJpYnV0ZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9IGFuIG9iamVjdCwgd2hvc2Uga2V5cyBhcmUg
Y2hhbmdlZCBwcm9wZXJ0aWVzLAotICAgICAgYW5kIHZhbHVlIGlzIGFuIFtvbGRQcm9wLCBuZXdQ
cm9wXSBhcnJheS4KLSAgKi8KLSAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKCkgewotICAg
IHZhciBvbGREYXRhID0gZ2V0KHRoaXMsICdfZGF0YScpLAotICAgICAgICBuZXdEYXRhID0gZ2V0
KHRoaXMsICdfYXR0cmlidXRlcycpLAotICAgICAgICBkaWZmRGF0YSA9IHt9LAotICAgICAgICBw
cm9wOwotCi0gICAgZm9yIChwcm9wIGluIG5ld0RhdGEpIHsKLSAgICAgIGRpZmZEYXRhW3Byb3Bd
ID0gW29sZERhdGFbcHJvcF0sIG5ld0RhdGFbcHJvcF1dOwotICAgIH0KLQotICAgIHJldHVybiBk
aWZmRGF0YTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGFkYXB0ZXJXaWxsQ29tbWl0Ci0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgYWRhcHRlcldpbGxDb21taXQ6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuc2VuZCgnd2lsbENvbW1pdCcpOwotICB9LAotCi0gIC8qKgotICAgIElmIHRoZSBhZGFw
dGVyIGRpZCBub3QgcmV0dXJuIGEgaGFzaCBpbiByZXNwb25zZSB0byBhIGNvbW1pdCwKLSAgICBt
ZXJnZSB0aGUgY2hhbmdlZCBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGludG8gdGhlIGV4
aXN0aW5nCi0gICAgc2F2ZWQgZGF0YS4KLQotICAgIEBtZXRob2QgYWRhcHRlckRpZENvbW1pdAot
ICAqLwotICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgc2V0KHRoaXMs
ICdpc0Vycm9yJywgZmFsc2UpOwotCi0gICAgaWYgKGRhdGEpIHsKLSAgICAgIHRoaXMuX2RhdGEg
PSBkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5taXhpbih0aGlzLl9kYXRhLCB0aGlz
Ll9pbkZsaWdodEF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIHRoaXMuX2luRmxpZ2h0QXR0cmli
dXRlcyA9IHt9OwotCi0gICAgdGhpcy5zZW5kKCdkaWRDb21taXQnKTsKLSAgICB0aGlzLnVwZGF0
ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0KLSAgICBpZiAoIWRhdGEpIHsgcmV0dXJuOyB9Ci0KLSAg
ICB0aGlzLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICB0
aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdkYXRhJyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCBhZGFwdGVyRGlkRGlydHkKLSAgICBAcHJpdmF0ZQotICAqLwotICBhZGFw
dGVyRGlkRGlydHk6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2VuZCgnYmVjb21lRGlydHknKTsK
LSAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7Ci0gIH0sCi0KLSAgZGF0YURpZENo
YW5nZTogRW1iZXIub2JzZXJ2ZXIoZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yZWxvYWRIYXNNYW55
cygpOwotICB9LCAnZGF0YScpLAotCi0gIHJlbG9hZEhhc01hbnlzOiBmdW5jdGlvbigpIHsKLSAg
ICB2YXIgcmVsYXRpb25zaGlwcyA9IGdldCh0aGlzLmNvbnN0cnVjdG9yLCAncmVsYXRpb25zaGlw
c0J5TmFtZScpOwotICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXIoKTsKLSAgICByZWxh
dGlvbnNoaXBzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICBp
ZiAodGhpcy5fZGF0YS5saW5rcyAmJiB0aGlzLl9kYXRhLmxpbmtzW25hbWVdKSB7IHJldHVybjsg
fQotICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAnaGFzTWFueScpIHsKLSAgICAgICAg
dGhpcy5oYXNNYW55RGlkQ2hhbmdlKHJlbGF0aW9uc2hpcC5rZXkpOwotICAgICAgfQotICAgIH0s
IHRoaXMpOwotICB9LAotCi0gIGhhc01hbnlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleSkgewotICAg
IHZhciBoYXNNYW55ID0gdGhpcy5fcmVsYXRpb25zaGlwc1trZXldOwotCi0gICAgaWYgKGhhc01h
bnkpIHsKLSAgICAgIHZhciByZWNvcmRzID0gdGhpcy5fZGF0YVtrZXldIHx8IFtdOwotCi0gICAg
ICBzZXQoaGFzTWFueSwgJ2NvbnRlbnQnLCBFbWJlci5BKHJlY29yZHMpKTsKLSAgICAgIHNldCho
YXNNYW55LCAnaXNMb2FkZWQnLCB0cnVlKTsKLSAgICAgIGhhc01hbnkudHJpZ2dlcignZGlkTG9h
ZCcpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5
c0xhdGVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgdXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6IGZ1
bmN0aW9uKCkgewotICAgIC8vIHF1aWNrIGhhY2sgKHNvbWV0aGluZyBsaWtlIHRoaXMgY291bGQg
YmUgcHVzaGVkIGludG8gcnVuLm9uY2UKLSAgICBpZiAodGhpcy5fdXBkYXRpbmdSZWNvcmRBcnJh
eXNMYXRlcikgeyByZXR1cm47IH0KLSAgICB0aGlzLl91cGRhdGluZ1JlY29yZEFycmF5c0xhdGVy
ID0gdHJ1ZTsKLQotICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMu
dXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHNldHVwRGF0
YQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGRhdGEKLSAgICBAcGFyYW0ge0Jv
b2xlYW59IHBhcnRpYWwgdGhlIGRhdGEgc2hvdWxkIGJlIG1lcmdlZCBpbnRvCi0gICAgICB0aGUg
ZXhpc3RpbmcgZGF0YSwgbm90IHJlcGxhY2UgaXQuCi0gICovCi0gIHNldHVwRGF0YTogZnVuY3Rp
b24oZGF0YSwgcGFydGlhbCkgewotICAgIGlmIChwYXJ0aWFsKSB7Ci0gICAgICBFbWJlci5tZXJn
ZSh0aGlzLl9kYXRhLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5fZGF0YSA9IGRh
dGE7Ci0gICAgfQotCi0gICAgdmFyIHJlbGF0aW9uc2hpcHMgPSB0aGlzLl9yZWxhdGlvbnNoaXBz
OwotCi0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbCkgewotICAg
ICAgaWYgKGRhdGEubGlua3MgJiYgZGF0YS5saW5rc1tuYW1lXSkgeyByZXR1cm47IH0KLSAgICAg
IGlmIChyZWwub3B0aW9ucy5hc3luYykgeyByZWxhdGlvbnNoaXBzW25hbWVdID0gbnVsbDsgfQot
ICAgIH0pOwotCi0gICAgaWYgKGRhdGEpIHsgdGhpcy5wdXNoZWREYXRhKCk7IH0KLQotICAgIHRo
aXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMu
bm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsKLSAgICB9KTsKLSAgfSwKLQotICBtYXRlcmlh
bGl6ZUlkOiBmdW5jdGlvbihpZCkgewotICAgIHNldCh0aGlzLCAnaWQnLCBpZCk7Ci0gIH0sCi0K
LSAgbWF0ZXJpYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7Ci0gICAgRW1i
ZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBoYXNoIG9mIGF0dHJpYnV0ZXMgdG8gbWF0ZXJpYWxpemVB
dHRyaWJ1dGVzIiwgISFhdHRyaWJ1dGVzKTsKLSAgICBtZXJnZSh0aGlzLl9kYXRhLCBhdHRyaWJ1
dGVzKTsKLSAgfSwKLQotICBtYXRlcmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSwgdmFs
dWUpIHsKLSAgICB0aGlzLl9kYXRhW25hbWVdID0gdmFsdWU7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QG1ldGhvZCB1cGRhdGVIYXNNYW55Ci0gICAgQHByaXZhdGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlY29yZHMKLSAgKi8KLSAgdXBkYXRlSGFzTWFueTog
ZnVuY3Rpb24obmFtZSwgcmVjb3JkcykgewotICAgIHRoaXMuX2RhdGFbbmFtZV0gPSByZWNvcmRz
OwotICAgIHRoaXMuaGFzTWFueURpZENoYW5nZShuYW1lKTsKLSAgfSwKLQotICAvKioKLSAgICBA
bWV0aG9kIHVwZGF0ZUJlbG9uZ3NUbwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9
IG5hbWUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgKi8KLSAgdXBkYXRlQmVsb25n
c1RvOiBmdW5jdGlvbihuYW1lLCByZWNvcmQpIHsKLSAgICB0aGlzLl9kYXRhW25hbWVdID0gcmVj
b3JkOwotICB9LAotCi0gIC8qKgotICAgIElmIHRoZSBtb2RlbCBgaXNEaXJ0eWAgdGhpcyBmdW5j
dGlvbiB3aWxsIGRpc2NhcmQgYW55IHVuc2F2ZWQKLSAgICBjaGFuZ2VzCi0KLSAgICBFeGFtcGxl
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLmdldCgnbmFtZScpOyAvLyAnVW50aXRs
ZWQgRG9jdW1lbnQnCi0gICAgcmVjb3JkLnNldCgnbmFtZScsICdEb2MgMScpOwotICAgIHJlY29y
ZC5nZXQoJ25hbWUnKTsgLy8gJ0RvYyAxJwotICAgIHJlY29yZC5yb2xsYmFjaygpOwotICAgIHJl
Y29yZC5nZXQoJ25hbWUnKTsgLy8gJ1VudGl0bGVkIERvY3VtZW50JwotICAgIGBgYAotCi0gICAg
QG1ldGhvZCByb2xsYmFjawotICAqLwotICByb2xsYmFjazogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fYXR0cmlidXRlcyA9IHt9OwotCi0gICAgaWYgKGdldCh0aGlzLCAnaXNFcnJvcicpKSB7Ci0g
ICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKLSAgICAgIHNldCh0aGlzLCAnaXNF
cnJvcicsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoIWdldCh0aGlzLCAnaXNWYWxpZCcpKSB7
Ci0gICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKLSAgICB9Ci0KLSAgICB0aGlz
LnNlbmQoJ3JvbGxlZEJhY2snKTsKLQotICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2Vy
dmVycyhmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEn
KTsKLSAgICB9KTsKLSAgfSwKLQotICB0b1N0cmluZ0V4dGVuc2lvbjogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIGdldCh0aGlzLCAnaWQnKTsKLSAgfSwKLQotICAvKioKLSAgICBUaGUgZ29hbCBv
ZiB0aGlzIG1ldGhvZCBpcyB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHNwZWNpZmljIG9ic2VydmVy
cwotICAgIHRoYXQgdGFrZSBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gYXBwbGljYXRpb24gY2hhbmdl
cy4KLQotICAgIFRoaXMgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gbWFrZSBjaGFuZ2VzIChzdWNoIGFz
IG1hdGVyaWFsaXphdGlvbiBhbmQKLSAgICByb2xsYmFjaykgdGhhdCBzaG91bGQgbm90IHRyaWdn
ZXIgc2Vjb25kYXJ5IGJlaGF2aW9yIChzdWNoIGFzIHNldHRpbmcgYW4KLSAgICBpbnZlcnNlIHJl
bGF0aW9uc2hpcCBvciBtYXJraW5nIHJlY29yZHMgYXMgZGlydHkpLgotCi0gICAgVGhlIHNwZWNp
ZmljIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IGNoYW5nZSBhcyBFbWJlciBwcm9wZXIgcHJv
dmlkZXMKLSAgICBiZXR0ZXIgaW5mcmFzdHJ1Y3R1cmUgZm9yIHN1c3BlbmRpbmcgZ3JvdXBzIG9m
IG9ic2VydmVycywgYW5kIGlmIEFycmF5Ci0gICAgb2JzZXJ2YXRpb24gYmVjb21lcyBtb3JlIHVu
aWZpZWQgd2l0aCByZWd1bGFyIG9ic2VydmVycy4KLQotICAgIEBtZXRob2Qgc3VzcGVuZFJlbGF0
aW9uc2hpcE9ic2VydmVycwotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIGNhbGxiYWNrCi0gICAg
QHBhcmFtIGJpbmRpbmcKLSAgKi8KLSAgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVyczogZnVu
Y3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICB2YXIgb2JzZXJ2ZXJzID0gZ2V0KHRoaXMu
Y29uc3RydWN0b3IsICdyZWxhdGlvbnNoaXBOYW1lcycpLmJlbG9uZ3NUbzsKLSAgICB2YXIgc2Vs
ZiA9IHRoaXM7Ci0KLSAgICB0cnkgewotICAgICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlw
cyA9IHRydWU7Ci0gICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVycyhzZWxmLCBvYnNlcnZlcnMs
IG51bGwsICdiZWxvbmdzVG9EaWRDaGFuZ2UnLCBmdW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIu
X3N1c3BlbmRCZWZvcmVPYnNlcnZlcnMoc2VsZiwgb2JzZXJ2ZXJzLCBudWxsLCAnYmVsb25nc1Rv
V2lsbENoYW5nZScsIGZ1bmN0aW9uKCkgewotICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGlu
ZyB8fCBzZWxmKTsKLSAgICAgICAgfSk7Ci0gICAgICB9KTsKLSAgICB9IGZpbmFsbHkgewotICAg
ICAgdGhpcy5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcyA9IGZhbHNlOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgICBTYXZlIHRoZSByZWNvcmQgYW5kIHBlcnNpc3QgYW55IGNoYW5nZXMgdG8gdGhl
IHJlY29yZCB0byBhbgotICAgIGV4dGVuYWwgc291cmNlIHZpYSB0aGUgYWRhcHRlci4KLQotICAg
IEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuc2V0KCduYW1lJywgJ1Rv
bXN0ZXInKTsKLSAgICByZWNvcmQuc2F2ZSgpLnRoZW4oZnVuY3Rpb24oKXsKLSAgICAgIC8vIFN1
Y2Nlc3MgY2FsbGJhY2sKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEVycm9yIGNhbGxi
YWNrCi0gICAgfSk7Ci0gICAgYGBgCi0gICAgQG1ldGhvZCBzYXZlCi0gICAgQHJldHVybiB7UHJv
bWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBhZGFwdGVyIHJl
dHVybnMKLSAgICBzdWNjZXNzZnVsbHkgb3IgcmVqZWN0ZWQgaWYgdGhlIGFkYXB0ZXIgcmV0dXJu
cyB3aXRoIGFuIGVycm9yLgotICAqLwotICBzYXZlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcHJv
bWlzZUxhYmVsID0gIkRTOiBNb2RlbCNzYXZlICIgKyB0aGlzOwotICAgIHZhciByZXNvbHZlciA9
IEVtYmVyLlJTVlAuZGVmZXIocHJvbWlzZUxhYmVsKTsKLQotICAgIHRoaXMuZ2V0KCdzdG9yZScp
LnNjaGVkdWxlU2F2ZSh0aGlzLCByZXNvbHZlcik7Ci0gICAgdGhpcy5faW5GbGlnaHRBdHRyaWJ1
dGVzID0gdGhpcy5fYXR0cmlidXRlczsKLSAgICB0aGlzLl9hdHRyaWJ1dGVzID0ge307Ci0KLSAg
ICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9t
aXNlIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJlbG9hZCB0aGUgcmVjb3JkIGZyb20gdGhlIGFk
YXB0ZXIuCi0KLSAgICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSByZWNvcmQgaGFzIGFscmVh
ZHkgZmluaXNoZWQgbG9hZGluZwotICAgIGFuZCBoYXMgbm90IHlldCBiZWVuIG1vZGlmaWVkIChg
aXNMb2FkZWRgIGJ1dCBub3QgYGlzRGlydHlgLAotICAgIG9yIGBpc1NhdmluZ2ApLgotCi0gICAg
RXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Nb2RlbFZpZXdSb3V0ZSA9IEVt
YmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHJlbG9hZDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5nZXQoJ21vZGVsJykucmVsb2FkKCk7Ci0gICAgICAg
IH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVsb2FkCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRo
ZSByZWNvcmQgd2hlbiB0aGUKLSAgICBhZGFwdGVyIHJldHVybnMgc3VjY2Vzc2Z1bGx5IG9yIHJl
amVjdGVkIGlmIHRoZSBhZGFwdGVyIHJldHVybnMKLSAgICB3aXRoIGFuIGVycm9yLgotICAqLwot
ICByZWxvYWQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAnaXNSZWxvYWRpbmcnLCB0cnVl
KTsKLQotICAgIHZhciAgcmVjb3JkID0gdGhpczsKLQotICAgIHZhciBwcm9taXNlTGFiZWwgPSAi
RFM6IE1vZGVsI3JlbG9hZCBvZiAiICsgdGhpczsKLSAgICB2YXIgcHJvbWlzZSA9IG5ldyBFbWJl
ci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSl7Ci0gICAgICAgcmVjb3JkLnNlbmQoJ3Jl
bG9hZFJlY29yZCcsIHJlc29sdmUpOwotICAgIH0sIHByb21pc2VMYWJlbCkudGhlbihmdW5jdGlv
bigpIHsKLSAgICAgIHJlY29yZC5zZXQoJ2lzUmVsb2FkaW5nJywgZmFsc2UpOwotICAgICAgcmVj
b3JkLnNldCgnaXNFcnJvcicsIGZhbHNlKTsKLSAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgfSwg
ZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICByZWNvcmQuc2V0KCdpc0Vycm9yJywgdHJ1ZSk7Ci0g
ICAgICB0aHJvdyByZWFzb247Ci0gICAgfSwgIkRTOiBNb2RlbCNyZWxvYWQgY29tcGxldGUsIHVw
ZGF0ZSBmbGFncyIpOwotCi0gICAgcmV0dXJuIERTLlByb21pc2VPYmplY3QuY3JlYXRlKHsgcHJv
bWlzZTogcHJvbWlzZSB9KTsKLSAgfSwKLQotICAvLyBGT1IgVVNFIERVUklORyBDT01NSVQgUFJP
Q0VTUwotCi0gIGFkYXB0ZXJEaWRVcGRhdGVBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZU5h
bWUsIHZhbHVlKSB7Ci0KLSAgICAvLyBJZiBhIHZhbHVlIGlzIHBhc3NlZCBpbiwgdXBkYXRlIHRo
ZSBpbnRlcm5hbCBhdHRyaWJ1dGVzIGFuZCBjbGVhcgotICAgIC8vIHRoZSBhdHRyaWJ1dGUgY2Fj
aGUgc28gaXQgcGlja3MgdXAgdGhlIG5ldyB2YWx1ZS4gT3RoZXJ3aXNlLAotICAgIC8vIGNvbGxh
cHNlIHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGludGVybmFsIGF0dHJpYnV0ZXMgYmVjYXVz
ZQotICAgIC8vIHRoZSBhZGFwdGVyIGhhcyBhY2tub3dsZWRnZWQgaXQuCi0gICAgaWYgKHZhbHVl
ICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFtZV0gPSB2YWx1
ZTsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoYXR0cmlidXRlTmFtZSk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHRoaXMuX2RhdGFbYXR0cmlidXRlTmFtZV0gPSB0aGlzLl9pbkZsaWdo
dEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07Ci0gICAgfQotCi0gICAgdGhpcy51cGRhdGVSZWNv
cmRBcnJheXNMYXRlcigpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgYWRhcHRlckRpZElu
dmFsaWRhdGUKLSAgICBAcHJpdmF0ZQotICAqLwotICBhZGFwdGVyRGlkSW52YWxpZGF0ZTogZnVu
Y3Rpb24oZXJyb3JzKSB7Ci0gICAgdmFyIHJlY29yZEVycm9ycyA9IGdldCh0aGlzLCAnZXJyb3Jz
Jyk7Ci0gICAgZnVuY3Rpb24gYWRkRXJyb3IobmFtZSkgewotICAgICAgaWYgKGVycm9yc1tuYW1l
XSkgewotICAgICAgICByZWNvcmRFcnJvcnMuYWRkKG5hbWUsIGVycm9yc1tuYW1lXSk7Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgdGhpcy5lYWNoQXR0cmlidXRlKGFkZEVycm9yKTsKLSAgICB0aGlz
LmVhY2hSZWxhdGlvbnNoaXAoYWRkRXJyb3IpOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2Qg
YWRhcHRlckRpZEVycm9yCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgYWRhcHRlckRpZEVycm9yOiBm
dW5jdGlvbigpIHsKLSAgICB0aGlzLnNlbmQoJ2JlY2FtZUVycm9yJyk7Ci0gICAgc2V0KHRoaXMs
ICdpc0Vycm9yJywgdHJ1ZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT3ZlcnJpZGUgdGhlIGRlZmF1
bHQgZXZlbnQgZmlyaW5nIGZyb20gRW1iZXIuRXZlbnRlZCB0bwotICAgIGFsc28gY2FsbCBtZXRo
b2RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0KLSAgICBAbWV0aG9kIHRyaWdnZXIKLSAgICBAcHJp
dmF0ZQotICAgIEBwYXJhbSBuYW1lCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICBFbWJlci50cnlJbnZva2UodGhpcywgbmFtZSwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMs
IDEpKTsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0g
IHRyaWdnZXJMYXRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX2RlZmVycmVkVHJpZ2dl
cnMucHVzaChhcmd1bWVudHMpICE9PSAxKSB7IHJldHVybjsgfQotICAgIEVtYmVyLnJ1bi5zY2hl
ZHVsZSgnYWN0aW9ucycsIHRoaXMsICdfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnMnKTsKLSAgfSwK
LQotICBfdHJpZ2dlckRlZmVycmVkVHJpZ2dlcnM6IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFy
IGk9MCwgbD10aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
IHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCB0aGlzLl9kZWZlcnJlZFRyaWdnZXJzW2ldKTsKLSAg
ICB9Ci0KLSAgICB0aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aCA9IDA7Ci0gIH0KLX0pOwot
Ci1EUy5Nb2RlbC5yZW9wZW5DbGFzcyh7Ci0KLSAgLyoqCi0gICAgQWxpYXMgRFMuTW9kZWwncyBg
Y3JlYXRlYCBtZXRob2QgdG8gYF9jcmVhdGVgLiBUaGlzIGFsbG93cyB1cyB0byBjcmVhdGUgRFMu
TW9kZWwKLSAgICBpbnN0YW5jZXMgZnJvbSB3aXRoaW4gdGhlIHN0b3JlLCBidXQgaWYgZW5kIHVz
ZXJzIGFjY2lkZW50YWxseSBjYWxsIGBjcmVhdGUoKWAKLSAgICAoaW5zdGVhZCBvZiBgY3JlYXRl
UmVjb3JkKClgKSwgd2UgY2FuIHJhaXNlIGFuIGVycm9yLgotCi0gICAgQG1ldGhvZCBfY3JlYXRl
Ci0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0gICovCi0gIF9jcmVhdGU6IERTLk1vZGVsLmNy
ZWF0ZSwKLQotICAvKioKLSAgICBPdmVycmlkZSB0aGUgY2xhc3MnIGBjcmVhdGUoKWAgbWV0aG9k
IHRvIHJhaXNlIGFuIGVycm9yLiBUaGlzCi0gICAgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gaW5h
ZHZlcnRlbnRseSBjYWxsaW5nIGBjcmVhdGUoKWAgaW5zdGVhZAotICAgIG9mIGBjcmVhdGVSZWNv
cmQoKWAuIFRoZSBzdG9yZSBpcyBzdGlsbCBhYmxlIHRvIGNyZWF0ZSBpbnN0YW5jZXMKLSAgICBi
eSBjYWxsaW5nIHRoZSBgX2NyZWF0ZSgpYCBtZXRob2QuIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBv
ZiBhCi0gICAgYERTLk1vZGVsYCB1c2UgW3N0b3JlLmNyZWF0ZVJlY29yZF0oRFMuU3RvcmUuaHRt
bCNtZXRob2RfY3JlYXRlUmVjb3JkKS4KLQotICAgIEBtZXRob2QgY3JlYXRlCi0gICAgQHByaXZh
dGUKLSAgICBAc3RhdGljCi0gICovCi0gIGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cg
bmV3IEVtYmVyLkVycm9yKCJZb3Ugc2hvdWxkIG5vdCBjYWxsIGBjcmVhdGVgIG9uIGEgbW9kZWwu
IEluc3RlYWQsIGNhbGwgYHN0b3JlLmNyZWF0ZVJlY29yZGAgd2l0aCB0aGUgYXR0cmlidXRlcyB5
b3Ugd291bGQgbGlrZSB0byBzZXQuIik7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVy
LmdldDsKLQotLyoqCi0gIEBjbGFzcyBNb2RlbAotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuTW9k
ZWwucmVvcGVuQ2xhc3MoewotICAvKioKLSAgICBBIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0
cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKLSAgICBkZXNjcmliZWQgYnkgRFMuYXR0
cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUKLSAgICBwcm9w
ZXJ0eS4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLQotICAgIEFwcC5QZXJz
b24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwK
LSAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICAgIGJpcnRoZGF5OiBhdHRyKCdk
YXRlJykKLSAgICB9KTsKLQotICAgIHZhciBhdHRyaWJ1dGVzID0gRW1iZXIuZ2V0KEFwcC5QZXJz
b24sICdhdHRyaWJ1dGVzJykKLQotICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbihuYW1l
LCBtZXRhKSB7Ci0gICAgICBjb25zb2xlLmxvZyhuYW1lLCBtZXRhKTsKLSAgICB9KTsKLQotICAg
IC8vIHByaW50czoKLSAgICAvLyBmaXJzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0
ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImZp
cnN0TmFtZSJ9Ci0gICAgLy8gbGFzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTog
dHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImxhc3RO
YW1lIn0KLSAgICAvLyBiaXJ0aGRheSB7dHlwZTogImRhdGUiLCBpc0F0dHJpYnV0ZTogdHJ1ZSwg
b3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImJpcnRoZGF5In0K
LSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBhdHRyaWJ1dGVzCi0gICAgQHN0YXRpYwotICAgIEB0
eXBlIHtFbWJlci5NYXB9Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIGF0dHJpYnV0ZXM6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7
Ci0KLSAgICB0aGlzLmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsK
LSAgICAgIGlmIChtZXRhLmlzQXR0cmlidXRlKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiWW91
IG1heSBub3Qgc2V0IGBpZGAgYXMgYW4gYXR0cmlidXRlIG9uIHlvdXIgbW9kZWwuIFBsZWFzZSBy
ZW1vdmUgYW55IGxpbmVzIHRoYXQgbG9vayBsaWtlOiBgaWQ6IERTLmF0dHIoJzx0eXBlPicpYCBm
cm9tICIgKyB0aGlzLnRvU3RyaW5nKCksIG5hbWUgIT09ICdpZCcpOwotCi0gICAgICAgIG1ldGEu
bmFtZSA9IG5hbWU7Ci0gICAgICAgIG1hcC5zZXQobmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0KLSAgICByZXR1cm4gbWFwOwotICB9KSwKLQotICAvKioKLSAgICBBIG1hcCB3aG9zZSBr
ZXlzIGFyZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKLSAgICBkZXNj
cmliZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdHlwZSBvZiB0cmFuc2Zvcm1h
dGlvbgotICAgIGFwcGxpZWQgdG8gZWFjaCBhdHRyaWJ1dGUuIFRoaXMgbWFwIGRvZXMgbm90IGlu
Y2x1ZGUgYW55Ci0gICAgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0
aW9uIHR5cGUuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBl
cnNvbiA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6IGF0dHIoKSwKLSAgICAg
IGxhc3ROYW1lOiBhdHRyKCdzdHJpbmcnKSwKLSAgICAgIGJpcnRoZGF5OiBhdHRyKCdkYXRlJykK
LSAgICB9KTsKLQotICAgIHZhciB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMgPSBFbWJlci5nZXQoQXBw
LlBlcnNvbiwgJ3RyYW5zZm9ybWVkQXR0cmlidXRlcycpCi0KLSAgICB0cmFuc2Zvcm1lZEF0dHJp
YnV0ZXMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgdHlwZSkgewotICAgICAgY29uc29sZS5sb2co
ZmllbGQsIHR5cGUpOwotICAgIH0pOwotCi0gICAgLy8gcHJpbnRzOgotICAgIC8vIGxhc3ROYW1l
IHN0cmluZwotICAgIC8vIGJpcnRoZGF5IGRhdGUKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSB0
cmFuc2Zvcm1lZEF0dHJpYnV0ZXMKLSAgICBAc3RhdGljCi0gICAgQHR5cGUge0VtYmVyLk1hcH0K
LSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgdHJhbnNmb3JtZWRBdHRyaWJ1dGVzOiBFbWJlci5jb21w
dXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0g
ICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSwgbWV0YSkgewotICAgICAgaWYgKG1l
dGEudHlwZSkgewotICAgICAgICBtYXAuc2V0KGtleSwgbWV0YS50eXBlKTsKLSAgICAgIH0KLSAg
ICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0pLAotCi0gIC8qKgotICAgIEl0ZXJhdGVzIHRo
cm91Z2ggdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG1vZGVsLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVu
Y3Rpb24gb24gZWFjaAotICAgIGF0dHJpYnV0ZS4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg
eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAg
IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5j
dGlvbihuYW1lLCBtZXRhKTsKLSAgICBgYGAKLQotICAgIC0gYG5hbWVgIHRoZSBuYW1lIG9mIHRo
ZSBjdXJyZW50IHByb3BlcnR5IGluIHRoZSBpdGVyYXRpb24KLSAgICAtIGBtZXRhYCB0aGUgbWV0
YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgcHJvcGVydHkgaW4gdGhlIGl0ZXJhdGlvbgotCi0g
ICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNz
IGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlz
YCBvbiB0aGUgY29udGV4dC4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIGZpcnN0TmFtZTogYXR0cign
c3RyaW5nJyksCi0gICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRh
eTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAgICBBcHAuUGVyc29uLmVhY2hBdHRyaWJ1dGUo
ZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgY29uc29sZS5sb2cobmFtZSwgbWV0YSk7Ci0g
ICAgfSk7Ci0KLSAgICAvLyBwcmludHM6Ci0gICAgLy8gZmlyc3ROYW1lIHt0eXBlOiAic3RyaW5n
IiwgaXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rp
b24sIG5hbWU6ICJmaXJzdE5hbWUifQotICAgIC8vIGxhc3ROYW1lIHt0eXBlOiAic3RyaW5nIiwg
aXNBdHRyaWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24s
IG5hbWU6ICJsYXN0TmFtZSJ9Ci0gICAgLy8gYmlydGhkYXkge3R5cGU6ICJkYXRlIiwgaXNBdHRy
aWJ1dGU6IHRydWUsIG9wdGlvbnM6IE9iamVjdCwgcGFyZW50VHlwZTogZnVuY3Rpb24sIG5hbWU6
ICJiaXJ0aGRheSJ9Ci0gICBgYGAKLQotICAgIEBtZXRob2QgZWFjaEF0dHJpYnV0ZQotICAgIEBw
YXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBh
cmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEBzdGF0
aWMKLSAgKi8KLSAgZWFjaEF0dHJpYnV0ZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsK
LSAgICBnZXQodGhpcywgJ2F0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIG1ldGEp
IHsKLSAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgbWV0YSk7Ci0gICAgfSwgYmlu
ZGluZyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdHJhbnNmb3Jt
ZWRBdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCwgY2FsbGluZwotICAgIHRoZSBwYXNzZWQgZnVuY3Rp
b24gb24gZWFjaCBhdHRyaWJ1dGUuIE5vdGUgdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlCi0gICAg
Y2FsbGVkIGZvciBhbnkgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0
aW9uIHR5cGUuCi0KLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRp
b25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24obmFtZSwgdHlwZSk7Ci0g
ICAgYGBgCi0KLSAgICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBp
biB0aGUgaXRlcmF0aW9uCi0gICAgLSBgdHlwZWAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFt
ZSBvZiB0aGUgdHlwZSBvZiB0cmFuc2Zvcm1lZAotICAgICAgYXBwbGllZCB0byB0aGUgYXR0cmli
dXRlCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBh
bHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQg
YXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgZmlyc3ROYW1l
OiBhdHRyKCksCi0gICAgICBsYXN0TmFtZTogYXR0cignc3RyaW5nJyksCi0gICAgICBiaXJ0aGRh
eTogYXR0cignZGF0ZScpCi0gICAgfSk7Ci0KLSAgICBBcHAuUGVyc29uLmVhY2hUcmFuc2Zvcm1l
ZEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lLCB0eXBlKSB7Ci0gICAgICBjb25zb2xlLmxvZyhuYW1l
LCB0eXBlKTsKLSAgICB9KTsKLQotICAgIC8vIHByaW50czoKLSAgICAvLyBsYXN0TmFtZSBzdHJp
bmcKLSAgICAvLyBiaXJ0aGRheSBkYXRlCi0gICBgYGAKLQotICAgIEBtZXRob2QgZWFjaFRyYW5z
Zm9ybWVkQXR0cmlidXRlCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxi
YWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBv
YmplY3QgdG8gdXNlCi0gICAgQHN0YXRpYwotICAqLwotICBlYWNoVHJhbnNmb3JtZWRBdHRyaWJ1
dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgZ2V0KHRoaXMsICd0cmFuc2Zv
cm1lZEF0dHJpYnV0ZXMnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKLSAgICAgIGNh
bGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgdHlwZSk7Ci0gICAgfSk7Ci0gIH0KLX0pOwotCi0K
LURTLk1vZGVsLnJlb3Blbih7Ci0gIGVhY2hBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBi
aW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoQXR0cmlidXRlKGNhbGxiYWNrLCBi
aW5kaW5nKTsKLSAgfQotfSk7Ci0KLWZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShyZWNvcmQsIG9w
dGlvbnMsIGtleSkgewotICBpZiAodHlwZW9mIG9wdGlvbnMuZGVmYXVsdFZhbHVlID09PSAiZnVu
Y3Rpb24iKSB7Ci0gICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlKCk7Ci0gIH0gZWxzZSB7
Ci0gICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGhh
c1ZhbHVlKHJlY29yZCwga2V5KSB7Ci0gIHJldHVybiByZWNvcmQuX2F0dHJpYnV0ZXMuaGFzT3du
UHJvcGVydHkoa2V5KSB8fAotICAgICAgICAgcmVjb3JkLl9pbkZsaWdodEF0dHJpYnV0ZXMuaGFz
T3duUHJvcGVydHkoa2V5KSB8fAotICAgICAgICAgcmVjb3JkLl9kYXRhLmhhc093blByb3BlcnR5
KGtleSk7Ci19Ci0KLWZ1bmN0aW9uIGdldFZhbHVlKHJlY29yZCwga2V5KSB7Ci0gIGlmIChyZWNv
cmQuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewotICAgIHJldHVybiByZWNvcmQu
X2F0dHJpYnV0ZXNba2V5XTsKLSAgfSBlbHNlIGlmIChyZWNvcmQuX2luRmxpZ2h0QXR0cmlidXRl
cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgcmV0dXJuIHJlY29yZC5faW5GbGlnaHRBdHRy
aWJ1dGVzW2tleV07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlY29yZC5fZGF0YVtrZXldOwot
ICB9Ci19Ci0KLS8qKgotICBgRFMuYXR0cmAgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgb24gYSBbRFMu
TW9kZWxdKERTLk1vZGVsLmh0bWwpLgotICBCeSBkZWZhdWx0LCBhdHRyaWJ1dGVzIGFyZSBwYXNz
ZWQgdGhyb3VnaCBhcy1pcywgaG93ZXZlciB5b3UgY2FuIHNwZWNpZnkgYW4KLSAgb3B0aW9uYWwg
dHlwZSB0byBoYXZlIHRoZSB2YWx1ZSBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkLgotICBFbWJl
ciBEYXRhIHNoaXBzIHdpdGggZm91ciBiYXNpYyB0cmFuc2Zvcm0gdHlwZXM6IGBzdHJpbmdgLCBg
bnVtYmVyYCwKLSAgYGJvb2xlYW5gIGFuZCBgZGF0ZWAuIFlvdSBjYW4gZGVmaW5lIHlvdXIgb3du
IHRyYW5zZm9ybXMgYnkgc3ViY2xhc3NpbmcKLSAgW0RTLlRyYW5zZm9ybV0oRFMuVHJhbnNmb3Jt
Lmh0bWwpLgotCi0gIGBEUy5hdHRyYCB0YWtlcyBhbiBvcHRpb25hbCBoYXNoIGFzIGEgc2Vjb25k
IHBhcmFtZXRlciwgY3VycmVudGx5Ci0gIHN1cHBvcnRlZCBvcHRpb25zIGFyZToKLQotICAtIGBk
ZWZhdWx0VmFsdWVgOiBQYXNzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRv
IHNldCB0aGUgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIHRvIGEgZGVmYXVsdCB2YWx1
ZSBpZiBub25lIGlzIHN1cHBsaWVkLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IHZhciBhdHRyID0gRFMuYXR0cjsKLQotICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgdXNlcm5hbWU6IGF0dHIoJ3N0cmluZycpLAotICAgIGVtYWlsOiBhdHRyKCdzdHJpbmcnKSwK
LSAgICB2ZXJpZmllZDogYXR0cignYm9vbGVhbicsIHtkZWZhdWx0VmFsdWU6IGZhbHNlfSkKLSAg
fSk7Ci0gIGBgYAotCi0gIEBuYW1lc3BhY2UKLSAgQG1ldGhvZCBhdHRyCi0gIEBmb3IgRFMKLSAg
QHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIGF0dHJpYnV0ZSB0eXBlCi0gIEBwYXJhbSB7T2JqZWN0
fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCi0gIEByZXR1cm4ge0F0dHJpYnV0ZX0KLSovCi0K
LURTLmF0dHIgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25z
IHx8IHt9OwotCi0gIHZhciBtZXRhID0gewotICAgIHR5cGU6IHR5cGUsCi0gICAgaXNBdHRyaWJ1
dGU6IHRydWUsCi0gICAgb3B0aW9uczogb3B0aW9ucwotICB9OwotCi0gIHJldHVybiBFbWJlci5j
b21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PiAxKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkgbm90IHNldCBgaWRgIGFzIGFuIGF0
dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2UgcmVtb3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sg
bGlrZTogYGlkOiBEUy5hdHRyKCc8dHlwZT4nKWAgZnJvbSAiICsgdGhpcy5jb25zdHJ1Y3Rvci50
b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOwotICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fYXR0
cmlidXRlc1trZXldIHx8IHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlc1trZXldIHx8IHRoaXMuX2Rh
dGFba2V5XTsKLQotICAgICAgdGhpcy5zZW5kKCdkaWRTZXRQcm9wZXJ0eScsIHsKLSAgICAgICAg
bmFtZToga2V5LAotICAgICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsCi0gICAgICAgIG9yaWdpbmFs
VmFsdWU6IHRoaXMuX2RhdGFba2V5XSwKLSAgICAgICAgdmFsdWU6IHZhbHVlCi0gICAgICB9KTsK
LQotICAgICAgdGhpcy5fYXR0cmlidXRlc1trZXldID0gdmFsdWU7Ci0gICAgICByZXR1cm4gdmFs
dWU7Ci0gICAgfSBlbHNlIGlmIChoYXNWYWx1ZSh0aGlzLCBrZXkpKSB7Ci0gICAgICByZXR1cm4g
Z2V0VmFsdWUodGhpcywga2V5KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldERlZmF1
bHRWYWx1ZSh0aGlzLCBvcHRpb25zLCBrZXkpOwotICAgIH0KLQotICAvLyBgZGF0YWAgaXMgbmV2
ZXIgc2V0IGRpcmVjdGx5LiBIb3dldmVyLCBpdCBtYXkgYmUKLSAgLy8gaW52YWxpZGF0ZWQgZnJv
bSB0aGUgc3RhdGUgbWFuYWdlcidzIHNldERhdGEKLSAgLy8gZXZlbnQuCi0gIH0pLnByb3BlcnR5
KCdkYXRhJykubWV0YShtZXRhKTsKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi0vKioKLSAgQW4gQXR0cmlidXRl
Q2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHdoZW5ldmVyIGEgcmVjb3JkJ3MKLSAgYXR0cmlidXRl
IGNoYW5nZXMgdmFsdWUuIEl0IGlzIHVzZWQgdG8gdHJhY2sgY2hhbmdlcyB0byBhCi0gIHJlY29y
ZCBiZXR3ZWVuIHRyYW5zYWN0aW9uIGNvbW1pdHMuCi0KLSAgQGNsYXNzIEF0dHJpYnV0ZUNoYW5n
ZQotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRlCi0gIEBjb25zdHJ1Y3RvcgotKi8KLXZhciBB
dHRyaWJ1dGVDaGFuZ2UgPSBEUy5BdHRyaWJ1dGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7
Ci0gIHRoaXMucmVjb3JkID0gb3B0aW9ucy5yZWNvcmQ7Ci0gIHRoaXMuc3RvcmUgPSBvcHRpb25z
LnN0b3JlOwotICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7Ci0gIHRoaXMudmFsdWUgPSBvcHRp
b25zLnZhbHVlOwotICB0aGlzLm9sZFZhbHVlID0gb3B0aW9ucy5vbGRWYWx1ZTsKLX07Ci0KLUF0
dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHJldHVy
biBuZXcgQXR0cmlidXRlQ2hhbmdlKG9wdGlvbnMpOwotfTsKLQotQXR0cmlidXRlQ2hhbmdlLnBy
b3RvdHlwZSA9IHsKLSAgc3luYzogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMudmFsdWUgIT09
IHRoaXMub2xkVmFsdWUpIHsKLSAgICAgIHRoaXMucmVjb3JkLnNlbmQoJ2JlY29tZURpcnR5Jyk7
Ci0gICAgICB0aGlzLnJlY29yZC51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwotICAgIH0KLQot
ICAgIC8vIFRPRE86IFVzZSB0aGlzIG9iamVjdCBpbiB0aGUgY29tbWl0IHByb2Nlc3MKLSAgICB0
aGlzLmRlc3Ryb3koKTsKLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGUgQXR0cmlidXRlQ2hhbmdl
IGlzIGRlc3Ryb3llZCAoZWl0aGVyIGJ5IGJlaW5nIHJvbGxlZCBiYWNrCi0gICAgb3IgYmVpbmcg
Y29tbWl0dGVkKSwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgcGVuZGluZyBjaGFuZ2VzCi0g
ICAgb24gdGhlIHJlY29yZC4KLQotICAgIEBtZXRob2QgZGVzdHJveQotICAqLwotICBkZXN0cm95
OiBmdW5jdGlvbigpIHsKLSAgICBkZWxldGUgdGhpcy5yZWNvcmQuX2NoYW5nZXNUb1N5bmNbdGhp
cy5uYW1lXTsKLSAgfQotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBA
bW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci0KLS8q
KgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlCi0gIEBuYW1lc3BhY2UgRFMKLSAgQHByaXZh
dGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlID0gZnVuY3Rpb24o
b3B0aW9ucykgewotICB0aGlzLnBhcmVudFJlY29yZCA9IG9wdGlvbnMucGFyZW50UmVjb3JkOwot
ICB0aGlzLmNoaWxkUmVjb3JkID0gb3B0aW9ucy5jaGlsZFJlY29yZDsKLSAgdGhpcy5maXJzdFJl
Y29yZCA9IG9wdGlvbnMuZmlyc3RSZWNvcmQ7Ci0gIHRoaXMuZmlyc3RSZWNvcmRLaW5kID0gb3B0
aW9ucy5maXJzdFJlY29yZEtpbmQ7Ci0gIHRoaXMuZmlyc3RSZWNvcmROYW1lID0gb3B0aW9ucy5m
aXJzdFJlY29yZE5hbWU7Ci0gIHRoaXMuc2Vjb25kUmVjb3JkID0gb3B0aW9ucy5zZWNvbmRSZWNv
cmQ7Ci0gIHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9IG9wdGlvbnMuc2Vjb25kUmVjb3JkS2luZDsK
LSAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gb3B0aW9ucy5zZWNvbmRSZWNvcmROYW1lOwotICB0
aGlzLmNoYW5nZVR5cGUgPSBvcHRpb25zLmNoYW5nZVR5cGU7Ci0gIHRoaXMuc3RvcmUgPSBvcHRp
b25zLnN0b3JlOwotCi0gIHRoaXMuY29tbWl0dGVkID0ge307Ci19OwotCi0vKioKLSAgQGNsYXNz
IFJlbGF0aW9uc2hpcENoYW5nZUFkZAotICBAbmFtZXNwYWNlIERTCi0gIEBwcml2YXRlCi0gIEBj
b25zdHJ1Y3RvcgotKi8KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFkZCA9IGZ1bmN0aW9uKG9wdGlv
bnMpewotICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuY2FsbCh0aGlzLCBvcHRpb25zKTsKLX07Ci0K
LS8qKgotICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlCi0gIEBuYW1lc3BhY2UgRFMK
LSAgQHByaXZhdGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVt
b3ZlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIERTLlJlbGF0aW9uc2hpcENoYW5nZS5jYWxsKHRo
aXMsIG9wdGlvbnMpOwotfTsKLQotRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZSA9IGZ1bmN0
aW9uKG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBEUy5SZWxhdGlvbnNoaXBDaGFuZ2Uob3B0aW9u
cyk7Ci19OwotCi1EUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlID0gZnVuY3Rpb24ob3B0
aW9ucykgewotICByZXR1cm4gbmV3IERTLlJlbGF0aW9uc2hpcENoYW5nZUFkZChvcHRpb25zKTsK
LX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRp
b25zKSB7Ci0gIHJldHVybiBuZXcgRFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlKG9wdGlvbnMp
OwotfTsKLQotRFMuT25lVG9NYW55Q2hhbmdlID0ge307Ci1EUy5PbmVUb05vbmVDaGFuZ2UgPSB7
fTsKLURTLk1hbnlUb05vbmVDaGFuZ2UgPSB7fTsKLURTLk9uZVRvT25lQ2hhbmdlID0ge307Ci1E
Uy5NYW55VG9NYW55Q2hhbmdlID0ge307Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRl
Q2hhbmdlID0gZnVuY3Rpb24ob3B0aW9ucyl7Ci0gIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0g
ImFkZCIpewotICAgIHJldHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQuY3JlYXRlKG9wdGlv
bnMpOwotICB9Ci0gIGlmKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gInJlbW92ZSIpewotICAgIHJl
dHVybiBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmUuY3JlYXRlKG9wdGlvbnMpOwotICB9Ci19
OwotCi0KLURTLlJlbGF0aW9uc2hpcENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlID0g
ZnVuY3Rpb24ocmVjb3JkVHlwZSwga25vd25TaWRlKXsKLSAgdmFyIGtub3duS2V5ID0ga25vd25T
aWRlLmtleSwga2V5LCBvdGhlcktpbmQ7Ci0gIHZhciBrbm93bktpbmQgPSBrbm93blNpZGUua2lu
ZDsKLQotICB2YXIgaW52ZXJzZSA9IHJlY29yZFR5cGUuaW52ZXJzZUZvcihrbm93bktleSk7Ci0K
LSAgaWYgKGludmVyc2UpewotICAgIGtleSA9IGludmVyc2UubmFtZTsKLSAgICBvdGhlcktpbmQg
PSBpbnZlcnNlLmtpbmQ7Ci0gIH0KLQotICBpZiAoIWludmVyc2UpewotICAgIHJldHVybiBrbm93
bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvTm9uZSIgOiAibWFueVRvTm9uZSI7Ci0gIH0K
LSAgZWxzZXsKLSAgICBpZihvdGhlcktpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIHJldHVy
biBrbm93bktpbmQgPT09ICJiZWxvbmdzVG8iID8gIm9uZVRvT25lIiA6ICJtYW55VG9PbmUiOwot
ICAgIH0KLSAgICBlbHNlewotICAgICAgcmV0dXJuIGtub3duS2luZCA9PT0gImJlbG9uZ3NUbyIg
PyAib25lVG9NYW55IiA6ICJtYW55VG9NYW55IjsKLSAgICB9Ci0gIH0KLQotfTsKLQotRFMuUmVs
YXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9uKGZpcnN0UmVjb3JkLCBzZWNv
bmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKXsKLSAgLy8gR2V0IHRoZSB0eXBlIG9mIHRoZSBjaGls
ZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKLSAgdmFyIGZpcnN0UmVjb3JkVHlwZSA9
IGZpcnN0UmVjb3JkLmNvbnN0cnVjdG9yLCBjaGFuZ2VUeXBlOwotICBjaGFuZ2VUeXBlID0gRFMu
UmVsYXRpb25zaGlwQ2hhbmdlLmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUoZmlyc3RSZWNvcmRU
eXBlLCBvcHRpb25zKTsKLSAgaWYgKGNoYW5nZVR5cGUgPT09ICJvbmVUb01hbnkiKXsKLSAgICBy
ZXR1cm4gRFMuT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25k
UmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7Ci0gIH0KLSAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0g
Im1hbnlUb09uZSIpewotICAgIHJldHVybiBEUy5PbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdl
KHNlY29uZFJlY29yZCwgZmlyc3RSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNl
IGlmIChjaGFuZ2VUeXBlID09PSAib25lVG9Ob25lIil7Ci0gICAgcmV0dXJuIERTLk9uZVRvTm9u
ZUNoYW5nZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmQsIHNlY29uZFJlY29yZCwgc3RvcmUsIG9w
dGlvbnMpOwotICB9Ci0gIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICJtYW55VG9Ob25lIil7Ci0g
ICAgcmV0dXJuIERTLk1hbnlUb05vbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBz
ZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBlbHNlIGlmIChjaGFuZ2VUeXBl
ID09PSAib25lVG9PbmUiKXsKLSAgICByZXR1cm4gRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hh
bmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKLSAgfQotICBl
bHNlIGlmIChjaGFuZ2VUeXBlID09PSAibWFueVRvTWFueSIpewotICAgIHJldHVybiBEUy5NYW55
VG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwgc2Vjb25kUmVjb3JkLCBzdG9y
ZSwgb3B0aW9ucyk7Ci0gIH0KLX07Ci0KLURTLk9uZVRvTm9uZUNoYW5nZS5jcmVhdGVDaGFuZ2Ug
PSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50UmVjb3JkLCBzdG9yZSwgb3B0aW9ucykgewot
ICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7Ci0gIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBD
aGFuZ2UuX2NyZWF0ZUNoYW5nZSh7Ci0gICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwK
LSAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkOiBjaGls
ZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMu
Y2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0UmVjb3JkTmFtZToga2V5LAotICAgICAgZmlyc3RSZWNv
cmRLaW5kOiAiYmVsb25nc1RvIgotICB9KTsKLQotICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFu
Z2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBudWxsLCBjaGFuZ2UpOwotCi0g
IHJldHVybiBjaGFuZ2U7Ci19OwotCi1EUy5NYW55VG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9
IGZ1bmN0aW9uKGNoaWxkUmVjb3JkLCBwYXJlbnRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKSB7Ci0g
IHZhciBrZXkgPSBvcHRpb25zLmtleTsKLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENo
YW5nZS5fY3JlYXRlQ2hhbmdlKHsKLSAgICAgIHBhcmVudFJlY29yZDogY2hpbGRSZWNvcmQsCi0g
ICAgICBjaGlsZFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgc2Vjb25kUmVjb3JkOiBjaGls
ZFJlY29yZCwKLSAgICAgIHN0b3JlOiBzdG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMu
Y2hhbmdlVHlwZSwKLSAgICAgIHNlY29uZFJlY29yZE5hbWU6IG9wdGlvbnMua2V5LAotICAgICAg
c2Vjb25kUmVjb3JkS2luZDogImhhc01hbnkiCi0gIH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9u
c2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5n
ZSk7Ci0gIHJldHVybiBjaGFuZ2U7Ci19OwotCi0KLURTLk1hbnlUb01hbnlDaGFuZ2UuY3JlYXRl
Q2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlv
bnMpIHsKLSAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRlIG9mIHRoZSByZWxh
dGlvbnNoaXAgaXMgc3BlY2lmaWVkLAotICAvLyB1c2UgdGhhdAotICAvLyBJZiB0aGUgdHlwZSBv
ZiB0aGUgcGFyZW50IGlzIHNwZWNpZmllZCwgbG9vayBpdCB1cCBvbiB0aGUgY2hpbGQncyB0eXBl
Ci0gIC8vIGRlZmluaXRpb24uCi0gIHZhciBrZXkgPSBvcHRpb25zLmtleTsKLQotICB2YXIgY2hh
bmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2UoewotICAgICAgcGFyZW50
UmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBjaGlsZFJlY29yZDogY2hpbGRSZWNvcmQsCi0g
ICAgICBmaXJzdFJlY29yZDogY2hpbGRSZWNvcmQsCi0gICAgICBzZWNvbmRSZWNvcmQ6IHBhcmVu
dFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkS2luZDogImhhc01hbnkiLAotICAgICAgc2Vjb25k
UmVjb3JkS2luZDogImhhc01hbnkiLAotICAgICAgc3RvcmU6IHN0b3JlLAotICAgICAgY2hhbmdl
VHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAotICAgICAgZmlyc3RSZWNvcmROYW1lOiAga2V5Ci0g
IH0pOwotCi0gIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5
LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7Ci0KLQotICByZXR1cm4gY2hhbmdlOwotfTsK
LQotRFMuT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQs
IHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKLSAgdmFyIGtleTsKLQotICAvLyBJZiB0
aGUgbmFtZSBvZiB0aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVj
aWZpZWQsCi0gIC8vIHVzZSB0aGF0Ci0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMg
c3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKLSAgLy8gZGVmaW5pdGlv
bi4KLSAgaWYgKG9wdGlvbnMucGFyZW50VHlwZSkgewotICAgIGtleSA9IG9wdGlvbnMucGFyZW50
VHlwZS5pbnZlcnNlRm9yKG9wdGlvbnMua2V5KS5uYW1lOwotICB9IGVsc2UgaWYgKG9wdGlvbnMu
a2V5KSB7Ci0gICAga2V5ID0gb3B0aW9ucy5rZXk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHBhcmVudFR5cGUgb3IgYmVsb25nc1RvTmFtZSBv
cHRpb24gdG8gT25lVG9NYW55Q2hhbmdlLmZvckNoaWxkQW5kUGFyZW50IiwgZmFsc2UpOwotICB9
Ci0KLSAgdmFyIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsK
LSAgICAgIHBhcmVudFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgY2hpbGRSZWNvcmQ6IGNo
aWxkUmVjb3JkLAotICAgICAgZmlyc3RSZWNvcmQ6IGNoaWxkUmVjb3JkLAotICAgICAgc2Vjb25k
UmVjb3JkOiBwYXJlbnRSZWNvcmQsCi0gICAgICBmaXJzdFJlY29yZEtpbmQ6ICJiZWxvbmdzVG8i
LAotICAgICAgc2Vjb25kUmVjb3JkS2luZDogImJlbG9uZ3NUbyIsCi0gICAgICBzdG9yZTogc3Rv
cmUsCi0gICAgICBjaGFuZ2VUeXBlOiBvcHRpb25zLmNoYW5nZVR5cGUsCi0gICAgICBmaXJzdFJl
Y29yZE5hbWU6ICBrZXkKLSAgfSk7Ci0KLSAgc3RvcmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9y
KGNoaWxkUmVjb3JkLCBrZXksIHBhcmVudFJlY29yZCwgbnVsbCwgY2hhbmdlKTsKLQotCi0gIHJl
dHVybiBjaGFuZ2U7Ci19OwotCi1EUy5PbmVUb09uZUNoYW5nZS5tYWludGFpbkludmFyaWFudCA9
IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlY29yZCwga2V5KXsKLSAgaWYgKG9wdGlv
bnMuY2hhbmdlVHlwZSA9PT0gImFkZCIgJiYgc3RvcmUucmVjb3JkSXNNYXRlcmlhbGl6ZWQoY2hp
bGRSZWNvcmQpKSB7Ci0gICAgdmFyIG9sZFBhcmVudCA9IGdldChjaGlsZFJlY29yZCwga2V5KTsK
LSAgICBpZiAob2xkUGFyZW50KXsKLSAgICAgIHZhciBjb3JyZXNwb25kaW5nQ2hhbmdlID0gRFMu
T25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNoaWxkUmVjb3JkLCBvbGRQYXJlbnQsIHN0b3Jl
LCB7Ci0gICAgICAgICAgcGFyZW50VHlwZTogb3B0aW9ucy5wYXJlbnRUeXBlLAotICAgICAgICAg
IGhhc01hbnlOYW1lOiBvcHRpb25zLmhhc01hbnlOYW1lLAotICAgICAgICAgIGNoYW5nZVR5cGU6
ICJyZW1vdmUiLAotICAgICAgICAgIGtleTogb3B0aW9ucy5rZXkKLSAgICAgICAgfSk7Ci0gICAg
ICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgb3B0aW9u
cy5wYXJlbnRSZWNvcmQgLCBudWxsLCBjb3JyZXNwb25kaW5nQ2hhbmdlKTsKLSAgICAgY29ycmVz
cG9uZGluZ0NoYW5nZS5zeW5jKCk7Ci0gICAgfQotICB9Ci19OwotCi1EUy5PbmVUb01hbnlDaGFu
Z2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3Rv
cmUsIG9wdGlvbnMpIHsKLSAgdmFyIGtleTsKLQotICAvLyBJZiB0aGUgbmFtZSBvZiB0aGUgYmVs
b25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVjaWZpZWQsCi0gIC8vIHVzZSB0
aGF0Ci0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0
IHVwIG9uIHRoZSBjaGlsZCdzIHR5cGUKLSAgLy8gZGVmaW5pdGlvbi4KLSAgaWYgKG9wdGlvbnMu
cGFyZW50VHlwZSkgewotICAgIGtleSA9IG9wdGlvbnMucGFyZW50VHlwZS5pbnZlcnNlRm9yKG9w
dGlvbnMua2V5KS5uYW1lOwotICAgIERTLk9uZVRvTWFueUNoYW5nZS5tYWludGFpbkludmFyaWFu
dCggb3B0aW9ucywgc3RvcmUsIGNoaWxkUmVjb3JkLCBrZXkgKTsKLSAgfSBlbHNlIGlmIChvcHRp
b25zLmtleSkgewotICAgIGtleSA9IG9wdGlvbnMua2V5OwotICB9IGVsc2UgewotICAgIEVtYmVy
LmFzc2VydCgiWW91IG11c3QgcGFzcyBlaXRoZXIgYSBwYXJlbnRUeXBlIG9yIGJlbG9uZ3NUb05h
bWUgb3B0aW9uIHRvIE9uZVRvTWFueUNoYW5nZS5mb3JDaGlsZEFuZFBhcmVudCIsIGZhbHNlKTsK
LSAgfQotCi0gIHZhciBjaGFuZ2UgPSBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5n
ZSh7Ci0gICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwKLSAgICAgIGNoaWxkUmVjb3Jk
OiBjaGlsZFJlY29yZCwKLSAgICAgIGZpcnN0UmVjb3JkOiBjaGlsZFJlY29yZCwKLSAgICAgIHNl
Y29uZFJlY29yZDogcGFyZW50UmVjb3JkLAotICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVsb25n
c1RvIiwKLSAgICAgIHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKLSAgICAgIHN0b3JlOiBz
dG9yZSwKLSAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKLSAgICAgIGZpcnN0
UmVjb3JkTmFtZTogIGtleQotICB9KTsKLQotICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VG
b3IoY2hpbGRSZWNvcmQsIGtleSwgcGFyZW50UmVjb3JkLCBjaGFuZ2UuZ2V0U2Vjb25kUmVjb3Jk
TmFtZSgpLCBjaGFuZ2UpOwotCi0KLSAgcmV0dXJuIGNoYW5nZTsKLX07Ci0KLQotRFMuT25lVG9N
YW55Q2hhbmdlLm1haW50YWluSW52YXJpYW50ID0gZnVuY3Rpb24ob3B0aW9ucywgc3RvcmUsIGNo
aWxkUmVjb3JkLCBrZXkpewotICBpZiAob3B0aW9ucy5jaGFuZ2VUeXBlID09PSAiYWRkIiAmJiBj
aGlsZFJlY29yZCkgewotICAgIHZhciBvbGRQYXJlbnQgPSBnZXQoY2hpbGRSZWNvcmQsIGtleSk7
Ci0gICAgaWYgKG9sZFBhcmVudCl7Ci0gICAgICB2YXIgY29ycmVzcG9uZGluZ0NoYW5nZSA9IERT
Lk9uZVRvTWFueUNoYW5nZS5jcmVhdGVDaGFuZ2UoY2hpbGRSZWNvcmQsIG9sZFBhcmVudCwgc3Rv
cmUsIHsKLSAgICAgICAgICBwYXJlbnRUeXBlOiBvcHRpb25zLnBhcmVudFR5cGUsCi0gICAgICAg
ICAgaGFzTWFueU5hbWU6IG9wdGlvbnMuaGFzTWFueU5hbWUsCi0gICAgICAgICAgY2hhbmdlVHlw
ZTogInJlbW92ZSIsCi0gICAgICAgICAga2V5OiBvcHRpb25zLmtleQotICAgICAgICB9KTsKLSAg
ICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBvcHRp
b25zLnBhcmVudFJlY29yZCwgY29ycmVzcG9uZGluZ0NoYW5nZS5nZXRTZWNvbmRSZWNvcmROYW1l
KCksIGNvcnJlc3BvbmRpbmdDaGFuZ2UpOwotICAgICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5j
KCk7Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZQot
ICBAbmFtZXNwYWNlIERTCi0qLwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlLnByb3RvdHlwZSA9IHsK
LQotICBnZXRTZWNvbmRSZWNvcmROYW1lOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZSA9IHRo
aXMuc2Vjb25kUmVjb3JkTmFtZSwgcGFyZW50OwotCi0gICAgaWYgKCFuYW1lKSB7Ci0gICAgICBw
YXJlbnQgPSB0aGlzLnNlY29uZFJlY29yZDsKLSAgICAgIGlmICghcGFyZW50KSB7IHJldHVybjsg
fQotCi0gICAgICB2YXIgY2hpbGRUeXBlID0gdGhpcy5maXJzdFJlY29yZC5jb25zdHJ1Y3RvcjsK
LSAgICAgIHZhciBpbnZlcnNlID0gY2hpbGRUeXBlLmludmVyc2VGb3IodGhpcy5maXJzdFJlY29y
ZE5hbWUpOwotICAgICAgdGhpcy5zZWNvbmRSZWNvcmROYW1lID0gaW52ZXJzZS5uYW1lOwotICAg
IH0KLQotICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZE5hbWU7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgR2V0IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgb24gdGhlIGJlbG9uZ3NUbyBzaWRl
LgotCi0gICAgQG1ldGhvZCBnZXRGaXJzdFJlY29yZE5hbWUKLSAgICBAcmV0dXJuIHtTdHJpbmd9
Ci0gICovCi0gIGdldEZpcnN0UmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWUg
PSB0aGlzLmZpcnN0UmVjb3JkTmFtZTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfSwKLQotICAvKioK
LSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAgICBAcHJpdmF0ZQotICAqLwotICBkZXN0cm95OiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgY2hpbGRSZWNvcmQgPSB0aGlzLmNoaWxkUmVjb3JkLAotICAgICAg
ICBiZWxvbmdzVG9OYW1lID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwKLSAgICAgICAgaGFz
TWFueU5hbWUgPSB0aGlzLmdldFNlY29uZFJlY29yZE5hbWUoKSwKLSAgICAgICAgc3RvcmUgPSB0
aGlzLnN0b3JlOwotCi0gICAgc3RvcmUucmVtb3ZlUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxk
UmVjb3JkLCBiZWxvbmdzVG9OYW1lLCB0aGlzLnBhcmVudFJlY29yZCwgaGFzTWFueU5hbWUsIHRo
aXMuY2hhbmdlVHlwZSk7Ci0gIH0sCi0KLSAgZ2V0U2Vjb25kUmVjb3JkOiBmdW5jdGlvbigpewot
ICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZDsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IGdldEZpcnN0UmVjb3JkCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgZ2V0Rmlyc3RSZWNvcmQ6IGZ1
bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmZpcnN0UmVjb3JkOwotICB9LAotCi0gIGNvYWxl
c2NlOiBmdW5jdGlvbigpewotICAgIHZhciByZWxhdGlvbnNoaXBQYWlycyA9IHRoaXMuc3RvcmUu
cmVsYXRpb25zaGlwQ2hhbmdlUGFpcnNGb3IodGhpcy5maXJzdFJlY29yZCk7Ci0gICAgZm9yRWFj
aChyZWxhdGlvbnNoaXBQYWlycywgZnVuY3Rpb24ocGFpcil7Ci0gICAgICB2YXIgYWRkZWRDaGFu
Z2UgPSBwYWlyWyJhZGQiXTsKLSAgICAgIHZhciByZW1vdmVkQ2hhbmdlID0gcGFpclsicmVtb3Zl
Il07Ci0gICAgICBpZihhZGRlZENoYW5nZSAmJiByZW1vdmVkQ2hhbmdlKSB7Ci0gICAgICAgIGFk
ZGVkQ2hhbmdlLmRlc3Ryb3koKTsKLSAgICAgICAgcmVtb3ZlZENoYW5nZS5kZXN0cm95KCk7Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFkZC5wcm90
b3R5cGUgPSBFbWJlci5jcmVhdGUoRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZSh7fSkpOwot
RFMuUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShEUy5S
ZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlKHt9KSk7Ci0KLS8vIHRoZSBvYmplY3QgaXMgYSB2YWx1
ZSwgYW5kIG5vdCBhIHByb21pc2UKLWZ1bmN0aW9uIGlzVmFsdWUob2JqZWN0KSB7Ci0gIHJldHVy
biB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiAoIW9iamVjdC50aGVuIHx8IHR5cGVvZiBv
YmplY3QudGhlbiAhPT0gJ2Z1bmN0aW9uJyk7Ci19Ci0KLURTLlJlbGF0aW9uc2hpcENoYW5nZUFk
ZC5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJhZGQiOwotRFMuUmVsYXRpb25zaGlwQ2hhbmdlQWRk
LnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBzZWNvbmRSZWNvcmROYW1lID0g
dGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBmaXJzdFJlY29yZE5hbWUgPSB0aGlz
LmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RSZWNvcmQgPSB0aGlzLmdldEZpcnN0
UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlzLmdldFNlY29uZFJlY29yZCgpOwot
Ci0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlO
YW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVu
dCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lm
eSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NU
b05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiAr
IGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1dCBkaWQg
bm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChu
ZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0
b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgaWYgKHNlY29uZFJlY29yZCBpbnN0YW5jZW9mIERTLk1v
ZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9kZWwpIHsKLSAgICBpZih0aGlzLnNl
Y29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAgICAgIHNlY29uZFJlY29yZC5zdXNw
ZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7Ci0gICAgICAgIHNldChzZWNvbmRS
ZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIGZpcnN0UmVjb3JkKTsKLSAgICAgIH0pOwotCi0gICAg
IH0KLSAgICAgZWxzZSBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJoYXNNYW55Iil7Ci0g
ICAgICBzZWNvbmRSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlvbigp
ewotICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVj
b3JkTmFtZSk7Ci0gICAgICAgIGlmIChpc1ZhbHVlKHJlbGF0aW9uc2hpcCkpIHsgcmVsYXRpb25z
aGlwLmFkZE9iamVjdChmaXJzdFJlY29yZCk7IH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0g
IGlmIChmaXJzdFJlY29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIHNlY29uZFJlY29yZCBpbnN0
YW5jZW9mIERTLk1vZGVsICYmIGdldChmaXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKSAhPT0g
c2Vjb25kUmVjb3JkKSB7Ci0gICAgaWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdz
VG8iKXsKLSAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVu
Y3Rpb24oKXsKLSAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUsIHNlY29u
ZFJlY29yZCk7Ci0gICAgICB9KTsKLSAgICB9Ci0gICAgZWxzZSBpZih0aGlzLmZpcnN0UmVjb3Jk
S2luZCA9PT0gImhhc01hbnkiKXsKLSAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNo
aXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChm
aXJzdFJlY29yZCwgZmlyc3RSZWNvcmROYW1lKTsKLSAgICAgICAgaWYgKGlzVmFsdWUocmVsYXRp
b25zaGlwKSkgeyByZWxhdGlvbnNoaXAuYWRkT2JqZWN0KHNlY29uZFJlY29yZCk7IH0KLSAgICAg
IH0pOwotICAgIH0KLSAgfQotCi0gIHRoaXMuY29hbGVzY2UoKTsKLX07Ci0KLURTLlJlbGF0aW9u
c2hpcENoYW5nZVJlbW92ZS5wcm90b3R5cGUuY2hhbmdlVHlwZSA9ICJyZW1vdmUiOwotRFMuUmVs
YXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24oKSB7Ci0gIHZh
ciBzZWNvbmRSZWNvcmROYW1lID0gdGhpcy5nZXRTZWNvbmRSZWNvcmROYW1lKCksCi0gICAgICBm
aXJzdFJlY29yZE5hbWUgPSB0aGlzLmdldEZpcnN0UmVjb3JkTmFtZSgpLAotICAgICAgZmlyc3RS
ZWNvcmQgPSB0aGlzLmdldEZpcnN0UmVjb3JkKCksCi0gICAgICBzZWNvbmRSZWNvcmQgPSB0aGlz
LmdldFNlY29uZFJlY29yZCgpOwotCi0gIC8vRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEg
aGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAo
bmV3UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSAr
ICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hpbGQu
Y29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOwotICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNp
ZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29u
c3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIg
KyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBh
cmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFtZSk7Ci0KLSAgaWYgKHNlY29uZFJl
Y29yZCBpbnN0YW5jZW9mIERTLk1vZGVsICYmIGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgRFMuTW9k
ZWwpIHsKLSAgICBpZih0aGlzLnNlY29uZFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKLSAg
ICAgIHNlY29uZFJlY29yZC5zdXNwZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7
Ci0gICAgICAgIHNldChzZWNvbmRSZWNvcmQsIHNlY29uZFJlY29yZE5hbWUsIG51bGwpOwotICAg
ICAgfSk7Ci0gICAgfQotICAgIGVsc2UgaWYodGhpcy5zZWNvbmRSZWNvcmRLaW5kID09PSAiaGFz
TWFueSIpewotICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMo
ZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChzZWNvbmRSZWNvcmQs
IHNlY29uZFJlY29yZE5hbWUpOwotICAgICAgICBpZiAoaXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7
IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3QoZmlyc3RSZWNvcmQpOyB9Ci0gICAgICB9KTsKLSAg
ICB9Ci0gIH0KLQotICBpZiAoZmlyc3RSZWNvcmQgaW5zdGFuY2VvZiBEUy5Nb2RlbCAmJiBnZXQo
Zmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSkpIHsKLSAgICBpZih0aGlzLmZpcnN0UmVjb3Jk
S2luZCA9PT0gImJlbG9uZ3NUbyIpewotICAgICAgZmlyc3RSZWNvcmQuc3VzcGVuZFJlbGF0aW9u
c2hpcE9ic2VydmVycyhmdW5jdGlvbigpewotICAgICAgICBzZXQoZmlyc3RSZWNvcmQsIGZpcnN0
UmVjb3JkTmFtZSwgbnVsbCk7Ci0gICAgICB9KTsKLSAgICAgfQotICAgICBlbHNlIGlmKHRoaXMu
Zmlyc3RSZWNvcmRLaW5kID09PSAiaGFzTWFueSIpewotICAgICAgIGZpcnN0UmVjb3JkLnN1c3Bl
bmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKLSAgICAgICAgIHZhciByZWxhdGlv
bnNoaXAgPSBnZXQoZmlyc3RSZWNvcmQsIGZpcnN0UmVjb3JkTmFtZSk7Ci0gICAgICAgICBpZiAo
aXNWYWx1ZShyZWxhdGlvbnNoaXApKSB7IHJlbGF0aW9uc2hpcC5yZW1vdmVPYmplY3Qoc2Vjb25k
UmVjb3JkKTsgfQotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAgdGhpcy5jb2FsZXNjZSgpOwot
fTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVtYmVyLWRh
dGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQsCi0gICAgaXNOb25lID0gRW1iZXIuaXNOb25lOwotCi0vKioKLSAg
QG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi1mdW5jdGlvbiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBv
cHRpb25zLCBtZXRhKSB7Ci0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZh
bHVlKSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKLSAgICAgICAgc3RvcmUg
PSBnZXQodGhpcywgJ3N0b3JlJyksCi0gICAgICAgIHByb21pc2VMYWJlbCA9ICJEUzogQXN5bmMg
YmVsb25nc1RvICIgKyB0aGlzICsgIiA6ICIgKyBrZXk7Ci0KLSAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA9PT0gMikgewotICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgYWRkIGEgJyIg
KyB0eXBlICsgIicgcmVjb3JkIHRvIHRoaXMgcmVsYXRpb25zaGlwIiwgIXZhbHVlIHx8IHZhbHVl
IGluc3RhbmNlb2Ygc3RvcmUubW9kZWxGb3IodHlwZSkpOwotICAgICAgcmV0dXJuIHZhbHVlID09
PSB1bmRlZmluZWQgPyBudWxsIDogRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBF
bWJlci5SU1ZQLnJlc29sdmUodmFsdWUsIHByb21pc2VMYWJlbCkgfSk7Ci0gICAgfQotCi0gICAg
dmFyIGxpbmsgPSBkYXRhLmxpbmtzICYmIGRhdGEubGlua3Nba2V5XSwKLSAgICAgICAgYmVsb25n
c1RvID0gZGF0YVtrZXldOwotCi0gICAgaWYoIWlzTm9uZShiZWxvbmdzVG8pKSB7Ci0gICAgICB2
YXIgcHJvbWlzZSA9IHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbykgfHwgRW1iZXIuUlNWUC5y
ZXNvbHZlKGJlbG9uZ3NUbywgcHJvbWlzZUxhYmVsKTsKLSAgICAgIHJldHVybiBEUy5Qcm9taXNl
T2JqZWN0LmNyZWF0ZSh7IHByb21pc2U6IHByb21pc2V9KTsKLSAgICB9IGVsc2UgaWYgKGxpbmsp
IHsKLSAgICAgIHZhciByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBBc3luYyBiZWxv
bmdzVG8gKGxpbmspICIgKyB0aGlzICsgIiA6ICIgKyBrZXkpOwotICAgICAgc3RvcmUuZmluZEJl
bG9uZ3NUbyh0aGlzLCBsaW5rLCBtZXRhLCByZXNvbHZlcik7Ci0gICAgICByZXR1cm4gRFMuUHJv
bWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9taXNlIH0pOwotICAgIH0g
ZWxzZSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0pLnByb3BlcnR5KCdkYXRhJyku
bWV0YShtZXRhKTsKLX0KLQotLyoqCi0gIGBEUy5iZWxvbmdzVG9gIGlzIHVzZWQgdG8gZGVmaW5l
IE9uZS1Uby1PbmUgYW5kIE9uZS1Uby1NYW55Ci0gIHJlbGF0aW9uc2hpcHMgb24gYSBbRFMuTW9k
ZWxdKERTLk1vZGVsLmh0bWwpLgotCi0KLSAgYERTLmJlbG9uZ3NUb2AgdGFrZXMgYW4gb3B0aW9u
YWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRseQotICBzdXBwb3J0ZWQgb3B0
aW9ucyBhcmU6Ci0KLSAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFsdWUgdXNlZCB0byBleHBsaWNp
dGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlvbnNoaXAuCi0gIC0gYGludmVy
c2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9uIGEK
LSAgICByZWxhdGVkIG1vZGVsIGluIGEgT25lLVRvLU1hbnkgcmVsYXRpb25zaGlwLiBTZWUgW0V4
cGxpY2l0IEludmVyc2VzXSgjdG9jX2V4cGxpY2l0LWludmVyc2VzKQotCi0gICMjIyMgT25lLVRv
LU9uZQotICBUbyBkZWNsYXJlIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28g
bW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2A6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
VXNlciA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgcHJvZmlsZTogRFMuYmVsb25nc1RvKCdwcm9m
aWxlJykKLSAgfSk7Ci0KLSAgQXBwLlByb2ZpbGUgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIHVz
ZXI6IERTLmJlbG9uZ3NUbygndXNlcicpCi0gIH0pOwotICBgYGAKLQotICAjIyMjIE9uZS1Uby1N
YW55Ci0gIFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28g
bW9kZWxzLCB1c2UKLSAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0aCBgRFMuaGFz
TWFueWAsIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Qb3N0ID0gRFMuTW9k
ZWwuZXh0ZW5kKHsKLSAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCi0gIH0pOwot
Ci0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBwb3N0OiBEUy5iZWxvbmdz
VG8oJ3Bvc3QnKQotICB9KTsKLSAgYGBgCi0KLSAgQG5hbWVzcGFjZQotICBAbWV0aG9kIGJlbG9u
Z3NUbwotICBAZm9yIERTCi0gIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1vZGVsfSB0eXBlIHRoZSBt
b2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMg
YSBoYXNoIG9mIG9wdGlvbnMKLSAgQHJldHVybiB7RW1iZXIuY29tcHV0ZWR9IHJlbGF0aW9uc2hp
cAotKi8KLURTLmJlbG9uZ3NUbyA9IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAgaWYgKHR5
cGVvZiB0eXBlID09PSAnb2JqZWN0JykgewotICAgIG9wdGlvbnMgPSB0eXBlOwotICAgIHR5cGUg
PSB1bmRlZmluZWQ7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJUaGUgZmlyc3QgYXJn
dW1lbnQgRFMuYmVsb25nc1RvIG11c3QgYmUgYSBtb2RlbCB0eXBlIG9yIHN0cmluZywgbGlrZSBE
Uy5iZWxvbmdzVG8oQXBwLlBlcnNvbikiLCAhIXR5cGUgJiYgKHR5cGVvZiB0eXBlID09PSAnc3Ry
aW5nJyB8fCBEUy5Nb2RlbC5kZXRlY3QodHlwZSkpKTsKLSAgfQotCi0gIG9wdGlvbnMgPSBvcHRp
b25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0aW9uc2hpcDog
dHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2JlbG9uZ3NUbycgfTsKLQotICBpZiAob3B0
aW9ucy5hc3luYykgewotICAgIHJldHVybiBhc3luY0JlbG9uZ3NUbyh0eXBlLCBvcHRpb25zLCBt
ZXRhKTsKLSAgfQotCi0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVl
KSB7Ci0gICAgdmFyIGRhdGEgPSBnZXQodGhpcywgJ2RhdGEnKSwKLSAgICAgICAgc3RvcmUgPSBn
ZXQodGhpcywgJ3N0b3JlJyksIGJlbG9uZ3NUbywgdHlwZUNsYXNzOwotCi0gICAgaWYgKHR5cGVv
ZiB0eXBlID09PSAnc3RyaW5nJykgewotICAgICAgdHlwZUNsYXNzID0gc3RvcmUubW9kZWxGb3Io
dHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cGVDbGFzcyA9IHR5cGU7Ci0gICAgfQotCi0g
ICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiWW91
IGNhbiBvbmx5IGFkZCBhICciICsgdHlwZSArICInIHJlY29yZCB0byB0aGlzIHJlbGF0aW9uc2hp
cCIsICF2YWx1ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIHR5cGVDbGFzcyk7Ci0gICAgICByZXR1cm4g
dmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBiZWxvbmdz
VG8gPSBkYXRhW2tleV07Ci0KLSAgICBpZiAoaXNOb25lKGJlbG9uZ3NUbykpIHsgcmV0dXJuIG51
bGw7IH0KLQotICAgIHN0b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbyk7Ci0KLSAgICByZXR1cm4g
YmVsb25nc1RvOwotICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Ci19OwotCi0vKioK
LSAgVGhlc2Ugb2JzZXJ2ZXJzIG9ic2VydmUgYWxsIGBiZWxvbmdzVG9gIHJlbGF0aW9uc2hpcHMg
b24gdGhlIHJlY29yZC4gU2VlCi0gIGByZWxhdGlvbnNoaXBzL2V4dGAgdG8gc2VlIGhvdyB0aGVz
ZSBvYnNlcnZlcnMgZ2V0IHRoZWlyIGRlcGVuZGVuY2llcy4KLQotICBAY2xhc3MgTW9kZWwKLSAg
QG5hbWVzcGFjZSBEUwotKi8KLURTLk1vZGVsLnJlb3Blbih7Ci0KLSAgLyoqCi0gICAgQG1ldGhv
ZCBiZWxvbmdzVG9XaWxsQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgICBAc3RhdGljCi0gICAgQHBh
cmFtIHJlY29yZAotICAgIEBwYXJhbSBrZXkKLSAgKi8KLSAgYmVsb25nc1RvV2lsbENoYW5nZTog
RW1iZXIuYmVmb3JlT2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKLSAgICBpZiAoZ2V0
KHJlY29yZCwgJ2lzTG9hZGVkJykpIHsKLSAgICAgIHZhciBvbGRQYXJlbnQgPSBnZXQocmVjb3Jk
LCBrZXkpOwotCi0gICAgICBpZiAob2xkUGFyZW50KSB7Ci0gICAgICAgIHZhciBzdG9yZSA9IGdl
dChyZWNvcmQsICdzdG9yZScpLAotICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlw
Q2hhbmdlLmNyZWF0ZUNoYW5nZShyZWNvcmQsIG9sZFBhcmVudCwgc3RvcmUsIHsga2V5OiBrZXks
IGtpbmQ6ICJiZWxvbmdzVG8iLCBjaGFuZ2VUeXBlOiAicmVtb3ZlIiB9KTsKLQotICAgICAgICBj
aGFuZ2Uuc3luYygpOwotICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0gPSBjaGFuZ2U7
Ci0gICAgICB9Ci0gICAgfQotICB9KSwKLQotICAvKioKLSAgICBAbWV0aG9kIGJlbG9uZ3NUb0Rp
ZENoYW5nZQotICAgIEBwcml2YXRlCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSByZWNvcmQKLSAg
ICBAcGFyYW0ga2V5Ci0gICovCi0gIGJlbG9uZ3NUb0RpZENoYW5nZTogRW1iZXIuaW1tZWRpYXRl
T2JzZXJ2ZXIoZnVuY3Rpb24ocmVjb3JkLCBrZXkpIHsKLSAgICBpZiAoZ2V0KHJlY29yZCwgJ2lz
TG9hZGVkJykpIHsKLSAgICAgIHZhciBuZXdQYXJlbnQgPSBnZXQocmVjb3JkLCBrZXkpOwotCi0g
ICAgICBpZiAobmV3UGFyZW50KSB7Ci0gICAgICAgIHZhciBzdG9yZSA9IGdldChyZWNvcmQsICdz
dG9yZScpLAotICAgICAgICAgICAgY2hhbmdlID0gRFMuUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0
ZUNoYW5nZShyZWNvcmQsIG5ld1BhcmVudCwgc3RvcmUsIHsga2V5OiBrZXksIGtpbmQ6ICJiZWxv
bmdzVG8iLCBjaGFuZ2VUeXBlOiAiYWRkIiB9KTsKLQotICAgICAgICBjaGFuZ2Uuc3luYygpOwot
ICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZSB0aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV07Ci0g
IH0pCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotICBAbW9kdWxlIGVt
YmVyLWRhdGEKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgc2V0
UHJvcGVydGllcyA9IEVtYmVyLnNldFByb3BlcnRpZXM7Ci0KLWZ1bmN0aW9uIGFzeW5jSGFzTWFu
eSh0eXBlLCBvcHRpb25zLCBtZXRhKSB7Ci0gIHJldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlv
bihrZXksIHZhbHVlKSB7Ci0gICAgdmFyIHJlbGF0aW9uc2hpcCA9IHRoaXMuX3JlbGF0aW9uc2hp
cHNba2V5XSwKLSAgICAgICAgcHJvbWlzZUxhYmVsID0gIkRTOiBBc3luYyBoYXNNYW55ICIgKyB0
aGlzICsgIiA6ICIgKyBrZXk7Ci0KLSAgICBpZiAoIXJlbGF0aW9uc2hpcCkgewotICAgICAgdmFy
IHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZlcihwcm9taXNlTGFiZWwpOwotICAgICAgcmVsYXRp
b25zaGlwID0gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBmdW5jdGlvbihz
dG9yZSwgZGF0YSkgewotICAgICAgICB2YXIgbGluayA9IGRhdGEubGlua3MgJiYgZGF0YS5saW5r
c1trZXldOwotICAgICAgICB2YXIgcmVsOwotICAgICAgICBpZiAobGluaykgewotICAgICAgICAg
IHJlbCA9IHN0b3JlLmZpbmRIYXNNYW55KHRoaXMsIGxpbmssIG1ldGEsIHJlc29sdmVyKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWwgPSBzdG9yZS5maW5kTWFueSh0aGlzLCBkYXRh
W2tleV0sIG1ldGEudHlwZSwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhY2hl
IHRoZSBwcm9taXNlIHNvIHdlIGNhbiB1c2UgaXQKLSAgICAgICAgLy8gd2hlbiB3ZSBjb21lIGJh
Y2sgYW5kIGRvbid0IG5lZWQgdG8gcmVidWlsZAotICAgICAgICAvLyB0aGUgcmVsYXRpb25zaGlw
LgotICAgICAgICBzZXQocmVsLCAncHJvbWlzZScsIHJlc29sdmVyLnByb21pc2UpOwotICAgICAg
ICByZXR1cm4gcmVsOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgdmFyIHByb21pc2UgPSByZWxh
dGlvbnNoaXAuZ2V0KCdwcm9taXNlJykudGhlbihmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBy
ZWxhdGlvbnNoaXA7Ci0gICAgfSwgbnVsbCwgIkRTOiBBc3luYyBoYXNNYW55IHJlY29yZHMgcmVj
ZWl2ZWQiKTsKLQotICAgIHJldHVybiBEUy5Qcm9taXNlQXJyYXkuY3JlYXRlKHsgcHJvbWlzZTog
cHJvbWlzZSB9KTsKLSAgfSkucHJvcGVydHkoJ2RhdGEnKS5tZXRhKG1ldGEpOwotfQotCi1mdW5j
dGlvbiBidWlsZFJlbGF0aW9uc2hpcChyZWNvcmQsIGtleSwgb3B0aW9ucywgY2FsbGJhY2spIHsK
LSAgdmFyIHJlbHMgPSByZWNvcmQuX3JlbGF0aW9uc2hpcHM7Ci0KLSAgaWYgKHJlbHNba2V5XSkg
eyByZXR1cm4gcmVsc1trZXldOyB9Ci0KLSAgdmFyIGRhdGEgPSBnZXQocmVjb3JkLCAnZGF0YScp
LAotICAgICAgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKTsKLQotICB2YXIgcmVsYXRpb25z
aGlwID0gcmVsc1trZXldID0gY2FsbGJhY2suY2FsbChyZWNvcmQsIHN0b3JlLCBkYXRhKTsKLQot
ICByZXR1cm4gc2V0UHJvcGVydGllcyhyZWxhdGlvbnNoaXAsIHsKLSAgICBvd25lcjogcmVjb3Jk
LCBuYW1lOiBrZXksIGlzUG9seW1vcnBoaWM6IG9wdGlvbnMucG9seW1vcnBoaWMKLSAgfSk7Ci19
Ci0KLWZ1bmN0aW9uIGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKSB7Ci0gIG9wdGlvbnMg
PSBvcHRpb25zIHx8IHt9OwotCi0gIHZhciBtZXRhID0geyB0eXBlOiB0eXBlLCBpc1JlbGF0aW9u
c2hpcDogdHJ1ZSwgb3B0aW9uczogb3B0aW9ucywga2luZDogJ2hhc01hbnknIH07Ci0KLSAgaWYg
KG9wdGlvbnMuYXN5bmMpIHsKLSAgICByZXR1cm4gYXN5bmNIYXNNYW55KHR5cGUsIG9wdGlvbnMs
IG1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFs
dWUpIHsKLSAgICByZXR1cm4gYnVpbGRSZWxhdGlvbnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBm
dW5jdGlvbihzdG9yZSwgZGF0YSkgewotICAgICAgdmFyIHJlY29yZHMgPSBkYXRhW2tleV07Ci0g
ICAgICBFbWJlci5hc3NlcnQoIllvdSBsb29rZWQgdXAgdGhlICciICsga2V5ICsgIicgcmVsYXRp
b25zaGlwIG9uICciICsgdGhpcyArICInIGJ1dCBzb21lIG9mIHRoZSBhc3NvY2lhdGVkIHJlY29y
ZHMgd2VyZSBub3QgbG9hZGVkLiBFaXRoZXIgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCBsb2FkZWQg
dG9nZXRoZXIgd2l0aCB0aGUgcGFyZW50IHJlY29yZCwgb3Igc3BlY2lmeSB0aGF0IHRoZSByZWxh
dGlvbnNoaXAgaXMgYXN5bmMgKGBEUy5oYXNNYW55KHsgYXN5bmM6IHRydWUgfSlgKSIsIEVtYmVy
LkEocmVjb3JkcykuZXZlcnlQcm9wZXJ0eSgnaXNFbXB0eScsIGZhbHNlKSk7Ci0gICAgICByZXR1
cm4gc3RvcmUuZmluZE1hbnkodGhpcywgZGF0YVtrZXldLCBtZXRhLnR5cGUpOwotICAgIH0pOwot
ICB9KS5wcm9wZXJ0eSgnZGF0YScpLm1ldGEobWV0YSk7Ci19Ci0KLS8qKgotICBgRFMuaGFzTWFu
eWAgaXMgdXNlZCB0byBkZWZpbmUgT25lLVRvLU1hbnkgYW5kIE1hbnktVG8tTWFueQotICByZWxh
dGlvbnNoaXBzIG9uIGEgW0RTLk1vZGVsXShEUy5Nb2RlbC5odG1sKS4KLQotICBgRFMuaGFzTWFu
eWAgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRs
eQotICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6Ci0KLSAgLSBgYXN5bmNgOiBBIGJvb2xlYW4gdmFs
dWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBhbiBhc3luYyByZWxhdGlv
bnNoaXAuCi0gIC0gYGludmVyc2VgOiBBIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZl
cnNlIHByb3BlcnR5IG9uIGEgcmVsYXRlZCBtb2RlbC4KLQotICAjIyMjIE9uZS1Uby1NYW55Ci0g
IFRvIGRlY2xhcmUgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxz
LCB1c2UKLSAgYERTLmJlbG9uZ3NUb2AgaW4gY29tYmluYXRpb24gd2l0aCBgRFMuaGFzTWFueWAs
IGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCi0gIH0pOwotCi0gIEFw
cC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ3Bv
c3QnKQotICB9KTsKLSAgYGBgCi0KLSAgIyMjIyBNYW55LVRvLU1hbnkKLSAgVG8gZGVjbGFyZSBh
IG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gbW9kZWxzLCB1c2UKLSAgYERT
Lmhhc01hbnlgOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRl
bmQoewotICAgIHRhZ3M6IERTLmhhc01hbnkoJ3RhZycpCi0gIH0pOwotCi0gIEFwcC5UYWcgPSBE
Uy5Nb2RlbC5leHRlbmQoewotICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgfSk7Ci0g
IGBgYAotCi0gICMjIyMgRXhwbGljaXQgSW52ZXJzZXMKLQotICBFbWJlciBEYXRhIHdpbGwgZG8g
aXRzIGJlc3QgdG8gZGlzY292ZXIgd2hpY2ggcmVsYXRpb25zaGlwcyBtYXAgdG8KLSAgb25lIGFu
b3RoZXIuIEluIHRoZSBvbmUtdG8tbWFueSBjb2RlIGFib3ZlLCBmb3IgZXhhbXBsZSwgRW1iZXIg
RGF0YQotICBjYW4gZmlndXJlIG91dCB0aGF0IGNoYW5naW5nIHRoZSBgY29tbWVudHNgIHJlbGF0
aW9uc2hpcCBzaG91bGQgdXBkYXRlCi0gIHRoZSBgcG9zdGAgcmVsYXRpb25zaGlwIG9uIHRoZSBp
bnZlcnNlIGJlY2F1c2UgcG9zdCBpcyB0aGUgb25seQotICByZWxhdGlvbnNoaXAgdG8gdGhhdCBt
b2RlbC4KLQotICBIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSBoYXZlIG11bHRpcGxlIGBiZWxv
bmdzVG9gL2BoYXNNYW55c2AgZm9yIHRoZQotICBzYW1lIHR5cGUuIFlvdSBjYW4gc3BlY2lmeSB3
aGljaCBwcm9wZXJ0eSBvbiB0aGUgcmVsYXRlZCBtb2RlbCBpcwotICB0aGUgaW52ZXJzZSB1c2lu
ZyBgRFMuaGFzTWFueWAncyBgaW52ZXJzZWAgb3B0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
dmFyIGJlbG9uZ3NUbyA9IERTLmJlbG9uZ3NUbywKLSAgICAgIGhhc01hbnkgPSBEUy5oYXNNYW55
OwotCi0gIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBvbmVQb3N0OiBiZWxv
bmdzVG8oJ3Bvc3QnKSwKLSAgICB0d29Qb3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICByZWRQ
b3N0OiBiZWxvbmdzVG8oJ3Bvc3QnKSwKLSAgICBibHVlUG9zdDogYmVsb25nc1RvKCdwb3N0JykK
LSAgfSk7Ci0KLSAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgIGNvbW1lbnRzOiBo
YXNNYW55KCdjb21tZW50JywgewotICAgICAgaW52ZXJzZTogJ3JlZFBvc3QnCi0gICAgfSkKLSAg
fSk7Ci0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGludmVyc2Ugb24gYSBgYmVs
b25nc1RvYCwgd2hpY2ggd29ya3MgaG93Ci0gIHlvdSdkIGV4cGVjdC4KLQotICBAbmFtZXNwYWNl
Ci0gIEBtZXRob2QgaGFzTWFueQotICBAZm9yIERTCi0gIEBwYXJhbSB7U3RyaW5nIG9yIERTLk1v
ZGVsfSB0eXBlIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgQHBhcmFtIHtP
YmplY3R9IG9wdGlvbnMgYSBoYXNoIG9mIG9wdGlvbnMKLSAgQHJldHVybiB7RW1iZXIuY29tcHV0
ZWR9IHJlbGF0aW9uc2hpcAotKi8KLURTLmhhc01hbnkgPSBmdW5jdGlvbih0eXBlLCBvcHRpb25z
KSB7Ci0gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHsKLSAgICBvcHRpb25zID0gdHlw
ZTsKLSAgICB0eXBlID0gdW5kZWZpbmVkOwotICB9Ci0gIHJldHVybiBoYXNSZWxhdGlvbnNoaXAo
dHlwZSwgb3B0aW9ucyk7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgQG1vZHVsZSBlbWJlci1k
YXRhCi0qLwotCi0vKgotICBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIGV4dGVuc2lvbnMgdG8g
dGhlIGJhc2UgYERTLk1vZGVsYCBjbGFzcyB0aGF0Ci0gIGFkZCBzdXBwb3J0IGZvciBvbmUtdG8t
bWFueSByZWxhdGlvbnNoaXBzLgotKi8KLQotLyoqCi0gIEBjbGFzcyBNb2RlbAotICBAbmFtZXNw
YWNlIERTCi0qLwotRFMuTW9kZWwucmVvcGVuKHsKLQotICAvKioKLSAgICBUaGlzIEVtYmVyLmpz
IGhvb2sgYWxsb3dzIGFuIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGEgcHJvcGVydHkKLSAg
ICBpcyBkZWZpbmVkLgotCi0gICAgSW4gdGhpcyBjYXNlLCB3ZSB1c2UgaXQgdG8gYmUgbm90aWZp
ZWQgd2hlbiBhbiBFbWJlciBEYXRhIHVzZXIgZGVmaW5lcyBhCi0gICAgYmVsb25ncy10byByZWxh
dGlvbnNoaXAuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBzZXQgdXAgb2JzZXJ2ZXJzIGZvcgot
ICAgIGVhY2ggb25lLCBhbGxvd2luZyB1cyB0byB0cmFjayByZWxhdGlvbnNoaXAgY2hhbmdlcyBh
bmQgYXV0b21hdGljYWxseQotICAgIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgaW52ZXJzZSBoYXMt
bWFueSBhcnJheS4KLQotICAgIFRoaXMgaG9vayBwYXNzZXMgdGhlIGNsYXNzIGJlaW5nIHNldCB1
cCwgYXMgd2VsbCBhcyB0aGUga2V5IGFuZCB2YWx1ZQotICAgIGJlaW5nIGRlZmluZWQuIFNvLCBm
b3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlciBkb2VzIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHBhcmVudDogRFMuYmVsb25nc1RvKCd1c2Vy
JykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoaXMgaG9vayB3b3VsZCBiZSBjYWxsZWQgd2l0
aCAicGFyZW50IiBhcyB0aGUga2V5IGFuZCB0aGUgY29tcHV0ZWQKLSAgICBwcm9wZXJ0eSByZXR1
cm5lZCBieSBgRFMuYmVsb25nc1RvYCBhcyB0aGUgdmFsdWUuCi0KLSAgICBAbWV0aG9kIGRpZERl
ZmluZVByb3BlcnR5Ci0gICAgQHBhcmFtIHByb3RvCi0gICAgQHBhcmFtIGtleQotICAgIEBwYXJh
bSB2YWx1ZQotICAqLwotICBkaWREZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24ocHJvdG8sIGtleSwg
dmFsdWUpIHsKLSAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgYmVpbmcgc2V0IGlzIGEgY29tcHV0
ZWQgcHJvcGVydHkuCi0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikg
ewotCi0gICAgICAvLyBJZiBpdCBpcywgZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIHJlbGF0aW9u
c2hpcC4gVGhpcyBpcwotICAgICAgLy8gcG9wdWxhdGVkIGJ5IHRoZSBgRFMuYmVsb25nc1RvYCBo
ZWxwZXIgd2hlbiBpdCBpcyBjcmVhdGluZwotICAgICAgLy8gdGhlIGNvbXB1dGVkIHByb3BlcnR5
LgotICAgICAgdmFyIG1ldGEgPSB2YWx1ZS5tZXRhKCk7Ci0KLSAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwICYmIG1ldGEua2luZCA9PT0gJ2JlbG9uZ3NUbycpIHsKLSAgICAgICAgRW1iZXIu
YWRkT2JzZXJ2ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2JlbG9uZ3NUb0RpZENoYW5nZScpOwotICAg
ICAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcihwcm90bywga2V5LCBudWxsLCAnYmVsb25nc1Rv
V2lsbENoYW5nZScpOwotICAgICAgfQotCi0gICAgICBtZXRhLnBhcmVudFR5cGUgPSBwcm90by5j
b25zdHJ1Y3RvcjsKLSAgICB9Ci0gIH0KLX0pOwotCi0vKgotICBUaGVzZSBEUy5Nb2RlbCBleHRl
bnNpb25zIGFkZCBjbGFzcyBtZXRob2RzIHRoYXQgcHJvdmlkZSByZWxhdGlvbnNoaXAKLSAgaW50
cm9zcGVjdGlvbiBhYmlsaXRpZXMgYWJvdXQgcmVsYXRpb25zaGlwcy4KLQotICBBIG5vdGUgYWJv
dXQgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgY29udGFpbmVkIGhlcmU6Ci0KLSAgKipUaGVzZSBw
cm9wZXJ0aWVzIGFyZSBlZmZlY3RpdmVseSBzZWFsZWQgb25jZSBjYWxsZWQgZm9yIHRoZSBmaXJz
dCB0aW1lLioqCi0gIFRvIGF2b2lkIHJlcGVhdGVkbHkgZG9pbmcgZXhwZW5zaXZlIGl0ZXJhdGlv
biBvdmVyIGEgbW9kZWwncyBmaWVsZHMsIHRoZXNlCi0gIHZhbHVlcyBhcmUgY29tcHV0ZWQgb25j
ZSBhbmQgdGhlbiBjYWNoZWQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJ1bnRpbWUgb2YKLSAg
eW91ciBhcHBsaWNhdGlvbi4KLQotICBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1vZGlm
eSBhIGNsYXNzIGFmdGVyIGl0cyBpbml0aWFsIGRlZmluaXRpb24KLSAgKGZvciBleGFtcGxlLCB1
c2luZyBgcmVvcGVuKClgIHRvIGFkZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMpLCBtYWtlIHN1cmUg
eW91Ci0gIGRvIGl0IGJlZm9yZSB1c2luZyB5b3VyIG1vZGVsIHdpdGggdGhlIHN0b3JlLCB3aGlj
aCB1c2VzIHRoZXNlIHByb3BlcnRpZXMKLSAgZXh0ZW5zaXZlbHkuCi0qLwotCi1EUy5Nb2RlbC5y
ZW9wZW5DbGFzcyh7Ci0gIC8qKgotICAgIEZvciBhIGdpdmVuIHJlbGF0aW9uc2hpcCBuYW1lLCBy
ZXR1cm5zIHRoZSBtb2RlbCB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLSAgICBGb3IgZXhh
bXBsZSwgaWYgeW91IGRlZmluZSBhIG1vZGVsIGxpa2UgdGhpczoKLQotICAgYGBgamF2YXNjcmlw
dAotICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIGNvbW1lbnRzOiBEUy5o
YXNNYW55KCdjb21tZW50JykKLSAgICB9KTsKLSAgIGBgYAotCi0gICAgQ2FsbGluZyBgQXBwLlBv
c3QudHlwZUZvclJlbGF0aW9uc2hpcCgnY29tbWVudHMnKWAgd2lsbCByZXR1cm4gYEFwcC5Db21t
ZW50YC4KLQotICAgIEBtZXRob2QgdHlwZUZvclJlbGF0aW9uc2hpcAotICAgIEBzdGF0aWMKLSAg
ICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0gICAg
QHJldHVybiB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHRoZSB0eXBlIG9mIHRoZSByZWxhdGlvbnNo
aXAsIG9yIHVuZGVmaW5lZAotICAqLwotICB0eXBlRm9yUmVsYXRpb25zaGlwOiBmdW5jdGlvbihu
YW1lKSB7Ci0gICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5
TmFtZScpLmdldChuYW1lKTsKLSAgICByZXR1cm4gcmVsYXRpb25zaGlwICYmIHJlbGF0aW9uc2hp
cC50eXBlOwotICB9LAotCi0gIGludmVyc2VGb3I6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIg
aW52ZXJzZVR5cGUgPSB0aGlzLnR5cGVGb3JSZWxhdGlvbnNoaXAobmFtZSk7Ci0KLSAgICBpZiAo
IWludmVyc2VUeXBlKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgb3B0aW9ucyA9IHRoaXMu
bWV0YUZvclByb3BlcnR5KG5hbWUpLm9wdGlvbnM7Ci0KLSAgICBpZiAob3B0aW9ucy5pbnZlcnNl
ID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICB2YXIgaW52ZXJzZU5hbWUsIGludmVy
c2VLaW5kOwotCi0gICAgaWYgKG9wdGlvbnMuaW52ZXJzZSkgewotICAgICAgaW52ZXJzZU5hbWUg
PSBvcHRpb25zLmludmVyc2U7Ci0gICAgICBpbnZlcnNlS2luZCA9IEVtYmVyLmdldChpbnZlcnNl
VHlwZSwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKS5nZXQoaW52ZXJzZU5hbWUpLmtpbmQ7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHZhciBwb3NzaWJsZVJlbGF0aW9uc2hpcHMgPSBmaW5kUG9zc2libGVJ
bnZlcnNlcyh0aGlzLCBpbnZlcnNlVHlwZSk7Ci0KLSAgICAgIGlmIChwb3NzaWJsZVJlbGF0aW9u
c2hpcHMubGVuZ3RoID09PSAwKSB7IHJldHVybiBudWxsOyB9Ci0KLSAgICAgIEVtYmVyLmFzc2Vy
dCgiWW91IGRlZmluZWQgdGhlICciICsgbmFtZSArICInIHJlbGF0aW9uc2hpcCBvbiAiICsgdGhp
cyArICIsIGJ1dCBtdWx0aXBsZSBwb3NzaWJsZSBpbnZlcnNlIHJlbGF0aW9uc2hpcHMgb2YgdHlw
ZSAiICsgdGhpcyArICIgd2VyZSBmb3VuZCBvbiAiICsgaW52ZXJzZVR5cGUgKyAiLiBMb29rIGF0
IGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvbW9kZWxzL2RlZmluaW5nLW1vZGVscy8jdG9jX2V4
cGxpY2l0LWludmVyc2VzIGZvciBob3cgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGludmVyc2VzIiwg
cG9zc2libGVSZWxhdGlvbnNoaXBzLmxlbmd0aCA9PT0gMSk7Ci0KLSAgICAgIGludmVyc2VOYW1l
ID0gcG9zc2libGVSZWxhdGlvbnNoaXBzWzBdLm5hbWU7Ci0gICAgICBpbnZlcnNlS2luZCA9IHBv
c3NpYmxlUmVsYXRpb25zaGlwc1swXS5raW5kOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZpbmRQ
b3NzaWJsZUludmVyc2VzKHR5cGUsIGludmVyc2VUeXBlLCBwb3NzaWJsZVJlbGF0aW9uc2hpcHMp
IHsKLSAgICAgIHBvc3NpYmxlUmVsYXRpb25zaGlwcyA9IHBvc3NpYmxlUmVsYXRpb25zaGlwcyB8
fCBbXTsKLQotICAgICAgdmFyIHJlbGF0aW9uc2hpcE1hcCA9IGdldChpbnZlcnNlVHlwZSwgJ3Jl
bGF0aW9uc2hpcHMnKTsKLSAgICAgIGlmICghcmVsYXRpb25zaGlwTWFwKSB7IHJldHVybjsgfQot
Ci0gICAgICB2YXIgcmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcE1hcC5nZXQodHlwZSk7Ci0g
ICAgICBpZiAocmVsYXRpb25zaGlwcykgewotICAgICAgICBwb3NzaWJsZVJlbGF0aW9uc2hpcHMu
cHVzaC5hcHBseShwb3NzaWJsZVJlbGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcE1hcC5nZXQodHlw
ZSkpOwotICAgICAgfQotCi0gICAgICBpZiAodHlwZS5zdXBlcmNsYXNzKSB7Ci0gICAgICAgIGZp
bmRQb3NzaWJsZUludmVyc2VzKHR5cGUuc3VwZXJjbGFzcywgaW52ZXJzZVR5cGUsIHBvc3NpYmxl
UmVsYXRpb25zaGlwcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwb3NzaWJsZVJlbGF0aW9u
c2hpcHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHsKLSAgICAgIHR5cGU6IGludmVyc2VUeXBlLAot
ICAgICAgbmFtZTogaW52ZXJzZU5hbWUsCi0gICAgICBraW5kOiBpbnZlcnNlS2luZAotICAgIH07
Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIG1vZGVsJ3MgcmVsYXRpb25zaGlwcyBhcyBhIG1hcCwg
a2V5ZWQgb24gdGhlIHR5cGUgb2YgdGhlCi0gICAgcmVsYXRpb25zaGlwLiBUaGUgdmFsdWUgb2Yg
ZWFjaCBlbnRyeSBpcyBhbiBhcnJheSBjb250YWluaW5nIGEgZGVzY3JpcHRvcgotICAgIGZvciBl
YWNoIHJlbGF0aW9uc2hpcCB3aXRoIHRoYXQgdHlwZSwgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0
aGUgcmVsYXRpb25zaGlwCi0gICAgYXMgd2VsbCBhcyB0aGUgdHlwZS4KLQotICAgIEZvciBleGFt
cGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIG1vZGVsIGRlZmluaXRpb246Ci0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoewotICAgICAgdXNlcnM6IERT
Lmhhc01hbnkoJ3VzZXInKSwKLSAgICAgIG93bmVyOiBEUy5iZWxvbmdzVG8oJ3VzZXInKSwKLSAg
ICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgd291bGQgcmV0dXJuIGEgbWFwIGRlc2NyaWJpbmcgdGhlc2UK
LSAgICByZWxhdGlvbnNoaXBzLCBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
dmFyIHJlbGF0aW9uc2hpcHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdyZWxhdGlvbnNoaXBzJyk7
Ci0gICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlVzZXIpOwotICAgIC8vPT4gWyB7IG5hbWU6ICd1
c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAotICAgIC8vICAgICB7IG5hbWU6ICdvd25lcicsIGtp
bmQ6ICdiZWxvbmdzVG8nIH0gXQotICAgIHJlbGF0aW9uc2hpcHMuZ2V0KEFwcC5Qb3N0KTsKLSAg
ICAvLz0+IFsgeyBuYW1lOiAncG9zdHMnLCBraW5kOiAnaGFzTWFueScgfSBdCi0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwcwotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBFbWJl
ci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwczogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9IG5ldyBFbWJlci5NYXBXaXRoRGVmYXVsdCh7
Ci0gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0KLSAgICB9KTsK
LQotICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGNvbXB1dGVkIHByb3BlcnR5IG9uIHRoZSBjbGFz
cwotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewot
Ci0gICAgICAvLyBJZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgYSByZWxhdGlvbnNoaXAsIGFk
ZAotICAgICAgLy8gaXQgdG8gdGhlIG1hcC4KLSAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlw
KSB7Ci0gICAgICAgIGlmICh0eXBlb2YgbWV0YS50eXBlID09PSAnc3RyaW5nJykgewotICAgICAg
ICAgIG1ldGEudHlwZSA9IHRoaXMuc3RvcmUubW9kZWxGb3IobWV0YS50eXBlKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHZhciByZWxhdGlvbnNoaXBzRm9yVHlwZSA9IG1hcC5nZXQobWV0YS50eXBl
KTsKLQotICAgICAgICByZWxhdGlvbnNoaXBzRm9yVHlwZS5wdXNoKHsgbmFtZTogbmFtZSwga2lu
ZDogbWV0YS5raW5kIH0pOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG1hcDsKLSAg
fSksCi0KLSAgLyoqCi0gICAgQSBoYXNoIGNvbnRhaW5pbmcgbGlzdHMgb2YgdGhlIG1vZGVsJ3Mg
cmVsYXRpb25zaGlwcywgZ3JvdXBlZAotICAgIGJ5IHRoZSByZWxhdGlvbnNoaXAga2luZC4gRm9y
IGV4YW1wbGUsIGdpdmVuIGEgbW9kZWwgd2l0aCB0aGlzCi0gICAgZGVmaW5pdGlvbjoKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB1
c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygndXNl
cicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCi0gICAgfSk7Ci0gICAgYGBg
Ci0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVsYXRpb25zaGlwTmFtZXMgPSBFbWJlci5nZXQoQXBw
LkJsb2csICdyZWxhdGlvbnNoaXBOYW1lcycpOwotICAgIHJlbGF0aW9uc2hpcE5hbWVzLmhhc01h
bnk7Ci0gICAgLy89PiBbJ3VzZXJzJywgJ3Bvc3RzJ10KLSAgICByZWxhdGlvbnNoaXBOYW1lcy5i
ZWxvbmdzVG87Ci0gICAgLy89PiBbJ293bmVyJ10KLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBy
ZWxhdGlvbnNoaXBOYW1lcwotICAgIEBzdGF0aWMKLSAgICBAdHlwZSBPYmplY3QKLSAgICBAcmVh
ZE9ubHkKLSAgKi8KLSAgcmVsYXRpb25zaGlwTmFtZXM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u
KCkgewotICAgIHZhciBuYW1lcyA9IHsgaGFzTWFueTogW10sIGJlbG9uZ3NUbzogW10gfTsKLQot
ICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAg
ICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgbmFtZXNbbWV0YS5raW5kXS5w
dXNoKG5hbWUpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIG5hbWVzOwotICB9KSwK
LQotICAvKioKLSAgICBBbiBhcnJheSBvZiB0eXBlcyBkaXJlY3RseSByZWxhdGVkIHRvIGEgbW9k
ZWwuIEVhY2ggdHlwZSB3aWxsIGJlCi0gICAgaW5jbHVkZWQgb25jZSwgcmVnYXJkbGVzcyBvZiB0
aGUgbnVtYmVyIG9mIHJlbGF0aW9uc2hpcHMgaXQgaGFzIHdpdGgKLSAgICB0aGUgbW9kZWwuCi0K
LSAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMgZGVmaW5pdGlvbjoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAg
ICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9uZ3NUbygn
dXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpCi0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBUaGlzIHByb3BlcnR5IHdvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgcmVsYXRlZFR5cGVzID0gRW1iZXIuZ2V0KEFwcC5C
bG9nLCAncmVsYXRlZFR5cGVzJyk7Ci0gICAgLy89PiBbIEFwcC5Vc2VyLCBBcHAuUG9zdCBdCi0g
ICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRlZFR5cGVzCi0gICAgQHN0YXRpYwotICAgIEB0
eXBlIEVtYmVyLkFycmF5Ci0gICAgQHJlYWRPbmx5Ci0gICovCi0gIHJlbGF0ZWRUeXBlczogRW1i
ZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHR5cGUsCi0gICAgICAgIHR5cGVzID0g
RW1iZXIuQSgpOwotCi0gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY29tcHV0ZWQgcHJvcGVydHkg
b24gdGhlIGNsYXNzLAotICAgIC8vIGFuZCBjcmVhdGUgYW4gYXJyYXkgb2YgdGhlIHVuaXF1ZSB0
eXBlcyBpbnZvbHZlZAotICAgIC8vIGluIHJlbGF0aW9uc2hpcHMKLSAgICB0aGlzLmVhY2hDb21w
dXRlZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKLSAgICAgIGlmIChtZXRhLmlzUmVs
YXRpb25zaGlwKSB7Ci0gICAgICAgIHR5cGUgPSBtZXRhLnR5cGU7Ci0KLSAgICAgICAgaWYgKHR5
cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIHR5cGUgPSBnZXQodGhpcywgdHlw
ZSwgZmFsc2UpIHx8IHRoaXMuc3RvcmUubW9kZWxGb3IodHlwZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZpZWQgYSBoYXNNYW55ICgiICsgbWV0YS50eXBl
ICsgIikgb24gIiArIG1ldGEucGFyZW50VHlwZSArICIgYnV0ICIgKyBtZXRhLnR5cGUgKyAiIHdh
cyBub3QgZm91bmQuIiwgIHR5cGUpOwotCi0gICAgICAgIGlmICghdHlwZXMuY29udGFpbnModHlw
ZSkpIHsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoIlRyeWluZyB0byBzaWRlbG9hZCAiICsgbmFt
ZSArICIgb24gIiArIHRoaXMudG9TdHJpbmcoKSArICIgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgZXhp
c3QuIiwgISF0eXBlKTsKLSAgICAgICAgICB0eXBlcy5wdXNoKHR5cGUpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0pLAotCi0gIC8qKgotICAg
IEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSByZWxhdGlvbnNoaXBzIG9mIGEgbW9kZWwgYW5kIHdo
b3NlIHZhbHVlcyBhcmUKLSAgICByZWxhdGlvbnNoaXAgZGVzY3JpcHRvcnMuCi0KLSAgICBGb3Ig
ZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMKLSAgICBkZWZpbml0aW9uOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5CbG9nID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICAgIHVz
ZXJzOiBEUy5oYXNNYW55KCd1c2VyJyksCi0gICAgICBvd25lcjogRFMuYmVsb25nc1RvKCd1c2Vy
JyksCi0KLSAgICAgIHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKLSAgICB9KTsKLSAgICBgYGAK
LQotICAgIFRoaXMgcHJvcGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciByZWxhdGlvbnNoaXBzQnlOYW1lID0gRW1iZXIuZ2V0KEFw
cC5CbG9nLCAncmVsYXRpb25zaGlwc0J5TmFtZScpOwotICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUu
Z2V0KCd1c2VycycpOwotICAgIC8vPT4geyBrZXk6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55Jywg
dHlwZTogQXBwLlVzZXIgfQotICAgIHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KCdvd25lcicpOwot
ICAgIC8vPT4geyBrZXk6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdzVG8nLCB0eXBlOiBBcHAuVXNl
ciB9Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgcmVsYXRpb25zaGlwc0J5TmFtZQotICAgIEBz
dGF0aWMKLSAgICBAdHlwZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgcmVsYXRp
b25zaGlwc0J5TmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcCA9
IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKLQotICAgIHRoaXMuZWFjaENvbXB1dGVkUHJvcGVy
dHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgaWYgKG1ldGEuaXNSZWxhdGlvbnNoaXAp
IHsKLSAgICAgICAgbWV0YS5rZXkgPSBuYW1lOwotICAgICAgICB0eXBlID0gbWV0YS50eXBlOwot
Ci0gICAgICAgIGlmICghdHlwZSAmJiBtZXRhLmtpbmQgPT09ICdoYXNNYW55JykgewotICAgICAg
ICAgIHR5cGUgPSBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUobmFtZSk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAoIXR5cGUpIHsKLSAgICAgICAgICB0eXBlID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICBtZXRhLnR5cGUg
PSB0aGlzLnN0b3JlLm1vZGVsRm9yKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwLnNl
dChuYW1lLCBtZXRhKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBtYXA7Ci0gIH0p
LAotCi0gIC8qKgotICAgIEEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIG1v
ZGVsIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHN0cmluZ3MKLSAgICBkZXNjcmliaW5nIHRoZSBraW5k
IG9mIHRoZSBmaWVsZC4gQSBtb2RlbCdzIGZpZWxkcyBhcmUgdGhlIHVuaW9uIG9mIGFsbCBvZiBp
dHMKLSAgICBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzLgotCi0gICAgRm9yIGV4YW1wbGU6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7
Ci0gICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAotICAgICAgb3duZXI6IERTLmJlbG9u
Z3NUbygndXNlcicpLAotCi0gICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcpLAotCi0gICAg
ICB0aXRsZTogRFMuYXR0cignc3RyaW5nJykKLSAgICB9KTsKLQotICAgIHZhciBmaWVsZHMgPSBF
bWJlci5nZXQoQXBwLkJsb2csICdmaWVsZHMnKTsKLSAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlv
bihmaWVsZCwga2luZCkgewotICAgICAgY29uc29sZS5sb2coZmllbGQsIGtpbmQpOwotICAgIH0p
OwotCi0gICAgLy8gcHJpbnRzOgotICAgIC8vIHVzZXJzLCBoYXNNYW55Ci0gICAgLy8gb3duZXIs
IGJlbG9uZ3NUbwotICAgIC8vIHBvc3RzLCBoYXNNYW55Ci0gICAgLy8gdGl0bGUsIGF0dHJpYnV0
ZQotICAgIGBgYAotCi0gICAgQHByb3BlcnR5IGZpZWxkcwotICAgIEBzdGF0aWMKLSAgICBAdHlw
ZSBFbWJlci5NYXAKLSAgICBAcmVhZE9ubHkKLSAgKi8KLSAgZmllbGRzOiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgpOwotCi0gICAg
dGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRhKSB7Ci0gICAgICBp
ZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgewotICAgICAgICBtYXAuc2V0KG5hbWUsIG1ldGEua2lu
ZCk7Ci0gICAgICB9IGVsc2UgaWYgKG1ldGEuaXNBdHRyaWJ1dGUpIHsKLSAgICAgICAgbWFwLnNl
dChuYW1lLCAnYXR0cmlidXRlJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gbWFw
OwotICB9KSwKLQotICAvKioKLSAgICBHaXZlbiBhIGNhbGxiYWNrLCBpdGVyYXRlcyBvdmVyIGVh
Y2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIG1vZGVsLAotICAgIGludm9raW5nIHRoZSBj
YWxsYmFjayB3aXRoIHRoZSBuYW1lIG9mIGVhY2ggcmVsYXRpb25zaGlwIGFuZCBpdHMgcmVsYXRp
b25zaGlwCi0gICAgZGVzY3JpcHRvci4KLQotICAgIEBtZXRob2QgZWFjaFJlbGF0aW9uc2hpcAot
ICAgIEBzdGF0aWMKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgY2FsbGJhY2sg
dG8gaW52b2tlCi0gICAgQHBhcmFtIHthbnl9IGJpbmRpbmcgdGhlIHZhbHVlIHRvIHdoaWNoIHRo
ZSBjYWxsYmFjaydzIGB0aGlzYCBzaG91bGQgYmUgYm91bmQKLSAgKi8KLSAgZWFjaFJlbGF0aW9u
c2hpcDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQodGhpcywgJ3JlbGF0
aW9uc2hpcHNCeU5hbWUnKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewot
ICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBuYW1lLCByZWxhdGlvbnNoaXApOwotICAgIH0p
OwotICB9LAotCi0gIC8qKgotICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFj
aCBvZiB0aGUgdHlwZXMgcmVsYXRlZCB0byBhIG1vZGVsLAotICAgIGludm9raW5nIHRoZSBjYWxs
YmFjayB3aXRoIHRoZSByZWxhdGVkIHR5cGUncyBjbGFzcy4gRWFjaCB0eXBlIHdpbGwgYmUKLSAg
ICByZXR1cm5lZCBqdXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgZGlmZmVyZW50IHJl
bGF0aW9uc2hpcHMgaXQgaGFzCi0gICAgd2l0aCBhIG1vZGVsLgotCi0gICAgQG1ldGhvZCBlYWNo
UmVsYXRlZFR5cGUKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sg
dGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAgIEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1
ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0g
IGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICBnZXQo
dGhpcywgJ3JlbGF0ZWRUeXBlcycpLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewotICAgICAgY2Fs
bGJhY2suY2FsbChiaW5kaW5nLCB0eXBlKTsKLSAgICB9KTsKLSAgfQotfSk7Ci0KLURTLk1vZGVs
LnJlb3Blbih7Ci0gIC8qKgotICAgIEdpdmVuIGEgY2FsbGJhY2ssIGl0ZXJhdGVzIG92ZXIgZWFj
aCBvZiB0aGUgcmVsYXRpb25zaGlwcyBpbiB0aGUgbW9kZWwsCi0gICAgaW52b2tpbmcgdGhlIGNh
bGxiYWNrIHdpdGggdGhlIG5hbWUgb2YgZWFjaCByZWxhdGlvbnNoaXAgYW5kIGl0cyByZWxhdGlv
bnNoaXAKLSAgICBkZXNjcmlwdG9yLgotCi0gICAgQG1ldGhvZCBlYWNoUmVsYXRpb25zaGlwCi0g
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQotICAg
IEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgY2FsbGJhY2sncyBg
dGhpc2Agc2hvdWxkIGJlIGJvdW5kCi0gICovCi0gIGVhY2hSZWxhdGlvbnNoaXA6IGZ1bmN0aW9u
KGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5lYWNoUmVsYXRpb25z
aGlwKGNhbGxiYWNrLCBiaW5kaW5nKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMuZm9yRWFjaDsKLQotLyoqCi0gIEBjbGFzcyBSZWNvcmRBcnJheU1hbmFnZXIKLSAgQG5h
bWVzcGFjZSBEUwotICBAcHJpdmF0ZQotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1EUy5S
ZWNvcmRBcnJheU1hbmFnZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgaW5pdDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5maWx0ZXJlZFJlY29yZEFycmF5cyA9IEVtYmVyLk1hcFdpdGhEZWZh
dWx0LmNyZWF0ZSh7Ci0gICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107
IH0KLSAgICB9KTsKLQotICAgIHRoaXMuY2hhbmdlZFJlY29yZHMgPSBbXTsKLSAgfSwKLQotICBy
ZWNvcmREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIGlmICh0aGlzLmNoYW5nZWRS
ZWNvcmRzLnB1c2gocmVjb3JkKSAhPT0gMSkgeyByZXR1cm47IH0KLQotICAgIEVtYmVyLnJ1bi5z
Y2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRoaXMudXBkYXRlUmVjb3JkQXJyYXlzKTsKLSAgfSwK
LQotICByZWNvcmRBcnJheXNGb3JSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewotICAgIHJlY29y
ZC5fcmVjb3JkQXJyYXlzID0gcmVjb3JkLl9yZWNvcmRBcnJheXMgfHwgRW1iZXIuT3JkZXJlZFNl
dC5jcmVhdGUoKTsKLSAgICByZXR1cm4gcmVjb3JkLl9yZWNvcmRBcnJheXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuZXZlciBkYXRhIGlzIGxvYWRlZCBp
bnRvIHRoZSBzdG9yZSBieSB0aGUKLSAgICBhZGFwdGVyIG9yIHVwZGF0ZWQgYnkgdGhlIGFkYXB0
ZXIsIG9yIHdoZW4gYSByZWNvcmQgaGFzIGNoYW5nZWQuCi0KLSAgICBJdCB1cGRhdGVzIGFsbCBy
ZWNvcmQgYXJyYXlzIHRoYXQgYSByZWNvcmQgYmVsb25ncyB0by4KLQotICAgIFRvIGF2b2lkIHRo
cmFzaGluZywgaXQgb25seSBydW5zIGF0IG1vc3Qgb25jZSBwZXIgcnVuIGxvb3AuCi0KLSAgICBA
bWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5cwotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBA
cGFyYW0ge051bWJlcnxTdHJpbmd9IGNsaWVudElkCi0gICovCi0gIHVwZGF0ZVJlY29yZEFycmF5
czogZnVuY3Rpb24oKSB7Ci0gICAgZm9yRWFjaCh0aGlzLmNoYW5nZWRSZWNvcmRzLCBmdW5jdGlv
bihyZWNvcmQpIHsKLSAgICAgIGlmIChnZXQocmVjb3JkLCAnaXNEZWxldGVkJykpIHsKLSAgICAg
ICAgdGhpcy5fcmVjb3JkV2FzRGVsZXRlZChyZWNvcmQpOwotICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhpcy5fcmVjb3JkV2FzQ2hhbmdlZChyZWNvcmQpOwotICAgICAgfQotICAgIH0sIHRoaXMp
OwotCi0gICAgdGhpcy5jaGFuZ2VkUmVjb3Jkcy5sZW5ndGggPSAwOwotICB9LAotCi0gIF9yZWNv
cmRXYXNEZWxldGVkOiBmdW5jdGlvbiAocmVjb3JkKSB7Ci0gICAgdmFyIHJlY29yZEFycmF5cyA9
IHJlY29yZC5fcmVjb3JkQXJyYXlzOwotCi0gICAgaWYgKCFyZWNvcmRBcnJheXMpIHsgcmV0dXJu
OyB9Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAg
IGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwotICAgIH0pOwotICB9LAotCi0gIF9yZWNvcmRX
YXNDaGFuZ2VkOiBmdW5jdGlvbiAocmVjb3JkKSB7Ci0gICAgdmFyIHR5cGUgPSByZWNvcmQuY29u
c3RydWN0b3IsCi0gICAgICAgIHJlY29yZEFycmF5cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJh
eXMuZ2V0KHR5cGUpLAotICAgICAgICBmaWx0ZXI7Ci0KLSAgICBmb3JFYWNoKHJlY29yZEFycmF5
cywgZnVuY3Rpb24oYXJyYXkpIHsKLSAgICAgIGZpbHRlciA9IGdldChhcnJheSwgJ2ZpbHRlckZ1
bmN0aW9uJyk7Ci0gICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBmaWx0ZXIsIHR5
cGUsIHJlY29yZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICAvLyBsb29wIHRocm91Z2ggYWxsIG1h
bnlBcnJheXMgY29udGFpbmluZyBhbiB1bmxvYWRlZCBjb3B5IG9mIHRoaXMKLSAgICAvLyBjbGll
bnRJZCBhbmQgbm90aWZ5IHRoZW0gdGhhdCB0aGUgcmVjb3JkIHdhcyBsb2FkZWQuCi0gICAgdmFy
IG1hbnlBcnJheXMgPSByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXM7Ci0KLSAgICBpZiAobWFu
eUFycmF5cykgewotICAgICAgZm9yICh2YXIgaT0wLCBsPW1hbnlBcnJheXMubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgICAgICBtYW55QXJyYXlzW2ldLmxvYWRlZFJlY29yZCgpOwotICAgICAgfQot
Ci0gICAgICByZWNvcmQuX2xvYWRpbmdSZWNvcmRBcnJheXMgPSBbXTsKLSAgICB9Ci0gIH0sCi0K
LSAgLyoqCi0gICAgVXBkYXRlIGFuIGluZGl2aWR1YWwgZmlsdGVyLgotCi0gICAgQG1ldGhvZCB1
cGRhdGVSZWNvcmRBcnJheQotICAgIEBwYXJhbSB7RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0gYXJy
YXkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBl
Ci0gICAgQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBjbGllbnRJZAotICAqLwotICB1cGRhdGVSZWNv
cmRBcnJheTogZnVuY3Rpb24oYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFy
IHNob3VsZEJlSW5BcnJheTsKLQotICAgIGlmICghZmlsdGVyKSB7Ci0gICAgICBzaG91bGRCZUlu
QXJyYXkgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzaG91bGRCZUluQXJyYXkgPSBmaWx0
ZXIocmVjb3JkKTsKLSAgICB9Ci0KLSAgICB2YXIgcmVjb3JkQXJyYXlzID0gdGhpcy5yZWNvcmRB
cnJheXNGb3JSZWNvcmQocmVjb3JkKTsKLQotICAgIGlmIChzaG91bGRCZUluQXJyYXkpIHsKLSAg
ICAgIHJlY29yZEFycmF5cy5hZGQoYXJyYXkpOwotICAgICAgYXJyYXkuYWRkUmVjb3JkKHJlY29y
ZCk7Ci0gICAgfSBlbHNlIGlmICghc2hvdWxkQmVJbkFycmF5KSB7Ci0gICAgICByZWNvcmRBcnJh
eXMucmVtb3ZlKGFycmF5KTsKLSAgICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwotICAg
IH0KLSAgfSwKLQotICAvKioKLSAgICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGlmIHRoZSBgZmls
dGVyRnVuY3Rpb25gIHByb3BlcnR5IGlzCi0gICAgY2hhbmdlZCBvbiBhIGBEUy5GaWx0ZXJlZFJl
Y29yZEFycmF5YC4KLQotICAgIEl0IGVzc2VudGlhbGx5IHJlLXJ1bnMgdGhlIGZpbHRlciBmcm9t
IHNjcmF0Y2guIFRoaXMgc2FtZQotICAgIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIGZpbHRl
ciBpcyBjcmVhdGVkIGluIHRoIGZpcnN0IHBsYWNlLgotCi0gICAgQG1ldGhvZCB1cGRhdGVGaWx0
ZXIKLSAgICBAcGFyYW0gYXJyYXkKLSAgICBAcGFyYW0gdHlwZQotICAgIEBwYXJhbSBmaWx0ZXIK
LSAgKi8KLSAgdXBkYXRlRmlsdGVyOiBmdW5jdGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0g
ICAgdmFyIHR5cGVNYXAgPSB0aGlzLnN0b3JlLnR5cGVNYXBGb3IodHlwZSksCi0gICAgICAgIHJl
Y29yZHMgPSB0eXBlTWFwLnJlY29yZHMsIHJlY29yZDsKLQotICAgIGZvciAodmFyIGk9MCwgbD1y
ZWNvcmRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIHJlY29yZCA9IHJlY29yZHNbaV07Ci0K
LSAgICAgIGlmICghZ2V0KHJlY29yZCwgJ2lzRGVsZXRlZCcpICYmICFnZXQocmVjb3JkLCAnaXNF
bXB0eScpKSB7Ci0gICAgICAgIHRoaXMudXBkYXRlUmVjb3JkQXJyYXkoYXJyYXksIGZpbHRlciwg
dHlwZSwgcmVjb3JkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRl
IGEgYERTLk1hbnlBcnJheWAgZm9yIGEgdHlwZSBhbmQgbGlzdCBvZiByZWNvcmQgcmVmZXJlbmNl
cywgYW5kIGluZGV4Ci0gICAgdGhlIGBNYW55QXJyYXlgIHVuZGVyIGVhY2ggcmVmZXJlbmNlLiBU
aGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSByZW1vdmUKLSAgICByZWNvcmRzIGZyb20gYE1h
bnlBcnJheWBzIHdoZW4gdGhleSBhcmUgZGVsZXRlZC4KLQotICAgIEBtZXRob2QgY3JlYXRlTWFu
eUFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IHJlZmVy
ZW5jZXMKLSAgICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9Ci0gICovCi0gIGNyZWF0ZU1hbnlBcnJh
eTogZnVuY3Rpb24odHlwZSwgcmVjb3JkcykgewotICAgIHZhciBtYW55QXJyYXkgPSBEUy5NYW55
QXJyYXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiByZWNvcmRz
LAotICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAgICB9KTsKLQotICAgIGZvckVhY2gocmVjb3Jk
cywgZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgICB2YXIgYXJyYXlzID0gdGhpcy5yZWNvcmRBcnJh
eXNGb3JSZWNvcmQocmVjb3JkKTsKLSAgICAgIGFycmF5cy5hZGQobWFueUFycmF5KTsKLSAgICB9
LCB0aGlzKTsKLQotICAgIHJldHVybiBtYW55QXJyYXk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3Jl
YXRlIGEgYERTLlJlY29yZEFycmF5YCBmb3IgYSB0eXBlIGFuZCByZWdpc3RlciBpdCBmb3IgdXBk
YXRlcy4KLQotICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkQXJyYXkKLSAgICBAcGFyYW0ge0NsYXNz
fSB0eXBlCi0gICAgQHJldHVybiB7RFMuUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZVJlY29y
ZEFycmF5OiBmdW5jdGlvbih0eXBlKSB7Ci0gICAgdmFyIGFycmF5ID0gRFMuUmVjb3JkQXJyYXku
Y3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiBFbWJlci5BKCksCi0g
ICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAgICAgIGlzTG9hZGVkOiB0cnVlCi0gICAgfSk7Ci0K
LSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSk7Ci0KLSAg
ICByZXR1cm4gYXJyYXk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ3JlYXRlIGEgYERTLkZpbHRlcmVk
UmVjb3JkQXJyYXlgIGZvciBhIHR5cGUgYW5kIHJlZ2lzdGVyIGl0IGZvciB1cGRhdGVzLgotCi0g
ICAgQG1ldGhvZCBjcmVhdGVGaWx0ZXJlZFJlY29yZEFycmF5Ci0gICAgQHBhcmFtIHtDbGFzc30g
dHlwZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgotICAgIEByZXR1cm4ge0RTLkZpbHRl
cmVkUmVjb3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZUZpbHRlcmVkUmVjb3JkQXJyYXk6IGZ1bmN0
aW9uKHR5cGUsIGZpbHRlcikgewotICAgIHZhciBhcnJheSA9IERTLkZpbHRlcmVkUmVjb3JkQXJy
YXkuY3JlYXRlKHsKLSAgICAgIHR5cGU6IHR5cGUsCi0gICAgICBjb250ZW50OiBFbWJlci5BKCks
Ci0gICAgICBzdG9yZTogdGhpcy5zdG9yZSwKLSAgICAgIG1hbmFnZXI6IHRoaXMsCi0gICAgICBm
aWx0ZXJGdW5jdGlvbjogZmlsdGVyCi0gICAgfSk7Ci0KLSAgICB0aGlzLnJlZ2lzdGVyRmlsdGVy
ZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSwgZmlsdGVyKTsKLQotICAgIHJldHVybiBhcnJheTsK
LSAgfSwKLQotICAvKioKLSAgICBDcmVhdGUgYSBgRFMuQWRhcHRlclBvcHVsYXRlZFJlY29yZEFy
cmF5YCBmb3IgYSB0eXBlIHdpdGggZ2l2ZW4gcXVlcnkuCi0KLSAgICBAbWV0aG9kIGNyZWF0ZUFk
YXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheQotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBA
cGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcmV0dXJuIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVj
b3JkQXJyYXl9Ci0gICovCi0gIGNyZWF0ZUFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheTogZnVu
Y3Rpb24odHlwZSwgcXVlcnkpIHsKLSAgICByZXR1cm4gRFMuQWRhcHRlclBvcHVsYXRlZFJlY29y
ZEFycmF5LmNyZWF0ZSh7Ci0gICAgICB0eXBlOiB0eXBlLAotICAgICAgcXVlcnk6IHF1ZXJ5LAot
ICAgICAgY29udGVudDogRW1iZXIuQSgpLAotICAgICAgc3RvcmU6IHRoaXMuc3RvcmUKLSAgICB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZWdpc3RlciBhIFJlY29yZEFycmF5IGZvciBhIGdpdmVu
IHR5cGUgdG8gYmUgYmFja2VkIGJ5Ci0gICAgYSBmaWx0ZXIgZnVuY3Rpb24uIFRoaXMgd2lsbCBj
YXVzZSB0aGUgYXJyYXkgdG8gdXBkYXRlCi0gICAgYXV0b21hdGljYWxseSB3aGVuIHJlY29yZHMg
b2YgdGhhdCB0eXBlIGNoYW5nZSBhdHRyaWJ1dGUKLSAgICB2YWx1ZXMgb3Igc3RhdGVzLgotCi0g
ICAgQG1ldGhvZCByZWdpc3RlckZpbHRlcmVkUmVjb3JkQXJyYXkKLSAgICBAcGFyYW0ge0RTLlJl
Y29yZEFycmF5fSBhcnJheQotICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUKLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSBmaWx0ZXIKLSAgKi8KLSAgcmVnaXN0ZXJGaWx0ZXJlZFJlY29yZEFycmF5OiBmdW5j
dGlvbihhcnJheSwgdHlwZSwgZmlsdGVyKSB7Ci0gICAgdmFyIHJlY29yZEFycmF5cyA9IHRoaXMu
ZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUpOwotICAgIHJlY29yZEFycmF5cy5wdXNoKGFy
cmF5KTsKLQotICAgIHRoaXMudXBkYXRlRmlsdGVyKGFycmF5LCB0eXBlLCBmaWx0ZXIpOwotICB9
LAotCi0gIC8vIEludGVybmFsbHksIHdlIG1haW50YWluIGEgbWFwIG9mIGFsbCB1bmxvYWRlZCBJ
RHMgcmVxdWVzdGVkIGJ5Ci0gIC8vIGEgTWFueUFycmF5LiBBcyB0aGUgYWRhcHRlciBsb2FkcyBk
YXRhIGludG8gdGhlIHN0b3JlLCB0aGUKLSAgLy8gc3RvcmUgbm90aWZpZXMgYW55IGludGVyZXN0
ZWQgTWFueUFycmF5cy4gV2hlbiB0aGUgTWFueUFycmF5J3MKLSAgLy8gdG90YWwgbnVtYmVyIG9m
IGxvYWRpbmcgcmVjb3JkcyBkcm9wcyB0byB6ZXJvLCBpdCBiZWNvbWVzCi0gIC8vIGBpc0xvYWRl
ZGAgYW5kIGZpcmVzIGEgYGRpZExvYWRgIGV2ZW50LgotICByZWdpc3RlcldhaXRpbmdSZWNvcmRB
cnJheTogZnVuY3Rpb24ocmVjb3JkLCBhcnJheSkgewotICAgIHZhciBsb2FkaW5nUmVjb3JkQXJy
YXlzID0gcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzIHx8IFtdOwotICAgIGxvYWRpbmdSZWNv
cmRBcnJheXMucHVzaChhcnJheSk7Ci0gICAgcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzID0g
bG9hZGluZ1JlY29yZEFycmF5czsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0
LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgbWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwOwot
Ci12YXIgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJl
cicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107Ci0KLS8qKgotICBBIGBE
Uy5JbnZhbGlkRXJyb3JgIGlzIHVzZWQgYnkgYW4gYWRhcHRlciB0byBzaWduYWwgdGhlIGV4dGVy
bmFsIEFQSQotICB3YXMgdW5hYmxlIHRvIHByb2Nlc3MgYSByZXF1ZXN0IGJlY2F1c2UgdGhlIGNv
bnRlbnQgd2FzIG5vdAotICBzZW1hbnRpY2FsbHkgY29ycmVjdCBvciBtZWFuaW5nZnVsIHBlciB0
aGUgQVBJLiBVc3VhbGx5IHRoaXMgbWVhbnMgYQotICByZWNvcmQgZmFpbGVkIHNvbWUgZm9ybSBv
ZiBzZXJ2ZXIgc2lkZSB2YWxpZGF0aW9uLiBXaGVuIGEgcHJvbWlzZQotICBmcm9tIGFuIGFkYXB0
ZXIgaXMgcmVqZWN0ZWQgd2l0aCBhIGBEUy5JbnZhbGlkRXJyb3JgIHRoZSByZWNvcmQgd2lsbAot
ICB0cmFuc2l0aW9uIHRvIHRoZSBgaW52YWxpZGAgc3RhdGUgYW5kIHRoZSBlcnJvcnMgd2lsbCBi
ZSBzZXQgdG8gdGhlCi0gIGBlcnJvcnNgIHByb3BlcnR5IG9uIHRoZSByZWNvcmQuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJF
U1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAgYWpheEVycm9yOiBmdW5jdGlvbihqcVhIUikgewotICAg
ICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOwotCi0gICAgICBpZiAoanFYSFIgJiYg
anFYSFIuc3RhdHVzID09PSA0MjIpIHsKLSAgICAgICAgdmFyIGpzb25FcnJvcnMgPSBFbWJlci4k
LnBhcnNlSlNPTihqcVhIUi5yZXNwb25zZVRleHQpWyJlcnJvcnMiXTsKLSAgICAgICAgcmV0dXJu
IG5ldyBEUy5JbnZhbGlkRXJyb3IoanNvbkVycm9ycyk7Ci0gICAgICB9IGVsc2UgewotICAgICAg
ICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQGNsYXNz
IEludmFsaWRFcnJvcgotICBAbmFtZXNwYWNlIERTCi0qLwotRFMuSW52YWxpZEVycm9yID0gZnVu
Y3Rpb24oZXJyb3JzKSB7Ci0gIHZhciB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3Iu
Y2FsbCh0aGlzLCAiVGhlIGJhY2tlbmQgcmVqZWN0ZWQgdGhlIGNvbW1pdCBiZWNhdXNlIGl0IHdh
cyBpbnZhbGlkOiAiICsgRW1iZXIuaW5zcGVjdChlcnJvcnMpKTsKLSAgdGhpcy5lcnJvcnMgPSBl
cnJvcnM7Ci0KLSAgZm9yICh2YXIgaT0wLCBsPWVycm9yUHJvcHMubGVuZ3RoOyBpPGw7IGkrKykg
ewotICAgIHRoaXNbZXJyb3JQcm9wc1tpXV0gPSB0bXBbZXJyb3JQcm9wc1tpXV07Ci0gIH0KLX07
Ci1EUy5JbnZhbGlkRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKEVycm9yLnByb3RvdHlw
ZSk7Ci0KLS8qKgotICBBbiBhZGFwdGVyIGlzIGFuIG9iamVjdCB0aGF0IHJlY2VpdmVzIHJlcXVl
c3RzIGZyb20gYSBzdG9yZSBhbmQKLSAgdHJhbnNsYXRlcyB0aGVtIGludG8gdGhlIGFwcHJvcHJp
YXRlIGFjdGlvbiB0byB0YWtlIGFnYWluc3QgeW91cgotICBwZXJzaXN0ZW5jZSBsYXllci4gVGhl
IHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkgYW4gSFRUUCBBUEksIGJ1dAotICBtYXkgYmUg
YW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dzZXIncyBsb2NhbCBzdG9yYWdlLiBUeXBpY2FsbHkg
dGhlCi0gIGFkYXB0ZXIgaXMgbm90IGludm9rZWQgZGlyZWN0bHkgaW5zdGVhZCBpdHMgZnVuY3Rp
b25hbGl0eSBpcyBhY2Nlc3NlZAotICB0aHJvdWdoIHRoZSBgc3RvcmVgLgotCi0gICMjIyBDcmVh
dGluZyBhbiBBZGFwdGVyCi0KLSAgRmlyc3QsIGNyZWF0ZSBhIG5ldyBzdWJjbGFzcyBvZiBgRFMu
QWRhcHRlcmA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuTXlBZGFwdGVyID0gRFMuQWRhcHRl
ci5leHRlbmQoewotICAgIC8vIC4uLnlvdXIgY29kZSBoZXJlCi0gIH0pOwotICBgYGAKLQotICBU
byB0ZWxsIHlvdXIgc3RvcmUgd2hpY2ggYWRhcHRlciB0byB1c2UsIHNldCBpdHMgYGFkYXB0ZXJg
IHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLnN0b3JlID0gRFMuU3RvcmUuY3Jl
YXRlKHsKLSAgICBhZGFwdGVyOiAnTXlBZGFwdGVyJwotICB9KTsKLSAgYGBgCi0KLSAgYERTLkFk
YXB0ZXJgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCB5b3Ugc2hvdWxkIG92ZXJyaWRl
IGluIHlvdXIKLSAgYXBwbGljYXRpb24gdG8gY3VzdG9taXplIGl0IGZvciB5b3VyIGJhY2tlbmQu
IFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCi0gIHRoYXQgeW91IHNob3VsZCBpbXBsZW1lbnQg
aXM6Ci0KLSAgICAqIGBmaW5kKClgCi0gICAgKiBgY3JlYXRlUmVjb3JkKClgCi0gICAgKiBgdXBk
YXRlUmVjb3JkKClgCi0gICAgKiBgZGVsZXRlUmVjb3JkKClgCi0gICAgKiBgZmluZEFsbCgpYAot
ICAgICogYGZpbmRRdWVyeSgpYAotCi0gIFRvIGltcHJvdmUgdGhlIG5ldHdvcmsgcGVyZm9ybWFu
Y2Ugb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiBvcHRpbWl6ZQotICB5b3VyIGFkYXB0ZXIg
Ynkgb3ZlcnJpZGluZyB0aGVzZSBsb3dlci1sZXZlbCBtZXRob2RzOgotCi0gICAgKiBgZmluZE1h
bnkoKWAKLQotCi0gIEZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uLCBzZWUgYERTLlJFU1RB
ZGFwdGVyYCwgdGhlCi0gIGluY2x1ZGVkIFJFU1QgYWRhcHRlci4KLQotICBAY2xhc3MgQWRhcHRl
cgotICBAbmFtZXNwYWNlIERTCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLQotRFMuQWRh
cHRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotCi0gIC8qKgotICAgIElmIHlvdSB3b3VsZCBs
aWtlIHlvdXIgYWRhcHRlciB0byB1c2UgYSBjdXN0b20gc2VyaWFsaXplciB5b3UgY2FuCi0gICAg
c2V0IHRoZSBgZGVmYXVsdFNlcmlhbGl6ZXJgIHByb3BlcnR5IHRvIGJlIHRoZSBuYW1lIG9mIHRo
ZSBjdXN0b20KLSAgICBzZXJpYWxpemVyLgotCi0gICAgTm90ZSB0aGUgYGRlZmF1bHRTZXJpYWxp
emVyYCBzZXJpYWxpemVyIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoZW4KLSAgICBhIG1vZGVsIHNw
ZWNpZmljIHNlcmlhbGl6ZXIgKGkuZS4gYFBvc3RTZXJpYWxpemVyYCkgb3IgdGhlCi0gICAgYGFw
cGxpY2F0aW9uYCBzZXJpYWxpemVyLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBEamFu
Z29BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAgICAgZGVmYXVsdFNlcmlhbGl6ZXI6
ICdkamFuZ28nCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgZGVmYXVsdFNlcmlh
bGl6ZXIKLSAgICBAdHlwZSB7U3RyaW5nfQotICAqLwotCi0gIC8qKgotICAgIFRoZSBgZmluZCgp
YCBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzdG9yZSBpcyBhc2tlZCBmb3IgYSByZWNvcmQg
dGhhdAotICAgIGhhcyBub3QgcHJldmlvdXNseSBiZWVuIGxvYWRlZC4gSW4gcmVzcG9uc2UgdG8g
YGZpbmQoKWAgYmVpbmcgY2FsbGVkLCB5b3UKLSAgICBzaG91bGQgcXVlcnkgeW91ciBwZXJzaXN0
ZW5jZSBsYXllciBmb3IgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQuIE9uY2UKLSAgICBmb3Vu
ZCwgeW91IGNhbiBhc3luY2hyb25vdXNseSBjYWxsIHRoZSBzdG9yZSdzIGBwdXNoKClgIG1ldGhv
ZCB0byBwdXNoCi0gICAgdGhlIHJlY29yZCBpbnRvIHRoZSBzdG9yZS4KLQotICAgIEhlcmUgaXMg
YW4gZXhhbXBsZSBgZmluZGAgaW1wbGVtZW50YXRpb246Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZp
bmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgewotICAgICAgICB2YXIgdXJsID0gW3R5cGUs
IGlkXS5qb2luKCcvJyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2Uo
ZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmdldEpTT04odXJs
KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNv
bHZlLCBkYXRhKTsKLSAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewotICAgICAgICAgICAg
anFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2Vz
Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7Ci0gICAgICAgICAg
fSk7Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBmaW5kCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNz
IG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQHJldHVybiB7
UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiks
Ci0KLSAgLyoqCi0gICAgVGhlIGBmaW5kQWxsKClgIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB5b3Ug
Y2FsbCBgZmluZGAgb24gdGhlIHN0b3JlCi0gICAgd2l0aG91dCBhbiBJRCAoaS5lLiBgc3RvcmUu
ZmluZCgncG9zdCcpYCkuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
QXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmRB
bGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7Ci0gICAgICAgIHZhciB1cmwg
PSB0eXBlOwotICAgICAgICB2YXIgcXVlcnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0gICAg
ICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVj
dCkgewotICAgICAgICAgIGpRdWVyeS5nZXRKU09OKHVybCwgcXVlcnkpLnRoZW4oZnVuY3Rpb24o
ZGF0YSkgewotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAg
ICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVs
bDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVt
YmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
ZmluZEFsbAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kQWxsOiBudWxsLAotCi0gIC8q
KgotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHlvdSBjYWxsIGBmaW5kYCBvbiB0aGUg
c3RvcmUgd2l0aCBhCi0gICAgcXVlcnkgb2JqZWN0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIChp
LmUuIGBzdG9yZS5maW5kKCdwZXJzb24nLCB7Ci0gICAgcGFnZTogMSB9KWApLgotCi0gICAgRXhh
bXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBE
Uy5BZGFwdGVyLmV4dGVuZCh7Ci0gICAgICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl
LCBxdWVyeSkgewotICAgICAgICB2YXIgdXJsID0gdHlwZTsKLSAgICAgICAgcmV0dXJuIG5ldyBF
bWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAg
alF1ZXJ5LmdldEpTT04odXJsLCBxdWVyeSkudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAg
ICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7Ci0gICAgICAgICAgfSwgZnVuY3Rp
b24oanFYSFIpIHsKLSAgICAgICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVy
eSdzIGlsbCBtYW5uZXJlZCBwcm9taXNlcwotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJl
amVjdCwganFYSFIpOwotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9
KTsKLSAgICBgYGAKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBA
cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9
IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gcXVlcnkKLSAgICBAcGFyYW0ge0RTLkFkYXB0ZXJQ
b3B1bGF0ZWRSZWNvcmRBcnJheX0gcmVjb3JkQXJyYXkKLSAgICBAcmV0dXJuIHtQcm9taXNlfSBw
cm9taXNlCi0gICovCi0gIGZpbmRRdWVyeTogbnVsbCwKLQotICAvKioKLSAgICBJZiB0aGUgZ2xv
YmFsbHkgdW5pcXVlIElEcyBmb3IgeW91ciByZWNvcmRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb24g
dGhlIGNsaWVudCwKLSAgICBpbXBsZW1lbnQgdGhlIGBnZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1l
dGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gICAgZWFjaCB0aW1lIHlvdSBjcmVh
dGUgYSBuZXcgcmVjb3JkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gaXQgd2lsbCBiZQot
ICAgIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQncyBgcHJpbWFyeUtleWAuCi0KLSAgICBNb3N0IHRy
YWRpdGlvbmFsIFJFU1QtbGlrZSBIVFRQIEFQSXMgd2lsbCBub3QgdXNlIHRoaXMgbWV0aG9kLiBJ
bnN0ZWFkLCB0aGUgSUQKLSAgICBvZiB0aGUgcmVjb3JkIHdpbGwgYmUgc2V0IGJ5IHRoZSBzZXJ2
ZXIsIGFuZCB5b3VyIGFkYXB0ZXIgd2lsbCB1cGRhdGUgdGhlIHN0b3JlCi0gICAgd2l0aCB0aGUg
bmV3IElEIHdoZW4gaXQgY2FsbHMgYGRpZENyZWF0ZVJlY29yZCgpYC4gT25seSBpbXBsZW1lbnQg
dGhpcyBtZXRob2QgaWYKLSAgICB5b3UgaW50ZW5kIHRvIGdlbmVyYXRlIHJlY29yZCBJRHMgb24g
dGhlIGNsaWVudC1zaWRlLgotCi0gICAgVGhlIGBnZW5lcmF0ZUlkRm9yUmVjb3JkKClgIG1ldGhv
ZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmVxdWVzdGluZyBzdG9yZSBhcwotICAgIHRoZSBm
aXJzdCBwYXJhbWV0ZXIgYW5kIHRoZSBuZXdseSBjcmVhdGVkIHJlY29yZCBhcyB0aGUgc2Vjb25k
IHBhcmFtZXRlcjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBnZW5lcmF0ZUlkRm9yUmVjb3Jk
OiBmdW5jdGlvbihzdG9yZSwgcmVjb3JkKSB7Ci0gICAgICB2YXIgdXVpZCA9IEFwcC5nZW5lcmF0
ZVVVSURXaXRoU3RhdGlzdGljYWxseUxvd09kZHNPZkNvbGxpc2lvbigpOwotICAgICAgcmV0dXJu
IHV1aWQ7Ci0gICAgfQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3Jk
Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNv
cmQKLSAgICBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfSBpZAotICAqLwotICBnZW5lcmF0ZUlkRm9y
UmVjb3JkOiBudWxsLAotCi0gIC8qKgotICAgIFByb3hpZXMgdG8gdGhlIHNlcmlhbGl6ZXIncyBg
c2VyaWFsaXplYCBtZXRob2QuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGNy
ZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIg
ZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAg
ICAgIHZhciB1cmwgPSB0eXBlOwotCi0gICAgICAgIC8vIC4uLgotICAgICAgfQotICAgIH0pOwot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxpemUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSBy
ZWNvcmQKLSAgICBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zCi0gICAgQHJldHVybiB7T2JqZWN0
fSBzZXJpYWxpemVkIHJlY29yZAotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwg
b3B0aW9ucykgewotICAgIHJldHVybiBnZXQocmVjb3JkLCAnc3RvcmUnKS5zZXJpYWxpemVyRm9y
KHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5KS5zZXJpYWxpemUocmVjb3JkLCBvcHRpb25zKTsK
LSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyB0
byBoYW5kbGUgdGhlIGNyZWF0aW9uIG9mCi0gICAgbmV3IHJlY29yZHMuCi0KLSAgICBTZXJpYWxp
emVzIHRoZSByZWNvcmQgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KLQotICAgIEV4YW1wbGUK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRpb25BZGFwdGVyID0gRFMuQWRh
cHRlci5leHRlbmQoewotICAgICAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg
cmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCB7IGlu
Y2x1ZGVJZDogdHJ1ZSB9KTsKLSAgICAgICAgdmFyIHVybCA9IHR5cGU7Ci0KLSAgICAgICAgcmV0
dXJuIG5ldyBFbWJlci5SU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0g
ICAgICAgICAgalF1ZXJ5LmFqYXgoewotICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAotICAgICAg
ICAgICAgdXJsOiB1cmwsCi0gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAotICAgICAgICAg
ICAgZGF0YTogZGF0YQotICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewotICAgICAg
ICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAgICAgICAgIH0sIGZ1bmN0
aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVl
cnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCBy
ZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMu
U3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZSAgIHRo
ZSBEUy5Nb2RlbCBjbGFzcyBvZiB0aGUgcmVjb3JkCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVj
b3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6
IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBt
ZXRob2QgaW4gYSBzdWJjbGFzcyB0byBoYW5kbGUgdGhlIHVwZGF0aW5nIG9mCi0gICAgYSByZWNv
cmQuCi0KLSAgICBTZXJpYWxpemVzIHRoZSByZWNvcmQgdXBkYXRlIGFuZCBzZW5kIGl0IHRvIHRo
ZSBzZXJ2ZXIuCi0KLSAgICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFw
cGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIHVwZGF0ZVJlY29y
ZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2YXIgZGF0YSA9IHRo
aXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHZhciBp
ZCA9IHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgICAgIHZhciB1cmwgPSBbdHlwZSwgaWRdLmpvaW4o
Jy8nKTsKLQotICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihy
ZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBqUXVlcnkuYWpheCh7Ci0gICAgICAgICAgICB0
eXBlOiAnUFVUJywKLSAgICAgICAgICAgIHVybDogdXJsLAotICAgICAgICAgICAgZGF0YVR5cGU6
ICdqc29uJywKLSAgICAgICAgICAgIGRhdGE6IGRhdGEKLSAgICAgICAgICB9KS50aGVuKGZ1bmN0
aW9uKGRhdGEpIHsKLSAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCBkYXRhKTsK
LSAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewotICAgICAgICAgICAganFYSFIudGhlbiA9
IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1hbm5lcmVkIHByb21pc2VzCi0gICAgICAgICAg
ICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7Ci0gICAgICAgICAgfSk7Ci0gICAgICAg
IH0pOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUgICB0aGUgRFMuTW9kZWwgY2xhc3Mgb2YgdGhlIHJlY29yZAotICAgIEBw
YXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAg
Ki8KLSAgdXBkYXRlUmVjb3JkOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCi0KLSAgLyoqCi0g
ICAgSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgdG8gaGFuZGxlIHRoZSBkZWxl
dGlvbiBvZgotICAgIGEgcmVjb3JkLgotCi0gICAgU2VuZHMgYSBkZWxldGUgcmVxdWVzdCBmb3Ig
dGhlIHJlY29yZCB0byB0aGUgc2VydmVyLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0g
ICAgICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICAg
ICAgdmFyIGRhdGEgPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0p
OwotICAgICAgICB2YXIgaWQgPSByZWNvcmQuZ2V0KCdpZCcpOwotICAgICAgICB2YXIgdXJsID0g
W3R5cGUsIGlkXS5qb2luKCcvJyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5SU1ZQLlBy
b21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAgICAgalF1ZXJ5LmFqYXgo
ewotICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsCi0gICAgICAgICAgICB1cmw6IHVybCwKLSAg
ICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCi0gICAgICAgICAgICBkYXRhOiBkYXRhCi0gICAg
ICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgICAgICBFbWJlci5ydW4obnVs
bCwgcmVzb2x2ZSwgZGF0YSk7Ci0gICAgICAgICAgfSwgZnVuY3Rpb24oanFYSFIpIHsKLSAgICAg
ICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBw
cm9taXNlcwotICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVjdCwganFYSFIpOwotICAg
ICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IEBtZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBA
cGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9m
IHRoZSByZWNvcmQKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJuIHtQ
cm9taXNlfSBwcm9taXNlCi0gICovCi0gIGRlbGV0ZVJlY29yZDogRW1iZXIucmVxdWlyZWQoRnVu
Y3Rpb24pLAotCi0gIC8qKgotICAgIEZpbmQgbXVsdGlwbGUgcmVjb3JkcyBhdCBvbmNlLgotCi0g
ICAgQnkgZGVmYXVsdCwgaXQgbG9vcHMgb3ZlciB0aGUgcHJvdmlkZWQgaWRzIGFuZCBjYWxscyBg
ZmluZGAgb24gZWFjaC4KLSAgICBNYXkgYmUgb3ZlcndyaXR0ZW4gdG8gaW1wcm92ZSBwZXJmb3Jt
YW5jZSBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YKLSAgICBzZXJ2ZXIgcmVxdWVzdHMuCi0KLSAg
ICBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRl
ciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKLSAgICAgIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgaWRzKSB7Ci0gICAgICAgIHZhciB1cmwgPSB0eXBlOwotICAgICAgICByZXR1cm4gbmV3
IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAg
ICBqUXVlcnkuZ2V0SlNPTih1cmwsIHtpZHM6IGlkc30pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewot
ICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwotICAgICAgICAgIH0s
IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFt
ZSBqUXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKLSAgICAgICAgICAgIEVtYmVyLnJ1bihu
dWxsLCByZWplY3QsIGpxWEhSKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGZpbmRNYW55Ci0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlICAg
dGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNvcmRzCi0gICAgQHBhcmFtIHtBcnJheX0gICAg
aWRzCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kTWFueTogZnVu
Y3Rpb24oc3RvcmUsIHR5cGUsIGlkcykgewotICAgIHZhciBwcm9taXNlcyA9IG1hcC5jYWxsKGlk
cywgZnVuY3Rpb24oaWQpIHsKLSAgICAgIHJldHVybiB0aGlzLmZpbmQoc3RvcmUsIHR5cGUsIGlk
KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBFbWJlci5SU1ZQLmFsbChwcm9taXNlcyk7
Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUg
ZW1iZXItZGF0YQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgZm10ID0gRW1iZXIuU3RyaW5n
LmZtdCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0KLXZh
ciBjb3VudGVyID0gMDsKLQotLyoqCi0gIGBEUy5GaXh0dXJlQWRhcHRlcmAgaXMgYW4gYWRhcHRl
ciB0aGF0IGxvYWRzIHJlY29yZHMgZnJvbSBtZW1vcnkuCi0gIEl0cyBwcmltYXJpbHkgdXNlZCBm
b3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuIFlvdSBjYW4gYWxzbyB1c2UKLSAgYERTLkZpeHR1
cmVBZGFwdGVyYCB3aGlsZSB3b3JraW5nIG9uIHRoZSBBUEkgYnV0IGFyZSBub3QgcmVhZHkgdG8K
LSAgaW50ZWdyYXRlIHlldC4gSXQgaXMgYSBmdWxseSBmdW5jdGlvbmluZyBhZGFwdGVyLiBBbGwg
Q1JVRCBtZXRob2RzCi0gIGFyZSBpbXBsZW1lbnRlZC4gWW91IGNhbiBhbHNvIGltcGxlbWVudCBx
dWVyeSBsb2dpYyB0aGF0IGEgcmVtb3RlCi0gIHN5c3RlbSB3b3VsZCBkby4gSXRzIHBvc3NpYmxl
IHRvIGRvIGRldmVsb3AgeW91ciBlbnRpcmUgYXBwbGljYXRpb24KLSAgd2l0aCBgRFMuRml4dHVy
ZUFkYXB0ZXJgLgotCi0gIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBgRml4dHVy
ZUFkYXB0ZXJgIGluIHlvdXIKLSAgYXBwbGljYXRpb24gcGxlYXNlIHNlZSB0aGUgW0ZpeHR1cmVB
ZGFwdGVyCi0gIGd1aWRlXSgvZ3VpZGVzL21vZGVscy90aGUtZml4dHVyZS1hZGFwdGVyLykuCi0K
LSAgQGNsYXNzIEZpeHR1cmVBZGFwdGVyCi0gIEBuYW1lc3BhY2UgRFMKLSAgQGV4dGVuZHMgRFMu
QWRhcHRlcgotKi8KLURTLkZpeHR1cmVBZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewotICAv
LyBieSBkZWZhdWx0LCBmaXh0dXJlcyBhcmUgYWxyZWFkeSBpbiBub3JtYWxpemVkIGZvcm0KLSAg
c2VyaWFsaXplcjogbnVsbCwKLQotICAvKioKLSAgICBJZiBgc2ltdWxhdGVSZW1vdGVSZXNwb25z
ZWAgaXMgYHRydWVgIHRoZSBgRml4dHVyZUFkYXB0ZXJgIHdpbGwKLSAgICB3YWl0IGEgbnVtYmVy
IG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGggdGhlCi0gICAg
Zml4dHVyZSB2YWx1ZXMuIFRoZSB3YWl0IHRpbWUgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBg
bGF0ZW5jeWAKLSAgICBwcm9wZXJ0eS4KLQotICAgIEBwcm9wZXJ0eSBzaW11bGF0ZVJlbW90ZVJl
c3BvbnNlCi0gICAgQHR5cGUge0Jvb2xlYW59Ci0gICAgQGRlZmF1bHQgdHJ1ZQotICAqLwotICBz
aW11bGF0ZVJlbW90ZVJlc3BvbnNlOiB0cnVlLAotCi0gIC8qKgotICAgIEJ5IGRlZmF1bHQgdGhl
IGBGaXh0dXJlQWRhcHRlcmAgd2lsbCBzaW11bGF0ZSBhIHdhaXQgb2YgdGhlCi0gICAgYGxhdGVu
Y3lgIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2VzIHdpdGggdGhlIGZpeHR1
cmUKLSAgICB2YWx1ZXMuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHR1cm5lZCBvZmYgdmlhIHRoZQot
ICAgIGBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlYCBwcm9wZXJ0eS4KLQotICAgIEBwcm9wZXJ0eSBs
YXRlbmN5Ci0gICAgQHR5cGUge051bWJlcn0KLSAgICBAZGVmYXVsdCA1MAotICAqLwotICBsYXRl
bmN5OiA1MCwKLQotICAvKioKLSAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8g
cHJvdmlkZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUKLQotICAgIEBtZXRob2QgZml4dHVy
ZXNGb3JUeXBlCi0gICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBy
ZXR1cm4ge0FycmF5fQotICAqLwotICBmaXh0dXJlc0ZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsK
LSAgICBpZiAodHlwZS5GSVhUVVJFUykgewotICAgICAgdmFyIGZpeHR1cmVzID0gRW1iZXIuQSh0
eXBlLkZJWFRVUkVTKTsKLSAgICAgIHJldHVybiBmaXh0dXJlcy5tYXAoZnVuY3Rpb24oZml4dHVy
ZSl7Ci0gICAgICAgIHZhciBmaXh0dXJlSWRUeXBlID0gdHlwZW9mIGZpeHR1cmUuaWQ7Ci0gICAg
ICAgIGlmKGZpeHR1cmVJZFR5cGUgIT09ICJudW1iZXIiICYmIGZpeHR1cmVJZFR5cGUgIT09ICJz
dHJpbmciKXsKLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZm10KCd0aGUgaWQgcHJvcGVydHkg
bXVzdCBiZSBkZWZpbmVkIGFzIGEgbnVtYmVyIG9yIHN0cmluZyBmb3IgZml4dHVyZSAlQCcsIFtm
aXh0dXJlXSkpOwotICAgICAgICB9Ci0gICAgICAgIGZpeHR1cmUuaWQgPSBmaXh0dXJlLmlkICsg
Jyc7Ci0gICAgICAgIHJldHVybiBmaXh0dXJlOwotICAgICAgfSk7Ci0gICAgfQotICAgIHJldHVy
biBudWxsOwotICB9LAotCi0gIC8qKgotICAgIEltcGxlbWVudCB0aGlzIG1ldGhvZCBpbiBvcmRl
ciB0byBxdWVyeSBmaXh0dXJlcyBkYXRhCi0KLSAgICBAbWV0aG9kIHF1ZXJ5Rml4dHVyZXMKLSAg
ICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAg
QHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEByZXR1cm4ge1Byb21pc2V8
QXJyYXl9Ci0gICovCi0gIHF1ZXJ5Rml4dHVyZXM6IGZ1bmN0aW9uKGZpeHR1cmVzLCBxdWVyeSwg
dHlwZSkgewotICAgIEVtYmVyLmFzc2VydCgnTm90IGltcGxlbWVudGVkOiBZb3UgbXVzdCBvdmVy
cmlkZSB0aGUgRFMuRml4dHVyZUFkYXB0ZXI6OnF1ZXJ5Rml4dHVyZXMgbWV0aG9kIHRvIHN1cHBv
cnQgcXVlcnlpbmcgdGhlIGZpeHR1cmUgc3RvcmUuJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCB1cGRhdGVGaXh0dXJlcwotICAgIEBwYXJhbSB7U3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5
cGUKLSAgICBAcGFyYW0ge0FycmF5fSBmaXh0dXJlCi0gICovCi0gIHVwZGF0ZUZpeHR1cmVzOiBm
dW5jdGlvbih0eXBlLCBmaXh0dXJlKSB7Ci0gICAgaWYoIXR5cGUuRklYVFVSRVMpIHsKLSAgICAg
IHR5cGUuRklYVFVSRVMgPSBbXTsKLSAgICB9Ci0KLSAgICB2YXIgZml4dHVyZXMgPSB0eXBlLkZJ
WFRVUkVTOwotCi0gICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOwot
Ci0gICAgZml4dHVyZXMucHVzaChmaXh0dXJlKTsKLSAgfSwKLQotICAvKioKLSAgICBJbXBsZW1l
bnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBqc29uIGZvciBDUlVEIG1ldGhvZHMK
LQotICAgIEBtZXRob2QgbW9ja0pTT04KLSAgICBAcGFyYW0ge1N1YmNsYXNzIG9mIERTLk1vZGVs
fSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICovCi0gIG1vY2tKU09OOiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgcmV0dXJuIHN0b3JlLnNlcmlhbGl6
ZXJGb3IodHlwZSkuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUlkRm9yUmVjb3JkCi0gICAgQHBhcmFtIHtE
Uy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJu
IHtTdHJpbmd9IGlkCi0gICovCi0gIGdlbmVyYXRlSWRGb3JSZWNvcmQ6IGZ1bmN0aW9uKHN0b3Jl
KSB7Ci0gICAgcmV0dXJuICJmaXh0dXJlLSIgKyBjb3VudGVyKys7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgQG1ldGhvZCBmaW5kCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0g
e3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAg
QHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgaWQpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0eXBl
KSwKLSAgICAgICAgZml4dHVyZTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQg
Zml4dHVyZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQot
ICAgIGlmIChmaXh0dXJlcykgewotICAgICAgZml4dHVyZSA9IEVtYmVyLkEoZml4dHVyZXMpLmZp
bmRQcm9wZXJ0eSgnaWQnLCBpZCk7Ci0gICAgfQotCi0gICAgaWYgKGZpeHR1cmUpIHsKLSAgICAg
IHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0
dXJuIGZpeHR1cmU7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IGlkcwotICAg
IEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0
b3JlLCB0eXBlLCBpZHMpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlw
ZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9y
IG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGlmIChmaXh0
dXJlcykgewotICAgICAgZml4dHVyZXMgPSBmaXh0dXJlcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkg
ewotICAgICAgICByZXR1cm4gaW5kZXhPZihpZHMsIGl0ZW0uaWQpICE9PSAtMTsKLSAgICAgIH0p
OwotICAgIH0KLQotICAgIGlmIChmaXh0dXJlcykgewotICAgICAgcmV0dXJuIHRoaXMuc2ltdWxh
dGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gZml4dHVyZXM7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIGZpbmRBbGwKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3Vi
Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30gc2luY2VUb2tlbgot
ICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEFsbDogZnVuY3Rpb24o
c3RvcmUsIHR5cGUpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9yVHlwZSh0
eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1v
ZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIHJldHVybiB0aGlz
LnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBmaXh0dXJlczsK
LSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
ZmluZFF1ZXJ5Ci0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNs
YXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5Ci0gICAgQHBh
cmFtIHtEUy5BZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9IHJlY29yZEFycmF5Ci0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3Jl
LCB0eXBlLCBxdWVyeSwgYXJyYXkpIHsKLSAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVz
Rm9yVHlwZSh0eXBlKTsKLQotICAgIEVtYmVyLmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVy
ZXMgZm9yIG1vZGVsIHR5cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKLQotICAgIGZp
eHR1cmVzID0gdGhpcy5xdWVyeUZpeHR1cmVzKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSk7Ci0KLSAg
ICBpZiAoZml4dHVyZXMpIHsKLSAgICAgIHJldHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChm
dW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpeHR1cmVzOwotICAgICAgfSwgdGhpcyk7Ci0g
ICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkCi0gICAgQHBhcmFt
IHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl
Ci0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHJldHVybiB7UHJvbWlzZX0gcHJv
bWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQp
IHsKLSAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9ja0pTT04oc3RvcmUsIHR5cGUsIHJlY29yZCk7
Ci0KLSAgICB0aGlzLnVwZGF0ZUZpeHR1cmVzKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0dXJu
IHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIGZpeHR1
cmU7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCB1cGRhdGVSZWNv
cmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2Yg
RFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcmV0dXJu
IHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUs
IHR5cGUsIHJlY29yZCkgewotICAgIHZhciBmaXh0dXJlID0gdGhpcy5tb2NrSlNPTihzdG9yZSwg
dHlwZSwgcmVjb3JkKTsKLQotICAgIHRoaXMudXBkYXRlRml4dHVyZXModHlwZSwgZml4dHVyZSk7
Ci0KLSAgICByZXR1cm4gdGhpcy5zaW11bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24oKSB7Ci0gICAg
ICByZXR1cm4gZml4dHVyZTsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0
aG9kIGRlbGV0ZVJlY29yZAotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFt
IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y
ZAotICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZGVsZXRlUmVjb3JkOiBm
dW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1v
Y2tKU09OKHN0b3JlLCB0eXBlLCByZWNvcmQpOwotCi0gICAgdGhpcy5kZWxldGVMb2FkZWRGaXh0
dXJlKHR5cGUsIGZpeHR1cmUpOwotCi0gICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1vdGVDYWxs
KGZ1bmN0aW9uKCkgewotICAgICAgLy8gbm8gcGF5bG9hZCBpbiBhIGRlbGV0aW9uCi0gICAgICBy
ZXR1cm4gbnVsbDsKLSAgICB9KTsKLSAgfSwKLQotICAvKgotICAgIEBtZXRob2QgZGVsZXRlTG9h
ZGVkRml4dHVyZQotICAgIEBwcml2YXRlCi0gICAgQHBhcmFtIHR5cGUKLSAgICBAcGFyYW0gcmVj
b3JkCi0gICovCi0gIGRlbGV0ZUxvYWRlZEZpeHR1cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkg
ewotICAgIHZhciBleGlzdGluZ0ZpeHR1cmUgPSB0aGlzLmZpbmRFeGlzdGluZ0ZpeHR1cmUodHlw
ZSwgcmVjb3JkKTsKLQotICAgIGlmKGV4aXN0aW5nRml4dHVyZSkgewotICAgICAgdmFyIGluZGV4
ID0gaW5kZXhPZih0eXBlLkZJWFRVUkVTLCBleGlzdGluZ0ZpeHR1cmUpOwotICAgICAgdHlwZS5G
SVhUVVJFUy5zcGxpY2UoaW5kZXgsIDEpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9
LAotCi0gIC8qCi0gICAgQG1ldGhvZCBmaW5kRXhpc3RpbmdGaXh0dXJlCi0gICAgQHByaXZhdGUK
LSAgICBAcGFyYW0gdHlwZQotICAgIEBwYXJhbSByZWNvcmQKLSAgKi8KLSAgZmluZEV4aXN0aW5n
Rml4dHVyZTogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGZpeHR1cmVzID0gdGhp
cy5maXh0dXJlc0ZvclR5cGUodHlwZSk7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7
Ci0KLSAgICByZXR1cm4gdGhpcy5maW5kRml4dHVyZUJ5SWQoZml4dHVyZXMsIGlkKTsKLSAgfSwK
LQotICAvKgotICAgIEBtZXRob2QgZmluZEZpeHR1cmVCeUlkCi0gICAgQHByaXZhdGUKLSAgICBA
cGFyYW0gZml4dHVyZXMKLSAgICBAcGFyYW0gaWQKLSAgKi8KLSAgZmluZEZpeHR1cmVCeUlkOiBm
dW5jdGlvbihmaXh0dXJlcywgaWQpIHsKLSAgICByZXR1cm4gRW1iZXIuQShmaXh0dXJlcykuZmlu
ZChmdW5jdGlvbihyKSB7Ci0gICAgICBpZignJytnZXQociwgJ2lkJykgPT09ICcnK2lkKSB7Ci0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIC8qCi0gICAgQG1ldGhvZCBzaW11bGF0ZVJl
bW90ZUNhbGwKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSBjYWxsYmFjawotICAgIEBwYXJhbSBj
b250ZXh0Ci0gICovCi0gIHNpbXVsYXRlUmVtb3RlQ2FsbDogZnVuY3Rpb24oY2FsbGJhY2ssIGNv
bnRleHQpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVy
LlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7Ci0gICAgICBpZiAoZ2V0KGFkYXB0ZXIs
ICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsKLSAgICAgICAgLy8gU2NoZWR1bGUgd2l0aCBz
ZXRUaW1lb3V0Ci0gICAgICAgIEVtYmVyLnJ1bi5sYXRlcihmdW5jdGlvbigpIHsKLSAgICAgICAg
ICByZXNvbHZlKGNhbGxiYWNrLmNhbGwoY29udGV4dCkpOwotICAgICAgICB9LCBnZXQoYWRhcHRl
ciwgJ2xhdGVuY3knKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBBc3luY2hyb25vdXMs
IGJ1dCBhdCB0aGUgb2YgdGhlIHJ1bmxvb3Agd2l0aCB6ZXJvIGxhdGVuY3kKLSAgICAgICAgRW1i
ZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgbnVsbCwgZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
cmVzb2x2ZShjYWxsYmFjay5jYWxsKGNvbnRleHQpKTsKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0g
ICAgfSwgIkRTOiBGaXh0dXJlQWRhcHRlciNzaW11bGF0ZVJlbW90ZUNhbGwiKTsKLSAgfQotfSk7
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRh
Ci0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFj
aCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Ci12YXIgbWFwID0gRW1iZXIuQXJyYXlQ
b2x5ZmlsbHMubWFwOwotCi1mdW5jdGlvbiBjb2VyY2VJZChpZCkgewotICByZXR1cm4gaWQgPT0g
bnVsbCA/IG51bGwgOiBpZCsnJzsKLX0KLQotLyoqCi0gIE5vcm1hbGx5LCBhcHBsaWNhdGlvbnMg
d2lsbCB1c2UgdGhlIGBSRVNUU2VyaWFsaXplcmAgYnkgaW1wbGVtZW50aW5nCi0gIHRoZSBgbm9y
bWFsaXplYCBtZXRob2QgYW5kIGluZGl2aWR1YWwgbm9ybWFsaXphdGlvbnMgdW5kZXIKLSAgYG5v
cm1hbGl6ZUhhc2hgLgotCi0gIFRoaXMgYWxsb3dzIHlvdSB0byBkbyB3aGF0ZXZlciBraW5kIG9m
IG11bmdpbmcgeW91IG5lZWQsIGFuZCBpcwotICBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3VyIHNl
cnZlciBpcyBpbmNvbnNpc3RlbnQgYW5kIHlvdSBuZWVkIHRvCi0gIGRvIG11bmdpbmcgZGlmZmVy
ZW50bHkgZm9yIG1hbnkgZGlmZmVyZW50IGtpbmRzIG9mIHJlc3BvbnNlcy4KLQotICBTZWUgdGhl
IGBub3JtYWxpemVgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgIyMg
QWNyb3NzIHRoZSBCb2FyZCBOb3JtYWxpemF0aW9uCi0KLSAgVGhlcmUgYXJlIGFsc28gYSBudW1i
ZXIgb2YgaG9va3MgdGhhdCB5b3UgbWlnaHQgZmluZCB1c2VmdWwgdG8gZGVmaW5lZAotICBhY3Jv
c3MtdGhlLWJvYXJkIHJ1bGVzIGZvciB5b3VyIHBheWxvYWQuIFRoZXNlIHJ1bGVzIHdpbGwgYmUg
dXNlZnVsCi0gIGlmIHlvdXIgc2VydmVyIGlzIGNvbnNpc3RlbnQsIG9yIGlmIHlvdSdyZSBidWls
ZGluZyBhbiBhZGFwdGVyIGZvcgotICBhbiBpbmZyYXN0cnVjdHVyZSBzZXJ2aWNlLCBsaWtlIFBh
cnNlLCBhbmQgd2FudCB0byBlbmNvZGUgc2VydmljZQotICBjb252ZW50aW9ucy4KLQotICBGb3Ig
ZXhhbXBsZSwgaWYgYWxsIG9mIHlvdXIga2V5cyBhcmUgdW5kZXJzY29yZWQgYW5kIGFsbC1jYXBz
LCBidXQKLSAgb3RoZXJ3aXNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgbmFtZXMgeW91IHVzZSBpbiB5
b3VyIG1vZGVscywgeW91Ci0gIGNhbiBpbXBsZW1lbnQgYWNyb3NzLXRoZS1ib2FyZCBydWxlcyBm
b3IgaG93IHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlCi0gIG5hbWUgaW4geW91ciBtb2RlbCB0byBh
IGtleSBpbiB5b3VyIEpTT04uCi0KLSAgYGBganMKLSAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXpl
ciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAga2V5Rm9yQXR0cmlidXRlOiBmdW5j
dGlvbihhdHRyKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmUoYXR0ciku
dG9VcHBlckNhc2UoKTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBZb3UgY2FuIGFsc28gaW1w
bGVtZW50IGBrZXlGb3JSZWxhdGlvbnNoaXBgLCB3aGljaCB0YWtlcyB0aGUgbmFtZQotICBvZiB0
aGUgcmVsYXRpb25zaGlwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFuZCB0aGUga2luZCBvZgot
ICByZWxhdGlvbnNoaXAgKGBoYXNNYW55YCBvciBgYmVsb25nc1RvYCkgYXMgdGhlIHNlY29uZCBw
YXJhbWV0ZXIuCi0KLSAgQGNsYXNzIFJFU1RTZXJpYWxpemVyCi0gIEBuYW1lc3BhY2UgRFMKLSAg
QGV4dGVuZHMgRFMuSlNPTlNlcmlhbGl6ZXIKLSovCi1EUy5SRVNUU2VyaWFsaXplciA9IERTLkpT
T05TZXJpYWxpemVyLmV4dGVuZCh7Ci0gIC8qKgotICAgIElmIHlvdSB3YW50IHRvIGRvIG5vcm1h
bGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwgeW91Ci0gICAg
Y2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hgLgotCi0gICAgRm9yIGV4YW1w
bGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcganNvbiB3aGVyZSB0aGUgdGhlIGBJRHNgIHVuZGVyCi0g
ICAgYCJjb21tZW50cyJgIGFyZSBwcm92aWRlZCBhcyBgX2lkYCBpbnN0ZWFkIG9mIGBpZGAuCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgewotICAgICAgInBvc3QiOiB7Ci0gICAgICAgICJpZCI6
IDEsCi0gICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICAgImNvbW1l
bnRzIjogWyAxLCAyIF0KLSAgICAgIH0sCi0gICAgICAiY29tbWVudHMiOiBbewotICAgICAgICAi
X2lkIjogMSwKLSAgICAgICAgImJvZHkiOiAiRklSU1QiCi0gICAgICB9LCB7Ci0gICAgICAgICJf
aWQiOiAyLAotICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgIH1dCi0gICAg
fQotICAgIGBgYAotCi0gICAgWW91IHVzZSBgbm9ybWFsaXplSGFzaGAgdG8gbm9ybWFsaXplIGp1
c3QgdGhlIGNvbW1lbnRzOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0U2VyaWFs
aXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICBub3JtYWxpemVIYXNoOiB7
Ci0gICAgICAgIGNvbW1lbnRzOiBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgICAgaGFzaC5pZCA9
IGhhc2guX2lkOwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICByZXR1cm4g
aGFzaDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhlIGtl
eSB1bmRlciBgbm9ybWFsaXplSGFzaGAgaXMgdXN1YWxseSBqdXN0IHRoZSBvcmlnaW5hbCBrZXkK
LSAgICB0aGF0IHdhcyBpbiB0aGUgb3JpZ2luYWwgcGF5bG9hZC4gSG93ZXZlciwga2V5IG5hbWVz
IHdpbGwgYmUKLSAgICBpbXBhY3RlZCBieSBhbnkgbW9kaWZpY2F0aW9ucyBkb25lIGluIHRoZSBg
bm9ybWFsaXplUGF5bG9hZGAKLSAgICBtZXRob2QuIFRoZSBgRFMuUkVTVFNlcmlhbGl6ZXJgJ3Mg
ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBubwotICAgIGNoYW5nZXMgdG8gdGhlIHBheWxv
YWQga2V5cy4KLQotICAgIEBwcm9wZXJ0eSBub3JtYWxpemVIYXNoCi0gICAgQHR5cGUge09iamVj
dH0KLSAgICBAZGVmYXVsdCB1bmRlZmluZWQKLSAgKi8KLQotICAvKioKLSAgICBOb3JtYWxpemVz
IGEgcGFydCBvZiB0aGUgSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5Ci0gICAgdGhlIHNlcnZlci4g
WW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgbXVuZ2UgdGhlIGhhc2gKLSAgICBhbmQg
Y2FsbCBzdXBlciBpZiB5b3UgaGF2ZSBnZW5lcmljIG5vcm1hbGl6YXRpb24gdG8gZG8uCi0KLSAg
ICBJdCB0YWtlcyB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkIHRoYXQgaXMgYmVpbmcgbm9ybWFsaXpl
ZAotICAgIChhcyBhIERTLk1vZGVsIGNsYXNzKSwgdGhlIHByb3BlcnR5IHdoZXJlIHRoZSBoYXNo
IHdhcwotICAgIG9yaWdpbmFsbHkgZm91bmQsIGFuZCB0aGUgaGFzaCB0byBub3JtYWxpemUuCi0K
LSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXlsb2FkIHRoYXQgbG9va3MgbGlrZSB0
aGlzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAicG9zdCI6IHsKLSAgICAgICAgImlkIjog
MSwKLSAgICAgICAgInRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAotICAgICAgICAiY29tbWVu
dHMiOiBbIDEsIDIgXQotICAgICAgfSwKLSAgICAgICJjb21tZW50cyI6IFt7Ci0gICAgICAgICJp
ZCI6IDEsCi0gICAgICAgICJib2R5IjogIkZJUlNUIgotICAgICAgfSwgewotICAgICAgICAiaWQi
OiAyLAotICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgIH1dCi0gICAgfQot
ICAgIGBgYAotCi0gICAgVGhlIGBub3JtYWxpemVgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aHJl
ZSB0aW1lczoKLQotICAgICogV2l0aCBgQXBwLlBvc3RgLCBgInBvc3RzImAgYW5kIGB7IGlkOiAx
LCB0aXRsZTogIlJhaWxzIGlzIG9tYWthc2UiLCAuLi4gfWAKLSAgICAqIFdpdGggYEFwcC5Db21t
ZW50YCwgYCJjb21tZW50cyJgIGFuZCBgeyBpZDogMSwgYm9keTogIkZJUlNUIiB9YAotICAgICog
V2l0aCBgQXBwLkNvbW1lbnRgLCBgImNvbW1lbnRzImAgYW5kIGB7IGlkOiAyLCBib2R5OiAiUmFp
bHMgaXMgdW5hZ2kiIH1gCi0KLSAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCwgZm9yIGV4YW1w
bGUsIHRvIG5vcm1hbGl6ZSB1bmRlcnNjb3JlZCBrZXlzIHRvIGNhbWVsaXplZAotICAgIG9yIG90
aGVyIGdlbmVyYWwtcHVycG9zZSBub3JtYWxpemF0aW9ucy4KLQotICAgIElmIHlvdSB3YW50IHRv
IGRvIG5vcm1hbGl6YXRpb25zIHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwg
eW91Ci0gICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hgLgotCi0gICAg
Rm9yIGV4YW1wbGUsIGlmIHRoZSBgSURzYCB1bmRlciBgImNvbW1lbnRzImAgYXJlIHByb3ZpZGVk
IGFzIGBfaWRgIGluc3RlYWQgb2YKLSAgICBgaWRgLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRvIG5v
cm1hbGl6ZSBqdXN0IHRoZSBjb21tZW50czoKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJp
YWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIG5vcm1hbGl6ZUhhc2g6
IHsKLSAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICAgICAgICBoYXNoLmlk
ID0gaGFzaC5faWQ7Ci0gICAgICAgICAgZGVsZXRlIGhhc2guX2lkOwotICAgICAgICAgIHJldHVy
biBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUg
a2V5IHVuZGVyIGBub3JtYWxpemVIYXNoYCBpcyBqdXN0IHRoZSBvcmlnaW5hbCBrZXkgdGhhdCB3
YXMgaW4gdGhlIG9yaWdpbmFsCi0gICAgcGF5bG9hZC4KLQotICAgIEBtZXRob2Qgbm9ybWFsaXpl
Ci0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7T2Jq
ZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtTdHJpbmd9IHByb3AKLSAgICBAcmV0dXJucyB7T2JqZWN0
fQotICAqLwotICBub3JtYWxpemU6IGZ1bmN0aW9uKHR5cGUsIGhhc2gsIHByb3ApIHsKLSAgICB0
aGlzLm5vcm1hbGl6ZUlkKGhhc2gpOwotICAgIHRoaXMubm9ybWFsaXplQXR0cmlidXRlcyh0eXBl
LCBoYXNoKTsKLSAgICB0aGlzLm5vcm1hbGl6ZVJlbGF0aW9uc2hpcHModHlwZSwgaGFzaCk7Ci0K
LSAgICB0aGlzLm5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nKHR5cGUsIGhhc2gpOwotCi0g
ICAgaWYgKHRoaXMubm9ybWFsaXplSGFzaCAmJiB0aGlzLm5vcm1hbGl6ZUhhc2hbcHJvcF0pIHsK
LSAgICAgIHRoaXMubm9ybWFsaXplSGFzaFtwcm9wXShoYXNoKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdGhpcy5fc3VwZXIodHlwZSwgaGFzaCwgcHJvcCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91
IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gbm9ybWFsaXplIGFsbCBwYXlsb2FkcywgcmVnYXJkbGVz
cyBvZiB3aGV0aGVyIHRoZXkKLSAgICByZXByZXNlbnQgc2luZ2xlIHJlY29yZHMgb3IgYW4gYXJy
YXkuCi0KLSAgICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcmVtb3ZlIHNvbWUgZXh0
cmFuZW91cyBkYXRhIGZyb20gdGhlIHBheWxvYWQ6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBs
aWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICAgbm9y
bWFsaXplUGF5bG9hZDogZnVuY3Rpb24odHlwZSwgcGF5bG9hZCkgewotICAgICAgICBkZWxldGUg
cGF5bG9hZC52ZXJzaW9uOwotICAgICAgICBkZWxldGUgcGF5bG9hZC5zdGF0dXM7Ci0gICAgICAg
IHJldHVybiBwYXlsb2FkOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBub3JtYWxpemVQYXlsb2FkCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHJldHVybnMge09iamVjdH0gdGhlIG5v
cm1hbGl6ZWQgcGF5bG9hZAotICAqLwotICBub3JtYWxpemVQYXlsb2FkOiBmdW5jdGlvbih0eXBl
LCBwYXlsb2FkKSB7Ci0gICAgcmV0dXJuIHBheWxvYWQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1l
dGhvZCBub3JtYWxpemVJZAotICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6ZUlkOiBmdW5j
dGlvbihoYXNoKSB7Ci0gICAgdmFyIHByaW1hcnlLZXkgPSBnZXQodGhpcywgJ3ByaW1hcnlLZXkn
KTsKLQotICAgIGlmIChwcmltYXJ5S2V5ID09PSAnaWQnKSB7IHJldHVybjsgfQotCi0gICAgaGFz
aC5pZCA9IGhhc2hbcHJpbWFyeUtleV07Ci0gICAgZGVsZXRlIGhhc2hbcHJpbWFyeUtleV07Ci0g
IH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBub3JtYWxpemVVc2luZ0RlY2xhcmVkTWFwcGluZwot
ICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nOiBmdW5j
dGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIGF0dHJzID0gZ2V0KHRoaXMsICdhdHRycycpLCBw
YXlsb2FkS2V5LCBrZXk7Ci0KLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAoa2V5IGluIGF0
dHJzKSB7Ci0gICAgICAgIHBheWxvYWRLZXkgPSBhdHRyc1trZXldOwotICAgICAgICBpZiAocGF5
bG9hZEtleSAmJiBwYXlsb2FkS2V5LmtleSkgewotICAgICAgICAgIHBheWxvYWRLZXkgPSBwYXls
b2FkS2V5LmtleTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZW9mIHBheWxvYWRLZXkgPT09
ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgaGFzaFtrZXldID0gaGFzaFtwYXlsb2FkS2V5XTsKLSAg
ICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgICAgfQotICAgICAgfQotICAg
IH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIG5vcm1hbGl6ZUF0dHJpYnV0ZXMKLSAgICBA
cHJpdmF0ZQotICAqLwotICBub3JtYWxpemVBdHRyaWJ1dGVzOiBmdW5jdGlvbih0eXBlLCBoYXNo
KSB7Ci0gICAgdmFyIHBheWxvYWRLZXksIGtleTsKLQotICAgIGlmICh0aGlzLmtleUZvckF0dHJp
YnV0ZSkgewotICAgICAgdHlwZS5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSkgewotICAgICAg
ICBwYXlsb2FkS2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICAgICAgaWYgKGtl
eSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KLQotICAgICAgICBoYXNoW2tleV0gPSBoYXNo
W3BheWxvYWRLZXldOwotICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgIH0s
IHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIG5vcm1hbGl6ZVJlbGF0
aW9uc2hpcHMKLSAgICBAcHJpdmF0ZQotICAqLwotICBub3JtYWxpemVSZWxhdGlvbnNoaXBzOiBm
dW5jdGlvbih0eXBlLCBoYXNoKSB7Ci0gICAgdmFyIHBheWxvYWRLZXksIGtleTsKLQotICAgIGlm
ICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgewotICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlw
KGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgIHBheWxvYWRLZXkgPSB0aGlz
LmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKLSAgICAgICAgaWYg
KGtleSA9PT0gcGF5bG9hZEtleSkgeyByZXR1cm47IH0KLQotICAgICAgICBoYXNoW2tleV0gPSBo
YXNoW3BheWxvYWRLZXldOwotICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAg
IH0sIHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0aGUgc2Vy
dmVyIGhhcyByZXR1cm5lZCBhIHBheWxvYWQgcmVwcmVzZW50aW5nCi0gICAgYSBzaW5nbGUgcmVj
b3JkLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRgIG9yIGBzYXZlYC4KLQotICAgIEl0
IGlzIHlvdXIgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdXAgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGlu
dG8gdGhlIG5vcm1hbGl6ZWQKLSAgICBmb3JtIGV4cGVjdGVkIGJ5IEVtYmVyIERhdGEuCi0KLSAg
ICBJZiB5b3Ugd2FudCwgeW91IGNhbiBqdXN0IHJlc3RydWN0dXJlIHRoZSB0b3AtbGV2ZWwgb2Yg
eW91ciBwYXlsb2FkLCBhbmQKLSAgICBkbyBtb3JlIGZpbmUtZ3JhaW5lZCBub3JtYWxpemF0aW9u
IGluIHRoZSBgbm9ybWFsaXplYCBtZXRob2QuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhh
dmUgYSBwYXlsb2FkIGxpa2UgdGhpcyBpbiByZXNwb25zZSB0byBhIHJlcXVlc3QgZm9yCi0gICAg
cG9zdCAxOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAiaWQiOiAxLAotICAgICAgInRpdGxl
IjogIlJhaWxzIGlzIG9tYWthc2UiLAotCi0gICAgICAiX2VtYmVkZGVkIjogewotICAgICAgICAi
Y29tbWVudCI6IFt7Ci0gICAgICAgICAgIl9pZCI6IDEsCi0gICAgICAgICAgImNvbW1lbnRfdGl0
bGUiOiAiRklSU1QiCi0gICAgICAgIH0sIHsKLSAgICAgICAgICAiX2lkIjogMiwKLSAgICAgICAg
ICAiY29tbWVudF90aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIKLSAgICAgICAgfV0KLSAgICAgIH0K
LSAgICB9Ci0gICAgYGBgCi0KLSAgICBZb3UgY291bGQgaW1wbGVtZW50IGEgc2VyaWFsaXplciB0
aGF0IGxvb2tzIGxpa2UgdGhpcyB0byBnZXQgeW91ciBwYXlsb2FkCi0gICAgaW50byBzaGFwZToK
LQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIu
ZXh0ZW5kKHsKLSAgICAgIC8vIEZpcnN0LCByZXN0cnVjdHVyZSB0aGUgdG9wLWxldmVsIHNvIGl0
J3Mgb3JnYW5pemVkIGJ5IHR5cGUKLSAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3Jl
LCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsKLSAgICAgICAgdmFyIGNvbW1lbnRz
ID0gcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudDsKLSAgICAgICAgZGVsZXRlIHBheWxvYWQuX2Vt
YmVkZGVkOwotCi0gICAgICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdDog
cGF5bG9hZCB9OwotICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxv
YWQsIGlkLCByZXF1ZXN0VHlwZSk7Ci0gICAgICB9LAotCi0gICAgICBub3JtYWxpemVIYXNoOiB7
Ci0gICAgICAgIC8vIE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAo
YWZ0ZXIgYGV4dHJhY3RgKQotICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1l
bnRzYAotICAgICAgICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgewotICAgICAgICAgIGhhc2gu
aWQgPSBoYXNoLl9pZDsKLSAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxl
OwotICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICBkZWxldGUgaGFzaC5jb21t
ZW50X3RpdGxlOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSkKLSAgICBgYGAKLQotICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBp
bXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdFNpbmdsZWAsIHRoZQotICAgIGJ1aWx0LWluIGltcGxl
bWVudGF0aW9uIHdpbGwgZmluZCB0aGUgcHJpbWFyeSByZWNvcmQgaW4geW91ciBub3JtYWxpemVk
Ci0gICAgcGF5bG9hZCBhbmQgcHVzaCB0aGUgcmVtYWluaW5nIHJlY29yZHMgaW50byB0aGUgc3Rv
cmUuCi0KLSAgICBUaGUgcHJpbWFyeSByZWNvcmQgaXMgdGhlIHNpbmdsZSBoYXNoIGZvdW5kIHVu
ZGVyIGBwb3N0YCBvciB0aGUgZmlyc3QKLSAgICBlbGVtZW50IG9mIHRoZSBgcG9zdHNgIGFycmF5
LgotCi0gICAgVGhlIHByaW1hcnkgcmVjb3JkIGhhcyBzcGVjaWFsIG1lYW5pbmcgd2hlbiB0aGUg
cmVjb3JkIGlzIGJlaW5nIGNyZWF0ZWQKLSAgICBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgdXBkYXRl
ZCAoYGNyZWF0ZVJlY29yZGAgb3IgYHVwZGF0ZVJlY29yZGApLiBJbgotICAgIHBhcnRpY3VsYXIs
IGl0IHdpbGwgdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZWNvcmQgdGhhdCB3YXMgc2F2
ZWQuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RTaW5nbGUKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcGF5bG9hZAotICAgIEBwYXJhbSB7U3RyaW5nfSBpZAotICAgIEBwYXJhbSB7J2Zp
bmQnfCdjcmVhdGVSZWNvcmQnfCd1cGRhdGVSZWNvcmQnfCdkZWxldGVSZWNvcmQnfSByZXF1ZXN0
VHlwZQotICAgIEByZXR1cm5zIHtPYmplY3R9IHRoZSBwcmltYXJ5IHJlc3BvbnNlIHRvIHRoZSBv
cmlnaW5hbCByZXF1ZXN0Ci0gICovCi0gIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBw
cmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7Ci0gICAgcGF5bG9h
ZCA9IHRoaXMubm9ybWFsaXplUGF5bG9hZChwcmltYXJ5VHlwZSwgcGF5bG9hZCk7Ci0KLSAgICB2
YXIgcHJpbWFyeVR5cGVOYW1lID0gcHJpbWFyeVR5cGUudHlwZUtleSwKLSAgICAgICAgcHJpbWFy
eVJlY29yZDsKLQotICAgIGZvciAodmFyIHByb3AgaW4gcGF5bG9hZCkgewotICAgICAgdmFyIHR5
cGVOYW1lICA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCi0gICAgICAgICAgdHlwZSA9IHN0b3Jl
Lm1vZGVsRm9yKHR5cGVOYW1lKSwKLSAgICAgICAgICBpc1ByaW1hcnkgPSB0eXBlLnR5cGVLZXkg
PT09IHByaW1hcnlUeXBlTmFtZTsKLQotICAgICAgLy8gbGVnYWN5IHN1cHBvcnQgZm9yIHNpbmd1
bGFyIHJlc291cmNlcwotICAgICAgaWYgKGlzUHJpbWFyeSAmJiBFbWJlci50eXBlT2YocGF5bG9h
ZFtwcm9wXSkgIT09ICJhcnJheSIgKSB7Ci0gICAgICAgIHByaW1hcnlSZWNvcmQgPSB0aGlzLm5v
cm1hbGl6ZShwcmltYXJ5VHlwZSwgcGF5bG9hZFtwcm9wXSwgcHJvcCk7Ci0gICAgICAgIGNvbnRp
bnVlOwotICAgICAgfQotCi0gICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KLSAgICAgIGZv
ckVhY2guY2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgIHZhciB0
eXBlTmFtZSA9IHRoaXMudHlwZUZvclJvb3QocHJvcCksCi0gICAgICAgICAgICB0eXBlID0gc3Rv
cmUubW9kZWxGb3IodHlwZU5hbWUpLAotICAgICAgICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9y
ZS5zZXJpYWxpemVyRm9yKHR5cGUpOwotCi0gICAgICAgIGhhc2ggPSB0eXBlU2VyaWFsaXplci5u
b3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0KLSAgICAgICAgdmFyIGlzRmlyc3RDcmVhdGVk
UmVjb3JkID0gaXNQcmltYXJ5ICYmICFyZWNvcmRJZCAmJiAhcHJpbWFyeVJlY29yZCwKLSAgICAg
ICAgICAgIGlzVXBkYXRlZFJlY29yZCA9IGlzUHJpbWFyeSAmJiBjb2VyY2VJZChoYXNoLmlkKSA9
PT0gcmVjb3JkSWQ7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgcHJpbWFyeSByZWNvcmQuCi0gICAg
ICAgIC8vCi0gICAgICAgIC8vIEl0J3MgZWl0aGVyOgotICAgICAgICAvLyAqIHRoZSByZWNvcmQg
d2l0aCB0aGUgc2FtZSBJRCBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdAotICAgICAgICAvLyAqIGlu
IHRoZSBjYXNlIG9mIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgdGhhdCBkaWRuJ3QgaGF2ZSBhbiBJ
RCwgdGhlIGZpcnN0Ci0gICAgICAgIC8vICAgcmVjb3JkIGluIHRoZSBBcnJheQotICAgICAgICBp
ZiAoaXNGaXJzdENyZWF0ZWRSZWNvcmQgfHwgaXNVcGRhdGVkUmVjb3JkKSB7Ci0gICAgICAgICAg
cHJpbWFyeVJlY29yZCA9IGhhc2g7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RvcmUu
cHVzaCh0eXBlTmFtZSwgaGFzaCk7Ci0gICAgICAgIH0KLSAgICAgIH0sIHRoaXMpOwotICAgIH0K
LQotICAgIHJldHVybiBwcmltYXJ5UmVjb3JkOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3
aGVuIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkIGEgcGF5bG9hZCByZXByZXNlbnRpbmcKLSAgICBt
dWx0aXBsZSByZWNvcmRzLCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRBbGxgIG9yIGBm
aW5kUXVlcnlgLgotCi0gICAgSXQgaXMgeW91ciBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCB0aGUg
c2VydmVyJ3MgcmVzcG9uc2UgaW50byB0aGUgbm9ybWFsaXplZAotICAgIGZvcm0gZXhwZWN0ZWQg
YnkgRW1iZXIgRGF0YS4KLQotICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGp1c3QgcmVzdHJ1Y3R1
cmUgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIHBheWxvYWQsIGFuZAotICAgIGRvIG1vcmUgZmluZS1n
cmFpbmVkIG5vcm1hbGl6YXRpb24gaW4gdGhlIGBub3JtYWxpemVgIG1ldGhvZC4KLQotICAgIEZv
ciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBheWxvYWQgbGlrZSB0aGlzIGluIHJlc3BvbnNlIHRv
IGEgcmVxdWVzdCBmb3IKLSAgICBhbGwgcG9zdHM6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAg
ICJfZW1iZWRkZWQiOiB7Ci0gICAgICAgICJwb3N0IjogW3sKLSAgICAgICAgICAiaWQiOiAxLAot
ICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIgotICAgICAgICB9LCB7Ci0gICAg
ICAgICAgImlkIjogMiwKLSAgICAgICAgICAidGl0bGUiOiAiVGhlIFBhcmxleSBMZXR0ZXIiCi0g
ICAgICAgIH1dLAotICAgICAgICAiY29tbWVudCI6IFt7Ci0gICAgICAgICAgIl9pZCI6IDEsCi0g
ICAgICAgICAgImNvbW1lbnRfdGl0bGUiOiAiUmFpbHMgaXMgdW5hZ2kiCi0gICAgICAgICAgInBv
c3RfaWQiOiAxCi0gICAgICAgIH0sIHsKLSAgICAgICAgICAiX2lkIjogMiwKLSAgICAgICAgICAi
Y29tbWVudF90aXRsZSI6ICJEb24ndCB0cmVhZCBvbiBtZSIsCi0gICAgICAgICAgInBvc3RfaWQi
OiAyCi0gICAgICAgIH1dCi0gICAgICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgWW91IGNvdWxk
IGltcGxlbWVudCBhIHNlcmlhbGl6ZXIgdGhhdCBsb29rcyBsaWtlIHRoaXMgdG8gZ2V0IHlvdXIg
cGF5bG9hZAotICAgIGludG8gc2hhcGU6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0U2VyaWFs
aXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICAvLyBGaXJzdCwgcmVzdHJ1
Y3R1cmUgdGhlIHRvcC1sZXZlbCBzbyBpdCdzIG9yZ2FuaXplZCBieSB0eXBlCi0gICAgICAvLyBh
bmQgdGhlIGNvbW1lbnRzIGFyZSBsaXN0ZWQgdW5kZXIgYSBwb3N0J3MgYGNvbW1lbnRzYCBrZXku
Ci0gICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwg
cmVxdWVzdFR5cGUpIHsKLSAgICAgICAgdmFyIHBvc3RzID0gcGF5bG9hZC5fZW1iZWRkZWQucG9z
dDsKLSAgICAgICAgdmFyIGNvbW1lbnRzID0gW107Ci0gICAgICAgIHZhciBwb3N0Q2FjaGUgPSB7
fTsKLQotICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1bmN0aW9uKHBvc3QpIHsKLSAgICAgICAgICBw
b3N0LmNvbW1lbnRzID0gW107Ci0gICAgICAgICAgcG9zdENhY2hlW3Bvc3QuaWRdID0gcG9zdDsK
LSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGF5bG9hZC5fZW1iZWRkZWQuY29tbWVudC5mb3JFYWNo
KGZ1bmN0aW9uKGNvbW1lbnQpIHsKLSAgICAgICAgICBjb21tZW50cy5wdXNoKGNvbW1lbnQpOwot
ICAgICAgICAgIHBvc3RDYWNoZVtjb21tZW50LnBvc3RfaWRdLmNvbW1lbnRzLnB1c2goY29tbWVu
dCk7Ci0gICAgICAgICAgZGVsZXRlIGNvbW1lbnQucG9zdF9pZDsKLSAgICAgICAgfQotCi0gICAg
ICAgIHBheWxvYWQgPSB7IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdHM6IHBheWxvYWQgfTsKLQot
ICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1
ZXN0VHlwZSk7Ci0gICAgICB9LAotCi0gICAgICBub3JtYWxpemVIYXNoOiB7Ci0gICAgICAgIC8v
IE5leHQsIG5vcm1hbGl6ZSBpbmRpdmlkdWFsIGNvbW1lbnRzLCB3aGljaCAoYWZ0ZXIgYGV4dHJh
Y3RgKQotICAgICAgICAvLyBhcmUgbm93IGxvY2F0ZWQgdW5kZXIgYGNvbW1lbnRzYAotICAgICAg
ICBjb21tZW50czogZnVuY3Rpb24oaGFzaCkgewotICAgICAgICAgIGhhc2guaWQgPSBoYXNoLl9p
ZDsKLSAgICAgICAgICBoYXNoLnRpdGxlID0gaGFzaC5jb21tZW50X3RpdGxlOwotICAgICAgICAg
IGRlbGV0ZSBoYXNoLl9pZDsKLSAgICAgICAgICBkZWxldGUgaGFzaC5jb21tZW50X3RpdGxlOwot
ICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSkKLSAgICBg
YGAKLQotICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBpbXBsZW1lbnRhdGlv
biBvZiBgZXh0cmFjdEFycmF5YCwgdGhlCi0gICAgYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gd2ls
bCBmaW5kIHRoZSBwcmltYXJ5IGFycmF5IGluIHlvdXIgbm9ybWFsaXplZAotICAgIHBheWxvYWQg
YW5kIHB1c2ggdGhlIHJlbWFpbmluZyByZWNvcmRzIGludG8gdGhlIHN0b3JlLgotCi0gICAgVGhl
IHByaW1hcnkgYXJyYXkgaXMgdGhlIGFycmF5IGZvdW5kIHVuZGVyIGBwb3N0c2AuCi0KLSAgICBU
aGUgcHJpbWFyeSByZWNvcmQgaGFzIHNwZWNpYWwgbWVhbmluZyB3aGVuIHJlc3BvbmRpbmcgdG8g
YGZpbmRRdWVyeWAKLSAgICBvciBgZmluZEhhc01hbnlgLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJp
bWFyeSBhcnJheSB3aWxsIGJlY29tZSB0aGUKLSAgICBsaXN0IG9mIHJlY29yZHMgaW4gdGhlIHJl
Y29yZCBhcnJheSB0aGF0IGtpY2tlZCBvZmYgdGhlIHJlcXVlc3QuCi0KLSAgICBJZiB5b3VyIHBy
aW1hcnkgYXJyYXkgY29udGFpbnMgc2Vjb25kYXJ5IChlbWJlZGRlZCkgcmVjb3JkcyBvZiB0aGUg
c2FtZSB0eXBlLAotICAgIHlvdSBjYW5ub3QgcGxhY2UgdGhlc2UgaW50byB0aGUgcHJpbWFyeSBh
cnJheSBgcG9zdHNgLiBJbnN0ZWFkLCBwbGFjZSB0aGUKLSAgICBzZWNvbmRhcnkgaXRlbXMgaW50
byBhbiB1bmRlcnNjb3JlIHByZWZpeGVkIHByb3BlcnR5IGBfcG9zdHNgLCB3aGljaCB3aWxsCi0g
ICAgcHVzaCB0aGVzZSBpdGVtcyBpbnRvIHRoZSBzdG9yZSBhbmQgd2lsbCBub3QgYWZmZWN0IHRo
ZSByZXN1bHRpbmcgcXVlcnkuCi0KLSAgICBAbWV0aG9kIGV4dHJhY3RBcnJheQotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCi0gICAgQHBhcmFtIHsnZmluZEFsbCd8J2Zp
bmRNYW55J3wnZmluZEhhc01hbnknfCdmaW5kUXVlcnknfSByZXF1ZXN0VHlwZQotICAgIEByZXR1
cm5zIHtBcnJheX0gVGhlIHByaW1hcnkgYXJyYXkgdGhhdCB3YXMgcmV0dXJuZWQgaW4gcmVzcG9u
c2UKLSAgICAgIHRvIHRoZSBvcmlnaW5hbCBxdWVyeS4KLSAgKi8KLSAgZXh0cmFjdEFycmF5OiBm
dW5jdGlvbihzdG9yZSwgcHJpbWFyeVR5cGUsIHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0gdGhp
cy5ub3JtYWxpemVQYXlsb2FkKHByaW1hcnlUeXBlLCBwYXlsb2FkKTsKLQotICAgIHZhciBwcmlt
YXJ5VHlwZU5hbWUgPSBwcmltYXJ5VHlwZS50eXBlS2V5LAotICAgICAgICBwcmltYXJ5QXJyYXk7
Ci0KLSAgICBmb3IgKHZhciBwcm9wIGluIHBheWxvYWQpIHsKLSAgICAgIHZhciB0eXBlS2V5ID0g
cHJvcCwKLSAgICAgICAgICBmb3JjZWRTZWNvbmRhcnkgPSBmYWxzZTsKLQotICAgICAgaWYgKHBy
b3AuY2hhckF0KDApID09PSAnXycpIHsKLSAgICAgICAgZm9yY2VkU2Vjb25kYXJ5ID0gdHJ1ZTsK
LSAgICAgICAgdHlwZUtleSA9IHByb3Auc3Vic3RyKDEpOwotICAgICAgfQotCi0gICAgICB2YXIg
dHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHR5cGVLZXkpLAotICAgICAgICAgIHR5cGUgPSBz
dG9yZS5tb2RlbEZvcih0eXBlTmFtZSksCi0gICAgICAgICAgdHlwZVNlcmlhbGl6ZXIgPSBzdG9y
ZS5zZXJpYWxpemVyRm9yKHR5cGUpLAotICAgICAgICAgIGlzUHJpbWFyeSA9ICghZm9yY2VkU2Vj
b25kYXJ5ICYmICh0eXBlLnR5cGVLZXkgPT09IHByaW1hcnlUeXBlTmFtZSkpOwotCi0gICAgICAv
KmpzaGludCBsb29wZnVuYzp0cnVlKi8KLSAgICAgIHZhciBub3JtYWxpemVkQXJyYXkgPSBtYXAu
Y2FsbChwYXlsb2FkW3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7Ci0gICAgICAgIHJldHVybiB0eXBl
U2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0gICAgICB9LCB0aGlzKTsK
LQotICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICBwcmltYXJ5QXJyYXkgPSBub3JtYWxp
emVkQXJyYXk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdG9yZS5wdXNoTWFueSh0eXBlTmFt
ZSwgbm9ybWFsaXplZEFycmF5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcHJpbWFy
eUFycmF5OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gcHVz
aCBhIHBheWxvYWQgY29udGFpbmluZyB0b3AtbGV2ZWwKLSAgICBjb2xsZWN0aW9ucyBvZiByZWNv
cmRzIG9yZ2FuaXplZCBwZXIgdHlwZS4KLQotICAgIGBgYGpzCi0gICAgewotICAgICAgInBvc3Rz
IjogW3sKLSAgICAgICAgImlkIjogIjEiLAotICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21h
a2FzZSIsCi0gICAgICAgICJhdXRob3IiLCAiMSIsCi0gICAgICAgICJjb21tZW50cyI6IFsgIjEi
IF0KLSAgICAgIH1dLAotICAgICAgImNvbW1lbnRzIjogW3sKLSAgICAgICAgImlkIjogIjEiLAot
ICAgICAgICAiYm9keSI6ICJGSVJTVCIKLSAgICAgIH1dLAotICAgICAgInVzZXJzIjogW3sKLSAg
ICAgICAgImlkIjogIjEiLAotICAgICAgICAibmFtZSI6ICJAZDJoIgotICAgICAgfV0KLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBJdCB3aWxsIGZpcnN0IG5vcm1hbGl6ZSB0aGUgcGF5bG9hZCwgc28g
eW91IGNhbiB1c2UgdGhpcyB0byBwdXNoCi0gICAgaW4gZGF0YSBzdHJlYW1pbmcgaW4gZnJvbSB5
b3VyIHNlcnZlciBzdHJ1Y3R1cmVkIHRoZSBzYW1lIHdheQotICAgIHRoYXQgZmV0Y2hlcyBhbmQg
c2F2ZXMgYXJlIHN0cnVjdHVyZWQuCi0KLSAgICBAbWV0aG9kIHB1c2hQYXlsb2FkCi0gICAgQHBh
cmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAotICAqLwot
ICBwdXNoUGF5bG9hZDogZnVuY3Rpb24oc3RvcmUsIHBheWxvYWQpIHsKLSAgICBwYXlsb2FkID0g
dGhpcy5ub3JtYWxpemVQYXlsb2FkKG51bGwsIHBheWxvYWQpOwotCi0gICAgZm9yICh2YXIgcHJv
cCBpbiBwYXlsb2FkKSB7Ci0gICAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLnR5cGVGb3JSb290KHBy
b3ApLAotICAgICAgICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSk7Ci0KLSAgICAg
IC8qanNoaW50IGxvb3BmdW5jOnRydWUqLwotICAgICAgdmFyIG5vcm1hbGl6ZWRBcnJheSA9IG1h
cC5jYWxsKEVtYmVyLm1ha2VBcnJheShwYXlsb2FkW3Byb3BdKSwgZnVuY3Rpb24oaGFzaCkgewot
ICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7Ci0gICAgICB9
LCB0aGlzKTsKLQotICAgICAgc3RvcmUucHVzaE1hbnkodHlwZU5hbWUsIG5vcm1hbGl6ZWRBcnJh
eSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRv
IG5vcm1hbGl6ZSB0aGUgSlNPTiByb290IGtleXMgcmV0dXJuZWQKLSAgICBpbnRvIHRoZSBtb2Rl
bCB0eXBlIGV4cGVjdGVkIGJ5IHlvdXIgc3RvcmUuCi0KLSAgICBGb3IgZXhhbXBsZSwgeW91ciBz
ZXJ2ZXIgbWF5IHJldHVybiB1bmRlcnNjb3JlZCByb290IGtleXMgcmF0aGVyIHRoYW4KLSAgICB0
aGUgZXhwZWN0ZWQgY2FtZWxjYXNlZCB2ZXJzaW9ucy4KLQotICAgIGBgYGpzCi0gICAgQXBwLkFw
cGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7Ci0gICAgICB0
eXBlRm9yUm9vdDogZnVuY3Rpb24ocm9vdCkgewotICAgICAgICB2YXIgY2FtZWxpemVkID0gRW1i
ZXIuU3RyaW5nLmNhbWVsaXplKHJvb3QpOwotICAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnNp
bmd1bGFyaXplKGNhbWVsaXplZCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHR5cGVGb3JSb290Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHJvb3QKLSAgICBAcmV0dXJu
cyB7U3RyaW5nfSB0aGUgbW9kZWwncyB0eXBlS2V5Ci0gICovCi0gIHR5cGVGb3JSb290OiBmdW5j
dGlvbihyb290KSB7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZShyb290KTsK
LSAgfSwKLQotICAvLyBTRVJJQUxJWkUKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiBhIHJlY29y
ZCBpcyBzYXZlZCBpbiBvcmRlciB0byBjb252ZXJ0IHRoZQotICAgIHJlY29yZCBpbnRvIEpTT04u
Ci0KLSAgICBCeSBkZWZhdWx0LCBpdCBjcmVhdGVzIGEgSlNPTiBvYmplY3Qgd2l0aCBhIGtleSBm
b3IKLSAgICBlYWNoIGF0dHJpYnV0ZSBhbmQgYmVsb25nc1RvIHJlbGF0aW9uc2hpcC4KLQotICAg
IEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIG1vZGVsOgotCi0gICAgYGBganMKLSAgICBBcHAu
Q29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7Ci0gICAgICB0aXRsZTogRFMuYXR0cigpLAotICAg
ICAgYm9keTogRFMuYXR0cigpLAotCi0gICAgICBhdXRob3I6IERTLmJlbG9uZ3NUbygndXNlcicp
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdvdWxk
IGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJ0
aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIsCi0gICAgICAiYm9keSI6ICJSYWlscz8gT21ha2FzZT8g
T19PIiwKLSAgICAgICJhdXRob3IiOiAxMgotICAgIH0KLSAgICBgYGAKLQotICAgIEJ5IGRlZmF1
bHQsIGF0dHJpYnV0ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzLCB1bmxlc3MKLSAgICB5b3Ug
c3BlY2lmaWVkIGFuIGF0dHJpYnV0ZSB0eXBlIChgRFMuYXR0cignZGF0ZScpYCkuIElmCi0gICAg
eW91IHNwZWNpZnkgYSB0cmFuc2Zvcm0sIHRoZSBKYXZhU2NyaXB0IHZhbHVlIHdpbGwgYmUKLSAg
ICBzZXJpYWxpemVkIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgotCi0gICAgQnkg
ZGVmYXVsdCwgYmVsb25ncy10byByZWxhdGlvbnNoaXBzIGFyZSBjb252ZXJ0ZWQgaW50bwotICAg
IElEcyB3aGVuIGluc2VydGVkIGludG8gdGhlIEpTT04gaGFzaC4KLQotICAgICMjIElEcwotCi0g
ICAgYHNlcmlhbGl6ZWAgdGFrZXMgYW4gb3B0aW9ucyBoYXNoIHdpdGggYSBzaW5nbGUgb3B0aW9u
OgotICAgIGBpbmNsdWRlSWRgLiBJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIGBzZXJpYWxpemVg
IHdpbGwsCi0gICAgYnkgZGVmYXVsdCBpbmNsdWRlIHRoZSBJRCBpbiB0aGUgSlNPTiBvYmplY3Qg
aXQgYnVpbGRzLgotCi0gICAgVGhlIGFkYXB0ZXIgcGFzc2VzIGluIGBpbmNsdWRlSWQ6IHRydWVg
IHdoZW4gc2VyaWFsaXppbmcKLSAgICBhIHJlY29yZCBmb3IgYGNyZWF0ZVJlY29yZGAsIGJ1dCBu
b3QgZm9yIGB1cGRhdGVSZWNvcmRgLgotCi0gICAgIyMgQ3VzdG9taXphdGlvbgotCi0gICAgWW91
ciBzZXJ2ZXIgbWF5IGV4cGVjdCBhIGRpZmZlcmVudCBKU09OIGZvcm1hdCB0aGFuIHRoZQotICAg
IGJ1aWx0LWluIHNlcmlhbGl6YXRpb24gZm9ybWF0LgotCi0gICAgSW4gdGhhdCBjYXNlLCB5b3Ug
Y2FuIGltcGxlbWVudCBgc2VyaWFsaXplYCB5b3Vyc2VsZiBhbmQKLSAgICByZXR1cm4gYSBKU09O
IGhhc2ggb2YgeW91ciBjaG9vc2luZy4KLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RTZXJpYWxp
emVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKLSAgICAgIHNlcmlhbGl6ZTogZnVuY3Rp
b24ocG9zdCwgb3B0aW9ucykgewotICAgICAgICB2YXIganNvbiA9IHsKLSAgICAgICAgICBQT1NU
X1RUTDogcG9zdC5nZXQoJ3RpdGxlJyksCi0gICAgICAgICAgUE9TVF9CRFk6IHBvc3QuZ2V0KCdi
b2R5JyksCi0gICAgICAgICAgUE9TVF9DTVM6IHBvc3QuZ2V0KCdjb21tZW50cycpLm1hcFByb3Bl
cnR5KCdpZCcpCi0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSWQpIHsK
LSAgICAgICAgICBqc29uLlBPU1RfSURfID0gcG9zdC5nZXQoJ2lkJyk7Ci0gICAgICAgIH0KLQot
ICAgICAgICByZXR1cm4ganNvbjsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgICMj
IEN1c3RvbWl6aW5nIGFuIEFwcC1XaWRlIFNlcmlhbGl6ZXIKLQotICAgIElmIHlvdSB3YW50IHRv
IGRlZmluZSBhIHNlcmlhbGl6ZXIgZm9yIHlvdXIgZW50aXJlCi0gICAgYXBwbGljYXRpb24sIHlv
dSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZSBgZWFjaEF0dHJpYnV0ZWAKLSAgICBhbmQgYGVhY2hS
ZWxhdGlvbnNoaXBgIG9uIHRoZSByZWNvcmQuCi0KLSAgICBgYGBqcwotICAgIEFwcC5BcHBsaWNh
dGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewotICAgICAgc2VyaWFs
aXplOiBmdW5jdGlvbihyZWNvcmQsIG9wdGlvbnMpIHsKLSAgICAgICAgdmFyIGpzb24gPSB7fTsK
LQotICAgICAgICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAg
ICAganNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSk7Ci0g
ICAgICAgIH0pCi0KLSAgICAgICAgcmVjb3JkLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFt
ZSwgcmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kID09PSAn
aGFzTWFueScpIHsKLSAgICAgICAgICAgIGpzb25bc2VydmVySGFzTWFueU5hbWUobmFtZSldID0g
cmVjb3JkLmdldChuYW1lKS5tYXBCeSgnaWQnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwot
Ci0gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewotICAgICAgICAgIGpzb24uSURfID0g
cmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqc29uOwotICAg
ICAgfQotICAgIH0pOwotCi0gICAgZnVuY3Rpb24gc2VydmVyQXR0cmlidXRlTmFtZShhdHRyaWJ1
dGUpIHsKLSAgICAgIHJldHVybiBhdHRyaWJ1dGUudW5kZXJzY29yZSgpLnRvVXBwZXJDYXNlKCk7
Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgewotICAgICAg
cmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgpKSArICJfSURTIjsK
LSAgICB9Ci0gICAgYGBgCi0KLSAgICBUaGlzIHNlcmlhbGl6ZXIgd2lsbCBnZW5lcmF0ZSBKU09O
IHRoYXQgbG9va3MgbGlrZSB0aGlzOgotCi0gICAgYGBganMKLSAgICB7Ci0gICAgICAiVElUTEUi
OiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAiQk9EWSI6ICJZZXAuIE9tYWthc2UuIiwKLSAg
ICAgICJDT01NRU5UX0lEUyI6IFsgMSwgMiwgMyBdCi0gICAgfQotICAgIGBgYAotCi0gICAgIyMg
VHdlYWtpbmcgdGhlIERlZmF1bHQgSlNPTgotCi0gICAgSWYgeW91IGp1c3Qgd2FudCB0byBkbyBz
b21lIHNtYWxsIHR3ZWFrcyBvbiB0aGUgZGVmYXVsdCBKU09OLAotICAgIHlvdSBjYW4gY2FsbCBz
dXBlciBmaXJzdCBhbmQgbWFrZSB0aGUgdHdlYWtzIG9uIHRoZSByZXR1cm5lZAotICAgIEpTT04u
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVy
LmV4dGVuZCh7Ci0gICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewot
ICAgICAgICB2YXIganNvbiA9IHRoaXMuX3N1cGVyKHJlY29yZCwgb3B0aW9ucyk7Ci0KLSAgICAg
ICAganNvbi5zdWJqZWN0ID0ganNvbi50aXRsZTsKLSAgICAgICAgZGVsZXRlIGpzb24udGl0bGU7
Ci0KLSAgICAgICAgcmV0dXJuIGpzb247Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIHNlcmlhbGl6ZQotICAgIEBwYXJhbSByZWNvcmQKLSAgICBAcGFyYW0gb3B0aW9u
cwotICAqLwotICBzZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewotICAgIHJl
dHVybiB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgot
ICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgcm9vdCBrZXlzIHNl
cmlhbGl6ZWQgaW50byB0aGUgSlNPTi4KLSAgICBCeSBkZWZhdWx0IHRoZSBSRVNUIFNlcmlhbGl6
ZXIgc2VuZHMgY2FtZWxpemVkIHJvb3Qga2V5cy4KLSAgICBGb3IgZXhhbXBsZSwgeW91ciBzZXJ2
ZXIgbWF5IGV4cGVjdCB1bmRlcnNjb3JlZCByb290IG9iamVjdHMuCi0KLSAgICBgYGBqcwotICAg
IEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQoewot
ICAgICAgc2VyaWFsaXplSW50b0hhc2g6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJlY29yZCwgb3B0
aW9ucykgewotICAgICAgICB2YXIgcm9vdCA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplKHR5cGUu
dHlwZUtleSk7Ci0gICAgICAgIGRhdGFbcm9vdF0gPSB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIG9w
dGlvbnMpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXJpYWxp
emVJbnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFz
cyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBw
YXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0gIHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlv
bihoYXNoLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMpIHsKLSAgICB2YXIgcm9vdCA9IEVtYmVyLlN0
cmluZy5jYW1lbGl6ZSh0eXBlLnR5cGVLZXkpOwotICAgIGhhc2hbcm9vdF0gPSB0aGlzLnNlcmlh
bGl6ZShyZWNvcmQsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIFlvdSBjYW4gdXNlIHRo
aXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBob3cgcG9seW1vcnBoaWMgb2JqZWN0cyBhcmUgc2VyaWFs
aXplZC4KLSAgICBCeSBkZWZhdWx0IHRoZSBKU09OIFNlcmlhbGl6ZXIgY3JlYXRlcyB0aGUga2V5
IGJ5IGFwcGVuZGluZyBgVHlwZWAgdG8KLSAgICB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSBmcm9t
IHRoZSBtb2RlbCdzIGNhbWVsY2FzZWQgbW9kZWwgbmFtZS4KLQotICAgIEBtZXRob2Qgc2VyaWFs
aXplUG9seW1vcnBoaWNUeXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0gICAgQHBh
cmFtIHtPYmplY3R9IGpzb24KLSAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRpb25zaGlwCi0gICov
Ci0gIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxh
dGlvbnNoaXApIHsKLSAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleSwKLSAgICAgICAgYmVs
b25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKLSAgICBrZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0
ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXk7Ci0gICAganNvbltrZXkgKyAiVHlw
ZSJdID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKGJlbG9uZ3NUby5jb25zdHJ1Y3Rvci50eXBlS2V5
KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVs
ZSBlbWJlci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2g7Ci0KLS8qKgotICBU
aGUgUkVTVCBhZGFwdGVyIGFsbG93cyB5b3VyIHN0b3JlIHRvIGNvbW11bmljYXRlIHdpdGggYW4g
SFRUUCBzZXJ2ZXIgYnkKLSAgdHJhbnNtaXR0aW5nIEpTT04gdmlhIFhIUi4gTW9zdCBFbWJlci5q
cyBhcHBzIHRoYXQgY29uc3VtZSBhIEpTT04gQVBJCi0gIHNob3VsZCB1c2UgdGhlIFJFU1QgYWRh
cHRlci4KLQotICBUaGlzIGFkYXB0ZXIgaXMgZGVzaWduZWQgYXJvdW5kIHRoZSBpZGVhIHRoYXQg
dGhlIEpTT04gZXhjaGFuZ2VkIHdpdGgKLSAgdGhlIHNlcnZlciBzaG91bGQgYmUgY29udmVudGlv
bmFsLgotCi0gICMjIEpTT04gU3RydWN0dXJlCi0KLSAgVGhlIFJFU1QgYWRhcHRlciBleHBlY3Rz
IHRoZSBKU09OIHJldHVybmVkIGZyb20geW91ciBzZXJ2ZXIgdG8gZm9sbG93Ci0gIHRoZXNlIGNv
bnZlbnRpb25zLgotCi0gICMjIyBPYmplY3QgUm9vdAotCi0gIFRoZSBKU09OIHBheWxvYWQgc2hv
dWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSByZWNvcmQgaW5zaWRlIGEKLSAgcm9v
dCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGluIHJlc3BvbnNlIHRvIGEgYEdFVGAgcmVxdWVzdCBm
b3IKLSAgYC9wb3N0cy8xYCwgdGhlIEpTT04gc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBg
YGpzCi0gIHsKLSAgICAicG9zdCI6IHsKLSAgICAgICJ0aXRsZSI6ICJJJ20gUnVubmluZyB0byBS
ZWZvcm0gdGhlIFczQydzIFRhZyIsCi0gICAgICAiYXV0aG9yIjogIlllaHVkYSBLYXR6IgotICAg
IH0KLSAgfQotICBgYGAKLQotICAjIyMgQ29udmVudGlvbmFsIE5hbWVzCi0KLSAgQXR0cmlidXRl
IG5hbWVzIGluIHlvdXIgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSB0aGUgY2FtZWxDYXNlZCB2ZXJz
aW9ucyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBG
b3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVyc29uYCBtb2RlbDoKLQotICBgYGBqcwotICBB
cHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0
cmluZycpLAotICAgIGxhc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9u
OiBEUy5hdHRyKCdzdHJpbmcnKQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQg
c2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGpzCi0gIHsKLSAgICAicGVyc29uIjogewot
ICAgICAgImZpcnN0TmFtZSI6ICJCYXJhY2siLAotICAgICAgImxhc3ROYW1lIjogIk9iYW1hIiwK
LSAgICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKLSAgICB9Ci0gIH0KLSAgYGBgCi0KLSAg
IyMgQ3VzdG9taXphdGlvbgotCi0gICMjIyBFbmRwb2ludCBwYXRoIGN1c3RvbWl6YXRpb24KLQot
ICBFbmRwb2ludCBwYXRocyBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIGBuYW1lc3BhY2VgIGJ5IHNl
dHRpbmcgdGhlIG5hbWVzcGFjZQotICBwcm9wZXJ0eSBvbiB0aGUgYWRhcHRlcjoKLQotICBgYGBq
cwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIG5hbWVzcGFjZTogJ2FwaS8xJwotICB9
KTsKLSAgYGBgCi0gIFJlcXVlc3RzIGZvciBgQXBwLlBlcnNvbmAgd291bGQgbm93IHRhcmdldCBg
L2FwaS8xL3Blb3BsZS8xYC4KLQotICAjIyMgSG9zdCBjdXN0b21pemF0aW9uCi0KLSAgQW4gYWRh
cHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0
eS4KLQotICBgYGBqcwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIGhvc3Q6ICdodHRw
czovL2FwaS5leGFtcGxlLmNvbScKLSAgfSk7Ci0gIGBgYAotCi0gICMjIyBIZWFkZXJzIGN1c3Rv
bWl6YXRpb24KLQotICBTb21lIEFQSXMgcmVxdWlyZSBIVFRQIGhlYWRlcnMsIGUuZy4gdG8gcHJv
dmlkZSBhbiBBUEkga2V5LiBBbiBhcnJheSBvZgotICBoZWFkZXJzIGNhbiBiZSBhZGRlZCB0byB0
aGUgYWRhcHRlciB3aGljaCBhcmUgcGFzc2VkIHdpdGggZXZlcnkgcmVxdWVzdDoKLQotICBgYGBq
cwotICBEUy5SRVNUQWRhcHRlci5yZW9wZW4oewotICAgIGhlYWRlcnM6IHsKLSAgICAgICJBUElf
S0VZIjogInNlY3JldCBrZXkiLAotICAgICAgIkFOT1RIRVJfSEVBREVSIjogIlNvbWUgaGVhZGVy
IHZhbHVlIgotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIEBjbGFzcyBSRVNUQWRhcHRlcgotICBA
Y29uc3RydWN0b3IKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBEUy5BZGFwdGVyCi0qLwot
RFMuUkVTVEFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7Ci0gIGRlZmF1bHRTZXJpYWxpemVy
OiAnLXJlc3QnLAotCi0KLSAgLyoqCi0gICAgRW5kcG9pbnQgcGF0aHMgY2FuIGJlIHByZWZpeGVk
IHdpdGggYSBgbmFtZXNwYWNlYCBieSBzZXR0aW5nIHRoZSBuYW1lc3BhY2UKLSAgICBwcm9wZXJ0
eSBvbiB0aGUgYWRhcHRlcjoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBEUy5SRVNUQWRhcHRl
ci5yZW9wZW4oewotICAgICAgbmFtZXNwYWNlOiAnYXBpLzEnCi0gICAgfSk7Ci0gICAgYGBgCi0K
LSAgICBSZXF1ZXN0cyBmb3IgYEFwcC5Qb3N0YCB3b3VsZCBub3cgdGFyZ2V0IGAvYXBpLzEvcG9z
dC9gLgotCi0gICAgQHByb3BlcnR5IG5hbWVzcGFjZQotICAgIEB0eXBlIHtTdHJpbmd9Ci0gICov
Ci0KLSAgLyoqCi0gICAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRp
bmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBEUy5SRVNU
QWRhcHRlci5yZW9wZW4oewotICAgICAgaG9zdDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJwot
ICAgIH0pOwotICAgIGBgYAotCi0gICAgUmVxdWVzdHMgZm9yIGBBcHAuUG9zdGAgd291bGQgbm93
IHRhcmdldCBgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vcG9zdC9gLgotCi0gICAgQHByb3BlcnR5
IGhvc3QKLSAgICBAdHlwZSB7U3RyaW5nfQotICAqLwotCi0gIC8qKgotICAgIFNvbWUgQVBJcyBy
ZXF1aXJlIEhUVFAgaGVhZGVycywgZS5nLiB0byBwcm92aWRlIGFuIEFQSSBrZXkuIEFuIGFycmF5
IG9mCi0gICAgaGVhZGVycyBjYW4gYmUgYWRkZWQgdG8gdGhlIGFkYXB0ZXIgd2hpY2ggYXJlIHBh
c3NlZCB3aXRoIGV2ZXJ5IHJlcXVlc3Q6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRFMuUkVT
VEFkYXB0ZXIucmVvcGVuKHsKLSAgICAgIGhlYWRlcnM6IHsKLSAgICAgICAgIkFQSV9LRVkiOiAi
c2VjcmV0IGtleSIsCi0gICAgICAgICJBTk9USEVSX0hFQURFUiI6ICJTb21lIGhlYWRlciB2YWx1
ZSIKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBoZWFkZXJzCi0g
ICAgQHR5cGUge09iamVjdH0KLSAgKi8KLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3Jl
IGluIG9yZGVyIHRvIGZldGNoIHRoZSBKU09OIGZvciBhIGdpdmVuCi0gICAgdHlwZSBhbmQgSUQu
Ci0KLSAgICBUaGUgYGZpbmRgIG1ldGhvZCBtYWtlcyBhbiBBamF4IHJlcXVlc3QgdG8gYSBVUkwg
Y29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwgYW5kIHJldHVybnMgYQotICAgIHByb21pc2UgZm9yIHRo
ZSByZXN1bHRpbmcgcGF5bG9hZC4KLQotICAgIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGFuIEhUVFAg
YEdFVGAgcmVxdWVzdCB3aXRoIHRoZSBpZCBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBz
dHJpbmcuCi0KLSAgICBAbWV0aG9kIGZpbmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQot
ICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge1N0cmlu
Z30gaWQKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kOiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgaWQpIHsKLSAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRV
UkwodHlwZS50eXBlS2V5LCBpZCksICdHRVQnKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQg
YnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IgYWxsCi0gICAg
b2YgdGhlIHJlY29yZHMgZm9yIGEgZ2l2ZW4gdHlwZS4KLQotICAgIFRoZSBgZmluZEFsbGAgbWV0
aG9kIG1ha2VzIGFuIEFqYXggKEhUVFAgR0VUKSByZXF1ZXN0IHRvIGEgVVJMIGNvbXB1dGVkIGJ5
IGBidWlsZFVSTGAsIGFuZCByZXR1cm5zIGEKLSAgICBwcm9taXNlIGZvciB0aGUgcmVzdWx0aW5n
IHBheWxvYWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZmluZEFsbAotICAgIEBwYXJh
bSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw
ZQotICAgIEBwYXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCi0gICAgQHJldHVybnMge1Byb21pc2V9
IHByb21pc2UKLSAgKi8KLSAgZmluZEFsbDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHNpbmNlVG9r
ZW4pIHsKLSAgICB2YXIgcXVlcnk7Ci0KLSAgICBpZiAoc2luY2VUb2tlbikgewotICAgICAgcXVl
cnkgPSB7IHNpbmNlOiBzaW5jZVRva2VuIH07Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuYWph
eCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHF1ZXJ5IH0pOwot
ICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgaW4gb3JkZXIgdG8gZmV0Y2gg
YSBKU09OIGFycmF5IGZvcgotICAgIHRoZSByZWNvcmRzIHRoYXQgbWF0Y2ggYSBwYXJ0aWN1bGFy
IHF1ZXJ5LgotCi0gICAgVGhlIGBmaW5kUXVlcnlgIG1ldGhvZCBtYWtlcyBhbiBBamF4IChIVFRQ
IEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBhbmQgcmV0dXJu
cyBhCi0gICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXlsb2FkLgotCi0gICAgVGhlIGBx
dWVyeWAgYXJndW1lbnQgaXMgYSBzaW1wbGUgSmF2YVNjcmlwdCBvYmplY3QgdGhhdCB3aWxsIGJl
IHBhc3NlZCBkaXJlY3RseQotICAgIHRvIHRoZSBzZXJ2ZXIgYXMgcGFyYW1ldGVycy4KLQotICAg
IEBwcml2YXRlCi0gICAgQG1ldGhvZCBmaW5kUXVlcnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBz
dG9yZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0g
e09iamVjdH0gcXVlcnkKLSAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBm
aW5kUXVlcnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBxdWVyeSkgewotICAgIHJldHVybiB0aGlz
LmFqYXgodGhpcy5idWlsZFVSTCh0eXBlLnR5cGVLZXkpLCAnR0VUJywgeyBkYXRhOiBxdWVyeSB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZl
dGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1t
YW55IHJlbGF0aW9uc2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQotICAgIHNwZWNpZmllZCBhcyBJ
RHMuCi0KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIG9yaWdpbmFsIHBheWxvYWQgbG9va3MgbGlr
ZToKLQotICAgIGBgYGpzCi0gICAgewotICAgICAgImlkIjogMSwKLSAgICAgICJ0aXRsZSI6ICJS
YWlscyBpcyBvbWFrYXNlIiwKLSAgICAgICJjb21tZW50cyI6IFsgMSwgMiwgMyBdCi0gICAgfQot
ICAgIGBgYAotCi0gICAgVGhlIElEcyB3aWxsIGJlIHBhc3NlZCBhcyBhIFVSTC1lbmNvZGVkIEFy
cmF5IG9mIElEcywgaW4gdGhpcyBmb3JtOgotCi0gICAgYGBgCi0gICAgaWRzW109MSZpZHNbXT0y
Jmlkc1tdPTMKLSAgICBgYGAKLQotICAgIE1hbnkgc2VydmVycywgc3VjaCBhcyBSYWlscyBhbmQg
UEhQLCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCB0aGlzIFVSTC1lbmNvZGVkIGFycmF5Ci0g
ICAgaW50byBhbiBBcnJheSBmb3IgeW91IG9uIHRoZSBzZXJ2ZXItc2lkZS4gSWYgeW91IHdhbnQg
dG8gZW5jb2RlIHRoZQotICAgIElEcywgZGlmZmVyZW50bHksIGp1c3Qgb3ZlcnJpZGUgdGhpcyAo
b25lLWxpbmUpIG1ldGhvZC4KLQotICAgIFRoZSBgZmluZE1hbnlgIG1ldGhvZCBtYWtlcyBhbiBB
amF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLCBh
bmQgcmV0dXJucyBhCi0gICAgcHJvbWlzZSBmb3IgdGhlIHJlc3VsdGluZyBwYXlsb2FkLgotCi0g
ICAgQG1ldGhvZCBmaW5kTWFueQotICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCi0gICAgQHBh
cmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJhbSB7QXJyYXl9IGlkcwot
ICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCi0gICovCi0gIGZpbmRNYW55OiBmdW5jdGlv
bihzdG9yZSwgdHlwZSwgaWRzKSB7Ci0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJM
KHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHsgaWRzOiBpZHMgfSB9KTsKLSAgfSwKLQot
ICAvKioKLSAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBh
cnJheSBmb3IKLSAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBpbiBhIGhhcy1tYW55IHJlbGF0aW9u
c2hpcCB0aGF0IHdlcmUgb3JpZ2luYWxseQotICAgIHNwZWNpZmllZCBhcyBhIFVSTCAoaW5zaWRl
IG9mIGBsaW5rc2ApLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgb3JpZ2luYWwgcGF5bG9h
ZCBsb29rcyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqcwotICAgIHsKLSAgICAgICJwb3N0Ijogewot
ICAgICAgICAiaWQiOiAxLAotICAgICAgICAidGl0bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0g
ICAgICAgICJsaW5rcyI6IHsgImNvbW1lbnRzIjogIi9wb3N0cy8xL2NvbW1lbnRzIiB9Ci0gICAg
ICB9Ci0gICAgfQotICAgIGBgYAotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0
aCB0aGUgcGFyZW50IHJlY29yZCBhbmQgYC9wb3N0cy8xL2NvbW1lbnRzYC4KLQotICAgIFRoZSBg
ZmluZEhhc01hbnlgIG1ldGhvZCB3aWxsIG1ha2UgYW4gQWpheCAoSFRUUCBHRVQpIHJlcXVlc3Qg
dG8gdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIFVSTC4KLSAgICBJZiB0aGUgVVJMIGlzIGhvc3Qt
cmVsYXRpdmUgKHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgc2xhc2gpLCB0aGUKLSAgICByZXF1ZXN0
IHdpbGwgdXNlIHRoZSBob3N0IHNwZWNpZmllZCBvbiB0aGUgYWRhcHRlciAoaWYgYW55KS4KLQot
ICAgIEBtZXRob2QgZmluZEhhc01hbnkKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAg
IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwKLSAgICBA
cmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBmaW5kSGFzTWFueTogZnVuY3Rpb24o
c3RvcmUsIHJlY29yZCwgdXJsKSB7Ci0gICAgdmFyIGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwK
LSAgICAgICAgaWQgICA9IGdldChyZWNvcmQsICdpZCcpLAotICAgICAgICB0eXBlID0gcmVjb3Jk
LmNvbnN0cnVjdG9yLnR5cGVLZXk7Ci0KLSAgICBpZiAoaG9zdCAmJiB1cmwuY2hhckF0KDApID09
PSAnLycgJiYgdXJsLmNoYXJBdCgxKSAhPT0gJy8nKSB7Ci0gICAgICB1cmwgPSBob3N0ICsgdXJs
OwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLmFqYXgodGhpcy51cmxQcmVmaXgodXJsLCB0aGlz
LmJ1aWxkVVJMKHR5cGUsIGlkKSksICdHRVQnKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQg
YnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEgSlNPTiBhcnJheSBmb3IKLSAgICB0aGUg
dW5sb2FkZWQgcmVjb3JkcyBpbiBhIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwIHRoYXQgd2VyZSBv
cmlnaW5hbGx5Ci0gICAgc3BlY2lmaWVkIGFzIGEgVVJMIChpbnNpZGUgb2YgYGxpbmtzYCkuCi0K
LSAgICBGb3IgZXhhbXBsZSwgaWYgeW91ciBvcmlnaW5hbCBwYXlsb2FkIGxvb2tzIGxpa2UgdGhp
czoKLQotICAgIGBgYGpzCi0gICAgewotICAgICAgInBlcnNvbiI6IHsKLSAgICAgICAgImlkIjog
MSwKLSAgICAgICAgIm5hbWUiOiAiVG9tIERhbGUiLAotICAgICAgICAibGlua3MiOiB7ICJncm91
cCI6ICIvcGVvcGxlLzEvZ3JvdXAiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBgCi0KLSAgICBU
aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJlbnQgcmVjb3JkIGFuZCBgL3Bl
b3BsZS8xL2dyb3VwYC4KLQotICAgIFRoZSBgZmluZEJlbG9uZ3NUb2AgbWV0aG9kIHdpbGwgbWFr
ZSBhbiBBamF4IChIVFRQIEdFVCkgcmVxdWVzdCB0byB0aGUgb3JpZ2luYWxseSBzcGVjaWZpZWQg
VVJMLgotCi0gICAgQG1ldGhvZCBmaW5kQmVsb25nc1RvCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0g
c3RvcmUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBAcGFyYW0ge1N0cmluZ30g
dXJsCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZmluZEJlbG9uZ3NU
bzogZnVuY3Rpb24oc3RvcmUsIHJlY29yZCwgdXJsKSB7Ci0gICAgdmFyIGlkICAgPSBnZXQocmVj
b3JkLCAnaWQnKSwKLSAgICAgICAgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5Owot
Ci0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLnVybFByZWZpeCh1cmwsIHRoaXMuYnVpbGRVUkwo
dHlwZSwgaWQpKSwgJ0dFVCcpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3Rv
cmUgd2hlbiBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIGlzCi0gICAgc2F2ZWQgdmlhIHRoZSBgc2F2
ZWAgbWV0aG9kIG9uIGEgbW9kZWwgcmVjb3JkIGluc3RhbmNlLgotCi0gICAgVGhlIGBjcmVhdGVS
ZWNvcmRgIG1ldGhvZCBzZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIG1ha2VzIGFuIEFqYXggKEhU
VFAgUE9TVCkgcmVxdWVzdAotICAgIHRvIGEgVVJMIGNvbXB1dGVkIGJ5IGBidWlsZFVSTGAuCi0K
LSAgICBTZWUgYHNlcmlhbGl6ZWAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjdXN0b21pemUg
dGhlIHNlcmlhbGl6ZWQgZm9ybQotICAgIG9mIGEgcmVjb3JkLgotCi0gICAgQG1ldGhvZCBjcmVh
dGVSZWNvcmQKLSAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQotICAgIEBwYXJhbSB7c3ViY2xh
c3Mgb2YgRFMuTW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKLSAgICBA
cmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9u
KHN0b3JlLCB0eXBlLCByZWNvcmQpIHsKLSAgICB2YXIgZGF0YSA9IHt9OwotICAgIHZhciBzZXJp
YWxpemVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVLZXkpOwotCi0gICAgc2VyaWFs
aXplci5zZXJpYWxpemVJbnRvSGFzaChkYXRhLCB0eXBlLCByZWNvcmQsIHsgaW5jbHVkZUlkOiB0
cnVlIH0pOwotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtl
eSksICJQT1NUIiwgeyBkYXRhOiBkYXRhIH0pOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCBi
eSB0aGUgc3RvcmUgd2hlbiBhbiBleGlzdGluZyByZWNvcmQgaXMgc2F2ZWQKLSAgICB2aWEgdGhl
IGBzYXZlYCBtZXRob2Qgb24gYSBtb2RlbCByZWNvcmQgaW5zdGFuY2UuCi0KLSAgICBUaGUgYHVw
ZGF0ZVJlY29yZGAgbWV0aG9kIHNlcmlhbGl6ZXMgdGhlIHJlY29yZCBhbmQgbWFrZXMgYW4gQWph
eCAoSFRUUCBQVVQpIHJlcXVlc3QKLSAgICB0byBhIFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxg
LgotCi0gICAgU2VlIGBzZXJpYWxpemVgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3VzdG9t
aXplIHRoZSBzZXJpYWxpemVkIGZvcm0KLSAgICBvZiBhIHJlY29yZC4KLQotICAgIEBtZXRob2Qg
dXBkYXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFyYW0ge3N1
YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCi0g
ICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgdXBkYXRlUmVjb3JkOiBmdW5j
dGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGRhdGEgPSB7fTsKLSAgICB2YXIg
c2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IodHlwZS50eXBlS2V5KTsKLQotICAgIHNl
cmlhbGl6ZXIuc2VyaWFsaXplSW50b0hhc2goZGF0YSwgdHlwZSwgcmVjb3JkKTsKLQotICAgIHZh
ciBpZCA9IGdldChyZWNvcmQsICdpZCcpOwotCi0gICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1
aWxkVVJMKHR5cGUudHlwZUtleSwgaWQpLCAiUFVUIiwgeyBkYXRhOiBkYXRhIH0pOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxlZCBieSB0aGUgc3RvcmUgd2hlbiBhIHJlY29yZCBpcyBkZWxldGVk
LgotCi0gICAgVGhlIGBkZWxldGVSZWNvcmRgIG1ldGhvZCAgbWFrZXMgYW4gQWpheCAoSFRUUCBE
RUxFVEUpIHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYC4KLQotICAgIEBt
ZXRob2QgZGVsZXRlUmVjb3JkCi0gICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKLSAgICBAcGFy
YW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCi0gICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVj
b3JkCi0gICAgQHJldHVybnMge1Byb21pc2V9IHByb21pc2UKLSAgKi8KLSAgZGVsZXRlUmVjb3Jk
OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7Ci0gICAgdmFyIGlkID0gZ2V0KHJlY29y
ZCwgJ2lkJyk7Ci0KLSAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwodHlwZS50eXBl
S2V5LCBpZCksICJERUxFVEUiKTsKLSAgfSwKLQotICAvKioKLSAgICBCdWlsZHMgYSBVUkwgZm9y
IGEgZ2l2ZW4gdHlwZSBhbmQgb3B0aW9uYWwgSUQuCi0KLSAgICBCeSBkZWZhdWx0LCBpdCBwbHVy
YWxpemVzIHRoZSB0eXBlJ3MgbmFtZSAoZm9yIGV4YW1wbGUsICdwb3N0JwotICAgIGJlY29tZXMg
J3Bvc3RzJyBhbmQgJ3BlcnNvbicgYmVjb21lcyAncGVvcGxlJykuIFRvIG92ZXJyaWRlIHRoZQot
ICAgIHBsdXJhbGl6YXRpb24gc2VlIFtwYXRoRm9yVHlwZV0oI21ldGhvZF9wYXRoRm9yVHlwZSku
Ci0KLSAgICBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIGl0IGFkZHMgdGhlIElEIHRvIHRoZSBwYXRo
IGdlbmVyYXRlZAotICAgIGZvciB0aGUgdHlwZSwgc2VwYXJhdGVkIGJ5IGEgYC9gLgotCi0gICAg
QG1ldGhvZCBidWlsZFVSTAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gICAgQHBhcmFtIHtT
dHJpbmd9IGlkCi0gICAgQHJldHVybnMge1N0cmluZ30gdXJsCi0gICovCi0gIGJ1aWxkVVJMOiBm
dW5jdGlvbih0eXBlLCBpZCkgewotICAgIHZhciB1cmwgPSBbXSwKLSAgICAgICAgaG9zdCA9IGdl
dCh0aGlzLCAnaG9zdCcpLAotICAgICAgICBwcmVmaXggPSB0aGlzLnVybFByZWZpeCgpOwotCi0g
ICAgaWYgKHR5cGUpIHsgdXJsLnB1c2godGhpcy5wYXRoRm9yVHlwZSh0eXBlKSk7IH0KLSAgICBp
ZiAoaWQpIHsgdXJsLnB1c2goaWQpOyB9Ci0KLSAgICBpZiAocHJlZml4KSB7IHVybC51bnNoaWZ0
KHByZWZpeCk7IH0KLQotICAgIHVybCA9IHVybC5qb2luKCcvJyk7Ci0gICAgaWYgKCFob3N0ICYm
IHVybCkgeyB1cmwgPSAnLycgKyB1cmw7IH0KLQotICAgIHJldHVybiB1cmw7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgQG1ldGhvZCB1cmxQcmVmaXgKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoCi0gICAgQHBhcmFtIHtTdHJpbmd9IHBhcmVudFVybAotICAgIEByZXR1cm4ge1N0
cmluZ30gdXJsUHJlZml4Ci0gICovCi0gIHVybFByZWZpeDogZnVuY3Rpb24ocGF0aCwgcGFyZW50
VVJMKSB7Ci0gICAgdmFyIGhvc3QgPSBnZXQodGhpcywgJ2hvc3QnKSwKLSAgICAgICAgbmFtZXNw
YWNlID0gZ2V0KHRoaXMsICduYW1lc3BhY2UnKSwKLSAgICAgICAgdXJsID0gW107Ci0KLSAgICBp
ZiAocGF0aCkgewotICAgICAgLy8gQWJzb2x1dGUgcGF0aAotICAgICAgaWYgKHBhdGguY2hhckF0
KDApID09PSAnLycpIHsKLSAgICAgICAgaWYgKGhvc3QpIHsKLSAgICAgICAgICBwYXRoID0gcGF0
aC5zbGljZSgxKTsKLSAgICAgICAgICB1cmwucHVzaChob3N0KTsKLSAgICAgICAgfQotICAgICAg
Ly8gUmVsYXRpdmUgcGF0aAotICAgICAgfSBlbHNlIGlmICghL15odHRwKHMpPzpcL1wvLy50ZXN0
KHBhdGgpKSB7Ci0gICAgICAgIHVybC5wdXNoKHBhcmVudFVSTCk7Ci0gICAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAgIGlmIChob3N0KSB7IHVybC5wdXNoKGhvc3QpOyB9Ci0gICAgICBpZiAobmFt
ZXNwYWNlKSB7IHVybC5wdXNoKG5hbWVzcGFjZSk7IH0KLSAgICB9Ci0KLSAgICBpZiAocGF0aCkg
ewotICAgICAgdXJsLnB1c2gocGF0aCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHVybC5qb2luKCcv
Jyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgRGV0ZXJtaW5lcyB0aGUgcGF0aG5hbWUgZm9yIGEgZ2l2
ZW4gdHlwZS4KLQotICAgIEJ5IGRlZmF1bHQsIGl0IHBsdXJhbGl6ZXMgdGhlIHR5cGUncyBuYW1l
IChmb3IgZXhhbXBsZSwKLSAgICAncG9zdCcgYmVjb21lcyAncG9zdHMnIGFuZCAncGVyc29uJyBi
ZWNvbWVzICdwZW9wbGUnKS4KLQotICAgICMjIyBQYXRobmFtZSBjdXN0b21pemF0aW9uCi0KLSAg
ICBGb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBvYmplY3QgTGluZUl0ZW0gd2l0aCBhbgotICAg
IGVuZHBvaW50IG9mICIvbGluZV9pdGVtcy8iLgotCi0gICAgYGBganMKLSAgICBEUy5SRVNUQWRh
cHRlci5yZW9wZW4oewotICAgICAgcGF0aEZvclR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICAg
ICAgdmFyIGRlY2FtZWxpemVkID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUodHlwZSk7Ci0gICAg
ICAgIHJldHVybiBFbWJlci5TdHJpbmcucGx1cmFsaXplKGRlY2FtZWxpemVkKTsKLSAgICAgIH07
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHBhdGhGb3JUeXBlCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHR5cGUKLSAgICBAcmV0dXJucyB7U3RyaW5nfSBwYXRoCi0gICoqLwotICBwYXRo
Rm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHZhciBjYW1lbGl6ZWQgPSBFbWJlci5TdHJp
bmcuY2FtZWxpemUodHlwZSk7Ci0gICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxpemUoY2Ft
ZWxpemVkKTsKLSAgfSwKLQotICAvKioKLSAgICBUYWtlcyBhbiBhamF4IHJlc3BvbnNlLCBhbmQg
cmV0dXJucyBhIHJlbGV2YW50IGVycm9yLgotCi0gICAgUmV0dXJuaW5nIGEgYERTLkludmFsaWRF
cnJvcmAgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIHRoZQotICAgIHJlY29yZCB0byB0cmFu
c2l0aW9uIGludG8gdGhlIGBpbnZhbGlkYCBzdGF0ZSBhbmQgbWFrZSB0aGUKLSAgICBgZXJyb3Jz
YCBvYmplY3QgYXZhaWxhYmxlIG9uIHRoZSByZWNvcmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLlJFU1RBZGFwdGVyLmV4dGVuZCh7Ci0gICAg
ICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgICAgIHZhciBlcnJvciA9IHRoaXMu
X3N1cGVyKGpxWEhSKTsKLQotICAgICAgICBpZiAoanFYSFIgJiYganFYSFIuc3RhdHVzID09PSA0
MjIpIHsKLSAgICAgICAgICB2YXIganNvbkVycm9ycyA9IEVtYmVyLiQucGFyc2VKU09OKGpxWEhS
LnJlc3BvbnNlVGV4dClbImVycm9ycyJdOwotCi0gICAgICAgICAgcmV0dXJuIG5ldyBEUy5JbnZh
bGlkRXJyb3IoanNvbkVycm9ycyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJu
IGVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBOb3Rl
OiBBcyBhIGNvcnJlY3RuZXNzIG9wdGltaXphdGlvbiwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRp
b24gb2YKLSAgICB0aGUgYGFqYXhFcnJvcmAgbWV0aG9kIHN0cmlwcyBvdXQgdGhlIGB0aGVuYCBt
ZXRob2QgZnJvbSBqcXVlcnkncwotICAgIGFqYXggcmVzcG9uc2UgKGpxWEhSKS4gVGhpcyBpcyBp
bXBvcnRhbnQgYmVjYXVzZSB0aGUganFYSFIncwotICAgIGB0aGVuYCBtZXRob2QgZnVsZmlsbHMg
dGhlIHByb21pc2Ugd2l0aCBpdHNlbGYgcmVzdWx0aW5nIGluIGEKLSAgICBjaXJjdWxhciAidGhl
bmFibGUiIGNoYWluIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZQotICAgIHByb21p
c2UgbGlicmFyaWVzLgotCi0gICAgQG1ldGhvZCBhamF4RXJyb3IKLSAgICBAcGFyYW0gIHtPYmpl
Y3R9IGpxWEhSCi0gICAgQHJldHVybiB7T2JqZWN0fSBqcVhIUgotICAqLwotICBhamF4RXJyb3I6
IGZ1bmN0aW9uKGpxWEhSKSB7Ci0gICAgaWYgKGpxWEhSKSB7Ci0gICAgICBqcVhIUi50aGVuID0g
bnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4ganFYSFI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGFr
ZXMgYSBVUkwsIGFuIEhUVFAgbWV0aG9kIGFuZCBhIGhhc2ggb2YgZGF0YSwgYW5kIG1ha2VzIGFu
Ci0gICAgSFRUUCByZXF1ZXN0LgotCi0gICAgV2hlbiB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGgg
YSBwYXlsb2FkLCBFbWJlciBEYXRhIHdpbGwgY2FsbCBpbnRvIGBleHRyYWN0U2luZ2xlYAotICAg
IG9yIGBleHRyYWN0QXJyYXlgIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgb3JpZ2luYWwgcXVl
cnkgd2FzIGZvciBvbmUgcmVjb3JkIG9yCi0gICAgbWFueSByZWNvcmRzKS4KLQotICAgIEJ5IGRl
ZmF1bHQsIGBhamF4YCBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6Ci0KLSAgICAq
IEl0IHNldHMgdGhlIHJlc3BvbnNlIGBkYXRhVHlwZWAgdG8gYCJqc29uImAKLSAgICAqIElmIHRo
ZSBIVFRQIG1ldGhvZCBpcyBub3QgYCJHRVQiYCwgaXQgc2V0cyB0aGUgYENvbnRlbnQtVHlwZWAg
dG8gYmUKLSAgICAgIGBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04YAotICAgICogSWYg
dGhlIEhUVFAgbWV0aG9kIGlzIG5vdCBgIkdFVCJgLCBpdCBzdHJpbmdpZmllcyB0aGUgZGF0YSBw
YXNzZWQgaW4uIFRoZQotICAgICAgZGF0YSBpcyB0aGUgc2VyaWFsaXplZCByZWNvcmQgaW4gdGhl
IGNhc2Ugb2YgYSBzYXZlLgotICAgICogUmVnaXN0ZXJzIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgaGFu
ZGxlcnMuCi0KLSAgICBAbWV0aG9kIGFqYXgKLSAgICBAcHJpdmF0ZQotICAgIEBwYXJhbSB7U3Ry
aW5nfSB1cmwKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgcmVxdWVzdCB0eXBlIEdFVCwg
UE9TVCwgUFVULCBERUxFVEUgZXRjLgotICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCi0gICAgQHJl
dHVybiB7UHJvbWlzZX0gcHJvbWlzZQotICAqLwotICBhamF4OiBmdW5jdGlvbih1cmwsIHR5cGUs
IGhhc2gpIHsKLSAgICB2YXIgYWRhcHRlciA9IHRoaXM7Ci0KLSAgICByZXR1cm4gbmV3IEVtYmVy
LlJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgIGhhc2ggPSBh
ZGFwdGVyLmFqYXhPcHRpb25zKHVybCwgdHlwZSwgaGFzaCk7Ci0KLSAgICAgIGhhc2guc3VjY2Vz
cyA9IGZ1bmN0aW9uKGpzb24pIHsKLSAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGpz
b24pOwotICAgICAgfTsKLQotICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0
U3RhdHVzLCBlcnJvclRocm93bikgewotICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVqZWN0LCBh
ZGFwdGVyLmFqYXhFcnJvcihqcVhIUikpOwotICAgICAgfTsKLQotICAgICAgRW1iZXIuJC5hamF4
KGhhc2gpOwotICAgIH0sICJEUzogUmVzdEFkYXB0ZXIjYWpheCAiICsgdHlwZSArICIgdG8gIiAr
IHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBhamF4T3B0aW9ucwotICAgIEBwcml2
YXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHVybAotICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRo
ZSByZXF1ZXN0IHR5cGUgR0VULCBQT1NULCBQVVQsIERFTEVURSBldGMuCi0gICAgQHBhcmFtIHtP
YmplY3R9IGhhc2gKLSAgICBAcmV0dXJuIHtPYmplY3R9IGhhc2gKLSAgKi8KLSAgYWpheE9wdGlv
bnM6IGZ1bmN0aW9uKHVybCwgdHlwZSwgaGFzaCkgewotICAgIGhhc2ggPSBoYXNoIHx8IHt9Owot
ICAgIGhhc2gudXJsID0gdXJsOwotICAgIGhhc2gudHlwZSA9IHR5cGU7Ci0gICAgaGFzaC5kYXRh
VHlwZSA9ICdqc29uJzsKLSAgICBoYXNoLmNvbnRleHQgPSB0aGlzOwotCi0gICAgaWYgKGhhc2gu
ZGF0YSAmJiB0eXBlICE9PSAnR0VUJykgewotICAgICAgaGFzaC5jb250ZW50VHlwZSA9ICdhcHBs
aWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JzsKLSAgICAgIGhhc2guZGF0YSA9IEpTT04uc3Ry
aW5naWZ5KGhhc2guZGF0YSk7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMuaGVhZGVycyAhPT0gdW5k
ZWZpbmVkKSB7Ci0gICAgICB2YXIgaGVhZGVycyA9IHRoaXMuaGVhZGVyczsKLSAgICAgIGhhc2gu
YmVmb3JlU2VuZCA9IGZ1bmN0aW9uICh4aHIpIHsKLSAgICAgICAgZm9yRWFjaC5jYWxsKEVtYmVy
LmtleXMoaGVhZGVycyksIGZ1bmN0aW9uKGtleSkgewotICAgICAgICAgIHhoci5zZXRSZXF1ZXN0
SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTsKLSAgICAgICAgfSk7Ci0gICAgICB9OwotICAgIH0K
LQotCi0gICAgcmV0dXJuIGhhc2g7Ci0gIH0KLQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlci1kYXRhCi0qLwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotRFMuTW9kZWwucmVvcGVuKHsKLQotICAvKioKLSAgICBQcm92aWRlcyBpbmZv
IGFib3V0IHRoZSBtb2RlbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCi0gICAgYnkgZ3JvdXBpbmcg
dGhlIHByb3BlcnRpZXMgaW50byBtb3JlIHNlbWFudGljIGdyb3Vwcy4KLQotICAgIE1lYW50IHRv
IGJlIHVzZWQgYnkgZGVidWdnaW5nIHRvb2xzIHN1Y2ggYXMgdGhlIENocm9tZSBFbWJlciBFeHRl
bnNpb24uCi0KLSAgICAtIEdyb3VwcyBhbGwgYXR0cmlidXRlcyBpbiAiQXR0cmlidXRlcyIgZ3Jv
dXAuCi0gICAgLSBHcm91cHMgYWxsIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXBzIGluICJCZWxvbmdz
IFRvIiBncm91cC4KLSAgICAtIEdyb3VwcyBhbGwgaGFzTWFueSByZWxhdGlvbnNoaXBzIGluICJI
YXMgTWFueSIgZ3JvdXAuCi0gICAgLSBHcm91cHMgYWxsIGZsYWdzIGluICJGbGFncyIgZ3JvdXAu
Ci0gICAgLSBGbGFncyByZWxhdGlvbnNoaXAgQ1BzIGFzIGV4cGVuc2l2ZSBwcm9wZXJ0aWVzLgot
Ci0gICAgQG1ldGhvZCBfZGVidWdJbmZvCi0gICAgQGZvciBEUy5Nb2RlbAotICAgIEBwcml2YXRl
Ci0gICovCi0gIF9kZWJ1Z0luZm86IGZ1bmN0aW9uKCkgewotICAgIHZhciBhdHRyaWJ1dGVzID0g
WydpZCddLAotICAgICAgICByZWxhdGlvbnNoaXBzID0geyBiZWxvbmdzVG86IFtdLCBoYXNNYW55
OiBbXSB9LAotICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzID0gW107Ci0KLSAgICB0aGlzLmVh
Y2hBdHRyaWJ1dGUoZnVuY3Rpb24obmFtZSwgbWV0YSkgewotICAgICAgYXR0cmlidXRlcy5wdXNo
KG5hbWUpOwotICAgIH0sIHRoaXMpOwotCi0gICAgdGhpcy5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0
aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewotICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNo
aXAua2luZF0ucHVzaChuYW1lKTsKLSAgICAgIGV4cGVuc2l2ZVByb3BlcnRpZXMucHVzaChuYW1l
KTsKLSAgICB9KTsKLQotICAgIHZhciBncm91cHMgPSBbCi0gICAgICB7Ci0gICAgICAgIG5hbWU6
ICdBdHRyaWJ1dGVzJywKLSAgICAgICAgcHJvcGVydGllczogYXR0cmlidXRlcywKLSAgICAgICAg
ZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAgewotICAgICAgICBuYW1lOiAnQmVsb25ncyBU
bycsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuYmVsb25nc1RvLAotICAgICAg
ICBleHBhbmQ6IHRydWUKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIG5hbWU6ICdIYXMgTWFu
eScsCi0gICAgICAgIHByb3BlcnRpZXM6IHJlbGF0aW9uc2hpcHMuaGFzTWFueSwKLSAgICAgICAg
ZXhwYW5kOiB0cnVlCi0gICAgICB9LAotICAgICAgewotICAgICAgICBuYW1lOiAnRmxhZ3MnLAot
ICAgICAgICBwcm9wZXJ0aWVzOiBbJ2lzTG9hZGVkJywgJ2lzRGlydHknLCAnaXNTYXZpbmcnLCAn
aXNEZWxldGVkJywgJ2lzRXJyb3InLCAnaXNOZXcnLCAnaXNWYWxpZCddCi0gICAgICB9Ci0gICAg
XTsKLQotICAgIHJldHVybiB7Ci0gICAgICBwcm9wZXJ0eUluZm86IHsKLSAgICAgICAgLy8gaW5j
bHVkZSBhbGwgb3RoZXIgbWl4aW5zIC8gcHJvcGVydGllcyAobm90IGp1c3QgdGhlIGdyb3VwZWQg
b25lcykKLSAgICAgICAgaW5jbHVkZU90aGVyUHJvcGVydGllczogdHJ1ZSwKLSAgICAgICAgZ3Jv
dXBzOiBncm91cHMsCi0gICAgICAgIC8vIGRvbid0IHByZS1jYWxjdWxhdGUgdW5sZXNzIGNhY2hl
ZAotICAgICAgICBleHBlbnNpdmVQcm9wZXJ0aWVzOiBleHBlbnNpdmVQcm9wZXJ0aWVzCi0gICAg
ICB9Ci0gICAgfTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotICBAbW9kdWxlIGVtYmVyLWRhdGEKLSovCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci0vKioKLSAgRW1iZXIgRGF0YQotCi0gIEBtb2R1bGUgZW1iZXItZGF0YQotICBAbWFpbiBlbWJl
ci1kYXRhCi0qLwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5TdHJpbmcucGx1cmFs
aXplID0gZnVuY3Rpb24od29yZCkgewotICByZXR1cm4gRW1iZXIuSW5mbGVjdG9yLmluZmxlY3Rv
ci5wbHVyYWxpemUod29yZCk7Ci19OwotCi1FbWJlci5TdHJpbmcuc2luZ3VsYXJpemUgPSBmdW5j
dGlvbih3b3JkKSB7Ci0gIHJldHVybiBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yLnNpbmd1bGFy
aXplKHdvcmQpOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBCTEFOS19S
RUdFWCA9IC9eXHMqJC87Ci0KLWZ1bmN0aW9uIGxvYWRVbmNvdW50YWJsZShydWxlcywgdW5jb3Vu
dGFibGUpIHsKLSAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHVuY291bnRhYmxlLmxlbmd0aDsg
aSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgcnVsZXMudW5jb3VudGFibGVbdW5jb3VudGFibGVbaV0u
dG9Mb3dlckNhc2UoKV0gPSB0cnVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGxvYWRJcnJlZ3VsYXIo
cnVsZXMsIGlycmVndWxhclBhaXJzKSB7Ci0gIHZhciBwYWlyOwotCi0gIGZvciAodmFyIGkgPSAw
LCBsZW5ndGggPSBpcnJlZ3VsYXJQYWlycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAg
IHBhaXIgPSBpcnJlZ3VsYXJQYWlyc1tpXTsKLQotICAgIHJ1bGVzLmlycmVndWxhcltwYWlyWzBd
LnRvTG93ZXJDYXNlKCldID0gcGFpclsxXTsKLSAgICBydWxlcy5pcnJlZ3VsYXJJbnZlcnNlW3Bh
aXJbMV0udG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOwotICB9Ci19Ci0KLS8qKgotICBJbmZsZWN0
b3IuRW1iZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHN1cHBseWluZyBpbmZsZWN0aW9uIHJ1
bGVzIGZvciB5b3VyCi0gIGFwcGxpY2F0aW9uLiBFbWJlciBpbmNsdWRlcyBhIGRlZmF1bHQgc2V0
IG9mIGluZmxlY3Rpb24gcnVsZXMsIGFuZCBwcm92aWRlcyBhbgotICBBUEkgZm9yIHByb3ZpZGlu
ZyBhZGRpdGlvbmFsIHJ1bGVzLgotCi0gIEV4YW1wbGVzOgotCi0gIENyZWF0aW5nIGFuIGluZmxl
Y3RvciB3aXRoIG5vIHJ1bGVzLgotCi0gIGBgYGpzCi0gIHZhciBpbmZsZWN0b3IgPSBuZXcgRW1i
ZXIuSW5mbGVjdG9yKCk7Ci0gIGBgYAotCi0gIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIHRo
ZSBkZWZhdWx0IGVtYmVyIHJ1bGVzZXQuCi0KLSAgYGBganMKLSAgdmFyIGluZmxlY3RvciA9IG5l
dyBFbWJlci5JbmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7Ci0KLSAgaW5m
bGVjdG9yLnBsdXJhbGl6ZSgnY293JykgLy89PiAna2luZScKLSAgaW5mbGVjdG9yLnNpbmd1bGFy
aXplKCdraW5lJykgLy89PiAnY293JwotICBgYGAKLQotICBDcmVhdGluZyBhbiBpbmZsZWN0b3Ig
YW5kIGFkZGluZyBydWxlcyBsYXRlci4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBpbmZsZWN0
b3IgPSBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yOwotCi0gIGluZmxlY3Rvci5wbHVyYWxpemUo
J2FkdmljZScpIC8vID0+ICdhZHZpY2VzJwotICBpbmZsZWN0b3IudW5jb3VudGFibGUoJ2Fkdmlj
ZScpOwotICBpbmZsZWN0b3IucGx1cmFsaXplKCdhZHZpY2UnKSAvLyA9PiAnYWR2aWNlJwotCi0g
IGluZmxlY3Rvci5wbHVyYWxpemUoJ2Zvcm11bGEnKSAvLyA9PiAnZm9ybXVsYXMnCi0gIGluZmxl
Y3Rvci5pcnJlZ3VsYXIoJ2Zvcm11bGEnLCAnZm9ybXVsYWUnKTsKLSAgaW5mbGVjdG9yLnBsdXJh
bGl6ZSgnZm9ybXVsYScpIC8vID0+ICdmb3JtdWxhZScKLQotICAvLyB5b3Ugd291bGQgbm90IG5l
ZWQgdG8gYWRkIHRoZXNlIGFzIHRoZXkgYXJlIHRoZSBkZWZhdWx0IHJ1bGVzCi0gIGluZmxlY3Rv
ci5wbHVyYWwoLyQvLCAncycpOwotICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKLSAg
YGBgCi0KLSAgQ3JlYXRpbmcgYW4gaW5mbGVjdG9yIHdpdGggYSBub25kZWZhdWx0IHJ1bGVzZXQu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcnVsZXMgPSB7Ci0gICAgcGx1cmFsczogIFsgLyQv
LCAncycgXSwKLSAgICBzaW5ndWxhcjogWyAvXHMkLywgJycgXSwKLSAgICBpcnJlZ3VsYXJQYWly
czogWwotICAgICAgWyAnY293JywgJ2tpbmUnIF0KLSAgICBdLAotICAgIHVuY291bnRhYmxlOiBb
ICdmaXNoJyBdCi0gIH07Ci0KLSAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3Io
cnVsZXMpOwotICBgYGAKLQotICBAY2xhc3MgSW5mbGVjdG9yCi0gIEBuYW1lc3BhY2UgRW1iZXIK
LSovCi1mdW5jdGlvbiBJbmZsZWN0b3IocnVsZVNldCkgewotICBydWxlU2V0ID0gcnVsZVNldCB8
fCB7fTsKLSAgcnVsZVNldC51bmNvdW50YWJsZSA9IHJ1bGVTZXQudW5jb3VudGFibGUgfHwge307
Ci0gIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMgPSBydWxlU2V0LmlycmVndWxhclBhaXJzIHx8IHt9
OwotCi0gIHZhciBydWxlcyA9IHRoaXMucnVsZXMgPSB7Ci0gICAgcGx1cmFsczogIHJ1bGVTZXQu
cGx1cmFscyB8fCBbXSwKLSAgICBzaW5ndWxhcjogcnVsZVNldC5zaW5ndWxhciB8fCBbXSwKLSAg
ICBpcnJlZ3VsYXI6IHt9LAotICAgIGlycmVndWxhckludmVyc2U6IHt9LAotICAgIHVuY291bnRh
YmxlOiB7fQotICB9OwotCi0gIGxvYWRVbmNvdW50YWJsZShydWxlcywgcnVsZVNldC51bmNvdW50
YWJsZSk7Ci0gIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQuaXJyZWd1bGFyUGFpcnMpOwot
fQotCi1JbmZsZWN0b3IucHJvdG90eXBlID0gewotICAvKioKLSAgICBAbWV0aG9kIHBsdXJhbAot
ICAgIEBwYXJhbSB7UmVnRXhwfSByZWdleAotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcKLSAg
Ki8KLSAgcGx1cmFsOiBmdW5jdGlvbihyZWdleCwgc3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5w
bHVyYWxzLnB1c2goW3JlZ2V4LCBzdHJpbmcudG9Mb3dlckNhc2UoKV0pOwotICB9LAotCi0gIC8q
KgotICAgIEBtZXRob2Qgc2luZ3VsYXIKLSAgICBAcGFyYW0ge1JlZ0V4cH0gcmVnZXgKLSAgICBA
cGFyYW0ge1N0cmluZ30gc3RyaW5nCi0gICovCi0gIHNpbmd1bGFyOiBmdW5jdGlvbihyZWdleCwg
c3RyaW5nKSB7Ci0gICAgdGhpcy5ydWxlcy5zaW5ndWxhci5wdXNoKFtyZWdleCwgc3RyaW5nLnRv
TG93ZXJDYXNlKCldKTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIHVuY291bnRhYmxlCi0g
ICAgQHBhcmFtIHtTdHJpbmd9IHJlZ2V4Ci0gICovCi0gIHVuY291bnRhYmxlOiBmdW5jdGlvbihz
dHJpbmcpIHsKLSAgICBsb2FkVW5jb3VudGFibGUodGhpcy5ydWxlcywgW3N0cmluZy50b0xvd2Vy
Q2FzZSgpXSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBpcnJlZ3VsYXIKLSAgICBAcGFy
YW0ge1N0cmluZ30gc2luZ3VsYXIKLSAgICBAcGFyYW0ge1N0cmluZ30gcGx1cmFsCi0gICovCi0g
IGlycmVndWxhcjogZnVuY3Rpb24gKHNpbmd1bGFyLCBwbHVyYWwpIHsKLSAgICBsb2FkSXJyZWd1
bGFyKHRoaXMucnVsZXMsIFtbc2luZ3VsYXIsIHBsdXJhbF1dKTsKLSAgfSwKLQotICAvKioKLSAg
ICBAbWV0aG9kIHBsdXJhbGl6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCi0gICovCi0gIHBs
dXJhbGl6ZTogZnVuY3Rpb24od29yZCkgewotICAgIHJldHVybiB0aGlzLmluZmxlY3Qod29yZCwg
dGhpcy5ydWxlcy5wbHVyYWxzLCB0aGlzLnJ1bGVzLmlycmVndWxhcik7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgQG1ldGhvZCBzaW5ndWxhcml6ZQotICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCi0gICov
Ci0gIHNpbmd1bGFyaXplOiBmdW5jdGlvbih3b3JkKSB7Ci0gICAgcmV0dXJuIHRoaXMuaW5mbGVj
dCh3b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFyLCAgdGhpcy5ydWxlcy5pcnJlZ3VsYXJJbnZlcnNl
KTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJvdGVjdGVkCi0KLSAgICBAbWV0aG9kIGluZmxlY3QK
LSAgICBAcGFyYW0ge1N0cmluZ30gd29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSB0eXBlUnVsZXMK
LSAgICBAcGFyYW0ge09iamVjdH0gaXJyZWd1bGFyCi0gICovCi0gIGluZmxlY3Q6IGZ1bmN0aW9u
KHdvcmQsIHR5cGVSdWxlcywgaXJyZWd1bGFyKSB7Ci0gICAgdmFyIGluZmxlY3Rpb24sIHN1YnN0
aXR1dGlvbiwgcmVzdWx0LCBsb3dlcmNhc2UsIGlzQmxhbmssCi0gICAgaXNVbmNvdW50YWJsZSwg
aXNJcnJlZ3VsYXIsIGlzSXJyZWd1bGFySW52ZXJzZSwgcnVsZTsKLQotICAgIGlzQmxhbmsgPSBC
TEFOS19SRUdFWC50ZXN0KHdvcmQpOwotCi0gICAgaWYgKGlzQmxhbmspIHsKLSAgICAgIHJldHVy
biB3b3JkOwotICAgIH0KLQotICAgIGxvd2VyY2FzZSA9IHdvcmQudG9Mb3dlckNhc2UoKTsKLQot
ICAgIGlzVW5jb3VudGFibGUgPSB0aGlzLnJ1bGVzLnVuY291bnRhYmxlW2xvd2VyY2FzZV07Ci0K
LSAgICBpZiAoaXNVbmNvdW50YWJsZSkgewotICAgICAgcmV0dXJuIHdvcmQ7Ci0gICAgfQotCi0g
ICAgaXNJcnJlZ3VsYXIgPSBpcnJlZ3VsYXIgJiYgaXJyZWd1bGFyW2xvd2VyY2FzZV07Ci0KLSAg
ICBpZiAoaXNJcnJlZ3VsYXIpIHsKLSAgICAgIHJldHVybiBpc0lycmVndWxhcjsKLSAgICB9Ci0K
LSAgICBmb3IgKHZhciBpID0gdHlwZVJ1bGVzLmxlbmd0aCwgbWluID0gMDsgaSA+IG1pbjsgaS0t
KSB7Ci0gICAgICAgaW5mbGVjdGlvbiA9IHR5cGVSdWxlc1tpLTFdOwotICAgICAgIHJ1bGUgPSBp
bmZsZWN0aW9uWzBdOwotCi0gICAgICBpZiAocnVsZS50ZXN0KHdvcmQpKSB7Ci0gICAgICAgIGJy
ZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGluZmxlY3Rpb24gPSBpbmZsZWN0aW9uIHx8IFtd
OwotCi0gICAgcnVsZSA9IGluZmxlY3Rpb25bMF07Ci0gICAgc3Vic3RpdHV0aW9uID0gaW5mbGVj
dGlvblsxXTsKLQotICAgIHJlc3VsdCA9IHdvcmQucmVwbGFjZShydWxlLCBzdWJzdGl0dXRpb24p
OwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfTsKLQotRW1iZXIuSW5mbGVjdG9yID0gSW5m
bGVjdG9yOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1iZXIuSW5mbGVjdG9yLmRl
ZmF1bHRSdWxlcyA9IHsKLSAgcGx1cmFsczogWwotICAgIFsvJC8sICdzJ10sCi0gICAgWy9zJC9p
LCAncyddLAotICAgIFsvXihheHx0ZXN0KWlzJC9pLCAnJDFlcyddLAotICAgIFsvKG9jdG9wfHZp
cil1cyQvaSwgJyQxaSddLAotICAgIFsvKG9jdG9wfHZpcilpJC9pLCAnJDFpJ10sCi0gICAgWy8o
YWxpYXN8c3RhdHVzKSQvaSwgJyQxZXMnXSwKLSAgICBbLyhidSlzJC9pLCAnJDFzZXMnXSwKLSAg
ICBbLyhidWZmYWx8dG9tYXQpbyQvaSwgJyQxb2VzJ10sCi0gICAgWy8oW3RpXSl1bSQvaSwgJyQx
YSddLAotICAgIFsvKFt0aV0pYSQvaSwgJyQxYSddLAotICAgIFsvc2lzJC9pLCAnc2VzJ10sCi0g
ICAgWy8oPzooW15mXSlmZXwoW2xyXSlmKSQvaSwgJyQxJDJ2ZXMnXSwKLSAgICBbLyhoaXZlKSQv
aSwgJyQxcyddLAotICAgIFsvKFteYWVpb3V5XXxxdSl5JC9pLCAnJDFpZXMnXSwKLSAgICBbLyh4
fGNofHNzfHNoKSQvaSwgJyQxZXMnXSwKLSAgICBbLyhtYXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQv
aSwgJyQxaWNlcyddLAotICAgIFsvXihtfGwpb3VzZSQvaSwgJyQxaWNlJ10sCi0gICAgWy9eKG18
bClpY2UkL2ksICckMWljZSddLAotICAgIFsvXihveCkkL2ksICckMWVuJ10sCi0gICAgWy9eKG94
ZW4pJC9pLCAnJDEnXSwKLSAgICBbLyhxdWl6KSQvaSwgJyQxemVzJ10KLSAgXSwKLQotICBzaW5n
dWxhcjogWwotICAgIFsvcyQvaSwgJyddLAotICAgIFsvKHNzKSQvaSwgJyQxJ10sCi0gICAgWy8o
billd3MkL2ksICckMWV3cyddLAotICAgIFsvKFt0aV0pYSQvaSwgJyQxdW0nXSwKLSAgICBbLygo
YSluYWx5fChiKWF8KGQpaWFnbm98KHApYXJlbnRoZXwocClyb2dub3wocyl5bm9wfCh0KWhlKShz
aXN8c2VzKSQvaSwgJyQxc2lzJ10sCi0gICAgWy8oXmFuYWx5KShzaXN8c2VzKSQvaSwgJyQxc2lz
J10sCi0gICAgWy8oW15mXSl2ZXMkL2ksICckMWZlJ10sCi0gICAgWy8oaGl2ZSlzJC9pLCAnJDEn
XSwKLSAgICBbLyh0aXZlKXMkL2ksICckMSddLAotICAgIFsvKFtscl0pdmVzJC9pLCAnJDFmJ10s
Ci0gICAgWy8oW15hZWlvdXldfHF1KWllcyQvaSwgJyQxeSddLAotICAgIFsvKHMpZXJpZXMkL2ks
ICckMWVyaWVzJ10sCi0gICAgWy8obSlvdmllcyQvaSwgJyQxb3ZpZSddLAotICAgIFsvKHh8Y2h8
c3N8c2gpZXMkL2ksICckMSddLAotICAgIFsvXihtfGwpaWNlJC9pLCAnJDFvdXNlJ10sCi0gICAg
Wy8oYnVzKShlcyk/JC9pLCAnJDEnXSwKLSAgICBbLyhvKWVzJC9pLCAnJDEnXSwKLSAgICBbLyhz
aG9lKXMkL2ksICckMSddLAotICAgIFsvKGNyaXN8dGVzdCkoaXN8ZXMpJC9pLCAnJDFpcyddLAot
ICAgIFsvXihhKXhbaWVdcyQvaSwgJyQxeGlzJ10sCi0gICAgWy8ob2N0b3B8dmlyKSh1c3xpKSQv
aSwgJyQxdXMnXSwKLSAgICBbLyhhbGlhc3xzdGF0dXMpKGVzKT8kL2ksICckMSddLAotICAgIFsv
XihveCllbi9pLCAnJDEnXSwKLSAgICBbLyh2ZXJ0fGluZClpY2VzJC9pLCAnJDFleCddLAotICAg
IFsvKG1hdHIpaWNlcyQvaSwgJyQxaXgnXSwKLSAgICBbLyhxdWl6KXplcyQvaSwgJyQxJ10sCi0g
ICAgWy8oZGF0YWJhc2UpcyQvaSwgJyQxJ10KLSAgXSwKLQotICBpcnJlZ3VsYXJQYWlyczogWwot
ICAgIFsncGVyc29uJywgJ3Blb3BsZSddLAotICAgIFsnbWFuJywgJ21lbiddLAotICAgIFsnY2hp
bGQnLCAnY2hpbGRyZW4nXSwKLSAgICBbJ3NleCcsICdzZXhlcyddLAotICAgIFsnbW92ZScsICdt
b3ZlcyddLAotICAgIFsnY293JywgJ2tpbmUnXSwKLSAgICBbJ3pvbWJpZScsICd6b21iaWVzJ10K
LSAgXSwKLQotICB1bmNvdW50YWJsZTogWwotICAgICdlcXVpcG1lbnQnLAotICAgICdpbmZvcm1h
dGlvbicsCi0gICAgJ3JpY2UnLAotICAgICdtb25leScsCi0gICAgJ3NwZWNpZXMnLAotICAgICdz
ZXJpZXMnLAotICAgICdmaXNoJywKLSAgICAnc2hlZXAnLAotICAgICdqZWFucycsCi0gICAgJ3Bv
bGljZScKLSAgXQotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLWlmIChFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJp
bmcpIHsKLSAgLyoqCi0gICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3BsdXJhbGl6
ZSJ9fXt7L2Nyb3NzTGlua319Ci0KLSAgICBAbWV0aG9kIHBsdXJhbGl6ZQotICAgIEBmb3IgU3Ry
aW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUucGx1cmFsaXplID0gZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIEVtYmVyLlN0cmluZy5wbHVyYWxpemUodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0g
ICAgU2VlIHt7I2Nyb3NzTGluayAiRW1iZXIuU3RyaW5nL3Npbmd1bGFyaXplIn19e3svY3Jvc3NM
aW5rfX0KLQotICAgIEBtZXRob2Qgc2luZ3VsYXJpemUKLSAgICBAZm9yIFN0cmluZwotICAqLwot
ICBTdHJpbmcucHJvdG90eXBlLnNpbmd1bGFyaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IEVtYmVyLlN0cmluZy5zaW5ndWxhcml6ZSh0aGlzKTsKLSAgfTsKLX0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLUVtYmVyLkluZmxlY3Rvci5pbmZsZWN0b3IgPSBuZXcgRW1iZXIuSW5m
bGVjdG9yKEVtYmVyLkluZmxlY3Rvci5kZWZhdWx0UnVsZXMpOwotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJl
ci1kYXRhCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIGZvckVhY2ggPSBFbWJlci5F
bnVtZXJhYmxlVXRpbHMuZm9yRWFjaCwKLSAgICBjYW1lbGl6ZSA9ICAgRW1iZXIuU3RyaW5nLmNh
bWVsaXplLAotICAgIGNhcGl0YWxpemUgPSBFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSwKLSAgICBk
ZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgc2luZ3VsYXJpemUgPSBF
bWJlci5TdHJpbmcuc2luZ3VsYXJpemUsCi0gICAgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51
bmRlcnNjb3JlOwotCi1EUy5BY3RpdmVNb2RlbFNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXpl
ci5leHRlbmQoewotICAvLyBTRVJJQUxJWkUKLQotICAvKioKLSAgICBDb252ZXJ0cyBjYW1lbGNh
c2VkIGF0dHJpYnV0ZXMgdG8gdW5kZXJzY29yZWQgd2hlbiBzZXJpYWxpemluZy4KLQotICAgIEBt
ZXRob2Qga2V5Rm9yQXR0cmlidXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGF0dHJpYnV0ZQotICAg
IEByZXR1cm5zIFN0cmluZwotICAqLwotICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIp
IHsKLSAgICByZXR1cm4gZGVjYW1lbGl6ZShhdHRyKTsKLSAgfSwKLQotICAvKioKLSAgICBVbmRl
cnNjb3JlcyByZWxhdGlvbnNoaXAgbmFtZXMgYW5kIGFwcGVuZHMgIl9pZCIgb3IgIl9pZHMiIHdo
ZW4gc2VyaWFsaXppbmcKLSAgICByZWxhdGlvbnNoaXAga2V5cy4KLQotICAgIEBtZXRob2Qga2V5
Rm9yUmVsYXRpb25zaGlwCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgIEBwYXJhbSB7U3Ry
aW5nfSBraW5kCi0gICAgQHJldHVybnMgU3RyaW5nCi0gICovCi0gIGtleUZvclJlbGF0aW9uc2hp
cDogZnVuY3Rpb24oa2V5LCBraW5kKSB7Ci0gICAga2V5ID0gZGVjYW1lbGl6ZShrZXkpOwotICAg
IGlmIChraW5kID09PSAiYmVsb25nc1RvIikgewotICAgICAgcmV0dXJuIGtleSArICJfaWQiOwot
ICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gImhhc01hbnkiKSB7Ci0gICAgICByZXR1cm4gc2luZ3Vs
YXJpemUoa2V5KSArICJfaWRzIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGtleTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgRG9lcyBub3Qgc2VyaWFsaXplIGhhc01hbnkgcmVsYXRp
b25zaGlwcyBieSBkZWZhdWx0LgotICAqLwotICBzZXJpYWxpemVIYXNNYW55OiBFbWJlci5LLAot
Ci0gIC8qKgotICAgIFVuZGVyc2NvcmVzIHRoZSBKU09OIHJvb3Qga2V5cyB3aGVuIHNlcmlhbGl6
aW5nLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVJbnRvSGFzaAotICAgIEBwYXJhbSB7T2JqZWN0
fSBoYXNoCi0gICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQotICAgIEBwYXJh
bSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCi0gICovCi0g
IHNlcmlhbGl6ZUludG9IYXNoOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByZWNvcmQsIG9wdGlvbnMp
IHsKLSAgICB2YXIgcm9vdCA9IHVuZGVyc2NvcmUoZGVjYW1lbGl6ZSh0eXBlLnR5cGVLZXkpKTsK
LSAgICBkYXRhW3Jvb3RdID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCBvcHRpb25zKTsKLSAgfSwK
LQotICAvKioKLSAgICBTZXJpYWxpemVzIGEgcG9seW1vcnBoaWMgdHlwZSBhcyBhIGZ1bGx5IGNh
cGl0YWxpemVkIG1vZGVsIG5hbWUuCi0KLSAgICBAbWV0aG9kIHNlcmlhbGl6ZVBvbHltb3JwaGlj
VHlwZQotICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAotICAgIEBwYXJhbSB7T2JqZWN0fSBq
c29uCi0gICAgQHBhcmFtIHJlbGF0aW9uc2hpcAotICAqLwotICBzZXJpYWxpemVQb2x5bW9ycGhp
Y1R5cGU6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7Ci0gICAgdmFyIGtl
eSA9IHJlbGF0aW9uc2hpcC5rZXksCi0gICAgICAgIGJlbG9uZ3NUbyA9IGdldChyZWNvcmQsIGtl
eSk7Ci0gICAga2V5ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICBqc29uW2tleSAr
ICJfdHlwZSJdID0gY2FwaXRhbGl6ZShjYW1lbGl6ZShiZWxvbmdzVG8uY29uc3RydWN0b3IudHlw
ZUtleSkpOwotICB9LAotCi0gIC8vIEVYVFJBQ1QKLQotICAvKioKLSAgICBFeHRyYWN0cyB0aGUg
bW9kZWwgdHlwZUtleSBmcm9tIHVuZGVyc2NvcmVkIHJvb3Qgb2JqZWN0cy4KLQotICAgIEBtZXRo
b2QgdHlwZUZvclJvb3QKLSAgICBAcGFyYW0ge1N0cmluZ30gcm9vdAotICAgIEByZXR1cm5zIFN0
cmluZyB0aGUgbW9kZWwncyB0eXBlS2V5Ci0gICovCi0gIHR5cGVGb3JSb290OiBmdW5jdGlvbihy
b290KSB7Ci0gICAgdmFyIGNhbWVsaXplZCA9IGNhbWVsaXplKHJvb3QpOwotICAgIHJldHVybiBz
aW5ndWxhcml6ZShjYW1lbGl6ZWQpOwotICB9LAotCi0gIC8qKgotICAgIEFkZCBleHRyYSBzdGVw
IHRvIGBEUy5SRVNUU2VyaWFsaXplci5ub3JtYWxpemVgIHNvIGxpbmtzIGFyZQotICAgIG5vcm1h
bGl6ZWQuCi0KLSAgICBJZiB5b3VyIHBheWxvYWQgbG9va3MgbGlrZSB0aGlzCi0KLSAgICBgYGBq
cwotICAgIHsKLSAgICAgICJwb3N0IjogewotICAgICAgICAiaWQiOiAxLAotICAgICAgICAidGl0
bGUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCi0gICAgICAgICJsaW5rcyI6IHsgImZsYWdnZWRfY29t
bWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYGBg
Ci0gICAgVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiB3b3VsZCBsb29rIGxpa2UgdGhpcwotCi0gICAg
YGBganMKLSAgICB7Ci0gICAgICAicG9zdCI6IHsKLSAgICAgICAgImlkIjogMSwKLSAgICAgICAg
InRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiLAotICAgICAgICAibGlua3MiOiB7ICJmbGFnZ2Vk
Q29tbWVudHMiOiAiYXBpL2NvbW1lbnRzL2ZsYWdnZWQiIH0KLSAgICAgIH0KLSAgICB9Ci0gICAg
YGBgCi0KLSAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu
TW9kZWx9IHR5cGUKLSAgICBAcGFyYW0ge09iamVjdH0gaGFzaAotICAgIEBwYXJhbSB7U3RyaW5n
fSBwcm9wCi0gICAgQHJldHVybnMgT2JqZWN0Ci0gICovCi0KLSAgbm9ybWFsaXplOiBmdW5jdGlv
bih0eXBlLCBoYXNoLCBwcm9wKSB7Ci0gICAgdGhpcy5ub3JtYWxpemVMaW5rcyhoYXNoKTsKLQot
ICAgIHJldHVybiB0aGlzLl9zdXBlcih0eXBlLCBoYXNoLCBwcm9wKTsKLSAgfSwKLQotICAvKioK
LSAgICBDb252ZXJ0IGBzbmFrZV9jYXNlZGAgbGlua3MgIHRvIGBjYW1lbENhc2VgCi0KLSAgICBA
bWV0aG9kIG5vcm1hbGl6ZUxpbmtzCi0gICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgKi8KLQot
ICBub3JtYWxpemVMaW5rczogZnVuY3Rpb24oZGF0YSl7Ci0gICAgaWYgKGRhdGEubGlua3MpIHsK
LSAgICAgIHZhciBsaW5rcyA9IGRhdGEubGlua3M7Ci0KLSAgICAgIGZvciAodmFyIGxpbmsgaW4g
bGlua3MpIHsKLSAgICAgICAgdmFyIGNhbWVsaXplZExpbmsgPSBjYW1lbGl6ZShsaW5rKTsKLQot
ICAgICAgICBpZiAoY2FtZWxpemVkTGluayAhPT0gbGluaykgewotICAgICAgICAgIGxpbmtzW2Nh
bWVsaXplZExpbmtdID0gbGlua3NbbGlua107Ci0gICAgICAgICAgZGVsZXRlIGxpbmtzW2xpbmtd
OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIE5vcm1hbGl6
ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSBmcm9tIHRoZSBKU09OLgotCi0gICAgTm9ybWFsaXplOgot
ICAgIGBgYGpzCi0gICAgICB7Ci0gICAgICAgIGlkOiAiMSIKLSAgICAgICAgbWluaW9uOiB7IHR5
cGU6ICJldmlsX21pbmlvbiIsIGlkOiAiMTIifQotICAgICAgfQotICAgIGBgYAotCi0gICAgVG86
Ci0gICAgYGBganMKLSAgICAgIHsKLSAgICAgICAgaWQ6ICIxIgotICAgICAgICBtaW5pb246IHsg
dHlwZTogImV2aWxNaW5pb24iLCBpZDogIjEyIn0KLSAgICAgIH0KLSAgICBgYGAKLQotICAgIEBt
ZXRob2Qgbm9ybWFsaXplUmVsYXRpb25zaGlwcwotICAgIEBwcml2YXRlCi0gICovCi0gIG5vcm1h
bGl6ZVJlbGF0aW9uc2hpcHM6IGZ1bmN0aW9uKHR5cGUsIGhhc2gpIHsKLSAgICB2YXIgcGF5bG9h
ZEtleSwgcGF5bG9hZDsKLQotICAgIGlmICh0aGlzLmtleUZvclJlbGF0aW9uc2hpcCkgewotICAg
ICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7Ci0g
ICAgICAgIGlmIChyZWxhdGlvbnNoaXAub3B0aW9ucy5wb2x5bW9ycGhpYykgewotICAgICAgICAg
IHBheWxvYWRLZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpOwotICAgICAgICAgIHBheWxv
YWQgPSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWQu
dHlwZSkgewotICAgICAgICAgICAgcGF5bG9hZC50eXBlID0gdGhpcy50eXBlRm9yUm9vdChwYXls
b2FkLnR5cGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiByZWxhdGlvbnNoaXAu
a2luZCA9PT0gImhhc01hbnkiKSB7Ci0gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAg
ICAgICAgICBmb3JFYWNoKHBheWxvYWQsIGZ1bmN0aW9uKHNpbmdsZSkgewotICAgICAgICAgICAg
ICBzaW5nbGUudHlwZSA9IHNlbGYudHlwZUZvclJvb3Qoc2luZ2xlLnR5cGUpOwotICAgICAgICAg
ICAgfSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBheWxvYWRL
ZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9uc2hpcC5raW5kKTsKLSAg
ICAgICAgICBwYXlsb2FkID0gaGFzaFtwYXlsb2FkS2V5XTsKLSAgICAgICAgfQotCi0gICAgICAg
IGhhc2hba2V5XSA9IHBheWxvYWQ7Ci0KLSAgICAgICAgaWYgKGtleSAhPT0gcGF5bG9hZEtleSkg
ewotICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxvYWRLZXldOwotICAgICAgICB9Ci0gICAgICB9
LCB0aGlzKTsKLSAgICB9Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIGdldCA9IEVtYmVyLmdldDsKLXZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2g7Ci0KLS8qKgotICBUaGUgRW1iZWRkZWRSZWNvcmRzTWl4aW4gYWxsb3dzIHlvdSB0
byBhZGQgZW1iZWRkZWQgcmVjb3JkIHN1cHBvcnQgdG8geW91cgotICBzZXJpYWxpemVycy4KLSAg
VG8gc2V0IHVwIGVtYmVkZGVkIHJlY29yZHMsIHlvdSBpbmNsdWRlIHRoZSBtaXhpbiBpbnRvIHRo
ZSBzZXJpYWxpemVyIGFuZCB0aGVuCi0gIGRlZmluZSB5b3VyIGVtYmVkZGVkIHJlbGF0aW9ucy4K
LQotICBgYGBqcwotICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5BY3RpdmVNb2RlbFNlcmlhbGl6
ZXIuZXh0ZW5kKERTLkVtYmVkZGVkUmVjb3Jkc01peGluLCB7Ci0gICAgYXR0cnM6IHsKLSAgICAg
IGNvbW1lbnRzOiB7ZW1iZWRkZWQ6ICdhbHdheXMnfQotICAgIH0KLSAgfSkKLSAgYGBgCi0KLSAg
Q3VycmVudGx5IG9ubHkgYHtlbWJlZGRlZDogJ2Fsd2F5cyd9YCByZWNvcmRzIGFyZSBzdXBwb3J0
ZWQuCi0KLSAgQGNsYXNzIEVtYmVkZGVkUmVjb3Jkc01peGluCi0gIEBuYW1lc3BhY2UgRFMKLSov
Ci1EUy5FbWJlZGRlZFJlY29yZHNNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0KLSAgLyoq
Ci0gICAgU2VyaWFsaXplIGhhcy1tYXkgcmVsYXRpb25zaGlwIHdoZW4gaXQgaXMgY29uZmlndXJl
ZCBhcyBlbWJlZGRlZCBvYmplY3RzLgotCi0gICAgQG1ldGhvZCBzZXJpYWxpemVIYXNNYW55Ci0g
ICovCi0gIHNlcmlhbGl6ZUhhc01hbnk6IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25z
aGlwKSB7Ci0gICAgdmFyIGtleSAgID0gcmVsYXRpb25zaGlwLmtleSwKLSAgICAgICAgYXR0cnMg
PSBnZXQodGhpcywgJ2F0dHJzJyksCi0gICAgICAgIGVtYmVkID0gYXR0cnMgJiYgYXR0cnNba2V5
XSAmJiBhdHRyc1trZXldLmVtYmVkZGVkID09PSAnYWx3YXlzJzsKLQotICAgIGlmIChlbWJlZCkg
ewotICAgICAganNvblt0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpXSA9IGdldChyZWNvcmQsIGtl
eSkubWFwKGZ1bmN0aW9uKHJlbGF0aW9uKSB7Ci0gICAgICAgIHZhciBkYXRhID0gcmVsYXRpb24u
c2VyaWFsaXplKCksCi0gICAgICAgICAgICBwcmltYXJ5S2V5ID0gZ2V0KHRoaXMsICdwcmltYXJ5
S2V5Jyk7Ci0KLSAgICAgICAgZGF0YVtwcmltYXJ5S2V5XSA9IGdldChyZWxhdGlvbiwgcHJpbWFy
eUtleSk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0g
IH0sCi0KLSAgLyoqCi0gICAgRXh0cmFjdCBlbWJlZGRlZCBvYmplY3RzIG91dCBvZiB0aGUgcGF5
bG9hZCBmb3IgYSBzaW5nbGUgb2JqZWN0Ci0gICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQg
b2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1ldGhvZCBleHRyYWN0U2luZ2xlCi0gICovCi0gIGV4
dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBwcmltYXJ5VHlwZSwgcGF5bG9hZCwgcmVjb3Jk
SWQsIHJlcXVlc3RUeXBlKSB7Ci0gICAgdmFyIHJvb3QgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShw
cmltYXJ5VHlwZS50eXBlS2V5KSwKLSAgICAgICAgcGFydGlhbCA9IHBheWxvYWRbcm9vdF07Ci0K
LSAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCB0aGlzLCBwcmltYXJ5VHlwZSwg
cGFydGlhbCwgcGF5bG9hZCk7Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHByaW1h
cnlUeXBlLCBwYXlsb2FkLCByZWNvcmRJZCwgcmVxdWVzdFR5cGUpOwotICB9LAotCi0gIC8qKgot
ICAgIEV4dHJhY3QgZW1iZWRkZWQgb2JqZWN0cyBvdXQgb2YgYSBzdGFuZGFyZCBwYXlsb2FkCi0g
ICAgYW5kIGFkZCB0aGVtIGFzIHNpZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgotCi0gICAgQG1l
dGhvZCBleHRyYWN0QXJyYXkKLSAgKi8KLSAgZXh0cmFjdEFycmF5OiBmdW5jdGlvbihzdG9yZSwg
dHlwZSwgcGF5bG9hZCkgewotICAgIHZhciByb290ID0gdGhpcy5rZXlGb3JBdHRyaWJ1dGUodHlw
ZS50eXBlS2V5KSwKLSAgICAgICAgcGFydGlhbHMgPSBwYXlsb2FkW0VtYmVyLlN0cmluZy5wbHVy
YWxpemUocm9vdCldOwotCi0gICAgZm9yRWFjaChwYXJ0aWFscywgZnVuY3Rpb24ocGFydGlhbCkg
ewotICAgICAgdXBkYXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgdGhpcywgdHlwZSwgcGFy
dGlhbCwgcGF5bG9hZCk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIo
c3RvcmUsIHR5cGUsIHBheWxvYWQpOwotICB9Ci19KTsKLQotZnVuY3Rpb24gdXBkYXRlUGF5bG9h
ZFdpdGhFbWJlZGRlZChzdG9yZSwgc2VyaWFsaXplciwgdHlwZSwgcGFydGlhbCwgcGF5bG9hZCkg
ewotICB2YXIgYXR0cnMgPSBnZXQoc2VyaWFsaXplciwgJ2F0dHJzJyk7Ci0KLSAgaWYgKCFhdHRy
cykgewotICAgIHJldHVybjsKLSAgfQotCi0gIHR5cGUuZWFjaFJlbGF0aW9uc2hpcChmdW5jdGlv
bihrZXksIHJlbGF0aW9uc2hpcCkgewotICAgIHZhciBleHBhbmRlZEtleSwgZW1iZWRkZWRUeXBl
S2V5LCBhdHRyaWJ1dGUsIGlkcywKLSAgICAgICAgY29uZmlnID0gYXR0cnNba2V5XSwKLSAgICAg
ICAgc2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3IocmVsYXRpb25zaGlwLnR5cGUudHlw
ZUtleSksCi0gICAgICAgIHByaW1hcnlLZXkgPSBnZXQoc2VyaWFsaXplciwgInByaW1hcnlLZXki
KTsKLQotICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCAhPT0gImhhc01hbnkiKSB7Ci0gICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNvbmZpZyAmJiAoY29uZmlnLmVtYmVkZGVkID09PSAn
YWx3YXlzJyB8fCBjb25maWcuZW1iZWRkZWQgPT09ICdsb2FkJykpIHsKLSAgICAgIC8vIHVuZGVy
c2NvcmUgZm9yY2VzIHRoZSBlbWJlZGRlZCByZWNvcmRzIHRvIGJlIHNpZGUgbG9hZGVkLgotICAg
ICAgLy8gaXQgaXMgbmVlZGVkIHdoZW4gbWFpbiB0eXBlID09PSByZWxhdGlvbnNoaXAudHlwZQot
ICAgICAgZW1iZWRkZWRUeXBlS2V5ID0gJ18nICsgRW1iZXIuU3RyaW5nLnBsdXJhbGl6ZShyZWxh
dGlvbnNoaXAudHlwZS50eXBlS2V5KTsKLSAgICAgIGV4cGFuZGVkS2V5ID0gdGhpcy5rZXlGb3JS
ZWxhdGlvbnNoaXAoa2V5LCByZWxhdGlvbnNoaXAua2luZCk7Ci0gICAgICBhdHRyaWJ1dGUgID0g
dGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KTsKLSAgICAgIGlkcyA9IFtdOwotCi0gICAgICBpZiAo
IXBhcnRpYWxbYXR0cmlidXRlXSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAg
IHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSA9IHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSB8fCBb
XTsKLQotICAgICAgZm9yRWFjaChwYXJ0aWFsW2F0dHJpYnV0ZV0sIGZ1bmN0aW9uKGRhdGEpIHsK
LSAgICAgICAgdmFyIGVtYmVkZGVkVHlwZSA9IHN0b3JlLm1vZGVsRm9yKHJlbGF0aW9uc2hpcC50
eXBlLnR5cGVLZXkpOwotICAgICAgICB1cGRhdGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCBz
ZXJpYWxpemVyLCBlbWJlZGRlZFR5cGUsIGRhdGEsIHBheWxvYWQpOwotICAgICAgICBpZHMucHVz
aChkYXRhW3ByaW1hcnlLZXldKTsKLSAgICAgICAgcGF5bG9hZFtlbWJlZGRlZFR5cGVLZXldLnB1
c2goZGF0YSk7Ci0gICAgICB9KTsKLQotICAgICAgcGFydGlhbFtleHBhbmRlZEtleV0gPSBpZHM7
Ci0gICAgICBkZWxldGUgcGFydGlhbFthdHRyaWJ1dGVdOwotICAgIH0KLSAgfSwgc2VyaWFsaXpl
cik7Ci19Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXIt
ZGF0YQotKi8KLQotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsK
LXZhciBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgdW5kZXJzY29y
ZSA9IEVtYmVyLlN0cmluZy51bmRlcnNjb3JlLAotICAgIHBsdXJhbGl6ZSAgPSBFbWJlci5TdHJp
bmcucGx1cmFsaXplOwotCi0vKioKLSAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBpcyBhIHN1YmNs
YXNzIG9mIHRoZSBSRVNUQWRhcHRlciBkZXNpZ25lZCB0byBpbnRlZ3JhdGUKLSAgd2l0aCBhIEpT
T04gQVBJIHRoYXQgdXNlcyBhbiB1bmRlcnNjb3JlZCBuYW1pbmcgY29udmVudGlvbiBpbnN0ZWFk
IG9mIGNhbWVsY2FzaW5nLgotICBJdCBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrIG91dCBvZiB0
aGUgYm94IHdpdGggdGhlCi0gIFthY3RpdmVfbW9kZWxfc2VyaWFsaXplcnNdKGh0dHA6Ly9naXRo
dWIuY29tL3JhaWxzLWFwaS9hY3RpdmVfbW9kZWxfc2VyaWFsaXplcnMpCi0gIFJ1YnkgZ2VtLgot
Ci0gIFRoaXMgYWRhcHRlciBleHRlbmRzIHRoZSBEUy5SRVNUQWRhcHRlciBieSBtYWtpbmcgY29u
c2lzdGVudCB1c2Ugb2YgdGhlIGNhbWVsaXphdGlvbiwKLSAgZGVjYW1lbGl6YXRpb24gYW5kIHBs
dXJhbGl6YXRpb24gbWV0aG9kcyB0byBub3JtYWxpemUgdGhlIHNlcmlhbGl6ZWQgSlNPTiBpbnRv
IGEKLSAgZm9ybWF0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGEgY29udmVudGlvbmFsIFJhaWxz
IGJhY2tlbmQgYW5kIEVtYmVyIERhdGEuCi0KLSAgIyMgSlNPTiBTdHJ1Y3R1cmUKLQotICBUaGUg
QWN0aXZlTW9kZWxBZGFwdGVyIGV4cGVjdHMgdGhlIEpTT04gcmV0dXJuZWQgZnJvbSB5b3VyIHNl
cnZlciB0byBmb2xsb3cKLSAgdGhlIFJFU1QgYWRhcHRlciBjb252ZW50aW9ucyBzdWJzdGl0dXRp
bmcgdW5kZXJzY29yZWQga2V5cyBmb3IgY2FtZWxjYXNlZCBvbmVzLgotCi0gICMjIyBDb252ZW50
aW9uYWwgTmFtZXMKLQotICBBdHRyaWJ1dGUgbmFtZXMgaW4geW91ciBKU09OIHBheWxvYWQgc2hv
dWxkIGJlIHRoZSB1bmRlcnNjb3JlZCB2ZXJzaW9ucyBvZgotICB0aGUgYXR0cmlidXRlcyBpbiB5
b3VyIEVtYmVyLmpzIG1vZGVscy4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBgUGVy
c29uYCBtb2RlbDoKLQotICBgYGBqcwotICBBcHAuRmFtb3VzUGVyc29uID0gRFMuTW9kZWwuZXh0
ZW5kKHsKLSAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGxhc3ROYW1lOiBE
Uy5hdHRyKCdzdHJpbmcnKSwKLSAgICBvY2N1cGF0aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQotICB9
KTsKLSAgYGBgCi0KLSAgVGhlIEpTT04gcmV0dXJuZWQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgot
Ci0gIGBgYGpzCi0gIHsKLSAgICAiZmFtb3VzX3BlcnNvbiI6IHsKLSAgICAgICJmaXJzdF9uYW1l
IjogIkJhcmFjayIsCi0gICAgICAibGFzdF9uYW1lIjogIk9iYW1hIiwKLSAgICAgICJvY2N1cGF0
aW9uIjogIlByZXNpZGVudCIKLSAgICB9Ci0gIH0KLSAgYGBgCi0KLSAgQGNsYXNzIEFjdGl2ZU1v
ZGVsQWRhcHRlcgotICBAY29uc3RydWN0b3IKLSAgQG5hbWVzcGFjZSBEUwotICBAZXh0ZW5kcyBE
Uy5BZGFwdGVyCi0qKi8KLQotRFMuQWN0aXZlTW9kZWxBZGFwdGVyID0gRFMuUkVTVEFkYXB0ZXIu
ZXh0ZW5kKHsKLSAgZGVmYXVsdFNlcmlhbGl6ZXI6ICctYWN0aXZlLW1vZGVsJywKLSAgLyoqCi0g
ICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBwYXRoRm9yVHlwZWAgbWV0
aG9kIHRvIGJ1aWxkCi0gICAgdW5kZXJzY29yZWQgVVJMcyBieSBkZWNhbWVsaXppbmcgYW5kIHBs
dXJhbGl6aW5nIHRoZSBvYmplY3QgdHlwZSBuYW1lLgotCi0gICAgYGBganMKLSAgICAgIHRoaXMu
cGF0aEZvclR5cGUoImZhbW91c1BlcnNvbiIpOwotICAgICAgLy89PiAiZmFtb3VzX3Blb3BsZSIK
LSAgICBgYGAKLQotICAgIEBtZXRob2QgcGF0aEZvclR5cGUKLSAgICBAcGFyYW0ge1N0cmluZ30g
dHlwZQotICAgIEByZXR1cm5zIFN0cmluZwotICAqLwotICBwYXRoRm9yVHlwZTogZnVuY3Rpb24o
dHlwZSkgewotICAgIHZhciBkZWNhbWVsaXplZCA9IGRlY2FtZWxpemUodHlwZSk7Ci0gICAgdmFy
IHVuZGVyc2NvcmVkID0gdW5kZXJzY29yZShkZWNhbWVsaXplZCk7Ci0gICAgcmV0dXJuIHBsdXJh
bGl6ZSh1bmRlcnNjb3JlZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIEFjdGl2ZU1vZGVsQWRh
cHRlciBvdmVycmlkZXMgdGhlIGBhamF4RXJyb3JgIG1ldGhvZAotICAgIHRvIHJldHVybiBhIERT
LkludmFsaWRFcnJvciBmb3IgYWxsIDQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eQotICAgIHJlc3Bv
bnNlcy4KLQotICAgIEEgNDIyIEhUVFAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGdlbmVyYWxs
eSBpbXBsaWVzIHRoYXQgdGhlIHJlcXVlc3QKLSAgICB3YXMgd2VsbCBmb3JtZWQgYnV0IHRoZSBB
UEkgd2FzIHVuYWJsZSB0byBwcm9jZXNzIGl0IGJlY2F1c2UgdGhlCi0gICAgY29udGVudCB3YXMg
bm90IHNlbWFudGljYWxseSBjb3JyZWN0IG9yIG1lYW5pbmdmdWwgcGVyIHRoZSBBUEkuCi0KLSAg
ICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiA0MjIgSFRUUCBFcnJvciBjb2RlIHNlZSAxMS4yIFdl
YkRBViBSRkMgNDkxOAotICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0OTE4I3Nl
Y3Rpb24tMTEuMgotCi0gICAgQG1ldGhvZCBhamF4RXJyb3IKLSAgICBAcGFyYW0ganFYSFIKLSAg
ICBAcmV0dXJucyBlcnJvcgotICAqLwotICBhamF4RXJyb3I6IGZ1bmN0aW9uKGpxWEhSKSB7Ci0g
ICAgdmFyIGVycm9yID0gdGhpcy5fc3VwZXIoanFYSFIpOwotCi0gICAgaWYgKGpxWEhSICYmIGpx
WEhSLnN0YXR1cyA9PT0gNDIyKSB7Ci0gICAgICB2YXIgcmVzcG9uc2UgPSBFbWJlci4kLnBhcnNl
SlNPTihqcVhIUi5yZXNwb25zZVRleHQpLAotICAgICAgICAgIGVycm9ycyA9IHt9OwotCi0gICAg
ICBpZiAocmVzcG9uc2UuZXJyb3JzICE9PSB1bmRlZmluZWQpIHsKLSAgICAgICAgdmFyIGpzb25F
cnJvcnMgPSByZXNwb25zZS5lcnJvcnM7Ci0KLSAgICAgICAgZm9yRWFjaChFbWJlci5rZXlzKGpz
b25FcnJvcnMpLCBmdW5jdGlvbihrZXkpIHsKLSAgICAgICAgICBlcnJvcnNbRW1iZXIuU3RyaW5n
LmNhbWVsaXplKGtleSldID0ganNvbkVycm9yc1trZXldOwotICAgICAgICB9KTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIG5ldyBEUy5JbnZhbGlkRXJyb3IoZXJyb3JzKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5vbkxvYWQo
J0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24oQXBwbGljYXRpb24pIHsKLSAgQXBwbGljYXRp
b24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJhY3RpdmVNb2RlbEFkYXB0ZXIiLAotCi0gICAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewotICAgICAgdmFy
IHByb3h5ID0gbmV3IERTLkNvbnRhaW5lclByb3h5KGNvbnRhaW5lcik7Ci0gICAgICBwcm94eS5y
ZWdpc3RlckRlcHJlY2F0aW9ucyhbCi0gICAgICAgIHtkZXByZWNhdGVkOiAnc2VyaWFsaXplcjpf
YW1zJywgIHZhbGlkOiAnc2VyaWFsaXplcjotYWN0aXZlLW1vZGVsJ30sCi0gICAgICAgIHtkZXBy
ZWNhdGVkOiAnYWRhcHRlcjpfYW1zJywgICAgIHZhbGlkOiAnYWRhcHRlcjotYWN0aXZlLW1vZGVs
J30KLSAgICAgIF0pOwotCi0gICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjot
YWN0aXZlLW1vZGVsJywgRFMuQWN0aXZlTW9kZWxTZXJpYWxpemVyKTsKLSAgICAgIGFwcGxpY2F0
aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1hY3RpdmUtbW9kZWwnLCBEUy5BY3RpdmVNb2RlbEFkYXB0
ZXIpOwotICAgIH0KLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi19KSgpOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9j
b21wb25lbnRzL2VtYmVyLWxvY2Fsc3RvcmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVy
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2VtYmVyLWxvY2Fsc3Rv
cmFnZS1hZGFwdGVyL2xvY2Fsc3RvcmFnZV9hZGFwdGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCA5YTkxOTI2NGU0ZDcyMDkwOTFiNzU4YTc2NjdiODJiYzFlY2UxODkwLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0
b3JhZ2VfYWRhcHRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKmdsb2Jh
bCBFbWJlciovCi0vKmdsb2JhbCBEUyovCi0ndXNlIHN0cmljdCc7Ci0KLURTLkxTQWRhcHRlciA9
IERTLkFkYXB0ZXIuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKLQotICAgIGluaXQ6IGZ1bmN0aW9u
ICgpIHsKLSAgICAgICAgdGhpcy5fbG9hZERhdGEoKTsKLSAgICB9LAotCi0gICAgZ2VuZXJhdGVJ
ZEZvclJlY29yZDogZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50
b1N0cmluZygzMikuc2xpY2UoMikuc3Vic3RyKDAsIDUpOwotICAgIH0sCi0KLSAgICBmaW5kOiBm
dW5jdGlvbiAoc3RvcmUsIHR5cGUsIGlkKSB7Ci0gICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlz
Ll9uYW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNv
bHZlKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7Ci0gICAgfSwKLQotICAgIGZp
bmRNYW55OiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIGlkcykgewotICAgICAgICB2YXIgbmFtZXNw
YWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdmFyIHJlc3VsdHMg
PSBbXTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLSAg
ICAgICAgICAgIHJlc3VsdHMucHVzaChFbWJlci5jb3B5KG5hbWVzcGFjZS5yZWNvcmRzW2lkc1tp
XV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKHJlc3Vs
dHMpOwotICAgIH0sCi0KLSAgLy8gU3VwcG9ydHMgcXVlcmllcyB0aGF0IGxvb2sgbGlrZSB0aGlz
OgotICAvLwotICAvLyAgIHsKLSAgLy8gICAgIDxwcm9wZXJ0eSB0byBxdWVyeT46IDx2YWx1ZSBv
ciByZWdleCAoZm9yIHN0cmluZ3MpIHRvIG1hdGNoPiwKLSAgLy8gICAgIC4uLgotICAvLyAgIH0K
LSAgLy8KLSAgLy8gRXZlcnkgcHJvcGVydHkgYWRkZWQgdG8gdGhlIHF1ZXJ5IGlzIGFuICJBTkQi
IHF1ZXJ5LCBub3QgIk9SIgotICAvLwotICAvLyBFeGFtcGxlOgotICAvLwotICAvLyAgbWF0Y2gg
cmVjb3JkcyB3aXRoICJjb21wbGV0ZTogdHJ1ZSIgYW5kIHRoZSBuYW1lICJmb28iIG9yICJiYXIi
Ci0gIC8vCi0gIC8vICAgIHsgY29tcGxldGU6IHRydWUsIG5hbWU6IC9mb298YmFyLyB9Ci0gICAg
ZmluZFF1ZXJ5OiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHF1ZXJ5LCByZWNvcmRBcnJheSkgewot
ICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAg
ICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnF1ZXJ5KG5hbWVzcGFjZS5yZWNvcmRzLCBxdWVyeSk7
Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUocmVzdWx0cyk7Ci0gICAgfSwKLQot
ICAgIHF1ZXJ5OiBmdW5jdGlvbiAocmVjb3JkcywgcXVlcnkpIHsKLSAgICAgICAgdmFyIHJlc3Vs
dHMgPSBbXTsKLSAgICAgICAgdmFyIGlkLCByZWNvcmQsIHByb3BlcnR5LCB0ZXN0LCBwdXNoOwot
ICAgICAgICBmb3IgKGlkIGluIHJlY29yZHMpIHsKLSAgICAgICAgICAgIHJlY29yZCA9IHJlY29y
ZHNbaWRdOwotICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBxdWVyeSkgewotICAgICAgICAg
ICAgICAgIHRlc3QgPSBxdWVyeVtwcm9wZXJ0eV07Ci0gICAgICAgICAgICAgICAgcHVzaCA9IGZh
bHNlOwotICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwo
dGVzdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1c2gg
PSB0ZXN0LnRlc3QocmVjb3JkW3Byb3BlcnR5XSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAgICAgcHVzaCA9IHJlY29yZFtwcm9wZXJ0eV0gPT09IHRlc3Q7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHB1c2gpIHsK
LSAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9LAotCi0gICAgZmluZEFsbDog
ZnVuY3Rpb24gKHN0b3JlLCB0eXBlKSB7Ci0gICAgICAgIHZhciBuYW1lc3BhY2UgPSB0aGlzLl9u
YW1lc3BhY2VGb3JUeXBlKHR5cGUpOwotICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwotICAgICAg
ICBmb3IgKHZhciBpZCBpbiBuYW1lc3BhY2UucmVjb3JkcykgewotICAgICAgICAgICAgcmVzdWx0
cy5wdXNoKEVtYmVyLmNvcHkobmFtZXNwYWNlLnJlY29yZHNbaWRdKSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIEVtYmVyLlJTVlAucmVzb2x2ZShyZXN1bHRzKTsKLSAgICB9LAotCi0gICAg
Y3JlYXRlUmVjb3JkOiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkgewotICAgICAgICB2
YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsKLSAgICAgICAgdGhp
cy5fYWRkUmVjb3JkVG9OYW1lc3BhY2UobmFtZXNwYWNlLCByZWNvcmQpOwotICAgICAgICB0aGlz
Ll9zYXZlRGF0YSgpOwotICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5yZXNvbHZlKCk7Ci0gICAg
fSwKLQotICAgIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24gKHN0b3JlLCB0eXBlLCByZWNvcmQpIHsK
LSAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZUZvclR5cGUodHlwZSk7Ci0g
ICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQoJ2lkJyk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNv
cmRzW2lkXSA9IHJlY29yZC50b0pTT04oeyBpbmNsdWRlSWQ6IHRydWUgfSk7Ci0gICAgICAgIHRo
aXMuX3NhdmVEYXRhKCk7Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlc29sdmUoKTsKLSAg
ICB9LAotCi0gICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbiAoc3RvcmUsIHR5cGUsIHJlY29yZCkg
ewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlRm9yVHlwZSh0eXBlKTsK
LSAgICAgICAgdmFyIGlkID0gcmVjb3JkLmdldCgnaWQnKTsKLSAgICAgICAgZGVsZXRlIG5hbWVz
cGFjZS5yZWNvcmRzW2lkXTsKLSAgICAgICAgdGhpcy5fc2F2ZURhdGEoKTsKLSAgICAgICAgcmV0
dXJuIEVtYmVyLlJTVlAucmVzb2x2ZSgpOwotICAgIH0sCi0KLSAgLy8gcHJpdmF0ZQotCi0gICAg
X2dldE5hbWVzcGFjZTogZnVuY3Rpb24gKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3Bh
Y2UgfHwgJ0RTLkxTQWRhcHRlcic7Ci0gICAgfSwKLQotICAgIF9sb2FkRGF0YTogZnVuY3Rpb24g
KCkgewotICAgICAgICB0aGlzLl9kYXRhID0ge307Ci0gICAgfSwKLQotICAgIF9zYXZlRGF0YTog
ZnVuY3Rpb24gKCkgewotICAgIH0sCi0KLSAgICBfbmFtZXNwYWNlRm9yVHlwZTogZnVuY3Rpb24g
KHR5cGUpIHsKLSAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHR5cGUudXJsIHx8IHR5cGUudG9TdHJp
bmcoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZXNwYWNlXSB8fCAoCi0gICAgICAg
ICAgICB0aGlzLl9kYXRhW25hbWVzcGFjZV0gPSB7cmVjb3Jkczoge319Ci0gICAgICAgICk7Ci0g
ICAgfSwKLQotICAgIF9hZGRSZWNvcmRUb05hbWVzcGFjZTogZnVuY3Rpb24gKG5hbWVzcGFjZSwg
cmVjb3JkKSB7Ci0gICAgICAgIHZhciBkYXRhID0gcmVjb3JkLnNlcmlhbGl6ZSh7aW5jbHVkZUlk
OiB0cnVlfSk7Ci0gICAgICAgIG5hbWVzcGFjZS5yZWNvcmRzW2RhdGEuaWRdID0gZGF0YTsKLSAg
ICB9Ci19KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50
cy9lbWJlci9lbWJlci5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy9l
bWJlci9lbWJlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1NjcxMWE4Yzg2
NjFkNmU4NDRiZDYwZDFlYTJjYmYyNzI3ODVjNy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMv
ZW1iZXIvZW1iZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDU4MyArMCwwIEBACi0vKiEKLSAq
IEBvdmVydmlldyAgRW1iZXIgLSBKYXZhU2NyaXB0IEFwcGxpY2F0aW9uIEZyYW1ld29yawotICog
QGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMS0yMDE0IFRpbGRlIEluYy4gYW5kIGNvbnRyaWJ1dG9y
cwotICogICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgMjAwNi0yMDExIFN0cm9iZSBJbmMu
Ci0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA4LTIwMTEgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGlj
ZW5zZQotICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9lbWJlcmpzL2Vt
YmVyLmpzL21hc3Rlci9MSUNFTlNFCi0gKiBAdmVyc2lvbiAgIDEuMy4xCi0gKi8KLQotCi0oZnVu
Y3Rpb24oKSB7Ci0vKmdsb2JhbCBfX2ZhaWxfXyovCi0KLS8qKgotRW1iZXIgRGVidWcKLQotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1kZWJ1ZwotKi8KLQotLyoqCi1AY2xhc3MgRW1i
ZXIKLSovCi0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyKSB7Ci0gIEVtYmVyID0g
e307Ci0KLSAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93KSB7Ci0gICAgd2luZG93
LkVtID0gd2luZG93LkVtYmVyID0gRW0gPSBFbWJlcjsKLSAgfQotfQotCi0vLyBUaGlzIG5lZWRz
IHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2dpYyBpbgotLy8gYHBhY2thZ2VzL2VtYmVy
LW1ldGFsL2xpYi9jb3JlLmpzYC4KLS8vCi0vLyBUaGlzIGlzIGR1cGxpY2F0ZWQgaGVyZSB0byBl
bnN1cmUgdGhhdCBgRW1iZXIuRU5WYAotLy8gaXMgc2V0dXAgZXZlbiBpZiBgRW1iZXJgIGlzIG5v
dCBsb2FkZWQgeWV0LgotaWYgKEVtYmVyLkVOVikgewotICAvLyBkbyBub3RoaW5nIGlmIEVtYmVy
LkVOViBpcyBhbHJlYWR5IHNldHVwCi19IGVsc2UgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Yg
RW1iZXJFTlYpIHsKLSAgRW1iZXIuRU5WID0gRW1iZXJFTlY7Ci19IGVsc2UgaWYoJ3VuZGVmaW5l
ZCcgIT09IHR5cGVvZiBFTlYpIHsKLSAgRW1iZXIuRU5WID0gRU5WOwotfSBlbHNlIHsKLSAgRW1i
ZXIuRU5WID0ge307Ci19Ci0KLWlmICghKCdNQU5EQVRPUllfU0VUVEVSJyBpbiBFbWJlci5FTlYp
KSB7Ci0gIEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSID0gdHJ1ZTsgLy8gZGVmYXVsdCB0byB0
cnVlIGZvciBkZWJ1ZyBkaXN0Ci19Ci0KLS8qKgotICBEZWZpbmUgYW4gYXNzZXJ0aW9uIHRoYXQg
d2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QKLSAgbWV0LiBF
bWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8gYEVtYmVyLmFzc2VydCgp
YCB3aGVuCi0gIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4gRXhhbXBsZToKLQotICBgYGBqYXZh
c2NyaXB0Ci0gIC8vIFRlc3QgZm9yIHRydXRoaW5lc3MKLSAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBh
c3MgYSB2YWxpZCBvYmplY3QnLCBvYmopOwotICAvLyBGYWlsIHVuY29uZGl0aW9uYWxseQotICBF
bWJlci5hc3NlcnQoJ1RoaXMgY29kZSBwYXRoIHNob3VsZCBuZXZlciBiZSBydW4nKQotICBgYGAK
LQotICBAbWV0aG9kIGFzc2VydAotICBAcGFyYW0ge1N0cmluZ30gZGVzYyBBIGRlc2NyaXB0aW9u
IG9mIHRoZSBhc3NlcnRpb24uIFRoaXMgd2lsbCBiZWNvbWUKLSAgICB0aGUgdGV4dCBvZiB0aGUg
RXJyb3IgdGhyb3duIGlmIHRoZSBhc3NlcnRpb24gZmFpbHMuCi0gIEBwYXJhbSB7Qm9vbGVhbn0g
dGVzdCBNdXN0IGJlIHRydXRoeSBmb3IgdGhlIGFzc2VydGlvbiB0byBwYXNzLiBJZgotICAgIGZh
bHN5LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0qLwotRW1iZXIuYXNzZXJ0ID0gZnVu
Y3Rpb24oZGVzYywgdGVzdCkgewotICBpZiAoIXRlc3QpIHsKLSAgICBFbWJlci5Mb2dnZXIuYXNz
ZXJ0KHRlc3QsIGRlc2MpOwotICB9Ci0KLSAgaWYgKEVtYmVyLnRlc3RpbmcgJiYgIXRlc3QpIHsK
LSAgICAvLyB3aGVuIHRlc3RpbmcsIGVuc3VyZSB0ZXN0IGZhaWx1cmVzIHdoZW4gYXNzZXJ0aW9u
cyBmYWlsCi0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJBc3NlcnRpb24gRmFpbGVkOiAiICsg
ZGVzYyk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gIERpc3BsYXkgYSB3YXJuaW5nIHdpdGggdGhlIHBy
b3ZpZGVkIG1lc3NhZ2UuIEVtYmVyIGJ1aWxkIHRvb2xzIHdpbGwKLSAgcmVtb3ZlIGFueSBjYWxs
cyB0byBgRW1iZXIud2FybigpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBA
bWV0aG9kIHdhcm4KLSAgQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSB3YXJuaW5nIHRvIGRpc3Bs
YXkuCi0gIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdCBBbiBvcHRpb25hbCBib29sZWFuLiBJZiBmYWxz
eSwgdGhlIHdhcm5pbmcKLSAgICB3aWxsIGJlIGRpc3BsYXllZC4KLSovCi1FbWJlci53YXJuID0g
ZnVuY3Rpb24obWVzc2FnZSwgdGVzdCkgewotICBpZiAoIXRlc3QpIHsKLSAgICBFbWJlci5Mb2dn
ZXIud2FybigiV0FSTklORzogIittZXNzYWdlKTsKLSAgICBpZiAoJ3RyYWNlJyBpbiBFbWJlci5M
b2dnZXIpIEVtYmVyLkxvZ2dlci50cmFjZSgpOwotICB9Ci19OwotCi0vKioKLSAgRGlzcGxheSBh
IGRlYnVnIG5vdGljZS4gRW1iZXIgYnVpbGQgdG9vbHMgd2lsbCByZW1vdmUgYW55IGNhbGxzIHRv
Ci0gIGBFbWJlci5kZWJ1ZygpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBg
YGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmRlYnVnKCJJJ20gYSBkZWJ1ZyBub3RpY2UhIik7Ci0gIGBg
YAotCi0gIEBtZXRob2QgZGVidWcKLSAgQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgQSBkZWJ1ZyBt
ZXNzYWdlIHRvIGRpc3BsYXkuCi0qLwotRW1iZXIuZGVidWcgPSBmdW5jdGlvbihtZXNzYWdlKSB7
Ci0gIEVtYmVyLkxvZ2dlci5kZWJ1ZygiREVCVUc6ICIrbWVzc2FnZSk7Ci19OwotCi0vKioKLSAg
RGlzcGxheSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZSBh
bmQgYSBzdGFjayB0cmFjZQotICAoQ2hyb21lIGFuZCBGaXJlZm94IG9ubHkpLiBFbWJlciBidWls
ZCB0b29scyB3aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8KLSAgYEVtYmVyLmRlcHJlY2F0ZSgpYCB3
aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWlsZC4KLQotICBAbWV0aG9kIGRlcHJlY2F0ZQotICBA
cGFyYW0ge1N0cmluZ30gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4K
LSAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IEFuIG9wdGlvbmFsIGJvb2xlYW4uIElmIGZhbHN5LCB0
aGUgZGVwcmVjYXRpb24KLSAgICB3aWxsIGJlIGRpc3BsYXllZC4KLSovCi1FbWJlci5kZXByZWNh
dGUgPSBmdW5jdGlvbihtZXNzYWdlLCB0ZXN0KSB7Ci0gIGlmIChFbWJlci5URVNUSU5HX0RFUFJF
Q0FUSU9OKSB7IHJldHVybjsgfQotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7IHRl
c3QgPSBmYWxzZTsgfQotICBpZiAodGVzdCkgeyByZXR1cm47IH0KLQotICBpZiAoRW1iZXIuRU5W
LlJBSVNFX09OX0RFUFJFQ0FUSU9OKSB7IHRocm93IG5ldyBFbWJlci5FcnJvcihtZXNzYWdlKTsg
fQotCi0gIHZhciBlcnJvcjsKLQotICAvLyBXaGVuIHVzaW5nIG5ldyBFcnJvciwgd2UgY2FuJ3Qg
ZG8gdGhlIGFyZ3VtZW50cyBjaGVjayBmb3IgQ2hyb21lLiBBbHRlcm5hdGl2ZXMgYXJlIHdlbGNv
bWUKLSAgdHJ5IHsgX19mYWlsX18uZmFpbCgpOyB9IGNhdGNoIChlKSB7IGVycm9yID0gZTsgfQot
Ci0gIGlmIChFbWJlci5MT0dfU1RBQ0tUUkFDRV9PTl9ERVBSRUNBVElPTiAmJiBlcnJvci5zdGFj
aykgewotICAgIHZhciBzdGFjaywgc3RhY2tTdHIgPSAnJzsKLSAgICBpZiAoZXJyb3JbJ2FyZ3Vt
ZW50cyddKSB7Ci0gICAgICAvLyBDaHJvbWUKLSAgICAgIHN0YWNrID0gZXJyb3Iuc3RhY2sucmVw
bGFjZSgvXlxzK2F0XHMrL2dtLCAnJykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxh
Y2UoL14oW15cKF0rPykoW1xuJF0pL2dtLCAne2Fub255bW91c30oJDEpJDInKS4KLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxzKlwoKFteXCld
KylcKS9nbSwgJ3thbm9ueW1vdXN9KCQxKScpLnNwbGl0KCdcbicpOwotICAgICAgc3RhY2suc2hp
ZnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRmlyZWZveAotICAgICAgc3RhY2sgPSBlcnJv
ci5zdGFjay5yZXBsYWNlKC8oPzpcbkA6MCk/XHMrJC9tLCAnJykuCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlcGxhY2UoL15cKC9nbSwgJ3thbm9ueW1vdXN9KCcpLnNwbGl0KCdcbicpOwot
ICAgIH0KLQotICAgIHN0YWNrU3RyID0gIlxuICAgICIgKyBzdGFjay5zbGljZSgyKS5qb2luKCJc
biAgICAiKTsKLSAgICBtZXNzYWdlID0gbWVzc2FnZSArIHN0YWNrU3RyOwotICB9Ci0KLSAgRW1i
ZXIuTG9nZ2VyLndhcm4oIkRFUFJFQ0FUSU9OOiAiK21lc3NhZ2UpOwotfTsKLQotCi0KLS8qKgot
ICBBbGlhcyBhbiBvbGQsIGRlcHJlY2F0ZWQgbWV0aG9kIHdpdGggaXRzIG5ldyBjb3VudGVycGFy
dC4KLQotICBEaXNwbGF5IGEgZGVwcmVjYXRpb24gd2FybmluZyB3aXRoIHRoZSBwcm92aWRlZCBt
ZXNzYWdlIGFuZCBhIHN0YWNrIHRyYWNlCi0gIChDaHJvbWUgYW5kIEZpcmVmb3ggb25seSkgd2hl
biB0aGUgYXNzaWduZWQgbWV0aG9kIGlzIGNhbGxlZC4KLQotICBFbWJlciBidWlsZCB0b29scyB3
aWxsIG5vdCByZW1vdmUgY2FsbHMgdG8gYEVtYmVyLmRlcHJlY2F0ZUZ1bmMoKWAsIHRob3VnaAot
ICBubyB3YXJuaW5ncyB3aWxsIGJlIHNob3duIGluIHByb2R1Y3Rpb24uCi0KLSAgYGBgamF2YXNj
cmlwdAotICBFbWJlci5vbGRNZXRob2QgPSBFbWJlci5kZXByZWNhdGVGdW5jKCJQbGVhc2UgdXNl
IHRoZSBuZXcsIHVwZGF0ZWQgbWV0aG9kIiwgRW1iZXIubmV3TWV0aG9kKTsKLSAgYGBgCi0KLSAg
QG1ldGhvZCBkZXByZWNhdGVGdW5jCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIEEgZGVzY3Jp
cHRpb24gb2YgdGhlIGRlcHJlY2F0aW9uLgotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBu
ZXcgZnVuY3Rpb24gY2FsbGVkIHRvIHJlcGxhY2UgaXRzIGRlcHJlY2F0ZWQgY291bnRlcnBhcnQu
Ci0gIEByZXR1cm4ge0Z1bmN0aW9ufSBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBwZWQgdGhlIG9y
aWdpbmFsIGZ1bmN0aW9uIHdpdGggYSBkZXByZWNhdGlvbiB3YXJuaW5nCi0qLwotRW1iZXIuZGVw
cmVjYXRlRnVuYyA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZ1bmMpIHsKLSAgcmV0dXJuIGZ1bmN0aW9u
KCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZShtZXNzYWdlKTsKLSAgICByZXR1cm4gZnVuYy5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOwotICB9OwotfTsKLQotCi0vLyBJbmZvcm0gdGhlIGRldmVsb3Bl
ciBhYm91dCB0aGUgRW1iZXIgSW5zcGVjdG9yIGlmIG5vdCBpbnN0YWxsZWQuCi1pZiAoIUVtYmVy
LnRlc3RpbmcpIHsKLSAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRv
dy5jaHJvbWUgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKLSAgICB3aW5kb3cuYWRkRXZl
bnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCkgewotICAgICAgaWYgKGRvY3VtZW50LmJvZHkg
JiYgZG9jdW1lbnQuYm9keS5kYXRhc2V0ICYmICFkb2N1bWVudC5ib2R5LmRhdGFzZXQuZW1iZXJF
eHRlbnNpb24pIHsKLSAgICAgICAgRW1iZXIuZGVidWcoJ0ZvciBtb3JlIGFkdmFuY2VkIGRlYnVn
Z2luZywgaW5zdGFsbCB0aGUgRW1iZXIgSW5zcGVjdG9yIGZyb20gaHR0cHM6Ly9jaHJvbWUuZ29v
Z2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvZW1iZXItaW5zcGVjdG9yL2JtZGJsbmNlZ2tlbmthY2ll
aWhmaHBqZnBwb2NvbmhpJyk7Ci0gICAgICB9Ci0gICAgfSwgZmFsc2UpOwotICB9Ci19Ci0KLX0p
KCk7Ci0KLS8qIQotICogQG92ZXJ2aWV3ICBFbWJlciAtIEphdmFTY3JpcHQgQXBwbGljYXRpb24g
RnJhbWV3b3JrCi0gKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDExLTIwMTQgVGlsZGUgSW5jLiBh
bmQgY29udHJpYnV0b3JzCi0gKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA2LTIw
MTEgU3Ryb2JlIEluYy4KLSAqICAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDgtMjAx
MSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBAbGljZW5zZSAgIExpY2Vuc2Vk
IHVuZGVyIE1JVCBsaWNlbnNlCi0gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWIu
Y29tL2VtYmVyanMvZW1iZXIuanMvbWFzdGVyL0xJQ0VOU0UKLSAqIEB2ZXJzaW9uICAgMS4zLjEK
LSAqLwotCi0KLShmdW5jdGlvbigpIHsKLXZhciBkZWZpbmUsIHJlcXVpcmVNb2R1bGUsIHJlcXVp
cmUsIHJlcXVpcmVqczsKLQotKGZ1bmN0aW9uKCkgewotICB2YXIgcmVnaXN0cnkgPSB7fSwgc2Vl
biA9IHt9OwotCi0gIGRlZmluZSA9IGZ1bmN0aW9uKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7Ci0g
ICAgcmVnaXN0cnlbbmFtZV0gPSB7IGRlcHM6IGRlcHMsIGNhbGxiYWNrOiBjYWxsYmFjayB9Owot
ICB9OwotCi0gIHJlcXVpcmVqcyA9IHJlcXVpcmUgPSByZXF1aXJlTW9kdWxlID0gZnVuY3Rpb24o
bmFtZSkgewotICByZXF1aXJlanMuX2Vha19zZWVuID0gcmVnaXN0cnk7Ci0KLSAgICBpZiAoc2Vl
bltuYW1lXSkgeyByZXR1cm4gc2VlbltuYW1lXTsgfQotICAgIHNlZW5bbmFtZV0gPSB7fTsKLQot
ICAgIGlmICghcmVnaXN0cnlbbmFtZV0pIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQg
bm90IGZpbmQgbW9kdWxlICIgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICB2YXIgbW9kID0gcmVnaXN0
cnlbbmFtZV0sCi0gICAgICAgIGRlcHMgPSBtb2QuZGVwcywKLSAgICAgICAgY2FsbGJhY2sgPSBt
b2QuY2FsbGJhY2ssCi0gICAgICAgIHJlaWZpZWQgPSBbXSwKLSAgICAgICAgZXhwb3J0czsKLQot
ICAgIGZvciAodmFyIGk9MCwgbD1kZXBzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIGlmIChk
ZXBzW2ldID09PSAnZXhwb3J0cycpIHsKLSAgICAgICAgcmVpZmllZC5wdXNoKGV4cG9ydHMgPSB7
fSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShy
ZXNvbHZlKGRlcHNbaV0pKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdmFyIHZhbHVlID0gY2Fs
bGJhY2suYXBwbHkodGhpcywgcmVpZmllZCk7Ci0gICAgcmV0dXJuIHNlZW5bbmFtZV0gPSBleHBv
cnRzIHx8IHZhbHVlOwotCi0gICAgZnVuY3Rpb24gcmVzb2x2ZShjaGlsZCkgewotICAgICAgaWYg
KGNoaWxkLmNoYXJBdCgwKSAhPT0gJy4nKSB7IHJldHVybiBjaGlsZDsgfQotICAgICAgdmFyIHBh
cnRzID0gY2hpbGQuc3BsaXQoIi8iKTsKLSAgICAgIHZhciBwYXJlbnRCYXNlID0gbmFtZS5zcGxp
dCgiLyIpLnNsaWNlKDAsIC0xKTsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0
aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKLQotICAgICAgICBp
ZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNlLnBvcCgpOyB9Ci0gICAgICAgIGVsc2UgaWYg
KHBhcnQgPT09ICcuJykgeyBjb250aW51ZTsgfQotICAgICAgICBlbHNlIHsgcGFyZW50QmFzZS5w
dXNoKHBhcnQpOyB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwYXJlbnRCYXNlLmpvaW4oIi8i
KTsKLSAgICB9Ci0gIH07Ci19KSgpOwotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEVtOnRydWUg
RU5WIEVtYmVyRU5WIE1ldGFtb3JwaEVOVjp0cnVlICovCi0KLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotLyoqCi0gIEFsbCBFbWJlciBtZXRob2RzIGFu
ZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW5zaWRlIG9mIHRoaXMgbmFtZXNwYWNlLiBZb3UKLSAg
Z2VuZXJhbGx5IHNob3VsZCBub3QgYWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXMgbmFtZXNwYWNl
IGFzIGl0IG1heSBiZQotICBvdmVyd3JpdHRlbiBieSBmdXR1cmUgdmVyc2lvbnMgb2YgRW1iZXIu
Ci0KLSAgWW91IGNhbiBhbHNvIHVzZSB0aGUgc2hvcnRoYW5kIGBFbWAgaW5zdGVhZCBvZiBgRW1i
ZXJgLgotCi0gIEVtYmVyLVJ1bnRpbWUgaXMgYSBmcmFtZXdvcmsgdGhhdCBwcm92aWRlcyBjb3Jl
IGZ1bmN0aW9ucyBmb3IgRW1iZXIgaW5jbHVkaW5nCi0gIGNyb3NzLXBsYXRmb3JtIGZ1bmN0aW9u
cywgc3VwcG9ydCBmb3IgcHJvcGVydHkgb2JzZXJ2aW5nIGFuZCBvYmplY3RzLiBJdHMKLSAgZm9j
dXMgaXMgb24gc21hbGwgc2l6ZSBhbmQgcGVyZm9ybWFuY2UuIFlvdSBjYW4gdXNlIHRoaXMgaW4g
cGxhY2Ugb2Ygb3IKLSAgYWxvbmctc2lkZSBvdGhlciBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJpZXMg
c3VjaCBhcyBqUXVlcnkuCi0KLSAgVGhlIGNvcmUgUnVudGltZSBmcmFtZXdvcmsgaXMgYmFzZWQg
b24gdGhlIGpRdWVyeSBBUEkgd2l0aCBhIG51bWJlciBvZgotICBwZXJmb3JtYW5jZSBvcHRpbWl6
YXRpb25zLgotCi0gIEBjbGFzcyBFbWJlcgotICBAc3RhdGljCi0gIEB2ZXJzaW9uIDEuMy4xCi0q
LwotCi1pZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlcikgewotICAvLyBDcmVhdGUgY29y
ZSBvYmplY3QuIE1ha2UgaXQgYWN0IGxpa2UgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTmFtZXNwYWNl
IHNvIHRoYXQKLSAgLy8gb2JqZWN0cyBhc3NpZ25lZCB0byBpdCBhcmUgZ2l2ZW4gYSBzYW5lIHN0
cmluZyByZXByZXNlbnRhdGlvbi4KLSAgRW1iZXIgPSB7fTsKLX0KLQotLy8gRGVmYXVsdCBpbXBv
cnRzLCBleHBvcnRzIGFuZCBsb29rdXAgdG8gdGhlIGdsb2JhbCBvYmplY3Q7Ci12YXIgaW1wb3J0
cyA9IEVtYmVyLmltcG9ydHMgPSBFbWJlci5pbXBvcnRzIHx8IHRoaXM7Ci12YXIgZXhwb3J0cyA9
IEVtYmVyLmV4cG9ydHMgPSBFbWJlci5leHBvcnRzIHx8IHRoaXM7Ci12YXIgbG9va3VwICA9IEVt
YmVyLmxvb2t1cCAgPSBFbWJlci5sb29rdXAgIHx8IHRoaXM7Ci0KLS8vIGFsaWFzZXMgbmVlZGVk
IHRvIGtlZXAgbWluaWZpZXJzIGZyb20gcmVtb3ZpbmcgdGhlIGdsb2JhbCBjb250ZXh0Ci1leHBv
cnRzLkVtID0gZXhwb3J0cy5FbWJlciA9IEVtID0gRW1iZXI7Ci0KLS8vIE1ha2Ugc3VyZSB0aGVz
ZSBhcmUgc2V0IHdoZXRoZXIgRW1iZXIgd2FzIGFscmVhZHkgZGVmaW5lZCBvciBub3QKLQotRW1i
ZXIuaXNOYW1lc3BhY2UgPSB0cnVlOwotCi1FbWJlci50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyBy
ZXR1cm4gIkVtYmVyIjsgfTsKLQotCi0vKioKLSAgQHByb3BlcnR5IFZFUlNJT04KLSAgQHR5cGUg
U3RyaW5nCi0gIEBkZWZhdWx0ICcxLjMuMScKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlZFUlNJT04g
PSAnMS4zLjEnOwotCi0vKioKLSAgU3RhbmRhcmQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMuIFlv
dSBjYW4gZGVmaW5lIHRoZXNlIGluIGEgZ2xvYmFsIGBFbWJlckVOVmAKLSAgdmFyaWFibGUgYmVm
b3JlIGxvYWRpbmcgRW1iZXIgdG8gY29udHJvbCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGlu
Z3MuCi0KLSAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9u
cyBvZiBFbWJlciB0aGUgZ2xvYmFsIGBFTlZgCi0gIHZhcmlhYmxlIHdpbGwgYmUgdXNlZCBpZiBg
RW1iZXJFTlZgIGlzIG5vdCBkZWZpbmVkLgotCi0gIEBwcm9wZXJ0eSBFTlYKLSAgQHR5cGUgSGFz
aAotKi8KLQotLy8gVGhpcyBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgbG9naWMg
aW4KLS8vIGBwYWNrYWdlcy9lbWJlci1kZWJ1Zy9saWIvbWFpbi5qc2AuCi1pZiAoRW1iZXIuRU5W
KSB7Ci0gIC8vIGRvIG5vdGhpbmcgaWYgRW1iZXIuRU5WIGlzIGFscmVhZHkgc2V0dXAKLX0gZWxz
ZSBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFbWJlckVOVikgewotICBFbWJlci5FTlYgPSBF
bWJlckVOVjsKLX0gZWxzZSBpZigndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEVOVikgewotICBFbWJl
ci5FTlYgPSBFTlY7Ci19IGVsc2UgewotICBFbWJlci5FTlYgPSB7fTsKLX0KLQotRW1iZXIuY29u
ZmlnID0gRW1iZXIuY29uZmlnIHx8IHt9OwotCi0vLyBXZSBkaXNhYmxlIHRoZSBSQU5HRSBBUEkg
YnkgZGVmYXVsdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwotaWYgKCd1bmRlZmluZWQnID09PSB0
eXBlb2YgRW1iZXIuRU5WLkRJU0FCTEVfUkFOR0VfQVBJKSB7Ci0gIEVtYmVyLkVOVi5ESVNBQkxF
X1JBTkdFX0FQSSA9IHRydWU7Ci19Ci0KLWlmICgidW5kZWZpbmVkIiA9PT0gdHlwZW9mIE1ldGFt
b3JwaEVOVikgewotICBleHBvcnRzLk1ldGFtb3JwaEVOViA9IHt9OwotfQotCi1NZXRhbW9ycGhF
TlYuRElTQUJMRV9SQU5HRV9BUEkgPSBFbWJlci5FTlYuRElTQUJMRV9SQU5HRV9BUEk7Ci0KLS8q
KgotICBIYXNoIG9mIGVuYWJsZWQgQ2FuYXJ5IGZlYXR1cmVzLiBBZGQgdG8gYmVmb3JlIGNyZWF0
aW5nIHlvdXIgYXBwbGljYXRpb24uCi0KLSAgWW91IGNhbiBhbHNvIGRlZmluZSBgRU5WLkZFQVRV
UkVTYCBpZiB5b3UgbmVlZCB0byBlbmFibGUgZmVhdHVyZXMgZmxhZ2dlZCBhdCBydW50aW1lLgot
Ci0gIEBwcm9wZXJ0eSBGRUFUVVJFUwotICBAdHlwZSBIYXNoCi0qLwotCi1FbWJlci5GRUFUVVJF
UyA9IEVtYmVyLkVOVi5GRUFUVVJFUyB8fCB7fTsKLQotLyoqCi0gIFRlc3QgdGhhdCBhIGZlYXR1
cmUgaXMgZW5hYmxlZC4gUGFyc2VkIGJ5IEVtYmVyJ3MgYnVpbGQgdG9vbHMgdG8gbGVhdmUKLSAg
ZXhwZXJpbWVudGFsIGZlYXR1cmVzIG91dCBvZiBiZXRhL3N0YWJsZSBidWlsZHMuCi0KLSAgWW91
IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6Ci0KLSAgKiBg
RU5WLkVOQUJMRV9BTExfRkVBVFVSRVNgIC0gZm9yY2UgYWxsIGZlYXR1cmVzIHRvIGJlIGVuYWJs
ZWQuCi0gICogYEVOVi5FTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVNgIC0gZW5hYmxlIGFueSBmZWF0
dXJlcyB0aGF0IGhhdmUgbm90IGJlZW4gZXhwbGljaXRseQotICAgIGVuYWJsZWQvZGlzYWJsZWQu
Ci0KLSAgQG1ldGhvZCBpc0VuYWJsZWQKLSAgQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUKLSovCi0K
LUVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKGZlYXR1cmUpIHsKLSAgdmFyIGZl
YXR1cmVWYWx1ZSA9IEVtYmVyLkZFQVRVUkVTW2ZlYXR1cmVdOwotCi0gIGlmIChFbWJlci5FTlYu
RU5BQkxFX0FMTF9GRUFUVVJFUykgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKGZl
YXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFsdWUgPT09IGZhbHNlIHx8IGZlYXR1cmVW
YWx1ZSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTsKLSAgfSBlbHNl
IGlmIChFbWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZFQVRVUkVTKSB7Ci0gICAgcmV0dXJuIHRy
dWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi0vLyAuLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBC
T09UU1RSQVAKLS8vCi0KLS8qKgotICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGVu
aGFuY2VzIHNvbWUgYnVpbHQtaW4gb2JqZWN0IHByb3RvdHlwZXMgdG8KLSAgcHJvdmlkZSBhIG1v
cmUgZnJpZW5kbHkgQVBJLiBJZiBlbmFibGVkLCBhIGZldyBtZXRob2RzIHdpbGwgYmUgYWRkZWQg
dG8KLSAgYEZ1bmN0aW9uYCwgYFN0cmluZ2AsIGFuZCBgQXJyYXlgLiBgT2JqZWN0LnByb3RvdHlw
ZWAgd2lsbCBub3QgYmUgZW5oYW5jZWQsCi0gIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBjYXVzZXMg
bW9zdCB0cm91YmxlIGZvciBwZW9wbGUuCi0KLSAgSW4gZ2VuZXJhbCB3ZSByZWNvbW1lbmQgbGVh
dmluZyB0aGlzIG9wdGlvbiBzZXQgdG8gdHJ1ZSBzaW5jZSBpdCByYXJlbHkKLSAgY29uZmxpY3Rz
IHdpdGggb3RoZXIgY29kZS4gSWYgeW91IG5lZWQgdG8gdHVybiBpdCBvZmYgaG93ZXZlciwgeW91
IGNhbgotICBkZWZpbmUgYW4gYEVOVi5FWFRFTkRfUFJPVE9UWVBFU2AgY29uZmlnIHRvIGRpc2Fi
bGUgaXQuCi0KLSAgQHByb3BlcnR5IEVYVEVORF9QUk9UT1RZUEVTCi0gIEB0eXBlIEJvb2xlYW4K
LSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID0gRW1iZXIuRU5W
LkVYVEVORF9QUk9UT1RZUEVTOwotCi1pZiAodHlwZW9mIEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT
ID09PSAndW5kZWZpbmVkJykgewotICBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9IHRydWU7Ci19
Ci0KLS8qKgotICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgbG9ncyBhIGZ1bGwgc3RhY2sgdHJh
Y2UgZHVyaW5nIGRlcHJlY2F0aW9uIHdhcm5pbmdzCi0KLSAgQHByb3BlcnR5IExPR19TVEFDS1RS
QUNFX09OX0RFUFJFQ0FUSU9OCi0gIEB0eXBlIEJvb2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8K
LUVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OID0gKEVtYmVyLkVOVi5MT0dfU1RB
Q0tUUkFDRV9PTl9ERVBSRUNBVElPTiAhPT0gZmFsc2UpOwotCi0vKioKLSAgRGV0ZXJtaW5lcyB3
aGV0aGVyIEVtYmVyIHNob3VsZCBhZGQgRUNNQVNjcmlwdCA1IHNoaW1zIHRvIG9sZGVyIGJyb3dz
ZXJzLgotCi0gIEBwcm9wZXJ0eSBTSElNX0VTNQotICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0
IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTCi0qLwotRW1iZXIuU0hJTV9FUzUgPSAoRW1iZXIuRU5W
LlNISU1fRVM1ID09PSBmYWxzZSkgPyBmYWxzZSA6IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTOwot
Ci0vKioKLSAgRGV0ZXJtaW5lcyB3aGV0aGVyIEVtYmVyIGxvZ3MgaW5mbyBhYm91dCB2ZXJzaW9u
IG9mIHVzZWQgbGlicmFyaWVzCi0KLSAgQHByb3BlcnR5IExPR19WRVJTSU9OCi0gIEB0eXBlIEJv
b2xlYW4KLSAgQGRlZmF1bHQgdHJ1ZQotKi8KLUVtYmVyLkxPR19WRVJTSU9OID0gKEVtYmVyLkVO
Vi5MT0dfVkVSU0lPTiA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOwotCi0vKioKLSAgRW1wdHkg
ZnVuY3Rpb24uIFVzZWZ1bCBmb3Igc29tZSBvcGVyYXRpb25zLiBBbHdheXMgcmV0dXJucyBgdGhp
c2AuCi0KLSAgQG1ldGhvZCBLCi0gIEBwcml2YXRlCi0gIEByZXR1cm4ge09iamVjdH0KLSovCi1F
bWJlci5LID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9OwotCi0KLS8vIFN0dWIgb3V0IHRo
ZSBtZXRob2RzIGRlZmluZWQgYnkgdGhlIGVtYmVyLWRlYnVnIHBhY2thZ2UgaW4gY2FzZSBpdCdz
IG5vdCBsb2FkZWQKLQotaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuYXNzZXJ0KSB7
IEVtYmVyLmFzc2VydCA9IEVtYmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVt
YmVyLndhcm4pIHsgRW1iZXIud2FybiA9IEVtYmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0g
dHlwZW9mIEVtYmVyLmRlYnVnKSB7IEVtYmVyLmRlYnVnID0gRW1iZXIuSzsgfQotaWYgKCd1bmRl
ZmluZWQnID09PSB0eXBlb2YgRW1iZXIuZGVwcmVjYXRlKSB7IEVtYmVyLmRlcHJlY2F0ZSA9IEVt
YmVyLks7IH0KLWlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEVtYmVyLmRlcHJlY2F0ZUZ1bmMp
IHsKLSAgRW1iZXIuZGVwcmVjYXRlRnVuYyA9IGZ1bmN0aW9uKF8sIGZ1bmMpIHsgcmV0dXJuIGZ1
bmM7IH07Ci19Ci0KLS8qKgotICBQcmV2aW91c2x5IHdlIHVzZWQgYEVtYmVyLiQudXVpZGAsIGhv
d2V2ZXIgYCQudXVpZGAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCi0gIGpRdWVyeSBtYXN0ZXIuIFdl
J2xsIGp1c3QgYm9vdHN0cmFwIG91ciBvd24gdXVpZCBub3cuCi0KLSAgQHByb3BlcnR5IHV1aWQK
LSAgQHR5cGUgTnVtYmVyCi0gIEBwcml2YXRlCi0qLwotRW1iZXIudXVpZCA9IDA7Ci0KLS8qKgot
ICBNZXJnZSB0aGUgY29udGVudHMgb2YgdHdvIG9iamVjdHMgdG9nZXRoZXIgaW50byB0aGUgZmly
c3Qgb2JqZWN0LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIubWVyZ2Uoe2ZpcnN0OiAnVG9t
J30sIHtsYXN0OiAnRGFsZSd9KTsgLy8ge2ZpcnN0OiAnVG9tJywgbGFzdDogJ0RhbGUnfQotICB2
YXIgYSA9IHtmaXJzdDogJ1llaHVkYSd9LCBiID0ge2xhc3Q6ICdLYXR6J307Ci0gIEVtYmVyLm1l
cmdlKGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1llaHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0g
e2xhc3Q6ICdLYXR6J30KLSAgYGBgCi0KLSAgQG1ldGhvZCBtZXJnZQotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5hbCBUaGUgb2JqZWN0IHRvIG1lcmdlIGludG8KLSAgQHBh
cmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbQot
ICBAcmV0dXJuIHtPYmplY3R9Ci0qLwotRW1iZXIubWVyZ2UgPSBmdW5jdGlvbihvcmlnaW5hbCwg
dXBkYXRlcykgewotICBmb3IgKHZhciBwcm9wIGluIHVwZGF0ZXMpIHsKLSAgICBpZiAoIXVwZGF0
ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAgICBvcmlnaW5hbFtwcm9w
XSA9IHVwZGF0ZXNbcHJvcF07Ci0gIH0KLSAgcmV0dXJuIG9yaWdpbmFsOwotfTsKLQotLyoqCi0g
IFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMKLSAgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcgYWJvdXQgdXNlIG9m
ID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkKLSAgY29uZnVzaW5nLgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgRW1iZXIuaXNOb25lKCk7ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlz
Tm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQotICBFbWJlci5pc05vbmUodW5kZWZpbmVkKTsg
ICAgIC8vIHRydWUKLSAgRW1iZXIuaXNOb25lKCcnKTsgICAgICAgICAgICAvLyBmYWxzZQotICBF
bWJlci5pc05vbmUoW10pOyAgICAgICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlzTm9uZShmdW5j
dGlvbigpIHt9KTsgIC8vIGZhbHNlCi0gIGBgYAotCi0gIEBtZXRob2QgaXNOb25lCi0gIEBmb3Ig
RW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0ZXN0Ci0gIEByZXR1cm4ge0Jv
b2xlYW59Ci0qLwotRW1iZXIuaXNOb25lID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVybiBvYmog
PT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQ7Ci19OwotRW1iZXIubm9uZSA9IEVtYmVyLmRl
cHJlY2F0ZUZ1bmMoIkVtYmVyLm5vbmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5p
c05vbmUgaW5zdGVhZC4iLCBFbWJlci5pc05vbmUpOwotCi0vKioKLSAgVmVyaWZpZXMgdGhhdCBh
IHZhbHVlIGlzIGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcsIGVtcHR5IGFycmF5LAotICBvciBl
bXB0eSBmdW5jdGlvbi4KLQotICBDb25zdHJhaW5zIHRoZSBydWxlcyBvbiBgRW1iZXIuaXNOb25l
YCBieSByZXR1cm5pbmcgZmFsc2UgZm9yIGVtcHR5Ci0gIHN0cmluZyBhbmQgZW1wdHkgYXJyYXlz
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuaXNFbXB0eSgpOyAgICAgICAgICAgICAgICAv
LyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkobnVsbCk7ICAgICAgICAgICAgLy8gdHJ1ZQotICBFbWJl
ci5pc0VtcHR5KHVuZGVmaW5lZCk7ICAgICAgIC8vIHRydWUKLSAgRW1iZXIuaXNFbXB0eSgnJyk7
ICAgICAgICAgICAgICAvLyB0cnVlCi0gIEVtYmVyLmlzRW1wdHkoW10pOyAgICAgICAgICAgICAg
Ly8gdHJ1ZQotICBFbWJlci5pc0VtcHR5KCdBZGFtIEhhd2tpbnMnKTsgIC8vIGZhbHNlCi0gIEVt
YmVyLmlzRW1wdHkoWzAsMSwyXSk7ICAgICAgICAgLy8gZmFsc2UKLSAgYGBgCi0KLSAgQG1ldGhv
ZCBpc0VtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0
ZXN0Ci0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1iZXIuaXNFbXB0eSA9IGZ1bmN0aW9uKG9i
aikgewotICByZXR1cm4gRW1iZXIuaXNOb25lKG9iaikgfHwgKG9iai5sZW5ndGggPT09IDAgJiYg
dHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYm
IEVtYmVyLmdldChvYmosICdsZW5ndGgnKSA9PT0gMCk7Ci19OwotRW1iZXIuZW1wdHkgPSBFbWJl
ci5kZXByZWNhdGVGdW5jKCJFbWJlci5lbXB0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVt
YmVyLmlzRW1wdHkgaW5zdGVhZC4iLCBFbWJlci5pc0VtcHR5KSA7Ci0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBOb2RlICovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0
YWwKLSovCi0KLS8qKgotICBQbGF0Zm9ybSBzcGVjaWZpYyBtZXRob2RzIGFuZCBmZWF0dXJlIGRl
dGVjdG9ycyBuZWVkZWQgYnkgdGhlIGZyYW1ld29yay4KLQotICBAY2xhc3MgcGxhdGZvcm0KLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotdmFyIHBsYXRmb3JtID0gRW1iZXIucGxh
dGZvcm0gPSB7fTsKLQotCi0vKioKLSAgSWRlbnRpY2FsIHRvIGBPYmplY3QuY3JlYXRlKClgLiBJ
bXBsZW1lbnRzIGlmIG5vdCBhdmFpbGFibGUgbmF0aXZlbHkuCi0KLSAgQG1ldGhvZCBjcmVhdGUK
LSAgQGZvciBFbWJlcgotKi8KLUVtYmVyLmNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7Ci0KLS8vIElF
OCBoYXMgT2JqZWN0LmNyZWF0ZSBidXQgaXQgY291bGRuJ3QgdHJlYXQgcHJvcGVydHkgZGVzY3Jp
cHRvcnMuCi1pZiAoRW1iZXIuY3JlYXRlKSB7Ci0gIGlmIChFbWJlci5jcmVhdGUoe2E6IDF9LCB7
YToge3ZhbHVlOiAyfX0pLmEgIT09IDIpIHsKLSAgICBFbWJlci5jcmVhdGUgPSBudWxsOwotICB9
Ci19Ci0KLS8vIFNUVUJfT0JKRUNUX0NSRUFURSBhbGxvd3MgdXMgdG8gb3ZlcnJpZGUgb3RoZXIg
bGlicmFyaWVzIHRoYXQgc3R1YgotLy8gT2JqZWN0LmNyZWF0ZSBkaWZmZXJlbnQgdGhhbiB3ZSB3
b3VsZCBwcmVmZXIKLWlmICghRW1iZXIuY3JlYXRlIHx8IEVtYmVyLkVOVi5TVFVCX09CSkVDVF9D
UkVBVEUpIHsKLSAgdmFyIEsgPSBmdW5jdGlvbigpIHt9OwotCi0gIEVtYmVyLmNyZWF0ZSA9IGZ1
bmN0aW9uKG9iaiwgcHJvcHMpIHsKLSAgICBLLnByb3RvdHlwZSA9IG9iajsKLSAgICBvYmogPSBu
ZXcgSygpOwotICAgIGlmIChwcm9wcykgewotICAgICAgSy5wcm90b3R5cGUgPSBvYmo7Ci0gICAg
ICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7Ci0gICAgICAgIEsucHJvdG90eXBlW3Byb3BdID0g
cHJvcHNbcHJvcF0udmFsdWU7Ci0gICAgICB9Ci0gICAgICBvYmogPSBuZXcgSygpOwotICAgIH0K
LSAgICBLLnByb3RvdHlwZSA9IG51bGw7Ci0KLSAgICByZXR1cm4gb2JqOwotICB9OwotCi0gIEVt
YmVyLmNyZWF0ZS5pc1NpbXVsYXRlZCA9IHRydWU7Ci19Ci0KLXZhciBkZWZpbmVQcm9wZXJ0eSA9
IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKLXZhciBjYW5SZWRlZmluZVByb3BlcnRpZXMsIGNhbkRl
ZmluZVByb3BlcnR5T25ET007Ci0KLS8vIENhdGNoIElFOCB3aGVyZSBPYmplY3QuZGVmaW5lUHJv
cGVydHkgZXhpc3RzIGJ1dCBvbmx5IHdvcmtzIG9uIERPTSBlbGVtZW50cwotaWYgKGRlZmluZVBy
b3BlcnR5KSB7Ci0gIHRyeSB7Ci0gICAgZGVmaW5lUHJvcGVydHkoe30sICdhJyx7Z2V0OmZ1bmN0
aW9uKCkge319KTsKLSAgfSBjYXRjaCAoZSkgewotICAgIGRlZmluZVByb3BlcnR5ID0gbnVsbDsK
LSAgfQotfQotCi1pZiAoZGVmaW5lUHJvcGVydHkpIHsKLSAgLy8gRGV0ZWN0cyBhIGJ1ZyBpbiBB
bmRyb2lkIDwzLjIgd2hlcmUgeW91IGNhbm5vdCByZWRlZmluZSBhIHByb3BlcnR5IHVzaW5nCi0g
IC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBvbmNlIGFjY2Vzc29ycyBoYXZlIGFscmVhZHkgYmVl
biBzZXQuCi0gIGNhblJlZGVmaW5lUHJvcGVydGllcyA9IChmdW5jdGlvbigpIHsKLSAgICB2YXIg
b2JqID0ge307Ci0KLSAgICBkZWZpbmVQcm9wZXJ0eShvYmosICdhJywgewotICAgICAgY29uZmln
dXJhYmxlOiB0cnVlLAotICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgIGdldDogZnVuY3Rp
b24oKSB7IH0sCi0gICAgICBzZXQ6IGZ1bmN0aW9uKCkgeyB9Ci0gICAgfSk7Ci0KLSAgICBkZWZp
bmVQcm9wZXJ0eShvYmosICdhJywgewotICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAg
ZW51bWVyYWJsZTogdHJ1ZSwKLSAgICAgIHdyaXRhYmxlOiB0cnVlLAotICAgICAgdmFsdWU6IHRy
dWUKLSAgICB9KTsKLQotICAgIHJldHVybiBvYmouYSA9PT0gdHJ1ZTsKLSAgfSkoKTsKLQotICAv
LyBUaGlzIGlzIGZvciBTYWZhcmkgNS4wLCB3aGljaCBzdXBwb3J0cyBPYmplY3QuZGVmaW5lUHJv
cGVydHksIGJ1dCBub3QKLSAgLy8gb24gRE9NIG5vZGVzLgotICBjYW5EZWZpbmVQcm9wZXJ0eU9u
RE9NID0gKGZ1bmN0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICBkZWZpbmVQcm9wZXJ0eShkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2RlZmluZVByb3BlcnR5T25ET00nLCB7fSk7Ci0g
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGNhdGNoKGUpIHsgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotICB9KSgpOwotCi0gIGlmICghY2FuUmVkZWZpbmVQcm9wZXJ0aWVzKSB7Ci0gICAgZGVmaW5l
UHJvcGVydHkgPSBudWxsOwotICB9IGVsc2UgaWYgKCFjYW5EZWZpbmVQcm9wZXJ0eU9uRE9NKSB7
Ci0gICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIGRlc2MpIHsKLSAg
ICAgIHZhciBpc05vZGU7Ci0KLSAgICAgIGlmICh0eXBlb2YgTm9kZSA9PT0gIm9iamVjdCIpIHsK
LSAgICAgICAgaXNOb2RlID0gb2JqIGluc3RhbmNlb2YgTm9kZTsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIGlzTm9kZSA9IHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmIHR5cGVvZiBvYmoubm9k
ZVR5cGUgPT09ICJudW1iZXIiICYmIHR5cGVvZiBvYmoubm9kZU5hbWUgPT09ICJzdHJpbmciOwot
ICAgICAgfQotCi0gICAgICBpZiAoaXNOb2RlKSB7Ci0gICAgICAgIC8vIFRPRE86IFNob3VsZCB3
ZSBoYXZlIGEgd2FybmluZyBoZXJlPwotICAgICAgICByZXR1cm4gKG9ialtrZXlOYW1lXSA9IGRl
c2MudmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQ
cm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MpOwotICAgICAgfQotICAgIH07Ci0gIH0KLX0KLQot
LyoqCi1AY2xhc3MgcGxhdGZvcm0KLUBuYW1lc3BhY2UgRW1iZXIKLSovCi0KLS8qKgotICBJZGVu
dGljYWwgdG8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYC4gSW1wbGVtZW50cyBhcyBtdWNoIGZ1
bmN0aW9uYWxpdHkKLSAgYXMgcG9zc2libGUgaWYgbm90IGF2YWlsYWJsZSBuYXRpdmVseS4KLQot
ICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Ci0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVj
dCB0byBtb2RpZnkKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgcHJvcGVydHkgbmFtZSB0byBt
b2RpZnkKLSAgQHBhcmFtIHtPYmplY3R9IGRlc2MgZGVzY3JpcHRvciBoYXNoCi0gIEByZXR1cm4g
e3ZvaWR9Ci0qLwotcGxhdGZvcm0uZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsKLQot
LyoqCi0gIFNldCB0byB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBuYXRpdmUgZ2V0dGVy
cyBhbmQgc2V0dGVycy4KLQotICBAcHJvcGVydHkgaGFzUHJvcGVydHlBY2Nlc3NvcnMKLSAgQGZp
bmFsCi0qLwotcGxhdGZvcm0uaGFzUHJvcGVydHlBY2Nlc3NvcnMgPSB0cnVlOwotCi1pZiAoIXBs
YXRmb3JtLmRlZmluZVByb3BlcnR5KSB7Ci0gIHBsYXRmb3JtLmhhc1Byb3BlcnR5QWNjZXNzb3Jz
ID0gZmFsc2U7Ci0KLSAgcGxhdGZvcm0uZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIGtl
eU5hbWUsIGRlc2MpIHsKLSAgICBpZiAoIWRlc2MuZ2V0KSB7IG9ialtrZXlOYW1lXSA9IGRlc2Mu
dmFsdWU7IH0KLSAgfTsKLQotICBwbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eS5pc1NpbXVsYXRlZCA9
IHRydWU7Ci19Ci0KLWlmIChFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUiAmJiAhcGxhdGZvcm0u
aGFzUHJvcGVydHlBY2Nlc3NvcnMpIHsKLSAgRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIgPSBm
YWxzZTsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qanNoaW50IG5ld2NhcDpm
YWxzZSovCi0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLS8vIE5PVEU6IFRoZXJlIGlz
IGEgYnVnIGluIGpzaGludCB0aGF0IGRvZXNuJ3QgcmVjb2duaXplIGBPYmplY3QoKWAgd2l0aG91
dCBgbmV3YAotLy8gYXMgYmVpbmcgb2sgdW5sZXNzIGJvdGggYG5ld2NhcDpmYWxzZWAgYW5kIG5v
dCBgdXNlIHN0cmljdGAuCi0vLyBodHRwczovL2dpdGh1Yi5jb20vanNoaW50L2pzaGludC9pc3N1
ZXMvMzkyCi0KLS8vIFRlc3RpbmcgdGhpcyBpcyBub3QgaWRlYWwsIGJ1dCB3ZSB3YW50IHRvIHVz
ZSBuYXRpdmUgZnVuY3Rpb25zCi0vLyBpZiBhdmFpbGFibGUsIGJ1dCBub3QgdG8gdXNlIHZlcnNp
b25zIGNyZWF0ZWQgYnkgbGlicmFyaWVzIGxpa2UgUHJvdG90eXBlCi12YXIgaXNOYXRpdmVGdW5j
ID0gZnVuY3Rpb24oZnVuYykgewotICAvLyBUaGlzIHNob3VsZCBwcm9iYWJseSB3b3JrIGluIGFs
bCBicm93c2VycyBsaWtlbHkgdG8gaGF2ZSBFUzUgYXJyYXkgbWV0aG9kcwotICByZXR1cm4gZnVu
YyAmJiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKS5pbmRleE9mKCdbbmF0
aXZlIGNvZGVdJykgPiAtMTsKLX07Ci0KLS8vIEZyb206IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemls
bGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L21hcAot
dmFyIGFycmF5TWFwID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5tYXApID8gQXJyYXku
cHJvdG90eXBlLm1hcCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0
cmljdCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKSB7Ci0gICAg
dGhyb3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0KLSAgdmFyIHQgPSBPYmplY3QodGhpcyk7Ci0g
IHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAgaWYgKHR5cGVvZiBmdW4gIT09ICJmdW5jdGlv
biIpIHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7Ci0gIH0KLQotICB2YXIgcmVzID0gbmV3
IEFycmF5KGxlbik7Ci0gIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKLSAgZm9yICh2YXIgaSA9
IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChpIGluIHQpIHsKLSAgICAgIHJlc1tpXSA9IGZ1
bi5jYWxsKHRoaXNwLCB0W2ldLCBpLCB0KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzOwot
fTsKLQotLy8gRnJvbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlw
dC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yZWFjaAotdmFyIGFycmF5Rm9yRWFj
aCA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgPyBBcnJheS5wcm90b3R5
cGUuZm9yRWFjaCA6IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc3AgKi8pIHsKLSAgLy8idXNlIHN0cmlj
dCI7Ci0KLSAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKSB7Ci0gICAgdGhy
b3cgbmV3IFR5cGVFcnJvcigpOwotICB9Ci0KLSAgdmFyIHQgPSBPYmplY3QodGhpcyk7Ci0gIHZh
ciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDsKLSAgaWYgKHR5cGVvZiBmdW4gIT09ICJmdW5jdGlvbiIp
IHsKLSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7Ci0gIH0KLQotICB2YXIgdGhpc3AgPSBhcmd1
bWVudHNbMV07Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBpZiAoaSBp
biB0KSB7Ci0gICAgICBmdW4uY2FsbCh0aGlzcCwgdFtpXSwgaSwgdCk7Ci0gICAgfQotICB9Ci19
OwotCi12YXIgYXJyYXlJbmRleE9mID0gaXNOYXRpdmVGdW5jKEFycmF5LnByb3RvdHlwZS5pbmRl
eE9mKSA/IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIDogZnVuY3Rpb24gKG9iaiwgZnJvbUluZGV4
KSB7Ci0gIGlmIChmcm9tSW5kZXggPT09IG51bGwgfHwgZnJvbUluZGV4ID09PSB1bmRlZmluZWQp
IHsgZnJvbUluZGV4ID0gMDsgfQotICBlbHNlIGlmIChmcm9tSW5kZXggPCAwKSB7IGZyb21JbmRl
eCA9IE1hdGgubWF4KDAsIHRoaXMubGVuZ3RoICsgZnJvbUluZGV4KTsgfQotICBmb3IgKHZhciBp
ID0gZnJvbUluZGV4LCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKLSAgICBpZiAodGhp
c1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9Ci0gIH0KLSAgcmV0dXJuIC0xOwotfTsKLQotLyoq
Ci0gIEFycmF5IHBvbHlmaWxscyB0byBzdXBwb3J0IEVTNSBmZWF0dXJlcyBpbiBvbGRlciBicm93
c2Vycy4KLQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwcm9wZXJ0eSBBcnJheVBvbHlmaWxscwot
Ki8KLUVtYmVyLkFycmF5UG9seWZpbGxzID0gewotICBtYXA6IGFycmF5TWFwLAotICBmb3JFYWNo
OiBhcnJheUZvckVhY2gsCi0gIGluZGV4T2Y6IGFycmF5SW5kZXhPZgotfTsKLQotaWYgKEVtYmVy
LlNISU1fRVM1KSB7Ci0gIGlmICghQXJyYXkucHJvdG90eXBlLm1hcCkgewotICAgIEFycmF5LnBy
b3RvdHlwZS5tYXAgPSBhcnJheU1hcDsKLSAgfQotCi0gIGlmICghQXJyYXkucHJvdG90eXBlLmZv
ckVhY2gpIHsKLSAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGFycmF5Rm9yRWFjaDsKLSAg
fQotCi0gIGlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHsKLSAgICBBcnJheS5wcm90b3R5
cGUuaW5kZXhPZiA9IGFycmF5SW5kZXhPZjsKLSAgfQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0
aW9uKCkgewotdmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xp
bmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddOwotCi0vKioK
LSAgQSBzdWJjbGFzcyBvZiB0aGUgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QgZm9yIHVzZSBpbiBF
bWJlci4KLQotICBAY2xhc3MgRXJyb3IKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
cnJvcgotICBAY29uc3RydWN0b3IKLSovCi1FbWJlci5FcnJvciA9IGZ1bmN0aW9uKCkgewotICB2
YXIgdG1wID0gRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLQotICAvLyBBZGRzIGEgYHN0
YWNrYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gZXJyb3Igb2JqZWN0IHRoYXQgd2lsbCB5aWVsZCB0
aGUKLSAgLy8gc3RhY2sgdHJhY2UgYXQgdGhlIHRpbWUgY2FwdHVyZVN0YWNrVHJhY2Ugd2FzIGNh
bGxlZC4KLSAgLy8gV2hlbiBjb2xsZWN0aW5nIHRoZSBzdGFjayB0cmFjZSBhbGwgZnJhbWVzIGFi
b3ZlIHRoZSB0b3Btb3N0IGNhbGwKLSAgLy8gdG8gdGhpcyBmdW5jdGlvbiwgaW5jbHVkaW5nIHRo
YXQgY2FsbCwgd2lsbCBiZSBsZWZ0IG91dCBvZiB0aGUKLSAgLy8gc3RhY2sgdHJhY2UuCi0gIC8v
IFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugd2UgY2FuIGhpZGUgRW1iZXIgaW1wbGVtZW50YXRpb24g
ZGV0YWlscwotICAvLyB0aGF0IGFyZSBub3QgdmVyeSBoZWxwZnVsIGZvciB0aGUgdXNlci4KLSAg
aWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7Ci0gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJh
Y2UodGhpcywgRW1iZXIuRXJyb3IpOwotICB9Ci0gIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFy
ZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRt
cGAgZG9lc24ndCB3b3JrLgotICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxl
bmd0aDsgaWR4KyspIHsKLSAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9w
c1tpZHhdXTsKLSAgfQotfTsKLQotRW1iZXIuRXJyb3IucHJvdG90eXBlID0gRW1iZXIuY3JlYXRl
KEVycm9yLnByb3RvdHlwZSk7Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEVSUk9SIEhBTkRMSU5HCi0vLwotCi0vKioK
LSAgQSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gYEVtYmVyLm9uZXJyb3JgIHRvIGJlIGNh
bGxlZCB3aGVuIEVtYmVyCi0gIGludGVybmFscyBlbmNvdW50ZXIgYW4gZXJyb3IuIFRoaXMgaXMg
dXNlZnVsIGZvciBzcGVjaWFsaXplZCBlcnJvciBoYW5kbGluZwotICBhbmQgcmVwb3J0aW5nIGNv
ZGUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3Ip
IHsKLSAgICBFbS4kLmFqYXgoJy9yZXBvcnQtZXJyb3InLCAnUE9TVCcsIHsKLSAgICAgIHN0YWNr
OiBlcnJvci5zdGFjaywKLSAgICAgIG90aGVySW5mb3JtYXRpb246ICd3aGF0ZXZlciBhcHAgc3Rh
dGUgeW91IHdhbnQgdG8gcHJvdmlkZScKLSAgICB9KTsKLSAgfTsKLSAgYGBgCi0KLSAgQGV2ZW50
IG9uZXJyb3IKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0V4Y2VwdGlvbn0gZXJyb3IgdGhlIGVy
cm9yIG9iamVjdAotKi8KLUVtYmVyLm9uZXJyb3IgPSBudWxsOwotCi0vKioKLSAgV3JhcCBjb2Rl
IGJsb2NrIGluIGEgdHJ5L2NhdGNoIGlmIGBFbWJlci5vbmVycm9yYCBpcyBzZXQuCi0KLSAgQHBy
aXZhdGUKLSAgQG1ldGhvZCBoYW5kbGVFcnJvcnMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1
bmN0aW9ufSBmdW5jCi0gIEBwYXJhbSBbY29udGV4dF0KLSovCi1FbWJlci5oYW5kbGVFcnJvcnMg
PSBmdW5jdGlvbihmdW5jLCBjb250ZXh0KSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHkgaW4gc29tZSBi
cm93c2VycyB3ZSBsb3NlIHRoZSBiYWNrdHJhY2UgaWYgd2UgcmV0aHJvdyB0aGUgZXhpc3Rpbmcg
ZXJyb3IsCi0gIC8vIHNvIGluIHRoZSBldmVudCB0aGF0IHdlIGRvbid0IGhhdmUgYW4gYG9uZXJy
b3JgIGhhbmRsZXIgd2UgZG9uJ3Qgd3JhcCBpbiBhIHRyeS9jYXRjaAotICBpZiAoJ2Z1bmN0aW9u
JyA9PT0gdHlwZW9mIEVtYmVyLm9uZXJyb3IpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGZ1
bmMuY2FsbChjb250ZXh0IHx8IHRoaXMpOwotICAgIH0gY2F0Y2ggKGVycm9yKSB7Ci0gICAgICBF
bWJlci5vbmVycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZ1bmMu
Y2FsbChjb250ZXh0IHx8IHRoaXMpOwotICB9Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9u
KCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0qLwotCi0vKioKLSAgUHJlZml4IHVzZWQg
Zm9yIGd1aWRzIHRocm91Z2ggb3V0IEVtYmVyLgotICBAcHJpdmF0ZQotKi8KLUVtYmVyLkdVSURf
UFJFRklYID0gJ2VtYmVyJzsKLQotCi12YXIgb19kZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRm
b3JtLmRlZmluZVByb3BlcnR5LAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIC8v
IFVzZWQgZm9yIGd1aWQgZ2VuZXJhdGlvbi4uLgotICAgIEdVSURfS0VZID0gJ19fZW1iZXInKyAo
KyBuZXcgRGF0ZSgpKSwKLSAgICB1dWlkICAgICAgICAgPSAwLAotICAgIG51bWJlckNhY2hlICA9
IFtdLAotICAgIHN0cmluZ0NhY2hlICA9IHt9OwotCi12YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVt
YmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSOwotCi0vKioKLSAgQSB1bmlxdWUga2V5IHVzZWQgdG8g
YXNzaWduIGd1aWRzIGFuZCBvdGhlciBwcml2YXRlIG1ldGFkYXRhIHRvIG9iamVjdHMuCi0gIElm
IHlvdSBpbnNwZWN0IGFuIG9iamVjdCBpbiB5b3VyIGJyb3dzZXIgZGVidWdnZXIgeW91IHdpbGwg
b2Z0ZW4gc2VlIHRoZXNlLgotICBUaGV5IGNhbiBiZSBzYWZlbHkgaWdub3JlZC4KLQotICBPbiBi
cm93c2VycyB0aGF0IHN1cHBvcnQgaXQsIHRoZXNlIHByb3BlcnRpZXMgYXJlIGFkZGVkIHdpdGgg
ZW51bWVyYXRpb24KLSAgZGlzYWJsZWQgc28gdGhleSB3b24ndCBzaG93IHVwIHdoZW4geW91IGl0
ZXJhdGUgb3ZlciB5b3VyIHByb3BlcnRpZXMuCi0KLSAgQHByaXZhdGUKLSAgQHByb3BlcnR5IEdV
SURfS0VZCi0gIEBmb3IgRW1iZXIKLSAgQHR5cGUgU3RyaW5nCi0gIEBmaW5hbAotKi8KLUVtYmVy
LkdVSURfS0VZID0gR1VJRF9LRVk7Ci0KLXZhciBHVUlEX0RFU0MgPSB7Ci0gIHdyaXRhYmxlOiAg
ICBmYWxzZSwKLSAgY29uZmlndXJhYmxlOiBmYWxzZSwKLSAgZW51bWVyYWJsZTogIGZhbHNlLAot
ICB2YWx1ZTogbnVsbAotfTsKLQotLyoqCi0gIEdlbmVyYXRlcyBhIG5ldyBndWlkLCBvcHRpb25h
bGx5IHNhdmluZyB0aGUgZ3VpZCB0byB0aGUgb2JqZWN0IHRoYXQgeW91Ci0gIHBhc3MgaW4uIFlv
dSB3aWxsIHJhcmVseSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCB5b3Ugc2hvdWxk
Ci0gIGNhbGwgYEVtYmVyLmd1aWRGb3Iob2JqKWAsIHdoaWNoIHJldHVybiBhbiBleGlzdGluZyBn
dWlkIGlmIGF2YWlsYWJsZS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGdlbmVyYXRlR3VpZAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBbb2JqXSBPYmplY3QgdGhlIGd1aWQgd2ls
bCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0aGUgZ3VpZCB3aWxsCi0gICAgYmUgc2F2ZWQg
b24gdGhlIG9iamVjdCBhbmQgcmV1c2VkIHdoZW5ldmVyIHlvdSBwYXNzIHRoZSBzYW1lIG9iamVj
dAotICAgIGFnYWluLgotCi0gICAgSWYgbm8gb2JqZWN0IGlzIHBhc3NlZCwganVzdCBnZW5lcmF0
ZSBhIG5ldyBndWlkLgotICBAcGFyYW0ge1N0cmluZ30gW3ByZWZpeF0gUHJlZml4IHRvIHBsYWNl
IGluIGZyb250IG9mIHRoZSBndWlkLiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0bwotICAgIHNlcGFy
YXRlIHRoZSBndWlkIGludG8gc2VwYXJhdGUgbmFtZXNwYWNlcy4KLSAgQHJldHVybiB7U3RyaW5n
fSB0aGUgZ3VpZAotKi8KLUVtYmVyLmdlbmVyYXRlR3VpZCA9IGZ1bmN0aW9uIGdlbmVyYXRlR3Vp
ZChvYmosIHByZWZpeCkgewotICBpZiAoIXByZWZpeCkgcHJlZml4ID0gRW1iZXIuR1VJRF9QUkVG
SVg7Ci0gIHZhciByZXQgPSAocHJlZml4ICsgKHV1aWQrKykpOwotICBpZiAob2JqKSB7Ci0gICAg
R1VJRF9ERVNDLnZhbHVlID0gcmV0OwotICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tF
WSwgR1VJRF9ERVNDKTsKLSAgfQotICByZXR1cm4gcmV0OwotfTsKLQotLyoqCi0gIFJldHVybnMg
YSB1bmlxdWUgaWQgZm9yIHRoZSBvYmplY3QuIElmIHRoZSBvYmplY3QgZG9lcyBub3QgeWV0IGhh
dmUgYSBndWlkLAotICBvbmUgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4gWW91IGNhbiBjYWxsIHRo
aXMgb24gYW55IG9iamVjdCwKLSAgYEVtYmVyLk9iamVjdGAtYmFzZWQgb3Igbm90LCBidXQgYmUg
YXdhcmUgdGhhdCBpdCB3aWxsIGFkZCBhIGBfZ3VpZGAKLSAgcHJvcGVydHkuCi0KLSAgWW91IGNh
biBhbHNvIHVzZSB0aGlzIG1ldGhvZCBvbiBET00gRWxlbWVudCBvYmplY3RzLgotCi0gIEBwcml2
YXRlCi0gIEBtZXRob2QgZ3VpZEZvcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBv
YmogYW55IG9iamVjdCwgc3RyaW5nLCBudW1iZXIsIEVsZW1lbnQsIG9yIHByaW1pdGl2ZQotICBA
cmV0dXJuIHtTdHJpbmd9IHRoZSB1bmlxdWUgZ3VpZCBmb3IgdGhpcyBpbnN0YW5jZS4KLSovCi1F
bWJlci5ndWlkRm9yID0gZnVuY3Rpb24gZ3VpZEZvcihvYmopIHsKLQotICAvLyBzcGVjaWFsIGNh
c2VzIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gYWRkIGEga2V5IHRvIG9iamVjdAotICBpZiAob2Jq
ID09PSB1bmRlZmluZWQpIHJldHVybiAiKHVuZGVmaW5lZCkiOwotICBpZiAob2JqID09PSBudWxs
KSByZXR1cm4gIihudWxsKSI7Ci0KLSAgdmFyIHJldDsKLSAgdmFyIHR5cGUgPSB0eXBlb2Ygb2Jq
OwotCi0gIC8vIERvbid0IGFsbG93IHByb3RvdHlwZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRv
IGNoYW5nZSB0aGUgZ3VpZEZvcgotICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgJ251bWJlcic6
Ci0gICAgICByZXQgPSBudW1iZXJDYWNoZVtvYmpdOwotICAgICAgaWYgKCFyZXQpIHJldCA9IG51
bWJlckNhY2hlW29ial0gPSAnbnUnK29iajsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNl
ICdzdHJpbmcnOgotICAgICAgcmV0ID0gc3RyaW5nQ2FjaGVbb2JqXTsKLSAgICAgIGlmICghcmV0
KSByZXQgPSBzdHJpbmdDYWNoZVtvYmpdID0gJ3N0JysodXVpZCsrKTsKLSAgICAgIHJldHVybiBy
ZXQ7Ci0KLSAgICBjYXNlICdib29sZWFuJzoKLSAgICAgIHJldHVybiBvYmogPyAnKHRydWUpJyA6
ICcoZmFsc2UpJzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAob2JqW0dVSURfS0VZXSkgcmV0
dXJuIG9ialtHVUlEX0tFWV07Ci0gICAgICBpZiAob2JqID09PSBPYmplY3QpIHJldHVybiAnKE9i
amVjdCknOwotICAgICAgaWYgKG9iaiA9PT0gQXJyYXkpICByZXR1cm4gJyhBcnJheSknOwotICAg
ICAgcmV0ID0gJ2VtYmVyJysodXVpZCsrKTsKLSAgICAgIEdVSURfREVTQy52YWx1ZSA9IHJldDsK
LSAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJRF9ERVNDKTsKLSAgICAg
IHJldHVybiByZXQ7Ci0gIH0KLX07Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIE1FVEEKLS8vCi0KLXZhciBNRVRBX0RF
U0MgPSB7Ci0gIHdyaXRhYmxlOiAgICB0cnVlLAotICBjb25maWd1cmFibGU6IGZhbHNlLAotICBl
bnVtZXJhYmxlOiAgZmFsc2UsCi0gIHZhbHVlOiBudWxsCi19OwotCi12YXIgTUVUQV9LRVkgPSBF
bWJlci5HVUlEX0tFWSsnX21ldGEnOwotCi0vKioKLSAgVGhlIGtleSB1c2VkIHRvIHN0b3JlIG1l
dGEgaW5mb3JtYXRpb24gb24gb2JqZWN0IGZvciBwcm9wZXJ0eSBvYnNlcnZpbmcuCi0KLSAgQHBy
b3BlcnR5IE1FVEFfS0VZCi0gIEBmb3IgRW1iZXIKLSAgQHByaXZhdGUKLSAgQGZpbmFsCi0gIEB0
eXBlIFN0cmluZwotKi8KLUVtYmVyLk1FVEFfS0VZID0gTUVUQV9LRVk7Ci0KLXZhciBpc0RlZmlu
ZVByb3BlcnR5U2ltdWxhdGVkID0gRW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHkuaXNTaW11
bGF0ZWQ7Ci0KLWZ1bmN0aW9uIE1ldGEob2JqKSB7Ci0gIHRoaXMuZGVzY3MgPSB7fTsKLSAgdGhp
cy53YXRjaGluZyA9IHt9OwotICB0aGlzLmNhY2hlID0ge307Ci0gIHRoaXMuc291cmNlID0gb2Jq
OwotfQotCi1NZXRhLnByb3RvdHlwZSA9IHsKLSAgZGVzY3M6IG51bGwsCi0gIGRlcHM6IG51bGws
Ci0gIHdhdGNoaW5nOiBudWxsLAotICBsaXN0ZW5lcnM6IG51bGwsCi0gIGNhY2hlOiBudWxsLAot
ICBzb3VyY2U6IG51bGwsCi0gIG1peGluczogbnVsbCwKLSAgYmluZGluZ3M6IG51bGwsCi0gIGNo
YWluczogbnVsbCwKLSAgY2hhaW5XYXRjaGVyczogbnVsbCwKLSAgdmFsdWVzOiBudWxsCi19Owot
Ci1pZiAoaXNEZWZpbmVQcm9wZXJ0eVNpbXVsYXRlZCkgewotICAvLyBvbiBwbGF0Zm9ybXMgdGhh
dCBkb24ndCBzdXBwb3J0IGVudW1lcmFibGUgZmFsc2UKLSAgLy8gbWFrZSBtZXRhIGZhaWwgalF1
ZXJ5LmlzUGxhaW5PYmplY3QoKSB0byBoaWRlIGZyb20KLSAgLy8galF1ZXJ5LmV4dGVuZCgpIGJ5
IGhhdmluZyBhIHByb3BlcnR5IHRoYXQgZmFpbHMKLSAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2su
Ci0gIE1ldGEucHJvdG90eXBlLl9fcHJldmVudFBsYWluT2JqZWN0X18gPSB0cnVlOwotCi0gIC8v
IFdpdGhvdXQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcywgbWV0YSBvYmplY3RzIHdpbGwgYmUg
b3V0cHV0IGluIEpTT04KLSAgLy8gdW5sZXNzIGV4cGxpY2l0bHkgc3VwcHJlc3NlZAotICBNZXRh
LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7IH07Ci19Ci0KLS8vIFBsYWNlaG9sZGVy
IGZvciBub24td3JpdGFibGUgbWV0YXMuCi12YXIgRU1QVFlfTUVUQSA9IG5ldyBNZXRhKG51bGwp
OwotCi1pZiAoTUFOREFUT1JZX1NFVFRFUikgeyBFTVBUWV9NRVRBLnZhbHVlcyA9IHt9OyB9Ci0K
LUVtYmVyLkVNUFRZX01FVEEgPSBFTVBUWV9NRVRBOwotCi0vKioKLSAgUmV0cmlldmVzIHRoZSBt
ZXRhIGhhc2ggZm9yIGFuIG9iamVjdC4gSWYgYHdyaXRhYmxlYCBpcyB0cnVlIGVuc3VyZXMgdGhl
Ci0gIGhhc2ggaXMgd3JpdGFibGUgZm9yIHRoaXMgb2JqZWN0IGFzIHdlbGwuCi0KLSAgVGhlIG1l
dGEgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGNvbXB1dGVkIHByb3BlcnR5IGRl
c2NyaXB0b3JzIGFzCi0gIHdlbGwgYXMgYW55IHdhdGNoZWQgcHJvcGVydGllcyBhbmQgb3RoZXIg
aW5mb3JtYXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbAotICBub3QgYWNjZXNzIHRoaXMgaW5mb3Jt
YXRpb24gZGlyZWN0bHkgYnV0IGluc3RlYWQgd29yayB3aXRoIGhpZ2hlciBsZXZlbAotICBtZXRo
b2RzIHRoYXQgbWFuaXB1bGF0ZSB0aGlzIGhhc2ggaW5kaXJlY3RseS4KLQotICBAbWV0aG9kIG1l
dGEKLSAgQGZvciBFbWJlcgotICBAcHJpdmF0ZQotCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl
IG9iamVjdCB0byByZXRyaWV2ZSBtZXRhIGZvcgotICBAcGFyYW0ge0Jvb2xlYW59IFt3cml0YWJs
ZT10cnVlXSBQYXNzIGBmYWxzZWAgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gbW9kaWZ5Ci0gICAg
dGhlIG1ldGEgaGFzaCwgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBhdm9pZCBtYWtpbmcgYW4gdW5u
ZWNlc3NhcnkgY29weS4KLSAgQHJldHVybiB7T2JqZWN0fSB0aGUgbWV0YSBoYXNoIGZvciBhbiBv
YmplY3QKLSovCi1FbWJlci5tZXRhID0gZnVuY3Rpb24gbWV0YShvYmosIHdyaXRhYmxlKSB7Ci0K
LSAgdmFyIHJldCA9IG9ialtNRVRBX0tFWV07Ci0gIGlmICh3cml0YWJsZT09PWZhbHNlKSByZXR1
cm4gcmV0IHx8IEVNUFRZX01FVEE7Ci0KLSAgaWYgKCFyZXQpIHsKLSAgICBpZiAoIWlzRGVmaW5l
UHJvcGVydHlTaW11bGF0ZWQpIG9fZGVmaW5lUHJvcGVydHkob2JqLCBNRVRBX0tFWSwgTUVUQV9E
RVNDKTsKLQotICAgIHJldCA9IG5ldyBNZXRhKG9iaik7Ci0KLSAgICBpZiAoTUFOREFUT1JZX1NF
VFRFUikgeyByZXQudmFsdWVzID0ge307IH0KLQotICAgIG9ialtNRVRBX0tFWV0gPSByZXQ7Ci0K
LSAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHRyeSB0byBjcmVhdGUgY29u
c3RydWN0b3IgbGlrZSBkZXNjCi0gICAgcmV0LmRlc2NzLmNvbnN0cnVjdG9yID0gbnVsbDsKLQot
ICB9IGVsc2UgaWYgKHJldC5zb3VyY2UgIT09IG9iaikgewotICAgIGlmICghaXNEZWZpbmVQcm9w
ZXJ0eVNpbXVsYXRlZCkgb19kZWZpbmVQcm9wZXJ0eShvYmosIE1FVEFfS0VZLCBNRVRBX0RFU0Mp
OwotCi0gICAgcmV0ID0gb19jcmVhdGUocmV0KTsKLSAgICByZXQuZGVzY3MgICAgPSBvX2NyZWF0
ZShyZXQuZGVzY3MpOwotICAgIHJldC53YXRjaGluZyA9IG9fY3JlYXRlKHJldC53YXRjaGluZyk7
Ci0gICAgcmV0LmNhY2hlICAgID0ge307Ci0gICAgcmV0LnNvdXJjZSAgID0gb2JqOwotCi0gICAg
aWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgcmV0LnZhbHVlcyA9IG9fY3JlYXRlKHJldC52YWx1ZXMp
OyB9Ci0KLSAgICBvYmpbTUVUQV9LRVldID0gcmV0OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Owot
Ci1FbWJlci5nZXRNZXRhID0gZnVuY3Rpb24gZ2V0TWV0YShvYmosIHByb3BlcnR5KSB7Ci0gIHZh
ciBtZXRhID0gRW1iZXIubWV0YShvYmosIGZhbHNlKTsKLSAgcmV0dXJuIG1ldGFbcHJvcGVydHld
OwotfTsKLQotRW1iZXIuc2V0TWV0YSA9IGZ1bmN0aW9uIHNldE1ldGEob2JqLCBwcm9wZXJ0eSwg
dmFsdWUpIHsKLSAgdmFyIG1ldGEgPSBFbWJlci5tZXRhKG9iaiwgdHJ1ZSk7Ci0gIG1ldGFbcHJv
cGVydHldID0gdmFsdWU7Ci0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLS8qKgotICBAZGVwcmVjYXRl
ZAotICBAcHJpdmF0ZQotCi0gIEluIG9yZGVyIHRvIHN0b3JlIGRlZmF1bHRzIGZvciBhIGNsYXNz
LCBhIHByb3RvdHlwZSBtYXkgbmVlZCB0byBjcmVhdGUKLSAgYSBkZWZhdWx0IG1ldGEgb2JqZWN0
LCB3aGljaCB3aWxsIGJlIGluaGVyaXRlZCBieSBhbnkgb2JqZWN0cyBpbnN0YW50aWF0ZWQKLSAg
ZnJvbSB0aGUgY2xhc3MncyBjb25zdHJ1Y3Rvci4KLQotICBIb3dldmVyLCB0aGUgcHJvcGVydGll
cyBvZiB0aGF0IG1ldGEgb2JqZWN0IGFyZSBvbmx5IHNoYWxsb3ctY2xvbmVkLAotICBzbyBpZiBh
IHByb3BlcnR5IGlzIGEgaGFzaCAobGlrZSB0aGUgZXZlbnQgc3lzdGVtJ3MgYGxpc3RlbmVyc2Ag
aGFzaCksCi0gIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5j
ZXMgb2YgdGhhdCBjbGFzcy4KLQotICBUaGlzIG1ldGhvZCBhbGxvd3MgZXh0ZW5zaW9ucyB0byBk
ZWVwbHkgY2xvbmUgYSBzZXJpZXMgb2YgbmVzdGVkIGhhc2hlcyBvcgotICBvdGhlciBjb21wbGV4
IG9iamVjdHMuIEZvciBpbnN0YW5jZSwgdGhlIGV2ZW50IHN5c3RlbSBtaWdodCBwYXNzCi0gIGBb
J2xpc3RlbmVycycsICdmb286Y2hhbmdlJywgJ2VtYmVyMTU3J11gIHRvIGBwcmVwYXJlTWV0YVBh
dGhgLCB3aGljaCB3aWxsCi0gIHdhbGsgZG93biB0aGUga2V5cyBwcm92aWRlZC4KLQotICBGb3Ig
ZWFjaCBrZXksIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIElmIGl0
IGFscmVhZHkKLSAgZXhpc3RzIGFuZCBpdCB3YXMgaW5oZXJpdGVkIGZyb20gaXRzIGNvbnN0cnVj
dG9yLCB0aGUgY29uc3RydWN0b3IncwotICBrZXkgaXMgY2xvbmVkLgotCi0gIFlvdSBjYW4gYWxz
byBwYXNzIGZhbHNlIGZvciBgd3JpdGFibGVgLCB3aGljaCB3aWxsIHNpbXBseSByZXR1cm4KLSAg
dW5kZWZpbmVkIGlmIGBwcmVwYXJlTWV0YVBhdGhgIGRpc2NvdmVycyBhbnkgcGFydCBvZiB0aGUg
cGF0aCB0aGF0Ci0gIHNoYXJlZCBvciB1bmRlZmluZWQuCi0KLSAgQG1ldGhvZCBtZXRhUGF0aAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB3aG9zZSBtZXRh
IHdlIGFyZSBleGFtaW5pbmcKLSAgQHBhcmFtIHtBcnJheX0gcGF0aCBBbiBhcnJheSBvZiBrZXlz
IHRvIHdhbGsgZG93bgotICBAcGFyYW0ge0Jvb2xlYW59IHdyaXRhYmxlIHdoZXRoZXIgb3Igbm90
IHRvIGNyZWF0ZSBhIG5ldyBtZXRhCi0gICAgKG9yIG1ldGEgcHJvcGVydHkpIGlmIG9uZSBkb2Vz
IG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmIGl0J3MKLSAgICBzaGFyZWQgd2l0aCBpdHMgY29uc3Ry
dWN0b3IKLSovCi1FbWJlci5tZXRhUGF0aCA9IGZ1bmN0aW9uIG1ldGFQYXRoKG9iaiwgcGF0aCwg
d3JpdGFibGUpIHsKLSAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5tZXRhUGF0aCBpcyBkZXByZWNh
dGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdXR1cmUgcmVsZWFzZXMuIik7Ci0gIHZhciBt
ZXRhID0gRW1iZXIubWV0YShvYmosIHdyaXRhYmxlKSwga2V5TmFtZSwgdmFsdWU7Ci0KLSAgZm9y
ICh2YXIgaT0wLCBsPXBhdGgubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGtleU5hbWUgPSBwYXRo
W2ldOwotICAgIHZhbHVlID0gbWV0YVtrZXlOYW1lXTsKLQotICAgIGlmICghdmFsdWUpIHsKLSAg
ICAgIGlmICghd3JpdGFibGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQotICAgICAgdmFsdWUgPSBt
ZXRhW2tleU5hbWVdID0geyBfX2VtYmVyX3NvdXJjZV9fOiBvYmogfTsKLSAgICB9IGVsc2UgaWYg
KHZhbHVlLl9fZW1iZXJfc291cmNlX18gIT09IG9iaikgewotICAgICAgaWYgKCF3cml0YWJsZSkg
eyByZXR1cm4gdW5kZWZpbmVkOyB9Ci0gICAgICB2YWx1ZSA9IG1ldGFba2V5TmFtZV0gPSBvX2Ny
ZWF0ZSh2YWx1ZSk7Ci0gICAgICB2YWx1ZS5fX2VtYmVyX3NvdXJjZV9fID0gb2JqOwotICAgIH0K
LQotICAgIG1ldGEgPSB2YWx1ZTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLS8qKgot
ICBXcmFwcyB0aGUgcGFzc2VkIGZ1bmN0aW9uIHNvIHRoYXQgYHRoaXMuX3N1cGVyYCB3aWxsIHBv
aW50IHRvIHRoZSBzdXBlckZ1bmMKLSAgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhp
cyBpcyB0aGUgcHJpbWl0aXZlIHdlIHVzZSB0byBpbXBsZW1lbnQKLSAgY2FsbHMgdG8gc3VwZXIu
Ci0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCB3cmFwCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtG
dW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FsbAotICBAcGFyYW0ge0Z1bmN0aW9ufSBz
dXBlckZ1bmMgVGhlIHN1cGVyIGZ1bmN0aW9uLgotICBAcmV0dXJuIHtGdW5jdGlvbn0gd3JhcHBl
ZCBmdW5jdGlvbi4KLSovCi1FbWJlci53cmFwID0gZnVuY3Rpb24oZnVuYywgc3VwZXJGdW5jKSB7
Ci0gIGZ1bmN0aW9uIEsoKSB7fQotCi0gIGZ1bmN0aW9uIHN1cGVyV3JhcHBlcigpIHsKLSAgICB2
YXIgcmV0LCBzdXAgPSB0aGlzLl9zdXBlcjsKLSAgICB0aGlzLl9zdXBlciA9IHN1cGVyRnVuYyB8
fCBLOwotICAgIHJldCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB0aGlzLl9z
dXBlciA9IHN1cDsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc3VwZXJXcmFwcGVyLndyYXBw
ZWRGdW5jdGlvbiA9IGZ1bmM7Ci0gIHN1cGVyV3JhcHBlci5fX2VtYmVyX29ic2VydmVzX18gPSBm
dW5jLl9fZW1iZXJfb2JzZXJ2ZXNfXzsKLSAgc3VwZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNC
ZWZvcmVfXyA9IGZ1bmMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fOwotICBzdXBlcldyYXBwZXIu
X19lbWJlcl9saXN0ZW5zX18gPSBmdW5jLl9fZW1iZXJfbGlzdGVuc19fOwotCi0gIHJldHVybiBz
dXBlcldyYXBwZXI7Ci19OwotCi0vKioKLSAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgb2Jq
ZWN0IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UuCi0KLSAgRW1iZXIgQXJyYXkgUHJvdG9jb2w6
Ci0KLSAgICAtIHRoZSBvYmplY3QgaGFzIGFuIG9iamVjdEF0IHByb3BlcnR5Ci0gICAgLSB0aGUg
b2JqZWN0IGlzIGEgbmF0aXZlIEFycmF5Ci0gICAgLSB0aGUgb2JqZWN0IGlzIGFuIE9iamVjdCwg
YW5kIGhhcyBhIGxlbmd0aCBwcm9wZXJ0eQotCi0gIFVubGlrZSBgRW1iZXIudHlwZU9mYCB0aGlz
IG1ldGhvZCByZXR1cm5zIHRydWUgZXZlbiBpZiB0aGUgcGFzc2VkIG9iamVjdCBpcwotICBub3Qg
Zm9ybWFsbHkgYXJyYXkgYnV0IGFwcGVhcnMgdG8gYmUgYXJyYXktbGlrZSAoaS5lLiBpbXBsZW1l
bnRzIGBFbWJlci5BcnJheWApCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5pc0FycmF5KCk7
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQotICBF
bWJlci5pc0FycmF5KFtdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyB0cnVlCi0gIEVtYmVyLmlzQXJyYXkoIEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsgY29u
dGVudDogW10gfSkgKTsgIC8vIHRydWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBpc0FycmF5Ci0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHRlc3QKLSAgQHJl
dHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhbiBhcnJheSBvciBB
cnJheS1saWtlCi0qLwotRW1iZXIuaXNBcnJheSA9IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9i
aiB8fCBvYmouc2V0SW50ZXJ2YWwpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIGlmIChBcnJheS5pc0Fy
cmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkgeyByZXR1cm4gdHJ1ZTsgfQotICBpZiAoRW1iZXIu
QXJyYXkgJiYgRW1iZXIuQXJyYXkuZGV0ZWN0KG9iaikpIHsgcmV0dXJuIHRydWU7IH0KLSAgaWYg
KChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpICYmICdvYmplY3QnPT09dHlwZW9mIG9iaikgeyBy
ZXR1cm4gdHJ1ZTsgfQotICByZXR1cm4gZmFsc2U7Ci19OwotCi0vKioKLSAgRm9yY2VzIHRoZSBw
YXNzZWQgb2JqZWN0IHRvIGJlIHBhcnQgb2YgYW4gYXJyYXkuIElmIHRoZSBvYmplY3QgaXMgYWxy
ZWFkeQotICBhbiBhcnJheSBvciBhcnJheS1saWtlLCByZXR1cm5zIHRoZSBvYmplY3QuIE90aGVy
d2lzZSBhZGRzIHRoZSBvYmplY3QgdG8KLSAgYW4gYXJyYXkuIElmIG9iaiBpcyBgbnVsbGAgb3Ig
YHVuZGVmaW5lZGAsIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBFbWJlci5tYWtlQXJyYXkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbXQotICBF
bWJlci5tYWtlQXJyYXkobnVsbCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbXQotICBFbWJl
ci5tYWtlQXJyYXkodW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAvLyBbXQotICBFbWJlci5t
YWtlQXJyYXkoJ2xpbmRzYXknKTsgICAgICAgICAgICAgICAgICAvLyBbJ2xpbmRzYXknXQotICBF
bWJlci5tYWtlQXJyYXkoWzEsMiw0Ml0pOyAgICAgICAgICAgICAgICAgICAvLyBbMSwyLDQyXQot
Ci0gIHZhciBjb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5jcmVhdGUoeyBjb250ZW50OiBb
XSB9KTsKLSAgRW1iZXIubWFrZUFycmF5KGNvbnRyb2xsZXIpID09PSBjb250cm9sbGVyOyAgLy8g
dHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIG1ha2VBcnJheQotICBAZm9yIEVtYmVyCi0gIEBwYXJh
bSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdAotICBAcmV0dXJuIHtBcnJheX0KLSovCi1FbWJlci5t
YWtlQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKLSAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09
IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH0KLSAgcmV0dXJuIEVtYmVyLmlzQXJyYXkob2JqKSA/
IG9iaiA6IFtvYmpdOwotfTsKLQotZnVuY3Rpb24gY2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkg
ewotICByZXR1cm4gISEob2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlv
bicpOwotfQotCi0vKioKLSAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYG1ldGhvZE5hbWVgIGV4aXN0
cyBvbiB0aGUgYG9iamAuCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgZm9vID0ge2JhcjogRW1i
ZXIuSywgYmF6OiBudWxsfTsKLSAgRW1iZXIuY2FuSW52b2tlKGZvbywgJ2JhcicpOyAvLyB0cnVl
Ci0gIEVtYmVyLmNhbkludm9rZShmb28sICdiYXonKTsgLy8gZmFsc2UKLSAgRW1iZXIuY2FuSW52
b2tlKGZvbywgJ2JhdCcpOyAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGNhbkludm9rZQot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjaGVjayBm
b3IgdGhlIG1ldGhvZAotICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5h
bWUgdG8gY2hlY2sgZm9yCi0gIEByZXR1cm4ge0Jvb2xlYW59Ci0qLwotRW1iZXIuY2FuSW52b2tl
ID0gY2FuSW52b2tlOwotCi0vKioKLSAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYG1ldGhvZE5hbWVg
IGV4aXN0cyBvbiB0aGUgYG9iamAsCi0gIGFuZCBpZiBpdCBkb2VzLCBpbnZva2VzIGl0IHdpdGgg
dGhlIGFyZ3VtZW50cyBwYXNzZWQuCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgZCA9IG5ldyBE
YXRlKCcwMy8xNS8yMDEzJyk7Ci0gIEVtYmVyLnRyeUludm9rZShkLCAnZ2V0VGltZScpOyAvLyAx
MzYzMzIwMDAwMDAwCi0gIEVtYmVyLnRyeUludm9rZShkLCAnc2V0RnVsbFllYXInLCBbMjAxNF0p
OyAvLyAxMzk0ODU2MDAwMDAwCi0gIEVtYmVyLnRyeUludm9rZShkLCAnbm9TdWNoTWV0aG9kJywg
WzIwMTRdKTsgLy8gdW5kZWZpbmVkCi0gIGBgYAotCi0gIEBtZXRob2QgdHJ5SW52b2tlCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0
aGUgbWV0aG9kCi0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0
byBjaGVjayBmb3IKLSAgQHBhcmFtIHtBcnJheX0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gcGFz
cyB0byB0aGUgbWV0aG9kCi0gIEByZXR1cm4geyp9IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGlu
dm9rZWQgbWV0aG9kIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgaW52b2tlZAotKi8KLUVt
YmVyLnRyeUludm9rZSA9IGZ1bmN0aW9uKG9iaiwgbWV0aG9kTmFtZSwgYXJncykgewotICBpZiAo
Y2FuSW52b2tlKG9iaiwgbWV0aG9kTmFtZSkpIHsKLSAgICByZXR1cm4gb2JqW21ldGhvZE5hbWVd
LmFwcGx5KG9iaiwgYXJncyB8fCBbXSk7Ci0gIH0KLX07Ci0KLS8vIGh0dHBzOi8vZ2l0aHViLmNv
bS9lbWJlcmpzL2VtYmVyLmpzL3B1bGwvMTYxNwotdmFyIG5lZWRzRmluYWxseUZpeCA9IChmdW5j
dGlvbigpIHsKLSAgdmFyIGNvdW50ID0gMDsKLSAgdHJ5ewotICAgIHRyeSB7IH0KLSAgICBmaW5h
bGx5IHsKLSAgICAgIGNvdW50Kys7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWRzRmluYWxs
eUZpeFRlc3QnKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKGUpIHt9Ci0KLSAgcmV0dXJuIGNvdW50ICE9
PSAxOwotfSkoKTsKLQotLyoqCi0gIFByb3ZpZGVzIHRyeSB7IH0gZmluYWxseSB7IH0gZnVuY3Rp
b25hbGl0eSwgd2hpbGUgd29ya2luZwotICBhcm91bmQgU2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkg
YnVnLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHRyeWFibGUgPSBmdW5jdGlvbigpIHsKLSAg
ICBzb21lUmVzb3VyY2UubG9jaygpOwotICAgIHJ1bkNhbGxiYWNrKCk7IC8vIE1heSB0aHJvdyBl
cnJvci4KLSAgfTsKLSAgdmFyIGZpbmFsaXplciA9IGZ1bmN0aW9uKCkgewotICAgIHNvbWVSZXNv
dXJjZS51bmxvY2soKTsKLSAgfTsKLSAgRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6
ZXIpOwotICBgYGAKLQotICBAbWV0aG9kIHRyeUZpbmFsbHkKLSAgQGZvciBFbWJlcgotICBAcGFy
YW0ge0Z1bmN0aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIHRyeSBjYWxsYmFj
awotICBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5hbGl6ZXIgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUg
ZmluYWxseSBjYWxsYmFjawotICBAcGFyYW0ge09iamVjdH0gW2JpbmRpbmddIFRoZSBvcHRpb25h
bCBjYWxsaW5nIG9iamVjdC4gRGVmYXVsdHMgdG8gJ3RoaXMnCi0gIEByZXR1cm4geyp9IFRoZSBy
ZXR1cm4gdmFsdWUgaXMgdGhlIHRoYXQgb2YgdGhlIGZpbmFsaXplciwKLSAgdW5sZXNzIHRoYXQg
dmFsdWUgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUK
LSAgb2YgdGhlIHRyeWFibGUKLSovCi0KLWlmIChuZWVkc0ZpbmFsbHlGaXgpIHsKLSAgRW1iZXIu
dHJ5RmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGZpbmFsaXplciwgYmluZGluZykgewotICAg
IHZhciByZXN1bHQsIGZpbmFsUmVzdWx0LCBmaW5hbEVycm9yOwotCi0gICAgYmluZGluZyA9IGJp
bmRpbmcgfHwgdGhpczsKLQotICAgIHRyeSB7Ci0gICAgICByZXN1bHQgPSB0cnlhYmxlLmNhbGwo
YmluZGluZyk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsUmVz
dWx0ID0gZmluYWxpemVyLmNhbGwoYmluZGluZyk7Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAg
ICAgIGZpbmFsRXJyb3IgPSBlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5hbEVycm9y
KSB7IHRocm93IGZpbmFsRXJyb3I7IH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVu
ZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0gZWxzZSB7Ci0gIEVtYmVy
LnRyeUZpbmFsbHkgPSBmdW5jdGlvbih0cnlhYmxlLCBmaW5hbGl6ZXIsIGJpbmRpbmcpIHsKLSAg
ICB2YXIgcmVzdWx0LCBmaW5hbFJlc3VsdDsKLQotICAgIGJpbmRpbmcgPSBiaW5kaW5nIHx8IHRo
aXM7Ci0KLSAgICB0cnkgewotICAgICAgcmVzdWx0ID0gdHJ5YWJsZS5jYWxsKGJpbmRpbmcpOwot
ICAgIH0gZmluYWxseSB7Ci0gICAgICBmaW5hbFJlc3VsdCA9IGZpbmFsaXplci5jYWxsKGJpbmRp
bmcpOwotICAgIH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyBy
ZXN1bHQgOiBmaW5hbFJlc3VsdDsKLSAgfTsKLX0KLQotLyoqCi0gIFByb3ZpZGVzIHRyeSB7IH0g
Y2F0Y2ggZmluYWxseSB7IH0gZnVuY3Rpb25hbGl0eSwgd2hpbGUgd29ya2luZwotICBhcm91bmQg
U2FmYXJpJ3MgZG91YmxlIGZpbmFsbHkgYnVnLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHRy
eWFibGUgPSBmdW5jdGlvbigpIHsKLSAgICBmb3IgKGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBp
PGw7IGkrKykgewotICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICBiZWZvcmVW
YWx1ZXNbaV0gPSBsaXN0ZW5lci5iZWZvcmUobmFtZSwgdGltZSgpLCBwYXlsb2FkKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKLSAgfTsKLQotICB2YXIgY2F0
Y2hhYmxlID0gZnVuY3Rpb24oZSkgewotICAgIHBheWxvYWQgPSBwYXlsb2FkIHx8IHt9OwotICAg
IHBheWxvYWQuZXhjZXB0aW9uID0gZTsKLSAgfTsKLQotICB2YXIgZmluYWxpemVyID0gZnVuY3Rp
b24oKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFtZSwg
dGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNbaV0pOwotICAgIH0KLSAgfTsKLSAgRW1iZXIu
dHJ5Q2F0Y2hGaW5hbGx5KHRyeWFibGUsIGNhdGNoYWJsZSwgZmluYWxpemVyKTsKLSAgYGBgCi0K
LSAgQG1ldGhvZCB0cnlDYXRjaEZpbmFsbHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0
aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIHRyeSBjYWxsYmFjawotICBAcGFy
YW0ge0Z1bmN0aW9ufSBjYXRjaGFibGUgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgY2F0Y2hhYmxl
IGNhbGxiYWNrCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZpbmFsaXplciBUaGUgZnVuY3Rpb24gdG8g
cnVuIHRoZSBmaW5hbGx5IGNhbGxiYWNrCi0gIEBwYXJhbSB7T2JqZWN0fSBbYmluZGluZ10gVGhl
IG9wdGlvbmFsIGNhbGxpbmcgb2JqZWN0LiBEZWZhdWx0cyB0byAndGhpcycKLSAgQHJldHVybiB7
Kn0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGhhdCBvZiB0aGUgZmluYWxpemVyLAotICB1bmxl
c3MgdGhhdCB2YWx1ZSBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHJldHVy
biB2YWx1ZQotICBvZiB0aGUgdHJ5YWJsZS4KLSovCi1pZiAobmVlZHNGaW5hbGx5Rml4KSB7Ci0g
IEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmlu
YWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFyIHJlc3VsdCwgZmluYWxSZXN1bHQsIGZpbmFsRXJy
b3I7Ci0KLSAgICBiaW5kaW5nID0gYmluZGluZyB8fCB0aGlzOwotCi0gICAgdHJ5IHsKLSAgICAg
IHJlc3VsdCA9IHRyeWFibGUuY2FsbChiaW5kaW5nKTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0g
ICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBlcnJvcik7Ci0gICAgfSBmaW5h
bGx5IHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNhbGwo
YmluZGluZyk7Ci0gICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICAgIGZpbmFsRXJyb3IgPSBlOwot
ICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5hbEVycm9yKSB7IHRocm93IGZpbmFsRXJyb3I7
IH0KLQotICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBm
aW5hbFJlc3VsdDsKLSAgfTsKLX0gZWxzZSB7Ci0gIEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1
bmN0aW9uKHRyeWFibGUsIGNhdGNoYWJsZSwgZmluYWxpemVyLCBiaW5kaW5nKSB7Ci0gICAgdmFy
IHJlc3VsdCwgZmluYWxSZXN1bHQ7Ci0KLSAgICBiaW5kaW5nID0gYmluZGluZyB8fCB0aGlzOwot
Ci0gICAgdHJ5IHsKLSAgICAgIHJlc3VsdCA9IHRyeWFibGUuY2FsbChiaW5kaW5nKTsKLSAgICB9
IGNhdGNoKGVycm9yKSB7Ci0gICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChiaW5kaW5nLCBl
cnJvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGZpbmFsUmVzdWx0ID0gZmluYWxpemVyLmNh
bGwoYmluZGluZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZp
bmVkKSA/IHJlc3VsdCA6IGZpbmFsUmVzdWx0OwotICB9OwotfQotCi0vLyAuLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBUWVBJTkcgJiBBUlJBWSBNRVNTQUdJTkcK
LS8vCi0KLXZhciBUWVBFX01BUCA9IHt9OwotdmFyIHQgPSAiQm9vbGVhbiBOdW1iZXIgU3RyaW5n
IEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKTsKLUVtYmVyLkFy
cmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBmdW5jdGlvbihuYW1lKSB7Ci0gIFRZUEVfTUFQ
WyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotfSk7Ci0K
LXZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Ci0KLS8qKgotICBSZXR1
cm5zIGEgY29uc2lzdGVudCB0eXBlIGZvciB0aGUgcGFzc2VkIGl0ZW0uCi0KLSAgVXNlIHRoaXMg
aW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8gZ2V0IHRoZSB0eXBlIG9mIGFuIGl0
ZW0uCi0gIEl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhY3Jvc3MgYWxsIGJyb3dzZXJz
IGFuZCBpbmNsdWRlcyBhIGJpdAotICBtb3JlIGRldGFpbC4gSGVyZSBpcyB3aGF0IHdpbGwgYmUg
cmV0dXJuZWQ6Ci0KLSAgICAgIHwgUmV0dXJuIFZhbHVlICB8IE1lYW5pbmcgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfC0tLS0tLS0tLS0tLS0t
LXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18
Ci0gICAgICB8ICdzdHJpbmcnICAgICAgfCBTdHJpbmcgcHJpbWl0aXZlIG9yIFN0cmluZyBvYmpl
Y3QuICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ251bWJlcicgICAgICB8IE51bWJlciBw
cmltaXRpdmUgb3IgTnVtYmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAn
Ym9vbGVhbicgICAgIHwgQm9vbGVhbiBwcmltaXRpdmUgb3IgQm9vbGVhbiBvYmplY3QuICAgICAg
ICAgICAgICAgICB8Ci0gICAgICB8ICdudWxsJyAgICAgICAgfCBOdWxsIHZhbHVlICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgJ3VuZGVmaW5lZCcg
ICB8IFVuZGVmaW5lZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fAotICAgICAgfCAnZnVuY3Rpb24nICAgIHwgQSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0
YW5jZSBvZiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwg
J3JlZ2V4cCcgICAgICB8IEFuIGluc3RhbmNlIG9mIFJlZ0V4cCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAotICAgICAgfCAnZGF0ZScgICAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgRGF0
ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICdjbGFzcycgICAg
ICAgfCBBbiBFbWJlciBjbGFzcyAoY3JlYXRlZCB1c2luZyBFbWJlci5PYmplY3QuZXh0ZW5kKCkp
IHwKLSAgICAgIHwgJ2luc3RhbmNlJyAgICB8IEFuIEVtYmVyIG9iamVjdCBpbnN0YW5jZSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgfCAnZXJyb3InICAgICAgIHwgQW4gaW5z
dGFuY2Ugb2YgdGhlIEVycm9yIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8
ICdvYmplY3QnICAgICAgfCBBIEphdmFTY3JpcHQgb2JqZWN0IG5vdCBpbmhlcml0aW5nIGZyb20g
RW1iZXIuT2JqZWN0IHwKLQotICBFeGFtcGxlczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVy
LnR5cGVPZigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3VuZGVmaW5lZCcKLSAgRW1iZXIu
dHlwZU9mKG51bGwpOyAgICAgICAgICAgICAgICAgICAvLyAnbnVsbCcKLSAgRW1iZXIudHlwZU9m
KHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAvLyAndW5kZWZpbmVkJwotICBFbWJlci50eXBlT2Yo
J21pY2hhZWwnKTsgICAgICAgICAgICAgIC8vICdzdHJpbmcnCi0gIEVtYmVyLnR5cGVPZihuZXcg
U3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmluZycKLSAgRW1iZXIudHlwZU9mKDEwMSk7ICAg
ICAgICAgICAgICAgICAgICAvLyAnbnVtYmVyJwotICBFbWJlci50eXBlT2YobmV3IE51bWJlcigx
MDEpKTsgICAgICAgIC8vICdudW1iZXInCi0gIEVtYmVyLnR5cGVPZih0cnVlKTsgICAgICAgICAg
ICAgICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVyLnR5cGVPZihuZXcgQm9vbGVhbih0cnVlKSk7
ICAgICAgLy8gJ2Jvb2xlYW4nCi0gIEVtYmVyLnR5cGVPZihFbWJlci5tYWtlQXJyYXkpOyAgICAg
ICAgLy8gJ2Z1bmN0aW9uJwotICBFbWJlci50eXBlT2YoWzEsMiw5MF0pOyAgICAgICAgICAgICAg
IC8vICdhcnJheScKLSAgRW1iZXIudHlwZU9mKC9hYmMvKTsgICAgICAgICAgICAgICAgICAvLyAn
cmVnZXhwJwotICBFbWJlci50eXBlT2YobmV3IERhdGUoKSk7ICAgICAgICAgICAgIC8vICdkYXRl
JwotICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmV4dGVuZCgpKTsgIC8vICdjbGFzcycKLSAg
RW1iZXIudHlwZU9mKEVtYmVyLk9iamVjdC5jcmVhdGUoKSk7ICAvLyAnaW5zdGFuY2UnCi0gIEVt
YmVyLnR5cGVPZihuZXcgRXJyb3IoJ3RlYW1vY2lsJykpOyAgLy8gJ2Vycm9yJwotCi0gIC8vICJu
b3JtYWwiIEphdmFTY3JpcHQgb2JqZWN0Ci0gIEVtYmVyLnR5cGVPZih7YTogJ2InfSk7ICAgICAg
ICAgICAgICAvLyAnb2JqZWN0JwotICBgYGAKLQotICBAbWV0aG9kIHR5cGVPZgotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBpdGVtIHRvIGNoZWNrCi0gIEByZXR1cm4g
e1N0cmluZ30gdGhlIHR5cGUKLSovCi1FbWJlci50eXBlT2YgPSBmdW5jdGlvbihpdGVtKSB7Ci0g
IHZhciByZXQ7Ci0KLSAgcmV0ID0gKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVk
KSA/IFN0cmluZyhpdGVtKSA6IFRZUEVfTUFQW3RvU3RyaW5nLmNhbGwoaXRlbSldIHx8ICdvYmpl
Y3QnOwotCi0gIGlmIChyZXQgPT09ICdmdW5jdGlvbicpIHsKLSAgICBpZiAoRW1iZXIuT2JqZWN0
ICYmIEVtYmVyLk9iamVjdC5kZXRlY3QoaXRlbSkpIHJldCA9ICdjbGFzcyc7Ci0gIH0gZWxzZSBp
ZiAocmV0ID09PSAnb2JqZWN0JykgewotICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHJl
dCA9ICdlcnJvcic7Ci0gICAgZWxzZSBpZiAoRW1iZXIuT2JqZWN0ICYmIGl0ZW0gaW5zdGFuY2Vv
ZiBFbWJlci5PYmplY3QpIHJldCA9ICdpbnN0YW5jZSc7Ci0gICAgZWxzZSBpZiAoaXRlbSBpbnN0
YW5jZW9mIERhdGUpIHJldCA9ICdkYXRlJzsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19OwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gRW1iZXIudHJ5Q2F0Y2hGaW5hbGx5Ci0KLS8q
KgotICBUaGUgcHVycG9zZSBvZiB0aGUgRW1iZXIgSW5zdHJ1bWVudGF0aW9uIG1vZHVsZSBpcwot
ICB0byBwcm92aWRlIGVmZmljaWVudCwgZ2VuZXJhbC1wdXJwb3NlIGluc3RydW1lbnRhdGlvbgot
ICBmb3IgRW1iZXIuCi0KLSAgU3Vic2NyaWJlIHRvIGEgbGlzdGVuZXIgYnkgdXNpbmcgYEVtYmVy
LnN1YnNjcmliZWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5zdWJzY3JpYmUoInJlbmRl
ciIsIHsKLSAgICBiZWZvcmU6IGZ1bmN0aW9uKG5hbWUsIHRpbWVzdGFtcCwgcGF5bG9hZCkgewot
Ci0gICAgfSwKLQotICAgIGFmdGVyOiBmdW5jdGlvbihuYW1lLCB0aW1lc3RhbXAsIHBheWxvYWQp
IHsKLQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIElmIHlvdSByZXR1cm4gYSB2YWx1ZSBmcm9t
IHRoZSBgYmVmb3JlYCBjYWxsYmFjaywgdGhhdCBzYW1lCi0gIHZhbHVlIHdpbGwgYmUgcGFzc2Vk
IGFzIGEgZm91cnRoIHBhcmFtZXRlciB0byB0aGUgYGFmdGVyYAotICBjYWxsYmFjay4KLQotICBJ
bnN0cnVtZW50IGEgYmxvY2sgb2YgY29kZSBieSB1c2luZyBgRW1iZXIuaW5zdHJ1bWVudGA6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5pbnN0cnVtZW50KCJyZW5kZXIuaGFuZGxlYmFycyIs
IHBheWxvYWQsIGZ1bmN0aW9uKCkgewotICAgIC8vIHJlbmRlcmluZyBsb2dpYwotICB9LCBiaW5k
aW5nKTsKLSAgYGBgCi0KLSAgRXZlbnQgbmFtZXMgcGFzc2VkIHRvIGBFbWJlci5pbnN0cnVtZW50
YCBhcmUgbmFtZXNwYWNlZAotICBieSBwZXJpb2RzLCBmcm9tIG1vcmUgZ2VuZXJhbCB0byBtb3Jl
IHNwZWNpZmljLiBTdWJzY3JpYmVycwotICBjYW4gbGlzdGVuIGZvciBldmVudHMgYnkgd2hhdGV2
ZXIgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgdGhleQotICBhcmUgaW50ZXJlc3RlZCBpbi4KLQotICBJ
biB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGV2ZW50IGlzIGByZW5kZXIuaGFuZGxlYmFyc2AsCi0g
IGFuZCB0aGUgc3Vic2NyaWJlciBsaXN0ZW5lZCBmb3IgYWxsIGV2ZW50cyBiZWdpbm5pbmcgd2l0
aAotICBgcmVuZGVyYC4gSXQgd291bGQgcmVjZWl2ZSBjYWxsYmFja3MgZm9yIGV2ZW50cyBuYW1l
ZAotICBgcmVuZGVyYCwgYHJlbmRlci5oYW5kbGViYXJzYCwgYHJlbmRlci5jb250YWluZXJgLCBv
cgotICBldmVuIGByZW5kZXIuaGFuZGxlYmFycy5sYXlvdXRgLgotCi0gIEBjbGFzcyBJbnN0cnVt
ZW50YXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotRW1iZXIuSW5zdHJ1
bWVudGF0aW9uID0ge307Ci0KLXZhciBzdWJzY3JpYmVycyA9IFtdLCBjYWNoZSA9IHt9OwotCi12
YXIgcG9wdWxhdGVMaXN0ZW5lcnMgPSBmdW5jdGlvbihuYW1lKSB7Ci0gIHZhciBsaXN0ZW5lcnMg
PSBbXSwgc3Vic2NyaWJlcjsKLQotICBmb3IgKHZhciBpPTAsIGw9c3Vic2NyaWJlcnMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgIHN1YnNjcmliZXIgPSBzdWJzY3JpYmVyc1tpXTsKLSAgICBpZiAo
c3Vic2NyaWJlci5yZWdleC50ZXN0KG5hbWUpKSB7Ci0gICAgICBsaXN0ZW5lcnMucHVzaChzdWJz
Y3JpYmVyLm9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgY2FjaGVbbmFtZV0gPSBsaXN0ZW5lcnM7
Ci0gIHJldHVybiBsaXN0ZW5lcnM7Ci19OwotCi12YXIgdGltZSA9IChmdW5jdGlvbigpIHsKLSAg
dmFyIHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdy5wZXJmb3Jt
YW5jZSB8fCB7fSA6IHt9OwotICB2YXIgZm4gPSBwZXJmLm5vdyB8fCBwZXJmLm1vek5vdyB8fCBw
ZXJmLndlYmtpdE5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdzsKLSAgLy8gZm4uYmluZCB3
aWxsIGJlIGF2YWlsYWJsZSBpbiBhbGwgdGhlIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0aGUgYWR2
YW5jZWQgd2luZG93LnBlcmZvcm1hbmNlLi4uIDstKQotICByZXR1cm4gZm4gPyBmbi5iaW5kKHBl
cmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3IERhdGUoKTsgfTsKLX0pKCk7Ci0KLS8qKgot
ICBOb3RpZmllcyBldmVudCdzIHN1YnNjcmliZXJzLCBjYWxscyBgYmVmb3JlYCBhbmQgYGFmdGVy
YCBob29rcy4KLQotICBAbWV0aG9kIGluc3RydW1lbnQKLSAgQG5hbWVzcGFjZSBFbWJlci5JbnN0
cnVtZW50YXRpb24KLQotICBAcGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFjZWQgZXZlbnQg
bmFtZS4KLSAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs
bGJhY2sgRnVuY3Rpb24gdGhhdCB5b3UncmUgaW5zdHJ1bWVudGluZy4KLSAgQHBhcmFtIHtPYmpl
Y3R9IGJpbmRpbmcgQ29udGV4dCB0aGF0IGluc3RydW1lbnQgZnVuY3Rpb24gaXMgY2FsbGVkIHdp
dGguCi0qLwotRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQgPSBmdW5jdGlvbihuYW1l
LCBwYXlsb2FkLCBjYWxsYmFjaywgYmluZGluZykgewotICB2YXIgbGlzdGVuZXJzID0gY2FjaGVb
bmFtZV0sIHRpbWVOYW1lLCByZXQ7Ci0KLSAgaWYgKEVtYmVyLlNUUlVDVFVSRURfUFJPRklMRSkg
ewotICAgIHRpbWVOYW1lID0gbmFtZSArICI6ICIgKyBwYXlsb2FkLm9iamVjdDsKLSAgICBjb25z
b2xlLnRpbWUodGltZU5hbWUpOwotICB9Ci0KLSAgaWYgKCFsaXN0ZW5lcnMpIHsKLSAgICBsaXN0
ZW5lcnMgPSBwb3B1bGF0ZUxpc3RlbmVycyhuYW1lKTsKLSAgfQotCi0gIGlmIChsaXN0ZW5lcnMu
bGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0ID0gY2FsbGJhY2suY2FsbChiaW5kaW5nKTsKLSAgICBp
ZiAoRW1iZXIuU1RSVUNUVVJFRF9QUk9GSUxFKSB7IGNvbnNvbGUudGltZUVuZCh0aW1lTmFtZSk7
IH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdmFyIGJlZm9yZVZhbHVlcyA9IFtdLCBsaXN0
ZW5lciwgaSwgbDsKLQotICBmdW5jdGlvbiB0cnlhYmxlKCkgewotICAgIGZvciAoaT0wLCBsPWxp
c3RlbmVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tp
XTsKLSAgICAgIGJlZm9yZVZhbHVlc1tpXSA9IGxpc3RlbmVyLmJlZm9yZShuYW1lLCB0aW1lKCks
IHBheWxvYWQpOwotICAgIH0KLQotICAgIHJldHVybiBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOwot
ICB9Ci0KLSAgZnVuY3Rpb24gY2F0Y2hhYmxlKGUpIHsKLSAgICBwYXlsb2FkID0gcGF5bG9hZCB8
fCB7fTsKLSAgICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7Ci0gIH0KLQotICBmdW5jdGlvbiBmaW5h
bGl6ZXIoKSB7Ci0gICAgZm9yIChpPTAsIGw9bGlzdGVuZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsK
LSAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwotICAgICAgbGlzdGVuZXIuYWZ0ZXIobmFt
ZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZvcmVWYWx1ZXNbaV0pOwotICAgIH0KLQotICAgIGlmIChF
bWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsKLSAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTmFt
ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLnRyeUNhdGNoRmluYWxseSh0cnlhYmxl
LCBjYXRjaGFibGUsIGZpbmFsaXplcik7Ci19OwotCi0vKioKLSAgU3Vic2NyaWJlcyB0byBhIHBh
cnRpY3VsYXIgZXZlbnQgb3IgaW5zdHJ1bWVudGVkIGJsb2NrIG9mIGNvZGUuCi0KLSAgQG1ldGhv
ZCBzdWJzY3JpYmUKLSAgQG5hbWVzcGFjZSBFbWJlci5JbnN0cnVtZW50YXRpb24KLQotICBAcGFy
YW0ge1N0cmluZ30gW3BhdHRlcm5dIE5hbWVzcGFjZWQgZXZlbnQgbmFtZS4KLSAgQHBhcmFtIHtP
YmplY3R9IFtvYmplY3RdIEJlZm9yZSBhbmQgQWZ0ZXIgaG9va3MuCi0KLSAgQHJldHVybiB7U3Vi
c2NyaWJlcn0KLSovCi1FbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlID0gZnVuY3Rpb24o
cGF0dGVybiwgb2JqZWN0KSB7Ci0gIHZhciBwYXRocyA9IHBhdHRlcm4uc3BsaXQoIi4iKSwgcGF0
aCwgcmVnZXggPSBbXTsKLQotICBmb3IgKHZhciBpPTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkr
KykgewotICAgIHBhdGggPSBwYXRoc1tpXTsKLSAgICBpZiAocGF0aCA9PT0gIioiKSB7Ci0gICAg
ICByZWdleC5wdXNoKCJbXlxcLl0qIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlZ2V4LnB1c2go
cGF0aCk7Ci0gICAgfQotICB9Ci0KLSAgcmVnZXggPSByZWdleC5qb2luKCJcXC4iKTsKLSAgcmVn
ZXggPSByZWdleCArICIoXFwuLiopPyI7Ci0KLSAgdmFyIHN1YnNjcmliZXIgPSB7Ci0gICAgcGF0
dGVybjogcGF0dGVybiwKLSAgICByZWdleDogbmV3IFJlZ0V4cCgiXiIgKyByZWdleCArICIkIiks
Ci0gICAgb2JqZWN0OiBvYmplY3QKLSAgfTsKLQotICBzdWJzY3JpYmVycy5wdXNoKHN1YnNjcmli
ZXIpOwotICBjYWNoZSA9IHt9OwotCi0gIHJldHVybiBzdWJzY3JpYmVyOwotfTsKLQotLyoqCi0g
IFVuc3Vic2NyaWJlcyBmcm9tIGEgcGFydGljdWxhciBldmVudCBvciBpbnN0cnVtZW50ZWQgYmxv
Y2sgb2YgY29kZS4KLQotICBAbWV0aG9kIHVuc3Vic2NyaWJlCi0gIEBuYW1lc3BhY2UgRW1iZXIu
SW5zdHJ1bWVudGF0aW9uCi0KLSAgQHBhcmFtIHtPYmplY3R9IFtzdWJzY3JpYmVyXQotKi8KLUVt
YmVyLkluc3RydW1lbnRhdGlvbi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsK
LSAgdmFyIGluZGV4OwotCi0gIGZvciAodmFyIGk9MCwgbD1zdWJzY3JpYmVycy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgaWYgKHN1YnNjcmliZXJzW2ldID09PSBzdWJzY3JpYmVyKSB7Ci0gICAg
ICBpbmRleCA9IGk7Ci0gICAgfQotICB9Ci0KLSAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAx
KTsKLSAgY2FjaGUgPSB7fTsKLX07Ci0KLS8qKgotICBSZXNldHMgYEVtYmVyLkluc3RydW1lbnRh
dGlvbmAgYnkgZmx1c2hpbmcgbGlzdCBvZiBzdWJzY3JpYmVycy4KLQotICBAbWV0aG9kIHJlc2V0
Ci0gIEBuYW1lc3BhY2UgRW1iZXIuSW5zdHJ1bWVudGF0aW9uCi0qLwotRW1iZXIuSW5zdHJ1bWVu
dGF0aW9uLnJlc2V0ID0gZnVuY3Rpb24oKSB7Ci0gIHN1YnNjcmliZXJzID0gW107Ci0gIGNhY2hl
ID0ge307Ci19OwotCi1FbWJlci5pbnN0cnVtZW50ID0gRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmlu
c3RydW1lbnQ7Ci1FbWJlci5zdWJzY3JpYmUgPSBFbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2Ny
aWJlOwotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBtYXAsIGZvckVhY2gsIGluZGV4
T2YsIHNwbGljZTsKLW1hcCAgICAgPSBBcnJheS5wcm90b3R5cGUubWFwICAgICB8fCBFbWJlci5B
cnJheVBvbHlmaWxscy5tYXA7Ci1mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggfHwg
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKLWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUu
aW5kZXhPZiB8fCBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotc3BsaWNlID0gQXJyYXku
cHJvdG90eXBlLnNwbGljZTsKLQotdmFyIHV0aWxzID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzID0g
ewotICBtYXA6IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKLSAgICByZXR1cm4g
b2JqLm1hcCA/IG9iai5tYXAuY2FsbChvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSA6IG1hcC5jYWxs
KG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwotICB9LAotCi0gIGZvckVhY2g6IGZ1bmN0aW9uKG9i
aiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKLSAgICByZXR1cm4gb2JqLmZvckVhY2ggPyBvYmouZm9y
RWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIDogZm9yRWFjaC5jYWxsKG9iaiwgY2Fs
bGJhY2ssIHRoaXNBcmcpOwotICB9LAotCi0gIGluZGV4T2Y6IGZ1bmN0aW9uKG9iaiwgZWxlbWVu
dCwgaW5kZXgpIHsKLSAgICByZXR1cm4gb2JqLmluZGV4T2YgPyBvYmouaW5kZXhPZi5jYWxsKG9i
aiwgZWxlbWVudCwgaW5kZXgpIDogaW5kZXhPZi5jYWxsKG9iaiwgZWxlbWVudCwgaW5kZXgpOwot
ICB9LAotCi0gIGluZGV4ZXNPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50cykgewotICAgIHJldHVy
biBlbGVtZW50cyA9PT0gdW5kZWZpbmVkID8gW10gOiB1dGlscy5tYXAoZWxlbWVudHMsIGZ1bmN0
aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB1dGlscy5pbmRleE9mKG9iaiwgaXRlbSk7Ci0gICAg
fSk7Ci0gIH0sCi0KLSAgYWRkT2JqZWN0OiBmdW5jdGlvbihhcnJheSwgaXRlbSkgewotICAgIHZh
ciBpbmRleCA9IHV0aWxzLmluZGV4T2YoYXJyYXksIGl0ZW0pOwotICAgIGlmIChpbmRleCA9PT0g
LTEpIHsgYXJyYXkucHVzaChpdGVtKTsgfQotICB9LAotCi0gIHJlbW92ZU9iamVjdDogZnVuY3Rp
b24oYXJyYXksIGl0ZW0pIHsKLSAgICB2YXIgaW5kZXggPSB1dGlscy5pbmRleE9mKGFycmF5LCBp
dGVtKTsKLSAgICBpZiAoaW5kZXggIT09IC0xKSB7IGFycmF5LnNwbGljZShpbmRleCwgMSk7IH0K
LSAgfSwKLQotICBfcmVwbGFjZTogZnVuY3Rpb24oYXJyYXksIGlkeCwgYW10LCBvYmplY3RzKSB7
Ci0gICAgdmFyIGFyZ3MgPSBbXS5jb25jYXQob2JqZWN0cyksIGNodW5rLCByZXQgPSBbXSwKLSAg
ICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWls
P2lkPTU2NTg4Ci0gICAgICAgIHNpemUgPSA2MDAwMCwgc3RhcnQgPSBpZHgsIGVuZHMgPSBhbXQs
IGNvdW50OwotCi0gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7Ci0gICAgICBjb3VudCA9IGVuZHMg
PiBzaXplID8gc2l6ZSA6IGVuZHM7Ci0gICAgICBpZiAoY291bnQgPD0gMCkgeyBjb3VudCA9IDA7
IH0KLQotICAgICAgY2h1bmsgPSBhcmdzLnNwbGljZSgwLCBzaXplKTsKLSAgICAgIGNodW5rID0g
W3N0YXJ0LCBjb3VudF0uY29uY2F0KGNodW5rKTsKLQotICAgICAgc3RhcnQgKz0gc2l6ZTsKLSAg
ICAgIGVuZHMgLT0gY291bnQ7Ci0KLSAgICAgIHJldCA9IHJldC5jb25jYXQoc3BsaWNlLmFwcGx5
KGFycmF5LCBjaHVuaykpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIHJlcGxh
Y2U6IGZ1bmN0aW9uKGFycmF5LCBpZHgsIGFtdCwgb2JqZWN0cykgewotICAgIGlmIChhcnJheS5y
ZXBsYWNlKSB7Ci0gICAgICByZXR1cm4gYXJyYXkucmVwbGFjZShpZHgsIGFtdCwgb2JqZWN0cyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1dGlscy5fcmVwbGFjZShhcnJheSwgaWR4LCBh
bXQsIG9iamVjdHMpOwotICAgIH0KLSAgfSwKLQotICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uKGFy
cmF5MSwgYXJyYXkyKSB7Ci0gICAgdmFyIGludGVyc2VjdGlvbiA9IFtdOwotCi0gICAgdXRpbHMu
Zm9yRWFjaChhcnJheTEsIGZ1bmN0aW9uKGVsZW1lbnQpIHsKLSAgICAgIGlmICh1dGlscy5pbmRl
eE9mKGFycmF5MiwgZWxlbWVudCkgPj0gMCkgewotICAgICAgICBpbnRlcnNlY3Rpb24ucHVzaChl
bGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiBpbnRlcnNlY3Rpb247Ci0g
IH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIt
bWV0YWwKLSovCi0KLXZhciBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZLCBnZXQ7Ci0KLXZhciBN
QU5EQVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVI7Ci0KLXZhciBJU19H
TE9CQUxfUEFUSCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS4qW1wuXCpdLzsKLXZhciBIQVNf
VEhJUyAgPSAvXnRoaXNbXC5cKl0vOwotdmFyIEZJUlNUX0tFWSA9IC9eKFteXC5cKl0rKS87Ci0K
LS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4KLS8vIEdFVCBBTkQgU0VUCi0vLwotLy8gSWYgd2UgYXJlIG9uIGEgcGxhdGZvcm0gdGhh
dCBzdXBwb3J0cyBhY2Nlc3NvcnMgd2UgY2FuIHVzZSB0aG9zZS4KLS8vIE90aGVyd2lzZSBzaW11
bGF0ZSBhY2Nlc3NvcnMgYnkgbG9va2luZyB1cCB0aGUgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhl
Ci0vLyBvYmplY3QuCi0KLS8qKgotICBHZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9uIGFu
IG9iamVjdC4gSWYgdGhlIHByb3BlcnR5IGlzIGNvbXB1dGVkLAotICB0aGUgZnVuY3Rpb24gd2ls
bCBiZSBpbnZva2VkLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgYnV0IHRoZQotICBv
YmplY3QgaW1wbGVtZW50cyB0aGUgYHVua25vd25Qcm9wZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3
aWxsIGJlIGludm9rZWQuCi0KLSAgSWYgeW91IHBsYW4gdG8gcnVuIG9uIElFOCBhbmQgb2xkZXIg
YnJvd3NlcnMgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGlzCi0gIG1ldGhvZCBhbnl0aW1lIHlvdSB3
YW50IHRvIHJldHJpZXZlIGEgcHJvcGVydHkgb24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0Ci0g
IGtub3cgZm9yIHN1cmUgaXMgcHJpdmF0ZS4gKFByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggYW4g
dW5kZXJzY29yZSAnXycKLSAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4pCi0KLSAgT24gYWxsIG5l
d2VyIGJyb3dzZXJzLCB5b3Ugb25seSBuZWVkIHRvIHVzZSB0aGlzIG1ldGhvZCB0byByZXRyaWV2
ZQotICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBtaWdodCBub3QgYmUgZGVmaW5lZCBvbiB0
aGUgb2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5
YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAg
Tm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRlZmluZWRgLCB0aGlzIG1ldGhv
ZCB3aWxsIHRocm93Ci0gIGFuIGVycm9yLgotCi0gIEBtZXRob2QgZ2V0Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIGZyb20uCi0gIEBw
YXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmV0cmlldmUKLSAgQHJl
dHVybiB7T2JqZWN0fSB0aGUgcHJvcGVydHkgdmFsdWUgb3IgYG51bGxgLgotKi8KLWdldCA9IGZ1
bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKLSAgLy8gSGVscGVycyB0aGF0IG9wZXJhdGUgd2l0
aCAndGhpcycgd2l0aGluIGFuICNlYWNoCi0gIGlmIChrZXlOYW1lID09PSAnJykgewotICAgIHJl
dHVybiBvYmo7Ci0gIH0KLQotICBpZiAoIWtleU5hbWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2Jq
KSB7Ci0gICAga2V5TmFtZSA9IG9iajsKLSAgICBvYmogPSBudWxsOwotICB9Ci0KLSAgRW1iZXIu
YXNzZXJ0KCJDYW5ub3QgY2FsbCBnZXQgd2l0aCAiKyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5h
bWUpOwotICBFbWJlci5hc3NlcnQoIkNhbm5vdCBjYWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsi
JyBvbiBhbiB1bmRlZmluZWQgb2JqZWN0LiIsIG9iaiAhPT0gdW5kZWZpbmVkKTsKLQotICBpZiAo
b2JqID09PSBudWxsIHx8IGtleU5hbWUuaW5kZXhPZignLicpICE9PSAtMSkgewotICAgIHJldHVy
biBnZXRQYXRoKG9iaiwga2V5TmFtZSk7Ci0gIH0KLQotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tF
WV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nba2V5TmFtZV0sIHJldDsKLSAgaWYgKGRlc2Mp
IHsKLSAgICByZXR1cm4gZGVzYy5nZXQob2JqLCBrZXlOYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUiAmJiBtZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5TmFtZV0gPiAw
KSB7Ci0gICAgICByZXQgPSBtZXRhLnZhbHVlc1trZXlOYW1lXTsKLSAgICB9IGVsc2UgewotICAg
ICAgcmV0ID0gb2JqW2tleU5hbWVdOwotICAgIH0KLQotICAgIGlmIChyZXQgPT09IHVuZGVmaW5l
ZCAmJgotICAgICAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIG9iaiAmJiAhKGtleU5hbWUgaW4gb2Jq
KSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnVua25vd25Qcm9wZXJ0eSkgewotICAgICAg
cmV0dXJuIG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IHJldDsKLSAgfQotfTsKLQotLy8gQ3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRl
c3RzCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKSB7Ci0gIEVtYmVyLmdldCA9
IGdldDsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIGdldCA9IEVtYmVy
LmdldDsKLX0KLQotLyoqCi0gIE5vcm1hbGl6ZXMgYSB0YXJnZXQvcGF0aCBwYWlyIHRvIHJlZmxl
Y3QgdGhhdCBhY3R1YWwgdGFyZ2V0L3BhdGggdGhhdCBzaG91bGQKLSAgYmUgb2JzZXJ2ZWQsIGV0
Yy4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgcGFzc2luZyBpbiBnbG9iYWwgcHJvcGVydHkKLSAg
cGF0aHMgKGkuZS4gYSBwYXRoIGJlZ2lubmluZyB3aXRoIGEgY2FwdGlhbCBsZXR0ZXIgbm90IGRl
ZmluZWQgb24gdGhlCi0gIHRhcmdldCkgYW5kICogc2VwYXJhdG9ycy4KLQotICBAcHJpdmF0ZQot
ICBAbWV0aG9kIG5vcm1hbGl6ZVR1cGxlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9
IHRhcmdldCBUaGUgY3VycmVudCB0YXJnZXQuIE1heSBiZSBgbnVsbGAuCi0gIEBwYXJhbSB7U3Ry
aW5nfSBwYXRoIEEgcGF0aCBvbiB0aGUgdGFyZ2V0IG9yIGEgZ2xvYmFsIHByb3BlcnR5IHBhdGgu
Ci0gIEByZXR1cm4ge0FycmF5fSBhIHRlbXBvcmFyeSBhcnJheSB3aXRoIHRoZSBub3JtYWxpemVk
IHRhcmdldC9wYXRoIHBhaXIuCi0qLwotdmFyIG5vcm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFs
aXplVHVwbGUgPSBmdW5jdGlvbih0YXJnZXQsIHBhdGgpIHsKLSAgdmFyIGhhc1RoaXMgID0gSEFT
X1RISVMudGVzdChwYXRoKSwKLSAgICAgIGlzR2xvYmFsID0gIWhhc1RoaXMgJiYgSVNfR0xPQkFM
X1BBVEgudGVzdChwYXRoKSwKLSAgICAgIGtleTsKLQotICBpZiAoIXRhcmdldCB8fCBpc0dsb2Jh
bCkgdGFyZ2V0ID0gRW1iZXIubG9va3VwOwotICBpZiAoaGFzVGhpcykgcGF0aCA9IHBhdGguc2xp
Y2UoNSk7Ci0KLSAgaWYgKHRhcmdldCA9PT0gRW1iZXIubG9va3VwKSB7Ci0gICAga2V5ID0gcGF0
aC5tYXRjaChGSVJTVF9LRVkpWzBdOwotICAgIHRhcmdldCA9IGdldCh0YXJnZXQsIGtleSk7Ci0g
ICAgcGF0aCAgID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICB9Ci0KLSAgLy8gbXVzdCBy
ZXR1cm4gc29tZSBraW5kIG9mIHBhdGggdG8gYmUgdmFsaWQgZWxzZSBvdGhlciB0aGluZ3Mgd2ls
bCBicmVhay4KLSAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoPT09MCkgdGhyb3cgbmV3IEVtYmVy
LkVycm9yKCdJbnZhbGlkIFBhdGgnKTsKLQotICByZXR1cm4gWyB0YXJnZXQsIHBhdGggXTsKLX07
Ci0KLXZhciBnZXRQYXRoID0gRW1iZXIuX2dldFBhdGggPSBmdW5jdGlvbihyb290LCBwYXRoKSB7
Ci0gIHZhciBoYXNUaGlzLCBwYXJ0cywgdHVwbGUsIGlkeCwgbGVuOwotCi0gIC8vIElmIHRoZXJl
IGlzIG5vIHJvb3QgYW5kIHBhdGggaXMgYSBrZXkgbmFtZSwgcmV0dXJuIHRoYXQKLSAgLy8gcHJv
cGVydHkgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC4KLSAgLy8gRS5nLiBnZXQoJ0VtYmVyJykgLT4g
RW1iZXIKLSAgaWYgKHJvb3QgPT09IG51bGwgJiYgcGF0aC5pbmRleE9mKCcuJykgPT09IC0xKSB7
IHJldHVybiBnZXQoRW1iZXIubG9va3VwLCBwYXRoKTsgfQotCi0gIC8vIGRldGVjdCBjb21wbGlj
YXRlZCBwYXRocyBhbmQgbm9ybWFsaXplIHRoZW0KLSAgaGFzVGhpcyAgPSBIQVNfVEhJUy50ZXN0
KHBhdGgpOwotCi0gIGlmICghcm9vdCB8fCBoYXNUaGlzKSB7Ci0gICAgdHVwbGUgPSBub3JtYWxp
emVUdXBsZShyb290LCBwYXRoKTsKLSAgICByb290ID0gdHVwbGVbMF07Ci0gICAgcGF0aCA9IHR1
cGxlWzFdOwotICAgIHR1cGxlLmxlbmd0aCA9IDA7Ci0gIH0KLQotICBwYXJ0cyA9IHBhdGguc3Bs
aXQoIi4iKTsKLSAgbGVuID0gcGFydHMubGVuZ3RoOwotICBmb3IgKGlkeCA9IDA7IHJvb3QgIT0g
bnVsbCAmJiBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgcm9vdCA9IGdldChyb290LCBwYXJ0c1tp
ZHhdLCB0cnVlKTsKLSAgICBpZiAocm9vdCAmJiByb290LmlzRGVzdHJveWVkKSB7IHJldHVybiB1
bmRlZmluZWQ7IH0KLSAgfQotICByZXR1cm4gcm9vdDsKLX07Ci0KLUVtYmVyLmdldFdpdGhEZWZh
dWx0ID0gZnVuY3Rpb24ocm9vdCwga2V5LCBkZWZhdWx0VmFsdWUpIHsKLSAgdmFyIHZhbHVlID0g
Z2V0KHJvb3QsIGtleSk7Ci0KLSAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRl
ZmF1bHRWYWx1ZTsgfQotICByZXR1cm4gdmFsdWU7Ci19OwotCi0KLUVtYmVyLmdldCA9IGdldDsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAot
Ki8KLQotdmFyIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG1ldGFGb3IgPSBFbWJlci5t
ZXRhLAotICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgYV9zbGljZSA9IFtdLnNs
aWNlLAotICAgIC8qIGxpc3RlbmVyIGZsYWdzICovCi0gICAgT05DRSA9IDEsIFNVU1BFTkRFRCA9
IDI7Ci0KLS8qCi0gIFRoZSBldmVudCBzeXN0ZW0gdXNlcyBhIHNlcmllcyBvZiBuZXN0ZWQgaGFz
aGVzIHRvIHN0b3JlIGxpc3RlbmVycyBvbiBhbgotICBvYmplY3QuIFdoZW4gYSBsaXN0ZW5lciBp
cyByZWdpc3RlcmVkLCBvciB3aGVuIGFuIGV2ZW50IGFycml2ZXMsIHRoZXNlCi0gIGhhc2hlcyBh
cmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGljaCB0YXJnZXQgYW5kIGFjdGlvbiBwYWlyIHRv
IGludm9rZS4KLQotICBUaGUgaGFzaGVzIGFyZSBzdG9yZWQgaW4gdGhlIG9iamVjdCdzIG1ldGEg
aGFzaCwgYW5kIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAvLyBPYmplY3QncyBtZXRhIGhhc2gK
LSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJzOiB7ICAgICAgIC8vIHZhcmlhYmxlIG5hbWU6IGBs
aXN0ZW5lclNldGAKLSAgICAgICAgICAiZm9vOmNoYW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5hbWU6
IGBhY3Rpb25zYAotICAgICAgICAgICAgdGFyZ2V0LCBtZXRob2QsIGZsYWdzCi0gICAgICAgICAg
XQotICAgICAgICB9Ci0gICAgICB9Ci0KLSovCi0KLWZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHRh
cmdldCwgbWV0aG9kKSB7Ci0gIHZhciBpbmRleCA9IC0xOwotICBmb3IgKHZhciBpID0gMCwgbCA9
IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMykgewotICAgIGlmICh0YXJnZXQgPT09IGFycmF5
W2ldICYmIG1ldGhvZCA9PT0gYXJyYXlbaSsxXSkgeyBpbmRleCA9IGk7IGJyZWFrOyB9Ci0gIH0K
LSAgcmV0dXJuIGluZGV4OwotfQotCi1mdW5jdGlvbiBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1l
KSB7Ci0gIHZhciBtZXRhID0gbWV0YUZvcihvYmosIHRydWUpLAotICAgICAgYWN0aW9uczsKLQot
ICBpZiAoIW1ldGEubGlzdGVuZXJzKSB7IG1ldGEubGlzdGVuZXJzID0ge307IH0KLQotICBpZiAo
IW1ldGEuaGFzT3duUHJvcGVydHkoJ2xpc3RlbmVycycpKSB7Ci0gICAgLy8gc2V0dXAgaW5oZXJp
dGVkIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBvYmplY3QKLSAgICBtZXRhLmxpc3RlbmVycyA9IG9f
Y3JlYXRlKG1ldGEubGlzdGVuZXJzKTsKLSAgfQotCi0gIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVy
c1tldmVudE5hbWVdOwotCi0gIC8vIGlmIHRoZXJlIGFyZSBhY3Rpb25zLCBidXQgdGhlIGV2ZW50
TmFtZSBkb2Vzbid0IGV4aXN0IGluIG91ciBsaXN0ZW5lcnMsIHRoZW4gY29weSB0aGVtIGZyb20g
dGhlIHByb3RvdHlwZQotICBpZiAoYWN0aW9ucyAmJiAhbWV0YS5saXN0ZW5lcnMuaGFzT3duUHJv
cGVydHkoZXZlbnROYW1lKSkgewotICAgIGFjdGlvbnMgPSBtZXRhLmxpc3RlbmVyc1tldmVudE5h
bWVdID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXS5zbGljZSgpOwotICB9IGVsc2UgaWYgKCFh
Y3Rpb25zKSB7Ci0gICAgYWN0aW9ucyA9IG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBbXTsK
LSAgfQotCi0gIHJldHVybiBhY3Rpb25zOwotfQotCi1mdW5jdGlvbiBhY3Rpb25zVW5pb24ob2Jq
LCBldmVudE5hbWUsIG90aGVyQWN0aW9ucykgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0s
Ci0gICAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVy
c1tldmVudE5hbWVdOwotCi0gIGlmICghYWN0aW9ucykgeyByZXR1cm47IH0KLSAgZm9yICh2YXIg
aSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKLSAgICB2YXIgdGFyZ2V0
ID0gYWN0aW9uc1tpXSwKLSAgICAgICAgbWV0aG9kID0gYWN0aW9uc1tpKzFdLAotICAgICAgICBm
bGFncyA9IGFjdGlvbnNbaSsyXSwKLSAgICAgICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKG90aGVy
QWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0gICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkg
ewotICAgICAgb3RoZXJBY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdzKTsKLSAgICB9
Ci0gIH0KLX0KLQotZnVuY3Rpb24gYWN0aW9uc0RpZmYob2JqLCBldmVudE5hbWUsIG90aGVyQWN0
aW9ucykgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCi0gICAgICBhY3Rpb25zID0gbWV0
YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdLAotICAgICAg
ZGlmZkFjdGlvbnMgPSBbXTsKLQotICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gIGZvciAo
dmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7Ci0gICAgdmFyIHRh
cmdldCA9IGFjdGlvbnNbaV0sCi0gICAgICAgIG1ldGhvZCA9IGFjdGlvbnNbaSsxXSwKLSAgICAg
ICAgZmxhZ3MgPSBhY3Rpb25zW2krMl0sCi0gICAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhPZihv
dGhlckFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKLQotICAgIGlmIChhY3Rpb25JbmRleCAhPT0g
LTEpIHsgY29udGludWU7IH0KLQotICAgIG90aGVyQWN0aW9ucy5wdXNoKHRhcmdldCwgbWV0aG9k
LCBmbGFncyk7Ci0gICAgZGlmZkFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3MpOwot
ICB9Ci0KLSAgcmV0dXJuIGRpZmZBY3Rpb25zOwotfQotCi0vKioKLSAgQWRkIGFuIGV2ZW50IGxp
c3RlbmVyCi0KLSAgQG1ldGhvZCBhZGRMaXN0ZW5lcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBv
YmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotICBAcGFyYW0ge09iamVjdHxGdW5jdGlv
bn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFt
IHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVu
Y3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCi0gIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBB
IGZsYWcgd2hldGhlciBhIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCi0qLwot
ZnVuY3Rpb24gYWRkTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBvbmNl
KSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBsZWFzdCBhbiBvYmplY3QgYW5k
IGV2ZW50IG5hbWUgdG8gRW1iZXIuYWRkTGlzdGVuZXIiLCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7
Ci0KLSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgewotICAg
IG1ldGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxsOwotICB9Ci0KLSAgdmFyIGFjdGlv
bnMgPSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgIGFjdGlvbkluZGV4ID0gaW5k
ZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCksCi0gICAgICBmbGFncyA9IDA7Ci0KLSAgaWYg
KG9uY2UpIGZsYWdzIHw9IE9OQ0U7Ci0KLSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkgeyByZXR1
cm47IH0KLQotICBhY3Rpb25zLnB1c2godGFyZ2V0LCBtZXRob2QsIGZsYWdzKTsKLQotICBpZiAo
J2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5kaWRBZGRMaXN0ZW5lcikgewotICAgIG9iai5kaWRB
ZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKLSAgfQotfQotCi0vKioKLSAg
UmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyCi0KLSAgQXJndW1lbnRzIHNob3VsZCBtYXRjaCB0aG9z
ZSBwYXNzZWQgdG8gYEVtYmVyLmFkZExpc3RlbmVyYC4KLQotICBAbWV0aG9kIHJlbW92ZUxpc3Rl
bmVyCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBAcGFyYW0ge1N0cmluZ30gZXZlbnRO
YW1lCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZCBBIHRhcmdldCBv
YmplY3Qgb3IgYSBmdW5jdGlvbgotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEg
ZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdl
dGAKLSovCi1mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihvYmosIGV2ZW50TmFtZSwgdGFyZ2V0LCBt
ZXRob2QpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGF0IGxlYXN0IGFuIG9iamVj
dCBhbmQgZXZlbnQgbmFtZSB0byBFbWJlci5yZW1vdmVMaXN0ZW5lciIsICEhb2JqICYmICEhZXZl
bnROYW1lKTsKLQotICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0
KSB7Ci0gICAgbWV0aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICBm
dW5jdGlvbiBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpIHsKLSAgICB2YXIgYWN0aW9u
cyA9IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpLAotICAgICAgICBhY3Rpb25JbmRleCA9IGlu
ZGV4T2YoYWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpOwotCi0gICAgLy8gYWN0aW9uIGRvZXNuJ3Qg
ZXhpc3QsIGdpdmUgdXAgc2lsZW50bHkKLSAgICBpZiAoYWN0aW9uSW5kZXggPT09IC0xKSB7IHJl
dHVybjsgfQotCi0gICAgYWN0aW9ucy5zcGxpY2UoYWN0aW9uSW5kZXgsIDMpOwotCi0gICAgaWYg
KCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkUmVtb3ZlTGlzdGVuZXIpIHsKLSAgICAgIG9i
ai5kaWRSZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKLSAgICB9Ci0g
IH0KLQotICBpZiAobWV0aG9kKSB7Ci0gICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9k
KTsKLSAgfSBlbHNlIHsKLSAgICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sCi0gICAgICAgIGFj
dGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFt
ZV07Ci0KLSAgICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9Ci0gICAgZm9yICh2YXIgaSA9IGFj
dGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKLSAgICAgIF9yZW1vdmVMaXN0ZW5l
cihhY3Rpb25zW2ldLCBhY3Rpb25zW2krMV0pOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAgU3Vz
cGVuZCBsaXN0ZW5lciBkdXJpbmcgY2FsbGJhY2suCi0KLSAgVGhpcyBzaG91bGQgb25seSBiZSB1
c2VkIGJ5IHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCi0gIHdoZW4gaXQgaXMgdGFr
aW5nIGFuIGFjdGlvbiB0aGF0IHdvdWxkIGNhdXNlIHRoZSBldmVudCwgZS5nLgotICBhbiBvYmpl
Y3QgbWlnaHQgc3VzcGVuZCBpdHMgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHdoaWxlIGl0IGlz
Ci0gIHNldHRpbmcgdGhhdCBwcm9wZXJ0eS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1c3Bl
bmRMaXN0ZW5lcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0
YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1l
dGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9u
IGB0YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0qLwotZnVuY3Rpb24gc3Vz
cGVuZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsK
LSAgaWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkgewotICAgIG1l
dGhvZCA9IHRhcmdldDsKLSAgICB0YXJnZXQgPSBudWxsOwotICB9Ci0KLSAgdmFyIGFjdGlvbnMg
PSBhY3Rpb25zRm9yKG9iaiwgZXZlbnROYW1lKSwKLSAgICAgIGFjdGlvbkluZGV4ID0gaW5kZXhP
ZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgaWYgKGFjdGlvbkluZGV4ICE9PSAtMSkg
ewotICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gfD0gU1VTUEVOREVEOyAvLyBtYXJrIHRoZSBh
Y3Rpb24gYXMgc3VzcGVuZGVkCi0gIH0KLQotICBmdW5jdGlvbiB0cnlhYmxlKCkgICB7IHJldHVy
biBjYWxsYmFjay5jYWxsKHRhcmdldCk7IH0KLSAgZnVuY3Rpb24gZmluYWxpemVyKCkgeyBpZiAo
YWN0aW9uSW5kZXggIT09IC0xKSB7IGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRF
RDsgfSB9Ci0KLSAgcmV0dXJuIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsK
LX0KLQotLyoqCi0gIFN1c3BlbmRzIG11bHRpcGxlIGxpc3RlbmVycyBkdXJpbmcgYSBjYWxsYmFj
ay4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHN1c3BlbmRMaXN0ZW5lcnMKLSAgQGZvciBFbWJl
cgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7QXJyYXl9IGV2ZW50TmFtZSBBcnJheSBvZiBldmVu
dCBuYW1lcwotICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJn
ZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhv
ZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGB0
YXJnZXRgCi0gIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCi0qLwotZnVuY3Rpb24gc3VzcGVu
ZExpc3RlbmVycyhvYmosIGV2ZW50TmFtZXMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewot
ICBpZiAoIW1ldGhvZCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7Ci0gICAgbWV0
aG9kID0gdGFyZ2V0OwotICAgIHRhcmdldCA9IG51bGw7Ci0gIH0KLQotICB2YXIgc3VzcGVuZGVk
QWN0aW9ucyA9IFtdLAotICAgICAgYWN0aW9uc0xpc3QgPSBbXSwKLSAgICAgIGV2ZW50TmFtZSwg
YWN0aW9ucywgaSwgbDsKLQotICBmb3IgKGk9MCwgbD1ldmVudE5hbWVzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICBldmVudE5hbWUgPSBldmVudE5hbWVzW2ldOwotICAgIGFjdGlvbnMgPSBhY3Rp
b25zRm9yKG9iaiwgZXZlbnROYW1lKTsKLSAgICB2YXIgYWN0aW9uSW5kZXggPSBpbmRleE9mKGFj
dGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKLQotICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsK
LSAgICAgIGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gfD0gU1VTUEVOREVEOwotICAgICAgc3VzcGVu
ZGVkQWN0aW9ucy5wdXNoKGFjdGlvbkluZGV4KTsKLSAgICAgIGFjdGlvbnNMaXN0LnB1c2goYWN0
aW9ucyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gdHJ5YWJsZSgpIHsgcmV0dXJuIGNhbGxi
YWNrLmNhbGwodGFyZ2V0KTsgfQotCi0gIGZ1bmN0aW9uIGZpbmFsaXplcigpIHsKLSAgICBmb3Ig
KHZhciBpID0gMCwgbCA9IHN1c3BlbmRlZEFjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0g
ICAgICB2YXIgYWN0aW9uSW5kZXggPSBzdXNwZW5kZWRBY3Rpb25zW2ldOwotICAgICAgYWN0aW9u
c0xpc3RbaV1bYWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRFRDsKLSAgICB9Ci0gIH0KLQotICBy
ZXR1cm4gRW1iZXIudHJ5RmluYWxseSh0cnlhYmxlLCBmaW5hbGl6ZXIpOwotfQotCi0vKioKLSAg
UmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50bHkgd2F0Y2hlZCBldmVudHMKLQotICBAcHJpdmF0ZQot
ICBAbWV0aG9kIHdhdGNoZWRFdmVudHMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gb2JqCi0qLwot
ZnVuY3Rpb24gd2F0Y2hlZEV2ZW50cyhvYmopIHsKLSAgdmFyIGxpc3RlbmVycyA9IG9ialtNRVRB
X0tFWV0ubGlzdGVuZXJzLCByZXQgPSBbXTsKLQotICBpZiAobGlzdGVuZXJzKSB7Ci0gICAgZm9y
KHZhciBldmVudE5hbWUgaW4gbGlzdGVuZXJzKSB7Ci0gICAgICBpZiAobGlzdGVuZXJzW2V2ZW50
TmFtZV0pIHsgcmV0LnB1c2goZXZlbnROYW1lKTsgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmV0
OwotfQotCi0vKioKLSAgU2VuZCBhbiBldmVudC4gVGhlIGV4ZWN1dGlvbiBvZiBzdXNwZW5kZWQg
bGlzdGVuZXJzCi0gIGlzIHNraXBwZWQsIGFuZCBvbmNlIGxpc3RlbmVycyBhcmUgcmVtb3ZlZC4g
QSBsaXN0ZW5lciB3aXRob3V0Ci0gIGEgdGFyZ2V0IGlzIGV4ZWN1dGVkIG9uIHRoZSBwYXNzZWQg
b2JqZWN0LiBJZiBhbiBhcnJheSBvZiBhY3Rpb25zCi0gIGlzIG5vdCBwYXNzZWQsIHRoZSBhY3Rp
b25zIHN0b3JlZCBvbiB0aGUgcGFzc2VkIG9iamVjdCBhcmUgaW52b2tlZC4KLQotICBAbWV0aG9k
IHNlbmRFdmVudAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9
IGV2ZW50TmFtZQotICBAcGFyYW0ge0FycmF5fSBwYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBm
b3IgZWFjaCBsaXN0ZW5lci4KLSAgQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBPcHRpb25hbCBhcnJh
eSBvZiBhY3Rpb25zIChsaXN0ZW5lcnMpLgotICBAcmV0dXJuIHRydWUKLSovCi1mdW5jdGlvbiBz
ZW5kRXZlbnQob2JqLCBldmVudE5hbWUsIHBhcmFtcywgYWN0aW9ucykgewotICAvLyBmaXJzdCBn
aXZlIG9iamVjdCBhIGNoYW5jZSB0byBoYW5kbGUgaXQKLSAgaWYgKG9iaiAhPT0gRW1iZXIgJiYg
J2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5zZW5kRXZlbnQpIHsKLSAgICBvYmouc2VuZEV2ZW50
KGV2ZW50TmFtZSwgcGFyYW1zKTsKLSAgfQotCi0gIGlmICghYWN0aW9ucykgewotICAgIHZhciBt
ZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgICBhY3Rpb25zID0gbWV0YSAmJiBtZXRhLmxpc3RlbmVy
cyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwotICB9Ci0KLSAgaWYgKCFhY3Rpb25zKSB7
IHJldHVybjsgfQotCi0gIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsg
aSAtPSAzKSB7IC8vIGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBsaXN0ZW5lcnMKLSAgICB2
YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXSwgbWV0aG9kID0gYWN0aW9uc1tpKzFdLCBmbGFncyA9IGFj
dGlvbnNbaSsyXTsKLSAgICBpZiAoIW1ldGhvZCkgeyBjb250aW51ZTsgfQotICAgIGlmIChmbGFn
cyAmIFNVU1BFTkRFRCkgeyBjb250aW51ZTsgfQotICAgIGlmIChmbGFncyAmIE9OQ0UpIHsgcmVt
b3ZlTGlzdGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsgfQotICAgIGlmICgh
dGFyZ2V0KSB7IHRhcmdldCA9IG9iajsgfQotICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1l
dGhvZCkgeyBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsgfQotICAgIGlmIChwYXJhbXMpIHsKLSAg
ICAgIG1ldGhvZC5hcHBseSh0YXJnZXQsIHBhcmFtcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1l
dGhvZC5jYWxsKHRhcmdldCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioK
LSAgQHByaXZhdGUKLSAgQG1ldGhvZCBoYXNMaXN0ZW5lcnMKLSAgQGZvciBFbWJlcgotICBAcGFy
YW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUKLSovCi1mdW5jdGlvbiBoYXNMaXN0
ZW5lcnMob2JqLCBldmVudE5hbWUpIHsKLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAotICAg
ICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0YS5saXN0ZW5lcnNbZXZl
bnROYW1lXTsKLQotICByZXR1cm4gISEoYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCk7Ci19Ci0K
LS8qKgotICBAcHJpdmF0ZQotICBAbWV0aG9kIGxpc3RlbmVyc0ZvcgotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSBvYmoKLSAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZQotKi8KLWZ1bmN0aW9uIGxp
c3RlbmVyc0ZvcihvYmosIGV2ZW50TmFtZSkgewotICB2YXIgcmV0ID0gW107Ci0gIHZhciBtZXRh
ID0gb2JqW01FVEFfS0VZXSwKLSAgICAgIGFjdGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJz
ICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07Ci0KLSAgaWYgKCFhY3Rpb25zKSB7IHJldHVy
biByZXQ7IH0KLQotICBmb3IgKHZhciBpID0gMCwgbCA9IGFjdGlvbnMubGVuZ3RoOyBpIDwgbDsg
aSArPSAzKSB7Ci0gICAgdmFyIHRhcmdldCA9IGFjdGlvbnNbaV0sCi0gICAgICAgIG1ldGhvZCA9
IGFjdGlvbnNbaSsxXTsKLSAgICByZXQucHVzaChbdGFyZ2V0LCBtZXRob2RdKTsKLSAgfQotCi0g
IHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBEZWZpbmUgYSBwcm9wZXJ0eSBhcyBhIGZ1bmN0aW9u
IHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4KLSAgYSBzcGVjaWZpZWQgZXZlbnQgb3IgZXZl
bnRzIGFyZSB0cmlnZ2VyZWQuCi0KLQotICBgYGAgamF2YXNjcmlwdAotICB2YXIgSm9iID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbG9nQ29tcGxldGVkOiBFbWJlci5vbignY29tcGxldGVk
JywgZnVuY3Rpb24oKXsKLSAgICAgIGNvbnNvbGUubG9nKCdKb2IgY29tcGxldGVkIScpOwotICAg
IH0pCi0gIH0pOwotICB2YXIgam9iID0gSm9iLmNyZWF0ZSgpOwotICBFbWJlci5zZW5kRXZlbnQo
am9iLCAnY29tcGxldGVkJyk7IC8vIExvZ3MgIkpvYiBjb21wbGV0ZWQhIgotIGBgYAotCi0gIEBt
ZXRob2Qgb24KLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lcyoKLSAg
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0dXJuIGZ1bmMKLSovCi1FbWJlci5vbiA9IGZ1
bmN0aW9uKCl7Ci0gIHZhciBmdW5jID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAot
ICAgICAgZXZlbnRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpOwotICBmdW5jLl9f
ZW1iZXJfbGlzdGVuc19fID0gZXZlbnRzOwotICByZXR1cm4gZnVuYzsKLX07Ci0KLUVtYmVyLmFk
ZExpc3RlbmVyID0gYWRkTGlzdGVuZXI7Ci1FbWJlci5yZW1vdmVMaXN0ZW5lciA9IHJlbW92ZUxp
c3RlbmVyOwotRW1iZXIuX3N1c3BlbmRMaXN0ZW5lciA9IHN1c3BlbmRMaXN0ZW5lcjsKLUVtYmVy
Ll9zdXNwZW5kTGlzdGVuZXJzID0gc3VzcGVuZExpc3RlbmVyczsKLUVtYmVyLnNlbmRFdmVudCA9
IHNlbmRFdmVudDsKLUVtYmVyLmhhc0xpc3RlbmVycyA9IGhhc0xpc3RlbmVyczsKLUVtYmVyLndh
dGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRzOwotRW1iZXIubGlzdGVuZXJzRm9yID0gbGlzdGVu
ZXJzRm9yOwotRW1iZXIubGlzdGVuZXJzRGlmZiA9IGFjdGlvbnNEaWZmOwotRW1iZXIubGlzdGVu
ZXJzVW5pb24gPSBhY3Rpb25zVW5pb247Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci12
YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2
ZW50OwotCi0vKgotICB0aGlzLm9ic2VydmVyU2V0ID0gewotICAgIFtzZW5kZXJHdWlkXTogeyAv
LyB2YXJpYWJsZSBuYW1lOiBga2V5U2V0YAotICAgICAgW2tleU5hbWVdOiBsaXN0SW5kZXgKLSAg
ICB9Ci0gIH0sCi0gIHRoaXMub2JzZXJ2ZXJzID0gWwotICAgIHsKLSAgICAgIHNlbmRlcjogb2Jq
LAotICAgICAga2V5TmFtZToga2V5TmFtZSwKLSAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAot
ICAgICAgbGlzdGVuZXJzOiBbCi0gICAgICAgIFt0YXJnZXQsIG1ldGhvZCwgZmxhZ3NdCi0gICAg
ICBdCi0gICAgfSwKLSAgICAuLi4KLSAgXQotKi8KLXZhciBPYnNlcnZlclNldCA9IEVtYmVyLl9P
YnNlcnZlclNldCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmNsZWFyKCk7Ci19OwotCi1PYnNlcnZl
clNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oc2VuZGVyLCBrZXlOYW1lLCBldmVudE5hbWUp
IHsKLSAgdmFyIG9ic2VydmVyU2V0ID0gdGhpcy5vYnNlcnZlclNldCwKLSAgICAgIG9ic2VydmVy
cyA9IHRoaXMub2JzZXJ2ZXJzLAotICAgICAgc2VuZGVyR3VpZCA9IGd1aWRGb3Ioc2VuZGVyKSwK
LSAgICAgIGtleVNldCA9IG9ic2VydmVyU2V0W3NlbmRlckd1aWRdLAotICAgICAgaW5kZXg7Ci0K
LSAgaWYgKCFrZXlTZXQpIHsKLSAgICBvYnNlcnZlclNldFtzZW5kZXJHdWlkXSA9IGtleVNldCA9
IHt9OwotICB9Ci0gIGluZGV4ID0ga2V5U2V0W2tleU5hbWVdOwotICBpZiAoaW5kZXggPT09IHVu
ZGVmaW5lZCkgewotICAgIGluZGV4ID0gb2JzZXJ2ZXJzLnB1c2goewotICAgICAgc2VuZGVyOiBz
ZW5kZXIsCi0gICAgICBrZXlOYW1lOiBrZXlOYW1lLAotICAgICAgZXZlbnROYW1lOiBldmVudE5h
bWUsCi0gICAgICBsaXN0ZW5lcnM6IFtdCi0gICAgfSkgLSAxOwotICAgIGtleVNldFtrZXlOYW1l
XSA9IGluZGV4OwotICB9Ci0gIHJldHVybiBvYnNlcnZlcnNbaW5kZXhdLmxpc3RlbmVyczsKLX07
Ci0KLU9ic2VydmVyU2V0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICB2YXIgb2Jz
ZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnMsIGksIGxlbiwgb2JzZXJ2ZXIsIHNlbmRlcjsKLSAgdGhp
cy5jbGVhcigpOwotICBmb3IgKGk9MCwgbGVuPW9ic2VydmVycy5sZW5ndGg7IGkgPCBsZW47ICsr
aSkgewotICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJzW2ldOwotICAgIHNlbmRlciA9IG9ic2VydmVy
LnNlbmRlcjsKLSAgICBpZiAoc2VuZGVyLmlzRGVzdHJveWluZyB8fCBzZW5kZXIuaXNEZXN0cm95
ZWQpIHsgY29udGludWU7IH0KLSAgICBzZW5kRXZlbnQoc2VuZGVyLCBvYnNlcnZlci5ldmVudE5h
bWUsIFtzZW5kZXIsIG9ic2VydmVyLmtleU5hbWVdLCBvYnNlcnZlci5saXN0ZW5lcnMpOwotICB9
Ci19OwotCi1PYnNlcnZlclNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKLSAgdGhp
cy5vYnNlcnZlclNldCA9IHt9OwotICB0aGlzLm9ic2VydmVycyA9IFtdOwotfTsKLX0pKCk7Ci0K
LQotCi0oZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgZ3VpZEZv
ciA9IEVtYmVyLmd1aWRGb3IsCi0gICAgdHJ5RmluYWxseSA9IEVtYmVyLnRyeUZpbmFsbHksCi0g
ICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50LAotICAgIGxpc3RlbmVyc1VuaW9uID0gRW1i
ZXIubGlzdGVuZXJzVW5pb24sCi0gICAgbGlzdGVuZXJzRGlmZiA9IEVtYmVyLmxpc3RlbmVyc0Rp
ZmYsCi0gICAgT2JzZXJ2ZXJTZXQgPSBFbWJlci5fT2JzZXJ2ZXJTZXQsCi0gICAgYmVmb3JlT2Jz
ZXJ2ZXJTZXQgPSBuZXcgT2JzZXJ2ZXJTZXQoKSwKLSAgICBvYnNlcnZlclNldCA9IG5ldyBPYnNl
cnZlclNldCgpLAotICAgIGRlZmVycmVkID0gMDsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gUFJPUEVSVFkgQ0hBTkdF
UwotLy8KLQotLyoqCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGFuIG9i
amVjdCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UuCi0gIEl0IHdpbGwgbm90aWZ5IGFueSBi
ZWZvcmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJlIGNhY2hlcyBhbW9uZyBvdGhlciB0aGluZ3MuCi0K
LSAgTm9ybWFsbHkgeW91IHdpbGwgbm90IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3Rs
eSBidXQgaWYgZm9yIHNvbWUKLSAgcmVhc29uIHlvdSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHBy
b3BlcnR5IHlvdSBjYW4gaW52b2tlIHRoaXMgbWV0aG9kCi0gIG1hbnVhbGx5IGFsb25nIHdpdGgg
YEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKClgIHdoaWNoIHlvdSBzaG91bGQgY2FsbCBqdXN0Ci0g
IGFmdGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzLgotCi0gIEBtZXRob2QgcHJvcGVydHlX
aWxsQ2hhbmdlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0
IHdpdGggdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtl
eU5hbWUgVGhlIHByb3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJl
dHVybiB7dm9pZH0KLSovCi1mdW5jdGlvbiBwcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1l
KSB7Ci0gIHZhciBtID0gbWV0YUZvcihvYmosIGZhbHNlKSwKLSAgICAgIHdhdGNoaW5nID0gbS53
YXRjaGluZ1trZXlOYW1lXSA+IDAgfHwga2V5TmFtZSA9PT0gJ2xlbmd0aCcsCi0gICAgICBwcm90
byA9IG0ucHJvdG8sCi0gICAgICBkZXNjID0gbS5kZXNjc1trZXlOYW1lXTsKLQotICBpZiAoIXdh
dGNoaW5nKSB7IHJldHVybjsgfQotICBpZiAocHJvdG8gPT09IG9iaikgeyByZXR1cm47IH0KLSAg
aWYgKGRlc2MgJiYgZGVzYy53aWxsQ2hhbmdlKSB7IGRlc2Mud2lsbENoYW5nZShvYmosIGtleU5h
bWUpOyB9Ci0gIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSk7Ci0gIGNo
YWluc1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKLSAgbm90aWZ5QmVmb3JlT2JzZXJ2ZXJz
KG9iaiwga2V5TmFtZSk7Ci19Ci1FbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UgPSBwcm9wZXJ0eVdp
bGxDaGFuZ2U7Ci0KLS8qKgotICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFu
IG9iamVjdCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAgSXQgd2lsbCBub3RpZnkgYW55IG9ic2Vy
dmVycyBhbmQgY2xlYXIgY2FjaGVzIGFtb25nIG90aGVyIHRoaW5ncy4KLQotICBOb3JtYWxseSB5
b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGJ1dCBpZiBmb3Ig
c29tZQotICByZWFzb24geW91IGNhbid0IGRpcmVjdGx5IHdhdGNoIGEgcHJvcGVydHkgeW91IGNh
biBpbnZva2UgdGhpcyBtZXRob2QKLSAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1iZXIucHJvcGVy
dHlXaWxsQ2hhbmdlKClgIHdoaWNoIHlvdSBzaG91bGQgY2FsbCBqdXN0Ci0gIGJlZm9yZSB0aGUg
cHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KLQotICBAbWV0aG9kIHByb3BlcnR5RGlkQ2hhbmdlCi0g
IEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHBy
b3BlcnR5IHRoYXQgd2lsbCBjaGFuZ2UKLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHBy
b3BlcnR5IGtleSAob3IgcGF0aCkgdGhhdCB3aWxsIGNoYW5nZS4KLSAgQHJldHVybiB7dm9pZH0K
LSovCi1mdW5jdGlvbiBwcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpIHsKLSAgdmFyIG0g
PSBtZXRhRm9yKG9iaiwgZmFsc2UpLAotICAgICAgd2F0Y2hpbmcgPSBtLndhdGNoaW5nW2tleU5h
bWVdID4gMCB8fCBrZXlOYW1lID09PSAnbGVuZ3RoJywKLSAgICAgIHByb3RvID0gbS5wcm90bywK
LSAgICAgIGRlc2MgPSBtLmRlc2NzW2tleU5hbWVdOwotCi0gIGlmIChwcm90byA9PT0gb2JqKSB7
IHJldHVybjsgfQotCi0gIC8vIHNob3VsZG4ndCB0aGlzIG1lYW4gdGhhdCB3ZSdyZSB3YXRjaGlu
ZyB0aGlzIGtleT8KLSAgaWYgKGRlc2MgJiYgZGVzYy5kaWRDaGFuZ2UpIHsgZGVzYy5kaWRDaGFu
Z2Uob2JqLCBrZXlOYW1lKTsgfQotICBpZiAoIXdhdGNoaW5nICYmIGtleU5hbWUgIT09ICdsZW5n
dGgnKSB7IHJldHVybjsgfQotCi0gIGRlcGVuZGVudEtleXNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1l
LCBtKTsKLSAgY2hhaW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSwgZmFsc2UpOwotICBub3Rp
ZnlPYnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKLX0KLUVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlID0g
cHJvcGVydHlEaWRDaGFuZ2U7Ci0KLXZhciBXSUxMX1NFRU4sIERJRF9TRUVOOwotCi0vLyBjYWxs
ZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UgdG8gY2xlYXIgdGhlIGNh
Y2hlIG9mIGFueSBkZXBlbmRlbnQga2V5cyAoYW5kIG5vdGlmeSB0aG9zZSBwcm9wZXJ0aWVzIG9m
IGNoYW5nZXMsIGV0Yy4uLikKLWZ1bmN0aW9uIGRlcGVuZGVudEtleXNXaWxsQ2hhbmdlKG9iaiwg
ZGVwS2V5LCBtZXRhKSB7Ci0gIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQotCi0g
IHZhciBzZWVuID0gV0lMTF9TRUVOLCB0b3AgPSAhc2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0g
V0lMTF9TRUVOID0ge307IH0KLSAgaXRlckRlcHMocHJvcGVydHlXaWxsQ2hhbmdlLCBvYmosIGRl
cEtleSwgc2VlbiwgbWV0YSk7Ci0gIGlmICh0b3ApIHsgV0lMTF9TRUVOID0gbnVsbDsgfQotfQot
Ci0vLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0eSBoYXMganVzdCBjaGFuZ2VkIHRvIHVwZGF0
ZSBkZXBlbmRlbnQga2V5cwotZnVuY3Rpb24gZGVwZW5kZW50S2V5c0RpZENoYW5nZShvYmosIGRl
cEtleSwgbWV0YSkgewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICB2
YXIgc2VlbiA9IERJRF9TRUVOLCB0b3AgPSAhc2VlbjsKLSAgaWYgKHRvcCkgeyBzZWVuID0gRElE
X1NFRU4gPSB7fTsgfQotICBpdGVyRGVwcyhwcm9wZXJ0eURpZENoYW5nZSwgb2JqLCBkZXBLZXks
IHNlZW4sIG1ldGEpOwotICBpZiAodG9wKSB7IERJRF9TRUVOID0gbnVsbDsgfQotfQotCi1mdW5j
dGlvbiBpdGVyRGVwcyhtZXRob2QsIG9iaiwgZGVwS2V5LCBzZWVuLCBtZXRhKSB7Ci0gIHZhciBn
dWlkID0gZ3VpZEZvcihvYmopOwotICBpZiAoIXNlZW5bZ3VpZF0pIHNlZW5bZ3VpZF0gPSB7fTsK
LSAgaWYgKHNlZW5bZ3VpZF1bZGVwS2V5XSkgcmV0dXJuOwotICBzZWVuW2d1aWRdW2RlcEtleV0g
PSB0cnVlOwotCi0gIHZhciBkZXBzID0gbWV0YS5kZXBzOwotICBkZXBzID0gZGVwcyAmJiBkZXBz
W2RlcEtleV07Ci0gIGlmIChkZXBzKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gZGVwcykgewotICAg
ICAgdmFyIGRlc2MgPSBtZXRhLmRlc2NzW2tleV07Ci0gICAgICBpZiAoZGVzYyAmJiBkZXNjLl9z
dXNwZW5kZWQgPT09IG9iaikgY29udGludWU7Ci0gICAgICBtZXRob2Qob2JqLCBrZXkpOwotICAg
IH0KLSAgfQotfQotCi1mdW5jdGlvbiBjaGFpbnNXaWxsQ2hhbmdlKG9iaiwga2V5TmFtZSwgbSkg
ewotICBpZiAoIShtLmhhc093blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYKLSAgICAgICAg
bS5jaGFpbldhdGNoZXJzW2tleU5hbWVdKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBu
b2RlcyA9IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1lXSwKLSAgICAgIGV2ZW50cyA9IFtdLAotICAg
ICAgaSwgbDsKLQotICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsK
LSAgICBub2Rlc1tpXS53aWxsQ2hhbmdlKGV2ZW50cyk7Ci0gIH0KLQotICBmb3IgKGkgPSAwLCBs
ID0gZXZlbnRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewotICAgIHByb3BlcnR5V2lsbENoYW5n
ZShldmVudHNbaV0sIGV2ZW50c1tpKzFdKTsKLSAgfQotfQotCi1mdW5jdGlvbiBjaGFpbnNEaWRD
aGFuZ2Uob2JqLCBrZXlOYW1lLCBtLCBzdXBwcmVzc0V2ZW50cykgewotICBpZiAoIShtLmhhc093
blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYKLSAgICAgICAgbS5jaGFpbldhdGNoZXJzW2tl
eU5hbWVdKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRj
aGVyc1trZXlOYW1lXSwKLSAgICAgIGV2ZW50cyA9IHN1cHByZXNzRXZlbnRzID8gbnVsbCA6IFtd
LAotICAgICAgaSwgbDsKLQotICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBp
KyspIHsKLSAgICBub2Rlc1tpXS5kaWRDaGFuZ2UoZXZlbnRzKTsKLSAgfQotCi0gIGlmIChzdXBw
cmVzc0V2ZW50cykgewotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoaSA9IDAsIGwgPSBldmVu
dHMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Ci0gICAgcHJvcGVydHlEaWRDaGFuZ2UoZXZlbnRz
W2ldLCBldmVudHNbaSsxXSk7Ci0gIH0KLX0KLQotRW1iZXIub3ZlcnJpZGVDaGFpbnMgPSBmdW5j
dGlvbihvYmosIGtleU5hbWUsIG0pIHsKLSAgY2hhaW5zRGlkQ2hhbmdlKG9iaiwga2V5TmFtZSwg
bSwgdHJ1ZSk7Ci19OwotCi0vKioKLSAgQG1ldGhvZCBiZWdpblByb3BlcnR5Q2hhbmdlcwotICBA
Y2hhaW5hYmxlCi0gIEBwcml2YXRlCi0qLwotZnVuY3Rpb24gYmVnaW5Qcm9wZXJ0eUNoYW5nZXMo
KSB7Ci0gIGRlZmVycmVkKys7Ci19Ci0KLUVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzID0gYmVn
aW5Qcm9wZXJ0eUNoYW5nZXM7Ci0KLS8qKgotICBAbWV0aG9kIGVuZFByb3BlcnR5Q2hhbmdlcwot
ICBAcHJpdmF0ZQotKi8KLWZ1bmN0aW9uIGVuZFByb3BlcnR5Q2hhbmdlcygpIHsKLSAgZGVmZXJy
ZWQtLTsKLSAgaWYgKGRlZmVycmVkPD0wKSB7Ci0gICAgYmVmb3JlT2JzZXJ2ZXJTZXQuY2xlYXIo
KTsKLSAgICBvYnNlcnZlclNldC5mbHVzaCgpOwotICB9Ci19Ci0KLUVtYmVyLmVuZFByb3BlcnR5
Q2hhbmdlcyA9IGVuZFByb3BlcnR5Q2hhbmdlczsKLQotLyoqCi0gIE1ha2UgYSBzZXJpZXMgb2Yg
cHJvcGVydHkgY2hhbmdlcyB0b2dldGhlciBpbiBhbgotICBleGNlcHRpb24tc2FmZSB3YXkuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgewot
ICAgIG9iajEuc2V0KCdmb28nLCBtYXlCbG93VXBXaGVuU2V0KTsKLSAgICBvYmoyLnNldCgnYmFy
JywgYmF6KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRob2QgY2hhbmdlUHJvcGVydGllcwotICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBAcGFyYW0gW2JpbmRpbmddCi0qLwotRW1iZXIu
Y2hhbmdlUHJvcGVydGllcyA9IGZ1bmN0aW9uKGNiLCBiaW5kaW5nKSB7Ci0gIGJlZ2luUHJvcGVy
dHlDaGFuZ2VzKCk7Ci0gIHRyeUZpbmFsbHkoY2IsIGVuZFByb3BlcnR5Q2hhbmdlcywgYmluZGlu
Zyk7Ci19OwotCi1mdW5jdGlvbiBub3RpZnlCZWZvcmVPYnNlcnZlcnMob2JqLCBrZXlOYW1lKSB7
Ci0gIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQotCi0gIHZhciBldmVudE5hbWUg
PSBrZXlOYW1lICsgJzpiZWZvcmUnLCBsaXN0ZW5lcnMsIGRpZmY7Ci0gIGlmIChkZWZlcnJlZCkg
ewotICAgIGxpc3RlbmVycyA9IGJlZm9yZU9ic2VydmVyU2V0LmFkZChvYmosIGtleU5hbWUsIGV2
ZW50TmFtZSk7Ci0gICAgZGlmZiA9IGxpc3RlbmVyc0RpZmYob2JqLCBldmVudE5hbWUsIGxpc3Rl
bmVycyk7Ci0gICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlOYW1lXSwgZGlm
Zik7Ci0gIH0gZWxzZSB7Ci0gICAgc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1lLCBbb2JqLCBrZXlO
YW1lXSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSkg
ewotICBpZiAob2JqLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICB2YXIgZXZlbnROYW1l
ID0ga2V5TmFtZSArICc6Y2hhbmdlJywgbGlzdGVuZXJzOwotICBpZiAoZGVmZXJyZWQpIHsKLSAg
ICBsaXN0ZW5lcnMgPSBvYnNlcnZlclNldC5hZGQob2JqLCBrZXlOYW1lLCBldmVudE5hbWUpOwot
ICAgIGxpc3RlbmVyc1VuaW9uKG9iaiwgZXZlbnROYW1lLCBsaXN0ZW5lcnMpOwotICB9IGVsc2Ug
ewotICAgIHNlbmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFtZV0pOwotICB9Ci19
Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vLyBNRVRBX0tFWQotLy8gX2dldFBhdGgK
LS8vIHByb3BlcnR5V2lsbENoYW5nZSwgcHJvcGVydHlEaWRDaGFuZ2UKLQotdmFyIE1FVEFfS0VZ
ID0gRW1iZXIuTUVUQV9LRVksCi0gICAgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5NQU5E
QVRPUllfU0VUVEVSLAotICAgIElTX0dMT0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS8s
Ci0gICAgZ2V0UGF0aCA9IEVtYmVyLl9nZXRQYXRoOwotCi0vKioKLSAgU2V0cyB0aGUgdmFsdWUg
b2YgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QsIHJlc3BlY3RpbmcgY29tcHV0ZWQgcHJvcGVydGll
cwotICBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyBhbmQgb3RoZXIgbGlzdGVuZXJzIG9mIHRoZSBj
aGFuZ2UuIElmIHRoZQotICBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBidXQgdGhlIG9iamVjdCBp
bXBsZW1lbnRzIHRoZSBgc2V0VW5rbm93blByb3BlcnR5YAotICBtZXRob2QgdGhlbiB0aGF0IHdp
bGwgYmUgaW52b2tlZCBhcyB3ZWxsLgotCi0gIElmIHlvdSBwbGFuIHRvIHJ1biBvbiBJRTggYW5k
IG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcwotICBtZXRob2QgYW55dGlt
ZSB5b3Ugd2FudCB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QgdGhhdCB5b3UgZG9uJ3QK
LSAga25vdyBmb3Igc3VyZSBpcyBwcml2YXRlLiAoUHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBh
biB1bmRlcnNjb3JlICdfJwotICBhcmUgY29uc2lkZXJlZCBwcml2YXRlLikKLQotICBPbiBhbGwg
bmV3ZXIgYnJvd3NlcnMsIHlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgbWV0aG9kIHRvIHNldAot
ICBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBtaWdodCBub3QgYmUgZGVmaW5lZCBvbiB0aGUg
b2JqZWN0IGFuZCB5b3Ugd2FudAotICB0byByZXNwZWN0IHRoZSBgc2V0VW5rbm93blByb3BlcnR5
YCBoYW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcwotICBtZXRob2QuCi0KLSAg
QG1ldGhvZCBzZXQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmpl
Y3QgdG8gbW9kaWZ5LgotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkga2V5
IHRvIHNldAotICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICBAcmV0
dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgdmFsdWUuCi0qLwotdmFyIHNldCA9IGZ1bmN0aW9uIHNl
dChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFudCkgewotICBpZiAodHlwZW9mIG9iaiA9PT0g
J3N0cmluZycpIHsKLSAgICBFbWJlci5hc3NlcnQoIlBhdGggJyIgKyBvYmogKyAiJyBtdXN0IGJl
IGdsb2JhbCBpZiBubyBvYmogaXMgZ2l2ZW4uIiwgSVNfR0xPQkFMLnRlc3Qob2JqKSk7Ci0gICAg
dmFsdWUgPSBrZXlOYW1lOwotICAgIGtleU5hbWUgPSBvYmo7Ci0gICAgb2JqID0gbnVsbDsKLSAg
fQotCi0gIEVtYmVyLmFzc2VydCgiQ2Fubm90IGNhbGwgc2V0IHdpdGggIisga2V5TmFtZSArIiBr
ZXkuIiwgISFrZXlOYW1lKTsKLQotICBpZiAoIW9iaiB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAh
PT0gLTEpIHsKLSAgICByZXR1cm4gc2V0UGF0aChvYmosIGtleU5hbWUsIHZhbHVlLCB0b2xlcmFu
dCk7Ci0gIH0KLQotICBFbWJlci5hc3NlcnQoIllvdSBuZWVkIHRvIHByb3ZpZGUgYW4gb2JqZWN0
IGFuZCBrZXkgdG8gYHNldGAuIiwgISFvYmogJiYga2V5TmFtZSAhPT0gdW5kZWZpbmVkKTsKLSAg
RW1iZXIuYXNzZXJ0KCdjYWxsaW5nIHNldCBvbiBkZXN0cm95ZWQgb2JqZWN0JywgIW9iai5pc0Rl
c3Ryb3llZCk7Ci0KLSAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLCBkZXNjID0gbWV0YSAmJiBt
ZXRhLmRlc2NzW2tleU5hbWVdLAotICAgICAgaXNVbmtub3duLCBjdXJyZW50VmFsdWU7Ci0gIGlm
IChkZXNjKSB7Ci0gICAgZGVzYy5zZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7
Ci0gICAgaXNVbmtub3duID0gJ29iamVjdCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGlu
IG9iaik7Ci0KLSAgICAvLyBzZXRVbmtub3duUHJvcGVydHkgaXMgY2FsbGVkIGlmIGBvYmpgIGlz
IGFuIG9iamVjdCwKLSAgICAvLyB0aGUgcHJvcGVydHkgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwg
YW5kIHRoZQotICAgIC8vIGBzZXRVbmtub3duUHJvcGVydHlgIG1ldGhvZCBleGlzdHMgb24gdGhl
IG9iamVjdAotICAgIGlmIChpc1Vua25vd24gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5z
ZXRVbmtub3duUHJvcGVydHkpIHsKLSAgICAgIG9iai5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFt
ZSwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAobWV0YSAmJiBtZXRhLndhdGNoaW5nW2tleU5hbWVd
ID4gMCkgewotICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgY3VycmVudFZh
bHVlID0gbWV0YS52YWx1ZXNba2V5TmFtZV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJy
ZW50VmFsdWUgPSBvYmpba2V5TmFtZV07Ci0gICAgICB9Ci0gICAgICAvLyBvbmx5IHRyaWdnZXIg
YSBjaGFuZ2UgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkCi0gICAgICBpZiAodmFsdWUgIT09IGN1
cnJlbnRWYWx1ZSkgewotICAgICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlO
YW1lKTsKLSAgICAgICAgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgICBpZiAoKGN1
cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5TmFtZSBpbiBvYmopKSB8fCAhb2JqLnBy
b3BlcnR5SXNFbnVtZXJhYmxlKGtleU5hbWUpKSB7Ci0gICAgICAgICAgICBFbWJlci5kZWZpbmVQ
cm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIHZhbHVlKTsgLy8gc2V0dXAgbWFuZGF0b3J5IHNl
dHRlcgotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRhLnZhbHVlc1trZXlOYW1l
XSA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvYmpb
a2V5TmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBFbWJlci5wcm9wZXJ0eURpZENo
YW5nZShvYmosIGtleU5hbWUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBvYmpba2V5
TmFtZV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfTsKLQotLy8gQ3Vy
cmVudGx5IHVzZWQgb25seSBieSBFbWJlciBEYXRhIHRlc3RzCi1pZiAoRW1iZXIuY29uZmlnLm92
ZXJyaWRlQWNjZXNzb3JzKSB7Ci0gIEVtYmVyLnNldCA9IHNldDsKLSAgRW1iZXIuY29uZmlnLm92
ZXJyaWRlQWNjZXNzb3JzKCk7Ci0gIHNldCA9IEVtYmVyLnNldDsKLX0KLQotZnVuY3Rpb24gc2V0
UGF0aChyb290LCBwYXRoLCB2YWx1ZSwgdG9sZXJhbnQpIHsKLSAgdmFyIGtleU5hbWU7Ci0KLSAg
Ly8gZ2V0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHBhdGgKLSAga2V5TmFtZSA9IHBhdGguc2xpY2Uo
cGF0aC5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0KLSAgLy8gZ2V0IHRoZSBmaXJzdCBwYXJ0IG9m
IHRoZSBwYXJ0Ci0gIHBhdGggICAgPSAocGF0aCA9PT0ga2V5TmFtZSkgPyBrZXlOYW1lIDogcGF0
aC5zbGljZSgwLCBwYXRoLmxlbmd0aC0oa2V5TmFtZS5sZW5ndGgrMSkpOwotCi0gIC8vIHVubGVz
cyB0aGUgcGF0aCBpcyB0aGlzLCBsb29rIHVwIHRoZSBmaXJzdCBwYXJ0IHRvCi0gIC8vIGdldCB0
aGUgcm9vdAotICBpZiAocGF0aCAhPT0gJ3RoaXMnKSB7Ci0gICAgcm9vdCA9IGdldFBhdGgocm9v
dCwgcGF0aCk7Ci0gIH0KLQotICBpZiAoIWtleU5hbWUgfHwga2V5TmFtZS5sZW5ndGggPT09IDAp
IHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1Byb3BlcnR5IHNldCBmYWlsZWQ6IFlvdSBw
YXNzZWQgYW4gZW1wdHkgcGF0aCcpOwotICB9Ci0KLSAgaWYgKCFyb290KSB7Ci0gICAgaWYgKHRv
bGVyYW50KSB7IHJldHVybjsgfQotICAgIGVsc2UgeyB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ1By
b3BlcnR5IHNldCBmYWlsZWQ6IG9iamVjdCBpbiBwYXRoICInK3BhdGgrJyIgY291bGQgbm90IGJl
IGZvdW5kIG9yIHdhcyBkZXN0cm95ZWQuJyk7IH0KLSAgfQotCi0gIHJldHVybiBzZXQocm9vdCwg
a2V5TmFtZSwgdmFsdWUpOwotfQotCi1FbWJlci5zZXQgPSBzZXQ7Ci0KLS8qKgotICBFcnJvci10
b2xlcmFudCBmb3JtIG9mIGBFbWJlci5zZXRgLiBXaWxsIG5vdCBibG93IHVwIGlmIGFueSBwYXJ0
IG9mIHRoZQotICBjaGFpbiBpcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBvciBkZXN0cm95ZWQuCi0K
LSAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB3aGVuIHN5bmNpbmcgYmluZGluZ3MsIHdoaWNoIG1h
eSB0cnkgdG8gdXBkYXRlIGFmdGVyCi0gIGFuIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCi0K
LSAgQG1ldGhvZCB0cnlTZXQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRo
ZSBvYmplY3QgdG8gbW9kaWZ5LgotICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkg
cGF0aCB0byBzZXQKLSAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSov
Ci1FbWJlci50cnlTZXQgPSBmdW5jdGlvbihyb290LCBwYXRoLCB2YWx1ZSkgewotICByZXR1cm4g
c2V0KHJvb3QsIHBhdGgsIHZhbHVlLCB0cnVlKTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLS8qCi0gIEphdmFTY3JpcHQg
KGJlZm9yZSBFUzYpIGRvZXMgbm90IGhhdmUgYSBNYXAgaW1wbGVtZW50YXRpb24uIE9iamVjdHMs
Ci0gIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGFzIGRpY3Rpb25hcmllcywgbWF5IG9ubHkgaGF2ZSBT
dHJpbmdzIGFzIGtleXMuCi0KLSAgQmVjYXVzZSBFbWJlciBoYXMgYSB3YXkgdG8gZ2V0IGEgdW5p
cXVlIGlkZW50aWZpZXIgZm9yIGV2ZXJ5IG9iamVjdAotICB2aWEgYEVtYmVyLmd1aWRGb3JgLCB3
ZSBjYW4gaW1wbGVtZW50IGEgcGVyZm9ybWFudCBNYXAgd2l0aCBhcmJpdHJhcnkKLSAga2V5cy4g
QmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIGluIGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFw
IGlzCi0gIGltcGxlbWVudGVkIGFzIGEgcHVyZSBKYXZhU2NyaXB0IG9iamVjdCBmb3IgcGVyZm9y
bWFuY2UuCi0KLSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50IGl0ZXJh
dGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgotICBtYXBzIChodHRwOi8vd2lraS5lY21hc2Ny
aXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OnNpbXBsZV9tYXBzX2FuZF9zZXRzKSwKLSAgd2l0
aCB0d28gZXhjZXB0aW9ucy4gRmlyc3QsIGJlY2F1c2Ugd2UgbmVlZCBvdXIgaW1wbGVtZW50YXRp
b24gdG8gYmUgcGxlYXNhbnQKLSAgb24gb2xkZXIgYnJvd3NlcnMsIHdlIGRvIG5vdCB1c2UgdGhl
IGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVgIGluc3RlYWQpLgotICBTZWNvbmQsIGFzIHdl
IGRvIG5vdCBoYXZlIHRoZSBsdXh1cnkgb2YgaW4tVk0gaXRlcmF0aW9uLCB3ZSBpbXBsZW1lbnQg
YQotICBmb3JFYWNoIG1ldGhvZCBmb3IgaXRlcmF0aW9uLgotCi0gIE1hcCBpcyBtb2NrZWQgb3V0
IHRvIGxvb2sgbGlrZSBhbiBFbWJlciBvYmplY3QsIHNvIHlvdSBjYW4gZG8KLSAgYEVtYmVyLk1h
cC5jcmVhdGUoKWAgZm9yIHN5bW1ldHJ5IHdpdGggb3RoZXIgRW1iZXIgY2xhc3Nlcy4KLSovCi12
YXIgc2V0ID0gRW1iZXIuc2V0LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAgIGlu
ZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotCi12YXIgY29weSA9IGZ1bmN0
aW9uKG9iaikgewotICB2YXIgb3V0cHV0ID0ge307Ci0KLSAgZm9yICh2YXIgcHJvcCBpbiBvYmop
IHsKLSAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7IG91dHB1dFtwcm9wXSA9IG9i
altwcm9wXTsgfQotICB9Ci0KLSAgcmV0dXJuIG91dHB1dDsKLX07Ci0KLXZhciBjb3B5TWFwID0g
ZnVuY3Rpb24ob3JpZ2luYWwsIG5ld09iamVjdCkgewotICB2YXIga2V5cyA9IG9yaWdpbmFsLmtl
eXMuY29weSgpLAotICAgICAgdmFsdWVzID0gY29weShvcmlnaW5hbC52YWx1ZXMpOwotCi0gIG5l
d09iamVjdC5rZXlzID0ga2V5czsKLSAgbmV3T2JqZWN0LnZhbHVlcyA9IHZhbHVlczsKLSAgbmV3
T2JqZWN0Lmxlbmd0aCA9IG9yaWdpbmFsLmxlbmd0aDsKLQotICByZXR1cm4gbmV3T2JqZWN0Owot
fTsKLQotLyoqCi0gIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEVtYmVyIGFuZCBF
bWJlciBEYXRhLgotICBQbGVhc2UgZG8gbm90IHVzZSBpdCBhdCB0aGlzIHRpbWUuIFdlIHBsYW4g
dG8gY2xlYW4gaXQgdXAKLSAgYW5kIGFkZCBtYW55IHRlc3RzIHNvb24uCi0KLSAgQGNsYXNzIE9y
ZGVyZWRTZXQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAY29uc3RydWN0b3IKLSAgQHByaXZhdGUK
LSovCi12YXIgT3JkZXJlZFNldCA9IEVtYmVyLk9yZGVyZWRTZXQgPSBmdW5jdGlvbigpIHsKLSAg
dGhpcy5jbGVhcigpOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY3JlYXRlCi0gIEBzdGF0aWMKLSAg
QHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSovCi1PcmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0
aW9uKCkgewotICByZXR1cm4gbmV3IE9yZGVyZWRTZXQoKTsKLX07Ci0KLQotT3JkZXJlZFNldC5w
cm90b3R5cGUgPSB7Ci0gIC8qKgotICAgIEBtZXRob2QgY2xlYXIKLSAgKi8KLSAgY2xlYXI6IGZ1
bmN0aW9uKCkgewotICAgIHRoaXMucHJlc2VuY2VTZXQgPSB7fTsKLSAgICB0aGlzLmxpc3QgPSBb
XTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9kIGFkZAotICAgIEBwYXJhbSBvYmoKLSAgKi8K
LSAgYWRkOiBmdW5jdGlvbihvYmopIHsKLSAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAg
ICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0LAotICAgICAgICBsaXN0ID0gdGhp
cy5saXN0OwotCi0gICAgaWYgKGd1aWQgaW4gcHJlc2VuY2VTZXQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICBwcmVzZW5jZVNldFtndWlkXSA9IHRydWU7Ci0gICAgbGlzdC5wdXNoKG9iaik7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCByZW1vdmUKLSAgICBAcGFyYW0gb2JqCi0gICovCi0gIHJlbW92
ZTogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCi0gICAgICAg
IHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldCwKLSAgICAgICAgbGlzdCA9IHRoaXMubGlz
dDsKLQotICAgIGRlbGV0ZSBwcmVzZW5jZVNldFtndWlkXTsKLQotICAgIHZhciBpbmRleCA9IGlu
ZGV4T2YuY2FsbChsaXN0LCBvYmopOwotICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICBsaXN0
LnNwbGljZShpbmRleCwgMSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgaXNF
bXB0eQotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGlzRW1wdHk6IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoID09PSAwOwotICB9LAotCi0gIC8qKgotICAg
IEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIG9iagotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICov
Ci0gIGhhczogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCi0g
ICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5wcmVzZW5jZVNldDsKLQotICAgIHJldHVybiBndWlk
IGluIHByZXNlbmNlU2V0OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZm9yRWFjaAotICAg
IEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gICAgQHBhcmFtIHNlbGYKLSAgKi8KLSAgZm9yRWFjaDog
ZnVuY3Rpb24oZm4sIHNlbGYpIHsKLSAgICAvLyBhbGxvdyBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0
aW9uCi0gICAgdmFyIGxpc3QgPSB0aGlzLnRvQXJyYXkoKTsKLQotICAgIGZvciAodmFyIGkgPSAw
LCBqID0gbGlzdC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKLSAgICAgIGZuLmNhbGwoc2VsZiwgbGlz
dFtpXSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdG9BcnJheQotICAgIEBy
ZXR1cm4ge0FycmF5fQotICAqLwotICB0b0FycmF5OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy5saXN0LnNsaWNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBjb3B5Ci0gICAg
QHJldHVybiB7RW1iZXIuT3JkZXJlZFNldH0KLSAgKi8KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIHNldCA9IG5ldyBPcmRlcmVkU2V0KCk7Ci0KLSAgICBzZXQucHJlc2VuY2VTZXQgPSBj
b3B5KHRoaXMucHJlc2VuY2VTZXQpOwotICAgIHNldC5saXN0ID0gdGhpcy50b0FycmF5KCk7Ci0K
LSAgICByZXR1cm4gc2V0OwotICB9Ci19OwotCi0vKioKLSAgQSBNYXAgc3RvcmVzIHZhbHVlcyBp
bmRleGVkIGJ5IGtleXMuIFVubGlrZSBKYXZhU2NyaXB0J3MKLSAgZGVmYXVsdCBPYmplY3RzLCB0
aGUga2V5cyBvZiBhIE1hcCBjYW4gYmUgYW55IEphdmFTY3JpcHQKLSAgb2JqZWN0LgotCi0gIElu
dGVybmFsbHksIGEgTWFwIGhhcyB0d28gZGF0YSBzdHJ1Y3R1cmVzOgotCi0gIDEuIGBrZXlzYDog
YW4gT3JkZXJlZFNldCBvZiBhbGwgb2YgdGhlIGV4aXN0aW5nIGtleXMKLSAgMi4gYHZhbHVlc2A6
IGEgSmF2YVNjcmlwdCBPYmplY3QgaW5kZXhlZCBieSB0aGUgYEVtYmVyLmd1aWRGb3Ioa2V5KWAK
LQotICBXaGVuIGEga2V5L3ZhbHVlIHBhaXIgaXMgYWRkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB3
ZQotICBhZGQgdGhlIGtleSB0byB0aGUgYGtleXNgIE9yZGVyZWRTZXQsIGFuZCBjcmVhdGUgb3IK
LSAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVzYC4gV2hlbiBhbiBlbnRyeSBpcyBkZWxldGVk
LAotICB3ZSBkZWxldGUgaXRzIGVudHJ5IGluIGBrZXlzYCBhbmQgYHZhbHVlc2AuCi0KLSAgQGNs
YXNzIE1hcAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwcml2YXRlCi0gIEBjb25zdHJ1Y3Rvcgot
Ki8KLXZhciBNYXAgPSBFbWJlci5NYXAgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5rZXlzID0gRW1i
ZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKLSAgdGhpcy52YWx1ZXMgPSB7fTsKLX07Ci0KLS8qKgot
ICBAbWV0aG9kIGNyZWF0ZQotICBAc3RhdGljCi0qLwotTWFwLmNyZWF0ZSA9IGZ1bmN0aW9uKCkg
ewotICByZXR1cm4gbmV3IE1hcCgpOwotfTsKLQotTWFwLnByb3RvdHlwZSA9IHsKLSAgLyoqCi0g
ICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNoYW5nZSBhcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4g
dGhlIG1hcCBjaGFuZ2VzLgotICAgCi0gICAgQHByb3BlcnR5IGxlbmd0aAotICAgIEB0eXBlIG51
bWJlcgotICAgIEBkZWZhdWx0IDAKLSAgKi8KLSAgbGVuZ3RoOiAwLAotICAgIAotICAgIAotICAv
KioKLSAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5Lgot
Ci0gICAgQG1ldGhvZCBnZXQKLSAgICBAcGFyYW0geyp9IGtleQotICAgIEByZXR1cm4geyp9IHRo
ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgYHVuZGVmaW5lZGAKLSAgKi8KLSAg
Z2V0OiBmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXMsCi0gICAg
ICAgIGd1aWQgPSBndWlkRm9yKGtleSk7Ci0KLSAgICByZXR1cm4gdmFsdWVzW2d1aWRdOwotICB9
LAotCi0gIC8qKgotICAgIEFkZHMgYSB2YWx1ZSB0byB0aGUgbWFwLiBJZiBhIHZhbHVlIGZvciB0
aGUgZ2l2ZW4ga2V5IGhhcyBhbHJlYWR5IGJlZW4KLSAgICBwcm92aWRlZCwgdGhlIG5ldyB2YWx1
ZSB3aWxsIHJlcGxhY2UgdGhlIG9sZCB2YWx1ZS4KLQotICAgIEBtZXRob2Qgc2V0Ci0gICAgQHBh
cmFtIHsqfSBrZXkKLSAgICBAcGFyYW0geyp9IHZhbHVlCi0gICovCi0gIHNldDogZnVuY3Rpb24o
a2V5LCB2YWx1ZSkgewotICAgIHZhciBrZXlzID0gdGhpcy5rZXlzLAotICAgICAgICB2YWx1ZXMg
PSB0aGlzLnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLQotICAgIGtleXMu
YWRkKGtleSk7Ci0gICAgdmFsdWVzW2d1aWRdID0gdmFsdWU7Ci0gICAgc2V0KHRoaXMsICdsZW5n
dGgnLCBrZXlzLmxpc3QubGVuZ3RoKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGEgdmFs
dWUgZnJvbSB0aGUgbWFwIGZvciBhbiBhc3NvY2lhdGVkIGtleS4KLQotICAgIEBtZXRob2QgcmVt
b3ZlCi0gICAgQHBhcmFtIHsqfSBrZXkKLSAgICBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGFu
IGl0ZW0gd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZQotICAqLwotICByZW1vdmU6IGZ1bmN0
aW9uKGtleSkgewotICAgIC8vIGRvbid0IHVzZSBFUzYgImRlbGV0ZSIgYmVjYXVzZSBpdCB3aWxs
IGJlIGFubm95aW5nCi0gICAgLy8gdG8gdXNlIGluIGJyb3dzZXJzIHRoYXQgYXJlIG5vdCBFUzYg
ZnJpZW5kbHk7Ci0gICAgdmFyIGtleXMgPSB0aGlzLmtleXMsCi0gICAgICAgIHZhbHVlcyA9IHRo
aXMudmFsdWVzLAotICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOwotCi0gICAgaWYgKHZhbHVl
cy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgewotICAgICAga2V5cy5yZW1vdmUoa2V5KTsKLSAgICAg
IGRlbGV0ZSB2YWx1ZXNbZ3VpZF07Ci0gICAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGtleXMubGlz
dC5sZW5ndGgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2hlY2sgd2hldGhlciBhIGtleSBp
cyBwcmVzZW50LgotCi0gICAgQG1ldGhvZCBoYXMKLSAgICBAcGFyYW0geyp9IGtleQotICAgIEBy
ZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gd2FzIHByZXNlbnQsIGZhbHNlIG90aGVy
d2lzZQotICAqLwotICBoYXM6IGZ1bmN0aW9uKGtleSkgewotICAgIHZhciB2YWx1ZXMgPSB0aGlz
LnZhbHVlcywKLSAgICAgICAgZ3VpZCA9IGd1aWRGb3Ioa2V5KTsKLQotICAgIHJldHVybiB2YWx1
ZXMuaGFzT3duUHJvcGVydHkoZ3VpZCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVy
IGFsbCB0aGUga2V5cyBhbmQgdmFsdWVzLiBDYWxscyB0aGUgZnVuY3Rpb24gb25jZQotICAgIGZv
ciBlYWNoIGtleSwgcGFzc2luZyBpbiB0aGUga2V5IGFuZCB2YWx1ZSwgaW4gdGhhdCBvcmRlci4K
LQotICAgIFRoZSBrZXlzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGl0ZXJhdGVkIG92ZXIgaW4gaW5z
ZXJ0aW9uIG9yZGVyLgotCi0gICAgQG1ldGhvZCBmb3JFYWNoCi0gICAgQHBhcmFtIHtGdW5jdGlv
bn0gY2FsbGJhY2sKLSAgICBAcGFyYW0geyp9IHNlbGYgaWYgcGFzc2VkLCB0aGUgYHRoaXNgIHZh
bHVlIGluc2lkZSB0aGUKLSAgICAgIGNhbGxiYWNrLiBCeSBkZWZhdWx0LCBgdGhpc2AgaXMgdGhl
IG1hcC4KLSAgKi8KLSAgZm9yRWFjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHNlbGYpIHsKLSAgICB2
YXIga2V5cyA9IHRoaXMua2V5cywKLSAgICAgICAgdmFsdWVzID0gdGhpcy52YWx1ZXM7Ci0KLSAg
ICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3Io
a2V5KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZiwga2V5LCB2YWx1ZXNbZ3VpZF0pOwotICAg
IH0pOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgY29weQotICAgIEByZXR1cm4ge0VtYmVy
Lk1hcH0KLSAgKi8KLSAgY29weTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGNvcHlNYXAodGhp
cywgbmV3IE1hcCgpKTsKLSAgfQotfTsKLQotLyoqCi0gIEBjbGFzcyBNYXBXaXRoRGVmYXVsdAot
ICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk1hcAotICBAcHJpdmF0ZQotICBA
Y29uc3RydWN0b3IKLSAgQHBhcmFtIFtvcHRpb25zXQotICAgIEBwYXJhbSB7Kn0gW29wdGlvbnMu
ZGVmYXVsdFZhbHVlXQotKi8KLXZhciBNYXBXaXRoRGVmYXVsdCA9IEVtYmVyLk1hcFdpdGhEZWZh
dWx0ID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBNYXAuY2FsbCh0aGlzKTsKLSAgdGhpcy5kZWZh
dWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTsKLX07Ci0KLS8qKgotICBAbWV0aG9kIGNy
ZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBbb3B0aW9uc10KLSAgICBAcGFyYW0geyp9IFtvcHRp
b25zLmRlZmF1bHRWYWx1ZV0KLSAgQHJldHVybiB7RW1iZXIuTWFwV2l0aERlZmF1bHR8RW1iZXIu
TWFwfSBJZiBvcHRpb25zIGFyZSBwYXNzZWQsIHJldHVybnMKLSAgICBgRW1iZXIuTWFwV2l0aERl
ZmF1bHRgIG90aGVyd2lzZSByZXR1cm5zIGBFbWJlci5NYXBgCi0qLwotTWFwV2l0aERlZmF1bHQu
Y3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewotICBpZiAob3B0aW9ucykgewotICAgIHJldHVy
biBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5l
dyBNYXAoKTsKLSAgfQotfTsKLQotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3Jl
YXRlKE1hcC5wcm90b3R5cGUpOwotCi0vKioKLSAgUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCBhIGdpdmVuIGtleS4KLQotICBAbWV0aG9kIGdldAotICBAcGFyYW0geyp9IGtleQot
ICBAcmV0dXJuIHsqfSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIHRoZSBk
ZWZhdWx0IHZhbHVlCi0qLwotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9u
KGtleSkgewotICB2YXIgaGFzVmFsdWUgPSB0aGlzLmhhcyhrZXkpOwotCi0gIGlmIChoYXNWYWx1
ZSkgewotICAgIHJldHVybiBNYXAucHJvdG90eXBlLmdldC5jYWxsKHRoaXMsIGtleSk7Ci0gIH0g
ZWxzZSB7Ci0gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlKGtleSk7Ci0g
ICAgdGhpcy5zZXQoa2V5LCBkZWZhdWx0VmFsdWUpOwotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7
Ci0gIH0KLX07Ci0KLS8qKgotICBAbWV0aG9kIGNvcHkKLSAgQHJldHVybiB7RW1iZXIuTWFwV2l0
aERlZmF1bHR9Ci0qLwotTWFwV2l0aERlZmF1bHQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigp
IHsKLSAgcmV0dXJuIGNvcHlNYXAodGhpcywgbmV3IE1hcFdpdGhEZWZhdWx0KHsKLSAgICBkZWZh
dWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlCi0gIH0pKTsKLX07Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci1mdW5jdGlvbiBjb25zb2xlTWV0aG9kKG5hbWUpIHsKLSAgdmFyIGNvbnNv
bGVPYmosIGxvZ1RvQ29uc29sZTsKLSAgaWYgKEVtYmVyLmltcG9ydHMuY29uc29sZSkgewotICAg
IGNvbnNvbGVPYmogPSBFbWJlci5pbXBvcnRzLmNvbnNvbGU7Ci0gIH0gZWxzZSBpZiAodHlwZW9m
IGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgY29uc29sZU9iaiA9IGNvbnNvbGU7Ci0g
IH0KLQotICB2YXIgbWV0aG9kID0gdHlwZW9mIGNvbnNvbGVPYmogPT09ICdvYmplY3QnID8gY29u
c29sZU9ialtuYW1lXSA6IG51bGw7Ci0KLSAgaWYgKG1ldGhvZCkgewotICAgIC8vIE9sZGVyIElF
IGRvZXNuJ3Qgc3VwcG9ydCBhcHBseSwgYnV0IENocm9tZSBuZWVkcyBpdAotICAgIGlmIChtZXRo
b2QuYXBwbHkpIHsKLSAgICAgIGxvZ1RvQ29uc29sZSA9IGZ1bmN0aW9uKCkgewotICAgICAgICBt
ZXRob2QuYXBwbHkoY29uc29sZU9iaiwgYXJndW1lbnRzKTsKLSAgICAgIH07Ci0gICAgICBsb2dU
b0NvbnNvbGUuZGlzcGxheU5hbWUgPSAnY29uc29sZS4nICsgbmFtZTsKLSAgICAgIHJldHVybiBs
b2dUb0NvbnNvbGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgdmFyIG1lc3NhZ2UgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywg
JywgJyk7Ci0gICAgICAgIG1ldGhvZChtZXNzYWdlKTsKLSAgICAgIH07Ci0gICAgfQotICB9Ci19
Ci0KLWZ1bmN0aW9uIGFzc2VydFBvbHlmaWxsKHRlc3QsIG1lc3NhZ2UpIHsKLSAgaWYgKCF0ZXN0
KSB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIGF0dGVtcHQgdG8gcHJlc2VydmUgdGhlIHN0YWNrCi0g
ICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdl
KTsKLSAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewot
ICAgICAgICB0aHJvdyBlcnJvcjsKLSAgICAgIH0sIDApOwotICAgIH0KLSAgfQotfQotCi0vKioK
LSAgSW5zaWRlIEVtYmVyLU1ldGFsLCBzaW1wbHkgdXNlcyB0aGUgbWV0aG9kcyBmcm9tIGBpbXBv
cnRzLmNvbnNvbGVgLgotICBPdmVycmlkZSB0aGlzIHRvIHByb3ZpZGUgbW9yZSByb2J1c3QgbG9n
Z2luZyBmdW5jdGlvbmFsaXR5LgotCi0gIEBjbGFzcyBMb2dnZXIKLSAgQG5hbWVzcGFjZSBFbWJl
cgotKi8KLUVtYmVyLkxvZ2dlciA9IHsKLSAgLyoqCi0gICBMb2dzIHRoZSBhcmd1bWVudHMgdG8g
dGhlIGNvbnNvbGUuCi0gICBZb3UgY2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdh
bnQgYW5kIHRoZXkgd2lsbCBiZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNlLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIHZhciBmb28gPSAxOwotICAgIEVtYmVyLkxvZ2dlci5sb2coJ2xv
ZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBmb286IDEiIHdpbGwgYmUg
cHJpbnRlZCB0byB0aGUgY29uc29sZQotICAgIGBgYAotCi0gICBAbWV0aG9kIGxvZwotICAgQGZv
ciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIGxvZzogICBj
b25zb2xlTWV0aG9kKCdsb2cnKSAgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBQcmludHMgdGhl
IGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRoIGEgd2FybmluZyBpY29uLgotICAgWW91IGNh
biBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9p
bmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJl
ci5Mb2dnZXIud2FybignU29tZXRoaW5nIGhhcHBlbmVkIScpOyAvLyAiU29tZXRoaW5nIGhhcHBl
bmVkISIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlIHdpdGggYSB3YXJuaW5nIGljb24u
Ci0gICAgYGBgCi0KLSAgIEBtZXRob2Qgd2FybgotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBw
YXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIHdhcm46ICBjb25zb2xlTWV0aG9kKCd3YXJuJykg
IHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBQcmludHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29u
c29sZSB3aXRoIGFuIGVycm9yIGljb24sIHJlZCB0ZXh0IGFuZCBhIHN0YWNrIHRyYWNlLgotICAg
WW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwg
YmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0RhbmdlciEgRGFuZ2VyIScpOyAvLyAiRGFuZ2VyISBEYW5n
ZXIhIiB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgaW4gcmVkIHRleHQuCi0gICAgYGBg
Ci0KLSAgIEBtZXRob2QgZXJyb3IKLSAgIEBmb3IgRW1iZXIuTG9nZ2VyCi0gICBAcGFyYW0geyp9
IGFyZ3VtZW50cwotICAqLwotICBlcnJvcjogY29uc29sZU1ldGhvZCgnZXJyb3InKSB8fCBFbWJl
ci5LLAotCi0gIC8qKgotICAgTG9ncyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb25zb2xlLgotICAg
WW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwg
YmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dnZXIuaW5mbygnbG9nIHZhbHVlIG9mIGZvbzon
LCBmb28pOyAvLyAibG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBj
b25zb2xlCi0gICAgYGBgCi0KLSAgIEBtZXRob2QgaW5mbwotICAgQGZvciBFbWJlci5Mb2dnZXIK
LSAgIEBwYXJhbSB7Kn0gYXJndW1lbnRzCi0gICovCi0gIGluZm86ICBjb25zb2xlTWV0aG9kKCdp
bmZvJykgIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBMb2dzIHRoZSBhcmd1bWVudHMgdG8gdGhl
IGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgotICAgWW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRz
IGFzIHlvdSB3YW50IGFuZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFj
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgZm9vID0gMTsKLSAgICBFbWJlci5Mb2dn
ZXIuZGVidWcoJ2xvZyB2YWx1ZSBvZiBmb286JywgZm9vKTsgLy8gImxvZyB2YWx1ZSBvZiBmb286
IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZQotICAgIGBgYAotCi0gICBAbWV0aG9k
IGRlYnVnCi0gICBAZm9yIEVtYmVyLkxvZ2dlcgotICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKLSAg
Ki8KLSAgZGVidWc6IGNvbnNvbGVNZXRob2QoJ2RlYnVnJykgfHwgY29uc29sZU1ldGhvZCgnaW5m
bycpIHx8IEVtYmVyLkssCi0KLSAgLyoqCi0gICBJZiB0aGUgdmFsdWUgcGFzc2VkIGludG8gYEVt
YmVyLkxvZ2dlci5hc3NlcnRgIGlzIG5vdCB0cnV0aHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3
aXRoIGEgc3RhY2sgdHJhY2UuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgRW1iZXIuTG9nZ2Vy
LmFzc2VydCh0cnVlKTsgLy8gdW5kZWZpbmVkCi0gICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVl
ID09PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVycm9yLgotICAgIGBg
YAotCi0gICBAbWV0aG9kIGFzc2VydAotICAgQGZvciBFbWJlci5Mb2dnZXIKLSAgIEBwYXJhbSB7
Qm9vbGVhbn0gYm9vbCBWYWx1ZSB0byB0ZXN0Ci0gICovCi0gIGFzc2VydDogY29uc29sZU1ldGhv
ZCgnYXNzZXJ0JykgfHwgYXNzZXJ0UG9seWZpbGwKLX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIE1FVEFfS0VZID0g
RW1iZXIuTUVUQV9LRVksCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgb2JqZWN0RGVm
aW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eTsKLQotdmFyIE1BTkRB
VE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUjsKLQotLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gREVT
Q1JJUFRPUgotLy8KLQotLyoqCi0gIE9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBpbXBsZW1lbnQg
YW4gaW50ZXJmYWNlIHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgdG8KLSAgZ2V0IGFuZCBzZXQuIFRo
ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgc2ltcGxlIHByb3BlcnRpZXMuCi0KLSAg
WW91IGdlbmVyYWxseSB3b24ndCBuZWVkIHRvIGNyZWF0ZSBvciBzdWJjbGFzcyB0aGlzIGRpcmVj
dGx5LgotCi0gIEBjbGFzcyBEZXNjcmlwdG9yCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZh
dGUKLSAgQGNvbnN0cnVjdG9yCi0qLwotRW1iZXIuRGVzY3JpcHRvciA9IGZ1bmN0aW9uKCkge307
Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4KLS8vIERFRklOSU5HIFBST1BFUlRJRVMgQVBJCi0vLwotCi12YXIgTUFOREFUT1JZ
X1NFVFRFUl9GVU5DVElPTiA9IEVtYmVyLk1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04gPSBmdW5j
dGlvbih2YWx1ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0
byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eSAob2YgIiArIHRoaXMgKyAiKSIsIGZhbHNlKTsKLX07Ci0K
LXZhciBERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNU
SU9OID0gZnVuY3Rpb24obmFtZSkgewotICByZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1l
dGEgPSB0aGlzW01FVEFfS0VZXTsKLSAgICByZXR1cm4gbWV0YSAmJiBtZXRhLnZhbHVlc1tuYW1l
XTsKLSAgfTsKLX07Ci0KLS8qKgotICBOT1RFOiBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCB1
c2VkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZSBBUEkuIFlvdSBhbG1vc3QKLSAgbmV2ZXIgd2FudCB0
byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlCi0gIGBF
bWJlci5taXhpbigpYCB0byBkZWZpbmUgbmV3IHByb3BlcnRpZXMuCi0KLSAgRGVmaW5lcyBhIHBy
b3BlcnR5IG9uIGFuIG9iamVjdC4gVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBFUzUK
LSAgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBtZXRob2QgZXhjZXB0IHRoYXQgaXQgY2FuIGFs
c28gYWNjZXB0IGNvbXB1dGVkCi0gIHByb3BlcnRpZXMgYW5kIG90aGVyIHNwZWNpYWwgZGVzY3Jp
cHRvcnMuCi0KLSAgTm9ybWFsbHkgdGhpcyBtZXRob2QgdGFrZXMgb25seSB0aHJlZSBwYXJhbWV0
ZXJzLiBIb3dldmVyIGlmIHlvdSBwYXNzIGFuCi0gIGluc3RhbmNlIG9mIGBFbWJlci5EZXNjcmlw
dG9yYCBhcyB0aGUgdGhpcmQgcGFyYW0gdGhlbiB5b3UgY2FuIHBhc3MgYW4KLSAgb3B0aW9uYWwg
dmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuIFRoaXMgaXMgb2Z0ZW4gbW9yZSBlZmZpY2ll
bnQgdGhhbgotICBjcmVhdGluZyBuZXcgZGVzY3JpcHRvciBoYXNoZXMgZm9yIGVhY2ggcHJvcGVy
dHkuCi0KLSAgIyMgRXhhbXBsZXMKLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEVTNSBjb21wYXRp
YmxlIG1vZGUKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2ZpcnN0TmFtZScsIHsK
LSAgICB3cml0YWJsZTogdHJ1ZSwKLSAgICBjb25maWd1cmFibGU6IGZhbHNlLAotICAgIGVudW1l
cmFibGU6IHRydWUsCi0gICAgdmFsdWU6ICdDaGFybGVzJwotICB9KTsKLQotICAvLyBkZWZpbmUg
YSBzaW1wbGUgcHJvcGVydHkKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2xhc3RO
YW1lJywgdW5kZWZpbmVkLCAnSm9sbGV5Jyk7Ci0KLSAgLy8gZGVmaW5lIGEgY29tcHV0ZWQgcHJv
cGVydHkKLSAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1lJywgRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lKycgJyt0aGlz
Lmxhc3ROYW1lOwotICB9KS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykpOwotICBg
YGAKLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGRlZmluZVByb3BlcnR5Ci0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtPYmplY3R9IG9iaiB0aGUgb2JqZWN0IHRvIGRlZmluZSB0aGlzIHByb3BlcnR5
IG9uLiBUaGlzIG1heSBiZSBhIHByb3RvdHlwZS4KLSAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUg
dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gIEBwYXJhbSB7RW1iZXIuRGVzY3JpcHRvcn0gW2Rl
c2NdIGFuIGluc3RhbmNlIG9mIGBFbWJlci5EZXNjcmlwdG9yYCAodHlwaWNhbGx5IGEKLSAgICBj
b21wdXRlZCBwcm9wZXJ0eSkgb3IgYW4gRVM1IGRlc2NyaXB0b3IuCi0gICAgWW91IG11c3QgcHJv
dmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJvdGguCi0gIEBwYXJhbSB7Kn0gW2RhdGFdIHNv
bWV0aGluZyBvdGhlciB0aGFuIGEgZGVzY3JpcHRvciwgdGhhdCB3aWxsCi0gICAgYmVjb21lIHRo
ZSBleHBsaWNpdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotKi8KLUVtYmVyLmRlZmluZVByb3Bl
cnR5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBkZXNjLCBkYXRhLCBtZXRhKSB7Ci0gIHZhciBk
ZXNjcywgZXhpc3RpbmdEZXNjLCB3YXRjaGluZywgdmFsdWU7Ci0KLSAgaWYgKCFtZXRhKSBtZXRh
ID0gbWV0YUZvcihvYmopOwotICBkZXNjcyA9IG1ldGEuZGVzY3M7Ci0gIGV4aXN0aW5nRGVzYyA9
IG1ldGEuZGVzY3Nba2V5TmFtZV07Ci0gIHdhdGNoaW5nID0gbWV0YS53YXRjaGluZ1trZXlOYW1l
XSA+IDA7Ci0KLSAgaWYgKGV4aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3Ip
IHsKLSAgICBleGlzdGluZ0Rlc2MudGVhcmRvd24ob2JqLCBrZXlOYW1lKTsKLSAgfQotCi0gIGlm
IChkZXNjIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcikgewotICAgIHZhbHVlID0gZGVzYzsK
LQotICAgIGRlc2NzW2tleU5hbWVdID0gZGVzYzsKLSAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAm
JiB3YXRjaGluZykgewotICAgICAgb2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7
Ci0gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKLSAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwK
LSAgICAgICAgd3JpdGFibGU6IHRydWUsCi0gICAgICAgIHZhbHVlOiB1bmRlZmluZWQgLy8gbWFr
ZSBlbnVtZXJhYmxlCi0gICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqW2tleU5hbWVd
ID0gdW5kZWZpbmVkOyAvLyBtYWtlIGVudW1lcmFibGUKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAg
ZGVzY3Nba2V5TmFtZV0gPSB1bmRlZmluZWQ7IC8vIHNoYWRvdyBkZXNjcmlwdG9yIGluIHByb3Rv
Ci0gICAgaWYgKGRlc2MgPT0gbnVsbCkgewotICAgICAgdmFsdWUgPSBkYXRhOwotCi0gICAgICBp
ZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRjaGluZykgewotICAgICAgICBtZXRhLnZhbHVlc1tr
ZXlOYW1lXSA9IGRhdGE7Ci0gICAgICAgIG9iamVjdERlZmluZVByb3BlcnR5KG9iaiwga2V5TmFt
ZSwgewotICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKLSAgICAgICAgICBlbnVtZXJhYmxl
OiB0cnVlLAotICAgICAgICAgIHNldDogTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTiwKLSAgICAg
ICAgICBnZXQ6IERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5hbWUpCi0gICAgICAgIH0pOwot
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2JqW2tleU5hbWVdID0gZGF0YTsKLSAgICAgIH0KLSAg
ICB9IGVsc2UgewotICAgICAgdmFsdWUgPSBkZXNjOwotCi0gICAgICAvLyBjb21wYXRpYmlsaXR5
IHdpdGggRVM1Ci0gICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2Mp
OwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGtleSBpcyBiZWluZyB3YXRjaGVkLCBvdmVycmlkZSBj
aGFpbnMgdGhhdAotICAvLyB3ZXJlIGluaXRpYWxpemVkIHdpdGggdGhlIHByb3RvdHlwZQotICBp
ZiAod2F0Y2hpbmcpIHsgRW1iZXIub3ZlcnJpZGVDaGFpbnMob2JqLCBrZXlOYW1lLCBtZXRhKTsg
fQotCi0gIC8vIFRoZSBgdmFsdWVgIHBhc3NlZCB0byB0aGUgYGRpZERlZmluZVByb3BlcnR5YCBo
b29rIGlzCi0gIC8vIGVpdGhlciB0aGUgZGVzY3JpcHRvciBvciBkYXRhLCB3aGljaGV2ZXIgd2Fz
IHBhc3NlZC4KLSAgaWYgKG9iai5kaWREZWZpbmVQcm9wZXJ0eSkgeyBvYmouZGlkRGVmaW5lUHJv
cGVydHkob2JqLCBrZXlOYW1lLCB2YWx1ZSk7IH0KLQotICByZXR1cm4gdGhpczsKLX07Ci0KLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgot
ICBUbyBnZXQgbXVsdGlwbGUgcHJvcGVydGllcyBhdCBvbmNlLCBjYWxsIGBFbWJlci5nZXRQcm9w
ZXJ0aWVzYAotICB3aXRoIGFuIG9iamVjdCBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygc3RyaW5ncyBv
ciBhbiBhcnJheToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmdldFByb3BlcnRpZXMocmVj
b3JkLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1l
OiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0gIGBgYAotCi0g
IGlzIGVxdWl2YWxlbnQgdG86Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5nZXRQcm9wZXJ0
aWVzKHJlY29yZCwgWydmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZSddKTsgIC8vIHsg
Zmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0g
IGBgYAotCi0gIEBtZXRob2QgZ2V0UHJvcGVydGllcwotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7
U3RyaW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMgdG8gZ2V0Ci0gIEByZXR1cm4ge0hhc2h9Ci0q
LwotRW1iZXIuZ2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgcmV0ID0ge30s
Ci0gICAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzLAotICAgICAgaSA9IDE7Ci0KLSAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgRW1iZXIudHlwZU9mKGFyZ3VtZW50c1sxXSkgPT09
ICdhcnJheScpIHsKLSAgICBpID0gMDsKLSAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzWzFd
OwotICB9Ci0gIGZvcih2YXIgbGVuID0gcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkr
KykgewotICAgIHJldFtwcm9wZXJ0eU5hbWVzW2ldXSA9IGdldChvYmosIHByb3BlcnR5TmFtZXNb
aV0pOwotICB9Ci0gIHJldHVybiByZXQ7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotdmFyIGNoYW5nZVByb3BlcnRpZXMgPSBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzLAotICAgIHNl
dCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFNldCBhIGxpc3Qgb2YgcHJvcGVydGllcyBvbiBhbiBv
YmplY3QuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNldCBpbnNpZGUKLSAgYSBzaW5nbGUgYGJlZ2lu
UHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gIG9i
c2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgYW5PYmplY3Qu
c2V0UHJvcGVydGllcyh7Ci0gICAgZmlyc3ROYW1lOiAiU3RhbmxleSIsCi0gICAgbGFzdE5hbWU6
ICJTdHVhcnQiLAotICAgIGFnZTogIjIxIgotICB9KQotICBgYGAKLQotICBAbWV0aG9kIHNldFBy
b3BlcnRpZXMKLSAgQHBhcmFtIHNlbGYKLSAgQHBhcmFtIHtPYmplY3R9IGhhc2gKLSAgQHJldHVy
biBzZWxmCi0qLwotRW1iZXIuc2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKHNlbGYsIGhhc2gpIHsK
LSAgY2hhbmdlUHJvcGVydGllcyhmdW5jdGlvbigpIHsKLSAgICBmb3IodmFyIHByb3AgaW4gaGFz
aCkgewotICAgICAgaWYgKGhhc2guaGFzT3duUHJvcGVydHkocHJvcCkpIHsgc2V0KHNlbGYsIHBy
b3AsIGhhc2hbcHJvcF0pOyB9Ci0gICAgfQotICB9KTsKLSAgcmV0dXJuIHNlbGY7Ci19OwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIG1ldGFGb3IgPSBFbWJlci5tZXRhLCAvLyB1
dGlscy5qcwotICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZiwgLy8gdXRpbHMuanMKLSAgICBNQU5E
QVRPUllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIsCi0gICAgb19kZWZpbmVQ
cm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5OwotCi1FbWJlci53YXRjaEtl
eSA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24g
QXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChrZXlOYW1lID09PSAnbGVuZ3RoJyAmJiB0
eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0KLQotICB2YXIgbSA9IG1ldGFGb3Io
b2JqKSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nOwotCi0gIC8vIGFjdGl2YXRlIHdhdGNoaW5nIGZp
cnN0IHRpbWUKLSAgaWYgKCF3YXRjaGluZ1trZXlOYW1lXSkgewotICAgIHdhdGNoaW5nW2tleU5h
bWVdID0gMTsKLQotICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLndpbGxXYXRjaFBy
b3BlcnR5KSB7Ci0gICAgICBvYmoud2lsbFdhdGNoUHJvcGVydHkoa2V5TmFtZSk7Ci0gICAgfQot
Ci0gICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYga2V5TmFtZSBpbiBvYmopIHsKLSAgICAgIG0u
dmFsdWVzW2tleU5hbWVdID0gb2JqW2tleU5hbWVdOwotICAgICAgb19kZWZpbmVQcm9wZXJ0eShv
YmosIGtleU5hbWUsIHsKLSAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAotICAgICAgICBlbnVt
ZXJhYmxlOiBvYmoucHJvcGVydHlJc0VudW1lcmFibGUoa2V5TmFtZSksCi0gICAgICAgIHNldDog
RW1iZXIuTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTiwKLSAgICAgICAgZ2V0OiBFbWJlci5ERUZB
VUxUX0dFVFRFUl9GVU5DVElPTihrZXlOYW1lKQotICAgICAgfSk7Ci0gICAgfQotICB9IGVsc2Ug
ewotICAgIHdhdGNoaW5nW2tleU5hbWVdID0gKHdhdGNoaW5nW2tleU5hbWVdIHx8IDApICsgMTsK
LSAgfQotfTsKLQotCi1FbWJlci51bndhdGNoS2V5ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7
Ci0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYg
KHdhdGNoaW5nW2tleU5hbWVdID09PSAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5TmFtZV0gPSAwOwot
Ci0gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouZGlkVW53YXRjaFByb3BlcnR5KSB7
Ci0gICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5KGtleU5hbWUpOwotICAgIH0KLQotICAgIGlm
IChNQU5EQVRPUllfU0VUVEVSICYmIGtleU5hbWUgaW4gb2JqKSB7Ci0gICAgICBvX2RlZmluZVBy
b3BlcnR5KG9iaiwga2V5TmFtZSwgewotICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCi0gICAg
ICAgIGVudW1lcmFibGU6IG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXlOYW1lKSwKLSAgICAg
ICAgc2V0OiBmdW5jdGlvbih2YWwpIHsKLSAgICAgICAgICAvLyByZWRlZmluZSB0byBzZXQgYXMg
ZW51bWVyYWJsZQotICAgICAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7Ci0g
ICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCi0gICAgICAgICAgICB3cml0YWJsZTogdHJ1
ZSwKLSAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCi0gICAgICAgICAgICB2YWx1ZTogdmFs
Ci0gICAgICAgICAgfSk7Ci0gICAgICAgICAgZGVsZXRlIG0udmFsdWVzW2tleU5hbWVdOwotICAg
ICAgICB9LAotICAgICAgICBnZXQ6IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5h
bWUpCi0gICAgICB9KTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAod2F0Y2hpbmdba2V5TmFtZV0gPiAx
KSB7Ci0gICAgd2F0Y2hpbmdba2V5TmFtZV0tLTsKLSAgfQotfTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLXZhciBtZXRhRm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMuanMKLSAgICBn
ZXQgPSBFbWJlci5nZXQsIC8vIHByb3BlcnR5X2dldC5qcwotICAgIG5vcm1hbGl6ZVR1cGxlID0g
RW1iZXIubm9ybWFsaXplVHVwbGUsIC8vIHByb3BlcnR5X2dldC5qcwotICAgIGZvckVhY2ggPSBF
bWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLCAvLyBhcnJheS5qcwotICAgIHdhcm4gPSBFbWJl
ci53YXJuLAotICAgIHdhdGNoS2V5ID0gRW1iZXIud2F0Y2hLZXksCi0gICAgdW53YXRjaEtleSA9
IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgRklSU1RfS0VZID0gL14oW15cLlwqXSspLzsKLQotZnVu
Y3Rpb24gZmlyc3RLZXkocGF0aCkgewotICByZXR1cm4gcGF0aC5tYXRjaChGSVJTVF9LRVkpWzBd
OwotfQotCi12YXIgcGVuZGluZ1F1ZXVlID0gW107Ci0KLS8vIGF0dGVtcHRzIHRvIGFkZCB0aGUg
cGVuZGluZ1F1ZXVlIGNoYWlucyBhZ2Fpbi4gSWYgc29tZSBvZiB0aGVtIGVuZCB1cAotLy8gYmFj
ayBpbiB0aGUgcXVldWUgYW5kIHJlc2NoZWR1bGUgaXMgdHJ1ZSwgc2NoZWR1bGVzIGEgdGltZW91
dCB0byB0cnkKLS8vIGFnYWluLgotRW1iZXIuZmx1c2hQZW5kaW5nQ2hhaW5zID0gZnVuY3Rpb24o
KSB7Ci0gIGlmIChwZW5kaW5nUXVldWUubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfSAvLyBub3Ro
aW5nIHRvIGRvCi0KLSAgdmFyIHF1ZXVlID0gcGVuZGluZ1F1ZXVlOwotICBwZW5kaW5nUXVldWUg
PSBbXTsKLQotICBmb3JFYWNoLmNhbGwocXVldWUsIGZ1bmN0aW9uKHEpIHsgcVswXS5hZGQocVsx
XSk7IH0pOwotCi0gIHdhcm4oJ1dhdGNoaW5nIGFuIHVuZGVmaW5lZCBnbG9iYWwsIEVtYmVyIGV4
cGVjdHMgd2F0Y2hlZCBnbG9iYWxzIHRvIGJlIHNldHVwIGJ5IHRoZSB0aW1lIHRoZSBydW4gbG9v
cCBpcyBmbHVzaGVkLCBjaGVjayBmb3IgdHlwb3MnLCBwZW5kaW5nUXVldWUubGVuZ3RoID09PSAw
KTsKLX07Ci0KLQotZnVuY3Rpb24gYWRkQ2hhaW5XYXRjaGVyKG9iaiwga2V5TmFtZSwgbm9kZSkg
ewotICBpZiAoIW9iaiB8fCAoJ29iamVjdCcgIT09IHR5cGVvZiBvYmopKSB7IHJldHVybjsgfSAv
LyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiksIG5vZGVzID0gbS5jaGFp
bldhdGNoZXJzOwotCi0gIGlmICghbS5oYXNPd25Qcm9wZXJ0eSgnY2hhaW5XYXRjaGVycycpKSB7
Ci0gICAgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnMgPSB7fTsKLSAgfQotCi0gIGlmICghbm9kZXNb
a2V5TmFtZV0pIHsgbm9kZXNba2V5TmFtZV0gPSBbXTsgfQotICBub2Rlc1trZXlOYW1lXS5wdXNo
KG5vZGUpOwotICB3YXRjaEtleShvYmosIGtleU5hbWUpOwotfQotCi12YXIgcmVtb3ZlQ2hhaW5X
YXRjaGVyID0gRW1iZXIucmVtb3ZlQ2hhaW5XYXRjaGVyID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1l
LCBub2RlKSB7Ci0gIGlmICghb2JqIHx8ICdvYmplY3QnICE9PSB0eXBlb2Ygb2JqKSB7IHJldHVy
bjsgfSAvLyBub3RoaW5nIHRvIGRvCi0KLSAgdmFyIG0gPSBtZXRhRm9yKG9iaiwgZmFsc2UpOwot
ICBpZiAoIW0uaGFzT3duUHJvcGVydHkoJ2NoYWluV2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8g
bm90aGluZyB0byBkbwotCi0gIHZhciBub2RlcyA9IG0uY2hhaW5XYXRjaGVyczsKLQotICBpZiAo
bm9kZXNba2V5TmFtZV0pIHsKLSAgICBub2RlcyA9IG5vZGVzW2tleU5hbWVdOwotICAgIGZvciAo
dmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBpZiAobm9k
ZXNbaV0gPT09IG5vZGUpIHsgbm9kZXMuc3BsaWNlKGksIDEpOyB9Ci0gICAgfQotICB9Ci0gIHVu
d2F0Y2hLZXkob2JqLCBrZXlOYW1lKTsKLX07Ci0KLS8vIEEgQ2hhaW5Ob2RlIHdhdGNoZXMgYSBz
aW5nbGUga2V5IG9uIGFuIG9iamVjdC4gSWYgeW91IHByb3ZpZGUgYSBzdGFydGluZwotLy8gdmFs
dWUgZm9yIHRoZSBrZXkgdGhlbiB0aGUgbm9kZSB3b24ndCBhY3R1YWxseSB3YXRjaCBpdC4gRm9y
IGEgcm9vdCBub2RlCi0vLyBwYXNzIG51bGwgZm9yIHBhcmVudCBhbmQga2V5IGFuZCBvYmplY3Qg
Zm9yIHZhbHVlLgotdmFyIENoYWluTm9kZSA9IEVtYmVyLl9DaGFpbk5vZGUgPSBmdW5jdGlvbihw
YXJlbnQsIGtleSwgdmFsdWUpIHsKLSAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwotICB0aGlzLl9r
ZXkgICAgPSBrZXk7Ci0KLSAgLy8gX3dhdGNoaW5nIGlzIHRydWUgd2hlbiBjYWxsaW5nIGdldCh0
aGlzLl9wYXJlbnQsIHRoaXMuX2tleSkgd2lsbAotICAvLyByZXR1cm4gdGhlIHZhbHVlIG9mIHRo
aXMgbm9kZS4KLSAgLy8KLSAgLy8gSXQgaXMgZmFsc2UgZm9yIHRoZSByb290IG9mIGEgY2hhaW4g
KGJlY2F1c2Ugd2UgaGF2ZSBubyBwYXJlbnQpCi0gIC8vIGFuZCBmb3IgZ2xvYmFsIHBhdGhzIChi
ZWNhdXNlIHRoZSBwYXJlbnQgbm9kZSBpcyB0aGUgb2JqZWN0IHdpdGgKLSAgLy8gdGhlIG9ic2Vy
dmVyIG9uIGl0KQotICB0aGlzLl93YXRjaGluZyA9IHZhbHVlPT09dW5kZWZpbmVkOwotCi0gIHRo
aXMuX3ZhbHVlICA9IHZhbHVlOwotICB0aGlzLl9wYXRocyA9IHt9OwotICBpZiAodGhpcy5fd2F0
Y2hpbmcpIHsKLSAgICB0aGlzLl9vYmplY3QgPSBwYXJlbnQudmFsdWUoKTsKLSAgICBpZiAodGhp
cy5fb2JqZWN0KSB7IGFkZENoYWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhp
cyk7IH0KLSAgfQotCi0gIC8vIFNwZWNpYWwtY2FzZTogdGhlIEVhY2hQcm94eSByZWxpZXMgb24g
aW1tZWRpYXRlIGV2YWx1YXRpb24gdG8KLSAgLy8gZXN0YWJsaXNoIGl0cyBvYnNlcnZlcnMuCi0g
IC8vCi0gIC8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGFuIGVmZmljaWVudCBjYWxsYmFjayB0
aGF0IHRoZSBFYWNoUHJveHkKLSAgLy8gY2FuIGltcGxlbWVudC4KLSAgaWYgKHRoaXMuX3BhcmVu
dCAmJiB0aGlzLl9wYXJlbnQuX2tleSA9PT0gJ0BlYWNoJykgewotICAgIHRoaXMudmFsdWUoKTsK
LSAgfQotfTsKLQotdmFyIENoYWluTm9kZVByb3RvdHlwZSA9IENoYWluTm9kZS5wcm90b3R5cGU7
Ci0KLWZ1bmN0aW9uIGxhenlHZXQob2JqLCBrZXkpIHsKLSAgaWYgKCFvYmopIHJldHVybiB1bmRl
ZmluZWQ7Ci0KLSAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaiwgZmFsc2UpOwotICAvLyBjaGVjayBp
ZiBvYmplY3QgbWVhbnQgb25seSB0byBiZSBhIHByb3RvdHlwZQotICBpZiAobWV0YS5wcm90byA9
PT0gb2JqKSByZXR1cm4gdW5kZWZpbmVkOwotCi0gIGlmIChrZXkgPT09ICJAZWFjaCIpIHJldHVy
biBnZXQob2JqLCBrZXkpOwotCi0gIC8vIGlmIGEgQ1Agb25seSByZXR1cm4gY2FjaGVkIHZhbHVl
Ci0gIHZhciBkZXNjID0gbWV0YS5kZXNjc1trZXldOwotICBpZiAoZGVzYyAmJiBkZXNjLl9jYWNo
ZWFibGUpIHsKLSAgICBpZiAoa2V5IGluIG1ldGEuY2FjaGUpIHsKLSAgICAgIHJldHVybiBtZXRh
LmNhY2hlW2tleV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAg
fQotICB9Ci0KLSAgcmV0dXJuIGdldChvYmosIGtleSk7Ci19Ci0KLUNoYWluTm9kZVByb3RvdHlw
ZS52YWx1ZSA9IGZ1bmN0aW9uKCkgewotICBpZiAodGhpcy5fdmFsdWUgPT09IHVuZGVmaW5lZCAm
JiB0aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9wYXJlbnQudmFsdWUoKTsK
LSAgICB0aGlzLl92YWx1ZSA9IGxhenlHZXQob2JqLCB0aGlzLl9rZXkpOwotICB9Ci0gIHJldHVy
biB0aGlzLl92YWx1ZTsKLX07Ci0KLUNoYWluTm9kZVByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rp
b24oKSB7Ci0gIGlmICh0aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9vYmpl
Y3Q7Ci0gICAgaWYgKG9iaikgeyByZW1vdmVDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRo
aXMpOyB9Ci0gICAgdGhpcy5fd2F0Y2hpbmcgPSBmYWxzZTsgLy8gc28gZnV0dXJlIGNhbGxzIGRv
IG5vdGhpbmcKLSAgfQotfTsKLQotLy8gY29waWVzIGEgdG9wIGxldmVsIG9iamVjdCBvbmx5Ci1D
aGFpbk5vZGVQcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgcmV0ID0gbmV3
IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopLAotICAgICAgcGF0aHMgPSB0aGlzLl9wYXRocywg
cGF0aDsKLSAgZm9yIChwYXRoIGluIHBhdGhzKSB7Ci0gICAgaWYgKHBhdGhzW3BhdGhdIDw9IDAp
IHsgY29udGludWU7IH0gLy8gdGhpcyBjaGVjayB3aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2
YWxzLgotICAgIHJldC5hZGQocGF0aCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX07Ci0KLS8vIGNh
bGxlZCBvbiB0aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8gc2V0dXAgd2F0Y2hlcnMgb24gdGhl
IHNwZWNpZmllZAotLy8gcGF0aC4KLUNoYWluTm9kZVByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihw
YXRoKSB7Ci0gIHZhciBvYmosIHR1cGxlLCBrZXksIHNyYywgcGF0aHM7Ci0KLSAgcGF0aHMgPSB0
aGlzLl9wYXRoczsKLSAgcGF0aHNbcGF0aF0gPSAocGF0aHNbcGF0aF0gfHwgMCkgKyAxOwotCi0g
IG9iaiA9IHRoaXMudmFsdWUoKTsKLSAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgp
OwotCi0gIC8vIHRoZSBwYXRoIHdhcyBhIGxvY2FsIHBhdGgKLSAgaWYgKHR1cGxlWzBdICYmIHR1
cGxlWzBdID09PSBvYmopIHsKLSAgICBwYXRoID0gdHVwbGVbMV07Ci0gICAga2V5ICA9IGZpcnN0
S2V5KHBhdGgpOwotICAgIHBhdGggPSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Ci0KLSAgLy8g
Z2xvYmFsIHBhdGgsIGJ1dCBvYmplY3QgZG9lcyBub3QgZXhpc3QgeWV0LgotICAvLyBwdXQgaW50
byBhIHF1ZXVlIGFuZCB0cnkgdG8gY29ubmVjdCBsYXRlci4KLSAgfSBlbHNlIGlmICghdHVwbGVb
MF0pIHsKLSAgICBwZW5kaW5nUXVldWUucHVzaChbdGhpcywgcGF0aF0pOwotICAgIHR1cGxlLmxl
bmd0aCA9IDA7Ci0gICAgcmV0dXJuOwotCi0gIC8vIGdsb2JhbCBwYXRoLCBhbmQgb2JqZWN0IGFs
cmVhZHkgZXhpc3RzCi0gIH0gZWxzZSB7Ci0gICAgc3JjICA9IHR1cGxlWzBdOwotICAgIGtleSAg
PSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7Ci0gICAgcGF0aCA9IHR1cGxl
WzFdOwotICB9Ci0KLSAgdHVwbGUubGVuZ3RoID0gMDsKLSAgdGhpcy5jaGFpbihrZXksIHBhdGgs
IHNyYyk7Ci19OwotCi0vLyBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZSBvZiBhIGNoYWluIHRvIHRl
YXJkb3duIHdhdGNoZXIgb24gdGhlIHNwZWNpZmllZAotLy8gcGF0aAotQ2hhaW5Ob2RlUHJvdG90
eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgdmFyIG9iaiwgdHVwbGUsIGtleSwgc3Jj
LCBwYXRoczsKLQotICBwYXRocyA9IHRoaXMuX3BhdGhzOwotICBpZiAocGF0aHNbcGF0aF0gPiAw
KSB7IHBhdGhzW3BhdGhdLS07IH0KLQotICBvYmogPSB0aGlzLnZhbHVlKCk7Ci0gIHR1cGxlID0g
bm9ybWFsaXplVHVwbGUob2JqLCBwYXRoKTsKLSAgaWYgKHR1cGxlWzBdID09PSBvYmopIHsKLSAg
ICBwYXRoID0gdHVwbGVbMV07Ci0gICAga2V5ICA9IGZpcnN0S2V5KHBhdGgpOwotICAgIHBhdGgg
PSBwYXRoLnNsaWNlKGtleS5sZW5ndGgrMSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JjICA9IHR1cGxl
WzBdOwotICAgIGtleSAgPSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7Ci0g
ICAgcGF0aCA9IHR1cGxlWzFdOwotICB9Ci0KLSAgdHVwbGUubGVuZ3RoID0gMDsKLSAgdGhpcy51
bmNoYWluKGtleSwgcGF0aCk7Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUuY291bnQgPSAwOwot
Ci1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW4gPSBmdW5jdGlvbihrZXksIHBhdGgsIHNyYykgewot
ICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zLCBub2RlOwotICBpZiAoIWNoYWlucykgeyBjaGFp
bnMgPSB0aGlzLl9jaGFpbnMgPSB7fTsgfQotCi0gIG5vZGUgPSBjaGFpbnNba2V5XTsKLSAgaWYg
KCFub2RlKSB7IG5vZGUgPSBjaGFpbnNba2V5XSA9IG5ldyBDaGFpbk5vZGUodGhpcywga2V5LCBz
cmMpOyB9Ci0gIG5vZGUuY291bnQrKzsgLy8gY291bnQgY2hhaW5zLi4uCi0KLSAgLy8gY2hhaW4g
cmVzdCBvZiBwYXRoIGlmIHRoZXJlIGlzIG9uZQotICBpZiAocGF0aCAmJiBwYXRoLmxlbmd0aD4w
KSB7Ci0gICAga2V5ID0gZmlyc3RLZXkocGF0aCk7Ci0gICAgcGF0aCA9IHBhdGguc2xpY2Uoa2V5
Lmxlbmd0aCsxKTsKLSAgICBub2RlLmNoYWluKGtleSwgcGF0aCk7IC8vIE5PVEU6IG5vIHNyYyBt
ZWFucyBpdCB3aWxsIG9ic2VydmUgY2hhbmdlcy4uLgotICB9Ci19OwotCi1DaGFpbk5vZGVQcm90
b3R5cGUudW5jaGFpbiA9IGZ1bmN0aW9uKGtleSwgcGF0aCkgewotICB2YXIgY2hhaW5zID0gdGhp
cy5fY2hhaW5zLCBub2RlID0gY2hhaW5zW2tleV07Ci0KLSAgLy8gdW5jaGFpbiByZXN0IG9mIHBh
dGggZmlyc3QuLi4KLSAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGg+MSkgewotICAgIGtleSAgPSBm
aXJzdEtleShwYXRoKTsKLSAgICBwYXRoID0gcGF0aC5zbGljZShrZXkubGVuZ3RoKzEpOwotICAg
IG5vZGUudW5jaGFpbihrZXksIHBhdGgpOwotICB9Ci0KLSAgLy8gZGVsZXRlIG5vZGUgaWYgbmVl
ZGVkLgotICBub2RlLmNvdW50LS07Ci0gIGlmIChub2RlLmNvdW50PD0wKSB7Ci0gICAgZGVsZXRl
IGNoYWluc1tub2RlLl9rZXldOwotICAgIG5vZGUuZGVzdHJveSgpOwotICB9Ci0KLX07Ci0KLUNo
YWluTm9kZVByb3RvdHlwZS53aWxsQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnRzKSB7Ci0gIHZhciBj
aGFpbnMgPSB0aGlzLl9jaGFpbnM7Ci0gIGlmIChjaGFpbnMpIHsKLSAgICBmb3IodmFyIGtleSBp
biBjaGFpbnMpIHsKLSAgICAgIGlmICghY2hhaW5zLmhhc093blByb3BlcnR5KGtleSkpIHsgY29u
dGludWU7IH0KLSAgICAgIGNoYWluc1trZXldLndpbGxDaGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0g
IH0KLQotICBpZiAodGhpcy5fcGFyZW50KSB7IHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2Uo
dGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9Ci19OwotCi1DaGFpbk5vZGVQcm90b3R5cGUu
Y2hhaW5XaWxsQ2hhbmdlID0gZnVuY3Rpb24oY2hhaW4sIHBhdGgsIGRlcHRoLCBldmVudHMpIHsK
LSAgaWYgKHRoaXMuX2tleSkgeyBwYXRoID0gdGhpcy5fa2V5ICsgJy4nICsgcGF0aDsgfQotCi0g
IGlmICh0aGlzLl9wYXJlbnQpIHsKLSAgICB0aGlzLl9wYXJlbnQuY2hhaW5XaWxsQ2hhbmdlKHRo
aXMsIHBhdGgsIGRlcHRoKzEsIGV2ZW50cyk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGRlcHRoID4g
MSkgewotICAgICAgZXZlbnRzLnB1c2godGhpcy52YWx1ZSgpLCBwYXRoKTsKLSAgICB9Ci0gICAg
cGF0aCA9ICd0aGlzLicgKyBwYXRoOwotICAgIGlmICh0aGlzLl9wYXRoc1twYXRoXSA+IDApIHsK
LSAgICAgIGV2ZW50cy5wdXNoKHRoaXMudmFsdWUoKSwgcGF0aCk7Ci0gICAgfQotICB9Ci19Owot
Ci1DaGFpbk5vZGVQcm90b3R5cGUuY2hhaW5EaWRDaGFuZ2UgPSBmdW5jdGlvbihjaGFpbiwgcGF0
aCwgZGVwdGgsIGV2ZW50cykgewotICBpZiAodGhpcy5fa2V5KSB7IHBhdGggPSB0aGlzLl9rZXkg
KyAnLicgKyBwYXRoOyB9Ci0gIGlmICh0aGlzLl9wYXJlbnQpIHsKLSAgICB0aGlzLl9wYXJlbnQu
Y2hhaW5EaWRDaGFuZ2UodGhpcywgcGF0aCwgZGVwdGgrMSwgZXZlbnRzKTsKLSAgfSBlbHNlIHsK
LSAgICBpZiAoZGVwdGggPiAxKSB7Ci0gICAgICBldmVudHMucHVzaCh0aGlzLnZhbHVlKCksIHBh
dGgpOwotICAgIH0KLSAgICBwYXRoID0gJ3RoaXMuJyArIHBhdGg7Ci0gICAgaWYgKHRoaXMuX3Bh
dGhzW3BhdGhdID4gMCkgewotICAgICAgZXZlbnRzLnB1c2godGhpcy52YWx1ZSgpLCBwYXRoKTsK
LSAgICB9Ci0gIH0KLX07Ci0KLUNoYWluTm9kZVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlv
bihldmVudHMpIHsKLSAgLy8gaW52YWxpZGF0ZSBteSBvd24gdmFsdWUgZmlyc3QuCi0gIGlmICh0
aGlzLl93YXRjaGluZykgewotICAgIHZhciBvYmogPSB0aGlzLl9wYXJlbnQudmFsdWUoKTsKLSAg
ICBpZiAob2JqICE9PSB0aGlzLl9vYmplY3QpIHsKLSAgICAgIHJlbW92ZUNoYWluV2F0Y2hlcih0
aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7Ci0gICAgICB0aGlzLl9vYmplY3QgPSBvYmo7
Ci0gICAgICBhZGRDaGFpbldhdGNoZXIob2JqLCB0aGlzLl9rZXksIHRoaXMpOwotICAgIH0KLSAg
ICB0aGlzLl92YWx1ZSAgPSB1bmRlZmluZWQ7Ci0KLSAgICAvLyBTcGVjaWFsLWNhc2U6IHRoZSBF
YWNoUHJveHkgcmVsaWVzIG9uIGltbWVkaWF0ZSBldmFsdWF0aW9uIHRvCi0gICAgLy8gZXN0YWJs
aXNoIGl0cyBvYnNlcnZlcnMuCi0gICAgaWYgKHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQu
X2tleSA9PT0gJ0BlYWNoJykKLSAgICAgIHRoaXMudmFsdWUoKTsKLSAgfQotCi0gIC8vIHRoZW4g
bm90aWZ5IGNoYWlucy4uLgotICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zOwotICBpZiAoY2hh
aW5zKSB7Ci0gICAgZm9yKHZhciBrZXkgaW4gY2hhaW5zKSB7Ci0gICAgICBpZiAoIWNoYWlucy5o
YXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVlOyB9Ci0gICAgICBjaGFpbnNba2V5XS5kaWRD
aGFuZ2UoZXZlbnRzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiBubyBldmVudHMgYXJlIHBhc3Nl
ZCBpbiB0aGVuIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgYWJvdmUgd2lyaW5nIHVwZGF0ZQotICBp
ZiAoZXZlbnRzID09PSBudWxsKSB7IHJldHVybjsgfQotCi0gIC8vIGFuZCBmaW5hbGx5IHRlbGwg
cGFyZW50IGFib3V0IG15IHBhdGggY2hhbmdpbmcuLi4KLSAgaWYgKHRoaXMuX3BhcmVudCkgeyB0
aGlzLl9wYXJlbnQuY2hhaW5EaWRDaGFuZ2UodGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9
Ci19OwotCi1FbWJlci5maW5pc2hDaGFpbnMgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG0gPSBt
ZXRhRm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBtLmNoYWluczsKLSAgaWYgKGNoYWlucykgewot
ICAgIGlmIChjaGFpbnMudmFsdWUoKSAhPT0gb2JqKSB7Ci0gICAgICBtLmNoYWlucyA9IGNoYWlu
cyA9IGNoYWlucy5jb3B5KG9iaik7Ci0gICAgfQotICAgIGNoYWlucy5kaWRDaGFuZ2UobnVsbCk7
Ci0gIH0KLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0o
ZnVuY3Rpb24oKSB7Ci12YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsIC8vIHV0aWxzLmpzCi0gICAg
dHlwZU9mID0gRW1iZXIudHlwZU9mLCAvLyB1dGlscy5qcwotICAgIENoYWluTm9kZSA9IEVtYmVy
Ll9DaGFpbk5vZGU7IC8vIGNoYWlucy5qcwotCi0vLyBnZXQgdGhlIGNoYWlucyBmb3IgdGhlIGN1
cnJlbnQgb2JqZWN0LiBJZiB0aGUgY3VycmVudCBvYmplY3QgaGFzCi0vLyBjaGFpbnMgaW5oZXJp
dGVkIGZyb20gdGhlIHByb3RvIHRoZXkgd2lsbCBiZSBjbG9uZWQgYW5kIHJlY29uZmlndXJlZCBm
b3IKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLWZ1bmN0aW9uIGNoYWluc0ZvcihvYmopIHsKLSAg
dmFyIG0gPSBtZXRhRm9yKG9iaiksIHJldCA9IG0uY2hhaW5zOwotICBpZiAoIXJldCkgewotICAg
IHJldCA9IG0uY2hhaW5zID0gbmV3IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopOwotICB9IGVs
c2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmopIHsKLSAgICByZXQgPSBtLmNoYWlucyA9IHJldC5j
b3B5KG9iaik7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotRW1iZXIud2F0Y2hQYXRoID0gZnVu
Y3Rpb24ob2JqLCBrZXlQYXRoKSB7Ci0gIC8vIGNhbid0IHdhdGNoIGxlbmd0aCBvbiBBcnJheSAt
IGl0IGlzIHNwZWNpYWwuLi4KLSAgaWYgKGtleVBhdGggPT09ICdsZW5ndGgnICYmIHR5cGVPZihv
YmopID09PSAnYXJyYXknKSB7IHJldHVybjsgfQotCi0gIHZhciBtID0gbWV0YUZvcihvYmopLCB3
YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYgKCF3YXRjaGluZ1trZXlQYXRoXSkgeyAvLyBh
Y3RpdmF0ZSB3YXRjaGluZyBmaXJzdCB0aW1lCi0gICAgd2F0Y2hpbmdba2V5UGF0aF0gPSAxOwot
ICAgIGNoYWluc0ZvcihvYmopLmFkZChrZXlQYXRoKTsKLSAgfSBlbHNlIHsKLSAgICB3YXRjaGlu
Z1trZXlQYXRoXSA9ICh3YXRjaGluZ1trZXlQYXRoXSB8fCAwKSArIDE7Ci0gIH0KLX07Ci0KLUVt
YmVyLnVud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2JqLCBrZXlQYXRoKSB7Ci0gIHZhciBtID0gbWV0
YUZvcihvYmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7Ci0KLSAgaWYgKHdhdGNoaW5nW2tleVBh
dGhdID09PSAxKSB7Ci0gICAgd2F0Y2hpbmdba2V5UGF0aF0gPSAwOwotICAgIGNoYWluc0Zvcihv
YmopLnJlbW92ZShrZXlQYXRoKTsKLSAgfSBlbHNlIGlmICh3YXRjaGluZ1trZXlQYXRoXSA+IDEp
IHsKLSAgICB3YXRjaGluZ1trZXlQYXRoXS0tOwotICB9Ci19OwotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIG1ldGFGb3IgPSBF
bWJlci5tZXRhLCAvLyB1dGlscy5qcwotICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9LRVksIC8v
IHV0aWxzLmpzCi0gICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwgLy8gdXRpbHMuanMKLSAg
ICByZW1vdmVDaGFpbldhdGNoZXIgPSBFbWJlci5yZW1vdmVDaGFpbldhdGNoZXIsCi0gICAgd2F0
Y2hLZXkgPSBFbWJlci53YXRjaEtleSwgLy8gd2F0Y2hfa2V5LmpzCi0gICAgdW53YXRjaEtleSA9
IEVtYmVyLnVud2F0Y2hLZXksCi0gICAgd2F0Y2hQYXRoID0gRW1iZXIud2F0Y2hQYXRoLCAvLyB3
YXRjaF9wYXRoLmpzCi0gICAgdW53YXRjaFBhdGggPSBFbWJlci51bndhdGNoUGF0aCwKLSAgICB0
eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxzLmpzCi0gICAgZ2VuZXJhdGVHdWlkID0gRW1i
ZXIuZ2VuZXJhdGVHdWlkLAotICAgIElTX1BBVEggPSAvW1wuXCpdLzsKLQotLy8gcmV0dXJucyB0
cnVlIGlmIHRoZSBwYXNzZWQgcGF0aCBpcyBqdXN0IGEga2V5TmFtZQotZnVuY3Rpb24gaXNLZXlO
YW1lKHBhdGgpIHsKLSAgcmV0dXJuIHBhdGg9PT0nKicgfHwgIUlTX1BBVEgudGVzdChwYXRoKTsK
LX0KLQotLyoqCi0gIFN0YXJ0cyB3YXRjaGluZyBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gV2hl
bmV2ZXIgdGhlIHByb3BlcnR5IGNoYW5nZXMsCi0gIGludm9rZXMgYEVtYmVyLnByb3BlcnR5V2ls
bENoYW5nZWAgYW5kIGBFbWJlci5wcm9wZXJ0eURpZENoYW5nZWAuIFRoaXMgaXMgdGhlCi0gIHBy
aW1pdGl2ZSB1c2VkIGJ5IG9ic2VydmVycyBhbmQgZGVwZW5kZW50IGtleXM7IHVzdWFsbHkgeW91
IHdpbGwgbmV2ZXIgY2FsbAotICB0aGlzIG1ldGhvZCBkaXJlY3RseSBidXQgaW5zdGVhZCB1c2Ug
aGlnaGVyIGxldmVsIG1ldGhvZHMgbGlrZQotICBgRW1iZXIuYWRkT2JzZXJ2ZXIoKWAKLQotICBA
cHJpdmF0ZQotICBAbWV0aG9kIHdhdGNoCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIG9iagotICBA
cGFyYW0ge1N0cmluZ30ga2V5TmFtZQotKi8KLUVtYmVyLndhdGNoID0gZnVuY3Rpb24ob2JqLCBf
a2V5UGF0aCkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkgLSBpdCBpcyBzcGVj
aWFsLi4uCi0gIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9mKG9iaikgPT09ICdh
cnJheScpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsKLSAgICB3
YXRjaEtleShvYmosIF9rZXlQYXRoKTsKLSAgfSBlbHNlIHsKLSAgICB3YXRjaFBhdGgob2JqLCBf
a2V5UGF0aCk7Ci0gIH0KLX07Ci0KLUVtYmVyLmlzV2F0Y2hpbmcgPSBmdW5jdGlvbiBpc1dhdGNo
aW5nKG9iaiwga2V5KSB7Ci0gIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXTsKLSAgcmV0dXJuICht
ZXRhICYmIG1ldGEud2F0Y2hpbmdba2V5XSkgPiAwOwotfTsKLQotRW1iZXIud2F0Y2guZmx1c2hQ
ZW5kaW5nID0gRW1iZXIuZmx1c2hQZW5kaW5nQ2hhaW5zOwotCi1FbWJlci51bndhdGNoID0gZnVu
Y3Rpb24ob2JqLCBfa2V5UGF0aCkgewotICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJyYXkg
LSBpdCBpcyBzcGVjaWFsLi4uCi0gIGlmIChfa2V5UGF0aCA9PT0gJ2xlbmd0aCcgJiYgdHlwZU9m
KG9iaikgPT09ICdhcnJheScpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKGlzS2V5TmFtZShfa2V5UGF0
aCkpIHsKLSAgICB1bndhdGNoS2V5KG9iaiwgX2tleVBhdGgpOwotICB9IGVsc2UgewotICAgIHVu
d2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgpOwotICB9Ci19OwotCi0vKioKLSAgQ2FsbCBvbiBhbiBv
YmplY3Qgd2hlbiB5b3UgZmlyc3QgYmVnZXQgaXQgZnJvbSBhbm90aGVyIG9iamVjdC4gVGhpcyB3
aWxsCi0gIHNldHVwIGFueSBjaGFpbmVkIHdhdGNoZXJzIG9uIHRoZSBvYmplY3QgaW5zdGFuY2Ug
YXMgbmVlZGVkLiBUaGlzIG1ldGhvZCBpcwotICBzYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMu
Ci0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCByZXdhdGNoCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IG9iagotKi8KLUVtYmVyLnJld2F0Y2ggPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG0gPSBtZXRh
Rm9yKG9iaiwgZmFsc2UpLCBjaGFpbnMgPSBtLmNoYWluczsKLQotICAvLyBtYWtlIHN1cmUgdGhl
IG9iamVjdCBoYXMgaXRzIG93biBndWlkLgotICBpZiAoR1VJRF9LRVkgaW4gb2JqICYmICFvYmou
aGFzT3duUHJvcGVydHkoR1VJRF9LRVkpKSB7Ci0gICAgZ2VuZXJhdGVHdWlkKG9iaik7Ci0gIH0K
LQotICAvLyBtYWtlIHN1cmUgYW55IGNoYWluZWQgd2F0Y2hlcnMgdXBkYXRlLgotICBpZiAoY2hh
aW5zICYmIGNoYWlucy52YWx1ZSgpICE9PSBvYmopIHsKLSAgICBtLmNoYWlucyA9IGNoYWlucy5j
b3B5KG9iaik7Ci0gIH0KLX07Ci0KLXZhciBOT0RFX1NUQUNLID0gW107Ci0KLS8qKgotICBUZWFy
cyBkb3duIHRoZSBtZXRhIG9uIGFuIG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBnYXJiYWdlIGNv
bGxlY3RlZC4KLSAgTXVsdGlwbGUgY2FsbHMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQotICBAbWV0
aG9kIGRlc3Ryb3kKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqICB0aGUgb2Jq
ZWN0IHRvIGRlc3Ryb3kKLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5kZXN0cm95ID0gZnVu
Y3Rpb24gKG9iaikgewotICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sIG5vZGUsIG5vZGVzLCBr
ZXksIG5vZGVPYmplY3Q7Ci0gIGlmIChtZXRhKSB7Ci0gICAgb2JqW01FVEFfS0VZXSA9IG51bGw7
Ci0gICAgLy8gcmVtb3ZlIGNoYWluV2F0Y2hlcnMgdG8gcmVtb3ZlIGNpcmN1bGFyIHJlZmVyZW5j
ZXMgdGhhdCB3b3VsZCBwcmV2ZW50IEdDCi0gICAgbm9kZSA9IG1ldGEuY2hhaW5zOwotICAgIGlm
IChub2RlKSB7Ci0gICAgICBOT0RFX1NUQUNLLnB1c2gobm9kZSk7Ci0gICAgICAvLyBwcm9jZXNz
IHRyZWUKLSAgICAgIHdoaWxlIChOT0RFX1NUQUNLLmxlbmd0aCA+IDApIHsKLSAgICAgICAgbm9k
ZSA9IE5PREVfU1RBQ0sucG9wKCk7Ci0gICAgICAgIC8vIHB1c2ggY2hpbGRyZW4KLSAgICAgICAg
bm9kZXMgPSBub2RlLl9jaGFpbnM7Ci0gICAgICAgIGlmIChub2RlcykgewotICAgICAgICAgIGZv
ciAoa2V5IGluIG5vZGVzKSB7Ci0gICAgICAgICAgICBpZiAobm9kZXMuaGFzT3duUHJvcGVydHko
a2V5KSkgewotICAgICAgICAgICAgICBOT0RFX1NUQUNLLnB1c2gobm9kZXNba2V5XSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbW92ZSBjaGFp
bldhdGNoZXIgaW4gbm9kZSBvYmplY3QKLSAgICAgICAgaWYgKG5vZGUuX3dhdGNoaW5nKSB7Ci0g
ICAgICAgICAgbm9kZU9iamVjdCA9IG5vZGUuX29iamVjdDsKLSAgICAgICAgICBpZiAobm9kZU9i
amVjdCkgewotICAgICAgICAgICAgcmVtb3ZlQ2hhaW5XYXRjaGVyKG5vZGVPYmplY3QsIG5vZGUu
X2tleSwgbm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9
Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyLW1l
dGFsCi0qLwotCi1FbWJlci53YXJuKCJUaGUgQ1BfREVGQVVMVF9DQUNIRUFCTEUgZmxhZyBoYXMg
YmVlbiByZW1vdmVkIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgY2FjaGVkIGJ5
IGRlZmF1bHQuIFVzZSBgdm9sYXRpbGVgIGlmIHlvdSBkb24ndCB3YW50IGNhY2hpbmcuIiwgRW1i
ZXIuRU5WLkNQX0RFRkFVTFRfQ0FDSEVBQkxFICE9PSBmYWxzZSk7Ci0KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgbWV0YUZvciA9IEVtYmVyLm1ldGEs
Ci0gICAgYV9zbGljZSA9IFtdLnNsaWNlLAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAot
ICAgIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCi0gICAgd2F0Y2ggPSBFbWJlci53YXRjaCwK
LSAgICB1bndhdGNoID0gRW1iZXIudW53YXRjaDsKLQotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBERVBFTkRFTlQgS0VZ
UwotLy8KLQotLy8gZGF0YSBzdHJ1Y3R1cmU6Ci0vLyAgbWV0YS5kZXBzID0gewotLy8gICAnZGVw
S2V5JzogewotLy8gICAgICdrZXlOYW1lJzogY291bnQsCi0vLyAgIH0KLS8vICB9Ci0KLS8qCi0g
IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hcCBvZiB1bmlxdWUgZGVwZW5kZW5jaWVzIGZvciBh
Ci0gIGdpdmVuIG9iamVjdCBhbmQga2V5LgotKi8KLWZ1bmN0aW9uIGtleXNGb3JEZXAoZGVwc01l
dGEsIGRlcEtleSkgewotICB2YXIga2V5cyA9IGRlcHNNZXRhW2RlcEtleV07Ci0gIGlmICgha2V5
cykgewotICAgIC8vIGlmIHRoZXJlIGFyZSBubyBkZXBlbmRlbmNpZXMgeWV0IGZvciBhIHRoZSBn
aXZlbiBrZXkKLSAgICAvLyBjcmVhdGUgYSBuZXcgZW1wdHkgbGlzdCBvZiBkZXBlbmRlbmNpZXMg
Zm9yIHRoZSBrZXkKLSAgICBrZXlzID0gZGVwc01ldGFbZGVwS2V5XSA9IHt9OwotICB9IGVsc2Ug
aWYgKCFkZXBzTWV0YS5oYXNPd25Qcm9wZXJ0eShkZXBLZXkpKSB7Ci0gICAgLy8gb3RoZXJ3aXNl
IGlmIHRoZSBkZXBlbmRlbmN5IGxpc3QgaXMgaW5oZXJpdGVkIGZyb20KLSAgICAvLyBhIHN1cGVy
Y2xhc3MsIGNsb25lIHRoZSBoYXNoCi0gICAga2V5cyA9IGRlcHNNZXRhW2RlcEtleV0gPSBvX2Ny
ZWF0ZShrZXlzKTsKLSAgfQotICByZXR1cm4ga2V5czsKLX0KLQotZnVuY3Rpb24gbWV0YUZvckRl
cHMobWV0YSkgewotICByZXR1cm4ga2V5c0ZvckRlcChtZXRhLCAnZGVwcycpOwotfQotCi1mdW5j
dGlvbiBhZGREZXBlbmRlbnRLZXlzKGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgewotICAvLyB0
aGUgZGVzY3JpcHRvciBoYXMgYSBsaXN0IG9mIGRlcGVuZGVudCBrZXlzLCBzbwotICAvLyBhZGQg
YWxsIG9mIGl0cyBkZXBlbmRlbnQga2V5cy4KLSAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRl
bnRLZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4sIGRlcEtleSwga2V5czsKLSAgaWYgKCFkZXBLZXlz
KSByZXR1cm47Ci0KLSAgZGVwc01ldGEgPSBtZXRhRm9yRGVwcyhtZXRhKTsKLQotICBmb3IoaWR4
ID0gMCwgbGVuID0gZGVwS2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICBkZXBL
ZXkgPSBkZXBLZXlzW2lkeF07Ci0gICAgLy8gTG9va3VwIGtleXMgbWV0YSBmb3IgZGVwS2V5Ci0g
ICAga2V5cyA9IGtleXNGb3JEZXAoZGVwc01ldGEsIGRlcEtleSk7Ci0gICAgLy8gSW5jcmVtZW50
IHRoZSBudW1iZXIgb2YgdGltZXMgZGVwS2V5IGRlcGVuZHMgb24ga2V5TmFtZS4KLSAgICBrZXlz
W2tleU5hbWVdID0gKGtleXNba2V5TmFtZV0gfHwgMCkgKyAxOwotICAgIC8vIFdhdGNoIHRoZSBk
ZXBLZXkKLSAgICB3YXRjaChvYmosIGRlcEtleSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gcmVtb3Zl
RGVwZW5kZW50S2V5cyhkZXNjLCBvYmosIGtleU5hbWUsIG1ldGEpIHsKLSAgLy8gdGhlIGRlc2Ny
aXB0b3IgaGFzIGEgbGlzdCBvZiBkZXBlbmRlbnQga2V5cywgc28KLSAgLy8gYWRkIGFsbCBvZiBp
dHMgZGVwZW5kZW50IGtleXMuCi0gIHZhciBkZXBLZXlzID0gZGVzYy5fZGVwZW5kZW50S2V5cywg
ZGVwc01ldGEsIGlkeCwgbGVuLCBkZXBLZXksIGtleXM7Ci0gIGlmICghZGVwS2V5cykgcmV0dXJu
OwotCi0gIGRlcHNNZXRhID0gbWV0YUZvckRlcHMobWV0YSk7Ci0KLSAgZm9yKGlkeCA9IDAsIGxl
biA9IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgZGVwS2V5ID0gZGVw
S2V5c1tpZHhdOwotICAgIC8vIExvb2t1cCBrZXlzIG1ldGEgZm9yIGRlcEtleQotICAgIGtleXMg
PSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkpOwotICAgIC8vIEluY3JlbWVudCB0aGUgbnVt
YmVyIG9mIHRpbWVzIGRlcEtleSBkZXBlbmRzIG9uIGtleU5hbWUuCi0gICAga2V5c1trZXlOYW1l
XSA9IChrZXlzW2tleU5hbWVdIHx8IDApIC0gMTsKLSAgICAvLyBXYXRjaCB0aGUgZGVwS2V5Ci0g
ICAgdW53YXRjaChvYmosIGRlcEtleSk7Ci0gIH0KLX0KLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQ09NUFVURUQgUFJP
UEVSVFkKLS8vCi0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRyYW5zZm9ybXMgYW4gb2Jq
ZWN0cyBmdW5jdGlvbiBpbnRvIGEgcHJvcGVydHkuCi0KLSAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rp
b24gYmFja2luZyB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGNhbGxlZAotICBv
bmNlIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLiBZb3UgY2FuIHNwZWNpZnkgdmFyaW91
cyBwcm9wZXJ0aWVzCi0gIHRoYXQgeW91ciBjb21wdXRlZCBwcm9wZXJ0eSBpcyBkZXBlbmRlbnQg
b24uIFRoaXMgd2lsbCBmb3JjZSB0aGUgY2FjaGVkCi0gIHJlc3VsdCB0byBiZSByZWNvbXB1dGVk
IGlmIHRoZSBkZXBlbmRlbmNpZXMgYXJlIG1vZGlmaWVkLgotCi0gIEluIHRoZSBmb2xsb3dpbmcg
ZXhhbXBsZSB3ZSBkZWNsYXJlIGEgY29tcHV0ZWQgcHJvcGVydHkgKGJ5IGNhbGxpbmcKLSAgYC5w
cm9wZXJ0eSgpYCBvbiB0aGUgZnVsbE5hbWUgZnVuY3Rpb24pIGFuZCBzZXR1cCB0aGUgcHJvcGVy
dGllcwotICBkZXBlbmRlbmNpZXMgKGRlcGVuZGluZyBvbiBmaXJzdE5hbWUgYW5kIGxhc3ROYW1l
KS4gVGhlIGZ1bGxOYW1lIGZ1bmN0aW9uCi0gIHdpbGwgYmUgY2FsbGVkIG9uY2UgKHJlZ2FyZGxl
c3Mgb2YgaG93IG1hbnkgdGltZXMgaXQgaXMgYWNjZXNzZWQpIGFzIGxvbmcKLSAgYXMgaXQncyBk
ZXBlbmRlbmNpZXMgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkLiBPbmNlIGZpcnN0TmFtZSBvciBsYXN0
TmFtZSBhcmUgdXBkYXRlZAotICBhbnkgZnV0dXJlIGNhbGxzIChvciBhbnl0aGluZyBib3VuZCkg
dG8gZnVsbE5hbWUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgbmV3Ci0gIHZhbHVlcy4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIFBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIC8vIHRoZXNl
IHdpbGwgYmUgc3VwcGxpZWQgYnkgYGNyZWF0ZWAKLSAgICBmaXJzdE5hbWU6IG51bGwsCi0gICAg
bGFzdE5hbWU6IG51bGwsCi0KLSAgICBmdWxsTmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIg
Zmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOwotICAgICAgdmFyIGxhc3ROYW1lID0g
dGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxh
c3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwot
Ci0gIHZhciB0b20gPSBQZXJzb24uY3JlYXRlKHsKLSAgICBmaXJzdE5hbWU6ICJUb20iLAotICAg
IGxhc3ROYW1lOiAiRGFsZSIKLSAgfSk7Ci0KLSAgdG9tLmdldCgnZnVsbE5hbWUnKSAvLyAiVG9t
IERhbGUiCi0gIGBgYAotCi0gIFlvdSBjYW4gYWxzbyBkZWZpbmUgd2hhdCBFbWJlciBzaG91bGQg
ZG8gd2hlbiBzZXR0aW5nIGEgY29tcHV0ZWQgcHJvcGVydHkuCi0gIElmIHlvdSB0cnkgdG8gc2V0
IGEgY29tcHV0ZWQgcHJvcGVydHksIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBrZXkgYW5k
Ci0gIHZhbHVlIHlvdSB3YW50IHRvIHNldCBpdCB0by4gWW91IGNhbiBhbHNvIGFjY2VwdCB0aGUg
cHJldmlvdXMgdmFsdWUgYXMgdGhlCi0gIHRoaXJkIHBhcmFtZXRlci4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0KLSBQZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICAvLyB0aGVzZSB3aWxs
IGJlIHN1cHBsaWVkIGJ5IGBjcmVhdGVgCi0gICAgZmlyc3ROYW1lOiBudWxsLAotICAgIGxhc3RO
YW1lOiBudWxsLAotCi0gICAgZnVsbE5hbWU6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIG9sZFZhbHVl
KSB7Ci0gICAgICAvLyBnZXR0ZXIKLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7
Ci0gICAgICAgIHZhciBmaXJzdE5hbWUgPSB0aGlzLmdldCgnZmlyc3ROYW1lJyk7Ci0gICAgICAg
IHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwotCi0gICAgICAgIHJldHVybiBm
aXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTsKLQotICAgICAgLy8gc2V0dGVyCi0gICAgICB9IGVs
c2UgewotICAgICAgICB2YXIgbmFtZSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0KLSAgICAgICAgdGhp
cy5zZXQoJ2ZpcnN0TmFtZScsIG5hbWVbMF0pOwotICAgICAgICB0aGlzLnNldCgnbGFzdE5hbWUn
LCBuYW1lWzFdKTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgfS5wcm9w
ZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKLSAgfSk7Ci0KLSAgdmFyIHBlcnNvbiA9IFBl
cnNvbi5jcmVhdGUoKTsKLSAgcGVyc29uLnNldCgnZnVsbE5hbWUnLCAiUGV0ZXIgV2FnZW5ldCIp
OwotICBwZXJzb24uZ2V0KCdmaXJzdE5hbWUnKSAvLyBQZXRlcgotICBwZXJzb24uZ2V0KCdsYXN0
TmFtZScpIC8vIFdhZ2VuZXQKLSAgYGBgCi0KLSAgQGNsYXNzIENvbXB1dGVkUHJvcGVydHkKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5EZXNjcmlwdG9yCi0gIEBjb25zdHJ1
Y3RvcgotKi8KLWZ1bmN0aW9uIENvbXB1dGVkUHJvcGVydHkoZnVuYywgb3B0cykgewotICB0aGlz
LmZ1bmMgPSBmdW5jOwotCi0gIHRoaXMuX2NhY2hlYWJsZSA9IChvcHRzICYmIG9wdHMuY2FjaGVh
YmxlICE9PSB1bmRlZmluZWQpID8gb3B0cy5jYWNoZWFibGUgOiB0cnVlOwotICB0aGlzLl9kZXBl
bmRlbnRLZXlzID0gb3B0cyAmJiBvcHRzLmRlcGVuZGVudEtleXM7Ci0gIHRoaXMuX3JlYWRPbmx5
ID0gb3B0cyAmJiAob3B0cy5yZWFkT25seSAhPT0gdW5kZWZpbmVkIHx8ICEhb3B0cy5yZWFkT25s
eSk7Ci19Ci0KLUVtYmVyLkNvbXB1dGVkUHJvcGVydHkgPSBDb21wdXRlZFByb3BlcnR5OwotQ29t
cHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwotCi12YXIg
Q29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZSA9IENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlOwot
Ci0vKioKLSAgUHJvcGVydGllcyBhcmUgY2FjaGVhYmxlIGJ5IGRlZmF1bHQuIENvbXB1dGVkIHBy
b3BlcnR5IHdpbGwgYXV0b21hdGljYWxseQotICBjYWNoZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHlv
dXIgZnVuY3Rpb24gdW50aWwgb25lIG9mIHRoZSBkZXBlbmRlbnQga2V5cyBjaGFuZ2VzLgotCi0g
IENhbGwgYHZvbGF0aWxlKClgIHRvIHNldCBpdCBpbnRvIG5vbi1jYWNoZWQgbW9kZS4gV2hlbiBp
biB0aGlzIG1vZGUKLSAgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHdpbGwgbm90IGF1dG9tYXRpY2Fs
bHkgY2FjaGUgdGhlIHJldHVybiB2YWx1ZS4KLQotICBIb3dldmVyLCBpZiBhIHByb3BlcnR5IGlz
IHByb3Blcmx5IG9ic2VydmFibGUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkaXNhYmxlCi0gIGNh
Y2hpbmcuCi0KLSAgQG1ldGhvZCBjYWNoZWFibGUKLSAgQHBhcmFtIHtCb29sZWFufSBhRmxhZyBv
cHRpb25hbCBzZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGNhY2hpbmcKLSAgQHJldHVybiB7RW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gdGhpcwotICBAY2hhaW5hYmxlCi0qLwotQ29tcHV0ZWRQcm9w
ZXJ0eVByb3RvdHlwZS5jYWNoZWFibGUgPSBmdW5jdGlvbihhRmxhZykgewotICB0aGlzLl9jYWNo
ZWFibGUgPSBhRmxhZyAhPT0gZmFsc2U7Ci0gIHJldHVybiB0aGlzOwotfTsKLQotLyoqCi0gIENh
bGwgb24gYSBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byBub24tY2FjaGVkIG1vZGUu
IFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIG5vdCBhdXRv
bWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1cm4gdmFsdWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBN
eUFwcC5vdXRzaWRlU2VydmljZSA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHZhbHVlOiBm
dW5jdGlvbigpIHsKLSAgICAgIHJldHVybiBPdXRzaWRlU2VydmljZS5nZXRWYWx1ZSgpOwotICAg
IH0ucHJvcGVydHkoKS52b2xhdGlsZSgpCi0gIH0pLmNyZWF0ZSgpOwotICBgYGAKLQotICBAbWV0
aG9kIHZvbGF0aWxlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKLSAg
QGNoYWluYWJsZQotKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUudm9sYXRpbGUgPSBmdW5j
dGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuY2FjaGVhYmxlKGZhbHNlKTsKLX07Ci0KLS8qKgotICBD
YWxsIG9uIGEgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0IGl0IGludG8gcmVhZC1vbmx5IG1vZGUu
IFdoZW4gaW4gdGhpcwotICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3aWxsIHRocm93IGFu
IGVycm9yIHdoZW4gc2V0LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlBcHAuUGVyc29uID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgZ3VpZDogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4g
J2d1aWQtZ3VpZC1ndWlkJzsKLSAgICB9LnByb3BlcnR5KCkucmVhZE9ubHkoKQotICB9KTsKLQot
ICBNeUFwcC5wZXJzb24gPSBNeUFwcC5QZXJzb24uY3JlYXRlKCk7Ci0KLSAgTXlBcHAucGVyc29u
LnNldCgnZ3VpZCcsICduZXctZ3VpZCcpOyAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgotICBg
YGAKLQotICBAbWV0aG9kIHJlYWRPbmx5Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVy
dHl9IHRoaXMKLSAgQGNoYWluYWJsZQotKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUucmVh
ZE9ubHkgPSBmdW5jdGlvbihyZWFkT25seSkgewotICB0aGlzLl9yZWFkT25seSA9IHJlYWRPbmx5
ID09PSB1bmRlZmluZWQgfHwgISFyZWFkT25seTsKLSAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioK
LSAgU2V0cyB0aGUgZGVwZW5kZW50IGtleXMgb24gdGhpcyBjb21wdXRlZCBwcm9wZXJ0eS4gUGFz
cyBhbnkgbnVtYmVyIG9mCi0gIGFyZ3VtZW50cyBjb250YWluaW5nIGtleSBwYXRocyB0aGF0IHRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbi4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIE15
QXBwLlByZXNpZGVudCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGZ1bGxOYW1lOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1l
JykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKLQotICAgICAgLy8gVGVsbCBFbWJlciB0
aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5hbWUKLSAgICAgIC8v
IGFuZCBsYXN0TmFtZQotICAgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQot
ICB9KTsKLQotICBNeUFwcC5wcmVzaWRlbnQgPSBNeUFwcC5QcmVzaWRlbnQuY3JlYXRlKHsKLSAg
ICBmaXJzdE5hbWU6ICdCYXJhY2snLAotICAgIGxhc3ROYW1lOiAnT2JhbWEnLAotICB9KTsKLSAg
TXlBcHAucHJlc2lkZW50LmdldCgnZnVsbE5hbWUnKTsgLy8gQmFyYWNrIE9iYW1hCi0gIGBgYAot
Ci0gIEBtZXRob2QgcHJvcGVydHkKLSAgQHBhcmFtIHtTdHJpbmd9IHBhdGgqIHplcm8gb3IgbW9y
ZSBwcm9wZXJ0eSBwYXRocwotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlz
Ci0gIEBjaGFpbmFibGUKLSovCi1Db21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnByb3BlcnR5ID0g
ZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzOwotCi0gIAotICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzKTsKLSAgCi0KLSAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IGFyZ3M7Ci0gIHJldHVy
biB0aGlzOwotfTsKLQotLyoqCi0gIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBhbm5v
dGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGggYWRkaXRpb25hbAotICBtZXRhZGF0YSBhYm91
dCBob3cgdGhleSBmdW5jdGlvbiBvciB3aGF0IHZhbHVlcyB0aGV5IG9wZXJhdGUgb24uIEZvciBl
eGFtcGxlLAotICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgdmFy
aWFibGVzIHRoYXQgYXJlIHRoZW4gbm8gbG9uZ2VyCi0gIGF2YWlsYWJsZSBmb3IgaW50cm9zcGVj
dGlvbi4KLQotICBZb3UgY2FuIHBhc3MgYSBoYXNoIG9mIHRoZXNlIHZhbHVlcyB0byBhIGNvbXB1
dGVkIHByb3BlcnR5IGxpa2UgdGhpczoKLQotICBgYGAKLSAgcGVyc29uOiBmdW5jdGlvbigpIHsK
LSAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsKLSAgICByZXR1cm4gQXBw
LlBlcnNvbi5jcmVhdGUoeyBpZDogcGVyc29uSWQgfSk7Ci0gIH0ucHJvcGVydHkoKS5tZXRhKHsg
dHlwZTogQXBwLlBlcnNvbiB9KQotICBgYGAKLQotICBUaGUgaGFzaCB0aGF0IHlvdSBwYXNzIHRv
IHRoZSBgbWV0YSgpYCBmdW5jdGlvbiB3aWxsIGJlIHNhdmVkIG9uIHRoZQotICBjb21wdXRlZCBw
cm9wZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4gRW1iZXIgcnVudGltZQot
ICBleHBvc2VzIGEgcHVibGljIEFQSSBmb3IgcmV0cmlldmluZyB0aGVzZSB2YWx1ZXMgZnJvbSBj
bGFzc2VzLAotICB2aWEgdGhlIGBtZXRhRm9yUHJvcGVydHkoKWAgZnVuY3Rpb24uCi0KLSAgQG1l
dGhvZCBtZXRhCi0gIEBwYXJhbSB7SGFzaH0gbWV0YQotICBAY2hhaW5hYmxlCi0qLwotCi1Db21w
dXRlZFByb3BlcnR5UHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbihtZXRhKSB7Ci0gIGlmIChhcmd1
bWVudHMubGVuZ3RoID09PSAwKSB7Ci0gICAgcmV0dXJuIHRoaXMuX21ldGEgfHwge307Ci0gIH0g
ZWxzZSB7Ci0gICAgdGhpcy5fbWV0YSA9IG1ldGE7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX07
Ci0KLS8qIGltcGwgZGVzY3JpcHRvciBBUEkgKi8KLUNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUu
ZGlkQ2hhbmdlID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gIC8vIF9zdXNwZW5kZWQgaXMg
c2V0IHZpYSBhIENQLnNldCB0byBlbnN1cmUgd2UgZG9uJ3QgY2xlYXIKLSAgLy8gdGhlIGNhY2hl
ZCB2YWx1ZSBzZXQgYnkgdGhlIHNldHRlcgotICBpZiAodGhpcy5fY2FjaGVhYmxlICYmIHRoaXMu
X3N1c3BlbmRlZCAhPT0gb2JqKSB7Ci0gICAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7Ci0gICAg
aWYgKGtleU5hbWUgaW4gbWV0YS5jYWNoZSkgewotICAgICAgZGVsZXRlIG1ldGEuY2FjaGVba2V5
TmFtZV07Ci0gICAgICByZW1vdmVEZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0
YSk7Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlvbiBmaW5pc2hDaGFpbnMoY2hhaW5Ob2RlcykK
LXsKLSAgZm9yICh2YXIgaT0wLCBsPWNoYWluTm9kZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAg
IGNoYWluTm9kZXNbaV0uZGlkQ2hhbmdlKG51bGwpOwotICB9Ci19Ci0KLS8qKgotICBBY2Nlc3Mg
dGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBiYWNraW5nIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4K
LSAgSWYgdGhpcyBwcm9wZXJ0eSBoYXMgYWxyZWFkeSBiZWVuIGNhY2hlZCwgcmV0dXJuIHRoZSBj
YWNoZWQgcmVzdWx0LgotICBPdGhlcndpc2UsIGNhbGwgdGhlIGZ1bmN0aW9uIHBhc3NpbmcgdGhl
IHByb3BlcnR5IG5hbWUgYXMgYW4gYXJndW1lbnQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBQZXJz
b24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBmdWxsTmFtZTogZnVuY3Rpb24oa2V5TmFt
ZSkgewotICAgICAgLy8gdGhlIGtleU5hbWUgcGFyYW1ldGVyIGlzICdmdWxsTmFtZScgaW4gdGhp
cyBjYXNlLgotCi0gICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhp
cy5nZXQoJ2xhc3ROYW1lJyk7Ci0gICAgfS5wcm9wZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1l
JykKLSAgfSk7Ci0KLQotICB2YXIgdG9tID0gUGVyc29uLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1l
OiAiVG9tIiwKLSAgICBsYXN0TmFtZTogIkRhbGUiCi0gIH0pOwotCi0gIHRvbS5nZXQoJ2Z1bGxO
YW1lJykgLy8gIlRvbSBEYWxlIgotICBgYGAKLQotICBAbWV0aG9kIGdldAotICBAcGFyYW0ge1N0
cmluZ30ga2V5TmFtZSBUaGUga2V5IGJlaW5nIGFjY2Vzc2VkLgotICBAcmV0dXJuIHtPYmplY3R9
IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGJhY2tpbmcgdGhlIENQLgotKi8KLUNv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0g
IHZhciByZXQsIGNhY2hlLCBtZXRhLCBjaGFpbk5vZGVzOwotICBpZiAodGhpcy5fY2FjaGVhYmxl
KSB7Ci0gICAgbWV0YSA9IG1ldGFGb3Iob2JqKTsKLSAgICBjYWNoZSA9IG1ldGEuY2FjaGU7Ci0g
ICAgaWYgKGtleU5hbWUgaW4gY2FjaGUpIHsgcmV0dXJuIGNhY2hlW2tleU5hbWVdOyB9Ci0gICAg
cmV0ID0gY2FjaGVba2V5TmFtZV0gPSB0aGlzLmZ1bmMuY2FsbChvYmosIGtleU5hbWUpOwotICAg
IGNoYWluTm9kZXMgPSBtZXRhLmNoYWluV2F0Y2hlcnMgJiYgbWV0YS5jaGFpbldhdGNoZXJzW2tl
eU5hbWVdOwotICAgIGlmIChjaGFpbk5vZGVzKSB7IGZpbmlzaENoYWlucyhjaGFpbk5vZGVzKTsg
fQotICAgIGFkZERlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRhKTsKLSAgfSBl
bHNlIHsKLSAgICByZXQgPSB0aGlzLmZ1bmMuY2FsbChvYmosIGtleU5hbWUpOwotICB9Ci0gIHJl
dHVybiByZXQ7Ci19OwotCi0vKioKLSAgU2V0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3Bl
cnR5LiBJZiB0aGUgZnVuY3Rpb24gdGhhdCBiYWNrcyB5b3VyCi0gIGNvbXB1dGVkIHByb3BlcnR5
IGRvZXMgbm90IGFjY2VwdCBhcmd1bWVudHMgdGhlbiB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yCi0g
IHNldHRpbmcgd291bGQgYmUgdG8gZGVmaW5lIHRoZSBwcm9wZXJ0eSBvbiB0aGUgY3VycmVudCBv
YmplY3QsIGFuZCBzZXQKLSAgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUg
YmVpbmcgc2V0LgotCi0gIEdlbmVyYWxseSBzcGVha2luZyBpZiB5b3UgaW50ZW5kIGZvciB5b3Vy
IGNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIHNldAotICB5b3VyIGJhY2tpbmcgZnVuY3Rpb24gc2hv
dWxkIGFjY2VwdCBlaXRoZXIgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy4KLQotICBAbWV0aG9kIHNl
dAotICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUga2V5IGJlaW5nIGFjY2Vzc2VkLgotICBA
cGFyYW0ge09iamVjdH0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBiZWluZyBhc3NpZ25lZC4KLSAg
QHBhcmFtIHtTdHJpbmd9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgYmVpbmcgcmVwbGFjZWQuCi0g
IEByZXR1cm4ge09iamVjdH0gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYmFja2lu
ZyB0aGUgQ1AuCi0qLwotQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihv
YmosIGtleU5hbWUsIHZhbHVlKSB7Ci0gIHZhciBjYWNoZWFibGUgPSB0aGlzLl9jYWNoZWFibGUs
Ci0gICAgICBmdW5jID0gdGhpcy5mdW5jLAotICAgICAgbWV0YSA9IG1ldGFGb3Iob2JqLCBjYWNo
ZWFibGUpLAotICAgICAgd2F0Y2hlZCA9IG1ldGEud2F0Y2hpbmdba2V5TmFtZV0sCi0gICAgICBv
bGRTdXNwZW5kZWQgPSB0aGlzLl9zdXNwZW5kZWQsCi0gICAgICBoYWRDYWNoZWRWYWx1ZSA9IGZh
bHNlLAotICAgICAgY2FjaGUgPSBtZXRhLmNhY2hlLAotICAgICAgZnVuY0FyZ0xlbmd0aCwgY2Fj
aGVkVmFsdWUsIHJldDsKLQotICBpZiAodGhpcy5fcmVhZE9ubHkpIHsKLSAgICB0aHJvdyBuZXcg
RW1iZXIuRXJyb3IoJ0Nhbm5vdCBTZXQ6ICcgKyBrZXlOYW1lICsgJyBvbjogJyArIG9iai50b1N0
cmluZygpICk7Ci0gIH0KLQotICB0aGlzLl9zdXNwZW5kZWQgPSBvYmo7Ci0KLSAgdHJ5IHsKLQot
ICAgIGlmIChjYWNoZWFibGUgJiYgY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5TmFtZSkpIHsKLSAg
ICAgIGNhY2hlZFZhbHVlID0gY2FjaGVba2V5TmFtZV07Ci0gICAgICBoYWRDYWNoZWRWYWx1ZSA9
IHRydWU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIENQIGhhcyBiZWVuIHdyYXBwZWQu
IElmIGlmIGhhcywgdXNlIHRoZQotICAgIC8vIGxlbmd0aCBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0
aW9uLgotICAgIGZ1bmNBcmdMZW5ndGggPSAoZnVuYy53cmFwcGVkRnVuY3Rpb24gPyBmdW5jLndy
YXBwZWRGdW5jdGlvbi5sZW5ndGggOiBmdW5jLmxlbmd0aCk7Ci0KLSAgICAvLyBGb3IgYmFja3dh
cmRzLWNvbXBhdGliaWxpdHkgd2l0aCBjb21wdXRlZCBwcm9wZXJ0aWVzCi0gICAgLy8gdGhhdCBj
aGVjayBmb3IgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiB0byBkZXRlcm1pbmUgaWYKLSAgICAvLyB0
aGV5IGFyZSBiZWluZyBnZXQgb3Igc2V0LCBvbmx5IHBhc3MgdGhlIG9sZCBjYWNoZWQKLSAgICAv
LyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgb3B0cyBpbnRvIGEgdGhpcmQKLSAgICAv
LyBhcmd1bWVudC4KLSAgICBpZiAoZnVuY0FyZ0xlbmd0aCA9PT0gMykgewotICAgICAgcmV0ID0g
ZnVuYy5jYWxsKG9iaiwga2V5TmFtZSwgdmFsdWUsIGNhY2hlZFZhbHVlKTsKLSAgICB9IGVsc2Ug
aWYgKGZ1bmNBcmdMZW5ndGggPT09IDIpIHsKLSAgICAgIHJldCA9IGZ1bmMuY2FsbChvYmosIGtl
eU5hbWUsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgRW1iZXIuZGVmaW5lUHJvcGVydHko
b2JqLCBrZXlOYW1lLCBudWxsLCBjYWNoZWRWYWx1ZSk7Ci0gICAgICBFbWJlci5zZXQob2JqLCBr
ZXlOYW1lLCB2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGhhZENhY2hl
ZFZhbHVlICYmIGNhY2hlZFZhbHVlID09PSByZXQpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAod2F0
Y2hlZCkgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lKTsgfQotCi0gICAg
aWYgKGhhZENhY2hlZFZhbHVlKSB7Ci0gICAgICBkZWxldGUgY2FjaGVba2V5TmFtZV07Ci0gICAg
fQotCi0gICAgaWYgKGNhY2hlYWJsZSkgewotICAgICAgaWYgKCFoYWRDYWNoZWRWYWx1ZSkgewot
ICAgICAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5TmFtZSwgbWV0YSk7Ci0gICAg
ICB9Ci0gICAgICBjYWNoZVtrZXlOYW1lXSA9IHJldDsKLSAgICB9Ci0KLSAgICBpZiAod2F0Y2hl
ZCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUpOyB9Ci0gIH0gZmluYWxs
eSB7Ci0gICAgdGhpcy5fc3VzcGVuZGVkID0gb2xkU3VzcGVuZGVkOwotICB9Ci0gIHJldHVybiBy
ZXQ7Ci19OwotCi0vKiBjYWxsZWQgYmVmb3JlIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4gKi8KLUNv
bXB1dGVkUHJvcGVydHlQcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbihvYmosIGtleU5hbWUp
IHsKLSAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7Ci0KLSAgaWYgKGtleU5hbWUgaW4gbWV0YS5j
YWNoZSkgewotICAgIHJlbW92ZURlcGVuZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRh
KTsKLSAgfQotCi0gIGlmICh0aGlzLl9jYWNoZWFibGUpIHsgZGVsZXRlIG1ldGEuY2FjaGVba2V5
TmFtZV07IH0KLQotICByZXR1cm4gbnVsbDsgLy8gbm8gdmFsdWUgdG8gcmVzdG9yZQotfTsKLQot
Ci0vKioKLSAgVGhpcyBoZWxwZXIgcmV0dXJucyBhIG5ldyBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRo
YXQgd3JhcHMgdGhlIHBhc3NlZAotICBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbi4gWW91IGNh
biB1c2UgdGhpcyBoZWxwZXIgdG8gZGVmaW5lIHByb3BlcnRpZXMKLSAgd2l0aCBtaXhpbnMgb3Ig
dmlhIGBFbWJlci5kZWZpbmVQcm9wZXJ0eSgpYC4KLQotICBUaGUgZnVuY3Rpb24geW91IHBhc3Mg
d2lsbCBiZSB1c2VkIHRvIGJvdGggZ2V0IGFuZCBzZXQgcHJvcGVydHkgdmFsdWVzLgotICBUaGUg
ZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCB0d28gcGFyYW1ldGVycywga2V5IGFuZCB2YWx1ZS4gSWYg
dmFsdWUgaXMgbm90Ci0gIHVuZGVmaW5lZCB5b3Ugc2hvdWxkIHNldCB0aGUgdmFsdWUgZmlyc3Qu
IEluIGVpdGhlciBjYXNlIHJldHVybiB0aGUKLSAgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVy
dHkuCi0gIEBtZXRob2QgY29tcHV0ZWQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jIFRoZSBjb21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbi4KLSAgQHJldHVybiB7RW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eX0gcHJvcGVydHkgZGVzY3JpcHRvciBpbnN0YW5jZQotKi8KLUVtYmVy
LmNvbXB1dGVkID0gZnVuY3Rpb24oZnVuYykgewotICB2YXIgYXJnczsKLQotICBpZiAoYXJndW1l
bnRzLmxlbmd0aCA+IDEpIHsKLSAgICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwg
LTEpOwotICAgIGZ1bmMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF07Ci0gIH0KLQot
ICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKLSAgICB0aHJvdyBuZXcgRW1iZXIu
RXJyb3IoIkNvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYSBwcm9wZXJ0eSBmdW5j
dGlvbiIpOwotICB9Ci0KLSAgdmFyIGNwID0gbmV3IENvbXB1dGVkUHJvcGVydHkoZnVuYyk7Ci0K
LSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5hcHBseShjcCwgYXJncyk7Ci0gIH0KLQot
ICByZXR1cm4gY3A7Ci19OwotCi0vKioKLSAgUmV0dXJucyB0aGUgY2FjaGVkIHZhbHVlIGZvciBh
IHByb3BlcnR5LCBpZiBvbmUgZXhpc3RzLgotICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHBlZWtp
bmcgYXQgdGhlIHZhbHVlIG9mIGEgY29tcHV0ZWQKLSAgcHJvcGVydHkgdGhhdCBpcyBnZW5lcmF0
ZWQgbGF6aWx5LCB3aXRob3V0IGFjY2lkZW50YWxseSBjYXVzaW5nCi0gIGl0IHRvIGJlIGNyZWF0
ZWQuCi0KLSAgQG1ldGhvZCBjYWNoZUZvcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0
fSBvYmogdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB5b3Ugd2FudCB0byBjaGVjawotICBAcGFy
YW0ge1N0cmluZ30ga2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBjYWNoZWQgdmFs
dWUgeW91IHdhbnQKLSAgICB0byByZXR1cm4KLSAgQHJldHVybiB7T2JqZWN0fSB0aGUgY2FjaGVk
IHZhbHVlCi0qLwotRW1iZXIuY2FjaGVGb3IgPSBmdW5jdGlvbiBjYWNoZUZvcihvYmosIGtleSkg
ewotICB2YXIgY2FjaGUgPSBtZXRhRm9yKG9iaiwgZmFsc2UpLmNhY2hlOwotCi0gIGlmIChjYWNo
ZSAmJiBrZXkgaW4gY2FjaGUpIHsKLSAgICByZXR1cm4gY2FjaGVba2V5XTsKLSAgfQotfTsKLQot
ZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhzZWxmLCBwcm9wZXJ0eU5hbWVzKSB7Ci0gIHZhciByZXQg
PSB7fTsKLSAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsK
LSAgICByZXRbcHJvcGVydHlOYW1lc1tpXV0gPSBnZXQoc2VsZiwgcHJvcGVydHlOYW1lc1tpXSk7
Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVuY3Rpb24gcmVnaXN0ZXJDb21wdXRlZChuYW1l
LCBtYWNybykgewotICBFbWJlci5jb21wdXRlZFtuYW1lXSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtl
eSkgewotICAgIHZhciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gICAgcmV0dXJu
IEVtYmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4g
bWFjcm8uYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfSk7Ci0gIH07Ci19Ci0KLWZ1bmN0aW9uIHJl
Z2lzdGVyQ29tcHV0ZWRXaXRoUHJvcGVydGllcyhuYW1lLCBtYWNybykgewotICBFbWJlci5jb21w
dXRlZFtuYW1lXSA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBwcm9wZXJ0aWVzID0gYV9zbGljZS5j
YWxsKGFyZ3VtZW50cyk7Ci0KLSAgICB2YXIgY29tcHV0ZWQgPSBFbWJlci5jb21wdXRlZChmdW5j
dGlvbigpIHsKLSAgICAgIHJldHVybiBtYWNyby5hcHBseSh0aGlzLCBbZ2V0UHJvcGVydGllcyh0
aGlzLCBwcm9wZXJ0aWVzKV0pOwotICAgIH0pOwotCi0gICAgcmV0dXJuIGNvbXB1dGVkLnByb3Bl
cnR5LmFwcGx5KGNvbXB1dGVkLCBwcm9wZXJ0aWVzKTsKLSAgfTsKLX0KLQotLyoqCi0gIEEgY29t
cHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXBl
bmRlbnQKLSAgcHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwg
b3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQu
ZW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bwotICB1c2UgdGhlIGBhcnJheS5b
XWAgc3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRpb25zCi0g
IGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRlcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2
YXNjcmlwdAotICB2YXIgVG9Eb0xpc3QgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBkb25l
OiBFbWJlci5jb21wdXRlZC5lbXB0eSgndG9kb3MuW10nKSAvLyBkZXRlY3QgYXJyYXkgY2hhbmdl
cwotICB9KTsKLSAgdmFyIHRvZG9MaXN0ID0gVG9Eb0xpc3QuY3JlYXRlKHt0b2RvczogWydVbml0
IFRlc3QnLCAnRG9jdW1lbnRhdGlvbicsICdSZWxlYXNlJ119KTsKLSAgdG9kb0xpc3QuZ2V0KCdk
b25lJyk7IC8vIGZhbHNlCi0gIHRvZG9MaXN0LmdldCgndG9kb3MnKS5jbGVhcigpOyAvLyBbXQot
ICB0b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1
dGVkLmVtcHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQot
ICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGlj
aCBuZWdhdGUKLSAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eQotKi8KLXJlZ2lzdGVy
Q29tcHV0ZWQoJ2VtcHR5JywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVybiBFbWJl
ci5pc0VtcHR5KGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKLX0pOwotCi0vKioKLSAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGRlcGVu
ZGVudAotICBwcm9wZXJ0eSBpcyBOT1QgbnVsbCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJh
eSwgb3IgZW1wdHkgZnVuY3Rpb24uCi0KLSAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0
ZWQubm90RW1wdHlgIHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bwotICB1c2UgdGhlIGBh
cnJheS5bXWAgc3ludGF4IHNvIHRoZSBjb21wdXRlZCBjYW4gc3Vic2NyaWJlIHRvIHRyYW5zaXRp
b25zCi0gIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5IHN0YXRlcy4KLQotICBFeGFtcGxlCi0KLSAg
YGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAg
IGhhc1N0dWZmOiBFbWJlci5jb21wdXRlZC5ub3RFbXB0eSgnYmFja3BhY2suW10nKQotICB9KTsK
LSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSh7YmFja3BhY2s6IFsnRm9vZCcsICdTbGVl
cGluZyBCYWcnLCAnVGVudCddfSk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNTdHVmZicpOyAvLyB0cnVl
Ci0gIGhhbXN0ZXIuZ2V0KCdiYWNrcGFjaycpLmNsZWFyKCk7IC8vIFtdCi0gIGhhbXN0ZXIuZ2V0
KCdoYXNTdHVmZicpOyAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLm5vdEVt
cHR5Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0
dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1
cm5zIHRydWUgaWYKLSAgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4K
LSovCi1yZWdpc3RlckNvbXB1dGVkKCdub3RFbXB0eScsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkg
ewotICByZXR1cm4gIUVtYmVyLmlzRW1wdHkoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOwotfSk7
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSB2
YWx1ZSBvZiB0aGUgZGVwZW5kZW50Ci0gIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVkLiBU
aGlzIGF2b2lkcyBlcnJvcnMgZnJvbSBKU0xpbnQgY29tcGxhaW5pbmcKLSAgYWJvdXQgdXNlIG9m
ID09LCB3aGljaCBjYW4gYmUgdGVjaG5pY2FsbHkgY29uZnVzaW5nLgotCi0gIEV4YW1wbGUKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0g
ICAgaXNIdW5ncnk6IEVtYmVyLmNvbXB1dGVkLm5vbmUoJ2Zvb2QnKQotICB9KTsKLSAgdmFyIGhh
bXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8g
dHJ1ZQotICBoYW1zdGVyLnNldCgnZm9vZCcsICdCYW5hbmEnKTsKLSAgaGFtc3Rlci5nZXQoJ2lz
SHVuZ3J5Jyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdmb29kJywgbnVsbCk7Ci0gIGhhbXN0
ZXIuZ2V0KCdpc0h1bmdyeScpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQu
bm9uZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHJl
dHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKLSAg
cmV0dXJucyB0cnVlIGlmIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBudWxsIG9yIHVu
ZGVmaW5lZC4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdub25lJywgZnVuY3Rpb24oZGVwZW5kZW50
S2V5KSB7Ci0gIHJldHVybiBFbWJlci5pc05vbmUoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpOwot
fSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgaW52ZXJz
ZSBib29sZWFuIHZhbHVlCi0gIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlIGRlcGVuZGVu
dCBwcm9wZXJ0eS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgVXNlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGlzQW5vbnltb3VzOiBFbWJlci5jb21wdXRlZC5u
b3QoJ2xvZ2dlZEluJykKLSAgfSk7Ci0gIHZhciB1c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZElu
OiBmYWxzZX0pOwotICB1c2VyLmdldCgnaXNBbm9ueW1vdXMnKTsgLy8gdHJ1ZQotICB1c2VyLnNl
dCgnbG9nZ2VkSW4nLCB0cnVlKTsKLSAgdXNlci5nZXQoJ2lzQW5vbnltb3VzJyk7IC8vIGZhbHNl
Ci0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubm90Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zCi0gIGludmVyc2Ugb2YgdGhlIG9yaWdp
bmFsIHZhbHVlIGZvciBwcm9wZXJ0eQotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ25vdCcsIGZ1bmN0
aW9uKGRlcGVuZGVudEtleSkgewotICByZXR1cm4gIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwot
fSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY29udmVydHMgdGhlIHByb3Zp
ZGVkIGRlcGVuZGVudCBwcm9wZXJ0eQotICBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFz
QmFuYW5hczogRW1iZXIuY29tcHV0ZWQuYm9vbCgnbnVtQmFuYW5hcycpCi0gIH0pOwotICB2YXIg
aGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7
IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMCk7Ci0gIGhhbXN0ZXIuZ2V0
KCdoYXNCYW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMSk7
Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7IC8vIHRydWUKLSAgaGFtc3Rlci5zZXQoJ251
bUJhbmFuYXMnLCBudWxsKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UK
LSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5ib29sCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFt
IHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5
fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjb252ZXJ0cwotICB0byBib29sZWFuIHRoZSBvcmln
aW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkKLSovCi1yZWdpc3RlckNvbXB1dGVkKCdib29sJywgZnVu
Y3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gIHJldHVybiAhIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkp
OwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG1hdGNoZXMgdGhlIG9y
aWdpbmFsIHZhbHVlIGZvciB0aGUKLSAgZGVwZW5kZW50IHByb3BlcnR5IGFnYWluc3QgYSBnaXZl
biBSZWdFeHAsIHJldHVybmluZyBgdHJ1ZWAKLSAgaWYgdGhleSB2YWx1ZXMgbWF0Y2hlcyB0aGUg
UmVnRXhwIGFuZCBgZmFsc2VgIGlmIGl0IGRvZXMgbm90LgotCi0gIEV4YW1wbGUKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHZhciBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgaGFzVmFs
aWRFbWFpbDogRW1iZXIuY29tcHV0ZWQubWF0Y2goJ2VtYWlsJywgL14uK0AuK1wuLiskLykKLSAg
fSk7Ci0gIHZhciB1c2VyID0gVXNlci5jcmVhdGUoe2xvZ2dlZEluOiBmYWxzZX0pOwotICB1c2Vy
LmdldCgnaGFzVmFsaWRFbWFpbCcpOyAvLyBmYWxzZQotICB1c2VyLnNldCgnZW1haWwnLCAnJyk7
Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCi0gIHVzZXIuc2V0KCdlbWFp
bCcsICdlbWJlcl9oYW1zdGVyQGV4YW1wbGUuY29tJyk7Ci0gIHVzZXIuZ2V0KCdoYXNWYWxpZEVt
YWlsJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5tYXRjaAotICBAZm9y
IEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtSZWdFeHB9
IHJlZ2V4cAotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9w
ZXJ0eSB3aGljaCBtYXRjaAotICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGFnYWlu
c3QgYSBnaXZlbiBSZWdFeHAKLSovCi1yZWdpc3RlckNvbXB1dGVkKCdtYXRjaCcsIGZ1bmN0aW9u
KGRlcGVuZGVudEtleSwgcmVnZXhwKSB7Ci0gIHZhciB2YWx1ZSA9IGdldCh0aGlzLCBkZXBlbmRl
bnRLZXkpOwotICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHJlZ2V4cC50ZXN0
KHZhbHVlKSA6IGZhbHNlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQg
cmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgZXF1
YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFwVGltZTogRW1iZXIu
Y29tcHV0ZWQuZXF1YWwoJ3N0YXRlJywgJ3NsZWVweScpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9
IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0g
IGhhbXN0ZXIuc2V0KCdzdGF0ZScsICdzbGVlcHknKTsKLSAgaGFtc3Rlci5nZXQoJ25hcFRpbWUn
KTsgLy8gdHJ1ZQotICBoYW1zdGVyLnNldCgnc3RhdGUnLCAnaHVuZ3J5Jyk7Ci0gIGhhbXN0ZXIu
Z2V0KCduYXBUaW1lJyk7IC8vIGZhbHNlCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZXF1
YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJh
bSB7U3RyaW5nfE51bWJlcnxPYmplY3R9IHZhbHVlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUg
b3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4K
LSovCi1yZWdpc3RlckNvbXB1dGVkKCdlcXVhbCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFs
dWUpIHsKLSAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID09PSB2YWx1ZTsKLX0pOwot
Ci0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJv
dmllZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2
YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVt
YmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc1Rvb01hbnlCYW5hbmFzOiBFbWJlci5jb21wdXRl
ZC5ndCgnbnVtQmFuYW5hcycsIDEwKQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNy
ZWF0ZSgpOwotICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAg
aGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc1Rvb01hbnlC
YW5hbmFzJyk7IC8vIGZhbHNlCi0gIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMTEpOwotICBo
YW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0
aG9kIGNvbXB1dGVkLmd0Ci0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleQotICBAcGFyYW0ge051bWJlcn0gdmFsdWUKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ
cm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlmCi0gIHRoZSBv
cmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciB0aGVuIGdpdmVuIHZhbHVlLgot
Ki8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2d0JywgZnVuY3Rpb24oZGVwZW5kZW50S2V5LCB2YWx1ZSkg
ewotICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkgPiB2YWx1ZTsKLX0pOwotCi0vKioK
LSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQg
ZGVwZW5kZW50IHByb3BlcnR5Ci0gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJv
dmlkZWQgdmFsdWUuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0
ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBoYXNUb29NYW55QmFuYW5hczogRW1iZXIu
Y29tcHV0ZWQuZ3RlKCdudW1CYW5hbmFzJywgMTApCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhh
bXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBm
YWxzZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDMpOwotICBoYW1zdGVyLmdldCgnaGFz
VG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAx
MCk7Ci0gIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyB0cnVlCi0gIGBgYAot
Ci0gIEBtZXRob2QgY29tcHV0ZWQuZ3RlCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9
IGRlcGVuZGVudEtleQotICBAcGFyYW0ge051bWJlcn0gdmFsdWUKLSAgQHJldHVybiB7RW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucyB0cnVlIGlm
Ci0gIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciBvciBlcXVhbCB0
aGVuIGdpdmVuIHZhbHVlLgotKi8KLXJlZ2lzdGVyQ29tcHV0ZWQoJ2d0ZScsIGZ1bmN0aW9uKGRl
cGVuZGVudEtleSwgdmFsdWUpIHsKLSAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpID49
IHZhbHVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0
cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgbGVzcyB0aGFuIHRo
ZSBwcm92aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIg
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVt
YmVyLmNvbXB1dGVkLmx0KCdudW1CYW5hbmFzJywgMykKLSAgfSk7Ci0gIHZhciBoYW1zdGVyID0g
SGFtc3Rlci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8g
dHJ1ZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDMpOwotICBoYW1zdGVyLmdldCgnbmVl
ZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxzZQotICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDIp
OwotICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyB0cnVlCi0gIGBgYAotCi0g
IEBtZXRob2QgY29tcHV0ZWQubHQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVw
ZW5kZW50S2V5Ci0gIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKLSAg
dGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eSBpcyBsZXNzIHRoZW4gZ2l2ZW4gdmFsdWUu
Ci0qLwotcmVnaXN0ZXJDb21wdXRlZCgnbHQnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHZhbHVl
KSB7Ci0gIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA8IHZhbHVlOwotfSk7Ci0KLS8q
KgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRl
ZCBkZXBlbmRlbnQgcHJvcGVydHkKLSAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92
aWRlZCB2YWx1ZS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3Rl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVtYmVyLmNv
bXB1dGVkLmx0ZSgnbnVtQmFuYW5hcycsIDMpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0
ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCduZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRydWUK
LSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCA1KTsKLSAgaGFtc3Rlci5nZXQoJ25lZWRzTW9y
ZUJhbmFuYXMnKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsKLSAg
aGFtc3Rlci5nZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQotICBgYGAKLQotICBAbWV0
aG9kIGNvbXB1dGVkLmx0ZQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl
bnRLZXkKLSAgQHBhcmFtIHtOdW1iZXJ9IHZhbHVlCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVk
UHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgotICB0aGUg
b3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGxlc3Mgb3IgZXF1YWwgdGhlbiBnaXZlbiB2
YWx1ZS4KLSovCi1yZWdpc3RlckNvbXB1dGVkKCdsdGUnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXks
IHZhbHVlKSB7Ci0gIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA8PSB2YWx1ZTsKLX0p
OwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHBlcmZvcm1zIGEgbG9naWNhbCBg
YW5kYCBvbiB0aGUKLSAgb3JpZ2luYWwgdmFsdWVzIGZvciB0aGUgcHJvdmlkZWQgZGVwZW5kZW50
IHByb3BlcnRpZXMuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0
ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICByZWFkeUZvckNhbXA6IEVtYmVyLmNvbXB1
dGVkLmFuZCgnaGFzVGVudCcsICdoYXNCYWNrcGFjaycpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9
IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0KCdyZWFkeUZvckNhbXAnKTsgLy8gZmFs
c2UKLSAgaGFtc3Rlci5zZXQoJ2hhc1RlbnQnLCB0cnVlKTsKLSAgaGFtc3Rlci5nZXQoJ3JlYWR5
Rm9yQ2FtcCcpOyAvLyBmYWxzZQotICBoYW1zdGVyLnNldCgnaGFzQmFja3BhY2snLCB0cnVlKTsK
LSAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2FtcCcpOyAvLyB0cnVlCi0gIGBgYAotCi0gIEBtZXRo
b2QgY29tcHV0ZWQuYW5kCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVy
dHkgd2hpY2ggcGVyZm9ybXMKLSAgYSBsb2dpY2FsIGBhbmRgIG9uIHRoZSB2YWx1ZXMgb2YgYWxs
IHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRl
ZFdpdGhQcm9wZXJ0aWVzKCdhbmQnLCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFy
IGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHko
a2V5KSAmJiAhcHJvcGVydGllc1trZXldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICB9Ci0gIHJldHVybiB0cnVlOwotfSk7Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdo
aWNoIHBlcmZvcm1zIGEgbG9naWNhbCBgb3JgIG9uIHRoZQotICBvcmlnaW5hbCB2YWx1ZXMgZm9y
IHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGllcy4KLQotICBFeGFtcGxlCi0KLSAgYGBg
amF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHJl
YWR5Rm9yUmFpbjogRW1iZXIuY29tcHV0ZWQub3IoJ2hhc0phY2tldCcsICdoYXNVbWJyZWxsYScp
Ci0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7Ci0gIGhhbXN0ZXIuZ2V0
KCdyZWFkeUZvclJhaW4nKTsgLy8gZmFsc2UKLSAgaGFtc3Rlci5zZXQoJ2hhc0phY2tldCcsIHRy
dWUpOwotICBoYW1zdGVyLmdldCgncmVhZHlGb3JSYWluJyk7IC8vIHRydWUKLSAgYGBgCi0KLSAg
QG1ldGhvZCBjb21wdXRlZC5vcgotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBl
bmRlbnRLZXkqCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHBy
b3BlcnR5IHdoaWNoIHBlcmZvcm1zCi0gIGEgbG9naWNhbCBgb3JgIG9uIHRoZSB2YWx1ZXMgb2Yg
YWxsIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMuCi0qLwotcmVnaXN0ZXJDb21w
dXRlZFdpdGhQcm9wZXJ0aWVzKCdvcicsIGZ1bmN0aW9uKHByb3BlcnRpZXMpIHsKLSAgZm9yICh2
YXIga2V5IGluIHByb3BlcnRpZXMpIHsKLSAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0
eShrZXkpICYmIHByb3BlcnRpZXNba2V5XSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
ICB9Ci0gIHJldHVybiBmYWxzZTsKLX0pOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0
aGF0IHJldHVybnMgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZQotICBmcm9tIGEgbGlzdCBvZiBkZXBl
bmRlbnQgcHJvcGVydGllcy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIg
SGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGhhc0Nsb3RoZXM6IEVtYmVyLmNv
bXB1dGVkLmFueSgnaGF0JywgJ3NoaXJ0JykKLSAgfSk7Ci0gIHZhciBoYW1zdGVyID0gSGFtc3Rl
ci5jcmVhdGUoKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0Nsb3RoZXMnKTsgLy8gbnVsbAotICBoYW1z
dGVyLnNldCgnc2hpcnQnLCAnSGF3YWlpYW4gU2hpcnQnKTsKLSAgaGFtc3Rlci5nZXQoJ2hhc0Ns
b3RoZXMnKTsgLy8gJ0hhd2FpaWFuIFNoaXJ0JwotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVk
LmFueQotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkqCi0gIEBy
ZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJl
dHVybnMKLSAgdGhlIGZpcnN0IHRydXRoeSB2YWx1ZSBvZiBnaXZlbiBsaXN0IG9mIHByb3BlcnRp
ZXMuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdhbnknLCBmdW5jdGlvbihw
cm9wZXJ0aWVzKSB7Ci0gIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHBy
b3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwcm9wZXJ0aWVzW2tleV0pIHsKLSAgICAg
IHJldHVybiBwcm9wZXJ0aWVzW2tleV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotfSk7
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgYXJyYXkgb2Yg
dmFsdWVzCi0gIGZvciB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnRpZXMuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKLSAgICBjbG90aGVzOiBFbWJlci5jb21wdXRlZC5jb2xsZWN0KCdoYXQnLCAnc2hpcnQn
KQotICB9KTsKLSAgdmFyIGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwotICBoYW1zdGVyLmdl
dCgnY2xvdGhlcycpOyAvLyBbbnVsbCwgbnVsbF0KLSAgaGFtc3Rlci5zZXQoJ2hhdCcsICdDYW1w
IEhhdCcpOwotICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGlydCcpOwotICBoYW1zdGVy
LmdldCgnY2xvdGhlcycpOyAvLyBbJ0NhbXAgSGF0JywgJ0NhbXAgU2hpcnQnXQotICBgYGAKLQot
ICBAbWV0aG9kIGNvbXB1dGVkLmNvbGxlY3QKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmlu
Z30gZGVwZW5kZW50S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21w
dXRlZCBwcm9wZXJ0eSB3aGljaCBtYXBzCi0gIHZhbHVlcyBvZiBhbGwgcGFzc2VkIHByb3BlcnRp
ZXMgaW4gdG8gYW4gYXJyYXkuCi0qLwotcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdj
b2xsZWN0JywgZnVuY3Rpb24ocHJvcGVydGllcykgewotICB2YXIgcmVzID0gW107Ci0gIGZvciAo
dmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVy
dHkoa2V5KSkgewotICAgICAgaWYgKEVtYmVyLmlzTm9uZShwcm9wZXJ0aWVzW2tleV0pKSB7Ci0g
ICAgICAgIHJlcy5wdXNoKG51bGwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzLnB1c2go
cHJvcGVydGllc1trZXldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0p
OwotCi0vKioKLSAgQ3JlYXRlcyBhIG5ldyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFsaWFzIGZvciBh
bm90aGVyIHByb3BlcnR5Ci0gIG9uIGFuIG9iamVjdC4gQ2FsbHMgdG8gYGdldGAgb3IgYHNldGAg
dGhpcyBwcm9wZXJ0eSBiZWhhdmUgYXMKLSAgdGhvdWdoIHRoZXkgd2VyZSBjYWxsZWQgb24gdGhl
IG9yaWdpbmFsIHByb3BlcnR5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgUGVyc29uID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFtZTogJ0FsZXggTWF0Y2huZWVyJywKLSAgICBub21lbjog
RW1iZXIuY29tcHV0ZWQuYWxpYXMoJ25hbWUnKQotICB9KTsKLQotICBhbGV4ID0gUGVyc29uLmNy
ZWF0ZSgpOwotICBhbGV4LmdldCgnbm9tZW4nKTsgLy8gJ0FsZXggTWF0Y2huZWVyJwotICBhbGV4
LmdldCgnbmFtZScpOyAgLy8gJ0FsZXggTWF0Y2huZWVyJwotCi0gIGFsZXguc2V0KCdub21lbics
ICdAbWFjaHR5Jyk7Ci0gIGFsZXguZ2V0KCduYW1lJyk7ICAvLyAnQG1hY2h0eScKLSAgYGBgCi0g
IEBtZXRob2QgY29tcHV0ZWQuYWxpYXMKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30g
ZGVwZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVk
IHByb3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KLSAgYWxpYXMgdG8gdGhlIG9yaWdpbmFsIHZhbHVl
IGZvciBwcm9wZXJ0eS4KLSovCi1FbWJlci5jb21wdXRlZC5hbGlhcyA9IGZ1bmN0aW9uKGRlcGVu
ZGVudEtleSkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlv
bihrZXksIHZhbHVlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7Ci0gICAgICBz
ZXQodGhpcywgZGVwZW5kZW50S2V5LCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KTsKLSAgICB9Ci0g
IH0pOwotfTsKLQotLyoqCi0gIFdoZXJlIGBjb21wdXRlZC5hbGlhc2AgYWxpYXNlcyBgZ2V0YCBh
bmQgYHNldGAsIGFuZCBhbGxvd3MgZm9yIGJpZGlyZWN0aW9uYWwKLSAgZGF0YSBmbG93LCBgY29t
cHV0ZWQub25lV2F5YCBvbmx5IHByb3ZpZGVzIGFuIGFsaWFzZWQgYGdldGAuIFRoZSBgc2V0YCB3
aWxsCi0gIG5vdCBtdXRhdGUgdGhlIHVwc3RyZWFtIHByb3BlcnR5LCByYXRoZXIgY2F1c2VzIHRo
ZSBjdXJyZW50IHByb3BlcnR5IHRvCi0gIGJlY29tZSB0aGUgdmFsdWUgc2V0LiBUaGlzIGNhdXNl
cyB0aGUgZG93bnN0cmVhbSBwcm9wZXJ0eSB0byBwZXJtZW50YW50bHkKLSAgZGl2ZXJnZSBmcm9t
IHRoZSB1cHN0cmVhbSBwcm9wZXJ0eS4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAot
ICBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgZmlyc3ROYW1lOiBudWxsLAotICAg
IGxhc3ROYW1lOiBudWxsLAotICAgIG5pY2tOYW1lOiBFbWJlci5jb21wdXRlZC5vbmVXYXkoJ2Zp
cnN0TmFtZScpCi0gIH0pOwotCi0gIHVzZXIgPSBVc2VyLmNyZWF0ZSh7Ci0gICAgZmlyc3ROYW1l
OiAnVGVkZHknLAotICAgIGxhc3ROYW1lOiAgJ1plZW5ueScKLSAgfSk7Ci0KLSAgdXNlci5nZXQo
J25pY2tOYW1lJyk7Ci0gICMgJ1RlZGR5JwotCi0gIHVzZXIuc2V0KCduaWNrTmFtZScsICdUZWRk
eUJlYXInKTsKLSAgIyAnVGVkZHlCZWFyJwotCi0gIHVzZXIuZ2V0KCdmaXJzdE5hbWUnKTsKLSAg
IyAnVGVkZHknCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQub25lV2F5Ci0gIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjcmVhdGVzIGEKLSAgb25lIHdh
eSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5Lgot
Ki8KLUVtYmVyLmNvbXB1dGVkLm9uZVdheSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewotICBy
ZXR1cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKLSAgICByZXR1
cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7Ci0gIH0pOwotfTsKLQotCi0vKioKLSAgQSBjb21w
dXRlZCBwcm9wZXJ0eSB0aGF0IGFjdHMgbGlrZSBhIHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVy
LAotICBidXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHByb3ZpZGVkIGBkZWZhdWx0UGF0aGAg
aWYgdGhlCi0gIHByb3BlcnR5IGl0c2VsZiBoYXMgbm90IGJlZW4gc2V0IHRvIGEgdmFsdWUKLQot
ICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotICAgIHdpc2hMaXN0OiBFbWJlci5jb21wdXRlZC5kZWZhdWx0VG8oJ2Zhdm9y
aXRlRm9vZCcpCi0gIH0pOwotICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKHtmYXZvcml0
ZUZvb2Q6ICdCYW5hbmEnfSk7Ci0gIGhhbXN0ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnQmFuYW5h
JwotICBoYW1zdGVyLnNldCgnd2lzaExpc3QnLCAnTW9yZSBVbml0IFRlc3RzJyk7Ci0gIGhhbXN0
ZXIuZ2V0KCd3aXNoTGlzdCcpOyAvLyAnTW9yZSBVbml0IFRlc3RzJwotICBoYW1zdGVyLmdldCgn
ZmF2b3JpdGVGb29kJyk7IC8vICdCYW5hbmEnCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQu
ZGVmYXVsdFRvCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlZmF1bHRQYXRoCi0g
IEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNo
IGFjdHMgbGlrZQotICBhIHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVyLCBidXQgZGVmYXVsdHMg
dG8gdGhlIHZhbHVlIGZyb20gYGRlZmF1bHRQYXRoYC4KLSovCi1FbWJlci5jb21wdXRlZC5kZWZh
dWx0VG8gPSBmdW5jdGlvbihkZWZhdWx0UGF0aCkgewotICByZXR1cm4gRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5LCBuZXdWYWx1ZSwgY2FjaGVkVmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMSkgewotICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlICE9IG51bGwgPyBjYWNo
ZWRWYWx1ZSA6IGdldCh0aGlzLCBkZWZhdWx0UGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBuZXdW
YWx1ZSAhPSBudWxsID8gbmV3VmFsdWUgOiBnZXQodGhpcywgZGVmYXVsdFBhdGgpOwotICB9KTsK
LX07Ci0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8vIEVtYmVyLnRyeUZpbmFsbHkK
LS8qKgotQG1vZHVsZSBlbWJlci1tZXRhbAotKi8KLQotdmFyIEFGVEVSX09CU0VSVkVSUyA9ICc6
Y2hhbmdlJywKLSAgICBCRUZPUkVfT0JTRVJWRVJTID0gJzpiZWZvcmUnOwotCi1mdW5jdGlvbiBj
aGFuZ2VFdmVudChrZXlOYW1lKSB7Ci0gIHJldHVybiBrZXlOYW1lK0FGVEVSX09CU0VSVkVSUzsK
LX0KLQotZnVuY3Rpb24gYmVmb3JlRXZlbnQoa2V5TmFtZSkgewotICByZXR1cm4ga2V5TmFtZStC
RUZPUkVfT0JTRVJWRVJTOwotfQotCi0vKioKLSAgQG1ldGhvZCBhZGRPYnNlcnZlcgotICBAcGFy
YW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9u
fSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSov
Ci1FbWJlci5hZGRPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9k
KSB7Ci0gIEVtYmVyLmFkZExpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQs
IG1ldGhvZCk7Ci0gIEVtYmVyLndhdGNoKG9iaiwgX3BhdGgpOwotCi0gIHJldHVybiB0aGlzOwot
fTsKLQotRW1iZXIub2JzZXJ2ZXJzRm9yID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVy
biBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBjaGFuZ2VFdmVudChwYXRoKSk7Ci19OwotCi0vKioK
LSAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5n
fSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFy
YW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5yZW1vdmVPYnNlcnZlciA9
IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLnVud2F0Y2go
b2JqLCBfcGF0aCk7Ci0gIEVtYmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3Bh
dGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19OwotCi0vKioKLSAgQG1l
dGhvZCBhZGRCZWZvcmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7U3RyaW5nfSBw
YXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAotICBAcGFyYW0g
e0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5hZGRCZWZvcmVPYnNlcnZlciA9
IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVtYmVyLmFkZExpc3Rl
bmVyKG9iaiwgYmVmb3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0gIEVtYmVyLndh
dGNoKG9iaiwgX3BhdGgpOwotCi0gIHJldHVybiB0aGlzOwotfTsKLQotLy8gU3VzcGVuZCBvYnNl
cnZlciBkdXJpbmcgY2FsbGJhY2suCi0vLwotLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5
IHRoZSB0YXJnZXQgb2YgdGhlIG9ic2VydmVyCi0vLyB3aGlsZSBpdCBpcyBzZXR0aW5nIHRoZSBv
YnNlcnZlZCBwYXRoLgotRW1iZXIuX3N1c3BlbmRCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9i
aiwgcGF0aCwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7Ci0gIHJldHVybiBFbWJlci5fc3Vz
cGVuZExpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQocGF0aCksIHRhcmdldCwgbWV0aG9kLCBjYWxs
YmFjayk7Ci19OwotCi1FbWJlci5fc3VzcGVuZE9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRo
LCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spIHsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlz
dGVuZXIob2JqLCBjaGFuZ2VFdmVudChwYXRoKSwgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKTsK
LX07Ci0KLXZhciBtYXAgPSBFbWJlci5BcnJheVBvbHlmaWxscy5tYXA7Ci0KLUVtYmVyLl9zdXNw
ZW5kQmVmb3JlT2JzZXJ2ZXJzID0gZnVuY3Rpb24ob2JqLCBwYXRocywgdGFyZ2V0LCBtZXRob2Qs
IGNhbGxiYWNrKSB7Ci0gIHZhciBldmVudHMgPSBtYXAuY2FsbChwYXRocywgYmVmb3JlRXZlbnQp
OwotICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcnMob2JqLCBldmVudHMsIHRhcmdldCwg
bWV0aG9kLCBjYWxsYmFjayk7Ci19OwotCi1FbWJlci5fc3VzcGVuZE9ic2VydmVycyA9IGZ1bmN0
aW9uKG9iaiwgcGF0aHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewotICB2YXIgZXZlbnRz
ID0gbWFwLmNhbGwocGF0aHMsIGNoYW5nZUV2ZW50KTsKLSAgcmV0dXJuIEVtYmVyLl9zdXNwZW5k
TGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJhY2spOwotfTsKLQot
RW1iZXIuYmVmb3JlT2JzZXJ2ZXJzRm9yID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7Ci0gIHJldHVy
biBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBiZWZvcmVFdmVudChwYXRoKSk7Ci19OwotCi0vKioK
LSAgQG1ldGhvZCByZW1vdmVCZWZvcmVPYnNlcnZlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSB7
U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAot
ICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gW21ldGhvZF0KLSovCi1FbWJlci5yZW1vdmVCZWZv
cmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0aG9kKSB7Ci0gIEVt
YmVyLnVud2F0Y2gob2JqLCBfcGF0aCk7Ci0gIEVtYmVyLnJlbW92ZUxpc3RlbmVyKG9iaiwgYmVm
b3JlRXZlbnQoX3BhdGgpLCB0YXJnZXQsIG1ldGhvZCk7Ci0KLSAgcmV0dXJuIHRoaXM7Ci19Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotZGVmaW5lKCJiYWNrYnVybmVyL3F1ZXVlIiwK
LSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJp
Y3QiOwotICAgIGZ1bmN0aW9uIFF1ZXVlKGRhcSwgbmFtZSwgb3B0aW9ucykgewotICAgICAgdGhp
cy5kYXEgPSBkYXE7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKLSAgICAgIHRoaXMuX3F1ZXVlID0gW107Ci0gICAgfQotCi0gICAgUXVldWUu
cHJvdG90eXBlID0gewotICAgICAgZGFxOiBudWxsLAotICAgICAgbmFtZTogbnVsbCwKLSAgICAg
IG9wdGlvbnM6IG51bGwsCi0gICAgICBfcXVldWU6IG51bGwsCi0KLSAgICAgIHB1c2g6IGZ1bmN0
aW9uKHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaykgewotICAgICAgICB2YXIgcXVldWUgPSB0
aGlzLl9xdWV1ZTsKLSAgICAgICAgcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3Rh
Y2spOwotICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9k
OiBtZXRob2R9OwotICAgICAgfSwKLQotICAgICAgcHVzaFVuaXF1ZTogZnVuY3Rpb24odGFyZ2V0
LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7Ci0gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVl
LCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0aG9kLCBpLCBsOwotCi0gICAgICAgIGZvciAoaSA9
IDAsIGwgPSBxdWV1ZS5sZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKLSAgICAgICAgICBjdXJyZW50
VGFyZ2V0ID0gcXVldWVbaV07Ci0gICAgICAgICAgY3VycmVudE1ldGhvZCA9IHF1ZXVlW2krMV07
Ci0KLSAgICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PT0gdGFyZ2V0ICYmIGN1cnJlbnRNZXRo
b2QgPT09IG1ldGhvZCkgewotICAgICAgICAgICAgcXVldWVbaSsyXSA9IGFyZ3M7IC8vIHJlcGxh
Y2UgYXJncwotICAgICAgICAgICAgcXVldWVbaSszXSA9IHN0YWNrOyAvLyByZXBsYWNlIHN0YWNr
Ci0gICAgICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0aG9k
OiBtZXRob2R9OyAvLyBUT0RPOiB0ZXN0IHRoaXMgY29kZSBwYXRoCi0gICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgdGhpcy5fcXVldWUucHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywg
c3RhY2spOwotICAgICAgICByZXR1cm4ge3F1ZXVlOiB0aGlzLCB0YXJnZXQ6IHRhcmdldCwgbWV0
aG9kOiBtZXRob2R9OwotICAgICAgfSwKLQotICAgICAgLy8gVE9ETzogcmVtb3ZlIG1lLCBvbmx5
IGJlaW5nIHVzZWQgZm9yIEVtYmVyLnJ1bi5zeW5jCi0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLAotICAgICAgICAgICAgb3B0aW9ucyA9
IHRoaXMub3B0aW9ucywKLSAgICAgICAgICAgIGJlZm9yZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5i
ZWZvcmUsCi0gICAgICAgICAgICBhZnRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hZnRlciwKLSAg
ICAgICAgICAgIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBzdGFjaywgaSwgbCA9IHF1ZXVlLmxlbmd0
aDsKLQotICAgICAgICBpZiAobCAmJiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KLSAgICAgICAgZm9y
IChpID0gMDsgaSA8IGw7IGkgKz0gNCkgewotICAgICAgICAgIHRhcmdldCA9IHF1ZXVlW2ldOwot
ICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlW2krMV07Ci0gICAgICAgICAgYXJncyAgID0gcXVldWVb
aSsyXTsKLSAgICAgICAgICBzdGFjayAgPSBxdWV1ZVtpKzNdOyAvLyBEZWJ1Z2dpbmcgYXNzaXN0
YW5jZQotCi0gICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcKLSAgICAgICAgICBpZiAo
YXJncyAmJiBhcmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIG1ldGhvZC5hcHBseSh0YXJn
ZXQsIGFyZ3MpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRob2QuY2FsbCh0
YXJnZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobCAmJiBhZnRlcikg
eyBhZnRlcigpOyB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgbmV3IGl0ZW1zIGhhdmUgYmVlbiBh
ZGRlZAotICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gbCkgewotICAgICAgICAgIHRoaXMuX3F1
ZXVlID0gcXVldWUuc2xpY2UobCk7Ci0gICAgICAgICAgdGhpcy5mbHVzaCgpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAg
ICAgIH0sCi0KLSAgICAgIGNhbmNlbDogZnVuY3Rpb24oYWN0aW9uVG9DYW5jZWwpIHsKLSAgICAg
ICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWUsIGN1cnJlbnRUYXJnZXQsIGN1cnJlbnRNZXRob2Qs
IGksIGw7Ci0KLSAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkg
Kz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBj
dXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQotICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0
ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9D
YW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICBxdWV1ZS5zcGxpY2UoaSwgNCk7Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBp
ZiBub3QgZm91bmQgaW4gY3VycmVudCBxdWV1ZQotICAgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUg
cXVldWUgdGhhdCBpcyBiZWluZyBmbHVzaGVkCi0gICAgICAgIHF1ZXVlID0gdGhpcy5fcXVldWVC
ZWluZ0ZsdXNoZWQ7Ci0gICAgICAgIGlmICghcXVldWUpIHsKLSAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8IGw7IGkg
Kz0gNCkgewotICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBxdWV1ZVtpXTsKLSAgICAgICAgICBj
dXJyZW50TWV0aG9kID0gcXVldWVbaSsxXTsKLQotICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0
ID09PSBhY3Rpb25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9uVG9D
YW5jZWwubWV0aG9kKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBtZXNzIHdpdGggYXJyYXkgZHVy
aW5nIGZsdXNoCi0gICAgICAgICAgICAvLyBqdXN0IG51bGxpZnkgdGhlIG1ldGhvZAotICAgICAg
ICAgICAgcXVldWVbaSsxXSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0KLSAgICBfX2V4cG9ydHNfXy5R
dWV1ZSA9IFF1ZXVlOwotICB9KTsKLQotZGVmaW5lKCJiYWNrYnVybmVyL2RlZmVycmVkX2FjdGlv
bl9xdWV1ZXMiLAotICBbImJhY2tidXJuZXIvcXVldWUiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9u
KF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAg
dmFyIFF1ZXVlID0gX19kZXBlbmRlbmN5MV9fLlF1ZXVlOwotCi0gICAgZnVuY3Rpb24gRGVmZXJy
ZWRBY3Rpb25RdWV1ZXMocXVldWVOYW1lcywgb3B0aW9ucykgewotICAgICAgdmFyIHF1ZXVlcyA9
IHRoaXMucXVldWVzID0ge307Ci0gICAgICB0aGlzLnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzID0g
cXVldWVOYW1lcyB8fCBbXTsKLQotICAgICAgdmFyIHF1ZXVlTmFtZTsKLSAgICAgIGZvciAodmFy
IGkgPSAwLCBsID0gcXVldWVOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgcXVl
dWVOYW1lID0gcXVldWVOYW1lc1tpXTsKLSAgICAgICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcg
UXVldWUodGhpcywgcXVldWVOYW1lLCBvcHRpb25zW3F1ZXVlTmFtZV0pOwotICAgICAgfQotICAg
IH0KLQotICAgIERlZmVycmVkQWN0aW9uUXVldWVzLnByb3RvdHlwZSA9IHsKLSAgICAgIHF1ZXVl
TmFtZXM6IG51bGwsCi0gICAgICBxdWV1ZXM6IG51bGwsCi0KLSAgICAgIHNjaGVkdWxlOiBmdW5j
dGlvbihxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBvbmNlRmxhZywgc3RhY2spIHsK
LSAgICAgICAgdmFyIHF1ZXVlcyA9IHRoaXMucXVldWVzLAotICAgICAgICAgICAgcXVldWUgPSBx
dWV1ZXNbcXVldWVOYW1lXTsKLQotICAgICAgICBpZiAoIXF1ZXVlKSB7IHRocm93IG5ldyBFcnJv
cigiWW91IGF0dGVtcHRlZCB0byBzY2hlZHVsZSBhbiBhY3Rpb24gaW4gYSBxdWV1ZSAoIiArIHF1
ZXVlTmFtZSArICIpIHRoYXQgZG9lc24ndCBleGlzdCIpOyB9Ci0KLSAgICAgICAgaWYgKG9uY2VG
bGFnKSB7Ci0gICAgICAgICAgcmV0dXJuIHF1ZXVlLnB1c2hVbmlxdWUodGFyZ2V0LCBtZXRob2Qs
IGFyZ3MsIHN0YWNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gcXVldWUu
cHVzaCh0YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOwotICAgICAgICB9Ci0gICAgICB9LAot
Ci0gICAgICBmbHVzaDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBxdWV1ZXMgPSB0aGlzLnF1
ZXVlcywKLSAgICAgICAgICAgIHF1ZXVlTmFtZXMgPSB0aGlzLnF1ZXVlTmFtZXMsCi0gICAgICAg
ICAgICBxdWV1ZU5hbWUsIHF1ZXVlLCBxdWV1ZUl0ZW1zLCBwcmlvclF1ZXVlTmFtZUluZGV4LAot
ICAgICAgICAgICAgcXVldWVOYW1lSW5kZXggPSAwLCBudW1iZXJPZlF1ZXVlcyA9IHF1ZXVlTmFt
ZXMubGVuZ3RoOwotCi0gICAgICAgIG91dGVybG9vcDoKLSAgICAgICAgd2hpbGUgKHF1ZXVlTmFt
ZUluZGV4IDwgbnVtYmVyT2ZRdWV1ZXMpIHsKLSAgICAgICAgICBxdWV1ZU5hbWUgPSBxdWV1ZU5h
bWVzW3F1ZXVlTmFtZUluZGV4XTsKLSAgICAgICAgICBxdWV1ZSA9IHF1ZXVlc1txdWV1ZU5hbWVd
OwotICAgICAgICAgIHF1ZXVlSXRlbXMgPSBxdWV1ZS5fcXVldWVCZWluZ0ZsdXNoZWQgPSBxdWV1
ZS5fcXVldWUuc2xpY2UoKTsKLSAgICAgICAgICBxdWV1ZS5fcXVldWUgPSBbXTsKLQotICAgICAg
ICAgIHZhciBvcHRpb25zID0gcXVldWUub3B0aW9ucywKLSAgICAgICAgICAgICAgYmVmb3JlID0g
b3B0aW9ucyAmJiBvcHRpb25zLmJlZm9yZSwKLSAgICAgICAgICAgICAgYWZ0ZXIgPSBvcHRpb25z
ICYmIG9wdGlvbnMuYWZ0ZXIsCi0gICAgICAgICAgICAgIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBz
dGFjaywKLSAgICAgICAgICAgICAgcXVldWVJbmRleCA9IDAsIG51bWJlck9mUXVldWVJdGVtcyA9
IHF1ZXVlSXRlbXMubGVuZ3RoOwotCi0gICAgICAgICAgaWYgKG51bWJlck9mUXVldWVJdGVtcyAm
JiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KLSAgICAgICAgICB3aGlsZSAocXVldWVJbmRleCA8IG51
bWJlck9mUXVldWVJdGVtcykgewotICAgICAgICAgICAgdGFyZ2V0ID0gcXVldWVJdGVtc1txdWV1
ZUluZGV4XTsKLSAgICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCsxXTsK
LSAgICAgICAgICAgIGFyZ3MgICA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCsyXTsKLSAgICAgICAg
ICAgIHN0YWNrICA9IHF1ZXVlSXRlbXNbcXVldWVJbmRleCszXTsgLy8gRGVidWdnaW5nIGFzc2lz
dGFuY2UKLQotICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7IG1l
dGhvZCA9IHRhcmdldFttZXRob2RdOyB9Ci0KLSAgICAgICAgICAgIC8vIG1ldGhvZCBjb3VsZCBo
YXZlIGJlZW4gbnVsbGlmaWVkIC8gY2FuY2VsZWQgZHVyaW5nIGZsdXNoCi0gICAgICAgICAgICBp
ZiAobWV0aG9kKSB7Ci0gICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nCi0gICAg
ICAgICAgICAgIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAg
IG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIG1ldGhvZC5jYWxsKHRhcmdldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgcXVldWVJbmRleCArPSA0OwotICAgICAgICAgIH0KLSAg
ICAgICAgICBxdWV1ZS5fcXVldWVCZWluZ0ZsdXNoZWQgPSBudWxsOwotICAgICAgICAgIGlmIChu
dW1iZXJPZlF1ZXVlSXRlbXMgJiYgYWZ0ZXIpIHsgYWZ0ZXIoKTsgfQotCi0gICAgICAgICAgaWYg
KChwcmlvclF1ZXVlTmFtZUluZGV4ID0gaW5kZXhPZlByaW9yUXVldWVXaXRoQWN0aW9ucyh0aGlz
LCBxdWV1ZU5hbWVJbmRleCkpICE9PSAtMSkgewotICAgICAgICAgICAgcXVldWVOYW1lSW5kZXgg
PSBwcmlvclF1ZXVlTmFtZUluZGV4OwotICAgICAgICAgICAgY29udGludWUgb3V0ZXJsb29wOwot
ICAgICAgICAgIH0KLQotICAgICAgICAgIHF1ZXVlTmFtZUluZGV4Kys7Ci0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24gaW5kZXhPZlByaW9yUXVldWVXaXRoQWN0aW9u
cyhkYXEsIGN1cnJlbnRRdWV1ZUluZGV4KSB7Ci0gICAgICB2YXIgcXVldWVOYW1lLCBxdWV1ZTsK
LQotICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXJyZW50UXVldWVJbmRleDsgaSA8PSBsOyBp
KyspIHsKLSAgICAgICAgcXVldWVOYW1lID0gZGFxLnF1ZXVlTmFtZXNbaV07Ci0gICAgICAgIHF1
ZXVlID0gZGFxLnF1ZXVlc1txdWV1ZU5hbWVdOwotICAgICAgICBpZiAocXVldWUuX3F1ZXVlLmxl
bmd0aCkgeyByZXR1cm4gaTsgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQot
Ci0KLSAgICBfX2V4cG9ydHNfXy5EZWZlcnJlZEFjdGlvblF1ZXVlcyA9IERlZmVycmVkQWN0aW9u
UXVldWVzOwotICB9KTsKLQotZGVmaW5lKCJiYWNrYnVybmVyIiwKLSAgWyJiYWNrYnVybmVyL2Rl
ZmVycmVkX2FjdGlvbl9xdWV1ZXMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5j
eTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIERlZmVycmVk
QWN0aW9uUXVldWVzID0gX19kZXBlbmRlbmN5MV9fLkRlZmVycmVkQWN0aW9uUXVldWVzOwotCi0g
ICAgdmFyIHNsaWNlID0gW10uc2xpY2UsCi0gICAgICAgIHBvcCA9IFtdLnBvcCwKLSAgICAgICAg
dGhyb3R0bGVycyA9IFtdLAotICAgICAgICBkZWJvdW5jZWVzID0gW10sCi0gICAgICAgIHRpbWVy
cyA9IFtdLAotICAgICAgICBhdXRvcnVuLCBsYXRlclRpbWVyLCBsYXRlclRpbWVyRXhwaXJlc0F0
LAotICAgICAgICBnbG9iYWwgPSB0aGlzLAotICAgICAgICBOVU1CRVIgPSAvXGQrLzsKLQotICAg
IGZ1bmN0aW9uIGlzQ29lcmNhYmxlTnVtYmVyKG51bWJlcikgewotICAgICAgcmV0dXJuIHR5cGVv
ZiBudW1iZXIgPT09ICdudW1iZXInIHx8IE5VTUJFUi50ZXN0KG51bWJlcik7Ci0gICAgfQotCi0g
ICAgZnVuY3Rpb24gQmFja2J1cm5lcihxdWV1ZU5hbWVzLCBvcHRpb25zKSB7Ci0gICAgICB0aGlz
LnF1ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzOwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKLSAgICAgIGlmICghdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZSkgewotICAgICAgICB0
aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXVlID0gcXVldWVOYW1lc1swXTsKLSAgICAgIH0KLSAgICAg
IHRoaXMuaW5zdGFuY2VTdGFjayA9IFtdOwotICAgIH0KLQotICAgIEJhY2tidXJuZXIucHJvdG90
eXBlID0gewotICAgICAgcXVldWVOYW1lczogbnVsbCwKLSAgICAgIG9wdGlvbnM6IG51bGwsCi0g
ICAgICBjdXJyZW50SW5zdGFuY2U6IG51bGwsCi0gICAgICBpbnN0YW5jZVN0YWNrOiBudWxsLAot
Ci0gICAgICBiZWdpbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBvbkJlZ2luID0gdGhpcy5v
cHRpb25zICYmIHRoaXMub3B0aW9ucy5vbkJlZ2luLAotICAgICAgICAgICAgcHJldmlvdXNJbnN0
YW5jZSA9IHRoaXMuY3VycmVudEluc3RhbmNlOwotCi0gICAgICAgIGlmIChwcmV2aW91c0luc3Rh
bmNlKSB7Ci0gICAgICAgICAgdGhpcy5pbnN0YW5jZVN0YWNrLnB1c2gocHJldmlvdXNJbnN0YW5j
ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG5ldyBEZWZl
cnJlZEFjdGlvblF1ZXVlcyh0aGlzLnF1ZXVlTmFtZXMsIHRoaXMub3B0aW9ucyk7Ci0gICAgICAg
IGlmIChvbkJlZ2luKSB7Ci0gICAgICAgICAgb25CZWdpbih0aGlzLmN1cnJlbnRJbnN0YW5jZSwg
cHJldmlvdXNJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIGVuZDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIHZhciBvbkVuZCA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlv
bnMub25FbmQsCi0gICAgICAgICAgICBjdXJyZW50SW5zdGFuY2UgPSB0aGlzLmN1cnJlbnRJbnN0
YW5jZSwKLSAgICAgICAgICAgIG5leHRJbnN0YW5jZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsK
LSAgICAgICAgICBjdXJyZW50SW5zdGFuY2UuZmx1c2goKTsKLSAgICAgICAgfSBmaW5hbGx5IHsK
LSAgICAgICAgICB0aGlzLmN1cnJlbnRJbnN0YW5jZSA9IG51bGw7Ci0KLSAgICAgICAgICBpZiAo
dGhpcy5pbnN0YW5jZVN0YWNrLmxlbmd0aCkgewotICAgICAgICAgICAgbmV4dEluc3RhbmNlID0g
dGhpcy5pbnN0YW5jZVN0YWNrLnBvcCgpOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5zdGFu
Y2UgPSBuZXh0SW5zdGFuY2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG9uRW5kKSB7
Ci0gICAgICAgICAgICBvbkVuZChjdXJyZW50SW5zdGFuY2UsIG5leHRJbnN0YW5jZSk7Ci0gICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICBydW46IGZ1bmN0aW9uKHRhcmdl
dCwgbWV0aG9kIC8qLCBhcmdzICovKSB7Ci0gICAgICAgIHZhciByZXQ7Ci0gICAgICAgIHRoaXMu
YmVnaW4oKTsKLQotICAgICAgICBpZiAoIW1ldGhvZCkgewotICAgICAgICAgIG1ldGhvZCA9IHRh
cmdldDsKLSAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0
W21ldGhvZF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmV2ZW50IFNhZmFyaSBkb3VibGUt
ZmluYWxseS4KLSAgICAgICAgdmFyIGZpbmFsbHlBbHJlYWR5Q2FsbGVkID0gZmFsc2U7Ci0gICAg
ICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAg
ICAgICByZXQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikp
OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBtZXRob2QuY2FsbCh0YXJn
ZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoIWZp
bmFsbHlBbHJlYWR5Q2FsbGVkKSB7Ci0gICAgICAgICAgICBmaW5hbGx5QWxyZWFkeUNhbGxlZCA9
IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmVuZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfSwKLQotICAgICAgZGVmZXI6IGZ1bmN0aW9uKHF1
ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QgLyogLCBhcmdzICovKSB7Ci0gICAgICAgIGlmICghbWV0
aG9kKSB7Ci0gICAgICAgICAgbWV0aG9kID0gdGFyZ2V0OwotICAgICAgICAgIHRhcmdldCA9IG51
bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycp
IHsKLSAgICAgICAgICBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHZhciBzdGFjayA9IHRoaXMuREVCVUcgPyBuZXcgRXJyb3IoKSA6IHVuZGVmaW5lZCwKLSAg
ICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1l
bnRzLCAzKSA6IHVuZGVmaW5lZDsKLSAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkg
eyBjcmVhdGVBdXRvcnVuKHRoaXMpOyB9Ci0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbnN0
YW5jZS5zY2hlZHVsZShxdWV1ZU5hbWUsIHRhcmdldCwgbWV0aG9kLCBhcmdzLCBmYWxzZSwgc3Rh
Y2spOwotICAgICAgfSwKLQotICAgICAgZGVmZXJPbmNlOiBmdW5jdGlvbihxdWV1ZU5hbWUsIHRh
cmdldCwgbWV0aG9kIC8qICwgYXJncyAqLykgewotICAgICAgICBpZiAoIW1ldGhvZCkgewotICAg
ICAgICAgIG1ldGhvZCA9IHRhcmdldDsKLSAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAg
ICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgc3Rh
Y2sgPSB0aGlzLkRFQlVHID8gbmV3IEVycm9yKCkgOiB1bmRlZmluZWQsCi0gICAgICAgICAgICBh
cmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiB1
bmRlZmluZWQ7Ci0gICAgICAgIGlmICghdGhpcy5jdXJyZW50SW5zdGFuY2UpIHsgY3JlYXRlQXV0
b3J1bih0aGlzKTsgfQotICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2Uuc2NoZWR1
bGUocXVldWVOYW1lLCB0YXJnZXQsIG1ldGhvZCwgYXJncywgdHJ1ZSwgc3RhY2spOwotICAgICAg
fSwKLQotICAgICAgc2V0VGltZW91dDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBhcmdzID0g
c2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICB2YXIgbGVuZ3RoID0gYXJncy5sZW5ndGg7
Ci0gICAgICAgIHZhciBtZXRob2QsIHdhaXQsIHRhcmdldDsKLSAgICAgICAgdmFyIHNlbGYgPSB0
aGlzOwotICAgICAgICB2YXIgbWV0aG9kT3JUYXJnZXQsIG1ldGhvZE9yV2FpdCwgbWV0aG9kT3JB
cmdzOwotCi0gICAgICAgIGlmIChsZW5ndGggPT09IDApIHsKLSAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7Ci0gICAgICAgICAgbWV0aG9kID0gYXJn
cy5zaGlmdCgpOwotICAgICAgICAgIHdhaXQgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGxlbmd0
aCA9PT0gMikgewotICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJnc1swXTsKLSAgICAgICAg
ICBtZXRob2RPcldhaXQgPSBhcmdzWzFdOwotCi0gICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2RP
cldhaXQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mICBtZXRob2RPclRhcmdldFttZXRob2RPcldh
aXRdID09PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBhcmdzLnNoaWZ0KCk7
Ci0gICAgICAgICAgICBtZXRob2QgPSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgICB3YWl0ID0g
MDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29lcmNhYmxlTnVtYmVyKG1ldGhvZE9yV2FpdCkp
IHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIHdhaXQg
PSBhcmdzLnNoaWZ0KCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGhvZCA9
IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICAgIHdhaXQgPSAgMDsKLSAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07
Ci0KLSAgICAgICAgICBpZiAoaXNDb2VyY2FibGVOdW1iZXIobGFzdCkpIHsKLSAgICAgICAgICAg
IHdhaXQgPSBhcmdzLnBvcCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1ldGhvZE9yVGFy
Z2V0ID0gYXJnc1swXTsKLSAgICAgICAgICBtZXRob2RPckFyZ3MgPSBhcmdzWzFdOwotCi0gICAg
ICAgICAgaWYgKHR5cGVvZiBtZXRob2RPckFyZ3MgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBt
ZXRob2RPckFyZ3MgPT09ICdzdHJpbmcnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ICE9PSBudWxsICYmCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE9y
QXJncyBpbiBtZXRob2RPclRhcmdldCkpIHsKLSAgICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hp
ZnQoKTsKLSAgICAgICAgICAgIG1ldGhvZCA9IGFyZ3Muc2hpZnQoKTsKLSAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOwotICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIHZhciBleGVjdXRlQXQgPSAoK25ldyBEYXRlKCkpICsgcGFyc2VJ
bnQod2FpdCwgMTApOwotCi0gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykg
ewotICAgICAgICAgIG1ldGhvZCA9IHRhcmdldFttZXRob2RdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZnVuY3Rpb24gZm4oKSB7Ci0gICAgICAgICAgbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJncyk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHBvc2l0aW9uIHRvIGluc2VydCAtIFRPRE86
IGJpbmFyeSBzZWFyY2gKLSAgICAgICAgdmFyIGksIGw7Ci0gICAgICAgIGZvciAoaSA9IDAsIGwg
PSB0aW1lcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7Ci0gICAgICAgICAgaWYgKGV4ZWN1dGVB
dCA8IHRpbWVyc1tpXSkgeyBicmVhazsgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGltZXJzLnNw
bGljZShpLCAwLCBleGVjdXRlQXQsIGZuKTsKLQotICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNl
bGYsIGV4ZWN1dGVBdCwgd2FpdCk7Ci0KLSAgICAgICAgcmV0dXJuIGZuOwotICAgICAgfSwKLQot
ICAgICAgdGhyb3R0bGU6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywgd2FpdCAq
LykgewotICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCi0gICAgICAgICAgICBhcmdzID0gYXJndW1l
bnRzLAotICAgICAgICAgICAgd2FpdCA9IHBhcnNlSW50KHBvcC5jYWxsKGFyZ3MpLCAxMCksCi0g
ICAgICAgICAgICB0aHJvdHRsZXIsCi0gICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgIHRp
bWVyOwotCi0gICAgICAgIGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCk7Ci0g
ICAgICAgIGlmIChpbmRleCA+IC0xKSB7IHJldHVybiB0aHJvdHRsZXJzW2luZGV4XTsgfSAvLyB0
aHJvdHRsZWQKLQotICAgICAgICB0aW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkg
ewotICAgICAgICAgIHNlbGYucnVuLmFwcGx5KHNlbGYsIGFyZ3MpOwotCi0gICAgICAgICAgdmFy
IGluZGV4ID0gZmluZFRocm90dGxlcih0YXJnZXQsIG1ldGhvZCk7Ci0gICAgICAgICAgaWYgKGlu
ZGV4ID4gLTEpIHsgdGhyb3R0bGVycy5zcGxpY2UoaW5kZXgsIDEpOyB9Ci0gICAgICAgIH0sIHdh
aXQpOwotCi0gICAgICAgIHRocm90dGxlciA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOwotCi0g
ICAgICAgIHRocm90dGxlcnMucHVzaCh0aHJvdHRsZXIpOwotCi0gICAgICAgIHJldHVybiB0aHJv
dHRsZXI7Ci0gICAgICB9LAotCi0gICAgICBkZWJvdW5jZTogZnVuY3Rpb24odGFyZ2V0LCBtZXRo
b2QgLyogLCBhcmdzLCB3YWl0LCBbaW1tZWRpYXRlXSAqLykgewotICAgICAgICB2YXIgc2VsZiA9
IHRoaXMsCi0gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAotICAgICAgICAgICAgaW1tZWRp
YXRlID0gcG9wLmNhbGwoYXJncyksCi0gICAgICAgICAgICB3YWl0LAotICAgICAgICAgICAgaW5k
ZXgsCi0gICAgICAgICAgICBkZWJvdW5jZWUsCi0gICAgICAgICAgICB0aW1lcjsKLQotICAgICAg
ICBpZiAodHlwZW9mIGltbWVkaWF0ZSA9PT0gIm51bWJlciIgfHwgdHlwZW9mIGltbWVkaWF0ZSA9
PT0gInN0cmluZyIpIHsKLSAgICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOwotICAgICAgICAgIGlt
bWVkaWF0ZSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdhaXQgPSBwb3Au
Y2FsbChhcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAx
MCk7Ci0gICAgICAgIC8vIFJlbW92ZSBkZWJvdW5jZWUKLSAgICAgICAgaW5kZXggPSBmaW5kRGVi
b3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKLQotICAgICAgICBpZiAoaW5kZXggPiAtMSkgewotICAg
ICAgICAgIGRlYm91bmNlZSA9IGRlYm91bmNlZXNbaW5kZXhdOwotICAgICAgICAgIGRlYm91bmNl
ZXMuc3BsaWNlKGluZGV4LCAxKTsKLSAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VlWzJd
KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHsKLSAgICAgICAgICAgIHNlbGYucnVu
LmFwcGx5KHNlbGYsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICB2YXIgaW5kZXggPSBm
aW5kRGVib3VuY2VlKHRhcmdldCwgbWV0aG9kKTsKLSAgICAgICAgICBpZiAoaW5kZXggPiAtMSkg
ewotICAgICAgICAgICAgZGVib3VuY2Vlcy5zcGxpY2UoaW5kZXgsIDEpOwotICAgICAgICAgIH0K
LSAgICAgICAgfSwgd2FpdCk7Ci0KLSAgICAgICAgaWYgKGltbWVkaWF0ZSAmJiBpbmRleCA9PT0g
LTEpIHsKLSAgICAgICAgICBzZWxmLnJ1bi5hcHBseShzZWxmLCBhcmdzKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhvZCwgdGltZXJdOwotCi0gICAgICAg
IGRlYm91bmNlZXMucHVzaChkZWJvdW5jZWUpOwotCi0gICAgICAgIHJldHVybiBkZWJvdW5jZWU7
Ci0gICAgICB9LAotCi0gICAgICBjYW5jZWxUaW1lcnM6IGZ1bmN0aW9uKCkgewotICAgICAgICB2
YXIgaSwgbGVuOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRocm90dGxlcnMubGVuZ3Ro
OyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICBjbGVhclRpbWVvdXQodGhyb3R0bGVyc1tpXVsy
XSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3R0bGVycyA9IFtdOwotCi0gICAgICAgIGZvciAo
aSA9IDAsIGxlbiA9IGRlYm91bmNlZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAg
ICBjbGVhclRpbWVvdXQoZGVib3VuY2Vlc1tpXVsyXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVi
b3VuY2VlcyA9IFtdOwotCi0gICAgICAgIGlmIChsYXRlclRpbWVyKSB7Ci0gICAgICAgICAgY2xl
YXJUaW1lb3V0KGxhdGVyVGltZXIpOwotICAgICAgICAgIGxhdGVyVGltZXIgPSBudWxsOwotICAg
ICAgICB9Ci0gICAgICAgIHRpbWVycyA9IFtdOwotCi0gICAgICAgIGlmIChhdXRvcnVuKSB7Ci0g
ICAgICAgICAgY2xlYXJUaW1lb3V0KGF1dG9ydW4pOwotICAgICAgICAgIGF1dG9ydW4gPSBudWxs
OwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICBoYXNUaW1lcnM6IGZ1bmN0aW9uKCkgewot
ICAgICAgICByZXR1cm4gISF0aW1lcnMubGVuZ3RoIHx8IGF1dG9ydW47Ci0gICAgICB9LAotCi0g
ICAgICBjYW5jZWw6IGZ1bmN0aW9uKHRpbWVyKSB7Ci0gICAgICAgIHZhciB0aW1lclR5cGUgPSB0
eXBlb2YgdGltZXI7Ci0KLSAgICAgICAgaWYgKHRpbWVyICYmIHRpbWVyVHlwZSA9PT0gJ29iamVj
dCcgJiYgdGltZXIucXVldWUgJiYgdGltZXIubWV0aG9kKSB7IC8vIHdlJ3JlIGNhbmNlbGxpbmcg
YSBkZWZlck9uY2UKLSAgICAgICAgICByZXR1cm4gdGltZXIucXVldWUuY2FuY2VsKHRpbWVyKTsK
LSAgICAgICAgfSBlbHNlIGlmICh0aW1lclR5cGUgPT09ICdmdW5jdGlvbicpIHsgLy8gd2UncmUg
Y2FuY2VsbGluZyBhIHNldFRpbWVvdXQKLSAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRp
bWVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGlmICh0aW1lcnNbaSAr
IDFdID09PSB0aW1lcikgewotICAgICAgICAgICAgICB0aW1lcnMuc3BsaWNlKGksIDIpOyAvLyBy
ZW1vdmUgdGhlIHR3byBlbGVtZW50cwotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2luZG93LnRvU3RyaW5n
LmNhbGwodGltZXIpID09PSAiW29iamVjdCBBcnJheV0iKXsgLy8gd2UncmUgY2FuY2VsbGluZyBh
IHRocm90dGxlIG9yIGRlYm91bmNlCi0gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNlbEl0ZW0o
ZmluZFRocm90dGxlciwgdGhyb3R0bGVycywgdGltZXIpIHx8IAotICAgICAgICAgICAgICAgICAg
IHRoaXMuX2NhbmNlbEl0ZW0oZmluZERlYm91bmNlZSwgZGVib3VuY2VlcywgdGltZXIpOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybjsgLy8gdGltZXIgd2FzIG51bGwgb3Igbm90
IGEgdGltZXIKLSAgICAgICAgfQotICAgICAgfSwKLQotICAgICAgX2NhbmNlbEl0ZW06IGZ1bmN0
aW9uKGZpbmRNZXRob2QsIGFycmF5LCB0aW1lcil7Ci0gICAgICAgIHZhciBpdGVtLAotICAgICAg
ICAgICAgaW5kZXg7Ci0KLSAgICAgICAgaWYgKHRpbWVyLmxlbmd0aCA8IDMpIHsgcmV0dXJuIGZh
bHNlOyB9Ci0KLSAgICAgICAgaW5kZXggPSBmaW5kTWV0aG9kKHRpbWVyWzBdLCB0aW1lclsxXSk7
Ci0KLSAgICAgICAgaWYoaW5kZXggPiAtMSkgewotCi0gICAgICAgICAgaXRlbSA9IGFycmF5W2lu
ZGV4XTsKLQotICAgICAgICAgIGlmKGl0ZW1bMl0gPT09IHRpbWVyWzJdKXsKLSAgICAgICAgICAg
IGFycmF5LnNwbGljZShpbmRleCwgMSk7Ci0gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJb
Ml0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfTsKLQotICAgIEJhY2tidXJu
ZXIucHJvdG90eXBlLnNjaGVkdWxlID0gQmFja2J1cm5lci5wcm90b3R5cGUuZGVmZXI7Ci0gICAg
QmFja2J1cm5lci5wcm90b3R5cGUuc2NoZWR1bGVPbmNlID0gQmFja2J1cm5lci5wcm90b3R5cGUu
ZGVmZXJPbmNlOwotICAgIEJhY2tidXJuZXIucHJvdG90eXBlLmxhdGVyID0gQmFja2J1cm5lci5w
cm90b3R5cGUuc2V0VGltZW91dDsKLQotICAgIGZ1bmN0aW9uIGNyZWF0ZUF1dG9ydW4oYmFja2J1
cm5lcikgewotICAgICAgYmFja2J1cm5lci5iZWdpbigpOwotICAgICAgYXV0b3J1biA9IGdsb2Jh
bC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICBhdXRvcnVuID0gbnVsbDsKLSAgICAg
ICAgYmFja2J1cm5lci5lbmQoKTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHVw
ZGF0ZUxhdGVyVGltZXIoc2VsZiwgZXhlY3V0ZUF0LCB3YWl0KSB7Ci0gICAgICBpZiAoIWxhdGVy
VGltZXIgfHwgZXhlY3V0ZUF0IDwgbGF0ZXJUaW1lckV4cGlyZXNBdCkgewotICAgICAgICBpZiAo
bGF0ZXJUaW1lcikgewotICAgICAgICAgIGNsZWFyVGltZW91dChsYXRlclRpbWVyKTsKLSAgICAg
ICAgfQotICAgICAgICBsYXRlclRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgbGF0ZXJUaW1lciA9IG51bGw7Ci0gICAgICAgICAgbGF0ZXJUaW1lckV4cGly
ZXNBdCA9IG51bGw7Ci0gICAgICAgICAgZXhlY3V0ZVRpbWVycyhzZWxmKTsKLSAgICAgICAgfSwg
d2FpdCk7Ci0gICAgICAgIGxhdGVyVGltZXJFeHBpcmVzQXQgPSBleGVjdXRlQXQ7Ci0gICAgICB9
Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZXhlY3V0ZVRpbWVycyhzZWxmKSB7Ci0gICAgICB2YXIg
bm93ID0gK25ldyBEYXRlKCksCi0gICAgICAgICAgdGltZSwgZm5zLCBpLCBsOwotCi0gICAgICBz
ZWxmLnJ1bihmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gVE9ETzogYmluYXJ5IHNlYXJjaAotICAg
ICAgICBmb3IgKGkgPSAwLCBsID0gdGltZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewotICAg
ICAgICAgIHRpbWUgPSB0aW1lcnNbaV07Ci0gICAgICAgICAgaWYgKHRpbWUgPiBub3cpIHsgYnJl
YWs7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGZucyA9IHRpbWVycy5zcGxpY2UoMCwgaSk7Ci0K
LSAgICAgICAgZm9yIChpID0gMSwgbCA9IGZucy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKLSAg
ICAgICAgICBzZWxmLnNjaGVkdWxlKHNlbGYub3B0aW9ucy5kZWZhdWx0UXVldWUsIG51bGwsIGZu
c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBpZiAodGltZXJzLmxlbmd0aCkg
ewotICAgICAgICB1cGRhdGVMYXRlclRpbWVyKHNlbGYsIHRpbWVyc1swXSwgdGltZXJzWzBdIC0g
bm93KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmaW5kRGVib3VuY2VlKHRhcmdl
dCwgbWV0aG9kKSB7Ci0gICAgICB2YXIgZGVib3VuY2VlLAotICAgICAgICAgIGluZGV4ID0gLTE7
Ci0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVib3VuY2Vlcy5sZW5ndGg7IGkgPCBsOyBp
KyspIHsKLSAgICAgICAgZGVib3VuY2VlID0gZGVib3VuY2Vlc1tpXTsKLSAgICAgICAgaWYgKGRl
Ym91bmNlZVswXSA9PT0gdGFyZ2V0ICYmIGRlYm91bmNlZVsxXSA9PT0gbWV0aG9kKSB7Ci0gICAg
ICAgICAgaW5kZXggPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0K
LSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmaW5kVGhyb3R0bGVy
KHRhcmdldCwgbWV0aG9kKSB7Ci0gICAgICB2YXIgdGhyb3R0bGVyLAotICAgICAgICAgIGluZGV4
ID0gLTE7Ci0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhyb3R0bGVycy5sZW5ndGg7IGkg
PCBsOyBpKyspIHsKLSAgICAgICAgdGhyb3R0bGVyID0gdGhyb3R0bGVyc1tpXTsKLSAgICAgICAg
aWYgKHRocm90dGxlclswXSA9PT0gdGFyZ2V0ICYmIHRocm90dGxlclsxXSA9PT0gbWV0aG9kKSB7
Ci0gICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICB9Ci0KLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLQotICAgIF9fZXhwb3J0c19fLkJh
Y2tidXJuZXIgPSBCYWNrYnVybmVyOwotICB9KTsKLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7
Ci12YXIgb25CZWdpbiA9IGZ1bmN0aW9uKGN1cnJlbnQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRS
dW5Mb29wID0gY3VycmVudDsKLX07Ci0KLXZhciBvbkVuZCA9IGZ1bmN0aW9uKGN1cnJlbnQsIG5l
eHQpIHsKLSAgRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gbmV4dDsKLX07Ci0KLXZhciBCYWNr
YnVybmVyID0gcmVxdWlyZU1vZHVsZSgnYmFja2J1cm5lcicpLkJhY2tidXJuZXIsCi0gICAgYmFj
a2J1cm5lciA9IG5ldyBCYWNrYnVybmVyKFsnc3luYycsICdhY3Rpb25zJywgJ2Rlc3Ryb3knXSwg
ewotICAgICAgc3luYzogewotICAgICAgICBiZWZvcmU6IEVtYmVyLmJlZ2luUHJvcGVydHlDaGFu
Z2VzLAotICAgICAgICBhZnRlcjogRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzCi0gICAgICB9LAot
ICAgICAgZGVmYXVsdFF1ZXVlOiAnYWN0aW9ucycsCi0gICAgICBvbkJlZ2luOiBvbkJlZ2luLAot
ICAgICAgb25FbmQ6IG9uRW5kCi0gICAgfSksCi0gICAgc2xpY2UgPSBbXS5zbGljZTsKLQotLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotLy8gRW1iZXIucnVuIC0gdGhpcyBpcyBpZGVhbGx5IHRoZSBvbmx5IHB1YmxpYyBBUEkgdGhl
IGRldiBzZWVzCi0vLwotCi0vKioKLSAgUnVucyB0aGUgcGFzc2VkIHRhcmdldCBhbmQgbWV0aG9k
IGluc2lkZSBvZiBhIFJ1bkxvb3AsIGVuc3VyaW5nIGFueQotICBkZWZlcnJlZCBhY3Rpb25zIGlu
Y2x1ZGluZyBiaW5kaW5ncyBhbmQgdmlld3MgdXBkYXRlcyBhcmUgZmx1c2hlZCBhdCB0aGUKLSAg
ZW5kLgotCi0gIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5lZWQgdG8gaW52b2tlIHRoaXMgbWV0
aG9kIHlvdXJzZWxmLiBIb3dldmVyIGlmCi0gIHlvdSBhcmUgaW1wbGVtZW50aW5nIHJhdyBldmVu
dCBoYW5kbGVycyB3aGVuIGludGVyZmFjaW5nIHdpdGggb3RoZXIKLSAgbGlicmFyaWVzIG9yIHBs
dWdpbnMsIHlvdSBzaG91bGQgcHJvYmFibHkgd3JhcCBhbGwgb2YgeW91ciBjb2RlIGluc2lkZSB0
aGlzCi0gIGNhbGwuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7
Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3AKLSAgfSk7Ci0gIGBg
YAotCi0gIEBjbGFzcyBydW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0gIEBjb25z
dHJ1Y3RvcgotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBj
YWxsCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGludm9rZS4K
LSAgICBNYXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBzdHJpbmcK
LSAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0LgotICBA
cGFyYW0ge09iamVjdH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgeW91IHdpc2gg
dG8gcGFzcyB0byB0aGUgbWV0aG9kLgotICBAcmV0dXJuIHtPYmplY3R9IHJldHVybiB2YWx1ZSBm
cm9tIGludm9raW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24uCi0qLwotRW1iZXIucnVuID0gZnVuY3Rp
b24odGFyZ2V0LCBtZXRob2QpIHsKLSAgdmFyIHJldDsKLQotICBpZiAoRW1iZXIub25lcnJvcikg
ewotICAgIHRyeSB7Ci0gICAgICByZXQgPSBiYWNrYnVybmVyLnJ1bi5hcHBseShiYWNrYnVybmVy
LCBhcmd1bWVudHMpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIEVtYmVyLm9uZXJyb3IoZSk7
Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldCA9IGJhY2tidXJuZXIucnVuLmFwcGx5KGJhY2ti
dXJuZXIsIGFyZ3VtZW50cyk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfTsKLQotLyoqCi0gIElm
IG5vIHJ1bi1sb29wIGlzIHByZXNlbnQsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBJZiBhIHJ1biBs
b29wIGlzCi0gIHByZXNlbnQgaXQgd2lsbCBxdWV1ZSBpdHNlbGYgdG8gcnVuIG9uIHRoZSBleGlz
dGluZyBydW4tbG9vcHMgYWN0aW9uCi0gIHF1ZXVlLgotCi0gIFBsZWFzZSBub3RlOiBUaGlzIGlz
IG5vdCBmb3Igbm9ybWFsIHVzYWdlLCBhbmQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi0g
IElmIGludm9rZWQgd2hlbiBub3Qgd2l0aGluIGEgcnVuIGxvb3A6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICBFbWJlci5ydW4uam9pbihmdW5jdGlvbigpIHsKLSAgICAvLyBjcmVhdGVzIGEgbmV3IHJ1
bi1sb29wCi0gIH0pOwotICBgYGAKLQotICBBbHRlcm5hdGl2ZWx5LCBpZiBjYWxsZWQgd2l0aGlu
IGFuIGV4aXN0aW5nIHJ1biBsb29wOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVuKGZ1
bmN0aW9uKCkgewotICAgIC8vIGNyZWF0ZXMgYSBuZXcgcnVuLWxvb3AKLSAgICBFbWJlci5ydW4u
am9pbihmdW5jdGlvbigpIHsKLSAgICAgIC8vIGpvaW5zIHdpdGggdGhlIGV4aXN0aW5nIHJ1bi1s
b29wLCBhbmQgcXVldWVzIGZvciBpbnZvY2F0aW9uIG9uCi0gICAgICAvLyB0aGUgZXhpc3Rpbmcg
cnVuLWxvb3BzIGFjdGlvbiBxdWV1ZS4KLSAgICB9KTsKLSAgfSk7Ci0gIGBgYAotCi0gIEBtZXRo
b2Qgam9pbgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0
YXJnZXQgb2YgbWV0aG9kIHRvIGNhbGwKLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhv
ZCBNZXRob2QgdG8gaW52b2tlLgotICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nLiBJ
ZiB5b3UgcGFzcyBhIHN0cmluZwotICAgIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhl
IHBhc3NlZCB0YXJnZXQuCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIEFueSBhZGRpdGlvbmFs
IGFyZ3VtZW50cyB5b3Ugd2lzaCB0byBwYXNzIHRvIHRoZSBtZXRob2QuCi0gIEByZXR1cm4ge09i
amVjdH0gUmV0dXJuIHZhbHVlIGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBmdW5jdGlvbi4gUGxl
YXNlIG5vdGUsCi0gIHdoZW4gY2FsbGVkIHdpdGhpbiBhbiBleGlzdGluZyBsb29wLCBubyByZXR1
cm4gdmFsdWUgaXMgcG9zc2libGUuCi0qLwotRW1iZXIucnVuLmpvaW4gPSBmdW5jdGlvbih0YXJn
ZXQsIG1ldGhvZCkgewotICBpZiAoIUVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCkgewotICAgIHJl
dHVybiBFbWJlci5ydW4uYXBwbHkoRW1iZXIucnVuLCBhcmd1bWVudHMpOwotICB9Ci0KLSAgdmFy
IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3MudW5zaGlmdCgnYWN0aW9ucycp
OwotICBFbWJlci5ydW4uc2NoZWR1bGUuYXBwbHkoRW1iZXIucnVuLCBhcmdzKTsKLX07Ci0KLUVt
YmVyLnJ1bi5iYWNrYnVybmVyID0gYmFja2J1cm5lcjsKLQotdmFyIHJ1biA9IEVtYmVyLnJ1bjsK
LQotRW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wID0gbnVsbDsKLQotRW1iZXIucnVuLnF1ZXVlcyA9
IGJhY2tidXJuZXIucXVldWVOYW1lczsKLQotLyoqCi0gIEJlZ2lucyBhIG5ldyBSdW5Mb29wLiBB
bnkgZGVmZXJyZWQgYWN0aW9ucyBpbnZva2VkIGFmdGVyIHRoZSBiZWdpbiB3aWxsCi0gIGJlIGJ1
ZmZlcmVkIHVudGlsIHlvdSBpbnZva2UgYSBtYXRjaGluZyBjYWxsIHRvIGBFbWJlci5ydW4uZW5k
KClgLiBUaGlzIGlzCi0gIGEgbG93ZXItbGV2ZWwgd2F5IHRvIHVzZSBhIFJ1bkxvb3AgaW5zdGVh
ZCBvZiB1c2luZyBgRW1iZXIucnVuKClgLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVu
LmJlZ2luKCk7Ci0gIC8vIGNvZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wCi0gIEVt
YmVyLnJ1bi5lbmQoKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBiZWdpbgotICBAcmV0dXJuIHt2b2lk
fQotKi8KLUVtYmVyLnJ1bi5iZWdpbiA9IGZ1bmN0aW9uKCkgewotICBiYWNrYnVybmVyLmJlZ2lu
KCk7Ci19OwotCi0vKioKLSAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMgbXVzdCBiZSBjYWxsZWQgc29t
ZXRpbWUgYWZ0ZXIgeW91IGNhbGwKLSAgYEVtYmVyLnJ1bi5iZWdpbigpYCB0byBmbHVzaCBhbnkg
ZGVmZXJyZWQgYWN0aW9ucy4gVGhpcyBpcyBhIGxvd2VyLWxldmVsIHdheQotICB0byB1c2UgYSBS
dW5Mb29wIGluc3RlYWQgb2YgdXNpbmcgYEVtYmVyLnJ1bigpYC4KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLnJ1bi5iZWdpbigpOwotICAvLyBjb2RlIHRvIGJlIGV4ZWN1dGUgd2l0aGluIGEg
UnVuTG9vcAotICBFbWJlci5ydW4uZW5kKCk7Ci0gIGBgYAotCi0gIEBtZXRob2QgZW5kCi0gIEBy
ZXR1cm4ge3ZvaWR9Ci0qLwotRW1iZXIucnVuLmVuZCA9IGZ1bmN0aW9uKCkgewotICBiYWNrYnVy
bmVyLmVuZCgpOwotfTsKLQotLyoqCi0gIEFycmF5IG9mIG5hbWVkIHF1ZXVlcy4gVGhpcyBhcnJh
eSBkZXRlcm1pbmVzIHRoZSBvcmRlciBpbiB3aGljaCBxdWV1ZXMKLSAgYXJlIGZsdXNoZWQgYXQg
dGhlIGVuZCBvZiB0aGUgUnVuTG9vcC4gWW91IGNhbiBkZWZpbmUgeW91ciBvd24gcXVldWVzIGJ5
Ci0gIHNpbXBseSBhZGRpbmcgdGhlIHF1ZXVlIG5hbWUgdG8gdGhpcyBhcnJheS4gTm9ybWFsbHkg
eW91IHNob3VsZCBub3QgbmVlZAotICB0byBpbnNwZWN0IG9yIG1vZGlmeSB0aGlzIHByb3BlcnR5
LgotCi0gIEBwcm9wZXJ0eSBxdWV1ZXMKLSAgQHR5cGUgQXJyYXkKLSAgQGRlZmF1bHQgWydzeW5j
JywgJ2FjdGlvbnMnLCAnZGVzdHJveSddCi0qLwotCi0vKioKLSAgQWRkcyB0aGUgcGFzc2VkIHRh
cmdldC9tZXRob2QgYW5kIGFueSBvcHRpb25hbCBhcmd1bWVudHMgdG8gdGhlIG5hbWVkCi0gIHF1
ZXVlIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhlIFJ1bkxvb3AuIElmIHlvdSBoYXZl
IG5vdCBhbHJlYWR5Ci0gIHN0YXJ0ZWQgYSBSdW5Mb29wIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhv
ZCBvbmUgd2lsbCBiZSBzdGFydGVkIGZvciB5b3UKLSAgYXV0b21hdGljYWxseS4KLQotICBBdCB0
aGUgZW5kIG9mIGEgUnVuTG9vcCwgYW55IG1ldGhvZHMgc2NoZWR1bGVkIGluIHRoaXMgd2F5IHdp
bGwgYmUgaW52b2tlZC4KLSAgTWV0aG9kcyB3aWxsIGJlIGludm9rZWQgaW4gYW4gb3JkZXIgbWF0
Y2hpbmcgdGhlIG5hbWVkIHF1ZXVlcyBkZWZpbmVkIGluCi0gIHRoZSBgRW1iZXIucnVuLnF1ZXVl
c2AgcHJvcGVydHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4uc2NoZWR1bGUoJ3N5
bmMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAvLyB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgaW4g
dGhlIGZpcnN0IFJ1bkxvb3AgcXVldWUsIHdoZW4gYmluZGluZ3MgYXJlIHN5bmNlZAotICAgIGNv
bnNvbGUubG9nKCJzY2hlZHVsZWQgb24gc3luYyBxdWV1ZSIpOwotICB9KTsKLQotICBFbWJlci5y
dW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAgICAvLyB0aGlzIHdp
bGwgYmUgZXhlY3V0ZWQgaW4gdGhlICdhY3Rpb25zJyBxdWV1ZSwgYWZ0ZXIgYmluZGluZ3MgaGF2
ZSBzeW5jZWQuCi0gICAgY29uc29sZS5sb2coInNjaGVkdWxlZCBvbiBhY3Rpb25zIHF1ZXVlIik7
Ci0gIH0pOwotCi0gIC8vIE5vdGUgdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIHJ1biBpbiBvcmRlciBi
YXNlZCBvbiB0aGUgcnVuIHF1ZXVlcyBvcmRlci4KLSAgLy8gT3V0cHV0IHdvdWxkIGJlOgotICAv
LyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlCi0gIC8vICAgc2NoZWR1bGVkIG9uIGFjdGlvbnMg
cXVldWUKLSAgYGBgCi0KLSAgQG1ldGhvZCBzY2hlZHVsZQotICBAcGFyYW0ge1N0cmluZ30gcXVl
dWUgVGhlIG5hbWUgb2YgdGhlIHF1ZXVlIHRvIHNjaGVkdWxlIGFnYWluc3QuCi0gICAgRGVmYXVs
dCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlvbnMnCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFy
Z2V0XSB0YXJnZXQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgY29udGV4dCB3aGVuIGludm9raW5nIGEg
bWV0aG9kLgotICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBtZXRob2QgdG8g
aW52b2tlLiBJZiB5b3UgcGFzcyBhIHN0cmluZyBpdAotICAgIHdpbGwgYmUgcmVzb2x2ZWQgb24g
dGhlIHRhcmdldCBvYmplY3QgYXQgdGhlIHRpbWUgdGhlIHNjaGVkdWxlZCBpdGVtIGlzCi0gICAg
aW52b2tlZCBhbGxvd2luZyB5b3UgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZnVuY3Rpb24uCi0gIEBw
YXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3Nl
ZCB0byB0aGUgcXVldWVkIG1ldGhvZC4KLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5ydW4u
c2NoZWR1bGUgPSBmdW5jdGlvbihxdWV1ZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgY2hlY2tBdXRv
UnVuKCk7Ci0gIGJhY2tidXJuZXIuc2NoZWR1bGUuYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRz
KTsKLX07Ci0KLS8vIFVzZWQgYnkgZ2xvYmFsIHRlc3QgdGVhcmRvd24KLUVtYmVyLnJ1bi5oYXNT
Y2hlZHVsZWRUaW1lcnMgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIGJhY2tidXJuZXIuaGFzVGlt
ZXJzKCk7Ci19OwotCi0vLyBVc2VkIGJ5IGdsb2JhbCB0ZXN0IHRlYXJkb3duCi1FbWJlci5ydW4u
Y2FuY2VsVGltZXJzID0gZnVuY3Rpb24gKCkgewotICBiYWNrYnVybmVyLmNhbmNlbFRpbWVycygp
OwotfTsKLQotLyoqCi0gIEltbWVkaWF0ZWx5IGZsdXNoZXMgYW55IGV2ZW50cyBzY2hlZHVsZWQg
aW4gdGhlICdzeW5jJyBxdWV1ZS4gQmluZGluZ3MKLSAgdXNlIHRoaXMgcXVldWUgc28gdGhpcyBt
ZXRob2QgaXMgYSB1c2VmdWwgd2F5IHRvIGltbWVkaWF0ZWx5IGZvcmNlIGFsbAotICBiaW5kaW5n
cyBpbiB0aGUgYXBwbGljYXRpb24gdG8gc3luYy4KLQotICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBt
ZXRob2QgYW55dGltZSB5b3UgbmVlZCBhbnkgY2hhbmdlZCBzdGF0ZSB0byBwcm9wYWdhdGUKLSAg
dGhyb3VnaG91dCB0aGUgYXBwIGltbWVkaWF0ZWx5IHdpdGhvdXQgcmVwYWludGluZyB0aGUgVUkg
KHdoaWNoIGhhcHBlbnMKLSAgaW4gdGhlIGxhdGVyICdyZW5kZXInIHF1ZXVlIGFkZGVkIGJ5IHRo
ZSBgZW1iZXItdmlld3NgIHBhY2thZ2UpLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIucnVu
LnN5bmMoKTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBzeW5jCi0gIEByZXR1cm4ge3ZvaWR9Ci0qLwot
RW1iZXIucnVuLnN5bmMgPSBmdW5jdGlvbigpIHsKLSAgaWYgKGJhY2tidXJuZXIuY3VycmVudElu
c3RhbmNlKSB7Ci0gICAgYmFja2J1cm5lci5jdXJyZW50SW5zdGFuY2UucXVldWVzLnN5bmMuZmx1
c2goKTsKLSAgfQotfTsKLQotLyoqCi0gIEludm9rZXMgdGhlIHBhc3NlZCB0YXJnZXQvbWV0aG9k
IGFuZCBvcHRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgYSBzcGVjaWZpZWQKLSAgcGVyaW9kIGlmIHRp
bWUuIFRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBhIG51
bWJlcgotICBvZiBtaWxsaXNlY29uZHMuCi0KLSAgWW91IHNob3VsZCB1c2UgdGhpcyBtZXRob2Qg
d2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIHNvbWUgYWN0aW9uIGFmdGVyIGEKLSAgcGVyaW9kIG9m
IHRpbWUgaW5zdGVhZCBvZiB1c2luZyBgc2V0VGltZW91dCgpYC4gVGhpcyBtZXRob2Qgd2lsbCBl
bnN1cmUgdGhhdAotICBpdGVtcyB0aGF0IGV4cGlyZSBkdXJpbmcgdGhlIHNhbWUgc2NyaXB0IGV4
ZWN1dGlvbiBjeWNsZSBhbGwgZXhlY3V0ZQotICB0b2dldGhlciwgd2hpY2ggaXMgb2Z0ZW4gbW9y
ZSBlZmZpY2llbnQgdGhhbiB1c2luZyBhIHJlYWwgc2V0VGltZW91dC4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEVtYmVyLnJ1bi5sYXRlcihteUNvbnRleHQsIGZ1bmN0aW9uKCkgewotICAgIC8vIGNv
ZGUgaGVyZSB3aWxsIGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcCBpbiBhYm91dCA1MDBtcyB3aXRo
IHRoaXMgPT0gbXlDb250ZXh0Ci0gIH0sIDUwMCk7Ci0gIGBgYAotCi0gIEBtZXRob2QgbGF0ZXIK
LSAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCi0g
IEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCi0g
ICAgSWYgeW91IHBhc3MgYSBzdHJpbmcgaXQgd2lsbCBiZSByZXNvbHZlZCBvbiB0aGUKLSAgICB0
YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZva2VkLgotICBAcGFyYW0ge09iamVj
dH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAg
QHBhcmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBA
cmV0dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHlvdSBjYW4gdXNlIHRvIGNhbmNlbCB0aGUgdGltZXIg
aW4KLSAgICBgRW1iZXIucnVuLmNhbmNlbGAgbGF0ZXIuCi0qLwotRW1iZXIucnVuLmxhdGVyID0g
ZnVuY3Rpb24odGFyZ2V0LCBtZXRob2QpIHsKLSAgcmV0dXJuIGJhY2tidXJuZXIubGF0ZXIuYXBw
bHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBTY2hlZHVsZSBhIGZ1bmN0
aW9uIHRvIHJ1biBvbmUgdGltZSBkdXJpbmcgdGhlIGN1cnJlbnQgUnVuTG9vcC4gVGhpcyBpcyBl
cXVpdmFsZW50Ci0gIHRvIGNhbGxpbmcgYHNjaGVkdWxlT25jZWAgd2l0aCB0aGUgImFjdGlvbnMi
IHF1ZXVlLgotCi0gIEBtZXRob2Qgb25jZQotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhl
IHRhcmdldCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJp
bmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBJZiB5b3UgcGFzcyBhIHN0cmlu
ZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQotICAgIHRhcmdldCBhdCB0aGUgdGltZSB0aGUg
bWV0aG9kIGlzIGludm9rZWQuCi0gIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFy
Z3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgotICBAcmV0dXJuIHtPYmplY3R9IHRpbWVy
Ci0qLwotRW1iZXIucnVuLm9uY2UgPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCkgewotICBjaGVj
a0F1dG9SdW4oKTsKLSAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gIGFyZ3Mu
dW5zaGlmdCgnYWN0aW9ucycpOwotICByZXR1cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2UuYXBw
bHkoYmFja2J1cm5lciwgYXJncyk7Ci19OwotCi0vKioKLSAgU2NoZWR1bGVzIGEgZnVuY3Rpb24g
dG8gcnVuIG9uZSB0aW1lIGluIGEgZ2l2ZW4gcXVldWUgb2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4K
LSAgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHF1ZXVlL3RhcmdldC9tZXRob2Qg
Y29tYmluYXRpb24gd2lsbCBoYXZlCi0gIG5vIGVmZmVjdCAocGFzdCB0aGUgaW5pdGlhbCBjYWxs
KS4KLQotICBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IGNhbiBwYXNzIG9wdGlvbmFsIGFyZ3VtZW50
cyB0aGVzZSB3aWxsIG5vdCBiZQotICBjb25zaWRlcmVkIHdoZW4gbG9va2luZyBmb3IgZHVwbGlj
YXRlcy4gTmV3IGFyZ3VtZW50cyB3aWxsIHJlcGxhY2UgcHJldmlvdXMKLSAgY2FsbHMuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNheUhpID0g
ZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdoaScpOyB9Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxl
T25jZSgnYWZ0ZXJSZW5kZXInLCBteUNvbnRleHQsIHNheUhpKTsKLSAgICBFbWJlci5ydW4uc2No
ZWR1bGVPbmNlKCdhZnRlclJlbmRlcicsIG15Q29udGV4dCwgc2F5SGkpOwotICAgIC8vIHNheUhp
IHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlLCBpbiB0aGUgYWZ0ZXJSZW5kZXIgcXVldWUgb2Yg
dGhlIFJ1bkxvb3AKLSAgfSk7Ci0gIGBgYAotCi0gIEFsc28gbm90ZSB0aGF0IHBhc3NpbmcgYW4g
YW5vbnltb3VzIGZ1bmN0aW9uIHRvIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNlYCB3aWxsCi0gIG5v
dCBwcmV2ZW50IGFkZGl0aW9uYWwgY2FsbHMgd2l0aCBhbiBpZGVudGljYWwgYW5vbnltb3VzIGZ1
bmN0aW9uIGZyb20KLSAgc2NoZWR1bGluZyB0aGUgaXRlbXMgbXVsdGlwbGUgdGltZXMsIGUuZy46
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBmdW5jdGlvbiBzY2hlZHVsZUl0KCkgewotICAgIEVtYmVy
LnJ1bi5zY2hlZHVsZU9uY2UoJ2FjdGlvbnMnLCBteUNvbnRleHQsIGZ1bmN0aW9uKCkgeyBjb25z
b2xlLmxvZygiQ2xvc3VyZSIpOyB9KTsKLSAgfQotICBzY2hlZHVsZUl0KCk7Ci0gIHNjaGVkdWxl
SXQoKTsKLSAgLy8gIkNsb3N1cmUiIHdpbGwgcHJpbnQgdHdpY2UsIGV2ZW4gdGhvdWdoIHdlJ3Jl
IHVzaW5nIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNlYCwKLSAgLy8gYmVjYXVzZSB0aGUgZnVuY3Rp
b24gd2UgcGFzcyB0byBpdCBpcyBhbm9ueW1vdXMgYW5kIHdvbid0IG1hdGNoIHRoZQotICAvLyBw
cmV2aW91c2x5IHNjaGVkdWxlZCBvcGVyYXRpb24uCi0gIGBgYAotCi0gIEF2YWlsYWJsZSBxdWV1
ZXMsIGFuZCB0aGVpciBvcmRlciwgY2FuIGJlIGZvdW5kIGF0IGBFbWJlci5ydW4ucXVldWVzYAot
Ci0gIEBtZXRob2Qgc2NoZWR1bGVPbmNlCi0gIEBwYXJhbSB7U3RyaW5nfSBbcXVldWVdIFRoZSBu
YW1lIG9mIHRoZSBxdWV1ZSB0byBzY2hlZHVsZSBhZ2FpbnN0LiBEZWZhdWx0IHF1ZXVlcyBhcmUg
J3N5bmMnIGFuZCAnYWN0aW9ucycuCi0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFy
Z2V0IG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30g
bWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0
IHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRo
b2QgaXMgaW52b2tlZC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1l
bnRzIHRvIHBhc3MgdG8gdGhlIHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0gdGltZXIKLSov
Ci1FbWJlci5ydW4uc2NoZWR1bGVPbmNlID0gZnVuY3Rpb24ocXVldWUsIHRhcmdldCwgbWV0aG9k
KSB7Ci0gIGNoZWNrQXV0b1J1bigpOwotICByZXR1cm4gYmFja2J1cm5lci5zY2hlZHVsZU9uY2Uu
YXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBTY2hlZHVsZXMgYW4g
aXRlbSB0byBydW4gZnJvbSB3aXRoaW4gYSBzZXBhcmF0ZSBydW4gbG9vcCwgYWZ0ZXIKLSAgY29u
dHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiBUaGlzIGlzIGVxdWl2YWxlbnQg
dG8gY2FsbGluZwotICBgRW1iZXIucnVuLmxhdGVyYCB3aXRoIGEgd2FpdCB0aW1lIG9mIDFtcy4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLnJ1bi5uZXh0KG15Q29udGV4dCwgZnVuY3Rpb24o
KSB7Ci0gICAgLy8gY29kZSB0byBiZSBleGVjdXRlZCBpbiB0aGUgbmV4dCBydW4gbG9vcCwKLSAg
ICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3VycmVudCBvbmUKLSAgfSk7
Ci0gIGBgYAotCi0gIE11bHRpcGxlIG9wZXJhdGlvbnMgc2NoZWR1bGVkIHdpdGggYEVtYmVyLnJ1
bi5uZXh0YCB3aWxsIGNvYWxlc2NlCi0gIGludG8gdGhlIHNhbWUgbGF0ZXIgcnVuIGxvb3AsIGFs
b25nIHdpdGggYW55IG90aGVyIG9wZXJhdGlvbnMKLSAgc2NoZWR1bGVkIGJ5IGBFbWJlci5ydW4u
bGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQotICB0aW1lIHRoYXQgYEVt
YmVyLnJ1bi5uZXh0YCBvcGVyYXRpb25zIHdpbGwgZmlyZS4KLQotICBOb3RlIHRoYXQgdGhlcmUg
YXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0byB1c2luZyBgRW1iZXIucnVuLm5leHRgLgotICBGb3Ig
aW5zdGFuY2UsIGlmIHlvdSdkIGxpa2UgdG8gc2NoZWR1bGUgYW4gb3BlcmF0aW9uIHRvIGhhcHBl
bgotICBhZnRlciBhbGwgRE9NIGVsZW1lbnQgb3BlcmF0aW9ucyBoYXZlIGNvbXBsZXRlZCB3aXRo
aW4gdGhlIGN1cnJlbnQKLSAgcnVuIGxvb3AsIHlvdSBjYW4gbWFrZSB1c2Ugb2YgdGhlIGBhZnRl
clJlbmRlcmAgcnVuIGxvb3AgcXVldWUgKGFkZGVkCi0gIGJ5IHRoZSBgZW1iZXItdmlld3NgIHBh
Y2thZ2UsIGFsb25nIHdpdGggdGhlIHByZWNlZGluZyBgcmVuZGVyYCBxdWV1ZQotICB3aGVyZSBh
bGwgdGhlIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGFwcGVuKS4gRXhhbXBsZToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIEFwcC5NeUNvbGxlY3Rpb25WaWV3ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcu
ZXh0ZW5kKHsKLSAgICBkaWRJbnNlcnRFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICAgIEVtYmVy
LnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgdGhpcywgJ3Byb2Nlc3NDaGlsZEVsZW1l
bnRzJyk7Ci0gICAgfSwKLSAgICBwcm9jZXNzQ2hpbGRFbGVtZW50czogZnVuY3Rpb24oKSB7Ci0g
ICAgICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGggY29sbGVjdGlvblZpZXcncyBjaGlsZCB2aWV3
Ci0gICAgICAvLyBlbGVtZW50cyBhZnRlciB0aGV5J3ZlIGZpbmlzaGVkIHJlbmRlcmluZywgd2hp
Y2gKLSAgICAgIC8vIGNhbid0IGJlIGRvbmUgd2l0aGluIHRoZSBDb2xsZWN0aW9uVmlldydzCi0g
ICAgICAvLyBgZGlkSW5zZXJ0RWxlbWVudGAgaG9vayBiZWNhdXNlIHRoYXQgZ2V0cyBydW4KLSAg
ICAgIC8vIGJlZm9yZSB0aGUgY2hpbGQgZWxlbWVudHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBE
T00uCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgT25lIGJlbmVmaXQgb2YgdGhlIGFib3ZlIGFw
cHJvYWNoIGNvbXBhcmVkIHRvIHVzaW5nIGBFbWJlci5ydW4ubmV4dGAgaXMKLSAgdGhhdCB5b3Ug
d2lsbCBiZSBhYmxlIHRvIHBlcmZvcm0gRE9NL0NTUyBvcGVyYXRpb25zIGJlZm9yZSB1bnByb2Nl
c3NlZAotICBlbGVtZW50cyBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlbiwgd2hpY2ggbWF5IHBy
ZXZlbnQgZmxpY2tlcmluZyBvcgotICBvdGhlciBhcnRpZmFjdHMgY2F1c2VkIGJ5IGRlbGF5aW5n
IHByb2Nlc3NpbmcgdW50aWwgYWZ0ZXIgcmVuZGVyaW5nLgotCi0gIFRoZSBvdGhlciBtYWpvciBi
ZW5lZml0IHRvIHRoZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0IGBFbWJlci5ydW4ubmV4dGAKLSAg
aW50cm9kdWNlcyBhbiBlbGVtZW50IG9mIG5vbi1kZXRlcm1pbmlzbSwgd2hpY2ggY2FuIG1ha2Ug
dGhpbmdzIG11Y2gKLSAgaGFyZGVyIHRvIHRlc3QsIGR1ZSB0byBpdHMgcmVsaWFuY2Ugb24gYHNl
dFRpbWVvdXRgOyBpdCdzIG11Y2ggaGFyZGVyCi0gIHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Yg
c2NoZWR1bGVkIG9wZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBzY2hlZHVsZWQKLSAgb3V0c2lkZSBv
ZiB0aGUgY3VycmVudCBydW4gbG9vcCwgaS5lLiB3aXRoIGBFbWJlci5ydW4ubmV4dGAuCi0KLSAg
QG1ldGhvZCBuZXh0Ci0gIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9k
IHRvIGludm9rZQotICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2Qg
dG8gaW52b2tlLgotICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQg
b24gdGhlCi0gICAgdGFyZ2V0IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KLSAg
QHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhl
IHRpbWVvdXQuCi0gIEByZXR1cm4ge09iamVjdH0gdGltZXIKLSovCi1FbWJlci5ydW4ubmV4dCA9
IGZ1bmN0aW9uKCkgewotICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgYXJn
cy5wdXNoKDEpOwotICByZXR1cm4gYmFja2J1cm5lci5sYXRlci5hcHBseShiYWNrYnVybmVyLCBh
cmdzKTsKLX07Ci0KLS8qKgotICBDYW5jZWxzIGEgc2NoZWR1bGVkIGl0ZW0uIE11c3QgYmUgYSB2
YWx1ZSByZXR1cm5lZCBieSBgRW1iZXIucnVuLmxhdGVyKClgLAotICBgRW1iZXIucnVuLm9uY2Uo
KWAsIG9yIGBFbWJlci5ydW4ubmV4dCgpYC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIHZhciBydW5O
ZXh0ID0gRW1iZXIucnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKLSAgICAvLyB3aWxs
IG5vdCBiZSBleGVjdXRlZAotICB9KTsKLSAgRW1iZXIucnVuLmNhbmNlbChydW5OZXh0KTsKLQot
ICB2YXIgcnVuTGF0ZXIgPSBFbWJlci5ydW4ubGF0ZXIobXlDb250ZXh0LCBmdW5jdGlvbigpIHsK
LSAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAotICB9LCA1MDApOwotICBFbWJlci5ydW4uY2Fu
Y2VsKHJ1bkxhdGVyKTsKLQotICB2YXIgcnVuT25jZSA9IEVtYmVyLnJ1bi5vbmNlKG15Q29udGV4
dCwgZnVuY3Rpb24oKSB7Ci0gICAgLy8gd2lsbCBub3QgYmUgZXhlY3V0ZWQKLSAgfSk7Ci0gIEVt
YmVyLnJ1bi5jYW5jZWwocnVuT25jZSk7Ci0gIGBgYAotCi0gIEBtZXRob2QgY2FuY2VsCi0gIEBw
YXJhbSB7T2JqZWN0fSB0aW1lciBUaW1lciBvYmplY3QgdG8gY2FuY2VsCi0gIEByZXR1cm4ge3Zv
aWR9Ci0qLwotRW1iZXIucnVuLmNhbmNlbCA9IGZ1bmN0aW9uKHRpbWVyKSB7Ci0gIHJldHVybiBi
YWNrYnVybmVyLmNhbmNlbCh0aW1lcik7Ci19OwotCi0vKioKLSAgRGVsYXkgY2FsbGluZyB0aGUg
dGFyZ2V0IG1ldGhvZCB1bnRpbCB0aGUgZGVib3VuY2UgcGVyaW9kIGhhcyBlbGFwc2VkCi0gIHdp
dGggbm8gYWRkaXRpb25hbCBkZWJvdW5jZSBjYWxscy4gSWYgYGRlYm91bmNlYCBpcyBjYWxsZWQg
YWdhaW4gYmVmb3JlCi0gIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwgdGhlIHRpbWVy
IGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBlcmlvZAotICBtdXN0IHBhc3MgYWdhaW4gYmVmb3Jl
IHRoZSB0YXJnZXQgbWV0aG9kIGlzIGNhbGxlZC4KLQotICBUaGlzIG1ldGhvZCBzaG91bGQgYmUg
dXNlZCB3aGVuIGFuIGV2ZW50IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKLSAgYnV0IHRo
ZSBhY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgZXZlbnQgaXMgZG9u
ZSBmaXJpbmcuCi0gIEEgY29tbW9uIGV4YW1wbGUgaXMgZm9yIHNjcm9sbCBldmVudHMgd2hlcmUg
eW91IG9ubHkgd2FudCB1cGRhdGVzIHRvCi0gIGhhcHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vh
c2VkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNv
bnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OwotICAgIHZhciBteUNvbnRleHQgPSB7
bmFtZTogJ2RlYm91bmNlJ307Ci0KLSAgICBFbWJlci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBt
eUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyBsZXNzIHRoYW4gMTUwbXMgcGFzc2VzCi0KLSAgICBFbWJl
ci5ydW4uZGVib3VuY2UobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyAxNTBtcyBw
YXNzZXMKLSAgICAvLyBteUZ1bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0Ci0g
ICAgLy8gY29uc29sZSBsb2dzICdkZWJvdW5jZSByYW4uJyBvbmUgdGltZS4KLSAgYGBgCi0KLSAg
QG1ldGhvZCBkZWJvdW5jZQotICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1l
dGhvZCB0byBpbnZva2UKLSAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0
aG9kIHRvIGludm9rZS4KLSAgICBNYXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91
IHBhc3MgYSBzdHJpbmcKLSAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNz
ZWQgdGFyZ2V0LgotICBAcGFyYW0ge09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMg
dG8gcGFzcyB0byB0aGUgdGltZW91dC4KLSAgQHBhcmFtIHtOdW1iZXJ9IHdhaXQgTnVtYmVyIG9m
IG1pbGxpc2Vjb25kcyB0byB3YWl0LgotICBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZSBUcmln
Z2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUgbGVhZGluZyBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZyBl
ZGdlIG9mIHRoZSB3YWl0IGludGVydmFsLgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVtYmVyLnJ1
bi5kZWJvdW5jZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gYmFja2J1cm5lci5kZWJvdW5jZS5h
cHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwotfTsKLQotLyoqCi0gIEVuc3VyZSB0aGF0IHRo
ZSB0YXJnZXQgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBtb3JlIGZyZXF1ZW50bHkgdGhhbgotICB0
aGUgc3BlY2lmaWVkIHNwYWNpbmcgcGVyaW9kLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgICB2YXIg
bXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9
OwotICAgIHZhciBteUNvbnRleHQgPSB7bmFtZTogJ3Rocm90dGxlJ307Ci0KLSAgICBFbWJlci5y
dW4udGhyb3R0bGUobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyA1MG1zIHBhc3Nl
cwotICAgIEVtYmVyLnJ1bi50aHJvdHRsZShteUNvbnRleHQsIG15RnVuYywgMTUwKTsKLQotICAg
IC8vIDUwbXMgcGFzc2VzCi0gICAgRW1iZXIucnVuLnRocm90dGxlKG15Q29udGV4dCwgbXlGdW5j
LCAxNTApOwotCi0gICAgLy8gNTBtcyBwYXNzZXMKLSAgICBFbWJlci5ydW4udGhyb3R0bGUobXlD
b250ZXh0LCBteUZ1bmMsIDE1MCk7Ci0KLSAgICAvLyAxNTBtcyBwYXNzZXMKLSAgICAvLyBteUZ1
bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlDb250ZXh0Ci0gICAgLy8gY29uc29sZSBsb2dz
ICd0aHJvdHRsZSByYW4uJyB0d2ljZSwgMTUwbXMgYXBhcnQuCi0gIGBgYAotCi0gIEBtZXRob2Qg
dGhyb3R0bGUKLSAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRob2QgdG8g
aW52b2tlCi0gIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgVGhlIG1ldGhvZCB0byBp
bnZva2UuCi0gICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEg
c3RyaW5nCi0gICAgdGhlbiBpdCB3aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdl
dC4KLSAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3Mg
dG8gdGhlIHRpbWVvdXQuCi0gIEBwYXJhbSB7TnVtYmVyfSBzcGFjaW5nIE51bWJlciBvZiBtaWxs
aXNlY29uZHMgdG8gc3BhY2Ugb3V0IHJlcXVlc3RzLgotICBAcmV0dXJuIHt2b2lkfQotKi8KLUVt
YmVyLnJ1bi50aHJvdHRsZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gYmFja2J1cm5lci50aHJv
dHRsZS5hcHBseShiYWNrYnVybmVyLCBhcmd1bWVudHMpOwotfTsKLQotLy8gTWFrZSBzdXJlIGl0
J3Mgbm90IGFuIGF1dG9ydW4gZHVyaW5nIHRlc3RpbmcKLWZ1bmN0aW9uIGNoZWNrQXV0b1J1bigp
IHsKLSAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1bkxvb3ApIHsKLSAgICBFbWJlci5hc3NlcnQo
IllvdSBoYXZlIHR1cm5lZCBvbiB0ZXN0aW5nIG1vZGUsIHdoaWNoIGRpc2FibGVkIHRoZSBydW4t
bG9vcCdzIGF1dG9ydW4uIFlvdSB3aWxsIG5lZWQgdG8gd3JhcCBhbnkgY29kZSB3aXRoIGFzeW5j
aHJvbm91cyBzaWRlLWVmZmVjdHMgaW4gYW4gRW1iZXIucnVuIiwgIUVtYmVyLnRlc3RpbmcpOwot
ICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vLyBFbWJlci5Mb2dnZXIKLS8v
IGdldAotLy8gc2V0Ci0vLyBndWlkRm9yLCBtZXRhCi0vLyBhZGRPYnNlcnZlciwgcmVtb3ZlT2Jz
ZXJ2ZXIKLS8vIEVtYmVyLnJ1bi5zY2hlZHVsZQotLyoqCi1AbW9kdWxlIGVtYmVyLW1ldGFsCi0q
LwotCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8vCi0KLS8qKgotICBEZWJ1ZyBwYXJhbWV0ZXIgeW91
IGNhbiB0dXJuIG9uLiBUaGlzIHdpbGwgbG9nIGFsbCBiaW5kaW5ncyB0aGF0IGZpcmUgdG8KLSAg
dGhlIGNvbnNvbGUuIFRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gY29kZS4g
Tm90ZSB0aGF0IHlvdQotICBjYW4gYWxzbyBlbmFibGUgdGhpcyBmcm9tIHRoZSBjb25zb2xlIG9y
IHRlbXBvcmFyaWx5LgotCi0gIEBwcm9wZXJ0eSBMT0dfQklORElOR1MKLSAgQGZvciBFbWJlcgot
ICBAdHlwZSBCb29sZWFuCi0gIEBkZWZhdWx0IGZhbHNlCi0qLwotRW1iZXIuTE9HX0JJTkRJTkdT
ID0gZmFsc2UgfHwgISFFbWJlci5FTlYuTE9HX0JJTkRJTkdTOwotCi12YXIgZ2V0ICAgICA9IEVt
YmVyLmdldCwKLSAgICBzZXQgICAgID0gRW1iZXIuc2V0LAotICAgIGd1aWRGb3IgPSBFbWJlci5n
dWlkRm9yLAotICAgIElTX0dMT0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS87Ci0KLS8q
KgotICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcuLCBg
TXlBcHAuZm9vQ29udHJvbGxlci5iYXJgKQotICBpbnN0ZWFkIG9mIGxvY2FsIChgZm9vLmJhci5i
YXpgKS4KLQotICBAbWV0aG9kIGlzR2xvYmFsUGF0aAotICBAZm9yIEVtYmVyCi0gIEBwcml2YXRl
Ci0gIEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEByZXR1cm4gQm9vbGVhbgotKi8KLXZhciBpc0ds
b2JhbFBhdGggPSBFbWJlci5pc0dsb2JhbFBhdGggPSBmdW5jdGlvbihwYXRoKSB7Ci0gIHJldHVy
biBJU19HTE9CQUwudGVzdChwYXRoKTsKLX07Ci0KLWZ1bmN0aW9uIGdldFdpdGhHbG9iYWxzKG9i
aiwgcGF0aCkgewotICByZXR1cm4gZ2V0KGlzR2xvYmFsUGF0aChwYXRoKSA/IEVtYmVyLmxvb2t1
cCA6IG9iaiwgcGF0aCk7Ci19Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEJJTkRJTkcKLS8vCi0KLXZhciBCaW5kaW5n
ID0gZnVuY3Rpb24odG9QYXRoLCBmcm9tUGF0aCkgewotICB0aGlzLl9kaXJlY3Rpb24gPSAnZndk
JzsKLSAgdGhpcy5fZnJvbSA9IGZyb21QYXRoOwotICB0aGlzLl90byAgID0gdG9QYXRoOwotICB0
aGlzLl9kaXJlY3Rpb25NYXAgPSBFbWJlci5NYXAuY3JlYXRlKCk7Ci19OwotCi0vKioKLUBjbGFz
cyBCaW5kaW5nCi1AbmFtZXNwYWNlIEVtYmVyCi0qLwotCi1CaW5kaW5nLnByb3RvdHlwZSA9IHsK
LSAgLyoqCi0gICAgVGhpcyBjb3BpZXMgdGhlIEJpbmRpbmcgc28gaXQgY2FuIGJlIGNvbm5lY3Rl
ZCB0byBhbm90aGVyIG9iamVjdC4KLQotICAgIEBtZXRob2QgY29weQotICAgIEByZXR1cm4ge0Vt
YmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBjb3B5OiBmdW5jdGlvbiAoKSB7Ci0gICAgdmFy
IGNvcHkgPSBuZXcgQmluZGluZyh0aGlzLl90bywgdGhpcy5fZnJvbSk7Ci0gICAgaWYgKHRoaXMu
X29uZVdheSkgeyBjb3B5Ll9vbmVXYXkgPSB0cnVlOyB9Ci0gICAgcmV0dXJuIGNvcHk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyBDT05GSUcKLSAgLy8KLQotICAvKioKLSAgICBUaGlzIHdpbGwgc2V0
IGBmcm9tYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIEl0IHdpbGwgbm90
Ci0gICAgYXR0ZW1wdCB0byByZXNvbHZlIHRoaXMgcHJvcGVydHkgcGF0aCB0byBhbiBhY3R1YWwg
b2JqZWN0IHVudGlsIHlvdQotICAgIGNvbm5lY3QgdGhlIGJpbmRpbmcuCi0KLSAgICBUaGUgYmlu
ZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBhdGggc3RhcnRpbmcgYXQgdGhlIHJv
b3Qgb2JqZWN0Ci0gICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNvbm5lY3QoKWAgdGhlIGJpbmRpbmcu
IEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKLSAgICBgZ2V0KClgIC0gc2VlIHRoYXQgbWV0
aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgQG1ldGhvZCBmcm9tCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHBhdGggdGhlIHByb3BlcnR5IHBhdGggdG8gY29ubmVjdCB0bwotICAgIEByZXR1
cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICBmcm9tOiBmdW5jdGlvbihwYXRoKSB7
Ci0gICAgdGhpcy5fZnJvbSA9IHBhdGg7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgVGhpcyB3aWxsIHNldCB0aGUgYHRvYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZp
ZWQgdmFsdWUuIEl0IHdpbGwgbm90Ci0gICAgYXR0ZW1wdCB0byByZXNvbHZlIHRoaXMgcHJvcGVy
dHkgcGF0aCB0byBhbiBhY3R1YWwgb2JqZWN0IHVudGlsIHlvdQotICAgIGNvbm5lY3QgdGhlIGJp
bmRpbmcuCi0KLSAgICBUaGUgYmluZGluZyB3aWxsIHNlYXJjaCBmb3IgdGhlIHByb3BlcnR5IHBh
dGggc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2JqZWN0Ci0gICAgeW91IHBhc3Mgd2hlbiB5b3UgYGNv
bm5lY3QoKWAgdGhlIGJpbmRpbmcuIEl0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMKLSAgICBg
Z2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICAgQG1l
dGhvZCB0bwotICAgIEBwYXJhbSB7U3RyaW5nfFR1cGxlfSBwYXRoIEEgcHJvcGVydHkgcGF0aCBv
ciB0dXBsZQotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAotICAqLwotICB0bzog
ZnVuY3Rpb24ocGF0aCkgewotICAgIHRoaXMuX3RvID0gcGF0aDsKLSAgICByZXR1cm4gdGhpczsK
LSAgfSwKLQotICAvKioKLSAgICBDb25maWd1cmVzIHRoZSBiaW5kaW5nIGFzIG9uZSB3YXkuIEEg
b25lLXdheSBiaW5kaW5nIHdpbGwgcmVsYXkgY2hhbmdlcwotICAgIG9uIHRoZSBgZnJvbWAgc2lk
ZSB0byB0aGUgYHRvYCBzaWRlLCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGlzCi0g
ICAgbWVhbnMgdGhhdCBpZiB5b3UgY2hhbmdlIHRoZSBgdG9gIHNpZGUgZGlyZWN0bHksIHRoZSBg
ZnJvbWAgc2lkZSBtYXkgaGF2ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgotCi0gICAgQG1ldGhv
ZCBvbmVXYXkKLSAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgb25l
V2F5OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLl9vbmVXYXkgPSB0cnVlOwotICAgIHJldHVybiB0
aGlzOwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgdG9TdHJpbmcKLSAgICBAcmV0dXJuIHtT
dHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBiaW5kaW5nCi0gICovCi0gIHRvU3RyaW5n
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb25lV2F5ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXld
JyA6ICcnOwotICAgIHJldHVybiAiRW1iZXIuQmluZGluZzwiICsgZ3VpZEZvcih0aGlzKSArICI+
KCIgKyB0aGlzLl9mcm9tICsgIiAtPiAiICsgdGhpcy5fdG8gKyAiKSIgKyBvbmVXYXk7Ci0gIH0s
Ci0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLgotICAvLyBDT05ORUNUIEFORCBTWU5DCi0gIC8vCi0KLSAgLyoqCi0gICAgQXR0
ZW1wdHMgdG8gY29ubmVjdCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVj
ZWl2ZSBhbmQgcmVsYXkKLSAgICBjaGFuZ2VzLiBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGFuIGV4
Y2VwdGlvbiBpZiB5b3UgaGF2ZSBub3Qgc2V0IHRoZQotICAgIGZyb20vdG8gcHJvcGVydGllcyB5
ZXQuCi0KLSAgICBAbWV0aG9kIGNvbm5lY3QKLSAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBy
b290IG9iamVjdCBmb3IgdGhpcyBiaW5kaW5nLgotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9
IGB0aGlzYAotICAqLwotICBjb25uZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICBFbWJlci5hc3Nl
cnQoJ011c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5kaW5nLmNvbm5lY3QoKScs
ICEhb2JqKTsKLQotICAgIHZhciBmcm9tUGF0aCA9IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMu
X3RvOwotICAgIEVtYmVyLnRyeVNldChvYmosIHRvUGF0aCwgZ2V0V2l0aEdsb2JhbHMob2JqLCBm
cm9tUGF0aCkpOwotCi0gICAgLy8gYWRkIGFuIG9ic2VydmVyIG9uIHRoZSBvYmplY3QgdG8gYmUg
bm90aWZpZWQgd2hlbiB0aGUgYmluZGluZyBzaG91bGQgYmUgdXBkYXRlZAotICAgIEVtYmVyLmFk
ZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgsIHRoaXMsIHRoaXMuZnJvbURpZENoYW5nZSk7Ci0KLSAg
ICAvLyBpZiB0aGUgYmluZGluZyBpcyBhIHR3by13YXkgYmluZGluZywgYWxzbyBzZXQgdXAgYW4g
b2JzZXJ2ZXIgb24gdGhlIHRhcmdldAotICAgIGlmICghdGhpcy5fb25lV2F5KSB7IEVtYmVyLmFk
ZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlkQ2hhbmdlKTsgfQotCi0gICAg
dGhpcy5fcmVhZHlUb1N5bmMgPSB0cnVlOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRGlzY29ubmVjdHMgdGhlIGJpbmRpbmcgaW5zdGFuY2UuIENoYW5nZXMgd2lsbCBu
byBsb25nZXIgYmUgcmVsYXllZC4gWW91Ci0gICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNh
bGwgdGhpcyBtZXRob2QuCi0KLSAgICBAbWV0aG9kIGRpc2Nvbm5lY3QKLSAgICBAcGFyYW0ge09i
amVjdH0gb2JqIFRoZSByb290IG9iamVjdCB5b3UgcGFzc2VkIHdoZW4gY29ubmVjdGluZyB0aGUg
YmluZGluZy4KLSAgICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKLSAgKi8KLSAgZGlz
Y29ubmVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCdNdXN0IHBhc3MgYSB2
YWxpZCBvYmplY3QgdG8gRW1iZXIuQmluZGluZy5kaXNjb25uZWN0KCknLCAhIW9iaik7Ci0KLSAg
ICB2YXIgdHdvV2F5ID0gIXRoaXMuX29uZVdheTsKLQotICAgIC8vIHJlbW92ZSBhbiBvYnNlcnZl
ciBvbiB0aGUgb2JqZWN0IHNvIHdlJ3JlIG5vIGxvbmdlciBub3RpZmllZCBvZgotICAgIC8vIGNo
YW5nZXMgdGhhdCBzaG91bGQgdXBkYXRlIGJpbmRpbmdzLgotICAgIEVtYmVyLnJlbW92ZU9ic2Vy
dmVyKG9iaiwgdGhpcy5fZnJvbSwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlKTsKLQotICAgIC8v
IGlmIHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2JzZXJ2ZXIgZnJvbSB0aGUg
dGFyZ2V0IGFzIHdlbGwKLSAgICBpZiAodHdvV2F5KSB7IEVtYmVyLnJlbW92ZU9ic2VydmVyKG9i
aiwgdGhpcy5fdG8sIHRoaXMsIHRoaXMudG9EaWRDaGFuZ2UpOyB9Ci0KLSAgICB0aGlzLl9yZWFk
eVRvU3luYyA9IGZhbHNlOyAvLyBkaXNhYmxlIHNjaGVkdWxlZCBzeW5jcy4uLgotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gUFJJVkFURQotICAvLwotCi0gIC8qIGNhbGxl
ZCB3aGVuIHRoZSBmcm9tIHNpZGUgY2hhbmdlcyAqLwotICBmcm9tRGlkQ2hhbmdlOiBmdW5jdGlv
bih0YXJnZXQpIHsKLSAgICB0aGlzLl9zY2hlZHVsZVN5bmModGFyZ2V0LCAnZndkJyk7Ci0gIH0s
Ci0KLSAgLyogY2FsbGVkIHdoZW4gdGhlIHRvIHNpZGUgY2hhbmdlcyAqLwotICB0b0RpZENoYW5n
ZTogZnVuY3Rpb24odGFyZ2V0KSB7Ci0gICAgdGhpcy5fc2NoZWR1bGVTeW5jKHRhcmdldCwgJ2Jh
Y2snKTsKLSAgfSwKLQotICBfc2NoZWR1bGVTeW5jOiBmdW5jdGlvbihvYmosIGRpcikgewotICAg
IHZhciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7Ci0gICAgdmFyIGV4aXN0aW5n
RGlyID0gZGlyZWN0aW9uTWFwLmdldChvYmopOwotCi0gICAgLy8gaWYgd2UgaGF2ZW4ndCBzY2hl
ZHVsZWQgdGhlIGJpbmRpbmcgeWV0LCBzY2hlZHVsZSBpdAotICAgIGlmICghZXhpc3RpbmdEaXIp
IHsKLSAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnc3luYycsIHRoaXMsIHRoaXMuX3N5bmMsIG9i
aik7Ci0gICAgICBkaXJlY3Rpb25NYXAuc2V0KG9iaiwgZGlyKTsKLSAgICB9Ci0KLSAgICAvLyBJ
ZiBib3RoIGEgJ2JhY2snIGFuZCAnZndkJyBzeW5jIGhhdmUgYmVlbiBzY2hlZHVsZWQgb24gdGhl
IHNhbWUgb2JqZWN0LAotICAgIC8vIGRlZmF1bHQgdG8gYSAnZndkJyBzeW5jIHNvIHRoYXQgaXQg
cmVtYWlucyBkZXRlcm1pbmlzdGljLgotICAgIGlmIChleGlzdGluZ0RpciA9PT0gJ2JhY2snICYm
IGRpciA9PT0gJ2Z3ZCcpIHsKLSAgICAgIGRpcmVjdGlvbk1hcC5zZXQob2JqLCAnZndkJyk7Ci0g
ICAgfQotICB9LAotCi0gIF9zeW5jOiBmdW5jdGlvbihvYmopIHsKLSAgICB2YXIgbG9nID0gRW1i
ZXIuTE9HX0JJTkRJTkdTOwotCi0gICAgLy8gZG9uJ3Qgc3luY2hyb25pemUgZGVzdHJveWVkIG9i
amVjdHMgb3IgZGlzY29ubmVjdGVkIGJpbmRpbmdzCi0gICAgaWYgKG9iai5pc0Rlc3Ryb3llZCB8
fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBnZXQgdGhlIGRpcmVj
dGlvbiBvZiB0aGUgYmluZGluZyBmb3IgdGhlIG9iamVjdCB3ZSBhcmUKLSAgICAvLyBzeW5jaHJv
bml6aW5nIGZyb20KLSAgICB2YXIgZGlyZWN0aW9uTWFwID0gdGhpcy5fZGlyZWN0aW9uTWFwOwot
ICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25NYXAuZ2V0KG9iaik7Ci0KLSAgICB2YXIgZnJv
bVBhdGggPSB0aGlzLl9mcm9tLCB0b1BhdGggPSB0aGlzLl90bzsKLQotICAgIGRpcmVjdGlvbk1h
cC5yZW1vdmUob2JqKTsKLQotICAgIC8vIGlmIHdlJ3JlIHN5bmNocm9uaXppbmcgZnJvbSB0aGUg
cmVtb3RlIG9iamVjdC4uLgotICAgIGlmIChkaXJlY3Rpb24gPT09ICdmd2QnKSB7Ci0gICAgICB2
YXIgZnJvbVZhbHVlID0gZ2V0V2l0aEdsb2JhbHMob2JqLCB0aGlzLl9mcm9tKTsKLSAgICAgIGlm
IChsb2cpIHsKLSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9TdHJpbmcoKSwg
Jy0+JywgZnJvbVZhbHVlLCBvYmopOwotICAgICAgfQotICAgICAgaWYgKHRoaXMuX29uZVdheSkg
ewotICAgICAgICBFbWJlci50cnlTZXQob2JqLCB0b1BhdGgsIGZyb21WYWx1ZSk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICBFbWJlci5fc3VzcGVuZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlz
LCB0aGlzLnRvRGlkQ2hhbmdlLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgRW1iZXIudHJ5U2V0
KG9iaiwgdG9QYXRoLCBmcm9tVmFsdWUpOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICAvLyBp
ZiB3ZSdyZSBzeW5jaHJvbml6aW5nICp0byogdGhlIHJlbW90ZSBvYmplY3QKLSAgICB9IGVsc2Ug
aWYgKGRpcmVjdGlvbiA9PT0gJ2JhY2snKSB7Ci0gICAgICB2YXIgdG9WYWx1ZSA9IGdldChvYmos
IHRoaXMuX3RvKTsKLSAgICAgIGlmIChsb2cpIHsKLSAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygn
ICcsIHRoaXMudG9TdHJpbmcoKSwgJzwtJywgdG9WYWx1ZSwgb2JqKTsKLSAgICAgIH0KLSAgICAg
IEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXIob2JqLCBmcm9tUGF0aCwgdGhpcywgdGhpcy5mcm9tRGlk
Q2hhbmdlLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIEVtYmVyLnRyeVNldChFbWJlci5pc0dsb2Jh
bFBhdGgoZnJvbVBhdGgpID8gRW1iZXIubG9va3VwIDogb2JqLCBmcm9tUGF0aCwgdG9WYWx1ZSk7
Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotfTsKLQotZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVz
KHRvLCBmcm9tKSB7Ci0gIGZvciAodmFyIGtleSBpbiBmcm9tKSB7Ci0gICAgaWYgKGZyb20uaGFz
T3duUHJvcGVydHkoa2V5KSkgewotICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTsKLSAgICB9Ci0g
IH0KLX0KLQotbWl4aW5Qcm9wZXJ0aWVzKEJpbmRpbmcsIHsKLQotICAvKgotICAgIFNlZSBgRW1i
ZXIuQmluZGluZy5mcm9tYC4KLQotICAgIEBtZXRob2QgZnJvbQotICAgIEBzdGF0aWMKLSAgKi8K
LSAgZnJvbTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzLCBiaW5kaW5nID0gbmV3IEMo
KTsKLSAgICByZXR1cm4gYmluZGluZy5mcm9tLmFwcGx5KGJpbmRpbmcsIGFyZ3VtZW50cyk7Ci0g
IH0sCi0KLSAgLyoKLSAgICBTZWUgYEVtYmVyLkJpbmRpbmcudG9gLgotCi0gICAgQG1ldGhvZCB0
bwotICAgIEBzdGF0aWMKLSAgKi8KLSAgdG86IGZ1bmN0aW9uKCkgewotICAgIHZhciBDID0gdGhp
cywgYmluZGluZyA9IG5ldyBDKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmcudG8uYXBwbHkoYmluZGlu
ZywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBDcmVhdGVzIGEgbmV3IEJpbmRpbmcg
aW5zdGFuY2UgYW5kIG1ha2VzIGl0IGFwcGx5IGluIGEgc2luZ2xlIGRpcmVjdGlvbi4KLSAgICBB
IG9uZS13YXkgYmluZGluZyB3aWxsIHJlbGF5IGNoYW5nZXMgb24gdGhlIGBmcm9tYCBzaWRlIG9i
amVjdCAoc3VwcGxpZWQKLSAgICBhcyB0aGUgYGZyb21gIGFyZ3VtZW50KSB0aGUgYHRvYCBzaWRl
LCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgotICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5
b3UgY2hhbmdlIHRoZSAidG8iIHNpZGUgZGlyZWN0bHksIHRoZSAiZnJvbSIgc2lkZSBtYXkgaGF2
ZQotICAgIGEgZGlmZmVyZW50IHZhbHVlLgotCi0gICAgU2VlIGBCaW5kaW5nLm9uZVdheWAuCi0K
LSAgICBAbWV0aG9kIG9uZVdheQotICAgIEBwYXJhbSB7U3RyaW5nfSBmcm9tIGZyb20gcGF0aC4K
LSAgICBAcGFyYW0ge0Jvb2xlYW59IFtmbGFnXSAoT3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBo
ZXJlIHdpbGwgbWFrZSB0aGUKLSAgICAgIGJpbmRpbmcgYG9uZVdheWAuIFlvdSBjYW4gaW5zdGVh
ZCBwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBgb25lV2F5YCwgbWFraW5nIHRoZQotICAgICAgYmlu
ZGluZyB0d28gd2F5IGFnYWluLgotICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAot
ICAqLwotICBvbmVXYXk6IGZ1bmN0aW9uKGZyb20sIGZsYWcpIHsKLSAgICB2YXIgQyA9IHRoaXMs
IGJpbmRpbmcgPSBuZXcgQyhudWxsLCBmcm9tKTsKLSAgICByZXR1cm4gYmluZGluZy5vbmVXYXko
ZmxhZyk7Ci0gIH0KLQotfSk7Ci0KLS8qKgotICBBbiBgRW1iZXIuQmluZGluZ2AgY29ubmVjdHMg
dGhlIHByb3BlcnRpZXMgb2YgdHdvIG9iamVjdHMgc28gdGhhdCB3aGVuZXZlcgotICB0aGUgdmFs
dWUgb2Ygb25lIHByb3BlcnR5IGNoYW5nZXMsIHRoZSBvdGhlciBwcm9wZXJ0eSB3aWxsIGJlIGNo
YW5nZWQgYWxzby4KLQotICAjIyBBdXRvbWF0aWMgQ3JlYXRpb24gb2YgQmluZGluZ3Mgd2l0aCBg
L14qQmluZGluZy9gLW5hbWVkIFByb3BlcnRpZXMKLQotICBZb3UgZG8gbm90IHVzdWFsbHkgY3Jl
YXRlIEJpbmRpbmcgb2JqZWN0cyBkaXJlY3RseSBidXQgaW5zdGVhZCBkZXNjcmliZQotICBiaW5k
aW5ncyBpbiB5b3VyIGNsYXNzIG9yIG9iamVjdCBkZWZpbml0aW9uIHVzaW5nIGF1dG9tYXRpYyBi
aW5kaW5nCi0gIGRldGVjdGlvbi4KLQotICBQcm9wZXJ0aWVzIGVuZGluZyBpbiBhIGBCaW5kaW5n
YCBzdWZmaXggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYEVtYmVyLkJpbmRpbmdgCi0gIGluc3RhbmNl
cy4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nIHJlcHJlc2Vu
dGluZyBhIHBhdGgKLSAgdG8gYW5vdGhlciBvYmplY3Qgb3IgYSBjdXN0b20gYmluZGluZyBpbnN0
YW5jZWQgY3JlYXRlZCB1c2luZyBCaW5kaW5nIGhlbHBlcnMKLSAgKHNlZSAiT25lIFdheSBCaW5k
aW5ncyIpOgotCi0gIGBgYAotICB2YWx1ZUJpbmRpbmc6ICJNeUFwcC5zb21lQ29udHJvbGxlci50
aXRsZSIKLSAgYGBgCi0KLSAgVGhpcyB3aWxsIGNyZWF0ZSBhIGJpbmRpbmcgZnJvbSBgTXlBcHAu
c29tZUNvbnRyb2xsZXIudGl0bGVgIHRvIHRoZSBgdmFsdWVgCi0gIHByb3BlcnR5IG9mIHlvdXIg
b2JqZWN0IGluc3RhbmNlIGF1dG9tYXRpY2FsbHkuIE5vdyB0aGUgdHdvIHZhbHVlcyB3aWxsIGJl
Ci0gIGtlcHQgaW4gc3luYy4KLQotICAjIyBPbmUgV2F5IEJpbmRpbmdzCi0KLSAgT25lIGVzcGVj
aWFsbHkgdXNlZnVsIGJpbmRpbmcgY3VzdG9taXphdGlvbiB5b3UgY2FuIHVzZSBpcyB0aGUgYG9u
ZVdheSgpYAotICBoZWxwZXIuIFRoaXMgaGVscGVyIHRlbGxzIEVtYmVyIHRoYXQgeW91IGFyZSBv
bmx5IGludGVyZXN0ZWQgaW4KLSAgcmVjZWl2aW5nIGNoYW5nZXMgb24gdGhlIG9iamVjdCB5b3Ug
YXJlIGJpbmRpbmcgZnJvbS4gRm9yIGV4YW1wbGUsIGlmIHlvdQotICBhcmUgYmluZGluZyB0byBh
IHByZWZlcmVuY2UgYW5kIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIGlmIHRoZSBwcmVmZXJlbmNl
Ci0gIGhhcyBjaGFuZ2VkLCBidXQgeW91ciBvYmplY3Qgd2lsbCBub3QgYmUgY2hhbmdpbmcgdGhl
IHByZWZlcmVuY2UgaXRzZWxmLCB5b3UKLSAgY291bGQgZG86Ci0KLSAgYGBgCi0gIGJpZ1RpdGxl
c0JpbmRpbmc6IEVtYmVyLkJpbmRpbmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xs
ZXIuYmlnVGl0bGVzIikKLSAgYGBgCi0KLSAgVGhpcyB3YXkgaWYgdGhlIHZhbHVlIG9mIGBNeUFw
cC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzYCBjaGFuZ2VzIHRoZQotICBgYmlnVGl0
bGVzYCBwcm9wZXJ0eSBvZiB5b3VyIG9iamVjdCB3aWxsIGNoYW5nZSBhbHNvLiBIb3dldmVyLCBp
ZiB5b3UKLSAgY2hhbmdlIHRoZSB2YWx1ZSBvZiB5b3VyIGBiaWdUaXRsZXNgIHByb3BlcnR5LCBp
dCB3aWxsIG5vdCB1cGRhdGUgdGhlCi0gIGBwcmVmZXJlbmNlc0NvbnRyb2xsZXJgLgotCi0gIE9u
ZSB3YXkgYmluZGluZ3MgYXJlIGFsbW9zdCB0d2ljZSBhcyBmYXN0IHRvIHNldHVwIGFuZCB0d2lj
ZSBhcyBmYXN0IHRvCi0gIGV4ZWN1dGUgYmVjYXVzZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3
b3JyeSBhYm91dCBjaGFuZ2VzIHRvIG9uZSBzaWRlLgotCi0gIFlvdSBzaG91bGQgY29uc2lkZXIg
dXNpbmcgb25lIHdheSBiaW5kaW5ncyBhbnl0aW1lIHlvdSBoYXZlIGFuIG9iamVjdCB0aGF0Ci0g
IG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5kIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNoYW5n
ZSBhIHByb3BlcnR5OyBvbmx5Ci0gIHRvIG1vbml0b3IgaXQgZm9yIGNoYW5nZXMgKHN1Y2ggYXMg
aW4gdGhlIGV4YW1wbGUgYWJvdmUpLgotCi0gICMjIEFkZGluZyBCaW5kaW5ncyBNYW51YWxseQot
Ci0gIEFsbCBvZiB0aGUgZXhhbXBsZXMgYWJvdmUgc2hvdyB5b3UgaG93IHRvIGNvbmZpZ3VyZSBh
IGN1c3RvbSBiaW5kaW5nLCBidXQgdGhlCi0gIHJlc3VsdCBvZiB0aGVzZSBjdXN0b21pemF0aW9u
cyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwgbm90IGEgZnVsbHkgYWN0aXZlCi0gIEJpbmRp
bmcgaW5zdGFuY2UuIFRoZSBiaW5kaW5nIHdpbGwgYWN0dWFsbHkgYmVjb21lIGFjdGl2ZSBvbmx5
IHdoZW4geW91Ci0gIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgdGhlIGJpbmRpbmcgYmVsb25ncyB0
by4gSXQgaXMgdXNlZnVsIGhvd2V2ZXIsIHRvCi0gIHVuZGVyc3RhbmQgd2hhdCBhY3R1YWxseSBo
YXBwZW5zIHdoZW4gdGhlIGJpbmRpbmcgaXMgYWN0aXZhdGVkLgotCi0gIEZvciBhIGJpbmRpbmcg
dG8gZnVuY3Rpb24gaXQgbXVzdCBoYXZlIGF0IGxlYXN0IGEgYGZyb21gIHByb3BlcnR5IGFuZCBh
IGB0b2AKLSAgcHJvcGVydHkuIFRoZSBgZnJvbWAgcHJvcGVydHkgcGF0aCBwb2ludHMgdG8gdGhl
IG9iamVjdC9rZXkgdGhhdCB5b3Ugd2FudCB0bwotICBiaW5kIGZyb20gd2hpbGUgdGhlIGB0b2Ag
cGF0aCBwb2ludHMgdG8gdGhlIG9iamVjdC9rZXkgeW91IHdhbnQgdG8gYmluZCB0by4KLQotICBX
aGVuIHlvdSBkZWZpbmUgYSBjdXN0b20gYmluZGluZywgeW91IGFyZSB1c3VhbGx5IGRlc2NyaWJp
bmcgdGhlIHByb3BlcnR5Ci0gIHlvdSB3YW50IHRvIGJpbmQgZnJvbSAoc3VjaCBhcyBgTXlBcHAu
c29tZUNvbnRyb2xsZXIudmFsdWVgIGluIHRoZSBleGFtcGxlcwotICBhYm92ZSkuIFdoZW4geW91
ciBvYmplY3QgaXMgY3JlYXRlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgdmFs
dWUKLSAgeW91IHdhbnQgdG8gYmluZCBgdG9gIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHlvdXIgYmlu
ZGluZyBrZXkuIEluIHRoZQotICBleGFtcGxlcyBhYm92ZSwgZHVyaW5nIGluaXQsIEVtYmVyIG9i
amVjdHMgd2lsbCBlZmZlY3RpdmVseSBjYWxsCi0gIHNvbWV0aGluZyBsaWtlIHRoaXMgb24geW91
ciBiaW5kaW5nOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgYmluZGluZyA9IEVtYmVyLkJpbmRpbmcu
ZnJvbSh0aGlzLnZhbHVlQmluZGluZykudG8oInZhbHVlIik7Ci0gIGBgYAotCi0gIFRoaXMgY3Jl
YXRlcyBhIG5ldyBiaW5kaW5nIGluc3RhbmNlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSB5b3UgcHJv
dmlkZSwgYW5kCi0gIHNldHMgdGhlIHRvIHBhdGggdG8gdGhlIGB2YWx1ZWAgcHJvcGVydHkgb2Yg
dGhlIG5ldyBvYmplY3QuIE5vdyB0aGF0IHRoZQotICBiaW5kaW5nIGlzIGZ1bGx5IGNvbmZpZ3Vy
ZWQgd2l0aCBhIGBmcm9tYCBhbmQgYSBgdG9gLCBpdCBzaW1wbHkgbmVlZHMgdG8gYmUKLSAgY29u
bmVjdGVkIHRvIGJlY29tZSBhY3RpdmUuIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBgY29ubmVj
dCgpYCBtZXRob2Q6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBiaW5kaW5nLmNvbm5lY3QodGhpcyk7
Ci0gIGBgYAotCi0gIE5vdGUgdGhhdCB3aGVuIHlvdSBjb25uZWN0IGEgYmluZGluZyB5b3UgcGFz
cyB0aGUgb2JqZWN0IHlvdSB3YW50IGl0IHRvIGJlCi0gIGNvbm5lY3RlZCB0by4gVGhpcyBvYmpl
Y3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IGZvciBib3RoIHRoZSBmcm9tIGFuZAotICB0byBz
aWRlIG9mIHRoZSBiaW5kaW5nIHdoZW4gaW5zcGVjdGluZyByZWxhdGl2ZSBwYXRocy4gVGhpcyBh
bGxvd3MgdGhlCi0gIGJpbmRpbmcgdG8gYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYnkgc3Vi
Y2xhc3NlZCBvYmplY3RzIGFzIHdlbGwuCi0KLSAgTm93IHRoYXQgdGhlIGJpbmRpbmcgaXMgY29u
bmVjdGVkLCBpdCB3aWxsIG9ic2VydmUgYm90aCB0aGUgZnJvbSBhbmQgdG8gc2lkZQotICBhbmQg
cmVsYXkgY2hhbmdlcy4KLQotICBJZiB5b3UgZXZlciBuZWVkZWQgdG8gZG8gc28gKHlvdSBhbG1v
c3QgbmV2ZXIgd2lsbCwgYnV0IGl0IGlzIHVzZWZ1bCB0bwotICB1bmRlcnN0YW5kIHRoaXMgYW55
d2F5KSwgeW91IGNvdWxkIG1hbnVhbGx5IGNyZWF0ZSBhbiBhY3RpdmUgYmluZGluZyBieQotICB1
c2luZyB0aGUgYEVtYmVyLmJpbmQoKWAgaGVscGVyIG1ldGhvZC4gKFRoaXMgaXMgdGhlIHNhbWUg
bWV0aG9kIHVzZWQgYnkKLSAgdG8gc2V0dXAgeW91ciBiaW5kaW5ncyBvbiBvYmplY3RzKToKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLmJpbmQoTXlBcHAuYW5vdGhlck9iamVjdCwgInZhbHVl
IiwgIk15QXBwLnNvbWVDb250cm9sbGVyLnZhbHVlIik7Ci0gIGBgYAotCi0gIEJvdGggb2YgdGhl
c2UgY29kZSBmcmFnbWVudHMgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgZG9pbmcgdGhlIG1vc3Qg
ZnJpZW5kbHkKLSAgZm9ybSBvZiBiaW5kaW5nIGNyZWF0aW9uIGxpa2Ugc286Ci0KLSAgYGBgamF2
YXNjcmlwdAotICBNeUFwcC5hbm90aGVyT2JqZWN0ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0g
ICAgdmFsdWVCaW5kaW5nOiAiTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWUiLAotCi0gICAgLy8g
T1RIRVIgQ09ERSBGT1IgVEhJUyBPQkpFQ1QuLi4KLSAgfSk7Ci0gIGBgYAotCi0gIEVtYmVyJ3Mg
YnVpbHQgaW4gYmluZGluZyBjcmVhdGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBhdXRvbWF0
aWNhbGx5Ci0gIGNyZWF0ZSBiaW5kaW5ncyBmb3IgeW91LiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2Ug
dGhlIGhpZ2hlc3QtbGV2ZWwgQVBJcwotICBhdmFpbGFibGUsIGV2ZW4gaWYgeW91IHVuZGVyc3Rh
bmQgaG93IGl0IHdvcmtzIHVuZGVybmVhdGguCi0KLSAgQGNsYXNzIEJpbmRpbmcKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAc2luY2UgRW1iZXIgMC45Ci0qLwotRW1iZXIuQmluZGluZyA9IEJpbmRp
bmc7Ci0KLQotLyoqCi0gIEdsb2JhbCBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBiaW5k
aW5nLiBKdXN0IHBhc3MgdGhlIHJvb3Qgb2JqZWN0Ci0gIGFsb25nIHdpdGggYSBgdG9gIGFuZCBg
ZnJvbWAgcGF0aCB0byBjcmVhdGUgYW5kIGNvbm5lY3QgdGhlIGJpbmRpbmcuCi0KLSAgQG1ldGhv
ZCBiaW5kCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmpl
Y3Qgb2YgdGhlIHRyYW5zZm9ybS4KLSAgQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRvIHRo
ZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCi0gICAgTXVzdCBiZSByZWxhdGl2ZSB0byBvYmou
Ci0gIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBwYXRoIHRvIHRoZSAnZnJvbScgc2lkZSBvZiB0
aGUgYmluZGluZy4KLSAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iaiBvciBhIGdsb2JhbCBwYXRo
LgotICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBiaW5kaW5nIGluc3RhbmNlCi0qLwotRW1iZXIu
YmluZCA9IGZ1bmN0aW9uKG9iaiwgdG8sIGZyb20pIHsKLSAgcmV0dXJuIG5ldyBFbWJlci5CaW5k
aW5nKHRvLCBmcm9tKS5jb25uZWN0KG9iaik7Ci19OwotCi0vKioKLSAgQG1ldGhvZCBvbmVXYXkK
LSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCBvZiB0
aGUgdHJhbnNmb3JtLgotICBAcGFyYW0ge1N0cmluZ30gdG8gVGhlIHBhdGggdG8gdGhlICd0bycg
c2lkZSBvZiB0aGUgYmluZGluZy4KLSAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iai4KLSAgQHBh
cmFtIHtTdHJpbmd9IGZyb20gVGhlIHBhdGggdG8gdGhlICdmcm9tJyBzaWRlIG9mIHRoZSBiaW5k
aW5nLgotICAgIE11c3QgYmUgcmVsYXRpdmUgdG8gb2JqIG9yIGEgZ2xvYmFsIHBhdGguCi0gIEBy
ZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGJpbmRpbmcgaW5zdGFuY2UKLSovCi1FbWJlci5vbmVXYXkg
PSBmdW5jdGlvbihvYmosIHRvLCBmcm9tKSB7Ci0gIHJldHVybiBuZXcgRW1iZXIuQmluZGluZyh0
bywgZnJvbSkub25lV2F5KCkuY29ubmVjdChvYmopOwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAotKi8K
LQotdmFyIE1peGluLCBSRVFVSVJFRCwgQWxpYXMsCi0gICAgYV9tYXAgPSBFbWJlci5BcnJheVBv
bHlmaWxscy5tYXAsCi0gICAgYV9pbmRleE9mID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhP
ZiwKLSAgICBhX2ZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLAotICAgIGFf
c2xpY2UgPSBbXS5zbGljZSwKLSAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKLSAgICBkZWZp
bmVQcm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3BlcnR5LAotICAgIGd1aWRGb3IgPSBFbWJlci5n
dWlkRm9yOwotCi0KLWZ1bmN0aW9uIG1peGluc01ldGEob2JqKSB7Ci0gIHZhciBtID0gRW1iZXIu
bWV0YShvYmosIHRydWUpLCByZXQgPSBtLm1peGluczsKLSAgaWYgKCFyZXQpIHsKLSAgICByZXQg
PSBtLm1peGlucyA9IHt9OwotICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdtaXhpbnMn
KSkgewotICAgIHJldCA9IG0ubWl4aW5zID0gb19jcmVhdGUocmV0KTsKLSAgfQotICByZXR1cm4g
cmV0OwotfQotCi1mdW5jdGlvbiBpbml0TWl4aW4obWl4aW4sIGFyZ3MpIHsKLSAgaWYgKGFyZ3Mg
JiYgYXJncy5sZW5ndGggPiAwKSB7Ci0gICAgbWl4aW4ubWl4aW5zID0gYV9tYXAuY2FsbChhcmdz
LCBmdW5jdGlvbih4KSB7Ci0gICAgICBpZiAoeCBpbnN0YW5jZW9mIE1peGluKSB7IHJldHVybiB4
OyB9Ci0KLSAgICAgIC8vIE5vdGU6IE1hbnVhbGx5IHNldHVwIGEgcHJpbWl0aXZlIG1peGluIGhl
cmUuIFRoaXMgaXMgdGhlIG9ubHkKLSAgICAgIC8vIHdheSB0byBhY3R1YWxseSBnZXQgYSBwcmlt
aXRpdmUgbWl4aW4uIFRoaXMgd2F5IG5vcm1hbCBjcmVhdGlvbgotICAgICAgLy8gb2YgbWl4aW5z
IHdpbGwgZ2l2ZSB5b3UgY29tYmluZWQgbWl4aW5zLi4uCi0gICAgICB2YXIgbWl4aW4gPSBuZXcg
TWl4aW4oKTsKLSAgICAgIG1peGluLnByb3BlcnRpZXMgPSB4OwotICAgICAgcmV0dXJuIG1peGlu
OwotICAgIH0pOwotICB9Ci0gIHJldHVybiBtaXhpbjsKLX0KLQotZnVuY3Rpb24gaXNNZXRob2Qo
b2JqKSB7Ci0gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqICYmCi0gICAgICAgICBv
YmouaXNNZXRob2QgIT09IGZhbHNlICYmCi0gICAgICAgICBvYmogIT09IEJvb2xlYW4gJiYgb2Jq
ICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBBcnJheSAmJiBvYmogIT09
IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Ci19Ci0KLXZhciBDT05USU5VRSA9IHt9OwotCi1mdW5j
dGlvbiBtaXhpblByb3BlcnRpZXMobWl4aW5zTWV0YSwgbWl4aW4pIHsKLSAgdmFyIGd1aWQ7Ci0K
LSAgaWYgKG1peGluIGluc3RhbmNlb2YgTWl4aW4pIHsKLSAgICBndWlkID0gZ3VpZEZvcihtaXhp
bik7Ci0gICAgaWYgKG1peGluc01ldGFbZ3VpZF0pIHsgcmV0dXJuIENPTlRJTlVFOyB9Ci0gICAg
bWl4aW5zTWV0YVtndWlkXSA9IG1peGluOwotICAgIHJldHVybiBtaXhpbi5wcm9wZXJ0aWVzOwot
ICB9IGVsc2UgewotICAgIHJldHVybiBtaXhpbjsgLy8gYXBwbHkgYW5vbnltb3VzIG1peGluIHBy
b3BlcnRpZXMKLSAgfQotfQotCi1mdW5jdGlvbiBjb25jYXRlbmF0ZWRNaXhpblByb3BlcnRpZXMo
Y29uY2F0UHJvcCwgcHJvcHMsIHZhbHVlcywgYmFzZSkgewotICB2YXIgY29uY2F0czsKLQotICAv
LyByZXNldCBiZWZvcmUgYWRkaW5nIGVhY2ggbmV3IG1peGluIHRvIHBpY2t1cCBjb25jYXRzIGZy
b20gcHJldmlvdXMKLSAgY29uY2F0cyA9IHZhbHVlc1tjb25jYXRQcm9wXSB8fCBiYXNlW2NvbmNh
dFByb3BdOwotICBpZiAocHJvcHNbY29uY2F0UHJvcF0pIHsKLSAgICBjb25jYXRzID0gY29uY2F0
cyA/IGNvbmNhdHMuY29uY2F0KHByb3BzW2NvbmNhdFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3Bd
OwotICB9Ci0KLSAgcmV0dXJuIGNvbmNhdHM7Ci19Ci0KLWZ1bmN0aW9uIGdpdmVEZXNjcmlwdG9y
U3VwZXIobWV0YSwga2V5LCBwcm9wZXJ0eSwgdmFsdWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJQ
cm9wZXJ0eTsKLQotICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIG92ZXJyaWRlIG1ldGhvZHMsIGFu
ZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtCi0gIGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZp
bmVkKSB7Ci0gICAgLy8gRmluZCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBpbiBhIHBhcmVudCBt
aXhpbgotICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOwotICB9Ci0KLSAgLy8gSWYgd2Ug
ZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgaW4gYSBwYXJlbnQgbWl4aW4sIGZp
bmQKLSAgLy8gaXQgb24gdGhlIG9yaWdpbmFsIG9iamVjdC4KLSAgc3VwZXJQcm9wZXJ0eSA9IHN1
cGVyUHJvcGVydHkgfHwgbWV0YS5kZXNjc1trZXldOwotCi0gIGlmICghc3VwZXJQcm9wZXJ0eSB8
fCAhKHN1cGVyUHJvcGVydHkgaW5zdGFuY2VvZiBFbWJlci5Db21wdXRlZFByb3BlcnR5KSkgewot
ICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgfQotCi0gIC8vIFNpbmNlIG11bHRpcGxlIG1peGlucyBt
YXkgaW5oZXJpdCBmcm9tIHRoZSBzYW1lIHBhcmVudCwgd2UgbmVlZAotICAvLyB0byBjbG9uZSB0
aGUgY29tcHV0ZWQgcHJvcGVydHkgc28gdGhhdCBvdGhlciBtaXhpbnMgZG8gbm90IHJlY2VpdmUK
LSAgLy8gdGhlIHdyYXBwZWQgdmVyc2lvbi4KLSAgcHJvcGVydHkgPSBvX2NyZWF0ZShwcm9wZXJ0
eSk7Ci0gIHByb3BlcnR5LmZ1bmMgPSBFbWJlci53cmFwKHByb3BlcnR5LmZ1bmMsIHN1cGVyUHJv
cGVydHkuZnVuYyk7Ci0KLSAgcmV0dXJuIHByb3BlcnR5OwotfQotCi1mdW5jdGlvbiBnaXZlTWV0
aG9kU3VwZXIob2JqLCBrZXksIG1ldGhvZCwgdmFsdWVzLCBkZXNjcykgewotICB2YXIgc3VwZXJN
ZXRob2Q7Ci0KLSAgLy8gTWV0aG9kcyBvdmVyd3JpdGUgY29tcHV0ZWQgcHJvcGVydGllcywgYW5k
IGRvIG5vdCBjYWxsIHN1cGVyIHRvIHRoZW0uCi0gIGlmIChkZXNjc1trZXldID09PSB1bmRlZmlu
ZWQpIHsKLSAgICAvLyBGaW5kIHRoZSBvcmlnaW5hbCBtZXRob2QgaW4gYSBwYXJlbnQgbWl4aW4K
LSAgICBzdXBlck1ldGhvZCA9IHZhbHVlc1trZXldOwotICB9Ci0KLSAgLy8gSWYgd2UgZGlkbid0
IGZpbmQgdGhlIG9yaWdpbmFsIHZhbHVlIGluIGEgcGFyZW50IG1peGluLCBmaW5kIGl0IGluCi0g
IC8vIHRoZSBvcmlnaW5hbCBvYmplY3QKLSAgc3VwZXJNZXRob2QgPSBzdXBlck1ldGhvZCB8fCBv
Ympba2V5XTsKLQotICAvLyBPbmx5IHdyYXAgdGhlIG5ldyBtZXRob2QgaWYgdGhlIG9yaWdpbmFs
IG1ldGhvZCB3YXMgYSBmdW5jdGlvbgotICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHN1cGVy
TWV0aG9kKSB7Ci0gICAgcmV0dXJuIG1ldGhvZDsKLSAgfQotCi0gIHJldHVybiBFbWJlci53cmFw
KG1ldGhvZCwgc3VwZXJNZXRob2QpOwotfQotCi1mdW5jdGlvbiBhcHBseUNvbmNhdGVuYXRlZFBy
b3BlcnRpZXMob2JqLCBrZXksIHZhbHVlLCB2YWx1ZXMpIHsKLSAgdmFyIGJhc2VWYWx1ZSA9IHZh
bHVlc1trZXldIHx8IG9ialtrZXldOwotCi0gIGlmIChiYXNlVmFsdWUpIHsKLSAgICBpZiAoJ2Z1
bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VWYWx1ZS5jb25jYXQpIHsKLSAgICAgIHJldHVybiBiYXNl
VmFsdWUuY29uY2F0KHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEVtYmVyLm1h
a2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAg
IHJldHVybiBFbWJlci5tYWtlQXJyYXkodmFsdWUpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5
TWVyZ2VkUHJvcGVydGllcyhvYmosIGtleSwgdmFsdWUsIHZhbHVlcykgewotICB2YXIgYmFzZVZh
bHVlID0gdmFsdWVzW2tleV0gfHwgb2JqW2tleV07Ci0KLSAgaWYgKCFiYXNlVmFsdWUpIHsgcmV0
dXJuIHZhbHVlOyB9Ci0KLSAgdmFyIG5ld0Jhc2UgPSBFbWJlci5tZXJnZSh7fSwgYmFzZVZhbHVl
KTsKLSAgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkgewotICAgIGlmICghdmFsdWUuaGFzT3duUHJv
cGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLQotICAgIHZhciBwcm9wVmFsdWUgPSB2YWx1ZVtw
cm9wXTsKLSAgICBpZiAoaXNNZXRob2QocHJvcFZhbHVlKSkgewotICAgICAgLy8gVE9ETzogc3Vw
cG9ydCBmb3IgQ29tcHV0ZWQgUHJvcGVydGllcywgZXRjPwotICAgICAgbmV3QmFzZVtwcm9wXSA9
IGdpdmVNZXRob2RTdXBlcihvYmosIHByb3AsIHByb3BWYWx1ZSwgYmFzZVZhbHVlLCB7fSk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIG5ld0Jhc2VbcHJvcF0gPSBwcm9wVmFsdWU7Ci0gICAgfQotICB9
Ci0KLSAgcmV0dXJuIG5ld0Jhc2U7Ci19Ci0KLWZ1bmN0aW9uIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0
eShiYXNlLCBrZXksIHZhbHVlLCBtZXRhLCBkZXNjcywgdmFsdWVzLCBjb25jYXRzLCBtZXJnaW5n
cykgewotICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yKSB7Ci0gICAgaWYg
KHZhbHVlID09PSBSRVFVSVJFRCAmJiBkZXNjc1trZXldKSB7IHJldHVybiBDT05USU5VRTsgfQot
Ci0gICAgLy8gV3JhcCBkZXNjcmlwdG9yIGZ1bmN0aW9uIHRvIGltcGxlbWVudAotICAgIC8vIF9z
dXBlcigpIGlmIG5lZWRlZAotICAgIGlmICh2YWx1ZS5mdW5jKSB7Ci0gICAgICB2YWx1ZSA9IGdp
dmVEZXNjcmlwdG9yU3VwZXIobWV0YSwga2V5LCB2YWx1ZSwgdmFsdWVzLCBkZXNjcyk7Ci0gICAg
fQotCi0gICAgZGVzY3Nba2V5XSAgPSB2YWx1ZTsKLSAgICB2YWx1ZXNba2V5XSA9IHVuZGVmaW5l
ZDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKGNvbmNhdHMgJiYgYV9pbmRleE9mLmNhbGwoY29uY2F0
cywga2V5KSA+PSAwKSB8fAotICAgICAgICAgICAgICAgIGtleSA9PT0gJ2NvbmNhdGVuYXRlZFBy
b3BlcnRpZXMnIHx8Ci0gICAgICAgICAgICAgICAga2V5ID09PSAnbWVyZ2VkUHJvcGVydGllcycp
IHsKLSAgICAgIHZhbHVlID0gYXBwbHlDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwg
dmFsdWUsIHZhbHVlcyk7Ci0gICAgfSBlbHNlIGlmICgobWVyZ2luZ3MgJiYgYV9pbmRleE9mLmNh
bGwobWVyZ2luZ3MsIGtleSkgPj0gMCkpIHsKLSAgICAgIHZhbHVlID0gYXBwbHlNZXJnZWRQcm9w
ZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7Ci0gICAgfSBlbHNlIGlmIChpc01ldGhv
ZCh2YWx1ZSkpIHsKLSAgICAgIHZhbHVlID0gZ2l2ZU1ldGhvZFN1cGVyKGJhc2UsIGtleSwgdmFs
dWUsIHZhbHVlcywgZGVzY3MpOwotICAgIH0KLQotICAgIGRlc2NzW2tleV0gPSB1bmRlZmluZWQ7
Ci0gICAgdmFsdWVzW2tleV0gPSB2YWx1ZTsKLSAgfQotfQotCi1mdW5jdGlvbiBtZXJnZU1peGlu
cyhtaXhpbnMsIG0sIGRlc2NzLCB2YWx1ZXMsIGJhc2UsIGtleXMpIHsKLSAgdmFyIG1peGluLCBw
cm9wcywga2V5LCBjb25jYXRzLCBtZXJnaW5ncywgbWV0YTsKLQotICBmdW5jdGlvbiByZW1vdmVL
ZXlzKGtleU5hbWUpIHsKLSAgICBkZWxldGUgZGVzY3Nba2V5TmFtZV07Ci0gICAgZGVsZXRlIHZh
bHVlc1trZXlOYW1lXTsKLSAgfQotCi0gIGZvcih2YXIgaT0wLCBsPW1peGlucy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgbWl4aW4gPSBtaXhpbnNbaV07Ci0gICAgRW1iZXIuYXNzZXJ0KCdFeHBl
Y3RlZCBoYXNoIG9yIE1peGluIGluc3RhbmNlLCBnb3QgJyArIE9iamVjdC5wcm90b3R5cGUudG9T
dHJpbmcuY2FsbChtaXhpbiksCi0gICAgICAgICAgICAgICAgIHR5cGVvZiBtaXhpbiA9PT0gJ29i
amVjdCcgJiYgbWl4aW4gIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxs
KG1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7Ci0KLSAgICBwcm9wcyA9IG1peGluUHJvcGVy
dGllcyhtLCBtaXhpbik7Ci0gICAgaWYgKHByb3BzID09PSBDT05USU5VRSkgeyBjb250aW51ZTsg
fQotCi0gICAgaWYgKHByb3BzKSB7Ci0gICAgICBtZXRhID0gRW1iZXIubWV0YShiYXNlKTsKLSAg
ICAgIGlmIChiYXNlLndpbGxNZXJnZU1peGluKSB7IGJhc2Uud2lsbE1lcmdlTWl4aW4ocHJvcHMp
OyB9Ci0gICAgICBjb25jYXRzID0gY29uY2F0ZW5hdGVkTWl4aW5Qcm9wZXJ0aWVzKCdjb25jYXRl
bmF0ZWRQcm9wZXJ0aWVzJywgcHJvcHMsIHZhbHVlcywgYmFzZSk7Ci0gICAgICBtZXJnaW5ncyA9
IGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcygnbWVyZ2VkUHJvcGVydGllcycsIHByb3BzLCB2
YWx1ZXMsIGJhc2UpOwotCi0gICAgICBmb3IgKGtleSBpbiBwcm9wcykgewotICAgICAgICBpZiAo
IXByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgICAga2V5cy5w
dXNoKGtleSk7Ci0gICAgICAgIGFkZE5vcm1hbGl6ZWRQcm9wZXJ0eShiYXNlLCBrZXksIHByb3Bz
W2tleV0sIG1ldGEsIGRlc2NzLCB2YWx1ZXMsIGNvbmNhdHMsIG1lcmdpbmdzKTsKLSAgICAgIH0K
LQotICAgICAgLy8gbWFudWFsbHkgY29weSB0b1N0cmluZygpIGJlY2F1c2Ugc29tZSBKUyBlbmdp
bmVzIGRvIG5vdCBlbnVtZXJhdGUgaXQKLSAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgn
dG9TdHJpbmcnKSkgeyBiYXNlLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7IH0KLSAgICB9IGVs
c2UgaWYgKG1peGluLm1peGlucykgewotICAgICAgbWVyZ2VNaXhpbnMobWl4aW4ubWl4aW5zLCBt
LCBkZXNjcywgdmFsdWVzLCBiYXNlLCBrZXlzKTsKLSAgICAgIGlmIChtaXhpbi5fd2l0aG91dCkg
eyBhX2ZvckVhY2guY2FsbChtaXhpbi5fd2l0aG91dCwgcmVtb3ZlS2V5cyk7IH0KLSAgICB9Ci0g
IH0KLX0KLQotdmFyIElTX0JJTkRJTkcgPSBFbWJlci5JU19CSU5ESU5HID0gL14uK0JpbmRpbmck
LzsKLQotZnVuY3Rpb24gZGV0ZWN0QmluZGluZyhvYmosIGtleSwgdmFsdWUsIG0pIHsKLSAgaWYg
KElTX0JJTkRJTkcudGVzdChrZXkpKSB7Ci0gICAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsK
LSAgICBpZiAoIWJpbmRpbmdzKSB7Ci0gICAgICBiaW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsK
LSAgICB9IGVsc2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICBi
aW5kaW5ncyA9IG0uYmluZGluZ3MgPSBvX2NyZWF0ZShtLmJpbmRpbmdzKTsKLSAgICB9Ci0gICAg
YmluZGluZ3Nba2V5XSA9IHZhbHVlOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGNvbm5lY3RCaW5kaW5n
cyhvYmosIG0pIHsKLSAgLy8gVE9ETyBNaXhpbi5hcHBseShpbnN0YW5jZSkgc2hvdWxkIGRpc2Nv
bm5lY3QgYmluZGluZyBpZiBleGlzdHMKLSAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5ncywga2V5
LCBiaW5kaW5nLCB0bzsKLSAgaWYgKGJpbmRpbmdzKSB7Ci0gICAgZm9yIChrZXkgaW4gYmluZGlu
Z3MpIHsKLSAgICAgIGJpbmRpbmcgPSBiaW5kaW5nc1trZXldOwotICAgICAgaWYgKGJpbmRpbmcp
IHsKLSAgICAgICAgdG8gPSBrZXkuc2xpY2UoMCwgLTcpOyAvLyBzdHJpcCBCaW5kaW5nIG9mZiBl
bmQKLSAgICAgICAgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBFbWJlci5CaW5kaW5nKSB7Ci0gICAg
ICAgICAgYmluZGluZyA9IGJpbmRpbmcuY29weSgpOyAvLyBjb3B5IHByb3RvdHlwZXMnIGluc3Rh
bmNlCi0gICAgICAgICAgYmluZGluZy50byh0byk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIGJpbmRp
bmcgaXMgc3RyaW5nIHBhdGgKLSAgICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmco
dG8sIGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRpbmcuY29ubmVjdChvYmopOwot
ICAgICAgICBvYmpba2V5XSA9IGJpbmRpbmc7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG1hcmsg
YXMgYXBwbGllZAotICAgIG0uYmluZGluZ3MgPSB7fTsKLSAgfQotfQotCi1mdW5jdGlvbiBmaW5p
c2hQYXJ0aWFsKG9iaiwgbSkgewotICBjb25uZWN0QmluZGluZ3Mob2JqLCBtIHx8IEVtYmVyLm1l
dGEob2JqKSk7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLWZ1bmN0aW9uIGZvbGxvd0FsaWFzKG9iaiwg
ZGVzYywgbSwgZGVzY3MsIHZhbHVlcykgewotICB2YXIgYWx0S2V5ID0gZGVzYy5tZXRob2ROYW1l
LCB2YWx1ZTsKLSAgaWYgKGRlc2NzW2FsdEtleV0gfHwgdmFsdWVzW2FsdEtleV0pIHsKLSAgICB2
YWx1ZSA9IHZhbHVlc1thbHRLZXldOwotICAgIGRlc2MgID0gZGVzY3NbYWx0S2V5XTsKLSAgfSBl
bHNlIGlmIChtLmRlc2NzW2FsdEtleV0pIHsKLSAgICBkZXNjICA9IG0uZGVzY3NbYWx0S2V5XTsK
LSAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKLSAgfSBlbHNlIHsKLSAgICBkZXNjID0gdW5kZWZpbmVk
OwotICAgIHZhbHVlID0gb2JqW2FsdEtleV07Ci0gIH0KLQotICByZXR1cm4geyBkZXNjOiBkZXNj
LCB2YWx1ZTogdmFsdWUgfTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVu
ZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsIHBhdGhzS2V5LCB1cGRhdGVNZXRob2Qp
IHsKLSAgdmFyIHBhdGhzID0gb2JzZXJ2ZXJPckxpc3RlbmVyW3BhdGhzS2V5XTsKLQotICBpZiAo
cGF0aHMpIHsKLSAgICBmb3IgKHZhciBpPTAsIGw9cGF0aHMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgICAgRW1iZXJbdXBkYXRlTWV0aG9kXShvYmosIHBhdGhzW2ldLCBudWxsLCBrZXkpOwotICAg
IH0KLSAgfQotfQotCi1mdW5jdGlvbiByZXBsYWNlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwg
a2V5LCBvYnNlcnZlck9yTGlzdGVuZXIpIHsKLSAgdmFyIHByZXYgPSBvYmpba2V5XTsKLQotICBp
ZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHByZXYpIHsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRM
aXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVzQmVmb3JlX18nLCAncmVt
b3ZlQmVmb3JlT2JzZXJ2ZXInKTsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2Jq
LCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVzX18nLCAncmVtb3ZlT2JzZXJ2ZXInKTsKLSAg
ICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHByZXYsICdfX2VtYmVyX2xp
c3RlbnNfXycsICdyZW1vdmVMaXN0ZW5lcicpOwotICB9Ci0KLSAgaWYgKCdmdW5jdGlvbicgPT09
IHR5cGVvZiBvYnNlcnZlck9yTGlzdGVuZXIpIHsKLSAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0
ZW5lcnMob2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lciwgJ19fZW1iZXJfb2JzZXJ2ZXNCZWZv
cmVfXycsICdhZGRCZWZvcmVPYnNlcnZlcicpOwotICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3Rl
bmVycyhvYmosIGtleSwgb2JzZXJ2ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc19fJywg
J2FkZE9ic2VydmVyJyk7Ci0gICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5
LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVyX2xpc3RlbnNfXycsICdhZGRMaXN0ZW5lcicp
OwotICB9Ci19Ci0KLWZ1bmN0aW9uIGFwcGx5TWl4aW4ob2JqLCBtaXhpbnMsIHBhcnRpYWwpIHsK
LSAgdmFyIGRlc2NzID0ge30sIHZhbHVlcyA9IHt9LCBtID0gRW1iZXIubWV0YShvYmopLAotICAg
ICAga2V5LCB2YWx1ZSwgZGVzYywga2V5cyA9IFtdOwotCi0gIC8vIEdvIHRocm91Z2ggYWxsIG1p
eGlucyBhbmQgaGFzaGVzIHBhc3NlZCBpbiwgYW5kOgotICAvLwotICAvLyAqIEhhbmRsZSBjb25j
YXRlbmF0ZWQgcHJvcGVydGllcwotICAvLyAqIEhhbmRsZSBtZXJnZWQgcHJvcGVydGllcwotICAv
LyAqIFNldCB1cCBfc3VwZXIgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5Ci0gIC8vICogU2V0IHVwIGNv
bXB1dGVkIHByb3BlcnR5IGRlc2NyaXB0b3JzCi0gIC8vICogQ29weWluZyBgdG9TdHJpbmdgIGlu
IGJyb2tlbiBicm93c2VycwotICBtZXJnZU1peGlucyhtaXhpbnMsIG1peGluc01ldGEob2JqKSwg
ZGVzY3MsIHZhbHVlcywgb2JqLCBrZXlzKTsKLQotICBmb3IodmFyIGkgPSAwLCBsID0ga2V5cy5s
ZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICBrZXkgPSBrZXlzW2ldOwotICAgIGlmIChrZXkgPT09
ICdjb25zdHJ1Y3RvcicgfHwgIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IGNvbnRpbnVl
OyB9Ci0KLSAgICBkZXNjID0gZGVzY3Nba2V5XTsKLSAgICB2YWx1ZSA9IHZhbHVlc1trZXldOwot
Ci0gICAgaWYgKGRlc2MgPT09IFJFUVVJUkVEKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICB3aGlsZSAo
ZGVzYyAmJiBkZXNjIGluc3RhbmNlb2YgQWxpYXMpIHsKLSAgICAgIHZhciBmb2xsb3dlZCA9IGZv
bGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcyk7Ci0gICAgICBkZXNjID0gZm9s
bG93ZWQuZGVzYzsKLSAgICAgIHZhbHVlID0gZm9sbG93ZWQudmFsdWU7Ci0gICAgfQotCi0gICAg
aWYgKGRlc2MgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IGNvbnRpbnVl
OyB9Ci0KLSAgICByZXBsYWNlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCB2YWx1ZSk7
Ci0gICAgZGV0ZWN0QmluZGluZyhvYmosIGtleSwgdmFsdWUsIG0pOwotICAgIGRlZmluZVByb3Bl
cnR5KG9iaiwga2V5LCBkZXNjLCB2YWx1ZSwgbSk7Ci0gIH0KLQotICBpZiAoIXBhcnRpYWwpIHsg
Ly8gZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBlCi0gICAgZmluaXNoUGFydGlhbChvYmosIG0pOwot
ICB9Ci0KLSAgcmV0dXJuIG9iajsKLX0KLQotLyoqCi0gIEBtZXRob2QgbWl4aW4KLSAgQGZvciBF
bWJlcgotICBAcGFyYW0gb2JqCi0gIEBwYXJhbSBtaXhpbnMqCi0gIEByZXR1cm4gb2JqCi0qLwot
RW1iZXIubWl4aW4gPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKTsKLSAgYXBwbHlNaXhpbihvYmosIGFyZ3MsIGZhbHNlKTsKLSAgcmV0dXJu
IG9iajsKLX07Ci0KLS8qKgotICBUaGUgYEVtYmVyLk1peGluYCBjbGFzcyBhbGxvd3MgeW91IHRv
IGNyZWF0ZSBtaXhpbnMsIHdob3NlIHByb3BlcnRpZXMgY2FuIGJlCi0gIGFkZGVkIHRvIG90aGVy
IGNsYXNzZXMuIEZvciBpbnN0YW5jZSwKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5FZGl0YWJs
ZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAgZWRpdDogZnVuY3Rpb24oKSB7Ci0gICAgICBj
b25zb2xlLmxvZygnc3RhcnRpbmcgdG8gZWRpdCcpOwotICAgICAgdGhpcy5zZXQoJ2lzRWRpdGlu
ZycsIHRydWUpOwotICAgIH0sCi0gICAgaXNFZGl0aW5nOiBmYWxzZQotICB9KTsKLQotICAvLyBN
aXggbWl4aW5zIGludG8gY2xhc3NlcyBieSBwYXNzaW5nIHRoZW0gYXMgdGhlIGZpcnN0IGFyZ3Vt
ZW50cyB0bwotICAvLyAuZXh0ZW5kLgotICBBcHAuQ29tbWVudFZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZChBcHAuRWRpdGFibGUsIHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCd7eyNpZiB2aWV3LmlzRWRpdGluZ319Li4ue3tlbHNlfX0uLi57ey9pZn19JykKLSAgfSk7
Ci0KLSAgY29tbWVudFZpZXcgPSBBcHAuQ29tbWVudFZpZXcuY3JlYXRlKCk7Ci0gIGNvbW1lbnRW
aWV3LmVkaXQoKTsgLy8gb3V0cHV0cyAnc3RhcnRpbmcgdG8gZWRpdCcKLSAgYGBgCi0KLSAgTm90
ZSB0aGF0IE1peGlucyBhcmUgY3JlYXRlZCB3aXRoIGBFbWJlci5NaXhpbi5jcmVhdGVgLCBub3QK
LSAgYEVtYmVyLk1peGluLmV4dGVuZGAuCi0KLSAgTm90ZSB0aGF0IG1peGlucyBleHRlbmQgYSBj
b25zdHJ1Y3RvcidzIHByb3RvdHlwZSBzbyBhcnJheXMgYW5kIG9iamVjdCBsaXRlcmFscwotICBk
ZWZpbmVkIGFzIHByb3BlcnRpZXMgd2lsbCBiZSBzaGFyZWQgYW1vbmdzdCBvYmplY3RzIHRoYXQg
aW1wbGVtZW50IHRoZSBtaXhpbi4KLSAgSWYgeW91IHdhbnQgdG8gZGVmaW5lIGFuIHByb3BlcnR5
IGluIGEgbWl4aW4gdGhhdCBpcyBub3Qgc2hhcmVkLCB5b3UgY2FuIGRlZmluZQotICBpdCBlaXRo
ZXIgYXMgYSBjb21wdXRlZCBwcm9wZXJ0eSBvciBoYXZlIGl0IGJlIGNyZWF0ZWQgb24gaW5pdGlh
bGl6YXRpb24gb2YgdGhlIG9iamVjdC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vZmlsdGVycyBh
cnJheSB3aWxsIGJlIHNoYXJlZCBhbW9uZ3N0IGFueSBvYmplY3QgaW1wbGVtZW50aW5nIG1peGlu
Ci0gIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICBmaWx0ZXJzOiBF
bWJlci5BKCkKLSAgfSk7Ci0KLSAgLy9maWx0ZXJzIHdpbGwgYmUgYSBzZXBhcmF0ZSAgYXJyYXkg
Zm9yIGV2ZXJ5IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1peGluCi0gIEFwcC5GaWx0ZXJhYmxl
ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICBmaWx0ZXJzOiBFbWJlci5jb21wdXRlZChmdW5j
dGlvbigpe3JldHVybiBFbWJlci5BKCk7fSkKLSAgfSk7Ci0KLSAgLy9maWx0ZXJzIHdpbGwgYmUg
Y3JlYXRlZCBhcyBhIHNlcGFyYXRlIGFycmF5IGR1cmluZyB0aGUgb2JqZWN0J3MgaW5pdGlhbGl6
YXRpb24KLSAgQXBwLkZpbHRlcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAgIGluaXQ6
IGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5fc3VwZXIoKTsKLSAgICAgIHRoaXMuc2V0KCJmaWx0
ZXJzIiwgRW1iZXIuQSgpKTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgTWl4aW4K
LSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLk1peGluID0gZnVuY3Rpb24oKSB7IHJldHVy
biBpbml0TWl4aW4odGhpcywgYXJndW1lbnRzKTsgfTsKLQotTWl4aW4gPSBFbWJlci5NaXhpbjsK
LQotTWl4aW4ucHJvdG90eXBlID0gewotICBwcm9wZXJ0aWVzOiBudWxsLAotICBtaXhpbnM6IG51
bGwsCi0gIG93bmVyQ29uc3RydWN0b3I6IG51bGwKLX07Ci0KLU1peGluLl9hcHBseSA9IGFwcGx5
TWl4aW47Ci0KLU1peGluLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uKG9iaikgewotICB2YXIgYXJn
cyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotICByZXR1cm4gYXBwbHlNaXhpbihvYmos
IGFyZ3MsIHRydWUpOwotfTsKLQotTWl4aW4uZmluaXNoUGFydGlhbCA9IGZpbmlzaFBhcnRpYWw7
Ci0KLUVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7Ci0KLS8qKgotICBAbWV0aG9k
IGNyZWF0ZQotICBAc3RhdGljCi0gIEBwYXJhbSBhcmd1bWVudHMqCi0qLwotTWl4aW4uY3JlYXRl
ID0gZnVuY3Rpb24oKSB7Ci0gIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gdHJ1ZTsKLSAg
dmFyIE0gPSB0aGlzOwotICByZXR1cm4gaW5pdE1peGluKG5ldyBNKCksIGFyZ3VtZW50cyk7Ci19
OwotCi12YXIgTWl4aW5Qcm90b3R5cGUgPSBNaXhpbi5wcm90b3R5cGU7Ci0KLS8qKgotICBAbWV0
aG9kIHJlb3BlbgotICBAcGFyYW0gYXJndW1lbnRzKgotKi8KLU1peGluUHJvdG90eXBlLnJlb3Bl
biA9IGZ1bmN0aW9uKCkgewotICB2YXIgbWl4aW4sIHRtcDsKLQotICBpZiAodGhpcy5wcm9wZXJ0
aWVzKSB7Ci0gICAgbWl4aW4gPSBNaXhpbi5jcmVhdGUoKTsKLSAgICBtaXhpbi5wcm9wZXJ0aWVz
ID0gdGhpcy5wcm9wZXJ0aWVzOwotICAgIGRlbGV0ZSB0aGlzLnByb3BlcnRpZXM7Ci0gICAgdGhp
cy5taXhpbnMgPSBbbWl4aW5dOwotICB9IGVsc2UgaWYgKCF0aGlzLm1peGlucykgewotICAgIHRo
aXMubWl4aW5zID0gW107Ci0gIH0KLQotICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWl4
aW5zID0gdGhpcy5taXhpbnMsIGlkeDsKLQotICBmb3IoaWR4PTA7IGlkeCA8IGxlbjsgaWR4Kysp
IHsKLSAgICBtaXhpbiA9IGFyZ3VtZW50c1tpZHhdOwotICAgIEVtYmVyLmFzc2VydCgnRXhwZWN0
ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3Ry
aW5nLmNhbGwobWl4aW4pLAotICAgICAgICAgICAgICAgICB0eXBlb2YgbWl4aW4gPT09ICdvYmpl
Y3QnICYmIG1peGluICE9PSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCht
aXhpbikgIT09ICdbb2JqZWN0IEFycmF5XScpOwotCi0gICAgaWYgKG1peGluIGluc3RhbmNlb2Yg
TWl4aW4pIHsKLSAgICAgIG1peGlucy5wdXNoKG1peGluKTsKLSAgICB9IGVsc2UgewotICAgICAg
dG1wID0gTWl4aW4uY3JlYXRlKCk7Ci0gICAgICB0bXAucHJvcGVydGllcyA9IG1peGluOwotICAg
ICAgbWl4aW5zLnB1c2godG1wKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdGhpczsKLX07Ci0K
LS8qKgotICBAbWV0aG9kIGFwcGx5Ci0gIEBwYXJhbSBvYmoKLSAgQHJldHVybiBhcHBsaWVkIG9i
amVjdAotKi8KLU1peGluUHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHJldHVy
biBhcHBseU1peGluKG9iaiwgW3RoaXNdLCBmYWxzZSk7Ci19OwotCi1NaXhpblByb3RvdHlwZS5h
cHBseVBhcnRpYWwgPSBmdW5jdGlvbihvYmopIHsKLSAgcmV0dXJuIGFwcGx5TWl4aW4ob2JqLCBb
dGhpc10sIHRydWUpOwotfTsKLQotZnVuY3Rpb24gX2RldGVjdChjdXJNaXhpbiwgdGFyZ2V0TWl4
aW4sIHNlZW4pIHsKLSAgdmFyIGd1aWQgPSBndWlkRm9yKGN1ck1peGluKTsKLQotICBpZiAoc2Vl
bltndWlkXSkgeyByZXR1cm4gZmFsc2U7IH0KLSAgc2VlbltndWlkXSA9IHRydWU7Ci0KLSAgaWYg
KGN1ck1peGluID09PSB0YXJnZXRNaXhpbikgeyByZXR1cm4gdHJ1ZTsgfQotICB2YXIgbWl4aW5z
ID0gY3VyTWl4aW4ubWl4aW5zLCBsb2MgPSBtaXhpbnMgPyBtaXhpbnMubGVuZ3RoIDogMDsKLSAg
d2hpbGUgKC0tbG9jID49IDApIHsKLSAgICBpZiAoX2RldGVjdChtaXhpbnNbbG9jXSwgdGFyZ2V0
TWl4aW4sIHNlZW4pKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQot
Ci0vKioKLSAgQG1ldGhvZCBkZXRlY3QKLSAgQHBhcmFtIG9iagotICBAcmV0dXJuIHtCb29sZWFu
fQotKi8KLU1peGluUHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uKG9iaikgewotICBpZiAoIW9i
aikgeyByZXR1cm4gZmFsc2U7IH0KLSAgaWYgKG9iaiBpbnN0YW5jZW9mIE1peGluKSB7IHJldHVy
biBfZGV0ZWN0KG9iaiwgdGhpcywge30pOyB9Ci0gIHZhciBtaXhpbnMgPSBFbWJlci5tZXRhKG9i
aiwgZmFsc2UpLm1peGluczsKLSAgaWYgKG1peGlucykgewotICAgIHJldHVybiAhIW1peGluc1tn
dWlkRm9yKHRoaXMpXTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19OwotCi1NaXhpblByb3RvdHlw
ZS53aXRob3V0ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciByZXQgPSBuZXcgTWl4aW4odGhpcyk7Ci0g
IHJldC5fd2l0aG91dCA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICByZXR1cm4gcmV0Owot
fTsKLQotZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgewotICBpZiAoc2VlbltndWlk
Rm9yKG1peGluKV0pIHsgcmV0dXJuOyB9Ci0gIHNlZW5bZ3VpZEZvcihtaXhpbildID0gdHJ1ZTsK
LQotICBpZiAobWl4aW4ucHJvcGVydGllcykgewotICAgIHZhciBwcm9wcyA9IG1peGluLnByb3Bl
cnRpZXM7Ci0gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7Ci0gICAgICBpZiAocHJvcHMuaGFz
T3duUHJvcGVydHkoa2V5KSkgeyByZXRba2V5XSA9IHRydWU7IH0KLSAgICB9Ci0gIH0gZWxzZSBp
ZiAobWl4aW4ubWl4aW5zKSB7Ci0gICAgYV9mb3JFYWNoLmNhbGwobWl4aW4ubWl4aW5zLCBmdW5j
dGlvbih4KSB7IF9rZXlzKHJldCwgeCwgc2Vlbik7IH0pOwotICB9Ci19Ci0KLU1peGluUHJvdG90
eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGtleXMgPSB7fSwgc2VlbiA9IHt9LCByZXQg
PSBbXTsKLSAgX2tleXMoa2V5cywgdGhpcywgc2Vlbik7Ci0gIGZvcih2YXIga2V5IGluIGtleXMp
IHsKLSAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldC5wdXNoKGtleSk7IH0K
LSAgfQotICByZXR1cm4gcmV0OwotfTsKLQotLy8gcmV0dXJucyB0aGUgbWl4aW5zIGN1cnJlbnRs
eSBhcHBsaWVkIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0vLyBUT0RPOiBNYWtlIEVtYmVyLm1p
eGluCi1NaXhpbi5taXhpbnMgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIG1peGlucyA9IEVtYmVy
Lm1ldGEob2JqLCBmYWxzZSkubWl4aW5zLCByZXQgPSBbXTsKLQotICBpZiAoIW1peGlucykgeyBy
ZXR1cm4gcmV0OyB9Ci0KLSAgZm9yICh2YXIga2V5IGluIG1peGlucykgewotICAgIHZhciBtaXhp
biA9IG1peGluc1trZXldOwotCi0gICAgLy8gc2tpcCBwcmltaXRpdmUgbWl4aW5zIHNpbmNlIHRo
ZXNlIGFyZSBhbHdheXMgYW5vbnltb3VzCi0gICAgaWYgKCFtaXhpbi5wcm9wZXJ0aWVzKSB7IHJl
dC5wdXNoKG1peGluKTsgfQotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX07Ci0KLVJFUVVJUkVEID0g
bmV3IEVtYmVyLkRlc2NyaXB0b3IoKTsKLVJFUVVJUkVELnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7
IHJldHVybiAnKFJlcXVpcmVkIFByb3BlcnR5KSc7IH07Ci0KLS8qKgotICBEZW5vdGVzIGEgcmVx
dWlyZWQgcHJvcGVydHkgZm9yIGEgbWl4aW4KLQotICBAbWV0aG9kIHJlcXVpcmVkCi0gIEBmb3Ig
RW1iZXIKLSovCi1FbWJlci5yZXF1aXJlZCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gUkVRVUlS
RUQ7Ci19OwotCi1BbGlhcyA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgdGhpcy5tZXRob2RO
YW1lID0gbWV0aG9kTmFtZTsKLX07Ci1BbGlhcy5wcm90b3R5cGUgPSBuZXcgRW1iZXIuRGVzY3Jp
cHRvcigpOwotCi0vKioKLSAgTWFrZXMgYSBwcm9wZXJ0eSBvciBtZXRob2QgYXZhaWxhYmxlIHZp
YSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGFpbnRTYW1w
bGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICBjb2xvcjogJ3JlZCcsCi0gICAgY29sb3Vy
OiBFbWJlci5hbGlhcygnY29sb3InKSwKLSAgICBuYW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJl
dHVybiAiWmVkIjsKLSAgICB9LAotICAgIG1vbmlrZXI6IEVtYmVyLmFsaWFzKCJuYW1lIikKLSAg
fSk7Ci0KLSAgdmFyIHBhaW50U2FtcGxlID0gQXBwLlBhaW50U2FtcGxlLmNyZWF0ZSgpCi0gIHBh
aW50U2FtcGxlLmdldCgnY29sb3VyJyk7ICAvLyAncmVkJwotICBwYWludFNhbXBsZS5tb25pa2Vy
KCk7ICAgICAgLy8gJ1plZCcKLSAgYGBgCi0KLSAgQG1ldGhvZCBhbGlhcwotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCBvciBwcm9w
ZXJ0eSB0byBhbGlhcwotICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotICBAZGVwcmVjYXRl
ZCBVc2UgYEVtYmVyLmFsaWFzTWV0aG9kYCBvciBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgIGluc3Rl
YWQKLSovCi1FbWJlci5hbGlhcyA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKLSAgRW1iZXIuZGVw
cmVjYXRlKCJFbWJlci5hbGlhcyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLmFsaWFz
TWV0aG9kIG9yIEVtYmVyLmNvbXB1dGVkLmFsaWFzIGluc3RlYWQuIik7Ci0gIHJldHVybiBuZXcg
QWxpYXMobWV0aG9kTmFtZSk7Ci19OwotCi0vKioKLSAgTWFrZXMgYSBtZXRob2QgYXZhaWxhYmxl
IHZpYSBhbiBhZGRpdGlvbmFsIG5hbWUuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29u
ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgbmFtZTogZnVuY3Rpb24oKSB7Ci0gICAgICBy
ZXR1cm4gJ1RvbWh1ZGEgS2F0emRhbGUnOwotICAgIH0sCi0gICAgbW9uaWtlcjogRW1iZXIuYWxp
YXNNZXRob2QoJ25hbWUnKQotICB9KTsKLQotICB2YXIgZ29vZEd1eSA9IEFwcC5QZXJzb24uY3Jl
YXRlKCkKLSAgYGBgCi0KLSAgQG1ldGhvZCBhbGlhc01ldGhvZAotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSB7U3RyaW5nfSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBhbGlhcwotICBA
cmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQotKi8KLUVtYmVyLmFsaWFzTWV0aG9kID0gZnVuY3Rp
b24obWV0aG9kTmFtZSkgewotICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOwotfTsKLQot
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgotLy8gT0JTRVJWRVIgSEVMUEVSCi0vLwotCi0vKioKLSAgU3BlY2lmeSBhIG1ldGhvZCB0
aGF0IG9ic2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgICB2YWx1ZU9ic2VydmVyOiBFbWJlci5vYnNlcnZlcigndmFs
dWUnLCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUi
IHByb3BlcnR5IGNoYW5nZXMKLSAgICB9KQotICB9KTsKLSAgYGBgCi0KLSAgSW4gdGhlIGZ1dHVy
ZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4gSWYgeW91IHdhbnQgdG8gZW5z
dXJlCi0gIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1c2UgYGltbWVkaWF0ZU9ic2VydmVyYC4KLQot
ICBBbHNvIGF2YWlsYWJsZSBhcyBgRnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzYCBpZiBwcm90
b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAgZW5hYmxlZC4KLQotICBAbWV0aG9kIG9ic2VydmVyCi0g
IEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCi0gIEBwYXJhbSB7
RnVuY3Rpb259IGZ1bmMKLSAgQHJldHVybiBmdW5jCi0qLwotRW1iZXIub2JzZXJ2ZXIgPSBmdW5j
dGlvbigpIHsKLSAgdmFyIGZ1bmMgID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdOwot
ICB2YXIgcGF0aHM7Ci0KLSAgCi0gICAgcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAw
LCAtMSk7Ci0KLSAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIpIHsKLSAgICAgIC8v
IHJldmVydCB0byBvbGQsIHNvZnQtZGVwcmVjYXRlZCBhcmd1bWVudCBvcmRlcmluZwotCi0gICAg
ICBmdW5jICA9IGFyZ3VtZW50c1swXTsKLSAgICAgIHBhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSk7Ci0gICAgfQotICAKLQotICBpZiAodHlwZW9mIGZ1bmMgIT09ICJmdW5jdGlvbiIp
IHsKLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVtYmVyLm9ic2VydmVyIGNhbGxlZCB3aXRo
b3V0IGEgZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZ1bmMuX19lbWJlcl9vYnNlcnZlc19fID0gcGF0
aHM7Ci0gIHJldHVybiBmdW5jOwotfTsKLQotLyoqCi0gIFNwZWNpZnkgYSBtZXRob2QgdGhhdCBv
YnNlcnZlcyBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuT2Jq
ZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNlcnZlcjogRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIo
J3ZhbHVlJywgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZh
bHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEluIHRoZSBm
dXR1cmUsIGBFbWJlci5vYnNlcnZlcmAgbWF5IGJlY29tZSBhc3luY2hyb25vdXMuIEluIHRoaXMg
ZXZlbnQsCi0gIGBFbWJlci5pbW1lZGlhdGVPYnNlcnZlcmAgd2lsbCBtYWludGFpbiB0aGUgc3lu
Y2hyb25vdXMgYmVoYXZpb3IuCi0KLSAgQWxzbyBhdmFpbGFibGUgYXMgYEZ1bmN0aW9uLnByb3Rv
dHlwZS5vYnNlcnZlc0ltbWVkaWF0ZWx5YCBpZiBwcm90b3R5cGUgZXh0ZW5zaW9ucyBhcmUKLSAg
ZW5hYmxlZC4KLQotICBAbWV0aG9kIGltbWVkaWF0ZU9ic2VydmVyCi0gIEBmb3IgRW1iZXIKLSAg
QHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMK
LSAgQHJldHVybiBmdW5jCi0qLwotRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXIgPSBmdW5jdGlvbigp
IHsKLSAgZm9yICh2YXIgaT0wLCBsPWFyZ3VtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKLSAgICBFbWJlci5hc3NlcnQoIkltbWVkaWF0ZSBvYnNl
cnZlcnMgbXVzdCBvYnNlcnZlIGludGVybmFsIHByb3BlcnRpZXMgb25seSwgbm90IHByb3BlcnRp
ZXMgb24gb3RoZXIgb2JqZWN0cy4iLCB0eXBlb2YgYXJnICE9PSAic3RyaW5nIiB8fCBhcmcuaW5k
ZXhPZignLicpID09PSAtMSk7Ci0gIH0KLQotICByZXR1cm4gRW1iZXIub2JzZXJ2ZXIuYXBwbHko
dGhpcywgYXJndW1lbnRzKTsKLX07Ci0KLS8qKgotICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5
IGFyZSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzIGBvYmpgLCBga2V5TmFtZWAuCi0KLSAgTm90
ZSwgYEBlYWNoLnByb3BlcnR5YCBvYnNlcnZlciBpcyBjYWxsZWQgcGVyIGVhY2ggYWRkIG9yIHJl
cGxhY2Ugb2YgYW4gZWxlbWVudAotICBhbmQgaXQncyBub3QgY2FsbGVkIHdpdGggYSBzcGVjaWZp
YyBlbnVtZXJhdGlvbiBpdGVtLgotCi0gIEEgYGJlZm9yZU9ic2VydmVyYCBmaXJlcyBiZWZvcmUg
YSBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIEEgYGJlZm9yZU9ic2VydmVyYCBpcyBhbiBhbHRlcm5h
dGl2ZSBmb3JtIG9mIGAub2JzZXJ2ZXNCZWZvcmUoKWAuCi0KLSAgYGBgamF2YXNjcmlwdAotICBB
cHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLQotICAgIGZyaWVuZHM6IFt7IG5h
bWU6ICdUb20nIH0sIHsgbmFtZTogJ1N0ZWZhbicgfSwgeyBuYW1lOiAnS3JpcycgfV0sCi0KLSAg
ICB2YWx1ZVdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50LnZhbHVlJywg
ZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7Ci0gICAgICB0aGlzLmNoYW5naW5nRnJvbSA9IG9iai5n
ZXQoa2V5TmFtZSk7Ci0gICAgfSksCi0KLSAgICB2YWx1ZURpZENoYW5nZTogRW1iZXIub2JzZXJ2
ZXIoJ2NvbnRlbnQudmFsdWUnLCBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKLSAgICAgICAgLy8g
b25seSBydW4gaWYgdXBkYXRpbmcgYSB2YWx1ZSBhbHJlYWR5IGluIHRoZSBET00KLSAgICAgICAg
aWYgKHRoaXMuZ2V0KCdzdGF0ZScpID09PSAnaW5ET00nKSB7Ci0gICAgICAgICAgdmFyIGNvbG9y
ID0gb2JqLmdldChrZXlOYW1lKSA+IHRoaXMuY2hhbmdpbmdGcm9tID8gJ2dyZWVuJyA6ICdyZWQn
OwotICAgICAgICAgIC8vIGxvZ2ljCi0gICAgICAgIH0KLSAgICB9KSwKLQotICAgIGZyaWVuZHNE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdmcmllbmRzLkBlYWNoLm5hbWUnLCBmdW5jdGlvbihv
YmosIGtleU5hbWUpIHsKLSAgICAgIC8vIHNvbWUgbG9naWMKLSAgICAgIC8vIG9iai5nZXQoa2V5
TmFtZSkgcmV0dXJucyBmcmllbmRzIGFycmF5Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0gIEFs
c28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNCZWZvcmVgIGlmIHBy
b3RvdHlwZSBleHRlbnNpb25zIGFyZQotICBlbmFibGVkLgotCi0gIEBtZXRob2QgYmVmb3JlT2Jz
ZXJ2ZXIKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lcyoKLSAg
QHBhcmFtIHtGdW5jdGlvbn0gZnVuYwotICBAcmV0dXJuIGZ1bmMKLSovCi1FbWJlci5iZWZvcmVP
YnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICB2YXIgZnVuYyAgPSBhX3NsaWNlLmNhbGwoYXJndW1l
bnRzLCAtMSlbMF07Ci0gIHZhciBwYXRoczsKLQotICAKLSAgICBwYXRocyA9IGFfc2xpY2UuY2Fs
bChhcmd1bWVudHMsIDAsIC0xKTsKLQotICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9u
IikgewotICAgICAgLy8gcmV2ZXJ0IHRvIG9sZCwgc29mdC1kZXByZWNhdGVkIGFyZ3VtZW50IG9y
ZGVyaW5nCi0KLSAgICAgIGZ1bmMgID0gYXJndW1lbnRzWzBdOwotICAgICAgcGF0aHMgPSBhX3Ns
aWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICB9Ci0gIAotCi0gIGlmICh0eXBlb2YgZnVuYyAh
PT0gImZ1bmN0aW9uIikgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiRW1iZXIuYmVmb3Jl
T2JzZXJ2ZXIgY2FsbGVkIHdpdGhvdXQgYSBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZnVuYy5fX2Vt
YmVyX29ic2VydmVzQmVmb3JlX18gPSBwYXRoczsKLSAgcmV0dXJuIGZ1bmM7Ci19OwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gUHJvdmlkZXMgYSB3YXkgdG8gcmVnaXN0ZXIgbGli
cmFyeSB2ZXJzaW9ucyB3aXRoIGVtYmVyLgotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl
VXRpbHMuZm9yRWFjaCwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4
T2Y7Ci0KLUVtYmVyLmxpYnJhcmllcyA9IGZ1bmN0aW9uKCkgewotICB2YXIgbGlicmFyaWVzICAg
ID0gW107Ci0gIHZhciBjb3JlTGliSW5kZXggPSAwOwotCi0gIHZhciBnZXRMaWJyYXJ5ID0gZnVu
Y3Rpb24obmFtZSkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsg
aSsrKSB7Ci0gICAgICBpZiAobGlicmFyaWVzW2ldLm5hbWUgPT09IG5hbWUpIHsKLSAgICAgICAg
cmV0dXJuIGxpYnJhcmllc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0KLSAgbGlicmFyaWVz
LnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgdmVyc2lvbikgewotICAgIGlmICghZ2V0TGlicmFy
eShuYW1lKSkgewotICAgICAgbGlicmFyaWVzLnB1c2goe25hbWU6IG5hbWUsIHZlcnNpb246IHZl
cnNpb259KTsKLSAgICB9Ci0gIH07Ci0KLSAgbGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkg
PSBmdW5jdGlvbihuYW1lLCB2ZXJzaW9uKSB7Ci0gICAgaWYgKCFnZXRMaWJyYXJ5KG5hbWUpKSB7
Ci0gICAgICBsaWJyYXJpZXMuc3BsaWNlKGNvcmVMaWJJbmRleCsrLCAwLCB7bmFtZTogbmFtZSwg
dmVyc2lvbjogdmVyc2lvbn0pOwotICAgIH0KLSAgfTsKLQotICBsaWJyYXJpZXMuZGVSZWdpc3Rl
ciA9IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgbGliID0gZ2V0TGlicmFyeShuYW1lKTsKLSAg
ICBpZiAobGliKSBsaWJyYXJpZXMuc3BsaWNlKGluZGV4T2YobGlicmFyaWVzLCBsaWIpLCAxKTsK
LSAgfTsKLQotICBsaWJyYXJpZXMuZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewotICAgIGZv
ckVhY2gobGlicmFyaWVzLCBmdW5jdGlvbihsaWIpIHsKLSAgICAgIGNhbGxiYWNrKGxpYi5uYW1l
LCBsaWIudmVyc2lvbik7Ci0gICAgfSk7Ci0gIH07Ci0KLSAgcmV0dXJuIGxpYnJhcmllczsKLX0o
KTsKLQotRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0VtYmVyJywgRW1iZXIu
VkVSU0lPTik7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIE1ldGFs
Ci0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItbWV0YWwKLSovCi0KLX0pKCk7Ci0K
LShmdW5jdGlvbigpIHsKLS8qKgotICBAY2xhc3MgUlNWUAotICBAbW9kdWxlIFJTVlAKLSAgKi8K
LWRlZmluZSgicnN2cC9hbGwiLCAKLSAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0
aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0g
ICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIC8qKgot
ICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIGBSU1ZQLlByb21pc2UuYWxsYC4K
LQotICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJh
eX0gYXJyYXkgQXJyYXkgb2YgcHJvbWlzZXMuCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
QW4gb3B0aW9uYWwgbGFiZWwuIFRoaXMgaXMgdXNlZnVsCi0gICAgICBmb3IgdG9vbGluZy4KLSAg
ICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlv
biBhbGwoYXJyYXksIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXJyYXksIGxh
YmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9hbGxfc2V0dGxlZCIsIAotICBbIi4v
cHJvbWlzZSIsIi4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFf
XywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAg
ICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBpc0Fy
cmF5ID0gX19kZXBlbmRlbmN5Ml9fLmlzQXJyYXk7Ci0gICAgdmFyIGlzTm9uVGhlbmFibGUgPSBf
X2RlcGVuZGVuY3kyX18uaXNOb25UaGVuYWJsZTsKLQotICAgIC8qKgotICAgICAgYFJTVlAuYWxs
U2V0dGxlZGAgaXMgc2ltaWxhciB0byBgUlNWUC5hbGxgLCBidXQgaW5zdGVhZCBvZiBpbXBsZW1l
bnRpbmcKLSAgICAgIGEgZmFpbC1mYXN0IG1ldGhvZCwgaXQgd2FpdHMgdW50aWwgYWxsIHRoZSBw
cm9taXNlcyBoYXZlIHJldHVybmVkIGFuZAotICAgICAgc2hvd3MgeW91IGFsbCB0aGUgcmVzdWx0
cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gaGFuZGxlIG11bHRpcGxlCi0gICAgICBw
cm9taXNlcycgZmFpbHVyZSBzdGF0ZXMgdG9nZXRoZXIgYXMgYSBzZXQuCi0KLSAgICAgIFJldHVy
bnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNl
cyBoYXZlIGJlZW4KLSAgICAgIHNldHRsZWQuIFRoZSByZXR1cm4gcHJvbWlzZSBpcyBmdWxmaWxs
ZWQgd2l0aCBhbiBhcnJheSBvZiB0aGUgc3RhdGVzIG9mCi0gICAgICB0aGUgcHJvbWlzZXMgcGFz
c2VkIGludG8gdGhlIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQuCi0KLSAgICAgIEVhY2ggc3Rh
dGUgb2JqZWN0IHdpbGwgZWl0aGVyIGluZGljYXRlIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiwg
YW5kCi0gICAgICBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9yIHJlYXNvbi4gVGhl
IHN0YXRlcyB3aWxsIHRha2Ugb25lIG9mCi0gICAgICB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTog
dmFsdWUgfQotICAgICAgICBvcgotICAgICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBy
ZWFzb24gfQotICAgICAgYGBgCi0KLSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwotICAgICAg
dmFyIHByb21pc2UyID0gUlNWUC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJzInKSk7Ci0gICAg
ICB2YXIgcHJvbWlzZTMgPSBSU1ZQLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcignMycpKTsKLSAg
ICAgIHZhciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0g
ICAgICBSU1ZQLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpewotICAg
ICAgICAvLyBhcnJheSA9PSBbCi0gICAgICAgIC8vICAgeyBzdGF0ZTogJ2Z1bGZpbGxlZCcsIHZh
bHVlOiAxIH0sCi0gICAgICAgIC8vICAgeyBzdGF0ZTogJ3JlamVjdGVkJywgcmVhc29uOiBFcnJv
ciB9LAotICAgICAgICAvLyAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJlYXNvbjogRXJyb3IgfQot
ICAgICAgICAvLyBdCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgdGhlIHNlY29uZCBpdGVtLCBy
ZWFzb24ubWVzc2FnZSB3aWxsIGJlICIyIiwgYW5kIGZvciB0aGUKLSAgICAgICAgLy8gdGhpcmQg
aXRlbSwgcmVhc29uLm1lc3NhZ2Ugd2lsbCBiZSAiMyIuCi0gICAgICB9LCBmdW5jdGlvbihlcnJv
cikgewotICAgICAgICAvLyBOb3QgcnVuLiAoVGhpcyBibG9jayB3b3VsZCBvbmx5IGJlIGNhbGxl
ZCBpZiBhbGxTZXR0bGVkIGhhZCBmYWlsZWQsCi0gICAgICAgIC8vIGZvciBpbnN0YW5jZSBpZiBw
YXNzZWQgYW4gaW5jb3JyZWN0IGFyZ3VtZW50IHR5cGUuKQotICAgICAgfSk7Ci0gICAgICBgYGAK
LQotICAgICAgQG1ldGhvZCBhbGxTZXR0bGVkCi0gICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJh
bSB7QXJyYXl9IHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25h
bCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRv
b2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVk
IHdpdGggYW4gYXJyYXkgb2YgdGhlIHNldHRsZWQKLSAgICAgIHN0YXRlcyBvZiB0aGUgY29uc3Rp
dHVlbnQgcHJvbWlzZXMuCi0gICAgICBAc3RhdGljCi0gICAgKi8KLQotICAgIF9fZXhwb3J0c19f
WyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBhbGxTZXR0bGVkKGVudHJpZXMsIGxhYmVsKSB7Ci0gICAg
ICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7Ci0gICAgICAg
IGlmICghaXNBcnJheShlbnRyaWVzKSkgewotICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
J1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gYWxsU2V0dGxlZC4nKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHZhciByZW1haW5pbmcgPSBlbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgdmFyIGVudHJ5
OwotCi0gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHsKLSAgICAgICAgICByZXNvbHZlKFtd
KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcmVzdWx0cyA9
IG5ldyBBcnJheShyZW1haW5pbmcpOwotCi0gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZFJlc29s
dmVyKGluZGV4KSB7Ci0gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAg
ICAgICByZXNvbHZlQWxsKGluZGV4LCBmdWxmaWxsZWQodmFsdWUpKTsKLSAgICAgICAgICB9Owot
ICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWRSZXNvbHZlcihpbmRleCkgewot
ICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAgICAgIHJlc29sdmVB
bGwoaW5kZXgsIHJlamVjdGVkKHJlYXNvbikpOwotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQot
ICAgICAgICBmdW5jdGlvbiByZXNvbHZlQWxsKGluZGV4LCB2YWx1ZSkgewotICAgICAgICAgIHJl
c3VsdHNbaW5kZXhdID0gdmFsdWU7Ci0gICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7
Ci0gICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5k
ZXgrKykgewotICAgICAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleF07Ci0KLSAgICAgICAgICBp
ZiAoaXNOb25UaGVuYWJsZShlbnRyeSkpIHsKLSAgICAgICAgICAgIHJlc29sdmVBbGwoaW5kZXgs
IGZ1bGZpbGxlZChlbnRyeSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQcm9t
aXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkUmVzb2x2ZXIoaW5kZXgpLCByZWplY3RlZFJl
c29sdmVyKGluZGV4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9LCBsYWJlbCk7
Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgewotICAgICAgcmV0dXJu
IHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTsKLSAgICB9Ci0KLSAgICBmdW5j
dGlvbiByZWplY3RlZChyZWFzb24pIHsKLSAgICAgIHJldHVybiB7IHN0YXRlOiAncmVqZWN0ZWQn
LCByZWFzb246IHJlYXNvbiB9OwotICAgIH0KLSAgfSk7Ci1kZWZpbmUoInJzdnAvY29uZmlnIiwg
Ci0gIFsiLi9ldmVudHMiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywg
X19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0g
X19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0KLSAgICB2YXIgY29uZmlnID0gewotICAgICAg
aW5zdHJ1bWVudDogZmFsc2UKLSAgICB9OwotCi0gICAgRXZlbnRUYXJnZXQubWl4aW4oY29uZmln
KTsKLQotICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZShuYW1lLCB2YWx1ZSkgewotICAgICAgaWYgKG5h
bWUgPT09ICdvbmVycm9yJykgewotICAgICAgICAvLyBoYW5kbGUgZm9yIGxlZ2FjeSB1c2VycyB0
aGF0IGV4cGVjdCB0aGUgYWN0dWFsCi0gICAgICAgIC8vIGVycm9yIHRvIGJlIHBhc3NlZCB0byB0
aGVpciBmdW5jdGlvbiBhZGRlZCB2aWEKLSAgICAgICAgLy8gYFJTVlAuY29uZmlndXJlKCdvbmVy
cm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAotICAgICAgICBjb25maWcub24oJ2Vycm9yJywgdmFs
dWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhcmd1bWVudHMubGVu
Z3RoID09PSAyKSB7Ci0gICAgICAgIGNvbmZpZ1tuYW1lXSA9IHZhbHVlOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1tuYW1lXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBf
X2V4cG9ydHNfXy5jb25maWcgPSBjb25maWc7Ci0gICAgX19leHBvcnRzX18uY29uZmlndXJlID0g
Y29uZmlndXJlOwotICB9KTsKLWRlZmluZSgicnN2cC9kZWZlciIsIAotICBbIi4vcHJvbWlzZSIs
ImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVm
YXVsdCJdOwotCi0gICAgLyoqCi0gICAgICBgUlNWUC5kZWZlcmAgcmV0dXJucyBhbiBvYmplY3Qg
c2ltaWxhciB0byBqUXVlcnkncyBgJC5EZWZlcnJlZGAuCi0gICAgICBgUlNWUC5kZWZlcmAgc2hv
dWxkIGJlIHVzZWQgd2hlbiBwb3J0aW5nIG92ZXIgY29kZSByZWxpYW50IG9uIGAkLkRlZmVycmVk
YCdzCi0gICAgICBpbnRlcmZhY2UuIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIGBSU1ZQLlByb21p
c2VgIGNvbnN0cnVjdG9yIGluc3RlYWQuCi0KLSAgICAgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJv
bSBgUlNWUC5kZWZlcmAgaXMgYSBwbGFpbiBvYmplY3Qgd2l0aCB0aHJlZSBwcm9wZXJ0aWVzOgot
Ci0gICAgICAqIHByb21pc2UgLSBhbiBgUlNWUC5Qcm9taXNlYC4KLSAgICAgICogcmVqZWN0IC0g
YSBmdW5jdGlvbiB0aGF0IGNhdXNlcyB0aGUgYHByb21pc2VgIHByb3BlcnR5IG9uIHRoaXMgb2Jq
ZWN0IHRvCi0gICAgICAgIGJlY29tZSByZWplY3RlZAotICAgICAgKiByZXNvbHZlIC0gYSBmdW5j
dGlvbiB0aGF0IGNhdXNlcyB0aGUgYHByb21pc2VgIHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IHRv
Ci0gICAgICAgIGJlY29tZSBmdWxmaWxsZWQuCi0KLSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgICAgdmFyIGRlZmVycmVkID0gUlNWUC5kZWZlcigpOwotCi0gICAg
ICAgZGVmZXJyZWQucmVzb2x2ZSgiU3VjY2VzcyEiKTsKLQotICAgICAgIGRlZmVyZWQucHJvbWlz
ZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXsKLSAgICAgICAgIC8vIHZhbHVlIGhlcmUgaXMgIlN1Y2Nl
c3MhIgotICAgICAgIH0pOwotICAgICAgIGBgYAotCi0gICAgICBAbWV0aG9kIGRlZmVyCi0gICAg
ICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
Zm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7T2JqZWN0fQotICAgICAqLwotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQi
XSA9IGZ1bmN0aW9uIGRlZmVyKGxhYmVsKSB7Ci0gICAgICB2YXIgZGVmZXJyZWQgPSB7IH07Ci0K
LSAgICAgIGRlZmVycmVkLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpIHsKLSAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSA9IHJlc29sdmU7Ci0gICAgICAgIGRl
ZmVycmVkLnJlamVjdCA9IHJlamVjdDsKLSAgICAgIH0sIGxhYmVsKTsKLQotICAgICAgcmV0dXJu
IGRlZmVycmVkOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL2V2ZW50cyIsIAotICBbImV4
cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0g
ICAgdmFyIGluZGV4T2YgPSBmdW5jdGlvbihjYWxsYmFja3MsIGNhbGxiYWNrKSB7Ci0gICAgICBm
b3IgKHZhciBpPTAsIGw9Y2FsbGJhY2tzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgaWYg
KGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2spIHsgcmV0dXJuIGk7IH0KLSAgICAgIH0KLQotICAg
ICAgcmV0dXJuIC0xOwotICAgIH07Ci0KLSAgICB2YXIgY2FsbGJhY2tzRm9yID0gZnVuY3Rpb24o
b2JqZWN0KSB7Ci0gICAgICB2YXIgY2FsbGJhY2tzID0gb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tz
OwotCi0gICAgICBpZiAoIWNhbGxiYWNrcykgewotICAgICAgICBjYWxsYmFja3MgPSBvYmplY3Qu
X3Byb21pc2VDYWxsYmFja3MgPSB7fTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGNhbGxiYWNr
czsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICBAY2xhc3MgUlNWUC5FdmVudFRhcmdldAotICAg
ICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IHsKLQotICAgICAgLyoqCi0gICAgICAg
IGBSU1ZQLkV2ZW50VGFyZ2V0Lm1peGluYCBleHRlbmRzIGFuIG9iamVjdCB3aXRoIEV2ZW50VGFy
Z2V0IG1ldGhvZHMuIEZvcgotICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3Jp
cHQKLSAgICAgICAgdmFyIG9iamVjdCA9IHt9OwotCi0gICAgICAgIFJTVlAuRXZlbnRUYXJnZXQu
bWl4aW4ob2JqZWN0KTsKLQotICAgICAgICBvYmplY3Qub24oImZpbmlzaGVkIiwgZnVuY3Rpb24o
ZXZlbnQpIHsKLSAgICAgICAgICAvLyBoYW5kbGUgZXZlbnQKLSAgICAgICAgfSk7Ci0KLSAgICAg
ICAgb2JqZWN0LnRyaWdnZXIoImZpbmlzaGVkIiwgeyBkZXRhaWw6IHZhbHVlIH0pOwotICAgICAg
ICBgYGAKLQotICAgICAgICBgRXZlbnRUYXJnZXQubWl4aW5gIGFsc28gd29ya3Mgd2l0aCBwcm90
b3R5cGVzOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIFBlcnNvbiA9IGZ1
bmN0aW9uKCkge307Ci0gICAgICAgIFJTVlAuRXZlbnRUYXJnZXQubWl4aW4oUGVyc29uLnByb3Rv
dHlwZSk7Ci0KLSAgICAgICAgdmFyIHllaHVkYSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgdmFy
IHRvbSA9IG5ldyBQZXJzb24oKTsKLQotICAgICAgICB5ZWh1ZGEub24oInBva2UiLCBmdW5jdGlv
bihldmVudCkgewotICAgICAgICAgIGNvbnNvbGUubG9nKCJZZWh1ZGEgc2F5cyBPVyIpOwotICAg
ICAgICB9KTsKLQotICAgICAgICB0b20ub24oInBva2UiLCBmdW5jdGlvbihldmVudCkgewotICAg
ICAgICAgIGNvbnNvbGUubG9nKCJUb20gc2F5cyBPVyIpOwotICAgICAgICB9KTsKLQotICAgICAg
ICB5ZWh1ZGEudHJpZ2dlcigicG9rZSIpOwotICAgICAgICB0b20udHJpZ2dlcigicG9rZSIpOwot
ICAgICAgICBgYGAKLQotICAgICAgICBAbWV0aG9kIG1peGluCi0gICAgICAgIEBwYXJhbSB7T2Jq
ZWN0fSBvYmplY3Qgb2JqZWN0IHRvIGV4dGVuZCB3aXRoIEV2ZW50VGFyZ2V0IG1ldGhvZHMKLSAg
ICAgICAgQHByaXZhdGUKLSAgICAgICovCi0gICAgICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0KSB7
Ci0gICAgICAgIG9iamVjdC5vbiA9IHRoaXMub247Ci0gICAgICAgIG9iamVjdC5vZmYgPSB0aGlz
Lm9mZjsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIgPSB0aGlzLnRyaWdnZXI7Ci0gICAgICAgIG9i
amVjdC5fcHJvbWlzZUNhbGxiYWNrcyA9IHVuZGVmaW5lZDsKLSAgICAgICAgcmV0dXJuIG9iamVj
dDsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBSZWdpc3RlcnMgYSBjYWxsYmFjayB0
byBiZSBleGVjdXRlZCB3aGVuIGBldmVudE5hbWVgIGlzIHRyaWdnZXJlZAotCi0gICAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9uKCdldmVudCcsIGZ1bmN0aW9uKGV2ZW50SW5m
byl7Ci0gICAgICAgICAgLy8gaGFuZGxlIHRoZSBldmVudAotICAgICAgICB9KTsKLQotICAgICAg
ICBvYmplY3QudHJpZ2dlcignZXZlbnQnKTsKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhv
ZCBvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIG5hbWUgb2YgdGhlIGV2ZW50
IHRvIGxpc3RlbiBmb3IKLSAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rp
b24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KLSAgICAgICAgQHBy
aXZhdGUKLSAgICAgICovCi0gICAgICBvbjogZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykg
ewotICAgICAgICB2YXIgYWxsQ2FsbGJhY2tzID0gY2FsbGJhY2tzRm9yKHRoaXMpLCBjYWxsYmFj
a3M7Ci0KLSAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV07Ci0KLSAg
ICAgICAgaWYgKCFjYWxsYmFja3MpIHsKLSAgICAgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFj
a3NbZXZlbnROYW1lXSA9IFtdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4T2YoY2Fs
bGJhY2tzLCBjYWxsYmFjaykgPT09IC0xKSB7Ci0gICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2Fs
bGJhY2spOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgWW91IGNh
biB1c2UgYG9mZmAgdG8gc3RvcCBmaXJpbmcgYSBwYXJ0aWN1bGFyIGNhbGxiYWNrIGZvciBhbiBl
dmVudDoKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIGZ1bmN0aW9uIGRvU3R1ZmYo
KSB7IC8vIGRvIHN0dWZmISB9Ci0gICAgICAgIG9iamVjdC5vbignc3R1ZmYnLCBkb1N0dWZmKTsK
LQotICAgICAgICBvYmplY3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIGJlIGNh
bGxlZAotCi0gICAgICAgIC8vIFVucmVnaXN0ZXIgT05MWSB0aGUgZG9TdHVmZiBjYWxsYmFjawot
ICAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicsIGRvU3R1ZmYpOwotICAgICAgICBvYmplY3QudHJp
Z2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIE5PVCBiZSBjYWxsZWQKLSAgICAgICAgYGBg
Ci0KLSAgICAgICAgSWYgeW91IGRvbid0IHBhc3MgYSBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGBv
ZmZgLCBBTEwgY2FsbGJhY2tzIGZvciB0aGUKLSAgICAgICAgZXZlbnQgd2lsbCBub3QgYmUgZXhl
Y3V0ZWQgd2hlbiB0aGUgZXZlbnQgZmlyZXMuIEZvciBleGFtcGxlOgotCi0gICAgICAgIGBgYGph
dmFzY3JpcHQKLSAgICAgICAgdmFyIGNhbGxiYWNrMSA9IGZ1bmN0aW9uKCl7fTsKLSAgICAgICAg
dmFyIGNhbGxiYWNrMiA9IGZ1bmN0aW9uKCl7fTsKLQotICAgICAgICBvYmplY3Qub24oJ3N0dWZm
JywgY2FsbGJhY2sxKTsKLSAgICAgICAgb2JqZWN0Lm9uKCdzdHVmZicsIGNhbGxiYWNrMik7Ci0K
LSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJh
Y2syIHdpbGwgYmUgZXhlY3V0ZWQuCi0KLSAgICAgICAgb2JqZWN0Lm9mZignc3R1ZmYnKTsKLSAg
ICAgICAgb2JqZWN0LnRyaWdnZXIoJ3N0dWZmJyk7IC8vIGNhbGxiYWNrMSBhbmQgY2FsbGJhY2sy
IHdpbGwgbm90IGJlIGV4ZWN1dGVkIQotICAgICAgICBgYGAKLQotICAgICAgICBAbWV0aG9kIG9m
ZgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIGV2ZW50IHRvIHN0b3AgbGlzdGVu
aW5nIHRvCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGFyZ3Vt
ZW50LiBJZiBnaXZlbiwgb25seSB0aGUgZnVuY3Rpb24KLSAgICAgICAgZ2l2ZW4gd2lsbCBiZSBy
ZW1vdmVkIGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sgcXVldWUuIElmIG5vIGBjYWxsYmFja2AK
LSAgICAgICAgYXJndW1lbnQgaXMgZ2l2ZW4sIGFsbCBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVk
IGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sKLSAgICAgICAgcXVldWUuCi0gICAgICAgIEBwcml2
YXRlCi0KLSAgICAgICovCi0gICAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgY2FsbGJhY2sp
IHsKLSAgICAgICAgdmFyIGFsbENhbGxiYWNrcyA9IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJh
Y2tzLCBpbmRleDsKLQotICAgICAgICBpZiAoIWNhbGxiYWNrKSB7Ci0gICAgICAgICAgYWxsQ2Fs
bGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBjYWxsYmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXTsKLQotICAgICAgICBp
bmRleCA9IGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgaWYgKGluZGV4
ICE9PSAtMSkgeyBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTsgfQotICAgICAgfSwKLQotICAg
ICAgLyoqCi0gICAgICAgIFVzZSBgdHJpZ2dlcmAgdG8gZmlyZSBjdXN0b20gZXZlbnRzLiBGb3Ig
ZXhhbXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIG9iamVjdC5vbignZm9v
JywgZnVuY3Rpb24oKXsKLSAgICAgICAgICBjb25zb2xlLmxvZygnZm9vIGV2ZW50IGhhcHBlbmVk
IScpOwotICAgICAgICB9KTsKLSAgICAgICAgb2JqZWN0LnRyaWdnZXIoJ2ZvbycpOwotICAgICAg
ICAvLyAnZm9vIGV2ZW50IGhhcHBlbmVkIScgbG9nZ2VkIHRvIHRoZSBjb25zb2xlCi0gICAgICAg
IGBgYAotCi0gICAgICAgIFlvdSBjYW4gYWxzbyBwYXNzIGEgdmFsdWUgYXMgYSBzZWNvbmQgYXJn
dW1lbnQgdG8gYHRyaWdnZXJgIHRoYXQgd2lsbCBiZQotICAgICAgICBwYXNzZWQgYXMgYW4gYXJn
dW1lbnQgdG8gYWxsIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50OgotCi0gICAgICAgIGBg
YGphdmFzY3JpcHQKLSAgICAgICAgb2JqZWN0Lm9uKCdmb28nLCBmdW5jdGlvbih2YWx1ZSl7Ci0g
ICAgICAgICAgY29uc29sZS5sb2codmFsdWUubmFtZSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAg
IG9iamVjdC50cmlnZ2VyKCdmb28nLCB7IG5hbWU6ICdiYXInIH0pOwotICAgICAgICAvLyAnYmFy
JyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCB0
cmlnZ2VyCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgbmFtZSBvZiB0aGUgZXZl
bnQgdG8gYmUgdHJpZ2dlcmVkCi0gICAgICAgIEBwYXJhbSB7QW55fSBvcHRpb25zIG9wdGlvbmFs
IHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbnkgZXZlbnQgaGFuZGxlcnMgZm9yCi0gICAgICAgIHRo
ZSBnaXZlbiBgZXZlbnROYW1lYAotICAgICAgICBAcHJpdmF0ZQotICAgICAgKi8KLSAgICAgIHRy
aWdnZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgb3B0aW9ucykgewotICAgICAgICB2YXIgYWxsQ2Fs
bGJhY2tzID0gY2FsbGJhY2tzRm9yKHRoaXMpLAotICAgICAgICAgICAgY2FsbGJhY2tzLCBjYWxs
YmFja1R1cGxlLCBjYWxsYmFjaywgYmluZGluZzsKLQotICAgICAgICBpZiAoY2FsbGJhY2tzID0g
YWxsQ2FsbGJhY2tzW2V2ZW50TmFtZV0pIHsKLSAgICAgICAgICAvLyBEb24ndCBjYWNoZSB0aGUg
Y2FsbGJhY2tzLmxlbmd0aCBzaW5jZSBpdCBtYXkgZ3JvdwotICAgICAgICAgIGZvciAodmFyIGk9
MDsgaTxjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNhbGxiYWNrID0gY2Fs
bGJhY2tzW2ldOwotCi0gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTsKLSAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9maWx0ZXIi
LCAKLSAgWyIuL2FsbCIsIi4vbWFwIiwiLi91dGlscyIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24o
X19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19leHBv
cnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTFf
X1siZGVmYXVsdCJdOwotICAgIHZhciBtYXAgPSBfX2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsK
LSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5kZW5jeTNfXy5pc0Z1bmN0aW9uOwotICAgIHZh
ciBpc0FycmF5ID0gX19kZXBlbmRlbmN5M19fLmlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgYFJT
VlAuZmlsdGVyYCBpcyBzaW1pbGFyIHRvIEphdmFTY3JpcHQncyBuYXRpdmUgYGZpbHRlcmAgbWV0
aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAgd2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBiZWNv
bWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRoZSBgZmlsdGVyRm5gIG9uCi0gICAgICBlYWNo
IGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAuZmlsdGVyYCByZXR1cm5zIGEgcHJv
bWlzZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9m
IHJ1bm5pbmcgYGZpbHRlckZuYCBvbiB0aGUgdmFsdWVzIHRoZQotICAgICAgcHJvbWlzZXMgYmVj
b21lIGZ1bGZpbGxlZCB3aXRoLgotCi0gICAgICBGb3IgZXhhbXBsZToKLQotICAgICAgYGBgamF2
YXNjcmlwdAotCi0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2
YXIgcHJvbWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQ
LnJlc29sdmUoMyk7Ci0KLSAgICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0aW9uKGl0ZW0pewotICAg
ICAgICByZXR1cm4gaXRlbSA+IDE7Ci0gICAgICB9OwotCi0gICAgICBSU1ZQLmZpbHRlcihwcm9t
aXNlcywgZmlsdGVyRm4pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICAgLy8gcmVzdWx0
IGlzIFsgMiwgMyBdCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhl
IGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuZmlsdGVyYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJz
dCBwcm9taXNlCi0gICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJn
dW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2UncwotICAgICAgcmVqZWN0aW9uIGhhbmRsZXIu
IEZvciBleGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZTEg
PSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJvbWlzZTIgPSBSU1ZQLnJlamVjdChuZXcg
RXJyb3IoIjIiKSk7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlamVjdChuZXcgRXJyb3Io
IjMiKSk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlz
ZTMgXTsKLQotICAgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24oaXRlbSl7Ci0gICAgICAgIHJl
dHVybiBpdGVtID4gMTsKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBm
aWx0ZXJGbikudGhlbihmdW5jdGlvbihhcnJheSl7Ci0gICAgICAgIC8vIENvZGUgaGVyZSBuZXZl
ciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIQotICAgICAgfSwgZnVu
Y3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAiMiIKLSAgICAg
IH0pOwotICAgICAgYGBgCi0KLSAgICAgIGBSU1ZQLmZpbHRlcmAgd2lsbCBhbHNvIHdhaXQgZm9y
IGFueSBwcm9taXNlcyByZXR1cm5lZCBmcm9tIGBmaWx0ZXJGbmAuCi0gICAgICBGb3IgaW5zdGFu
Y2UsIHlvdSBtYXkgd2FudCB0byBmZXRjaCBhIGxpc3Qgb2YgdXNlcnMgdGhlbiByZXR1cm4gYSBz
dWJzZXQKLSAgICAgIG9mIHRob3NlIHVzZXJzIGJhc2VkIG9uIHNvbWUgYXN5bmNocm9ub3VzIG9w
ZXJhdGlvbjoKLQotICAgICAgYGBgamF2YXNjcmlwdAotCi0gICAgICB2YXIgYWxpY2UgPSB7IG5h
bWU6ICdhbGljZScgfTsKLSAgICAgIHZhciBib2IgICA9IHsgbmFtZTogJ2JvYicgfTsKLSAgICAg
IHZhciB1c2VycyA9IFsgYWxpY2UsIGJvYiBdOwotCi0gICAgICB2YXIgcHJvbWlzZXMgPSB1c2Vy
cy5tYXAoZnVuY3Rpb24odXNlcil7Ci0gICAgICAgIHJldHVybiBSU1ZQLnJlc29sdmUodXNlcik7
Ci0gICAgICB9KTsKLQotICAgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24odXNlcil7Ci0gICAg
ICAgIC8vIEhlcmUsIEFsaWNlIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYSBibG9nIHBvc3Qs
IGJ1dCBCb2IgZG9lcyBub3QuCi0gICAgICAgIHJldHVybiBnZXRQcml2aWxlZ2VzRm9yVXNlcih1
c2VyKS50aGVuKGZ1bmN0aW9uKHByaXZzKXsKLSAgICAgICAgICByZXR1cm4gcHJpdnMuY2FuX2Ny
ZWF0ZV9ibG9nX3Bvc3QgPT09IHRydWU7Ci0gICAgICAgIH0pOwotICAgICAgfTsKLSAgICAgIFJT
VlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbikudGhlbihmdW5jdGlvbih1c2Vycyl7Ci0gICAg
ICAgIC8vIHRydWUsIGJlY2F1c2UgdGhlIHNlcnZlciB0b2xkIHVzIG9ubHkgQWxpY2UgY2FuIGNy
ZWF0ZSBhIGJsb2cgcG9zdC4KLSAgICAgICAgdXNlcnMubGVuZ3RoID09PSAxOwotICAgICAgICAv
LyBmYWxzZSwgYmVjYXVzZSBBbGljZSBpcyB0aGUgb25seSB1c2VyIHByZXNlbnQgaW4gYHVzZXJz
YAotICAgICAgICB1c2Vyc1swXSA9PT0gYm9iOwotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAg
ICAgQG1ldGhvZCBmaWx0ZXIKLSAgICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBcnJheX0g
cHJvbWlzZXMKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlckZuIC0gZnVuY3Rpb24gdG8g
YmUgY2FsbGVkIG9uIGVhY2ggcmVzb2x2ZWQgdmFsdWUgdG8KLSAgICAgIGZpbHRlciB0aGUgZmlu
YWwgcmVzdWx0cy4KLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
ZGVzY3JpYmluZyB0aGUgcHJvbWlzZS4gVXNlZnVsIGZvcgotICAgICAgdG9vbGluZy4KLSAgICAg
IEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICBmdW5jdGlvbiBmaWx0ZXIocHJvbWlzZXMs
IGZpbHRlckZuLCBsYWJlbCkgewotICAgICAgcmV0dXJuIGFsbChwcm9taXNlcywgbGFiZWwpLnRo
ZW4oZnVuY3Rpb24odmFsdWVzKXsKLSAgICAgICAgaWYgKCFpc0FycmF5KHByb21pc2VzKSkgewot
ICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8g
ZmlsdGVyLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZpbHRlckZu
KSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1bmN0
aW9uIHRvIGZpbHRlcidzIHNlY29uZCBhcmd1bWVudC4iKTsKLSAgICAgICAgfQotCi0gICAgICAg
IHJldHVybiBtYXAocHJvbWlzZXMsIGZpbHRlckZuLCBsYWJlbCkudGhlbihmdW5jdGlvbihmaWx0
ZXJSZXN1bHRzKXsKLSAgICAgICAgICAgdmFyIGksCi0gICAgICAgICAgICAgICB2YWx1ZXNMZW4g
PSB2YWx1ZXMubGVuZ3RoLAotICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBbXTsKLQotICAgICAg
ICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzTGVuOyBpKyspewotICAgICAgICAgICAgIGlmKGZp
bHRlclJlc3VsdHNbaV0pIGZpbHRlcmVkLnB1c2godmFsdWVzW2ldKTsKLSAgICAgICAgICAgfQot
ICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7Ci0gICAgICAgIH0pOwotICAgICAgfSk7Ci0gICAg
fQotCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZpbHRlcjsKLSAgfSk7Ci1kZWZpbmUo
InJzdnAvaGFzaCIsIAotICBbIi4vcHJvbWlzZSIsIi4vdXRpbHMiLCJleHBvcnRzIl0sCi0gIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVm
YXVsdCJdOwotICAgIHZhciBpc05vblRoZW5hYmxlID0gX19kZXBlbmRlbmN5Ml9fLmlzTm9uVGhl
bmFibGU7Ci0gICAgdmFyIGtleXNPZiA9IF9fZGVwZW5kZW5jeTJfXy5rZXlzT2Y7Ci0KLSAgICAv
KioKLSAgICAgIGBSU1ZQLmhhc2hgIGlzIHNpbWlsYXIgdG8gYFJTVlAuYWxsYCwgYnV0IHRha2Vz
IGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5Ci0gICAgICBmb3IgaXRzIGBwcm9taXNlc2Ag
YXJndW1lbnQuCi0KLSAgICAgIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdo
ZW4gYWxsIHRoZSBnaXZlbiBwcm9taXNlcyBoYXZlIGJlZW4KLSAgICAgIGZ1bGZpbGxlZCwgb3Ig
cmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLiBUaGUgcmV0dXJuZWQgcHJv
bWlzZQotICAgICAgaXMgZnVsZmlsbGVkIHdpdGggYSBoYXNoIHRoYXQgaGFzIHRoZSBzYW1lIGtl
eSBuYW1lcyBhcyB0aGUgYHByb21pc2VzYCBvYmplY3QKLSAgICAgIGFyZ3VtZW50LiBJZiBhbnkg
b2YgdGhlIHZhbHVlcyBpbiB0aGUgb2JqZWN0IGFyZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAot
ICAgICAgc2ltcGx5IGJlIGNvcGllZCBvdmVyIHRvIHRoZSBmdWxmaWxsZWQgb2JqZWN0LgotCi0g
ICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJvbWlzZXMg
PSB7Ci0gICAgICAgIG15UHJvbWlzZTogUlNWUC5yZXNvbHZlKDEpLAotICAgICAgICB5b3VyUHJv
bWlzZTogUlNWUC5yZXNvbHZlKDIpLAotICAgICAgICB0aGVpclByb21pc2U6IFJTVlAucmVzb2x2
ZSgzKSwKLSAgICAgICAgbm90QVByb21pc2U6IDQKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAuaGFz
aChwcm9taXNlcykudGhlbihmdW5jdGlvbihoYXNoKXsKLSAgICAgICAgLy8gaGFzaCBoZXJlIGlz
IGFuIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6Ci0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gICBt
eVByb21pc2U6IDEsCi0gICAgICAgIC8vICAgeW91clByb21pc2U6IDIsCi0gICAgICAgIC8vICAg
dGhlaXJQcm9taXNlOiAzLAotICAgICAgICAvLyAgIG5vdEFQcm9taXNlOiA0Ci0gICAgICAgIC8v
IH0KLSAgICAgIH0pOwotICAgICAgYGBgYAotCi0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNl
c2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZQot
ICAgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJlIGdpdmVuIGFzIHRoZSByZWFzb24gdG8gdGhl
IHJlamVjdGlvbiBoYW5kbGVyLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICB2YXIgcHJvbWlzZXMgPSB7Ci0gICAgICAgIG15UHJvbWlzZTogUlNWUC5yZXNv
bHZlKDEpLAotICAgICAgICByZWplY3RlZFByb21pc2U6IFJTVlAucmVqZWN0KG5ldyBFcnJvcigi
cmVqZWN0ZWRQcm9taXNlIikpLAotICAgICAgICBhbm90aGVyUmVqZWN0ZWRQcm9taXNlOiBSU1ZQ
LnJlamVjdChuZXcgRXJyb3IoImFub3RoZXJSZWplY3RlZFByb21pc2UiKSksCi0gICAgICB9Owot
Ci0gICAgICBSU1ZQLmhhc2gocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oaGFzaCl7Ci0gICAgICAg
IC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21p
c2VzIQotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNz
YWdlID09PSAicmVqZWN0ZWRQcm9taXNlIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
QW4gaW1wb3J0YW50IG5vdGU6IGBSU1ZQLmhhc2hgIGlzIGludGVuZGVkIGZvciBwbGFpbiBKYXZh
U2NyaXB0IG9iamVjdHMgdGhhdAotICAgICAgYXJlIGp1c3QgYSBzZXQgb2Yga2V5cyBhbmQgdmFs
dWVzLiBgUlNWUC5oYXNoYCB3aWxsIE5PVCBwcmVzZXJ2ZSBwcm90b3R5cGUKLSAgICAgIGNoYWlu
cy4KLQotICAgICAgRXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgZnVuY3Rp
b24gTXlDb25zdHJ1Y3RvcigpewotICAgICAgICB0aGlzLmV4YW1wbGUgPSBSU1ZQLnJlc29sdmUo
IkV4YW1wbGUiKTsKLSAgICAgIH0KLQotICAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSB7
Ci0gICAgICAgIHByb3RvUHJvcGVydHk6IFJTVlAucmVzb2x2ZSgiUHJvdG8gUHJvcGVydHkiKQot
ICAgICAgfTsKLQotICAgICAgdmFyIG15T2JqZWN0ID0gbmV3IE15Q29uc3RydWN0b3IoKTsKLQot
ICAgICAgUlNWUC5oYXNoKG15T2JqZWN0KS50aGVuKGZ1bmN0aW9uKGhhc2gpewotICAgICAgICAv
LyBwcm90b1Byb3BlcnR5IHdpbGwgbm90IGJlIHByZXNlbnQsIGluc3RlYWQgeW91IHdpbGwganVz
dCBoYXZlIGFuCi0gICAgICAgIC8vIG9iamVjdCB0aGF0IGxvb2tzIGxpa2U6Ci0gICAgICAgIC8v
IHsKLSAgICAgICAgLy8gICBleGFtcGxlOiAiRXhhbXBsZSIKLSAgICAgICAgLy8gfQotICAgICAg
ICAvLwotICAgICAgICAvLyBoYXNoLmhhc093blByb3BlcnR5KCdwcm90b1Byb3BlcnR5Jyk7IC8v
IGZhbHNlCi0gICAgICAgIC8vICd1bmRlZmluZWQnID09PSB0eXBlb2YgaGFzaC5wcm90b1Byb3Bl
cnR5Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBAbWV0aG9kIGhhc2gKLSAgICAgIEBm
b3IgUlNWUAotICAgICAgQHBhcmFtIHtPYmplY3R9IHByb21pc2VzCi0gICAgICBAcGFyYW0ge1N0
cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9taXNlLgot
ICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlz
ZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBwcm9wZXJ0aWVzIG9mIGBwcm9taXNlc2AKLSAg
ICAgIGhhdmUgYmVlbiBmdWxmaWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29t
ZSByZWplY3RlZC4KLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZh
dWx0Il0gPSBmdW5jdGlvbiBoYXNoKG9iamVjdCwgbGFiZWwpIHsKLSAgICAgIHJldHVybiBuZXcg
UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICB2YXIgcmVzdWx0cyA9
IHt9OwotICAgICAgICB2YXIga2V5cyA9IGtleXNPZihvYmplY3QpOwotICAgICAgICB2YXIgcmVt
YWluaW5nID0ga2V5cy5sZW5ndGg7Ci0gICAgICAgIHZhciBlbnRyeSwgcHJvcGVydHk7Ci0KLSAg
ICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7
Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICBmdW5jdGlvbiBmdWxmaWxs
ZWRUbyhwcm9wZXJ0eSkgewotICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewotICAg
ICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIGlmICgtLXJl
bWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBvblJl
amVjdGlvbihyZWFzb24pIHsKLSAgICAgICAgICByZW1haW5pbmcgPSAwOwotICAgICAgICAgIHJl
amVjdChyZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBr
ZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgcHJvcGVydHkgPSBrZXlzW2ldOwotICAgICAg
ICAgIGVudHJ5ID0gb2JqZWN0W3Byb3BlcnR5XTsKLQotICAgICAgICAgIGlmIChpc05vblRoZW5h
YmxlKGVudHJ5KSkgewotICAgICAgICAgICAgcmVzdWx0c1twcm9wZXJ0eV0gPSBlbnRyeTsKLSAg
ICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZl
KHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkVG8ocHJvcGVydHkpLCBvblJlamVj
dGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9OwotICB9KTsK
LWRlZmluZSgicnN2cC9pbnN0cnVtZW50IiwgCi0gIFsiLi9jb25maWciLCIuL3V0aWxzIiwiZXhw
b3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19l
eHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIGNvbmZpZyA9IF9fZGVwZW5k
ZW5jeTFfXy5jb25maWc7Ci0gICAgdmFyIG5vdyA9IF9fZGVwZW5kZW5jeTJfXy5ub3c7Ci0KLSAg
ICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gaW5zdHJ1bWVudChldmVudE5hbWUs
IHByb21pc2UsIGNoaWxkKSB7Ci0gICAgICAvLyBpbnN0cnVtZW50YXRpb24gc2hvdWxkIG5vdCBk
aXNydXB0IG5vcm1hbCB1c2FnZS4KLSAgICAgIHRyeSB7Ci0gICAgICAgIGNvbmZpZy50cmlnZ2Vy
KGV2ZW50TmFtZSwgewotICAgICAgICAgIGd1aWQ6IHByb21pc2UuX2d1aWRLZXkgKyBwcm9taXNl
Ll9pZCwKLSAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKLSAgICAgICAgICBkZXRhaWw6
IHByb21pc2UuX2RldGFpbCwKLSAgICAgICAgICBjaGlsZEd1aWQ6IGNoaWxkICYmIHByb21pc2Uu
X2d1aWRLZXkgKyBjaGlsZC5faWQsCi0gICAgICAgICAgbGFiZWw6IHByb21pc2UuX2xhYmVsLAot
ICAgICAgICAgIHRpbWVTdGFtcDogbm93KCksCi0gICAgICAgICAgc3RhY2s6IG5ldyBFcnJvcihw
cm9taXNlLl9sYWJlbCkuc3RhY2sKLSAgICAgICAgfSk7Ci0gICAgICB9IGNhdGNoKGVycm9yKSB7
Ci0gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICB0aHJvdyBlcnJvcjsK
LSAgICAgICAgfSwgMCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvbWFw
IiwgCi0gIFsiLi9wcm9taXNlIiwiLi9hbGwiLCIuL3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5j
dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBf
X2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVw
ZW5kZW5jeTFfX1siZGVmYXVsdCJdOwotICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3kyX19bImRl
ZmF1bHQiXTsKLSAgICB2YXIgaXNBcnJheSA9IF9fZGVwZW5kZW5jeTNfXy5pc0FycmF5OwotICAg
IHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5M19fLmlzRnVuY3Rpb247Ci0KLSAgICAvKioK
LSAgICAgYFJTVlAubWFwYCBpcyBzaW1pbGFyIHRvIEphdmFTY3JpcHQncyBuYXRpdmUgYG1hcGAg
bWV0aG9kLCBleGNlcHQgdGhhdCBpdAotICAgICAgd2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0byBi
ZWNvbWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRoZSBgbWFwRm5gIG9uCi0gICAgICBlYWNo
IGl0ZW0gaW4gZ2l2ZW4gdG8gYHByb21pc2VzYC4gYFJTVlAubWFwYCByZXR1cm5zIGEgcHJvbWlz
ZSB0aGF0IHdpbGwKLSAgICAgIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1
bm5pbmcgYG1hcEZuYCBvbiB0aGUgdmFsdWVzIHRoZSBwcm9taXNlcwotICAgICAgYmVjb21lIGZ1
bGZpbGxlZCB3aXRoLgotCi0gICAgICBGb3IgZXhhbXBsZToKLQotICAgICAgYGBgamF2YXNjcmlw
dAotCi0gICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7Ci0gICAgICB2YXIgcHJv
bWlzZTIgPSBSU1ZQLnJlc29sdmUoMik7Ci0gICAgICB2YXIgcHJvbWlzZTMgPSBSU1ZQLnJlc29s
dmUoMyk7Ci0gICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlz
ZTMgXTsKLQotICAgICAgdmFyIG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7Ci0gICAgICAgIHJldHVy
biBpdGVtICsgMTsKLSAgICAgIH07Ci0KLSAgICAgIFJTVlAubWFwKHByb21pc2VzLCBtYXBGbiku
dGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyByZXN1bHQgaXMgWyAyLCAzLCA0IF0K
LSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBn
aXZlbiB0byBgUlNWUC5tYXBgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0IHByb21pc2UKLSAgICAg
IHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0
dXJuZWQgcHJvbWlzZSdzCi0gICAgICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgx
KTsKLSAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigiMiIpKTsKLSAg
ICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigiMyIpKTsKLSAgICAgIHZh
ciBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0gICAgICB2
YXIgbWFwRm4gPSBmdW5jdGlvbihpdGVtKXsKLSAgICAgICAgcmV0dXJuIGl0ZW0gKyAxOwotICAg
ICAgfTsKLQotICAgICAgUlNWUC5tYXAocHJvbWlzZXMsIG1hcEZuKS50aGVuKGZ1bmN0aW9uKGFy
cmF5KXsKLSAgICAgICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUg
cmVqZWN0ZWQgcHJvbWlzZXMhCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAg
Ly8gcmVhc29uLm1lc3NhZ2UgPT09ICIyIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
YFJTVlAubWFwYCB3aWxsIGFsc28gd2FpdCBpZiBhIHByb21pc2UgaXMgcmV0dXJuZWQgZnJvbSBg
bWFwRm5gLiBGb3IgZXhhbXBsZSwKLSAgICAgIHNheSB5b3Ugd2FudCB0byBnZXQgYWxsIGNvbW1l
bnRzIGZyb20gYSBzZXQgb2YgYmxvZyBwb3N0cywgYnV0IHlvdSBuZWVkCi0gICAgICB0aGUgYmxv
ZyBwb3N0cyBmaXJzdCBiZWN1YXNlIHRoZXkgY29udGFpbiBhIHVybCB0byB0aG9zZSBjb21tZW50
cy4KLQotICAgICAgYGBgamF2c2NyaXB0Ci0KLSAgICAgIHZhciBtYXBGbiA9IGZ1bmN0aW9uKGJs
b2dQb3N0KXsKLSAgICAgICAgLy8gZ2V0Q29tbWVudHMgZG9lcyBzb21lIGFqYXggYW5kIHJldHVy
bnMgYW4gUlNWUC5Qcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkCi0gICAgICAgIC8vIHdpdGggc29t
ZSBjb21tZW50cyBkYXRhCi0gICAgICAgIHJldHVybiBnZXRDb21tZW50cyhibG9nUG9zdC5jb21t
ZW50c191cmwpOwotICAgICAgfTsKLQotICAgICAgLy8gZ2V0QmxvZ1Bvc3RzIGRvZXMgc29tZSBh
amF4IGFuZCByZXR1cm5zIGFuIFJTVlAuUHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZAotICAgICAg
Ly8gd2l0aCBzb21lIGJsb2cgcG9zdCBkYXRhCi0gICAgICBSU1ZQLm1hcChnZXRCbG9nUG9zdHMo
KSwgbWFwRm4pLnRoZW4oZnVuY3Rpb24oY29tbWVudHMpewotICAgICAgICAvLyBjb21tZW50cyBp
cyB0aGUgcmVzdWx0IG9mIGFza2luZyB0aGUgc2VydmVyIGZvciB0aGUgY29tbWVudHMKLSAgICAg
ICAgLy8gb2YgYWxsIGJsb2cgcG9zdHMgcmV0dXJuZWQgZnJvbSBnZXRCbG9nUG9zdHMoKQotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBtYXAKLSAgICAgIEBmb3IgUlNWUAot
ICAgICAgQHBhcmFtIHtBcnJheX0gcHJvbWlzZXMKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG1h
cEZuIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIGZ1bGZpbGxlZCBwcm9taXNlLgotICAg
ICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhl
IHByb21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9t
aXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBjYWxsaW5n
Ci0gICAgICBgbWFwRm5gIG9uIGVhY2ggZnVsZmlsbGVkIHByb21pc2Ugb3IgdmFsdWUgd2hlbiB0
aGV5IGJlY29tZSBmdWxmaWxsZWQuCi0gICAgICAgVGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3Rl
ZCBpZiBhbnkgb2YgdGhlIGdpdmVuIGBwcm9taXNlc2AgYmVjb21lIHJlamVjdGVkLgotICAgICAg
QHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIG1h
cChwcm9taXNlcywgbWFwRm4sIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gYWxsKHByb21pc2VzLCBs
YWJlbCkudGhlbihmdW5jdGlvbihyZXN1bHRzKXsKLSAgICAgICAgaWYgKCFpc0FycmF5KHByb21p
c2VzKSkgewotICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4g
YXJyYXkgdG8gbWFwLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKG1h
cEZuKSl7Ci0gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1
bmN0aW9uIHRvIG1hcCdzIHNlY29uZCBhcmd1bWVudC4iKTsKLSAgICAgICAgfQotCi0KLSAgICAg
ICAgdmFyIHJlc3VsdExlbiA9IHJlc3VsdHMubGVuZ3RoLAotICAgICAgICAgICAgbWFwcGVkUmVz
dWx0cyA9IFtdLAotICAgICAgICAgICAgaTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVz
dWx0TGVuOyBpKyspewotICAgICAgICAgIG1hcHBlZFJlc3VsdHMucHVzaChtYXBGbihyZXN1bHRz
W2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWxsKG1hcHBlZFJlc3VsdHMsIGxh
YmVsKTsKLSAgICAgIH0pOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL25vZGUiLCAKLSAg
WyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19l
eHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVu
ZGVuY3kxX19bImRlZmF1bHQiXTsKLQotICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5z
bGljZTsKLQotICAgIGZ1bmN0aW9uIG1ha2VOb2RlQ2FsbGJhY2tGb3IocmVzb2x2ZSwgcmVqZWN0
KSB7Ci0gICAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCB2YWx1ZSkgewotICAgICAgICBpZiAo
ZXJyb3IpIHsKLSAgICAgICAgICByZWplY3QoZXJyb3IpOwotICAgICAgICB9IGVsc2UgaWYgKGFy
Z3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgcmVzb2x2ZShzbGljZS5jYWxsKGFyZ3Vt
ZW50cywgMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc29sdmUodmFsdWUpOwot
ICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAgYFJTVlAuZGVub2Rl
aWZ5YCB0YWtlcyBhICJub2RlLXN0eWxlIiBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIGZ1bmN0aW9u
IHRoYXQKLSAgICAgIHdpbGwgcmV0dXJuIGFuIGBSU1ZQLlByb21pc2VgLiBZb3UgY2FuIHVzZSBg
ZGVub2RlaWZ5YCBpbiBOb2RlLmpzIG9yIHRoZQotICAgICAgYnJvd3NlciB3aGVuIHlvdSdkIHBy
ZWZlciB0byB1c2UgcHJvbWlzZXMgb3ZlciB1c2luZyBjYWxsYmFja3MuIEZvciBleGFtcGxlLAot
ICAgICAgYGRlbm9kZWlmeWAgdHJhbnNmb3JtcyB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpOwotCi0gICAgICBmcy5yZWFk
RmlsZSgnbXlmaWxlLnR4dCcsIGZ1bmN0aW9uKGVyciwgZGF0YSl7Ci0gICAgICAgIGlmIChlcnIp
IHJldHVybiBoYW5kbGVFcnJvcihlcnIpOwotICAgICAgICBoYW5kbGVEYXRhKGRhdGEpOwotICAg
ICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgaW50bzoKLQotICAgICAgYGBgamF2YXNjcmlwdAot
ICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKLQotICAgICAgdmFyIHJlYWRGaWxlID0gUlNW
UC5kZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotCi0gICAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcp
LnRoZW4oaGFuZGxlRGF0YSwgaGFuZGxlRXJyb3IpOwotICAgICAgYGBgCi0KLSAgICAgIFVzaW5n
IGBkZW5vZGVpZnlgIG1ha2VzIGl0IGVhc2llciB0byBjb21wb3NlIGFzeW5jaHJvbm91cyBvcGVy
YXRpb25zIGluc3RlYWQKLSAgICAgIG9mIHVzaW5nIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIGlu
c3RlYWQgb2Y6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBmcyA9IHJlcXVpcmUo
J2ZzJyk7Ci0gICAgICB2YXIgbG9nID0gcmVxdWlyZSgnc29tZS1hc3luYy1sb2dnZXInKTsKLQot
ICAgICAgZnMucmVhZEZpbGUoJ215ZmlsZS50eHQnLCBmdW5jdGlvbihlcnIsIGRhdGEpewotICAg
ICAgICBpZiAoZXJyKSByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgICAgZnMud3JpdGVG
aWxlKCdteWZpbGUyLnR4dCcsIGRhdGEsIGZ1bmN0aW9uKGVycil7Ci0gICAgICAgICAgaWYgKGVy
cikgdGhyb3cgZXJyOwotICAgICAgICAgIGxvZygnc3VjY2VzcycsIGZ1bmN0aW9uKGVycikgewot
ICAgICAgICAgICAgaWYgKGVycikgdGhyb3cgZXJyOwotICAgICAgICAgIH0pOwotICAgICAgICB9
KTsKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIFlvdSBjYW4gY2hhaW4gdGhlIG9wZXJh
dGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20gdGhlIHJldHVybmVkIHByb21pc2U6Ci0K
LSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci0gICAg
ICB2YXIgZGVub2RlaWZ5ID0gUlNWUC5kZW5vZGVpZnk7Ci0gICAgICB2YXIgcmVhZEZpbGUgPSBk
ZW5vZGVpZnkoZnMucmVhZEZpbGUpOwotICAgICAgdmFyIHdyaXRlRmlsZSA9IGRlbm9kZWlmeShm
cy53cml0ZUZpbGUpOwotICAgICAgdmFyIGxvZyA9IGRlbm9kZWlmeShyZXF1aXJlKCdzb21lLWFz
eW5jLWxvZ2dlcicpKTsKLQotICAgICAgcmVhZEZpbGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0
aW9uKGRhdGEpewotICAgICAgICByZXR1cm4gd3JpdGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEp
OwotICAgICAgfSkudGhlbihmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gbG9nKCdTVUNDRVNT
Jyk7Ci0gICAgICB9KS50aGVuKGZ1bmN0aW9uKCl7Ci0gICAgICAgIC8vIHN1Y2Nlc3MgaGFuZGxl
cgotICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gcmVqZWN0aW9uIGhhbmRs
ZXIKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgZGVub2RlaWZ5Ci0gICAg
ICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG5vZGVGdW5jIGEgIm5vZGUtc3R5
bGUiIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjYWxsYmFjayBhcwotICAgICAgaXRzIGxhc3QgYXJn
dW1lbnQuIFRoZSBjYWxsYmFjayBleHBlY3RzIGFuIGVycm9yIHRvIGJlIHBhc3NlZCBhcyBpdHMg
Zmlyc3QKLSAgICAgIGFyZ3VtZW50IChpZiBhbiBlcnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIG51
bGwpLCBhbmQgdGhlIHZhbHVlIGZyb20gdGhlCi0gICAgICBvcGVyYXRpb24gYXMgaXRzIHNlY29u
ZCBhcmd1bWVudCAoImZ1bmN0aW9uKGVyciwgdmFsdWUpeyB9IikuCi0gICAgICBAcGFyYW0ge0Fu
eX0gYmluZGluZyBvcHRpb25hbCBhcmd1bWVudCBmb3IgYmluZGluZyB0aGUgInRoaXMiIHZhbHVl
IHdoZW4KLSAgICAgIGNhbGxpbmcgdGhlIGBub2RlRnVuY2AgZnVuY3Rpb24uCi0gICAgICBAcmV0
dXJuIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBub2RlRnVuY2AgdG8gcmV0dXJu
IGFuCi0gICAgICBgUlNWUC5Qcm9taXNlYAotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19l
eHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGRlbm9kZWlmeShub2RlRnVuYywgYmluZGlu
ZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgIHsKLSAgICAgICAgdmFyIG5vZGVBcmdzID0g
c2xpY2UuY2FsbChhcmd1bWVudHMpLCByZXNvbHZlLCByZWplY3Q7Ci0gICAgICAgIHZhciB0aGlz
QXJnID0gdGhpcyB8fCBiaW5kaW5nOwotCi0gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5j
dGlvbihyZXNvbHZlLCByZWplY3QpIHsKLSAgICAgICAgICBQcm9taXNlLmFsbChub2RlQXJncyku
dGhlbihmdW5jdGlvbihub2RlQXJncykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAg
ICAgbm9kZUFyZ3MucHVzaChtYWtlTm9kZUNhbGxiYWNrRm9yKHJlc29sdmUsIHJlamVjdCkpOwot
ICAgICAgICAgICAgICBub2RlRnVuYy5hcHBseSh0aGlzQXJnLCBub2RlQXJncyk7Ci0gICAgICAg
ICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICAgICAgcmVqZWN0KGUpOwotICAgICAgICAgICAg
fQotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH07Ci0gICAgfTsKLSAgfSk7Ci1k
ZWZpbmUoInJzdnAvcHJvbWlzZSIsIAotICBbIi4vY29uZmlnIiwiLi9ldmVudHMiLCIuL2luc3Ry
dW1lbnQiLCIuL3V0aWxzIiwiLi9wcm9taXNlL2Nhc3QiLCIuL3Byb21pc2UvYWxsIiwiLi9wcm9t
aXNlL3JhY2UiLCIuL3Byb21pc2UvcmVzb2x2ZSIsIi4vcHJvbWlzZS9yZWplY3QiLCJleHBvcnRz
Il0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVu
ZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2
X18sIF9fZGVwZW5kZW5jeTdfXywgX19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9f
ZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBjb25maWcgPSBfX2RlcGVu
ZGVuY3kxX18uY29uZmlnOwotICAgIHZhciBFdmVudFRhcmdldCA9IF9fZGVwZW5kZW5jeTJfX1si
ZGVmYXVsdCJdOwotICAgIHZhciBpbnN0cnVtZW50ID0gX19kZXBlbmRlbmN5M19fWyJkZWZhdWx0
Il07Ci0gICAgdmFyIG9iamVjdE9yRnVuY3Rpb24gPSBfX2RlcGVuZGVuY3k0X18ub2JqZWN0T3JG
dW5jdGlvbjsKLSAgICB2YXIgaXNGdW5jdGlvbiA9IF9fZGVwZW5kZW5jeTRfXy5pc0Z1bmN0aW9u
OwotICAgIHZhciBub3cgPSBfX2RlcGVuZGVuY3k0X18ubm93OwotICAgIHZhciBjYXN0ID0gX19k
ZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTZfX1si
ZGVmYXVsdCJdOwotICAgIHZhciByYWNlID0gX19kZXBlbmRlbmN5N19fWyJkZWZhdWx0Il07Ci0g
ICAgdmFyIFJlc29sdmUgPSBfX2RlcGVuZGVuY3k4X19bImRlZmF1bHQiXTsKLSAgICB2YXIgUmVq
ZWN0ID0gX19kZXBlbmRlbmN5OV9fWyJkZWZhdWx0Il07Ci0KLSAgICB2YXIgZ3VpZEtleSA9ICdy
c3ZwXycgKyBub3coKSArICctJzsKLSAgICB2YXIgY291bnRlciA9IDA7Ci0KLSAgICBmdW5jdGlv
biBub29wKCkge30KLQotICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBQcm9taXNlOwotCi0K
LSAgICAvKioKLSAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJl
c3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGUKLSAgICAgIHByaW1hcnkgd2F5
IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRo
b2QsIHdoaWNoCi0gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEg
cHJvbWlzZeKAmXMgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvbgotICAgICAgd2h5IHRoZSBw
cm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuCi0KLSAgICAgIFRlcm1pbm9sb2d5Ci0gICAgICAt
LS0tLS0tLS0tLQotCi0gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24g
d2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVj
aWZpY2F0aW9uLgotICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0
aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLgotICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdh
bCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBh
IHByb21pc2UpLgotICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3du
IHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuCi0gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUg
dGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuCi0gICAgICAtIGBzZXR0
bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciBy
ZWplY3RlZC4KLQotICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVz
OiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLgotCi0gICAgICBQcm9taXNlcyB0aGF0
IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1
bGZpbGxlZAotICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEg
cmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZQotICAgICAgcmVqZWN0ZWQgc3RhdGUuICBB
IGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuICBTaW1pbGFybHksIGEKLSAg
ICAgIHJlamVjdGlvbiByZWFzb24gaXMgbmV2ZXIgYSB0aGVuYWJsZS4KLQotICAgICAgUHJvbWlz
ZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUg
aXMgYWxzbyBhCi0gICAgICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0
dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzCi0gICAgICBzZXR0bGVkIHN0YXRlLiAg
U28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGwK
LSAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJv
bWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGwKLSAgICAgIGl0c2VsZiBmdWxmaWxsLgotCi0KLSAgICAg
IEJhc2ljIFVzYWdlOgotICAgICAgLS0tLS0tLS0tLS0tCi0KLSAgICAgIGBgYGpzCi0gICAgICB2
YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewotICAg
ICAgICAvLyBvbiBzdWNjZXNzCi0gICAgICAgIHJlc29sdmUodmFsdWUpOwotCi0gICAgICAgIC8v
IG9uIGZhaWx1cmUKLSAgICAgICAgcmVqZWN0KHJlYXNvbik7Ci0gICAgICB9KTsKLQotICAgICAg
cHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50
Ci0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsKLSAgICAgICAgLy8gb24gcmVqZWN0aW9uCi0g
ICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBBZHZhbmNlZCBVc2FnZToKLSAgICAgIC0tLS0t
LS0tLS0tLS0tLQotCi0gICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkg
YXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzCi0gICAgICBgWE1MSHR0cFJlcXVlc3Rg
cy4KLQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7Ci0gICAgICAg
IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICAg
IHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLQotICAgICAgICAgIHhoci5vcGVuKCdH
RVQnLCB1cmwpOwotICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyOwot
ICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7Ci0gICAgICAgICAgeGhyLnNldFJl
cXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7Ci0gICAgICAgICAgeGhy
LnNlbmQoKTsKLQotICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBp
ZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHsKLSAgICAgICAgICAgICAgaWYgKHRo
aXMuc3RhdHVzID09PSAyMDApIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9u
c2UpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlamVjdChuZXcg
RXJyb3IoImdldEpTT046IGAiICsgdXJsICsgImAgZmFpbGVkIHdpdGggc3RhdHVzOiBbIiArIHRo
aXMuc3RhdHVzICsgIl0iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgIH07Ci0gICAgICAgIH0pOwotICAgICAgfQotCi0gICAgICBnZXRKU09OKCcvcG9zdHMuanNv
bicpLnRoZW4oZnVuY3Rpb24oanNvbikgewotICAgICAgICAvLyBvbiBmdWxmaWxsbWVudAotICAg
ICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7Ci0gICAgICAgIC8vIG9uIHJlamVjdGlvbgotICAgICAg
fSk7Ci0gICAgICBgYGAKLQotICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdy
ZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy4KLQotICAgICAgYGBganMKLSAgICAgIFByb21pc2Uu
YWxsKFsKLSAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksCi0gICAgICAgIGdldEpTT04oJy9jb21t
ZW50cycpCi0gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7Ci0gICAgICAgIHZhbHVlc1sw
XSAvLyA9PiBwb3N0c0pTT04KLSAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTgot
Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBA
Y2xhc3MgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFyYW0ge2Z1bmN0aW9ufQotICAgICAgQHBhcmFt
IHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2Uu
Ci0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAY29uc3RydWN0b3IKLSAgICAqLwot
ICAgIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIsIGxhYmVsKSB7Ci0gICAgICBpZiAoIWlzRnVu
Y3Rpb24ocmVzb2x2ZXIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0
IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHBy
b21pc2UgY29uc3RydWN0b3InKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCEodGhpcyBpbnN0YW5j
ZW9mIFByb21pc2UpKSB7Ci0gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBj
b25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBv
YmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLiIpOwotICAg
ICAgfQotCi0gICAgICB0aGlzLl9pZCA9IGNvdW50ZXIrKzsKLSAgICAgIHRoaXMuX2xhYmVsID0g
bGFiZWw7Ci0gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdOwotCi0gICAgICBpZiAoY29uZmln
Lmluc3RydW1lbnQpIHsKLSAgICAgICAgaW5zdHJ1bWVudCgnY3JlYXRlZCcsIHRoaXMpOwotICAg
ICAgfQotCi0gICAgICBpZiAobm9vcCAhPT0gcmVzb2x2ZXIpIHsKLSAgICAgICAgaW52b2tlUmVz
b2x2ZXIocmVzb2x2ZXIsIHRoaXMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGlu
dm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNlKSB7Ci0gICAgICBmdW5jdGlvbiByZXNvbHZl
UHJvbWlzZSh2YWx1ZSkgewotICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbHVlKTsKLSAgICAg
IH0KLQotICAgICAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHsKLSAgICAgICAgcmVq
ZWN0KHByb21pc2UsIHJlYXNvbik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJl
c29sdmVyKHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlKTsKLSAgICAgIH0gY2F0Y2goZSkg
ewotICAgICAgICByZWplY3RQcm9taXNlKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIFByb21p
c2UuY2FzdCA9IGNhc3Q7Ci0gICAgUHJvbWlzZS5hbGwgPSBhbGw7Ci0gICAgUHJvbWlzZS5yYWNl
ID0gcmFjZTsKLSAgICBQcm9taXNlLnJlc29sdmUgPSBSZXNvbHZlOwotICAgIFByb21pc2UucmVq
ZWN0ID0gUmVqZWN0OwotCi0gICAgdmFyIFBFTkRJTkcgICA9IHZvaWQgMDsKLSAgICB2YXIgU0VB
TEVEICAgID0gMDsKLSAgICB2YXIgRlVMRklMTEVEID0gMTsKLSAgICB2YXIgUkVKRUNURUQgID0g
MjsKLQotICAgIGZ1bmN0aW9uIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50
LCBvblJlamVjdGlvbikgewotICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3Jp
YmVyczsKLSAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7Ci0KLSAgICAgIHN1
YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDsKLSAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIEZV
TEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50OwotICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVK
RUNURURdICA9IG9uUmVqZWN0aW9uOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHB1Ymxpc2gocHJv
bWlzZSwgc2V0dGxlZCkgewotICAgICAgdmFyIGNoaWxkLCBjYWxsYmFjaywgc3Vic2NyaWJlcnMg
PSBwcm9taXNlLl9zdWJzY3JpYmVycywgZGV0YWlsID0gcHJvbWlzZS5fZGV0YWlsOwotCi0gICAg
ICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAgICAgaW5zdHJ1bWVudChzZXR0bGVkID09
PSBGVUxGSUxMRUQgPyAnZnVsZmlsbGVkJyA6ICdyZWplY3RlZCcsIHByb21pc2UpOwotICAgICAg
fQotCi0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAz
KSB7Ci0gICAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07Ci0gICAgICAgIGNhbGxiYWNrID0g
c3Vic2NyaWJlcnNbaSArIHNldHRsZWRdOwotCi0gICAgICAgIGludm9rZUNhbGxiYWNrKHNldHRs
ZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTsKLSAgICAgIH0KLQotICAgICAgcHJvbWlzZS5f
c3Vic2NyaWJlcnMgPSBudWxsOwotICAgIH0KLQotICAgIFByb21pc2UucHJvdG90eXBlID0gewot
ICAgICAgY29uc3RydWN0b3I6IFByb21pc2UsCi0KLSAgICAgIF9pZDogdW5kZWZpbmVkLAotICAg
ICAgX2d1aWRLZXk6IGd1aWRLZXksCi0gICAgICBfbGFiZWw6IHVuZGVmaW5lZCwKLQotICAgICAg
X3N0YXRlOiB1bmRlZmluZWQsCi0gICAgICBfZGV0YWlsOiB1bmRlZmluZWQsCi0gICAgICBfc3Vi
c2NyaWJlcnM6IHVuZGVmaW5lZCwKLQotICAgICAgX29uZXJyb3I6IGZ1bmN0aW9uIChyZWFzb24p
IHsKLSAgICAgICAgY29uZmlnLnRyaWdnZXIoJ2Vycm9yJywgcmVhc29uKTsKLSAgICAgIH0sCi0K
LSAgICAvKioKLSAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJv
bWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLAotICAgICAgd2hpY2ggcmVnaXN0ZXJz
IGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBv
ciB0aGUKLSAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC4K
LQotICAgICAgYGBganMKLSAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXsKLSAg
ICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGUKLSAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7Ci0g
ICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFz
b24gd2h5Ci0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBDaGFpbmluZwotICAgICAgLS0t
LS0tLS0KLQotICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJv
bWlzZS4gIFRoaXMgc2Vjb25kLCAiZG93bnN0cmVhbSIKLSAgICAgIHByb21pc2UgaXMgcmVzb2x2
ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1l
bnQKLSAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxl
ciB0aHJvd3MgYW4gZXhjZXB0aW9uLgotCi0gICAgICBgYGBqcwotICAgICAgZmluZFVzZXIoKS50
aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHJldHVybiB1c2VyLm5hbWU7Ci0gICAgICB9
LCBmdW5jdGlvbiAocmVhc29uKSB7Ci0gICAgICAgIHJldHVybiAiZGVmYXVsdCBuYW1lIjsKLSAg
ICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7Ci0gICAgICAgIC8vIElmIGBmaW5kVXNl
cmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndp
c2UgaXQKLSAgICAgICAgLy8gd2lsbCBiZSBgImRlZmF1bHQgbmFtZSJgCi0gICAgICB9KTsKLQot
ICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHRocm93IG5l
dyBFcnJvcigiRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHkiKTsKLSAgICAgIH0sIGZ1bmN0
aW9uIChyZWFzb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgZmluZFVzZXJgIHJlamVj
dGVkIGFuZCB3ZSdyZSB1bmhhcHB5Iik7Ci0gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkg
ewotICAgICAgICAvLyBuZXZlciByZWFjaGVkCi0gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7
Ci0gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICJG
b3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweSIuCi0gICAgICAgIC8vIElmIGBmaW5kVXNlcmAg
cmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgImBmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3Jl
IHVuaGFwcHkiLgotICAgICAgfSk7Ci0gICAgICBgYGAKLSAgICAgIElmIHRoZSBkb3duc3RyZWFt
IHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24g
cmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLgotCi0gICAgICBg
YGBqcwotICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7Ci0gICAgICAgIHRo
cm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbigiVXBzdHJlYW0gZXJyb3IiKTsKLSAgICAgIH0p
LnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0gICAgICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAgICAg
IH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7Ci0gICAgICAgIC8vIG5ldmVyIHJlYWNoZWQKLSAg
ICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKLSAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4
Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmUKLSAgICAgIH0p
OwotICAgICAgYGBgCi0KLSAgICAgIEFzc2ltaWxhdGlvbgotICAgICAgLS0tLS0tLS0tLS0tCi0K
LSAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93
bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlCi0gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3Vz
bHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlCi0g
ICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJv
bWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZwotICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21p
c2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouCi0KLSAgICAgIGBg
YGpzCi0gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKLSAgICAgICAgcmV0
dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpOwotICAgICAgfSkudGhlbihmdW5jdGlvbiAo
Y29tbWVudHMpIHsKLSAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWls
YWJsZQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHBy
b21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWpl
Y3QuCi0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIp
IHsKLSAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpOwotICAgICAgfSku
dGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKLSAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5
QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZQotICAgICAgfSwgZnVu
Y3Rpb24gKHJlYXNvbikgewotICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJl
amVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBTaW1wbGUgRXhhbXBsZQotICAgICAgLS0tLS0tLS0tLS0tLS0KLQotICAgICAgU3lu
Y2hyb25vdXMgRXhhbXBsZQotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcmVzdWx0
OwotCi0gICAgICB0cnkgewotICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7Ci0gICAgICAg
IC8vIHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgIC8vIGZhaWx1cmUK
LSAgICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBFcnJiYWNrIEV4YW1wbGUKLQotICAgICAgYGBg
anMKLSAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpewotICAgICAgICBpZiAo
ZXJyKSB7Ci0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgUHJv
bWlzZSBFeGFtcGxlOwotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBmaW5kUmVzdWx0KCku
dGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyBzdWNjZXNzCi0gICAgICB9LCBmdW5j
dGlvbihyZWFzb24pewotICAgICAgICAvLyBmYWlsdXJlCi0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBBZHZhbmNlZCBFeGFtcGxlCi0gICAgICAtLS0tLS0tLS0tLS0tLQotCi0gICAgICBT
eW5jaHJvbm91cyBFeGFtcGxlCi0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBhdXRo
b3IsIGJvb2tzOwotCi0gICAgICB0cnkgewotICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7
Ci0gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7Ci0gICAgICAgIC8v
IHN1Y2Nlc3MKLSAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgIC8vIGZhaWx1cmUKLSAg
ICAgIH0KLSAgICAgIGBgYAotCi0gICAgICBFcnJiYWNrIEV4YW1wbGUKLQotICAgICAgYGBganMK
LQotICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykgewotCi0gICAgICB9Ci0KLSAgICAg
IGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7Ci0KLSAgICAgIH0KLQotICAgICAgZmluZEF1dGhv
cihmdW5jdGlvbihhdXRob3IsIGVycil7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICBm
YWlsdXJlKGVycik7Ci0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5j
dGlvbihib29rcywgZXJyKSB7Ci0gICAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAg
ICAgICBmYWlsdXJlKGVycik7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpOwotICAgICAgICAg
ICAgICAgIH0gY2F0Y2gocmVhc29uKSB7Ci0gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNv
bik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsK
LSAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7Ci0gICAgICAgICAgICBmYWlsdXJlKGVycik7Ci0g
ICAgICAgICAgfQotICAgICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgUHJvbWlzZSBFeGFtcGxlOwotCi0gICAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgICBmaW5kQXV0aG9yKCkuCi0gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLgot
ICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXsKLSAgICAgICAgICAvLyBmb3VuZCBib29rcwot
ICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gc29tZXRoaW5nIHdl
bnQgd3JvbmcKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgdGhlbgotICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWQKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259
IG9uUmVqZWN0ZWQKLSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcg
Zm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7UHJvbWlzZX0KLSAgICAqLwotICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxm
aWxsbWVudCwgb25SZWplY3Rpb24sIGxhYmVsKSB7Ci0gICAgICAgIHZhciBwcm9taXNlID0gdGhp
czsKLSAgICAgICAgdGhpcy5fb25lcnJvciA9IG51bGw7Ci0KLSAgICAgICAgdmFyIHRoZW5Qcm9t
aXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCwgbGFiZWwpOwotCi0gICAgICAgIGlmICh0
aGlzLl9zdGF0ZSkgewotICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBhcmd1bWVudHM7Ci0gICAg
ICAgICAgY29uZmlnLmFzeW5jKGZ1bmN0aW9uIGludm9rZVByb21pc2VDYWxsYmFjaygpIHsKLSAg
ICAgICAgICAgIGludm9rZUNhbGxiYWNrKHByb21pc2UuX3N0YXRlLCB0aGVuUHJvbWlzZSwgY2Fs
bGJhY2tzW3Byb21pc2UuX3N0YXRlIC0gMV0sIHByb21pc2UuX2RldGFpbCk7Ci0gICAgICAgICAg
fSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3Vic2NyaWJlKHRoaXMsIHRoZW5Qcm9t
aXNlLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoY29uZmlnLmluc3RydW1lbnQpIHsKLSAgICAgICAgICBpbnN0cnVtZW50KCdjaGFpbmVkJywg
cHJvbWlzZSwgdGhlblByb21pc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW5Q
cm9taXNlOwotICAgICAgfSwKLQotICAgIC8qKgotICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3Vn
YXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUg
c2FtZQotICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC4K
LQotICAgICAgYGBganMKLSAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXsKLSAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yIik7Ci0gICAgICB9Ci0KLSAg
ICAgIC8vIHN5bmNocm9ub3VzCi0gICAgICB0cnkgewotICAgICAgICBmaW5kQXV0aG9yKCk7Ci0g
ICAgICB9IGNhdGNoKHJlYXNvbikgewotICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZwot
ICAgICAgfQotCi0gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzCi0gICAgICBmaW5kQXV0aG9y
KCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3Jv
bmcKLSAgICAgIH0pOwotICAgICAgYGBgCi0KLSAgICAgIEBtZXRob2QgY2F0Y2gKLSAgICAgIEBw
YXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBm
b3IgdG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICAgICdjYXRj
aCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uLCBsYWJlbCkgewotICAgICAgICByZXR1cm4gdGhpcy50
aGVuKG51bGwsIG9uUmVqZWN0aW9uLCBsYWJlbCk7Ci0gICAgICB9LAotCi0gICAgLyoqCi0gICAg
ICBgZmluYWxseWAgd2lsbCBiZSBpbnZva2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb21pc2UncyBm
YXRlIGp1c3QgYXMgbmF0aXZlCi0gICAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzCi0KLSAg
ICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6Ci0KLSAgICAgIGBgYGpzCi0gICAgICBmaW5kQXV0aG9y
KCkgewotICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDAuNSkgewotICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQXV0aG9yKCk7Ci0g
ICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJldHVybiBmaW5kQXV0aG9yKCk7IC8vIHN1
Y2NlZWQgb3IgZmFpbAotICAgICAgfSBjYXRjaChlcnJvcikgewotICAgICAgICByZXR1cm4gZmlu
ZE90aGVyQXV0aGVyKCk7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICAvLyBhbHdheXMgcnVu
cwotICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICB9Ci0g
ICAgICBgYGAKLQotICAgICAgQXN5bmNocm9ub3VzIGV4YW1wbGU6Ci0KLSAgICAgIGBgYGpzCi0g
ICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXsKLSAgICAgICAgcmV0dXJu
IGZpbmRPdGhlckF1dGhlcigpOwotICAgICAgfSkuZmluYWxseShmdW5jdGlvbigpewotICAgICAg
ICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwgb3Igbm90Ci0gICAgICB9KTsKLSAgICAgIGBg
YAotCi0gICAgICBAbWV0aG9kIGZpbmFsbHkKLSAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxi
YWNrCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJl
bGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEByZXR1
cm4ge1Byb21pc2V9Ci0gICAgKi8KLSAgICAgICdmaW5hbGx5JzogZnVuY3Rpb24oY2FsbGJhY2ss
IGxhYmVsKSB7Ci0gICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7Ci0K
LSAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICAgIHJl
dHVybiBjb25zdHJ1Y3Rvci5jYXN0KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKXsKLSAgICAg
ICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfSwgZnVuY3Rpb24o
cmVhc29uKSB7Ci0gICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmNhc3QoY2FsbGJhY2soKSku
dGhlbihmdW5jdGlvbigpewotICAgICAgICAgICAgdGhyb3cgcmVhc29uOwotICAgICAgICAgIH0p
OwotICAgICAgICB9LCBsYWJlbCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGlu
dm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHsKLSAgICAg
IHZhciBoYXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLAotICAgICAgICAgIHZhbHVl
LCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7Ci0KLSAgICAgIGlmIChoYXNDYWxsYmFjaykgewot
ICAgICAgICB0cnkgewotICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soZGV0YWlsKTsKLSAgICAg
ICAgICBzdWNjZWVkZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgICBm
YWlsZWQgPSB0cnVlOwotICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgfQotICAgICAgfSBl
bHNlIHsKLSAgICAgICAgdmFsdWUgPSBkZXRhaWw7Ci0gICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7
Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpIHsK
LSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVk
ZWQpIHsKLSAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYg
KGZhaWxlZCkgewotICAgICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpOwotICAgICAgfSBlbHNl
IGlmIChzZXR0bGVkID09PSBGVUxGSUxMRUQpIHsKLSAgICAgICAgcmVzb2x2ZShwcm9taXNlLCB2
YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKSB7Ci0gICAgICAg
IHJlamVjdChwcm9taXNlLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24g
aGFuZGxlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpIHsKLSAgICAgIHZhciB0aGVuID0gbnVsbCwK
LSAgICAgIHJlc29sdmVkOwotCi0gICAgICB0cnkgewotICAgICAgICBpZiAocHJvbWlzZSA9PT0g
dmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxi
YWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuIik7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHsKLSAgICAgICAgICB0aGVuID0gdmFs
dWUudGhlbjsKLQotICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoZW4pKSB7Ci0gICAgICAgICAg
ICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZhbCkgewotICAgICAgICAgICAgICBpZiAocmVz
b2x2ZWQpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlOwot
Ci0gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsKSB7Ci0gICAgICAgICAgICAgICAgcmVz
b2x2ZShwcm9taXNlLCB2YWwpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fSwgZnVuY3Rpb24odmFsKSB7Ci0gICAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4g
dHJ1ZTsgfQotICAgICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAg
cmVqZWN0KHByb21pc2UsIHZhbCk7Ci0gICAgICAgICAgICB9LCAnZGVyaXZlZCBmcm9tOiAnICsg
KHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpOwotCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKGVycm9y
KSB7Ci0gICAgICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICByZWpl
Y3QocHJvbWlzZSwgZXJyb3IpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwg
dmFsdWUpIHsKLSAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgewotICAgICAgICBmdWxmaWxs
KHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0gZWxzZSBpZiAoIWhhbmRsZVRoZW5hYmxlKHByb21p
c2UsIHZhbHVlKSkgewotICAgICAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTsKLSAgICAgIH0K
LSAgICB9Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7Ci0gICAgICBp
ZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9Ci0gICAgICBwcm9taXNl
Ll9zdGF0ZSA9IFNFQUxFRDsKLSAgICAgIHByb21pc2UuX2RldGFpbCA9IHZhbHVlOwotCi0gICAg
ICBjb25maWcuYXN5bmMocHVibGlzaEZ1bGZpbGxtZW50LCBwcm9taXNlKTsKLSAgICB9Ci0KLSAg
ICBmdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKSB7Ci0gICAgICBpZiAocHJvbWlzZS5f
c3RhdGUgIT09IFBFTkRJTkcpIHsgcmV0dXJuOyB9Ci0gICAgICBwcm9taXNlLl9zdGF0ZSA9IFNF
QUxFRDsKLSAgICAgIHByb21pc2UuX2RldGFpbCA9IHJlYXNvbjsKLQotICAgICAgY29uZmlnLmFz
eW5jKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHB1
Ymxpc2hGdWxmaWxsbWVudChwcm9taXNlKSB7Ci0gICAgICBwdWJsaXNoKHByb21pc2UsIHByb21p
c2UuX3N0YXRlID0gRlVMRklMTEVEKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBwdWJsaXNoUmVq
ZWN0aW9uKHByb21pc2UpIHsKLSAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7Ci0gICAgICAg
IHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fZGV0YWlsKTsKLSAgICAgIH0KLQotICAgICAgcHVi
bGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9IFJFSkVDVEVEKTsKLSAgICB9Ci0gIH0pOwot
ZGVmaW5lKCJyc3ZwL3Byb21pc2UvYWxsIiwgCi0gIFsiLi4vdXRpbHMiLCJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmlj
dCI7Ci0gICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKLSAgICB2YXIg
aXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFfXy5pc05vblRoZW5hYmxlOwotCi0gICAgLyoq
Ci0gICAgICBgUlNWUC5Qcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywg
YW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaAotICAgICAgaXMgZnVsZmlsbGVkIHdpdGgg
YW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVzIGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBv
cgotICAgICAgcmVqZWN0ZWQgd2l0aCB0aGUgcmVhc29uIG9mIHRoZSBmaXJzdCBwYXNzZWQgcHJv
bWlzZSB0byBiZSByZWplY3RlZC4gSXQgY2FzdHMgYWxsCi0gICAgICBlbGVtZW50cyBvZiB0aGUg
cGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCi0K
LSAgICAgIEV4YW1wbGU6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNl
MSA9IFJTVlAucmVzb2x2ZSgxKTsKLSAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVzb2x2ZSgy
KTsKLSAgICAgIHZhciBwcm9taXNlMyA9IFJTVlAucmVzb2x2ZSgzKTsKLSAgICAgIHZhciBwcm9t
aXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwotCi0gICAgICBSU1ZQLlBy
b21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXsKLSAgICAgICAgLy8gVGhl
IGFycmF5IGhlcmUgd291bGQgYmUgWyAxLCAyLCAzIF07Ci0gICAgICB9KTsKLSAgICAgIGBgYAot
Ci0gICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJTVlAuYWxsYCBhcmUg
cmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCi0gICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwg
YmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2VzJ3MKLSAgICAg
IHJlamVjdGlvbiBoYW5kbGVyLiBGb3IgZXhhbXBsZToKLQotICAgICAgRXhhbXBsZToKLQotICAg
ICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UxID0gUlNWUC5yZXNvbHZlKDEpOwot
ICAgICAgdmFyIHByb21pc2UyID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIyIikpOwotICAgICAg
dmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIzIikpOwotICAgICAgdmFyIHBy
b21pc2VzID0gWyBwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07Ci0KLSAgICAgIFJTVlAu
UHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpewotICAgICAgICAvLyBD
b2RlIGhlcmUgbmV2ZXIgcnVucyBiZWNhdXNlIHRoZXJlIGFyZSByZWplY3RlZCBwcm9taXNlcyEK
LSAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7Ci0gICAgICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09
ICIyIgotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCBhbGwKLSAgICAgIEBm
b3IgUlNWUC5Qcm9taXNlCi0gICAgICBAcGFyYW0ge0FycmF5fSBlbnRyaWVzIGFycmF5IG9mIHBy
b21pc2VzCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBs
YWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KLSAgICAgIEBy
ZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBhbGwgYHByb21p
c2VzYCBoYXZlIGJlZW4KLSAgICAgIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRo
ZW0gYmVjb21lIHJlamVjdGVkLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGFsbChlbnRyaWVzLCBsYWJlbCkgewotCi0gICAgICAv
KmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwotICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsK
LQotICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qp
IHsKLSAgICAgICAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3
IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byBhbGwuJyk7Ci0gICAgICAgIH0K
LQotICAgICAgICB2YXIgcmVtYWluaW5nID0gZW50cmllcy5sZW5ndGg7Ci0gICAgICAgIHZhciBy
ZXN1bHRzID0gbmV3IEFycmF5KHJlbWFpbmluZyk7Ci0gICAgICAgIHZhciBlbnRyeSwgcGVuZGlu
ZyA9IHRydWU7Ci0KLSAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgIHJl
c29sdmUocmVzdWx0cyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAg
ZnVuY3Rpb24gZnVsZmlsbG1lbnRBdChpbmRleCkgewotICAgICAgICAgIHJldHVybiBmdW5jdGlv
bih2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2YWx1ZTsKLSAgICAgICAg
ICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgewotICAgICAgICAgICAgICByZXNvbHZlKHJlc3Vs
dHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBm
dW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHsKLSAgICAgICAgICByZW1haW5pbmcgPSAwOwot
ICAgICAgICAgIHJlamVjdChyZWFzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh2YXIg
aW5kZXggPSAwOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0gICAgICAgICAg
ZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKLSAgICAgICAgICBpZiAoaXNOb25UaGVuYWJsZShlbnRy
eSkpIHsKLSAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZW50cnk7Ci0gICAgICAgICAgICBp
ZiAoLS1yZW1haW5pbmcgPT09IDApIHsKLSAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29uc3RydWN0
b3IuY2FzdChlbnRyeSkudGhlbihmdWxmaWxsbWVudEF0KGluZGV4KSwgb25SZWplY3Rpb24pOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwot
ZGVmaW5lKCJyc3ZwL3Byb21pc2UvY2FzdCIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24o
X19leHBvcnRzX18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgLyoqCi0gICAgICBgUlNWUC5Q
cm9taXNlLmNhc3RgIGNvZXJjZXMgaXRzIGFyZ3VtZW50IHRvIGEgcHJvbWlzZSwgb3IgcmV0dXJu
cyB0aGUKLSAgICAgIGFyZ3VtZW50IGlmIGl0IGlzIGFscmVhZHkgYSBwcm9taXNlIHdoaWNoIHNo
YXJlcyBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNhc3Rlci4KLQotICAgICAgRXhhbXBsZToKLQot
ICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVz
b2x2ZSgxKTsKLSAgICAgIHZhciBjYXN0ZWQgPSBSU1ZQLlByb21pc2UuY2FzdChwcm9taXNlKTsK
LQotICAgICAgY29uc29sZS5sb2cocHJvbWlzZSA9PT0gY2FzdGVkKTsgLy8gdHJ1ZQotICAgICAg
YGBgCi0KLSAgICAgIEluIHRoZSBjYXNlIG9mIGEgcHJvbWlzZSB3aG9zZSBjb25zdHJ1Y3RvciBk
b2VzIG5vdCBtYXRjaCwgaXQgaXMgYXNzaW1pbGF0ZWQuCi0gICAgICBUaGUgcmVzdWx0aW5nIHBy
b21pc2Ugd2lsbCBmdWxmaWxsIG9yIHJlamVjdCBiYXNlZCBvbiB0aGUgb3V0Y29tZSBvZiB0aGUK
LSAgICAgIHByb21pc2UgYmVpbmcgY2FzdGVkLgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgdGhlbm5hYmxlID0gJC5nZXRKU09OKCcvYXBpL2Zvbycp
OwotICAgICAgdmFyIGNhc3RlZCA9IFJTVlAuUHJvbWlzZS5jYXN0KHRoZW5uYWJsZSk7Ci0KLSAg
ICAgIGNvbnNvbGUubG9nKHRoZW5uYWJsZSA9PT0gY2FzdGVkKTsgLy8gZmFsc2UKLSAgICAgIGNv
bnNvbGUubG9nKGNhc3RlZCBpbnN0YW5jZW9mIFJTVlAuUHJvbWlzZSkgLy8gdHJ1ZQotCi0gICAg
ICBjYXN0ZWQudGhlbihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICAgIC8vIGRhdGEgaXMgdGhlIHZh
bHVlIGdldEpTT04gZnVsZmlsbHMgd2l0aAotICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAg
SW4gdGhlIGNhc2Ugb2YgYSBub24tcHJvbWlzZSwgYSBwcm9taXNlIHdoaWNoIHdpbGwgZnVsZmls
bCB3aXRoIHRoYXQgdmFsdWUgaXMKLSAgICAgIHJldHVybmVkLgotCi0gICAgICBFeGFtcGxlOgot
Ci0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgdmFsdWUgPSAxOyAvLyBjb3VsZCBiZSBh
IG51bWJlciwgYm9vbGVhbiwgc3RyaW5nLCB1bmRlZmluZWQuLi4KLSAgICAgIHZhciBjYXN0ZWQg
PSBSU1ZQLlByb21pc2UuY2FzdCh2YWx1ZSk7Ci0KLSAgICAgIGNvbnNvbGUubG9nKHZhbHVlID09
PSBjYXN0ZWQpOyAvLyBmYWxzZQotICAgICAgY29uc29sZS5sb2coY2FzdGVkIGluc3RhbmNlb2Yg
UlNWUC5Qcm9taXNlKSAvLyB0cnVlCi0KLSAgICAgIGNhc3RlZC50aGVuKGZ1bmN0aW9uKHZhbCkg
ewotICAgICAgICB2YWwgPT09IHZhbHVlIC8vID0+IHRydWUKLSAgICAgIH0pOwotICAgICAgYGBg
Ci0KLSAgICAgIGBSU1ZQLlByb21pc2UuY2FzdGAgaXMgc2ltaWxhciB0byBgUlNWUC5Qcm9taXNl
LnJlc29sdmVgLCBidXQgYFJTVlAuUHJvbWlzZS5jYXN0YCBkaWZmZXJzIGluIHRoZQotICAgICAg
Zm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICogYFJTVlAuUHJvbWlzZS5jYXN0YCBzZXJ2ZXMgYXMg
YSBtZW1vcnktZWZmaWNpZW50IHdheSBvZiBnZXR0aW5nIGEgcHJvbWlzZSwgd2hlbiB5b3UKLSAg
ICAgIGhhdmUgc29tZXRoaW5nIHRoYXQgY291bGQgZWl0aGVyIGJlIGEgcHJvbWlzZSBvciBhIHZh
bHVlLiBSU1ZQLnJlc29sdmUKLSAgICAgIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYnV0IHdp
bGwgY3JlYXRlIGEgbmV3IHByb21pc2Ugd3JhcHBlciBpZiB0aGUKLSAgICAgIGFyZ3VtZW50IGlz
IGEgcHJvbWlzZS4KLSAgICAgICogYFJTVlAuUHJvbWlzZS5jYXN0YCBpcyBhIHdheSBvZiBjYXN0
aW5nIGluY29taW5nIHRoZW5hYmxlcyBvciBwcm9taXNlIHN1YmNsYXNzZXMgdG8KLSAgICAgIHBy
b21pc2VzIG9mIHRoZSBleGFjdCBjbGFzcyBzcGVjaWZpZWQsIHNvIHRoYXQgdGhlIHJlc3VsdGlu
ZyBvYmplY3QncyBgdGhlbmAgaXMKLSAgICAgIGVuc3VyZWQgdG8gaGF2ZSB0aGUgYmVoYXZpb3Ig
b2YgdGhlIGNvbnN0cnVjdG9yIHlvdSBhcmUgY2FsbGluZyBjYXN0IG9uIChpLmUuLCBSU1ZQLlBy
b21pc2UpLgotCi0gICAgICBAbWV0aG9kIGNhc3QKLSAgICAgIEBwYXJhbSB7T2JqZWN0fSBvYmpl
Y3QgdG8gYmUgY2FzdGVkCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3Ry
aW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4K
LSAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKLSAgICAgIEBzdGF0aWMKLSAgICAqLwot
Ci0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIGNhc3Qob2JqZWN0LCBsYWJl
bCkgewotICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KLSAgICAgIHZhciBDb25zdHJ1
Y3RvciA9IHRoaXM7Ci0KLSAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29i
amVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3RvcikgewotICAgICAgICBy
ZXR1cm4gb2JqZWN0OwotICAgICAgfQotCi0gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1
bmN0aW9uKHJlc29sdmUpIHsKLSAgICAgICAgcmVzb2x2ZShvYmplY3QpOwotICAgICAgfSwgbGFi
ZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvcmFjZSIsIAotICBbIi4u
L3V0aWxzIiwiZXhwb3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0
c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIC8qIGdsb2JhbCB0b1N0cmluZyAqLwotCi0g
ICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKLSAgICB2YXIgaXNGdW5j
dGlvbiA9IF9fZGVwZW5kZW5jeTFfXy5pc0Z1bmN0aW9uOwotICAgIHZhciBpc05vblRoZW5hYmxl
ID0gX19kZXBlbmRlbmN5MV9fLmlzTm9uVGhlbmFibGU7Ci0KLSAgICAvKioKLSAgICAgIGBSU1ZQ
LlByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4g
dGhlIHNhbWUgd2F5IGFzIHRoZQotICAgICAgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gc2V0dGxl
LgotCi0gICAgICBFeGFtcGxlOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIgcHJv
bWlzZTEgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Ci0gICAg
ICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICByZXNvbHZlKCJwcm9taXNlIDEi
KTsKLSAgICAgICAgfSwgMjAwKTsKLSAgICAgIH0pOwotCi0gICAgICB2YXIgcHJvbWlzZTIgPSBu
ZXcgUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7Ci0gICAgICAgIHNldFRp
bWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgICAgICByZXNvbHZlKCJwcm9taXNlIDIiKTsKLSAgICAg
ICAgfSwgMTAwKTsKLSAgICAgIH0pOwotCi0gICAgICBSU1ZQLlByb21pc2UucmFjZShbcHJvbWlz
ZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpewotICAgICAgICAvLyByZXN1bHQg
PT09ICJwcm9taXNlIDIiIGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMQot
ICAgICAgICAvLyB3YXMgcmVzb2x2ZWQuCi0gICAgICB9KTsKLSAgICAgIGBgYAotCi0gICAgICBg
UlNWUC5Qcm9taXNlLnJhY2VgIGlzIGRldGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0
ZSBvZiB0aGUgZmlyc3QKLSAgICAgIHNldHRsZWQgcHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBs
ZSwgZXZlbiBpZiBvdGhlciBwcm9taXNlcyBnaXZlbiB0byB0aGUKLSAgICAgIGBwcm9taXNlc2Ag
YXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlz
ZSBoYXMKLSAgICAgIGJlY29tZSByZWplY3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJl
Y2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZAotICAgICAgcHJvbWlzZSB3aWxsIGJlY29tZSBy
ZWplY3RlZDoKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFyIHByb21pc2UxID0gbmV3
IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgcmVzb2x2ZSgicHJvbWlzZSAxIik7Ci0gICAgICAg
IH0sIDIwMCk7Ci0gICAgICB9KTsKLQotICAgICAgdmFyIHByb21pc2UyID0gbmV3IFJTVlAuUHJv
bWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0
aW9uKCl7Ci0gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigicHJvbWlzZSAyIikpOwotICAgICAg
ICB9LCAxMDApOwotICAgICAgfSk7Ci0KLSAgICAgIFJTVlAuUHJvbWlzZS5yYWNlKFtwcm9taXNl
MSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgIC8vIENvZGUgaGVy
ZSBuZXZlciBydW5zCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pewotICAgICAgICAvLyByZWFz
b24ubWVzc2FnZSA9PT0gInByb21pc2UyIiBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0
ZWQgYmVmb3JlCi0gICAgICAgIC8vIHByb21pc2UgMSBiZWNhbWUgZnVsZmlsbGVkCi0gICAgICB9
KTsKLSAgICAgIGBgYAotCi0gICAgICBBbiBleGFtcGxlIHJlYWwtd29ybGQgdXNlIGNhc2UgaXMg
aW1wbGVtZW50aW5nIHRpbWVvdXRzOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBSU1ZQ
LlByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24nKSwgdGltZW91dCg1MDAwKV0pCi0gICAgICBg
YGAKLQotICAgICAgQG1ldGhvZCByYWNlCi0gICAgICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBh
cnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwg
b3B0aW9uYWwgc3RyaW5nIGZvciBkZXNjcmliaW5nIHRoZSBwcm9taXNlIHJldHVybmVkLgotICAg
ICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNl
IHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWQKLSAgICAg
IHByb21pc2UgdG8gc2V0dGxlLgotICAgICAgQHN0YXRpYwotICAgICovCi0gICAgX19leHBvcnRz
X19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJhY2UoZW50cmllcywgbGFiZWwpIHsKLSAgICAgIC8q
anNoaW50IHZhbGlkdGhpczp0cnVlICovCi0gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLCBl
bnRyeTsKLQotICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCBy
ZWplY3QpIHsKLSAgICAgICAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7Ci0gICAgICAgICAgdGhy
b3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgdmFyIHBlbmRpbmcgPSB0cnVlOwotCi0gICAgICAgIGZ1bmN0aW9u
IG9uRnVsZmlsbG1lbnQodmFsdWUpIHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyBy
ZXNvbHZlKHZhbHVlKTsgfSB9Ci0gICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikg
IHsgaWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyByZWplY3QocmVhc29uKTsgfSB9Ci0K
LSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAg
ICAgICAgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgIGlmIChpc05vblRoZW5hYmxlKGVu
dHJ5KSkgewotICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgcmVzb2x2
ZShlbnRyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIENvbnN0cnVjdG9yLmNhc3QoZW50cnkpLnRoZW4ob25GdWxmaWxsbWVudCwgb25SZWpl
Y3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgbGFiZWwpOwotICAgIH07
Ci0gIH0pOwotZGVmaW5lKCJyc3ZwL3Byb21pc2UvcmVqZWN0IiwgCi0gIFsiZXhwb3J0cyJdLAot
ICBmdW5jdGlvbihfX2V4cG9ydHNfXykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAg
ICAgIGBSU1ZQLlByb21pc2UucmVqZWN0YCByZXR1cm5zIGEgcHJvbWlzZSByZWplY3RlZCB3aXRo
IHRoZSBwYXNzZWQgYHJlYXNvbmAuCi0gICAgICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xs
b3dpbmc6Ci0KLSAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgIHZhciBwcm9taXNlID0gbmV3IFJT
VlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICByZWplY3QobmV3
IEVycm9yKCdXSE9PUFMnKSk7Ci0gICAgICB9KTsKLQotICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0
aW9uKHZhbHVlKXsKLSAgICAgICAgLy8gQ29kZSBoZXJlIGRvZXNuJ3QgcnVuIGJlY2F1c2UgdGhl
IHByb21pc2UgaXMgcmVqZWN0ZWQhCi0gICAgICB9LCBmdW5jdGlvbihyZWFzb24pewotICAgICAg
ICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUycKLSAgICAgIH0pOwotICAgICAgYGBgCi0K
LSAgICAgIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5
IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKLQotICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgdmFy
IHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpOwotCi0g
ICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAvLyBDb2RlIGhlcmUg
ZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCEKLSAgICAgIH0sIGZ1
bmN0aW9uKHJlYXNvbil7Ci0gICAgICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJwot
ICAgICAgfSk7Ci0gICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByZWplY3QKLSAgICAgIEBwYXJh
bSB7QW55fSByZWFzb24gdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJl
amVjdGVkIHdpdGguCi0gICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5n
IGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJuZWQgcHJvbWlzZS4KLSAgICAgIFVzZWZ1bCBmb3Ig
dG9vbGluZy4KLSAgICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRo
IHRoZSBnaXZlbiBgcmVhc29uYC4KLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0
c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiByZWplY3QocmVhc29uLCBsYWJlbCkgewotICAgICAg
Lypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KLSAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7
Ci0KLSAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVj
dCkgewotICAgICAgICByZWplY3QocmVhc29uKTsKLSAgICAgIH0sIGxhYmVsKTsKLSAgICB9Owot
ICB9KTsKLWRlZmluZSgicnN2cC9wcm9taXNlL3Jlc29sdmUiLCAKLSAgWyJleHBvcnRzIl0sCi0g
IGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIC8qKgotICAg
ICAgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVj
b21lIHJlc29sdmVkIHdpdGggdGhlCi0gICAgICBwYXNzZWQgYHZhbHVlYC4gSXQgaXMgc2hvcnRo
YW5kIGZvciB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2YXIg
cHJvbWlzZSA9IG5ldyBSU1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKLSAg
ICAgICAgcmVzb2x2ZSgxKTsKLSAgICAgIH0pOwotCi0gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rp
b24odmFsdWUpewotICAgICAgICAvLyB2YWx1ZSA9PT0gMQotICAgICAgfSk7Ci0gICAgICBgYGAK
LQotICAgICAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1w
bHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICB2
YXIgcHJvbWlzZSA9IFJTVlAuUHJvbWlzZS5yZXNvbHZlKDEpOwotCi0gICAgICBwcm9taXNlLnRo
ZW4oZnVuY3Rpb24odmFsdWUpewotICAgICAgICAvLyB2YWx1ZSA9PT0gMQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgQG1ldGhvZCByZXNvbHZlCi0gICAgICBAcGFyYW0ge0FueX0gdmFs
dWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGgK
LSAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGlkZW50aWZ5
aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAg
ICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVk
IHdpdGggdGhlIGdpdmVuCi0gICAgICBgdmFsdWVgCi0gICAgICBAc3RhdGljCi0gICAgKi8KLSAg
ICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZSwgbGFiZWwp
IHsKLSAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovCi0gICAgICB2YXIgQ29uc3RydWN0
b3IgPSB0aGlzOwotCi0gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29s
dmUsIHJlamVjdCkgewotICAgICAgICByZXNvbHZlKHZhbHVlKTsKLSAgICAgIH0sIGxhYmVsKTsK
LSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9yYWNlIiwgCi0gIFsiLi9wcm9taXNlIiwiZXhw
b3J0cyJdLAotICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7Ci0gICAg
InVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0
Il07Ci0KLSAgICAvKioKLSAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW50IGFsaWFzIGZvciBgUlNW
UC5Qcm9taXNlLnJhY2VgLgotCi0gICAgICBAbWV0aG9kIHJhY2UKLSAgICAgIEBwYXJhbSB7QXJy
YXl9IGFycmF5IEFycmF5IG9mIHByb21pc2VzLgotICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVs
IEFuIG9wdGlvbmFsIGxhYmVsLiBUaGlzIGlzIHVzZWZ1bAotICAgICAgZm9yIHRvb2xpbmcuCi0g
ICAgICBAc3RhdGljCi0gICAgKi8KLSAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rp
b24gcmFjZShhcnJheSwgbGFiZWwpIHsKLSAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoYXJyYXks
IGxhYmVsKTsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC9yZWplY3QiLCAKLSAgWyIuL3By
b21pc2UiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRz
X18pIHsKLSAgICAidXNlIHN0cmljdCI7Ci0gICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kx
X19bImRlZmF1bHQiXTsKLQotICAgIC8qKgotICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbnQgYWxp
YXMgZm9yIGBSU1ZQLlByb21pc2UucmVqZWN0YC4KLQotICAgICAgQG1ldGhvZCByZWplY3QKLSAg
ICAgIEBmb3IgUlNWUAotICAgICAgQHBhcmFtIHtBbnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSBy
ZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC4KLSAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGlkZW50aWZ5aW5nIHRoZSByZXR1cm5lZCBw
cm9taXNlLgotICAgICAgVXNlZnVsIGZvciB0b29saW5nLgotICAgICAgQHJldHVybiB7UHJvbWlz
ZX0gYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhlIGdpdmVuIGByZWFzb25gLgotICAgICAgQHN0
YXRpYwotICAgICovCi0gICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJlamVj
dChyZWFzb24sIGxhYmVsKSB7Ci0gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uLCBs
YWJlbCk7Ci0gICAgfTsKLSAgfSk7Ci1kZWZpbmUoInJzdnAvcmVzb2x2ZSIsIAotICBbIi4vcHJv
bWlzZSIsImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNf
XykgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFf
X1siZGVmYXVsdCJdOwotCi0gICAgLyoqCi0gICAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlh
cyBmb3IgYFJTVlAuUHJvbWlzZS5yZXNvbHZlYC4KLQotICAgICAgQG1ldGhvZCByZXNvbHZlCi0g
ICAgICBAZm9yIFJTVlAKLSAgICAgIEBwYXJhbSB7QW55fSB2YWx1ZSB2YWx1ZSB0aGF0IHRoZSBy
ZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aAotICAgICAgQHBhcmFtIHtTdHJp
bmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVybmVkIHBy
b21pc2UuCi0gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCi0gICAgICBAcmV0dXJuIHtQcm9taXNl
fSBhIHByb21pc2UgdGhhdCB3aWxsIGJlY29tZSBmdWxmaWxsZWQgd2l0aCB0aGUgZ2l2ZW4KLSAg
ICAgIGB2YWx1ZWAKLSAgICAgIEBzdGF0aWMKLSAgICAqLwotICAgIF9fZXhwb3J0c19fWyJkZWZh
dWx0Il0gPSBmdW5jdGlvbiByZXNvbHZlKHZhbHVlLCBsYWJlbCkgewotICAgICAgcmV0dXJuIFBy
b21pc2UucmVzb2x2ZSh2YWx1ZSwgbGFiZWwpOwotICAgIH07Ci0gIH0pOwotZGVmaW5lKCJyc3Zw
L3JldGhyb3ciLCAKLSAgWyJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7Ci0g
ICAgInVzZSBzdHJpY3QiOwotICAgIC8qKgotICAgICAgYFJTVlAucmV0aHJvd2Agd2lsbCByZXRo
cm93IGFuIGVycm9yIG9uIHRoZSBuZXh0IHR1cm4gb2YgdGhlIEphdmFTY3JpcHQgZXZlbnQKLSAg
ICAgIGxvb3AgaW4gb3JkZXIgdG8gYWlkIGRlYnVnZ2luZy4KLQotICAgICAgUHJvbWlzZXMgQSsg
c3BlY2lmaWVzIHRoYXQgYW55IGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciB3aXRoIGEgcHJvbWlzZSBt
dXN0IGJlCi0gICAgICBjYXVnaHQgYnkgdGhlIHByb21pc2VzIGltcGxlbWVudGF0aW9uIGFuZCBi
dWJibGVkIHRvIHRoZSBsYXN0IGhhbmRsZXIuIEZvcgotICAgICAgdGhpcyByZWFzb24sIGl0IGlz
IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cyBzcGVjaWZ5IGEgc2Vjb25kIHJlamVjdGlvbgot
ICAgICAgaGFuZGxlciBmdW5jdGlvbiB0byBgdGhlbmAuIEhvd2V2ZXIsIGBSU1ZQLnJldGhyb3dg
IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAgICAgb3V0c2lkZSBvZiB0aGUgcHJvbWlzZSwg
c28gaXQgYnViYmxlcyB1cCB0byB5b3VyIGNvbnNvbGUgaWYgaW4gdGhlIGJyb3dzZXIsCi0gICAg
ICBvciBkb21haW4vY2F1c2UgdW5jYXVnaHQgZXhjZXB0aW9uIGluIE5vZGUuIGByZXRocm93YCB3
aWxsIGFsc28gdGhyb3cgdGhlCi0gICAgICBlcnJvciBhZ2FpbiBzbyB0aGUgZXJyb3IgY2FuIGJl
IGhhbmRsZWQgYnkgdGhlIHByb21pc2UgcGVyIHRoZSBzcGVjLgotCi0gICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICBmdW5jdGlvbiB0aHJvd3MoKXsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdX
aG9vcHMhJyk7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlz
ZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewotICAgICAgICB0aHJvd3MoKTsKLSAgICAgIH0p
OwotCi0gICAgICBwcm9taXNlLmNhdGNoKFJTVlAucmV0aHJvdykudGhlbihmdW5jdGlvbigpewot
ICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBiZWNh
bWUgcmVqZWN0ZWQgZHVlIHRvIGFuCi0gICAgICAgIC8vIGVycm9yIQotICAgICAgfSwgZnVuY3Rp
b24gKGVycil7Ci0gICAgICAgIC8vIGhhbmRsZSB0aGUgZXJyb3IgaGVyZQotICAgICAgfSk7Ci0g
ICAgICBgYGAKLQotICAgICAgVGhlICdXaG9vcHMnIGVycm9yIHdpbGwgYmUgdGhyb3duIG9uIHRo
ZSBuZXh0IHR1cm4gb2YgdGhlIGV2ZW50IGxvb3AKLSAgICAgIGFuZCB5b3UgY2FuIHdhdGNoIGZv
ciBpdCBpbiB5b3VyIGNvbnNvbGUuIFlvdSBjYW4gYWxzbyBoYW5kbGUgaXQgdXNpbmcgYQotICAg
ICAgcmVqZWN0aW9uIGhhbmRsZXIgZ2l2ZW4gdG8gYC50aGVuYCBvciBgLmNhdGNoYCBvbiB0aGUg
cmV0dXJuZWQgcHJvbWlzZS4KLQotICAgICAgQG1ldGhvZCByZXRocm93Ci0gICAgICBAZm9yIFJT
VlAKLSAgICAgIEBwYXJhbSB7RXJyb3J9IHJlYXNvbiByZWFzb24gdGhlIHByb21pc2UgYmVjYW1l
IHJlamVjdGVkLgotICAgICAgQHRocm93cyBFcnJvcgotICAgICAgQHN0YXRpYwotICAgICovCi0g
ICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0aW9uIHJldGhyb3cocmVhc29uKSB7Ci0g
ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgICAgICB0aHJvdyByZWFzb247Ci0gICAg
ICB9KTsKLSAgICAgIHRocm93IHJlYXNvbjsKLSAgICB9OwotICB9KTsKLWRlZmluZSgicnN2cC91
dGlscyIsIAotICBbImV4cG9ydHMiXSwKLSAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKLSAgICAi
dXNlIHN0cmljdCI7Ci0gICAgZnVuY3Rpb24gb2JqZWN0T3JGdW5jdGlvbih4KSB7Ci0gICAgICBy
ZXR1cm4gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgfHwgKHR5cGVvZiB4ID09PSAib2JqZWN0IiAm
JiB4ICE9PSBudWxsKTsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5vYmplY3RPckZ1bmN0aW9u
ID0gb2JqZWN0T3JGdW5jdGlvbjtmdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHsKLSAgICAgIHJldHVy
biB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIjsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc0Z1
bmN0aW9uID0gaXNGdW5jdGlvbjtmdW5jdGlvbiBpc05vblRoZW5hYmxlKHgpIHsKLSAgICAgIHJl
dHVybiAhb2JqZWN0T3JGdW5jdGlvbih4KTsKLSAgICB9Ci0KLSAgICBfX2V4cG9ydHNfXy5pc05v
blRoZW5hYmxlID0gaXNOb25UaGVuYWJsZTtmdW5jdGlvbiBpc0FycmF5KHgpIHsKLSAgICAgIHJl
dHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICJbb2JqZWN0IEFycmF5
XSI7Ci0gICAgfQotCi0gICAgX19leHBvcnRzX18uaXNBcnJheSA9IGlzQXJyYXk7Ly8gRGF0ZS5u
b3cgaXMgbm90IGF2YWlsYWJsZSBpbiBicm93c2VycyA8IElFOQotICAgIC8vIGh0dHBzOi8vZGV2
ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0ds
b2JhbF9PYmplY3RzL0RhdGUvbm93I0NvbXBhdGliaWxpdHkKLSAgICB2YXIgbm93ID0gRGF0ZS5u
b3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTsKLSAgICBf
X2V4cG9ydHNfXy5ub3cgPSBub3c7Ci0gICAgdmFyIGtleXNPZiA9IE9iamVjdC5rZXlzIHx8IGZ1
bmN0aW9uKG9iamVjdCkgewotICAgICAgdmFyIHJlc3VsdCA9IFtdOwotCi0gICAgICBmb3IgKHZh
ciBwcm9wIGluIG9iamVjdCkgewotICAgICAgICByZXN1bHQucHVzaChwcm9wKTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9OwotICAgIF9fZXhwb3J0c19fLmtleXNPZiA9
IGtleXNPZjsKLSAgfSk7Ci1kZWZpbmUoInJzdnAiLCAKLSAgWyIuL3JzdnAvcHJvbWlzZSIsIi4v
cnN2cC9ldmVudHMiLCIuL3JzdnAvbm9kZSIsIi4vcnN2cC9hbGwiLCIuL3JzdnAvYWxsX3NldHRs
ZWQiLCIuL3JzdnAvcmFjZSIsIi4vcnN2cC9oYXNoIiwiLi9yc3ZwL3JldGhyb3ciLCIuL3JzdnAv
ZGVmZXIiLCIuL3JzdnAvY29uZmlnIiwiLi9yc3ZwL21hcCIsIi4vcnN2cC9yZXNvbHZlIiwiLi9y
c3ZwL3JlamVjdCIsIi4vcnN2cC9maWx0ZXIiLCJleHBvcnRzIl0sCi0gIGZ1bmN0aW9uKF9fZGVw
ZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5j
eTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2X18sIF9fZGVwZW5kZW5jeTdfXywg
X19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9fZGVwZW5kZW5jeTEwX18sIF9fZGVw
ZW5kZW5jeTExX18sIF9fZGVwZW5kZW5jeTEyX18sIF9fZGVwZW5kZW5jeTEzX18sIF9fZGVwZW5k
ZW5jeTE0X18sIF9fZXhwb3J0c19fKSB7Ci0gICAgInVzZSBzdHJpY3QiOwotICAgIHZhciBQcm9t
aXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIEV2ZW50VGFyZ2V0ID0g
X19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGRlbm9kZWlmeSA9IF9fZGVwZW5k
ZW5jeTNfX1siZGVmYXVsdCJdOwotICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3k0X19bImRlZmF1
bHQiXTsKLSAgICB2YXIgYWxsU2V0dGxlZCA9IF9fZGVwZW5kZW5jeTVfX1siZGVmYXVsdCJdOwot
ICAgIHZhciByYWNlID0gX19kZXBlbmRlbmN5Nl9fWyJkZWZhdWx0Il07Ci0gICAgdmFyIGhhc2gg
PSBfX2RlcGVuZGVuY3k3X19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmV0aHJvdyA9IF9fZGVwZW5k
ZW5jeThfX1siZGVmYXVsdCJdOwotICAgIHZhciBkZWZlciA9IF9fZGVwZW5kZW5jeTlfX1siZGVm
YXVsdCJdOwotICAgIHZhciBjb25maWcgPSBfX2RlcGVuZGVuY3kxMF9fLmNvbmZpZzsKLSAgICB2
YXIgY29uZmlndXJlID0gX19kZXBlbmRlbmN5MTBfXy5jb25maWd1cmU7Ci0gICAgdmFyIG1hcCA9
IF9fZGVwZW5kZW5jeTExX19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmVzb2x2ZSA9IF9fZGVwZW5k
ZW5jeTEyX19bImRlZmF1bHQiXTsKLSAgICB2YXIgcmVqZWN0ID0gX19kZXBlbmRlbmN5MTNfX1si
ZGVmYXVsdCJdOwotICAgIHZhciBmaWx0ZXIgPSBfX2RlcGVuZGVuY3kxNF9fWyJkZWZhdWx0Il07
Ci0KLSAgICBmdW5jdGlvbiBhc3luYyhjYWxsYmFjaywgYXJnKSB7Ci0gICAgICBjb25maWcuYXN5
bmMoY2FsbGJhY2ssIGFyZyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gb24oKSB7Ci0gICAgICBj
b25maWcub24uYXBwbHkoY29uZmlnLCBhcmd1bWVudHMpOwotICAgIH0KLQotICAgIGZ1bmN0aW9u
IG9mZigpIHsKLSAgICAgIGNvbmZpZy5vZmYuYXBwbHkoY29uZmlnLCBhcmd1bWVudHMpOwotICAg
IH0KLQotICAgIC8vIFNldCB1cCBpbnN0cnVtZW50YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJP
TUlTRV9JTlRSVU1FTlRBVElPTl9fYAotICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZp
bmVkJyAmJiB0eXBlb2Ygd2luZG93Ll9fUFJPTUlTRV9JTlNUUlVNRU5UQVRJT05fXyA9PT0gJ29i
amVjdCcpIHsKLSAgICAgIHZhciBjYWxsYmFja3MgPSB3aW5kb3cuX19QUk9NSVNFX0lOU1RSVU1F
TlRBVElPTl9fOwotICAgICAgY29uZmlndXJlKCdpbnN0cnVtZW50JywgdHJ1ZSk7Ci0gICAgICBm
b3IgKHZhciBldmVudE5hbWUgaW4gY2FsbGJhY2tzKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3Mu
aGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkgewotICAgICAgICAgIG9uKGV2ZW50TmFtZSwgY2Fs
bGJhY2tzW2V2ZW50TmFtZV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX19l
eHBvcnRzX18uUHJvbWlzZSA9IFByb21pc2U7Ci0gICAgX19leHBvcnRzX18uRXZlbnRUYXJnZXQg
PSBFdmVudFRhcmdldDsKLSAgICBfX2V4cG9ydHNfXy5hbGwgPSBhbGw7Ci0gICAgX19leHBvcnRz
X18uYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7Ci0gICAgX19leHBvcnRzX18ucmFjZSA9IHJhY2U7
Ci0gICAgX19leHBvcnRzX18uaGFzaCA9IGhhc2g7Ci0gICAgX19leHBvcnRzX18ucmV0aHJvdyA9
IHJldGhyb3c7Ci0gICAgX19leHBvcnRzX18uZGVmZXIgPSBkZWZlcjsKLSAgICBfX2V4cG9ydHNf
Xy5kZW5vZGVpZnkgPSBkZW5vZGVpZnk7Ci0gICAgX19leHBvcnRzX18uY29uZmlndXJlID0gY29u
ZmlndXJlOwotICAgIF9fZXhwb3J0c19fLm9uID0gb247Ci0gICAgX19leHBvcnRzX18ub2ZmID0g
b2ZmOwotICAgIF9fZXhwb3J0c19fLnJlc29sdmUgPSByZXNvbHZlOwotICAgIF9fZXhwb3J0c19f
LnJlamVjdCA9IHJlamVjdDsKLSAgICBfX2V4cG9ydHNfXy5hc3luYyA9IGFzeW5jOwotICAgIF9f
ZXhwb3J0c19fLm1hcCA9IG1hcDsKLSAgICBfX2V4cG9ydHNfXy5maWx0ZXIgPSBmaWx0ZXI7Ci0g
IH0pOwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLVB1YmxpYyBhcGkgZm9yIHRoZSBj
b250YWluZXIgaXMgc3RpbGwgaW4gZmx1eC4KLVRoZSBwdWJsaWMgYXBpLCBzcGVjaWZpZWQgb24g
dGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgc3RhYmxl
IGFwaS4KLS8vIEBtb2R1bGUgY29udGFpbmVyCi0gIEBwcml2YXRlCi0qLwotCi0vKgotIEZsYWcg
dG8gZW5hYmxlL2Rpc2FibGUgbW9kZWwgZmFjdG9yeSBpbmplY3Rpb25zIChkaXNhYmxlZCBieSBk
ZWZhdWx0KQotIElmIG1vZGVsIGZhY3RvcnkgaW5qZWN0aW9ucyBhcmUgZW5hYmxlZCwgbW9kZWxz
IHNob3VsZCBub3QgYmUKLSBhY2Nlc3NlZCBnbG9iYWxseSAob25seSB0aHJvdWdoIGBjb250YWlu
ZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6bW9kZWxOYW1lJykpYCk7Ci0qLwotRW1iZXIuTU9ERUxf
RkFDVE9SWV9JTkpFQ1RJT05TID0gZmFsc2UgfHwgISFFbWJlci5FTlYuTU9ERUxfRkFDVE9SWV9J
TkpFQ1RJT05TOwotCi1kZWZpbmUoImNvbnRhaW5lciIsCi0gIFtdLAotICBmdW5jdGlvbigpIHsK
LQotICAgIC8vIEEgc2FmZSBhbmQgc2ltcGxlIGluaGVyaXRpbmcgb2JqZWN0LgotICAgIGZ1bmN0
aW9uIEluaGVyaXRpbmdEaWN0KHBhcmVudCkgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7
Ci0gICAgICB0aGlzLmRpY3QgPSB7fTsKLSAgICB9Ci0KLSAgICBJbmhlcml0aW5nRGljdC5wcm90
b3R5cGUgPSB7Ci0KLSAgICAgIC8qKgotICAgICAgICBAcHJvcGVydHkgcGFyZW50Ci0gICAgICAg
IEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAgICovCi0K
LSAgICAgIHBhcmVudDogbnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIE9iamVjdCB1c2VkIHRv
IHN0b3JlIHRoZSBjdXJyZW50IG5vZGVzIGRhdGEuCi0KLSAgICAgICAgQHByb3BlcnR5IGRpY3QK
LSAgICAgICAgQHR5cGUgT2JqZWN0Ci0gICAgICAgIEBkZWZhdWx0IE9iamVjdAotICAgICAgKi8K
LSAgICAgIGRpY3Q6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICBSZXRyaWV2ZSB0aGUgdmFs
dWUgZ2l2ZW4gYSBrZXksIGlmIHRoZSB2YWx1ZSBpcyBwcmVzZW50IGF0IHRoZSBjdXJyZW50Ci0g
ICAgICAgIGxldmVsIHVzZSBpdCwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJj
aHkgYW5kIHRyeSBhZ2Fpbi4gSWYKLSAgICAgICAgbm8gbWF0Y2hpbmcga2V5IGlzIGZvdW5kLCBy
ZXR1cm4gdW5kZWZpbmVkLgotCi0gICAgICAgIEBtZXRob2QgZ2V0Ci0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBrZXkKLSAgICAgICAgQHJldHVybiB7YW55fQotICAgICAgKi8KLSAgICAgIGdldDog
ZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhpcy5kaWN0OwotCi0gICAgICAg
IGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAgICAgICByZXR1cm4gZGljdFtr
ZXldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7Ci0gICAgICAgICAg
cmV0dXJuIHRoaXMucGFyZW50LmdldChrZXkpOwotICAgICAgICB9Ci0gICAgICB9LAotCi0gICAg
ICAvKioKLSAgICAgICAgU2V0IHRoZSBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgYXQg
dGhlIGN1cnJlbnQgbGV2ZWwuCi0KLSAgICAgICAgQG1ldGhvZCBzZXQKLSAgICAgICAgQHBhcmFt
IHtTdHJpbmd9IGtleQotICAgICAgICBAcGFyYW0ge0FueX0gdmFsdWUKLSAgICAgICovCi0gICAg
ICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5kaWN0W2tleV0gPSB2
YWx1ZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBEZWxldGUgdGhlIGdpdmVuIGtl
eQotCi0gICAgICAgIEBtZXRob2QgcmVtb3ZlCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkK
LSAgICAgICovCi0gICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewotICAgICAgICBkZWxldGUg
dGhpcy5kaWN0W2tleV07Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQ2hlY2sgZm9y
IHRoZSBleGlzdGVuY2Ugb2YgZ2l2ZW4gYSBrZXksIGlmIHRoZSBrZXkgaXMgcHJlc2VudCBhdCB0
aGUgY3VycmVudAotICAgICAgICBsZXZlbCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHdhbGsgdXAg
dGhlIHBhcmVudCBoaWVyYXJjaHkgYW5kIHRyeSBhZ2Fpbi4gSWYKLSAgICAgICAgbm8gbWF0Y2hp
bmcga2V5IGlzIGZvdW5kLCByZXR1cm4gZmFsc2UuCi0KLSAgICAgICAgQG1ldGhvZCBoYXMKLSAg
ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQotICAgICAgICBAcmV0dXJuIHtCb29sZWFufQotICAg
ICAgKi8KLSAgICAgIGhhczogZnVuY3Rpb24oa2V5KSB7Ci0gICAgICAgIHZhciBkaWN0ID0gdGhp
cy5kaWN0OwotCi0gICAgICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKLSAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLnBhcmVudCkg
ewotICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5oYXMoa2V5KTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBJdGVy
YXRlIGFuZCBpbnZva2UgYSBjYWxsYmFjayBmb3IgZWFjaCBsb2NhbCBrZXktdmFsdWUgcGFpci4K
LQotICAgICAgICBAbWV0aG9kIGVhY2hMb2NhbAotICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBj
YWxsYmFjawotICAgICAgICBAcGFyYW0ge09iamVjdH0gYmluZGluZwotICAgICAgKi8KLSAgICAg
IGVhY2hMb2NhbDogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAgICAgICAgdmFyIGRp
Y3QgPSB0aGlzLmRpY3Q7Ci0KLSAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBkaWN0KSB7Ci0gICAg
ICAgICAgaWYgKGRpY3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICAgIGNhbGxi
YWNrLmNhbGwoYmluZGluZywgcHJvcCwgZGljdFtwcm9wXSk7Ci0gICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICB9Ci0gICAgfTsKLQotCi0gICAgLy8gQSBsaWdodHdlaWdodCBjb250YWluZXIg
dGhhdCBoZWxwcyB0byBhc3NlbWJsZSBhbmQgZGVjb3VwbGUgY29tcG9uZW50cy4KLSAgICAvLyBQ
dWJsaWMgYXBpIGZvciB0aGUgY29udGFpbmVyIGlzIHN0aWxsIGluIGZsdXguCi0gICAgLy8gVGhl
IHB1YmxpYyBhcGksIHNwZWNpZmllZCBvbiB0aGUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHNob3Vs
ZCBiZSBjb25zaWRlcmVkIHRoZSBzdGFibGUgYXBpLgotICAgIGZ1bmN0aW9uIENvbnRhaW5lcihw
YXJlbnQpIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jaGlsZHJl
biA9IFtdOwotCi0gICAgICB0aGlzLnJlc29sdmVyID0gcGFyZW50ICYmIHBhcmVudC5yZXNvbHZl
ciB8fCBmdW5jdGlvbigpIHt9OwotCi0gICAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IEluaGVyaXRp
bmdEaWN0KHBhcmVudCAmJiBwYXJlbnQucmVnaXN0cnkpOwotICAgICAgdGhpcy5jYWNoZSA9IG5l
dyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LmNhY2hlKTsKLSAgICAgIHRoaXMuZmFj
dG9yeUNhY2hlID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQuY2FjaGUpOwot
ICAgICAgdGhpcy50eXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYg
cGFyZW50LnR5cGVJbmplY3Rpb25zKTsKLSAgICAgIHRoaXMuaW5qZWN0aW9ucyA9IHt9OwotCi0g
ICAgICB0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJl
bnQgJiYgcGFyZW50LmZhY3RvcnlUeXBlSW5qZWN0aW9ucyk7Ci0gICAgICB0aGlzLmZhY3RvcnlJ
bmplY3Rpb25zID0ge307Ci0KLSAgICAgIHRoaXMuX29wdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0Rp
Y3QocGFyZW50ICYmIHBhcmVudC5fb3B0aW9ucyk7Ci0gICAgICB0aGlzLl90eXBlT3B0aW9ucyA9
IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50Ll90eXBlT3B0aW9ucyk7Ci0gICAg
fQotCi0gICAgQ29udGFpbmVyLnByb3RvdHlwZSA9IHsKLQotICAgICAgLyoqCi0gICAgICAgIEBw
cm9wZXJ0eSBwYXJlbnQKLSAgICAgICAgQHR5cGUgQ29udGFpbmVyCi0gICAgICAgIEBkZWZhdWx0
IG51bGwKLSAgICAgICovCi0gICAgICBwYXJlbnQ6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAg
ICBAcHJvcGVydHkgY2hpbGRyZW4KLSAgICAgICAgQHR5cGUgQXJyYXkKLSAgICAgICAgQGRlZmF1
bHQgW10KLSAgICAgICovCi0gICAgICBjaGlsZHJlbjogbnVsbCwKLQotICAgICAgLyoqCi0gICAg
ICAgIEBwcm9wZXJ0eSByZXNvbHZlcgotICAgICAgICBAdHlwZSBmdW5jdGlvbgotICAgICAgKi8K
LSAgICAgIHJlc29sdmVyOiBudWxsLAotCi0gICAgICAvKioKLSAgICAgICAgQHByb3BlcnR5IHJl
Z2lzdHJ5Ci0gICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAqLwotICAgICAgcmVn
aXN0cnk6IG51bGwsCi0KLSAgICAgIC8qKgotICAgICAgICBAcHJvcGVydHkgY2FjaGUKLSAgICAg
ICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKLSAgICAgICovCi0gICAgICBjYWNoZTogbnVsbCwKLQot
ICAgICAgLyoqCi0gICAgICAgIEBwcm9wZXJ0eSB0eXBlSW5qZWN0aW9ucwotICAgICAgICBAdHlw
ZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8KLSAgICAgIHR5cGVJbmplY3Rpb25zOiBudWxsLAot
Ci0gICAgICAvKioKLSAgICAgICAgQHByb3BlcnR5IGluamVjdGlvbnMKLSAgICAgICAgQHR5cGUg
T2JqZWN0Ci0gICAgICAgIEBkZWZhdWx0IHt9Ci0gICAgICAqLwotICAgICAgaW5qZWN0aW9uczog
bnVsbCwKLQotICAgICAgLyoqCi0gICAgICAgIEBwcml2YXRlCi0KLSAgICAgICAgQHByb3BlcnR5
IF9vcHRpb25zCi0gICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0Ci0gICAgICAgIEBkZWZhdWx0
IG51bGwKLSAgICAgICovCi0gICAgICBfb3B0aW9uczogbnVsbCwKLQotICAgICAgLyoqCi0gICAg
ICAgIEBwcml2YXRlCi0KLSAgICAgICAgQHByb3BlcnR5IF90eXBlT3B0aW9ucwotICAgICAgICBA
dHlwZSBJbmhlcml0aW5nRGljdAotICAgICAgKi8KLSAgICAgIF90eXBlT3B0aW9uczogbnVsbCwK
LQotICAgICAgLyoqCi0gICAgICAgIFJldHVybnMgYSBuZXcgY2hpbGQgb2YgdGhlIGN1cnJlbnQg
Y29udGFpbmVyLiBUaGVzZSBjaGlsZHJlbiBhcmUgY29uZmlndXJlZAotICAgICAgICB0byBjb3Jy
ZWN0bHkgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50IGNvbnRhaW5lci4KLQotICAgICAgICBAbWV0
aG9kIGNoaWxkCi0gICAgICAgIEByZXR1cm4ge0NvbnRhaW5lcn0KLSAgICAgICovCi0gICAgICBj
aGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVy
KHRoaXMpOwotICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY29udGFpbmVyKTsKLSAgICAgICAg
cmV0dXJuIGNvbnRhaW5lcjsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBTZXRzIGEg
a2V5LXZhbHVlIHBhaXIgb24gdGhlIGN1cnJlbnQgY29udGFpbmVyLiBJZiBhIHBhcmVudCBjb250
YWluZXIsCi0gICAgICAgIGhhcyB0aGUgc2FtZSBrZXksIG9uY2Ugc2V0IG9uIGEgY2hpbGQsIHRo
ZSBwYXJlbnQgYW5kIGNoaWxkIHdpbGwgZGl2ZXJnZQotICAgICAgICBhcyBleHBlY3RlZC4KLQot
ICAgICAgICBAbWV0aG9kIHNldAotICAgICAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0Ci0gICAg
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKLSAgICAgICAgQHBhcmFtIHthbnl9IHZhbHVlCi0gICAg
ICAqLwotICAgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpIHsKLSAgICAgICAg
b2JqZWN0W2tleV0gPSB2YWx1ZTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBSZWdp
c3RlcnMgYSBmYWN0b3J5IGZvciBsYXRlciBpbmplY3Rpb24uCi0KLSAgICAgICAgRXhhbXBsZToK
LQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29u
dGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywgUGVy
c29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdm
cnVpdDpmYXZvcml0ZScsIE9yYW5nZSk7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29t
bXVuaWNhdGlvbjptYWluJywgRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7Ci0gICAgICAgIGBg
YAotCi0gICAgICAgIEBtZXRob2QgcmVnaXN0ZXIKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1
bGxOYW1lCi0gICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkKLSAgICAgICAgQHBhcmFt
IHtPYmplY3R9IG9wdGlvbnMKLSAgICAgICovCi0gICAgICByZWdpc3RlcjogZnVuY3Rpb24oZnVs
bE5hbWUsIGZhY3RvcnksIG9wdGlvbnMpIHsKLSAgICAgICAgaWYgKGZ1bGxOYW1lLmluZGV4T2Yo
JzonKSA9PT0gLTEpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtYWxmb3JtZWQg
ZnVsbE5hbWUsIGV4cGVjdGVkOiBgdHlwZTpuYW1lYCBnb3Q6ICIgKyBmdWxsTmFtZSArICIiKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKLSAgICAg
ICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGFuIHVua25v
d24gZmFjdG9yeTogYCcgKyBmdWxsTmFtZSArICdgJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2
YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7Ci0KLSAgICAgICAg
aWYgKHRoaXMuY2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkgewotICAgICAgICAgIHRocm93IG5l
dyBFcnJvcignQ2Fubm90IHJlLXJlZ2lzdGVyOiBgJyArIGZ1bGxOYW1lICsnYCwgYXMgaXQgaGFz
IGFscmVhZHkgYmVlbiBsb29rZWQgdXAuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJl
Z2lzdHJ5LnNldChub3JtYWxpemVkTmFtZSwgZmFjdG9yeSk7Ci0gICAgICAgIHRoaXMuX29wdGlv
bnMuc2V0KG5vcm1hbGl6ZWROYW1lLCBvcHRpb25zIHx8IHt9KTsKLSAgICAgIH0sCi0KLSAgICAg
IC8qKgotICAgICAgICBVbnJlZ2lzdGVyIGEgZnVsbE5hbWUKLQotICAgICAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7Ci0gICAgICAgIGNv
bnRhaW5lci5yZWdpc3RlcignbW9kZWw6dXNlcicsIFVzZXIpOwotCi0gICAgICAgIGNvbnRhaW5l
ci5sb29rdXAoJ21vZGVsOnVzZXInKSBpbnN0YW5jZW9mIFVzZXIgLy89PiB0cnVlCi0KLSAgICAg
ICAgY29udGFpbmVyLnVucmVnaXN0ZXIoJ21vZGVsOnVzZXInKQotICAgICAgICBjb250YWluZXIu
bG9va3VwKCdtb2RlbDp1c2VyJykgPT09IHVuZGVmaW5lZCAvLz0+IHRydWUKLSAgICAgICAgYGBg
Ci0KLSAgICAgICAgQG1ldGhvZCB1bnJlZ2lzdGVyCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBm
dWxsTmFtZQotICAgICAgICovCi0gICAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihmdWxsTmFtZSkg
ewotICAgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7
Ci0KLSAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1vdmUobm9ybWFsaXplZE5hbWUpOwotICAgICAg
ICB0aGlzLmNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7Ci0gICAgICAgIHRoaXMuZmFjdG9y
eUNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7Ci0gICAgICAgIHRoaXMuX29wdGlvbnMucmVt
b3ZlKG5vcm1hbGl6ZWROYW1lKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBHaXZl
biBhIGZ1bGxOYW1lIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgotCi0gICAgICAg
IEJ5IGRlZmF1bHQgYHJlc29sdmVgIHdpbGwgcmV0cmlldmUgdGhlIGZhY3RvcnkgZnJvbQotICAg
ICAgICBpdHMgY29udGFpbmVyJ3MgcmVnaXN0cnkuCi0KLSAgICAgICAgYGBgamF2YXNjcmlwdAot
ICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAgICAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdpdHRlcik7Ci0KLSAgICAgICAgY29udGFpbmVy
LnJlc29sdmUoJ2FwaTp0d2l0dGVyJykgLy8gPT4gVHdpdHRlcgotICAgICAgICBgYGAKLQotICAg
ICAgICBPcHRpb25hbGx5IHRoZSBjb250YWluZXIgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBjdXN0
b20gcmVzb2x2ZXIuCi0gICAgICAgIElmIHByb3ZpZGVkLCBgcmVzb2x2ZWAgd2lsbCBmaXJzdCBw
cm92aWRlIHRoZSBjdXN0b20gcmVzb2x2ZXIKLSAgICAgICAgdGhlIG9wcGVydHVuaXR5IHRvIHJl
c29sdmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjawotICAgICAgICB0
byB0aGUgcmVnaXN0cnkuCi0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29u
dGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotICAgICAgICBjb250YWluZXIucmVzb2x2ZXIgPSBm
dW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBz
eXN0ZW0gb2YgY2hvaWNlCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gdGhlIHR3aXR0ZXIgZmFj
dG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxlIHN5c3RlbQotICAgICAgICBjb250YWluZXIucmVz
b2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0dGVyCi0gICAgICAgIGBgYAotCi0gICAgICAg
IEBtZXRob2QgcmVzb2x2ZQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKLSAgICAg
ICAgQHJldHVybiB7RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9yeQotICAgICAgKi8KLSAgICAg
IHJlc29sdmU6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc29s
dmVyKGZ1bGxOYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChmdWxsTmFtZSk7Ci0gICAgICB9LAot
Ci0gICAgICAvKioKLSAgICAgICAgQSBob29rIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUg
aG93IHRoZSByZXNvbHZlciB3aWxsCi0gICAgICAgIGF0dGVtcHQgdG8gZmluZCB0aGUgZmFjdG9y
eS4KLQotICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgRW1iZXIgYC5kZXNjcmliZWAg
cmV0dXJucyB0aGUgZnVsbAotICAgICAgICBjbGFzcyBuYW1lIChpbmNsdWRpbmcgbmFtZXNwYWNl
KSB3aGVyZSBFbWJlcidzIHJlc29sdmVyIGV4cGVjdHMKLSAgICAgICAgdG8gZmluZCB0aGUgYGZ1
bGxOYW1lYC4KLQotICAgICAgICBAbWV0aG9kIGRlc2NyaWJlCi0gICAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBmdWxsTmFtZQotICAgICAgICBAcmV0dXJuIHtzdHJpbmd9IGRlc2NyaWJlZCBmdWxsTmFt
ZQotICAgICAgKi8KLSAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAg
ICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQSBob29r
IHRvIGVuYWJsZSBjdXN0b20gZnVsbE5hbWUgbm9ybWFsaXphdGlvbiBiZWhhdmlvdXIKLQotICAg
ICAgICBAbWV0aG9kIG5vcm1hbGl6ZQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUK
LSAgICAgICAgQHJldHVybiB7c3RyaW5nfSBub3JtYWxpemVkIGZ1bGxOYW1lCi0gICAgICAqLwot
ICAgICAgbm9ybWFsaXplOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICByZXR1cm4gZnVs
bE5hbWU7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQG1ldGhvZCBtYWtlVG9TdHJp
bmcKLQotICAgICAgICBAcGFyYW0ge2FueX0gZmFjdG9yeQotICAgICAgICBAcGFyYW0ge3N0cmlu
Z30gZnVsbE5hbWUKLSAgICAgICAgQHJldHVybiB7ZnVuY3Rpb259IHRvU3RyaW5nIGZ1bmN0aW9u
Ci0gICAgICAqLwotICAgICAgbWFrZVRvU3RyaW5nOiBmdW5jdGlvbihmYWN0b3J5LCBmdWxsTmFt
ZSkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS50b1N0cmluZygpOwotICAgICAgfSwKLQotICAg
ICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBp
bnN0YW5jZS4KLQotICAgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgZm9yIGxvb2t1cCB0
byByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICAgIFRoZSBzaW5nbGV0b24gaXMg
c2NvcGVkIHRvIHRoZSBjb250YWluZXIsIGFsbG93aW5nIG11bHRpcGxlIGNvbnRhaW5lcnMKLSAg
ICAgICAgdG8gYWxsIGhhdmUgdGhlaXIgb3duIGxvY2FsbHkgc2NvcGVkIHNpbmdsZXRvbnMuCi0K
LSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRh
aW5lcigpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2FwaTp0d2l0dGVyJywgVHdpdHRl
cik7Ci0KLSAgICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIubG9va3VwKCdhcGk6dHdpdHRl
cicpOwotCi0gICAgICAgIHR3aXR0ZXIgaW5zdGFuY2VvZiBUd2l0dGVyOyAvLyA9PiB0cnVlCi0K
LSAgICAgICAgLy8gYnkgZGVmYXVsdCB0aGUgY29udGFpbmVyIHdpbGwgcmV0dXJuIHNpbmdsZXRv
bnMKLSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXIn
KTsKLSAgICAgICAgdHdpdHRlciBpbnN0YW5jZW9mIFR3aXR0ZXI7IC8vID0+IHRydWUKLQotICAg
ICAgICB0d2l0dGVyID09PSB0d2l0dGVyMjsgLy89PiB0cnVlCi0gICAgICAgIGBgYAotCi0gICAg
ICAgIElmIHNpbmdsZXRvbnMgYXJlIG5vdCB3YW50ZWQgYW4gb3B0aW9uYWwgZmxhZyBjYW4gYmUg
cHJvdmlkZWQgYXQgbG9va3VwLgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFy
IGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVy
KCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwotCi0gICAgICAgIHZhciB0d2l0dGVyID0gY29udGFp
bmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0gICAgICAg
IHZhciB0d2l0dGVyMiA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVyJywgeyBzaW5nbGV0
b246IGZhbHNlIH0pOwotCi0gICAgICAgIHR3aXR0ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IGZhbHNl
Ci0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRob2QgbG9va3VwCi0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZQotICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgICAg
ICBAcmV0dXJuIHthbnl9Ci0gICAgICAqLwotICAgICAgbG9va3VwOiBmdW5jdGlvbihmdWxsTmFt
ZSwgb3B0aW9ucykgewotICAgICAgICBmdWxsTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1l
KTsKLQotICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLQotICAgICAgICBpZiAodGhp
cy5jYWNoZS5oYXMoZnVsbE5hbWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBmYWxzZSkgewot
ICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChmdWxsTmFtZSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICB2YXIgdmFsdWUgPSBpbnN0YW50aWF0ZSh0aGlzLCBmdWxsTmFtZSk7Ci0KLSAgICAg
ICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgaWYgKGlz
U2luZ2xldG9uKHRoaXMsIGZ1bGxOYW1lKSAmJiBvcHRpb25zLnNpbmdsZXRvbiAhPT0gZmFsc2Up
IHsKLSAgICAgICAgICB0aGlzLmNhY2hlLnNldChmdWxsTmFtZSwgdmFsdWUpOwotICAgICAgICB9
Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAg
IEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZhY3RvcnkuCi0KLSAg
ICAgICAgQG1ldGhvZCBsb29rdXBGYWN0b3J5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxs
TmFtZQotICAgICAgICBAcmV0dXJuIHthbnl9Ci0gICAgICAqLwotICAgICAgbG9va3VwRmFjdG9y
eTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGb3IodGhpcywg
ZnVsbE5hbWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEdpdmVuIGEgZnVsbE5h
bWUgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBhd2FyZSBvZiBpdHMgZmFjdG9yeQotICAgICAg
ICBvciBzaW5nbGV0b24gaW5zdGFuY2UuCi0KLSAgICAgICAgQG1ldGhvZCBoYXMKLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCi0gICAgICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAg
ICAqLwotICAgICAgaGFzOiBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgICAgICBpZiAodGhpcy5j
YWNoZS5oYXMoZnVsbE5hbWUpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICByZXR1cm4gISF0aGlzLnJlc29sdmUoZnVsbE5hbWUpOwotICAgICAgfSwKLQot
ICAgICAgLyoqCi0gICAgICAgIEFsbG93IHJlZ2lzdGVyaW5nIG9wdGlvbnMgZm9yIGFsbCBmYWN0
b3JpZXMgb2YgYSB0eXBlLgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNv
bnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKLQotICAgICAgICAvLyBpZiBhbGwgb2YgdHlwZSBg
Y29ubmVjdGlvbmAgbXVzdCBub3QgYmUgc2luZ2xldG9ucwotICAgICAgICBjb250YWluZXIub3B0
aW9uc0ZvclR5cGUoJ2Nvbm5lY3Rpb24nLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0KLSAgICAg
ICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb25uZWN0aW9uOnR3aXR0ZXInLCBUd2l0dGVyQ29ubmVj
dGlvbik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29ubmVjdGlvbjpmYWNlYm9vaycs
IEZhY2Vib29rQ29ubmVjdGlvbik7Ci0KLSAgICAgICAgdmFyIHR3aXR0ZXIgPSBjb250YWluZXIu
bG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsKLSAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29u
dGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjp0d2l0dGVyJyk7Ci0KLSAgICAgICAgdHdpdHRlciA9
PT0gdHdpdHRlcjI7IC8vID0+IGZhbHNlCi0KLSAgICAgICAgdmFyIGZhY2Vib29rID0gY29udGFp
bmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOwotICAgICAgICB2YXIgZmFjZWJvb2sy
ID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNlYm9vaycpOwotCi0gICAgICAgIGZh
Y2Vib29rID09PSBmYWNlYm9vazI7IC8vID0+IGZhbHNlCi0gICAgICAgIGBgYAotCi0gICAgICAg
IEBtZXRob2Qgb3B0aW9uc0ZvclR5cGUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAg
ICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKLSAgICAgICovCi0gICAgICBvcHRpb25zRm9y
VHlwZTogZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewotICAgICAgICBpZiAodGhpcy5wYXJlbnQp
IHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdvcHRpb25zRm9yVHlwZScpOyB9Ci0KLSAgICAgICAg
dGhpcy5fdHlwZU9wdGlvbnMuc2V0KHR5cGUsIG9wdGlvbnMpOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEBtZXRob2Qgb3B0aW9ucwotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlw
ZQotICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgICAgKi8KLSAgICAgIG9wdGlv
bnM6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zRm9yVHlw
ZSh0eXBlLCBvcHRpb25zKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBVc2VkIG9u
bHkgdmlhIGBpbmplY3Rpb25gLgotCi0gICAgICAgIFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgZm9y
bSBvZiBpbmplY3Rpb24sIHNwZWNpZmljYWxseSBlbmFibGluZwotICAgICAgICBhbGwgb2JqZWN0
cyBvZiBvbmUgdHlwZSB0byBiZSBpbmplY3RlZCB3aXRoIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIK
LSAgICAgICAgb2JqZWN0LgotCi0gICAgICAgIEZvciBleGFtcGxlLCBwcm92aWRlZCBlYWNoIG9i
amVjdCBvZiB0eXBlIGBjb250cm9sbGVyYCBuZWVkZWQgYSBgcm91dGVyYC4KLSAgICAgICAgb25l
IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAgICAg
ICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotCi0gICAgICAgIGNvbnRhaW5lci5y
ZWdpc3Rlcigncm91dGVyOm1haW4nLCBSb3V0ZXIpOwotICAgICAgICBjb250YWluZXIucmVnaXN0
ZXIoJ2NvbnRyb2xsZXI6dXNlcicsIFVzZXJDb250cm9sbGVyKTsKLSAgICAgICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdjb250cm9sbGVyOnBvc3QnLCBQb3N0Q29udHJvbGxlcik7Ci0KLSAgICAgICAg
Y29udGFpbmVyLnR5cGVJbmplY3Rpb24oJ2NvbnRyb2xsZXInLCAncm91dGVyJywgJ3JvdXRlcjpt
YWluJyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBjb250YWluZXIubG9va3VwKCdjb250cm9sbGVy
OnVzZXInKTsKLSAgICAgICAgdmFyIHBvc3QgPSBjb250YWluZXIubG9va3VwKCdjb250cm9sbGVy
OnBvc3QnKTsKLQotICAgICAgICB1c2VyLnJvdXRlciBpbnN0YW5jZW9mIFJvdXRlcjsgLy89PiB0
cnVlCi0gICAgICAgIHBvc3Qucm91dGVyIGluc3RhbmNlb2YgUm91dGVyOyAvLz0+IHRydWUKLQot
ICAgICAgICAvLyBib3RoIGNvbnRyb2xsZXJzIHNoYXJlIHRoZSBzYW1lIHJvdXRlcgotICAgICAg
ICB1c2VyLnJvdXRlciA9PT0gcG9zdC5yb3V0ZXI7IC8vPT4gdHJ1ZQotICAgICAgICBgYGAKLQot
ICAgICAgICBAcHJpdmF0ZQotICAgICAgICBAbWV0aG9kIHR5cGVJbmplY3Rpb24KLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0g
ICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQotICAgICAgKi8KLSAgICAgIHR5cGVJbmpl
Y3Rpb246IGZ1bmN0aW9uKHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewotICAgICAgICBpZiAo
dGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCd0eXBlSW5qZWN0aW9uJyk7IH0K
LQotICAgICAgICBhZGRUeXBlSW5qZWN0aW9uKHRoaXMudHlwZUluamVjdGlvbnMsIHR5cGUsIHBy
b3BlcnR5LCBmdWxsTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgRGVmaW5l
cyBpbmplY3Rpb24gcnVsZXMuCi0KLSAgICAgICAgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gaW5q
ZWN0IGRlcGVuZGVuY2llcyBvbnRvIG9iamVjdHMgd2hlbiB0aGV5Ci0gICAgICAgIGFyZSBpbnN0
YW50aWF0ZWQuCi0KLSAgICAgICAgVHdvIGZvcm1zIG9mIGluamVjdGlvbnMgYXJlIHBvc3NpYmxl
OgotCi0gICAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1l
Ci0gICAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhIHR5cGUKLQotICAgICAgICBF
eGFtcGxlOgotCi0gICAgICAgIGBgYGphdmFzY3JpcHQKLSAgICAgICAgdmFyIGNvbnRhaW5lciA9
IG5ldyBDb250YWluZXIoKTsKLQotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3NvdXJjZTpt
YWluJywgU291cmNlKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDp1c2VyJywg
VXNlcik7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignbW9kZWw6cG9zdCcsIFBvc3QpOwot
Ci0gICAgICAgIC8vIGluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQot
ICAgICAgICAvLyBlZy4gZWFjaCB1c2VyIG1vZGVsIGdldHMgYSBwb3N0IG1vZGVsCi0gICAgICAg
IGNvbnRhaW5lci5pbmplY3Rpb24oJ21vZGVsOnVzZXInLCAncG9zdCcsICdtb2RlbDpwb3N0Jyk7
Ci0KLSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKLSAg
ICAgICAgY29udGFpbmVyLmluamVjdGlvbignbW9kZWwnLCAnc291cmNlJywgJ3NvdXJjZTptYWlu
Jyk7Ci0KLSAgICAgICAgdmFyIHVzZXIgPSBjb250YWluZXIubG9va3VwKCdtb2RlbDp1c2VyJyk7
Ci0gICAgICAgIHZhciBwb3N0ID0gY29udGFpbmVyLmxvb2t1cCgnbW9kZWw6cG9zdCcpOwotCi0g
ICAgICAgIHVzZXIuc291cmNlIGluc3RhbmNlb2YgU291cmNlOyAvLz0+IHRydWUKLSAgICAgICAg
cG9zdC5zb3VyY2UgaW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQotCi0gICAgICAgIHVzZXIu
cG9zdCBpbnN0YW5jZW9mIFBvc3Q7IC8vPT4gdHJ1ZQotCi0gICAgICAgIC8vIGFuZCBib3RoIG1v
ZGVscyBzaGFyZSB0aGUgc2FtZSBzb3VyY2UKLSAgICAgICAgdXNlci5zb3VyY2UgPT09IHBvc3Qu
c291cmNlOyAvLz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQG1ldGhvZCBpbmplY3Rp
b24KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZhY3RvcnlOYW1lCi0gICAgICAgIEBwYXJhbSB7
U3RyaW5nfSBwcm9wZXJ0eQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gaW5qZWN0aW9uTmFtZQot
ICAgICAgKi8KLSAgICAgIGluamVjdGlvbjogZnVuY3Rpb24oZmFjdG9yeU5hbWUsIHByb3BlcnR5
LCBpbmplY3Rpb25OYW1lKSB7Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hp
bGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9Ci0KLSAgICAgICAgaWYgKGZhY3RvcnlOYW1lLmlu
ZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAgICByZXR1cm4gdGhpcy50eXBlSW5qZWN0aW9u
KGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBhZGRJbmplY3Rpb24odGhpcy5pbmplY3Rpb25zLCBmYWN0b3J5TmFtZSwgcHJvcGVydHks
IGluamVjdGlvbk5hbWUpOwotICAgICAgfSwKLQotCi0gICAgICAvKioKLSAgICAgICAgVXNlZCBv
bmx5IHZpYSBgZmFjdG9yeUluamVjdGlvbmAuCi0KLSAgICAgICAgUHJvdmlkZXMgYSBzcGVjaWFs
aXplZCBmb3JtIG9mIGluamVjdGlvbiwgc3BlY2lmaWNhbGx5IGVuYWJsaW5nCi0gICAgICAgIGFs
bCBmYWN0b3J5IG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGggYSByZWZlcmVuY2UgdG8g
YW5vdGhlcgotICAgICAgICBvYmplY3QuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIHByb3ZpZGVk
IGVhY2ggZmFjdG9yeSBvZiB0eXBlIGBtb2RlbGAgbmVlZGVkIGEgYHN0b3JlYC4KLSAgICAgICAg
b25lIHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgYGBgamF2YXNjcmlwdAotICAg
ICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwotCi0gICAgICAgIGNvbnRhaW5l
ci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFNvbWVTdG9yZSk7Ci0KLSAgICAgICAgY29udGFpbmVy
LmZhY3RvcnlUeXBlSW5qZWN0aW9uKCdtb2RlbCcsICdzdG9yZScsICdzdG9yZTptYWluJyk7Ci0K
LSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwotICAg
ICAgICB2YXIgVXNlckZhY3RvcnkgPSBjb250YWluZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6dXNl
cicpOwotCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU29tZVN0b3JlOyAv
Lz0+IHRydWUKLSAgICAgICAgYGBgCi0KLSAgICAgICAgQHByaXZhdGUKLSAgICAgICAgQG1ldGhv
ZCBmYWN0b3J5VHlwZUluamVjdGlvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQotICAg
ICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1
bGxOYW1lCi0gICAgICAqLwotICAgICAgZmFjdG9yeVR5cGVJbmplY3Rpb246IGZ1bmN0aW9uKHR5
cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewotICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxs
ZWdhbENoaWxkT3BlcmF0aW9uKCdmYWN0b3J5VHlwZUluamVjdGlvbicpOyB9Ci0KLSAgICAgICAg
YWRkVHlwZUluamVjdGlvbih0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9ucywgdHlwZSwgcHJvcGVy
dHksIGZ1bGxOYW1lKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAgICAgICBEZWZpbmVzIGZh
Y3RvcnkgaW5qZWN0aW9uIHJ1bGVzLgotCi0gICAgICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmpl
Y3Rpb24gcnVsZXMsIGJ1dCBhcmUgcnVuIGFnYWluc3QgZmFjdG9yaWVzLCB2aWEKLSAgICAgICAg
YENvbnRhaW5lciNsb29rdXBGYWN0b3J5YC4KLQotICAgICAgICBUaGVzZSBydWxlcyBhcmUgdXNl
ZCB0byBpbmplY3Qgb2JqZWN0cyBvbnRvIGZhY3RvcmllcyB3aGVuIHRoZXkKLSAgICAgICAgYXJl
IGxvb2tlZCB1cC4KLQotICAgICAgICBUd28gZm9ybXMgb2YgaW5qZWN0aW9ucyBhcmUgcG9zc2li
bGU6Ci0KLSAgICAgICogSW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxOYW1l
Ci0gICAgICAqIEluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYSB0eXBlCi0KLSAgICAgICAgRXhh
bXBsZToKLQotICAgICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICAgIHZhciBjb250YWluZXIgPSBu
ZXcgQ29udGFpbmVyKCk7Ci0KLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdzdG9yZTptYWlu
JywgU3RvcmUpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3N0b3JlOnNlY29uZGFyeScs
IE90aGVyU3RvcmUpOwotICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBV
c2VyKTsKLSAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdtb2RlbDpwb3N0JywgUG9zdCk7Ci0K
LSAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIHR5cGUKLSAgICAg
ICAgY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb24oJ21vZGVsJywgJ3N0b3JlJywgJ3N0b3JlOm1h
aW4nKTsKLQotICAgICAgICAvLyBpbmplY3Rpbmcgb25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVs
bE5hbWUKLSAgICAgICAgY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb24oJ21vZGVsOnBvc3QnLCAn
c2Vjb25kYXJ5U3RvcmUnLCAnc3RvcmU6c2Vjb25kYXJ5Jyk7Ci0KLSAgICAgICAgdmFyIFVzZXJG
YWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOnVzZXInKTsKLSAgICAgICAg
dmFyIFBvc3RGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOnBvc3QnKTsK
LSAgICAgICAgdmFyIHN0b3JlID0gY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwotCi0g
ICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU3RvcmU7IC8vPT4gdHJ1ZQotICAg
ICAgICBVc2VyRmFjdG9yeS5zZWNvbmRhcnlTdG9yZSBpbnN0YW5jZW9mIE90aGVyU3RvcmU7IC8v
PT4gZmFsc2UKLQotICAgICAgICBQb3N0RmFjdG9yeS5zdG9yZSBpbnN0YW5jZW9mIFN0b3JlOyAv
Lz0+IHRydWUKLSAgICAgICAgUG9zdEZhY3Rvcnkuc2Vjb25kYXJ5U3RvcmUgaW5zdGFuY2VvZiBP
dGhlclN0b3JlOyAvLz0+IHRydWUKLQotICAgICAgICAvLyBhbmQgYm90aCBtb2RlbHMgc2hhcmUg
dGhlIHNhbWUgc291cmNlIGluc3RhbmNlCi0gICAgICAgIFVzZXJGYWN0b3J5LnN0b3JlID09PSBQ
b3N0RmFjdG9yeS5zdG9yZTsgLy89PiB0cnVlCi0gICAgICAgIGBgYAotCi0gICAgICAgIEBtZXRo
b2QgZmFjdG9yeUluamVjdGlvbgotICAgICAgICBAcGFyYW0ge1N0cmluZ30gZmFjdG9yeU5hbWUK
LSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0gICAgICAgIEBwYXJhbSB7U3RyaW5n
fSBpbmplY3Rpb25OYW1lCi0gICAgICAqLwotICAgICAgZmFjdG9yeUluamVjdGlvbjogZnVuY3Rp
b24oZmFjdG9yeU5hbWUsIHByb3BlcnR5LCBpbmplY3Rpb25OYW1lKSB7Ci0gICAgICAgIGlmICh0
aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ2luamVjdGlvbicpOyB9Ci0KLSAg
ICAgICAgaWYgKGZhY3RvcnlOYW1lLmluZGV4T2YoJzonKSA9PT0gLTEpIHsKLSAgICAgICAgICBy
ZXR1cm4gdGhpcy5mYWN0b3J5VHlwZUluamVjdGlvbihmYWN0b3J5TmFtZSwgcHJvcGVydHksIGlu
amVjdGlvbk5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkSW5qZWN0aW9uKHRoaXMuZmFj
dG9yeUluamVjdGlvbnMsIGZhY3RvcnlOYW1lLCBwcm9wZXJ0eSwgaW5qZWN0aW9uTmFtZSk7Ci0g
ICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgQSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwsIGRl
c3Ryb3lpbmcgdGhlIGNvbnRhaW5lciwgaXRzIGRlc2NlbmRhbnQgY29udGFpbmVycyBhbmQgYWxs
Ci0gICAgICAgIHRoZWlyIG1hbmFnZWQgb2JqZWN0cy4KLQotICAgICAgICBAbWV0aG9kIGRlc3Ry
b3kKLSAgICAgICovCi0gICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLQotICAgICAgICBmb3Ig
KHZhciBpPTAsIGw9dGhpcy5jaGlsZHJlbi5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAg
dGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNo
aWxkcmVuID0gW107Ci0KLSAgICAgICAgZWFjaERlc3Ryb3lhYmxlKHRoaXMsIGZ1bmN0aW9uKGl0
ZW0pIHsKLSAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAg
dGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7Ci0gICAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVl
OwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEBtZXRob2QgcmVzZXQKLSAgICAgICov
Ci0gICAgICByZXNldDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlz
LmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICByZXNldENhY2hlKHRoaXMu
Y2hpbGRyZW5baV0pOwotICAgICAgICB9Ci0gICAgICAgIHJlc2V0Q2FjaGUodGhpcyk7Ci0gICAg
ICB9Ci0gICAgfTsKLQotICAgIGZ1bmN0aW9uIGlsbGVnYWxDaGlsZE9wZXJhdGlvbihvcGVyYXRp
b24pIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcihvcGVyYXRpb24gKyAiIGlzIG5vdCBjdXJyZW50
bHkgc3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5lcnMiKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlv
biBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxOYW1lKSB7Ci0gICAgICB2YXIgc2luZ2xldG9u
ID0gb3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdzaW5nbGV0b24nKTsKLQotICAgICAgcmV0
dXJuIHNpbmdsZXRvbiAhPT0gZmFsc2U7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYnVpbGRJbmpl
Y3Rpb25zKGNvbnRhaW5lciwgaW5qZWN0aW9ucykgewotICAgICAgdmFyIGhhc2ggPSB7fTsKLQot
ICAgICAgaWYgKCFpbmplY3Rpb25zKSB7IHJldHVybiBoYXNoOyB9Ci0KLSAgICAgIHZhciBpbmpl
Y3Rpb24sIGxvb2t1cDsKLQotICAgICAgZm9yICh2YXIgaT0wLCBsPWluamVjdGlvbnMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgICAgICBpbmplY3Rpb24gPSBpbmplY3Rpb25zW2ldOwotICAgICAg
ICBsb29rdXAgPSBjb250YWluZXIubG9va3VwKGluamVjdGlvbi5mdWxsTmFtZSk7Ci0KLSAgICAg
ICAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgaGFzaFtpbmplY3Rpb24u
cHJvcGVydHldID0gbG9va3VwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5l
dyBFcnJvcignQXR0ZW1wdGluZyB0byBpbmplY3QgYW4gdW5rbm93biBpbmplY3Rpb246IGAnICsg
aW5qZWN0aW9uLmZ1bGxOYW1lICsgJ2AnKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBy
ZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBvcHRpb24oY29udGFpbmVyLCBmdWxs
TmFtZSwgb3B0aW9uTmFtZSkgewotICAgICAgdmFyIG9wdGlvbnMgPSBjb250YWluZXIuX29wdGlv
bnMuZ2V0KGZ1bGxOYW1lKTsKLQotICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tvcHRpb25O
YW1lXSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVd
OwotICAgICAgfQotCi0gICAgICB2YXIgdHlwZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IilbMF07Ci0g
ICAgICBvcHRpb25zID0gY29udGFpbmVyLl90eXBlT3B0aW9ucy5nZXQodHlwZSk7Ci0KLSAgICAg
IGlmIChvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdOwotICAg
ICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIGZhY3RvcnlGb3IoY29udGFpbmVyLCBmdWxsTmFt
ZSkgewotICAgICAgdmFyIG5hbWUgPSBjb250YWluZXIubm9ybWFsaXplKGZ1bGxOYW1lKTsKLSAg
ICAgIHZhciBmYWN0b3J5ID0gY29udGFpbmVyLnJlc29sdmUobmFtZSk7Ci0gICAgICB2YXIgaW5q
ZWN0ZWRGYWN0b3J5OwotICAgICAgdmFyIGNhY2hlID0gY29udGFpbmVyLmZhY3RvcnlDYWNoZTsK
LSAgICAgIHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoIjoiKVswXTsKLQotICAgICAgaWYgKGZh
Y3RvcnkgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47IH0KLQotICAgICAgaWYgKGNhY2hlLmhhcyhm
dWxsTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlLmdldChmdWxsTmFtZSk7Ci0gICAgICB9
Ci0KLSAgICAgIGlmICghZmFjdG9yeSB8fCB0eXBlb2YgZmFjdG9yeS5leHRlbmQgIT09ICdmdW5j
dGlvbicgfHwgKCFFbWJlci5NT0RFTF9GQUNUT1JZX0lOSkVDVElPTlMgJiYgdHlwZSA9PT0gJ21v
ZGVsJykpIHsKLSAgICAgICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgYSAnc2FmZScgbWVyZ2Ugc3R5
bGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIGZvciBub3cganVzdCBmYWxsYmFjayB0byBjcmVhdGUg
dGltZSBpbmplY3Rpb24KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgICB9IGVsc2Ugewot
Ci0gICAgICAgIHZhciBpbmplY3Rpb25zICAgICAgICA9IGluamVjdGlvbnNGb3IoY29udGFpbmVy
LCBmdWxsTmFtZSk7Ci0gICAgICAgIHZhciBmYWN0b3J5SW5qZWN0aW9ucyA9IGZhY3RvcnlJbmpl
Y3Rpb25zRm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpOwotCi0gICAgICAgIGZhY3RvcnlJbmplY3Rp
b25zLl90b1N0cmluZyA9IGNvbnRhaW5lci5tYWtlVG9TdHJpbmcoZmFjdG9yeSwgZnVsbE5hbWUp
OwotCi0gICAgICAgIGluamVjdGVkRmFjdG9yeSA9IGZhY3RvcnkuZXh0ZW5kKGluamVjdGlvbnMp
OwotICAgICAgICBpbmplY3RlZEZhY3RvcnkucmVvcGVuQ2xhc3MoZmFjdG9yeUluamVjdGlvbnMp
OwotCi0gICAgICAgIGNhY2hlLnNldChmdWxsTmFtZSwgaW5qZWN0ZWRGYWN0b3J5KTsKLQotICAg
ICAgICByZXR1cm4gaW5qZWN0ZWRGYWN0b3J5OwotICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0
aW9uIGluamVjdGlvbnNGb3IoY29udGFpbmVyICxmdWxsTmFtZSkgewotICAgICAgdmFyIHNwbGl0
TmFtZSA9IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0gICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0s
Ci0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLQotICAgICAgaW5qZWN0aW9ucyA9IGluamVjdGlv
bnMuY29uY2F0KGNvbnRhaW5lci50eXBlSW5qZWN0aW9ucy5nZXQodHlwZSkgfHwgW10pOwotICAg
ICAgaW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci5pbmplY3Rpb25zW2Z1
bGxOYW1lXSB8fCBbXSk7Ci0KLSAgICAgIGluamVjdGlvbnMgPSBidWlsZEluamVjdGlvbnMoY29u
dGFpbmVyLCBpbmplY3Rpb25zKTsKLSAgICAgIGluamVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5
ID0gZnVsbE5hbWU7Ci0gICAgICBpbmplY3Rpb25zLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQot
ICAgICAgcmV0dXJuIGluamVjdGlvbnM7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZmFjdG9yeUlu
amVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSkgewotICAgICAgdmFyIHNwbGl0TmFtZSA9
IGZ1bGxOYW1lLnNwbGl0KCI6IiksCi0gICAgICAgIHR5cGUgPSBzcGxpdE5hbWVbMF0sCi0gICAg
ICAgIGZhY3RvcnlJbmplY3Rpb25zID0gW107Ci0KLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0g
ZmFjdG9yeUluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci5mYWN0b3J5VHlwZUluamVjdGlvbnMu
Z2V0KHR5cGUpIHx8IFtdKTsKLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVj
dGlvbnMuY29uY2F0KGNvbnRhaW5lci5mYWN0b3J5SW5qZWN0aW9uc1tmdWxsTmFtZV0gfHwgW10p
OwotCi0gICAgICBmYWN0b3J5SW5qZWN0aW9ucyA9IGJ1aWxkSW5qZWN0aW9ucyhjb250YWluZXIs
IGZhY3RvcnlJbmplY3Rpb25zKTsKLSAgICAgIGZhY3RvcnlJbmplY3Rpb25zLl9kZWJ1Z0NvbnRh
aW5lcktleSA9IGZ1bGxOYW1lOwotCi0gICAgICByZXR1cm4gZmFjdG9yeUluamVjdGlvbnM7Ci0g
ICAgfQotCi0gICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxsTmFtZSkgewot
ICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3J5Rm9yKGNvbnRhaW5lciwgZnVsbE5hbWUpOwotCi0g
ICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwgZnVsbE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBm
YWxzZSkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZh
Y3RvcnkpIHsKLSAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5LmV4dGVuZCA9PT0gJ2Z1bmN0aW9u
JykgewotICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0ZW5kYWJsZSBhbmQg
aXMgYWxyZWFkeSBpbmplY3RlZAotICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZSgpOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0
ZW5kYWJsZQotICAgICAgICAgIC8vIHRvIGNyZWF0ZSB0aW1lIGluamVjdGlvbnMKLSAgICAgICAg
ICAvLyBUT0RPOiBzdXBwb3J0IG5ldydpbmcgZm9yIGluc3RhbnRpYXRpb24gYW5kIG1lcmdlIGlu
amVjdGlvbnMgZm9yIHB1cmUgSlMgRnVuY3Rpb25zCi0gICAgICAgICAgcmV0dXJuIGZhY3Rvcnku
Y3JlYXRlKGluamVjdGlvbnNGb3IoY29udGFpbmVyLCBmdWxsTmFtZSkpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZWFjaERlc3Ryb3lhYmxlKGNvbnRhaW5lciwg
Y2FsbGJhY2spIHsKLSAgICAgIGNvbnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5
LCB2YWx1ZSkgewotICAgICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwga2V5LCAnaW5zdGFudGlh
dGUnKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9Ci0gICAgICAgIGNhbGxiYWNrKHZhbHVlKTsKLSAg
ICAgIH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlc2V0Q2FjaGUoY29udGFpbmVyKSB7Ci0g
ICAgICBjb250YWluZXIuY2FjaGUuZWFjaExvY2FsKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAg
ICAgICAgaWYgKG9wdGlvbihjb250YWluZXIsIGtleSwgJ2luc3RhbnRpYXRlJykgPT09IGZhbHNl
KSB7IHJldHVybjsgfQotICAgICAgICB2YWx1ZS5kZXN0cm95KCk7Ci0gICAgICB9KTsKLSAgICAg
IGNvbnRhaW5lci5jYWNoZS5kaWN0ID0ge307Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYWRkVHlw
ZUluamVjdGlvbihydWxlcywgdHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKSB7Ci0gICAgICB2YXIg
aW5qZWN0aW9ucyA9IHJ1bGVzLmdldCh0eXBlKTsKLQotICAgICAgaWYgKCFpbmplY3Rpb25zKSB7
Ci0gICAgICAgIGluamVjdGlvbnMgPSBbXTsKLSAgICAgICAgcnVsZXMuc2V0KHR5cGUsIGluamVj
dGlvbnMpOwotICAgICAgfQotCi0gICAgICBpbmplY3Rpb25zLnB1c2goewotICAgICAgICBwcm9w
ZXJ0eTogcHJvcGVydHksCi0gICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZQotICAgICAgfSk7Ci0g
ICAgfQotCi0gICAgZnVuY3Rpb24gYWRkSW5qZWN0aW9uKHJ1bGVzLCBmYWN0b3J5TmFtZSwgcHJv
cGVydHksIGluamVjdGlvbk5hbWUpIHsKLSAgICAgIHZhciBpbmplY3Rpb25zID0gcnVsZXNbZmFj
dG9yeU5hbWVdID0gcnVsZXNbZmFjdG9yeU5hbWVdIHx8IFtdOwotICAgICAgaW5qZWN0aW9ucy5w
dXNoKHsgcHJvcGVydHk6IHByb3BlcnR5LCBmdWxsTmFtZTogaW5qZWN0aW9uTmFtZSB9KTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gQ29udGFpbmVyOwotfSk7Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigp
IHsKLS8qZ2xvYmFscyBFTlYgKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci1ydW50aW1lCi0qLwotCi12YXIgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRl
eE9mOwotCi0vKioKLSBUaGlzIHdpbGwgY29tcGFyZSB0d28gamF2YXNjcmlwdCB2YWx1ZXMgb2Yg
cG9zc2libHkgZGlmZmVyZW50IHR5cGVzLgotIEl0IHdpbGwgdGVsbCB5b3Ugd2hpY2ggb25lIGlz
IGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgYnkgcmV0dXJuaW5nOgotCi0gIC0gLTEgaWYgdGhlIGZp
cnN0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25kLAotICAtIDAgaWYgYm90aCBhcmUgZXF1YWws
Ci0gIC0gMSBpZiB0aGUgZmlyc3QgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCi0KLSBUaGUg
b3JkZXIgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBgRW1iZXIuT1JERVJfREVGSU5JVElPTmAsIGlm
IHR5cGVzIGFyZSBkaWZmZXJlbnQuCi0gSW4gY2FzZSB0aGV5IGhhdmUgdGhlIHNhbWUgdHlwZSBh
biBhcHByb3ByaWF0ZSBjb21wYXJpc29uIGZvciB0aGlzIHR5cGUgaXMgbWFkZS4KLQotICBgYGBq
YXZhc2NyaXB0Ci0gIEVtYmVyLmNvbXBhcmUoJ2hlbGxvJywgJ2hlbGxvJyk7ICAvLyAwCi0gIEVt
YmVyLmNvbXBhcmUoJ2FiYycsICdkZmcnKTsgICAgICAvLyAtMQotICBFbWJlci5jb21wYXJlKDIs
IDEpOyAgICAgICAgICAgICAgLy8gMQotICBgYGAKLQotIEBtZXRob2QgY29tcGFyZQotIEBmb3Ig
RW1iZXIKLSBAcGFyYW0ge09iamVjdH0gdiBGaXJzdCB2YWx1ZSB0byBjb21wYXJlCi0gQHBhcmFt
IHtPYmplY3R9IHcgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUKLSBAcmV0dXJuIHtOdW1iZXJ9IC0x
IGlmIHYgPCB3LCAwIGlmIHYgPSB3IGFuZCAxIGlmIHYgPiB3LgotKi8KLUVtYmVyLmNvbXBhcmUg
PSBmdW5jdGlvbiBjb21wYXJlKHYsIHcpIHsKLSAgaWYgKHYgPT09IHcpIHsgcmV0dXJuIDA7IH0K
LQotICB2YXIgdHlwZTEgPSBFbWJlci50eXBlT2Yodik7Ci0gIHZhciB0eXBlMiA9IEVtYmVyLnR5
cGVPZih3KTsKLQotICB2YXIgQ29tcGFyYWJsZSA9IEVtYmVyLkNvbXBhcmFibGU7Ci0gIGlmIChD
b21wYXJhYmxlKSB7Ci0gICAgaWYgKHR5cGUxPT09J2luc3RhbmNlJyAmJiBDb21wYXJhYmxlLmRl
dGVjdCh2LmNvbnN0cnVjdG9yKSkgewotICAgICAgcmV0dXJuIHYuY29uc3RydWN0b3IuY29tcGFy
ZSh2LCB3KTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZTIgPT09ICdpbnN0YW5jZScgJiYgQ29tcGFy
YWJsZS5kZXRlY3Qody5jb25zdHJ1Y3RvcikpIHsKLSAgICAgIHJldHVybiAxLXcuY29uc3RydWN0
b3IuY29tcGFyZSh3LCB2KTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB3ZSBoYXZlbid0IHlldCBn
ZW5lcmF0ZWQgYSByZXZlcnNlLW1hcHBpbmcgb2YgRW1iZXIuT1JERVJfREVGSU5JVElPTiwKLSAg
Ly8gZG8gc28gbm93LgotICB2YXIgbWFwcGluZyA9IEVtYmVyLk9SREVSX0RFRklOSVRJT05fTUFQ
UElORzsKLSAgaWYgKCFtYXBwaW5nKSB7Ci0gICAgdmFyIG9yZGVyID0gRW1iZXIuT1JERVJfREVG
SU5JVElPTjsKLSAgICBtYXBwaW5nID0gRW1iZXIuT1JERVJfREVGSU5JVElPTl9NQVBQSU5HID0g
e307Ci0gICAgdmFyIGlkeCwgbGVuOwotICAgIGZvciAoaWR4ID0gMCwgbGVuID0gb3JkZXIubGVu
Z3RoOyBpZHggPCBsZW47ICArK2lkeCkgewotICAgICAgbWFwcGluZ1tvcmRlcltpZHhdXSA9IGlk
eDsKLSAgICB9Ci0KLSAgICAvLyBXZSBubyBsb25nZXIgbmVlZCBFbWJlci5PUkRFUl9ERUZJTklU
SU9OLgotICAgIGRlbGV0ZSBFbWJlci5PUkRFUl9ERUZJTklUSU9OOwotICB9Ci0KLSAgdmFyIHR5
cGUxSW5kZXggPSBtYXBwaW5nW3R5cGUxXTsKLSAgdmFyIHR5cGUySW5kZXggPSBtYXBwaW5nW3R5
cGUyXTsKLQotICBpZiAodHlwZTFJbmRleCA8IHR5cGUySW5kZXgpIHsgcmV0dXJuIC0xOyB9Ci0g
IGlmICh0eXBlMUluZGV4ID4gdHlwZTJJbmRleCkgeyByZXR1cm4gMTsgfQotCi0gIC8vIHR5cGVz
IGFyZSBlcXVhbCAtIHNvIHdlIGhhdmUgdG8gY2hlY2sgdmFsdWVzIG5vdwotICBzd2l0Y2ggKHR5
cGUxKSB7Ci0gICAgY2FzZSAnYm9vbGVhbic6Ci0gICAgY2FzZSAnbnVtYmVyJzoKLSAgICAgIGlm
ICh2IDwgdykgeyByZXR1cm4gLTE7IH0KLSAgICAgIGlmICh2ID4gdykgeyByZXR1cm4gMTsgfQot
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICdzdHJpbmcnOgotICAgICAgdmFyIGNvbXAgPSB2
LmxvY2FsZUNvbXBhcmUodyk7Ci0gICAgICBpZiAoY29tcCA8IDApIHsgcmV0dXJuIC0xOyB9Ci0g
ICAgICBpZiAoY29tcCA+IDApIHsgcmV0dXJuIDE7IH0KLSAgICAgIHJldHVybiAwOwotCi0gICAg
Y2FzZSAnYXJyYXknOgotICAgICAgdmFyIHZMZW4gPSB2Lmxlbmd0aDsKLSAgICAgIHZhciB3TGVu
ID0gdy5sZW5ndGg7Ci0gICAgICB2YXIgbCA9IE1hdGgubWluKHZMZW4sIHdMZW4pOwotICAgICAg
dmFyIHIgPSAwOwotICAgICAgdmFyIGkgPSAwOwotICAgICAgd2hpbGUgKHIgPT09IDAgJiYgaSA8
IGwpIHsKLSAgICAgICAgciA9IGNvbXBhcmUodltpXSx3W2ldKTsKLSAgICAgICAgaSsrOwotICAg
ICAgfQotICAgICAgaWYgKHIgIT09IDApIHsgcmV0dXJuIHI7IH0KLQotICAgICAgLy8gYWxsIGVs
ZW1lbnRzIGFyZSBlcXVhbCBub3cKLSAgICAgIC8vIHNob3J0ZXIgYXJyYXkgc2hvdWxkIGJlIG9y
ZGVyZWQgZmlyc3QKLSAgICAgIGlmICh2TGVuIDwgd0xlbikgeyByZXR1cm4gLTE7IH0KLSAgICAg
IGlmICh2TGVuID4gd0xlbikgeyByZXR1cm4gMTsgfQotICAgICAgLy8gYXJyYXlzIGFyZSBlcXVh
bCBub3cKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnaW5zdGFuY2UnOgotICAgICAgaWYg
KEVtYmVyLkNvbXBhcmFibGUgJiYgRW1iZXIuQ29tcGFyYWJsZS5kZXRlY3QodikpIHsKLSAgICAg
ICAgcmV0dXJuIHYuY29tcGFyZSh2LCB3KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotCi0g
ICAgY2FzZSAnZGF0ZSc6Ci0gICAgICB2YXIgdk51bSA9IHYuZ2V0VGltZSgpOwotICAgICAgdmFy
IHdOdW0gPSB3LmdldFRpbWUoKTsKLSAgICAgIGlmICh2TnVtIDwgd051bSkgeyByZXR1cm4gLTE7
IH0KLSAgICAgIGlmICh2TnVtID4gd051bSkgeyByZXR1cm4gMTsgfQotICAgICAgcmV0dXJuIDA7
Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIF9j
b3B5KG9iaiwgZGVlcCwgc2VlbiwgY29waWVzKSB7Ci0gIHZhciByZXQsIGxvYywga2V5OwotCi0g
IC8vIHByaW1pdGl2ZSBkYXRhIHR5cGVzIGFyZSBpbW11dGFibGUsIGp1c3QgcmV0dXJuIHRoZW0u
Ci0gIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1cm4gb2Jq
OwotCi0gIC8vIGF2b2lkIGN5Y2xpY2FsIGxvb3BzCi0gIGlmIChkZWVwICYmIChsb2M9aW5kZXhP
ZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGllc1tsb2NdOwotCi0gIEVtYmVyLmFzc2VydCgn
Q2Fubm90IGNsb25lIGFuIEVtYmVyLk9iamVjdCB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBFbWJl
ci5Db3B5YWJsZScsICEob2JqIGluc3RhbmNlb2YgRW1iZXIuT2JqZWN0KSB8fCAoRW1iZXIuQ29w
eWFibGUgJiYgRW1iZXIuQ29weWFibGUuZGV0ZWN0KG9iaikpKTsKLQotICAvLyBJTVBPUlRBTlQ6
IHRoaXMgc3BlY2lmaWMgdGVzdCB3aWxsIGRldGVjdCBhIG5hdGl2ZSBhcnJheSBvbmx5LiBBbnkg
b3RoZXIKLSAgLy8gb2JqZWN0IHdpbGwgbmVlZCB0byBpbXBsZW1lbnQgQ29weWFibGUuCi0gIGlm
IChFbWJlci50eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgewotICAgIHJldCA9IG9iai5zbGljZSgp
OwotICAgIGlmIChkZWVwKSB7Ci0gICAgICBsb2MgPSByZXQubGVuZ3RoOwotICAgICAgd2hpbGUo
LS1sb2M+PTApIHJldFtsb2NdID0gX2NvcHkocmV0W2xvY10sIGRlZXAsIHNlZW4sIGNvcGllcyk7
Ci0gICAgfQotICB9IGVsc2UgaWYgKEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRl
dGVjdChvYmopKSB7Ci0gICAgcmV0ID0gb2JqLmNvcHkoZGVlcCwgc2VlbiwgY29waWVzKTsKLSAg
fSBlbHNlIHsKLSAgICByZXQgPSB7fTsKLSAgICBmb3Ioa2V5IGluIG9iaikgewotICAgICAgaWYg
KCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7Ci0KLSAgICAgIC8vIFByZXZlbnRz
IGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCi0gICAg
ICAvLyBjb3B5aW5nIGludGVybmFsIEVtYmVyIHByb3BlcnRpZXMKLSAgICAgIGlmIChrZXkuc3Vi
c3RyaW5nKDAsMikgPT09ICdfXycpIGNvbnRpbnVlOwotCi0gICAgICByZXRba2V5XSA9IGRlZXAg
PyBfY29weShvYmpba2V5XSwgZGVlcCwgc2VlbiwgY29waWVzKSA6IG9ialtrZXldOwotICAgIH0K
LSAgfQotCi0gIGlmIChkZWVwKSB7Ci0gICAgc2Vlbi5wdXNoKG9iaik7Ci0gICAgY29waWVzLnB1
c2gocmV0KTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBDcmVhdGVzIGEgY2xv
bmUgb2YgdGhlIHBhc3NlZCBvYmplY3QuIFRoaXMgZnVuY3Rpb24gY2FuIHRha2UganVzdCBhYm91
dAotICBhbnkgdHlwZSBvZiBvYmplY3QgYW5kIGNyZWF0ZSBhIGNsb25lIG9mIGl0LCBpbmNsdWRp
bmcgcHJpbWl0aXZlIHZhbHVlcwotICAod2hpY2ggYXJlIG5vdCBhY3R1YWxseSBjbG9uZWQgYmVj
YXVzZSB0aGV5IGFyZSBpbW11dGFibGUpLgotCi0gIElmIHRoZSBwYXNzZWQgb2JqZWN0IGltcGxl
bWVudHMgdGhlIGBjbG9uZSgpYCBtZXRob2QsIHRoZW4gdGhpcyBmdW5jdGlvbgotICB3aWxsIHNp
bXBseSBjYWxsIHRoYXQgbWV0aG9kIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQotICBAbWV0aG9k
IGNvcHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8g
Y2xvbmUKLSAgQHBhcmFtIHtCb29sZWFufSBkZWVwIElmIHRydWUsIGEgZGVlcCBjb3B5IG9mIHRo
ZSBvYmplY3QgaXMgbWFkZQotICBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZWQgb2JqZWN0Ci0q
LwotRW1iZXIuY29weSA9IGZ1bmN0aW9uKG9iaiwgZGVlcCkgewotICAvLyBmYXN0IHBhdGhzCi0g
IGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1cm4gb2JqOyAv
LyBjYW4ndCBjb3B5IHByaW1pdGl2ZXMKLSAgaWYgKEVtYmVyLkNvcHlhYmxlICYmIEVtYmVyLkNv
cHlhYmxlLmRldGVjdChvYmopKSByZXR1cm4gb2JqLmNvcHkoZGVlcCk7Ci0gIHJldHVybiBfY29w
eShvYmosIGRlZXAsIGRlZXAgPyBbXSA6IG51bGwsIGRlZXAgPyBbXSA6IG51bGwpOwotfTsKLQot
LyoqCi0gIENvbnZlbmllbmNlIG1ldGhvZCB0byBpbnNwZWN0IGFuIG9iamVjdC4gVGhpcyBtZXRo
b2Qgd2lsbCBhdHRlbXB0IHRvCi0gIGNvbnZlcnQgdGhlIG9iamVjdCBpbnRvIGEgdXNlZnVsIHN0
cmluZyBkZXNjcmlwdGlvbi4KLQotICBJdCBpcyBhIHByZXR0eSBzaW1wbGUgaW1wbGVtZW50YXRp
b24uIElmIHlvdSB3YW50IHNvbWV0aGluZyBtb3JlIHJvYnVzdCwKLSAgdXNlIHNvbWV0aGluZyBs
aWtlIEpTRHVtcDogaHR0cHM6Ly9naXRodWIuY29tL05WL2pzRHVtcAotCi0gIEBtZXRob2QgaW5z
cGVjdAotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB5b3Ug
d2FudCB0byBpbnNwZWN0LgotICBAcmV0dXJuIHtTdHJpbmd9IEEgZGVzY3JpcHRpb24gb2YgdGhl
IG9iamVjdAotKi8KLUVtYmVyLmluc3BlY3QgPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIHR5cGUg
PSBFbWJlci50eXBlT2Yob2JqKTsKLSAgaWYgKHR5cGUgPT09ICdhcnJheScpIHsKLSAgICByZXR1
cm4gJ1snICsgb2JqICsgJ10nOwotICB9Ci0gIGlmICh0eXBlICE9PSAnb2JqZWN0JykgewotICAg
IHJldHVybiBvYmogKyAnJzsKLSAgfQotCi0gIHZhciB2LCByZXQgPSBbXTsKLSAgZm9yKHZhciBr
ZXkgaW4gb2JqKSB7Ci0gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICB2
ID0gb2JqW2tleV07Ci0gICAgICBpZiAodiA9PT0gJ3RvU3RyaW5nJykgeyBjb250aW51ZTsgfSAv
LyBpZ25vcmUgdXNlbGVzcyBpdGVtcwotICAgICAgaWYgKEVtYmVyLnR5cGVPZih2KSA9PT0gJ2Z1
bmN0aW9uJykgeyB2ID0gImZ1bmN0aW9uKCkgeyAuLi4gfSI7IH0KLSAgICAgIHJldC5wdXNoKGtl
eSArICI6ICIgKyB2KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICJ7IiArIHJldC5qb2luKCIsICIp
ICsgIn0iOwotfTsKLQotLyoqCi0gIENvbXBhcmVzIHR3byBvYmplY3RzLCByZXR1cm5pbmcgdHJ1
ZSBpZiB0aGV5IGFyZSBsb2dpY2FsbHkgZXF1YWwuIFRoaXMgaXMKLSAgYSBkZWVwZXIgY29tcGFy
aXNvbiB0aGFuIGEgc2ltcGxlIHRyaXBsZSBlcXVhbC4gRm9yIHNldHMgaXQgd2lsbCBjb21wYXJl
IHRoZQotICBpbnRlcm5hbCBvYmplY3RzLiBGb3IgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxl
bWVudHMgYGlzRXF1YWwoKWAgaXQgd2lsbAotICByZXNwZWN0IHRoYXQgbWV0aG9kLgotCi0gIGBg
YGphdmFzY3JpcHQKLSAgRW1iZXIuaXNFcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRydWUK
LSAgRW1iZXIuaXNFcXVhbCgxLCAyKTsgICAgICAgICAgICAgIC8vIGZhbHNlCi0gIEVtYmVyLmlz
RXF1YWwoWzQsMl0sIFs0LDJdKTsgICAgICAvLyBmYWxzZQotICBgYGAKLQotICBAbWV0aG9kIGlz
RXF1YWwKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge09iamVjdH0gYSBmaXJzdCBvYmplY3QgdG8g
Y29tcGFyZQotICBAcGFyYW0ge09iamVjdH0gYiBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUKLSAg
QHJldHVybiB7Qm9vbGVhbn0KLSovCi1FbWJlci5pc0VxdWFsID0gZnVuY3Rpb24oYSwgYikgewot
ICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9mIGEuaXNFcXVhbCkgcmV0dXJuIGEuaXNFcXVh
bChiKTsKLSAgcmV0dXJuIGEgPT09IGI7Ci19OwotCi0vLyBVc2VkIGJ5IEVtYmVyLmNvbXBhcmUK
LUVtYmVyLk9SREVSX0RFRklOSVRJT04gPSBFbWJlci5FTlYuT1JERVJfREVGSU5JVElPTiB8fCBb
Ci0gICd1bmRlZmluZWQnLAotICAnbnVsbCcsCi0gICdib29sZWFuJywKLSAgJ251bWJlcicsCi0g
ICdzdHJpbmcnLAotICAnYXJyYXknLAotICAnb2JqZWN0JywKLSAgJ2luc3RhbmNlJywKLSAgJ2Z1
bmN0aW9uJywKLSAgJ2NsYXNzJywKLSAgJ2RhdGUnCi1dOwotCi0vKioKLSAgUmV0dXJucyBhbGwg
b2YgdGhlIGtleXMgZGVmaW5lZCBvbiBhbiBvYmplY3Qgb3IgaGFzaC4gVGhpcyBpcyB1c2VmdWwK
LSAgd2hlbiBpbnNwZWN0aW5nIG9iamVjdHMgZm9yIGRlYnVnZ2luZy4gT24gYnJvd3NlcnMgdGhh
dCBzdXBwb3J0IGl0LCB0aGlzCi0gIHVzZXMgdGhlIG5hdGl2ZSBgT2JqZWN0LmtleXNgIGltcGxl
bWVudGF0aW9uLgotCi0gIEBtZXRob2Qga2V5cwotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7T2Jq
ZWN0fSBvYmoKLSAgQHJldHVybiB7QXJyYXl9IEFycmF5IGNvbnRhaW5pbmcga2V5cyBvZiBvYmoK
LSovCi1FbWJlci5rZXlzID0gT2JqZWN0LmtleXM7Ci0KLWlmICghRW1iZXIua2V5cyB8fCBFbWJl
ci5jcmVhdGUuaXNTaW11bGF0ZWQpIHsKLSAgdmFyIHByb3RvdHlwZVByb3BlcnRpZXMgPSBbCi0g
ICAgJ2NvbnN0cnVjdG9yJywKLSAgICAnaGFzT3duUHJvcGVydHknLAotICAgICdpc1Byb3RvdHlw
ZU9mJywKLSAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLAotICAgICd2YWx1ZU9mJywKLSAgICAn
dG9Mb2NhbGVTdHJpbmcnLAotICAgICd0b1N0cmluZycKLSAgXSwKLSAgcHVzaFByb3BlcnR5TmFt
ZSA9IGZ1bmN0aW9uKG9iaiwgYXJyYXksIGtleSkgewotICAgIC8vIFByZXZlbnRzIGJyb3dzZXJz
IHRoYXQgZG9uJ3QgcmVzcGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCi0gICAgLy8gY29weWlu
ZyBpbnRlcm5hbCBFbWJlciBwcm9wZXJ0aWVzCi0gICAgaWYgKGtleS5zdWJzdHJpbmcoMCwyKSA9
PT0gJ19fJykgcmV0dXJuOwotICAgIGlmIChrZXkgPT09ICdfc3VwZXInKSByZXR1cm47Ci0gICAg
aWYgKGluZGV4T2YoYXJyYXksIGtleSkgPj0gMCkgcmV0dXJuOwotICAgIGlmICghb2JqLmhhc093
blByb3BlcnR5KGtleSkpIHJldHVybjsKLQotICAgIGFycmF5LnB1c2goa2V5KTsKLSAgfTsKLQot
ICBFbWJlci5rZXlzID0gZnVuY3Rpb24ob2JqKSB7Ci0gICAgdmFyIHJldCA9IFtdLCBrZXk7Ci0g
ICAgZm9yIChrZXkgaW4gb2JqKSB7Ci0gICAgICBwdXNoUHJvcGVydHlOYW1lKG9iaiwgcmV0LCBr
ZXkpOwotICAgIH0KLQotICAgIC8vIElFOCBkb2Vzbid0IGVudW1lcmF0ZSBwcm9wZXJ0eSB0aGF0
IG5hbWVkIHRoZSBzYW1lIGFzIHByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICAgIGZvciAodmFyIGkg
PSAwLCBsID0gcHJvdG90eXBlUHJvcGVydGllcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAg
IGtleSA9IHByb3RvdHlwZVByb3BlcnRpZXNbaV07Ci0KLSAgICAgIHB1c2hQcm9wZXJ0eU5hbWUo
b2JqLCByZXQsIGtleSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfTsKLX0KLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci1ydW50aW1lCi0qLwotCi12YXIgU1RSSU5HX0RBU0hFUklaRV9SRUdFWFAgPSAoL1sgX10v
Zyk7Ci12YXIgU1RSSU5HX0RBU0hFUklaRV9DQUNIRSA9IHt9OwotdmFyIFNUUklOR19ERUNBTUVM
SVpFX1JFR0VYUCA9ICgvKFthLXpcZF0pKFtBLVpdKS9nKTsKLXZhciBTVFJJTkdfQ0FNRUxJWkVf
UkVHRVhQID0gKC8oXC18X3xcLnxccykrKC4pPy9nKTsKLXZhciBTVFJJTkdfVU5ERVJTQ09SRV9S
RUdFWFBfMSA9ICgvKFthLXpcZF0pKFtBLVpdKykvZyk7Ci12YXIgU1RSSU5HX1VOREVSU0NPUkVf
UkVHRVhQXzIgPSAoL1wtfFxzKy9nKTsKLQotLyoqCi0gIERlZmluZXMgdGhlIGhhc2ggb2YgbG9j
YWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLiBVc2VkIGJ5Ci0gIHRoZSBg
RW1iZXIuU3RyaW5nLmxvYygpYCBoZWxwZXIuIFRvIGxvY2FsaXplLCBhZGQgc3RyaW5nIHZhbHVl
cyB0byB0aGlzCi0gIGhhc2guCi0KLSAgQHByb3BlcnR5IFNUUklOR1MKLSAgQGZvciBFbWJlcgot
ICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuU1RSSU5HUyA9IHt9OwotCi0vKioKLSAgRGVmaW5lcyBz
dHJpbmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5nIHN0cmluZyBmb3JtYXR0aW5nIGFuZCBsb2Nh
bGl6YXRpb24uCi0gIFVubGVzcyBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nYCBpcyBg
ZmFsc2VgIHRoZXNlIG1ldGhvZHMgd2lsbCBhbHNvIGJlCi0gIGFkZGVkIHRvIHRoZSBgU3RyaW5n
LnByb3RvdHlwZWAgYXMgd2VsbC4KLQotICBAY2xhc3MgU3RyaW5nCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHN0YXRpYwotKi8KLUVtYmVyLlN0cmluZyA9IHsKLQotICAvKioKLSAgICBBcHBseSBm
b3JtYXR0aW5nIG9wdGlvbnMgdG8gdGhlIHN0cmluZy4gVGhpcyB3aWxsIGxvb2sgZm9yIG9jY3Vy
cmVuY2VzCi0gICAgb2YgIiVAIiBpbiB5b3VyIHN0cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdp
dGggdGhlIGFyZ3VtZW50cyB5b3UgcGFzcyBpbnRvCi0gICAgdGhpcyBtZXRob2QuIElmIHlvdSB3
YW50IHRvIGNvbnRyb2wgdGhlIHNwZWNpZmljIG9yZGVyIG9mIHJlcGxhY2VtZW50LAotICAgIHlv
dSBjYW4gYWRkIGEgbnVtYmVyIGFmdGVyIHRoZSBrZXkgYXMgd2VsbCB0byBpbmRpY2F0ZSB3aGlj
aCBhcmd1bWVudAotICAgIHlvdSB3YW50IHRvIGluc2VydC4KLQotICAgIE9yZGVyZWQgaW5zZXJ0
aW9ucyBhcmUgbW9zdCB1c2VmdWwgd2hlbiBidWlsZGluZyBsb2Mgc3RyaW5ncyB3aGVyZSB2YWx1
ZXMKLSAgICB5b3UgbmVlZCB0byBpbnNlcnQgbWF5IGFwcGVhciBpbiBkaWZmZXJlbnQgb3JkZXJz
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICJIZWxsbyAlQCAlQCIuZm10KCdKb2huJywgJ0Rv
ZScpOyAgICAgLy8gIkhlbGxvIEpvaG4gRG9lIgotICAgICJIZWxsbyAlQDIsICVAMSIuZm10KCdK
b2huJywgJ0RvZScpOyAgLy8gIkhlbGxvIERvZSwgSm9obiIKLSAgICBgYGAKLQotICAgIEBtZXRo
b2QgZm10Ci0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAotICAg
IEBwYXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnRlcnBv
bGF0ZSBpbnRvIHN0cmluZy4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmcK
LSAgKi8KLSAgZm10OiBmdW5jdGlvbihzdHIsIGZvcm1hdHMpIHsKLSAgICAvLyBmaXJzdCwgcmVw
bGFjZSBhbnkgT1JERVJFRCByZXBsYWNlbWVudHMuCi0gICAgdmFyIGlkeCAgPSAwOyAvLyB0aGUg
Y3VycmVudCBpbmRleCBmb3Igbm9uLW51bWVyaWNhbCByZXBsYWNlbWVudHMKLSAgICByZXR1cm4g
c3RyLnJlcGxhY2UoLyVAKFswLTldKyk/L2csIGZ1bmN0aW9uKHMsIGFyZ0luZGV4KSB7Ci0gICAg
ICBhcmdJbmRleCA9IChhcmdJbmRleCkgPyBwYXJzZUludChhcmdJbmRleCwgMTApIC0gMSA6IGlk
eCsrOwotICAgICAgcyA9IGZvcm1hdHNbYXJnSW5kZXhdOwotICAgICAgcmV0dXJuIChzID09PSBu
dWxsKSA/ICcobnVsbCknIDogKHMgPT09IHVuZGVmaW5lZCkgPyAnJyA6IEVtYmVyLmluc3BlY3Qo
cyk7Ci0gICAgfSkgOwotICB9LAotCi0gIC8qKgotICAgIEZvcm1hdHMgdGhlIHBhc3NlZCBzdHJp
bmcsIGJ1dCBmaXJzdCBsb29rcyB1cCB0aGUgc3RyaW5nIGluIHRoZSBsb2NhbGl6ZWQKLSAgICBz
dHJpbmdzIGhhc2guIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBT
ZWUKLSAgICBgRW1iZXIuU3RyaW5nLmZtdCgpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmb3Jt
YXR0aW5nLgotCi0gICAgTm90ZSB0aGF0IGl0IGlzIHRyYWRpdGlvbmFsIGJ1dCBub3QgcmVxdWly
ZWQgdG8gcHJlZml4IGxvY2FsaXplZCBzdHJpbmcKLSAgICBrZXlzIHdpdGggYW4gdW5kZXJzY29y
ZSBvciBvdGhlciBjaGFyYWN0ZXIgc28geW91IGNhbiBlYXNpbHkgaWRlbnRpZnkKLSAgICBsb2Nh
bGl6ZWQgc3RyaW5ncy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5TVFJJTkdTID0g
ewotICAgICAgJ19IZWxsbyBXb3JsZCc6ICdCb25qb3VyIGxlIG1vbmRlJywKLSAgICAgICdfSGVs
bG8gJUAgJUAnOiAnQm9uam91ciAlQCAlQCcKLSAgICB9OwotCi0gICAgRW1iZXIuU3RyaW5nLmxv
YygiX0hlbGxvIFdvcmxkIik7ICAvLyAnQm9uam91ciBsZSBtb25kZSc7Ci0gICAgRW1iZXIuU3Ry
aW5nLmxvYygiX0hlbGxvICVAICVAIiwgWyJKb2huIiwgIlNtaXRoIl0pOyAgLy8gIkJvbmpvdXIg
Sm9obiBTbWl0aCI7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGxvYwotICAgIEBwYXJhbSB7U3Ry
aW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKLSAgICBAcGFyYW0ge0FycmF5fSBmb3JtYXRz
IE9wdGlvbmFsIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gaW50ZXJwb2xhdGUgaW50byBzdHJpbmcu
Ci0gICAgQHJldHVybiB7U3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nCi0gICovCi0gIGxvYzogZnVu
Y3Rpb24oc3RyLCBmb3JtYXRzKSB7Ci0gICAgc3RyID0gRW1iZXIuU1RSSU5HU1tzdHJdIHx8IHN0
cjsKLSAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmZtdChzdHIsIGZvcm1hdHMpIDsKLSAgfSwKLQot
ICAvKioKLSAgICBTcGxpdHMgYSBzdHJpbmcgaW50byBzZXBhcmF0ZSB1bml0cyBzZXBhcmF0ZWQg
Ynkgc3BhY2VzLCBlbGltaW5hdGluZyBhbnkKLSAgICBlbXB0eSBzdHJpbmdzIGluIHRoZSBwcm9j
ZXNzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzcGxpdCB0aGF0Ci0gICAgaXMg
bW9zdGx5IHVzZWZ1bCB3aGVuIGFwcGxpZWQgdG8gdGhlIGBTdHJpbmcucHJvdG90eXBlYC4KLQot
ICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5TdHJpbmcudygiYWxwaGEgYmV0YSBnYW1tYSIp
LmZvckVhY2goZnVuY3Rpb24oa2V5KSB7Ci0gICAgICBjb25zb2xlLmxvZyhrZXkpOwotICAgIH0p
OwotCi0gICAgLy8gPiBhbHBoYQotICAgIC8vID4gYmV0YQotICAgIC8vID4gZ2FtbWEKLSAgICBg
YGAKLQotICAgIEBtZXRob2QgdwotICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0
byBzcGxpdAotICAgIEByZXR1cm4ge1N0cmluZ30gc3BsaXQgc3RyaW5nCi0gICovCi0gIHc6IGZ1
bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnNwbGl0KC9ccysvKTsgfSwKLQotICAvKioKLSAgICBD
b252ZXJ0cyBhIGNhbWVsaXplZCBzdHJpbmcgaW50byBhbGwgbG93ZXIgY2FzZSBzZXBhcmF0ZWQg
YnkgdW5kZXJzY29yZXMuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgJ2lubmVySFRNTCcuZGVj
YW1lbGl6ZSgpOyAgICAgICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy5k
ZWNhbWVsaXplKCk7ICAgICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1l
Jy5kZWNhbWVsaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCi0gICAgJ215IGZhdm9yaXRl
IGl0ZW1zJy5kZWNhbWVsaXplKCk7ICAvLyAnbXkgZmF2b3JpdGUgaXRlbXMnCi0gICAgYGBgCi0K
LSAgICBAbWV0aG9kIGRlY2FtZWxpemUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJp
bmcgdG8gZGVjYW1lbGl6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNhbWVsaXplZCBz
dHJpbmcuCi0gICovCi0gIGRlY2FtZWxpemU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBz
dHIucmVwbGFjZShTVFJJTkdfREVDQU1FTElaRV9SRUdFWFAsICckMV8kMicpLnRvTG93ZXJDYXNl
KCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVwbGFjZXMgdW5kZXJzY29yZXMsIHNwYWNlcywgb3Ig
Y2FtZWxDYXNlIHdpdGggZGFzaGVzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhU
TUwnLmRhc2hlcml6ZSgpOyAgICAgICAgICAvLyAnaW5uZXItaHRtbCcKLSAgICAnYWN0aW9uX25h
bWUnLmRhc2hlcml6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbi1uYW1lJwotICAgICdjc3MtY2xhc3Mt
bmFtZScuZGFzaGVyaXplKCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCi0gICAgJ215IGZhdm9y
aXRlIGl0ZW1zJy5kYXNoZXJpemUoKTsgIC8vICdteS1mYXZvcml0ZS1pdGVtcycKLSAgICBgYGAK
LQotICAgIEBtZXRob2QgZGFzaGVyaXplCi0gICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3Ry
aW5nIHRvIGRhc2hlcml6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkYXNoZXJpemVkIHN0
cmluZy4KLSAgKi8KLSAgZGFzaGVyaXplOiBmdW5jdGlvbihzdHIpIHsKLSAgICB2YXIgY2FjaGUg
PSBTVFJJTkdfREFTSEVSSVpFX0NBQ0hFLAotICAgICAgICBoaXQgICA9IGNhY2hlLmhhc093blBy
b3BlcnR5KHN0ciksCi0gICAgICAgIHJldDsKLQotICAgIGlmIChoaXQpIHsKLSAgICAgIHJldHVy
biBjYWNoZVtzdHJdOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSBFbWJlci5TdHJpbmcuZGVj
YW1lbGl6ZShzdHIpLnJlcGxhY2UoU1RSSU5HX0RBU0hFUklaRV9SRUdFWFAsJy0nKTsKLSAgICAg
IGNhY2hlW3N0cl0gPSByZXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAv
KioKLSAgICBSZXR1cm5zIHRoZSBsb3dlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmNhbWVsaXplKCk7ICAgICAgICAgIC8v
ICdpbm5lckhUTUwnCi0gICAgJ2FjdGlvbl9uYW1lJy5jYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2Fj
dGlvbk5hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1lJy5jYW1lbGl6ZSgpOyAgICAgLy8gJ2Nzc0Ns
YXNzTmFtZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhbWVsaXplKCk7ICAvLyAnbXlGYXZv
cml0ZUl0ZW1zJwotICAgICdNeSBGYXZvcml0ZSBJdGVtcycuY2FtZWxpemUoKTsgIC8vICdteUZh
dm9yaXRlSXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNhbWVsaXplCi0gICAgQHBhcmFt
IHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNhbWVsaXplLgotICAgIEByZXR1cm4ge1N0cmlu
Z30gdGhlIGNhbWVsaXplZCBzdHJpbmcuCi0gICovCi0gIGNhbWVsaXplOiBmdW5jdGlvbihzdHIp
IHsKLSAgICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0NBTUVMSVpFX1JFR0VYUCwgZnVuY3Rp
b24obWF0Y2gsIHNlcGFyYXRvciwgY2hyKSB7Ci0gICAgICByZXR1cm4gY2hyID8gY2hyLnRvVXBw
ZXJDYXNlKCkgOiAnJzsKLSAgICB9KS5yZXBsYWNlKC9eKFtBLVpdKS8sIGZ1bmN0aW9uKG1hdGNo
LCBzZXBhcmF0b3IsIGNocikgewotICAgICAgcmV0dXJuIG1hdGNoLnRvTG93ZXJDYXNlKCk7Ci0g
ICAgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgVXBwZXJDYW1lbENhc2UgZm9y
bSBvZiBhIHN0cmluZy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICAnaW5uZXJIVE1MJy5jbGFz
c2lmeSgpOyAgICAgICAgICAvLyAnSW5uZXJIVE1MJwotICAgICdhY3Rpb25fbmFtZScuY2xhc3Np
ZnkoKTsgICAgICAgIC8vICdBY3Rpb25OYW1lJwotICAgICdjc3MtY2xhc3MtbmFtZScuY2xhc3Np
ZnkoKTsgICAgIC8vICdDc3NDbGFzc05hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy5jbGFz
c2lmeSgpOyAgLy8gJ015RmF2b3JpdGVJdGVtcycKLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2xh
c3NpZnkKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY2xhc3NpZnkKLSAg
ICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBjbGFzc2lmaWVkIHN0cmluZwotICAqLwotICBjbGFzc2lm
eTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCIuIiksCi0gICAg
ICAgIG91dCA9IFtdOwotCi0gICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBp
KyspIHsKLSAgICAgIHZhciBjYW1lbGl6ZWQgPSBFbWJlci5TdHJpbmcuY2FtZWxpemUocGFydHNb
aV0pOwotICAgICAgb3V0LnB1c2goY2FtZWxpemVkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsg
Y2FtZWxpemVkLnN1YnN0cigxKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5qb2luKCIuIik7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgTW9yZSBnZW5lcmFsIHRoYW4gZGVjYW1lbGl6ZS4gUmV0dXJu
cyB0aGUgbG93ZXJcX2Nhc2VcX2FuZFxfdW5kZXJzY29yZWQKLSAgICBmb3JtIG9mIGEgc3RyaW5n
LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgICdpbm5lckhUTUwnLnVuZGVyc2NvcmUoKTsgICAg
ICAgICAgLy8gJ2lubmVyX2h0bWwnCi0gICAgJ2FjdGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAg
ICAgICAvLyAnYWN0aW9uX25hbWUnCi0gICAgJ2Nzcy1jbGFzcy1uYW1lJy51bmRlcnNjb3JlKCk7
ICAgICAvLyAnY3NzX2NsYXNzX25hbWUnCi0gICAgJ215IGZhdm9yaXRlIGl0ZW1zJy51bmRlcnNj
b3JlKCk7ICAvLyAnbXlfZmF2b3JpdGVfaXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHVu
ZGVyc2NvcmUKLSAgICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gdW5kZXJzY29y
ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmRlcnNjb3JlZCBzdHJpbmcuCi0gICovCi0g
IHVuZGVyc2NvcmU6IGZ1bmN0aW9uKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJ
TkdfVU5ERVJTQ09SRV9SRUdFWFBfMSwgJyQxXyQyJykuCi0gICAgICByZXBsYWNlKFNUUklOR19V
TkRFUlNDT1JFX1JFR0VYUF8yLCAnXycpLnRvTG93ZXJDYXNlKCk7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQgZm9ybSBvZiBhIHN0cmluZwotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgICdpbm5lckhUTUwnLmNhcGl0YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhU
TUwnCi0gICAgJ2FjdGlvbl9uYW1lJy5jYXBpdGFsaXplKCkgICAgICAgLy8gJ0FjdGlvbl9uYW1l
JwotICAgICdjc3MtY2xhc3MtbmFtZScuY2FwaXRhbGl6ZSgpICAgIC8vICdDc3MtY2xhc3MtbmFt
ZScKLSAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhcGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUg
aXRlbXMnCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNhcGl0YWxpemUKLSAgICBAcGFyYW0ge1N0
cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS4KLSAgICBAcmV0dXJuIHtTdHJpbmd9
IFRoZSBjYXBpdGFsaXplZCBzdHJpbmcuCi0gICovCi0gIGNhcGl0YWxpemU6IGZ1bmN0aW9uKHN0
cikgewotICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3Ry
KDEpOwotICB9Ci19OwotCi0KLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0KLQotdmFyIGZtdCA9
IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgdyAgID0gRW1iZXIuU3RyaW5nLncsCi0gICAgbG9jID0g
RW1iZXIuU3RyaW5nLmxvYywKLSAgICBjYW1lbGl6ZSA9IEVtYmVyLlN0cmluZy5jYW1lbGl6ZSwK
LSAgICBkZWNhbWVsaXplID0gRW1iZXIuU3RyaW5nLmRlY2FtZWxpemUsCi0gICAgZGFzaGVyaXpl
ID0gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZSwKLSAgICB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5n
LnVuZGVyc2NvcmUsCi0gICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBpdGFsaXplLAot
ICAgIGNsYXNzaWZ5ID0gRW1iZXIuU3RyaW5nLmNsYXNzaWZ5OwotCi0KLWlmIChFbWJlci5FWFRF
TkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcp
IHsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5mbXRdKC9hcGkvY2xhc3Nlcy9FbWJl
ci5TdHJpbmcuaHRtbCNtZXRob2RfZm10KS4KLQotICAgIEBtZXRob2QgZm10Ci0gICAgQGZvciBT
dHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5mbXQgPSBmdW5jdGlvbigpIHsKLSAgICBy
ZXR1cm4gZm10KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJl
ci5TdHJpbmcud10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF93KS4KLQot
ICAgIEBtZXRob2QgdwotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUu
dyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB3KHRoaXMpOwotICB9OwotCi0gIC8qKgotICAg
IFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21l
dGhvZF9sb2MpLgotCi0gICAgQG1ldGhvZCBsb2MKLSAgICBAZm9yIFN0cmluZwotICAqLwotICBT
dHJpbmcucHJvdG90eXBlLmxvYyA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBsb2ModGhpcywg
YXJndW1lbnRzKTsKLSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5jYW1lbGl6
ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYW1lbGl6ZSkuCi0KLSAg
ICBAbWV0aG9kIGNhbWVsaXplCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3Rv
dHlwZS5jYW1lbGl6ZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBjYW1lbGl6ZSh0aGlzKTsK
LSAgfTsKLQotICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy5kZWNhbWVsaXplXSgvYXBpL2Ns
YXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2RlY2FtZWxpemUpLgotCi0gICAgQG1ldGhv
ZCBkZWNhbWVsaXplCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS5k
ZWNhbWVsaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGRlY2FtZWxpemUodGhpcyk7Ci0g
IH07Ci0KLSAgLyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNz
ZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rhc2hlcml6ZSkuCi0KLSAgICBAbWV0aG9kIGRh
c2hlcml6ZQotICAgIEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuZGFzaGVy
aXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGRhc2hlcml6ZSh0aGlzKTsKLSAgfTsKLQot
ICAvKioKLSAgICBTZWUgW0VtYmVyLlN0cmluZy51bmRlcnNjb3JlXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX3VuZGVyc2NvcmUpLgotCi0gICAgQG1ldGhvZCB1bmRlcnNj
b3JlCi0gICAgQGZvciBTdHJpbmcKLSAgKi8KLSAgU3RyaW5nLnByb3RvdHlwZS51bmRlcnNjb3Jl
ID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHVuZGVyc2NvcmUodGhpcyk7Ci0gIH07Ci0KLSAg
LyoqCi0gICAgU2VlIFtFbWJlci5TdHJpbmcuY2xhc3NpZnldKC9hcGkvY2xhc3Nlcy9FbWJlci5T
dHJpbmcuaHRtbCNtZXRob2RfY2xhc3NpZnkpLgotCi0gICAgQG1ldGhvZCBjbGFzc2lmeQotICAg
IEBmb3IgU3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuY2xhc3NpZnkgPSBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gY2xhc3NpZnkodGhpcyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgU2Vl
IFtFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2FwaS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1s
I21ldGhvZF9jYXBpdGFsaXplKS4KLQotICAgIEBtZXRob2QgY2FwaXRhbGl6ZQotICAgIEBmb3Ig
U3RyaW5nCi0gICovCi0gIFN0cmluZy5wcm90b3R5cGUuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMpOwotICB9OwotCi0gIAotfQotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1i
ZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5z
ZXQsCi0gICAgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCi0gICAgZ2V0UHJvcGVydGll
cyA9IEVtYmVyLmdldFByb3BlcnRpZXM7Ci0KLS8qKgotICAjIyBPdmVydmlldwotCi0gIFRoaXMg
bWl4aW4gcHJvdmlkZXMgcHJvcGVydGllcyBhbmQgcHJvcGVydHkgb2JzZXJ2aW5nIGZ1bmN0aW9u
YWxpdHksIGNvcmUKLSAgZmVhdHVyZXMgb2YgdGhlIEVtYmVyIG9iamVjdCBtb2RlbC4KLQotICBQ
cm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMgYWxsb3cgb25lIG9iamVjdCB0byBvYnNlcnZlIGNoYW5n
ZXMgdG8gYQotICBwcm9wZXJ0eSBvbiBhbm90aGVyIG9iamVjdC4gVGhpcyBpcyBvbmUgb2YgdGhl
IGZ1bmRhbWVudGFsIHdheXMgdGhhdAotICBtb2RlbHMsIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyBj
b21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgaW4gYW4gRW1iZXIKLSAgYXBwbGljYXRpb24uCi0K
LSAgQW55IG9iamVjdCB0aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4g
b2JzZXJ2ZXIKLSAgb3BlcmF0aW9ucy4gVGhhdCBpbmNsdWRlcyBgRW1iZXIuT2JqZWN0YCBhbmQg
bW9zdCBvYmplY3RzIHlvdSB3aWxsCi0gIGludGVyYWN0IHdpdGggYXMgeW91IHdyaXRlIHlvdXIg
RW1iZXIgYXBwbGljYXRpb24uCi0KLSAgTm90ZSB0aGF0IHlvdSB3aWxsIG5vdCBnZW5lcmFsbHkg
YXBwbHkgdGhpcyBtaXhpbiB0byBjbGFzc2VzIHlvdXJzZWxmLAotICBidXQgeW91IHdpbGwgdXNl
IHRoZSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBmcmVxdWVudGx5LCBzbyBpdAot
ICBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBob3cgdG8gdXNlIGl0LgotCi0gICMjIFVzaW5n
IGBnZXQoKWAgYW5kIGBzZXQoKWAKLQotICBCZWNhdXNlIG9mIEVtYmVyJ3Mgc3VwcG9ydCBmb3Ig
YmluZGluZ3MgYW5kIG9ic2VydmVycywgeW91IHdpbGwgYWx3YXlzCi0gIGFjY2VzcyBwcm9wZXJ0
aWVzIHVzaW5nIHRoZSBnZXQgbWV0aG9kLCBhbmQgc2V0IHByb3BlcnRpZXMgdXNpbmcgdGhlCi0g
IHNldCBtZXRob2QuIFRoaXMgYWxsb3dzIHRoZSBvYnNlcnZpbmcgb2JqZWN0cyB0byBiZSBub3Rp
ZmllZCBhbmQKLSAgY29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSBoYW5kbGVkIHByb3Blcmx5Lgot
Ci0gIE1vcmUgZG9jdW1lbnRhdGlvbiBhYm91dCBgZ2V0YCBhbmQgYHNldGAgYXJlIGJlbG93Lgot
Ci0gICMjIE9ic2VydmluZyBQcm9wZXJ0eSBDaGFuZ2VzCi0KLSAgWW91IHR5cGljYWxseSBvYnNl
cnZlIHByb3BlcnR5IGNoYW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAotICBj
YWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhh
dCB5b3Ugd3JpdGUuCi0gIEZvciBleGFtcGxlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIu
T2JqZWN0LmV4dGVuZCh7Ci0gICAgdmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAv
LyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCi0gICAgfS5v
YnNlcnZlcygndmFsdWUnKQotICB9KTsKLSAgYGBgCi0KLSAgQWx0aG91Z2ggdGhpcyBpcyB0aGUg
bW9zdCBjb21tb24gd2F5IHRvIGFkZCBhbiBvYnNlcnZlciwgdGhpcyBjYXBhYmlsaXR5Ci0gIGlz
IGFjdHVhbGx5IGJ1aWx0IGludG8gdGhlIGBFbWJlci5PYmplY3RgIGNsYXNzIG9uIHRvcCBvZiB0
d28gbWV0aG9kcwotICBkZWZpbmVkIGluIHRoaXMgbWl4aW46IGBhZGRPYnNlcnZlcmAgYW5kIGBy
ZW1vdmVPYnNlcnZlcmAuIFlvdSBjYW4gdXNlCi0gIHRoZXNlIHR3byBtZXRob2RzIHRvIGFkZCBh
bmQgcmVtb3ZlIG9ic2VydmVycyB5b3Vyc2VsZiBpZiB5b3UgbmVlZCB0bwotICBkbyBzbyBhdCBy
dW50aW1lLgotCi0gIFRvIGFkZCBhbiBvYnNlcnZlciBmb3IgYSBwcm9wZXJ0eSwgY2FsbDoKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIG9iamVjdC5hZGRPYnNlcnZlcigncHJvcGVydHlLZXknLCB0YXJn
ZXRPYmplY3QsIHRhcmdldEFjdGlvbikKLSAgYGBgCi0KLSAgVGhpcyB3aWxsIGNhbGwgdGhlIGB0
YXJnZXRBY3Rpb25gIG1ldGhvZCBvbiB0aGUgYHRhcmdldE9iamVjdGAgd2hlbmV2ZXIKLSAgdGhl
IHZhbHVlIG9mIHRoZSBgcHJvcGVydHlLZXlgIGNoYW5nZXMuCi0KLSAgTm90ZSB0aGF0IGlmIGBw
cm9wZXJ0eUtleWAgaXMgYSBjb21wdXRlZCBwcm9wZXJ0eSwgdGhlIG9ic2VydmVyIHdpbGwgYmUK
LSAgY2FsbGVkIHdoZW4gYW55IG9mIHRoZSBwcm9wZXJ0eSBkZXBlbmRlbmNpZXMgYXJlIGNoYW5n
ZWQsIGV2ZW4gaWYgdGhlCi0gIHJlc3VsdGluZyB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVy
dHkgaXMgdW5jaGFuZ2VkLiBUaGlzIGlzIG5lY2Vzc2FyeQotICBiZWNhdXNlIGNvbXB1dGVkIHBy
b3BlcnRpZXMgYXJlIG5vdCBjb21wdXRlZCB1bnRpbCBgZ2V0YCBpcyBjYWxsZWQuCi0KLSAgQGNs
YXNzIE9ic2VydmFibGUKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLk9ic2VydmFibGUg
PSBFbWJlci5NaXhpbi5jcmVhdGUoewotCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUg
b2YgYSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3QuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyB1c3Vh
bGx5IHNpbWlsYXIgdG8gdXNpbmcgYG9iamVjdFtrZXlOYW1lXWAgb3IgYG9iamVjdC5rZXlOYW1l
YCwKLSAgICBob3dldmVyIGl0IHN1cHBvcnRzIGJvdGggY29tcHV0ZWQgcHJvcGVydGllcyBhbmQg
dGhlIHVua25vd25Qcm9wZXJ0eQotICAgIGhhbmRsZXIuCi0KLSAgICBCZWNhdXNlIGBnZXRgIHVu
aWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5nIGFsbCB0aGVzZSBraW5kcwotICAgIG9mIHBy
b3BlcnRpZXMsIGl0IGNhbiBtYWtlIG1hbnkgcmVmYWN0b3JpbmdzIGVhc2llciwgc3VjaCBhcyBy
ZXBsYWNpbmcgYQotICAgIHNpbXBsZSBwcm9wZXJ0eSB3aXRoIGEgY29tcHV0ZWQgcHJvcGVydHks
IG9yIHZpY2UgdmVyc2EuCi0KLSAgICAjIyMgQ29tcHV0ZWQgUHJvcGVydGllcwotCi0gICAgQ29t
cHV0ZWQgcHJvcGVydGllcyBhcmUgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBwcm9wZXJ0eWAg
bW9kaWZpZXIKLSAgICBkZWNsYXJlZCBhdCB0aGUgZW5kLCBzdWNoIGFzOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIGZ1bGxOYW1lOiBmdW5jdGlvbigpIHsKLSAgICAgIHJldHVybiB0aGlzLmdl
dCgnZmlyc3ROYW1lJykgKyAnICcgKyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKLSAgICB9LnByb3Bl
cnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAgIGBgYAotCi0gICAgV2hlbiB5b3UgY2Fs
bCBgZ2V0YCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5LCB0aGUgZnVuY3Rpb24gd2lsbCBiZQotICAg
IGNhbGxlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2Yg
dGhlIGZ1bmN0aW9uCi0gICAgaXRzZWxmLgotCi0gICAgIyMjIFVua25vd24gUHJvcGVydGllcwot
Ci0gICAgTGlrZXdpc2UsIGlmIHlvdSB0cnkgdG8gY2FsbCBgZ2V0YCBvbiBhIHByb3BlcnR5IHdo
b3NlIHZhbHVlIGlzCi0gICAgYHVuZGVmaW5lZGAsIHRoZSBgdW5rbm93blByb3BlcnR5KClgIG1l
dGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgb2JqZWN0LgotICAgIElmIHRoaXMgbWV0aG9kIHJl
dHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4gYHVuZGVmaW5lZGAsIGl0IHdpbGwgYmUgcmV0dXJu
ZWQKLSAgICBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gaW1wbGVtZW50ICJ2aXJ0dWFsIiBw
cm9wZXJ0aWVzIHRoYXQgYXJlCi0gICAgbm90IGRlZmluZWQgdXBmcm9udC4KLQotICAgIEBtZXRo
b2QgZ2V0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IHRvIHJldHJp
ZXZlCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdW5kZWZpbmVk
LgotICAqLwotICBnZXQ6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMs
IGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFRvIGdldCBtdWx0aXBsZSBwcm9wZXJ0aWVz
IGF0IG9uY2UsIGNhbGwgYGdldFByb3BlcnRpZXNgCi0gICAgd2l0aCBhIGxpc3Qgb2Ygc3RyaW5n
cyBvciBhbiBhcnJheToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICByZWNvcmQuZ2V0UHJvcGVy
dGllcygnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnKTsgIC8vIHsgZmlyc3ROYW1l
OiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9Ci0gICAgYGBgCi0K
LSAgICBpcyBlcXVpdmFsZW50IHRvOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHJlY29yZC5n
ZXRQcm9wZXJ0aWVzKFsnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnXSk7ICAvLyB7
IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIHppcENvZGU6ICcxMDAxMScgfQot
ICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZXRQcm9wZXJ0aWVzCi0gICAgQHBhcmFtIHtTdHJpbmcu
Li58QXJyYXl9IGxpc3Qgb2Yga2V5cyB0byBnZXQKLSAgICBAcmV0dXJuIHtIYXNofQotICAqLwot
ICBnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gZ2V0UHJvcGVydGllcy5h
cHBseShudWxsLCBbdGhpc10uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwotICB9LAot
Ci0gIC8qKgotICAgIFNldHMgdGhlIHByb3ZpZGVkIGtleSBvciBwYXRoIHRvIHRoZSB2YWx1ZS4K
LQotICAgIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSB2ZXJ5IHNpbWlsYXIgdG8gY2FsbGluZyBg
b2JqZWN0W2tleV0gPSB2YWx1ZWAgb3IKLSAgICBgb2JqZWN0LmtleSA9IHZhbHVlYCwgZXhjZXB0
IHRoYXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgY29tcHV0ZWQKLSAgICBwcm9wZXJ0aWVzLCB0
aGUgYHNldFVua25vd25Qcm9wZXJ0eSgpYCBtZXRob2QgYW5kIHByb3BlcnR5IG9ic2VydmVycy4K
LQotICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVzCi0KLSAgICBJZiB5b3UgdHJ5IHRvIHNldCBh
IHZhbHVlIG9uIGEga2V5IHRoYXQgaGFzIGEgY29tcHV0ZWQgcHJvcGVydHkgaGFuZGxlcgotICAg
IGRlZmluZWQgKHNlZSB0aGUgYGdldCgpYCBtZXRob2QgZm9yIGFuIGV4YW1wbGUpLCB0aGVuIGBz
ZXQoKWAgd2lsbCBjYWxsCi0gICAgdGhhdCBtZXRob2QsIHBhc3NpbmcgYm90aCB0aGUgdmFsdWUg
YW5kIGtleSBpbnN0ZWFkIG9mIHNpbXBseSBjaGFuZ2luZwotICAgIHRoZSB2YWx1ZSBpdHNlbGYu
IFRoaXMgaXMgdXNlZnVsIGZvciB0aG9zZSB0aW1lcyB3aGVuIHlvdSBuZWVkIHRvCi0gICAgaW1w
bGVtZW50IGEgcHJvcGVydHkgdGhhdCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZSBtZW1iZXIK
LSAgICBwcm9wZXJ0aWVzLgotCi0gICAgIyMjIFVua25vd24gUHJvcGVydGllcwotCi0gICAgSWYg
eW91IHRyeSB0byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGlzIHVuZGVmaW5lZCBpbiB0aGUg
dGFyZ2V0Ci0gICAgb2JqZWN0LCB0aGVuIHRoZSBgc2V0VW5rbm93blByb3BlcnR5KClgIGhhbmRs
ZXIgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZC4gVGhpcwotICAgIGdpdmVzIHlvdSBhbiBvcHBvcnR1
bml0eSB0byBpbXBsZW1lbnQgY29tcGxleCAidmlydHVhbCIgcHJvcGVydGllcyB0aGF0Ci0gICAg
YXJlIG5vdCBwcmVkZWZpbmVkIG9uIHRoZSBvYmplY3QuIElmIGBzZXRVbmtub3duUHJvcGVydHko
KWAgcmV0dXJucwotICAgIHVuZGVmaW5lZCwgdGhlbiBgc2V0KClgIHdpbGwgc2ltcGx5IHNldCB0
aGUgdmFsdWUgb24gdGhlIG9iamVjdC4KLQotICAgICMjIyBQcm9wZXJ0eSBPYnNlcnZlcnMKLQot
ICAgIEluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBwcm9wZXJ0eSwgYHNldCgpYCB3aWxsIGFs
c28gcmVnaXN0ZXIgYSBwcm9wZXJ0eQotICAgIGNoYW5nZSB3aXRoIHRoZSBvYmplY3QuIFVubGVz
cyB5b3UgaGF2ZSBwbGFjZWQgdGhpcyBjYWxsIGluc2lkZSBvZiBhCi0gICAgYGJlZ2luUHJvcGVy
dHlDaGFuZ2VzKClgIGFuZCBgZW5kUHJvcGVydHlDaGFuZ2VzKCksYCBhbnkgImxvY2FsIiBvYnNl
cnZlcnMKLSAgICAoaS5lLiBvYnNlcnZlciBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBzYW1lIG9i
amVjdCksIHdpbGwgYmUgY2FsbGVkCi0gICAgaW1tZWRpYXRlbHkuIEFueSAicmVtb3RlIiBvYnNl
cnZlcnMgKGkuZS4gb2JzZXJ2ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbgotICAgIGFub3RoZXIgb2Jq
ZWN0KSB3aWxsIGJlIHBsYWNlZCBpbiBhIHF1ZXVlIGFuZCBjYWxsZWQgYXQgYSBsYXRlciB0aW1l
IGluIGEKLSAgICBjb2FsZXNjZWQgbWFubmVyLgotCi0gICAgIyMjIENoYWluaW5nCi0KLSAgICBJ
biBhZGRpdGlvbiB0byBwcm9wZXJ0eSBjaGFuZ2VzLCBgc2V0KClgIHJldHVybnMgdGhlIHZhbHVl
IG9mIHRoZSBvYmplY3QKLSAgICBpdHNlbGYgc28geW91IGNhbiBkbyBjaGFpbmluZyBsaWtlIHRo
aXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVjb3JkLnNldCgnZmlyc3ROYW1lJywgJ0No
YXJsZXMnKS5zZXQoJ2xhc3ROYW1lJywgJ0pvbGxleScpOwotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCBzZXQKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgcHJvcGVydHkgdG8gc2V0Ci0g
ICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgb3IgYG51bGxgLgotICAg
IEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9Ci0gICovCi0gIHNldDogZnVuY3Rpb24oa2V5TmFt
ZSwgdmFsdWUpIHsKLSAgICBzZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOwotICAgIHJldHVybiB0
aGlzOwotICB9LAotCi0KLSAgLyoqCi0gICAgU2V0cyBhIGxpc3Qgb2YgcHJvcGVydGllcyBhdCBv
bmNlLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgaW5zaWRlCi0gICAgYSBzaW5nbGUgYGJlZ2lu
UHJvcGVydHlDaGFuZ2VzYCBhbmQgYGVuZFByb3BlcnR5Q2hhbmdlc2AgYmF0Y2gsIHNvCi0gICAg
b2JzZXJ2ZXJzIHdpbGwgYmUgYnVmZmVyZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcmVj
b3JkLnNldFByb3BlcnRpZXMoeyBmaXJzdE5hbWU6ICdDaGFybGVzJywgbGFzdE5hbWU6ICdKb2xs
ZXknIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCi0gICAgQHBhcmFt
IHtIYXNofSBoYXNoIHRoZSBoYXNoIG9mIGtleXMgYW5kIHZhbHVlcyB0byBzZXQKLSAgICBAcmV0
dXJuIHtFbWJlci5PYnNlcnZhYmxlfQotICAqLwotICBzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbiho
YXNoKSB7Ci0gICAgcmV0dXJuIEVtYmVyLnNldFByb3BlcnRpZXModGhpcywgaGFzaCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQmVnaW5zIGEgZ3JvdXBpbmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KLQot
ICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGdyb3VwIHByb3BlcnR5IGNoYW5nZXMgc28g
dGhhdCBub3RpZmljYXRpb25zCi0gICAgd2lsbCBub3QgYmUgc2VudCB1bnRpbCB0aGUgY2hhbmdl
cyBhcmUgZmluaXNoZWQuIElmIHlvdSBwbGFuIHRvIG1ha2UgYQotICAgIGxhcmdlIG51bWJlciBv
ZiBjaGFuZ2VzIHRvIGFuIG9iamVjdCBhdCBvbmUgdGltZSwgeW91IHNob3VsZCBjYWxsIHRoaXMK
LSAgICBtZXRob2QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2hhbmdlcyB0byBiZWdpbiBkZWZl
cnJpbmcgY2hhbmdlCi0gICAgbm90aWZpY2F0aW9ucy4gV2hlbiB5b3UgYXJlIGRvbmUgbWFraW5n
IGNoYW5nZXMsIGNhbGwKLSAgICBgZW5kUHJvcGVydHlDaGFuZ2VzKClgIHRvIGRlbGl2ZXIgdGhl
IGRlZmVycmVkIGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCBlbmQKLSAgICBkZWZlcnJpbmcuCi0K
LSAgICBAbWV0aG9kIGJlZ2luUHJvcGVydHlDaGFuZ2VzCi0gICAgQHJldHVybiB7RW1iZXIuT2Jz
ZXJ2YWJsZX0KLSAgKi8KLSAgYmVnaW5Qcm9wZXJ0eUNoYW5nZXM6IGZ1bmN0aW9uKCkgewotICAg
IEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgRW5kcyBhIGdyb3VwaW5nIG9mIHByb3BlcnR5IGNoYW5nZXMuCi0KLSAgICBZ
b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBncm91cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQg
bm90aWZpY2F0aW9ucwotICAgIHdpbGwgbm90IGJlIHNlbnQgdW50aWwgdGhlIGNoYW5nZXMgYXJl
IGZpbmlzaGVkLiBJZiB5b3UgcGxhbiB0byBtYWtlIGEKLSAgICBsYXJnZSBudW1iZXIgb2YgY2hh
bmdlcyB0byBhbiBvYmplY3QgYXQgb25lIHRpbWUsIHlvdSBzaG91bGQgY2FsbAotICAgIGBiZWdp
blByb3BlcnR5Q2hhbmdlcygpYCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGRl
ZmVyIGNoYW5nZQotICAgIG5vdGlmaWNhdGlvbnMuIFdoZW4geW91IGFyZSBkb25lIG1ha2luZyBj
aGFuZ2VzLCBjYWxsIHRoaXMgbWV0aG9kIHRvCi0gICAgZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hh
bmdlIG5vdGlmaWNhdGlvbnMgYW5kIGVuZCBkZWZlcnJpbmcuCi0KLSAgICBAbWV0aG9kIGVuZFBy
b3BlcnR5Q2hhbmdlcwotICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9Ci0gICovCi0gIGVu
ZFByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFu
Z2VzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgTm90aWZ5IHRoZSBv
YnNlcnZlciBzeXN0ZW0gdGhhdCBhIHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZS4KLQotICAg
IFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2UgYSB2YWx1ZSBkaXJlY3RseSBvciBpbmRpcmVj
dGx5IHdpdGhvdXQKLSAgICBhY3R1YWxseSBjYWxsaW5nIGBnZXQoKWAgb3IgYHNldCgpYCBvbiBp
dC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSB0aGlzCi0gICAgbWV0aG9kIGFuZCBgcHJvcGVy
dHlEaWRDaGFuZ2UoKWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28gbWV0aG9kcwotICAgIHRv
Z2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBv
dGVudGlhbGx5Ci0gICAgY2hhbmdlZCB2YWx1ZS4KLQotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBh
bHdheXMgY2FsbCBgcHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAot
ICAgIGFzIGEgcGFpci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hh
bmdlIGdyb3VwcyBvdXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBi
ZSBkZWxpdmVyZWQgbW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAgIGxpa2UuCi0KLSAgICBA
bWV0aG9kIHByb3BlcnR5V2lsbENoYW5nZQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRo
ZSBwcm9wZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0byBjaGFuZ2UuCi0gICAgQHJldHVybiB7RW1i
ZXIuT2JzZXJ2YWJsZX0KLSAgKi8KLSAgcHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbihrZXlO
YW1lKSB7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwotICAg
IHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lz
dGVtIHRoYXQgYSBwcm9wZXJ0eSBoYXMganVzdCBjaGFuZ2VkLgotCi0gICAgU29tZXRpbWVzIHlv
dSBuZWVkIHRvIGNoYW5nZSBhIHZhbHVlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aG91dAot
ICAgIGFjdHVhbGx5IGNhbGxpbmcgYGdldCgpYCBvciBgc2V0KClgIG9uIGl0LiBJbiB0aGlzIGNh
c2UsIHlvdSBjYW4gdXNlIHRoaXMKLSAgICBtZXRob2QgYW5kIGBwcm9wZXJ0eVdpbGxDaGFuZ2Uo
KWAgaW5zdGVhZC4gQ2FsbGluZyB0aGVzZSB0d28gbWV0aG9kcwotICAgIHRvZ2V0aGVyIHdpbGwg
bm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhhdCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5Ci0g
ICAgY2hhbmdlZCB2YWx1ZS4KLQotICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBg
cHJvcGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAotICAgIGFzIGEgcGFp
ci4gSWYgeW91IGRvIG5vdCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBv
dXQgb2YKLSAgICBvcmRlciBhbmQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBkZWxpdmVyZWQg
bW9yZSBvZnRlbiB0aGFuIHlvdSB3b3VsZAotICAgIGxpa2UuCi0KLSAgICBAbWV0aG9kIHByb3Bl
cnR5RGlkQ2hhbmdlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IGtl
eSB0aGF0IGhhcyBqdXN0IGNoYW5nZWQuCi0gICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0K
LSAgKi8KLSAgcHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICBFbWJl
ci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKLSAgICByZXR1cm4gdGhpczsKLSAg
fSwKLQotICAvKioKLSAgICBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBgcHJvcGVydHlXaWxs
Q2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYCBpbgotICAgIHN1Y2Nlc3Npb24uCi0KLSAg
ICBAbWV0aG9kIG5vdGlmeVByb3BlcnR5Q2hhbmdlCi0gICAgQHBhcmFtIHtTdHJpbmd9IGtleU5h
bWUgVGhlIHByb3BlcnR5IGtleSB0byBiZSBub3RpZmllZCBhYm91dC4KLSAgICBAcmV0dXJuIHtF
bWJlci5PYnNlcnZhYmxlfQotICAqLwotICBub3RpZnlQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24o
a2V5TmFtZSkgewotICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGtleU5hbWUpOwotICAgIHRo
aXMucHJvcGVydHlEaWRDaGFuZ2Uoa2V5TmFtZSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0K
LSAgYWRkQmVmb3JlT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAg
ICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdldCwgbWV0aG9kKTsKLSAg
fSwKLQotICAvKioKLSAgICBBZGRzIGFuIG9ic2VydmVyIG9uIGEgcHJvcGVydHkuCi0KLSAgICBU
aGlzIGlzIHRoZSBjb3JlIG1ldGhvZCB1c2VkIHRvIHJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBh
IHByb3BlcnR5LgotCi0gICAgT25jZSB5b3UgY2FsbCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhl
IGtleSdzIHZhbHVlIGlzIHNldCwgeW91ciBvYnNlcnZlcgotICAgIHdpbGwgYmUgbm90aWZpZWQu
IE5vdGUgdGhhdCB0aGUgb2JzZXJ2ZXJzIGFyZSB0cmlnZ2VyZWQgYW55IHRpbWUgdGhlCi0gICAg
dmFsdWUgaXMgc2V0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFzIGFjdHVhbGx5IGNoYW5n
ZWQuIFlvdXIKLSAgICBvYnNlcnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQu
Ci0KLSAgICBZb3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCBjb250ZXh0IHBhcmFtZXRlciB0
byB0aGlzIG1ldGhvZC4gVGhlCi0gICAgY29udGV4dCB3aWxsIGJlIHBhc3NlZCB0byB5b3VyIG9i
c2VydmVyIG1ldGhvZCB3aGVuZXZlciBpdCBpcyB0cmlnZ2VyZWQuCi0gICAgTm90ZSB0aGF0IGlm
IHlvdSBhZGQgdGhlIHNhbWUgdGFyZ2V0L21ldGhvZCBwYWlyIG9uIGEga2V5IG11bHRpcGxlIHRp
bWVzCi0gICAgd2l0aCBkaWZmZXJlbnQgY29udGV4dCBwYXJhbWV0ZXJzLCB5b3VyIG9ic2VydmVy
IHdpbGwgb25seSBiZSBjYWxsZWQgb25jZQotICAgIHdpdGggdGhlIGxhc3QgY29udGV4dCB5b3Ug
cGFzc2VkLgotCi0gICAgIyMjIE9ic2VydmVyIE1ldGhvZHMKLQotICAgIE9ic2VydmVyIG1ldGhv
ZHMgeW91IHBhc3Mgc2hvdWxkIGdlbmVyYWxseSBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJl
IGlmCi0gICAgeW91IGRvIG5vdCBwYXNzIGEgYGNvbnRleHRgIHBhcmFtZXRlcjoKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBmb29EaWRDaGFuZ2U6IGZ1bmN0aW9uKHNlbmRlciwga2V5LCB2YWx1
ZSwgcmV2KSB7IH07Ci0gICAgYGBgCi0KLSAgICBUaGUgc2VuZGVyIGlzIHRoZSBvYmplY3QgdGhh
dCBjaGFuZ2VkLiBUaGUga2V5IGlzIHRoZSBwcm9wZXJ0eSB0aGF0Ci0gICAgY2hhbmdlcy4gVGhl
IHZhbHVlIHByb3BlcnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUgcmV2
Ci0gICAgaXMgdGhlIGxhc3QgcHJvcGVydHkgcmV2aXNpb24gb2YgdGhlIG9iamVjdCB3aGVuIGl0
IGNoYW5nZWQsIHdoaWNoIHlvdSBjYW4KLSAgICB1c2UgdG8gZGV0ZWN0IGlmIHRoZSBrZXkgdmFs
dWUgaGFzIHJlYWxseSBjaGFuZ2VkIG9yIG5vdC4KLQotICAgIElmIHlvdSBwYXNzIGEgYGNvbnRl
eHRgIHBhcmFtZXRlciwgdGhlIGNvbnRleHQgd2lsbCBiZSBwYXNzZWQgYmVmb3JlIHRoZQotICAg
IHJldmlzaW9uIGxpa2Ugc286Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZm9vRGlkQ2hhbmdl
OiBmdW5jdGlvbihzZW5kZXIsIGtleSwgdmFsdWUsIGNvbnRleHQsIHJldikgeyB9OwotICAgIGBg
YAotCi0gICAgVXN1YWxseSB5b3Ugd2lsbCBub3QgbmVlZCB0aGUgdmFsdWUsIGNvbnRleHQgb3Ig
cmV2aXNpb24gcGFyYW1ldGVycyBhdAotICAgIHRoZSBlbmQuIEluIHRoaXMgY2FzZSwgaXQgaXMg
Y29tbW9uIHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0YWtlCi0gICAgb25seSBhIHNl
bmRlciBhbmQga2V5IHZhbHVlIGFzIHBhcmFtZXRlcnMgb3IsIGlmIHlvdSBhcmVuJ3QgaW50ZXJl
c3RlZCBpbgotICAgIGFueSBvZiB0aGVzZSB2YWx1ZXMsIHRvIHdyaXRlIGFuIG9ic2VydmVyIHRo
YXQgaGFzIG5vIHBhcmFtZXRlcnMgYXQgYWxsLgotCi0gICAgQG1ldGhvZCBhZGRPYnNlcnZlcgot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBvYnNlcnZlcgotICAgIEBwYXJhbSB7
T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCi0gICAgQHBhcmFtIHtT
dHJpbmd8RnVuY3Rpb259IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBAcmV0dXJu
IHtFbWJlci5PYmplY3R9IHNlbGYKLSAgKi8KLSAgYWRkT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwg
dGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlzLCBrZXksIHRhcmdl
dCwgbWV0aG9kKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmUgYW4gb2JzZXJ2ZXIgeW91IGhh
dmUgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIHRoaXMgb2JqZWN0LiBQYXNzCi0gICAgdGhlIHNh
bWUga2V5LCB0YXJnZXQsIGFuZCBtZXRob2QgeW91IHBhc3NlZCB0byBgYWRkT2JzZXJ2ZXIoKWAg
YW5kIHlvdXIKLSAgICB0YXJnZXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25z
LgotCi0gICAgQG1ldGhvZCByZW1vdmVPYnNlcnZlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkg
VGhlIGtleSB0byBvYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdl
dCBvYmplY3QgdG8gaW52b2tlCi0gICAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1ldGhvZCBU
aGUgbWV0aG9kIHRvIGludm9rZS4KLSAgICBAcmV0dXJuIHtFbWJlci5PYnNlcnZhYmxlfSByZWNl
aXZlcgotICAqLwotICByZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIG1ldGhv
ZCkgewotICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0LCBtZXRob2Qp
OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3QgY3VycmVu
dGx5IGhhcyBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgYQotICAgIHBhcnRpY3VsYXIga2V5LiBZ
b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBwb3RlbnRpYWxseSBkZWZlciBwZXJmb3JtaW5nCi0g
ICAgYW4gZXhwZW5zaXZlIGFjdGlvbiB1bnRpbCBzb21lb25lIGJlZ2lucyBvYnNlcnZpbmcgYSBw
YXJ0aWN1bGFyIHByb3BlcnR5Ci0gICAgb24gdGhlIG9iamVjdC4KLQotICAgIEBtZXRob2QgaGFz
T2JzZXJ2ZXJGb3IKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBjaGVjawotICAgIEBy
ZXR1cm4ge0Jvb2xlYW59Ci0gICovCi0gIGhhc09ic2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsK
LSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIGtleSsnOmNoYW5nZScpOwotICB9
LAotCi0gIC8qKgotICAgIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgb3IgYSBk
ZWZhdWx0IHZhbHVlIGluIHRoZSBjYXNlIHRoYXQgdGhlCi0gICAgcHJvcGVydHkgcmV0dXJucyBg
dW5kZWZpbmVkYC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBwZXJzb24uZ2V0V2l0aERlZmF1
bHQoJ2xhc3ROYW1lJywgJ0RvZScpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZXRXaXRoRGVm
YXVsdAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0
eSB0byByZXRyaWV2ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVl
IHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdW5kZWZpbmVkCi0gICAgQHJldHVy
biB7T2JqZWN0fSBUaGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHRWYWx1ZS4KLSAgKi8K
LSAgZ2V0V2l0aERlZmF1bHQ6IGZ1bmN0aW9uKGtleU5hbWUsIGRlZmF1bHRWYWx1ZSkgewotICAg
IHJldHVybiBFbWJlci5nZXRXaXRoRGVmYXVsdCh0aGlzLCBrZXlOYW1lLCBkZWZhdWx0VmFsdWUp
OwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0byB0aGUg
Y3VycmVudCB2YWx1ZSBwbHVzIHNvbWUgYW1vdW50LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IHBlcnNvbi5pbmNyZW1lbnRQcm9wZXJ0eSgnYWdlJyk7Ci0gICAgdGVhbS5pbmNyZW1lbnRQcm9w
ZXJ0eSgnc2NvcmUnLCAyKTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgaW5jcmVtZW50UHJvcGVy
dHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkg
dG8gaW5jcmVtZW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGluY3JlbWVudCBUaGUgYW1vdW50IHRv
IGluY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQotICAgIEByZXR1cm4ge051bWJlcn0gVGhlIG5l
dyBwcm9wZXJ0eSB2YWx1ZQotICAqLwotICBpbmNyZW1lbnRQcm9wZXJ0eTogZnVuY3Rpb24oa2V5
TmFtZSwgaW5jcmVtZW50KSB7Ci0gICAgaWYgKEVtYmVyLmlzTm9uZShpbmNyZW1lbnQpKSB7IGlu
Y3JlbWVudCA9IDE7IH0KLSAgICBFbWJlci5hc3NlcnQoIk11c3QgcGFzcyBhIG51bWVyaWMgdmFs
dWUgdG8gaW5jcmVtZW50UHJvcGVydHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoaW5jcmVtZW50KSkg
JiYgaXNGaW5pdGUoaW5jcmVtZW50KSkpOwotICAgIHNldCh0aGlzLCBrZXlOYW1lLCAoZ2V0KHRo
aXMsIGtleU5hbWUpIHx8IDApICsgaW5jcmVtZW50KTsKLSAgICByZXR1cm4gZ2V0KHRoaXMsIGtl
eU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0
byB0aGUgY3VycmVudCB2YWx1ZSBtaW51cyBzb21lIGFtb3VudC4KLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBwbGF5ZXIuZGVjcmVtZW50UHJvcGVydHkoJ2xpdmVzJyk7Ci0gICAgb3JjLmRlY3Jl
bWVudFByb3BlcnR5KCdoZWFsdGgnLCA1KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgZGVjcmVt
ZW50UHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBUaGUgbmFtZSBvZiB0aGUg
cHJvcGVydHkgdG8gZGVjcmVtZW50Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGRlY3JlbWVudCBUaGUg
YW1vdW50IHRvIGRlY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQotICAgIEByZXR1cm4ge051bWJl
cn0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQotICAqLwotICBkZWNyZW1lbnRQcm9wZXJ0eTogZnVu
Y3Rpb24oa2V5TmFtZSwgZGVjcmVtZW50KSB7Ci0gICAgaWYgKEVtYmVyLmlzTm9uZShkZWNyZW1l
bnQpKSB7IGRlY3JlbWVudCA9IDE7IH0KLSAgICBFbWJlci5hc3NlcnQoIk11c3QgcGFzcyBhIG51
bWVyaWMgdmFsdWUgdG8gZGVjcmVtZW50UHJvcGVydHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoZGVj
cmVtZW50KSkgJiYgaXNGaW5pdGUoZGVjcmVtZW50KSkpOwotICAgIHNldCh0aGlzLCBrZXlOYW1l
LCAoZ2V0KHRoaXMsIGtleU5hbWUpIHx8IDApIC0gZGVjcmVtZW50KTsKLSAgICByZXR1cm4gZ2V0
KHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8qKgotICAgIFNldCB0aGUgdmFsdWUgb2YgYSBi
b29sZWFuIHByb3BlcnR5IHRvIHRoZSBvcHBvc2l0ZSBvZiBpdCdzCi0gICAgY3VycmVudCB2YWx1
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0eSgnd2Fy
cERyaXZlRW5nYWdlZCcpOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCB0b2dnbGVQcm9wZXJ0eQot
ICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB0
b2dnbGUKLSAgICBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgcHJvcGVydHkgdmFsdWUKLSAgKi8K
LSAgdG9nZ2xlUHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICBzZXQodGhpcywga2V5
TmFtZSwgIWdldCh0aGlzLCBrZXlOYW1lKSk7Ci0gICAgcmV0dXJuIGdldCh0aGlzLCBrZXlOYW1l
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUgb2YgYSBjb21w
dXRlZCBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLgotICAgIFRoaXMgYWxsb3dzIHlvdSB0byBpbnNw
ZWN0IHRoZSB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgd2l0aG91dCBhY2NpZGVu
dGFsbHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKLSAgICBnZW5lcmF0ZWQg
bGF6aWx5LgotCi0gICAgQG1ldGhvZCBjYWNoZUZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlO
YW1lCi0gICAgQHJldHVybiB7T2JqZWN0fSBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSBjb21wdXRl
ZCBwcm9wZXJ0eSwgaWYgYW55Ci0gICovCi0gIGNhY2hlRm9yOiBmdW5jdGlvbihrZXlOYW1lKSB7
Ci0gICAgcmV0dXJuIEVtYmVyLmNhY2hlRm9yKHRoaXMsIGtleU5hbWUpOwotICB9LAotCi0gIC8v
IGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKLSAgb2JzZXJ2ZXJzRm9yS2V5OiBmdW5j
dGlvbihrZXlOYW1lKSB7Ci0gICAgcmV0dXJuIEVtYmVyLm9ic2VydmVyc0Zvcih0aGlzLCBrZXlO
YW1lKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1v
ZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLQotLy8gTk9URTog
dGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIGJlIGluY2x1ZGVkIGRpcmVjdGx5LiBJbnN0ZWFkIHVz
ZSBgRW1iZXIuT2JqZWN0YC4KLS8vIFdlIG9ubHkgZGVmaW5lIHRoaXMgc2VwYXJhdGVseSBzbyB0
aGF0IGBFbWJlci5TZXRgIGNhbiBkZXBlbmQgb24gaXQuCi0KLQotdmFyIHNldCA9IEVtYmVyLnNl
dCwgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIG9fY3JlYXRlID0gRW1iZXIuY3JlYXRlLAotICAgIG9f
ZGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwKLSAgICBHVUlE
X0tFWSA9IEVtYmVyLkdVSURfS0VZLAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9yLAotICAg
IGdlbmVyYXRlR3VpZCA9IEVtYmVyLmdlbmVyYXRlR3VpZCwKLSAgICBtZXRhID0gRW1iZXIubWV0
YSwKLSAgICByZXdhdGNoID0gRW1iZXIucmV3YXRjaCwKLSAgICBmaW5pc2hDaGFpbnMgPSBFbWJl
ci5maW5pc2hDaGFpbnMsCi0gICAgc2VuZEV2ZW50ID0gRW1iZXIuc2VuZEV2ZW50LAotICAgIGRl
c3Ryb3kgPSBFbWJlci5kZXN0cm95LAotICAgIHNjaGVkdWxlID0gRW1iZXIucnVuLnNjaGVkdWxl
LAotICAgIE1peGluID0gRW1iZXIuTWl4aW4sCi0gICAgYXBwbHlNaXhpbiA9IE1peGluLl9hcHBs
eSwKLSAgICBmaW5pc2hQYXJ0aWFsID0gTWl4aW4uZmluaXNoUGFydGlhbCwKLSAgICByZW9wZW4g
PSBNaXhpbi5wcm90b3R5cGUucmVvcGVuLAotICAgIE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5F
TlYuTUFOREFUT1JZX1NFVFRFUiwKLSAgICBpbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmluZGV4T2Y7Ci0KLXZhciB1bmRlZmluZWREZXNjcmlwdG9yID0gewotICBjb25maWd1cmFibGU6
IHRydWUsCi0gIHdyaXRhYmxlOiB0cnVlLAotICBlbnVtZXJhYmxlOiBmYWxzZSwKLSAgdmFsdWU6
IHVuZGVmaW5lZAotfTsKLQotZnVuY3Rpb24gbWFrZUN0b3IoKSB7Ci0KLSAgLy8gTm90ZTogYXZv
aWQgYWNjZXNzaW5nIGFueSBwcm9wZXJ0aWVzIG9uIHRoZSBvYmplY3Qgc2luY2UgaXQgbWFrZXMg
dGhlCi0gIC8vIG1ldGhvZCBhIGxvdCBmYXN0ZXIuIFRoaXMgaXMgZ2x1ZSBjb2RlIHNvIHdlIHdh
bnQgaXQgdG8gYmUgYXMgZmFzdCBhcwotICAvLyBwb3NzaWJsZS4KLQotICB2YXIgd2FzQXBwbGll
ZCA9IGZhbHNlLCBpbml0TWl4aW5zLCBpbml0UHJvcGVydGllczsKLQotICB2YXIgQ2xhc3MgPSBm
dW5jdGlvbigpIHsKLSAgICBpZiAoIXdhc0FwcGxpZWQpIHsKLSAgICAgIENsYXNzLnByb3RvKCk7
IC8vIHByZXBhcmUgcHJvdG90eXBlLi4uCi0gICAgfQotICAgIG9fZGVmaW5lUHJvcGVydHkodGhp
cywgR1VJRF9LRVksIHVuZGVmaW5lZERlc2NyaXB0b3IpOwotICAgIG9fZGVmaW5lUHJvcGVydHko
dGhpcywgJ19zdXBlcicsIHVuZGVmaW5lZERlc2NyaXB0b3IpOwotICAgIHZhciBtID0gbWV0YSh0
aGlzKSwgcHJvdG8gPSBtLnByb3RvOwotICAgIG0ucHJvdG8gPSB0aGlzOwotICAgIGlmIChpbml0
TWl4aW5zKSB7Ci0gICAgICAvLyBjYXB0dXJlIGxvY2FsbHkgc28gd2UgY2FuIGNsZWFyIHRoZSBj
bG9zZWQgb3ZlciB2YXJpYWJsZQotICAgICAgdmFyIG1peGlucyA9IGluaXRNaXhpbnM7Ci0gICAg
ICBpbml0TWl4aW5zID0gbnVsbDsKLSAgICAgIHRoaXMucmVvcGVuLmFwcGx5KHRoaXMsIG1peGlu
cyk7Ci0gICAgfQotICAgIGlmIChpbml0UHJvcGVydGllcykgewotICAgICAgLy8gY2FwdHVyZSBs
b2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUgY2xvc2VkIG92ZXIgdmFyaWFibGUKLSAgICAgIHZh
ciBwcm9wcyA9IGluaXRQcm9wZXJ0aWVzOwotICAgICAgaW5pdFByb3BlcnRpZXMgPSBudWxsOwot
Ci0gICAgICB2YXIgY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0ZW5hdGVkUHJv
cGVydGllczsKLQotICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwcm9wcy5sZW5ndGg7IGkgPCBs
OyBpKyspIHsKLSAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tpXTsKLQotICAgICAgICBF
bWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIG1peGlu
ZyBpbiBvdGhlciBkZWZpbml0aW9ucywgdXNlIGNyZWF0ZVdpdGhNaXhpbnMgaW5zdGVhZC4iLCAh
KHByb3BlcnRpZXMgaW5zdGFuY2VvZiBFbWJlci5NaXhpbikpOwotCi0gICAgICAgIGlmICh0eXBl
b2YgcHJvcGVydGllcyAhPT0gJ29iamVjdCcgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7
Ci0gICAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJFbWJlci5PYmplY3QuY3JlYXRlIG9u
bHkgYWNjZXB0cyBvYmplY3RzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwcm9wZXJ0
aWVzKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgdmFyIGtleU5hbWVzID0gRW1iZXIua2V5cyhw
cm9wZXJ0aWVzKTsKLQotICAgICAgICBmb3IgKHZhciBqID0gMCwgbGwgPSBrZXlOYW1lcy5sZW5n
dGg7IGogPCBsbDsgaisrKSB7Ci0gICAgICAgICAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1tqXTsK
LSAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5TmFtZSkpIHsgY29u
dGludWU7IH0KLQotICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BlcnRpZXNba2V5TmFtZV0sCi0g
ICAgICAgICAgICAgIElTX0JJTkRJTkcgPSBFbWJlci5JU19CSU5ESU5HOwotCi0gICAgICAgICAg
aWYgKElTX0JJTkRJTkcudGVzdChrZXlOYW1lKSkgewotICAgICAgICAgICAgdmFyIGJpbmRpbmdz
ID0gbS5iaW5kaW5nczsKLSAgICAgICAgICAgIGlmICghYmluZGluZ3MpIHsKLSAgICAgICAgICAg
ICAgYmluZGluZ3MgPSBtLmJpbmRpbmdzID0ge307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFt
Lmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7Ci0gICAgICAgICAgICAgIGJpbmRpbmdzID0g
bS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3MpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgYmluZGluZ3Nba2V5TmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAg
ICB2YXIgZGVzYyA9IG0uZGVzY3Nba2V5TmFtZV07Ci0KLSAgICAgICAgICBFbWJlci5hc3NlcnQo
IkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2VyIHN1cHBvcnRzIGRlZmluaW5nIGNvbXB1dGVk
IHByb3BlcnRpZXMuIiwgISh2YWx1ZSBpbnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkp
KTsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoIkVtYmVyLk9iamVjdC5jcmVhdGUgbm8gbG9uZ2Vy
IHN1cHBvcnRzIGRlZmluaW5nIG1ldGhvZHMgdGhhdCBjYWxsIF9zdXBlci4iLCAhKHR5cGVvZiB2
YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS50b1N0cmluZygpLmluZGV4T2YoJy5fc3VwZXIn
KSAhPT0gLTEpKTsKLSAgICAgICAgICBFbWJlci5hc3NlcnQoImBhY3Rpb25zYCBtdXN0IGJlIHBy
b3ZpZGVkIGF0IGV4dGVuZCB0aW1lLCBub3QgYXQgY3JlYXRlICIgKwotICAgICAgICAgICAgICAg
ICAgICAgICAidGltZSwgd2hlbiBFbWJlci5BY3Rpb25IYW5kbGVyIGlzIHVzZWQgKGkuZS4gdmll
d3MsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbGxlcnMgJiByb3V0ZXMpLiIs
ICEoKGtleU5hbWUgPT09ICdhY3Rpb25zJykgJiYgRW1iZXIuQWN0aW9uSGFuZGxlci5kZXRlY3Qo
dGhpcykpKTsKLQotICAgICAgICAgIGlmIChjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzICYmIGluZGV4
T2YoY29uY2F0ZW5hdGVkUHJvcGVydGllcywga2V5TmFtZSkgPj0gMCkgewotICAgICAgICAgICAg
dmFyIGJhc2VWYWx1ZSA9IHRoaXNba2V5TmFtZV07Ci0KLSAgICAgICAgICAgIGlmIChiYXNlVmFs
dWUpIHsKLSAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBiYXNlVmFsdWUu
Y29uY2F0KSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBiYXNlVmFsdWUuY29uY2F0KHZhbHVl
KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEVtYmVy
Lm1ha2VBcnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHZhbHVlID0gRW1iZXIubWFrZUFycmF5
KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZGVz
YykgewotICAgICAgICAgICAgZGVzYy5zZXQodGhpcywga2V5TmFtZSwgdmFsdWUpOwotICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0VW5rbm93blByb3Bl
cnR5ID09PSAnZnVuY3Rpb24nICYmICEoa2V5TmFtZSBpbiB0aGlzKSkgewotICAgICAgICAgICAg
ICB0aGlzLnNldFVua25vd25Qcm9wZXJ0eShrZXlOYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9
IGVsc2UgaWYgKE1BTkRBVE9SWV9TRVRURVIpIHsKLSAgICAgICAgICAgICAgRW1iZXIuZGVmaW5l
UHJvcGVydHkodGhpcywga2V5TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5kYXRvcnkg
c2V0dGVyCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0aGlzW2tleU5hbWVd
ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9
Ci0gICAgfQotICAgIGZpbmlzaFBhcnRpYWwodGhpcywgbSk7Ci0gICAgdGhpcy5pbml0LmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgbS5wcm90byA9IHByb3RvOwotICAgIGZpbmlzaENoYWlu
cyh0aGlzKTsKLSAgICBzZW5kRXZlbnQodGhpcywgImluaXQiKTsKLSAgfTsKLQotICBDbGFzcy50
b1N0cmluZyA9IE1peGluLnByb3RvdHlwZS50b1N0cmluZzsKLSAgQ2xhc3Mud2lsbFJlb3BlbiA9
IGZ1bmN0aW9uKCkgewotICAgIGlmICh3YXNBcHBsaWVkKSB7Ci0gICAgICBDbGFzcy5Qcm90b3R5
cGVNaXhpbiA9IE1peGluLmNyZWF0ZShDbGFzcy5Qcm90b3R5cGVNaXhpbik7Ci0gICAgfQotCi0g
ICAgd2FzQXBwbGllZCA9IGZhbHNlOwotICB9OwotICBDbGFzcy5faW5pdE1peGlucyA9IGZ1bmN0
aW9uKGFyZ3MpIHsgaW5pdE1peGlucyA9IGFyZ3M7IH07Ci0gIENsYXNzLl9pbml0UHJvcGVydGll
cyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdFByb3BlcnRpZXMgPSBhcmdzOyB9OwotCi0gIENsYXNz
LnByb3RvID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN1cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNs
YXNzOwotICAgIGlmIChzdXBlcmNsYXNzKSB7IHN1cGVyY2xhc3MucHJvdG8oKTsgfQotCi0gICAg
aWYgKCF3YXNBcHBsaWVkKSB7Ci0gICAgICB3YXNBcHBsaWVkID0gdHJ1ZTsKLSAgICAgIENsYXNz
LlByb3RvdHlwZU1peGluLmFwcGx5UGFydGlhbChDbGFzcy5wcm90b3R5cGUpOwotICAgICAgcmV3
YXRjaChDbGFzcy5wcm90b3R5cGUpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLnByb3RvdHlw
ZTsKLSAgfTsKLQotICByZXR1cm4gQ2xhc3M7Ci0KLX0KLQotLyoqCi0gIEBjbGFzcyBDb3JlT2Jq
ZWN0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi12YXIgQ29yZU9iamVjdCA9IG1ha2VDdG9yKCk7
Ci1Db3JlT2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuQ29yZU9i
amVjdCI7IH07Ci0KLUNvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4gPSBNaXhpbi5jcmVhdGUoewot
ICByZW9wZW46IGZ1bmN0aW9uKCkgewotICAgIGFwcGx5TWl4aW4odGhpcywgYXJndW1lbnRzLCB0
cnVlKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBBbiBvdmVycmlkYWJs
ZSBtZXRob2QgY2FsbGVkIHdoZW4gb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLiBCeSBkZWZhdWx0
LAotICAgIGRvZXMgbm90aGluZyB1bmxlc3MgaXQgaXMgb3ZlcnJpZGRlbiBkdXJpbmcgY2xhc3Mg
ZGVmaW5pdGlvbi4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBw
LlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgaW5pdDogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIGFsZXJ0KCdOYW1lIGlzICcgKyB0aGlzLmdldCgnbmFtZScpKTsKLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIHZhciBzdGV2ZSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgIG5h
bWU6ICJTdGV2ZSIKLSAgICB9KTsKLQotICAgIC8vIGFsZXJ0cyAnTmFtZSBpcyBTdGV2ZScuCi0g
ICAgYGBgCi0KLSAgICBOT1RFOiBJZiB5b3UgZG8gb3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1l
d29yayBjbGFzcyBsaWtlIGBFbWJlci5WaWV3YCBvcgotICAgIGBFbWJlci5BcnJheUNvbnRyb2xs
ZXJgLCBiZSBzdXJlIHRvIGNhbGwgYHRoaXMuX3N1cGVyKClgIGluIHlvdXIKLSAgICBgaW5pdGAg
ZGVjbGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVu
aXR5IHRvCi0gICAgZG8gaW1wb3J0YW50IHNldHVwIHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFu
Z2UgYmVoYXZpb3IgaW4geW91cgotICAgIGFwcGxpY2F0aW9uLgotCi0gICAgQG1ldGhvZCBpbml0
Ci0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkge30sCi0KLSAgLyoqCi0gICAgRGVmaW5lcyB0aGUg
cHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xhc3MK
LSAgICAoaW5zdGVhZCBvZiBvdmVycmlkZGVuKS4KLQotICAgIEJ5IGRlZmF1bHQsIHdoZW4geW91
IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3BlcnR5IGRlZmluZWQgaW4KLSAgICB0aGUgc3Vi
Y2xhc3Mgb3ZlcnJpZGVzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQgaXMgZGVm
aW5lZAotICAgIGluIHRoZSBzdXBlcmNsYXNzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXNl
cyB3aGVyZSBpdCBpcyBwcmVmZXJhYmxlCi0gICAgdG8gYnVpbGQgdXAgYSBwcm9wZXJ0eSdzIHZh
bHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFzcycgcHJvcGVydHkKLSAgICB2YWx1ZSB3aXRo
IHRoZSBzdWJjbGFzcycgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBpbiB1c2Ugd2l0aGluIEVt
YmVyCi0gICAgaXMgdGhlIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSBvZiBgRW1iZXIuVmlld2AuCi0K
LSAgICBIZXJlIGlzIHNvbWUgc2FtcGxlIGNvZGUgc2hvd2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3
ZWVuIGEgY29uY2F0ZW5hdGVkCi0gICAgcHJvcGVydHkgYW5kIGEgbm9ybWFsIG9uZToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQmFyVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAg
ICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydiYXInXSwKLSAgICAgIGNsYXNzTmFt
ZXM6IFsnYmFyJ10KLSAgICB9KTsKLQotICAgIEFwcC5Gb29CYXJWaWV3ID0gQXBwLkJhclZpZXcu
ZXh0ZW5kKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0eTogWydmb28nXSwKLSAg
ICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCi0gICAgfSk7Ci0KLSAgICB2YXIgZm9vQmFyVmlldyA9
IEFwcC5Gb29CYXJWaWV3LmNyZWF0ZSgpOwotICAgIGZvb0JhclZpZXcuZ2V0KCdzb21lTm9uQ29u
Y2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydmb28nXQotICAgIGZvb0JhclZpZXcuZ2V0KCdjbGFz
c05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9vJ10KLSAgICBgYGAKLQotICAg
IFRoaXMgYmVoYXZpb3IgZXh0ZW5kcyB0byBvYmplY3QgY3JlYXRpb24gYXMgd2VsbC4gQ29udGlu
dWluZyB0aGUKLSAgICBhYm92ZSBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZh
ciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIHNvbWVOb25Db25jYXRlbmF0
ZWRQcm9wZXJ0eTogWydiYXonXSwKLSAgICAgIGNsYXNzTmFtZXM6IFsnYmF6J10KLSAgICB9KQot
ICAgIHZpZXcuZ2V0KCdzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVydHknKTsgLy8gWydiYXonXQot
ICAgIHZpZXcuZ2V0KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAnZm9v
JywgJ2JheiddCi0gICAgYGBgCi0gICAgQWRkaW5nIGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgaXMg
bm90IGFuIGFycmF5IHdpbGwganVzdCBhZGQgaXQgaW4gdGhlIGFycmF5OgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciB2aWV3ID0gQXBwLkZvb0JhclZpZXcuY3JlYXRlKHsKLSAgICAgIGNs
YXNzTmFtZXM6ICdiYXonCi0gICAgfSkKLSAgICB2aWV3LmdldCgnY2xhc3NOYW1lcycpOyAvLyBb
J2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbycsICdiYXonXQotICAgIGBgYAotCi0gICAgVXNpbmcg
dGhlIGBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzYCBwcm9wZXJ0eSwgd2UgY2FuIHRlbGwgdG8gRW1i
ZXIgdGhhdCBtaXgKLSAgICB0aGUgY29udGVudCBvZiB0aGUgcHJvcGVydGllcy4KLQotICAgIElu
IGBFbWJlci5WaWV3YCB0aGUgYGNsYXNzTmFtZUJpbmRpbmdzYCBhbmQgYGF0dHJpYnV0ZUJpbmRp
bmdzYCBwcm9wZXJ0aWVzCi0gICAgYXJlIGFsc28gY29uY2F0ZW5hdGVkLCBpbiBhZGRpdGlvbiB0
byBgY2xhc3NOYW1lc2AuCi0KLSAgICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciB5b3Ug
dG8gdXNlIHRocm91Z2hvdXQgdGhlIEVtYmVyIG9iamVjdCBtb2RlbCwKLSAgICBhbHRob3VnaCB0
eXBpY2FsIGFwcCBkZXZlbG9wZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGl0IGluZnJlcXVlbnRseS4g
U2luY2UKLSAgICBpdCBjaGFuZ2VzIGV4cGVjdGF0aW9ucyBhYm91dCBiZWhhdmlvciBvZiBwcm9w
ZXJ0aWVzLCB5b3Ugc2hvdWxkIHByb3Blcmx5Ci0gICAgZG9jdW1lbnQgaXRzIHVzYWdlIGluIGVh
Y2ggaW5kaXZpZHVhbCBjb25jYXRlbmF0ZWQgcHJvcGVydHkgKHRvIG5vdAotICAgIG1pc2xlYWQg
eW91ciB1c2VycyB0byB0aGluayB0aGV5IGNhbiBvdmVycmlkZSB0aGUgcHJvcGVydHkgaW4gYSBz
dWJjbGFzcykuCi0KLSAgICBAcHJvcGVydHkgY29uY2F0ZW5hdGVkUHJvcGVydGllcwotICAgIEB0
eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb25jYXRlbmF0ZWRQcm9wZXJ0
aWVzOiBudWxsLAotCi0gIC8qKgotICAgIERlc3Ryb3llZCBvYmplY3QgcHJvcGVydHkgZmxhZy4K
LQotICAgIGlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgIHRoZSBvYnNlcnZlcnMgYW5kIGJpbmRp
bmdzIHdlcmUgYWxyZWFkeQotICAgIHJlbW92ZWQgYnkgdGhlIGVmZmVjdCBvZiBjYWxsaW5nIHRo
ZSBgZGVzdHJveSgpYCBtZXRob2QuCi0KLSAgICBAcHJvcGVydHkgaXNEZXN0cm95ZWQKLSAgICBA
ZGVmYXVsdCBmYWxzZQotICAqLwotICBpc0Rlc3Ryb3llZDogZmFsc2UsCi0KLSAgLyoqCi0gICAg
RGVzdHJ1Y3Rpb24gc2NoZWR1bGVkIGZsYWcuIFRoZSBgZGVzdHJveSgpYCBtZXRob2QgaGFzIGJl
ZW4gY2FsbGVkLgotCi0gICAgVGhlIG9iamVjdCBzdGF5cyBpbnRhY3QgdW50aWwgdGhlIGVuZCBv
ZiB0aGUgcnVuIGxvb3AgYXQgd2hpY2ggcG9pbnQKLSAgICB0aGUgYGlzRGVzdHJveWVkYCBmbGFn
IGlzIHNldC4KLQotICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3lpbmcKLSAgICBAZGVmYXVsdCBmYWxz
ZQotICAqLwotICBpc0Rlc3Ryb3lpbmc6IGZhbHNlLAotCi0gIC8qKgotICAgIERlc3Ryb3lzIGFu
IG9iamVjdCBieSBzZXR0aW5nIHRoZSBgaXNEZXN0cm95ZWRgIGZsYWcgYW5kIHJlbW92aW5nIGl0
cwotICAgIG1ldGFkYXRhLCB3aGljaCBlZmZlY3RpdmVseSBkZXN0cm95cyBvYnNlcnZlcnMgYW5k
IGJpbmRpbmdzLgotCi0gICAgSWYgeW91IHRyeSB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhIGRlc3Ry
b3llZCBvYmplY3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCi0gICAgcmFpc2VkLgotCi0gICAgTm90
ZSB0aGF0IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGVuZCBvZiB0aGUgcnVuIGxv
b3AgYW5kIGRvZXMgbm90Ci0gICAgaGFwcGVuIGltbWVkaWF0ZWx5LiAgSXQgd2lsbCBzZXQgYW4g
aXNEZXN0cm95aW5nIGZsYWcgaW1tZWRpYXRlbHkuCi0KLSAgICBAbWV0aG9kIGRlc3Ryb3kKLSAg
ICBAcmV0dXJuIHtFbWJlci5PYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0
aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLSAgICB0aGlz
LmlzRGVzdHJveWluZyA9IHRydWU7Ci0KLSAgICBzY2hlZHVsZSgnYWN0aW9ucycsIHRoaXMsIHRo
aXMud2lsbERlc3Ryb3kpOwotICAgIHNjaGVkdWxlKCdkZXN0cm95JywgdGhpcywgdGhpcy5fc2No
ZWR1bGVkRGVzdHJveSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT3Zl
cnJpZGUgdG8gaW1wbGVtZW50IHRlYXJkb3duLgotCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQot
ICAgKi8KLSAgd2lsbERlc3Ryb3k6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgSW52b2tlZCBieSB0
aGUgcnVuIGxvb3AgdG8gYWN0dWFsbHkgZGVzdHJveSB0aGUgb2JqZWN0LiBUaGlzIGlzCi0gICAg
c2NoZWR1bGVkIGZvciBleGVjdXRpb24gYnkgdGhlIGBkZXN0cm95YCBtZXRob2QuCi0KLSAgICBA
cHJpdmF0ZQotICAgIEBtZXRob2QgX3NjaGVkdWxlZERlc3Ryb3kKLSAgKi8KLSAgX3NjaGVkdWxl
ZERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7IHJldHVy
bjsgfQotICAgIGRlc3Ryb3kodGhpcyk7Ci0gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7Ci0g
IH0sCi0KLSAgYmluZDogZnVuY3Rpb24odG8sIGZyb20pIHsKLSAgICBpZiAoIShmcm9tIGluc3Rh
bmNlb2YgRW1iZXIuQmluZGluZykpIHsgZnJvbSA9IEVtYmVyLkJpbmRpbmcuZnJvbShmcm9tKTsg
fQotICAgIGZyb20udG8odG8pLmNvbm5lY3QodGhpcyk7Ci0gICAgcmV0dXJuIGZyb207Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGljaCBhdHRl
bXB0cyB0byBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24KLSAgICB0aGFuIEphdmFzY3JpcHQncyBg
dG9TdHJpbmdgIHR5cGljYWxseSBkb2VzLCBpbiBhIGdlbmVyaWMgd2F5IGZvciBhbGwgRW1iZXIK
LSAgICBvYmplY3RzLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5QZXJzb24gPSBFbS5P
YmplY3QuZXh0ZW5kKCkKLSAgICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCi0gICAgcGVy
c29uLnRvU3RyaW5nKCkgLy89PiAiPEFwcC5QZXJzb246ZW1iZXIxMDI0PiIKLSAgICBgYGAKLQot
ICAgIElmIHRoZSBvYmplY3QncyBjbGFzcyBpcyBub3QgZGVmaW5lZCBvbiBhbiBFbWJlciBuYW1l
c3BhY2UsIGl0IHdpbGwKLSAgICBpbmRpY2F0ZSBpdCBpcyBhIHN1YmNsYXNzIG9mIHRoZSByZWdp
c3RlcmVkIHN1cGVyY2xhc3M6Ci0KLSAgIGBgYGphdmFzY3JpcHQKLSAgICBTdHVkZW50ID0gQXBw
LlBlcnNvbi5leHRlbmQoKQotICAgIHN0dWRlbnQgPSBTdHVkZW50LmNyZWF0ZSgpCi0gICAgc3R1
ZGVudC50b1N0cmluZygpIC8vPT4gIjwoc3ViY2xhc3Mgb2YgQXBwLlBlcnNvbik6ZW1iZXIxMDI1
PiIKLSAgICBgYGAKLQotICAgIElmIHRoZSBtZXRob2QgYHRvU3RyaW5nRXh0ZW5zaW9uYCBpcyBk
ZWZpbmVkLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUKLSAgICBpbmNsdWRlZCBpbiB0aGUgb3V0
cHV0LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5UZWFjaGVyID0gQXBwLlBlcnNvbi5l
eHRlbmQoewotICAgICAgdG9TdHJpbmdFeHRlbnNpb246IGZ1bmN0aW9uKCkgewotICAgICAgICBy
ZXR1cm4gdGhpcy5nZXQoJ2Z1bGxOYW1lJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgdGVhY2hl
ciA9IEFwcC5UZWFjaGVyLmNyZWF0ZSgpCi0gICAgdGVhY2hlci50b1N0cmluZygpOyAvLz0+ICI8
QXBwLlRlYWNoZXI6ZW1iZXIxMDI2OlRvbSBEYWxlPiIKLSAgICBgYGAKLQotICAgIEBtZXRob2Qg
dG9TdHJpbmcKLSAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbgotICAq
LwotICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7Ci0gICAgdmFyIGhhc1RvU3RyaW5n
RXh0ZW5zaW9uID0gdHlwZW9mIHRoaXMudG9TdHJpbmdFeHRlbnNpb24gPT09ICdmdW5jdGlvbics
Ci0gICAgICAgIGV4dGVuc2lvbiA9IGhhc1RvU3RyaW5nRXh0ZW5zaW9uID8gIjoiICsgdGhpcy50
b1N0cmluZ0V4dGVuc2lvbigpIDogJyc7Ci0gICAgdmFyIHJldCA9ICc8Jyt0aGlzLmNvbnN0cnVj
dG9yLnRvU3RyaW5nKCkrJzonK2d1aWRGb3IodGhpcykrZXh0ZW5zaW9uKyc+JzsKLSAgICB0aGlz
LnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfSk7
Ci0KLUNvcmVPYmplY3QuUHJvdG90eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3RvciA9IENvcmVPYmpl
Y3Q7Ci0KLWZ1bmN0aW9uIG1ha2VUb1N0cmluZyhyZXQpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkg
eyByZXR1cm4gcmV0OyB9OwotfQotCi1pZiAoRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBl
TWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBlTWl4aW4oQ29yZU9iamVj
dC5Qcm90b3R5cGVNaXhpbik7Ci19Ci0KLUNvcmVPYmplY3QuX19zdXBlcl9fID0gbnVsbDsKLQot
dmFyIENsYXNzTWl4aW4gPSBNaXhpbi5jcmVhdGUoewotCi0gIENsYXNzTWl4aW46IEVtYmVyLnJl
cXVpcmVkKCksCi0KLSAgUHJvdG90eXBlTWl4aW46IEVtYmVyLnJlcXVpcmVkKCksCi0KLSAgaXND
bGFzczogdHJ1ZSwKLQotICBpc01ldGhvZDogZmFsc2UsCi0KLSAgLyoqCi0gICAgQ3JlYXRlcyBh
IG5ldyBzdWJjbGFzcy4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUGVyc29uID0gRW1i
ZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBzYXk6IGZ1bmN0aW9uKHRoaW5nKSB7Ci0gICAgICAg
IGFsZXJ0KHRoaW5nKTsKLSAgICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGRl
ZmluZXMgYSBuZXcgc3ViY2xhc3Mgb2YgRW1iZXIuT2JqZWN0OiBgQXBwLlBlcnNvbmAuIEl0IGNv
bnRhaW5zIG9uZSBtZXRob2Q6IGBzYXkoKWAuCi0KLSAgICBZb3UgY2FuIGFsc28gY3JlYXRlIGEg
c3ViY2xhc3MgZnJvbSBhbnkgZXhpc3RpbmcgY2xhc3MgYnkgY2FsbGluZyBpdHMgYGV4dGVuZCgp
YCAgbWV0aG9kLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc3ViY2xh
c3Mgb2YgRW1iZXIncyBidWlsdC1pbiBgRW1iZXIuVmlld2AgY2xhc3M6Ci0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgQXBwLlBlcnNvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0
YWdOYW1lOiAnbGknLAotICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNBZG1pbmlzdHJhdG9y
J10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFdoZW4gZGVmaW5pbmcgYSBzdWJjbGFzcywgeW91
IGNhbiBvdmVycmlkZSBtZXRob2RzIGJ1dCBzdGlsbCBhY2Nlc3MgdGhlIGltcGxlbWVudGF0aW9u
IG9mIHlvdXIgcGFyZW50IGNsYXNzIGJ5IGNhbGxpbmcgdGhlIHNwZWNpYWwgYF9zdXBlcigpYCBt
ZXRob2Q6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgewotICAgICAgICB2YXIgbmFt
ZSA9IHRoaXMuZ2V0KCduYW1lJyk7Ci0gICAgICAgIGFsZXJ0KG5hbWUgKyAnIHNheXM6ICcgKyB0
aGluZyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBBcHAuU29sZGllciA9IEFwcC5QZXJzb24u
ZXh0ZW5kKHsKLSAgICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKLSAgICAgICAgdGhpcy5fc3Vw
ZXIodGhpbmcgKyAiLCBzaXIhIik7Ci0gICAgICB9LAotICAgICAgbWFyY2g6IGZ1bmN0aW9uKG51
bWJlck9mSG91cnMpIHsKLSAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgbWFyY2hl
cyBmb3IgJyArIG51bWJlck9mSG91cnMgKyAnIGhvdXJzLicpCi0gICAgICB9Ci0gICAgfSk7Ci0K
LSAgICB2YXIgeWVodWRhID0gQXBwLlNvbGRpZXIuY3JlYXRlKHsKLSAgICAgIG5hbWU6ICJZZWh1
ZGEgS2F0eiIKLSAgICB9KTsKLQotICAgIHllaHVkYS5zYXkoIlllcyIpOyAgLy8gYWxlcnRzICJZ
ZWh1ZGEgS2F0eiBzYXlzOiBZZXMsIHNpciEiCi0gICAgYGBgCi0KLSAgICBUaGUgYGNyZWF0ZSgp
YCBvbiBsaW5lICMxNyBjcmVhdGVzIGFuICppbnN0YW5jZSogb2YgdGhlIGBBcHAuU29sZGllcmAg
Y2xhc3MuIFRoZSBgZXh0ZW5kKClgIG9uIGxpbmUgIzggY3JlYXRlcyBhICpzdWJjbGFzcyogb2Yg
YEFwcC5QZXJzb25gLiBBbnkgaW5zdGFuY2Ugb2YgdGhlIGBBcHAuUGVyc29uYCBjbGFzcyB3aWxs
ICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRob2QuCi0KLSAgICBZb3UgY2FuIGFsc28gcGFz
cyBgRW1iZXIuTWl4aW5gIGNsYXNzZXMgdG8gYWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byB0
aGUgc3ViY2xhc3MuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVy
Lk9iamVjdC5leHRlbmQoewotICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgewotICAgICAgICBh
bGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBzYXlzOiAnICsgdGhpbmcpOwotICAgICAgfQotICAg
IH0pOwotCi0gICAgQXBwLlNpbmdpbmdNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gICAg
ICBzaW5nOiBmdW5jdGlvbih0aGluZyl7Ci0gICAgICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykg
KyAnIHNpbmdzOiBsYSBsYSBsYSAnICsgdGhpbmcpOwotICAgICAgfQotICAgIH0pOwotCi0gICAg
QXBwLkJyb2Fkd2F5U3RhciA9IEFwcC5QZXJzb24uZXh0ZW5kKEFwcC5TaW5naW5nTWl4aW4sIHsK
LSAgICAgIGRhbmNlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUn
KSArICcgZGFuY2VzOiB0YXAgdGFwIHRhcCB0YXAgJyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBUaGUgYEFwcC5Ccm9hZHdheVN0YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1l
dGhvZHM6IGBzYXkoKWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClgLgotCi0gICAgQG1ldGhvZCBl
eHRlbmQKLSAgICBAc3RhdGljCi0KLSAgICBAcGFyYW0ge0VtYmVyLk1peGlufSBbbWl4aW5zXSog
T25lIG9yIG1vcmUgRW1iZXIuTWl4aW4gY2xhc3NlcwotICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJn
dW1lbnRzXSogT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBj
bGFzcwotICAqLwotICBleHRlbmQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBDbGFzcyA9IG1ha2VD
dG9yKCksIHByb3RvOwotICAgIENsYXNzLkNsYXNzTWl4aW4gPSBNaXhpbi5jcmVhdGUodGhpcy5D
bGFzc01peGluKTsKLSAgICBDbGFzcy5Qcm90b3R5cGVNaXhpbiA9IE1peGluLmNyZWF0ZSh0aGlz
LlByb3RvdHlwZU1peGluKTsKLQotICAgIENsYXNzLkNsYXNzTWl4aW4ub3duZXJDb25zdHJ1Y3Rv
ciA9IENsYXNzOwotICAgIENsYXNzLlByb3RvdHlwZU1peGluLm93bmVyQ29uc3RydWN0b3IgPSBD
bGFzczsKLQotICAgIHJlb3Blbi5hcHBseShDbGFzcy5Qcm90b3R5cGVNaXhpbiwgYXJndW1lbnRz
KTsKLQotICAgIENsYXNzLnN1cGVyY2xhc3MgPSB0aGlzOwotICAgIENsYXNzLl9fc3VwZXJfXyAg
PSB0aGlzLnByb3RvdHlwZTsKLQotICAgIHByb3RvID0gQ2xhc3MucHJvdG90eXBlID0gb19jcmVh
dGUodGhpcy5wcm90b3R5cGUpOwotICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQ2xhc3M7Ci0gICAg
Z2VuZXJhdGVHdWlkKHByb3RvKTsKLSAgICBtZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAvLyB0
aGlzIHdpbGwgZGlzYWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCi0KLSAgICBDbGFzcy5DbGFz
c01peGluLmFwcGx5KENsYXNzKTsKLSAgICByZXR1cm4gQ2xhc3M7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgRXF1aXZhbGVudCB0byBkb2luZyBgZXh0ZW5kKGFyZ3VtZW50cykuY3JlYXRlKClgLgotICAg
IElmIHBvc3NpYmxlIHVzZSB0aGUgbm9ybWFsIGBjcmVhdGVgIG1ldGhvZCBpbnN0ZWFkLgotCi0g
ICAgQG1ldGhvZCBjcmVhdGVXaXRoTWl4aW5zCi0gICAgQHN0YXRpYwotICAgIEBwYXJhbSBbYXJn
dW1lbnRzXSoKLSAgKi8KLSAgY3JlYXRlV2l0aE1peGluczogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdE1peGlu
cyhhcmd1bWVudHMpOyB9Ci0gICAgcmV0dXJuIG5ldyBDKCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
Q3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLiBBY2NlcHRzIGVpdGhlciBubyBhcmd1bWVu
dHMsIG9yIGFuIG9iamVjdAotICAgIGNvbnRhaW5pbmcgdmFsdWVzIHRvIGluaXRpYWxpemUgdGhl
IG5ld2x5IGluc3RhbnRpYXRlZCBvYmplY3Qgd2l0aC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBoZWxsb1dvcmxkOiBm
dW5jdGlvbigpIHsKLSAgICAgICAgYWxlcnQoIkhpLCBteSBuYW1lIGlzICIgKyB0aGlzLmdldCgn
bmFtZScpKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHZhciB0b20gPSBBcHAuUGVyc29uLmNy
ZWF0ZSh7Ci0gICAgICBuYW1lOiAnVG9tIERhbGUnCi0gICAgfSk7Ci0KLSAgICB0b20uaGVsbG9X
b3JsZCgpOyAvLyBhbGVydHMgIkhpLCBteSBuYW1lIGlzIFRvbSBEYWxlIi4KLSAgICBgYGAKLQot
ICAgIGBjcmVhdGVgIHdpbGwgY2FsbCB0aGUgYGluaXRgIGZ1bmN0aW9uIGlmIGRlZmluZWQgZHVy
aW5nCi0gICAgYEVtYmVyLkFueU9iamVjdC5leHRlbmRgCi0KLSAgICBJZiBubyBhcmd1bWVudHMg
YXJlIHBhc3NlZCB0byBgY3JlYXRlYCwgaXQgd2lsbCBub3Qgc2V0IHZhbHVlcyB0byB0aGUgbmV3
Ci0gICAgaW5zdGFuY2UgZHVyaW5nIGluaXRpYWxpemF0aW9uOgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIHZhciBub05hbWUgPSBBcHAuUGVyc29uLmNyZWF0ZSgpOwotICAgIG5vTmFtZS5oZWxs
b1dvcmxkKCk7IC8vIGFsZXJ0cyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIE5PVEU6IEZvciBw
ZXJmb3JtYW5jZSByZWFzb25zLCB5b3UgY2Fubm90IGRlY2xhcmUgbWV0aG9kcyBvciBjb21wdXRl
ZAotICAgIHByb3BlcnRpZXMgZHVyaW5nIGBjcmVhdGVgLiBZb3Ugc2hvdWxkIGluc3RlYWQgZGVj
bGFyZSBtZXRob2RzIGFuZCBjb21wdXRlZAotICAgIHByb3BlcnRpZXMgd2hlbiB1c2luZyBgZXh0
ZW5kYCBvciB1c2UgdGhlIGBjcmVhdGVXaXRoTWl4aW5zYCBzaG9ydGhhbmQuCi0KLSAgICBAbWV0
aG9kIGNyZWF0ZQotICAgIEBzdGF0aWMKLSAgICBAcGFyYW0gW2FyZ3VtZW50c10qCi0gICovCi0g
IGNyZWF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzOwotICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoPjApIHsgdGhpcy5faW5pdFByb3BlcnRpZXMoYXJndW1lbnRzKTsgfQotICAgIHJl
dHVybiBuZXcgQygpOwotICB9LAotCi0gIC8qKgotICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3In
cyBwcm90b3R5cGUgd2l0aCBhZGRpdGlvbmFsCi0gICAgcHJvcGVydGllcyBhbmQgZnVuY3Rpb25z
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0JwotICAgIH0pOwotCi0gICAgbyA9IE15T2JqZWN0
LmNyZWF0ZSgpOwotICAgIG8uZ2V0KCduYW1lJyk7IC8vICdhbiBvYmplY3QnCi0KLSAgICBNeU9i
amVjdC5yZW9wZW4oewotICAgICAgc2F5OiBmdW5jdGlvbihtc2cpewotICAgICAgICBjb25zb2xl
LmxvZyhtc2cpOwotICAgICAgfQotICAgIH0pCi0KLSAgICBvMiA9IE15T2JqZWN0LmNyZWF0ZSgp
OwotICAgIG8yLnNheSgiaGVsbG8iKTsgLy8gbG9ncyAiaGVsbG8iCi0KLSAgICBvLnNheSgiZ29v
ZGJ5ZSIpOyAvLyBsb2dzICJnb29kYnllIgotICAgIGBgYAotCi0gICAgVG8gYWRkIGZ1bmN0aW9u
cyBhbmQgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0b3IgaXRzZWxmLAotICAgIHNlZSBgcmVv
cGVuQ2xhc3NgCi0KLSAgICBAbWV0aG9kIHJlb3BlbgotICAqLwotICByZW9wZW46IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMud2lsbFJlb3BlbigpOwotICAgIHJlb3Blbi5hcHBseSh0aGlzLlByb3Rv
dHlwZU1peGluLCBhcmd1bWVudHMpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgot
ICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3IncyBvd24gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25z
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIE15T2JqZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgICBuYW1lOiAnYW4gb2JqZWN0JwotICAgIH0pOwotCi0gICAgTXlPYmplY3QucmVv
cGVuQ2xhc3MoewotICAgICAgY2FuQnVpbGQ6IGZhbHNlCi0gICAgfSk7Ci0KLSAgICBNeU9iamVj
dC5jYW5CdWlsZDsgLy8gZmFsc2UKLSAgICBvID0gTXlPYmplY3QuY3JlYXRlKCk7Ci0gICAgYGBg
Ci0KLSAgICBJbiBvdGhlciB3b3JkcywgdGhpcyBjcmVhdGVzIHN0YXRpYyBwcm9wZXJ0aWVzIGFu
ZCBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcy4gVGhlc2UgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIHRo
ZSBjbGFzcwotICAgIGFuZCBub3Qgb24gYW55IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewot
ICAgICAgbmFtZSA6ICIiLAotICAgICAgc2F5SGVsbG8gOiBmdW5jdGlvbigpewotICAgICAgICBh
bGVydCgiSGVsbG8uIE15IG5hbWUgaXMgIiArIHRoaXMuZ2V0KCduYW1lJykpOwotICAgICAgfQot
ICAgIH0pOwotCi0gICAgQXBwLlBlcnNvbi5yZW9wZW5DbGFzcyh7Ci0gICAgICBzcGVjaWVzIDog
IkhvbW8gc2FwaWVucyIsCi0gICAgICBjcmVhdGVQZXJzb246IGZ1bmN0aW9uKG5ld1BlcnNvbnNO
YW1lKXsKLSAgICAgICAgcmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgICAgICBuYW1l
Om5ld1BlcnNvbnNOYW1lCi0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotCi0gICAgdmFy
IHRvbSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKLSAgICAgIG5hbWUgOiAiVG9tIERhbGUiCi0gICAg
fSk7Ci0gICAgdmFyIHllaHVkYSA9IEFwcC5QZXJzb24uY3JlYXRlUGVyc29uKCJZZWh1ZGEgS2F0
eiIpOwotCi0gICAgdG9tLnNheUhlbGxvKCk7IC8vICJIZWxsby4gTXkgbmFtZSBpcyBUb20gRGFs
ZSIKLSAgICB5ZWh1ZGEuc2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFllaHVkYSBL
YXR6IgotICAgIGFsZXJ0KEFwcC5QZXJzb24uc3BlY2llcyk7IC8vICJIb21vIHNhcGllbnMiCi0g
ICAgYGBgCi0KLSAgICBOb3RlIHRoYXQgYHNwZWNpZXNgIGFuZCBgY3JlYXRlUGVyc29uYCBhcmUg
Km5vdCogdmFsaWQgb24gdGhlIGB0b21gIGFuZCBgeWVodWRhYAotICAgIHZhcmlhYmxlcy4gVGhl
eSBhcmUgb25seSB2YWxpZCBvbiBgQXBwLlBlcnNvbmAuCi0KLSAgICBUbyBhZGQgZnVuY3Rpb25z
IGFuZCBwcm9wZXJ0aWVzIHRvIGluc3RhbmNlcyBvZgotICAgIGEgY29uc3RydWN0b3IgYnkgZXh0
ZW5kaW5nIHRoZSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZQotICAgIHNlZSBgcmVvcGVuYAotCi0g
ICAgQG1ldGhvZCByZW9wZW5DbGFzcwotICAqLwotICByZW9wZW5DbGFzczogZnVuY3Rpb24oKSB7
Ci0gICAgcmVvcGVuLmFwcGx5KHRoaXMuQ2xhc3NNaXhpbiwgYXJndW1lbnRzKTsKLSAgICBhcHBs
eU1peGluKHRoaXMsIGFyZ3VtZW50cywgZmFsc2UpOwotICAgIHJldHVybiB0aGlzOwotICB9LAot
Ci0gIGRldGVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVv
ZiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgd2hpbGUob2JqKSB7Ci0gICAgICBpZiAob2Jq
PT09dGhpcykgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgb2JqID0gb2JqLnN1cGVyY2xhc3M7Ci0g
ICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLQotICBkZXRlY3RJbnN0YW5jZTogZnVuY3Rp
b24ob2JqKSB7Ci0gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHRoaXM7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGFubm90YXRlIGNvbXB1dGVkIHBy
b3BlcnRpZXMgd2l0aCBhZGRpdGlvbmFsCi0gICAgbWV0YWRhdGEgYWJvdXQgaG93IHRoZXkgZnVu
Y3Rpb24gb3Igd2hhdCB2YWx1ZXMgdGhleSBvcGVyYXRlIG9uLiBGb3IKLSAgICBleGFtcGxlLCBj
b21wdXRlZCBwcm9wZXJ0eSBmdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgdmFyaWFibGVzIHRoYXQg
YXJlIHRoZW4KLSAgICBubyBsb25nZXIgYXZhaWxhYmxlIGZvciBpbnRyb3NwZWN0aW9uLgotCi0g
ICAgWW91IGNhbiBwYXNzIGEgaGFzaCBvZiB0aGVzZSB2YWx1ZXMgdG8gYSBjb21wdXRlZCBwcm9w
ZXJ0eSBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uOiBmdW5jdGlv
bigpIHsKLSAgICAgIHZhciBwZXJzb25JZCA9IHRoaXMuZ2V0KCdwZXJzb25JZCcpOwotICAgICAg
cmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsgaWQ6IHBlcnNvbklkIH0pOwotICAgIH0ucHJvcGVy
dHkoKS5tZXRhKHsgdHlwZTogQXBwLlBlcnNvbiB9KQotICAgIGBgYAotCi0gICAgT25jZSB5b3Un
dmUgZG9uZSB0aGlzLCB5b3UgY2FuIHJldHJpZXZlIHRoZSB2YWx1ZXMgc2F2ZWQgdG8gdGhlIGNv
bXB1dGVkCi0gICAgcHJvcGVydHkgZnJvbSB5b3VyIGNsYXNzIGxpa2UgdGhpczoKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBNeUNsYXNzLm1ldGFGb3JQcm9wZXJ0eSgncGVyc29uJyk7Ci0gICAg
YGBgCi0KLSAgICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBoYXNoIHRoYXQgd2FzIHBh
c3NlZCB0byBgbWV0YSgpYC4KLQotICAgIEBtZXRob2QgbWV0YUZvclByb3BlcnR5Ci0gICAgQHBh
cmFtIGtleSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lCi0gICovCi0gIG1ldGFGb3JQcm9wZXJ0eTog
ZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIGRlc2MgPSBtZXRhKHRoaXMucHJvdG8oKSwgZmFsc2Up
LmRlc2NzW2tleV07Ci0KLSAgICBFbWJlci5hc3NlcnQoIm1ldGFGb3JQcm9wZXJ0eSgpIGNvdWxk
IG5vdCBmaW5kIGEgY29tcHV0ZWQgcHJvcGVydHkgd2l0aCBrZXkgJyIra2V5KyInLiIsICEhZGVz
YyAmJiBkZXNjIGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSk7Ci0gICAgcmV0dXJu
IGRlc2MuX21ldGEgfHwge307Ci0gIH0sCi0KLSAgLyoqCi0gICAgSXRlcmF0ZSBvdmVyIGVhY2gg
Y29tcHV0ZWQgcHJvcGVydHkgZm9yIHRoZSBjbGFzcywgcGFzc2luZyBpdHMgbmFtZQotICAgIGFu
ZCBhbnkgYXNzb2NpYXRlZCBtZXRhZGF0YSAoc2VlIGBtZXRhRm9yUHJvcGVydHlgKSB0byB0aGUg
Y2FsbGJhY2suCi0KLSAgICBAbWV0aG9kIGVhY2hDb21wdXRlZFByb3BlcnR5Ci0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcGFyYW0ge09iamVjdH0gYmluZGluZwotICAqLwot
ICBlYWNoQ29tcHV0ZWRQcm9wZXJ0eTogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRpbmcpIHsKLSAg
ICB2YXIgcHJvdG8gPSB0aGlzLnByb3RvKCksCi0gICAgICAgIGRlc2NzID0gbWV0YShwcm90byku
ZGVzY3MsCi0gICAgICAgIGVtcHR5ID0ge30sCi0gICAgICAgIHByb3BlcnR5OwotCi0gICAgZm9y
ICh2YXIgbmFtZSBpbiBkZXNjcykgewotICAgICAgcHJvcGVydHkgPSBkZXNjc1tuYW1lXTsKLQot
ICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkgewot
ICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcgfHwgdGhpcywgbmFtZSwgcHJvcGVydHkuX21l
dGEgfHwgZW1wdHkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi19KTsKLQotQ2xhc3NNaXhpbi5v
d25lckNvbnN0cnVjdG9yID0gQ29yZU9iamVjdDsKLQotaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlk
ZUNsYXNzTWl4aW4pIHsKLSAgRW1iZXIuY29uZmlnLm92ZXJyaWRlQ2xhc3NNaXhpbihDbGFzc01p
eGluKTsKLX0KLQotQ29yZU9iamVjdC5DbGFzc01peGluID0gQ2xhc3NNaXhpbjsKLUNsYXNzTWl4
aW4uYXBwbHkoQ29yZU9iamVjdCk7Ci0KLUVtYmVyLkNvcmVPYmplY3QgPSBDb3JlT2JqZWN0Owot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9k
dWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLS8qKgotICBgRW1iZXIuT2JqZWN0YCBpcyB0aGUgbWFp
biBiYXNlIGNsYXNzIGZvciBhbGwgRW1iZXIgb2JqZWN0cy4gSXQgaXMgYSBzdWJjbGFzcwotICBv
ZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0aCB0aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFw
cGxpZWQuIEZvciBkZXRhaWxzLAotICBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggb2Yg
dGhlc2UuCi0KLSAgQGNsYXNzIE9iamVjdAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRz
IEVtYmVyLkNvcmVPYmplY3QKLSAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQotKi8KLUVtYmVyLk9i
amVjdCA9IEVtYmVyLkNvcmVPYmplY3QuZXh0ZW5kKEVtYmVyLk9ic2VydmFibGUpOwotRW1iZXIu
T2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIuT2JqZWN0IjsgfTsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpbmRleE9mID0g
RW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKLQotLyoqCi0gIEEgTmFtZXNwYWNlIGlzIGFu
IG9iamVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFpbiBvdGhlciBvYmplY3RzIG9yIG1ldGhvZHMK
LSAgc3VjaCBhcyBhbiBhcHBsaWNhdGlvbiBvciBmcmFtZXdvcmsuIENyZWF0ZSBhIG5hbWVzcGFj
ZSBhbnl0aW1lIHlvdSB3YW50Ci0gIHRvIGRlZmluZSBvbmUgb2YgdGhlc2UgbmV3IGNvbnRhaW5l
cnMuCi0KLSAgIyBFeGFtcGxlIFVzYWdlCi0KLSAgYGBgamF2YXNjcmlwdAotICBNeUZyYW1ld29y
ayA9IEVtYmVyLk5hbWVzcGFjZS5jcmVhdGUoewotICAgIFZFUlNJT046ICcxLjAuMCcKLSAgfSk7
Ci0gIGBgYAotCi0gIEBjbGFzcyBOYW1lc3BhY2UKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5PYmplY3QKLSovCi12YXIgTmFtZXNwYWNlID0gRW1iZXIuTmFtZXNwYWNlID0g
RW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gIGlzTmFtZXNwYWNlOiB0cnVlLAotCi0gIGluaXQ6IGZ1
bmN0aW9uKCkgewotICAgIEVtYmVyLk5hbWVzcGFjZS5OQU1FU1BBQ0VTLnB1c2godGhpcyk7Ci0g
ICAgRW1iZXIuTmFtZXNwYWNlLlBST0NFU1NFRCA9IGZhbHNlOwotICB9LAotCi0gIHRvU3RyaW5n
OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOwotICAgIGlm
IChuYW1lKSB7IHJldHVybiBuYW1lOyB9Ci0KLSAgICBmaW5kTmFtZXNwYWNlcygpOwotICAgIHJl
dHVybiB0aGlzW0VtYmVyLkdVSURfS0VZKydfbmFtZSddOwotICB9LAotCi0gIG5hbWVDbGFzc2Vz
OiBmdW5jdGlvbigpIHsKLSAgICBwcm9jZXNzTmFtZXNwYWNlKFt0aGlzLnRvU3RyaW5nKCldLCB0
aGlzLCB7fSk7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5hbWVz
cGFjZXMgPSBFbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUzsKLSAgICBFbWJlci5sb29rdXBbdGhp
cy50b1N0cmluZygpXSA9IHVuZGVmaW5lZDsKLSAgICBuYW1lc3BhY2VzLnNwbGljZShpbmRleE9m
LmNhbGwobmFtZXNwYWNlcywgdGhpcyksIDEpOwotICAgIHRoaXMuX3N1cGVyKCk7Ci0gIH0KLX0p
OwotCi1OYW1lc3BhY2UucmVvcGVuQ2xhc3MoewotICBOQU1FU1BBQ0VTOiBbRW1iZXJdLAotICBO
QU1FU1BBQ0VTX0JZX0lEOiB7fSwKLSAgUFJPQ0VTU0VEOiBmYWxzZSwKLSAgcHJvY2Vzc0FsbDog
cHJvY2Vzc0FsbE5hbWVzcGFjZXMsCi0gIGJ5TmFtZTogZnVuY3Rpb24obmFtZSkgewotICAgIGlm
ICghRW1iZXIuQk9PVEVEKSB7Ci0gICAgICBwcm9jZXNzQWxsTmFtZXNwYWNlcygpOwotICAgIH0K
LQotICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lEW25hbWVdOwotICB9Ci19KTsKLQotdmFyIE5B
TUVTUEFDRVNfQllfSUQgPSBOYW1lc3BhY2UuTkFNRVNQQUNFU19CWV9JRDsKLQotdmFyIGhhc093
blByb3AgPSAoe30pLmhhc093blByb3BlcnR5LAotICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9y
OwotCi1mdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCByb290LCBzZWVuKSB7Ci0gIHZh
ciBpZHggPSBwYXRocy5sZW5ndGg7Ci0KLSAgTkFNRVNQQUNFU19CWV9JRFtwYXRocy5qb2luKCcu
JyldID0gcm9vdDsKLQotICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBuYW1l
c3BhY2UsIGxvb2tpbmcgZm9yIGNsYXNzZXMKLSAgZm9yKHZhciBrZXkgaW4gcm9vdCkgewotICAg
IGlmICghaGFzT3duUHJvcC5jYWxsKHJvb3QsIGtleSkpIHsgY29udGludWU7IH0KLSAgICB2YXIg
b2JqID0gcm9vdFtrZXldOwotCi0gICAgLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGBFbWJl
cmAgbmFtZXNwYWNlLCBmb3IgZXhhbXBsZSwgdGhlCi0gICAgLy8gYHBhdGhzYCB3aWxsIHN0YXJ0
IHdpdGggYFsiRW1iZXIiXWAuIEV2ZXJ5IGl0ZXJhdGlvbiB0aHJvdWdoCi0gICAgLy8gdGhlIGxv
b3Agd2lsbCB1cGRhdGUgdGhlICoqc2Vjb25kKiogZWxlbWVudCBvZiB0aGlzIGxpc3Qgd2l0aAot
ICAgIC8vIHRoZSBrZXksIHNvIHByb2Nlc3NpbmcgYEVtYmVyLlZpZXdgIHdpbGwgbWFrZSB0aGUg
QXJyYXkKLSAgICAvLyBgWydFbWJlcicsICdWaWV3J11gLgotICAgIHBhdGhzW2lkeF0gPSBrZXk7
Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGZvdW5kIGFuIHVucHJvY2Vzc2VkIGNsYXNzCi0gICAgaWYg
KG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcpIHsKLSAgICAgIC8vIFJlcGxh
Y2UgdGhlIGNsYXNzJyBgdG9TdHJpbmdgIHdpdGggdGhlIGRvdC1zZXBhcmF0ZWQgcGF0aAotICAg
ICAgLy8gYW5kIHNldCBpdHMgYE5BTUVfS0VZYAotICAgICAgb2JqLnRvU3RyaW5nID0gbWFrZVRv
U3RyaW5nKHBhdGhzLmpvaW4oJy4nKSk7Ci0gICAgICBvYmpbTkFNRV9LRVldID0gcGF0aHMuam9p
bignLicpOwotCi0gICAgLy8gU3VwcG9ydCBuZXN0ZWQgbmFtZXNwYWNlcwotICAgIH0gZWxzZSBp
ZiAob2JqICYmIG9iai5pc05hbWVzcGFjZSkgewotICAgICAgLy8gU2tpcCBhbGlhc2VkIG5hbWVz
cGFjZXMKLSAgICAgIGlmIChzZWVuW2d1aWRGb3Iob2JqKV0pIHsgY29udGludWU7IH0KLSAgICAg
IHNlZW5bZ3VpZEZvcihvYmopXSA9IHRydWU7Ci0KLSAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxk
IG5hbWVzcGFjZQotICAgICAgcHJvY2Vzc05hbWVzcGFjZShwYXRocywgb2JqLCBzZWVuKTsKLSAg
ICB9Ci0gIH0KLQotICBwYXRocy5sZW5ndGggPSBpZHg7IC8vIGN1dCBvdXQgbGFzdCBpdGVtCi19
Ci0KLWZ1bmN0aW9uIGZpbmROYW1lc3BhY2VzKCkgewotICB2YXIgTmFtZXNwYWNlID0gRW1iZXIu
TmFtZXNwYWNlLCBsb29rdXAgPSBFbWJlci5sb29rdXAsIG9iaiwgaXNOYW1lc3BhY2U7Ci0KLSAg
aWYgKE5hbWVzcGFjZS5QUk9DRVNTRUQpIHsgcmV0dXJuOyB9Ci0KLSAgZm9yICh2YXIgcHJvcCBp
biBsb29rdXApIHsKLSAgICAvLyBUaGVzZSBkb24ndCByYWlzZSBleGNlcHRpb25zIGJ1dCBjYW4g
Y2F1c2Ugd2FybmluZ3MKLSAgICBpZiAocHJvcCA9PT0gInBhcmVudCIgfHwgcHJvcCA9PT0gInRv
cCIgfHwgcHJvcCA9PT0gImZyYW1lRWxlbWVudCIgfHwgcHJvcCA9PT0gIndlYmtpdFN0b3JhZ2VJ
bmZvIikgeyBjb250aW51ZTsgfQotCi0gICAgLy8gIGdldCh3aW5kb3cuZ2xvYmFsU3RvcmFnZSwg
J2lzTmFtZXNwYWNlJykgd291bGQgdHJ5IHRvIHJlYWQgdGhlIHN0b3JhZ2UgZm9yIGRvbWFpbiBp
c05hbWVzcGFjZSBhbmQgY2F1c2UgZXhjZXB0aW9uIGluIEZpcmVmb3guCi0gICAgLy8gZ2xvYmFs
U3RvcmFnZSBpcyBhIHN0b3JhZ2Ugb2Jzb2xldGVkIGJ5IHRoZSBXaGF0V0cgc3RvcmFnZSBzcGVj
aWZpY2F0aW9uLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL1N0b3Jh
Z2UjZ2xvYmFsU3RvcmFnZQotICAgIGlmIChwcm9wID09PSAiZ2xvYmFsU3RvcmFnZSIgJiYgbG9v
a3VwLlN0b3JhZ2VMaXN0ICYmIGxvb2t1cC5nbG9iYWxTdG9yYWdlIGluc3RhbmNlb2YgbG9va3Vw
LlN0b3JhZ2VMaXN0KSB7IGNvbnRpbnVlOyB9Ci0gICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZSB2
ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eQotICAgIGlm
IChsb29rdXAuaGFzT3duUHJvcGVydHkgJiYgIWxvb2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkg
eyBjb250aW51ZTsgfQotCi0gICAgLy8gQXQgdGltZXMgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFj
Y2VzcyBjZXJ0YWluIHByb3BlcnRpZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi0gICAgLy8gVGhl
cmUgYXJlIGFsc28gdGltZXMgd2hlcmUgZXZlbiBpZiB3ZSBjYW4gYWNjZXNzIHRoZW0sIHdlIGFy
ZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlaXIgcHJvcGVydGllcy4KLSAgICB0cnkgewotICAg
ICAgb2JqID0gRW1iZXIubG9va3VwW3Byb3BdOwotICAgICAgaXNOYW1lc3BhY2UgPSBvYmogJiYg
b2JqLmlzTmFtZXNwYWNlOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAg
IH0KLQotICAgIGlmIChpc05hbWVzcGFjZSkgewotICAgICAgRW1iZXIuZGVwcmVjYXRlKCJOYW1l
c3BhY2VzIHNob3VsZCBub3QgYmVnaW4gd2l0aCBsb3dlcmNhc2UuIiwgL15bQS1aXS8udGVzdChw
cm9wKSk7Ci0gICAgICBvYmpbTkFNRV9LRVldID0gcHJvcDsKLSAgICB9Ci0gIH0KLX0KLQotdmFy
IE5BTUVfS0VZID0gRW1iZXIuTkFNRV9LRVkgPSBFbWJlci5HVUlEX0tFWSArICdfbmFtZSc7Ci0K
LWZ1bmN0aW9uIHN1cGVyQ2xhc3NTdHJpbmcobWl4aW4pIHsKLSAgdmFyIHN1cGVyY2xhc3MgPSBt
aXhpbi5zdXBlcmNsYXNzOwotICBpZiAoc3VwZXJjbGFzcykgewotICAgIGlmIChzdXBlcmNsYXNz
W05BTUVfS0VZXSkgeyByZXR1cm4gc3VwZXJjbGFzc1tOQU1FX0tFWV07IH0KLSAgICBlbHNlIHsg
cmV0dXJuIHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7IH0KLSAgfSBlbHNlIHsKLSAgICBy
ZXR1cm47Ci0gIH0KLX0KLQotZnVuY3Rpb24gY2xhc3NUb1N0cmluZygpIHsKLSAgaWYgKCFFbWJl
ci5CT09URUQgJiYgIXRoaXNbTkFNRV9LRVldKSB7Ci0gICAgcHJvY2Vzc0FsbE5hbWVzcGFjZXMo
KTsKLSAgfQotCi0gIHZhciByZXQ7Ci0KLSAgaWYgKHRoaXNbTkFNRV9LRVldKSB7Ci0gICAgcmV0
ID0gdGhpc1tOQU1FX0tFWV07Ci0gIH0gZWxzZSBpZiAodGhpcy5fdG9TdHJpbmcpIHsKLSAgICBy
ZXQgPSB0aGlzLl90b1N0cmluZzsgCi0gIH0gZWxzZSB7Ci0gICAgdmFyIHN0ciA9IHN1cGVyQ2xh
c3NTdHJpbmcodGhpcyk7Ci0gICAgaWYgKHN0cikgewotICAgICAgcmV0ID0gIihzdWJjbGFzcyBv
ZiAiICsgc3RyICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSAiKHVua25vd24gbWl4
aW4pIjsKLSAgICB9Ci0gICAgdGhpcy50b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOwotICB9
Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotZnVuY3Rpb24gcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKSB7
Ci0gIHZhciB1bnByb2Nlc3NlZE5hbWVzcGFjZXMgPSAhTmFtZXNwYWNlLlBST0NFU1NFRCwKLSAg
ICAgIHVucHJvY2Vzc2VkTWl4aW5zID0gRW1iZXIuYW55VW5wcm9jZXNzZWRNaXhpbnM7Ci0KLSAg
aWYgKHVucHJvY2Vzc2VkTmFtZXNwYWNlcykgewotICAgIGZpbmROYW1lc3BhY2VzKCk7Ci0gICAg
TmFtZXNwYWNlLlBST0NFU1NFRCA9IHRydWU7Ci0gIH0KLQotICBpZiAodW5wcm9jZXNzZWROYW1l
c3BhY2VzIHx8IHVucHJvY2Vzc2VkTWl4aW5zKSB7Ci0gICAgdmFyIG5hbWVzcGFjZXMgPSBOYW1l
c3BhY2UuTkFNRVNQQUNFUywgbmFtZXNwYWNlOwotICAgIGZvciAodmFyIGk9MCwgbD1uYW1lc3Bh
Y2VzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbaV07
Ci0gICAgICBwcm9jZXNzTmFtZXNwYWNlKFtuYW1lc3BhY2UudG9TdHJpbmcoKV0sIG5hbWVzcGFj
ZSwge30pOwotICAgIH0KLQotICAgIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gZmFsc2U7
Ci0gIH0KLX0KLQotZnVuY3Rpb24gbWFrZVRvU3RyaW5nKHJldCkgewotICByZXR1cm4gZnVuY3Rp
b24oKSB7IHJldHVybiByZXQ7IH07Ci19Ci0KLUVtYmVyLk1peGluLnByb3RvdHlwZS50b1N0cmlu
ZyA9IGNsYXNzVG9TdHJpbmc7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBt
b2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgZm10ID0gRW1iZXIuU3RyaW5nLmZt
dCwKLSAgICBhZGRCZWZvcmVPYnNlcnZlciA9IEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyLAotICAg
IGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCi0gICAgcmVtb3ZlQmVmb3JlT2JzZXJ2
ZXIgPSBFbWJlci5yZW1vdmVCZWZvcmVPYnNlcnZlciwKLSAgICByZW1vdmVPYnNlcnZlciA9IEVt
YmVyLnJlbW92ZU9ic2VydmVyLAotICAgIHByb3BlcnR5V2lsbENoYW5nZSA9IEVtYmVyLnByb3Bl
cnR5V2lsbENoYW5nZSwKLSAgICBwcm9wZXJ0eURpZENoYW5nZSA9IEVtYmVyLnByb3BlcnR5RGlk
Q2hhbmdlLAotICAgIG1ldGEgPSBFbWJlci5tZXRhLAotICAgIGRlZmluZVByb3BlcnR5ID0gRW1i
ZXIuZGVmaW5lUHJvcGVydHk7Ci0KLWZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2Uo
Y29udGVudCwgY29udGVudEtleSkgewotICB2YXIga2V5ID0gY29udGVudEtleS5zbGljZSg4KTsg
Ly8gcmVtb3ZlICJjb250ZW50LiIKLSAgaWYgKGtleSBpbiB0aGlzKSB7IHJldHVybjsgfSAgLy8g
aWYgc2hhZG93ZWQgaW4gcHJveHkKLSAgcHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7Ci19
Ci0KLWZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZShjb250ZW50LCBjb250ZW50S2V5
KSB7Ci0gIHZhciBrZXkgPSBjb250ZW50S2V5LnNsaWNlKDgpOyAvLyByZW1vdmUgImNvbnRlbnQu
IgotICBpZiAoa2V5IGluIHRoaXMpIHsgcmV0dXJuOyB9IC8vIGlmIHNoYWRvd2VkIGluIHByb3h5
Ci0gIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleSk7Ci19Ci0KLS8qKgotICBgRW1iZXIuT2Jq
ZWN0UHJveHlgIGZvcndhcmRzIGFsbCBwcm9wZXJ0aWVzIG5vdCBkZWZpbmVkIGJ5IHRoZSBwcm94
eSBpdHNlbGYKLSAgdG8gYSBwcm94aWVkIGBjb250ZW50YCBvYmplY3QuCi0KLSAgYGBgamF2YXNj
cmlwdAotICBvYmplY3QgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICBuYW1lOiAnRm9vJwot
ICB9KTsKLQotICBwcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7Ci0gICAgY29udGVu
dDogb2JqZWN0Ci0gIH0pOwotCi0gIC8vIEFjY2VzcyBhbmQgY2hhbmdlIGV4aXN0aW5nIHByb3Bl
cnRpZXMKLSAgcHJveHkuZ2V0KCduYW1lJykgICAgICAgICAgLy8gJ0ZvbycKLSAgcHJveHkuc2V0
KCduYW1lJywgJ0JhcicpOwotICBvYmplY3QuZ2V0KCduYW1lJykgICAgICAgICAvLyAnQmFyJwot
Ci0gIC8vIENyZWF0ZSBuZXcgJ2Rlc2NyaXB0aW9uJyBwcm9wZXJ0eSBvbiBgb2JqZWN0YAotICBw
cm94eS5zZXQoJ2Rlc2NyaXB0aW9uJywgJ0ZvbyBpcyBhIHdoaXpib28gYmF6Jyk7Ci0gIG9iamVj
dC5nZXQoJ2Rlc2NyaXB0aW9uJykgIC8vICdGb28gaXMgYSB3aGl6Ym9vIGJheicKLSAgYGBgCi0K
LSAgV2hpbGUgYGNvbnRlbnRgIGlzIHVuc2V0LCBzZXR0aW5nIGEgcHJvcGVydHkgdG8gYmUgZGVs
ZWdhdGVkIHdpbGwgdGhyb3cgYW4KLSAgRXJyb3IuCi0KLSAgYGBgamF2YXNjcmlwdAotICBwcm94
eSA9IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7Ci0gICAgY29udGVudDogbnVsbCwKLSAgICBm
bGFnOiBudWxsCi0gIH0pOwotICBwcm94eS5zZXQoJ2ZsYWcnLCB0cnVlKTsKLSAgcHJveHkuZ2V0
KCdmbGFnJyk7ICAgICAgICAgLy8gdHJ1ZQotICBwcm94eS5nZXQoJ2ZvbycpOyAgICAgICAgICAv
LyB1bmRlZmluZWQKLSAgcHJveHkuc2V0KCdmb28nLCAnZGF0YScpOyAgLy8gdGhyb3dzIEVycm9y
Ci0gIGBgYAotCi0gIERlbGVnYXRlZCBwcm9wZXJ0aWVzIGNhbiBiZSBib3VuZCB0byBhbmQgd2ls
bCBjaGFuZ2Ugd2hlbiBjb250ZW50IGlzIHVwZGF0ZWQuCi0KLSAgQ29tcHV0ZWQgcHJvcGVydGll
cyBvbiB0aGUgcHJveHkgaXRzZWxmIGNhbiBkZXBlbmQgb24gZGVsZWdhdGVkIHByb3BlcnRpZXMu
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBQcm94eVdpdGhDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIu
T2JqZWN0UHJveHkuZXh0ZW5kKHsKLSAgICBmdWxsTmFtZTogZnVuY3Rpb24gKCkgewotICAgICAg
dmFyIGZpcnN0TmFtZSA9IHRoaXMuZ2V0KCdmaXJzdE5hbWUnKSwKLSAgICAgICAgICBsYXN0TmFt
ZSA9IHRoaXMuZ2V0KCdsYXN0TmFtZScpOwotICAgICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFt
ZSkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgJyAnICsgbGFzdE5hbWU7Ci0gICAgICB9
Ci0gICAgICByZXR1cm4gZmlyc3ROYW1lIHx8IGxhc3ROYW1lOwotICAgIH0ucHJvcGVydHkoJ2Zp
cnN0TmFtZScsICdsYXN0TmFtZScpCi0gIH0pOwotCi0gIHByb3h5ID0gUHJveHlXaXRoQ29tcHV0
ZWRQcm9wZXJ0eS5jcmVhdGUoKTsKLQotICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyB1bmRl
ZmluZWQKLSAgcHJveHkuc2V0KCdjb250ZW50JywgewotICAgIGZpcnN0TmFtZTogJ1RvbScsIGxh
c3ROYW1lOiAnRGFsZScKLSAgfSk7IC8vIHRyaWdnZXJzIHByb3BlcnR5IGNoYW5nZSBmb3IgZnVs
bE5hbWUgb24gcHJveHkKLQotICBwcm94eS5nZXQoJ2Z1bGxOYW1lJyk7ICAvLyAnVG9tIERhbGUn
Ci0gIGBgYAotCi0gIEBjbGFzcyBPYmplY3RQcm94eQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBl
eHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLk9iamVjdFByb3h5ID0gRW1iZXIuT2JqZWN0
LmV4dGVuZCh7Ci0gIC8qKgotICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJl
IGZvcndhcmRlZC4KLQotICAgIEBwcm9wZXJ0eSBjb250ZW50Ci0gICAgQHR5cGUgRW1iZXIuT2Jq
ZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBudWxsLAotICBfY29udGVu
dERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbigpIHsKLSAgICBF
bWJlci5hc3NlcnQoIkNhbid0IHNldCBPYmplY3RQcm94eSdzIGNvbnRlbnQgdG8gaXRzZWxmIiwg
dGhpcy5nZXQoJ2NvbnRlbnQnKSAhPT0gdGhpcyk7Ci0gIH0pLAotCi0gIGlzVHJ1dGh5OiBFbWJl
ci5jb21wdXRlZC5ib29sKCdjb250ZW50JyksCi0KLSAgX2RlYnVnQ29udGFpbmVyS2V5OiBudWxs
LAotCi0gIHdpbGxXYXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNvbnRl
bnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIGFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGNv
bnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOwotICAgIGFkZE9ic2Vy
dmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7Ci0g
IH0sCi0KLSAgZGlkVW53YXRjaFByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgdmFyIGNv
bnRlbnRLZXkgPSAnY29udGVudC4nICsga2V5OwotICAgIHJlbW92ZUJlZm9yZU9ic2VydmVyKHRo
aXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eVdpbGxDaGFuZ2UpOwotICAgIHJl
bW92ZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRlbnRQcm9wZXJ0eURpZENo
YW5nZSk7Ci0gIH0sCi0KLSAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7Ci0gICAg
dmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLSAgICBpZiAoY29udGVudCkgewot
ICAgICAgcmV0dXJuIGdldChjb250ZW50LCBrZXkpOwotICAgIH0KLSAgfSwKLQotICBzZXRVbmtu
b3duUHJvcGVydHk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgdmFyIG0gPSBtZXRhKHRo
aXMpOwotICAgIGlmIChtLnByb3RvID09PSB0aGlzKSB7Ci0gICAgICAvLyBpZiBtYXJrZWQgYXMg
cHJvdG90eXBlIHRoZW4ganVzdCBkZWZpbmVQcm9wZXJ0eQotICAgICAgLy8gcmF0aGVyIHRoYW4g
ZGVsZWdhdGUKLSAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgbnVsbCwgdmFsdWUpOwot
ICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMs
ICdjb250ZW50Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiQ2Fubm90IGRlbGVnYXRlIHNldCgn
JUAnLCAlQCkgdG8gdGhlICdjb250ZW50JyBwcm9wZXJ0eSBvZiBvYmplY3QgcHJveHkgJUA6IGl0
cyAnY29udGVudCcgaXMgdW5kZWZpbmVkLiIsIFtrZXksIHZhbHVlLCB0aGlzXSksIGNvbnRlbnQp
OwotICAgIHJldHVybiBzZXQoY29udGVudCwga2V5LCB2YWx1ZSk7Ci0gIH0KLQotfSk7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQotKi8KLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gSEVMUEVSUwotLy8KLQotdmFyIGdldCA9IEVt
YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUu
c2xpY2U7Ci12YXIgYV9pbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Ci0K
LXZhciBjb250ZXh0cyA9IFtdOwotCi1mdW5jdGlvbiBwb3BDdHgoKSB7Ci0gIHJldHVybiBjb250
ZXh0cy5sZW5ndGg9PT0wID8ge30gOiBjb250ZXh0cy5wb3AoKTsKLX0KLQotZnVuY3Rpb24gcHVz
aEN0eChjdHgpIHsKLSAgY29udGV4dHMucHVzaChjdHgpOwotICByZXR1cm4gbnVsbDsKLX0KLQot
ZnVuY3Rpb24gaXRlcihrZXksIHZhbHVlKSB7Ci0gIHZhciB2YWx1ZVByb3ZpZGVkID0gYXJndW1l
bnRzLmxlbmd0aCA9PT0gMjsKLQotICBmdW5jdGlvbiBpKGl0ZW0pIHsKLSAgICB2YXIgY3VyID0g
Z2V0KGl0ZW0sIGtleSk7Ci0gICAgcmV0dXJuIHZhbHVlUHJvdmlkZWQgPyB2YWx1ZT09PWN1ciA6
ICEhY3VyOwotICB9Ci0gIHJldHVybiBpIDsKLX0KLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5l
cyB0aGUgY29tbW9uIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBlbnVtZXJhYmxlIG9iamVjdHMK
LSAgaW4gRW1iZXIuIE1vc3Qgb2YgdGhlc2UgbWV0aG9kcyBmb2xsb3cgdGhlIHN0YW5kYXJkIEFy
cmF5IGl0ZXJhdGlvbgotICBBUEkgZGVmaW5lZCB1cCB0byBKYXZhU2NyaXB0IDEuOCAoZXhjbHVk
aW5nIGxhbmd1YWdlLXNwZWNpZmljIGZlYXR1cmVzIHRoYXQKLSAgY2Fubm90IGJlIGVtdWxhdGVk
IGluIG9sZGVyIHZlcnNpb25zIG9mIEphdmFTY3JpcHQpLgotCi0gIFRoaXMgbWl4aW4gaXMgYXBw
bGllZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBBcnJheSBjbGFzcyBvbiBwYWdlIGxvYWQsIHNvIHlv
dQotICBjYW4gdXNlIGFueSBvZiB0aGVzZSBtZXRob2RzIG9uIHNpbXBsZSBhcnJheXMuIElmIEFy
cmF5IGFscmVhZHkgaW1wbGVtZW50cwotICBvbmUgb2YgdGhlc2UgbWV0aG9kcywgdGhlIG1peGlu
IHdpbGwgbm90IG92ZXJyaWRlIHRoZW0uCi0KLSAgIyMgV3JpdGluZyBZb3VyIE93biBFbnVtZXJh
YmxlCi0KLSAgVG8gbWFrZSB5b3VyIG93biBjdXN0b20gY2xhc3MgZW51bWVyYWJsZSwgeW91IG5l
ZWQgdHdvIGl0ZW1zOgotCi0gIDEuIFlvdSBtdXN0IGhhdmUgYSBsZW5ndGggcHJvcGVydHkuIFRo
aXMgcHJvcGVydHkgc2hvdWxkIGNoYW5nZSB3aGVuZXZlcgotICAgICB0aGUgbnVtYmVyIG9mIGl0
ZW1zIGluIHlvdXIgZW51bWVyYWJsZSBvYmplY3QgY2hhbmdlcy4gSWYgeW91IHVzaW5nIHRoaXMK
LSAgICAgd2l0aCBhbiBgRW1iZXIuT2JqZWN0YCBzdWJjbGFzcywgeW91IHNob3VsZCBiZSBzdXJl
IHRvIGNoYW5nZSB0aGUgbGVuZ3RoCi0gICAgIHByb3BlcnR5IHVzaW5nIGBzZXQoKS5gCi0KLSAg
Mi4gWW91IG11c3QgaW1wbGVtZW50IGBuZXh0T2JqZWN0KCkuYCBTZWUgZG9jdW1lbnRhdGlvbi4K
LQotICBPbmNlIHlvdSBoYXZlIHRoZXNlIHR3byBtZXRob2RzIGltcGxlbWVudCwgYXBwbHkgdGhl
IGBFbWJlci5FbnVtZXJhYmxlYCBtaXhpbgotICB0byB5b3VyIGNsYXNzIGFuZCB5b3Ugd2lsbCBi
ZSBhYmxlIHRvIGVudW1lcmF0ZSB0aGUgY29udGVudHMgb2YgeW91ciBvYmplY3QKLSAgbGlrZSBh
bnkgb3RoZXIgY29sbGVjdGlvbi4KLQotICAjIyBVc2luZyBFbWJlciBFbnVtZXJhdGlvbiB3aXRo
IE90aGVyIExpYnJhcmllcwotCi0gIE1hbnkgb3RoZXIgbGlicmFyaWVzIHByb3ZpZGUgc29tZSBr
aW5kIG9mIGl0ZXJhdG9yIG9yIGVudW1lcmF0aW9uIGxpa2UKLSAgZmFjaWxpdHkuIFRoaXMgaXMg
b2Z0ZW4gd2hlcmUgdGhlIG1vc3QgY29tbW9uIEFQSSBjb25mbGljdHMgb2NjdXIuCi0gIEVtYmVy
J3MgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGFzIGZyaWVuZGx5IGFzIHBvc3NpYmxlIHdpdGggb3Ro
ZXIKLSAgbGlicmFyaWVzIGJ5IGltcGxlbWVudGluZyBvbmx5IG1ldGhvZHMgdGhhdCBtb3N0bHkg
Y29ycmVzcG9uZCB0byB0aGUKLSAgSmF2YVNjcmlwdCAxLjggQVBJLgotCi0gIEBjbGFzcyBFbnVt
ZXJhYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVy
LkVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewotCi0gIC8qKgotICAgIEltcGxlbWVu
dCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xhc3MgZW51bWVyYWJsZS4KLQotICAgIFRoaXMg
bWV0aG9kIHdpbGwgYmUgY2FsbCByZXBlYXRlZGx5IGR1cmluZyBlbnVtZXJhdGlvbi4gVGhlIGlu
ZGV4IHZhbHVlCi0gICAgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9u
b3RvbmljYWxseS4gWW91IGRvbid0IGhhdmUgdG8KLSAgICByZWx5IG9uIHRoZSBpbmRleCB2YWx1
ZSB0byBkZXRlcm1pbmUgd2hhdCBvYmplY3QgdG8gcmV0dXJuLCBidXQgeW91IHNob3VsZAotICAg
IGFsd2F5cyBjaGVjayB0aGUgdmFsdWUgYW5kIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB3aGVu
IHlvdSBzZWUgdGhlCi0gICAgcmVxdWVzdGVkIGluZGV4IGlzIDAuCi0KLSAgICBUaGUgYHByZXZp
b3VzT2JqZWN0YCBpcyB0aGUgb2JqZWN0IHRoYXQgd2FzIHJldHVybmVkIGZyb20gdGhlIGxhc3Qg
Y2FsbAotICAgIHRvIGBuZXh0T2JqZWN0YCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uLiBUaGlz
IGlzIGEgdXNlZnVsIHdheSB0bwotICAgIG1hbmFnZSBpdGVyYXRpb24gaWYgeW91IGFyZSB0cmFj
aW5nIGEgbGlua2VkIGxpc3QsIGZvciBleGFtcGxlLgotCi0gICAgRmluYWxseSB0aGUgY29udGV4
dCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKLSAg
ICBhICJzY3JhdGNocGFkIiB0byBtYWludGFpbiBhbnkgb3RoZXIgc3RhdGUgeW91IG5lZWQgaW4g
b3JkZXIgdG8gaXRlcmF0ZQotICAgIHByb3Blcmx5LiBUaGUgY29udGV4dCBvYmplY3QgaXMgcmV1
c2VkIGFuZCBpcyBub3QgcmVzZXQgYmV0d2VlbgotICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJl
IHlvdSBzZXR1cCB0aGUgY29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKLSAgICB0
aGUgaW5kZXggcGFyYW1ldGVyIGlzIDAuCi0KLSAgICBHZW5lcmFsbHkgaXRlcmF0b3JzIHdpbGwg
Y29udGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhlIGluZGV4Ci0gICAgcmVhY2hl
cyB0aGUgeW91ciBjdXJyZW50IGxlbmd0aC0xLiBJZiB5b3UgcnVuIG91dCBvZiBkYXRhIGJlZm9y
ZSB0aGlzCi0gICAgdGltZSBmb3Igc29tZSByZWFzb24sIHlvdSBzaG91bGQgc2ltcGx5IHJldHVy
biB1bmRlZmluZWQuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1l
dGhvZCBzaW1wbHkgbG9va3MgdXAgdGhlIGluZGV4LgotICAgIFRoaXMgd29ya3MgZ3JlYXQgb24g
YW55IEFycmF5LWxpa2Ugb2JqZWN0cy4KLQotICAgIEBtZXRob2QgbmV4dE9iamVjdAotICAgIEBw
YXJhbSB7TnVtYmVyfSBpbmRleCB0aGUgY3VycmVudCBpbmRleCBvZiB0aGUgaXRlcmF0aW9uCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHByZXZpb3VzT2JqZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0
aGUgbGFzdCBjYWxsIHRvCi0gICAgICBgbmV4dE9iamVjdGAuCi0gICAgQHBhcmFtIHtPYmplY3R9
IGNvbnRleHQgYSBjb250ZXh0IG9iamVjdCB5b3UgY2FuIHVzZSB0byBtYWludGFpbiBzdGF0ZS4K
LSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uIG9y
IHVuZGVmaW5lZAotICAqLwotICBuZXh0T2JqZWN0OiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiks
Ci0KLSAgLyoqCi0gICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBvYmplY3QgZnJv
bSBhIGNvbGxlY3Rpb24uIFRoaXMgaXMgdXN1YWxseQotICAgIHVzZWQgYnkgYmluZGluZ3MgYW5k
IG90aGVyIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsgdG8gZXh0cmFjdCBhIHNpbmdsZQotICAgIG9i
amVjdCBpZiB0aGUgZW51bWVyYWJsZSBjb250YWlucyBvbmx5IG9uZSBpdGVtLgotCi0gICAgSWYg
eW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBpdCBzbyB0aGF0
IGl0IHdpbGwKLSAgICBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGVhY2ggdGltZSBpdCBp
cyBjYWxsZWQuIElmIHlvdXIgZW51bWVyYWJsZQotICAgIGNvbnRhaW5zIG9ubHkgb25lIG9iamVj
dCwgdGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhhdCBvYmplY3QuCi0gICAgSWYg
eW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB1bmRl
ZmluZWRgLgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJj
Il07Ci0gICAgYXJyLmdldCgnZmlyc3RPYmplY3QnKTsgIC8vICJhIgotCi0gICAgdmFyIGFyciA9
IFtdOwotICAgIGFyci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKLSAgICBgYGAK
LQotICAgIEBwcm9wZXJ0eSBmaXJzdE9iamVjdAotICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG9i
amVjdCBvciB1bmRlZmluZWQKLSAgKi8KLSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2xlbmd0aCcpPT09MCkgcmV0dXJuIHVuZGVm
aW5lZCA7Ci0KLSAgICAvLyBoYW5kbGUgZ2VuZXJpYyBlbnVtZXJhYmxlcwotICAgIHZhciBjb250
ZXh0ID0gcG9wQ3R4KCksIHJldDsKLSAgICByZXQgPSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwg
Y29udGV4dCk7Ci0gICAgcHVzaEN0eChjb250ZXh0KTsKLSAgICByZXR1cm4gcmV0IDsKLSAgfSku
cHJvcGVydHkoJ1tdJyksCi0KLSAgLyoqCi0gICAgSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBs
YXN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4gSWYgeW91ciBlbnVtZXJhYmxlCi0gICAgY29u
dGFpbnMgb25seSBvbmUgb2JqZWN0LCB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0
aGF0IG9iamVjdC4KLSAgICBJZiB5b3VyIGVudW1lcmFibGUgaXMgZW1wdHksIHRoaXMgbWV0aG9k
IHNob3VsZCByZXR1cm4gYHVuZGVmaW5lZGAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFy
IGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAi
YyIKLQotICAgIHZhciBhcnIgPSBbXTsKLSAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1
bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0Ci0gICAgQHJldHVy
biB7T2JqZWN0fSB0aGUgbGFzdCBvYmplY3Qgb3IgdW5kZWZpbmVkCi0gICovCi0gIGxhc3RPYmpl
Y3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHZhciBsZW4gPSBnZXQodGhpcywg
J2xlbmd0aCcpOwotICAgIGlmIChsZW49PT0wKSByZXR1cm4gdW5kZWZpbmVkIDsKLSAgICB2YXIg
Y29udGV4dCA9IHBvcEN0eCgpLCBpZHg9MCwgY3VyLCBsYXN0ID0gbnVsbDsKLSAgICBkbyB7Ci0g
ICAgICBsYXN0ID0gY3VyOwotICAgICAgY3VyID0gdGhpcy5uZXh0T2JqZWN0KGlkeCsrLCBsYXN0
LCBjb250ZXh0KTsKLSAgICB9IHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCk7Ci0gICAgcHVzaEN0
eChjb250ZXh0KTsKLSAgICByZXR1cm4gbGFzdDsKLSAgfSkucHJvcGVydHkoJ1tdJyksCi0KLSAg
LyoqCi0gICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBvYmplY3QgY2FuIGJlIGZvdW5k
IGluIHRoZSByZWNlaXZlci4gVGhlCi0gICAgZGVmYXVsdCB2ZXJzaW9uIHdpbGwgaXRlcmF0ZSB0
aHJvdWdoIHRoZSBlbnVtZXJhYmxlIHVudGlsIHRoZSBvYmplY3QKLSAgICBpcyBmb3VuZC4gWW91
IG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgd2l0aCBhIG1vcmUgZWZmaWNpZW50IHZlcnNpb24u
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKLSAg
ICBhcnIuY29udGFpbnMoImEiKTsgLy8gdHJ1ZQotICAgIGFyci5jb250YWlucygieiIpOyAvLyBm
YWxzZQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBjb250YWlucwotICAgIEBwYXJhbSB7T2JqZWN0
fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0
cnVlYCBpZiBvYmplY3QgaXMgZm91bmQgaW4gZW51bWVyYWJsZS4KLSAgKi8KLSAgY29udGFpbnM6
IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24oaXRlbSkgeyBy
ZXR1cm4gaXRlbT09PW9iajsgfSkgIT09IHVuZGVmaW5lZDsKLSAgfSwKLQotICAvKioKLSAgICBJ
dGVyYXRlcyB0aHJvdWdoIHRoZSBlbnVtZXJhYmxlLCBjYWxsaW5nIHRoZSBwYXNzZWQgZnVuY3Rp
b24gb24gZWFjaAotICAgIGl0ZW0uIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBgZm9y
RWFjaCgpYCBtZXRob2QgZGVmaW5lZCBpbgotICAgIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhl
IGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp
Z25hdHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAK
LQotICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAg
ICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAt
IGBlbnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgTm90
ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9w
dGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0
aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9y
IGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBAbWV0aG9kIGZv
ckVhY2gKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhl
Y3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1
c2UKLSAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCi0gICovCi0gIGZvckVhY2g6IGZ1bmN0
aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVu
Y3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkgOwotICAgIHZhciBsZW4gPSBnZXQodGhpcywg
J2xlbmd0aCcpLCBsYXN0ID0gbnVsbCwgY29udGV4dCA9IHBvcEN0eCgpOwotCi0gICAgaWYgKHRh
cmdldCA9PT0gdW5kZWZpbmVkKSB0YXJnZXQgPSBudWxsOwotCi0gICAgZm9yKHZhciBpZHg9MDtp
ZHg8bGVuO2lkeCsrKSB7Ci0gICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxh
c3QsIGNvbnRleHQpIDsKLSAgICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZXh0LCBpZHgsIHRo
aXMpOwotICAgICAgbGFzdCA9IG5leHQgOwotICAgIH0KLSAgICBsYXN0ID0gbnVsbCA7Ci0gICAg
Y29udGV4dCA9IHB1c2hDdHgoY29udGV4dCk7Ci0gICAgcmV0dXJuIHRoaXMgOwotICB9LAotCi0g
IC8qKgotICAgIEFsaWFzIGZvciBgbWFwQnlgCi0KLSAgICBAbWV0aG9kIGdldEVhY2gKLSAgICBA
cGFyYW0ge1N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgQHJldHVybiB7QXJy
YXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0gICovCi0gIGdldEVhY2g6IGZ1bmN0aW9uKGtleSkgewot
ICAgIHJldHVybiB0aGlzLm1hcEJ5KGtleSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUg
dmFsdWUgb24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlci4gVGhpcyBpcyBtb3Jl
Ci0gICAgZWZmaWNpZW50IHRoYW4gdXNpbmcgb3RoZXIgbWV0aG9kcyBkZWZpbmVkIG9uIHRoaXMg
aGVscGVyLiBJZiB0aGUgb2JqZWN0Ci0gICAgaW1wbGVtZW50cyBFbWJlci5PYnNlcnZhYmxlLCB0
aGUgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIHRvIGBzZXQoKSxgIG90aGVyd2lzZQotICAgIGl0IHdp
bGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0cyBhcmUgc2tpcHBlZC4KLQotICAgIEBt
ZXRob2Qgc2V0RWFjaAotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQKLSAg
ICBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIG9iamVjdCB0byBzZXQKLSAgICBAcmV0dXJuIHtP
YmplY3R9IHJlY2VpdmVyCi0gICovCi0gIHNldEVhY2g6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK
LSAgICByZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHNldChpdGVt
LCBrZXksIHZhbHVlKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBNYXBzIGFsbCBvZiB0
aGUgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uIHRvIGFub3RoZXIgdmFsdWUsIHJldHVybmluZwot
ICAgIGEgbmV3IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFwKClgIGRlZmlu
ZWQgaW4gSmF2YVNjcmlwdCAxLjYuCi0KLSAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92
aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKLSAgICBwYXJhbWV0
ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgZnVuY3Rpb24oaXRl
bSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAotCi0gICAgLSBgaXRlbWAgaXMgdGhlIGN1
cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVu
dCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVt
ZXJhYmxlIG9iamVjdCBpdHNlbGYuCi0KLSAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBtYXBwZWQg
dmFsdWUuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIEBtZXRob2QgbWFwCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNh
bGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdl
dCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7QXJyYXl9IFRoZSBtYXBwZWQgYXJyYXkuCi0g
ICovCi0gIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewotICAgIHZhciByZXQgPSBF
bWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAg
cmV0W2lkeF0gPSBjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LGkpOwotICAgIH0pOwotICAg
IHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFNpbWlsYXIgdG8gbWFwLCB0aGlzIHNw
ZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZAotICAgIHBy
b3BlcnR5IG9uIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYXRpb24uCi0KLSAgICBAbWV0aG9kIG1h
cEJ5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEBy
ZXR1cm4ge0FycmF5fSBUaGUgbWFwcGVkIGFycmF5LgotICAqLwotICBtYXBCeTogZnVuY3Rpb24o
a2V5KSB7Ci0gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG5leHQpIHsKLSAgICAgIHJldHVy
biBnZXQobmV4dCwga2V5KTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBTaW1pbGFyIHRv
IG1hcCwgdGhpcyBzcGVjaWFsaXplZCBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUg
bmFtZWQKLSAgICBwcm9wZXJ0eSBvbiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uLgotCi0g
ICAgQG1ldGhvZCBtYXBQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgbmFtZSBvZiB0
aGUgcHJvcGVydHkKLSAgICBAcmV0dXJuIHtBcnJheX0gVGhlIG1hcHBlZCBhcnJheS4KLSAgICBA
ZGVwcmVjYXRlZCBVc2UgYG1hcEJ5YCBpbnN0ZWFkCi0gICovCi0KLSAgbWFwUHJvcGVydHk6IEVt
YmVyLmFsaWFzTWV0aG9kKCdtYXBCeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkg
d2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlvbiB0aGF0IHRoZSBwYXNzZWQK
LSAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yLiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0
byBgZmlsdGVyKClgIGRlZmluZWQgaW4KLSAgICBKYXZhU2NyaXB0IDEuNi4KLQotICAgIFRoZSBj
YWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWdu
YXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBmdW5jdGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0K
LSAgICAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAg
LSBgaW5kZXhgIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBg
ZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNo
b3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVtIGluIHRoZSByZXN1bHRz
LCBgZmFsc2VgCi0gICAgb3RoZXJ3aXNlLgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRv
IGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9i
amVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBh
IGdvb2Qgd2F5Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0
aGUgY3VycmVudCBvYmplY3QuCi0KLSAgICBAbWV0aG9kIGZpbHRlcgotICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmpl
Y3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge0FycmF5
fSBBIGZpbHRlcmVkIGFycmF5LgotICAqLwotICBmaWx0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0
YXJnZXQpIHsKLSAgICB2YXIgcmV0ID0gRW1iZXIuQSgpOwotICAgIHRoaXMuZm9yRWFjaChmdW5j
dGlvbih4LCBpZHgsIGkpIHsKLSAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4
LCBpKSkgcmV0LnB1c2goeCk7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGVu
dW1lcmF0aW9uIHdoZXJlIHRoZSBwYXNzZWQKLSAgICBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZv
ci4gVGhpcyBtZXRob2QgaXMgdGhlIGludmVyc2Ugb2YgZmlsdGVyKCkuCi0KLSAgICBUaGUgY2Fs
bGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0
dXJlIChhbGwKLSAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwotICAgIGBgYAotCi0g
ICAgLSAqaXRlbSogaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0g
KmluZGV4KiBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uCi0gICAgLSAqZW51
bWVyYWJsZSogaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3Vs
ZCByZXR1cm4gdGhlIGEgZmFsc2V5IHZhbHVlIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJl
c3VsdHMuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgInRoaXMiIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIEBtZXRob2QgcmVqZWN0Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhl
IGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRh
cmdldCBvYmplY3QgdG8gdXNlCi0gICAgQHJldHVybiB7QXJyYXl9IEEgcmVqZWN0ZWQgYXJyYXku
Ci0gICAqLwotICByZWplY3Q6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKLSAgICByZXR1
cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gIShjYWxsYmFjay5hcHBs
eSh0YXJnZXQsIGFyZ3VtZW50cykpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIFJldHVy
bnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBpdGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5
LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUg
dGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5
IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQotICAgIEBtZXRob2QgZmlsdGVyQnkKLSAgICBA
cGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJp
bmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4g
e0FycmF5fSBmaWx0ZXJlZCBhcnJheQotICAqLwotICBmaWx0ZXJCeTogZnVuY3Rpb24oa2V5LCB2
YWx1ZSkgewotICAgIHJldHVybiB0aGlzLmZpbHRlcihpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cykpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgYW4gYXJyYXkgd2l0aCBqdXN0IHRoZSBp
dGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5LiBZb3UKLSAgICBjYW4gcGFzcyBhbiBvcHRp
b25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKLSAg
ICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4K
LQotICAgIEBtZXRob2QgZmlsdGVyUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRo
ZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwg
dmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICAgIEByZXR1cm4ge0FycmF5fSBmaWx0ZXJlZCBhcnJh
eQotICAgIEBkZXByZWNhdGVkIFVzZSBgZmlsdGVyQnlgIGluc3RlYWQKLSAgKi8KLSAgZmlsdGVy
UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdmaWx0ZXJCeScpLAotCi0gIC8qKgotICAgIFJl
dHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0aHkgdmFs
dWVzIGZvcgotICAgIGtleS4gIFlvdSBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1l
bnQgd2l0aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNo
IGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxzZS4KLQotICAgIEBtZXRob2QgcmVq
ZWN0QnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAg
QHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Lgot
ICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBhcnJheQotICAqLwotICByZWplY3RCeTogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIHZhciBleGFjdFZhbHVlID0gZnVuY3Rpb24oaXRlbSkg
eyByZXR1cm4gZ2V0KGl0ZW0sIGtleSkgPT09IHZhbHVlOyB9LAotICAgICAgICBoYXNWYWx1ZSA9
IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuICEhZ2V0KGl0ZW0sIGtleSk7IH0sCi0gICAgICAgIHVz
ZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAyID8gZXhhY3RWYWx1ZSA6IGhhc1ZhbHVlKTsKLQot
ICAgIHJldHVybiB0aGlzLnJlamVjdCh1c2UpOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMg
YW4gYXJyYXkgd2l0aCB0aGUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSB0cnV0aHkgdmFsdWVzIGZv
cgotICAgIGtleS4gIFlvdSBjYW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0
aCB0aGUgdGFyZ2V0IHZhbHVlLiAgT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBw
cm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxzZS4KLQotICAgIEBtZXRob2QgcmVqZWN0UHJv
cGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0gICAg
QHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Lgot
ICAgIEByZXR1cm4ge0FycmF5fSByZWplY3RlZCBhcnJheQotICAgIEBkZXByZWNhdGVkIFVzZSBg
cmVqZWN0QnlgIGluc3RlYWQKLSAgKi8KLSAgcmVqZWN0UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0
aG9kKCdyZWplY3RCeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4g
dGhlIGFycmF5IGZvciB3aGljaCB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgotICAgIFRoaXMg
bWV0aG9kIHdvcmtzIHNpbWlsYXIgdG8gdGhlIGBmaWx0ZXIoKWAgbWV0aG9kIGRlZmluZWQgaW4g
SmF2YVNjcmlwdCAxLjYKLSAgICBleGNlcHQgdGhhdCBpdCB3aWxsIHN0b3Agd29ya2luZyBvbiB0
aGUgYXJyYXkgb25jZSBhIG1hdGNoIGlzIGZvdW5kLgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhv
ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0g
ICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1
bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1g
IGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMg
dGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBp
cyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0
aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAg
ICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywg
eW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2ls
bCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAg
ICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9i
amVjdC4KLQotICAgIEBtZXRob2QgZmluZAotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr
IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRo
ZSB0YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge09iamVjdH0gRm91bmQgaXRlbSBv
ciBgdW5kZWZpbmVkYC4KLSAgKi8KLSAgZmluZDogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkg
ewotICAgIHZhciBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpIDsKLSAgICBpZiAodGFyZ2V0ID09
PSB1bmRlZmluZWQpIHRhcmdldCA9IG51bGw7Ci0KLSAgICB2YXIgbGFzdCA9IG51bGwsIG5leHQs
IGZvdW5kID0gZmFsc2UsIHJldCA7Ci0gICAgdmFyIGNvbnRleHQgPSBwb3BDdHgoKTsKLSAgICBm
b3IodmFyIGlkeD0wO2lkeDxsZW4gJiYgIWZvdW5kO2lkeCsrKSB7Ci0gICAgICBuZXh0ID0gdGhp
cy5uZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29udGV4dCkgOwotICAgICAgaWYgKGZvdW5kID0gY2Fs
bGJhY2suY2FsbCh0YXJnZXQsIG5leHQsIGlkeCwgdGhpcykpIHJldCA9IG5leHQgOwotICAgICAg
bGFzdCA9IG5leHQgOwotICAgIH0KLSAgICBuZXh0ID0gbGFzdCA9IG51bGwgOwotICAgIGNvbnRl
eHQgPSBwdXNoQ3R4KGNvbnRleHQpOwotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgot
ICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gd2l0aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBw
YXNzZWQgdmFsdWUuIFlvdQotICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVu
dCB3aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVyd2lzZQotICAgIHRoaXMgd2lsbCBtYXRjaCBh
bnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gYHRydWVgLgotCi0gICAgVGhpcyBtZXRob2Qg
d29ya3MgbXVjaCBsaWtlIHRoZSBtb3JlIGdlbmVyaWMgYGZpbmQoKWAgbWV0aG9kLgotCi0gICAg
QG1ldGhvZCBmaW5kQnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0
ZXN0Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBh
Z2FpbnN0LgotICAgIEByZXR1cm4ge09iamVjdH0gZm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYAot
ICAqLwotICBmaW5kQnk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpcy5m
aW5kKGl0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0
dXJucyB0aGUgZmlyc3QgaXRlbSB3aXRoIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2
YWx1ZS4gWW91Ci0gICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGgg
dGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCi0gICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9w
ZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAuCi0KLSAgICBUaGlzIG1ldGhvZCB3b3JrcyBt
dWNoIGxpa2UgdGhlIG1vcmUgZ2VuZXJpYyBgZmluZCgpYCBtZXRob2QuCi0KLSAgICBAbWV0aG9k
IGZpbmRQcm9wZXJ0eQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRl
c3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFn
YWluc3QuCi0gICAgQHJldHVybiB7T2JqZWN0fSBmb3VuZCBpdGVtIG9yIGB1bmRlZmluZWRgCi0g
ICAgQGRlcHJlY2F0ZWQgVXNlIGBmaW5kQnlgIGluc3RlYWQKLSAgKi8KLSAgZmluZFByb3BlcnR5
OiBFbWJlci5hbGlhc01ldGhvZCgnZmluZEJ5JyksCi0KLSAgLyoqCi0gICAgUmV0dXJucyBgdHJ1
ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5IGl0ZW0gaW4g
dGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYGV2ZXJ5KClg
IG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91
IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBh
cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlv
bihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBpdGVtYCBpcyB0
aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgaW5kZXhgIGlzIHRoZSBj
dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCi0gICAgLSBgZW51bWVyYWJsZWAgaXMgdGhl
IGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KLQotICAgIEl0IHNob3VsZCByZXR1cm4gdGhlIGB0
cnVlYCBvciBgZmFsc2VgLgotCi0gICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJh
Y2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAotICAgIG9iamVjdCB0aGF0
IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5
Ci0gICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVu
dCBvYmplY3QuCi0KLSAgICBFeGFtcGxlIFVzYWdlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IGlmIChwZW9wbGUuZXZlcnkoaXNFbmdpbmVlcikpIHsgUGF5Y2hlY2tzLmFkZEJpZ0JvbnVzKCk7
IH0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgZXZlcnkKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBj
YWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFy
Z2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtCb29sZWFufQotICAq
LwotICBldmVyeTogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewotICAgIHJldHVybiAhdGhp
cy5maW5kKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0dXJuICFjYWxsYmFjay5jYWxs
KHRhcmdldCwgeCwgaWR4LCBpKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBAbWV0aG9k
IGV2ZXJ5QnkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0Ci0g
ICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0
LgotICAgIEBkZXByZWNhdGVkIFVzZSBgaXNFdmVyeWAgaW5zdGVhZAotICAgIEByZXR1cm4ge0Jv
b2xlYW59Ci0gICovCi0gIGV2ZXJ5Qnk6IEVtYmVyLmFsaWFzTWV0aG9kKCdpc0V2ZXJ5JyksCi0K
LSAgLyoqCi0gICAgQG1ldGhvZCBldmVyeVByb3BlcnR5Ci0gICAgQHBhcmFtIHtTdHJpbmd9IGtl
eSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlv
bmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBAZGVwcmVjYXRlZCBVc2UgYGlzRXZlcnlg
IGluc3RlYWQKLSAgICBAcmV0dXJuIHtCb29sZWFufQotICAqLwotICBldmVyeVByb3BlcnR5OiBF
bWJlci5hbGlhc01ldGhvZCgnaXNFdmVyeScpLAotCi0gIC8qKgotICAgIFJldHVybnMgYHRydWVg
IGlmIHRoZSBwYXNzZWQgcHJvcGVydHkgcmVzb2x2ZXMgdG8gYHRydWVgIGZvciBhbGwgaXRlbXMg
aW4KLSAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0
ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgotCi0gICAgQG1ldGhvZCBpc0V2ZXJ5Ci0gICAgQHBh
cmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAotICAgIEBwYXJhbSB7U3RyaW5n
fSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgICBAcmV0dXJuIHtC
b29sZWFufQotICAqLwotICBpc0V2ZXJ5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0
dXJuIHRoaXMuZXZlcnkoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKLSAgfSwKLQotICAv
KioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1
ZSBmb3IgYW55IGl0ZW0gaW4gdGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMg
d2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNh
bGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h
dHVyZSAoYWxsCi0gICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNj
cmlwdAotICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQot
ICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAt
IGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBl
bnVtZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hv
dWxkIHJldHVybiB0aGUgYHRydWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMs
IGBmYWxzZWAKLSAgICBvdGhlcndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8g
YSBjYWxsYmFjaywgeW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2Jq
ZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEg
Z29vZCB3YXkKLSAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRo
ZSBjdXJyZW50IG9iamVjdC4KLQotICAgIFVzYWdlIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgaWYgKHBlb3BsZS5hbnkoaXNNYW5hZ2VyKSkgeyBQYXljaGVja3MuYWRkQmlnZ2Vy
Qm9udXMoKTsgfQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBhbnkKLSAgICBAcGFyYW0ge0Z1bmN0
aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7T2JqZWN0
fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKLSAgICBAcmV0dXJuIHtCb29sZWFu
fSBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0
ZW0KLSAgKi8KLSAgYW55OiBmdW5jdGlvbihjYWxsYmFjaywgdGFyZ2V0KSB7Ci0gICAgdmFyIGZv
dW5kID0gdGhpcy5maW5kKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewotICAgICAgcmV0dXJuICEhY2Fs
bGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdHlw
ZW9mIGZvdW5kICE9PSAndW5kZWZpbmVkJzsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0
cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW55IGl0ZW0gaW4g
dGhlCi0gICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAg
bWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgotCi0gICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3Ug
cHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCi0gICAgcGFy
YW1ldGVycyBhcmUgb3B0aW9uYWwpOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGZ1bmN0aW9u
KGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKLSAgICBgYGAKLQotICAgIC0gYGl0ZW1gIGlzIHRo
ZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBpbmRleGAgaXMgdGhlIGN1
cnJlbnQgaW5kZXggaW4gdGhlIGl0ZXJhdGlvbi4KLSAgICAtIGBlbnVtZXJhYmxlYCBpcyB0aGUg
ZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgotCi0gICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRy
dWVgIHRvIGluY2x1ZGUgdGhlIGl0ZW0gaW4gdGhlIHJlc3VsdHMsIGBmYWxzZWAKLSAgICBvdGhl
cndpc2UuCi0KLSAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNh
biBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0Ci0gICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBz
ZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKLSAgICB0byBn
aXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4K
LQotICAgIFVzYWdlIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgaWYgKHBlb3Bs
ZS5zb21lKGlzTWFuYWdlcikpIHsgUGF5Y2hlY2tzLmFkZEJpZ2dlckJvbnVzKCk7IH0KLSAgICBg
YGAKLQotICAgIEBtZXRob2Qgc29tZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRo
ZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0
YXJnZXQgb2JqZWN0IHRvIHVzZQotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUg
cGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQotICAgIEBkZXByZWNh
dGVkIFVzZSBgYW55YCBpbnN0ZWFkCi0gICovCi0gIHNvbWU6IEVtYmVyLmFsaWFzTWV0aG9kKCdh
bnknKSwKLQotICAvKioKLSAgICBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGFzc2VkIHByb3BlcnR5
IHJlc29sdmVzIHRvIGB0cnVlYCBmb3IgYW55IGl0ZW0gaW4KLSAgICB0aGUgZW51bWVyYWJsZS4g
VGhpcyBtZXRob2QgaXMgb2Z0ZW4gc2ltcGxlci9mYXN0ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNr
LgotCi0gICAgQG1ldGhvZCBpc0FueQotICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3Bl
cnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0
byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNz
ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGFueSBpdGVtCi0gICovCi0gIGlzQW55OiBm
dW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRoaXMuYW55KGl0ZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBhbnlCeQotICAgIEBw
YXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKLSAgICBAcGFyYW0ge1N0cmlu
Z30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gICAgQHJldHVybiB7
Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9y
IGFueSBpdGVtCi0gICAgQGRlcHJlY2F0ZWQgVXNlIGBpc0FueWAgaW5zdGVhZAotICAqLwotICBh
bnlCeTogRW1iZXIuYWxpYXNNZXRob2QoJ2lzQW55JyksCi0KLSAgLyoqCi0gICAgQG1ldGhvZCBz
b21lUHJvcGVydHkKLSAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0
Ci0gICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2Fp
bnN0LgotICAgIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9u
IHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQotICAgIEBkZXByZWNhdGVkIFVzZSBgaXNBbnlg
IGluc3RlYWQKLSAgKi8KLSAgc29tZVByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnaXNBbnkn
KSwKLQotICAvKioKLSAgICBUaGlzIHdpbGwgY29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVt
ZXJhdG9yIGludG8gYSBzaW5nbGUgdmFsdWUuIEl0Ci0gICAgaXMgYSB1c2VmdWwgd2F5IHRvIGNv
bGxlY3QgYSBzdW1tYXJ5IHZhbHVlIGZyb20gYW4gZW51bWVyYXRpb24uIFRoaXMKLSAgICBjb3Jy
ZXNwb25kcyB0byB0aGUgYHJlZHVjZSgpYCBtZXRob2QgZGVmaW5lZCBpbiBKYXZhU2NyaXB0IDEu
OC4KLQotICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhl
IGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAotICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbihwcmV2aW91c1ZhbHVlLCBpdGVtLCBp
bmRleCwgZW51bWVyYWJsZSk7Ci0gICAgYGBgCi0KLSAgICAtIGBwcmV2aW91c1ZhbHVlYCBpcyB0
aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCB0byB0aGUgaXRlcmF0b3IuCi0gICAg
LSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGlu
ZGV4YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgotICAgIC0gYGVudW1l
cmFibGVgIGlzIHRoZSBlbnVtZXJhYmxlIG9iamVjdCBpdHNlbGYuCi0KLSAgICBSZXR1cm4gdGhl
IG5ldyBjdW11bGF0aXZlIHZhbHVlLgotCi0gICAgSW4gYWRkaXRpb24gdG8gdGhlIGNhbGxiYWNr
IHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBpbml0aWFsVmFsdWVgLiBBbiBlcnJvcgotICAgIHdpbGwg
YmUgcmFpc2VkIGlmIHlvdSBkbyBub3QgcGFzcyBhbiBpbml0aWFsIHZhbHVlIGFuZCB0aGUgZW51
bWVyYXRvciBpcwotICAgIGVtcHR5LgotCi0gICAgTm90ZSB0aGF0IHVubGlrZSB0aGUgb3RoZXIg
bWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgYWxsb3cgeW91IHRvCi0gICAgcGFzcyBhIHRh
cmdldCBvYmplY3QgdG8gc2V0IGFzIHRoaXMgZm9yIHRoZSBjYWxsYmFjay4gSXQncyBwYXJ0IG9m
IHRoZQotICAgIHNwZWMuIFNvcnJ5LgotCi0gICAgQG1ldGhvZCByZWR1Y2UKLSAgICBAcGFyYW0g
e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSB7
T2JqZWN0fSBpbml0aWFsVmFsdWUgSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHJlZHVjZQotICAgIEBw
YXJhbSB7U3RyaW5nfSByZWR1Y2VyUHJvcGVydHkgaW50ZXJuYWwgdXNlIG9ubHkuCi0gICAgQHJl
dHVybiB7T2JqZWN0fSBUaGUgcmVkdWNlZCB2YWx1ZS4KLSAgKi8KLSAgcmVkdWNlOiBmdW5jdGlv
bihjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCByZWR1Y2VyUHJvcGVydHkpIHsKLSAgICBpZiAodHlw
ZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoKTsgfQot
Ci0gICAgdmFyIHJldCA9IGluaXRpYWxWYWx1ZTsKLQotICAgIHRoaXMuZm9yRWFjaChmdW5jdGlv
bihpdGVtLCBpKSB7Ci0gICAgICByZXQgPSBjYWxsYmFjay5jYWxsKG51bGwsIHJldCwgaXRlbSwg
aSwgdGhpcywgcmVkdWNlclByb3BlcnR5KTsKLSAgICB9LCB0aGlzKTsKLQotICAgIHJldHVybiBy
ZXQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSW52b2tlcyB0aGUgbmFtZWQgbWV0aG9kIG9uIGV2ZXJ5
IG9iamVjdCBpbiB0aGUgcmVjZWl2ZXIgdGhhdAotICAgIGltcGxlbWVudHMgaXQuIFRoaXMgbWV0
aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpbgotICAgIFByb3RvdHlwZSAx
LjYuCi0KLSAgICBAbWV0aG9kIGludm9rZQotICAgIEBwYXJhbSB7U3RyaW5nfSBtZXRob2ROYW1l
IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICBAcGFyYW0ge09iamVjdC4uLn0gYXJncyBvcHRp
b25hbCBhcmd1bWVudHMgdG8gcGFzcyBhcyB3ZWxsLgotICAgIEByZXR1cm4ge0FycmF5fSByZXR1
cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZva2UuCi0gICovCi0gIGludm9rZTogZnVuY3Rpb24o
bWV0aG9kTmFtZSkgewotICAgIHZhciBhcmdzLCByZXQgPSBFbWJlci5BKCk7Ci0gICAgaWYgKGFy
Z3VtZW50cy5sZW5ndGg+MSkgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0g
ICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHgsIGlkeCkgewotICAgICAgdmFyIG1ldGhvZCA9IHgg
JiYgeFttZXRob2ROYW1lXTsKLSAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgbWV0aG9k
KSB7Ci0gICAgICAgIHJldFtpZHhdID0gYXJncyA/IG1ldGhvZC5hcHBseSh4LCBhcmdzKSA6IG1l
dGhvZC5jYWxsKHgpOwotICAgICAgfQotICAgIH0sIHRoaXMpOwotCi0gICAgcmV0dXJuIHJldDsK
LSAgfSwKLQotICAvKioKLSAgICBTaW1wbHkgY29udmVydHMgdGhlIGVudW1lcmFibGUgaW50byBh
IGdlbnVpbmUgYXJyYXkuIFRoZSBvcmRlciBpcyBub3QKLSAgICBndWFyYW50ZWVkLiBDb3JyZXNw
b25kcyB0byB0aGUgbWV0aG9kIGltcGxlbWVudGVkIGJ5IFByb3RvdHlwZS4KLQotICAgIEBtZXRo
b2QgdG9BcnJheQotICAgIEByZXR1cm4ge0FycmF5fSB0aGUgZW51bWVyYWJsZSBhcyBhbiBhcnJh
eS4KLSAgKi8KLSAgdG9BcnJheTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJldCA9IEVtYmVyLkEo
KTsKLSAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24obywgaWR4KSB7IHJldFtpZHhdID0gbzsgfSk7
Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIGNvcHkgb2Yg
dGhlIGFycmF5IHdpdGggYWxsIG51bGwgYW5kIHVuZGVmaW5lZCBlbGVtZW50cyByZW1vdmVkLgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCBudWxsLCAiYyIsIHVuZGVm
aW5lZF07Ci0gICAgYXJyLmNvbXBhY3QoKTsgIC8vIFsiYSIsICJjIl0KLSAgICBgYGAKLQotICAg
IEBtZXRob2QgY29tcGFjdAotICAgIEByZXR1cm4ge0FycmF5fSB0aGUgYXJyYXkgd2l0aG91dCBu
dWxsIGFuZCB1bmRlZmluZWQgZWxlbWVudHMuCi0gICovCi0gIGNvbXBhY3Q6IGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUg
IT0gbnVsbDsgfSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxl
IHRoYXQgZXhjbHVkZXMgdGhlIHBhc3NlZCB2YWx1ZS4gVGhlIGRlZmF1bHQKLSAgICBpbXBsZW1l
bnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJlZ2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUg
dW5sZXNzCi0gICAgdGhlIHJlY2VpdmVyIGRvZXMgbm90IGNvbnRhaW4gdGhlIHZhbHVlLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJhIiwgImMiXTsKLSAg
ICBhcnIud2l0aG91dCgiYSIpOyAgLy8gWyJiIiwgImMiXQotICAgIGBgYAotCi0gICAgQG1ldGhv
ZCB3aXRob3V0Ci0gICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCi0gICAgQHJldHVybiB7RW1iZXIu
RW51bWVyYWJsZX0KLSAgKi8KLSAgd2l0aG91dDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBpZiAo
IXRoaXMuY29udGFpbnModmFsdWUpKSByZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotICAg
IHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKLSAg
ICAgIGlmIChrICE9PSB2YWx1ZSkgcmV0W3JldC5sZW5ndGhdID0gazsKLSAgICB9KSA7Ci0gICAg
cmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyBhIG5ldyBlbnVtZXJhYmxl
IHRoYXQgY29udGFpbnMgb25seSB1bmlxdWUgdmFsdWVzLiBUaGUgZGVmYXVsdAotICAgIGltcGxl
bWVudGF0aW9uIHJldHVybnMgYW4gYXJyYXkgcmVnYXJkbGVzcyBvZiB0aGUgcmVjZWl2ZXIgdHlw
ZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgYXJyID0gWyJhIiwgImEiLCAiYiIsICJi
Il07Ci0gICAgYXJyLnVuaXEoKTsgIC8vIFsiYSIsICJiIl0KLSAgICBgYGAKLQotICAgIEBtZXRo
b2QgdW5pcQotICAgIEByZXR1cm4ge0VtYmVyLkVudW1lcmFibGV9Ci0gICovCi0gIHVuaXE6IGZ1
bmN0aW9uKCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdGhpcy5mb3JFYWNoKGZ1
bmN0aW9uKGspIHsKLSAgICAgIGlmIChhX2luZGV4T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsK
LSAgICB9KTsKLSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVy
dHkgd2lsbCB0cmlnZ2VyIGFueXRpbWUgdGhlIGVudW1lcmFibGUncyBjb250ZW50IGNoYW5nZXMu
Ci0gICAgWW91IGNhbiBvYnNlcnZlIHRoaXMgcHJvcGVydHkgdG8gYmUgbm90aWZpZWQgb2YgY2hh
bmdlcyB0byB0aGUgZW51bWVyYWJsZXMKLSAgICBjb250ZW50LgotCi0gICAgRm9yIHBsYWluIGVu
dW1lcmFibGVzLCB0aGlzIHByb3BlcnR5IGlzIHJlYWQgb25seS4gYEVtYmVyLkFycmF5YCBvdmVy
cmlkZXMKLSAgICB0aGlzIG1ldGhvZC4KLQotICAgIEBwcm9wZXJ0eSBbXQotICAgIEB0eXBlIEVt
YmVyLkFycmF5Ci0gICAgQHJldHVybiB0aGlzCi0gICovCi0gICdbXSc6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfSksCi0KLSAgLy8g
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
LgotICAvLyBFTlVNRVJBQkxFIE9CU0VSVkVSUwotICAvLwotCi0gIC8qKgotICAgIFJlZ2lzdGVy
cyBhbiBlbnVtZXJhYmxlIG9ic2VydmVyLiBNdXN0IGltcGxlbWVudCBgRW1iZXIuRW51bWVyYWJs
ZU9ic2VydmVyYAotICAgIG1peGluLgotCi0gICAgQG1ldGhvZCBhZGRFbnVtZXJhYmxlT2JzZXJ2
ZXIKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0Ci0gICAgQHBhcmFtIHtIYXNofSBbb3B0c10K
LSAgICBAcmV0dXJuIHRoaXMKLSAgKi8KLSAgYWRkRW51bWVyYWJsZU9ic2VydmVyOiBmdW5jdGlv
bih0YXJnZXQsIG9wdHMpIHsKLSAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2ls
bENoYW5nZSkgfHwgJ2VudW1lcmFibGVXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlICA9
IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnZW51bWVyYWJsZURpZENoYW5nZSc7Ci0KLSAg
ICB2YXIgaGFzT2JzZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzJyk7
Ci0gICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAn
aGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdA
ZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLmFkZExp
c3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0g
ICAgaWYgKCFoYXNPYnNlcnZlcnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNF
bnVtZXJhYmxlT2JzZXJ2ZXJzJyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlcyBhIHJlZ2lzdGVyZWQgZW51bWVyYWJsZSBvYnNlcnZlci4KLQotICAgIEBtZXRo
b2QgcmVtb3ZlRW51bWVyYWJsZU9ic2VydmVyCi0gICAgQHBhcmFtIHtPYmplY3R9IHRhcmdldAot
ICAgIEBwYXJhbSB7SGFzaH0gW29wdHNdCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0gIHJlbW92
ZUVudW1lcmFibGVPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7Ci0gICAgdmFyIHdp
bGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdlbnVtZXJhYmxlV2lsbENo
YW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5nZSkgfHwg
J2VudW1lcmFibGVEaWRDaGFuZ2UnOwotCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlz
LCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVy
LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwotICAg
IEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJsZTpiZWZvcmUnLCB0YXJnZXQs
IHdpbGxDaGFuZ2UpOwotICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJs
ZTpjaGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7Ci0gICAgaWYgKGhhc09ic2VydmVycykgRW1i
ZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMnKTsKLSAg
ICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIg
dGhlIGFycmF5IGN1cnJlbnRseSBoYXMgb2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAgICBv
biB0aGUgYXJyYXkuCi0KLSAgICBAcHJvcGVydHkgaGFzRW51bWVyYWJsZU9ic2VydmVycwotICAg
IEB0eXBlIEJvb2xlYW4KLSAgKi8KLSAgaGFzRW51bWVyYWJsZU9ic2VydmVyczogRW1iZXIuY29t
cHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAn
QGVudW1lcmFibGU6Y2hhbmdlJykgfHwgRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsICdAZW51bWVy
YWJsZTpiZWZvcmUnKTsKLSAgfSksCi0KLQotICAvKioKLSAgICBJbnZva2UgdGhpcyBtZXRob2Qg
anVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZW51bWVyYWJsZSB3aWxsCi0gICAgY2hh
bmdlLiBZb3UgY2FuIGVpdGhlciBvbWl0IHRoZSBwYXJhbWV0ZXJzIGNvbXBsZXRlbHkgb3IgcGFz
cyB0aGUgb2JqZWN0cwotICAgIHRvIGJlIHJlbW92ZWQgb3IgYWRkZWQgaWYgYXZhaWxhYmxlIG9y
IGp1c3QgYSBjb3VudC4KLQotICAgIEBtZXRob2QgZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdl
Ci0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVy
YWJsZSBvZiB0aGUgb2JqZWN0cyB0bwotICAgICAgYmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9m
IGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJl
cn0gYWRkaW5nIEFuIGVudW1lcmFibGUgb2YgdGhlIG9iamVjdHMgdG8gYmUKLSAgICAgIGFkZGVk
IG9yIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgYWRkZWQuCi0gICAgQGNoYWluYWJsZQotICAq
LwotICBlbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBhZGRp
bmcpIHsKLQotICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVsdGE7Ci0KLSAgICBpZiAo
J251bWJlcicgPT09IHR5cGVvZiByZW1vdmluZykgcmVtb3ZlQ250ID0gcmVtb3Zpbmc7Ci0gICAg
ZWxzZSBpZiAocmVtb3ZpbmcpIHJlbW92ZUNudCA9IGdldChyZW1vdmluZywgJ2xlbmd0aCcpOwot
ICAgIGVsc2UgcmVtb3ZlQ250ID0gcmVtb3ZpbmcgPSAtMTsKLQotICAgIGlmICgnbnVtYmVyJyA9
PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRkaW5nOwotICAgIGVsc2UgaWYgKGFkZGluZykg
YWRkQ250ID0gZ2V0KGFkZGluZywnbGVuZ3RoJyk7Ci0gICAgZWxzZSBhZGRDbnQgPSBhZGRpbmcg
PSAtMTsKLQotICAgIGhhc0RlbHRhID0gYWRkQ250PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250
LXJlbW92ZUNudCE9PTA7Ci0KLSAgICBpZiAocmVtb3ZpbmcgPT09IC0xKSByZW1vdmluZyA9IG51
bGw7Ci0gICAgaWYgKGFkZGluZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOwotCi0gICAgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdbXScpOwotICAgIGlmIChoYXNEZWx0YSkgRW1i
ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsZW5ndGgnKTsKLSAgICBFbWJlci5zZW5kRXZl
bnQodGhpcywgJ0BlbnVtZXJhYmxlOmJlZm9yZScsIFt0aGlzLCByZW1vdmluZywgYWRkaW5nXSk7
Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBJbnZva2UgdGhpcyBtZXRo
b2Qgd2hlbiB0aGUgY29udGVudHMgb2YgeW91ciBlbnVtZXJhYmxlIGhhcyBjaGFuZ2VkLgotICAg
IFRoaXMgd2lsbCBub3RpZnkgYW55IG9ic2VydmVycyB3YXRjaGluZyBmb3IgY29udGVudCBjaGFu
Z2VzLiBJZiB5b3VyIGFyZQotICAgIGltcGxlbWVudGluZyBhbiBvcmRlcmVkIGVudW1lcmFibGUg
KHN1Y2ggYXMgYW4gYXJyYXkpLCBhbHNvIHBhc3MgdGhlCi0gICAgc3RhcnQgYW5kIGVuZCB2YWx1
ZXMgd2hlcmUgdGhlIGNvbnRlbnQgY2hhbmdlZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvCi0g
ICAgbm90aWZ5IHJhbmdlIG9ic2VydmVycy4KLQotICAgIEBtZXRob2QgZW51bWVyYWJsZUNvbnRl
bnREaWRDaGFuZ2UKLSAgICBAcGFyYW0ge051bWJlcn0gW3N0YXJ0XSBvcHRpb25hbCBzdGFydCBv
ZmZzZXQgZm9yIHRoZSBjb250ZW50IGNoYW5nZS4KLSAgICAgIEZvciB1bm9yZGVyZWQgZW51bWVy
YWJsZXMsIHlvdSBzaG91bGQgYWx3YXlzIHBhc3MgLTEuCi0gICAgQHBhcmFtIHtFbWJlci5FbnVt
ZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVyYWJsZSBvZiB0aGUgb2JqZWN0cyB0bwot
ICAgICAgYmUgcmVtb3ZlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHJlbW92ZWQuCi0g
ICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfE51bWJlcn0gYWRkaW5nICBBbiBlbnVtZXJhYmxl
IG9mIHRoZSBvYmplY3RzIHRvCi0gICAgICBiZSBhZGRlZCBvciB0aGUgbnVtYmVyIG9mIGl0ZW1z
IHRvIGJlIGFkZGVkLgotICAgIEBjaGFpbmFibGUKLSAgKi8KLSAgZW51bWVyYWJsZUNvbnRlbnRE
aWRDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBhZGRpbmcpIHsKLSAgICB2YXIgcmVtb3ZlQ250
LCBhZGRDbnQsIGhhc0RlbHRhOwotCi0gICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgcmVtb3Zp
bmcpIHJlbW92ZUNudCA9IHJlbW92aW5nOwotICAgIGVsc2UgaWYgKHJlbW92aW5nKSByZW1vdmVD
bnQgPSBnZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKLSAgICBlbHNlIHJlbW92ZUNudCA9IHJlbW92
aW5nID0gLTE7Ci0KLSAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBhZGRpbmcpIGFkZENudCA9
IGFkZGluZzsKLSAgICBlbHNlIGlmIChhZGRpbmcpIGFkZENudCA9IGdldChhZGRpbmcsICdsZW5n
dGgnKTsKLSAgICBlbHNlIGFkZENudCA9IGFkZGluZyA9IC0xOwotCi0gICAgaGFzRGVsdGEgPSBh
ZGRDbnQ8MCB8fCByZW1vdmVDbnQ8MCB8fCBhZGRDbnQtcmVtb3ZlQ250IT09MDsKLQotICAgIGlm
IChyZW1vdmluZyA9PT0gLTEpIHJlbW92aW5nID0gbnVsbDsKLSAgICBpZiAoYWRkaW5nICAgPT09
IC0xKSBhZGRpbmcgICA9IG51bGw7Ci0KLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BlbnVt
ZXJhYmxlOmNoYW5nZScsIFt0aGlzLCByZW1vdmluZywgYWRkaW5nXSk7Ci0gICAgaWYgKGhhc0Rl
bHRhKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgRW1iZXIu
cHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ1tdJyk7Ci0KLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQ29udmVydHMgdGhlIGVudW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQg
c29ydHMgYnkgdGhlIGtleXMKLSAgICBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50LgotCi0gICAg
WW91IG1heSBwcm92aWRlIG11bHRpcGxlIGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxlIHBy
b3BlcnRpZXMuCi0KLSAgICBAbWV0aG9kIHNvcnRCeQotICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9w
ZXJ0eSBuYW1lKHMpIHRvIHNvcnQgb24KLSAgICBAcmV0dXJuIHtBcnJheX0gVGhlIHNvcnRlZCBh
cnJheS4KLSAgICAqLwotICBzb3J0Qnk6IGZ1bmN0aW9uKCkgewotICAgIHZhciBzb3J0S2V5cyA9
IGFyZ3VtZW50czsKLSAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuc29ydChmdW5jdGlvbihhLCBi
KXsKLSAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzb3J0S2V5cy5sZW5ndGg7IGkrKykgewotICAg
ICAgICB2YXIga2V5ID0gc29ydEtleXNbaV0sCi0gICAgICAgIHByb3BBID0gZ2V0KGEsIGtleSks
Ci0gICAgICAgIHByb3BCID0gZ2V0KGIsIGtleSk7Ci0gICAgICAgIC8vIHJldHVybiAxIG9yIC0x
IGVsc2UgY29udGludWUgdG8gdGhlIG5leHQgc29ydEtleQotICAgICAgICB2YXIgY29tcGFyZVZh
bHVlID0gRW1iZXIuY29tcGFyZShwcm9wQSwgcHJvcEIpOwotICAgICAgICBpZiAoY29tcGFyZVZh
bHVlKSB7IHJldHVybiBjb21wYXJlVmFsdWU7IH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwot
ICAgIH0pOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vLyAuLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBIRUxQ
RVJTCi0vLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGlzTm9uZSA9
IEVtYmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwgY2FjaGVGb3Ig
PSBFbWJlci5jYWNoZUZvcjsKLQotLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotLy8gQVJSQVkKLS8vCi0vKioKLSAgVGhpcyBtb2R1
bGUgaW1wbGVtZW50cyBPYnNlcnZlci1mcmllbmRseSBBcnJheS1saWtlIGJlaGF2aW9yLiBUaGlz
IG1peGluIGlzCi0gIHBpY2tlZCB1cCBieSB0aGUgQXJyYXkgY2xhc3MgYXMgd2VsbCBhcyBvdGhl
ciBjb250cm9sbGVycywgZXRjLiB0aGF0IHdhbnQgdG8KLSAgYXBwZWFyIHRvIGJlIGFycmF5cy4K
LQotICBVbmxpa2UgYEVtYmVyLkVudW1lcmFibGUsYCB0aGlzIG1peGluIGRlZmluZXMgbWV0aG9k
cyBzcGVjaWZpY2FsbHkgZm9yCi0gIGNvbGxlY3Rpb25zIHRoYXQgcHJvdmlkZSBpbmRleC1vcmRl
cmVkIGFjY2VzcyB0byB0aGVpciBjb250ZW50cy4gV2hlbiB5b3UKLSAgYXJlIGRlc2lnbmluZyBj
b2RlIHRoYXQgbmVlZHMgdG8gYWNjZXB0IGFueSBraW5kIG9mIEFycmF5LWxpa2Ugb2JqZWN0LCB5
b3UKLSAgc2hvdWxkIHVzZSB0aGVzZSBtZXRob2RzIGluc3RlYWQgb2YgQXJyYXkgcHJpbWl0aXZl
cyBiZWNhdXNlIHRoZXNlIHdpbGwKLSAgcHJvcGVybHkgbm90aWZ5IG9ic2VydmVycyBvZiBjaGFu
Z2VzIHRvIHRoZSBhcnJheS4KLQotICBBbHRob3VnaCB0aGVzZSBtZXRob2RzIGFyZSBlZmZpY2ll
bnQsIHRoZXkgZG8gYWRkIGEgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gdG8KLSAgeW91ciBhcHBsaWNh
dGlvbiBzbyBpdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgdGhlbSBvbmx5IHdoZW4geW91IG5lZWQg
dGhlCi0gIGZsZXhpYmlsaXR5IG9mIHVzaW5nIGJvdGggdHJ1ZSBKYXZhU2NyaXB0IGFycmF5cyBh
bmQgInZpcnR1YWwiIGFycmF5cyBzdWNoCi0gIGFzIGNvbnRyb2xsZXJzIGFuZCBjb2xsZWN0aW9u
cy4KLQotICBZb3UgY2FuIHVzZSB0aGUgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRv
IGFjY2VzcyBhbmQgbW9kaWZ5IGFycmF5Ci0gIGNvbnRlbnRzIGluIGEgS1ZPLWZyaWVuZGx5IHdh
eS4gWW91IGNhbiBhbHNvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotICBtZW1iZXJzaGlwIG9m
IGFuIGFycmF5IGNoYW5nZXMgYnkgY2hhbmdpbmcgdGhlIHN5bnRheCBvZiB0aGUgcHJvcGVydHkg
dG8KLSAgYC5vYnNlcnZlcygnKm15UHJvcGVydHkuW10nKWAuCi0KLSAgVG8gc3VwcG9ydCBgRW1i
ZXIuQXJyYXlgIGluIHlvdXIgb3duIGNsYXNzLCB5b3UgbXVzdCBvdmVycmlkZSB0d28KLSAgcHJp
bWl0aXZlcyB0byB1c2UgaXQ6IGByZXBsYWNlKClgIGFuZCBgb2JqZWN0QXQoKWAuCi0KLSAgTm90
ZSB0aGF0IHRoZSBFbWJlci5BcnJheSBtaXhpbiBhbHNvIGluY29ycG9yYXRlcyB0aGUgYEVtYmVy
LkVudW1lcmFibGVgCi0gIG1peGluLiBBbGwgYEVtYmVyLkFycmF5YC1saWtlIG9iamVjdHMgYXJl
IGFsc28gZW51bWVyYWJsZS4KLQotICBAY2xhc3MgQXJyYXkKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0gIEBzaW5jZSBFbWJlciAwLjkuMAotKi8KLUVtYmVy
LkFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkVudW1lcmFibGUsIHsKLQotICAvKioK
LSAgICBZb3VyIGFycmF5IG11c3Qgc3VwcG9ydCB0aGUgYGxlbmd0aGAgcHJvcGVydHkuIFlvdXIg
cmVwbGFjZSBtZXRob2RzIHNob3VsZAotICAgIHNldCB0aGlzIHByb3BlcnR5IHdoZW5ldmVyIGl0
IGNoYW5nZXMuCi0KLSAgICBAcHJvcGVydHkge051bWJlcn0gbGVuZ3RoCi0gICovCi0gIGxlbmd0
aDogRW1iZXIucmVxdWlyZWQoKSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBvYmplY3QgYXQg
dGhlIGdpdmVuIGBpbmRleGAuIElmIHRoZSBnaXZlbiBgaW5kZXhgIGlzIG5lZ2F0aXZlCi0gICAg
b3IgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBhcnJheSBsZW5ndGgsIHJldHVybnMgYHVu
ZGVmaW5lZGAuCi0KLSAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBp
bXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIElmIHlvdXIgb2JqZWN0IHN1
cHBvcnRzIHJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGFycmF5IGl0ZW0gdXNpbmcgYGdldCgp
YAotICAgIChpLmUuIGBteUFycmF5LmdldCgwKWApLCB0aGVuIHlvdSBkbyBub3QgbmVlZCB0byBp
bXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICB5b3Vyc2VsZi4KLQotICAgIGBgYGphdmFzY3JpcHQK
LSAgICB2YXIgYXJyID0gWydhJywgJ2InLCAnYycsICdkJ107Ci0gICAgYXJyLm9iamVjdEF0KDAp
OyAgIC8vICJhIgotICAgIGFyci5vYmplY3RBdCgzKTsgICAvLyAiZCIKLSAgICBhcnIub2JqZWN0
QXQoLTEpOyAgLy8gdW5kZWZpbmVkCi0gICAgYXJyLm9iamVjdEF0KDQpOyAgIC8vIHVuZGVmaW5l
ZAotICAgIGFyci5vYmplY3RBdCg1KTsgICAvLyB1bmRlZmluZWQKLSAgICBgYGAKLQotICAgIEBt
ZXRob2Qgb2JqZWN0QXQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCBvZiB0aGUg
aXRlbSB0byByZXR1cm4uCi0gICAgQHJldHVybiB7Kn0gaXRlbSBhdCBpbmRleCBvciB1bmRlZmlu
ZWQKLSAgKi8KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIGlmICgoaWR4IDwgMCkg
fHwgKGlkeD49Z2V0KHRoaXMsICdsZW5ndGgnKSkpIHJldHVybiB1bmRlZmluZWQgOwotICAgIHJl
dHVybiBnZXQodGhpcywgaWR4KTsKLSAgfSwKLQotICAvKioKLSAgICBUaGlzIHJldHVybnMgdGhl
IG9iamVjdHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzLCB1c2luZyBgb2JqZWN0QXRgLgotCi0g
ICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107Ci0g
ICAgYXJyLm9iamVjdHNBdChbMCwgMSwgMl0pOyAgLy8gWyJhIiwgImIiLCAiYyJdCi0gICAgYXJy
Lm9iamVjdHNBdChbMiwgMywgNF0pOyAgLy8gWyJjIiwgImQiLCB1bmRlZmluZWRdCi0gICAgYGBg
Ci0KLSAgICBAbWV0aG9kIG9iamVjdHNBdAotICAgIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgQW4g
YXJyYXkgb2YgaW5kZXhlcyBvZiBpdGVtcyB0byByZXR1cm4uCi0gICAgQHJldHVybiB7QXJyYXl9
Ci0gICAqLwotICBvYmplY3RzQXQ6IGZ1bmN0aW9uKGluZGV4ZXMpIHsKLSAgICB2YXIgc2VsZiA9
IHRoaXM7Ci0gICAgcmV0dXJuIG1hcChpbmRleGVzLCBmdW5jdGlvbihpZHgpIHsgcmV0dXJuIHNl
bGYub2JqZWN0QXQoaWR4KTsgfSk7Ci0gIH0sCi0KLSAgLy8gb3ZlcnJpZGVzIEVtYmVyLkVudW1l
cmFibGUgdmVyc2lvbgotICBuZXh0T2JqZWN0OiBmdW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4g
dGhpcy5vYmplY3RBdChpZHgpOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgaXMgdGhlIGhhbmRs
ZXIgZm9yIHRoZSBzcGVjaWFsIGFycmF5IGNvbnRlbnQgcHJvcGVydHkuIElmIHlvdSBnZXQKLSAg
ICB0aGlzIHByb3BlcnR5LCBpdCB3aWxsIHJldHVybiB0aGlzLiBJZiB5b3Ugc2V0IHRoaXMgcHJv
cGVydHkgaXQgYSBuZXcKLSAgICBhcnJheSwgaXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGNv
bnRlbnQuCi0KLSAgICBUaGlzIHByb3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0
eSBkZWZpbmVkIGluIGBFbWJlci5FbnVtZXJhYmxlYC4KLQotICAgIEBwcm9wZXJ0eSBbXQotICAg
IEByZXR1cm4gdGhpcwotICAqLwotICAnW10nOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXks
IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMucmVwbGFjZSgwLCBn
ZXQodGhpcywgJ2xlbmd0aCcpLCB2YWx1ZSkgOwotICAgIHJldHVybiB0aGlzIDsKLSAgfSksCi0K
LSAgZmlyc3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0
aGlzLm9iamVjdEF0KDApOwotICB9KSwKLQotICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm
dW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5vYmplY3RBdChnZXQodGhpcywgJ2xlbmd0aCcp
LTEpOwotICB9KSwKLQotICAvLyBvcHRpbWl6ZWQgdmVyc2lvbiBmcm9tIEVudW1lcmFibGUKLSAg
Y29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewotICAgIHJldHVybiB0aGlzLmluZGV4T2Yob2JqKSA+
PSAwOwotICB9LAotCi0gIC8vIEFkZCBhbnkgZXh0cmEgbWV0aG9kcyB0byBFbWJlci5BcnJheSB0
aGF0IGFyZSBuYXRpdmUgdG8gdGhlIGJ1aWx0LWluIEFycmF5LgotICAvKioKLSAgICBSZXR1cm5z
IGEgbmV3IGFycmF5IHRoYXQgaXMgYSBzbGljZSBvZiB0aGUgcmVjZWl2ZXIuIFRoaXMgaW1wbGVt
ZW50YXRpb24KLSAgICB1c2VzIHRoZSBvYnNlcnZhYmxlIGFycmF5IG1ldGhvZHMgdG8gcmV0cmll
dmUgdGhlIG9iamVjdHMgZm9yIHRoZSBuZXcKLSAgICBzbGljZS4KLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICB2YXIgYXJyID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddOwotICAgIGFyci5zbGlj
ZSgwKTsgICAgICAgLy8gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddCi0gICAgYXJyLnNsaWNlKDAs
IDIpOyAgICAvLyBbJ3JlZCcsICdncmVlbiddCi0gICAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBb
J2dyZWVuJywgJ2JsdWUnXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzbGljZQotICAgIEBwYXJh
bSB7SW50ZWdlcn0gYmVnaW5JbmRleCAoT3B0aW9uYWwpIGluZGV4IHRvIGJlZ2luIHNsaWNpbmcg
ZnJvbS4KLSAgICBAcGFyYW0ge0ludGVnZXJ9IGVuZEluZGV4IChPcHRpb25hbCkgaW5kZXggdG8g
ZW5kIHRoZSBzbGljZSBhdC4KLSAgICBAcmV0dXJuIHtBcnJheX0gTmV3IGFycmF5IHdpdGggc3Bl
Y2lmaWVkIHNsaWNlCi0gICovCi0gIHNsaWNlOiBmdW5jdGlvbihiZWdpbkluZGV4LCBlbmRJbmRl
eCkgewotICAgIHZhciByZXQgPSBFbWJlci5BKCk7Ci0gICAgdmFyIGxlbmd0aCA9IGdldCh0aGlz
LCAnbGVuZ3RoJykgOwotICAgIGlmIChpc05vbmUoYmVnaW5JbmRleCkpIGJlZ2luSW5kZXggPSAw
IDsKLSAgICBpZiAoaXNOb25lKGVuZEluZGV4KSB8fCAoZW5kSW5kZXggPiBsZW5ndGgpKSBlbmRJ
bmRleCA9IGxlbmd0aCA7Ci0KLSAgICBpZiAoYmVnaW5JbmRleCA8IDApIGJlZ2luSW5kZXggPSBs
ZW5ndGggKyBiZWdpbkluZGV4OwotICAgIGlmIChlbmRJbmRleCA8IDApIGVuZEluZGV4ID0gbGVu
Z3RoICsgZW5kSW5kZXg7Ci0KLSAgICB3aGlsZShiZWdpbkluZGV4IDwgZW5kSW5kZXgpIHsKLSAg
ICAgIHJldFtyZXQubGVuZ3RoXSA9IHRoaXMub2JqZWN0QXQoYmVnaW5JbmRleCsrKSA7Ci0gICAg
fQotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMgdGhlIGluZGV4
IG9mIHRoZSBnaXZlbiBvYmplY3QncyBmaXJzdCBvY2N1cnJlbmNlLgotICAgIElmIG5vIGBzdGFy
dEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIHRvCi0gICAgc2Vh
cmNoIGlzIDAuIElmIGl0J3MgbmVnYXRpdmUsIHdpbGwgY291bnQgYmFja3dhcmQgZnJvbQotICAg
IHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJjIiwgImQiLCAi
YSJdOwotICAgIGFyci5pbmRleE9mKCJhIik7ICAgICAgIC8vICAwCi0gICAgYXJyLmluZGV4T2Yo
InoiKTsgICAgICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDIpOyAgICAvLyAgNAotICAg
IGFyci5pbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0Ci0gICAgYXJyLmluZGV4T2YoImIiLCAzKTsg
ICAgLy8gLTEKLSAgICBhcnIuaW5kZXhPZigiYSIsIDEwMCk7ICAvLyAtMQotICAgIGBgYAotCi0g
ICAgQG1ldGhvZCBpbmRleE9mCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0
byBzZWFyY2ggZm9yCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRp
bmcgbG9jYXRpb24gdG8gc2VhcmNoLCBkZWZhdWx0IDAKLSAgICBAcmV0dXJuIHtOdW1iZXJ9IGlu
ZGV4IG9yIC0xIGlmIG5vdCBmb3VuZAotICAqLwotICBpbmRleE9mOiBmdW5jdGlvbihvYmplY3Qs
IHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotCi0g
ICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgc3RhcnRBdCA9IDA7Ci0gICAgaWYgKHN0YXJ0
QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKLQotICAgIGZvcihpZHg9c3RhcnRBdDtpZHg8bGVuO2lk
eCsrKSB7Ci0gICAgICBpZiAodGhpcy5vYmplY3RBdChpZHgpID09PSBvYmplY3QpIHJldHVybiBp
ZHggOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0
aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCdzIGxhc3Qgb2NjdXJyZW5jZS4KLSAgICBJZiBu
byBgc3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBzZWFyY2ggc3RhcnRzIGZyb20KLSAg
ICB0aGUgbGFzdCBwb3NpdGlvbi4gSWYgaXQncyBuZWdhdGl2ZSwgd2lsbCBjb3VudCBiYWNrd2Fy
ZAotICAgIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIFJldHVybnMgLTEgaWYgbm8gbWF0Y2gg
aXMgZm91bmQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGFyciA9IFsiYSIsICJiIiwg
ImMiLCAiZCIsICJhIl07Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJhIik7ICAgICAgIC8vICA0Ci0g
ICAgYXJyLmxhc3RJbmRleE9mKCJ6Iik7ICAgICAgIC8vIC0xCi0gICAgYXJyLmxhc3RJbmRleE9m
KCJhIiwgMik7ICAgIC8vICAwCi0gICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0
Ci0gICAgYXJyLmxhc3RJbmRleE9mKCJiIiwgMyk7ICAgIC8vICAxCi0gICAgYXJyLmxhc3RJbmRl
eE9mKCJhIiwgMTAwKTsgIC8vICA0Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGxhc3RJbmRleE9m
Ci0gICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yCi0gICAg
QHBhcmFtIHtOdW1iZXJ9IHN0YXJ0QXQgb3B0aW9uYWwgc3RhcnRpbmcgbG9jYXRpb24gdG8gc2Vh
cmNoLCBkZWZhdWx0IDAKLSAgICBAcmV0dXJuIHtOdW1iZXJ9IGluZGV4IG9yIC0xIGlmIG5vdCBm
b3VuZAotICAqLwotICBsYXN0SW5kZXhPZjogZnVuY3Rpb24ob2JqZWN0LCBzdGFydEF0KSB7Ci0g
ICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLQotICAgIGlmIChzdGFydEF0
ID09PSB1bmRlZmluZWQgfHwgc3RhcnRBdCA+PSBsZW4pIHN0YXJ0QXQgPSBsZW4tMTsKLSAgICBp
ZiAoc3RhcnRBdCA8IDApIHN0YXJ0QXQgKz0gbGVuOwotCi0gICAgZm9yKGlkeD1zdGFydEF0O2lk
eD49MDtpZHgtLSkgewotICAgICAgaWYgKHRoaXMub2JqZWN0QXQoaWR4KSA9PT0gb2JqZWN0KSBy
ZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8g
QVJSQVkgT0JTRVJWRVJTCi0gIC8vCi0KLSAgLyoqCi0gICAgQWRkcyBhbiBhcnJheSBvYnNlcnZl
ciB0byB0aGUgcmVjZWl2aW5nIGFycmF5LiBUaGUgYXJyYXkgb2JzZXJ2ZXIgb2JqZWN0Ci0gICAg
bm9ybWFsbHkgbXVzdCBpbXBsZW1lbnQgdHdvIG1ldGhvZHM6Ci0KLSAgICAqIGBhcnJheVdpbGxD
aGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVDb3VudCwgYWRkQ291bnQpYCAtIFRoaXMg
bWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYXJyYXkgaXMgbW9k
aWZpZWQuCi0gICAgKiBgYXJyYXlEaWRDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVD
b3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKLSAgICAgIGNhbGxlZCBqdXN0
IGFmdGVyIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KLQotICAgIEJvdGggY2FsbGJhY2tzIHdpbGwg
YmUgcGFzc2VkIHRoZSBvYnNlcnZlZCBvYmplY3QsIHN0YXJ0aW5nIGluZGV4IG9mIHRoZQotICAg
IGNoYW5nZSBhcyB3ZWxsIGEgYSBjb3VudCBvZiB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQg
YWRkZWQuIFlvdSBjYW4gdXNlCi0gICAgdGhlc2UgY2FsbGJhY2tzIHRvIG9wdGlvbmFsbHkgaW5z
cGVjdCB0aGUgYXJyYXkgZHVyaW5nIHRoZSBjaGFuZ2UsIGNsZWFyCi0gICAgY2FjaGVzLCBvciBk
byBhbnkgb3RoZXIgYm9va2tlZXBpbmcgbmVjZXNzYXJ5LgotCi0gICAgSW4gYWRkaXRpb24gdG8g
cGFzc2luZyBhIHRhcmdldCwgeW91IGNhbiBhbHNvIGluY2x1ZGUgYW4gb3B0aW9ucyBoYXNoCi0g
ICAgd2hpY2ggeW91IGNhbiB1c2UgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IHdp
bGwgYmUgaW52b2tlZCBvbiB0aGUKLSAgICB0YXJnZXQuCi0KLSAgICBAbWV0aG9kIGFkZEFycmF5
T2JzZXJ2ZXIKLSAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSBvYnNlcnZlciBvYmplY3Qu
Ci0gICAgQHBhcmFtIHtIYXNofSBvcHRzIE9wdGlvbmFsIGhhc2ggb2YgY29uZmlndXJhdGlvbiBv
cHRpb25zIGluY2x1ZGluZwotICAgICAgYHdpbGxDaGFuZ2VgIGFuZCBgZGlkQ2hhbmdlYCBvcHRp
b24uCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICovCi0gIGFkZEFycmF5
T2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgewotICAgIHZhciB3aWxsQ2hhbmdlID0g
KG9wdHMgJiYgb3B0cy53aWxsQ2hhbmdlKSB8fCAnYXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAg
ZGlkQ2hhbmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnYXJyYXlEaWRDaGFuZ2Un
OwotCi0gICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMn
KTsKLSAgICBpZiAoIWhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMs
ICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsICdAYXJy
YXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0
aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsKLSAgICBpZiAoIWhhc09i
c2VydmVycykgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJz
Jyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbiBhcnJh
eSBvYnNlcnZlciBmcm9tIHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKLSAg
ICByZWdpc3RlcmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIHdpdGggdGhl
IHNhbWUgb2JqZWN0IHdpbGwKLSAgICBoYXZlIG5vIGVmZmVjdC4KLQotICAgIEBtZXRob2QgcmVt
b3ZlQXJyYXlPYnNlcnZlcgotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCBv
YnNlcnZpbmcgdGhlIGFycmF5LgotICAgIEBwYXJhbSB7SGFzaH0gb3B0cyBPcHRpb25hbCBoYXNo
IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcKLSAgICAgIGB3aWxsQ2hhbmdlYCBh
bmQgYGRpZENoYW5nZWAgb3B0aW9uLgotICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZl
cgotICAqLwotICByZW1vdmVBcnJheU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9wdHMpIHsK
LSAgICB2YXIgd2lsbENoYW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2FycmF5
V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRpZENoYW5n
ZSkgfHwgJ2FycmF5RGlkQ2hhbmdlJzsKLQotICAgIHZhciBoYXNPYnNlcnZlcnMgPSBnZXQodGhp
cywgJ2hhc0FycmF5T2JzZXJ2ZXJzJyk7Ci0gICAgaWYgKGhhc09ic2VydmVycykgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwotICAgIEVtYmVyLnJl
bW92ZUxpc3RlbmVyKHRoaXMsICdAYXJyYXk6YmVmb3JlJywgdGFyZ2V0LCB3aWxsQ2hhbmdlKTsK
LSAgICBFbWJlci5yZW1vdmVMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwg
ZGlkQ2hhbmdlKTsKLSAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5n
ZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQot
ICAvKioKLSAgICBCZWNvbWVzIHRydWUgd2hlbmV2ZXIgdGhlIGFycmF5IGN1cnJlbnRseSBoYXMg
b2JzZXJ2ZXJzIHdhdGNoaW5nIGNoYW5nZXMKLSAgICBvbiB0aGUgYXJyYXkuCi0KLSAgICBAcHJv
cGVydHkgQm9vbGVhbgotICAqLwotICBoYXNBcnJheU9ic2VydmVyczogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGFycmF5
OmNoYW5nZScpIHx8IEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAnQGFycmF5OmJlZm9yZScpOwot
ICB9KSwKLQotICAvKioKLSAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhbiBvYmplY3QgdGhh
dCBzdXBwb3J0cyBgRW1iZXIuQXJyYXlgLCBjYWxsIHRoaXMKLSAgICBtZXRob2QganVzdCBiZWZv
cmUgdGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0byBub3RpZnkgYW55IG9ic2VydmVycyBhbmQK
LSAgICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5n
IGluZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3Vu
dHMgdG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlCi0gICAg
QHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SWR4IFRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgYXJyYXkg
dGhhdCB3aWxsIGNoYW5nZS4KLSAgICBAcGFyYW0ge051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1i
ZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHlvdQotICAgICAgcGFzcyBgbnVs
bGAgYXNzdW1lcyAwCi0gICAgQHBhcmFtIHtOdW1iZXJ9IGFkZEFtdCBUaGUgbnVtYmVyIG9mIGl0
ZW1zIHRoYXQgd2lsbCBiZSBhZGRlZC4gSWYgeW91Ci0gICAgICBwYXNzIGBudWxsYCBhc3N1bWVz
IDAuCi0gICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICovCi0gIGFycmF5Q29u
dGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgewot
Ci0gICAgLy8gaWYgbm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMK
LSAgICBpZiAoc3RhcnRJZHg9PT11bmRlZmluZWQpIHsKLSAgICAgIHN0YXJ0SWR4ID0gMDsKLSAg
ICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocmVt
b3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKLSAgICAgIGlmIChhZGRBbXQgICAg
PT09IHVuZGVmaW5lZCkgYWRkQW10PS0xOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUg
QGVhY2ggcHJveHkgaXMgc2V0IHVwIGlmIGFueW9uZSBpcyBvYnNlcnZpbmcgQGVhY2gKLSAgICBp
ZiAoRW1iZXIuaXNXYXRjaGluZyh0aGlzLCAnQGVhY2gnKSkgeyBnZXQodGhpcywgJ0BlYWNoJyk7
IH0KLQotICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGFycmF5OmJlZm9yZScsIFt0aGlzLCBz
dGFydElkeCwgcmVtb3ZlQW10LCBhZGRBbXRdKTsKLQotICAgIHZhciByZW1vdmluZywgbGltOwot
ICAgIGlmIChzdGFydElkeD49MCAmJiByZW1vdmVBbXQ+PTAgJiYgZ2V0KHRoaXMsICdoYXNFbnVt
ZXJhYmxlT2JzZXJ2ZXJzJykpIHsKLSAgICAgIHJlbW92aW5nID0gW107Ci0gICAgICBsaW0gPSBz
dGFydElkeCtyZW1vdmVBbXQ7Ci0gICAgICBmb3IodmFyIGlkeD1zdGFydElkeDtpZHg8bGltO2lk
eCsrKSByZW1vdmluZy5wdXNoKHRoaXMub2JqZWN0QXQoaWR4KSk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIHJlbW92aW5nID0gcmVtb3ZlQW10OwotICAgIH0KLQotICAgIHRoaXMuZW51bWVyYWJsZUNv
bnRlbnRXaWxsQ2hhbmdlKHJlbW92aW5nLCBhZGRBbXQpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgLyoqCi0gICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRoYXQg
c3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCi0gICAgbWV0aG9kIGp1c3QgYWZ0ZXIg
dGhlIGFycmF5IGNvbnRlbnQgY2hhbmdlcyB0byBub3RpZnkgYW55IG9ic2VydmVycyBhbmQKLSAg
ICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMuIFBhc3MgdGhlIHN0YXJ0aW5nIGlu
ZGV4IG9mIHRoZSBjaGFuZ2UKLSAgICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3VudHMg
dG8gY2hhbmdlLgotCi0gICAgQG1ldGhvZCBhcnJheUNvbnRlbnREaWRDaGFuZ2UKLSAgICBAcGFy
YW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJheSB0aGF0
IGRpZCBjaGFuZ2UuCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZUFtdCBUaGUgbnVtYmVyIG9m
IGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLiBJZiB5b3UKLSAgICAgIHBhc3MgYG51bGxgIGFzc3Vt
ZXMgMAotICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRBbXQgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0
IHdlcmUgYWRkZWQuIElmIHlvdQotICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwLgotICAgIEBy
ZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgotICAqLwotICBhcnJheUNvbnRlbnREaWRDaGFu
Z2U6IGZ1bmN0aW9uKHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdCkgewotCi0gICAgLy8gaWYg
bm8gYXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMKLSAgICBpZiAoc3Rh
cnRJZHg9PT11bmRlZmluZWQpIHsKLSAgICAgIHN0YXJ0SWR4ID0gMDsKLSAgICAgIHJlbW92ZUFt
dCA9IGFkZEFtdCA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocmVtb3ZlQW10ID09PSB1
bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKLSAgICAgIGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5l
ZCkgYWRkQW10PS0xOwotICAgIH0KLQotICAgIHZhciBhZGRpbmcsIGxpbTsKLSAgICBpZiAoc3Rh
cnRJZHg+PTAgJiYgYWRkQW10Pj0wICYmIGdldCh0aGlzLCAnaGFzRW51bWVyYWJsZU9ic2VydmVy
cycpKSB7Ci0gICAgICBhZGRpbmcgPSBbXTsKLSAgICAgIGxpbSA9IHN0YXJ0SWR4K2FkZEFtdDsK
LSAgICAgIGZvcih2YXIgaWR4PXN0YXJ0SWR4O2lkeDxsaW07aWR4KyspIGFkZGluZy5wdXNoKHRo
aXMub2JqZWN0QXQoaWR4KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFkZGluZyA9IGFkZEFtdDsK
LSAgICB9Ci0KLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKHJlbW92ZUFtdCwg
YWRkaW5nKTsKLSAgICBFbWJlci5zZW5kRXZlbnQodGhpcywgJ0BhcnJheTpjaGFuZ2UnLCBbdGhp
cywgc3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10XSk7Ci0KLSAgICB2YXIgbGVuZ3RoICAgICAg
PSBnZXQodGhpcywgJ2xlbmd0aCcpLAotICAgICAgICBjYWNoZWRGaXJzdCA9IGNhY2hlRm9yKHRo
aXMsICdmaXJzdE9iamVjdCcpLAotICAgICAgICBjYWNoZWRMYXN0ICA9IGNhY2hlRm9yKHRoaXMs
ICdsYXN0T2JqZWN0Jyk7Ci0gICAgaWYgKHRoaXMub2JqZWN0QXQoMCkgIT09IGNhY2hlZEZpcnN0
KSB7Ci0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7
Ci0gICAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKLSAg
ICB9Ci0gICAgaWYgKHRoaXMub2JqZWN0QXQobGVuZ3RoLTEpICE9PSBjYWNoZWRMYXN0KSB7Ci0g
ICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICAg
IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBFTlVNRVJBVEVEIFBST1BFUlRJ
RVMKLSAgLy8KLQotICAvKioKLSAgICBSZXR1cm5zIGEgc3BlY2lhbCBvYmplY3QgdGhhdCBjYW4g
YmUgdXNlZCB0byBvYnNlcnZlIGluZGl2aWR1YWwgcHJvcGVydGllcwotICAgIG9uIHRoZSBhcnJh
eS4gSnVzdCBnZXQgYW4gZXF1aXZhbGVudCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCBhbmQgaXQg
d2lsbAotICAgIHJldHVybiBhbiBlbnVtZXJhYmxlIHRoYXQgbWFwcyBhdXRvbWF0aWNhbGx5IHRv
IHRoZSBuYW1lZCBrZXkgb24gdGhlCi0gICAgbWVtYmVyIG9iamVjdHMuCi0KLSAgICBJZiB5b3Ug
bWVyZWx5IHdhbnQgdG8gd2F0Y2ggZm9yIGFueSBpdGVtcyBiZWluZyBhZGRlZCBvciByZW1vdmVk
IHRvIHRoZSBhcnJheSwKLSAgICB1c2UgdGhlIGBbXWAgcHJvcGVydHkgaW5zdGVhZCBvZiBgQGVh
Y2hgLgotCi0gICAgQHByb3BlcnR5IEBlYWNoCi0gICovCi0gICdAZWFjaCc6IEVtYmVyLmNvbXB1
dGVkKGZ1bmN0aW9uKCkgewotICAgIGlmICghdGhpcy5fX2VhY2gpIHRoaXMuX19lYWNoID0gbmV3
IEVtYmVyLkVhY2hQcm94eSh0aGlzKTsKLSAgICByZXR1cm4gdGhpcy5fX2VhY2g7Ci0gIH0pCi0K
LX0pIDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBlX2dldCA9IEVtYmVyLmdl
dCwKLSAgICBzZXQgPSBFbWJlci5zZXQsCi0gICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCi0g
ICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCi0gICAgcHJvcGVydHlXaWxsQ2hhbmdlID0gRW1iZXIu
cHJvcGVydHlXaWxsQ2hhbmdlLAotICAgIHByb3BlcnR5RGlkQ2hhbmdlID0gRW1iZXIucHJvcGVy
dHlEaWRDaGFuZ2UsCi0gICAgYWRkQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5hZGRCZWZvcmVPYnNl
cnZlciwKLSAgICByZW1vdmVCZWZvcmVPYnNlcnZlciA9IEVtYmVyLnJlbW92ZUJlZm9yZU9ic2Vy
dmVyLAotICAgIGFkZE9ic2VydmVyID0gRW1iZXIuYWRkT2JzZXJ2ZXIsCi0gICAgcmVtb3ZlT2Jz
ZXJ2ZXIgPSBFbWJlci5yZW1vdmVPYnNlcnZlciwKLSAgICBDb21wdXRlZFByb3BlcnR5ID0gRW1i
ZXIuQ29tcHV0ZWRQcm9wZXJ0eSwKLSAgICBhX3NsaWNlID0gW10uc2xpY2UsCi0gICAgb19jcmVh
dGUgPSBFbWJlci5jcmVhdGUsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5m
b3JFYWNoLAotICAgIC8vIEhlcmUgd2UgZXhwbGljaXRseSBkb24ndCBhbGxvdyBgQGVhY2guZm9v
YDsgaXQgd291bGQgcmVxdWlyZSBzb21lIHNwZWNpYWwKLSAgICAvLyB0ZXN0aW5nLCBidXQgdGhl
cmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgaXQgc2hvdWxkIGJlIGRpc2FsbG93ZWQuCi0g
ICAgZWFjaFByb3BlcnR5UGF0dGVybiA9IC9eKC4qKVwuQGVhY2hcLiguKikvLAotICAgIGRvdWJs
ZUVhY2hQcm9wZXJ0eVBhdHRlcm4gPSAvKC4qXC5AZWFjaCl7Mix9LywKLSAgICBhcnJheUJyYWNr
ZXRQYXR0ZXJuID0gL1wuXFtcXSQvOwotCi0KLWZ1bmN0aW9uIGdldChvYmosIGtleSkgewotICBp
ZiAoa2V5ID09PSAnQHRoaXMnKSB7Ci0gICAgcmV0dXJuIG9iajsKLSAgfQotCi0gIHJldHVybiBl
X2dldChvYmosIGtleSk7Ci19Ci0KLS8qCi0gIFRyYWNrcyBjaGFuZ2VzIHRvIGRlcGVuZGVudCBh
cnJheXMsIGFzIHdlbGwgYXMgdG8gcHJvcGVydGllcyBvZiBpdGVtcyBpbgotICBkZXBlbmRlbnQg
YXJyYXlzLgotCi0gIEBjbGFzcyBEZXBlbmRlbnRBcnJheXNPYnNlcnZlcgotKi8KLWZ1bmN0aW9u
IERlcGVuZGVudEFycmF5c09ic2VydmVyKGNhbGxiYWNrcywgY3AsIGluc3RhbmNlTWV0YSwgY29u
dGV4dCwgcHJvcGVydHlOYW1lLCBzdWdhck1ldGEpIHsKLSAgLy8gdXNlciBzcGVjaWZpZWQgY2Fs
bGJhY2tzIGZvciBgYWRkZWRJdGVtYCBhbmQgYHJlbW92ZWRJdGVtYAotICB0aGlzLmNhbGxiYWNr
cyA9IGNhbGxiYWNrczsKLQotICAvLyB0aGUgY29tcHV0ZWQgcHJvcGVydHk6IHJlbWVtYmVyIHRo
ZXNlIGFyZSBzaGFyZWQgYWNyb3NzIGluc3RhbmNlcwotICB0aGlzLmNwID0gY3A7Ci0KLSAgLy8g
dGhlIFJlZHVjZUNvbXB1dGVkUHJvcGVydHlJbnN0YW5jZU1ldGEgdGhpcyBEZXBlbmRlbnRBcnJh
eXNPYnNlcnZlciBpcwotICAvLyBhc3NvY2lhdGVkIHdpdGgKLSAgdGhpcy5pbnN0YW5jZU1ldGEg
PSBpbnN0YW5jZU1ldGE7Ci0KLSAgLy8gQSBtYXAgb2YgYXJyYXkgZ3VpZHMgdG8gZGVwZW5kZW50
S2V5cywgZm9yIHRoZSBnaXZlbiBjb250ZXh0LiAgV2UgdHJhY2sKLSAgLy8gdGhpcyBiZWNhdXNl
IHdlIHdhbnQgdG8gc2V0IHVwIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBwb3RlbnRpYWxseSBiZWZv
cmUgdGhlCi0gIC8vIGRlcGVuZGVudCBhcnJheSBldmVuIGV4aXN0cywgYnV0IHdoZW4gdGhlIGFy
cmF5IG9ic2VydmVyIGZpcmVzLCB3ZSBsYWNrCi0gIC8vIGVub3VnaCBjb250ZXh0IHRvIGtub3cg
d2hhdCB0byB1cGRhdGU6IHdlIGNhbiByZWNvdmVyIHRoYXQgY29udGV4dCBieQotICAvLyBnZXR0
aW5nIHRoZSBkZXBlbmRlbnRLZXkuCi0gIHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZCA9IHt9Owot
Ci0gIC8vIGEgbWFwIG9mIGRlcGVuZGVudCBhcnJheSBndWlkcyAtPiBFbWJlci5UcmFja2VkQXJy
YXkgaW5zdGFuY2VzLiAgV2UgdXNlCi0gIC8vIHRoaXMgdG8gbGF6aWx5IHJlY29tcHV0ZSBpbmRl
eGVzIGZvciBpdGVtIHByb3BlcnR5IG9ic2VydmVycy4KLSAgdGhpcy50cmFja2VkQXJyYXlzQnlH
dWlkID0ge307Ci0KLSAgLy8gV2Ugc3VzcGVuZCBvYnNlcnZlcnMgdG8gaWdub3JlIHJlcGxhY2Vt
ZW50cyBmcm9tIGByZXNldGAgd2hlbiB0b3RhbGx5Ci0gIC8vIHJlY29tcHV0aW5nLiAgVW5mb3J0
dW5hdGVseSB3ZSBjYW5ub3QgcHJvcGVybHkgc3VzcGVuZCB0aGUgb2JzZXJ2ZXJzCi0gIC8vIGJl
Y2F1c2Ugd2Ugb25seSBoYXZlIHRoZSBrZXk7IGluc3RlYWQgd2UgbWFrZSB0aGUgb2JzZXJ2ZXJz
IG5vLW9wcwotICB0aGlzLnN1c3BlbmRlZCA9IGZhbHNlOwotCi0gIC8vIFRoaXMgaXMgdXNlZCB0
byBjb2FsZXNjZSBpdGVtIGNoYW5nZXMgZnJvbSBwcm9wZXJ0eSBvYnNlcnZlcnMuCi0gIHRoaXMu
Y2hhbmdlZEl0ZW1zID0ge307Ci19Ci0KLWZ1bmN0aW9uIEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29u
dGV4dCAoZGVwZW5kZW50QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsKLSAgRW1iZXIuYXNz
ZXJ0KCJJbnRlcm5hbCBlcnJvcjogdHJhY2tlZEFycmF5IGlzIG51bGwgb3IgdW5kZWZpbmVkIiwg
dHJhY2tlZEFycmF5KTsKLQotICB0aGlzLmRlcGVuZGVudEFycmF5ID0gZGVwZW5kZW50QXJyYXk7
Ci0gIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgdGhpcy5pdGVtID0gZGVwZW5kZW50QXJyYXkub2Jq
ZWN0QXQoaW5kZXgpOwotICB0aGlzLnRyYWNrZWRBcnJheSA9IHRyYWNrZWRBcnJheTsKLSAgdGhp
cy5iZWZvcmVPYnNlcnZlciA9IG51bGw7Ci0gIHRoaXMub2JzZXJ2ZXIgPSBudWxsOwotCi0gIHRo
aXMuZGVzdHJveWVkID0gZmFsc2U7Ci19Ci0KLURlcGVuZGVudEFycmF5c09ic2VydmVyLnByb3Rv
dHlwZSA9IHsKLSAgc2V0VmFsdWU6IGZ1bmN0aW9uIChuZXdWYWx1ZSkgewotICAgIHRoaXMuaW5z
dGFuY2VNZXRhLnNldFZhbHVlKG5ld1ZhbHVlLCB0cnVlKTsKLSAgfSwKLSAgZ2V0VmFsdWU6IGZ1
bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhpcy5pbnN0YW5jZU1ldGEuZ2V0VmFsdWUoKTsKLSAg
fSwKLQotICBzZXR1cE9ic2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRl
bnRLZXkpIHsKLSAgICBFbWJlci5hc3NlcnQoImRlcGVuZGVudCBhcnJheSBtdXN0IGJlIGFuIGBF
bWJlci5BcnJheWAiLCBFbWJlci5BcnJheS5kZXRlY3QoZGVwZW5kZW50QXJyYXkpKTsKLQotICAg
IHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtndWlkRm9yKGRlcGVuZGVudEFycmF5KV0gPSBkZXBl
bmRlbnRLZXk7Ci0KLSAgICBkZXBlbmRlbnRBcnJheS5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsK
LSAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFuZ2UnLAotICAgICAgZGlk
Q2hhbmdlOiAnZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0KLSAgICBpZiAodGhp
cy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldKSB7Ci0gICAgICB0aGlzLnNldHVw
UHJvcGVydHlPYnNlcnZlcnMoZGVwZW5kZW50S2V5LCB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlz
W2RlcGVuZGVudEtleV0pOwotICAgIH0KLSAgfSwKLQotICB0ZWFyZG93bk9ic2VydmVyczogZnVu
Y3Rpb24gKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpIHsKLSAgICB2YXIgaXRlbVByb3Bl
cnR5S2V5cyA9IHRoaXMuY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSB8fCBbXTsK
LQotICAgIGRlbGV0ZSB0aGlzLmRlcGVuZGVudEtleXNCeUd1aWRbZ3VpZEZvcihkZXBlbmRlbnRB
cnJheSldOwotCi0gICAgdGhpcy50ZWFyZG93blByb3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtl
eSwgaXRlbVByb3BlcnR5S2V5cyk7Ci0KLSAgICBkZXBlbmRlbnRBcnJheS5yZW1vdmVBcnJheU9i
c2VydmVyKHRoaXMsIHsKLSAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheVdpbGxDaGFu
Z2UnLAotICAgICAgZGlkQ2hhbmdlOiAnZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7
Ci0gIH0sCi0KLSAgc3VzcGVuZEFycmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGJp
bmRpbmcpIHsKLSAgICB2YXIgb2xkU3VzcGVuZGVkID0gdGhpcy5zdXNwZW5kZWQ7Ci0gICAgdGhp
cy5zdXNwZW5kZWQgPSB0cnVlOwotICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZyk7Ci0gICAgdGhp
cy5zdXNwZW5kZWQgPSBvbGRTdXNwZW5kZWQ7Ci0gIH0sCi0KLSAgc2V0dXBQcm9wZXJ0eU9ic2Vy
dmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaXRlbVByb3BlcnR5S2V5cykgewotICAgIHZh
ciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlzLmluc3RhbmNlTWV0YS5jb250ZXh0LCBkZXBlbmRl
bnRLZXkpLAotICAgICAgICBsZW5ndGggPSBnZXQoZGVwZW5kZW50QXJyYXksICdsZW5ndGgnKSwK
LSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBBcnJheShsZW5ndGgpOwotCi0gICAgdGhp
cy5yZXNldFRyYW5zZm9ybWF0aW9ucyhkZXBlbmRlbnRLZXksIG9ic2VydmVyQ29udGV4dHMpOwot
Ci0gICAgZm9yRWFjaChkZXBlbmRlbnRBcnJheSwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7Ci0g
ICAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVyQ29u
dGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtkZXBl
bmRlbnRLZXldKTsKLSAgICAgIG9ic2VydmVyQ29udGV4dHNbaW5kZXhdID0gb2JzZXJ2ZXJDb250
ZXh0OwotCi0gICAgICBmb3JFYWNoKGl0ZW1Qcm9wZXJ0eUtleXMsIGZ1bmN0aW9uIChwcm9wZXJ0
eUtleSkgewotICAgICAgICBhZGRCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhp
cywgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyKTsKLSAgICAgICAgYWRkT2JzZXJ2ZXIo
aXRlbSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcik7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9LCB0aGlzKTsKLSAgfSwKLQotICB0ZWFyZG93blByb3BlcnR5T2Jz
ZXJ2ZXJzOiBmdW5jdGlvbiAoZGVwZW5kZW50S2V5LCBpdGVtUHJvcGVydHlLZXlzKSB7Ci0gICAg
dmFyIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIgPSB0aGlzLAotICAgICAgICB0cmFja2VkQXJyYXkg
PSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5XSwKLSAgICAgICAgYmVmb3Jl
T2JzZXJ2ZXIsCi0gICAgICAgIG9ic2VydmVyLAotICAgICAgICBpdGVtOwotCi0gICAgaWYgKCF0
cmFja2VkQXJyYXkpIHsgcmV0dXJuOyB9Ci0KLSAgICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rp
b24gKG9ic2VydmVyQ29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7Ci0gICAgICBpZiAob3Bl
cmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFKSB7IHJldHVybjsgfQotCi0gICAg
ICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1bmN0aW9uIChvYnNlcnZlckNvbnRleHQpIHsK
LSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0LmRlc3Ryb3llZCA9IHRydWU7Ci0gICAgICAgIGJlZm9y
ZU9ic2VydmVyID0gb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyOwotICAgICAgICBvYnNl
cnZlciA9IG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcjsKLSAgICAgICAgaXRlbSA9IG9ic2VydmVy
Q29udGV4dC5pdGVtOwotCi0gICAgICAgIGZvckVhY2goaXRlbVByb3BlcnR5S2V5cywgZnVuY3Rp
b24gKHByb3BlcnR5S2V5KSB7Ci0gICAgICAgICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRlbSwg
cHJvcGVydHlLZXksIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIsIGJlZm9yZU9ic2VydmVyKTsKLSAg
ICAgICAgICByZW1vdmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgZGVwZW5kZW50QXJyYXlP
YnNlcnZlciwgb2JzZXJ2ZXIpOwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAgIH0pOwotICB9
LAotCi0gIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXJDb250ZXh0OiBmdW5jdGlvbiAoZGVwZW5kZW50
QXJyYXksIGluZGV4LCB0cmFja2VkQXJyYXkpIHsKLSAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0g
bmV3IEl0ZW1Qcm9wZXJ0eU9ic2VydmVyQ29udGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRy
YWNrZWRBcnJheSk7Ci0KLSAgICB0aGlzLmNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIob2JzZXJ2ZXJD
b250ZXh0KTsKLQotICAgIHJldHVybiBvYnNlcnZlckNvbnRleHQ7Ci0gIH0sCi0KLSAgY3JlYXRl
UHJvcGVydHlPYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyQ29udGV4dCkgewotICAgIHZhciBk
ZXBlbmRlbnRBcnJheU9ic2VydmVyID0gdGhpczsKLQotICAgIG9ic2VydmVyQ29udGV4dC5iZWZv
cmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKLSAgICAgIHJldHVybiBkZXBl
bmRlbnRBcnJheU9ic2VydmVyLml0ZW1Qcm9wZXJ0eVdpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBv
YnNlcnZlckNvbnRleHQuZGVwZW5kZW50QXJyYXksIG9ic2VydmVyQ29udGV4dCk7Ci0gICAgfTsK
LSAgICBvYnNlcnZlckNvbnRleHQub2JzZXJ2ZXIgPSBmdW5jdGlvbiAob2JqLCBrZXlOYW1lKSB7
Ci0gICAgICByZXR1cm4gZGVwZW5kZW50QXJyYXlPYnNlcnZlci5pdGVtUHJvcGVydHlEaWRDaGFu
Z2Uob2JqLCBrZXlOYW1lLCBvYnNlcnZlckNvbnRleHQuZGVwZW5kZW50QXJyYXksIG9ic2VydmVy
Q29udGV4dCk7Ci0gICAgfTsKLSAgfSwKLQotICByZXNldFRyYW5zZm9ybWF0aW9uczogZnVuY3Rp
b24gKGRlcGVuZGVudEtleSwgb2JzZXJ2ZXJDb250ZXh0cykgewotICAgIHRoaXMudHJhY2tlZEFy
cmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldID0gbmV3IEVtYmVyLlRyYWNrZWRBcnJheShvYnNlcnZl
ckNvbnRleHRzKTsKLSAgfSwKLQotICB0cmFja0FkZDogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwg
aW5kZXgsIG5ld0l0ZW1zKSB7Ci0gICAgdmFyIHRyYWNrZWRBcnJheSA9IHRoaXMudHJhY2tlZEFy
cmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldOwotICAgIGlmICh0cmFja2VkQXJyYXkpIHsKLSAgICAg
IHRyYWNrZWRBcnJheS5hZGRJdGVtcyhpbmRleCwgbmV3SXRlbXMpOwotICAgIH0KLSAgfSwKLQot
ICB0cmFja1JlbW92ZTogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaW5kZXgsIHJlbW92ZWRDb3Vu
dCkgewotICAgIHZhciB0cmFja2VkQXJyYXkgPSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVw
ZW5kZW50S2V5XTsKLQotICAgIGlmICh0cmFja2VkQXJyYXkpIHsKLSAgICAgIHJldHVybiB0cmFj
a2VkQXJyYXkucmVtb3ZlSXRlbXMoaW5kZXgsIHJlbW92ZWRDb3VudCk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIFtdOwotICB9LAotCi0gIHVwZGF0ZUluZGV4ZXM6IGZ1bmN0aW9uICh0cmFja2VkQXJy
YXksIGFycmF5KSB7Ci0gICAgdmFyIGxlbmd0aCA9IGdldChhcnJheSwgJ2xlbmd0aCcpOwotICAg
IC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzdG9wIHVwZGF0aW5nIG9uY2Ugd2UgaGl0IHRoZSBvYmpl
Y3Qgd2hvc2Ugb2JzZXJ2ZXIKLSAgICAvLyBmaXJlZDsgaWUgcGFydGlhbGx5IGFwcGx5IHRoZSB0
cmFuc2Zvcm1hdGlvbnMKLSAgICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVy
Q29udGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7Ci0gICAgICAvLyB3ZSBkb24ndCBldmVuIGhh
dmUgb2JzZXJ2ZXIgY29udGV4dHMgZm9yIHJlbW92ZWQgaXRlbXMsIGV2ZW4gaWYgd2UgZGlkLAot
ICAgICAgLy8gdGhleSBubyBsb25nZXIgaGF2ZSBhbnkgaW5kZXggaW4gdGhlIGFycmF5Ci0gICAg
ICBpZiAob3BlcmF0aW9uID09PSBFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFKSB7IHJldHVybjsg
fQotICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gRW1iZXIuVHJhY2tlZEFycmF5LlJFVEFJTiAmJiBv
YnNlcnZlckNvbnRleHRzLmxlbmd0aCA9PT0gbGVuZ3RoICYmIG9mZnNldCA9PT0gMCkgewotICAg
ICAgICAvLyBJZiB3ZSB1cGRhdGUgbWFueSBpdGVtcyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhl
IGFycmF5IGVhY2ggdGltZTogd2UKLSAgICAgICAgLy8gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUg
aW5kZXhlcyBhdCBtb3N0IG9uY2UgcGVyIHJ1biBsb29wLgotICAgICAgICByZXR1cm47Ci0gICAg
ICB9Ci0KLSAgICAgIGZvckVhY2gob2JzZXJ2ZXJDb250ZXh0cywgZnVuY3Rpb24gKGNvbnRleHQs
IGluZGV4KSB7Ci0gICAgICAgIGNvbnRleHQuaW5kZXggPSBpbmRleCArIG9mZnNldDsKLSAgICAg
IH0pOwotICAgIH0pOwotICB9LAotCi0gIGRlcGVuZGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rp
b24gKGRlcGVuZGVudEFycmF5LCBpbmRleCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0g
ICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7IHJldHVybjsgfQotCi0gICAgdmFyIHJlbW92ZWRJdGVt
ID0gdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0sCi0gICAgICAgIGNoYW5nZU1ldGEsCi0gICAg
ICAgIGd1aWQgPSBndWlkRm9yKGRlcGVuZGVudEFycmF5KSwKLSAgICAgICAgZGVwZW5kZW50S2V5
ID0gdGhpcy5kZXBlbmRlbnRLZXlzQnlHdWlkW2d1aWRdLAotICAgICAgICBpdGVtUHJvcGVydHlL
ZXlzID0gdGhpcy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldIHx8IFtdLAotICAg
ICAgICBsZW5ndGggPSBnZXQoZGVwZW5kZW50QXJyYXksICdsZW5ndGgnKSwKLSAgICAgICAgbm9y
bWFsaXplZEluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgsIGxlbmd0aCwgMCksCi0gICAgICAg
IG5vcm1hbGl6ZWRSZW1vdmVDb3VudCA9IG5vcm1hbGl6ZVJlbW92ZUNvdW50KG5vcm1hbGl6ZWRJ
bmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpLAotICAgICAgICBpdGVtLAotICAgICAgICBpdGVt
SW5kZXgsCi0gICAgICAgIHNsaWNlSW5kZXgsCi0gICAgICAgIG9ic2VydmVyQ29udGV4dHM7Ci0K
LSAgICBvYnNlcnZlckNvbnRleHRzID0gdGhpcy50cmFja1JlbW92ZShkZXBlbmRlbnRLZXksIG5v
cm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZFJlbW92ZUNvdW50KTsKLQotICAgIGZ1bmN0aW9uIHJl
bW92ZU9ic2VydmVycyhwcm9wZXJ0eUtleSkgewotICAgICAgb2JzZXJ2ZXJDb250ZXh0c1tzbGlj
ZUluZGV4XS5kZXN0cm95ZWQgPSB0cnVlOwotICAgICAgcmVtb3ZlQmVmb3JlT2JzZXJ2ZXIoaXRl
bSwgcHJvcGVydHlLZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0uYmVmb3Jl
T2JzZXJ2ZXIpOwotICAgICAgcmVtb3ZlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIHRoaXMs
IG9ic2VydmVyQ29udGV4dHNbc2xpY2VJbmRleF0ub2JzZXJ2ZXIpOwotICAgIH0KLQotICAgIGZv
ciAoc2xpY2VJbmRleCA9IG5vcm1hbGl6ZWRSZW1vdmVDb3VudCAtIDE7IHNsaWNlSW5kZXggPj0g
MDsgLS1zbGljZUluZGV4KSB7Ci0gICAgICBpdGVtSW5kZXggPSBub3JtYWxpemVkSW5kZXggKyBz
bGljZUluZGV4OwotICAgICAgaWYgKGl0ZW1JbmRleCA+PSBsZW5ndGgpIHsgYnJlYWs7IH0KLQot
ICAgICAgaXRlbSA9IGRlcGVuZGVudEFycmF5Lm9iamVjdEF0KGl0ZW1JbmRleCk7Ci0KLSAgICAg
IGZvckVhY2goaXRlbVByb3BlcnR5S2V5cywgcmVtb3ZlT2JzZXJ2ZXJzLCB0aGlzKTsKLQotICAg
ICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0ZW0sIGl0
ZW1JbmRleCwgdGhpcy5pbnN0YW5jZU1ldGEucHJvcGVydHlOYW1lLCB0aGlzLmNwKTsKLSAgICAg
IHRoaXMuc2V0VmFsdWUoIHJlbW92ZWRJdGVtLmNhbGwoCi0gICAgICAgIHRoaXMuaW5zdGFuY2VN
ZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0
YW5jZU1ldGEuc3VnYXJNZXRhKSk7Ci0gICAgfQotICB9LAotCi0gIGRlcGVuZGVudEFycmF5RGlk
Q2hhbmdlOiBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXksIGluZGV4LCByZW1vdmVkQ291bnQsIGFk
ZGVkQ291bnQpIHsKLSAgICBpZiAodGhpcy5zdXNwZW5kZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICB2
YXIgYWRkZWRJdGVtID0gdGhpcy5jYWxsYmFja3MuYWRkZWRJdGVtLAotICAgICAgICBndWlkID0g
Z3VpZEZvcihkZXBlbmRlbnRBcnJheSksCi0gICAgICAgIGRlcGVuZGVudEtleSA9IHRoaXMuZGVw
ZW5kZW50S2V5c0J5R3VpZFtndWlkXSwKLSAgICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBB
cnJheShhZGRlZENvdW50KSwKLSAgICAgICAgaXRlbVByb3BlcnR5S2V5cyA9IHRoaXMuY3AuX2l0
ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSwKLSAgICAgICAgbGVuZ3RoID0gZ2V0KGRlcGVu
ZGVudEFycmF5LCAnbGVuZ3RoJyksCi0gICAgICAgIG5vcm1hbGl6ZWRJbmRleCA9IG5vcm1hbGl6
ZUluZGV4KGluZGV4LCBsZW5ndGgsIGFkZGVkQ291bnQpLAotICAgICAgICBjaGFuZ2VNZXRhLAot
ICAgICAgICBvYnNlcnZlckNvbnRleHQ7Ci0KLSAgICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LnNs
aWNlKG5vcm1hbGl6ZWRJbmRleCwgbm9ybWFsaXplZEluZGV4ICsgYWRkZWRDb3VudCksIGZ1bmN0
aW9uIChpdGVtLCBzbGljZUluZGV4KSB7Ci0gICAgICBpZiAoaXRlbVByb3BlcnR5S2V5cykgewot
ICAgICAgICBvYnNlcnZlckNvbnRleHQgPQotICAgICAgICAgIG9ic2VydmVyQ29udGV4dHNbc2xp
Y2VJbmRleF0gPQotICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlckNvbnRleHQo
ZGVwZW5kZW50QXJyYXksIG5vcm1hbGl6ZWRJbmRleCArIHNsaWNlSW5kZXgsIHRoaXMudHJhY2tl
ZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsKLSAgICAgICAgZm9yRWFjaChpdGVtUHJvcGVy
dHlLZXlzLCBmdW5jdGlvbiAocHJvcGVydHlLZXkpIHsKLSAgICAgICAgICBhZGRCZWZvcmVPYnNl
cnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2Vy
dmVyKTsKLSAgICAgICAgICBhZGRPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2Jz
ZXJ2ZXJDb250ZXh0Lm9ic2VydmVyKTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9Ci0KLSAg
ICAgIGNoYW5nZU1ldGEgPSBjcmVhdGVDaGFuZ2VNZXRhKGRlcGVuZGVudEFycmF5LCBpdGVtLCBu
b3JtYWxpemVkSW5kZXggKyBzbGljZUluZGV4LCB0aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5h
bWUsIHRoaXMuY3ApOwotICAgICAgdGhpcy5zZXRWYWx1ZSggYWRkZWRJdGVtLmNhbGwoCi0gICAg
ICAgIHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hh
bmdlTWV0YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRhKSk7Ci0gICAgfSwgdGhpcyk7Ci0K
LSAgICB0aGlzLnRyYWNrQWRkKGRlcGVuZGVudEtleSwgbm9ybWFsaXplZEluZGV4LCBvYnNlcnZl
ckNvbnRleHRzKTsKLSAgfSwKLQotICBpdGVtUHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAo
b2JqLCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgdmFyIGd1aWQgPSBn
dWlkRm9yKG9iaik7Ci0KLSAgICBpZiAoIXRoaXMuY2hhbmdlZEl0ZW1zW2d1aWRdKSB7Ci0gICAg
ICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXSA9IHsKLSAgICAgICAgYXJyYXk6ICAgICAgICAgICAg
YXJyYXksCi0gICAgICAgIG9ic2VydmVyQ29udGV4dDogIG9ic2VydmVyQ29udGV4dCwKLSAgICAg
ICAgb2JqOiAgICAgICAgICAgICAgb2JqLAotICAgICAgICBwcmV2aW91c1ZhbHVlczogICB7fQot
ICAgICAgfTsKLSAgICB9Ci0KLSAgICB0aGlzLmNoYW5nZWRJdGVtc1tndWlkXS5wcmV2aW91c1Zh
bHVlc1trZXlOYW1lXSA9IGdldChvYmosIGtleU5hbWUpOwotICB9LAotCi0gIGl0ZW1Qcm9wZXJ0
eURpZENoYW5nZTogZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0
KSB7Ci0gICAgdGhpcy5mbHVzaENoYW5nZXMoKTsKLSAgfSwKLQotICBmbHVzaENoYW5nZXM6IGZ1
bmN0aW9uKCkgewotICAgIHZhciBjaGFuZ2VkSXRlbXMgPSB0aGlzLmNoYW5nZWRJdGVtcywga2V5
LCBjLCBjaGFuZ2VNZXRhOwotCi0gICAgZm9yIChrZXkgaW4gY2hhbmdlZEl0ZW1zKSB7Ci0gICAg
ICBjID0gY2hhbmdlZEl0ZW1zW2tleV07Ci0gICAgICBpZiAoYy5vYnNlcnZlckNvbnRleHQuZGVz
dHJveWVkKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgIHRoaXMudXBkYXRlSW5kZXhlcyhjLm9ic2Vy
dmVyQ29udGV4dC50cmFja2VkQXJyYXksIGMub2JzZXJ2ZXJDb250ZXh0LmRlcGVuZGVudEFycmF5
KTsKLQotICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEoYy5hcnJheSwgYy5vYmos
IGMub2JzZXJ2ZXJDb250ZXh0LmluZGV4LCB0aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUs
IHRoaXMuY3AsIGMucHJldmlvdXNWYWx1ZXMpOwotICAgICAgdGhpcy5zZXRWYWx1ZSgKLSAgICAg
ICAgdGhpcy5jYWxsYmFja3MucmVtb3ZlZEl0ZW0uY2FsbCh0aGlzLmluc3RhbmNlTWV0YS5jb250
ZXh0LCB0aGlzLmdldFZhbHVlKCksIGMub2JqLCBjaGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0
YS5zdWdhck1ldGEpKTsKLSAgICAgIHRoaXMuc2V0VmFsdWUoCi0gICAgICAgIHRoaXMuY2FsbGJh
Y2tzLmFkZGVkSXRlbS5jYWxsKHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFs
dWUoKSwgYy5vYmosIGNoYW5nZU1ldGEsIHRoaXMuaW5zdGFuY2VNZXRhLnN1Z2FyTWV0YSkpOwot
ICAgIH0KLSAgICB0aGlzLmNoYW5nZWRJdGVtcyA9IHt9OwotICB9Ci19OwotCi1mdW5jdGlvbiBu
b3JtYWxpemVJbmRleChpbmRleCwgbGVuZ3RoLCBuZXdJdGVtc09mZnNldCkgewotICBpZiAoaW5k
ZXggPCAwKSB7Ci0gICAgcmV0dXJuIE1hdGgubWF4KDAsIGxlbmd0aCArIGluZGV4KTsKLSAgfSBl
bHNlIGlmIChpbmRleCA8IGxlbmd0aCkgewotICAgIHJldHVybiBpbmRleDsKLSAgfSBlbHNlIC8q
IGluZGV4ID4gbGVuZ3RoICovIHsKLSAgICByZXR1cm4gTWF0aC5taW4obGVuZ3RoIC0gbmV3SXRl
bXNPZmZzZXQsIGluZGV4KTsKLSAgfQotfQotCi1mdW5jdGlvbiBub3JtYWxpemVSZW1vdmVDb3Vu
dChpbmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpIHsKLSAgcmV0dXJuIE1hdGgubWluKHJlbW92
ZWRDb3VudCwgbGVuZ3RoIC0gaW5kZXgpOwotfQotCi1mdW5jdGlvbiBjcmVhdGVDaGFuZ2VNZXRh
KGRlcGVuZGVudEFycmF5LCBpdGVtLCBpbmRleCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eSwgcHJl
dmlvdXNWYWx1ZXMpIHsKLSAgdmFyIG1ldGEgPSB7Ci0gICAgYXJyYXlDaGFuZ2VkOiBkZXBlbmRl
bnRBcnJheSwKLSAgICBpbmRleDogaW5kZXgsCi0gICAgaXRlbTogaXRlbSwKLSAgICBwcm9wZXJ0
eU5hbWU6IHByb3BlcnR5TmFtZSwKLSAgICBwcm9wZXJ0eTogcHJvcGVydHkKLSAgfTsKLQotICBp
ZiAocHJldmlvdXNWYWx1ZXMpIHsKLSAgICAvLyBwcmV2aW91cyB2YWx1ZXMgb25seSBhdmFpbGFi
bGUgZm9yIGl0ZW0gcHJvcGVydHkgY2hhbmdlcwotICAgIG1ldGEucHJldmlvdXNWYWx1ZXMgPSBw
cmV2aW91c1ZhbHVlczsKLSAgfQotCi0gIHJldHVybiBtZXRhOwotfQotCi1mdW5jdGlvbiBhZGRJ
dGVtcyAoZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSkg
ewotICBmb3JFYWNoKGRlcGVuZGVudEFycmF5LCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKLSAg
ICBtZXRhLnNldFZhbHVlKCBjYWxsYmFja3MuYWRkZWRJdGVtLmNhbGwoCi0gICAgICB0aGlzLCBt
ZXRhLmdldFZhbHVlKCksIGl0ZW0sIGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50QXJyYXksIGl0
ZW0sIGluZGV4LCBwcm9wZXJ0eU5hbWUsIGNwKSwgbWV0YS5zdWdhck1ldGEpKTsKLSAgfSwgdGhp
cyk7Ci19Ci0KLWZ1bmN0aW9uIHJlc2V0KGNwLCBwcm9wZXJ0eU5hbWUpIHsKLSAgdmFyIGNhbGxi
YWNrcyA9IGNwLl9jYWxsYmFja3MoKSwKLSAgICAgIG1ldGE7Ci0KLSAgaWYgKGNwLl9oYXNJbnN0
YW5jZU1ldGEodGhpcywgcHJvcGVydHlOYW1lKSkgewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gICAgbWV0YS5zZXRWYWx1ZShjcC5yZXNldFZhbHVl
KG1ldGEuZ2V0VmFsdWUoKSkpOwotICB9IGVsc2UgewotICAgIG1ldGEgPSBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICBpZiAoY3Aub3B0aW9ucy5pbml0aWFs
aXplKSB7Ci0gICAgY3Aub3B0aW9ucy5pbml0aWFsaXplLmNhbGwodGhpcywgbWV0YS5nZXRWYWx1
ZSgpLCB7IHByb3BlcnR5OiBjcCwgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUgfSwgbWV0YS5z
dWdhck1ldGEpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHBhcnRpYWxseVJlY29tcHV0ZUZvcihvYmos
IGRlcGVuZGVudEtleSkgewotICBpZiAoYXJyYXlCcmFja2V0UGF0dGVybi50ZXN0KGRlcGVuZGVu
dEtleSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2YXIgdmFsdWUgPSBnZXQob2Jq
LCBkZXBlbmRlbnRLZXkpOwotICByZXR1cm4gRW1iZXIuQXJyYXkuZGV0ZWN0KHZhbHVlKTsKLX0K
LQotZnVuY3Rpb24gUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBw
cm9wZXJ0eU5hbWUsIGluaXRpYWxWYWx1ZSkgewotICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Owot
ICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgdGhpcy5jYWNoZSA9IG1ldGFG
b3IoY29udGV4dCkuY2FjaGU7Ci0KLSAgdGhpcy5kZXBlbmRlbnRBcnJheXMgPSB7fTsKLSAgdGhp
cy5zdWdhck1ldGEgPSB7fTsKLQotICB0aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsK
LX0KLQotUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YS5wcm90b3R5cGUgPSB7Ci0g
IGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7Ci0gICAgaWYgKHRoaXMucHJvcGVydHlOYW1lIGluIHRo
aXMuY2FjaGUpIHsKLSAgICAgIHJldHVybiB0aGlzLmNhY2hlW3RoaXMucHJvcGVydHlOYW1lXTsK
LSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotICAgIH0KLSAg
fSwKLQotICBzZXRWYWx1ZTogZnVuY3Rpb24obmV3VmFsdWUsIHRyaWdnZXJPYnNlcnZlcnMpIHsK
LSAgICAvLyBUaGlzIGxldHMgc3VnYXJzIGZvcmNlIGEgcmVjb21wdXRhdGlvbiwgaGFuZHkgZm9y
IHZlcnkgc2ltcGxlCi0gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGVnIG1heC4KLSAgICBpZiAo
bmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgewotICAgICAgdmFyIGZpcmVPYnNlcnZlcnMgPSB0cmln
Z2VyT2JzZXJ2ZXJzICYmIChuZXdWYWx1ZSAhPT0gdGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFt
ZV0pOwotCi0gICAgICBpZiAoZmlyZU9ic2VydmVycykgewotICAgICAgICBwcm9wZXJ0eVdpbGxD
aGFuZ2UodGhpcy5jb250ZXh0LCB0aGlzLnByb3BlcnR5TmFtZSk7Ci0gICAgICB9Ci0KLSAgICAg
IHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVdID0gbmV3VmFsdWU7Ci0KLSAgICAgIGlmIChm
aXJlT2JzZXJ2ZXJzKSB7Ci0gICAgICAgIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMuY29udGV4dCwg
dGhpcy5wcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBkZWxldGUg
dGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV07Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAg
QSBjb21wdXRlZCBwcm9wZXJ0eSB3aG9zZSBkZXBlbmRlbnQga2V5cyBhcmUgYXJyYXlzIGFuZCB3
aGljaCBpcyB1cGRhdGVkIHdpdGgKLSAgIm9uZSBhdCBhIHRpbWUiIHNlbWFudGljcy4KLQotICBA
Y2xhc3MgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRl
bmRzIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkKLSAgQGNvbnN0cnVjdG9yCi0qLwotZnVuY3Rpb24g
UmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eShvcHRpb25zKSB7Ci0gIHZhciBjcCA9IHRoaXM7Ci0KLSAg
dGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgdGhpcy5faW5zdGFuY2VNZXRhcyA9IHt9OwotCi0g
IHRoaXMuX2RlcGVuZGVudEtleXMgPSBudWxsOwotICAvLyBBIG1hcCBvZiBkZXBlbmRlbnRLZXkg
LT4gW2l0ZW1Qcm9wZXJ0eSwgLi4uXSB0aGF0IHRyYWNrcyB3aGF0IHByb3BlcnRpZXMgb2YKLSAg
Ly8gaXRlbXMgaW4gdGhlIGFycmF5IHdlIG11c3QgdHJhY2sgdG8gdXBkYXRlIHRoaXMgcHJvcGVy
dHkuCi0gIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXMgPSB7fTsKLSAgdGhpcy5fcHJldmlvdXNJdGVt
UHJvcGVydHlLZXlzID0ge307Ci0KLSAgdGhpcy5yZWFkT25seSgpOwotICB0aGlzLmNhY2hlYWJs
ZSgpOwotCi0gIHRoaXMucmVjb21wdXRlT25jZSA9IGZ1bmN0aW9uKHByb3BlcnR5TmFtZSkgewot
ICAgIC8vIFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaXMgY29hbGVzY2UgYnkgPGNwLCBwcm9w
ZXJ0eU5hbWU+LgotICAgIC8vIFdlIG5lZWQgYSBmb3JtIG9mIGBzY2hlZHVsZU9uY2VgIHRoYXQg
YWNjZXB0cyBhbiBhcmJpdHJhcnkgdG9rZW4gdG8KLSAgICAvLyBjb2FsZXNjZSBieSwgaW4gYWRk
aXRpb24gdG8gdGhlIHRhcmdldCBhbmQgbWV0aG9kLgotICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMs
IHJlY29tcHV0ZSwgcHJvcGVydHlOYW1lKTsKLSAgfTsKLSAgdmFyIHJlY29tcHV0ZSA9IGZ1bmN0
aW9uKHByb3BlcnR5TmFtZSkgewotICAgIHZhciBkZXBlbmRlbnRLZXlzID0gY3AuX2RlcGVuZGVu
dEtleXMsCi0gICAgICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFt
ZSksCi0gICAgICAgIGNhbGxiYWNrcyA9IGNwLl9jYWxsYmFja3MoKTsKLQotICAgIHJlc2V0LmNh
bGwodGhpcywgY3AsIHByb3BlcnR5TmFtZSk7Ci0KLSAgICBtZXRhLmRlcGVuZGVudEFycmF5c09i
c2VydmVyLnN1c3BlbmRBcnJheU9ic2VydmVycyhmdW5jdGlvbiAoKSB7Ci0gICAgICBmb3JFYWNo
KGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0gICAgICAgIGlm
ICghcGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsgcmV0dXJuOyB9
Ci0KLSAgICAgICAgdmFyIGRlcGVuZGVudEFycmF5ID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSks
Ci0gICAgICAgICAgICBwcmV2aW91c0RlcGVuZGVudEFycmF5ID0gbWV0YS5kZXBlbmRlbnRBcnJh
eXNbZGVwZW5kZW50S2V5XTsKLQotICAgICAgICBpZiAoZGVwZW5kZW50QXJyYXkgPT09IHByZXZp
b3VzRGVwZW5kZW50QXJyYXkpIHsKLSAgICAgICAgICAvLyBUaGUgYXJyYXkgbWF5IGJlIHRoZSBz
YW1lLCBidXQgb3VyIGl0ZW0gcHJvcGVydHkga2V5cyBtYXkgaGF2ZQotICAgICAgICAgIC8vIGNo
YW5nZWQsIHNvIHdlIHNldCB0aGVtIHVwIGFnYWluLiAgV2UgY2FuJ3QgZWFzaWx5IHRlbGwgaWYg
dGhleSd2ZQotICAgICAgICAgIC8vIGNoYW5nZWQ6IHRoZSBhcnJheSBtYXkgYmUgdGhlIHNhbWUg
b2JqZWN0LCBidXQgd2l0aCBkaWZmZXJlbnQKLSAgICAgICAgICAvLyBjb250ZW50cy4KLSAgICAg
ICAgICBpZiAoY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXldKSB7Ci0g
ICAgICAgICAgICBkZWxldGUgY3AuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRL
ZXldOwotICAgICAgICAgICAgbWV0YS5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zZXR1cFByb3Bl
cnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50
S2V5XSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1ldGEuZGVw
ZW5kZW50QXJyYXlzW2RlcGVuZGVudEtleV0gPSBkZXBlbmRlbnRBcnJheTsKLQotICAgICAgICAg
IGlmIChwcmV2aW91c0RlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgICAgICBtZXRhLmRlcGVuZGVu
dEFycmF5c09ic2VydmVyLnRlYXJkb3duT2JzZXJ2ZXJzKHByZXZpb3VzRGVwZW5kZW50QXJyYXks
IGRlcGVuZGVudEtleSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGRlcGVuZGVudEFy
cmF5KSB7Ci0gICAgICAgICAgICBtZXRhLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnNldHVwT2Jz
ZXJ2ZXJzKGRlcGVuZGVudEFycmF5LCBkZXBlbmRlbnRLZXkpOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSwgdGhpcyk7Ci0KLSAgICBmb3JFYWNoKGNwLl9k
ZXBlbmRlbnRLZXlzLCBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKLSAgICAgIGlmICghcGFydGlh
bGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsgcmV0dXJuOyB9Ci0KLSAgICAg
IHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwotICAgICAgaWYg
KGRlcGVuZGVudEFycmF5KSB7Ci0gICAgICAgIGFkZEl0ZW1zLmNhbGwodGhpcywgZGVwZW5kZW50
QXJyYXksIGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSk7Ci0gICAgICB9Ci0gICAg
fSwgdGhpcyk7Ci0gIH07Ci0KLSAgdGhpcy5mdW5jID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkg
ewotICAgIEVtYmVyLmFzc2VydCgiQ29tcHV0ZWQgcmVkdWNlIHZhbHVlcyByZXF1aXJlIGF0IGxl
YXN0IG9uZSBkZXBlbmRlbnQga2V5IiwgY3AuX2RlcGVuZGVudEtleXMpOwotCi0gICAgcmVjb21w
dXRlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKLQotICAgIHJldHVybiBjcC5faW5zdGFuY2VN
ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkuZ2V0VmFsdWUoKTsKLSAgfTsKLX0KLQotRW1iZXIuUmVk
dWNlQ29tcHV0ZWRQcm9wZXJ0eSA9IFJlZHVjZUNvbXB1dGVkUHJvcGVydHk7Ci1SZWR1Y2VDb21w
dXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9fY3JlYXRlKENvbXB1dGVkUHJvcGVydHkucHJvdG90
eXBlKTsKLQotZnVuY3Rpb24gZGVmYXVsdENhbGxiYWNrKGNvbXB1dGVkVmFsdWUpIHsKLSAgcmV0
dXJuIGNvbXB1dGVkVmFsdWU7Ci19Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBl
Ll9jYWxsYmFja3MgPSBmdW5jdGlvbiAoKSB7Ci0gIGlmICghdGhpcy5jYWxsYmFja3MpIHsKLSAg
ICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKLSAgICB0aGlzLmNhbGxiYWNrcyA9IHsKLSAg
ICAgIHJlbW92ZWRJdGVtOiBvcHRpb25zLnJlbW92ZWRJdGVtIHx8IGRlZmF1bHRDYWxsYmFjaywK
LSAgICAgIGFkZGVkSXRlbTogb3B0aW9ucy5hZGRlZEl0ZW0gfHwgZGVmYXVsdENhbGxiYWNrCi0g
ICAgfTsKLSAgfQotICByZXR1cm4gdGhpcy5jYWxsYmFja3M7Ci19OwotCi1SZWR1Y2VDb21wdXRl
ZFByb3BlcnR5LnByb3RvdHlwZS5faGFzSW5zdGFuY2VNZXRhID0gZnVuY3Rpb24gKGNvbnRleHQs
IHByb3BlcnR5TmFtZSkgewotICB2YXIgZ3VpZCA9IGd1aWRGb3IoY29udGV4dCksCi0gICAgICBr
ZXkgPSBndWlkICsgJzonICsgcHJvcGVydHlOYW1lOwotCi0gIHJldHVybiAhIXRoaXMuX2luc3Rh
bmNlTWV0YXNba2V5XTsKLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9p
bnN0YW5jZU1ldGEgPSBmdW5jdGlvbiAoY29udGV4dCwgcHJvcGVydHlOYW1lKSB7Ci0gIHZhciBn
dWlkID0gZ3VpZEZvcihjb250ZXh0KSwKLSAgICAgIGtleSA9IGd1aWQgKyAnOicgKyBwcm9wZXJ0
eU5hbWUsCi0gICAgICBtZXRhID0gdGhpcy5faW5zdGFuY2VNZXRhc1trZXldOwotCi0gIGlmICgh
bWV0YSkgewotICAgIG1ldGEgPSB0aGlzLl9pbnN0YW5jZU1ldGFzW2tleV0gPSBuZXcgUmVkdWNl
Q29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YShjb250ZXh0LCBwcm9wZXJ0eU5hbWUsIHRoaXMu
aW5pdGlhbFZhbHVlKCkpOwotICAgIG1ldGEuZGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIgPSBuZXcg
RGVwZW5kZW50QXJyYXlzT2JzZXJ2ZXIodGhpcy5fY2FsbGJhY2tzKCksIHRoaXMsIG1ldGEsIGNv
bnRleHQsIHByb3BlcnR5TmFtZSwgbWV0YS5zdWdhck1ldGEpOwotICB9Ci0KLSAgcmV0dXJuIG1l
dGE7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pbml0aWFsVmFsdWUg
PSBmdW5jdGlvbiAoKSB7Ci0gIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSA9
PT0gJ2Z1bmN0aW9uJykgewotICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKCk7
Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbml0aWFsVmFsdWU7Ci0g
IH0KLX07Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnJlc2V0VmFsdWUgPSBm
dW5jdGlvbiAodmFsdWUpIHsKLSAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlKCk7Ci19OwotCi1S
ZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pdGVtUHJvcGVydHlLZXkgPSBmdW5jdGlv
biAoZGVwZW5kZW50QXJyYXlLZXksIGl0ZW1Qcm9wZXJ0eUtleSkgewotICB0aGlzLl9pdGVtUHJv
cGVydHlLZXlzW2RlcGVuZGVudEFycmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVw
ZW5kZW50QXJyYXlLZXldIHx8IFtdOwotICB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVu
dEFycmF5S2V5XS5wdXNoKGl0ZW1Qcm9wZXJ0eUtleSk7Ci19OwotCi1SZWR1Y2VDb21wdXRlZFBy
b3BlcnR5LnByb3RvdHlwZS5jbGVhckl0ZW1Qcm9wZXJ0eUtleXMgPSBmdW5jdGlvbiAoZGVwZW5k
ZW50QXJyYXlLZXkpIHsKLSAgaWYgKHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJy
YXlLZXldKSB7Ci0gICAgdGhpcy5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEFy
cmF5S2V5XSA9IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldOwotICAg
IHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50QXJyYXlLZXldID0gW107Ci0gIH0KLX07
Ci0KLVJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24g
KCkgewotICB2YXIgY3AgPSB0aGlzLAotICAgICAgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMpLAotICAgICAgcHJvcGVydHlBcmdzID0gbmV3IEVtYmVyLlNldCgpLAotICAgICAgbWF0Y2gs
Ci0gICAgICBkZXBlbmRlbnRBcnJheUtleSwKLSAgICAgIGl0ZW1Qcm9wZXJ0eUtleTsKLQotICBm
b3JFYWNoKGFfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7
Ci0gICAgaWYgKGRvdWJsZUVhY2hQcm9wZXJ0eVBhdHRlcm4udGVzdChkZXBlbmRlbnRLZXkpKSB7
Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIk5lc3RlZCBAZWFjaCBwcm9wZXJ0aWVzIG5v
dCBzdXBwb3J0ZWQ6ICIgKyBkZXBlbmRlbnRLZXkpOwotICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBl
YWNoUHJvcGVydHlQYXR0ZXJuLmV4ZWMoZGVwZW5kZW50S2V5KSkgewotICAgICAgZGVwZW5kZW50
QXJyYXlLZXkgPSBtYXRjaFsxXTsKLQotICAgICAgCi0gICAgICAgIGl0ZW1Qcm9wZXJ0eUtleSA9
IG1hdGNoWzJdOwotICAgICAgICBjcC5pdGVtUHJvcGVydHlLZXkoZGVwZW5kZW50QXJyYXlLZXks
IGl0ZW1Qcm9wZXJ0eUtleSk7Ci0gICAgICAKLSAgICAgIHByb3BlcnR5QXJncy5hZGQoZGVwZW5k
ZW50QXJyYXlLZXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcm9wZXJ0eUFyZ3MuYWRkKGRlcGVu
ZGVudEtleSk7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gQ29tcHV0ZWRQcm9wZXJ0eS5wcm90
b3R5cGUucHJvcGVydHkuYXBwbHkodGhpcywgcHJvcGVydHlBcmdzLnRvQXJyYXkoKSk7Ci0KLX07
Ci0KLS8qKgotICBDcmVhdGVzIGEgY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggb3BlcmF0ZXMgb24g
ZGVwZW5kZW50IGFycmF5cyBhbmQKLSAgaXMgdXBkYXRlZCB3aXRoICJvbmUgYXQgYSB0aW1lIiBz
ZW1hbnRpY3MuIFdoZW4gaXRlbXMgYXJlIGFkZGVkIG9yCi0gIHJlbW92ZWQgZnJvbSB0aGUgZGVw
ZW5kZW50IGFycmF5KHMpIGEgcmVkdWNlIGNvbXB1dGVkIG9ubHkgb3BlcmF0ZXMKLSAgb24gdGhl
IGNoYW5nZSBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRpbmcgdGhlIGVudGlyZSBhcnJheS4KLQotICBJ
ZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudHMgdGhlIGZpcnN0IGFyZ3VtZW50cyBh
cmUKLSAgY29uc2lkZXJlZCB0byBiZSBkZXBlbmRlbnQgcHJvcGVydHkga2V5cy4gVGhlIGxhc3Qg
YXJndW1lbnQgaXMKLSAgcmVxdWlyZWQgdG8gYmUgYW4gb3B0aW9ucyBvYmplY3QuIFRoZSBvcHRp
b25zIG9iamVjdCBjYW4gaGF2ZSB0aGUKLSAgZm9sbG93aW5nIGZvdXIgcHJvcGVydGllczoKLQot
ICBgaW5pdGlhbFZhbHVlYCAtIEEgdmFsdWUgb3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQg
YXMgdGhlIGluaXRpYWwKLSAgdmFsdWUgZm9yIHRoZSBjb21wdXRlZC4gSWYgdGhpcyBwcm9wZXJ0
eSBpcyBhIGZ1bmN0aW9uIHRoZSByZXN1bHQgb2YgY2FsbGluZwotICB0aGUgZnVuY3Rpb24gd2ls
bCBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVlLiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVk
LgotCi0gIGBpbml0aWFsaXplYCAtIEFuIG9wdGlvbmFsIGluaXRpYWxpemUgZnVuY3Rpb24uIFR5
cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAotICB0byBzZXQgdXAgc3RhdGUgb24gdGhlIGluc3Rh
bmNlTWV0YSBvYmplY3QuCi0KLSAgYHJlbW92ZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBj
YWxsZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZAotICBmcm9tIHRoZSBhcnJheS4K
LQotICBgYWRkZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFu
IGVsZW1lbnQgaXMgYWRkZWQgdG8KLSAgdGhlIGFycmF5LgotCi0KLSAgVGhlIGBpbml0aWFsaXpl
YCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICAgZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQot
ICBgYGAKLQotICBgaW5pdGlhbFZhbHVlYCAtIFRoZSB2YWx1ZSBvZiB0aGUgYGluaXRpYWxWYWx1
ZWAgcHJvcGVydHkgZnJvbSB0aGUKLSAgb3B0aW9ucyBvYmplY3QuCi0KLSAgYGNoYW5nZU1ldGFg
IC0gQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0g
IGNvbXB1dGVkLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0KLSAgICAg
LSBgcHJvcGVydHlgIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQotICAgICAtIGBwcm9wZXJ0eU5hbWVg
IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0Ci0KLSAgYGluc3RhbmNlTWV0
YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCi0gIGluZm9ybWF0
aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQot
ICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0
aW1lcyBhIGdpdmVuCi0gIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4K
LQotCi0gIFRoZSBgcmVtb3ZlZEl0ZW1gIGFuZCBgYWRkZWRJdGVtYCBmdW5jdGlvbnMgYm90aCBo
YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgZnVuY3Rp
b24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKLSAg
YGBgCi0KLSAgYGFjY3VtdWxhdGVkVmFsdWVgIC0gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhl
IGxhc3QgdGltZQotICBgcmVtb3ZlZEl0ZW1gIG9yIGBhZGRlZEl0ZW1gIHdhcyBjYWxsZWQgb3Ig
YGluaXRpYWxWYWx1ZWAuCi0KLSAgYGl0ZW1gIC0gdGhlIGVsZW1lbnQgYWRkZWQgb3IgcmVtb3Zl
ZCBmcm9tIHRoZSBhcnJheQotCi0gIGBjaGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250
YWlucyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICBjaGFuZ2UuIEl0IGNvbnRhaW5zIHRo
ZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLQotICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQg
cHJvcGVydHkKLSAgICAtIGBwcm9wZXJ0eU5hbWVgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBv
biB0aGUgb2JqZWN0Ci0gICAgLSBgaW5kZXhgIHRoZSBpbmRleCBvZiB0aGUgYWRkZWQgb3IgcmVt
b3ZlZCBpdGVtCi0gICAgLSBgaXRlbWAgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbTogdGhpcyBp
cyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICAgICB0aGUgc2Vjb25kIGFyZwotICAgIC0gYGFycmF5
Q2hhbmdlZGAgdGhlIGFycmF5IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuIENhbiBiZQotICAg
ICAgdXNlZnVsIHdoZW4gZGVwZW5kaW5nIG9uIG11bHRpcGxlIGFycmF5cy4KLQotICBGb3IgcHJv
cGVydHkgY2hhbmdlcyB0cmlnZ2VyZWQgb24gYW4gaXRlbSBwcm9wZXJ0eSBjaGFuZ2UgKHdoZW4K
LSAgZGVwS2V5IGlzIHNvbWV0aGluZyBsaWtlIGBzb21lQXJyYXkuQGVhY2guc29tZVByb3BlcnR5
YCksCi0gIGBjaGFuZ2VNZXRhYCB3aWxsIGFsc28gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3Bl
cnR5OgotCi0gICAgLSBgcHJldmlvdXNWYWx1ZXNgIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0
aGUgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgb24KLSAgICB0aGUgaXRlbSwgYW5kIHdob3NlIHZh
bHVlcyBhcmUgdGhlIGl0ZW0ncyBwcmV2aW91cyB2YWx1ZXMuCi0KLSAgYHByZXZpb3VzVmFsdWVz
YCBpcyBpbXBvcnRhbnQgRW1iZXIgY29hbGVzY2VzIGl0ZW0gcHJvcGVydHkgY2hhbmdlcyB2aWEK
LSAgRW1iZXIucnVuLm9uY2UuIFRoaXMgbWVhbnMgdGhhdCBieSB0aGUgdGltZSByZW1vdmVkSXRl
bSBnZXRzIGNhbGxlZCwgaXRlbSBoYXMKLSAgdGhlIG5ldyB2YWx1ZXMsIGJ1dCB5b3UgbWF5IG5l
ZWQgdGhlIHByZXZpb3VzIHZhbHVlIChlZyBmb3Igc29ydGluZyAmCi0gIGZpbHRlcmluZykuCi0K
LSAgYGluc3RhbmNlTWV0YWAgLSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBt
ZXRhCi0gIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgeW91ciBjb21wdXRlZC4g
Rm9yIGV4YW1wbGUgYQotICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNlIHRoaXMgdG8gc3RvcmUg
dGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCi0gIGVsZW1lbnQgaXMgZm91bmQgaW4gdGhlIGRl
cGVuZGVudCBhcnJheS4KLQotICBUaGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVu
Y3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIGFjY3VtdWxhdGVkCi0gIHZhbHVlLiBJdCBpcyBhY2Nl
cHRhYmxlIHRvIG5vdCByZXR1cm4gYW55dGhpbmcgKGllIHJldHVybiB1bmRlZmluZWQpCi0gIHRv
IGludmFsaWRhdGUgdGhlIGNvbXB1dGF0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgYSBnb29k
IGlkZWEgZm9yCi0gIGFycmF5Q29tcHV0ZWQgYnV0IGl0J3MgdXNlZCBpbiBlZyBtYXggYW5kIG1p
bi4KLQotICBOb3RlIHRoYXQgb2JzZXJ2ZXJzIHdpbGwgYmUgZmlyZWQgaWYgZWl0aGVyIG9mIHRo
ZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZQotICB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgYWNj
dW11bGF0ZWQgdmFsdWUuICBXaGVuIHJldHVybmluZyBhbiBvYmplY3QgdGhhdAotICBtdXRhdGVz
IGluIHJlc3BvbnNlIHRvIGFycmF5IGNoYW5nZXMsIGZvciBleGFtcGxlIGFuIGFycmF5IHRoYXQg
bWFwcwotICBldmVyeXRoaW5nIGZyb20gc29tZSBvdGhlciBhcnJheSAoc2VlIGBFbWJlci5jb21w
dXRlZC5tYXBgKSwgaXQgaXMgdXN1YWxseQotICBpbXBvcnRhbnQgdGhhdCB0aGUgKnNhbWUqIGFy
cmF5IGJlIHJldHVybmVkIHRvIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIG9ic2VydmVy
cy4KLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5jb21wdXRlZC5tYXgg
PSBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7Ci0gICAgcmV0dXJuIEVtYmVyLnJlZHVjZUNvbXB1
dGVkLmNhbGwobnVsbCwgZGVwZW5kZW50S2V5LCB7Ci0gICAgICBpbml0aWFsVmFsdWU6IC1JbmZp
bml0eSwKLQotICAgICAgYWRkZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRl
bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChh
Y2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsKLSAgICAgIH0sCi0KLSAgICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICAgIGlmIChpdGVtIDwgYWNjdW11bGF0ZWRWYWx1ZSkgewotICAgICAgICAgIHJl
dHVybiBhY2N1bXVsYXRlZFZhbHVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH07
Ci0gIGBgYAotCi0gIERlcGVuZGVudCBrZXlzIG1heSByZWZlciB0byBgQHRoaXNgIHRvIG9ic2Vy
dmUgY2hhbmdlcyB0byB0aGUgb2JqZWN0IGl0c2VsZiwKLSAgd2hpY2ggbXVzdCBiZSBhcnJheS1s
aWtlLCByYXRoZXIgdGhhbiBhIHByb3BlcnR5IG9mIHRoZSBvYmplY3QuICBUaGlzIGlzCi0gIG1v
c3RseSB1c2VmdWwgZm9yIGFycmF5IHByb3hpZXMsIHRvIGVuc3VyZSBvYmplY3RzIGFyZSByZXRy
aWV2ZWQgdmlhCi0gIGBvYmplY3RBdENvbnRlbnRgLiAgVGhpcyBpcyBob3cgeW91IGNvdWxkIHNv
cnQgaXRlbXMgYnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIGFuIGl0ZW0gY29udHJvbGxlci4KLQot
ICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVvcGxlQ29udHJvbGxlciA9IEVt
YmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGl0ZW1Db250cm9sbGVyOiAncGVyc29u
JywKLQotICAgIHNvcnRlZFBlb3BsZTogRW1iZXIuY29tcHV0ZWQuc29ydCgnQHRoaXMuQGVhY2gu
cmV2ZXJzZWROYW1lJywgZnVuY3Rpb24ocGVyc29uQSwgcGVyc29uQikgewotICAgICAgLy8gYHJl
dmVyc2VkTmFtZWAgaXNuJ3QgZGVmaW5lZCBvbiBQZXJzb24sIGJ1dCB3ZSBoYXZlIGFjY2VzcyB0
byBpdCB2aWEKLSAgICAgIC8vIHRoZSBpdGVtIGNvbnRyb2xsZXIgQXBwLlBlcnNvbkNvbnRyb2xs
ZXIuICBJZiB3ZSdkIHVzZWQKLSAgICAgIC8vIGBjb250ZW50LkBlYWNoLnJldmVyc2VkTmFtZWAg
YWJvdmUsIHdlIHdvdWxkIGJlIGdldHRpbmcgdGhlIG9iamVjdHMKLSAgICAgIC8vIGRpcmVjdGx5
IGFuZCBub3QgaGF2ZSBhY2Nlc3MgdG8gYHJldmVyc2VkTmFtZWAuCi0gICAgICAvLwotICAgICAg
dmFyIHJldmVyc2VkTmFtZUEgPSBnZXQocGVyc29uQSwgJ3JldmVyc2VkTmFtZScpLAotICAgICAg
ICAgIHJldmVyc2VkTmFtZUIgPSBnZXQocGVyc29uQiwgJ3JldmVyc2VkTmFtZScpOwotCi0gICAg
ICByZXR1cm4gRW1iZXIuY29tcGFyZShyZXZlcnNlZE5hbWVBLCByZXZlcnNlZE5hbWVCKTsKLSAg
ICB9KQotICB9KTsKLQotICBBcHAuUGVyc29uQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRy
b2xsZXIuZXh0ZW5kKHsKLSAgICByZXZlcnNlZE5hbWU6IGZ1bmN0aW9uICgpIHsKLSAgICAgIHJl
dHVybiByZXZlcnNlKGdldCh0aGlzLCAnbmFtZScpKTsKLSAgICB9LnByb3BlcnR5KCduYW1lJykK
LSAgfSkKLSAgYGBgCi0KLSAgRGVwZW5kZW50IGtleXMgd2hvc2UgdmFsdWVzIGFyZSBub3QgYXJy
YXlzIGFyZSB0cmVhdGVkIGFzIHJlZ3VsYXIKLSAgZGVwZW5kZW5jaWVzOiB3aGVuIHRoZXkgY2hh
bmdlLCB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgY29tcGxldGVseQotICByZWNhbGN1bGF0ZWQu
ICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhhdmUgZGVwZW5kZW50IGFycmF5cyB3aXRoIHNp
bWlsYXIKLSAgc2VtYW50aWNzLiAgRGVwZW5kZW50IGtleXMgd2hpY2ggZW5kIGluIGAuW11gIGRv
IG5vdCB1c2UgIm9uZSBhdCBhIHRpbWUiCi0gIHNlbWFudGljcy4gIFdoZW4gYW4gaXRlbSBpcyBh
ZGRlZCBvciByZW1vdmVkIGZyb20gc3VjaCBhIGRlcGVuZGVuY3ksIHRoZQotICBjb21wdXRlZCBw
cm9wZXJ0eSBpcyBjb21wbGV0ZWx5IHJlY29tcHV0ZWQuCi0KLSAgRXhhbXBsZQotCi0gIGBgYGph
dmFzY3JpcHQKLSAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgLy8gV2hlbiBgc3RyaW5nYCBp
cyBjaGFuZ2VkLCBgY29tcHV0ZWRgIGlzIGNvbXBsZXRlbHkgcmVjb21wdXRlZC4KLSAgICBzdHJp
bmc6ICdhIHN0cmluZycsCi0KLSAgICAvLyBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYGFycmF5
YCwgYGFkZGVkSXRlbWAgaXMgY2FsbGVkLgotICAgIGFycmF5OiBbXSwKLQotICAgIC8vIFdoZW4g
YW4gaXRlbSBpcyBhZGRlZCB0byBgYW5vdGhlckFycmF5YCwgYGNvbXB1dGVkYCBpcyBjb21wbGV0
ZWx5Ci0gICAgLy8gcmVjb21wdXRlZC4KLSAgICBhbm90aGVyQXJyYXk6IFtdLAotCi0gICAgY29t
cHV0ZWQ6IEVtYmVyLnJlZHVjZUNvbXB1dGVkKCdzdHJpbmcnLCAnYXJyYXknLCAnYW5vdGhlckFy
cmF5LltdJywgewotICAgICAgYWRkZWRJdGVtOiBhZGRlZEl0ZW1DYWxsYmFjaywKLSAgICAgIHJl
bW92ZWRJdGVtOiByZW1vdmVkSXRlbUNhbGxiYWNrCi0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0g
IEBtZXRob2QgcmVkdWNlQ29tcHV0ZWQKLSAgQGZvciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30g
W2RlcGVuZGVudEtleXMqXQotICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICBAcmV0dXJuIHtF
bWJlci5Db21wdXRlZFByb3BlcnR5fQotKi8KLUVtYmVyLnJlZHVjZUNvbXB1dGVkID0gZnVuY3Rp
b24gKG9wdGlvbnMpIHsKLSAgdmFyIGFyZ3M7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAx
KSB7Ci0gICAgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKTsKLSAgICBvcHRp
b25zID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdOwotICB9Ci0KLSAgaWYgKHR5cGVv
ZiBvcHRpb25zICE9PSAib2JqZWN0IikgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiUmVk
dWNlIENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7
Ci0gIH0KLQotICBpZiAoISgnaW5pdGlhbFZhbHVlJyBpbiBvcHRpb25zKSkgewotICAgIHRocm93
IG5ldyBFbWJlci5FcnJvcigiUmVkdWNlIENvbXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhv
dXQgYW4gaW5pdGlhbCB2YWx1ZSIpOwotICB9Ci0KLSAgdmFyIGNwID0gbmV3IFJlZHVjZUNvbXB1
dGVkUHJvcGVydHkob3B0aW9ucyk7Ci0KLSAgaWYgKGFyZ3MpIHsKLSAgICBjcC5wcm9wZXJ0eS5h
cHBseShjcCwgYXJncyk7Ci0gIH0KLQotICByZXR1cm4gY3A7Ci19OwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotdmFyIFJlZHVjZUNvbXB1dGVkUHJvcGVydHkgPSBFbWJlci5SZWR1Y2VD
b21wdXRlZFByb3BlcnR5LAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAgICBvX2NyZWF0ZSA9
IEVtYmVyLmNyZWF0ZSwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVh
Y2g7Ci0KLWZ1bmN0aW9uIEFycmF5Q29tcHV0ZWRQcm9wZXJ0eSgpIHsKLSAgdmFyIGNwID0gdGhp
czsKLQotICBSZWR1Y2VDb21wdXRlZFByb3BlcnR5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0K
LSAgdGhpcy5mdW5jID0gKGZ1bmN0aW9uKHJlZHVjZUZ1bmMpIHsKLSAgICByZXR1cm4gZnVuY3Rp
b24gKHByb3BlcnR5TmFtZSkgewotICAgICAgaWYgKCFjcC5faGFzSW5zdGFuY2VNZXRhKHRoaXMs
IHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgLy8gV2hlbiB3ZSByZWNvbXB1dGUgYW4gYXJyYXkg
Y29tcHV0ZWQgcHJvcGVydHksIHdlIG5lZWQgYWxyZWFkeQotICAgICAgICAvLyByZXRyaWV2ZWQg
YXJyYXlzIHRvIGJlIHVwZGF0ZWQ7IHdlIGNhbid0IHNpbXBseSBlbXB0eSB0aGUgY2FjaGUgYW5k
Ci0gICAgICAgIC8vIGhvcGUgdGhlIGFycmF5IGlzIHJlLXJldHJpZXZlZC4KLSAgICAgICAgZm9y
RWFjaChjcC5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7Ci0gICAgICAg
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgIGNwLnJlY29tcHV0ZU9uY2UuY2FsbCh0aGlzLCBwcm9wZXJ0eU5hbWUpOwotICAg
ICAgICAgIH0pOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJl
ZHVjZUZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgICB9OwotICB9KSh0aGlzLmZ1bmMp
OwotCi0gIHJldHVybiB0aGlzOwotfQotRW1iZXIuQXJyYXlDb21wdXRlZFByb3BlcnR5ID0gQXJy
YXlDb21wdXRlZFByb3BlcnR5OwotQXJyYXlDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZSA9IG9f
Y3JlYXRlKFJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlKTsKLUFycmF5Q29tcHV0ZWRQ
cm9wZXJ0eS5wcm90b3R5cGUuaW5pdGlhbFZhbHVlID0gZnVuY3Rpb24gKCkgewotICByZXR1cm4g
RW1iZXIuQSgpOwotfTsKLUFycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUucmVzZXRWYWx1
ZSA9IGZ1bmN0aW9uIChhcnJheSkgewotICBhcnJheS5jbGVhcigpOwotICByZXR1cm4gYXJyYXk7
Ci19OwotCi0vLyBUaGlzIGlzIGEgc3RvcGdhcCB0byBrZWVwIHRoZSByZWZlcmVuY2UgY291bnRz
IGNvcnJlY3Qgd2l0aCBsYXp5IENQcy4KLUFycmF5Q29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUu
ZGlkQ2hhbmdlID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgewotICByZXR1cm47Ci19OwotCi0v
KioKLSAgQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG9wZXJhdGVzIG9uIGRlcGVu
ZGVudCBhcnJheXMgYW5kCi0gIGlzIHVwZGF0ZWQgd2l0aCAib25lIGF0IGEgdGltZSIgc2VtYW50
aWNzLiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCBvcgotICByZW1vdmVkIGZyb20gdGhlIGRlcGVuZGVu
dCBhcnJheShzKSBhbiBhcnJheSBjb21wdXRlZCBvbmx5IG9wZXJhdGVzCi0gIG9uIHRoZSBjaGFu
Z2UgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nIHRoZSBlbnRpcmUgYXJyYXkuIFRoaXMgc2hvdWxk
Ci0gIHJldHVybiBhbiBhcnJheSwgaWYgeW91J2QgbGlrZSB0byB1c2UgIm9uZSBhdCBhIHRpbWUi
IHNlbWFudGljcyBhbmQKLSAgY29tcHV0ZSBzb21lIHZhbHVlIG90aGVyIHRoZW4gYW4gYXJyYXkg
bG9vayBhdAotICBgRW1iZXIucmVkdWNlQ29tcHV0ZWRgLgotCi0gIElmIHRoZXJlIGFyZSBtb3Jl
IHRoYW4gb25lIGFyZ3VtZW50cyB0aGUgZmlyc3QgYXJndW1lbnRzIGFyZQotICBjb25zaWRlcmVk
IHRvIGJlIGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlzLiBUaGUgbGFzdCBhcmd1bWVudCBpcwotICBy
ZXF1aXJlZCB0byBiZSBhbiBvcHRpb25zIG9iamVjdC4gVGhlIG9wdGlvbnMgb2JqZWN0IGNhbiBo
YXZlIHRoZQotICBmb2xsb3dpbmcgdGhyZWUgcHJvcGVydGllcy4KLQotICBgaW5pdGlhbGl6ZWAg
LSBBbiBvcHRpb25hbCBpbml0aWFsaXplIGZ1bmN0aW9uLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJl
IHVzZWQKLSAgdG8gc2V0IHVwIHN0YXRlIG9uIHRoZSBpbnN0YW5jZU1ldGEgb2JqZWN0LgotCi0g
IGByZW1vdmVkSXRlbWAgLSBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBl
bGVtZW50IGlzCi0gIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuCi0KLSAgYGFkZGVkSXRlbWAgLSBB
IGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBlbGVtZW50IGlzCi0gIGFkZGVk
IHRvIHRoZSBhcnJheS4KLQotCi0gIFRoZSBgaW5pdGlhbGl6ZWAgZnVuY3Rpb24gaGFzIHRoZSBm
b2xsb3dpbmcgc2lnbmF0dXJlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgIGZ1bmN0aW9uIChhcnJh
eSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQotICBgYGAKLQotICBgYXJyYXlgIC0gVGhlIGlu
aXRpYWwgdmFsdWUgb2YgdGhlIGFycmF5Q29tcHV0ZWQsIGFuIGVtcHR5IGFycmF5LgotCi0gIGBj
aGFuZ2VNZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIGFi
b3V0IHRoZQotICBjb21wdXRlZC4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVz
OgotCi0gICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0ZWQgcHJvcGVydHkKLSAgICAgLSBgcHJv
cGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdAotCi0gIGBp
bnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgbWV0YQot
ICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0ZWQuIEZvciBl
eGFtcGxlIGEKLSAgdW5pcXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlzIHRvIHN0b3JlIHRoZSBu
dW1iZXIgb2YgdGltZXMgYSBnaXZlbgotICBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBkZXBlbmRl
bnQgYXJyYXkuCi0KLQotICBUaGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rp
b25zIGJvdGggaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5j
ZU1ldGEpCi0gIGBgYAotCi0gIGBhY2N1bXVsYXRlZFZhbHVlYCAtIFRoZSB2YWx1ZSByZXR1cm5l
ZCBmcm9tIHRoZSBsYXN0IHRpbWUKLSAgYHJlbW92ZWRJdGVtYCBvciBgYWRkZWRJdGVtYCB3YXMg
Y2FsbGVkIG9yIGFuIGVtcHR5IGFycmF5LgotCi0gIGBpdGVtYCAtIHRoZSBlbGVtZW50IGFkZGVk
IG9yIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkKLQotICBgY2hhbmdlTWV0YWAgLSBBbiBvYmplY3Qg
d2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAgY2hhbmdlLiBJdCBj
b250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0KLSAgICAtIGBwcm9wZXJ0eWAgdGhl
IGNvbXB1dGVkIHByb3BlcnR5Ci0gICAgLSBgcHJvcGVydHlOYW1lYCB0aGUgbmFtZSBvZiB0aGUg
cHJvcGVydHkgb24gdGhlIG9iamVjdAotICAgIC0gYGluZGV4YCB0aGUgaW5kZXggb2YgdGhlIGFk
ZGVkIG9yIHJlbW92ZWQgaXRlbQotICAgIC0gYGl0ZW1gIHRoZSBhZGRlZCBvciByZW1vdmVkIGl0
ZW06IHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcwotICAgICAgdGhlIHNlY29uZCBhcmcKLSAg
ICAtIGBhcnJheUNoYW5nZWRgIHRoZSBhcnJheSB0aGF0IHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBD
YW4gYmUKLSAgICAgIHVzZWZ1bCB3aGVuIGRlcGVuZGluZyBvbiBtdWx0aXBsZSBhcnJheXMuCi0K
LSAgRm9yIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVkIG9uIGFuIGl0ZW0gcHJvcGVydHkgY2hh
bmdlICh3aGVuCi0gIGRlcEtleSBpcyBzb21ldGhpbmcgbGlrZSBgc29tZUFycmF5LkBlYWNoLnNv
bWVQcm9wZXJ0eWApLAotICBgY2hhbmdlTWV0YWAgd2lsbCBhbHNvIGNvbnRhaW4gdGhlIGZvbGxv
d2luZyBwcm9wZXJ0eToKLQotICAgIC0gYHByZXZpb3VzVmFsdWVzYCBhbiBvYmplY3Qgd2hvc2Ug
a2V5cyBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VkIG9uCi0gICAgdGhlIGl0ZW0sIGFu
ZCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBpdGVtJ3MgcHJldmlvdXMgdmFsdWVzLgotCi0gIGBwcmV2
aW91c1ZhbHVlc2AgaXMgaW1wb3J0YW50IEVtYmVyIGNvYWxlc2NlcyBpdGVtIHByb3BlcnR5IGNo
YW5nZXMgdmlhCi0gIEVtYmVyLnJ1bi5vbmNlLiBUaGlzIG1lYW5zIHRoYXQgYnkgdGhlIHRpbWUg
cmVtb3ZlZEl0ZW0gZ2V0cyBjYWxsZWQsIGl0ZW0gaGFzCi0gIHRoZSBuZXcgdmFsdWVzLCBidXQg
eW91IG1heSBuZWVkIHRoZSBwcmV2aW91cyB2YWx1ZSAoZWcgZm9yIHNvcnRpbmcgJgotICBmaWx0
ZXJpbmcpLgotCi0gIGBpbnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQg
dG8gc3RvcmUgbWV0YQotICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIg
Y29tcHV0ZWQuIEZvciBleGFtcGxlIGEKLSAgdW5pcXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlz
IHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnaXZlbgotICBlbGVtZW50IGlzIGZvdW5k
IGluIHRoZSBkZXBlbmRlbnQgYXJyYXkuCi0KLSAgVGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRl
ZEl0ZW1gIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBhY2N1bXVsYXRlZAotICB2YWx1ZS4g
SXQgaXMgYWNjZXB0YWJsZSB0byBub3QgcmV0dXJuIGFueXRoaW5nIChpZSByZXR1cm4gdW5kZWZp
bmVkKQotICB0byBpbnZhbGlkYXRlIHRoZSBjb21wdXRhdGlvbi4gVGhpcyBpcyBnZW5lcmFsbHkg
bm90IGEgZ29vZCBpZGVhIGZvcgotICBhcnJheUNvbXB1dGVkIGJ1dCBpdCdzIHVzZWQgaW4gZWcg
bWF4IGFuZCBtaW4uCi0KLSAgRXhhbXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuY29t
cHV0ZWQubWFwID0gZnVuY3Rpb24oZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgewotICAgIHZhciBv
cHRpb25zID0gewotICAgICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdl
TWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIHZhciBtYXBwZWQgPSBjYWxsYmFjayhpdGVt
KTsKLSAgICAgICAgYXJyYXkuaW5zZXJ0QXQoY2hhbmdlTWV0YS5pbmRleCwgbWFwcGVkKTsKLSAg
ICAgICAgcmV0dXJuIGFycmF5OwotICAgICAgfSwKLSAgICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlv
bihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICAgIGFycmF5
LnJlbW92ZUF0KGNoYW5nZU1ldGEuaW5kZXgsIDEpOwotICAgICAgICByZXR1cm4gYXJyYXk7Ci0g
ICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVkKGRlcGVuZGVu
dEtleSwgb3B0aW9ucyk7Ci0gIH07Ci0gIGBgYAotCi0gIEBtZXRob2QgYXJyYXlDb21wdXRlZAot
ICBAZm9yIEVtYmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBbZGVwZW5kZW50S2V5cypdCi0gIEBwYXJh
bSB7T2JqZWN0fSBvcHRpb25zCi0gIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9Ci0q
LwotRW1iZXIuYXJyYXlDb21wdXRlZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7Ci0gIHZhciBhcmdz
OwotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewotICAgIGFyZ3MgPSBhX3NsaWNlLmNh
bGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0gICAgb3B0aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu
dHMsIC0xKVswXTsKLSAgfQotCi0gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gIm9iamVjdCIpIHsK
LSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkFycmF5IENvbXB1dGVkIFByb3BlcnR5IGRlY2xh
cmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBoYXNoIik7Ci0gIH0KLQotICB2YXIgY3AgPSBuZXcgQXJy
YXlDb21wdXRlZFByb3BlcnR5KG9wdGlvbnMpOwotCi0gIGlmIChhcmdzKSB7Ci0gICAgY3AucHJv
cGVydHkuYXBwbHkoY3AsIGFyZ3MpOwotICB9Ci0KLSAgcmV0dXJuIGNwOwotfTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci1ydW50aW1lCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHNldCA9IEVtYmVyLnNl
dCwKLSAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwKLSAgICBtZXJnZSA9IEVtYmVyLm1lcmdl
LAotICAgIGFfc2xpY2UgPSBbXS5zbGljZSwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJs
ZVV0aWxzLmZvckVhY2gsCi0gICAgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwKLSAg
ICBTZWFyY2hQcm94eTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxjdWxh
dGVzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZQotICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2ls
bCByZXR1cm4gYC1JbmZpbml0eWAgd2hlbiB0aGUgZGVwZW5kZW50Ci0gIGFycmF5IGlzIGVtcHR5
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQo
ewotICAgIGNoaWxkQWdlczogRW1iZXIuY29tcHV0ZWQubWFwQnkoJ2NoaWxkcmVuJywgJ2FnZScp
LAotICAgIG1heENoaWxkQWdlOiBFbWJlci5jb21wdXRlZC5tYXgoJ2NoaWxkQWdlcycpCi0gIH0p
OwotCi0gIHZhciBsb3JkQnlyb24gPSBBcHAuUGVyc29uLmNyZWF0ZSh7Y2hpbGRyZW46IFtdfSk7
Ci0gIGxvcmRCeXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIC1JbmZpbml0eQotICBsb3JkQnly
b24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3QoewotICAgIG5hbWU6ICdBdWd1c3RhIEFkYSBC
eXJvbicsIGFnZTogNwotICB9KTsKLSAgbG9yZEJ5cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8g
NwotICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7Ci0gICAgbmFtZTog
J0FsbGVncmEgQnlyb24nLAotICAgIGFnZTogNQotICB9LCB7Ci0gICAgbmFtZTogJ0VsaXphYmV0
aCBNZWRvcmEgTGVpZ2gnLAotICAgIGFnZTogOAotICB9XSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21h
eENoaWxkQWdlJyk7IC8vIDgKLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5tYXgKLSAgQGZv
ciBFbWJlcgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEByZXR1cm4ge0VtYmVy
LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIHRoZSBsYXJnZXN0IHZhbHVlIGluIHRoZSBkZXBl
bmRlbnRLZXkncyBhcnJheQotKi8KLUVtYmVyLmNvbXB1dGVkLm1heCA9IGZ1bmN0aW9uIChkZXBl
bmRlbnRLZXkpIHsKLSAgcmV0dXJuIEVtYmVyLnJlZHVjZUNvbXB1dGVkLmNhbGwobnVsbCwgZGVw
ZW5kZW50S2V5LCB7Ci0gICAgaW5pdGlhbFZhbHVlOiAtSW5maW5pdHksCi0KLSAgICBhZGRlZEl0
ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5j
ZU1ldGEpIHsKLSAgICAgIHJldHVybiBNYXRoLm1heChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtKTsK
LSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBp
dGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIGlmIChpdGVtIDwgYWNjdW11
bGF0ZWRWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWRWYWx1ZTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0pOwotfTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxj
dWxhdGVzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZQotICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMg
d2lsbCByZXR1cm4gYEluZmluaXR5YCB3aGVuIHRoZSBkZXBlbmRlbnQKLSAgYXJyYXkgaXMgZW1w
dHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZCh7Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdl
JyksCi0gICAgbWluQ2hpbGRBZ2U6IEVtYmVyLmNvbXB1dGVkLm1pbignY2hpbGRBZ2VzJykKLSAg
fSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjogW119
KTsKLSAgbG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRBZ2UnKTsgLy8gSW5maW5pdHkKLSAgbG9yZEJ5
cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0KHsKLSAgICBuYW1lOiAnQXVndXN0YSBBZGEg
Qnlyb24nLCBhZ2U6IDcKLSAgfSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ21pbkNoaWxkQWdlJyk7IC8v
IDcKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbewotICAgIG5hbWU6
ICdBbGxlZ3JhIEJ5cm9uJywKLSAgICBhZ2U6IDUKLSAgfSwgewotICAgIG5hbWU6ICdFbGl6YWJl
dGggTWVkb3JhIExlaWdoJywKLSAgICBhZ2U6IDgKLSAgfV0pOwotICBsb3JkQnlyb24uZ2V0KCdt
aW5DaGlsZEFnZScpOyAvLyA1Ci0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubWluCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gdGhlIGRl
cGVuZGVudEtleSdzIGFycmF5Ci0qLwotRW1iZXIuY29tcHV0ZWQubWluID0gZnVuY3Rpb24gKGRl
cGVuZGVudEtleSkgewotICByZXR1cm4gRW1iZXIucmVkdWNlQ29tcHV0ZWQuY2FsbChudWxsLCBk
ZXBlbmRlbnRLZXksIHsKLSAgICBpbml0aWFsVmFsdWU6IEluZmluaXR5LAotCi0gICAgYWRkZWRJ
dGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFu
Y2VNZXRhKSB7Ci0gICAgICByZXR1cm4gTWF0aC5taW4oYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSk7
Ci0gICAgfSwKLQotICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwg
aXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpZiAoaXRlbSA+IGFjY3Vt
dWxhdGVkVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkVmFsdWU7Ci0gICAgICB9
Ci0gICAgfQotICB9KTsKLX07Ci0KLS8qKgotICBSZXR1cm5zIGFuIGFycmF5IG1hcHBlZCB2aWEg
dGhlIGNhbGxiYWNrCi0KLSAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQg
aGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4KLSAgYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0
ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIGZ1bmN0aW9uKGl0ZW0p
OwotICBgYGAKLQotICBFeGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIGV4Y2l0aW5nQ2hvcmVzOiBFbWJlci5jb21wdXRl
ZC5tYXAoJ2Nob3JlcycsIGZ1bmN0aW9uKGNob3JlKSB7Ci0gICAgICByZXR1cm4gY2hvcmUudG9V
cHBlckNhc2UoKSArICchJzsKLSAgICB9KQotICB9KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5I
YW1zdGVyLmNyZWF0ZSh7Ci0gICAgY2hvcmVzOiBbJ2NsZWFuJywgJ3dyaXRlIG1vcmUgdW5pdCB0
ZXN0cyddCi0gIH0pOwotICBoYW1zdGVyLmdldCgnZXhjaXRpbmdDaG9yZXMnKTsgLy8gWydDTEVB
TiEnLCAnV1JJVEUgTU9SRSBVTklUIFRFU1RTISddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0
ZWQubWFwCi0gIEBmb3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBA
cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl
cnR5fSBhbiBhcnJheSBtYXBwZWQgdmlhIHRoZSBjYWxsYmFjawotKi8KLUVtYmVyLmNvbXB1dGVk
Lm1hcCA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgY2FsbGJhY2spIHsKLSAgdmFyIG9wdGlvbnMg
PSB7Ci0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5z
dGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgbWFwcGVkID0gY2FsbGJhY2suY2FsbCh0aGlzLCBpdGVt
KTsKLSAgICAgIGFycmF5Lmluc2VydEF0KGNoYW5nZU1ldGEuaW5kZXgsIG1hcHBlZCk7Ci0gICAg
ICByZXR1cm4gYXJyYXk7Ci0gICAgfSwKLSAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24oYXJyYXks
IGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewotICAgICAgYXJyYXkucmVtb3ZlQXQo
Y2hhbmdlTWV0YS5pbmRleCwgMSk7Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICB9Owot
Ci0gIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVkKGRlcGVuZGVudEtleSwgb3B0aW9ucyk7Ci19
OwotCi0vKioKLSAgUmV0dXJucyBhbiBhcnJheSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXku
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7
Ci0gICAgY2hpbGRBZ2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJykK
LSAgfSk7Ci0KLSAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtjaGlsZHJlbjog
W119KTsKLSAgbG9yZEJ5cm9uLmdldCgnY2hpbGRBZ2VzJyk7IC8vIFtdCi0gIGxvcmRCeXJvbi5n
ZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdCh7bmFtZTogJ0F1Z3VzdGEgQWRhIEJ5cm9uJywgYWdl
OiA3fSk7Ci0gIGxvcmRCeXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbN10KLSAgbG9yZEJ5cm9u
LmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0cyhbewotICAgIG5hbWU6ICdBbGxlZ3JhIEJ5cm9u
JywKLSAgICBhZ2U6IDUKLSAgfSwgewotICAgIG5hbWU6ICdFbGl6YWJldGggTWVkb3JhIExlaWdo
JywKLSAgICBhZ2U6IDgKLSAgfV0pOwotICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsgLy8g
WzcsIDUsIDhdCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQubWFwQnkKLSAgQGZvciBFbWJl
cgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSBwcm9w
ZXJ0eUtleQotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBhbiBhcnJheSBtYXBw
ZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkKLSovCi1FbWJlci5jb21wdXRlZC5tYXBCeSA9IGZ1bmN0
aW9uKGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXkpIHsKLSAgdmFyIGNhbGxiYWNrID0gZnVuY3Rp
b24oaXRlbSkgeyByZXR1cm4gZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsgfTsKLSAgcmV0dXJuIEVt
YmVyLmNvbXB1dGVkLm1hcChkZXBlbmRlbnRLZXkgKyAnLkBlYWNoLicgKyBwcm9wZXJ0eUtleSwg
Y2FsbGJhY2spOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY29tcHV0ZWQubWFwUHJvcGVydHkKLSAg
QGZvciBFbWJlcgotICBAZGVwcmVjYXRlZCBVc2UgYEVtYmVyLmNvbXB1dGVkLm1hcEJ5YCBpbnN0
ZWFkCi0gIEBwYXJhbSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHByb3BlcnR5S2V5Ci0qLwotRW1i
ZXIuY29tcHV0ZWQubWFwUHJvcGVydHkgPSBFbWJlci5jb21wdXRlZC5tYXBCeTsKLQotLyoqCi0g
IEZpbHRlcnMgdGhlIGFycmF5IGJ5IHRoZSBjYWxsYmFjay4KLQotICBUaGUgY2FsbGJhY2sgbWV0
aG9kIHlvdSBwcm92aWRlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlLgotICBg
aXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgZnVuY3Rpb24oaXRlbSk7Ci0gIGBgYAotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBw
LkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAgICByZW1haW5pbmdDaG9yZXM6IEVt
YmVyLmNvbXB1dGVkLmZpbHRlcignY2hvcmVzJywgZnVuY3Rpb24oY2hvcmUpIHsKLSAgICAgIHJl
dHVybiAhY2hvcmUuZG9uZTsKLSAgICB9KQotICB9KTsKLQotICB2YXIgaGFtc3RlciA9IEFwcC5I
YW1zdGVyLmNyZWF0ZSh7Y2hvcmVzOiBbCi0gICAge25hbWU6ICdjb29rJywgZG9uZTogdHJ1ZX0s
Ci0gICAge25hbWU6ICdjbGVhbicsIGRvbmU6IHRydWV9LAotICAgIHtuYW1lOiAnd3JpdGUgbW9y
ZSB1bml0IHRlc3RzJywgZG9uZTogZmFsc2V9Ci0gIF19KTsKLSAgaGFtc3Rlci5nZXQoJ3JlbWFp
bmluZ0Nob3JlcycpOyAvLyBbe25hbWU6ICd3cml0ZSBtb3JlIHVuaXQgdGVzdHMnLCBkb25lOiBm
YWxzZX1dCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuZmlsdGVyCi0gIEBmb3IgRW1iZXIK
LSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQotICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs
YmFjawotICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJy
YXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0ZXIgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIGNh
bGxiYWNrKSB7Ci0gIHZhciBvcHRpb25zID0gewotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChh
cnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0YW5jZU1ldGEuZmls
dGVyZWRBcnJheUluZGV4ZXMgPSBuZXcgRW1iZXIuU3ViQXJyYXkoKTsKLSAgICB9LAotCi0gICAg
YWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh
KSB7Ci0gICAgICB2YXIgbWF0Y2ggPSAhIWNhbGxiYWNrLmNhbGwodGhpcywgaXRlbSksCi0gICAg
ICAgICAgZmlsdGVySW5kZXggPSBpbnN0YW5jZU1ldGEuZmlsdGVyZWRBcnJheUluZGV4ZXMuYWRk
SXRlbShjaGFuZ2VNZXRhLmluZGV4LCBtYXRjaCk7Ci0KLSAgICAgIGlmIChtYXRjaCkgewotICAg
ICAgICBhcnJheS5pbnNlcnRBdChmaWx0ZXJJbmRleCwgaXRlbSk7Ci0gICAgICB9Ci0KLSAgICAg
IHJldHVybiBhcnJheTsKLSAgICB9LAotCi0gICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGFycmF5
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBmaWx0ZXJJbmRl
eCA9IGluc3RhbmNlTWV0YS5maWx0ZXJlZEFycmF5SW5kZXhlcy5yZW1vdmVJdGVtKGNoYW5nZU1l
dGEuaW5kZXgpOwotCi0gICAgICBpZiAoZmlsdGVySW5kZXggPiAtMSkgewotICAgICAgICBhcnJh
eS5yZW1vdmVBdChmaWx0ZXJJbmRleCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9Ci0gIH07Ci0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50S2V5
LCBvcHRpb25zKTsKLX07Ci0KLS8qKgotICBGaWx0ZXJzIHRoZSBhcnJheSBieSB0aGUgcHJvcGVy
dHkgYW5kIHZhbHVlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9i
amVjdC5leHRlbmQoewotICAgIHJlbWFpbmluZ0Nob3JlczogRW1iZXIuY29tcHV0ZWQuZmlsdGVy
QnkoJ2Nob3JlcycsICdkb25lJywgZmFsc2UpCi0gIH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBw
LkhhbXN0ZXIuY3JlYXRlKHtjaG9yZXM6IFsKLSAgICB7bmFtZTogJ2Nvb2snLCBkb25lOiB0cnVl
fSwKLSAgICB7bmFtZTogJ2NsZWFuJywgZG9uZTogdHJ1ZX0sCi0gICAge25hbWU6ICd3cml0ZSBt
b3JlIHVuaXQgdGVzdHMnLCBkb25lOiBmYWxzZX0KLSAgXX0pOwotICBoYW1zdGVyLmdldCgncmVt
YWluaW5nQ2hvcmVzJyk7IC8vIFt7bmFtZTogJ3dyaXRlIG1vcmUgdW5pdCB0ZXN0cycsIGRvbmU6
IGZhbHNlfV0KLSAgYGBgCi0KLSAgQG1ldGhvZCBjb21wdXRlZC5maWx0ZXJCeQotICBAZm9yIEVt
YmVyCi0gIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtTdHJpbmd9IHBy
b3BlcnR5S2V5Ci0gIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZQotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC5maWx0
ZXJCeSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgcHJvcGVydHlLZXksIHZhbHVlKSB7Ci0gIHZh
ciBjYWxsYmFjazsKLQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgIGNhbGxi
YWNrID0gZnVuY3Rpb24oaXRlbSkgewotICAgICAgcmV0dXJuIGdldChpdGVtLCBwcm9wZXJ0eUtl
eSk7Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsK
LSAgICAgIHJldHVybiBnZXQoaXRlbSwgcHJvcGVydHlLZXkpID09PSB2YWx1ZTsKLSAgICB9Owot
ICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkLmZpbHRlcihkZXBlbmRlbnRLZXkgKyAnLkBl
YWNoLicgKyBwcm9wZXJ0eUtleSwgY2FsbGJhY2spOwotfTsKLQotLyoqCi0gIEBtZXRob2QgY29t
cHV0ZWQuZmlsdGVyUHJvcGVydHkKLSAgQGZvciBFbWJlcgotICBAcGFyYW0gZGVwZW5kZW50S2V5
Ci0gIEBwYXJhbSBwcm9wZXJ0eUtleQotICBAcGFyYW0gdmFsdWUKLSAgQGRlcHJlY2F0ZWQgVXNl
IGBFbWJlci5jb21wdXRlZC5maWx0ZXJCeWAgaW5zdGVhZAotKi8KLUVtYmVyLmNvbXB1dGVkLmZp
bHRlclByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnk7Ci0KLS8qKgotICBBIGNvbXB1
dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlIHVuaXF1
ZQotICBlbGVtZW50cyBmcm9tIG9uZSBvciBtb3JlIGRlcGVuZGVudCBhcnJheXMuCi0KLSAgRXhh
bXBsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0
ZW5kKHsKLSAgICB1bmlxdWVGcnVpdHM6IEVtYmVyLmNvbXB1dGVkLnVuaXEoJ2ZydWl0cycpCi0g
IH0pOwotCi0gIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHtmcnVpdHM6IFsKLSAg
ICAnYmFuYW5hJywKLSAgICAnZ3JhcGUnLAotICAgICdrYWxlJywKLSAgICAnYmFuYW5hJwotICBd
fSk7Ci0gIGhhbXN0ZXIuZ2V0KCd1bmlxdWVGcnVpdHMnKTsgLy8gWydiYW5hbmEnLCAnZ3JhcGUn
LCAna2FsZSddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQudW5pcQotICBAZm9yIEVtYmVy
Ci0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eUtleSoKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0
ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgdGhlCi0gIHVuaXF1ZSBl
bGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKLSovCi1FbWJlci5jb21wdXRlZC51bmlx
ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0g
IGFyZ3MucHVzaCh7Ci0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXJyYXksIGNoYW5nZU1ldGEs
IGluc3RhbmNlTWV0YSkgewotICAgICAgaW5zdGFuY2VNZXRhLml0ZW1Db3VudHMgPSB7fTsKLSAg
ICB9LAotCi0gICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwg
aW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgZ3VpZCA9IGd1aWRGb3IoaXRlbSk7Ci0KLSAgICAg
IGlmICghaW5zdGFuY2VNZXRhLml0ZW1Db3VudHNbZ3VpZF0pIHsKLSAgICAgICAgaW5zdGFuY2VN
ZXRhLml0ZW1Db3VudHNbZ3VpZF0gPSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKytpbnN0
YW5jZU1ldGEuaXRlbUNvdW50c1tndWlkXTsKLSAgICAgIH0KLSAgICAgIGFycmF5LmFkZE9iamVj
dChpdGVtKTsKLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbihhcnJheSwgaXRlbSwgXywgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2YXIgZ3VpZCA9
IGd1aWRGb3IoaXRlbSksCi0gICAgICAgICAgaXRlbUNvdW50cyA9IGluc3RhbmNlTWV0YS5pdGVt
Q291bnRzOwotCi0gICAgICBpZiAoLS1pdGVtQ291bnRzW2d1aWRdID09PSAwKSB7Ci0gICAgICAg
IGFycmF5LnJlbW92ZU9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsK
LSAgICB9Ci0gIH0pOwotICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBh
cmdzKTsKLX07Ci0KLS8qKgotICBBbGlhcyBmb3IgW0VtYmVyLmNvbXB1dGVkLnVuaXFdKC9hcGkv
I21ldGhvZF9jb21wdXRlZF91bmlxKS4KLQotICBAbWV0aG9kIGNvbXB1dGVkLnVuaW9uCi0gIEBm
b3IgRW1iZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5KgotICBAcmV0dXJuIHtFbWJl
ci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKLSAg
dW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVuZGVudCBhcnJheQotKi8KLUVtYmVyLmNvbXB1
dGVkLnVuaW9uID0gRW1iZXIuY29tcHV0ZWQudW5pcTsKLQotLyoqCi0gIEEgY29tcHV0ZWQgcHJv
cGVydHkgd2hpY2ggcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUgZHVwbGljYXRlZAot
ICBlbGVtZW50cyBmcm9tIHR3byBvciBtb3JlIGRlcGVuZGVueSBhcnJheXMuCi0KLSAgRXhhbXBs
ZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIG9iaiA9IEVtYmVyLk9iamVjdC5jcmVhdGVXaXRo
TWl4aW5zKHsKLSAgICBhZGFGcmllbmRzOiBbJ0NoYXJsZXMgQmFiYmFnZScsICdKb2huIEhvYmhv
dXNlJywgJ1dpbGxpYW0gS2luZycsICdNYXJ5IFNvbWVydmlsbGUnXSwKLSAgICBjaGFybGVzRnJp
ZW5kczogWydXaWxsaWFtIEtpbmcnLCAnTWFyeSBTb21lcnZpbGxlJywgJ0FkYSBMb3ZlbGFjZScs
ICdHZW9yZ2UgUGVhY29jayddLAotICAgIGZyaWVuZHNJbkNvbW1vbjogRW1iZXIuY29tcHV0ZWQu
aW50ZXJzZWN0KCdhZGFGcmllbmRzJywgJ2NoYXJsZXNGcmllbmRzJykKLSAgfSk7Ci0KLSAgb2Jq
LmdldCgnZnJpZW5kc0luQ29tbW9uJyk7IC8vIFsnV2lsbGlhbSBLaW5nJywgJ01hcnkgU29tZXJ2
aWxsZSddCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuaW50ZXJzZWN0Ci0gIEBmb3IgRW1i
ZXIKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5S2V5KgotICBAcmV0dXJuIHtFbWJlci5Db21w
dXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3aXRoIGFsbCB0aGUKLSAgZHVwbGlj
YXRlZCBlbGVtZW50cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXlzCi0qLwotRW1iZXIuY29tcHV0
ZWQuaW50ZXJzZWN0ID0gZnVuY3Rpb24gKCkgewotICB2YXIgZ2V0RGVwZW5kZW50S2V5R3VpZHMg
PSBmdW5jdGlvbiAoY2hhbmdlTWV0YSkgewotICAgIHJldHVybiBtYXAoY2hhbmdlTWV0YS5wcm9w
ZXJ0eS5fZGVwZW5kZW50S2V5cywgZnVuY3Rpb24gKGRlcGVuZGVudEtleSkgewotICAgICAgcmV0
dXJuIGd1aWRGb3IoZGVwZW5kZW50S2V5KTsKLSAgICB9KTsKLSAgfTsKLQotICB2YXIgYXJncyA9
IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICBhcmdzLnB1c2goewotICAgIGluaXRpYWxpemU6
IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0
YW5jZU1ldGEuaXRlbUNvdW50cyA9IHt9OwotICAgIH0sCi0KLSAgICBhZGRlZEl0ZW06IGZ1bmN0
aW9uKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBp
dGVtR3VpZCA9IGd1aWRGb3IoaXRlbSksCi0gICAgICAgICAgZGVwZW5kZW50R3VpZHMgPSBnZXRE
ZXBlbmRlbnRLZXlHdWlkcyhjaGFuZ2VNZXRhKSwKLSAgICAgICAgICBkZXBlbmRlbnRHdWlkID0g
Z3VpZEZvcihjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCksCi0gICAgICAgICAgbnVtYmVyT2ZEZXBl
bmRlbnRBcnJheXMgPSBjaGFuZ2VNZXRhLnByb3BlcnR5Ll9kZXBlbmRlbnRLZXlzLmxlbmd0aCwK
LSAgICAgICAgICBpdGVtQ291bnRzID0gaW5zdGFuY2VNZXRhLml0ZW1Db3VudHM7Ci0KLSAgICAg
IGlmICghaXRlbUNvdW50c1tpdGVtR3VpZF0pIHsgaXRlbUNvdW50c1tpdGVtR3VpZF0gPSB7fTsg
fQotICAgICAgaWYgKGl0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRl
ZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9Ci0KLSAg
ICAgIGlmICgrK2l0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSAxICYmCi0g
ICAgICAgICAgbnVtYmVyT2ZEZXBlbmRlbnRBcnJheXMgPT09IEVtYmVyLmtleXMoaXRlbUNvdW50
c1tpdGVtR3VpZF0pLmxlbmd0aCkgewotCi0gICAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsK
LSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9LAotICAgIHJlbW92ZWRJdGVtOiBm
dW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICB2
YXIgaXRlbUd1aWQgPSBndWlkRm9yKGl0ZW0pLAotICAgICAgICAgIGRlcGVuZGVudEd1aWRzID0g
Z2V0RGVwZW5kZW50S2V5R3VpZHMoY2hhbmdlTWV0YSksCi0gICAgICAgICAgZGVwZW5kZW50R3Vp
ZCA9IGd1aWRGb3IoY2hhbmdlTWV0YS5hcnJheUNoYW5nZWQpLAotICAgICAgICAgIG51bWJlck9m
RGVwZW5kZW50QXJyYXlzID0gY2hhbmdlTWV0YS5wcm9wZXJ0eS5fZGVwZW5kZW50S2V5cy5sZW5n
dGgsCi0gICAgICAgICAgbnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luLAotICAgICAgICAgIGl0
ZW1Db3VudHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNvdW50czsKLQotICAgICAgaWYgKGl0ZW1Db3Vu
dHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tp
dGVtR3VpZF1bZGVwZW5kZW50R3VpZF0gPSAwOyB9Ci0gICAgICBpZiAoLS1pdGVtQ291bnRzW2l0
ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9PT0gMCkgewotICAgICAgICBkZWxldGUgaXRlbUNvdW50
c1tpdGVtR3VpZF1bZGVwZW5kZW50R3VpZF07Ci0gICAgICAgIG51bWJlck9mQXJyYXlzSXRlbUFw
cGVhcnNJbiA9IEVtYmVyLmtleXMoaXRlbUNvdW50c1tpdGVtR3VpZF0pLmxlbmd0aDsKLQotICAg
ICAgICBpZiAobnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luID09PSAwKSB7Ci0gICAgICAgICAg
ZGVsZXRlIGl0ZW1Db3VudHNbaXRlbUd1aWRdOwotICAgICAgICB9Ci0gICAgICAgIGFycmF5LnJl
bW92ZU9iamVjdChpdGVtKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBhcnJheTsKLSAgICB9Ci0g
IH0pOwotICByZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZC5hcHBseShudWxsLCBhcmdzKTsKLX07
Ci0KLS8qKgotICBBIGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkg
d2l0aCBhbGwgdGhlCi0gIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVwZW5kZW50IGFycmF5
IHRoYXQgYXJlIG5vdCBpbiB0aGUgc2Vjb25kCi0gIGRlcGVuZGVudCBhcnJheS4KLQotICBFeGFt
cGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRl
bmQoewotICAgIGxpa2VzOiBbJ2JhbmFuYScsICdncmFwZScsICdrYWxlJ10sCi0gICAgd2FudHM6
IEVtYmVyLmNvbXB1dGVkLnNldERpZmYoJ2xpa2VzJywgJ2ZydWl0cycpCi0gIH0pOwotCi0gIHZh
ciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIuY3JlYXRlKHtmcnVpdHM6IFsKLSAgICAnZ3JhcGUnLAot
ICAgICdrYWxlJywKLSAgXX0pOwotICBoYW1zdGVyLmdldCgnd2FudHMnKTsgLy8gWydiYW5hbmEn
XQotICBgYGAKLQotICBAbWV0aG9kIGNvbXB1dGVkLnNldERpZmYKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0ge1N0cmluZ30gc2V0QVByb3BlcnR5Ci0gIEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVy
dHkKLSAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJy
YXkgd2l0aCBhbGwgdGhlCi0gIGl0ZW1zIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVudCBhcnJheSB0
aGF0IGFyZSBub3QgaW4gdGhlIHNlY29uZAotICBkZXBlbmRlbnQgYXJyYXkKLSovCi1FbWJlci5j
b21wdXRlZC5zZXREaWZmID0gZnVuY3Rpb24gKHNldEFQcm9wZXJ0eSwgc2V0QlByb3BlcnR5KSB7
Ci0gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAyKSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVy
cm9yKCJzZXREaWZmIHJlcXVpcmVzIGV4YWN0bHkgdHdvIGRlcGVuZGVudCBhcnJheXMuIik7Ci0g
IH0KLSAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQuY2FsbChudWxsLCBzZXRBUHJvcGVydHks
IHNldEJQcm9wZXJ0eSwgewotICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBj
aGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBzZXRBID0gZ2V0KHRoaXMsIHNl
dEFQcm9wZXJ0eSksCi0gICAgICAgICAgc2V0QiA9IGdldCh0aGlzLCBzZXRCUHJvcGVydHkpOwot
Ci0gICAgICBpZiAoY2hhbmdlTWV0YS5hcnJheUNoYW5nZWQgPT09IHNldEEpIHsKLSAgICAgICAg
aWYgKCFzZXRCLmNvbnRhaW5zKGl0ZW0pKSB7Ci0gICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KGl0
ZW0pOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcnJheS5yZW1vdmVPYmpl
Y3QoaXRlbSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfSwKLQotICAgIHJl
bW92ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0
YSkgewotICAgICAgdmFyIHNldEEgPSBnZXQodGhpcywgc2V0QVByb3BlcnR5KSwKLSAgICAgICAg
ICBzZXRCID0gZ2V0KHRoaXMsIHNldEJQcm9wZXJ0eSk7Ci0KLSAgICAgIGlmIChjaGFuZ2VNZXRh
LmFycmF5Q2hhbmdlZCA9PT0gc2V0QikgewotICAgICAgICBpZiAoc2V0QS5jb250YWlucyhpdGVt
KSkgewotICAgICAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKLSAgICAgICAgfQotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgYXJyYXkucmVtb3ZlT2JqZWN0KGl0ZW0pOwotICAgICAgfQotICAg
ICAgcmV0dXJuIGFycmF5OwotICAgIH0KLSAgfSk7Ci19OwotCi1mdW5jdGlvbiBiaW5hcnlTZWFy
Y2goYXJyYXksIGl0ZW0sIGxvdywgaGlnaCkgewotICB2YXIgbWlkLCBtaWRJdGVtLCByZXMsIGd1
aWRNaWQsIGd1aWRJdGVtOwotCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgeyBoaWdoID0g
Z2V0KGFycmF5LCAnbGVuZ3RoJyk7IH0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7IGxv
dyA9IDA7IH0KLQotICBpZiAobG93ID09PSBoaWdoKSB7Ci0gICAgcmV0dXJuIGxvdzsKLSAgfQot
Ci0gIG1pZCA9IGxvdyArIE1hdGguZmxvb3IoKGhpZ2ggLSBsb3cpIC8gMik7Ci0gIG1pZEl0ZW0g
PSBhcnJheS5vYmplY3RBdChtaWQpOwotCi0gIGd1aWRNaWQgPSBfZ3VpZEZvcihtaWRJdGVtKTsK
LSAgZ3VpZEl0ZW0gPSBfZ3VpZEZvcihpdGVtKTsKLQotICBpZiAoZ3VpZE1pZCA9PT0gZ3VpZEl0
ZW0pIHsKLSAgICByZXR1cm4gbWlkOwotICB9Ci0KLSAgcmVzID0gdGhpcy5vcmRlcihtaWRJdGVt
LCBpdGVtKTsKLSAgaWYgKHJlcyA9PT0gMCkgewotICAgIHJlcyA9IGd1aWRNaWQgPCBndWlkSXRl
bSA/IC0xIDogMTsKLSAgfQotCi0KLSAgaWYgKHJlcyA8IDApIHsKLSAgICByZXR1cm4gdGhpcy5i
aW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgfSBlbHNlIGlmIChyZXMg
PiAwKSB7Ci0gICAgcmV0dXJuIHRoaXMuYmluYXJ5U2VhcmNoKGFycmF5LCBpdGVtLCBsb3csIG1p
ZCk7Ci0gIH0KLQotICByZXR1cm4gbWlkOwotCi0gIGZ1bmN0aW9uIF9ndWlkRm9yKGl0ZW0pIHsK
LSAgICBpZiAoU2VhcmNoUHJveHkuZGV0ZWN0SW5zdGFuY2UoaXRlbSkpIHsKLSAgICAgIHJldHVy
biBndWlkRm9yKGdldChpdGVtLCAnY29udGVudCcpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGd1aWRG
b3IoaXRlbSk7Ci0gIH0KLX0KLQotCi1TZWFyY2hQcm94eSA9IEVtYmVyLk9iamVjdFByb3h5LmV4
dGVuZCgpOwotCi0vKioKLSAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3
IGFycmF5IHdpdGggYWxsIHRoZQotICBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGRlcGVuZGVu
dCBhcnJheSBzb3J0ZWQgYmFzZWQgb24gYSBwcm9wZXJ0eQotICBvciBzb3J0IGZ1bmN0aW9uLgot
Ci0gIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxv
d2luZyBzaWduYXR1cmU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBmdW5jdGlvbihpdGVtQSwgaXRl
bUIpOwotICBgYGAKLQotICAtIGBpdGVtQWAgdGhlIGZpcnN0IGl0ZW0gdG8gY29tcGFyZS4KLSAg
LSBgaXRlbUJgIHRoZSBzZWNvbmQgaXRlbSB0byBjb21wYXJlLgotCi0gIFRoaXMgZnVuY3Rpb24g
c2hvdWxkIHJldHVybiBgLTFgIHdoZW4gYGl0ZW1BYCBzaG91bGQgY29tZSBiZWZvcmUKLSAgYGl0
ZW1CYC4gSXQgc2hvdWxkIHJldHVybiBgMWAgd2hlbiBgaXRlbUFgIHNob3VsZCBjb21lIGFmdGVy
Ci0gIGBpdGVtQmAuIElmIHRoZSBgaXRlbUFgIGFuZCBgaXRlbUJgIGFyZSBlcXVhbCB0aGlzIGZ1
bmN0aW9uIHNob3VsZCByZXR1cm4gYDBgLgotCi0gIEV4YW1wbGUKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIHZhciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgIHRvZG9zU29ydGlu
ZzogWyduYW1lJ10sCi0gICAgc29ydGVkVG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9z
JywgJ3RvZG9zU29ydGluZycpLAotICAgIHByaW9yaXR5VG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNv
cnQoJ3RvZG9zJywgZnVuY3Rpb24oYSwgYil7Ci0gICAgICBpZiAoYS5wcmlvcml0eSA+IGIucHJp
b3JpdHkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9IGVsc2UgaWYgKGEucHJpb3JpdHkg
PCBiLnByaW9yaXR5KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIHJldHVy
biAwOwotICAgIH0pLAotICB9KTsKLSAgdmFyIHRvZG9MaXN0ID0gVG9Eb0xpc3QuY3JlYXRlKHt0
b2RvczogWwotICAgIHtuYW1lOiAnVW5pdCBUZXN0JywgcHJpb3JpdHk6IDJ9LAotICAgIHtuYW1l
OiAnRG9jdW1lbnRhdGlvbicsIHByaW9yaXR5OiAzfSwKLSAgICB7bmFtZTogJ1JlbGVhc2UnLCBw
cmlvcml0eTogMX0KLSAgXX0pOwotCi0gIHRvZG9MaXN0LmdldCgnc29ydGVkVG9kb3MnKTsgLy8g
W3tuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3JpdHk6M30sIHtuYW1lOidSZWxlYXNlJywgcHJp
b3JpdHk6MX0sIHtuYW1lOidVbml0IFRlc3QnLCBwcmlvcml0eToyfV0KLSAgdG9kb0xpc3QuZ2V0
KCdwcmlvcml0eVRvZG9zJyk7IC8vIFt7bmFtZTonUmVsZWFzZScsIHByaW9yaXR5OjF9LCB7bmFt
ZTonVW5pdCBUZXN0JywgcHJpb3JpdHk6Mn0sIHtuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3Jp
dHk6M31dCi0gIGBgYAotCi0gIEBtZXRob2QgY29tcHV0ZWQuc29ydAotICBAZm9yIEVtYmVyCi0g
IEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKLSAgQHBhcmFtIHtTdHJpbmcgb3IgRnVuY3Rp
b259IHNvcnREZWZpbml0aW9uIGEgZGVwZW5kZW50IGtleSB0byBhbgotICBhcnJheSBvZiBzb3J0
IHByb3BlcnRpZXMgb3IgYSBmdW5jdGlvbiB0byB1c2Ugd2hlbiBzb3J0aW5nCi0gIEByZXR1cm4g
e0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IHNvcnRlZCBhcnJheSBiYXNl
ZAotICBvbiB0aGUgc29ydCBwcm9wZXJ0eSBhcnJheSBvciBjYWxsYmFjayBmdW5jdGlvbgotKi8K
LUVtYmVyLmNvbXB1dGVkLnNvcnQgPSBmdW5jdGlvbiAoaXRlbXNLZXksIHNvcnREZWZpbml0aW9u
KSB7Ci0gIEVtYmVyLmFzc2VydCgiRW1iZXIuY29tcHV0ZWQuc29ydCByZXF1aXJlcyB0d28gYXJn
dW1lbnRzOiBhbiBhcnJheSBrZXkgdG8gc29ydCBhbmQgZWl0aGVyIGEgc29ydCBwcm9wZXJ0aWVz
IGtleSBvciBzb3J0IGZ1bmN0aW9uIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0KLSAgdmFy
IGluaXRGbiwgc29ydFByb3BlcnRpZXNLZXk7Ci0KLSAgaWYgKHR5cGVvZiBzb3J0RGVmaW5pdGlv
biA9PT0gJ2Z1bmN0aW9uJykgewotICAgIGluaXRGbiA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdl
TWV0YSwgaW5zdGFuY2VNZXRhKSB7Ci0gICAgICBpbnN0YW5jZU1ldGEub3JkZXIgPSBzb3J0RGVm
aW5pdGlvbjsKLSAgICAgIGluc3RhbmNlTWV0YS5iaW5hcnlTZWFyY2ggPSBiaW5hcnlTZWFyY2g7
Ci0gICAgfTsKLSAgfSBlbHNlIHsKLSAgICBzb3J0UHJvcGVydGllc0tleSA9IHNvcnREZWZpbml0
aW9uOwotICAgIGluaXRGbiA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VN
ZXRhKSB7Ci0gICAgICBmdW5jdGlvbiBzZXR1cFNvcnRQcm9wZXJ0aWVzKCkgewotICAgICAgICB2
YXIgc29ydFByb3BlcnR5RGVmaW5pdGlvbnMgPSBnZXQodGhpcywgc29ydFByb3BlcnRpZXNLZXkp
LAotICAgICAgICAgICAgc29ydFByb3BlcnR5LAotICAgICAgICAgICAgc29ydFByb3BlcnRpZXMg
PSBpbnN0YW5jZU1ldGEuc29ydFByb3BlcnRpZXMgPSBbXSwKLSAgICAgICAgICAgIHNvcnRQcm9w
ZXJ0eUFzY2VuZGluZyA9IGluc3RhbmNlTWV0YS5zb3J0UHJvcGVydHlBc2NlbmRpbmcgPSB7fSwK
LSAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgIGFzYzsKLQotICAgICAgICBFbWJlci5hc3Nl
cnQoIkNhbm5vdCBzb3J0OiAnIiArIHNvcnRQcm9wZXJ0aWVzS2V5ICsgIicgaXMgbm90IGFuIGFy
cmF5LiIsIEVtYmVyLmlzQXJyYXkoc29ydFByb3BlcnR5RGVmaW5pdGlvbnMpKTsKLQotICAgICAg
ICBjaGFuZ2VNZXRhLnByb3BlcnR5LmNsZWFySXRlbVByb3BlcnR5S2V5cyhpdGVtc0tleSk7Ci0K
LSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydHlEZWZpbml0aW9ucywgZnVuY3Rpb24gKHNvcnRQ
cm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgICBpZiAoKGlkeCA9IHNvcnRQcm9wZXJ0eURl
ZmluaXRpb24uaW5kZXhPZignOicpKSAhPT0gLTEpIHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0
eSA9IHNvcnRQcm9wZXJ0eURlZmluaXRpb24uc3Vic3RyaW5nKDAsIGlkeCk7Ci0gICAgICAgICAg
ICBhc2MgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9uLnN1YnN0cmluZyhpZHgrMSkudG9Mb3dlckNh
c2UoKSAhPT0gJ2Rlc2MnOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb3J0UHJv
cGVydHkgPSBzb3J0UHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgYXNjID0gdHJ1ZTsK
LSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzb3J0UHJvcGVydGllcy5wdXNoKHNvcnRQcm9wZXJ0
eSk7Ci0gICAgICAgICAgc29ydFByb3BlcnR5QXNjZW5kaW5nW3NvcnRQcm9wZXJ0eV0gPSBhc2M7
Ci0gICAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5pdGVtUHJvcGVydHlLZXkoaXRlbXNLZXks
IHNvcnRQcm9wZXJ0eSk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNvcnRQcm9wZXJ0eURlZmlu
aXRpb25zLmFkZE9ic2VydmVyKCdAZWFjaCcsIHRoaXMsIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25j
ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSgp
IHsKLSAgICAgICAgRW1iZXIucnVuLm9uY2UodGhpcywgdXBkYXRlU29ydFByb3BlcnRpZXMsIGNo
YW5nZU1ldGEucHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gdXBkYXRl
U29ydFByb3BlcnRpZXMocHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHNldHVwU29ydFByb3BlcnRp
ZXMuY2FsbCh0aGlzKTsKLSAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5yZWNvbXB1dGVPbmNl
LmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuYWRkT2Jz
ZXJ2ZXIodGhpcywgc29ydFByb3BlcnRpZXNLZXksIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7
Ci0KLSAgICAgIHNldHVwU29ydFByb3BlcnRpZXMuY2FsbCh0aGlzKTsKLQotCi0gICAgICBpbnN0
YW5jZU1ldGEub3JkZXIgPSBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7Ci0gICAgICAgIHZhciBz
b3J0UHJvcGVydHksIHJlc3VsdCwgYXNjOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRo
aXMuc29ydFByb3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICBzb3J0UHJvcGVydHkg
PSB0aGlzLnNvcnRQcm9wZXJ0aWVzW2ldOwotICAgICAgICAgIHJlc3VsdCA9IEVtYmVyLmNvbXBh
cmUoZ2V0KGl0ZW1BLCBzb3J0UHJvcGVydHkpLCBnZXQoaXRlbUIsIHNvcnRQcm9wZXJ0eSkpOwot
Ci0gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkgewotICAgICAgICAgICAgYXNjID0gdGhpcy5z
b3J0UHJvcGVydHlBc2NlbmRpbmdbc29ydFByb3BlcnR5XTsKLSAgICAgICAgICAgIHJldHVybiBh
c2MgPyByZXN1bHQgOiAoLTEgKiByZXN1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiAwOwotICAgICAgfTsKLQotICAgICAgaW5zdGFuY2VNZXRhLmJpbmFyeVNl
YXJjaCA9IGJpbmFyeVNlYXJjaDsKLSAgICB9OwotICB9Ci0KLSAgcmV0dXJuIEVtYmVyLmFycmF5
Q29tcHV0ZWQuY2FsbChudWxsLCBpdGVtc0tleSwgewotICAgIGluaXRpYWxpemU6IGluaXRGbiwK
LQotICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0
YW5jZU1ldGEpIHsKLSAgICAgIHZhciBpbmRleCA9IGluc3RhbmNlTWV0YS5iaW5hcnlTZWFyY2go
YXJyYXksIGl0ZW0pOwotICAgICAgYXJyYXkuaW5zZXJ0QXQoaW5kZXgsIGl0ZW0pOwotICAgICAg
cmV0dXJuIGFycmF5OwotICAgIH0sCi0KLSAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24gKGFycmF5
LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKLSAgICAgIHZhciBwcm94eVByb3Bl
cnRpZXMsIGluZGV4LCBzZWFyY2hJdGVtOwotCi0gICAgICBpZiAoY2hhbmdlTWV0YS5wcmV2aW91
c1ZhbHVlcykgewotICAgICAgICBwcm94eVByb3BlcnRpZXMgPSBtZXJnZSh7IGNvbnRlbnQ6IGl0
ZW0gfSwgY2hhbmdlTWV0YS5wcmV2aW91c1ZhbHVlcyk7Ci0KLSAgICAgICAgc2VhcmNoSXRlbSA9
IFNlYXJjaFByb3h5LmNyZWF0ZShwcm94eVByb3BlcnRpZXMpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgc2VhcmNoSXRlbSA9IGl0ZW07Ci0gICAgICB9Ci0KLSAgICAgIGluZGV4ID0gaW5zdGFu
Y2VNZXRhLmJpbmFyeVNlYXJjaChhcnJheSwgc2VhcmNoSXRlbSk7Ci0gICAgICBhcnJheS5yZW1v
dmVBdChpbmRleCk7Ci0gICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotICB9KTsKLX07Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5SU1ZQID0gcmVxdWlyZU1vZHVsZSgncnN2
cCcpOwotCi1FbWJlci5SU1ZQLm9uZXJyb3JEZWZhdWx0ID0gZnVuY3Rpb24oZXJyb3IpIHsKLSAg
aWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsKLSAgICBpZiAoRW1iZXIudGVzdGluZykgewot
ICAgICAgaWYgKEVtYmVyLlRlc3QgJiYgRW1iZXIuVGVzdC5hZGFwdGVyKSB7Ci0gICAgICAgIEVt
YmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb24oZXJyb3IpOwotICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhyb3cgZXJyb3I7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVtYmVyLkxvZ2dl
ci5lcnJvcihlcnJvci5zdGFjayk7Ci0gICAgICBFbWJlci5hc3NlcnQoZXJyb3IsIGZhbHNlKTsK
LSAgICB9Ci0gIH0KLX07Ci0KLUVtYmVyLlJTVlAub24oJ2Vycm9yJywgRW1iZXIuUlNWUC5vbmVy
cm9yRGVmYXVsdCk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGFfc2xpY2UgPSBBcnJh
eS5wcm90b3R5cGUuc2xpY2U7Ci0KLQotaWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0
cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uKSB7Ci0KLSAgLyoqCi0gICAg
VGhlIGBwcm9wZXJ0eWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5
cGUgaXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBF
bWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMKLSAgICBgdHJ1ZWAsIHdoaWNoIGlz
IHRoZSBkZWZhdWx0LgotCi0gICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhbGxvdyB5b3UgdG8gdHJl
YXQgYSBmdW5jdGlvbiBsaWtlIGEgcHJvcGVydHk6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
TXlBcHAuUHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBmaXJzdE5hbWU6
ICcnLAotICAgICAgbGFzdE5hbWU6ICAnJywKLQotICAgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkg
ewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQo
J2xhc3ROYW1lJyk7Ci0KLSAgICAgICAgLy8gQ2FsbCB0aGlzIGZsYWcgdG8gbWFyayB0aGUgZnVu
Y3Rpb24gYXMgYSBwcm9wZXJ0eQotICAgICAgfS5wcm9wZXJ0eSgpCi0gICAgfSk7Ci0KLSAgICB2
YXIgcHJlc2lkZW50ID0gTXlBcHAuUHJlc2lkZW50LmNyZWF0ZSh7Ci0gICAgICBmaXJzdE5hbWU6
ICJCYXJhY2siLAotICAgICAgbGFzdE5hbWU6ICJPYmFtYSIKLSAgICB9KTsKLQotICAgIHByZXNp
ZGVudC5nZXQoJ2Z1bGxOYW1lJyk7ICAgIC8vICJCYXJhY2sgT2JhbWEiCi0gICAgYGBgCi0KLSAg
ICBUcmVhdGluZyBhIGZ1bmN0aW9uIGxpa2UgYSBwcm9wZXJ0eSBpcyB1c2VmdWwgYmVjYXVzZSB0
aGV5IGNhbiB3b3JrIHdpdGgKLSAgICBiaW5kaW5ncywganVzdCBsaWtlIGFueSBvdGhlciBwcm9w
ZXJ0eS4KLQotICAgIE1hbnkgY29tcHV0ZWQgcHJvcGVydGllcyBoYXZlIGRlcGVuZGVuY2llcyBv
biBvdGhlciBwcm9wZXJ0aWVzLiBGb3IKLSAgICBleGFtcGxlLCBpbiB0aGUgYWJvdmUgZXhhbXBs
ZSwgdGhlIGBmdWxsTmFtZWAgcHJvcGVydHkgZGVwZW5kcyBvbgotICAgIGBmaXJzdE5hbWVgIGFu
ZCBgbGFzdE5hbWVgIHRvIGRldGVybWluZSBpdHMgdmFsdWUuIFlvdSBjYW4gdGVsbCBFbWJlcgot
ICAgIGFib3V0IHRoZXNlIGRlcGVuZGVuY2llcyBsaWtlIHRoaXM6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgTXlBcHAuUHJlc2lkZW50ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICBm
aXJzdE5hbWU6ICcnLAotICAgICAgbGFzdE5hbWU6ICAnJywKLQotICAgICAgZnVsbE5hbWU6IGZ1
bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsg
dGhpcy5nZXQoJ2xhc3ROYW1lJyk7Ci0KLSAgICAgICAgLy8gVGVsbCBFbWJlci5qcyB0aGF0IHRo
aXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBmaXJzdE5hbWUKLSAgICAgICAgLy8gYW5k
IGxhc3ROYW1lCi0gICAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgTWFrZSBzdXJlIHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2ll
cyBzbyBFbWJlciBrbm93cyB3aGVuIHRvIHVwZGF0ZQotICAgIGJpbmRpbmdzIHRoYXQgY29ubmVj
dCB0byBhIGNvbXB1dGVkIHByb3BlcnR5LiBDaGFuZ2luZyBhIGRlcGVuZGVuY3kKLSAgICB3aWxs
IG5vdCBpbW1lZGlhdGVseSB0cmlnZ2VyIGFuIHVwZGF0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVy
dHksIGJ1dAotICAgIHdpbGwgaW5zdGVhZCBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1
cGRhdGVkIHdoZW4gdGhlIG5leHQgYGdldGAKLSAgICBpcyBjYWxsZWQgb24gdGhlIHByb3BlcnR5
LgotCi0gICAgU2VlIFtFbWJlci5Db21wdXRlZFByb3BlcnR5XSgvYXBpL2NsYXNzZXMvRW1iZXIu
Q29tcHV0ZWRQcm9wZXJ0eS5odG1sKSwgW0VtYmVyLmNvbXB1dGVkXSgvYXBpLyNtZXRob2RfY29t
cHV0ZWQpLgotCi0gICAgQG1ldGhvZCBwcm9wZXJ0eQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8K
LSAgRnVuY3Rpb24ucHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJl
dCA9IEVtYmVyLmNvbXB1dGVkKHRoaXMpOwotICAgIC8vIENvbXB1dGVkUHJvcGVydHkucHJvdG90
eXBlLnByb3BlcnR5IGV4cGFuZHMgcHJvcGVydGllczsgbm8gbmVlZCBmb3IgdXMgdG8KLSAgICAv
LyBkbyBzbyBoZXJlLgotICAgIHJldHVybiByZXQucHJvcGVydHkuYXBwbHkocmV0LCBhcmd1bWVu
dHMpOwotICB9OwotCi0gIC8qKgotICAgIFRoZSBgb2JzZXJ2ZXNgIGV4dGVuc2lvbiBvZiBKYXZh
c2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzIGF2YWlsYWJsZQotICAgIHdoZW4gYEVtYmVy
LkVYVEVORF9QUk9UT1RZUEVTYCBvciBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMuRnVuY3Rpb25g
IGlzCi0gICAgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9ic2Vy
dmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNgCi0gICAg
Y2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRo
YXQgeW91IHdyaXRlLgotICAgIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAgICAgdmFsdWVPYnNlcnZlcjogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIC8vIEV4ZWN1dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5n
ZXMKLSAgICAgIH0ub2JzZXJ2ZXMoJ3ZhbHVlJykKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElu
IHRoZSBmdXR1cmUgdGhpcyBtZXRob2QgbWF5IGJlY29tZSBhc3luY2hyb25vdXMuIElmIHlvdSB3
YW50IHRvIGVuc3VyZQotICAgIHN5bmNocm9ub3VzIGJlaGF2aW9yLCB1c2UgYG9ic2VydmVzSW1t
ZWRpYXRlbHlgLgotCi0gICAgU2VlIGBFbWJlci5vYnNlcnZlcmAuCi0KLSAgICBAbWV0aG9kIG9i
c2VydmVzCi0gICAgQGZvciBGdW5jdGlvbgotICAqLwotICBGdW5jdGlvbi5wcm90b3R5cGUub2Jz
ZXJ2ZXMgPSBmdW5jdGlvbigpIHsKLSAgICAKLSAgICAgIHRoaXMuX19lbWJlcl9vYnNlcnZlc19f
ID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7Ci0gICAgCi0KLSAgICByZXR1cm4gdGhpczsKLSAg
fTsKLQotICAvKioKLSAgICBUaGUgYG9ic2VydmVzSW1tZWRpYXRlbHlgIGV4dGVuc2lvbiBvZiBK
YXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBlIGlzCi0gICAgYXZhaWxhYmxlIHdoZW4gYEVt
YmVyLkVYVEVORF9QUk9UT1RZUEVTYCBvcgotICAgIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5G
dW5jdGlvbmAgaXMgdHJ1ZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCi0KLSAgICBZb3UgY2FuIG9i
c2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNJbW1l
ZGlhdGVseWAKLSAgICBjYWxsIHRvIHRoZSBlbmQgb2YgeW91ciBtZXRob2QgZGVjbGFyYXRpb25z
IGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7Ci0gICAgICB2YWx1ZU9ic2VydmVy
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhl
ICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcwotICAgICAgfS5vYnNlcnZlc0ltbWVkaWF0ZWx5KCd2
YWx1ZScpCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBJbiB0aGUgZnV0dXJlLCBgb2JzZXJ2ZXNg
IG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0aGlzIGV2ZW50LAotICAgIGBvYnNlcnZlc0lt
bWVkaWF0ZWx5YCB3aWxsIG1haW50YWluIHRoZSBzeW5jaHJvbm91cyBiZWhhdmlvci4KLQotICAg
IFNlZSBgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXJgLgotCi0gICAgQG1ldGhvZCBvYnNlcnZlc0lt
bWVkaWF0ZWx5Ci0gICAgQGZvciBGdW5jdGlvbgotICAqLwotICBGdW5jdGlvbi5wcm90b3R5cGUu
b2JzZXJ2ZXNJbW1lZGlhdGVseSA9IGZ1bmN0aW9uKCkgewotICAgIGZvciAodmFyIGk9MCwgbD1h
cmd1bWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tp
XTsKLSAgICAgIEVtYmVyLmFzc2VydCgiSW1tZWRpYXRlIG9ic2VydmVycyBtdXN0IG9ic2VydmUg
aW50ZXJuYWwgcHJvcGVydGllcyBvbmx5LCBub3QgcHJvcGVydGllcyBvbiBvdGhlciBvYmplY3Rz
LiIsIGFyZy5pbmRleE9mKCcuJykgPT09IC0xKTsKLSAgICB9Ci0KLSAgICAvLyBvYnNlcnZlcyBo
YW5kbGVzIHByb3BlcnR5IGV4cGFuc2lvbgotICAgIHJldHVybiB0aGlzLm9ic2VydmVzLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH07Ci0KLSAgLyoqCi0gICAgVGhlIGBvYnNlcnZlc0JlZm9y
ZWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMKLSAgICBh
dmFpbGFibGUgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yCi0gICAgYEVtYmVyLkVY
VEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcyB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4K
LQotICAgIFlvdSBjYW4gZ2V0IG5vdGlmaWVkIHdoZW4gYSBwcm9wZXJ0eSBjaGFuZ2UgaXMgYWJv
dXQgdG8gaGFwcGVuIGJ5Ci0gICAgYnkgYWRkaW5nIHRoZSBgb2JzZXJ2ZXNCZWZvcmVgIGNhbGwg
dG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZAotICAgIGRlY2xhcmF0aW9ucyBpbiBjbGFzc2VzIHRo
YXQgeW91IHdyaXRlLiBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJl
ci5PYmplY3QuZXh0ZW5kKHsKLSAgICAgIHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgewotICAg
ICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBpcyBhYm91dCB0
byBjaGFuZ2UKLSAgICAgIH0ub2JzZXJ2ZXNCZWZvcmUoJ3ZhbHVlJykKLSAgICB9KTsKLSAgICBg
YGAKLQotICAgIFNlZSBgRW1iZXIuYmVmb3JlT2JzZXJ2ZXJgLgotCi0gICAgQG1ldGhvZCBvYnNl
cnZlc0JlZm9yZQotICAgIEBmb3IgRnVuY3Rpb24KLSAgKi8KLSAgRnVuY3Rpb24ucHJvdG90eXBl
Lm9ic2VydmVzQmVmb3JlID0gZnVuY3Rpb24oKSB7Ci0gICAgCi0gICAgICB0aGlzLl9fZW1iZXJf
b2JzZXJ2ZXNCZWZvcmVfXyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgIAotCi0gICAg
cmV0dXJuIHRoaXM7Ci0gIH07Ci0KLSAgLyoqCi0gICAgVGhlIGBvbmAgZXh0ZW5zaW9uIG9mIEph
dmFzY3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCi0gICAgd2hlbiBgRW1i
ZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlv
bmAgaXMKLSAgICB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KLQotICAgIFlvdSBjYW4gbGlz
dGVuIGZvciBldmVudHMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9uYCBjYWxsIHRvIHRoZSBlbmQg
b2YKLSAgICB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyBvciBtaXhpbnMgdGhh
dCB5b3Ugd3JpdGUuIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVy
Lk1peGluLmNyZWF0ZSh7Ci0gICAgICBkb1NvbWV0aGluZ1dpdGhFbGVtZW50OiBmdW5jdGlvbigp
IHsKLSAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJkaWRJbnNlcnRFbGVtZW50IiBl
dmVudCBmaXJlcwotICAgICAgfS5vbignZGlkSW5zZXJ0RWxlbWVudCcpCi0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBTZWUgYEVtYmVyLm9uYC4KLQotICAgIEBtZXRob2Qgb24KLSAgICBAZm9yIEZ1
bmN0aW9uCi0gICovCi0gIEZ1bmN0aW9uLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkgewotICAg
IHZhciBldmVudHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICB0aGlzLl9fZW1iZXJf
bGlzdGVuc19fID0gZXZlbnRzOwotICAgIHJldHVybiB0aGlzOwotICB9OwotfQotCi0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi0vKioKLSAg
SW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMgZm9yIGNvbXBhcmluZyBvYmplY3RzLiBB
ZGQgdGhpcyBtaXhpbiB0bwotICBhbnkgY2xhc3MgeW91IGNyZWF0ZSB0aGF0IGNhbiBjb21wYXJl
IGl0cyBpbnN0YW5jZXMuCi0KLSAgWW91IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBjb21wYXJlKClg
IG1ldGhvZC4KLQotICBAY2xhc3MgQ29tcGFyYWJsZQotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBz
aW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5Db21wYXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKLQotICAvKioKLSAgICBPdmVycmlkZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29t
cGFyaXNvbiBvZiB0aGUgdHdvIHBhcmFtZXRlcnMuIFRoZQotICAgIGNvbXBhcmUgbWV0aG9kIHNo
b3VsZCByZXR1cm46Ci0KLSAgICAtIGAtMWAgaWYgYGEgPCBiYAotICAgIC0gYDBgIGlmIGBhID09
IGJgCi0gICAgLSBgMWAgaWYgYGEgPiBiYAotCi0gICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBy
YWlzZXMgYW4gZXhjZXB0aW9uLgotCi0gICAgQG1ldGhvZCBjb21wYXJlCi0gICAgQHBhcmFtIGEg
e09iamVjdH0gdGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgQHBhcmFtIGIge09iamVj
dH0gdGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZQotICAgIEByZXR1cm4ge0ludGVnZXJ9IHRo
ZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KLSAgKi8KLSAgY29tcGFyZTogRW1iZXIucmVxdWly
ZWQoRnVuY3Rpb24pCi0KLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEltcGxlbWVudHMgc29t
ZSBzdGFuZGFyZCBtZXRob2RzIGZvciBjb3B5aW5nIGFuIG9iamVjdC4gQWRkIHRoaXMgbWl4aW4g
dG8KLSAgYW55IG9iamVjdCB5b3UgY3JlYXRlIHRoYXQgY2FuIGNyZWF0ZSBhIGNvcHkgb2YgaXRz
ZWxmLiBUaGlzIG1peGluIGlzCi0gIGFkZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGJ1aWx0LWlu
IGFycmF5LgotCi0gIFlvdSBzaG91bGQgZ2VuZXJhbGx5IGltcGxlbWVudCB0aGUgYGNvcHkoKWAg
bWV0aG9kIHRvIHJldHVybiBhIGNvcHkgb2YgdGhlCi0gIHJlY2VpdmVyLgotCi0gIE5vdGUgdGhh
dCBgZnJvemVuQ29weSgpYCB3aWxsIG9ubHkgd29yayBpZiB5b3UgYWxzbyBpbXBsZW1lbnQKLSAg
YEVtYmVyLkZyZWV6YWJsZWAuCi0KLSAgQGNsYXNzIENvcHlhYmxlCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVtYmVyLkNvcHlhYmxlID0gRW1iZXIuTWl4aW4u
Y3JlYXRlKHsKLQotICAvKioKLSAgICBPdmVycmlkZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBy
ZWNlaXZlci4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByYWlzZXMKLSAgICBhbiBleGNlcHRpb24u
Ci0KLSAgICBAbWV0aG9kIGNvcHkKLSAgICBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgaWYgYHRydWVg
LCBhIGRlZXAgY29weSBvZiB0aGUgb2JqZWN0IHNob3VsZCBiZSBtYWRlCi0gICAgQHJldHVybiB7
T2JqZWN0fSBjb3B5IG9mIHJlY2VpdmVyCi0gICovCi0gIGNvcHk6IEVtYmVyLnJlcXVpcmVkKEZ1
bmN0aW9uKSwKLQotICAvKioKLSAgICBJZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgYEVtYmVyLkZy
ZWV6YWJsZWAsIHRoZW4gdGhpcyB3aWxsIHJldHVybiBhIG5ldwotICAgIGNvcHkgaWYgdGhlIG9i
amVjdCBpcyBub3QgZnJvemVuIGFuZCB0aGUgcmVjZWl2ZXIgaWYgdGhlIG9iamVjdCBpcyBmcm96
ZW4uCi0KLSAgICBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHlvdSB0cnkgdG8gY2FsbCB0aGlzIG1l
dGhvZCBvbiBhIG9iamVjdCB0aGF0IGRvZXMKLSAgICBub3Qgc3VwcG9ydCBmcmVlemluZy4KLQot
ICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHdoZW5ldmVyIHlvdSB3YW50IGEgY29weSBv
ZiBhIGZyZWV6YWJsZSBvYmplY3QKLSAgICBzaW5jZSBhIGZyZWV6YWJsZSBvYmplY3QgY2FuIHNp
bXBseSByZXR1cm4gaXRzZWxmIHdpdGhvdXQgYWN0dWFsbHkKLSAgICBjb25zdW1pbmcgbW9yZSBt
ZW1vcnkuCi0KLSAgICBAbWV0aG9kIGZyb3plbkNvcHkKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNv
cHkgb2YgcmVjZWl2ZXIgb3IgcmVjZWl2ZXIKLSAgKi8KLSAgZnJvemVuQ29weTogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKEVtYmVyLkZyZWV6YWJsZSAmJiBFbWJlci5GcmVlemFibGUuZGV0ZWN0KHRo
aXMpKSB7Ci0gICAgICByZXR1cm4gZ2V0KHRoaXMsICdpc0Zyb3plbicpID8gdGhpcyA6IHRoaXMu
Y29weSgpLmZyZWV6ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgRW1iZXIuRXJy
b3IoRW1iZXIuU3RyaW5nLmZtdCgiJUAgZG9lcyBub3Qgc3VwcG9ydCBmcmVlemluZyIsIFt0aGlz
XSkpOwotICAgIH0KLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi12YXIgZ2V0
ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBUaGUgYEVtYmVyLkZyZWV6
YWJsZWAgbWl4aW4gaW1wbGVtZW50cyBzb21lIGJhc2ljIG1ldGhvZHMgZm9yIG1hcmtpbmcgYW4K
LSAgb2JqZWN0IGFzIGZyb3plbi4gT25jZSBhbiBvYmplY3QgaXMgZnJvemVuIGl0IHNob3VsZCBi
ZSByZWFkIG9ubHkuIE5vIGNoYW5nZXMKLSAgbWF5IGJlIG1hZGUgdGhlIGludGVybmFsIHN0YXRl
IG9mIHRoZSBvYmplY3QuCi0KLSAgIyMgRW5mb3JjZW1lbnQKLQotICBUbyBmdWxseSBzdXBwb3J0
IGZyZWV6aW5nIGluIHlvdXIgc3ViY2xhc3MsIHlvdSBtdXN0IGluY2x1ZGUgdGhpcyBtaXhpbiBh
bmQKLSAgb3ZlcnJpZGUgYW55IG1ldGhvZCB0aGF0IG1pZ2h0IGFsdGVyIGFueSBwcm9wZXJ0eSBv
biB0aGUgb2JqZWN0IHRvIGluc3RlYWQKLSAgcmFpc2UgYW4gZXhjZXB0aW9uLiBZb3UgY2FuIGNo
ZWNrIHRoZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkgY2hlY2tpbmcgdGhlCi0gIGBpc0Zyb3plbmAg
cHJvcGVydHkuCi0KLSAgQWx0aG91Z2ggZnV0dXJlIHZlcnNpb25zIG9mIEphdmFTY3JpcHQgbWF5
IHN1cHBvcnQgbGFuZ3VhZ2UtbGV2ZWwgZnJlZXppbmcKLSAgb2JqZWN0IG9iamVjdHMsIHRoYXQg
aXMgbm90IHRoZSBjYXNlIHRvZGF5LiBFdmVuIGlmIGFuIG9iamVjdCBpcyBmcmVlemFibGUsCi0g
IGl0IGlzIHN0aWxsIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgb2JqZWN0LCBl
dmVuIHRob3VnaCBpdCBjb3VsZAotICBicmVhayBvdGhlciBwYXJ0cyBvZiB5b3VyIGFwcGxpY2F0
aW9uIHRoYXQgZG8gbm90IGV4cGVjdCBhIGZyb3plbiBvYmplY3QgdG8KLSAgY2hhbmdlLiBJdCBp
cywgdGhlcmVmb3JlLCB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdSBhbHdheXMgcmVzcGVjdCB0aGUK
LSAgYGlzRnJvemVuYCBwcm9wZXJ0eSBvbiBhbGwgZnJlZXphYmxlIG9iamVjdHMuCi0KLSAgIyMg
RXhhbXBsZSBVc2FnZQotCi0gIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGEgc2ltcGxlIG9iamVj
dCB0aGF0IGltcGxlbWVudCB0aGUgYEVtYmVyLkZyZWV6YWJsZWAKLSAgcHJvdG9jb2wuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBDb250YWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5GcmVl
emFibGUsIHsKLSAgICBmaXJzdE5hbWU6IG51bGwsCi0gICAgbGFzdE5hbWU6IG51bGwsCi0KLSAg
ICAvLyBzd2FwcyB0aGUgbmFtZXMKLSAgICBzd2FwTmFtZXM6IGZ1bmN0aW9uKCkgewotICAgICAg
aWYgKHRoaXMuZ2V0KCdpc0Zyb3plbicpKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJST1I7Ci0gICAg
ICB2YXIgdG1wID0gdGhpcy5nZXQoJ2ZpcnN0TmFtZScpOwotICAgICAgdGhpcy5zZXQoJ2ZpcnN0
TmFtZScsIHRoaXMuZ2V0KCdsYXN0TmFtZScpKTsKLSAgICAgIHRoaXMuc2V0KCdsYXN0TmFtZScs
IHRtcCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgfSk7Ci0KLSAgYyA9IENvbnRh
Y3QuY3JlYXRlKHsgZmlyc3ROYW1lOiAiSm9obiIsIGxhc3ROYW1lOiAiRG9lIiB9KTsKLSAgYy5z
d2FwTmFtZXMoKTsgIC8vIHJldHVybnMgYwotICBjLmZyZWV6ZSgpOwotICBjLnN3YXBOYW1lcygp
OyAgLy8gRVhDRVBUSU9OCi0gIGBgYAotCi0gICMjIENvcHlpbmcKLQotICBVc3VhbGx5IHRoZSBg
RW1iZXIuRnJlZXphYmxlYCBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBpbiBjb29wZXJhdGlvbiB3
aXRoIHRoZQotICBgRW1iZXIuQ29weWFibGVgIHByb3RvY29sLCB3aGljaCBkZWZpbmVzIGEgYGZy
b3plbkNvcHkoKWAgbWV0aG9kIHRoYXQgd2lsbAotICByZXR1cm4gYSBmcm96ZW4gb2JqZWN0LCBp
ZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhpcyBtZXRob2QgYXMgd2VsbC4KLQotICBAY2xhc3Mg
RnJlZXphYmxlCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHNpbmNlIEVtYmVyIDAuOQotKi8KLUVt
YmVyLkZyZWV6YWJsZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0KLSAgLyoqCi0gICAgU2V0IHRv
IGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgZnJvemVuLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBk
ZXRlY3QKLSAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZyb3plbiBvciBub3QuCi0KLSAgICBA
cHJvcGVydHkgaXNGcm96ZW4KLSAgICBAdHlwZSBCb29sZWFuCi0gICovCi0gIGlzRnJvemVuOiBm
YWxzZSwKLQotICAvKioKLSAgICBGcmVlemVzIHRoZSBvYmplY3QuIE9uY2UgdGhpcyBtZXRob2Qg
aGFzIGJlZW4gY2FsbGVkIHRoZSBvYmplY3Qgc2hvdWxkCi0gICAgbm8gbG9uZ2VyIGFsbG93IGFu
eSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZC4KLQotICAgIEBtZXRob2QgZnJlZXplCi0gICAgQHJl
dHVybiB7T2JqZWN0fSByZWNlaXZlcgotICAqLwotICBmcmVlemU6IGZ1bmN0aW9uKCkgewotICAg
IGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHJldHVybiB0aGlzOwotICAgIHNldCh0aGlzLCAn
aXNGcm96ZW4nLCB0cnVlKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi19KTsKLQotRW1iZXIu
RlJPWkVOX0VSUk9SID0gIkZyb3plbiBvYmplY3QgY2Fubm90IGJlIG1vZGlmaWVkLiI7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcnVudGltZQotKi8KLQotdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
Zm9yRWFjaDsKLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgQVBJIGZvciBtb2RpZnlp
bmcgZ2VuZXJpYyBlbnVtZXJhYmxlcy4gVGhlc2UgbWV0aG9kcwotICBjYW4gYmUgYXBwbGllZCB0
byBhbiBvYmplY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIG9yZGVyZWQgb3IKLSAgdW5v
cmRlcmVkLgotCi0gIE5vdGUgdGhhdCBhbiBFbnVtZXJhYmxlIGNhbiBjaGFuZ2UgZXZlbiBpZiBp
dCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBtaXhpbi4KLSAgRm9yIGV4YW1wbGUsIGEgTWFwcGVk
RW51bWVyYWJsZSBjYW5ub3QgYmUgZGlyZWN0bHkgbW9kaWZpZWQgYnV0IGlmIGl0cwotICB1bmRl
cmx5aW5nIGVudW1lcmFibGUgY2hhbmdlcywgaXQgd2lsbCBjaGFuZ2UgYWxzby4KLQotICAjIyBB
ZGRpbmcgT2JqZWN0cwotCi0gIFRvIGFkZCBhbiBvYmplY3QgdG8gYW4gZW51bWVyYWJsZSwgdXNl
IHRoZSBgYWRkT2JqZWN0KClgIG1ldGhvZC4gVGhpcwotICBtZXRob2Qgd2lsbCBvbmx5IGFkZCB0
aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJhYmxlIGlmIHRoZSBvYmplY3QgaXMgbm90Ci0gIGFscmVh
ZHkgcHJlc2VudCBhbmQgaXMgb2YgYSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgZW51bWVyYWJsZS4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIHNldC5hZGRPYmplY3QoY29udGFjdCk7Ci0gIGBgYAotCi0g
ICMjIFJlbW92aW5nIE9iamVjdHMKLQotICBUbyByZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gZW51
bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0KClgIG1ldGhvZC4gVGhpcwotICB3aWxsIG9u
bHkgcmVtb3ZlIHRoZSBvYmplY3QgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgZW51bWVyYWJsZSwg
b3RoZXJ3aXNlCi0gIHRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0KLSAgYGBgamF2YXNjcmlw
dAotICBzZXQucmVtb3ZlT2JqZWN0KGNvbnRhY3QpOwotICBgYGAKLQotICAjIyBJbXBsZW1lbnRp
bmcgSW4gWW91ciBPd24gQ29kZQotCi0gIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGFuIG9iamVj
dCBhbmQgd2FudCB0byBzdXBwb3J0IHRoaXMgQVBJLCBqdXN0IGluY2x1ZGUKLSAgdGhpcyBtaXhp
biBpbiB5b3VyIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIHJlcXVpcmVkIG1ldGhvZHMuIEluIHlv
dXIgdW5pdAotICB0ZXN0cywgYmUgc3VyZSB0byBhcHBseSB0aGUgRW1iZXIuTXV0YWJsZUVudW1l
cmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KLQotICBAY2xhc3MgTXV0YWJsZUVudW1lcmFibGUK
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCi0qLwotRW1iZXIu
TXV0YWJsZUVudW1lcmFibGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwg
ewotCi0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0
aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAgICBBdHRlbXB0cyB0byBhZGQgdGhlIHBhc3Nl
ZCBvYmplY3QgdG8gdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmplY3QgaXMgbm90Ci0gICAgYWxyZWFk
eSBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLiBJZiB0aGUgb2JqZWN0IGlzIHByZXNlbnQsIHRo
aXMgbWV0aG9kCi0gICAgaGFzIG5vIGVmZmVjdC4KLQotICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0
IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwKLSAgICB0aGVuIHRo
aXMgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgICBAbWV0aG9kIGFkZE9i
amVjdAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBhZGQgdG8gdGhl
IGVudW1lcmFibGUuCi0gICAgQHJldHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIG9iamVjdAotICAq
LwotICBhZGRPYmplY3Q6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwKLQotICAvKioKLSAgICBB
ZGRzIGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSB0byB0aGUgcmVjZWl2ZXIu
Ci0KLSAgICBAbWV0aG9kIGFkZE9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9
IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRkLgotICAgIEByZXR1cm4ge09iamVjdH0gcmVjZWl2
ZXIKLSAgKi8KLSAgYWRkT2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykgewotICAgIEVtYmVyLmJl
Z2luUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICAgIGZvckVhY2gob2JqZWN0cywgZnVuY3Rpb24o
b2JqKSB7IHRoaXMuYWRkT2JqZWN0KG9iaik7IH0sIHRoaXMpOwotICAgIEVtYmVyLmVuZFByb3Bl
cnR5Q2hhbmdlcyh0aGlzKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBf
X1JlcXVpcmVkLl9fIFlvdSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlz
IG1peGluLgotCi0gICAgQXR0ZW1wdHMgdG8gcmVtb3ZlIHRoZSBwYXNzZWQgb2JqZWN0IGZyb20g
dGhlIHJlY2VpdmVyIGNvbGxlY3Rpb24gaWYgdGhlCi0gICAgb2JqZWN0IGlzIHByZXNlbnQgaW4g
dGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmplY3QgaXMgbm90IHByZXNlbnQsCi0gICAgdGhpcyBt
ZXRob2QgaGFzIG5vIGVmZmVjdC4KLQotICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEg
dHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwKLSAgICB0aGVuIHRoaXMgbWV0aG9k
IHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgICBAbWV0aG9kIHJlbW92ZU9iamVjdAot
ICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGUg
ZW51bWVyYWJsZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgb2JqZWN0Ci0gICov
Ci0gIHJlbW92ZU9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAotCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFibGUgZnJvbSB0aGUg
cmVjZWl2ZXIuCi0KLSAgICBAbWV0aG9kIHJlbW92ZU9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVy
LkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gcmVtb3ZlCi0gICAgQHJldHVybiB7
T2JqZWN0fSByZWNlaXZlcgotICAqLwotICByZW1vdmVPYmplY3RzOiBmdW5jdGlvbihvYmplY3Rz
KSB7Ci0gICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXModGhpcyk7Ci0gICAgZm9yRWFjaChv
YmplY3RzLCBmdW5jdGlvbihvYmopIHsgdGhpcy5yZW1vdmVPYmplY3Qob2JqKTsgfSwgdGhpcyk7
Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICAgIHJldHVybiB0aGlzOwot
ICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0vLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0vLyBDT05TVEFOVFMKLS8v
Ci0KLXZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gIkluZGV4IG91dCBvZiByYW5nZSIgOwot
dmFyIEVNUFRZID0gW107Ci0KLS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLS8vIEhFTFBFUlMKLS8vCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUg
QVBJIGZvciBtb2RpZnlpbmcgYXJyYXktbGlrZSBvYmplY3RzLiBUaGVzZSBtZXRob2RzCi0gIGNh
biBiZSBhcHBsaWVkIG9ubHkgdG8gYSBjb2xsZWN0aW9uIHRoYXQga2VlcHMgaXRzIGl0ZW1zIGlu
IGFuIG9yZGVyZWQgc2V0LgotCi0gIE5vdGUgdGhhdCBhbiBBcnJheSBjYW4gY2hhbmdlIGV2ZW4g
aWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4uCi0gIEZvciBleGFtcGxlLCBvbmUg
bWlnaHQgaW1wbGVtZW50IGEgU3BhcnNlQXJyYXkgdGhhdCBjYW5ub3QgYmUgZGlyZWN0bHkKLSAg
bW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWluZyBlbnVtZXJhYmxlIGNoYW5nZXMsIGl0IHdp
bGwgY2hhbmdlIGFsc28uCi0KLSAgQGNsYXNzIE11dGFibGVBcnJheQotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEB1c2VzIEVtYmVyLkFycmF5Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVFbnVtZXJhYmxl
Ci0qLwotRW1iZXIuTXV0YWJsZUFycmF5ID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFycmF5
LCBFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwgewotCi0gIC8qKgotICAgIF9fUmVxdWlyZWQuX18g
WW91IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCi0KLSAg
ICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3Vw
cG9ydCBgRW1iZXIuQXJyYXlgLgotICAgIFlvdSBzaG91bGQgcmVwbGFjZSBhbXQgb2JqZWN0cyBz
dGFydGVkIGF0IGlkeCB3aXRoIHRoZSBvYmplY3RzIGluIHRoZQotICAgIHBhc3NlZCBhcnJheS4g
WW91IHNob3VsZCBhbHNvIGNhbGwgYHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2UoKWAK
LQotICAgIEBtZXRob2QgcmVwbGFjZQotICAgIEBwYXJhbSB7TnVtYmVyfSBpZHggU3RhcnRpbmcg
aW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UuIElmCi0gICAgICBpZHggPj0gbGVuZ3RoLCB0
aGVuIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheS4KLSAgICBAcGFyYW0ge051bWJlcn0g
YW10IE51bWJlciBvZiBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20KLSAgICAg
IHRoZSBhcnJheSwgc3RhcnRpbmcgYXQgKmlkeCouCi0gICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0
cyBBbiBhcnJheSBvZiB6ZXJvIG9yIG1vcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQotICAgICAg
aW5zZXJ0ZWQgaW50byB0aGUgYXJyYXkgYXQgKmlkeCoKLSAgKi8KLSAgcmVwbGFjZTogRW1iZXIu
cmVxdWlyZWQoKSwKLQotICAvKioKLSAgICBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gc2VsZi4g
VGhpcyBpcyB1c2VmdWwgaWYgeW91Ci0gICAgd2FudCB0byByZXVzZSBhbiBleGlzdGluZyBhcnJh
eSB3aXRob3V0IGhhdmluZyB0byByZWNyZWF0ZSBpdC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdOwotICAgIGNvbG9yLmxlbmd0
aCgpOyAgIC8vICAzCi0gICAgY29sb3JzLmNsZWFyKCk7ICAgLy8gIFtdCi0gICAgY29sb3JzLmxl
bmd0aCgpOyAgLy8gIDAKLSAgICBgYGAKLQotICAgIEBtZXRob2QgY2xlYXIKLSAgICBAcmV0dXJu
IHtFbWJlci5BcnJheX0gQW4gZW1wdHkgQXJyYXkuCi0gICovCi0gIGNsZWFyOiBmdW5jdGlvbiAo
KSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYgKGxlbiA9PT0g
MCkgcmV0dXJuIHRoaXM7Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgRU1QVFkpOwotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIFRoaXMgd2lsbCB1c2UgdGhlIHByaW1pdGl2
ZSBgcmVwbGFjZSgpYCBtZXRob2QgdG8gaW5zZXJ0IGFuIG9iamVjdCBhdCB0aGUKLSAgICBzcGVj
aWZpZWQgaW5kZXguCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVk
IiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xvcnMuaW5zZXJ0QXQoMiwgInllbGxvdyIpOyAg
Ly8gWyJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiXQotICAgIGNvbG9ycy5pbnNlcnRB
dCg1LCAib3JhbmdlIik7ICAvLyBFcnJvcjogSW5kZXggb3V0IG9mIHJhbmdlCi0gICAgYGBgCi0K
LSAgICBAbWV0aG9kIGluc2VydEF0Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGlkeCBpbmRleCBvZiBp
bnNlcnQgdGhlIG9iamVjdCBhdC4KLSAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9iamVjdCB0
byBpbnNlcnQKLSAgICBAcmV0dXJuIHRoaXMKLSAgKi8KLSAgaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlk
eCwgb2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnbGVuZ3RoJykpIHRocm93IG5l
dyBFbWJlci5FcnJvcihPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OKSA7Ci0gICAgdGhpcy5yZXBsYWNl
KGlkeCwgMCwgW29iamVjdF0pIDsKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0sCi0KLSAgLyoqCi0g
ICAgUmVtb3ZlIGFuIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHVzaW5nIHRoZSBgcmVw
bGFjZSgpYCBwcmltaXRpdmUKLSAgICBtZXRob2QuIFlvdSBjYW4gcGFzcyBlaXRoZXIgYSBzaW5n
bGUgaW5kZXgsIG9yIGEgc3RhcnQgYW5kIGEgbGVuZ3RoLgotCi0gICAgSWYgeW91IHBhc3MgYSBz
dGFydCBhbmQgbGVuZ3RoIHRoYXQgaXMgYmV5b25kIHRoZQotICAgIGxlbmd0aCB0aGlzIG1ldGhv
ZCB3aWxsIHRocm93IGFuIGBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OYC4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ci
LCAib3JhbmdlIl07Ci0gICAgY29sb3JzLnJlbW92ZUF0KDApOyAgICAgLy8gWyJncmVlbiIsICJi
bHVlIiwgInllbGxvdyIsICJvcmFuZ2UiXQotICAgIGNvbG9ycy5yZW1vdmVBdCgyLCAyKTsgIC8v
IFsiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgY29sb3JzLnJlbW92ZUF0KDQsIDIpOyAgLy8gRXJyb3I6
IEluZGV4IG91dCBvZiByYW5nZQotICAgIGBgYAotCi0gICAgQG1ldGhvZCByZW1vdmVBdAotICAg
IEBwYXJhbSB7TnVtYmVyfSBzdGFydCBpbmRleCwgc3RhcnQgb2YgcmFuZ2UKLSAgICBAcGFyYW0g
e051bWJlcn0gbGVuIGxlbmd0aCBvZiBwYXNzaW5nIHJhbmdlCi0gICAgQHJldHVybiB7T2JqZWN0
fSByZWNlaXZlcgotICAqLwotICByZW1vdmVBdDogZnVuY3Rpb24oc3RhcnQsIGxlbikgewotICAg
IGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHN0YXJ0KSB7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAw
KSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgICAgfQotCi0gICAgICAv
LyBmYXN0IGNhc2UKLSAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgbGVuID0gMTsKLSAgICAg
IHRoaXMucmVwbGFjZShzdGFydCwgbGVuLCBFTVBUWSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRo
aXMgOwotICB9LAotCi0gIC8qKgotICAgIFB1c2ggdGhlIG9iamVjdCBvbnRvIHRoZSBlbmQgb2Yg
dGhlIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHB1c2goKWAgYnV0IGl0Ci0gICAgaXMgS1ZPLWNv
bXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAi
Z3JlZW4iXTsKLSAgICBjb2xvcnMucHVzaE9iamVjdCgiYmxhY2siKTsgICAgIC8vIFsicmVkIiwg
ImdyZWVuIiwgImJsYWNrIl0KLSAgICBjb2xvcnMucHVzaE9iamVjdChbInllbGxvdyJdKTsgIC8v
IFsicmVkIiwgImdyZWVuIiwgWyJ5ZWxsb3ciXV0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgcHVz
aE9iamVjdAotICAgIEBwYXJhbSB7Kn0gb2JqIG9iamVjdCB0byBwdXNoCi0gICAgQHJldHVybiBU
aGUgc2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCi0gICovCi0gIHB1c2hPYmplY3Q6IGZ1bmN0aW9u
KG9iaikgewotICAgIHRoaXMuaW5zZXJ0QXQoZ2V0KHRoaXMsICdsZW5ndGgnKSwgb2JqKSA7Ci0g
ICAgcmV0dXJuIG9iajsKLSAgfSwKLQotICAvKioKLSAgICBBZGQgdGhlIG9iamVjdHMgaW4gdGhl
IHBhc3NlZCBudW1lcmFibGUgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuIERlZmVycwotICAgIG5v
dGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRpbCBhbGwgb2JqZWN0cyBhcmUgYWRk
ZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIl07Ci0gICAg
Y29sb3JzLnB1c2hPYmplY3RzKFsieWVsbG93IiwgIm9yYW5nZSJdKTsgIC8vIFsicmVkIiwgInll
bGxvdyIsICJvcmFuZ2UiXQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBwdXNoT2JqZWN0cwotICAg
IEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0cyB0byBhZGQKLSAg
ICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgcHVzaE9iamVjdHM6IGZ1
bmN0aW9uKG9iamVjdHMpIHsKLSAgICBpZiAoIShFbWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmpl
Y3RzKSB8fCBFbWJlci5pc0FycmF5KG9iamVjdHMpKSkgewotICAgICAgdGhyb3cgbmV3IFR5cGVF
cnJvcigiTXVzdCBwYXNzIEVtYmVyLkVudW1lcmFibGUgdG8gRW1iZXIuTXV0YWJsZUFycmF5I3B1
c2hPYmplY3RzIik7Ci0gICAgfQotICAgIHRoaXMucmVwbGFjZShnZXQodGhpcywgJ2xlbmd0aCcp
LCAwLCBvYmplY3RzKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBQb3Ag
b2JqZWN0IGZyb20gYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxlZnQuIFdvcmtzIGp1c3QgbGlr
ZSBgcG9wKClgIGJ1dAotICAgIGl0IGlzIEtWTy1jb21wbGlhbnQuCi0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAgICBjb2xv
cnMucG9wT2JqZWN0KCk7ICAgLy8gImJsdWUiCi0gICAgY29uc29sZS5sb2coY29sb3JzKTsgIC8v
IFsicmVkIiwgImdyZWVuIl0KLSAgICBgYGAKLQotICAgIEBtZXRob2QgcG9wT2JqZWN0Ci0gICAg
QHJldHVybiBvYmplY3QKLSAgKi8KLSAgcG9wT2JqZWN0OiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7Ci0gICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIG51
bGwgOwotCi0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQobGVuLTEpIDsKLSAgICB0aGlzLnJl
bW92ZUF0KGxlbi0xLCAxKSA7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0KLSAgLyoqCi0gICAg
U2hpZnQgYW4gb2JqZWN0IGZyb20gc3RhcnQgb2YgYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxl
ZnQuIFdvcmtzIGp1c3QKLSAgICBsaWtlIGBzaGlmdCgpYCBidXQgaXQgaXMgS1ZPLWNvbXBsaWFu
dC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4i
LCAiYmx1ZSJdOwotICAgIGNvbG9ycy5zaGlmdE9iamVjdCgpOyAgLy8gInJlZCIKLSAgICBjb25z
b2xlLmxvZyhjb2xvcnMpOyAgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHNoaWZ0T2JqZWN0Ci0gICAgQHJldHVybiBvYmplY3QKLSAgKi8KLSAgc2hpZnRPYmpl
Y3Q6IGZ1bmN0aW9uKCkgewotICAgIGlmIChnZXQodGhpcywgJ2xlbmd0aCcpID09PSAwKSByZXR1
cm4gbnVsbCA7Ci0gICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQoMCkgOwotICAgIHRoaXMucmVt
b3ZlQXQoMCkgOwotICAgIHJldHVybiByZXQgOwotICB9LAotCi0gIC8qKgotICAgIFVuc2hpZnQg
YW4gb2JqZWN0IHRvIHN0YXJ0IG9mIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHVuc2hpZnQoKWAg
YnV0IGl0IGlzCi0gICAgS1ZPLWNvbXBsaWFudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2
YXIgY29sb3JzID0gWyJyZWQiXTsKLSAgICBjb2xvcnMudW5zaGlmdE9iamVjdCgieWVsbG93Iik7
ICAgIC8vIFsieWVsbG93IiwgInJlZCJdCi0gICAgY29sb3JzLnVuc2hpZnRPYmplY3QoWyJibGFj
ayJdKTsgICAvLyBbWyJibGFjayJdLCAieWVsbG93IiwgInJlZCJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHVuc2hpZnRPYmplY3QKLSAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gdW5zaGlm
dAotICAgIEByZXR1cm4gVGhlIHNhbWUgb2JqIHBhc3NlZCBhcyBwYXJhbQotICAqLwotICB1bnNo
aWZ0T2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLmluc2VydEF0KDAsIG9iaikgOwot
ICAgIHJldHVybiBvYmogOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgdGhlIG5hbWVkIG9iamVj
dHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIERlZmVycyBub3RpZnlpbmcKLSAgICBv
YnNlcnZlcnMgdW50aWwgYWxsIG9iamVjdHMgaGF2ZSBiZWVuIGFkZGVkLgotCi0gICAgYGBgamF2
YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBbInJlZCJdOwotICAgIGNvbG9ycy51bnNoaWZ0T2Jq
ZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgIC8vIFsiYmxhY2siLCAid2hpdGUiLCAicmVkIl0K
LSAgICBjb2xvcnMudW5zaGlmdE9iamVjdHMoInllbGxvdyIpOyAvLyBUeXBlIEVycm9yOiAndW5k
ZWZpbmVkJyBpcyBub3QgYSBmdW5jdGlvbgotICAgIGBgYAotCi0gICAgQG1ldGhvZCB1bnNoaWZ0
T2JqZWN0cwotICAgIEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0
cyB0byBhZGQKLSAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIKLSAgKi8KLSAgdW5z
aGlmdE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICB0aGlzLnJlcGxhY2UoMCwgMCwg
b2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV2ZXJzZSBv
YmplY3RzIGluIHRoZSBhcnJheS4gV29ya3MganVzdCBsaWtlIGByZXZlcnNlKClgIGJ1dCBpdCBp
cwotICAgIEtWTy1jb21wbGlhbnQuCi0KLSAgICBAbWV0aG9kIHJldmVyc2VPYmplY3RzCi0gICAg
QHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCi0gICAqLwotICByZXZlcnNlT2JqZWN0czog
ZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7Ci0gICAgaWYg
KGxlbiA9PT0gMCkgcmV0dXJuIHRoaXM7Ci0gICAgdmFyIG9iamVjdHMgPSB0aGlzLnRvQXJyYXko
KS5yZXZlcnNlKCk7Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0
dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVwbGFjZSBhbGwgdGhlIHRoZSByZWNlaXZl
cidzIGNvbnRlbnQgd2l0aCBjb250ZW50IG9mIHRoZSBhcmd1bWVudC4KLSAgICBJZiBhcmd1bWVu
dCBpcyBhbiBlbXB0eSBhcnJheSByZWNlaXZlciB3aWxsIGJlIGNsZWFyZWQuCi0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiXTsKLSAg
ICBjb2xvcnMuc2V0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgLy8gWyJibGFjayIsICJ3
aGl0ZSJdCi0gICAgY29sb3JzLnNldE9iamVjdHMoW10pOyAgICAgICAgICAgICAgICAgIC8vIFtd
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNldE9iamVjdHMKLSAgICBAcGFyYW0ge0VtYmVyLkFy
cmF5fSBvYmplY3RzIGFycmF5IHdob3NlIGNvbnRlbnQgd2lsbCBiZSB1c2VkIGZvciByZXBsYWNp
bmcKLSAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCi0gICAgQHJldHVybiB7RW1i
ZXIuQXJyYXl9IHJlY2VpdmVyIHdpdGggdGhlIG5ldyBjb250ZW50Ci0gICAqLwotICBzZXRPYmpl
Y3RzOiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSBy
ZXR1cm4gdGhpcy5jbGVhcigpOwotCi0gICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7
Ci0gICAgdGhpcy5yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLgotICAvLyBJTVBMRU1FTlQgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAg
Ly8KLQotICByZW1vdmVPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIHZhciBsb2MgPSBnZXQo
dGhpcywgJ2xlbmd0aCcpIHx8IDA7Ci0gICAgd2hpbGUoLS1sb2MgPj0gMCkgewotICAgICAgdmFy
IGN1ck9iamVjdCA9IHRoaXMub2JqZWN0QXQobG9jKSA7Ci0gICAgICBpZiAoY3VyT2JqZWN0ID09
PSBvYmopIHRoaXMucmVtb3ZlQXQobG9jKSA7Ci0gICAgfQotICAgIHJldHVybiB0aGlzIDsKLSAg
fSwKLQotICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewotICAgIGlmICghdGhpcy5jb250YWlu
cyhvYmopKSB0aGlzLnB1c2hPYmplY3Qob2JqKTsKLSAgICByZXR1cm4gdGhpcyA7Ci0gIH0KLQot
fSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBz
dWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g
RW1iZXIuc2V0OwotCi0vKioKLWBFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0YCBpcyBhIG1peGlu
IHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGEgY2xhc3MKLXRvIGFkZCBhIGB0cmlnZ2VyQWN0aW9u
YCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mgc2ltaWxhciB0byB0aGUgSGFuZGxlYmFycwotYHt7YWN0
aW9ufX1gIGhlbHBlci4gSW4gbm9ybWFsIEVtYmVyIHVzYWdlLCB0aGUgYHt7YWN0aW9ufX1gIGhl
bHBlciBpcwotdXN1YWxseSB0aGUgYmVzdCBjaG9pY2UuIFRoaXMgbWl4aW4gaXMgbW9zdCBvZnRl
biB1c2VmdWwgd2hlbiB5b3UgYXJlCi1kb2luZyBtb3JlIGNvbXBsZXggZXZlbnQgaGFuZGxpbmcg
aW4gVmlldyBvYmplY3RzLgotCi1TZWUgYWxzbyBgRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBv
cnRgLCB3aGljaCBoYXMKLXZpZXctYXdhcmUgZGVmYXVsdHMgZm9yIHRhcmdldCBhbmQgYWN0aW9u
Q29udGV4dC4KLQotQGNsYXNzIFRhcmdldEFjdGlvblN1cHBvcnQKLUBuYW1lc3BhY2UgRW1iZXIK
LUBleHRlbmRzIEVtYmVyLk1peGluCi0qLwotRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCA9IEVt
YmVyLk1peGluLmNyZWF0ZSh7Ci0gIHRhcmdldDogbnVsbCwKLSAgYWN0aW9uOiBudWxsLAotICBh
Y3Rpb25Db250ZXh0OiBudWxsLAotCi0gIHRhcmdldE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0Jyk7Ci0KLSAgICBp
ZiAoRW1iZXIudHlwZU9mKHRhcmdldCkgPT09ICJzdHJpbmciKSB7Ci0gICAgICB2YXIgdmFsdWUg
PSBnZXQodGhpcywgdGFyZ2V0KTsKLSAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZh
bHVlID0gZ2V0KEVtYmVyLmxvb2t1cCwgdGFyZ2V0KTsgfQotICAgICAgcmV0dXJuIHZhbHVlOwot
ICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGFyZ2V0OwotICAgIH0KLSAgfSkucHJvcGVydHko
J3RhcmdldCcpLAotCi0gIGFjdGlvbkNvbnRleHRPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgIHZhciBhY3Rpb25Db250ZXh0ID0gZ2V0KHRoaXMsICdhY3Rpb25Db250ZXh0
Jyk7Ci0KLSAgICBpZiAoRW1iZXIudHlwZU9mKGFjdGlvbkNvbnRleHQpID09PSAic3RyaW5nIikg
ewotICAgICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsIGFjdGlvbkNvbnRleHQpOwotICAgICAgaWYg
KHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBnZXQoRW1iZXIubG9va3VwLCBhY3Rpb25D
b250ZXh0KTsgfQotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1
cm4gYWN0aW9uQ29udGV4dDsKLSAgICB9Ci0gIH0pLnByb3BlcnR5KCdhY3Rpb25Db250ZXh0Jyks
Ci0KLSAgLyoqCi0gIFNlbmQgYW4gImFjdGlvbiIgd2l0aCBhbiAiYWN0aW9uQ29udGV4dCIgdG8g
YSAidGFyZ2V0Ii4gVGhlIGFjdGlvbiwgYWN0aW9uQ29udGV4dAotICBhbmQgdGFyZ2V0IHdpbGwg
YmUgcmV0cmlldmVkIGZyb20gcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LiBGb3IgZXhhbXBsZToK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgICB0YXJnZXQ6IEVtYmVyLmNvbXB1
dGVkLmFsaWFzKCdjb250cm9sbGVyJyksCi0gICAgYWN0aW9uOiAnc2F2ZScsCi0gICAgYWN0aW9u
Q29udGV4dDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRleHQnKSwKLSAgICBjbGljazogZnVu
Y3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsgLy8gU2VuZHMgdGhlIGBzYXZl
YCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIKLSAgICB9Ci0gIH0pOwot
ICBgYGAKLQotICBUaGUgYHRhcmdldGAsIGBhY3Rpb25gLCBhbmQgYGFjdGlvbkNvbnRleHRgIGNh
biBiZSBwcm92aWRlZCBhcyBwcm9wZXJ0aWVzIG9mCi0gIGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1
bWVudCB0byBgdHJpZ2dlckFjdGlvbmAgYXMgd2VsbC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFw
cC5TYXZlQnV0dG9uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLlRhcmdldEFjdGlvblN1
cHBvcnQsIHsKLSAgICBjbGljazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rp
b24oewotICAgICAgICBhY3Rpb246ICdzYXZlJywKLSAgICAgICAgdGFyZ2V0OiB0aGlzLmdldCgn
Y29udHJvbGxlcicpLAotICAgICAgICBhY3Rpb25Db250ZXh0OiB0aGlzLmdldCgnY29udGV4dCcp
LAotICAgICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBj
dXJyZW50IGNvbnRleHQKLSAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0g
ICAgfQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIGBhY3Rpb25Db250ZXh0YCBkZWZhdWx0cyB0byB0
aGUgb2JqZWN0IHlvdSBtaXhpbmcgYFRhcmdldEFjdGlvblN1cHBvcnRgIGludG8uCi0gIEJ1dCBg
dGFyZ2V0YCBhbmQgYGFjdGlvbmAgbXVzdCBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIHByb3BlcnRp
ZXMgb3Igd2l0aCB0aGUgYXJndW1lbnQKLSAgdG8gYHRyaWdnZXJBY3Rpb25gLCBvciBhIGNvbWJp
bmF0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIu
Vmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCwgewotICAgIHRhcmdldDogRW1i
ZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKLSAgICBjbGljazogZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAgICBhY3Rpb246ICdzYXZlJwotICAg
ICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIGEgcmVmZXJlbmNl
IHRvIGB0aGlzYCwKLSAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVyCi0gICAg
fQotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCB0cmlnZ2VyQWN0aW9uCi0gIEBwYXJhbSBvcHRz
IHtIYXNofSAob3B0aW9uYWwsIHdpdGggdGhlIG9wdGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQg
YW5kL29yIGFjdGlvbkNvbnRleHQpCi0gIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFj
dGlvbiB3YXMgc2VudCBzdWNjZXNzZnVsbHkgYW5kIGRpZCBub3QgcmV0dXJuIGZhbHNlCi0gICov
Ci0gIHRyaWdnZXJBY3Rpb246IGZ1bmN0aW9uKG9wdHMpIHsKLSAgICBvcHRzID0gb3B0cyB8fCB7
fTsKLSAgICB2YXIgYWN0aW9uID0gb3B0cy5hY3Rpb24gfHwgZ2V0KHRoaXMsICdhY3Rpb24nKSwK
LSAgICAgICAgdGFyZ2V0ID0gb3B0cy50YXJnZXQgfHwgZ2V0KHRoaXMsICd0YXJnZXRPYmplY3Qn
KSwKLSAgICAgICAgYWN0aW9uQ29udGV4dCA9IG9wdHMuYWN0aW9uQ29udGV4dDsKLQotICAgIGZ1
bmN0aW9uIGFyZ3Mob3B0aW9ucywgYWN0aW9uTmFtZSkgewotICAgICAgdmFyIHJldCA9IFtdOwot
ICAgICAgaWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KLQotICAgICAg
cmV0dXJuIHJldC5jb25jYXQob3B0aW9ucyk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVvZiBhY3Rp
b25Db250ZXh0ID09PSAndW5kZWZpbmVkJykgewotICAgICAgYWN0aW9uQ29udGV4dCA9IGdldCh0
aGlzLCAnYWN0aW9uQ29udGV4dE9iamVjdCcpIHx8IHRoaXM7Ci0gICAgfQotCi0gICAgaWYgKHRh
cmdldCAmJiBhY3Rpb24pIHsKLSAgICAgIHZhciByZXQ7Ci0KLSAgICAgIGlmICh0YXJnZXQuc2Vu
ZCkgewotICAgICAgICByZXQgPSB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIGFyZ3MoYWN0aW9u
Q29udGV4dCwgYWN0aW9uKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFbWJlci5hc3NlcnQo
IlRoZSBhY3Rpb24gJyIgKyBhY3Rpb24gKyAiJyBkaWQgbm90IGV4aXN0IG9uICIgKyB0YXJnZXQs
IHR5cGVvZiB0YXJnZXRbYWN0aW9uXSA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICAgIHJldCA9IHRh
cmdldFthY3Rpb25dLmFwcGx5KHRhcmdldCwgYXJncyhhY3Rpb25Db250ZXh0KSk7Ci0gICAgICB9
Ci0KLSAgICAgIGlmIChyZXQgIT09IGZhbHNlKSByZXQgPSB0cnVlOwotCi0gICAgICByZXR1cm4g
cmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19KTsK
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioKLSAgVGhpcyBtaXhpbiBhbGxvd3MgZm9yIEVt
YmVyIG9iamVjdHMgdG8gc3Vic2NyaWJlIHRvIGFuZCBlbWl0IGV2ZW50cy4KLQotICBgYGBqYXZh
c2NyaXB0Ci0gIEFwcC5QZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQs
IHsKLSAgICBncmVldDogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyAuLi4KLSAgICAgIHRoaXMudHJp
Z2dlcignZ3JlZXQnKTsKLSAgICB9Ci0gIH0pOwotCi0gIHZhciBwZXJzb24gPSBBcHAuUGVyc29u
LmNyZWF0ZSgpOwotCi0gIHBlcnNvbi5vbignZ3JlZXQnLCBmdW5jdGlvbigpIHsKLSAgICBjb25z
b2xlLmxvZygnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcpOwotICB9KTsKLQotICBwZXJzb24uZ3Jl
ZXQoKTsKLQotICAvLyBvdXRwdXRzOiAnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcKLSAgYGBgCi0K
LSAgWW91IGNhbiBhbHNvIGNoYWluIG11bHRpcGxlIGV2ZW50IHN1YnNjcmlwdGlvbnM6Ci0KLSAg
YGBgamF2YXNjcmlwdAotICBwZXJzb24ub24oJ2dyZWV0JywgZnVuY3Rpb24oKSB7Ci0gICAgY29u
c29sZS5sb2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKLSAgfSkub25lKCdncmVldCcsIGZ1
bmN0aW9uKCkgewotICAgIGNvbnNvbGUubG9nKCdPZmZlciBvbmUtdGltZSBzcGVjaWFsJyk7Ci0g
IH0pLm9mZignZXZlbnQnLCB0aGlzLCBmb3JnZXRUaGlzKTsKLSAgYGBgCi0KLSAgQGNsYXNzIEV2
ZW50ZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgotICovCi1FbWJlci5FdmVudGVkID0gRW1iZXIuTWl4
aW4uY3JlYXRlKHsKLQotICAvKioKLSAgIFN1YnNjcmliZXMgdG8gYSBuYW1lZCBldmVudCB3aXRo
IGdpdmVuIGZ1bmN0aW9uLgotCi0gICBgYGBqYXZhc2NyaXB0Ci0gICBwZXJzb24ub24oJ2RpZExv
YWQnLCBmdW5jdGlvbigpIHsKLSAgICAgLy8gZmlyZWQgb25jZSB0aGUgcGVyc29uIGhhcyBsb2Fk
ZWQKLSAgIH0pOwotICAgYGBgCi0KLSAgIEFuIG9wdGlvbmFsIHRhcmdldCBjYW4gYmUgcGFzc2Vk
IGluIGFzIHRoZSAybmQgYXJndW1lbnQgdGhhdCB3aWxsCi0gICBiZSBzZXQgYXMgdGhlICJ0aGlz
IiBmb3IgdGhlIGNhbGxiYWNrLiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3VyCi0gICBm
dW5jdGlvbiBhY2Nlc3MgdG8gdGhlIG9iamVjdCB0cmlnZ2VyaW5nIHRoZSBldmVudC4gV2hlbiB0
aGUgdGFyZ2V0Ci0gICBwYXJhbWV0ZXIgaXMgdXNlZCB0aGUgY2FsbGJhY2sgYmVjb21lcyB0aGUg
dGhpcmQgYXJndW1lbnQuCi0KLSAgIEBtZXRob2Qgb24KLSAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSAi
dGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCi0gICBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRo
b2QgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKLSAgIEByZXR1cm4gdGhpcwotICAqLwotICBvbjog
ZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5hZGRMaXN0ZW5lcih0
aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgU3Vic2NyaWJlcyBhIGZ1bmN0aW9uIHRvIGEgbmFtZWQgZXZlbnQgYW5kIHRoZW4g
Y2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uCi0gICAgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGV2
ZW50IGlzIHRyaWdnZXJlZC4gSXQgaXMgZ29vZCB0byB1c2UgYGBvbmVgYCB3aGVuCi0gICAgeW91
IG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgdGltZSBhbiBldmVudCBoYXMgdGFrZW4gcGxhY2Uu
Ci0KLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIG9wdGlvbmFsIDJuZCBhcmd1bWVudCB0aGF0
IHdpbGwgYmVjb21lIHRoZSAidGhpcyIKLSAgICB2YWx1ZSBmb3IgdGhlIGNhbGxiYWNrLiBJZiB0
aGlzIGFyZ3VtZW50IGlzIHBhc3NlZCB0aGVuIHRoZSAzcmQgYXJndW1lbnQKLSAgICBiZWNvbWVz
IHRoZSBmdW5jdGlvbi4KLQotICAgIEBtZXRob2Qgb25lCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5h
bWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50Ci0gICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRo
ZSAidGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0g
bWV0aG9kIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0g
IG9uZTogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBpZiAoIW1ldGhvZCkg
ewotICAgICAgbWV0aG9kID0gdGFyZ2V0OwotICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICB9Ci0K
LSAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCwgdHJ1ZSk7
Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVHJpZ2dlcnMgYSBuYW1lZCBl
dmVudCBmb3IgdGhlIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gICAgd2lsbCBi
ZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIHN1YnNjcmli
ZWQgdG8gdGhlCi0gICAgZXZlbnQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgcGVyc29uLm9u
KCdkaWRFYXQnLCBmdW5jdGlvbihmb29kKSB7Ci0gICAgICBjb25zb2xlLmxvZygncGVyc29uIGF0
ZSBzb21lICcgKyBmb29kKTsKLSAgICB9KTsKLQotICAgIHBlcnNvbi50cmlnZ2VyKCdkaWRFYXQn
LCAnYnJvY2NvbGknKTsKLQotICAgIC8vIG91dHB1dHM6IHBlcnNvbiBhdGUgc29tZSBicm9jY29s
aQotICAgIGBgYAotICAgIEBtZXRob2QgdHJpZ2dlcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l
IFRoZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0Li4ufSBhcmdzIE9wdGlv
bmFsIGFyZ3VtZW50cyB0byBwYXNzIG9uCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKLSAgICB2YXIgYXJncyA9IFtdLCBpLCBsOwotICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVu
dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsK
LSAgICB9Ci0gICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsIG5hbWUsIGFyZ3MpOwotICB9LAotCi0g
IC8qKgotICAgIENhbmNlbHMgc3Vic2NyaXB0aW9uIGZvciBnaXZlbiBuYW1lLCB0YXJnZXQsIGFu
ZCBtZXRob2QuCi0KLSAgICBAbWV0aG9kIG9mZgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRo
ZSBuYW1lIG9mIHRoZSBldmVudAotICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdl
dCBvZiB0aGUgc3Vic2NyaXB0aW9uCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBm
dW5jdGlvbiBvZiB0aGUgc3Vic2NyaXB0aW9uCi0gICAgQHJldHVybiB0aGlzCi0gICovCi0gIG9m
ZjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKLSAgICBFbWJlci5yZW1vdmVMaXN0
ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhvZCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgQ2hlY2tzIHRvIHNlZSBpZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRp
b25zIGZvciBuYW1lZCBldmVudC4KLQotICAgIEBtZXRob2QgaGFzCi0gICAgQHBhcmFtIHtTdHJp
bmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50Ci0gICAgQHJldHVybiB7Qm9vbGVhbn0gZG9l
cyB0aGUgb2JqZWN0IGhhdmUgYSBzdWJzY3JpcHRpb24gZm9yIGV2ZW50Ci0gICAqLwotICBoYXM6
IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICByZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIG5h
bWUpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBSU1ZQID0g
cmVxdWlyZU1vZHVsZSgicnN2cCIpOwotCi1SU1ZQLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlv
bihjYWxsYmFjaywgcHJvbWlzZSkgewotICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBw
cm9taXNlLCBjYWxsYmFjaywgcHJvbWlzZSk7Ci19KTsKLQotUlNWUC5Qcm9taXNlLnByb3RvdHlw
ZS5mYWlsID0gZnVuY3Rpb24oY2FsbGJhY2ssIGxhYmVsKXsKLSAgRW1iZXIuZGVwcmVjYXRlKCdS
U1ZQLlByb21pc2UuZmFpbCBoYXMgYmVlbiByZW5hbWVkIGFzIFJTVlAuUHJvbWlzZS5jYXRjaCcp
OwotICByZXR1cm4gdGhpc1snY2F0Y2gnXShjYWxsYmFjaywgbGFiZWwpOwotfTsKLQotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQ7Ci0KLS8qKgotICBAY2xhc3MgRGVmZXJyZWQKLSAgQG5hbWVzcGFjZSBFbWJlcgot
ICovCi1FbWJlci5EZWZlcnJlZE1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgLyoqCi0g
ICAgQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgaXMg
cmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCi0KLSAgICBAbWV0aG9kIHRoZW4KLSAgICBAcGFyYW0ge0Z1
bmN0aW9ufSByZXNvbHZlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZG9u
ZQotICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBi
ZSBjYWxsZWQgd2hlbiBmYWlsZWQKLSAgKi8KLSAgdGhlbjogZnVuY3Rpb24ocmVzb2x2ZSwgcmVq
ZWN0LCBsYWJlbCkgewotICAgIHZhciBkZWZlcnJlZCwgcHJvbWlzZSwgZW50aXR5OwotCi0gICAg
ZW50aXR5ID0gdGhpczsKLSAgICBkZWZlcnJlZCA9IGdldCh0aGlzLCAnX2RlZmVycmVkJyk7Ci0g
ICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7Ci0KLSAgICBmdW5jdGlvbiBmdWxmaWxsbWVu
dEhhbmRsZXIoZnVsZmlsbG1lbnQpIHsKLSAgICAgIGlmIChmdWxmaWxsbWVudCA9PT0gcHJvbWlz
ZSkgewotICAgICAgICByZXR1cm4gcmVzb2x2ZShlbnRpdHkpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgcmV0dXJuIHJlc29sdmUoZnVsZmlsbG1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiBwcm9taXNlLnRoZW4ocmVzb2x2ZSAmJiBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVj
dCwgbGFiZWwpOwotICB9LAotCi0gIC8qKgotICAgIFJlc29sdmUgYSBEZWZlcnJlZCBvYmplY3Qg
YW5kIGNhbGwgYW55IGBkb25lQ2FsbGJhY2tzYCB3aXRoIHRoZSBnaXZlbiBhcmdzLgotCi0gICAg
QG1ldGhvZCByZXNvbHZlCi0gICovCi0gIHJlc29sdmU6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAg
dmFyIGRlZmVycmVkLCBwcm9taXNlOwotCi0gICAgZGVmZXJyZWQgPSBnZXQodGhpcywgJ19kZWZl
cnJlZCcpOwotICAgIHByb21pc2UgPSBkZWZlcnJlZC5wcm9taXNlOwotCi0gICAgaWYgKHZhbHVl
ID09PSB0aGlzKSB7Ci0gICAgICBkZWZlcnJlZC5yZXNvbHZlKHByb21pc2UpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgUmVqZWN0IGEgRGVmZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBgZmFpbENhbGxiYWNr
c2Agd2l0aCB0aGUgZ2l2ZW4gYXJncy4KLQotICAgIEBtZXRob2QgcmVqZWN0Ci0gICovCi0gIHJl
amVjdDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICBnZXQodGhpcywgJ19kZWZlcnJlZCcpLnJlamVj
dCh2YWx1ZSk7Ci0gIH0sCi0KLSAgX2RlZmVycmVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gUlNWUC5kZWZlcignRW1iZXI6IERlZmVycmVkTWl4aW4gLSAnICsgdGhp
cyk7Ci0gIH0pCi19KTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHR5cGVPZiA9IEVtYmVyLnR5cGVPZjsKLQotLyoqCi0gIFRoZSBgRW1iZXIuQWN0aW9u
SGFuZGxlcmAgbWl4aW4gaW1wbGVtZW50cyBzdXBwb3J0IGZvciBtb3ZpbmcgYW4gYGFjdGlvbnNg
Ci0gIHByb3BlcnR5IHRvIGFuIGBfYWN0aW9uc2AgcHJvcGVydHkgYXQgZXh0ZW5kIHRpbWUsIGFu
ZCBhZGRpbmcgYF9hY3Rpb25zYAotICB0byB0aGUgb2JqZWN0J3MgbWVyZ2VkUHJvcGVydGllcyBs
aXN0LgotCi0gIGBFbWJlci5BY3Rpb25IYW5kbGVyYCBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1i
ZXIgaW4gIGBFbWJlci5WaWV3YCwKLSAgYEVtYmVyLkNvbnRyb2xsZXJgLCBhbmQgYEVtYmVyLlJv
dXRlYC4KLQotICBAY2xhc3MgQWN0aW9uSGFuZGxlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwot
RW1iZXIuQWN0aW9uSGFuZGxlciA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIG1lcmdlZFByb3Bl
cnRpZXM6IFsnX2FjdGlvbnMnXSwKLQotICAvKioKLSAgICBUaGUgY29sbGVjdGlvbiBvZiBmdW5j
dGlvbnMsIGtleWVkIGJ5IG5hbWUsIGF2YWlsYWJsZSBvbiB0aGlzCi0gICAgYEFjdGlvbkhhbmRs
ZXJgIGFzIGFjdGlvbiB0YXJnZXRzLgotCi0gICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52
b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9ufX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20g
d2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMg
dGhpcyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVy
IHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24KLSAgICB2aWEgYEFjdGlvbkhhbmRsZXIjc2VuZGAu
Ci0KLSAgICBUaGUgYGFjdGlvbnNgIGhhc2ggd2lsbCBpbmhlcml0IGFjdGlvbiBoYW5kbGVycyBm
cm9tCi0gICAgdGhlIGBhY3Rpb25zYCBoYXNoIGRlZmluZWQgb24gZXh0ZW5kZWQgcGFyZW50IGNs
YXNzZXMKLSAgICBvciBtaXhpbnMgcmF0aGVyIHRoYW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUg
aGFzaCwgZS5nLjoKLQotICAgIGBgYGpzCi0gICAgQXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJl
ci5NaXhpbi5jcmVhdGUoewotICAgICAgYWN0aW9uczogewotICAgICAgICBkaXNwbGF5QmFubmVy
OiBmdW5jdGlvbihtc2cpIHsKLSAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgfQot
ICAgIH0pOwotCi0gICAgQXBwLldlbGNvbWVSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZChBcHAu
Q2FuRGlzcGxheUJhbm5lciwgewotICAgICAgYWN0aW9uczogewotICAgICAgICBwbGF5TXVzaWM6
IGZ1bmN0aW9uKCkgewotICAgICAgICAgIC8vIC4uLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0KLSAgICAvLyBgV2VsY29tZVJvdXRlYCwgd2hlbiBhY3RpdmUsIHdpbGwgYmUgYWJsZSB0
byByZXNwb25kCi0gICAgLy8gdG8gYm90aCBhY3Rpb25zLCBzaW5jZSB0aGUgYWN0aW9ucyBoYXNo
IGlzIG1lcmdlZCByYXRoZXIKLSAgICAvLyB0aGVuIHJlcGxhY2VkIHdoZW4gZXh0ZW5kaW5nIG1p
eGlucyAvIHBhcmVudCBjbGFzc2VzLgotICAgIHRoaXMuc2VuZCgnZGlzcGxheUJhbm5lcicpOwot
ICAgIHRoaXMuc2VuZCgncGxheU11c2ljJyk7Ci0gICAgYGBgCi0KLSAgICBXaXRoaW4gYSBDb250
cm9sbGVyLCBSb3V0ZSwgVmlldyBvciBDb21wb25lbnQncyBhY3Rpb24gaGFuZGxlciwKLSAgICB0
aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0IGlzIHRoZSBDb250cm9sbGVyLCBSb3V0ZSwg
VmlldyBvcgotICAgIENvbXBvbmVudCBvYmplY3Q6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Tb25n
Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBt
eUFjdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCJzb25n
Iik7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oIm90aGVyLnJvdXRlIik7Ci0gICAgICAg
ICAgLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEl0IGlz
IGFsc28gcG9zc2libGUgdG8gY2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KLSAg
ICBhY3Rpb24gaGFuZGxlciBpZiBpdCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBw
YXJlbnQKLSAgICBjbGFzcyBvciBtaXhpbjoKLQotICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZv
bGxvd2luZyByb3V0ZXM6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5EZWJ1Z1JvdXRlID0gRW1iZXIu
TWl4aW4uY3JlYXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9y
bWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICBjb25zb2xlLmRlYnVnKCJ0cm9sb2xvIik7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91
dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVnUm91dGUsIHsKLSAgICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAvLyBhbHNvIGNhbGwgdGhlIGRlYnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAu
RGVidWdSb3V0ZQotICAgICAgICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICAgICAgICAvLyBzaG93
IGFkZGl0aW9uYWwgYW5ub3lhbmNlCi0gICAgICAgICAgd2luZG93LmFsZXJ0KC4uLik7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgICMjIEJ1YmJsaW5nCi0KLSAg
ICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVy
IGRlZmluZWQKLSAgICBvbiB0aGUgYGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8gY29udGlu
dWUgYnViYmxpbmcgdGhlIGFjdGlvbiwKLSAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVgIGZyb20g
dGhlIGhhbmRsZXI6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkg
ewotICAgICAgdGhpcy5yZXNvdXJjZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhp
cy5yb3V0ZSgic29uZyIpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuQWxidW1Sb3V0
ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0
UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAg
IEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25z
OiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgLy8gLi4u
Ci0KLSAgICAgICAgICBpZiAoYWN0aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRSb3V0
ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgYWN0aW9ucwotICAgIEB0
eXBlIEhhc2gKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0KLSAgLyoqCi0gICAgTW92ZXMgYGFj
dGlvbnNgIHRvIGBfYWN0aW9uc2AgYXQgZXh0ZW5kIHRpbWUuIE5vdGUgdGhhdCB0aGlzIGN1cnJl
bnRseQotICAgIG1vZGlmaWVzIHRoZSBtaXhpbiB0aGVtc2VsdmVzLCB3aGljaCBpcyB0ZWNobmlj
YWxseSBkdWJpb3VzIGJ1dAotICAgIGlzIHByYWN0aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5j
ZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgd2lsbE1lcmdlTWl4aW4KLSAgKi8KLSAgd2lsbE1lcmdlTWl4aW46IGZ1bmN0aW9uKHBy
b3BzKSB7Ci0gICAgdmFyIGhhc2hOYW1lOwotCi0gICAgaWYgKCFwcm9wcy5fYWN0aW9ucykgewot
ICAgICAgaWYgKHR5cGVPZihwcm9wcy5hY3Rpb25zKSA9PT0gJ29iamVjdCcpIHsKLSAgICAgICAg
aGFzaE5hbWUgPSAnYWN0aW9ucyc7Ci0gICAgICB9IGVsc2UgaWYgKHR5cGVPZihwcm9wcy5ldmVu
dHMpID09PSAnb2JqZWN0JykgewotICAgICAgICBFbWJlci5kZXByZWNhdGUoJ0FjdGlvbiBoYW5k
bGVycyBjb250YWluZWQgaW4gYW4gYGV2ZW50c2Agb2JqZWN0IGFyZSBkZXByZWNhdGVkIGluIGZh
dm9yIG9mIHB1dHRpbmcgdGhlbSBpbiBhbiBgYWN0aW9uc2Agb2JqZWN0JywgZmFsc2UpOwotICAg
ICAgICBoYXNoTmFtZSA9ICdldmVudHMnOwotICAgICAgfQotCi0gICAgICBpZiAoaGFzaE5hbWUp
IHsKLSAgICAgICAgcHJvcHMuX2FjdGlvbnMgPSBFbWJlci5tZXJnZShwcm9wcy5fYWN0aW9ucyB8
fCB7fSwgcHJvcHNbaGFzaE5hbWVdKTsKLSAgICAgIH0KLQotICAgICAgZGVsZXRlIHByb3BzW2hh
c2hOYW1lXTsKLSAgICB9Ci0gIH0sCi0KLSAgc2VuZDogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewot
ICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCB0YXJnZXQ7Ci0KLSAg
ICBpZiAodGhpcy5fYWN0aW9ucyAmJiB0aGlzLl9hY3Rpb25zW2FjdGlvbk5hbWVdKSB7Ci0gICAg
ICBpZiAodGhpcy5fYWN0aW9uc1thY3Rpb25OYW1lXS5hcHBseSh0aGlzLCBhcmdzKSA9PT0gdHJ1
ZSkgewotICAgICAgICAvLyBoYW5kbGVyIHJldHVybmVkIHRydWUsIHNvIHRoaXMgYWN0aW9uIHdp
bGwgYnViYmxlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAg
fSBlbHNlIGlmICh0aGlzLmRlcHJlY2F0ZWRTZW5kICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5k
bGVzICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRIYW5kbGVzKGFjdGlvbk5hbWUpKSB7Ci0gICAgICBp
ZiAodGhpcy5kZXByZWNhdGVkU2VuZC5hcHBseSh0aGlzLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50
cykpID09PSB0cnVlKSB7Ci0gICAgICAgIC8vIGhhbmRsZXIgcmV0dXJuIHRydWUsIHNvIHRoaXMg
YWN0aW9uIHdpbGwgYnViYmxlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAg
ICB9Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JykpIHsKLSAg
ICAgIEVtYmVyLmFzc2VydCgiVGhlIGB0YXJnZXRgIGZvciAiICsgdGhpcyArICIgKCIgKyB0YXJn
ZXQgKyAiKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRgIG1ldGhvZCIsIHR5cGVvZiB0YXJnZXQuc2Vu
ZCA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICB0YXJnZXQuc2VuZC5hcHBseSh0YXJnZXQsIGFyZ3Vt
ZW50cyk7Ci0gICAgfQotICB9Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIHNldCA9IEVtYmVyLnNldCwgZ2V0ID0gRW1iZXIuZ2V0LAotICAgIHJlc29sdmUgPSBFbWJl
ci5SU1ZQLnJlc29sdmUsCi0gICAgcmV0aHJvdyA9IEVtYmVyLlJTVlAucmV0aHJvdywKLSAgICBu
b3QgPSBFbWJlci5jb21wdXRlZC5ub3QsCi0gICAgb3IgPSBFbWJlci5jb21wdXRlZC5vcjsKLQot
LyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0gKi8KLQot
ZnVuY3Rpb24gb2JzZXJ2ZVByb21pc2UocHJveHksIHByb21pc2UpIHsKLSAgcHJvbWlzZS50aGVu
KGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgc2V0KHByb3h5LCAnaXNGdWxmaWxsZWQnLCB0cnVlKTsK
LSAgICBzZXQocHJveHksICdjb250ZW50JywgdmFsdWUpOwotICB9LCBmdW5jdGlvbihyZWFzb24p
IHsKLSAgICBzZXQocHJveHksICdpc1JlamVjdGVkJywgdHJ1ZSk7Ci0gICAgc2V0KHByb3h5LCAn
cmVhc29uJywgcmVhc29uKTsKLSAgICAvLyBkb24ndCByZS10aHJvdywgYXMgd2UgYXJlIG1lcmVs
eSBvYnNlcnZpbmcKLSAgfSwgIkVtYmVyOiBQcm9taXNlUHJveHkiKTsKLX0KLQotLyoqCi0gIEEg
bG93IGxldmVsIG1peGluIG1ha2luZyBPYmplY3RQcm94eSwgT2JqZWN0Q29udHJvbGxlciBvciBB
cnJheUNvbnRyb2xsZXIncyBwcm9taXNlIGF3YXJlLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgdmFy
IE9iamVjdFByb21pc2VDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQo
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4pOwotCi0gIHZhciBjb250cm9sbGVyID0gT2JqZWN0UHJv
bWlzZUNvbnRyb2xsZXIuY3JlYXRlKHsKLSAgICBwcm9taXNlOiAkLmdldEpTT04oJy9zb21lL3Jl
bW90ZS9kYXRhLmpzb24nKQotICB9KTsKLQotICBjb250cm9sbGVyLnRoZW4oZnVuY3Rpb24oanNv
bil7Ci0gICAgIC8vIHRoZSBqc29uCi0gIH0sIGZ1bmN0aW9uKHJlYXNvbikgewotICAgICAvLyB0
aGUgcmVhc29uIHdoeSB5b3UgaGF2ZSBubyBqc29uCi0gIH0pOwotICBgYGAKLQotICB0aGUgY29u
dHJvbGxlciBoYXMgYmluZGFibGUgYXR0cmlidXRlcyB3aGljaAotICB0cmFjayB0aGUgcHJvbWlz
ZXMgbGlmZSBjeWNsZQotCi0gIGBgYGphdmFzY3JpcHQKLSAgY29udHJvbGxlci5nZXQoJ2lzUGVu
ZGluZycpICAgLy89PiB0cnVlCi0gIGNvbnRyb2xsZXIuZ2V0KCdpc1NldHRsZWQnKSAgLy89PiBm
YWxzZQotICBjb250cm9sbGVyLmdldCgnaXNSZWplY3RlZCcpICAvLz0+IGZhbHNlCi0gIGNvbnRy
b2xsZXIuZ2V0KCdpc0Z1bGZpbGxlZCcpIC8vPT4gZmFsc2UKLSAgYGBgCi0KLSAgV2hlbiB0aGUg
dGhlICQuZ2V0SlNPTiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKLSAg
d2l0aCBqc29uLCB0aGUgbGlmZSBjeWNsZSBhdHRyaWJ1dGVzIHdpbGwgdXBkYXRlIGFjY29yZGlu
Z2x5LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgY29udHJvbGxlci5nZXQoJ2lzUGVuZGluZycpICAg
Ly89PiBmYWxzZQotICBjb250cm9sbGVyLmdldCgnaXNTZXR0bGVkJykgICAvLz0+IHRydWUKLSAg
Y29udHJvbGxlci5nZXQoJ2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQotICBjb250cm9sbGVyLmdl
dCgnaXNGdWxmaWxsZWQnKSAvLz0+IHRydWUKLSAgYGBgCi0KLSAgQXMgdGhlIGNvbnRyb2xsZXIg
aXMgYW4gT2JqZWN0Q29udHJvbGxlciwgYW5kIHRoZSBqc29uIG5vdyBpdHMgY29udGVudCwKLSAg
YWxsIHRoZSBqc29uIHByb3BlcnRpZXMgd2lsbCBiZSBhdmFpbGFibGUgZGlyZWN0bHkgZnJvbSB0
aGUgY29udHJvbGxlci4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEFzc3VtaW5nIHRoZSBmb2xs
b3dpbmcganNvbjoKLSAgewotICAgIGZpcnN0TmFtZTogJ1N0ZWZhbicsCi0gICAgbGFzdE5hbWU6
ICdQZW5uZXInCi0gIH0KLQotICAvLyBib3RoIHByb3BlcnRpZXMgd2lsbCBhY2Nlc3NpYmxlIG9u
IHRoZSBjb250cm9sbGVyCi0gIGNvbnRyb2xsZXIuZ2V0KCdmaXJzdE5hbWUnKSAvLz0+ICdTdGVm
YW4nCi0gIGNvbnRyb2xsZXIuZ2V0KCdsYXN0TmFtZScpICAvLz0+ICdQZW5uZXInCi0gIGBgYAot
Ci0gIElmIHRoZSBjb250cm9sbGVyIGlzIGJhY2tpbmcgYSB0ZW1wbGF0ZSwgdGhlIGF0dHJpYnV0
ZXMgYXJlCi0gIGJpbmRhYmxlIGZyb20gd2l0aGluIHRoYXQgdGVtcGxhdGUKLQotICBgYGBoYW5k
bGViYXJzCi0gIHt7I2lmIGlzUGVuZGluZ319Ci0gICAgbG9hZGluZy4uLgotICB7e2Vsc2V9fQot
ICAgIGZpcnN0TmFtZToge3tmaXJzdE5hbWV9fQotICAgIGxhc3ROYW1lOiB7e2xhc3ROYW1lfX0K
LSAge3svaWZ9fQotICBgYGAKLSAgQGNsYXNzIEVtYmVyLlByb21pc2VQcm94eU1peGluCi0qLwot
RW1iZXIuUHJvbWlzZVByb3h5TWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoewotICAvKioKLSAg
ICBJZiB0aGUgcHJveGllZCBwcm9taXNlIGlzIHJlamVjdGVkIHRoaXMgd2lsbCBjb250YWluIHRo
ZSByZWFzb24KLSAgICBwcm92aWRlZC4KLQotICAgIEBwcm9wZXJ0eSByZWFzb24KLSAgICBAZGVm
YXVsdCBudWxsCi0gICovCi0gIHJlYXNvbjogICAgbnVsbCwKLQotICAvKioKLSAgICBPbmNlIHRo
ZSBwcm94aWVkIHByb21pc2UgaGFzIHNldHRsZWQgdGhpcyB3aWxsIGJlY29tZSBgZmFsc2VgLgot
Ci0gICAgQHByb3BlcnR5IGlzUGVuZGluZwotICAgIEBkZWZhdWx0IHRydWUKLSAgKi8KLSAgaXNQ
ZW5kaW5nOiAgbm90KCdpc1NldHRsZWQnKS5yZWFkT25seSgpLAotCi0gIC8qKgotICAgIE9uY2Ug
dGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxlZCB0aGlzIHdpbGwgYmVjb21lIGB0cnVlYC4K
LQotICAgIEBwcm9wZXJ0eSBpc1NldHRsZWQKLSAgICBAZGVmYXVsdCBmYWxzZQotICAqLwotICBp
c1NldHRsZWQ6ICBvcignaXNSZWplY3RlZCcsICdpc0Z1bGZpbGxlZCcpLnJlYWRPbmx5KCksCi0K
LSAgLyoqCi0gICAgV2lsbCBiZWNvbWUgYHRydWVgIGlmIHRoZSBwcm94aWVkIHByb21pc2UgaXMg
cmVqZWN0ZWQuCi0KLSAgICBAcHJvcGVydHkgaXNSZWplY3RlZAotICAgIEBkZWZhdWx0IGZhbHNl
Ci0gICovCi0gIGlzUmVqZWN0ZWQ6ICBmYWxzZSwKLQotICAvKioKLSAgICBXaWxsIGJlY29tZSBg
dHJ1ZWAgaWYgdGhlIHByb3hpZWQgcHJvbWlzZSBpcyBmdWxmaWxsZWQuCi0KLSAgICBAcHJvcGVy
dHkgaXNGdWxsZmlsbGVkCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgaXNGdWxmaWxsZWQ6
IGZhbHNlLAotCi0gIC8qKgotICAgIFRoZSBwcm9taXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVl
IGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmplY3QuCi0KLSAgICBUaGlzIHByb3BlcnR5IG11
c3QgYmUgc3BlY2lmaWVkIHVwb24gY3JlYXRpb24sIGFuZCBzaG91bGQgbm90IGJlCi0gICAgY2hh
bmdlZCBvbmNlIGNyZWF0ZWQuCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKEVtYmVyLlByb21pc2VQcm94eU1peGlu
KS5jcmVhdGUoewotICAgICAgcHJvbWlzZTogPHRoZW5hYmxlPgotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQHByb3BlcnR5IHByb21pc2UKLSAgKi8KLSAgcHJvbWlzZTogRW1iZXIuY29tcHV0ZWQo
ZnVuY3Rpb24oa2V5LCBwcm9taXNlKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIp
IHsKLSAgICAgIHByb21pc2UgPSByZXNvbHZlKHByb21pc2UpOwotICAgICAgb2JzZXJ2ZVByb21p
c2UodGhpcywgcHJvbWlzZSk7Ci0gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCk7IC8vIGZvcmsg
dGhlIHByb21pc2UuCi0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigi
UHJvbWlzZVByb3h5J3MgcHJvbWlzZSBtdXN0IGJlIHNldCIpOwotICAgIH0KLSAgfSksCi0KLSAg
LyoqCi0gICAgQW4gYWxpYXMgdG8gdGhlIHByb3hpZWQgcHJvbWlzZSdzIGB0aGVuYC4KLQotICAg
IFNlZSBSU1ZQLlByb21pc2UudGhlbi4KLQotICAgIEBtZXRob2QgdGhlbgotICAgIEBwYXJhbSB7
RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQotICAqLwotICB0
aGVuOiBwcm9taXNlQWxpYXMoJ3RoZW4nKSwKLQotICAvKioKLSAgICBBbiBhbGlhcyB0byB0aGUg
cHJveGllZCBwcm9taXNlJ3MgYGNhdGNoYC4KLQotICAgIFNlZSBSU1ZQLlByb21pc2UuY2F0Y2gu
Ci0KLSAgICBAbWV0aG9kIGNhdGNoCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAg
ICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9Ci0gICovCi0gICdjYXRjaCc6IHByb21pc2VBbGlhcygn
Y2F0Y2gnKSwKLQotICAvKioKLSAgICBBbiBhbGlhcyB0byB0aGUgcHJveGllZCBwcm9taXNlJ3Mg
YGZpbmFsbHlgLgotCi0gICAgU2VlIFJTVlAuUHJvbWlzZS5maW5hbGx5LgotCi0gICAgQG1ldGhv
ZCBmaW5hbGx5Ci0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgICBAcmV0dXJuIHtS
U1ZQLlByb21pc2V9Ci0gICovCi0gICdmaW5hbGx5JzogcHJvbWlzZUFsaWFzKCdmaW5hbGx5JykK
LQotfSk7Ci0KLWZ1bmN0aW9uIHByb21pc2VBbGlhcyhuYW1lKSB7Ci0gIHJldHVybiBmdW5jdGlv
biAoKSB7Ci0gICAgdmFyIHByb21pc2UgPSBnZXQodGhpcywgJ3Byb21pc2UnKTsKLSAgICByZXR1
cm4gcHJvbWlzZVtuYW1lXS5hcHBseShwcm9taXNlLCBhcmd1bWVudHMpOwotICB9OwotfQotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
dmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz
LmZvckVhY2gsCi0gICAgUkVUQUlOID0gJ3InLAotICAgIElOU0VSVCA9ICdpJywKLSAgICBERUxF
VEUgPSAnZCc7Ci0KLS8qKgotICBBbiBgRW1iZXIuVHJhY2tlZEFycmF5YCB0cmFja3MgYXJyYXkg
b3BlcmF0aW9ucy4gIEl0J3MgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8KLSAgbGF6aWx5IGNvbXB1
dGUgdGhlIGluZGV4ZXMgb2YgaXRlbXMgaW4gYW4gYXJyYXkgYWZ0ZXIgdGhleSd2ZSBiZWVuIHNo
aWZ0ZWQgYnkKLSAgc3Vic2VxdWVudCBvcGVyYXRpb25zLgotCi0gIEBjbGFzcyBUcmFja2VkQXJy
YXkKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAcGFyYW0ge2FycmF5fSBbaXRlbXM9W11dIFRoZSBh
cnJheSB0byBiZSB0cmFja2VkLiAgVGhpcyBpcyB1c2VkIGp1c3QgdG8gZ2V0Ci0gIHRoZSBpbml0
aWFsIGl0ZW1zIGZvciB0aGUgc3RhcnRpbmcgc3RhdGUgb2YgcmV0YWluOm4uCi0qLwotRW1iZXIu
VHJhY2tlZEFycmF5ID0gZnVuY3Rpb24gKGl0ZW1zKSB7Ci0gIGlmIChhcmd1bWVudHMubGVuZ3Ro
IDwgMSkgeyBpdGVtcyA9IFtdOyB9Ci0KLSAgdmFyIGxlbmd0aCA9IGdldChpdGVtcywgJ2xlbmd0
aCcpOwotCi0gIGlmIChsZW5ndGgpIHsKLSAgICB0aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJh
eU9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCwgaXRlbXMpXTsKLSAgfSBlbHNlIHsKLSAgICB0aGlz
Ll9vcGVyYXRpb25zID0gW107Ci0gIH0KLX07Ci0KLUVtYmVyLlRyYWNrZWRBcnJheS5SRVRBSU4g
PSBSRVRBSU47Ci1FbWJlci5UcmFja2VkQXJyYXkuSU5TRVJUID0gSU5TRVJUOwotRW1iZXIuVHJh
Y2tlZEFycmF5LkRFTEVURSA9IERFTEVURTsKLQotRW1iZXIuVHJhY2tlZEFycmF5LnByb3RvdHlw
ZSA9IHsKLQotICAvKioKLSAgICBUcmFjayB0aGF0IGBuZXdJdGVtc2Agd2VyZSBhZGRlZCB0byB0
aGUgdHJhY2tlZCBhcnJheSBhdCBgaW5kZXhgLgotCi0gICAgQG1ldGhvZCBhZGRJdGVtcwotICAg
IEBwYXJhbSBpbmRleAotICAgIEBwYXJhbSBuZXdJdGVtcwotICAqLwotICBhZGRJdGVtczogZnVu
Y3Rpb24gKGluZGV4LCBuZXdJdGVtcykgewotICAgIHZhciBjb3VudCA9IGdldChuZXdJdGVtcywg
J2xlbmd0aCcpOwotICAgIGlmIChjb3VudCA8IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0
Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRpb24oaW5kZXgpLAotICAgICAgICBhcnJheU9wZXJh
dGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAgICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1h
dGNoLmluZGV4LAotICAgICAgICBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5n
ZVN0YXJ0LAotICAgICAgICBjb21wb3NlSW5kZXgsCi0gICAgICAgIHNwbGl0SW5kZXgsCi0gICAg
ICAgIHNwbGl0SXRlbXMsCi0gICAgICAgIHNwbGl0QXJyYXlPcGVyYXRpb24sCi0gICAgICAgIG5l
d0FycmF5T3BlcmF0aW9uOwotCi0gICAgbmV3QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVy
YXRpb24oSU5TRVJULCBjb3VudCwgbmV3SXRlbXMpOwotCi0gICAgaWYgKGFycmF5T3BlcmF0aW9u
KSB7Ci0gICAgICBpZiAoIW1hdGNoLnNwbGl0KSB7Ci0gICAgICAgIC8vIGluc2VydCBsZWZ0IG9m
IGFycmF5T3BlcmF0aW9uCi0gICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3Bl
cmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0aW9uKTsKLSAgICAgICAgY29tcG9zZUluZGV4
ID0gYXJyYXlPcGVyYXRpb25JbmRleDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuX3Nw
bGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0
LCBuZXdBcnJheU9wZXJhdGlvbik7Ci0gICAgICAgIGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0
aW9uSW5kZXggKyAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpbnNlcnQgYXQg
ZW5kCi0gICAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2gobmV3QXJyYXlPcGVyYXRpb24pOwotICAg
ICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVyYXRpb25JbmRleDsKLSAgICB9Ci0KLSAgICB0aGlz
Ll9jb21wb3NlSW5zZXJ0KGNvbXBvc2VJbmRleCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVHJhY2sg
dGhhdCBgY291bnRgIGl0ZW1zIHdlcmUgcmVtb3ZlZCBhdCBgaW5kZXhgLgotCi0gICAgQG1ldGhv
ZCByZW1vdmVJdGVtcwotICAgIEBwYXJhbSBpbmRleAotICAgIEBwYXJhbSBjb3VudAotICAqLwot
ICByZW1vdmVJdGVtczogZnVuY3Rpb24gKGluZGV4LCBjb3VudCkgewotICAgIGlmIChjb3VudCA8
IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbWF0Y2ggPSB0aGlzLl9maW5kQXJyYXlPcGVyYXRp
b24oaW5kZXgpLAotICAgICAgICBhcnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKLSAg
ICAgICAgYXJyYXlPcGVyYXRpb25JbmRleCA9IG1hdGNoLmluZGV4LAotICAgICAgICBhcnJheU9w
ZXJhdGlvblJhbmdlU3RhcnQgPSBtYXRjaC5yYW5nZVN0YXJ0LAotICAgICAgICBuZXdBcnJheU9w
ZXJhdGlvbiwKLSAgICAgICAgY29tcG9zZUluZGV4OwotCi0gICAgbmV3QXJyYXlPcGVyYXRpb24g
PSBuZXcgQXJyYXlPcGVyYXRpb24oREVMRVRFLCBjb3VudCk7Ci0gICAgaWYgKCFtYXRjaC5zcGxp
dCkgewotICAgICAgLy8gaW5zZXJ0IGxlZnQgb2YgYXJyYXlPcGVyYXRpb24KLSAgICAgIHRoaXMu
X29wZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5ld0FycmF5T3BlcmF0
aW9uKTsKLSAgICAgIGNvbXBvc2VJbmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXg7Ci0gICAgfSBl
bHNlIHsKLSAgICAgIHRoaXMuX3NwbGl0KGFycmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJy
YXlPcGVyYXRpb25SYW5nZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7Ci0gICAgICBjb21wb3Nl
SW5kZXggPSBhcnJheU9wZXJhdGlvbkluZGV4ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhp
cy5fY29tcG9zZURlbGV0ZShjb21wb3NlSW5kZXgpOwotICB9LAotCi0gIC8qKgotICAgIEFwcGx5
IGFsbCBvcGVyYXRpb25zLCByZWR1Y2luZyB0aGVtIHRvIHJldGFpbjpuLCBmb3IgYG5gLCB0aGUg
bnVtYmVyIG9mCi0gICAgaXRlbXMgaW4gdGhlIGFycmF5LgotCi0gICAgYGNhbGxiYWNrYCB3aWxs
IGJlIGNhbGxlZCBmb3IgZWFjaCBvcGVyYXRpb24gYW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBmb2xs
b3dpbmcgYXJndW1lbnRzOgotCi0gICAgKiB7YXJyYXl9IGl0ZW1zIFRoZSBpdGVtcyBmb3IgdGhl
IGdpdmVuIG9wZXJhdGlvbgotICAgICoge251bWJlcn0gb2Zmc2V0IFRoZSBjb21wdXRlZCBvZmZz
ZXQgb2YgdGhlIGl0ZW1zLCBpZSB0aGUgaW5kZXggaW4gdGhlCi0gICAgYXJyYXkgb2YgdGhlIGZp
cnN0IGl0ZW0gZm9yIHRoaXMgb3BlcmF0aW9uLgotICAgICoge3N0cmluZ30gb3BlcmF0aW9uIFRo
ZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUgb2YKLSAgICBgRW1iZXIuVHJhY2tlZEFycmF5
LntSRVRBSU4sIERFTEVURSwgSU5TRVJUfWAKLQotICAgIEBtZXRob2QgYXBwbHkKLSAgICBAcGFy
YW0ge2Z1bmN0aW9ufSBjYWxsYmFjawotICAqLwotICBhcHBseTogZnVuY3Rpb24gKGNhbGxiYWNr
KSB7Ci0gICAgdmFyIGl0ZW1zID0gW10sCi0gICAgICAgIG9mZnNldCA9IDA7Ci0KLSAgICBmb3JF
YWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0aW9uIChhcnJheU9wZXJhdGlvbikgewotICAgICAg
Y2FsbGJhY2soYXJyYXlPcGVyYXRpb24uaXRlbXMsIG9mZnNldCwgYXJyYXlPcGVyYXRpb24udHlw
ZSk7Ci0KLSAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50eXBlICE9PSBERUxFVEUpIHsKLSAgICAg
ICAgb2Zmc2V0ICs9IGFycmF5T3BlcmF0aW9uLmNvdW50OwotICAgICAgICBpdGVtcyA9IGl0ZW1z
LmNvbmNhdChhcnJheU9wZXJhdGlvbi5pdGVtcyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0
aGlzLl9vcGVyYXRpb25zID0gW25ldyBBcnJheU9wZXJhdGlvbihSRVRBSU4sIGl0ZW1zLmxlbmd0
aCwgaXRlbXMpXTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm4gYW4gYEFycmF5T3BlcmF0aW9u
TWF0Y2hgIGZvciB0aGUgb3BlcmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIGl0ZW0gYXQgYGluZGV4
YC4KLQotICAgIEBtZXRob2QgX2ZpbmRBcnJheU9wZXJhdGlvbgotCi0gICAgQHBhcmFtIHtudW1i
ZXJ9IGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aG9zZSBvcGVyYXRpb24gaW5mb3JtYXRp
b24KLSAgICBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2ZpbmRB
cnJheU9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4KSB7Ci0gICAgdmFyIGFycmF5T3BlcmF0aW9u
SW5kZXgsCi0gICAgICAgIGxlbiwKLSAgICAgICAgc3BsaXQgPSBmYWxzZSwKLSAgICAgICAgYXJy
YXlPcGVyYXRpb24sCi0gICAgICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCwKLSAgICAgICAg
YXJyYXlPcGVyYXRpb25SYW5nZUVuZDsKLQotICAgIC8vIE9QVElNSVpFOiB3ZSBjb3VsZCBzZWFy
Y2ggdGhlc2UgZmFzdGVyIGlmIHdlIGtlcHQgYSBiYWxhbmNlZCB0cmVlLgotICAgIC8vIGZpbmQg
bGVmdG1vc3QgYXJyYXlPcGVyYXRpb24gdG8gdGhlIHJpZ2h0IG9mIGBpbmRleGAKLSAgICBmb3Ig
KGFycmF5T3BlcmF0aW9uSW5kZXggPSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSAwLCBsZW4g
PSB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgYXJyYXlPcGVyYXRpb25JbmRleCA8IGxlbjsgKyth
cnJheU9wZXJhdGlvbkluZGV4KSB7Ci0gICAgICBhcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJh
dGlvbnNbYXJyYXlPcGVyYXRpb25JbmRleF07Ci0KLSAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50
eXBlID09PSBERUxFVEUpIHsgY29udGludWU7IH0KLQotICAgICAgYXJyYXlPcGVyYXRpb25SYW5n
ZUVuZCA9IGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFydCArIGFycmF5T3BlcmF0aW9uLmNvdW50IC0g
MTsKLQotICAgICAgaWYgKGluZGV4ID09PSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQpIHsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKGluZGV4ID4gYXJyYXlPcGVyYXRpb25SYW5n
ZVN0YXJ0ICYmIGluZGV4IDw9IGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQpIHsKLSAgICAgICAgc3Bs
aXQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFycmF5
T3BlcmF0aW9uUmFuZ2VTdGFydCA9IGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQgKyAxOwotICAgICAg
fQotICAgIH0KLQotICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYXRpb25NYXRjaChhcnJheU9wZXJh
dGlvbiwgYXJyYXlPcGVyYXRpb25JbmRleCwgc3BsaXQsIGFycmF5T3BlcmF0aW9uUmFuZ2VTdGFy
dCk7Ci0gIH0sCi0KLSAgX3NwbGl0OiBmdW5jdGlvbiAoYXJyYXlPcGVyYXRpb25JbmRleCwgc3Bs
aXRJbmRleCwgbmV3QXJyYXlPcGVyYXRpb24pIHsKLSAgICB2YXIgYXJyYXlPcGVyYXRpb24gPSB0
aGlzLl9vcGVyYXRpb25zW2FycmF5T3BlcmF0aW9uSW5kZXhdLAotICAgICAgICBzcGxpdEl0ZW1z
ID0gYXJyYXlPcGVyYXRpb24uaXRlbXMuc2xpY2Uoc3BsaXRJbmRleCksCi0gICAgICAgIHNwbGl0
QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24oYXJyYXlPcGVyYXRpb24udHlwZSwg
c3BsaXRJdGVtcy5sZW5ndGgsIHNwbGl0SXRlbXMpOwotCi0gICAgLy8gdHJ1bmNhdGUgTEhTCi0g
ICAgYXJyYXlPcGVyYXRpb24uY291bnQgPSBzcGxpdEluZGV4OwotICAgIGFycmF5T3BlcmF0aW9u
Lml0ZW1zID0gYXJyYXlPcGVyYXRpb24uaXRlbXMuc2xpY2UoMCwgc3BsaXRJbmRleCk7Ci0KLSAg
ICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShhcnJheU9wZXJhdGlvbkluZGV4ICsgMSwgMCwgbmV3
QXJyYXlPcGVyYXRpb24sIHNwbGl0QXJyYXlPcGVyYXRpb24pOwotICB9LAotCi0gIC8vIHNlZSBT
dWJBcnJheSBmb3IgYSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uCi0gIF9jb21wb3NlSW5zZXJ0OiBm
dW5jdGlvbiAoaW5kZXgpIHsKLSAgICB2YXIgbmV3QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVy
YXRpb25zW2luZGV4XSwKLSAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0
aW9uc1tpbmRleC0xXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAotICAgICAgICByaWdodEFycmF5T3Bl
cmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleCsxXSwgLy8gbWF5IGJlIHVuZGVmaW5lZAot
ICAgICAgICBsZWZ0T3AgPSBsZWZ0QXJyYXlPcGVyYXRpb24gJiYgbGVmdEFycmF5T3BlcmF0aW9u
LnR5cGUsCi0gICAgICAgIHJpZ2h0T3AgPSByaWdodEFycmF5T3BlcmF0aW9uICYmIHJpZ2h0QXJy
YXlPcGVyYXRpb24udHlwZTsKLQotICAgIGlmIChsZWZ0T3AgPT09IElOU0VSVCkgewotICAgICAg
ICAvLyBtZXJnZSBsZWZ0Ci0gICAgICAgIGxlZnRBcnJheU9wZXJhdGlvbi5jb3VudCArPSBuZXdB
cnJheU9wZXJhdGlvbi5jb3VudDsKLSAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zID0g
bGVmdEFycmF5T3BlcmF0aW9uLml0ZW1zLmNvbmNhdChuZXdBcnJheU9wZXJhdGlvbi5pdGVtcyk7
Ci0KLSAgICAgIGlmIChyaWdodE9wID09PSBJTlNFUlQpIHsKLSAgICAgICAgLy8gYWxzbyBtZXJn
ZSByaWdodCAod2UgaGF2ZSBzcGxpdCBhbiBpbnNlcnQgd2l0aCBhbiBpbnNlcnQpCi0gICAgICAg
IGxlZnRBcnJheU9wZXJhdGlvbi5jb3VudCArPSByaWdodEFycmF5T3BlcmF0aW9uLmNvdW50Owot
ICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24uaXRlbXMgPSBsZWZ0QXJyYXlPcGVyYXRpb24uaXRl
bXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRpb24uaXRlbXMpOwotICAgICAgICB0aGlzLl9vcGVy
YXRpb25zLnNwbGljZShpbmRleCwgMik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBvbmx5
IG1lcmdlIGxlZnQKLSAgICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwot
ICAgICAgfQotICAgIH0gZWxzZSBpZiAocmlnaHRPcCA9PT0gSU5TRVJUKSB7Ci0gICAgICAvLyBt
ZXJnZSByaWdodAotICAgICAgbmV3QXJyYXlPcGVyYXRpb24uY291bnQgKz0gcmlnaHRBcnJheU9w
ZXJhdGlvbi5jb3VudDsKLSAgICAgIG5ld0FycmF5T3BlcmF0aW9uLml0ZW1zID0gbmV3QXJyYXlP
cGVyYXRpb24uaXRlbXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRpb24uaXRlbXMpOwotICAgICAg
dGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoaW5kZXggKyAxLCAxKTsKLSAgICB9Ci0gIH0sCi0KLSAg
X2NvbXBvc2VEZWxldGU6IGZ1bmN0aW9uIChpbmRleCkgewotICAgIHZhciBhcnJheU9wZXJhdGlv
biA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXhdLAotICAgICAgICBkZWxldGVzVG9HbyA9IGFycmF5
T3BlcmF0aW9uLmNvdW50LAotICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24gPSB0aGlzLl9vcGVy
YXRpb25zW2luZGV4LTFdLCAvLyBtYXkgYmUgdW5kZWZpbmVkCi0gICAgICAgIGxlZnRPcCA9IGxl
ZnRBcnJheU9wZXJhdGlvbiAmJiBsZWZ0QXJyYXlPcGVyYXRpb24udHlwZSwKLSAgICAgICAgbmV4
dEFycmF5T3BlcmF0aW9uLAotICAgICAgICBuZXh0T3AsCi0gICAgICAgIG5leHRDb3VudCwKLSAg
ICAgICAgcmVtb3ZlTmV3QW5kTmV4dE9wID0gZmFsc2UsCi0gICAgICAgIHJlbW92ZWRJdGVtcyA9
IFtdOwotCi0gICAgaWYgKGxlZnRPcCA9PT0gREVMRVRFKSB7Ci0gICAgICBhcnJheU9wZXJhdGlv
biA9IGxlZnRBcnJheU9wZXJhdGlvbjsKLSAgICAgIGluZGV4IC09IDE7Ci0gICAgfQotCi0gICAg
Zm9yICh2YXIgaSA9IGluZGV4ICsgMTsgZGVsZXRlc1RvR28gPiAwOyArK2kpIHsKLSAgICAgIG5l
eHRBcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbaV07Ci0gICAgICBuZXh0T3AgPSBu
ZXh0QXJyYXlPcGVyYXRpb24udHlwZTsKLSAgICAgIG5leHRDb3VudCA9IG5leHRBcnJheU9wZXJh
dGlvbi5jb3VudDsKLQotICAgICAgaWYgKG5leHRPcCA9PT0gREVMRVRFKSB7Ci0gICAgICAgIGFy
cmF5T3BlcmF0aW9uLmNvdW50ICs9IG5leHRDb3VudDsKLSAgICAgICAgY29udGludWU7Ci0gICAg
ICB9Ci0KLSAgICAgIGlmIChuZXh0Q291bnQgPiBkZWxldGVzVG9HbykgewotICAgICAgICAvLyBk
OjIge3IsaX06NSAgd2UgcmVkdWNlIHRoZSByZXRhaW4gb3IgaW5zZXJ0LCBidXQgaXQgc3RheXMK
LSAgICAgICAgcmVtb3ZlZEl0ZW1zID0gcmVtb3ZlZEl0ZW1zLmNvbmNhdChuZXh0QXJyYXlPcGVy
YXRpb24uaXRlbXMuc3BsaWNlKDAsIGRlbGV0ZXNUb0dvKSk7Ci0gICAgICAgIG5leHRBcnJheU9w
ZXJhdGlvbi5jb3VudCAtPSBkZWxldGVzVG9HbzsKLQotICAgICAgICAvLyBJbiB0aGUgY2FzZSB3
aGVyZSB3ZSB0cnVuY2F0ZSB0aGUgbGFzdCBhcnJheU9wZXJhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0
bwotICAgICAgICAvLyByZW1vdmUgaXQ7IGFsc28gdGhlIGRlbGV0ZXNUb0dvIHJlZHVjdGlvbiBp
cyBub3QgdGhlIGVudGlyZXR5IG9mCi0gICAgICAgIC8vIG5leHRDb3VudAotICAgICAgICBpIC09
IDE7Ci0gICAgICAgIG5leHRDb3VudCA9IGRlbGV0ZXNUb0dvOwotCi0gICAgICAgIGRlbGV0ZXNU
b0dvID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChuZXh0Q291bnQgPT09IGRlbGV0
ZXNUb0dvKSB7Ci0gICAgICAgICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSBvZiBkOjIgaToyIGluIHdo
aWNoIGNhc2UgYm90aCBvcGVyYXRpb25zIGdvIGF3YXkKLSAgICAgICAgICAvLyBkdXJpbmcgY29t
cG9zaXRpb24uCi0gICAgICAgICAgcmVtb3ZlTmV3QW5kTmV4dE9wID0gdHJ1ZTsKLSAgICAgICAg
fQotICAgICAgICByZW1vdmVkSXRlbXMgPSByZW1vdmVkSXRlbXMuY29uY2F0KG5leHRBcnJheU9w
ZXJhdGlvbi5pdGVtcyk7Ci0gICAgICAgIGRlbGV0ZXNUb0dvIC09IG5leHRDb3VudDsKLSAgICAg
IH0KLQotICAgICAgaWYgKG5leHRPcCA9PT0gSU5TRVJUKSB7Ci0gICAgICAgIC8vIGQ6MiBpOjMg
d2lsbCByZXN1bHQgaW4gZGVsZXRlIGdvaW5nIGF3YXkKLSAgICAgICAgYXJyYXlPcGVyYXRpb24u
Y291bnQgLT0gbmV4dENvdW50OwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhcnJheU9wZXJh
dGlvbi5jb3VudCA+IDApIHsKLSAgICAgIC8vIGNvbXBvc2Ugb3VyIG5ldyBkZWxldGUgd2l0aCBw
b3NzaWJseSBzZXZlcmFsIG9wZXJhdGlvbnMgdG8gdGhlIHJpZ2h0IG9mCi0gICAgICAvLyBkaXNw
YXJhdGUgdHlwZXMKLSAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNlKGluZGV4KzEsIGktMS1p
bmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBkZWxldGUgb3BlcmF0aW9uIGNhbiBn
byBhd2F5OyBpdCBoYXMgbWVyZWx5IHJlZHVjZWQgc29tZSBvdGhlcgotICAgICAgLy8gb3BlcmF0
aW9uLCBhcyBpbiBkOjMgaTo0OyBpdCBtYXkgYWxzbyBoYXZlIGVsaW1pbmF0ZWQgdGhhdCBvcGVy
YXRpb24sCi0gICAgICAvLyBhcyBpbiBkOjMgaTozLgotICAgICAgdGhpcy5fb3BlcmF0aW9ucy5z
cGxpY2UoaW5kZXgsIHJlbW92ZU5ld0FuZE5leHRPcCA/IDIgOiAxKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gcmVtb3ZlZEl0ZW1zOwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7Ci0g
ICAgdmFyIHN0ciA9ICIiOwotICAgIGZvckVhY2godGhpcy5fb3BlcmF0aW9ucywgZnVuY3Rpb24g
KG9wZXJhdGlvbikgewotICAgICAgc3RyICs9ICIgIiArIG9wZXJhdGlvbi50eXBlICsgIjoiICsg
b3BlcmF0aW9uLmNvdW50OwotICAgIH0pOwotICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpOwot
ICB9Ci19OwotCi0vKioKLSAgSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFu
IGFycmF5IG9wZXJhdGlvbi4KLQotICBAbWV0aG9kIEFycmF5T3BlcmF0aW9uCi0gIEBwcml2YXRl
Ci0gIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24uICBPbmUg
b2YKLSAgYEVtYmVyLlRyYWNrZWRBcnJheS57UkVUQUlOLCBJTlNFUlQsIERFTEVURX1gCi0gIEBw
YXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgb3BlcmF0aW9u
LgotICBAcGFyYW0ge2FycmF5fSBpdGVtcyBUaGUgaXRlbXMgb2YgdGhlIG9wZXJhdGlvbiwgaWYg
aW5jbHVkZWQuICBSRVRBSU4gYW5kCi0gIElOU0VSVCBpbmNsdWRlIHRoZWlyIGl0ZW1zLCBERUxF
VEUgZG9lcyBub3QuCi0qLwotZnVuY3Rpb24gQXJyYXlPcGVyYXRpb24gKG9wZXJhdGlvbiwgY291
bnQsIGl0ZW1zKSB7Ci0gIHRoaXMudHlwZSA9IG9wZXJhdGlvbjsgLy8gUkVUQUlOIHwgSU5TRVJU
IHwgREVMRVRFCi0gIHRoaXMuY291bnQgPSBjb3VudDsKLSAgdGhpcy5pdGVtcyA9IGl0ZW1zOwot
fQotCi0vKioKLSAgSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBpbmNsdWRlIGluZm9y
bWF0aW9uIHdoZW4gbG9va2luZyB1cCBvcGVyYXRpb25zCi0gIGJ5IGl0ZW0gaW5kZXguCi0KLSAg
QG1ldGhvZCBBcnJheU9wZXJhdGlvbk1hdGNoCi0gIEBwcml2YXRlCi0gIEBwYXJhbSB7QXJyYXlP
cGVyYXRpb259IG9wZXJhdGlvbgotICBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9m
IGBvcGVyYXRpb25gIGluIHRoZSBhcnJheSBvZiBvcGVyYXRpb25zLgotICBAcGFyYW0ge2Jvb2xl
YW59IHNwbGl0IFdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIGluZGV4IHNlYXJjaGVkIGZvciB3b3Vs
ZAotICByZXF1aXJlIGEgc3BsaXQgZm9yIGEgbmV3IG9wZXJhdGlvbiB0eXBlLgotICBAcGFyYW0g
e251bWJlcn0gcmFuZ2VTdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG9w
ZXJhdGlvbiwKLSAgd2l0aCByZXNwZWN0IHRvIHRoZSB0cmFja2VkIGFycmF5LiAgVGhlIGluZGV4
IG9mIHRoZSBsYXN0IGl0ZW0gY2FuIGJlIGNvbXB1dGVkCi0gIGZyb20gYHJhbmdlU3RhcnRgIGFu
ZCBgb3BlcmF0aW9uLmNvdW50YC4KLSovCi1mdW5jdGlvbiBBcnJheU9wZXJhdGlvbk1hdGNoKG9w
ZXJhdGlvbiwgaW5kZXgsIHNwbGl0LCByYW5nZVN0YXJ0KSB7Ci0gIHRoaXMub3BlcmF0aW9uID0g
b3BlcmF0aW9uOwotICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gIHRoaXMuc3BsaXQgPSBzcGxpdDsK
LSAgdGhpcy5yYW5nZVN0YXJ0ID0gcmFuZ2VTdGFydDsKLX0KLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLXZhciBnZXQgPSBFbWJlci5nZXQsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1l
cmFibGVVdGlscy5mb3JFYWNoLAotICAgIFJFVEFJTiA9ICdyJywKLSAgICBGSUxURVIgPSAnZic7
Ci0KLWZ1bmN0aW9uIE9wZXJhdGlvbiAodHlwZSwgY291bnQpIHsKLSAgdGhpcy50eXBlID0gdHlw
ZTsKLSAgdGhpcy5jb3VudCA9IGNvdW50OwotfQotCi0vKioKLSAgQW4gYEVtYmVyLlN1YkFycmF5
YCB0cmFja3MgYW4gYXJyYXkgaW4gYSB3YXkgc2ltaWxhciB0bywgYnV0IG1vcmUgc3BlY2lhbGl6
ZWQKLSAgdGhhbiwgYEVtYmVyLlRyYWNrZWRBcnJheWAuICBJdCBpcyB1c2VmdWwgZm9yIGtlZXBp
bmcgdHJhY2sgb2YgdGhlIGluZGV4ZXMgb2YKLSAgaXRlbXMgd2l0aGluIGEgZmlsdGVyZWQgYXJy
YXkuCi0KLSAgQGNsYXNzIFN1YkFycmF5Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSovCi1FbWJlci5T
dWJBcnJheSA9IGZ1bmN0aW9uIChsZW5ndGgpIHsKLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAx
KSB7IGxlbmd0aCA9IDA7IH0KLQotICBpZiAobGVuZ3RoID4gMCkgewotICAgIHRoaXMuX29wZXJh
dGlvbnMgPSBbbmV3IE9wZXJhdGlvbihSRVRBSU4sIGxlbmd0aCldOwotICB9IGVsc2UgewotICAg
IHRoaXMuX29wZXJhdGlvbnMgPSBbXTsKLSAgfQotfTsKLQotRW1iZXIuU3ViQXJyYXkucHJvdG90
eXBlID0gewotICAvKioKLSAgICBUcmFjayB0aGF0IGFuIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSB0
cmFja2VkIGFycmF5LgotCi0gICAgQG1ldGhvZCBhZGRJdGVtCi0KLSAgICBAcGFyYW0ge251bWJl
cn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSB0cmFja2VkIGFycmF5LgotICAg
IEBwYXJhbSB7Ym9vbGVhbn0gbWF0Y2ggYHRydWVgIGlmZiB0aGUgaXRlbSBpcyBpbmNsdWRlZCBp
biB0aGUgc3ViYXJyYXkuCi0KLSAgICBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUg
aXRlbSBpbiB0aGUgc3ViYXJyYXkuCi0gICovCi0gIGFkZEl0ZW06IGZ1bmN0aW9uKGluZGV4LCBt
YXRjaCkgewotICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAotICAgICAgICBpdGVtVHlwZSA9IG1h
dGNoID8gUkVUQUlOIDogRklMVEVSLAotICAgICAgICBzZWxmID0gdGhpczsKLQotICAgIHRoaXMu
X2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9uKG9wZXJhdGlvbiwgb3BlcmF0aW9uSW5kZXgs
IHJhbmdlU3RhcnQsIHJhbmdlRW5kLCBzZWVuSW5TdWJBcnJheSkgewotICAgICAgdmFyIG5ld09w
ZXJhdGlvbiwgc3BsaXRPcGVyYXRpb247Ci0KLSAgICAgIGlmIChpdGVtVHlwZSA9PT0gb3BlcmF0
aW9uLnR5cGUpIHsKLSAgICAgICAgKytvcGVyYXRpb24uY291bnQ7Ci0gICAgICB9IGVsc2UgaWYg
KGluZGV4ID09PSByYW5nZVN0YXJ0KSB7Ci0gICAgICAgIC8vIGluc2VydCB0byB0aGUgbGVmdCBv
ZiBgb3BlcmF0aW9uYAotICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGljZShvcGVyYXRpb25J
bmRleCwgMCwgbmV3IE9wZXJhdGlvbihpdGVtVHlwZSwgMSkpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgbmV3T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihpdGVtVHlwZSwgMSk7Ci0gICAgICAg
IHNwbGl0T3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvcGVyYXRpb24udHlwZSwgcmFuZ2VFbmQg
LSBpbmRleCArIDEpOwotICAgICAgICBvcGVyYXRpb24uY291bnQgPSBpbmRleCAtIHJhbmdlU3Rh
cnQ7Ci0KLSAgICAgICAgc2VsZi5fb3BlcmF0aW9ucy5zcGxpY2Uob3BlcmF0aW9uSW5kZXggKyAx
LCAwLCBuZXdPcGVyYXRpb24sIHNwbGl0T3BlcmF0aW9uKTsKLSAgICAgIH0KLQotICAgICAgaWYg
KG1hdGNoKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7Ci0gICAg
ICAgICAgcmV0dXJuVmFsdWUgPSBzZWVuSW5TdWJBcnJheSArIChpbmRleCAtIHJhbmdlU3RhcnQp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJy
YXk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc2VsZi5fY29tcG9zZUF0KG9wZXJhdGlv
bkluZGV4KTsKLSAgICB9LCBmdW5jdGlvbihzZWVuSW5TdWJBcnJheSkgewotICAgICAgc2VsZi5f
b3BlcmF0aW9ucy5wdXNoKG5ldyBPcGVyYXRpb24oaXRlbVR5cGUsIDEpKTsKLQotICAgICAgaWYg
KG1hdGNoKSB7Ci0gICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7Ci0gICAgICB9
Ci0KLSAgICAgIHNlbGYuX2NvbXBvc2VBdChzZWxmLl9vcGVyYXRpb25zLmxlbmd0aC0xKTsKLSAg
ICB9KTsKLQotICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFj
ayB0aGF0IGFuIGl0ZW0gd2FzIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2tlZCBhcnJheS4KLQotICAg
IEBtZXRob2QgcmVtb3ZlSXRlbQotCi0gICAgQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRl
eCBvZiB0aGUgaXRlbSBpbiB0aGUgdHJhY2tlZCBhcnJheS4KLQotICAgIEByZXR1cm4ge251bWJl
cn0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBzdWJhcnJheSwgb3IgYC0xYCBpZiB0aGUg
aXRlbQotICAgIHdhcyBub3QgaW4gdGhlIHN1YmFycmF5LgotICAqLwotICByZW1vdmVJdGVtOiBm
dW5jdGlvbihpbmRleCkgewotICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAotICAgICAgICBzZWxm
ID0gdGhpczsKLQotICAgIHRoaXMuX2ZpbmRPcGVyYXRpb24oaW5kZXgsIGZ1bmN0aW9uIChvcGVy
YXRpb24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0LCByYW5nZUVuZCwgc2VlbkluU3ViQXJy
YXkpIHsKLSAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7Ci0gICAgICAgIHJl
dHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXkgKyAoaW5kZXggLSByYW5nZVN0YXJ0KTsKLSAgICAg
IH0KLQotICAgICAgaWYgKG9wZXJhdGlvbi5jb3VudCA+IDEpIHsKLSAgICAgICAgLS1vcGVyYXRp
b24uY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZWxmLl9vcGVyYXRpb25zLnNwbGlj
ZShvcGVyYXRpb25JbmRleCwgMSk7Ci0gICAgICAgIHNlbGYuX2NvbXBvc2VBdChvcGVyYXRpb25J
bmRleCk7Ci0gICAgICB9Ci0gICAgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoIkNhbid0IHJlbW92ZSBhbiBpdGVtIHRoYXQgaGFzIG5ldmVyIGJlZW4gYWRkZWQu
Iik7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gIH0sCi0KLQotICBfZmlu
ZE9wZXJhdGlvbjogZnVuY3Rpb24gKGluZGV4LCBmb3VuZENhbGxiYWNrLCBub3RGb3VuZENhbGxi
YWNrKSB7Ci0gICAgdmFyIG9wZXJhdGlvbkluZGV4LAotICAgICAgICBsZW4sCi0gICAgICAgIG9w
ZXJhdGlvbiwKLSAgICAgICAgcmFuZ2VTdGFydCwKLSAgICAgICAgcmFuZ2VFbmQsCi0gICAgICAg
IHNlZW5JblN1YkFycmF5ID0gMDsKLQotICAgIC8vIE9QVElNSVpFOiBjaGFuZ2UgdG8gYmFsYW5j
ZWQgdHJlZQotICAgIC8vIGZpbmQgbGVmdG1vc3Qgb3BlcmF0aW9uIHRvIHRoZSByaWdodCBvZiBg
aW5kZXhgCi0gICAgZm9yIChvcGVyYXRpb25JbmRleCA9IHJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0
aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgb3BlcmF0aW9uSW5kZXggPCBsZW47IHJhbmdlU3RhcnQg
PSByYW5nZUVuZCArIDEsICsrb3BlcmF0aW9uSW5kZXgpIHsKLSAgICAgIG9wZXJhdGlvbiA9IHRo
aXMuX29wZXJhdGlvbnNbb3BlcmF0aW9uSW5kZXhdOwotICAgICAgcmFuZ2VFbmQgPSByYW5nZVN0
YXJ0ICsgb3BlcmF0aW9uLmNvdW50IC0gMTsKLQotICAgICAgaWYgKGluZGV4ID49IHJhbmdlU3Rh
cnQgJiYgaW5kZXggPD0gcmFuZ2VFbmQpIHsKLSAgICAgICAgZm91bmRDYWxsYmFjayhvcGVyYXRp
b24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0LCByYW5nZUVuZCwgc2VlbkluU3ViQXJyYXkp
OwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi50eXBlID09PSBS
RVRBSU4pIHsKLSAgICAgICAgc2VlbkluU3ViQXJyYXkgKz0gb3BlcmF0aW9uLmNvdW50OwotICAg
ICAgfQotICAgIH0KLQotICAgIG5vdEZvdW5kQ2FsbGJhY2soc2VlbkluU3ViQXJyYXkpOwotICB9
LAotCi0gIF9jb21wb3NlQXQ6IGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgdmFyIG9wID0gdGhpcy5f
b3BlcmF0aW9uc1tpbmRleF0sCi0gICAgICAgIG90aGVyT3A7Ci0KLSAgICBpZiAoIW9wKSB7Ci0g
ICAgICAvLyBDb21wb3Npbmcgb3V0IG9mIGJvdW5kcyBpcyBhIG5vLW9wLCBhcyB3aGVuIHJlbW92
aW5nIHRoZSBsYXN0IG9wZXJhdGlvbgotICAgICAgLy8gaW4gdGhlIGxpc3QuCi0gICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgb3RoZXJPcCA9IHRoaXMu
X29wZXJhdGlvbnNbaW5kZXgtMV07Ci0gICAgICBpZiAob3RoZXJPcC50eXBlID09PSBvcC50eXBl
KSB7Ci0gICAgICAgIG9wLmNvdW50ICs9IG90aGVyT3AuY291bnQ7Ci0gICAgICAgIHRoaXMuX29w
ZXJhdGlvbnMuc3BsaWNlKGluZGV4LTEsIDEpOwotICAgICAgICAtLWluZGV4OwotICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChpbmRleCA8IHRoaXMuX29wZXJhdGlvbnMubGVuZ3RoLTEpIHsKLSAg
ICAgIG90aGVyT3AgPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4KzFdOwotICAgICAgaWYgKG90aGVy
T3AudHlwZSA9PT0gb3AudHlwZSkgewotICAgICAgICBvcC5jb3VudCArPSBvdGhlck9wLmNvdW50
OwotICAgICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRleCsxLCAxKTsKLSAgICAgIH0K
LSAgICB9Ci0gIH0sCi0KLSAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKLSAgICB2YXIgc3RyID0g
IiI7Ci0gICAgZm9yRWFjaCh0aGlzLl9vcGVyYXRpb25zLCBmdW5jdGlvbiAob3BlcmF0aW9uKSB7
Ci0gICAgICBzdHIgKz0gIiAiICsgb3BlcmF0aW9uLnR5cGUgKyAiOiIgKyBvcGVyYXRpb24uY291
bnQ7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMSk7Ci0gIH0KLX07Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5Db250YWluZXIgPSByZXF1aXJlTW9kdWxl
KCdjb250YWluZXInKTsKLUVtYmVyLkNvbnRhaW5lci5zZXQgPSBFbWJlci5zZXQ7Ci0KLX0pKCk7
Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJlci5BcHBsaWNhdGlvbiA9IEVtYmVyLk5hbWVzcGFj
ZS5leHRlbmQoKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBl
bWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgT1VUX09GX1JBTkdFX0VY
Q0VQVElPTiA9ICJJbmRleCBvdXQgb2YgcmFuZ2UiOwotdmFyIEVNUFRZID0gW107Ci0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIEFuIEFycmF5UHJveHkg
d3JhcHMgYW55IG90aGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQv
b3IKLSAgYEVtYmVyLk11dGFibGVBcnJheSxgIGZvcndhcmRpbmcgYWxsIHJlcXVlc3RzLiBUaGlz
IG1ha2VzIGl0IHZlcnkgdXNlZnVsIGZvcgotICBhIG51bWJlciBvZiBiaW5kaW5nIHVzZSBjYXNl
cyBvciBvdGhlciBjYXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKLSAgb3V0IHRoZSB1bmRl
cmx5aW5nIGFycmF5IGlzIHVzZWZ1bC4KLQotICBBIHNpbXBsZSBleGFtcGxlIG9mIHVzYWdlOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgdmFyIHBldHMgPSBbJ2RvZycsICdjYXQnLCAnZmlzaCddOwot
ICB2YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNyZWF0ZSh7IGNvbnRlbnQ6IEVtYmVyLkEocGV0
cykgfSk7Ci0KLSAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAgICAgICAg
IC8vICdkb2cnCi0gIGFwLnNldCgnY29udGVudCcsIFsnYW1vZWJhJywgJ3BhcmFtZWNpdW0nXSk7
Ci0gIGFwLmdldCgnZmlyc3RPYmplY3QnKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnYW1v
ZWJhJwotICBgYGAKLQotICBUaGlzIGNsYXNzIGNhbiBhbHNvIGJlIHVzZWZ1bCBhcyBhIGxheWVy
IHRvIHRyYW5zZm9ybSB0aGUgY29udGVudHMgb2YKLSAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFj
Y2Vzc2VkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IG92ZXJyaWRpbmcKLSAgYG9iamVjdEF0Q29udGVu
dGA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICB2YXIgcGV0cyA9IFsnZG9nJywgJ2NhdCcsICdmaXNo
J107Ci0gIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHkuY3JlYXRlKHsKLSAgICAgIGNvbnRlbnQ6
IEVtYmVyLkEocGV0cyksCi0gICAgICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewot
ICAgICAgICAgIHJldHVybiB0aGlzLmdldCgnY29udGVudCcpLm9iamVjdEF0KGlkeCkudG9VcHBl
ckNhc2UoKTsKLSAgICAgIH0KLSAgfSk7Ci0KLSAgYXAuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyAu
ICdET0cnCi0gIGBgYAotCi0gIEBjbGFzcyBBcnJheVByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIK
LSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0gIEB1c2VzIEVtYmVyLk11dGFibGVBcnJheQotKi8K
LUVtYmVyLkFycmF5UHJveHkgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJh
eSwgewotCi0gIC8qKgotICAgIFRoZSBjb250ZW50IGFycmF5LiBNdXN0IGJlIGFuIG9iamVjdCB0
aGF0IGltcGxlbWVudHMgYEVtYmVyLkFycmF5YCBhbmQvb3IKLSAgICBgRW1iZXIuTXV0YWJsZUFy
cmF5LmAKLQotICAgIEBwcm9wZXJ0eSBjb250ZW50Ci0gICAgQHR5cGUgRW1iZXIuQXJyYXkKLSAg
Ki8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioKLSAgIFRoZSBhcnJheSB0aGF0IHRoZSBwcm94
eSBwcmV0ZW5kcyB0byBiZS4gSW4gdGhlIGRlZmF1bHQgYEFycmF5UHJveHlgCi0gICBpbXBsZW1l
bnRhdGlvbiwgdGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBvZiBg
QXJyYXlQcm94eWAKLSAgIGNhbiBvdmVycmlkZSB0aGlzIHByb3BlcnR5IHRvIHByb3ZpZGUgdGhp
bmdzIGxpa2Ugc29ydGluZyBhbmQgZmlsdGVyaW5nLgotCi0gICBAcHJvcGVydHkgYXJyYW5nZWRD
b250ZW50Ci0gICovCi0gIGFycmFuZ2VkQ29udGVudDogRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2Nv
bnRlbnQnKSwKLQotICAvKioKLSAgICBTaG91bGQgYWN0dWFsbHkgcmV0cmlldmUgdGhlIG9iamVj
dCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlCi0gICAgY29udGVudC4gWW91IGNhbiBv
dmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHRyYW5zZm9ybSB0aGUKLSAgICBj
b250ZW50IGl0ZW0gdG8gc29tZXRoaW5nIG5ldy4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgb25s
eSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51bGxgLgotCi0gICAgQG1ldGhvZCBvYmpl
Y3RBdENvbnRlbnQKLSAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byByZXRyaWV2
ZS4KLSAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm9uZSBm
b3VuZAotICAqLwotICBvYmplY3RBdENvbnRlbnQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHJldHVy
biBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpLm9iamVjdEF0KGlkeCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgU2hvdWxkIGFjdHVhbGx5IHJlcGxhY2UgdGhlIHNwZWNpZmllZCBvYmplY3RzIG9u
IHRoZSBjb250ZW50IGFycmF5LgotICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4g
c3ViY2xhc3NlcyB0byB0cmFuc2Zvcm0gdGhlIGNvbnRlbnQgaXRlbQotICAgIGludG8gc29tZXRo
aW5nIG5ldy4KLQotICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVu
dCBpcyBub24tYG51bGxgLgotCi0gICAgQG1ldGhvZCByZXBsYWNlQ29udGVudAotICAgIEBwYXJh
bSB7TnVtYmVyfSBpZHggVGhlIHN0YXJ0aW5nIGluZGV4Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IGFt
dCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBjb250ZW50LgotICAgIEBw
YXJhbSB7QXJyYXl9IG9iamVjdHMgT3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnQg
b3IgbnVsbCBpZiBubwotICAgICAgb2JqZWN0cy4KLSAgICBAcmV0dXJuIHt2b2lkfQotICAqLwot
ICByZXBsYWNlQ29udGVudDogZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKLSAgICBnZXQo
dGhpcywgJ2NvbnRlbnQnKS5yZXBsYWNlKGlkeCwgYW10LCBvYmplY3RzKTsKLSAgfSwKLQotICAv
KioKLSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh
bmdlLiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCB0aGUKLSAgICBlbnRpcmUgYXJyYXkgY29udGVu
dCB3aWxsIGNoYW5nZS4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfY29udGVudFdpbGxD
aGFuZ2UKLSAgKi8KLSAgX2NvbnRlbnRXaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcign
Y29udGVudCcsIGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3RlYXJkb3duQ29udGVudCgpOwotICB9
KSwKLQotICBfdGVhcmRvd25Db250ZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGVudCA9
IGdldCh0aGlzLCAnY29udGVudCcpOwotCi0gICAgaWYgKGNvbnRlbnQpIHsKLSAgICAgIGNvbnRl
bnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICAgIHdpbGxDaGFuZ2U6ICdjb250
ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlk
Q2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIGNvbnRlbnRBcnJheVdpbGxDaGFu
Z2U6IEVtYmVyLkssCi0gIGNvbnRlbnRBcnJheURpZENoYW5nZTogRW1iZXIuSywKLQotICAvKioK
LSAgICBJbnZva2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMg
b2JzZXJ2ZXJzIHRoYXQgdGhlCi0gICAgZW50aXJlIGFycmF5IGNvbnRlbnQgaGFzIGNoYW5nZWQu
Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2NvbnRlbnREaWRDaGFuZ2UKLSAgKi8KLSAg
X2NvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKTsKLQotICAgIEVtYmVyLmFz
c2VydCgiQ2FuJ3Qgc2V0IEFycmF5UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIGNvbnRlbnQg
IT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBDb250ZW50KCk7Ci0gIH0pLAotCi0gIF9zZXR1
cENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250
ZW50Jyk7Ci0KLSAgICBpZiAoY29udGVudCkgewotICAgICAgY29udGVudC5hZGRBcnJheU9ic2Vy
dmVyKHRoaXMsIHsKLSAgICAgICAgd2lsbENoYW5nZTogJ2NvbnRlbnRBcnJheVdpbGxDaGFuZ2Un
LAotICAgICAgICBkaWRDaGFuZ2U6ICdjb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9KTsK
LSAgICB9Ci0gIH0sCi0KLSAgX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9y
ZU9ic2VydmVyKCdhcnJhbmdlZENvbnRlbnQnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5n
ZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgbGVuID0g
YXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKLQot
ICAgIHRoaXMuYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlKHRoaXMsIDAsIGxlbiwgdW5k
ZWZpbmVkKTsKLSAgICB0aGlzLmFycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2UodGhpcyk7Ci0KLSAg
ICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudChhcnJhbmdlZENvbnRlbnQpOwotICB9KSwK
LQotICBfYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignYXJyYW5nZWRD
b250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz
LCAnYXJyYW5nZWRDb250ZW50JyksCi0gICAgICAgIGxlbiA9IGFycmFuZ2VkQ29udGVudCA/IGdl
dChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKSA6IDA7Ci0KLSAgICBFbWJlci5hc3NlcnQoIkNh
bid0IHNldCBBcnJheVByb3h5J3MgY29udGVudCB0byBpdHNlbGYiLCBhcnJhbmdlZENvbnRlbnQg
IT09IHRoaXMpOwotCi0gICAgdGhpcy5fc2V0dXBBcnJhbmdlZENvbnRlbnQoKTsKLQotICAgIHRo
aXMuYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlKHRoaXMpOwotICAgIHRoaXMuYXJyYW5nZWRDb250
ZW50QXJyYXlEaWRDaGFuZ2UodGhpcywgMCwgdW5kZWZpbmVkLCBsZW4pOwotICB9KSwKLQotICBf
c2V0dXBBcnJhbmdlZENvbnRlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBhcnJhbmdlZENvbnRl
bnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOwotCi0gICAgaWYgKGFycmFuZ2VkQ29u
dGVudCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhpcywgewot
ICAgICAgICB3aWxsQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAg
ICAgICAgZGlkQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgICB9
KTsKLSAgICB9Ci0gIH0sCi0KLSAgX3RlYXJkb3duQXJyYW5nZWRDb250ZW50OiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQn
KTsKLQotICAgIGlmIChhcnJhbmdlZENvbnRlbnQpIHsKLSAgICAgIGFycmFuZ2VkQ29udGVudC5y
ZW1vdmVBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAgICAgd2lsbENoYW5nZTogJ2FycmFuZ2Vk
Q29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICAgIGRpZENoYW5nZTogJ2FycmFuZ2VkQ29u
dGVudEFycmF5RGlkQ2hhbmdlJwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIGFycmFuZ2Vk
Q29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLkssCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTog
RW1iZXIuSywKLQotICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIGdldCh0
aGlzLCAnY29udGVudCcpICYmIHRoaXMub2JqZWN0QXRDb250ZW50KGlkeCk7Ci0gIH0sCi0KLSAg
bGVuZ3RoOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJyYW5nZWRDb250
ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLSAgICByZXR1cm4gYXJyYW5nZWRD
b250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsKLSAgICAvLyBObyBk
ZXBlbmRlbmNpZXMgc2luY2UgRW51bWVyYWJsZSBub3RpZmllcyBsZW5ndGggb2YgY2hhbmdlCi0g
IH0pLAotCi0gIF9yZXBsYWNlOiBmdW5jdGlvbihpZHgsIGFtdCwgb2JqZWN0cykgewotICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCdUaGUg
Y29udGVudCBwcm9wZXJ0eSBvZiAnKyB0aGlzLmNvbnN0cnVjdG9yICsgJyBzaG91bGQgYmUgc2V0
IGJlZm9yZSBtb2RpZnlpbmcgaXQnLCBjb250ZW50KTsKLSAgICBpZiAoY29udGVudCkgdGhpcy5y
ZXBsYWNlQ29udGVudChpZHgsIGFtdCwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgcmVwbGFjZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnYXJyYW5nZWRD
b250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVudCcpKSB7Ci0gICAgICB0aGlzLl9yZXBsYWNl
LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBF
bWJlci5FcnJvcigiVXNpbmcgcmVwbGFjZSBvbiBhbiBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5v
dCBhbGxvd2VkLiIpOwotICAgIH0KLSAgfSwKLQotICBfaW5zZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwg
b2JqZWN0KSB7Ci0gICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnY29udGVudC5sZW5ndGgnKSkgdGhy
b3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9FWENFUFRJT04pOwotICAgIHRoaXMuX3Jl
cGxhY2UoaWR4LCAwLCBbb2JqZWN0XSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgaW5z
ZXJ0QXQ6IGZ1bmN0aW9uKGlkeCwgb2JqZWN0KSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnYXJyYW5n
ZWRDb250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVudCcpKSB7Ci0gICAgICByZXR1cm4gdGhp
cy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcg
RW1iZXIuRXJyb3IoIlVzaW5nIGluc2VydEF0IG9uIGFuIGFycmFuZ2VkIEFycmF5UHJveHkgaXMg
bm90IGFsbG93ZWQuIik7Ci0gICAgfQotICB9LAotCi0gIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFy
dCwgbGVuKSB7Ci0gICAgaWYgKCdudW1iZXInID09PSB0eXBlb2Ygc3RhcnQpIHsKLSAgICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgICAgYXJyYW5nZWRDb250
ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgICBpbmRpY2VzID0g
W10sIGk7Ci0KLSAgICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICds
ZW5ndGgnKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKE9VVF9PRl9SQU5HRV9F
WENFUFRJT04pOwotICAgICAgfQotCi0gICAgICBpZiAobGVuID09PSB1bmRlZmluZWQpIGxlbiA9
IDE7Ci0KLSAgICAgIC8vIEdldCBhIGxpc3Qgb2YgaW5kaWNlcyBpbiBvcmlnaW5hbCBjb250ZW50
IHRvIHJlbW92ZQotICAgICAgZm9yIChpPXN0YXJ0OyBpPHN0YXJ0K2xlbjsgaSsrKSB7Ci0gICAg
ICAgIC8vIFVzZSBhcnJhbmdlZENvbnRlbnQgaGVyZSBzbyB3ZSBhdm9pZCBjb25mdXNpb24gd2l0
aCBvYmplY3RzIHRyYW5zZm9ybWVkIGJ5IG9iamVjdEF0Q29udGVudAotICAgICAgICBpbmRpY2Vz
LnB1c2goY29udGVudC5pbmRleE9mKGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChpKSkpOwotICAg
ICAgfQotCi0gICAgICAvLyBSZXBsYWNlIGluIHJldmVyc2Ugb3JkZXIgc2luY2UgaW5kaWNlcyB3
aWxsIGNoYW5nZQotICAgICAgaW5kaWNlcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYiAt
IGE7IH0pOwotCi0gICAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOwotICAgICAgZm9y
IChpPTA7IGk8aW5kaWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICB0aGlzLl9yZXBsYWNlKGlu
ZGljZXNbaV0sIDEsIEVNUFRZKTsKLSAgICAgIH0KLSAgICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hh
bmdlcygpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzIDsKLSAgfSwKLQotICBwdXNoT2JqZWN0
OiBmdW5jdGlvbihvYmopIHsKLSAgICB0aGlzLl9pbnNlcnRBdChnZXQodGhpcywgJ2NvbnRlbnQu
bGVuZ3RoJyksIG9iaikgOwotICAgIHJldHVybiBvYmogOwotICB9LAotCi0gIHB1c2hPYmplY3Rz
OiBmdW5jdGlvbihvYmplY3RzKSB7Ci0gICAgaWYgKCEoRW1iZXIuRW51bWVyYWJsZS5kZXRlY3Qo
b2JqZWN0cykgfHwgRW1iZXIuaXNBcnJheShvYmplY3RzKSkpIHsKLSAgICAgIHRocm93IG5ldyBU
eXBlRXJyb3IoIk11c3QgcGFzcyBFbWJlci5FbnVtZXJhYmxlIHRvIEVtYmVyLk11dGFibGVBcnJh
eSNwdXNoT2JqZWN0cyIpOwotICAgIH0KLSAgICB0aGlzLl9yZXBsYWNlKGdldCh0aGlzLCAnbGVu
Z3RoJyksIDAsIG9iamVjdHMpOwotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHNldE9iamVj
dHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHJl
dHVybiB0aGlzLmNsZWFyKCk7Ci0KLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsK
LSAgICB0aGlzLl9yZXBsYWNlKDAsIGxlbiwgb2JqZWN0cyk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgdW5zaGlmdE9iamVjdDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgdGhpcy5faW5zZXJ0
QXQoMCwgb2JqKSA7Ci0gICAgcmV0dXJuIG9iaiA7Ci0gIH0sCi0KLSAgdW5zaGlmdE9iamVjdHM6
IGZ1bmN0aW9uKG9iamVjdHMpIHsKLSAgICB0aGlzLl9yZXBsYWNlKDAsIDAsIG9iamVjdHMpOwot
ICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHNsaWNlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
YXJyID0gdGhpcy50b0FycmF5KCk7Ci0gICAgcmV0dXJuIGFyci5zbGljZS5hcHBseShhcnIsIGFy
Z3VtZW50cyk7Ci0gIH0sCi0KLSAgYXJyYW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlOiBmdW5j
dGlvbihpdGVtLCBpZHgsIHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJheUNv
bnRlbnRXaWxsQ2hhbmdlKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpOwotICB9LAotCi0gIGFy
cmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihpdGVtLCBpZHgsIHJlbW92ZWRD
bnQsIGFkZGVkQ250KSB7Ci0gICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1v
dmVkQ250LCBhZGRlZENudCk7Ci0gIH0sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5fc3VwZXIoKTsKLSAgICB0aGlzLl9zZXR1cENvbnRlbnQoKTsKLSAgICB0aGlzLl9zZXR1cEFy
cmFuZ2VkQ29udGVudCgpOwotICB9LAotCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAg
ICB0aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudCgpOwotICAgIHRoaXMuX3RlYXJkb3duQ29u
dGVudCgpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1v
ZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi0KLXZhciBzZXQgPSBF
bWJlci5zZXQsIGdldCA9IEVtYmVyLmdldCwgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIg
Zm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIGluZGV4T2YgPSBF
bWJlci5BcnJheVBvbHlmaWxscy5pbmRleE9mOwotCi12YXIgRWFjaEFycmF5ID0gRW1iZXIuT2Jq
ZWN0LmV4dGVuZChFbWJlci5BcnJheSwgewotCi0gIGluaXQ6IGZ1bmN0aW9uKGNvbnRlbnQsIGtl
eU5hbWUsIG93bmVyKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9rZXlOYW1lID0g
a2V5TmFtZTsKLSAgICB0aGlzLl9vd25lciAgID0gb3duZXI7Ci0gICAgdGhpcy5fY29udGVudCA9
IGNvbnRlbnQ7Ci0gIH0sCi0KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewotICAgIHZhciBp
dGVtID0gdGhpcy5fY29udGVudC5vYmplY3RBdChpZHgpOwotICAgIHJldHVybiBpdGVtICYmIGdl
dChpdGVtLCB0aGlzLl9rZXlOYW1lKTsKLSAgfSwKLQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVk
KGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVudDsKLSAgICByZXR1
cm4gY29udGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAwOwotICB9KQotCi19KTsKLQot
dmFyIElTX09CU0VSVkVSID0gL14uKzooYmVmb3JlfGNoYW5nZSkkLzsKLQotZnVuY3Rpb24gYWRk
T2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5hbWUsIHByb3h5LCBpZHgsIGxvYykg
ewotICB2YXIgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzLCBndWlkOwotICBpZiAoIW9iamVjdHMp
IG9iamVjdHMgPSBwcm94eS5fb2JqZWN0cyA9IHt9OwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsK
LSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2JqZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewot
ICAgICAgRW1iZXIuYXNzZXJ0KCdXaGVuIHVzaW5nIEBlYWNoIHRvIG9ic2VydmUgdGhlIGFycmF5
ICcgKyBjb250ZW50ICsgJywgdGhlIGFycmF5IG11c3QgcmV0dXJuIGFuIG9iamVjdCcsIEVtYmVy
LnR5cGVPZihpdGVtKSA9PT0gJ2luc3RhbmNlJyB8fCBFbWJlci50eXBlT2YoaXRlbSkgPT09ICdv
YmplY3QnKTsKLSAgICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKGl0ZW0sIGtleU5hbWUsIHBy
b3h5LCAnY29udGVudEtleVdpbGxDaGFuZ2UnKTsKLSAgICAgIEVtYmVyLmFkZE9ic2VydmVyKGl0
ZW0sIGtleU5hbWUsIHByb3h5LCAnY29udGVudEtleURpZENoYW5nZScpOwotCi0gICAgICAvLyBr
ZWVwIHRyYWNrIG9mIHRoZSBpbmRleCBlYWNoIGl0ZW0gd2FzIGZvdW5kIGF0IHNvIHdlIGNhbiBt
YXAKLSAgICAgIC8vIGl0IGJhY2sgd2hlbiB0aGUgb2JqIGNoYW5nZXMuCi0gICAgICBndWlkID0g
Z3VpZEZvcihpdGVtKTsKLSAgICAgIGlmICghb2JqZWN0c1tndWlkXSkgb2JqZWN0c1tndWlkXSA9
IFtdOwotICAgICAgb2JqZWN0c1tndWlkXS5wdXNoKGxvYyk7Ci0gICAgfQotICB9Ci19Ci0KLWZ1
bmN0aW9uIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94
eSwgaWR4LCBsb2MpIHsKLSAgdmFyIG9iamVjdHMgPSBwcm94eS5fb2JqZWN0czsKLSAgaWYgKCFv
YmplY3RzKSBvYmplY3RzID0gcHJveHkuX29iamVjdHMgPSB7fTsKLSAgdmFyIGluZGljaWVzLCBn
dWlkOwotCi0gIHdoaWxlKC0tbG9jPj1pZHgpIHsKLSAgICB2YXIgaXRlbSA9IGNvbnRlbnQub2Jq
ZWN0QXQobG9jKTsKLSAgICBpZiAoaXRlbSkgewotICAgICAgRW1iZXIucmVtb3ZlQmVmb3JlT2Jz
ZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5V2lsbENoYW5nZScpOwotICAg
ICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5
RGlkQ2hhbmdlJyk7Ci0KLSAgICAgIGd1aWQgPSBndWlkRm9yKGl0ZW0pOwotICAgICAgaW5kaWNp
ZXMgPSBvYmplY3RzW2d1aWRdOwotICAgICAgaW5kaWNpZXNbaW5kZXhPZi5jYWxsKGluZGljaWVz
LCBsb2MpXSA9IG51bGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICBUaGlzIGlzIHRoZSBvYmpl
Y3QgaW5zdGFuY2UgcmV0dXJuZWQgd2hlbiB5b3UgZ2V0IHRoZSBgQGVhY2hgIHByb3BlcnR5IG9u
IGFuCi0gIGFycmF5LiBJdCB1c2VzIHRoZSB1bmtub3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRv
bWF0aWNhbGx5IGNyZWF0ZQotICBFYWNoQXJyYXkgaW5zdGFuY2VzIGZvciBwcm9wZXJ0eSBuYW1l
cy4KLQotICBAcHJpdmF0ZQotICBAY2xhc3MgRWFjaFByb3h5Ci0gIEBuYW1lc3BhY2UgRW1iZXIK
LSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ci0qLwotRW1iZXIuRWFjaFByb3h5ID0gRW1iZXIuT2Jq
ZWN0LmV4dGVuZCh7Ci0KLSAgaW5pdDogZnVuY3Rpb24oY29udGVudCkgewotICAgIHRoaXMuX3N1
cGVyKCk7Ci0gICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgY29udGVudC5hZGRBcnJh
eU9ic2VydmVyKHRoaXMpOwotCi0gICAgLy8gaW4gY2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2Jz
ZXJ2aW5nIHNvbWUga2V5cyBtYWtlIHN1cmUgdGhleSBhcmUKLSAgICAvLyBhZGRlZAotICAgIGZv
ckVhY2goRW1iZXIud2F0Y2hlZEV2ZW50cyh0aGlzKSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7Ci0g
ICAgICB0aGlzLmRpZEFkZExpc3RlbmVyKGV2ZW50TmFtZSk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgWW91IGNhbiBkaXJlY3RseSBhY2Nlc3MgbWFwcGVkIHByb3BlcnRpZXMg
Ynkgc2ltcGx5IHJlcXVlc3RpbmcgdGhlbS4KLSAgICBUaGUgYHVua25vd25Qcm9wZXJ0eWAgaGFu
ZGxlciB3aWxsIGdlbmVyYXRlIGFuIEVhY2hBcnJheSBvZiBlYWNoIGl0ZW0uCi0KLSAgICBAbWV0
aG9kIHVua25vd25Qcm9wZXJ0eQotICAgIEBwYXJhbSBrZXlOYW1lIHtTdHJpbmd9Ci0gICAgQHBh
cmFtIHZhbHVlIHsqfQotICAqLwotICB1bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUs
IHZhbHVlKSB7Ci0gICAgdmFyIHJldDsKLSAgICByZXQgPSBuZXcgRWFjaEFycmF5KHRoaXMuX2Nv
bnRlbnQsIGtleU5hbWUsIHRoaXMpOwotICAgIEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsIGtl
eU5hbWUsIG51bGwsIHJldCk7Ci0gICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRLZXkoa2V5
TmFtZSk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSwKLQotICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gIC8vIEFSUkFZIENIQU5H
RVMKLSAgLy8gSW52b2tlcyB3aGVuZXZlciB0aGUgY29udGVudCBhcnJheSBpdHNlbGYgY2hhbmdl
cy4KLQotICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQsIGlkeCwgcmVtb3ZlZENu
dCwgYWRkZWRDbnQpIHsKLSAgICB2YXIga2V5cyA9IHRoaXMuX2tleXMsIGtleSwgbGltOwotCi0g
ICAgbGltID0gcmVtb3ZlZENudD4wID8gaWR4K3JlbW92ZWRDbnQgOiAtMTsKLSAgICBFbWJlci5i
ZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKLQotICAgIGZvcihrZXkgaW4ga2V5cykgewotICAg
ICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLQotICAgICAg
aWYgKGxpbT4wKSB7IHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXksIHRo
aXMsIGlkeCwgbGltKTsgfQotCi0gICAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywg
a2V5KTsKLSAgICB9Ci0KLSAgICBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcy5fY29udGVu
dCwgJ0BlYWNoJyk7Ci0gICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwotICB9LAot
Ci0gIGFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgsIHJlbW92ZWRDbnQsIGFk
ZGVkQ250KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzLCBsaW07Ci0KLSAgICBsaW0gPSBh
ZGRlZENudD4wID8gaWR4K2FkZGVkQ250IDogLTE7Ci0gICAgRW1iZXIuY2hhbmdlUHJvcGVydGll
cyhmdW5jdGlvbigpIHsKLSAgICAgIGZvcih2YXIga2V5IGluIGtleXMpIHsKLSAgICAgICAgaWYg
KCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLQotICAgICAgICBpZiAo
bGltPjApIHsgYWRkT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleSwgdGhpcywgaWR4
LCBsaW0pOyB9Ci0KLSAgICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywga2V5KTsK
LSAgICAgIH0KLQotICAgICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcy5fY29udGVudCwg
J0BlYWNoJyk7Ci0gICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBMSVNURU4gRk9S
IE5FVyBPQlNFUlZFUlMgQU5EIE9USEVSIEVWRU5UIExJU1RFTkVSUwotICAvLyBTdGFydCBtb25p
dG9yaW5nIGtleXMgYmFzZWQgb24gd2hvIGlzIGxpc3RlbmluZy4uLgotCi0gIGRpZEFkZExpc3Rl
bmVyOiBmdW5jdGlvbihldmVudE5hbWUpIHsKLSAgICBpZiAoSVNfT0JTRVJWRVIudGVzdChldmVu
dE5hbWUpKSB7Ci0gICAgICB0aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShldmVudE5hbWUu
c2xpY2UoMCwgLTcpKTsKLSAgICB9Ci0gIH0sCi0KLSAgZGlkUmVtb3ZlTGlzdGVuZXI6IGZ1bmN0
aW9uKGV2ZW50TmFtZSkgewotICAgIGlmIChJU19PQlNFUlZFUi50ZXN0KGV2ZW50TmFtZSkpIHsK
LSAgICAgIHRoaXMuc3RvcE9ic2VydmluZ0NvbnRlbnRLZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03
KSk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gQ09OVEVOVCBLRVkgT0JTRVJWSU5HCi0g
IC8vIEFjdHVhbCB3YXRjaCBrZXlzIG9uIHRoZSBzb3VyY2UgY29udGVudC4KLQotICBiZWdpbk9i
c2VydmluZ0NvbnRlbnRLZXk6IGZ1bmN0aW9uKGtleU5hbWUpIHsKLSAgICB2YXIga2V5cyA9IHRo
aXMuX2tleXM7Ci0gICAgaWYgKCFrZXlzKSBrZXlzID0gdGhpcy5fa2V5cyA9IHt9OwotICAgIGlm
ICgha2V5c1trZXlOYW1lXSkgewotICAgICAga2V5c1trZXlOYW1lXSA9IDE7Ci0gICAgICB2YXIg
Y29udGVudCA9IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVuID0gZ2V0KGNvbnRlbnQsICds
ZW5ndGgnKTsKLSAgICAgIGFkZE9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlOYW1l
LCB0aGlzLCAwLCBsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXlzW2tleU5hbWVdKys7Ci0g
ICAgfQotICB9LAotCi0gIHN0b3BPYnNlcnZpbmdDb250ZW50S2V5OiBmdW5jdGlvbihrZXlOYW1l
KSB7Ci0gICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOwotICAgIGlmIChrZXlzICYmIChrZXlzW2tl
eU5hbWVdPjApICYmICgtLWtleXNba2V5TmFtZV08PTApKSB7Ci0gICAgICB2YXIgY29udGVudCA9
IHRoaXMuX2NvbnRlbnQsCi0gICAgICAgICAgbGVuICAgICA9IGdldChjb250ZW50LCAnbGVuZ3Ro
Jyk7Ci0gICAgICByZW1vdmVPYnNlcnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwg
dGhpcywgMCwgbGVuKTsKLSAgICB9Ci0gIH0sCi0KLSAgY29udGVudEtleVdpbGxDaGFuZ2U6IGZ1
bmN0aW9uKG9iaiwga2V5TmFtZSkgewotICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlz
LCBrZXlOYW1lKTsKLSAgfSwKLQotICBjb250ZW50S2V5RGlkQ2hhbmdlOiBmdW5jdGlvbihvYmos
IGtleU5hbWUpIHsKLSAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsK
LSAgfQotCi19KTsKLQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1
bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotCi12YXIgZ2V0ID0gRW1i
ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
X3JlcGxhY2U7Ci0KLS8vIEFkZCBFbWJlci5BcnJheSB0byBBcnJheS5wcm90b3R5cGUuIFJlbW92
ZSBtZXRob2RzIHdpdGggbmF0aXZlCi0vLyBpbXBsZW1lbnRhdGlvbnMgYW5kIHN1cHBseSBzb21l
IG1vcmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGdlbmVyaWMgbWV0aG9kcwotLy8gYmVjYXVzZSB0
aGV5IGFyZSBzbyBjb21tb24uCi12YXIgTmF0aXZlQXJyYXkgPSBFbWJlci5NaXhpbi5jcmVhdGUo
RW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNlcnZhYmxlLCBFbWJlci5Db3B5YWJsZSwgewot
Ci0gIC8vIGJlY2F1c2UgbGVuZ3RoIGlzIGEgYnVpbHQtaW4gcHJvcGVydHkgd2UgbmVlZCB0byBr
bm93IHRvIGp1c3QgZ2V0IHRoZQotICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KLSAgZ2V0OiBmdW5j
dGlvbihrZXkpIHsKLSAgICBpZiAoa2V5PT09J2xlbmd0aCcpIHJldHVybiB0aGlzLmxlbmd0aDsK
LSAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGtleSkgcmV0dXJuIHRoaXNba2V5XTsK
LSAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlcihrZXkpOwotICB9LAotCi0gIG9iamVjdEF0OiBm
dW5jdGlvbihpZHgpIHsKLSAgICByZXR1cm4gdGhpc1tpZHhdOwotICB9LAotCi0gIC8vIHByaW1p
dGl2ZSBmb3IgYXJyYXkgc3VwcG9ydC4KLSAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCBhbXQsIG9i
amVjdHMpIHsKLQotICAgIGlmICh0aGlzLmlzRnJvemVuKSB0aHJvdyBFbWJlci5GUk9aRU5fRVJS
T1I7Ci0KLSAgICAvLyBpZiB3ZSByZXBsYWNlZCBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBp
dGVtcywgdGhlbiBwYXNzIG9ubHkgdGhlCi0gICAgLy8gcmVwbGFjZWQgcmFuZ2UuIE90aGVyd2lz
ZSwgcGFzcyB0aGUgZnVsbCByZW1haW5pbmcgYXJyYXkgbGVuZ3RoCi0gICAgLy8gc2luY2UgZXZl
cnl0aGluZyBoYXMgc2hpZnRlZAotICAgIHZhciBsZW4gPSBvYmplY3RzID8gZ2V0KG9iamVjdHMs
ICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdlKGlkeCwgYW10
LCBsZW4pOwotCi0gICAgaWYgKGxlbiA9PT0gMCkgewotICAgICAgdGhpcy5zcGxpY2UoaWR4LCBh
bXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXBsYWNlKHRoaXMsIGlkeCwgYW10LCBvYmplY3Rz
KTsKLSAgICB9Ci0KLSAgICB0aGlzLmFycmF5Q29udGVudERpZENoYW5nZShpZHgsIGFtdCwgbGVu
KTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvLyBJZiB5b3UgYXNrIGZvciBhbiB1bmtu
b3duIHByb3BlcnR5LCB0aGVuIHRyeSB0byBjb2xsZWN0IHRoZSB2YWx1ZQotICAvLyBmcm9tIG1l
bWJlciBpdGVtcy4KLSAgdW5rbm93blByb3BlcnR5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0g
ICAgdmFyIHJldDsvLyA9IHRoaXMucmVkdWNlZFByb3BlcnR5KGtleSwgdmFsdWUpIDsKLSAgICBp
ZiAoKHZhbHVlICE9PSB1bmRlZmluZWQpICYmIHJldCA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICBy
ZXQgPSB0aGlzW2tleV0gPSB2YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0sCi0K
LSAgLy8gSWYgYnJvd3NlciBkaWQgbm90IGltcGxlbWVudCBpbmRleE9mIG5hdGl2ZWx5LCB0aGVu
IG92ZXJyaWRlIHdpdGgKLSAgLy8gc3BlY2lhbGl6ZWQgdmVyc2lvbgotICBpbmRleE9mOiBmdW5j
dGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4gPSB0aGlzLmxlbmd0aDsK
LQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSAwOwotICAgIGVsc2Ug
c3RhcnRBdCA9IChzdGFydEF0IDwgMCkgPyBNYXRoLmNlaWwoc3RhcnRBdCkgOiBNYXRoLmZsb29y
KHN0YXJ0QXQpOwotICAgIGlmIChzdGFydEF0IDwgMCkgc3RhcnRBdCArPSBsZW47Ci0KLSAgICBm
b3IoaWR4PXN0YXJ0QXQ7aWR4PGxlbjtpZHgrKykgewotICAgICAgaWYgKHRoaXNbaWR4XSA9PT0g
b2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9LAotCi0gIGxh
c3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0QXQpIHsKLSAgICB2YXIgaWR4LCBsZW4g
PSB0aGlzLmxlbmd0aDsKLQotICAgIGlmIChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQg
PSBsZW4tMTsKLSAgICBlbHNlIHN0YXJ0QXQgPSAoc3RhcnRBdCA8IDApID8gTWF0aC5jZWlsKHN0
YXJ0QXQpIDogTWF0aC5mbG9vcihzdGFydEF0KTsKLSAgICBpZiAoc3RhcnRBdCA8IDApIHN0YXJ0
QXQgKz0gbGVuOwotCi0gICAgZm9yKGlkeD1zdGFydEF0O2lkeD49MDtpZHgtLSkgewotICAgICAg
aWYgKHRoaXNbaWR4XSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsKLSAgICB9Ci0gICAgcmV0dXJu
IC0xOwotICB9LAotCi0gIGNvcHk6IGZ1bmN0aW9uKGRlZXApIHsKLSAgICBpZiAoZGVlcCkgewot
ICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIEVtYmVyLmNvcHko
aXRlbSwgdHJ1ZSk7IH0pOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzLnNsaWNlKCk7Ci0gIH0K
LX0pOwotCi0vLyBSZW1vdmUgYW55IG1ldGhvZHMgaW1wbGVtZW50ZWQgbmF0aXZlbHkgc28gd2Ug
ZG9uJ3Qgb3ZlcnJpZGUgdGhlbQotdmFyIGlnbm9yZSA9IFsnbGVuZ3RoJ107Ci1FbWJlci5FbnVt
ZXJhYmxlVXRpbHMuZm9yRWFjaChOYXRpdmVBcnJheS5rZXlzKCksIGZ1bmN0aW9uKG1ldGhvZE5h
bWUpIHsKLSAgaWYgKEFycmF5LnByb3RvdHlwZVttZXRob2ROYW1lXSkgaWdub3JlLnB1c2gobWV0
aG9kTmFtZSk7Ci19KTsKLQotaWYgKGlnbm9yZS5sZW5ndGg+MCkgewotICBOYXRpdmVBcnJheSA9
IE5hdGl2ZUFycmF5LndpdGhvdXQuYXBwbHkoTmF0aXZlQXJyYXksIGlnbm9yZSk7Ci19Ci0KLS8q
KgotICBUaGUgTmF0aXZlQXJyYXkgbWl4aW4gY29udGFpbnMgdGhlIHByb3BlcnRpZXMgbmVlZGVk
IHRvIHRvIG1ha2UgdGhlIG5hdGl2ZQotICBBcnJheSBzdXBwb3J0IEVtYmVyLk11dGFibGVBcnJh
eSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbnQgQVBJcy4gVW5sZXNzIHlvdQotICBoYXZlIGBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkFycmF5YCBz
ZXQgdG8KLSAgZmFsc2UsIHRoaXMgd2lsbCBiZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIE90aGVy
d2lzZSB5b3UgY2FuIGFwcGx5IHRoZSBtaXhpbgotICBhdCBhbnl0aW1lIGJ5IGNhbGxpbmcgYEVt
YmVyLk5hdGl2ZUFycmF5LmFjdGl2YXRlYC4KLQotICBAY2xhc3MgTmF0aXZlQXJyYXkKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5NdXRhYmxlQXJyYXkKLSAgQHVzZXMgRW1iZXIu
T2JzZXJ2YWJsZQotICBAdXNlcyBFbWJlci5Db3B5YWJsZQotKi8KLUVtYmVyLk5hdGl2ZUFycmF5
ID0gTmF0aXZlQXJyYXk7Ci0KLS8qKgotICBDcmVhdGVzIGFuIGBFbWJlci5OYXRpdmVBcnJheWAg
ZnJvbSBhbiBBcnJheSBsaWtlIG9iamVjdC4KLSAgRG9lcyBub3QgbW9kaWZ5IHRoZSBvcmlnaW5h
bCBvYmplY3QuIEVtYmVyLkEgaXMgbm90IG5lZWRlZCBpZgotICBgRW1iZXIuRVhURU5EX1BST1RP
VFlQRVNgIGlzIGB0cnVlYCAodGhlIGRlZmF1bHQgdmFsdWUpLiBIb3dldmVyLAotICBpdCBpcyBy
ZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgRW1iZXIuQSB3aGVuIGNyZWF0aW5nIGFkZG9ucyBmb3IK
LSAgZW1iZXIgb3Igd2hlbiB5b3UgY2FuIG5vdCBndWFyYW50ZWUgdGhhdCBgRW1iZXIuRVhURU5E
X1BST1RPVFlQRVNgCi0gIHdpbGwgYmUgYHRydWVgLgotCi0gIEV4YW1wbGUKLQotICBgYGBqcwot
ICB2YXIgUGFnaW5hdGlvbiA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7Ci0gICAgdGFn
TmFtZTogJ3VsJywKLSAgICBjbGFzc05hbWVzOiBbJ3BhZ2luYXRpb24nXSwKLSAgICBpbml0OiBm
dW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgICBpZiAoIXRoaXMuZ2V0KCdj
b250ZW50JykpIHsKLSAgICAgICAgdGhpcy5zZXQoJ2NvbnRlbnQnLCBFbWJlci5BKFtdKSk7Ci0g
ICAgICB9Ci0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBBCi0gIEBmb3IgRW1iZXIK
LSAgQHJldHVybiB7RW1iZXIuTmF0aXZlQXJyYXl9Ci0qLwotRW1iZXIuQSA9IGZ1bmN0aW9uKGFy
cikgewotICBpZiAoYXJyID09PSB1bmRlZmluZWQpIHsgYXJyID0gW107IH0KLSAgcmV0dXJuIEVt
YmVyLkFycmF5LmRldGVjdChhcnIpID8gYXJyIDogRW1iZXIuTmF0aXZlQXJyYXkuYXBwbHkoYXJy
KTsKLX07Ci0KLS8qKgotICBBY3RpdmF0ZXMgdGhlIG1peGluIG9uIHRoZSBBcnJheS5wcm90b3R5
cGUgaWYgbm90IGFscmVhZHkgYXBwbGllZC4gQ2FsbGluZwotICB0aGlzIG1ldGhvZCBtb3JlIHRo
YW4gb25jZSBpcyBzYWZlLiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gZW1iZXIgaXMgbG9hZGVk
Ci0gIHVubGVzcyB5b3UgaGF2ZSBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUy5BcnJheWAKLSAgc2V0IHRvIGBmYWxzZWAuCi0KLSAgRXhhbXBsZQot
Ci0gIGBgYGpzCi0gIGlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewotICAgIEVtYmVyLk5hdGl2ZUFycmF5LmFjdGl2
YXRlKCk7Ci0gIH0KLSAgYGBgCi0KLSAgQG1ldGhvZCBhY3RpdmF0ZQotICBAZm9yIEVtYmVyLk5h
dGl2ZUFycmF5Ci0gIEBzdGF0aWMKLSAgQHJldHVybiB7dm9pZH0KLSovCi1FbWJlci5OYXRpdmVB
cnJheS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkgewotICBOYXRpdmVBcnJheS5hcHBseShBcnJheS5w
cm90b3R5cGUpOwotCi0gIEVtYmVyLkEgPSBmdW5jdGlvbihhcnIpIHsgcmV0dXJuIGFyciB8fCBb
XTsgfTsKLX07Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJl
ci5FWFRFTkRfUFJPVE9UWVBFUy5BcnJheSkgewotICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0
ZSgpOwotfQotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1i
ZXIKLUBzdWJtb2R1bGUgZW1iZXItcnVudGltZQotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwg
c2V0ID0gRW1iZXIuc2V0LCBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwgaXNOb25lID0gRW1iZXIu
aXNOb25lLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwotCi0vKioKLSAgQW4gdW5vcmRlcmVkIGNv
bGxlY3Rpb24gb2Ygb2JqZWN0cy4KLQotICBBIFNldCB3b3JrcyBhIGJpdCBsaWtlIGFuIGFycmF5
IGV4Y2VwdCB0aGF0IGl0cyBpdGVtcyBhcmUgbm90IG9yZGVyZWQuIFlvdQotICBjYW4gY3JlYXRl
IGEgc2V0IHRvIGVmZmljaWVudGx5IHRlc3QgZm9yIG1lbWJlcnNoaXAgZm9yIGFuIG9iamVjdC4g
WW91IGNhbgotICBhbHNvIGl0ZXJhdGUgdGhyb3VnaCBhIHNldCBqdXN0IGxpa2UgYW4gYXJyYXks
IGV2ZW4gYWNjZXNzaW5nIG9iamVjdHMgYnkKLSAgaW5kZXgsIGhvd2V2ZXIgdGhlcmUgaXMgbm8g
Z3VhcmFudGVlIGFzIHRvIHRoZWlyIG9yZGVyLgotCi0gIEFsbCBTZXRzIGFyZSBvYnNlcnZhYmxl
IHZpYSB0aGUgRW51bWVyYWJsZSBPYnNlcnZlciBBUEkgLSB3aGljaCB3b3JrcwotICBvbiBhbnkg
ZW51bWVyYWJsZSBvYmplY3QgaW5jbHVkaW5nIGJvdGggU2V0cyBhbmQgQXJyYXlzLgotCi0gICMj
IENyZWF0aW5nIGEgU2V0Ci0KLSAgWW91IGNhbiBjcmVhdGUgYSBzZXQgbGlrZSB5b3Ugd291bGQg
bW9zdCBvYmplY3RzIHVzaW5nCi0gIGBuZXcgRW1iZXIuU2V0KClgLiBNb3N0IG5ldyBzZXRzIHlv
dSBjcmVhdGUgd2lsbCBiZSBlbXB0eSwgYnV0IHlvdSBjYW4KLSAgYWxzbyBpbml0aWFsaXplIHRo
ZSBzZXQgd2l0aCBzb21lIGNvbnRlbnQgYnkgcGFzc2luZyBhbiBhcnJheSBvciBvdGhlcgotICBl
bnVtZXJhYmxlIG9mIG9iamVjdHMgdG8gdGhlIGNvbnN0cnVjdG9yLgotCi0gIEZpbmFsbHksIHlv
dSBjYW4gcGFzcyBpbiBhbiBleGlzdGluZyBzZXQgYW5kIHRoZSBzZXQgd2lsbCBiZSBjb3BpZWQu
IFlvdQotICBjYW4gYWxzbyBjcmVhdGUgYSBjb3B5IG9mIGEgc2V0IGJ5IGNhbGxpbmcgYEVtYmVy
LlNldCNjb3B5KClgLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgLy8gY3JlYXRlcyBhIG5ldyBlbXB0
eSBzZXQKLSAgdmFyIGZvdW5kTmFtZXMgPSBuZXcgRW1iZXIuU2V0KCk7Ci0KLSAgLy8gY3JlYXRl
cyBhIHNldCB3aXRoIGZvdXIgbmFtZXMgaW4gaXQuCi0gIHZhciBuYW1lcyA9IG5ldyBFbWJlci5T
ZXQoWyJDaGFybGVzIiwgIlRvbSIsICJKdWFuIiwgIkFsZXgiXSk7IC8vIDpQCi0KLSAgLy8gY3Jl
YXRlcyBhIGNvcHkgb2YgdGhlIG5hbWVzIHNldC4KLSAgdmFyIG5hbWVzQ29weSA9IG5ldyBFbWJl
ci5TZXQobmFtZXMpOwotCi0gIC8vIHNhbWUgYXMgYWJvdmUuCi0gIHZhciBhbm90aGVyTmFtZXND
b3B5ID0gbmFtZXMuY29weSgpOwotICBgYGAKLQotICAjIyBBZGRpbmcvUmVtb3ZpbmcgT2JqZWN0
cwotCi0gIFlvdSBnZW5lcmFsbHkgYWRkIG9yIHJlbW92ZSBvYmplY3RzIGZyb20gYSBzZXQgdXNp
bmcgYGFkZCgpYCBvcgotICBgcmVtb3ZlKClgLiBZb3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBvYmpl
Y3QgaW5jbHVkaW5nIHByaW1pdGl2ZXMgc3VjaCBhcwotICBudW1iZXJzLCBzdHJpbmdzLCBhbmQg
Ym9vbGVhbnMuCi0KLSAgVW5saWtlIGFycmF5cywgb2JqZWN0cyBjYW4gb25seSBleGlzdCBvbmUg
dGltZSBpbiBhIHNldC4gSWYgeW91IGNhbGwgYGFkZCgpYAotICBvbiBhIHNldCB3aXRoIHRoZSBz
YW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIG9iamVjdCB3aWxsIG9ubHkgYmUgYWRkZWQK
LSAgb25jZS4gTGlrZXdpc2UsIGNhbGxpbmcgYHJlbW92ZSgpYCB3aXRoIHRoZSBzYW1lIG9iamVj
dCBtdWx0aXBsZSB0aW1lcyB3aWxsCi0gIHJlbW92ZSB0aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1l
IGFuZCBoYXZlIG5vIGVmZmVjdCBvbiBmdXR1cmUgY2FsbHMgdW50aWwKLSAgeW91IGFkZCB0aGUg
b2JqZWN0IHRvIHRoZSBzZXQgYWdhaW4uCi0KLSAgTk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3Zl
IGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhIHNldC4gQW55IGF0dGVtcHQgdG8gZG8KLSAgc28g
d2lsbCBiZSBpZ25vcmVkLgotCi0gIEluIGFkZGl0aW9uIHRvIGFkZC9yZW1vdmUgeW91IGNhbiBh
bHNvIGNhbGwgYHB1c2goKWAvYHBvcCgpYC4gUHVzaCBiZWhhdmVzCi0gIGp1c3QgbGlrZSBgYWRk
KClgIGJ1dCBgcG9wKClgLCB1bmxpa2UgYHJlbW92ZSgpYCB3aWxsIHBpY2sgYW4gYXJiaXRyYXJ5
Ci0gIG9iamVjdCwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXQuIFRoaXMgaXMgYSBnb29kIHdheSB0
byB1c2UgYSBzZXQgYXMgYSBqb2IKLSAgcXVldWUgd2hlbiB5b3UgZG9uJ3QgY2FyZSB3aGljaCBv
cmRlciB0aGUgam9icyBhcmUgZXhlY3V0ZWQgaW4uCi0KLSAgIyMgVGVzdGluZyBmb3IgYW4gT2Jq
ZWN0Ci0KLSAgVG8gdGVzdCBmb3IgYW4gb2JqZWN0J3MgcHJlc2VuY2UgaW4gYSBzZXQgeW91IHNp
bXBseSBjYWxsCi0gIGBFbWJlci5TZXQjY29udGFpbnMoKWAuCi0KLSAgIyMgT2JzZXJ2aW5nIGNo
YW5nZXMKLQotICBXaGVuIHVzaW5nIGBFbWJlci5TZXRgLCB5b3UgY2FuIG9ic2VydmUgdGhlIGAi
W10iYCBwcm9wZXJ0eSB0byBiZQotICBhbGVydGVkIHdoZW5ldmVyIHRoZSBjb250ZW50IGNoYW5n
ZXMuIFlvdSBjYW4gYWxzbyBhZGQgYW4gZW51bWVyYWJsZQotICBvYnNlcnZlciB0byB0aGUgc2V0
IHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpZmljIG9iamVjdHMgdGhhdCBhcmUgYWRkZWQgYW5kCi0g
IHJlbW92ZWQgZnJvbSB0aGUgc2V0LiBTZWUgW0VtYmVyLkVudW1lcmFibGVdKC9hcGkvY2xhc3Nl
cy9FbWJlci5FbnVtZXJhYmxlLmh0bWwpCi0gIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGVudW1l
cmFibGVzLgotCi0gIFRoaXMgaXMgb2Z0ZW4gdW5oZWxwZnVsLiBJZiB5b3UgYXJlIGZpbHRlcmlu
ZyBzZXRzIG9mIG9iamVjdHMsIGZvciBpbnN0YW5jZSwKLSAgaXQgaXMgdmVyeSBpbmVmZmljaWVu
dCB0byByZS1maWx0ZXIgYWxsIG9mIHRoZSBpdGVtcyBlYWNoIHRpbWUgdGhlIHNldAotICBjaGFu
Z2VzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91IGNvdWxkIGp1c3QgYWRqdXN0IHRoZSBmaWx0
ZXJlZCBzZXQgYmFzZWQKLSAgb24gd2hhdCB3YXMgY2hhbmdlZCBvbiB0aGUgb3JpZ2luYWwgc2V0
LiBUaGUgc2FtZSBpc3N1ZSBhcHBsaWVzIHRvIG1lcmdpbmcKLSAgc2V0cywgYXMgd2VsbC4KLQot
ICAjIyBPdGhlciBNZXRob2RzCi0KLSAgYEVtYmVyLlNldGAgcHJpbWFyeSBpbXBsZW1lbnRzIG90
aGVyIG1peGluIEFQSXMuIEZvciBhIGNvbXBsZXRlIHJlZmVyZW5jZQotICBvbiB0aGUgbWV0aG9k
cyB5b3Ugd2lsbCB1c2Ugd2l0aCBgRW1iZXIuU2V0YCwgcGxlYXNlIGNvbnN1bHQgdGhlc2UgbWl4
aW5zLgotICBUaGUgbW9zdCB1c2VmdWwgb25lcyB3aWxsIGJlIGBFbWJlci5FbnVtZXJhYmxlYCBh
bmQKLSAgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlYCB3aGljaCBpbXBsZW1lbnQgbW9zdCBvZiB0
aGUgY29tbW9uIGl0ZXJhdG9yCi0gIG1ldGhvZHMgeW91IGFyZSB1c2VkIHRvIG9uIEFycmF5Lgot
Ci0gIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgRW1iZXIuQ29weWFibGVgIGFuZCBg
RW1iZXIuRnJlZXphYmxlYAotICBBUElzIG9uIGBFbWJlci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBz
ZXQgaXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIgYmUKLSAgbW9kaWZpZWQuIFRoZSBiZW5lZml0
IG9mIHRoaXMgaXMgdGhhdCB3aGVuIHlvdSBjYWxsIGBmcm96ZW5Db3B5KClgIG9uIGl0LAotICBF
bWJlciB3aWxsIGF2b2lkIG1ha2luZyBjb3BpZXMgb2YgdGhlIHNldC4gVGhpcyBhbGxvd3MgeW91
IHRvIHdyaXRlCi0gIGNvZGUgdGhhdCBjYW4ga25vdyB3aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1
bmRlcmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKLSAgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0KLSAg
QGNsYXNzIFNldAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNvcmVPYmpl
Y3QKLSAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUKLSAgQHVzZXMgRW1iZXIuQ29weWFi
bGUKLSAgQHVzZXMgRW1iZXIuRnJlZXphYmxlCi0gIEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJl
ci5TZXQgPSBFbWJlci5Db3JlT2JqZWN0LmV4dGVuZChFbWJlci5NdXRhYmxlRW51bWVyYWJsZSwg
RW1iZXIuQ29weWFibGUsIEVtYmVyLkZyZWV6YWJsZSwKLSAgewotCi0gIC8vIC4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gSU1Q
TEVNRU5UIEVOVU1FUkFCTEUgQVBJUwotICAvLwotCi0gIC8qKgotICAgIFRoaXMgcHJvcGVydHkg
d2lsbCBjaGFuZ2UgYXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzZXQgY2hhbmdlcy4K
LQotICAgIEBwcm9wZXJ0eSBsZW5ndGgKLSAgICBAdHlwZSBudW1iZXIKLSAgICBAZGVmYXVsdCAw
Ci0gICovCi0gIGxlbmd0aDogMCwKLQotICAvKioKLSAgICBDbGVhcnMgdGhlIHNldC4gVGhpcyBp
cyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmV1c2UgYW4gZXhpc3Rpbmcgc2V0Ci0gICAgd2l0aG91
dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNv
bG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xv
cnMubGVuZ3RoOyAgLy8gMwotICAgIGNvbG9ycy5jbGVhcigpOwotICAgIGNvbG9ycy5sZW5ndGg7
ICAvLyAwCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGNsZWFyCi0gICAgQHJldHVybiB7RW1iZXIu
U2V0fSBBbiBlbXB0eSBTZXQKLSAgKi8KLSAgY2xlYXI6IGZ1bmN0aW9uKCkgewotICAgIGlmICh0
aGlzLmlzRnJvemVuKSB7IHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1Ip
OyB9Ci0KLSAgICB2YXIgbGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICBpZiAobGVuID09
PSAwKSB7IHJldHVybiB0aGlzOyB9Ci0KLSAgICB2YXIgZ3VpZDsKLQotICAgIHRoaXMuZW51bWVy
YWJsZUNvbnRlbnRXaWxsQ2hhbmdlKGxlbiwgMCk7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hh
bmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOwotICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0
aGlzLCAnbGFzdE9iamVjdCcpOwotCi0gICAgZm9yICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHsK
LSAgICAgIGd1aWQgPSBndWlkRm9yKHRoaXNbaV0pOwotICAgICAgZGVsZXRlIHRoaXNbZ3VpZF07
Ci0gICAgICBkZWxldGUgdGhpc1tpXTsKLSAgICB9Ci0KLSAgICBzZXQodGhpcywgJ2xlbmd0aCcs
IDApOwotCi0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7
Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0
aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKGxlbiwgMCk7Ci0KLSAgICByZXR1cm4gdGhp
czsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBvYmplY3Qg
aXMgYWxzbyBhbiBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgdGhlCi0gICAgc2FtZSBvYmplY3Rz
IGFzIHRoZSByZWNlaXZlci4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdLAotICAgICAgICBzYW1lX2NvbG9ycyA9IG5ldyBFbWJl
ci5TZXQoY29sb3JzKTsKLQotICAgIHNhbWVfY29sb3JzLmlzRXF1YWwoY29sb3JzKTsgICAgICAg
ICAgICAgICAvLyB0cnVlCi0gICAgc2FtZV9jb2xvcnMuaXNFcXVhbChbInB1cnBsZSIsICJicm93
biJdKTsgIC8vIGZhbHNlCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGlzRXF1YWwKLSAgICBAcGFy
YW0ge0VtYmVyLlNldH0gb2JqIHRoZSBvdGhlciBvYmplY3QuCi0gICAgQHJldHVybiB7Qm9vbGVh
bn0KLSAgKi8KLSAgaXNFcXVhbDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgLy8gZmFpbCBmYXN0Ci0g
ICAgaWYgKCFFbWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmopKSByZXR1cm4gZmFsc2U7Ci0KLSAg
ICB2YXIgbG9jID0gZ2V0KHRoaXMsICdsZW5ndGgnKTsKLSAgICBpZiAoZ2V0KG9iaiwgJ2xlbmd0
aCcpICE9PSBsb2MpIHJldHVybiBmYWxzZTsKLQotICAgIHdoaWxlKC0tbG9jID49IDApIHsKLSAg
ICAgIGlmICghb2JqLmNvbnRhaW5zKHRoaXNbbG9jXSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQotICAvKioKLSAgICBBZGRzIGFuIG9iamVjdCB0byB0
aGUgc2V0LiBPbmx5IG5vbi1gbnVsbGAgb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gYSBzZXQKLSAg
ICBhbmQgdGhvc2UgY2FuIG9ubHkgYmUgYWRkZWQgb25jZS4gSWYgdGhlIG9iamVjdCBpcyBhbHJl
YWR5IGluIHRoZSBzZXQgb3IKLSAgICB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwgdGhpcyBtZXRo
b2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJl
ci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMuYWRkKCJibHVlIik7
ICAgICAvLyBbImJsdWUiXQotICAgIGNvbG9ycy5hZGQoImJsdWUiKTsgICAgIC8vIFsiYmx1ZSJd
Ci0gICAgY29sb3JzLmFkZCgicmVkIik7ICAgICAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgY29s
b3JzLmFkZChudWxsKTsgICAgICAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgY29sb3JzLmFkZCh1
bmRlZmluZWQpOyAgLy8gWyJibHVlIiwgInJlZCJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFk
ZAotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBhZGQuCi0gICAgQHJldHVy
biB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KLSAgKi8KLSAgYWRkOiBFbWJlci5hbGlhc01l
dGhvZCgnYWRkT2JqZWN0JyksCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyB0aGUgb2JqZWN0IGZyb20g
dGhlIHNldCBpZiBpdCBpcyBmb3VuZC4gSWYgeW91IHBhc3MgYSBgbnVsbGAgdmFsdWUKLSAgICBv
ciBhbiBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG5vdCBpbiB0aGUgc2V0LCB0aGlzIG1ldGhvZCB3
aWxsIGhhdmUgbm8KLSAgICBlZmZlY3QuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRh
YmxlRW51bWVyYWJsZS5yZW1vdmVPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAg
dmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAg
ICBjb2xvcnMucmVtb3ZlKCJyZWQiKTsgICAgIC8vIFsiYmx1ZSIsICJncmVlbiJdCi0gICAgY29s
b3JzLnJlbW92ZSgicHVycGxlIik7ICAvLyBbImJsdWUiLCAiZ3JlZW4iXQotICAgIGNvbG9ycy5y
ZW1vdmUobnVsbCk7ICAgICAgLy8gWyJibHVlIiwgImdyZWVuIl0KLSAgICBgYGAKLQotICAgIEBt
ZXRob2QgcmVtb3ZlCi0gICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJlbW92
ZQotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICovCi0gIHJlbW92
ZTogRW1iZXIuYWxpYXNNZXRob2QoJ3JlbW92ZU9iamVjdCcpLAotCi0gIC8qKgotICAgIFJlbW92
ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9yIGBudWxs
YCBpZiBpdCdzIGVtcHR5LgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBjb2xvcnMgPSBu
ZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAi
Ymx1ZSIKLSAgICBjb2xvcnMucG9wKCk7ICAvLyAiZ3JlZW4iCi0gICAgY29sb3JzLnBvcCgpOyAg
Ly8gbnVsbAotICAgIGBgYAotCi0gICAgQG1ldGhvZCBwb3AKLSAgICBAcmV0dXJuIHtPYmplY3R9
IFRoZSByZW1vdmVkIG9iamVjdCBmcm9tIHRoZSBzZXQgb3IgbnVsbC4KLSAgKi8KLSAgcG9wOiBm
dW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3plbicpKSB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICB2YXIgb2JqID0gdGhpcy5sZW5ndGgg
PiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51bGw7Ci0gICAgdGhpcy5yZW1vdmUob2JqKTsK
LSAgICByZXR1cm4gb2JqOwotICB9LAotCi0gIC8qKgotICAgIEluc2VydHMgdGhlIGdpdmVuIG9i
amVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQuIEl0IHJldHVybnMKLSAgICB0aGUgc2V0IGl0
c2VsZi4KLQotICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJs
ZS5hZGRPYmplY3QoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5l
dyBFbWJlci5TZXQoKTsKLSAgICBjb2xvcnMucHVzaCgicmVkIik7ICAgLy8gWyJyZWQiXQotICAg
IGNvbG9ycy5wdXNoKCJncmVlbiIpOyAvLyBbInJlZCIsICJncmVlbiJdCi0gICAgY29sb3JzLnB1
c2goImJsdWUiKTsgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUiXQotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBwdXNoCi0gICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0IGl0c2VsZi4KLSAg
Ki8KLSAgcHVzaDogRW1iZXIuYWxpYXNNZXRob2QoJ2FkZE9iamVjdCcpLAotCi0gIC8qKgotICAg
IFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9y
IGBudWxsYCBpZiBpdCdzIGVtcHR5LgotCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBmb3IgYEVtYmVy
LlNldC5wb3AoKWAuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBF
bWJlci5TZXQoWyJncmVlbiIsICJibHVlIl0pOwotICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gImJs
dWUiCi0gICAgY29sb3JzLnNoaWZ0KCk7ICAvLyAiZ3JlZW4iCi0gICAgY29sb3JzLnNoaWZ0KCk7
ICAvLyBudWxsCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNoaWZ0Ci0gICAgQHJldHVybiB7T2Jq
ZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3QgZnJvbSB0aGUgc2V0IG9yIG51bGwuCi0gICovCi0gIHNo
aWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncG9wJyksCi0KLSAgLyoqCi0gICAgSW5zZXJ0cyB0aGUg
Z2l2ZW4gb2JqZWN0IG9uIHRvIHRoZSBlbmQgb2YgdGhlIHNldC4gSXQgcmV0dXJucwotICAgIHRo
ZSBzZXQgaXRzZWxmLgotCi0gICAgVGhpcyBpcyBhbiBhbGlhcyBvZiBgRW1iZXIuU2V0LnB1c2go
KWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldCgp
OwotICAgIGNvbG9ycy51bnNoaWZ0KCJyZWQiKTsgICAgLy8gWyJyZWQiXQotICAgIGNvbG9ycy51
bnNoaWZ0KCJncmVlbiIpOyAgLy8gWyJyZWQiLCAiZ3JlZW4iXQotICAgIGNvbG9ycy51bnNoaWZ0
KCJibHVlIik7ICAgLy8gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHVuc2hpZnQKLSAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgot
ICAqLwotICB1bnNoaWZ0OiBFbWJlci5hbGlhc01ldGhvZCgncHVzaCcpLAotCi0gIC8qKgotICAg
IEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxlIHRvIHRoZSBzZXQuCi0K
LSAgICBUaGlzIGlzIGFuIGFsaWFzIG9mIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5hZGRPYmpl
Y3RzKClgCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5T
ZXQoKTsKLSAgICBjb2xvcnMuYWRkRWFjaChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOyAgLy8g
WyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGFkZEVhY2gK
LSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMgdG8gYWRk
LgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICovCi0gIGFkZEVh
Y2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmplY3RzJyksCi0KLSAgLyoqCi0gICAgUmVtb3Zl
cyBlYWNoIG9iamVjdCBpbiB0aGUgcGFzc2VkIGVudW1lcmFibGUgdG8gdGhlIHNldC4KLQotICAg
IFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11dGFibGVFbnVtZXJhYmxlLnJlbW92ZU9iamVj
dHMoKWAKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNl
dChbInJlZCIsICJncmVlbiIsICJibHVlIl0pOwotICAgIGNvbG9ycy5yZW1vdmVFYWNoKFsicmVk
IiwgImJsdWUiXSk7ICAvLyAgWyJncmVlbiJdCi0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbW92
ZUVhY2gKLSAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9iamVjdHMg
dG8gcmVtb3ZlLgotICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBpdHNlbGYuCi0gICov
Ci0gIHJlbW92ZUVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdyZW1vdmVPYmplY3RzJyksCi0KLSAg
Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLgotICAvLyBQUklWQVRFIEVOVU1FUkFCTEUgU1VQUE9SVAotICAvLwotCi0gIGluaXQ6IGZ1
bmN0aW9uKGl0ZW1zKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICBpZiAoaXRlbXMpIHRoaXMu
YWRkT2JqZWN0cyhpdGVtcyk7Ci0gIH0sCi0KLSAgLy8gaW1wbGVtZW50IEVtYmVyLkVudW1lcmFi
bGUKLSAgbmV4dE9iamVjdDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRoaXNbaWR4XTsK
LSAgfSwKLQotICAvLyBtb3JlIG9wdGltaXplZCB2ZXJzaW9uCi0gIGZpcnN0T2JqZWN0OiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhp
c1swXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0KLSAgLy8gbW9yZSBvcHRpbWl6ZWQgdmVyc2lvbgot
ICBsYXN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhp
cy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IHVuZGVmaW5lZDsKLSAgfSksCi0K
LSAgLy8gaW1wbGVtZW50cyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQotICBhZGRPYmplY3Q6IGZ1
bmN0aW9uKG9iaikgewotICAgIGlmIChnZXQodGhpcywgJ2lzRnJvemVuJykpIHRocm93IG5ldyBF
bWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1IpOwotICAgIGlmIChpc05vbmUob2JqKSkgcmV0
dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQotICAgIHZhciBndWlkID0gZ3VpZEZvcihvYmop
LAotICAgICAgICBpZHggID0gdGhpc1tndWlkXSwKLSAgICAgICAgbGVuICA9IGdldCh0aGlzLCAn
bGVuZ3RoJyksCi0gICAgICAgIGFkZGVkIDsKLQotICAgIGlmIChpZHg+PTAgJiYgaWR4PGxlbiAm
JiAodGhpc1tpZHhdID09PSBvYmopKSByZXR1cm4gdGhpczsgLy8gYWRkZWQKLQotICAgIGFkZGVk
ID0gW29ial07Ci0KLSAgICB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShudWxsLCBh
ZGRlZCk7Ci0gICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7
Ci0KLSAgICBsZW4gPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIHRoaXNbZ3VpZF0gPSBsZW47
Ci0gICAgdGhpc1tsZW5dID0gb2JqOwotICAgIHNldCh0aGlzLCAnbGVuZ3RoJywgbGVuKzEpOwot
Ci0gICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsKLSAgICB0
aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKG51bGwsIGFkZGVkKTsKLQotICAgIHJldHVy
biB0aGlzOwotICB9LAotCi0gIC8vIGltcGxlbWVudHMgRW1iZXIuTXV0YWJsZUVudW1lcmFibGUK
LSAgcmVtb3ZlT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdpc0Zy
b3plbicpKSB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKLSAgICBp
ZiAoaXNOb25lKG9iaikpIHJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCi0KLSAgICB2YXIg
Z3VpZCA9IGd1aWRGb3Iob2JqKSwKLSAgICAgICAgaWR4ICA9IHRoaXNbZ3VpZF0sCi0gICAgICAg
IGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGlzRmlyc3QgPSBpZHggPT09IDAs
Ci0gICAgICAgIGlzTGFzdCA9IGlkeCA9PT0gbGVuLTEsCi0gICAgICAgIGxhc3QsIHJlbW92ZWQ7
Ci0KLQotICAgIGlmIChpZHg+PTAgJiYgaWR4PGxlbiAmJiAodGhpc1tpZHhdID09PSBvYmopKSB7
Ci0gICAgICByZW1vdmVkID0gW29ial07Ci0KLSAgICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRX
aWxsQ2hhbmdlKHJlbW92ZWQsIG51bGwpOwotICAgICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJv
cGVydHlXaWxsQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOyB9Ci0gICAgICBpZiAoaXNMYXN0
KSAgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2xhc3RPYmplY3QnKTsgfQotCi0g
ICAgICAvLyBzd2FwIGl0ZW1zIC0gYmFzaWNhbGx5IG1vdmUgdGhlIGl0ZW0gdG8gdGhlIGVuZCBz
byBpdCBjYW4gYmUgcmVtb3ZlZAotICAgICAgaWYgKGlkeCA8IGxlbi0xKSB7Ci0gICAgICAgIGxh
c3QgPSB0aGlzW2xlbi0xXTsKLSAgICAgICAgdGhpc1tpZHhdID0gbGFzdDsKLSAgICAgICAgdGhp
c1tndWlkRm9yKGxhc3QpXSA9IGlkeDsKLSAgICAgIH0KLQotICAgICAgZGVsZXRlIHRoaXNbZ3Vp
ZF07Ci0gICAgICBkZWxldGUgdGhpc1tsZW4tMV07Ci0gICAgICBzZXQodGhpcywgJ2xlbmd0aCcs
IGxlbi0xKTsKLQotICAgICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo
dGhpcywgJ2ZpcnN0T2JqZWN0Jyk7IH0KLSAgICAgIGlmIChpc0xhc3QpICB7IEVtYmVyLnByb3Bl
cnR5RGlkQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7IH0KLSAgICAgIHRoaXMuZW51bWVyYWJs
ZUNvbnRlbnREaWRDaGFuZ2UocmVtb3ZlZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRo
aXM7Ci0gIH0sCi0KLSAgLy8gb3B0aW1pemVkIHZlcnNpb24KLSAgY29udGFpbnM6IGZ1bmN0aW9u
KG9iaikgewotICAgIHJldHVybiB0aGlzW2d1aWRGb3Iob2JqKV0+PTA7Ci0gIH0sCi0KLSAgY29w
eTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIEMgPSB0aGlzLmNvbnN0cnVjdG9yLCByZXQgPSBuZXcg
QygpLCBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcpOwotICAgIHNldChyZXQsICdsZW5ndGgnLCBs
b2MpOwotICAgIHdoaWxlKC0tbG9jPj0wKSB7Ci0gICAgICByZXRbbG9jXSA9IHRoaXNbbG9jXTsK
LSAgICAgIHJldFtndWlkRm9yKHRoaXNbbG9jXSldID0gbG9jOwotICAgIH0KLSAgICByZXR1cm4g
cmV0OwotICB9LAotCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuID0gdGhp
cy5sZW5ndGgsIGlkeCwgYXJyYXkgPSBbXTsKLSAgICBmb3IoaWR4ID0gMDsgaWR4IDwgbGVuOyBp
ZHgrKykgewotICAgICAgYXJyYXlbaWR4XSA9IHRoaXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJu
IGZtdCgiRW1iZXIuU2V0PCVAPiIsIFthcnJheS5qb2luKCcsJyldKTsKLSAgfQotCi19KTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBEZWZlcnJlZE1peGluID0gRW1iZXIuRGVm
ZXJyZWRNaXhpbiwgLy8gbWl4aW5zL2RlZmVycmVkCi0gICAgZ2V0ID0gRW1iZXIuZ2V0OwotCi12
YXIgRGVmZXJyZWQgPSBFbWJlci5PYmplY3QuZXh0ZW5kKERlZmVycmVkTWl4aW4pOwotCi1EZWZl
cnJlZC5yZW9wZW5DbGFzcyh7Ci0gIHByb21pc2U6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5n
KSB7Ci0gICAgdmFyIGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7Ci0gICAgY2FsbGJhY2su
Y2FsbChiaW5kaW5nLCBkZWZlcnJlZCk7Ci0gICAgcmV0dXJuIGRlZmVycmVkOwotICB9Ci19KTsK
LQotRW1iZXIuRGVmZXJyZWQgPSBEZWZlcnJlZDsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBmb3JFYWNoID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKLQotLyoqCi0g
IEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCi0qLwotCi12YXIgbG9h
ZEhvb2tzID0gRW1iZXIuRU5WLkVNQkVSX0xPQURfSE9PS1MgfHwge307Ci12YXIgbG9hZGVkID0g
e307Ci0KLS8qKgotICBEZXRlY3RzIHdoZW4gYSBzcGVjaWZpYyBwYWNrYWdlIG9mIEVtYmVyIChl
LmcuICdFbWJlci5IYW5kbGViYXJzJykKLSAgaGFzIGZ1bGx5IGxvYWRlZCBhbmQgaXMgYXZhaWxh
YmxlIGZvciBleHRlbnNpb24uCi0KLSAgVGhlIHByb3ZpZGVkIGBjYWxsYmFja2Agd2lsbCBiZSBj
YWxsZWQgd2l0aCB0aGUgYG5hbWVgIHBhc3NlZAotICByZXNvbHZlZCBmcm9tIGEgc3RyaW5nIGlu
dG8gdGhlIG9iamVjdDoKLQotICBgYGAgamF2YXNjcmlwdAotICBFbWJlci5vbkxvYWQoJ0VtYmVy
LkhhbmRsZWJhcnMnIGZ1bmN0aW9uKGhiYXJzKXsKLSAgICBoYmFycy5yZWdpc3RlckhlbHBlcigu
Li4pOwotICB9KTsKLSAgYGBgCi0KLSAgQG1ldGhvZCBvbkxvYWQKLSAgQGZvciBFbWJlcgotICBA
cGFyYW0gbmFtZSB7U3RyaW5nfSBuYW1lIG9mIGhvb2sKLSAgQHBhcmFtIGNhbGxiYWNrIHtGdW5j
dGlvbn0gY2FsbGJhY2sgdG8gYmUgY2FsbGVkCi0qLwotRW1iZXIub25Mb2FkID0gZnVuY3Rpb24o
bmFtZSwgY2FsbGJhY2spIHsKLSAgdmFyIG9iamVjdDsKLQotICBsb2FkSG9va3NbbmFtZV0gPSBs
b2FkSG9va3NbbmFtZV0gfHwgRW1iZXIuQSgpOwotICBsb2FkSG9va3NbbmFtZV0ucHVzaE9iamVj
dChjYWxsYmFjayk7Ci0KLSAgaWYgKG9iamVjdCA9IGxvYWRlZFtuYW1lXSkgewotICAgIGNhbGxi
YWNrKG9iamVjdCk7Ci0gIH0KLX07Ci0KLS8qKgotICBDYWxsZWQgd2hlbiBhbiBFbWJlci5qcyBw
YWNrYWdlIChlLmcgRW1iZXIuSGFuZGxlYmFycykgaGFzIGZpbmlzaGVkCi0gIGxvYWRpbmcuIFRy
aWdnZXJzIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCBmb3IgdGhpcyBldmVudC4KLQotICBAbWV0
aG9kIHJ1bkxvYWRIb29rcwotICBAZm9yIEVtYmVyCi0gIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5h
bWUgb2YgaG9vawotICBAcGFyYW0gb2JqZWN0IHtPYmplY3R9IG9iamVjdCB0byBwYXNzIHRvIGNh
bGxiYWNrcwotKi8KLUVtYmVyLnJ1bkxvYWRIb29rcyA9IGZ1bmN0aW9uKG5hbWUsIG9iamVjdCkg
ewotICBsb2FkZWRbbmFtZV0gPSBvYmplY3Q7Ci0KLSAgaWYgKGxvYWRIb29rc1tuYW1lXSkgewot
ICAgIGZvckVhY2guY2FsbChsb2FkSG9va3NbbmFtZV0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0g
ICAgICBjYWxsYmFjayhvYmplY3QpOwotICAgIH0pOwotICB9Ci19OwotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotdmFyIGdldCA9IEVt
YmVyLmdldDsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUK
LSovCi0KLS8qKgotICBgRW1iZXIuQ29udHJvbGxlck1peGluYCBwcm92aWRlcyBhIHN0YW5kYXJk
IGludGVyZmFjZSBmb3IgYWxsIGNsYXNzZXMgdGhhdAotICBjb21wb3NlIEVtYmVyJ3MgY29udHJv
bGxlciBsYXllcjogYEVtYmVyLkNvbnRyb2xsZXJgLAotICBgRW1iZXIuQXJyYXlDb250cm9sbGVy
YCwgYW5kIGBFbWJlci5PYmplY3RDb250cm9sbGVyYC4KLQotICBAY2xhc3MgQ29udHJvbGxlck1p
eGluCi0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgotKi8K
LUVtYmVyLkNvbnRyb2xsZXJNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5BY3Rpb25I
YW5kbGVyLCB7Ci0gIC8qIGR1Y2t0eXBlIGFzIGEgY29udHJvbGxlciAqLwotICBpc0NvbnRyb2xs
ZXI6IHRydWUsCi0KLSAgLyoqCi0gICAgVGhlIG9iamVjdCB0byB3aGljaCBhY3Rpb25zIGZyb20g
dGhlIHZpZXcgc2hvdWxkIGJlIHNlbnQuCi0KLSAgICBGb3IgZXhhbXBsZSwgd2hlbiBhIEhhbmRs
ZWJhcnMgdGVtcGxhdGUgdXNlcyB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciwKLSAgICBpdCB3aWxs
IGF0dGVtcHQgdG8gc2VuZCB0aGUgYWN0aW9uIHRvIHRoZSB2aWV3J3MgY29udHJvbGxlcidzIGB0
YXJnZXRgLgotCi0gICAgQnkgZGVmYXVsdCwgYSBjb250cm9sbGVyJ3MgYHRhcmdldGAgaXMgc2V0
IHRvIHRoZSByb3V0ZXIgYWZ0ZXIgaXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgYnkgYEVtYmVyLkFw
cGxpY2F0aW9uI2luaXRpYWxpemVgLgotCi0gICAgQHByb3BlcnR5IHRhcmdldAotICAgIEBkZWZh
dWx0IG51bGwKLSAgKi8KLSAgdGFyZ2V0OiBudWxsLAotCi0gIGNvbnRhaW5lcjogbnVsbCwKLQot
ICBwYXJlbnRDb250cm9sbGVyOiBudWxsLAotCi0gIHN0b3JlOiBudWxsLAotCi0gIG1vZGVsOiBF
bWJlci5jb21wdXRlZC5hbGlhcygnY29udGVudCcpLAotCi0gIGRlcHJlY2F0ZWRTZW5kSGFuZGxl
czogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHJldHVybiAhIXRoaXNbYWN0aW9uTmFtZV07
Ci0gIH0sCi0KLSAgZGVwcmVjYXRlZFNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5hbWUpIHsKLSAgICB2
YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBFbWJlci5hc3NlcnQo
JycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSArICIgYnV0IGl0IGlz
IG5vdCBhIGZ1bmN0aW9uIiwgdHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicp
OwotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGltcGxlbWVudGVkIGRpcmVj
dGx5IG9uIGNvbnRyb2xsZXJzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGFjdGlvbiBoYW5k
bGVycyBvbiBhbiBgYWN0aW9uc2Agb2JqZWN0ICgnICsgYWN0aW9uTmFtZSArICcgb24gJyArIHRo
aXMgKyAnKScsIGZhbHNlKTsKLSAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3Mp
OwotICAgIHJldHVybjsKLSAgfQotfSk7Ci0KLS8qKgotICBAY2xhc3MgQ29udHJvbGxlcgotICBA
bmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotICBAdXNlcyBFbWJlci5D
b250cm9sbGVyTWl4aW4KLSovCi1FbWJlci5Db250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmV4dGVu
ZChFbWJlci5Db250cm9sbGVyTWl4aW4pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBn
ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFi
bGVVdGlscy5mb3JFYWNoOwotCi0vKioKLSAgYEVtYmVyLlNvcnRhYmxlTWl4aW5gIHByb3ZpZGVz
IGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBhcnJheSBwcm94aWVzCi0gIHRvIHNwZWNpZnkgYSBz
b3J0IG9yZGVyIGFuZCBtYWludGFpbiB0aGlzIHNvcnRpbmcgd2hlbiBvYmplY3RzIGFyZSBhZGRl
ZCwKLSAgcmVtb3ZlZCwgb3IgdXBkYXRlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBpbXBsaWNpdCBv
cmRlciBvZiB0aGVpciB1bmRlcmx5aW5nCi0gIGNvbnRlbnQgYXJyYXk6Ci0KLSAgYGBgamF2YXNj
cmlwdAotICBzb25ncyA9IFsKLSAgICB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGks
IE9iLUxhLURhJ30sCi0gICAge3RyYWNrTnVtYmVyOiAyLCB0aXRsZTogJ0JhY2sgaW4gdGhlIFUu
Uy5TLlIuJ30sCi0gICAge3RyYWNrTnVtYmVyOiAzLCB0aXRsZTogJ0dsYXNzIE9uaW9uJ30sCi0g
IF07Ci0KLSAgc29uZ3NDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmNyZWF0ZSh7
Ci0gICAgY29udGVudDogc29uZ3MsCi0gICAgc29ydFByb3BlcnRpZXM6IFsndHJhY2tOdW1iZXIn
XSwKLSAgICBzb3J0QXNjZW5kaW5nOiB0cnVlCi0gIH0pOwotCi0gIHNvbmdzQ29udHJvbGxlci5n
ZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0
aGUgVS5TLlMuUi4nfQotCi0gIHNvbmdzQ29udHJvbGxlci5hZGRPYmplY3Qoe3RyYWNrTnVtYmVy
OiAxLCB0aXRsZTogJ0RlYXIgUHJ1ZGVuY2UnfSk7Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2Zp
cnN0T2JqZWN0Jyk7ICAvLyB7dHJhY2tOdW1iZXI6IDEsIHRpdGxlOiAnRGVhciBQcnVkZW5jZSd9
Ci0gIGBgYAotCi0gIElmIHlvdSBhZGQgb3IgcmVtb3ZlIHRoZSBwcm9wZXJ0aWVzIHRvIHNvcnQg
Ynkgb3IgY2hhbmdlIHRoZSBzb3J0IGRpcmVjdGlvbiB0aGUgY29udGVudAotICBzb3J0IG9yZGVy
IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgc29u
Z3NDb250cm9sbGVyLnNldCgnc29ydFByb3BlcnRpZXMnLCBbJ3RpdGxlJ10pOwotICBzb25nc0Nv
bnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAvLyB7dHJhY2tOdW1iZXI6IDIsIHRpdGxlOiAn
QmFjayBpbiB0aGUgVS5TLlMuUi4nfQotCi0gIHNvbmdzQ29udHJvbGxlci50b2dnbGVQcm9wZXJ0
eSgnc29ydEFzY2VuZGluZycpOwotICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcp
OyAvLyB7dHJhY2tOdW1iZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGksIE9iLUxhLURhJ30KLSAgYGBg
Ci0KLSAgU29ydGFibGVNaXhpbiB3b3JrcyBieSBzb3J0aW5nIHRoZSBhcnJhbmdlZENvbnRlbnQg
YXJyYXksIHdoaWNoIGlzIHRoZSBhcnJheSB0aGF0Ci0gIGFycmF5UHJveHkgZGlzcGxheXMuIER1
ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB1bmRlcmx5aW5nICdjb250ZW50JyBhcnJheSBpcyBub3Qg
Y2hhbmdlZCwgdGhhdAotICBhcnJheSB3aWxsIG5vdCBkaXNwbGF5IHRoZSBzb3J0ZWQgbGlzdDoK
LQotICAgYGBgamF2YXNjcmlwdAotICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdjb250ZW50JykuZ2V0
KCdmaXJzdE9iamVjdCcpOyAvLyBSZXR1cm5zIHRoZSB1bnNvcnRlZCBvcmlnaW5hbCBjb250ZW50
Ci0gIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2JqZWN0Jyk7IC8vIFJldHVybnMgdGhlIHNv
cnRlZCBjb250ZW50LgotICBgYGAgCi0gIAotICBBbHRob3VnaCB0aGUgc29ydGVkIGNvbnRlbnQg
Y2FuIGFsc28gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYXJyYW5nZWRDb250ZW50IHByb3BlcnR5
LAotICBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgcHJveGllZCBjbGFzcyBhbmQgbm90IHRo
ZSBhcnJhbmdlZENvbnRlbnQgYXJyYXkgZGlyZWN0bHkuCi0KLSAgQGNsYXNzIFNvcnRhYmxlTWl4
aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQot
Ki8KLUVtYmVyLlNvcnRhYmxlTWl4aW4gPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJs
ZUVudW1lcmFibGUsIHsKLQotICAvKioKLSAgICBTcGVjaWZpZXMgd2hpY2ggcHJvcGVydGllcyBk
aWN0YXRlIHRoZSBhcnJhbmdlZENvbnRlbnQncyBzb3J0IG9yZGVyLgotCi0gICAgV2hlbiBzcGVj
aWZ5aW5nIG11bHRpcGxlIHByb3BlcnRpZXMgdGhlIHNvcnRpbmcgd2lsbCB1c2UgcHJvcGVydGll
cwotICAgIGZyb20gdGhlIGBzb3J0UHJvcGVydGllc2AgYXJyYXkgcHJpb3JpdGl6ZWQgZnJvbSBm
aXJzdCB0byBsYXN0LgotCi0gICAgQHByb3BlcnR5IHtBcnJheX0gc29ydFByb3BlcnRpZXMKLSAg
Ki8KLSAgc29ydFByb3BlcnRpZXM6IG51bGwsCi0KLSAgLyoqCi0gICAgU3BlY2lmaWVzIHRoZSBh
cnJhbmdlZENvbnRlbnQncyBzb3J0IGRpcmVjdGlvbgotCi0gICAgQHByb3BlcnR5IHtCb29sZWFu
fSBzb3J0QXNjZW5kaW5nCi0gICovCi0gIHNvcnRBc2NlbmRpbmc6IHRydWUsCi0KLSAgLyoqCi0g
ICAgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB0d28gdmFsdWVzLiBZb3UgY2FuIG92ZXJy
aWRlIHRoaXMgaWYgeW91Ci0gICAgd2FudCB0byBkbyBjdXN0b20gY29tcGFyaXNvbnMuIEZ1bmN0
aW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIGV4cGVjdGVkIGJ5Ci0gICAgQXJyYXkjc29ydCwgaS5l
LgotICAgICAgcmV0dXJuIDAgaWYgdGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBlcXVhbCwKLSAgICAg
IHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgc21hbGxl
ciB0aGFuIHRoZSBzZWNvbmQgb3IKLSAgICAgIHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIG90aGVy
d2lzZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBmdW5jdGlvbih4LHkpIHsgLy8gVGhlc2Ug
YXJlIGFzc3VtZWQgdG8gYmUgaW50ZWdlcnMKLSAgICAgIGlmICh4ID09PSB5KQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgIHJldHVybiB4IDwgeSA/IC0xIDogMTsKLSAgICB9Ci0gICAgYGBgCi0K
LSAgICBAcHJvcGVydHkgc29ydEZ1bmN0aW9uCi0gICAgQHR5cGUge0Z1bmN0aW9ufQotICAgIEBk
ZWZhdWx0IEVtYmVyLmNvbXBhcmUKLSAgKi8KLSAgc29ydEZ1bmN0aW9uOiBFbWJlci5jb21wYXJl
LAotCi0gIG9yZGVyQnk6IGZ1bmN0aW9uKGl0ZW0xLCBpdGVtMikgewotICAgIHZhciByZXN1bHQg
PSAwLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFByb3BlcnRpZXMn
KSwKLSAgICAgICAgc29ydEFzY2VuZGluZyA9IGdldCh0aGlzLCAnc29ydEFzY2VuZGluZycpLAot
ICAgICAgICBzb3J0RnVuY3Rpb24gPSBnZXQodGhpcywgJ3NvcnRGdW5jdGlvbicpOwotCi0gICAg
RW1iZXIuYXNzZXJ0KCJ5b3UgbmVlZCB0byBkZWZpbmUgYHNvcnRQcm9wZXJ0aWVzYCIsICEhc29y
dFByb3BlcnRpZXMpOwotCi0gICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24ocHJv
cGVydHlOYW1lKSB7Ci0gICAgICBpZiAocmVzdWx0ID09PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9
IHNvcnRGdW5jdGlvbihnZXQoaXRlbTEsIHByb3BlcnR5TmFtZSksIGdldChpdGVtMiwgcHJvcGVy
dHlOYW1lKSk7Ci0gICAgICAgIGlmICgocmVzdWx0ICE9PSAwKSAmJiAhc29ydEFzY2VuZGluZykg
ewotICAgICAgICAgIHJlc3VsdCA9ICgtMSkgKiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAg
c29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAo
Y29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewotICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5j
dGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNv
cnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQ
cm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAg
ICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMu
X3N1cGVyKCk7Ci0gIH0sCi0KLSAgaXNTb3J0ZWQ6IEVtYmVyLmNvbXB1dGVkLmJvb2woJ3NvcnRQ
cm9wZXJ0aWVzJyksCi0KLSAgLyoqCi0gICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGFycmFuZ2Vk
Q29udGVudCBmcm9tIGFycmF5UHJveHkgaW4gb3JkZXIgdG8gc29ydCBieSBzb3J0RnVuY3Rpb24u
Ci0gICAgQWxzbyBzZXRzIHVwIG9ic2VydmVycyBmb3IgZWFjaCBzb3J0UHJvcGVydHkgb24gZWFj
aCBpdGVtIGluIHRoZSBjb250ZW50IEFycmF5LgotICAgIAotICAgIEBwcm9wZXJ0eSBhcnJhbmdl
ZENvbnRlbnQKLSAgKi8KLQotICBhcnJhbmdlZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkKCdjb250
ZW50JywgJ3NvcnRQcm9wZXJ0aWVzLkBlYWNoJywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewotICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIGlzU29ydGVkID0g
Z2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlz
LCAnc29ydFByb3BlcnRpZXMnKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICBpZiAoY29u
dGVudCAmJiBpc1NvcnRlZCkgewotICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoKTsKLSAg
ICAgIGNvbnRlbnQuc29ydChmdW5jdGlvbihpdGVtMSwgaXRlbTIpIHsKLSAgICAgICAgcmV0dXJu
IHNlbGYub3JkZXJCeShpdGVtMSwgaXRlbTIpOwotICAgICAgfSk7Ci0gICAgICBmb3JFYWNoKGNv
bnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywg
ZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRl
bSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2Un
KTsKLSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICAgIHJldHVybiBFbWJl
ci5BKGNvbnRlbnQpOwotICAgIH0KLQotICAgIHJldHVybiBjb250ZW50OwotICB9KSwKLQotICBf
Y29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwKLSAgICAgICAg
c29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAgICBpZiAo
Y29udGVudCAmJiBzb3J0UHJvcGVydGllcykgewotICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5j
dGlvbihpdGVtKSB7Ci0gICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0aW9uKHNv
cnRQcm9wZXJ0eSkgewotICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKGl0ZW0sIHNvcnRQ
cm9wZXJ0eSwgdGhpcywgJ2NvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlJyk7Ci0gICAg
ICAgIH0sIHRoaXMpOwotICAgICAgfSwgdGhpcyk7Ci0gICAgfQotCi0gICAgdGhpcy5fc3VwZXIo
KTsKLSAgfSksCi0KLSAgc29ydEFzY2VuZGluZ1dpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2Vy
dmVyKCdzb3J0QXNjZW5kaW5nJywgZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fbGFzdFNvcnRBc2Nl
bmRpbmcgPSBnZXQodGhpcywgJ3NvcnRBc2NlbmRpbmcnKTsKLSAgfSksCi0KLSAgc29ydEFzY2Vu
ZGluZ0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ3NvcnRBc2NlbmRpbmcnLCBmdW5jdGlvbigp
IHsKLSAgICBpZiAoZ2V0KHRoaXMsICdzb3J0QXNjZW5kaW5nJykgIT09IHRoaXMuX2xhc3RTb3J0
QXNjZW5kaW5nKSB7Ci0gICAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJh
bmdlZENvbnRlbnQnKTsKLSAgICAgIGFycmFuZ2VkQ29udGVudC5yZXZlcnNlT2JqZWN0cygpOwot
ICAgIH0KLSAgfSksCi0KLSAgY29udGVudEFycmF5V2lsbENoYW5nZTogZnVuY3Rpb24oYXJyYXks
IGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgdmFyIGlzU29ydGVkID0gZ2V0
KHRoaXMsICdpc1NvcnRlZCcpOwotCi0gICAgaWYgKGlzU29ydGVkKSB7Ci0gICAgICB2YXIgYXJy
YW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKLSAgICAgIHZhciBy
ZW1vdmVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlkeCwgaWR4K3JlbW92ZWRDb3VudCk7Ci0gICAg
ICB2YXIgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7Ci0KLSAg
ICAgIGZvckVhY2gocmVtb3ZlZE9iamVjdHMsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgICAgYXJy
YW5nZWRDb250ZW50LnJlbW92ZU9iamVjdChpdGVtKTsKLQotICAgICAgICBmb3JFYWNoKHNvcnRQ
cm9wZXJ0aWVzLCBmdW5jdGlvbihzb3J0UHJvcGVydHkpIHsKLSAgICAgICAgICBFbWJlci5yZW1v
dmVPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9w
ZXJ0eURpZENoYW5nZScpOwotICAgICAgICB9LCB0aGlzKTsKLSAgICAgIH0sIHRoaXMpOwotICAg
IH0KLQotICAgIHJldHVybiB0aGlzLl9zdXBlcihhcnJheSwgaWR4LCByZW1vdmVkQ291bnQsIGFk
ZGVkQ291bnQpOwotICB9LAotCi0gIGNvbnRlbnRBcnJheURpZENoYW5nZTogZnVuY3Rpb24oYXJy
YXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KSB7Ci0gICAgdmFyIGlzU29ydGVkID0g
Z2V0KHRoaXMsICdpc1NvcnRlZCcpLAotICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlz
LCAnc29ydFByb3BlcnRpZXMnKTsKLQotICAgIGlmIChpc1NvcnRlZCkgewotICAgICAgdmFyIGFk
ZGVkT2JqZWN0cyA9IGFycmF5LnNsaWNlKGlkeCwgaWR4K2FkZGVkQ291bnQpOwotCi0gICAgICBm
b3JFYWNoKGFkZGVkT2JqZWN0cywgZnVuY3Rpb24oaXRlbSkgewotICAgICAgICB0aGlzLmluc2Vy
dEl0ZW1Tb3J0ZWQoaXRlbSk7Ci0KLSAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVu
Y3Rpb24oc29ydFByb3BlcnR5KSB7Ci0gICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2ZXIoaXRlbSwg
c29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2UnKTsK
LSAgICAgICAgfSwgdGhpcyk7Ci0gICAgICB9LCB0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
dGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKLSAgfSwK
LQotICBpbnNlcnRJdGVtU29ydGVkOiBmdW5jdGlvbihpdGVtKSB7Ci0gICAgdmFyIGFycmFuZ2Vk
Q29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7Ci0gICAgdmFyIGxlbmd0aCA9
IGdldChhcnJhbmdlZENvbnRlbnQsICdsZW5ndGgnKTsKLQotICAgIHZhciBpZHggPSB0aGlzLl9i
aW5hcnlTZWFyY2goaXRlbSwgMCwgbGVuZ3RoKTsKLSAgICBhcnJhbmdlZENvbnRlbnQuaW5zZXJ0
QXQoaWR4LCBpdGVtKTsKLSAgfSwKLQotICBjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5n
ZTogZnVuY3Rpb24oaXRlbSkgewotICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywg
J2FycmFuZ2VkQ29udGVudCcpLAotICAgICAgICBvbGRJbmRleCA9IGFycmFuZ2VkQ29udGVudC5p
bmRleE9mKGl0ZW0pLAotICAgICAgICBsZWZ0SXRlbSA9IGFycmFuZ2VkQ29udGVudC5vYmplY3RB
dChvbGRJbmRleCAtIDEpLAotICAgICAgICByaWdodEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2Jq
ZWN0QXQob2xkSW5kZXggKyAxKSwKLSAgICAgICAgbGVmdFJlc3VsdCA9IGxlZnRJdGVtICYmIHRo
aXMub3JkZXJCeShpdGVtLCBsZWZ0SXRlbSksCi0gICAgICAgIHJpZ2h0UmVzdWx0ID0gcmlnaHRJ
dGVtICYmIHRoaXMub3JkZXJCeShpdGVtLCByaWdodEl0ZW0pOwotCi0gICAgaWYgKGxlZnRSZXN1
bHQgPCAwIHx8IHJpZ2h0UmVzdWx0ID4gMCkgewotICAgICAgYXJyYW5nZWRDb250ZW50LnJlbW92
ZU9iamVjdChpdGVtKTsKLSAgICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsKLSAgICB9
Ci0gIH0sCi0KLSAgX2JpbmFyeVNlYXJjaDogZnVuY3Rpb24oaXRlbSwgbG93LCBoaWdoKSB7Ci0g
ICAgdmFyIG1pZCwgbWlkSXRlbSwgcmVzLCBhcnJhbmdlZENvbnRlbnQ7Ci0KLSAgICBpZiAobG93
ID09PSBoaWdoKSB7Ci0gICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIGFycmFuZ2VkQ29u
dGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7Ci0KLSAgICBtaWQgPSBsb3cgKyBN
YXRoLmZsb29yKChoaWdoIC0gbG93KSAvIDIpOwotICAgIG1pZEl0ZW0gPSBhcnJhbmdlZENvbnRl
bnQub2JqZWN0QXQobWlkKTsKLQotICAgIHJlcyA9IHRoaXMub3JkZXJCeShtaWRJdGVtLCBpdGVt
KTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICByZXR1cm4gdGhpcy5fYmluYXJ5U2VhcmNo
KGl0ZW0sIG1pZCsxLCBoaWdoKTsKLSAgICB9IGVsc2UgaWYgKHJlcyA+IDApIHsKLSAgICAgIHJl
dHVybiB0aGlzLl9iaW5hcnlTZWFyY2goaXRlbSwgbG93LCBtaWQpOwotICAgIH0KLQotICAgIHJl
dHVybiBtaWQ7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5mb3JFYWNoLAotICAgIHJlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZTsK
LQotLyoqCi0gIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3Ug
dG8gcHVibGlzaCBhIGNvbGxlY3Rpb24gb2YKLSAgb2JqZWN0cyBzbyB0aGF0IHlvdSBjYW4gZWFz
aWx5IGJpbmQgdG8gdGhlIGNvbGxlY3Rpb24gZnJvbSBhIEhhbmRsZWJhcnMKLSAgYCNlYWNoYCBo
ZWxwZXIsIGFuIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIG9yIG90aGVyIGNvbnRyb2xsZXJzLgot
Ci0gIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgYW4gYEFycmF5Q29udHJvbGxlcmAgaXMgdGhhdCB5
b3Ugb25seSBoYXZlIHRvIHNldCB1cAotICB5b3VyIHZpZXcgYmluZGluZ3Mgb25jZTsgdG8gY2hh
bmdlIHdoYXQncyBkaXNwbGF5ZWQsIHNpbXBseSBzd2FwIG91dCB0aGUKLSAgYGNvbnRlbnRgIHBy
b3BlcnR5IG9uIHRoZSBjb250cm9sbGVyLgotCi0gIEZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSB3
YW50ZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgaXRlbXMgZmV0Y2hlZCB2aWEgYW4gWEhSCi0gIHJl
cXVlc3QuIENyZWF0ZSBhbiBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCBhbmQgc2V0IGl0cyBgY29u
dGVudGAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeUFwcC5saXN0Q29udHJvbGxl
ciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVhdGUoKTsKLQotICAkLmdldCgncGVvcGxlLmpz
b24nLCBmdW5jdGlvbihkYXRhKSB7Ci0gICAgTXlBcHAubGlzdENvbnRyb2xsZXIuc2V0KCdjb250
ZW50JywgZGF0YSk7Ci0gIH0pOwotICBgYGAKLQotICBUaGVuLCBjcmVhdGUgYSB2aWV3IHRoYXQg
YmluZHMgdG8geW91ciBuZXcgY29udHJvbGxlcjoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I2Vh
Y2ggTXlBcHAubGlzdENvbnRyb2xsZXJ9fQotICAgIHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19
Ci0gIHt7L2VhY2h9fQotICBgYGAKLQotICBBbHRob3VnaCB5b3UgYXJlIGJpbmRpbmcgdG8gdGhl
IGNvbnRyb2xsZXIsIHRoZSBiZWhhdmlvciBvZiB0aGlzIGNvbnRyb2xsZXIKLSAgaXMgdG8gcGFz
cyB0aHJvdWdoIGFueSBtZXRob2RzIG9yIHByb3BlcnRpZXMgdG8gdGhlIHVuZGVybHlpbmcgYXJy
YXkuIFRoaXMKLSAgY2FwYWJpbGl0eSBjb21lcyBmcm9tIGBFbWJlci5BcnJheVByb3h5YCwgd2hp
Y2ggdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tLgotCi0gIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBk
aXNwbGF5IGNvbXB1dGVkIHByb3BlcnRpZXMgd2l0aGluIHRoZSBib2R5IG9mIGFuCi0gIGAjZWFj
aGAgaGVscGVyIHRoYXQgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIGluIGBjb250ZW50
YCwgYnV0IGFyZSBub3QKLSAgcHJlc2VudCBvbiB0aG9zZSBpdGVtcy4gICBUbyBkbyB0aGlzLCBz
ZXQgYGl0ZW1Db250cm9sbGVyYCB0byB0aGUgbmFtZSBvZiBhCi0gIGNvbnRyb2xsZXIgKHByb2Jh
Ymx5IGFuIGBPYmplY3RDb250cm9sbGVyYCkgdGhhdCB3aWxsIHdyYXAgZWFjaCBpbmRpdmlkdWFs
IGl0ZW0uCi0KLSAgRm9yIGV4YW1wbGU6Ci0KLSAgYGBgaGFuZGxlYmFycwotICAgIHt7I2VhY2gg
cG9zdCBpbiBjb250cm9sbGVyfX0KLSAgICAgIDxsaT57e3RpdGxlfX0gKHt7dGl0bGVMZW5ndGh9
fSBjaGFyYWN0ZXJzKTwvbGk+Ci0gICAge3svZWFjaH19Ci0gIGBgYAotCi0gIGBgYGphdmFzY3Jp
cHQKLSAgQXBwLlBvc3RzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQo
ewotICAgIGl0ZW1Db250cm9sbGVyOiAncG9zdCcKLSAgfSk7Ci0KLSAgQXBwLlBvc3RDb250cm9s
bGVyID0gRW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIC8vIHRoZSBgdGl0bGVg
IHByb3BlcnR5IHdpbGwgYmUgcHJveGllZCB0byB0aGUgdW5kZXJseWluZyBwb3N0LgotCi0gICAg
dGl0bGVMZW5ndGg6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0aXRsZScp
Lmxlbmd0aDsKLSAgICB9LnByb3BlcnR5KCd0aXRsZScpCi0gIH0pOwotICBgYGAKLQotICBJbiBz
b21lIGNhc2VzIGl0IGlzIGhlbHBmdWwgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGBpdGVtQ29udHJv
bGxlcmAgZGVwZW5kaW5nCi0gIG9uIHRoZSBwYXJ0aWN1bGFyIGl0ZW0uICBTdWJjbGFzc2VzIGNh
biBkbyB0aGlzIGJ5IG92ZXJyaWRpbmcKLSAgYGxvb2t1cEl0ZW1Db250cm9sbGVyYC4KLQotICBG
b3IgZXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5NeUFycmF5Q29udHJvbGxlciA9
IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGxvb2t1cEl0ZW1Db250cm9sbGVy
OiBmdW5jdGlvbiggb2JqZWN0ICkgewotICAgICAgaWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcp
KSB7Ci0gICAgICAgIHJldHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xs
ZXIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAu
UmVndWxhckNvbnRyb2xsZXIKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBUaGUg
aXRlbUNvbnRyb2xsZXIgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhIGBwYXJlbnRDb250cm9sbGVyYCBw
cm9wZXJ0eSBzZXQgdG8KLSAgZWl0aGVyIHRoZSB0aGUgYHBhcmVudENvbnRyb2xsZXJgIHByb3Bl
cnR5IG9mIHRoZSBgQXJyYXlDb250cm9sbGVyYAotICBvciB0byB0aGUgYEFycmF5Q29udHJvbGxl
cmAgaW5zdGFuY2UgaXRzZWxmLgotCi0gIEBjbGFzcyBBcnJheUNvbnRyb2xsZXIKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5BcnJheVByb3h5Ci0gIEB1c2VzIEVtYmVyLlNv
cnRhYmxlTWl4aW4KLSAgQHVzZXMgRW1iZXIuQ29udHJvbGxlck1peGluCi0qLwotCi1FbWJlci5B
cnJheUNvbnRyb2xsZXIgPSBFbWJlci5BcnJheVByb3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVy
TWl4aW4sCi0gIEVtYmVyLlNvcnRhYmxlTWl4aW4sIHsKLQotICAvKioKLSAgICBUaGUgY29udHJv
bGxlciB1c2VkIHRvIHdyYXAgaXRlbXMsIGlmIGFueS4KLQotICAgIEBwcm9wZXJ0eSBpdGVtQ29u
dHJvbGxlcgotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgaXRl
bUNvbnRyb2xsZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBj
b250cm9sbGVyIHRvIHdyYXAgaXRlbXMsIG9yIGBudWxsYCBpZiBpdGVtcyBzaG91bGQKLSAgICBi
ZSByZXR1cm5lZCBkaXJlY3RseS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBy
ZXR1cm5zIHRoZQotICAgIGBpdGVtQ29udHJvbGxlcmAgcHJvcGVydHksIGJ1dCBzdWJjbGFzc2Vz
IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4KLSAgICBkaWZmZXJlbnQgY29udHJv
bGxlcnMgZm9yIGRpZmZlcmVudCBvYmplY3RzLgotCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICBg
YGBqYXZhc2NyaXB0Ci0gICAgQXBwLk15QXJyYXlDb250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250
cm9sbGVyLmV4dGVuZCh7Ci0gICAgICBsb29rdXBJdGVtQ29udHJvbGxlcjogZnVuY3Rpb24oIG9i
amVjdCApIHsKLSAgICAgICAgaWYgKG9iamVjdC5nZXQoJ2lzU3BlY2lhbCcpKSB7Ci0gICAgICAg
ICAgcmV0dXJuICJzcGVjaWFsIjsgLy8gdXNlIEFwcC5TcGVjaWFsQ29udHJvbGxlcgotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAicmVndWxhciI7IC8vIHVzZSBBcHAuUmVndWxh
ckNvbnRyb2xsZXIKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAg
QG1ldGhvZCBsb29rdXBJdGVtQ29udHJvbGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QK
LSAgICBAcmV0dXJuIHtTdHJpbmd9Ci0gICovCi0gIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5j
dGlvbihvYmplY3QpIHsKLSAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtQ29udHJvbGxlcicpOwot
ICB9LAotCi0gIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7Ci0gICAgdmFyIGxlbmd0
aCA9IGdldCh0aGlzLCAnbGVuZ3RoJyksCi0gICAgICAgIGFycmFuZ2VkQ29udGVudCA9IGdldCh0
aGlzLCdhcnJhbmdlZENvbnRlbnQnKSwKLSAgICAgICAgb2JqZWN0ID0gYXJyYW5nZWRDb250ZW50
ICYmIGFycmFuZ2VkQ29udGVudC5vYmplY3RBdChpZHgpOwotCi0gICAgaWYgKGlkeCA+PSAwICYm
IGlkeCA8IGxlbmd0aCkgewotICAgICAgdmFyIGNvbnRyb2xsZXJDbGFzcyA9IHRoaXMubG9va3Vw
SXRlbUNvbnRyb2xsZXIob2JqZWN0KTsKLSAgICAgIGlmIChjb250cm9sbGVyQ2xhc3MpIHsKLSAg
ICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlckF0KGlkeCwgb2JqZWN0LCBjb250cm9sbGVyQ2xh
c3MpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFdoZW4gYGNvbnRyb2xsZXJDbGFzc2AgaXMg
ZmFsc3ksIHdlIGhhdmUgbm90IG9wdGVkIGluIHRvIHVzaW5nIGl0ZW0KLSAgICAvLyBjb250cm9s
bGVycywgc28gcmV0dXJuIHRoZSBvYmplY3QgZGlyZWN0bHkuCi0KLSAgICAvLyBXaGVuIHRoZSBp
bmRleCBpcyBvdXQgb2YgcmFuZ2UsIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSAib3V0IG9mIHJhbmdl
IgotICAgIC8vIHZhbHVlLCB3aGF0ZXZlciB0aGF0IG1pZ2h0IGJlLiAgUmF0aGVyIHRoYW4gbWFr
ZSBhc3N1bXB0aW9ucwotICAgIC8vIChlLmcuIGd1ZXNzaW5nIGBudWxsYCBvciBgdW5kZWZpbmVk
YCkgd2UgZGVmZXIgdGhpcyB0byBgYXJyYW5nZWRDb250ZW50YC4KLSAgICByZXR1cm4gb2JqZWN0
OwotICB9LAotCi0gIGFycmFuZ2VkQ29udGVudERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLl9yZXNldFN1YkNvbnRyb2xsZXJzKCk7Ci0gIH0sCi0K
LSAgYXJyYXlDb250ZW50RGlkQ2hhbmdlOiBmdW5jdGlvbihpZHgsIHJlbW92ZWRDbnQsIGFkZGVk
Q250KSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxl
cnMnKSwKLSAgICAgICAgc3ViQ29udHJvbGxlcnNUb1JlbW92ZSA9IHN1YkNvbnRyb2xsZXJzLnNs
aWNlKGlkeCwgaWR4K3JlbW92ZWRDbnQpOwotCi0gICAgZm9yRWFjaChzdWJDb250cm9sbGVyc1Rv
UmVtb3ZlLCBmdW5jdGlvbihzdWJDb250cm9sbGVyKSB7Ci0gICAgICBpZiAoc3ViQ29udHJvbGxl
cikgeyBzdWJDb250cm9sbGVyLmRlc3Ryb3koKTsgfQotICAgIH0pOwotCi0gICAgcmVwbGFjZShz
dWJDb250cm9sbGVycywgaWR4LCByZW1vdmVkQ250LCBuZXcgQXJyYXkoYWRkZWRDbnQpKTsKLQot
ICAgIC8vIFRoZSBzaGFkb3cgYXJyYXkgb2Ygc3ViY29udHJvbGxlcnMgbXVzdCBiZSB1cGRhdGVk
IGJlZm9yZSB3ZSB0cmlnZ2VyCi0gICAgLy8gb2JzZXJ2ZXJzLCBvdGhlcndpc2Ugb2JzZXJ2ZXJz
IHdpbGwgZ2V0IHRoZSB3cm9uZyBzdWJjb250YWluZXIgd2hlbgotICAgIC8vIGNhbGxpbmcgYG9i
amVjdEF0YAotICAgIHRoaXMuX3N1cGVyKGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpOwotICB9
LAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlz
LnNldCgnX3N1YkNvbnRyb2xsZXJzJywgRW1iZXIuQSgpKTsKLSAgfSwKLQotICBjb250ZW50OiBF
bWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSks
Ci0KLSAgY29udHJvbGxlckF0OiBmdW5jdGlvbihpZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNz
KSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IGdldCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAg
IHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxlcnMnKSwKLSAgICAgICAg
c3ViQ29udHJvbGxlciA9IHN1YkNvbnRyb2xsZXJzW2lkeF0sCi0gICAgICAgIGZhY3RvcnksIGZ1
bGxOYW1lOwotCi0gICAgaWYgKHN1YkNvbnRyb2xsZXIpIHsgcmV0dXJuIHN1YkNvbnRyb2xsZXI7
IH0KLQotICAgIGZ1bGxOYW1lID0gImNvbnRyb2xsZXI6IiArIGNvbnRyb2xsZXJDbGFzczsKLQot
ICAgIGlmICghY29udGFpbmVyLmhhcyhmdWxsTmFtZSkpIHsKLSAgICAgIHRocm93IG5ldyBFbWJl
ci5FcnJvcignQ291bGQgbm90IHJlc29sdmUgaXRlbUNvbnRyb2xsZXI6ICInICsgY29udHJvbGxl
ckNsYXNzICsgJyInKTsKLSAgICB9Ci0KLSAgICBzdWJDb250cm9sbGVyID0gY29udGFpbmVyLmxv
b2t1cEZhY3RvcnkoZnVsbE5hbWUpLmNyZWF0ZSh7Ci0gICAgICB0YXJnZXQ6IHRoaXMsCi0gICAg
ICBwYXJlbnRDb250cm9sbGVyOiBnZXQodGhpcywgJ3BhcmVudENvbnRyb2xsZXInKSB8fCB0aGlz
LAotICAgICAgY29udGVudDogb2JqZWN0Ci0gICAgfSk7Ci0KLSAgICBzdWJDb250cm9sbGVyc1tp
ZHhdID0gc3ViQ29udHJvbGxlcjsKLQotICAgIHJldHVybiBzdWJDb250cm9sbGVyOwotICB9LAot
Ci0gIF9zdWJDb250cm9sbGVyczogbnVsbCwKLQotICBfcmVzZXRTdWJDb250cm9sbGVyczogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJv
bGxlcnMnKTsKLSAgICBpZiAoc3ViQ29udHJvbGxlcnMpIHsKLSAgICAgIGZvckVhY2goc3ViQ29u
dHJvbGxlcnMsIGZ1bmN0aW9uKHN1YkNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKHN1YkNvbnRy
b2xsZXIpIHsgc3ViQ29udHJvbGxlci5kZXN0cm95KCk7IH0KLSAgICAgIH0pOwotICAgIH0KLQot
ICAgIHRoaXMuc2V0KCdfc3ViQ29udHJvbGxlcnMnLCBFbWJlci5BKCkpOwotICB9Ci19KTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1ydW50aW1lCi0qLwotCi0vKioKLSAgYEVtYmVyLk9iamVjdENvbnRyb2xsZXJgIGlz
IHBhcnQgb2YgRW1iZXIncyBDb250cm9sbGVyIGxheWVyLiBJdCBpcyBpbnRlbmRlZAotICB0byB3
cmFwIGEgc2luZ2xlIG9iamVjdCwgcHJveHlpbmcgdW5oYW5kbGVkIGF0dGVtcHRzIHRvIGBnZXRg
IGFuZCBgc2V0YCB0byB0aGUgdW5kZXJseWluZwotICBjb250ZW50IG9iamVjdCwgYW5kIHRvIGZv
cndhcmQgdW5oYW5kbGVkIGFjdGlvbiBhdHRlbXB0cyB0byBpdHMgYHRhcmdldGAuCi0KLSAgYEVt
YmVyLk9iamVjdENvbnRyb2xsZXJgIGRlcml2ZXMgdGhpcyBmdW5jdGlvbmFsaXR5IGZyb20gaXRz
IHN1cGVyY2xhc3MKLSAgYEVtYmVyLk9iamVjdFByb3h5YCBhbmQgdGhlIGBFbWJlci5Db250cm9s
bGVyTWl4aW5gIG1peGluLgotCi0gIEBjbGFzcyBPYmplY3RDb250cm9sbGVyCi0gIEBuYW1lc3Bh
Y2UgRW1iZXIKLSAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0UHJveHkKLSAgQHVzZXMgRW1iZXIuQ29u
dHJvbGxlck1peGluCi0qKi8KLUVtYmVyLk9iamVjdENvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RQ
cm94eS5leHRlbmQoRW1iZXIuQ29udHJvbGxlck1peGluKTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotRW1iZXIgUnVudGlt
ZQotCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKLUByZXF1aXJlcyBl
bWJlci1tZXRhbAotKi8KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgalF1ZXJ5ID0gdGhpcy5qUXVl
cnkgfHwgKEVtYmVyLmltcG9ydHMgJiYgRW1iZXIuaW1wb3J0cy5qUXVlcnkpOwotaWYgKCFqUXVl
cnkgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHsKLSAgalF1ZXJ5ID0gcmVxdWly
ZSgnanF1ZXJ5Jyk7Ci19Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgVmlld3MgcmVxdWlyZSBqUXVl
cnkgYmV0d2VlbiAxLjcgYW5kIDIuMSIsIGpRdWVyeSAmJiAoalF1ZXJ5KCkuanF1ZXJ5Lm1hdGNo
KC9eKCgxXC4oN3w4fDl8MTB8MTEpKXwoMlwuKDB8MSkpKShcLlxkKyk/KHByZXxyY1xkPyk/Lykg
fHwgRW1iZXIuRU5WLkZPUkNFX0pRVUVSWSkpOwotCi0vKioKLSAgQWxpYXMgZm9yIGpRdWVyeQot
Ci0gIEBtZXRob2QgJAotICBAZm9yIEVtYmVyCi0qLwotRW1iZXIuJCA9IGpRdWVyeTsKLQotfSko
KTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBl
bWJlci12aWV3cwotKi8KLWlmIChFbWJlci4kKSB7Ci0gIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9y
Zy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50
cwotICB2YXIgZHJhZ0V2ZW50cyA9IEVtYmVyLlN0cmluZy53KCdkcmFnc3RhcnQgZHJhZyBkcmFn
ZW50ZXIgZHJhZ2xlYXZlIGRyYWdvdmVyIGRyb3AgZHJhZ2VuZCcpOwotCi0gIC8vIENvcGllcyB0
aGUgYGRhdGFUcmFuc2ZlcmAgcHJvcGVydHkgZnJvbSBhIGJyb3dzZXIgZXZlbnQgb2JqZWN0IG9u
dG8gdGhlCi0gIC8vIGpRdWVyeSBldmVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnRz
Ci0gIEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoKGRyYWdFdmVudHMsIGZ1bmN0aW9uKGV2
ZW50TmFtZSkgewotICAgIEVtYmVyLiQuZXZlbnQuZml4SG9va3NbZXZlbnROYW1lXSA9IHsgcHJv
cHM6IFsnZGF0YVRyYW5zZmVyJ10gfTsKLSAgfSk7Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItdmlld3MKLSovCi0K
LS8qIEJFR0lOIE1FVEFNT1JQSCBIRUxQRVJTICovCi0KLS8vIEludGVybmV0IEV4cGxvcmVyIHBy
aW9yIHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVs
ZW1lbnQKLS8vIGlzIGEgInplcm8tc2NvcGUiIGVsZW1lbnQuIFRoaXMgcHJvYmxlbSBjYW4gYmUg
d29ya2VkIGFyb3VuZCBieSBtYWtpbmcKLS8vIHRoZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0
ZXh0IG5vZGUuIFdlLCBsaWtlIE1vZGVybml6ciwgdXNlICZzaHk7Ci0KLXZhciBuZWVkc1NoeSA9
IHRoaXMuZG9jdW1lbnQgJiYgKGZ1bmN0aW9uKCkgewotICB2YXIgdGVzdEVsID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gIHRlc3RFbC5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4i
OwotICB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPSAiPHNjcmlwdD48L3NjcmlwdD4iOwot
ICByZXR1cm4gdGVzdEVsLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKLX0pKCk7Ci0KLS8v
IElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNl
ZWRpbmcKLS8vIGEgc2NyaXB0IHRhZyB0byBhcHBlYXIgYWZ0ZXIgaXQuIFRoaXMgbWVhbnMgdGhh
dCB3ZSBjYW4KLS8vIGFjY2lkZW50YWxseSByZW1vdmUgd2hpdGVzcGFjZSB3aGVuIHVwZGF0aW5n
IGEgbW9ycGguCi12YXIgbW92ZXNXaGl0ZXNwYWNlID0gdGhpcy5kb2N1bWVudCAmJiAoZnVuY3Rp
b24oKSB7Ci0gIHZhciB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKLSAg
dGVzdEVsLmlubmVySFRNTCA9ICJUZXN0OiA8c2NyaXB0IHR5cGU9J3RleHQveC1wbGFjZWhvbGRl
cic+PC9zY3JpcHQ+VmFsdWUiOwotICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZh
bHVlID09PSAnVGVzdDonICYmCi0gICAgICAgICAgdGVzdEVsLmNoaWxkTm9kZXNbMl0ubm9kZVZh
bHVlID09PSAnIFZhbHVlJzsKLX0pKCk7Ci0KLS8vIFVzZSB0aGlzIHRvIGZpbmQgY2hpbGRyZW4g
YnkgSUQgaW5zdGVhZCBvZiB1c2luZyBqUXVlcnkKLXZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rp
b24oZWxlbWVudCwgaWQpIHsKLSAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBp
ZCkgeyByZXR1cm4gZWxlbWVudDsgfQotCi0gIHZhciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMu
bGVuZ3RoLCBpZHgsIG5vZGUsIGZvdW5kOwotICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykg
ewotICAgIG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaWR4XTsKLSAgICBmb3VuZCA9IG5vZGUu
bm9kZVR5cGUgPT09IDEgJiYgZmluZENoaWxkQnlJZChub2RlLCBpZCk7Ci0gICAgaWYgKGZvdW5k
KSB7IHJldHVybiBmb3VuZDsgfQotICB9Ci19OwotCi12YXIgc2V0SW5uZXJIVE1MV2l0aG91dEZp
eCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKLSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAgaHRt
bCA9ICcmc2h5OycgKyBodG1sOwotICB9Ci0KLSAgdmFyIG1hdGNoZXMgPSBbXTsKLSAgaWYgKG1v
dmVzV2hpdGVzcGFjZSkgewotICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IGNoZWNrIGZvciBzY3Jp
cHQgdGFncyB3aXRoIGlkcyB3aXRoIHRoZQotICAgIC8vIGdvYWwgb2YgdGFyZ2V0aW5nIG1vcnBo
cy4KLSAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oXHMrKSg8c2NyaXB0IGlkPScoW14nXSspJykv
ZywgZnVuY3Rpb24obWF0Y2gsIHNwYWNlcywgdGFnLCBpZCkgewotICAgICAgbWF0Y2hlcy5wdXNo
KFtpZCwgc3BhY2VzXSk7Ci0gICAgICByZXR1cm4gdGFnOwotICAgIH0pOwotICB9Ci0KLSAgZWxl
bWVudC5pbm5lckhUTUwgPSBodG1sOwotCi0gIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdoaXRl
c3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cKLSAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkg
ewotICAgIHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0aCwgaWR4OwotICAgIGZvciAoaWR4PTA7IGlk
eDxsZW47IGlkeCsrKSB7Ci0gICAgICB2YXIgc2NyaXB0ID0gZmluZENoaWxkQnlJZChlbGVtZW50
LCBtYXRjaGVzW2lkeF1bMF0pLAotICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwotICAgICAgc2NyaXB0LnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKG5vZGUsIHNjcmlwdCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5lZWRzU2h5KSB7Ci0gICAg
dmFyIHNoeUVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAgd2hpbGUgKHNoeUVsZW1l
bnQubm9kZVR5cGUgPT09IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKLSAgICAgIHNoeUVs
ZW1lbnQgPSBzaHlFbGVtZW50LmZpcnN0Q2hpbGQ7Ci0gICAgfQotICAgIGlmIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1
MDBBRCIpIHsKLSAgICAgIHNoeUVsZW1lbnQubm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFs
dWUuc2xpY2UoMSk7Ci0gICAgfQotICB9Ci19OwotCi0vKiBFTkQgTUVUQU1PUlBIIEhFTFBFUlMg
Ki8KLQotCi12YXIgaW5uZXJIVE1MVGFncyA9IHt9OwotdmFyIGNhblNldElubmVySFRNTCA9IGZ1
bmN0aW9uKHRhZ05hbWUpIHsKLSAgaWYgKGlubmVySFRNTFRhZ3NbdGFnTmFtZV0gIT09IHVuZGVm
aW5lZCkgewotICAgIHJldHVybiBpbm5lckhUTUxUYWdzW3RhZ05hbWVdOwotICB9Ci0KLSAgdmFy
IGNhblNldCA9IHRydWU7Ci0KLSAgLy8gSUUgOCBhbmQgZWFybGllciBkb24ndCBhbGxvdyB1cyB0
byBkbyBpbm5lckhUTUwgb24gc2VsZWN0Ci0gIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09
ICdzZWxlY3QnKSB7Ci0gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0
Jyk7Ci0gICAgc2V0SW5uZXJIVE1MV2l0aG91dEZpeChlbCwgJzxvcHRpb24gdmFsdWU9InRlc3Qi
PlRlc3Q8L29wdGlvbj4nKTsKLSAgICBjYW5TZXQgPSBlbC5vcHRpb25zLmxlbmd0aCA9PT0gMTsK
LSAgfQotCi0gIGlubmVySFRNTFRhZ3NbdGFnTmFtZV0gPSBjYW5TZXQ7Ci0KLSAgcmV0dXJuIGNh
blNldDsKLX07Ci0KLXZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7
Ci0gIHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lOwotCi0gIGlmIChjYW5TZXRJbm5lckhU
TUwodGFnTmFtZSkpIHsKLSAgICBzZXRJbm5lckhUTUxXaXRob3V0Rml4KGVsZW1lbnQsIGh0bWwp
OwotICB9IGVsc2UgewotICAgIC8vIEZpcmVmb3ggdmVyc2lvbnMgPCAxMSBkbyBub3QgaGF2ZSBz
dXBwb3J0IGZvciBlbGVtZW50Lm91dGVySFRNTC4KLSAgICB2YXIgb3V0ZXJIVE1MID0gZWxlbWVu
dC5vdXRlckhUTUwgfHwgbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhlbGVt
ZW50KTsKLSAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBpbm5lckhUTUwgb24gIitlbGVtZW50
LnRhZ05hbWUrIiBpbiB0aGlzIGJyb3dzZXIiLCBvdXRlckhUTUwpOwotCi0gICAgdmFyIHN0YXJ0
VGFnID0gb3V0ZXJIVE1MLm1hdGNoKG5ldyBSZWdFeHAoIjwiK3RhZ05hbWUrIihbXj5dKik+Iiwg
J2knKSlbMF0sCi0gICAgICAgIGVuZFRhZyA9ICc8LycrdGFnTmFtZSsnPic7Ci0KLSAgICB2YXIg
d3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgIHNldElubmVySFRN
TFdpdGhvdXRGaXgod3JhcHBlciwgc3RhcnRUYWcgKyBodG1sICsgZW5kVGFnKTsKLSAgICBlbGVt
ZW50ID0gd3JhcHBlci5maXJzdENoaWxkOwotICAgIHdoaWxlIChlbGVtZW50LnRhZ05hbWUgIT09
IHRhZ05hbWUpIHsKLSAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotICAgIH0K
LSAgfQotCi0gIHJldHVybiBlbGVtZW50OwotfTsKLQotZnVuY3Rpb24gaXNTaW1wbGVDbGljayhl
dmVudCkgewotICB2YXIgbW9kaWZpZXIgPSBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5
IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5LAotICAgICAgc2Vjb25kYXJ5Q2xpY2sg
PSBldmVudC53aGljaCA+IDE7IC8vIElFOSBtYXkgcmV0dXJuIHVuZGVmaW5lZAotCi0gIHJldHVy
biAhbW9kaWZpZXIgJiYgIXNlY29uZGFyeUNsaWNrOwotfQotCi1FbWJlci5WaWV3VXRpbHMgPSB7
Ci0gIHNldElubmVySFRNTDogc2V0SW5uZXJIVE1MLAotICBpc1NpbXBsZUNsaWNrOiBpc1NpbXBs
ZUNsaWNrCi19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci0KLXZhciBDbGFzc1NldCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnNl
ZW4gPSB7fTsKLSAgdGhpcy5saXN0ID0gW107Ci19OwotCi1DbGFzc1NldC5wcm90b3R5cGUgPSB7
Ci0gIGFkZDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgaWYgKHN0cmluZyBpbiB0aGlzLnNlZW4p
IHsgcmV0dXJuOyB9Ci0gICAgdGhpcy5zZWVuW3N0cmluZ10gPSB0cnVlOwotCi0gICAgdGhpcy5s
aXN0LnB1c2goc3RyaW5nKTsKLSAgfSwKLQotICB0b0RPTTogZnVuY3Rpb24oKSB7Ci0gICAgcmV0
dXJuIHRoaXMubGlzdC5qb2luKCIgIik7Ci0gIH0KLX07Ci0KLXZhciBCQURfVEFHX05BTUVfVEVT
VF9SRUdFWFAgPSAvW15hLXpBLVowLTlcLV0vOwotdmFyIEJBRF9UQUdfTkFNRV9SRVBMQUNFX1JF
R0VYUCA9IC9bXmEtekEtWjAtOVwtXS9nOwotCi1mdW5jdGlvbiBzdHJpcFRhZ05hbWUodGFnTmFt
ZSkgewotICBpZiAoIXRhZ05hbWUpIHsKLSAgICByZXR1cm4gdGFnTmFtZTsKLSAgfQotCi0gIGlm
ICghQkFEX1RBR19OQU1FX1RFU1RfUkVHRVhQLnRlc3QodGFnTmFtZSkpIHsKLSAgICByZXR1cm4g
dGFnTmFtZTsKLSAgfQotCi0gIHJldHVybiB0YWdOYW1lLnJlcGxhY2UoQkFEX1RBR19OQU1FX1JF
UExBQ0VfUkVHRVhQLCAnJyk7Ci19Ci0KLXZhciBCQURfQ0hBUlNfUkVHRVhQID0gLyYoPyFcdys7
KXxbPD4iJ2BdL2c7Ci12YXIgUE9TU0lCTEVfQ0hBUlNfUkVHRVhQID0gL1smPD4iJ2BdLzsKLQot
ZnVuY3Rpb24gZXNjYXBlQXR0cmlidXRlKHZhbHVlKSB7Ci0gIC8vIFN0b2xlbiBzaGFtZWxlc3Ns
eSBmcm9tIEhhbmRsZWJhcnMKLQotICB2YXIgZXNjYXBlID0gewotICAgICI8IjogIiZsdDsiLAot
ICAgICI+IjogIiZndDsiLAotICAgICciJzogIiZxdW90OyIsCi0gICAgIiciOiAiJiN4Mjc7IiwK
LSAgICAiYCI6ICImI3g2MDsiCi0gIH07Ci0KLSAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihj
aHIpIHsKLSAgICByZXR1cm4gZXNjYXBlW2Nocl0gfHwgIiZhbXA7IjsKLSAgfTsKLQotICB2YXIg
c3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLQotICBpZighUE9TU0lCTEVfQ0hBUlNfUkVHRVhQ
LnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9Ci0gIHJldHVybiBzdHJpbmcucmVwbGFj
ZShCQURfQ0hBUlNfUkVHRVhQLCBlc2NhcGVDaGFyKTsKLX0KLQotLy8gSUUgNi83IGhhdmUgYnVn
cyBhcm9uZCBzZXR0aW5nIG5hbWVzIG9uIGlucHV0cyBkdXJpbmcgY3JlYXRpb24uCi0vLyBGcm9t
IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9tczUzNjM4OSh2PXZz
Ljg1KS5hc3B4OgotLy8gIlRvIGluY2x1ZGUgdGhlIE5BTUUgYXR0cmlidXRlIGF0IHJ1biB0aW1l
IG9uIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBjcmVhdGVFbGVtZW50IG1ldGhvZCwgdXNlIHRo
ZSBlVGFnLiIKLXZhciBjYW5TZXROYW1lT25JbnB1dHMgPSAoZnVuY3Rpb24oKSB7Ci0gIHZhciBk
aXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKLSAgICAgIGVsID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKLQotICBlbC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnZm9v
Jyk7Ci0gIGRpdi5hcHBlbmRDaGlsZChlbCk7Ci0KLSAgcmV0dXJuICEhZGl2LmlubmVySFRNTC5t
YXRjaCgnZm9vJyk7Ci19KSgpOwotCi0vKioKLSAgYEVtYmVyLlJlbmRlckJ1ZmZlcmAgZ2F0aGVy
cyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGEgdmlldyBhbmQgZ2VuZXJhdGVzIHRoZQotICBm
aW5hbCByZXByZXNlbnRhdGlvbi4gYEVtYmVyLlJlbmRlckJ1ZmZlcmAgd2lsbCBnZW5lcmF0ZSBI
VE1MIHdoaWNoIGNhbiBiZSBwdXNoZWQKLSAgdG8gdGhlIERPTS4KLQotICAgYGBgamF2YXNjcmlw
dAotICAgdmFyIGJ1ZmZlciA9IEVtYmVyLlJlbmRlckJ1ZmZlcignZGl2Jyk7Ci0gIGBgYAotCi0g
IEBjbGFzcyBSZW5kZXJCdWZmZXIKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAY29uc3RydWN0b3IK
LSAgQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWUgdGFnIG5hbWUgKHN1Y2ggYXMgJ2Rpdicgb3IgJ3An
KSB1c2VkIGZvciB0aGUgYnVmZmVyCi0qLwotRW1iZXIuUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24o
dGFnTmFtZSkgewotICByZXR1cm4gbmV3IEVtYmVyLl9SZW5kZXJCdWZmZXIodGFnTmFtZSk7Ci19
OwotCi1FbWJlci5fUmVuZGVyQnVmZmVyID0gZnVuY3Rpb24odGFnTmFtZSkgewotICB0aGlzLnRh
Z05hbWVzID0gW3RhZ05hbWUgfHwgbnVsbF07Ci0gIHRoaXMuYnVmZmVyID0gIiI7Ci19OwotCi1F
bWJlci5fUmVuZGVyQnVmZmVyLnByb3RvdHlwZSA9IHsKLQotICAvLyBUaGUgcm9vdCB2aWV3J3Mg
ZWxlbWVudAotICBfZWxlbWVudDogbnVsbCwKLQotICBfaGFzRWxlbWVudDogdHJ1ZSwKLQotICAv
KioKLSAgICBBbiBpbnRlcm5hbCBzZXQgdXNlZCB0byBkZS1kdXBlIGNsYXNzIG5hbWVzIHdoZW4g
YGFkZENsYXNzKClgIGlzCi0gICAgdXNlZC4gQWZ0ZXIgZWFjaCBjYWxsIHRvIGBhZGRDbGFzcygp
YCwgdGhlIGBjbGFzc2VzYCBwcm9wZXJ0eQotICAgIHdpbGwgYmUgdXBkYXRlZC4KLQotICAgIEBw
cml2YXRlCi0gICAgQHByb3BlcnR5IGVsZW1lbnRDbGFzc2VzCi0gICAgQHR5cGUgQXJyYXkKLSAg
ICBAZGVmYXVsdCBbXQotICAqLwotICBlbGVtZW50Q2xhc3NlczogbnVsbCwKLQotICAvKioKLSAg
ICBBcnJheSBvZiBjbGFzcyBuYW1lcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGNsYXNz
IGF0dHJpYnV0ZS4KLQotICAgIFlvdSBjYW4gdXNlIGBzZXRDbGFzc2VzKClgIHRvIHNldCB0aGlz
IHByb3BlcnR5IGRpcmVjdGx5LiBJZiB5b3UKLSAgICB1c2UgYGFkZENsYXNzKClgLCBpdCB3aWxs
IGJlIG1haW50YWluZWQgZm9yIHlvdS4KLQotICAgIEBwcm9wZXJ0eSBjbGFzc2VzCi0gICAgQHR5
cGUgQXJyYXkKLSAgICBAZGVmYXVsdCBbXQotICAqLwotICBjbGFzc2VzOiBudWxsLAotCi0gIC8q
KgotICAgIFRoZSBpZCBpbiBvZiB0aGUgZWxlbWVudCwgdG8gYmUgYXBwbGllZCBpbiB0aGUgaWQg
YXR0cmlidXRlLgotCi0gICAgWW91IHNob3VsZCBub3Qgc2V0IHRoaXMgcHJvcGVydHkgeW91cnNl
bGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAgICB0aGUgYGlkKClgIG1ldGhvZCBvZiBgRW1i
ZXIuUmVuZGVyQnVmZmVyYC4KLQotICAgIEBwcm9wZXJ0eSBlbGVtZW50SWQKLSAgICBAdHlwZSBT
dHJpbmcKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIGVsZW1lbnRJZDogbnVsbCwKLQotICAv
KioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgd2hv
c2UgdmFsdWUgd2lsbCBiZQotICAgIGFwcGxpZWQgdG8gdGhhdCBhdHRyaWJ1dGUuIEZvciBleGFt
cGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAgICBgZGF0YS12aWV3PSJGb28uYmFyImAg
cHJvcGVydHkgdG8gYW4gZWxlbWVudCwgeW91IHdvdWxkIHNldCB0aGUKLSAgICBlbGVtZW50QXR0
cmlidXRlcyBoYXNoIHRvIGB7J2RhdGEtdmlldyc6J0Zvby5iYXInfWAuCi0KLSAgICBZb3Ugc2hv
dWxkIG5vdCBtYWludGFpbiB0aGlzIGhhc2ggeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1
c2UKLSAgICB0aGUgYGF0dHIoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgotCi0g
ICAgQHByb3BlcnR5IGVsZW1lbnRBdHRyaWJ1dGVzCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZh
dWx0IHt9Ci0gICovCi0gIGVsZW1lbnRBdHRyaWJ1dGVzOiBudWxsLAotCi0gIC8qKgotICAgIEEg
aGFzaCBrZXllZCBvbiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBhbmQgd2hvc2UgdmFsdWUg
d2lsbCBiZQotICAgIGFwcGxpZWQgdG8gdGhhdCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmIHlv
dSB3YW50ZWQgdG8gYXBwbHkgYQotICAgIGBjaGVja2VkPXRydWVgIHByb3BlcnR5IHRvIGFuIGVs
ZW1lbnQsIHlvdSB3b3VsZCBzZXQgdGhlCi0gICAgZWxlbWVudFByb3BlcnRpZXMgaGFzaCB0byBg
eydjaGVja2VkJzp0cnVlfWAuCi0KLSAgICBZb3Ugc2hvdWxkIG5vdCBtYWludGFpbiB0aGlzIGhh
c2ggeW91cnNlbGYsIHJhdGhlciwgeW91IHNob3VsZCB1c2UKLSAgICB0aGUgYHByb3AoKWAgbWV0
aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgotCi0gICAgQHByb3BlcnR5IGVsZW1lbnRQcm9w
ZXJ0aWVzCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRQ
cm9wZXJ0aWVzOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB0YWduYW1lIG9mIHRoZSBlbGVtZW50
IGFuIGluc3RhbmNlIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgIHJlcHJlc2VudHMuCi0KLSAgICBV
c3VhbGx5LCB0aGlzIGdldHMgc2V0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYEVtYmVyLlJl
bmRlckJ1ZmZlcmAuIEZvcgotICAgIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEg
YHBgIHRhZywgdGhlbiB5b3Ugd291bGQgY2FsbAotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVt
YmVyLlJlbmRlckJ1ZmZlcigncCcpCi0gICAgYGBgCi0KLSAgICBAcHJvcGVydHkgZWxlbWVudFRh
ZwotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgZWxlbWVudFRh
ZzogbnVsbCwKLQotICAvKioKLSAgICBBIGhhc2gga2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIHN0
eWxlIGF0dHJpYnV0ZSBhbmQgd2hvc2UgdmFsdWUgd2lsbAotICAgIGJlIGFwcGxpZWQgdG8gdGhh
dCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFwcGx5IGEKLSAgICBg
YmFja2dyb3VuZC1jb2xvcjpibGFjaztgIHN0eWxlIHRvIGFuIGVsZW1lbnQsIHlvdSB3b3VsZCBz
ZXQgdGhlCi0gICAgZWxlbWVudFN0eWxlIGhhc2ggdG8gYHsnYmFja2dyb3VuZC1jb2xvcic6J2Js
YWNrJ31gLgotCi0gICAgWW91IHNob3VsZCBub3QgbWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxm
LCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCi0gICAgdGhlIGBzdHlsZSgpYCBtZXRob2Qgb2YgYEVt
YmVyLlJlbmRlckJ1ZmZlcmAuCi0KLSAgICBAcHJvcGVydHkgZWxlbWVudFN0eWxlCi0gICAgQHR5
cGUgSGFzaAotICAgIEBkZWZhdWx0IHt9Ci0gICovCi0gIGVsZW1lbnRTdHlsZTogbnVsbCwKLQot
ICAvKioKLSAgICBOZXN0ZWQgYFJlbmRlckJ1ZmZlcnNgIHdpbGwgc2V0IHRoaXMgdG8gdGhlaXIg
cGFyZW50IGBSZW5kZXJCdWZmZXJgCi0gICAgaW5zdGFuY2UuCi0KLSAgICBAcHJvcGVydHkgcGFy
ZW50QnVmZmVyCi0gICAgQHR5cGUgRW1iZXIuX1JlbmRlckJ1ZmZlcgotICAqLwotICBwYXJlbnRC
dWZmZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgQWRkcyBhIHN0cmluZyBvZiBIVE1MIHRvIHRoZSBg
UmVuZGVyQnVmZmVyYC4KLQotICAgIEBtZXRob2QgcHVzaAotICAgIEBwYXJhbSB7U3RyaW5nfSBz
dHJpbmcgSFRNTCB0byBwdXNoIGludG8gdGhlIGJ1ZmZlcgotICAgIEBjaGFpbmFibGUKLSAgKi8K
LSAgcHVzaDogZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgdGhpcy5idWZmZXIgKz0gc3RyaW5nOwot
ICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYSBjbGFzcyB0byB0aGUg
YnVmZmVyLCB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUuCi0K
LSAgICBAbWV0aG9kIGFkZENsYXNzCi0gICAgQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFz
cyBuYW1lIHRvIGFkZCB0byB0aGUgYnVmZmVyCi0gICAgQGNoYWluYWJsZQotICAqLwotICBhZGRD
bGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKSB7Ci0gICAgLy8gbGF6aWx5IGNyZWF0ZSBlbGVtZW50
Q2xhc3NlcwotICAgIHRoaXMuZWxlbWVudENsYXNzZXMgPSAodGhpcy5lbGVtZW50Q2xhc3NlcyB8
fCBuZXcgQ2xhc3NTZXQoKSk7Ci0gICAgdGhpcy5lbGVtZW50Q2xhc3Nlcy5hZGQoY2xhc3NOYW1l
KTsKLSAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmVsZW1lbnRDbGFzc2VzLmxpc3Q7Ci0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKLQotICBzZXRDbGFzc2VzOiBmdW5jdGlvbihjbGFzc05hbWVzKSB7
Ci0gICAgdGhpcy5jbGFzc2VzID0gY2xhc3NOYW1lczsKLSAgfSwKLQotICAvKioKLSAgICBTZXRz
IHRoZSBlbGVtZW50SUQgdG8gYmUgdXNlZCBmb3IgdGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9k
IGlkCi0gICAgQHBhcmFtIHtTdHJpbmd9IGlkCi0gICAgQGNoYWluYWJsZQotICAqLwotICBpZDog
ZnVuY3Rpb24oaWQpIHsKLSAgICB0aGlzLmVsZW1lbnRJZCA9IGlkOwotICAgIHJldHVybiB0aGlz
OwotICB9LAotCi0gIC8vIGR1Y2sgdHlwZSBhdHRyaWJ1dGUgZnVuY3Rpb25hbGl0eSBsaWtlIGpR
dWVyeSBzbyBhIHJlbmRlciBidWZmZXIKLSAgLy8gY2FuIGJlIHVzZWQgbGlrZSBhIGpRdWVyeSBv
YmplY3QgaW4gYXR0cmlidXRlIGJpbmRpbmcgc2NlbmFyaW9zLgotCi0gIC8qKgotICAgIEFkZHMg
YW4gYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAg
ICBAbWV0aG9kIGF0dHIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUg
YXR0cmlidXRlCi0gICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8g
dGhlIGF0dHJpYnV0ZQotICAgIEBjaGFpbmFibGUKLSAgICBAcmV0dXJuIHtFbWJlci5SZW5kZXJC
dWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZQotICAqLwot
ICBhdHRyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICAgIHZhciBhdHRyaWJ1dGVzID0gdGhp
cy5lbGVtZW50QXR0cmlidXRlcyA9ICh0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzIHx8IHt9KTsKLQot
ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICByZXR1cm4gYXR0cmlidXRl
c1tuYW1lXTsKLSAgICB9IGVsc2UgewotICAgICAgYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlOwot
ICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZSBhbiBh
dHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIHJlbmRlci4KLQotICAgIEBt
ZXRob2QgcmVtb3ZlQXR0cgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRo
ZSBhdHRyaWJ1dGUKLSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHJlbW92ZUF0dHI6IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXM7Ci0g
ICAgaWYgKGF0dHJpYnV0ZXMpIHsgZGVsZXRlIGF0dHJpYnV0ZXNbbmFtZV07IH0KLQotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEFkZHMgYW4gcHJvcGVydHkgd2hpY2ggd2ls
bCBiZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KLQotICAgIEBtZXRob2QgcHJvcAotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIEBwYXJhbSB7
U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBwcm9wZXJ0eQotICAgIEBjaGFp
bmFibGUKLSAgICBAcmV0dXJuIHtFbWJlci5SZW5kZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRo
ZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlCi0gICovCi0gIHByb3A6IGZ1bmN0aW9uKG5hbWUsIHZh
bHVlKSB7Ci0gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gKHRo
aXMuZWxlbWVudFByb3BlcnRpZXMgfHwge30pOwotCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PT09IDEpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0aWVzW25hbWVdOwotICAgIH0gZWxzZSB7Ci0g
ICAgICBwcm9wZXJ0aWVzW25hbWVdID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXM7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlIGFuIHByb3BlcnR5IGZyb20gdGhlIGxpc3Qgb2Yg
cHJvcGVydGllcyB0byByZW5kZXIuCi0KLSAgICBAbWV0aG9kIHJlbW92ZVByb3AKLSAgICBAcGFy
YW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICBAY2hhaW5hYmxl
Ci0gICovCi0gIHJlbW92ZVByb3A6IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICB2YXIgcHJvcGVydGll
cyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXM7Ci0gICAgaWYgKHByb3BlcnRpZXMpIHsgZGVsZXRl
IHByb3BlcnRpZXNbbmFtZV07IH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIC8qKgot
ICAgIEFkZHMgYSBzdHlsZSB0byB0aGUgc3R5bGUgYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgcmVu
ZGVyZWQgdG8gdGhlIGVsZW1lbnQuCi0KLSAgICBAbWV0aG9kIHN0eWxlCi0gICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgc3R5bGUKLSAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUK
LSAgICBAY2hhaW5hYmxlCi0gICovCi0gIHN0eWxlOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewot
ICAgIHRoaXMuZWxlbWVudFN0eWxlID0gKHRoaXMuZWxlbWVudFN0eWxlIHx8IHt9KTsKLQotICAg
IHRoaXMuZWxlbWVudFN0eWxlW25hbWVdID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0s
Ci0KLSAgYmVnaW46IGZ1bmN0aW9uKHRhZ05hbWUpIHsKLSAgICB0aGlzLnRhZ05hbWVzLnB1c2go
dGFnTmFtZSB8fCBudWxsKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBwdXNoT3Blbmlu
Z1RhZzogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRhZ05hbWUgPSB0aGlzLmN1cnJlbnRUYWdOYW1l
KCk7Ci0gICAgaWYgKCF0YWdOYW1lKSB7IHJldHVybjsgfQotCi0gICAgaWYgKHRoaXMuX2hhc0Vs
ZW1lbnQgJiYgIXRoaXMuX2VsZW1lbnQgJiYgdGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7Ci0g
ICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnQoKTsKLSAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCi0gICAgICAgIGlkID0g
dGhpcy5lbGVtZW50SWQsCi0gICAgICAgIGNsYXNzZXMgPSB0aGlzLmNsYXNzZXMsCi0gICAgICAg
IGF0dHJzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlcywKLSAgICAgICAgcHJvcHMgPSB0aGlzLmVs
ZW1lbnRQcm9wZXJ0aWVzLAotICAgICAgICBzdHlsZSA9IHRoaXMuZWxlbWVudFN0eWxlLAotICAg
ICAgICBhdHRyLCBwcm9wOwotCi0gICAgYnVmZmVyICs9ICc8JyArIHN0cmlwVGFnTmFtZSh0YWdO
YW1lKTsKLQotICAgIGlmIChpZCkgewotICAgICAgYnVmZmVyICs9ICcgaWQ9IicgKyBlc2NhcGVB
dHRyaWJ1dGUoaWQpICsgJyInOwotICAgICAgdGhpcy5lbGVtZW50SWQgPSBudWxsOwotICAgIH0K
LSAgICBpZiAoY2xhc3NlcykgewotICAgICAgYnVmZmVyICs9ICcgY2xhc3M9IicgKyBlc2NhcGVB
dHRyaWJ1dGUoY2xhc3Nlcy5qb2luKCcgJykpICsgJyInOwotICAgICAgdGhpcy5jbGFzc2VzID0g
bnVsbDsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUpIHsKLSAgICAgIGJ1ZmZlciArPSAnIHN0eWxl
PSInOwotCi0gICAgICBmb3IgKHByb3AgaW4gc3R5bGUpIHsKLSAgICAgICAgaWYgKHN0eWxlLmhh
c093blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgYnVmZmVyICs9IHByb3AgKyAnOicgKyBl
c2NhcGVBdHRyaWJ1dGUoc3R5bGVbcHJvcF0pICsgJzsnOwotICAgICAgICB9Ci0gICAgICB9Ci0K
LSAgICAgIGJ1ZmZlciArPSAnIic7Ci0KLSAgICAgIHRoaXMuZWxlbWVudFN0eWxlID0gbnVsbDsK
LSAgICB9Ci0KLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAoYXR0ciBpbiBhdHRycykgewot
ICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoYXR0cikpIHsKLSAgICAgICAgICBidWZm
ZXIgKz0gJyAnICsgYXR0ciArICc9IicgKyBlc2NhcGVBdHRyaWJ1dGUoYXR0cnNbYXR0cl0pICsg
JyInOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMg
PSBudWxsOwotICAgIH0KLQotICAgIGlmIChwcm9wcykgewotICAgICAgZm9yIChwcm9wIGluIHBy
b3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewotICAgICAg
ICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BdOwotICAgICAgICAgIGlmICh2YWx1ZSB8fCB0eXBl
b2YodmFsdWUpID09PSAnbnVtYmVyJykgewotICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVl
KSB7Ci0gICAgICAgICAgICAgIGJ1ZmZlciArPSAnICcgKyBwcm9wICsgJz0iJyArIHByb3AgKyAn
Iic7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBidWZmZXIgKz0gJyAnICsg
cHJvcCArICc9IicgKyBlc2NhcGVBdHRyaWJ1dGUocHJvcHNbcHJvcF0pICsgJyInOwotICAgICAg
ICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aGlzLmVs
ZW1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBidWZmZXIgKz0gJz4nOwotICAg
IHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICB9LAotCi0gIHB1c2hDbG9zaW5nVGFnOiBmdW5jdGlv
bigpIHsKLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZXMucG9wKCk7Ci0gICAgaWYgKHRh
Z05hbWUpIHsgdGhpcy5idWZmZXIgKz0gJzwvJyArIHN0cmlwVGFnTmFtZSh0YWdOYW1lKSArICc+
JzsgfQotICB9LAotCi0gIGN1cnJlbnRUYWdOYW1lOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dGhpcy50YWdOYW1lc1t0aGlzLnRhZ05hbWVzLmxlbmd0aC0xXTsKLSAgfSwKLQotICBnZW5lcmF0
ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciB0YWdOYW1lID0gdGhpcy50YWdOYW1lcy5w
b3AoKSwgLy8gcG9wIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gY2xvc2UKLSAgICAgICAgaWQgPSB0
aGlzLmVsZW1lbnRJZCwKLSAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKLSAgICAgICAg
YXR0cnMgPSB0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzLAotICAgICAgICBwcm9wcyA9IHRoaXMuZWxl
bWVudFByb3BlcnRpZXMsCi0gICAgICAgIHN0eWxlID0gdGhpcy5lbGVtZW50U3R5bGUsCi0gICAg
ICAgIHN0eWxlQnVmZmVyID0gJycsIGF0dHIsIHByb3AsIHRhZ1N0cmluZzsKLQotICAgIGlmIChh
dHRycyAmJiBhdHRycy5uYW1lICYmICFjYW5TZXROYW1lT25JbnB1dHMpIHsKLSAgICAgIC8vIElF
IGFsbG93cyBwYXNzaW5nIGEgdGFnIHRvIGNyZWF0ZUVsZW1lbnQuIFNlZSBub3RlIG9uIGBjYW5T
ZXROYW1lT25JbnB1dHNgIGFib3ZlIGFzIHdlbGwuCi0gICAgICB0YWdTdHJpbmcgPSAnPCcrc3Ry
aXBUYWdOYW1lKHRhZ05hbWUpKycgbmFtZT0iJytlc2NhcGVBdHRyaWJ1dGUoYXR0cnMubmFtZSkr
JyI+JzsKLSAgICB9IGVsc2UgewotICAgICAgdGFnU3RyaW5nID0gdGFnTmFtZTsKLSAgICB9Ci0K
LSAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnU3RyaW5nKSwKLSAg
ICAgICAgJGVsZW1lbnQgPSBFbWJlci4kKGVsZW1lbnQpOwotCi0gICAgaWYgKGlkKSB7Ci0gICAg
ICAkZWxlbWVudC5hdHRyKCdpZCcsIGlkKTsKLSAgICAgIHRoaXMuZWxlbWVudElkID0gbnVsbDsK
LSAgICB9Ci0gICAgaWYgKGNsYXNzZXMpIHsKLSAgICAgICRlbGVtZW50LmF0dHIoJ2NsYXNzJywg
Y2xhc3Nlcy5qb2luKCcgJykpOwotICAgICAgdGhpcy5jbGFzc2VzID0gbnVsbDsKLSAgICB9Ci0K
LSAgICBpZiAoc3R5bGUpIHsKLSAgICAgIGZvciAocHJvcCBpbiBzdHlsZSkgewotICAgICAgICBp
ZiAoc3R5bGUuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKLSAgICAgICAgICBzdHlsZUJ1ZmZlciAr
PSAocHJvcCArICc6JyArIHN0eWxlW3Byb3BdICsgJzsnKTsKLSAgICAgICAgfQotICAgICAgfQot
Ci0gICAgICAkZWxlbWVudC5hdHRyKCdzdHlsZScsIHN0eWxlQnVmZmVyKTsKLQotICAgICAgdGhp
cy5lbGVtZW50U3R5bGUgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChhdHRycykgewotICAgICAg
Zm9yIChhdHRyIGluIGF0dHJzKSB7Ci0gICAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShh
dHRyKSkgewotICAgICAgICAgICRlbGVtZW50LmF0dHIoYXR0ciwgYXR0cnNbYXR0cl0pOwotICAg
ICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwot
ICAgIH0KLQotICAgIGlmIChwcm9wcykgewotICAgICAgZm9yIChwcm9wIGluIHByb3BzKSB7Ci0g
ICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewotICAgICAgICAgICRlbGVt
ZW50LnByb3AocHJvcCwgcHJvcHNbcHJvcF0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAg
IHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBlbGVt
ZW50OwotICB9LAotCi0gIC8qKgotICAgIEBtZXRob2QgZWxlbWVudAotICAgIEByZXR1cm4ge0RP
TUVsZW1lbnR9IFRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBIVE1M
Ci0gICAgICBvZiB0aGlzIGJ1ZmZlcgotICAqLwotICBlbGVtZW50OiBmdW5jdGlvbigpIHsKLSAg
ICB2YXIgaHRtbCA9IHRoaXMuaW5uZXJTdHJpbmcoKTsKLQotICAgIGlmIChodG1sKSB7Ci0gICAg
ICB0aGlzLl9lbGVtZW50ID0gRW1iZXIuVmlld1V0aWxzLnNldElubmVySFRNTCh0aGlzLl9lbGVt
ZW50LCBodG1sKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fZWxlbWVudDsKLSAgfSwKLQot
ICAvKioKLSAgICBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgdGhpcyBidWZmZXIuCi0K
LSAgICBAbWV0aG9kIHN0cmluZwotICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBI
VE1MCi0gICovCi0gIHN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuX2hhc0VsZW1l
bnQgJiYgdGhpcy5fZWxlbWVudCkgewotICAgICAgLy8gRmlyZWZveCB2ZXJzaW9ucyA8IDExIGRv
IG5vdCBoYXZlIHN1cHBvcnQgZm9yIGVsZW1lbnQub3V0ZXJIVE1MLgotICAgICAgdmFyIHRoaXNF
bGVtZW50ID0gdGhpcy5lbGVtZW50KCksIG91dGVySFRNTCA9IHRoaXNFbGVtZW50Lm91dGVySFRN
TDsKLSAgICAgIGlmICh0eXBlb2Ygb3V0ZXJIVE1MID09PSAndW5kZWZpbmVkJykgewotICAgICAg
ICByZXR1cm4gRW1iZXIuJCgnPGRpdi8+JykuYXBwZW5kKHRoaXNFbGVtZW50KS5odG1sKCk7Ci0g
ICAgICB9Ci0gICAgICByZXR1cm4gb3V0ZXJIVE1MOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1
cm4gdGhpcy5pbm5lclN0cmluZygpOwotICAgIH0KLSAgfSwKLQotICBpbm5lclN0cmluZzogZnVu
Y3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuYnVmZmVyOwotICB9Ci19OwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBoYW5kbGVz
IGRlbGVnYXRpbmcgYnJvd3NlciBldmVudHMgdG8gdGhlaXIKLSAgY29ycmVzcG9uZGluZyBgRW1i
ZXIuVmlld3MuYCBGb3IgZXhhbXBsZSwgd2hlbiB5b3UgY2xpY2sgb24gYSB2aWV3LAotICBgRW1i
ZXIuRXZlbnREaXNwYXRjaGVyYCBlbnN1cmVzIHRoYXQgdGhhdCB2aWV3J3MgYG1vdXNlRG93bmAg
bWV0aG9kIGdldHMKLSAgY2FsbGVkLgotCi0gIEBjbGFzcyBFdmVudERpc3BhdGNoZXIKLSAgQG5h
bWVzcGFjZSBFbWJlcgotICBAcHJpdmF0ZQotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1F
bWJlci5FdmVudERpc3BhdGNoZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLQotICAvKioKLSAg
ICBUaGUgc2V0IG9mIGV2ZW50cyBuYW1lcyAoYW5kIGFzc29jaWF0ZWQgaGFuZGxlciBmdW5jdGlv
biBuYW1lcykgdG8gYmUgc2V0dXAKLSAgICBhbmQgZGlzcGF0Y2hlZCBieSB0aGUgYEV2ZW50RGlz
cGF0Y2hlcmAuIEN1c3RvbSBldmVudHMgY2FuIGFkZGVkIHRvIHRoaXMgbGlzdCBhdCBzZXR1cAot
ICAgIHRpbWUsIGdlbmVyYWxseSB2aWEgdGhlIGBFbWJlci5BcHBsaWNhdGlvbi5jdXN0b21FdmVu
dHNgIGhhc2guIE9ubHkgb3ZlcnJpZGUgdGhpcwotICAgIGRlZmF1bHQgc2V0IHRvIHByZXZlbnQg
dGhlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIGxpc3RlbmluZyBvbiBzb21lIGV2ZW50cyBhbGwgdG9n
ZXRoZXIuCi0KLSAgICBUaGlzIHNldCB3aWxsIGJlIG1vZGlmaWVkIGJ5IGBzZXR1cGAgdG8gYWxz
byBpbmNsdWRlIGFueSBldmVudHMgYWRkZWQgYXQgdGhhdCB0aW1lLgotCi0gICAgQHByb3BlcnR5
IGV2ZW50cwotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBldmVudHM6IHsKLSAgICB0b3VjaHN0
YXJ0ICA6ICd0b3VjaFN0YXJ0JywKLSAgICB0b3VjaG1vdmUgICA6ICd0b3VjaE1vdmUnLAotICAg
IHRvdWNoZW5kICAgIDogJ3RvdWNoRW5kJywKLSAgICB0b3VjaGNhbmNlbCA6ICd0b3VjaENhbmNl
bCcsCi0gICAga2V5ZG93biAgICAgOiAna2V5RG93bicsCi0gICAga2V5dXAgICAgICAgOiAna2V5
VXAnLAotICAgIGtleXByZXNzICAgIDogJ2tleVByZXNzJywKLSAgICBtb3VzZWRvd24gICA6ICdt
b3VzZURvd24nLAotICAgIG1vdXNldXAgICAgIDogJ21vdXNlVXAnLAotICAgIGNvbnRleHRtZW51
IDogJ2NvbnRleHRNZW51JywKLSAgICBjbGljayAgICAgICA6ICdjbGljaycsCi0gICAgZGJsY2xp
Y2sgICAgOiAnZG91YmxlQ2xpY2snLAotICAgIG1vdXNlbW92ZSAgIDogJ21vdXNlTW92ZScsCi0g
ICAgZm9jdXNpbiAgICAgOiAnZm9jdXNJbicsCi0gICAgZm9jdXNvdXQgICAgOiAnZm9jdXNPdXQn
LAotICAgIG1vdXNlZW50ZXIgIDogJ21vdXNlRW50ZXInLAotICAgIG1vdXNlbGVhdmUgIDogJ21v
dXNlTGVhdmUnLAotICAgIHN1Ym1pdCAgICAgIDogJ3N1Ym1pdCcsCi0gICAgaW5wdXQgICAgICAg
OiAnaW5wdXQnLAotICAgIGNoYW5nZSAgICAgIDogJ2NoYW5nZScsCi0gICAgZHJhZ3N0YXJ0ICAg
OiAnZHJhZ1N0YXJ0JywKLSAgICBkcmFnICAgICAgICA6ICdkcmFnJywKLSAgICBkcmFnZW50ZXIg
ICA6ICdkcmFnRW50ZXInLAotICAgIGRyYWdsZWF2ZSAgIDogJ2RyYWdMZWF2ZScsCi0gICAgZHJh
Z292ZXIgICAgOiAnZHJhZ092ZXInLAotICAgIGRyb3AgICAgICAgIDogJ2Ryb3AnLAotICAgIGRy
YWdlbmQgICAgIDogJ2RyYWdFbmQnCi0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVs
ZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNob3VsZCBiZSBhdHRhY2hlZC4gRXZlbnQK
LSAgICBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQgdW5sZXNzIHRo
aXMgaXMgb3ZlcnJpZGRlbi4KLQotICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50
IG9yIGEgc2VsZWN0b3Igc3RyaW5nLgotCi0gICAgVGhlIGRlZmF1bHQgYm9keSBpcyBhIHN0cmlu
ZyBzaW5jZSB0aGlzIG1heSBiZSBldmFsdWF0ZWQgYmVmb3JlIGRvY3VtZW50LmJvZHkKLSAgICBl
eGlzdHMgaW4gdGhlIERPTS4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IHJvb3RFbGVt
ZW50Ci0gICAgQHR5cGUgRE9NRWxlbWVudAotICAgIEBkZWZhdWx0ICdib2R5JwotICAqLwotICBy
b290RWxlbWVudDogJ2JvZHknLAotCi0gIC8qKgotICAgIFNldHMgdXAgZXZlbnQgbGlzdGVuZXJz
IGZvciBzdGFuZGFyZCBicm93c2VyIGV2ZW50cy4KLQotICAgIFRoaXMgd2lsbCBiZSBjYWxsZWQg
YWZ0ZXIgdGhlIGJyb3dzZXIgc2VuZHMgYSBgRE9NQ29udGVudFJlYWR5YCBldmVudC4gQnkKLSAg
ICBkZWZhdWx0LCBpdCB3aWxsIHNldCB1cCBhbGwgb2YgdGhlIGxpc3RlbmVycyBvbiB0aGUgZG9j
dW1lbnQgYm9keS4gSWYgeW91Ci0gICAgd291bGQgbGlrZSB0byByZWdpc3RlciB0aGUgbGlzdGVu
ZXJzIG9uIGEgZGlmZmVyZW50IGVsZW1lbnQsIHNldCB0aGUgZXZlbnQKLSAgICBkaXNwYXRjaGVy
J3MgYHJvb3RgIHByb3BlcnR5LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0g
ICAgQHBhcmFtIGFkZGVkRXZlbnRzIHtIYXNofQotICAqLwotICBzZXR1cDogZnVuY3Rpb24oYWRk
ZWRFdmVudHMsIHJvb3RFbGVtZW50KSB7Ci0gICAgdmFyIGV2ZW50LCBldmVudHMgPSBnZXQodGhp
cywgJ2V2ZW50cycpOwotCi0gICAgRW1iZXIuJC5leHRlbmQoZXZlbnRzLCBhZGRlZEV2ZW50cyB8
fCB7fSk7Ci0KLQotICAgIGlmICghRW1iZXIuaXNOb25lKHJvb3RFbGVtZW50KSkgewotICAgICAg
c2V0KHRoaXMsICdyb290RWxlbWVudCcsIHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICByb290
RWxlbWVudCA9IEVtYmVyLiQoZ2V0KHRoaXMsICdyb290RWxlbWVudCcpKTsKLQotICAgIEVtYmVy
LmFzc2VydChmbXQoJ1lvdSBjYW5ub3QgdXNlIHRoZSBzYW1lIHJvb3QgZWxlbWVudCAoJUApIG11
bHRpcGxlIHRpbWVzIGluIGFuIEVtYmVyLkFwcGxpY2F0aW9uJywgW3Jvb3RFbGVtZW50LnNlbGVj
dG9yIHx8IHJvb3RFbGVtZW50WzBdLnRhZ05hbWVdKSwgIXJvb3RFbGVtZW50LmlzKCcuZW1iZXIt
YXBwbGljYXRpb24nKSk7Ci0gICAgRW1iZXIuYXNzZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcg
RW1iZXIuQXBwbGljYXRpb24gdXNpbmcgYSByb290IGVsZW1lbnQgdGhhdCBpcyBhIGRlc2NlbmRl
bnQgb2YgYW4gZXhpc3RpbmcgRW1iZXIuQXBwbGljYXRpb24nLCAhcm9vdEVsZW1lbnQuY2xvc2Vz
dCgnLmVtYmVyLWFwcGxpY2F0aW9uJykubGVuZ3RoKTsKLSAgICBFbWJlci5hc3NlcnQoJ1lvdSBj
YW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNhdGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0
aGF0IGlzIGFuIGFuY2VzdG9yIG9mIGFuIGV4aXN0aW5nIEVtYmVyLkFwcGxpY2F0aW9uJywgIXJv
b3RFbGVtZW50LmZpbmQoJy5lbWJlci1hcHBsaWNhdGlvbicpLmxlbmd0aCk7Ci0KLSAgICByb290
RWxlbWVudC5hZGRDbGFzcygnZW1iZXItYXBwbGljYXRpb24nKTsKLQotICAgIEVtYmVyLmFzc2Vy
dCgnVW5hYmxlIHRvIGFkZCAiZW1iZXItYXBwbGljYXRpb24iIGNsYXNzIHRvIHJvb3RFbGVtZW50
LiBNYWtlIHN1cmUgeW91IHNldCByb290RWxlbWVudCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50
IGluIHRoZSBib2R5LicsIHJvb3RFbGVtZW50LmlzKCcuZW1iZXItYXBwbGljYXRpb24nKSk7Ci0K
LSAgICBmb3IgKGV2ZW50IGluIGV2ZW50cykgewotICAgICAgaWYgKGV2ZW50cy5oYXNPd25Qcm9w
ZXJ0eShldmVudCkpIHsKLSAgICAgICAgdGhpcy5zZXR1cEhhbmRsZXIocm9vdEVsZW1lbnQsIGV2
ZW50LCBldmVudHNbZXZlbnRdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
UmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBkb2N1bWVudC4gSWYgdGhlIGdpdmVu
IGV2ZW50IGlzCi0gICAgdHJpZ2dlcmVkLCB0aGUgcHJvdmlkZWQgZXZlbnQgaGFuZGxlciB3aWxs
IGJlIHRyaWdnZXJlZCBvbiB0aGUgdGFyZ2V0IHZpZXcuCi0KLSAgICBJZiB0aGUgdGFyZ2V0IHZp
ZXcgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBldmVudCBoYW5kbGVyLCBvciBpZiB0aGUgaGFuZGxl
cgotICAgIHJldHVybnMgYGZhbHNlYCwgdGhlIHBhcmVudCB2aWV3IHdpbGwgYmUgY2FsbGVkLiBU
aGUgZXZlbnQgd2lsbCBjb250aW51ZSB0bwotICAgIGJ1YmJsZSB0byBlYWNoIHN1Y2Nlc3NpdmUg
cGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0aGUgdG9wLgotCi0gICAgRm9yIGV4YW1wbGUs
IHRvIGhhdmUgdGhlIGBtb3VzZURvd25gIG1ldGhvZCBjYWxsZWQgb24gdGhlIHRhcmdldCB2aWV3
IHdoZW4KLSAgICBhIGBtb3VzZWRvd25gIGV2ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dz
ZXIsIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgc2V0dXBIYW5k
bGVyKCdtb3VzZWRvd24nLCAnbW91c2VEb3duJyk7Ci0gICAgYGBgCi0KLSAgICBAcHJpdmF0ZQot
ICAgIEBtZXRob2Qgc2V0dXBIYW5kbGVyCi0gICAgQHBhcmFtIHtFbGVtZW50fSByb290RWxlbWVu
dAotICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudCB0aGUgYnJvd3Nlci1vcmlnaW5hdGVkIGV2ZW50
IHRvIGxpc3RlbiB0bwotICAgIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2Yg
dGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB2aWV3Ci0gICovCi0gIHNldHVwSGFuZGxlcjogZnVu
Y3Rpb24ocm9vdEVsZW1lbnQsIGV2ZW50LCBldmVudE5hbWUpIHsKLSAgICB2YXIgc2VsZiA9IHRo
aXM7Ci0KLSAgICByb290RWxlbWVudC5vbihldmVudCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcn
LCBmdW5jdGlvbihldnQsIHRyaWdnZXJpbmdNYW5hZ2VyKSB7Ci0gICAgICByZXR1cm4gRW1iZXIu
aGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhhbmRsZVZpZXdFdmVudCgpIHsKLSAgICAgICAgdmFyIHZp
ZXcgPSBFbWJlci5WaWV3LnZpZXdzW3RoaXMuaWRdLAotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1
ZSwgbWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgbWFuYWdlciA9IHNlbGYuX2ZpbmROZWFyZXN0
RXZlbnRNYW5hZ2VyKHZpZXcsZXZlbnROYW1lKTsKLQotICAgICAgICBpZiAobWFuYWdlciAmJiBt
YW5hZ2VyICE9PSB0cmlnZ2VyaW5nTWFuYWdlcikgewotICAgICAgICAgIHJlc3VsdCA9IHNlbGYu
X2Rpc3BhdGNoRXZlbnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcpOwotICAgICAgICB9
IGVsc2UgaWYgKHZpZXcpIHsKLSAgICAgICAgICByZXN1bHQgPSBzZWxmLl9idWJibGVFdmVudCh2
aWV3LGV2dCxldmVudE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV2dC5zdG9w
UHJvcGFnYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
ICB9LCB0aGlzKTsKLSAgICB9KTsKLQotICAgIHJvb3RFbGVtZW50Lm9uKGV2ZW50ICsgJy5lbWJl
cicsICdbZGF0YS1lbWJlci1hY3Rpb25dJywgZnVuY3Rpb24oZXZ0KSB7Ci0gICAgICByZXR1cm4g
RW1iZXIuaGFuZGxlRXJyb3JzKGZ1bmN0aW9uIGhhbmRsZUFjdGlvbkV2ZW50KCkgewotICAgICAg
ICB2YXIgYWN0aW9uSWQgPSBFbWJlci4kKGV2dC5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWVt
YmVyLWFjdGlvbicpLAotICAgICAgICAgICAgYWN0aW9uICAgPSBFbWJlci5IYW5kbGViYXJzLkFj
dGlvbkhlbHBlci5yZWdpc3RlcmVkQWN0aW9uc1thY3Rpb25JZF07Ci0KLSAgICAgICAgLy8gV2Ug
aGF2ZSB0byBjaGVjayBmb3IgYWN0aW9uIGhlcmUgc2luY2UgaW4gc29tZSBjYXNlcywgalF1ZXJ5
IHdpbGwgdHJpZ2dlcgotICAgICAgICAvLyBhbiBldmVudCBvbiBgcmVtb3ZlQ2hpbGRgIChpLmUu
IGZvY3Vzb3V0KSBhZnRlciB3ZSd2ZSBhbHJlYWR5IHRvcm4gZG93biB0aGUKLSAgICAgICAgLy8g
YWN0aW9uIGhhbmRsZXJzIGZvciB0aGUgdmlldy4KLSAgICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rp
b24uZXZlbnROYW1lID09PSBldmVudE5hbWUpIHsKLSAgICAgICAgICByZXR1cm4gYWN0aW9uLmhh
bmRsZXIoZXZ0KTsKLSAgICAgICAgfQotICAgICAgfSwgdGhpcyk7Ci0gICAgfSk7Ci0gIH0sCi0K
LSAgX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyOiBmdW5jdGlvbih2aWV3LCBldmVudE5hbWUpIHsK
LSAgICB2YXIgbWFuYWdlciA9IG51bGw7Ci0KLSAgICB3aGlsZSAodmlldykgewotICAgICAgbWFu
YWdlciA9IGdldCh2aWV3LCAnZXZlbnRNYW5hZ2VyJyk7Ci0gICAgICBpZiAobWFuYWdlciAmJiBt
YW5hZ2VyW2V2ZW50TmFtZV0pIHsgYnJlYWs7IH0KLQotICAgICAgdmlldyA9IGdldCh2aWV3LCAn
cGFyZW50VmlldycpOwotICAgIH0KLQotICAgIHJldHVybiBtYW5hZ2VyOwotICB9LAotCi0gIF9k
aXNwYXRjaEV2ZW50OiBmdW5jdGlvbihvYmplY3QsIGV2dCwgZXZlbnROYW1lLCB2aWV3KSB7Ci0g
ICAgdmFyIHJlc3VsdCA9IHRydWU7Ci0KLSAgICB2YXIgaGFuZGxlciA9IG9iamVjdFtldmVudE5h
bWVdOwotICAgIGlmIChFbWJlci50eXBlT2YoaGFuZGxlcikgPT09ICdmdW5jdGlvbicpIHsKLSAg
ICAgIHJlc3VsdCA9IEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRs
ZXIuY2FsbChvYmplY3QsIGV2dCwgdmlldyk7Ci0gICAgICB9KTsKLSAgICAgIC8vIERvIG5vdCBw
cmV2ZW50RGVmYXVsdCBpbiBldmVudE1hbmFnZXJzLgotICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlv
bigpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJlc3VsdCA9IHRoaXMuX2J1YmJsZUV2ZW50
KHZpZXcsIGV2dCwgZXZlbnROYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9
LAotCi0gIF9idWJibGVFdmVudDogZnVuY3Rpb24odmlldywgZXZ0LCBldmVudE5hbWUpIHsKLSAg
ICByZXR1cm4gRW1iZXIucnVuKGZ1bmN0aW9uIGJ1YmJsZUV2ZW50KCkgewotICAgICAgcmV0dXJu
IHZpZXcuaGFuZGxlRXZlbnQoZXZlbnROYW1lLCBldnQpOwotICAgIH0pOwotICB9LAotCi0gIGRl
c3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciByb290RWxlbWVudCA9IGdldCh0aGlzLCAncm9v
dEVsZW1lbnQnKTsKLSAgICBFbWJlci4kKHJvb3RFbGVtZW50KS5vZmYoJy5lbWJlcicsICcqKicp
LnJlbW92ZUNsYXNzKCdlbWJlci1hcHBsaWNhdGlvbicpOwotICAgIHJldHVybiB0aGlzLl9zdXBl
cigpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotLy8gQWRkIGEgbmV3IG5hbWVk
IHF1ZXVlIGZvciByZW5kZXJpbmcgdmlld3MgdGhhdCBoYXBwZW5zCi0vLyBhZnRlciBiaW5kaW5n
cyBoYXZlIHN5bmNlZCwgYW5kIGEgcXVldWUgZm9yIHNjaGVkdWxpbmcgYWN0aW9ucwotLy8gdGhh
dCB0aGF0IHNob3VsZCBvY2N1ciBhZnRlciB2aWV3IHJlbmRlcmluZy4KLXZhciBxdWV1ZXMgPSBF
bWJlci5ydW4ucXVldWVzLAotICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlmaWxscy5pbmRl
eE9mOwotcXVldWVzLnNwbGljZShpbmRleE9mLmNhbGwocXVldWVzLCAnYWN0aW9ucycpKzEsIDAs
ICdyZW5kZXInLCAnYWZ0ZXJSZW5kZXInKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vLyBPcmlnaW5hbCBjbGFzcyBkZWNs
YXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBpbiBydW50aW1lL2xpYi9jb250cm9sbGVycy9jb250
cm9sbGVyLmpzCi0vLyBOT1RFOiBJdCBtYXkgYmUgcG9zc2libGUgd2l0aCBZVUlEb2MgdG8gY29t
YmluZSBkb2NzIGluIHR3byBsb2NhdGlvbnMKLQotLyoqCi1BZGRpdGlvbmFsIG1ldGhvZHMgZm9y
IHRoZSBDb250cm9sbGVyTWl4aW4KLQotQGNsYXNzIENvbnRyb2xsZXJNaXhpbgotQG5hbWVzcGFj
ZSBFbWJlcgotKi8KLUVtYmVyLkNvbnRyb2xsZXJNaXhpbi5yZW9wZW4oewotICB0YXJnZXQ6IG51
bGwsCi0gIG5hbWVzcGFjZTogbnVsbCwKLSAgdmlldzogbnVsbCwKLSAgY29udGFpbmVyOiBudWxs
LAotICBfY2hpbGRDb250YWluZXJzOiBudWxsLAotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAg
IHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0KHRoaXMsICdfY2hpbGRDb250YWluZXJzJywge30pOwot
ICB9LAotCi0gIF9tb2RlbERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ21vZGVsJywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGNvbnRhaW5lcnMgPSBnZXQodGhpcywgJ19jaGlsZENvbnRhaW5lcnMn
KTsKLQotICAgIGZvciAodmFyIHByb3AgaW4gY29udGFpbmVycykgewotICAgICAgaWYgKCFjb250
YWluZXJzLmhhc093blByb3BlcnR5KHByb3ApKSB7IGNvbnRpbnVlOyB9Ci0gICAgICBjb250YWlu
ZXJzW3Byb3BdLmRlc3Ryb3koKTsKLSAgICB9Ci0KLSAgICBzZXQodGhpcywgJ19jaGlsZENvbnRh
aW5lcnMnLCB7fSk7Ci0gIH0pCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLXZhciBzdGF0ZXMgPSB7fTsKLQotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIu
Z2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7Ci12YXIg
YV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7Ci12YXIgYV9hZGRPYmpl
Y3QgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuYWRkT2JqZWN0OwotdmFyIG1ldGEgPSBFbWJlci5t
ZXRhOwotCi12YXIgY2hpbGRWaWV3c1Byb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o
KSB7Ci0gIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywgcmV0ID0gRW1iZXIuQSgp
LCB2aWV3ID0gdGhpczsKLQotICBhX2ZvckVhY2goY2hpbGRWaWV3cywgZnVuY3Rpb24odmlldykg
ewotICAgIHZhciBjdXJyZW50Q2hpbGRWaWV3czsKLSAgICBpZiAodmlldy5pc1ZpcnR1YWwpIHsK
LSAgICAgIGlmIChjdXJyZW50Q2hpbGRWaWV3cyA9IGdldCh2aWV3LCAnY2hpbGRWaWV3cycpKSB7
Ci0gICAgICAgIHJldC5wdXNoT2JqZWN0cyhjdXJyZW50Q2hpbGRWaWV3cyk7Ci0gICAgICB9Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIHJldC5wdXNoKHZpZXcpOwotICAgIH0KLSAgfSk7Ci0KLSAgcmV0
LnJlcGxhY2UgPSBmdW5jdGlvbiAoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkVmlld3MpIHsKLSAg
ICBpZiAodmlldyBpbnN0YW5jZW9mIEVtYmVyLkNvbnRhaW5lclZpZXcpIHsKLSAgICAgIEVtYmVy
LmRlcHJlY2F0ZSgiTWFuaXB1bGF0aW5nIGFuIEVtYmVyLkNvbnRhaW5lclZpZXcgdGhyb3VnaCBp
dHMgY2hpbGRWaWV3cyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBDb250
YWluZXJWaWV3IGluc3RhbmNlIGl0c2VsZiBhcyBhbiBFbWJlci5NdXRhYmxlQXJyYXkuIik7Ci0g
ICAgICByZXR1cm4gdmlldy5yZXBsYWNlKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZFZpZXdzKTsK
LSAgICB9Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJjaGlsZFZpZXdzIGlzIGltbXV0YWJs
ZSIpOwotICB9OwotCi0gIHJldHVybiByZXQ7Ci19KTsKLQotRW1iZXIud2FybigiVGhlIFZJRVdf
UFJFU0VSVkVTX0NPTlRFWFQgZmxhZyBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aGUgZnVuY3Rpb25h
bGl0eSBjYW4gbm8gbG9uZ2VyIGJlIGRpc2FibGVkLiIsIEVtYmVyLkVOVi5WSUVXX1BSRVNFUlZF
U19DT05URVhUICE9PSBmYWxzZSk7Ci0KLS8qKgotICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQgdGVt
cGxhdGVzLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0ZWQKLSAgYnkgdGhlIGJ1
aWxkIHRvb2xzIHNvIHRoYXQgeW91IGNhbiBzdG9yZSB5b3VyIEhhbmRsZWJhcnMgdGVtcGxhdGVz
IGluCi0gIHNlcGFyYXRlIGZpbGVzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIEphdmFTY3JpcHQgYXQg
YnVpbGR0aW1lLgotCi0gIEBwcm9wZXJ0eSBURU1QTEFURVMKLSAgQGZvciBFbWJlcgotICBAdHlw
ZSBIYXNoCi0qLwotRW1iZXIuVEVNUExBVEVTID0ge307Ci0KLS8qKgotICBgRW1iZXIuQ29yZVZp
ZXdgIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgZXhpc3RzIHRvIGdpdmUgdmlldy1saWtlIGJl
aGF2aW9yCi0gIHRvIGJvdGggRW1iZXIncyBtYWluIHZpZXcgY2xhc3MgYEVtYmVyLlZpZXdgIGFu
ZCBvdGhlciBjbGFzc2VzIGxpa2UKLSAgYEVtYmVyLl9TaW1wbGVNZXRhbW9ycGhWaWV3YCB0aGF0
IGRvbid0IG5lZWQgdGhlIGZ1bGx5IGZ1bmN0aW9uYWx0aXkgb2YKLSAgYEVtYmVyLlZpZXdgLgot
Ci0gIFVubGVzcyB5b3UgaGF2ZSBzcGVjaWZpYyBuZWVkcyBmb3IgYENvcmVWaWV3YCwgeW91IHdp
bGwgdXNlIGBFbWJlci5WaWV3YAotICBpbiB5b3VyIGFwcGxpY2F0aW9ucy4KLQotICBAY2xhc3Mg
Q29yZVZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSAg
QHVzZXMgRW1iZXIuRXZlbnRlZAotICBAdXNlcyBFbWJlci5BY3Rpb25IYW5kbGVyCi0qLwotCi1F
bWJlci5Db3JlVmlldyA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCwgRW1iZXIu
QWN0aW9uSGFuZGxlciwgewotICBpc1ZpZXc6IHRydWUsCi0KLSAgc3RhdGVzOiBzdGF0ZXMsCi0K
LSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLnRyYW5z
aXRpb25UbygncHJlUmVuZGVyJyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYgdGhlIHZpZXcgaXMg
Y3VycmVudGx5IGluc2VydGVkIGludG8gdGhlIERPTSBvZiBhIHBhcmVudCB2aWV3LCB0aGlzCi0g
ICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUgcGFyZW50IG9mIHRoZSB2aWV3LgotCi0gICAg
QHByb3BlcnR5IHBhcmVudFZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQg
bnVsbAotICAqLwotICBwYXJlbnRWaWV3OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAg
ICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50VmlldzsKLQotICAgIGlmIChwYXJlbnQgJiYgcGFy
ZW50LmlzVmlydHVhbCkgewotICAgICAgcmV0dXJuIGdldChwYXJlbnQsICdwYXJlbnRWaWV3Jyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotICB9KS5wcm9wZXJ0
eSgnX3BhcmVudFZpZXcnKSwKLQotICBzdGF0ZTogbnVsbCwKLQotICBfcGFyZW50VmlldzogbnVs
bCwKLQotICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgdmlldywgbm90IGluY2x1ZGluZyB2aXJ0dWFs
IHZpZXdzCi0gIGNvbmNyZXRlVmlldzogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAg
aWYgKCF0aGlzLmlzVmlydHVhbCkgeyByZXR1cm4gdGhpczsgfQotICAgIGVsc2UgeyByZXR1cm4g
Z2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7IH0KLSAgfSkucHJvcGVydHkoJ3BhcmVudFZpZXcnKSwK
LQotICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmlldycsCi0KLSAgaW5zdHJ1bWVudERldGFpbHM6
IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICBoYXNoLm9iamVjdCA9IHRoaXMudG9TdHJpbmcoKTsKLSAg
fSwKLQotICAvKioKLSAgICBJbnZva2VkIGJ5IHRoZSB2aWV3IHN5c3RlbSB3aGVuIHRoaXMgdmll
dyBuZWVkcyB0byBwcm9kdWNlIGFuIEhUTUwKLSAgICByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRo
b2Qgd2lsbCBjcmVhdGUgYSBuZXcgcmVuZGVyIGJ1ZmZlciwgaWYgbmVlZGVkLAotICAgIHRoZW4g
YXBwbHkgYW55IGRlZmF1bHQgYXR0cmlidXRlcywgc3VjaCBhcyBjbGFzcyBuYW1lcyBhbmQgdmlz
aWJpbGl0eS4KLSAgICBGaW5hbGx5LCB0aGUgYHJlbmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCwg
d2hpY2ggaXMgcmVzcG9uc2libGUgZm9yCi0gICAgZG9pbmcgdGhlIGJ1bGsgb2YgdGhlIHJlbmRl
cmluZy4KLQotICAgIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Q7
IGluc3RlYWQsIGltcGxlbWVudCB0aGUKLSAgICBgdGVtcGxhdGVgIHByb3BlcnR5LCBvciBpZiB5
b3UgbmVlZCBtb3JlIGNvbnRyb2wsIG92ZXJyaWRlIHRoZSBgcmVuZGVyYAotICAgIG1ldGhvZC4K
LQotICAgIEBtZXRob2QgcmVuZGVyVG9CdWZmZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1
ZmZlcn0gYnVmZmVyIHRoZSByZW5kZXIgYnVmZmVyLiBJZiBubyBidWZmZXIgaXMKLSAgICAgIHBh
c3NlZCwgYSBkZWZhdWx0IGJ1ZmZlciwgdXNpbmcgdGhlIGN1cnJlbnQgdmlldydzIGB0YWdOYW1l
YCwgd2lsbAotICAgICAgYmUgdXNlZC4KLSAgICBAcHJpdmF0ZQotICAqLwotICByZW5kZXJUb0J1
ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKLSAgICB2YXIg
bmFtZSA9ICdyZW5kZXIuJyArIHRoaXMuaW5zdHJ1bWVudE5hbWUsCi0gICAgICAgIGRldGFpbHMg
PSB7fTsKLQotICAgIHRoaXMuaW5zdHJ1bWVudERldGFpbHMoZGV0YWlscyk7Ci0KLSAgICByZXR1
cm4gRW1iZXIuaW5zdHJ1bWVudChuYW1lLCBkZXRhaWxzLCBmdW5jdGlvbiBpbnN0cnVtZW50UmVu
ZGVyVG9CdWZmZXIoKSB7Ci0gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVG9CdWZmZXIocGFyZW50
QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pOwotICAgIH0sIHRoaXMpOwotICB9LAotCi0gIF9yZW5k
ZXJUb0J1ZmZlcjogZnVuY3Rpb24ocGFyZW50QnVmZmVyLCBidWZmZXJPcGVyYXRpb24pIHsKLSAg
ICAvLyBJZiB0aGlzIGlzIHRoZSB0b3AtbW9zdCB2aWV3LCBzdGFydCBhIG5ldyBidWZmZXIuIE90
aGVyd2lzZSwKLSAgICAvLyBjcmVhdGUgYSBuZXcgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBvcmln
aW5hbCB1c2luZyB0aGUKLSAgICAvLyBwcm92aWRlZCBidWZmZXIgb3BlcmF0aW9uIChmb3IgZXhh
bXBsZSwgYGluc2VydEFmdGVyYCB3aWxsCi0gICAgLy8gaW5zZXJ0IGEgbmV3IGJ1ZmZlciBhZnRl
ciB0aGUgInBhcmVudCBidWZmZXIiKS4KLSAgICB2YXIgdGFnTmFtZSA9IHRoaXMudGFnTmFtZTsK
LQotICAgIGlmICh0YWdOYW1lID09PSBudWxsIHx8IHRhZ05hbWUgPT09IHVuZGVmaW5lZCkgewot
ICAgICAgdGFnTmFtZSA9ICdkaXYnOwotICAgIH0KLQotICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1
ZmZlciA9IHBhcmVudEJ1ZmZlciAmJiBwYXJlbnRCdWZmZXIuYmVnaW4odGFnTmFtZSkgfHwgRW1i
ZXIuUmVuZGVyQnVmZmVyKHRhZ05hbWUpOwotICAgIHRoaXMudHJhbnNpdGlvblRvKCdpbkJ1ZmZl
cicsIGZhbHNlKTsKLQotICAgIHRoaXMuYmVmb3JlUmVuZGVyKGJ1ZmZlcik7Ci0gICAgdGhpcy5y
ZW5kZXIoYnVmZmVyKTsKLSAgICB0aGlzLmFmdGVyUmVuZGVyKGJ1ZmZlcik7Ci0KLSAgICByZXR1
cm4gYnVmZmVyOwotICB9LAotCi0gIC8qKgotICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGV2ZW50
IGZpcmluZyBmcm9tIGBFbWJlci5FdmVudGVkYCB0bwotICAgIGFsc28gY2FsbCBtZXRob2RzIHdp
dGggdGhlIGdpdmVuIG5hbWUuCi0KLSAgICBAbWV0aG9kIHRyaWdnZXIKLSAgICBAcGFyYW0gbmFt
ZSB7U3RyaW5nfQotICAgIEBwcml2YXRlCi0gICovCi0gIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUp
IHsKLSAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgIHZhciBtZXRo
b2QgPSB0aGlzW25hbWVdOwotICAgIGlmIChtZXRob2QpIHsKLSAgICAgIHZhciBhcmdzID0gW10s
IGksIGw7Ci0gICAgICBmb3IgKGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkr
KykgewotICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIHJl
dHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotICB9LAotCi0gIGRlcHJlY2F0
ZWRTZW5kSGFuZGxlczogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewotICAgIHJldHVybiAhIXRoaXNb
YWN0aW9uTmFtZV07Ci0gIH0sCi0KLSAgZGVwcmVjYXRlZFNlbmQ6IGZ1bmN0aW9uKGFjdGlvbk5h
bWUpIHsKLSAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKLSAgICBF
bWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAiICsgYWN0aW9uTmFtZSAr
ICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0aW9uIiwgdHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09
ICdmdW5jdGlvbicpOwotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQWN0aW9uIGhhbmRsZXJzIGltcGxl
bWVudGVkIGRpcmVjdGx5IG9uIHZpZXdzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGFjdGlv
biBoYW5kbGVycyBvbiBhbiBgYWN0aW9uc2Agb2JqZWN0ICgnICsgYWN0aW9uTmFtZSArICcgb24g
JyArIHRoaXMgKyAnKScsIGZhbHNlKTsKLSAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMs
IGFyZ3MpOwotICAgIHJldHVybjsKLSAgfSwKLQotICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKLSAg
ICByZXR1cm4gRW1iZXIudHlwZU9mKHRoaXNbbmFtZV0pID09PSAnZnVuY3Rpb24nIHx8IHRoaXMu
X3N1cGVyKG5hbWUpOwotICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHZhciBw
YXJlbnQgPSB0aGlzLl9wYXJlbnRWaWV3OwotCi0gICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJl
dHVybjsgfQotCi0gICAgLy8gZGVzdHJveSB0aGUgZWxlbWVudCAtLSB0aGlzIHdpbGwgYXZvaWQg
ZWFjaCBjaGlsZCB2aWV3IGRlc3Ryb3lpbmcKLSAgICAvLyB0aGUgZWxlbWVudCBvdmVyIGFuZCBv
dmVyIGFnYWluLi4uCi0gICAgaWYgKCF0aGlzLnJlbW92ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJv
eUVsZW1lbnQoKTsgfQotCi0gICAgLy8gcmVtb3ZlIGZyb20gcGFyZW50IGlmIGZvdW5kLiBEb24n
dCBjYWxsIHJlbW92ZUZyb21QYXJlbnQsCi0gICAgLy8gYXMgcmVtb3ZlRnJvbVBhcmVudCB3aWxs
IHRyeSB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbQotICAgIC8vIHRoZSBET00gYWdhaW4uCi0g
ICAgaWYgKHBhcmVudCkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7IH0KLQotICAgIHRoaXMu
dHJhbnNpdGlvblRvKCdkZXN0cm95aW5nJywgZmFsc2UpOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0g
IH0sCi0KLSAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBFbWJlci5LLAotICB0cmlnZ2VyUmVjdXJz
aXZlbHk6IEVtYmVyLkssCi0gIGludm9rZVJlY3Vyc2l2ZWx5OiBFbWJlci5LLAotICB0cmFuc2l0
aW9uVG86IEVtYmVyLkssCi0gIGRlc3Ryb3lFbGVtZW50OiBFbWJlci5LCi19KTsKLQotdmFyIFZp
ZXdDb2xsZWN0aW9uID0gRW1iZXIuX1ZpZXdDb2xsZWN0aW9uID0gZnVuY3Rpb24oaW5pdGlhbFZp
ZXdzKSB7Ci0gIHZhciB2aWV3cyA9IHRoaXMudmlld3MgPSBpbml0aWFsVmlld3MgfHwgW107Ci0g
IHRoaXMubGVuZ3RoID0gdmlld3MubGVuZ3RoOwotfTsKLQotVmlld0NvbGxlY3Rpb24ucHJvdG90
eXBlID0gewotICBsZW5ndGg6IDAsCi0KLSAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnROYW1lKSB7
Ci0gICAgdmFyIHZpZXdzID0gdGhpcy52aWV3cywgdmlldzsKLSAgICBmb3IgKHZhciBpID0gMCwg
bCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgewotICAgICAgdmlldyA9IHZpZXdzW2ldOwot
ICAgICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAg
IH0KLSAgfSwKLQotICB0cmlnZ2VyUmVjdXJzaXZlbHk6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewot
ICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3
cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIHZpZXdzW2ldLnRyaWdnZXJSZWN1cnNpdmVs
eShldmVudE5hbWUpOwotICAgIH0KLSAgfSwKLQotICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rp
b24oZm4pIHsKLSAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzLCB2aWV3OwotCi0gICAgZm9yICh2
YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAgICAgIHZpZXcgPSB2
aWV3c1tpXTsKLSAgICAgIGZuKHZpZXcpOwotICAgIH0KLSAgfSwKLQotICB0cmFuc2l0aW9uVG86
IGZ1bmN0aW9uKHN0YXRlLCBjaGlsZHJlbikgewotICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7
Ci0gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLSAg
ICAgIHZpZXdzW2ldLnRyYW5zaXRpb25UbyhzdGF0ZSwgY2hpbGRyZW4pOwotICAgIH0KLSAgfSwK
LQotICBwdXNoOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxlbmd0aCArPSBhcmd1bWVudHMubGVu
Z3RoOwotICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7Ci0gICAgcmV0dXJuIHZpZXdzLnB1c2gu
YXBwbHkodmlld3MsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlk
eCkgewotICAgIHJldHVybiB0aGlzLnZpZXdzW2lkeF07Ci0gIH0sCi0KLSAgZm9yRWFjaDogZnVu
Y3Rpb24oY2FsbGJhY2spIHsKLSAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzOwotICAgIHJldHVy
biBhX2ZvckVhY2godmlld3MsIGNhbGxiYWNrKTsKLSAgfSwKLQotICBjbGVhcjogZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5sZW5ndGggPSAwOwotICAgIHRoaXMudmlld3MubGVuZ3RoID0gMDsKLSAg
fQotfTsKLQotdmFyIEVNUFRZX0FSUkFZID0gW107Ci0KLS8qKgotICBgRW1iZXIuVmlld2AgaXMg
dGhlIGNsYXNzIGluIEVtYmVyIHJlc3BvbnNpYmxlIGZvciBlbmNhcHN1bGF0aW5nIHRlbXBsYXRl
cyBvZgotICBIVE1MIGNvbnRlbnQsIGNvbWJpbmluZyB0ZW1wbGF0ZXMgd2l0aCBkYXRhIHRvIHJl
bmRlciBhcyBzZWN0aW9ucyBvZiBhIHBhZ2UncwotICBET00sIGFuZCByZWdpc3RlcmluZyBhbmQg
cmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBldmVudHMuCi0KLSAgIyMgSFRNTCBUYWcKLQot
ICBUaGUgZGVmYXVsdCBIVE1MIHRhZyBuYW1lIHVzZWQgZm9yIGEgdmlldydzIERPTSByZXByZXNl
bnRhdGlvbiBpcyBgZGl2YC4gVGhpcwotICBjYW4gYmUgY3VzdG9taXplZCBieSBzZXR0aW5nIHRo
ZSBgdGFnTmFtZWAgcHJvcGVydHkuIFRoZSBmb2xsb3dpbmcgdmlldwotICBjbGFzczoKLQotICBg
YGBqYXZhc2NyaXB0Ci0gIFBhcmFncmFwaFZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
dGFnTmFtZTogJ2VtJwotICB9KTsKLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIGluc3RhbmNl
cyB3aXRoIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0gIDxlbSBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyI+PC9lbT4KLSAgYGBgCi0KLSAgIyMgSFRNTCBgY2xhc3NgIEF0
dHJpYnV0ZQotCi0gIFRoZSBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIG9mIGEgdmlldydzIHRhZyBj
YW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhCi0gIGBjbGFzc05hbWVzYCBwcm9wZXJ0eSB0aGF0IGlz
IHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAnbXkt
b3RoZXItY2xhc3MnXQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0
YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRp
diBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBteS1jbGFzcyBteS1vdGhlci1jbGFzcyI+
PC9kaXY+Ci0gIGBgYAotCi0gIGBjbGFzc2AgYXR0cmlidXRlIHZhbHVlcyBjYW4gYWxzbyBiZSBz
ZXQgYnkgcHJvdmlkaW5nIGEgYGNsYXNzTmFtZUJpbmRpbmdzYAotICBwcm9wZXJ0eSBzZXQgdG8g
YW4gYXJyYXkgb2YgcHJvcGVydGllcyBuYW1lcyBmb3IgdGhlIHZpZXcuIFRoZSByZXR1cm4gdmFs
dWUKLSAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHZh
bHVlIGZvciB0aGUgdmlldydzIGBjbGFzc2AKLSAgYXR0cmlidXRlLiBUaGVzZSBwcm9wZXJ0aWVz
IGNhbiBiZSBjb21wdXRlZCBwcm9wZXJ0aWVzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3Byb3BlcnR5
QScsICdwcm9wZXJ0eUInXSwKLSAgICBwcm9wZXJ0eUE6ICdmcm9tLWEnLAotICAgIHByb3BlcnR5
QjogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAoc29tZUxvZ2ljKSB7IHJldHVybiAnZnJvbS1iJzsg
fQotICAgIH0ucHJvcGVydHkoKQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmll
dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwK
LSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBmcm9tLWEgZnJvbS1iIj48L2Rp
dj4KLSAgYGBgCi0KLSAgSWYgdGhlIHZhbHVlIG9mIGEgY2xhc3MgbmFtZSBiaW5kaW5nIHJldHVy
bnMgYSBib29sZWFuIHRoZSBwcm9wZXJ0eSBuYW1lCi0gIGl0c2VsZiB3aWxsIGJlIHVzZWQgYXMg
dGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIFRoZSBjbGFzcyBuYW1lCi0g
IHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRg
LgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAg
IGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2hvdmVyZWQnXSwKLSAgICBob3ZlcmVkOiB0cnVlCi0gIH0p
OwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwg
cmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNz
PSJlbWJlci12aWV3IGhvdmVyZWQiPjwvZGl2PgotICBgYGAKLQotICBXaGVuIHVzaW5nIGJvb2xl
YW4gY2xhc3MgbmFtZSBiaW5kaW5ncyB5b3UgY2FuIHN1cHBseSBhIHN0cmluZyB2YWx1ZSBvdGhl
cgotICB0aGFuIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB1c2UgYXMgdGhlIGBjbGFzc2AgSFRNTCBh
dHRyaWJ1dGUgYnkgYXBwZW5kaW5nIHRoZQotICBwcmVmZXJyZWQgdmFsdWUgYWZ0ZXIgYSAiOiIg
Y2hhcmFjdGVyIHdoZW4gZGVmaW5pbmcgdGhlIGJpbmRpbmc6Ci0KLSAgYGBgamF2YXNjcmlwdAot
ICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn
YXdlc29tZTpzby12ZXJ5LWNvb2wnXSwKLSAgICBhd2Vzb21lOiB0cnVlCi0gIH0pOwotICBgYGAK
LQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50
YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12
aWV3IHNvLXZlcnktY29vbCI+PC9kaXY+Ci0gIGBgYAotCi0gIEJvb2xlYW4gdmFsdWUgY2xhc3Mg
bmFtZSBiaW5kaW5ncyB3aG9zZSBwcm9wZXJ0eSBuYW1lcyBhcmUgaW4gYQotICBjYW1lbENhc2Ut
c3R5bGUgZm9ybWF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgZGFzaGVyaXplZCBmb3JtYXQ6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xh
c3NOYW1lQmluZGluZ3M6IFsnaXNVcmdlbnQnXSwKLSAgICBpc1VyZ2VudDogdHJ1ZQotICB9KTsK
LSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJl
cHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0i
ZW1iZXItdmlldyBpcy11cmdlbnQiPjwvZGl2PgotICBgYGAKLQotICBDbGFzcyBuYW1lIGJpbmRp
bmdzIGNhbiBhbHNvIHJlZmVyIHRvIG9iamVjdCB2YWx1ZXMgdGhhdCBhcmUgZm91bmQgYnkKLSAg
dHJhdmVyc2luZyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHZpZXcgaXRzZWxmOgotCi0gIGBgYGph
dmFzY3JpcHQKLSAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJp
bmRpbmdzOiBbJ21lc3NhZ2VzLmVtcHR5J10KLSAgICBtZXNzYWdlczogRW1iZXIuT2JqZWN0LmNy
ZWF0ZSh7Ci0gICAgICBlbXB0eTogdHJ1ZQotICAgIH0pCi0gIH0pOwotICBgYGAKLQotICBXaWxs
IHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6
Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGVtcHR5
Ij48L2Rpdj4KLSAgYGBgCi0KLSAgSWYgeW91IHdhbnQgdG8gYWRkIGEgY2xhc3MgbmFtZSBmb3Ig
YSBwcm9wZXJ0eSB3aGljaCBldmFsdWF0ZXMgdG8gdHJ1ZSBhbmQKLSAgYW5kIGEgZGlmZmVyZW50
IGNsYXNzIG5hbWUgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCB5b3UgY2FuIHBhc3MgYSBiaW5k
aW5nCi0gIGxpa2UgdGhpczoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIC8vIEFwcGxpZXMgJ2VuYWJs
ZWQnIGNsYXNzIHdoZW4gaXNFbmFibGVkIGlzIHRydWUgYW5kICdkaXNhYmxlZCcgd2hlbiBpc0Vu
YWJsZWQgaXMgZmFsc2UKLSAgRW1iZXIuVmlldy5leHRlbmQoewotICAgIGNsYXNzTmFtZUJpbmRp
bmdzOiBbJ2lzRW5hYmxlZDplbmFibGVkOmRpc2FibGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUK
LSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4g
SFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIg
Y2xhc3M9ImVtYmVyLXZpZXcgZW5hYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFdoZW4gaXNFbmFi
bGVkIGlzIGBmYWxzZWAsIHRoZSByZXN1bHRpbmcgSFRNTCByZXByZW5zZW50YXRpb24gbG9va3Mg
bGlrZQotICB0aGlzOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1i
ZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFRoaXMgc3ludGF4IG9mZmVycyB0
aGUgY29udmVuaWVuY2UgdG8gYWRkIGEgY2xhc3MgaWYgYSBwcm9wZXJ0eSBpcyBgZmFsc2VgOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgLy8gQXBwbGllcyBubyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBp
cyB0cnVlIGFuZCBjbGFzcyAnZGlzYWJsZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCi0gIEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0VuYWJsZWQ6OmRp
c2FibGVkJ10KLSAgICBpc0VuYWJsZWQ6IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQot
ICBgYGBodG1sCi0gIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPjwvZGl2Pgot
ICBgYGAKLQotICBXaGVuIHRoZSBgaXNFbmFibGVkYCBwcm9wZXJ0eSBvbiB0aGUgdmlldyBpcyBz
ZXQgdG8gYGZhbHNlYCwgaXQgd2lsbCByZXN1bHQKLSAgaW4gdmlldyBpbnN0YW5jZXMgd2l0aCBh
biBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+PC9kaXY+Ci0gIGBgYAotCi0gIFVwZGF0ZXMg
dG8gdGhlIHRoZSB2YWx1ZSBvZiBhIGNsYXNzIG5hbWUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBh
dXRvbWF0aWMKLSAgdXBkYXRlIG9mIHRoZSAgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBpbiB0aGUg
dmlldydzIHJlbmRlcmVkIEhUTUwKLSAgcmVwcmVzZW50YXRpb24uIElmIHRoZSB2YWx1ZSBiZWNv
bWVzIGBmYWxzZWAgb3IgYHVuZGVmaW5lZGAgdGhlIGNsYXNzIG5hbWUKLSAgd2lsbCBiZSByZW1v
dmVkLgotCi0gIEJvdGggYGNsYXNzTmFtZXNgIGFuZCBgY2xhc3NOYW1lQmluZGluZ3NgIGFyZSBj
b25jYXRlbmF0ZWQgcHJvcGVydGllcy4gU2VlCi0gIFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nl
cy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQotICBpbmZvcm1hdGlv
biBhYm91dCBjb25jYXRlbmF0ZWQgcHJvcGVydGllcy4KLQotICAjIyBIVE1MIEF0dHJpYnV0ZXMK
LQotICBUaGUgSFRNTCBhdHRyaWJ1dGUgc2VjdGlvbiBvZiBhIHZpZXcncyB0YWcgY2FuIGJlIHNl
dCBieSBwcm92aWRpbmcgYW4KLSAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8g
YW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb24gdGhlIHZpZXcuCi0gIFRoZSByZXR1cm4gdmFs
dWUgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSB2
aWV3J3MKLSAgSFRNTCBhc3NvY2lhdGVkIGF0dHJpYnV0ZToKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IEFuY2hvclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2EnLAotICAg
IGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2hyZWYnXSwKLSAgICBocmVmOiAnaHR0cDovL2dvb2dsZS5j
b20nCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRo
IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6Ci0KLSAgYGBgaHRtbAotICA8YSBpZD0iZW1iZXIx
IiBjbGFzcz0iZW1iZXItdmlldyIgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20iPjwvYT4KLSAgYGBg
Ci0KLSAgSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhbiBgYXR0cmlidXRlQmluZGluZ3NgIG1vbml0
b3JlZCBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4KLSAgdGhlIHByb3BlcnR5IHdpbGwgZm9sbG93IEhU
TUwncyBwYXR0ZXJuIG9mIHJlcGVhdGluZyB0aGUgYXR0cmlidXRlJ3MgbmFtZSBhcwotICBpdHMg
dmFsdWU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBNeVRleHRJbnB1dCA9IEVtYmVyLlZpZXcuZXh0
ZW5kKHsKLSAgICB0YWdOYW1lOiAnaW5wdXQnLAotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ2Rp
c2FibGVkJ10sCi0gICAgZGlzYWJsZWQ6IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVz
dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQot
ICBgYGBodG1sCi0gIDxpbnB1dCBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgZGlzYWJs
ZWQ9ImRpc2FibGVkIiAvPgotICBgYGAKLQotICBgYXR0cmlidXRlQmluZGluZ3NgIGNhbiByZWZl
ciB0byBjb21wdXRlZCBwcm9wZXJ0aWVzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgTXlUZXh0SW5w
dXQgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGFnTmFtZTogJ2lucHV0JywKLSAgICBhdHRy
aWJ1dGVCaW5kaW5nczogWydkaXNhYmxlZCddLAotICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsK
LSAgICAgIGlmIChzb21lTG9naWMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfS5wcm9wZXJ0eSgpCi0g
IH0pOwotICBgYGAKLQotICBVcGRhdGVzIHRvIHRoZSB0aGUgcHJvcGVydHkgb2YgYW4gYXR0cmli
dXRlIGJpbmRpbmcgd2lsbCByZXN1bHQgaW4gYXV0b21hdGljCi0gIHVwZGF0ZSBvZiB0aGUgIEhU
TUwgYXR0cmlidXRlIGluIHRoZSB2aWV3J3MgcmVuZGVyZWQgSFRNTCByZXByZXNlbnRhdGlvbi4K
LQotICBgYXR0cmlidXRlQmluZGluZ3NgIGlzIGEgY29uY2F0ZW5hdGVkIHByb3BlcnR5LiBTZWUg
W0VtYmVyLk9iamVjdF0oL2FwaS9jbGFzc2VzL0VtYmVyLk9iamVjdC5odG1sKQotICBkb2N1bWVu
dGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVz
LgotCi0gICMjIFRlbXBsYXRlcwotCi0gIFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJl
bmRlcmVkIHJlcHJlc2VudGF0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IGl0cwotICB0ZW1wbGF0ZS4g
VGVtcGxhdGVzIGNhbiBiZSBhbnkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFuIG9wdGlvbmFsIGNv
bnRleHQKLSAgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9mIEhUTUwgdGhhdCB3aWxs
IGJlIGluc2VydGVkIHdpdGhpbiB0aGUKLSAgdmlldydzIHRhZy4gTW9zdCB0eXBpY2FsbHkgaW4g
RW1iZXIgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgY29tcGlsZWQKLSAgYEVtYmVyLkhhbmRsZWJh
cnNgIHRlbXBsYXRlLgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4
dGVuZCh7Ci0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSBhbSB0aGUg
dGVtcGxhdGUnKQotICB9KTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5j
ZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSBhbSB0aGUgdGVtcGxhdGU8L2Rpdj4KLSAg
YGBgCi0KLSAgV2l0aGluIGFuIEVtYmVyIGFwcGxpY2F0aW9uIGlzIG1vcmUgY29tbW9uIHRvIGRl
ZmluZSBhIEhhbmRsZWJhcnMgdGVtcGxhdGVzIGFzCi0gIHBhcnQgb2YgYSBwYWdlOgotCi0gIGBg
YGh0bWwKLSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gtaGFuZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1u
YW1lPSdzb21lLXRlbXBsYXRlJz4KLSAgICBIZWxsbwotICA8L3NjcmlwdD4KLSAgYGBgCi0KLSAg
QW5kIGFzc29jaWF0ZSBpdCBieSBuYW1lIHVzaW5nIGEgdmlldydzIGB0ZW1wbGF0ZU5hbWVgIHBy
b3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7
Ci0gICAgdGVtcGxhdGVOYW1lOiAnc29tZS10ZW1wbGF0ZScKLSAgfSk7Ci0gIGBgYAotCi0gIElm
IHlvdSBoYXZlIG5lc3RlZCByZXNvdXJjZXMsIHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxs
IGxvb2sgbGlrZSB0aGlzOgotCi0gIGBgYGh0bWwKLSAgPHNjcmlwdCB0eXBlPSd0ZXh0L3gtaGFu
ZGxlYmFycycgZGF0YS10ZW1wbGF0ZS1uYW1lPSdwb3N0cy9uZXcnPgotICAgIDxoMT5OZXcgUG9z
dDwvaDE+Ci0gIDwvc2NyaXB0PgotICBgYGAKLQotICBBbmQgYHRlbXBsYXRlTmFtZWAgcHJvcGVy
dHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAg
ICB0ZW1wbGF0ZU5hbWU6ICdwb3N0cy9uZXcnCi0gIH0pOwotICBgYGAKLQotICBVc2luZyBhIHZh
bHVlIGZvciBgdGVtcGxhdGVOYW1lYCB0aGF0IGRvZXMgbm90IGhhdmUgYSBIYW5kbGViYXJzIHRl
bXBsYXRlCi0gIHdpdGggYSBtYXRjaGluZyBgZGF0YS10ZW1wbGF0ZS1uYW1lYCBhdHRyaWJ1dGUg
d2lsbCB0aHJvdyBhbiBlcnJvci4KLQotICBGb3Igdmlld3MgY2xhc3NlcyB0aGF0IG1heSBoYXZl
IGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5nLiBhcyB0aGUgYmxvY2sKLSAgcG9ydGlvbiBv
ZiBhIGB7e3ZpZXd9fWAgSGFuZGxlYmFycyBoZWxwZXIgY2FsbCBpbiBhbm90aGVyIHRlbXBsYXRl
IG9yIGluCi0gIGEgc3ViY2xhc3MpLCB5b3UgY2FuIHByb3ZpZGUgYSBgZGVmYXVsdFRlbXBsYXRl
YCBwcm9wZXJ0eSBzZXQgdG8gY29tcGlsZWQKLSAgdGVtcGxhdGUgZnVuY3Rpb24uIElmIGEgdGVt
cGxhdGUgaXMgbm90IGxhdGVyIHByb3ZpZGVkIGZvciB0aGUgdmlldyBpbnN0YW5jZQotICB0aGUg
YGRlZmF1bHRUZW1wbGF0ZWAgdmFsdWUgd2lsbCBiZSB1c2VkOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgZGVmYXVsdFRlbXBsYXRlOiBFbWJl
ci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kgd2FzIHRoZSBkZWZhdWx0JyksCi0gICAgdGVtcGxhdGU6
IG51bGwsCi0gICAgdGVtcGxhdGVOYW1lOiBudWxsCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJl
c3VsdCBpbiBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBg
YGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+SSB3YXMgdGhlIGRl
ZmF1bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYSBgdGVtcGxhdGVgIG9yIGB0ZW1wbGF0ZU5hbWVg
IGlzIHByb3ZpZGVkIGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKLSAgYGRlZmF1bHRUZW1w
bGF0ZWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsK
LSAgICBkZWZhdWx0VGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhl
IGRlZmF1bHQnKQotICB9KTsKLQotICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7Ci0gICAgdGVtcGxh
dGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSSB3YXMgdGhlIHRlbXBsYXRlLCBub3QgZGVm
YXVsdCcpCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhU
TUwgcmVwcmVzZW50YXRpb24gd2hlbiByZW5kZXJlZDoKLQotICBgYGBodG1sCi0gIDxkaXYgaWQ9
ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkkgd2FzIHRoZSB0ZW1wbGF0ZSwgbm90IGRlZmF1
bHQ8L2Rpdj4KLSAgYGBgCi0KLSAgIyMgVmlldyBDb250ZXh0Ci0KLSAgVGhlIGRlZmF1bHQgY29u
dGV4dCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgaXMgdGhlIHZpZXcncyBjb250cm9sbGVyOgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgdGVt
cGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSGVsbG8ge3tleGNpdGVkR3JlZXRpbmd9
fScpCi0gIH0pOwotCi0gIGFDb250cm9sbGVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAg
Zmlyc3ROYW1lOiAnQmFycnknLAotICAgIGV4Y2l0ZWRHcmVldGluZzogZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gdGhpcy5nZXQoImNvbnRlbnQuZmlyc3ROYW1lIikgKyAiISEhIgotICAgIH0u
cHJvcGVydHkoKQotICB9KTsKLQotICBhVmlldyA9IEFWaWV3LmNyZWF0ZSh7Ci0gICAgY29udHJv
bGxlcjogYUNvbnRyb2xsZXIsCi0gIH0pOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiBhbiBI
VE1MIHJlcHJlc2VudGF0aW9uIG9mOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBpZD0iZW1iZXIxIiBj
bGFzcz0iZW1iZXItdmlldyI+SGVsbG8gQmFycnkhISE8L2Rpdj4KLSAgYGBgCi0KLSAgQSBjb250
ZXh0IGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgc3VwcGxpZWQgdGhyb3VnaCB0aGUgdmlldydzIGBj
b250ZXh0YAotICBwcm9wZXJ0eS4gSWYgdGhlIHZpZXcgaGFzIG5laXRoZXIgYGNvbnRleHRgIG5v
ciBgY29udHJvbGxlcmAgcHJvcGVydGllcywgdGhlCi0gIGBwYXJlbnRWaWV3YCdzIGNvbnRleHQg
d2lsbCBiZSB1c2VkLgotCi0gICMjIExheW91dHMKLQotICBWaWV3cyBjYW4gaGF2ZSBhIHNlY29u
ZGFyeSB0ZW1wbGF0ZSB0aGF0IHdyYXBzIHRoZWlyIG1haW4gdGVtcGxhdGUuIExpa2UKLSAgcHJp
bWFyeSB0ZW1wbGF0ZXMsIGxheW91dHMgY2FuIGJlIGFueSBmdW5jdGlvbiB0aGF0ICBhY2NlcHRz
IGFuIG9wdGlvbmFsCi0gIGNvbnRleHQgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgc3RyaW5nIG9m
IEhUTUwgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluc2lkZQotICB2aWV3J3MgdGFnLiBWaWV3cyB3
aG9zZSBIVE1MIGVsZW1lbnQgaXMgc2VsZiBjbG9zaW5nIChlLmcuIGA8aW5wdXQgLz5gKQotICBj
YW5ub3QgaGF2ZSBhIGxheW91dCBhbmQgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCi0K
LSAgTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgYSBsYXlvdXQgd2lsbCBiZSBhIGNvbXBpbGVkIGBF
bWJlci5IYW5kbGViYXJzYAotICB0ZW1wbGF0ZS4KLQotICBBIHZpZXcncyBsYXlvdXQgY2FuIGJl
IHNldCBkaXJlY3RseSB3aXRoIHRoZSBgbGF5b3V0YCBwcm9wZXJ0eSBvciByZWZlcmVuY2UKLSAg
YW4gZXhpc3RpbmcgSGFuZGxlYmFycyB0ZW1wbGF0ZSBieSBuYW1lIHdpdGggdGhlIGBsYXlvdXRO
YW1lYCBwcm9wZXJ0eS4KLQotICBBIHRlbXBsYXRlIHVzZWQgYXMgYSBsYXlvdXQgbXVzdCBjb250
YWluIGEgc2luZ2xlIHVzZSBvZiB0aGUgSGFuZGxlYmFycwotICBge3t5aWVsZH19YCBoZWxwZXIu
IFRoZSBIVE1MIGNvbnRlbnRzIG9mIGEgdmlldydzIHJlbmRlcmVkIGB0ZW1wbGF0ZWAgd2lsbCBi
ZQotICBpbnNlcnRlZCBhdCB0aGlzIGxvY2F0aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQVZp
ZXdXaXRoTGF5b3V0ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGxheW91dDogRW1iZXIuSGFu
ZGxlYmFycy5jb21waWxlKCI8ZGl2IGNsYXNzPSdteS1kZWNvcmF0aXZlLWNsYXNzJz57e3lpZWxk
fX08L2Rpdj4iKQotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkkgZ290
IHdyYXBwZWQiKSwKLSAgfSk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFu
Y2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKLQotICBgYGBodG1sCi0gIDxkaXYg
aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9Im15LWRlY29y
YXRpdmUtY2xhc3MiPgotICAgICAgSSBnb3Qgd3JhcHBlZAotICAgIDwvZGl2PgotICA8L2Rpdj4K
LSAgYGBgCi0KLSAgU2VlIFtFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMueWllbGRdKC9hcGkvY2xh
c3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfeWllbGQpCi0gIGZvciBt
b3JlIGluZm9ybWF0aW9uLgotCi0gICMjIFJlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMKLQot
ICBWaWV3cyBjYW4gcmVzcG9uZCB0byB1c2VyLWluaXRpYXRlZCBldmVudHMgaW4gb25lIG9mIHRo
cmVlIHdheXM6IG1ldGhvZAotICBpbXBsZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5h
Z2VyLCBhbmQgdGhyb3VnaCBge3thY3Rpb259fWAgaGVscGVyIHVzZQotICBpbiB0aGVpciB0ZW1w
bGF0ZSBvciBsYXlvdXQuCi0KLSAgIyMjIE1ldGhvZCBJbXBsZW1lbnRhdGlvbgotCi0gIFZpZXdz
IGNhbiByZXNwb25kIHRvIHVzZXItaW5pdGlhdGVkIGV2ZW50cyBieSBpbXBsZW1lbnRpbmcgYSBt
ZXRob2QgdGhhdAotICBtYXRjaGVzIHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9i
amVjdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUKLSAgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGlj
azogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgIC8vIHdpbGwgYmUgY2FsbGVkIHdoZW4gd2hlbiBh
biBpbnN0YW5jZSdzCi0gICAgICAvLyByZW5kZXJlZCBlbGVtZW50IGlzIGNsaWNrZWQKLSAgICB9
Ci0gIH0pOwotICBgYGAKLQotICAjIyMgRXZlbnQgTWFuYWdlcnMKLQotICBWaWV3cyBjYW4gZGVm
aW5lIGFuIG9iamVjdCBhcyB0aGVpciBgZXZlbnRNYW5hZ2VyYCBwcm9wZXJ0eS4gVGhpcyBvYmpl
Y3QgY2FuCi0gIHRoZW4gaW1wbGVtZW50IG1ldGhvZHMgdGhhdCBtYXRjaCB0aGUgZGVzaXJlZCBl
dmVudCBuYW1lcy4gTWF0Y2hpbmcgZXZlbnRzCi0gIHRoYXQgb2NjdXIgb24gdGhlIHZpZXcncyBy
ZW5kZXJlZCBIVE1MIG9yIHRoZSByZW5kZXJlZCBIVE1MIG9mIGFueSBvZiBpdHMgRE9NCi0gIGRl
c2NlbmRhbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG1ldGhvZC4gQSBgalF1ZXJ5LkV2ZW50YCBvYmpl
Y3Qgd2lsbCBiZSBwYXNzZWQKLSAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBtZXRob2Qg
YW5kIGFuICBgRW1iZXIuVmlld2Agb2JqZWN0IGFzIHRoZQotICBzZWNvbmQuIFRoZSBgRW1iZXIu
Vmlld2Agd2lsbCBiZSB0aGUgdmlldyB3aG9zZSByZW5kZXJlZCBIVE1MIHdhcyBpbnRlcmFjdGVk
Ci0gIHdpdGguIFRoaXMgbWF5IGJlIHRoZSB2aWV3IHdpdGggdGhlIGBldmVudE1hbmFnZXJgIHBy
b3BlcnR5IG9yIG9uZSBvZiBpdHMKLSAgZGVzY2VuZGVudCB2aWV3cy4KLQotICBgYGBqYXZhc2Ny
aXB0Ci0gIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIGV2ZW50TWFuYWdlcjogRW1i
ZXIuT2JqZWN0LmNyZWF0ZSh7Ci0gICAgICBkb3VibGVDbGljazogZnVuY3Rpb24oZXZlbnQsIHZp
ZXcpIHsKLSAgICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNlJ3MK
LSAgICAgICAgLy8gcmVuZGVyZWQgZWxlbWVudCBvciBhbnkgcmVuZGVyaW5nCi0gICAgICAgIC8v
IG9mIHRoaXMgdmlld3MncyBkZXNjZW5kZW50Ci0gICAgICAgIC8vIGVsZW1lbnRzIGlzIGNsaWNr
ZWQKLSAgICAgIH0KLSAgICB9KQotICB9KTsKLSAgYGBgCi0KLSAgQW4gZXZlbnQgZGVmaW5lZCBm
b3IgYW4gZXZlbnQgbWFuYWdlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXZlbnRzIG9mIHRoZQot
ICBzYW1lIG5hbWUgaGFuZGxlZCB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIHZpZXcuCi0KLSAgYGBg
amF2YXNjcmlwdAotICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBtb3VzZUVudGVy
OiBmdW5jdGlvbihldmVudCkgewotICAgICAgLy8gd2lsbCBuZXZlciB0cmlnZ2VyLgotICAgIH0s
Ci0gICAgZXZlbnRNYW5hZ2VyOiBFbWJlci5PYmplY3QuY3JlYXRlKHsKLSAgICAgIG1vdXNlRW50
ZXI6IGZ1bmN0aW9uKGV2ZW50LCB2aWV3KSB7Ci0gICAgICAgIC8vIHRha2VzIHByZWNlZGVuY2Ug
b3ZlciBBVmlldyNtb3VzZUVudGVyCi0gICAgICB9Ci0gICAgfSkKLSAgfSk7Ci0gIGBgYAotCi0g
IFNpbWlsYXJseSBhIHZpZXcncyBldmVudCBtYW5hZ2VyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIGZv
ciBldmVudHMgb2YgYW55IHZpZXdzCi0gIHJlbmRlcmVkIGFzIGEgZGVzY2VuZGVudC4gQSBtZXRo
b2QgbmFtZSB0aGF0IG1hdGNoZXMgYW4gZXZlbnQgbmFtZSB3aWxsIG5vdAotICBiZSBjYWxsZWQg
aWYgdGhlIHZpZXcgaW5zdGFuY2Ugd2FzIHJlbmRlcmVkIGluc2lkZSB0aGUgSFRNTCByZXByZXNl
bnRhdGlvbiBvZgotICBhIHZpZXcgdGhhdCBoYXMgYW4gYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkg
ZGVmaW5lZCB0aGF0IGhhbmRsZXMgZXZlbnRzIG9mIHRoZQotICBuYW1lLiBFdmVudHMgbm90IGhh
bmRsZWQgYnkgdGhlIGV2ZW50IG1hbmFnZXIgd2lsbCBzdGlsbCB0cmlnZ2VyIG1ldGhvZCBjYWxs
cwotICBvbiB0aGUgZGVzY2VuZGVudC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIE91dGVyVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJvdXRlciB7eyN2aWV3IElubmVyVmlld319aW5uZXJ7ey92aWV3fX0gb3V0ZXIiKSwKLSAg
ICBldmVudE1hbmFnZXI6IEVtYmVyLk9iamVjdC5jcmVhdGUoewotICAgICAgbW91c2VFbnRlcjog
ZnVuY3Rpb24oZXZlbnQsIHZpZXcpIHsKLSAgICAgICAgLy8gdmlldyBtaWdodCBiZSBpbnN0YW5j
ZSBvZiBlaXRoZXIKLSAgICAgICAgLy8gT3V0ZXJWaWV3IG9yIElubmVyVmlldyBkZXBlbmRpbmcg
b24KLSAgICAgICAgLy8gd2hlcmUgb24gdGhlIHBhZ2UgdGhlIHVzZXIgaW50ZXJhY3Rpb24gb2Nj
dXJlZAotICAgICAgfQotICAgIH0pCi0gIH0pOwotCi0gIElubmVyVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICBjbGljazogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICAgIC8vIHdpbGwgYmUg
Y2FsbGVkIGlmIHJlbmRlcmVkIGluc2lkZQotICAgICAgLy8gYW4gT3V0ZXJWaWV3IGJlY2F1c2Ug
T3V0ZXJWaWV3J3MKLSAgICAgIC8vIGV2ZW50TWFuYWdlciBkb2Vzbid0IGhhbmRsZSBjbGljayBl
dmVudHMKLSAgICB9LAotICAgIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICAv
LyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpZiByZW5kZXJlZCBpbnNpZGUKLSAgICAgIC8vIGFuIE91
dGVyVmlldy4KLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICAjIyMgSGFuZGxlYmFycyBge3thY3Rp
b259fWAgSGVscGVyCi0KLSAgU2VlIFtIYW5kbGViYXJzLmhlbHBlcnMuYWN0aW9uXSgvYXBpL2Ns
YXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2FjdGlvbikuCi0KLSAg
IyMjIEV2ZW50IE5hbWVzCi0KLSAgQWxsIG9mIHRoZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVz
IGRlc2NyaWJlZCBhYm92ZSByZXNwb25kIHRvIHRoZSBzYW1lIHNldAotICBvZiBldmVudHMuIFRo
ZSBuYW1lcyBvZiB0aGUgYnVpbHQtaW4gZXZlbnRzIGFyZSBsaXN0ZWQgYmVsb3cuIChUaGUgaGFz
aCBvZgotICBidWlsdC1pbiBldmVudHMgZXhpc3RzIGluIGBFbWJlci5FdmVudERpc3BhdGNoZXJg
LikgQWRkaXRpb25hbCwgY3VzdG9tIGV2ZW50cwotICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2lu
ZyBgRW1iZXIuQXBwbGljYXRpb24uY3VzdG9tRXZlbnRzYC4KLQotICBUb3VjaCBldmVudHM6Ci0K
LSAgKiBgdG91Y2hTdGFydGAKLSAgKiBgdG91Y2hNb3ZlYAotICAqIGB0b3VjaEVuZGAKLSAgKiBg
dG91Y2hDYW5jZWxgCi0KLSAgS2V5Ym9hcmQgZXZlbnRzCi0KLSAgKiBga2V5RG93bmAKLSAgKiBg
a2V5VXBgCi0gICogYGtleVByZXNzYAotCi0gIE1vdXNlIGV2ZW50cwotCi0gICogYG1vdXNlRG93
bmAKLSAgKiBgbW91c2VVcGAKLSAgKiBgY29udGV4dE1lbnVgCi0gICogYGNsaWNrYAotICAqIGBk
b3VibGVDbGlja2AKLSAgKiBgbW91c2VNb3ZlYAotICAqIGBmb2N1c0luYAotICAqIGBmb2N1c091
dGAKLSAgKiBgbW91c2VFbnRlcmAKLSAgKiBgbW91c2VMZWF2ZWAKLQotICBGb3JtIGV2ZW50czoK
LQotICAqIGBzdWJtaXRgCi0gICogYGNoYW5nZWAKLSAgKiBgZm9jdXNJbmAKLSAgKiBgZm9jdXNP
dXRgCi0gICogYGlucHV0YAotCi0gIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZlbnRzOgotCi0gICog
YGRyYWdTdGFydGAKLSAgKiBgZHJhZ2AKLSAgKiBgZHJhZ0VudGVyYAotICAqIGBkcmFnTGVhdmVg
Ci0gICogYGRyb3BgCi0gICogYGRyYWdFbmRgCi0KLSAgIyMgSGFuZGxlYmFycyBge3t2aWV3fX1g
IEhlbHBlcgotCi0gIE90aGVyIGBFbWJlci5WaWV3YCBpbnN0YW5jZXMgY2FuIGJlIGluY2x1ZGVk
IGFzIHBhcnQgb2YgYSB2aWV3J3MgdGVtcGxhdGUgYnkKLSAgdXNpbmcgdGhlIGB7e3ZpZXd9fWAg
SGFuZGxlYmFycyBoZWxwZXIuIFNlZSBbRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXddKC9h
cGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfdmlldykKLSAg
Zm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0KLSAgQGNsYXNzIFZpZXcKLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3JlVmlldwotKi8KLUVtYmVyLlZpZXcgPSBFbWJl
ci5Db3JlVmlldy5leHRlbmQoewotCi0gIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6IFsnY2xhc3NO
YW1lcycsICdjbGFzc05hbWVCaW5kaW5ncycsICdhdHRyaWJ1dGVCaW5kaW5ncyddLAotCi0gIC8q
KgotICAgIEBwcm9wZXJ0eSBpc1ZpZXcKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQg
dHJ1ZQotICAgIEBzdGF0aWMKLSAgKi8KLSAgaXNWaWV3OiB0cnVlLAotCi0gIC8vIC4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8g
VEVNUExBVEUgU1VQUE9SVAotICAvLwotCi0gIC8qKgotICAgIFRoZSBuYW1lIG9mIHRoZSB0ZW1w
bGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUgaXMgcHJvdmlkZWQuCi0KLSAgICBCeSBkZWZh
dWx0IGBFbWJlci5WaWV3YCB3aWxsIGxvb2t1cCBhIHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGlu
Ci0gICAgYEVtYmVyLlRFTVBMQVRFU2AgKGEgc2hhcmVkIGdsb2JhbCBvYmplY3QpLgotCi0gICAg
QHByb3BlcnR5IHRlbXBsYXRlTmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51
bGwKLSAgKi8KLSAgdGVtcGxhdGVOYW1lOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSBuYW1lIG9m
IHRoZSBsYXlvdXQgdG8gbG9va3VwIGlmIG5vIGxheW91dCBpcyBwcm92aWRlZC4KLQotICAgIEJ5
IGRlZmF1bHQgYEVtYmVyLlZpZXdgIHdpbGwgbG9va3VwIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5h
bWUgaW4KLSAgICBgRW1iZXIuVEVNUExBVEVTYCAoYSBzaGFyZWQgZ2xvYmFsIG9iamVjdCkuCi0K
LSAgICBAcHJvcGVydHkgbGF5b3V0TmFtZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0
IG51bGwKLSAgKi8KLSAgbGF5b3V0TmFtZTogbnVsbCwKLQotICAvKioKLSAgICBUaGUgdGVtcGxh
dGUgdXNlZCB0byByZW5kZXIgdGhlIHZpZXcuIFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhh
dAotICAgIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMg
YSBzdHJpbmcgb2YgSFRNTCB0aGF0Ci0gICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00g
cmVsYXRpdmUgdG8gaXRzIHBhcmVudCB2aWV3LgotCi0gICAgSW4gZ2VuZXJhbCwgeW91IHNob3Vs
ZCBzZXQgdGhlIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnR5IGluc3RlYWQgb2Ygc2V0dGluZwotICAg
IHRoZSB0ZW1wbGF0ZSB5b3Vyc2VsZi4KLQotICAgIEBwcm9wZXJ0eSB0ZW1wbGF0ZQotICAgIEB0
eXBlIEZ1bmN0aW9uCi0gICovCi0gIHRlbXBsYXRlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgcmV0dXJuIHZhbHVl
OyB9Ci0KLSAgICB2YXIgdGVtcGxhdGVOYW1lID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwK
LSAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0
ZW1wbGF0ZScpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIHRoZSB0ZW1wbGF0
ZU5hbWUgIiArIHRlbXBsYXRlTmFtZSArICIgZm9yICIgKyB0aGlzICsgIiwgYnV0IGl0IGRpZCBu
b3QgZXhpc3QuIiwgIXRlbXBsYXRlTmFtZSB8fCB0ZW1wbGF0ZSk7Ci0KLSAgICByZXR1cm4gdGVt
cGxhdGUgfHwgZ2V0KHRoaXMsICdkZWZhdWx0VGVtcGxhdGUnKTsKLSAgfSkucHJvcGVydHkoJ3Rl
bXBsYXRlTmFtZScpLAotCi0gIC8qKgotICAgIFRoZSBjb250cm9sbGVyIG1hbmFnaW5nIHRoaXMg
dmlldy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgYmUKLSAgICBtYWRlIGF2YWls
YWJsZSBmb3IgdXNlIGJ5IHRoZSB0ZW1wbGF0ZS4KLQotICAgIEBwcm9wZXJ0eSBjb250cm9sbGVy
Ci0gICAgQHR5cGUgT2JqZWN0Ci0gICovCi0gIGNvbnRyb2xsZXI6IEVtYmVyLmNvbXB1dGVkKGZ1
bmN0aW9uKGtleSkgewotICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdfcGFyZW50Vmll
dycpOwotICAgIHJldHVybiBwYXJlbnRWaWV3ID8gZ2V0KHBhcmVudFZpZXcsICdjb250cm9sbGVy
JykgOiBudWxsOwotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKLQotICAvKioKLSAgICBB
IHZpZXcgbWF5IGNvbnRhaW4gYSBsYXlvdXQuIEEgbGF5b3V0IGlzIGEgcmVndWxhciB0ZW1wbGF0
ZSBidXQKLSAgICBzdXBlcnNlZGVzIHRoZSBgdGVtcGxhdGVgIHByb3BlcnR5IGR1cmluZyByZW5k
ZXJpbmcuIEl0IGlzIHRoZQotICAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBsYXlvdXQgdGVtcGxh
dGUgdG8gcmV0cmlldmUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBwcm9wZXJ0eSBmcm9tIHRoZSB2aWV3
IChvciBhbHRlcm5hdGl2ZWx5LCBjYWxsIGBIYW5kbGViYXJzLmhlbHBlcnMueWllbGRgLAotICAg
IGB7e3lpZWxkfX1gKSB0byByZW5kZXIgaXQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0KLSAg
ICBUaGlzIGlzIHVzZWZ1bCBmb3IgYSB2aWV3IHRoYXQgaGFzIGEgc2hhcmVkIHdyYXBwZXIsIGJ1
dCB3aGljaCBkZWxlZ2F0ZXMKLSAgICB0aGUgcmVuZGVyaW5nIG9mIHRoZSBjb250ZW50cyBvZiB0
aGUgd3JhcHBlciB0byB0aGUgYHRlbXBsYXRlYCBwcm9wZXJ0eQotICAgIG9uIGEgc3ViY2xhc3Mu
Ci0KLSAgICBAcHJvcGVydHkgbGF5b3V0Ci0gICAgQHR5cGUgRnVuY3Rpb24KLSAgKi8KLSAgbGF5
b3V0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgbGF5b3V0TmFtZSA9
IGdldCh0aGlzLCAnbGF5b3V0TmFtZScpLAotICAgICAgICBsYXlvdXQgPSB0aGlzLnRlbXBsYXRl
Rm9yTmFtZShsYXlvdXROYW1lLCAnbGF5b3V0Jyk7Ci0KLSAgICBFbWJlci5hc3NlcnQoIllvdSBz
cGVjaWZpZWQgdGhlIGxheW91dE5hbWUgIiArIGxheW91dE5hbWUgKyAiIGZvciAiICsgdGhpcyAr
ICIsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LiIsICFsYXlvdXROYW1lIHx8IGxheW91dCk7Ci0KLSAg
ICByZXR1cm4gbGF5b3V0IHx8IGdldCh0aGlzLCAnZGVmYXVsdExheW91dCcpOwotICB9KS5wcm9w
ZXJ0eSgnbGF5b3V0TmFtZScpLAotCi0gIF95aWVsZDogZnVuY3Rpb24oY29udGV4dCwgb3B0aW9u
cykgewotICAgIHZhciB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGUnKTsKLSAgICBpZiAo
dGVtcGxhdGUpIHsgdGVtcGxhdGUoY29udGV4dCwgb3B0aW9ucyk7IH0KLSAgfSwKLQotICB0ZW1w
bGF0ZUZvck5hbWU6IGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKLSAgICBpZiAoIW5hbWUpIHsgcmV0
dXJuOyB9Ci0gICAgRW1iZXIuYXNzZXJ0KCJ0ZW1wbGF0ZU5hbWVzIGFyZSBub3QgYWxsb3dlZCB0
byBjb250YWluIHBlcmlvZHM6ICIrbmFtZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKLQot
ICAgIC8vIHRoZSBkZWZhdWx0Q29udGFpbmVyIGlzIGRlcHJlY2F0ZWQKLSAgICB2YXIgY29udGFp
bmVyID0gdGhpcy5jb250YWluZXIgfHwgKEVtYmVyLkNvbnRhaW5lciAmJiBFbWJlci5Db250YWlu
ZXIuZGVmYXVsdENvbnRhaW5lcik7Ci0gICAgcmV0dXJuIGNvbnRhaW5lciAmJiBjb250YWluZXIu
bG9va3VwKCd0ZW1wbGF0ZTonICsgbmFtZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIG9iamVj
dCBmcm9tIHdoaWNoIHRlbXBsYXRlcyBzaG91bGQgYWNjZXNzIHByb3BlcnRpZXMuCi0KLSAgICBU
aGlzIG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gZWFjaCB0
aW1lIHRoZSByZW5kZXIKLSAgICBtZXRob2QgaXMgY2FsbGVkLCBidXQgaXQgaXMgdXAgdG8gdGhl
IGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQKLSAgICB0byBkbyB3aXRoIGl0Lgot
Ci0gICAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSB2aWV3J3MgY29udHJvbGxlci4KLQot
ICAgIEBwcm9wZXJ0eSBjb250ZXh0Ci0gICAgQHR5cGUgT2JqZWN0Ci0gICovCi0gIGNvbnRleHQ6
IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKLSAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMikgewotICAgICAgc2V0KHRoaXMsICdfY29udGV4dCcsIHZhbHVlKTsKLSAg
ICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCAn
X2NvbnRleHQnKTsKLSAgICB9Ci0gIH0pLnZvbGF0aWxlKCksCi0KLSAgLyoqCi0gICAgUHJpdmF0
ZSBjb3B5IG9mIHRoZSB2aWV3J3MgdGVtcGxhdGUgY29udGV4dC4gVGhpcyBjYW4gYmUgc2V0IGRp
cmVjdGx5Ci0gICAgYnkgSGFuZGxlYmFycyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG9ic2VydmVy
IHRoYXQgY2F1c2VzIHRoZSB2aWV3Ci0gICAgdG8gYmUgcmUtcmVuZGVyZWQuCi0KLSAgICBUaGUg
Y29udGV4dCBvZiBhIHZpZXcgaXMgbG9va2VkIHVwIGFzIGZvbGxvd3M6Ci0KLSAgICAxLiBTdXBw
bGllZCBjb250ZXh0ICh1c3VhbGx5IGJ5IEhhbmRsZWJhcnMpCi0gICAgMi4gU3BlY2lmaWVkIGNv
bnRyb2xsZXIKLSAgICAzLiBgcGFyZW50Vmlld2AncyBjb250ZXh0IChmb3IgYSBjaGlsZCBvZiBh
IENvbnRhaW5lclZpZXcpCi0KLSAgICBUaGUgY29kZSBpbiBIYW5kbGViYXJzIHRoYXQgb3ZlcnJp
ZGVzIHRoZSBgX2NvbnRleHRgIHByb3BlcnR5IGZpcnN0Ci0gICAgY2hlY2tzIHRvIHNlZSB3aGV0
aGVyIHRoZSB2aWV3IGhhcyBhIHNwZWNpZmllZCBjb250cm9sbGVyLiBUaGlzIGlzCi0gICAgc29t
ZXRoaW5nIG9mIGEgaGFjayBhbmQgc2hvdWxkIGJlIHJldmlzaXRlZC4KLQotICAgIEBwcm9wZXJ0
eSBfY29udGV4dAotICAgIEBwcml2YXRlCi0gICovCi0gIF9jb250ZXh0OiBFbWJlci5jb21wdXRl
ZChmdW5jdGlvbihrZXkpIHsKLSAgICB2YXIgcGFyZW50VmlldywgY29udHJvbGxlcjsKLQotICAg
IGlmIChjb250cm9sbGVyID0gZ2V0KHRoaXMsICdjb250cm9sbGVyJykpIHsKLSAgICAgIHJldHVy
biBjb250cm9sbGVyOwotICAgIH0KLQotICAgIHBhcmVudFZpZXcgPSB0aGlzLl9wYXJlbnRWaWV3
OwotICAgIGlmIChwYXJlbnRWaWV3KSB7Ci0gICAgICByZXR1cm4gZ2V0KHBhcmVudFZpZXcsICdf
Y29udGV4dCcpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9KSwKLQotICAvKioKLSAg
ICBJZiBhIHZhbHVlIHRoYXQgYWZmZWN0cyB0ZW1wbGF0ZSByZW5kZXJpbmcgY2hhbmdlcywgdGhl
IHZpZXcgc2hvdWxkIGJlCi0gICAgcmUtcmVuZGVyZWQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVl
LgotCi0gICAgQG1ldGhvZCBfY29udGV4dERpZENoYW5nZQotICAgIEBwcml2YXRlCi0gICovCi0g
IF9jb250ZXh0RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY29udGV4dCcsIGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMucmVyZW5kZXIoKTsKLSAgfSksCi0KLSAgLyoqCi0gICAgSWYgYGZhbHNlYCwg
dGhlIHZpZXcgd2lsbCBhcHBlYXIgaGlkZGVuIGluIERPTS4KLQotICAgIEBwcm9wZXJ0eSBpc1Zp
c2libGUKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBpc1Zp
c2libGU6IHRydWUsCi0KLSAgLyoqCi0gICAgQXJyYXkgb2YgY2hpbGQgdmlld3MuIFlvdSBzaG91
bGQgbmV2ZXIgZWRpdCB0aGlzIGFycmF5IGRpcmVjdGx5LgotICAgIEluc3RlYWQsIHVzZSBgYXBw
ZW5kQ2hpbGRgIGFuZCBgcmVtb3ZlRnJvbVBhcmVudGAuCi0KLSAgICBAcHJvcGVydHkgY2hpbGRW
aWV3cwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQgW10KLSAgICBAcHJpdmF0ZQotICAq
LwotICBjaGlsZFZpZXdzOiBjaGlsZFZpZXdzUHJvcGVydHksCi0KLSAgX2NoaWxkVmlld3M6IEVN
UFRZX0FSUkFZLAotCi0gIC8vIFdoZW4gaXQncyBhIHZpcnR1YWwgdmlldywgd2UgbmVlZCB0byBu
b3RpZnkgdGhlIHBhcmVudCB0aGF0IHRoZWlyCi0gIC8vIGNoaWxkVmlld3Mgd2lsbCBjaGFuZ2Uu
Ci0gIF9jaGlsZFZpZXdzV2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NoaWxkVmll
d3MnLCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBw
YXJlbnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0gICAgICBpZiAocGFyZW50Vmll
dykgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UocGFyZW50VmlldywgJ2NoaWxkVmlld3MnKTsg
fQotICAgIH0KLSAgfSksCi0KLSAgLy8gV2hlbiBpdCdzIGEgdmlydHVhbCB2aWV3LCB3ZSBuZWVk
IHRvIG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlaXIKLSAgLy8gY2hpbGRWaWV3cyBkaWQgY2hh
bmdlLgotICBfY2hpbGRWaWV3c0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NoaWxkVmlld3Mn
LCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc1ZpcnR1YWwpIHsKLSAgICAgIHZhciBwYXJl
bnRWaWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0gICAgICBpZiAocGFyZW50Vmlldykg
eyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3cycpOyB9Ci0g
ICAgfQotICB9KSwKLQotICAvKioKLSAgICBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhh
dCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQKLSAgICBjbGFzcy4KLQotICAgIEBwcm9w
ZXJ0eSBuZWFyZXN0SW5zdGFuY2VPZgotICAgIEBwYXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNz
IG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIu
VmlldwotICAgIEBkZXByZWNhdGVkCi0gICovCi0gIG5lYXJlc3RJbnN0YW5jZU9mOiBmdW5jdGlv
bihrbGFzcykgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgibmVhcmVzdEluc3RhbmNlT2YgaXMgZGVw
cmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBVc2UgbmVh
cmVzdE9mVHlwZS4iKTsKLSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwot
Ci0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlmICh2aWV3IGluc3RhbmNlb2Yga2xhc3MpIHsg
cmV0dXJuIHZpZXc7IH0KLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQg
aXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkCi0gICAgY2xhc3Mgb3IgbWl4aW4uCi0KLSAg
ICBAcHJvcGVydHkgbmVhcmVzdE9mVHlwZQotICAgIEBwYXJhbSB7Q2xhc3MsTWl4aW59IGtsYXNz
IFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcgaXRzZWxmKSwKLSAgICAgICAg
ICAgb3IgYW4gaW5zdGFuY2Ugb2YgRW1iZXIuTWl4aW4uCi0gICAgQHJldHVybiBFbWJlci5WaWV3
Ci0gICovCi0gIG5lYXJlc3RPZlR5cGU6IGZ1bmN0aW9uKGtsYXNzKSB7Ci0gICAgdmFyIHZpZXcg
PSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAgICAgICAgaXNPZlR5cGUgPSBrbGFzcyBpbnN0
YW5jZW9mIEVtYmVyLk1peGluID8KLSAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2aWV3KSB7
IHJldHVybiBrbGFzcy5kZXRlY3Qodmlldyk7IH0gOgotICAgICAgICAgICAgICAgICAgIGZ1bmN0
aW9uKHZpZXcpIHsgcmV0dXJuIGtsYXNzLmRldGVjdCh2aWV3LmNvbnN0cnVjdG9yKTsgfTsKLQot
ICAgIHdoaWxlICh2aWV3KSB7Ci0gICAgICBpZiAoaXNPZlR5cGUodmlldykpIHsgcmV0dXJuIHZp
ZXc7IH0KLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaGFzIGEgZ2l2
ZW4gcHJvcGVydHkuCi0KLSAgICBAZnVuY3Rpb24gbmVhcmVzdFdpdGhQcm9wZXJ0eQotICAgIEBw
YXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBBIHByb3BlcnR5IG5hbWUKLSAgICBAcmV0dXJuIEVtYmVy
LlZpZXcKLSAgKi8KLSAgbmVhcmVzdFdpdGhQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsK
LSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwotCi0gICAgd2hpbGUgKHZp
ZXcpIHsKLSAgICAgIGlmIChwcm9wZXJ0eSBpbiB2aWV3KSB7IHJldHVybiB2aWV3OyB9Ci0gICAg
ICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIFJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB3aG9zZSBwYXJlbnQgaXMgYW4gaW5zdGFu
Y2Ugb2YKLSAgICBga2xhc3NgLgotCi0gICAgQG1ldGhvZCBuZWFyZXN0Q2hpbGRPZgotICAgIEBw
YXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9yIEVtYmVyLlZpZXcg
aXRzZWxmKQotICAgIEByZXR1cm4gRW1iZXIuVmlldwotICAqLwotICBuZWFyZXN0Q2hpbGRPZjog
ZnVuY3Rpb24oa2xhc3MpIHsKLSAgICB2YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50Vmlldycp
OwotCi0gICAgd2hpbGUgKHZpZXcpIHsKLSAgICAgIGlmIChnZXQodmlldywgJ3BhcmVudFZpZXcn
KSBpbnN0YW5jZW9mIGtsYXNzKSB7IHJldHVybiB2aWV3OyB9Ci0gICAgICB2aWV3ID0gZ2V0KHZp
ZXcsICdwYXJlbnRWaWV3Jyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFdoZW4gdGhlIHBh
cmVudCB2aWV3IGNoYW5nZXMsIHJlY3Vyc2l2ZWx5IGludmFsaWRhdGUgYGNvbnRyb2xsZXJgCi0K
LSAgICBAbWV0aG9kIF9wYXJlbnRWaWV3RGlkQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAg
X3BhcmVudFZpZXdEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdfcGFyZW50VmlldycsIGZ1bmN0
aW9uKCkgewotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICAgIHRo
aXMudHJpZ2dlcigncGFyZW50Vmlld0RpZENoYW5nZScpOwotCi0gICAgaWYgKGdldCh0aGlzLCAn
cGFyZW50Vmlldy5jb250cm9sbGVyJykgJiYgIWdldCh0aGlzLCAnY29udHJvbGxlcicpKSB7Ci0g
ICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCdjb250cm9sbGVyJyk7Ci0gICAgfQotICB9
KSwKLQotICBfY29udHJvbGxlckRpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRyb2xsZXIn
LCBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0K
LSAgICB0aGlzLnJlcmVuZGVyKCk7Ci0KLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rp
b24odmlldykgewotICAgICAgdmlldy5wcm9wZXJ0eURpZENoYW5nZSgnY29udHJvbGxlcicpOwot
ICAgIH0pOwotICB9KSwKLQotICBjbG9uZUtleXdvcmRzOiBmdW5jdGlvbigpIHsKLSAgICB2YXIg
dGVtcGxhdGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgIHZhciBrZXl3
b3JkcyA9IHRlbXBsYXRlRGF0YSA/IEVtYmVyLmNvcHkodGVtcGxhdGVEYXRhLmtleXdvcmRzKSA6
IHt9OwotICAgIHNldChrZXl3b3JkcywgJ3ZpZXcnLCBnZXQodGhpcywgJ2NvbmNyZXRlVmlldycp
KTsKLSAgICBzZXQoa2V5d29yZHMsICdfdmlldycsIHRoaXMpOwotICAgIHNldChrZXl3b3Jkcywg
J2NvbnRyb2xsZXInLCBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSk7Ci0KLSAgICByZXR1cm4ga2V5
d29yZHM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIG9uIHlvdXIgdmlldyB3aGVuIGl0IHNo
b3VsZCBwdXNoIHN0cmluZ3Mgb2YgSFRNTCBpbnRvIGEKLSAgICBgRW1iZXIuUmVuZGVyQnVmZmVy
YC4gTW9zdCB1c2VycyB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGB0ZW1wbGF0ZWAKLSAgICBv
ciBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCi0KLSAg
ICBCeSBkZWZhdWx0LCBgRW1iZXIuVmlld2Agd2lsbCBsb29rIGZvciBhIGZ1bmN0aW9uIGluIHRo
ZSBgdGVtcGxhdGVgCi0gICAgcHJvcGVydHkgYW5kIGludm9rZSBpdCB3aXRoIHRoZSB2YWx1ZSBv
ZiBgY29udGV4dGAuIFRoZSB2YWx1ZSBvZgotICAgIGBjb250ZXh0YCB3aWxsIGJlIHRoZSB2aWV3
J3MgY29udHJvbGxlciB1bmxlc3MgeW91IG92ZXJyaWRlIGl0LgotCi0gICAgQG1ldGhvZCByZW5k
ZXIKLSAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyIFRoZSByZW5kZXIgYnVm
ZmVyCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgLy8gSWYgdGhpcyB2
aWV3IGhhcyBhIGxheW91dCwgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotICAgIC8v
IHRoZSBsYXlvdXQgdG8gcmVuZGVyIHRoZSB2aWV3J3MgdGVtcGxhdGUuIE90aGVyd2lzZSwgcmVu
ZGVyIHRoZSB0ZW1wbGF0ZQotICAgIC8vIGRpcmVjdGx5LgotICAgIHZhciB0ZW1wbGF0ZSA9IGdl
dCh0aGlzLCAnbGF5b3V0JykgfHwgZ2V0KHRoaXMsICd0ZW1wbGF0ZScpOwotCi0gICAgaWYgKHRl
bXBsYXRlKSB7Ci0gICAgICB2YXIgY29udGV4dCA9IGdldCh0aGlzLCAnY29udGV4dCcpOwotICAg
ICAgdmFyIGtleXdvcmRzID0gdGhpcy5jbG9uZUtleXdvcmRzKCk7Ci0gICAgICB2YXIgb3V0cHV0
OwotCi0gICAgICB2YXIgZGF0YSA9IHsKLSAgICAgICAgdmlldzogdGhpcywKLSAgICAgICAgYnVm
ZmVyOiBidWZmZXIsCi0gICAgICAgIGlzUmVuZGVyRGF0YTogdHJ1ZSwKLSAgICAgICAga2V5d29y
ZHM6IGtleXdvcmRzLAotICAgICAgICBpbnNpZGVHcm91cDogZ2V0KHRoaXMsICd0ZW1wbGF0ZURh
dGEuaW5zaWRlR3JvdXAnKQotICAgICAgfTsKLQotICAgICAgLy8gSW52b2tlIHRoZSB0ZW1wbGF0
ZSB3aXRoIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSBjb250ZXh0LCB3aGljaAotICAgICAgLy8gaXMg
dGhlIHZpZXcncyBjb250cm9sbGVyIGJ5IGRlZmF1bHQuIEEgaGFzaCBvZiBkYXRhIGlzIGFsc28g
cGFzc2VkIHRoYXQgcHJvdmlkZXMKLSAgICAgIC8vIHRoZSB0ZW1wbGF0ZSB3aXRoIGFjY2VzcyB0
byB0aGUgdmlldyBhbmQgcmVuZGVyIGJ1ZmZlci4KLQotICAgICAgRW1iZXIuYXNzZXJ0KCd0ZW1w
bGF0ZSBtdXN0IGJlIGEgZnVuY3Rpb24uIERpZCB5b3UgbWVhbiB0byBjYWxsIEVtYmVyLkhhbmRs
ZWJhcnMuY29tcGlsZSgiLi4uIikgb3Igc3BlY2lmeSB0ZW1wbGF0ZU5hbWUgaW5zdGVhZD8nLCB0
eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpOwotICAgICAgLy8gVGhlIHRlbXBsYXRlIHNo
b3VsZCB3cml0ZSBkaXJlY3RseSB0byB0aGUgcmVuZGVyIGJ1ZmZlciBpbnN0ZWFkCi0gICAgICAv
LyBvZiByZXR1cm5pbmcgYSBzdHJpbmcuCi0gICAgICBvdXRwdXQgPSB0ZW1wbGF0ZShjb250ZXh0
LCB7IGRhdGE6IGRhdGEgfSk7Ci0KLSAgICAgIC8vIElmIHRoZSB0ZW1wbGF0ZSByZXR1cm5lZCBh
IHN0cmluZyBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gdGhlIGJ1ZmZlciwKLSAgICAgIC8vIHB1c2gg
dGhlIHN0cmluZyBvbnRvIHRoZSBidWZmZXIuCi0gICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmlu
ZWQpIHsgYnVmZmVyLnB1c2gob3V0cHV0KTsgfQotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBS
ZW5kZXJzIHRoZSB2aWV3IGFnYWluLiBUaGlzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHdoZXRo
ZXIgdGhlCi0gICAgdmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0aGUgdmll
dyBpcyBpbiB0aGUgRE9NLCB0aGUKLSAgICByZW5kZXJpbmcgcHJvY2VzcyB3aWxsIGJlIGRlZmVy
cmVkIHRvIGdpdmUgYmluZGluZ3MgYSBjaGFuY2UKLSAgICB0byBzeW5jaHJvbml6ZS4KLQotICAg
IElmIGNoaWxkcmVuIHdlcmUgYWRkZWQgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2VzcyB1c2lu
ZyBgYXBwZW5kQ2hpbGRgLAotICAgIGByZXJlbmRlcmAgd2lsbCByZW1vdmUgdGhlbSwgYmVjYXVz
ZSB0aGV5IHdpbGwgYmUgYWRkZWQgYWdhaW4KLSAgICBpZiBuZWVkZWQgYnkgdGhlIG5leHQgYHJl
bmRlcmAuCi0KLSAgICBJbiBnZW5lcmFsLCBpZiB0aGUgZGlzcGxheSBvZiB5b3VyIHZpZXcgY2hh
bmdlcywgeW91IHNob3VsZCBtb2RpZnkKLSAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5z
dGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgotICAgIGJlIHNs
b3cuCi0KLSAgICBAbWV0aG9kIHJlcmVuZGVyCi0gICovCi0gIHJlcmVuZGVyOiBmdW5jdGlvbigp
IHsKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVyZW5kZXIodGhpcyk7Ci0gIH0sCi0K
LSAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGVuZ3RoQmVm
b3JlID0gdGhpcy5sZW5ndGhCZWZvcmVSZW5kZXIsCi0gICAgICAgIGxlbmd0aEFmdGVyICA9IHRo
aXMubGVuZ3RoQWZ0ZXJSZW5kZXI7Ci0KLSAgICAvLyBJZiB0aGVyZSB3ZXJlIGNoaWxkIHZpZXdz
IGNyZWF0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gcmVuZGVyKCksCi0gICAgLy8gcmVtb3Zl
IHRoZW0gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgcmUtY3JlYXRlZCB3
aGVuCi0gICAgLy8gd2UgcmUtcmVuZGVyLgotCi0gICAgLy8gVklFVy1UT0RPOiBVbml0IHRlc3Qg
dGhpcyBwYXRoLgotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKLSAgICBm
b3IgKHZhciBpPWxlbmd0aEFmdGVyLTE7IGk+PWxlbmd0aEJlZm9yZTsgaS0tKSB7Ci0gICAgICBp
ZiAoY2hpbGRWaWV3c1tpXSkgeyBjaGlsZFZpZXdzW2ldLmRlc3Ryb3koKTsgfQotICAgIH0KLSAg
fSwKLQotICAvKioKLSAgICBJdGVyYXRlcyBvdmVyIHRoZSB2aWV3J3MgYGNsYXNzTmFtZUJpbmRp
bmdzYCBhcnJheSwgaW5zZXJ0cyB0aGUgdmFsdWUKLSAgICBvZiB0aGUgc3BlY2lmaWVkIHByb3Bl
cnR5IGludG8gdGhlIGBjbGFzc05hbWVzYCBhcnJheSwgdGhlbiBjcmVhdGVzIGFuCi0gICAgb2Jz
ZXJ2ZXIgdG8gdXBkYXRlIHRoZSB2aWV3J3MgZWxlbWVudCBpZiB0aGUgYm91bmQgcHJvcGVydHkg
ZXZlciBjaGFuZ2VzCi0gICAgaW4gdGhlIGZ1dHVyZS4KLQotICAgIEBtZXRob2QgX2FwcGx5Q2xh
c3NOYW1lQmluZGluZ3MKLSAgICBAcHJpdmF0ZQotICAqLwotICBfYXBwbHlDbGFzc05hbWVCaW5k
aW5nczogZnVuY3Rpb24oY2xhc3NCaW5kaW5ncykgewotICAgIHZhciBjbGFzc05hbWVzID0gdGhp
cy5jbGFzc05hbWVzLAotICAgIGVsZW0sIG5ld0NsYXNzLCBkYXNoZXJpemVkQ2xhc3M7Ci0KLSAg
ICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBjb25maWd1cmVkIGJpbmRpbmdzLiBUaGVzZSB3
aWxsIGJlIGVpdGhlcgotICAgIC8vIHByb3BlcnR5IG5hbWVzICgnaXNVcmdlbnQnKSBvciBwcm9w
ZXJ0eSBwYXRocyByZWxhdGl2ZSB0byB0aGUgdmlldwotICAgIC8vICgnY29udGVudC5pc1VyZ2Vu
dCcpCi0gICAgYV9mb3JFYWNoKGNsYXNzQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLQot
ICAgICAgLy8gVmFyaWFibGUgaW4gd2hpY2ggdGhlIG9sZCBjbGFzcyB2YWx1ZSBpcyBzYXZlZC4g
VGhlIG9ic2VydmVyIGZ1bmN0aW9uCi0gICAgICAvLyBjbG9zZXMgb3ZlciB0aGlzIHZhcmlhYmxl
LCBzbyBpdCBrbm93cyB3aGljaCBzdHJpbmcgdG8gcmVtb3ZlIHdoZW4KLSAgICAgIC8vIHRoZSBw
cm9wZXJ0eSBjaGFuZ2VzLgotICAgICAgdmFyIG9sZENsYXNzOwotICAgICAgLy8gRXh0cmFjdCBq
dXN0IHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gYmluZGluZ3MgbGlrZSAnZm9vOmJhcicKLSAgICAg
IHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoYmluZGluZyk7
Ci0KLSAgICAgIC8vIFNldCB1cCBhbiBvYnNlcnZlciBvbiB0aGUgY29udGV4dC4gSWYgdGhlIHBy
b3BlcnR5IGNoYW5nZXMsIHRvZ2dsZSB0aGUKLSAgICAgIC8vIGNsYXNzIG5hbWUuCi0gICAgICB2
YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHZh
bHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAgICBuZXdDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5n
Rm9yUHJvcGVydHkoYmluZGluZyk7Ci0gICAgICAgIGVsZW0gPSB0aGlzLiQoKTsKLQotICAgICAg
ICAvLyBJZiB3ZSBoYWQgcHJldmlvdXNseSBhZGRlZCBhIGNsYXNzIHRvIHRoZSBlbGVtZW50LCBy
ZW1vdmUgaXQuCi0gICAgICAgIGlmIChvbGRDbGFzcykgewotICAgICAgICAgIGVsZW0ucmVtb3Zl
Q2xhc3Mob2xkQ2xhc3MpOwotICAgICAgICAgIC8vIEFsc28gcmVtb3ZlIGZyb20gY2xhc3NOYW1l
cyBzbyB0aGF0IGlmIHRoZSB2aWV3IGdldHMgcmVyZW5kZXJlZCwKLSAgICAgICAgICAvLyB0aGUg
Y2xhc3MgZG9lc24ndCBnZXQgYWRkZWQgYmFjayB0byB0aGUgRE9NLgotICAgICAgICAgIGNsYXNz
TmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElm
IG5lY2Vzc2FyeSwgYWRkIGEgbmV3IGNsYXNzLiBNYWtlIHN1cmUgd2Uga2VlcCB0cmFjayBvZiBp
dCBzbwotICAgICAgICAvLyBpdCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotICAgICAg
ICBpZiAobmV3Q2xhc3MpIHsKLSAgICAgICAgICBlbGVtLmFkZENsYXNzKG5ld0NsYXNzKTsKLSAg
ICAgICAgICBvbGRDbGFzcyA9IG5ld0NsYXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
IG9sZENsYXNzID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgLy8gR2V0IHRo
ZSBjbGFzcyBuYW1lIGZvciB0aGUgcHJvcGVydHkgYXQgaXRzIGN1cnJlbnQgdmFsdWUKLSAgICAg
IGRhc2hlcml6ZWRDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkoYmluZGluZyk7
Ci0KLSAgICAgIGlmIChkYXNoZXJpemVkQ2xhc3MpIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQg
aXQgZ2V0cyBpbnRvIHRoZSBjbGFzc05hbWVzIGFycmF5Ci0gICAgICAgIC8vIHNvIGl0IGlzIGRp
c3BsYXllZCB3aGVuIHdlIHJlbmRlci4KLSAgICAgICAgYV9hZGRPYmplY3QoY2xhc3NOYW1lcywg
ZGFzaGVyaXplZENsYXNzKTsKLQotICAgICAgICAvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBj
bGFzcyBuYW1lIHNvIHdlIGNhbiByZW1vdmUgaXQKLSAgICAgICAgLy8gaWYgdGhlIG9ic2VydmVy
IGZpcmVzLiBSZW1lbWJlciB0aGF0IHRoaXMgdmFyaWFibGUgaGFzCi0gICAgICAgIC8vIGJlZW4g
Y2xvc2VkIG92ZXIgYnkgdGhlIG9ic2VydmVyLgotICAgICAgICBvbGRDbGFzcyA9IGRhc2hlcml6
ZWRDbGFzczsKLSAgICAgIH0KLQotICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHBh
cnNlZFBhdGgucGF0aCwgb2JzZXJ2ZXIpOwotICAgICAgLy8gUmVtb3ZlIGNsYXNzTmFtZSBzbyB3
aGVuIHRoZSB2aWV3IGlzIHJlcmVuZGVyZWQsCi0gICAgICAvLyB0aGUgY2xhc3NOYW1lIGlzIGFk
ZGVkIGJhc2VkIG9uIGJpbmRpbmcgcmVldmFsdWF0aW9uCi0gICAgICB0aGlzLm9uZSgnd2lsbENs
ZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmIChvbGRDbGFzcykgewotICAgICAg
ICAgIGNsYXNzTmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsKLSAgICAgICAgICBvbGRDbGFz
cyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgfSwgdGhpcyk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdmlldydzIGF0dHJpYnV0ZSBiaW5kaW5n
cywgc2V0cyB1cCBvYnNlcnZlcnMgZm9yIGVhY2gsCi0gICAgdGhlbiBhcHBsaWVzIHRoZSBjdXJy
ZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBwYXNzZWQgcmVuZGVyIGJ1ZmZlci4K
LQotICAgIEBtZXRob2QgX2FwcGx5QXR0cmlidXRlQmluZGluZ3MKLSAgICBAcGFyYW0ge0VtYmVy
LlJlbmRlckJ1ZmZlcn0gYnVmZmVyCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2FwcGx5QXR0cmli
dXRlQmluZGluZ3M6IGZ1bmN0aW9uKGJ1ZmZlciwgYXR0cmlidXRlQmluZGluZ3MpIHsKLSAgICB2
YXIgYXR0cmlidXRlVmFsdWUsIGVsZW07Ci0KLSAgICBhX2ZvckVhY2goYXR0cmlidXRlQmluZGlu
Z3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLSAgICAgIHZhciBzcGxpdCA9IGJpbmRpbmcuc3BsaXQo
JzonKSwKLSAgICAgICAgICBwcm9wZXJ0eSA9IHNwbGl0WzBdLAotICAgICAgICAgIGF0dHJpYnV0
ZU5hbWUgPSBzcGxpdFsxXSB8fCBwcm9wZXJ0eTsKLQotICAgICAgLy8gQ3JlYXRlIGFuIG9ic2Vy
dmVyIHRvIGFkZC9yZW1vdmUvY2hhbmdlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlCi0gICAgICAvLyBK
YXZhU2NyaXB0IHByb3BlcnR5IGNoYW5nZXMuCi0gICAgICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlv
bigpIHsKLSAgICAgICAgZWxlbSA9IHRoaXMuJCgpOwotCi0gICAgICAgIGF0dHJpYnV0ZVZhbHVl
ID0gZ2V0KHRoaXMsIHByb3BlcnR5KTsKLQotICAgICAgICBFbWJlci5WaWV3LmFwcGx5QXR0cmli
dXRlQmluZGluZ3MoZWxlbSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAg
fTsKLQotICAgICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHByb3BlcnR5LCBvYnNlcnZl
cik7Ci0KLSAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCB2YWx1ZSBhbmQgYWRkIGl0IHRv
IHRoZSByZW5kZXIgYnVmZmVyCi0gICAgICAvLyBpZiBuZWNlc3NhcnkuCi0gICAgICBhdHRyaWJ1
dGVWYWx1ZSA9IGdldCh0aGlzLCBwcm9wZXJ0eSk7Ci0gICAgICBFbWJlci5WaWV3LmFwcGx5QXR0
cmlidXRlQmluZGluZ3MoYnVmZmVyLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0g
ICAgfSwgdGhpcyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLCBy
ZXR1cm5zIGEgZGFzaGVyaXplZCB2ZXJzaW9uIG9mIHRoYXQKLSAgICBwcm9wZXJ0eSBuYW1lIGlm
IHRoZSBwcm9wZXJ0eSBldmFsdWF0ZXMgdG8gYSBub24tZmFsc3kgdmFsdWUuCi0KLSAgICBGb3Ig
ZXhhbXBsZSwgaWYgdGhlIHZpZXcgaGFzIHByb3BlcnR5IGBpc1VyZ2VudGAgdGhhdCBldmFsdWF0
ZXMgdG8gdHJ1ZSwKLSAgICBwYXNzaW5nIGBpc1VyZ2VudGAgdG8gdGhpcyBtZXRob2Qgd2lsbCBy
ZXR1cm4gYCJpcy11cmdlbnQiYC4KLQotICAgIEBtZXRob2QgX2NsYXNzU3RyaW5nRm9yUHJvcGVy
dHkKLSAgICBAcGFyYW0gcHJvcGVydHkKLSAgICBAcHJpdmF0ZQotICAqLwotICBfY2xhc3NTdHJp
bmdGb3JQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsKLSAgICB2YXIgcGFyc2VkUGF0aCA9
IEVtYmVyLlZpZXcuX3BhcnNlUHJvcGVydHlQYXRoKHByb3BlcnR5KTsKLSAgICB2YXIgcGF0aCA9
IHBhcnNlZFBhdGgucGF0aDsKLQotICAgIHZhciB2YWwgPSBnZXQodGhpcywgcGF0aCk7Ci0gICAg
aWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAg
ICAgdmFsID0gZ2V0KEVtYmVyLmxvb2t1cCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVt
YmVyLlZpZXcuX2NsYXNzU3RyaW5nRm9yVmFsdWUocGF0aCwgdmFsLCBwYXJzZWRQYXRoLmNsYXNz
TmFtZSwgcGFyc2VkUGF0aC5mYWxzeUNsYXNzTmFtZSk7Ci0gIH0sCi0KLSAgLy8gLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAvLyBF
TEVNRU5UIFNVUFBPUlQKLSAgLy8KLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50IERP
TSBlbGVtZW50IGZvciB0aGUgdmlldy4KLQotICAgIEBwcm9wZXJ0eSBlbGVtZW50Ci0gICAgQHR5
cGUgRE9NRWxlbWVudAotICAqLwotICBlbGVtZW50OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbihr
ZXksIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKLSAgICAgIHJldHVy
biB0aGlzLmN1cnJlbnRTdGF0ZS5zZXRFbGVtZW50KHRoaXMsIHZhbHVlKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmdldEVsZW1lbnQodGhpcyk7Ci0gICAg
fQotICB9KS5wcm9wZXJ0eSgnX3BhcmVudFZpZXcnKSwKLQotICAvKioKLSAgICBSZXR1cm5zIGEg
alF1ZXJ5IG9iamVjdCBmb3IgdGhpcyB2aWV3J3MgZWxlbWVudC4gSWYgeW91IHBhc3MgaW4gYSBz
ZWxlY3RvcgotICAgIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBqUXVlcnkgb2Jq
ZWN0LCB1c2luZyB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgYXMgaXRzIGJ1ZmZlci4KLQotICAg
IEZvciBleGFtcGxlLCBjYWxsaW5nIGB2aWV3LiQoJ2xpJylgIHdpbGwgcmV0dXJuIGEgalF1ZXJ5
IG9iamVjdCBjb250YWluaW5nCi0gICAgYWxsIG9mIHRoZSBgbGlgIGVsZW1lbnRzIGluc2lkZSB0
aGUgRE9NIGVsZW1lbnQgb2YgdGhpcyB2aWV3LgotCi0gICAgQG1ldGhvZCAkCi0gICAgQHBhcmFt
IHtTdHJpbmd9IFtzZWxlY3Rvcl0gYSBqUXVlcnktY29tcGF0aWJsZSBzZWxlY3RvciBzdHJpbmcK
LSAgICBAcmV0dXJuIHtqUXVlcnl9IHRoZSBqUXVlcnkgb2JqZWN0IGZvciB0aGUgRE9NIG5vZGUK
LSAgKi8KLSAgJDogZnVuY3Rpb24oc2VsKSB7Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRl
LiQodGhpcywgc2VsKTsKLSAgfSwKLQotICBtdXRhdGVDaGlsZFZpZXdzOiBmdW5jdGlvbihjYWxs
YmFjaykgewotICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywKLSAgICAgICAg
aWR4ID0gY2hpbGRWaWV3cy5sZW5ndGgsCi0gICAgICAgIHZpZXc7Ci0KLSAgICB3aGlsZSgtLWlk
eCA+PSAwKSB7Ci0gICAgICB2aWV3ID0gY2hpbGRWaWV3c1tpZHhdOwotICAgICAgY2FsbGJhY2so
dGhpcywgdmlldywgaWR4KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBm
b3JFYWNoQ2hpbGRWaWV3OiBmdW5jdGlvbihjYWxsYmFjaykgewotICAgIHZhciBjaGlsZFZpZXdz
ID0gdGhpcy5fY2hpbGRWaWV3czsKLQotICAgIGlmICghY2hpbGRWaWV3cykgeyByZXR1cm4gdGhp
czsgfQotCi0gICAgdmFyIGxlbiA9IGNoaWxkVmlld3MubGVuZ3RoLAotICAgICAgICB2aWV3LCBp
ZHg7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKLSAgICAgIHZpZXcg
PSBjaGlsZFZpZXdzW2lkeF07Ci0gICAgICBjYWxsYmFjayh2aWV3KTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBBcHBlbmRzIHRoZSB2aWV3J3MgZWxlbWVu
dCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50LgotCi0gICAgSWYgdGhlIHZpZXcgZG9l
cyBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIHlldCwgYGNyZWF0ZUVsZW1lbnQoKWAK
LSAgICB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LgotCi0gICAgTm90ZSB0aGF0IHRoaXMg
bWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9NCi0g
ICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRp
bCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlzaGVkIHN5bmNocm9uaXppbmcuCi0KLSAgICBU
aGlzIGlzIG5vdCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gY2Fs
bCBkaXJlY3RseSB3aGVuCi0gICAgYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbi4gWW91IG1pZ2h0
IGNvbnNpZGVyIHVzaW5nIGBFbWJlci5Db250YWluZXJWaWV3YAotICAgIGluc3RlYWQuIElmIHlv
dSBkbyBuZWVkIHRvIHVzZSBgYXBwZW5kVG9gLCBiZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBlbGVt
ZW50Ci0gICAgeW91IGFyZSBwcm92aWRpbmcgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGBFbWJlci5B
cHBsaWNhdGlvbmAgYW5kIGRvZXMgbm90Ci0gICAgaGF2ZSBhbiBhbmNlc3RvciBlbGVtZW50IHRo
YXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVtYmVyIHZpZXcuCi0KLSAgICBAbWV0aG9kIGFwcGVu
ZFRvCi0gICAgQHBhcmFtIHtTdHJpbmd8RE9NRWxlbWVudHxqUXVlcnl9IEEgc2VsZWN0b3IsIGVs
ZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIu
Vmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgYXBwZW5kVG86IGZ1bmN0aW9uKHRhcmdldCkgewotICAg
IC8vIFNjaGVkdWxlIHRoZSBET00gZWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBhcHBlbmRlZCB0
byB0aGUgZ2l2ZW4KLSAgICAvLyBlbGVtZW50IGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2hyb25p
emVkLgotICAgIHRoaXMuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKLSAgICAgIEVt
YmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGFwcGVuZCB0byAoIiArIHRhcmdldCArICIpIGJ1dCB0
aGF0IGlzbid0IGluIHRoZSBET00iLCBFbWJlci4kKHRhcmdldCkubGVuZ3RoID4gMCk7Ci0gICAg
ICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIEVtYmVyLlZp
ZXcuIENvbnNpZGVyIHVzaW5nIEVtYmVyLkNvbnRhaW5lclZpZXcgaW5zdGVhZC4iLCAhRW1iZXIu
JCh0YXJnZXQpLmlzKCcuZW1iZXItdmlldycpICYmICFFbWJlci4kKHRhcmdldCkucGFyZW50cygp
LmlzKCcuZW1iZXItdmlldycpKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVuZFRvKHRhcmdldCk7Ci0g
ICAgfSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXBsYWNlcyB0
aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudCBlbGVtZW50IHdpdGggdGhpcyB2aWV3
J3MKLSAgICBlbGVtZW50LiBJZiB0aGUgdmlldyBkb2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVz
ZW50YXRpb24geWV0LAotICAgIGBjcmVhdGVFbGVtZW50KClgIHdpbGwgYmUgY2FsbGVkIGF1dG9t
YXRpY2FsbHkuCi0KLSAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2QganVzdCBzY2hlZHVsZXMgdGhl
IHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBET00KLSAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFw
cGVuZGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCi0gICAg
ZmluaXNoZWQgc3luY2hyb25pemluZwotCi0gICAgQG1ldGhvZCByZXBsYWNlSW4KLSAgICBAcGFy
YW0ge1N0cmluZ3xET01FbGVtZW50fGpRdWVyeX0gdGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQs
IEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30g
cmVjZWl2ZWQKLSAgKi8KLSAgcmVwbGFjZUluOiBmdW5jdGlvbih0YXJnZXQpIHsKLSAgICBFbWJl
ci5hc3NlcnQoIllvdSB0cmllZCB0byByZXBsYWNlIGluICgiICsgdGFyZ2V0ICsgIikgYnV0IHRo
YXQgaXNuJ3QgaW4gdGhlIERPTSIsIEVtYmVyLiQodGFyZ2V0KS5sZW5ndGggPiAwKTsKLSAgICBF
bWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVwbGFjZSBhbiBleGlzdGluZyBFbWJlci5WaWV3LiBD
b25zaWRlciB1c2luZyBFbWJlci5Db250YWluZXJWaWV3IGluc3RlYWQuIiwgIUVtYmVyLiQodGFy
Z2V0KS5pcygnLmVtYmVyLXZpZXcnKSAmJiAhRW1iZXIuJCh0YXJnZXQpLnBhcmVudHMoKS5pcygn
LmVtYmVyLXZpZXcnKSk7Ci0KLSAgICB0aGlzLl9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24o
KSB7Ci0gICAgICBFbWJlci4kKHRhcmdldCkuZW1wdHkoKTsKLSAgICAgIHRoaXMuJCgpLmFwcGVu
ZFRvKHRhcmdldCk7Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioK
LSAgICBTY2hlZHVsZXMgYSBET00gb3BlcmF0aW9uIHRvIG9jY3VyIGR1cmluZyB0aGUgbmV4dCBy
ZW5kZXIgcGhhc2UuIFRoaXMKLSAgICBlbnN1cmVzIHRoYXQgYWxsIGJpbmRpbmdzIGhhdmUgZmlu
aXNoZWQgc3luY2hyb25pemluZyBiZWZvcmUgdGhlIHZpZXcgaXMKLSAgICByZW5kZXJlZC4KLQot
ICAgIFRvIHVzZSwgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBET00gb3BlcmF0aW9u
LgotCi0gICAgQmVmb3JlIHlvdXIgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGlzIHZpZXcgYW5kIGFs
bCBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUKLSAgICB0aGUgYHdpbGxJbnNlcnRFbGVtZW50YCBl
dmVudC4gQWZ0ZXIgeW91ciBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlzIHZpZXcKLSAgICBhbmQg
YWxsIG9mIGl0cyBjaGlsZCB2aWV3cyB3aWxsIHJlY2VpdmUgdGhlIGBkaWRJbnNlcnRFbGVtZW50
YCBldmVudC4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2aWV3Ll9pbnNlcnRFbGVtZW50TGF0
ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIHRoaXMu
JCgpLmFwcGVuZFRvKCdib2R5Jyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9p
bnNlcnRFbGVtZW50TGF0ZXIKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24g
dGhhdCBpbnNlcnRzIHRoZSBlbGVtZW50IGludG8gdGhlIERPTQotICAgIEBwcml2YXRlCi0gICov
Ci0gIF9pbnNlcnRFbGVtZW50TGF0ZXI6IGZ1bmN0aW9uKGZuKSB7Ci0gICAgdGhpcy5fc2NoZWR1
bGVkSW5zZXJ0ID0gRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgJ19pbnNl
cnRFbGVtZW50JywgZm4pOwotICB9LAotCi0gIF9pbnNlcnRFbGVtZW50OiBmdW5jdGlvbiAoZm4p
IHsKLSAgICB0aGlzLl9zY2hlZHVsZWRJbnNlcnQgPSBudWxsOwotICAgIHRoaXMuY3VycmVudFN0
YXRlLmluc2VydEVsZW1lbnQodGhpcywgZm4pOwotICB9LAotCi0gIC8qKgotICAgIEFwcGVuZHMg
dGhlIHZpZXcncyBlbGVtZW50IHRvIHRoZSBkb2N1bWVudCBib2R5LiBJZiB0aGUgdmlldyBkb2Vz
Ci0gICAgbm90IGhhdmUgYW4gSFRNTCByZXByZXNlbnRhdGlvbiB5ZXQsIGBjcmVhdGVFbGVtZW50
KClgIHdpbGwgYmUgY2FsbGVkCi0gICAgYXV0b21hdGljYWxseS4KLQotICAgIElmIHlvdXIgYXBw
bGljYXRpb24gdXNlcyB0aGUgYHJvb3RFbGVtZW50YCBwcm9wZXJ0eSwgeW91IG11c3QgYXBwZW5k
Ci0gICAgdGhlIHZpZXcgd2l0aGluIHRoYXQgZWxlbWVudC4gUmVuZGVyaW5nIHZpZXdzIG91dHNp
ZGUgb2YgdGhlIGByb290RWxlbWVudGAKLSAgICBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgTm90
ZSB0aGF0IHRoaXMgbWV0aG9kIGp1c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVk
OyB0aGUgRE9NCi0gICAgZWxlbWVudCB3aWxsIG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1l
bnQgYm9keSB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZQotICAgIGZpbmlzaGVkIHN5bmNocm9uaXpp
bmcuCi0KLSAgICBAbWV0aG9kIGFwcGVuZAotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2Vp
dmVyCi0gICovCi0gIGFwcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuYXBwZW5k
VG8oZG9jdW1lbnQuYm9keSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyB0aGUgdmlldydz
IGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB0byB3aGljaCBpdCBpcyBhdHRhY2hlZC4KLQotICAg
IEBtZXRob2QgcmVtb3ZlCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8K
LSAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKLSAgICAvLyBXaGF0IHdlIHNob3VsZCByZWFsbHkgZG8g
aGVyZSBpcyB3YWl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHJ1biBsb29wCi0gICAgLy8gdG8gZGV0
ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlLWFwcGVuZGVkIHRvIGEgZGlmZmVyZW50
Ci0gICAgLy8gZWxlbWVudC4KLSAgICAvLyBJbiB0aGUgaW50ZXJpbSwgd2Ugd2lsbCBqdXN0IHJl
LXJlbmRlciBpZiB0aGF0IGhhcHBlbnMuIEl0IGlzIG1vcmUKLSAgICAvLyBpbXBvcnRhbnQgdGhh
biBlbGVtZW50cyBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgaWYgKCF0aGlzLnJlbW92ZWRG
cm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQoKTsgfQotICAgIHRoaXMuaW52b2tlUmVjdXJz
aXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgaWYgKHZpZXcuY2xlYXJSZW5kZXJlZENoaWxk
cmVuKSB7IHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7IH0KLSAgICB9KTsKLSAgfSwKLQot
ICBlbGVtZW50SWQ6IG51bGwsCi0KLSAgLyoqCi0gICAgQXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhl
IGVsZW1lbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LiBUaGUgZGVmYXVsdAotICAgIGltcGxlbWVu
dGF0aW9uIGxvb2tzIGZvciBhbiBlbGVtZW50IHdpdGggYW4gSUQgb2YgYGVsZW1lbnRJZGAgKG9y
IHRoZQotICAgIHZpZXcncyBndWlkIGlmIGBlbGVtZW50SWRgIGlzIG51bGwpLiBZb3UgY2FuIG92
ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgcHJvdmlkZSB5b3VyIG93biBmb3JtIG9mIGxvb2t1
cC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRpc2NvdmVyIHlvdXIKLSAgICBlbGVtZW50
IHVzaW5nIGEgQ1NTIGNsYXNzIG5hbWUgaW5zdGVhZCBvZiBhbiBJRC4KLQotICAgIEBtZXRob2Qg
ZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQKLSAgICBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVu
dEVsZW1lbnQgVGhlIHBhcmVudCdzIERPTSBlbGVtZW50Ci0gICAgQHJldHVybiB7RE9NRWxlbWVu
dH0gVGhlIGRpc2NvdmVyZWQgZWxlbWVudAotICAqLwotICBmaW5kRWxlbWVudEluUGFyZW50RWxl
bWVudDogZnVuY3Rpb24ocGFyZW50RWxlbSkgewotICAgIHZhciBpZCA9ICIjIiArIHRoaXMuZWxl
bWVudElkOwotICAgIHJldHVybiBFbWJlci4kKGlkKVswXSB8fCBFbWJlci4kKGlkLCBwYXJlbnRF
bGVtKVswXTsKLSAgfSwKLQotICAvKioKLSAgICBDcmVhdGVzIGEgRE9NIHJlcHJlc2VudGF0aW9u
IG9mIHRoZSB2aWV3IGFuZCBhbGwgb2YgaXRzCi0gICAgY2hpbGQgdmlld3MgYnkgcmVjdXJzaXZl
bHkgY2FsbGluZyB0aGUgYHJlbmRlcigpYCBtZXRob2QuCi0KLSAgICBBZnRlciB0aGUgZWxlbWVu
dCBoYXMgYmVlbiBjcmVhdGVkLCBgZGlkSW5zZXJ0RWxlbWVudGAgd2lsbAotICAgIGJlIGNhbGxl
ZCBvbiB0aGlzIHZpZXcgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgICBAbWV0aG9k
IGNyZWF0ZUVsZW1lbnQKLSAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNlaXZlcgotICAqLwot
ICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdlbGVtZW50
JykpIHsgcmV0dXJuIHRoaXM7IH0KLQotICAgIHZhciBidWZmZXIgPSB0aGlzLnJlbmRlclRvQnVm
ZmVyKCk7Ci0gICAgc2V0KHRoaXMsICdlbGVtZW50JywgYnVmZmVyLmVsZW1lbnQoKSk7Ci0KLSAg
ICByZXR1cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiBhIHZpZXcgaXMg
Z29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NLgotCi0gICAgQGV2ZW50IHdp
bGxJbnNlcnRFbGVtZW50Ci0gICovCi0gIHdpbGxJbnNlcnRFbGVtZW50OiBFbWJlci5LLAotCi0g
IC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRoZSB2aWV3IGhhcyBiZWVuIGlu
c2VydGVkIGludG8gdGhlIERPTQotICAgIG9yIGFmdGVyIHRoZSB2aWV3IHdhcyByZS1yZW5kZXJl
ZC4gT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBkbyBhbnkKLSAgICBzZXQgdXAgdGhhdCByZXF1
aXJlcyBhbiBlbGVtZW50IGluIHRoZSBkb2N1bWVudCBib2R5LgotCi0gICAgQGV2ZW50IGRpZElu
c2VydEVsZW1lbnQKLSAgKi8KLSAgZGlkSW5zZXJ0RWxlbWVudDogRW1iZXIuSywKLQotICAvKioK
LSAgICBDYWxsZWQgd2hlbiB0aGUgdmlldyBpcyBhYm91dCB0byByZXJlbmRlciwgYnV0IGJlZm9y
ZSBhbnl0aGluZyBoYXMKLSAgICBiZWVuIHRvcm4gZG93bi4gVGhpcyBpcyBhIGdvb2Qgb3Bwb3J0
dW5pdHkgdG8gdGVhciBkb3duIGFueSBtYW51YWwKLSAgICBvYnNlcnZlcnMgeW91IGhhdmUgaW5z
dGFsbGVkIGJhc2VkIG9uIHRoZSBET00gc3RhdGUKLQotICAgIEBldmVudCB3aWxsQ2xlYXJSZW5k
ZXIKLSAgKi8KLSAgd2lsbENsZWFyUmVuZGVyOiBFbWJlci5LLAotCi0gIC8qKgotICAgIFJ1biB0
aGlzIGNhbGxiYWNrIG9uIHRoZSBjdXJyZW50IHZpZXcgKHVubGVzcyBpbmNsdWRlU2VsZiBpcyBm
YWxzZSkgYW5kIHJlY3Vyc2l2ZWx5IG9uIGNoaWxkIHZpZXdzLgotCi0gICAgQG1ldGhvZCBpbnZv
a2VSZWN1cnNpdmVseQotICAgIEBwYXJhbSBmbiB7RnVuY3Rpb259Ci0gICAgQHBhcmFtIGluY2x1
ZGVTZWxmIHtCb29sZWFufSBJbmNsdWRlcyBpdHNlbGYgaWYgdHJ1ZS4KLSAgICBAcHJpdmF0ZQot
ICAqLwotICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rpb24oZm4sIGluY2x1ZGVTZWxmKSB7Ci0g
ICAgdmFyIGNoaWxkVmlld3MgPSAoaW5jbHVkZVNlbGYgPT09IGZhbHNlKSA/IHRoaXMuX2NoaWxk
Vmlld3MgOiBbdGhpc107Ci0gICAgdmFyIGN1cnJlbnRWaWV3cywgdmlldywgY3VycmVudENoaWxk
Vmlld3M7Ci0KLSAgICB3aGlsZSAoY2hpbGRWaWV3cy5sZW5ndGgpIHsKLSAgICAgIGN1cnJlbnRW
aWV3cyA9IGNoaWxkVmlld3Muc2xpY2UoKTsKLSAgICAgIGNoaWxkVmlld3MgPSBbXTsKLQotICAg
ICAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRWaWV3cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAg
ICAgIHZpZXcgPSBjdXJyZW50Vmlld3NbaV07Ci0gICAgICAgIGN1cnJlbnRDaGlsZFZpZXdzID0g
dmlldy5fY2hpbGRWaWV3cyA/IHZpZXcuX2NoaWxkVmlld3Muc2xpY2UoMCkgOiBudWxsOwotICAg
ICAgICBmbih2aWV3KTsKLSAgICAgICAgaWYgKGN1cnJlbnRDaGlsZFZpZXdzKSB7Ci0gICAgICAg
ICAgY2hpbGRWaWV3cy5wdXNoLmFwcGx5KGNoaWxkVmlld3MsIGN1cnJlbnRDaGlsZFZpZXdzKTsK
LSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSwKLQotICB0cmlnZ2VyUmVjdXJzaXZlbHk6
IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewotICAgIHZhciBjaGlsZFZpZXdzID0gW3RoaXNdLCBjdXJy
ZW50Vmlld3MsIHZpZXcsIGN1cnJlbnRDaGlsZFZpZXdzOwotCi0gICAgd2hpbGUgKGNoaWxkVmll
d3MubGVuZ3RoKSB7Ci0gICAgICBjdXJyZW50Vmlld3MgPSBjaGlsZFZpZXdzLnNsaWNlKCk7Ci0g
ICAgICBjaGlsZFZpZXdzID0gW107Ci0KLSAgICAgIGZvciAodmFyIGk9MCwgbD1jdXJyZW50Vmll
d3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2aWV3ID0gY3VycmVudFZpZXdzW2ldOwot
ICAgICAgICBjdXJyZW50Q2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MgPyB2aWV3Ll9jaGls
ZFZpZXdzLnNsaWNlKDApIDogbnVsbDsKLSAgICAgICAgaWYgKHZpZXcudHJpZ2dlcikgeyB2aWV3
LnRyaWdnZXIoZXZlbnROYW1lKTsgfQotICAgICAgICBpZiAoY3VycmVudENoaWxkVmlld3MpIHsK
LSAgICAgICAgICBjaGlsZFZpZXdzLnB1c2guYXBwbHkoY2hpbGRWaWV3cywgY3VycmVudENoaWxk
Vmlld3MpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0sCi0KLSAgdmlld0hpZXJh
cmNoeUNvbGxlY3Rpb246IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXJyZW50Vmlldywgdmlld0Nv
bGxlY3Rpb24gPSBuZXcgVmlld0NvbGxlY3Rpb24oW3RoaXNdKTsKLQotICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgdmlld0NvbGxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLSAgICAgIGN1cnJlbnRWaWV3
ID0gdmlld0NvbGxlY3Rpb24ub2JqZWN0QXQoaSk7Ci0gICAgICBpZiAoY3VycmVudFZpZXcuX2No
aWxkVmlld3MpIHsKLSAgICAgICAgdmlld0NvbGxlY3Rpb24ucHVzaC5hcHBseSh2aWV3Q29sbGVj
dGlvbiwgY3VycmVudFZpZXcuX2NoaWxkVmlld3MpOwotICAgICAgfQotICAgIH0KLQotICAgIHJl
dHVybiB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQotICAvKioKLSAgICBEZXN0cm95cyBhbnkgZXhp
c3RpbmcgZWxlbWVudCBhbG9uZyB3aXRoIHRoZSBlbGVtZW50IGZvciBhbnkgY2hpbGQgdmlld3MK
LSAgICBhcyB3ZWxsLiBJZiB0aGUgdmlldyBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhIGVsZW1l
bnQsIHRoZW4gdGhpcyBtZXRob2QKLSAgICB3aWxsIGRvIG5vdGhpbmcuCi0KLSAgICBJZiB5b3Ug
aW1wbGVtZW50IGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgb24geW91ciB2aWV3LCB0aGVuIHRoaXMg
bWV0aG9kIHdpbGwKLSAgICBiZSBpbnZva2VkIG9uIHlvdXIgdmlldyBiZWZvcmUgeW91ciBlbGVt
ZW50IGlzIGRlc3Ryb3llZCB0byBnaXZlIHlvdSBhCi0gICAgY2hhbmNlIHRvIGNsZWFuIHVwIGFu
eSBldmVudCBoYW5kbGVycywgZXRjLgotCi0gICAgSWYgeW91IHdyaXRlIGEgYHdpbGxEZXN0cm95
RWxlbWVudCgpYCBoYW5kbGVyLCB5b3UgY2FuIGFzc3VtZSB0aGF0IHlvdXIKLSAgICBgZGlkSW5z
ZXJ0RWxlbWVudCgpYCBoYW5kbGVyIHdhcyBjYWxsZWQgZWFybGllciBmb3IgdGhlIHNhbWUgZWxl
bWVudC4KLQotICAgIFlvdSBzaG91bGQgbm90IGNhbGwgb3Igb3ZlcnJpZGUgdGhpcyBtZXRob2Qg
eW91cnNlbGYsIGJ1dCB5b3UgbWF5Ci0gICAgd2FudCB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGNh
bGxiYWNrcy4KLQotICAgIEBtZXRob2QgZGVzdHJveUVsZW1lbnQKLSAgICBAcmV0dXJuIHtFbWJl
ci5WaWV3fSByZWNlaXZlcgotICAqLwotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmRlc3Ryb3lFbGVtZW50KHRoaXMpOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IG9mIHRoZSB2aWV3IGlzIGdvaW5n
IHRvIGJlIGRlc3Ryb3llZC4gT3ZlcnJpZGUKLSAgICB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFueSB0
ZWFyZG93biB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQsIGxpa2UgcmVtb3ZpbmcKLSAgICBldmVu
dCBsaXN0ZW5lcnMuCi0KLSAgICBAZXZlbnQgd2lsbERlc3Ryb3lFbGVtZW50Ci0gICovCi0gIHdp
bGxEZXN0cm95RWxlbWVudDogRW1iZXIuSywKLQotICAvKioKLSAgICBUcmlnZ2VycyB0aGUgYHdp
bGxEZXN0cm95RWxlbWVudGAgZXZlbnQgKHdoaWNoIGludm9rZXMgdGhlCi0gICAgYHdpbGxEZXN0
cm95RWxlbWVudCgpYCBtZXRob2QgaWYgaXQgZXhpc3RzKSBvbiB0aGlzIHZpZXcgYW5kIGFsbCBj
aGlsZAotICAgIHZpZXdzLgotCi0gICAgQmVmb3JlIHRyaWdnZXJpbmcgYHdpbGxEZXN0cm95RWxl
bWVudGAsIGl0IGZpcnN0IHRyaWdnZXJzIHRoZQotICAgIGB3aWxsQ2xlYXJSZW5kZXJgIGV2ZW50
IHJlY3Vyc2l2ZWx5LgotCi0gICAgQG1ldGhvZCBfbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50Ci0g
ICAgQHByaXZhdGUKLSAgKi8KLSAgX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudDogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9uID0gdGhpcy52aWV3SGllcmFyY2h5Q29sbGVjdGlv
bigpOwotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxDbGVhclJlbmRlcicpOwotICAg
IHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxEZXN0cm95RWxlbWVudCcpOwotICAgIHJldHVy
biB2aWV3Q29sbGVjdGlvbjsKLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGlzIHZpZXcncyBlbGVt
ZW50IGNoYW5nZXMsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGVzIG9mIG91cgotICAg
IGNoaWxkIHZpZXdzIHNvIHRoYXQgd2UgZG8gbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIERPTSBl
bGVtZW50cyB0aGF0IGFyZQotICAgIG5vIGxvbmdlciBuZWVkZWQuCi0KLSAgICBAbWV0aG9kIF9l
bGVtZW50RGlkQ2hhbmdlCi0gICAgQHByaXZhdGUKLSAgKi8KLSAgX2VsZW1lbnREaWRDaGFuZ2U6
IEVtYmVyLm9ic2VydmVyKCdlbGVtZW50JywgZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5mb3JFYWNo
Q2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgIGRlbGV0ZSBtZXRhKHZpZXcpLmNhY2hl
LmVsZW1lbnQ7Ci0gICAgfSk7Ci0gIH0pLAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBw
YXJlbnRWaWV3IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCi0gICAgQGV2ZW50IHBhcmVudFZpZXdE
aWRDaGFuZ2UKLSAgKi8KLSAgcGFyZW50Vmlld0RpZENoYW5nZTogRW1iZXIuSywKLQotICBpbnN0
cnVtZW50TmFtZTogJ3ZpZXcnLAotCi0gIGluc3RydW1lbnREZXRhaWxzOiBmdW5jdGlvbihoYXNo
KSB7Ci0gICAgaGFzaC50ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGVOYW1lJyk7Ci0gICAg
dGhpcy5fc3VwZXIoaGFzaCk7Ci0gIH0sCi0KLSAgX3JlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihw
YXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikgewotICAgIHRoaXMubGVuZ3RoQmVmb3JlUmVu
ZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gICAgdmFyIGJ1ZmZlciA9IHRoaXMuX3N1
cGVyKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKTsKLSAgICB0aGlzLmxlbmd0aEFmdGVy
UmVuZGVyID0gdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwot
ICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uIChidWZmZXIpIHsKLSAg
ICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVuZGVyVG9CdWZmZXJJZk5lZWRlZCh0aGlzLCBi
dWZmZXIpOwotICB9LAotCi0gIGJlZm9yZVJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAg
dGhpcy5hcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcihidWZmZXIpOwotICAgIGJ1ZmZlci5wdXNoT3Bl
bmluZ1RhZygpOwotICB9LAotCi0gIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAg
ICBidWZmZXIucHVzaENsb3NpbmdUYWcoKTsKLSAgfSwKLQotICBhcHBseUF0dHJpYnV0ZXNUb0J1
ZmZlcjogZnVuY3Rpb24oYnVmZmVyKSB7Ci0gICAgLy8gQ3JlYXRlcyBvYnNlcnZlcnMgZm9yIGFs
bCByZWdpc3RlcmVkIGNsYXNzIG5hbWUgYW5kIGF0dHJpYnV0ZSBiaW5kaW5ncywKLSAgICAvLyB0
aGVuIGFkZHMgdGhlbSB0byB0aGUgZWxlbWVudC4KLSAgICB2YXIgY2xhc3NOYW1lQmluZGluZ3Mg
PSBnZXQodGhpcywgJ2NsYXNzTmFtZUJpbmRpbmdzJyk7Ci0gICAgaWYgKGNsYXNzTmFtZUJpbmRp
bmdzLmxlbmd0aCkgewotICAgICAgdGhpcy5fYXBwbHlDbGFzc05hbWVCaW5kaW5ncyhjbGFzc05h
bWVCaW5kaW5ncyk7Ci0gICAgfQotCi0gICAgLy8gUGFzcyB0aGUgcmVuZGVyIGJ1ZmZlciBzbyB0
aGUgbWV0aG9kIGNhbiBhcHBseSBhdHRyaWJ1dGVzIGRpcmVjdGx5LgotICAgIC8vIFRoaXMgaXNu
J3QgbmVlZGVkIGZvciBjbGFzcyBuYW1lIGJpbmRpbmdzIGJlY2F1c2UgdGhleSB1c2UgdGhlCi0g
ICAgLy8gZXhpc3RpbmcgY2xhc3NOYW1lcyBpbmZyYXN0cnVjdHVyZS4KLSAgICB2YXIgYXR0cmli
dXRlQmluZGluZ3MgPSBnZXQodGhpcywgJ2F0dHJpYnV0ZUJpbmRpbmdzJyk7Ci0gICAgaWYgKGF0
dHJpYnV0ZUJpbmRpbmdzLmxlbmd0aCkgewotICAgICAgdGhpcy5fYXBwbHlBdHRyaWJ1dGVCaW5k
aW5ncyhidWZmZXIsIGF0dHJpYnV0ZUJpbmRpbmdzKTsKLSAgICB9Ci0KLSAgICBidWZmZXIuc2V0
Q2xhc3Nlcyh0aGlzLmNsYXNzTmFtZXMpOwotICAgIGJ1ZmZlci5pZCh0aGlzLmVsZW1lbnRJZCk7
Ci0KLSAgICB2YXIgcm9sZSA9IGdldCh0aGlzLCAnYXJpYVJvbGUnKTsKLSAgICBpZiAocm9sZSkg
ewotICAgICAgYnVmZmVyLmF0dHIoJ3JvbGUnLCByb2xlKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0
KHRoaXMsICdpc1Zpc2libGUnKSA9PT0gZmFsc2UpIHsKLSAgICAgIGJ1ZmZlci5zdHlsZSgnZGlz
cGxheScsICdub25lJyk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gU1RBTkRBUkQgUkVO
REVSIFBST1BFUlRJRVMKLSAgLy8KLQotICAvKioKLSAgICBUYWcgbmFtZSBmb3IgdGhlIHZpZXcn
cyBvdXRlciBlbGVtZW50LiBUaGUgdGFnIG5hbWUgaXMgb25seSB1c2VkIHdoZW4gYW4KLSAgICBl
bGVtZW50IGlzIGZpcnN0IGNyZWF0ZWQuIElmIHlvdSBjaGFuZ2UgdGhlIGB0YWdOYW1lYCBmb3Ig
YW4gZWxlbWVudCwgeW91Ci0gICAgbXVzdCBkZXN0cm95IGFuZCByZWNyZWF0ZSB0aGUgdmlldyBl
bGVtZW50LgotCi0gICAgQnkgZGVmYXVsdCwgdGhlIHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBg
PGRpdj5gIHRhZyBmb3Igdmlld3MuCi0KLSAgICBAcHJvcGVydHkgdGFnTmFtZQotICAgIEB0eXBl
IFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLQotICAvLyBXZSBsZWF2ZSB0aGlzIG51
bGwgYnkgZGVmYXVsdCBzbyB3ZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gIC8v
IHRoZSBkZWZhdWx0IGNhc2UgYW5kIGEgdXNlci1zcGVjaWZpZWQgdGFnLgotICB0YWdOYW1lOiBu
dWxsLAotCi0gIC8qKgotICAgIFRoZSBXQUktQVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJl
c2VudGVkIGJ5IHRoaXMgdmlldy4gRm9yIGV4YW1wbGUsIGEKLSAgICBidXR0b24gbWF5IGhhdmUg
YSByb2xlIG9mIHR5cGUgJ2J1dHRvbicsIG9yIGEgcGFuZSBtYXkgaGF2ZSBhIHJvbGUgb2YKLSAg
ICB0eXBlICdhbGVydGRpYWxvZycuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBhc3Npc3RpdmUg
c29mdHdhcmUgdG8gaGVscAotICAgIHZpc3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUg
cmljaCB3ZWIgYXBwbGljYXRpb25zLgotCi0gICAgVGhlIGZ1bGwgbGlzdCBvZiB2YWxpZCBXQUkt
QVJJQSByb2xlcyBpcyBhdmFpbGFibGUgYXQ6Ci0gICAgW2h0dHA6Ly93d3cudzMub3JnL1RSL3dh
aS1hcmlhL3JvbGVzI3JvbGVzX2NhdGVnb3JpemF0aW9uXShodHRwOi8vd3d3LnczLm9yZy9UUi93
YWktYXJpYS9yb2xlcyNyb2xlc19jYXRlZ29yaXphdGlvbikKLQotICAgIEBwcm9wZXJ0eSBhcmlh
Um9sZQotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgYXJpYVJv
bGU6IG51bGwsCi0KLSAgLyoqCi0gICAgU3RhbmRhcmQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5
IHRvIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVudC4gVGhpcwotICAgIHByb3BlcnR5IGF1dG9tYXRp
Y2FsbHkgaW5oZXJpdHMgYW55IGNsYXNzIG5hbWVzIGRlZmluZWQgYnkgdGhlIHZpZXcncwotICAg
IHN1cGVyY2xhc3NlcyBhcyB3ZWxsLgotCi0gICAgQHByb3BlcnR5IGNsYXNzTmFtZXMKLSAgICBA
dHlwZSBBcnJheQotICAgIEBkZWZhdWx0IFsnZW1iZXItdmlldyddCi0gICovCi0gIGNsYXNzTmFt
ZXM6IFsnZW1iZXItdmlldyddLAotCi0gIC8qKgotICAgIEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9m
IHRoZSB2aWV3IHRvIGFwcGx5IGFzIGNsYXNzIG5hbWVzLiBJZiB0aGUgcHJvcGVydHkKLSAgICBp
cyBhIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVlIG9mIHRoYXQgc3RyaW5nIHdpbGwgYmUgYXBwbGll
ZCBhcyBhIGNsYXNzCi0gICAgbmFtZS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICAvLyBBcHBs
aWVzIHRoZSAnaGlnaCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3ByaW9yaXR5J10KLSAgICAgIHBy
aW9yaXR5OiAnaGlnaCcKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIHRoZSB2YWx1ZSBvZiB0
aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCi0g
ICAgYWRkZWQgYXMgYSBkYXNoZXJpemVkIGNsYXNzIG5hbWUuCi0KLSAgICBgYGBqYXZhc2NyaXB0
Ci0gICAgLy8gQXBwbGllcyB0aGUgJ2lzLXVyZ2VudCcgY2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVu
dAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lz
VXJnZW50J10KLSAgICAgIGlzVXJnZW50OiB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBJ
ZiB5b3Ugd291bGQgcHJlZmVyIHRvIHVzZSBhIGN1c3RvbSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBk
YXNoZXJpemVkCi0gICAgcHJvcGVydHkgbmFtZSwgeW91IGNhbiBwYXNzIGEgYmluZGluZyBsaWtl
IHRoaXM6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgJ3VyZ2VudCcg
Y2xhc3MgdG8gdGhlIHZpZXcgZWxlbWVudAotICAgIEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAg
IGNsYXNzTmFtZUJpbmRpbmdzOiBbJ2lzVXJnZW50OnVyZ2VudCddCi0gICAgICBpc1VyZ2VudDog
dHJ1ZQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhpcyBsaXN0IG9mIHByb3BlcnRpZXMgaXMg
aW5oZXJpdGVkIGZyb20gdGhlIHZpZXcncyBzdXBlcmNsYXNzZXMgYXMgd2VsbC4KLQotICAgIEBw
cm9wZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRlZmF1bHQg
W10KLSAgKi8KLSAgY2xhc3NOYW1lQmluZGluZ3M6IEVNUFRZX0FSUkFZLAotCi0gIC8qKgotICAg
IEEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGF0dHJpYnV0ZXMu
IElmIHRoZSBwcm9wZXJ0eSBpcwotICAgIGEgc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgb2YgdGhh
dCBzdHJpbmcgd2lsbCBiZSBhcHBsaWVkIGFzIHRoZSBhdHRyaWJ1dGUuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgLy8gQXBwbGllcyB0aGUgdHlwZSBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQK
LSAgICAvLyB3aXRoIHRoZSB2YWx1ZSAiYnV0dG9uIiwgbGlrZSA8ZGl2IHR5cGU9ImJ1dHRvbiI+
Ci0gICAgRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgYXR0cmlidXRlQmluZGluZ3M6IFsndHlw
ZSddLAotICAgICAgdHlwZTogJ2J1dHRvbicKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIHRo
ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0aGUgbmFtZSBvZiB0aGF0IHBy
b3BlcnR5IGlzCi0gICAgYWRkZWQgYXMgYW4gYXR0cmlidXRlLgotCi0gICAgYGBgamF2YXNjcmlw
dAotICAgIC8vIFJlbmRlcnMgc29tZXRoaW5nIGxpa2UgPGRpdiBlbmFibGVkPSJlbmFibGVkIj4K
LSAgICBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydlbmFi
bGVkJ10sCi0gICAgICBlbmFibGVkOiB0cnVlCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJv
cGVydHkgYXR0cmlidXRlQmluZGluZ3MKLSAgKi8KLSAgYXR0cmlidXRlQmluZGluZ3M6IEVNUFRZ
X0FSUkFZLAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4KLSAgLy8gQ09SRSBESVNQTEFZIE1FVEhPRFMKLSAgLy8KLQotICAvKioK
LSAgICBTZXR1cCBhIHZpZXcsIGJ1dCBkbyBub3QgZmluaXNoIHdha2luZyBpdCB1cC4KLQotICAg
ICogY29uZmlndXJlIGBjaGlsZFZpZXdzYAotICAgICogcmVnaXN0ZXIgdGhlIHZpZXcgd2l0aCB0
aGUgZ2xvYmFsIHZpZXdzIGhhc2gsIHdoaWNoIGlzIHVzZWQgZm9yIGV2ZW50Ci0gICAgICBkaXNw
YXRjaAotCi0gICAgQG1ldGhvZCBpbml0Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAgaW5pdDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy5lbGVtZW50SWQgPSB0aGlzLmVsZW1lbnRJZCB8fCBndWlkRm9y
KHRoaXMpOwotCi0gICAgdGhpcy5fc3VwZXIoKTsKLQotICAgIC8vIHNldHVwIGNoaWxkIHZpZXdz
LiBiZSBzdXJlIHRvIGNsb25lIHRoZSBjaGlsZCB2aWV3cyBhcnJheSBmaXJzdAotICAgIHRoaXMu
X2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzLnNsaWNlKCk7Ci0KLSAgICBFbWJlci5hc3Nl
cnQoIk9ubHkgYXJyYXlzIGFyZSBhbGxvd2VkIGZvciAnY2xhc3NOYW1lQmluZGluZ3MnIiwgRW1i
ZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lQmluZGluZ3MpID09PSAnYXJyYXknKTsKLSAgICB0aGlz
LmNsYXNzTmFtZUJpbmRpbmdzID0gRW1iZXIuQSh0aGlzLmNsYXNzTmFtZUJpbmRpbmdzLnNsaWNl
KCkpOwotCi0gICAgRW1iZXIuYXNzZXJ0KCJPbmx5IGFycmF5cyBhcmUgYWxsb3dlZCBmb3IgJ2Ns
YXNzTmFtZXMnIiwgRW1iZXIudHlwZU9mKHRoaXMuY2xhc3NOYW1lcykgPT09ICdhcnJheScpOwot
ICAgIHRoaXMuY2xhc3NOYW1lcyA9IEVtYmVyLkEodGhpcy5jbGFzc05hbWVzLnNsaWNlKCkpOwot
ICB9LAotCi0gIGFwcGVuZENoaWxkOiBmdW5jdGlvbih2aWV3LCBvcHRpb25zKSB7Ci0gICAgcmV0
dXJuIHRoaXMuY3VycmVudFN0YXRlLmFwcGVuZENoaWxkKHRoaXMsIHZpZXcsIG9wdGlvbnMpOwot
ICB9LAotCi0gIC8qKgotICAgIFJlbW92ZXMgdGhlIGNoaWxkIHZpZXcgZnJvbSB0aGUgcGFyZW50
IHZpZXcuCi0KLSAgICBAbWV0aG9kIHJlbW92ZUNoaWxkCi0gICAgQHBhcmFtIHtFbWJlci5WaWV3
fSB2aWV3Ci0gICAgQHJldHVybiB7RW1iZXIuVmlld30gcmVjZWl2ZXIKLSAgKi8KLSAgcmVtb3Zl
Q2hpbGQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAvLyBJZiB3ZSdyZSBkZXN0cm95aW5nLCB0aGUg
ZW50aXJlIHN1YnRyZWUgd2lsbCBiZQotICAgIC8vIGZyZWVkLCBhbmQgdGhlIERPTSB3aWxsIGJl
IGhhbmRsZWQgc2VwYXJhdGVseSwKLSAgICAvLyBzbyBubyBuZWVkIHRvIG1lc3Mgd2l0aCBjaGls
ZFZpZXdzLgotICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KLQotICAgIC8v
IHVwZGF0ZSBwYXJlbnQgbm9kZQotICAgIHNldCh2aWV3LCAnX3BhcmVudFZpZXcnLCBudWxsKTsK
LQotICAgIC8vIHJlbW92ZSB2aWV3IGZyb20gY2hpbGRWaWV3cyBhcnJheS4KLSAgICB2YXIgY2hp
bGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3M7Ci0KLSAgICBFbWJlci5FbnVtZXJhYmxlVXRpbHMu
cmVtb3ZlT2JqZWN0KGNoaWxkVmlld3MsIHZpZXcpOwotCi0gICAgdGhpcy5wcm9wZXJ0eURpZENo
YW5nZSgnY2hpbGRWaWV3cycpOyAvLyBIVUg/ISB3aGF0IGhhcHBlbmVkIHRvIHdpbGwgY2hhbmdl
PwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmVtb3ZlcyBhbGwgY2hp
bGRyZW4gZnJvbSB0aGUgYHBhcmVudFZpZXdgLgotCi0gICAgQG1ldGhvZCByZW1vdmVBbGxDaGls
ZHJlbgotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJlbW92ZUFs
bENoaWxkcmVuOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdz
KGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsKLSAgICAgIHBhcmVudFZpZXcucmVtb3ZlQ2hp
bGQodmlldyk7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgZGVzdHJveUFsbENoaWxkcmVuOiBmdW5jdGlv
bigpIHsKLSAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdzKGZ1bmN0aW9uKHBhcmVudFZp
ZXcsIHZpZXcpIHsKLSAgICAgIHZpZXcuZGVzdHJveSgpOwotICAgIH0pOwotICB9LAotCi0gIC8q
KgotICAgIFJlbW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVudFZpZXdgLCBpZiBvbmUgaXMg
Zm91bmQuIE90aGVyd2lzZQotICAgIGRvZXMgbm90aGluZy4KLQotICAgIEBtZXRob2QgcmVtb3Zl
RnJvbVBhcmVudAotICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCi0gICovCi0gIHJl
bW92ZUZyb21QYXJlbnQ6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJl
bnRWaWV3OwotCi0gICAgLy8gUmVtb3ZlIERPTSBlbGVtZW50IGZyb20gcGFyZW50Ci0gICAgdGhp
cy5yZW1vdmUoKTsKLQotICAgIGlmIChwYXJlbnQpIHsgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMp
OyB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0sCi0KLSAgLyoqCi0gICAgWW91IG11c3QgY2FsbCBg
ZGVzdHJveWAgb24gYSB2aWV3IHRvIGRlc3Ryb3kgdGhlIHZpZXcgKGFuZCBhbGwgb2YgaXRzCi0g
ICAgY2hpbGQgdmlld3MpLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVu
dCBub2RlLCB0aGVuIG1ha2UKLSAgICBzdXJlIHRoYXQgdGhlIERPTSBlbGVtZW50IG1hbmFnZWQg
YnkgdGhlIHZpZXcgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZQotICAgIG1lbW9yeSBtYW5hZ2VyLgot
Ci0gICAgQG1ldGhvZCBkZXN0cm95Ci0gICovCi0gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAg
IHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cywKLSAgICAgICAgLy8gZ2V0IHBhcmVu
dFZpZXcgYmVmb3JlIGNhbGxpbmcgc3VwZXIgYmVjYXVzZSBpdCdsbCBiZSBkZXN0cm95ZWQKLSAg
ICAgICAgbm9uVmlydHVhbFBhcmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZpZXcnKSwKLSAg
ICAgICAgdmlld05hbWUgPSB0aGlzLnZpZXdOYW1lLAotICAgICAgICBjaGlsZExlbiwgaTsKLQot
ICAgIGlmICghdGhpcy5fc3VwZXIoKSkgeyByZXR1cm47IH0KLQotICAgIGNoaWxkTGVuID0gY2hp
bGRWaWV3cy5sZW5ndGg7Ci0gICAgZm9yIChpPWNoaWxkTGVuLTE7IGk+PTA7IGktLSkgewotICAg
ICAgY2hpbGRWaWV3c1tpXS5yZW1vdmVkRnJvbURPTSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8g
cmVtb3ZlIGZyb20gbm9uLXZpcnR1YWwgcGFyZW50IHZpZXcgaWYgdmlld05hbWUgd2FzIHNwZWNp
ZmllZAotICAgIGlmICh2aWV3TmFtZSAmJiBub25WaXJ0dWFsUGFyZW50VmlldykgewotICAgICAg
bm9uVmlydHVhbFBhcmVudFZpZXcuc2V0KHZpZXdOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBj
aGlsZExlbiA9IGNoaWxkVmlld3MubGVuZ3RoOwotICAgIGZvciAoaT1jaGlsZExlbi0xOyBpPj0w
OyBpLS0pIHsKLSAgICAgIGNoaWxkVmlld3NbaV0uZGVzdHJveSgpOwotICAgIH0KLQotICAgIHJl
dHVybiB0aGlzOwotICB9LAotCi0gIC8qKgotICAgIEluc3RhbnRpYXRlcyBhIHZpZXcgdG8gYmUg
YWRkZWQgdG8gdGhlIGNoaWxkVmlld3MgYXJyYXkgZHVyaW5nIHZpZXcKLSAgICBpbml0aWFsaXph
dGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IHVu
bGVzcwotICAgIHlvdSBhcmUgb3ZlcnJpZGluZyBgY3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90ZSB0
aGF0IHRoaXMgbWV0aG9kIHdpbGwKLSAgICBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGUgY29y
cmVjdCBzZXR0aW5ncyBvbiB0aGUgbmV3IHZpZXcgaW5zdGFuY2UgdG8KLSAgICBhY3QgYXMgYSBj
aGlsZCBvZiB0aGUgcGFyZW50LgotCi0gICAgQG1ldGhvZCBjcmVhdGVDaGlsZFZpZXcKLSAgICBA
cGFyYW0ge0NsYXNzfFN0cmluZ30gdmlld0NsYXNzCi0gICAgQHBhcmFtIHtIYXNofSBbYXR0cnNd
IEF0dHJpYnV0ZXMgdG8gYWRkCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gbmV3IGluc3RhbmNl
Ci0gICovCi0gIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24odmlldywgYXR0cnMpIHsKLSAgICBp
ZiAoIXZpZXcpIHsKLSAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImNyZWF0ZUNoaWxkVmlld3Mg
Zmlyc3QgYXJndW1lbnQgbXVzdCBleGlzdCIpOwotICAgIH0KLQotICAgIGlmICh2aWV3LmlzVmll
dyAmJiB2aWV3Ll9wYXJlbnRWaWV3ID09PSB0aGlzICYmIHZpZXcuY29udGFpbmVyID09PSB0aGlz
LmNvbnRhaW5lcikgewotICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgfQotCi0gICAgYXR0cnMgPSBh
dHRycyB8fCB7fTsKLSAgICBhdHRycy5fcGFyZW50VmlldyA9IHRoaXM7Ci0KLSAgICBpZiAoRW1i
ZXIuQ29yZVZpZXcuZGV0ZWN0KHZpZXcpKSB7Ci0gICAgICBhdHRycy50ZW1wbGF0ZURhdGEgPSBh
dHRycy50ZW1wbGF0ZURhdGEgfHwgZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAgICAg
YXR0cnMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7Ci0gICAgICB2aWV3ID0gdmlldy5jcmVh
dGUoYXR0cnMpOwotCi0gICAgICAvLyBkb24ndCBzZXQgdGhlIHByb3BlcnR5IG9uIGEgdmlydHVh
bCB2aWV3LCBhcyB0aGV5IGFyZSBpbnZpc2libGUgdG8KLSAgICAgIC8vIGNvbnN1bWVycyBvZiB0
aGUgdmlldyBBUEkKLSAgICAgIGlmICh2aWV3LnZpZXdOYW1lKSB7Ci0gICAgICAgIHNldChnZXQo
dGhpcywgJ2NvbmNyZXRlVmlldycpLCB2aWV3LnZpZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgdmlldykgewotICAgICAgdmFyIGZ1bGxO
YW1lID0gJ3ZpZXc6JyArIHZpZXc7Ci0gICAgICB2YXIgVmlldyA9IHRoaXMuY29udGFpbmVyLmxv
b2t1cEZhY3RvcnkoZnVsbE5hbWUpOwotCi0gICAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBm
aW5kIHZpZXc6ICciICsgZnVsbE5hbWUgKyAiJyIsICEhVmlldyk7Ci0KLSAgICAgIGF0dHJzLnRl
bXBsYXRlRGF0YSA9IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7Ci0gICAgICB2aWV3ID0gVmll
dy5jcmVhdGUoYXR0cnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFbWJlci5hc3NlcnQoJ1lvdSBt
dXN0IHBhc3MgaW5zdGFuY2Ugb3Igc3ViY2xhc3Mgb2YgVmlldycsIHZpZXcuaXNWaWV3KTsKLSAg
ICAgIGF0dHJzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwotCi0gICAgICBpZiAoIWdldCh2
aWV3LCAndGVtcGxhdGVEYXRhJykpIHsKLSAgICAgICAgYXR0cnMudGVtcGxhdGVEYXRhID0gZ2V0
KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuc2V0UHJvcGVy
dGllcyh2aWV3LCBhdHRycyk7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfSwKLQot
ICBiZWNhbWVWaXNpYmxlOiBFbWJlci5LLAotICBiZWNhbWVIaWRkZW46IEVtYmVyLkssCi0KLSAg
LyoqCi0gICAgV2hlbiB0aGUgdmlldydzIGBpc1Zpc2libGVgIHByb3BlcnR5IGNoYW5nZXMsIHRv
Z2dsZSB0aGUgdmlzaWJpbGl0eQotICAgIGVsZW1lbnQgb2YgdGhlIGFjdHVhbCBET00gZWxlbWVu
dC4KLQotICAgIEBtZXRob2QgX2lzVmlzaWJsZURpZENoYW5nZQotICAgIEBwcml2YXRlCi0gICov
Ci0gIF9pc1Zpc2libGVEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdpc1Zpc2libGUnLCBmdW5j
dGlvbigpIHsKLSAgICB2YXIgJGVsID0gdGhpcy4kKCk7Ci0gICAgaWYgKCEkZWwpIHsgcmV0dXJu
OyB9Ci0KLSAgICB2YXIgaXNWaXNpYmxlID0gZ2V0KHRoaXMsICdpc1Zpc2libGUnKTsKLQotICAg
ICRlbC50b2dnbGUoaXNWaXNpYmxlKTsKLQotICAgIGlmICh0aGlzLl9pc0FuY2VzdG9ySGlkZGVu
KCkpIHsgcmV0dXJuOyB9Ci0KLSAgICBpZiAoaXNWaXNpYmxlKSB7Ci0gICAgICB0aGlzLl9ub3Rp
ZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX25vdGlmeUJlY2Ft
ZUhpZGRlbigpOwotICAgIH0KLSAgfSksCi0KLSAgX25vdGlmeUJlY2FtZVZpc2libGU6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMudHJpZ2dlcignYmVjYW1lVmlzaWJsZScpOwotCi0gICAgdGhpcy5m
b3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgIHZhciBpc1Zpc2libGUgPSBn
ZXQodmlldywgJ2lzVmlzaWJsZScpOwotCi0gICAgICBpZiAoaXNWaXNpYmxlIHx8IGlzVmlzaWJs
ZSA9PT0gbnVsbCkgewotICAgICAgICB2aWV3Ll9ub3RpZnlCZWNhbWVWaXNpYmxlKCk7Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgX25vdGlmeUJlY2FtZUhpZGRlbjogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy50cmlnZ2VyKCdiZWNhbWVIaWRkZW4nKTsKLSAgICB0aGlzLmZvckVhY2hDaGls
ZFZpZXcoZnVuY3Rpb24odmlldykgewotICAgICAgdmFyIGlzVmlzaWJsZSA9IGdldCh2aWV3LCAn
aXNWaXNpYmxlJyk7Ci0KLSAgICAgIGlmIChpc1Zpc2libGUgfHwgaXNWaXNpYmxlID09PSBudWxs
KSB7Ci0gICAgICAgIHZpZXcuX25vdGlmeUJlY2FtZUhpZGRlbigpOwotICAgICAgfQotICAgIH0p
OwotICB9LAotCi0gIF9pc0FuY2VzdG9ySGlkZGVuOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgcGFy
ZW50ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7Ci0KLSAgICB3aGlsZSAocGFyZW50KSB7Ci0g
ICAgICBpZiAoZ2V0KHBhcmVudCwgJ2lzVmlzaWJsZScpID09PSBmYWxzZSkgeyByZXR1cm4gdHJ1
ZTsgfQotCi0gICAgICBwYXJlbnQgPSBnZXQocGFyZW50LCAncGFyZW50VmlldycpOwotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKLSAgfSwKLQotICBjbGVhckJ1ZmZlcjogZnVuY3Rpb24oKSB7
Ci0gICAgdGhpcy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7Ci0gICAgICB2aWV3
LmJ1ZmZlciA9IG51bGw7Ci0gICAgfSk7Ci0gIH0sCi0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlv
bihzdGF0ZSwgY2hpbGRyZW4pIHsKLSAgICB2YXIgcHJpb3JTdGF0ZSA9IHRoaXMuY3VycmVudFN0
YXRlLAotICAgICAgICBjdXJyZW50U3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuc3Rh
dGVzW3N0YXRlXTsKLSAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0KLSAgICBpZiAocHJpb3JTdGF0
ZSAmJiBwcmlvclN0YXRlLmV4aXQpIHsgcHJpb3JTdGF0ZS5leGl0KHRoaXMpOyB9Ci0gICAgaWYg
KGN1cnJlbnRTdGF0ZS5lbnRlcikgeyBjdXJyZW50U3RhdGUuZW50ZXIodGhpcyk7IH0KLSAgICBp
ZiAoc3RhdGUgPT09ICdpbkRPTScpIHsgZGVsZXRlIEVtYmVyLm1ldGEodGhpcykuY2FjaGUuZWxl
bWVudDsgfQotCi0gICAgaWYgKGNoaWxkcmVuICE9PSBmYWxzZSkgewotICAgICAgdGhpcy5mb3JF
YWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKLSAgICAgICAgdmlldy50cmFuc2l0aW9uVG8o
c3RhdGUpOwotICAgICAgfSk7Ci0gICAgfQotICB9LAotCi0gIC8vIC4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLSAgLy8gRVZFTlQgSEFORExJ
TkcKLSAgLy8KLQotICAvKioKLSAgICBIYW5kbGUgZXZlbnRzIGZyb20gYEVtYmVyLkV2ZW50RGlz
cGF0Y2hlcmAKLQotICAgIEBtZXRob2QgaGFuZGxlRXZlbnQKLSAgICBAcGFyYW0gZXZlbnROYW1l
IHtTdHJpbmd9Ci0gICAgQHBhcmFtIGV2dCB7RXZlbnR9Ci0gICAgQHByaXZhdGUKLSAgKi8KLSAg
aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZXZ0KSB7Ci0gICAgcmV0dXJuIHRoaXMu
Y3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRoaXMsIGV2ZW50TmFtZSwgZXZ0KTsKLSAgfSwKLQot
ICByZWdpc3Rlck9ic2VydmVyOiBmdW5jdGlvbihyb290LCBwYXRoLCB0YXJnZXQsIG9ic2VydmVy
KSB7Ci0gICAgaWYgKCFvYnNlcnZlciAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGFyZ2V0KSB7
Ci0gICAgICBvYnNlcnZlciA9IHRhcmdldDsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQot
Ci0gICAgaWYgKCFyb290IHx8IHR5cGVvZiByb290ICE9PSAnb2JqZWN0JykgewotICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIHZhciB2aWV3ID0gdGhpcywKLSAgICAgICAgc3RhdGVDaGVja2Vk
T2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICB2aWV3LmN1cnJlbnRTdGF0ZS5pbnZv
a2VPYnNlcnZlcih0aGlzLCBvYnNlcnZlcik7Ci0gICAgICAgIH0sCi0gICAgICAgIHNjaGVkdWxl
ZE9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25j
ZSgncmVuZGVyJywgdGhpcywgc3RhdGVDaGVja2VkT2JzZXJ2ZXIpOwotICAgICAgICB9OwotCi0g
ICAgRW1iZXIuYWRkT2JzZXJ2ZXIocm9vdCwgcGF0aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZl
cik7Ci0KLSAgICB0aGlzLm9uZSgnd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAg
ICBFbWJlci5yZW1vdmVPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQsIHNjaGVkdWxlZE9ic2Vy
dmVyKTsKLSAgICB9KTsKLSAgfQotCi19KTsKLQotLyoKLSAgRGVzY3JpYmUgaG93IHRoZSBzcGVj
aWZpZWQgYWN0aW9ucyBzaG91bGQgYmVoYXZlIGluIHRoZSB2YXJpb3VzCi0gIHN0YXRlcyB0aGF0
IGEgdmlldyBjYW4gZXhpc3QgaW4uIFBvc3NpYmxlIHN0YXRlczoKLQotICAqIHByZVJlbmRlcjog
d2hlbiBhIHZpZXcgaXMgZmlyc3QgaW5zdGFudGlhdGVkLCBhbmQgYWZ0ZXIgaXRzCi0gICAgZWxl
bWVudCB3YXMgZGVzdHJveWVkLCBpdCBpcyBpbiB0aGUgcHJlUmVuZGVyIHN0YXRlCi0gICogaW5C
dWZmZXI6IG9uY2UgYSB2aWV3IGhhcyBiZWVuIHJlbmRlcmVkLCBidXQgYmVmb3JlIGl0IGhhcwot
ICAgIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBpdCBpcyBpbiB0aGUgaW5CdWZmZXIgc3Rh
dGUKLSAgKiBpbkRPTTogb25jZSBhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9N
IGl0IGlzIGluCi0gICAgdGhlIGluRE9NIHN0YXRlLiBBIHZpZXcgc3BlbmRzIHRoZSB2YXN0IG1h
am9yaXR5IG9mIGl0cwotICAgIGV4aXN0ZW5jZSBpbiB0aGlzIHN0YXRlLgotICAqIGRlc3Ryb3ll
ZDogb25jZSBhIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkICh1c2luZyB0aGUgZGVzdHJveQotICAg
IG1ldGhvZCksIGl0IGlzIGluIHRoaXMgc3RhdGUuIE5vIGZ1cnRoZXIgYWN0aW9ucyBjYW4gYmUg
aW52b2tlZAotICAgIG9uIGEgZGVzdHJveWVkIHZpZXcuCi0qLwotCi0gIC8vIGluIHRoZSBkZXN0
cm95ZWQgc3RhdGUsIGV2ZXJ5dGhpbmcgaXMgaWxsZWdhbAotCi0gIC8vIGJlZm9yZSByZW5kZXJp
bmcgaGFzIGJlZ3VuLCBhbGwgbGVnYWwgbWFuaXB1bGF0aW9ucyBhcmUgbm9vcHMuCi0KLSAgLy8g
aW5zaWRlIHRoZSBidWZmZXIsIGxlZ2FsIG1hbmlwdWxhdGlvbnMgYXJlIGRvbmUgb24gdGhlIGJ1
ZmZlcgotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9N
LCBsZWdhbCBtYW5pcHVsYXRpb25zCi0gIC8vIGFyZSBkb25lIG9uIHRoZSBET00gZWxlbWVudC4K
LQotZnVuY3Rpb24gbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKSB7Ci0gIEVtYmVyLnJ1bi5vbmNl
KEVtYmVyLlZpZXcsICdub3RpZnlNdXRhdGlvbkxpc3RlbmVycycpOwotfQotCi12YXIgRE9NTWFu
YWdlciA9IHsKLSAgcHJlcGVuZDogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgp
LnByZXBlbmQoaHRtbCk7Ci0gICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQot
ICBhZnRlcjogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLmFmdGVyKGh0bWwp
OwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0sCi0KLSAgaHRtbDogZnVuY3Rp
b24odmlldywgaHRtbCkgewotICAgIHZpZXcuJCgpLmh0bWwoaHRtbCk7Ci0gICAgbm90aWZ5TXV0
YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICByZXBsYWNlOiBmdW5jdGlvbih2aWV3KSB7Ci0g
ICAgdmFyIGVsZW1lbnQgPSBnZXQodmlldywgJ2VsZW1lbnQnKTsKLQotICAgIHNldCh2aWV3LCAn
ZWxlbWVudCcsIG51bGwpOwotCi0gICAgdmlldy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9u
KCkgewotICAgICAgRW1iZXIuJChlbGVtZW50KS5yZXBsYWNlV2l0aChnZXQodmlldywgJ2VsZW1l
bnQnKSk7Ci0gICAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICAgIH0pOwotICB9LAot
Ci0gIHJlbW92ZTogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcuJCgpLnJlbW92ZSgpOwotICAg
IG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7Ci0gIH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZp
ZXcpIHsKLSAgICB2aWV3LiQoKS5lbXB0eSgpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJz
KCk7Ci0gIH0KLX07Ci0KLUVtYmVyLlZpZXcucmVvcGVuKHsKLSAgZG9tTWFuYWdlcjogRE9NTWFu
YWdlcgotfSk7Ci0KLUVtYmVyLlZpZXcucmVvcGVuQ2xhc3MoewotCi0gIC8qKgotICAgIFBhcnNl
IGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xkcyB0aGUgcGFyc2VkIHByb3Bl
cnRpZXMuCi0KLSAgICBGb3IgZXhhbXBsZSBhIHBhdGggbGlrZSAiY29udGVudC5pc0VuYWJsZWQ6
ZW5hYmxlZDpkaXNhYmxlZCIgd2lsbCByZXR1cm4gdGhlCi0gICAgZm9sbG93aW5nIG9iamVjdDoK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB7Ci0gICAgICBwYXRoOiAiY29udGVudC5pc0VuYWJs
ZWQiLAotICAgICAgY2xhc3NOYW1lOiAiZW5hYmxlZCIsCi0gICAgICBmYWxzeUNsYXNzTmFtZTog
ImRpc2FibGVkIiwKLSAgICAgIGNsYXNzTmFtZXM6ICI6ZW5hYmxlZDpkaXNhYmxlZCIKLSAgICB9
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIF9wYXJzZVByb3BlcnR5UGF0aAotICAgIEBzdGF0aWMK
LSAgICBAcHJpdmF0ZQotICAqLwotICBfcGFyc2VQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uKHBhdGgp
IHsKLSAgICB2YXIgc3BsaXQgPSBwYXRoLnNwbGl0KCc6JyksCi0gICAgICAgIHByb3BlcnR5UGF0
aCA9IHNwbGl0WzBdLAotICAgICAgICBjbGFzc05hbWVzID0gIiIsCi0gICAgICAgIGNsYXNzTmFt
ZSwKLSAgICAgICAgZmFsc3lDbGFzc05hbWU7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgcHJvcGVy
dHkgaXMgZGVmaW5lZCBhcyBwcm9wOmNsYXNzIG9yIHByb3A6dHJ1ZUNsYXNzOmZhbHNlQ2xhc3MK
LSAgICBpZiAoc3BsaXQubGVuZ3RoID4gMSkgewotICAgICAgY2xhc3NOYW1lID0gc3BsaXRbMV07
Ci0gICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAzKSB7IGZhbHN5Q2xhc3NOYW1lID0gc3BsaXRb
Ml07IH0KLQotICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNsYXNzTmFtZTsKLSAgICAgIGlmIChm
YWxzeUNsYXNzTmFtZSkgeyBjbGFzc05hbWVzICs9ICI6IiArIGZhbHN5Q2xhc3NOYW1lOyB9Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHsKLSAgICAgIHBhdGg6IHByb3BlcnR5UGF0aCwKLSAgICAgIGNs
YXNzTmFtZXM6IGNsYXNzTmFtZXMsCi0gICAgICBjbGFzc05hbWU6IChjbGFzc05hbWUgPT09ICcn
KSA/IHVuZGVmaW5lZCA6IGNsYXNzTmFtZSwKLSAgICAgIGZhbHN5Q2xhc3NOYW1lOiBmYWxzeUNs
YXNzTmFtZQotICAgIH07Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBjbGFzcyBuYW1lIGZv
ciBhIGdpdmVuIHZhbHVlLCBiYXNlZCBvbiB0aGUgcGF0aCwgb3B0aW9uYWwKLSAgICBgY2xhc3NO
YW1lYCBhbmQgb3B0aW9uYWwgYGZhbHN5Q2xhc3NOYW1lYC4KLQotICAgIC0gaWYgYSBgY2xhc3NO
YW1lYCBvciBgZmFsc3lDbGFzc05hbWVgIGhhcyBiZWVuIHNwZWNpZmllZDoKLSAgICAgIC0gaWYg
dGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgYGNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAot
ICAgICAgICBgY2xhc3NOYW1lYCBpcyByZXR1cm5lZAotICAgICAgLSBpZiB0aGUgdmFsdWUgaXMg
ZmFsc3kgYW5kIGBmYWxzeUNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkLAotICAgICAgICBg
ZmFsc3lDbGFzc05hbWVgIGlzIHJldHVybmVkCi0gICAgICAtIG90aGVyd2lzZSBgbnVsbGAgaXMg
cmV0dXJuZWQKLSAgICAtIGlmIHRoZSB2YWx1ZSBpcyBgdHJ1ZWAsIHRoZSBkYXNoZXJpemVkIGxh
c3QgcGFydCBvZiB0aGUgc3VwcGxpZWQgcGF0aAotICAgICAgaXMgcmV0dXJuZWQKLSAgICAtIGlm
IHRoZSB2YWx1ZSBpcyBub3QgYGZhbHNlYCwgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZh
bHVlYAotICAgICAgaXMgcmV0dXJuZWQKLSAgICAtIGlmIG5vbmUgb2YgdGhlIGFib3ZlIHJ1bGVz
IGFwcGx5LCBgbnVsbGAgaXMgcmV0dXJuZWQKLQotICAgIEBtZXRob2QgX2NsYXNzU3RyaW5nRm9y
VmFsdWUKLSAgICBAcGFyYW0gcGF0aAotICAgIEBwYXJhbSB2YWwKLSAgICBAcGFyYW0gY2xhc3NO
YW1lCi0gICAgQHBhcmFtIGZhbHN5Q2xhc3NOYW1lCi0gICAgQHN0YXRpYwotICAgIEBwcml2YXRl
Ci0gICovCi0gIF9jbGFzc1N0cmluZ0ZvclZhbHVlOiBmdW5jdGlvbihwYXRoLCB2YWwsIGNsYXNz
TmFtZSwgZmFsc3lDbGFzc05hbWUpIHsKLSAgICAvLyBXaGVuIHVzaW5nIHRoZSBjb2xvbiBzeW50
YXgsIGV2YWx1YXRlIHRoZSB0cnV0aGluZXNzIG9yIGZhbHNpbmVzcwotICAgIC8vIG9mIHRoZSB2
YWx1ZSB0byBkZXRlcm1pbmUgd2hpY2ggY2xhc3NOYW1lIHRvIHJldHVybgotICAgIGlmIChjbGFz
c05hbWUgfHwgZmFsc3lDbGFzc05hbWUpIHsKLSAgICAgIGlmIChjbGFzc05hbWUgJiYgISF2YWwp
IHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLQotICAgICAgfSBlbHNlIGlmIChmYWxzeUNs
YXNzTmFtZSAmJiAhdmFsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzeUNsYXNzTmFtZTsKLQotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAvLyBJZiB2
YWx1ZSBpcyBhIEJvb2xlYW4gYW5kIHRydWUsIHJldHVybiB0aGUgZGFzaGVyaXplZCBwcm9wZXJ0
eQotICAgIC8vIG5hbWUuCi0gICAgfSBlbHNlIGlmICh2YWwgPT09IHRydWUpIHsKLSAgICAgIC8v
IE5vcm1hbGl6ZSBwcm9wZXJ0eSBwYXRoIHRvIGJlIHN1aXRhYmxlIGZvciB1c2UKLSAgICAgIC8v
IGFzIGEgY2xhc3MgbmFtZS4gRm9yIGV4YXBsZSwgY29udGVudC5mb28uYmFyQmF6Ci0gICAgICAv
LyBiZWNvbWVzIGJhci1iYXouCi0gICAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7Ci0g
ICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgtMV0p
OwotCi0gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBmYWxzZSwgdW5kZWZpbmVkLCBvciBudWxs
LCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAvLyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAg
fSBlbHNlIGlmICh2YWwgIT09IGZhbHNlICYmIHZhbCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4g
dmFsOwotCi0gICAgLy8gTm90aGluZyB0byBkaXNwbGF5LiBSZXR1cm4gbnVsbCBzbyB0aGF0IHRo
ZSBvbGQgY2xhc3MgaXMgcmVtb3ZlZAotICAgIC8vIGJ1dCBubyBuZXcgY2xhc3MgaXMgYWRkZWQu
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfSk7Ci0KLXZh
ciBtdXRhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRXZlbnRlZCkuY3JlYXRlKCk7
Ci0KLUVtYmVyLlZpZXcuYWRkTXV0YXRpb25MaXN0ZW5lciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7
Ci0gIG11dGF0aW9uLm9uKCdjaGFuZ2UnLCBjYWxsYmFjayk7Ci19OwotCi1FbWJlci5WaWV3LnJl
bW92ZU11dGF0aW9uTGlzdGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICBtdXRhdGlvbi5v
ZmYoJ2NoYW5nZScsIGNhbGxiYWNrKTsKLX07Ci0KLUVtYmVyLlZpZXcubm90aWZ5TXV0YXRpb25M
aXN0ZW5lcnMgPSBmdW5jdGlvbigpIHsKLSAgbXV0YXRpb24udHJpZ2dlcignY2hhbmdlJyk7Ci19
OwotCi0vKioKLSAgR2xvYmFsIHZpZXdzIGhhc2gKLQotICBAcHJvcGVydHkgdmlld3MKLSAgQHN0
YXRpYwotICBAdHlwZSBIYXNoCi0qLwotRW1iZXIuVmlldy52aWV3cyA9IHt9OwotCi0vLyBJZiBz
b21lb25lIG92ZXJyaWRlcyB0aGUgY2hpbGQgdmlld3MgY29tcHV0ZWQgcHJvcGVydHkgd2hlbgot
Ly8gZGVmaW5pbmcgdGhlaXIgY2xhc3MsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBwcm9jZXNzIHRo
ZSB1c2VyJ3MKLS8vIHN1cHBsaWVkIGNoaWxkVmlld3MgYW5kIHRoZW4gcmVzdG9yZSB0aGUgb3Jp
Z2luYWwgY29tcHV0ZWQgcHJvcGVydHkKLS8vIGF0IHZpZXcgaW5pdGlhbGl6YXRpb24gdGltZS4g
VGhpcyBoYXBwZW5zIGluIEVtYmVyLkNvbnRhaW5lclZpZXcncyBpbml0Ci0vLyBtZXRob2QuCi1F
bWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSA9IGNoaWxkVmlld3NQcm9wZXJ0eTsKLQotRW1i
ZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzID0gZnVuY3Rpb24oZWxlbSwgbmFtZSwgdmFs
dWUpIHsKLSAgdmFyIHR5cGUgPSBFbWJlci50eXBlT2YodmFsdWUpOwotCi0gIC8vIGlmIHRoaXMg
Y2hhbmdlcywgYWxzbyBjaGFuZ2UgdGhlIGxvZ2ljIGluIGVtYmVyLWhhbmRsZWJhcnMvbGliL2hl
bHBlcnMvYmluZGluZy5qcwotICBpZiAobmFtZSAhPT0gJ3ZhbHVlJyAmJiAodHlwZSA9PT0gJ3N0
cmluZycgfHwgKHR5cGUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpKSkgewotICAgIGlm
ICh2YWx1ZSAhPT0gZWxlbS5hdHRyKG5hbWUpKSB7Ci0gICAgICBlbGVtLmF0dHIobmFtZSwgdmFs
dWUpOwotICAgIH0KLSAgfSBlbHNlIGlmIChuYW1lID09PSAndmFsdWUnIHx8IHR5cGUgPT09ICdi
b29sZWFuJykgewotICAgIC8vIFdlIGNhbid0IHNldCBwcm9wZXJ0aWVzIHRvIHVuZGVmaW5lZCBv
ciBudWxsCi0gICAgaWYgKEVtYmVyLmlzTm9uZSh2YWx1ZSkpIHsgdmFsdWUgPSAnJzsgfQotCi0g
ICAgaWYgKCF2YWx1ZSkgewotICAgICAgZWxlbS5yZW1vdmVBdHRyKG5hbWUpOwotICAgIH0KLQot
ICAgIGlmICh2YWx1ZSAhPT0gZWxlbS5wcm9wKG5hbWUpKSB7Ci0gICAgICAvLyB2YWx1ZSBhbmQg
Ym9vbGVhbnMgc2hvdWxkIGFsd2F5cyBiZSBwcm9wZXJ0aWVzCi0gICAgICBlbGVtLnByb3AobmFt
ZSwgdmFsdWUpOwotICAgIH0KLSAgfSBlbHNlIGlmICghdmFsdWUpIHsKLSAgICBlbGVtLnJlbW92
ZUF0dHIobmFtZSk7Ci0gIH0KLX07Ci0KLUVtYmVyLlZpZXcuc3RhdGVzID0gc3RhdGVzOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXZpZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7
Ci0KLUVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0ID0gewotICAvLyBhcHBlbmRDaGlsZCBpcyBv
bmx5IGxlZ2FsIHdoaWxlIHJlbmRlcmluZyB0aGUgYnVmZmVyLgotICBhcHBlbmRDaGlsZDogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhyb3cgIllvdSBjYW4ndCB1c2UgYXBwZW5kQ2hpbGQgb3V0c2lkZSBv
ZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MiOwotICB9LAotCi0gICQ6IGZ1bmN0aW9uKCkgewotICAg
IHJldHVybiB1bmRlZmluZWQ7Ci0gIH0sCi0KLSAgZ2V0RWxlbWVudDogZnVuY3Rpb24oKSB7Ci0g
ICAgcmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5F
dmVudERpc3BhdGNoZXJgCi0gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4g
dHJ1ZTsgLy8gY29udGludWUgZXZlbnQgcHJvcGFnYXRpb24KLSAgfSwKLQotICBkZXN0cm95RWxl
bWVudDogZnVuY3Rpb24odmlldykgewotICAgIHNldCh2aWV3LCAnZWxlbWVudCcsIG51bGwpOwot
ICAgIGlmICh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpIHsKLSAgICAgIEVtYmVyLnJ1bi5jYW5jZWwo
dmlldy5fc2NoZWR1bGVkSW5zZXJ0KTsKLSAgICAgIHZpZXcuX3NjaGVkdWxlZEluc2VydCA9IG51
bGw7Ci0gICAgfQotICAgIHJldHVybiB2aWV3OwotICB9LAotCi0gIHJlbmRlclRvQnVmZmVySWZO
ZWVkZWQ6IGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0sCi0KLSAgcmVyZW5k
ZXI6IEVtYmVyLkssCi0gIGludm9rZU9ic2VydmVyOiBFbWJlci5LCi19OwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgcHJlUmVuZGVyID0gRW1iZXIuVmlldy5zdGF0ZXMucHJlUmVuZGVyID0g
RW1iZXIuY3JlYXRlKEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKLQotRW1iZXIubWVyZ2Uo
cHJlUmVuZGVyLCB7Ci0gIC8vIGEgdmlldyBsZWF2ZXMgdGhlIHByZVJlbmRlciBzdGF0ZSBvbmNl
IGl0cyBlbGVtZW50IGhhcyBiZWVuCi0gIC8vIGNyZWF0ZWQgKGNyZWF0ZUVsZW1lbnQpLgotICBp
bnNlcnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBmbikgewotICAgIHZpZXcuY3JlYXRlRWxlbWVu
dCgpOwotICAgIHZhciB2aWV3Q29sbGVjdGlvbiA9IHZpZXcudmlld0hpZXJhcmNoeUNvbGxlY3Rp
b24oKTsKLQotICAgIHZpZXdDb2xsZWN0aW9uLnRyaWdnZXIoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7
Ci0KLSAgICBmbi5jYWxsKHZpZXcpOwotCi0gICAgLy8gV2UgdHJhbnNpdGlvbiB0byBgaW5ET01g
IGlmIHRoZSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgRE9NCi0gICAgdmFyIGVsZW1lbnQgPSB2aWV3
LmdldCgnZWxlbWVudCcpOwotICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2Rl
KSB7Ci0gICAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQpIHsKLSAgICAgICAgdmlld0NvbGxl
Y3Rpb24udHJhbnNpdGlvblRvKCdpbkRPTScsIGZhbHNlKTsKLSAgICAgICAgdmlld0NvbGxlY3Rp
b24udHJpZ2dlcignZGlkSW5zZXJ0RWxlbWVudCcpOwotICAgICAgfQotICAgIH0KLQotICB9LAot
Ci0gIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcsIGJ1ZmZlcikgewotICAg
IHZpZXcucmVuZGVyVG9CdWZmZXIoYnVmZmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSwKLQot
ICBlbXB0eTogRW1iZXIuSywKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkg
ewotICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgewotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ2hh
c0VsZW1lbnQnKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19KTsKLQotfSkoKTsK
LQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJl
ci12aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12
YXIgaW5CdWZmZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShF
bWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7Ci0KLUVtYmVyLm1lcmdlKGluQnVmZmVyLCB7Ci0g
ICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewotICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW4gZWxl
bWVudCB5ZXQsIHNvbWVvbmUgY2FsbGluZyB0aGlzLiQoKSBpcwotICAgIC8vIHRyeWluZyB0byB1
cGRhdGUgYW4gZWxlbWVudCB0aGF0IGlzbid0IGluIHRoZSBET00uIEluc3RlYWQsCi0gICAgLy8g
cmVyZW5kZXIgdGhlIHZpZXcgdG8gYWxsb3cgdGhlIHJlbmRlciBtZXRob2QgdG8gcmVmbGVjdCB0
aGUKLSAgICAvLyBjaGFuZ2VzLgotICAgIHZpZXcucmVyZW5kZXIoKTsKLSAgICByZXR1cm4gRW1i
ZXIuJCgpOwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVy
LCByZXJlbmRlcmluZyBpdCBzaW1wbHkKLSAgLy8gcmVwbGFjZXMgdGhlIGV4aXN0aW5nIGJ1ZmZl
ciB3aXRoIGEgbmV3IG9uZQotICByZXJlbmRlcjogZnVuY3Rpb24odmlldykgewotICAgIHRocm93
IG5ldyBFbWJlci5FcnJvcigiU29tZXRoaW5nIHlvdSBkaWQgY2F1c2VkIGEgdmlldyB0byByZS1y
ZW5kZXIgYWZ0ZXIgaXQgcmVuZGVyZWQgYnV0IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0
aGUgRE9NLiIpOwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVm
ZmVyLCBhcHBlbmRpbmcgYSBjaGlsZAotICAvLyB2aWV3IHdpbGwgcmVuZGVyIHRoYXQgdmlldyBh
bmQgYXBwZW5kIHRoZSByZXN1bHRpbmcKLSAgLy8gYnVmZmVyIGludG8gaXRzIGJ1ZmZlci4KLSAg
YXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKHZpZXcsIGNoaWxkVmlldywgb3B0aW9ucykgewotICAgIHZh
ciBidWZmZXIgPSB2aWV3LmJ1ZmZlciwgX2NoaWxkVmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzOwot
Ci0gICAgY2hpbGRWaWV3ID0gdmlldy5jcmVhdGVDaGlsZFZpZXcoY2hpbGRWaWV3LCBvcHRpb25z
KTsKLSAgICBpZiAoIV9jaGlsZFZpZXdzLmxlbmd0aCkgeyBfY2hpbGRWaWV3cyA9IHZpZXcuX2No
aWxkVmlld3MgPSBfY2hpbGRWaWV3cy5zbGljZSgpOyB9Ci0gICAgX2NoaWxkVmlld3MucHVzaChj
aGlsZFZpZXcpOwotCi0gICAgY2hpbGRWaWV3LnJlbmRlclRvQnVmZmVyKGJ1ZmZlcik7Ci0KLSAg
ICB2aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0KLSAgICByZXR1cm4gY2hp
bGRWaWV3OwotICB9LAotCi0gIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVy
LCBkZXN0cm95aW5nIHRoZQotICAvLyBlbGVtZW50IHdpbGwgc2ltcGx5IGRlc3Ryb3kgdGhlIGJ1
ZmZlciBhbmQgcHV0IHRoZQotICAvLyBzdGF0ZSBiYWNrIGludG8gdGhlIHByZVJlbmRlciBzdGF0
ZS4KLSAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2aWV3LmNsZWFyQnVm
ZmVyKCk7Ci0gICAgdmFyIHZpZXdDb2xsZWN0aW9uID0gdmlldy5fbm90aWZ5V2lsbERlc3Ryb3lF
bGVtZW50KCk7Ci0gICAgdmlld0NvbGxlY3Rpb24udHJhbnNpdGlvblRvKCdwcmVSZW5kZXInLCBm
YWxzZSk7Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfSwKLQotICBlbXB0eTogZnVuY3Rpb24oKSB7
Ci0gICAgRW1iZXIuYXNzZXJ0KCJFbXB0eWluZyBhIHZpZXcgaW4gdGhlIGluQnVmZmVyIHN0YXRl
IGlzIG5vdCBhbGxvd2VkIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgInNob3VsZCBub3QgaGFw
cGVuIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBNb3N0IGxpa2VseSAiICsKLSAgICAgICAg
ICAgICAgICAgInRoZXJlIGlzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIFRoaXMgbWF5IGJl
IGR1ZSB0byAiICsKLSAgICAgICAgICAgICAgICAgImV4Y2Vzc2l2ZSBwcm9wZXJ0eSBjaGFuZ2Ug
bm90aWZpY2F0aW9ucy4iKTsKLSAgfSwKLQotICByZW5kZXJUb0J1ZmZlcklmTmVlZGVkOiBmdW5j
dGlvbiAodmlldywgYnVmZmVyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0gIC8vIEl0
IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJlbmRlcmVkIHZpZXcgdG8gYmUgc2NoZWR1bGVk
IGZvcgotICAvLyBpbnNlcnRpb24uCi0gIGluc2VydEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewotICAg
IHRocm93ICJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVu
IHJlbmRlcmVkIjsKLSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkg
ewotICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewotICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3By
ZVJlbmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2aWV3LmNsZWFyQnVmZmVyKCk7Ci0gICAg
ICB2aWV3LnRyYW5zaXRpb25UbygnaGFzRWxlbWVudCcpOwotICAgIH0KLQotICAgIHJldHVybiB2
YWx1ZTsKLSAgfSwKLQotICBpbnZva2VPYnNlcnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvYnNlcnZl
cikgewotICAgIG9ic2VydmVyLmNhbGwodGFyZ2V0KTsKLSAgfQotfSk7Ci0KLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12
aWV3cwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi12YXIg
aGFzRWxlbWVudCA9IEVtYmVyLlZpZXcuc3RhdGVzLmhhc0VsZW1lbnQgPSBFbWJlci5jcmVhdGUo
RW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQpOwotCi1FbWJlci5tZXJnZShoYXNFbGVtZW50LCB7
Ci0gICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkgewotICAgIHZhciBlbGVtID0gZ2V0KHZpZXcsICdl
bGVtZW50Jyk7Ci0gICAgcmV0dXJuIHNlbCA/IEVtYmVyLiQoc2VsLCBlbGVtKSA6IEVtYmVyLiQo
ZWxlbSk7Ci0gIH0sCi0KLSAgZ2V0RWxlbWVudDogZnVuY3Rpb24odmlldykgewotICAgIHZhciBw
YXJlbnQgPSBnZXQodmlldywgJ3BhcmVudFZpZXcnKTsKLSAgICBpZiAocGFyZW50KSB7IHBhcmVu
dCA9IGdldChwYXJlbnQsICdlbGVtZW50Jyk7IH0KLSAgICBpZiAocGFyZW50KSB7IHJldHVybiB2
aWV3LmZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50KHBhcmVudCk7IH0KLSAgICByZXR1cm4gRW1i
ZXIuJCgiIyIgKyBnZXQodmlldywgJ2VsZW1lbnRJZCcpKVswXTsKLSAgfSwKLQotICBzZXRFbGVt
ZW50OiBmdW5jdGlvbih2aWV3LCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewot
ICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ3ByZVJlbmRlcicpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICB0aHJvdyAiWW91IGNhbm5vdCBzZXQgYW4gZWxlbWVudCB0byBhIG5vbi1udWxsIHZhbHVlIHdo
ZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgRE9NLiI7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHZhbHVlOwotICB9LAotCi0gIC8vIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQg
aW50byB0aGUgRE9NLCByZXJlbmRlcmluZyBpcwotICAvLyBkZWZlcnJlZCB0byBhbGxvdyBiaW5k
aW5ncyB0byBzeW5jaHJvbml6ZS4KLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICB2
aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbENsZWFyUmVuZGVyJyk7Ci0KLSAgICB2aWV3LmNs
ZWFyUmVuZGVyZWRDaGlsZHJlbigpOwotCi0gICAgdmlldy5kb21NYW5hZ2VyLnJlcGxhY2Uodmll
dyk7Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0KLSAgLy8gb25jZSB0aGUgdmlldyBpcyBhbHJl
YWR5IGluIHRoZSBET00sIGRlc3Ryb3lpbmcgaXQgcmVtb3ZlcyBpdAotICAvLyBmcm9tIHRoZSBE
T00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8gdGhlCi0gIC8vIHBy
ZVJlbmRlciBzdGF0ZSBpZiBpbkRPTS4KLQotICBkZXN0cm95RWxlbWVudDogZnVuY3Rpb24odmll
dykgewotICAgIHZpZXcuX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudCgpOwotICAgIHZpZXcuZG9t
TWFuYWdlci5yZW1vdmUodmlldyk7Ci0gICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7Ci0g
ICAgaWYgKHZpZXcuX3NjaGVkdWxlZEluc2VydCkgewotICAgICAgRW1iZXIucnVuLmNhbmNlbCh2
aWV3Ll9zY2hlZHVsZWRJbnNlcnQpOwotICAgICAgdmlldy5fc2NoZWR1bGVkSW5zZXJ0ID0gbnVs
bDsKLSAgICB9Ci0gICAgcmV0dXJuIHZpZXc7Ci0gIH0sCi0KLSAgZW1wdHk6IGZ1bmN0aW9uKHZp
ZXcpIHsKLSAgICB2YXIgX2NoaWxkVmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzLCBsZW4sIGlkeDsK
LSAgICBpZiAoX2NoaWxkVmlld3MpIHsKLSAgICAgIGxlbiA9IF9jaGlsZFZpZXdzLmxlbmd0aDsK
LSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewotICAgICAgICBfY2hpbGRW
aWV3c1tpZHhdLl9ub3RpZnlXaWxsRGVzdHJveUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0g
ICAgdmlldy5kb21NYW5hZ2VyLmVtcHR5KHZpZXcpOwotICB9LAotCi0gIC8vIEhhbmRsZSBldmVu
dHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYAotICBoYW5kbGVFdmVudDogZnVuY3Rpb24o
dmlldywgZXZlbnROYW1lLCBldnQpIHsKLSAgICBpZiAodmlldy5oYXMoZXZlbnROYW1lKSkgewot
ICAgICAgLy8gSGFuZGxlciBzaG91bGQgYmUgYWJsZSB0byByZS1kaXNwYXRjaCBldmVudHMsIHNv
IHdlIGRvbid0Ci0gICAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciBzdG9wUHJvcGFnYXRpb24uCi0g
ICAgICByZXR1cm4gdmlldy50cmlnZ2VyKGV2ZW50TmFtZSwgZXZ0KTsKLSAgICB9IGVsc2Ugewot
ICAgICAgcmV0dXJuIHRydWU7IC8vIGNvbnRpbnVlIGV2ZW50IHByb3BhZ2F0aW9uCi0gICAgfQot
ICB9LAotCi0gIGludm9rZU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9ic2VydmVyKSB7Ci0g
ICAgb2JzZXJ2ZXIuY2FsbCh0YXJnZXQpOwotICB9Ci19KTsKLQotdmFyIGluRE9NID0gRW1iZXIu
Vmlldy5zdGF0ZXMuaW5ET00gPSBFbWJlci5jcmVhdGUoaGFzRWxlbWVudCk7Ci0KLUVtYmVyLm1l
cmdlKGluRE9NLCB7Ci0gIGVudGVyOiBmdW5jdGlvbih2aWV3KSB7Ci0gICAgLy8gUmVnaXN0ZXIg
dGhlIHZpZXcgZm9yIGV2ZW50IGhhbmRsaW5nLiBUaGlzIGhhc2ggaXMgdXNlZCBieQotICAgIC8v
IEVtYmVyLkV2ZW50RGlzcGF0Y2hlciB0byBkaXNwYXRjaCBpbmNvbWluZyBldmVudHMuCi0gICAg
aWYgKCF2aWV3LmlzVmlydHVhbCkgewotICAgICAgRW1iZXIuYXNzZXJ0KCJBdHRlbXB0ZWQgdG8g
cmVnaXN0ZXIgYSB2aWV3IHdpdGggYW4gaWQgYWxyZWFkeSBpbiB1c2U6ICIrdmlldy5lbGVtZW50
SWQsICFFbWJlci5WaWV3LnZpZXdzW3ZpZXcuZWxlbWVudElkXSk7Ci0gICAgICBFbWJlci5WaWV3
LnZpZXdzW3ZpZXcuZWxlbWVudElkXSA9IHZpZXc7Ci0gICAgfQotCi0gICAgdmlldy5hZGRCZWZv
cmVPYnNlcnZlcignZWxlbWVudElkJywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aHJvdyBuZXcgRW1i
ZXIuRXJyb3IoIkNoYW5naW5nIGEgdmlldydzIGVsZW1lbnRJZCBhZnRlciBjcmVhdGlvbiBpcyBu
b3QgYWxsb3dlZCIpOwotICAgIH0pOwotICB9LAotCi0gIGV4aXQ6IGZ1bmN0aW9uKHZpZXcpIHsK
LSAgICBpZiAoIXRoaXMuaXNWaXJ0dWFsKSBkZWxldGUgRW1iZXIuVmlldy52aWV3c1t2aWV3LmVs
ZW1lbnRJZF07Ci0gIH0sCi0KLSAgaW5zZXJ0RWxlbWVudDogZnVuY3Rpb24odmlldywgZm4pIHsK
LSAgICB0aHJvdyAiWW91IGNhbid0IGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlIERPTSB0aGF0
IGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQiOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwot
Ki8KLQotdmFyIGRlc3Ryb3lpbmdFcnJvciA9ICJZb3UgY2FuJ3QgY2FsbCAlQCBvbiBhIHZpZXcg
YmVpbmcgZGVzdHJveWVkIiwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKLQotdmFyIGRlc3Ryb3lp
bmcgPSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95aW5nID0gRW1iZXIuY3JlYXRlKEVtYmVyLlZp
ZXcuc3RhdGVzLl9kZWZhdWx0KTsKLQotRW1iZXIubWVyZ2UoZGVzdHJveWluZywgewotICBhcHBl
bmRDaGlsZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWydh
cHBlbmRDaGlsZCddKTsKLSAgfSwKLSAgcmVyZW5kZXI6IGZ1bmN0aW9uKCkgewotICAgIHRocm93
IGZtdChkZXN0cm95aW5nRXJyb3IsIFsncmVyZW5kZXInXSk7Ci0gIH0sCi0gIGRlc3Ryb3lFbGVt
ZW50OiBmdW5jdGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbJ2Rlc3Ry
b3lFbGVtZW50J10pOwotICB9LAotICBlbXB0eTogZnVuY3Rpb24oKSB7Ci0gICAgdGhyb3cgZm10
KGRlc3Ryb3lpbmdFcnJvciwgWydlbXB0eSddKTsKLSAgfSwKLQotICBzZXRFbGVtZW50OiBmdW5j
dGlvbigpIHsKLSAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbInNldCgnZWxlbWVudCcs
IC4uLikiXSk7Ci0gIH0sCi0KLSAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7
Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9LAotCi0gIC8vIFNpbmNlIGVsZW1lbnQgaW5zZXJ0aW9u
IGlzIHNjaGVkdWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcgaWYKLSAgLy8gdGhlIHZpZXcgaGFzIGJl
ZW4gZGVzdHJveWVkIGJldHdlZW4gc2NoZWR1bGluZyBhbmQgZXhlY3V0aW9uCi0gIGluc2VydEVs
ZW1lbnQ6IEVtYmVyLksKLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1FbWJl
ci5WaWV3LmNsb25lU3RhdGVzID0gZnVuY3Rpb24oZnJvbSkgewotICB2YXIgaW50byA9IHt9Owot
Ci0gIGludG8uX2RlZmF1bHQgPSB7fTsKLSAgaW50by5wcmVSZW5kZXIgPSBFbWJlci5jcmVhdGUo
aW50by5fZGVmYXVsdCk7Ci0gIGludG8uZGVzdHJveWluZyA9IEVtYmVyLmNyZWF0ZShpbnRvLl9k
ZWZhdWx0KTsKLSAgaW50by5pbkJ1ZmZlciA9IEVtYmVyLmNyZWF0ZShpbnRvLl9kZWZhdWx0KTsK
LSAgaW50by5oYXNFbGVtZW50ID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQpOwotICBpbnRv
LmluRE9NID0gRW1iZXIuY3JlYXRlKGludG8uaGFzRWxlbWVudCk7Ci0KLSAgZm9yICh2YXIgc3Rh
dGVOYW1lIGluIGZyb20pIHsKLSAgICBpZiAoIWZyb20uaGFzT3duUHJvcGVydHkoc3RhdGVOYW1l
KSkgeyBjb250aW51ZTsgfQotICAgIEVtYmVyLm1lcmdlKGludG9bc3RhdGVOYW1lXSwgZnJvbVtz
dGF0ZU5hbWVdKTsKLSAgfQotCi0gIHJldHVybiBpbnRvOwotfTsKLQotfSkoKTsKLQotCi0KLShm
dW5jdGlvbigpIHsKLXZhciBzdGF0ZXMgPSBFbWJlci5WaWV3LmNsb25lU3RhdGVzKEVtYmVyLlZp
ZXcuc3RhdGVzKTsKLQotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdz
Ci0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci12YXIgZm9yRWFj
aCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwotdmFyIFZpZXdDb2xsZWN0aW9uID0g
RW1iZXIuX1ZpZXdDb2xsZWN0aW9uOwotCi0vKioKLSAgQSBgQ29udGFpbmVyVmlld2AgaXMgYW4g
YEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRoYXQgaW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5
YAotICBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFuYWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3Mu
Ci0KLSAgIyMgU2V0dGluZyBJbml0aWFsIENoaWxkIFZpZXdzCi0KLSAgVGhlIGluaXRpYWwgYXJy
YXkgb2YgY2hpbGQgdmlld3MgY2FuIGJlIHNldCBpbiBvbmUgb2YgdHdvIHdheXMuIFlvdSBjYW4K
LSAgcHJvdmlkZSBhIGBjaGlsZFZpZXdzYCBwcm9wZXJ0eSBhdCBjcmVhdGlvbiB0aW1lIHRoYXQg
Y29udGFpbnMgaW5zdGFuY2Ugb2YKLSAgYEVtYmVyLlZpZXdgOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKLSAgICBjaGlsZFZp
ZXdzOiBbRW1iZXIuVmlldy5jcmVhdGUoKSwgRW1iZXIuVmlldy5jcmVhdGUoKV0KLSAgfSk7Ci0g
IGBgYAotCi0gIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB3
aG9zZSB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZgotICBgRW1iZXIuVmlld2A6Ci0KLSAgYGBgamF2
YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewotICAg
IGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcnLCAnY1ZpZXcnXSwKLSAgICBhVmlldzogRW1i
ZXIuVmlldy5jcmVhdGUoKSwKLSAgICBiVmlldzogRW1iZXIuVmlldy5jcmVhdGUoKSwKLSAgICBj
VmlldzogRW1iZXIuVmlldy5jcmVhdGUoKQotICB9KTsKLSAgYGBgCi0KLSAgVGhlIHR3byBzdHJh
dGVnaWVzIGNhbiBiZSBjb21iaW5lZDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIGFDb250YWluZXIg
PSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0ZSh7Ci0gICAgY2hpbGRWaWV3czogWydhVmlldycs
IEVtYmVyLlZpZXcuY3JlYXRlKCldLAotICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCi0g
IH0pOwotICBgYGAKLQotICBFYWNoIGNoaWxkIHZpZXcncyByZW5kZXJpbmcgd2lsbCBiZSBpbnNl
cnRlZCBpbnRvIHRoZSBjb250YWluZXIncyByZW5kZXJlZAotICBIVE1MIGluIHRoZSBzYW1lIG9y
ZGVyIGFzIGl0cyBwb3NpdGlvbiBpbiB0aGUgYGNoaWxkVmlld3NgIHByb3BlcnR5LgotCi0gICMj
IEFkZGluZyBhbmQgUmVtb3ZpbmcgQ2hpbGQgVmlld3MKLQotICBUaGUgY29udGFpbmVyIHZpZXcg
aW1wbGVtZW50cyBgRW1iZXIuTXV0YWJsZUFycmF5YCBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFu
YWdlbWVudCBvZiBpdHMgY2hpbGQgdmlld3MuCi0KLSAgVG8gcmVtb3ZlIGEgdmlldywgcGFzcyB0
aGF0IHZpZXcgaW50byBhIGByZW1vdmVPYmplY3RgIGNhbGwgb24gdGhlIGNvbnRhaW5lciB2aWV3
LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIHRoZSBmb2xsb3dpbmcgY29kZQotCi0gIGBg
YGphdmFzY3JpcHQKLSAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsK
LSAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWluZXInXSwKLSAgICBjaGlsZFZpZXdzOiBbJ2FW
aWV3JywgJ2JWaWV3J10sCi0gICAgYVZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkEiKQotICAgIH0pLAotICAgIGJWaWV3
OiBFbWJlci5WaWV3LmNyZWF0ZSh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCJCIikKLSAgICB9KQotICB9KTsKLQotICBhQ29udGFpbmVyLmFwcGVuZFRvKCdib2R5
Jyk7Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4KLSAgPC9k
aXY+Ci0gIGBgYAotCi0gIFJlbW92aW5nIGEgdmlldwotCi0gIGBgYGphdmFzY3JpcHQKLSAgYUNv
bnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRhaW5lci5iVmll
d10KLSAgYUNvbnRhaW5lci5yZW1vdmVPYmplY3QoYUNvbnRhaW5lci5nZXQoJ2JWaWV3JykpOwot
ICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3XQotICBgYGAKLQot
ICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwKLQotICBgYGBodG1sCi0gIDxkaXYg
Y2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXIt
dmlldyI+QTwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgU2ltaWxhcmx5LCBhZGRpbmcgYSBj
aGlsZCB2aWV3IGlzIGFjY29tcGxpc2hlZCBieSBhZGRpbmcgYEVtYmVyLlZpZXdgIGluc3RhbmNl
cyB0byB0aGUKLSAgY29udGFpbmVyIHZpZXcuCi0KLSAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAg
dGhlIGZvbGxvd2luZyBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBhQ29udGFpbmVyID0gRW1i
ZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewotICAgIGNsYXNzTmFtZXM6IFsndGhlLWNvbnRhaW5l
ciddLAotICAgIGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcnXSwKLSAgICBhVmlldzogRW1i
ZXIuVmlldy5jcmVhdGUoewotICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGls
ZSgiQSIpCi0gICAgfSksCi0gICAgYlZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkIiKQotICAgIH0pCi0gIH0pOwotCi0g
IGFDb250YWluZXIuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUg
SFRNTAotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVy
Ij4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5BPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0i
ZW1iZXItdmlldyI+QjwvZGl2PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgQWRkaW5nIGEgdmlldwot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgQW5vdGhlclZpZXdDbGFzcyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJBbm90aGVyIHZpZXci
KQotICB9KTsKLQotICBhQ29udGFpbmVyLnRvQXJyYXkoKTsgIC8vIFthQ29udGFpbmVyLmFWaWV3
LCBhQ29udGFpbmVyLmJWaWV3XQotICBhQ29udGFpbmVyLnB1c2hPYmplY3QoQW5vdGhlclZpZXdD
bGFzcy5jcmVhdGUoKSk7Ci0gIGFDb250YWluZXIudG9BcnJheSgpOyAvLyBbYUNvbnRhaW5lci5h
VmlldywgYUNvbnRhaW5lci5iVmlldywgPEFub3RoZXJWaWV3Q2xhc3MgaW5zdGFuY2U+XQotICBg
YGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwKLQotICBgYGBodG1sCi0g
IDxkaXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+Ci0gICAgPGRpdiBjbGFzcz0i
ZW1iZXItdmlldyI+QTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4K
LSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5Bbm90aGVyIHZpZXc8L2Rpdj4KLSAgPC9kaXY+
Ci0gIGBgYAotCi0gICMjIFRlbXBsYXRlcyBhbmQgTGF5b3V0Ci0KLSAgQSBgdGVtcGxhdGVgLCBg
dGVtcGxhdGVOYW1lYCwgYGRlZmF1bHRUZW1wbGF0ZWAsIGBsYXlvdXRgLCBgbGF5b3V0TmFtZWAg
b3IKLSAgYGRlZmF1bHRMYXlvdXRgIHByb3BlcnR5IG9uIGEgY29udGFpbmVyIHZpZXcgd2lsbCBu
b3QgcmVzdWx0IGluIHRoZSB0ZW1wbGF0ZQotICBvciBsYXlvdXQgYmVpbmcgcmVuZGVyZWQuIFRo
ZSBIVE1MIGNvbnRlbnRzIG9mIGEgYEVtYmVyLkNvbnRhaW5lclZpZXdgJ3MgRE9NCi0gIHJlcHJl
c2VudGF0aW9uIHdpbGwgb25seSBiZSB0aGUgcmVuZGVyZWQgSFRNTCBvZiBpdHMgY2hpbGQgdmll
d3MuCi0KLSAgQGNsYXNzIENvbnRhaW5lclZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ29udGFpbmVyVmlldyA9IEVtYmVyLlZpZXcuZXh0
ZW5kKEVtYmVyLk11dGFibGVBcnJheSwgewotICBzdGF0ZXM6IHN0YXRlcywKLQotICBpbml0OiBm
dW5jdGlvbigpIHsKLSAgICB0aGlzLl9zdXBlcigpOwotCi0gICAgdmFyIGNoaWxkVmlld3MgPSBn
ZXQodGhpcywgJ2NoaWxkVmlld3MnKTsKLQotICAgIC8vIHJlZGVmaW5lIHZpZXcncyBjaGlsZFZp
ZXdzIHByb3BlcnR5IHRoYXQgd2FzIG9ibGl0ZXJhdGVkCi0gICAgRW1iZXIuZGVmaW5lUHJvcGVy
dHkodGhpcywgJ2NoaWxkVmlld3MnLCBFbWJlci5WaWV3LmNoaWxkVmlld3NQcm9wZXJ0eSk7Ci0K
LSAgICB2YXIgX2NoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOwotCi0gICAgZm9yRWFjaChj
aGlsZFZpZXdzLCBmdW5jdGlvbih2aWV3TmFtZSwgaWR4KSB7Ci0gICAgICB2YXIgdmlldzsKLQot
ICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygdmlld05hbWUpIHsKLSAgICAgICAgdmlldyA9
IGdldCh0aGlzLCB2aWV3TmFtZSk7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmll
dyh2aWV3KTsKLSAgICAgICAgc2V0KHRoaXMsIHZpZXdOYW1lLCB2aWV3KTsKLSAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgIHZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3TmFtZSk7Ci0gICAg
ICB9Ci0KLSAgICAgIF9jaGlsZFZpZXdzW2lkeF0gPSB2aWV3OwotICAgIH0sIHRoaXMpOwotCi0g
ICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOwotICAgIGlmIChj
dXJyZW50VmlldykgewotICAgICAgaWYgKCFfY2hpbGRWaWV3cy5sZW5ndGgpIHsgX2NoaWxkVmll
d3MgPSB0aGlzLl9jaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cy5zbGljZSgpOyB9Ci0gICAg
ICBfY2hpbGRWaWV3cy5wdXNoKHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGN1cnJlbnRWaWV3KSk7Ci0g
ICAgfQotICB9LAotCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKGlkeCwgcmVtb3ZlZENvdW50LCBhZGRl
ZFZpZXdzKSB7Ci0gICAgdmFyIGFkZGVkQ291bnQgPSBhZGRlZFZpZXdzID8gZ2V0KGFkZGVkVmll
d3MsICdsZW5ndGgnKSA6IDA7Ci0gICAgdmFyIHNlbGYgPSB0aGlzOwotICAgIEVtYmVyLmFzc2Vy
dCgiWW91IGNhbid0IGFkZCBhIGNoaWxkIHRvIGEgY29udGFpbmVyIHRoYXQgaXMgYWxyZWFkeSBh
IGNoaWxkIG9mIGFub3RoZXIgdmlldyIsIEVtYmVyLkEoYWRkZWRWaWV3cykuZXZlcnkoZnVuY3Rp
b24oaXRlbSkgeyByZXR1cm4gIWdldChpdGVtLCAnX3BhcmVudFZpZXcnKSB8fCBnZXQoaXRlbSwg
J19wYXJlbnRWaWV3JykgPT09IHNlbGY7IH0pKTsKLQotICAgIHRoaXMuYXJyYXlDb250ZW50V2ls
bENoYW5nZShpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7Ci0gICAgdGhpcy5jaGlsZFZp
ZXdzV2lsbENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3VudCk7Ci0KLSAg
ICBpZiAoYWRkZWRDb3VudCA9PT0gMCkgewotICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2Uo
aWR4LCByZW1vdmVkQ291bnQpIDsKLSAgICB9IGVsc2UgewotICAgICAgdmFyIGFyZ3MgPSBbaWR4
LCByZW1vdmVkQ291bnRdLmNvbmNhdChhZGRlZFZpZXdzKTsKLSAgICAgIGlmIChhZGRlZFZpZXdz
Lmxlbmd0aCAmJiAhdGhpcy5fY2hpbGRWaWV3cy5sZW5ndGgpIHsgdGhpcy5fY2hpbGRWaWV3cyA9
IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsgfQotICAgICAgdGhpcy5fY2hpbGRWaWV3cy5zcGxp
Y2UuYXBwbHkodGhpcy5fY2hpbGRWaWV3cywgYXJncyk7Ci0gICAgfQotCi0gICAgdGhpcy5hcnJh
eUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkQ291bnQpOwotICAgIHRo
aXMuY2hpbGRWaWV3c0RpZENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92ZWRDb3Vu
dCwgYWRkZWRDb3VudCk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfSwKLQotICBvYmplY3RBdDog
ZnVuY3Rpb24oaWR4KSB7Ci0gICAgcmV0dXJuIHRoaXMuX2NoaWxkVmlld3NbaWR4XTsKLSAgfSwK
LQotICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKLSAgICByZXR1cm4gdGhp
cy5fY2hpbGRWaWV3cy5sZW5ndGg7Ci0gIH0pLnZvbGF0aWxlKCksCi0KLSAgLyoqCi0gICAgSW5z
dHJ1Y3RzIGVhY2ggY2hpbGQgdmlldyB0byByZW5kZXIgdG8gdGhlIHBhc3NlZCByZW5kZXIgYnVm
ZmVyLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHJlbmRlcgotICAgIEBwYXJhbSB7RW1i
ZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIGJ1ZmZlciB0byByZW5kZXIgdG8KLSAgKi8KLSAg
cmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVu
Y3Rpb24odmlldykgewotICAgICAgdmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOwotICAgIH0p
OwotICB9LAotCi0gIGluc3RydW1lbnROYW1lOiAnY29udGFpbmVyJywKLQotICAvKioKLSAgICBX
aGVuIGEgY2hpbGQgdmlldyBpcyByZW1vdmVkLCBkZXN0cm95IGl0cyBlbGVtZW50IHNvIHRoYXQK
LSAgICBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4KLQotICAgIFRoZSBhcnJheSBvYnNlcnZl
ciB0aGF0IHRyaWdnZXJzIHRoaXMgYWN0aW9uIGlzIHNldCB1cCBpbiB0aGUKLSAgICBgcmVuZGVy
VG9CdWZmZXJgIG1ldGhvZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBjaGlsZFZpZXdz
V2lsbENoYW5nZQotICAgIEBwYXJhbSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBjaGlsZCB2aWV3
cyBhcnJheSBiZWZvcmUgbXV0YXRpb24KLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIHN0
YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVk
IHRoZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAotICAqKi8KLSAgY2hpbGRWaWV3c1dp
bGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCkgewotICAgIHRoaXMucHJv
cGVydHlXaWxsQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0KLSAgICBpZiAocmVtb3ZlZCA+IDApIHsK
LSAgICAgIHZhciBjaGFuZ2VkVmlld3MgPSB2aWV3cy5zbGljZShzdGFydCwgc3RhcnQrcmVtb3Zl
ZCk7Ci0gICAgICAvLyB0cmFuc2l0aW9uIHRvIHByZVJlbmRlciBiZWZvcmUgY2xlYXJpbmcgcGFy
ZW50VmlldwotICAgICAgdGhpcy5jdXJyZW50U3RhdGUuY2hpbGRWaWV3c1dpbGxDaGFuZ2UodGhp
cywgdmlld3MsIHN0YXJ0LCByZW1vdmVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNo
YW5nZWRWaWV3cywgbnVsbCwgbnVsbCk7Ci0gICAgfQotICB9LAotCi0gIHJlbW92ZUNoaWxkOiBm
dW5jdGlvbihjaGlsZCkgewotICAgIHRoaXMucmVtb3ZlT2JqZWN0KGNoaWxkKTsKLSAgICByZXR1
cm4gdGhpczsKLSAgfSwKLQotICAvKioKLSAgICBXaGVuIGEgY2hpbGQgdmlldyBpcyBhZGRlZCwg
bWFrZSBzdXJlIHRoZSBET00gZ2V0cyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCi0KLSAgICBJZiB0
aGUgdmlldyBoYXMgYWxyZWFkeSByZW5kZXJlZCBhbiBlbGVtZW50LCB3ZSB0ZWxsIHRoZSBjaGls
ZCB2aWV3IHRvCi0gICAgY3JlYXRlIGFuIGVsZW1lbnQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBE
T00uIElmIHRoZSBlbmNsb3NpbmcgY29udGFpbmVyCi0gICAgdmlldyBoYXMgYWxyZWFkeSB3cml0
dGVuIHRvIGEgYnVmZmVyLCBidXQgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBidWZmZXIKLSAgICBp
bnRvIGFuIGVsZW1lbnQsIHdlIGluc2VydCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRo
ZSBjaGlsZCBpbnRvIHRoZQotICAgIGFwcHJvcHJpYXRlIHBsYWNlIGluIHRoZSBidWZmZXIuCi0K
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgY2hpbGRWaWV3c0RpZENoYW5nZQotICAgIEBwYXJh
bSB7RW1iZXIuQXJyYXl9IHZpZXdzIHRoZSBhcnJheSBvZiBjaGlsZCB2aWV3cyBhZnRlIHRoZSBt
dXRhdGlvbiBoYXMgb2NjdXJyZWQKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIHN0YXJ0
IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlvbgotICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIHRo
ZSBudW1iZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAotICAgIEBwYXJhbSB7TnVtYmVyfSB0aGUg
bnVtYmVyIG9mIGNoaWxkIHZpZXdzIGFkZGVkCi0gICovCi0gIGNoaWxkVmlld3NEaWRDaGFuZ2U6
IGZ1bmN0aW9uKHZpZXdzLCBzdGFydCwgcmVtb3ZlZCwgYWRkZWQpIHsKLSAgICBpZiAoYWRkZWQg
PiAwKSB7Ci0gICAgICB2YXIgY2hhbmdlZFZpZXdzID0gdmlld3Muc2xpY2Uoc3RhcnQsIHN0YXJ0
K2FkZGVkKTsKLSAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdzKGNoYW5nZWRWaWV3cywgdGhpcywg
Z2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKSk7Ci0gICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5jaGls
ZFZpZXdzRGlkQ2hhbmdlKHRoaXMsIHZpZXdzLCBzdGFydCwgYWRkZWQpOwotICAgIH0KLSAgICB0
aGlzLnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Ci0gIH0sCi0KLSAgaW5pdGlhbGl6
ZVZpZXdzOiBmdW5jdGlvbih2aWV3cywgcGFyZW50VmlldywgdGVtcGxhdGVEYXRhKSB7Ci0gICAg
Zm9yRWFjaCh2aWV3cywgZnVuY3Rpb24odmlldykgewotICAgICAgc2V0KHZpZXcsICdfcGFyZW50
VmlldycsIHBhcmVudFZpZXcpOwotCi0gICAgICBpZiAoIXZpZXcuY29udGFpbmVyICYmIHBhcmVu
dFZpZXcpIHsKLSAgICAgICAgc2V0KHZpZXcsICdjb250YWluZXInLCBwYXJlbnRWaWV3LmNvbnRh
aW5lcik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkg
ewotICAgICAgICBzZXQodmlldywgJ3RlbXBsYXRlRGF0YScsIHRlbXBsYXRlRGF0YSk7Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gIH0sCi0KLSAgY3VycmVudFZpZXc6IG51bGwsCi0KLSAgX2N1cnJlbnRW
aWV3V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2N1cnJlbnRWaWV3JywgZnVuY3Rp
b24oKSB7Ci0gICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50VmlldycpOwot
ICAgIGlmIChjdXJyZW50VmlldykgewotICAgICAgY3VycmVudFZpZXcuZGVzdHJveSgpOwotICAg
IH0KLSAgfSksCi0KLSAgX2N1cnJlbnRWaWV3RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY3Vy
cmVudFZpZXcnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgY3VycmVudFZpZXcgPSBnZXQodGhpcywg
J2N1cnJlbnRWaWV3Jyk7Ci0gICAgaWYgKGN1cnJlbnRWaWV3KSB7Ci0gICAgICBFbWJlci5hc3Nl
cnQoIllvdSB0cmllZCB0byBzZXQgYSBjdXJyZW50IHZpZXcgdGhhdCBhbHJlYWR5IGhhcyBhIHBh
cmVudC4gTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIG11bHRpcGxlIG91dGxldHMgaW4gdGhlIHNh
bWUgdmlldy4iLCAhZ2V0KGN1cnJlbnRWaWV3LCAnX3BhcmVudFZpZXcnKSk7Ci0gICAgICB0aGlz
LnB1c2hPYmplY3QoY3VycmVudFZpZXcpOwotICAgIH0KLSAgfSksCi0KLSAgX2Vuc3VyZUNoaWxk
cmVuQXJlSW5ET006IGZ1bmN0aW9uICgpIHsKLSAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbnN1cmVD
aGlsZHJlbkFyZUluRE9NKHRoaXMpOwotICB9Ci19KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLl9k
ZWZhdWx0LCB7Ci0gIGNoaWxkVmlld3NXaWxsQ2hhbmdlOiBFbWJlci5LLAotICBjaGlsZFZpZXdz
RGlkQ2hhbmdlOiBFbWJlci5LLAotICBlbnN1cmVDaGlsZHJlbkFyZUluRE9NOiBFbWJlci5LCi19
KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmluQnVmZmVyLCB7Ci0gIGNoaWxkVmlld3NEaWRDaGFu
Z2U6IGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXdzLCBzdGFydCwgYWRkZWQpIHsKLSAgICB0aHJv
dyBuZXcgRW1iZXIuRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGNoaWxkIHZpZXdzIHdoaWxlIGlu
IHRoZSBpbkJ1ZmZlciBzdGF0ZScpOwotICB9Ci19KTsKLQotRW1iZXIubWVyZ2Uoc3RhdGVzLmhh
c0VsZW1lbnQsIHsKLSAgY2hpbGRWaWV3c1dpbGxDaGFuZ2U6IGZ1bmN0aW9uKHZpZXcsIHZpZXdz
LCBzdGFydCwgcmVtb3ZlZCkgewotICAgIGZvciAodmFyIGk9c3RhcnQ7IGk8c3RhcnQrcmVtb3Zl
ZDsgaSsrKSB7Ci0gICAgICB2aWV3c1tpXS5yZW1vdmUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgY2hp
bGRWaWV3c0RpZENoYW5nZTogZnVuY3Rpb24odmlldywgdmlld3MsIHN0YXJ0LCBhZGRlZCkgewot
ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHZpZXcsICdfZW5zdXJlQ2hpbGRy
ZW5BcmVJbkRPTScpOwotICB9LAotCi0gIGVuc3VyZUNoaWxkcmVuQXJlSW5ET006IGZ1bmN0aW9u
KHZpZXcpIHsKLSAgICB2YXIgY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3MsIGksIGxlbiwg
Y2hpbGRWaWV3LCBwcmV2aW91cywgYnVmZmVyLCB2aWV3Q29sbGVjdGlvbiA9IG5ldyBWaWV3Q29s
bGVjdGlvbigpOwotCi0gICAgZm9yIChpID0gMCwgbGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7IGkg
PCBsZW47IGkrKykgewotICAgICAgY2hpbGRWaWV3ID0gY2hpbGRWaWV3c1tpXTsKLQotICAgICAg
aWYgKCFidWZmZXIpIHsgYnVmZmVyID0gRW1iZXIuUmVuZGVyQnVmZmVyKCk7IGJ1ZmZlci5faGFz
RWxlbWVudCA9IGZhbHNlOyB9Ci0KLSAgICAgIGlmIChjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXJJ
Zk5lZWRlZChidWZmZXIpKSB7Ci0gICAgICAgIHZpZXdDb2xsZWN0aW9uLnB1c2goY2hpbGRWaWV3
KTsKLSAgICAgIH0gZWxzZSBpZiAodmlld0NvbGxlY3Rpb24ubGVuZ3RoKSB7Ci0gICAgICAgIGlu
c2VydFZpZXdDb2xsZWN0aW9uKHZpZXcsIHZpZXdDb2xsZWN0aW9uLCBwcmV2aW91cywgYnVmZmVy
KTsKLSAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgcHJldmlvdXMgPSBjaGlsZFZpZXc7
Ci0gICAgICAgIHZpZXdDb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAg
ICBwcmV2aW91cyA9IGNoaWxkVmlldzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmlld0Nv
bGxlY3Rpb24ubGVuZ3RoKSB7Ci0gICAgICBpbnNlcnRWaWV3Q29sbGVjdGlvbih2aWV3LCB2aWV3
Q29sbGVjdGlvbiwgcHJldmlvdXMsIGJ1ZmZlcik7Ci0gICAgfQotICB9Ci19KTsKLQotZnVuY3Rp
b24gaW5zZXJ0Vmlld0NvbGxlY3Rpb24odmlldywgdmlld0NvbGxlY3Rpb24sIHByZXZpb3VzLCBi
dWZmZXIpIHsKLSAgdmlld0NvbGxlY3Rpb24udHJpZ2dlclJlY3Vyc2l2ZWx5KCd3aWxsSW5zZXJ0
RWxlbWVudCcpOwotCi0gIGlmIChwcmV2aW91cykgewotICAgIHByZXZpb3VzLmRvbU1hbmFnZXIu
YWZ0ZXIocHJldmlvdXMsIGJ1ZmZlci5zdHJpbmcoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmlldy5k
b21NYW5hZ2VyLnByZXBlbmQodmlldywgYnVmZmVyLnN0cmluZygpKTsKLSAgfQotCi0gIHZpZXdD
b2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24odikgewotICAgIHYudHJhbnNpdGlvblRvKCdpbkRP
TScpOwotICAgIHYucHJvcGVydHlEaWRDaGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICB2LnRyaWdnZXJS
ZWN1cnNpdmVseSgnZGlkSW5zZXJ0RWxlbWVudCcpOwotICB9KTsKLX0KLQotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZp
ZXdzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVt
YmVyLlN0cmluZy5mbXQ7Ci0KLS8qKgotICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIGlzIGFuIGBF
bWJlci5WaWV3YCBkZXNjZW5kZW50IHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZwotICBhIGNvbGxl
Y3Rpb24gKGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBieSBtYWludGFpbmluZyBhIGNo
aWxkIHZpZXcgb2JqZWN0Ci0gIGFuZCBhc3NvY2lhdGVkIERPTSByZXByZXNlbnRhdGlvbiBmb3Ig
ZWFjaCBpdGVtIGluIHRoZSBhcnJheSBhbmQgZW5zdXJpbmcKLSAgdGhhdCBjaGlsZCB2aWV3cyBh
bmQgdGhlaXIgYXNzb2NpYXRlZCByZW5kZXJlZCBIVE1MIGFyZSB1cGRhdGVkIHdoZW4gaXRlbXMg
aW4KLSAgdGhlIGFycmF5IGFyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCi0KLSAgIyMg
U2V0dGluZyBjb250ZW50Ci0KLSAgVGhlIG1hbmFnZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGlz
IHJlZmVyZW5jZWQgYXMgdGhlIGBFbWJlci5Db2xsZWN0aW9uVmlld2AKLSAgaW5zdGFuY2UncyBg
Y29udGVudGAgcHJvcGVydHkuCi0KLSAgYGBgamF2YXNjcmlwdAotICBzb21lSXRlbXNWaWV3ID0g
RW1iZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsKLSAgICBjb250ZW50OiBbJ0EnLCAnQicsJ0Mn
XQotICB9KQotICBgYGAKLQotICBUaGUgdmlldyBmb3IgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0
aW9uIHdpbGwgaGF2ZSBpdHMgYGNvbnRlbnRgIHByb3BlcnR5IHNldAotICB0byB0aGUgaXRlbS4K
LQotICAjIyBTcGVjaWZ5aW5nIGl0ZW1WaWV3Q2xhc3MKLQotICBCeSBkZWZhdWx0IHRoZSB2aWV3
IGNsYXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG1hbmFnZWQgY29sbGVjdGlvbiB3aWxsIGJlIGFu
Ci0gIGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YC4gWW91IGNhbiBzdXBwbHkgYSBkaWZmZXJlbnQg
Y2xhc3MgYnkgc2V0dGluZyB0aGUKLSAgYENvbGxlY3Rpb25WaWV3YCdzIGBpdGVtVmlld0NsYXNz
YCBwcm9wZXJ0eS4KLQotICBHaXZlbiBhbiBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2lu
ZyBjb2RlOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgc29tZUl0ZW1zVmlldyA9IEVtYmVyLkNvbGxl
Y3Rpb25WaWV3LmNyZWF0ZSh7Ci0gICAgY2xhc3NOYW1lczogWydhLWNvbGxlY3Rpb24nXSwKLSAg
ICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBs
ZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQotICAgIH0pCi0gIH0pOwotCi0gIHNvbWVJdGVtc1Zp
ZXcuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MIHN0cnVjdHVyZQotCi0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmll
dyBhLWNvbGxlY3Rpb24iPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6
IEE8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBCPC9kaXY+
Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQzwvZGl2PgotICA8L2Rp
dj4KLSAgYGBgCi0KLSAgIyMgQXV0b21hdGljIG1hdGNoaW5nIG9mIHBhcmVudC9jaGlsZCB0YWdO
YW1lcwotCi0gIFNldHRpbmcgdGhlIGB0YWdOYW1lYCBwcm9wZXJ0eSBvZiBhIGBDb2xsZWN0aW9u
Vmlld2AgdG8gYW55IG9mCi0gICJ1bCIsICJvbCIsICJ0YWJsZSIsICJ0aGVhZCIsICJ0Ym9keSIs
ICJ0Zm9vdCIsICJ0ciIsIG9yICJzZWxlY3QiIHdpbGwgcmVzdWx0Ci0gIGluIHRoZSBpdGVtIHZp
ZXdzIHJlY2VpdmluZyBhbiBhcHByb3ByaWF0ZWx5IG1hdGNoZWQgYHRhZ05hbWVgIHByb3BlcnR5
LgotCi0gIEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIGFuZCB0aGUgZm9sbG93aW5nIGNvZGU6Ci0K
LSAgYGBgamF2YXNjcmlwdAotICBhblVuZG9yZGVyZWRMaXN0VmlldyA9IEVtYmVyLkNvbGxlY3Rp
b25WaWV3LmNyZWF0ZSh7Ci0gICAgdGFnTmFtZTogJ3VsJywKLSAgICBjb250ZW50OiBbJ0EnLCdC
JywnQyddLAotICAgIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBsZXR0ZXI6IHt7dmlldy5jb250
ZW50fX0iKQotICAgIH0pCi0gIH0pOwotCi0gIGFuVW5kb3JkZXJlZExpc3RWaWV3LmFwcGVuZFRv
KCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmUKLQotICBgYGBodG1sCi0gIDx1bCBjbGFzcz0iZW1iZXItdmlldyBhLWNvbGxlY3Rp
b24iPgotICAgIDxsaSBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQTwvbGk+Ci0gICAg
PGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBCPC9saT4KLSAgICA8bGkgY2xhc3M9
ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEM8L2xpPgotICA8L3VsPgotICBgYGAKLQotICBBZGRp
dGlvbmFsIGB0YWdOYW1lYCBwYWlycyBjYW4gYmUgcHJvdmlkZWQgYnkgYWRkaW5nIHRvCi0gIGBF
bWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJfTUFQIGAKLQotICBgYGBqYXZhc2NyaXB0Ci0g
IEVtYmVyLkNvbGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVBbJ2FydGljbGUnXSA9ICdzZWN0aW9u
JwotICBgYGAKLQotICAjIyBQcm9ncmFtbWF0aWMgY3JlYXRpb24gb2YgY2hpbGQgdmlld3MKLQot
ICBGb3IgY2FzZXMgd2hlcmUgYWRkaXRpb25hbCBjdXN0b21pemF0aW9uIGJleW9uZCB0aGUgdXNl
IG9mIGEgc2luZ2xlCi0gIGBpdGVtVmlld0NsYXNzYCBvciBgdGFnTmFtZWAgbWF0Y2hpbmcgaXMg
cmVxdWlyZWQgQ29sbGVjdGlvblZpZXcncwotICBgY3JlYXRlQ2hpbGRWaWV3YCBtZXRob2QgY2Fu
IGJlIG92ZXJpZGRlbjoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEN1c3RvbUNvbGxlY3Rpb25WaWV3
ID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHsKLSAgICBjcmVhdGVDaGlsZFZpZXc6IGZ1
bmN0aW9uKHZpZXdDbGFzcywgYXR0cnMpIHsKLSAgICAgIGlmIChhdHRycy5jb250ZW50LmtpbmQg
PT0gJ2FsYnVtJykgewotICAgICAgICB2aWV3Q2xhc3MgPSBBcHAuQWxidW1WaWV3OwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgdmlld0NsYXNzID0gQXBwLlNvbmdWaWV3OwotICAgICAgfQotICAg
ICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZpZXdDbGFzcywgYXR0cnMpOwotICAgIH0KLSAgfSk7Ci0g
IGBgYAotCi0gICMjIEVtcHR5IFZpZXcKLQotICBZb3UgY2FuIHByb3ZpZGUgYW4gYEVtYmVyLlZp
ZXdgIHN1YmNsYXNzIHRvIHRoZSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgCi0gIGluc3RhbmNlIGFz
IGl0cyBgZW1wdHlWaWV3YCBwcm9wZXJ0eS4gSWYgdGhlIGBjb250ZW50YCBwcm9wZXJ0eSBvZiBh
Ci0gIGBDb2xsZWN0aW9uVmlld2AgaXMgc2V0IHRvIGBudWxsYCBvciBhbiBlbXB0eSBhcnJheSwg
YW4gaW5zdGFuY2Ugb2YgdGhpcyB2aWV3Ci0gIHdpbGwgYmUgdGhlIGBDb2xsZWN0aW9uVmlld2Bz
IG9ubHkgY2hpbGQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBhTGlzdFdpdGhOb3RoaW5nID0gRW1i
ZXIuQ29sbGVjdGlvblZpZXcuY3JlYXRlKHsKLSAgICBjbGFzc05hbWVzOiBbJ25vdGhpbmcnXQot
ICAgIGNvbnRlbnQ6IG51bGwsCi0gICAgZW1wdHlWaWV3OiBFbWJlci5WaWV3LmV4dGVuZCh7Ci0g
ICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJUaGUgY29sbGVjdGlvbiBp
cyBlbXB0eSIpCi0gICAgfSkKLSAgfSk7Ci0KLSAgYUxpc3RXaXRoTm90aGluZy5hcHBlbmRUbygn
Ym9keScpOwotICBgYGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3Ry
dWN0dXJlCi0KLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IG5vdGhpbmciPgot
ICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgICAgVGhlIGNvbGxlY3Rpb24gaXMgZW1w
dHkKLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gICMjIEFkZGluZyBhbmQgUmVtb3Zp
bmcgaXRlbXMKLQotICBUaGUgYGNoaWxkVmlld3NgIHByb3BlcnR5IG9mIGEgYENvbGxlY3Rpb25W
aWV3YCBzaG91bGQgbm90IGJlIGRpcmVjdGx5Ci0gIG1hbmlwdWxhdGVkLiBJbnN0ZWFkLCBhZGQs
IHJlbW92ZSwgcmVwbGFjZSBpdGVtcyBmcm9tIGl0cyBgY29udGVudGAgcHJvcGVydHkuCi0gIFRo
aXMgd2lsbCB0cmlnZ2VyIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gaXRzIHJlbmRlcmVkIEhUTUwu
Ci0KLQotICBAY2xhc3MgQ29sbGVjdGlvblZpZXcKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0
ZW5kcyBFbWJlci5Db250YWluZXJWaWV3Ci0gIEBzaW5jZSBFbWJlciAwLjkKLSovCi1FbWJlci5D
b2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbnRhaW5lclZpZXcuZXh0ZW5kKHsKLQotICAvKioKLSAg
ICBBIGxpc3Qgb2YgaXRlbXMgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBgRW1iZXIuQ29sbGVjdGlv
blZpZXdgLgotCi0gICAgQHByb3BlcnR5IGNvbnRlbnQKLSAgICBAdHlwZSBFbWJlci5BcnJheQot
ICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgY29udGVudDogbnVsbCwKLQotICAvKioKLSAgICBU
aGlzIHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0IHdoYXQga2luZCBvZiBlbXB0eSB2aWV3IGNsYXNz
IHRoaXMKLSAgICBjb2xsZWN0aW9uIHdvdWxkIGxpa2UgaWYgaXQgaXMgYmVpbmcgaW5zdGFudGlh
dGVkIGZyb20gYW5vdGhlcgotICAgIHN5c3RlbSAobGlrZSBIYW5kbGViYXJzKQotCi0gICAgQHBy
aXZhdGUKLSAgICBAcHJvcGVydHkgZW1wdHlWaWV3Q2xhc3MKLSAgKi8KLSAgZW1wdHlWaWV3Q2xh
c3M6IEVtYmVyLlZpZXcsCi0KLSAgLyoqCi0gICAgQW4gb3B0aW9uYWwgdmlldyB0byBkaXNwbGF5
IGlmIGNvbnRlbnQgaXMgc2V0IHRvIGFuIGVtcHR5IGFycmF5LgotCi0gICAgQHByb3BlcnR5IGVt
cHR5VmlldwotICAgIEB0eXBlIEVtYmVyLlZpZXcKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0g
IGVtcHR5VmlldzogbnVsbCwKLQotICAvKioKLSAgICBAcHJvcGVydHkgaXRlbVZpZXdDbGFzcwot
ICAgIEB0eXBlIEVtYmVyLlZpZXcKLSAgICBAZGVmYXVsdCBFbWJlci5WaWV3Ci0gICovCi0gIGl0
ZW1WaWV3Q2xhc3M6IEVtYmVyLlZpZXcsCi0KLSAgLyoqCi0gICAgU2V0dXAgYSBDb2xsZWN0aW9u
VmlldwotCi0gICAgQG1ldGhvZCBpbml0Ci0gICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAg
IHZhciByZXQgPSB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMuX2NvbnRlbnREaWRDaGFuZ2UoKTsK
LSAgICByZXR1cm4gcmV0OwotICB9LAotCi0gIC8qKgotICAgIEludm9rZWQgd2hlbiB0aGUgY29u
dGVudCBwcm9wZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UuIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0
IHRoZQotICAgIGVudGlyZSBhcnJheSBjb250ZW50IHdpbGwgY2hhbmdlLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIF9jb250ZW50V2lsbENoYW5nZQotICAqLwotICBfY29udGVudFdpbGxD
aGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIGNvbnRlbnQgPSB0aGlzLmdldCgnY29udGVudCcpOwotCi0gICAgaWYgKGNvbnRlbnQpIHsg
Y29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMpOyB9Ci0gICAgdmFyIGxlbiA9IGNvbnRl
bnQgPyBnZXQoY29udGVudCwgJ2xlbmd0aCcpIDogMDsKLSAgICB0aGlzLmFycmF5V2lsbENoYW5n
ZShjb250ZW50LCAwLCBsZW4pOwotICB9KSwKLQotICAvKioKLSAgICBDaGVjayB0byBtYWtlIHN1
cmUgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdlZCwgYW5kIGlmIHNvLAotICAgIHVwZGF0ZSB0
aGUgY2hpbGRyZW4gZGlyZWN0bHkuIFRoaXMgaXMgYWx3YXlzIHNjaGVkdWxlZAotICAgIGFzeW5j
aHJvbm91c2x5LCB0byBhbGxvdyB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkIGJlZm9yZQotICAg
IGJpbmRpbmdzIGhhdmUgc3luY2hyb25pemVkIGFuZCB2aWNlIHZlcnNhLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIF9jb250ZW50RGlkQ2hhbmdlCi0gICovCi0gIF9jb250ZW50RGlkQ2hh
bmdlOiBFbWJlci5vYnNlcnZlcignY29udGVudCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250
ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAoY29udGVudCkgewotICAgICAg
dGhpcy5fYXNzZXJ0QXJyYXlMaWtlKGNvbnRlbnQpOwotICAgICAgY29udGVudC5hZGRBcnJheU9i
c2VydmVyKHRoaXMpOwotICAgIH0KLQotICAgIHZhciBsZW4gPSBjb250ZW50ID8gZ2V0KGNvbnRl
bnQsICdsZW5ndGgnKSA6IDA7Ci0gICAgdGhpcy5hcnJheURpZENoYW5nZShjb250ZW50LCAwLCBu
dWxsLCBsZW4pOwotICB9KSwKLQotICAvKioKLSAgICBFbnN1cmUgdGhhdCB0aGUgY29udGVudCBp
bXBsZW1lbnRzIEVtYmVyLkFycmF5Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2Fzc2Vy
dEFycmF5TGlrZQotICAqLwotICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5jdGlvbihjb250ZW50KSB7
Ci0gICAgRW1iZXIuYXNzZXJ0KGZtdCgiYW4gRW1iZXIuQ29sbGVjdGlvblZpZXcncyBjb250ZW50
IG11c3QgaW1wbGVtZW50IEVtYmVyLkFycmF5LiBZb3UgcGFzc2VkICVAIiwgW2NvbnRlbnRdKSwg
RW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVz
IHRoZSBjb250ZW50IGFuZCBjb250ZW50IG9ic2VydmVycy4KLQotICAgIEBtZXRob2QgZGVzdHJv
eQotICAqLwotICBkZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuX3N1cGVyKCkp
IHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpOwot
ICAgIGlmIChjb250ZW50KSB7IGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzKTsgfQot
Ci0gICAgaWYgKHRoaXMuX2NyZWF0ZWRFbXB0eVZpZXcpIHsKLSAgICAgIHRoaXMuX2NyZWF0ZWRF
bXB0eVZpZXcuZGVzdHJveSgpOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0g
IC8qKgotICAgIENhbGxlZCB3aGVuIGEgbXV0YXRpb24gdG8gdGhlIHVuZGVybHlpbmcgY29udGVu
dCBhcnJheSB3aWxsIG9jY3VyLgotCi0gICAgVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgYW55IHZp
ZXdzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgdW5kZXJseWluZwotICAgIGNvbnRlbnQgYXJy
YXkuCi0KLSAgICBJbnZva2VzIHdoZW5ldmVyIHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiB3aWxs
IGNoYW5nZS4KLQotICAgIEBtZXRob2QgYXJyYXlXaWxsQ2hhbmdlCi0gICAgQHBhcmFtIHtBcnJh
eX0gY29udGVudCB0aGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMKLSAgICBAcGFyYW0g
e051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjaGFuZ2VzIHdpbGwgb2NjdXJy
Ci0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgbnVtYmVyIG9mIG9iamVjdCB0byBiZSByZW1v
dmVkIGZyb20gY29udGVudAotICAqLwotICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRl
bnQsIHN0YXJ0LCByZW1vdmVkQ291bnQpIHsKLSAgICAvLyBJZiB0aGUgY29udGVudHMgd2VyZSBl
bXB0eSBiZWZvcmUgYW5kIHRoaXMgdGVtcGxhdGUgY29sbGVjdGlvbiBoYXMgYW4KLSAgICAvLyBl
bXB0eSB2aWV3IHJlbW92ZSBpdCBub3cuCi0gICAgdmFyIGVtcHR5VmlldyA9IGdldCh0aGlzLCAn
ZW1wdHlWaWV3Jyk7Ci0gICAgaWYgKGVtcHR5VmlldyAmJiBlbXB0eVZpZXcgaW5zdGFuY2VvZiBF
bWJlci5WaWV3KSB7Ci0gICAgICBlbXB0eVZpZXcucmVtb3ZlRnJvbVBhcmVudCgpOwotICAgIH0K
LQotICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZCB2aWV3cyB0aGF0IGNvcnJlc3BvbmQgd2l0aCB0
aGUgcmVtb3ZlZCBpdGVtcy4KLSAgICAvLyBOb3RlIHRoYXQgd2UgbG9vcCBmcm9tIHRoZSBlbmQg
b2YgdGhlIGFycmF5IHRvIHRoZSBiZWdpbm5pbmcgYmVjYXVzZQotICAgIC8vIHdlIGFyZSBtdXRh
dGluZyBpdCBhcyB3ZSBnby4KLSAgICB2YXIgY2hpbGRWaWV3cyA9IHRoaXMuX2NoaWxkVmlld3Ms
IGNoaWxkVmlldywgaWR4LCBsZW47Ci0KLSAgICBsZW4gPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0
aDsKLQotICAgIHZhciByZW1vdmluZ0FsbCA9IHJlbW92ZWRDb3VudCA9PT0gbGVuOwotCi0gICAg
aWYgKHJlbW92aW5nQWxsKSB7Ci0gICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbXB0eSh0aGlzKTsK
LSAgICAgIHRoaXMuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24odmlldykgewotICAgICAgICB2
aWV3LnJlbW92ZWRGcm9tRE9NID0gdHJ1ZTsKLSAgICAgIH0sIGZhbHNlKTsKLSAgICB9Ci0KLSAg
ICBmb3IgKGlkeCA9IHN0YXJ0ICsgcmVtb3ZlZENvdW50IC0gMTsgaWR4ID49IHN0YXJ0OyBpZHgt
LSkgewotICAgICAgY2hpbGRWaWV3ID0gY2hpbGRWaWV3c1tpZHhdOwotICAgICAgY2hpbGRWaWV3
LmRlc3Ryb3koKTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4gYSBtdXRh
dGlvbiB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IGFycmF5IG9jY3Vycy4KLQotICAgIFRoaXMg
bWV0aG9kIHdpbGwgcmVwbGF5IHRoYXQgbXV0YXRpb24gYWdhaW5zdCB0aGUgdmlld3MgdGhhdCBj
b21wb3NlIHRoZQotICAgIGBFbWJlci5Db2xsZWN0aW9uVmlld2AsIGVuc3VyaW5nIHRoYXQgdGhl
IHZpZXcgcmVmbGVjdHMgdGhlIG1vZGVsLgotCi0gICAgVGhpcyBhcnJheSBvYnNlcnZlciBpcyBh
ZGRlZCBpbiBgY29udGVudERpZENoYW5nZWAuCi0KLSAgICBAbWV0aG9kIGFycmF5RGlkQ2hhbmdl
Ci0gICAgQHBhcmFtIHtBcnJheX0gY29udGVudCB0aGUgbWFuYWdlZCBjb2xsZWN0aW9uIG9mIG9i
amVjdHMKLSAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBj
aGFuZ2VzIG9jY3VycmVkCi0gICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgbnVtYmVyIG9mIG9i
amVjdCByZW1vdmVkIGZyb20gY29udGVudAotICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRlZCBudW1i
ZXIgb2Ygb2JqZWN0IGFkZGVkIHRvIGNvbnRlbnQKLSAgKi8KLSAgYXJyYXlEaWRDaGFuZ2U6IGZ1
bmN0aW9uKGNvbnRlbnQsIHN0YXJ0LCByZW1vdmVkLCBhZGRlZCkgewotICAgIHZhciBhZGRlZFZp
ZXdzID0gW10sIHZpZXcsIGl0ZW0sIGlkeCwgbGVuLCBpdGVtVmlld0NsYXNzLAotICAgICAgZW1w
dHlWaWV3OwotCi0gICAgbGVuID0gY29udGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAw
OwotCi0gICAgaWYgKGxlbikgewotICAgICAgaXRlbVZpZXdDbGFzcyA9IGdldCh0aGlzLCAnaXRl
bVZpZXdDbGFzcycpOwotCi0gICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0Ns
YXNzKSB7Ci0gICAgICAgIGl0ZW1WaWV3Q2xhc3MgPSBnZXQoaXRlbVZpZXdDbGFzcykgfHwgaXRl
bVZpZXdDbGFzczsKLSAgICAgIH0KLQotICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiaXRlbVZpZXdD
bGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRW1iZXIuVmlldywgbm90ICVAIiwgW2l0ZW1WaWV3
Q2xhc3NdKSwgJ3N0cmluZycgPT09IHR5cGVvZiBpdGVtVmlld0NsYXNzIHx8IEVtYmVyLlZpZXcu
ZGV0ZWN0KGl0ZW1WaWV3Q2xhc3MpKTsKLQotICAgICAgZm9yIChpZHggPSBzdGFydDsgaWR4IDwg
c3RhcnQrYWRkZWQ7IGlkeCsrKSB7Ci0gICAgICAgIGl0ZW0gPSBjb250ZW50Lm9iamVjdEF0KGlk
eCk7Ci0KLSAgICAgICAgdmlldyA9IHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGl0ZW1WaWV3Q2xhc3Ms
IHsKLSAgICAgICAgICBjb250ZW50OiBpdGVtLAotICAgICAgICAgIGNvbnRlbnRJbmRleDogaWR4
Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZGVkVmlld3MucHVzaCh2aWV3KTsKLSAgICAgIH0K
LSAgICB9IGVsc2UgewotICAgICAgZW1wdHlWaWV3ID0gZ2V0KHRoaXMsICdlbXB0eVZpZXcnKTsK
LQotICAgICAgaWYgKCFlbXB0eVZpZXcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIGlmICgnc3RyaW5n
JyA9PT0gdHlwZW9mIGVtcHR5VmlldykgewotICAgICAgICBlbXB0eVZpZXcgPSBnZXQoZW1wdHlW
aWV3KSB8fCBlbXB0eVZpZXc7Ci0gICAgICB9Ci0KLSAgICAgIGVtcHR5VmlldyA9IHRoaXMuY3Jl
YXRlQ2hpbGRWaWV3KGVtcHR5Vmlldyk7Ci0gICAgICBhZGRlZFZpZXdzLnB1c2goZW1wdHlWaWV3
KTsKLSAgICAgIHNldCh0aGlzLCAnZW1wdHlWaWV3JywgZW1wdHlWaWV3KTsKLQotICAgICAgaWYg
KEVtYmVyLkNvcmVWaWV3LmRldGVjdChlbXB0eVZpZXcpKSB7Ci0gICAgICAgIHRoaXMuX2NyZWF0
ZWRFbXB0eVZpZXcgPSBlbXB0eVZpZXc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGhpcy5yZXBs
YWNlKHN0YXJ0LCAwLCBhZGRlZFZpZXdzKTsKLSAgfSwKLQotICAvKioKLSAgICBJbnN0YW50aWF0
ZXMgYSB2aWV3IHRvIGJlIGFkZGVkIHRvIHRoZSBjaGlsZFZpZXdzIGFycmF5IGR1cmluZyB2aWV3
Ci0gICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5lcmFsbHkgd2lsbCBub3QgY2FsbCB0aGlzIG1l
dGhvZCBkaXJlY3RseSB1bmxlc3MKLSAgICB5b3UgYXJlIG92ZXJyaWRpbmcgYGNyZWF0ZUNoaWxk
Vmlld3MoKWAuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsCi0gICAgYXV0b21hdGljYWxseSBj
b25maWd1cmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3Mgb24gdGhlIG5ldyB2aWV3IGluc3RhbmNlIHRv
Ci0gICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC4KLQotICAgIFRoZSB0YWcgbmFtZSBm
b3IgdGhlIHZpZXcgd2lsbCBiZSBzZXQgdG8gdGhlIHRhZ05hbWUgb2YgdGhlIHZpZXdDbGFzcwot
ICAgIHBhc3NlZCBpbi4KLQotICAgIEBtZXRob2QgY3JlYXRlQ2hpbGRWaWV3Ci0gICAgQHBhcmFt
IHtDbGFzc30gdmlld0NsYXNzCi0gICAgQHBhcmFtIHtIYXNofSBbYXR0cnNdIEF0dHJpYnV0ZXMg
dG8gYWRkCi0gICAgQHJldHVybiB7RW1iZXIuVmlld30gbmV3IGluc3RhbmNlCi0gICovCi0gIGNy
ZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24odmlldywgYXR0cnMpIHsKLSAgICB2aWV3ID0gdGhpcy5f
c3VwZXIodmlldywgYXR0cnMpOwotCi0gICAgdmFyIGl0ZW1UYWdOYW1lID0gZ2V0KHZpZXcsICd0
YWdOYW1lJyk7Ci0KLSAgICBpZiAoaXRlbVRhZ05hbWUgPT09IG51bGwgfHwgaXRlbVRhZ05hbWUg
PT09IHVuZGVmaW5lZCkgewotICAgICAgaXRlbVRhZ05hbWUgPSBFbWJlci5Db2xsZWN0aW9uVmll
dy5DT05UQUlORVJfTUFQW2dldCh0aGlzLCAndGFnTmFtZScpXTsKLSAgICAgIHNldCh2aWV3LCAn
dGFnTmFtZScsIGl0ZW1UYWdOYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlldzsKLSAgfQot
fSk7Ci0KLS8qKgotICBBIG1hcCBvZiBwYXJlbnQgdGFncyB0byB0aGVpciBkZWZhdWx0IGNoaWxk
IHRhZ3MuIFlvdSBjYW4gYWRkCi0gIGFkZGl0aW9uYWwgcGFyZW50IHRhZ3MgaWYgeW91IHdhbnQg
Y29sbGVjdGlvbiB2aWV3cyB0aGF0IHVzZQotICBhIHBhcnRpY3VsYXIgcGFyZW50IHRhZyB0byBk
ZWZhdWx0IHRvIGEgY2hpbGQgdGFnLgotCi0gIEBwcm9wZXJ0eSBDT05UQUlORVJfTUFQCi0gIEB0
eXBlIEhhc2gKLSAgQHN0YXRpYwotICBAZmluYWwKLSovCi1FbWJlci5Db2xsZWN0aW9uVmlldy5D
T05UQUlORVJfTUFQID0gewotICB1bDogJ2xpJywKLSAgb2w6ICdsaScsCi0gIHRhYmxlOiAndHIn
LAotICB0aGVhZDogJ3RyJywKLSAgdGJvZHk6ICd0cicsCi0gIHRmb290OiAndHInLAotICB0cjog
J3RkJywKLSAgc2VsZWN0OiAnb3B0aW9uJwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigp
IHsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIu
aXNOb25lLAotICAgIGFfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Ci0KLQotLyoqCi1A
bW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXZpZXdzCi0qLwotCi0vKioKLSAgQW4gYEVt
YmVyLkNvbXBvbmVudGAgaXMgYSB2aWV3IHRoYXQgaXMgY29tcGxldGVseQotICBpc29sYXRlZC4g
UHJvcGVydHkgYWNjZXNzIGluIGl0cyB0ZW1wbGF0ZXMgZ28KLSAgdG8gdGhlIHZpZXcgb2JqZWN0
IGFuZCBhY3Rpb25zIGFyZSB0YXJnZXRlZCBhdAotICB0aGUgdmlldyBvYmplY3QuIFRoZXJlIGlz
IG5vIGFjY2VzcyB0byB0aGUKLSAgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250cm9s
bGVyOyBhbGwKLSAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBtdXN0IGJlIHBhc3NlZCBpbi4KLQot
ICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFuIGBFbWJlci5Db21wb25lbnRgIGlzIHZpYQot
ICBhIHRlbXBsYXRlLiBJZiB5b3UgbmFtZSBhIHRlbXBsYXRlCi0gIGBjb21wb25lbnRzL215LWZv
b2AsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlCi0gIGB7e215LWZvb319YCBpbiBvdGhlciB0ZW1w
bGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQotICBhbiBpbnN0YW5jZSBvZiB0aGUgaXNvbGF0ZWQgY29t
cG9uZW50LgotCi0gIGBgYGh0bWwKLSAge3thcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9
fQotICBgYGAKLQotICBgYGBodG1sCi0gIDwhLS0gYXBwLXByb2ZpbGUgdGVtcGxhdGUgLS0+Ci0g
IDxoMT57e3BlcnNvbi50aXRsZX19PC9oMT4KLSAgPGltZyB7e2JpbmQtYXR0ciBzcmM9cGVyc29u
LmF2YXRhcn19PgotICA8cCBjbGFzcz0nc2lnbmF0dXJlJz57e3BlcnNvbi5zaWduYXR1cmV9fTwv
cD4KLSAgYGBgCi0KLSAgWW91IGNhbiB1c2UgYHlpZWxkYCBpbnNpZGUgYSB0ZW1wbGF0ZSB0bwot
ICBpbmNsdWRlIHRoZSAqKmNvbnRlbnRzKiogb2YgYW55IGJsb2NrIGF0dGFjaGVkIHRvCi0gIHRo
ZSBjb21wb25lbnQuIFRoZSBibG9jayB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZQotICBjb250ZXh0
IG9mIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IG9yIG91dGVyIGNvbnRyb2xsZXI6Ci0KLSAgYGBg
aGFuZGxlYmFycwotICB7eyNhcHAtcHJvZmlsZSBwZXJzb249Y3VycmVudFVzZXJ9fQotICAgIDxw
PkFkbWluIG1vZGU8L3A+Ci0gICAge3shIEV4ZWN1dGVkIGluIHRoZSBjb250cm9sbGVycyBjb250
ZXh0LiB9fQotICB7ey9hcHAtcHJvZmlsZX19Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
PCEtLSBhcHAtcHJvZmlsZSB0ZW1wbGF0ZSAtLT4KLSAgPGgxPnt7cGVyc29uLnRpdGxlfX08L2gx
PgotICB7eyEgRXhlY3V0ZWQgaW4gdGhlIGNvbXBvbmVudHMgY29udGV4dC4gfX0KLSAge3t5aWVs
ZH19IHt7ISBibG9jayBjb250ZW50cyB9fQotICBgYGAKLQotICBJZiB5b3Ugd2FudCB0byBjdXN0
b21pemUgdGhlIGNvbXBvbmVudCwgaW4gb3JkZXIgdG8KLSAgaGFuZGxlIGV2ZW50cyBvciBhY3Rp
b25zLCB5b3UgaW1wbGVtZW50IGEgc3ViY2xhc3MKLSAgb2YgYEVtYmVyLkNvbXBvbmVudGAgbmFt
ZWQgYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlCi0gIGNvbXBvbmVudC4gTm90ZSB0aGF0IGBDb21wb25l
bnRgIG5lZWRzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBuYW1lIG9mCi0gIHlvdXIgc3ViY2xhc3Mg
bGlrZSBgQXBwUHJvZmlsZUNvbXBvbmVudGAuCi0KLSAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBp
bXBsZW1lbnQgdGhlIGFjdGlvbgotICBgaGVsbG9gIGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21w
b25lbnQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwUHJvZmlsZUNvbXBvbmVudCA9IEVt
YmVyLkNvbXBvbmVudC5leHRlbmQoewotICAgIGFjdGlvbnM6IHsKLSAgICAgIGhlbGxvOiBmdW5j
dGlvbihuYW1lKSB7Ci0gICAgICAgIGNvbnNvbGUubG9nKCJIZWxsbyIsIG5hbWUpOwotICAgICAg
fQotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gIEFuZCB0aGVuIHVzZSBpdCBpbiB0aGUgY29tcG9u
ZW50J3MgdGVtcGxhdGU6Ci0KLSAgYGBgaHRtbAotICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRl
IC0tPgotCi0gIDxoMT57e3BlcnNvbi50aXRsZX19PC9oMT4KLSAge3t5aWVsZH19IDwhLS0gYmxv
Y2sgY29udGVudHMgLS0+Ci0KLSAgPGJ1dHRvbiB7e2FjdGlvbiAnaGVsbG8nIHBlcnNvbi5uYW1l
fX0+Ci0gICAgU2F5IEhlbGxvIHRvIHt7cGVyc29uLm5hbWV9fQotICA8L2J1dHRvbj4KLSAgYGBg
Ci0KLSAgQ29tcG9uZW50cyBtdXN0IGhhdmUgYSBgLWAgaW4gdGhlaXIgbmFtZSB0byBhdm9pZAot
ICBjb25mbGljdHMgd2l0aCBidWlsdC1pbiBjb250cm9scyB0aGF0IHdyYXAgSFRNTAotICBlbGVt
ZW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHNhbWUKLSAgcmVxdWlyZW1lbnQgaW4g
d2ViIGNvbXBvbmVudHMuCi0KLSAgQGNsYXNzIENvbXBvbmVudAotICBAbmFtZXNwYWNlIEVtYmVy
Ci0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSovCi1FbWJlci5Db21wb25lbnQgPSBFbWJlci5WaWV3
LmV4dGVuZChFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7Ci0gIGluaXQ6IGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgc2V0KHRoaXMsICdjb250ZXh0JywgdGhpcyk7Ci0g
ICAgc2V0KHRoaXMsICdjb250cm9sbGVyJywgdGhpcyk7Ci0gIH0sCi0KLSAgZGVmYXVsdExheW91
dDogZnVuY3Rpb24ob3B0aW9ucyl7Ci0gICAgb3B0aW9ucy5kYXRhID0ge3ZpZXc6IG9wdGlvbnMu
X2NvbnRleHR9OwotICAgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyc1sneWllbGQnXS5hcHBseSh0
aGlzLCBbb3B0aW9uc10pOwotICB9LAotCi0gIC8vIGR1cmluZyByZW5kZXIsIGlzb2xhdGUga2V5
d29yZHMKLSAgY2xvbmVLZXl3b3JkczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHsKLSAgICAg
IHZpZXc6IHRoaXMsCi0gICAgICBjb250cm9sbGVyOiB0aGlzCi0gICAgfTsKLSAgfSwKLQotICBf
eWllbGQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICB2YXIgdmlldyA9IG9wdGlv
bnMuZGF0YS52aWV3LAotICAgICAgICBwYXJlbnRWaWV3ID0gdGhpcy5fcGFyZW50VmlldywKLSAg
ICAgICAgdGVtcGxhdGUgPSBnZXQodGhpcywgJ3RlbXBsYXRlJyk7Ci0KLSAgICBpZiAodGVtcGxh
dGUpIHsKLSAgICAgIEVtYmVyLmFzc2VydCgiQSBDb21wb25lbnQgbXVzdCBoYXZlIGEgcGFyZW50
IHZpZXcgaW4gb3JkZXIgdG8geWllbGQuIiwgcGFyZW50Vmlldyk7Ci0KLSAgICAgIHZpZXcuYXBw
ZW5kQ2hpbGQoRW1iZXIuVmlldywgewotICAgICAgICBpc1ZpcnR1YWw6IHRydWUsCi0gICAgICAg
IHRhZ05hbWU6ICcnLAotICAgICAgICBfY29udGV4dFZpZXc6IHBhcmVudFZpZXcsCi0gICAgICAg
IHRlbXBsYXRlOiB0ZW1wbGF0ZSwKLSAgICAgICAgY29udGV4dDogZ2V0KHBhcmVudFZpZXcsICdj
b250ZXh0JyksCi0gICAgICAgIGNvbnRyb2xsZXI6IGdldChwYXJlbnRWaWV3LCAnY29udHJvbGxl
cicpLAotICAgICAgICB0ZW1wbGF0ZURhdGE6IHsga2V5d29yZHM6IHBhcmVudFZpZXcuY2xvbmVL
ZXl3b3JkcygpIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBJZiB0aGUg
Y29tcG9uZW50IGlzIGN1cnJlbnRseSBpbnNlcnRlZCBpbnRvIHRoZSBET00gb2YgYSBwYXJlbnQg
dmlldywgdGhpcwotICAgIHByb3BlcnR5IHdpbGwgcG9pbnQgdG8gdGhlIGNvbnRyb2xsZXIgb2Yg
dGhlIHBhcmVudCB2aWV3LgotCi0gICAgQHByb3BlcnR5IHRhcmdldE9iamVjdAotICAgIEB0eXBl
IEVtYmVyLkNvbnRyb2xsZXIKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0gIHRhcmdldE9iamVj
dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHBhcmVudFZpZXcgPSBn
ZXQodGhpcywgJ19wYXJlbnRWaWV3Jyk7Ci0gICAgcmV0dXJuIHBhcmVudFZpZXcgPyBnZXQocGFy
ZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7Ci0gIH0pLnByb3BlcnR5KCdfcGFyZW50Vmll
dycpLAotCi0gIC8qKgotICAgIFRyaWdnZXJzIGEgbmFtZWQgYWN0aW9uIG9uIHRoZSBjb250cm9s
bGVyIGNvbnRleHQgd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1c2VkIGlmCi0gICAgdGhpcyBjb250
cm9sbGVyIGhhcyByZWdpc3RlcmVkIGZvciBub3RpZmljYXRpb25zIG9mIHRoZSBhY3Rpb24uCi0K
LSAgICBGb3IgZXhhbXBsZSBhIGNvbXBvbmVudCBmb3IgcGxheWluZyBvciBwYXVzaW5nIG11c2lj
IG1heSB0cmFuc2xhdGUgY2xpY2sgZXZlbnRzCi0gICAgaW50byBhY3Rpb24gbm90aWZpY2F0aW9u
cyBvZiAicGxheSIgb3IgInN0b3AiIGRlcGVuZGluZyBvbiBzb21lIGludGVybmFsIHN0YXRlCi0g
ICAgb2YgdGhlIGNvbXBvbmVudDoKLQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5QbGF5
QnV0dG9uQ29tcG9uZW50ID0gRW1iZXIuQ29tcG9uZW50LmV4dGVuZCh7Ci0gICAgICBjbGljazog
ZnVuY3Rpb24oKXsKLSAgICAgICAgaWYgKHRoaXMuZ2V0KCdpc1BsYXlpbmcnKSkgewotICAgICAg
ICAgIHRoaXMudHJpZ2dlckFjdGlvbigncGxheScpOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgIHRoaXMudHJpZ2dlckFjdGlvbignc3RvcCcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBXaGVuIHVzZWQgaW5zaWRlIGEgdGVtcGxhdGUgdGhlc2UgY29t
cG9uZW50IGFjdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8KLSAgICB0cmlnZ2VyIGFjdGlvbnMgaW4g
dGhlIG91dGVyIGFwcGxpY2F0aW9uIGNvbnRleHQ6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAg
e3shIGFwcGxpY2F0aW9uLmhicyB9fQotICAgIHt7cGxheS1idXR0b24gcGxheT0ibXVzaWNTdGFy
dGVkIiBzdG9wPSJtdXNpY1N0b3BwZWQifX0KLSAgICBgYGAKLQotICAgIFdoZW4gdGhlIGNvbXBv
bmVudCByZWNlaXZlcyBhIGJyb3dzZXIgYGNsaWNrYCBldmVudCBpdCB0cmFuc2xhdGUgdGhpcwot
ICAgIGludGVyYWN0aW9uIGludG8gYXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICgicGxh
eSIgb3IgInN0b3AiKSBhbmQKLSAgICB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBuYW1l
IG9uIHRoZSBjb250cm9sbGVyIGZvciB0aGUgdGVtcGxhdGUKLSAgICB3aGVyZSB0aGUgY29tcG9u
ZW50IGlzIHVzZWQ6IAotCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9u
Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsK
LSAgICAgICAgbXVzaWNTdGFydGVkOiBmdW5jdGlvbigpewotICAgICAgICAgIC8vIGNhbGxlZCB3
aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlja2VkCi0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNp
YyBzdGFydGVkIHBsYXlpbmcKLSAgICAgICAgfSwKLSAgICAgICAgbXVzaWNTdG9wcGVkOiBmdW5j
dGlvbigpewotICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBjbGlj
a2VkCi0gICAgICAgICAgLy8gYW5kIHRoZSBtdXNpYyBzdG9wcGVkIHBsYXlpbmcKLSAgICAgICAg
fQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgSWYgbm8gYWN0aW9uIG5hbWUgaXMg
cGFzc2VkIHRvIGBzZW5kQWN0aW9uYCBhIGRlZmF1bHQgbmFtZSBvZiAiYWN0aW9uIgotICAgIGlz
IGFzc3VtZWQuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLk5leHRCdXR0b25Db21wb25l
bnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKLSAgICAgIGNsaWNrOiBmdW5jdGlvbigpewot
ICAgICAgICB0aGlzLnNlbmRBY3Rpb24oKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQot
ICAgIGBgYGhhbmRsZWJhcnMKLSAgICB7eyEgYXBwbGljYXRpb24uaGJzIH19Ci0gICAge3tuZXh0
LWJ1dHRvbiBhY3Rpb249InBsYXlOZXh0U29uZ0luQWxidW0ifX0KLSAgICBgYGAKLQotICAgIGBg
YGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBwbGF5TmV4dFNvbmdJbkFs
YnVtOiBmdW5jdGlvbigpewotICAgICAgICAgIC4uLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAg
fSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIHNlbmRBY3Rpb24KLSAgICBAcGFyYW0gW2FjdGlv
bl0ge1N0cmluZ30gdGhlIGFjdGlvbiB0byB0cmlnZ2VyCi0gICAgQHBhcmFtIFtjb250ZXh0XSB7
Kn0gYSBjb250ZXh0IHRvIHNlbmQgd2l0aCB0aGUgYWN0aW9uCi0gICovCi0gIHNlbmRBY3Rpb246
IGZ1bmN0aW9uKGFjdGlvbikgewotICAgIHZhciBhY3Rpb25OYW1lLAotICAgICAgICBjb250ZXh0
cyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwotCi0gICAgLy8gU2VuZCB0aGUgZGVmYXVs
dCBhY3Rpb24KLSAgICBpZiAoYWN0aW9uID09PSB1bmRlZmluZWQpIHsKLSAgICAgIGFjdGlvbk5h
bWUgPSBnZXQodGhpcywgJ2FjdGlvbicpOwotICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgZGVmYXVs
dCBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUgY29tcG9uZW50ICIgKyB0aGlzLnRvU3RyaW5n
KCkgKwotICAgICAgICAgICAgICAgICAgICIsIGJ1dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rp
b25OYW1lICsgIikgd2FzIG5vdCBhIHN0cmluZy4iLAotICAgICAgICAgICAgICAgICAgIGlzTm9u
ZShhY3Rpb25OYW1lKSB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ3N0cmluZycpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICBhY3Rpb25OYW1lID0gZ2V0KHRoaXMsIGFjdGlvbik7Ci0gICAgICBFbWJl
ci5hc3NlcnQoIlRoZSAiICsgYWN0aW9uICsgIiBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUg
Y29tcG9uZW50ICIgKwotICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSArICIsIGJ1
dCB0aGUgYWN0aW9uIG5hbWUgKCIgKyBhY3Rpb25OYW1lICsKLSAgICAgICAgICAgICAgICAgICAi
KSB3YXMgbm90IGEgc3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgaXNOb25lKGFjdGlvbk5h
bWUpIHx8IHR5cGVvZiBhY3Rpb25OYW1lID09PSAnc3RyaW5nJyk7Ci0gICAgfQotCi0gICAgLy8g
SWYgbm8gYWN0aW9uIG5hbWUgZm9yIHRoYXQgYWN0aW9uIGNvdWxkIGJlIGZvdW5kLCBqdXN0IGFi
b3J0LgotICAgIGlmIChhY3Rpb25OYW1lID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9Ci0KLSAg
ICB0aGlzLnRyaWdnZXJBY3Rpb24oewotICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAotICAgICAg
YWN0aW9uQ29udGV4dDogY29udGV4dHMKLSAgICB9KTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLWBFbWJl
ci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydGAgaXMgYSBtaXhpbiB0aGF0IGNhbiBiZSBpbmNsdWRl
ZCBpbiBhCi12aWV3IGNsYXNzIHRvIGFkZCBhIGB0cmlnZ2VyQWN0aW9uYCBtZXRob2Qgd2l0aCBz
ZW1hbnRpY3Mgc2ltaWxhciB0bwotdGhlIEhhbmRsZWJhcnMgYHt7YWN0aW9ufX1gIGhlbHBlci4g
SXQgcHJvdmlkZXMgaW50ZWxsaWdlbnQgZGVmYXVsdHMKLWZvciB0aGUgYWN0aW9uJ3MgdGFyZ2V0
OiB0aGUgdmlldydzIGNvbnRyb2xsZXI7IGFuZCB0aGUgY29udGV4dCB0aGF0IGlzCi1zZW50IHdp
dGggdGhlIGFjdGlvbjogdGhlIHZpZXcncyBjb250ZXh0LgotCi1Ob3RlOiBJbiBub3JtYWwgRW1i
ZXIgdXNhZ2UsIHRoZSBge3thY3Rpb259fWAgaGVscGVyIGlzIHVzdWFsbHkgdGhlIGJlc3QKLWNo
b2ljZS4gVGhpcyBtaXhpbiBpcyBtb3N0IG9mdGVuIHVzZWZ1bCB3aGVuIHlvdSBhcmUgZG9pbmcg
bW9yZSBjb21wbGV4Ci1ldmVudCBoYW5kbGluZyBpbiBjdXN0b20gVmlldyBzdWJjbGFzc2VzLgot
Ci1Gb3IgZXhhbXBsZToKLQotYGBgamF2YXNjcmlwdAotQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1i
ZXIuVmlldy5leHRlbmQoRW1iZXIuVmlld1RhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgYWN0aW9u
OiAnc2F2ZScsCi0gIGNsaWNrOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLnRyaWdnZXJBY3Rpb24o
KTsgLy8gU2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29u
dGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9s
bGVyCi0gIH0KLX0pOwotYGBgCi0KLVRoZSBgYWN0aW9uYCBjYW4gYmUgcHJvdmlkZWQgYXMgcHJv
cGVydGllcyBvZiBhbiBvcHRpb25hbCBvYmplY3QgYXJndW1lbnQKLXRvIGB0cmlnZ2VyQWN0aW9u
YCBhcyB3ZWxsLgotCi1gYGBqYXZhc2NyaXB0Ci1BcHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5W
aWV3LmV4dGVuZChFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgewotICBjbGljazogZnVu
Y3Rpb24oKSB7Ci0gICAgdGhpcy50cmlnZ2VyQWN0aW9uKHsKLSAgICAgIGFjdGlvbjogJ3NhdmUn
Ci0gICAgfSk7IC8vIFNlbmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJy
ZW50IGNvbnRleHQKLSAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgotICB9Ci19
KTsKLWBgYAotCi1AY2xhc3MgVmlld1RhcmdldEFjdGlvblN1cHBvcnQKLUBuYW1lc3BhY2UgRW1i
ZXIKLUBleHRlbmRzIEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQKLSovCi1FbWJlci5WaWV3VGFy
Z2V0QWN0aW9uU3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5UYXJnZXRBY3Rpb25T
dXBwb3J0LCB7Ci0gIC8qKgotICBAcHJvcGVydHkgdGFyZ2V0Ci0gICovCi0gIHRhcmdldDogRW1i
ZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRyb2xsZXInKSwKLSAgLyoqCi0gIEBwcm9wZXJ0eSBhY3Rp
b25Db250ZXh0Ci0gICovCi0gIGFjdGlvbkNvbnRleHQ6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdj
b250ZXh0JykKLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBWaWV3cwotCi1AbW9kdWxlIGVtYmVyCi1Ac3Vi
bW9kdWxlIGVtYmVyLXZpZXdzCi1AcmVxdWlyZXMgZW1iZXItcnVudGltZQotQG1haW4gZW1iZXIt
dmlld3MKLSovCi0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLWRlZmluZSgibWV0YW1vcnBoIiwK
LSAgW10sCi0gIGZ1bmN0aW9uKCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvLyA9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotICAgIC8vIFByb2plY3Q6ICAgbWV0YW1vcnBoCi0gICAgLy8gQ29weXJpZ2h0
OiDCqTIwMTQgVGlsZGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAvLyA9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotCi0gICAgdmFyIEsgPSBmdW5jdGlvbigpIHt9LAotICAgICAgICBndWlkID0g
MCwKLSAgICAgICAgZGlzYWJsZVJhbmdlID0gKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgaWYgKCd1
bmRlZmluZWQnICE9PSB0eXBlb2YgTWV0YW1vcnBoRU5WKSB7Ci0gICAgICAgICAgICByZXR1cm4g
TWV0YW1vcnBoRU5WLkRJU0FCTEVfUkFOR0VfQVBJOwotICAgICAgICAgIH0gZWxzZSBpZiAoJ3Vu
ZGVmaW5lZCcgIT09IEVOVikgewotICAgICAgICAgICAgcmV0dXJuIEVOVi5ESVNBQkxFX1JBTkdF
X0FQSTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgIH0KLSAgICAgICAgfSkoKSwKLQotICAgICAgICAvLyBGZWF0dXJlLWRldGVjdCB0aGUg
VzNDIHJhbmdlIEFQSSwgdGhlIGV4dGVuZGVkIGNoZWNrIGlzIGZvciBJRTkgd2hpY2ggb25seSBw
YXJ0aWFsbHkgc3VwcG9ydHMgcmFuZ2VzCi0gICAgICAgIHN1cHBvcnRzUmFuZ2UgPSAoIWRpc2Fi
bGVSYW5nZSkgJiYgZG9jdW1lbnQgJiYgKCdjcmVhdGVSYW5nZScgaW4gZG9jdW1lbnQpICYmICh0
eXBlb2YgUmFuZ2UgIT09ICd1bmRlZmluZWQnKSAmJiBSYW5nZS5wcm90b3R5cGUuY3JlYXRlQ29u
dGV4dHVhbEZyYWdtZW50LAotCi0gICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIHByaW9yIHRv
IDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBpbm5lckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1lbnQK
LSAgICAgICAgLy8gaXMgYSAiemVyby1zY29wZSIgZWxlbWVudC4gVGhpcyBwcm9ibGVtIGNhbiBi
ZSB3b3JrZWQgYXJvdW5kIGJ5IG1ha2luZwotICAgICAgICAvLyB0aGUgZmlyc3Qgbm9kZSBhbiBp
bnZpc2libGUgdGV4dCBub2RlLiBXZSwgbGlrZSBNb2Rlcm5penIsIHVzZSAmc2h5OwotICAgICAg
ICBuZWVkc1NoeSA9IGRvY3VtZW50ICYmIChmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgdGVz
dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Ci0gICAgICAgICAgdGVzdEVsLmlu
bmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7Ci0gICAgICAgICAgdGVzdEVsLmZpcnN0Q2hpbGQuaW5u
ZXJIVE1MID0gIjxzY3JpcHQ+PC9zY3JpcHQ+IjsKLSAgICAgICAgICByZXR1cm4gdGVzdEVsLmZp
cnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKLSAgICAgICAgfSkoKSwKLQotCi0gICAgICAgIC8v
IElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3aGl0ZXNwYWNlIHByZWNl
ZWRpbmcKLSAgICAgICAgLy8gYSBzY3JpcHQgdGFnIHRvIGFwcGVhciBhZnRlciBpdC4gVGhpcyBt
ZWFucyB0aGF0IHdlIGNhbgotICAgICAgICAvLyBhY2NpZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3Bh
Y2Ugd2hlbiB1cGRhdGluZyBhIG1vcnBoLgotICAgICAgICBtb3Zlc1doaXRlc3BhY2UgPSBkb2N1
bWVudCAmJiAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2RpdicpOwotICAgICAgICAgIHRlc3RFbC5pbm5lckhUTUwgPSAiVGVzdDog
PHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPjwvc2NyaXB0PlZhbHVlIjsKLSAgICAg
ICAgICByZXR1cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYm
Ci0gICAgICAgICAgICAgICAgICB0ZXN0RWwuY2hpbGROb2Rlc1syXS5ub2RlVmFsdWUgPT09ICcg
VmFsdWUnOwotICAgICAgICB9KSgpOwotCi0gICAgLy8gQ29uc3RydWN0b3IgdGhhdCBzdXBwb3J0
cyBlaXRoZXIgTWV0YW1vcnBoKCdmb28nKSBvciBuZXcKLSAgICAvLyBNZXRhbW9ycGgoJ2Zvbycp
OwotICAgIC8vCi0gICAgLy8gVGFrZXMgYSBzdHJpbmcgb2YgSFRNTCBhcyB0aGUgYXJndW1lbnQu
Ci0KLSAgICB2YXIgTWV0YW1vcnBoID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgdmFyIHNlbGY7
Ci0KLSAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWV0YW1vcnBoKSB7Ci0gICAgICAgIHNlbGYg
PSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VsZiA9IG5ldyBLKCk7Ci0gICAgICB9
Ci0KLSAgICAgIHNlbGYuaW5uZXJIVE1MID0gaHRtbDsKLSAgICAgIHZhciBteUd1aWQgPSAnbWV0
YW1vcnBoLScrKGd1aWQrKyk7Ci0gICAgICBzZWxmLnN0YXJ0ID0gbXlHdWlkICsgJy1zdGFydCc7
Ci0gICAgICBzZWxmLmVuZCA9IG15R3VpZCArICctZW5kJzsKLQotICAgICAgcmV0dXJuIHNlbGY7
Ci0gICAgfTsKLQotICAgIEsucHJvdG90eXBlID0gTWV0YW1vcnBoLnByb3RvdHlwZTsKLQotICAg
IHZhciByYW5nZUZvciwgaHRtbEZ1bmMsIHJlbW92ZUZ1bmMsIG91dGVySFRNTEZ1bmMsIGFwcGVu
ZFRvRnVuYywgYWZ0ZXJGdW5jLCBwcmVwZW5kRnVuYywgc3RhcnRUYWdGdW5jLCBlbmRUYWdGdW5j
OwotCi0gICAgb3V0ZXJIVE1MRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMu
c3RhcnRUYWcoKSArIHRoaXMuaW5uZXJIVE1MICsgdGhpcy5lbmRUYWcoKTsKLSAgICB9OwotCi0g
ICAgc3RhcnRUYWdGdW5jID0gZnVuY3Rpb24oKSB7Ci0gICAgICAvKgotICAgICAgICogV2UgcmVw
bGFjZSBjaGV2cm9uIGJ5IGl0cyBoZXggY29kZSBpbiBvcmRlciB0byBwcmV2ZW50IGVzY2FwaW5n
IHByb2JsZW1zLgotICAgICAgICogQ2hlY2sgdGhpcyB0aHJlYWQgZm9yIG1vcmUgZXhwbGFpbmF0
aW9uOgotICAgICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MjMxMDQ4
L3doeS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1nZW5lcmF0aW5nLWh0bWwtZnJvbS1qYXZhc2Ny
aXB0Ci0gICAgICAgKi8KLSAgICAgIHJldHVybiAiPHNjcmlwdCBpZD0nIiArIHRoaXMuc3RhcnQg
KyAiJyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQot
ICAgIGVuZFRhZ0Z1bmMgPSBmdW5jdGlvbigpIHsKLSAgICAgIC8qCi0gICAgICAgKiBXZSByZXBs
YWNlIGNoZXZyb24gYnkgaXRzIGhleCBjb2RlIGluIG9yZGVyIHRvIHByZXZlbnQgZXNjYXBpbmcg
cHJvYmxlbXMuCi0gICAgICAgKiBDaGVjayB0aGlzIHRocmVhZCBmb3IgbW9yZSBleHBsYWluYXRp
b246Ci0gICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzgyMzEwNDgv
d2h5LXVzZS14M2MtaW5zdGVhZC1vZi13aGVuLWdlbmVyYXRpbmctaHRtbC1mcm9tLWphdmFzY3Jp
cHQKLSAgICAgICAqLwotICAgICAgcmV0dXJuICI8c2NyaXB0IGlkPSciICsgdGhpcy5lbmQgKyAi
JyB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xkZXInPlx4M0Mvc2NyaXB0PiI7Ci0gICAgfTsKLQotICAg
IC8vIElmIHdlIGhhdmUgdGhlIFczQyByYW5nZSBBUEksIHRoaXMgcHJvY2VzcyBpcyByZWxhdGl2
ZWx5IHN0cmFpZ2h0IGZvcndhcmQuCi0gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHsKLQotICAgICAg
Ly8gR2V0IGEgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IG1vcnBoLiBPcHRpb25hbGx5IGluY2x1ZGUg
dGhlIHN0YXJ0aW5nIGFuZAotICAgICAgLy8gZW5kaW5nIHBsYWNlaG9sZGVycy4KLSAgICAgIHJh
bmdlRm9yID0gZnVuY3Rpb24obW9ycGgsIG91dGVyVG9vKSB7Ci0gICAgICAgIHZhciByYW5nZSA9
IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHZhciBiZWZvcmUgPSBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZChtb3JwaC5zdGFydCk7Ci0gICAgICAgIHZhciBhZnRlciA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKG1vcnBoLmVuZCk7Ci0KLSAgICAgICAgaWYgKG91dGVyVG9vKSB7Ci0g
ICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoYmVmb3JlKTsKLSAgICAgICAgICByYW5nZS5z
ZXRFbmRBZnRlcihhZnRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmFuZ2Uuc2V0
U3RhcnRBZnRlcihiZWZvcmUpOwotICAgICAgICAgIHJhbmdlLnNldEVuZEJlZm9yZShhZnRlcik7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmFuZ2U7Ci0gICAgICB9OwotCi0gICAgICBo
dG1sRnVuYyA9IGZ1bmN0aW9uKGh0bWwsIG91dGVyVG9vKSB7Ci0gICAgICAgIC8vIGdldCBhIHJh
bmdlIGZvciB0aGUgY3VycmVudCBtZXRhbW9ycGggb2JqZWN0Ci0gICAgICAgIHZhciByYW5nZSA9
IHJhbmdlRm9yKHRoaXMsIG91dGVyVG9vKTsKLQotICAgICAgICAvLyBkZWxldGUgdGhlIGNvbnRl
bnRzIG9mIHRoZSByYW5nZSwgd2hpY2ggd2lsbCBiZSB0aGUKLSAgICAgICAgLy8gbm9kZXMgYmV0
d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwbGFjZWhvbGRlci4KLSAgICAgICAgcmFuZ2Uu
ZGVsZXRlQ29udGVudHMoKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgZnJh
Z21lbnQgZm9yIHRoZSBIVE1MCi0gICAgICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNv
bnRleHR1YWxGcmFnbWVudChodG1sKTsKLQotICAgICAgICAvLyBpbnNlcnQgdGhlIGZyYWdtZW50
IGludG8gdGhlIHJhbmdlCi0gICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAg
ICAgfTsKLQotICAgICAgLyoqCi0gICAgICAqIEBwdWJsaWMKLSAgICAgICoKLSAgICAgICogUmVt
b3ZlIHRoaXMgb2JqZWN0IChpbmNsdWRpbmcgc3RhcnRpbmcgYW5kIGVuZGluZwotICAgICAgKiBw
bGFjZWhvbGRlcnMpLgotICAgICAgKgotICAgICAgKiBAbWV0aG9kIHJlbW92ZQotICAgICAgKi8K
LSAgICAgIHJlbW92ZUZ1bmMgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gZ2V0IGEgcmFuZ2Ug
Zm9yIHRoZSBjdXJyZW50IG1ldGFtb3JwaCBvYmplY3QgaW5jbHVkaW5nCi0gICAgICAgIC8vIHRo
ZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9sZGVycy4KLSAgICAgICAgdmFyIHJhbmdlID0g
cmFuZ2VGb3IodGhpcywgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSBlbnRpcmUgcmFu
Z2UuCi0gICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7Ci0gICAgICB9OwotCi0gICAgICBh
cHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihub2RlKSB7Ci0gICAgICAgIHZhciByYW5nZSA9IGRvY3Vt
ZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUpOwotICAgICAg
ICByYW5nZS5jb2xsYXBzZShmYWxzZSk7Ci0gICAgICAgIHZhciBmcmFnID0gcmFuZ2UuY3JlYXRl
Q29udGV4dHVhbEZyYWdtZW50KHRoaXMub3V0ZXJIVE1MKCkpOwotICAgICAgICBub2RlLmFwcGVu
ZENoaWxkKGZyYWcpOwotICAgICAgfTsKLQotICAgICAgYWZ0ZXJGdW5jID0gZnVuY3Rpb24oaHRt
bCkgewotICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwotICAgICAg
ICB2YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7Ci0KLSAgICAg
ICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihhZnRlcik7Ci0gICAgICAgIHJhbmdlLnNldEVuZEFmdGVy
KGFmdGVyKTsKLQotICAgICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFs
RnJhZ21lbnQoaHRtbCk7Ci0gICAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpOwotICAg
ICAgfTsKLQotICAgICAgcHJlcGVuZEZ1bmMgPSBmdW5jdGlvbihodG1sKSB7Ci0gICAgICAgIHZh
ciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0gICAgICAgIHZhciBzdGFydCA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwotCi0gICAgICAgIHJhbmdlLnNldFN0
YXJ0QWZ0ZXIoc3RhcnQpOwotICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihzdGFydCk7Ci0KLSAg
ICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwp
OwotICAgICAgICByYW5nZS5pbnNlcnROb2RlKGZyYWdtZW50KTsKLSAgICAgIH07Ci0KLSAgICB9
IGVsc2UgewotICAgICAgLyoKLSAgICAgICAqIFRoaXMgY29kZSBpcyBtb3N0bHkgdGFrZW4gZnJv
bSBqUXVlcnksIHdpdGggb25lIGV4Y2VwdGlvbi4gSW4galF1ZXJ5J3MgY2FzZSwgd2UKLSAgICAg
ICAqIGhhdmUgc29tZSBIVE1MIGFuZCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZl
cnQgaXQgaW50byBzb21lIG5vZGVzLgotICAgICAgICoKLSAgICAgICAqIEluIHRoaXMgY2FzZSwg
alF1ZXJ5IG5lZWRzIHRvIHNjYW4gdGhlIEhUTUwgbG9va2luZyBmb3IgYW4gb3BlbmluZyB0YWcg
YW5kIHVzZQotICAgICAgICogdGhhdCBhcyB0aGUga2V5IGZvciB0aGUgd3JhcCBtYXAuIEluIG91
ciBjYXNlLCB3ZSBrbm93IHRoZSBwYXJlbnQgbm9kZSwgYW5kCi0gICAgICAgKiBjYW4gdXNlIGl0
cyB0eXBlIGFzIHRoZSBrZXkgZm9yIHRoZSB3cmFwIG1hcC4KLSAgICAgICAqKi8KLSAgICAgIHZh
ciB3cmFwTWFwID0gewotICAgICAgICBzZWxlY3Q6IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211
bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAotICAgICAgICBmaWVsZHNldDogWyAxLCAiPGZpZWxk
c2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKLSAgICAgICAgdGFibGU6IFsgMSwgIjx0YWJsZT4iLCAi
PC90YWJsZT4iIF0sCi0gICAgICAgIHRib2R5OiBbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Ri
b2R5PjwvdGFibGU+IiBdLAotICAgICAgICB0cjogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+Iiwg
IjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKLSAgICAgICAgY29sZ3JvdXA6IFsgMiwgIjx0YWJs
ZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCi0g
ICAgICAgIG1hcDogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAotICAgICAgICBfZGVmYXVsdDog
WyAwLCAiIiwgIiIgXQotICAgICAgfTsKLQotICAgICAgdmFyIGZpbmRDaGlsZEJ5SWQgPSBmdW5j
dGlvbihlbGVtZW50LCBpZCkgewotICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lk
JykgPT09IGlkKSB7IHJldHVybiBlbGVtZW50OyB9Ci0KLSAgICAgICAgdmFyIGxlbiA9IGVsZW1l
bnQuY2hpbGROb2Rlcy5sZW5ndGgsIGlkeCwgbm9kZSwgZm91bmQ7Ci0gICAgICAgIGZvciAoaWR4
PTA7IGlkeDxsZW47IGlkeCsrKSB7Ci0gICAgICAgICAgbm9kZSA9IGVsZW1lbnQuY2hpbGROb2Rl
c1tpZHhdOwotICAgICAgICAgIGZvdW5kID0gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBmaW5kQ2hp
bGRCeUlkKG5vZGUsIGlkKTsKLSAgICAgICAgICBpZiAoZm91bmQpIHsgcmV0dXJuIGZvdW5kOyB9
Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIHZhciBzZXRJbm5lckhUTUwgPSBmdW5jdGlv
bihlbGVtZW50LCBodG1sKSB7Ci0gICAgICAgIHZhciBtYXRjaGVzID0gW107Ci0gICAgICAgIGlm
IChtb3Zlc1doaXRlc3BhY2UpIHsKLSAgICAgICAgICAvLyBSaWdodCBub3cgd2Ugb25seSBjaGVj
ayBmb3Igc2NyaXB0IHRhZ3Mgd2l0aCBpZHMgd2l0aCB0aGUKLSAgICAgICAgICAvLyBnb2FsIG9m
IHRhcmdldGluZyBtb3JwaHMuCi0gICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvKFxzKyko
PHNjcmlwdCBpZD0nKFteJ10rKScpL2csIGZ1bmN0aW9uKG1hdGNoLCBzcGFjZXMsIHRhZywgaWQp
IHsKLSAgICAgICAgICAgIG1hdGNoZXMucHVzaChbaWQsIHNwYWNlc10pOwotICAgICAgICAgICAg
cmV0dXJuIHRhZzsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsZW1lbnQu
aW5uZXJIVE1MID0gaHRtbDsKLQotICAgICAgICAvLyBJZiB3ZSBoYXZlIHRvIGRvIGFueSB3aGl0
ZXNwYWNlIGFkanVzdG1lbnRzIGRvIHRoZW0gbm93Ci0gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0
aCA+IDApIHsKLSAgICAgICAgICB2YXIgbGVuID0gbWF0Y2hlcy5sZW5ndGgsIGlkeDsKLSAgICAg
ICAgICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgewotICAgICAgICAgICAgdmFyIHNjcmlw
dCA9IGZpbmRDaGlsZEJ5SWQoZWxlbWVudCwgbWF0Y2hlc1tpZHhdWzBdKSwKLSAgICAgICAgICAg
ICAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWF0Y2hlc1tpZHhdWzFdKTsKLSAg
ICAgICAgICAgIHNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBzY3JpcHQpOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgLyoKLSAgICAgICAqIEdp
dmVuIGEgcGFyZW50IG5vZGUgYW5kIHNvbWUgSFRNTCwgZ2VuZXJhdGUgYSBzZXQgb2Ygbm9kZXMu
IFJldHVybiB0aGUgZmlyc3QKLSAgICAgICAqIG5vZGUsIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8g
dHJhdmVyc2UgdGhlIHJlc3QgdXNpbmcgbmV4dFNpYmxpbmcuCi0gICAgICAgKgotICAgICAgICog
V2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgaW5uZXJIVE1MIGluIElFIGRvZXMgbm90IHJlYWxs
eSBwYXJzZSB0aGUgbm9kZXMuCi0gICAgICAgKi8KLSAgICAgIHZhciBmaXJzdE5vZGVGb3IgPSBm
dW5jdGlvbihwYXJlbnROb2RlLCBodG1sKSB7Ci0gICAgICAgIHZhciBhcnIgPSB3cmFwTWFwW3Bh
cmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwotICAg
ICAgICB2YXIgZGVwdGggPSBhcnJbMF0sIHN0YXJ0ID0gYXJyWzFdLCBlbmQgPSBhcnJbMl07Ci0K
LSAgICAgICAgaWYgKG5lZWRzU2h5KSB7IGh0bWwgPSAnJnNoeTsnK2h0bWw7IH0KLQotICAgICAg
ICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwotCi0gICAgICAg
IHNldElubmVySFRNTChlbGVtZW50LCBzdGFydCArIGh0bWwgKyBlbmQpOwotCi0gICAgICAgIGZv
ciAodmFyIGk9MDsgaTw9ZGVwdGg7IGkrKykgewotICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50
LmZpcnN0Q2hpbGQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb29rIGZvciAmc2h5OyB0byBy
ZW1vdmUgaXQuCi0gICAgICAgIGlmIChuZWVkc1NoeSkgewotICAgICAgICAgIHZhciBzaHlFbGVt
ZW50ID0gZWxlbWVudDsKLQotICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBnZXQgbmFtZWxlc3Mg
ZWxlbWVudHMgd2l0aCB0aGUgc2h5IGluc2lkZQotICAgICAgICAgIHdoaWxlIChzaHlFbGVtZW50
Lm5vZGVUeXBlID09PSAxICYmICFzaHlFbGVtZW50Lm5vZGVOYW1lKSB7Ci0gICAgICAgICAgICBz
aHlFbGVtZW50ID0gc2h5RWxlbWVudC5maXJzdENoaWxkOwotICAgICAgICAgIH0KLQotICAgICAg
ICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyB0aGUgYWN0dWFsIHVuaWNvZGUgY2hhcmFjdGVyLgot
ICAgICAgICAgIGlmIChzaHlFbGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9k
ZVZhbHVlLmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKLSAgICAgICAgICAgIHNoeUVsZW1lbnQu
bm9kZVZhbHVlID0gc2h5RWxlbWVudC5ub2RlVmFsdWUuc2xpY2UoMSk7Ci0gICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICB9OwotCi0gICAgICAv
KgotICAgICAgICogSW4gc29tZSBjYXNlcywgSW50ZXJuZXQgRXhwbG9yZXIgY2FuIGNyZWF0ZSBh
biBhbm9ueW1vdXMgbm9kZSBpbgotICAgICAgICogdGhlIGhpZXJhcmNoeSB3aXRoIG5vIHRhZ05h
bWUuIFlvdSBjYW4gY3JlYXRlIHRoaXMgc2NlbmFyaW8gdmlhOgotICAgICAgICoKLSAgICAgICAq
ICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBk
aXYuaW5uZXJIVE1MID0gIjx0YWJsZT4mc2h5PHNjcmlwdD48L3NjcmlwdD48dHI+PHRkPmhpPC90
ZD48L3RyPjwvdGFibGU+IjsKLSAgICAgICAqICAgICBkaXYuZmlyc3RDaGlsZC5maXJzdENoaWxk
LnRhZ05hbWUgLy89PiAiIgotICAgICAgICoKLSAgICAgICAqIElmIG91ciBzY3JpcHQgbWFya2Vy
cyBhcmUgaW5zaWRlIHN1Y2ggYSBub2RlLCB3ZSBuZWVkIHRvIGZpbmQgdGhhdAotICAgICAgICog
bm9kZSBhbmQgdXNlICppdCogYXMgdGhlIG1hcmtlci4KLSAgICAgICAqLwotICAgICAgdmFyIHJl
YWxOb2RlID0gZnVuY3Rpb24oc3RhcnQpIHsKLSAgICAgICAgd2hpbGUgKHN0YXJ0LnBhcmVudE5v
ZGUudGFnTmFtZSA9PT0gIiIpIHsKLSAgICAgICAgICBzdGFydCA9IHN0YXJ0LnBhcmVudE5vZGU7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgICB9OwotCi0gICAgICAv
KgotICAgICAgICogV2hlbiBhdXRvbWF0aWNhbGx5IGFkZGluZyBhIHRib2R5LCBJbnRlcm5ldCBF
eHBsb3JlciBpbnNlcnRzIHRoZQotICAgICAgICogdGJvZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRo
ZSBmaXJzdCA8dHI+LiBPdGhlciBicm93c2VycyBjcmVhdGUgaXQKLSAgICAgICAqIGJlZm9yZSB0
aGUgZmlyc3Qgbm9kZSwgbm8gbWF0dGVyIHdoYXQuCi0gICAgICAgKgotICAgICAgICogVGhpcyBt
ZWFucyB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICoKLSAgICAgICAqICAgICBkaXYg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLSAgICAgICAqICAgICBkaXYuaW5uZXJI
VE1MID0gIjx0YWJsZT48c2NyaXB0IGlkPSdmaXJzdCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+
PC90cj48c2NyaXB0IGlkPSdsYXN0Jz48L3NjcmlwdD48L3RhYmxlPgotICAgICAgICoKLSAgICAg
ICAqIEdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIERPTSBpbiBJRToKLSAgICAgICAqCi0gICAgICAg
KiAgICAgKyBkaXYKLSAgICAgICAqICAgICAgICsgdGFibGUKLSAgICAgICAqICAgICAgICAgLSBz
Y3JpcHQgaWQ9J2ZpcnN0JwotICAgICAgICogICAgICAgICArIHRib2R5Ci0gICAgICAgKiAgICAg
ICAgICAgKyB0cgotICAgICAgICogICAgICAgICAgICAgKyB0ZAotICAgICAgICogICAgICAgICAg
ICAgICAtICJoaSIKLSAgICAgICAqICAgICAgICAgICAtIHNjcmlwdCBpZD0nbGFzdCcKLSAgICAg
ICAqCi0gICAgICAgKiBXaGljaCBtZWFucyB0aGF0IHRoZSB0d28gc2NyaXB0IHRhZ3MsIGV2ZW4g
dGhvdWdoIHRoZXkgd2VyZQotICAgICAgICogaW5zZXJ0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4g
dGhlIGhpZXJhcmNoeSBpbiB0aGUgb3JpZ2luYWwKLSAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRp
ZmZlcmVudCBwYXJlbnRzLgotICAgICAgICoKLSAgICAgICAqIFRoaXMgY29kZSByZXBhcmVudHMg
dGhlIGZpcnN0IHNjcmlwdCB0YWcgYnkgbWFraW5nIGl0IHRoZSB0Ym9keSdzCi0gICAgICAgKiBm
aXJzdCBjaGlsZC4KLSAgICAgICAqCi0gICAgICAgKi8KLSAgICAgIHZhciBmaXhQYXJlbnRhZ2Ug
PSBmdW5jdGlvbihzdGFydCwgZW5kKSB7Ci0gICAgICAgIGlmIChzdGFydC5wYXJlbnROb2RlICE9
PSBlbmQucGFyZW50Tm9kZSkgewotICAgICAgICAgIGVuZC5wYXJlbnROb2RlLmluc2VydEJlZm9y
ZShzdGFydCwgZW5kLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH07
Ci0KLSAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24oaHRtbCwgb3V0ZXJUb28pIHsKLSAgICAgICAg
Ly8gZ2V0IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4K
LSAgICAgICAgdmFyIHN0YXJ0ID0gcmVhbE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp
cy5zdGFydCkpOwotICAgICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp
cy5lbmQpOwotICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGVuZC5wYXJlbnROb2RlOwotICAgICAg
ICB2YXIgbm9kZSwgbmV4dFNpYmxpbmcsIGxhc3Q7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRo
YXQgdGhlIHN0YXJ0IGFuZCBlbmQgbm9kZXMgc2hhcmUgdGhlIHNhbWUKLSAgICAgICAgLy8gcGFy
ZW50LiBJZiBub3QsIGZpeCBpdC4KLSAgICAgICAgZml4UGFyZW50YWdlKHN0YXJ0LCBlbmQpOwot
Ci0gICAgICAgIC8vIHJlbW92ZSBhbGwgb2YgdGhlIG5vZGVzIGFmdGVyIHRoZSBzdGFydGluZyBw
bGFjZWhvbGRlciBhbmQKLSAgICAgICAgLy8gYmVmb3JlIHRoZSBlbmRpbmcgcGxhY2Vob2xkZXIu
Ci0gICAgICAgIG5vZGUgPSBzdGFydC5uZXh0U2libGluZzsKLSAgICAgICAgd2hpbGUgKG5vZGUp
IHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAg
bGFzdCA9IG5vZGUgPT09IGVuZDsKLQotICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qg
bm9kZSwgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGFzIHdlbGwsCi0gICAgICAgICAgLy8gc2V0
IHRoZSBgZW5kYCBub2RlIHRvIHRoZSBuZXh0IHNpYmxpbmcuIFRoaXMgaXMgYmVjYXVzZQotICAg
ICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24sIHdlIGluc2VydCB0aGUgbmV3
IG5vZGVzCi0gICAgICAgICAgLy8gYmVmb3JlIHRoZSBlbmQgKG5vdGUgdGhhdCBpbnNlcnRCZWZv
cmUobm9kZSwgbnVsbCkgaXMKLSAgICAgICAgICAvLyB0aGUgc2FtZSBhcyBhcHBlbmRDaGlsZChu
b2RlKSkuCi0gICAgICAgICAgLy8KLSAgICAgICAgICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byBy
ZW1vdmUgaXQsIGp1c3QgYnJlYWsuCi0gICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAg
IGlmIChvdXRlclRvbykgeyBlbmQgPSBub2RlLm5leHRTaWJsaW5nOyB9IGVsc2UgeyBicmVhazsg
fQotICAgICAgICAgIH0KLQotICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChu
b2RlKTsKLQotICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBhbmQgd2UgZGlk
bid0IGJyZWFrIGJlZm9yZQotICAgICAgICAgIC8vIChiZWNhdXNlIHdlIHdhbnRlZCB0byByZW1v
dmUgdGhlIG91dGVyIG5vZGVzKSwgYnJlYWsKLSAgICAgICAgICAvLyBub3cuCi0gICAgICAgICAg
aWYgKGxhc3QpIHsgYnJlYWs7IH0KLQotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgZmlyc3Qgbm9kZSBmb3IgdGhlIEhUTUwgc3Ry
aW5nLCBldmVuIGluIGNhc2VzIGxpa2UKLSAgICAgICAgLy8gdGFibGVzIGFuZCBsaXN0cyB3aGVy
ZSBhIHNpbXBsZSBpbm5lckhUTUwgb24gYSBkaXYgd291bGQKLSAgICAgICAgLy8gc3dhbGxvdyBz
b21lIG9mIHRoZSBjb250ZW50LgotICAgICAgICBub2RlID0gZmlyc3ROb2RlRm9yKHN0YXJ0LnBh
cmVudE5vZGUsIGh0bWwpOwotCi0gICAgICAgIGlmIChvdXRlclRvbykgewotICAgICAgICAgIHN0
YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gY29weSB0aGUgbm9kZXMgZm9yIHRoZSBIVE1MIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFuZCBl
bmRpbmcKLSAgICAgICAgLy8gcGxhY2Vob2xkZXIuCi0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0g
ICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwotICAgICAgICAgIHBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVuZCk7Ci0gICAgICAgICAgbm9kZSA9IG5leHRTaWJs
aW5nOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICAvLyByZW1vdmUgdGhlIG5vZGVzIGlu
IHRoZSBET00gcmVwcmVzZW50aW5nIHRoaXMgbWV0YW1vcnBoLgotICAgICAgLy8KLSAgICAgIC8v
IHRoaXMgaW5jbHVkZXMgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgcGxhY2Vob2xkZXJzLgotICAg
ICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgc3RhcnQgPSByZWFsTm9k
ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0YXJ0KSk7Ci0gICAgICAgIHZhciBlbmQg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7Ci0KLSAgICAgICAgdGhpcy5odG1s
KCcnKTsKLSAgICAgICAgc3RhcnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdGFydCk7Ci0gICAg
ICAgIGVuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVuZCk7Ci0gICAgICB9OwotCi0gICAgICBh
cHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihwYXJlbnROb2RlKSB7Ci0gICAgICAgIHZhciBub2RlID0g
Zmlyc3ROb2RlRm9yKHBhcmVudE5vZGUsIHRoaXMub3V0ZXJIVE1MKCkpOwotICAgICAgICB2YXIg
bmV4dFNpYmxpbmc7Ci0KLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2li
bGluZyA9IG5vZGUubmV4dFNpYmxpbmc7Ci0gICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGls
ZChub2RlKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAg
IH07Ci0KLSAgICAgIGFmdGVyRnVuYyA9IGZ1bmN0aW9uKGh0bWwpIHsKLSAgICAgICAgLy8gZ2V0
IHRoZSByZWFsIHN0YXJ0aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KLSAgICAg
ICAgdmFyIGVuZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKLSAgICAgICAg
dmFyIGluc2VydEJlZm9yZSA9IGVuZC5uZXh0U2libGluZzsKLSAgICAgICAgdmFyIHBhcmVudE5v
ZGUgPSBlbmQucGFyZW50Tm9kZTsKLSAgICAgICAgdmFyIG5leHRTaWJsaW5nOwotICAgICAgICB2
YXIgbm9kZTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IG5vZGUgZm9yIHRoZSBIVE1MIHN0
cmluZywgZXZlbiBpbiBjYXNlcyBsaWtlCi0gICAgICAgIC8vIHRhYmxlcyBhbmQgbGlzdHMgd2hl
cmUgYSBzaW1wbGUgaW5uZXJIVE1MIG9uIGEgZGl2IHdvdWxkCi0gICAgICAgIC8vIHN3YWxsb3cg
c29tZSBvZiB0aGUgY29udGVudC4KLSAgICAgICAgbm9kZSA9IGZpcnN0Tm9kZUZvcihwYXJlbnRO
b2RlLCBodG1sKTsKLQotICAgICAgICAvLyBjb3B5IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0
d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZwotICAgICAgICAvLyBwbGFjZWhvbGRlci4KLSAg
ICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNp
Ymxpbmc7Ci0gICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgaW5zZXJ0QmVm
b3JlKTsKLSAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmc7Ci0gICAgICAgIH0KLSAgICAgIH07
Ci0KLSAgICAgIHByZXBlbmRGdW5jID0gZnVuY3Rpb24oaHRtbCkgewotICAgICAgICB2YXIgc3Rh
cnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0YXJ0KTsKLSAgICAgICAgdmFyIHBh
cmVudE5vZGUgPSBzdGFydC5wYXJlbnROb2RlOwotICAgICAgICB2YXIgbmV4dFNpYmxpbmc7Ci0g
ICAgICAgIHZhciBub2RlOwotCi0gICAgICAgIG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9k
ZSwgaHRtbCk7Ci0gICAgICAgIHZhciBpbnNlcnRCZWZvcmUgPSBzdGFydC5uZXh0U2libGluZzsK
LQotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgIG5leHRTaWJsaW5nID0gbm9kZS5u
ZXh0U2libGluZzsKLSAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNl
cnRCZWZvcmUpOwotICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKLSAgICAgICAgfQotICAg
ICAgfTsKLSAgICB9Ci0KLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbiho
dG1sKSB7Ci0gICAgICB0aGlzLmNoZWNrUmVtb3ZlZCgpOwotICAgICAgaWYgKGh0bWwgPT09IHVu
ZGVmaW5lZCkgeyByZXR1cm4gdGhpcy5pbm5lckhUTUw7IH0KLQotICAgICAgaHRtbEZ1bmMuY2Fs
bCh0aGlzLCBodG1sKTsKLQotICAgICAgdGhpcy5pbm5lckhUTUwgPSBodG1sOwotICAgIH07Ci0K
LSAgICBNZXRhbW9ycGgucHJvdG90eXBlLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24oaHRtbCkgewot
ICAgICAgdGhpcy5jaGVja1JlbW92ZWQoKTsKLSAgICAgIGh0bWxGdW5jLmNhbGwodGhpcywgaHRt
bCwgdHJ1ZSk7Ci0gICAgfTsKLQotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUucmVtb3ZlID0gcmVt
b3ZlRnVuYzsKLSAgICBNZXRhbW9ycGgucHJvdG90eXBlLm91dGVySFRNTCA9IG91dGVySFRNTEZ1
bmM7Ci0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5hcHBlbmRUbyA9IGFwcGVuZFRvRnVuYzsKLSAg
ICBNZXRhbW9ycGgucHJvdG90eXBlLmFmdGVyID0gYWZ0ZXJGdW5jOwotICAgIE1ldGFtb3JwaC5w
cm90b3R5cGUucHJlcGVuZCA9IHByZXBlbmRGdW5jOwotICAgIE1ldGFtb3JwaC5wcm90b3R5cGUu
c3RhcnRUYWcgPSBzdGFydFRhZ0Z1bmM7Ci0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5lbmRUYWcg
PSBlbmRUYWdGdW5jOwotCi0gICAgTWV0YW1vcnBoLnByb3RvdHlwZS5pc1JlbW92ZWQgPSBmdW5j
dGlvbigpIHsKLSAgICAgIHZhciBiZWZvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlz
LnN0YXJ0KTsKLSAgICAgIHZhciBhZnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMu
ZW5kKTsKLQotICAgICAgcmV0dXJuICFiZWZvcmUgfHwgIWFmdGVyOwotICAgIH07Ci0KLSAgICBN
ZXRhbW9ycGgucHJvdG90eXBlLmNoZWNrUmVtb3ZlZCA9IGZ1bmN0aW9uKCkgewotICAgICAgaWYg
KHRoaXMuaXNSZW1vdmVkKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVy
Zm9ybSBvcGVyYXRpb25zIG9uIGEgTWV0YW1vcnBoIHRoYXQgaXMgbm90IGluIHRoZSBET00uIik7
Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiBNZXRhbW9ycGg7Ci0gIH0pOwotCi19KSgp
OwotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
aGFuZGxlYmFycy1jb21waWxlcgotKi8KLQotLy8gRWxpbWluYXRlIGRlcGVuZGVuY3kgb24gYW55
IEVtYmVyIHRvIHNpbXBsaWZ5IHByZWNvbXBpbGF0aW9uIHdvcmtmbG93Ci12YXIgb2JqZWN0Q3Jl
YXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbihwYXJlbnQpIHsKLSAgZnVuY3Rpb24gRigp
IHt9Ci0gIEYucHJvdG90eXBlID0gcGFyZW50OwotICByZXR1cm4gbmV3IEYoKTsKLX07Ci0KLXZh
ciBIYW5kbGViYXJzID0gKEVtYmVyLmltcG9ydHMgJiYgRW1iZXIuaW1wb3J0cy5IYW5kbGViYXJz
KSB8fCAodGhpcyAmJiB0aGlzLkhhbmRsZWJhcnMpOwotaWYgKCFIYW5kbGViYXJzICYmIHR5cGVv
ZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7Ci0gIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5k
bGViYXJzJyk7Ci19Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBI
YW5kbGViYXJzIHZlcnNpb24gMS4wIG9yIDEuMS4gSW5jbHVkZSAiICsKLSAgICAgICAgICAgICAi
YSBTQ1JJUFQgdGFnIGluIHRoZSBIVE1MIEhFQUQgbGlua2luZyB0byB0aGUgSGFuZGxlYmFycyBm
aWxlICIgKwotICAgICAgICAgICAgICJiZWZvcmUgeW91IGxpbmsgdG8gRW1iZXIuIiwgSGFuZGxl
YmFycyk7Ci0KLUVtYmVyLmFzc2VydCgiRW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBIYW5kbGVi
YXJzIHZlcnNpb24gMS4wIG9yIDEuMSwgIiArCi0gICAgICAgICAgICAgIkNPTVBJTEVSX1JFVklT
SU9OIGV4cGVjdGVkOiA0LCBnb3Q6ICIgKyAgSGFuZGxlYmFycy5DT01QSUxFUl9SRVZJU0lPTiAr
Ci0gICAgICAgICAgICAgIiAtIFBsZWFzZSBub3RlOiBCdWlsZHMgb2YgbWFzdGVyIG1heSBoYXZl
IG90aGVyIENPTVBJTEVSX1JFVklTSU9OIHZhbHVlcy4iLAotICAgICAgICAgICAgIEhhbmRsZWJh
cnMuQ09NUElMRVJfUkVWSVNJT04gPT09IDQpOwotCi0vKioKLSAgUHJlcGFyZXMgdGhlIEhhbmRs
ZWJhcnMgdGVtcGxhdGluZyBsaWJyYXJ5IGZvciB1c2UgaW5zaWRlIEVtYmVyJ3MgdmlldwotICBz
eXN0ZW0uCi0KLSAgVGhlIGBFbWJlci5IYW5kbGViYXJzYCBvYmplY3QgaXMgdGhlIHN0YW5kYXJk
IEhhbmRsZWJhcnMgbGlicmFyeSwgZXh0ZW5kZWQgdG8KLSAgdXNlIEVtYmVyJ3MgYGdldCgpYCBt
ZXRob2QgaW5zdGVhZCBvZiBkaXJlY3QgcHJvcGVydHkgYWNjZXNzLCB3aGljaCBhbGxvd3MKLSAg
Y29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXMuCi0KLSAgVG8g
Y3JlYXRlIGFuIGBFbWJlci5IYW5kbGViYXJzYCB0ZW1wbGF0ZSwgY2FsbCBgRW1iZXIuSGFuZGxl
YmFycy5jb21waWxlKClgLgotICBUaGlzIHdpbGwgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4g
YmUgdXNlZCBieSBgRW1iZXIuVmlld2AgZm9yIHJlbmRlcmluZy4KLQotICBAY2xhc3MgSGFuZGxl
YmFycwotICBAbmFtZXNwYWNlIEVtYmVyCi0qLwotRW1iZXIuSGFuZGxlYmFycyA9IG9iamVjdENy
ZWF0ZShIYW5kbGViYXJzKTsKLQotLyoqCi0gIFJlZ2lzdGVyIGEgYm91bmQgaGVscGVyIG9yIGN1
c3RvbSB2aWV3IGhlbHBlci4KLQotICAjIyBTaW1wbGUgYm91bmQgaGVscGVyIGV4YW1wbGUKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVyKCdjYXBpdGFsaXplJywg
ZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKLSAgfSk7
Ci0gIGBgYAotCi0gIFRoZSBhYm92ZSBib3VuZCBoZWxwZXIgY2FuIGJlIHVzZWQgaW5zaWRlIG9m
IHRlbXBsYXRlcyBhcyBmb2xsb3dzOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tjYXBpdGFsaXpl
IG5hbWV9fQotICBgYGAKLQotICBJbiB0aGlzIGNhc2UsIHdoZW4gdGhlIGBuYW1lYCBwcm9wZXJ0
eSBvZiB0aGUgdGVtcGxhdGUncyBjb250ZXh0IGNoYW5nZXMsCi0gIHRoZSByZW5kZXJlZCB2YWx1
ZSBvZiB0aGUgaGVscGVyIHdpbGwgdXBkYXRlIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UuCi0KLSAg
Rm9yIG1vcmUgZXhhbXBsZXMgb2YgYm91bmQgaGVscGVycywgc2VlIGRvY3VtZW50YXRpb24gZm9y
Ci0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgLgotCi0gICMjIEN1c3Rv
bSB2aWV3IGhlbHBlciBleGFtcGxlCi0KLSAgQXNzdW1pbmcgYSB2aWV3IHN1YmNsYXNzIG5hbWVk
IGBBcHAuQ2FsZW5kYXJWaWV3YCB3ZXJlIGRlZmluZWQsIGEgaGVscGVyCi0gIGZvciByZW5kZXJp
bmcgaW5zdGFuY2VzIG9mIHRoaXMgdmlldyBjb3VsZCBiZSByZWdpc3RlcmVkIGFzIGZvbGxvd3M6
Ci0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLmhlbHBlcignY2FsZW5kYXIn
LCBBcHAuQ2FsZW5kYXJWaWV3KToKLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBj
YW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6Ci0KLSAgYGBgaGFuZGxl
YmFycwotICB7e2NhbGVuZGFyfX0KLSAgYGBgCi0KLSAgV2hpY2ggaXMgZnVuY3Rpb25hbGx5IGVx
dWl2YWxlbnQgdG86Ci0KLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgQXBwLkNhbGVuZGFyVmll
d319Ci0gIGBgYAotCi0gIE9wdGlvbnMgaW4gdGhlIGhlbHBlciB3aWxsIGJlIHBhc3NlZCB0byB0
aGUgdmlldyBpbiBleGFjdGx5IHRoZSBzYW1lCi0gIG1hbm5lciBhcyB3aXRoIHRoZSBgdmlld2Ag
aGVscGVyLgotCi0gIEBtZXRob2QgaGVscGVyCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycwotICBA
cGFyYW0ge1N0cmluZ30gbmFtZQotICBAcGFyYW0ge0Z1bmN0aW9ufEVtYmVyLlZpZXd9IGZ1bmN0
aW9uIG9yIHZpZXcgY2xhc3MgY29uc3RydWN0b3IKLSAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVu
dEtleXMqCi0qLwotRW1iZXIuSGFuZGxlYmFycy5oZWxwZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1
ZSkgewotICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byByZWdpc3RlciBhIGNvbXBvbmVudCBu
YW1lZCAnIiArIG5hbWUgKyAiJywgYnV0IGNvbXBvbmVudCBuYW1lcyBtdXN0IGluY2x1ZGUgYSAn
LSciLCAhRW1iZXIuQ29tcG9uZW50LmRldGVjdCh2YWx1ZSkgfHwgbmFtZS5tYXRjaCgvLS8pKTsK
LQotICBpZiAoRW1iZXIuVmlldy5kZXRlY3QodmFsdWUpKSB7Ci0gICAgRW1iZXIuSGFuZGxlYmFy
cy5yZWdpc3RlckhlbHBlcihuYW1lLCBFbWJlci5IYW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKHZh
bHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5kSGVs
cGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Ci0gIH0KLX07Ci0KLS8qKgotICBSZXR1cm5zIGEg
aGVscGVyIGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgcHJvdmlkZWQgVmlld0NsYXNzLgotCi0g
IFVzZWQgaW50ZXJuYWxseSBieSBFbWJlci5IYW5kbGViYXJzLmhlbHBlciBhbmQgb3RoZXIgbWV0
aG9kcwotICBpbnZvbHZpbmcgaGVscGVyL2NvbXBvbmVudCByZWdpc3RyYXRpb24uCi0KLSAgQHBy
aXZhdGUKLSAgQG1ldGhvZCBoZWxwZXIKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gIEBwYXJh
bSB7RnVuY3Rpb259IFZpZXdDbGFzcyB2aWV3IGNsYXNzIGNvbnN0cnVjdG9yCi0qLwotRW1iZXIu
SGFuZGxlYmFycy5tYWtlVmlld0hlbHBlciA9IGZ1bmN0aW9uKFZpZXdDbGFzcykgewotICByZXR1
cm4gZnVuY3Rpb24ob3B0aW9ucykgewotICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IHBh
c3MgYXR0cmlidXRlcyAoc3VjaCBhcyBuYW1lPXZhbHVlKSBub3QgYmFyZSB2YWx1ZXMgdG8gYSBo
ZWxwZXIgZm9yIGEgVmlldyBmb3VuZCBpbiAnIiArIFZpZXdDbGFzcy50b1N0cmluZygpICsgIici
LCBhcmd1bWVudHMubGVuZ3RoIDwgMik7Ci0gICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVs
cGVycy52aWV3LmNhbGwodGhpcywgVmlld0NsYXNzLCBvcHRpb25zKTsKLSAgfTsKLX07Ci0KLS8q
KgotQGNsYXNzIGhlbHBlcnMKLUBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycyA9IG9iamVjdENyZWF0ZShIYW5kbGViYXJzLmhlbHBlcnMpOwot
Ci0vKioKLSAgT3ZlcnJpZGUgdGhlIHRoZSBvcGNvZGUgY29tcGlsZXIgYW5kIEphdmFTY3JpcHQg
Y29tcGlsZXIgZm9yIEhhbmRsZWJhcnMuCi0KLSAgQGNsYXNzIENvbXBpbGVyCi0gIEBuYW1lc3Bh
Y2UgRW1iZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSovCi1FbWJl
ci5IYW5kbGViYXJzLkNvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKLQotLy8gSGFuZGxlYmFycy5D
b21waWxlciBkb2Vzbid0IGV4aXN0IGluIHJ1bnRpbWUtb25seQotaWYgKEhhbmRsZWJhcnMuQ29t
cGlsZXIpIHsKLSAgRW1iZXIuSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUgPSBvYmplY3RD
cmVhdGUoSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUpOwotfQotCi1FbWJlci5IYW5kbGVi
YXJzLkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlciA9IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGls
ZXI7Ci0KLS8qKgotICBAY2xhc3MgSmF2YVNjcmlwdENvbXBpbGVyCi0gIEBuYW1lc3BhY2UgRW1i
ZXIuSGFuZGxlYmFycwotICBAcHJpdmF0ZQotICBAY29uc3RydWN0b3IKLSovCi1FbWJlci5IYW5k
bGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1bmN0aW9uKCkge307Ci0KLS8vIEhhbmRsZWJh
cnMuSmF2YVNjcmlwdENvbXBpbGVyIGRvZXNuJ3QgZXhpc3QgaW4gcnVudGltZS1vbmx5Ci1pZiAo
SGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIpIHsKLSAgRW1iZXIuSGFuZGxlYmFycy5KYXZh
U2NyaXB0Q29tcGlsZXIucHJvdG90eXBlID0gb2JqZWN0Q3JlYXRlKEhhbmRsZWJhcnMuSmF2YVNj
cmlwdENvbXBpbGVyLnByb3RvdHlwZSk7Ci0gIEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENv
bXBpbGVyLnByb3RvdHlwZS5jb21waWxlciA9IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENv
bXBpbGVyOwotfQotCi0KLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3Rv
dHlwZS5uYW1lc3BhY2UgPSAiRW1iZXIuSGFuZGxlYmFycyI7Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
SmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5pbml0aWFsaXplQnVmZmVyID0gZnVuY3Rpb24o
KSB7Ci0gIHJldHVybiAiJyciOwotfTsKLQotLyoqCi0gIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1
ZmZlciBmb3IgRW1iZXIgSGFuZGxlYmFycy4gQnkgZGVmYXVsdCwgSGFuZGxlYmFycwotICBjcmVh
dGVzIGFuIGVtcHR5IFN0cmluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaW52b2NhdGlvbiBh
bmQgYXBwZW5kcyB0bwotICBpdC4gRW1iZXIncyBIYW5kbGViYXJzIG92ZXJyaWRlcyB0aGlzIHRv
IGFwcGVuZCB0byBhIHNpbmdsZSBzaGFyZWQgYnVmZmVyLgotCi0gIEBwcml2YXRlCi0gIEBtZXRo
b2QgYXBwZW5kVG9CdWZmZXIKLSAgQHBhcmFtIHN0cmluZyB7U3RyaW5nfQotKi8KLUVtYmVyLkhh
bmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5hcHBlbmRUb0J1ZmZlciA9IGZ1
bmN0aW9uKHN0cmluZykgewotICByZXR1cm4gImRhdGEuYnVmZmVyLnB1c2goIitzdHJpbmcrIik7
IjsKLX07Ci0KLS8vIEhhY2tzIGFoZWFkOgotLy8gSGFuZGxlYmFycyBwcmVzZW50bHkgaGFzIGEg
YnVnIHdoZXJlIHRoZSBgYmxvY2tIZWxwZXJNaXNzaW5nYCBob29rCi0vLyBkb2Vzbid0IGdldCBw
YXNzZWQgdGhlIG5hbWUgb2YgdGhlIG1pc3NpbmcgaGVscGVyIG5hbWUsIGJ1dCByYXRoZXIKLS8v
IGdldHMgcGFzc2VkIHRoZSB2YWx1ZSBvZiB0aGF0IG1pc3NpbmcgaGVscGVyIGV2YWx1YXRlZCBv
biB0aGUgY3VycmVudAotLy8gY29udGV4dCwgd2hpY2ggaXMgbW9zdCBsaWtlbHkgYHVuZGVmaW5l
ZGAgYW5kIHRvdGFsbHkgdXNlbGVzcy4KLS8vCi0vLyBTbyB3ZSBhbHRlciB0aGUgY29tcGlsZWQg
dGVtcGxhdGUgZnVuY3Rpb24gdG8gcGFzcyB0aGUgbmFtZSBvZiB0aGUgaGVscGVyCi0vLyBpbnN0
ZWFkLCBhcyBleHBlY3RlZC4KLS8vCi0vLyBUaGlzIGNhbiBnbyBhd2F5IG9uY2UgdGhlIGZvbGxv
d2luZyBpcyBjbG9zZWQ6Ci0vLyBodHRwczovL2dpdGh1Yi5jb20vd3ljYXRzL2hhbmRsZWJhcnMu
anMvaXNzdWVzLzYzNAotCi12YXIgRE9UX0xPT0tVUF9SRUdFWCA9IC9oZWxwZXJzXC4oLio/KVwp
LywKLSAgICBCUkFDS0VUX1NUUklOR19MT09LVVBfUkVHRVggPSAvaGVscGVyc1xbJyguKj8pJy8s
Ci0gICAgSU5WT0NBVElPTl9TUExJVFRJTkdfUkVHRVggPSAvKC4qYmxvY2tIZWxwZXJNaXNzaW5n
XC5jYWxsXCguKikoc3RhY2tbMC05XSspKCwuKikvOwotCi1FbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlci5zdHJpbmdpZnlMYXN0QmxvY2tIZWxwZXJNaXNzaW5nSW52b2NhdGlvbiA9
IGZ1bmN0aW9uKHNvdXJjZSkgewotICB2YXIgaGVscGVySW52b2NhdGlvbiA9IHNvdXJjZVtzb3Vy
Y2UubGVuZ3RoIC0gMV0sCi0gICAgICBoZWxwZXJOYW1lID0gKERPVF9MT09LVVBfUkVHRVguZXhl
YyhoZWxwZXJJbnZvY2F0aW9uKSB8fCBCUkFDS0VUX1NUUklOR19MT09LVVBfUkVHRVguZXhlYyho
ZWxwZXJJbnZvY2F0aW9uKSlbMV0sCi0gICAgICBtYXRjaGVzID0gSU5WT0NBVElPTl9TUExJVFRJ
TkdfUkVHRVguZXhlYyhoZWxwZXJJbnZvY2F0aW9uKTsKLQotICBzb3VyY2Vbc291cmNlLmxlbmd0
aCAtIDFdID0gbWF0Y2hlc1sxXSArICInIiArIGhlbHBlck5hbWUgKyAiJyIgKyBtYXRjaGVzWzNd
OwotfQotdmFyIHN0cmluZ2lmeUJsb2NrSGVscGVyTWlzc2luZyA9IEVtYmVyLkhhbmRsZWJhcnMu
SmF2YVNjcmlwdENvbXBpbGVyLnN0cmluZ2lmeUxhc3RCbG9ja0hlbHBlck1pc3NpbmdJbnZvY2F0
aW9uOwotCi12YXIgb3JpZ2luYWxCbG9ja1ZhbHVlID0gRW1iZXIuSGFuZGxlYmFycy5KYXZhU2Ny
aXB0Q29tcGlsZXIucHJvdG90eXBlLmJsb2NrVmFsdWU7Ci1FbWJlci5IYW5kbGViYXJzLkphdmFT
Y3JpcHRDb21waWxlci5wcm90b3R5cGUuYmxvY2tWYWx1ZSA9IGZ1bmN0aW9uKCkgewotICBvcmln
aW5hbEJsb2NrVmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgc3RyaW5naWZ5QmxvY2tI
ZWxwZXJNaXNzaW5nKHRoaXMuc291cmNlKTsKLX07Ci0KLXZhciBvcmlnaW5hbEFtYmlndW91c0Js
b2NrVmFsdWUgPSBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUu
YW1iaWd1b3VzQmxvY2tWYWx1ZTsKLUVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVy
LnByb3RvdHlwZS5hbWJpZ3VvdXNCbG9ja1ZhbHVlID0gZnVuY3Rpb24oKSB7Ci0gIG9yaWdpbmFs
QW1iaWd1b3VzQmxvY2tWYWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICBzdHJpbmdpZnlC
bG9ja0hlbHBlck1pc3NpbmcodGhpcy5zb3VyY2UpOwotfTsKLQotdmFyIHByZWZpeCA9ICJlbWJl
ciIgKyAoK25ldyBEYXRlKCkpLCBpbmNyID0gMTsKLQotLyoqCi0gIFJld3JpdGUgc2ltcGxlIG11
c3RhY2hlcyBmcm9tIGB7e2Zvb319YCB0byBge3tiaW5kICJmb28ifX1gLiBUaGlzIG1lYW5zIHRo
YXQKLSAgYWxsIHNpbXBsZSBtdXN0YWNoZXMgaW4gRW1iZXIncyBIYW5kbGViYXJzIHdpbGwgYWxz
byBzZXQgdXAgYW4gb2JzZXJ2ZXIgdG8KLSAga2VlcCB0aGUgRE9NIHVwIHRvIGRhdGUgd2hlbiB0
aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBjaGFuZ2VzLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qg
bXVzdGFjaGUKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyCi0gIEBwYXJhbSBtdXN0
YWNoZQotKi8KLUVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlLm11c3RhY2hlID0g
ZnVuY3Rpb24obXVzdGFjaGUpIHsKLSAgaWYgKG11c3RhY2hlLmlzSGVscGVyICYmIG11c3RhY2hl
LmlkLnN0cmluZyA9PT0gJ2NvbnRyb2wnKSB7Ci0gICAgbXVzdGFjaGUuaGFzaCA9IG11c3RhY2hl
Lmhhc2ggfHwgbmV3IEhhbmRsZWJhcnMuQVNULkhhc2hOb2RlKFtdKTsKLSAgICBtdXN0YWNoZS5o
YXNoLnBhaXJzLnB1c2goWyJjb250cm9sSUQiLCBuZXcgSGFuZGxlYmFycy5BU1QuU3RyaW5nTm9k
ZShwcmVmaXggKyBpbmNyKyspXSk7Ci0gIH0gZWxzZSBpZiAobXVzdGFjaGUucGFyYW1zLmxlbmd0
aCB8fCBtdXN0YWNoZS5oYXNoKSB7Ci0gICAgLy8gbm8gY2hhbmdlcyByZXF1aXJlZAotICB9IGVs
c2UgewotICAgIHZhciBpZCA9IG5ldyBIYW5kbGViYXJzLkFTVC5JZE5vZGUoW3sgcGFydDogJ190
cmlhZ2VNdXN0YWNoZScgfV0pOwotCi0gICAgLy8gVXBkYXRlIHRoZSBtdXN0YWNoZSBub2RlIHRv
IGluY2x1ZGUgYSBoYXNoIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3JpZ2luYWwgbm9k
ZQotICAgIC8vIHdhcyBlc2NhcGVkLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gcHJvcGVybHkgZXNj
YXBlIHZhbHVlcyB3aGVuIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0gICAgLy8gY2hhbmdlcyBhbmQg
d2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIHZhbHVlLgotICAgIGlmICghbXVzdGFjaGUuZXNjYXBl
ZCkgewotICAgICAgbXVzdGFjaGUuaGFzaCA9IG11c3RhY2hlLmhhc2ggfHwgbmV3IEhhbmRsZWJh
cnMuQVNULkhhc2hOb2RlKFtdKTsKLSAgICAgIG11c3RhY2hlLmhhc2gucGFpcnMucHVzaChbInVu
ZXNjYXBlZCIsIG5ldyBIYW5kbGViYXJzLkFTVC5TdHJpbmdOb2RlKCJ0cnVlIildKTsKLSAgICB9
Ci0gICAgbXVzdGFjaGUgPSBuZXcgSGFuZGxlYmFycy5BU1QuTXVzdGFjaGVOb2RlKFtpZF0uY29u
Y2F0KFttdXN0YWNoZS5pZF0pLCBtdXN0YWNoZS5oYXNoLCAhbXVzdGFjaGUuZXNjYXBlZCk7Ci0g
IH0KLQotICByZXR1cm4gSGFuZGxlYmFycy5Db21waWxlci5wcm90b3R5cGUubXVzdGFjaGUuY2Fs
bCh0aGlzLCBtdXN0YWNoZSk7Ci19OwotCi0vKioKLSAgVXNlZCBmb3IgcHJlY29tcGlsYXRpb24g
b2YgRW1iZXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMuIFRoaXMgd2lsbCBub3QgYmUgdXNlZAotICBk
dXJpbmcgbm9ybWFsIGFwcCBleGVjdXRpb24uCi0KLSAgQG1ldGhvZCBwcmVjb21waWxlCi0gIEBm
b3IgRW1iZXIuSGFuZGxlYmFycwotICBAc3RhdGljCi0gIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcg
VGhlIHRlbXBsYXRlIHRvIHByZWNvbXBpbGUKLSovCi1FbWJlci5IYW5kbGViYXJzLnByZWNvbXBp
bGUgPSBmdW5jdGlvbihzdHJpbmcpIHsKLSAgdmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3Ry
aW5nKTsKLQotICB2YXIgb3B0aW9ucyA9IHsKLSAgICBrbm93bkhlbHBlcnM6IHsKLSAgICAgIGFj
dGlvbjogdHJ1ZSwKLSAgICAgIHVuYm91bmQ6IHRydWUsCi0gICAgICAnYmluZC1hdHRyJzogdHJ1
ZSwKLSAgICAgIHRlbXBsYXRlOiB0cnVlLAotICAgICAgdmlldzogdHJ1ZSwKLSAgICAgIF90cmlh
Z2VNdXN0YWNoZTogdHJ1ZQotICAgIH0sCi0gICAgZGF0YTogdHJ1ZSwKLSAgICBzdHJpbmdQYXJh
bXM6IHRydWUKLSAgfTsKLQotICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIuSGFuZGxlYmFy
cy5Db21waWxlcigpLmNvbXBpbGUoYXN0LCBvcHRpb25zKTsKLSAgcmV0dXJuIG5ldyBFbWJlci5I
YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlv
bnMsIHVuZGVmaW5lZCwgdHJ1ZSk7Ci19OwotCi0vLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgZm9y
IEhhbmRsZWJhcnMgcnVudGltZS1vbmx5Ci1pZiAoSGFuZGxlYmFycy5jb21waWxlKSB7Ci0gIC8q
KgotICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgRW1iZXIgSGFuZGxlYmFycy4gVGhpcyByZXBsYWNl
cyB0aGUgZGVmYXVsdAotICAgIGBIYW5kbGViYXJzLmNvbXBpbGVgIGFuZCB0dXJucyBvbiB0ZW1w
bGF0ZS1sb2NhbCBkYXRhIGFuZCBTdHJpbmcKLSAgICBwYXJhbWV0ZXJzLgotCi0gICAgQG1ldGhv
ZCBjb21waWxlCi0gICAgQGZvciBFbWJlci5IYW5kbGViYXJzCi0gICAgQHN0YXRpYwotICAgIEBw
YXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBsYXRlIHRvIGNvbXBpbGUKLSAgICBAcmV0dXJu
IHtGdW5jdGlvbn0KLSAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5jb21waWxlID0gZnVuY3Rpb24o
c3RyaW5nKSB7Ci0gICAgdmFyIGFzdCA9IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKLSAgICB2
YXIgb3B0aW9ucyA9IHsgZGF0YTogdHJ1ZSwgc3RyaW5nUGFyYW1zOiB0cnVlIH07Ci0gICAgdmFy
IGVudmlyb25tZW50ID0gbmV3IEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIoKS5jb21waWxlKGFz
dCwgb3B0aW9ucyk7Ci0gICAgdmFyIHRlbXBsYXRlU3BlYyA9IG5ldyBFbWJlci5IYW5kbGViYXJz
LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVm
aW5lZCwgdHJ1ZSk7Ci0KLSAgICB2YXIgdGVtcGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLnRlbXBs
YXRlKHRlbXBsYXRlU3BlYyk7Ci0gICAgdGVtcGxhdGUuaXNNZXRob2QgPSBmYWxzZTsgLy9NYWtl
IHN1cmUgd2UgZG9uJ3Qgd3JhcCB0ZW1wbGF0ZXMgd2l0aCAuX3N1cGVyCi0KLSAgICByZXR1cm4g
dGVtcGxhdGU7Ci0gIH07Ci19Ci0KLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotdmFyIHNsaWNl
ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAotICAgIG9yaWdpbmFsVGVtcGxhdGUgPSBFbWJlci5I
YW5kbGViYXJzLnRlbXBsYXRlOwotCi0vKioKLSAgSWYgYSBwYXRoIHN0YXJ0cyB3aXRoIGEgcmVz
ZXJ2ZWQga2V5d29yZCwgcmV0dXJucyB0aGUgcm9vdAotICB0aGF0IHNob3VsZCBiZSB1c2VkLgot
Ci0gIEBwcml2YXRlCi0gIEBtZXRob2Qgbm9ybWFsaXplUGF0aAotICBAZm9yIEVtYmVyCi0gIEBw
YXJhbSByb290IHtPYmplY3R9Ci0gIEBwYXJhbSBwYXRoIHtTdHJpbmd9Ci0gIEBwYXJhbSBkYXRh
IHtIYXNofQotKi8KLXZhciBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxp
emVQYXRoID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwgZGF0YSkgewotICB2YXIga2V5d29yZHMgPSAo
ZGF0YSAmJiBkYXRhLmtleXdvcmRzKSB8fCB7fSwKLSAgICAgIGtleXdvcmQsIGlzS2V5d29yZDsK
LQotICAvLyBHZXQgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGguIEZvciBleGFtcGxlLCBp
ZiB0aGUKLSAgLy8gcGF0aCBpcyAiZm9vLmJhci5iYXoiLCByZXR1cm5zICJmb28iLgotICBrZXl3
b3JkID0gcGF0aC5zcGxpdCgnLicsIDEpWzBdOwotCi0gIC8vIFRlc3QgdG8gc2VlIGlmIHRoZSBm
aXJzdCBwYXRoIGlzIGEga2V5d29yZCB0aGF0IGhhcyBiZWVuCi0gIC8vIHBhc3NlZCBhbG9uZyBp
biB0aGUgdmlldydzIGRhdGEgaGFzaC4gSWYgc28sIHdlIHdpbGwgdHJlYXQKLSAgLy8gdGhhdCBv
YmplY3QgYXMgdGhlIG5ldyByb290LgotICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5
d29yZCkpIHsKLSAgICAvLyBMb29rIHVwIHRoZSB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUncyBkYXRh
IGhhc2guCi0gICAgcm9vdCA9IGtleXdvcmRzW2tleXdvcmRdOwotICAgIGlzS2V5d29yZCA9IHRy
dWU7Ci0KLSAgICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGVudGlyZSBwYXRoIGlzIHRoZSBy
ZXNlcnZlZAotICAgIC8vIHdvcmQuIEluIHRoYXQgY2FzZSwgcmV0dXJuIHRoZSBvYmplY3QgaXRz
ZWxmLgotICAgIGlmIChwYXRoID09PSBrZXl3b3JkKSB7Ci0gICAgICBwYXRoID0gJyc7Ci0gICAg
fSBlbHNlIHsKLSAgICAgIC8vIFN0cmlwIHRoZSBrZXl3b3JkIGZyb20gdGhlIHBhdGggYW5kIGxv
b2sgdXAKLSAgICAgIC8vIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbmV3bHkgZm91bmQgcm9vdC4K
LSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihrZXl3b3JkLmxlbmd0aCsxKTsKLSAgICB9Ci0gIH0K
LQotICByZXR1cm4geyByb290OiByb290LCBwYXRoOiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29y
ZCB9OwotfTsKLQotCi0vKioKLSAgTG9va3VwIGJvdGggb24gcm9vdCBhbmQgb24gd2luZG93LiBJ
ZiB0aGUgcGF0aCBzdGFydHMgd2l0aAotICBhIGtleXdvcmQsIHRoZSBjb3JyZXNwb25kaW5nIG9i
amVjdCB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUKLSAgdGVtcGxhdGUncyBkYXRhIGhhc2ggYW5k
IHVzZWQgdG8gcmVzb2x2ZSB0aGUgcGF0aC4KLQotICBAbWV0aG9kIGdldAotICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMKLSAgQHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBsb29rIHVw
IHRoZSBwcm9wZXJ0eSBvbgotICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBiZSBs
b29rZWR1cAotICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgdGVtcGxhdGUncyBvcHRpb24g
aGFzaAotKi8KLXZhciBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQgPSBmdW5j
dGlvbihyb290LCBwYXRoLCBvcHRpb25zKSB7Ci0gIHZhciBkYXRhID0gb3B0aW9ucyAmJiBvcHRp
b25zLmRhdGEsCi0gICAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGgocm9vdCwgcGF0
aCwgZGF0YSksCi0gICAgICB2YWx1ZTsKLQotICAKLSAgICByb290ID0gbm9ybWFsaXplZFBhdGgu
cm9vdDsKLSAgICBwYXRoID0gbm9ybWFsaXplZFBhdGgucGF0aDsKLQotICAgIHZhbHVlID0gRW1i
ZXIuZ2V0KHJvb3QsIHBhdGgpOwotCi0gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcm9v
dCAhPT0gRW1iZXIubG9va3VwICYmIEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewotICAgICAg
dmFsdWUgPSBFbWJlci5nZXQoRW1iZXIubG9va3VwLCBwYXRoKTsKLSAgICB9Ci0gIAotCi0gIHJl
dHVybiB2YWx1ZTsKLX07Ci0KLUVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZVBhcmFtcyA9IGZ1bmN0
aW9uKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucykgewotICB2YXIgcmVzb2x2ZWRQYXJhbXMgPSBb
XSwgdHlwZXMgPSBvcHRpb25zLnR5cGVzLCBwYXJhbSwgdHlwZTsKLQotICBmb3IgKHZhciBpPTAs
IGw9cGFyYW1zLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICBwYXJhbSA9IHBhcmFtc1tpXTsKLSAg
ICB0eXBlID0gdHlwZXNbaV07Ci0KLSAgICBpZiAodHlwZSA9PT0gJ0lEJykgewotICAgICAgcmVz
b2x2ZWRQYXJhbXMucHVzaChoYW5kbGViYXJzR2V0KGNvbnRleHQsIHBhcmFtLCBvcHRpb25zKSk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc29sdmVkUGFyYW1zLnB1c2gocGFyYW0pOwotICAgIH0K
LSAgfQotCi0gIHJldHVybiByZXNvbHZlZFBhcmFtczsKLX07Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
cmVzb2x2ZUhhc2ggPSBmdW5jdGlvbihjb250ZXh0LCBoYXNoLCBvcHRpb25zKSB7Ci0gIHZhciBy
ZXNvbHZlZEhhc2ggPSB7fSwgdHlwZXMgPSBvcHRpb25zLmhhc2hUeXBlcywgdHlwZTsKLQotICBm
b3IgKHZhciBrZXkgaW4gaGFzaCkgewotICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShrZXkp
KSB7IGNvbnRpbnVlOyB9Ci0KLSAgICB0eXBlID0gdHlwZXNba2V5XTsKLQotICAgIGlmICh0eXBl
ID09PSAnSUQnKSB7Ci0gICAgICByZXNvbHZlZEhhc2hba2V5XSA9IGhhbmRsZWJhcnNHZXQoY29u
dGV4dCwgaGFzaFtrZXldLCBvcHRpb25zKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzb2x2ZWRI
YXNoW2tleV0gPSBoYXNoW2tleV07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc29sdmVkSGFz
aDsKLX07Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBoZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdp
bGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdpdGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJl
IGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgK
LSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0KLSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9u
IHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJh
Y2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAg
QG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0g
IEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihwYXRo
KSB7Ci0gIHZhciBlcnJvciwgdmlldyA9ICIiOwotCi0gIHZhciBvcHRpb25zID0gYXJndW1lbnRz
W2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKLQotICB2YXIgaGVscGVyID0gRW1iZXIuSGFuZGxlYmFy
cy5yZXNvbHZlSGVscGVyKG9wdGlvbnMuZGF0YS52aWV3LmNvbnRhaW5lciwgcGF0aCk7Ci0KLSAg
aWYgKGhlbHBlcikgewotICAgIHJldHVybiBoZWxwZXIuYXBwbHkodGhpcywgc2xpY2UuY2FsbChh
cmd1bWVudHMsIDEpKTsKLSAgfQotCi0gIGVycm9yID0gIiVAIEhhbmRsZWJhcnMgZXJyb3I6IENv
dWxkIG5vdCBmaW5kIHByb3BlcnR5ICclQCcgb24gb2JqZWN0ICVALiI7Ci0gIGlmIChvcHRpb25z
LmRhdGEpIHsKLSAgICB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7Ci0gIH0KLSAgdGhyb3cgbmV3
IEVtYmVyLkVycm9yKEVtYmVyLlN0cmluZy5mbXQoZXJyb3IsIFt2aWV3LCBwYXRoLCB0aGlzXSkp
OwotfSk7Ci0KLS8qKgotICBSZWdpc3RlcnMgYSBoZWxwZXIgaW4gSGFuZGxlYmFycyB0aGF0IHdp
bGwgYmUgY2FsbGVkIGlmIG5vIHByb3BlcnR5IHdpdGggdGhlCi0gIGdpdmVuIG5hbWUgY2FuIGJl
IGZvdW5kIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgK
LSAgdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQuCi0KLSAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9u
IHdpdGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBzbyB0aGUgdXNlciBjYW4KLSAgdHJh
Y2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcuCi0KLSAgQHByaXZhdGUKLSAg
QG1ldGhvZCBoZWxwZXJNaXNzaW5nCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0g
IEBwYXJhbSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVy
LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9u
KHBhdGgpIHsKLQotICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0g
MV07Ci0KLSAgRW1iZXIuYXNzZXJ0KCJgYmxvY2tIZWxwZXJNaXNzaW5nYCB3YXMgaW52b2tlZCB3
aXRob3V0IGEgaGVscGVyIG5hbWUsIHdoaWNoICIgKwotICAgICAgICAgICAgICAgImlzIG1vc3Qg
bGlrZWx5IGR1ZSB0byBhIG1pc21hdGNoIGJldHdlZW4gdGhlIHZlcnNpb24gb2YgIiArCi0gICAg
ICAgICAgICAgICAiRW1iZXIuanMgeW91J3JlIHJ1bm5pbmcgbm93IGFuZCB0aGUgb25lIHVzZWQg
dG8gcHJlY29tcGlsZSB5b3VyICIgKwotICAgICAgICAgICAgICAgInRlbXBsYXRlcy4gUGxlYXNl
IG1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBvZiAiICsKLSAgICAgICAgICAgICAgICJgZW1iZXItaGFu
ZGxlYmFycy1jb21waWxlcmAgeW91J3JlIHVzaW5nIGlzIHVwIHRvIGRhdGUuIiwgcGF0aCk7Ci0K
LSAgdmFyIGhlbHBlciA9IEVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhlbHBlcihvcHRpb25zLmRh
dGEudmlldy5jb250YWluZXIsIHBhdGgpOwotCi0gIGlmIChoZWxwZXIpIHsKLSAgICByZXR1cm4g
aGVscGVyLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gIH0gZWxzZSB7
Ci0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy5oZWxwZXJNaXNzaW5nLmNhbGwodGhpcywg
cGF0aCk7Ci0gIH0KLQotICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLmJsb2NrSGVscGVyTWlz
c2luZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotfSk7Ci0KLS8qKgotICBSZWdpc3RlciBhIGJv
dW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBoZWxwZXJzIGJlaGF2ZSBzaW1pbGFybHkgdG8g
cmVndWxhcgotICBoYW5kbGViYXJzIGhlbHBlcnMsIHdpdGggdGhlIGFkZGVkIGFiaWxpdHkgdG8g
cmUtcmVuZGVyIHdoZW4gdGhlIHVuZGVybHlpbmcgZGF0YQotICBjaGFuZ2VzLgotCi0gICMjIFNp
bXBsZSBleGFtcGxlCi0KLSAgYGBgamF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lz
dGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemUnLCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVy
biB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotICB9KTsKLSAgYGBgCi0KLSAgVGhlIGFib3ZlIGJvdW5k
IGhlbHBlciBjYW4gYmUgdXNlZCBpbnNpZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6Ci0KLSAg
YGBgaGFuZGxlYmFycwotICB7e2NhcGl0YWxpemUgbmFtZX19Ci0gIGBgYAotCi0gIEluIHRoaXMg
Y2FzZSwgd2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHRoZSB0ZW1wbGF0ZSdzIGNvbnRleHQg
Y2hhbmdlcywKLSAgdGhlIHJlbmRlcmVkIHZhbHVlIG9mIHRoZSBoZWxwZXIgd2lsbCB1cGRhdGUg
dG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KLQotICAjIyBFeGFtcGxlIHdpdGggb3B0aW9ucwotCi0g
IExpa2Ugbm9ybWFsIGhhbmRsZWJhcnMgaGVscGVycywgYm91bmQgaGVscGVycyBoYXZlIGFjY2Vz
cyB0byB0aGUgb3B0aW9ucwotICBwYXNzZWQgaW50byB0aGUgaGVscGVyIGNhbGwuCi0KLSAgYGBg
amF2YXNjcmlwdAotICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ3JlcGVh
dCcsIGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7Ci0gICAgdmFyIGNvdW50ID0gb3B0aW9ucy5o
YXNoLmNvdW50OwotICAgIHZhciBhID0gW107Ci0gICAgd2hpbGUoYS5sZW5ndGggPCBjb3VudCkg
ewotICAgICAgICBhLnB1c2godmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gYS5qb2luKCcnKTsK
LSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgaGVscGVyIGNvdWxkIGJlIHVzZWQgaW4gYSB0ZW1wbGF0
ZSBhcyBmb2xsb3dzOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudD0z
fX0KLSAgYGBgCi0KLSAgIyMgRXhhbXBsZSB3aXRoIGJvdW5kIG9wdGlvbnMKLQotICBCb3VuZCBo
YXNoIG9wdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkLiBFeGFtcGxlOgotCi0gIGBgYGhhbmRsZWJh
cnMKLSAge3tyZXBlYXQgdGV4dCBjb3VudEJpbmRpbmc9Im51bVJlcGVhdHMifX0KLSAgYGBgCi0K
LSAgSW4gdGhpcyBleGFtcGxlLCBjb3VudCB3aWxsIGJlIGJvdW5kIHRvIHRoZSB2YWx1ZSBvZgot
ICB0aGUgYG51bVJlcGVhdHNgIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0LiBJZiB0aGF0IHByb3Bl
cnR5Ci0gIGNoYW5nZXMsIHRoZSBoZWxwZXIgd2lsbCBiZSByZS1yZW5kZXJlZC4KLQotICAjIyBF
eGFtcGxlIHdpdGggZXh0cmEgZGVwZW5kZW5jaWVzCi0KLSAgVGhlIGBFbWJlci5IYW5kbGViYXJz
LnJlZ2lzdGVyQm91bmRIZWxwZXJgIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIGxlbmd0aAotICB0
aGlyZCBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIGV4dHJhIGRlcGVuZGVuY2llcyBvbiB0aGUg
cGFzc2VkIGluIHZhbHVlLgotICBUaGlzIGFsbG93cyB0aGUgaGFuZGxlYmFycyBoZWxwZXIgdG8g
dXBkYXRlIHdoZW4gdGhlc2UgZGVwZW5kZW5jaWVzIGNoYW5nZS4KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBlcignY2FwaXRhbGl6ZU5hbWUn
LCBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZS5nZXQoJ25hbWUnKS50b1VwcGVy
Q2FzZSgpOwotICB9LCAnbmFtZScpOwotICBgYGAKLQotICAjIyBFeGFtcGxlIHdpdGggbXVsdGlw
bGUgYm91bmQgcHJvcGVydGllcwotCi0gIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRI
ZWxwZXJgIHN1cHBvcnRzIGJpbmRpbmcgdG8KLSAgbXVsdGlwbGUgcHJvcGVydGllcywgZS5nLjoK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJCb3VuZEhlbHBl
cignY29uY2F0ZW5hdGUnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgdmFsdWVzID0gQXJyYXkucHJv
dG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7Ci0gICAgcmV0dXJuIHZhbHVlcy5q
b2luKCd8fCcpOwotICB9KTsKLSAgYGBgCi0KLSAgV2hpY2ggYWxsb3dzIGZvciB0ZW1wbGF0ZSBz
eW50YXggc3VjaCBhcyBge3tjb25jYXRlbmF0ZSBwcm9wMSBwcm9wMn19YCBvcgotICBge3tjb25j
YXRlbmF0ZSBwcm9wMSBwcm9wMiBwcm9wM319YC4gSWYgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNo
YW5nZSwKLSAgdGhlIGhlbHByIHdpbGwgcmUtcmVuZGVyLiAgTm90ZSB0aGF0IGRlcGVuZGVuY3kg
a2V5cyBjYW5ub3QgYmUKLSAgdXNpbmcgaW4gY29uanVuY3Rpb24gd2l0aCBtdWx0aS1wcm9wZXJ0
eSBoZWxwZXJzLCBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMKLSAgd2hpY2ggcHJvcGVydHkgdGhlIGRl
cGVuZGVudCBrZXlzIHdvdWxkIGJlbG9uZyB0by4KLQotICAjIyBVc2Ugd2l0aCB1bmJvdW5kIGhl
bHBlcgotCi0gIFRoZSBge3t1bmJvdW5kfX1gIGhlbHBlciBjYW4gYmUgdXNlZCB3aXRoIGJvdW5k
IGhlbHBlciBpbnZvY2F0aW9ucwotICB0byByZW5kZXIgdGhlbSBpbiB0aGVpciB1bmJvdW5kIGZv
cm0sIGUuZy4KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dW5ib3VuZCBjYXBpdGFsaXplIG5hbWV9
fQotICBgYGAKLQotICBJbiB0aGlzIGV4YW1wbGUsIGlmIHRoZSBuYW1lIHByb3BlcnR5IGNoYW5n
ZXMsIHRoZSBoZWxwZXIKLSAgd2lsbCBub3QgcmUtcmVuZGVyLgotCi0gICMjIFVzZSB3aXRoIGJs
b2NrcyBub3Qgc3VwcG9ydGVkCi0KLSAgQm91bmQgaGVscGVycyBkbyBub3Qgc3VwcG9ydCB1c2Ug
d2l0aCBIYW5kbGViYXJzIGJsb2NrcyBvcgotICB0aGUgYWRkaXRpb24gb2YgY2hpbGQgdmlld3Mg
b2YgYW55IGtpbmQuCi0KLSAgQG1ldGhvZCByZWdpc3RlckJvdW5kSGVscGVyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge1N0cmluZ30gbmFtZQotICBAcGFyYW0ge0Z1bmN0aW9u
fSBmdW5jdGlvbgotICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50S2V5cyoKLSovCi1FbWJlci5I
YW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIgPSBmdW5jdGlvbihuYW1lLCBmbikgewotICB2
YXIgYm91bmRIZWxwZXJBcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLAotICAgICAgYm91
bmRGbiA9IEVtYmVyLkhhbmRsZWJhcnMubWFrZUJvdW5kSGVscGVyLmFwcGx5KHRoaXMsIGJvdW5k
SGVscGVyQXJncyk7Ci0gIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIobmFtZSwgYm91
bmRGbik7Ci19OwotCi0vKioKLSAgQSAobW9zdGx5KSBwcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0
byBgcmVnaXN0ZXJCb3VuZEhlbHBlcmAuIFRha2VzIHRoZQotICBwcm92aWRlZCBIYW5kbGViYXJz
IGhlbHBlciBmdW5jdGlvbiBmbiBhbmQgcmV0dXJucyBpdCBpbiB3cmFwcGVkCi0gIGJvdW5kIGhl
bHBlciBmb3JtLgotCi0gIFRoZSBtYWluIHVzZSBjYXNlIGZvciB1c2luZyB0aGlzIG91dHNpZGUg
b2YgYHJlZ2lzdGVyQm91bmRIZWxwZXJgCi0gIGlzIGZvciByZWdpc3RlcmluZyBoZWxwZXJzIG9u
IHRoZSBjb250YWluZXI6Ci0KLSAgYGBganMKLSAgdmFyIGJvdW5kSGVscGVyRm4gPSBFbWJlci5I
YW5kbGViYXJzLm1ha2VCb3VuZEhlbHBlcihmdW5jdGlvbih3b3JkKSB7Ci0gICAgcmV0dXJuIHdv
cmQudG9VcHBlckNhc2UoKTsKLSAgfSk7Ci0KLSAgY29udGFpbmVyLnJlZ2lzdGVyKCdoZWxwZXI6
bXktYm91bmQtaGVscGVyJywgYm91bmRIZWxwZXJGbik7Ci0gIGBgYAotCi0gIEluIHRoZSBhYm92
ZSBleGFtcGxlLCBpZiB0aGUgaGVscGVyIGZ1bmN0aW9uIGhhZG4ndCBiZWVuIHdyYXBwZWQgaW4K
LSAgYG1ha2VCb3VuZEhlbHBlcmAsIHRoZSByZWdpc3RlcmVkIGhlbHBlciB3b3VsZCBiZSB1bmJv
dW5kLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2QgbWFrZUJvdW5kSGVscGVyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdGlvbgotICBAcGFyYW0ge1N0
cmluZ30gZGVwZW5kZW50S2V5cyoKLSovCi1FbWJlci5IYW5kbGViYXJzLm1ha2VCb3VuZEhlbHBl
ciA9IGZ1bmN0aW9uKGZuKSB7Ci0gIHZhciBkZXBlbmRlbnRLZXlzID0gc2xpY2UuY2FsbChhcmd1
bWVudHMsIDEpOwotCi0gIGZ1bmN0aW9uIGhlbHBlcigpIHsKLSAgICB2YXIgcHJvcGVydGllcyA9
IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSksCi0gICAgICBudW1Qcm9wZXJ0aWVzID0gcHJv
cGVydGllcy5sZW5ndGgsCi0gICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5n
dGggLSAxXSwKLSAgICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzID0gW10sCi0gICAgICBkYXRhID0g
b3B0aW9ucy5kYXRhLAotICAgICAgdHlwZXMgPSBkYXRhLmlzVW5ib3VuZCA/IHNsaWNlLmNhbGwo
b3B0aW9ucy50eXBlcywgMSkgOiBvcHRpb25zLnR5cGVzLAotICAgICAgaGFzaCA9IG9wdGlvbnMu
aGFzaCwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBjb250ZXh0cyA9IG9wdGlvbnMu
Y29udGV4dHMsCi0gICAgICBjdXJyZW50Q29udGV4dCA9IChjb250ZXh0cyAmJiBjb250ZXh0cy5s
ZW5ndGgpID8gY29udGV4dHNbMF0gOiB0aGlzLAotICAgICAgcHJlZml4UGF0aEZvckRlcGVuZGVu
dEtleXMgPSAnJywKLSAgICAgIGxvYywgbGVuLCBoYXNoT3B0aW9uLAotICAgICAgYm91bmRPcHRp
b24sIHByb3BlcnR5LAotICAgICAgbm9ybWFsaXplZFZhbHVlID0gRW1iZXIuX1NpbXBsZUhhbmRs
ZWJhcnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVkVmFsdWU7Ci0KLSAgICBFbWJlci5hc3NlcnQo
InJlZ2lzdGVyQm91bmRIZWxwZXItZ2VuZXJhdGVkIGhlbHBlcnMgZG8gbm90IHN1cHBvcnQgdXNl
IHdpdGggSGFuZGxlYmFycyBibG9ja3MuIiwgIW9wdGlvbnMuZm4pOwotCi0gICAgLy8gRGV0ZWN0
IGJvdW5kIG9wdGlvbnMgKGUuZy4gY291bnRCaW5kaW5nPSJvdGhlckNvdW50IikKLSAgICB2YXIg
Ym91bmRPcHRpb25zID0gaGFzaC5ib3VuZE9wdGlvbnMgPSB7fTsKLSAgICBmb3IgKGhhc2hPcHRp
b24gaW4gaGFzaCkgewotICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChoYXNoT3B0aW9u
KSkgewotICAgICAgICAvLyBMb3Agb2ZmICdCaW5kaW5nJyBzdWZmaXguCi0gICAgICAgIGJvdW5k
T3B0aW9uc1toYXNoT3B0aW9uLnNsaWNlKDAsIC03KV0gPSBoYXNoW2hhc2hPcHRpb25dOwotICAg
ICAgfQotICAgIH0KLQotICAgIC8vIEV4cG9zZSBwcm9wZXJ0eSBuYW1lcyBvbiBkYXRhLnByb3Bl
cnRpZXMgb2JqZWN0LgotICAgIHZhciB3YXRjaGVkUHJvcGVydGllcyA9IFtdOwotICAgIGRhdGEu
cHJvcGVydGllcyA9IFtdOwotICAgIGZvciAobG9jID0gMDsgbG9jIDwgbnVtUHJvcGVydGllczsg
Kytsb2MpIHsKLSAgICAgIGRhdGEucHJvcGVydGllcy5wdXNoKHByb3BlcnRpZXNbbG9jXSk7Ci0g
ICAgICBpZiAodHlwZXNbbG9jXSA9PT0gJ0lEJykgewotICAgICAgICB2YXIgbm9ybWFsaXplZFBy
b3AgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0aWVzW2xvY10sIGRhdGEp
OwotICAgICAgICBub3JtYWxpemVkUHJvcGVydGllcy5wdXNoKG5vcm1hbGl6ZWRQcm9wKTsKLSAg
ICAgICAgd2F0Y2hlZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVkUHJvcCk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICBpZihkYXRhLmlzVW5ib3VuZCkgewotICAgICAgICAgIG5vcm1hbGl6ZWRQ
cm9wZXJ0aWVzLnB1c2goe3BhdGg6IHByb3BlcnRpZXNbbG9jXX0pOwotICAgICAgICB9ZWxzZSB7
Ci0gICAgICAgICAgbm9ybWFsaXplZFByb3BlcnRpZXMucHVzaChudWxsKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gaGVscGVyIGludm9jYXRp
b24gaXMgcHJlY2VkZWQgYnkgYHVuYm91bmRgLCBlLmcuCi0gICAgLy8ge3t1bmJvdW5kIG15SGVs
cGVyIGZvb319Ci0gICAgaWYgKGRhdGEuaXNVbmJvdW5kKSB7Ci0gICAgICByZXR1cm4gZXZhbHVh
dGVVbmJvdW5kSGVscGVyKHRoaXMsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucyk7
Ci0gICAgfQotCi0gICAgdmFyIGJpbmRWaWV3ID0gbmV3IEVtYmVyLl9TaW1wbGVIYW5kbGViYXJz
VmlldyhudWxsLCBudWxsLCAhb3B0aW9ucy5oYXNoLnVuZXNjYXBlZCwgb3B0aW9ucy5kYXRhKTsK
LQotICAgIC8vIE92ZXJyaWRlIFNpbXBsZUhhbmRsZWJhcnNWaWV3J3MgbWV0aG9kIGZvciBnZW5l
cmF0aW5nIHRoZSB2aWV3J3MgY29udGVudC4KLSAgICBiaW5kVmlldy5ub3JtYWxpemVkVmFsdWUg
PSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBhcmdzID0gW10sIGJvdW5kT3B0aW9uOwotCi0gICAg
ICAvLyBDb3B5IG92ZXIgYm91bmQgaGFzaCBvcHRpb25zLgotICAgICAgZm9yIChib3VuZE9wdGlv
biBpbiBib3VuZE9wdGlvbnMpIHsKLSAgICAgICAgaWYgKCFib3VuZE9wdGlvbnMuaGFzT3duUHJv
cGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgIHByb3BlcnR5ID0gbm9y
bWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgZGF0
YSk7Ci0gICAgICAgIGJpbmRWaWV3LnBhdGggPSBwcm9wZXJ0eS5wYXRoOwotICAgICAgICBiaW5k
Vmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7Ci0gICAgICAgIGhhc2hbYm91bmRPcHRpb25d
ID0gbm9ybWFsaXplZFZhbHVlLmNhbGwoYmluZFZpZXcpOwotICAgICAgfQotCi0gICAgICBmb3Ig
KGxvYyA9IDA7IGxvYyA8IG51bVByb3BlcnRpZXM7ICsrbG9jKSB7Ci0gICAgICAgIHByb3BlcnR5
ID0gbm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsKLSAgICAgICAgaWYgKHByb3BlcnR5KSB7Ci0g
ICAgICAgICAgYmluZFZpZXcucGF0aCA9IHByb3BlcnR5LnBhdGg7Ci0gICAgICAgICAgYmluZFZp
ZXcucGF0aFJvb3QgPSBwcm9wZXJ0eS5yb290OwotICAgICAgICAgIGFyZ3MucHVzaChub3JtYWxp
emVkVmFsdWUuY2FsbChiaW5kVmlldykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFy
Z3MucHVzaChwcm9wZXJ0aWVzW2xvY10pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhcmdz
LnB1c2gob3B0aW9ucyk7Ci0KLSAgICAgIC8vIFJ1biB0aGUgc3VwcGxpZWQgaGVscGVyIGZ1bmN0
aW9uLgotICAgICAgcmV0dXJuIGZuLmFwcGx5KGN1cnJlbnRDb250ZXh0LCBhcmdzKTsKLSAgICB9
OwotCi0gICAgdmlldy5hcHBlbmRDaGlsZChiaW5kVmlldyk7Ci0KLSAgICAvLyBBc3NlbWJsZSBs
aXN0IG9mIHdhdGNoZWQgcHJvcGVydGllcyB0aGF0J2xsIHJlLXJlbmRlciB0aGlzIGhlbHBlci4K
LSAgICBmb3IgKGJvdW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAgICAgaWYgKGJvdW5k
T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShib3VuZE9wdGlvbikpIHsKLSAgICAgICAgd2F0Y2hlZFBy
b3BlcnRpZXMucHVzaChub3JtYWxpemVQYXRoKGN1cnJlbnRDb250ZXh0LCBib3VuZE9wdGlvbnNb
Ym91bmRPcHRpb25dLCBkYXRhKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2JzZXJ2ZSBl
YWNoIHByb3BlcnR5LgotICAgIGZvciAobG9jID0gMCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMu
bGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7Ci0gICAgICBwcm9wZXJ0eSA9IHdhdGNoZWRQcm9w
ZXJ0aWVzW2xvY107Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocHJvcGVydHkucm9vdCwg
cHJvcGVydHkucGF0aCwgYmluZFZpZXcsIGJpbmRWaWV3LnJlcmVuZGVyKTsKLSAgICB9Ci0KLSAg
ICBpZiAodHlwZXNbMF0gIT09ICdJRCcgfHwgbm9ybWFsaXplZFByb3BlcnRpZXMubGVuZ3RoID09
PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQWRkIGRlcGVuZGVudCBrZXkg
b2JzZXJ2ZXJzIHRvIHRoZSBmaXJzdCBwYXJhbQotICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFs
aXplZFByb3BlcnRpZXNbMF0sCi0gICAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290LAot
ICAgICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoOwotCi0gICAgaWYoIUVtYmVyLmlzRW1wdHko
cGF0aCkpIHsKLSAgICAgIHByZWZpeFBhdGhGb3JEZXBlbmRlbnRLZXlzID0gcGF0aCArICcuJzsK
LSAgICB9Ci0gICAgZm9yICh2YXIgaT0wLCBsPWRlcGVuZGVudEtleXMubGVuZ3RoOyBpPGw7IGkr
KykgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKHBhdGhSb290LCBwcmVmaXhQYXRoRm9y
RGVwZW5kZW50S2V5cyArIGRlcGVuZGVudEtleXNbaV0sIGJpbmRWaWV3LCBiaW5kVmlldy5yZXJl
bmRlcik7Ci0gICAgfQotICB9Ci0KLSAgaGVscGVyLl9yYXdGdW5jdGlvbiA9IGZuOwotICByZXR1
cm4gaGVscGVyOwotfTsKLQotLyoqCi0gIFJlbmRlcnMgdGhlIHVuYm91bmQgZm9ybSBvZiBhbiBv
dGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9uLgotCi0gIEBwcml2YXRlCi0gIEBtZXRob2Qg
ZXZhbHVhdGVVbmJvdW5kSGVscGVyCi0gIEBwYXJhbSB7RnVuY3Rpb259IGZuCi0gIEBwYXJhbSB7
T2JqZWN0fSBjb250ZXh0Ci0gIEBwYXJhbSB7QXJyYXl9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzCi0g
IEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zCi0qLwotZnVuY3Rpb24gZXZhbHVhdGVVbmJvdW5kSGVs
cGVyKGNvbnRleHQsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucykgewotICB2YXIg
YXJncyA9IFtdLAotICAgaGFzaCA9IG9wdGlvbnMuaGFzaCwKLSAgIGJvdW5kT3B0aW9ucyA9IGhh
c2guYm91bmRPcHRpb25zLAotICAgdHlwZXMgPSBzbGljZS5jYWxsKG9wdGlvbnMudHlwZXMsIDEp
LAotICAgbG9jLAotICAgbGVuLAotICAgcHJvcGVydHksCi0gICBwcm9wZXJ0eVR5cGUsCi0gICBi
b3VuZE9wdGlvbjsKLQotICBmb3IgKGJvdW5kT3B0aW9uIGluIGJvdW5kT3B0aW9ucykgewotICAg
IGlmICghYm91bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5kT3B0aW9uKSkgeyBjb250aW51
ZTsgfQotICAgIGhhc2hbYm91bmRPcHRpb25dID0gRW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4
dCwgYm91bmRPcHRpb25zW2JvdW5kT3B0aW9uXSwgb3B0aW9ucyk7Ci0gIH0KLQotICBmb3IobG9j
ID0gMCwgbGVuID0gbm9ybWFsaXplZFByb3BlcnRpZXMubGVuZ3RoOyBsb2MgPCBsZW47ICsrbG9j
KSB7Ci0gICAgcHJvcGVydHkgPSBub3JtYWxpemVkUHJvcGVydGllc1tsb2NdOwotICAgIHByb3Bl
cnR5VHlwZSA9IHR5cGVzW2xvY107Ci0gICAgaWYocHJvcGVydHlUeXBlID09PSAiSUQiKSB7Ci0g
ICAgICBhcmdzLnB1c2goRW1iZXIuSGFuZGxlYmFycy5nZXQocHJvcGVydHkucm9vdCwgcHJvcGVy
dHkucGF0aCwgb3B0aW9ucykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhcmdzLnB1c2gocHJvcGVy
dHkucGF0aCk7Ci0gICAgfQotICB9Ci0gIGFyZ3MucHVzaChvcHRpb25zKTsKLSAgcmV0dXJuIGZu
LmFwcGx5KGNvbnRleHQsIGFyZ3MpOwotfQotCi0vKioKLSAgT3ZlcnJpZGVzIEhhbmRsZWJhcnMu
dGVtcGxhdGUgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2gKLSAgdXNlci1jcmVhdGVkLCB0b3At
bGV2ZWwgdGVtcGxhdGVzIGZyb20gaW5uZXIgY29udGV4dHMuCi0KLSAgQHByaXZhdGUKLSAgQG1l
dGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKLSAgQHBhcmFtIHtTdHJpbmd9
IHNwZWMKLSovCi1FbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykgewot
ICB2YXIgdCA9IG9yaWdpbmFsVGVtcGxhdGUoc3BlYyk7Ci0gIHQuaXNUb3AgPSB0cnVlOwotICBy
ZXR1cm4gdDsKLX07Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgTWFyayBh
IHN0cmluZyBhcyBzYWZlIGZvciB1bmVzY2FwZWQgb3V0cHV0IHdpdGggSGFuZGxlYmFycy4gSWYg
eW91Ci0gIHJldHVybiBIVE1MIGZyb20gYSBIYW5kbGViYXJzIGhlbHBlciwgdXNlIHRoaXMgZnVu
Y3Rpb24gdG8KLSAgZW5zdXJlIEhhbmRsZWJhcnMgZG9lcyBub3QgZXNjYXBlIHRoZSBIVE1MLgot
Ci0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuU3RyaW5nLmh0bWxTYWZlKCc8ZGl2PnNvbWVTdHJp
bmc8L2Rpdj4nKQotICBgYGAKLQotICBAbWV0aG9kIGh0bWxTYWZlCi0gIEBmb3IgRW1iZXIuU3Ry
aW5nCi0gIEBzdGF0aWMKLSAgQHJldHVybiB7SGFuZGxlYmFycy5TYWZlU3RyaW5nfSBhIHN0cmlu
ZyB0aGF0IHdpbGwgbm90IGJlIGh0bWwgZXNjYXBlZCBieSBIYW5kbGViYXJzCi0qLwotRW1iZXIu
U3RyaW5nLmh0bWxTYWZlID0gZnVuY3Rpb24oc3RyKSB7Ci0gIHJldHVybiBuZXcgSGFuZGxlYmFy
cy5TYWZlU3RyaW5nKHN0cik7Ci19OwotCi12YXIgaHRtbFNhZmUgPSBFbWJlci5TdHJpbmcuaHRt
bFNhZmU7Ci0KLWlmIChFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5F
WFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpIHsKLQotICAvKioKLSAgICBNYXJrIGEgc3RyaW5nIGFz
IGJlaW5nIHNhZmUgZm9yIHVuZXNjYXBlZCBvdXRwdXQgd2l0aCBIYW5kbGViYXJzLgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgICc8ZGl2PnNvbWVTdHJpbmc8L2Rpdj4nLmh0bWxTYWZlKCkKLSAg
ICBgYGAKLQotICAgIFNlZSBbRW1iZXIuU3RyaW5nLmh0bWxTYWZlXSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2h0bWxTYWZlKS4KLQotICAgIEBtZXRob2QgaHRtbFNhZmUK
LSAgICBAZm9yIFN0cmluZwotICAgIEByZXR1cm4ge0hhbmRsZWJhcnMuU2FmZVN0cmluZ30gYSBz
dHJpbmcgdGhhdCB3aWxsIG5vdCBiZSBodG1sIGVzY2FwZWQgYnkgSGFuZGxlYmFycwotICAqLwot
ICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGh0
bWxTYWZlKHRoaXMpOwotICB9OwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1i
ZXIuSGFuZGxlYmFycy5yZXNvbHZlUGF0aHMgPSBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIHZhciBy
ZXQgPSBbXSwKLSAgICAgIGNvbnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKLSAgICAgIHJvb3Rz
ID0gb3B0aW9ucy5yb290cywKLSAgICAgIGRhdGEgPSBvcHRpb25zLmRhdGE7Ci0KLSAgZm9yICh2
YXIgaT0wLCBsPWNvbnRleHRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICByZXQucHVzaCggRW1i
ZXIuSGFuZGxlYmFycy5nZXQocm9vdHNbaV0sIGNvbnRleHRzW2ldLCB7IGRhdGE6IGRhdGEgfSkg
KTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkg
ewotLypqc2hpbnQgbmV3Y2FwOmZhbHNlKi8KLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVs
ZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgc2V0ID0gRW1iZXIuc2V0LCBnZXQgPSBFbWJl
ci5nZXQ7Ci12YXIgTWV0YW1vcnBoID0gcmVxdWlyZU1vZHVsZSgnbWV0YW1vcnBoJyk7Ci0KLWZ1
bmN0aW9uIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCkgewotICBFbWJlci5ydW4ub25jZShFbWJl
ci5WaWV3LCAnbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMnKTsKLX0KLQotLy8gRE9NTWFuYWdlciBz
aG91bGQganVzdCBhYnN0cmFjdCBkb20gbWFuaXB1bGF0aW9uIGJldHdlZW4ganF1ZXJ5IGFuZCBt
ZXRhbW9ycGgKLXZhciBET01NYW5hZ2VyID0gewotICByZW1vdmU6IGZ1bmN0aW9uKHZpZXcpIHsK
LSAgICB2aWV3Lm1vcnBoLnJlbW92ZSgpOwotICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7
Ci0gIH0sCi0KLSAgcHJlcGVuZDogZnVuY3Rpb24odmlldywgaHRtbCkgewotICAgIHZpZXcubW9y
cGgucHJlcGVuZChodG1sKTsKLSAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICB9LAot
Ci0gIGFmdGVyOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7Ci0gICAgdmlldy5tb3JwaC5hZnRlciho
dG1sKTsKLSAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwotICB9LAotCi0gIGh0bWw6IGZ1
bmN0aW9uKHZpZXcsIGh0bWwpIHsKLSAgICB2aWV3Lm1vcnBoLmh0bWwoaHRtbCk7Ci0gICAgbm90
aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfSwKLQotICAvLyBUaGlzIGlzIG1lc3NlZCB1cC4K
LSAgcmVwbGFjZTogZnVuY3Rpb24odmlldykgewotICAgIHZhciBtb3JwaCA9IHZpZXcubW9ycGg7
Ci0KLSAgICB2aWV3LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7Ci0KLSAgICBFbWJlci5ydW4u
c2NoZWR1bGUoJ3JlbmRlcicsIHRoaXMsIGZ1bmN0aW9uIHJlbmRlck1ldGFtb3JwaFZpZXcoKSB7
Ci0gICAgICBpZiAodmlldy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIHZpZXcu
Y2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7Ci0gICAgICB2YXIgYnVmZmVyID0gdmlldy5yZW5kZXJU
b0J1ZmZlcigpOwotCi0gICAgICB2aWV3Lmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcp
IHsKLSAgICAgICAgdmlldy5wcm9wZXJ0eVdpbGxDaGFuZ2UoJ2VsZW1lbnQnKTsKLSAgICAgIH0p
OwotICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dpbGxJbnNlcnRFbGVtZW50Jyk7Ci0K
LSAgICAgIG1vcnBoLnJlcGxhY2VXaXRoKGJ1ZmZlci5zdHJpbmcoKSk7Ci0gICAgICB2aWV3LnRy
YW5zaXRpb25UbygnaW5ET00nKTsKLQotICAgICAgdmlldy5pbnZva2VSZWN1cnNpdmVseShmdW5j
dGlvbih2aWV3KSB7Ci0gICAgICAgIHZpZXcucHJvcGVydHlEaWRDaGFuZ2UoJ2VsZW1lbnQnKTsK
LSAgICAgIH0pOwotICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ2RpZEluc2VydEVsZW1l
bnQnKTsKLQotICAgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgICB9KTsKLSAgfSwK
LQotICBlbXB0eTogZnVuY3Rpb24odmlldykgewotICAgIHZpZXcubW9ycGguaHRtbCgiIik7Ci0g
ICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKLSAgfQotfTsKLQotLy8gVGhlIGBtb3JwaGAg
YW5kIGBvdXRlckhUTUxgIHByb3BlcnRpZXMgYXJlIGludGVybmFsIG9ubHkKLS8vIGFuZCBub3Qg
b2JzZXJ2YWJsZS4KLQotLyoqCi0gIEBjbGFzcyBfTWV0YW1vcnBoCi0gIEBuYW1lc3BhY2UgRW1i
ZXIKLSAgQHByaXZhdGUKLSovCi1FbWJlci5fTWV0YW1vcnBoID0gRW1iZXIuTWl4aW4uY3JlYXRl
KHsKLSAgaXNWaXJ0dWFsOiB0cnVlLAotICB0YWdOYW1lOiAnJywKLQotICBpbnN0cnVtZW50TmFt
ZTogJ21ldGFtb3JwaCcsCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5fc3VwZXIo
KTsKLSAgICB0aGlzLm1vcnBoID0gTWV0YW1vcnBoKCk7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCdT
dXBwbHlpbmcgYSB0YWdOYW1lIHRvIE1ldGFtb3JwaCB2aWV3cyBpcyB1bnJlbGlhYmxlIGFuZCBp
cyBkZXByZWNhdGVkLiBZb3UgbWF5IGJlIHNldHRpbmcgdGhlIHRhZ05hbWUgb24gYSBIYW5kbGVi
YXJzIGhlbHBlciB0aGF0IGNyZWF0ZXMgYSBNZXRhbW9ycGguJywgIXRoaXMudGFnTmFtZSk7Ci0g
IH0sCi0KLSAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICBidWZmZXIucHVz
aCh0aGlzLm1vcnBoLnN0YXJ0VGFnKCkpOwotICAgIGJ1ZmZlci5wdXNoT3BlbmluZ1RhZygpOwot
ICB9LAotCi0gIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICBidWZmZXIucHVz
aENsb3NpbmdUYWcoKTsKLSAgICBidWZmZXIucHVzaCh0aGlzLm1vcnBoLmVuZFRhZygpKTsKLSAg
fSwKLQotICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYnVmZmVyID0gdGhp
cy5yZW5kZXJUb0J1ZmZlcigpOwotICAgIHRoaXMub3V0ZXJIVE1MID0gYnVmZmVyLnN0cmluZygp
OwotICAgIHRoaXMuY2xlYXJCdWZmZXIoKTsKLSAgfSwKLQotICBkb21NYW5hZ2VyOiBET01NYW5h
Z2VyCi19KTsKLQotLyoqCi0gIEBjbGFzcyBfTWV0YW1vcnBoVmlldwotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuX01ldGFtb3JwaAotICBA
cHJpdmF0ZQotKi8KLUVtYmVyLl9NZXRhbW9ycGhWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1i
ZXIuX01ldGFtb3JwaCk7Ci0KLS8qKgotICBAY2xhc3MgX1NpbXBsZU1ldGFtb3JwaFZpZXcKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db3JlVmlldwotICBAdXNlcyBFbWJl
ci5fTWV0YW1vcnBoCi0gIEBwcml2YXRlCi0qLwotRW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXcg
PSBFbWJlci5Db3JlVmlldy5leHRlbmQoRW1iZXIuX01ldGFtb3JwaCk7Ci0KLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBIYW5kbGViYXJzICovCi0vKmpzaGludCBuZXdj
YXA6ZmFsc2UqLwotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJh
cnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgaGFuZGxlYmFy
c0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0OwotdmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVNb2R1
bGUoJ21ldGFtb3JwaCcpOwotZnVuY3Rpb24gU2ltcGxlSGFuZGxlYmFyc1ZpZXcocGF0aCwgcGF0
aFJvb3QsIGlzRXNjYXBlZCwgdGVtcGxhdGVEYXRhKSB7Ci0gIHRoaXMucGF0aCA9IHBhdGg7Ci0g
IHRoaXMucGF0aFJvb3QgPSBwYXRoUm9vdDsKLSAgdGhpcy5pc0VzY2FwZWQgPSBpc0VzY2FwZWQ7
Ci0gIHRoaXMudGVtcGxhdGVEYXRhID0gdGVtcGxhdGVEYXRhOwotCi0gIHRoaXMubW9ycGggPSBN
ZXRhbW9ycGgoKTsKLSAgdGhpcy5zdGF0ZSA9ICdwcmVSZW5kZXInOwotICB0aGlzLnVwZGF0ZUlk
ID0gbnVsbDsKLSAgdGhpcy5fcGFyZW50VmlldyA9IG51bGw7Ci0gIHRoaXMuYnVmZmVyID0gbnVs
bDsKLX0KLQotRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3ID0gU2ltcGxlSGFuZGxlYmFyc1Zp
ZXc7Ci0KLVNpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZSA9IHsKLSAgaXNWaXJ0dWFsOiB0
cnVlLAotICBpc1ZpZXc6IHRydWUsCi0KLSAgZGVzdHJveTogZnVuY3Rpb24gKCkgewotICAgIGlm
ICh0aGlzLnVwZGF0ZUlkKSB7Ci0gICAgICBFbWJlci5ydW4uY2FuY2VsKHRoaXMudXBkYXRlSWQp
OwotICAgICAgdGhpcy51cGRhdGVJZCA9IG51bGw7Ci0gICAgfQotICAgIGlmICh0aGlzLl9wYXJl
bnRWaWV3KSB7Ci0gICAgICB0aGlzLl9wYXJlbnRWaWV3LnJlbW92ZUNoaWxkKHRoaXMpOwotICAg
IH0KLSAgICB0aGlzLm1vcnBoID0gbnVsbDsKLSAgICB0aGlzLnN0YXRlID0gJ2Rlc3Ryb3llZCc7
Ci0gIH0sCi0KLSAgcHJvcGVydHlXaWxsQ2hhbmdlOiBFbWJlci5LLAotCi0gIHByb3BlcnR5RGlk
Q2hhbmdlOiBFbWJlci5LLAotCi0gIG5vcm1hbGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAg
dmFyIHBhdGggPSB0aGlzLnBhdGgsCi0gICAgICAgIHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwK
LSAgICAgICAgcmVzdWx0LCB0ZW1wbGF0ZURhdGE7Ci0KLSAgICAvLyBVc2UgdGhlIHBhdGhSb290
IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcwotICAgIC8vIGhhcHBl
bnMgaWYgdGhlIHBhdGggaXMgYHRoaXNgLCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgaW50bwotICAg
IC8vIGEgYHBhdGhSb290YCBvZiB0aGUgY3VycmVudCBIYW5kbGViYXJzIGNvbnRleHQgYW5kIGEg
cGF0aAotICAgIC8vIG9mIGAnJ2AuCi0gICAgaWYgKHBhdGggPT09ICcnKSB7Ci0gICAgICByZXN1
bHQgPSBwYXRoUm9vdDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcGxhdGVEYXRhID0gdGhpcy50
ZW1wbGF0ZURhdGE7Ci0gICAgICByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhSb290LCBwYXRo
LCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0Owot
ICB9LAotCi0gIHJlbmRlclRvQnVmZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKLSAgICB2YXIgc3Ry
aW5nID0gJyc7Ci0KLSAgICBzdHJpbmcgKz0gdGhpcy5tb3JwaC5zdGFydFRhZygpOwotICAgIHN0
cmluZyArPSB0aGlzLnJlbmRlcigpOwotICAgIHN0cmluZyArPSB0aGlzLm1vcnBoLmVuZFRhZygp
OwotCi0gICAgYnVmZmVyLnB1c2goc3RyaW5nKTsKLSAgfSwKLQotICByZW5kZXI6IGZ1bmN0aW9u
KCkgewotICAgIC8vIElmIG5vdCBpbnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNoZSAoe3t7Zm9v
fX19KSwgZXNjYXBlCi0gICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLgotICAgIHZh
ciBlc2NhcGUgPSB0aGlzLmlzRXNjYXBlZDsKLSAgICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxp
emVkVmFsdWUoKTsKLQotICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRl
ZmluZWQpIHsKLSAgICAgIHJlc3VsdCA9ICIiOwotICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgaW5z
dGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJpbmcpKSB7Ci0gICAgICByZXN1bHQgPSBTdHJpbmco
cmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMu
VXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQpOyB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAg
fSwKLQotICByZXJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAgc3dpdGNoKHRoaXMuc3RhdGUpIHsK
LSAgICAgIGNhc2UgJ3ByZVJlbmRlcic6Ci0gICAgICBjYXNlICdkZXN0cm95ZWQnOgotICAgICAg
ICBicmVhazsKLSAgICAgIGNhc2UgJ2luQnVmZmVyJzoKLSAgICAgICAgdGhyb3cgbmV3IEVtYmVy
LkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCB0cmllZCB0byByZXBsYWNlIGFuIHt7ZXhwcmVzc2lv
bn19IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLiIpOwotICAgICAgY2FzZSAn
aGFzRWxlbWVudCc6Ci0gICAgICBjYXNlICdpbkRPTSc6Ci0gICAgICAgIHRoaXMudXBkYXRlSWQg
PSBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCAndXBkYXRlJyk7Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9LAotCi0gIHVwZGF0ZTog
ZnVuY3Rpb24gKCkgewotICAgIHRoaXMudXBkYXRlSWQgPSBudWxsOwotICAgIHRoaXMubW9ycGgu
aHRtbCh0aGlzLnJlbmRlcigpKTsKLSAgfSwKLQotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0
YXRlKSB7Ci0gICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICB9Ci19OwotCi12YXIgc3RhdGVzID0g
RW1iZXIuVmlldy5jbG9uZVN0YXRlcyhFbWJlci5WaWV3LnN0YXRlcyksIG1lcmdlID0gRW1iZXIu
bWVyZ2U7Ci0KLW1lcmdlKHN0YXRlcy5fZGVmYXVsdCwgewotICByZXJlbmRlcklmTmVlZGVkOiBF
bWJlci5LCi19KTsKLQotbWVyZ2Uoc3RhdGVzLmluRE9NLCB7Ci0gIHJlcmVuZGVySWZOZWVkZWQ6
IGZ1bmN0aW9uKHZpZXcpIHsKLSAgICBpZiAodmlldy5ub3JtYWxpemVkVmFsdWUoKSAhPT0gdmll
dy5fbGFzdE5vcm1hbGl6ZWRWYWx1ZSkgewotICAgICAgdmlldy5yZXJlbmRlcigpOwotICAgIH0K
LSAgfQotfSk7Ci0KLS8qKgotICBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJp
dmF0ZSB2aWV3IGNyZWF0ZWQgYnkgdGhlIEhhbmRsZWJhcnMKLSAgYHt7YmluZH19YCBoZWxwZXJz
IHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGJvdW5kIHByb3BlcnRpZXMuCi0KLSAgRXZl
cnkgdGltZSBhIHByb3BlcnR5IGlzIGJvdW5kIHVzaW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFu
b255bW91cyBzdWJjbGFzcwotICBvZiBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGNy
ZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3ViLXRlbXBsYXRlCi0gIGFuZCBjb250ZXh0IHNl
dCB1cC4gV2hlbiB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBqdXN0IHRoZSB0ZW1w
bGF0ZQotICBmb3IgdGhpcyB2aWV3IHdpbGwgcmUtcmVuZGVyLgotCi0gIEBjbGFzcyBfSGFuZGxl
YmFyc0JvdW5kVmlldwotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLl9NZXRh
bW9ycGhWaWV3Ci0gIEBwcml2YXRlCi0qLwotRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXcgPSBF
bWJlci5fTWV0YW1vcnBoVmlldy5leHRlbmQoewotICBpbnN0cnVtZW50TmFtZTogJ2JvdW5kSGFu
ZGxlYmFycycsCi0gIHN0YXRlczogc3RhdGVzLAotCi0gIC8qKgotICAgIFRoZSBmdW5jdGlvbiB1
c2VkIHRvIGRldGVybWluZSBpZiB0aGUgYGRpc3BsYXlUZW1wbGF0ZWAgb3IKLSAgICBgaW52ZXJz
ZVRlbXBsYXRlYCBzaG91bGQgYmUgcmVuZGVyZWQuIFRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24g
dGhhdCB0YWtlcwotICAgIGEgdmFsdWUgYW5kIHJldHVybnMgYSBCb29sZWFuLgotCi0gICAgQHBy
b3BlcnR5IHNob3VsZERpc3BsYXlGdW5jCi0gICAgQHR5cGUgRnVuY3Rpb24KLSAgICBAZGVmYXVs
dCBudWxsCi0gICovCi0gIHNob3VsZERpc3BsYXlGdW5jOiBudWxsLAotCi0gIC8qKgotICAgIFdo
ZXRoZXIgdGhlIHRlbXBsYXRlIHJlbmRlcmVkIGJ5IHRoaXMgdmlldyBnZXRzIHBhc3NlZCB0aGUg
Y29udGV4dCBvYmplY3QKLSAgICBvZiBpdHMgcGFyZW50IHRlbXBsYXRlLCBvciBnZXRzIHBhc3Nl
ZCB0aGUgdmFsdWUgb2YgcmV0cmlldmluZyBgcGF0aGAKLSAgICBmcm9tIHRoZSBgcGF0aFJvb3Rg
LgotCi0gICAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdHJ1ZSB3aGVuIHVzaW5nIHRoZSBge3sjaWZ9
fWAgaGVscGVyLCBiZWNhdXNlIHRoZQotICAgIHRlbXBsYXRlIGluc2lkZSB0aGUgaGVscGVyIHNo
b3VsZCBsb29rIHVwIHByb3BlcnRpZXMgcmVsYXRpdmUgdG8gdGhlIHNhbWUKLSAgICBvYmplY3Qg
YXMgb3V0c2lkZSB0aGUgYmxvY2suIFRoaXMgd291bGQgYmUgYGZhbHNlYCB3aGVuIHVzZWQgd2l0
aCBge3sjd2l0aAotICAgIGZvb319YCBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSBzaG91bGQgcmVjZWl2
ZSB0aGUgb2JqZWN0IGZvdW5kIGJ5IGV2YWx1YXRpbmcKLSAgICBgZm9vYC4KLQotICAgIEBwcm9w
ZXJ0eSBwcmVzZXJ2ZUNvbnRleHQKLSAgICBAdHlwZSBCb29sZWFuCi0gICAgQGRlZmF1bHQgZmFs
c2UKLSAgKi8KLSAgcHJlc2VydmVDb250ZXh0OiBmYWxzZSwKLQotICAvKioKLSAgICBJZiBgcHJl
c2VydmVDb250ZXh0YCBpcyB0cnVlLCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVz
ZWQKLSAgICB0byByZW5kZXIgdGhlIHRlbXBsYXRlLgotCi0gICAgQHByb3BlcnR5IHByZXZpb3Vz
Q29udGV4dAotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBwcmV2aW91c0NvbnRleHQ6IG51bGws
Ci0KLSAgLyoqCi0gICAgVGhlIHRlbXBsYXRlIHRvIHJlbmRlciB3aGVuIGBzaG91bGREaXNwbGF5
RnVuY2AgZXZhbHVhdGVzIHRvIGB0cnVlYC4KLQotICAgIEBwcm9wZXJ0eSBkaXNwbGF5VGVtcGxh
dGUKLSAgICBAdHlwZSBGdW5jdGlvbgotICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgZGlzcGxh
eVRlbXBsYXRlOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgd2hl
biBgc2hvdWxkRGlzcGxheUZ1bmNgIGV2YWx1YXRlcyB0byBgZmFsc2VgLgotCi0gICAgQHByb3Bl
cnR5IGludmVyc2VUZW1wbGF0ZQotICAgIEB0eXBlIEZ1bmN0aW9uCi0gICAgQGRlZmF1bHQgbnVs
bAotICAqLwotICBpbnZlcnNlVGVtcGxhdGU6IG51bGwsCi0KLQotICAvKioKLSAgICBUaGUgcGF0
aCB0byBsb29rIHVwIG9uIGBwYXRoUm9vdGAgdGhhdCBpcyBwYXNzZWQgdG8KLSAgICBgc2hvdWxk
RGlzcGxheUZ1bmNgIHRvIGRldGVybWluZSB3aGljaCB0ZW1wbGF0ZSB0byByZW5kZXIuCi0KLSAg
ICBJbiBhZGRpdGlvbiwgaWYgYHByZXNlcnZlQ29udGV4dGAgaXMgYGZhbHNlLGAgdGhlIG9iamVj
dCBhdCB0aGlzIHBhdGggd2lsbAotICAgIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgd2hlbiBy
ZW5kZXJpbmcuCi0KLSAgICBAcHJvcGVydHkgcGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBk
ZWZhdWx0IG51bGwKLSAgKi8KLSAgcGF0aDogbnVsbCwKLQotICAvKioKLSAgICBUaGUgb2JqZWN0
IGZyb20gd2hpY2ggdGhlIGBwYXRoYCB3aWxsIGJlIGxvb2tlZCB1cC4gU29tZXRpbWVzIHRoaXMg
aXMgdGhlCi0gICAgc2FtZSBhcyB0aGUgYHByZXZpb3VzQ29udGV4dGAsIGJ1dCBpbiBjYXNlcyB3
aGVyZSB0aGlzIHZpZXcgaGFzIGJlZW4KLSAgICBnZW5lcmF0ZWQgZm9yIHBhdGhzIHRoYXQgc3Rh
cnQgd2l0aCBhIGtleXdvcmQgc3VjaCBhcyBgdmlld2Agb3IKLSAgICBgY29udHJvbGxlcmAsIHRo
ZSBwYXRoIHJvb3Qgd2lsbCBiZSB0aGF0IHJlc29sdmVkIG9iamVjdC4KLQotICAgIEBwcm9wZXJ0
eSBwYXRoUm9vdAotICAgIEB0eXBlIE9iamVjdAotICAqLwotICBwYXRoUm9vdDogbnVsbCwKLQot
ICBub3JtYWxpemVkVmFsdWU6IGZ1bmN0aW9uKCkgewotICAgIHZhciBwYXRoID0gZ2V0KHRoaXMs
ICdwYXRoJyksCi0gICAgICAgIHBhdGhSb290ICA9IGdldCh0aGlzLCAncGF0aFJvb3QnKSwKLSAg
ICAgICAgdmFsdWVOb3JtYWxpemVyID0gZ2V0KHRoaXMsICd2YWx1ZU5vcm1hbGl6ZXJGdW5jJyks
Ci0gICAgICAgIHJlc3VsdCwgdGVtcGxhdGVEYXRhOwotCi0gICAgLy8gVXNlIHRoZSBwYXRoUm9v
dCBhcyB0aGUgcmVzdWx0IGlmIG5vIHBhdGggaXMgcHJvdmlkZWQuIFRoaXMKLSAgICAvLyBoYXBw
ZW5zIGlmIHRoZSBwYXRoIGlzIGB0aGlzYCwgd2hpY2ggZ2V0cyBub3JtYWxpemVkIGludG8KLSAg
ICAvLyBhIGBwYXRoUm9vdGAgb2YgdGhlIGN1cnJlbnQgSGFuZGxlYmFycyBjb250ZXh0IGFuZCBh
IHBhdGgKLSAgICAvLyBvZiBgJydgLgotICAgIGlmIChwYXRoID09PSAnJykgewotICAgICAgcmVz
dWx0ID0gcGF0aFJvb3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRlbXBsYXRlRGF0YSA9IGdldCh0
aGlzLCAndGVtcGxhdGVEYXRhJyk7Ci0gICAgICByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHBhdGhS
b290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
dmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3JtYWxpemVyKHJlc3VsdCkgOiByZXN1bHQ7Ci0gIH0s
Ci0KLSAgcmVyZW5kZXJJZk5lZWRlZDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5jdXJyZW50U3Rh
dGUucmVyZW5kZXJJZk5lZWRlZCh0aGlzKTsKLSAgfSwKLQotICAvKioKLSAgICBEZXRlcm1pbmVz
IHdoaWNoIHRlbXBsYXRlIHRvIGludm9rZSwgc2V0cyB1cCB0aGUgY29ycmVjdCBzdGF0ZSBiYXNl
ZCBvbgotICAgIHRoYXQgbG9naWMsIHRoZW4gaW52b2tlcyB0aGUgZGVmYXVsdCBgRW1iZXIuVmll
d2AgYHJlbmRlcmAgaW1wbGVtZW50YXRpb24uCi0KLSAgICBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0
IGxvb2sgdXAgdGhlIGBwYXRoYCBrZXkgb24gYHBhdGhSb290YCwKLSAgICB0aGVuIHBhc3MgdGhh
dCB2YWx1ZSB0byB0aGUgYHNob3VsZERpc3BsYXlGdW5jYCBmdW5jdGlvbi4gSWYgdGhhdCByZXR1
cm5zCi0gICAgYHRydWUsYCB0aGUgYGRpc3BsYXlUZW1wbGF0ZWAgZnVuY3Rpb24gd2lsbCBiZSBy
ZW5kZXJlZCB0byBET00uIE90aGVyd2lzZSwKLSAgICBgaW52ZXJzZVRlbXBsYXRlYCwgaWYgc3Bl
Y2lmaWVkLCB3aWxsIGJlIHJlbmRlcmVkLgotCi0gICAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgYEVt
YmVyLl9IYW5kbGViYXJzQm91bmRWaWV3YCByZXByZXNlbnRlZCB0aGUgYHt7I3dpdGgKLSAgICBm
b299fWAgaGVscGVyLCBpdCB3b3VsZCBsb29rIHVwIHRoZSBgZm9vYCBwcm9wZXJ0eSBvZiBpdHMg
Y29udGV4dCwgYW5kCi0gICAgYHNob3VsZERpc3BsYXlGdW5jYCB3b3VsZCBhbHdheXMgcmV0dXJu
IHRydWUuIFRoZSBvYmplY3QgZm91bmQgYnkgbG9va2luZwotICAgIHVwIGBmb29gIHdvdWxkIGJl
IHBhc3NlZCB0byBgZGlzcGxheVRlbXBsYXRlYC4KLQotICAgIEBtZXRob2QgcmVuZGVyCi0gICAg
QHBhcmFtIHtFbWJlci5SZW5kZXJCdWZmZXJ9IGJ1ZmZlcgotICAqLwotICByZW5kZXI6IGZ1bmN0
aW9uKGJ1ZmZlcikgewotICAgIC8vIElmIG5vdCBpbnZva2VkIHZpYSBhIHRyaXBsZS1tdXN0YWNo
ZSAoe3t7Zm9vfX19KSwgZXNjYXBlCi0gICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRl
LgotICAgIHZhciBlc2NhcGUgPSBnZXQodGhpcywgJ2lzRXNjYXBlZCcpOwotCi0gICAgdmFyIHNo
b3VsZERpc3BsYXkgPSBnZXQodGhpcywgJ3Nob3VsZERpc3BsYXlGdW5jJyksCi0gICAgICAgIHBy
ZXNlcnZlQ29udGV4dCA9IGdldCh0aGlzLCAncHJlc2VydmVDb250ZXh0JyksCi0gICAgICAgIGNv
bnRleHQgPSBnZXQodGhpcywgJ3ByZXZpb3VzQ29udGV4dCcpOwotCi0gICAgdmFyIGludmVyc2VU
ZW1wbGF0ZSA9IGdldCh0aGlzLCAnaW52ZXJzZVRlbXBsYXRlJyksCi0gICAgICAgIGRpc3BsYXlU
ZW1wbGF0ZSA9IGdldCh0aGlzLCAnZGlzcGxheVRlbXBsYXRlJyk7Ci0KLSAgICB2YXIgcmVzdWx0
ID0gdGhpcy5ub3JtYWxpemVkVmFsdWUoKTsKLSAgICB0aGlzLl9sYXN0Tm9ybWFsaXplZFZhbHVl
ID0gcmVzdWx0OwotCi0gICAgLy8gRmlyc3QsIHRlc3QgdGhlIGNvbmRpdGlvbmFsIHRvIHNlZSBp
ZiB3ZSBzaG91bGQKLSAgICAvLyByZW5kZXIgdGhlIHRlbXBsYXRlIG9yIG5vdC4KLSAgICBpZiAo
c2hvdWxkRGlzcGxheShyZXN1bHQpKSB7Ci0gICAgICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZGlz
cGxheVRlbXBsYXRlKTsKLQotICAgICAgLy8gSWYgd2UgYXJlIHByZXNlcnZpbmcgdGhlIGNvbnRl
eHQgKGZvciBleGFtcGxlLCBpZiB0aGlzCi0gICAgICAvLyBpcyBhbiAjaWYgYmxvY2ssIGNhbGwg
dGhlIHRlbXBsYXRlIHdpdGggdGhlIHNhbWUgb2JqZWN0LgotICAgICAgaWYgKHByZXNlcnZlQ29u
dGV4dCkgewotICAgICAgICBzZXQodGhpcywgJ19jb250ZXh0JywgY29udGV4dCk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgLy8gT3RoZXJ3aXNlLCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGJsb2Nr
IGJpbmQgb3Igbm90LgotICAgICAgLy8gSWYgc28sIHBhc3MgdGhlIHNwZWNpZmllZCBvYmplY3Qg
dG8gdGhlIHRlbXBsYXRlCi0gICAgICAgIGlmIChkaXNwbGF5VGVtcGxhdGUpIHsKLSAgICAgICAg
ICBzZXQodGhpcywgJ19jb250ZXh0JywgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgLy8gVGhpcyBpcyBub3QgYSBiaW5kIGJsb2NrLCBqdXN0IHB1c2ggdGhlIHJlc3VsdCBvZiB0
aGUKLSAgICAgICAgLy8gZXhwcmVzc2lvbiB0byB0aGUgcmVuZGVyIGNvbnRleHQgYW5kIHJldHVy
bi4KLSAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVk
KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAiIjsKLSAgICAgICAgICB9IGVsc2UgaWYgKCEocmVz
dWx0IGluc3RhbmNlb2YgSGFuZGxlYmFycy5TYWZlU3RyaW5nKSkgewotICAgICAgICAgICAgcmVz
dWx0ID0gU3RyaW5nKHJlc3VsdCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGVzY2Fw
ZSkgeyByZXN1bHQgPSBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24ocmVzdWx0KTsg
fQotICAgICAgICAgIGJ1ZmZlci5wdXNoKHJlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnZlcnNlVGVtcGxhdGUpIHsKLSAgICAg
IHNldCh0aGlzLCAndGVtcGxhdGUnLCBpbnZlcnNlVGVtcGxhdGUpOwotCi0gICAgICBpZiAocHJl
c2VydmVDb250ZXh0KSB7Ci0gICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCBjb250ZXh0KTsK
LSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldCh0aGlzLCAnX2NvbnRleHQnLCByZXN1bHQpOwot
ICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZnVuY3Rp
b24oKSB7IHJldHVybiAnJzsgfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRoaXMuX3N1cGVyKGJ1
ZmZlcik7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9k
dWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBF
bWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKLXZhciBo
YW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQsIG5vcm1hbGl6ZVBhdGggPSBFbWJl
ci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGg7Ci12YXIgZm9yRWFjaCA9IEVtYmVyLkFycmF5UG9s
eWZpbGxzLmZvckVhY2g7Ci12YXIgb19jcmVhdGUgPSBFbWJlci5jcmVhdGU7Ci0KLXZhciBFbWJl
ckhhbmRsZWJhcnMgPSBFbWJlci5IYW5kbGViYXJzLCBoZWxwZXJzID0gRW1iZXJIYW5kbGViYXJz
LmhlbHBlcnM7Ci0KLWZ1bmN0aW9uIGV4aXN0cyh2YWx1ZSkgewotICByZXR1cm4gIUVtYmVyLmlz
Tm9uZSh2YWx1ZSk7Ci19Ci0KLWZ1bmN0aW9uIHNhbml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVu
dENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSB7Ci0gIHZhciByZXN1bHQgPSBoYW5kbGViYXJz
R2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7Ci0gIGlmIChyZXN1bHQgPT09
IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKLSAgICByZXN1bHQgPSAiIjsKLSAgfSBl
bHNlIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZykpIHsKLSAg
ICByZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKLSAgfQotICBpZiAoIW9wdGlvbnMuaGFzaC51bmVz
Y2FwZWQpewotICAgIHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihy
ZXN1bHQpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQmluZHMgYSBwcm9wZXJ0
eSBpbnRvIHRoZSBET00uIFRoaXMgd2lsbCBjcmVhdGUgYSBob29rIGluIERPTSB0aGF0IHRoZQot
Ly8gS1ZPIHN5c3RlbSB3aWxsIGxvb2sgZm9yIGFuZCB1cGRhdGUgaWYgdGhlIHByb3BlcnR5IGNo
YW5nZXMuCi1mdW5jdGlvbiBiaW5kKHByb3BlcnR5LCBvcHRpb25zLCBwcmVzZXJ2ZUNvbnRleHQs
IHNob3VsZERpc3BsYXksIHZhbHVlTm9ybWFsaXplciwgY2hpbGRQcm9wZXJ0aWVzKSB7Ci0gIHZh
ciBkYXRhID0gb3B0aW9ucy5kYXRhLAotICAgICAgZm4gPSBvcHRpb25zLmZuLAotICAgICAgaW52
ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSwKLSAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBj
dXJyZW50Q29udGV4dCA9IHRoaXMsCi0gICAgICBub3JtYWxpemVkLCBvYnNlcnZlciwgaTsKLQot
ICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIGRh
dGEpOwotCi0gIC8vIFNldCB1cCBvYnNlcnZlcnMgZm9yIG9ic2VydmFibGUgb2JqZWN0cwotICBp
ZiAoJ29iamVjdCcgPT09IHR5cGVvZiB0aGlzKSB7Ci0gICAgaWYgKGRhdGEuaW5zaWRlR3JvdXAp
IHsKLSAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5vbmNl
KHZpZXcsICdyZXJlbmRlcicpOwotICAgICAgfTsKLQotICAgICAgdmFyIHRlbXBsYXRlLCBjb250
ZXh0LCByZXN1bHQgPSBoYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0eSwgb3B0
aW9ucyk7Ci0KLSAgICAgIHJlc3VsdCA9IHZhbHVlTm9ybWFsaXplciA/IHZhbHVlTm9ybWFsaXpl
cihyZXN1bHQpIDogcmVzdWx0OwotCi0gICAgICBjb250ZXh0ID0gcHJlc2VydmVDb250ZXh0ID8g
Y3VycmVudENvbnRleHQgOiByZXN1bHQ7Ci0gICAgICBpZiAoc2hvdWxkRGlzcGxheShyZXN1bHQp
KSB7Ci0gICAgICAgIHRlbXBsYXRlID0gZm47Ci0gICAgICB9IGVsc2UgaWYgKGludmVyc2UpIHsK
LSAgICAgICAgdGVtcGxhdGUgPSBpbnZlcnNlOwotICAgICAgfQotCi0gICAgICB0ZW1wbGF0ZShj
b250ZXh0LCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8g
Q3JlYXRlIHRoZSB2aWV3IHRoYXQgd2lsbCB3cmFwIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZW1wbGF0
ZS9wcm9wZXJ0eQotICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgbmVhcmVzdCB2aWV3J3MgY2hp
bGRWaWV3cyBhcnJheS4KLSAgICAgIC8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBFbWJlci5f
SGFuZGxlYmFyc0JvdW5kVmlldyBmb3IgbW9yZS4KLSAgICAgIHZhciBiaW5kVmlldyA9IHZpZXcu
Y3JlYXRlQ2hpbGRWaWV3KEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3LCB7Ci0gICAgICAgIHBy
ZXNlcnZlQ29udGV4dDogcHJlc2VydmVDb250ZXh0LAotICAgICAgICBzaG91bGREaXNwbGF5RnVu
Yzogc2hvdWxkRGlzcGxheSwKLSAgICAgICAgdmFsdWVOb3JtYWxpemVyRnVuYzogdmFsdWVOb3Jt
YWxpemVyLAotICAgICAgICBkaXNwbGF5VGVtcGxhdGU6IGZuLAotICAgICAgICBpbnZlcnNlVGVt
cGxhdGU6IGludmVyc2UsCi0gICAgICAgIHBhdGg6IHByb3BlcnR5LAotICAgICAgICBwYXRoUm9v
dDogY3VycmVudENvbnRleHQsCi0gICAgICAgIHByZXZpb3VzQ29udGV4dDogY3VycmVudENvbnRl
eHQsCi0gICAgICAgIGlzRXNjYXBlZDogIW9wdGlvbnMuaGFzaC51bmVzY2FwZWQsCi0gICAgICAg
IHRlbXBsYXRlRGF0YTogb3B0aW9ucy5kYXRhCi0gICAgICB9KTsKLQotICAgICAgdmlldy5hcHBl
bmRDaGlsZChiaW5kVmlldyk7Ci0KLSAgICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIGJpbmRWaWV3LCAncmVyZW5kZXJJ
Zk5lZWRlZCcpOwotICAgICAgfTsKLSAgICB9Ci0KLSAgICAvLyBPYnNlcnZlcyB0aGUgZ2l2ZW4g
cHJvcGVydHkgb24gdGhlIGNvbnRleHQgYW5kCi0gICAgLy8gdGVsbHMgdGhlIEVtYmVyLl9IYW5k
bGViYXJzQm91bmRWaWV3IHRvIHJlLXJlbmRlci4gSWYgcHJvcGVydHkKLSAgICAvLyBpcyBhbiBl
bXB0eSBzdHJpbmcsIHdlIGFyZSBwcmludGluZyB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgLy8g
b2JqZWN0ICh7e3RoaXN9fSkgc28gdXBkYXRpbmcgaXQgaXMgbm90IG91ciByZXNwb25zaWJpbGl0
eS4KLSAgICBpZiAobm9ybWFsaXplZC5wYXRoICE9PSAnJykgewotICAgICAgdmlldy5yZWdpc3Rl
ck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0g
ICAgICBpZiAoY2hpbGRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPGNoaWxkUHJv
cGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHZpZXcucmVnaXN0ZXJPYnNlcnZlcihu
b3JtYWxpemVkLnJvb3QsIG5vcm1hbGl6ZWQucGF0aCsnLicrY2hpbGRQcm9wZXJ0aWVzW2ldLCBv
YnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8g
VGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAot
ICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAgICBkYXRhLmJ1ZmZlci5wdXNoKGhhbmRsZWJhcnNH
ZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKSk7Ci0gIH0KLX0KLQotRW1iZXJI
YW5kbGViYXJzLmJpbmQgPSBiaW5kOwotCi1mdW5jdGlvbiBzaW1wbGVCaW5kKGN1cnJlbnRDb250
ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucykgewotICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAg
ICAgIHZpZXcgPSBkYXRhLnZpZXcsCi0gICAgICBub3JtYWxpemVkLCBvYnNlcnZlciwgcGF0aFJv
b3QsIG91dHB1dDsKLQotICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJyZW50Q29udGV4
dCwgcHJvcGVydHksIGRhdGEpOwotICBwYXRoUm9vdCA9IG5vcm1hbGl6ZWQucm9vdDsKLQotICAv
LyBTZXQgdXAgb2JzZXJ2ZXJzIGZvciBvYnNlcnZhYmxlIG9iamVjdHMKLSAgaWYgKHBhdGhSb290
ICYmICgnb2JqZWN0JyA9PT0gdHlwZW9mIHBhdGhSb290KSkgewotICAgIGlmIChkYXRhLmluc2lk
ZUdyb3VwKSB7Ci0gICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgICBFbWJlci5y
dW4ub25jZSh2aWV3LCAncmVyZW5kZXInKTsKLSAgICAgIH07Ci0KLSAgICAgIG91dHB1dCA9IHNh
bml0aXplZEhhbmRsZWJhcnNHZXQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25zKTsK
LQotICAgICAgZGF0YS5idWZmZXIucHVzaChvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2
YXIgYmluZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3KAotICAgICAgICBw
cm9wZXJ0eSwgY3VycmVudENvbnRleHQsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25z
LmRhdGEKLSAgICAgICk7Ci0KLSAgICAgIGJpbmRWaWV3Ll9wYXJlbnRWaWV3ID0gdmlldzsKLSAg
ICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZpZXcpOwotCi0gICAgICBvYnNlcnZlciA9IGZ1bmN0
aW9uKCkgewotICAgICAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCBiaW5kVmll
dywgJ3JlcmVuZGVyJyk7Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8vIE9ic2VydmVzIHRoZSBn
aXZlbiBwcm9wZXJ0eSBvbiB0aGUgY29udGV4dCBhbmQKLSAgICAvLyB0ZWxscyB0aGUgRW1iZXIu
X0hhbmRsZWJhcnNCb3VuZFZpZXcgdG8gcmUtcmVuZGVyLiBJZiBwcm9wZXJ0eQotICAgIC8vIGlz
IGFuIGVtcHR5IHN0cmluZywgd2UgYXJlIHByaW50aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKLSAg
ICAvLyBvYmplY3QgKHt7dGhpc319KSBzbyB1cGRhdGluZyBpdCBpcyBub3Qgb3VyIHJlc3BvbnNp
YmlsaXR5LgotICAgIGlmIChub3JtYWxpemVkLnBhdGggIT09ICcnKSB7Ci0gICAgICB2aWV3LnJl
Z2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVkLnBhdGgsIG9ic2VydmVy
KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJs
ZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAotICAgIC8vIGJlIGRvbmUgd2l0aCBpdC4KLSAg
ICBvdXRwdXQgPSBzYW5pdGl6ZWRIYW5kbGViYXJzR2V0KGN1cnJlbnRDb250ZXh0LCBwcm9wZXJ0
eSwgb3B0aW9ucyk7Ci0KLSAgICBkYXRhLmJ1ZmZlci5wdXNoKG91dHB1dCk7Ci0gIH0KLX0KLQot
LyoqCi0gICdfdHJpYWdlTXVzdGFjaGUnIGlzIHVzZWQgaW50ZXJuYWxseSBzZWxlY3QgYmV0d2Vl
biBhIGJpbmRpbmcsIGhlbHBlciwgb3IgY29tcG9uZW50IGZvcgotICB0aGUgZ2l2ZW4gY29udGV4
dC4gVW50aWwgdGhpcyBwb2ludCwgaXQgd291bGQgYmUgaGFyZCB0byBkZXRlcm1pbmUgaWYgdGhl
Ci0gIG11c3RhY2hlIGlzIGEgcHJvcGVydHkgcmVmZXJlbmNlIG9yIGEgcmVndWxhciBoZWxwZXIg
cmVmZXJlbmNlLiBUaGlzIHRyaWFnZQotICBoZWxwZXIgcmVzb2x2ZXMgdGhhdC4KLQotICBUaGlz
IHdvdWxkIG5vdCBiZSB0eXBpY2FsbHkgaW52b2tlZCBieSBkaXJlY3RseS4KLQotICBAcHJpdmF0
ZQotICBAbWV0aG9kIF90cmlhZ2VNdXN0YWNoZQotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVs
cGVycwotICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkvaGVscGVySUQgdG8gdHJp
YWdlCi0gIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGhhc2ggb2YgdGVtcGxhdGUvcmVuZGVyaW5n
IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxl
YmFycy5yZWdpc3RlckhlbHBlcignX3RyaWFnZU11c3RhY2hlJywgZnVuY3Rpb24ocHJvcGVydHks
IG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFuIG9u
ZSBhcmd1bWVudCB0byB0aGUgX3RyaWFnZU11c3RhY2hlIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5n
dGggPD0gMik7Ci0KLSAgaWYgKGhlbHBlcnNbcHJvcGVydHldKSB7Ci0gICAgcmV0dXJuIGhlbHBl
cnNbcHJvcGVydHldLmNhbGwodGhpcywgb3B0aW9ucyk7Ci0gIH0KLQotICB2YXIgaGVscGVyID0g
RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKG9wdGlvbnMuZGF0YS52aWV3LmNvbnRhaW5l
ciwgcHJvcGVydHkpOwotICBpZiAoaGVscGVyKSB7Ci0gICAgcmV0dXJuIGhlbHBlci5jYWxsKHRo
aXMsIG9wdGlvbnMpOwotICB9Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYmluZC5jYWxsKHRoaXMsIHBy
b3BlcnR5LCBvcHRpb25zKTsKLX0pOwotCi1FbWJlci5IYW5kbGViYXJzLnJlc29sdmVIZWxwZXIg
PSBmdW5jdGlvbihjb250YWluZXIsIG5hbWUpIHsKLQotICBpZiAoIWNvbnRhaW5lciB8fCBuYW1l
LmluZGV4T2YoJy0nKSA9PT0gLTEpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2YXIgaGVscGVy
ID0gY29udGFpbmVyLmxvb2t1cCgnaGVscGVyOicgKyBuYW1lKTsKLSAgaWYgKCFoZWxwZXIpIHsK
LSAgICB2YXIgY29tcG9uZW50TG9va3VwID0gY29udGFpbmVyLmxvb2t1cCgnY29tcG9uZW50LWxv
b2t1cDptYWluJyk7Ci0gICAgRW1iZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCAnY29tcG9uZW50
LWxvb2t1cDptYWluJyBvbiB0aGUgcHJvdmlkZWQgY29udGFpbmVyLCB3aGljaCBpcyBuZWNlc3Nh
cnkgZm9yIHBlcmZvcm1pbmcgY29tcG9uZW50IGxvb2t1cHMiLCBjb21wb25lbnRMb29rdXApOwot
Ci0gICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudExvb2t1cC5sb29rdXBGYWN0b3J5KG5hbWUs
IGNvbnRhaW5lcik7Ci0gICAgaWYgKENvbXBvbmVudCkgewotICAgICAgaGVscGVyID0gRW1iZXJI
YW5kbGViYXJzLm1ha2VWaWV3SGVscGVyKENvbXBvbmVudCk7Ci0gICAgICBjb250YWluZXIucmVn
aXN0ZXIoJ2hlbHBlcjonICsgbmFtZSwgaGVscGVyKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGhl
bHBlcjsKLX07Ci0KLS8qKgotICBgYmluZGAgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIHZhbHVl
LCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0Ci0gIGNoYW5nZXMuIEZvciBleGFtcGxlLCBp
ZiB5b3Ugd2FudGVkIHRvIHByaW50IHRoZSBgdGl0bGVgIHByb3BlcnR5IG9mCi0gIGBjb250ZW50
YDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7YmluZCAiY29udGVudC50aXRsZSJ9fQotICBgYGAK
LQotICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBgdGl0bGVgIHByb3BlcnR5IGFzIGEgc3RyaW5nLCB0
aGVuIGNyZWF0ZSBhIG5ldyBvYnNlcnZlcgotICBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIGl0
IGNoYW5nZXMsIGl0IHdpbGwgdXBkYXRlIHRoZSB2YWx1ZSBpbiBET00uIE5vdGUKLSAgdGhhdCBp
ZiB5b3UgbmVlZCB0byBzdXBwb3J0IElFNyBhbmQgSUU4IHlvdSBtdXN0IG1vZGlmeSB0aGUgbW9k
ZWwgb2JqZWN0cwotICBwcm9wZXJ0aWVzIHVzaW5nIGBFbWJlci5nZXQoKWAgYW5kIGBFbWJlci5z
ZXQoKWAgZm9yIHRoaXMgdG8gd29yayBhcyBpdAotICByZWxpZXMgb24gRW1iZXIncyBLVk8gc3lz
dGVtLiBGb3IgYWxsIG90aGVyIGJyb3dzZXJzIHRoaXMgd2lsbCBiZSBoYW5kbGVkIGZvcgotICB5
b3UgYXV0b21hdGljYWxseS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGJpbmQKLSAgQGZvciBF
bWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3Bl
cnR5IHRvIGJpbmQKLSAgQHBhcmFtIHtGdW5jdGlvbn0gZm4gQ29udGV4dCB0byBwcm92aWRlIGZv
ciByZW5kZXJpbmcKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFu
ZGxlYmFycy5yZWdpc3RlckhlbHBlcignYmluZCcsIGZ1bmN0aW9uIGJpbmRIZWxwZXIocHJvcGVy
dHksIG9wdGlvbnMpIHsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IHBhc3MgbW9yZSB0aGFu
IG9uZSBhcmd1bWVudCB0byB0aGUgYmluZCBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIp
OwotCi0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0
cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXM7Ci0KLSAgaWYgKCFvcHRpb25z
LmZuKSB7Ci0gICAgcmV0dXJuIHNpbXBsZUJpbmQoY29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMp
OwotICB9Ci0KLSAgcmV0dXJuIGJpbmQuY2FsbChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucywg
ZmFsc2UsIGV4aXN0cyk7Ci19KTsKLQotLyoqCi0gIFVzZSB0aGUgYGJvdW5kSWZgIGhlbHBlciB0
byBjcmVhdGUgYSBjb25kaXRpb25hbCB0aGF0IHJlLWV2YWx1YXRlcwotICB3aGVuZXZlciB0aGUg
dHJ1dGhpbmVzcyBvZiB0aGUgYm91bmQgdmFsdWUgY2hhbmdlcy4KLQotICBgYGBoYW5kbGViYXJz
Ci0gIHt7I2JvdW5kSWYgImNvbnRlbnQuc2hvdWxkRGlzcGxheVRpdGxlIn19Ci0gICAge3tjb250
ZW50LnRpdGxlfX0KLSAge3svYm91bmRJZn19Ci0gIGBgYAotCi0gIEBwcml2YXRlCi0gIEBtZXRo
b2QgYm91bmRJZgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0
cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gYmluZAotICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBD
b250ZXh0IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmluZwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwg
c3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdib3VuZElmJywgZnVu
Y3Rpb24gYm91bmRJZkhlbHBlcihwcm9wZXJ0eSwgZm4pIHsKLSAgdmFyIGNvbnRleHQgPSAoZm4u
Y29udGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBdIDogdGhpczsK
LSAgdmFyIGZ1bmMgPSBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICB2YXIgdHJ1dGh5ID0gcmVzdWx0
ICYmIGdldChyZXN1bHQsICdpc1RydXRoeScpOwotICAgIGlmICh0eXBlb2YgdHJ1dGh5ID09PSAn
Ym9vbGVhbicpIHsgcmV0dXJuIHRydXRoeTsgfQotCi0gICAgaWYgKEVtYmVyLmlzQXJyYXkocmVz
dWx0KSkgewotICAgICAgcmV0dXJuIGdldChyZXN1bHQsICdsZW5ndGgnKSAhPT0gMDsKLSAgICB9
IGVsc2UgewotICAgICAgcmV0dXJuICEhcmVzdWx0OwotICAgIH0KLSAgfTsKLQotICByZXR1cm4g
YmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBmbiwgdHJ1ZSwgZnVuYywgZnVuYywgWydpc1Ry
dXRoeScsICdsZW5ndGgnXSk7Ci19KTsKLQotLyoqCi0gIFVzZSB0aGUgYHt7d2l0aH19YCBoZWxw
ZXIgd2hlbiB5b3Ugd2FudCB0byBzY29wZSBjb250ZXh0LiBUYWtlIHRoZSBmb2xsb3dpbmcgY29k
ZSBhcyBhbiBleGFtcGxlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGg1Pnt7dXNlci5uYW1lfX08
L2g1PgotCi0gIDxkaXYgY2xhc3M9InJvbGUiPgotICAgIDxoNj57e3VzZXIucm9sZS5sYWJlbH19
PC9oNj4KLSAgICA8c3BhbiBjbGFzcz0icm9sZS1pZCI+e3t1c2VyLnJvbGUuaWR9fTwvc3Bhbj4K
LQotICAgIDxwIGNsYXNzPSJyb2xlLWRlc2MiPnt7dXNlci5yb2xlLmRlc2NyaXB0aW9ufX08L3A+
Ci0gIDwvZGl2PgotICBgYGAKLQotICBge3t3aXRofX1gIGNhbiBiZSBvdXIgYmVzdCBmcmllbmQg
aW4gdGhlc2UgY2FzZXMsIAotICBpbnN0ZWFkIG9mIHdyaXRpbmcgYHVzZXIucm9sZS4qYCBvdmVy
IGFuZCBvdmVyLCB3ZSB1c2UgYHt7I3dpdGggdXNlci5yb2xlfX1gLgotICBOb3cgdGhlIGNvbnRl
eHQgd2l0aGluIHRoZSBge3sjd2l0aH19IC4uIHt7L3dpdGh9fWAgYmxvY2sgaXMgYHVzZXIucm9s
ZWAgc28geW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAgPGg1
Pnt7dXNlci5uYW1lfX08L2g1PgotCi0gIDxkaXYgY2xhc3M9InJvbGUiPgotICAgIHt7I3dpdGgg
dXNlci5yb2xlfX0KLSAgICAgIDxoNj57e2xhYmVsfX08L2g2PgotICAgICAgPHNwYW4gY2xhc3M9
InJvbGUtaWQiPnt7aWR9fTwvc3Bhbj4KLQotICAgICAgPHAgY2xhc3M9InJvbGUtZGVzYyI+e3tk
ZXNjcmlwdGlvbn19PC9wPgotICAgIHt7L3dpdGh9fQotICA8L2Rpdj4KLSAgYGBgCi0KLSAgIyMj
IGBhc2Agb3BlcmF0b3IKLQotICBUaGlzIG9wZXJhdG9yIGFsaWFzZXMgdGhlIHNjb3BlIHRvIGEg
bmV3IG5hbWUuIEl0J3MgaGVscGZ1bCBmb3Igc2VtYW50aWMgY2xhcml0eSBhbmQgdG8gcmV0YWlu
IAotICBkZWZhdWx0IHNjb3BlIG9yIHRvIHJlZmVyZW5jZSBmcm9tIGFub3RoZXIgYHt7d2l0aH19
YCBibG9jay4KLQotICBgYGBoYW5kbGViYXJzCi0gIC8vIHBvc3RzIG1pZ2h0IG5vdCBiZQotICB7
eyN3aXRoIHVzZXIucG9zdHMgYXMgYmxvZ1Bvc3RzfX0KLSAgICA8ZGl2IGNsYXNzPSJub3RpY2Ui
PgotICAgICAgVGhlcmUgYXJlIHt7YmxvZ1Bvc3RzLmxlbmd0aH19IGJsb2cgcG9zdHMgd3JpdHRl
biBieSB7e3VzZXIubmFtZX19LgotICAgIDwvZGl2PgotCi0gICAge3sjZWFjaCBwb3N0IGluIGJs
b2dQb3N0c319Ci0gICAgICA8bGk+e3twb3N0LnRpdGxlfX08L2xpPgotICAgIHt7L2VhY2h9fQot
ICB7ey93aXRofX0KLSAgYGBgCi0KLSAgV2l0aG91dCB0aGUgYGFzYCBvcGVyYXRvciwgaXQgd291
bGQgYmUgaW1wb3NzaWJsZSB0byByZWZlcmVuY2UgYHVzZXIubmFtZWAgaW4gdGhlIGV4YW1wbGUg
YWJvdmUuCi0KLSAgQG1ldGhvZCB3aXRoCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
Ci0gIEBwYXJhbSB7RnVuY3Rpb259IGNvbnRleHQKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0g
IEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKLSovCi1FbWJlckhhbmRsZWJhcnMucmVnaXN0
ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbiB3aXRoSGVscGVyKGNvbnRleHQsIG9wdGlvbnMpIHsK
LSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsKLSAgICB2YXIga2V5d29yZE5hbWUsIHBh
dGgsIHJvb3RQYXRoLCBub3JtYWxpemVkLCBjb250ZXh0UGF0aDsKLQotICAgIEVtYmVyLmFzc2Vy
dCgiSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgd2l0aCBoZWxwZXIs
IGl0IG11c3QgYmUgaW4gdGhlIGZvcm0gI3dpdGggZm9vIGFzIGJhciIsIGFyZ3VtZW50c1sxXSA9
PT0gImFzIik7Ci0gICAgb3B0aW9ucyA9IGFyZ3VtZW50c1szXTsKLSAgICBrZXl3b3JkTmFtZSA9
IGFyZ3VtZW50c1syXTsKLSAgICBwYXRoID0gYXJndW1lbnRzWzBdOwotCi0gICAgRW1iZXIuYXNz
ZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHdpdGggaGVscGVyIiwgb3B0aW9ucy5m
biAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOwotCi0gICAgdmFyIGxvY2Fs
aXplZE9wdGlvbnMgPSBvX2NyZWF0ZShvcHRpb25zKTsKLSAgICBsb2NhbGl6ZWRPcHRpb25zLmRh
dGEgPSBvX2NyZWF0ZShvcHRpb25zLmRhdGEpOwotICAgIGxvY2FsaXplZE9wdGlvbnMuZGF0YS5r
ZXl3b3JkcyA9IG9fY3JlYXRlKG9wdGlvbnMuZGF0YS5rZXl3b3JkcyB8fCB7fSk7Ci0KLSAgICBp
ZiAoRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7Ci0gICAgICBjb250ZXh0UGF0aCA9IHBhdGg7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKHRoaXMsIHBh
dGgsIG9wdGlvbnMuZGF0YSk7Ci0gICAgICBwYXRoID0gbm9ybWFsaXplZC5wYXRoOwotICAgICAg
cm9vdFBhdGggPSBub3JtYWxpemVkLnJvb3Q7Ci0KLSAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJv
dW5kIGZvciB0aGUgZmFjdCB0aGF0IHlvdSBjYW5ub3QgYmluZCBzZXBhcmF0ZSBvYmplY3RzCi0g
ICAgICAvLyB0b2dldGhlci4gV2hlbiB3ZSBpbXBsZW1lbnQgdGhhdCBmdW5jdGlvbmFsaXR5LCB3
ZSBzaG91bGQgdXNlIGl0IGhlcmUuCi0gICAgICB2YXIgY29udGV4dEtleSA9IEVtYmVyLiQuZXhw
YW5kbyArIEVtYmVyLmd1aWRGb3Iocm9vdFBhdGgpOwotICAgICAgbG9jYWxpemVkT3B0aW9ucy5k
YXRhLmtleXdvcmRzW2NvbnRleHRLZXldID0gcm9vdFBhdGg7Ci0gICAgICAvLyBpZiB0aGUgcGF0
aCBpcyAnJyAoInRoaXMiKSwganVzdCBiaW5kIGRpcmVjdGx5IHRvIHRoZSBjdXJyZW50IGNvbnRl
eHQKLSAgICAgIGNvbnRleHRQYXRoID0gcGF0aCA/IGNvbnRleHRLZXkgKyAnLicgKyBwYXRoIDog
Y29udGV4dEtleTsKLSAgICB9Ci0KLSAgICBFbWJlci5iaW5kKGxvY2FsaXplZE9wdGlvbnMuZGF0
YS5rZXl3b3Jkcywga2V5d29yZE5hbWUsIGNvbnRleHRQYXRoKTsKLQotICAgIHJldHVybiBiaW5k
LmNhbGwodGhpcywgcGF0aCwgbG9jYWxpemVkT3B0aW9ucywgdHJ1ZSwgZXhpc3RzKTsKLSAgfSBl
bHNlIHsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3RseSBvbmUgYXJndW1l
bnQgdG8gdGhlIHdpdGggaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gICAgRW1i
ZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8gdGhlIHdpdGggaGVscGVyIiwgb3B0
aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZNLm5vb3ApOwotICAgIHJldHVy
biBoZWxwZXJzLmJpbmQuY2FsbChvcHRpb25zLmNvbnRleHRzWzBdLCBjb250ZXh0LCBvcHRpb25z
KTsKLSAgfQotfSk7Ci0KLQotLyoqCi0gIFNlZSBbYm91bmRJZl0oL2FwaS9jbGFzc2VzL0VtYmVy
LkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF9ib3VuZElmKQotCi0gIEBtZXRob2QgaWYK
LSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtGdW5jdGlvbn0gY29u
dGV4dAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0
cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbiBp
ZkhlbHBlcihjb250ZXh0LCBvcHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFz
cyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUgaWYgaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0
aCA9PT0gMik7Ci0gIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhIGJsb2NrIHRvIHRoZSBp
ZiBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9v
cCk7Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0s
IGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8qKgotICBAbWV0aG9kIHVubGVzcwotICBAZm9y
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0Z1bmN0aW9ufSBjb250ZXh0Ci0g
IEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0q
LwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbiB1bmxl
c3NIZWxwZXIoY29udGV4dCwgb3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBh
c3MgZXhhY3RseSBvbmUgYXJndW1lbnQgdG8gdGhlIHVubGVzcyBoZWxwZXIiLCBhcmd1bWVudHMu
bGVuZ3RoID09PSAyKTsKLSAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgYmxvY2sgdG8g
dGhlIHVubGVzcyBoZWxwZXIiLCBvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IEhhbmRsZWJh
cnMuVk0ubm9vcCk7Ci0KLSAgdmFyIGZuID0gb3B0aW9ucy5mbiwgaW52ZXJzZSA9IG9wdGlvbnMu
aW52ZXJzZTsKLQotICBvcHRpb25zLmZuID0gaW52ZXJzZTsKLSAgb3B0aW9ucy5pbnZlcnNlID0g
Zm47Ci0KLSAgcmV0dXJuIGhlbHBlcnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0s
IGNvbnRleHQsIG9wdGlvbnMpOwotfSk7Ci0KLS8qKgotICBgYmluZC1hdHRyYCBhbGxvd3MgeW91
IHRvIGNyZWF0ZSBhIGJpbmRpbmcgYmV0d2VlbiBET00gZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAot
ICBFbWJlciBvYmplY3RzLiBGb3IgZXhhbXBsZToKLQotICBgYGBoYW5kbGViYXJzCi0gIDxpbWcg
e3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVybCIgYWx0PSJpbWFnZVRpdGxlIn19PgotICBgYGAKLQot
ICBUaGUgYWJvdmUgaGFuZGxlYmFycyB0ZW1wbGF0ZSB3aWxsIGZpbGwgdGhlIGA8aW1nPmAncyBg
c3JjYCBhdHRyaWJ1dGUgd2lsbAotICB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5j
ZWQgd2l0aCBgImltYWdlVXJsImAgYW5kIGl0cyBgYWx0YAotICBhdHRyaWJ1dGUgd2l0aCB0aGUg
dmFsdWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgd2l0aCBgImltYWdlVGl0bGUiYC4KLQot
ICBJZiB0aGUgcmVuZGVyaW5nIGNvbnRleHQgb2YgdGhpcyB0ZW1wbGF0ZSBpcyB0aGUgZm9sbG93
aW5nIG9iamVjdDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIHsKLSAgICBpbWFnZVVybDogJ2h0dHA6
Ly9sb2xjYXRzLmluZm8vaGF6LWEtZnVubnknLAotICAgIGltYWdlVGl0bGU6ICdBIGh1bW9yb3Vz
IGltYWdlIG9mIGEgY2F0JwotICB9Ci0gIGBgYAotCi0gIFRoZSByZXN1bHRpbmcgSFRNTCBvdXRw
dXQgd2lsbCBiZToKLQotICBgYGBodG1sCi0gIDxpbWcgc3JjPSJodHRwOi8vbG9sY2F0cy5pbmZv
L2hhei1hLWZ1bm55IiBhbHQ9IkEgaHVtb3JvdXMgaW1hZ2Ugb2YgYSBjYXQiPgotICBgYGAKLQot
ICBgYmluZC1hdHRyYCBjYW5ub3QgcmVkZWNsYXJlIGV4aXN0aW5nIERPTSBlbGVtZW50IGF0dHJp
YnV0ZXMuIFRoZSB1c2Ugb2YgYHNyY2AKLSAgaW4gdGhlIGZvbGxvd2luZyBgYmluZC1hdHRyYCBl
eGFtcGxlIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIGhhcmQgY29kZWQgdmFsdWUKLSAgb2YgYHNy
Yz0iL2ZhaWx3aGFsZS5naWYiYCB3aWxsIHRha2UgcHJlY2VkZW5jZToKLQotICBgYGBoYW5kbGVi
YXJzCi0gIDxpbWcgc3JjPSIvZmFpbHdoYWxlLmdpZiIge3tiaW5kLWF0dHIgc3JjPSJpbWFnZVVy
bCIgYWx0PSJpbWFnZVRpdGxlIn19PgotICBgYGAKLQotICAjIyMgYGJpbmQtYXR0cmAgYW5kIHRo
ZSBgY2xhc3NgIGF0dHJpYnV0ZQotCi0gIGBiaW5kLWF0dHJgIHN1cHBvcnRzIGEgc3BlY2lhbCBz
eW50YXggZm9yIGhhbmRsaW5nIGEgbnVtYmVyIG9mIGNhc2VzIHVuaXF1ZQotICB0byB0aGUgYGNs
YXNzYCBET00gZWxlbWVudCBhdHRyaWJ1dGUuIFRoZSBgY2xhc3NgIGF0dHJpYnV0ZSBjb21iaW5l
cwotICBtdWx0aXBsZSBkaXNjcmV0ZSB2YWx1ZXMgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUgYXMg
YSBzcGFjZS1kZWxpbWl0ZWQKLSAgbGlzdCBvZiBzdHJpbmdzLiBFYWNoIHN0cmluZyBjYW4gYmU6
Ci0KLSAgKiBhIHN0cmluZyByZXR1cm4gdmFsdWUgb2YgYW4gb2JqZWN0J3MgcHJvcGVydHkuCi0g
ICogYSBib29sZWFuIHJldHVybiB2YWx1ZSBvZiBhbiBvYmplY3QncyBwcm9wZXJ0eQotICAqIGEg
aGFyZC1jb2RlZCB2YWx1ZQotCi0gIEEgc3RyaW5nIHJldHVybiB2YWx1ZSB3b3JrcyBpZGVudGlj
YWxseSB0byBvdGhlciB1c2VzIG9mIGBiaW5kLWF0dHJgLiBUaGUKLSAgcmV0dXJuIHZhbHVlIG9m
IHRoZSBwcm9wZXJ0eSB3aWxsIGJlY29tZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gRm9y
Ci0gIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdmlldyBhbmQgdGVtcGxhdGU6Ci0KLSAgYGBgamF2
YXNjcmlwdAotICAgIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgc29tZVByb3Bl
cnR5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICJhVmFsdWUiOwotICAgICAgfS5wcm9w
ZXJ0eSgpCi0gICAgfSkKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1h
dHRyIGNsYXNzPSJ2aWV3LnNvbWVQcm9wZXJ0eX19PgotICBgYGAKLQotICBSZXN1bHQgaW4gdGhl
IGZvbGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8aW1nIGNsYXNzPSJh
VmFsdWUiPgotICBgYGAKLQotICBBIGJvb2xlYW4gcmV0dXJuIHZhbHVlIHdpbGwgaW5zZXJ0IGEg
c3BlY2lmaWVkIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5Ci0gIHJldHVybnMgYHRydWVgIGFu
ZCByZW1vdmUgdGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IHJldHVybnMgYGZhbHNlYC4K
LQotICBBIGNsYXNzIG5hbWUgaXMgcHJvdmlkZWQgdmlhIHRoZSBzeW50YXgKLSAgYHNvbWVQcm9w
ZXJ0eU5hbWU6Y2xhc3MtbmFtZS1pZi10cnVlYC4KLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFWaWV3
ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHNvbWVCb29sOiB0cnVlCi0gIH0pCi0gIGBgYAot
Ci0gIGBgYGhhbmRsZWJhcnMKLSAgPGltZyB7e2JpbmQtYXR0ciBjbGFzcz0idmlldy5zb21lQm9v
bDpjbGFzcy1uYW1lLWlmLXRydWUifX0+Ci0gIGBgYAotCi0gIFJlc3VsdCBpbiB0aGUgZm9sbG93
aW5nIHJlbmRlcmVkIG91dHB1dDoKLQotICBgYGBodG1sCi0gIDxpbWcgY2xhc3M9ImNsYXNzLW5h
bWUtaWYtdHJ1ZSI+Ci0gIGBgYAotCi0gIEFuIGFkZGl0aW9uYWwgc2VjdGlvbiBvZiB0aGUgYmlu
ZGluZyBjYW4gYmUgcHJvdmlkZWQgaWYgeW91IHdhbnQgdG8KLSAgcmVwbGFjZSB0aGUgZXhpc3Rp
bmcgY2xhc3MgaW5zdGVhZCBvZiByZW1vdmluZyBpdCB3aGVuIHRoZSBib29sZWFuCi0gIHZhbHVl
IGNoYW5nZXM6Ci0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSJ2
aWV3LnNvbWVCb29sOmNsYXNzLW5hbWUtaWYtdHJ1ZTpjbGFzcy1uYW1lLWlmLWZhbHNlIn19Pgot
ICBgYGAKLQotICBBIGhhcmQtY29kZWQgdmFsdWUgY2FuIGJlIHVzZWQgYnkgcHJlcGVuZGluZyBg
OmAgdG8gdGhlIGRlc2lyZWQKLSAgY2xhc3MgbmFtZTogYDpjbGFzcy1uYW1lLXRvLWFsd2F5cy1h
cHBseWAuCi0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6Y2xh
c3MtbmFtZS10by1hbHdheXMtYXBwbHkifX0+Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIGZv
bGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8aW1nIGNsYXNzPSJjbGFz
cy1uYW1lLXRvLWFsd2F5cy1hcHBseSI+Ci0gIGBgYAotCi0gIEFsbCB0aHJlZSBzdHJhdGVnaWVz
IC0gc3RyaW5nIHJldHVybiB2YWx1ZSwgYm9vbGVhbiByZXR1cm4gdmFsdWUsIGFuZAotICBoYXJk
LWNvZGVkIHZhbHVlIOKAkyBjYW4gYmUgY29tYmluZWQgaW4gYSBzaW5nbGUgZGVjbGFyYXRpb246
Ci0KLSAgYGBgaGFuZGxlYmFycwotICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6Y2xhc3MtbmFt
ZS10by1hbHdheXMtYXBwbHkgdmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRydWUgdmlldy5z
b21lUHJvcGVydHkifX0+Ci0gIGBgYAotCi0gIEBtZXRob2QgYmluZC1hdHRyCi0gIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwotICBAcmV0dXJu
IHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy
KCdiaW5kLWF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhlbHBlcihvcHRpb25zKSB7Ci0KLSAgdmFy
IGF0dHJzID0gb3B0aW9ucy5oYXNoOwotCi0gIEVtYmVyLmFzc2VydCgiWW91IG11c3Qgc3BlY2lm
eSBhdCBsZWFzdCBvbmUgaGFzaCBhcmd1bWVudCB0byBiaW5kLWF0dHIiLCAhIUVtYmVyLmtleXMo
YXR0cnMpLmxlbmd0aCk7Ci0KLSAgdmFyIHZpZXcgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgdmFy
IHJldCA9IFtdOwotICB2YXIgY3R4ID0gdGhpczsKLQotICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBp
ZCBmb3IgdGhpcyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYWRkZWQgYXMgYQotICAvLyBkYXRhIGF0
dHJpYnV0ZSB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIHdoZW4KLSAgLy8g
dGhlIGJvdW5kIHByb3BlcnR5IGNoYW5nZXMuCi0gIHZhciBkYXRhSWQgPSArK0VtYmVyLnV1aWQ7
Ci0KLSAgLy8gSGFuZGxlIGNsYXNzZXMgZGlmZmVyZW50bHksIGFzIHdlIGNhbiBiaW5kIG11bHRp
cGxlIGNsYXNzZXMKLSAgdmFyIGNsYXNzQmluZGluZ3MgPSBhdHRyc1snY2xhc3MnXTsKLSAgaWYg
KGNsYXNzQmluZGluZ3MgIT0gbnVsbCkgewotICAgIHZhciBjbGFzc1Jlc3VsdHMgPSBFbWJlckhh
bmRsZWJhcnMuYmluZENsYXNzZXModGhpcywgY2xhc3NCaW5kaW5ncywgdmlldywgZGF0YUlkLCBv
cHRpb25zKTsKLQotICAgIHJldC5wdXNoKCdjbGFzcz0iJyArIEhhbmRsZWJhcnMuVXRpbHMuZXNj
YXBlRXhwcmVzc2lvbihjbGFzc1Jlc3VsdHMuam9pbignICcpKSArICciJyk7Ci0gICAgZGVsZXRl
IGF0dHJzWydjbGFzcyddOwotICB9Ci0KLSAgdmFyIGF0dHJLZXlzID0gRW1iZXIua2V5cyhhdHRy
cyk7Ci0KLSAgLy8gRm9yIGVhY2ggYXR0cmlidXRlIHBhc3NlZCwgY3JlYXRlIGFuIG9ic2VydmVy
IGFuZCBlbWl0IHRoZQotICAvLyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyBhbiBh
dHRyaWJ1dGUuCi0gIGZvckVhY2guY2FsbChhdHRyS2V5cywgZnVuY3Rpb24oYXR0cikgewotICAg
IHZhciBwYXRoID0gYXR0cnNbYXR0cl0sCi0gICAgICAgIG5vcm1hbGl6ZWQ7Ci0KLSAgICBFbWJl
ci5hc3NlcnQoZm10KCJZb3UgbXVzdCBwcm92aWRlIGFuIGV4cHJlc3Npb24gYXMgdGhlIHZhbHVl
IG9mIGJvdW5kIGF0dHJpYnV0ZS4gWW91IHNwZWNpZmllZDogJUA9JUAiLCBbYXR0ciwgcGF0aF0p
LCB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpOwotCi0gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6
ZVBhdGgoY3R4LCBwYXRoLCBvcHRpb25zLmRhdGEpOwotCi0gICAgdmFyIHZhbHVlID0gKHBhdGgg
PT09ICd0aGlzJykgPyBub3JtYWxpemVkLnJvb3QgOiBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwg
b3B0aW9ucyksCi0gICAgICAgIHR5cGUgPSBFbWJlci50eXBlT2YodmFsdWUpOwotCi0gICAgRW1i
ZXIuYXNzZXJ0KGZtdCgiQXR0cmlidXRlcyBtdXN0IGJlIG51bWJlcnMsIHN0cmluZ3Mgb3IgYm9v
bGVhbnMsIG5vdCAlQCIsIFt2YWx1ZV0pLCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5k
ZWZpbmVkIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUg
PT09ICdib29sZWFuJyk7Ci0KLSAgICB2YXIgb2JzZXJ2ZXIsIGludm9rZXI7Ci0KLSAgICBvYnNl
cnZlciA9IGZ1bmN0aW9uIG9ic2VydmVyKCkgewotICAgICAgdmFyIHJlc3VsdCA9IGhhbmRsZWJh
cnNHZXQoY3R4LCBwYXRoLCBvcHRpb25zKTsKLQotICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiQXR0
cmlidXRlcyBtdXN0IGJlIG51bWJlcnMsIHN0cmluZ3Mgb3IgYm9vbGVhbnMsIG5vdCAlQCIsIFty
ZXN1bHRdKSwKLSAgICAgICAgICAgICAgICAgICByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09
PSB1bmRlZmluZWQgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicgfHwKLSAgICAgICAgICAg
ICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiByZXN1bHQgPT09
ICdib29sZWFuJyk7Ci0KLSAgICAgIHZhciBlbGVtID0gdmlldy4kKCJbZGF0YS1iaW5kYXR0ci0i
ICsgZGF0YUlkICsgIj0nIiArIGRhdGFJZCArICInXSIpOwotCi0gICAgICAvLyBJZiB3ZSBhcmVu
J3QgYWJsZSB0byBmaW5kIHRoZSBlbGVtZW50LCBpdCBtZWFucyB0aGUgZWxlbWVudAotICAgICAg
Ly8gdG8gd2hpY2ggd2Ugd2VyZSBib3VuZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHZpZXcu
Ci0gICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGNhbiBhc3N1bWUgdGhlIHRlbXBsYXRlIGhhcyBi
ZWVuIHJlLXJlbmRlcmVkCi0gICAgICAvLyBhbmQgd2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgb2Jz
ZXJ2ZXIuCi0gICAgICBpZiAoIWVsZW0gfHwgZWxlbS5sZW5ndGggPT09IDApIHsKLSAgICAgICAg
RW1iZXIucmVtb3ZlT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVkLnBhdGgsIGlu
dm9rZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIEVtYmVyLlZpZXcuYXBw
bHlBdHRyaWJ1dGVCaW5kaW5ncyhlbGVtLCBhdHRyLCByZXN1bHQpOwotICAgIH07Ci0KLSAgICAv
LyBBZGQgYW4gb2JzZXJ2ZXIgdG8gdGhlIHZpZXcgZm9yIHdoZW4gdGhlIHByb3BlcnR5IGNoYW5n
ZXMuCi0gICAgLy8gV2hlbiB0aGUgb2JzZXJ2ZXIgZmlyZXMsIGZpbmQgdGhlIGVsZW1lbnQgdXNp
bmcgdGhlCi0gICAgLy8gdW5pcXVlIGRhdGEgaWQgYW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRv
IHRoZSBuZXcgdmFsdWUuCi0gICAgLy8gTm90ZTogZG9uJ3QgYWRkIG9ic2VydmVyIHdoZW4gcGF0
aCBpcyAndGhpcycgb3IgcGF0aAotICAgIC8vIGlzIHdob2xlIGtleXdvcmQgZS5nLiB7eyNlYWNo
IHggaW4gbGlzdH19IC4uLiB7e2JpbmQtYXR0ciBhdHRyPSJ4In19Ci0gICAgaWYgKHBhdGggIT09
ICd0aGlzJyAmJiAhKG5vcm1hbGl6ZWQuaXNLZXl3b3JkICYmIG5vcm1hbGl6ZWQucGF0aCA9PT0g
JycgKSkgewotICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKG5vcm1hbGl6ZWQucm9vdCwgbm9y
bWFsaXplZC5wYXRoLCBvYnNlcnZlcik7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhpcyBjaGFuZ2Vz
LCBhbHNvIGNoYW5nZSB0aGUgbG9naWMgaW4gZW1iZXItdmlld3MvbGliL3ZpZXdzL3ZpZXcuanMK
LSAgICBpZiAoKHR5cGUgPT09ICdzdHJpbmcnIHx8ICh0eXBlID09PSAnbnVtYmVyJyAmJiAhaXNO
YU4odmFsdWUpKSkpIHsKLSAgICAgIHJldC5wdXNoKGF0dHIgKyAnPSInICsgSGFuZGxlYmFycy5V
dGlscy5lc2NhcGVFeHByZXNzaW9uKHZhbHVlKSArICciJyk7Ci0gICAgfSBlbHNlIGlmICh2YWx1
ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHsKLSAgICAgIC8vIFRoZSBkZXZlbG9wZXIgY29udHJv
bHMgdGhlIGF0dHIgbmFtZSwgc28gaXQgc2hvdWxkIGFsd2F5cyBiZSBzYWZlCi0gICAgICByZXQu
cHVzaChhdHRyICsgJz0iJyArIGF0dHIgKyAnIicpOwotICAgIH0KLSAgfSwgdGhpcyk7Ci0KLSAg
Ly8gQWRkIHRoZSB1bmlxdWUgaWRlbnRpZmllcgotICAvLyBOT1RFOiBXZSB1c2UgYWxsIGxvd2Vy
LWNhc2Ugc2luY2UgRmlyZWZveCBoYXMgcHJvYmxlbXMgd2l0aCBtaXhlZCBjYXNlIGluIFNWRwot
ICByZXQucHVzaCgnZGF0YS1iaW5kYXR0ci0nICsgZGF0YUlkICsgJz0iJyArIGRhdGFJZCArICci
Jyk7Ci0gIHJldHVybiBuZXcgRW1iZXJIYW5kbGViYXJzLlNhZmVTdHJpbmcocmV0LmpvaW4oJyAn
KSk7Ci19KTsKLQotLyoqCi0gIFNlZSBgYmluZC1hdHRyYAotCi0gIEBtZXRob2QgYmluZEF0dHIK
LSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQGRlcHJlY2F0ZWQKLSAgQHBhcmFt
IHtGdW5jdGlvbn0gY29udGV4dAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7
U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
YmluZEF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhlbHBlcigpIHsKLSAgRW1iZXIud2FybigiVGhl
ICdiaW5kQXR0cicgdmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnYmluZC1h
dHRyJyIpOwotICByZXR1cm4gRW1iZXJIYW5kbGViYXJzLmhlbHBlcnNbJ2JpbmQtYXR0ciddLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci19KTsKLQotLyoqCi0gIEhlbHBlciB0aGF0LCBnaXZlbiBh
IHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgYW5kIGEgY29udGV4dCwK
LSAgcmV0dXJucyBhbiBhcnJheSBvZiBjbGFzcyBuYW1lcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBh
bHNvIGhhcyB0aGUgc2lkZQotICBlZmZlY3Qgb2Ygc2V0dGluZyB1cCBvYnNlcnZlcnMgYXQgdGhv
c2UgcHJvcGVydHkgcGF0aHMsIHN1Y2ggdGhhdCBpZiB0aGV5Ci0gIGNoYW5nZSwgdGhlIGNvcnJl
Y3QgY2xhc3MgbmFtZSB3aWxsIGJlIHJlYXBwbGllZCB0byB0aGUgRE9NIGVsZW1lbnQuCi0KLSAg
Rm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgImZvb0JhciIsIGl0IHdpbGwgZmly
c3QgbG9vayB1cCB0aGUKLSAgImZvb0JhciIgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoYXQg
dmFsdWUgaXMgdHJ1ZSwgaXQgd2lsbCBhZGQgdGhlCi0gICJmb28tYmFyIiBjbGFzcyB0byB0aGUg
Y3VycmVudCBlbGVtZW50IChpLmUuLCB0aGUgZGFzaGVyaXplZCBmb3JtIG9mCi0gICJmb29CYXIi
KS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGFkZCB0aGF0IHN0cmluZyBhcyB0
aGUgY2xhc3MuCi0gIE90aGVyd2lzZSwgaXQgd2lsbCBub3QgYWRkIGFueSBuZXcgY2xhc3MgbmFt
ZS4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIGJpbmRDbGFzc2VzCi0gIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycwotICBAcGFyYW0ge0VtYmVyLk9iamVjdH0gY29udGV4dCBUaGUgY29udGV4dCBmcm9t
IHdoaWNoIHRvIGxvb2t1cCBwcm9wZXJ0aWVzCi0gIEBwYXJhbSB7U3RyaW5nfSBjbGFzc0JpbmRp
bmdzIEEgc3RyaW5nLCBzcGFjZS1zZXBhcmF0ZWQsIG9mIGNsYXNzIGJpbmRpbmdzCi0gICAgdG8g
dXNlCi0gIEBwYXJhbSB7RW1iZXIuVmlld30gdmlldyBUaGUgdmlldyBpbiB3aGljaCBvYnNlcnZl
cnMgc2hvdWxkIGxvb2sgZm9yIHRoZQotICAgIGVsZW1lbnQgdG8gdXBkYXRlCi0gIEBwYXJhbSB7
U3J0aW5nfSBiaW5kQXR0cklkIE9wdGlvbmFsIGJpbmRBdHRyIGlkIHVzZWQgdG8gbG9va3VwIGVs
ZW1lbnRzCi0gIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjbGFzcyBuYW1lcyB0byBhZGQK
LSovCi1FbWJlckhhbmRsZWJhcnMuYmluZENsYXNzZXMgPSBmdW5jdGlvbihjb250ZXh0LCBjbGFz
c0JpbmRpbmdzLCB2aWV3LCBiaW5kQXR0cklkLCBvcHRpb25zKSB7Ci0gIHZhciByZXQgPSBbXSwg
bmV3Q2xhc3MsIHZhbHVlLCBlbGVtOwotCi0gIC8vIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUg
dGhlIHByb3BlcnR5IGZyb20gdGhlIGNvbnRleHQgYW5kCi0gIC8vIGRldGVybWluZSB3aGljaCBj
bGFzcyBzdHJpbmcgdG8gcmV0dXJuLCBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzCi0gIC8vIGEgQm9v
bGVhbiBvciBub3QuCi0gIHZhciBjbGFzc1N0cmluZ0ZvclBhdGggPSBmdW5jdGlvbihyb290LCBw
YXJzZWRQYXRoLCBvcHRpb25zKSB7Ci0gICAgdmFyIHZhbCwKLSAgICAgICAgcGF0aCA9IHBhcnNl
ZFBhdGgucGF0aDsKLQotICAgIGlmIChwYXRoID09PSAndGhpcycpIHsKLSAgICAgIHZhbCA9IHJv
b3Q7Ci0gICAgfSBlbHNlIGlmIChwYXRoID09PSAnJykgewotICAgICAgdmFsID0gdHJ1ZTsKLSAg
ICB9IGVsc2UgewotICAgICAgdmFsID0gaGFuZGxlYmFyc0dldChyb290LCBwYXRoLCBvcHRpb25z
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShw
YXRoLCB2YWwsIHBhcnNlZFBhdGguY2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1l
KTsKLSAgfTsKLQotICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSBwYXNzZWQsIGxvb3AgdGhyb3VnaCBh
bmQgc2V0dXAKLSAgLy8gYW4gb2JzZXJ2ZXIuCi0gIGZvckVhY2guY2FsbChjbGFzc0JpbmRpbmdz
LnNwbGl0KCcgJyksIGZ1bmN0aW9uKGJpbmRpbmcpIHsKLQotICAgIC8vIFZhcmlhYmxlIGluIHdo
aWNoIHRoZSBvbGQgY2xhc3MgdmFsdWUgaXMgc2F2ZWQuIFRoZSBvYnNlcnZlciBmdW5jdGlvbgot
ICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFibGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmlu
ZyB0byByZW1vdmUgd2hlbgotICAgIC8vIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLgotICAgIHZhciBv
bGRDbGFzczsKLQotICAgIHZhciBvYnNlcnZlciwgaW52b2tlcjsKLQotICAgIHZhciBwYXJzZWRQ
YXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0eVBhdGgoYmluZGluZyksCi0gICAgICAgIHBh
dGggPSBwYXJzZWRQYXRoLnBhdGgsCi0gICAgICAgIHBhdGhSb290ID0gY29udGV4dCwKLSAgICAg
ICAgbm9ybWFsaXplZDsKLQotICAgIGlmIChwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAndGhpcycp
IHsKLSAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRleHQsIHBhdGgsIG9wdGlv
bnMuZGF0YSk7Ci0KLSAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290OwotICAgICAgcGF0
aCA9IG5vcm1hbGl6ZWQucGF0aDsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdXAgYW4gb2JzZXJ2ZXIg
b24gdGhlIGNvbnRleHQuIElmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLCB0b2dnbGUgdGhlCi0gICAg
Ly8gY2xhc3MgbmFtZS4KLSAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewotICAgICAgLy8gR2V0
IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAgbmV3Q2xhc3MgPSBjbGFz
c1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFyc2VkUGF0aCwgb3B0aW9ucyk7Ci0gICAgICBlbGVt
ID0gYmluZEF0dHJJZCA/IHZpZXcuJCgiW2RhdGEtYmluZGF0dHItIiArIGJpbmRBdHRySWQgKyAi
PSciICsgYmluZEF0dHJJZCArICInXSIpIDogdmlldy4kKCk7Ci0KLSAgICAgIC8vIElmIHdlIGNh
bid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwgYSBwYXJlbnQgdGVtcGxhdGUgaGFzIGJlZW4K
LSAgICAgIC8vIHJlLXJlbmRlcmVkIGFuZCB3ZSd2ZSBiZWVuIG51a2VkLiBSZW1vdmUgdGhlIG9i
c2VydmVyLgotICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3RoID09PSAwKSB7Ci0gICAgICAg
IEVtYmVyLnJlbW92ZU9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBpbnZva2VyKTsKLSAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBwcmV2aW91c2x5IGFkZGVkIGEgY2xhc3MgdG8g
dGhlIGVsZW1lbnQsIHJlbW92ZSBpdC4KLSAgICAgICAgaWYgKG9sZENsYXNzKSB7Ci0gICAgICAg
ICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJ
ZiBuZWNlc3NhcnksIGFkZCBhIG5ldyBjbGFzcy4gTWFrZSBzdXJlIHdlIGtlZXAgdHJhY2sgb2Yg
aXQgc28KLSAgICAgICAgLy8gaXQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAg
ICAgaWYgKG5ld0NsYXNzKSB7Ci0gICAgICAgICAgZWxlbS5hZGRDbGFzcyhuZXdDbGFzcyk7Ci0g
ICAgICAgICAgb2xkQ2xhc3MgPSBuZXdDbGFzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICBvbGRDbGFzcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0gICAgaWYg
KHBhdGggIT09ICcnICYmIHBhdGggIT09ICd0aGlzJykgewotICAgICAgdmlldy5yZWdpc3Rlck9i
c2VydmVyKHBhdGhSb290LCBwYXRoLCBvYnNlcnZlcik7Ci0gICAgfQotCi0gICAgLy8gV2UndmUg
YWxyZWFkeSBzZXR1cCB0aGUgb2JzZXJ2ZXI7IG5vdyB3ZSBqdXN0IG5lZWQgdG8gZmlndXJlIG91
dCB0aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIHJpZ2h0IG5vdyBvbiB0aGUgZmlyc3QgcGFz
cyB0aHJvdWdoLgotICAgIHZhbHVlID0gY2xhc3NTdHJpbmdGb3JQYXRoKGNvbnRleHQsIHBhcnNl
ZFBhdGgsIG9wdGlvbnMpOwotCi0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICByZXQucHVzaCh2YWx1
ZSk7Ci0KLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzYXZlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHRo
YXQgaXQgY2FuIGJlIHJlbW92ZWQgaWYgdGhlCi0gICAgICAvLyBvYnNlcnZlciBmaXJlcy4KLSAg
ICAgIG9sZENsYXNzID0gdmFsdWU7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gcmV0OwotfTsK
LQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8K
LQotLy8gVE9ETzogRG9uJ3QgcmVxdWlyZSB0aGUgZW50aXJlIG1vZHVsZQotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJl
ci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLXZhciBFbWJlckhhbmRsZWJhcnMgPSBFbWJlci5IYW5k
bGViYXJzOwotdmFyIExPV0VSQ0FTRV9BX1ogPSAvXlthLXpdLzsKLXZhciBWSUVXX1BSRUZJWCA9
IC9edmlld1wuLzsKLQotZnVuY3Rpb24gbWFrZUJpbmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25z
KSB7Ci0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLAotICAgICAgaGFzaFR5cGUgPSBvcHRpb25z
Lmhhc2hUeXBlczsKLQotICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICBpZiAoaGFzaFR5
cGVbcHJvcF0gPT09ICdJRCcpIHsKLQotICAgICAgdmFyIHZhbHVlID0gaGFzaFtwcm9wXTsKLQot
ICAgICAgaWYgKEVtYmVyLklTX0JJTkRJTkcudGVzdChwcm9wKSkgewotICAgICAgICBFbWJlci53
YXJuKCJZb3UncmUgYXR0ZW1wdGluZyB0byByZW5kZXIgYSB2aWV3IGJ5IHBhc3NpbmcgIiArIHBy
b3AgKyAiPSIgKyB2YWx1ZSArICIgdG8gYSB2aWV3IGhlbHBlciwgYnV0IHRoaXMgc3ludGF4IGlz
IGFtYmlndW91cy4gWW91IHNob3VsZCBlaXRoZXIgc3Vycm91bmQgIiArIHZhbHVlICsgIiBpbiBx
dW90ZXMgb3IgcmVtb3ZlIGBCaW5kaW5nYCBmcm9tICIgKyBwcm9wICsgIi4iKTsKLSAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGhhc2hbcHJvcCArICdCaW5kaW5nJ10gPSB2YWx1ZTsKLSAgICAgICAg
aGFzaFR5cGVbcHJvcCArICdCaW5kaW5nJ10gPSAnU1RSSU5HJzsKLSAgICAgICAgZGVsZXRlIGhh
c2hbcHJvcF07Ci0gICAgICAgIGRlbGV0ZSBoYXNoVHlwZVtwcm9wXTsKLSAgICAgIH0KLSAgICB9
Ci0gIH0KLQotICBpZiAoaGFzaC5oYXNPd25Qcm9wZXJ0eSgnaWRCaW5kaW5nJykpIHsKLSAgICAv
LyBpZCBjYW4ndCBiZSBib3VuZCwgc28ganVzdCBwZXJmb3JtIG9uZS10aW1lIGxvb2t1cC4KLSAg
ICBoYXNoLmlkID0gRW1iZXJIYW5kbGViYXJzLmdldCh0aGlzQ29udGV4dCwgaGFzaC5pZEJpbmRp
bmcsIG9wdGlvbnMpOwotICAgIGhhc2hUeXBlLmlkID0gJ1NUUklORyc7Ci0gICAgZGVsZXRlIGhh
c2guaWRCaW5kaW5nOwotICAgIGRlbGV0ZSBoYXNoVHlwZS5pZEJpbmRpbmc7Ci0gIH0KLX0KLQot
RW1iZXJIYW5kbGViYXJzLlZpZXdIZWxwZXIgPSBFbWJlci5PYmplY3QuY3JlYXRlKHsKLQotICBw
cm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgdmFyIGhh
c2ggPSBvcHRpb25zLmhhc2gsIGRhdGEgPSBvcHRpb25zLmRhdGE7Ci0gICAgdmFyIGV4dGVuc2lv
bnMgPSB7fSwKLSAgICAgICAgY2xhc3NlcyA9IGhhc2hbJ2NsYXNzJ10sCi0gICAgICAgIGR1cCA9
IGZhbHNlOwotCi0gICAgaWYgKGhhc2guaWQpIHsKLSAgICAgIGV4dGVuc2lvbnMuZWxlbWVudElk
ID0gaGFzaC5pZDsKLSAgICAgIGR1cCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGhhc2gudGFn
KSB7Ci0gICAgICBleHRlbnNpb25zLnRhZ05hbWUgPSBoYXNoLnRhZzsKLSAgICAgIGR1cCA9IHRy
dWU7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzZXMpIHsKLSAgICAgIGNsYXNzZXMgPSBjbGFzc2Vz
LnNwbGl0KCcgJyk7Ci0gICAgICBleHRlbnNpb25zLmNsYXNzTmFtZXMgPSBjbGFzc2VzOwotICAg
ICAgZHVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzaC5jbGFzc0JpbmRpbmcpIHsKLSAg
ICAgIGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MgPSBoYXNoLmNsYXNzQmluZGluZy5zcGxp
dCgnICcpOwotICAgICAgZHVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzaC5jbGFzc05h
bWVCaW5kaW5ncykgewotICAgICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MgPT09
IHVuZGVmaW5lZCkgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IFtdOwotICAgICAgZXh0
ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncyA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3Mu
Y29uY2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKSk7Ci0gICAgICBkdXAgPSB0
cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNoLmF0dHJpYnV0ZUJpbmRpbmdzKSB7Ci0gICAgICBF
bWJlci5hc3NlcnQoIlNldHRpbmcgJ2F0dHJpYnV0ZUJpbmRpbmdzJyB2aWEgSGFuZGxlYmFycyBp
cyBub3QgYWxsb3dlZC4gUGxlYXNlIHN1YmNsYXNzIEVtYmVyLlZpZXcgYW5kIHNldCBpdCB0aGVy
ZSBpbnN0ZWFkLiIpOwotICAgICAgZXh0ZW5zaW9ucy5hdHRyaWJ1dGVCaW5kaW5ncyA9IG51bGw7
Ci0gICAgICBkdXAgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChkdXApIHsKLSAgICAgIGhhc2gg
PSBFbWJlci4kLmV4dGVuZCh7fSwgaGFzaCk7Ci0gICAgICBkZWxldGUgaGFzaC5pZDsKLSAgICAg
IGRlbGV0ZSBoYXNoLnRhZzsKLSAgICAgIGRlbGV0ZSBoYXNoWydjbGFzcyddOwotICAgICAgZGVs
ZXRlIGhhc2guY2xhc3NCaW5kaW5nOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcHJvcGVyIGNv
bnRleHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQgdG8gdGhlIGhlbHBlci4gVGhpcyBhcHBsaWVz
IHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzCi0gICAgLy8gYXMgd2VsbCBhcyBjbGFzcyBu
YW1lIGJpbmRpbmdzLiBJZiB0aGUgYmluZGluZ3MgYXJlIGxvY2FsLCBtYWtlIHRoZW0gcmVsYXRp
dmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dAotICAgIC8vIGluc3RlYWQgb2YgdGhlIHZpZXcuCi0g
ICAgdmFyIHBhdGg7Ci0KLSAgICAvLyBFdmFsdWF0ZSB0aGUgY29udGV4dCBvZiByZWd1bGFyIGF0
dHJpYnV0ZSBiaW5kaW5nczoKLSAgICBmb3IgKHZhciBwcm9wIGluIGhhc2gpIHsKLSAgICAgIGlm
ICghaGFzaC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBjb250aW51ZTsgfQotCi0gICAgICAvLyBU
ZXN0IGlmIHRoZSBwcm9wZXJ0eSBlbmRzIGluICJCaW5kaW5nIgotICAgICAgaWYgKEVtYmVyLklT
X0JJTkRJTkcudGVzdChwcm9wKSAmJiB0eXBlb2YgaGFzaFtwcm9wXSA9PT0gJ3N0cmluZycpIHsK
LSAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKGhhc2hbcHJvcF0s
IGRhdGEpOwotICAgICAgICBpZiAocGF0aCkgeyBoYXNoW3Byb3BdID0gcGF0aDsgfQotICAgICAg
fQotICAgIH0KLQotICAgIC8vIEV2YWx1YXRlIHRoZSBjb250ZXh0IG9mIGNsYXNzIG5hbWUgYmlu
ZGluZ3M6Ci0gICAgaWYgKGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MpIHsKLSAgICAgIGZv
ciAodmFyIGIgaW4gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncykgewotICAgICAgICB2YXIg
ZnVsbCA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3NbYl07Ci0gICAgICAgIGlmICh0eXBl
b2YgZnVsbCA9PT0gJ3N0cmluZycpIHsKLSAgICAgICAgICAvLyBDb250ZXh0dWFsaXplIHRoZSBw
YXRoIG9mIGNsYXNzTmFtZUJpbmRpbmcgc28gdGhpczoKLSAgICAgICAgICAvLwotICAgICAgICAg
IC8vICAgICBjbGFzc05hbWVCaW5kaW5nPSJpc0dyZWVuOmdyZWVuIgotICAgICAgICAgIC8vCi0g
ICAgICAgICAgLy8gaXMgY29udmVydGVkIHRvIHRoaXM6Ci0gICAgICAgICAgLy8KLSAgICAgICAg
ICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0iX3BhcmVudFZpZXcuY29udGV4dC5pc0dyZWVuOmdy
ZWVuIgotICAgICAgICAgIHZhciBwYXJzZWRQYXRoID0gRW1iZXIuVmlldy5fcGFyc2VQcm9wZXJ0
eVBhdGgoZnVsbCk7Ci0gICAgICAgICAgcGF0aCA9IHRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQ
YXRoKHBhcnNlZFBhdGgucGF0aCwgZGF0YSk7Ci0gICAgICAgICAgaWYgKHBhdGgpIHsgZXh0ZW5z
aW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXSA9IHBhdGggKyBwYXJzZWRQYXRoLmNsYXNzTmFtZXM7
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBFbWJlci4kLmV4dGVu
ZChoYXNoLCBleHRlbnNpb25zKTsKLSAgfSwKLQotICAvLyBUcmFuc2Zvcm0gYmluZGluZ3MgZnJv
bSB0aGUgY3VycmVudCBjb250ZXh0IHRvIGEgY29udGV4dCB0aGF0IGNhbiBiZSBldmFsdWF0ZWQg
d2l0aGluIHRoZSB2aWV3LgotICAvLyBSZXR1cm5zIG51bGwgaWYgdGhlIHBhdGggc2hvdWxkbid0
IGJlIGNoYW5nZWQuCi0gIC8vCi0gIC8vIFRPRE86IGNvbnNpZGVyIHRoZSBhZGRpdGlvbiBvZiBh
IHByZWZpeCB0aGF0IHdvdWxkIGFsbG93IHRoaXMgbWV0aG9kIHRvIHJldHVybiBgcGF0aGAuCi0g
IGNvbnRleHR1YWxpemVCaW5kaW5nUGF0aDogZnVuY3Rpb24ocGF0aCwgZGF0YSkgewotICAgIHZh
ciBub3JtYWxpemVkID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKG51bGwsIHBhdGgs
IGRhdGEpOwotICAgIGlmIChub3JtYWxpemVkLmlzS2V5d29yZCkgewotICAgICAgcmV0dXJuICd0
ZW1wbGF0ZURhdGEua2V5d29yZHMuJyArIHBhdGg7Ci0gICAgfSBlbHNlIGlmIChFbWJlci5pc0ds
b2JhbFBhdGgocGF0aCkpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gZWxzZSBpZiAocGF0
aCA9PT0gJ3RoaXMnIHx8IHBhdGggPT09ICcnKSB7Ci0gICAgICByZXR1cm4gJ19wYXJlbnRWaWV3
LmNvbnRleHQnOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRl
eHQuJyArIHBhdGg7Ci0gICAgfQotICB9LAotCi0gIGhlbHBlcjogZnVuY3Rpb24odGhpc0NvbnRl
eHQsIHBhdGgsIG9wdGlvbnMpIHsKLSAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwKLSAgICAg
ICAgZm4gPSBvcHRpb25zLmZuLAotICAgICAgICBuZXdWaWV3OwotCi0gICAgbWFrZUJpbmRpbmdz
KHRoaXNDb250ZXh0LCBvcHRpb25zKTsKLQotICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHBh
dGgpIHsKLQotICAgICAgLy8gVE9ETzogdGhpcyBpcyBhIGxhbWUgY29uZGl0aW9uYWwsIHRoaXMg
c2hvdWxkIGxpa2VseSBjaGFuZ2UKLSAgICAgIC8vIGJ1dCBzb21ldGhpbmcgYWxvbmcgdGhlc2Ug
bGluZXMgd2lsbCBsaWtlbHkgbmVlZCB0byBiZSBhZGRlZAotICAgICAgLy8gYXMgZGVwcmVjYXRp
b24gd2FybmluZ3MKLSAgICAgIC8vCi0gICAgICBpZiAob3B0aW9ucy50eXBlc1swXSA9PT0gJ1NU
UklORycgJiYgTE9XRVJDQVNFX0FfWi50ZXN0KHBhdGgpICYmICFWSUVXX1BSRUZJWC50ZXN0KHBh
dGgpKSB7Ci0gICAgICAgIEVtYmVyLmFzc2VydCgiVmlldyByZXF1aXJlcyBhIGNvbnRhaW5lciIs
ICEhZGF0YS52aWV3LmNvbnRhaW5lcik7Ci0gICAgICAgIG5ld1ZpZXcgPSBkYXRhLnZpZXcuY29u
dGFpbmVyLmxvb2t1cEZhY3RvcnkoJ3ZpZXc6JyArIHBhdGgpOwotICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgbmV3VmlldyA9IEVtYmVySGFuZGxlYmFycy5nZXQodGhpc0NvbnRleHQsIHBhdGgsIG9w
dGlvbnMpOwotICAgICAgfQotCi0gICAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIHZp
ZXcgYXQgcGF0aCAnIiArIHBhdGggKyAiJyIsICEhbmV3Vmlldyk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgIG5ld1ZpZXcgPSBwYXRoOwotICAgIH0KLQotICAgIEVtYmVyLmFzc2VydChFbWJlci5TdHJp
bmcuZm10KCdZb3UgbXVzdCBwYXNzIGEgdmlldyB0byB0aGUgI3ZpZXcgaGVscGVyLCBub3QgJUAg
KCVAKScsIFtwYXRoLCBuZXdWaWV3XSksIEVtYmVyLlZpZXcuZGV0ZWN0KG5ld1ZpZXcpIHx8IEVt
YmVyLlZpZXcuZGV0ZWN0SW5zdGFuY2UobmV3VmlldykpOwotCi0gICAgdmFyIHZpZXdPcHRpb25z
ID0gdGhpcy5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKG9wdGlvbnMsIHRoaXNDb250ZXh0KTsK
LSAgICB2YXIgY3VycmVudFZpZXcgPSBkYXRhLnZpZXc7Ci0gICAgdmlld09wdGlvbnMudGVtcGxh
dGVEYXRhID0gZGF0YTsKLSAgICB2YXIgbmV3Vmlld1Byb3RvID0gbmV3Vmlldy5wcm90byA/IG5l
d1ZpZXcucHJvdG8oKSA6IG5ld1ZpZXc7Ci0KLSAgICBpZiAoZm4pIHsKLSAgICAgIEVtYmVyLmFz
c2VydCgiWW91IGNhbm5vdCBwcm92aWRlIGEgdGVtcGxhdGUgYmxvY2sgaWYgeW91IGFsc28gc3Bl
Y2lmaWVkIGEgdGVtcGxhdGVOYW1lIiwgIWdldCh2aWV3T3B0aW9ucywgJ3RlbXBsYXRlTmFtZScp
ICYmICFnZXQobmV3Vmlld1Byb3RvLCAndGVtcGxhdGVOYW1lJykpOwotICAgICAgdmlld09wdGlv
bnMudGVtcGxhdGUgPSBmbjsKLSAgICB9Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gb3ZlcnJp
ZGUgdGhlIGBfY29udGV4dGAgY29tcHV0ZWQgcHJvcGVydHkgaWYgdGhlcmUgaXMKLSAgICAvLyBu
byBzcGVjaWZpZWQgY29udHJvbGxlci4gU2VlIFZpZXcjX2NvbnRleHQgZm9yIG1vcmUgaW5mb3Jt
YXRpb24uCi0gICAgaWYgKCFuZXdWaWV3UHJvdG8uY29udHJvbGxlciAmJiAhbmV3Vmlld1Byb3Rv
LmNvbnRyb2xsZXJCaW5kaW5nICYmICF2aWV3T3B0aW9ucy5jb250cm9sbGVyICYmICF2aWV3T3B0
aW9ucy5jb250cm9sbGVyQmluZGluZykgewotICAgICAgdmlld09wdGlvbnMuX2NvbnRleHQgPSB0
aGlzQ29udGV4dDsKLSAgICB9Ci0KLSAgICBjdXJyZW50Vmlldy5hcHBlbmRDaGlsZChuZXdWaWV3
LCB2aWV3T3B0aW9ucyk7Ci0gIH0KLX0pOwotCi0vKioKLSAgYHt7dmlld319YCBpbnNlcnRzIGEg
bmV3IGluc3RhbmNlIG9mIGBFbWJlci5WaWV3YCBpbnRvIGEgdGVtcGxhdGUgcGFzc2luZyBpdHMK
LSAgb3B0aW9ucyB0byB0aGUgYEVtYmVyLlZpZXdgJ3MgYGNyZWF0ZWAgbWV0aG9kIGFuZCB1c2lu
ZyB0aGUgc3VwcGxpZWQgYmxvY2sgYXMKLSAgdGhlIHZpZXcncyBvd24gdGVtcGxhdGUuCi0KLSAg
QW4gZW1wdHkgYDxib2R5PmAgYW5kIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFu
ZGxlYmFycwotICBBIHNwYW46Ci0gIHt7I3ZpZXcgdGFnTmFtZT0ic3BhbiJ9fQotICAgIGhlbGxv
LgotICB7ey92aWV3fX0KLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6
Ci0KLSAgYGBgaHRtbAotICA8Ym9keT4KLSAgICA8IS0tIE5vdGU6IHRoZSBoYW5kbGViYXJzIHRl
bXBsYXRlIHNjcmlwdAotICAgICAgICAgYWxzbyByZXN1bHRzIGluIGEgcmVuZGVyZWQgRW1iZXIu
VmlldwotICAgICAgICAgd2hpY2ggaXMgdGhlIG91dGVyIDxkaXY+IGhlcmUgLS0+Ci0KLSAgICA8
ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgIEEgc3BhbjoKLSAgICAgIDxzcGFuIGlkPSJl
bWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICAgICAgSGVsbG8uCi0gICAgICA8L3NwYW4+
Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLSAgYGBgCi0KLSAgIyMjIGBwYXJlbnRWaWV3YCBzZXR0
aW5nCi0KLSAgVGhlIGBwYXJlbnRWaWV3YCBwcm9wZXJ0eSBvZiB0aGUgbmV3IGBFbWJlci5WaWV3
YCBpbnN0YW5jZSBjcmVhdGVkIHRocm91Z2gKLSAgYHt7dmlld319YCB3aWxsIGJlIHNldCB0byB0
aGUgYEVtYmVyLlZpZXdgIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSB3aGVyZQotICBge3t2aWV3
fX1gIHdhcyBjYWxsZWQuCi0KLSAgYGBgamF2YXNjcmlwdAotICBhVmlldyA9IEVtYmVyLlZpZXcu
Y3JlYXRlKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJ7eyN2aWV3
fX0gbXkgcGFyZW50OiB7e3BhcmVudFZpZXcuZWxlbWVudElkfX0ge3svdmlld319IikKLSAgfSk7
Ci0KLSAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAgV2lsbCByZXN1bHQgaW4g
SFRNTCBzdHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJl
bWJlci12aWV3Ij4KLSAgICA8ZGl2IGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12aWV3Ij4KLSAg
ICAgIG15IHBhcmVudDogZW1iZXIxCi0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAj
IyMgU2V0dGluZyBDU1MgaWQgYW5kIGNsYXNzIGF0dHJpYnV0ZXMKLQotICBUaGUgSFRNTCBgaWRg
IGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1l
bnQgd2l0aAotICB0aGUgYGlkYCBvcHRpb24uIFRoaXMgb3B0aW9uIHdpbGwgX25vdF8gYmUgcGFz
c2VkIHRvIGBFbWJlci5WaWV3LmNyZWF0ZWAuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyN2aWV3
IHRhZ05hbWU9InNwYW4iIGlkPSJhLWN1c3RvbS1pZCJ9fQotICAgIGhlbGxvLgotICB7ey92aWV3
fX0KLSAgYGBgCi0KLSAgUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlOgot
Ci0gIGBgYGh0bWwKLSAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPHNwYW4gaWQ9ImEt
Y3VzdG9tLWlkIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgICBoZWxsby4KLSAgICA8L3NwYW4+
Ci0gIDwvZGl2PgotICBgYGAKLQotICBUaGUgSFRNTCBgY2xhc3NgIGF0dHJpYnV0ZSBjYW4gYmUg
c2V0IG9uIHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQKLSAgd2l0aCB0aGUgYGNs
YXNzYCBvciBgY2xhc3NOYW1lQmluZGluZ3NgIG9wdGlvbnMuIFRoZSBgY2xhc3NgIG9wdGlvbiB3
aWxsCi0gIGRpcmVjdGx5IHNldCB0aGUgQ1NTIGBjbGFzc2AgYXR0cmlidXRlIGFuZCB3aWxsIG5v
dCBiZSBwYXNzZWQgdG8KLSAgYEVtYmVyLlZpZXcuY3JlYXRlYC4gYGNsYXNzTmFtZUJpbmRpbmdz
YCB3aWxsIGJlIHBhc3NlZCB0byBgY3JlYXRlYCBhbmQgdXNlCi0gIGBFbWJlci5WaWV3YCdzIGNs
YXNzIG5hbWUgYmluZGluZyBmdW5jdGlvbmFsaXR5OgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sj
dmlldyB0YWdOYW1lPSJzcGFuIiBjbGFzcz0iYS1jdXN0b20tY2xhc3MifX0KLSAgICBoZWxsby4K
LSAge3svdmlld319Ci0gIGBgYAotCi0gIFJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0
cnVjdHVyZToKLQotICBgYGBodG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxz
cGFuIGlkPSJlbWJlcjIiIGNsYXNzPSJlbWJlci12aWV3IGEtY3VzdG9tLWNsYXNzIj4KLSAgICAg
IGhlbGxvLgotICAgIDwvc3Bhbj4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gICMjIyBTdXBwbHlpbmcg
YSBkaWZmZXJlbnQgdmlldyBjbGFzcwotCi0gIGB7e3ZpZXd9fWAgY2FuIHRha2UgYW4gb3B0aW9u
YWwgZmlyc3QgYXJndW1lbnQgYmVmb3JlIGl0cyBzdXBwbGllZCBvcHRpb25zIHRvCi0gIHNwZWNp
ZnkgYSBwYXRoIHRvIGEgY3VzdG9tIHZpZXcgY2xhc3MuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7
eyN2aWV3ICJNeUFwcC5DdXN0b21WaWV3In19Ci0gICAgaGVsbG8uCi0gIHt7L3ZpZXd9fQotICBg
YGAKLQotICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGFsc28gYmUgYSByZWxhdGl2ZSBwYXRoIGFj
Y2Vzc2libGUgZnJvbSB0aGUgY3VycmVudAotICBjb250ZXh0LgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgTXlBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoe30pOwotICBNeUFwcC5PdXRlclZp
ZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgaW5uZXJWaWV3Q2xhc3M6IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGNsYXNzTmFtZXM6IFsnYS1jdXN0b20tdmlldy1jbGFzcy1hcy1wcm9w
ZXJ0eSddCi0gICAgfSksCi0gICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgn
e3sjdmlldyAidmlldy5pbm5lclZpZXdDbGFzcyJ9fSBoaSB7ey92aWV3fX0nKQotICB9KTsKLQot
ICBNeUFwcC5PdXRlclZpZXcuY3JlYXRlKCkuYXBwZW5kVG8oJ2JvZHknKTsKLSAgYGBgCi0KLSAg
V2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPGRpdiBp
ZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBpZD0iZW1iZXIyIiBjbGFz
cz0iZW1iZXItdmlldyBhLWN1c3RvbS12aWV3LWNsYXNzLWFzLXByb3BlcnR5Ij4KLSAgICAgIGhp
Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMgQmxvY2tsZXNzIHVzZQotCi0g
IElmIHlvdSBzdXBwbHkgYSBjdXN0b20gYEVtYmVyLlZpZXdgIHN1YmNsYXNzIHRoYXQgc3BlY2lm
aWVzIGl0cyBvd24gdGVtcGxhdGUKLSAgb3IgcHJvdmlkZSBhIGB0ZW1wbGF0ZU5hbWVgIG9wdGlv
biB0byBge3t2aWV3fX1gIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQKLSAgc3VwcGx5aW5nIGEgYmxv
Y2suIEF0dGVtcHRzIHRvIHVzZSBib3RoIGEgYHRlbXBsYXRlTmFtZWAgb3B0aW9uIGFuZCBzdXBw
bHkgYQotICBibG9jayB3aWxsIHRocm93IGFuIGVycm9yLgotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
e3t2aWV3ICJNeUFwcC5WaWV3V2l0aEFUZW1wbGF0ZURlZmluZWQifX0KLSAgYGBgCi0KLSAgIyMj
IGB2aWV3TmFtZWAgcHJvcGVydHkKLQotICBZb3UgY2FuIHN1cHBseSBhIGB2aWV3TmFtZWAgb3B0
aW9uIHRvIGB7e3ZpZXd9fWAuIFRoZSBgRW1iZXIuVmlld2AgaW5zdGFuY2UKLSAgd2lsbCBiZSBy
ZWZlcmVuY2VkIGFzIGEgcHJvcGVydHkgb2YgaXRzIHBhcmVudCB2aWV3IGJ5IHRoaXMgbmFtZS4K
LQotICBgYGBqYXZhc2NyaXB0Ci0gIGFWaWV3ID0gRW1iZXIuVmlldy5jcmVhdGUoewotICAgIHRl
bXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ3t7I3ZpZXcgdmlld05hbWU9ImFDaGls
ZEJ5TmFtZSJ9fSBoaSB7ey92aWV3fX0nKQotICB9KTsKLQotICBhVmlldy5hcHBlbmRUbygnYm9k
eScpOwotICBhVmlldy5nZXQoJ2FDaGlsZEJ5TmFtZScpIC8vIHRoZSBpbnN0YW5jZSBvZiBFbWJl
ci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3fX0gaGVscGVyCi0gIGBgYAotCi0gIEBtZXRob2Qgdmll
dwotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gcGF0
aAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmlu
ZwotKi8KLUVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigndmlldycsIGZ1bmN0aW9uIHZp
ZXdIZWxwZXIocGF0aCwgb3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoIlRoZSB2aWV3IGhlbHBl
ciBvbmx5IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IiwgYXJndW1lbnRzLmxlbmd0aCA8PSAyKTsK
LQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlv
bnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7
Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0aCA9ICJFbWJlci5WaWV3IjsKLSAgfQotCi0g
IHJldHVybiBFbWJlckhhbmRsZWJhcnMuVmlld0hlbHBlci5oZWxwZXIodGhpcywgcGF0aCwgb3B0
aW9ucyk7Ci19KTsKLQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLy8gVE9ETzogRG9u
J3QgcmVxdWlyZSBhbGwgb2YgdGhpcyBtb2R1bGUKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1v
ZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBoYW5kbGVi
YXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Ci0K
LS8qKgotICBge3tjb2xsZWN0aW9ufX1gIGlzIGEgYEVtYmVyLkhhbmRsZWJhcnNgIGhlbHBlciBm
b3IgYWRkaW5nIGluc3RhbmNlcyBvZgotICBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIHRvIGEgdGVt
cGxhdGUuIFNlZSBbRW1iZXIuQ29sbGVjdGlvblZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5Db2xs
ZWN0aW9uVmlldy5odG1sKQotICAgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gaG93IGEg
YENvbGxlY3Rpb25WaWV3YCBmdW5jdGlvbnMuCi0KLSAgYHt7Y29sbGVjdGlvbn19YCdzIHByaW1h
cnkgdXNlIGlzIGFzIGEgYmxvY2sgaGVscGVyIHdpdGggYSBgY29udGVudEJpbmRpbmdgCi0gIG9w
dGlvbiBwb2ludGluZyB0b3dhcmRzIGFuIGBFbWJlci5BcnJheWAtY29tcGF0aWJsZSBvYmplY3Qu
IEFuIGBFbWJlci5WaWV3YAotICBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaXRl
bSBpbiBpdHMgYGNvbnRlbnRgIHByb3BlcnR5LiBFYWNoIHZpZXcKLSAgd2lsbCBoYXZlIGl0cyBv
d24gYGNvbnRlbnRgIHByb3BlcnR5IHNldCB0byB0aGUgYXBwcm9wcmlhdGUgaXRlbSBpbiB0aGUK
LSAgY29sbGVjdGlvbi4KLQotICBUaGUgcHJvdmlkZWQgYmxvY2sgd2lsbCBiZSBhcHBsaWVkIGFz
IHRoZSB0ZW1wbGF0ZSBmb3IgZWFjaCBpdGVtJ3Mgdmlldy4KLQotICBHaXZlbiBhbiBlbXB0eSBg
PGJvZHk+YCB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sj
Y29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNv
bnRlbnQubmFtZX19Ci0gIHt7L2NvbGxlY3Rpb259fQotICBgYGAKLQotICBBbmQgdGhlIGZvbGxv
d2luZyBhcHBsaWNhdGlvbiBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAgPSBFbWJlci5B
cHBsaWNhdGlvbi5jcmVhdGUoKQotICBBcHAuaXRlbXMgPSBbCi0gICAgRW1iZXIuT2JqZWN0LmNy
ZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01h
cnknfSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKLSAgXQotICBg
YGAKLQotICBXaWxsIHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKLQotICBgYGBo
dG1sCi0gIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZp
ZXciPkhpIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBNYXJ5PC9k
aXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+SGkgU2FyYTwvZGl2PgotICA8L2Rpdj4K
LSAgYGBgCi0KLSAgIyMjIEJsb2NrbGVzcyBVc2UKLQotICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRl
bVZpZXdDbGFzc2Agb3B0aW9uIHRoYXQgaGFzIGl0cyBvd24gYHRlbXBsYXRlYCB5b3UgY2FuCi0g
IG9taXQgdGhlIGJsb2NrLgotCi0gIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6Ci0KLSAgYGBgaGFu
ZGxlYmFycwotICB7e2NvbGxlY3Rpb24gY29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyIgaXRlbVZp
ZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXcifX0KLSAgYGBgCi0KLSAgQW5kIGFwcGxpY2F0aW9uIGNv
ZGUKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgp
OwotICBBcHAuaXRlbXMgPSBbCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUn
fSksCi0gICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01hcnknfSksCi0gICAgRW1iZXIu
T2JqZWN0LmNyZWF0ZSh7bmFtZTogJ1NhcmEnfSkKLSAgXTsKLQotICBBcHAuQW5JdGVtVmlldyA9
IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w
aWxlKCJHcmVldGluZ3Mge3t2aWV3LmNvbnRlbnQubmFtZX19IikKLSAgfSk7Ci0gIGBgYAotCi0g
IFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBiZWxvdwotCi0gIGBgYGh0bWwKLSAg
PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3Jl
ZXRpbmdzIERhdmU8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3Mg
TWFyeTwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBTYXJhPC9k
aXY+Ci0gIDwvZGl2PgotICBgYGAKLQotICAjIyMgU3BlY2lmeWluZyBhIENvbGxlY3Rpb25WaWV3
IHN1YmNsYXNzCi0KLSAgQnkgZGVmYXVsdCB0aGUgYHt7Y29sbGVjdGlvbn19YCBoZWxwZXIgd2ls
bCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YC4gWW91IGNh
biBzdXBwbHkgYSBgRW1iZXIuQ29sbGVjdGlvblZpZXdgIHN1YmNsYXNzIHRvCi0gIHRoZSBoZWxw
ZXIgYnkgcGFzc2luZyBpdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQ6Ci0KLSAgYGBgaGFuZGxlYmFy
cwotICB7eyNjb2xsZWN0aW9uIEFwcC5NeUN1c3RvbUNvbGxlY3Rpb25DbGFzcyBjb250ZW50Qmlu
ZGluZz0iQXBwLml0ZW1zIn19Ci0gICAgSGkge3t2aWV3LmNvbnRlbnQubmFtZX19Ci0gIHt7L2Nv
bGxlY3Rpb259fQotICBgYGAKLQotICAjIyMgRm9yd2FyZGVkIGBpdGVtLipgLW5hbWVkIE9wdGlv
bnMKLQotICBBcyB3aXRoIHRoZSBge3t2aWV3fX1gLCBoZWxwZXIgb3B0aW9ucyBwYXNzZWQgdG8g
dGhlIGB7e2NvbGxlY3Rpb259fWAgd2lsbCBiZQotICBzZXQgb24gdGhlIHJlc3VsdGluZyBgRW1i
ZXIuQ29sbGVjdGlvblZpZXdgIGFzIHByb3BlcnRpZXMuIEFkZGl0aW9uYWxseSwKLSAgb3B0aW9u
cyBwcmVmaXhlZCB3aXRoIGBpdGVtYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHZpZXdzIHJlbmRl
cmVkIGZvciBlYWNoCi0gIGl0ZW0gKG5vdGUgdGhlIGNhbWVsY2FzaW5nKToKLQotICBgYGBoYW5k
bGViYXJzCi0gIHt7I2NvbGxlY3Rpb24gY29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyIKLSAgICAg
ICAgICAgICAgICBpdGVtVGFnTmFtZT0icCIKLSAgICAgICAgICAgICAgICBpdGVtQ2xhc3NOYW1l
cz0iZ3JlZXRpbmcifX0KLSAgICBIb3dkeSB7e3ZpZXcuY29udGVudC5uYW1lfX0KLSAge3svY29s
bGVjdGlvbn19Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCBz
dHJ1Y3R1cmU6Ci0KLSAgYGBgaHRtbAotICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4KLSAgICA8
cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgRGF2ZTwvcD4KLSAgICA8cCBjbGFz
cz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgTWFyeTwvcD4KLSAgICA8cCBjbGFzcz0iZW1i
ZXItdmlldyBncmVldGluZyI+SG93ZHkgU2FyYTwvcD4KLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEBt
ZXRob2QgY29sbGVjdGlvbgotICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFy
YW0ge1N0cmluZ30gcGF0aAotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJldHVybiB7U3Ry
aW5nfSBIVE1MIHN0cmluZwotICBAZGVwcmVjYXRlZCBVc2UgYHt7ZWFjaH19YCBoZWxwZXIgaW5z
dGVhZC4KLSovCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdjb2xsZWN0aW9uJywg
ZnVuY3Rpb24gY29sbGVjdGlvbkhlbHBlcihwYXRoLCBvcHRpb25zKSB7Ci0gIEVtYmVyLmRlcHJl
Y2F0ZSgiVXNpbmcgdGhlIHt7Y29sbGVjdGlvbn19IGhlbHBlciB3aXRob3V0IHNwZWNpZnlpbmcg
YSBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIHRoZSB7e2VhY2h9fSBoZWxwZXIgbm93IHN1
cHBvcnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuIiwgcGF0aCAhPT0gJ2NvbGxlY3Rpb24nKTsK
LQotICAvLyBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlv
bnMuCi0gIGlmIChwYXRoICYmIHBhdGguZGF0YSAmJiBwYXRoLmRhdGEuaXNSZW5kZXJEYXRhKSB7
Ci0gICAgb3B0aW9ucyA9IHBhdGg7Ci0gICAgcGF0aCA9IHVuZGVmaW5lZDsKLSAgICBFbWJlci5h
c3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIHRoZSBjb2xs
ZWN0aW9uIGhlbHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpOwotICB9IGVsc2UgewotICAg
IEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8g
dGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7Ci0gIH0KLQot
ICB2YXIgZm4gPSBvcHRpb25zLmZuOwotICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTsKLSAgdmFy
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0gIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZp
ZXc7Ci0KLSAgLy8gSWYgcGFzc2VkIGEgcGF0aCBzdHJpbmcsIGNvbnZlcnQgdGhhdCBpbnRvIGFu
IG9iamVjdC4KLSAgLy8gT3RoZXJ3aXNlLCBqdXN0IGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNs
YXNzLgotICB2YXIgY29sbGVjdGlvbkNsYXNzOwotICBjb2xsZWN0aW9uQ2xhc3MgPSBwYXRoID8g
aGFuZGxlYmFyc0dldCh0aGlzLCBwYXRoLCBvcHRpb25zKSA6IEVtYmVyLkNvbGxlY3Rpb25WaWV3
OwotICBFbWJlci5hc3NlcnQoZm10KCIlQCAjY29sbGVjdGlvbjogQ291bGQgbm90IGZpbmQgY29s
bGVjdGlvbiBjbGFzcyAlQCIsIFtkYXRhLnZpZXcsIHBhdGhdKSwgISFjb2xsZWN0aW9uQ2xhc3Mp
OwotCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLCBpdGVtSGFzaCA9IHt9LCBtYXRjaDsKLQot
ICAvLyBFeHRyYWN0IGl0ZW0gdmlldyBjbGFzcyBpZiBwcm92aWRlZCBlbHNlIGRlZmF1bHQgdG8g
dGhlIHN0YW5kYXJkIGNsYXNzCi0gIHZhciBjb2xsZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlv
bkNsYXNzLnByb3RvKCksCi0gICAgICBpdGVtVmlld0NsYXNzOwotCi0gIGlmIChoYXNoLml0ZW1W
aWV3KSB7Ci0gICAgdmFyIGNvbnRyb2xsZXIgPSBkYXRhLmtleXdvcmRzLmNvbnRyb2xsZXI7Ci0g
ICAgRW1iZXIuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVkIGFuIGl0ZW1WaWV3LCBidXQgdGhlIGN1cnJl
bnQgY29udGV4dCBoYXMgbm8gJyArCi0gICAgICAgICAgICAgICAgICdjb250YWluZXIgdG8gbG9v
ayB0aGUgaXRlbVZpZXcgdXAgaW4uIFRoaXMgcHJvYmFibHkgbWVhbnMgJyArCi0gICAgICAgICAg
ICAgICAgICd0aGF0IHlvdSBjcmVhdGVkIGEgdmlldyBtYW51YWxseSwgaW5zdGVhZCBvZiB0aHJv
dWdoIHRoZSAnICsKLSAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lci4gSW5zdGVhZCwgdXNlIGNv
bnRhaW5lci5sb29rdXAoInZpZXc6dmlld05hbWUiKSwgJyArCi0gICAgICAgICAgICAgICAgICd3
aGljaCB3aWxsIHByb3Blcmx5IGluc3RhbnRpYXRlIHlvdXIgdmlldy4nLAotICAgICAgICAgICAg
ICAgICBjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuY29udGFpbmVyKTsKLSAgICB2YXIgY29udGFp
bmVyID0gY29udHJvbGxlci5jb250YWluZXI7Ci0gICAgaXRlbVZpZXdDbGFzcyA9IGNvbnRhaW5l
ci5yZXNvbHZlKCd2aWV3OicgKyBoYXNoLml0ZW1WaWV3KTsKLSAgICBFbWJlci5hc3NlcnQoJ1lv
dSBzcGVjaWZpZWQgdGhlIGl0ZW1WaWV3ICcgKyBoYXNoLml0ZW1WaWV3ICsgIiwgYnV0IGl0IHdh
cyAiICsKLSAgICAgICAgICAgICAgICAgIm5vdCBmb3VuZCBhdCAiICsgY29udGFpbmVyLmRlc2Ny
aWJlKCJ2aWV3OiIgKyBoYXNoLml0ZW1WaWV3KSArCi0gICAgICAgICAgICAgICAgICIgKGFuZCBp
dCB3YXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGNvbnRhaW5lcikiLCAhIWl0ZW1WaWV3Q2xhc3Mp
OwotICB9IGVsc2UgaWYgKGhhc2guaXRlbVZpZXdDbGFzcykgewotICAgIGl0ZW1WaWV3Q2xhc3Mg
PSBoYW5kbGViYXJzR2V0KGNvbGxlY3Rpb25Qcm90b3R5cGUsIGhhc2guaXRlbVZpZXdDbGFzcywg
b3B0aW9ucyk7Ci0gIH0gZWxzZSB7Ci0gICAgaXRlbVZpZXdDbGFzcyA9IGNvbGxlY3Rpb25Qcm90
b3R5cGUuaXRlbVZpZXdDbGFzczsKLSAgfQotCi0gIEVtYmVyLmFzc2VydChmbXQoIiVAICNjb2xs
ZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVtVmlld0NsYXNzICVAIiwgW2RhdGEudmlldywgaXRl
bVZpZXdDbGFzc10pLCAhIWl0ZW1WaWV3Q2xhc3MpOwotCi0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3
Q2xhc3M7Ci0gIGRlbGV0ZSBoYXNoLml0ZW1WaWV3OwotCi0gIC8vIEdvIHRocm91Z2ggb3B0aW9u
cyBwYXNzZWQgdG8gdGhlIHt7Y29sbGVjdGlvbn19IGhlbHBlciBhbmQgZXh0cmFjdCBvcHRpb25z
Ci0gIC8vIHRoYXQgY29uZmlndXJlIGl0ZW0gdmlld3MgaW5zdGVhZCBvZiB0aGUgY29sbGVjdGlv
biBpdHNlbGYuCi0gIGZvciAodmFyIHByb3AgaW4gaGFzaCkgewotICAgIGlmIChoYXNoLmhhc093
blByb3BlcnR5KHByb3ApKSB7Ci0gICAgICBtYXRjaCA9IHByb3AubWF0Y2goL15pdGVtKC4pKC4q
KSQvKTsKLQotICAgICAgaWYgKG1hdGNoICYmIHByb3AgIT09ICdpdGVtQ29udHJvbGxlcicpIHsK
LSAgICAgICAgLy8gQ29udmVydCBpdGVtU2hvdWxkRm9vIC0+IHNob3VsZEZvbwotICAgICAgICBp
dGVtSGFzaFttYXRjaFsxXS50b0xvd2VyQ2FzZSgpICsgbWF0Y2hbMl1dID0gaGFzaFtwcm9wXTsK
LSAgICAgICAgLy8gRGVsZXRlIGZyb20gaGFzaCBhcyB0aGlzIHdpbGwgZW5kIHVwIGdldHRpbmcg
cGFzc2VkIHRvIHRoZQotICAgICAgICAvLyB7e3ZpZXd9fSBoZWxwZXIgbWV0aG9kLgotICAgICAg
ICBkZWxldGUgaGFzaFtwcm9wXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZm4pIHsK
LSAgICBpdGVtSGFzaC50ZW1wbGF0ZSA9IGZuOwotICAgIGRlbGV0ZSBvcHRpb25zLmZuOwotICB9
Ci0KLSAgdmFyIGVtcHR5Vmlld0NsYXNzOwotICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlICE9PSBF
bWJlci5IYW5kbGViYXJzLlZNLm5vb3ApIHsKLSAgICBlbXB0eVZpZXdDbGFzcyA9IGdldChjb2xs
ZWN0aW9uUHJvdG90eXBlLCAnZW1wdHlWaWV3Q2xhc3MnKTsKLSAgICBlbXB0eVZpZXdDbGFzcyA9
IGVtcHR5Vmlld0NsYXNzLmV4dGVuZCh7Ci0gICAgICAgICAgdGVtcGxhdGU6IGludmVyc2UsCi0g
ICAgICAgICAgdGFnTmFtZTogaXRlbUhhc2gudGFnTmFtZQotICAgIH0pOwotICB9IGVsc2UgaWYg
KGhhc2guZW1wdHlWaWV3Q2xhc3MpIHsKLSAgICBlbXB0eVZpZXdDbGFzcyA9IGhhbmRsZWJhcnNH
ZXQodGhpcywgaGFzaC5lbXB0eVZpZXdDbGFzcywgb3B0aW9ucyk7Ci0gIH0KLSAgaWYgKGVtcHR5
Vmlld0NsYXNzKSB7IGhhc2guZW1wdHlWaWV3ID0gZW1wdHlWaWV3Q2xhc3M7IH0KLQotICBpZiAo
IWhhc2gua2V5d29yZCkgewotICAgIGl0ZW1IYXNoLl9jb250ZXh0ID0gRW1iZXIuY29tcHV0ZWQu
YWxpYXMoJ2NvbnRlbnQnKTsKLSAgfQotCi0gIHZhciB2aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRs
ZWJhcnMuVmlld0hlbHBlci5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKHsgZGF0YTogZGF0YSwg
aGFzaDogaXRlbUhhc2ggfSwgdGhpcyk7Ci0gIGhhc2guaXRlbVZpZXdDbGFzcyA9IGl0ZW1WaWV3
Q2xhc3MuZXh0ZW5kKHZpZXdPcHRpb25zKTsKLQotICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBjb2xsZWN0aW9uQ2xhc3MsIG9wdGlvbnMpOwotfSk7Ci0K
LQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qZ2xvYmFscyBIYW5kbGViYXJzICovCi0v
KioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFy
IGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldDsKLQotLyoqCi0gIGB1bmJvdW5k
YCBhbGxvd3MgeW91IHRvIG91dHB1dCBhIHByb3BlcnR5IHdpdGhvdXQgYmluZGluZy4gKkltcG9y
dGFudDoqIFRoZQotICBvdXRwdXQgd2lsbCBub3QgYmUgdXBkYXRlZCBpZiB0aGUgcHJvcGVydHkg
Y2hhbmdlcy4gVXNlIHdpdGggY2F1dGlvbi4KLQotICBgYGBoYW5kbGViYXJzCi0gIDxkaXY+e3t1
bmJvdW5kIHNvbWVQcm9wZXJ0eVRoYXREb2VzbnRDaGFuZ2V9fTwvZGl2PgotICBgYGAKLQotICBg
dW5ib3VuZGAgY2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgYm91bmQgaGVs
cGVyIHRvCi0gIHJlbmRlciBpdCBpbiBpdHMgdW5ib3VuZCBmb3JtOgotCi0gIGBgYGhhbmRsZWJh
cnMKLSAgPGRpdj57e3VuYm91bmQgaGVscGVyTmFtZSBzb21lUHJvcGVydHlUaGF0RG9lc250Q2hh
bmdlfX08L2Rpdj4KLSAgYGBgCi0KLSAgQG1ldGhvZCB1bmJvdW5kCi0gIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCi0gIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQotICBAcmV0dXJuIHtT
dHJpbmd9IEhUTUwgc3RyaW5nCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign
dW5ib3VuZCcsIGZ1bmN0aW9uIHVuYm91bmRIZWxwZXIocHJvcGVydHksIGZuKSB7Ci0gIHZhciBv
cHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSwgaGVscGVyLCBjb250ZXh0
LCBvdXQ7Ci0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7Ci0gICAgLy8gVW5ib3VuZCBo
ZWxwZXIgY2FsbC4KLSAgICBvcHRpb25zLmRhdGEuaXNVbmJvdW5kID0gdHJ1ZTsKLSAgICBoZWxw
ZXIgPSBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnNbYXJndW1lbnRzWzBdXSB8fCBFbWJlci5IYW5k
bGViYXJzLmhlbHBlcnMuaGVscGVyTWlzc2luZzsKLSAgICBvdXQgPSBoZWxwZXIuYXBwbHkodGhp
cywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7Ci0gICAgZGVsZXRl
IG9wdGlvbnMuZGF0YS5pc1VuYm91bmQ7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIGNvbnRl
eHQgPSAoZm4uY29udGV4dHMgJiYgZm4uY29udGV4dHMubGVuZ3RoKSA/IGZuLmNvbnRleHRzWzBd
IDogdGhpczsKLSAgcmV0dXJuIGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcHJvcGVydHksIGZuKTsK
LX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypqc2hpbnQgZGVidWc6dHJ1ZSov
Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0
LCBub3JtYWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoOwotCi0vKioK
LSAgYGxvZ2AgYWxsb3dzIHlvdSB0byBvdXRwdXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgaW4g
dGhlIGN1cnJlbnQgcmVuZGVyaW5nCi0gIGNvbnRleHQuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7
e2xvZyBteVZhcmlhYmxlfX0KLSAgYGBgCi0KLSAgQG1ldGhvZCBsb2cKLSAgQGZvciBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5Ci0qLwotRW1iZXIu
SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gbG9nSGVscGVyKHByb3Bl
cnR5LCBvcHRpb25zKSB7Ci0gIHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0
aW9ucy5jb250ZXh0cy5sZW5ndGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXMsCi0gICAg
ICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucy5k
YXRhKSwKLSAgICAgIHBhdGhSb290ID0gbm9ybWFsaXplZC5yb290LAotICAgICAgcGF0aCA9IG5v
cm1hbGl6ZWQucGF0aCwKLSAgICAgIHZhbHVlID0gKHBhdGggPT09ICd0aGlzJykgPyBwYXRoUm9v
dCA6IGhhbmRsZWJhcnNHZXQocGF0aFJvb3QsIHBhdGgsIG9wdGlvbnMpOwotICBFbWJlci5Mb2dn
ZXIubG9nKHZhbHVlKTsKLX0pOwotCi0vKioKLSAgRXhlY3V0ZSB0aGUgYGRlYnVnZ2VyYCBzdGF0
ZW1lbnQgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KLQotICBgYGBoYW5kbGViYXJzCi0gIHt7ZGVi
dWdnZXJ9fQotICBgYGAKLQotICBCZWZvcmUgaW52b2tpbmcgdGhlIGBkZWJ1Z2dlcmAgc3RhdGVt
ZW50LCB0aGVyZQotICBhcmUgYSBmZXcgaGVscGZ1bCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUK
LSAgYm9keSBvZiB0aGlzIGhlbHBlciB0aGF0IHlvdSBjYW4gaW5zcGVjdCB3aGlsZQotICBkZWJ1
Z2dpbmcgdGhhdCBkZXNjcmliZSBob3cgYW5kIHdoZXJlIHRoaXMKLSAgaGVscGVyIHdhcyBpbnZv
a2VkOgotCi0gIC0gdGVtcGxhdGVDb250ZXh0OiB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgY29udHJv
bGxlcgotICAgIGZyb20gd2hpY2ggdGhpcyB0ZW1wbGF0ZSBsb29rcyB1cCAvIGRpc3BsYXlzIHBy
b3BlcnRpZXMKLSAgLSB0eXBlT2ZUZW1wbGF0ZUNvbnRleHQ6IGEgc3RyaW5nIGRlc2NyaXB0aW9u
IG9mCi0gICAgd2hhdCB0aGUgdGVtcGxhdGVDb250ZXh0IGlzCi0KLSAgRm9yIGV4YW1wbGUsIGlm
IHlvdSdyZSB3b25kZXJpbmcgd2h5IGEgdmFsdWUgYHt7Zm9vfX1gCi0gIGlzbid0IHJlbmRlcmlu
ZyBhcyBleHBlY3RlZCB3aXRoaW4gYSB0ZW1wbGF0ZSwgeW91Ci0gIGNvdWxkIHBsYWNlIGEgYHt7
ZGVidWdnZXJ9fWAgc3RhdGVtZW50LCBhbmQgd2hlbgotICB0aGUgYGRlYnVnZ2VyO2AgYnJlYWtw
b2ludCBpcyBoaXQsIHlvdSBjYW4gaW5zcGVjdAotICBgdGVtcGxhdGVDb250ZXh0YCwgZGV0ZXJt
aW5lIGlmIGl0J3MgdGhlIG9iamVjdCB5b3UKLSAgZXhwZWN0LCBhbmQvb3IgZXZhbHVhdGUgZXhw
cmVzc2lvbnMgaW4gdGhlIGNvbnNvbGUKLSAgdG8gcGVyZm9ybSBwcm9wZXJ0eSBsb29rdXBzIG9u
IHRoZSBgdGVtcGxhdGVDb250ZXh0YDoKLQotICBgYGAKLSAgICA+IHRlbXBsYXRlQ29udGV4dC5n
ZXQoJ2ZvbycpIC8vIC0+ICI8dmFsdWUgb2Yge3tmb299fT4iCi0gIGBgYAotCi0gIEBtZXRob2Qg
ZGVidWdnZXIKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJp
bmd9IHByb3BlcnR5Ci0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignZGVidWdn
ZXInLCBmdW5jdGlvbiBkZWJ1Z2dlckhlbHBlcihvcHRpb25zKSB7Ci0KLSAgLy8gVGhlc2UgYXJl
IGhlbHBmdWwgdmFsdWVzIHlvdSBjYW4gaW5zcGVjdCB3aGlsZSBkZWJ1Z2dpbmcuCi0gIHZhciB0
ZW1wbGF0ZUNvbnRleHQgPSB0aGlzOwotICB2YXIgdHlwZU9mVGVtcGxhdGVDb250ZXh0ID0gRW1i
ZXIuaW5zcGVjdCh0ZW1wbGF0ZUNvbnRleHQpOwotCi0gIGRlYnVnZ2VyOwotfSk7Ci0KLQotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLQotRW1iZXIuSGFuZGxlYmFycy5FYWNoVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3
LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoLCB7Ci0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBpdGVtQ29udHJvbGxlciA9IGdldCh0aGlzLCAnaXRlbUNvbnRyb2xsZXInKTsKLSAgICB2YXIg
YmluZGluZzsKLQotICAgIGlmIChpdGVtQ29udHJvbGxlcikgewotICAgICAgdmFyIGNvbnRyb2xs
ZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXIuY29udGFpbmVyJykubG9va3VwRmFjdG9yeSgnY29u
dHJvbGxlcjphcnJheScpLmNyZWF0ZSh7Ci0gICAgICAgIHBhcmVudENvbnRyb2xsZXI6IGdldCh0
aGlzLCAnY29udHJvbGxlcicpLAotICAgICAgICBpdGVtQ29udHJvbGxlcjogaXRlbUNvbnRyb2xs
ZXIsCi0gICAgICAgIHRhcmdldDogZ2V0KHRoaXMsICdjb250cm9sbGVyJyksCi0gICAgICAgIF9l
YWNoVmlldzogdGhpcwotICAgICAgfSk7Ci0KLSAgICAgIHRoaXMuZGlzYWJsZUNvbnRlbnRPYnNl
cnZlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNldCh0aGlzLCAnY29udGVudCcsIGNvbnRyb2xs
ZXIpOwotICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnX2Vh
Y2hWaWV3LmRhdGFTb3VyY2UnKS5vbmVXYXkoKTsKLSAgICAgICAgYmluZGluZy5jb25uZWN0KGNv
bnRyb2xsZXIpOwotICAgICAgfSk7Ci0KLSAgICAgIHNldCh0aGlzLCAnX2FycmF5Q29udHJvbGxl
cicsIGNvbnRyb2xsZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmRpc2FibGVDb250ZW50
T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewotICAgICAgICBiaW5kaW5nID0gbmV3IEVtYmVyLkJpbmRp
bmcoJ2NvbnRlbnQnLCAnZGF0YVNvdXJjZScpLm9uZVdheSgpOwotICAgICAgICBiaW5kaW5nLmNv
bm5lY3QodGhpcyk7Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy5fc3VwZXIo
KTsKLSAgfSwKLQotICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5jdGlvbihjb250ZW50KSB7Ci0gICAg
RW1iZXIuYXNzZXJ0KCJUaGUgdmFsdWUgdGhhdCAjZWFjaCBsb29wcyBvdmVyIG11c3QgYmUgYW4g
QXJyYXkuIFlvdSBwYXNzZWQgIiArIGNvbnRlbnQuY29uc3RydWN0b3IgKyAiLCBidXQgaXQgc2hv
dWxkIGhhdmUgYmVlbiBhbiBBcnJheUNvbnRyb2xsZXIiLCAhRW1iZXIuQ29udHJvbGxlck1peGlu
LmRldGVjdChjb250ZW50KSB8fCAoY29udGVudCAmJiBjb250ZW50LmlzR2VuZXJhdGVkKSB8fCBj
b250ZW50IGluc3RhbmNlb2YgRW1iZXIuQXJyYXlDb250cm9sbGVyKTsKLSAgICBFbWJlci5hc3Nl
cnQoIlRoZSB2YWx1ZSB0aGF0ICNlYWNoIGxvb3BzIG92ZXIgbXVzdCBiZSBhbiBBcnJheS4gWW91
IHBhc3NlZCAiICsgKChFbWJlci5Db250cm9sbGVyTWl4aW4uZGV0ZWN0KGNvbnRlbnQpICYmIGNv
bnRlbnQuZ2V0KCdtb2RlbCcpICE9PSB1bmRlZmluZWQpID8gKCIiICsgY29udGVudC5nZXQoJ21v
ZGVsJykgKyAiICh3cmFwcGVkIGluICIgKyBjb250ZW50ICsgIikiKSA6ICgiIiArIGNvbnRlbnQp
KSwgRW1iZXIuQXJyYXkuZGV0ZWN0KGNvbnRlbnQpKTsKLSAgfSwKLQotICBkaXNhYmxlQ29udGVu
dE9ic2VydmVyczogZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICBFbWJlci5yZW1vdmVCZWZvcmVP
YnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVudFdpbGxDaGFuZ2UnKTsKLSAg
ICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVudERp
ZENoYW5nZScpOwotCi0gICAgY2FsbGJhY2suY2FsbCh0aGlzKTsKLQotICAgIEVtYmVyLmFkZEJl
Zm9yZU9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50V2lsbENoYW5nZScp
OwotICAgIEVtYmVyLmFkZE9ic2VydmVyKHRoaXMsICdjb250ZW50JywgbnVsbCwgJ19jb250ZW50
RGlkQ2hhbmdlJyk7Ci0gIH0sCi0KLSAgaXRlbVZpZXdDbGFzczogRW1iZXIuX01ldGFtb3JwaFZp
ZXcsCi0gIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmlldywKLQotICBjcmVhdGVD
aGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7Ci0gICAgdmlldyA9IHRoaXMuX3N1cGVy
KHZpZXcsIGF0dHJzKTsKLQotICAgIC8vIEF0IHRoZSBtb21lbnQsIGlmIGEgY29udGFpbmVyIHZp
ZXcgc3ViY2xhc3Mgd2FudHMKLSAgICAvLyB0byBpbnNlcnQga2V5d29yZHMsIGl0IGlzIHJlc3Bv
bnNpYmxlIGZvciBjbG9uaW5nCi0gICAgLy8gdGhlIGtleXdvcmRzIGhhc2guIFRoaXMgd2lsbCBi
ZSBmaXhlZCBtb21lbnRhcmlseS4KLSAgICB2YXIga2V5d29yZCA9IGdldCh0aGlzLCAna2V5d29y
ZCcpOwotICAgIHZhciBjb250ZW50ID0gZ2V0KHZpZXcsICdjb250ZW50Jyk7Ci0KLSAgICBpZiAo
a2V5d29yZCkgewotICAgICAgdmFyIGRhdGEgPSBnZXQodmlldywgJ3RlbXBsYXRlRGF0YScpOwot
Ci0gICAgICBkYXRhID0gRW1iZXIuY29weShkYXRhKTsKLSAgICAgIGRhdGEua2V5d29yZHMgPSB2
aWV3LmNsb25lS2V5d29yZHMoKTsKLSAgICAgIHNldCh2aWV3LCAndGVtcGxhdGVEYXRhJywgZGF0
YSk7Ci0KLSAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgZG8gbm90IGJpbmQsIGJlY2F1c2UgdGhl
IGBjb250ZW50YCBvZgotICAgICAgLy8gYSAjZWFjaCBpdGVtIGNhbm5vdCBjaGFuZ2UuCi0gICAg
ICBkYXRhLmtleXdvcmRzW2tleXdvcmRdID0gY29udGVudDsKLSAgICB9Ci0KLSAgICAvLyBJZiB7
eyNlYWNofX0gaXMgbG9vcGluZyBvdmVyIGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzLAotICAgIC8v
IHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVpciByZXNwZWN0aXZlIGNvbnRyb2xsZXIuCi0g
ICAgaWYgKGNvbnRlbnQgJiYgZ2V0KGNvbnRlbnQsICdpc0NvbnRyb2xsZXInKSkgewotICAgICAg
c2V0KHZpZXcsICdjb250cm9sbGVyJywgY29udGVudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZp
ZXc7Ci0gIH0sCi0KLSAgZGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLl9zdXBl
cigpKSB7IHJldHVybjsgfQotCi0gICAgdmFyIGFycmF5Q29udHJvbGxlciA9IGdldCh0aGlzLCAn
X2FycmF5Q29udHJvbGxlcicpOwotCi0gICAgaWYgKGFycmF5Q29udHJvbGxlcikgewotICAgICAg
YXJyYXlDb250cm9sbGVyLmRlc3Ryb3koKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAg
fQotfSk7Ci0KLXZhciBHcm91cGVkRWFjaCA9IEVtYmVyLkhhbmRsZWJhcnMuR3JvdXBlZEVhY2gg
PSBmdW5jdGlvbihjb250ZXh0LCBwYXRoLCBvcHRpb25zKSB7Ci0gIHZhciBzZWxmID0gdGhpcywK
LSAgICAgIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoY29udGV4
dCwgcGF0aCwgb3B0aW9ucy5kYXRhKTsKLQotICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICB0
aGlzLnBhdGggPSBwYXRoOwotICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICB0aGlzLnRlbXBs
YXRlID0gb3B0aW9ucy5mbjsKLSAgdGhpcy5jb250YWluaW5nVmlldyA9IG9wdGlvbnMuZGF0YS52
aWV3OwotICB0aGlzLm5vcm1hbGl6ZWRSb290ID0gbm9ybWFsaXplZC5yb290OwotICB0aGlzLm5v
cm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZC5wYXRoOwotICB0aGlzLmNvbnRlbnQgPSB0aGlzLmxv
b2t1cENvbnRlbnQoKTsKLQotICB0aGlzLmFkZENvbnRlbnRPYnNlcnZlcnMoKTsKLSAgdGhpcy5h
ZGRBcnJheU9ic2VydmVycygpOwotCi0gIHRoaXMuY29udGFpbmluZ1ZpZXcub24oJ3dpbGxDbGVh
clJlbmRlcicsIGZ1bmN0aW9uKCkgewotICAgIHNlbGYuZGVzdHJveSgpOwotICB9KTsKLX07Ci0K
LUdyb3VwZWRFYWNoLnByb3RvdHlwZSA9IHsKLSAgY29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKTsKLSAgfSwKLQotICBjb250ZW50
RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmxvb2t1cENv
bnRlbnQoKTsKLSAgICB0aGlzLmFkZEFycmF5T2JzZXJ2ZXJzKCk7Ci0gICAgdGhpcy5yZXJlbmRl
ckNvbnRhaW5pbmdWaWV3KCk7Ci0gIH0sCi0KLSAgY29udGVudEFycmF5V2lsbENoYW5nZTogRW1i
ZXIuSywKLQotICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMu
cmVyZW5kZXJDb250YWluaW5nVmlldygpOwotICB9LAotCi0gIGxvb2t1cENvbnRlbnQ6IGZ1bmN0
aW9uKCkgewotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmdldCh0aGlzLm5vcm1hbGl6ZWRS
b290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLm9wdGlvbnMpOwotICB9LAotCi0gIGFkZEFy
cmF5T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuY29udGVudCkgeyByZXR1
cm47IH0KLQotICAgIHRoaXMuY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKLSAgICAg
IHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdlJywKLSAgICAgIGRpZENoYW5nZTog
J2NvbnRlbnRBcnJheURpZENoYW5nZScKLSAgICB9KTsKLSAgfSwKLQotICByZW1vdmVBcnJheU9i
c2VydmVyczogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9
Ci0KLSAgICB0aGlzLmNvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7Ci0gICAgICB3
aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCi0gICAgICBkaWRDaGFuZ2U6ICdj
b250ZW50QXJyYXlEaWRDaGFuZ2UnCi0gICAgfSk7Ci0gIH0sCi0KLSAgYWRkQ29udGVudE9ic2Vy
dmVyczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcy5ub3Jt
YWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50V2lsbENo
YW5nZSk7Ci0gICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5u
b3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50RGlkQ2hhbmdlKTsKLSAgfSwKLQotICBy
ZW1vdmVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHsKLSAgICBFbWJlci5yZW1vdmVCZWZv
cmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlz
LmNvbnRlbnRXaWxsQ2hhbmdlKTsKLSAgICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLm5vcm1h
bGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLmNvbnRlbnREaWRDaGFuZ2UpOwot
ICB9LAotCi0gIHJlbmRlcjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsg
cmV0dXJuOyB9Ci0KLSAgICB2YXIgY29udGVudCA9IHRoaXMuY29udGVudCwKLSAgICAgICAgY29u
dGVudExlbmd0aCA9IGdldChjb250ZW50LCAnbGVuZ3RoJyksCi0gICAgICAgIGRhdGEgPSB0aGlz
Lm9wdGlvbnMuZGF0YSwKLSAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlOwotCi0gICAg
ZGF0YS5pbnNpZGVFYWNoID0gdHJ1ZTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnRM
ZW5ndGg7IGkrKykgewotICAgICAgdGVtcGxhdGUoY29udGVudC5vYmplY3RBdChpKSwgeyBkYXRh
OiBkYXRhIH0pOwotICAgIH0KLSAgfSwKLQotICByZXJlbmRlckNvbnRhaW5pbmdWaWV3OiBmdW5j
dGlvbigpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgRW1iZXIucnVuLnNjaGVkdWxlT25j
ZSgncmVuZGVyJywgdGhpcywgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBJdCdzIHBvc3NpYmxlIGl0
J3MgYmVlbiBkZXN0cm95ZWQgYWZ0ZXIgd2UgZW5xdWV1ZWQgYSByZS1yZW5kZXIgY2FsbC4KLSAg
ICAgIGlmICghc2VsZi5kZXN0cm95ZWQpIHsKLSAgICAgICAgc2VsZi5jb250YWluaW5nVmlldy5y
ZXJlbmRlcigpOwotICAgICAgfQotICAgIH0pOwotICB9LAotCi0gIGRlc3Ryb3k6IGZ1bmN0aW9u
KCkgewotICAgIHRoaXMucmVtb3ZlQ29udGVudE9ic2VydmVycygpOwotICAgIGlmICh0aGlzLmNv
bnRlbnQpIHsKLSAgICAgIHRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKTsKLSAgICB9Ci0gICAg
dGhpcy5kZXN0cm95ZWQgPSB0cnVlOwotICB9Ci19OwotCi0vKioKLSAgVGhlIGB7eyNlYWNofX1g
IGhlbHBlciBsb29wcyBvdmVyIGVsZW1lbnRzIGluIGEgY29sbGVjdGlvbiwgcmVuZGVyaW5nIGl0
cwotICBibG9jayBvbmNlIGZvciBlYWNoIGl0ZW0uIEl0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUg
YmFzZSBIYW5kbGViYXJzIGB7eyNlYWNofX1gCi0gIGhlbHBlcjoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIERldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1ZGEnfSx7bmFtZTogJ1RvbSd9LCB7bmFtZTog
J1BhdWwnfV07Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBEZXZlbG9wZXJz
fX0KLSAgICB7e25hbWV9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgYHt7ZWFjaH19YCBzdXBw
b3J0cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVtZW50IG5hbWluZzoKLQotICBgYGBo
YW5kbGViYXJzCi0gIHt7I2VhY2ggcGVyc29uIGluIERldmVsb3BlcnN9fQotICAgIHt7cGVyc29u
Lm5hbWV9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgV2hlbiBsb29waW5nIG92ZXIgb2JqZWN0
cyB0aGF0IGRvIG5vdCBoYXZlIHByb3BlcnRpZXMsIGB7e3RoaXN9fWAgY2FuIGJlIHVzZWQKLSAg
dG8gcmVuZGVyIHRoZSBvYmplY3Q6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBEZXZlbG9wZXJOYW1l
cyA9IFsnWWVodWRhJywgJ1RvbScsICdQYXVsJ10KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwot
ICB7eyNlYWNoIERldmVsb3Blck5hbWVzfX0KLSAgICB7e3RoaXN9fQotICB7ey9lYWNofX0KLSAg
YGBgCi0gICMjIyB7e2Vsc2V9fSBjb25kaXRpb24KLSAgYHt7I2VhY2h9fWAgY2FuIGhhdmUgYSBt
YXRjaGluZyBge3tlbHNlfX1gLiBUaGUgY29udGVudHMgb2YgdGhpcyBibG9jayB3aWxsIHJlbmRl
cgotICBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4KLQotICBgYGAKLSAge3sjZWFjaCBwZXJz
b24gaW4gRGV2ZWxvcGVyc319Ci0gICAge3twZXJzb24ubmFtZX19Ci0gIHt7ZWxzZX19Ci0gICAg
PHA+U29ycnksIG5vYm9keSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgdGFzay48L3A+Ci0gIHt7L2Vh
Y2h9fQotICBgYGAKLSAgIyMjIFNwZWNpZnlpbmcgYSBWaWV3IGNsYXNzIGZvciBpdGVtcwotICBJ
ZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFzc2Agb3B0aW9uIHRoYXQgcmVmZXJlbmNlcyBh
IHZpZXcgY2xhc3MKLSAgd2l0aCBpdHMgb3duIGB0ZW1wbGF0ZWAgeW91IGNhbiBvbWl0IHRoZSBi
bG9jay4KLQotICBUaGUgZm9sbG93aW5nIHRlbXBsYXRlOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAg
e3sjdmlldyBBcHAuTXlWaWV3IH19Ci0gICAge3tlYWNoIHZpZXcuaXRlbXMgaXRlbVZpZXdDbGFz
cz0iQXBwLkFuSXRlbVZpZXcifX0KLSAge3svdmlld319Ci0gIGBgYAotCi0gIEFuZCBhcHBsaWNh
dGlvbiBjb2RlCi0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5j
cmVhdGUoewotICAgIE15VmlldzogRW1iZXIuVmlldy5leHRlbmQoewotICAgICAgaXRlbXM6IFsK
LSAgICAgICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ0RhdmUnfSksCi0gICAgICAgIEVt
YmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdNYXJ5J30pLAotICAgICAgICBFbWJlci5PYmplY3Qu
Y3JlYXRlKHtuYW1lOiAnU2FyYSd9KQotICAgICAgXQotICAgIH0pCi0gIH0pOwotCi0gIEFwcC5B
bkl0ZW1WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoIkdyZWV0aW5ncyB7e25hbWV9fSIpCi0gIH0pOwotICBgYGAKLQotICBX
aWxsIHJlc3VsdCBpbiB0aGUgSFRNTCBzdHJ1Y3R1cmUgYmVsb3cKLQotICBgYGBodG1sCi0gIDxk
aXYgY2xhc3M9ImVtYmVyLXZpZXciPgotICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0
aW5ncyBEYXZlPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIE1h
cnk8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgU2FyYTwvZGl2
PgotICA8L2Rpdj4KLSAgYGBgCi0KLSAgSWYgYW4gYGl0ZW1WaWV3Q2xhc3NgIGlzIGRlZmluZWQg
b24gdGhlIGhlbHBlciwgYW5kIHRoZXJlZm9yZSB0aGUgaGVscGVyIGlzIG5vdAotICBiZWluZyB1
c2VkIGFzIGEgYmxvY2ssIGFuIGBlbXB0eVZpZXdDbGFzc2AgY2FuIGFsc28gYmUgcHJvdmlkZWQg
b3B0aW9uYWxseS4KLSAgVGhlIGBlbXB0eVZpZXdDbGFzc2Agd2lsbCBtYXRjaCB0aGUgYmVoYXZp
b3Igb2YgdGhlIGB7e2Vsc2V9fWAgY29uZGl0aW9uCi0gIGRlc2NyaWJlZCBhYm92ZS4gVGhhdCBp
cywgdGhlIGBlbXB0eVZpZXdDbGFzc2Agd2lsbCByZW5kZXIgaWYgdGhlIGNvbGxlY3Rpb24KLSAg
aXMgZW1wdHkuCi0KLSAgIyMjIFJlcHJlc2VudGluZyBlYWNoIGl0ZW0gd2l0aCBhIENvbnRyb2xs
ZXIuCi0gIEJ5IGRlZmF1bHQgdGhlIGNvbnRyb2xsZXIgbG9va3VwIHdpdGhpbiBhbiBge3sjZWFj
aH19YCBibG9jayB3aWxsIGJlCi0gIHRoZSBjb250cm9sbGVyIG9mIHRoZSB0ZW1wbGF0ZSB3aGVy
ZSB0aGUgYHt7I2VhY2h9fWAgd2FzIHVzZWQuIElmIGVhY2gKLSAgaXRlbSBuZWVkcyB0byBiZSBw
cmVzZW50ZWQgYnkgYSBjdXN0b20gY29udHJvbGxlciB5b3UgY2FuIHByb3ZpZGUgYQotICBgaXRl
bUNvbnRyb2xsZXJgIG9wdGlvbiB3aGljaCByZWZlcmVuY2VzIGEgY29udHJvbGxlciBieSBsb29r
dXAgbmFtZS4KLSAgRWFjaCBpdGVtIGluIHRoZSBsb29wIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiBp
bnN0YW5jZSBvZiB0aGlzIGNvbnRyb2xsZXIKLSAgYW5kIHRoZSBpdGVtIGl0c2VsZiB3aWxsIGJl
IHNldCB0byB0aGUgYGNvbnRlbnRgIHByb3BlcnR5IG9mIHRoYXQgY29udHJvbGxlci4KLQotICBU
aGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBwcm9wZXJ0aWVzIG9mIG1vZGVsIG9iamVjdHMg
bmVlZCB0cmFuc2Zvcm1hdGlvbgotICBvciBzeW50aGVzaXMgZm9yIGRpc3BsYXk6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICBBcHAuRGV2ZWxvcGVyQ29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRy
b2xsZXIuZXh0ZW5kKHsKLSAgICBpc0F2YWlsYWJsZUZvckhpcmU6IGZ1bmN0aW9uKCkgewotICAg
ICAgcmV0dXJuICF0aGlzLmdldCgnY29udGVudC5pc0VtcGxveWVkJykgJiYgdGhpcy5nZXQoJ2Nv
bnRlbnQuaXNTZWVraW5nV29yaycpOwotICAgIH0ucHJvcGVydHkoJ2lzRW1wbG95ZWQnLCAnaXNT
ZWVraW5nV29yaycpCi0gIH0pCi0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3sjZWFjaCBw
ZXJzb24gaW4gZGV2ZWxvcGVycyBpdGVtQ29udHJvbGxlcj0iZGV2ZWxvcGVyIn19Ci0gICAge3tw
ZXJzb24ubmFtZX19IHt7I2lmIHBlcnNvbi5pc0F2YWlsYWJsZUZvckhpcmV9fUhpcmUgbWUhe3sv
aWZ9fQotICB7ey9lYWNofX0KLSAgYGBgCi0KLSAgRWFjaCBpdGVtQ29udHJvbGxlciB3aWxsIHJl
Y2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciBhcwotICBhIGBwYXJl
bnRDb250cm9sbGVyYCBwcm9wZXJ0eS4KLQotICAjIyMgKEV4cGVyaW1lbnRhbCkgR3JvdXBlZCBF
YWNoCi0KLSAgV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGV4cGVyaW1lbnRhbCBb
Z3JvdXAgaGVscGVyXShodHRwczovL2dpdGh1Yi5jb20vZW1iZXJqcy9ncm91cC1oZWxwZXIpLAot
ICB5b3UgY2FuIGluZm9ybSBIYW5kbGViYXJzIHRvIHJlLXJlbmRlciBhbiBlbnRpcmUgZ3JvdXAg
b2YgaXRlbXMgaW5zdGVhZCBvZgotICByZS1yZW5kZXJpbmcgdGhlbSBvbmUgYXQgYSB0aW1lIChp
biB0aGUgZXZlbnQgdGhhdCB0aGV5IGFyZSBjaGFuZ2VkIGVuIG1hc3NlCi0gIG9yIGFuIGl0ZW0g
aXMgYWRkZWQvcmVtb3ZlZCkuCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNncm91cH19Ci0gICAg
e3sjZWFjaCBwZW9wbGV9fQotICAgICAge3tmaXJzdE5hbWV9fSB7e2xhc3ROYW1lfX0KLSAgICB7
ey9lYWNofX0KLSAge3svZ3JvdXB9fQotICBgYGAKLQotICBUaGlzIGNhbiBiZSBmYXN0ZXIgdGhh
biB0aGUgbm9ybWFsIHdheSB0aGF0IEhhbmRsZWJhcnMgcmUtcmVuZGVycyBpdGVtcwotICBpbiBz
b21lIGNhc2VzLgotCi0gIElmIGZvciBzb21lIHJlYXNvbiB5b3UgaGF2ZSBhIGdyb3VwIHdpdGgg
bW9yZSB0aGFuIG9uZSBgI2VhY2hgLCB5b3UgY2FuIG1ha2UKLSAgb25lIG9mIHRoZSBjb2xsZWN0
aW9ucyBiZSB1cGRhdGVkIGluIG5vcm1hbCAobm9uLWdyb3VwZWQpIGZhc2hpb24gYnkgc2V0dGlu
ZwotICB0aGUgb3B0aW9uIGBncm91cGVkUm93cz10cnVlYCAoY291bnRlci1pbnR1aXRpdmUsIEkg
a25vdykuCi0KLSAgRm9yIGV4YW1wbGUsCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e2RlYWxlcnNo
aXBOYW1lfX0KLQotICB7eyNncm91cH19Ci0gICAge3sjZWFjaCBkZWFsZXJzfX0KLSAgICAgIHt7
Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19Ci0gICAge3svZWFjaH19Ci0KLSAgICB7eyNlYWNoIGNh
ciBpbiBjYXJzIGdyb3VwZWRSb3dzPXRydWV9fQotICAgICAge3tjYXIubWFrZX19IHt7Y2FyLm1v
ZGVsfX0ge3tjYXIuY29sb3J9fQotICAgIHt7L2VhY2h9fQotICB7ey9ncm91cH19Ci0gIGBgYAot
ICBBbnkgY2hhbmdlIHRvIGBkZWFsZXJzaGlwTmFtZWAgb3IgdGhlIGBkZWFsZXJzYCBjb2xsZWN0
aW9uIHdpbGwgY2F1c2UgdGhlCi0gIGVudGlyZSBncm91cCB0byBiZSByZS1yZW5kZXJlZC4gSG93
ZXZlciwgY2hhbmdlcyB0byB0aGUgYGNhcnNgIGNvbGxlY3Rpb24KLSAgd2lsbCBiZSByZS1yZW5k
ZXJlZCBpbmRpdmlkdWFsbHkgKGFzIG5vcm1hbCkuCi0KLSAgTm90ZSB0aGF0IGBncm91cGAgYmVo
YXZpb3IgaXMgYWxzbyBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIGFuIGBpdGVtVmlld0NsYXNzYC4K
LQotICBAbWV0aG9kIGVhY2gKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBh
cmFtIFtuYW1lXSB7U3RyaW5nfSBuYW1lIGZvciBpdGVtICh1c2VkIHdpdGggYGluYCkKLSAgQHBh
cmFtIFtwYXRoXSB7U3RyaW5nfSBwYXRoCi0gIEBwYXJhbSBbb3B0aW9uc10ge09iamVjdH0gSGFu
ZGxlYmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0aW9ucwotICBAcGFyYW0gW29wdGlvbnMuaXRl
bVZpZXdDbGFzc10ge1N0cmluZ30gYSBwYXRoIHRvIGEgdmlldyBjbGFzcyB1c2VkIGZvciBlYWNo
IGl0ZW0KLSAgQHBhcmFtIFtvcHRpb25zLml0ZW1Db250cm9sbGVyXSB7U3RyaW5nfSBuYW1lIG9m
IGEgY29udHJvbGxlciB0byBiZSBjcmVhdGVkIGZvciBlYWNoIGl0ZW0KLSAgQHBhcmFtIFtvcHRp
b25zLmdyb3VwZWRSb3dzXSB7Ym9vbGVhbn0gZW5hYmxlIG5vcm1hbCBpdGVtLWJ5LWl0ZW0gcmVu
ZGVyaW5nIHdoZW4gaW5zaWRlIGEgYCNncm91cGAgaGVscGVyCi0qLwotRW1iZXIuSGFuZGxlYmFy
cy5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uIGVhY2hIZWxwZXIocGF0aCwgb3B0aW9u
cykgewotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkgewotICAgIEVtYmVyLmFzc2VydCgi
SWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgZWFjaCBoZWxwZXIsIGl0
IG11c3QgYmUgaW4gdGhlIGZvcm0gI2VhY2ggZm9vIGluIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0g
ImluIik7Ci0KLSAgICB2YXIga2V5d29yZE5hbWUgPSBhcmd1bWVudHNbMF07Ci0KLSAgICBvcHRp
b25zID0gYXJndW1lbnRzWzNdOwotICAgIHBhdGggPSBhcmd1bWVudHNbMl07Ci0gICAgaWYgKHBh
dGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0KLQotICAgIG9wdGlvbnMuaGFzaC5rZXl3b3Jk
ID0ga2V5d29yZE5hbWU7Ci0gIH0KLQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewot
ICAgIG9wdGlvbnMgPSBwYXRoOwotICAgIHBhdGggPSAndGhpcyc7Ci0gIH0KLQotICBvcHRpb25z
Lmhhc2guZGF0YVNvdXJjZUJpbmRpbmcgPSBwYXRoOwotICAvLyBTZXQgdXAgZW1wdHlWaWV3IGFz
IGEgbWV0YW1vcnBoIHdpdGggbm8gdGFnCi0gIC8vb3B0aW9ucy5oYXNoLmVtcHR5Vmlld0NsYXNz
ID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7Ci0KLSAgaWYgKG9wdGlvbnMuZGF0YS5pbnNpZGVHcm91
cCAmJiAhb3B0aW9ucy5oYXNoLmdyb3VwZWRSb3dzICYmICFvcHRpb25zLmhhc2guaXRlbVZpZXdD
bGFzcykgewotICAgIG5ldyBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoKHRoaXMsIHBhdGgs
IG9wdGlvbnMpLnJlbmRlcigpOwotICB9IGVsc2UgewotICAgIHJldHVybiBFbWJlci5IYW5kbGVi
YXJzLmhlbHBlcnMuY29sbGVjdGlvbi5jYWxsKHRoaXMsICdFbWJlci5IYW5kbGViYXJzLkVhY2hW
aWV3Jywgb3B0aW9ucyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewot
LyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLS8q
KgotICBgdGVtcGxhdGVgIGFsbG93cyB5b3UgdG8gcmVuZGVyIGEgdGVtcGxhdGUgZnJvbSBpbnNp
ZGUgYW5vdGhlciB0ZW1wbGF0ZS4KLSAgVGhpcyBhbGxvd3MgeW91IHRvIHJlLXVzZSB0aGUgc2Ft
ZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBwbGFjZXMuIEZvciBleGFtcGxlOgotCi0gIGBgYGh0bWwK
LSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJs
b2dnZWRfaW5fdXNlciI+Ci0gICAge3sjd2l0aCBsb2dnZWRJblVzZXJ9fQotICAgICAgTGFzdCBM
b2dpbjoge3tsYXN0TG9naW59fQotICAgICAgVXNlciBJbmZvOiB7e3RlbXBsYXRlICJ1c2VyX2lu
Zm8ifX0KLSAgICB7ey93aXRofX0KLSAgPC9zY3JpcHQ+Ci0gIGBgYAotCi0gIGBgYGh0bWwKLSAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ1c2Vy
X2luZm8iPgotICAgIE5hbWU6IDxlbT57e25hbWV9fTwvZW0+Ci0gICAgS2FybWE6IDxlbT57e2th
cm1hfX08L2VtPgotICA8L3NjcmlwdD4KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7eyNp
ZiBpc1VzZXJ9fQotICAgIHt7dGVtcGxhdGUgInVzZXJfaW5mbyJ9fQotICB7e2Vsc2V9fQotICAg
IHt7dGVtcGxhdGUgInVubG9nZ2VkX3VzZXJfaW5mbyJ9fQotICB7ey9pZn19Ci0gIGBgYAotCi0g
IFRoaXMgaGVscGVyIGxvb2tzIGZvciB0ZW1wbGF0ZXMgaW4gdGhlIGdsb2JhbCBgRW1iZXIuVEVN
UExBVEVTYCBoYXNoLiBJZiB5b3UKLSAgYWRkIGA8c2NyaXB0PmAgdGFncyB0byB5b3VyIHBhZ2Ug
d2l0aCB0aGUgYGRhdGEtdGVtcGxhdGUtbmFtZWAgYXR0cmlidXRlIHNldCwKLSAgdGhleSB3aWxs
IGJlIGNvbXBpbGVkIGFuZCBwbGFjZWQgaW4gdGhpcyBoYXNoIGF1dG9tYXRpY2FsbHkuCi0KLSAg
WW91IGNhbiBhbHNvIG1hbnVhbGx5IHJlZ2lzdGVyIHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0
byB0aGUgaGFzaDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLlRFTVBMQVRFU1sibXlfY29v
bF90ZW1wbGF0ZSJdID0gRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8Yj57e3VzZXJ9fTwvYj4n
KTsKLSAgYGBgCi0KLSAgQGRlcHJlY2F0ZWQKLSAgQG1ldGhvZCB0ZW1wbGF0ZQotICBAZm9yIEVt
YmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lIHRo
ZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSovCi0KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxw
ZXIoJ3RlbXBsYXRlJywgZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewotICBFbWJlci5kZXByZWNh
dGUoIlRoZSBgdGVtcGxhdGVgIGhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9m
IHRoZSBgcGFydGlhbGAgaGVscGVyLiBQbGVhc2UgdXNlIGBwYXJ0aWFsYCBpbnN0ZWFkLCB3aGlj
aCB3aWxsIHdvcmsgdGhlIHNhbWUgd2F5LiIpOwotICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5o
ZWxwZXJzLnBhcnRpYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLX0pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLWhh
bmRsZWJhcnMKLSovCi0KLS8qKgotICBUaGUgYHBhcnRpYWxgIGhlbHBlciByZW5kZXJzIGFub3Ro
ZXIgdGVtcGxhdGUgd2l0aG91dAotICBjaGFuZ2luZyB0aGUgdGVtcGxhdGUgY29udGV4dDoKLQot
ICBgYGBoYW5kbGViYXJzCi0gIHt7Zm9vfX0KLSAge3twYXJ0aWFsICJuYXYifX0KLSAgYGBgCi0K
LSAgVGhlIGFib3ZlIGV4YW1wbGUgdGVtcGxhdGUgd2lsbCByZW5kZXIgYSB0ZW1wbGF0ZSBuYW1l
ZAotICAiX25hdiIsIHdoaWNoIGhhcyB0aGUgc2FtZSBjb250ZXh0IGFzIHRoZSBwYXJlbnQgdGVt
cGxhdGUKLSAgaXQncyByZW5kZXJlZCBpbnRvLCBzbyBpZiB0aGUgIl9uYXYiIHRlbXBsYXRlIGFs
c28gcmVmZXJlbmNlZAotICBge3tmb299fWAsIGl0IHdvdWxkIHByaW50IHRoZSBzYW1lIHRoaW5n
IGFzIHRoZSBge3tmb299fWAKLSAgaW4gdGhlIGFib3ZlIGV4YW1wbGUuCi0KLSAgSWYgYSAiX25h
diIgdGVtcGxhdGUgaXNuJ3QgZm91bmQsIHRoZSBgcGFydGlhbGAgaGVscGVyIHdpbGwKLSAgZmFs
bCBiYWNrIHRvIGEgdGVtcGxhdGUgbmFtZWQgIm5hdiIuCi0KLSAgIyMgQm91bmQgdGVtcGxhdGUg
bmFtZXMKLQotICBUaGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGBwYXJ0aWFsYCBjYW4gYWxzbyBi
ZSBhIHBhdGgKLSAgdG8gYSBwcm9wZXJ0eSBjb250YWluaW5nIGEgdGVtcGxhdGUgbmFtZSwgZS5n
LjoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7cGFydGlhbCBzb21lVGVtcGxhdGVOYW1lfX0KLSAg
YGBgCi0KLSAgVGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBvZiBgc29t
ZVRlbXBsYXRlTmFtZWAKLSAgb24gdGhlIHRlbXBsYXRlIGNvbnRleHQgKGUuZy4gYSBjb250cm9s
bGVyKSBhbmQgdXNlIHRoYXQKLSAgdmFsdWUgYXMgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRv
IHJlbmRlci4gSWYgdGhlIHJlc29sdmVkCi0gIHZhbHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwg
YmUgcmVuZGVyZWQuIElmIGBzb21lVGVtcGxhdGVOYW1lYAotICBjaGFuZ2VzLCB0aGUgcGFydGlh
bCB3aWxsIGJlIHJlLXJlbmRlcmVkIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGUKLSAgbmFtZS4KLQot
ICAjIyBTZXR0aW5nIHRoZSBwYXJ0aWFsJ3MgY29udGV4dCB3aXRoIGB3aXRoYAotCi0gIFRoZSBg
cGFydGlhbGAgaGVscGVyIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB3aXRo
YAotICBoZWxwZXIgdG8gc2V0IGEgY29udGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgcGFy
dGlhbDoKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7I3dpdGggY3VycmVudFVzZXJ9fQotICAgIHt7
cGFydGlhbCAidXNlcl9pbmZvIn19Ci0gIHt7L3dpdGh9fQotICBgYGAKLQotICBAbWV0aG9kIHBh
cnRpYWwKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgQHBhcmFtIHtTdHJpbmd9
IHBhcnRpYWxOYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgbWludXMgdGhl
IGxlYWRpbmcgdW5kZXJzY29yZQotKi8KLQotRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBl
cigncGFydGlhbCcsIGZ1bmN0aW9uIHBhcnRpYWxIZWxwZXIobmFtZSwgb3B0aW9ucykgewotCi0g
IHZhciBjb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0cy5sZW5n
dGgpID8gb3B0aW9ucy5jb250ZXh0c1swXSA6IHRoaXM7Ci0KLSAgaWYgKG9wdGlvbnMudHlwZXNb
MF0gPT09ICJJRCIpIHsKLSAgICAvLyBIZWxwZXIgd2FzIHBhc3NlZCBhIHByb3BlcnR5IHBhdGg7
IHdlIG5lZWQgdG8KLSAgICAvLyBjcmVhdGUgYSBiaW5kaW5nIHRoYXQgd2lsbCByZS1yZW5kZXIg
d2hlbmV2ZXIKLSAgICAvLyB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0gICAgb3B0aW9ucy5mbiA9
IGZ1bmN0aW9uKGNvbnRleHQsIGZuT3B0aW9ucykgewotICAgICAgdmFyIHBhcnRpYWxOYW1lID0g
RW1iZXIuSGFuZGxlYmFycy5nZXQoY29udGV4dCwgbmFtZSwgZm5PcHRpb25zKTsKLSAgICAgIHJl
bmRlclBhcnRpYWwoY29udGV4dCwgcGFydGlhbE5hbWUsIGZuT3B0aW9ucyk7Ci0gICAgfTsKLQot
ICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmJpbmQuY2FsbChjb250ZXh0LCBuYW1lLCBvcHRp
b25zLCB0cnVlLCBleGlzdHMpOwotICB9IGVsc2UgewotICAgIC8vIFJlbmRlciB0aGUgcGFydGlh
bCByaWdodCBpbnRvIHBhcmVudCB0ZW1wbGF0ZS4KLSAgICByZW5kZXJQYXJ0aWFsKGNvbnRleHQs
IG5hbWUsIG9wdGlvbnMpOwotICB9Ci19KTsKLQotZnVuY3Rpb24gZXhpc3RzKHZhbHVlKSB7Ci0g
IHJldHVybiAhRW1iZXIuaXNOb25lKHZhbHVlKTsKLX0KLQotZnVuY3Rpb24gcmVuZGVyUGFydGlh
bChjb250ZXh0LCBuYW1lLCBvcHRpb25zKSB7Ci0gIHZhciBuYW1lUGFydHMgPSBuYW1lLnNwbGl0
KCIvIiksCi0gICAgICBsYXN0UGFydCA9IG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV07
Ci0KLSAgbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXSA9ICJfIiArIGxhc3RQYXJ0Owot
Ci0gIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXcsCi0gICAgICB1bmRlcnNjb3JlZE5hbWUg
PSBuYW1lUGFydHMuam9pbigiLyIpLAotICAgICAgdGVtcGxhdGUgPSB2aWV3LnRlbXBsYXRlRm9y
TmFtZSh1bmRlcnNjb3JlZE5hbWUpLAotICAgICAgZGVwcmVjYXRlZFRlbXBsYXRlID0gIXRlbXBs
YXRlICYmIHZpZXcudGVtcGxhdGVGb3JOYW1lKG5hbWUpOwotCi0gIEVtYmVyLmFzc2VydCgiVW5h
YmxlIHRvIGZpbmQgcGFydGlhbCB3aXRoIG5hbWUgJyIrbmFtZSsiJy4iLCB0ZW1wbGF0ZSB8fCBk
ZXByZWNhdGVkVGVtcGxhdGUpOwotCi0gIHRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZGVwcmVjYXRl
ZFRlbXBsYXRlOwotCi0gIHRlbXBsYXRlKGNvbnRleHQsIHsgZGF0YTogb3B0aW9ucy5kYXRhIH0p
OwotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1A
c3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNl
dCA9IEVtYmVyLnNldDsKLQotLyoqCi0gIGB7e3lpZWxkfX1gIGRlbm90ZXMgYW4gYXJlYSBvZiBh
IHRlbXBsYXRlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbnNpZGUKLSAgb2YgYW5vdGhlciB0ZW1w
bGF0ZS4gSXQgaGFzIHR3byBtYWluIHVzZXM6Ci0KLSAgIyMjIFVzZSB3aXRoIGBsYXlvdXRgCi0g
IFdoZW4gdXNlZCBpbiBhIEhhbmRsZWJhcnMgdGVtcGxhdGUgdGhhdCBpcyBhc3NpZ25lZCB0byBh
biBgRW1iZXIuVmlld2AKLSAgaW5zdGFuY2UncyBgbGF5b3V0YCBwcm9wZXJ0eSBFbWJlciB3aWxs
IHJlbmRlciB0aGUgbGF5b3V0IHRlbXBsYXRlIGZpcnN0LAotICBpbnNlcnRpbmcgdGhlIHZpZXcn
cyBvd24gcmVuZGVyZWQgb3V0cHV0IGF0IHRoZSBge3t5aWVsZH19YCBsb2NhdGlvbi4KLQotICBB
biBlbXB0eSBgPGJvZHk+YCBhbmQgdGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbiBjb2RlOgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgY2xhc3NO
YW1lczogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKLSAgICBsYXlvdXQ6IEVtYmVyLkhhbmRsZWJh
cnMuY29tcGlsZSgnPGRpdiBjbGFzcz0id3JhcHBlciI+e3t5aWVsZH19PC9kaXY+JyksCi0gICAg
dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnPHNwYW4+SSBhbSB3cmFwcGVkPC9z
cGFuPicpCi0gIH0pOwotCi0gIGFWaWV3ID0gQVZpZXcuY3JlYXRlKCk7Ci0gIGFWaWV3LmFwcGVu
ZFRvKCdib2R5Jyk7Ci0gIGBgYAotCi0gIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRN
TCBvdXRwdXQ6Ci0KLSAgYGBgaHRtbAotICA8Ym9keT4KLSAgICA8ZGl2IGNsYXNzPSdlbWJlci12
aWV3IGEtdmlldy13aXRoLWxheW91dCc+Ci0gICAgICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KLSAg
ICAgICAgPHNwYW4+SSBhbSB3cmFwcGVkPC9zcGFuPgotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+
Ci0gIDwvYm9keT4KLSAgYGBgCi0KLSAgVGhlIGB5aWVsZGAgaGVscGVyIGNhbm5vdCBiZSB1c2Vk
IG91dHNpZGUgb2YgYSB0ZW1wbGF0ZSBhc3NpZ25lZCB0byBhbgotICBgRW1iZXIuVmlld2AncyBg
bGF5b3V0YCBwcm9wZXJ0eSBhbmQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBhdHRlbXB0ZWQuCi0K
LSAgYGBgamF2YXNjcmlwdAotICBCVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBjbGFz
c05hbWVzOiBbJ2Etdmlldy13aXRoLWxheW91dCddLAotICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k
bGViYXJzLmNvbXBpbGUoJ3t7eWllbGR9fScpCi0gIH0pOwotCi0gIGJWaWV3ID0gQlZpZXcuY3Jl
YXRlKCk7Ci0gIGJWaWV3LmFwcGVuZFRvKCdib2R5Jyk7Ci0KLSAgLy8gdGhyb3dzCi0gIC8vIFVu
Y2F1Z2h0IEVycm9yOiBhc3NlcnRpb24gZmFpbGVkOgotICAvLyBZb3UgY2FsbGVkIHlpZWxkIGlu
IGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGEgbGF5b3V0Ci0gIGBgYAotCi0gICMjIyBVc2Ugd2l0
aCBFbWJlci5Db21wb25lbnQKLSAgV2hlbiBkZXNpZ25pbmcgY29tcG9uZW50cyBge3t5aWVsZH19
YCBpcyB1c2VkIHRvIGRlbm90ZSB3aGVyZSwgaW5zaWRlIHRoZSBjb21wb25lbnQncwotICB0ZW1w
bGF0ZSwgYW4gb3B0aW9uYWwgYmxvY2sgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQgc2hvdWxkIHJl
bmRlcjoKLQotICBgYGBoYW5kbGViYXJzCi0gIDwhLS0gYXBwbGljYXRpb24uaGJzIC0tPgotICB7
eyNsYWJlbGVkLXRleHRmaWVsZCB2YWx1ZT1zb21lUHJvcGVydHl9fQotICAgIEZpcnN0IG5hbWU6
Ci0gIHt7L2xhYmVsZWQtdGV4dGZpZWxkfX0KLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICA8
IS0tIGNvbXBvbmVudHMvbGFiZWxlZC10ZXh0ZmllbGQuaGJzIC0tPgotICA8bGFiZWw+Ci0gICAg
e3t5aWVsZH19IHt7aW5wdXQgdmFsdWU9dmFsdWV9fQotICA8L2xhYmVsPgotICBgYGAKLQotICBS
ZXN1bHQ6Ci0KLSAgYGBgaHRtbAotICA8bGFiZWw+Ci0gICAgRmlyc3QgbmFtZTogPGlucHV0IHR5
cGU9InRleHQiIC8+Ci0gIDxsYWJlbD4KLSAgYGBgCi0KLSAgQG1ldGhvZCB5aWVsZAotICBAZm9y
IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAgQHJl
dHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJI
ZWxwZXIoJ3lpZWxkJywgZnVuY3Rpb24geWllbGRIZWxwZXIob3B0aW9ucykgewotICB2YXIgdmll
dyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0gIHdoaWxlICh2aWV3ICYmICFnZXQodmlldywgJ2xh
eW91dCcpKSB7Ci0gICAgaWYgKHZpZXcuX2NvbnRleHRWaWV3KSB7Ci0gICAgICB2aWV3ID0gdmll
dy5fY29udGV4dFZpZXc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZpZXcgPSBnZXQodmlldywgJ3Bh
cmVudFZpZXcnKTsKLSAgICB9Ci0gIH0KLQotICBFbWJlci5hc3NlcnQoIllvdSBjYWxsZWQgeWll
bGQgaW4gYSB0ZW1wbGF0ZSB0aGF0IHdhcyBub3QgYSBsYXlvdXQiLCAhIXZpZXcpOwotCi0gIHZp
ZXcuX3lpZWxkKHRoaXMsIG9wdGlvbnMpOwotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8K
LQotLyoqCi0gIGBsb2NgIGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhlIGxvY2FsaXplZCBzdHJp
bmdzIGhhc2guCi0gIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBG
b3IgZXhhbXBsZToKLQotICBgYGBodG1sCi0gIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJh
cnMiIGRhdGEtdGVtcGxhdGUtbmFtZT0iaG9tZSI+Ci0gICAge3tsb2MgIndlbGNvbWUifX0KLSAg
PC9zY3JpcHQ+Ci0gIGBgYAotCi0gIFRha2Ugbm90ZSB0aGF0IGAid2VsY29tZSJgIGlzIGEgc3Ry
aW5nIGFuZCBub3QgYW4gb2JqZWN0Ci0gIHJlZmVyZW5jZS4KLQotICBAbWV0aG9kIGxvYwotICBA
Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwotICBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBz
dHJpbmcgdG8gZm9ybWF0Ci0qLwotCi1FbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCds
b2MnLCBmdW5jdGlvbiBsb2NIZWxwZXIoc3RyKSB7Ci0gIHJldHVybiBFbWJlci5TdHJpbmcubG9j
KHN0cik7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVs
ZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi12YXIgc2V0ID0gRW1i
ZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQ7Ci0KLS8qKgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNl
ZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5wdXR9fWAKLSAgaGVscGVyIGlz
IHVzZWQgd2l0aCBgdHlwZWAgb2YgYGNoZWNrYm94YC4KLQotICBTZWUgW2hhbmRsZWJhcnMuaGVs
cGVycy5pbnB1dF0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21l
dGhvZF9pbnB1dCkgIGZvciB1c2FnZSBkZXRhaWxzLgotCi0gICMjIERpcmVjdCBtYW5pcHVsYXRp
b24gb2YgYGNoZWNrZWRgCi0KLSAgVGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUgb2YgYW4gYEVtYmVy
LkNoZWNrYm94YCBvYmplY3Qgc2hvdWxkIGFsd2F5cyBiZSBzZXQKLSAgdGhyb3VnaCB0aGUgRW1i
ZXIgb2JqZWN0IG9yIGJ5IGludGVyYWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKLSAg
cmVwcmVzZW50YXRpb24gdmlhIHRoZSBtb3VzZSwga2V5Ym9hcmQsIG9yIHRvdWNoLiBVcGRhdGlu
ZyB0aGUgdmFsdWUgb2YgdGhlCi0gIGNoZWNrYm94IHZpYSBqUXVlcnkgd2lsbCByZXN1bHQgaW4g
dGhlIGNoZWNrZWQgdmFsdWUgb2YgdGhlIG9iamVjdCBhbmQgaXRzCi0gIGVsZW1lbnQgbG9zaW5n
IHN5bmNocm9uaXphdGlvbi4KLQotICAjIyBMYXlvdXQgYW5kIExheW91dE5hbWUgcHJvcGVydGll
cwotCi0gIEJlY2F1c2UgSFRNTCBgaW5wdXRgIGVsZW1lbnRzIGFyZSBzZWxmIGNsb3NpbmcgYGxh
eW91dGAgYW5kIGBsYXlvdXROYW1lYAotICBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQu
IFNlZSBbRW1iZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncwotICBsYXlv
dXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBAY2xhc3MgQ2hlY2tib3gKLSAg
QG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5WaWV3Ci0qLwotRW1iZXIuQ2hlY2ti
b3ggPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gIGNsYXNzTmFtZXM6IFsnZW1iZXItY2hlY2tib3gn
XSwKLQotICB0YWdOYW1lOiAnaW5wdXQnLAotCi0gIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3R5cGUn
LCAnY2hlY2tlZCcsICdpbmRldGVybWluYXRlJywgJ2Rpc2FibGVkJywgJ3RhYmluZGV4JywgJ25h
bWUnXSwKLQotICB0eXBlOiAiY2hlY2tib3giLAotICBjaGVja2VkOiBmYWxzZSwKLSAgZGlzYWJs
ZWQ6IGZhbHNlLAotICBpbmRldGVybWluYXRlOiBmYWxzZSwKLQotICBpbml0OiBmdW5jdGlvbigp
IHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMub24oImNoYW5nZSIsIHRoaXMsIHRoaXMu
X3VwZGF0ZUVsZW1lbnRWYWx1ZSk7Ci0gIH0sCi0KLSAgZGlkSW5zZXJ0RWxlbWVudDogZnVuY3Rp
b24oKSB7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLmdldCgnZWxlbWVudCcpLmluZGV0
ZXJtaW5hdGUgPSAhIXRoaXMuZ2V0KCdpbmRldGVybWluYXRlJyk7Ci0gIH0sCi0KLSAgX3VwZGF0
ZUVsZW1lbnRWYWx1ZTogZnVuY3Rpb24oKSB7Ci0gICAgc2V0KHRoaXMsICdjaGVja2VkJywgdGhp
cy4kKCkucHJvcCgnY2hlY2tlZCcpKTsKLSAgfQotfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rp
b24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwot
Ki8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLSAgU2hh
cmVkIG1peGluIHVzZWQgYnkgYEVtYmVyLlRleHRGaWVsZGAgYW5kIGBFbWJlci5UZXh0QXJlYWAu
Ci0KLSAgQGNsYXNzIFRleHRTdXBwb3J0Ci0gIEBuYW1lc3BhY2UgRW1iZXIKLSAgQHByaXZhdGUK
LSovCi1FbWJlci5UZXh0U3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7Ci0gIHZhbHVlOiAi
IiwKLQotICBhdHRyaWJ1dGVCaW5kaW5nczogWydwbGFjZWhvbGRlcicsICdkaXNhYmxlZCcsICdt
YXhsZW5ndGgnLCAndGFiaW5kZXgnLCAncmVhZG9ubHknXSwKLSAgcGxhY2Vob2xkZXI6IG51bGws
Ci0gIGRpc2FibGVkOiBmYWxzZSwKLSAgbWF4bGVuZ3RoOiBudWxsLAotCi0gIGluaXQ6IGZ1bmN0
aW9uKCkgewotICAgIHRoaXMuX3N1cGVyKCk7Ci0gICAgdGhpcy5vbigiZm9jdXNPdXQiLCB0aGlz
LCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImNoYW5nZSIsIHRo
aXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigicGFzdGUiLCB0
aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImN1dCIsIHRo
aXMsIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7Ci0gICAgdGhpcy5vbigiaW5wdXQiLCB0
aGlzLCB0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpOwotICAgIHRoaXMub24oImtleVVwIiwg
dGhpcywgdGhpcy5pbnRlcnByZXRLZXlFdmVudHMpOwotICB9LAotCi0gIC8qKgotICAgIFRoZSBh
Y3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIHJldHVybiBrZXkuCi0K
LSAgICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsIGJ1dCBpcyBm
aXJlZCB3aGVuCi0gICAgdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSB3aGVuIGVkaXRp
bmcgYSB0ZXh0IGZpZWxkLCBhbmQgc2VuZHMKLSAgICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGFz
IHRoZSBjb250ZXh0LgotCi0gICAgQHByb3BlcnR5IGFjdGlvbgotICAgIEB0eXBlIFN0cmluZwot
ICAgIEBkZWZhdWx0IG51bGwKLSAgKi8KLSAgYWN0aW9uOiBudWxsLAotCi0gIC8qKgotICAgIFRo
ZSBldmVudCB0aGF0IHNob3VsZCBzZW5kIHRoZSBhY3Rpb24uCi0KLSAgICBPcHRpb25zIGFyZToK
LQotICAgICogYGVudGVyYDogdGhlIHVzZXIgcHJlc3NlZCBlbnRlcgotICAgICogYGtleVByZXNz
YDogdGhlIHVzZXIgcHJlc3NlZCBhIGtleQotCi0gICAgQHByb3BlcnR5IG9uRXZlbnQKLSAgICBA
dHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBlbnRlcgotICAqLwotICBvbkV2ZW50OiAnZW50ZXIn
LAotCi0gIC8qKgotICAgIFdoZXRoZXIgdGhleSBga2V5VXBgIGV2ZW50IHRoYXQgdHJpZ2dlcnMg
YW4gYGFjdGlvbmAgdG8gYmUgc2VudCBjb250aW51ZXMKLSAgICBwcm9wYWdhdGluZyB0byBvdGhl
ciB2aWV3cy4KLQotICAgIEJ5IGRlZmF1bHQsIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0
dXJuIGtleSBvbiB0aGVpciBrZXlib2FyZCBhbmQKLSAgICB0aGUgdGV4dCBmaWVsZCBoYXMgYW4g
YGFjdGlvbmAgc2V0LCB0aGUgYWN0aW9uIHdpbGwgYmUgc2VudCB0byB0aGUgdmlldydzCi0gICAg
Y29udHJvbGxlciBhbmQgdGhlIGtleSBldmVudCB3aWxsIHN0b3AgcHJvcGFnYXRpbmcuCi0KLSAg
ICBJZiB5b3Ugd291bGQgbGlrZSBwYXJlbnQgdmlld3MgdG8gcmVjZWl2ZSB0aGUgYGtleVVwYCBl
dmVudCBldmVuIGFmdGVyIGFuCi0gICAgYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQsIHNldCBg
YnViYmxlc2AgdG8gdHJ1ZS4KLQotICAgIEBwcm9wZXJ0eSBidWJibGVzCi0gICAgQHR5cGUgQm9v
bGVhbgotICAgIEBkZWZhdWx0IGZhbHNlCi0gICovCi0gIGJ1YmJsZXM6IGZhbHNlLAotCi0gIGlu
dGVycHJldEtleUV2ZW50czogZnVuY3Rpb24oZXZlbnQpIHsKLSAgICB2YXIgbWFwID0gRW1iZXIu
VGV4dFN1cHBvcnQuS0VZX0VWRU5UUzsKLSAgICB2YXIgbWV0aG9kID0gbWFwW2V2ZW50LmtleUNv
ZGVdOwotCi0gICAgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKCk7Ci0gICAgaWYgKG1ldGhv
ZCkgeyByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50KTsgfQotICB9LAotCi0gIF9lbGVtZW50VmFs
dWVEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAndmFsdWUnLCB0aGlzLiQo
KS52YWwoKSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVGhlIGFjdGlvbiB0byBiZSBzZW50IHdoZW4g
dGhlIHVzZXIgaW5zZXJ0cyBhIG5ldyBsaW5lLgotCi0gICAgQ2FsbGVkIGJ5IHRoZSBgRW1iZXIu
VGV4dFN1cHBvcnRgIG1peGluIG9uIGtleVVwIGlmIGtleWNvZGUgbWF0Y2hlcyAxMy4KLSAgICBV
c2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGVudGVyYCBhY3Rpb24gdG8gdGhlIGNvbnRyb2xs
ZXIuCi0KLSAgICBAbWV0aG9kIGluc2VydE5ld2xpbmUKLSAgICBAcGFyYW0ge0V2ZW50fSBldmVu
dAotICAqLwotICBpbnNlcnROZXdsaW5lOiBmdW5jdGlvbihldmVudCkgewotICAgIHNlbmRBY3Rp
b24oJ2VudGVyJywgdGhpcywgZXZlbnQpOwotICAgIHNlbmRBY3Rpb24oJ2luc2VydC1uZXdsaW5l
JywgdGhpcywgZXZlbnQpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSB1c2Vy
IGhpdHMgZXNjYXBlLgotCi0gICAgQ2FsbGVkIGJ5IHRoZSBgRW1iZXIuVGV4dFN1cHBvcnRgIG1p
eGluIG9uIGtleVVwIGlmIGtleWNvZGUgbWF0Y2hlcyAyNy4KLSAgICBVc2VzIHNlbmRBY3Rpb24g
dG8gc2VuZCB0aGUgYGVzY2FwZS1wcmVzc2AgYWN0aW9uIHRvIHRoZSBjb250cm9sbGVyLgotCi0g
ICAgQG1ldGhvZCBjYW5jZWwKLSAgICBAcGFyYW0ge0V2ZW50fSBldmVudAotICAqLwotICBjYW5j
ZWw6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbignZXNjYXBlLXByZXNzJywgdGhp
cywgZXZlbnQpOwotICB9LAotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSB0ZXh0IGFyZWEg
aXMgZm9jdXNlZC4KLQotICAgIEBtZXRob2QgZm9jdXNJbgotICAgIEBwYXJhbSB7RXZlbnR9IGV2
ZW50Ci0gICovCi0gIGZvY3VzSW46IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2VuZEFjdGlvbign
Zm9jdXMtaW4nLCB0aGlzLCBldmVudCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQ2FsbGVkIHdoZW4g
dGhlIHRleHQgYXJlYSBpcyBibHVycmVkLgotCi0gICAgQG1ldGhvZCBmb2N1c091dAotICAgIEBw
YXJhbSB7RXZlbnR9IGV2ZW50Ci0gICovCi0gIGZvY3VzT3V0OiBmdW5jdGlvbihldmVudCkgewot
ICAgIHNlbmRBY3Rpb24oJ2ZvY3VzLW91dCcsIHRoaXMsIGV2ZW50KTsKLSAgfSwKLQotICAvKioK
LSAgICBUaGUgYWN0aW9uIHRvIGJlIHNlbnQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEga2V5LiBF
bmFibGVkIGJ5IHNldHRpbmcKLSAgICB0aGUgYG9uRXZlbnRgIHByb3BlcnR5IHRvIGBrZXlQcmVz
c2AuCi0KLSAgICBVc2VzIHNlbmRBY3Rpb24gdG8gc2VuZCB0aGUgYGtleVByZXNzYCBhY3Rpb24g
dG8gdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBAbWV0aG9kIGtleVByZXNzCi0gICAgQHBhcmFtIHtF
dmVudH0gZXZlbnQKLSAgKi8KLSAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgc2Vu
ZEFjdGlvbigna2V5LXByZXNzJywgdGhpcywgZXZlbnQpOwotICB9Ci0KLX0pOwotCi1FbWJlci5U
ZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0gewotICAxMzogJ2luc2VydE5ld2xpbmUnLAotICAyNzog
J2NhbmNlbCcKLX07Ci0KLS8vIEluIHByaW5jaXBsZSwgdGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNz
YXJ5LCBidXQgdGhlIGxlZ2FjeQotLy8gc2VjdGlvbkFjdGlvbiBzZW1hbnRpY3MgZm9yIFRleHRG
aWVsZCBhcmUgZGlmZmVyZW50IGZyb20KLS8vIHRoZSBjb21wb25lbnQgc2VtYW50aWNzIHNvIHRo
aXMgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlbS4KLWZ1bmN0aW9uIHNlbmRBY3Rpb24oZXZlbnROYW1l
LCB2aWV3LCBldmVudCkgewotICB2YXIgYWN0aW9uID0gZ2V0KHZpZXcsIGV2ZW50TmFtZSksCi0g
ICAgICBvbiA9IGdldCh2aWV3LCAnb25FdmVudCcpLAotICAgICAgdmFsdWUgPSBnZXQodmlldywg
J3ZhbHVlJyk7Ci0KLSAgLy8gYmFjay1jb21wYXQgc3VwcG9ydCBmb3Iga2V5UHJlc3MgYXMgYW4g
ZXZlbnQgbmFtZSBldmVuIHRob3VnaAotICAvLyBpdCdzIGFsc28gYSBtZXRob2QgbmFtZSB0aGF0
IGNvbnN1bWVzIHRoZSBldmVudCAoYW5kIHRoZXJlZm9yZQotICAvLyBpbmNvbXBhdGlibGUgd2l0
aCBzZW5kQWN0aW9uIHNlbWFudGljcykuCi0gIGlmIChvbiA9PT0gZXZlbnROYW1lIHx8IChvbiA9
PT0gJ2tleVByZXNzJyAmJiBldmVudE5hbWUgPT09ICdrZXktcHJlc3MnKSkgewotICAgIHZpZXcu
c2VuZEFjdGlvbignYWN0aW9uJywgdmFsdWUpOwotICB9Ci0KLSAgdmlldy5zZW5kQWN0aW9uKGV2
ZW50TmFtZSwgdmFsdWUpOwotCi0gIGlmIChhY3Rpb24gfHwgb24gPT09IGV2ZW50TmFtZSkgewot
ICAgIGlmKCFnZXQodmlldywgJ2J1YmJsZXMnKSkgewotICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0
aW9uKCk7Ci0gICAgfQotICB9Ci19Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioK
LUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi0vKioKLQotICBUaGUgaW50ZXJuYWwg
Y2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dCBpbnB1dHMgd2hlbiB0aGUgYHt7aW5wdXR9fWAKLSAg
aGVscGVyIGlzIHVzZWQgd2l0aCBgdHlwZWAgb2YgYHRleHRgLgotCi0gIFNlZSBbSGFuZGxlYmFy
cy5oZWxwZXJzLmlucHV0XSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0
bWwjbWV0aG9kX2lucHV0KSAgZm9yIHVzYWdlIGRldGFpbHMuCi0KLSAgIyMgTGF5b3V0IGFuZCBM
YXlvdXROYW1lIHByb3BlcnRpZXMKLQotICBCZWNhdXNlIEhUTUwgYGlucHV0YCBlbGVtZW50cyBh
cmUgc2VsZiBjbG9zaW5nIGBsYXlvdXRgIGFuZCBgbGF5b3V0TmFtZWAKLSAgcHJvcGVydGllcyB3
aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5W
aWV3Lmh0bWwpJ3MKLSAgbGF5b3V0IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAg
QGNsYXNzIFRleHRGaWVsZAotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLkNv
bXBvbmVudAotICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAotKi8KLUVtYmVyLlRleHRGaWVsZCA9
IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIuVGV4dFN1cHBvcnQsIHsKLQotICBjbGFzc05h
bWVzOiBbJ2VtYmVyLXRleHQtZmllbGQnXSwKLSAgdGFnTmFtZTogImlucHV0IiwKLSAgYXR0cmli
dXRlQmluZGluZ3M6IFsndHlwZScsICd2YWx1ZScsICdzaXplJywgJ3BhdHRlcm4nLCAnbmFtZSdd
LAotCi0gIC8qKgotICAgIFRoZSBgdmFsdWVgIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgZWxlbWVu
dC4gQXMgdGhlIHVzZXIgaW5wdXRzIHRleHQsIHRoaXMKLSAgICBwcm9wZXJ0eSBpcyB1cGRhdGVk
IGxpdmUuCi0KLSAgICBAcHJvcGVydHkgdmFsdWUKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVm
YXVsdCAiIgotICAqLwotICB2YWx1ZTogIiIsCi0KLSAgLyoqCi0gICAgVGhlIGB0eXBlYCBhdHRy
aWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCi0KLSAgICBAcHJvcGVydHkgdHlwZQotICAgIEB0
eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICJ0ZXh0IgotICAqLwotICB0eXBlOiAidGV4dCIsCi0K
LSAgLyoqCi0gICAgVGhlIGBzaXplYCBvZiB0aGUgdGV4dCBmaWVsZCBpbiBjaGFyYWN0ZXJzLgot
Ci0gICAgQHByb3BlcnR5IHNpemUKLSAgICBAdHlwZSBTdHJpbmcKLSAgICBAZGVmYXVsdCBudWxs
Ci0gICovCi0gIHNpemU6IG51bGwsCi0KLSAgLyoqCi0gICAgVGhlIGBwYXR0ZXJuYCB0aGUgcGF0
dGVybiBhdHRyaWJ1dGUgb2YgaW5wdXQgZWxlbWVudC4KLQotICAgIEBwcm9wZXJ0eSBwYXR0ZXJu
Ci0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBwYXR0ZXJuOiBu
dWxsCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qCi1AbW9kdWxlIGVtYmVy
Ci1Ac3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQs
IHNldCA9IEVtYmVyLnNldDsKLQotLyoKLSAgQGNsYXNzIEJ1dHRvbgotICBAbmFtZXNwYWNlIEVt
YmVyCi0gIEBleHRlbmRzIEVtYmVyLlZpZXcKLSAgQHVzZXMgRW1iZXIuVGFyZ2V0QWN0aW9uU3Vw
cG9ydAotICBAZGVwcmVjYXRlZAotKi8KLUVtYmVyLkJ1dHRvbiA9IEVtYmVyLlZpZXcuZXh0ZW5k
KEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczogWydlbWJlci1idXR0
b24nXSwKLSAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNBY3RpdmUnXSwKLQotICB0YWdOYW1lOiAn
YnV0dG9uJywKLQotICBwcm9wYWdhdGVFdmVudHM6IGZhbHNlLAotCi0gIGF0dHJpYnV0ZUJpbmRp
bmdzOiBbJ3R5cGUnLCAnZGlzYWJsZWQnLCAnaHJlZicsICd0YWJpbmRleCddLAotCi0gIC8qCi0g
ICAgQHByaXZhdGUKLQotICAgIE92ZXJyaWRlcyBgVGFyZ2V0QWN0aW9uU3VwcG9ydGAncyBgdGFy
Z2V0T2JqZWN0YCBjb21wdXRlZAotICAgIHByb3BlcnR5IHRvIHVzZSBIYW5kbGViYXJzLXNwZWNp
ZmljIHBhdGggcmVzb2x1dGlvbi4KLQotICAgIEBwcm9wZXJ0eSB0YXJnZXRPYmplY3QKLSAgKi8K
LSAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICB2YXIgdGFy
Z2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAgICAgICAgcm9vdCA9IGdldCh0aGlzLCAnY29u
dGV4dCcpLAotICAgICAgICBkYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKLQotICAg
IGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJykgeyByZXR1cm4gdGFyZ2V0OyB9Ci0KLSAg
ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXQocm9vdCwgdGFyZ2V0LCB7IGRhdGE6IGRhdGEg
fSk7Ci0gIH0pLnByb3BlcnR5KCd0YXJnZXQnKSwKLQotICAvLyBEZWZhdWx0cyB0byAnYnV0dG9u
JyBpZiB0YWdOYW1lIGlzICdpbnB1dCcgb3IgJ2J1dHRvbicKLSAgdHlwZTogRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oa2V5KSB7Ci0gICAgdmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWU7Ci0gICAg
aWYgKHRhZ05hbWUgPT09ICdpbnB1dCcgfHwgdGFnTmFtZSA9PT0gJ2J1dHRvbicpIHsgcmV0dXJu
ICdidXR0b24nOyB9Ci0gIH0pLAotCi0gIGRpc2FibGVkOiBmYWxzZSwKLQotICAvLyBBbGxvdyAn
YScgdGFncyB0byBhY3QgbGlrZSBidXR0b25zCi0gIGhyZWY6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgIHJldHVybiB0aGlzLnRhZ05hbWUgPT09ICdhJyA/ICcjJyA6IG51bGw7Ci0g
IH0pLAotCi0gIG1vdXNlRG93bjogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCFnZXQodGhpcywgJ2Rp
c2FibGVkJykpIHsKLSAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCB0cnVlKTsKLSAgICAgIHRo
aXMuX21vdXNlRG93biA9IHRydWU7Ci0gICAgICB0aGlzLl9tb3VzZUVudGVyZWQgPSB0cnVlOwot
ICAgIH0KLSAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9wYWdhdGVFdmVudHMnKTsKLSAgfSwKLQot
ICBtb3VzZUxlYXZlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5fbW91c2VEb3duKSB7Ci0g
ICAgICBzZXQodGhpcywgJ2lzQWN0aXZlJywgZmFsc2UpOwotICAgICAgdGhpcy5fbW91c2VFbnRl
cmVkID0gZmFsc2U7Ci0gICAgfQotICB9LAotCi0gIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKCkgewot
ICAgIGlmICh0aGlzLl9tb3VzZURvd24pIHsKLSAgICAgIHNldCh0aGlzLCAnaXNBY3RpdmUnLCB0
cnVlKTsKLSAgICAgIHRoaXMuX21vdXNlRW50ZXJlZCA9IHRydWU7Ci0gICAgfQotICB9LAotCi0g
IG1vdXNlVXA6IGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKGdldCh0aGlzLCAnaXNBY3RpdmUn
KSkgewotICAgICAgLy8gQWN0dWFsbHkgaW52b2tlIHRoZSBidXR0b24ncyB0YXJnZXQgYW5kIGFj
dGlvbi4KLSAgICAgIC8vIFRoaXMgbWV0aG9kIGNvbWVzIGZyb20gdGhlIEVtYmVyLlRhcmdldEFj
dGlvblN1cHBvcnQgbWl4aW4uCi0gICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsKLSAgICAgIHNl
dCh0aGlzLCAnaXNBY3RpdmUnLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgdGhpcy5fbW91c2VEb3du
ID0gZmFsc2U7Ci0gICAgdGhpcy5fbW91c2VFbnRlcmVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGdl
dCh0aGlzLCAncHJvcGFnYXRlRXZlbnRzJyk7Ci0gIH0sCi0KLSAga2V5RG93bjogZnVuY3Rpb24o
ZXZlbnQpIHsKLSAgICAvLyBIYW5kbGUgc3BhY2Ugb3IgZW50ZXIKLSAgICBpZiAoZXZlbnQua2V5
Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzIpIHsKLSAgICAgIHRoaXMubW91c2VE
b3duKCk7Ci0gICAgfQotICB9LAotCi0gIGtleVVwOiBmdW5jdGlvbihldmVudCkgewotICAgIC8v
IEhhbmRsZSBzcGFjZSBvciBlbnRlcgotICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMyB8fCBl
dmVudC5rZXlDb2RlID09PSAzMikgewotICAgICAgdGhpcy5tb3VzZVVwKCk7Ci0gICAgfQotICB9
LAotCi0gIC8vIFRPRE86IEhhbmRsZSBwcm9wZXIgdG91Y2ggYmVoYXZpb3IuIEluY2x1ZGluZyBz
aG91bGQgbWFrZSBpbmFjdGl2ZSB3aGVuCi0gIC8vIGZpbmdlciBtb3ZlcyBtb3JlIHRoYW4gMjB4
IG91dHNpZGUgb2YgdGhlIGVkZ2Ugb2YgdGhlIGJ1dHRvbiAodnMgbW91c2UKLSAgLy8gd2hpY2gg
Z29lcyBpbmFjdGl2ZSBhcyBzb29uIGFzIG1vdXNlIGdvZXMgb3V0IG9mIGVkZ2VzLikKLQotICB0
b3VjaFN0YXJ0OiBmdW5jdGlvbih0b3VjaCkgewotICAgIHJldHVybiB0aGlzLm1vdXNlRG93bih0
b3VjaCk7Ci0gIH0sCi0KLSAgdG91Y2hFbmQ6IGZ1bmN0aW9uKHRvdWNoKSB7Ci0gICAgcmV0dXJu
IHRoaXMubW91c2VVcCh0b3VjaCk7Ci0gIH0sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAg
RW1iZXIuZGVwcmVjYXRlKCJFbWJlci5CdXR0b24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBy
ZW1vdmVkIGZyb20gZnV0dXJlIHJlbGVhc2VzLiBDb25zaWRlciB1c2luZyB0aGUgYHt7YWN0aW9u
fX1gIGhlbHBlci4iKTsKLSAgICB0aGlzLl9zdXBlcigpOwotICB9Ci19KTsKLQotfSkoKTsKLQot
Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1o
YW5kbGViYXJzCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci0K
LS8qKgotICBUaGUgaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGV4dGFyZWEgZWxlbWVu
dCB3aGVuIHRoZSBge3t0ZXh0YXJlYX19YAotICBoZWxwZXIgaXMgdXNlZC4KLQotICBTZWUgW2hh
bmRsZWJhcnMuaGVscGVycy50ZXh0YXJlYV0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMu
aGVscGVycy5odG1sI21ldGhvZF90ZXh0YXJlYSkgIGZvciB1c2FnZSBkZXRhaWxzLgotCi0gICMj
IExheW91dCBhbmQgTGF5b3V0TmFtZSBwcm9wZXJ0aWVzCi0KLSAgQmVjYXVzZSBIVE1MIGB0ZXh0
YXJlYWAgZWxlbWVudHMgZG8gbm90IGNvbnRhaW4gaW5uZXIgSFRNTCB0aGUgYGxheW91dGAgYW5k
Ci0gIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGFwcGxpZWQuIFNlZSBbRW1i
ZXIuVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLlZpZXcuaHRtbCkncwotICBsYXlvdXQgc2VjdGlv
biBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICBAY2xhc3MgVGV4dEFyZWEKLSAgQG5hbWVzcGFj
ZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5Db21wb25lbnQKLSAgQHVzZXMgRW1iZXIuVGV4dFN1
cHBvcnQKLSovCi1FbWJlci5UZXh0QXJlYSA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIu
VGV4dFN1cHBvcnQsIHsKLSAgY2xhc3NOYW1lczogWydlbWJlci10ZXh0LWFyZWEnXSwKLQotICB0
YWdOYW1lOiAidGV4dGFyZWEiLAotICBhdHRyaWJ1dGVCaW5kaW5nczogWydyb3dzJywgJ2NvbHMn
LCAnbmFtZSddLAotICByb3dzOiBudWxsLAotICBjb2xzOiBudWxsLAotCi0gIF91cGRhdGVFbGVt
ZW50VmFsdWU6IEVtYmVyLm9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgewotICAgIC8vIFdl
IGRvIHRoaXMgY2hlY2sgc28gY3Vyc29yIHBvc2l0aW9uIGRvZXNuJ3QgZ2V0IGFmZmVjdGVkIGlu
IElFCi0gICAgdmFyIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAotICAgICAgICAkZWwgPSB0
aGlzLiQoKTsKLSAgICBpZiAoJGVsICYmIHZhbHVlICE9PSAkZWwudmFsKCkpIHsKLSAgICAgICRl
bC52YWwodmFsdWUpOwotICAgIH0KLSAgfSksCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAg
dGhpcy5fc3VwZXIoKTsKLSAgICB0aGlzLm9uKCJkaWRJbnNlcnRFbGVtZW50IiwgdGhpcywgdGhp
cy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKLSAgfQotCi19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qanNoaW50IGVxZXFlcTpmYWxzZSAqLwotCi0vKioKLUBtb2R1bGUgZW1iZXIK
LUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotKi8KLQotdmFyIHNldCA9IEVtYmVyLnNldCwK
LSAgICBnZXQgPSBFbWJlci5nZXQsCi0gICAgaW5kZXhPZiA9IEVtYmVyLkVudW1lcmFibGVVdGls
cy5pbmRleE9mLAotICAgIGluZGV4ZXNPZiA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleGVz
T2YsCi0gICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAotICAgIHJl
cGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZSwKLSAgICBpc0FycmF5ID0gRW1i
ZXIuaXNBcnJheSwKLSAgICBwcmVjb21waWxlVGVtcGxhdGUgPSBFbWJlci5IYW5kbGViYXJzLmNv
bXBpbGU7Ci0KLUVtYmVyLlNlbGVjdE9wdGlvbiA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKLSAgdGFn
TmFtZTogJ29wdGlvbicsCi0gIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3ZhbHVlJywgJ3NlbGVjdGVk
J10sCi0KLSAgZGVmYXVsdFRlbXBsYXRlOiBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0g
ICAgb3B0aW9ucyA9IHsgZGF0YTogb3B0aW9ucy5kYXRhLCBoYXNoOiB7fSB9OwotICAgIEVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycy5iaW5kLmNhbGwoY29udGV4dCwgInZpZXcubGFiZWwiLCBvcHRp
b25zKTsKLSAgfSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmxhYmVsUGF0aERp
ZENoYW5nZSgpOwotICAgIHRoaXMudmFsdWVQYXRoRGlkQ2hhbmdlKCk7Ci0KLSAgICB0aGlzLl9z
dXBlcigpOwotICB9LAotCi0gIHNlbGVjdGVkOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsK
LSAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBzZWxlY3Rp
b24gPSBnZXQodGhpcywgJ3BhcmVudFZpZXcuc2VsZWN0aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlz
LCAncGFyZW50Vmlldy5tdWx0aXBsZScpKSB7Ci0gICAgICByZXR1cm4gc2VsZWN0aW9uICYmIGlu
ZGV4T2Yoc2VsZWN0aW9uLCBjb250ZW50LnZhbHVlT2YoKSkgPiAtMTsKLSAgICB9IGVsc2Ugewot
ICAgICAgLy8gUHJpbWl0aXZlcyBnZXQgcGFzc2VkIHRocm91Z2ggYmluZGluZ3MgYXMgb2JqZWN0
cy4uLiBzaW5jZQotICAgICAgLy8gYG5ldyBOdW1iZXIoNCkgIT09IDRgLCB3ZSB1c2UgYD09YCBi
ZWxvdwotICAgICAgcmV0dXJuIGNvbnRlbnQgPT0gc2VsZWN0aW9uOwotICAgIH0KLSAgfSkucHJv
cGVydHkoJ2NvbnRlbnQnLCAncGFyZW50Vmlldy5zZWxlY3Rpb24nKSwKLQotICBsYWJlbFBhdGhE
aWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdwYXJlbnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcsIGZ1
bmN0aW9uKCkgewotICAgIHZhciBsYWJlbFBhdGggPSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0
aW9uTGFiZWxQYXRoJyk7Ci0KLSAgICBpZiAoIWxhYmVsUGF0aCkgeyByZXR1cm47IH0KLQotICAg
IEVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsICdsYWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0
aW9uKCkgewotICAgICAgcmV0dXJuIGdldCh0aGlzLCBsYWJlbFBhdGgpOwotICAgIH0pLnByb3Bl
cnR5KGxhYmVsUGF0aCkpOwotICB9KSwKLQotICB2YWx1ZVBhdGhEaWRDaGFuZ2U6IEVtYmVyLm9i
c2VydmVyKCdwYXJlbnRWaWV3Lm9wdGlvblZhbHVlUGF0aCcsIGZ1bmN0aW9uKCkgewotICAgIHZh
ciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ3BhcmVudFZpZXcub3B0aW9uVmFsdWVQYXRoJyk7Ci0K
LSAgICBpZiAoIXZhbHVlUGF0aCkgeyByZXR1cm47IH0KLQotICAgIEVtYmVyLmRlZmluZVByb3Bl
cnR5KHRoaXMsICd2YWx1ZScsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewotICAgICAgcmV0
dXJuIGdldCh0aGlzLCB2YWx1ZVBhdGgpOwotICAgIH0pLnByb3BlcnR5KHZhbHVlUGF0aCkpOwot
ICB9KQotfSk7Ci0KLUVtYmVyLlNlbGVjdE9wdGdyb3VwID0gRW1iZXIuQ29sbGVjdGlvblZpZXcu
ZXh0ZW5kKHsKLSAgdGFnTmFtZTogJ29wdGdyb3VwJywKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsn
bGFiZWwnXSwKLQotICBzZWxlY3Rpb25CaW5kaW5nOiAncGFyZW50Vmlldy5zZWxlY3Rpb24nLAot
ICBtdWx0aXBsZUJpbmRpbmc6ICdwYXJlbnRWaWV3Lm11bHRpcGxlJywKLSAgb3B0aW9uTGFiZWxQ
YXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uTGFiZWxQYXRoJywKLSAgb3B0aW9uVmFsdWVQ
YXRoQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uVmFsdWVQYXRoJywKLQotICBpdGVtVmlld0Ns
YXNzQmluZGluZzogJ3BhcmVudFZpZXcub3B0aW9uVmlldycKLX0pOwotCi0vKioKLSAgVGhlIGBF
bWJlci5TZWxlY3RgIHZpZXcgY2xhc3MgcmVuZGVycyBhCi0gIFtzZWxlY3RdKGh0dHBzOi8vZGV2
ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxlbWVudC9zZWxlY3QpIEhUTUwgZWxlbWVudCwK
LSAgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hvb3NlIGZyb20gYSBsaXN0IG9mIG9wdGlvbnMuCi0K
LSAgVGhlIHRleHQgYW5kIGB2YWx1ZWAgcHJvcGVydHkgb2YgZWFjaCBgPG9wdGlvbj5gIGVsZW1l
bnQgd2l0aGluIHRoZQotICBgPHNlbGVjdD5gIGVsZW1lbnQgYXJlIHBvcHVsYXRlZCBmcm9tIHRo
ZSBvYmplY3RzIGluIHRoZSBgRWxlbWVudC5TZWxlY3RgJ3MKLSAgYGNvbnRlbnRgIHByb3BlcnR5
LiBUaGUgdW5kZXJseWluZyBkYXRhIG9iamVjdCBvZiB0aGUgc2VsZWN0ZWQgYDxvcHRpb24+YCBp
cwotICBzdG9yZWQgaW4gdGhlIGBFbGVtZW50LlNlbGVjdGAncyBgdmFsdWVgIHByb3BlcnR5Lgot
Ci0gICMjIFRoZSBDb250ZW50IFByb3BlcnR5IChhcnJheSBvZiBzdHJpbmdzKQotCi0gIFRoZSBz
aW1wbGVzdCB2ZXJzaW9uIG9mIGFuIGBFbWJlci5TZWxlY3RgIHRha2VzIGFuIGFycmF5IG9mIHN0
cmluZ3MgYXMgaXRzCi0gIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHN0cmluZyB3aWxsIGJlIHVz
ZWQgYXMgYm90aCB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBhbmQKLSAgdGhlIGlubmVyIHRleHQgb2Yg
ZWFjaCBgPG9wdGlvbj5gIGVsZW1lbnQgaW5zaWRlIHRoZSByZW5kZXJlZCBgPHNlbGVjdD5gLgot
Ci0gIEV4YW1wbGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9s
bGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIG5hbWVzOiBbIlllaHVkYSIsICJU
b20iXQotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2Vs
ZWN0IGNvbnRlbnQ9bmFtZXN9fQotICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxv
d2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXItc2VsZWN0Ij4K
LSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAgIDxvcHRpb24g
dmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKLQotICBZb3UgY2Fu
IGNvbnRyb2wgd2hpY2ggYDxvcHRpb24+YCBpcyBzZWxlY3RlZCB0aHJvdWdoIHRoZSBgRW1iZXIu
U2VsZWN0YCdzCi0gIGB2YWx1ZWAgcHJvcGVydHk6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHNl
bGVjdGVkTmFtZTogJ1RvbScsCi0gICAgbmFtZXM6IFsiWWVodWRhIiwgIlRvbSJdCi0gIH0pOwot
ICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAgICAgICAg
IGNvbnRlbnQ9bmFtZXMKLSAgICAgICAgIHZhbHVlPXNlbGVjdGVkTmFtZQotICB9fQotICBgYGAK
LQotICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHdpdGggdGhlIGA8b3B0aW9u
PmAgZm9yICdUb20nIHNlbGVjdGVkOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1i
ZXItc2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgot
ICAgIDxvcHRpb24gdmFsdWU9IlRvbSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4K
LSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0gIEEgdXNlciBpbnRlcmFjdGluZyB3aXRoIHRoZSByZW5k
ZXJlZCBgPHNlbGVjdD5gIHRvIGNob29zZSAiWWVodWRhIiB3b3VsZAotICB1cGRhdGUgdGhlIHZh
bHVlIG9mIGBzZWxlY3RlZE5hbWVgIHRvICJZZWh1ZGEiLgotCi0gICMjIFRoZSBDb250ZW50IFBy
b3BlcnR5IChhcnJheSBvZiBPYmplY3RzKQotCi0gIEFuIGBFbWJlci5TZWxlY3RgIGNhbiBhbHNv
IHRha2UgYW4gYXJyYXkgb2YgSmF2YVNjcmlwdCBvciBFbWJlciBvYmplY3RzIGFzCi0gIGl0cyBg
Y29udGVudGAgcHJvcGVydHkuCi0KLSAgV2hlbiB1c2luZyBvYmplY3RzIHlvdSBuZWVkIHRvIHRl
bGwgdGhlIGBFbWJlci5TZWxlY3RgIHdoaWNoIHByb3BlcnR5IHNob3VsZAotICBiZSBhY2Nlc3Nl
ZCBvbiBlYWNoIG9iamVjdCB0byBzdXBwbHkgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBg
PG9wdGlvbj5gCi0gIGFuZCB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCB0byBzdXBwbHkg
dGhlIGVsZW1lbnQgdGV4dC4KLQotICBUaGUgYG9wdGlvblZhbHVlUGF0aGAgb3B0aW9uIGlzIHVz
ZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCBvbiBlYWNoIG9iamVjdCB0bwotICB0aGUgZGVzaXJlZCBw
cm9wZXJ0eSBmb3IgdGhlIGB2YWx1ZWAgYXR0cmlidXRlLiBUaGUgYG9wdGlvbkxhYmVsUGF0aGAK
LSAgc3BlY2lmaWVzIHRoZSBwYXRoIG9uIGVhY2ggb2JqZWN0IHRvIHRoZSBkZXNpcmVkIHByb3Bl
cnR5IGZvciB0aGUKLSAgZWxlbWVudCdzIHRleHQuIEJvdGggcGF0aHMgbXVzdCByZWZlcmVuY2Ug
ZWFjaCBvYmplY3QgaXRzZWxmIGFzIGBjb250ZW50YDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFw
cC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7Ci0gICAg
cHJvZ3JhbW1lcnM6IFsKLSAgICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0sCi0gICAg
ICB7Zmlyc3ROYW1lOiAiVG9tIiwgICAgaWQ6IDJ9Ci0gICAgXQotICB9KTsKLSAgYGBgCi0KLSAg
YGBgaGFuZGxlYmFycwotICB7e3ZpZXcgRW1iZXIuU2VsZWN0Ci0gICAgICAgICBjb250ZW50PXBy
b2dyYW1tZXJzCi0gICAgICAgICBvcHRpb25WYWx1ZVBhdGg9ImNvbnRlbnQuaWQiCi0gICAgICAg
ICBvcHRpb25MYWJlbFBhdGg9ImNvbnRlbnQuZmlyc3ROYW1lIn19Ci0gIGBgYAotCi0gIFdvdWxk
IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6Ci0KLSAgYGBgaHRtbAotICA8c2VsZWN0IGNs
YXNzPSJlbWJlci1zZWxlY3QiPgotICAgIDxvcHRpb24gdmFsdWU9IjEiPlllaHVkYTwvb3B0aW9u
PgotICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwvb3B0aW9uPgotICA8L3NlbGVjdD4KLSAgYGBg
Ci0KLSAgVGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCBgPG9wdGlvbj5gIHdp
dGhpbiBhbiBgRW1iZXIuU2VsZWN0YAotICBjYW4gYmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBvbiBh
bm90aGVyIG9iamVjdDoKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5BcHBsaWNhdGlvbkNvbnRy
b2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7Ci0gICAgcHJvZ3JhbW1lcnM6IFsKLSAg
ICAgIHtmaXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0sCi0gICAgICB7Zmlyc3ROYW1lOiAiVG9t
IiwgICAgaWQ6IDJ9Ci0gICAgXSwKLSAgICBjdXJyZW50UHJvZ3JhbW1lcjogewotICAgICAgaWQ6
IDIKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJl
ci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIG9wdGlvblZh
bHVlUGF0aD0iY29udGVudC5pZCIKLSAgICAgICAgIG9wdGlvbkxhYmVsUGF0aD0iY29udGVudC5m
aXJzdE5hbWUiCi0gICAgICAgICB2YWx1ZT1jdXJyZW50UHJvZ3JhbW1lci5pZH19Ci0gIGBgYAot
Ci0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0aCBhIHNlbGVjdGVkIG9w
dGlvbjoKLQotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAg
PG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMiIg
c2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0gIGBgYAotCi0g
IEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1lbnQgYnkgc2VsZWN0aW5nIHRoZSBm
aXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxsIHVwZGF0ZSB0aGUgYGlkYCBvZiBgY3VycmVu
dFByb2dyYW1tZXJgCi0gIHRvIG1hdGNoIHRoZSBgdmFsdWVgIHByb3BlcnR5IG9mIHRoZSBuZXds
eSBzZWxlY3RlZCBgPG9wdGlvbj5gLgotCi0gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29udHJv
bCBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgdW5kZXJseWluZyBvYmplY3RzCi0gIHVzZWQgdG8gcmVu
ZGVyIGVhY2ggb2JqZWN0IGJ5IGJpbmRpbmcgdGhlIGBzZWxlY3Rpb25gIG9wdGlvbi4gV2hlbiB0
aGUgc2VsZWN0ZWQKLSAgYDxvcHRpb24+YCBpcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgcGF0aCBw
cm92aWRlZCB0byBgc2VsZWN0aW9uYAotICB3aWxsIGJlIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNv
bnRlbnQgb2JqZWN0IG9mIHRoZSByZW5kZXJlZCBgPG9wdGlvbj5gCi0gIGVsZW1lbnQ6Ci0KLSAg
YGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkUGVyc29uOiBudWxsLAotICAgIHByb2dyYW1tZXJz
OiBbCi0gICAgICB7Zmlyc3ROYW1lOiAiWWVodWRhIiwgaWQ6IDF9LAotICAgICAge2ZpcnN0TmFt
ZTogIlRvbSIsICAgIGlkOiAyfQotICAgIF0KLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJh
cnMKLSAge3t2aWV3IEVtYmVyLlNlbGVjdAotICAgICAgICAgY29udGVudD1wcm9ncmFtbWVycwot
ICAgICAgICAgb3B0aW9uVmFsdWVQYXRoPSJjb250ZW50LmlkIgotICAgICAgICAgb3B0aW9uTGFi
ZWxQYXRoPSJjb250ZW50LmZpcnN0TmFtZSIKLSAgICAgICAgIHNlbGVjdGlvbj1zZWxlY3RlZFBl
cnNvbn19Ci0gIGBgYAotCi0gIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0
aCBhIHNlbGVjdGVkIG9wdGlvbjoKLQotICBgYGBodG1sCi0gIDxzZWxlY3QgY2xhc3M9ImVtYmVy
LXNlbGVjdCI+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iMSI+WWVodWRhPC9vcHRpb24+Ci0gICAgPG9w
dGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KLSAgPC9zZWxl
Y3Q+Ci0gIGBgYAotCi0gIEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1lbnQgYnkg
c2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KLSAgKCdZZWh1ZGEnKSB3aWxsIHVwZGF0ZSB0aGUg
YHNlbGVjdGVkUGVyc29uYCB0byBtYXRjaCB0aGUgb2JqZWN0IG9mCi0gIHRoZSBuZXdseSBzZWxl
Y3RlZCBgPG9wdGlvbj5gLiBJbiB0aGlzIGNhc2UgaXQgaXMgdGhlIGZpcnN0IG9iamVjdAotICBp
biB0aGUgYHByb2dyYW1tZXJzYAotCi0gICMjIFN1cHBseWluZyBhIFByb21wdAotCi0gIEEgYG51
bGxgIHZhbHVlIGZvciB0aGUgYEVtYmVyLlNlbGVjdGAncyBgdmFsdWVgIG9yIGBzZWxlY3Rpb25g
IHByb3BlcnR5Ci0gIHJlc3VsdHMgaW4gdGhlcmUgYmVpbmcgbm8gYDxvcHRpb24+YCB3aXRoIGEg
YHNlbGVjdGVkYCBhdHRyaWJ1dGU6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHNlbGVjdGVkUHJv
Z3JhbW1lcjogbnVsbCwKLSAgICBwcm9ncmFtbWVyczogWwotICAgICAgIlllaHVkYSIsCi0gICAg
ICAiVG9tIgotICAgIF0KLSAgfSk7Ci0gIGBgYAotCi0gIGBgYCBoYW5kbGViYXJzCi0gIHt7dmll
dyBFbWJlci5TZWxlY3QKLSAgICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIHZh
bHVlPXNlbGVjdGVkUHJvZ3JhbW1lcgotICB9fQotICBgYGAKLQotICBXb3VsZCByZXN1bHQgaW4g
dGhlIGZvbGxvd2luZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHNlbGVjdCBjbGFzcz0iZW1iZXIt
c2VsZWN0Ij4KLSAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0aW9uPgotICAg
IDxvcHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+Ci0gIDwvc2VsZWN0PgotICBgYGAKLQot
ICBBbHRob3VnaCBgc2VsZWN0ZWRQcm9ncmFtbWVyYCBpcyBgbnVsbGAgYW5kIG5vIGA8b3B0aW9u
PmAKLSAgaGFzIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgdGhlIHJlbmRlcmVkIEhUTUwgd2lsbCBk
aXNwbGF5IHRoZQotICBmaXJzdCBpdGVtIGFzIHRob3VnaCBpdCB3ZXJlIHNlbGVjdGVkLiBZb3Ug
Y2FuIHN1cHBseSBhIHN0cmluZwotICB2YWx1ZSBmb3IgdGhlIGBFbWJlci5TZWxlY3RgIHRvIGRp
c3BsYXkgd2hlbiB0aGVyZSBpcyBubyBzZWxlY3Rpb24KLSAgd2l0aCB0aGUgYHByb21wdGAgb3B0
aW9uOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVt
YmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICBzZWxlY3RlZFByb2dyYW1tZXI6IG51bGwsCi0g
ICAgcHJvZ3JhbW1lcnM6IFsKLSAgICAgICJZZWh1ZGEiLAotICAgICAgIlRvbSIKLSAgICBdCi0g
IH0pOwotICBgYGAKLQotICBgYGBoYW5kbGViYXJzCi0gIHt7dmlldyBFbWJlci5TZWxlY3QKLSAg
ICAgICAgIGNvbnRlbnQ9cHJvZ3JhbW1lcnMKLSAgICAgICAgIHZhbHVlPXNlbGVjdGVkUHJvZ3Jh
bW1lcgotICAgICAgICAgcHJvbXB0PSJQbGVhc2Ugc2VsZWN0IGEgbmFtZSIKLSAgfX0KLSAgYGBg
Ci0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0g
IDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+Ci0gICAgPG9wdGlvbj5QbGVhc2Ugc2VsZWN0
IGEgbmFtZTwvb3B0aW9uPgotICAgIDxvcHRpb24gdmFsdWU9IlllaHVkYSI+WWVodWRhPC9vcHRp
b24+Ci0gICAgPG9wdGlvbiB2YWx1ZT0iVG9tIj5Ub208L29wdGlvbj4KLSAgPC9zZWxlY3Q+Ci0g
IGBgYAotCi0gIEBjbGFzcyBTZWxlY3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBF
bWJlci5WaWV3Ci0qLwotRW1iZXIuU2VsZWN0ID0gRW1iZXIuVmlldy5leHRlbmQoewotICB0YWdO
YW1lOiAnc2VsZWN0JywKLSAgY2xhc3NOYW1lczogWydlbWJlci1zZWxlY3QnXSwKLSAgZGVmYXVs
dFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9uIGFub255bW91cyhI
YW5kbGViYXJzLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKLXRoaXMuY29tcGlsZXJJ
bmZvID0gWzQsJz49IDEuMC4wJ107Ci1oZWxwZXJzID0gdGhpcy5tZXJnZShoZWxwZXJzLCBFbWJl
ci5IYW5kbGViYXJzLmhlbHBlcnMpOyBkYXRhID0gZGF0YSB8fCB7fTsKLSAgdmFyIGJ1ZmZlciA9
ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFzaENvbnRleHRzLCBlc2NhcGVFeHByZXNzaW9uPXRo
aXMuZXNjYXBlRXhwcmVzc2lvbiwgc2VsZj10aGlzOwotCi1mdW5jdGlvbiBwcm9ncmFtMShkZXB0
aDAsZGF0YSkgewotICAKLSAgdmFyIGJ1ZmZlciA9ICcnLCBzdGFjazEsIGhhc2hUeXBlcywgaGFz
aENvbnRleHRzOwotICBkYXRhLmJ1ZmZlci5wdXNoKCI8b3B0aW9uIHZhbHVlPVwiXCI+Iik7Ci0g
IGhhc2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVy
cy5fdHJpYWdlTXVzdGFjaGUuY2FsbChkZXB0aDAsICJ2aWV3LnByb21wdCIsIHtoYXNoOnt9LGNv
bnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhh
c2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEgPT09
IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9Ci0gIGRhdGEuYnVmZmVyLnB1c2goIjwv
b3B0aW9uPiIpOwotICByZXR1cm4gYnVmZmVyOwotICB9Ci0KLWZ1bmN0aW9uIHByb2dyYW0zKGRl
cHRoMCxkYXRhKSB7Ci0gIAotICB2YXIgc3RhY2sxLCBoYXNoVHlwZXMsIGhhc2hDb250ZXh0czsK
LSAgaGFzaFR5cGVzID0ge307Ci0gIGhhc2hDb250ZXh0cyA9IHt9OwotICBzdGFjazEgPSBoZWxw
ZXJzLmVhY2guY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3VwZWRDb250ZW50Iiwge2hhc2g6e30saW52
ZXJzZTpzZWxmLm5vb3AsZm46c2VsZi5wcm9ncmFtKDQsIHByb2dyYW00LCBkYXRhKSxjb250ZXh0
czpbZGVwdGgwXSx0eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlw
ZXM6aGFzaFR5cGVzLGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7
IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sxKTsgfQotICBlbHNlIHsgZGF0YS5idWZmZXIucHVzaCgn
Jyk7IH0KLSAgfQotZnVuY3Rpb24gcHJvZ3JhbTQoZGVwdGgwLGRhdGEpIHsKLSAgCi0gIHZhciBo
YXNoQ29udGV4dHMsIGhhc2hUeXBlczsKLSAgaGFzaENvbnRleHRzID0geydjb250ZW50JzogZGVw
dGgwLCdsYWJlbCc6IGRlcHRoMH07Ci0gIGhhc2hUeXBlcyA9IHsnY29udGVudCc6ICJJRCIsJ2xh
YmVsJzogIklEIn07Ci0gIGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhwcmVzc2lvbihoZWxwZXJz
LnZpZXcuY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3VwVmlldyIsIHtoYXNoOnsKLSAgICAnY29udGVu
dCc6ICgiY29udGVudCIpLAotICAgICdsYWJlbCc6ICgibGFiZWwiKQotICB9LGNvbnRleHRzOltk
ZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRzLGhhc2hUeXBlczpo
YXNoVHlwZXMsZGF0YTpkYXRhfSkpKTsKLSAgfQotCi1mdW5jdGlvbiBwcm9ncmFtNihkZXB0aDAs
ZGF0YSkgewotICAKLSAgdmFyIHN0YWNrMSwgaGFzaFR5cGVzLCBoYXNoQ29udGV4dHM7Ci0gIGhh
c2hUeXBlcyA9IHt9OwotICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVycy5l
YWNoLmNhbGwoZGVwdGgwLCAidmlldy5jb250ZW50Iiwge2hhc2g6e30saW52ZXJzZTpzZWxmLm5v
b3AsZm46c2VsZi5wcm9ncmFtKDcsIHByb2dyYW03LCBkYXRhKSxjb250ZXh0czpbZGVwdGgwXSx0
eXBlczpbIklEIl0saGFzaENvbnRleHRzOmhhc2hDb250ZXh0cyxoYXNoVHlwZXM6aGFzaFR5cGVz
LGRhdGE6ZGF0YX0pOwotICBpZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVy
LnB1c2goc3RhY2sxKTsgfQotICBlbHNlIHsgZGF0YS5idWZmZXIucHVzaCgnJyk7IH0KLSAgfQot
ZnVuY3Rpb24gcHJvZ3JhbTcoZGVwdGgwLGRhdGEpIHsKLSAgCi0gIHZhciBoYXNoQ29udGV4dHMs
IGhhc2hUeXBlczsKLSAgaGFzaENvbnRleHRzID0geydjb250ZW50JzogZGVwdGgwfTsKLSAgaGFz
aFR5cGVzID0geydjb250ZW50JzogIklEIn07Ci0gIGRhdGEuYnVmZmVyLnB1c2goZXNjYXBlRXhw
cmVzc2lvbihoZWxwZXJzLnZpZXcuY2FsbChkZXB0aDAsICJ2aWV3Lm9wdGlvblZpZXciLCB7aGFz
aDp7Ci0gICAgJ2NvbnRlbnQnOiAoIiIpCi0gIH0sY29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJ
RCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFzaFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRh
dGF9KSkpOwotICB9Ci0KLSAgaGFzaFR5cGVzID0ge307Ci0gIGhhc2hDb250ZXh0cyA9IHt9Owot
ICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAidmlldy5wcm9tcHQiLCB7aGFz
aDp7fSxpbnZlcnNlOnNlbGYubm9vcCxmbjpzZWxmLnByb2dyYW0oMSwgcHJvZ3JhbTEsIGRhdGEp
LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxoYXNoQ29udGV4dHM6aGFzaENvbnRleHRz
LGhhc2hUeXBlczpoYXNoVHlwZXMsZGF0YTpkYXRhfSk7Ci0gIGlmKHN0YWNrMSB8fCBzdGFjazEg
PT09IDApIHsgZGF0YS5idWZmZXIucHVzaChzdGFjazEpOyB9Ci0gIGhhc2hUeXBlcyA9IHt9Owot
ICBoYXNoQ29udGV4dHMgPSB7fTsKLSAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRo
MCwgInZpZXcub3B0aW9uR3JvdXBQYXRoIiwge2hhc2g6e30saW52ZXJzZTpzZWxmLnByb2dyYW0o
NiwgcHJvZ3JhbTYsIGRhdGEpLGZuOnNlbGYucHJvZ3JhbSgzLCBwcm9ncmFtMywgZGF0YSksY29u
dGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGhhc2hDb250ZXh0czpoYXNoQ29udGV4dHMsaGFz
aFR5cGVzOmhhc2hUeXBlcyxkYXRhOmRhdGF9KTsKLSAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0g
MCkgeyBkYXRhLmJ1ZmZlci5wdXNoKHN0YWNrMSk7IH0KLSAgcmV0dXJuIGJ1ZmZlcjsKLSAgCi19
KSwKLSAgYXR0cmlidXRlQmluZGluZ3M6IFsnbXVsdGlwbGUnLCAnZGlzYWJsZWQnLCAndGFiaW5k
ZXgnLCAnbmFtZSddLAotCi0gIC8qKgotICAgIFRoZSBgbXVsdGlwbGVgIGF0dHJpYnV0ZSBvZiB0
aGUgc2VsZWN0IGVsZW1lbnQuIEluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlCi0gICAgb3B0aW9u
cyBjYW4gYmUgc2VsZWN0ZWQuCi0KLSAgICBAcHJvcGVydHkgbXVsdGlwbGUKLSAgICBAdHlwZSBC
b29sZWFuCi0gICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgbXVsdGlwbGU6IGZhbHNlLAotCi0g
IC8qKgotICAgIFRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQu
IEluZGljYXRlcyB3aGV0aGVyCi0gICAgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgZnJvbSBpbnRl
cmFjdGlvbnMuCi0KLSAgICBAcHJvcGVydHkgZGlzYWJsZWQKLSAgICBAdHlwZSBCb29sZWFuCi0g
ICAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgZGlzYWJsZWQ6IGZhbHNlLAotCi0gIC8qKgotICAg
IFRoZSBsaXN0IG9mIG9wdGlvbnMuCi0KLSAgICBJZiBgb3B0aW9uTGFiZWxQYXRoYCBhbmQgYG9w
dGlvblZhbHVlUGF0aGAgYXJlIG5vdCBvdmVycmlkZGVuLCB0aGlzIHNob3VsZAotICAgIGJlIGEg
bGlzdCBvZiBzdHJpbmdzLCB3aGljaCB3aWxsIHNlcnZlIHNpbXVsdGFuZW91c2x5IGFzIGxhYmVs
cyBhbmQgdmFsdWVzLgotCi0gICAgT3RoZXJ3aXNlLCB0aGlzIHNob3VsZCBiZSBhIGxpc3Qgb2Yg
b2JqZWN0cy4gRm9yIGluc3RhbmNlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVyLlNl
bGVjdC5jcmVhdGUoewotICAgICAgY29udGVudDogRW1iZXIuQShbCi0gICAgICAgICAgeyBpZDog
MSwgZmlyc3ROYW1lOiAnWWVodWRhJyB9LAotICAgICAgICAgIHsgaWQ6IDIsIGZpcnN0TmFtZTog
J1RvbScgfQotICAgICAgICBdKSwKLSAgICAgIG9wdGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQuZmly
c3ROYW1lJywKLSAgICAgIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQuaWQnCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAcHJvcGVydHkgY29udGVudAotICAgIEB0eXBlIEFycmF5Ci0gICAgQGRl
ZmF1bHQgbnVsbAotICAqLwotICBjb250ZW50OiBudWxsLAotCi0gIC8qKgotICAgIFdoZW4gYG11
bHRpcGxlYCBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCBvZiBgY29udGVudGAgdGhhdCBpcyBjdXJy
ZW50bHkKLSAgICBzZWxlY3RlZCwgaWYgYW55LgotCi0gICAgV2hlbiBgbXVsdGlwbGVgIGlzIGB0
cnVlYCwgYW4gYXJyYXkgb2Ygc3VjaCBlbGVtZW50cy4KLQotICAgIEBwcm9wZXJ0eSBzZWxlY3Rp
b24KLSAgICBAdHlwZSBPYmplY3Qgb3IgQXJyYXkKLSAgICBAZGVmYXVsdCBudWxsCi0gICovCi0g
IHNlbGVjdGlvbjogbnVsbCwKLQotICAvKioKLSAgICBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUg
KHdoZW4gYG11bHRpcGxlYCBpcyBgZmFsc2VgKSwgdmFsdWUgY2FuIGJlIHVzZWQgdG8KLSAgICBn
ZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgdmFsdWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkg
aXQncyB2YWx1ZS4KLQotICAgIEl0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG11bHRp
cGxlIHNlbGVjdGlvbiBtb2RlLgotCi0gICAgQHByb3BlcnR5IHZhbHVlCi0gICAgQHR5cGUgU3Ry
aW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICB2YWx1ZTogRW1iZXIuY29tcHV0ZWQoZnVu
Y3Rpb24oa2V5LCB2YWx1ZSkgewotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IHJl
dHVybiB2YWx1ZTsgfQotICAgIHZhciB2YWx1ZVBhdGggPSBnZXQodGhpcywgJ29wdGlvblZhbHVl
UGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/LywgJycpOwotICAgIHJldHVybiB2YWx1ZVBhdGgg
PyBnZXQodGhpcywgJ3NlbGVjdGlvbi4nICsgdmFsdWVQYXRoKSA6IGdldCh0aGlzLCAnc2VsZWN0
aW9uJyk7Ci0gIH0pLnByb3BlcnR5KCdzZWxlY3Rpb24nKSwKLQotICAvKioKLSAgICBJZiBnaXZl
biwgYSB0b3AtbW9zdCBkdW1teSBvcHRpb24gd2lsbCBiZSByZW5kZXJlZCB0byBzZXJ2ZSBhcyBh
IHVzZXIKLSAgICBwcm9tcHQuCi0KLSAgICBAcHJvcGVydHkgcHJvbXB0Ci0gICAgQHR5cGUgU3Ry
aW5nCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBwcm9tcHQ6IG51bGwsCi0KLSAgLyoqCi0g
ICAgVGhlIHBhdGggb2YgdGhlIG9wdGlvbiBsYWJlbHMuIFNlZSBbY29udGVudF0oL2FwaS9jbGFz
c2VzL0VtYmVyLlNlbGVjdC5odG1sI3Byb3BlcnR5X2NvbnRlbnQpLgotCi0gICAgQHByb3BlcnR5
IG9wdGlvbkxhYmVsUGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0ICdjb250ZW50
JwotICAqLwotICBvcHRpb25MYWJlbFBhdGg6ICdjb250ZW50JywKLQotICAvKioKLSAgICBUaGUg
cGF0aCBvZiB0aGUgb3B0aW9uIHZhbHVlcy4gU2VlIFtjb250ZW50XSgvYXBpL2NsYXNzZXMvRW1i
ZXIuU2VsZWN0Lmh0bWwjcHJvcGVydHlfY29udGVudCkuCi0KLSAgICBAcHJvcGVydHkgb3B0aW9u
VmFsdWVQYXRoCi0gICAgQHR5cGUgU3RyaW5nCi0gICAgQGRlZmF1bHQgJ2NvbnRlbnQnCi0gICov
Ci0gIG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQnLAotCi0gIC8qKgotICAgIFRoZSBwYXRoIG9m
IHRoZSBvcHRpb24gZ3JvdXAuCi0gICAgV2hlbiB0aGlzIHByb3BlcnR5IGlzIHVzZWQsIGBjb250
ZW50YCBzaG91bGQgYmUgc29ydGVkIGJ5IGBvcHRpb25Hcm91cFBhdGhgLgotCi0gICAgQHByb3Bl
cnR5IG9wdGlvbkdyb3VwUGF0aAotICAgIEB0eXBlIFN0cmluZwotICAgIEBkZWZhdWx0IG51bGwK
LSAgKi8KLSAgb3B0aW9uR3JvdXBQYXRoOiBudWxsLAotCi0gIC8qKgotICAgIFRoZSB2aWV3IGNs
YXNzIGZvciBvcHRncm91cC4KLQotICAgIEBwcm9wZXJ0eSBncm91cFZpZXcKLSAgICBAdHlwZSBF
bWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIuU2VsZWN0T3B0Z3JvdXAKLSAgKi8KLSAgZ3Jv
dXBWaWV3OiBFbWJlci5TZWxlY3RPcHRncm91cCwKLQotICBncm91cGVkQ29udGVudDogRW1iZXIu
Y29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGdyb3VwUGF0aCA9IGdldCh0aGlzLCAnb3B0
aW9uR3JvdXBQYXRoJyk7Ci0gICAgdmFyIGdyb3VwZWRDb250ZW50ID0gRW1iZXIuQSgpOwotICAg
IHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JykgfHwgW107Ci0KLSAgICBmb3JFYWNo
KGNvbnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKLSAgICAgIHZhciBsYWJlbCA9IGdldChpdGVtLCBn
cm91cFBhdGgpOwotCi0gICAgICBpZiAoZ2V0KGdyb3VwZWRDb250ZW50LCAnbGFzdE9iamVjdC5s
YWJlbCcpICE9PSBsYWJlbCkgewotICAgICAgICBncm91cGVkQ29udGVudC5wdXNoT2JqZWN0KHsK
LSAgICAgICAgICBsYWJlbDogbGFiZWwsCi0gICAgICAgICAgY29udGVudDogRW1iZXIuQSgpCi0g
ICAgICAgIH0pOwotICAgICAgfQotCi0gICAgICBnZXQoZ3JvdXBlZENvbnRlbnQsICdsYXN0T2Jq
ZWN0LmNvbnRlbnQnKS5wdXNoKGl0ZW0pOwotICAgIH0pOwotCi0gICAgcmV0dXJuIGdyb3VwZWRD
b250ZW50OwotICB9KS5wcm9wZXJ0eSgnb3B0aW9uR3JvdXBQYXRoJywgJ2NvbnRlbnQuQGVhY2gn
KSwKLQotICAvKioKLSAgICBUaGUgdmlldyBjbGFzcyBmb3Igb3B0aW9uLgotCi0gICAgQHByb3Bl
cnR5IG9wdGlvblZpZXcKLSAgICBAdHlwZSBFbWJlci5WaWV3Ci0gICAgQGRlZmF1bHQgRW1iZXIu
U2VsZWN0T3B0aW9uCi0gICovCi0gIG9wdGlvblZpZXc6IEVtYmVyLlNlbGVjdE9wdGlvbiwKLQot
ICBfY2hhbmdlOiBmdW5jdGlvbigpIHsKLSAgICBpZiAoZ2V0KHRoaXMsICdtdWx0aXBsZScpKSB7
Ci0gICAgICB0aGlzLl9jaGFuZ2VNdWx0aXBsZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlz
Ll9jaGFuZ2VTaW5nbGUoKTsKLSAgICB9Ci0gIH0sCi0KLSAgc2VsZWN0aW9uRGlkQ2hhbmdlOiBF
bWJlci5vYnNlcnZlcignc2VsZWN0aW9uLkBlYWNoJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNl
bGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0gICAgaWYgKGdldCh0aGlzLCAnbXVs
dGlwbGUnKSkgewotICAgICAgaWYgKCFpc0FycmF5KHNlbGVjdGlvbikpIHsKLSAgICAgICAgc2V0
KHRoaXMsICdzZWxlY3Rpb24nLCBFbWJlci5BKFtzZWxlY3Rpb25dKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICAgIH0KLSAgICAgIHRoaXMuX3NlbGVjdGlvbkRpZENoYW5nZU11bHRpcGxlKCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuX3NlbGVjdGlvbkRpZENoYW5nZVNpbmdsZSgpOwotICAg
IH0KLSAgfSksCi0KLSAgdmFsdWVEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCd2YWx1ZScsIGZ1
bmN0aW9uKCkgewotICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAg
ICAgIHZhbHVlID0gZ2V0KHRoaXMsICd2YWx1ZScpLAotICAgICAgICB2YWx1ZVBhdGggPSBnZXQo
dGhpcywgJ29wdGlvblZhbHVlUGF0aCcpLnJlcGxhY2UoL15jb250ZW50XC4/LywgJycpLAotICAg
ICAgICBzZWxlY3RlZFZhbHVlID0gKHZhbHVlUGF0aCA/IGdldCh0aGlzLCAnc2VsZWN0aW9uLicg
KyB2YWx1ZVBhdGgpIDogZ2V0KHRoaXMsICdzZWxlY3Rpb24nKSksCi0gICAgICAgIHNlbGVjdGlv
bjsKLQotICAgIGlmICh2YWx1ZSAhPT0gc2VsZWN0ZWRWYWx1ZSkgewotICAgICAgc2VsZWN0aW9u
ID0gY29udGVudCA/IGNvbnRlbnQuZmluZChmdW5jdGlvbihvYmopIHsKLSAgICAgICAgcmV0dXJu
IHZhbHVlID09PSAodmFsdWVQYXRoID8gZ2V0KG9iaiwgdmFsdWVQYXRoKSA6IG9iaik7Ci0gICAg
ICB9KSA6IG51bGw7Ci0KLSAgICAgIHRoaXMuc2V0KCdzZWxlY3Rpb24nLCBzZWxlY3Rpb24pOwot
ICAgIH0KLSAgfSksCi0KLQotICBfdHJpZ2dlckNoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFy
IHNlbGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0gICAgdmFyIHZhbHVlID0gZ2V0
KHRoaXMsICd2YWx1ZScpOwotCi0gICAgaWYgKCFFbWJlci5pc05vbmUoc2VsZWN0aW9uKSkgeyB0
aGlzLnNlbGVjdGlvbkRpZENoYW5nZSgpOyB9Ci0gICAgaWYgKCFFbWJlci5pc05vbmUodmFsdWUp
KSB7IHRoaXMudmFsdWVEaWRDaGFuZ2UoKTsgfQotCi0gICAgdGhpcy5fY2hhbmdlKCk7Ci0gIH0s
Ci0KLSAgX2NoYW5nZVNpbmdsZTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNlbGVjdGVkSW5kZXgg
PSB0aGlzLiQoKVswXS5zZWxlY3RlZEluZGV4LAotICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMs
ICdjb250ZW50JyksCi0gICAgICAgIHByb21wdCA9IGdldCh0aGlzLCAncHJvbXB0Jyk7Ci0KLSAg
ICBpZiAoIWNvbnRlbnQgfHwgIWdldChjb250ZW50LCAnbGVuZ3RoJykpIHsgcmV0dXJuOyB9Ci0g
ICAgaWYgKHByb21wdCAmJiBzZWxlY3RlZEluZGV4ID09PSAwKSB7IHNldCh0aGlzLCAnc2VsZWN0
aW9uJywgbnVsbCk7IHJldHVybjsgfQotCi0gICAgaWYgKHByb21wdCkgeyBzZWxlY3RlZEluZGV4
IC09IDE7IH0KLSAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIGNvbnRlbnQub2JqZWN0QXQoc2Vs
ZWN0ZWRJbmRleCkpOwotICB9LAotCi0KLSAgX2NoYW5nZU11bHRpcGxlOiBmdW5jdGlvbigpIHsK
LSAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJCgnb3B0aW9uOnNlbGVjdGVkJyksCi0gICAgICAgIHBy
b21wdCA9IGdldCh0aGlzLCAncHJvbXB0JyksCi0gICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEg
OiAwLAotICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHNl
bGVjdGlvbiA9IGdldCh0aGlzLCAnc2VsZWN0aW9uJyk7Ci0KLSAgICBpZiAoIWNvbnRlbnQpIHsg
cmV0dXJuOyB9Ci0gICAgaWYgKG9wdGlvbnMpIHsKLSAgICAgIHZhciBzZWxlY3RlZEluZGV4ZXMg
PSBvcHRpb25zLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBv
ZmZzZXQ7Ci0gICAgICB9KS50b0FycmF5KCk7Ci0gICAgICB2YXIgbmV3U2VsZWN0aW9uID0gY29u
dGVudC5vYmplY3RzQXQoc2VsZWN0ZWRJbmRleGVzKTsKLQotICAgICAgaWYgKGlzQXJyYXkoc2Vs
ZWN0aW9uKSkgewotICAgICAgICByZXBsYWNlKHNlbGVjdGlvbiwgMCwgZ2V0KHNlbGVjdGlvbiwg
J2xlbmd0aCcpLCBuZXdTZWxlY3Rpb24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2V0KHRo
aXMsICdzZWxlY3Rpb24nLCBuZXdTZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfSwKLQot
ICBfc2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgZWwgPSB0
aGlzLmdldCgnZWxlbWVudCcpOwotICAgIGlmICghZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIg
Y29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAotICAgICAgICBzZWxlY3Rpb24gPSBnZXQo
dGhpcywgJ3NlbGVjdGlvbicpLAotICAgICAgICBzZWxlY3Rpb25JbmRleCA9IGNvbnRlbnQgPyBp
bmRleE9mKGNvbnRlbnQsIHNlbGVjdGlvbikgOiAtMSwKLSAgICAgICAgcHJvbXB0ID0gZ2V0KHRo
aXMsICdwcm9tcHQnKTsKLQotICAgIGlmIChwcm9tcHQpIHsgc2VsZWN0aW9uSW5kZXggKz0gMTsg
fQotICAgIGlmIChlbCkgeyBlbC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0aW9uSW5kZXg7IH0KLSAg
fSwKLQotICBfc2VsZWN0aW9uRGlkQ2hhbmdlTXVsdGlwbGU6IGZ1bmN0aW9uKCkgewotICAgIHZh
ciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCi0gICAgICAgIHNlbGVjdGlvbiA9IGdl
dCh0aGlzLCAnc2VsZWN0aW9uJyksCi0gICAgICAgIHNlbGVjdGVkSW5kZXhlcyA9IGNvbnRlbnQg
PyBpbmRleGVzT2YoY29udGVudCwgc2VsZWN0aW9uKSA6IFstMV0sCi0gICAgICAgIHByb21wdCA9
IGdldCh0aGlzLCAncHJvbXB0JyksCi0gICAgICAgIG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAot
ICAgICAgICBvcHRpb25zID0gdGhpcy4kKCdvcHRpb24nKSwKLSAgICAgICAgYWRqdXN0ZWQ7Ci0K
LSAgICBpZiAob3B0aW9ucykgewotICAgICAgb3B0aW9ucy5lYWNoKGZ1bmN0aW9uKCkgewotICAg
ICAgICBhZGp1c3RlZCA9IHRoaXMuaW5kZXggPiAtMSA/IHRoaXMuaW5kZXggLSBvZmZzZXQgOiAt
MTsKLSAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGluZGV4T2Yoc2VsZWN0ZWRJbmRleGVzLCBhZGp1
c3RlZCkgPiAtMTsKLSAgICAgIH0pOwotICAgIH0KLSAgfSwKLQotICBpbml0OiBmdW5jdGlvbigp
IHsKLSAgICB0aGlzLl9zdXBlcigpOwotICAgIHRoaXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0
aGlzLCB0aGlzLl90cmlnZ2VyQ2hhbmdlKTsKLSAgICB0aGlzLm9uKCJjaGFuZ2UiLCB0aGlzLCB0
aGlzLl9jaGFuZ2UpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzLWNvbXBpbGVyCi0q
LwotCi0vKioKLQotICBUaGUgYHt7aW5wdXR9fWAgaGVscGVyIGluc2VydHMgYW4gSFRNTCBgPGlu
cHV0PmAgdGFnIGludG8gdGhlIHRlbXBsYXRlLAotICB3aXRoIGEgYHR5cGVgIHZhbHVlIG9mIGVp
dGhlciBgdGV4dGAgb3IgYGNoZWNrYm94YC4gSWYgbm8gYHR5cGVgIGlzIHByb3ZpZGVkLAotICBg
dGV4dGAgd2lsbCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSBhcHBsaWVkLiBUaGUgYXR0cmlidXRlcyBv
ZiBge3tpbnB1dH19YAotICBtYXRjaCB0aG9zZSBvZiB0aGUgbmF0aXZlIEhUTUwgdGFnIGFzIGNs
b3NlbHkgYXMgcG9zc2libGUgZm9yIHRoZXNlIHR3byB0eXBlcy4KLQotICAjIyBVc2UgYXMgdGV4
dCBmaWVsZAotICBBbiBge3tpbnB1dH19YCB3aXRoIG5vIGB0eXBlYCBvciBhIGB0eXBlYCBvZiBg
dGV4dGAgd2lsbCByZW5kZXIgYW4gSFRNTCB0ZXh0IGlucHV0LgotICBUaGUgZm9sbG93aW5nIEhU
TUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0aGUgaGVscGVyOgotCi0qIGB2YWx1ZWAKLSog
YHNpemVgCi0qIGBuYW1lYAotKiBgcGF0dGVybmAKLSogYHBsYWNlaG9sZGVyYAotKiBgZGlzYWJs
ZWRgCi0qIGBtYXhsZW5ndGhgCi0qIGB0YWJpbmRleGAKLQotCi0gIFdoZW4gc2V0IHRvIGEgcXVv
dGVkIHN0cmluZywgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUg
SFRNTAotICBlbGVtZW50LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJl
IGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCi0gIHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJp
bmcgY29udGV4dCAobW9zdCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4KLQotICAj
IyBVbmJvdW5kOgotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3tpbnB1dCB2YWx1ZT0iaHR0cDovL3d3
dy5mYWNlYm9vay5jb20ifX0KLSAgYGBgCi0KLQotICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJ0
ZXh0IiB2YWx1ZT0iaHR0cDovL3d3dy5mYWNlYm9vay5jb20iLz4KLSAgYGBgCi0KLSAgIyMgQm91
bmQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1i
ZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIGZpcnN0TmFtZTogIlN0YW5sZXkiLAotICAgIGVu
dHJ5Tm90QWxsb3dlZDogdHJ1ZQotICB9KTsKLSAgYGBgCi0KLQotICBgYGBoYW5kbGViYXJzCi0g
IHt7aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Zmlyc3ROYW1lIGRpc2FibGVkPWVudHJ5Tm90QWxs
b3dlZCBzaXplPSI1MCJ9fQotICBgYGAKLQotCi0gIGBgYGh0bWwKLSAgPGlucHV0IHR5cGU9InRl
eHQiIHZhbHVlPSJTdGFubGV5IiBkaXNhYmxlZD0iZGlzYWJsZWQiIHNpemU9IjUwIi8+Ci0gIGBg
YAotCi0gICMjIEV4dGVuc2lvbgotCi0gIEludGVybmFsbHksIGB7e2lucHV0IHR5cGU9InRleHQi
fX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRleHRGaWVsZGAsIHBhc3NpbmcKLSAg
YXJndW1lbnRzIGZyb20gdGhlIGhlbHBlciB0byBgRW1iZXIuVGV4dEZpZWxkYCdzIGBjcmVhdGVg
IG1ldGhvZC4gWW91IGNhbiBleHRlbmQgdGhlCi0gIGNhcGFibGlsdGllcyBvZiB0ZXh0IGlucHV0
cyBpbiB5b3VyIGFwcGxpY2F0aW9ucyBieSByZW9wZW5pbmcgdGhpcyBjbGFzcy4gRm9yIGV4YW1w
bGUsCi0gIGlmIHlvdSBhcmUgZGVwbG95aW5nIHRvIGJyb3dzZXJzIHdoZXJlIHRoZSBgcmVxdWly
ZWRgIGF0dHJpYnV0ZSBpcyB1c2VkLCB5b3UKLSAgY2FuIGFkZCB0aGlzIHRvIHRoZSBgVGV4dEZp
ZWxkYCdzIGBhdHRyaWJ1dGVCaW5kaW5nc2AgcHJvcGVydHk6Ci0KLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEVtYmVyLlRleHRGaWVsZC5yZW9wZW4oewotICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3Jl
cXVpcmVkJ10KLSAgfSk7Ci0gIGBgYAotCi0gIEtlZXAgaW4gbWluZCB3aGVuIHdyaXRpbmcgYEVt
YmVyLlRleHRGaWVsZGAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0RmllbGRgCi0gIGl0c2Vs
ZiBleHRlbmRzIGBFbWJlci5Db21wb25lbnRgLCBtZWFuaW5nIHRoYXQgaXQgZG9lcyBOT1QgaW5o
ZXJpdAotICB0aGUgYGNvbnRyb2xsZXJgIG9mIHRoZSBwYXJlbnQgdmlldy4KLQotICBTZWUgbW9y
ZSBhYm91dCBbRW1iZXIgY29tcG9uZW50c10oYXBpL2NsYXNzZXMvRW1iZXIuQ29tcG9uZW50Lmh0
bWwpCi0KLQotICAjIyBVc2UgYXMgY2hlY2tib3gKLQotICBBbiBge3tpbnB1dH19YCB3aXRoIGEg
YHR5cGVgIG9mIGBjaGVja2JveGAgd2lsbCByZW5kZXIgYW4gSFRNTCBjaGVja2JveCBpbnB1dC4K
LSAgVGhlIGZvbGxvd2luZyBIVE1MIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCB2aWEgdGhlIGhlbHBl
cjoKLQotKiBgY2hlY2tlZGAKLSogYGRpc2FibGVkYAotKiBgdGFiaW5kZXhgCi0qIGBpbmRldGVy
bWluYXRlYAotKiBgbmFtZWAKLQotCi0gIFdoZW4gc2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhl
c2UgdmFsdWVzIHdpbGwgYmUgZGlyZWN0bHkgYXBwbGllZCB0byB0aGUgSFRNTAotICBlbGVtZW50
LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGJvdW5kIHRvIGEgcHJv
cGVydHkgb24gdGhlCi0gIHRlbXBsYXRlJ3MgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCAobW9z
dCB0eXBpY2FsbHkgYSBjb250cm9sbGVyIGluc3RhbmNlKS4KLQotICAjIyBVbmJvdW5kOgotCi0g
IGBgYGhhbmRsZWJhcnMKLSAge3tpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNBZG1pbiJ9
fQotICBgYGAKLQotICBgYGBodG1sCi0gIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNB
ZG1pbiIgLz4KLSAgYGBgCi0KLSAgIyMgQm91bmQ6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIGlz
QWRtaW46IHRydWUKLSAgfSk7Ci0gIGBgYAotCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e2lucHV0
IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPWlzQWRtaW4gfX0KLSAgYGBgCi0KLQotICBgYGBodG1s
Ci0gIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD0iY2hlY2tlZCIgLz4KLSAgYGBgCi0K
LSAgIyMgRXh0ZW5zaW9uCi0KLSAgSW50ZXJuYWxseSwgYHt7aW5wdXQgdHlwZT0iY2hlY2tib3gi
fX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkNoZWNrYm94YCwgcGFzc2luZwotICBh
cmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5DaGVja2JveGAncyBgY3JlYXRlYCBt
ZXRob2QuIFlvdSBjYW4gZXh0ZW5kIHRoZQotICBjYXBhYmxpbHRpZXMgb2YgY2hlY2tib3ggaW5w
dXRzIGluIHlvdXIgYXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0aGlzIGNsYXNzLiBGb3IgZXhh
bXBsZSwKLSAgaWYgeW91IHdhbnRlZCB0byBhZGQgYSBjc3MgY2xhc3MgdG8gYWxsIGNoZWNrYm94
ZXMgaW4geW91ciBhcHBsaWNhdGlvbjoKLQotCi0gIGBgYGphdmFzY3JpcHQKLSAgRW1iZXIuQ2hl
Y2tib3gucmVvcGVuKHsKLSAgICBjbGFzc05hbWVzOiBbJ215LWFwcC1jaGVja2JveCddCi0gIH0p
OwotICBgYGAKLQotCi0gIEBtZXRob2QgaW5wdXQKLSAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhl
bHBlcnMKLSAgQHBhcmFtIHtIYXNofSBvcHRpb25zCi0qLwotRW1iZXIuSGFuZGxlYmFycy5yZWdp
c3RlckhlbHBlcignaW5wdXQnLCBmdW5jdGlvbihvcHRpb25zKSB7Ci0gIEVtYmVyLmFzc2VydCgn
WW91IGNhbiBvbmx5IHBhc3MgYXR0cmlidXRlcyB0byB0aGUgYGlucHV0YCBoZWxwZXIsIG5vdCBh
cmd1bWVudHMnLCBhcmd1bWVudHMubGVuZ3RoIDwgMik7Ci0KLSAgdmFyIGhhc2ggPSBvcHRpb25z
Lmhhc2gsCi0gICAgICB0eXBlcyA9IG9wdGlvbnMuaGFzaFR5cGVzLAotICAgICAgaW5wdXRUeXBl
ID0gaGFzaC50eXBlLAotICAgICAgb25FdmVudCA9IGhhc2gub247Ci0KLSAgZGVsZXRlIGhhc2gu
dHlwZTsKLSAgZGVsZXRlIGhhc2gub247Ci0KLSAgaWYgKGlucHV0VHlwZSA9PT0gJ2NoZWNrYm94
JykgewotICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMs
IEVtYmVyLkNoZWNrYm94LCBvcHRpb25zKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaW5wdXRUeXBl
KSB7IGhhc2gudHlwZSA9IGlucHV0VHlwZTsgfQotICAgIGhhc2gub25FdmVudCA9IG9uRXZlbnQg
fHwgJ2VudGVyJzsKLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs
bCh0aGlzLCBFbWJlci5UZXh0RmllbGQsIG9wdGlvbnMpOwotICB9Ci19KTsKLQotLyoqCi0gIGB7
e3RleHRhcmVhfX1gIGluc2VydHMgYSBuZXcgaW5zdGFuY2Ugb2YgYDx0ZXh0YXJlYT5gIHRhZyBp
bnRvIHRoZSB0ZW1wbGF0ZS4KLSAgVGhlIGF0dHJpYnV0ZXMgb2YgYHt7dGV4dGFyZWF9fWAgbWF0
Y2ggdGhvc2Ugb2YgdGhlIG5hdGl2ZSBIVE1MIHRhZ3MgYXMKLSAgY2xvc2VseSBhcyBwb3NzaWJs
ZS4KLQotICBUaGUgZm9sbG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0OgotCi0gICAg
KiBgdmFsdWVgCi0gICAgKiBgbmFtZWAKLSAgICAqIGByb3dzYAotICAgICogYGNvbHNgCi0gICAg
KiBgcGxhY2Vob2xkZXJgCi0gICAgKiBgZGlzYWJsZWRgCi0gICAgKiBgbWF4bGVuZ3RoYAotICAg
ICogYHRhYmluZGV4YAotCi0gIFdoZW4gc2V0IHRvIGEgcXVvdGVkIHN0cmluZywgdGhlc2UgdmFs
dWUgd2lsbCBiZSBkaXJlY3RseSBhcHBsaWVkIHRvIHRoZSBIVE1MCi0gIGVsZW1lbnQuIFdoZW4g
bGVmdCB1bnF1b3RlZCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgYm91bmQgdG8gYSBwcm9wZXJ0eSBv
biB0aGUKLSAgdGVtcGxhdGUncyBjdXJyZW50IHJlbmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGlj
YWxseSBhIGNvbnRyb2xsZXIgaW5zdGFuY2UpLgotCi0gIFVuYm91bmQ6Ci0KLSAgYGBgaGFuZGxl
YmFycwotICB7e3RleHRhcmVhIHZhbHVlPSJMb3RzIG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1Qg
Ym91bmQifX0KLSAgYGBgCi0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoK
LQotICBgYGBodG1sCi0gIDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KLSAgICBM
b3RzIG9mIHN0YXRpYyB0ZXh0IHRoYXQgSVNOJ1QgYm91bmQKLSAgPC90ZXh0YXJlYT4KLSAgYGBg
Ci0KLSAgQm91bmQ6Ci0KLSAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgYHdyaXR0ZW5X
b3Jkc2AgcHJvcGVydHkgb24gYEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXJgCi0gIHdpbGwgYmUg
dXBkYXRlZCBsaXZlIGFzIHRoZSB1c2VyIHR5cGVzICdMb3RzIG9mIHRleHQgdGhhdCBJUyBib3Vu
ZCcgaW50bwotICB0aGUgdGV4dCBhcmVhIG9mIHRoZWlyIGJyb3dzZXIncyB3aW5kb3cuCi0KLSAg
YGBgamF2YXNjcmlwdAotICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJv
bGxlci5leHRlbmQoewotICAgIHdyaXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJv
dW5kIgotICB9KTsKLSAgYGBgCi0KLSAgYGBgaGFuZGxlYmFycwotICB7e3RleHRhcmVhIHZhbHVl
PXdyaXR0ZW5Xb3Jkc319Ci0gIGBgYAotCi0gICBXb3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2lu
ZyBIVE1MOgotCi0gIGBgYGh0bWwKLSAgPHRleHRhcmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEi
PgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBgYAot
Ci0gIElmIHlvdSB3YW50ZWQgYSBvbmUgd2F5IGJpbmRpbmcgYmV0d2VlbiB0aGUgdGV4dCBhcmVh
IGFuZCBhIGRpdiB0YWcKLSAgc29tZXdoZXJlIGVsc2Ugb24geW91ciBzY3JlZW4sIHlvdSBjb3Vs
ZCB1c2UgYEVtYmVyLmNvbXB1dGVkLm9uZVdheWA6Ci0KLSAgYGBgamF2YXNjcmlwdAotICBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgIHdy
aXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kIiwKLSAgICBvdXRwdXRXcml0
dGVuV29yZHM6IEVtYmVyLmNvbXB1dGVkLm9uZVdheSgid3JpdHRlbldvcmRzIikKLSAgfSk7Ci0g
IGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t0ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9
fQotCi0gIDxkaXY+Ci0gICAge3tvdXRwdXRXcml0dGVuV29yZHN9fQotICA8L2Rpdj4KLSAgYGBg
Ci0KLSAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKLQotICBgYGBodG1sCi0g
IDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KLSAgICBMb3RzIG9mIHRleHQgdGhh
dCBJUyBib3VuZAotICA8L3RleHRhcmVhPgotCi0gIDwtLSB0aGUgZm9sbG93aW5nIGRpdiB3aWxs
IGJlIHVwZGF0ZWQgaW4gcmVhbCB0aW1lIGFzIHlvdSB0eXBlIC0tPgotCi0gIDxkaXY+Ci0gICAg
TG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQKLSAgPC9kaXY+Ci0gIGBgYAotCi0gIEZpbmFsbHks
IHRoaXMgZXhhbXBsZSByZWFsbHkgc2hvd3MgdGhlIHBvd2VyIGFuZCBlYXNlIG9mIEVtYmVyIHdo
ZW4gdHdvCi0gIHByb3BlcnRpZXMgYXJlIGJvdW5kIHRvIGVhY2hvdGhlciB2aWEgYEVtYmVyLmNv
bXB1dGVkLmFsaWFzYC4gVHlwZSBpbnRvCi0gIGVpdGhlciB0ZXh0IGFyZWEgYm94IGFuZCB0aGV5
J2xsIGJvdGggc3RheSBpbiBzeW5jLiBOb3RlIHRoYXQKLSAgYEVtYmVyLmNvbXB1dGVkLmFsaWFz
YCBjb3N0cyBtb3JlIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlLCBzbyBvbmx5IHVzZSBpdCB3aGVu
Ci0gIHlvdXIgcmVhbGx5IGJpbmRpbmcgaW4gYm90aCBkaXJlY3Rpb25zOgotCi0gIGBgYGphdmFz
Y3JpcHQKLSAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0
ZW5kKHsKLSAgICB3cml0dGVuV29yZHM6ICJMb3RzIG9mIHRleHQgdGhhdCBJUyBib3VuZCIsCi0g
ICAgdHdvV2F5V3JpdHRlbldvcmRzOiBFbWJlci5jb21wdXRlZC5hbGlhcygid3JpdHRlbldvcmRz
IikKLSAgfSk7Ci0gIGBgYAotCi0gIGBgYGhhbmRsZWJhcnMKLSAge3t0ZXh0YXJlYSB2YWx1ZT13
cml0dGVuV29yZHN9fQotICB7e3RleHRhcmVhIHZhbHVlPXR3b1dheVdyaXR0ZW5Xb3Jkc319Ci0g
IGBgYAotCi0gIGBgYGh0bWwKLSAgPHRleHRhcmVhIGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci10
ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+
Ci0KLSAgPC0tIGJvdGggdXBkYXRlZCBpbiByZWFsIHRpbWUgLS0+Ci0KLSAgPHRleHRhcmVhIGlk
PSJlbWJlcjIiIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgotICAgIExvdHMgb2YgdGV4dCB0aGF0
IElTIGJvdW5kCi0gIDwvdGV4dGFyZWE+Ci0gIGBgYAotCi0gICMjIEV4dGVuc2lvbgotCi0gIElu
dGVybmFsbHksIGB7e3RleHRhcmVhfX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVtYmVyLlRl
eHRBcmVhYCwgcGFzc2luZwotICBhcmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5U
ZXh0QXJlYWAncyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KLSAgZXh0ZW5kIHRoZSBjYXBhYmls
aXRpZXMgb2YgdGV4dCBhcmVhcyBpbiB5b3VyIGFwcGxpY2F0aW9uIGJ5IHJlb3BlbmluZyB0aGlz
Ci0gIGNsYXNzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBkZXBsb3lpbmcgdG8gYnJvd3NlcnMg
d2hlcmUgdGhlIGByZXF1aXJlZGAKLSAgYXR0cmlidXRlIGlzIHVzZWQsIHlvdSBjYW4gZ2xvYmFs
bHkgYWRkIHN1cHBvcnQgZm9yIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZQotICBvbiBhbGwgYHt7
dGV4dGFyZWF9fWBzJyBpbiB5b3VyIGFwcCBieSByZW9wZW5pbmcgYEVtYmVyLlRleHRBcmVhYCBv
cgotICBgRW1iZXIuVGV4dFN1cHBvcnRgIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGBhdHRyaWJ1dGVC
aW5kaW5nc2AgY29uY2F0ZW5hdGVkCi0gIHByb3BlcnR5OgotCi0gIGBgYGphdmFzY3JpcHQKLSAg
RW1iZXIuVGV4dEFyZWEucmVvcGVuKHsKLSAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydyZXF1aXJl
ZCddCi0gIH0pOwotICBgYGAKLQotICBLZWVwIGluIG1pbmQgd2hlbiB3cml0aW5nIGBFbWJlci5U
ZXh0QXJlYWAgc3ViY2xhc3NlcyB0aGF0IGBFbWJlci5UZXh0QXJlYWAKLSAgaXRzZWxmIGV4dGVu
ZHMgYEVtYmVyLkNvbXBvbmVudGAsIG1lYW5pbmcgdGhhdCBpdCBkb2VzIE5PVCBpbmhlcml0Ci0g
IHRoZSBgY29udHJvbGxlcmAgb2YgdGhlIHBhcmVudCB2aWV3LgotCi0gIFNlZSBtb3JlIGFib3V0
IFtFbWJlciBjb21wb25lbnRzXShhcGkvY2xhc3Nlcy9FbWJlci5Db21wb25lbnQuaHRtbCkKLQot
ICBAbWV0aG9kIHRleHRhcmVhCi0gIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gIEBw
YXJhbSB7SGFzaH0gb3B0aW9ucwotKi8KLUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIo
J3RleHRhcmVhJywgZnVuY3Rpb24ob3B0aW9ucykgewotICBFbWJlci5hc3NlcnQoJ1lvdSBjYW4g
b25seSBwYXNzIGF0dHJpYnV0ZXMgdG8gdGhlIGB0ZXh0YXJlYWAgaGVscGVyLCBub3QgYXJndW1l
bnRzJywgYXJndW1lbnRzLmxlbmd0aCA8IDIpOwotCi0gIHZhciBoYXNoID0gb3B0aW9ucy5oYXNo
LAotICAgICAgdHlwZXMgPSBvcHRpb25zLmhhc2hUeXBlczsKLQotICByZXR1cm4gRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCBFbWJlci5UZXh0QXJlYSwgb3B0aW9ucyk7
Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLUVtYmVyLkNvbXBvbmVudExvb2t1
cCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBsb29rdXBGYWN0b3J5OiBmdW5jdGlvbihuYW1l
LCBjb250YWluZXIpIHsKLQotICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCB0aGlzLmNvbnRh
aW5lcjsKLQotICAgIHZhciBmdWxsTmFtZSA9ICdjb21wb25lbnQ6JyArIG5hbWUsCi0gICAgICAg
IHRlbXBsYXRlRnVsbE5hbWUgPSAndGVtcGxhdGU6Y29tcG9uZW50cy8nICsgbmFtZSwKLSAgICAg
ICAgdGVtcGxhdGVSZWdpc3RlcmVkID0gY29udGFpbmVyICYmIGNvbnRhaW5lci5oYXModGVtcGxh
dGVGdWxsTmFtZSk7Ci0KLSAgICBpZiAodGVtcGxhdGVSZWdpc3RlcmVkKSB7Ci0gICAgICBjb250
YWluZXIuaW5qZWN0aW9uKGZ1bGxOYW1lLCAnbGF5b3V0JywgdGVtcGxhdGVGdWxsTmFtZSk7Ci0g
ICAgfQotCi0gICAgdmFyIENvbXBvbmVudCA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KGZ1bGxO
YW1lKTsKLQotICAgIC8vIE9ubHkgdHJlYXQgYXMgYSBjb21wb25lbnQgaWYgZWl0aGVyIHRoZSBj
b21wb25lbnQKLSAgICAvLyBvciBhIHRlbXBsYXRlIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCi0gICAg
aWYgKHRlbXBsYXRlUmVnaXN0ZXJlZCB8fCBDb21wb25lbnQpIHsKLSAgICAgIGlmICghQ29tcG9u
ZW50KSB7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihmdWxsTmFtZSwgRW1iZXIuQ29tcG9u
ZW50KTsKLSAgICAgICAgQ29tcG9uZW50ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5h
bWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbXBvbmVudDsKLSAgICB9Ci0gIH0KLX0pOwot
Ci19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLypnbG9iYWxzIEhhbmRsZWJhcnMgKi8KLS8q
KgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCi0qLwotCi0vKioK
LSAgRmluZCB0ZW1wbGF0ZXMgc3RvcmVkIGluIHRoZSBoZWFkIHRhZyBhcyBzY3JpcHQgdGFncyBh
bmQgbWFrZSB0aGVtIGF2YWlsYWJsZQotICB0byBgRW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9i
YWwgYEVtYmVyLlRFTVBMQVRFU2Agb2JqZWN0LiBUaGlzIHdpbGwgYmUgcnVuCi0gIGFzIGFzIGpR
dWVyeSBET00tcmVhZHkgY2FsbGJhY2suCi0KLSAgU2NyaXB0IHRhZ3Mgd2l0aCBgdGV4dC94LWhh
bmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKLSAgd2l0aCBFbWJlcidzIEhhbmRsZWJhcnMgYW5k
IGFyZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdmlldydzIHRlbXBsYXRlLgotICBUaG9zZSB3aXRo
IHR5cGUgYHRleHQveC1yYXctaGFuZGxlYmFyc2Agd2lsbCBiZSBjb21waWxlZCB3aXRoIHJlZ3Vs
YXIKLSAgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4gdmlld3MnIGNvbXB1
dGVkIHByb3BlcnRpZXMuCi0KLSAgQHByaXZhdGUKLSAgQG1ldGhvZCBib290c3RyYXAKLSAgQGZv
ciBFbWJlci5IYW5kbGViYXJzCi0gIEBzdGF0aWMKLSAgQHBhcmFtIGN0eAotKi8KLUVtYmVyLkhh
bmRsZWJhcnMuYm9vdHN0cmFwID0gZnVuY3Rpb24oY3R4KSB7Ci0gIHZhciBzZWxlY3RvcnMgPSAn
c2NyaXB0W3R5cGU9InRleHQveC1oYW5kbGViYXJzIl0sIHNjcmlwdFt0eXBlPSJ0ZXh0L3gtcmF3
LWhhbmRsZWJhcnMiXSc7Ci0KLSAgRW1iZXIuJChzZWxlY3RvcnMsIGN0eCkKLSAgICAuZWFjaChm
dW5jdGlvbigpIHsKLSAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNjcmlwdCB0YWcKLSAg
ICB2YXIgc2NyaXB0ID0gRW1iZXIuJCh0aGlzKTsKLQotICAgIHZhciBjb21waWxlID0gKHNjcmlw
dC5hdHRyKCd0eXBlJykgPT09ICd0ZXh0L3gtcmF3LWhhbmRsZWJhcnMnKSA/Ci0gICAgICAgICAg
ICAgICAgICBFbWJlci4kLnByb3h5KEhhbmRsZWJhcnMuY29tcGlsZSwgSGFuZGxlYmFycykgOgot
ICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUs
IEVtYmVyLkhhbmRsZWJhcnMpLAotICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQs
IHVzZWQgYnkgRW1iZXIuVmlldydzIHRlbXBsYXRlTmFtZSBwcm9wZXJ0eS4KLSAgICAgIC8vIEZp
cnN0IGxvb2sgZm9yIGRhdGEtdGVtcGxhdGUtbmFtZSBhdHRyaWJ1dGUsIHRoZW4gZmFsbCBiYWNr
IHRvIGl0cwotICAgICAgLy8gaWQgaWYgbm8gbmFtZSBpcyBmb3VuZC4KLSAgICAgIHRlbXBsYXRl
TmFtZSA9IHNjcmlwdC5hdHRyKCdkYXRhLXRlbXBsYXRlLW5hbWUnKSB8fCBzY3JpcHQuYXR0cign
aWQnKSB8fCAnYXBwbGljYXRpb24nLAotICAgICAgdGVtcGxhdGUgPSBjb21waWxlKHNjcmlwdC5o
dG1sKCkpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgb2Ygc2FtZSBuYW1lIGFscmVhZHkg
ZXhpc3RzCi0gICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdICE9PSB1bmRlZmlu
ZWQpIHsKLSAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcignVGVtcGxhdGUgbmFtZWQgIicgKyB0
ZW1wbGF0ZU5hbWUgICsgJyIgYWxyZWFkeSBleGlzdHMuJyk7Ci0gICAgfQotCi0gICAgLy8gRm9y
IHRlbXBsYXRlcyB3aGljaCBoYXZlIGEgbmFtZSwgd2Ugc2F2ZSB0aGVtIGFuZCB0aGVuIHJlbW92
ZSB0aGVtIGZyb20gdGhlIERPTQotICAgIEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVdID0g
dGVtcGxhdGU7Ci0KLSAgICAvLyBSZW1vdmUgc2NyaXB0IHRhZyBmcm9tIERPTQotICAgIHNjcmlw
dC5yZW1vdmUoKTsKLSAgfSk7Ci19OwotCi1mdW5jdGlvbiBib290c3RyYXAoKSB7Ci0gIEVtYmVy
LkhhbmRsZWJhcnMuYm9vdHN0cmFwKCBFbWJlci4kKGRvY3VtZW50KSApOwotfQotCi1mdW5jdGlv
biByZWdpc3RlckNvbXBvbmVudExvb2t1cChjb250YWluZXIpIHsKLSAgY29udGFpbmVyLnJlZ2lz
dGVyKCdjb21wb25lbnQtbG9va3VwOm1haW4nLCBFbWJlci5Db21wb25lbnRMb29rdXApOwotfQot
Ci0vKgotICBXZSB0aWUgdGhpcyB0byBhcHBsaWNhdGlvbi5sb2FkIHRvIGVuc3VyZSB0aGF0IHdl
J3ZlIGF0IGxlYXN0Ci0gIGF0dGVtcHRlZCB0byBib290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQg
dGhlIGFwcGxpY2F0aW9uIGlzIGxvYWRlZC4KLQotICBXZSBhbHNvIHRpZSB0aGlzIHRvIGRvY3Vt
ZW50IHJlYWR5IHNpbmNlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhbGwKLSAgdGhlIGlubGluZSB0
ZW1wbGF0ZXMgYXJlIHByZXNlbnQgYXQgdGhpcyBwb2ludC4KLQotICBUaGVyZSdzIG5vIGhhcm0g
dG8gcnVubmluZyB0aGlzIHR3aWNlLCBzaW5jZSB3ZSByZW1vdmUgdGhlIHRlbXBsYXRlcwotICBm
cm9tIHRoZSBET00gYWZ0ZXIgcHJvY2Vzc2luZy4KLSovCi0KLUVtYmVyLm9uTG9hZCgnRW1iZXIu
QXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewotICBBcHBsaWNhdGlvbi5pbml0
aWFsaXplcih7Ci0gICAgbmFtZTogJ2RvbVRlbXBsYXRlcycsCi0gICAgaW5pdGlhbGl6ZTogYm9v
dHN0cmFwCi0gIH0pOwotCi0gIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAn
cmVnaXN0ZXJDb21wb25lbnRMb29rdXAnLAotICAgIGFmdGVyOiAnZG9tVGVtcGxhdGVzJywKLSAg
ICBpbml0aWFsaXplOiByZWdpc3RlckNvbXBvbmVudExvb2t1cAotICB9KTsKLX0pOwotCi19KSgp
OwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJlciBIYW5kbGViYXJzCi0KLUBtb2R1bGUg
ZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwotQHJlcXVpcmVzIGVtYmVyLXZpZXdz
Ci0qLwotCi1FbWJlci5ydW5Mb2FkSG9va3MoJ0VtYmVyLkhhbmRsZWJhcnMnLCBFbWJlci5IYW5k
bGViYXJzKTsKLQotfSkoKTsKLQotKGZ1bmN0aW9uKCkgewotZGVmaW5lKCJyb3V0ZS1yZWNvZ25p
emVyIiwKLSAgW10sCi0gIGZ1bmN0aW9uKCkgewotICAgICJ1c2Ugc3RyaWN0IjsKLSAgICB2YXIg
c3BlY2lhbHMgPSBbCi0gICAgICAnLycsICcuJywgJyonLCAnKycsICc/JywgJ3wnLAotICAgICAg
JygnLCAnKScsICdbJywgJ10nLCAneycsICd9JywgJ1xcJwotICAgIF07Ci0KLSAgICB2YXIgZXNj
YXBlUmVnZXggPSBuZXcgUmVnRXhwKCcoXFwnICsgc3BlY2lhbHMuam9pbignfFxcJykgKyAnKScs
ICdnJyk7Ci0KLSAgICAvLyBBIFNlZ21lbnQgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4gdGhlIG9y
aWdpbmFsIHJvdXRlIGRlc2NyaXB0aW9uLgotICAgIC8vIEVhY2ggU2VnbWVudCB0eXBlIHByb3Zp
ZGVzIGFuIGBlYWNoQ2hhcmAgYW5kIGByZWdleGAgbWV0aG9kLgotICAgIC8vCi0gICAgLy8gVGhl
IGBlYWNoQ2hhcmAgbWV0aG9kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggb25lIG9yIG1vcmUg
Y2hhcmFjdGVyCi0gICAgLy8gc3BlY2lmaWNhdGlvbnMuIEEgY2hhcmFjdGVyIHNwZWNpZmljYXRp
b24gY29uc3VtZXMgb25lIG9yIG1vcmUgaW5wdXQKLSAgICAvLyBjaGFyYWN0ZXJzLgotICAgIC8v
Ci0gICAgLy8gVGhlIGByZWdleGAgbWV0aG9kIHJldHVybnMgYSByZWdleCBmcmFnbWVudCBmb3Ig
dGhlIHNlZ21lbnQuIElmIHRoZQotICAgIC8vIHNlZ21lbnQgaXMgYSBkeW5hbWljIG9mIHN0YXIg
c2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFsc28gaW5jbHVkZXMKLSAgICAvLyBhIGNhcHR1
cmUuCi0gICAgLy8KLSAgICAvLyBBIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgot
ICAgIC8vCi0gICAgLy8gKiBgdmFsaWRDaGFyc2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0IG9mIGFs
bCB2YWxpZCBjaGFyYWN0ZXJzLCBvcgotICAgIC8vICogYGludmFsaWRDaGFyc2A6IGEgU3RyaW5n
IHdpdGggYSBsaXN0IG9mIGFsbCBpbnZhbGlkIGNoYXJhY3RlcnMKLSAgICAvLyAqIGByZXBlYXRg
OiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBjYW4gcmVwZWF0Ci0KLSAgICBm
dW5jdGlvbiBTdGF0aWNTZWdtZW50KHN0cmluZykgeyB0aGlzLnN0cmluZyA9IHN0cmluZzsgfQot
ICAgIFN0YXRpY1NlZ21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFjaENoYXI6IGZ1bmN0aW9u
KGNhbGxiYWNrKSB7Ci0gICAgICAgIHZhciBzdHJpbmcgPSB0aGlzLnN0cmluZywgY2hhcjsKLQot
ICAgICAgICBmb3IgKHZhciBpPTAsIGw9c3RyaW5nLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgICBjaGFyID0gc3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICBjYWxsYmFjayh7IHZhbGlk
Q2hhcnM6IGNoYXIgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnJlcGxhY2UoZXNjYXBlUmVnZXgs
ICdcXCQxJyk7Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIHJldHVybiB0aGlzLnN0cmluZzsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgZnVuY3Rpb24g
RHluYW1pY1NlZ21lbnQobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9Ci0gICAgRHluYW1pY1Nl
Z21lbnQucHJvdG90eXBlID0gewotICAgICAgZWFjaENoYXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7
Ci0gICAgICAgIGNhbGxiYWNrKHsgaW52YWxpZENoYXJzOiAiLyIsIHJlcGVhdDogdHJ1ZSB9KTsK
LSAgICAgIH0sCi0KLSAgICAgIHJlZ2V4OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIo
W14vXSspIjsKLSAgICAgIH0sCi0KLSAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwYXJhbXMpIHsK
LSAgICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOwotICAgICAgfQotICAgIH07Ci0KLSAg
ICBmdW5jdGlvbiBTdGFyU2VnbWVudChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH0KLSAgICBT
dGFyU2VnbWVudC5wcm90b3R5cGUgPSB7Ci0gICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJh
Y2spIHsKLSAgICAgICAgY2FsbGJhY2soeyBpbnZhbGlkQ2hhcnM6ICIiLCByZXBlYXQ6IHRydWUg
fSk7Ci0gICAgICB9LAotCi0gICAgICByZWdleDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVy
biAiKC4rKSI7Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocGFyYW1zKSB7
Ci0gICAgICAgIHJldHVybiBwYXJhbXNbdGhpcy5uYW1lXTsKLSAgICAgIH0KLSAgICB9OwotCi0g
ICAgZnVuY3Rpb24gRXBzaWxvblNlZ21lbnQoKSB7fQotICAgIEVwc2lsb25TZWdtZW50LnByb3Rv
dHlwZSA9IHsKLSAgICAgIGVhY2hDaGFyOiBmdW5jdGlvbigpIHt9LAotICAgICAgcmVnZXg6IGZ1
bmN0aW9uKCkgeyByZXR1cm4gIiI7IH0sCi0gICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7IHJl
dHVybiAiIjsgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBwYXJzZShyb3V0ZSwgbmFtZXMsIHR5
cGVzKSB7Ci0gICAgICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSAi
LyIuIFJlY29nbml0aW9uIHdpbGwKLSAgICAgIC8vIGFsc28gbm9ybWFsaXplLgotICAgICAgaWYg
KHJvdXRlLmNoYXJBdCgwKSA9PT0gIi8iKSB7IHJvdXRlID0gcm91dGUuc3Vic3RyKDEpOyB9Ci0K
LSAgICAgIHZhciBzZWdtZW50cyA9IHJvdXRlLnNwbGl0KCIvIiksIHJlc3VsdHMgPSBbXTsKLQot
ICAgICAgZm9yICh2YXIgaT0wLCBsPXNlZ21lbnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAg
ICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXSwgbWF0Y2g7Ci0KLSAgICAgICAgaWYgKG1hdGNo
ID0gc2VnbWVudC5tYXRjaCgvXjooW15cL10rKSQvKSkgewotICAgICAgICAgIHJlc3VsdHMucHVz
aChuZXcgRHluYW1pY1NlZ21lbnQobWF0Y2hbMV0pKTsKLSAgICAgICAgICBuYW1lcy5wdXNoKG1h
dGNoWzFdKTsKLSAgICAgICAgICB0eXBlcy5keW5hbWljcysrOwotICAgICAgICB9IGVsc2UgaWYg
KG1hdGNoID0gc2VnbWVudC5tYXRjaCgvXlwqKFteXC9dKykkLykpIHsKLSAgICAgICAgICByZXN1
bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNoWzFdKSk7Ci0gICAgICAgICAgbmFtZXMucHVz
aChtYXRjaFsxXSk7Ci0gICAgICAgICAgdHlwZXMuc3RhcnMrKzsKLSAgICAgICAgfSBlbHNlIGlm
KHNlZ21lbnQgPT09ICIiKSB7Ci0gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBFcHNpbG9uU2Vn
bWVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFN0
YXRpY1NlZ21lbnQoc2VnbWVudCkpOwotICAgICAgICAgIHR5cGVzLnN0YXRpY3MrKzsKLSAgICAg
ICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvLyBB
IFN0YXRlIGhhcyBhIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFuZCAoYGNoYXJTcGVjYCkgYW5k
IGEgbGlzdCBvZiBwb3NzaWJsZQotICAgIC8vIHN1YnNlcXVlbnQgc3RhdGVzIChgbmV4dFN0YXRl
c2ApLgotICAgIC8vCi0gICAgLy8gSWYgYSBTdGF0ZSBpcyBhbiBhY2NlcHRpbmcgc3RhdGUsIGl0
IHdpbGwgYWxzbyBoYXZlIHNldmVyYWwgYWRkaXRpb25hbAotICAgIC8vIHByb3BlcnRpZXM6Ci0g
ICAgLy8KLSAgICAvLyAqIGByZWdleGA6IEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNl
ZCB0byBleHRyYWN0IHBhcmFtZXRlcnMgZnJvbSBwYXRocwotICAgIC8vICAgdGhhdCByZWFjaGVk
IHRoaXMgYWNjZXB0aW5nIHN0YXRlLgotICAgIC8vICogYGhhbmRsZXJzYDogSW5mb3JtYXRpb24g
b24gaG93IHRvIGNvbnZlcnQgdGhlIGxpc3Qgb2YgY2FwdHVyZXMgaW50byBjYWxscwotICAgIC8v
ICAgdG8gcmVnaXN0ZXJlZCBoYW5kbGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwot
ICAgIC8vICogYHR5cGVzYDogSG93IG1hbnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2VnbWVu
dHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0bwotICAgIC8vICAgZGVjaWRlIHdoaWNoIHJvdXRlIHRv
IHVzZSBpZiBtdWx0aXBsZSByZWdpc3RlcmVkIHJvdXRlcyBtYXRjaCBhIHBhdGguCi0gICAgLy8K
LSAgICAvLyBDdXJyZW50bHksIFN0YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGlu
ZyBvdmVyIGBuZXh0U3RhdGVzYCBhbmQKLSAgICAvLyBjb21wYXJpbmcgYSBjaGFyYWN0ZXIgc3Bl
Y2lmaWNhdGlvbiBhZ2FpbnN0IGEgY2hhcmFjdGVyLiBBIG1vcmUgZWZmaWNpZW50Ci0gICAgLy8g
aW1wbGVtZW50YXRpb24gd291bGQgdXNlIGEgaGFzaCBvZiBrZXlzIHBvaW50aW5nIGF0IG9uZSBv
ciBtb3JlIG5leHQgc3RhdGVzLgotCi0gICAgZnVuY3Rpb24gU3RhdGUoY2hhclNwZWMpIHsKLSAg
ICAgIHRoaXMuY2hhclNwZWMgPSBjaGFyU3BlYzsKLSAgICAgIHRoaXMubmV4dFN0YXRlcyA9IFtd
OwotICAgIH0KLQotICAgIFN0YXRlLnByb3RvdHlwZSA9IHsKLSAgICAgIGdldDogZnVuY3Rpb24o
Y2hhclNwZWMpIHsKLSAgICAgICAgdmFyIG5leHRTdGF0ZXMgPSB0aGlzLm5leHRTdGF0ZXM7Ci0K
LSAgICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRTdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewot
ICAgICAgICAgIHZhciBjaGlsZCA9IG5leHRTdGF0ZXNbaV07Ci0KLSAgICAgICAgICB2YXIgaXNF
cXVhbCA9IGNoaWxkLmNoYXJTcGVjLnZhbGlkQ2hhcnMgPT09IGNoYXJTcGVjLnZhbGlkQ2hhcnM7
Ci0gICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwgJiYgY2hpbGQuY2hhclNwZWMuaW52YWxpZENo
YXJzID09PSBjaGFyU3BlYy5pbnZhbGlkQ2hhcnM7Ci0KLSAgICAgICAgICBpZiAoaXNFcXVhbCkg
eyByZXR1cm4gY2hpbGQ7IH0KLSAgICAgICAgfQotICAgICAgfSwKLQotICAgICAgcHV0OiBmdW5j
dGlvbihjaGFyU3BlYykgewotICAgICAgICB2YXIgc3RhdGU7Ci0KLSAgICAgICAgLy8gSWYgdGhl
IGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGluIGEgY2hpbGQgb2YgdGhl
IGN1cnJlbnQKLSAgICAgICAgLy8gc3RhdGUsIGp1c3QgcmV0dXJuIHRoYXQgc3RhdGUuCi0gICAg
ICAgIGlmIChzdGF0ZSA9IHRoaXMuZ2V0KGNoYXJTcGVjKSkgeyByZXR1cm4gc3RhdGU7IH0KLQot
ICAgICAgICAvLyBNYWtlIGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFjdGVyIHNwZWMKLSAgICAg
ICAgc3RhdGUgPSBuZXcgU3RhdGUoY2hhclNwZWMpOwotCi0gICAgICAgIC8vIEluc2VydCB0aGUg
bmV3IHN0YXRlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgdGhpcy5u
ZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotCi0gICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNw
ZWNpZmljYXRpb24gcmVwZWF0cywgaW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZAotICAg
ICAgICAvLyBvZiBpdHNlbGYuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHRyaWdnZXIgYW4gaW5m
aW5pdGUgbG9vcCBiZWNhdXNlIGVhY2gKLSAgICAgICAgLy8gdHJhbnNpdGlvbiBkdXJpbmcgcmVj
b2duaXRpb24gY29uc3VtZXMgYSBjaGFyYWN0ZXIuCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBl
YXQpIHsKLSAgICAgICAgICBzdGF0ZS5uZXh0U3RhdGVzLnB1c2goc3RhdGUpOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXcgc3RhdGUKLSAgICAgICAgcmV0dXJuIHN0YXRl
OwotICAgICAgfSwKLQotICAgICAgLy8gRmluZCBhIGxpc3Qgb2YgY2hpbGQgc3RhdGVzIG1hdGNo
aW5nIHRoZSBuZXh0IGNoYXJhY3RlcgotICAgICAgbWF0Y2g6IGZ1bmN0aW9uKGNoYXIpIHsKLSAg
ICAgICAgLy8gREVCVUcgIlByb2Nlc3NpbmcgYCIgKyBjaGFyICsgImA6IgotICAgICAgICB2YXIg
bmV4dFN0YXRlcyA9IHRoaXMubmV4dFN0YXRlcywKLSAgICAgICAgICAgIGNoaWxkLCBjaGFyU3Bl
YywgY2hhcnM7Ci0KLSAgICAgICAgLy8gREVCVUcgIiAgIiArIGRlYnVnU3RhdGUodGhpcykKLSAg
ICAgICAgdmFyIHJldHVybmVkID0gW107Ci0KLSAgICAgICAgZm9yICh2YXIgaT0wLCBsPW5leHRT
dGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIGNoaWxkID0gbmV4dFN0YXRlc1tp
XTsKLQotICAgICAgICAgIGNoYXJTcGVjID0gY2hpbGQuY2hhclNwZWM7Ci0KLSAgICAgICAgICBp
ZiAodHlwZW9mIChjaGFycyA9IGNoYXJTcGVjLnZhbGlkQ2hhcnMpICE9PSAndW5kZWZpbmVkJykg
ewotICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2hhcikgIT09IC0xKSB7IHJldHVybmVk
LnB1c2goY2hpbGQpOyB9Ci0gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGNoYXJzID0gY2hh
clNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICAgIGlmIChj
aGFycy5pbmRleE9mKGNoYXIpID09PSAtMSkgeyByZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQotICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5lZDsKLSAgICAgIH0K
LQotICAgICAgLyoqIElGIERFQlVHCi0gICAgICAsIGRlYnVnOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgdmFyIGNoYXJTcGVjID0gdGhpcy5jaGFyU3BlYywKLSAgICAgICAgICAgIGRlYnVnID0gIlsi
LAotICAgICAgICAgICAgY2hhcnMgPSBjaGFyU3BlYy52YWxpZENoYXJzIHx8IGNoYXJTcGVjLmlu
dmFsaWRDaGFyczsKLQotICAgICAgICBpZiAoY2hhclNwZWMuaW52YWxpZENoYXJzKSB7IGRlYnVn
ICs9ICJeIjsgfQotICAgICAgICBkZWJ1ZyArPSBjaGFyczsKLSAgICAgICAgZGVidWcgKz0gIl0i
OwotCi0gICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsgZGVidWcgKz0gIisiOyB9Ci0KLSAg
ICAgICAgcmV0dXJuIGRlYnVnOwotICAgICAgfQotICAgICAgRU5EIElGICoqLwotICAgIH07Ci0K
LSAgICAvKiogSUYgREVCVUcKLSAgICBmdW5jdGlvbiBkZWJ1Zyhsb2cpIHsKLSAgICAgIGNvbnNv
bGUubG9nKGxvZyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZGVidWdTdGF0ZShzdGF0ZSkgewot
ICAgICAgcmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKG4pIHsKLSAgICAgICAg
aWYgKG4ubmV4dFN0YXRlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuICIoICIgKyBuLmRlYnVnKCkg
KyAiIFthY2NlcHRpbmddICkiOyB9Ci0gICAgICAgIHJldHVybiAiKCAiICsgbi5kZWJ1ZygpICsg
IiA8dGhlbj4gIiArIG4ubmV4dFN0YXRlcy5tYXAoZnVuY3Rpb24ocykgeyByZXR1cm4gcy5kZWJ1
ZygpIH0pLmpvaW4oIiBvciAiKSArICIgKSI7Ci0gICAgICB9KS5qb2luKCIsICIpCi0gICAgfQot
ICAgIEVORCBJRiAqKi8KLQotICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBuYWl2ZSBzdHJhdGVn
eSwgYnV0IHNob3VsZCB3b3JrIGluIGEgbG90IG9mIGNhc2VzCi0gICAgLy8gQSBiZXR0ZXIgc3Ry
YXRlZ3kgd291bGQgcHJvcGVybHkgcmVzb2x2ZSAvcG9zdHMvOmlkL25ldyBhbmQgL3Bvc3RzL2Vk
aXQvOmlkCi0gICAgZnVuY3Rpb24gc29ydFNvbHV0aW9ucyhzdGF0ZXMpIHsKLSAgICAgIHJldHVy
biBzdGF0ZXMuc29ydChmdW5jdGlvbihhLCBiKSB7Ci0gICAgICAgIGlmIChhLnR5cGVzLnN0YXJz
ICE9PSBiLnR5cGVzLnN0YXJzKSB7IHJldHVybiBhLnR5cGVzLnN0YXJzIC0gYi50eXBlcy5zdGFy
czsgfQotICAgICAgICBpZiAoYS50eXBlcy5keW5hbWljcyAhPT0gYi50eXBlcy5keW5hbWljcykg
eyByZXR1cm4gYS50eXBlcy5keW5hbWljcyAtIGIudHlwZXMuZHluYW1pY3M7IH0KLSAgICAgICAg
aWYgKGEudHlwZXMuc3RhdGljcyAhPT0gYi50eXBlcy5zdGF0aWNzKSB7IHJldHVybiBiLnR5cGVz
LnN0YXRpY3MgLSBhLnR5cGVzLnN0YXRpY3M7IH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICAg
IH0pOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIoc3RhdGVzLCBjaGFyKSB7
Ci0gICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOwotCi0gICAgICBmb3IgKHZhciBpPTAsIGw9c3Rh
dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOwot
Ci0gICAgICAgIG5leHRTdGF0ZXMgPSBuZXh0U3RhdGVzLmNvbmNhdChzdGF0ZS5tYXRjaChjaGFy
KSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBuZXh0U3RhdGVzOwotICAgIH0KLQotICAgIGZ1
bmN0aW9uIGZpbmRIYW5kbGVyKHN0YXRlLCBwYXRoLCBxdWVyeVBhcmFtcykgewotICAgICAgdmFy
IGhhbmRsZXJzID0gc3RhdGUuaGFuZGxlcnMsIHJlZ2V4ID0gc3RhdGUucmVnZXg7Ci0gICAgICB2
YXIgY2FwdHVyZXMgPSBwYXRoLm1hdGNoKHJlZ2V4KSwgY3VycmVudENhcHR1cmUgPSAxOwotICAg
ICAgdmFyIHJlc3VsdCA9IFtdOwotCi0gICAgICBmb3IgKHZhciBpPTAsIGw9aGFuZGxlcnMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLCBuYW1l
cyA9IGhhbmRsZXIubmFtZXMsIHBhcmFtcyA9IHt9LAotICAgICAgICAgIHdhdGNoZWRRdWVyeVBh
cmFtcyA9IGhhbmRsZXIucXVlcnlQYXJhbXMgfHwgW10sCi0gICAgICAgICAgYWN0aXZlUXVlcnlQ
YXJhbXMgPSB7fSwKLSAgICAgICAgICBqLCBtOwotCi0gICAgICAgIGZvciAoaj0wLCBtPW5hbWVz
Lmxlbmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAgICBwYXJhbXNbbmFtZXNbal1dID0gY2FwdHVy
ZXNbY3VycmVudENhcHR1cmUrK107Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChqPTAsIG09d2F0
Y2hlZFF1ZXJ5UGFyYW1zLmxlbmd0aDsgaiA8IG07IGorKykgewotICAgICAgICAgIHZhciBrZXkg
PSB3YXRjaGVkUXVlcnlQYXJhbXNbal07Ci0gICAgICAgICAgaWYocXVlcnlQYXJhbXNba2V5XSl7
Ci0gICAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtc1trZXldID0gcXVlcnlQYXJhbXNba2V5XTsK
LSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIGN1cnJlbnRSZXN1bHQgPSB7IGhh
bmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFyYW1zOiBwYXJhbXMsIGlzRHluYW1pYzogISFuYW1l
cy5sZW5ndGggfTsKLSAgICAgICAgaWYod2F0Y2hlZFF1ZXJ5UGFyYW1zICYmIHdhdGNoZWRRdWVy
eVBhcmFtcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgY3VycmVudFJlc3VsdC5xdWVyeVBhcmFt
cyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5wdXNoKGN1
cnJlbnRSZXN1bHQpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQot
ICAgIGZ1bmN0aW9uIGFkZFNlZ21lbnQoY3VycmVudFN0YXRlLCBzZWdtZW50KSB7Ci0gICAgICBz
ZWdtZW50LmVhY2hDaGFyKGZ1bmN0aW9uKGNoYXIpIHsKLSAgICAgICAgdmFyIHN0YXRlOwotCi0g
ICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5wdXQoY2hhcik7Ci0gICAgICB9KTsK
LQotICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbWFpbiBp
bnRlcmZhY2UKLQotICAgIHZhciBSb3V0ZVJlY29nbml6ZXIgPSBmdW5jdGlvbigpIHsKLSAgICAg
IHRoaXMucm9vdFN0YXRlID0gbmV3IFN0YXRlKCk7Ci0gICAgICB0aGlzLm5hbWVzID0ge307Ci0g
ICAgfTsKLQotCi0gICAgUm91dGVSZWNvZ25pemVyLnByb3RvdHlwZSA9IHsKLSAgICAgIGFkZDog
ZnVuY3Rpb24ocm91dGVzLCBvcHRpb25zKSB7Ci0gICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSB0
aGlzLnJvb3RTdGF0ZSwgcmVnZXggPSAiXiIsCi0gICAgICAgICAgICB0eXBlcyA9IHsgc3RhdGlj
czogMCwgZHluYW1pY3M6IDAsIHN0YXJzOiAwIH0sCi0gICAgICAgICAgICBoYW5kbGVycyA9IFtd
LCBhbGxTZWdtZW50cyA9IFtdLCBuYW1lOwotCi0gICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsK
LQotICAgICAgICBmb3IgKHZhciBpPTAsIGw9cm91dGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAg
ICAgICAgICB2YXIgcm91dGUgPSByb3V0ZXNbaV0sIG5hbWVzID0gW107Ci0KLSAgICAgICAgICB2
YXIgc2VnbWVudHMgPSBwYXJzZShyb3V0ZS5wYXRoLCBuYW1lcywgdHlwZXMpOwotCi0gICAgICAg
ICAgYWxsU2VnbWVudHMgPSBhbGxTZWdtZW50cy5jb25jYXQoc2VnbWVudHMpOwotCi0gICAgICAg
ICAgZm9yICh2YXIgaj0wLCBtPXNlZ21lbnRzLmxlbmd0aDsgajxtOyBqKyspIHsKLSAgICAgICAg
ICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07Ci0KLSAgICAgICAgICAgIGlmIChzZWdtZW50
IGluc3RhbmNlb2YgRXBzaWxvblNlZ21lbnQpIHsgY29udGludWU7IH0KLQotICAgICAgICAgICAg
aXNFbXB0eSA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBBZGQgYSAiLyIgZm9yIHRoZSBuZXcg
c2VnbWVudAotICAgICAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1dCh7IHZh
bGlkQ2hhcnM6ICIvIiB9KTsKLSAgICAgICAgICAgIHJlZ2V4ICs9ICIvIjsKLQotICAgICAgICAg
ICAgLy8gQWRkIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlZ21lbnQgdG8gdGhlIE5GQSBhbmQg
cmVnZXgKLSAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGFkZFNlZ21lbnQoY3VycmVudFN0YXRl
LCBzZWdtZW50KTsKLSAgICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKLSAgICAg
ICAgICB9Ci0KLSAgICAgICAgICB2YXIgaGFuZGxlciA9IHsgaGFuZGxlcjogcm91dGUuaGFuZGxl
ciwgbmFtZXM6IG5hbWVzIH07Ci0gICAgICAgICAgaWYocm91dGUucXVlcnlQYXJhbXMpIHsKLSAg
ICAgICAgICAgIGhhbmRsZXIucXVlcnlQYXJhbXMgPSByb3V0ZS5xdWVyeVBhcmFtczsKLSAgICAg
ICAgICB9Ci0gICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlmIChpc0VtcHR5KSB7Ci0gICAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0
YXRlLnB1dCh7IHZhbGlkQ2hhcnM6ICIvIiB9KTsKLSAgICAgICAgICByZWdleCArPSAiLyI7Ci0g
ICAgICAgIH0KLQotICAgICAgICBjdXJyZW50U3RhdGUuaGFuZGxlcnMgPSBoYW5kbGVyczsKLSAg
ICAgICAgY3VycmVudFN0YXRlLnJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleCArICIkIik7Ci0gICAg
ICAgIGN1cnJlbnRTdGF0ZS50eXBlcyA9IHR5cGVzOwotCi0gICAgICAgIGlmIChuYW1lID0gb3B0
aW9ucyAmJiBvcHRpb25zLmFzKSB7Ci0gICAgICAgICAgdGhpcy5uYW1lc1tuYW1lXSA9IHsKLSAg
ICAgICAgICAgIHNlZ21lbnRzOiBhbGxTZWdtZW50cywKLSAgICAgICAgICAgIGhhbmRsZXJzOiBo
YW5kbGVycwotICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgIH0sCi0KLSAgICAgIGhhbmRs
ZXJzRm9yOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZhciByb3V0ZSA9IHRoaXMubmFtZXNb
bmFtZV0sIHJlc3VsdCA9IFtdOwotICAgICAgICBpZiAoIXJvdXRlKSB7IHRocm93IG5ldyBFcnJv
cigiVGhlcmUgaXMgbm8gcm91dGUgbmFtZWQgIiArIG5hbWUpOyB9Ci0KLSAgICAgICAgZm9yICh2
YXIgaT0wLCBsPXJvdXRlLmhhbmRsZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBy
ZXN1bHQucHVzaChyb3V0ZS5oYW5kbGVyc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gcmVzdWx0OwotICAgICAgfSwKLQotICAgICAgaGFzUm91dGU6IGZ1bmN0aW9uKG5hbWUpIHsK
LSAgICAgICAgcmV0dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKLSAgICAgIH0sCi0KLSAgICAgIGdl
bmVyYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMpIHsKLSAgICAgICAgdmFyIHJvdXRlID0gdGhp
cy5uYW1lc1tuYW1lXSwgb3V0cHV0ID0gIiI7Ci0gICAgICAgIGlmICghcm91dGUpIHsgdGhyb3cg
bmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiICsgbmFtZSk7IH0KLQotICAgICAg
ICB2YXIgc2VnbWVudHMgPSByb3V0ZS5zZWdtZW50czsKLQotICAgICAgICBmb3IgKHZhciBpPTAs
IGw9c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICAgIHZhciBzZWdtZW50ID0g
c2VnbWVudHNbaV07Ci0KLSAgICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVwc2lsb25T
ZWdtZW50KSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgICBvdXRwdXQgKz0gIi8iOwotICAgICAg
ICAgIG91dHB1dCArPSBzZWdtZW50LmdlbmVyYXRlKHBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAob3V0cHV0LmNoYXJBdCgwKSAhPT0gJy8nKSB7IG91dHB1dCA9ICcvJyArIG91dHB1
dDsgfQotCi0gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLnF1ZXJ5UGFyYW1zKSB7Ci0gICAg
ICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJhdGVRdWVyeVN0cmluZyhwYXJhbXMucXVlcnlQYXJh
bXMsIHJvdXRlLmhhbmRsZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdXRwdXQ7
Ci0gICAgICB9LAotCi0gICAgICBnZW5lcmF0ZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbihwYXJhbXMs
IGhhbmRsZXJzKSB7Ci0gICAgICAgIHZhciBwYWlycyA9IFtdLCBhbGxvd2VkUGFyYW1zID0gW107
Ci0gICAgICAgIGZvcih2YXIgaT0wOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAg
ICAgICB2YXIgY3VycmVudFBhcmFtTGlzdCA9IGhhbmRsZXJzW2ldLnF1ZXJ5UGFyYW1zOwotICAg
ICAgICAgIGlmKGN1cnJlbnRQYXJhbUxpc3QpIHsKLSAgICAgICAgICAgIGFsbG93ZWRQYXJhbXMu
cHVzaC5hcHBseShhbGxvd2VkUGFyYW1zLCBjdXJyZW50UGFyYW1MaXN0KTsKLSAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKHZhciBrZXkgaW4gcGFyYW1zKSB7Ci0gICAgICAgICAg
aWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAgICAgICBpZihhbGxvd2Vk
UGFyYW1zLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHsKLSAgICAgICAgICAgICAgdGhyb3cgJ1F1ZXJ5
IHBhcmFtICInICsga2V5ICsgJyIgaXMgbm90IHNwZWNpZmllZCBhcyBhIHZhbGlkIHBhcmFtIGZv
ciB0aGlzIHJvdXRlJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBh
cmFtc1trZXldOwotICAgICAgICAgICAgdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5
KTsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgIHBhaXIg
Kz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIHBhaXJzLnB1c2gocGFpcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKHBhaXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH0KLQotICAgICAgICByZXR1
cm4gIj8iICsgcGFpcnMuam9pbigiJiIpOwotICAgICAgfSwKLQotICAgICAgcGFyc2VRdWVyeVN0
cmluZzogZnVuY3Rpb24ocXVlcnlTdHJpbmcpIHsKLSAgICAgICAgdmFyIHBhaXJzID0gcXVlcnlT
dHJpbmcuc3BsaXQoIiYiKSwgcXVlcnlQYXJhbXMgPSB7fTsKLSAgICAgICAgZm9yKHZhciBpPTA7
IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHZhciBwYWlyICAgICAgPSBwYWly
c1tpXS5zcGxpdCgnPScpLAotICAgICAgICAgICAgICBrZXkgICAgICAgPSBkZWNvZGVVUklDb21w
b25lbnQocGFpclswXSksCi0gICAgICAgICAgICAgIHZhbHVlICAgICA9IHBhaXJbMV0gPyBkZWNv
ZGVVUklDb21wb25lbnQocGFpclsxXSkgOiB0cnVlOwotICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tl
eV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7Ci0gICAg
ICB9LAotCi0gICAgICByZWNvZ25pemU6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAgICAgdmFyIHN0
YXRlcyA9IFsgdGhpcy5yb290U3RhdGUgXSwKLSAgICAgICAgICAgIHBhdGhMZW4sIGksIGwsIHF1
ZXJ5U3RhcnQsIHF1ZXJ5UGFyYW1zID0ge307Ci0KLSAgICAgICAgcXVlcnlTdGFydCA9IHBhdGgu
aW5kZXhPZignPycpOwotICAgICAgICBpZiAocXVlcnlTdGFydCAhPT0gLTEpIHsKLSAgICAgICAg
ICB2YXIgcXVlcnlTdHJpbmcgPSBwYXRoLnN1YnN0cihxdWVyeVN0YXJ0ICsgMSwgcGF0aC5sZW5n
dGgpOwotICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBxdWVyeVN0YXJ0KTsKLSAgICAg
ICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVN0cmluZyhxdWVyeVN0cmluZyk7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBERUJVRyBHUk9VUCBwYXRoCi0KLSAgICAgICAgaWYgKHBh
dGguY2hhckF0KDApICE9PSAiLyIpIHsgcGF0aCA9ICIvIiArIHBhdGg7IH0KLQotICAgICAgICBw
YXRoTGVuID0gcGF0aC5sZW5ndGg7Ci0gICAgICAgIGlmIChwYXRoTGVuID4gMSAmJiBwYXRoLmNo
YXJBdChwYXRoTGVuIC0gMSkgPT09ICIvIikgewotICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0
cigwLCBwYXRoTGVuIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGk9MCwgbD1wYXRo
Lmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgICBzdGF0ZXMgPSByZWNvZ25pemVDaGFyKHN0
YXRlcywgcGF0aC5jaGFyQXQoaSkpOwotICAgICAgICAgIGlmICghc3RhdGVzLmxlbmd0aCkgeyBi
cmVhazsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRU5EIERFQlVHIEdST1VQCi0KLSAgICAg
ICAgdmFyIHNvbHV0aW9ucyA9IFtdOwotICAgICAgICBmb3IgKGk9MCwgbD1zdGF0ZXMubGVuZ3Ro
OyBpPGw7IGkrKykgewotICAgICAgICAgIGlmIChzdGF0ZXNbaV0uaGFuZGxlcnMpIHsgc29sdXRp
b25zLnB1c2goc3RhdGVzW2ldKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGVzID0gc29y
dFNvbHV0aW9ucyhzb2x1dGlvbnMpOwotCi0gICAgICAgIHZhciBzdGF0ZSA9IHNvbHV0aW9uc1sw
XTsKLQotICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFuZGxlcnMpIHsKLSAgICAgICAgICBy
ZXR1cm4gZmluZEhhbmRsZXIoc3RhdGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgfQot
ICAgICAgfQotICAgIH07Ci0KLSAgICBmdW5jdGlvbiBUYXJnZXQocGF0aCwgbWF0Y2hlciwgZGVs
ZWdhdGUpIHsKLSAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICB0aGlzLm1hdGNoZXIgPSBt
YXRjaGVyOwotICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIFRh
cmdldC5wcm90b3R5cGUgPSB7Ci0gICAgICB0bzogZnVuY3Rpb24odGFyZ2V0LCBjYWxsYmFjaykg
ewotICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOwotCi0gICAgICAgIGlmIChk
ZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS53aWxsQWRkUm91dGUpIHsKLSAgICAgICAgICB0YXJnZXQgPSBk
ZWxlZ2F0ZS53aWxsQWRkUm91dGUodGhpcy5tYXRjaGVyLnRhcmdldCwgdGFyZ2V0KTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHRoaXMubWF0Y2hlci5hZGQodGhpcy5wYXRoLCB0YXJnZXQpOwotCi0g
ICAgICAgIGlmIChjYWxsYmFjaykgewotICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09
IDApIHsgdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZSBm
dW5jdGlvbiBwYXNzZWQgdG8gYHRvYCIpOyB9Ci0gICAgICAgICAgdGhpcy5tYXRjaGVyLmFkZENo
aWxkKHRoaXMucGF0aCwgdGFyZ2V0LCBjYWxsYmFjaywgdGhpcy5kZWxlZ2F0ZSk7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9LAotCi0gICAgICB3aXRoUXVlcnlQYXJh
bXM6IGZ1bmN0aW9uKCkgewotICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgeyB0
aHJvdyBuZXcgRXJyb3IoInlvdSBtdXN0IHByb3ZpZGUgYXJndW1lbnRzIHRvIHRoZSB3aXRoUXVl
cnlQYXJhbXMgbWV0aG9kIik7IH0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVu
dHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0g
InN0cmluZyIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigneW91IHNob3VsZCBjYWxs
IHdpdGhRdWVyeVBhcmFtcyB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzLCBlLmcuIHdpdGhRdWVyeVBh
cmFtcygiZm9vIiwgImJhciIpJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZh
ciBxdWVyeVBhcmFtcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICAgICAgdGhpcy5t
YXRjaGVyLmFkZFF1ZXJ5UGFyYW1zKHRoaXMucGF0aCwgcXVlcnlQYXJhbXMpOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBNYXRjaGVyKHRhcmdldCkgewotICAgICAgdGhpcy5yb3V0
ZXMgPSB7fTsKLSAgICAgIHRoaXMuY2hpbGRyZW4gPSB7fTsKLSAgICAgIHRoaXMucXVlcnlQYXJh
bXMgPSB7fTsKLSAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIH0KLQotICAgIE1hdGNo
ZXIucHJvdG90eXBlID0gewotICAgICAgYWRkOiBmdW5jdGlvbihwYXRoLCBoYW5kbGVyKSB7Ci0g
ICAgICAgIHRoaXMucm91dGVzW3BhdGhdID0gaGFuZGxlcjsKLSAgICAgIH0sCi0KLSAgICAgIGFk
ZFF1ZXJ5UGFyYW1zOiBmdW5jdGlvbihwYXRoLCBwYXJhbXMpIHsKLSAgICAgICAgdGhpcy5xdWVy
eVBhcmFtc1twYXRoXSA9IHBhcmFtczsKLSAgICAgIH0sCi0KLSAgICAgIGFkZENoaWxkOiBmdW5j
dGlvbihwYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCBkZWxlZ2F0ZSkgewotICAgICAgICB2YXIgbWF0
Y2hlciA9IG5ldyBNYXRjaGVyKHRhcmdldCk7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW5bcGF0aF0g
PSBtYXRjaGVyOwotCi0gICAgICAgIHZhciBtYXRjaCA9IGdlbmVyYXRlTWF0Y2gocGF0aCwgbWF0
Y2hlciwgZGVsZWdhdGUpOwotCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAmJiBkZWxlZ2F0ZS5jb250
ZXh0RW50ZXJlZCkgewotICAgICAgICAgIGRlbGVnYXRlLmNvbnRleHRFbnRlcmVkKHRhcmdldCwg
bWF0Y2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FsbGJhY2sobWF0Y2gpOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hl
ciwgZGVsZWdhdGUpIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoLCBuZXN0ZWRDYWxsYmFj
aykgewotICAgICAgICB2YXIgZnVsbFBhdGggPSBzdGFydGluZ1BhdGggKyBwYXRoOwotCi0gICAg
ICAgIGlmIChuZXN0ZWRDYWxsYmFjaykgewotICAgICAgICAgIG5lc3RlZENhbGxiYWNrKGdlbmVy
YXRlTWF0Y2goZnVsbFBhdGgsIG1hdGNoZXIsIGRlbGVnYXRlKSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQoc3RhcnRpbmdQYXRoICsgcGF0aCwgbWF0Y2hl
ciwgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIGZ1bmN0aW9u
IGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIGhhbmRsZXIsIHF1ZXJ5UGFyYW1zKSB7Ci0gICAg
ICB2YXIgbGVuID0gMDsKLSAgICAgIGZvciAodmFyIGk9MCwgbD1yb3V0ZUFycmF5Lmxlbmd0aDsg
aTxsOyBpKyspIHsKLSAgICAgICAgbGVuICs9IHJvdXRlQXJyYXlbaV0ucGF0aC5sZW5ndGg7Ci0g
ICAgICB9Ci0KLSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihsZW4pOwotICAgICAgdmFyIHJvdXRl
ID0geyBwYXRoOiBwYXRoLCBoYW5kbGVyOiBoYW5kbGVyIH07Ci0gICAgICBpZihxdWVyeVBhcmFt
cykgeyByb3V0ZS5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zOyB9Ci0gICAgICByb3V0ZUFycmF5
LnB1c2gocm91dGUpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGVhY2hSb3V0ZShiYXNlUm91dGUs
IG1hdGNoZXIsIGNhbGxiYWNrLCBiaW5kaW5nKSB7Ci0gICAgICB2YXIgcm91dGVzID0gbWF0Y2hl
ci5yb3V0ZXM7Ci0gICAgICB2YXIgcXVlcnlQYXJhbXMgPSBtYXRjaGVyLnF1ZXJ5UGFyYW1zOwot
Ci0gICAgICBmb3IgKHZhciBwYXRoIGluIHJvdXRlcykgewotICAgICAgICBpZiAocm91dGVzLmhh
c093blByb3BlcnR5KHBhdGgpKSB7Ci0gICAgICAgICAgdmFyIHJvdXRlQXJyYXkgPSBiYXNlUm91
dGUuc2xpY2UoKTsKLSAgICAgICAgICBhZGRSb3V0ZShyb3V0ZUFycmF5LCBwYXRoLCByb3V0ZXNb
cGF0aF0sIHF1ZXJ5UGFyYW1zW3BhdGhdKTsKLQotICAgICAgICAgIGlmIChtYXRjaGVyLmNoaWxk
cmVuW3BhdGhdKSB7Ci0gICAgICAgICAgICBlYWNoUm91dGUocm91dGVBcnJheSwgbWF0Y2hlci5j
aGlsZHJlbltwYXRoXSwgY2FsbGJhY2ssIGJpbmRpbmcpOwotICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIHJvdXRlQXJyYXkpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIFJvdXRlUmVjb2duaXplci5wcm90
b3R5cGUubWFwID0gZnVuY3Rpb24oY2FsbGJhY2ssIGFkZFJvdXRlQ2FsbGJhY2spIHsKLSAgICAg
IHZhciBtYXRjaGVyID0gbmV3IE1hdGNoZXIoKTsKLQotICAgICAgY2FsbGJhY2soZ2VuZXJhdGVN
YXRjaCgiIiwgbWF0Y2hlciwgdGhpcy5kZWxlZ2F0ZSkpOwotCi0gICAgICBlYWNoUm91dGUoW10s
IG1hdGNoZXIsIGZ1bmN0aW9uKHJvdXRlKSB7Ci0gICAgICAgIGlmIChhZGRSb3V0ZUNhbGxiYWNr
KSB7IGFkZFJvdXRlQ2FsbGJhY2sodGhpcywgcm91dGUpOyB9Ci0gICAgICAgIGVsc2UgeyB0aGlz
LmFkZChyb3V0ZSk7IH0KLSAgICAgIH0sIHRoaXMpOwotICAgIH07Ci0gICAgcmV0dXJuIFJvdXRl
UmVjb2duaXplcjsKLSAgfSk7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci1kZWZpbmUo
InJvdXRlciIsCi0gIFsicm91dGUtcmVjb2duaXplciIsInJzdnAiLCJleHBvcnRzIl0sCi0gIGZ1
bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewot
ICAgICJ1c2Ugc3RyaWN0IjsKLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMg
ZmlsZSByZWZlcmVuY2VzIHNldmVyYWwgaW50ZXJuYWwgc3RydWN0dXJlczoKLQotICAgICAgIyMg
YFJlY29nbml6ZWRIYW5kbGVyYAotCi0gICAgICAqIGB7U3RyaW5nfSBoYW5kbGVyYDogQSBoYW5k
bGVyIG5hbWUKLSAgICAgICogYHtPYmplY3R9IHBhcmFtc2A6IEEgaGFzaCBvZiByZWNvZ25pemVk
IHBhcmFtZXRlcnMKLQotICAgICAgIyMgYEhhbmRsZXJJbmZvYAotCi0gICAgICAqIGB7Qm9vbGVh
bn0gaXNEeW5hbWljYDogd2hldGhlciBhIGhhbmRsZXIgaGFzIGFueSBkeW5hbWljIHNlZ21lbnRz
Ci0gICAgICAqIGB7U3RyaW5nfSBuYW1lYDogdGhlIG5hbWUgb2YgYSBoYW5kbGVyCi0gICAgICAq
IGB7T2JqZWN0fSBoYW5kbGVyYDogYSBoYW5kbGVyIG9iamVjdAotICAgICAgKiBge09iamVjdH0g
Y29udGV4dGA6IHRoZSBhY3RpdmUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXIKLSAgICAqLwotCi0g
ICAgdmFyIFJvdXRlUmVjb2duaXplciA9IF9fZGVwZW5kZW5jeTFfXzsKLSAgICB2YXIgUlNWUCA9
IF9fZGVwZW5kZW5jeTJfXzsKLQotICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGlj
ZTsKLQotCi0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIEEgVHJhbnNpdGlvbiBp
cyBhIHRoZW5uYWJsZSAoYSBwcm9taXNlLWxpa2Ugb2JqZWN0KSB0aGF0IHJlcHJlc2VudHMKLSAg
ICAgIGFuIGF0dGVtcHQgdG8gdHJhbnNpdGlvbiB0byBhbm90aGVyIHJvdXRlLiBJdCBjYW4gYmUg
YWJvcnRlZCwgZWl0aGVyCi0gICAgICBleHBsaWNpdGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVt
cHRpbmcgYW5vdGhlciB0cmFuc2l0aW9uIHdoaWxlIGEKLSAgICAgIHByZXZpb3VzIG9uZSBpcyBz
dGlsbCB1bmRlcndheS4gQW4gYWJvcnRlZCB0cmFuc2l0aW9uIGNhbiBhbHNvCi0gICAgICBiZSBg
cmV0cnkoKWBkIGxhdGVyLgotICAgICAqLwotCi0gICAgZnVuY3Rpb24gVHJhbnNpdGlvbihyb3V0
ZXIsIHByb21pc2UpIHsKLSAgICAgIHRoaXMucm91dGVyID0gcm91dGVyOwotICAgICAgdGhpcy5w
cm9taXNlID0gcHJvbWlzZTsKLSAgICAgIHRoaXMuZGF0YSA9IHt9OwotICAgICAgdGhpcy5yZXNv
bHZlZE1vZGVscyA9IHt9OwotICAgICAgdGhpcy5wcm92aWRlZE1vZGVscyA9IHt9OwotICAgICAg
dGhpcy5wcm92aWRlZE1vZGVsc0FycmF5ID0gW107Ci0gICAgICB0aGlzLnNlcXVlbmNlID0gKytU
cmFuc2l0aW9uLmN1cnJlbnRTZXF1ZW5jZTsKLSAgICAgIHRoaXMucGFyYW1zID0ge307Ci0gICAg
fQotCi0gICAgVHJhbnNpdGlvbi5jdXJyZW50U2VxdWVuY2UgPSAwOwotCi0gICAgVHJhbnNpdGlv
bi5wcm90b3R5cGUgPSB7Ci0gICAgICB0YXJnZXROYW1lOiBudWxsLAotICAgICAgdXJsTWV0aG9k
OiAndXBkYXRlJywKLSAgICAgIHByb3ZpZGVkTW9kZWxzOiBudWxsLAotICAgICAgcmVzb2x2ZWRN
b2RlbHM6IG51bGwsCi0gICAgICBwYXJhbXM6IG51bGwsCi0gICAgICBwaXZvdEhhbmRsZXI6IG51
bGwsCi0gICAgICByZXNvbHZlSW5kZXg6IDAsCi0gICAgICBoYW5kbGVySW5mb3M6IG51bGwsCi0K
LSAgICAgIGlzQWN0aXZlOiB0cnVlLAotCi0gICAgICAvKioKLSAgICAgICAgVGhlIFRyYW5zaXRp
b24ncyBpbnRlcm5hbCBwcm9taXNlLiBDYWxsaW5nIGAudGhlbmAgb24gdGhpcyBwcm9wZXJ0eQot
ICAgICAgICBpcyB0aGF0IHNhbWUgYXMgY2FsbGluZyBgLnRoZW5gIG9uIHRoZSBUcmFuc2l0aW9u
IG9iamVjdCBpdHNlbGYsIGJ1dAotICAgICAgICB0aGlzIHByb3BlcnR5IGlzIGV4cG9zZWQgZm9y
IHdoZW4geW91IHdhbnQgdG8gcGFzcyBhcm91bmQgYQotICAgICAgICBUcmFuc2l0aW9uJ3MgcHJv
bWlzZSwgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBvYmplY3QgaXRzZWxmLCBzaW5jZQotICAgICAg
ICBUcmFuc2l0aW9uIG9iamVjdCBjYW4gYmUgZXh0ZXJuYWxseSBgYWJvcnRgZWQsIHdoaWxlIHRo
ZSBwcm9taXNlCi0gICAgICAgIGNhbm5vdC4KLSAgICAgICAqLwotICAgICAgcHJvbWlzZTogbnVs
bCwKLQotICAgICAgLyoqCi0gICAgICAgIEN1c3RvbSBzdGF0ZSBjYW4gYmUgc3RvcmVkIG9uIGEg
VHJhbnNpdGlvbidzIGBkYXRhYCBvYmplY3QuCi0gICAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBm
b3IgZGVjb3JhdGluZyBhIFRyYW5zaXRpb24gd2l0aGluIGFuIGVhcmxpZXIKLSAgICAgICAgaG9v
ayBhbmQgc2hhcmVkIHdpdGggYSBsYXRlciBob29rLiBQcm9wZXJ0aWVzIHNldCBvbiBgZGF0YWAg
d2lsbAotICAgICAgICBiZSBjb3BpZWQgdG8gbmV3IHRyYW5zaXRpb25zIGdlbmVyYXRlZCBieSBj
YWxsaW5nIGByZXRyeWAgb24gdGhpcwotICAgICAgICB0cmFuc2l0aW9uLgotICAgICAgICovCi0g
ICAgICBkYXRhOiBudWxsLAotCi0gICAgICAvKioKLSAgICAgICAgQSBzdGFuZGFyZCBwcm9taXNl
IGhvb2sgdGhhdCByZXNvbHZlcyBpZiB0aGUgdHJhbnNpdGlvbgotICAgICAgICBzdWNjZWVkcyBh
bmQgcmVqZWN0cyBpZiBpdCBmYWlscy9yZWRpcmVjdHMvYWJvcnRzLgotCi0gICAgICAgIEZvcndh
cmRzIHRvIHRoZSBpbnRlcm5hbCBgcHJvbWlzZWAgcHJvcGVydHkgd2hpY2ggeW91IGNhbgotICAg
ICAgICB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBwYXNzIGFyb3VuZCBhIHRo
ZW5uYWJsZSwKLSAgICAgICAgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBpdHNlbGYuCi0KLSAgICAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gc3VjY2VzcwotICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBm
YWlsdXJlCi0gICAgICAgKi8KLSAgICAgIHRoZW46IGZ1bmN0aW9uKHN1Y2Nlc3MsIGZhaWx1cmUp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKHN1Y2Nlc3MsIGZhaWx1cmUpOwot
ICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEFib3J0cyB0aGUgVHJhbnNpdGlvbi4gTm90
ZSB5b3UgY2FuIGFsc28gaW1wbGljaXRseSBhYm9ydCBhIHRyYW5zaXRpb24KLSAgICAgICAgYnkg
aW5pdGlhdGluZyBhbm90aGVyIHRyYW5zaXRpb24gd2hpbGUgYSBwcmV2aW91cyBvbmUgaXMgdW5k
ZXJ3YXkuCi0gICAgICAgKi8KLSAgICAgIGFib3J0OiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYg
KHRoaXMuaXNBYm9ydGVkKSB7IHJldHVybiB0aGlzOyB9Ci0gICAgICAgIGxvZyh0aGlzLnJvdXRl
ciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJnZXROYW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJv
cnRlZCIpOwotICAgICAgICB0aGlzLmlzQWJvcnRlZCA9IHRydWU7Ci0gICAgICAgIHRoaXMuaXNB
Y3RpdmUgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51
bGw7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAg
IFJldHJpZXMgYSBwcmV2aW91c2x5LWFib3J0ZWQgdHJhbnNpdGlvbiAobWFraW5nIHN1cmUgdG8g
YWJvcnQgdGhlCi0gICAgICAgIHRyYW5zaXRpb24gaWYgaXQncyBzdGlsbCBhY3RpdmUpLiBSZXR1
cm5zIGEgbmV3IHRyYW5zaXRpb24gdGhhdAotICAgICAgICByZXByZXNlbnRzIHRoZSBuZXcgYXR0
ZW1wdCB0byB0cmFuc2l0aW9uLgotICAgICAgICovCi0gICAgICByZXRyeTogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIHRoaXMuYWJvcnQoKTsKLSAgICAgICAgdmFyIHJlY29nSGFuZGxlcnMgPSB0aGlz
LnJvdXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKHRoaXMudGFyZ2V0TmFtZSksCi0gICAgICAg
ICAgICBoYW5kbGVySW5mb3MgID0gZ2VuZXJhdGVIYW5kbGVySW5mb3NXaXRoUXVlcnlQYXJhbXMo
dGhpcy5yb3V0ZXIsIHJlY29nSGFuZGxlcnMsIHRoaXMucXVlcnlQYXJhbXMpLAotICAgICAgICAg
ICAgbmV3VHJhbnNpdGlvbiA9IHBlcmZvcm1UcmFuc2l0aW9uKHRoaXMucm91dGVyLCBoYW5kbGVy
SW5mb3MsIHRoaXMucHJvdmlkZWRNb2RlbHNBcnJheSwgdGhpcy5wYXJhbXMsIHRoaXMucXVlcnlQ
YXJhbXMsIHRoaXMuZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247Ci0gICAg
ICB9LAotCi0gICAgICAvKioKLSAgICAgICAgU2V0cyB0aGUgVVJMLWNoYW5naW5nIG1ldGhvZCB0
byBiZSBlbXBsb3llZCBhdCB0aGUgZW5kIG9mIGEKLSAgICAgICAgc3VjY2Vzc2Z1bCB0cmFuc2l0
aW9uLiBCeSBkZWZhdWx0LCBhIG5ldyBUcmFuc2l0aW9uIHdpbGwganVzdAotICAgICAgICB1c2Ug
YHVwZGF0ZVVSTGAsIGJ1dCBwYXNzaW5nICdyZXBsYWNlJyB0byB0aGlzIG1ldGhvZCB3aWxsCi0g
ICAgICAgIGNhdXNlIHRoZSBVUkwgdG8gdXBkYXRlIHVzaW5nICdyZXBsYWNlV2l0aCcgaW5zdGVh
ZC4gT21pdHRpbmcKLSAgICAgICAgYSBwYXJhbWV0ZXIgd2lsbCBkaXNhYmxlIHRoZSBVUkwgY2hh
bmdlLCBhbGxvd2luZyBmb3IgdHJhbnNpdGlvbnMKLSAgICAgICAgdGhhdCBkb24ndCB1cGRhdGUg
dGhlIFVSTCBhdCBjb21wbGV0aW9uICh0aGlzIGlzIGFsc28gdXNlZCBmb3IKLSAgICAgICAgaGFu
ZGxlVVJMLCBzaW5jZSB0aGUgVVJMIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmVmb3JlIHRoZQotICAg
ICAgICB0cmFuc2l0aW9uIHRvb2sgcGxhY2UpLgotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBt
ZXRob2QgdGhlIHR5cGUgb2YgVVJMLWNoYW5naW5nIG1ldGhvZCB0byB1c2UKLSAgICAgICAgICBh
dCB0aGUgZW5kIG9mIGEgdHJhbnNpdGlvbi4gQWNjZXB0ZWQgdmFsdWVzIGFyZSAncmVwbGFjZScs
Ci0gICAgICAgICAgZmFsc3kgdmFsdWVzLCBvciBhbnkgb3RoZXIgbm9uLWZhbHN5IHZhbHVlICh3
aGljaCBpcwotICAgICAgICAgIGludGVycHJldGVkIGFzIGFuIHVwZGF0ZVVSTCB0cmFuc2l0aW9u
KS4KLQotICAgICAgICBAcmV0dXJuIHtUcmFuc2l0aW9ufSB0aGlzIHRyYW5zaXRpb24KLSAgICAg
ICAqLwotICAgICAgbWV0aG9kOiBmdW5jdGlvbihtZXRob2QpIHsKLSAgICAgICAgdGhpcy51cmxN
ZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEZpcmVzIGFuIGV2ZW50IG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb2x2
ZWQvcmVzb2x2aW5nCi0gICAgICAgIGhhbmRsZXJzIHdpdGhpbiB0aGlzIHRyYW5zaXRpb24uIFVz
ZWZ1bCBmb3IgZmlyaW5nIGV2ZW50cwotICAgICAgICBvbiByb3V0ZSBoaWVyYXJjaGllcyB0aGF0
IGhhdmVuJ3QgZnVsbHkgYmVlbiBlbnRlcmVkIHlldC4KLQotICAgICAgICBAcGFyYW0ge0Jvb2xl
YW59IGlnbm9yZUZhaWx1cmUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKLSAgICAgICAg
QHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGZpcmUKLSAgICAg
ICAqLwotICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oaWdub3JlRmFpbHVyZSkgewotICAgICAgICB2
YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTsKLSAgICAgICAgaWYgKHR5cGVvZiBpZ25v
cmVGYWlsdXJlID09PSAnYm9vbGVhbicpIHsKLSAgICAgICAgICBhcmdzLnNoaWZ0KCk7Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXJyb3JzIG9uIHVuaGFuZGxlZCB0cmln
Z2VyIGV2ZW50cyBieSBkZWZhdWx0Ci0gICAgICAgICAgaWdub3JlRmFpbHVyZSA9IGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIHRyaWdnZXIodGhpcy5yb3V0ZXIsIHRoaXMuaGFuZGxlckluZm9z
LnNsaWNlKDAsIHRoaXMucmVzb2x2ZUluZGV4ICsgMSksIGlnbm9yZUZhaWx1cmUsIGFyZ3MpOwot
ICAgICAgfSwKLQotICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4g
IlRyYW5zaXRpb24gKHNlcXVlbmNlICIgKyB0aGlzLnNlcXVlbmNlICsgIikiOwotICAgICAgfQot
ICAgIH07Ci0KLSAgICBmdW5jdGlvbiBSb3V0ZXIoKSB7Ci0gICAgICB0aGlzLnJlY29nbml6ZXIg
PSBuZXcgUm91dGVSZWNvZ25pemVyKCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogc2VwYXJhdGUg
aW50byBtb2R1bGU/Ci0gICAgUm91dGVyLlRyYW5zaXRpb24gPSBUcmFuc2l0aW9uOwotCi0gICAg
X19leHBvcnRzX19bImRlZmF1bHQiXSA9IFJvdXRlcjsKLQotCi0gICAgLyoqCi0gICAgICBQcm9t
aXNlIHJlamVjdCByZWFzb25zIHBhc3NlZCB0byBwcm9taXNlIHJlamVjdGlvbgotICAgICAgaGFu
ZGxlcnMgZm9yIGZhaWxlZCB0cmFuc2l0aW9ucy4KLSAgICAgKi8KLSAgICBSb3V0ZXIuVW5yZWNv
Z25pemVkVVJMRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gICAgICB0aGlzLm1lc3NhZ2Ug
PSAobWVzc2FnZSB8fCAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKTsKLSAgICAgIHRoaXMubmFtZSA9
ICJVbnJlY29nbml6ZWRVUkxFcnJvciI7Ci0gICAgfTsKLQotICAgIFJvdXRlci5UcmFuc2l0aW9u
QWJvcnRlZCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNz
YWdlIHx8ICJUcmFuc2l0aW9uQWJvcnRlZCIpOwotICAgICAgdGhpcy5uYW1lID0gIlRyYW5zaXRp
b25BYm9ydGVkIjsKLSAgICB9OwotCi0gICAgZnVuY3Rpb24gZXJyb3JUcmFuc2l0aW9uKHJvdXRl
ciwgcmVhc29uKSB7Ci0gICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24ocm91dGVyLCBSU1ZQLnJl
amVjdChyZWFzb24pKTsKLSAgICB9Ci0KLQotICAgIFJvdXRlci5wcm90b3R5cGUgPSB7Ci0gICAg
ICAvKioKLSAgICAgICAgVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgcm91dGVyLiBUaGUg
QVBJIGlzIGVzc2VudGlhbGx5Ci0gICAgICAgIHRoZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2Qg
aW4gYHJvdXRlLXJlY29nbml6ZXJgLgotCi0gICAgICAgIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRo
ZSBTdHJpbmcgaGFuZGxlciBhdCB0aGUgbGFzdCBgLnRvKClgCi0gICAgICAgIGNhbGwgYW5kIHVz
ZXMgaXQgYXMgdGhlIG5hbWUgb2YgdGhlIHdob2xlIHJvdXRlLgotCi0gICAgICAgIEBwYXJhbSB7
RnVuY3Rpb259IGNhbGxiYWNrCi0gICAgICAqLwotICAgICAgbWFwOiBmdW5jdGlvbihjYWxsYmFj
aykgewotICAgICAgICB0aGlzLnJlY29nbml6ZXIuZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlOwot
Ci0gICAgICAgIHRoaXMucmVjb2duaXplci5tYXAoY2FsbGJhY2ssIGZ1bmN0aW9uKHJlY29nbml6
ZXIsIHJvdXRlKSB7Ci0gICAgICAgICAgdmFyIGxhc3RIYW5kbGVyID0gcm91dGVbcm91dGUubGVu
Z3RoIC0gMV0uaGFuZGxlcjsKLSAgICAgICAgICB2YXIgYXJncyA9IFtyb3V0ZSwgeyBhczogbGFz
dEhhbmRsZXIgfV07Ci0gICAgICAgICAgcmVjb2duaXplci5hZGQuYXBwbHkocmVjb2duaXplciwg
YXJncyk7Ci0gICAgICAgIH0pOwotICAgICAgfSwKLQotICAgICAgaGFzUm91dGU6IGZ1bmN0aW9u
KHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlY29nbml6ZXIuaGFzUm91dGUocm91dGUp
OwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIENsZWFycyB0aGUgY3VycmVudCBhbmQg
dGFyZ2V0IHJvdXRlIGhhbmRsZXJzIGFuZCB0cmlnZ2VycyBleGl0Ci0gICAgICAgIG9uIGVhY2gg
b2YgdGhlbSBzdGFydGluZyBhdCB0aGUgbGVhZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoCi0g
ICAgICAgIGl0cyBhbmNlc3RvcnMuCi0gICAgICAqLwotICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkg
ewotICAgICAgICBlYWNoSGFuZGxlcih0aGlzLmN1cnJlbnRIYW5kbGVySW5mb3MgfHwgW10sIGZ1
bmN0aW9uKGhhbmRsZXJJbmZvKSB7Ci0gICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5m
by5oYW5kbGVyOwotICAgICAgICAgIGlmIChoYW5kbGVyLmV4aXQpIHsKLSAgICAgICAgICAgIGhh
bmRsZXIuZXhpdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuY3Vy
cmVudEhhbmRsZXJJbmZvcyA9IG51bGw7Ci0gICAgICAgIHRoaXMudGFyZ2V0SGFuZGxlckluZm9z
ID0gbnVsbDsKLSAgICAgIH0sCi0KLSAgICAgIGFjdGl2ZVRyYW5zaXRpb246IG51bGwsCi0KLSAg
ICAgIC8qKgotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXI7Ci0gICAg
ICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1
YWxseQotICAgICAgICB2aWEgdGhlIGJhY2sgYW5kIGZvcndhcmQgYnV0dG9uKS4KLQotICAgICAg
ICBSZXR1cm5zIGFuIEFycmF5IG9mIGhhbmRsZXJzIGFuZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lh
dGVkCi0gICAgICAgIHdpdGggdGhvc2UgcGFyYW1ldGVycy4KLQotICAgICAgICBAcGFyYW0ge1N0
cmluZ30gdXJsIGEgVVJMIHRvIHByb2Nlc3MKLQotICAgICAgICBAcmV0dXJuIHtBcnJheX0gYW4g
QXJyYXkgb2YgYFtoYW5kbGVyLCBwYXJhbWV0ZXJdYCB0dXBsZXMKLSAgICAgICovCi0gICAgICBo
YW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgewotICAgICAgICAvLyBQZXJmb3JtIGEgVVJMLWJhc2Vk
IHRyYW5zaXRpb24sIGJ1dCBkb24ndCBjaGFuZ2UKLSAgICAgICAgLy8gdGhlIFVSTCBhZnRlcndh
cmQsIHNpbmNlIGl0IGFscmVhZHkgaGFwcGVuZWQuCi0gICAgICAgIHZhciBhcmdzID0gc2xpY2Uu
Y2FsbChhcmd1bWVudHMpOwotICAgICAgICBpZiAodXJsLmNoYXJBdCgwKSAhPT0gJy8nKSB7IGFy
Z3NbMF0gPSAnLycgKyB1cmw7IH0KLSAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBh
cmdzKS5tZXRob2QobnVsbCk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgSG9vayBw
b2ludCBmb3IgdXBkYXRpbmcgdGhlIFVSTC4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJs
IGEgVVJMIHRvIHVwZGF0ZSB0bwotICAgICAgKi8KLSAgICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigidXBkYXRlVVJMIGlzIG5vdCBpbXBsZW1lbnRl
ZCIpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIEhvb2sgcG9pbnQgZm9yIHJlcGxh
Y2luZyB0aGUgY3VycmVudCBVUkwsIGkuZS4gd2l0aCByZXBsYWNlU3RhdGUKLQotICAgICAgICBC
eSBkZWZhdWx0IHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyBgdXBkYXRlVVJMYAotCi0gICAgICAg
IEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8gdXBkYXRlIHRvCi0gICAgICAqLwotICAgICAg
cmVwbGFjZVVSTDogZnVuY3Rpb24odXJsKSB7Ci0gICAgICAgIHRoaXMudXBkYXRlVVJMKHVybCk7
Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgVHJhbnNpdGlvbiBpbnRvIHRoZSBzcGVj
aWZpZWQgbmFtZWQgcm91dGUuCi0KLSAgICAgICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBl
eGl0IGNhbGxiYWNrIG9uIGFueSBoYW5kbGVycwotICAgICAgICB0aGF0IGFyZSBubyBsb25nZXIg
cmVwcmVzZW50ZWQgYnkgdGhlIHRhcmdldCByb3V0ZS4KLQotICAgICAgICBAcGFyYW0ge1N0cmlu
Z30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAgICAgICovCi0gICAgICB0cmFuc2l0aW9u
VG86IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBh
cmd1bWVudHMpOwotICAgICAgfSwKLQotICAgICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBm
dW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMsIHRy
dWUpOwotICAgICAgfSwKLQotICAgICAgLyoqCi0gICAgICAgIElkZW50aWNhbCB0byBgdHJhbnNp
dGlvblRvYCBleGNlcHQgdGhhdCB0aGUgY3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAotICAg
ICAgICBpZiBwb3NzaWJsZS4KLQotICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBwcmlt
YXJpbHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3RhdGVgLgotCi0gICAgICAgIEBwYXJhbSB7U3Ry
aW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb3V0ZQotICAgICAgKi8KLSAgICAgIHJlcGxhY2VX
aXRoOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb1RyYW5zaXRpb24odGhpcywg
YXJndW1lbnRzKS5tZXRob2QoJ3JlcGxhY2UnKTsKLSAgICAgIH0sCi0KLSAgICAgIC8qKgotICAg
ICAgICBAcHJpdmF0ZQotCi0gICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgaGFuZGxlciBuYW1l
IGFuZCBhIGxpc3Qgb2YgY29udGV4dHMgYW5kIHJldHVybnMKLSAgICAgICAgYSBzZXJpYWxpemVk
IHBhcmFtZXRlciBoYXNoIHN1aXRhYmxlIHRvIHBhc3MgdG8gYHJlY29nbml6ZXIuZ2VuZXJhdGUo
KWAuCi0KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICAgIEBwYXJh
bSB7QXJyYXlbT2JqZWN0XX0gY29udGV4dHMKLSAgICAgICAgQHJldHVybiB7T2JqZWN0fSBhIHNl
cmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2gKLSAgICAgICovCi0KLSAgICAgIHBhcmFtc0ZvckhhbmRs
ZXI6IGZ1bmN0aW9uKGhhbmRsZXJOYW1lLCBjb250ZXh0cykgewotICAgICAgICB2YXIgcGFydGl0
aW9uZWRBcmdzID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7
Ci0gICAgICAgIHJldHVybiBwYXJhbXNGb3JIYW5kbGVyKHRoaXMsIGhhbmRsZXJOYW1lLCBwYXJ0
aXRpb25lZEFyZ3NbMF0sIHBhcnRpdGlvbmVkQXJnc1sxXSk7Ci0gICAgICB9LAotCi0gICAgICAv
KioKLSAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBoYW5kbGVyIG5hbWUgYW5kIHJldHVybnMg
YSBsaXN0IG9mIHF1ZXJ5IHBhcmFtcwotICAgICAgICB0aGF0IGFyZSB2YWxpZCB0byBwYXNzIHRv
IHRoZSBoYW5kbGVyIG9yIGl0cyBwYXJlbnRzCi0KLSAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGhh
bmRsZXJOYW1lCi0gICAgICAgIEByZXR1cm4ge0FycmF5W1N0cmluZ119IGEgbGlzdCBvZiBxdWVy
eSBwYXJhbWV0ZXJzCi0gICAgICAqLwotICAgICAgcXVlcnlQYXJhbXNGb3JIYW5kbGVyOiBmdW5j
dGlvbiAoaGFuZGxlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zRm9ySGFuZGxl
cih0aGlzLCBoYW5kbGVyTmFtZSk7Ci0gICAgICB9LAotCi0gICAgICAvKioKLSAgICAgICAgVGFr
ZSBhIG5hbWVkIHJvdXRlIGFuZCBjb250ZXh0IG9iamVjdHMgYW5kIGdlbmVyYXRlIGEKLSAgICAg
ICAgVVJMLgotCi0gICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBy
b3V0ZSB0byBnZW5lcmF0ZQotICAgICAgICAgIGEgVVJMIGZvcgotICAgICAgICBAcGFyYW0gey4u
Lk9iamVjdH0gb2JqZWN0cyBhIGxpc3Qgb2Ygb2JqZWN0cyB0byBzZXJpYWxpemUKLQotICAgICAg
ICBAcmV0dXJuIHtTdHJpbmd9IGEgVVJMCi0gICAgICAqLwotICAgICAgZ2VuZXJhdGU6IGZ1bmN0
aW9uKGhhbmRsZXJOYW1lKSB7Ci0gICAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3MgPSBleHRyYWN0
UXVlcnlQYXJhbXMoc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSwKLSAgICAgICAgICBzdXBwbGll
ZFBhcmFtcyA9IHBhcnRpdGlvbmVkQXJnc1swXSwKLSAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBh
cnRpdGlvbmVkQXJnc1sxXTsKLQotICAgICAgICB2YXIgcGFyYW1zID0gcGFyYW1zRm9ySGFuZGxl
cih0aGlzLCBoYW5kbGVyTmFtZSwgc3VwcGxpZWRQYXJhbXMsIHF1ZXJ5UGFyYW1zKSwKLSAgICAg
ICAgICB2YWxpZFF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXNGb3JIYW5kbGVyKHRoaXMsIGhhbmRs
ZXJOYW1lKTsKLQotICAgICAgICB2YXIgbWlzc2luZ1BhcmFtcyA9IFtdOwotCi0gICAgICAgIGZv
ciAodmFyIGtleSBpbiBxdWVyeVBhcmFtcykgewotICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5o
YXNPd25Qcm9wZXJ0eShrZXkpICYmICF+dmFsaWRRdWVyeVBhcmFtcy5pbmRleE9mKGtleSkpIHsK
LSAgICAgICAgICAgIG1pc3NpbmdQYXJhbXMucHVzaChrZXkpOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChtaXNzaW5nUGFyYW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAg
ICB2YXIgZXJyID0gJ1lvdSBzdXBwbGllZCB0aGUgcGFyYW1zICc7Ci0gICAgICAgICAgZXJyICs9
IG1pc3NpbmdQYXJhbXMubWFwKGZ1bmN0aW9uKHBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4g
JyInICsgcGFyYW0gKyAiPSIgKyBxdWVyeVBhcmFtc1twYXJhbV0gKyAnIic7Ci0gICAgICAgICAg
fSkuam9pbignIGFuZCAnKTsKLQotICAgICAgICAgIGVyciArPSAnIHdoaWNoIGFyZSBub3QgdmFs
aWQgZm9yIHRoZSAiJyArIGhhbmRsZXJOYW1lICsgJyIgaGFuZGxlciBvciBpdHMgcGFyZW50cyc7
Ci0KLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAg
IHJldHVybiB0aGlzLnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxlck5hbWUsIHBhcmFtcyk7Ci0g
ICAgICB9LAotCi0gICAgICBpc0FjdGl2ZTogZnVuY3Rpb24oaGFuZGxlck5hbWUpIHsKLSAgICAg
ICAgdmFyIHBhcnRpdGlvbmVkQXJncyAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwo
YXJndW1lbnRzLCAxKSksCi0gICAgICAgICAgICBjb250ZXh0cyAgICAgICAgICA9IHBhcnRpdGlv
bmVkQXJnc1swXSwKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1zICAgICAgID0gcGFydGl0aW9uZWRB
cmdzWzFdLAotICAgICAgICAgICAgYWN0aXZlUXVlcnlQYXJhbXMgID0ge30sCi0gICAgICAgICAg
ICBlZmZlY3RpdmVRdWVyeVBhcmFtcyA9IHt9OwotCi0gICAgICAgIHZhciB0YXJnZXRIYW5kbGVy
SW5mb3MgPSB0aGlzLnRhcmdldEhhbmRsZXJJbmZvcywKLSAgICAgICAgICAgIGZvdW5kID0gZmFs
c2UsIG5hbWVzLCBvYmplY3QsIGhhbmRsZXJJbmZvLCBoYW5kbGVyT2JqOwotCi0gICAgICAgIGlm
ICghdGFyZ2V0SGFuZGxlckluZm9zKSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgICAgIHZhciBy
ZWNvZ0hhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKHRhcmdldEhhbmRsZXJJ
bmZvc1t0YXJnZXRIYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSk7Ci0gICAgICAgIGZvciAo
dmFyIGk9dGFyZ2V0SGFuZGxlckluZm9zLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAg
ICBoYW5kbGVySW5mbyA9IHRhcmdldEhhbmRsZXJJbmZvc1tpXTsKLSAgICAgICAgICBpZiAoaGFu
ZGxlckluZm8ubmFtZSA9PT0gaGFuZGxlck5hbWUpIHsgZm91bmQgPSB0cnVlOyB9Ci0KLSAgICAg
ICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIHZhciByZWNvZ0hhbmRsZXIgPSByZWNvZ0hh
bmRsZXJzW2ldOwotCi0gICAgICAgICAgICBtZXJnZShhY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxl
ckluZm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zICE9PSBmYWxz
ZSkgewotICAgICAgICAgICAgICBtZXJnZShlZmZlY3RpdmVRdWVyeVBhcmFtcywgaGFuZGxlcklu
Zm8ucXVlcnlQYXJhbXMpOwotICAgICAgICAgICAgICBtZXJnZVNvbWVLZXlzKGVmZmVjdGl2ZVF1
ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcywgcmVjb2dIYW5kbGVyLnF1ZXJ5UGFyYW1zKTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvLmlzRHluYW1pYyAmJiBjb250
ZXh0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgIG9iamVjdCA9IGNvbnRleHRzLnBvcCgp
OwotCi0gICAgICAgICAgICAgIGlmIChpc1BhcmFtKG9iamVjdCkpIHsKLSAgICAgICAgICAgICAg
ICB2YXIgbmFtZSA9IHJlY29nSGFuZGxlci5uYW1lc1swXTsKLSAgICAgICAgICAgICAgICBpZiAo
IXRoaXMuY3VycmVudFBhcmFtcyB8fCAiIiArIG9iamVjdCAhPT0gdGhpcy5jdXJyZW50UGFyYW1z
W25hbWVdKSB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRs
ZXJJbmZvLmNvbnRleHQgIT09IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0KLSAgICAgICAgcmV0dXJuIGNvbnRleHRzLmxlbmd0aCA9PT0gMCAmJiBmb3VuZCAmJiBx
dWVyeVBhcmFtc0VxdWFsKGFjdGl2ZVF1ZXJ5UGFyYW1zLCBlZmZlY3RpdmVRdWVyeVBhcmFtcyk7
Ci0gICAgICB9LAotCi0gICAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZh
ciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwotICAgICAgICB0cmlnZ2VyKHRoaXMsIHRo
aXMuY3VycmVudEhhbmRsZXJJbmZvcywgZmFsc2UsIGFyZ3MpOwotICAgICAgfSwKLQotICAgICAg
LyoqCi0gICAgICAgIEhvb2sgcG9pbnQgZm9yIGxvZ2dpbmcgdHJhbnNpdGlvbiBzdGF0dXMgdXBk
YXRlcy4KLQotICAgICAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBs
b2cuCi0gICAgICAqLwotICAgICAgbG9nOiBudWxsCi0gICAgfTsKLQotICAgIC8qKgotICAgICAg
QHByaXZhdGUKLQotICAgICAgVXNlZCBpbnRlcm5hbGx5IGZvciBib3RoIFVSTCBhbmQgbmFtZWQg
dHJhbnNpdGlvbiB0byBkZXRlcm1pbmUKLSAgICAgIGEgc2hhcmVkIHBpdm90IHBhcmVudCByb3V0
ZSBhbmQgb3RoZXIgZGF0YSBuZWNlc3NhcnkgdG8gcGVyZm9ybQotICAgICAgYSB0cmFuc2l0aW9u
LgotICAgICAqLwotICAgIGZ1bmN0aW9uIGdldE1hdGNoUG9pbnQocm91dGVyLCBoYW5kbGVycywg
b2JqZWN0cywgaW5wdXRQYXJhbXMsIHF1ZXJ5UGFyYW1zKSB7Ci0KLSAgICAgIHZhciBtYXRjaFBv
aW50ID0gaGFuZGxlcnMubGVuZ3RoLAotICAgICAgICAgIHByb3ZpZGVkTW9kZWxzID0ge30sIGks
Ci0gICAgICAgICAgY3VycmVudEhhbmRsZXJJbmZvcyA9IHJvdXRlci5jdXJyZW50SGFuZGxlcklu
Zm9zIHx8IFtdLAotICAgICAgICAgIHBhcmFtcyA9IHt9LAotICAgICAgICAgIG9sZFBhcmFtcyA9
IHJvdXRlci5jdXJyZW50UGFyYW1zIHx8IHt9LAotICAgICAgICAgIGFjdGl2ZVRyYW5zaXRpb24g
PSByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiwKLSAgICAgICAgICBoYW5kbGVyUGFyYW1zID0ge30s
Ci0gICAgICAgICAgb2JqOwotCi0gICAgICBvYmplY3RzID0gc2xpY2UuY2FsbChvYmplY3RzKTsK
LSAgICAgIG1lcmdlKHBhcmFtcywgaW5wdXRQYXJhbXMpOwotCi0gICAgICBmb3IgKGkgPSBoYW5k
bGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICB2YXIgaGFuZGxlck9iaiA9
IGhhbmRsZXJzW2ldLAotICAgICAgICAgICAgaGFuZGxlck5hbWUgPSBoYW5kbGVyT2JqLmhhbmRs
ZXIsCi0gICAgICAgICAgICBvbGRIYW5kbGVySW5mbyA9IGN1cnJlbnRIYW5kbGVySW5mb3NbaV0s
Ci0gICAgICAgICAgICBoYXNDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYg
aGFuZGxlciBuYW1lcyBoYXZlIGNoYW5nZWQuCi0gICAgICAgIGlmICghb2xkSGFuZGxlckluZm8g
fHwgb2xkSGFuZGxlckluZm8ubmFtZSAhPT0gaGFuZGxlck9iai5oYW5kbGVyKSB7IGhhc0NoYW5n
ZWQgPSB0cnVlOyB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJPYmouaXNEeW5hbWljKSB7Ci0gICAg
ICAgICAgLy8gVVJMIHRyYW5zaXRpb24uCi0KLSAgICAgICAgICBpZiAob2JqID0gZ2V0TWF0Y2hQ
b2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwgdHJ1ZSwg
cGFyYW1zKSkgewotICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBw
cm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0gPSBvYmo7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5hbWVdID0ge307Ci0gICAgICAgICAgICBm
b3IgKHZhciBwcm9wIGluIGhhbmRsZXJPYmoucGFyYW1zKSB7Ci0gICAgICAgICAgICAgIGlmICgh
aGFuZGxlck9iai5wYXJhbXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWU7IH0KLSAg
ICAgICAgICAgICAgdmFyIG5ld1BhcmFtID0gaGFuZGxlck9iai5wYXJhbXNbcHJvcF07Ci0gICAg
ICAgICAgICAgIGlmIChvbGRQYXJhbXNbcHJvcF0gIT09IG5ld1BhcmFtKSB7IGhhc0NoYW5nZWQg
PSB0cnVlOyB9Ci0gICAgICAgICAgICAgIGhhbmRsZXJQYXJhbXNbaGFuZGxlck5hbWVdW3Byb3Bd
ID0gcGFyYW1zW3Byb3BdID0gbmV3UGFyYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJPYmouaGFzT3duUHJvcGVydHkoJ25hbWVzJykpIHsK
LSAgICAgICAgICAvLyBOYW1lZCB0cmFuc2l0aW9uLgotCi0gICAgICAgICAgaWYgKG9iamVjdHMu
bGVuZ3RoKSB7IGhhc0NoYW5nZWQgPSB0cnVlOyB9Ci0KLSAgICAgICAgICBpZiAob2JqID0gZ2V0
TWF0Y2hQb2ludE9iamVjdChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwg
aGFuZGxlck9iai5uYW1lc1swXSwgcGFyYW1zKSkgewotICAgICAgICAgICAgcHJvdmlkZWRNb2Rl
bHNbaGFuZGxlck5hbWVdID0gb2JqOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2
YXIgbmFtZXMgPSBoYW5kbGVyT2JqLm5hbWVzOwotICAgICAgICAgICAgaGFuZGxlclBhcmFtc1to
YW5kbGVyTmFtZV0gPSB7fTsKLSAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4gPSBuYW1l
cy5sZW5ndGg7IGogPCBsZW47ICsraikgewotICAgICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVz
W2pdOwotICAgICAgICAgICAgICBoYW5kbGVyUGFyYW1zW2hhbmRsZXJOYW1lXVtuYW1lXSA9IHBh
cmFtc1tuYW1lXSA9IHBhcmFtc1tuYW1lXSB8fCBvbGRQYXJhbXNbbmFtZV07Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4g
b2xkIGhhbmRsZXIsIHNlZSBpZiBxdWVyeSBwYXJhbXMgYXJlIHRoZSBzYW1lLiBJZiB0aGVyZSBp
c24ndCBhbiBvbGQgaGFuZGxlciwKLSAgICAgICAgLy8gaGFzQ2hhbmdlZCB3aWxsIGFscmVhZHkg
YmUgdHJ1ZSBoZXJlCi0gICAgICAgIGlmKG9sZEhhbmRsZXJJbmZvICYmICFxdWVyeVBhcmFtc0Vx
dWFsKG9sZEhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKSkg
ewotICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoaGFzQ2hhbmdlZCkgeyBtYXRjaFBvaW50ID0gaTsgfQotICAgICAgfQotCi0gICAgICBpZiAo
b2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiTW9yZSBjb250
ZXh0IG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiB0aGVyZSBhcmUgZHluYW1pYyBzZWdtZW50cyBm
b3IgdGhlIHJvdXRlOiAiICsgaGFuZGxlcnNbaGFuZGxlcnMubGVuZ3RoIC0gMV0uaGFuZGxlcik7
Ci0gICAgICB9Ci0KLSAgICAgIHZhciBwaXZvdEhhbmRsZXJJbmZvID0gY3VycmVudEhhbmRsZXJJ
bmZvc1ttYXRjaFBvaW50IC0gMV0sCi0gICAgICAgICAgcGl2b3RIYW5kbGVyID0gcGl2b3RIYW5k
bGVySW5mbyAmJiBwaXZvdEhhbmRsZXJJbmZvLmhhbmRsZXI7Ci0KLSAgICAgIHJldHVybiB7IG1h
dGNoUG9pbnQ6IG1hdGNoUG9pbnQsIHByb3ZpZGVkTW9kZWxzOiBwcm92aWRlZE1vZGVscywgcGFy
YW1zOiBwYXJhbXMsIGhhbmRsZXJQYXJhbXM6IGhhbmRsZXJQYXJhbXMsIHBpdm90SGFuZGxlcjog
cGl2b3RIYW5kbGVyIH07Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZ2V0TWF0Y2hQb2ludE9iamVj
dChvYmplY3RzLCBoYW5kbGVyTmFtZSwgYWN0aXZlVHJhbnNpdGlvbiwgcGFyYW1OYW1lLCBwYXJh
bXMpIHsKLQotICAgICAgaWYgKG9iamVjdHMubGVuZ3RoICYmIHBhcmFtTmFtZSkgewotCi0gICAg
ICAgIHZhciBvYmplY3QgPSBvYmplY3RzLnBvcCgpOwotCi0gICAgICAgIC8vIElmIHByb3ZpZGVk
IG9iamVjdCBpcyBzdHJpbmcgb3IgbnVtYmVyLCB0cmVhdCBhcyBwYXJhbS4KLSAgICAgICAgaWYg
KGlzUGFyYW0ob2JqZWN0KSkgewotICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gb2JqZWN0
LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIG9iamVjdDsK
LSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChhY3RpdmVUcmFuc2l0aW9uKSB7Ci0gICAgICAg
IC8vIFVzZSBtb2RlbCBmcm9tIHByZXZpb3VzIHRyYW5zaXRpb24gYXR0ZW1wdCwgcHJlZmVyYWJs
eSB0aGUgcmVzb2x2ZWQgb25lLgotICAgICAgICByZXR1cm4gYWN0aXZlVHJhbnNpdGlvbi5yZXNv
bHZlZE1vZGVsc1toYW5kbGVyTmFtZV0gfHwKLSAgICAgICAgICAgICAgIChwYXJhbU5hbWUgJiYg
YWN0aXZlVHJhbnNpdGlvbi5wcm92aWRlZE1vZGVsc1toYW5kbGVyTmFtZV0pOwotICAgICAgfQot
ICAgIH0KLQotICAgIGZ1bmN0aW9uIGlzUGFyYW0ob2JqZWN0KSB7Ci0gICAgICByZXR1cm4gKHR5
cGVvZiBvYmplY3QgPT09ICJzdHJpbmciIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0
eXBlb2Ygb2JqZWN0ID09PSAibnVtYmVyIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBOdW1iZXIpOwot
ICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMgbWV0aG9k
IHRha2VzIGEgaGFuZGxlciBuYW1lIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBxdWVyeSBwYXJhbXMK
LSAgICAgIHRoYXQgYXJlIHZhbGlkIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIgb3IgaXRzIHBhcmVu
dHMKLQotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAgQHBhcmFtIHtTdHJpbmd9
IGhhbmRsZXJOYW1lCi0gICAgICBAcmV0dXJuIHtBcnJheVtTdHJpbmddfSBhIGxpc3Qgb2YgcXVl
cnkgcGFyYW1ldGVycwotICAgICovCi0gICAgZnVuY3Rpb24gcXVlcnlQYXJhbXNGb3JIYW5kbGVy
KHJvdXRlciwgaGFuZGxlck5hbWUpIHsKLSAgICAgIHZhciBoYW5kbGVycyA9IHJvdXRlci5yZWNv
Z25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKLSAgICAgICAgcXVlcnlQYXJhbXMgPSBb
XTsKLQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewot
ICAgICAgICBxdWVyeVBhcmFtcy5wdXNoLmFwcGx5KHF1ZXJ5UGFyYW1zLCBoYW5kbGVyc1tpXS5x
dWVyeVBhcmFtcyB8fCBbXSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBxdWVyeVBhcmFtczsK
LSAgICB9Ci0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBUaGlzIG1ldGhvZCB0YWtl
cyBhIGhhbmRsZXIgbmFtZSBhbmQgYSBsaXN0IG9mIGNvbnRleHRzIGFuZCByZXR1cm5zCi0gICAg
ICBhIHNlcmlhbGl6ZWQgcGFyYW1ldGVyIGhhc2ggc3VpdGFibGUgdG8gcGFzcyB0byBgcmVjb2du
aXplci5nZW5lcmF0ZSgpYC4KLQotICAgICAgQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlcgotICAgICAg
QHBhcmFtIHtTdHJpbmd9IGhhbmRsZXJOYW1lCi0gICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19
IG9iamVjdHMKLSAgICAgIEByZXR1cm4ge09iamVjdH0gYSBzZXJpYWxpemVkIHBhcmFtZXRlciBo
YXNoCi0gICAgKi8KLSAgICBmdW5jdGlvbiBwYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxl
ck5hbWUsIG9iamVjdHMsIHF1ZXJ5UGFyYW1zKSB7Ci0KLSAgICAgIHZhciBoYW5kbGVycyA9IHJv
dXRlci5yZWNvZ25pemVyLmhhbmRsZXJzRm9yKGhhbmRsZXJOYW1lKSwKLSAgICAgICAgICBwYXJh
bXMgPSB7fSwKLSAgICAgICAgICBoYW5kbGVySW5mb3MgPSBnZW5lcmF0ZUhhbmRsZXJJbmZvc1dp
dGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBhcmFtcyksCi0gICAgICAgICAg
bWF0Y2hQb2ludCA9IGdldE1hdGNoUG9pbnQocm91dGVyLCBoYW5kbGVySW5mb3MsIG9iamVjdHMp
Lm1hdGNoUG9pbnQsCi0gICAgICAgICAgbWVyZ2VkUXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAg
ICBvYmplY3QsIGhhbmRsZXJPYmosIGhhbmRsZXIsIG5hbWVzLCBpOwotCi0gICAgICBwYXJhbXMu
cXVlcnlQYXJhbXMgPSB7fTsKLQotICAgICAgZm9yIChpPTA7IGk8aGFuZGxlcnMubGVuZ3RoOyBp
KyspIHsKLSAgICAgICAgaGFuZGxlck9iaiA9IGhhbmRsZXJzW2ldOwotICAgICAgICBoYW5kbGVy
ID0gcm91dGVyLmdldEhhbmRsZXIoaGFuZGxlck9iai5oYW5kbGVyKTsKLSAgICAgICAgbmFtZXMg
PSBoYW5kbGVyT2JqLm5hbWVzOwotCi0gICAgICAgIC8vIElmIGl0J3MgYSBkeW5hbWljIHNlZ21l
bnQKLSAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCkgewotICAgICAgICAgIC8vIElmIHdlIGhhdmUg
b2JqZWN0cywgdXNlIHRoZW0KLSAgICAgICAgICBpZiAoaSA+PSBtYXRjaFBvaW50KSB7Ci0gICAg
ICAgICAgICBvYmplY3QgPSBvYmplY3RzLnNoaWZ0KCk7Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNl
IHVzZSBleGlzdGluZyBjb250ZXh0Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9i
amVjdCA9IGhhbmRsZXIuY29udGV4dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBTZXJp
YWxpemUgdG8gZ2VuZXJhdGUgcGFyYW1zCi0gICAgICAgICAgbWVyZ2UocGFyYW1zLCBzZXJpYWxp
emUoaGFuZGxlciwgb2JqZWN0LCBuYW1lcykpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChxdWVy
eVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKHBhcmFtcy5xdWVy
eVBhcmFtcywgcm91dGVyLmN1cnJlbnRRdWVyeVBhcmFtcywgaGFuZGxlck9iai5xdWVyeVBhcmFt
cyk7Ci0gICAgICAgICAgbWVyZ2VTb21lS2V5cyhwYXJhbXMucXVlcnlQYXJhbXMsIHF1ZXJ5UGFy
YW1zLCBoYW5kbGVyT2JqLnF1ZXJ5UGFyYW1zKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAg
ICBpZiAocXVlcnlQYXJhbXNFcXVhbChwYXJhbXMucXVlcnlQYXJhbXMsIHt9KSkgeyBkZWxldGUg
cGFyYW1zLnF1ZXJ5UGFyYW1zOyB9Ci0gICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAg
IGZ1bmN0aW9uIG1lcmdlKGhhc2gsIG90aGVyKSB7Ci0gICAgICBmb3IgKHZhciBwcm9wIGluIG90
aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBoYXNoW3By
b3BdID0gb3RoZXJbcHJvcF07IH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBtZXJn
ZVNvbWVLZXlzKGhhc2gsIG90aGVyLCBrZXlzKSB7Ci0gICAgICBpZiAoIW90aGVyIHx8ICFrZXlz
KSB7IHJldHVybjsgfQotICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysp
IHsKLSAgICAgICAgdmFyIGtleSA9IGtleXNbaV0sIHZhbHVlOwotICAgICAgICBpZihvdGhlci5o
YXNPd25Qcm9wZXJ0eShrZXkpKSB7Ci0gICAgICAgICAgdmFsdWUgPSBvdGhlcltrZXldOwotICAg
ICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB0eXBlb2YgdmFs
dWUgPT09ICJ1bmRlZmluZWQiKSB7Ci0gICAgICAgICAgICBkZWxldGUgaGFzaFtrZXldOwotICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYXNoW2tleV0gPSBvdGhlcltrZXldOwotICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLSAgICAqLwotCi0gICAgZnVuY3Rpb24gZ2VuZXJhdGVIYW5kbGVySW5mb3NXaXRoUXVl
cnlQYXJhbXMocm91dGVyLCBoYW5kbGVycywgcXVlcnlQYXJhbXMpIHsKLSAgICAgIHZhciBoYW5k
bGVySW5mb3MgPSBbXTsKLQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5n
dGg7IGkrKykgewotICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldLAotICAgICAgICAg
IGhhbmRsZXJJbmZvID0geyBoYW5kbGVyOiBoYW5kbGVyLmhhbmRsZXIsIG5hbWVzOiBoYW5kbGVy
Lm5hbWVzLCBjb250ZXh0OiBoYW5kbGVyLmNvbnRleHQsIGlzRHluYW1pYzogaGFuZGxlci5pc0R5
bmFtaWMgfSwKLSAgICAgICAgICBhY3RpdmVRdWVyeVBhcmFtcyA9IHt9OwotCi0gICAgICAgIGlm
IChxdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKGFjdGl2
ZVF1ZXJ5UGFyYW1zLCByb3V0ZXIuY3VycmVudFF1ZXJ5UGFyYW1zLCBoYW5kbGVyLnF1ZXJ5UGFy
YW1zKTsKLSAgICAgICAgICBtZXJnZVNvbWVLZXlzKGFjdGl2ZVF1ZXJ5UGFyYW1zLCBxdWVyeVBh
cmFtcywgaGFuZGxlci5xdWVyeVBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFu
ZGxlci5xdWVyeVBhcmFtcyAmJiBoYW5kbGVyLnF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDApIHsKLSAg
ICAgICAgICBoYW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGFjdGl2ZVF1ZXJ5UGFyYW1zOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaGFuZGxlckluZm9zLnB1c2goaGFuZGxlckluZm8pOwotICAgICAg
fQotCi0gICAgICByZXR1cm4gaGFuZGxlckluZm9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAg
QHByaXZhdGUKLSAgICAqLwotICAgIGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5UGFyYW1UcmFuc2l0aW9u
KHJvdXRlciwgcXVlcnlQYXJhbXMsIGlzSW50ZXJtZWRpYXRlKSB7Ci0gICAgICB2YXIgY3VycmVu
dEhhbmRsZXJzID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3MsCi0gICAgICAgICAgY3VycmVu
dEhhbmRsZXIgPSBjdXJyZW50SGFuZGxlcnNbY3VycmVudEhhbmRsZXJzLmxlbmd0aCAtIDFdLAot
ICAgICAgICAgIG5hbWUgPSBjdXJyZW50SGFuZGxlci5uYW1lOwotCi0gICAgICBsb2cocm91dGVy
LCAiQXR0ZW1wdGluZyBxdWVyeSBwYXJhbSB0cmFuc2l0aW9uIik7Ci0KLSAgICAgIHJldHVybiBj
cmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBbbmFtZSwgcXVlcnlQYXJhbXNdLCBpc0ludGVy
bWVkaWF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotICAgICovCi0gICAg
ZnVuY3Rpb24gY3JlYXRlTmFtZWRUcmFuc2l0aW9uKHJvdXRlciwgYXJncywgaXNJbnRlcm1lZGlh
dGUpIHsKLSAgICAgIHZhciBwYXJ0aXRpb25lZEFyZ3MgICAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1z
KGFyZ3MpLAotICAgICAgICBwdXJlQXJncyAgICAgICAgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3Nb
MF0sCi0gICAgICAgIHF1ZXJ5UGFyYW1zICAgICAgICAgICA9IHBhcnRpdGlvbmVkQXJnc1sxXSwK
LSAgICAgICAgaGFuZGxlcnMgICAgICAgICAgICAgID0gcm91dGVyLnJlY29nbml6ZXIuaGFuZGxl
cnNGb3IocHVyZUFyZ3NbMF0pLAotICAgICAgICBoYW5kbGVySW5mb3MgICAgICAgICAgPSBnZW5l
cmF0ZUhhbmRsZXJJbmZvc1dpdGhRdWVyeVBhcmFtcyhyb3V0ZXIsIGhhbmRsZXJzLCBxdWVyeVBh
cmFtcyk7Ci0KLQotICAgICAgbG9nKHJvdXRlciwgIkF0dGVtcHRpbmcgdHJhbnNpdGlvbiB0byAi
ICsgcHVyZUFyZ3NbMF0pOwotCi0gICAgICByZXR1cm4gcGVyZm9ybVRyYW5zaXRpb24ocm91dGVy
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJJbmZvcywKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzbGljZS5jYWxsKHB1cmVBcmdzLCAxKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXIuY3VycmVudFBhcmFtcywKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJtZWRp
YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0gICAgKi8KLSAgICBmdW5j
dGlvbiBjcmVhdGVVUkxUcmFuc2l0aW9uKHJvdXRlciwgdXJsLCBpc0ludGVybWVkaWF0ZSkgewot
ICAgICAgdmFyIHJlc3VsdHMgPSByb3V0ZXIucmVjb2duaXplci5yZWNvZ25pemUodXJsKSwKLSAg
ICAgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRIYW5kbGVySW5mb3Ms
Ci0gICAgICAgICAgcXVlcnlQYXJhbXMgPSB7fSwKLSAgICAgICAgICBpLCBsZW47Ci0KLSAgICAg
IGxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0cmFuc2l0aW9uIHRvICIgKyB1cmwpOwotCi0g
ICAgICBpZiAocmVzdWx0cykgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyByb3V0ZSBpcyBh
Y3R1YWxseSBhY2Nlc3NpYmxlIGJ5IFVSTC4KLSAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVz
dWx0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewotCi0gICAgICAgICAgaWYgKHJvdXRlci5nZXRI
YW5kbGVyKHJlc3VsdHNbaV0uaGFuZGxlcikuaW5hY2Nlc3NpYmxlQnlVUkwpIHsKLSAgICAgICAg
ICAgIHJlc3VsdHMgPSBudWxsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcmVzdWx0cykgewotICAgICAgICByZXR1cm4g
ZXJyb3JUcmFuc2l0aW9uKHJvdXRlciwgbmV3IFJvdXRlci5VbnJlY29nbml6ZWRVUkxFcnJvcih1
cmwpKTsKLSAgICAgIH0KLQotICAgICAgZm9yKGkgPSAwLCBsZW4gPSByZXN1bHRzLmxlbmd0aDsg
aSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIG1lcmdlKHF1ZXJ5UGFyYW1zLCByZXN1bHRzW2ldLnF1
ZXJ5UGFyYW1zKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBlcmZvcm1UcmFuc2l0aW9uKHJv
dXRlciwgcmVzdWx0cywgW10sIHt9LCBxdWVyeVBhcmFtcywgbnVsbCwgaXNJbnRlcm1lZGlhdGUp
OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBUYWtlcyBhbiBB
cnJheSBvZiBgSGFuZGxlckluZm9gcywgZmlndXJlcyBvdXQgd2hpY2ggb25lcyBhcmUKLSAgICAg
IGV4aXRpbmcsIGVudGVyaW5nLCBvciBjaGFuZ2luZyBjb250ZXh0cywgYW5kIGNhbGxzIHRoZQot
ICAgICAgcHJvcGVyIGhhbmRsZXIgaG9va3MuCi0KLSAgICAgIEZvciBleGFtcGxlLCBjb25zaWRl
ciB0aGUgZm9sbG93aW5nIHRyZWUgb2YgaGFuZGxlcnMuIEVhY2ggaGFuZGxlciBpcwotICAgICAg
Zm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0IGhhbmRsZXMuCi0KLSAgICAgIGBgYAotICAg
ICAgfH5pbmRleCAoIi8iKQotICAgICAgfCB8fnBvc3RzICgiL3Bvc3RzIikKLSAgICAgIHwgfCB8
LXNob3dQb3N0ICgiLzppZCIpCi0gICAgICB8IHwgfC1uZXdQb3N0ICgiL25ldyIpCi0gICAgICB8
IHwgfC1lZGl0UG9zdCAoIi9lZGl0IikKLSAgICAgIHwgfH5hYm91dCAoIi9hYm91dC86aWQiKQot
ICAgICAgYGBgCi0KLSAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnM6Ci0K
LSAgICAgIDEuIEEgVVJMIHRyYW5zaXRpb24gdG8gYC9wb3N0cy8xYC4KLSAgICAgICAgIDEuIFRy
aWdnZXJzIHRoZSBgKm1vZGVsYCBjYWxsYmFja3Mgb24gdGhlCi0gICAgICAgICAgICBgaW5kZXhg
LCBgcG9zdHNgLCBhbmQgYHNob3dQb3N0YCBoYW5kbGVycwotICAgICAgICAgMi4gVHJpZ2dlcnMg
dGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gdGhlIHNhbWUKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRo
ZSBgc2V0dXBgIGNhbGxiYWNrIG9uIHRoZSBzYW1lCi0gICAgICAyLiBBIGRpcmVjdCB0cmFuc2l0
aW9uIHRvIGBuZXdQb3N0YAotICAgICAgICAgMS4gVHJpZ2dlcnMgdGhlIGBleGl0YCBjYWxsYmFj
ayBvbiBgc2hvd1Bvc3RgCi0gICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFj
ayBvbiBgbmV3UG9zdGAKLSAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxiYWNr
IG9uIGBuZXdQb3N0YAotICAgICAgMy4gQSBkaXJlY3QgdHJhbnNpdGlvbiB0byBgYWJvdXRgIHdp
dGggYSBzcGVjaWZpZWQKLSAgICAgICAgIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAxLiBUcmln
Z2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBuZXdQb3N0YAotICAgICAgICAgICAgYW5kIGBw
b3N0c2AKLSAgICAgICAgIDIuIFRyaWdnZXJzIHRoZSBgc2VyaWFsaXplYCBjYWxsYmFjayBvbiBg
YWJvdXRgCi0gICAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxsYmFjayBvbiBgYWJv
dXRgCi0gICAgICAgICA0LiBUcmlnZ2VycyB0aGUgYHNldHVwYCBjYWxsYmFjayBvbiBgYWJvdXRg
Ci0KLSAgICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgotICAgICAgQHBhcmFtIHtB
cnJheVtIYW5kbGVySW5mb119IGhhbmRsZXJJbmZvcwotICAgICovCi0gICAgZnVuY3Rpb24gc2V0
dXBDb250ZXh0cyh0cmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpIHsKLSAgICAgIHZhciByb3V0ZXIg
PSB0cmFuc2l0aW9uLnJvdXRlciwKLSAgICAgICAgICBwYXJ0aXRpb24gPSBwYXJ0aXRpb25IYW5k
bGVycyhyb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyB8fCBbXSwgaGFuZGxlckluZm9zKTsKLQot
ICAgICAgcm91dGVyLnRhcmdldEhhbmRsZXJJbmZvcyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAg
ZWFjaEhhbmRsZXIocGFydGl0aW9uLmV4aXRlZCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAg
ICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotICAgICAgICBkZWxldGUg
aGFuZGxlci5jb250ZXh0OwotICAgICAgICBpZiAoaGFuZGxlci5leGl0KSB7IGhhbmRsZXIuZXhp
dCgpOyB9Ci0gICAgICB9KTsKLQotICAgICAgdmFyIGN1cnJlbnRIYW5kbGVySW5mb3MgPSBwYXJ0
aXRpb24udW5jaGFuZ2VkLnNsaWNlKCk7Ci0gICAgICByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZv
cyA9IGN1cnJlbnRIYW5kbGVySW5mb3M7Ci0KLSAgICAgIGVhY2hIYW5kbGVyKHBhcnRpdGlvbi51
cGRhdGVkQ29udGV4dCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAgICAgICAgaGFuZGxlckVu
dGVyZWRPclVwZGF0ZWQodHJhbnNpdGlvbiwgY3VycmVudEhhbmRsZXJJbmZvcywgaGFuZGxlcklu
Zm8sIGZhbHNlKTsKLSAgICAgIH0pOwotCi0gICAgICBlYWNoSGFuZGxlcihwYXJ0aXRpb24uZW50
ZXJlZCwgZnVuY3Rpb24oaGFuZGxlckluZm8pIHsKLSAgICAgICAgaGFuZGxlckVudGVyZWRPclVw
ZGF0ZWQodHJhbnNpdGlvbiwgY3VycmVudEhhbmRsZXJJbmZvcywgaGFuZGxlckluZm8sIHRydWUp
OwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAgICBI
ZWxwZXIgbWV0aG9kIHVzZWQgYnkgc2V0dXBDb250ZXh0cy4gSGFuZGxlcyBlcnJvcnMgb3IgcmVk
aXJlY3RzCi0gICAgICB0aGF0IG1heSBoYXBwZW4gaW4gZW50ZXIvc2V0dXAuCi0gICAgKi8KLSAg
ICBmdW5jdGlvbiBoYW5kbGVyRW50ZXJlZE9yVXBkYXRlZCh0cmFuc2l0aW9uLCBjdXJyZW50SGFu
ZGxlckluZm9zLCBoYW5kbGVySW5mbywgZW50ZXIpIHsKLSAgICAgIHZhciBoYW5kbGVyID0gaGFu
ZGxlckluZm8uaGFuZGxlciwKLSAgICAgICAgICBjb250ZXh0ID0gaGFuZGxlckluZm8uY29udGV4
dDsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKGVudGVyICYmIGhhbmRsZXIuZW50ZXIpIHsg
aGFuZGxlci5lbnRlcigpOyB9Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0KLSAg
ICAgICAgc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KTsKLSAgICAgICAgc2V0UXVlcnlQYXJh
bXMoaGFuZGxlciwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpOwotCi0gICAgICAgIGlmIChoYW5k
bGVyLnNldHVwKSB7IGhhbmRsZXIuc2V0dXAoY29udGV4dCwgaGFuZGxlckluZm8ucXVlcnlQYXJh
bXMpOyB9Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0gICAgICB9IGNhdGNoKGUp
IHsKLSAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFJvdXRlci5UcmFuc2l0aW9uQWJvcnRlZCkp
IHsKLSAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBgZXJyb3JgIGV2ZW50IHN0YXJ0aW5nIGZyb20g
dGhpcyBmYWlsZWQgaGFuZGxlci4KLSAgICAgICAgICB0cmFuc2l0aW9uLnRyaWdnZXIodHJ1ZSwg
J2Vycm9yJywgZSwgdHJhbnNpdGlvbiwgaGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBQcm9wYWdhdGUgdGhlIGVycm9yIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gcHJvbWlzZSB3aWxs
IHJlamVjdC4KLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0KLQotICAgICAgY3VycmVudEhhbmRs
ZXJJbmZvcy5wdXNoKGhhbmRsZXJJbmZvKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLQotICAgICAgSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBgSGFuZGxlckluZm9gcywg
cGFzc2luZyB0aGUgaGFuZGxlcgotICAgICAgYW5kIGNvbnRleHQgaW50byB0aGUgY2FsbGJhY2su
Ci0KLSAgICAgIEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBoYW5kbGVySW5mb3MKLSAgICAg
IEBwYXJhbSB7RnVuY3Rpb24oT2JqZWN0LCBPYmplY3QpfSBjYWxsYmFjawotICAgICovCi0gICAg
ZnVuY3Rpb24gZWFjaEhhbmRsZXIoaGFuZGxlckluZm9zLCBjYWxsYmFjaykgewotICAgICAgZm9y
ICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNh
bGxiYWNrKGhhbmRsZXJJbmZvc1tpXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAg
ICBAcHJpdmF0ZQotCi0gICAgICBkZXRlcm1pbmVzIGlmIHR3byBxdWVyeXBhcmFtIG9iamVjdHMg
YXJlIHRoZSBzYW1lIG9yIG5vdAotICAgICoqLwotICAgIGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zRXF1
YWwoYSwgYikgewotICAgICAgYSA9IGEgfHwge307Ci0gICAgICBiID0gYiB8fCB7fTsKLSAgICAg
IHZhciBjaGVja2VkS2V5cyA9IFtdLCBrZXk7Ci0gICAgICBmb3Ioa2V5IGluIGEpIHsKLSAgICAg
ICAgaWYgKCFhLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KLSAgICAgICAgaWYo
YltrZXldICE9PSBhW2tleV0pIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIGNoZWNrZWRLZXlz
LnB1c2goa2V5KTsKLSAgICAgIH0KLSAgICAgIGZvcihrZXkgaW4gYikgewotICAgICAgICBpZiAo
IWIuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQotICAgICAgICBpZiAofmNoZWNr
ZWRLZXlzLmluZGV4T2Yoa2V5KSkgeyBjb250aW51ZTsgfQotICAgICAgICAvLyBiIGhhcyBhIGtl
eSBub3QgaW4gYQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIG9uZSBVUkwgdG8KLSAgICAg
IGFub3RoZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGhhbmRsZXJzIGFyZSBubyBsb25nZXIgYWN0aXZl
LAotICAgICAgd2hpY2ggaGFuZGxlcnMgYXJlIG5ld2x5IGFjdGl2ZSwgYW5kIHdoaWNoIGhhbmRs
ZXJzIHJlbWFpbgotICAgICAgYWN0aXZlIGJ1dCBoYXZlIHRoZWlyIGNvbnRleHQgY2hhbmdlZC4K
LQotICAgICAgVGFrZSBhIGxpc3Qgb2Ygb2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5k
IHBhcnRpdGlvbgotICAgICAgdGhlbSBpbnRvIGZvdXIgYnVja2V0czoKLQotICAgICAgKiB1bmNo
YW5nZWQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUgb2xkIGFuZAotICAgICAg
ICBuZXcgVVJMLCBhbmQgaXRzIGNvbnRleHQgcmVtYWlucyB0aGUgc2FtZQotICAgICAgKiB1cGRh
dGVkIGNvbnRleHQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUKLSAgICAgICAg
b2xkIGFuZCBuZXcgVVJMLCBidXQgaXRzIGNvbnRleHQgY2hhbmdlZC4gVGhlIGhhbmRsZXIncwot
ICAgICAgICBgc2V0dXBgIG1ldGhvZCwgaWYgYW55LCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBu
ZXcKLSAgICAgICAgY29udGV4dC4KLSAgICAgICogZXhpdGVkOiB0aGUgaGFuZGxlciB3YXMgYWN0
aXZlIGluIHRoZSBvbGQgVVJMLCBidXQgaXMKLSAgICAgICAgbm8gbG9uZ2VyIGFjdGl2ZS4KLSAg
ICAgICogZW50ZXJlZDogdGhlIGhhbmRsZXIgd2FzIG5vdCBhY3RpdmUgaW4gdGhlIG9sZCBVUkws
IGJ1dAotICAgICAgICBpcyBub3cgYWN0aXZlLgotCi0gICAgICBUaGUgUGFydGl0aW9uZWRIYW5k
bGVycyBzdHJ1Y3R1cmUgaGFzIGZvdXIgZmllbGRzOgotCi0gICAgICAqIGB1cGRhdGVkQ29udGV4
dGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdAotICAgICAgICByZXByZXNl
bnQgaGFuZGxlcnMgdGhhdCByZW1haW4gYWN0aXZlIGJ1dCBoYXZlIGEgY2hhbmdlZAotICAgICAg
ICBjb250ZXh0Ci0gICAgICAqIGBlbnRlcmVkYDogYSBsaXN0IG9mIGBIYW5kbGVySW5mb2Agb2Jq
ZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAgICBoYW5kbGVycyB0aGF0IGFyZSBuZXdseSBhY3Rp
dmUKLSAgICAgICogYGV4aXRlZGA6IGEgbGlzdCBvZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhh
dCBhcmUgbm8KLSAgICAgICAgbG9uZ2VyIGFjdGl2ZS4KLSAgICAgICogYHVuY2hhbmdlZGA6IGEg
bGlzdCBvZiBgSGFuZGVySW5mb2Agb2JqZWN0cyB0aGF0IHJlbWFpbiBhY3RpdmUuCi0KLSAgICAg
IEBwYXJhbSB7QXJyYXlbSGFuZGxlckluZm9dfSBvbGRIYW5kbGVycyBhIGxpc3Qgb2YgdGhlIGhh
bmRsZXIKLSAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91cyBVUkwgKG9yIGBbXWAg
aWYgdGhpcyBpcyB0aGUKLSAgICAgICAgZmlyc3QgaGFuZGxlZCB0cmFuc2l0aW9uKQotICAgICAg
QHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG5ld0hhbmRsZXJzIGEgbGlzdCBvZiB0aGUgaGFu
ZGxlcgotICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldyBVUkwKLQotICAgICAgQHJldHVy
biB7UGFydGl0aW9ufQotICAgICovCi0gICAgZnVuY3Rpb24gcGFydGl0aW9uSGFuZGxlcnMob2xk
SGFuZGxlcnMsIG5ld0hhbmRsZXJzKSB7Ci0gICAgICB2YXIgaGFuZGxlcnMgPSB7Ci0gICAgICAg
ICAgICB1cGRhdGVkQ29udGV4dDogW10sCi0gICAgICAgICAgICBleGl0ZWQ6IFtdLAotICAgICAg
ICAgICAgZW50ZXJlZDogW10sCi0gICAgICAgICAgICB1bmNoYW5nZWQ6IFtdCi0gICAgICAgICAg
fTsKLQotICAgICAgdmFyIGhhbmRsZXJDaGFuZ2VkLCBjb250ZXh0Q2hhbmdlZCwgcXVlcnlQYXJh
bXNDaGFuZ2VkLCBpLCBsOwotCi0gICAgICBmb3IgKGk9MCwgbD1uZXdIYW5kbGVycy5sZW5ndGg7
IGk8bDsgaSsrKSB7Ci0gICAgICAgIHZhciBvbGRIYW5kbGVyID0gb2xkSGFuZGxlcnNbaV0sIG5l
d0hhbmRsZXIgPSBuZXdIYW5kbGVyc1tpXTsKLQotICAgICAgICBpZiAoIW9sZEhhbmRsZXIgfHwg
b2xkSGFuZGxlci5oYW5kbGVyICE9PSBuZXdIYW5kbGVyLmhhbmRsZXIpIHsKLSAgICAgICAgICBo
YW5kbGVyQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXF1ZXJ5UGFyYW1zRXF1
YWwob2xkSGFuZGxlci5xdWVyeVBhcmFtcywgbmV3SGFuZGxlci5xdWVyeVBhcmFtcykpIHsKLSAg
ICAgICAgICBxdWVyeVBhcmFtc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKGhhbmRsZXJDaGFuZ2VkKSB7Ci0gICAgICAgICAgaGFuZGxlcnMuZW50ZXJlZC5wdXNoKG5l
d0hhbmRsZXIpOwotICAgICAgICAgIGlmIChvbGRIYW5kbGVyKSB7IGhhbmRsZXJzLmV4aXRlZC51
bnNoaWZ0KG9sZEhhbmRsZXIpOyB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dENoYW5nZWQg
fHwgb2xkSGFuZGxlci5jb250ZXh0ICE9PSBuZXdIYW5kbGVyLmNvbnRleHQgfHwgcXVlcnlQYXJh
bXNDaGFuZ2VkKSB7Ci0gICAgICAgICAgY29udGV4dENoYW5nZWQgPSB0cnVlOwotICAgICAgICAg
IGhhbmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1c2gobmV3SGFuZGxlcik7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgaGFuZGxlcnMudW5jaGFuZ2VkLnB1c2gob2xkSGFuZGxlcik7Ci0gICAg
ICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpPW5ld0hhbmRsZXJzLmxlbmd0aCwgbD1vbGRI
YW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGhhbmRsZXJzLmV4aXRlZC51bnNo
aWZ0KG9sZEhhbmRsZXJzW2ldKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGhhbmRsZXJzOwot
ICAgIH0KLQotICAgIGZ1bmN0aW9uIHRyaWdnZXIocm91dGVyLCBoYW5kbGVySW5mb3MsIGlnbm9y
ZUZhaWx1cmUsIGFyZ3MpIHsKLSAgICAgIGlmIChyb3V0ZXIudHJpZ2dlckV2ZW50KSB7Ci0gICAg
ICAgIHJvdXRlci50cmlnZ2VyRXZlbnQoaGFuZGxlckluZm9zLCBpZ25vcmVGYWlsdXJlLCBhcmdz
KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB2YXIgbmFtZSA9IGFyZ3Muc2hp
ZnQoKTsKLQotICAgICAgaWYgKCFoYW5kbGVySW5mb3MpIHsKLSAgICAgICAgaWYgKGlnbm9yZUZh
aWx1cmUpIHsgcmV0dXJuOyB9Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHRy
aWdnZXIgZXZlbnQgJyIgKyBuYW1lICsgIicuIFRoZXJlIGFyZSBubyBhY3RpdmUgaGFuZGxlcnMi
KTsKLSAgICAgIH0KLQotICAgICAgdmFyIGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0gICAg
ICBmb3IgKHZhciBpPWhhbmRsZXJJbmZvcy5sZW5ndGgtMTsgaT49MDsgaS0tKSB7Ci0gICAgICAg
IHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAgICAgIGhhbmRsZXIg
PSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAgICAgIGlmIChoYW5kbGVyLmV2ZW50cyAmJiBo
YW5kbGVyLmV2ZW50c1tuYW1lXSkgewotICAgICAgICAgIGlmIChoYW5kbGVyLmV2ZW50c1tuYW1l
XS5hcHBseShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1ZSkgewotICAgICAgICAgICAgZXZlbnRXYXNI
YW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIWV2ZW50V2FzSGFu
ZGxlZCAmJiAhaWdub3JlRmFpbHVyZSkgewotICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdGhp
bmcgaGFuZGxlZCB0aGUgZXZlbnQgJyIgKyBuYW1lICsgIicuIik7Ci0gICAgICB9Ci0gICAgfQot
Ci0gICAgZnVuY3Rpb24gc2V0Q29udGV4dChoYW5kbGVyLCBjb250ZXh0KSB7Ci0gICAgICBoYW5k
bGVyLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgaWYgKGhhbmRsZXIuY29udGV4dERpZENoYW5n
ZSkgeyBoYW5kbGVyLmNvbnRleHREaWRDaGFuZ2UoKTsgfQotICAgIH0KLQotICAgIGZ1bmN0aW9u
IHNldFF1ZXJ5UGFyYW1zKGhhbmRsZXIsIHF1ZXJ5UGFyYW1zKSB7Ci0gICAgICBoYW5kbGVyLnF1
ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Ci0gICAgICBpZiAoaGFuZGxlci5xdWVyeVBhcmFtc0Rp
ZENoYW5nZSkgeyBoYW5kbGVyLnF1ZXJ5UGFyYW1zRGlkQ2hhbmdlKCk7IH0KLSAgICB9Ci0KLQot
ICAgIC8qKgotICAgICAgQHByaXZhdGUKLQotICAgICAgRXh0cmFjdHMgcXVlcnkgcGFyYW1zIGZy
b20gdGhlIGVuZCBvZiBhbiBhcnJheQotICAgICoqLwotCi0gICAgZnVuY3Rpb24gZXh0cmFjdFF1
ZXJ5UGFyYW1zKGFycmF5KSB7Ci0gICAgICB2YXIgbGVuID0gKGFycmF5ICYmIGFycmF5Lmxlbmd0
aCksIGhlYWQsIHF1ZXJ5UGFyYW1zOwotCi0gICAgICBpZihsZW4gJiYgbGVuID4gMCAmJiBhcnJh
eVtsZW4gLSAxXSAmJiBhcnJheVtsZW4gLSAxXS5oYXNPd25Qcm9wZXJ0eSgncXVlcnlQYXJhbXMn
KSkgewotICAgICAgICBxdWVyeVBhcmFtcyA9IGFycmF5W2xlbiAtIDFdLnF1ZXJ5UGFyYW1zOwot
ICAgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJheSwgMCwgbGVuIC0gMSk7Ci0gICAgICAgIHJl
dHVybiBbaGVhZCwgcXVlcnlQYXJhbXNdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJu
IFthcnJheSwgbnVsbF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gcGVyZm9ybUlu
dGVybWVkaWF0ZVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBtYXRjaFBvaW50UmVz
dWx0cykgewotCi0gICAgICB2YXIgaGFuZGxlckluZm9zID0gZ2VuZXJhdGVIYW5kbGVySW5mb3Mo
cm91dGVyLCByZWNvZ0hhbmRsZXJzKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxl
ckluZm9zLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IGhhbmRsZXJJ
bmZvc1tpXTsKLSAgICAgICAgaGFuZGxlckluZm8uY29udGV4dCA9IG1hdGNoUG9pbnRSZXN1bHRz
LnByb3ZpZGVkTW9kZWxzW2hhbmRsZXJJbmZvLm5hbWVdOwotICAgICAgfQotCi0gICAgICB2YXIg
c3R1YmJlZFRyYW5zaXRpb24gPSB7Ci0gICAgICAgIHJvdXRlcjogcm91dGVyLAotICAgICAgICBp
c0Fib3J0ZWQ6IGZhbHNlCi0gICAgICB9OwotCi0gICAgICBzZXR1cENvbnRleHRzKHN0dWJiZWRU
cmFuc2l0aW9uLCBoYW5kbGVySW5mb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAgQHByaXZh
dGUKLQotICAgICAgQ3JlYXRlcywgYmVnaW5zLCBhbmQgcmV0dXJucyBhIFRyYW5zaXRpb24uCi0g
ICAgICovCi0gICAgZnVuY3Rpb24gcGVyZm9ybVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRs
ZXJzLCBwcm92aWRlZE1vZGVsc0FycmF5LCBwYXJhbXMsIHF1ZXJ5UGFyYW1zLCBkYXRhLCBpc0lu
dGVybWVkaWF0ZSkgewotCi0gICAgICB2YXIgbWF0Y2hQb2ludFJlc3VsdHMgPSBnZXRNYXRjaFBv
aW50KHJvdXRlciwgcmVjb2dIYW5kbGVycywgcHJvdmlkZWRNb2RlbHNBcnJheSwgcGFyYW1zLCBx
dWVyeVBhcmFtcyksCi0gICAgICAgICAgdGFyZ2V0TmFtZSA9IHJlY29nSGFuZGxlcnNbcmVjb2dI
YW5kbGVycy5sZW5ndGggLSAxXS5oYW5kbGVyLAotICAgICAgICAgIHdhc1RyYW5zaXRpb25pbmcg
PSBmYWxzZSwKLSAgICAgICAgICBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVyLmN1cnJlbnRI
YW5kbGVySW5mb3M7Ci0KLSAgICAgIGlmIChpc0ludGVybWVkaWF0ZSkgewotICAgICAgICByZXR1
cm4gcGVyZm9ybUludGVybWVkaWF0ZVRyYW5zaXRpb24ocm91dGVyLCByZWNvZ0hhbmRsZXJzLCBt
YXRjaFBvaW50UmVzdWx0cyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mg
YWxyZWFkeSBhIHRyYW5zaXRpb24gdW5kZXJ3YXkuCi0gICAgICBpZiAocm91dGVyLmFjdGl2ZVRy
YW5zaXRpb24pIHsKLSAgICAgICAgaWYgKHRyYW5zaXRpb25zSWRlbnRpY2FsKHJvdXRlci5hY3Rp
dmVUcmFuc2l0aW9uLCB0YXJnZXROYW1lLCBwcm92aWRlZE1vZGVsc0FycmF5LCBxdWVyeVBhcmFt
cykpIHsKLSAgICAgICAgICByZXR1cm4gcm91dGVyLmFjdGl2ZVRyYW5zaXRpb247Ci0gICAgICAg
IH0KLSAgICAgICAgcm91dGVyLmFjdGl2ZVRyYW5zaXRpb24uYWJvcnQoKTsKLSAgICAgICAgd2Fz
VHJhbnNpdGlvbmluZyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBkZWZlcnJlZCA9IFJT
VlAuZGVmZXIoKSwKLSAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb24ocm91dGVy
LCBkZWZlcnJlZC5wcm9taXNlKTsKLQotICAgICAgdHJhbnNpdGlvbi50YXJnZXROYW1lID0gdGFy
Z2V0TmFtZTsKLSAgICAgIHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHMgPSBtYXRjaFBvaW50UmVz
dWx0cy5wcm92aWRlZE1vZGVsczsKLSAgICAgIHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJh
eSA9IHByb3ZpZGVkTW9kZWxzQXJyYXk7Ci0gICAgICB0cmFuc2l0aW9uLnBhcmFtcyA9IG1hdGNo
UG9pbnRSZXN1bHRzLnBhcmFtczsKLSAgICAgIHRyYW5zaXRpb24uZGF0YSA9IGRhdGEgfHwge307
Ci0gICAgICB0cmFuc2l0aW9uLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Ci0gICAgICB0cmFu
c2l0aW9uLnBpdm90SGFuZGxlciA9IG1hdGNoUG9pbnRSZXN1bHRzLnBpdm90SGFuZGxlcjsKLSAg
ICAgIHJvdXRlci5hY3RpdmVUcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKLQotICAgICAgdmFyIGhh
bmRsZXJJbmZvcyA9IGdlbmVyYXRlSGFuZGxlckluZm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycyk7
Ci0gICAgICB0cmFuc2l0aW9uLmhhbmRsZXJJbmZvcyA9IGhhbmRsZXJJbmZvczsKLQotICAgICAg
Ly8gRmlyZSAnd2lsbFRyYW5zaXRpb24nIGV2ZW50IG9uIGN1cnJlbnQgaGFuZGxlcnMsIGJ1dCBk
b24ndCBmaXJlIGl0Ci0gICAgICAvLyBpZiBhIHRyYW5zaXRpb24gd2FzIGFscmVhZHkgdW5kZXJ3
YXkuCi0gICAgICBpZiAoIXdhc1RyYW5zaXRpb25pbmcpIHsKLSAgICAgICAgdHJpZ2dlcihyb3V0
ZXIsIGN1cnJlbnRIYW5kbGVySW5mb3MsIHRydWUsIFsnd2lsbFRyYW5zaXRpb24nLCB0cmFuc2l0
aW9uXSk7Ci0gICAgICB9Ci0KLSAgICAgIGxvZyhyb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2Us
ICJCZWdpbm5pbmcgdmFsaWRhdGlvbiBmb3IgdHJhbnNpdGlvbiB0byAiICsgdHJhbnNpdGlvbi50
YXJnZXROYW1lKTsKLSAgICAgIHZhbGlkYXRlRW50cnkodHJhbnNpdGlvbiwgbWF0Y2hQb2ludFJl
c3VsdHMubWF0Y2hQb2ludCwgbWF0Y2hQb2ludFJlc3VsdHMuaGFuZGxlclBhcmFtcykKLSAgICAg
ICAgICAgICAgICAgICAudGhlbih0cmFuc2l0aW9uU3VjY2VzcywgdHJhbnNpdGlvbkZhaWx1cmUp
OwotCi0gICAgICByZXR1cm4gdHJhbnNpdGlvbjsKLQotICAgICAgZnVuY3Rpb24gdHJhbnNpdGlv
blN1Y2Nlc3MoKSB7Ci0gICAgICAgIGNoZWNrQWJvcnQodHJhbnNpdGlvbik7Ci0KLSAgICAgICAg
dHJ5IHsKLSAgICAgICAgICBmaW5hbGl6ZVRyYW5zaXRpb24odHJhbnNpdGlvbiwgaGFuZGxlcklu
Zm9zKTsKLQotICAgICAgICAgIC8vIGN1cnJlbnRIYW5kbGVySW5mb3Mgd2FzIHVwZGF0ZWQgaW4g
ZmluYWxpemVUcmFuc2l0aW9uCi0gICAgICAgICAgdHJpZ2dlcihyb3V0ZXIsIHJvdXRlci5jdXJy
ZW50SGFuZGxlckluZm9zLCB0cnVlLCBbJ2RpZFRyYW5zaXRpb24nXSk7Ci0KLSAgICAgICAgICBp
ZiAocm91dGVyLmRpZFRyYW5zaXRpb24pIHsKLSAgICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0
aW9uKGhhbmRsZXJJbmZvcyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbG9nKHJvdXRlciwg
dHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlRSQU5TSVRJT04gQ09NUExFVEUuIik7Ci0KLSAgICAgICAg
ICAvLyBSZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhhbmRsZXIuCi0gICAgICAgICAgdHJhbnNpdGlv
bi5pc0FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaGFuZGxlcklu
Zm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5oYW5kbGVyKTsKLSAgICAgICAgfSBjYXRjaChl
KSB7Ci0gICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gRG9uJ3QgbnVsbGlmeSBpZiBhbm90aGVyIHRyYW5zaXRpb24gaXMgdW5kZXJ3YXkgKG1lYW5p
bmcKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgdHJhbnNpdGlvbiBpbml0aWF0ZWQgd2l0aCBlbnRl
ci9zZXR1cCkuCi0gICAgICAgIGlmICghdHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKLSAgICAgICAg
ICByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQot
ICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvbkZhaWx1cmUocmVhc29uKSB7Ci0gICAgICAgIGRlZmVy
cmVkLnJlamVjdChyZWFzb24pOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgQHBy
aXZhdGUKLQotICAgICAgQWNjZXB0cyBoYW5kbGVycyBpbiBSZWNvZ25pemVyIGZvcm1hdCwgZWl0
aGVyIHJldHVybmVkIGZyb20KLSAgICAgIHJlY29nbml6ZSgpIG9yIGhhbmRsZXJzRm9yKCksIGFu
ZCByZXR1cm5zIHVuaWZpZWQKLSAgICAgIGBIYW5kbGVySW5mb2BzLgotICAgICAqLwotICAgIGZ1
bmN0aW9uIGdlbmVyYXRlSGFuZGxlckluZm9zKHJvdXRlciwgcmVjb2dIYW5kbGVycykgewotICAg
ICAgdmFyIGhhbmRsZXJJbmZvcyA9IFtdOwotICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJl
Y29nSGFuZGxlcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgdmFyIGhhbmRsZXJP
YmogPSByZWNvZ0hhbmRsZXJzW2ldLAotICAgICAgICAgICAgaXNEeW5hbWljID0gaGFuZGxlck9i
ai5pc0R5bmFtaWMgfHwgKGhhbmRsZXJPYmoubmFtZXMgJiYgaGFuZGxlck9iai5uYW1lcy5sZW5n
dGgpOwotCi0gICAgICAgIHZhciBoYW5kbGVySW5mbyA9IHsKLSAgICAgICAgICBpc0R5bmFtaWM6
ICEhaXNEeW5hbWljLAotICAgICAgICAgIG5hbWU6IGhhbmRsZXJPYmouaGFuZGxlciwKLSAgICAg
ICAgICBoYW5kbGVyOiByb3V0ZXIuZ2V0SGFuZGxlcihoYW5kbGVyT2JqLmhhbmRsZXIpCi0gICAg
ICAgIH07Ci0gICAgICAgIGlmKGhhbmRsZXJPYmoucXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICBo
YW5kbGVySW5mby5xdWVyeVBhcmFtcyA9IGhhbmRsZXJPYmoucXVlcnlQYXJhbXM7Ci0gICAgICAg
IH0KLSAgICAgICAgaGFuZGxlckluZm9zLnB1c2goaGFuZGxlckluZm8pOwotICAgICAgfQotICAg
ICAgcmV0dXJuIGhhbmRsZXJJbmZvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRl
Ci0gICAgICovCi0gICAgZnVuY3Rpb24gdHJhbnNpdGlvbnNJZGVudGljYWwob2xkVHJhbnNpdGlv
biwgdGFyZ2V0TmFtZSwgcHJvdmlkZWRNb2RlbHNBcnJheSwgcXVlcnlQYXJhbXMpIHsKLQotICAg
ICAgaWYgKG9sZFRyYW5zaXRpb24udGFyZ2V0TmFtZSAhPT0gdGFyZ2V0TmFtZSkgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgICAgdmFyIG9sZE1vZGVscyA9IG9sZFRyYW5zaXRpb24ucHJvdmlkZWRN
b2RlbHNBcnJheTsKLSAgICAgIGlmIChvbGRNb2RlbHMubGVuZ3RoICE9PSBwcm92aWRlZE1vZGVs
c0FycmF5Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgZm9yICh2YXIgaSA9IDAs
IGxlbiA9IG9sZE1vZGVscy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewotICAgICAgICBpZiAob2xk
TW9kZWxzW2ldICE9PSBwcm92aWRlZE1vZGVsc0FycmF5W2ldKSB7IHJldHVybiBmYWxzZTsgfQot
ICAgICAgfQotCi0gICAgICBpZighcXVlcnlQYXJhbXNFcXVhbChvbGRUcmFuc2l0aW9uLnF1ZXJ5
UGFyYW1zLCBxdWVyeVBhcmFtcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0K
LSAgICAgIFVwZGF0ZXMgdGhlIFVSTCAoaWYgbmVjZXNzYXJ5KSBhbmQgY2FsbHMgYHNldHVwQ29u
dGV4dHNgCi0gICAgICB0byB1cGRhdGUgdGhlIHJvdXRlcidzIGFycmF5IG9mIGBjdXJyZW50SGFu
ZGxlckluZm9zYC4KLSAgICAgKi8KLSAgICBmdW5jdGlvbiBmaW5hbGl6ZVRyYW5zaXRpb24odHJh
bnNpdGlvbiwgaGFuZGxlckluZm9zKSB7Ci0KLSAgICAgIGxvZyh0cmFuc2l0aW9uLnJvdXRlciwg
dHJhbnNpdGlvbi5zZXF1ZW5jZSwgIlZhbGlkYXRpb24gc3VjY2VlZGVkLCBmaW5hbGl6aW5nIHRy
YW5zaXRpb247Iik7Ci0KLSAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9uLnJvdXRlciwKLSAg
ICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNlLAotICAgICAgICAgIGhhbmRsZXJOYW1l
ID0gaGFuZGxlckluZm9zW2hhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lLAotICAgICAgICAg
IHVybE1ldGhvZCA9IHRyYW5zaXRpb24udXJsTWV0aG9kLAotICAgICAgICAgIGk7Ci0KLSAgICAg
IC8vIENvbGxlY3QgcGFyYW1zIGZvciBVUkwuCi0gICAgICB2YXIgb2JqZWN0cyA9IFtdLCBwcm92
aWRlZE1vZGVscyA9IHRyYW5zaXRpb24ucHJvdmlkZWRNb2RlbHNBcnJheS5zbGljZSgpOwotICAg
ICAgZm9yIChpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGk+PTA7IC0taSkgewotICAgICAg
ICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV07Ci0gICAgICAgIGlmIChoYW5kbGVy
SW5mby5pc0R5bmFtaWMpIHsKLSAgICAgICAgICB2YXIgcHJvdmlkZWRNb2RlbCA9IHByb3ZpZGVk
TW9kZWxzLnBvcCgpOwotICAgICAgICAgIG9iamVjdHMudW5zaGlmdChpc1BhcmFtKHByb3ZpZGVk
TW9kZWwpID8gcHJvdmlkZWRNb2RlbC50b1N0cmluZygpIDogaGFuZGxlckluZm8uY29udGV4dCk7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlckluZm8uaGFuZGxlci5pbmFjY2Vzc2li
bGVCeVVSTCkgewotICAgICAgICAgIHVybE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAg
IH0KLQotICAgICAgdmFyIG5ld1F1ZXJ5UGFyYW1zID0ge307Ci0gICAgICBmb3IgKGkgPSBoYW5k
bGVySW5mb3MubGVuZ3RoIC0gMTsgaT49MDsgLS1pKSB7Ci0gICAgICAgIG1lcmdlKG5ld1F1ZXJ5
UGFyYW1zLCBoYW5kbGVySW5mb3NbaV0ucXVlcnlQYXJhbXMpOwotICAgICAgfQotICAgICAgcm91
dGVyLmN1cnJlbnRRdWVyeVBhcmFtcyA9IG5ld1F1ZXJ5UGFyYW1zOwotCi0KLSAgICAgIHZhciBw
YXJhbXMgPSBwYXJhbXNGb3JIYW5kbGVyKHJvdXRlciwgaGFuZGxlck5hbWUsIG9iamVjdHMsIHRy
YW5zaXRpb24ucXVlcnlQYXJhbXMpOwotCi0gICAgICByb3V0ZXIuY3VycmVudFBhcmFtcyA9IHBh
cmFtczsKLQotICAgICAgaWYgKHVybE1ldGhvZCkgewotICAgICAgICB2YXIgdXJsID0gcm91dGVy
LnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxlck5hbWUsIHBhcmFtcyk7Ci0KLSAgICAgICAgaWYg
KHVybE1ldGhvZCA9PT0gJ3JlcGxhY2UnKSB7Ci0gICAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwo
dXJsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBBc3N1bWUgZXZlcnl0aGluZyBl
bHNlIGlzIGp1c3QgYSBVUkwgdXBkYXRlIGZvciBub3cuCi0gICAgICAgICAgcm91dGVyLnVwZGF0
ZVVSTCh1cmwpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHNldHVwQ29udGV4dHModHJh
bnNpdGlvbiwgaGFuZGxlckluZm9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRl
Ci0KLSAgICAgIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gY29uc3RydWN0IHRoZSBjaGFpbiBv
ZiBwcm9taXNlcyB1c2VkCi0gICAgICB0byB2YWxpZGF0ZSBhIHRyYW5zaXRpb24uIFdyYXBzIGNh
bGxzIHRvIGBiZWZvcmVNb2RlbGAsIGBtb2RlbGAsCi0gICAgICBhbmQgYGFmdGVyTW9kZWxgIGlu
IHByb21pc2VzLCBhbmQgY2hlY2tzIGZvciByZWRpcmVjdHMvYWJvcnRzCi0gICAgICBiZXR3ZWVu
IGVhY2guCi0gICAgICovCi0gICAgZnVuY3Rpb24gdmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9uLCBt
YXRjaFBvaW50LCBoYW5kbGVyUGFyYW1zKSB7Ci0KLSAgICAgIHZhciBoYW5kbGVySW5mb3MgPSB0
cmFuc2l0aW9uLmhhbmRsZXJJbmZvcywKLSAgICAgICAgICBpbmRleCA9IHRyYW5zaXRpb24ucmVz
b2x2ZUluZGV4OwotCi0gICAgICBpZiAoaW5kZXggPT09IGhhbmRsZXJJbmZvcy5sZW5ndGgpIHsK
LSAgICAgICAgLy8gTm8gbW9yZSBjb250ZXh0cyB0byByZXNvbHZlLgotICAgICAgICByZXR1cm4g
UlNWUC5yZXNvbHZlKHRyYW5zaXRpb24ucmVzb2x2ZWRNb2RlbHMpOwotICAgICAgfQotCi0gICAg
ICB2YXIgcm91dGVyID0gdHJhbnNpdGlvbi5yb3V0ZXIsCi0gICAgICAgICAgaGFuZGxlckluZm8g
PSBoYW5kbGVySW5mb3NbaW5kZXhdLAotICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5o
YW5kbGVyLAotICAgICAgICAgIGhhbmRsZXJOYW1lID0gaGFuZGxlckluZm8ubmFtZSwKLSAgICAg
ICAgICBzZXEgPSB0cmFuc2l0aW9uLnNlcXVlbmNlOwotCi0gICAgICBpZiAoaW5kZXggPCBtYXRj
aFBvaW50KSB7Ci0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiB1c2lu
ZyBjb250ZXh0IGZyb20gYWxyZWFkeS1hY3RpdmUgaGFuZGxlciIpOwotCi0gICAgICAgIC8vIFdl
J3JlIGJlZm9yZSB0aGUgbWF0Y2ggcG9pbnQsIHNvIGRvbid0IHJ1biBhbnkgaG9va3MsCi0gICAg
ICAgIC8vIGp1c3QgdXNlIHRoZSBhbHJlYWR5IHJlc29sdmVkIGNvbnRleHQgZnJvbSB0aGUgaGFu
ZGxlci4KLSAgICAgICAgdHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVsc1toYW5kbGVySW5mby5uYW1l
XSA9Ci0gICAgICAgICAgdHJhbnNpdGlvbi5wcm92aWRlZE1vZGVsc1toYW5kbGVySW5mby5uYW1l
XSB8fAotICAgICAgICAgIGhhbmRsZXJJbmZvLmhhbmRsZXIuY29udGV4dDsKLSAgICAgICAgcmV0
dXJuIHByb2NlZWQoKTsKLSAgICAgIH0KLQotICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUs
ICd3aWxsUmVzb2x2ZU1vZGVsJywgdHJhbnNpdGlvbiwgaGFuZGxlcik7Ci0KLSAgICAgIHJldHVy
biBSU1ZQLnJlc29sdmUoKS50aGVuKGhhbmRsZUFib3J0KQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLnRoZW4oYmVmb3JlTW9kZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGhl
bihoYW5kbGVBYm9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1vZGVsKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAudGhlbihhZnRlck1vZGVsKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLnRoZW4oaGFuZGxlQWJvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGhl
bihudWxsLCBoYW5kbGVFcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHBy
b2NlZWQpOwotCi0gICAgICBmdW5jdGlvbiBoYW5kbGVBYm9ydChyZXN1bHQpIHsKLSAgICAgICAg
aWYgKHRyYW5zaXRpb24uaXNBYm9ydGVkKSB7Ci0gICAgICAgICAgbG9nKHRyYW5zaXRpb24ucm91
dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7Ci0gICAgICAgICAg
cmV0dXJuIFJTVlAucmVqZWN0KG5ldyBSb3V0ZXIuVHJhbnNpdGlvbkFib3J0ZWQoKSk7Ci0gICAg
ICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBmdW5jdGlv
biBoYW5kbGVFcnJvcihyZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFJv
dXRlci5UcmFuc2l0aW9uQWJvcnRlZCB8fCB0cmFuc2l0aW9uLmlzQWJvcnRlZCkgewotICAgICAg
ICAgIC8vIGlmIHRoZSB0cmFuc2l0aW9uIHdhcyBhYm9ydGVkIGFuZCAqbm8gYWRkaXRpb25hbCog
ZXJyb3Igd2FzIHRocm93biwKLSAgICAgICAgICAvLyByZWplY3Qgd2l0aCB0aGUgUm91dGVyLlRy
YW5zaXRpb25BYm9ydGVkIGluc3RhbmNlCi0gICAgICAgICAgcmV0dXJuIFJTVlAucmVqZWN0KHJl
YXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvdGhlcndpc2UsIHdlJ3JlIGhlcmUgYmVj
YXVzZSBvZiBhIGRpZmZlcmVudCBlcnJvcgotICAgICAgICB0cmFuc2l0aW9uLmFib3J0KCk7Ci0K
LSAgICAgICAgbG9nKHJvdXRlciwgc2VxLCBoYW5kbGVyTmFtZSArICI6IGhhbmRsaW5nIGVycm9y
OiAiICsgcmVhc29uKTsKLQotICAgICAgICAvLyBBbiBlcnJvciB3YXMgdGhyb3duIC8gcHJvbWlz
ZSByZWplY3RlZCwgc28gZmlyZSBhbgotICAgICAgICAvLyBgZXJyb3JgIGV2ZW50IGZyb20gdGhp
cyBoYW5kbGVyIGluZm8gdXAgdG8gcm9vdC4KLSAgICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRy
dWUsICdlcnJvcicsIHJlYXNvbiwgdHJhbnNpdGlvbiwgaGFuZGxlckluZm8uaGFuZGxlcik7Ci0K
LSAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBvcmlnaW5hbCBlcnJvci4KLSAgICAgICAgcmV0dXJu
IFJTVlAucmVqZWN0KHJlYXNvbik7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIGJlZm9yZU1v
ZGVsKCkgewotCi0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxlck5hbWUgKyAiOiBjYWxs
aW5nIGJlZm9yZU1vZGVsIGhvb2siKTsKLQotICAgICAgICB2YXIgYXJnczsKLQotICAgICAgICBp
ZiAoaGFuZGxlckluZm8ucXVlcnlQYXJhbXMpIHsKLSAgICAgICAgICBhcmdzID0gW2hhbmRsZXJJ
bmZvLnF1ZXJ5UGFyYW1zLCB0cmFuc2l0aW9uXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICBhcmdzID0gW3RyYW5zaXRpb25dOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHAgPSBoYW5k
bGVyLmJlZm9yZU1vZGVsICYmIGhhbmRsZXIuYmVmb3JlTW9kZWwuYXBwbHkoaGFuZGxlciwgYXJn
cyk7Ci0gICAgICAgIHJldHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRpb24pID8gbnVsbCA6IHA7
Ci0gICAgICB9Ci0KLSAgICAgIGZ1bmN0aW9uIG1vZGVsKCkgewotICAgICAgICBsb2cocm91dGVy
LCBzZXEsIGhhbmRsZXJOYW1lICsgIjogcmVzb2x2aW5nIG1vZGVsIik7Ci0gICAgICAgIHZhciBw
ID0gZ2V0TW9kZWwoaGFuZGxlckluZm8sIHRyYW5zaXRpb24sIGhhbmRsZXJQYXJhbXNbaGFuZGxl
ck5hbWVdLCBpbmRleCA+PSBtYXRjaFBvaW50KTsKLSAgICAgICAgcmV0dXJuIChwIGluc3RhbmNl
b2YgVHJhbnNpdGlvbikgPyBudWxsIDogcDsKLSAgICAgIH0KLQotICAgICAgZnVuY3Rpb24gYWZ0
ZXJNb2RlbChjb250ZXh0KSB7Ci0KLSAgICAgICAgbG9nKHJvdXRlciwgc2VxLCBoYW5kbGVyTmFt
ZSArICI6IGNhbGxpbmcgYWZ0ZXJNb2RlbCBob29rIik7Ci0KLSAgICAgICAgLy8gUGFzcyB0aGUg
Y29udGV4dCBhbmQgcmVzb2x2ZWQgcGFyZW50IGNvbnRleHRzIHRvIGFmdGVyTW9kZWwsIGJ1dCB3
ZSBkb24ndAotICAgICAgICAvLyB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBg
YWZ0ZXJNb2RlbGAgaW4gYW55IHdheSwgYnV0IHJhdGhlcgotICAgICAgICAvLyBhbHdheXMgcmVz
b2x2ZSB3aXRoIHRoZSBvcmlnaW5hbCBgY29udGV4dGAgb2JqZWN0LgotCi0gICAgICAgIHRyYW5z
aXRpb24ucmVzb2x2ZWRNb2RlbHNbaGFuZGxlckluZm8ubmFtZV0gPSBjb250ZXh0OwotCi0gICAg
ICAgIHZhciBhcmdzOwotCi0gICAgICAgIGlmIChoYW5kbGVySW5mby5xdWVyeVBhcmFtcykgewot
ICAgICAgICAgIGFyZ3MgPSBbY29udGV4dCwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMsIHRyYW5z
aXRpb25dOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFyZ3MgPSBbY29udGV4dCwgdHJh
bnNpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgcCA9IGhhbmRsZXIuYWZ0ZXJNb2Rl
bCAmJiBoYW5kbGVyLmFmdGVyTW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7Ci0gICAgICAgIHJl
dHVybiAocCBpbnN0YW5jZW9mIFRyYW5zaXRpb24pID8gbnVsbCA6IHA7Ci0gICAgICB9Ci0KLSAg
ICAgIGZ1bmN0aW9uIHByb2NlZWQoKSB7Ci0gICAgICAgIGxvZyhyb3V0ZXIsIHNlcSwgaGFuZGxl
ck5hbWUgKyAiOiB2YWxpZGF0aW9uIHN1Y2NlZWRlZCwgcHJvY2VlZGluZyIpOwotCi0gICAgICAg
IGhhbmRsZXJJbmZvLmNvbnRleHQgPSB0cmFuc2l0aW9uLnJlc29sdmVkTW9kZWxzW2hhbmRsZXJJ
bmZvLm5hbWVdOwotICAgICAgICB0cmFuc2l0aW9uLnJlc29sdmVJbmRleCsrOwotICAgICAgICBy
ZXR1cm4gdmFsaWRhdGVFbnRyeSh0cmFuc2l0aW9uLCBtYXRjaFBvaW50LCBoYW5kbGVyUGFyYW1z
KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIFRo
cm93cyBhIFRyYW5zaXRpb25BYm9ydGVkIGlmIHRoZSBwcm92aWRlZCB0cmFuc2l0aW9uIGhhcyBi
ZWVuIGFib3J0ZWQuCi0gICAgICovCi0gICAgZnVuY3Rpb24gY2hlY2tBYm9ydCh0cmFuc2l0aW9u
KSB7Ci0gICAgICBpZiAodHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKLSAgICAgICAgbG9nKHRyYW5z
aXRpb24ucm91dGVyLCB0cmFuc2l0aW9uLnNlcXVlbmNlLCAiZGV0ZWN0ZWQgYWJvcnQuIik7Ci0g
ICAgICAgIHRocm93IG5ldyBSb3V0ZXIuVHJhbnNpdGlvbkFib3J0ZWQoKTsKLSAgICAgIH0KLSAg
ICB9Ci0KLSAgICAvKioKLSAgICAgIEBwcml2YXRlCi0KLSAgICAgIEVuY2Fwc3VsYXRlcyB0aGUg
bG9naWMgZm9yIHdoZXRoZXIgdG8gY2FsbCBgbW9kZWxgIG9uIGEgcm91dGUsCi0gICAgICBvciB1
c2Ugb25lIG9mIHRoZSBtb2RlbHMgcHJvdmlkZWQgdG8gYHRyYW5zaXRpb25Ub2AuCi0gICAgICov
Ci0gICAgZnVuY3Rpb24gZ2V0TW9kZWwoaGFuZGxlckluZm8sIHRyYW5zaXRpb24sIGhhbmRsZXJQ
YXJhbXMsIG5lZWRzVXBkYXRlKSB7Ci0gICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhh
bmRsZXIsCi0gICAgICAgICAgaGFuZGxlck5hbWUgPSBoYW5kbGVySW5mby5uYW1lLCBhcmdzOwot
Ci0gICAgICBpZiAoIW5lZWRzVXBkYXRlICYmIGhhbmRsZXIuaGFzT3duUHJvcGVydHkoJ2NvbnRl
eHQnKSkgewotICAgICAgICByZXR1cm4gaGFuZGxlci5jb250ZXh0OwotICAgICAgfQotCi0gICAg
ICBpZiAodHJhbnNpdGlvbi5wcm92aWRlZE1vZGVscy5oYXNPd25Qcm9wZXJ0eShoYW5kbGVyTmFt
ZSkpIHsKLSAgICAgICAgdmFyIHByb3ZpZGVkTW9kZWwgPSB0cmFuc2l0aW9uLnByb3ZpZGVkTW9k
ZWxzW2hhbmRsZXJOYW1lXTsKLSAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm92aWRlZE1vZGVsID09
PSAnZnVuY3Rpb24nID8gcHJvdmlkZWRNb2RlbCgpIDogcHJvdmlkZWRNb2RlbDsKLSAgICAgIH0K
LQotICAgICAgaWYgKGhhbmRsZXJJbmZvLnF1ZXJ5UGFyYW1zKSB7Ci0gICAgICAgIGFyZ3MgPSBb
aGFuZGxlclBhcmFtcyB8fCB7fSwgaGFuZGxlckluZm8ucXVlcnlQYXJhbXMsIHRyYW5zaXRpb25d
OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJncyA9IFtoYW5kbGVyUGFyYW1zIHx8IHt9LCB0
cmFuc2l0aW9uLCBoYW5kbGVySW5mby5xdWVyeVBhcmFtc107Ci0gICAgICB9Ci0KLSAgICAgIHJl
dHVybiBoYW5kbGVyLm1vZGVsICYmIGhhbmRsZXIubW9kZWwuYXBwbHkoaGFuZGxlciwgYXJncyk7
Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotICAgICAqLwotICAgIGZ1bmN0aW9u
IGxvZyhyb3V0ZXIsIHNlcXVlbmNlLCBtc2cpIHsKLQotICAgICAgaWYgKCFyb3V0ZXIubG9nKSB7
IHJldHVybjsgfQotCi0gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgewotICAgICAg
ICByb3V0ZXIubG9nKCJUcmFuc2l0aW9uICMiICsgc2VxdWVuY2UgKyAiOiAiICsgbXNnKTsKLSAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZyA9IHNlcXVlbmNlOwotICAgICAgICByb3V0ZXIubG9n
KG1zZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJpdmF0ZQotCi0gICAg
ICBCZWdpbnMgYW5kIHJldHVybnMgYSBUcmFuc2l0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZAot
ICAgICAgYXJndW1lbnRzLiBBY2NlcHRzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSBvZiBib3RoIFVS
TAotICAgICAgdHJhbnNpdGlvbnMgYW5kIG5hbWVkIHRyYW5zaXRpb25zLgotCi0gICAgICBAcGFy
YW0ge1JvdXRlcn0gcm91dGVyCi0gICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19IGFyZ3MgYXJn
dW1lbnRzIHBhc3NlZCB0byB0cmFuc2l0aW9uVG8sCi0gICAgICAgIHJlcGxhY2VXaXRoLCBvciBo
YW5kbGVVUkwKLSAgICAqLwotICAgIGZ1bmN0aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3Ms
IGlzSW50ZXJtZWRpYXRlKSB7Ci0gICAgICAvLyBOb3JtYWxpemUgYmxhbmsgdHJhbnNpdGlvbnMg
dG8gcm9vdCBVUkwgdHJhbnNpdGlvbnMuCi0gICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0gfHwgJy8n
OwotCi0gICAgICBpZihhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLmhhc093blByb3BlcnR5
KCdxdWVyeVBhcmFtcycpKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVRdWVyeVBhcmFtVHJhbnNp
dGlvbihyb3V0ZXIsIGFyZ3NbMF0sIGlzSW50ZXJtZWRpYXRlKTsKLSAgICAgIH0gZWxzZSBpZiAo
bmFtZS5jaGFyQXQoMCkgPT09ICcvJykgewotICAgICAgICByZXR1cm4gY3JlYXRlVVJMVHJhbnNp
dGlvbihyb3V0ZXIsIG5hbWUsIGlzSW50ZXJtZWRpYXRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHJldHVybiBjcmVhdGVOYW1lZFRyYW5zaXRpb24ocm91dGVyLCBzbGljZS5jYWxsKGFyZ3Mp
LCBpc0ludGVybWVkaWF0ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICBAcHJp
dmF0ZQotCi0gICAgICBTZXJpYWxpemVzIGEgaGFuZGxlciB1c2luZyBpdHMgY3VzdG9tIGBzZXJp
YWxpemVgIG1ldGhvZCBvcgotICAgICAgYnkgYSBkZWZhdWx0IHRoYXQgbG9va3MgdXAgdGhlIGV4
cGVjdGVkIHByb3BlcnR5IG5hbWUgZnJvbQotICAgICAgdGhlIGR5bmFtaWMgc2VnbWVudC4KLQot
ICAgICAgQHBhcmFtIHtPYmplY3R9IGhhbmRsZXIgYSByb3V0ZXIgaGFuZGxlcgotICAgICAgQHBh
cmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCB0byBiZSBzZXJpYWxpemVkIGZvciB0aGlzIGhh
bmRsZXIKLSAgICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gbmFtZXMgdGhlIG5hbWVzIGFycmF5
IGF0dGFjaGVkIHRvIGFuCi0gICAgICAgIGhhbmRsZXIgb2JqZWN0IHJldHVybmVkIGZyb20gcm91
dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IoKQotICAgICovCi0gICAgZnVuY3Rpb24gc2VyaWFs
aXplKGhhbmRsZXIsIG1vZGVsLCBuYW1lcykgewotCi0gICAgICB2YXIgb2JqZWN0ID0ge307Ci0g
ICAgICBpZiAoaXNQYXJhbShtb2RlbCkpIHsKLSAgICAgICAgb2JqZWN0W25hbWVzWzBdXSA9IG1v
ZGVsOwotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgfQotCi0gICAgICAvLyBVc2UgY3Vz
dG9tIHNlcmlhbGl6ZSBpZiBpdCBleGlzdHMuCi0gICAgICBpZiAoaGFuZGxlci5zZXJpYWxpemUp
IHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKG1vZGVsLCBuYW1lcyk7Ci0gICAg
ICB9Ci0KLSAgICAgIGlmIChuYW1lcy5sZW5ndGggIT09IDEpIHsgcmV0dXJuOyB9Ci0KLSAgICAg
IHZhciBuYW1lID0gbmFtZXNbMF07Ci0KLSAgICAgIGlmICgvX2lkJC8udGVzdChuYW1lKSkgewot
ICAgICAgICBvYmplY3RbbmFtZV0gPSBtb2RlbC5pZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAg
IG9iamVjdFtuYW1lXSA9IG1vZGVsOwotICAgICAgfQotICAgICAgcmV0dXJuIG9iamVjdDsKLSAg
ICB9Ci0gIH0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVt
YmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLWZ1bmN0aW9uIERTTChuYW1lKSB7
Ci0gIHRoaXMucGFyZW50ID0gbmFtZTsKLSAgdGhpcy5tYXRjaGVzID0gW107Ci19Ci0KLURTTC5w
cm90b3R5cGUgPSB7Ci0gIHJlc291cmNlOiBmdW5jdGlvbihuYW1lLCBvcHRpb25zLCBjYWxsYmFj
aykgewotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBvcHRpb25zID09
PSAnZnVuY3Rpb24nKSB7Ci0gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7Ci0gICAgICBvcHRpb25z
ID0ge307Ci0gICAgfQotCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAg
IG9wdGlvbnMgPSB7fTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZW9mIG9wdGlvbnMucGF0aCAhPT0g
J3N0cmluZycpIHsKLSAgICAgIG9wdGlvbnMucGF0aCA9ICIvIiArIG5hbWU7Ci0gICAgfQotCi0g
ICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICB2YXIgZHNsID0gbmV3IERTTChuYW1lKTsKLSAgICAg
IHJvdXRlKGRzbCwgJ2xvYWRpbmcnKTsKLSAgICAgIHJvdXRlKGRzbCwgJ2Vycm9yJywgeyBwYXRo
OiAiL191bnVzZWRfZHVtbXlfZXJyb3JfcGF0aF9yb3V0ZV8iICsgbmFtZSArICIvOmVycm9yIiB9
KTsKLSAgICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsKLSAgICAgIHRoaXMucHVzaChvcHRpb25zLnBh
dGgsIG5hbWUsIGRzbC5nZW5lcmF0ZSgpLCBvcHRpb25zLnF1ZXJ5UGFyYW1zKTsKLSAgICB9IGVs
c2UgewotICAgICAgdGhpcy5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9ucy5x
dWVyeVBhcmFtcyk7Ci0gICAgfQotCi0KLSAgICAgIH0sCi0KLSAgcHVzaDogZnVuY3Rpb24odXJs
LCBuYW1lLCBjYWxsYmFjaywgcXVlcnlQYXJhbXMpIHsKLSAgICB2YXIgcGFydHMgPSBuYW1lLnNw
bGl0KCcuJyk7Ci0gICAgaWYgKHVybCA9PT0gIiIgfHwgdXJsID09PSAiLyIgfHwgcGFydHNbcGFy
dHMubGVuZ3RoLTFdID09PSAiaW5kZXgiKSB7IHRoaXMuZXhwbGljaXRJbmRleCA9IHRydWU7IH0K
LQotICAgIHRoaXMubWF0Y2hlcy5wdXNoKFt1cmwsIG5hbWUsIGNhbGxiYWNrLCBxdWVyeVBhcmFt
c10pOwotICB9LAotCi0gIHJvdXRlOiBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7Ci0gICAgcm91
dGUodGhpcywgbmFtZSwgb3B0aW9ucyk7Ci0gICAgICB9LAotCi0gIGdlbmVyYXRlOiBmdW5jdGlv
bigpIHsKLSAgICB2YXIgZHNsTWF0Y2hlcyA9IHRoaXMubWF0Y2hlczsKLQotICAgIGlmICghdGhp
cy5leHBsaWNpdEluZGV4KSB7Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIsIHsgcGF0aDogIi8i
IH0pOwotICAgIH0KLQotICAgIHJldHVybiBmdW5jdGlvbihtYXRjaCkgewotICAgICAgZm9yICh2
YXIgaT0wLCBsPWRzbE1hdGNoZXMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgZHNs
TWF0Y2ggPSBkc2xNYXRjaGVzW2ldOwotICAgICAgICB2YXIgbWF0Y2hPYmogPSBtYXRjaChkc2xN
YXRjaFswXSkudG8oZHNsTWF0Y2hbMV0sIGRzbE1hdGNoWzJdKTsKLSAgICAgICAgICAgICAgfQot
ICAgIH07Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIHJvdXRlKGRzbCwgbmFtZSwgb3B0aW9ucykgewot
ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBgdGhpcy5yZXNvdXJjZWAgdG8gbmVzdCIsIHR5
cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nKTsKLQotICBvcHRpb25zID0gb3B0aW9ucyB8fCB7
fTsKLQotICBpZiAodHlwZW9mIG9wdGlvbnMucGF0aCAhPT0gJ3N0cmluZycpIHsKLSAgICBvcHRp
b25zLnBhdGggPSAiLyIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKGRzbC5wYXJlbnQgJiYgZHNsLnBh
cmVudCAhPT0gJ2FwcGxpY2F0aW9uJykgewotICAgIG5hbWUgPSBkc2wucGFyZW50ICsgIi4iICsg
bmFtZTsKLSAgfQotCi0gIGRzbC5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgbnVsbCwgb3B0aW9u
cy5xdWVyeVBhcmFtcyk7Ci19Ci0KLURTTC5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICB2
YXIgZHNsID0gbmV3IERTTCgpOwotICBjYWxsYmFjay5jYWxsKGRzbCk7Ci0gIHJldHVybiBkc2w7
Ci19OwotCi1FbWJlci5Sb3V0ZXJEU0wgPSBEU0w7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24o
KSB7Ci12YXIgZ2V0ID0gRW1iZXIuZ2V0OwotCi0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1
bGUgZW1iZXItcm91dGluZwotKi8KLQotLyoqCi0KLSAgRmluZHMgYSBjb250cm9sbGVyIGluc3Rh
bmNlLgotCi0gIEBmb3IgRW1iZXIKLSAgQG1ldGhvZCBjb250cm9sbGVyRm9yCi0gIEBwcml2YXRl
Ci0qLwotRW1iZXIuY29udHJvbGxlckZvciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxl
ck5hbWUsIGxvb2t1cE9wdGlvbnMpIHsKLSAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRy
b2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lLCBsb29rdXBPcHRpb25zKTsKLX07Ci0KLS8qKgotICBH
ZW5lcmF0ZXMgYSBjb250cm9sbGVyIGZhY3RvcnkKLQotICBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJh
dGVkIGNvbnRyb2xsZXIgZmFjdG9yeSBpcyBkZXJpdmVkCi0gIGZyb20gdGhlIGNvbnRleHQuIElm
IHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IGFuIGFycmF5IGNvbnRyb2xsZXIKLSAgaXMgZ2VuZXJh
dGVkLCBpZiBhbiBvYmplY3QsIGFuIG9iamVjdCBjb250cm9sbGVyIG90aGVyd2lzZSwgYSBiYXNp
YwotICBjb250cm9sbGVyIGlzIGdlbmVyYXRlZC4KLQotICBZb3UgY2FuIGN1c3RvbWl6ZSB5b3Vy
IGdlbmVyYXRlZCBjb250cm9sbGVycyBieSBkZWZpbmluZwotICBgQXBwLk9iamVjdENvbnRyb2xs
ZXJgIG9yIGBBcHAuQXJyYXlDb250cm9sbGVyYC4KLQotICBAZm9yIEVtYmVyCi0gIEBtZXRob2Qg
Z2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeQotICBAcHJpdmF0ZQotKi8KLUVtYmVyLmdlbmVyYXRl
Q29udHJvbGxlckZhY3RvcnkgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBj
b250ZXh0KSB7Ci0gIHZhciBGYWN0b3J5LCBmdWxsTmFtZSwgaW5zdGFuY2UsIG5hbWUsIGZhY3Rv
cnlOYW1lLCBjb250cm9sbGVyVHlwZTsKLQotICBpZiAoY29udGV4dCAmJiBFbWJlci5pc0FycmF5
KGNvbnRleHQpKSB7Ci0gICAgY29udHJvbGxlclR5cGUgPSAnYXJyYXknOwotICB9IGVsc2UgaWYg
KGNvbnRleHQpIHsKLSAgICBjb250cm9sbGVyVHlwZSA9ICdvYmplY3QnOwotICB9IGVsc2Ugewot
ICAgIGNvbnRyb2xsZXJUeXBlID0gJ2Jhc2ljJzsKLSAgfQotCi0gIGZhY3RvcnlOYW1lID0gJ2Nv
bnRyb2xsZXI6JyArIGNvbnRyb2xsZXJUeXBlOwotCi0gIEZhY3RvcnkgPSBjb250YWluZXIubG9v
a3VwRmFjdG9yeShmYWN0b3J5TmFtZSkuZXh0ZW5kKHsKLSAgICBpc0dlbmVyYXRlZDogdHJ1ZSwK
LSAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgICByZXR1cm4gIihnZW5lcmF0ZWQgIiAr
IGNvbnRyb2xsZXJOYW1lICsgIiBjb250cm9sbGVyKSI7Ci0gICAgfQotICB9KTsKLQotICBmdWxs
TmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZTsKLQotICBjb250YWluZXIucmVn
aXN0ZXIoZnVsbE5hbWUsICBGYWN0b3J5KTsKLQotICByZXR1cm4gRmFjdG9yeTsKLX07Ci0KLS8q
KgotICBHZW5lcmF0ZXMgYW5kIGluc3RhbnRpYXRlcyBhIGNvbnRyb2xsZXIuCi0KLSAgVGhlIHR5
cGUgb2YgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZhY3RvcnkgaXMgZGVyaXZlZAotICBmcm9t
IHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBhbiBhcnJheSBhbiBhcnJheSBjb250cm9s
bGVyCi0gIGlzIGdlbmVyYXRlZCwgaWYgYW4gb2JqZWN0LCBhbiBvYmplY3QgY29udHJvbGxlciBv
dGhlcndpc2UsIGEgYmFzaWMKLSAgY29udHJvbGxlciBpcyBnZW5lcmF0ZWQuCi0KLSAgQGZvciBF
bWJlcgotICBAbWV0aG9kIGdlbmVyYXRlQ29udHJvbGxlcgotICBAcHJpdmF0ZQotKi8KLUVtYmVy
LmdlbmVyYXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUs
IGNvbnRleHQpIHsKLSAgRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeShjb250YWluZXIs
IGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KTsKLSAgdmFyIGZ1bGxOYW1lID0gJ2NvbnRyb2xsZXI6
JyArIGNvbnRyb2xsZXJOYW1lOwotICB2YXIgaW5zdGFuY2UgPSBjb250YWluZXIubG9va3VwKGZ1
bGxOYW1lKTsKLQotICBpZiAoZ2V0KGluc3RhbmNlLCAnbmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VO
RVJBVElPTicpKSB7Ci0gICAgRW1iZXIuTG9nZ2VyLmluZm8oImdlbmVyYXRlZCAtPiAiICsgZnVs
bE5hbWUsIHsgZnVsbE5hbWU6IGZ1bGxOYW1lIH0pOwotICB9Ci0KLSAgcmV0dXJuIGluc3RhbmNl
OwotfTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgot
QHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgUm91dGVyID0gcmVxdWlyZU1vZHVs
ZSgicm91dGVyIilbJ2RlZmF1bHQnXTsKLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVy
LnNldDsKLXZhciBkZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLmRlZmluZVByb3BlcnR5OwotdmFyIHNs
aWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwotCi12YXIgRGVmYXVsdFZpZXcgPSBFbWJlci5f
TWV0YW1vcnBoVmlldzsKLS8qKgotICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0
aGUgYXBwbGljYXRpb24gc3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCi0gIHRoZSBbcm91dGluZyBn
dWlkZV0oaHR0cDovL2VtYmVyanMuY29tL2d1aWRlcy9yb3V0aW5nLykgZm9yIGRvY3VtZW50YXRp
b24uCi0KLSAgQGNsYXNzIFJvdXRlcgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBleHRlbmRzIEVt
YmVyLk9iamVjdAotKi8KLUVtYmVyLlJvdXRlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIu
RXZlbnRlZCwgewotICAvKioKLSAgICBUaGUgYGxvY2F0aW9uYCBwcm9wZXJ0eSBkZXRlcm1pbmVz
IHRoZSB0eXBlIG9mIFVSTCdzIHRoYXQgeW91cgotICAgIGFwcGxpY2F0aW9uIHdpbGwgdXNlLgot
Ci0gICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbiB0eXBlcyBhcmUgY3VycmVudGx5IGF2YWlsYWJs
ZToKLQotICAgICogYGhhc2hgCi0gICAgKiBgaGlzdG9yeWAKLSAgICAqIGBub25lYAotCi0gICAg
QHByb3BlcnR5IGxvY2F0aW9uCi0gICAgQGRlZmF1bHQgJ2hhc2gnCi0gICAgQHNlZSB7RW1iZXIu
TG9jYXRpb259Ci0gICovCi0gIGxvY2F0aW9uOiAnaGFzaCcsCi0KLSAgaW5pdDogZnVuY3Rpb24o
KSB7Ci0gICAgdGhpcy5yb3V0ZXIgPSB0aGlzLmNvbnN0cnVjdG9yLnJvdXRlciB8fCB0aGlzLmNv
bnN0cnVjdG9yLm1hcChFbWJlci5LKTsKLSAgICB0aGlzLl9hY3RpdmVWaWV3cyA9IHt9OwotICAg
IHRoaXMuX3NldHVwTG9jYXRpb24oKTsKLQotICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZS5M
T0dfVFJBTlNJVElPTlNfSU5URVJOQUwnKSkgewotICAgICAgdGhpcy5yb3V0ZXIubG9nID0gRW1i
ZXIuTG9nZ2VyLmRlYnVnOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBSZXByZXNlbnRzIHRo
ZSBjdXJyZW50IFVSTC4KLQotICAgIEBtZXRob2QgdXJsCi0gICAgQHJldHVybnMge1N0cmluZ30g
VGhlIGN1cnJlbnQgVVJMLgotICAqLwotICB1cmw6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkg
ewotICAgIHJldHVybiBnZXQodGhpcywgJ2xvY2F0aW9uJykuZ2V0VVJMKCk7Ci0gIH0pLAotCi0g
IC8qKgotICAgIEluaXRpYWxpemVzIHRoZSBjdXJyZW50IHJvdXRlciBpbnN0YW5jZSBhbmQgc2V0
cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCi0gICAgZXZlbnQgbGlzdGVuZXJzIHVzZWQgYnkgdGhl
IGluc3RhbmNlcyBgbG9jYXRpb25gIGltcGxlbWVudGF0aW9uLgotCi0gICAgQG1ldGhvZCBzdGFy
dFJvdXRpbmcKLSAgICBAcHJpdmF0ZQotICAqLwotICBzdGFydFJvdXRpbmc6IGZ1bmN0aW9uKCkg
ewotICAgIHRoaXMucm91dGVyID0gdGhpcy5yb3V0ZXIgfHwgdGhpcy5jb25zdHJ1Y3Rvci5tYXAo
RW1iZXIuSyk7Ci0KLSAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXIsCi0gICAgICAgIGxvY2F0
aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAotICAgICAgICBjb250YWluZXIgPSB0aGlzLmNv
bnRhaW5lciwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICB0aGlzLl9zZXR1cFJvdXRlcihy
b3V0ZXIsIGxvY2F0aW9uKTsKLQotICAgIGNvbnRhaW5lci5yZWdpc3RlcigndmlldzpkZWZhdWx0
JywgRGVmYXVsdFZpZXcpOwotICAgIGNvbnRhaW5lci5yZWdpc3Rlcigndmlldzp0b3BsZXZlbCcs
IEVtYmVyLlZpZXcuZXh0ZW5kKCkpOwotCi0gICAgbG9jYXRpb24ub25VcGRhdGVVUkwoZnVuY3Rp
b24odXJsKSB7Ci0gICAgICBzZWxmLmhhbmRsZVVSTCh1cmwpOwotICAgIH0pOwotCi0gICAgdGhp
cy5oYW5kbGVVUkwobG9jYXRpb24uZ2V0VVJMKCkpOwotICB9LAotCi0gIC8qKgotICAgIEhhbmRs
ZXMgdXBkYXRpbmcgdGhlIHBhdGhzIGFuZCBub3RpZnlpbmcgYW55IGxpc3RlbmVycyBvZiB0aGUg
VVJMCi0gICAgY2hhbmdlLgotCi0gICAgVHJpZ2dlcnMgdGhlIHJvdXRlciBsZXZlbCBgZGlkVHJh
bnNpdGlvbmAgaG9vay4KLQotICAgIEBtZXRob2QgZGlkVHJhbnNpdGlvbgotICAgIEBwcml2YXRl
Ci0gICovCi0gIGRpZFRyYW5zaXRpb246IGZ1bmN0aW9uKGluZm9zKSB7Ci0gICAgdXBkYXRlUGF0
aHModGhpcyk7Ci0KLSAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKLQotICAgIHRoaXMu
bm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3VybCcpOwotCi0gICAgLy8gUHV0IHRoaXMgaW4gdGhlIHJ1
bmxvb3Agc28gdXJsIHdpbGwgYmUgYWNjdXJhdGUuIFNlZW1zCi0gICAgLy8gbGVzcyBzdXJwcmlz
aW5nIHRoYW4gZGlkVHJhbnNpdGlvbiBiZWluZyBvdXQgb2Ygc3luYy4KLSAgICBFbWJlci5ydW4u
b25jZSh0aGlzLCB0aGlzLnRyaWdnZXIsICdkaWRUcmFuc2l0aW9uJyk7Ci0KLSAgICBpZiAoZ2V0
KHRoaXMsICduYW1lc3BhY2UnKS5MT0dfVFJBTlNJVElPTlMpIHsKLSAgICAgIEVtYmVyLkxvZ2dl
ci5sb2coIlRyYW5zaXRpb25lZCBpbnRvICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5m
b3MpICsgIiciKTsKLSAgICB9Ci0gIH0sCi0KLSAgaGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsK
LSAgICByZXR1cm4gdGhpcy5fZG9UcmFuc2l0aW9uKCdoYW5kbGVVUkwnLCBbdXJsXSk7Ci0gIH0s
Ci0KLSAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5fZG9UcmFu
c2l0aW9uKCd0cmFuc2l0aW9uVG8nLCBhcmd1bWVudHMpOwotICB9LAotCi0gIGludGVybWVkaWF0
ZVRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5yb3V0ZXIuaW50ZXJtZWRpYXRl
VHJhbnNpdGlvblRvLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOwotCi0gICAgdXBkYXRl
UGF0aHModGhpcyk7Ci0KLSAgICB2YXIgaW5mb3MgPSB0aGlzLnJvdXRlci5jdXJyZW50SGFuZGxl
ckluZm9zOwotICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFjZScpLkxPR19UUkFOU0lUSU9OUykg
ewotICAgICAgRW1iZXIuTG9nZ2VyLmxvZygiSW50ZXJtZWRpYXRlLXRyYW5zaXRpb25lZCBpbnRv
ICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgIiciKTsKLSAgICB9Ci0gIH0s
Ci0KLSAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLl9kb1RyYW5z
aXRpb24oJ3JlcGxhY2VXaXRoJywgYXJndW1lbnRzKTsKLSAgfSwKLQotICBnZW5lcmF0ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIHVybCA9IHRoaXMucm91dGVyLmdlbmVyYXRlLmFwcGx5KHRoaXMu
cm91dGVyLCBhcmd1bWVudHMpOwotICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmZvcm1hdFVSTCh1
cmwpOwotICB9LAotCi0gIC8qKgotICAgIERldGVybWluZXMgaWYgdGhlIHN1cHBsaWVkIHJvdXRl
IGlzIGN1cnJlbnRseSBhY3RpdmUuCi0KLSAgICBAbWV0aG9kIGlzQWN0aXZlCi0gICAgQHBhcmFt
IHJvdXRlTmFtZQotICAgIEByZXR1cm5zIHtCb29sZWFufQotICAgIEBwcml2YXRlCi0gICovCi0g
IGlzQWN0aXZlOiBmdW5jdGlvbihyb3V0ZU5hbWUpIHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5y
b3V0ZXI7Ci0gICAgcmV0dXJuIHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIGFyZ3VtZW50
cyk7Ci0gIH0sCi0KLSAgc2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHRoaXMu
cm91dGVyLnRyaWdnZXIuYXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRG9lcyB0aGlzIHJvdXRlciBpbnN0YW5jZSBoYXZlIHRoZSBnaXZlbiByb3V0ZS4K
LQotICAgIEBtZXRob2QgaGFzUm91dGUKLSAgICBAcmV0dXJucyB7Qm9vbGVhbn0KLSAgICBAcHJp
dmF0ZQotICAqLwotICBoYXNSb3V0ZTogZnVuY3Rpb24ocm91dGUpIHsKLSAgICByZXR1cm4gdGhp
cy5yb3V0ZXIuaGFzUm91dGUocm91dGUpOwotICB9LAotCi0gIC8qKgotICAgIFJlc2V0cyB0aGUg
c3RhdGUgb2YgdGhlIHJvdXRlciBieSBjbGVhcmluZyB0aGUgY3VycmVudCByb3V0ZQotICAgIGhh
bmRsZXJzIGFuZCBkZWFjdGl2YXRpbmcgdGhlbS4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhv
ZCByZXNldAotICAgKi8KLSAgcmVzZXQ6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMucm91dGVyLnJl
c2V0KCk7Ci0gIH0sCi0KLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCl7Ci0gICAgdmFyIGxvY2F0
aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpOwotICAgIGxvY2F0aW9uLmRlc3Ryb3koKTsKLQot
ICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgX2xvb2t1
cEFjdGl2ZVZpZXc6IGZ1bmN0aW9uKHRlbXBsYXRlTmFtZSkgewotICAgIHZhciBhY3RpdmUgPSB0
aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5hbWVdOwotICAgIHJldHVybiBhY3RpdmUgJiYgYWN0
aXZlWzBdOwotICB9LAotCi0gIF9jb25uZWN0QWN0aXZlVmlldzogZnVuY3Rpb24odGVtcGxhdGVO
YW1lLCB2aWV3KSB7Ci0gICAgdmFyIGV4aXN0aW5nID0gdGhpcy5fYWN0aXZlVmlld3NbdGVtcGxh
dGVOYW1lXTsKLQotICAgIGlmIChleGlzdGluZykgewotICAgICAgZXhpc3RpbmdbMF0ub2ZmKCd3
aWxsRGVzdHJveUVsZW1lbnQnLCB0aGlzLCBleGlzdGluZ1sxXSk7Ci0gICAgfQotCi0gICAgdmFy
IGRpc2Nvbm5lY3QgPSBmdW5jdGlvbigpIHsKLSAgICAgIGRlbGV0ZSB0aGlzLl9hY3RpdmVWaWV3
c1t0ZW1wbGF0ZU5hbWVdOwotICAgIH07Ci0KLSAgICB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0
ZU5hbWVdID0gW3ZpZXcsIGRpc2Nvbm5lY3RdOwotICAgIHZpZXcub25lKCd3aWxsRGVzdHJveUVs
ZW1lbnQnLCB0aGlzLCBkaXNjb25uZWN0KTsKLSAgfSwKLQotICBfc2V0dXBMb2NhdGlvbjogZnVu
Y3Rpb24oKSB7Ci0gICAgdmFyIGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAotICAg
ICAgICByb290VVJMID0gZ2V0KHRoaXMsICdyb290VVJMJyksCi0gICAgICAgIG9wdGlvbnMgPSB7
fTsKLQotICAgIGlmICh0eXBlb2Ygcm9vdFVSTCA9PT0gJ3N0cmluZycpIHsKLSAgICAgIG9wdGlv
bnMucm9vdFVSTCA9IHJvb3RVUkw7Ci0gICAgfQotCi0gICAgaWYgKCdzdHJpbmcnID09PSB0eXBl
b2YgbG9jYXRpb24pIHsKLSAgICAgIG9wdGlvbnMuaW1wbGVtZW50YXRpb24gPSBsb2NhdGlvbjsK
LSAgICAgIGxvY2F0aW9uID0gc2V0KHRoaXMsICdsb2NhdGlvbicsIEVtYmVyLkxvY2F0aW9uLmNy
ZWF0ZShvcHRpb25zKSk7Ci0gICAgfQotCi0gICAgLy8gZW5zdXJlIHRoYXQgaW5pdFN0YXRlIGlz
IGNhbGxlZCBBRlRFUiB0aGUgcm9vdFVSTCBpcyBzZXQgb24KLSAgICAvLyB0aGUgbG9jYXRpb24g
aW5zdGFuY2UKLSAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmluaXRTdGF0ZSA9PT0gJ2Z1bmN0aW9u
JykgeyBsb2NhdGlvbi5pbml0U3RhdGUoKTsgfQotICB9LAotCi0gIF9nZXRIYW5kbGVyRnVuY3Rp
b246IGZ1bmN0aW9uKCkgewotICAgIHZhciBzZWVuID0ge30sIGNvbnRhaW5lciA9IHRoaXMuY29u
dGFpbmVyLAotICAgICAgICBEZWZhdWx0Um91dGUgPSBjb250YWluZXIubG9va3VwRmFjdG9yeSgn
cm91dGU6YmFzaWMnKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0KLSAgICByZXR1cm4gZnVuY3Rp
b24obmFtZSkgewotICAgICAgdmFyIHJvdXRlTmFtZSA9ICdyb3V0ZTonICsgbmFtZSwKLSAgICAg
ICAgICBoYW5kbGVyID0gY29udGFpbmVyLmxvb2t1cChyb3V0ZU5hbWUpOwotCi0gICAgICBpZiAo
c2VlbltuYW1lXSkgeyByZXR1cm4gaGFuZGxlcjsgfQotCi0gICAgICBzZWVuW25hbWVdID0gdHJ1
ZTsKLQotICAgICAgaWYgKCFoYW5kbGVyKSB7Ci0gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihy
b3V0ZU5hbWUsIERlZmF1bHRSb3V0ZS5leHRlbmQoKSk7Ci0gICAgICAgIGhhbmRsZXIgPSBjb250
YWluZXIubG9va3VwKHJvdXRlTmFtZSk7Ci0KLSAgICAgICAgaWYgKGdldChzZWxmLCAnbmFtZXNw
YWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7Ci0gICAgICAgICAgRW1iZXIuTG9nZ2VyLmlu
Zm8oImdlbmVyYXRlZCAtPiAiICsgcm91dGVOYW1lLCB7IGZ1bGxOYW1lOiByb3V0ZU5hbWUgfSk7
Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaGFuZGxlci5yb3V0ZU5hbWUgPSBuYW1lOwot
ICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfTsKLSAgfSwKLQotICBfc2V0dXBSb3V0ZXI6IGZ1
bmN0aW9uKHJvdXRlciwgbG9jYXRpb24pIHsKLSAgICB2YXIgbGFzdFVSTCwgZW1iZXJSb3V0ZXIg
PSB0aGlzOwotCi0gICAgcm91dGVyLmdldEhhbmRsZXIgPSB0aGlzLl9nZXRIYW5kbGVyRnVuY3Rp
b24oKTsKLQotICAgIHZhciBkb1VwZGF0ZVVSTCA9IGZ1bmN0aW9uKCkgewotICAgICAgbG9jYXRp
b24uc2V0VVJMKGxhc3RVUkwpOwotICAgIH07Ci0KLSAgICByb3V0ZXIudXBkYXRlVVJMID0gZnVu
Y3Rpb24ocGF0aCkgewotICAgICAgbGFzdFVSTCA9IHBhdGg7Ci0gICAgICBFbWJlci5ydW4ub25j
ZShkb1VwZGF0ZVVSTCk7Ci0gICAgfTsKLQotICAgIGlmIChsb2NhdGlvbi5yZXBsYWNlVVJMKSB7
Ci0gICAgICB2YXIgZG9SZXBsYWNlVVJMID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgIGxvY2F0aW9u
LnJlcGxhY2VVUkwobGFzdFVSTCk7Ci0gICAgICB9OwotCi0gICAgICByb3V0ZXIucmVwbGFjZVVS
TCA9IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICAgICAgbGFzdFVSTCA9IHBhdGg7Ci0gICAgICAgIEVt
YmVyLnJ1bi5vbmNlKGRvUmVwbGFjZVVSTCk7Ci0gICAgICB9OwotICAgIH0KLQotICAgIHJvdXRl
ci5kaWRUcmFuc2l0aW9uID0gZnVuY3Rpb24oaW5mb3MpIHsKLSAgICAgIGVtYmVyUm91dGVyLmRp
ZFRyYW5zaXRpb24oaW5mb3MpOwotICAgIH07Ci0gIH0sCi0KLSAgX2RvVHJhbnNpdGlvbjogZnVu
Y3Rpb24obWV0aG9kLCBhcmdzKSB7Ci0gICAgLy8gTm9ybWFsaXplIGJsYW5rIHJvdXRlIHRvIHJv
b3QgVVJMLgotICAgIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3MpOwotICAgIGFyZ3NbMF0gPSBhcmdz
WzBdIHx8ICcvJzsKLQotICAgIHZhciBwYXNzZWROYW1lID0gYXJnc1swXSwgbmFtZSwgc2VsZiA9
IHRoaXMsCi0gICAgICBpc1F1ZXJ5UGFyYW1zT25seSA9IGZhbHNlOwotCi0gICAgCi0gICAgaWYg
KCFpc1F1ZXJ5UGFyYW1zT25seSAmJiBwYXNzZWROYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSB7Ci0g
ICAgICBuYW1lID0gcGFzc2VkTmFtZTsKLSAgICB9IGVsc2UgaWYgKCFpc1F1ZXJ5UGFyYW1zT25s
eSkgewotICAgICAgaWYgKCF0aGlzLnJvdXRlci5oYXNSb3V0ZShwYXNzZWROYW1lKSkgewotICAg
ICAgICBuYW1lID0gYXJnc1swXSA9IHBhc3NlZE5hbWUgKyAnLmluZGV4JzsKLSAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgIG5hbWUgPSBwYXNzZWROYW1lOwotICAgICAgfQotCi0gICAgICBFbWJlci5h
c3NlcnQoIlRoZSByb3V0ZSAiICsgcGFzc2VkTmFtZSArICIgd2FzIG5vdCBmb3VuZCIsIHRoaXMu
cm91dGVyLmhhc1JvdXRlKG5hbWUpKTsKLSAgICB9Ci0KLSAgICB2YXIgdHJhbnNpdGlvblByb21p
c2UgPSB0aGlzLnJvdXRlclttZXRob2RdLmFwcGx5KHRoaXMucm91dGVyLCBhcmdzKTsKLQotICAg
IHRyYW5zaXRpb25Qcm9taXNlLnRoZW4obnVsbCwgZnVuY3Rpb24oZXJyb3IpIHsKLSAgICAgIGlm
IChlcnJvci5uYW1lID09PSAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKSB7Ci0gICAgICAgIEVtYmVy
LmFzc2VydCgiVGhlIFVSTCAnIiArIGVycm9yLm1lc3NhZ2UgKyAiJyBkaWQgbm90IG1hdGNoIGFu
eSByb3V0ZXMgaW4geW91ciBhcHBsaWNhdGlvbiIpOwotICAgICAgfQotICAgIH0sICdFbWJlcjog
Q2hlY2sgZm9yIFJvdXRlciB1bnJlY29nbml6ZWQgVVJMIGVycm9yJyk7Ci0KLSAgICAvLyBXZSB3
YW50IHRvIHJldHVybiB0aGUgY29uZmlndXJhYmxlIHByb21pc2Ugb2JqZWN0Ci0gICAgLy8gc28g
dGhhdCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gY2FuIHVzZSBgLm1ldGhvZCgpYCBvbiBpdCwK
LSAgICAvLyB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBleGlzdCBmb3Igbm9ybWFsIFJTVlAgcHJv
bWlzZXMuCi0gICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9taXNlOwotICB9LAotCi0gIF9zY2hlZHVs
ZUxvYWRpbmdFdmVudDogZnVuY3Rpb24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICB0
aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQoKTsKLSAgICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9
IEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JvdXRlclRyYW5zaXRpb25zJywgdGhpcywgJ19maXJl
TG9hZGluZ0V2ZW50JywgdHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAotCi0gIF9maXJl
TG9hZGluZ0V2ZW50OiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcmlnaW5Sb3V0ZSkgewotICAgIGlm
ICghdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbikgewotICAgICAgLy8gRG9uJ3QgZmlyZSBh
biBldmVudCBpZiB3ZSd2ZSBzaW5jZSBtb3ZlZCBvbiBmcm9tCi0gICAgICAvLyB0aGUgdHJhbnNp
dGlvbiB0aGF0IHB1dCB1cyBpbiBhIGxvYWRpbmcgc3RhdGUuCi0gICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICdsb2FkaW5nJywgdHJhbnNpdGlvbiwg
b3JpZ2luUm91dGUpOwotICB9LAotCi0gIF9jYW5jZWxMb2FkaW5nRXZlbnQ6IGZ1bmN0aW9uICgp
IHsKLSAgICBpZiAodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIpIHsKLSAgICAgIEVtYmVyLnJ1bi5j
YW5jZWwodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIpOwotICAgIH0KLSAgICB0aGlzLl9sb2FkaW5n
U3RhdGVUaW1lciA9IG51bGw7Ci0gIH0KLX0pOwotCi0vKioKLSAgSGVscGVyIGZ1bmN0aW9uIGZv
ciBpdGVyYXRpbmcgcm9vdC13YXJkLCBzdGFydGluZwotICBmcm9tIChidXQgbm90IGluY2x1ZGlu
ZykgdGhlIHByb3ZpZGVkIGBvcmlnaW5Sb3V0ZWAuCi0KLSAgUmV0dXJucyB0cnVlIGlmIHRoZSBs
YXN0IGNhbGxiYWNrIGZpcmVkIHJlcXVlc3RlZAotICB0byBidWJibGUgdXB3YXJkLgotCi0gIEBw
cml2YXRlCi0gKi8KLWZ1bmN0aW9uIGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFu
c2l0aW9uLCBjYWxsYmFjaykgewotICB2YXIgaGFuZGxlckluZm9zID0gdHJhbnNpdGlvbi5oYW5k
bGVySW5mb3MsCi0gICAgICBvcmlnaW5Sb3V0ZUZvdW5kID0gZmFsc2U7Ci0KLSAgZm9yICh2YXIg
aSA9IGhhbmRsZXJJbmZvcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgIHZhciBoYW5k
bGVySW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKLSAgICAgICAgcm91dGUgPSBoYW5kbGVySW5mby5o
YW5kbGVyOwotCi0gICAgaWYgKCFvcmlnaW5Sb3V0ZUZvdW5kKSB7Ci0gICAgICBpZiAob3JpZ2lu
Um91dGUgPT09IHJvdXRlKSB7Ci0gICAgICAgIG9yaWdpblJvdXRlRm91bmQgPSB0cnVlOwotICAg
ICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKGNhbGxiYWNrKHJvdXRlLCBo
YW5kbGVySW5mb3NbaSArIDFdLmhhbmRsZXIpICE9PSB0cnVlKSB7Ci0gICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUaGVzZSBnZXQgaW52b2tl
ZCB3aGVuIGFuIGFjdGlvbiBidWJibGVzIGFib3ZlIEFwcGxpY2F0aW9uUm91dGUKLS8vIGFuZCBh
cmUgbm90IG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlLgotdmFyIGRlZmF1bHRBY3Rpb25IYW5kbGVy
cyA9IHsKLQotICB3aWxsUmVzb2x2ZU1vZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcmlnaW5S
b3V0ZSkgewotICAgIG9yaWdpblJvdXRlLnJvdXRlci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJh
bnNpdGlvbiwgb3JpZ2luUm91dGUpOwotICB9LAotCi0gIGVycm9yOiBmdW5jdGlvbihlcnJvciwg
dHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICAvLyBBdHRlbXB0IHRvIGZpbmQgYW4gYXBw
cm9wcmlhdGUgZXJyb3Igc3Vic3RhdGUgdG8gZW50ZXIuCi0gICAgdmFyIHJvdXRlciA9IG9yaWdp
blJvdXRlLnJvdXRlcjsKLQotICAgIHZhciB0cnlUb3BMZXZlbCA9IGZvckVhY2hSb3V0ZUFib3Zl
KG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBmdW5jdGlvbihyb3V0ZSwgY2hpbGRSb3V0ZSkgewot
ICAgICAgdmFyIGNoaWxkRXJyb3JSb3V0ZU5hbWUgPSBmaW5kQ2hpbGRSb3V0ZU5hbWUocm91dGUs
IGNoaWxkUm91dGUsICdlcnJvcicpOwotICAgICAgaWYgKGNoaWxkRXJyb3JSb3V0ZU5hbWUpIHsK
LSAgICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbyhjaGlsZEVycm9yUm91dGVO
YW1lLCBlcnJvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVl
OwotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExldmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3Ig
dG9wLWxldmVsIGVycm9yIHN0YXRlIHRvIGVudGVyLgotICAgICAgaWYgKHJvdXRlSGFzQmVlbkRl
ZmluZWQob3JpZ2luUm91dGUucm91dGVyLCAnYXBwbGljYXRpb25fZXJyb3InKSkgewotICAgICAg
ICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCdhcHBsaWNhdGlvbl9lcnJvcicsIGVy
cm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBE
b24ndCBmaXJlIGFuIGFzc2VydGlvbiBpZiB3ZSBmb3VuZCBhbiBlcnJvciBzdWJzdGF0ZS4KLSAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFbWJlci5Mb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxl
IGxvYWRpbmcgcm91dGU6ICcgKyBlcnJvci5zdGFjayk7Ci0gIH0sCi0KLSAgbG9hZGluZzogZnVu
Y3Rpb24odHJhbnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKLSAgICAvLyBBdHRlbXB0IHRvIGZpbmQg
YW4gYXBwcm9wcmlhdGUgbG9hZGluZyBzdWJzdGF0ZSB0byBlbnRlci4KLSAgICB2YXIgcm91dGVy
ID0gb3JpZ2luUm91dGUucm91dGVyOwotCi0gICAgdmFyIHRyeVRvcExldmVsID0gZm9yRWFjaFJv
dXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRpb24sIGZ1bmN0aW9uKHJvdXRlLCBjaGlsZFJv
dXRlKSB7Ci0gICAgICB2YXIgY2hpbGRMb2FkaW5nUm91dGVOYW1lID0gZmluZENoaWxkUm91dGVO
YW1lKHJvdXRlLCBjaGlsZFJvdXRlLCAnbG9hZGluZycpOwotCi0gICAgICBpZiAoY2hpbGRMb2Fk
aW5nUm91dGVOYW1lKSB7Ci0gICAgICAgIHJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8o
Y2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAg
ICAvLyBEb24ndCBidWJibGUgYWJvdmUgcGl2b3Qgcm91dGUuCi0gICAgICBpZiAodHJhbnNpdGlv
bi5waXZvdEhhbmRsZXIgIT09IHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
fQotICAgIH0pOwotCi0gICAgaWYgKHRyeVRvcExldmVsKSB7Ci0gICAgICAvLyBDaGVjayBmb3Ig
dG9wLWxldmVsIGxvYWRpbmcgc3RhdGUgdG8gZW50ZXIuCi0gICAgICBpZiAocm91dGVIYXNCZWVu
RGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0ZXIsICdhcHBsaWNhdGlvbl9sb2FkaW5nJykpIHsKLSAg
ICAgICAgcm91dGVyLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbygnYXBwbGljYXRpb25fbG9hZGlu
ZycpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi1mdW5jdGlv
biBmaW5kQ2hpbGRSb3V0ZU5hbWUocGFyZW50Um91dGUsIG9yaWdpbmF0aW5nQ2hpbGRSb3V0ZSwg
bmFtZSkgewotICB2YXIgcm91dGVyID0gcGFyZW50Um91dGUucm91dGVyLAotICAgICAgY2hpbGRO
YW1lLAotICAgICAgdGFyZ2V0Q2hpbGRSb3V0ZU5hbWUgPSBvcmlnaW5hdGluZ0NoaWxkUm91dGUu
cm91dGVOYW1lLnNwbGl0KCcuJykucG9wKCksCi0gICAgICBuYW1lc3BhY2UgPSBwYXJlbnRSb3V0
ZS5yb3V0ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicgPyAnJyA6IHBhcmVudFJvdXRlLnJvdXRlTmFt
ZSArICcuJzsKLQotICAKLSAgLy8gU2Vjb25kLCB0cnkgZ2VuZXJhbCBsb2FkaW5nIHN0YXRlLCBl
LmcuICdsb2FkaW5nJwotICBjaGlsZE5hbWUgPSBuYW1lc3BhY2UgKyBuYW1lOwotICBpZiAocm91
dGVIYXNCZWVuRGVmaW5lZChyb3V0ZXIsIGNoaWxkTmFtZSkpIHsKLSAgICByZXR1cm4gY2hpbGRO
YW1lOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHJvdXRlSGFzQmVlbkRlZmluZWQocm91dGVyLCBuYW1l
KSB7Ci0gIHZhciBjb250YWluZXIgPSByb3V0ZXIuY29udGFpbmVyOwotICByZXR1cm4gcm91dGVy
Lmhhc1JvdXRlKG5hbWUpICYmCi0gICAgICAgICAoY29udGFpbmVyLmhhcygndGVtcGxhdGU6JyAr
IG5hbWUpIHx8IGNvbnRhaW5lci5oYXMoJ3JvdXRlOicgKyBuYW1lKSk7Ci19Ci0KLWZ1bmN0aW9u
IHRyaWdnZXJFdmVudChoYW5kbGVySW5mb3MsIGlnbm9yZUZhaWx1cmUsIGFyZ3MpIHsKLSAgdmFy
IG5hbWUgPSBhcmdzLnNoaWZ0KCk7Ci0KLSAgaWYgKCFoYW5kbGVySW5mb3MpIHsKLSAgICBpZiAo
aWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KLSAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNh
bid0IHRyaWdnZXIgYWN0aW9uICciICsgbmFtZSArICInIGJlY2F1c2UgeW91ciBhcHAgaGFzbid0
IGZpbmlzaGVkIHRyYW5zaXRpb25pbmcgaW50byBpdHMgZmlyc3Qgcm91dGUuIFRvIHRyaWdnZXIg
YW4gYWN0aW9uIG9uIGRlc3RpbmF0aW9uIHJvdXRlcyBkdXJpbmcgYSB0cmFuc2l0aW9uLCB5b3Ug
Y2FuIGNhbGwgYC5zZW5kKClgIG9uIHRoZSBgVHJhbnNpdGlvbmAgb2JqZWN0IHBhc3NlZCB0byB0
aGUgYG1vZGVsL2JlZm9yZU1vZGVsL2FmdGVyTW9kZWxgIGhvb2tzLiIpOwotICB9Ci0KLSAgdmFy
IGV2ZW50V2FzSGFuZGxlZCA9IGZhbHNlOwotCi0gIGZvciAodmFyIGkgPSBoYW5kbGVySW5mb3Mu
bGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVy
SW5mb3NbaV0sCi0gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5mby5oYW5kbGVyOwotCi0gICAg
aWYgKGhhbmRsZXIuX2FjdGlvbnMgJiYgaGFuZGxlci5fYWN0aW9uc1tuYW1lXSkgewotICAgICAg
aWYgKGhhbmRsZXIuX2FjdGlvbnNbbmFtZV0uYXBwbHkoaGFuZGxlciwgYXJncykgPT09IHRydWUp
IHsKLSAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZGVmYXVsdEFjdGlvbkhh
bmRsZXJzW25hbWVdKSB7Ci0gICAgZGVmYXVsdEFjdGlvbkhhbmRsZXJzW25hbWVdLmFwcGx5KG51
bGwsIGFyZ3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghZXZlbnRXYXNIYW5kbGVkICYm
ICFpZ25vcmVGYWlsdXJlKSB7Ci0gICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJOb3RoaW5nIGhh
bmRsZWQgdGhlIGFjdGlvbiAnIiArIG5hbWUgKyAiJy4gSWYgeW91IGRpZCBoYW5kbGUgdGhlIGFj
dGlvbiwgdGhpcyBlcnJvciBjYW4gYmUgY2F1c2VkIGJ5IHJldHVybmluZyB0cnVlIGZyb20gYW4g
YWN0aW9uIGhhbmRsZXIgaW4gYSBjb250cm9sbGVyLCBjYXVzaW5nIHRoZSBhY3Rpb24gdG8gYnVi
YmxlLiIpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHVwZGF0ZVBhdGhzKHJvdXRlcikgewotICB2YXIg
YXBwQ29udHJvbGxlciA9IHJvdXRlci5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVyOmFwcGxp
Y2F0aW9uJyk7Ci0KLSAgaWYgKCFhcHBDb250cm9sbGVyKSB7Ci0gICAgLy8gYXBwQ29udHJvbGxl
ciBtaWdodCBub3QgZXhpc3Qgd2hlbiB0b3AtbGV2ZWwgbG9hZGluZy9lcnJvcgotICAgIC8vIHN1
YnN0YXRlcyBoYXZlIGJlZW4gZW50ZXJlZCBzaW5jZSBBcHBsaWNhdGlvblJvdXRlIGhhc24ndAot
ICAgIC8vIGFjdHVhbGx5IGJlZW4gZW50ZXJlZCBhdCB0aGF0IHBvaW50LgotICAgIHJldHVybjsK
LSAgfQotCi0gIHZhciBpbmZvcyA9IHJvdXRlci5yb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcywK
LSAgICAgIHBhdGggPSBFbWJlci5Sb3V0ZXIuX3JvdXRlUGF0aChpbmZvcyk7Ci0KLSAgaWYgKCEo
J2N1cnJlbnRQYXRoJyBpbiBhcHBDb250cm9sbGVyKSkgewotICAgIGRlZmluZVByb3BlcnR5KGFw
cENvbnRyb2xsZXIsICdjdXJyZW50UGF0aCcpOwotICB9Ci0KLSAgc2V0KGFwcENvbnRyb2xsZXIs
ICdjdXJyZW50UGF0aCcsIHBhdGgpOwotCi0gIGlmICghKCdjdXJyZW50Um91dGVOYW1lJyBpbiBh
cHBDb250cm9sbGVyKSkgewotICAgIGRlZmluZVByb3BlcnR5KGFwcENvbnRyb2xsZXIsICdjdXJy
ZW50Um91dGVOYW1lJyk7Ci0gIH0KLQotICBzZXQoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0
ZU5hbWUnLCBpbmZvc1tpbmZvcy5sZW5ndGggLSAxXS5uYW1lKTsKLX0KLQotRW1iZXIuUm91dGVy
LnJlb3BlbkNsYXNzKHsKLSAgcm91dGVyOiBudWxsLAotICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNr
KSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOwotICAgIGlmICghcm91dGVyKSB7Ci0g
ICAgICByb3V0ZXIgPSBuZXcgUm91dGVyKCk7Ci0gICAgICByb3V0ZXIuY2FsbGJhY2tzID0gW107
Ci0gICAgICByb3V0ZXIudHJpZ2dlckV2ZW50ID0gdHJpZ2dlckV2ZW50OwotICAgICAgdGhpcy5y
ZW9wZW5DbGFzcyh7IHJvdXRlcjogcm91dGVyIH0pOwotICAgIH0KLQotICAgIHZhciBkc2wgPSBF
bWJlci5Sb3V0ZXJEU0wubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgnYXBw
bGljYXRpb24nLCB7IHBhdGg6ICIvIiB9LCBmdW5jdGlvbigpIHsKLSAgICAgICAgZm9yICh2YXIg
aT0wOyBpIDwgcm91dGVyLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIHJvdXRl
ci5jYWxsYmFja3NbaV0uY2FsbCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5j
YWxsKHRoaXMpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICByb3V0ZXIuY2FsbGJhY2tzLnB1
c2goY2FsbGJhY2spOwotICAgIHJvdXRlci5tYXAoZHNsLmdlbmVyYXRlKCkpOwotICAgIHJldHVy
biByb3V0ZXI7Ci0gIH0sCi0KLSAgX3JvdXRlUGF0aDogZnVuY3Rpb24oaGFuZGxlckluZm9zKSB7
Ci0gICAgdmFyIHBhdGggPSBbXTsKLQotICAgIC8vIFdlIGhhdmUgdG8gaGFuZGxlIGNvYWxlc2Np
bmcgcmVzb3VyY2UgbmFtZXMgdGhhdAotICAgIC8vIGFyZSBwcmVmaXhlZCB3aXRoIHRoZWlyIHBh
cmVudCdzIG5hbWVzLCBlLmcuCi0gICAgLy8gWydmb28nLCAnZm9vLmJhci5iYXonXSA9PiAnZm9v
LmJhci5iYXonLCBub3QgJ2Zvby5mb28uYmFyLmJheicKLQotICAgIGZ1bmN0aW9uIGludGVyc2Vj
dGlvbk1hdGNoZXMoYTEsIGEyKSB7Ci0gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYTEubGVu
Z3RoOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgewotICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaT0xLCBsPWhhbmRsZXJJbmZvcy5sZW5ndGg7IGk8
bDsgaSsrKSB7Ci0gICAgICB2YXIgbmFtZSA9IGhhbmRsZXJJbmZvc1tpXS5uYW1lLAotICAgICAg
ICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoIi4iKSwKLSAgICAgICAgICBvbGROYW1lUGFydHMg
PSBzbGljZS5jYWxsKHBhdGgpOwotCi0gICAgICB3aGlsZSAob2xkTmFtZVBhcnRzLmxlbmd0aCkg
ewotICAgICAgICBpZiAoaW50ZXJzZWN0aW9uTWF0Y2hlcyhvbGROYW1lUGFydHMsIG5hbWVQYXJ0
cykpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lUGFydHMu
c2hpZnQoKTsKLSAgICAgIH0KLQotICAgICAgcGF0aC5wdXNoLmFwcGx5KHBhdGgsIG5hbWVQYXJ0
cy5zbGljZShvbGROYW1lUGFydHMubGVuZ3RoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhdGgu
am9pbigiLiIpOwotICB9Ci19KTsKLQotUm91dGVyLlRyYW5zaXRpb24ucHJvdG90eXBlLnNlbmQg
PSBSb3V0ZXIuVHJhbnNpdGlvbi5wcm90b3R5cGUudHJpZ2dlcjsKLQotCi0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91
dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LAotICAgIGdl
dFByb3BlcnRpZXMgPSBFbWJlci5nZXRQcm9wZXJ0aWVzLAotICAgIGNsYXNzaWZ5ID0gRW1iZXIu
U3RyaW5nLmNsYXNzaWZ5LAotICAgIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCi0gICAgYV9mb3JF
YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCi0gICAgYV9yZXBsYWNlID0gRW1i
ZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2U7Ci0KLQotLyoqCi0gIFRoZSBgRW1iZXIuUm91dGVg
IGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGluZGl2aWR1YWwgcm91dGVzLiBSZWZlciB0bwotICB0
aGUgW3JvdXRpbmcgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZv
ciBkb2N1bWVudGF0aW9uLgotCi0gIEBjbGFzcyBSb3V0ZQotICBAbmFtZXNwYWNlIEVtYmVyCi0g
IEBleHRlbmRzIEVtYmVyLk9iamVjdAotICBAdXNlcyBFbWJlci5BY3Rpb25IYW5kbGVyCi0qLwot
RW1iZXIuUm91dGUgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkFjdGlvbkhhbmRsZXIsIHsK
LQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAgQG1ldGhvZCBleGl0Ci0gICovCi0gIGV4aXQ6
IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuZGVhY3RpdmF0ZSgpOwotICAgIHRoaXMudGVhcmRvd25W
aWV3cygpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRlCi0KLSAgICBAbWV0aG9kIGVudGVy
Ci0gICovCi0gIGVudGVyOiBmdW5jdGlvbigpIHsKLSAgICB0aGlzLmFjdGl2YXRlKCk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhlIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLCBrZXllZCBieSBuYW1l
LCBhdmFpbGFibGUgb24gdGhpcyByb3V0ZSBhcwotICAgIGFjdGlvbiB0YXJnZXRzLgotCi0gICAg
VGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9u
fX1gIGlzIHRyaWdnZXJlZAotICAgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgYW5kIHRoZSBhcHBs
aWNhdGlvbidzIGN1cnJlbnQgcm91dGUgaXMgdGhpcyByb3V0ZS4KLQotICAgIEFjdGlvbnMgY2Fu
IGFsc28gYmUgaW52b2tlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdmlh
IGBSb3V0ZSNzZW5kYAotICAgIG9yIGBDb250cm9sbGVyI3NlbmRgLgotCi0gICAgVGhlIGBhY3Rp
b25zYCBoYXNoIHdpbGwgaW5oZXJpdCBhY3Rpb24gaGFuZGxlcnMgZnJvbQotICAgIHRoZSBgYWN0
aW9uc2AgaGFzaCBkZWZpbmVkIG9uIGV4dGVuZGVkIFJvdXRlIHBhcmVudCBjbGFzc2VzCi0gICAg
b3IgbWl4aW5zIHJhdGhlciB0aGFuIGp1c3QgcmVwbGFjZSB0aGUgZW50aXJlIGhhc2gsIGUuZy46
Ci0KLSAgICBgYGBqcwotICAgIEFwcC5DYW5EaXNwbGF5QmFubmVyID0gRW1iZXIuTWl4aW4uY3Jl
YXRlKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGlzcGxheUJhbm5lcjogZnVuY3Rpb24o
bXNnKSB7Ci0gICAgICAgICAgLy8gLi4uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNhbkRpc3BsYXlC
YW5uZXIsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbigp
IHsKLSAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAg
Ly8gYFdlbGNvbWVSb3V0ZWAsIHdoZW4gYWN0aXZlLCB3aWxsIGJlIGFibGUgdG8gcmVzcG9uZAot
ICAgIC8vIHRvIGJvdGggYWN0aW9ucywgc2luY2UgdGhlIGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQg
cmF0aGVyCi0gICAgLy8gdGhlbiByZXBsYWNlZCB3aGVuIGV4dGVuZGluZyBtaXhpbnMgLyBwYXJl
bnQgY2xhc3Nlcy4KLSAgICB0aGlzLnNlbmQoJ2Rpc3BsYXlCYW5uZXInKTsKLSAgICB0aGlzLnNl
bmQoJ3BsYXlNdXNpYycpOwotICAgIGBgYAotCi0gICAgV2l0aGluIGEgcm91dGUncyBhY3Rpb24g
aGFuZGxlciwgdGhlIHZhbHVlIG9mIHRoZSBgdGhpc2AgY29udGV4dAotICAgIGlzIHRoZSBSb3V0
ZSBvYmplY3Q6Ci0KLSAgICBgYGBqcwotICAgIEFwcC5Tb25nUm91dGUgPSBFbWJlci5Sb3V0ZS5l
eHRlbmQoewotICAgICAgYWN0aW9uczogewotICAgICAgICBteUFjdGlvbjogZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCJzb25nIik7Ci0gICAgICAgICAgdGhpcy50
cmFuc2l0aW9uVG8oIm90aGVyLnJvdXRlIik7Ci0gICAgICAgICAgLi4uCi0gICAgICAgIH0KLSAg
ICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2Fs
bCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KLSAgICBhY3Rpb24gaGFuZGxlciBpZiBp
dCBvdmVycmlkZXMgYSBoYW5kbGVyIGRlZmluZWQgb24gYSBwYXJlbnQKLSAgICBjbGFzcyBvciBt
aXhpbjoKLQotICAgIFRha2UgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyByb3V0ZXM6Ci0KLSAg
ICBgYGBqcwotICAgIEFwcC5EZWJ1Z1JvdXRlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKLSAgICAg
IGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsK
LSAgICAgICAgICBjb25zb2xlLmRlYnVnKCJ0cm9sb2xvIik7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICB9KTsKLQotICAgIEFwcC5Bbm5veWluZ0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRl
bmQoQXBwLkRlYnVnUm91dGUsIHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZGVidWdSb3V0
ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAvLyBhbHNvIGNhbGwgdGhlIGRl
YnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVidWdSb3V0ZQotICAgICAgICAg
IHRoaXMuX3N1cGVyKCk7Ci0KLSAgICAgICAgICAvLyBzaG93IGFkZGl0aW9uYWwgYW5ub3lhbmNl
Ci0gICAgICAgICAgd2luZG93LmFsZXJ0KC4uLik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9
KTsKLSAgICBgYGAKLQotICAgICMjIEJ1YmJsaW5nCi0KLSAgICBCeSBkZWZhdWx0LCBhbiBhY3Rp
b24gd2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVyIGRlZmluZWQKLSAgICBvbiB0aGUg
YGFjdGlvbnNgIGhhc2ggaGFuZGxlcyBpdC4gVG8gY29udGludWUgYnViYmxpbmcgdGhlIGFjdGlv
biwKLSAgICB5b3UgbXVzdCByZXR1cm4gYHRydWVgIGZyb20gdGhlIGhhbmRsZXI6Ci0KLSAgICBg
YGBqcwotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJj
ZSgiYWxidW0iLCBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yb3V0ZSgic29uZyIpOwotICAg
ICAgfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuQWxidW1Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVu
ZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxheWluZzogZnVuY3Rpb24oKSB7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9
IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rpb25zOiB7Ci0gICAgICAgIHN0YXJ0UGxh
eWluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgLy8gLi4uCi0KLSAgICAgICAgICBpZiAoYWN0
aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRSb3V0ZSkgewotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICAjIyBCdWlsdC1pbiBhY3Rpb25zCi0KLSAgICBUaGVyZSBhcmUgYSBmZXcgYnVp
bHQtaW4gYWN0aW9ucyBwZXJ0YWluaW5nIHRvIHRyYW5zaXRpb25zIHRoYXQgeW91Ci0gICAgY2Fu
IHVzZSB0byBjdXN0b21pemUgdHJhbnNpdGlvbiBiZWhhdmlvcjogYHdpbGxUcmFuc2l0aW9uYCBh
bmQKLSAgICBgZXJyb3JgLgotCi0gICAgIyMjIGB3aWxsVHJhbnNpdGlvbmAKLQotICAgIFRoZSBg
d2lsbFRyYW5zaXRpb25gIGFjdGlvbiBpcyBmaXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFueQot
ICAgIGF0dGVtcHRlZCB0cmFuc2l0aW9uIHdpdGggYSBgVHJhbnNpdGlvbmAgb2JqZWN0IGFzIHRo
ZSBzb2xlCi0gICAgYXJndW1lbnQuIFRoaXMgYWN0aW9uIGNhbiBiZSB1c2VkIGZvciBhYm9ydGlu
ZywgcmVkaXJlY3RpbmcsCi0gICAgb3IgZGVjb3JhdGluZyB0aGUgdHJhbnNpdGlvbiBmcm9tIHRo
ZSBjdXJyZW50bHkgYWN0aXZlIHJvdXRlcy4KLQotICAgIEEgZ29vZCBleGFtcGxlIGlzIHByZXZl
bnRpbmcgbmF2aWdhdGlvbiB3aGVuIGEgZm9ybSBpcwotICAgIGhhbGYtZmlsbGVkIG91dDoKLQot
ICAgIGBgYGpzCi0gICAgQXBwLkNvbnRhY3RGb3JtUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICB3aWxsVHJhbnNpdGlvbjogZnVuY3Rpb24odHJh
bnNpdGlvbikgewotICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0KCd1c2VySGFzRW50
ZXJlZERhdGEnKSkgewotICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRpc3BsYXlOYXZpZ2F0
aW9uQ29uZmlybSgpOwotICAgICAgICAgICAgdHJhbnNpdGlvbi5hYm9ydCgpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgWW91IGNhbiBh
bHNvIHJlZGlyZWN0IGVsc2V3aGVyZSBieSBjYWxsaW5nCi0gICAgYHRoaXMudHJhbnNpdGlvblRv
KCdlbHNld2hlcmUnKWAgZnJvbSB3aXRoaW4gYHdpbGxUcmFuc2l0aW9uYC4KLSAgICBOb3RlIHRo
YXQgYHdpbGxUcmFuc2l0aW9uYCB3aWxsIG5vdCBiZSBmaXJlZCBmb3IgdGhlCi0gICAgcmVkaXJl
Y3RpbmcgYHRyYW5zaXRpb25Ub2AsIHNpbmNlIGB3aWxsVHJhbnNpdGlvbmAgZG9lc24ndAotICAg
IGZpcmUgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgdHJhbnNpdGlvbiB1bmRlcndheS4gSWYgeW91
IHdhbnQKLSAgICBzdWJzZXF1ZW50IGB3aWxsVHJhbnNpdGlvbmAgYWN0aW9ucyB0byBmaXJlIGZv
ciB0aGUgcmVkaXJlY3RpbmcKLSAgICB0cmFuc2l0aW9uLCB5b3UgbXVzdCBmaXJzdCBleHBsaWNp
dGx5IGNhbGwKLSAgICBgdHJhbnNpdGlvbi5hYm9ydCgpYC4KLQotICAgICMjIyBgZXJyb3JgCi0K
LSAgICBXaGVuIGF0dGVtcHRpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIGEgcm91dGUsIGFueSBvZiB0
aGUgaG9va3MKLSAgICBtYXkgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMsIGF0IHdoaWNo
IHBvaW50IGFuIGBlcnJvcmAKLSAgICBhY3Rpb24gd2lsbCBiZSBmaXJlZCBvbiB0aGUgcGFydGlh
bGx5LWVudGVyZWQgcm91dGVzLCBhbGxvd2luZwotICAgIGZvciBwZXItcm91dGUgZXJyb3IgaGFu
ZGxpbmcgbG9naWMsIG9yIHNoYXJlZCBlcnJvciBoYW5kbGluZwotICAgIGxvZ2ljIGRlZmluZWQg
b24gYSBwYXJlbnQgcm91dGUuCi0KLSAgICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3Ig
aGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgIGZvciByZWplY3RlZCBwcm9taXNlcyBm
cm9tIHRoZSB2YXJpb3VzIGhvb2tzIG9uIHRoZSByb3V0ZSwKLSAgICBhcyB3ZWxsIGFzIGFueSB1
bmhhbmRsZWQgZXJyb3JzIGZyb20gY2hpbGQgcm91dGVzOgotCi0gICAgYGBganMKLSAgICBBcHAu
QWRtaW5Sb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBiZWZvcmVNb2RlbDogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdCgiYmFkIHRoaW5ncyEi
KTsKLSAgICAgIH0sCi0KLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgZXJyb3I6IGZ1bmN0aW9u
KGVycm9yLCB0cmFuc2l0aW9uKSB7Ci0gICAgICAgICAgLy8gQXNzdW1pbmcgd2UgZ290IGhlcmUg
ZHVlIHRvIHRoZSBlcnJvciBpbiBgYmVmb3JlTW9kZWxgLAotICAgICAgICAgIC8vIHdlIGNhbiBl
eHBlY3QgdGhhdCBlcnJvciA9PT0gImJhZCB0aGluZ3MhIiwKLSAgICAgICAgICAvLyBidXQgYSBw
cm9taXNlIG1vZGVsIHJlamVjdGluZyB3b3VsZCBhbHNvCi0gICAgICAgICAgLy8gY2FsbCB0aGlz
IGhvb2ssIGFzIHdvdWxkIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKLSAgICAgICAgICAvLyBpbiBg
YWZ0ZXJNb2RlbGAuCi0KLSAgICAgICAgICAvLyBUaGUgYGVycm9yYCBob29rIGlzIGFsc28gcHJv
dmlkZWQgdGhlIGZhaWxlZAotICAgICAgICAgIC8vIGB0cmFuc2l0aW9uYCwgd2hpY2ggY2FuIGJl
IHN0b3JlZCBhbmQgbGF0ZXIKLSAgICAgICAgICAvLyBgLnJldHJ5KClgZCBpZiBkZXNpcmVkLgot
Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2xvZ2luJyk7Ci0gICAgICAgIH0KLSAgICAg
IH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIGBlcnJvcmAgYWN0aW9ucyB0aGF0IGJ1YmJsZSB1
cCBhbGwgdGhlIHdheSB0byBgQXBwbGljYXRpb25Sb3V0ZWAKLSAgICB3aWxsIGZpcmUgYSBkZWZh
dWx0IGVycm9yIGhhbmRsZXIgdGhhdCBsb2dzIHRoZSBlcnJvci4gWW91IGNhbgotICAgIHNwZWNp
ZnkgeW91ciBvd24gZ2xvYmFsIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBieSBvdmVycmlkaW5nIHRo
ZQotICAgIGBlcnJvcmAgaGFuZGxlciBvbiBgQXBwbGljYXRpb25Sb3V0ZWA6Ci0KLSAgICBgYGBq
cwotICAgIEFwcC5BcHBsaWNhdGlvblJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAg
IGFjdGlvbnM6IHsKLSAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycm9yLCB0cmFuc2l0aW9uKSB7
Ci0gICAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCdiYW5uZXInKS5kaXNwbGF5RXJyb3IoZXJy
b3IubWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAg
IEBwcm9wZXJ0eSBhY3Rpb25zCi0gICAgQHR5cGUgSGFzaAotICAgIEBkZWZhdWx0IG51bGwKLSAg
Ki8KLSAgX2FjdGlvbnM6IHsKLSAgICBmaW5hbGl6ZVF1ZXJ5UGFyYW1DaGFuZ2U6IGZ1bmN0aW9u
KHBhcmFtcywgZmluYWxQYXJhbXMpIHsKLSAgICAgICAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAg
QGRlcHJlY2F0ZWQKLQotICAgIFBsZWFzZSB1c2UgYGFjdGlvbnNgIGluc3RlYWQuCi0gICAgQG1l
dGhvZCBldmVudHMKLSAgKi8KLSAgZXZlbnRzOiBudWxsLAotCi0gIG1lcmdlZFByb3BlcnRpZXM6
IFsnZXZlbnRzJ10sCi0KLSAgLyoqCi0gICAgVGhpcyBob29rIGlzIGV4ZWN1dGVkIHdoZW4gdGhl
IHJvdXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMgcm91dGUuIEl0IGlzCi0gICAgbm90IGV4ZWN1
dGVkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgcm91dGUgY2hhbmdlcy4KLQotICAgIEBtZXRob2Qg
ZGVhY3RpdmF0ZQotICAqLwotICBkZWFjdGl2YXRlOiBFbWJlci5LLAotCi0gIC8qKgotICAgIFRo
aXMgaG9vayBpcyBleGVjdXRlZCB3aGVuIHRoZSByb3V0ZXIgZW50ZXJzIHRoZSByb3V0ZS4gSXQg
aXMgbm90IGV4ZWN1dGVkCi0gICAgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFuZ2Vz
LgotCi0gICAgQG1ldGhvZCBhY3RpdmF0ZQotICAqLwotICBhY3RpdmF0ZTogRW1iZXIuSywKLQot
ICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhlciByb3V0ZS4gT3B0aW9uYWxseSBzdXBw
bHkgbW9kZWwocykgZm9yIHRoZQotICAgIHJvdXRlIGluIHF1ZXN0aW9uLiBJZiBtdWx0aXBsZSBt
b2RlbHMgYXJlIHN1cHBsaWVkIHRoZXkgd2lsbCBiZSBhcHBsaWVkCi0gICAgbGFzdCB0byBmaXJz
dCByZWN1cnNpdmVseSB1cCB0aGUgcmVzb3VyY2UgdHJlZSAoc2VlIE11bHRpcGxlIE1vZGVscyBF
eGFtcGxlCi0gICAgYmVsb3cpLiBUaGUgbW9kZWwocykgd2lsbCBiZSBzZXJpYWxpemVkIGludG8g
dGhlIFVSTCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICByb3V0ZSdzIGBzZXJpYWxpemVgIGhv
b2suIFNlZSBhbHNvICdyZXBsYWNlV2l0aCcuCi0KLSAgICBTaW1wbGUgVHJhbnNpdGlvbiBFeGFt
cGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7
Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOwotICAgICAgdGhpcy5yb3V0ZSgic2VjcmV0Iik7
Ci0gICAgICB0aGlzLnJvdXRlKCJmb3VyT2hGb3VyIiwgeyBwYXRoOiAiKjoifSk7Ci0gICAgfSk7
Ci0KLSAgICBBcHAuSW5kZXhSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBhY3Rp
b25zOiB7Ci0gICAgICAgIG1vdmVUb1NlY3JldDogZnVuY3Rpb24oY29udGV4dCl7Ci0gICAgICAg
ICAgaWYgKGF1dGhvcml6ZWQoKSl7Ci0gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubygnc2Vj
cmV0JywgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9u
VG8oJ2ZvdXJPaEZvdXInKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGBgYAot
Ci0gICBUcmFuc2l0aW9uIHRvIGEgbmVzdGVkIHJvdXRlCi0KLSAgIGBgYGphdmFzY3JpcHQKLSAg
IEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICB0aGlzLnJlc291cmNlKCdhcnRpY2xl
cycsIHsgcGF0aDogJy9hcnRpY2xlcycgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICAgdGhpcy5yb3V0
ZSgnbmV3Jyk7Ci0gICAgIH0pOwotICAgfSk7Ci0KLSAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIu
Um91dGUuZXh0ZW5kKHsKLSAgICAgYWN0aW9uczogewotICAgICAgIHRyYW5zaXRpb25Ub05ld0Fy
dGljbGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2FydGljbGVz
Lm5ldycpOwotICAgICAgIH0KLSAgICAgfQotICAgfSk7Ci0gICBgYGAKLQotICAgIE11bHRpcGxl
IE1vZGVscyBFeGFtcGxlCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLlJvdXRlci5tYXAo
ZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCJpbmRleCIpOwotICAgICAgdGhpcy5yZXNv
dXJjZSgnYnJlYWtmYXN0Jywge3BhdGg6JzpicmVha2Zhc3RJZCd9LCBmdW5jdGlvbigpewotICAg
ICAgICB0aGlzLnJlc291cmNlKCdjZXJlYWwnLCB7cGF0aDogJzpjZXJlYWxJZCd9KTsKLSAgICAg
IH0pOwotICAgIH0pOwotCi0gICAgQXBwLkluZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICBtb3ZlVG9DaG9jb2xhdGVDZXJlYWw6IGZ1bmN0
aW9uKCl7Ci0gICAgICAgICAgdmFyIGNlcmVhbCA9IHsgY2VyZWFsSWQ6ICJDaG9jb2xhdGVZdW1t
aW5lc3MifSwKLSAgICAgICAgICAgICAgYnJlYWtmYXN0ID0ge2JyZWFrZmFzdElkOiAiQ2VyZWFs
QW5kTWlsayJ9OwotCi0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8oJ2NlcmVhbCcsIGJyZWFr
ZmFzdCwgY2VyZWFsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgQG1ldGhv
ZCB0cmFuc2l0aW9uVG8KLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUg
cm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1
c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICovCi0gIHRyYW5z
aXRpb25UbzogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewotICAgIHZhciByb3V0ZXIgPSB0aGlz
LnJvdXRlcjsKLSAgICByZXR1cm4gcm91dGVyLnRyYW5zaXRpb25Uby5hcHBseShyb3V0ZXIsIGFy
Z3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgUGVyZm9ybSBhIHN5bmNocm9ub3VzIHRyYW5z
aXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdpdGggb3V0IGF0dGVtcHRpbmcKLSAgICB0byByZXNv
bHZlIHByb21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1cnJlbnRseSBhY3Rp
dmUKLSAgICBhc3luY2hyb25vdXMgdHJhbnNpdGlvbnMgKGkuZS4gcmVndWxhciB0cmFuc2l0aW9u
cyBjYXVzZWQgYnkKLSAgICBgdHJhbnNpdGlvblRvYCBvciBVUkwgY2hhbmdlcykuCi0KLSAgICBU
aGlzIG1ldGhvZCBpcyBoYW5keSBmb3IgcGVyZm9ybWluZyBpbnRlcm1lZGlhdGUgdHJhbnNpdGlv
bnMgb24gdGhlCi0gICAgd2F5IHRvIGEgZmluYWwgZGVzdGluYXRpb24gcm91dGUsIGFuZCBpcyBj
YWxsZWQgaW50ZXJuYWxseSBieSB0aGUKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0
aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhhbmRsZXJzLgotCi0gICAgQG1ldGhvZCBpbnRlcm1l
ZGlhdGVUcmFuc2l0aW9uVG8KLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0
aGUgcm91dGUKLSAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBi
ZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICAqLwotICBp
bnRlcm1lZGlhdGVUcmFuc2l0aW9uVG86IGZ1bmN0aW9uKCkgewotICAgIHZhciByb3V0ZXIgPSB0
aGlzLnJvdXRlcjsKLSAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJv
dXRlciwgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5v
dGhlciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4K
LSAgICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQg
b2YgYWRkaW5nIGEgbmV3IG9uZS4KLSAgICBCZXNpZGUgdGhhdCwgaXQgaXMgaWRlbnRpY2FsIHRv
IGB0cmFuc2l0aW9uVG9gIGluIGFsbCBvdGhlciByZXNwZWN0cy4gU2VlCi0gICAgJ3RyYW5zaXRp
b25UbycgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIG11bHRpcGxlIG1vZGVs
cy4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuUm91dGVyLm1h
cChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucm91dGUoImluZGV4Iik7Ci0gICAgICB0aGlzLnJv
dXRlKCJzZWNyZXQiKTsKLSAgICB9KTsKLQotICAgIEFwcC5TZWNyZXRSb3V0ZSA9IEVtYmVyLlJv
dXRlLmV4dGVuZCh7Ci0gICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYg
KCFhdXRob3JpemVkKCkpewotICAgICAgICAgIHRoaXMucmVwbGFjZVdpdGgoJ2luZGV4Jyk7Ci0g
ICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVwbGFj
ZVdpdGgKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKLSAg
ICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxl
IHRyYW5zaXRpb25pbmcKLSAgICB0byB0aGUgcm91dGUuCi0gICovCi0gIHJlcGxhY2VXaXRoOiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7Ci0gICAgcmV0dXJuIHJv
dXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoq
Ci0gICAgU2VuZHMgYW4gYWN0aW9uIHRvIHRoZSByb3V0ZXIsIHdoaWNoIHdpbGwgZGVsZWdhdGUg
aXQgdG8gdGhlIGN1cnJlbnRseQotICAgIGFjdGl2ZSByb3V0ZSBoaWVyYXJjaHkgcGVyIHRoZSBi
dWJibGluZyBydWxlcyBleHBsYWluZWQgdW5kZXIgYGFjdGlvbnNgLgotCi0gICAgRXhhbXBsZQot
Ci0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAg
ICAgdGhpcy5yb3V0ZSgiaW5kZXgiKTsKLSAgICB9KTsKLQotICAgIEFwcC5BcHBsaWNhdGlvblJv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgdHJh
Y2s6IGZ1bmN0aW9uKGFyZykgewotICAgICAgICAgIGNvbnNvbGUubG9nKGFyZywgJ3dhcyBjbGlj
a2VkJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEFwcC5JbmRleFJvdXRl
ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgdHJhY2tJ
ZkRlYnVnOiBmdW5jdGlvbihhcmcpIHsKLSAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAg
ICAgIHRoaXMuc2VuZCgndHJhY2snLCBhcmcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBzZW5kCi0gICAgQHBhcmFtIHtT
dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byB0cmlnZ2VyCi0gICAgQHBhcmFt
IHsuLi4qfSBhcmdzCi0gICovCi0gIHNlbmQ6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlz
LnJvdXRlci5zZW5kLmFwcGx5KHRoaXMucm91dGVyLCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8q
KgotICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRlci5qcwotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIHNldHVwCi0gICovCi0gIHNldHVwOiBmdW5jdGlvbihjb250
ZXh0LCBxdWVyeVBhcmFtcykgewotICAgIHZhciBjb250cm9sbGVyTmFtZSA9IHRoaXMuY29udHJv
bGxlck5hbWUgfHwgdGhpcy5yb3V0ZU5hbWUsCi0gICAgICAgIGNvbnRyb2xsZXIgPSB0aGlzLmNv
bnRyb2xsZXJGb3IoY29udHJvbGxlck5hbWUsIHRydWUpOwotICAgIGlmICghY29udHJvbGxlcikg
ewotICAgICAgY29udHJvbGxlciA9ICB0aGlzLmdlbmVyYXRlQ29udHJvbGxlcihjb250cm9sbGVy
TmFtZSwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gQXNzaWduIHRoZSByb3V0ZSdzIGNvbnRy
b2xsZXIgc28gdGhhdCBpdCBjYW4gbW9yZSBlYXNpbHkgYmUKLSAgICAvLyByZWZlcmVuY2VkIGlu
IGFjdGlvbiBoYW5kbGVycwotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0KLSAg
ICB2YXIgYXJncyA9IFtjb250cm9sbGVyLCBjb250ZXh0XTsKLQotICAgIAotICAgIGlmICh0aGlz
LnNldHVwQ29udHJvbGxlcnMpIHsKLSAgICAgIEVtYmVyLmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUu
c2V0dXBDb250cm9sbGVycyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnNl
dHVwQ29udHJvbGxlcihjb250cm9sbGVyLCBtb2RlbCkgaW5zdGVhZC4iKTsKLSAgICAgIHRoaXMu
c2V0dXBDb250cm9sbGVycyhjb250cm9sbGVyLCBjb250ZXh0KTsKLSAgICB9IGVsc2UgewotICAg
ICAgdGhpcy5zZXR1cENvbnRyb2xsZXIuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotCi0gICAg
aWYgKHRoaXMucmVuZGVyVGVtcGxhdGVzKSB7Ci0gICAgICBFbWJlci5kZXByZWNhdGUoIkVtYmVy
LlJvdXRlLnJlbmRlclRlbXBsYXRlcyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJv
dXRlLnJlbmRlclRlbXBsYXRlKGNvbnRyb2xsZXIsIG1vZGVsKSBpbnN0ZWFkLiIpOwotICAgICAg
dGhpcy5yZW5kZXJUZW1wbGF0ZXMoY29udGV4dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMu
cmVuZGVyVGVtcGxhdGUuYXBwbHkodGhpcywgYXJncyk7Ci0gICAgfQotICB9LAotCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIGltcGxlbWVudCB0byBvcHRpb25hbGx5IHJlZGlyZWN0IHRvIGFu
b3RoZXIgcm91dGUuCi0KLSAgICBJZiB5b3UgY2FsbCBgdGhpcy50cmFuc2l0aW9uVG9gIGZyb20g
aW5zaWRlIG9mIHRoaXMgaG9vaywgdGhpcyByb3V0ZQotICAgIHdpbGwgbm90IGJlIGVudGVyZWQg
aW4gZmF2b3Igb2YgdGhlIG90aGVyIGhvb2suCi0KLSAgICBOb3RlIHRoYXQgdGhpcyBob29rIGlz
IGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgotICAgIGBhZnRlck1vZGVs
YCwgc28gaWYgeW91IG92ZXJyaWRlIGBhZnRlck1vZGVsYCwgeW91IG11c3QgZWl0aGVyCi0gICAg
ZXhwbGljaXRseSBjYWxsIGByZWRpcmVjdGAgb3IganVzdCBwdXQgeW91ciByZWRpcmVjdGluZwot
ICAgIGB0aGlzLnRyYW5zaXRpb25UbygpYCBjYWxsIHdpdGhpbiBgYWZ0ZXJNb2RlbGAuCi0KLSAg
ICBAbWV0aG9kIHJlZGlyZWN0Ci0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSBtb2RlbCBm
b3IgdGhpcyByb3V0ZQotICAqLwotICByZWRpcmVjdDogRW1iZXIuSywKLQotICAvKioKLSAgICBU
aGlzIGhvb2sgaXMgdGhlIGZpcnN0IG9mIHRoZSByb3V0ZSBlbnRyeSB2YWxpZGF0aW9uIGhvb2tz
Ci0gICAgY2FsbGVkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHRyYW5zaXRpb24gaW50byBh
IHJvdXRlCi0gICAgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4gSXQgaXMgY2FsbGVkIGJlZm9yZSBg
bW9kZWxgIGFuZAotICAgIGBhZnRlck1vZGVsYCwgYW5kIGlzIGFwcHJvcHJpYXRlIGZvciBjYXNl
cyB3aGVuOgotCi0gICAgMSkgQSBkZWNpc2lvbiBjYW4gYmUgbWFkZSB0byByZWRpcmVjdCBlbHNl
d2hlcmUgd2l0aG91dAotICAgICAgIG5lZWRpbmcgdG8gcmVzb2x2ZSB0aGUgbW9kZWwgZmlyc3Qu
Ci0gICAgMikgQW55IGFzeW5jIG9wZXJhdGlvbnMgbmVlZCB0byBvY2N1ciBmaXJzdCBiZWZvcmUg
dGhlCi0gICAgICAgbW9kZWwgaXMgYXR0ZW1wdGVkIHRvIGJlIHJlc29sdmVkLgotCi0gICAgVGhp
cyBob29rIGlzIHByb3ZpZGVkIHRoZSBjdXJyZW50IGB0cmFuc2l0aW9uYCBhdHRlbXB0Ci0gICAg
YXMgYSBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGAuYWJvcnQoKWAgdGhlIHRyYW5z
aXRpb24sCi0gICAgc2F2ZSBpdCBmb3IgYSBsYXRlciBgLnJldHJ5KClgLCBvciByZXRyaWV2ZSB2
YWx1ZXMgc2V0Ci0gICAgb24gaXQgZnJvbSBhIHByZXZpb3VzIGhvb2suIFlvdSBjYW4gYWxzbyBq
dXN0IGNhbGwKLSAgICBgdGhpcy50cmFuc2l0aW9uVG9gIHRvIGFub3RoZXIgcm91dGUgdG8gaW1w
bGljaXRseQotICAgIGFib3J0IHRoZSBgdHJhbnNpdGlvbmAuCi0KLSAgICBZb3UgY2FuIHJldHVy
biBhIHByb21pc2UgZnJvbSB0aGlzIGhvb2sgdG8gcGF1c2UgdGhlCi0gICAgdHJhbnNpdGlvbiB1
bnRpbCB0aGUgcHJvbWlzZSByZXNvbHZlcyAob3IgcmVqZWN0cykuIFRoaXMgY291bGQKLSAgICBi
ZSB1c2VmdWwsIGZvciBpbnN0YW5jZSwgZm9yIHJldHJpZXZpbmcgYXN5bmMgY29kZSBmcm9tCi0g
ICAgdGhlIHNlcnZlciB0aGF0IGlzIHJlcXVpcmVkIHRvIGVudGVyIGEgcm91dGUuCi0KLSAgICBg
YGBqcwotICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAgICAgYmVm
b3JlTW9kZWw6IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHsKLSAgICAgICAgaWYgKCFBcHAuUG9zdCkg
ewotICAgICAgICAgIHJldHVybiBFbWJlci4kLmdldFNjcmlwdCgnL21vZGVscy9wb3N0LmpzJyk7
Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIElmIGBBcHAuUG9z
dGAgZG9lc24ndCBleGlzdCBpbiB0aGUgYWJvdmUgZXhhbXBsZSwKLSAgICBgYmVmb3JlTW9kZWxg
IHdpbGwgdXNlIGpRdWVyeSdzIGBnZXRTY3JpcHRgLCB3aGljaAotICAgIHJldHVybnMgYSBwcm9t
aXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNlcnZlciBoYXMKLSAgICBzdWNjZXNzZnVsbHkg
cmV0cmlldmVkIGFuZCBleGVjdXRlZCB0aGUgY29kZSBmcm9tIHRoZQotICAgIHNlcnZlci4gTm90
ZSB0aGF0IGlmIGFuIGVycm9yIHdlcmUgdG8gb2NjdXIsIGl0IHdvdWxkCi0gICAgYmUgcGFzc2Vk
IHRvIHRoZSBgZXJyb3JgIGhvb2sgb24gYEVtYmVyLlJvdXRlYCwgYnV0Ci0gICAgaXQncyBhbHNv
IHBvc3NpYmxlIHRvIGhhbmRsZSBlcnJvcnMgc3BlY2lmaWMgdG8KLSAgICBgYmVmb3JlTW9kZWxg
IHJpZ2h0IGZyb20gd2l0aGluIHRoZSBob29rICh0byBkaXN0aW5ndWlzaAotICAgIGZyb20gdGhl
IHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBvZiB0aGUgYGVycm9yYAotICAgIGhvb2sp
OgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK
LSAgICAgIGJlZm9yZU1vZGVsOiBmdW5jdGlvbih0cmFuc2l0aW9uKSB7Ci0gICAgICAgIGlmICgh
QXBwLlBvc3QpIHsKLSAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgICAgICAgcmV0dXJu
IEVtYmVyLiQuZ2V0U2NyaXB0KCdwb3N0LmpzJykudGhlbihudWxsLCBmdW5jdGlvbihlKSB7Ci0g
ICAgICAgICAgICBzZWxmLnRyYW5zaXRpb25UbygnaGVscCcpOwotCi0gICAgICAgICAgICAvLyBO
b3RlIHRoYXQgdGhlIGFib3ZlIHRyYW5zaXRpb25UbyB3aWxsIGltcGxpY2l0bHkKLSAgICAgICAg
ICAgIC8vIGhhbHQgdGhlIHRyYW5zaXRpb24uIElmIHlvdSB3ZXJlIHRvIHJldHVybgotICAgICAg
ICAgICAgLy8gbm90aGluZyBmcm9tIHRoaXMgcHJvbWlzZSByZWplY3QgaGFuZGxlciwKLSAgICAg
ICAgICAgIC8vIGFjY29yZGluZyB0byBwcm9taXNlIHNlbWFudGljcywgdGhhdCB3b3VsZAotICAg
ICAgICAgICAgLy8gY29udmVydCB0aGUgcmVqZWN0IGludG8gYSByZXNvbHZlIGFuZCB0aGUKLSAg
ICAgICAgICAgIC8vIHRyYW5zaXRpb24gd291bGQgY29udGludWUuIFRvIHByb3BhZ2F0ZSB0aGUK
LSAgICAgICAgICAgIC8vIGVycm9yIHNvIHRoYXQgaXQnZCBiZSBoYW5kbGVkIGJ5IHRoZSBgZXJy
b3JgCi0gICAgICAgICAgICAvLyBob29rLCB5b3Ugd291bGQgaGF2ZSB0byBlaXRoZXIKLSAgICAg
ICAgICAgIHJldHVybiBFbWJlci5SU1ZQLnJlamVjdChlKTsKLSAgICAgICAgICAgIC8vIG9yCi0g
ICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0g
ICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGJlZm9yZU1vZGVsCi0gICAgQHBhcmFtIHtU
cmFuc2l0aW9ufSB0cmFuc2l0aW9uCi0gICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5UGFyYW1zIHRo
ZSBhY3RpdmUgcXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCi0gICAgQHJldHVybiB7UHJvbWlz
ZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhpcyBob29rIGlzCi0gICAgICBhIHByb21p
c2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAg
IHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1wcm9taXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAot
ICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4KLSAgKi8KLSAgYmVmb3JlTW9kZWw6IEVtYmVyLkss
Ci0KLSAgLyoqCi0gICAgVGhpcyBob29rIGlzIGNhbGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9k
ZWwgaGFzIHJlc29sdmVkLgotICAgIEl0IGZvbGxvd3MgaWRlbnRpY2FsIGFzeW5jL3Byb21pc2Ug
c2VtYW50aWNzIHRvIGBiZWZvcmVNb2RlbGAKLSAgICBidXQgaXMgcHJvdmlkZWQgdGhlIHJvdXRl
J3MgcmVzb2x2ZWQgbW9kZWwgaW4gYWRkaXRpb24gdG8KLSAgICB0aGUgYHRyYW5zaXRpb25gLCBh
bmQgaXMgdGhlcmVmb3JlIHN1aXRlZCB0byBwZXJmb3JtaW5nCi0gICAgbG9naWMgdGhhdCBjYW4g
b25seSB0YWtlIHBsYWNlIGFmdGVyIHRoZSBtb2RlbCBoYXMgYWxyZWFkeQotICAgIHJlc29sdmVk
LgotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7
Ci0gICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbihwb3N0cywgdHJhbnNpdGlvbikgewotICAgICAg
ICBpZiAocG9zdHMubGVuZ3RoID09PSAxKSB7Ci0gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8o
J3Bvc3Quc2hvdycsIHBvc3RzWzBdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAg
IGBgYAotCi0gICAgUmVmZXIgdG8gZG9jdW1lbnRhdGlvbiBmb3IgYGJlZm9yZU1vZGVsYCBmb3Ig
YSBkZXNjcmlwdGlvbgotICAgIG9mIHRyYW5zaXRpb24tcGF1c2luZyBzZW1hbnRpY3Mgd2hlbiBh
IHByb21pc2UgaXMgcmV0dXJuZWQKLSAgICBmcm9tIHRoaXMgaG9vay4KLQotICAgIEBtZXRob2Qg
YWZ0ZXJNb2RlbAotICAgIEBwYXJhbSB7T2JqZWN0fSByZXNvbHZlZE1vZGVsIHRoZSB2YWx1ZSBy
ZXR1cm5lZCBmcm9tIGBtb2RlbGAsCi0gICAgICBvciBpdHMgcmVzb2x2ZWQgdmFsdWUgaWYgaXQg
d2FzIGEgcHJvbWlzZQotICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBw
YXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUgYWN0aXZlIHF1ZXJ5IHBhcmFtcyBmb3IgdGhp
cyBoYW5kbGVyCi0gICAgQHJldHVybiB7UHJvbWlzZX0gaWYgdGhlIHZhbHVlIHJldHVybmVkIGZy
b20gdGhpcyBob29rIGlzCi0gICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdpbGwgcGF1
c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KLSAgICAgIHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1w
cm9taXNlIHJldHVybiB2YWx1ZXMgYXJlIG5vdAotICAgICAgdXRpbGl6ZWQgaW4gYW55IHdheS4K
LSAgICovCi0gIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKHJlc29sdmVkTW9kZWwsIHRyYW5zaXRpb24s
IHF1ZXJ5UGFyYW1zKSB7Ci0gICAgdGhpcy5yZWRpcmVjdChyZXNvbHZlZE1vZGVsLCB0cmFuc2l0
aW9uKTsKLSAgfSwKLQotCi0gIC8qKgotICAgIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGNo
YW5nZWQgYnkgcm91dGVyLmpzLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGNvbnRleHRE
aWRDaGFuZ2UKLSAgKi8KLSAgY29udGV4dERpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgdGhp
cy5jdXJyZW50TW9kZWwgPSB0aGlzLmNvbnRleHQ7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQSBob29r
IHlvdSBjYW4gaW1wbGVtZW50IHRvIGNvbnZlcnQgdGhlIFVSTCBpbnRvIHRoZSBtb2RlbCBmb3IK
LSAgICB0aGlzIHJvdXRlLgotCi0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlv
bigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9p
ZCd9KTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoZSBtb2RlbCBmb3IgdGhlIGBwb3N0YCBy
b3V0ZSBpcyBgQXBwLlBvc3QuZmluZChwYXJhbXMucG9zdF9pZClgLgotCi0gICAgQnkgZGVmYXVs
dCwgaWYgeW91ciByb3V0ZSBoYXMgYSBkeW5hbWljIHNlZ21lbnQgZW5kaW5nIGluIGBfaWRgOgot
Ci0gICAgKiBUaGUgbW9kZWwgY2xhc3MgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWdtZW50IChg
cG9zdF9pZGAncwotICAgICAgY2xhc3MgaXMgYEFwcC5Qb3N0YCkKLSAgICAqIFRoZSBmaW5kIG1l
dGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVsIGNsYXNzIHdpdGggdGhlIHZhbHVlIG9mCi0gICAg
ICB0aGUgZHluYW1pYyBzZWdtZW50LgotCi0gICAgTm90ZSB0aGF0IGZvciByb3V0ZXMgd2l0aCBk
eW5hbWljIHNlZ21lbnRzLCB0aGlzIGhvb2sgaXMgb25seQotICAgIGV4ZWN1dGVkIHdoZW4gZW50
ZXJlZCB2aWEgdGhlIFVSTC4gSWYgdGhlIHJvdXRlIGlzIGVudGVyZWQKLSAgICB0aHJvdWdoIGEg
dHJhbnNpdGlvbiAoZS5nLiB3aGVuIHVzaW5nIHRoZSBgbGluay10b2AgSGFuZGxlYmFycwotICAg
IGhlbHBlciksIHRoZW4gYSBtb2RlbCBjb250ZXh0IGlzIGFscmVhZHkgcHJvdmlkZWQgYW5kIHRo
aXMgaG9vawotICAgIGlzIG5vdCBjYWxsZWQuIFJvdXRlcyB3aXRob3V0IGR5bmFtaWMgc2VnbWVu
dHMgd2lsbCBhbHdheXMKLSAgICBleGVjdXRlIHRoZSBtb2RlbCBob29rLgotCi0gICAgVGhpcyBo
b29rIGZvbGxvd3MgdGhlIGFzeW5jaHJvbm91cy9wcm9taXNlIHNlbWFudGljcwotICAgIGRlc2Ny
aWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYGJlZm9yZU1vZGVsYC4gSW4gcGFydGljdWxh
ciwKLSAgICBpZiBhIHByb21pc2UgcmV0dXJuZWQgZnJvbSBgbW9kZWxgIGZhaWxzLCB0aGUgZXJy
b3Igd2lsbCBiZQotICAgIGhhbmRsZWQgYnkgdGhlIGBlcnJvcmAgaG9vayBvbiBgRW1iZXIuUm91
dGVgLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBganMKLSAgICBBcHAuUG9zdFJvdXRlID0gRW1i
ZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIG1vZGVsOiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAg
ICAgcmV0dXJuIEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3RfaWQpOwotICAgICAgfQotICAgIH0p
OwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBtb2RlbAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJh
bXMgdGhlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIFVSTAotICAgIEBwYXJhbSB7VHJh
bnNpdGlvbn0gdHJhbnNpdGlvbgotICAgIEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyB0aGUg
cXVlcnkgcGFyYW1zIGZvciB0aGlzIHJvdXRlCi0gICAgQHJldHVybiB7T2JqZWN0fFByb21pc2V9
IHRoZSBtb2RlbCBmb3IgdGhpcyByb3V0ZS4gSWYKLSAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5l
ZCwgdGhlIHRyYW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAotICAgICAgdGhlIHByb21pc2UgcmVz
b2x2ZXMsIGFuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgb2YgdGhlIHByb21pc2UKLSAgICAgIHdpbGwg
YmUgdXNlZCBhcyB0aGUgbW9kZWwgZm9yIHRoaXMgcm91dGUuCi0gICovCi0gIG1vZGVsOiBmdW5j
dGlvbihwYXJhbXMsIHRyYW5zaXRpb24pIHsKLSAgICB2YXIgbWF0Y2gsIG5hbWUsIHNhd1BhcmFt
cywgdmFsdWU7Ci0KLSAgICBmb3IgKHZhciBwcm9wIGluIHBhcmFtcykgewotICAgICAgaWYgKG1h
dGNoID0gcHJvcC5tYXRjaCgvXiguKilfaWQkLykpIHsKLSAgICAgICAgbmFtZSA9IG1hdGNoWzFd
OwotICAgICAgICB2YWx1ZSA9IHBhcmFtc1twcm9wXTsKLSAgICAgIH0KLSAgICAgIHNhd1BhcmFt
cyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFuYW1lICYmIHNhd1BhcmFtcykgeyByZXR1cm4g
cGFyYW1zOyB9Ci0gICAgZWxzZSBpZiAoIW5hbWUpIHsgcmV0dXJuOyB9Ci0KLSAgICByZXR1cm4g
dGhpcy5maW5kTW9kZWwobmFtZSwgdmFsdWUpOwotICB9LAotCi0gIC8qKgotCi0gICAgQG1ldGhv
ZCBmaW5kTW9kZWwKLSAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbW9kZWwgdHlwZQotICAg
IEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFsdWUgcGFzc2VkIHRvIGZpbmQKLSAgKi8KLSAg
ZmluZE1vZGVsOiBmdW5jdGlvbigpewotICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUn
KTsKLSAgICByZXR1cm4gc3RvcmUuZmluZC5hcHBseShzdG9yZSwgYXJndW1lbnRzKTsKLSAgfSwK
LQotICAvKioKLSAgICBTdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyBhIGhvb2sgZm9yIGRhdGEgcGVy
c2lzdGVuY2UgbGlicmFyaWVzIHRvIGluamVjdCB0aGVtc2VsdmVzLgotCi0gICAgQnkgZGVmYXVs
dCwgdGhpcyBzdG9yZSBwcm9wZXJ0eSBwcm92aWRlcyB0aGUgZXhhY3Qgc2FtZSBmdW5jdGlvbmFs
aXR5IHByZXZpb3VzbHkKLSAgICBpbiB0aGUgbW9kZWwgaG9vay4KLQotICAgIEN1cnJlbnRseSwg
dGhlIHJlcXVpcmVkIGludGVyZmFjZSBpczoKLQotICAgIGBzdG9yZS5maW5kKG1vZGVsTmFtZSwg
ZmluZEFyZ3VtZW50cylgCi0KLSAgICBAbWV0aG9kIHN0b3JlCi0gICAgQHBhcmFtIHtPYmplY3R9
IHN0b3JlCi0gICovCi0gIHN0b3JlOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpewotICAgIHZh
ciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKLSAgICB2YXIgcm91dGVOYW1lID0gdGhpcy5y
b3V0ZU5hbWU7Ci0gICAgdmFyIG5hbWVzcGFjZSA9IGdldCh0aGlzLCAncm91dGVyLm5hbWVzcGFj
ZScpOwotCi0gICAgcmV0dXJuIHsKLSAgICAgIGZpbmQ6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7
Ci0gICAgICAgIHZhciBtb2RlbENsYXNzID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVs
OicgKyBuYW1lKTsKLQotICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB1c2VkIHRoZSBkeW5hbWlj
IHNlZ21lbnQgIiArIG5hbWUgKyAiX2lkIGluIHlvdXIgcm91dGUgIiArCi0gICAgICAgICAgICAg
ICAgICAgICByb3V0ZU5hbWUgKyAiLCBidXQgIiArIG5hbWVzcGFjZSArICIuIiArIGNsYXNzaWZ5
KG5hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICIgZGlkIG5vdCBleGlzdCBhbmQgeW91IGRp
ZCBub3Qgb3ZlcnJpZGUgeW91ciByb3V0ZSdzIGBtb2RlbGAgIiArCi0gICAgICAgICAgICAgICAg
ICAgICAiaG9vay4iLCBtb2RlbENsYXNzKTsKLQotICAgICAgICByZXR1cm4gbW9kZWxDbGFzcy5m
aW5kKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9OwotICB9KSwKLQotICAvKioKLSAgICBBIGhvb2sg
eW91IGNhbiBpbXBsZW1lbnQgdG8gY29udmVydCB0aGUgcm91dGUncyBtb2RlbCBpbnRvIHBhcmFt
ZXRlcnMKLSAgICBmb3IgdGhlIFVSTC4KLQotICAgIGBgYGpzCi0gICAgQXBwLlJvdXRlci5tYXAo
ZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJlc291cmNlKCdwb3N0Jywge3BhdGg6ICcvcG9zdHMv
OnBvc3RfaWQnfSk7Ci0gICAgfSk7Ci0KLSAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91dGUu
ZXh0ZW5kKHsKLSAgICAgIG1vZGVsOiBmdW5jdGlvbihwYXJhbXMpIHsKLSAgICAgICAgLy8gdGhl
IHNlcnZlciByZXR1cm5zIGB7IGlkOiAxMiB9YAotICAgICAgICByZXR1cm4galF1ZXJ5LmdldEpT
T04oIi9wb3N0cy8iICsgcGFyYW1zLnBvc3RfaWQpOwotICAgICAgfSwKLQotICAgICAgc2VyaWFs
aXplOiBmdW5jdGlvbihtb2RlbCkgewotICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSB0aGUgVVJM
IGAvcG9zdHMvMTJgCi0gICAgICAgIHJldHVybiB7IHBvc3RfaWQ6IG1vZGVsLmlkIH07Ci0gICAg
ICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgZGVmYXVsdCBgc2VyaWFsaXplYCBtZXRo
b2Qgd2lsbCBpbnNlcnQgdGhlIG1vZGVsJ3MgYGlkYCBpbnRvIHRoZQotICAgIHJvdXRlJ3MgZHlu
YW1pYyBzZWdtZW50IChpbiB0aGlzIGNhc2UsIGA6cG9zdF9pZGApIGlmIHRoZSBzZWdtZW50IGNv
bnRhaW5zICdfaWQnLgotICAgIElmIHRoZSByb3V0ZSBoYXMgbXVsdGlwbGUgZHluYW1pYyBzZWdt
ZW50cyBvciBkb2VzIG5vdCBjb250YWluICdfaWQnLCBgc2VyaWFsaXplYAotICAgIHdpbGwgcmV0
dXJuIGBFbWJlci5nZXRQcm9wZXJ0aWVzKG1vZGVsLCBwYXJhbXMpYAotCi0gICAgVGhpcyBtZXRo
b2QgaXMgY2FsbGVkIHdoZW4gYHRyYW5zaXRpb25Ub2AgaXMgY2FsbGVkIHdpdGggYSBjb250ZXh0
Ci0gICAgaW4gb3JkZXIgdG8gcG9wdWxhdGUgdGhlIFVSTC4KLQotICAgIEBtZXRob2Qgc2VyaWFs
aXplCi0gICAgQHBhcmFtIHtPYmplY3R9IG1vZGVsIHRoZSByb3V0ZSdzIG1vZGVsCi0gICAgQHBh
cmFtIHtBcnJheX0gcGFyYW1zIGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1
cnJlbnQKLSAgICAgIHJvdXRlIChpbiB0aGUgZXhhbXBsZSwgYFsncG9zdF9pZCddYC4KLSAgICBA
cmV0dXJuIHtPYmplY3R9IHRoZSBzZXJpYWxpemVkIHBhcmFtZXRlcnMKLSAgKi8KLSAgc2VyaWFs
aXplOiBmdW5jdGlvbihtb2RlbCwgcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmFtcy5sZW5ndGggPCAx
KSB7IHJldHVybjsgfQotICAgIGlmICghbW9kZWwpIHsgcmV0dXJuOyB9Ci0KLSAgICB2YXIgbmFt
ZSA9IHBhcmFtc1swXSwgb2JqZWN0ID0ge307Ci0KLSAgICBpZiAoL19pZCQvLnRlc3QobmFtZSkg
JiYgcGFyYW1zLmxlbmd0aCA9PT0gMSkgewotICAgICAgb2JqZWN0W25hbWVdID0gZ2V0KG1vZGVs
LCAiaWQiKTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqZWN0ID0gZ2V0UHJvcGVydGllcyhtb2Rl
bCwgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb2JqZWN0OwotICB9LAotCi0gIC8qKgot
ICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byBzZXR1cCB0aGUgY29udHJvbGxlciBmb3IgdGhlIGN1
cnJlbnQgcm91dGUuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgY29udHJv
bGxlciBmb3IgdGhlIGN1cnJlbnQgcm91dGUgYW5kIHRoZQotICAgIG1vZGVsIHN1cHBsaWVkIGJ5
IHRoZSBgbW9kZWxgIGhvb2suCi0KLSAgICBCeSBkZWZhdWx0LCB0aGUgYHNldHVwQ29udHJvbGxl
cmAgaG9vayBzZXRzIHRoZSBgY29udGVudGAgcHJvcGVydHkgb2YKLSAgICB0aGUgY29udHJvbGxl
ciB0byB0aGUgYG1vZGVsYC4KLQotICAgIFRoaXMgbWVhbnMgdGhhdCB5b3VyIHRlbXBsYXRlIHdp
bGwgZ2V0IGEgcHJveHkgZm9yIHRoZSBtb2RlbCBhcyBpdHMKLSAgICBjb250ZXh0LCBhbmQgeW91
IGNhbiBhY3QgYXMgdGhvdWdoIHRoZSBtb2RlbCBpdHNlbGYgd2FzIHRoZSBjb250ZXh0LgotCi0g
ICAgVGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2lsbCBiZSBvbmUgcmVzb2x2ZWQgYmFzZWQgb24g
dGhlIG5hbWUKLSAgICBvZiB0aGlzIHJvdXRlLgotCi0gICAgSWYgbm8gZXhwbGljaXQgY29udHJv
bGxlciBpcyBkZWZpbmVkLCBFbWJlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCi0gICAgYW4g
YXBwcm9wcmlhdGUgY29udHJvbGxlciBmb3IgdGhlIG1vZGVsLgotCi0gICAgKiBpZiB0aGUgbW9k
ZWwgaXMgYW4gYEVtYmVyLkFycmF5YCAoaW5jbHVkaW5nIHJlY29yZCBhcnJheXMgZnJvbSBFbWJl
cgotICAgICAgRGF0YSksIHRoZSBjb250cm9sbGVyIGlzIGFuIGBFbWJlci5BcnJheUNvbnRyb2xs
ZXJgLgotICAgICogb3RoZXJ3aXNlLCB0aGUgY29udHJvbGxlciBpcyBhbiBgRW1iZXIuT2JqZWN0
Q29udHJvbGxlcmAuCi0KLSAgICBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgcm91dGVyOgot
Ci0gICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMu
cmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKLSAgICB9KTsKLSAg
ICBgYGAKLQotICAgIEZvciB0aGUgYHBvc3RgIHJvdXRlLCBhIGNvbnRyb2xsZXIgbmFtZWQgYEFw
cC5Qb3N0Q29udHJvbGxlcmAgd291bGQKLSAgICBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuIElm
IGl0IGlzIG5vdCBkZWZpbmVkLCBhbiBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAKLSAgICBpbnN0
YW5jZSB3b3VsZCBiZSB1c2VkLgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBganMKLSAgICBBcHAu
UG9zdFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHNldHVwQ29udHJvbGxlcjog
ZnVuY3Rpb24oY29udHJvbGxlciwgbW9kZWwpIHsKLSAgICAgICAgY29udHJvbGxlci5zZXQoJ21v
ZGVsJywgbW9kZWwpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBz
ZXR1cENvbnRyb2xsZXIKLSAgICBAcGFyYW0ge0NvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgaW5zdGFu
Y2UKLSAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwKLSAgKi8KLSAgc2V0dXBDb250cm9sbGVyOiBm
dW5jdGlvbihjb250cm9sbGVyLCBjb250ZXh0KSB7Ci0gICAgaWYgKGNvbnRyb2xsZXIgJiYgKGNv
bnRleHQgIT09IHVuZGVmaW5lZCkpIHsKLSAgICAgIHNldChjb250cm9sbGVyLCAnbW9kZWwnLCBj
b250ZXh0KTsKLSAgICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY29udHJvbGxl
ciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIG9yIG5hbWUuCi0KLSAgICBUaGUgY29udHJvbGxlciBp
bnN0YW5jZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQsIGVpdGhlciB0aHJvdWdoIGVu
dGVyaW5nIHRoZQotICAgIGFzc29jaWF0ZWQgcm91dGUgb3IgdXNpbmcgYGdlbmVyYXRlQ29udHJv
bGxlcmAuCi0KLSAgICBgYGBqcwotICAgIEFwcC5Qb3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRl
bmQoewotICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7
Ci0gICAgICAgIHRoaXMuX3N1cGVyKGNvbnRyb2xsZXIsIHBvc3QpOwotICAgICAgICB0aGlzLmNv
bnRyb2xsZXJGb3IoJ3Bvc3RzJykuc2V0KCdjdXJyZW50UG9zdCcsIHBvc3QpOwotICAgICAgfQot
ICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBjb250cm9sbGVyRm9yCi0gICAgQHBhcmFt
IHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIG9yIGNvbnRyb2xsZXIKLSAgICBA
cmV0dXJuIHtFbWJlci5Db250cm9sbGVyfQotICAqLwotICBjb250cm9sbGVyRm9yOiBmdW5jdGlv
bihuYW1lLCBfc2tpcEFzc2VydCkgewotICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5l
ciwKLSAgICAgICAgcm91dGUgPSBjb250YWluZXIubG9va3VwKCdyb3V0ZTonK25hbWUpLAotICAg
ICAgICBjb250cm9sbGVyOwotCi0gICAgaWYgKHJvdXRlICYmIHJvdXRlLmNvbnRyb2xsZXJOYW1l
KSB7Ci0gICAgICBuYW1lID0gcm91dGUuY29udHJvbGxlck5hbWU7Ci0gICAgfQotCi0gICAgY29u
dHJvbGxlciA9IGNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5hbWUpOwotCi0gICAg
Ly8gTk9URTogV2UncmUgc3BlY2lmaWNhbGx5IGNoZWNraW5nIHRoYXQgc2tpcEFzc2VydCBpcyB0
cnVlLCBiZWNhdXNlIGFjY29yZGluZwotICAgIC8vICAgdG8gdGhlIG9sZCBBUEkgdGhlIHNlY29u
ZCBwYXJhbWV0ZXIgd2FzIG1vZGVsLiBXZSBkbyBub3Qgd2FudCBwZW9wbGUgd2hvCi0gICAgLy8g
ICBwYXNzZWQgYSBtb2RlbCB0byBza2lwIHRoZSBhc3NlcnRpb24uCi0gICAgRW1iZXIuYXNzZXJ0
KCJUaGUgY29udHJvbGxlciBuYW1lZCAnIituYW1lKyInIGNvdWxkIG5vdCBiZSBmb3VuZC4gTWFr
ZSBzdXJlICIgKwotICAgICAgICAgICAgICAgICAidGhhdCB0aGlzIHJvdXRlIGV4aXN0cyBhbmQg
aGFzIGFscmVhZHkgYmVlbiBlbnRlcmVkIGF0IGxlYXN0ICIgKwotICAgICAgICAgICAgICAgICAi
b25jZS4gSWYgeW91IGFyZSBhY2Nlc3NpbmcgYSBjb250cm9sbGVyIG5vdCBhc3NvY2lhdGVkIHdp
dGggYSAiICsKLSAgICAgICAgICAgICAgICAgInJvdXRlLCBtYWtlIHN1cmUgdGhlIGNvbnRyb2xs
ZXIgY2xhc3MgaXMgZXhwbGljaXRseSBkZWZpbmVkLiIsCi0gICAgICAgICAgICAgICAgIGNvbnRy
b2xsZXIgfHwgX3NraXBBc3NlcnQgPT09IHRydWUpOwotCi0gICAgcmV0dXJuIGNvbnRyb2xsZXI7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2VuZXJhdGVzIGEgY29udHJvbGxlciBmb3IgYSByb3V0ZS4K
LQotICAgIElmIHRoZSBvcHRpb25hbCBtb2RlbCBpcyBwYXNzZWQgdGhlbiB0aGUgY29udHJvbGxl
ciB0eXBlIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKLSAgICBlLmcuLCBhbiBBcnJheUNv
bnRyb2xsZXIgZm9yIGFycmF5cy4KLQotICAgIEV4YW1wbGUKLQotICAgIGBgYGpzCi0gICAgQXBw
LlBvc3RSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgICBzZXR1cENvbnRyb2xsZXI6
IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIHBvc3QpIHsKLSAgICAgICAgdGhpcy5fc3VwZXIoY29udHJv
bGxlciwgcG9zdCk7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVDb250cm9sbGVyKCdwb3N0cycsIHBv
c3QpOwotICAgICAgfQotICAgIH0pOwotICAgIGBgYAotCi0gICAgQG1ldGhvZCBnZW5lcmF0ZUNv
bnRyb2xsZXIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udHJv
bGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgbW9kZWwgdG8gaW5mZXIgdGhlIHR5
cGUgb2YgdGhlIGNvbnRyb2xsZXIgKG9wdGlvbmFsKQotICAqLwotICBnZW5lcmF0ZUNvbnRyb2xs
ZXI6IGZ1bmN0aW9uKG5hbWUsIG1vZGVsKSB7Ci0gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29u
dGFpbmVyOwotCi0gICAgbW9kZWwgPSBtb2RlbCB8fCB0aGlzLm1vZGVsRm9yKG5hbWUpOwotCi0g
ICAgcmV0dXJuIEVtYmVyLmdlbmVyYXRlQ29udHJvbGxlcihjb250YWluZXIsIG5hbWUsIG1vZGVs
KTsKLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5zIHRoZSBtb2RlbCBvZiBhIHBhcmVudCAob3Ig
YW55IGFuY2VzdG9yKSByb3V0ZQotICAgIGluIGEgcm91dGUgaGllcmFyY2h5LiAgRHVyaW5nIGEg
dHJhbnNpdGlvbiwgYWxsIHJvdXRlcwotICAgIG11c3QgcmVzb2x2ZSBhIG1vZGVsIG9iamVjdCwg
YW5kIGlmIGEgcm91dGUKLSAgICBuZWVkcyBhY2Nlc3MgdG8gYSBwYXJlbnQgcm91dGUncyBtb2Rl
bCBpbiBvcmRlciB0bwotICAgIHJlc29sdmUgYSBtb2RlbCAob3IganVzdCByZXVzZSB0aGUgbW9k
ZWwgZnJvbSBhIHBhcmVudCksCi0gICAgaXQgY2FuIGNhbGwgYHRoaXMubW9kZWxGb3IodGhlTmFt
ZU9mUGFyZW50Um91dGUpYCB0bwotICAgIHJldHJpZXZlIGl0LgotCi0gICAgRXhhbXBsZQotCi0g
ICAgYGBganMKLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5y
ZXNvdXJjZSgncG9zdCcsIHsgcGF0aDogJy9wb3N0Lzpwb3N0X2lkJyB9LCBmdW5jdGlvbigpIHsK
LSAgICAgICAgICAgIHRoaXMucmVzb3VyY2UoJ2NvbW1lbnRzJyk7Ci0gICAgICAgIH0pOwotICAg
IH0pOwotCi0gICAgQXBwLkNvbW1lbnRzUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewotICAg
ICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdwb3N0
JywgdGhpcy5tb2RlbEZvcigncG9zdCcpKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIGBgYAot
Ci0gICAgQG1ldGhvZCBtb2RlbEZvcgotICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1l
IG9mIHRoZSByb3V0ZQotICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVsIG9iamVjdAotICAq
LwotICBtb2RlbEZvcjogZnVuY3Rpb24obmFtZSkgewotCi0gICAgdmFyIHJvdXRlID0gdGhpcy5j
b250YWluZXIubG9va3VwKCdyb3V0ZTonICsgbmFtZSksCi0gICAgICAgIHRyYW5zaXRpb24gPSB0
aGlzLnJvdXRlci5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbjsKLQotICAgIC8vIElmIHdlIGFyZSBt
aWQtdHJhbnNpdGlvbiwgd2Ugd2FudCB0byB0cnkgYW5kIGxvb2sgdXAKLSAgICAvLyByZXNvbHZl
ZCBwYXJlbnQgY29udGV4dHMgb24gdGhlIGN1cnJlbnQgdHJhbnNpdGlvbkV2ZW50LgotICAgIGlm
ICh0cmFuc2l0aW9uKSB7Ci0gICAgICB2YXIgbW9kZWxMb29rdXBOYW1lID0gKHJvdXRlICYmIHJv
dXRlLnJvdXRlTmFtZSkgfHwgbmFtZTsKLSAgICAgIGlmICh0cmFuc2l0aW9uLnJlc29sdmVkTW9k
ZWxzLmhhc093blByb3BlcnR5KG1vZGVsTG9va3VwTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHRy
YW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxMb29rdXBOYW1lXTsKLSAgICAgIH0KLSAgICB9
Ci0KLSAgICByZXR1cm4gcm91dGUgJiYgcm91dGUuY3VycmVudE1vZGVsOwotICB9LAotCi0gIC8q
KgotICAgIEEgaG9vayB5b3UgY2FuIHVzZSB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGZvciB0aGUg
Y3VycmVudCByb3V0ZS4KLQotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb250
cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZSBhbmQgdGhlCi0gICAgbW9kZWwgc3VwcGxpZWQg
YnkgdGhlIGBtb2RlbGAgaG9vay4gQnkgZGVmYXVsdCwgaXQgcmVuZGVycyB0aGUgcm91dGUncwot
ICAgIHRlbXBsYXRlLCBjb25maWd1cmVkIHdpdGggdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSByb3V0
ZS4KLQotICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIHNldCB1cCBhbmQgcmVu
ZGVyIGFkZGl0aW9uYWwgb3IKLSAgICBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZXMuCi0KLSAgICBgYGBq
cwotICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRl
clRlbXBsYXRlOiBmdW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgewotICAgICAgICB2YXIgZmF2
Q29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlckZvcignZmF2b3JpdGVQb3N0Jyk7Ci0KLSAgICAg
ICAgLy8gUmVuZGVyIHRoZSBgZmF2b3JpdGVQb3N0YCB0ZW1wbGF0ZSBpbnRvCi0gICAgICAgIC8v
IHRoZSBvdXRsZXQgYHBvc3RzYCwgYW5kIGRpc3BsYXkgdGhlIGBmYXZvcml0ZVBvc3RgCi0gICAg
ICAgIC8vIGNvbnRyb2xsZXIuCi0gICAgICAgIHRoaXMucmVuZGVyKCdmYXZvcml0ZVBvc3QnLCB7
Ci0gICAgICAgICAgb3V0bGV0OiAncG9zdHMnLAotICAgICAgICAgIGNvbnRyb2xsZXI6IGZhdkNv
bnRyb2xsZXIKLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBA
bWV0aG9kIHJlbmRlclRlbXBsYXRlCi0gICAgQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xsZXIgdGhl
IHJvdXRlJ3MgY29udHJvbGxlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCB0aGUgcm91dGUn
cyBtb2RlbAotICAqLwotICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24oY29udHJvbGxlciwgbW9k
ZWwpIHsKLSAgICB0aGlzLnJlbmRlcigpOwotICB9LAotCi0gIC8qKgotICAgIFJlbmRlcnMgYSB0
ZW1wbGF0ZSBpbnRvIGFuIG91dGxldC4KLQotICAgIFRoaXMgbWV0aG9kIGhhcyBhIG51bWJlciBv
ZiBkZWZhdWx0cywgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlCi0gICAgcm91dGUgc3BlY2lmaWVk
IGluIHRoZSByb3V0ZXIuCi0KLSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGpzCi0gICAgQXBw
LlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCdpbmRleCcpOwotICAg
ICAgdGhpcy5yZXNvdXJjZSgncG9zdCcsIHtwYXRoOiAnL3Bvc3RzLzpwb3N0X2lkJ30pOwotICAg
IH0pOwotCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewotICAgICAgcmVu
ZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlbmRlcigpOwotICAgICAg
fQotICAgIH0pOwotICAgIGBgYAotCi0gICAgVGhlIG5hbWUgb2YgdGhlIGBQb3N0Um91dGVgLCBh
cyBkZWZpbmVkIGJ5IHRoZSByb3V0ZXIsIGlzIGBwb3N0YC4KLQotICAgIEJ5IGRlZmF1bHQsIHJl
bmRlciB3aWxsOgotCi0gICAgKiByZW5kZXIgdGhlIGBwb3N0YCB0ZW1wbGF0ZQotICAgICogd2l0
aCB0aGUgYHBvc3RgIHZpZXcgKGBQb3N0Vmlld2ApIGZvciBldmVudCBoYW5kbGluZywgaWYgb25l
IGV4aXN0cwotICAgICogYW5kIHRoZSBgcG9zdGAgY29udHJvbGxlciAoYFBvc3RDb250cm9sbGVy
YCksIGlmIG9uZSBleGlzdHMKLSAgICAqIGludG8gdGhlIGBtYWluYCBvdXRsZXQgb2YgdGhlIGBh
cHBsaWNhdGlvbmAgdGVtcGxhdGUKLQotICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlv
cjoKLQotICAgIGBgYGpzCi0gICAgQXBwLlBvc3RSb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQoewot
ICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlbmRlcign
bXlQb3N0JywgeyAgIC8vIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKLSAgICAgICAgICBpbnRvOiAn
aW5kZXgnLCAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyIGludG8KLSAgICAgICAg
ICBvdXRsZXQ6ICdkZXRhaWwnLCAgICAgICAvLyB0aGUgbmFtZSBvZiB0aGUgb3V0bGV0IGluIHRo
YXQgdGVtcGxhdGUKLSAgICAgICAgICBjb250cm9sbGVyOiAnYmxvZ1Bvc3QnICAvLyB0aGUgY29u
dHJvbGxlciB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0ZQotICAgICAgICB9KTsKLSAgICAgIH0KLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIFJlbWVtYmVyIHRoYXQgdGhlIGNvbnRyb2xsZXIncyBgY29u
dGVudGAgd2lsbCBiZSB0aGUgcm91dGUncyBtb2RlbC4gSW4KLSAgICB0aGlzIGNhc2UsIHRoZSBk
ZWZhdWx0IG1vZGVsIHdpbGwgYmUgYEFwcC5Qb3N0LmZpbmQocGFyYW1zLnBvc3RfaWQpYC4KLQot
ICAgIEBtZXRob2QgcmVuZGVyCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2Yg
dGhlIHRlbXBsYXRlIHRvIHJlbmRlcgotICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBv
cHRpb25zCi0gICovCi0gIHJlbmRlcjogZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewotICAgIEVt
YmVyLmFzc2VydCgiVGhlIG5hbWUgaW4gdGhlIGdpdmVuIGFyZ3VtZW50cyBpcyB1bmRlZmluZWQi
LCBhcmd1bWVudHMubGVuZ3RoID4gMCA/ICFFbWJlci5pc05vbmUoYXJndW1lbnRzWzBdKSA6IHRy
dWUpOwotCi0gICAgdmFyIG5hbWVQYXNzZWQgPSAhIW5hbWU7Ci0KLSAgICBpZiAodHlwZW9mIG5h
bWUgPT09ICdvYmplY3QnICYmICFvcHRpb25zKSB7Ci0gICAgICBvcHRpb25zID0gbmFtZTsKLSAg
ICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAgICB9Ci0KLSAgICBvcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKLQotICAgIHZhciB0ZW1wbGF0ZU5hbWU7Ci0KLSAgICBpZiAobmFtZSkgewotICAg
ICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXC8vZywgJy4nKTsKLSAgICAgIHRlbXBsYXRlTmFtZSA9
IG5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKLSAgICAg
IHRlbXBsYXRlTmFtZSA9IHRoaXMudGVtcGxhdGVOYW1lIHx8IG5hbWU7Ci0gICAgfQotCi0gICAg
dmFyIHZpZXdOYW1lID0gb3B0aW9ucy52aWV3IHx8IHRoaXMudmlld05hbWUgfHwgbmFtZTsKLQot
ICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKLSAgICAgICAgdmlldyA9IGNvbnRh
aW5lci5sb29rdXAoJ3ZpZXc6JyArIHZpZXdOYW1lKSwKLSAgICAgICAgdGVtcGxhdGUgPSB2aWV3
ID8gdmlldy5nZXQoJ3RlbXBsYXRlJykgOiBudWxsOwotCi0gICAgaWYgKCF0ZW1wbGF0ZSkgewot
ICAgICAgdGVtcGxhdGUgPSBjb250YWluZXIubG9va3VwKCd0ZW1wbGF0ZTonICsgdGVtcGxhdGVO
YW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIXZpZXcgJiYgIXRlbXBsYXRlKSB7Ci0gICAgICBFbWJl
ci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIFwiIiArIG5hbWUgKyAiXCIgdGVtcGxhdGUgb3Igdmll
dy4iLCAhbmFtZVBhc3NlZCk7Ci0gICAgICBpZiAoZ2V0KHRoaXMucm91dGVyLCAnbmFtZXNwYWNl
LkxPR19WSUVXX0xPT0tVUFMnKSkgewotICAgICAgICBFbWJlci5Mb2dnZXIuaW5mbygiQ291bGQg
bm90IGZpbmQgXCIiICsgbmFtZSArICJcIiB0ZW1wbGF0ZSBvciB2aWV3LiBOb3RoaW5nIHdpbGwg
YmUgcmVuZGVyZWQiLCB7IGZ1bGxOYW1lOiAndGVtcGxhdGU6JyArIG5hbWUgfSk7Ci0gICAgICB9
Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG5vcm1hbGl6ZU9wdGlvbnMo
dGhpcywgbmFtZSwgdGVtcGxhdGUsIG9wdGlvbnMpOwotICAgIHZpZXcgPSBzZXR1cFZpZXcodmll
dywgY29udGFpbmVyLCBvcHRpb25zKTsKLQotICAgIGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21h
aW4nKSB7IHRoaXMubGFzdFJlbmRlcmVkVGVtcGxhdGUgPSBuYW1lOyB9Ci0KLSAgICBhcHBlbmRW
aWV3KHRoaXMsIHZpZXcsIG9wdGlvbnMpOwotICB9LAotCi0gIC8qKgotICAgIERpc2Nvbm5lY3Rz
IGEgdmlldyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGludG8gYW4gb3V0bGV0LgotCi0gICAgWW91
IG1heSBwYXNzIGFueSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGBkaXNjb25u
ZWN0T3V0bGV0YDoKLQotICAgICogYG91dGxldGA6IHRoZSBuYW1lIG9mIHRoZSBvdXRsZXQgdG8g
Y2xlYXIgKGRlZmF1bHQ6ICdtYWluJykKLSAgICAqIGBwYXJlbnRWaWV3YDogdGhlIG5hbWUgb2Yg
dGhlIHZpZXcgY29udGFpbmluZyB0aGUgb3V0bGV0IHRvIGNsZWFyCi0gICAgICAgKGRlZmF1bHQ6
IHRoZSB2aWV3IHJlbmRlcmVkIGJ5IHRoZSBwYXJlbnQgcm91dGUpCi0KLSAgICBFeGFtcGxlOgot
Ci0gICAgYGBganMKLSAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9IEFwcC5Sb3V0ZS5leHRlbmQo
ewotICAgICAgYWN0aW9uczogewotICAgICAgICBzaG93TW9kYWw6IGZ1bmN0aW9uKGV2dCkgewot
ICAgICAgICAgIHRoaXMucmVuZGVyKGV2dC5tb2RhbE5hbWUsIHsKLSAgICAgICAgICAgIG91dGxl
dDogJ21vZGFsJywKLSAgICAgICAgICAgIGludG86ICdhcHBsaWNhdGlvbicKLSAgICAgICAgICB9
KTsKLSAgICAgICAgfSwKLSAgICAgICAgaGlkZU1vZGFsOiBmdW5jdGlvbihldnQpIHsKLSAgICAg
ICAgICB0aGlzLmRpc2Nvbm5lY3RPdXRsZXQoewotICAgICAgICAgICAgb3V0bGV0OiAnbW9kYWwn
LAotICAgICAgICAgICAgcGFyZW50VmlldzogJ2FwcGxpY2F0aW9uJwotICAgICAgICAgIH0pOwot
ICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nv
bm5lY3RPdXRsZXQKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucwotICAq
LwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihvcHRpb25zKSB7Ci0gICAgb3B0aW9ucyA9
IG9wdGlvbnMgfHwge307Ci0gICAgb3B0aW9ucy5wYXJlbnRWaWV3ID0gb3B0aW9ucy5wYXJlbnRW
aWV3ID8gb3B0aW9ucy5wYXJlbnRWaWV3LnJlcGxhY2UoL1wvL2csICcuJykgOiBwYXJlbnRUZW1w
bGF0ZSh0aGlzKTsKLSAgICBvcHRpb25zLm91dGxldCA9IG9wdGlvbnMub3V0bGV0IHx8ICdtYWlu
JzsKLQotICAgIHZhciBwYXJlbnRWaWV3ID0gdGhpcy5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXco
b3B0aW9ucy5wYXJlbnRWaWV3KTsKLSAgICBwYXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3B0
aW9ucy5vdXRsZXQpOwotICB9LAotCi0gIHdpbGxEZXN0cm95OiBmdW5jdGlvbigpIHsKLSAgICB0
aGlzLnRlYXJkb3duVmlld3MoKTsKLSAgfSwKLQotICAvKioKLSAgICBAcHJpdmF0ZQotCi0gICAg
QG1ldGhvZCB0ZWFyZG93blZpZXdzCi0gICovCi0gIHRlYXJkb3duVmlld3M6IGZ1bmN0aW9uKCkg
ewotICAgIC8vIFRlYXIgZG93biB0aGUgdG9wIGxldmVsIHZpZXcKLSAgICBpZiAodGhpcy50ZWFy
ZG93blRvcExldmVsVmlldykgeyB0aGlzLnRlYXJkb3duVG9wTGV2ZWxWaWV3KCk7IH0KLQotICAg
IC8vIFRlYXIgZG93biBhbnkgb3V0bGV0cyByZW5kZXJlZCB3aXRoICdpbnRvJwotICAgIHZhciB0
ZWFyZG93bk91dGxldFZpZXdzID0gdGhpcy50ZWFyZG93bk91dGxldFZpZXdzIHx8IFtdOwotICAg
IGFfZm9yRWFjaCh0ZWFyZG93bk91dGxldFZpZXdzLCBmdW5jdGlvbih0ZWFyZG93bk91dGxldFZp
ZXcpIHsKLSAgICAgIHRlYXJkb3duT3V0bGV0VmlldygpOwotICAgIH0pOwotCi0gICAgZGVsZXRl
IHRoaXMudGVhcmRvd25Ub3BMZXZlbFZpZXc7Ci0gICAgZGVsZXRlIHRoaXMudGVhcmRvd25PdXRs
ZXRWaWV3czsKLSAgICBkZWxldGUgdGhpcy5sYXN0UmVuZGVyZWRUZW1wbGF0ZTsKLSAgfQotfSk7
Ci0KLWZ1bmN0aW9uIHBhcmVudFJvdXRlKHJvdXRlKSB7Ci0gIHZhciBoYW5kbGVySW5mb3MgPSBy
b3V0ZS5yb3V0ZXIucm91dGVyLnRhcmdldEhhbmRsZXJJbmZvczsKLQotICBpZiAoIWhhbmRsZXJJ
bmZvcykgeyByZXR1cm47IH0KLQotICB2YXIgcGFyZW50LCBjdXJyZW50OwotCi0gIGZvciAodmFy
IGk9MCwgbD1oYW5kbGVySW5mb3MubGVuZ3RoOyBpPGw7IGkrKykgewotICAgIGN1cnJlbnQgPSBo
YW5kbGVySW5mb3NbaV0uaGFuZGxlcjsKLSAgICBpZiAoY3VycmVudCA9PT0gcm91dGUpIHsgcmV0
dXJuIHBhcmVudDsgfQotICAgIHBhcmVudCA9IGN1cnJlbnQ7Ci0gIH0KLX0KLQotZnVuY3Rpb24g
cGFyZW50VGVtcGxhdGUocm91dGUpIHsKLSAgdmFyIHBhcmVudCA9IHBhcmVudFJvdXRlKHJvdXRl
KSwgdGVtcGxhdGU7Ci0KLSAgaWYgKCFwYXJlbnQpIHsgcmV0dXJuOyB9Ci0KLSAgaWYgKHRlbXBs
YXRlID0gcGFyZW50Lmxhc3RSZW5kZXJlZFRlbXBsYXRlKSB7Ci0gICAgcmV0dXJuIHRlbXBsYXRl
OwotICB9IGVsc2UgewotICAgIHJldHVybiBwYXJlbnRUZW1wbGF0ZShwYXJlbnQpOwotICB9Ci19
Ci0KLWZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnMocm91dGUsIG5hbWUsIHRlbXBsYXRlLCBvcHRp
b25zKSB7Ci0gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotICBvcHRpb25zLmludG8gPSBvcHRp
b25zLmludG8gPyBvcHRpb25zLmludG8ucmVwbGFjZSgvXC8vZywgJy4nKSA6IHBhcmVudFRlbXBs
YXRlKHJvdXRlKTsKLSAgb3B0aW9ucy5vdXRsZXQgPSBvcHRpb25zLm91dGxldCB8fCAnbWFpbic7
Ci0gIG9wdGlvbnMubmFtZSA9IG5hbWU7Ci0gIG9wdGlvbnMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsK
LSAgb3B0aW9ucy5MT0dfVklFV19MT09LVVBTID0gZ2V0KHJvdXRlLnJvdXRlciwgJ25hbWVzcGFj
ZS5MT0dfVklFV19MT09LVVBTJyk7Ci0KLSAgRW1iZXIuYXNzZXJ0KCJBbiBvdXRsZXQgKCIrb3B0
aW9ucy5vdXRsZXQrIikgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBmb3VuZC4iLCBvcHRpb25z
Lm91dGxldCA9PT0gJ21haW4nIHx8IG9wdGlvbnMuaW50byk7Ci0KLSAgdmFyIGNvbnRyb2xsZXIg
PSBvcHRpb25zLmNvbnRyb2xsZXIsIG5hbWVkQ29udHJvbGxlcjsKLQotICBpZiAob3B0aW9ucy5j
b250cm9sbGVyKSB7Ci0gICAgY29udHJvbGxlciA9IG9wdGlvbnMuY29udHJvbGxlcjsKLSAgfSBl
bHNlIGlmIChuYW1lZENvbnRyb2xsZXIgPSByb3V0ZS5jb250YWluZXIubG9va3VwKCdjb250cm9s
bGVyOicgKyBuYW1lKSkgewotICAgIGNvbnRyb2xsZXIgPSBuYW1lZENvbnRyb2xsZXI7Ci0gIH0g
ZWxzZSB7Ci0gICAgY29udHJvbGxlciA9IHJvdXRlLmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJv
dXRlTmFtZTsKLSAgfQotCi0gIGlmICh0eXBlb2YgY29udHJvbGxlciA9PT0gJ3N0cmluZycpIHsK
LSAgICBjb250cm9sbGVyID0gcm91dGUuY29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsg
Y29udHJvbGxlcik7Ci0gIH0KLQotICBvcHRpb25zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwot
Ci0gIHJldHVybiBvcHRpb25zOwotfQotCi1mdW5jdGlvbiBzZXR1cFZpZXcodmlldywgY29udGFp
bmVyLCBvcHRpb25zKSB7Ci0gIGlmICh2aWV3KSB7Ci0gICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdf
TE9PS1VQUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oIlJlbmRlcmluZyAiICsgb3B0aW9u
cy5uYW1lICsgIiB3aXRoICIgKyB2aWV3LCB7IGZ1bGxOYW1lOiAndmlldzonICsgb3B0aW9ucy5u
YW1lIH0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25z
LmludG8gPyAndmlldzpkZWZhdWx0JyA6ICd2aWV3OnRvcGxldmVsJzsKLSAgICB2aWV3ID0gY29u
dGFpbmVyLmxvb2t1cChkZWZhdWx0Vmlldyk7Ci0gICAgaWYgKG9wdGlvbnMuTE9HX1ZJRVdfTE9P
S1VQUykgewotICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oIlJlbmRlcmluZyAiICsgb3B0aW9ucy5u
YW1lICsgIiB3aXRoIGRlZmF1bHQgdmlldyAiICsgdmlldywgeyBmdWxsTmFtZTogJ3ZpZXc6JyAr
IG9wdGlvbnMubmFtZSB9KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWdldCh2aWV3LCAndGVtcGxh
dGVOYW1lJykpIHsKLSAgICBzZXQodmlldywgJ3RlbXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7
Ci0KLSAgICBzZXQodmlldywgJ19kZWJ1Z1RlbXBsYXRlTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0g
IH0KLQotICBzZXQodmlldywgJ3JlbmRlcmVkTmFtZScsIG9wdGlvbnMubmFtZSk7Ci0gIHNldCh2
aWV3LCAnY29udHJvbGxlcicsIG9wdGlvbnMuY29udHJvbGxlcik7Ci0KLSAgcmV0dXJuIHZpZXc7
Ci19Ci0KLWZ1bmN0aW9uIGFwcGVuZFZpZXcocm91dGUsIHZpZXcsIG9wdGlvbnMpIHsKLSAgaWYg
KG9wdGlvbnMuaW50bykgewotICAgIHZhciBwYXJlbnRWaWV3ID0gcm91dGUucm91dGVyLl9sb29r
dXBBY3RpdmVWaWV3KG9wdGlvbnMuaW50byk7Ci0gICAgdmFyIHRlYXJkb3duT3V0bGV0VmlldyA9
IGdlbmVyYXRlT3V0bGV0VGVhcmRvd24ocGFyZW50Vmlldywgb3B0aW9ucy5vdXRsZXQpOwotICAg
IGlmICghcm91dGUudGVhcmRvd25PdXRsZXRWaWV3cykgeyByb3V0ZS50ZWFyZG93bk91dGxldFZp
ZXdzID0gW107IH0KLSAgICBhX3JlcGxhY2Uocm91dGUudGVhcmRvd25PdXRsZXRWaWV3cywgMCwg
MCwgW3RlYXJkb3duT3V0bGV0Vmlld10pOwotICAgIHBhcmVudFZpZXcuY29ubmVjdE91dGxldChv
cHRpb25zLm91dGxldCwgdmlldyk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyIHJvb3RFbGVtZW50ID0g
Z2V0KHJvdXRlLCAncm91dGVyLm5hbWVzcGFjZS5yb290RWxlbWVudCcpOwotICAgIC8vIHRlYXIg
ZG93biB2aWV3IGlmIG9uZSBpcyBhbHJlYWR5IHJlbmRlcmVkCi0gICAgaWYgKHJvdXRlLnRlYXJk
b3duVG9wTGV2ZWxWaWV3KSB7Ci0gICAgICByb3V0ZS50ZWFyZG93blRvcExldmVsVmlldygpOwot
ICAgIH0KLSAgICByb3V0ZS5yb3V0ZXIuX2Nvbm5lY3RBY3RpdmVWaWV3KG9wdGlvbnMubmFtZSwg
dmlldyk7Ci0gICAgcm91dGUudGVhcmRvd25Ub3BMZXZlbFZpZXcgPSBnZW5lcmF0ZVRvcExldmVs
VGVhcmRvd24odmlldyk7Ci0gICAgdmlldy5hcHBlbmRUbyhyb290RWxlbWVudCk7Ci0gIH0KLX0K
LQotZnVuY3Rpb24gZ2VuZXJhdGVUb3BMZXZlbFRlYXJkb3duKHZpZXcpIHsKLSAgcmV0dXJuIGZ1
bmN0aW9uKCkgeyB2aWV3LmRlc3Ryb3koKTsgfTsKLX0KLQotZnVuY3Rpb24gZ2VuZXJhdGVPdXRs
ZXRUZWFyZG93bihwYXJlbnRWaWV3LCBvdXRsZXQpIHsKLSAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBw
YXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3V0bGV0KTsgfTsKLX0KLQotfSkoKTsKLQotCi0K
LShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLUVtYmVyLm9uTG9h
ZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKCkgewotICB2YXIgaGFuZGxlYmFyc1Jlc29s
dmUgPSBFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQYXJhbXMsCi0gICAgICBtYXAgPSBFbWJlci5B
cnJheVBvbHlmaWxscy5tYXAsCi0gICAgICBnZXQgPSBFbWJlci5nZXQsCi0gICAgICBoYW5kbGVi
YXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQ7Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhcmFt
cyhjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKLSAgICByZXR1cm4gbWFwLmNhbGwocmVzb2x2
ZVBhdGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucyksIGZ1bmN0aW9uKHBhdGgsIGkpIHsKLSAg
ICAgIGlmIChudWxsID09PSBwYXRoKSB7Ci0gICAgICAgIC8vIFBhcmFtIHdhcyBzdHJpbmcvbnVt
YmVyLCBub3QgYSBwYXRoLCBzbyBqdXN0IHJldHVybiByYXcgc3RyaW5nL251bWJlci4KLSAgICAg
ICAgcmV0dXJuIHBhcmFtc1tpXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBoYW5k
bGViYXJzR2V0KGNvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwotICAgICAgfQotICAgIH0pOwotICB9
Ci0KLSAgZnVuY3Rpb24gcmVzb2x2ZVBhdGhzKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucykgewot
ICAgIHZhciByZXNvbHZlZCA9IGhhbmRsZWJhcnNSZXNvbHZlKGNvbnRleHQsIHBhcmFtcywgb3B0
aW9ucyksCi0gICAgICAgIHR5cGVzID0gb3B0aW9ucy50eXBlczsKLQotICAgIHJldHVybiBtYXAu
Y2FsbChyZXNvbHZlZCwgZnVuY3Rpb24ob2JqZWN0LCBpKSB7Ci0gICAgICBpZiAodHlwZXNbaV0g
PT09ICdJRCcpIHsKLSAgICAgICAgcmV0dXJuIHVud3JhcChvYmplY3QsIHBhcmFtc1tpXSk7Ci0g
ICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9KTsKLQot
ICAgIGZ1bmN0aW9uIHVud3JhcChvYmplY3QsIHBhdGgpIHsKLSAgICAgIGlmIChwYXRoID09PSAn
Y29udHJvbGxlcicpIHsgcmV0dXJuIHBhdGg7IH0KLQotICAgICAgaWYgKEVtYmVyLkNvbnRyb2xs
ZXJNaXhpbi5kZXRlY3Qob2JqZWN0KSkgewotICAgICAgICByZXR1cm4gdW53cmFwKGdldChvYmpl
Y3QsICdtb2RlbCcpLCBwYXRoID8gcGF0aCArICcubW9kZWwnIDogJ21vZGVsJyk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBF
bWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcyA9IHJlc29sdmVQYXJhbXM7Ci0gIEVtYmVyLlJvdXRl
ci5yZXNvbHZlUGF0aHMgPSByZXNvbHZlUGF0aHM7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0q
LwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0
cmluZy5mbXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5k
bGViYXJzKSB7Ci0KLSAgdmFyIHJlc29sdmVQYXJhbXMgPSBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBh
cmFtcywKLSAgICAgIHJlc29sdmVQYXRocyAgPSBFbWJlci5Sb3V0ZXIucmVzb2x2ZVBhdGhzLAot
ICAgICAgaXNTaW1wbGVDbGljayA9IEVtYmVyLlZpZXdVdGlscy5pc1NpbXBsZUNsaWNrOwotCi0g
IGZ1bmN0aW9uIGZ1bGxSb3V0ZU5hbWUocm91dGVyLCBuYW1lKSB7Ci0gICAgdmFyIG5hbWVXaXRo
SW5kZXg7Ci0gICAgaWYgKCFyb3V0ZXIuaGFzUm91dGUobmFtZSkpIHsKLSAgICAgIG5hbWVXaXRo
SW5kZXggPSBuYW1lICsgJy5pbmRleCc7Ci0gICAgICBFbWJlci5hc3NlcnQoZm10KCJUaGUgYXR0
ZW1wdCB0byBsaW5rLXRvIHJvdXRlICclQCcgZmFpbGVkIChhbHNvIHRyaWVkICclQCcpLiAiICsK
LSAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByb3V0ZXIgZGlkIG5vdCBmaW5kICclQCcgaW4g
aXRzIHBvc3NpYmxlIHJvdXRlczogJyVAJyIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtuYW1l
LCBuYW1lV2l0aEluZGV4LCBuYW1lLCBFbWJlci5rZXlzKHJvdXRlci5yb3V0ZXIucmVjb2duaXpl
ci5uYW1lcykuam9pbigiJywgJyIpXSksCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdXRlci5o
YXNSb3V0ZShuYW1lV2l0aEluZGV4KSk7Ci0gICAgICBuYW1lID0gbmFtZVdpdGhJbmRleDsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldFJlc29sdmVkUGF0
aHMob3B0aW9ucykgewotCi0gICAgdmFyIHR5cGVzID0gb3B0aW9ucy5vcHRpb25zLnR5cGVzLAot
ICAgICAgICBkYXRhID0gb3B0aW9ucy5vcHRpb25zLmRhdGE7Ci0KLSAgICByZXR1cm4gcmVzb2x2
ZVBhdGhzKG9wdGlvbnMuY29udGV4dCwgb3B0aW9ucy5wYXJhbXMsIHsgdHlwZXM6IHR5cGVzLCBk
YXRhOiBkYXRhIH0pOwotICB9Ci0KLSAgLyoqCi0gICAgYEVtYmVyLkxpbmtWaWV3YCByZW5kZXJz
IGFuIGVsZW1lbnQgd2hvc2UgYGNsaWNrYCBldmVudCB0cmlnZ2VycyBhCi0gICAgdHJhbnNpdGlv
biBvZiB0aGUgYXBwbGljYXRpb24ncyBpbnN0YW5jZSBvZiBgRW1iZXIuUm91dGVyYCB0bwotICAg
IGEgc3VwcGxpZWQgcm91dGUgYnkgbmFtZS4KLQotICAgIEluc3RhbmNlcyBvZiBgTGlua1ZpZXdg
IHdpbGwgbW9zdCBsaWtlbHkgYmUgY3JlYXRlZCB0aHJvdWdoCi0gICAgdGhlIGBsaW5rLXRvYCBI
YW5kbGViYXJzIGhlbHBlciwgYnV0IHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcwotICAgIGNhbiBi
ZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBhcHBsaWNhdGlvbi13aWRlIGJlaGF2aW9yLgotCi0g
ICAgQGNsYXNzIExpbmtWaWV3Ci0gICAgQG5hbWVzcGFjZSBFbWJlcgotICAgIEBleHRlbmRzIEVt
YmVyLlZpZXcKLSAgICBAc2VlIHtIYW5kbGViYXJzLmhlbHBlcnMubGluay10b30KLSAgKiovCi0g
IHZhciBMaW5rVmlldyA9IEVtYmVyLkxpbmtWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewotICAg
IHRhZ05hbWU6ICdhJywKLSAgICBjdXJyZW50V2hlbjogbnVsbCwKLQotICAgIC8qKgotICAgICAg
U2V0cyB0aGUgYHRpdGxlYCBhdHRyaWJ1dGUgb2YgdGhlIGBMaW5rVmlld2AncyBIVE1MIGVsZW1l
bnQuCi0KLSAgICAgIEBwcm9wZXJ0eSB0aXRsZQotICAgICAgQGRlZmF1bHQgbnVsbAotICAgICoq
LwotICAgIHRpdGxlOiBudWxsLAotCi0gICAgLyoqCi0gICAgICBTZXRzIHRoZSBgcmVsYCBhdHRy
aWJ1dGUgb2YgdGhlIGBMaW5rVmlld2AncyBIVE1MIGVsZW1lbnQuCi0KLSAgICAgIEBwcm9wZXJ0
eSByZWwKLSAgICAgIEBkZWZhdWx0IG51bGwKLSAgICAqKi8KLSAgICByZWw6IG51bGwsCi0KLSAg
ICAvKioKLSAgICAgIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYExpbmtWaWV3YCdzIGVsZW1l
bnQgd2hlbiBpdHMgYGFjdGl2ZWAKLSAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KLQotICAgICAg
QHByb3BlcnR5IGFjdGl2ZUNsYXNzCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0
IGFjdGl2ZQotICAgICoqLwotICAgIGFjdGl2ZUNsYXNzOiAnYWN0aXZlJywKLQotICAgIC8qKgot
ICAgICAgVGhlIENTUyBjbGFzcyB0byBhcHBseSB0byBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVu
IGl0cyBgbG9hZGluZ2AKLSAgICAgIHByb3BlcnR5IGlzIGB0cnVlYC4KLQotICAgICAgQHByb3Bl
cnR5IGxvYWRpbmdDbGFzcwotICAgICAgQHR5cGUgU3RyaW5nCi0gICAgICBAZGVmYXVsdCBsb2Fk
aW5nCi0gICAgKiovCi0gICAgbG9hZGluZ0NsYXNzOiAnbG9hZGluZycsCi0KLSAgICAvKioKLSAg
ICAgIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYSBgTGlua1ZpZXdgJ3MgZWxlbWVudCB3aGVu
IGl0cyBgZGlzYWJsZWRgCi0gICAgICBwcm9wZXJ0eSBpcyBgdHJ1ZWAuCi0KLSAgICAgIEBwcm9w
ZXJ0eSBkaXNhYmxlZENsYXNzCi0gICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGRp
c2FibGVkCi0gICAgKiovCi0gICAgZGlzYWJsZWRDbGFzczogJ2Rpc2FibGVkJywKLSAgICBfaXNE
aXNhYmxlZDogZmFsc2UsCi0KLSAgICAvKioKLSAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUg
YExpbmtWaWV3YCB3aWxsIHRyaWdnZXIgcm91dGluZyB2aWEKLSAgICAgIHRoZSBgcmVwbGFjZVdp
dGhgIHJvdXRpbmcgc3RyYXRlZ3kuCi0KLSAgICAgIEBwcm9wZXJ0eSByZXBsYWNlCi0gICAgICBA
dHlwZSBCb29sZWFuCi0gICAgICBAZGVmYXVsdCBmYWxzZQotICAgICoqLwotICAgIHJlcGxhY2U6
IGZhbHNlLAotCi0gICAgLyoqCi0gICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5rLXRvfX1gIGhl
bHBlciB3aWxsIGJpbmQgdG8gdGhlIGBocmVmYCBhbmQKLSAgICAgIGB0aXRsZWAgYXR0cmlidXRl
cy4gSXQncyBkaXNjb3VyYWdlIHRoYXQgeW91IG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAotICAg
ICAgaG93ZXZlciB5b3UgY2FuIHB1c2ggb250byB0aGUgYXJyYXkgaWYgbmVlZGVkLgotCi0gICAg
ICBAcHJvcGVydHkgYXR0cmlidXRlQmluZGluZ3MKLSAgICAgIEB0eXBlIEFycmF5IHwgU3RyaW5n
Ci0gICAgICBAZGVmYXVsdCBbJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10KLSAgICAgKiovCi0gICAg
YXR0cmlidXRlQmluZGluZ3M6IFsnaHJlZicsICd0aXRsZScsICdyZWwnXSwKLQotICAgIC8qKgot
ICAgICAgQnkgZGVmYXVsdCB0aGUgYHt7bGluay10b319YCBoZWxwZXIgd2lsbCBiaW5kIHRvIHRo
ZSBgYWN0aXZlYCwgYGxvYWRpbmdgLCBhbmQKLSAgICAgIGBkaXNhYmxlZGAgY2xhc3Nlcy4gSXQg
aXMgZGlzY291cmFnZWQgdG8gb3ZlcnJpZGUgdGhlc2UgZGlyZWN0bHkuCi0KLSAgICAgIEBwcm9w
ZXJ0eSBjbGFzc05hbWVCaW5kaW5ncwotICAgICAgQHR5cGUgQXJyYXkKLSAgICAgIEBkZWZhdWx0
IFsnYWN0aXZlJywgJ2xvYWRpbmcnLCAnZGlzYWJsZWQnXQotICAgICAqKi8KLSAgICBjbGFzc05h
bWVCaW5kaW5nczogWydhY3RpdmUnLCAnbG9hZGluZycsICdkaXNhYmxlZCddLAotCi0gICAgLyoq
Ci0gICAgICBCeSBkZWZhdWx0IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciByZXNwb25kcyB0byB0
aGUgYGNsaWNrYCBldmVudC4gWW91Ci0gICAgICBjYW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWxseSBi
eSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8geW91ciBjdXN0b20KLSAgICAgIGV2ZW50IG5hbWUu
Ci0KLSAgICAgIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiBtb2JpbGUgd2hlbiBvbmUg
d2FudHMgdG8gYXZvaWQgdGhlIDMwMG1zCi0gICAgICBjbGljayBkZWxheSB1c2luZyBzb21lIHNv
cnQgb2YgY3VzdG9tIGB0YXBgIGV2ZW50LgotCi0gICAgICBAcHJvcGVydHkgZXZlbnROYW1lCi0g
ICAgICBAdHlwZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0IGNsaWNrCi0gICAgKi8KLSAgICBldmVu
dE5hbWU6ICdjbGljaycsCi0KLSAgICAvLyB0aGlzIGlzIGRvYydlZCBoZXJlIHNvIGl0IHNob3dz
IHVwIGluIHRoZSBldmVudHMKLSAgICAvLyBzZWN0aW9uIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlv
biwgd2hpY2ggaXMgd2hlcmUKLSAgICAvLyBwZW9wbGUgd2lsbCBsaWtlbHkgZ28gbG9va2luZyBm
b3IgaXQuCi0gICAgLyoqCi0gICAgICBUcmlnZ2VycyB0aGUgYExpbmtWaWV3YCdzIHJvdXRpbmcg
YmVoYXZpb3IuIElmCi0gICAgICBgZXZlbnROYW1lYCBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgb3Ro
ZXIgdGhhbiBgY2xpY2tgCi0gICAgICB0aGUgcm91dGluZyBiZWhhdmlvciB3aWxsIHRyaWdnZXIg
b24gdGhhdCBjdXN0b20gZXZlbnQKLSAgICAgIGluc3RlYWQuCi0KLSAgICAgIEBldmVudCBjbGlj
awotICAgICoqLwotCi0gICAgLyoqCi0gICAgICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2FsbGVk
IHdoZW4gTGlua1ZpZXcgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLgotCi0gICAgICBFeGFtcGxl
OgotCi0gICAgICBgYGBqYXZhc2NyaXB0Ci0gICAgICBBcHAuTXlMaW5rVmlldyA9IEVtYmVyLkxp
bmtWaWV3LmV4dGVuZCh7Ci0gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgICAgICAgIHRo
aXMuX3N1cGVyKCk7Ci0gICAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnRXZlbnQgaXMgJyArIHRo
aXMuZ2V0KCdldmVudE5hbWUnKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgYGBgCi0K
LSAgICAgIE5PVEU6IElmIHlvdSBkbyBvdmVycmlkZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNs
YXNzIGxpa2UgYEVtYmVyLlZpZXdgIG9yCi0gICAgICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwg
YmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlcigpYCBpbiB5b3VyCi0gICAgICBgaW5pdGAgZGVj
bGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIgbWF5IG5vdCBoYXZlIGFuIG9wcG9ydHVuaXR5
IHRvCi0gICAgICBkbyBpbXBvcnRhbnQgc2V0dXAgd29yaywgYW5kIHlvdSdsbCBzZWUgc3RyYW5n
ZSBiZWhhdmlvciBpbiB5b3VyCi0gICAgICBhcHBsaWNhdGlvbi4KLQotICAgICAgQG1ldGhvZCBp
bml0Ci0gICAgKi8KLSAgICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuX3N1cGVyLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0KLSAgICAgIC8vIE1hcCBkZXNpcmVkIGV2ZW50IG5hbWUg
dG8gaW52b2tlIGZ1bmN0aW9uCi0gICAgICB2YXIgZXZlbnROYW1lID0gZ2V0KHRoaXMsICdldmVu
dE5hbWUnKSwgaTsKLSAgICAgIHRoaXMub24oZXZlbnROYW1lLCB0aGlzLCB0aGlzLl9pbnZva2Up
OwotCi0gICAgICAgICAgfSwKLQotICAgIC8qKgotICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tl
ZCBieSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJlCi0gICAgICB3
aGVuZXZlciB0aGUgcGFyYW1zIGNoYW5nZQotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQG1ldGhv
ZCBfcGFyYW1zQ2hhbmdlZAotICAgICAqLwotICAgIF9wYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbigp
IHsKLSAgICAgIHRoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoJ3Jlc29sdmVkUGFyYW1zJyk7Ci0g
ICAgfSwKLQotICAgIC8qKgotICAgICBUaGlzIGlzIGNhbGxlZCB0byBzZXR1cCBvYnNlcnZlcnMg
dGhhdCB3aWxsIHRyaWdnZXIgYSByZXJlbmRlci4KLQotICAgICBAcHJpdmF0ZQotICAgICBAbWV0
aG9kIF9zZXR1cFBhdGhPYnNlcnZlcnMKLSAgICAqKi8KLSAgICBfc2V0dXBQYXRoT2JzZXJ2ZXJz
OiBmdW5jdGlvbigpewotICAgICAgdmFyIGhlbHBlclBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRl
cnMsCi0gICAgICAgICAgbGlua1RleHRQYXRoICAgICA9IGhlbHBlclBhcmFtZXRlcnMub3B0aW9u
cy5saW5rVGV4dFBhdGgsCi0gICAgICAgICAgcGF0aHMgPSBnZXRSZXNvbHZlZFBhdGhzKGhlbHBl
clBhcmFtZXRlcnMpLAotICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKLSAgICAgICAg
ICBwYXRoLCBpLCBub3JtYWxpemVkUGF0aDsKLQotICAgICAgaWYgKGxpbmtUZXh0UGF0aCkgewot
ICAgICAgICBub3JtYWxpemVkUGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aCho
ZWxwZXJQYXJhbWV0ZXJzLmNvbnRleHQsIGxpbmtUZXh0UGF0aCwgaGVscGVyUGFyYW1ldGVycy5v
cHRpb25zLmRhdGEpOwotICAgICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZFBh
dGgucm9vdCwgbm9ybWFsaXplZFBhdGgucGF0aCwgdGhpcywgdGhpcy5yZXJlbmRlcik7Ci0gICAg
ICB9Ci0KLSAgICAgIGZvcihpPTA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICBwYXRoID0g
cGF0aHNbaV07Ci0gICAgICAgIGlmIChudWxsID09PSBwYXRoKSB7Ci0gICAgICAgICAgLy8gQSBs
aXRlcmFsIHZhbHVlIHdhcyBwcm92aWRlZCwgbm90IGEgcGF0aCwgc28gbm90aGluZyB0byBvYnNl
cnZlLgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbm9ybWFsaXpl
ZFBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoaGVscGVyUGFyYW1ldGVycy5j
b250ZXh0LCBwYXRoLCBoZWxwZXJQYXJhbWV0ZXJzLm9wdGlvbnMuZGF0YSk7Ci0gICAgICAgIHRo
aXMucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkUGF0aC5yb290LCBub3JtYWxpemVkUGF0aC5w
YXRoLCB0aGlzLCB0aGlzLl9wYXJhbXNDaGFuZ2VkKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAg
YWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKCl7Ci0gICAgICB0aGlzLl9zdXBlci5hcHBseSh0aGlzLCBh
cmd1bWVudHMpOwotICAgICAgdGhpcy5fc2V0dXBQYXRoT2JzZXJ2ZXJzKCk7Ci0gICAgfSwKLQot
ICAgIC8qKgotICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSBvYnNlcnZlcnMgaW5zdGFs
bGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJlCi0gICAgICB3aGVuZXZlciB0aGUgcXVlcnkgcGFy
YW1zIGNoYW5nZQotICAgICAgQHByaXZhdGUKLSAgICAgKi8KLSAgICBfcXVlcnlQYXJhbXNDaGFu
Z2VkOiBmdW5jdGlvbiAob2JqZWN0LCBwYXRoKSB7Ci0gICAgICB0aGlzLm5vdGlmeVByb3BlcnR5
Q2hhbmdlKCdxdWVyeVBhcmFtcycpOwotICAgIH0sCi0KLQotICAgIC8qKgotICAgICAgRXZlbiB0
aG91Z2ggdGhpcyBpc24ndCBhIHZpcnR1YWwgdmlldywgd2Ugd2FudCB0byB0cmVhdCBpdCBhcyBp
ZiBpdCBpcwotICAgICAgc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgcGFyZW50IHdpdGgge3t2
aWV3LnByb3B9fQotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQG1ldGhvZCBjb25jcmV0ZVZpZXcK
LSAgICAqKi8KLSAgICBjb25jcmV0ZVZpZXc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewot
ICAgICAgcmV0dXJuIGdldCh0aGlzLCAncGFyZW50VmlldycpOwotICAgIH0pLnByb3BlcnR5KCdw
YXJlbnRWaWV3JyksCi0KLSAgICAvKioKLQotICAgICAgQWNjZXNzZWQgYXMgYSBjbGFzc25hbWUg
YmluZGluZyB0byBhcHBseSB0aGUgYExpbmtWaWV3YCdzIGBkaXNhYmxlZENsYXNzYAotICAgICAg
Q1NTIGBjbGFzc2AgdG8gdGhlIGVsZW1lbnQgd2hlbiB0aGUgbGluayBpcyBkaXNhYmxlZC4KLQot
ICAgICAgV2hlbiBgdHJ1ZWAgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGVsZW1lbnQgd2lsbCBub3Qg
dHJpZ2dlciByb3V0ZSBjaGFuZ2VzLgotICAgICAgQHByb3BlcnR5IGRpc2FibGVkCi0gICAgKi8K
LSAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gY29tcHV0ZUxpbmtWaWV3RGlz
YWJsZWQoa2V5LCB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgdGhp
cy5zZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUpOyB9Ci0KLSAgICAgIHJldHVybiB2YWx1ZSA/IGdl
dCh0aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7Ci0gICAgfSksCi0KLSAgICAvKioKLSAg
ICAgIEFjY2Vzc2VkIGFzIGEgY2xhc3NuYW1lIGJpbmRpbmcgdG8gYXBwbHkgdGhlIGBMaW5rVmll
d2AncyBgYWN0aXZlQ2xhc3NgCi0gICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3aGVu
IHRoZSBsaW5rIGlzIGFjdGl2ZS4KLQotICAgICAgQSBgTGlua1ZpZXdgIGlzIGNvbnNpZGVyZWQg
YWN0aXZlIHdoZW4gaXRzIGBjdXJyZW50V2hlbmAgcHJvcGVydHkgaXMgYHRydWVgCi0gICAgICBv
ciB0aGUgYXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIGlzIHRoZSByb3V0ZSB0aGUgYExpbmtW
aWV3YCB3b3VsZCB0cmlnZ2VyCi0gICAgICB0cmFuc2l0aW9ucyBpbnRvLgotCi0gICAgICBAcHJv
cGVydHkgYWN0aXZlCi0gICAgKiovCi0gICAgYWN0aXZlOiBFbWJlci5jb21wdXRlZChmdW5jdGlv
biBjb21wdXRlTGlua1ZpZXdBY3RpdmUoKSB7Ci0gICAgICBpZiAoZ2V0KHRoaXMsICdsb2FkaW5n
JykpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAgIHZhciByb3V0ZXIgPSBnZXQodGhpcywgJ3Jv
dXRlcicpLAotICAgICAgICAgIHJvdXRlQXJncyA9IGdldCh0aGlzLCAncm91dGVBcmdzJyksCi0g
ICAgICAgICAgY29udGV4dHMgPSByb3V0ZUFyZ3Muc2xpY2UoMSksCi0gICAgICAgICAgcmVzb2x2
ZWRQYXJhbXMgPSBnZXQodGhpcywgJ3Jlc29sdmVkUGFyYW1zJyksCi0gICAgICAgICAgY3VycmVu
dFdoZW4gPSB0aGlzLmN1cnJlbnRXaGVuIHx8IHJlc29sdmVkUGFyYW1zWzBdLAotICAgICAgICAg
IGN1cnJlbnRXaXRoSW5kZXggPSBjdXJyZW50V2hlbiArICcuaW5kZXgnLAotICAgICAgICAgIGlz
QWN0aXZlID0gcm91dGVyLmlzQWN0aXZlLmFwcGx5KHJvdXRlciwgW2N1cnJlbnRXaGVuXS5jb25j
YXQoY29udGV4dHMpKSB8fAotICAgICAgICAgICAgICAgICAgICAgcm91dGVyLmlzQWN0aXZlLmFw
cGx5KHJvdXRlciwgW2N1cnJlbnRXaXRoSW5kZXhdLmNvbmNhdChjb250ZXh0cykpOwotCi0gICAg
ICBpZiAoaXNBY3RpdmUpIHsgcmV0dXJuIGdldCh0aGlzLCAnYWN0aXZlQ2xhc3MnKTsgfQotICAg
IH0pLnByb3BlcnR5KCdyZXNvbHZlZFBhcmFtcycsICdyb3V0ZUFyZ3MnLCAncm91dGVyLnVybCcp
LAotCi0gICAgLyoqCi0gICAgICBBY2Nlc3NlZCBhcyBhIGNsYXNzbmFtZSBiaW5kaW5nIHRvIGFw
cGx5IHRoZSBgTGlua1ZpZXdgJ3MgYGxvYWRpbmdDbGFzc2AKLSAgICAgIENTUyBgY2xhc3NgIHRv
IHRoZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgbG9hZGluZy4KLQotICAgICAgQSBgTGlua1Zp
ZXdgIGlzIGNvbnNpZGVyZWQgbG9hZGluZyB3aGVuIGl0IGhhcyBhdCBsZWFzdCBvbmUKLSAgICAg
IHBhcmFtZXRlciB3aG9zZSB2YWx1ZSBpcyBjdXJyZW50bHkgbnVsbCBvciB1bmRlZmluZWQuIER1
cmluZwotICAgICAgdGhpcyB0aW1lLCBjbGlja2luZyB0aGUgbGluayB3aWxsIHBlcmZvcm0gbm8g
dHJhbnNpdGlvbiBhbmQKLSAgICAgIGVtaXQgYSB3YXJuaW5nIHRoYXQgdGhlIGxpbmsgaXMgc3Rp
bGwgaW4gYSBsb2FkaW5nIHN0YXRlLgotCi0gICAgICBAcHJvcGVydHkgbG9hZGluZwotICAgICoq
LwotICAgIGxvYWRpbmc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld0xv
YWRpbmcoKSB7Ci0gICAgICBpZiAoIWdldCh0aGlzLCAncm91dGVBcmdzJykpIHsgcmV0dXJuIGdl
dCh0aGlzLCAnbG9hZGluZ0NsYXNzJyk7IH0KLSAgICB9KS5wcm9wZXJ0eSgncm91dGVBcmdzJyks
Ci0KLSAgICAvKioKLSAgICAgIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiByb3V0ZXIg
ZnJvbSB0aGUgY29udGFpbmVyLgotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQHByb3BlcnR5IHJv
dXRlcgotICAgICoqLwotICAgIHJvdXRlcjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7Ci0g
ICAgICByZXR1cm4gZ2V0KHRoaXMsICdjb250cm9sbGVyJykuY29udGFpbmVyLmxvb2t1cCgncm91
dGVyOm1haW4nKTsKLSAgICB9KSwKLQotICAgIC8qKgotICAgICAgRXZlbnQgaGFuZGxlciB0aGF0
IGludm9rZXMgdGhlIGxpbmssIGFjdGl2YXRpbmcgdGhlIGFzc29jaWF0ZWQgcm91dGUuCi0KLSAg
ICAgIEBwcml2YXRlCi0gICAgICBAbWV0aG9kIF9pbnZva2UKLSAgICAgIEBwYXJhbSB7RXZlbnR9
IGV2ZW50Ci0gICAgKi8KLSAgICBfaW52b2tlOiBmdW5jdGlvbihldmVudCkgewotICAgICAgaWYg
KCFpc1NpbXBsZUNsaWNrKGV2ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgICBpZiAodGhp
cy5wcmV2ZW50RGVmYXVsdCAhPT0gZmFsc2UpIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfQot
ICAgICAgaWYgKHRoaXMuYnViYmxlcyA9PT0gZmFsc2UpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9u
KCk7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAnX2lzRGlzYWJsZWQnKSkgeyByZXR1cm4gZmFs
c2U7IH0KLQotICAgICAgaWYgKGdldCh0aGlzLCAnbG9hZGluZycpKSB7Ci0gICAgICAgIEVtYmVy
LkxvZ2dlci53YXJuKCJUaGlzIGxpbmstdG8gaXMgaW4gYW4gaW5hY3RpdmUgbG9hZGluZyBzdGF0
ZSBiZWNhdXNlIGF0IGxlYXN0IG9uZSBvZiBpdHMgcGFyYW1ldGVycyBwcmVzZW50bHkgaGFzIGEg
bnVsbC91bmRlZmluZWQgdmFsdWUsIG9yIHRoZSBwcm92aWRlZCByb3V0ZSBuYW1lIGlzIGludmFs
aWQuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgdmFyIHJvdXRl
ciA9IGdldCh0aGlzLCAncm91dGVyJyksCi0gICAgICAgICAgcm91dGVBcmdzID0gZ2V0KHRoaXMs
ICdyb3V0ZUFyZ3MnKTsKLQotICAgICAgaWYgKGdldCh0aGlzLCAncmVwbGFjZScpKSB7Ci0gICAg
ICAgIHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIHJvdXRlQXJncyk7Ci0gICAgICB9
IGVsc2UgewotICAgICAgICByb3V0ZXIudHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgcm91dGVB
cmdzKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLyoqCi0gICAgICBDb21wdXRlZCBwcm9wZXJ0
eSB0aGF0IHJldHVybnMgdGhlIHJlc29sdmVkIHBhcmFtZXRlcnMuCi0KLSAgICAgIEBwcml2YXRl
Ci0gICAgICBAcHJvcGVydHkKLSAgICAgIEByZXR1cm4ge0FycmF5fQotICAgICAqLwotICAgIHJl
c29sdmVkUGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKLSAgICAgIHZhciBwYXJh
bWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzLAotICAgICAgICAgIG9wdGlvbnMgPSBwYXJhbWV0ZXJz
Lm9wdGlvbnMsCi0gICAgICAgICAgdHlwZXMgPSBvcHRpb25zLnR5cGVzLAotICAgICAgICAgIGRh
dGEgPSBvcHRpb25zLmRhdGE7Ci0KLSAgICAgIAotICAgICAgLy8gT3JpZ2luYWwgaW1wbGVtZW50
YXRpb24gaWYgcXVlcnkgcGFyYW1zIG5vdCBlbmFibGVkCi0gICAgICByZXR1cm4gcmVzb2x2ZVBh
cmFtcyhwYXJhbWV0ZXJzLmNvbnRleHQsIHBhcmFtZXRlcnMucGFyYW1zLCB7IHR5cGVzOiB0eXBl
cywgZGF0YTogZGF0YSB9KTsKLSAgICB9KS5wcm9wZXJ0eSgpLAotCi0gICAgLyoqCi0gICAgICBD
b21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcm91dGUgbmFtZSBhbmQK
LSAgICAgIGFueSBkeW5hbWljIHNlZ21lbnRzLgotCi0gICAgICBAcHJpdmF0ZQotICAgICAgQHBy
b3BlcnR5Ci0gICAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcm91dGUgbmFt
ZSBhbmQgYW55IGR5bmFtaWMgc2VnbWVudHMKLSAgICAgKi8KLSAgICByb3V0ZUFyZ3M6IEVtYmVy
LmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld1JvdXRlQXJncygpIHsKLSAgICAgIHZh
ciByZXNvbHZlZFBhcmFtcyA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJhbXMnKS5zbGljZSgwKSwK
LSAgICAgICAgICByb3V0ZXIgPSBnZXQodGhpcywgJ3JvdXRlcicpLAotICAgICAgICAgIG5hbWVk
Um91dGUgPSByZXNvbHZlZFBhcmFtc1swXTsKLQotICAgICAgaWYgKCFuYW1lZFJvdXRlKSB7IHJl
dHVybjsgfQotCi0gICAgICBuYW1lZFJvdXRlID0gZnVsbFJvdXRlTmFtZShyb3V0ZXIsIG5hbWVk
Um91dGUpOwotICAgICAgcmVzb2x2ZWRQYXJhbXNbMF0gPSBuYW1lZFJvdXRlOwotCi0gICAgICBm
b3IgKHZhciBpID0gMSwgbGVuID0gcmVzb2x2ZWRQYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyArK2kp
IHsKLSAgICAgICAgdmFyIHBhcmFtID0gcmVzb2x2ZWRQYXJhbXNbaV07Ci0gICAgICAgIGlmIChw
YXJhbSA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyYW0gPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAg
ICAgLy8gSWYgY29udGV4dHMgYXJlbid0IHByZXNlbnQsIGNvbnNpZGVyIHRoZSBsaW5rVmlldyB1
bmxvYWRlZC4KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAg
Ci0gICAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbXM7Ci0gICAgfSkucHJvcGVydHkoJ3Jlc29sdmVk
UGFyYW1zJywgJ3F1ZXJ5UGFyYW1zJywgJ3JvdXRlci51cmwnKSwKLQotCi0gICAgX3BvdGVudGlh
bFF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgbmFt
ZWRSb3V0ZSA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJhbXMnKVswXTsKLSAgICAgIGlmICghbmFt
ZWRSb3V0ZSkgeyByZXR1cm4gbnVsbDsgfQotICAgICAgdmFyIHJvdXRlciAgICAgICAgICA9IGdl
dCh0aGlzLCAncm91dGVyJyk7Ci0KLSAgICAgIG5hbWVkUm91dGUgPSBmdWxsUm91dGVOYW1lKHJv
dXRlciwgbmFtZWRSb3V0ZSk7Ci0KLSAgICAgIHJldHVybiByb3V0ZXIucm91dGVyLnF1ZXJ5UGFy
YW1zRm9ySGFuZGxlcihuYW1lZFJvdXRlKTsKLSAgICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJh
bXMnKSwKLQotICAgIHF1ZXJ5UGFyYW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7Ci0g
ICAgICB2YXIgc2VsZiAgICAgICAgICAgICAgPSB0aGlzLAotICAgICAgICBxdWVyeVBhcmFtcyAg
ICAgICAgID0gbnVsbCwKLSAgICAgICAgYWxsb3dlZFF1ZXJ5UGFyYW1zICA9IGdldCh0aGlzLCAn
X3BvdGVudGlhbFF1ZXJ5UGFyYW1zJyk7Ci0KLSAgICAgIGlmICghYWxsb3dlZFF1ZXJ5UGFyYW1z
KSB7IHJldHVybiBudWxsOyB9Ci0gICAgICBhbGxvd2VkUXVlcnlQYXJhbXMuZm9yRWFjaChmdW5j
dGlvbiAocGFyYW0pIHsKLSAgICAgICAgdmFyIHZhbHVlID0gZ2V0KHNlbGYsIHBhcmFtKTsKLSAg
ICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICBxdWVy
eVBhcmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9OwotICAgICAgICAgIHF1ZXJ5UGFyYW1zW3BhcmFt
XSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotCi0gICAgICByZXR1cm4gcXVlcnlQ
YXJhbXM7Ci0gICAgfSkucHJvcGVydHkoJ19wb3RlbnRpYWxRdWVyeVBhcmFtcy5bXScpLAotCi0g
ICAgLyoqCi0gICAgICBTZXRzIHRoZSBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0ZSB0byB0aGUg
dXJsIGZvcgotICAgICAgdGhlIGBMaW5rVmlld2AncyB0YXJnZXRlZCByb3V0ZS4KLQotICAgICAg
SWYgdGhlIGBMaW5rVmlld2AncyBgdGFnTmFtZWAgaXMgY2hhbmdlZCB0byBhIHZhbHVlIG90aGVy
Ci0gICAgICB0aGFuIGBhYCwgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCi0KLSAgICAg
IEBwcm9wZXJ0eSBocmVmCi0gICAgKiovCi0gICAgaHJlZjogRW1iZXIuY29tcHV0ZWQoZnVuY3Rp
b24gY29tcHV0ZUxpbmtWaWV3SHJlZigpIHsKLSAgICAgIGlmIChnZXQodGhpcywgJ3RhZ05hbWUn
KSAhPT0gJ2EnKSB7IHJldHVybjsgfQotCi0gICAgICB2YXIgcm91dGVyID0gZ2V0KHRoaXMsICdy
b3V0ZXInKSwKLSAgICAgICAgICByb3V0ZUFyZ3MgPSBnZXQodGhpcywgJ3JvdXRlQXJncycpOwot
Ci0gICAgICByZXR1cm4gcm91dGVBcmdzID8gcm91dGVyLmdlbmVyYXRlLmFwcGx5KHJvdXRlciwg
cm91dGVBcmdzKSA6IGdldCh0aGlzLCAnbG9hZGluZ0hyZWYnKTsKLSAgICB9KS5wcm9wZXJ0eSgn
cm91dGVBcmdzJyksCi0KLSAgICAvKioKLSAgICAgIFRoZSBkZWZhdWx0IGhyZWYgdmFsdWUgdG8g
dXNlIHdoaWxlIGEgbGluay10byBpcyBsb2FkaW5nLgotICAgICAgT25seSBhcHBsaWVzIHdoZW4g
dGFnTmFtZSBpcyAnYScKLQotICAgICAgQHByb3BlcnR5IGxvYWRpbmdIcmVmCi0gICAgICBAdHlw
ZSBTdHJpbmcKLSAgICAgIEBkZWZhdWx0ICMKLSAgICAqLwotICAgIGxvYWRpbmdIcmVmOiAnIycK
LSAgfSk7Ci0KLSAgTGlua1ZpZXcudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJMaW5r
VmlldyI7IH07Ci0KLSAgLyoqCi0gICAgVGhlIGB7e2xpbmstdG99fWAgaGVscGVyIHJlbmRlcnMg
YSBsaW5rIHRvIHRoZSBzdXBwbGllZAotICAgIGByb3V0ZU5hbWVgIHBhc3NpbmcgYW4gb3B0aW9u
YWxseSBzdXBwbGllZCBtb2RlbCB0byB0aGUKLSAgICByb3V0ZSBhcyBpdHMgYG1vZGVsYCBjb250
ZXh0IG9mIHRoZSByb3V0ZS4gVGhlIGJsb2NrCi0gICAgZm9yIGB7e2xpbmstdG99fWAgYmVjb21l
cyB0aGUgaW5uZXJIVE1MIG9mIHRoZSByZW5kZXJlZAotICAgIGVsZW1lbnQ6Ci0KLSAgICBgYGBo
YW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5J319Ci0gICAgICBHcmVhdCBI
YW1zdGVyIFBob3RvcwotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAot
ICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3RvcyI+Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3Rv
cwotICAgIDwvYT4KLSAgICBgYGAKLQotICAgICMjIyBTdXBwbHlpbmcgYSB0YWdOYW1lCi0gICAg
QnkgZGVmYXVsdCBge3tsaW5rLXRvfX1gIHJlbmRlcnMgYW4gYDxhPmAgZWxlbWVudC4gVGhpcyBj
YW4KLSAgICBiZSBvdmVycmlkZGVuIGZvciBhIHNpbmdsZSB1c2Ugb2YgYHt7bGluay10b319YCBi
eSBzdXBwbHlpbmcKLSAgICBhIGB0YWdOYW1lYCBvcHRpb246Ci0KLSAgICBgYGBoYW5kbGViYXJz
Ci0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyB0YWdOYW1lPSJsaSJ9fQotICAgICAgR3Jl
YXQgSGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAKLQotICAgIGBgYGh0
bWwKLSAgICA8bGk+Ci0gICAgICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIDwvbGk+Ci0gICAg
YGBgCi0KLSAgICBUbyBvdmVycmlkZSB0aGlzIG9wdGlvbiBmb3IgeW91ciBlbnRpcmUgYXBwbGlj
YXRpb24sIHNlZQotICAgICJPdmVycmlkaW5nIEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgot
Ci0gICAgIyMjIERpc2FibGluZyB0aGUgYGxpbmstdG9gIGhlbHBlcgotICAgIEJ5IGRlZmF1bHQg
YHt7bGluay10b319YCBpcyBlbmFibGVkLgotICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2Fi
bGVkYCBoZWxwZXIgcHJvcGVydHkgd2lsbCBkaXNhYmxlIHRoZSBgbGluay10b2AgaGVscGVyLgot
Ci0gICAgc3RhdGljIHVzZTogdGhlIGBkaXNhYmxlZGAgb3B0aW9uOgotCi0gICAgYGBgaGFuZGxl
YmFycwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWQ9dHJ1ZX19Ci0gICAg
ICBHcmVhdCBIYW1zdGVyIFBob3RvcwotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAg
ZHluYW1pYyB1c2U6IHRoZSBgZGlzYWJsZWRXaGVuYCBvcHRpb246Ci0KLSAgICBgYGBoYW5kbGVi
YXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBkaXNhYmxlZFdoZW49Y29udHJvbGxl
ci5zb21lUHJvcGVydHl9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKLSAgICB7ey9saW5r
LXRvfX0KLSAgICBgYGAKLQotICAgIGFueSBwYXNzZWQgdmFsdWUgdG8gYGRpc2FibGVkYCB3aWxs
IGRpc2FibGUgaXQgZXhjZXB0IGB1bmRlZmluZWRgLgotICAgIHRvIGVuc3VyZSB0aGF0IG9ubHkg
YHRydWVgIGRpc2FibGUgdGhlIGBsaW5rLXRvYCBoZWxwZXIgeW91IGNhbgotICAgIG92ZXJyaWRl
IHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBFbWJlci5MaW5rVmlld2AuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgRW1iZXIuTGlua1ZpZXcucmVvcGVuKHsKLSAgICAgIGRpc2FibGVkOiBFbWJl
ci5jb21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPT0g
dW5kZWZpbmVkKSB7Ci0gICAgICAgICAgdGhpcy5zZXQoJ19pc0Rpc2FibGVkJywgdmFsdWUgPT09
IHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IGdldCh0
aGlzLCAnZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7Ci0gICAgICB9KQotICAgIH0pOwotICAgIGBg
YAotCi0gICAgc2VlICJPdmVycmlkaW5nIEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiIGZvciBt
b3JlLgotCi0gICAgIyMjIEhhbmRsaW5nIGBocmVmYAotICAgIGB7e2xpbmstdG99fWAgd2lsbCB1
c2UgeW91ciBhcHBsaWNhdGlvbidzIFJvdXRlciB0bwotICAgIGZpbGwgdGhlIGVsZW1lbnQncyBg
aHJlZmAgcHJvcGVydHkgd2l0aCBhIHVybCB0aGF0Ci0gICAgbWF0Y2hlcyB0aGUgcGF0aCB0byB0
aGUgc3VwcGxpZWQgYHJvdXRlTmFtZWAgZm9yIHlvdXIKLSAgICByb3V0ZXJzJ3MgY29uZmlndXJl
ZCBgTG9jYXRpb25gIHNjaGVtZSwgd2hpY2ggZGVmYXVsdHMKLSAgICB0byBFbWJlci5IYXNoTG9j
YXRpb24uCi0KLSAgICAjIyMgSGFuZGxpbmcgY3VycmVudCByb3V0ZQotICAgIGB7e2xpbmstdG99
fWAgd2lsbCBhcHBseSBhIENTUyBjbGFzcyBuYW1lIG9mICdhY3RpdmUnCi0gICAgd2hlbiB0aGUg
YXBwbGljYXRpb24ncyBjdXJyZW50IHJvdXRlIG1hdGNoZXMKLSAgICB0aGUgc3VwcGxpZWQgcm91
dGVOYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uJ3MKLSAgICBjdXJyZW50IHJv
dXRlIGlzICdwaG90b0dhbGxlcnkucmVjZW50JyB0aGUgZm9sbG93aW5nCi0gICAgdXNlIG9mIGB7
e2xpbmstdG99fWA6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9H
YWxsZXJ5LnJlY2VudCd9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MgZnJvbSB0aGUgbGFz
dCB3ZWVrCi0gICAge3svbGluay10b319Ci0gICAgYGBgCi0KLSAgICB3aWxsIHJlc3VsdCBpbgot
Ci0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy90aGlzLXdlZWsiIGNs
YXNzPSJhY3RpdmUiPgotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKLSAgICA8L2E+Ci0gICAg
YGBgCi0KLSAgICBUaGUgQ1NTIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIGNsYXNzZXMgY2Fu
IGJlIGN1c3RvbWl6ZWQKLSAgICBmb3IgYSBzaW5nbGUgdXNlIG9mIGB7e2xpbmstdG99fWAgYnkg
cGFzc2luZyBhbiBgYWN0aXZlQ2xhc3NgCi0gICAgb3B0aW9uOgotCi0gICAgYGBgaGFuZGxlYmFy
cwotICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIGFjdGl2ZUNsYXNzPSJjdXJy
ZW50LXVybCJ9fQotICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MgZnJvbSB0aGUgbGFzdCB3ZWVr
Ci0gICAge3svbGluay10b319Ci0gICAgYGBgCi0KLSAgICBgYGBodG1sCi0gICAgPGEgaHJlZj0i
L2hhbXN0ZXItcGhvdG9zL3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KLSAgICAgIEdy
ZWF0IEhhbXN0ZXIgUGhvdG9zCi0gICAgPC9hPgotICAgIGBgYAotCi0gICAgVG8gb3ZlcnJpZGUg
dGhpcyBvcHRpb24gZm9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBzZWUKLSAgICAiT3ZlcnJp
ZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRzIi4KLQotICAgICMjIyBTdXBwbHlpbmcgYSBt
b2RlbAotICAgIEFuIG9wdGlvbmFsIG1vZGVsIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGZvciByb3V0
ZXMgd2hvc2UKLSAgICBwYXRocyBjb250YWluIGR5bmFtaWMgc2VnbWVudHMuIFRoaXMgYXJndW1l
bnQgd2lsbCBiZWNvbWUKLSAgICB0aGUgbW9kZWwgY29udGV4dCBvZiB0aGUgbGlua2VkIHJvdXRl
OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewot
ICAgICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxsZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rv
cy86cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0g
ICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBhUGhvdG99fQotICAgICAge3thUGhvdG8udGl0
bGV9fQotICAgIHt7L2xpbmstdG99fQotICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhy
ZWY9Ii9oYW1zdGVyLXBob3Rvcy80MiI+Ci0gICAgICBUb21zdGVyCi0gICAgPC9hPgotICAgIGBg
YAotCi0gICAgIyMjIFN1cHBseWluZyBtdWx0aXBsZSBtb2RlbHMKLSAgICBGb3IgZGVlcC1saW5r
aW5nIHRvIHJvdXRlIHBhdGhzIHRoYXQgY29udGFpbiBtdWx0aXBsZQotICAgIGR5bmFtaWMgc2Vn
bWVudHMsIG11bHRpcGxlIG1vZGVsIGFyZ3VtZW50cyBjYW4gYmUgdXNlZC4KLSAgICBBcyB0aGUg
cm91dGVyIHRyYW5zaXRpb25zIHRocm91Z2ggdGhlIHJvdXRlIHBhdGgsIGVhY2gKLSAgICBzdXBw
bGllZCBtb2RlbCBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgY29udGV4dCBmb3IgdGhlCi0gICAg
cm91dGUgd2l0aCB0aGUgZHluYW1pYyBzZWdtZW50czoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAg
ICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMucmVzb3VyY2UoInBob3Rv
R2FsbGVyeSIsIHtwYXRoOiAiaGFtc3Rlci1waG90b3MvOnBob3RvX2lkIn0sIGZ1bmN0aW9uKCkg
ewotICAgICAgICB0aGlzLnJvdXRlKCJjb21tZW50Iiwge3BhdGg6ICJjb21tZW50cy86Y29tbWVu
dF9pZCJ9KTsKLSAgICAgIH0pOwotICAgIH0pOwotICAgIGBgYAotICAgIFRoaXMgYXJndW1lbnQg
d2lsbCBiZWNvbWUgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtlZCByb3V0ZToKLQotICAg
IGBgYGhhbmRsZWJhcnMKLSAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnkuY29tbWVudCcgYVBo
b3RvIGNvbW1lbnR9fQotICAgICAge3tjb21tZW50LmJvZHl9fQotICAgIHt7L2xpbmstdG99fQot
ICAgIGBgYAotCi0gICAgYGBgaHRtbAotICAgIDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9j
b21tZW50LzcxOCI+Ci0gICAgICBBKysrIHdvdWxkIHNudWdnbGUgYWdhaW4uCi0gICAgPC9hPgot
ICAgIGBgYAotCi0gICAgIyMjIFN1cHBseWluZyBhbiBleHBsaWNpdCBkeW5hbWljIHNlZ21lbnQg
dmFsdWUKLSAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIG1vZGVsIG9iamVjdCBhdmFpbGFibGUgdG8g
cGFzcyB0byBge3tsaW5rLXRvfX1gLAotICAgIGFuIG9wdGlvbmFsIHN0cmluZyBvciBpbnRlZ2Vy
IGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgZm9yIHJvdXRlcyB3aG9zZQotICAgIHBhdGhzIGNvbnRh
aW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1bWVudCB3aWxsIGJlY29tZSB0aGUgdmFsdWUK
LSAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50OgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFw
cC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgICAgdGhpcy5yZXNvdXJjZSgicGhvdG9HYWxs
ZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86cGhvdG9faWQifSk7Ci0gICAgfSk7Ci0gICAg
YGBgCi0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBh
UGhvdG9JZH19Ci0gICAgICB7e2FQaG90by50aXRsZX19Ci0gICAge3svbGluay10b319Ci0gICAg
YGBgCi0KLSAgICBgYGBodG1sCi0gICAgPGEgaHJlZj0iL2hhbXN0ZXItcGhvdG9zLzQyIj4KLSAg
ICAgIFRvbXN0ZXIKLSAgICA8L2E+Ci0gICAgYGBgCi0KLSAgICBXaGVuIHRyYW5zaXRpb25pbmcg
aW50byB0aGUgbGlua2VkIHJvdXRlLCB0aGUgYG1vZGVsYCBob29rIHdpbGwKLSAgICBiZSB0cmln
Z2VyZWQgd2l0aCBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVyLgot
Ci0gICAgIyMjIEFsbG93aW5nIERlZmF1bHQgQWN0aW9uCi0KLSAgIEJ5IGRlZmF1bHQgdGhlIGB7
e2xpbmstdG99fWAgaGVscGVyIHByZXZlbnRzIHRoZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uCi0g
ICBieSBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdCgpYCBhcyB0aGlzIHNvcnQgb2YgYWN0aW9uIGJ1
YmJsaW5nIGlzIG5vcm1hbGx5Ci0gICBoYW5kbGVkIGludGVybmFsbHkgYW5kIHdlIGRvIG5vdCB3
YW50IHRvIHRha2UgdGhlIGJyb3dzZXIgdG8gYSBuZXcgVVJMIChmb3IKLSAgIGV4YW1wbGUpLgot
Ci0gICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHNwZWNpZnkgYHByZXZl
bnREZWZhdWx0PWZhbHNlYCBpbgotICAgeW91ciB0ZW1wbGF0ZToKLQotICAgIGBgYGhhbmRsZWJh
cnMKLSAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnknIGFQaG90b0lkIHByZXZlbnREZWZhdWx0
PWZhbHNlfX0KLSAgICAgIHt7YVBob3RvSWQudGl0bGV9fQotICAgIHt7L2xpbmstdG99fQotICAg
IGBgYAotCi0gICAgIyMjIE92ZXJyaWRpbmcgYXR0cmlidXRlcwotICAgIFlvdSBjYW4gb3ZlcnJp
ZGUgYW55IGdpdmVuIHByb3BlcnR5IG9mIHRoZSBFbWJlci5MaW5rVmlldwotICAgIHRoYXQgaXMg
Z2VuZXJhdGVkIGJ5IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciBieSBwYXNzaW5nCi0gICAga2V5
L3ZhbHVlIHBhaXJzLCBsaWtlIHNvOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2xpbmst
dG8gIGFQaG90byB0YWdOYW1lPSdsaScgdGl0bGU9J0ZvbGxvd2luZyB0aGlzIGxpbmsgd2lsbCBj
aGFuZ2UgeW91ciBsaWZlJyBjbGFzc05hbWVzPSdwaWMgc3dlZXQnfX0KLSAgICAgIFVoLW1hemlu
ZyEKLSAgICB7ey9saW5rLXRvfX0KLSAgICBgYGAKLQotICAgIFNlZSBbRW1iZXIuTGlua1ZpZXdd
KC9hcGkvY2xhc3Nlcy9FbWJlci5MaW5rVmlldy5odG1sKSBmb3IgYQotICAgIGNvbXBsZXRlIGxp
c3Qgb2Ygb3ZlcnJpZGVhYmxlIHByb3BlcnRpZXMuIEJlIHN1cmUgdG8gYWxzbwotICAgIGNoZWNr
IG91dCBpbmhlcml0ZWQgcHJvcGVydGllcyBvZiBgTGlua1ZpZXdgLgotCi0gICAgIyMjIE92ZXJy
aWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0cwotICAgIGBge3tsaW5rLXRvfX1gYCBjcmVh
dGVzIGFuIGluc3RhbmNlIG9mIEVtYmVyLkxpbmtWaWV3Ci0gICAgZm9yIHJlbmRlcmluZy4gVG8g
b3ZlcnJpZGUgb3B0aW9ucyBmb3IgeW91ciBlbnRpcmUKLSAgICBhcHBsaWNhdGlvbiwgcmVvcGVu
IEVtYmVyLkxpbmtWaWV3IGFuZCBzdXBwbHkgdGhlCi0gICAgZGVzaXJlZCB2YWx1ZXM6Ci0KLSAg
ICBgYGAgamF2YXNjcmlwdAotICAgIEVtYmVyLkxpbmtWaWV3LnJlb3Blbih7Ci0gICAgICBhY3Rp
dmVDbGFzczogImlzLWFjdGl2ZSIsCi0gICAgICB0YWdOYW1lOiAnbGknCi0gICAgfSkKLSAgICBg
YGAKLQotICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZl
bnQgaW4KLSAgICB0aGlzIG1hbm5lcjoKLQotICAgIGBgYCBqYXZhc2NyaXB0Ci0gICAgRW1iZXIu
TGlua1ZpZXcucmVvcGVuKHsKLSAgICAgIGV2ZW50TmFtZTogJ2N1c3RvbUV2ZW50TmFtZScKLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgbGluay10bwotICAgIEBmb3IgRW1iZXIuSGFu
ZGxlYmFycy5oZWxwZXJzCi0gICAgQHBhcmFtIHtTdHJpbmd9IHJvdXRlTmFtZQotICAgIEBwYXJh
bSB7T2JqZWN0fSBbY29udGV4dF0qCi0gICAgQHBhcmFtIFtvcHRpb25zXSB7T2JqZWN0fSBIYW5k
bGViYXJzIGtleS92YWx1ZSBwYWlycyBvZiBvcHRpb25zLCB5b3UgY2FuIG92ZXJyaWRlIGFueSBw
cm9wZXJ0eSBvZiBFbWJlci5MaW5rVmlldwotICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJp
bmcKLSAgICBAc2VlIHtFbWJlci5MaW5rVmlld30KLSAgKi8KLSAgRW1iZXIuSGFuZGxlYmFycy5y
ZWdpc3RlckhlbHBlcignbGluay10bycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcihuYW1lKSB7Ci0g
ICAgdmFyIG9wdGlvbnMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAotICAgICAg
ICBwYXJhbXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpLAotICAgICAgICBoYXNo
ID0gb3B0aW9ucy5oYXNoOwotCi0gICAgaGFzaC5kaXNhYmxlZEJpbmRpbmcgPSBoYXNoLmRpc2Fi
bGVkV2hlbjsKLQotICAgIGlmICghb3B0aW9ucy5mbikgewotICAgICAgdmFyIGxpbmtUaXRsZSA9
IHBhcmFtcy5zaGlmdCgpOwotICAgICAgdmFyIGxpbmtUeXBlID0gb3B0aW9ucy50eXBlcy5zaGlm
dCgpOwotICAgICAgdmFyIGNvbnRleHQgPSB0aGlzOwotICAgICAgaWYgKGxpbmtUeXBlID09PSAn
SUQnKSB7Ci0gICAgICAgIG9wdGlvbnMubGlua1RleHRQYXRoID0gbGlua1RpdGxlOwotICAgICAg
ICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgcmV0dXJuIEVtYmVyLkhhbmRs
ZWJhcnMuZ2V0KGNvbnRleHQsIGxpbmtUaXRsZSwgb3B0aW9ucyk7Ci0gICAgICAgIH07Ci0gICAg
ICB9IGVsc2UgewotICAgICAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
cmV0dXJuIGxpbmtUaXRsZTsKLSAgICAgICAgfTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBoYXNo
LnBhcmFtZXRlcnMgPSB7Ci0gICAgICBjb250ZXh0OiB0aGlzLAotICAgICAgb3B0aW9uczogb3B0
aW9ucywKLSAgICAgIHBhcmFtczogcGFyYW1zCi0gICAgfTsKLQotICAgIHJldHVybiBFbWJlci5I
YW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsIExpbmtWaWV3LCBvcHRpb25zKTsKLSAg
fSk7Ci0KLSAgLyoqCi0gICAgU2VlIFtsaW5rLXRvXSgvYXBpL2NsYXNzZXMvRW1iZXIuSGFuZGxl
YmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2xpbmstdG8pCi0KLSAgICBAbWV0aG9kIGxpbmtUbwot
ICAgIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQGRlcHJlY2F0ZWQKLSAgICBA
cGFyYW0ge1N0cmluZ30gcm91dGVOYW1lCi0gICAgQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoK
LSAgICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJh
cnMucmVnaXN0ZXJIZWxwZXIoJ2xpbmtUbycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcigpIHsKLSAg
ICBFbWJlci53YXJuKCJUaGUgJ2xpbmtUbycgdmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBm
YXZvciBvZiAnbGluay10byciKTsKLSAgICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz
WydsaW5rLXRvJ10uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKLSAgfSk7Ci19KTsKLQotCi0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUg
ZW1iZXItcm91dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0
OwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5kbGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykg
ewotICAvKioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSAg
Ki8KLQotICBIYW5kbGViYXJzLk91dGxldFZpZXcgPSBFbWJlci5Db250YWluZXJWaWV3LmV4dGVu
ZChFbWJlci5fTWV0YW1vcnBoKTsKLQotICAvKioKLSAgICBUaGUgYG91dGxldGAgaGVscGVyIGlz
IGEgcGxhY2Vob2xkZXIgdGhhdCB0aGUgcm91dGVyIHdpbGwgZmlsbCBpbiB3aXRoCi0gICAgdGhl
IGFwcHJvcHJpYXRlIHRlbXBsYXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBh
cHBsaWNhdGlvbi4KLQotICAgIGBgYCBoYW5kbGViYXJzCi0gICAge3tvdXRsZXR9fQotICAgIGBg
YAotCi0gICAgQnkgZGVmYXVsdCwgYSB0ZW1wbGF0ZSBiYXNlZCBvbiBFbWJlcidzIG5hbWluZyBj
b252ZW50aW9ucyB3aWxsIGJlIHJlbmRlcmVkCi0gICAgaW50byB0aGUgYG91dGxldGAgKGUuZy4g
YEFwcC5Qb3N0c1JvdXRlYCB3aWxsIHJlbmRlciB0aGUgYHBvc3RzYCB0ZW1wbGF0ZSkuCi0KLSAg
ICBZb3UgY2FuIHJlbmRlciBhIGRpZmZlcmVudCB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgYHJlbmRl
cigpYCBtZXRob2QgaW4gdGhlCi0gICAgcm91dGUncyBgcmVuZGVyVGVtcGxhdGVgIGhvb2suIFRo
ZSBmb2xsb3dpbmcgd2lsbCByZW5kZXIgdGhlIGBmYXZvcml0ZVBvc3RgCi0gICAgdGVtcGxhdGUg
aW50byB0aGUgYG91dGxldGAuCi0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5Qb3N0c1Jv
dXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBmdW5jdGlv
bigpIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcpOwotICAgICAgfQotICAg
IH0pOwotICAgIGBgYAotCi0gICAgWW91IGNhbiBjcmVhdGUgY3VzdG9tIG5hbWVkIG91dGxldHMg
Zm9yIG1vcmUgY29udHJvbC4KLQotICAgIGBgYCBoYW5kbGViYXJzCi0gICAge3tvdXRsZXQgJ2Zh
dm9yaXRlUG9zdCd9fQotICAgIHt7b3V0bGV0ICdwb3N0cyd9fQotICAgIGBgYAotCi0gICAgVGhl
biB5b3UgY2FuIGRlZmluZSB3aGF0IHRlbXBsYXRlIGlzIHJlbmRlcmVkIGludG8gZWFjaCBvdXRs
ZXQgaW4geW91cgotICAgIHJvdXRlLgotCi0KLSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5Q
b3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICAgIHJlbmRlclRlbXBsYXRlOiBm
dW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcsIHsgb3V0bGV0
OiAnZmF2b3JpdGVQb3N0JyB9KTsKLSAgICAgICAgdGhpcy5yZW5kZXIoJ3Bvc3RzJywgeyBvdXRs
ZXQ6ICdwb3N0cycgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBZb3UgY2Fu
IHNwZWNpZnkgdGhlIHZpZXcgdGhhdCB0aGUgb3V0bGV0IHVzZXMgdG8gY29udGFpbiBhbmQgbWFu
YWdlIHRoZQotICAgIHRlbXBsYXRlcyByZW5kZXJlZCBpbnRvIGl0LgotCi0gICAgYGBgIGhhbmRs
ZWJhcnMKLSAgICB7e291dGxldCB2aWV3PSdzZWN0aW9uQ29udGFpbmVyJ319Ci0gICAgYGBgCi0K
LSAgICBgYGAgamF2YXNjcmlwdAotICAgIEFwcC5TZWN0aW9uQ29udGFpbmVyID0gRW1iZXIuQ29u
dGFpbmVyVmlldy5leHRlbmQoewotICAgICAgdGFnTmFtZTogJ3NlY3Rpb24nLAotICAgICAgY2xh
c3NOYW1lczogWydzcGVjaWFsJ10KLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2Qgb3V0
bGV0Ci0gICAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKLSAgICBAcGFyYW0ge1N0cmlu
Z30gcHJvcGVydHkgdGhlIHByb3BlcnR5IG9uIHRoZSBjb250cm9sbGVyCi0gICAgICB0aGF0IGhv
bGRzIHRoZSB2aWV3IGZvciB0aGlzIG91dGxldAotICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBz
dHJpbmcKLSAgKi8KLSAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignb3V0bGV0JywgZnVuY3Rp
b24gb3V0bGV0SGVscGVyKHByb3BlcnR5LCBvcHRpb25zKSB7Ci0gICAKLSAgICB2YXIgb3V0bGV0
U291cmNlLAotICAgICAgICBjb250YWluZXIsCi0gICAgICAgIHZpZXdOYW1lLAotICAgICAgICB2
aWV3Q2xhc3MsCi0gICAgICAgIHZpZXdGdWxsTmFtZTsKLQotICAgIGlmIChwcm9wZXJ0eSAmJiBw
cm9wZXJ0eS5kYXRhICYmIHByb3BlcnR5LmRhdGEuaXNSZW5kZXJEYXRhKSB7Ci0gICAgICBvcHRp
b25zID0gcHJvcGVydHk7Ci0gICAgICBwcm9wZXJ0eSA9ICdtYWluJzsKLSAgICB9Ci0KLSAgICBj
b250YWluZXIgPSBvcHRpb25zLmRhdGEudmlldy5jb250YWluZXI7Ci0KLSAgICBvdXRsZXRTb3Vy
Y2UgPSBvcHRpb25zLmRhdGEudmlldzsKLSAgICB3aGlsZSAoIW91dGxldFNvdXJjZS5nZXQoJ3Rl
bXBsYXRlLmlzVG9wJykpIHsKLSAgICAgIG91dGxldFNvdXJjZSA9IG91dGxldFNvdXJjZS5nZXQo
J19wYXJlbnRWaWV3Jyk7Ci0gICAgfQotCi0gICAgLy8gcHJvdmlkZSBjb250cm9sbGVyIG92ZXJy
aWRlCi0gICAgdmlld05hbWUgPSBvcHRpb25zLmhhc2gudmlldzsKLQotICAgIGlmICh2aWV3TmFt
ZSkgewotICAgICAgdmlld0Z1bGxOYW1lID0gJ3ZpZXc6JyArIHZpZXdOYW1lOwotICAgICAgRW1i
ZXIuYXNzZXJ0KCJVc2luZyBhIHF1b3RlbGVzcyB2aWV3IHBhcmFtZXRlciB3aXRoIHt7b3V0bGV0
fX0gaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0byBxdW90ZWQgdXNhZ2UgJ3t7b3V0
bGV0IFwiIiArIHZpZXdOYW1lICsgIlwifX0uIiwgb3B0aW9ucy5oYXNoVHlwZXMudmlldyAhPT0g
J0lEJyk7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRoZSB2aWV3IG5hbWUgeW91IHN1cHBsaWVkICci
ICsgdmlld05hbWUgKyAiJyBkaWQgbm90IHJlc29sdmUgdG8gYSB2aWV3LiIsIGNvbnRhaW5lci5o
YXModmlld0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgdmlld0NsYXNzID0gdmlld05hbWUgPyBj
b250YWluZXIubG9va3VwRmFjdG9yeSh2aWV3RnVsbE5hbWUpIDogb3B0aW9ucy5oYXNoLnZpZXdD
bGFzcyB8fCBIYW5kbGViYXJzLk91dGxldFZpZXc7Ci0KLSAgICBvcHRpb25zLmRhdGEudmlldy5z
ZXQoJ291dGxldFNvdXJjZScsIG91dGxldFNvdXJjZSk7Ci0gICAgb3B0aW9ucy5oYXNoLmN1cnJl
bnRWaWV3QmluZGluZyA9ICdfdmlldy5vdXRsZXRTb3VyY2UuX291dGxldHMuJyArIHByb3BlcnR5
OwotCi0gICAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywgdmlld0Ns
YXNzLCBvcHRpb25zKTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIg
Z2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Ci1FbWJlci5vbkxvYWQoJ0VtYmVyLkhh
bmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7Ci0KLSAgLyoqCi0gICAgQ2FsbGluZyBg
YHt7cmVuZGVyfX1gYCBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIHdpbGwgaW5zZXJ0IGFub3RoZXIK
LSAgICB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIG5hbWUuIFRoZSBpbnNlcnRl
ZCB0ZW1wbGF0ZSB3aWxsCi0gICAgYWNjZXNzIGl0cyBwcm9wZXJ0aWVzIG9uIGl0cyBvd24gY29u
dHJvbGxlciAocmF0aGVyIHRoYW4gdGhlIGNvbnRyb2xsZXIKLSAgICBvZiB0aGUgcGFyZW50IHRl
bXBsYXRlKS4KLQotICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3Rz
LCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4KLQotICAgIE5vdGU6IEEgZ2l2ZW4g
Y29udHJvbGxlciBtYXkgb25seSBiZSB1c2VkICpvbmNlKiBpbiB5b3VyIGFwcCBpbiB0aGlzIG1h
bm5lci4KLSAgICBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgY29udHJvbGxlciB3aWxsIGJl
IGNyZWF0ZWQgZm9yIHlvdS4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0g
ICAgQXBwLk5hdmlnYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewot
ICAgICAgd2hvOiAid29ybGQiCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBgYGBoYW5kbGViYXJz
Ci0gICAgPCEtLSBuYXZpZ2F0aW9uLmhicyAtLT4KLSAgICBIZWxsbywge3t3aG99fS4KLSAgICBg
YGAKLQotICAgIGBgYGhhbmRlbGJhcnMKLSAgICA8IS0tIGFwcGxpY2F0aW9uLmhicyAtLT4KLSAg
ICA8aDE+TXkgZ3JlYXQgYXBwPC9oMT4KLSAgICB7e3JlbmRlciBuYXZpZ2F0aW9ufX0KLSAgICBg
YGAKLQotICAgIGBgYGh0bWwKLSAgICA8aDE+TXkgZ3JlYXQgYXBwPC9oMT4KLSAgICA8ZGl2IGNs
YXNzPSdlbWJlci12aWV3Jz4KLSAgICAgIEhlbGxvLCB3b3JsZC4KLSAgICA8L2Rpdj4KLSAgICBg
YGAKLQotICAgIE9wdGlvbmFsbHkgeW91IG1heSBwcm92aWRlIGEgc2Vjb25kIGFyZ3VtZW50OiBh
IHByb3BlcnR5IHBhdGgKLSAgICB0aGF0IHdpbGwgYmUgYm91bmQgdG8gdGhlIGBtb2RlbGAgcHJv
cGVydHkgb2YgdGhlIGNvbnRyb2xsZXIuCi0KLSAgICBJZiBhIGBtb2RlbGAgcHJvcGVydHkgcGF0
aCBpcyBzcGVjaWZpZWQsIHRoZW4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCi0gICAgY29udHJvbGxl
ciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7e3JlbmRlcn19YCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0
aW1lcwotICAgIHdpdGggdGhlIHNhbWUgbmFtZS4KLQotICAgRm9yIGV4YW1wbGUgaWYgeW91IGhh
ZCB0aGlzIGBhdXRob3JgIHRlbXBsYXRlLgotCi0gICBgYGBoYW5kbGViYXJzCi08ZGl2IGNsYXNz
PSJhdXRob3IiPgotICBXcml0dGVuIGJ5IHt7Zmlyc3ROYW1lfX0ge3tsYXN0TmFtZX19LgotICBU
b3RhbCBQb3N0czoge3twb3N0Q291bnR9fQotPC9kaXY+Ci0gIGBgYAotCi0gIFlvdSBjb3VsZCBy
ZW5kZXIgaXQgaW5zaWRlIHRoZSBgcG9zdGAgdGVtcGxhdGUgdXNpbmcgdGhlIGByZW5kZXJgIGhl
bHBlci4KLQotICBgYGBoYW5kbGViYXJzCi08ZGl2IGNsYXNzPSJwb3N0Ij4KLSAgPGgxPnt7dGl0
bGV9fTwvaDE+Ci0gIDxkaXY+e3tib2R5fX08L2Rpdj4KLSAge3tyZW5kZXIgImF1dGhvciIgYXV0
aG9yfX0KLTwvZGl2PgotICAgYGBgCi0KLSAgICBAbWV0aG9kIHJlbmRlcgotICAgIEBmb3IgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgICBAcGFy
YW0ge09iamVjdD99IGNvbnRleHRTdHJpbmcKLSAgICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAg
ICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCi0gICovCi0gIEVtYmVyLkhhbmRsZWJhcnMu
cmVnaXN0ZXJIZWxwZXIoJ3JlbmRlcicsIGZ1bmN0aW9uIHJlbmRlckhlbHBlcihuYW1lLCBjb250
ZXh0U3RyaW5nLCBvcHRpb25zKSB7Ci0gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7
Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGUgdG8gcmVuZGVyIiwg
bGVuZ3RoID49IDIpOwotICAgIHZhciBjb250ZXh0UHJvdmlkZWQgPSBsZW5ndGggPT09IDMsCi0g
ICAgICAgIGNvbnRhaW5lciwgcm91dGVyLCBjb250cm9sbGVyLCB2aWV3LCBjb250ZXh0LCBsb29r
dXBPcHRpb25zOwotCi0gICAgY29udGFpbmVyID0gKG9wdGlvbnMgfHwgY29udGV4dFN0cmluZyku
ZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyLmNvbnRhaW5lcjsKLSAgICByb3V0ZXIgPSBjb250YWlu
ZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotCi0gICAgaWYgKGxlbmd0aCA9PT0gMikgewotICAg
ICAgLy8gdXNlIHRoZSBzaW5nbGV0b24gY29udHJvbGxlcgotICAgICAgb3B0aW9ucyA9IGNvbnRl
eHRTdHJpbmc7Ci0gICAgICBjb250ZXh0U3RyaW5nID0gdW5kZWZpbmVkOwotICAgICAgRW1iZXIu
YXNzZXJ0KCJZb3UgY2FuIG9ubHkgdXNlIHRoZSB7e3JlbmRlcn19IGhlbHBlciBvbmNlIHdpdGhv
dXQgYSBtb2RlbCBvYmplY3QgYXMgaXRzIHNlY29uZCBhcmd1bWVudCwgYXMgaW4ge3tyZW5kZXIg
XCJwb3N0XCIgcG9zdH19LiIsICFyb3V0ZXIgfHwgIXJvdXRlci5fbG9va3VwQWN0aXZlVmlldyhu
YW1lKSk7Ci0gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDMpIHsKLSAgICAgIC8vIGNyZWF0ZSBh
IG5ldyBjb250cm9sbGVyCi0gICAgICBjb250ZXh0ID0gRW1iZXIuSGFuZGxlYmFycy5nZXQob3B0
aW9ucy5jb250ZXh0c1sxXSwgY29udGV4dFN0cmluZywgb3B0aW9ucyk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgIHRocm93IEVtYmVyLkVycm9yKCJZb3UgbXVzdCBwYXNzIGEgdGVtcGxhdGVOYW1lIHRv
IHJlbmRlciIpOwotICAgIH0KLQotICAgIC8vICMgbGVnYWN5IG5hbWVzcGFjZQotICAgIG5hbWUg
PSBuYW1lLnJlcGxhY2UoL1wvL2csICcuJyk7Ci0gICAgLy8gXCBsZWdhY3kgc2xhc2ggYXMgbmFt
ZXNwYWNlIHN1cHBvcnQKLQotCi0gICAgdmlldyA9IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyAr
IG5hbWUpIHx8IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6ZGVmYXVsdCcpOwotCi0gICAgLy8gcHJv
dmlkZSBjb250cm9sbGVyIG92ZXJyaWRlCi0gICAgdmFyIGNvbnRyb2xsZXJOYW1lID0gb3B0aW9u
cy5oYXNoLmNvbnRyb2xsZXIgfHwgbmFtZTsKLSAgICB2YXIgY29udHJvbGxlckZ1bGxOYW1lID0g
J2NvbnRyb2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lOwotCi0gICAgaWYgKG9wdGlvbnMuaGFzaC5j
b250cm9sbGVyKSB7Ci0gICAgICBFbWJlci5hc3NlcnQoIlRoZSBjb250cm9sbGVyIG5hbWUgeW91
IHN1cHBsaWVkICciICsgY29udHJvbGxlck5hbWUgKyAiJyBkaWQgbm90IHJlc29sdmUgdG8gYSBj
b250cm9sbGVyLiIsIGNvbnRhaW5lci5oYXMoY29udHJvbGxlckZ1bGxOYW1lKSk7Ci0gICAgfQot
Ci0gICAgdmFyIHBhcmVudENvbnRyb2xsZXIgPSBvcHRpb25zLmRhdGEua2V5d29yZHMuY29udHJv
bGxlcjsKLQotICAgIC8vIGNob29zZSBuYW1lCi0gICAgaWYgKGxlbmd0aCA+IDIpIHsKLSAgICAg
IHZhciBmYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoY29udHJvbGxlckZ1bGxOYW1l
KSB8fAotICAgICAgICAgICAgICAgICAgICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5
KGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQpOwotCi0gICAgICBjb250cm9sbGVy
ID0gZmFjdG9yeS5jcmVhdGUoewotICAgICAgICBtb2RlbDogY29udGV4dCwKLSAgICAgICAgcGFy
ZW50Q29udHJvbGxlcjogcGFyZW50Q29udHJvbGxlciwKLSAgICAgICAgdGFyZ2V0OiBwYXJlbnRD
b250cm9sbGVyCi0gICAgICB9KTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBjb250cm9sbGVyID0g
Y29udGFpbmVyLmxvb2t1cChjb250cm9sbGVyRnVsbE5hbWUpIHx8Ci0gICAgICAgICAgICAgICAg
ICAgRW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyKGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUpOwot
Ci0gICAgICBjb250cm9sbGVyLnNldFByb3BlcnRpZXMoewotICAgICAgICB0YXJnZXQ6IHBhcmVu
dENvbnRyb2xsZXIsCi0gICAgICAgIHBhcmVudENvbnRyb2xsZXI6IHBhcmVudENvbnRyb2xsZXIK
LSAgICAgIH0pOwotICAgIH0KLQotICAgIHZhciByb290ID0gb3B0aW9ucy5jb250ZXh0c1sxXTsK
LQotICAgIGlmIChyb290KSB7Ci0gICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocm9vdCwgY29u
dGV4dFN0cmluZywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIGNvbnRyb2xsZXIuc2V0KCdtb2RlbCcs
IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHJvb3QsIGNvbnRleHRTdHJpbmcsIG9wdGlvbnMpKTsKLSAg
ICAgIH0pOwotICAgIH0KLQotICAgIG9wdGlvbnMuaGFzaC52aWV3TmFtZSA9IEVtYmVyLlN0cmlu
Zy5jYW1lbGl6ZShuYW1lKTsKLQotICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSAndGVtcGxhdGU6JyAr
IG5hbWU7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgdXNlZCBge3tyZW5kZXIgJyIgKyBuYW1lICsg
Iid9fWAsIGJ1dCAnIiArIG5hbWUgKyAiJyBjYW4gbm90IGJlIGZvdW5kIGFzIGVpdGhlciBhIHRl
bXBsYXRlIG9yIGEgdmlldy4iLCBjb250YWluZXIuaGFzKCJ2aWV3OiIgKyBuYW1lKSB8fCBjb250
YWluZXIuaGFzKHRlbXBsYXRlTmFtZSkpOwotICAgIG9wdGlvbnMuaGFzaC50ZW1wbGF0ZSA9IGNv
bnRhaW5lci5sb29rdXAodGVtcGxhdGVOYW1lKTsKLQotICAgIG9wdGlvbnMuaGFzaC5jb250cm9s
bGVyID0gY29udHJvbGxlcjsKLQotICAgIGlmIChyb3V0ZXIgJiYgIWNvbnRleHQpIHsKLSAgICAg
IHJvdXRlci5fY29ubmVjdEFjdGl2ZVZpZXcobmFtZSwgdmlldyk7Ci0gICAgfQotCi0gICAgRW1i
ZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKLSAg
fSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJl
cgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotRW1iZXIub25Mb2FkKCdFbWJlci5IYW5k
bGViYXJzJywgZnVuY3Rpb24oSGFuZGxlYmFycykgewotCi0gIHZhciByZXNvbHZlUGFyYW1zID0g
RW1iZXIuUm91dGVyLnJlc29sdmVQYXJhbXMsCi0gICAgICBpc1NpbXBsZUNsaWNrID0gRW1iZXIu
Vmlld1V0aWxzLmlzU2ltcGxlQ2xpY2s7Ci0KLSAgdmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVy
LkhhbmRsZWJhcnMsCi0gICAgICBoYW5kbGViYXJzR2V0ID0gRW1iZXJIYW5kbGViYXJzLmdldCwK
LSAgICAgIFNhZmVTdHJpbmcgPSBFbWJlckhhbmRsZWJhcnMuU2FmZVN0cmluZywKLSAgICAgIGZv
ckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLAotICAgICAgZ2V0ID0gRW1iZXIu
Z2V0LAotICAgICAgYV9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKLQotICBmdW5jdGlv
biBhcmdzKG9wdGlvbnMsIGFjdGlvbk5hbWUpIHsKLSAgICB2YXIgcmV0ID0gW107Ci0gICAgaWYg
KGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KLQotICAgIHZhciB0eXBlcyA9
IG9wdGlvbnMub3B0aW9ucy50eXBlcy5zbGljZSgxKSwKLSAgICAgICAgZGF0YSA9IG9wdGlvbnMu
b3B0aW9ucy5kYXRhOwotCi0gICAgcmV0dXJuIHJldC5jb25jYXQocmVzb2x2ZVBhcmFtcyhvcHRp
b25zLmNvbnRleHQsIG9wdGlvbnMucGFyYW1zLCB7IHR5cGVzOiB0eXBlcywgZGF0YTogZGF0YSB9
KSk7Ci0gIH0KLQotICB2YXIgQWN0aW9uSGVscGVyID0gRW1iZXJIYW5kbGViYXJzLkFjdGlvbkhl
bHBlciA9IHsKLSAgICByZWdpc3RlcmVkQWN0aW9uczoge30KLSAgfTsKLQotICB2YXIga2V5cyA9
IFsiYWx0IiwgInNoaWZ0IiwgIm1ldGEiLCAiY3RybCJdOwotCi0gIHZhciBQT0lOVEVSX0VWRU5U
X1RZUEVfUkVHRVggPSAvXmNsaWNrfG1vdXNlfHRvdWNoLzsKLQotICB2YXIgaXNBbGxvd2VkRXZl
bnQgPSBmdW5jdGlvbihldmVudCwgYWxsb3dlZEtleXMpIHsKLSAgICBpZiAodHlwZW9mIGFsbG93
ZWRLZXlzID09PSAidW5kZWZpbmVkIikgewotICAgICAgaWYgKFBPSU5URVJfRVZFTlRfVFlQRV9S
RUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBpc1NpbXBsZUNsaWNrKGV2
ZW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFsbG93ZWRLZXlzID0gJyc7Ci0gICAgICB9
Ci0gICAgfQotCi0gICAgaWYgKGFsbG93ZWRLZXlzLmluZGV4T2YoImFueSIpID49IDApIHsKLSAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZhciBhbGxvd2VkID0gdHJ1ZTsKLQotICAg
IGZvckVhY2guY2FsbChrZXlzLCBmdW5jdGlvbihrZXkpIHsKLSAgICAgIGlmIChldmVudFtrZXkg
KyAiS2V5Il0gJiYgYWxsb3dlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkgewotICAgICAgICBh
bGxvd2VkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gYWxsb3dlZDsK
LSAgfTsKLQotICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJBY3Rpb24gPSBmdW5jdGlvbihhY3Rpb25O
YW1lLCBvcHRpb25zLCBhbGxvd2VkS2V5cykgewotICAgIHZhciBhY3Rpb25JZCA9ICgrK0VtYmVy
LnV1aWQpLnRvU3RyaW5nKCk7Ci0KLSAgICBBY3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnNb
YWN0aW9uSWRdID0gewotICAgICAgZXZlbnROYW1lOiBvcHRpb25zLmV2ZW50TmFtZSwKLSAgICAg
IGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZVJlZ2lzdGVyZWRBY3Rpb24oZXZlbnQpIHsKLSAgICAg
ICAgaWYgKCFpc0FsbG93ZWRFdmVudChldmVudCwgYWxsb3dlZEtleXMpKSB7IHJldHVybiB0cnVl
OyB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgIT09IGZhbHNlKSB7Ci0g
ICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
IChvcHRpb25zLmJ1YmJsZXMgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgZXZlbnQuc3RvcFByb3Bh
Z2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy50YXJn
ZXQ7Ci0KLSAgICAgICAgaWYgKHRhcmdldC50YXJnZXQpIHsKLSAgICAgICAgICB0YXJnZXQgPSBo
YW5kbGViYXJzR2V0KHRhcmdldC5yb290LCB0YXJnZXQudGFyZ2V0LCB0YXJnZXQub3B0aW9ucyk7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnJvb3Q7Ci0gICAg
ICAgIH0KLQotICAgICAgICBFbWJlci5ydW4oZnVuY3Rpb24gcnVuUmVnaXN0ZXJlZEFjdGlvbigp
IHsKLSAgICAgICAgICBpZiAodGFyZ2V0LnNlbmQpIHsKLSAgICAgICAgICAgIHRhcmdldC5zZW5k
LmFwcGx5KHRhcmdldCwgYXJncyhvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbk5hbWUpKTsKLSAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgYWN0aW9uICci
ICsgYWN0aW9uTmFtZSArICInIGRpZCBub3QgZXhpc3Qgb24gIiArIHRhcmdldCwgdHlwZW9mIHRh
cmdldFthY3Rpb25OYW1lXSA9PT0gJ2Z1bmN0aW9uJyk7Ci0gICAgICAgICAgICB0YXJnZXRbYWN0
aW9uTmFtZV0uYXBwbHkodGFyZ2V0LCBhcmdzKG9wdGlvbnMucGFyYW1ldGVycykpOwotICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIG9wdGlvbnMudmlldy5v
bignd2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7Ci0gICAgICBkZWxldGUgQWN0aW9uSGVs
cGVyLnJlZ2lzdGVyZWRBY3Rpb25zW2FjdGlvbklkXTsKLSAgICB9KTsKLQotICAgIHJldHVybiBh
Y3Rpb25JZDsKLSAgfTsKLQotICAvKioKLSAgICBUaGUgYHt7YWN0aW9ufX1gIGhlbHBlciByZWdp
c3RlcnMgYW4gSFRNTCBlbGVtZW50IHdpdGhpbiBhIHRlbXBsYXRlIGZvciBET00KLSAgICBldmVu
dCBoYW5kbGluZyBhbmQgZm9yd2FyZHMgdGhhdCBpbnRlcmFjdGlvbiB0byB0aGUgdGVtcGxhdGVz
J3MgY29udHJvbGxlcgotICAgIG9yIHN1cHBsaWVkIGB0YXJnZXRgIG9wdGlvbiAoc2VlICdTcGVj
aWZ5aW5nIGEgVGFyZ2V0JykuCi0KLSAgICBJZiB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBpbXBs
ZW1lbnQgdGhlIGV2ZW50LCB0aGUgZXZlbnQgaXMgc2VudAotICAgIHRvIHRoZSBjdXJyZW50IHJv
dXRlLCBhbmQgaXQgYnViYmxlcyB1cCB0aGUgcm91dGUgaGllcmFyY2h5IGZyb20gdGhlcmUuCi0K
LSAgICBVc2VyIGludGVyYWN0aW9uIHdpdGggdGhhdCBlbGVtZW50IHdpbGwgaW52b2tlIHRoZSBz
dXBwbGllZCBhY3Rpb24gbmFtZSBvbgotICAgIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQuCi0KLSAg
ICBHaXZlbiB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIEhhbmRsZWJhcnMgdGVtcGxhdGUgb24g
dGhlIHBhZ2UKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8ZGl2IHt7YWN0aW9uICdhbkFjdGlv
bk5hbWUnfX0+Ci0gICAgICBjbGljayBtZQotICAgIDwvZGl2PgotICAgIGBgYAotCi0gICAgQW5k
IGFwcGxpY2F0aW9uIGNvZGUKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQXBwbGljYXRp
b25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRlbmQoewotICAgICAgYWN0aW9uczog
ewotICAgICAgICBhbkFjdGlvbk5hbWU6IGZ1bmN0aW9uKCkgewotICAgICAgICB9Ci0gICAgICB9
Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIHJl
bmRlcmVkIEhUTUwKLQotICAgIGBgYGh0bWwKLSAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij4K
LSAgICAgIDxkaXYgZGF0YS1lbWJlci1hY3Rpb249IjEiPgotICAgICAgICBjbGljayBtZQotICAg
ICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgYGBgCi0KLSAgICBDbGlja2luZyAiY2xpY2sgbWUi
IHdpbGwgdHJpZ2dlciB0aGUgYGFuQWN0aW9uTmFtZWAgYWN0aW9uIG9mIHRoZQotICAgIGBBcHAu
QXBwbGljYXRpb25Db250cm9sbGVyYC4gSW4gdGhpcyBjYXNlLCBubyBhZGRpdGlvbmFsIHBhcmFt
ZXRlcnMgd2lsbCBiZSBwYXNzZWQuCi0KLSAgICBJZiB5b3UgcHJvdmlkZSBhZGRpdGlvbmFsIHBh
cmFtZXRlcnMgdG8gdGhlIGhlbHBlcjoKLQotICAgIGBgYGhhbmRsZWJhcnMKLSAgICA8YnV0dG9u
IHt7YWN0aW9uICdlZGl0JyBwb3N0fX0+RWRpdDwvYnV0dG9uPgotICAgIGBgYAotCi0gICAgVGhv
c2UgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCBhbG9uZyBhcyBhcmd1bWVudHMgdG8gdGhlIEph
dmFTY3JpcHQKLSAgICBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbi4KLQotICAgICMj
IyBFdmVudCBQcm9wYWdhdGlvbgotCi0gICAgRXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIHRoZSBh
Y3Rpb24gaGVscGVyIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCi0gICAgYC5wcmV2ZW50RGVmYXVs
dCgpYCBjYWxsZWQgb24gdGhlbS4gWW91IGRvIG5vdCBuZWVkIHRvIGRvIHNvIGluIHlvdXIgZXZl
bnQKLSAgICBoYW5kbGVycy4gSWYgeW91IG5lZWQgdG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRpb24g
KHRvIGhhbmRsZSBmaWxlIGlucHV0cyBmb3IKLSAgICBleGFtcGxlKSB5b3UgY2FuIHN1cHBseSB0
aGUgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBvcHRpb24gdG8gdGhlIGB7e2FjdGlvbn19YCBoZWxw
ZXI6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGRpdiB7e2FjdGlvbiAic2F5SGVsbG8iIHBy
ZXZlbnREZWZhdWx0PWZhbHNlfX0+Ci0gICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgLz4KLSAgICAg
IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz4KLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIFRv
IGRpc2FibGUgYnViYmxpbmcsIHBhc3MgYGJ1YmJsZXM9ZmFsc2VgIHRvIHRoZSBoZWxwZXI6Ci0K
LSAgICBgYGBoYW5kbGViYXJzCi0gICAgPGJ1dHRvbiB7e2FjdGlvbiAnZWRpdCcgcG9zdCBidWJi
bGVzPWZhbHNlfX0+RWRpdDwvYnV0dG9uPgotICAgIGBgYAotCi0gICAgSWYgeW91IG5lZWQgdGhl
IGRlZmF1bHQgaGFuZGxlciB0byB0cmlnZ2VyIHlvdSBzaG91bGQgZWl0aGVyIHJlZ2lzdGVyIHlv
dXIKLSAgICBvd24gZXZlbnQgaGFuZGxlciwgb3IgdXNlIGV2ZW50IG1ldGhvZHMgb24geW91ciB2
aWV3IGNsYXNzLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwp
Ci0gICAgJ1Jlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMnIGZvciBtb3JlIGluZm9ybWF0aW9u
LgotCi0gICAgIyMjIFNwZWNpZnlpbmcgRE9NIGV2ZW50IHR5cGUKLQotICAgIEJ5IGRlZmF1bHQg
dGhlIGB7e2FjdGlvbn19YCBoZWxwZXIgcmVnaXN0ZXJzIGZvciBET00gYGNsaWNrYCBldmVudHMu
IFlvdSBjYW4KLSAgICBzdXBwbHkgYW4gYG9uYCBvcHRpb24gdG8gdGhlIGhlbHBlciB0byBzcGVj
aWZ5IGEgZGlmZmVyZW50IERPTSBldmVudCBuYW1lOgotCi0gICAgYGBgaGFuZGxlYmFycwotICAg
IDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgb249ImRvdWJsZUNsaWNrIn19PgotICAgICAg
Y2xpY2sgbWUKLSAgICA8L2Rpdj4KLSAgICBgYGAKLQotICAgIFNlZSBgRW1iZXIuVmlld2AgJ1Jl
c3BvbmRpbmcgdG8gQnJvd3NlciBFdmVudHMnIGZvciBhIGxpc3Qgb2YKLSAgICBhY2NlcHRhYmxl
IERPTSBldmVudCBuYW1lcy4KLQotICAgIE5PVEU6IEJlY2F1c2UgYHt7YWN0aW9ufX1gIGRlcGVu
ZHMgb24gRW1iZXIncyBldmVudCBkaXNwYXRjaCBzeXN0ZW0gaXQgd2lsbAotICAgIG9ubHkgZnVu
Y3Rpb24gaWYgYW4gYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgaW5zdGFuY2UgaXMgYXZhaWxhYmxl
LiBBbgotICAgIGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRl
ZCB3aGVuIGEgbmV3IGBFbWJlci5BcHBsaWNhdGlvbmAKLSAgICBpcyBjcmVhdGVkLiBIYXZpbmcg
YW4gaW5zdGFuY2Ugb2YgYEVtYmVyLkFwcGxpY2F0aW9uYCB3aWxsIHNhdGlzZnkgdGhpcwotICAg
IHJlcXVpcmVtZW50LgotCi0gICAgIyMjIFNwZWNpZnlpbmcgd2hpdGVsaXN0ZWQgbW9kaWZpZXIg
a2V5cwotCi0gICAgQnkgZGVmYXVsdCB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciB3aWxsIGlnbm9y
ZSBjbGljayBldmVudCB3aXRoIHByZXNzZWQgbW9kaWZpZXIKLSAgICBrZXlzLiBZb3UgY2FuIHN1
cHBseSBhbiBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGtleXMgc2hvdWxk
IG5vdCBiZSBpZ25vcmVkLgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIDxkaXYge3thY3Rpb24g
ImFuQWN0aW9uTmFtZSIgYWxsb3dlZEtleXM9ImFsdCJ9fT4KLSAgICAgIGNsaWNrIG1lCi0gICAg
PC9kaXY+Ci0gICAgYGBgCi0KLSAgICBUaGlzIHdheSB0aGUgYHt7YWN0aW9ufX1gIHdpbGwgZmly
ZSB3aGVuIGNsaWNraW5nIHdpdGggdGhlIGFsdCBrZXkgcHJlc3NlZCBkb3duLgotCi0gICAgQWx0
ZXJuYXRpdmVseSwgc3VwcGx5ICJhbnkiIHRvIHRoZSBgYWxsb3dlZEtleXNgIG9wdGlvbiB0byBh
Y2NlcHQgYW55IGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVyIGtleXMuCi0KLSAgICBgYGBoYW5kbGVi
YXJzCi0gICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rpb25OYW1lIiBhbGxvd2VkS2V5cz0iYW55In19
PgotICAgICAgY2xpY2sgbWUgd2l0aCBhbnkga2V5IHByZXNzZWQKLSAgICA8L2Rpdj4KLSAgICBg
YGAKLQotICAgICMjIyBTcGVjaWZ5aW5nIGEgVGFyZ2V0Ci0KLSAgICBUaGVyZSBhcmUgc2V2ZXJh
bCBwb3NzaWJsZSB0YXJnZXQgb2JqZWN0cyBmb3IgYHt7YWN0aW9ufX1gIGhlbHBlcnM6Ci0KLSAg
ICBJbiBhIHR5cGljYWwgRW1iZXIgYXBwbGljYXRpb24sIHdoZXJlIHZpZXdzIGFyZSBtYW5hZ2Vk
IHRocm91Z2ggdXNlIG9mIHRoZQotICAgIGB7e291dGxldH19YCBoZWxwZXIsIGFjdGlvbnMgd2ls
bCBidWJibGUgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciwgdGhlbgotICAgIHRvIHRoZSBjdXJy
ZW50IHJvdXRlLCBhbmQgdGhlbiB1cCB0aGUgcm91dGUgaGllcmFyY2h5LgotCi0gICAgQWx0ZXJu
YXRpdmVseSwgYSBgdGFyZ2V0YCBvcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBoZWxwZXIg
dG8gY2hhbmdlCi0gICAgd2hpY2ggb2JqZWN0IHdpbGwgcmVjZWl2ZSB0aGUgbWV0aG9kIGNhbGwu
IFRoaXMgb3B0aW9uIG11c3QgYmUgYSBwYXRoCi0gICAgdG8gYW4gb2JqZWN0LCBhY2Nlc3NpYmxl
IGluIHRoZSBjdXJyZW50IGNvbnRleHQ6Ci0KLSAgICBgYGBoYW5kbGViYXJzCi0gICAge3shIHRo
ZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSB9fQotICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFt
ZSIgdGFyZ2V0PXZpZXd9fT4KLSAgICAgIGNsaWNrIG1lCi0gICAgPC9kaXY+Ci0gICAgYGBgCi0K
LSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkFwcGxpY2F0aW9uVmlldyA9IEVtYmVyLlZpZXcu
ZXh0ZW5kKHsKLSAgICAgIGFjdGlvbnM6IHsKLSAgICAgICAgYW5BY3Rpb25OYW1lOiBmdW5jdGlv
bigpe30KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGBgYAotCi0gICAgIyMjIEFkZGl0aW9uYWwg
UGFyYW1ldGVycwotCi0gICAgWW91IG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0
byB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlci4gVGhlc2UKLSAgICBwYXJhbWV0ZXJzIGFyZSBwYXNz
ZWQgYWxvbmcgYXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgSmF2YVNjcmlwdCBmdW5jdGlvbgotICAg
IGltcGxlbWVudGluZyB0aGUgYWN0aW9uLgotCi0gICAgYGBgaGFuZGxlYmFycwotICAgIHt7I2Vh
Y2ggcGVyc29uIGluIHBlb3BsZX19Ci0gICAgICA8ZGl2IHt7YWN0aW9uICJlZGl0IiBwZXJzb259
fT4KLSAgICAgICAgY2xpY2sgbWUKLSAgICAgIDwvZGl2PgotICAgIHt7L2VhY2h9fQotICAgIGBg
YAotCi0gICAgQ2xpY2tpbmcgImNsaWNrIG1lIiB3aWxsIHRyaWdnZXIgdGhlIGBlZGl0YCBtZXRo
b2Qgb24gdGhlIGN1cnJlbnQgY29udHJvbGxlcgotICAgIHdpdGggdGhlIHZhbHVlIG9mIGBwZXJz
b25gIGFzIGEgcGFyYW1ldGVyLgotCi0gICAgQG1ldGhvZCBhY3Rpb24KLSAgICBAZm9yIEVtYmVy
LkhhbmRsZWJhcnMuaGVscGVycwotICAgIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25OYW1lCi0gICAg
QHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSoKLSAgICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKLSAg
Ki8KLSAgRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdhY3Rpb24nLCBmdW5jdGlvbiBh
Y3Rpb25IZWxwZXIoYWN0aW9uTmFtZSkgewotICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2Fy
Z3VtZW50cy5sZW5ndGggLSAxXSwKLSAgICAgICAgY29udGV4dHMgPSBhX3NsaWNlLmNhbGwoYXJn
dW1lbnRzLCAxLCAtMSk7Ci0KLSAgICB2YXIgaGFzaCA9IG9wdGlvbnMuaGFzaCwKLSAgICAgICAg
Y29udHJvbGxlcjsKLQotICAgIC8vIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhbG9uZyB0byByZWdp
c3RlckFjdGlvbgotICAgIHZhciBhY3Rpb24gPSB7Ci0gICAgICBldmVudE5hbWU6IGhhc2gub24g
fHwgImNsaWNrIgotICAgIH07Ci0KLSAgICBhY3Rpb24ucGFyYW1ldGVycyA9IHsKLSAgICAgIGNv
bnRleHQ6IHRoaXMsCi0gICAgICBvcHRpb25zOiBvcHRpb25zLAotICAgICAgcGFyYW1zOiBjb250
ZXh0cwotICAgIH07Ci0KLSAgICBhY3Rpb24udmlldyA9IG9wdGlvbnMuZGF0YS52aWV3OwotCi0g
ICAgdmFyIHJvb3QsIHRhcmdldDsKLQotICAgIGlmIChoYXNoLnRhcmdldCkgewotICAgICAgcm9v
dCA9IHRoaXM7Ci0gICAgICB0YXJnZXQgPSBoYXNoLnRhcmdldDsKLSAgICB9IGVsc2UgaWYgKGNv
bnRyb2xsZXIgPSBvcHRpb25zLmRhdGEua2V5d29yZHMuY29udHJvbGxlcikgewotICAgICAgcm9v
dCA9IGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgYWN0aW9uLnRhcmdldCA9IHsgcm9vdDogcm9v
dCwgdGFyZ2V0OiB0YXJnZXQsIG9wdGlvbnM6IG9wdGlvbnMgfTsKLSAgICBhY3Rpb24uYnViYmxl
cyA9IGhhc2guYnViYmxlczsKLSAgICBhY3Rpb24ucHJldmVudERlZmF1bHQgPSBoYXNoLnByZXZl
bnREZWZhdWx0OwotCi0gICAgdmFyIGFjdGlvbklkID0gQWN0aW9uSGVscGVyLnJlZ2lzdGVyQWN0
aW9uKGFjdGlvbk5hbWUsIGFjdGlvbiwgaGFzaC5hbGxvd2VkS2V5cyk7Ci0gICAgcmV0dXJuIG5l
dyBTYWZlU3RyaW5nKCdkYXRhLWVtYmVyLWFjdGlvbj0iJyArIGFjdGlvbklkICsgJyInKTsKLSAg
fSk7Ci0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQot
KGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRp
bmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIu
Q29udHJvbGxlck1peGluLnJlb3Blbih7Ci0gIC8qKgotICAgIFRyYW5zaXRpb24gdGhlIGFwcGxp
Y2F0aW9uIGludG8gYW5vdGhlciByb3V0ZS4gVGhlIHJvdXRlIG1heQotICAgIGJlIGVpdGhlciBh
IHNpbmdsZSByb3V0ZSBvciByb3V0ZSBwYXRoOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIGFD
b250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nUG9zdHMnKTsKLSAgICBhQ29udHJvbGxl
ci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsKLSAgICBgYGAK
LQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVzdGlv
bi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0
aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAgIHRoZSByb3V0ZToKLQotICAgIGBgYGphdmFzY3Jp
cHQKLSAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxvZ1Bvc3QnLCBhUG9zdCk7
Ci0gICAgYGBgCi0KLSAgICBNdWx0aXBsZSBtb2RlbHMgd2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8g
Zmlyc3QgcmVjdXJzaXZlbHkgdXAgdGhlCi0gICAgcmVzb3VyY2UgdHJlZS4KLQotICAgIGBgYGph
dmFzY3JpcHQKLSAgICB0aGlzLnJlc291cmNlKCdibG9nUG9zdCcsIHtwYXRoOic6YmxvZ1Bvc3RJ
ZCd9LCBmdW5jdGlvbigpewotICAgICAgdGhpcy5yZXNvdXJjZSgnYmxvZ0NvbW1lbnQnLCB7cGF0
aDogJzpibG9nQ29tbWVudElkJ30pOwotICAgIH0pOwotCi0gICAgYUNvbnRyb2xsZXIudHJhbnNp
dGlvblRvUm91dGUoJ2Jsb2dDb21tZW50JywgYVBvc3QsIGFDb21tZW50KTsKLSAgICBgYGAKLQot
ICAgIFNlZSBhbHNvICdyZXBsYWNlUm91dGUnLgotCi0gICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUg
dGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0gICAgQHBhcmFtIHsuLi5PYmplY3R9IG1vZGVscyB0aGUg
bW9kZWwocykgdG8gYmUgdXNlZCB3aGlsZSB0cmFuc2l0aW9uaW5nCi0gICAgdG8gdGhlIHJvdXRl
LgotICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1peGluCi0gICAgQG1ldGhvZCB0cmFuc2l0aW9u
VG9Sb3V0ZQotICAqLwotICB0cmFuc2l0aW9uVG9Sb3V0ZTogZnVuY3Rpb24oKSB7Ci0gICAgLy8g
dGFyZ2V0IG1heSBiZSBlaXRoZXIgYW5vdGhlciBjb250cm9sbGVyIG9yIGEgcm91dGVyCi0gICAg
dmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JyksCi0gICAgICAgIG1ldGhvZCA9IHRhcmdl
dC50cmFuc2l0aW9uVG9Sb3V0ZSB8fCB0YXJnZXQudHJhbnNpdGlvblRvOwotICAgIHJldHVybiBt
ZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwotICB9LAotCi0gIC8qKgotICAgIEBkZXBy
ZWNhdGVkCi0gICAgQGZvciBFbWJlci5Db250cm9sbGVyTWl4aW4KLSAgICBAbWV0aG9kIHRyYW5z
aXRpb25UbwotICAqLwotICB0cmFuc2l0aW9uVG86IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRl
cHJlY2F0ZSgidHJhbnNpdGlvblRvIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdHJhbnNpdGlv
blRvUm91dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvUm91dGUuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKLSAgfSwKLQotICAvKioKLSAgICBUcmFuc2l0aW9uIGludG8gYW5vdGhl
ciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpZiBwb3NzaWJsZS4KLSAg
ICBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2Yg
YWRkaW5nIGEgbmV3IG9uZS4gCi0gICAgQmVzaWRlIHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBg
dHJhbnNpdGlvblRvUm91dGVgIGluIGFsbCBvdGhlciByZXNwZWN0cy4KLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0cycpOwotICAgIGFD
b250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ1Bvc3RzLnJlY2VudEVudHJpZXMnKTsKLSAgICBg
YGAKLQotICAgIE9wdGlvbmFsbHkgc3VwcGx5IGEgbW9kZWwgZm9yIHRoZSByb3V0ZSBpbiBxdWVz
dGlvbi4gVGhlIG1vZGVsCi0gICAgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2lu
ZyB0aGUgYHNlcmlhbGl6ZWAgaG9vayBvZgotICAgIHRoZSByb3V0ZToKLQotICAgIGBgYGphdmFz
Y3JpcHQKLSAgICBhQ29udHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0JywgYVBvc3QpOwot
ICAgIGBgYAotCi0gICAgTXVsdGlwbGUgbW9kZWxzIHdpbGwgYmUgYXBwbGllZCBsYXN0IHRvIGZp
cnN0IHJlY3Vyc2l2ZWx5IHVwIHRoZQotICAgIHJlc291cmNlIHRyZWUuCi0KLSAgICBgYGBqYXZh
c2NyaXB0Ci0gICAgdGhpcy5yZXNvdXJjZSgnYmxvZ1Bvc3QnLCB7cGF0aDonOmJsb2dQb3N0SWQn
fSwgZnVuY3Rpb24oKXsKLSAgICAgIHRoaXMucmVzb3VyY2UoJ2Jsb2dDb21tZW50Jywge3BhdGg6
ICc6YmxvZ0NvbW1lbnRJZCd9KTsKLSAgICB9KTsKLQotICAgIGFDb250cm9sbGVyLnJlcGxhY2VS
b3V0ZSgnYmxvZ0NvbW1lbnQnLCBhUG9zdCwgYUNvbW1lbnQpOwotICAgIGBgYAotCi0gICAgQHBh
cmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0gICAgQHBhcmFtIHsuLi5P
YmplY3R9IG1vZGVscyB0aGUgbW9kZWwocykgdG8gYmUgdXNlZCB3aGlsZSB0cmFuc2l0aW9uaW5n
Ci0gICAgdG8gdGhlIHJvdXRlLgotICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1peGluCi0gICAg
QG1ldGhvZCByZXBsYWNlUm91dGUKLSAgKi8KLSAgcmVwbGFjZVJvdXRlOiBmdW5jdGlvbigpIHsK
LSAgICAvLyB0YXJnZXQgbWF5IGJlIGVpdGhlciBhbm90aGVyIGNvbnRyb2xsZXIgb3IgYSByb3V0
ZXIKLSAgICB2YXIgdGFyZ2V0ID0gZ2V0KHRoaXMsICd0YXJnZXQnKSwKLSAgICAgICAgbWV0aG9k
ID0gdGFyZ2V0LnJlcGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdpdGg7Ci0gICAgcmV0dXJu
IG1ldGhvZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQGRl
cHJlY2F0ZWQKLSAgICBAZm9yIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgotICAgIEBtZXRob2QgcmVw
bGFjZVdpdGgKLSAgKi8KLSAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRl
cHJlY2F0ZSgicmVwbGFjZVdpdGggaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSByZXBsYWNlUm91
dGUuIik7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZVJvdXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7Ci0gIH0KLX0pOwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxl
IGVtYmVyCi1Ac3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5n
ZXQsIHNldCA9IEVtYmVyLnNldDsKLQotRW1iZXIuVmlldy5yZW9wZW4oewotCi0gIC8qKgotICAg
IFNldHMgdGhlIHByaXZhdGUgYF9vdXRsZXRzYCBvYmplY3Qgb24gdGhlIHZpZXcuCi0KLSAgICBA
bWV0aG9kIGluaXQKLSAgICovCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAn
X291dGxldHMnLCB7fSk7Ci0gICAgdGhpcy5fc3VwZXIoKTsKLSAgfSwKLQotICAvKioKLSAgICBN
YW51YWxseSBmaWxsIGFueSBvZiBhIHZpZXcncyBge3tvdXRsZXR9fWAgYXJlYXMgd2l0aCB0aGUK
LSAgICBzdXBwbGllZCB2aWV3LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAot
ICAgIHZhciBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1i
ZXIuSGFuZGxlYmFycy5jb21waWxlKCdDaGlsZCB2aWV3OiB7e291dGxldCAibWFpbiJ9fSAnKQot
ICAgIH0pOwotICAgIHZhciBteVZpZXcgPSBNeVZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmFw
cGVuZFRvKCdib2R5Jyk7Ci0gICAgLy8gVGhlIGh0bWwgZm9yIG15VmlldyBub3cgbG9va3MgbGlr
ZToKLSAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9ImVtYmVyLXZpZXciPkNoaWxkIHZp
ZXc6IDwvZGl2PgotCi0gICAgdmFyIEZvb1ZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAg
ICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8aDE+Rm9vPC9oMT4gJykKLSAg
ICB9KTsKLSAgICB2YXIgZm9vVmlldyA9IEZvb1ZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmNv
bm5lY3RPdXRsZXQoJ21haW4nLCBmb29WaWV3KTsKLSAgICAvLyBUaGUgaHRtbCBmb3IgbXlWaWV3
IG5vdyBsb29rcyBsaWtlOgotICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXIt
dmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxkaXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1i
ZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2PgotICAgIC8vIDwvZGl2PgotICAgIGBgYAotICAg
IEBtZXRob2QgY29ubmVjdE91dGxldAotICAgIEBwYXJhbSAge1N0cmluZ30gb3V0bGV0TmFtZSBB
IHVuaXF1ZSBuYW1lIGZvciB0aGUgb3V0bGV0Ci0gICAgQHBhcmFtICB7T2JqZWN0fSB2aWV3ICAg
ICAgIEFuIEVtYmVyLlZpZXcKLSAgICovCi0gIGNvbm5lY3RPdXRsZXQ6IGZ1bmN0aW9uKG91dGxl
dE5hbWUsIHZpZXcpIHsKLSAgICBpZiAodGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7Ci0g
ICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zW291dGxldE5hbWVdOwotICAg
IH0KLQotICAgIGlmICh0aGlzLl9oYXNFcXVpdmFsZW50VmlldyhvdXRsZXROYW1lLCB2aWV3KSkg
ewotICAgICAgdmlldy5kZXN0cm95KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFy
IG91dGxldHMgPSBnZXQodGhpcywgJ19vdXRsZXRzJyksCi0gICAgICAgIGNvbnRhaW5lciA9IGdl
dCh0aGlzLCAnY29udGFpbmVyJyksCi0gICAgICAgIHJvdXRlciA9IGNvbnRhaW5lciAmJiBjb250
YWluZXIubG9va3VwKCdyb3V0ZXI6bWFpbicpLAotICAgICAgICByZW5kZXJlZE5hbWUgPSBnZXQo
dmlldywgJ3JlbmRlcmVkTmFtZScpOwotCi0gICAgc2V0KG91dGxldHMsIG91dGxldE5hbWUsIHZp
ZXcpOwotCi0gICAgaWYgKHJvdXRlciAmJiByZW5kZXJlZE5hbWUpIHsKLSAgICAgIHJvdXRlci5f
Y29ubmVjdEFjdGl2ZVZpZXcocmVuZGVyZWROYW1lLCB2aWV3KTsKLSAgICB9Ci0gIH0sCi0KLSAg
LyoqCi0gICAgRGV0ZXJtaW5lcyBpZiB0aGUgdmlldyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQg
YnkgY2hlY2tpbmcgaWYKLSAgICB0aGUgdmlldyBoYXMgdGhlIHNhbWUgY29uc3RydWN0b3IsIHRl
bXBsYXRlLCBhbmQgY29udGV4dCBhcyB0aGUKLSAgICB2aWV3IGluIHRoZSBgX291dGxldHNgIG9i
amVjdC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfaGFzRXF1aXZhbGVudFZpZXcKLSAg
ICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dGxldCB3ZSBh
cmUgY2hlY2tpbmcKLSAgICBAcGFyYW0gIHtPYmplY3R9IHZpZXcgICAgICAgQW4gRW1iZXIuVmll
dwotICAgIEByZXR1cm4ge0Jvb2xlYW59Ci0gICAqLwotICBfaGFzRXF1aXZhbGVudFZpZXc6IGZ1
bmN0aW9uKG91dGxldE5hbWUsIHZpZXcpIHsKLSAgICB2YXIgZXhpc3RpbmdWaWV3ID0gZ2V0KHRo
aXMsICdfb3V0bGV0cy4nK291dGxldE5hbWUpOwotICAgIHJldHVybiBleGlzdGluZ1ZpZXcgJiYK
LSAgICAgIGV4aXN0aW5nVmlldy5jb25zdHJ1Y3RvciA9PT0gdmlldy5jb25zdHJ1Y3RvciAmJgot
ICAgICAgZXhpc3RpbmdWaWV3LmdldCgndGVtcGxhdGUnKSA9PT0gdmlldy5nZXQoJ3RlbXBsYXRl
JykgJiYKLSAgICAgIGV4aXN0aW5nVmlldy5nZXQoJ2NvbnRleHQnKSA9PT0gdmlldy5nZXQoJ2Nv
bnRleHQnKTsKLSAgfSwKLQotICAvKioKLSAgICBSZW1vdmVzIGFuIG91dGxldCBmcm9tIHRoZSB2
aWV3LgotCi0gICAgRXhhbXBsZQotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIHZhciBNeVZpZXcg
PSBFbWJlci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j
b21waWxlKCdDaGlsZCB2aWV3OiB7e291dGxldCAibWFpbiJ9fSAnKQotICAgIH0pOwotICAgIHZh
ciBteVZpZXcgPSBNeVZpZXcuY3JlYXRlKCk7Ci0gICAgbXlWaWV3LmFwcGVuZFRvKCdib2R5Jyk7
Ci0gICAgLy8gbXlWaWV3J3MgaHRtbDoKLSAgICAvLyA8ZGl2IGlkPSJlbWJlcjIyOCIgY2xhc3M9
ImVtYmVyLXZpZXciPkNoaWxkIHZpZXc6IDwvZGl2PgotCi0gICAgdmFyIEZvb1ZpZXcgPSBFbWJl
ci5WaWV3LmV4dGVuZCh7Ci0gICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxl
KCc8aDE+Rm9vPC9oMT4gJykKLSAgICB9KTsKLSAgICB2YXIgZm9vVmlldyA9IEZvb1ZpZXcuY3Jl
YXRlKCk7Ci0gICAgbXlWaWV3LmNvbm5lY3RPdXRsZXQoJ21haW4nLCBmb29WaWV3KTsKLSAgICAv
LyBteVZpZXcncyBodG1sOgotICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXIt
dmlldyI+Q2hpbGQgdmlldzoKLSAgICAvLyAgIDxkaXYgaWQ9ImVtYmVyMjM0IiBjbGFzcz0iZW1i
ZXItdmlldyI+PGgxPkZvbzwvaDE+IDwvZGl2PgotICAgIC8vIDwvZGl2PgotCi0gICAgbXlWaWV3
LmRpc2Nvbm5lY3RPdXRsZXQoJ21haW4nKTsKLSAgICAvLyBteVZpZXcncyBodG1sOgotICAgIC8v
IDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzogPC9kaXY+
Ci0gICAgYGBgCi0KLSAgICBAbWV0aG9kIGRpc2Nvbm5lY3RPdXRsZXQKLSAgICBAcGFyYW0gIHtT
dHJpbmd9IG91dGxldE5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dGxldCB0byBiZSByZW1vdmVkCi0g
ICAqLwotICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihvdXRsZXROYW1lKSB7Ci0gICAgaWYg
KCF0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMpIHsKLSAgICAgIHRoaXMuX3BlbmRpbmdEaXNj
b25uZWN0aW9ucyA9IHt9OwotICAgIH0KLSAgICB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnNb
b3V0bGV0TmFtZV0gPSB0cnVlOwotICAgIEVtYmVyLnJ1bi5vbmNlKHRoaXMsICdfZmluaXNoRGlz
Y29ubmVjdGlvbnMnKTsKLSAgfSwKLQotICAvKioKLSAgICBHZXRzIGFuIG91dGxldCB0aGF0IGlz
IHBlbmRpbmcgZGlzY29ubmVjdGlvbiBhbmQgdGhlbgotICAgIG51bGxpZnlzIHRoZSBvYmplY3Qg
b24gdGhlIGBfb3V0bGV0YCBvYmplY3QuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgX2Zp
bmlzaERpc2Nvbm5lY3Rpb25zCi0gICAqLwotICBfZmluaXNoRGlzY29ubmVjdGlvbnM6IGZ1bmN0
aW9uKCkgewotICAgIHZhciBvdXRsZXRzID0gZ2V0KHRoaXMsICdfb3V0bGV0cycpOwotICAgIHZh
ciBwZW5kaW5nRGlzY29ubmVjdGlvbnMgPSB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnM7Ci0g
ICAgdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zID0gbnVsbDsKLQotICAgIGZvciAodmFyIG91
dGxldE5hbWUgaW4gcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7Ci0gICAgICBzZXQob3V0bGV0cywg
b3V0bGV0TmFtZSwgbnVsbCk7Ci0gICAgfQotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5j
dGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci12aWV3cwotKi8K
LQotLy8gQWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGFmdGVyIHRoZSAnYWN0aW9ucycgcXVldWUgKHdo
ZXJlIFJTVlAgcHJvbWlzZXMKLS8vIHJlc29sdmUpLCB3aGljaCBpcyB1c2VkIGluIHJvdXRlciB0
cmFuc2l0aW9ucyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5Ci0vLyBsb2FkaW5nIHN0YXRlIGVudHJ5
IGlmIGFsbCBjb250ZXh0IHByb21pc2VzIHJlc29sdmUgb24gdGhlIAotLy8gJ2FjdGlvbnMnIHF1
ZXVlIGZpcnN0LgotCi12YXIgcXVldWVzID0gRW1iZXIucnVuLnF1ZXVlcywKLSAgICBpbmRleE9m
ID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKLXF1ZXVlcy5zcGxpY2UoaW5kZXhPZi5j
YWxsKHF1ZXVlcywgJ2FjdGlvbnMnKSArIDEsIDAsICdyb3V0ZXJUcmFuc2l0aW9ucycpOwotCi19
KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxl
IGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl
dDsKLQotLyoqCi0gIEVtYmVyLkxvY2F0aW9uIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNv
cnJlY3QgaW1wbGVtZW50YXRpb24gb2YKLSAgdGhlIGBsb2NhdGlvbmAgQVBJLgotCi0gICMjIElt
cGxlbWVudGF0aW9ucwotCi0gIFlvdSBjYW4gcGFzcyBhbiBpbXBsZW1lbnRhdGlvbiBuYW1lIChg
aGFzaGAsIGBoaXN0b3J5YCwgYG5vbmVgKSB0byBmb3JjZSBhCi0gIHBhcnRpY3VsYXIgaW1wbGVt
ZW50YXRpb24gdG8gYmUgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLgotCi0gICMjIyBIYXNoTG9j
YXRpb24KLQotICBVc2luZyBgSGFzaExvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgd2l0aCBhIGAj
YCAoaGFzaCBzaWduKSBzZXBhcmF0aW5nIHRoZQotICBzZXJ2ZXIgc2lkZSBVUkwgcG9ydGlvbiBv
ZiB0aGUgVVJMIGZyb20gdGhlIHBvcnRpb24gdGhhdCBpcyB1c2VkIGJ5IEVtYmVyLgotICBUaGlz
IHJlbGllcyB1cG9uIHRoZSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlIGJyb3dz
ZXIuCi0KLSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Sb3V0ZXIubWFwKGZ1
bmN0aW9uKCkgewotICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7Ci0gICAg
ICB0aGlzLnJvdXRlKCduZXcnKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgQXBwLlJvdXRlci5yZW9w
ZW4oewotICAgIGxvY2F0aW9uOiAnaGFzaCcKLSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgd2lsbCBy
ZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvIy9wb3N0cy9uZXdgLgotCi0gICMjIyBIaXN0
b3J5TG9jYXRpb24KLQotICBVc2luZyBgSGlzdG9yeUxvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMg
dGhhdCBhcmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhCi0gIHN0YW5kYXJkIFVSTC4gVGhpcyBy
ZWxpZXMgdXBvbiB0aGUgYnJvd3NlcidzIGBoaXN0b3J5YCBBUEkuCi0KLSAgRXhhbXBsZToKLQot
ICBgYGBqYXZhc2NyaXB0Ci0gIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewotICAgIHRoaXMu
cmVzb3VyY2UoJ3Bvc3RzJywgZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnJvdXRlKCduZXcnKTsK
LSAgICB9KTsKLSAgfSk7Ci0KLSAgQXBwLlJvdXRlci5yZW9wZW4oewotICAgIGxvY2F0aW9uOiAn
aGlzdG9yeScKLSAgfSk7Ci0gIGBgYAotCi0gIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5u
ZXcgdXJsIG9mIGAvcG9zdHMvbmV3YC4KLQotICAjIyMgTm9uZUxvY2F0aW9uCi0KLSAgVXNpbmcg
YE5vbmVMb2NhdGlvbmAgY2F1c2VzIEVtYmVyIHRvIG5vdCBzdG9yZSB0aGUgYXBwbGljYXRpb25z
IFVSTCBzdGF0ZQotICBpbiB0aGUgYWN0dWFsIFVSTC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBm
b3IgdGVzdGluZyBwdXJwb3NlcywgYW5kIGlzIG9uZQotICBvZiB0aGUgY2hhbmdlcyBtYWRlIHdo
ZW4gY2FsbGluZyBgQXBwLnNldHVwRm9yVGVzdGluZygpYC4KLQotICAjIyBMb2NhdGlvbiBBUEkK
LQotICBFYWNoIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93
aW5nIG1ldGhvZHM6Ci0KLSAgKiBpbXBsZW1lbnRhdGlvbjogcmV0dXJucyB0aGUgc3RyaW5nIG5h
bWUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGltcGxlbWVudGF0aW9uLgotICAqIGdldFVSTDogcmV0
dXJucyB0aGUgY3VycmVudCBVUkwuCi0gICogc2V0VVJMKHBhdGgpOiBzZXRzIHRoZSBjdXJyZW50
IFVSTC4KLSAgKiByZXBsYWNlVVJMKHBhdGgpOiByZXBsYWNlIHRoZSBjdXJyZW50IFVSTCAob3B0
aW9uYWwpLgotICAqIG9uVXBkYXRlVVJMKGNhbGxiYWNrKTogdHJpZ2dlcnMgdGhlIGNhbGxiYWNr
IHdoZW4gdGhlIFVSTCBjaGFuZ2VzLgotICAqIGZvcm1hdFVSTCh1cmwpOiBmb3JtYXRzIGB1cmxg
IHRvIGJlIHBsYWNlZCBpbnRvIGBocmVmYCBhdHRyaWJ1dGUuCi0KLSAgQ2FsbGluZyBzZXRVUkwg
b3IgcmVwbGFjZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4KLQot
ICBAY2xhc3MgTG9jYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAc3RhdGljCi0qLwotRW1i
ZXIuTG9jYXRpb24gPSB7Ci0gIC8qKgotICAgVGhpcyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9m
IHVzaW5nIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbgotICAgaW1wbGVtZW50
YXRpb24gYXMgZGVzaXJlZC4KLQotICAgRm9yIGV4YW1wbGU6Ci0KLSAgIGBgYGphdmFzY3JpcHQK
LSAgIC8vIEdpdmVuIGEgbG9jYXRpb24gcmVnaXN0ZXJlZCBhcyBmb2xsb3dzOgotICAgY29udGFp
bmVyLnJlZ2lzdGVyKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnLCBIaXN0b3J5VGVzdExvY2F0aW9u
KTsKLQotICAgLy8gWW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB2aWE6Ci0gICBjb250
YWluZXIubG9va3VwKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnKTsKLSAgIGBgYAotCi0gICAgQG1l
dGhvZCBjcmVhdGUKLSAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwotICAgIEByZXR1cm4ge09i
amVjdH0gYW4gaW5zdGFuY2Ugb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBsb2NhdGlvbmAg
QVBJCi0gICAgQGRlcHJlY2F0ZWQgVXNlIHRoZSBjb250YWluZXIgdG8gbG9va3VwIHRoZSBsb2Nh
dGlvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdQotICAgIG5lZWQuCi0gICovCi0gIGNyZWF0ZTog
ZnVuY3Rpb24ob3B0aW9ucykgewotICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IG9wdGlvbnMgJiYg
b3B0aW9ucy5pbXBsZW1lbnRhdGlvbjsKLSAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxvY2F0aW9u
LmNyZWF0ZTogeW91IG11c3Qgc3BlY2lmeSBhICdpbXBsZW1lbnRhdGlvbicgb3B0aW9uIiwgISFp
bXBsZW1lbnRhdGlvbik7Ci0KLSAgICB2YXIgaW1wbGVtZW50YXRpb25DbGFzcyA9IHRoaXMuaW1w
bGVtZW50YXRpb25zW2ltcGxlbWVudGF0aW9uXTsKLSAgICBFbWJlci5hc3NlcnQoIkVtYmVyLkxv
Y2F0aW9uLmNyZWF0ZTogIiArIGltcGxlbWVudGF0aW9uICsgIiBpcyBub3QgYSB2YWxpZCBpbXBs
ZW1lbnRhdGlvbiIsICEhaW1wbGVtZW50YXRpb25DbGFzcyk7Ci0KLSAgICByZXR1cm4gaW1wbGVt
ZW50YXRpb25DbGFzcy5jcmVhdGUuYXBwbHkoaW1wbGVtZW50YXRpb25DbGFzcywgYXJndW1lbnRz
KTsKLSAgfSwKLQotICAvKioKLSAgIFRoaXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2lu
ZyB0aGUgY29udGFpbmVyIHRvIHJlZ2lzdGVyIHRoZQotICAgbG9jYXRpb24gaW1wbGVtZW50YXRp
b24gYXMgZGVzaXJlZC4KLQotICAgRXhhbXBsZToKLQotICAgYGBgamF2YXNjcmlwdAotICAgQXBw
bGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJoaXN0b3J5LXRlc3QtbG9jYXRpb24i
LAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewot
ICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnktdGVzdCcsIEhpc3Rv
cnlUZXN0TG9jYXRpb24pOwotICAgIH0KLSAgIH0pOwotICAgYGBgCi0KLSAgIEBtZXRob2QgcmVn
aXN0ZXJJbXBsZW1lbnRhdGlvbgotICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKLSAgIEBwYXJhbSB7
T2JqZWN0fSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGxvY2F0aW9uYCBBUEkKLSAgIEBkZXByZWNh
dGVkIFJlZ2lzdGVyIHlvdXIgY3VzdG9tIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIHdpdGggdGhl
Ci0gICBjb250YWluZXIgZGlyZWN0bHkuCi0gICovCi0gIHJlZ2lzdGVySW1wbGVtZW50YXRpb246
IGZ1bmN0aW9uKG5hbWUsIGltcGxlbWVudGF0aW9uKSB7Ci0gICAgdGhpcy5pbXBsZW1lbnRhdGlv
bnNbbmFtZV0gPSBpbXBsZW1lbnRhdGlvbjsKLSAgfSwKLQotICBpbXBsZW1lbnRhdGlvbnM6IHt9
Ci19OwotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1A
c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKLSovCi0KLXZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9
IEVtYmVyLnNldDsKLQotLyoqCi0gIEVtYmVyLk5vbmVMb2NhdGlvbiBkb2VzIG5vdCBpbnRlcmFj
dCB3aXRoIHRoZSBicm93c2VyLiBJdCBpcyB1c2VmdWwgZm9yCi0gIHRlc3RpbmcsIG9yIHdoZW4g
eW91IG5lZWQgdG8gbWFuYWdlIHN0YXRlIHdpdGggeW91ciBSb3V0ZXIsIGJ1dCB0ZW1wb3Jhcmls
eQotICBkb24ndCB3YW50IGl0IHRvIG11Y2sgd2l0aCB0aGUgVVJMIChmb3IgZXhhbXBsZSB3aGVu
IHlvdSBlbWJlZCB5b3VyCi0gIGFwcGxpY2F0aW9uIGluIGEgbGFyZ2VyIHBhZ2UpLgotCi0gIEBj
bGFzcyBOb25lTG9jYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5P
YmplY3QKLSovCi1FbWJlci5Ob25lTG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLSAg
cGF0aDogJycsCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoLgotCi0gICAg
QHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVSTAotICAgIEByZXR1cm4ge1N0cmluZ30gcGF0aAot
ICAqLwotICBnZXRVUkw6IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiBnZXQodGhpcywgJ3BhdGgn
KTsKLSAgfSwKLQotICAvKioKLSAgICBTZXQgdGhlIHBhdGggYW5kIHJlbWVtYmVycyB3aGF0IHdh
cyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCi0gICAgdG8gY2hhbmdlIHRoZSBwYXRoIHdpbGwgbm90
IGludm9rZSB0aGUgYHVwZGF0ZVVSTGAgY2FsbGJhY2suCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBm
dW5jdGlvbihwYXRoKSB7Ci0gICAgc2V0KHRoaXMsICdwYXRoJywgcGF0aCk7Ci0gIH0sCi0KLSAg
LyoqCi0gICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHBhdGgg
Y2hhbmdlcy4gVGhlc2UKLSAgICBjYWxsYmFja3Mgd2lsbCBleGVjdXRlIHdoZW4gdGhlIHVzZXIg
cHJlc3NlcyB0aGUgYmFjayBvciBmb3J3YXJkCi0gICAgYnV0dG9uLCBidXQgbm90IGFmdGVyIGBz
ZXRVUkxgIGlzIGludm9rZWQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgb25VcGRhdGVV
UkwKLSAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQotICAqLwotICBvblVwZGF0ZVVSTDog
ZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0cyB0aGUgcGF0aCBhbmQgY2FsbHMgdGhlIGB1cGRhdGVV
UkxgIGNhbGxiYWNrLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGhhbmRsZVVSTAotICAg
IEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259Ci0gICovCi0gIGhhbmRsZVVSTDogZnVuY3Rpb24o
dXJsKSB7Ci0gICAgc2V0KHRoaXMsICdwYXRoJywgdXJsKTsKLSAgICB0aGlzLnVwZGF0ZUNhbGxi
YWNrKHVybCk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2l2ZW4gYSBVUkwsIGZvcm1hdHMgaXQgdG8g
YmUgcGxhY2VkIGludG8gdGhlIHBhZ2UgYXMgcGFydAotICAgIG9mIGFuIGVsZW1lbnQncyBgaHJl
ZmAgYXR0cmlidXRlLgotCi0gICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2lu
ZyB0aGUge3thY3Rpb259fSBoZWxwZXIKLSAgICB0byBnZW5lcmF0ZSBhIFVSTCBiYXNlZCBvbiBh
biBldmVudC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBmb3JtYXRVUkwKLSAgICBAcGFy
YW0gdXJsIHtTdHJpbmd9Ci0gICAgQHJldHVybiB7U3RyaW5nfSB1cmwKLSAgKi8KLSAgZm9ybWF0
VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBvdmVy
bHkgbWVhbmluZ2Z1bCwgYnV0IHdlIGRvIG5vdCB3YW50IHRvIHRocm93Ci0gICAgLy8gZXJyb3Jz
IHdoZW4gdGVzdCBjb2RlIHJlbmRlcnMgdGVtcGxhdGVzIGNvbnRhaW5pbmcge3thY3Rpb24gaHJl
Zj10cnVlfX0KLSAgICAvLyBoZWxwZXJzLgotICAgIHJldHVybiB1cmw7Ci0gIH0KLX0pOwotCi1F
bWJlci5Mb2NhdGlvbi5yZWdpc3RlckltcGxlbWVudGF0aW9uKCdub25lJywgRW1iZXIuTm9uZUxv
Y2F0aW9uKTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotQG1vZHVsZSBlbWJl
cgotQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCi0qLwotCi12YXIgZ2V0ID0gRW1iZXIuZ2V0LCBz
ZXQgPSBFbWJlci5zZXQ7Ci0KLS8qKgotICBgRW1iZXIuSGFzaExvY2F0aW9uYCBpbXBsZW1lbnRz
IHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJyb3dzZXIncwotICBoYXNoLiBBdCBwcmVzZW50
LCBpdCByZWxpZXMgb24gYSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCi0gIGJy
b3dzZXIuCi0KLSAgQGNsYXNzIEhhc2hMb2NhdGlvbgotICBAbmFtZXNwYWNlIEVtYmVyCi0gIEBl
eHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLkhhc2hMb2NhdGlvbiA9IEVtYmVyLk9iamVj
dC5leHRlbmQoewotCi0gIGluaXQ6IGZ1bmN0aW9uKCkgewotICAgIHNldCh0aGlzLCAnbG9jYXRp
b24nLCBnZXQodGhpcywgJ2xvY2F0aW9uJykgfHwgd2luZG93LmxvY2F0aW9uKTsKLSAgfSwKLQot
ICAvKioKLSAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGBsb2NhdGlvbi5oYXNoYCwgbWludXMgdGhl
ICcjJyBhdCB0aGUgZnJvbnQuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZ2V0VVJMCi0g
ICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgaW1wbGVtZW50
YXRpb24gd2l0aG91dCBmZWF0dXJlIGZsYWcgZW5hYmxlZAotICAgIHJldHVybiBnZXQodGhpcywg
J2xvY2F0aW9uJykuaGFzaC5zdWJzdHIoMSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU2V0IHRoZSBg
bG9jYXRpb24uaGFzaGAgYW5kIHJlbWVtYmVycyB3aGF0IHdhcyBzZXQuIFRoaXMgcHJldmVudHMK
LSAgICBgb25VcGRhdGVVUkxgIGNhbGxiYWNrcyBmcm9tIHRyaWdnZXJpbmcgd2hlbiB0aGUgaGFz
aCB3YXMgc2V0IGJ5Ci0gICAgYEhhc2hMb2NhdGlvbmAuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBt
ZXRob2Qgc2V0VVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgc2V0VVJMOiBm
dW5jdGlvbihwYXRoKSB7Ci0gICAgZ2V0KHRoaXMsICdsb2NhdGlvbicpLmhhc2ggPSBwYXRoOwot
ICAgIHNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOwotICB9LAotCi0gIC8qKgotICAgIFVz
ZXMgbG9jYXRpb24ucmVwbGFjZSB0byB1cGRhdGUgdGhlIHVybCB3aXRob3V0IGEgcGFnZSByZWxv
YWQKLSAgICBvciBoaXN0b3J5IG1vZGlmaWNhdGlvbi4KLQotICAgIEBwcml2YXRlCi0gICAgQG1l
dGhvZCByZXBsYWNlVVJMCi0gICAgQHBhcmFtIHBhdGgge1N0cmluZ30KLSAgKi8KLSAgcmVwbGFj
ZVVSTDogZnVuY3Rpb24ocGF0aCkgewotICAgIGdldCh0aGlzLCAnbG9jYXRpb24nKS5yZXBsYWNl
KCcjJyArIHBhdGgpOwotICB9LAotCi0gIC8qKgotICAgIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8g
YmUgaW52b2tlZCB3aGVuIHRoZSBoYXNoIGNoYW5nZXMuIFRoZXNlCi0gICAgY2FsbGJhY2tzIHdp
bGwgZXhlY3V0ZSB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGJhY2sgb3IgZm9yd2FyZAotICAg
IGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJMYCBpcyBpbnZva2VkLgotCi0gICAgQHByaXZh
dGUKLSAgICBAbWV0aG9kIG9uVXBkYXRlVVJMCi0gICAgQHBhcmFtIGNhbGxiYWNrIHtGdW5jdGlv
bn0KLSAgKi8KLSAgb25VcGRhdGVVUkw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gICAgdmFyIHNl
bGYgPSB0aGlzOwotICAgIHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKTsKLQotICAgIEVt
YmVyLiQod2luZG93KS5vbignaGFzaGNoYW5nZS5lbWJlci1sb2NhdGlvbi0nK2d1aWQsIGZ1bmN0
aW9uKCkgewotICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgcGF0aCA9
IGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpOwotICAgICAgICBpZiAoZ2V0KHNlbGYsICdsYXN0U2V0
VVJMJykgPT09IHBhdGgpIHsgcmV0dXJuOyB9Ci0KLSAgICAgICAgc2V0KHNlbGYsICdsYXN0U2V0
VVJMJywgbnVsbCk7Ci0KLSAgICAgICAgY2FsbGJhY2socGF0aCk7Ci0gICAgICB9KTsKLSAgICB9
KTsKLSAgfSwKLQotICAvKioKLSAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFj
ZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0Ci0gICAgb2YgYW4gZWxlbWVudCdzIGBocmVmYCBhdHRy
aWJ1dGUuCi0KLSAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7
e2FjdGlvbn19IGhlbHBlcgotICAgIHRvIGdlbmVyYXRlIGEgVVJMIGJhc2VkIG9uIGFuIGV2ZW50
LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGZvcm1hdFVSTAotICAgIEBwYXJhbSB1cmwg
e1N0cmluZ30KLSAgKi8KLSAgZm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICByZXR1cm4g
JyMnK3VybDsKLSAgfSwKLQotICAvKioKLSAgICBDbGVhbnMgdXAgdGhlIEhhc2hMb2NhdGlvbiBl
dmVudCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQot
ICAqLwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5n
dWlkRm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3aW5kb3cpLm9mZignaGFzaGNoYW5nZS5lbWJl
ci1sb2NhdGlvbi0nK2d1aWQpOwotICB9Ci19KTsKLQotRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJ
bXBsZW1lbnRhdGlvbignaGFzaCcsIEVtYmVyLkhhc2hMb2NhdGlvbik7Ci0KLX0pKCk7Ci0KLQot
Ci0oZnVuY3Rpb24oKSB7Ci0vKioKLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91
dGluZwotKi8KLQotdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotdmFyIHBv
cHN0YXRlRmlyZWQgPSBmYWxzZTsKLXZhciBzdXBwb3J0c0hpc3RvcnlTdGF0ZSA9IHdpbmRvdy5o
aXN0b3J5ICYmICdzdGF0ZScgaW4gd2luZG93Lmhpc3Rvcnk7Ci0KLS8qKgotICBFbWJlci5IaXN0
b3J5TG9jYXRpb24gaW1wbGVtZW50cyB0aGUgbG9jYXRpb24gQVBJIHVzaW5nIHRoZSBicm93c2Vy
J3MKLSAgaGlzdG9yeS5wdXNoU3RhdGUgQVBJLgotCi0gIEBjbGFzcyBIaXN0b3J5TG9jYXRpb24K
LSAgQG5hbWVzcGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5I
aXN0b3J5TG9jYXRpb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKLQotICBpbml0OiBmdW5jdGlv
bigpIHsKLSAgICBzZXQodGhpcywgJ2xvY2F0aW9uJywgZ2V0KHRoaXMsICdsb2NhdGlvbicpIHx8
IHdpbmRvdy5sb2NhdGlvbik7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXNlZCB0byBzZXQgc3RhdGUg
b24gZmlyc3QgY2FsbCB0byBzZXRVUkwKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBpbml0
U3RhdGUKLSAgKi8KLSAgaW5pdFN0YXRlOiBmdW5jdGlvbigpIHsKLSAgICBzZXQodGhpcywgJ2hp
c3RvcnknLCBnZXQodGhpcywgJ2hpc3RvcnknKSB8fCB3aW5kb3cuaGlzdG9yeSk7Ci0gICAgdGhp
cy5yZXBsYWNlU3RhdGUodGhpcy5mb3JtYXRVUkwodGhpcy5nZXRVUkwoKSkpOwotICB9LAotCi0g
IC8qKgotICAgIFdpbGwgYmUgcHJlLXBlbmRlZCB0byBwYXRoIHVwb24gc3RhdGUgY2hhbmdlCi0K
LSAgICBAcHJvcGVydHkgcm9vdFVSTAotICAgIEBkZWZhdWx0ICcvJwotICAqLwotICByb290VVJM
OiAnLycsCi0KLSAgLyoqCi0gICAgUmV0dXJucyB0aGUgY3VycmVudCBgbG9jYXRpb24ucGF0aG5h
bWVgIHdpdGhvdXQgYHJvb3RVUkxgLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFVS
TAotICAgIEByZXR1cm4gdXJsIHtTdHJpbmd9Ci0gICovCi0gIGdldFVSTDogZnVuY3Rpb24oKSB7
Ci0gICAgdmFyIHJvb3RVUkwgPSBnZXQodGhpcywgJ3Jvb3RVUkwnKSwKLSAgICAgICAgbG9jYXRp
b24gPSBnZXQodGhpcywgJ2xvY2F0aW9uJyksCi0gICAgICAgIHBhdGggPSBsb2NhdGlvbi5wYXRo
bmFtZTsKLQotICAgIHJvb3RVUkwgPSByb290VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB2
YXIgdXJsID0gcGF0aC5yZXBsYWNlKHJvb3RVUkwsICcnKTsKLQotICAgIAotICAgIHJldHVybiB1
cmw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgVXNlcyBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvIHVwZGF0
ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1l
dGhvZCBzZXRVUkwKLSAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQotICAqLwotICBzZXRVUkw6IGZ1
bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0
aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0gICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGgg
IT09IHBhdGgpIHsKLSAgICAgIHRoaXMucHVzaFN0YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQot
ICAvKioKLSAgICBVc2VzIGBoaXN0b3J5LnJlcGxhY2VTdGF0ZWAgdG8gdXBkYXRlIHRoZSB1cmwg
d2l0aG91dCBhIHBhZ2UgcmVsb2FkCi0gICAgb3IgaGlzdG9yeSBtb2RpZmljYXRpb24uCi0KLSAg
ICBAcHJpdmF0ZQotICAgIEBtZXRob2QgcmVwbGFjZVVSTAotICAgIEBwYXJhbSBwYXRoIHtTdHJp
bmd9Ci0gICovCi0gIHJlcGxhY2VVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2YXIgc3RhdGUg
PSB0aGlzLmdldFN0YXRlKCk7Ci0gICAgcGF0aCA9IHRoaXMuZm9ybWF0VVJMKHBhdGgpOwotCi0g
ICAgaWYgKHN0YXRlICYmIHN0YXRlLnBhdGggIT09IHBhdGgpIHsKLSAgICAgIHRoaXMucmVwbGFj
ZVN0YXRlKHBhdGgpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgIEdldCB0aGUgY3VycmVudCBg
aGlzdG9yeS5zdGF0ZWAKLSAgIFBvbHlmaWxsIGNoZWNrcyBmb3IgbmF0aXZlIGJyb3dzZXIgc3Vw
cG9ydCBhbmQgZmFsbHMgYmFjayB0byByZXRyaWV2aW5nCi0gICBmcm9tIGEgcHJpdmF0ZSBfaGlz
dG9yeVN0YXRlIHZhcmlhYmxlCi0KLSAgIEBwcml2YXRlCi0gICBAbWV0aG9kIGdldFN0YXRlCi0g
ICBAcmV0dXJuIHN0YXRlIHtPYmplY3R9Ci0gICovCi0gIGdldFN0YXRlOiBmdW5jdGlvbigpIHsK
LSAgICByZXR1cm4gc3VwcG9ydHNIaXN0b3J5U3RhdGUgPyBnZXQodGhpcywgJ2hpc3RvcnknKS5z
dGF0ZSA6IHRoaXMuX2hpc3RvcnlTdGF0ZTsKLSAgfSwKLQotICAvKioKLSAgIFB1c2hlcyBhIG5l
dyBzdGF0ZS4KLQotICAgQHByaXZhdGUKLSAgIEBtZXRob2QgcHVzaFN0YXRlCi0gICBAcGFyYW0g
cGF0aCB7U3RyaW5nfQotICAqLwotICBwdXNoU3RhdGU6IGZ1bmN0aW9uKHBhdGgpIHsKLSAgICB2
YXIgc3RhdGUgPSB7IHBhdGg6IHBhdGggfTsKLQotICAgIGdldCh0aGlzLCAnaGlzdG9yeScpLnB1
c2hTdGF0ZShzdGF0ZSwgbnVsbCwgcGF0aCk7Ci0KLSAgICAvLyBzdG9yZSBzdGF0ZSBpZiBicm93
c2VyIGRvZXNuJ3Qgc3VwcG9ydCBgaGlzdG9yeS5zdGF0ZWAKLSAgICBpZiAoIXN1cHBvcnRzSGlz
dG9yeVN0YXRlKSB7Ci0gICAgICB0aGlzLl9oaXN0b3J5U3RhdGUgPSBzdGF0ZTsKLSAgICB9Ci0K
LSAgICAvLyB1c2VkIGZvciB3ZWJraXQgd29ya2Fyb3VuZAotICAgIHRoaXMuX3ByZXZpb3VzVVJM
ID0gdGhpcy5nZXRVUkwoKTsKLSAgfSwKLQotICAvKioKLSAgIFJlcGxhY2VzIHRoZSBjdXJyZW50
IHN0YXRlLgotCi0gICBAcHJpdmF0ZQotICAgQG1ldGhvZCByZXBsYWNlU3RhdGUKLSAgIEBwYXJh
bSBwYXRoIHtTdHJpbmd9Ci0gICovCi0gIHJlcGxhY2VTdGF0ZTogZnVuY3Rpb24ocGF0aCkgewot
ICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OwotCi0gICAgZ2V0KHRoaXMsICdoaXN0b3J5
JykucmVwbGFjZVN0YXRlKHN0YXRlLCBudWxsLCBwYXRoKTsKLQotICAgIC8vIHN0b3JlIHN0YXRl
IGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGBoaXN0b3J5LnN0YXRlYAotICAgIGlmICghc3Vw
cG9ydHNIaXN0b3J5U3RhdGUpIHsKLSAgICAgIHRoaXMuX2hpc3RvcnlTdGF0ZSA9IHN0YXRlOwot
ICAgIH0KLQotICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCi0gICAgdGhpcy5fcHJl
dmlvdXNVUkwgPSB0aGlzLmdldFVSTCgpOwotICB9LAotCi0gIC8qKgotICAgIFJlZ2lzdGVyIGEg
Y2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgYnJvd3NlcgotICAgIGhpc3Rvcnkg
Y2hhbmdlcywgaW5jbHVkaW5nIHVzaW5nIGZvcndhcmQgYW5kIGJhY2sgYnV0dG9ucy4KLQotICAg
IEBwcml2YXRlCi0gICAgQG1ldGhvZCBvblVwZGF0ZVVSTAotICAgIEBwYXJhbSBjYWxsYmFjayB7
RnVuY3Rpb259Ci0gICovCi0gIG9uVXBkYXRlVVJMOiBmdW5jdGlvbihjYWxsYmFjaykgewotICAg
IHZhciBndWlkID0gRW1iZXIuZ3VpZEZvcih0aGlzKSwKLSAgICAgICAgc2VsZiA9IHRoaXM7Ci0K
LSAgICBFbWJlci4kKHdpbmRvdykub24oJ3BvcHN0YXRlLmVtYmVyLWxvY2F0aW9uLScrZ3VpZCwg
ZnVuY3Rpb24oZSkgewotICAgICAgLy8gSWdub3JlIGluaXRpYWwgcGFnZSBsb2FkIHBvcHN0YXRl
IGV2ZW50IGluIENocm9tZQotICAgICAgaWYgKCFwb3BzdGF0ZUZpcmVkKSB7Ci0gICAgICAgIHBv
cHN0YXRlRmlyZWQgPSB0cnVlOwotICAgICAgICBpZiAoc2VsZi5nZXRVUkwoKSA9PT0gc2VsZi5f
cHJldmlvdXNVUkwpIHsgcmV0dXJuOyB9Ci0gICAgICB9Ci0gICAgICBjYWxsYmFjayhzZWxmLmdl
dFVSTCgpKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioKLSAgICBVc2VkIHdoZW4gdXNpbmcgYHt7
YWN0aW9ufX1gIGhlbHBlci4gIFRoZSB1cmwgaXMgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSByb290
VVJMLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGZvcm1hdFVSTAotICAgIEBwYXJhbSB1
cmwge1N0cmluZ30KLSAgICBAcmV0dXJuIGZvcm1hdHRlZCB1cmwge1N0cmluZ30KLSAgKi8KLSAg
Zm9ybWF0VVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICB2YXIgcm9vdFVSTCA9IGdldCh0aGlzLCAn
cm9vdFVSTCcpOwotCi0gICAgaWYgKHVybCAhPT0gJycpIHsKLSAgICAgIHJvb3RVUkwgPSByb290
VVJMLnJlcGxhY2UoL1wvJC8sICcnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm9vdFVSTCArIHVy
bDsKLSAgfSwKLQotICAvKioKLSAgICBDbGVhbnMgdXAgdGhlIEhpc3RvcnlMb2NhdGlvbiBldmVu
dCBsaXN0ZW5lci4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3aWxsRGVzdHJveQotICAq
LwotICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGd1aWQgPSBFbWJlci5ndWlk
Rm9yKHRoaXMpOwotCi0gICAgRW1iZXIuJCh3aW5kb3cpLm9mZigncG9wc3RhdGUuZW1iZXItbG9j
YXRpb24tJytndWlkKTsKLSAgfQotfSk7Ci0KLUVtYmVyLkxvY2F0aW9uLnJlZ2lzdGVySW1wbGVt
ZW50YXRpb24oJ2hpc3RvcnknLCBFbWJlci5IaXN0b3J5TG9jYXRpb24pOwotCi19KSgpOwotCi0K
LQotKGZ1bmN0aW9uKCkgewotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotLyoqCi1FbWJl
ciBSb3V0aW5nCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItcm91dGluZwotQHJl
cXVpcmVzIGVtYmVyLXZpZXdzCi0qLwotCi19KSgpOwotCi0oZnVuY3Rpb24oKSB7Ci1mdW5jdGlv
biB2aXNpdCh2ZXJ0ZXgsIGZuLCB2aXNpdGVkLCBwYXRoKSB7Ci0gIHZhciBuYW1lID0gdmVydGV4
Lm5hbWUsCi0gICAgdmVydGljZXMgPSB2ZXJ0ZXguaW5jb21pbmcsCi0gICAgbmFtZXMgPSB2ZXJ0
ZXguaW5jb21pbmdOYW1lcywKLSAgICBsZW4gPSBuYW1lcy5sZW5ndGgsCi0gICAgaTsKLSAgaWYg
KCF2aXNpdGVkKSB7Ci0gICAgdmlzaXRlZCA9IHt9OwotICB9Ci0gIGlmICghcGF0aCkgewotICAg
IHBhdGggPSBbXTsKLSAgfQotICBpZiAodmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewot
ICAgIHJldHVybjsKLSAgfQotICBwYXRoLnB1c2gobmFtZSk7Ci0gIHZpc2l0ZWRbbmFtZV0gPSB0
cnVlOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICB2aXNpdCh2ZXJ0aWNlc1tu
YW1lc1tpXV0sIGZuLCB2aXNpdGVkLCBwYXRoKTsKLSAgfQotICBmbih2ZXJ0ZXgsIHBhdGgpOwot
ICBwYXRoLnBvcCgpOwotfQotCi1mdW5jdGlvbiBEQUcoKSB7Ci0gIHRoaXMubmFtZXMgPSBbXTsK
LSAgdGhpcy52ZXJ0aWNlcyA9IHt9OwotfQotCi1EQUcucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9u
KG5hbWUpIHsKLSAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQotICBpZiAodGhpcy52ZXJ0aWNlcy5o
YXNPd25Qcm9wZXJ0eShuYW1lKSkgewotICAgIHJldHVybiB0aGlzLnZlcnRpY2VzW25hbWVdOwot
ICB9Ci0gIHZhciB2ZXJ0ZXggPSB7Ci0gICAgbmFtZTogbmFtZSwgaW5jb21pbmc6IHt9LCBpbmNv
bWluZ05hbWVzOiBbXSwgaGFzT3V0Z29pbmc6IGZhbHNlLCB2YWx1ZTogbnVsbAotICB9OwotICB0
aGlzLnZlcnRpY2VzW25hbWVdID0gdmVydGV4OwotICB0aGlzLm5hbWVzLnB1c2gobmFtZSk7Ci0g
IHJldHVybiB2ZXJ0ZXg7Ci19OwotCi1EQUcucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKG5hbWUs
IHZhbHVlKSB7Ci0gIHRoaXMuYWRkKG5hbWUpLnZhbHVlID0gdmFsdWU7Ci19OwotCi1EQUcucHJv
dG90eXBlLmFkZEVkZ2UgPSBmdW5jdGlvbihmcm9tTmFtZSwgdG9OYW1lKSB7Ci0gIGlmICghZnJv
bU5hbWUgfHwgIXRvTmFtZSB8fCBmcm9tTmFtZSA9PT0gdG9OYW1lKSB7Ci0gICAgcmV0dXJuOwot
ICB9Ci0gIHZhciBmcm9tID0gdGhpcy5hZGQoZnJvbU5hbWUpLCB0byA9IHRoaXMuYWRkKHRvTmFt
ZSk7Ci0gIGlmICh0by5pbmNvbWluZy5oYXNPd25Qcm9wZXJ0eShmcm9tTmFtZSkpIHsKLSAgICBy
ZXR1cm47Ci0gIH0KLSAgZnVuY3Rpb24gY2hlY2tDeWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKLSAgICBp
ZiAodmVydGV4Lm5hbWUgPT09IHRvTmFtZSkgewotICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y
KCJjeWNsZSBkZXRlY3RlZDogIiArIHRvTmFtZSArICIgPC0gIiArIHBhdGguam9pbigiIDwtICIp
KTsKLSAgICB9Ci0gIH0KLSAgdmlzaXQoZnJvbSwgY2hlY2tDeWNsZSk7Ci0gIGZyb20uaGFzT3V0
Z29pbmcgPSB0cnVlOwotICB0by5pbmNvbWluZ1tmcm9tTmFtZV0gPSBmcm9tOwotICB0by5pbmNv
bWluZ05hbWVzLnB1c2goZnJvbU5hbWUpOwotfTsKLQotREFHLnByb3RvdHlwZS50b3Bzb3J0ID0g
ZnVuY3Rpb24oZm4pIHsKLSAgdmFyIHZpc2l0ZWQgPSB7fSwKLSAgICB2ZXJ0aWNlcyA9IHRoaXMu
dmVydGljZXMsCi0gICAgbmFtZXMgPSB0aGlzLm5hbWVzLAotICAgIGxlbiA9IG5hbWVzLmxlbmd0
aCwKLSAgICBpLCB2ZXJ0ZXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIHZl
cnRleCA9IHZlcnRpY2VzW25hbWVzW2ldXTsKLSAgICBpZiAoIXZlcnRleC5oYXNPdXRnb2luZykg
ewotICAgICAgdmlzaXQodmVydGV4LCBmbiwgdmlzaXRlZCk7Ci0gICAgfQotICB9Ci19OwotCi1E
QUcucHJvdG90eXBlLmFkZEVkZ2VzID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJlZm9yZSwgYWZ0
ZXIpIHsKLSAgdmFyIGk7Ci0gIHRoaXMubWFwKG5hbWUsIHZhbHVlKTsKLSAgaWYgKGJlZm9yZSkg
ewotICAgIGlmICh0eXBlb2YgYmVmb3JlID09PSAnc3RyaW5nJykgewotICAgICAgdGhpcy5hZGRF
ZGdlKG5hbWUsIGJlZm9yZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBi
ZWZvcmUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdGhpcy5hZGRFZGdlKG5hbWUsIGJlZm9yZVtp
XSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChhZnRlcikgewotICAgIGlmICh0eXBlb2Yg
YWZ0ZXIgPT09ICdzdHJpbmcnKSB7Ci0gICAgICB0aGlzLmFkZEVkZ2UoYWZ0ZXIsIG5hbWUpOwot
ICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXIubGVuZ3RoOyBpKyspIHsK
LSAgICAgICAgdGhpcy5hZGRFZGdlKGFmdGVyW2ldLCBuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0g
IH0KLX07Ci0KLUVtYmVyLkRBRyA9IERBRzsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwKLSAgICBjbGFzc2lmeSA9IEVtYmVyLlN0cmluZy5jbGFzc2lm
eSwKLSAgICBjYXBpdGFsaXplID0gRW1iZXIuU3RyaW5nLmNhcGl0YWxpemUsCi0gICAgZGVjYW1l
bGl6ZSA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplOwotCi0vKioKLSAgVGhlIERlZmF1bHRSZXNv
bHZlciBkZWZpbmVzIHRoZSBkZWZhdWx0IGxvb2t1cCBydWxlcyB0byByZXNvbHZlCi0gIGNvbnRh
aW5lciBsb29rdXBzIGJlZm9yZSBjb25zdWx0aW5nIHRoZSBjb250YWluZXIgZm9yIHJlZ2lzdGVy
ZWQKLSAgaXRlbXM6Ci0KLSogdGVtcGxhdGVzIGFyZSBsb29rZWQgdXAgb24gYEVtYmVyLlRFTVBM
QVRFU2AKLSogb3RoZXIgbmFtZXMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgYXBwbGljYXRpb24gYWZ0
ZXIgY29udmVydGluZwotICB0aGUgbmFtZS4gRm9yIGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3Rg
IGxvb2tzIHVwCi0gIGBBcHAuUG9zdENvbnRyb2xsZXJgIGJ5IGRlZmF1bHQuCi0qIHRoZXJlIGFy
ZSBzb21lIG51YW5jZXMgKHNlZSBleGFtcGxlcyBiZWxvdykKLQotICAjIyMgSG93IFJlc29sdmlu
ZyBXb3JrcwotCi0gIFRoZSBjb250YWluZXIgY2FsbHMgdGhpcyBvYmplY3QncyBgcmVzb2x2ZWAg
bWV0aG9kIHdpdGggdGhlCi0gIGBmdWxsTmFtZWAgYXJndW1lbnQuCi0KLSAgSXQgZmlyc3QgcGFy
c2VzIHRoZSBmdWxsTmFtZSBpbnRvIGFuIG9iamVjdCB1c2luZyBgcGFyc2VOYW1lYC4KLQotICBU
aGVuIGl0IGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgdHlwZS1zcGVjaWZpYyBpbnN0YW5j
ZQotICBtZXRob2Qgb2YgdGhlIGZvcm0gYHJlc29sdmVbVHlwZV1gIGFuZCBjYWxscyBpdCBpZiBp
dCBleGlzdHMuCi0gIEZvciBleGFtcGxlIGlmIGl0IHdhcyByZXNvbHZpbmcgJ3RlbXBsYXRlOnBv
c3QnLCBpdCB3b3VsZCBjYWxsCi0gIHRoZSBgcmVzb2x2ZVRlbXBsYXRlYCBtZXRob2QuCi0KLSAg
SXRzIGxhc3QgcmVzb3J0IGlzIHRvIGNhbGwgdGhlIGByZXNvbHZlT3RoZXJgIG1ldGhvZC4KLQot
ICBUaGUgbWV0aG9kcyBvZiB0aGlzIG9iamVjdCBhcmUgZGVzaWduZWQgdG8gYmUgZWFzeSB0byBv
dmVycmlkZQotICBpbiBhIHN1YmNsYXNzLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVuaGFuY2Ug
aG93IGEgdGVtcGxhdGUKLSAgaXMgcmVzb2x2ZWQgbGlrZSBzbzoKLQotICBgYGBqYXZhc2NyaXB0
Ci0gIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7Ci0gICAgUmVzb2x2ZXI6IEVtYmVy
LkRlZmF1bHRSZXNvbHZlci5leHRlbmQoewotICAgICAgcmVzb2x2ZVRlbXBsYXRlOiBmdW5jdGlv
bihwYXJzZWROYW1lKSB7Ci0gICAgICAgIHZhciByZXNvbHZlZFRlbXBsYXRlID0gdGhpcy5fc3Vw
ZXIocGFyc2VkTmFtZSk7Ci0gICAgICAgIGlmIChyZXNvbHZlZFRlbXBsYXRlKSB7IHJldHVybiBy
ZXNvbHZlZFRlbXBsYXRlOyB9Ci0gICAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbJ25vdF9m
b3VuZCddOwotICAgICAgfQotICAgIH0pCi0gIH0pOwotICBgYGAKLQotICBTb21lIGV4YW1wbGVz
IG9mIGhvdyBuYW1lcyBhcmUgcmVzb2x2ZWQ6Ci0KLSAgYGBgCi0gICd0ZW1wbGF0ZTpwb3N0JyAv
Lz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdCddCi0gICd0ZW1wbGF0ZTpwb3N0cy9ieWxpbmUnIC8v
PT4gRW1iZXIuVEVNUExBVEVTWydwb3N0cy9ieWxpbmUnXQotICAndGVtcGxhdGU6cG9zdHMuYnls
aW5lJyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KLSAgJ3RlbXBsYXRlOmJs
b2dQb3N0JyAvLz0+IEVtYmVyLlRFTVBMQVRFU1snYmxvZ1Bvc3QnXQotICAgICAgICAgICAgICAg
ICAgICAgIC8vICAgT1IKLSAgICAgICAgICAgICAgICAgICAgICAvLyAgIEVtYmVyLlRFTVBMQVRF
U1snYmxvZ19wb3N0J10KLSAgJ2NvbnRyb2xsZXI6cG9zdCcgLy89PiBBcHAuUG9zdENvbnRyb2xs
ZXIKLSAgJ2NvbnRyb2xsZXI6cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3RzSW5kZXhDb250cm9s
bGVyCi0gICdjb250cm9sbGVyOmJsb2cvcG9zdCcgLy89PiBCbG9nLlBvc3RDb250cm9sbGVyCi0g
ICdjb250cm9sbGVyOmJhc2ljJyAvLz0+IEVtYmVyLkNvbnRyb2xsZXIKLSAgJ3JvdXRlOnBvc3Qn
IC8vPT4gQXBwLlBvc3RSb3V0ZQotICAncm91dGU6cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3Rz
SW5kZXhSb3V0ZQotICAncm91dGU6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdFJvdXRlCi0gICdy
b3V0ZTpiYXNpYycgLy89PiBFbWJlci5Sb3V0ZQotICAndmlldzpwb3N0JyAvLz0+IEFwcC5Qb3N0
VmlldwotICAndmlldzpwb3N0cy5pbmRleCcgLy89PiBBcHAuUG9zdHNJbmRleFZpZXcKLSAgJ3Zp
ZXc6YmxvZy9wb3N0JyAvLz0+IEJsb2cuUG9zdFZpZXcKLSAgJ3ZpZXc6YmFzaWMnIC8vPT4gRW1i
ZXIuVmlldwotICAnZm9vOnBvc3QnIC8vPT4gQXBwLlBvc3RGb28KLSAgJ21vZGVsOnBvc3QnIC8v
PT4gQXBwLlBvc3QKLSAgYGBgCi0KLSAgQGNsYXNzIERlZmF1bHRSZXNvbHZlcgotICBAbmFtZXNw
YWNlIEVtYmVyCi0gIEBleHRlbmRzIEVtYmVyLk9iamVjdAotKi8KLUVtYmVyLkRlZmF1bHRSZXNv
bHZlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICAvKioKLSAgICBUaGlzIHdpbGwgYmUgc2V0
IHRvIHRoZSBBcHBsaWNhdGlvbiBpbnN0YW5jZSB3aGVuIGl0IGlzCi0gICAgY3JlYXRlZC4KLQot
ICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKLSAgKi8KLSAgbmFtZXNwYWNlOiBudWxsLAotCi0gIG5v
cm1hbGl6ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2YXIgc3BsaXQgPSBmdWxsTmFtZS5z
cGxpdCgnOicsIDIpLAotICAgICAgICB0eXBlID0gc3BsaXRbMF0sCi0gICAgICAgIG5hbWUgPSBz
cGxpdFsxXTsKLQotICAgIEVtYmVyLmFzc2VydCgiVHJpZWQgdG8gbm9ybWFsaXplIGEgY29udGFp
bmVyIG5hbWUgd2l0aG91dCBhIGNvbG9uICg6KSBpbiAiICsKLSAgICAgICAgICAgICAgICAgIml0
LiBZb3UgcHJvYmFibHkgdHJpZWQgdG8gbG9va3VwIGEgbmFtZSB0aGF0IGRpZCBub3QgY29udGFp
biAiICsKLSAgICAgICAgICAgICAgICAgImEgdHlwZSwgYSBjb2xvbiwgYW5kIGEgbmFtZS4gQSBw
cm9wZXIgbG9va3VwIG5hbWUgd291bGQgYmUgIiArCi0gICAgICAgICAgICAgICAgICJgdmlldzpw
b3N0YC4iLCBzcGxpdC5sZW5ndGggPT09IDIpOwotCi0gICAgaWYgKHR5cGUgIT09ICd0ZW1wbGF0
ZScpIHsKLSAgICAgIHZhciByZXN1bHQgPSBuYW1lOwotCi0gICAgICBpZiAocmVzdWx0LmluZGV4
T2YoJy4nKSA+IC0xKSB7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cLiguKS9n
LCBmdW5jdGlvbihtKSB7IHJldHVybiBtLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOyB9KTsKLSAg
ICAgIH0KLQotICAgICAgaWYgKG5hbWUuaW5kZXhPZignXycpID4gLTEpIHsKLSAgICAgICAgcmVz
dWx0ID0gcmVzdWx0LnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24obSkgeyByZXR1cm4gbS5jaGFy
QXQoMSkudG9VcHBlckNhc2UoKTsgfSk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0eXBlICsg
JzonICsgcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAg
fQotICB9LAotCi0KLSAgLyoqCi0gICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHZpYSB0aGUgY29u
dGFpbmVyJ3MgcmVzb2x2ZXIgbWV0aG9kLgotICAgIEl0IHBhcnNlcyB0aGUgcHJvdmlkZWQgYGZ1
bGxOYW1lYCBhbmQgdGhlbiBsb29rcyB1cCBhbmQKLSAgICByZXR1cm5zIHRoZSBhcHByb3ByaWF0
ZSB0ZW1wbGF0ZSBvciBjbGFzcy4KLQotICAgIEBtZXRob2QgcmVzb2x2ZQotICAgIEBwYXJhbSB7
U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwotICAgIEByZXR1cm4ge09iamVjdH0g
dGhlIHJlc29sdmVkIGZhY3RvcnkKLSAgKi8KLSAgcmVzb2x2ZTogZnVuY3Rpb24oZnVsbE5hbWUp
IHsKLSAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VOYW1lKGZ1bGxOYW1lKSwKLSAgICAg
ICAgdHlwZVNwZWNpZmljUmVzb2x2ZU1ldGhvZCA9IHRoaXNbcGFyc2VkTmFtZS5yZXNvbHZlTWV0
aG9kTmFtZV07Ci0KLSAgICBpZiAoIXBhcnNlZE5hbWUubmFtZSB8fCAhcGFyc2VkTmFtZS50eXBl
KSB7Ci0gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGZ1bGxOYW1lOiBgIiArIGZ1
bGxOYW1lICsgImAsIG11c3QgYmUgb2YgdGhlIGZvcm0gYHR5cGU6bmFtZWAgIik7Ci0gICAgfQot
Ci0gICAgaWYgKHR5cGVTcGVjaWZpY1Jlc29sdmVNZXRob2QpIHsKLSAgICAgIHZhciByZXNvbHZl
ZCA9IHR5cGVTcGVjaWZpY1Jlc29sdmVNZXRob2QuY2FsbCh0aGlzLCBwYXJzZWROYW1lKTsKLSAg
ICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gcmVzb2x2ZWQ7IH0KLSAgICB9Ci0gICAgcmV0dXJu
IHRoaXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOwotICB9LAotICAvKioKLSAgICBDb252ZXJ0
IHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgZm9ybSAidHlwZTpuYW1lIiB0bwotICAgIGEgSmF2YXNj
cmlwdCBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkIGFzcGVjdHMgb2YgdGhlIG5hbWUKLSAgICBicm9r
ZW4gb3V0LgotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0
aGUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcGFyc2VOYW1lCi0gICovCi0gIHBhcnNlTmFt
ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKLSAgICB2YXIgbmFtZVBhcnRzID0gZnVsbE5hbWUuc3Bs
aXQoIjoiKSwKLSAgICAgICAgdHlwZSA9IG5hbWVQYXJ0c1swXSwgZnVsbE5hbWVXaXRob3V0VHlw
ZSA9IG5hbWVQYXJ0c1sxXSwKLSAgICAgICAgbmFtZSA9IGZ1bGxOYW1lV2l0aG91dFR5cGUsCi0g
ICAgICAgIG5hbWVzcGFjZSA9IGdldCh0aGlzLCAnbmFtZXNwYWNlJyksCi0gICAgICAgIHJvb3Qg
PSBuYW1lc3BhY2U7Ci0KLSAgICBpZiAodHlwZSAhPT0gJ3RlbXBsYXRlJyAmJiBuYW1lLmluZGV4
T2YoJy8nKSAhPT0gLTEpIHsKLSAgICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKLSAg
ICAgIG5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKLSAgICAgIHZhciBuYW1lc3BhY2VO
YW1lID0gY2FwaXRhbGl6ZShwYXJ0cy5zbGljZSgwLCAtMSkuam9pbignLicpKTsKLSAgICAgIHJv
b3QgPSBFbWJlci5OYW1lc3BhY2UuYnlOYW1lKG5hbWVzcGFjZU5hbWUpOwotCi0gICAgICBFbWJl
ci5hc3NlcnQoJ1lvdSBhcmUgbG9va2luZyBmb3IgYSAnICsgbmFtZSArICcgJyArIHR5cGUgKyAn
IGluIHRoZSAnICsgbmFtZXNwYWNlTmFtZSArICcgbmFtZXNwYWNlLCBidXQgdGhlIG5hbWVzcGFj
ZSBjb3VsZCBub3QgYmUgZm91bmQnLCByb290KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gewotICAg
ICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAotICAgICAgdHlwZTogdHlwZSwKLSAgICAgIGZ1bGxOYW1l
V2l0aG91dFR5cGU6IGZ1bGxOYW1lV2l0aG91dFR5cGUsCi0gICAgICBuYW1lOiBuYW1lLAotICAg
ICAgcm9vdDogcm9vdCwKLSAgICAgIHJlc29sdmVNZXRob2ROYW1lOiAicmVzb2x2ZSIgKyBjbGFz
c2lmeSh0eXBlKQotICAgIH07Ci0gIH0sCi0gIC8qKgotICAgIExvb2sgdXAgdGhlIHRlbXBsYXRl
IGluIEVtYmVyLlRFTVBMQVRFUwotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0
fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1
bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVUZW1wbGF0ZQotICAqLwot
ICByZXNvbHZlVGVtcGxhdGU6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICB2YXIgdGVtcGxh
dGVOYW1lID0gcGFyc2VkTmFtZS5mdWxsTmFtZVdpdGhvdXRUeXBlLnJlcGxhY2UoL1wuL2csICcv
Jyk7Ci0KLSAgICBpZiAoRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFtZV0pIHsKLSAgICAgIHJl
dHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0
ZU5hbWUgPSBkZWNhbWVsaXplKHRlbXBsYXRlTmFtZSk7Ci0gICAgaWYgKEVtYmVyLlRFTVBMQVRF
U1t0ZW1wbGF0ZU5hbWVdKSB7Ci0gICAgICByZXR1cm4gRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRl
TmFtZV07Ci0gICAgfQotICB9LAotICAvKioKLSAgICBHaXZlbiBhIHBhcnNlTmFtZSBvYmplY3Qg
KG91dHB1dCBmcm9tIGBwYXJzZU5hbWVgKSwgYXBwbHkKLSAgICB0aGUgY29udmVudGlvbnMgZXhw
ZWN0ZWQgYnkgYEVtYmVyLlJvdXRlcmAKLQotICAgIEBwcm90ZWN0ZWQKLSAgICBAcGFyYW0ge09i
amVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCi0gICAg
ICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCi0gICAgQG1ldGhvZCB1c2VSb3V0ZXJOYW1pbmcKLSAg
Ki8KLSAgdXNlUm91dGVyTmFtaW5nOiBmdW5jdGlvbihwYXJzZWROYW1lKSB7Ci0gICAgcGFyc2Vk
TmFtZS5uYW1lID0gcGFyc2VkTmFtZS5uYW1lLnJlcGxhY2UoL1wuL2csICdfJyk7Ci0gICAgaWYg
KHBhcnNlZE5hbWUubmFtZSA9PT0gJ2Jhc2ljJykgewotICAgICAgcGFyc2VkTmFtZS5uYW1lID0g
Jyc7Ci0gICAgfQotICB9LAotICAvKioKLSAgICBMb29rdXAgdGhlIGNvbnRyb2xsZXIgdXNpbmcg
YHJlc29sdmVPdGhlcmAKLQotICAgIEBwcm90ZWN0ZWQKLSAgICBAcGFyYW0ge09iamVjdH0gcGFy
c2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCi0gICAgICBmdWxsTmFt
ZSBsb29rdXAgc3RyaW5nCi0gICAgQG1ldGhvZCByZXNvbHZlQ29udHJvbGxlcgotICAqLwotICBy
ZXNvbHZlQ29udHJvbGxlcjogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHRoaXMudXNlUm91
dGVyTmFtaW5nKHBhcnNlZE5hbWUpOwotICAgIHJldHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJz
ZWROYW1lKTsKLSAgfSwKLSAgLyoqCi0gICAgTG9va3VwIHRoZSByb3V0ZSB1c2luZyBgcmVzb2x2
ZU90aGVyYAotCi0gICAgQHByb3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1l
IGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1
cCBzdHJpbmcKLSAgICBAbWV0aG9kIHJlc29sdmVSb3V0ZQotICAqLwotICByZXNvbHZlUm91dGU6
IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICB0aGlzLnVzZVJvdXRlck5hbWluZyhwYXJzZWRO
YW1lKTsKLSAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2VkTmFtZSk7Ci0gIH0sCi0g
IC8qKgotICAgIExvb2t1cCB0aGUgdmlldyB1c2luZyBgcmVzb2x2ZU90aGVyYAotCi0gICAgQHBy
b3RlY3RlZAotICAgIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVj
dCB3aXRoIHRoZSBwYXJzZWQKLSAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKLSAgICBAbWV0
aG9kIHJlc29sdmVWaWV3Ci0gICovCi0gIHJlc29sdmVWaWV3OiBmdW5jdGlvbihwYXJzZWROYW1l
KSB7Ci0gICAgdGhpcy51c2VSb3V0ZXJOYW1pbmcocGFyc2VkTmFtZSk7Ci0gICAgcmV0dXJuIHRo
aXMucmVzb2x2ZU90aGVyKHBhcnNlZE5hbWUpOwotICB9LAotCi0gIHJlc29sdmVIZWxwZXI6IGZ1
bmN0aW9uKHBhcnNlZE5hbWUpIHsKLSAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2Vk
TmFtZSkgfHwgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzW3BhcnNlZE5hbWUuZnVsbE5hbWVXaXRo
b3V0VHlwZV07Ci0gIH0sCi0KLSAgLyoqCi0gICAgTG9va3VwIHRoZSBtb2RlbCBvbiB0aGUgQXBw
bGljYXRpb24gbmFtZXNwYWNlCi0KLSAgICBAcHJvdGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9
IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVs
bE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcmVzb2x2ZU1vZGVsCi0gICovCi0gIHJl
c29sdmVNb2RlbDogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBj
bGFzc2lmeShwYXJzZWROYW1lLm5hbWUpLAotICAgICAgICBmYWN0b3J5ID0gZ2V0KHBhcnNlZE5h
bWUucm9vdCwgY2xhc3NOYW1lKTsKLQotICAgICBpZiAoZmFjdG9yeSkgeyByZXR1cm4gZmFjdG9y
eTsgfQotICB9LAotICAvKioKLSAgICBMb29rIHVwIHRoZSBzcGVjaWZpZWQgb2JqZWN0IChmcm9t
IHBhcnNlZE5hbWUpIG9uIHRoZSBhcHByb3ByaWF0ZQotICAgIG5hbWVzcGFjZSAodXN1YWxseSBv
biB0aGUgQXBwbGljYXRpb24pCi0KLSAgICBAcHJvdGVjdGVkCi0gICAgQHBhcmFtIHtPYmplY3R9
IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNlZAotICAgICAgZnVs
bE5hbWUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2QgcmVzb2x2ZU90aGVyCi0gICovCi0gIHJl
c29sdmVPdGhlcjogZnVuY3Rpb24ocGFyc2VkTmFtZSkgewotICAgIHZhciBjbGFzc05hbWUgPSBj
bGFzc2lmeShwYXJzZWROYW1lLm5hbWUpICsgY2xhc3NpZnkocGFyc2VkTmFtZS50eXBlKSwKLSAg
ICAgICAgZmFjdG9yeSA9IGdldChwYXJzZWROYW1lLnJvb3QsIGNsYXNzTmFtZSk7Ci0gICAgaWYg
KGZhY3RvcnkpIHsgcmV0dXJuIGZhY3Rvcnk7IH0KLSAgfSwKLQotICAvKioKLSAgICBSZXR1cm5z
IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIGEgZnVsbE5hbWUuIFVzZWQgYnkgdGhl
Ci0gICAgQXBwbGljYXRpb24gbmFtZXNwYWNlIGluIGFzc2VydGlvbnMgdG8gZGVzY3JpYmUgdGhl
Ci0gICAgcHJlY2lzZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IEVtYmVyIGlzIGxvb2tpbmcgZm9y
LCByYXRoZXIgdGhhbgotICAgIGNvbnRhaW5lciBrZXlzLgotCi0gICAgQHByb3RlY3RlZAotICAg
IEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwotICAgIEBtZXRob2Qg
bG9va3VwRGVzY3JpcHRpb24KLSAgKi8KLSAgbG9va3VwRGVzY3JpcHRpb246IGZ1bmN0aW9uKGZ1
bGxOYW1lKSB7Ci0gICAgdmFyIHBhcnNlZE5hbWUgPSB0aGlzLnBhcnNlTmFtZShmdWxsTmFtZSk7
Ci0KLSAgICBpZiAocGFyc2VkTmFtZS50eXBlID09PSAndGVtcGxhdGUnKSB7Ci0gICAgICByZXR1
cm4gInRlbXBsYXRlIGF0ICIgKyBwYXJzZWROYW1lLmZ1bGxOYW1lV2l0aG91dFR5cGUucmVwbGFj
ZSgvXC4vZywgJy8nKTsKLSAgICB9Ci0KLSAgICB2YXIgZGVzY3JpcHRpb24gPSBwYXJzZWROYW1l
LnJvb3QgKyAiLiIgKyBjbGFzc2lmeShwYXJzZWROYW1lLm5hbWUpOwotICAgIGlmIChwYXJzZWRO
YW1lLnR5cGUgIT09ICdtb2RlbCcpIHsgZGVzY3JpcHRpb24gKz0gY2xhc3NpZnkocGFyc2VkTmFt
ZS50eXBlKTsgfQotCi0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9LAotCi0gIG1ha2VUb1N0
cmluZzogZnVuY3Rpb24oZmFjdG9yeSwgZnVsbE5hbWUpIHsKLSAgICByZXR1cm4gZmFjdG9yeS50
b1N0cmluZygpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
QG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi1mdW5jdGlvbiBEZXByZWNhdGVkQ29u
dGFpbmVyKGNvbnRhaW5lcikgewotICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7Ci19Ci0K
LURlcHJlY2F0ZWRDb250YWluZXIuZGVwcmVjYXRlID0gZnVuY3Rpb24obWV0aG9kKSB7Ci0gIHJl
dHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyOwot
Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCdVc2luZyB0aGUgZGVmYXVsdENvbnRhaW5lciBpcyBubyBs
b25nZXIgc3VwcG9ydGVkLiBbZGVmYXVsdENvbnRhaW5lciMnICsgbWV0aG9kICsgJ10gc2VlOiBo
dHRwOi8vZ2l0LmlvL0VLUHBuQScsIGZhbHNlKTsKLSAgICByZXR1cm4gY29udGFpbmVyW21ldGhv
ZF0uYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9OwotfTsKLQotRGVwcmVjYXRlZENv
bnRhaW5lci5wcm90b3R5cGUgPSB7Ci0gIF9jb250YWluZXI6IG51bGwsCi0gIGxvb2t1cDogRGVw
cmVjYXRlZENvbnRhaW5lci5kZXByZWNhdGUoJ2xvb2t1cCcpLAotICByZXNvbHZlOiBEZXByZWNh
dGVkQ29udGFpbmVyLmRlcHJlY2F0ZSgncmVzb2x2ZScpLAotICByZWdpc3RlcjogRGVwcmVjYXRl
ZENvbnRhaW5lci5kZXByZWNhdGUoJ3JlZ2lzdGVyJykKLX07Ci0KLS8qKgotICBBbiBpbnN0YW5j
ZSBvZiBgRW1iZXIuQXBwbGljYXRpb25gIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgZXZlcnkg
RW1iZXIKLSAgYXBwbGljYXRpb24uIEl0IGhlbHBzIHRvIGluc3RhbnRpYXRlLCBpbml0aWFsaXpl
IGFuZCBjb29yZGluYXRlIHRoZSBtYW55Ci0gIG9iamVjdHMgdGhhdCBtYWtlIHVwIHlvdXIgYXBw
LgotCi0gIEVhY2ggRW1iZXIgYXBwIGhhcyBvbmUgYW5kIG9ubHkgb25lIGBFbWJlci5BcHBsaWNh
dGlvbmAgb2JqZWN0LiBJbiBmYWN0LCB0aGUKLSAgdmVyeSBmaXJzdCB0aGluZyB5b3Ugc2hvdWxk
IGRvIGluIHlvdXIgYXBwbGljYXRpb24gaXMgY3JlYXRlIHRoZSBpbnN0YW5jZToKLQotICBgYGBq
YXZhc2NyaXB0Ci0gIHdpbmRvdy5BcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAg
YGBgCi0KLSAgVHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gb2JqZWN0IGlzIHRoZSBvbmx5IGds
b2JhbCB2YXJpYWJsZS4gQWxsIG90aGVyCi0gIGNsYXNzZXMgaW4geW91ciBhcHAgc2hvdWxkIGJl
IHByb3BlcnRpZXMgb24gdGhlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5zdGFuY2UsCi0gIHdoaWNo
IGhpZ2hsaWdodHMgaXRzIGZpcnN0IHJvbGU6IGEgZ2xvYmFsIG5hbWVzcGFjZS4KLQotICBGb3Ig
ZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIHZpZXcgY2xhc3MsIGl0IG1pZ2h0IGxvb2sgbGlrZSB0
aGlzOgotCi0gIGBgYGphdmFzY3JpcHQKLSAgQXBwLk15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5k
KCk7Ci0gIGBgYAotCi0gIEJ5IGRlZmF1bHQsIGNhbGxpbmcgYEVtYmVyLkFwcGxpY2F0aW9uLmNy
ZWF0ZSgpYCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZQotICB5b3VyIGFwcGxpY2F0aW9u
IGJ5IGNhbGxpbmcgdGhlIGBFbWJlci5BcHBsaWNhdGlvbi5pbml0aWFsaXplKClgIG1ldGhvZC4g
SWYKLSAgeW91IG5lZWQgdG8gZGVsYXkgaW5pdGlhbGl6YXRpb24sIHlvdSBjYW4gY2FsbCB5b3Vy
IGFwcCdzIGBkZWZlclJlYWRpbmVzcygpYAotICBtZXRob2QuIFdoZW4geW91IGFyZSByZWFkeSBm
b3IgeW91ciBhcHAgdG8gYmUgaW5pdGlhbGl6ZWQsIGNhbGwgaXRzCi0gIGBhZHZhbmNlUmVhZGlu
ZXNzKClgIG1ldGhvZC4KLQotICBZb3UgY2FuIGRlZmluZSBhIGByZWFkeWAgbWV0aG9kIG9uIHRo
ZSBgRW1iZXIuQXBwbGljYXRpb25gIGluc3RhbmNlLCB3aGljaAotICB3aWxsIGJlIHJ1biBieSBF
bWJlciB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXplZC4KLQotICBCZWNhdXNlIGBF
bWJlci5BcHBsaWNhdGlvbmAgaW5oZXJpdHMgZnJvbSBgRW1iZXIuTmFtZXNwYWNlYCwgYW55IGNs
YXNzZXMKLSAgeW91IGNyZWF0ZSB3aWxsIGhhdmUgdXNlZnVsIHN0cmluZyByZXByZXNlbnRhdGlv
bnMgd2hlbiBjYWxsaW5nIGB0b1N0cmluZygpYC4KLSAgU2VlIHRoZSBgRW1iZXIuTmFtZXNwYWNl
YCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gIFdoaWxlIHlvdSBjYW4g
dGhpbmsgb2YgeW91ciBgRW1iZXIuQXBwbGljYXRpb25gIGFzIGEgY29udGFpbmVyIHRoYXQgaG9s
ZHMgdGhlCi0gIG90aGVyIGNsYXNzZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgdGhlcmUgYXJlIHNl
dmVyYWwgb3RoZXIgcmVzcG9uc2liaWxpdGllcwotICBnb2luZyBvbiB1bmRlci10aGUtaG9vZCB0
aGF0IHlvdSBtYXkgd2FudCB0byB1bmRlcnN0YW5kLgotCi0gICMjIyBFdmVudCBEZWxlZ2F0aW9u
Ci0KLSAgRW1iZXIgdXNlcyBhIHRlY2huaXF1ZSBjYWxsZWQgX2V2ZW50IGRlbGVnYXRpb25fLiBU
aGlzIGFsbG93cyB0aGUgZnJhbWV3b3JrCi0gIHRvIHNldCB1cCBhIGdsb2JhbCwgc2hhcmVkIGV2
ZW50IGxpc3RlbmVyIGluc3RlYWQgb2YgcmVxdWlyaW5nIGVhY2ggdmlldyB0bwotICBkbyBpdCBt
YW51YWxseS4gRm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgZWFjaCB2aWV3IHJlZ2lzdGVyaW5nIGl0
cyBvd24KLSAgYG1vdXNlZG93bmAgbGlzdGVuZXIgb24gaXRzIGFzc29jaWF0ZWQgZWxlbWVudCwg
RW1iZXIgc2V0cyB1cCBhIGBtb3VzZWRvd25gCi0gIGxpc3RlbmVyIG9uIHRoZSBgYm9keWAuCi0K
LSAgSWYgYSBgbW91c2Vkb3duYCBldmVudCBvY2N1cnMsIEVtYmVyIHdpbGwgbG9vayBhdCB0aGUg
dGFyZ2V0IG9mIHRoZSBldmVudCBhbmQKLSAgc3RhcnQgd2Fsa2luZyB1cCB0aGUgRE9NIG5vZGUg
dHJlZSwgZmluZGluZyBjb3JyZXNwb25kaW5nIHZpZXdzIGFuZCBpbnZva2luZwotICB0aGVpciBg
bW91c2VEb3duYCBtZXRob2QgYXMgaXQgZ29lcy4KLQotICBgRW1iZXIuQXBwbGljYXRpb25gIGhh
cyBhIG51bWJlciBvZiBkZWZhdWx0IGV2ZW50cyB0aGF0IGl0IGxpc3RlbnMgZm9yLCBhcwotICB3
ZWxsIGFzIGEgbWFwcGluZyBmcm9tIGxvd2VyY2FzZSBldmVudHMgdG8gY2FtZWwtY2FzZWQgdmll
dyBtZXRob2QgbmFtZXMuIEZvcgotICBleGFtcGxlLCB0aGUgYGtleXByZXNzYCBldmVudCBjYXVz
ZXMgdGhlIGBrZXlQcmVzc2AgbWV0aG9kIG9uIHRoZSB2aWV3IHRvIGJlCi0gIGNhbGxlZCwgdGhl
IGBkYmxjbGlja2AgZXZlbnQgY2F1c2VzIGBkb3VibGVDbGlja2AgdG8gYmUgY2FsbGVkLCBhbmQg
c28gb24uCi0KLSAgSWYgdGhlcmUgaXMgYSBidWJibGluZyBicm93c2VyIGV2ZW50IHRoYXQgRW1i
ZXIgZG9lcyBub3QgbGlzdGVuIGZvciBieQotICBkZWZhdWx0LCB5b3UgY2FuIHNwZWNpZnkgY3Vz
dG9tIGV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2aWV3IG1ldGhvZAotICBuYW1lcyBi
eSBzZXR0aW5nIHRoZSBhcHBsaWNhdGlvbidzIGBjdXN0b21FdmVudHNgIHByb3BlcnR5OgotCi0g
IGBgYGphdmFzY3JpcHQKLSAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBj
dXN0b21FdmVudHM6IHsKLSAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciB0aGUgcGFzdGUgZXZlbnQK
LSAgICAgIHBhc3RlOiAicGFzdGUiCi0gICAgfQotICB9KTsKLSAgYGBgCi0KLSAgQnkgZGVmYXVs
dCwgdGhlIGFwcGxpY2F0aW9uIHNldHMgdXAgdGhlc2UgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBk
b2N1bWVudAotICBib2R5LiBIb3dldmVyLCBpbiBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGlu
ZyBhbiBFbWJlciBhcHBsaWNhdGlvbiBpbnNpZGUKLSAgYW4gZXhpc3RpbmcgcGFnZSwgeW91IG1h
eSB3YW50IGl0IHRvIHNldCB1cCB0aGUgbGlzdGVuZXJzIG9uIGFuIGVsZW1lbnQKLSAgaW5zaWRl
IHRoZSBib2R5LgotCi0gIEZvciBleGFtcGxlLCBpZiBvbmx5IGV2ZW50cyBpbnNpZGUgYSBET00g
ZWxlbWVudCB3aXRoIHRoZSBJRCBvZiBgZW1iZXItYXBwYAotICBzaG91bGQgYmUgZGVsZWdhdGVk
LCBzZXQgeW91ciBhcHBsaWNhdGlvbidzIGByb290RWxlbWVudGAgcHJvcGVydHk6Ci0KLSAgYGBg
amF2YXNjcmlwdAotICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAg
ICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCi0gIH0pOwotICBgYGAKLQotICBUaGUgYHJvb3RF
bGVtZW50YCBjYW4gYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgYSBqUXVlcnktY29tcGF0aWJs
ZSBzZWxlY3RvcgotICBzdHJpbmcuIE5vdGUgdGhhdCAqdmlld3MgYXBwZW5kZWQgdG8gdGhlIERP
TSBvdXRzaWRlIHRoZSByb290IGVsZW1lbnQgd2lsbAotICBub3QgcmVjZWl2ZSBldmVudHMuKiBJ
ZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3Ugb25seQot
ICBhcHBlbmQgdmlld3MgaW5zaWRlIGl0IQotCi0gIFRvIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGFk
dmFudGFnZXMgb2YgZXZlbnQgZGVsZWdhdGlvbiBhbmQgdGhlIEVtYmVyIHZpZXcKLSAgbGF5ZXIs
IGFuZCBhIGxpc3Qgb2YgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGFyZSBzZXR1cCBieSBkZWZh
dWx0LCB2aXNpdCB0aGUKLSAgW0VtYmVyIFZpZXcgTGF5ZXIgZ3VpZGVdKGh0dHA6Ly9lbWJlcmpz
LmNvbS9ndWlkZXMvdW5kZXJzdGFuZGluZy1lbWJlci90aGUtdmlldy1sYXllci8jdG9jX2V2ZW50
LWRlbGVnYXRpb24pLgotCi0gICMjIyBJbml0aWFsaXplcnMKLQotICBMaWJyYXJpZXMgb24gdG9w
IG9mIEVtYmVyIGNhbiByZWdpc3RlciBhZGRpdGlvbmFsIGluaXRpYWxpemVycywgbGlrZSBzbzoK
LQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKLSAg
ICBuYW1lOiAic3RvcmUiLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBh
cHBsaWNhdGlvbikgewotICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBw
bGljYXRpb24uU3RvcmUpOwotICAgIH0KLSAgfSk7Ci0gIGBgYAotCi0gICMjIyBSb3V0aW5nCi0K
LSAgSW4gYWRkaXRpb24gdG8gY3JlYXRpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJvdXRlciwgYEVt
YmVyLkFwcGxpY2F0aW9uYCBpcwotICBhbHNvIHJlc3BvbnNpYmxlIGZvciB0ZWxsaW5nIHRoZSBy
b3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5nLiBUcmFuc2l0aW9ucwotICBiZXR3ZWVuIHJvdXRl
cyBjYW4gYmUgbG9nZ2VkIHdpdGggdGhlIGBMT0dfVFJBTlNJVElPTlNgIGZsYWcsIGFuZCBtb3Jl
Ci0gIGRldGFpbGVkIGludHJhLXRyYW5zaXRpb24gbG9nZ2luZyBjYW4gYmUgbG9nZ2VkIHdpdGgK
LSAgdGhlIGBMT0dfVFJBTlNJVElPTlNfSU5URVJOQUxgIGZsYWc6Ci0KLSAgYGBgamF2YXNjcmlw
dAotICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICBMT0dfVFJB
TlNJVElPTlM6IHRydWUsIC8vIGJhc2ljIGxvZ2dpbmcgb2Ygc3VjY2Vzc2Z1bCB0cmFuc2l0aW9u
cwotICAgIExPR19UUkFOU0lUSU9OU19JTlRFUk5BTDogdHJ1ZSAvLyBkZXRhaWxlZCBsb2dnaW5n
IG9mIGFsbCByb3V0aW5nIHN0ZXBzCi0gIH0pOwotICBgYGAKLQotICBCeSBkZWZhdWx0LCB0aGUg
cm91dGVyIHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBVUkwgaW50
bwotICBhcHBsaWNhdGlvbiBzdGF0ZSBvbmNlIHRoZSBicm93c2VyIGVtaXRzIHRoZSBgRE9NQ29u
dGVudFJlYWR5YCBldmVudC4gSWYgeW91Ci0gIG5lZWQgdG8gZGVmZXIgcm91dGluZywgeW91IGNh
biBjYWxsIHRoZSBhcHBsaWNhdGlvbidzIGBkZWZlclJlYWRpbmVzcygpYAotICBtZXRob2QuIE9u
Y2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhlIGBhZHZhbmNlUmVhZGluZXNzKClgIG1ldGhv
ZC4KLQotICBJZiB0aGVyZSBpcyBhbnkgc2V0dXAgcmVxdWlyZWQgYmVmb3JlIHJvdXRpbmcgYmVn
aW5zLCB5b3UgY2FuIGltcGxlbWVudCBhCi0gIGByZWFkeSgpYCBtZXRob2Qgb24geW91ciBhcHAg
dGhhdCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHJvdXRpbmcKLSAgYmVnaW5z
LgotICBgYGAKLQotICBAY2xhc3MgQXBwbGljYXRpb24KLSAgQG5hbWVzcGFjZSBFbWJlcgotICBA
ZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKLSovCi0KLXZhciBBcHBsaWNhdGlvbiA9IEVtYmVyLkFw
cGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNlLmV4dGVuZChFbWJlci5EZWZlcnJlZE1peGluLCB7
Ci0KLSAgLyoqCi0gICAgVGhlIHJvb3QgRE9NIGVsZW1lbnQgb2YgdGhlIEFwcGxpY2F0aW9uLiBU
aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4KLSAgICBlbGVtZW50IG9yIGEKLSAgICBbalF1ZXJ5
LWNvbXBhdGlibGUgc2VsZWN0b3Igc3RyaW5nXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY2F0ZWdv
cnkvc2VsZWN0b3JzLykuCi0KLSAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBw
YXNzZWQgdG8gdGhlIEFwcGxpY2F0aW9uJ3MsCi0gICAgYGV2ZW50RGlzcGF0Y2hlcmAsIHdoaWNo
IHNldHMgdXAgdGhlIGxpc3RlbmVycyBmb3IgZXZlbnQgZGVsZWdhdGlvbi4gRXZlcnkKLSAgICB2
aWV3IGluIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGJlIGEgY2hpbGQgb2YgdGhlIGVsZW1lbnQg
eW91IHNwZWNpZnkgaGVyZS4KLQotICAgIEBwcm9wZXJ0eSByb290RWxlbWVudAotICAgIEB0eXBl
IERPTUVsZW1lbnQKLSAgICBAZGVmYXVsdCAnYm9keScKLSAgKi8KLSAgcm9vdEVsZW1lbnQ6ICdi
b2R5JywKLQotICAvKioKLSAgICBUaGUgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgcmVzcG9uc2li
bGUgZm9yIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoaXMKLSAgICBhcHBsaWNhdGlvbidzIHZpZXdz
LgotCi0gICAgVGhlIGV2ZW50IGRpc3BhdGNoZXIgaXMgY3JlYXRlZCBieSB0aGUgYXBwbGljYXRp
b24gYXQgaW5pdGlhbGl6YXRpb24gdGltZQotICAgIGFuZCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVy
cyBvbiB0aGUgRE9NIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZQotICAgIGFwcGxpY2F0aW9uJ3Mg
YHJvb3RFbGVtZW50YCBwcm9wZXJ0eS4KLQotICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ig
YEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgICBAcHJv
cGVydHkgZXZlbnREaXNwYXRjaGVyCi0gICAgQHR5cGUgRW1iZXIuRXZlbnREaXNwYXRjaGVyCi0g
ICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBldmVudERpc3BhdGNoZXI6IG51bGwsCi0KLSAgLyoq
Ci0gICAgVGhlIERPTSBldmVudHMgZm9yIHdoaWNoIHRoZSBldmVudCBkaXNwYXRjaGVyIHNob3Vs
ZCBsaXN0ZW4uCi0KLSAgICBCeSBkZWZhdWx0LCB0aGUgYXBwbGljYXRpb24ncyBgRW1iZXIuRXZl
bnREaXNwYXRjaGVyYCBsaXN0ZW5zCi0gICAgZm9yIGEgc2V0IG9mIHN0YW5kYXJkIERPTSBldmVu
dHMsIHN1Y2ggYXMgYG1vdXNlZG93bmAgYW5kCi0gICAgYGtleXVwYCwgYW5kIGRlbGVnYXRlcyB0
aGVtIHRvIHlvdXIgYXBwbGljYXRpb24ncyBgRW1iZXIuVmlld2AKLSAgICBpbnN0YW5jZXMuCi0K
LSAgICBJZiB5b3Ugd291bGQgbGlrZSBhZGRpdGlvbmFsIGJ1YmJsaW5nIGV2ZW50cyB0byBiZSBk
ZWxlZ2F0ZWQgdG8geW91cgotICAgIHZpZXdzLCBzZXQgeW91ciBgRW1iZXIuQXBwbGljYXRpb25g
J3MgYGN1c3RvbUV2ZW50c2AgcHJvcGVydHkKLSAgICB0byBhIGhhc2ggY29udGFpbmluZyB0aGUg
RE9NIGV2ZW50IG5hbWUgYXMgdGhlIGtleSBhbmQgdGhlCi0gICAgY29ycmVzcG9uZGluZyB2aWV3
IG1ldGhvZCBuYW1lIGFzIHRoZSB2YWx1ZS4gRm9yIGV4YW1wbGU6Ci0KLSAgICBgYGBqYXZhc2Ny
aXB0Ci0gICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKLSAgICAgIGN1c3RvbUV2
ZW50czogewotICAgICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgdGhlIHBhc3RlIGV2ZW50Ci0gICAg
ICAgIHBhc3RlOiAicGFzdGUiCi0gICAgICB9Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJv
cGVydHkgY3VzdG9tRXZlbnRzCi0gICAgQHR5cGUgT2JqZWN0Ci0gICAgQGRlZmF1bHQgbnVsbAot
ICAqLwotICBjdXN0b21FdmVudHM6IG51bGwsCi0KLSAgLy8gU3RhcnQgb2ZmIHRoZSBudW1iZXIg
b2YgZGVmZXJyYWxzIGF0IDEuIFRoaXMgd2lsbCBiZQotICAvLyBkZWNyZW1lbnRlZCBieSB0aGUg
QXBwbGljYXRpb24ncyBvd24gYGluaXRpYWxpemVgIG1ldGhvZC4KLSAgX3JlYWRpbmVzc0RlZmVy
cmFsczogMSwKLQotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICBpZiAoIXRoaXMuJCkgeyB0aGlz
LiQgPSBFbWJlci4kOyB9Ci0gICAgdGhpcy5fX2NvbnRhaW5lcl9fID0gdGhpcy5idWlsZENvbnRh
aW5lcigpOwotCi0gICAgdGhpcy5Sb3V0ZXIgPSB0aGlzLmRlZmF1bHRSb3V0ZXIoKTsKLQotICAg
IHRoaXMuX3N1cGVyKCk7Ci0KLSAgICB0aGlzLnNjaGVkdWxlSW5pdGlhbGl6ZSgpOwotCi0gICAg
RW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoJ0hhbmRsZWJhcnMnLCBFbWJlci5I
YW5kbGViYXJzLlZFUlNJT04pOwotICAgIEVtYmVyLmxpYnJhcmllcy5yZWdpc3RlckNvcmVMaWJy
YXJ5KCdqUXVlcnknLCBFbWJlci4kKCkuanF1ZXJ5KTsKLQotICAgIGlmICggRW1iZXIuTE9HX1ZF
UlNJT04gKSB7Ci0gICAgICBFbWJlci5MT0dfVkVSU0lPTiA9IGZhbHNlOyAvLyB3ZSBvbmx5IG5l
ZWQgdG8gc2VlIHRoaXMgb25jZSBwZXIgQXBwbGljYXRpb24jaW5pdAotICAgICAgdmFyIG1heE5h
bWVMZW5ndGggPSBNYXRoLm1heC5hcHBseSh0aGlzLCBFbWJlci5BKEVtYmVyLmxpYnJhcmllcyku
bWFwQnkoIm5hbWUubGVuZ3RoIikpOwotCi0gICAgICBFbWJlci5kZWJ1ZygnLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLScpOwotICAgICAgRW1iZXIubGlicmFyaWVzLmVhY2goZnVuY3Rp
b24obmFtZSwgdmVyc2lvbikgewotICAgICAgICB2YXIgc3BhY2VzID0gbmV3IEFycmF5KG1heE5h
bWVMZW5ndGggLSBuYW1lLmxlbmd0aCArIDEpLmpvaW4oIiAiKTsKLSAgICAgICAgRW1iZXIuZGVi
dWcoW25hbWUsIHNwYWNlcywgJyA6ICcsIHZlcnNpb25dLmpvaW4oIiIpKTsKLSAgICAgIH0pOwot
ICAgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKLSAg
ICB9Ci0gIH0sCi0KLSAgLyoqCi0gICAgQnVpbGQgdGhlIGNvbnRhaW5lciBmb3IgdGhlIGN1cnJl
bnQgYXBwbGljYXRpb24uCi0KLSAgICBBbHNvIHJlZ2lzdGVyIGEgZGVmYXVsdCBhcHBsaWNhdGlv
biB2aWV3IGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uCi0gICAgaXRzZWxmIGRvZXMgbm90LgotCi0g
ICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGJ1aWxkQ29udGFpbmVyCi0gICAgQHJldHVybiB7RW1i
ZXIuQ29udGFpbmVyfSB0aGUgY29uZmlndXJlZCBjb250YWluZXIKLSAgKi8KLSAgYnVpbGRDb250
YWluZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVy
X18gPSBBcHBsaWNhdGlvbi5idWlsZENvbnRhaW5lcih0aGlzKTsKLQotICAgIHJldHVybiBjb250
YWluZXI7Ci0gIH0sCi0KLSAgLyoqCi0gICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3B0
ZWQgb3V0IG9mIHJvdXRpbmcgYW5kIGhhcyBub3QgZXhwbGljaXRseQotICAgIGRlZmluZWQgYSBy
b3V0ZXIsIHN1cHBseSBhIGRlZmF1bHQgcm91dGVyIGZvciB0aGUgYXBwbGljYXRpb24gYXV0aG9y
Ci0gICAgdG8gY29uZmlndXJlLgotCi0gICAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb24gZGV2ZWxv
cGVycyB0byBkbzoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB2YXIgQXBwID0gRW1iZXIuQXBw
bGljYXRpb24uY3JlYXRlKCk7Ci0KLSAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigpIHsKLSAg
ICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3RzJyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBAcHJp
dmF0ZQotICAgIEBtZXRob2QgZGVmYXVsdFJvdXRlcgotICAgIEByZXR1cm4ge0VtYmVyLlJvdXRl
cn0gdGhlIGRlZmF1bHQgcm91dGVyCi0gICovCi0KLSAgZGVmYXVsdFJvdXRlcjogZnVuY3Rpb24o
KSB7Ci0gICAgaWYgKHRoaXMuUm91dGVyID09PSBmYWxzZSkgeyByZXR1cm47IH0KLSAgICB2YXIg
Y29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwotCi0gICAgaWYgKHRoaXMuUm91dGVyKSB7
Ci0gICAgICBjb250YWluZXIudW5yZWdpc3Rlcigncm91dGVyOm1haW4nKTsKLSAgICAgIGNvbnRh
aW5lci5yZWdpc3Rlcigncm91dGVyOm1haW4nLCB0aGlzLlJvdXRlcik7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KCdyb3V0ZXI6bWFpbicpOwotICB9LAotCi0g
IC8qKgotICAgIEF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24gb25jZSB0
aGUgRE9NIGhhcwotICAgIGJlY29tZSByZWFkeS4KLQotICAgIFRoZSBpbml0aWFsaXphdGlvbiBp
dHNlbGYgaXMgc2NoZWR1bGVkIG9uIHRoZSBhY3Rpb25zIHF1ZXVlCi0gICAgd2hpY2ggZW5zdXJl
cyB0aGF0IGFwcGxpY2F0aW9uIGxvYWRpbmcgZmluaXNoZXMgYmVmb3JlCi0gICAgYm9vdGluZy4K
LQotICAgIElmIHlvdSBhcmUgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBjb2RlLCB5b3Ugc2hvdWxk
IGNhbGwKLSAgICBgZGVmZXJSZWFkaW5lc3MoKWAgdG8gZGVmZXIgYm9vdGluZywgYW5kIHRoZW4g
Y2FsbAotICAgIGBhZHZhbmNlUmVhZGluZXNzKClgIG9uY2UgYWxsIG9mIHlvdXIgY29kZSBoYXMg
ZmluaXNoZWQKLSAgICBsb2FkaW5nLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIHNjaGVk
dWxlSW5pdGlhbGl6ZQotICAqLwotICBzY2hlZHVsZUluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewot
ICAgIHZhciBzZWxmID0gdGhpczsKLQotICAgIGlmICghdGhpcy4kIHx8IHRoaXMuJC5pc1JlYWR5
KSB7Ci0gICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBzZWxmLCAnX2luaXRpYWxp
emUnKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy4kKCkucmVhZHkoZnVuY3Rpb24gcnVuSW5p
dGlhbGl6ZSgpIHsKLSAgICAgICAgRW1iZXIucnVuKHNlbGYsICdfaW5pdGlhbGl6ZScpOwotICAg
ICAgfSk7Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIFVzZSB0aGlzIHRvIGRlZmVyIHJlYWRp
bmVzcyB1bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0cnVlLgotCi0gICAgRXhhbXBsZToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLSAg
ICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsKLQotICAgIGpRdWVyeS5nZXRKU09OKCIvYXV0aC10b2tl
biIsIGZ1bmN0aW9uKHRva2VuKSB7Ci0gICAgICBBcHAudG9rZW4gPSB0b2tlbjsKLSAgICAgIEFw
cC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGFsbG93
cyB5b3UgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMgc2V0dXAgbG9naWMgYW5kIGRlZmVyCi0gICAg
Ym9vdGluZyB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHRoZSBzZXR1cCBoYXMgZmluaXNoZWQuCi0K
LSAgICBIb3dldmVyLCBpZiB0aGUgc2V0dXAgcmVxdWlyZXMgYSBsb2FkaW5nIFVJLCBpdCBtaWdo
dCBiZSBiZXR0ZXIKLSAgICB0byB1c2UgdGhlIHJvdXRlciBmb3IgdGhpcyBwdXJwb3NlLgotCi0g
ICAgQG1ldGhvZCBkZWZlclJlYWRpbmVzcwotICAqLwotICBkZWZlclJlYWRpbmVzczogZnVuY3Rp
b24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBjYWxsIGRlZmVyUmVhZGluZXNzIG9u
IGFuIGluc3RhbmNlIG9mIEVtYmVyLkFwcGxpY2F0aW9uIiwgdGhpcyBpbnN0YW5jZW9mIEVtYmVy
LkFwcGxpY2F0aW9uKTsKLSAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgZGVmZXIgcmVhZGlu
ZXNzIHNpbmNlIHRoZSBgcmVhZHkoKWAgaG9vayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4iLCB0
aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKTsKLSAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJh
bHMrKzsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsIGBhZHZhbmNlUmVhZGluZXNzYCBhZnRlciBh
bnkgYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGhhcyBjb21wbGV0ZWQuCi0gICAgRWFjaCBjYWxs
IHRvIGBkZWZlclJlYWRpbmVzc2AgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5j
ZVJlYWRpbmVzc2AKLSAgICBvciB0aGUgYXBwbGljYXRpb24gd2lsbCBuZXZlciBiZWNvbWUgcmVh
ZHkgYW5kIHJvdXRpbmcgd2lsbCBub3QgYmVnaW4uCi0KLSAgICBAbWV0aG9kIGFkdmFuY2VSZWFk
aW5lc3MKLSAgICBAc2VlIHtFbWJlci5BcHBsaWNhdGlvbiNkZWZlclJlYWRpbmVzc30KLSAgKi8K
LSAgYWR2YW5jZVJlYWRpbmVzczogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuYXNzZXJ0KCJZb3Ug
bXVzdCBjYWxsIGFkdmFuY2VSZWFkaW5lc3Mgb24gYW4gaW5zdGFuY2Ugb2YgRW1iZXIuQXBwbGlj
YXRpb24iLCB0aGlzIGluc3RhbmNlb2YgRW1iZXIuQXBwbGljYXRpb24pOwotICAgIHRoaXMuX3Jl
YWRpbmVzc0RlZmVycmFscy0tOwotCi0gICAgaWYgKHRoaXMuX3JlYWRpbmVzc0RlZmVycmFscyA9
PT0gMCkgewotICAgICAgRW1iZXIucnVuLm9uY2UodGhpcywgdGhpcy5kaWRCZWNvbWVSZWFkeSk7
Ci0gICAgfQotICB9LAotCi0gIC8qKgotICAgIHJlZ2lzdGVycyBhIGZhY3RvcnkgZm9yIGxhdGVy
IGluamVjdGlvbgotCi0gICAgRXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAg
PSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKLQotICAgIEFwcC5QZXJzb24gID0gRW1iZXIu
T2JqZWN0LmV4dGVuZCh7fSk7Ci0gICAgQXBwLk9yYW5nZSAgPSBFbWJlci5PYmplY3QuZXh0ZW5k
KHt9KTsKLSAgICBBcHAuRW1haWwgICA9IEVtYmVyLk9iamVjdC5leHRlbmQoe30pOwotICAgIEFw
cC5zZXNzaW9uID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7fSk7Ci0KLSAgICBBcHAucmVnaXN0ZXIo
J21vZGVsOnVzZXInLCBBcHAuUGVyc29uLCB7c2luZ2xldG9uOiBmYWxzZSB9KTsKLSAgICBBcHAu
cmVnaXN0ZXIoJ2ZydWl0OmZhdm9yaXRlJywgQXBwLk9yYW5nZSk7Ci0gICAgQXBwLnJlZ2lzdGVy
KCdjb21tdW5pY2F0aW9uOm1haW4nLCBBcHAuRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7Ci0g
ICAgQXBwLnJlZ2lzdGVyKCdzZXNzaW9uJywgQXBwLnNlc3Npb24sIHtpbnN0YW50aWF0ZTogZmFs
c2V9KTsKLSAgICBgYGAKLQotICAgIEBtZXRob2QgcmVnaXN0ZXIKLSAgICBAcGFyYW0gIGZ1bGxO
YW1lIHtTdHJpbmd9IHR5cGU6bmFtZSAoZS5nLiwgJ21vZGVsOnVzZXInKQotICAgIEBwYXJhbSAg
ZmFjdG9yeSB7RnVuY3Rpb259IChlLmcuLCBBcHAuUGVyc29uKQotICAgIEBwYXJhbSAgb3B0aW9u
cyB7U3RyaW5nfSAob3B0aW9uYWwpCi0gICoqLwotICByZWdpc3RlcjogZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX19jb250YWluZXJfXzsKLSAgICBjb250YWluZXIucmVn
aXN0ZXIuYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9LAotICAvKioKLSAgICBkZWZp
bmVzIGFuIGluamVjdGlvbiBvciB0eXBlSW5qZWN0aW9uCi0KLSAgICBFeGFtcGxlOgotCi0gICAg
YGBgamF2YXNjcmlwdAotICAgIEFwcC5pbmplY3QoPGZ1bGxfbmFtZSBvciB0eXBlPiwgPHByb3Bl
cnR5IG5hbWU+LCA8ZnVsbF9uYW1lPikKLSAgICBBcHAuaW5qZWN0KCdtb2RlbDp1c2VyJywgJ2Vt
YWlsJywgJ21vZGVsOmVtYWlsJykKLSAgICBBcHAuaW5qZWN0KCdtb2RlbCcsICdzb3VyY2UnLCAn
c291cmNlOm1haW4nKQotICAgIGBgYAotCi0gICAgQG1ldGhvZCBpbmplY3QKLSAgICBAcGFyYW0g
IGZhY3RvcnlOYW1lT3JUeXBlIHtTdHJpbmd9Ci0gICAgQHBhcmFtICBwcm9wZXJ0eSB7U3RyaW5n
fQotICAgIEBwYXJhbSAgaW5qZWN0aW9uTmFtZSB7U3RyaW5nfQotICAqKi8KLSAgaW5qZWN0OiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwotICAg
IGNvbnRhaW5lci5pbmplY3Rpb24uYXBwbHkoY29udGFpbmVyLCBhcmd1bWVudHMpOwotICB9LAot
Ci0gIC8qKgotICAgIENhbGxpbmcgaW5pdGlhbGl6ZSBtYW51YWxseSBpcyBub3Qgc3VwcG9ydGVk
LgotCi0gICAgUGxlYXNlIHNlZSBFbWJlci5BcHBsaWNhdGlvbiNhZHZhbmNlUmVhZGluZXNzIGFu
ZAotICAgIEVtYmVyLkFwcGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzLgotCi0gICAgQHByaXZhdGUK
LSAgICBAZGVwcmVjYXRlZAotICAgIEBtZXRob2QgaW5pdGlhbGl6ZQotICAgKiovCi0gIGluaXRp
YWxpemU6IGZ1bmN0aW9uKCkgewotICAgIEVtYmVyLmRlcHJlY2F0ZSgnQ2FsbGluZyBpbml0aWFs
aXplIG1hbnVhbGx5IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBzZWUgRW1iZXIuQXBwbGljYXRp
b24jYWR2YW5jZVJlYWRpbmVzcyBhbmQgRW1iZXIuQXBwbGljYXRpb24jZGVmZXJSZWFkaW5lc3Mn
KTsKLSAgfSwKLSAgLyoqCi0gICAgSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24uIFRoaXMgaGFw
cGVucyBhdXRvbWF0aWNhbGx5LgotCi0gICAgUnVuIGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0
aGUgYXBwbGljYXRpb24gbG9hZCBob29rLiBUaGVzZSBob29rcyBtYXkKLSAgICBjaG9vc2UgdG8g
ZGVmZXIgcmVhZGluZXNzLiBGb3IgZXhhbXBsZSwgYW4gYXV0aGVudGljYXRpb24gaG9vayBtaWdo
dCB3YW50Ci0gICAgdG8gZGVmZXIgcmVhZGluZXNzIHVudGlsIHRoZSBhdXRoIHRva2VuIGhhcyBi
ZWVuIHJldHJpZXZlZC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBfaW5pdGlhbGl6ZQot
ICAqLwotICBfaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMuaXNEZXN0cm95
ZWQpIHsgcmV0dXJuOyB9Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgQXBwLlJvdXRlciBt
dXN0IGFscmVhZHkgYmUgYXNzaWduZWQKLSAgICBpZiAodGhpcy5Sb3V0ZXIpIHsKLSAgICAgIHZh
ciBjb250YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX187Ci0gICAgICBjb250YWluZXIudW5yZWdp
c3Rlcigncm91dGVyOm1haW4nKTsKLSAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGVyOm1h
aW4nLCB0aGlzLlJvdXRlcik7Ci0gICAgfQotCi0gICAgdGhpcy5ydW5Jbml0aWFsaXplcnMoKTsK
LSAgICBFbWJlci5ydW5Mb2FkSG9va3MoJ2FwcGxpY2F0aW9uJywgdGhpcyk7Ci0KLSAgICAvLyBB
dCB0aGlzIHBvaW50LCBhbnkgaW5pdGlhbGl6ZXJzIG9yIGxvYWQgaG9va3MgdGhhdCB3b3VsZCBo
YXZlIHdhbnRlZAotICAgIC8vIHRvIGRlZmVyIHJlYWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBnZW5l
cmFsLCBhZHZhbmNpbmcgcmVhZGluZXNzIGhlcmUKLSAgICAvLyB3aWxsIHByb2NlZWQgdG8gZGlk
QmVjb21lUmVhZHkuCi0gICAgdGhpcy5hZHZhbmNlUmVhZGluZXNzKCk7Ci0KLSAgICByZXR1cm4g
dGhpczsKLSAgfSwKLQotICAvKioKLSAgICBSZXNldCB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMg
dHlwaWNhbGx5IHVzZWQgb25seSBpbiB0ZXN0cy4gSXQgY2xlYW5zIHVwCi0gICAgdGhlIGFwcGxp
Y2F0aW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0KLSAgICAxLiBEZWFjdGl2YXRlIGV4aXN0
aW5nIHJvdXRlcwotICAgIDIuIERlc3Ryb3kgYWxsIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lcgot
ICAgIDMuIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvbiBjb250YWluZXIKLSAgICA0LiBSZS1yb3V0
ZSB0byB0aGUgZXhpc3RpbmcgdXJsCi0KLSAgICBUeXBpY2FsIEV4YW1wbGU6Ci0KLSAgICBgYGBq
YXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBwOwotCi0gICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewot
ICAgICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAgICBt
b2R1bGUoImFjY2VwdGFuY2UgdGVzdCIsIHsKLSAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgQXBwLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0ZXN0KCJmaXJzdCB0
ZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBBcHAgaXMgZnJlc2hseSByZXNldAotICAgIH0p
OwotCi0gICAgdGVzdCgiZmlyc3QgdGVzdCIsIGZ1bmN0aW9uKCkgewotICAgICAgLy8gQXBwIGlz
IGFnYWluIGZyZXNobHkgcmVzZXQKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIEFkdmFuY2VkIEV4
YW1wbGU6Ci0KLSAgICBPY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFw
cCBmcm9tIGluaXRpYWxpemluZyBkdXJpbmcKLSAgICBzZXR1cC4gVGhpcyBjb3VsZCBlbmFibGUg
ZXh0cmEgY29uZmlndXJhdGlvbiwgb3IgZW5hYmxlIGFzc2VydGluZyBwcmlvcgotICAgIHRvIHRo
ZSBhcHAgYmVjb21pbmcgcmVhZHkuCi0KLSAgICBgYGBqYXZhc2NyaXB0Ci0KLSAgICB2YXIgQXBw
OwotCi0gICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewotICAgICAgQXBwID0gRW1iZXIuQXBwbGlj
YXRpb24uY3JlYXRlKCk7Ci0gICAgfSk7Ci0KLSAgICBtb2R1bGUoImFjY2VwdGFuY2UgdGVzdCIs
IHsKLSAgICAgIHNldHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgRW1iZXIucnVuKGZ1bmN0aW9u
KCkgewotICAgICAgICAgIEFwcC5yZXNldCgpOwotICAgICAgICAgIEFwcC5kZWZlclJlYWRpbmVz
cygpOwotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHRlc3QoImZpcnN0IHRl
c3QiLCBmdW5jdGlvbigpIHsKLSAgICAgIG9rKHRydWUsICdzb21ldGhpbmcgYmVmb3JlIGFwcCBp
cyBpbml0aWFsaXplZCcpOwotCi0gICAgICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7Ci0gICAgICAg
IEFwcC5hZHZhbmNlUmVhZGluZXNzKCk7Ci0gICAgICB9KTsKLSAgICAgIG9rKHRydWUsICdzb21l
dGhpbmcgYWZ0ZXIgYXBwIGlzIGluaXRpYWxpemVkJyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAg
ICBAbWV0aG9kIHJlc2V0Ci0gICoqLwotICByZXNldDogZnVuY3Rpb24oKSB7Ci0gICAgdGhpcy5f
cmVhZGluZXNzRGVmZXJyYWxzID0gMTsKLQotICAgIGZ1bmN0aW9uIGhhbmRsZVJlc2V0KCkgewot
ICAgICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWlu
Jyk7Ci0gICAgICByb3V0ZXIucmVzZXQoKTsKLQotICAgICAgRW1iZXIucnVuKHRoaXMuX19jb250
YWluZXJfXywgJ2Rlc3Ryb3knKTsKLQotICAgICAgdGhpcy5idWlsZENvbnRhaW5lcigpOwotCi0g
ICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgdGhpcy5faW5pdGlhbGl6ZSgpOwotICAgICAgfSk7Ci0gICAgfQotCi0gICAgRW1iZXIu
cnVuLmpvaW4odGhpcywgaGFuZGxlUmVzZXQpOwotICB9LAotCi0gIC8qKgotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBydW5Jbml0aWFsaXplcnMKLSAgKi8KLSAgcnVuSW5pdGlhbGl6ZXJzOiBm
dW5jdGlvbigpIHsKLSAgICB2YXIgaW5pdGlhbGl6ZXJzID0gZ2V0KHRoaXMuY29uc3RydWN0b3Is
ICdpbml0aWFsaXplcnMnKSwKLSAgICAgICAgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9f
LAotICAgICAgICBncmFwaCA9IG5ldyBFbWJlci5EQUcoKSwKLSAgICAgICAgbmFtZXNwYWNlID0g
dGhpcywKLSAgICAgICAgbmFtZSwgaW5pdGlhbGl6ZXI7Ci0KLSAgICBmb3IgKG5hbWUgaW4gaW5p
dGlhbGl6ZXJzKSB7Ci0gICAgICBpbml0aWFsaXplciA9IGluaXRpYWxpemVyc1tuYW1lXTsKLSAg
ICAgIGdyYXBoLmFkZEVkZ2VzKGluaXRpYWxpemVyLm5hbWUsIGluaXRpYWxpemVyLmluaXRpYWxp
emUsIGluaXRpYWxpemVyLmJlZm9yZSwgaW5pdGlhbGl6ZXIuYWZ0ZXIpOwotICAgIH0KLQotICAg
IGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRleCkgewotICAgICAgdmFyIGluaXRpYWxpemVy
ID0gdmVydGV4LnZhbHVlOwotICAgICAgRW1iZXIuYXNzZXJ0KCJObyBhcHBsaWNhdGlvbiBpbml0
aWFsaXplciBuYW1lZCAnIit2ZXJ0ZXgubmFtZSsiJyIsIGluaXRpYWxpemVyKTsKLSAgICAgIGlu
aXRpYWxpemVyKGNvbnRhaW5lciwgbmFtZXNwYWNlKTsKLSAgICB9KTsKLSAgfSwKLQotICAvKioK
LSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgZGlkQmVjb21lUmVhZHkKLSAgKi8KLSAgZGlkQmVj
b21lUmVhZHk6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuc2V0dXBFdmVudERpc3BhdGNoZXIoKTsK
LSAgICB0aGlzLnJlYWR5KCk7IC8vIHVzZXIgaG9vawotICAgIHRoaXMuc3RhcnRSb3V0aW5nKCk7
Ci0KLSAgICBpZiAoIUVtYmVyLnRlc3RpbmcpIHsKLSAgICAgIC8vIEVhZ2VybHkgbmFtZSBhbGwg
Y2xhc3NlcyB0aGF0IGFyZSBhbHJlYWR5IGxvYWRlZAotICAgICAgRW1iZXIuTmFtZXNwYWNlLnBy
b2Nlc3NBbGwoKTsKLSAgICAgIEVtYmVyLkJPT1RFRCA9IHRydWU7Ci0gICAgfQotCi0gICAgdGhp
cy5yZXNvbHZlKHRoaXMpOwotICB9LAotCi0gIC8qKgotICAgIFNldHVwIHVwIHRoZSBldmVudCBk
aXNwYXRjaGVyIHRvIHJlY2VpdmUgZXZlbnRzIG9uIHRoZQotICAgIGFwcGxpY2F0aW9uJ3MgYHJv
b3RFbGVtZW50YCB3aXRoIGFueSByZWdpc3RlcmVkCi0gICAgYGN1c3RvbUV2ZW50c2AuCi0KLSAg
ICBAcHJpdmF0ZQotICAgIEBtZXRob2Qgc2V0dXBFdmVudERpc3BhdGNoZXIKLSAgKi8KLSAgc2V0
dXBFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXN0b21FdmVudHMgPSBn
ZXQodGhpcywgJ2N1c3RvbUV2ZW50cycpLAotICAgICAgICByb290RWxlbWVudCA9IGdldCh0aGlz
LCAncm9vdEVsZW1lbnQnKSwKLSAgICAgICAgZGlzcGF0Y2hlciA9IHRoaXMuX19jb250YWluZXJf
Xy5sb29rdXAoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFpbicpOwotCi0gICAgc2V0KHRoaXMsICdldmVu
dERpc3BhdGNoZXInLCBkaXNwYXRjaGVyKTsKLSAgICBkaXNwYXRjaGVyLnNldHVwKGN1c3RvbUV2
ZW50cywgcm9vdEVsZW1lbnQpOwotICB9LAotCi0gIC8qKgotICAgIHRyaWdnZXIgYSBuZXcgY2Fs
bCB0byBgcm91dGVgIHdoZW5ldmVyIHRoZSBVUkwgY2hhbmdlcy4KLSAgICBJZiB0aGUgYXBwbGlj
YXRpb24gaGFzIGEgcm91dGVyLCB1c2UgaXQgdG8gcm91dGUgdG8gdGhlIGN1cnJlbnQgVVJMLCBh
bmQKLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBzdGFydFJvdXRpbmcKLSAgICBAcHJvcGVy
dHkgcm91dGVyIHtFbWJlci5Sb3V0ZXJ9Ci0gICovCi0gIHN0YXJ0Um91dGluZzogZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIHJvdXRlciA9IHRoaXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjpt
YWluJyk7Ci0gICAgaWYgKCFyb3V0ZXIpIHsgcmV0dXJuOyB9Ci0KLSAgICByb3V0ZXIuc3RhcnRS
b3V0aW5nKCk7Ci0gIH0sCi0KLSAgaGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsKLSAgICB2YXIg
cm91dGVyID0gdGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cCgncm91dGVyOm1haW4nKTsKLQotICAg
IHJvdXRlci5oYW5kbGVVUkwodXJsKTsKLSAgfSwKLQotICAvKioKLSAgICBDYWxsZWQgd2hlbiB0
aGUgQXBwbGljYXRpb24gaGFzIGJlY29tZSByZWFkeS4KLSAgICBUaGUgY2FsbCB3aWxsIGJlIGRl
bGF5ZWQgdW50aWwgdGhlIERPTSBoYXMgYmVjb21lIHJlYWR5LgotCi0gICAgQGV2ZW50IHJlYWR5
Ci0gICovCi0gIHJlYWR5OiBFbWJlci5LLAotCi0gIC8qKgotICAgIEBkZXByZWNhdGVkIFVzZSAn
UmVzb2x2ZXInIGluc3RlYWQKLSAgICBTZXQgdGhpcyB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBj
bGFzcyB0byBgRW1iZXIuRGVmYXVsdFJlc29sdmVyYAotCi0KLSAgICBAcHJvcGVydHkgcmVzb2x2
ZXIKLSAgKi8KLSAgcmVzb2x2ZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgU2V0IHRoaXMgdG8gcHJv
dmlkZSBhbiBhbHRlcm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKLQotICAg
IEBwcm9wZXJ0eSByZXNvbHZlcgotICAqLwotICBSZXNvbHZlcjogbnVsbCwKLQotICB3aWxsRGVz
dHJveTogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIuQk9PVEVEID0gZmFsc2U7Ci0KLSAgICB0aGlz
Ll9fY29udGFpbmVyX18uZGVzdHJveSgpOwotICB9LAotCi0gIGluaXRpYWxpemVyOiBmdW5jdGlv
bihvcHRpb25zKSB7Ci0gICAgdGhpcy5jb25zdHJ1Y3Rvci5pbml0aWFsaXplcihvcHRpb25zKTsK
LSAgfQotfSk7Ci0KLUVtYmVyLkFwcGxpY2F0aW9uLnJlb3BlbkNsYXNzKHsKLSAgaW5pdGlhbGl6
ZXJzOiB7fSwKLSAgaW5pdGlhbGl6ZXI6IGZ1bmN0aW9uKGluaXRpYWxpemVyKSB7Ci0gICAgLy8g
SWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5pdGlhbGl6ZXIgYmVpbmcgYWRkZWQgdG8gYSBzdWJjbGFz
cywgd2UgYXJlIGdvaW5nIHRvIHJlb3BlbiB0aGUgY2xhc3MKLSAgICAvLyB0byBtYWtlIHN1cmUg
d2UgaGF2ZSBhIG5ldyBgaW5pdGlhbGl6ZXJzYCBvYmplY3QsIHdoaWNoIGV4dGVuZHMgZnJvbSB0
aGUgcGFyZW50IGNsYXNzJyB1c2luZwotICAgIC8vIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuIFdp
dGhvdXQgdGhpcywgYXR0ZW1wdGluZyB0byBhZGQgaW5pdGlhbGl6ZXJzIHRvIHRoZSBzdWJjbGFz
cyB3b3VsZAotICAgIC8vIHBvbGx1dGUgdGhlIHBhcmVudCBjbGFzcyBhcyB3ZWxsIGFzIG90aGVy
IHN1YmNsYXNzZXMuCi0gICAgaWYgKHRoaXMuc3VwZXJjbGFzcy5pbml0aWFsaXplcnMgIT09IHVu
ZGVmaW5lZCAmJiB0aGlzLnN1cGVyY2xhc3MuaW5pdGlhbGl6ZXJzID09PSB0aGlzLmluaXRpYWxp
emVycykgewotICAgICAgdGhpcy5yZW9wZW5DbGFzcyh7Ci0gICAgICAgIGluaXRpYWxpemVyczog
RW1iZXIuY3JlYXRlKHRoaXMuaW5pdGlhbGl6ZXJzKQotICAgICAgfSk7Ci0gICAgfQotCi0gICAg
RW1iZXIuYXNzZXJ0KCJUaGUgaW5pdGlhbGl6ZXIgJyIgKyBpbml0aWFsaXplci5uYW1lICsgIicg
aGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIiwgIXRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxp
emVyLm5hbWVdKTsKLSAgICBFbWJlci5hc3NlcnQoIkFuIGluaXRpYWxpemVyIGNhbm5vdCBiZSBy
ZWdpc3RlcmVkIHdpdGggYm90aCBhIGJlZm9yZSBhbmQgYW4gYWZ0ZXIiLCAhKGluaXRpYWxpemVy
LmJlZm9yZSAmJiBpbml0aWFsaXplci5hZnRlcikpOwotICAgIEVtYmVyLmFzc2VydCgiQW4gaW5p
dGlhbGl6ZXIgY2Fubm90IGJlIHJlZ2lzdGVyZWQgd2l0aG91dCBhbiBpbml0aWFsaXplIGZ1bmN0
aW9uIiwgRW1iZXIuY2FuSW52b2tlKGluaXRpYWxpemVyLCAnaW5pdGlhbGl6ZScpKTsKLQotICAg
IHRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxpemVyLm5hbWVdID0gaW5pdGlhbGl6ZXI7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhpcyBjcmVhdGVzIGEgY29udGFpbmVyIHdpdGggdGhlIGRlZmF1bHQg
RW1iZXIgbmFtaW5nIGNvbnZlbnRpb25zLgotCi0gICAgSXQgYWxzbyBjb25maWd1cmVzIHRoZSBj
b250YWluZXI6Ci0KLSAgICAqIHJlZ2lzdGVyZWQgdmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGlt
ZSB0aGV5IGFyZSBsb29rZWQgdXAgKHRoZXkgYXJlCi0gICAgICBub3Qgc2luZ2xldG9ucykKLSAg
ICAqIHJlZ2lzdGVyZWQgdGVtcGxhdGVzIGFyZSBub3QgZmFjdG9yaWVzOyB0aGUgcmVnaXN0ZXJl
ZCB2YWx1ZSBpcwotICAgICAgcmV0dXJuZWQgZGlyZWN0bHkuCi0gICAgKiB0aGUgcm91dGVyIHJl
Y2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBpdHMgYG5hbWVzcGFjZWAgcHJvcGVydHkKLSAgICAq
IGFsbCBjb250cm9sbGVycyByZWNlaXZlIHRoZSByb3V0ZXIgYXMgdGhlaXIgYHRhcmdldGAgYW5k
IGBjb250cm9sbGVyc2AKLSAgICAgIHByb3BlcnRpZXMKLSAgICAqIGFsbCBjb250cm9sbGVycyBy
ZWNlaXZlIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVpciBgbmFtZXNwYWNlYCBwcm9wZXJ0eQotICAg
ICogdGhlIGFwcGxpY2F0aW9uIHZpZXcgcmVjZWl2ZXMgdGhlIGFwcGxpY2F0aW9uIGNvbnRyb2xs
ZXIgYXMgaXRzCi0gICAgICBgY29udHJvbGxlcmAgcHJvcGVydHkKLSAgICAqIHRoZSBhcHBsaWNh
dGlvbiB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiB0ZW1wbGF0ZSBhcyBpdHMKLSAgICAg
IGBkZWZhdWx0VGVtcGxhdGVgIHByb3BlcnR5Ci0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2Qg
YnVpbGRDb250YWluZXIKLSAgICBAc3RhdGljCi0gICAgQHBhcmFtIHtFbWJlci5BcHBsaWNhdGlv
bn0gbmFtZXNwYWNlIHRoZSBhcHBsaWNhdGlvbiB0byBidWlsZCB0aGUKLSAgICAgIGNvbnRhaW5l
ciBmb3IuCi0gICAgQHJldHVybiB7RW1iZXIuQ29udGFpbmVyfSB0aGUgYnVpbHQgY29udGFpbmVy
Ci0gICovCi0gIGJ1aWxkQ29udGFpbmVyOiBmdW5jdGlvbihuYW1lc3BhY2UpIHsKLSAgICB2YXIg
Y29udGFpbmVyID0gbmV3IEVtYmVyLkNvbnRhaW5lcigpOwotCi0gICAgRW1iZXIuQ29udGFpbmVy
LmRlZmF1bHRDb250YWluZXIgPSBuZXcgRGVwcmVjYXRlZENvbnRhaW5lcihjb250YWluZXIpOwot
Ci0gICAgY29udGFpbmVyLnNldCA9IEVtYmVyLnNldDsKLSAgICBjb250YWluZXIucmVzb2x2ZXIg
ID0gcmVzb2x2ZXJGb3IobmFtZXNwYWNlKTsKLSAgICBjb250YWluZXIubm9ybWFsaXplID0gY29u
dGFpbmVyLnJlc29sdmVyLm5vcm1hbGl6ZTsKLSAgICBjb250YWluZXIuZGVzY3JpYmUgID0gY29u
dGFpbmVyLnJlc29sdmVyLmRlc2NyaWJlOwotICAgIGNvbnRhaW5lci5tYWtlVG9TdHJpbmcgPSBj
b250YWluZXIucmVzb2x2ZXIubWFrZVRvU3RyaW5nOwotCi0gICAgY29udGFpbmVyLm9wdGlvbnNG
b3JUeXBlKCdjb21wb25lbnQnLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVy
Lm9wdGlvbnNGb3JUeXBlKCd2aWV3JywgeyBzaW5nbGV0b246IGZhbHNlIH0pOwotICAgIGNvbnRh
aW5lci5vcHRpb25zRm9yVHlwZSgndGVtcGxhdGUnLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsK
LSAgICBjb250YWluZXIub3B0aW9uc0ZvclR5cGUoJ2hlbHBlcicsIHsgaW5zdGFudGlhdGU6IGZh
bHNlIH0pOwotCi0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdhcHBsaWNhdGlvbjptYWluJywgbmFt
ZXNwYWNlLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKLQotICAgIGNvbnRhaW5lci5yZWdpc3Rl
cignY29udHJvbGxlcjpiYXNpYycsIEVtYmVyLkNvbnRyb2xsZXIsIHsgaW5zdGFudGlhdGU6IGZh
bHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjpvYmplY3QnLCBFbWJl
ci5PYmplY3RDb250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKLSAgICBjb250YWlu
ZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6YXJyYXknLCBFbWJlci5BcnJheUNvbnRyb2xsZXIsIHsg
aW5zdGFudGlhdGU6IGZhbHNlIH0pOwotICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91dGU6YmFz
aWMnLCBFbWJlci5Sb3V0ZSwgeyBpbnN0YW50aWF0ZTogZmFsc2UgfSk7Ci0gICAgY29udGFpbmVy
LnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1haW4nLCBFbWJlci5FdmVudERpc3BhdGNoZXIp
OwotCi0gICAgY29udGFpbmVyLnJlZ2lzdGVyKCdyb3V0ZXI6bWFpbicsICBFbWJlci5Sb3V0ZXIp
OwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ3JvdXRlcjptYWluJywgJ25hbWVzcGFjZScsICdh
cHBsaWNhdGlvbjptYWluJyk7Ci0KLSAgICBjb250YWluZXIuaW5qZWN0aW9uKCdjb250cm9sbGVy
JywgJ3RhcmdldCcsICdyb3V0ZXI6bWFpbicpOwotICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ2Nv
bnRyb2xsZXInLCAnbmFtZXNwYWNlJywgJ2FwcGxpY2F0aW9uOm1haW4nKTsKLQotICAgIGNvbnRh
aW5lci5pbmplY3Rpb24oJ3JvdXRlJywgJ3JvdXRlcicsICdyb3V0ZXI6bWFpbicpOwotCi0gICAg
cmV0dXJuIGNvbnRhaW5lcjsKLSAgfQotfSk7Ci0KLS8qKgotICBUaGlzIGZ1bmN0aW9uIGRlZmlu
ZXMgdGhlIGRlZmF1bHQgbG9va3VwIHJ1bGVzIGZvciBjb250YWluZXIgbG9va3VwczoKLQotICAq
IHRlbXBsYXRlcyBhcmUgbG9va2VkIHVwIG9uIGBFbWJlci5URU1QTEFURVNgCi0gICogb3RoZXIg
bmFtZXMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgY2xhc3NpZnlpbmcg
dGhlIG5hbWUuCi0gICAgRm9yIGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3RgIGxvb2tzIHVwIGBB
cHAuUG9zdENvbnRyb2xsZXJgIGJ5IGRlZmF1bHQuCi0gICogaWYgdGhlIGRlZmF1bHQgbG9va3Vw
IGZhaWxzLCBsb29rIGZvciByZWdpc3RlcmVkIGNsYXNzZXMgb24gdGhlIGNvbnRhaW5lcgotCi0g
IFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZWdpc3RlciBkZWZhdWx0IGluamVjdGlv
bnMgaW4gdGhlIGNvbnRhaW5lcgotICB0aGF0IGNvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG5v
cm1hbCBuYW1pbmcgY29udmVudGlvbi4KLQotICBAcHJpdmF0ZQotICBAbWV0aG9kIHJlc29sdmVy
Rm9yCi0gIEBwYXJhbSB7RW1iZXIuTmFtZXNwYWNlfSBuYW1lc3BhY2UgdGhlIG5hbWVzcGFjZSB0
byBsb29rIGZvciBjbGFzc2VzCi0gIEByZXR1cm4geyp9IHRoZSByZXNvbHZlZCB2YWx1ZSBmb3Ig
YSBnaXZlbiBsb29rdXAKLSovCi1mdW5jdGlvbiByZXNvbHZlckZvcihuYW1lc3BhY2UpIHsKLSAg
aWYgKG5hbWVzcGFjZS5nZXQoJ3Jlc29sdmVyJykpIHsKLSAgICBFbWJlci5kZXByZWNhdGUoJ0Fw
cGxpY2F0aW9uLnJlc29sdmVyIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQXBwbGljYXRpb24u
UmVzb2x2ZXInLCBmYWxzZSk7Ci0gIH0KLQotICB2YXIgUmVzb2x2ZXJDbGFzcyA9IG5hbWVzcGFj
ZS5nZXQoJ3Jlc29sdmVyJykgfHwgbmFtZXNwYWNlLmdldCgnUmVzb2x2ZXInKSB8fCBFbWJlci5E
ZWZhdWx0UmVzb2x2ZXI7Ci0gIHZhciByZXNvbHZlciA9IFJlc29sdmVyQ2xhc3MuY3JlYXRlKHsK
LSAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZQotICB9KTsKLQotICBmdW5jdGlvbiByZXNvbHZlKGZ1
bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJlc29sdmVyLnJlc29sdmUoZnVsbE5hbWUpOwotICB9Ci0K
LSAgcmVzb2x2ZS5kZXNjcmliZSA9IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJl
c29sdmVyLmxvb2t1cERlc2NyaXB0aW9uKGZ1bGxOYW1lKTsKLSAgfTsKLQotICByZXNvbHZlLm1h
a2VUb1N0cmluZyA9IGZ1bmN0aW9uKGZhY3RvcnksIGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIHJl
c29sdmVyLm1ha2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7Ci0gIH07Ci0KLSAgcmVzb2x2
ZS5ub3JtYWxpemUgPSBmdW5jdGlvbihmdWxsTmFtZSkgewotICAgIGlmIChyZXNvbHZlci5ub3Jt
YWxpemUpIHsKLSAgICAgIHJldHVybiByZXNvbHZlci5ub3JtYWxpemUoZnVsbE5hbWUpOwotICAg
IH0gZWxzZSB7Ci0gICAgICBFbWJlci5kZXByZWNhdGUoJ1RoZSBSZXNvbHZlciBzaG91bGQgbm93
IHByb3ZpZGUgYSBcJ25vcm1hbGl6ZVwnIGZ1bmN0aW9uJywgZmFsc2UpOwotICAgICAgcmV0dXJu
IGZ1bGxOYW1lOwotICAgIH0KLSAgfTsKLQotICByZXR1cm4gcmVzb2x2ZTsKLX0KLQotRW1iZXIu
cnVuTG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlvbicsIEVtYmVyLkFwcGxpY2F0aW9uKTsKLQot
fSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsK
LS8qKgotQG1vZHVsZSBlbWJlcgotQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQot
dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwotCi1mdW5jdGlvbiB2ZXJpZnlO
ZWVkc0RlcGVuZGVuY2llcyhjb250cm9sbGVyLCBjb250YWluZXIsIG5lZWRzKSB7Ci0gIHZhciBk
ZXBlbmRlbmN5LCBpLCBsLCBtaXNzaW5nID0gW107Ci0KLSAgZm9yIChpPTAsIGw9bmVlZHMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgIGRlcGVuZGVuY3kgPSBuZWVkc1tpXTsKLQotICAgIEVtYmVy
LmFzc2VydChFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiNuZWVkcyBtdXN0IG5vdCBzcGVj
aWZ5IGRlcGVuZGVuY2llcyB3aXRoIHBlcmlvZHMgaW4gdGhlaXIgbmFtZXMgKCIgKyBkZXBlbmRl
bmN5ICsgIikiLCBkZXBlbmRlbmN5LmluZGV4T2YoJy4nKSA9PT0gLTEpOwotCi0gICAgaWYgKGRl
cGVuZGVuY3kuaW5kZXhPZignOicpID09PSAtMSkgewotICAgICAgZGVwZW5kZW5jeSA9ICJjb250
cm9sbGVyOiIgKyBkZXBlbmRlbmN5OwotICAgIH0KLQotICAgIC8vIFN0cnVjdHVyZSBhc3NlcnQg
dG8gc3RpbGwgZG8gdmVyaWZpY2F0aW9uIGJ1dCBub3Qgc3RyaW5nIGNvbmNhdCBpbiBwcm9kdWN0
aW9uCi0gICAgaWYgKCFjb250YWluZXIuaGFzKGRlcGVuZGVuY3kpKSB7Ci0gICAgICBtaXNzaW5n
LnB1c2goZGVwZW5kZW5jeSk7Ci0gICAgfQotICB9Ci0gIGlmIChtaXNzaW5nLmxlbmd0aCkgewot
ICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgIiBu
ZWVkcyBbICIgKyBtaXNzaW5nLmpvaW4oJywgJykgKyAiIF0gYnV0ICIgKyAobWlzc2luZy5sZW5n
dGggPiAxID8gJ3RoZXknIDogJ2l0JykgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotICB9Ci19
Ci0KLXZhciBkZWZhdWx0Q29udHJvbGxlcnNDb21wdXRlZFByb3BlcnR5ID0gRW1iZXIuY29tcHV0
ZWQoZnVuY3Rpb24oKSB7Ci0gIHZhciBjb250cm9sbGVyID0gdGhpczsKLQotICByZXR1cm4gewot
ICAgIG5lZWRzOiBnZXQoY29udHJvbGxlciwgJ25lZWRzJyksCi0gICAgY29udGFpbmVyOiBnZXQo
Y29udHJvbGxlciwgJ2NvbnRhaW5lcicpLAotICAgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24o
Y29udHJvbGxlck5hbWUpIHsKLSAgICAgIHZhciBuZWVkcyA9IHRoaXMubmVlZHMsCi0gICAgICAg
IGRlcGVuZGVuY3ksIGksIGw7Ci0gICAgICBmb3IgKGk9MCwgbD1uZWVkcy5sZW5ndGg7IGk8bDsg
aSsrKSB7Ci0gICAgICAgIGRlcGVuZGVuY3kgPSBuZWVkc1tpXTsKLSAgICAgICAgaWYgKGRlcGVu
ZGVuY3kgPT09IGNvbnRyb2xsZXJOYW1lKSB7Ci0gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFp
bmVyLmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWUpOwotICAgICAgICB9Ci0g
ICAgICB9Ci0KLSAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBFbWJlci5pbnNwZWN0KGNvbnRyb2xs
ZXIpICsgJyNuZWVkcyBkb2VzIG5vdCBpbmNsdWRlIGAnICsgY29udHJvbGxlck5hbWUgKyAnYC4g
VG8gYWNjZXNzIHRoZSAnICsgY29udHJvbGxlck5hbWUgKyAnIGNvbnRyb2xsZXIgZnJvbSAnICsg
RW1iZXIuaW5zcGVjdChjb250cm9sbGVyKSArICcsICcgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xs
ZXIpICsgJyBzaG91bGQgaGF2ZSBhIGBuZWVkc2AgcHJvcGVydHkgdGhhdCBpcyBhbiBhcnJheSBv
ZiB0aGUgY29udHJvbGxlcnMgaXQgaGFzIGFjY2VzcyB0by4nOwotICAgICAgdGhyb3cgbmV3IFJl
ZmVyZW5jZUVycm9yKGVycm9yTWVzc2FnZSk7Ci0gICAgfSwKLSAgICBzZXRVbmtub3duUHJvcGVy
dHk6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBj
YW5ub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBgY29udHJvbGxlcnMuIiArIGtleSArICJgIG9m
ICIgKyBFbWJlci5pbnNwZWN0KGNvbnRyb2xsZXIpKTsKLSAgICB9Ci0gIH07Ci19KTsKLQotLyoq
Ci0gIEBjbGFzcyBDb250cm9sbGVyTWl4aW4KLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVy
LkNvbnRyb2xsZXJNaXhpbi5yZW9wZW4oewotICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBbJ25l
ZWRzJ10sCi0KLSAgLyoqCi0gICAgQW4gYXJyYXkgb2Ygb3RoZXIgY29udHJvbGxlciBvYmplY3Rz
IGF2YWlsYWJsZSBpbnNpZGUKLSAgICBpbnN0YW5jZXMgb2YgdGhpcyBjb250cm9sbGVyIHZpYSB0
aGUgYGNvbnRyb2xsZXJzYAotICAgIHByb3BlcnR5OgotCi0gICAgRm9yIGV4YW1wbGUsIHdoZW4g
eW91IGRlZmluZSBhIGNvbnRyb2xsZXI6Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkNv
bW1lbnRzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgICAg
bmVlZHM6IFsncG9zdCddCi0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGUgYXBwbGljYXRpb24n
cyBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlc2Ugb3RoZXIKLSAgICBjb250cm9sbGVycyBhcmUgYWNj
ZXNzaWJsZSBieSBuYW1lIHRocm91Z2ggdGhlCi0gICAgYGNvbnRyb2xsZXJzYCBwcm9wZXJ0eToK
LQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlzLmdldCgnY29udHJvbGxlcnMucG9zdCcpOyAv
LyBpbnN0YW5jZSBvZiBBcHAuUG9zdENvbnRyb2xsZXIKLSAgICBgYGAKLQotICAgIEdpdmVuIHRo
YXQgeW91IGhhdmUgYSBuZXN0ZWQgY29udHJvbGxlciAobmVzdGVkIHJlc291cmNlKToKLQotICAg
IGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudHNOZXdDb250cm9sbGVyID0gRW1iZXIuT2Jq
ZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIH0pOwotICAgIGBgYAotCi0gICAgV2hlbiB5b3Ug
ZGVmaW5lIGEgY29udHJvbGxlciB0aGF0IHJlcXVpcmVzIGFjY2VzcyB0byBhIG5lc3RlZCBvbmU6
Ci0KLSAgICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwLkluZGV4Q29udHJvbGxlciA9IEVtYmVyLk9i
amVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKLSAgICAgIG5lZWRzOiBbJ2NvbW1lbnRzTmV3J10KLSAg
ICB9KTsKLSAgICBgYGAKLQotICAgIFlvdSB3aWxsIGJlIGFibGUgdG8gZ2V0IGFjY2VzcyB0byBp
dDoKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICB0aGlzLmdldCgnY29udHJvbGxlcnMuY29tbWVu
dHNOZXcnKTsgLy8gaW5zdGFuY2Ugb2YgQXBwLkNvbW1lbnRzTmV3Q29udHJvbGxlcgotICAgIGBg
YAotCi0gICAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc2luZ2xldG9uIGNvbnRyb2xsZXJz
LgotCi0gICAgQHByb3BlcnR5IHtBcnJheX0gbmVlZHMKLSAgICBAZGVmYXVsdCBbXQotICAqLwot
ICBuZWVkczogW10sCi0KLSAgaW5pdDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG5lZWRzID0gZ2V0
KHRoaXMsICduZWVkcycpLAotICAgIGxlbmd0aCA9IGdldChuZWVkcywgJ2xlbmd0aCcpOwotCi0g
ICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgIEVtYmVyLmFzc2VydCgnIGAnICsgRW1iZXIuaW5z
cGVjdCh0aGlzKSArICcgc3BlY2lmaWVzIGBuZWVkc2AsIGJ1dCBkb2VzICcgKwotICAgICAgICAg
ICAgICAgICAgICJub3QgaGF2ZSBhIGNvbnRhaW5lci4gUGxlYXNlIGVuc3VyZSB0aGlzIGNvbnRy
b2xsZXIgd2FzICIgKwotICAgICAgICAgICAgICAgICAgICJpbnN0YW50aWF0ZWQgd2l0aCBhIGNv
bnRhaW5lci4iLAotICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyIHx8IEVtYmVyLm1l
dGEodGhpcywgZmFsc2UpLmRlc2NzLmNvbnRyb2xsZXJzICE9PSBkZWZhdWx0Q29udHJvbGxlcnND
b21wdXRlZFByb3BlcnR5KTsKLQotICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7Ci0gICAgICAg
IHZlcmlmeU5lZWRzRGVwZW5kZW5jaWVzKHRoaXMsIHRoaXMuY29udGFpbmVyLCBuZWVkcyk7Ci0g
ICAgICB9Ci0KLSAgICAgIC8vIGlmIG5lZWRzIHRoZW4gaW5pdGlhbGl6ZSBjb250cm9sbGVycyBw
cm94eQotICAgICAgZ2V0KHRoaXMsICdjb250cm9sbGVycycpOwotICAgIH0KLQotICAgIHRoaXMu
X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgQG1ldGhv
ZCBjb250cm9sbGVyRm9yCi0gICAgQHNlZSB7RW1iZXIuUm91dGUjY29udHJvbGxlckZvcn0KLSAg
ICBAZGVwcmVjYXRlZCBVc2UgYG5lZWRzYCBpbnN0ZWFkCi0gICovCi0gIGNvbnRyb2xsZXJGb3I6
IGZ1bmN0aW9uKGNvbnRyb2xsZXJOYW1lKSB7Ci0gICAgRW1iZXIuZGVwcmVjYXRlKCJDb250cm9s
bGVyI2NvbnRyb2xsZXJGb3IgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBDb250cm9sbGVyI25l
ZWRzIGluc3RlYWQiKTsKLSAgICByZXR1cm4gRW1iZXIuY29udHJvbGxlckZvcihnZXQodGhpcywg
J2NvbnRhaW5lcicpLCBjb250cm9sbGVyTmFtZSk7Ci0gIH0sCi0KLSAgLyoqCi0gICAgU3RvcmVz
IHRoZSBpbnN0YW5jZXMgb2Ygb3RoZXIgY29udHJvbGxlcnMgYXZhaWxhYmxlIGZyb20gd2l0aGlu
Ci0gICAgdGhpcyBjb250cm9sbGVyLiBBbnkgY29udHJvbGxlciBsaXN0ZWQgYnkgbmFtZSBpbiB0
aGUgYG5lZWRzYAotICAgIHByb3BlcnR5IHdpbGwgYmUgYWNjZXNzaWJsZSBieSBuYW1lIHRocm91
Z2ggdGhpcyBwcm9wZXJ0eS4KLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBBcHAuQ29tbWVudHND
b250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7Ci0gICAgICBuZWVkczog
Wydwb3N0J10sCi0gICAgICBwb3N0VGl0bGU6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBjdXJy
ZW50UG9zdCA9IHRoaXMuZ2V0KCdjb250cm9sbGVycy5wb3N0Jyk7IC8vIGluc3RhbmNlIG9mIEFw
cC5Qb3N0Q29udHJvbGxlcgotICAgICAgICByZXR1cm4gY3VycmVudFBvc3QuZ2V0KCd0aXRsZScp
OwotICAgICAgfS5wcm9wZXJ0eSgnY29udHJvbGxlcnMucG9zdC50aXRsZScpCi0gICAgfSk7Ci0g
ICAgYGBgCi0KLSAgICBAc2VlIHtFbWJlci5Db250cm9sbGVyTWl4aW4jbmVlZHN9Ci0gICAgQHBy
b3BlcnR5IHtPYmplY3R9IGNvbnRyb2xsZXJzCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBj
b250cm9sbGVyczogZGVmYXVsdENvbnRyb2xsZXJzQ29tcHV0ZWRQcm9wZXJ0eQotfSk7Ci0KLX0p
KCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0v
KioKLUVtYmVyIEFwcGxpY2F0aW9uCi0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXIt
YXBwbGljYXRpb24KLUByZXF1aXJlcyBlbWJlci12aWV3cywgZW1iZXItcm91dGluZwotKi8KLQot
fSkoKTsKLQotKGZ1bmN0aW9uKCkgewotLyoqCi1AbW9kdWxlIGVtYmVyCi1Ac3VibW9kdWxlIGVt
YmVyLWV4dGVuc2lvbi1zdXBwb3J0Ci0qLwotLyoqCi0gIFRoZSBgRGF0YUFkYXB0ZXJgIGhlbHBz
IGEgZGF0YSBwZXJzaXN0ZW5jZSBsaWJyYXJ5Ci0gIGludGVyZmFjZSB3aXRoIHRvb2xzIHRoYXQg
ZGVidWcgRW1iZXIgc3VjaAotICBhcyB0aGUgW0VtYmVyIEV4dGVuc2lvbl0oaHR0cHM6Ly9naXRo
dWIuY29tL3RpbGRlaW8vZW1iZXItZXh0ZW5zaW9uKQotICBmb3IgQ2hyb21lIGFuZCBGaXJlZm94
LgotCi0gIFRoaXMgY2xhc3Mgd2lsbCBiZSBleHRlbmRlZCBieSBhIHBlcnNpc3RlbmNlIGxpYnJh
cnkKLSAgd2hpY2ggd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzIHdpdGgKLSAgbGli
cmFyeS1zcGVjaWZpYyBjb2RlLgotCi0gIFRoZSBtZXRob2RzIGxpa2VseSB0byBiZSBvdmVycmlk
ZGVuIGFyZToKLQotICAqIGBnZXRGaWx0ZXJzYAotICAqIGBkZXRlY3RgCi0gICogYGNvbHVtbnNG
b3JUeXBlYAotICAqIGBnZXRSZWNvcmRzYAotICAqIGBnZXRSZWNvcmRDb2x1bW5WYWx1ZXNgCi0g
ICogYGdldFJlY29yZEtleXdvcmRzYAotICAqIGBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXNgCi0gICog
YGdldFJlY29yZENvbG9yYAotICAqIGBvYnNlcnZlUmVjb3JkYAotCi0gIFRoZSBhZGFwdGVyIHdp
bGwgbmVlZCB0byBiZSByZWdpc3RlcmVkCi0gIGluIHRoZSBhcHBsaWNhdGlvbidzIGNvbnRhaW5l
ciBhcyBgZGF0YUFkYXB0ZXI6bWFpbmAKLQotICBFeGFtcGxlOgotCi0gIGBgYGphdmFzY3JpcHQK
LSAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewotICAgIG5hbWU6ICJkYXRhQWRhcHRlciIsCi0K
LSAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9uKSB7Ci0gICAg
ICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YUFkYXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVy
KTsKLSAgICB9Ci0gIH0pOwotICBgYGAKLQotICBAY2xhc3MgRGF0YUFkYXB0ZXIKLSAgQG5hbWVz
cGFjZSBFbWJlcgotICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKLSovCi1FbWJlci5EYXRhQWRhcHRl
ciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewotICBpbml0OiBmdW5jdGlvbigpIHsKLSAgICB0aGlz
Ll9zdXBlcigpOwotICAgIHRoaXMucmVsZWFzZU1ldGhvZHMgPSBFbWJlci5BKCk7Ci0gIH0sCi0K
LSAgLyoqCi0gICAgVGhlIGNvbnRhaW5lciBvZiB0aGUgYXBwbGljYXRpb24gYmVpbmcgZGVidWdn
ZWQuCi0gICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGluamVjdGVkCi0gICAgb24gY3JlYXRpb24u
Ci0KLSAgICBAcHJvcGVydHkgY29udGFpbmVyCi0gICAgQGRlZmF1bHQgbnVsbAotICAqLwotICBj
b250YWluZXI6IG51bGwsCi0KLSAgLyoqCi0gICAgTnVtYmVyIG9mIGF0dHJpYnV0ZXMgdG8gc2Vu
ZAotICAgIGFzIGNvbHVtbnMuIChFbm91Z2ggdG8gbWFrZSB0aGUgcmVjb3JkCi0gICAgaWRlbnRp
ZmlhYmxlKS4KLQotICAgIEBwcml2YXRlCi0gICAgQHByb3BlcnR5IGF0dHJpYnV0ZUxpbWl0Ci0g
ICAgQGRlZmF1bHQgMwotICAqLwotICBhdHRyaWJ1dGVMaW1pdDogMywKLQotICAvKioKLSAgICBT
dG9yZXMgYWxsIG1ldGhvZHMgdGhhdCBjbGVhciBvYnNlcnZlcnMuCi0gICAgVGhlc2UgbWV0aG9k
cyB3aWxsIGJlIGNhbGxlZCBvbiBkZXN0cnVjdGlvbi4KLQotICAgIEBwcml2YXRlCi0gICAgQHBy
b3BlcnR5IHJlbGVhc2VNZXRob2RzCi0gICovCi0gIHJlbGVhc2VNZXRob2RzOiBFbWJlci5BKCks
Ci0KLSAgLyoqCi0gICAgU3BlY2lmaWVzIGhvdyByZWNvcmRzIGNhbiBiZSBmaWx0ZXJlZC4KLSAg
ICBSZWNvcmRzIHJldHVybmVkIHdpbGwgbmVlZCB0byBoYXZlIGEgYGZpbHRlclZhbHVlc2AKLSAg
ICBwcm9wZXJ0eSB3aXRoIGEga2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBhcnJh
eS4KLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIGdldEZpbHRlcnMKLSAgICBAcmV0dXJuIHtB
cnJheX0gTGlzdCBvZiBvYmplY3RzIGRlZmluaW5nIGZpbHRlcnMuCi0gICAgIFRoZSBvYmplY3Qg
c2hvdWxkIGhhdmUgYSBgbmFtZWAgYW5kIGBkZXNjYCBwcm9wZXJ0eS4KLSAgKi8KLSAgZ2V0Rmls
dGVyczogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSwKLQotICAvKioK
LSAgICBGZXRjaCB0aGUgbW9kZWwgdHlwZXMgYW5kIG9ic2VydmUgdGhlbSBmb3IgY2hhbmdlcy4K
LQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIHdhdGNoTW9kZWxUeXBlcwotCi0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gdHlwZXNBZGRlZCBDYWxsYmFjayB0byBjYWxsIHRvIGFkZCB0eXBlcy4KLSAg
ICBUYWtlcyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgd3JhcHBlZCB0eXBlcyAocmV0
dXJuZWQgZnJvbSBgd3JhcE1vZGVsVHlwZWApLgotCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gdHlw
ZXNVcGRhdGVkIENhbGxiYWNrIHRvIGNhbGwgd2hlbiBhIHR5cGUgaGFzIGNoYW5nZWQuCi0gICAg
VGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBwZWQgdHlwZXMuCi0KLSAg
ICBAcmV0dXJuIHtGdW5jdGlvbn0gTWV0aG9kIHRvIGNhbGwgdG8gcmVtb3ZlIGFsbCBvYnNlcnZl
cnMKLSAgKi8KLSAgd2F0Y2hNb2RlbFR5cGVzOiBmdW5jdGlvbih0eXBlc0FkZGVkLCB0eXBlc1Vw
ZGF0ZWQpIHsKLSAgICB2YXIgbW9kZWxUeXBlcyA9IHRoaXMuZ2V0TW9kZWxUeXBlcygpLAotICAg
ICAgICBzZWxmID0gdGhpcywgdHlwZXNUb1NlbmQsIHJlbGVhc2VNZXRob2RzID0gRW1iZXIuQSgp
OwotCi0gICAgdHlwZXNUb1NlbmQgPSBtb2RlbFR5cGVzLm1hcChmdW5jdGlvbih0eXBlKSB7Ci0g
ICAgICB2YXIgd3JhcHBlZCA9IHNlbGYud3JhcE1vZGVsVHlwZSh0eXBlKTsKLSAgICAgIHJlbGVh
c2VNZXRob2RzLnB1c2goc2VsZi5vYnNlcnZlTW9kZWxUeXBlKHR5cGUsIHR5cGVzVXBkYXRlZCkp
OwotICAgICAgcmV0dXJuIHdyYXBwZWQ7Ci0gICAgfSk7Ci0KLSAgICB0eXBlc0FkZGVkKHR5cGVz
VG9TZW5kKTsKLQotICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24oKSB7Ci0gICAgICByZWxlYXNl
TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7IGZuKCk7IH0pOwotICAgICAgc2VsZi5yZWxl
YXNlTWV0aG9kcy5yZW1vdmVPYmplY3QocmVsZWFzZSk7Ci0gICAgfTsKLSAgICB0aGlzLnJlbGVh
c2VNZXRob2RzLnB1c2hPYmplY3QocmVsZWFzZSk7Ci0gICAgcmV0dXJuIHJlbGVhc2U7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgRmV0Y2ggdGhlIHJlY29yZHMgb2YgYSBnaXZlbiB0eXBlIGFuZCBvYnNl
cnZlIHRoZW0gZm9yIGNoYW5nZXMuCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCB3YXRjaFJl
Y29yZHMKLQotICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlY29yZHNBZGRlZCBDYWxsYmFjayB0byBj
YWxsIHRvIGFkZCByZWNvcmRzLgotICAgIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFp
bmluZyB3cmFwcGVkIHJlY29yZHMuCi0gICAgVGhlIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9s
bG93aW5nIHByb3BlcnRpZXM6Ci0gICAgICBjb2x1bW5WYWx1ZXM6IHtPYmplY3R9IGtleSBhbmQg
dmFsdWUgb2YgYSB0YWJsZSBjZWxsCi0gICAgICBvYmplY3Q6IHtPYmplY3R9IHRoZSBhY3R1YWwg
cmVjb3JkIG9iamVjdAotCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVjb3Jkc1VwZGF0ZWQgQ2Fs
bGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhhcyBjaGFuZ2VkLgotICAgIFRha2VzIGFuIGFy
cmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB3cmFwcGVkIHJlY29yZHMuCi0KLSAgICBAcGFyYW0g
e0Z1bmN0aW9ufSByZWNvcmRzUmVtb3ZlZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gYSByZWNvcmQg
aGFzIHJlbW92ZWQuCi0gICAgVGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgotICAgICAg
aW5kZXg6IHRoZSBhcnJheSBpbmRleCB3aGVyZSB0aGUgcmVjb3JkcyB3ZXJlIHJlbW92ZWQKLSAg
ICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVtb3ZlZAotCi0gICAgQHJldHVybiB7
RnVuY3Rpb259IE1ldGhvZCB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzCi0gICovCi0g
IHdhdGNoUmVjb3JkczogZnVuY3Rpb24odHlwZSwgcmVjb3Jkc0FkZGVkLCByZWNvcmRzVXBkYXRl
ZCwgcmVjb3Jkc1JlbW92ZWQpIHsKLSAgICB2YXIgc2VsZiA9IHRoaXMsIHJlbGVhc2VNZXRob2Rz
ID0gRW1iZXIuQSgpLCByZWNvcmRzID0gdGhpcy5nZXRSZWNvcmRzKHR5cGUpLCByZWxlYXNlOwot
Ci0gICAgdmFyIHJlY29yZFVwZGF0ZWQgPSBmdW5jdGlvbih1cGRhdGVkUmVjb3JkKSB7Ci0gICAg
ICByZWNvcmRzVXBkYXRlZChbdXBkYXRlZFJlY29yZF0pOwotICAgIH07Ci0KLSAgICB2YXIgcmVj
b3Jkc1RvU2VuZCA9IHJlY29yZHMubWFwKGZ1bmN0aW9uKHJlY29yZCkgewotICAgICAgcmVsZWFz
ZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVkKSk7
Ci0gICAgICByZXR1cm4gc2VsZi53cmFwUmVjb3JkKHJlY29yZCk7Ci0gICAgfSk7Ci0KLQotICAg
IHZhciBjb250ZW50RGlkQ2hhbmdlID0gZnVuY3Rpb24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50
LCBhZGRlZENvdW50KSB7Ci0gICAgICBmb3IgKHZhciBpID0gaWR4OyBpIDwgaWR4ICsgYWRkZWRD
b3VudDsgaSsrKSB7Ci0gICAgICAgIHZhciByZWNvcmQgPSBhcnJheS5vYmplY3RBdChpKTsKLSAg
ICAgICAgdmFyIHdyYXBwZWQgPSBzZWxmLndyYXBSZWNvcmQocmVjb3JkKTsKLSAgICAgICAgcmVs
ZWFzZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVk
KSk7Ci0gICAgICAgIHJlY29yZHNBZGRlZChbd3JhcHBlZF0pOwotICAgICAgfQotCi0gICAgICBp
ZiAocmVtb3ZlZENvdW50KSB7Ci0gICAgICAgIHJlY29yZHNSZW1vdmVkKGlkeCwgcmVtb3ZlZENv
dW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgdmFyIG9ic2VydmVyID0geyBkaWRDaGFuZ2U6
IGNvbnRlbnREaWRDaGFuZ2UsIHdpbGxDaGFuZ2U6IEVtYmVyLksgfTsKLSAgICByZWNvcmRzLmFk
ZEFycmF5T2JzZXJ2ZXIoc2VsZiwgb2JzZXJ2ZXIpOwotCi0gICAgcmVsZWFzZSA9IGZ1bmN0aW9u
KCkgewotICAgICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihmbikgeyBmbigpOyB9
KTsKLSAgICAgIHJlY29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxmLCBvYnNlcnZlcik7Ci0g
ICAgICBzZWxmLnJlbGVhc2VNZXRob2RzLnJlbW92ZU9iamVjdChyZWxlYXNlKTsKLSAgICB9Owot
Ci0gICAgcmVjb3Jkc0FkZGVkKHJlY29yZHNUb1NlbmQpOwotCi0gICAgdGhpcy5yZWxlYXNlTWV0
aG9kcy5wdXNoT2JqZWN0KHJlbGVhc2UpOwotICAgIHJldHVybiByZWxlYXNlOwotICB9LAotCi0g
IC8qKgotICAgIENsZWFyIGFsbCBvYnNlcnZlcnMgYmVmb3JlIGRlc3RydWN0aW9uCi0gICAgQHBy
aXZhdGUKLSAgKi8KLSAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewotICAgIHRoaXMuX3N1cGVy
KCk7Ci0gICAgdGhpcy5yZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7Ci0gICAg
ICBmbigpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgIERldGVjdCB3aGV0aGVyIGEgY2xh
c3MgaXMgYSBtb2RlbC4KLQotICAgIFRlc3QgdGhhdCBhZ2FpbnN0IHRoZSBtb2RlbCBjbGFzcwot
ICAgIG9mIHlvdXIgcGVyc2lzdGVuY2UgbGlicmFyeQotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0
aG9kIGRldGVjdAotICAgIEBwYXJhbSB7Q2xhc3N9IGtsYXNzIFRoZSBjbGFzcyB0byB0ZXN0Ci0g
ICAgQHJldHVybiBib29sZWFuIFdoZXRoZXIgdGhlIGNsYXNzIGlzIGEgbW9kZWwgY2xhc3Mgb3Ig
bm90Ci0gICovCi0gIGRldGVjdDogZnVuY3Rpb24oa2xhc3MpIHsKLSAgICByZXR1cm4gZmFsc2U7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0IHRoZSBjb2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5
cGUuCi0KLSAgICBAcHJpdmF0ZQotICAgIEBtZXRob2QgY29sdW1uc0ZvclR5cGUKLSAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBlCi0gICAgQHJldHVybiB7QXJyYXl9IEFuIGFy
cmF5IG9mIGNvbHVtbnMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICAgIG5hbWU6IHtTdHJp
bmd9IG5hbWUgb2YgdGhlIGNvbHVtbgotICAgICBkZXNjOiB7U3RyaW5nfSBIdW1hbml6ZWQgZGVz
Y3JpcHRpb24gKHdoYXQgd291bGQgc2hvdyBpbiBhIHRhYmxlIGNvbHVtbiBuYW1lKQotICAqLwot
ICBjb2x1bW5zRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewotICAgIHJldHVybiBFbWJlci5BKCk7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgQWRkcyBvYnNlcnZlcnMgdG8gYSBtb2RlbCB0eXBlIGNsYXNz
LgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIG9ic2VydmVNb2RlbFR5cGUKLSAgICBAcGFy
YW0ge0NsYXNzfSB0eXBlIFRoZSBtb2RlbCB0eXBlIGNsYXNzCi0gICAgQHBhcmFtIHtGdW5jdGlv
bn0gdHlwZXNVcGRhdGVkIENhbGxlZCB3aGVuIGEgdHlwZSBpcyBtb2RpZmllZC4KLSAgICBAcmV0
dXJuIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcmVtb3ZlIG9ic2VydmVycwot
ICAqLwotCi0gIG9ic2VydmVNb2RlbFR5cGU6IGZ1bmN0aW9uKHR5cGUsIHR5cGVzVXBkYXRlZCkg
ewotICAgIHZhciBzZWxmID0gdGhpcywgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKTsK
LQotICAgIHZhciBvbkNoYW5nZSA9IGZ1bmN0aW9uKCkgewotICAgICAgdHlwZXNVcGRhdGVkKFtz
ZWxmLndyYXBNb2RlbFR5cGUodHlwZSldKTsKLSAgICB9OwotICAgIHZhciBvYnNlcnZlciA9IHsK
LSAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIEVtYmVyLnJ1bi5zY2hlZHVs
ZU9uY2UoJ2FjdGlvbnMnLCB0aGlzLCBvbkNoYW5nZSk7Ci0gICAgICB9LAotICAgICAgd2lsbENo
YW5nZTogRW1iZXIuSwotICAgIH07Ci0KLSAgICByZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIodGhp
cywgb2JzZXJ2ZXIpOwotCi0gICAgdmFyIHJlbGVhc2UgPSBmdW5jdGlvbigpIHsKLSAgICAgIHJl
Y29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxmLCBvYnNlcnZlcik7Ci0gICAgfTsKLQotICAg
IHJldHVybiByZWxlYXNlOwotICB9LAotCi0KLSAgLyoqCi0gICAgV3JhcHMgYSBnaXZlbiBtb2Rl
bCB0eXBlIGFuZCBvYnNlcnZlcyBjaGFuZ2VzIHRvIGl0LgotCi0gICAgQHByaXZhdGUKLSAgICBA
bWV0aG9kIHdyYXBNb2RlbFR5cGUKLSAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIEEgbW9kZWwgY2xh
c3MKLSAgICBAcGFyYW0ge0Z1bmN0aW9ufSB0eXBlc1VwZGF0ZWQgY2FsbGJhY2sgdG8gY2FsbCB3
aGVuIHRoZSB0eXBlIGNoYW5nZXMKLSAgICBAcmV0dXJuIHtPYmplY3R9IGNvbnRhaW5zIHRoZSB3
cmFwcGVkIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiB0byByZW1vdmUgb2JzZXJ2ZXJzCi0gICAgRm9y
bWF0OgotICAgICAgdHlwZToge09iamVjdH0gdGhlIHdyYXBwZWQgdHlwZQotICAgICAgICBUaGUg
d3JhcHBlZCB0eXBlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAgICAgICAgICBuYW1lOiB7
U3RyaW5nfSBuYW1lIG9mIHRoZSB0eXBlCi0gICAgICAgICAgY291bnQ6IHtJbnRlZ2VyfSBudW1i
ZXIgb2YgcmVjb3JkcyBhdmFpbGFibGUKLSAgICAgICAgICBjb2x1bW5zOiB7Q29sdW1uc30gYXJy
YXkgb2YgY29sdW1ucyB0byBkZXNjcmliZSB0aGUgcmVjb3JkCi0gICAgICAgICAgb2JqZWN0OiB7
Q2xhc3N9IHRoZSBhY3R1YWwgTW9kZWwgdHlwZSBjbGFzcwotICAgICAgcmVsZWFzZToge0Z1bmN0
aW9ufSBUaGUgZnVuY3Rpb24gdG8gcmVtb3ZlIG9ic2VydmVycwotICAqLwotICB3cmFwTW9kZWxU
eXBlOiBmdW5jdGlvbih0eXBlLCB0eXBlc1VwZGF0ZWQpIHsKLSAgICB2YXIgcmVsZWFzZSwgcmVj
b3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKSwKLSAgICAgICAgdHlwZVRvU2VuZCwgc2VsZiA9
IHRoaXM7Ci0KLSAgICB0eXBlVG9TZW5kID0gewotICAgICAgbmFtZTogdHlwZS50b1N0cmluZygp
LAotICAgICAgY291bnQ6IEVtYmVyLmdldChyZWNvcmRzLCAnbGVuZ3RoJyksCi0gICAgICBjb2x1
bW5zOiB0aGlzLmNvbHVtbnNGb3JUeXBlKHR5cGUpLAotICAgICAgb2JqZWN0OiB0eXBlCi0gICAg
fTsKLQotCi0gICAgcmV0dXJuIHR5cGVUb1NlbmQ7Ci0gIH0sCi0KLQotICAvKioKLSAgICBGZXRj
aGVzIGFsbCBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24uCi0KLSAgICBAcHJpdmF0
ZQotICAgIEBtZXRob2QgZ2V0TW9kZWxUeXBlcwotICAgIEByZXR1cm4ge0FycmF5fSBBcnJheSBv
ZiBtb2RlbCB0eXBlcwotICAqLwotCi0gLy8gVE9ETzogVXNlIHRoZSByZXNvbHZlciBpbnN0ZWFk
IG9mIGxvb3Bpbmcgb3ZlciBuYW1lc3BhY2VzLgotICBnZXRNb2RlbFR5cGVzOiBmdW5jdGlvbigp
IHsKLSAgICB2YXIgbmFtZXNwYWNlcyA9IEVtYmVyLkEoRW1iZXIuTmFtZXNwYWNlLk5BTUVTUEFD
RVMpLCB0eXBlcyA9IEVtYmVyLkEoKSwgc2VsZiA9IHRoaXM7Ci0KLSAgICBuYW1lc3BhY2VzLmZv
ckVhY2goZnVuY3Rpb24obmFtZXNwYWNlKSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZXNw
YWNlKSB7Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmhhc093blByb3BlcnR5KGtleSkpIHsgY29u
dGludWU7IH0KLSAgICAgICAgdmFyIGtsYXNzID0gbmFtZXNwYWNlW2tleV07Ci0gICAgICAgIGlm
IChzZWxmLmRldGVjdChrbGFzcykpIHsKLSAgICAgICAgICB0eXBlcy5wdXNoKGtsYXNzKTsKLSAg
ICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiB0eXBlczsKLSAgfSwKLQotICAv
KioKLSAgICBGZXRjaGVzIGFsbCBsb2FkZWQgcmVjb3JkcyBmb3IgYSBnaXZlbiB0eXBlLgotCi0g
ICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIGdldFJlY29yZHMKLSAgICBAcmV0dXJuIHtBcnJheX0g
QW4gYXJyYXkgb2YgcmVjb3Jkcy4KLSAgICAgVGhpcyBhcnJheSB3aWxsIGJlIG9ic2VydmVkIGZv
ciBjaGFuZ2VzLAotICAgICBzbyBpdCBzaG91bGQgdXBkYXRlIHdoZW4gbmV3IHJlY29yZHMgYXJl
IGFkZGVkL3JlbW92ZWQuCi0gICovCi0gIGdldFJlY29yZHM6IGZ1bmN0aW9uKHR5cGUpIHsKLSAg
ICByZXR1cm4gRW1iZXIuQSgpOwotICB9LAotCi0gIC8qKgotICAgIFdyYXBzIGEgcmVjb3JkIGFu
ZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KLQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCB3
cmFwUmVjb3JkCi0gICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNl
LgotICAgIEByZXR1cm4ge09iamVjdH0gVGhlIHdyYXBwZWQgcmVjb3JkLiBGb3JtYXQ6Ci0gICAg
Y29sdW1uVmFsdWVzOiB7QXJyYXl9Ci0gICAgc2VhcmNoS2V5d29yZHM6IHtBcnJheX0KLSAgKi8K
LSAgd3JhcFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgdmFyIHJlY29yZFRvU2VuZCA9
IHsgb2JqZWN0OiByZWNvcmQgfSwgY29sdW1uVmFsdWVzID0ge30sIHNlbGYgPSB0aGlzOwotCi0g
ICAgcmVjb3JkVG9TZW5kLmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVz
KHJlY29yZCk7Ci0gICAgcmVjb3JkVG9TZW5kLnNlYXJjaEtleXdvcmRzID0gdGhpcy5nZXRSZWNv
cmRLZXl3b3JkcyhyZWNvcmQpOwotICAgIHJlY29yZFRvU2VuZC5maWx0ZXJWYWx1ZXMgPSB0aGlz
LmdldFJlY29yZEZpbHRlclZhbHVlcyhyZWNvcmQpOwotICAgIHJlY29yZFRvU2VuZC5jb2xvciA9
IHRoaXMuZ2V0UmVjb3JkQ29sb3IocmVjb3JkKTsKLQotICAgIHJldHVybiByZWNvcmRUb1NlbmQ7
Ci0gIH0sCi0KLSAgLyoqCi0gICAgR2V0cyB0aGUgdmFsdWVzIGZvciBlYWNoIGNvbHVtbi4KLQot
ICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRDb2x1bW5WYWx1ZXMKLSAgICBAcmV0
dXJuIHtPYmplY3R9IEtleXMgc2hvdWxkIG1hdGNoIGNvbHVtbiBuYW1lcyBkZWZpbmVkCi0gICAg
YnkgdGhlIG1vZGVsIHR5cGUuCi0gICovCi0gIGdldFJlY29yZENvbHVtblZhbHVlczogZnVuY3Rp
b24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIHt9OwotICB9LAotCi0gIC8qKgotICAgIFJldHVybnMg
a2V5d29yZHMgdG8gbWF0Y2ggd2hlbiBzZWFyY2hpbmcgcmVjb3Jkcy4KLQotICAgIEBwcml2YXRl
Ci0gICAgQG1ldGhvZCBnZXRSZWNvcmRLZXl3b3JkcwotICAgIEByZXR1cm4ge0FycmF5fSBSZWxl
dmFudCBrZXl3b3JkcyBmb3Igc2VhcmNoLgotICAqLwotICBnZXRSZWNvcmRLZXl3b3JkczogZnVu
Y3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIEVtYmVyLkEoKTsKLSAgfSwKLQotICAvKioKLSAg
ICBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgZmlsdGVycyBkZWZpbmVkIGJ5IGBnZXRGaWx0ZXJzYC4K
LQotICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRGaWx0ZXJWYWx1ZXMKLSAgICBA
cGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5zdGFuY2UKLSAgICBAcmV0dXJuIHtP
YmplY3R9IFRoZSBmaWx0ZXIgdmFsdWVzCi0gICovCi0gIGdldFJlY29yZEZpbHRlclZhbHVlczog
ZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAgcmV0dXJuIHt9OwotICB9LAotCi0gIC8qKgotICAgIEVh
Y2ggcmVjb3JkIGNhbiBoYXZlIGEgY29sb3IgdGhhdCByZXByZXNlbnRzIGl0cyBzdGF0ZS4KLQot
ICAgIEBwcml2YXRlCi0gICAgQG1ldGhvZCBnZXRSZWNvcmRDb2xvcgotICAgIEBwYXJhbSB7T2Jq
ZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZQotICAgIEByZXR1cm4ge1N0cmluZ30gVGhl
IHJlY29yZCdzIGNvbG9yCi0gICAgICBQb3NzaWJsZSBvcHRpb25zOiBibGFjaywgcmVkLCBibHVl
LCBncmVlbgotICAqLwotICBnZXRSZWNvcmRDb2xvcjogZnVuY3Rpb24ocmVjb3JkKSB7Ci0gICAg
cmV0dXJuIG51bGw7Ci0gIH0sCi0KLSAgLyoqCi0gICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50IHBy
b3BlcnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFwcGVkIHJlY29yZAotICAgIHdoZW4gYSBjaGFu
Z2Ugb2NjdXJzLgotCi0gICAgQHByaXZhdGUKLSAgICBAbWV0aG9kIG9ic2VydmVyUmVjb3JkCi0g
ICAgQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgcmVjb3JkIGluc3RhbmNlCi0gICAgQHBhcmFt
IHtGdW5jdGlvbn0gcmVjb3JkVXBkYXRlZCBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVj
b3JkIGlzIHVwZGF0ZWQuCi0gICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBj
YWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzLgotICAqLwotICBvYnNlcnZlUmVjb3JkOiBmdW5j
dGlvbihyZWNvcmQsIHJlY29yZFVwZGF0ZWQpIHsKLSAgICByZXR1cm4gZnVuY3Rpb24oKXt9Owot
ICB9Ci0KLX0pOwotCi0KLX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLUVtYmVyIEV4
dGVuc2lvbiBTdXBwb3J0Ci0KLUBtb2R1bGUgZW1iZXIKLUBzdWJtb2R1bGUgZW1iZXItZXh0ZW5z
aW9uLXN1cHBvcnQKLUByZXF1aXJlcyBlbWJlci1hcHBsaWNhdGlvbgotKi8KLQotfSkoKTsKLQot
KGZ1bmN0aW9uKCkgewotLyoqCi0gIEBtb2R1bGUgZW1iZXIKLSAgQHN1Ym1vZHVsZSBlbWJlci10
ZXN0aW5nCi0gKi8KLXZhciBzbGljZSA9IFtdLnNsaWNlLAotICAgIGhlbHBlcnMgPSB7fSwKLSAg
ICBpbmplY3RIZWxwZXJzQ2FsbGJhY2tzID0gW107Ci0KLS8qKgotICBUaGlzIGlzIGEgY29udGFp
bmVyIGZvciBhbiBhc3NvcnRtZW50IG9mIHRlc3RpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5Ogot
Ci0gICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0ZXN0IGFkYXB0ZXIgKGZvciB5b3VyIGZyYW1ld29y
ayBvZiBjaG9pY2UpLgotICAqIFJlZ2lzdGVyL1VucmVnaXN0ZXIgYWRkaXRpb25hbCB0ZXN0IGhl
bHBlcnMuCi0gICogU2V0dXAgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW4gdGhlIHRlc3QgaGVs
cGVycyBhcmUgaW5qZWN0ZWQgaW50bwotICAgIHlvdXIgYXBwbGljYXRpb24uCi0KLSAgQGNsYXNz
IFRlc3QKLSAgQG5hbWVzcGFjZSBFbWJlcgotKi8KLUVtYmVyLlRlc3QgPSB7Ci0KLSAgLyoqCi0g
ICAgYHJlZ2lzdGVySGVscGVyYCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgdGVzdCBoZWxwZXIgdGhh
dCB3aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBgQXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBj
YWxsZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0
aCB0aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwotICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0K
LSAgICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5UZXN0LnJl
Z2lzdGVySGVscGVyKCdib290JywgZnVuY3Rpb24oYXBwKSB7Ci0gICAgICBFbWJlci5ydW4oYXBw
LCBhcHAuYWR2YW5jZVJlYWRpbmVzcyk7Ci0gICAgfSk7Ci0gICAgYGBgCi0KLSAgICBUaGlzIGhl
bHBlciBjYW4gbGF0ZXIgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIGJlY2F1c2UgaXQgd2ls
bCBiZQotICAgIGNhbGxlZCB3aXRoIGBhcHBgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAg
ICBgYGBqYXZhc2NyaXB0Ci0gICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKCk7Ci0g
ICAgQXBwLmluamVjdFRlc3RIZWxwZXJzKCk7Ci0gICAgYm9vdCgpOwotICAgIGBgYAotCi0gICAg
QHB1YmxpYwotICAgIEBtZXRob2QgcmVnaXN0ZXJIZWxwZXIKLSAgICBAcGFyYW0ge1N0cmluZ30g
bmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1ldGhvZCB0byBhZGQuCi0gICAgQHBhcmFtIHtG
dW5jdGlvbn0gaGVscGVyTWV0aG9kCi0gICAgQHBhcmFtIG9wdGlvbnMge09iamVjdH0KLSAgKi8K
LSAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGhlbHBlck1ldGhvZCkgewotICAgIGhl
bHBlcnNbbmFtZV0gPSB7Ci0gICAgICBtZXRob2Q6IGhlbHBlck1ldGhvZCwKLSAgICAgIG1ldGE6
IHsgd2FpdDogZmFsc2UgfQotICAgIH07Ci0gIH0sCi0KLSAgLyoqCi0gICAgYHJlZ2lzdGVyQXN5
bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW4gYXN5bmMgdGVzdCBoZWxwZXIgdGhhdCB3
aWxsIGJlIGluamVjdGVkCi0gICAgd2hlbiBgQXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxs
ZWQuCi0KLSAgICBUaGUgaGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0
aGUgY3VycmVudCBBcHBsaWNhdGlvbiBhcwotICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0KLSAg
ICBGb3IgZXhhbXBsZToKLQotICAgIGBgYGphdmFzY3JpcHQKLSAgICBFbWJlci5UZXN0LnJlZ2lz
dGVyQXN5bmNIZWxwZXIoJ2Jvb3QnLCBmdW5jdGlvbihhcHApIHsKLSAgICAgIEVtYmVyLnJ1bihh
cHAsIGFwcC5hZHZhbmNlUmVhZGluZXNzKTsKLSAgICB9KTsKLSAgICBgYGAKLQotICAgIFRoZSBh
ZHZhbnRhZ2Ugb2YgYW4gYXN5bmMgaGVscGVyIGlzIHRoYXQgaXQgd2lsbCBub3QgcnVuCi0gICAg
dW50aWwgdGhlIGxhc3QgYXN5bmMgaGVscGVyIGhhcyBjb21wbGV0ZWQuICBBbGwgYXN5bmMgaGVs
cGVycwotICAgIGFmdGVyIGl0IHdpbGwgd2FpdCBmb3IgaXQgY29tcGxldGUgYmVmb3JlIHJ1bm5p
bmcuCi0KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEVtYmVy
LlRlc3QucmVnaXN0ZXJBc3luY0hlbHBlcignZGVsZXRlUG9zdCcsIGZ1bmN0aW9uKGFwcCwgcG9z
dElkKSB7Ci0gICAgICBjbGljaygnLmRlbGV0ZS0nICsgcG9zdElkKTsKLSAgICB9KTsKLQotICAg
IC8vIC4uLiBpbiB5b3VyIHRlc3QKLSAgICB2aXNpdCgnL3Bvc3QvMicpOwotICAgIGRlbGV0ZVBv
c3QoMik7Ci0gICAgdmlzaXQoJy9wb3N0LzMnKTsKLSAgICBkZWxldGVQb3N0KDMpOwotICAgIGBg
YAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2QgcmVnaXN0ZXJBc3luY0hlbHBlcgotICAgIEBw
YXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgbWV0aG9kIHRvIGFkZC4K
LSAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKLSAgKi8KLSAgcmVnaXN0ZXJBc3lu
Y0hlbHBlcjogZnVuY3Rpb24obmFtZSwgaGVscGVyTWV0aG9kKSB7Ci0gICAgaGVscGVyc1tuYW1l
XSA9IHsKLSAgICAgIG1ldGhvZDogaGVscGVyTWV0aG9kLAotICAgICAgbWV0YTogeyB3YWl0OiB0
cnVlIH0KLSAgICB9OwotICB9LAotCi0gIC8qKgotICAgIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRk
ZWQgaGVscGVyIG1ldGhvZC4KLQotICAgIEV4YW1wbGU6Ci0KLSAgICBgYGAKLSAgICBFbWJlci5U
ZXN0LnVucmVnaXN0ZXJIZWxwZXIoJ3dhaXQnKTsKLSAgICBgYGAKLQotICAgIEBwdWJsaWMKLSAg
ICBAbWV0aG9kIHVucmVnaXN0ZXJIZWxwZXIKLSAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUg
aGVscGVyIHRvIHJlbW92ZS4KLSAgKi8KLSAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFt
ZSkgewotICAgIGRlbGV0ZSBoZWxwZXJzW25hbWVdOwotICAgIGRlbGV0ZSBFbWJlci5UZXN0LlBy
b21pc2UucHJvdG90eXBlW25hbWVdOwotICB9LAotCi0gIC8qKgotICAgIFVzZWQgdG8gcmVnaXN0
ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW5ldmVyIGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNg
Ci0gICAgaXMgY2FsbGVkLgotCi0gICAgVGhlIGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3Vy
cmVudCBhcHBsaWNhdGlvbiBhcyBhbiBhcmd1bWVudC4KLQotICAgIEV4YW1wbGU6Ci0gICAgYGBg
Ci0gICAgRW1iZXIuVGVzdC5vbkluamVjdEhlbHBlcnMoZnVuY3Rpb24oKSB7Ci0gICAgICBFbWJl
ci4kKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rpb24oKSB7Ci0gICAgICAgIFRlc3QucGVuZGlu
Z0FqYXhSZXF1ZXN0cysrOwotICAgICAgfSk7Ci0KLSAgICAgIEVtYmVyLiQoZG9jdW1lbnQpLmFq
YXhTdG9wKGZ1bmN0aW9uKCkgewotICAgICAgICBUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMtLTsK
LSAgICAgIH0pOwotICAgIH0pOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2Qg
b25JbmplY3RIZWxwZXJzCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0
aW9uIHRvIGJlIGNhbGxlZC4KLSAgKi8KLSAgb25JbmplY3RIZWxwZXJzOiBmdW5jdGlvbihjYWxs
YmFjaykgewotICAgIGluamVjdEhlbHBlcnNDYWxsYmFja3MucHVzaChjYWxsYmFjayk7Ci0gIH0s
Ci0KLSAgLyoqCi0gICAgVGhpcyByZXR1cm5zIGEgdGhlbmFibGUgdGFpbG9yZWQgZm9yIHRlc3Rp
bmcuICBJdCBjYXRjaGVzIGZhaWxlZAotICAgIGBvblN1Y2Nlc3NgIGNhbGxiYWNrcyBhbmQgaW52
b2tlcyB0aGUgYEVtYmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb25gCi0gICAgY2FsbGJhY2sgaW4g
dGhlIGxhc3QgY2hhaW5lZCB0aGVuLgotCi0gICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJldHVy
bmVkIGJ5IGFzeW5jIGhlbHBlcnMgc3VjaCBhcyBgd2FpdGAuCi0KLSAgICBAcHVibGljCi0gICAg
QG1ldGhvZCBwcm9taXNlCi0gICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXIgVGhlIGZ1bmN0
aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS4KLSAgKi8KLSAgcHJvbWlzZTogZnVuY3Rp
b24ocmVzb2x2ZXIpIHsKLSAgICByZXR1cm4gbmV3IEVtYmVyLlRlc3QuUHJvbWlzZShyZXNvbHZl
cik7Ci0gIH0sCi0KLSAgLyoqCi0gICBVc2VkIHRvIGFsbG93IGVtYmVyLXRlc3RpbmcgdG8gY29t
bXVuaWNhdGUgd2l0aCBhIHNwZWNpZmljIHRlc3RpbmcKLSAgIGZyYW1ld29yay4KLQotICAgWW91
IGNhbiBtYW51YWxseSBzZXQgaXQgYmVmb3JlIGNhbGxpbmcgYEFwcC5zZXR1cEZvclRlc3Rpbmco
KWAuCi0KLSAgIEV4YW1wbGU6Ci0KLSAgIGBgYAotICAgRW1iZXIuVGVzdC5hZGFwdGVyID0gTXlD
dXN0b21BZGFwdGVyLmNyZWF0ZSgpCi0gICBgYGAKLQotICAgSWYgeW91IGRvIG5vdCBzZXQgaXQs
IGVtYmVyLXRlc3Rpbmcgd2lsbCBkZWZhdWx0IHRvIGBFbWJlci5UZXN0LlFVbml0QWRhcHRlcmAu
Ci0KLSAgIEBwdWJsaWMKLSAgIEBwcm9wZXJ0eSBhZGFwdGVyCi0gICBAdHlwZSB7Q2xhc3N9IFRo
ZSBhZGFwdGVyIHRvIGJlIHVzZWQuCi0gICBAZGVmYXVsdCBFbWJlci5UZXN0LlFVbml0QWRhcHRl
cgotICAqLwotICBhZGFwdGVyOiBudWxsLAotCi0gIC8qKgotICAgIFJlcGxhY2VtZW50IGZvciBg
RW1iZXIuUlNWUC5yZXNvbHZlYAotICAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhpcyB1c2Vz
Ci0gICAgYW5kIGluc3RhbmNlIG9mIGBFbWJlci5UZXN0LlByb21pc2VgCi0KLSAgICBAcHVibGlj
Ci0gICAgQG1ldGhvZCByZXNvbHZlCi0gICAgQHBhcmFtIHtNaXhlZH0gVGhlIHZhbHVlIHRvIHJl
c29sdmUKLSAgKi8KLSAgcmVzb2x2ZTogZnVuY3Rpb24odmFsKSB7Ci0gICAgcmV0dXJuIEVtYmVy
LlRlc3QucHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7Ci0gICAgICByZXR1cm4gcmVzb2x2ZSh2
YWwpOwotICAgIH0pOwotICB9LAotCi0gIC8qKgotICAgICBUaGlzIGFsbG93cyBlbWJlci10ZXN0
aW5nIHRvIHBsYXkgbmljZWx5IHdpdGggb3RoZXIgYXN5bmNocm9ub3VzCi0gICAgIGV2ZW50cywg
c3VjaCBhcyBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIHdhaXRpbmcgZm9yIGEgQ1NTMwotICAgICB0
cmFuc2l0aW9uIG9yIGFuIEluZGV4REIgdHJhbnNhY3Rpb24uCi0KLSAgICAgRm9yIGV4YW1wbGU6
Ci0gICAgIGBgYGphdmFzY3JpcHQKLSAgICAgRW1iZXIuVGVzdC5yZWdpc3RlcldhaXRlcihmdW5j
dGlvbigpIHsKLSAgICAgcmV0dXJuIG15UGVuZGluZ1RyYW5zYWN0aW9ucygpID09IDA7Ci0gICAg
IH0pOwotICAgICBgYGAKLSAgICAgVGhlIGBjb250ZXh0YCBhcmd1bWVudCBhbGxvd3MgeW91IHRv
IG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYHRoaXNgCi0gICAgIHdpdGggd2hpY2ggeW91ciBjYWxs
YmFjayB3aWxsIGJlIGludm9rZWQuCi0KLSAgICAgRm9yIGV4YW1wbGU6Ci0gICAgIGBgYGphdmFz
Y3JpcHQKLSAgICAgRW1iZXIuVGVzdC5yZWdpc3RlcldhaXRlcihNeURCLCBNeURCLmhhc1BlbmRp
bmdUcmFuc2FjdGlvbnMpOwotICAgICBgYGAKLSAgICAgQHB1YmxpYwotICAgICBAbWV0aG9kIHJl
Z2lzdGVyV2FpdGVyCi0gICAgIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IChvcHRpb25hbCkKLSAg
ICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKLSAgKi8KLSAgcmVnaXN0ZXJXYWl0ZXI6IGZ1
bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09
IDEpIHsKLSAgICAgIGNhbGxiYWNrID0gY29udGV4dDsKLSAgICAgIGNvbnRleHQgPSBudWxsOwot
ICAgIH0KLSAgICBpZiAoIXRoaXMud2FpdGVycykgewotICAgICAgdGhpcy53YWl0ZXJzID0gRW1i
ZXIuQSgpOwotICAgIH0KLSAgICB0aGlzLndhaXRlcnMucHVzaChbY29udGV4dCwgY2FsbGJhY2td
KTsKLSAgfSwKLSAgLyoqCi0gICAgIGB1bnJlZ2lzdGVyV2FpdGVyYCBpcyB1c2VkIHRvIHVucmVn
aXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdhcwotICAgICByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVy
V2FpdGVyYC4KLQotICAgICBAcHVibGljCi0gICAgIEBtZXRob2QgdW5yZWdpc3RlcldhaXRlcgot
ICAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCAob3B0aW9uYWwpCi0gICAgIEBwYXJhbSB7RnVu
Y3Rpb259IGNhbGxiYWNrCi0gICovCi0gIHVucmVnaXN0ZXJXYWl0ZXI6IGZ1bmN0aW9uKGNvbnRl
eHQsIGNhbGxiYWNrKSB7Ci0gICAgdmFyIHBhaXI7Ci0gICAgaWYgKCF0aGlzLndhaXRlcnMpIHsg
cmV0dXJuOyB9Ci0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKLSAgICAgIGNhbGxi
YWNrID0gY29udGV4dDsKLSAgICAgIGNvbnRleHQgPSBudWxsOwotICAgIH0KLSAgICBwYWlyID0g
W2NvbnRleHQsIGNhbGxiYWNrXTsKLSAgICB0aGlzLndhaXRlcnMgPSBFbWJlci5BKHRoaXMud2Fp
dGVycy5maWx0ZXIoZnVuY3Rpb24oZWx0KSB7Ci0gICAgICByZXR1cm4gRW1iZXIuY29tcGFyZShl
bHQsIHBhaXIpIT09MDsKLSAgICB9KSk7Ci0gIH0KLX07Ci0KLWZ1bmN0aW9uIGhlbHBlcihhcHAs
IG5hbWUpIHsKLSAgdmFyIGZuID0gaGVscGVyc1tuYW1lXS5tZXRob2QsCi0gICAgICBtZXRhID0g
aGVscGVyc1tuYW1lXS5tZXRhOwotCi0gIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXJn
cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwKLSAgICAgICAgbGFzdFByb21pc2UgPSBFbWJlci5U
ZXN0Lmxhc3RQcm9taXNlOwotCi0gICAgYXJncy51bnNoaWZ0KGFwcCk7Ci0KLSAgICAvLyBzb21l
IGhlbHBlcnMgYXJlIG5vdCBhc3luYyBhbmQKLSAgICAvLyBuZWVkIHRvIHJldHVybiBhIHZhbHVl
IGltbWVkaWF0ZWx5LgotICAgIC8vIGV4YW1wbGU6IGBmaW5kYAotICAgIGlmICghbWV0YS53YWl0
KSB7Ci0gICAgICByZXR1cm4gZm4uYXBwbHkoYXBwLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBpZiAo
IWxhc3RQcm9taXNlKSB7Ci0gICAgICAvLyBJdCdzIHRoZSBmaXJzdCBhc3luYyBoZWxwZXIgaW4g
Y3VycmVudCBjb250ZXh0Ci0gICAgICBsYXN0UHJvbWlzZSA9IGZuLmFwcGx5KGFwcCwgYXJncyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHdhaXQgZm9yIGxhc3QgaGVscGVyJ3MgcHJvbWlzZSB0
byByZXNvbHZlCi0gICAgICAvLyBhbmQgdGhlbiBleGVjdXRlCi0gICAgICBydW4oZnVuY3Rpb24o
KSB7Ci0gICAgICAgIGxhc3RQcm9taXNlID0gRW1iZXIuVGVzdC5yZXNvbHZlKGxhc3RQcm9taXNl
KS50aGVuKGZ1bmN0aW9uKCkgewotICAgICAgICAgIHJldHVybiBmbi5hcHBseShhcHAsIGFyZ3Mp
OwotICAgICAgICB9KTsKLSAgICAgIH0pOwotICAgIH0KLQotICAgIHJldHVybiBsYXN0UHJvbWlz
ZTsKLSAgfTsKLX0KLQotZnVuY3Rpb24gcnVuKGZuKSB7Ci0gIGlmICghRW1iZXIucnVuLmN1cnJl
bnRSdW5Mb29wKSB7Ci0gICAgRW1iZXIucnVuKGZuKTsKLSAgfSBlbHNlIHsKLSAgICBmbigpOwot
ICB9Ci19Ci0KLUVtYmVyLkFwcGxpY2F0aW9uLnJlb3Blbih7Ci0gIC8qKgotICAgVGhpcyBwcm9w
ZXJ0eSBjb250YWlucyB0aGUgdGVzdGluZyBoZWxwZXJzIGZvciB0aGUgY3VycmVudCBhcHBsaWNh
dGlvbi4gVGhlc2UKLSAgIGFyZSBjcmVhdGVkIG9uY2UgeW91IGNhbGwgYGluamVjdFRlc3RIZWxw
ZXJzYCBvbiB5b3VyIGBFbWJlci5BcHBsaWNhdGlvbmAKLSAgIGluc3RhbmNlLiBUaGUgaW5jbHVk
ZWQgaGVscGVycyBhcmUgYWxzbyBhdmFpbGFibGUgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQot
ICAgZGVmYXVsdCwgYnV0IGNhbiBiZSB1c2VkIGZyb20gdGhpcyBvYmplY3Qgb24gdGhlIGluZGl2
aWR1YWwgYXBwbGljYXRpb24gYWxzby4KLQotICAgIEBwcm9wZXJ0eSB0ZXN0SGVscGVycwotICAg
IEB0eXBlIHtPYmplY3R9Ci0gICAgQGRlZmF1bHQge30KLSAgKi8KLSAgdGVzdEhlbHBlcnM6IHt9
LAotCi0gIC8qKgotICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4gdGhlIG9yaWdpbmFsIG1l
dGhvZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQKLSAgIG9uIHRoZSBgaGVscGVyQ29udGFpbmVyYCBi
ZWZvcmUgYGluamVjdFRlc3RIZWxwZXJzYCBpcyBjYWxsZWQuCi0KLSAgIFdoZW4gYHJlbW92ZVRl
c3RIZWxwZXJzYCBpcyBjYWxsZWQsIHRoZXNlIG1ldGhvZHMgYXJlIHJlc3RvcmVkIHRvIHRoZQot
ICAgYGhlbHBlckNvbnRhaW5lcmAuCi0KLSAgICBAcHJvcGVydHkgb3JpZ2luYWxNZXRob2RzCi0g
ICAgQHR5cGUge09iamVjdH0KLSAgICBAZGVmYXVsdCB7fQotICAgIEBwcml2YXRlCi0gICovCi0g
IG9yaWdpbmFsTWV0aG9kczoge30sCi0KLQotICAvKioKLSAgVGhpcyBwcm9wZXJ0eSBpbmRpY2F0
ZXMgd2hldGhlciBvciBub3QgdGhpcyBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgaW4KLSAgdGVz
dGluZyBtb2RlLiBUaGlzIGlzIHNldCB3aGVuIGBzZXR1cEZvclRlc3RpbmdgIGlzIGNhbGxlZCBv
biB0aGUgY3VycmVudAotICBhcHBsaWNhdGlvbi4KLQotICBAcHJvcGVydHkgdGVzdGluZwotICBA
dHlwZSB7Qm9vbGVhbn0KLSAgQGRlZmF1bHQgZmFsc2UKLSAgKi8KLSAgdGVzdGluZzogZmFsc2Us
Ci0KLSAgLyoqCi0gICBUaGlzIGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxp
Y2F0aW9uLCBzbyB0aGF0IHlvdSBjYW4gc3RhcnQKLSAgIHRoZSBhcHAgd2hlbiB5b3VyIHRlc3Rz
IGFyZSByZWFkeSB0byBydW4uIEl0IGFsc28gc2V0cyB0aGUgcm91dGVyJ3MKLSAgIGxvY2F0aW9u
IHRvICdub25lJywgc28gdGhhdCB0aGUgd2luZG93J3MgbG9jYXRpb24gd2lsbCBub3QgYmUgbW9k
aWZpZWQKLSAgIChwcmV2ZW50aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJl
dHdlZW4gdGVzdHMgYW5kIGludGVyZmVyZW5jZQotICAgd2l0aCB5b3VyIHRlc3RpbmcgZnJhbWV3
b3JrKS4KLQotICAgRXhhbXBsZToKLQotICBgYGAKLSAgQXBwLnNldHVwRm9yVGVzdGluZygpOwot
ICBgYGAKLQotICAgIEBtZXRob2Qgc2V0dXBGb3JUZXN0aW5nCi0gICovCi0gIHNldHVwRm9yVGVz
dGluZzogZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIudGVzdGluZyA9IHRydWU7Ci0KLSAgICB0aGlz
LnRlc3RpbmcgPSB0cnVlOwotCi0gICAgdGhpcy5Sb3V0ZXIucmVvcGVuKHsKLSAgICAgIGxvY2F0
aW9uOiAnbm9uZScKLSAgICB9KTsKLQotICAgIC8vIGlmIGFkYXB0ZXIgaXMgbm90IG1hbnVhbGx5
IHNldCBkZWZhdWx0IHRvIFFVbml0Ci0gICAgaWYgKCFFbWJlci5UZXN0LmFkYXB0ZXIpIHsKLSAg
ICAgICBFbWJlci5UZXN0LmFkYXB0ZXIgPSBFbWJlci5UZXN0LlFVbml0QWRhcHRlci5jcmVhdGUo
KTsKLSAgICB9Ci0KLSAgICAgIH0sCi0KLSAgLyoqCi0gICAgVGhpcyB3aWxsIGJlIHVzZWQgYXMg
dGhlIGNvbnRhaW5lciB0byBpbmplY3QgdGhlIHRlc3QgaGVscGVycyBpbnRvLiBCeQotICAgIGRl
ZmF1bHQgdGhlIGhlbHBlcnMgYXJlIGluamVjdGVkIGludG8gYHdpbmRvd2AuCi0KLSAgICBAcHJv
cGVydHkgaGVscGVyQ29udGFpbmVyCi0gICBAdHlwZSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJl
IHVzZWQgZm9yIHRlc3QgaGVscGVycy4KLSAgIEBkZWZhdWx0IHdpbmRvdwotICAqLwotICBoZWxw
ZXJDb250YWluZXI6IHdpbmRvdywKLQotICAvKioKLSAgICBUaGlzIGluamVjdHMgdGhlIHRlc3Qg
aGVscGVycyBpbnRvIHRoZSBgaGVscGVyQ29udGFpbmVyYCBvYmplY3QuIElmIGFuIG9iamVjdCBp
cyBwcm92aWRlZAotICAgIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaGVscGVyQ29udGFpbmVyLiBJ
ZiBgaGVscGVyQ29udGFpbmVyYCBpcyBub3Qgc2V0IGl0IHdpbGwgZGVmYXVsdAotICAgIHRvIGB3
aW5kb3dgLiBJZiBhIGZ1bmN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBk
ZWZpbmVkIGl0IHdpbGwgYmUgY2FjaGVkCi0gICAgKHNvIHRoYXQgaXQgY2FuIGJlIHJlc2V0IGlm
IHRoZSBoZWxwZXIgaXMgcmVtb3ZlZCB3aXRoIGB1bnJlZ2lzdGVySGVscGVyYCBvcgotICAgIGBy
ZW1vdmVUZXN0SGVscGVyc2ApLgotCi0gICBBbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBg
b25JbmplY3RIZWxwZXJzYCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgaGVscGVycyBoYXZl
IGJlZW4gaW5qZWN0ZWQuCi0KLSAgRXhhbXBsZToKLSAgYGBgCi0gIEFwcC5pbmplY3RUZXN0SGVs
cGVycygpOwotICBgYGAKLQotICAgIEBtZXRob2QgaW5qZWN0VGVzdEhlbHBlcnMKLSAgKi8KLSAg
aW5qZWN0VGVzdEhlbHBlcnM6IGZ1bmN0aW9uKGhlbHBlckNvbnRhaW5lcikgewotICAgIGlmICho
ZWxwZXJDb250YWluZXIpIHsgdGhpcy5oZWxwZXJDb250YWluZXIgPSBoZWxwZXJDb250YWluZXI7
IH0KLQotICAgIHRoaXMudGVzdEhlbHBlcnMgPSB7fTsKLSAgICBmb3IgKHZhciBuYW1lIGluIGhl
bHBlcnMpIHsKLSAgICAgIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVdID0gdGhpcy5oZWxwZXJD
b250YWluZXJbbmFtZV07Ci0gICAgICB0aGlzLnRlc3RIZWxwZXJzW25hbWVdID0gdGhpcy5oZWxw
ZXJDb250YWluZXJbbmFtZV0gPSBoZWxwZXIodGhpcywgbmFtZSk7Ci0gICAgICBwcm90b1dyYXAo
RW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZSwgbmFtZSwgaGVscGVyKHRoaXMsIG5hbWUpLCBo
ZWxwZXJzW25hbWVdLm1ldGEud2FpdCk7Ci0gICAgfQotCi0gICAgZm9yKHZhciBpID0gMCwgbCA9
IGluamVjdEhlbHBlcnNDYWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0gICAgICBpbmpl
Y3RIZWxwZXJzQ2FsbGJhY2tzW2ldKHRoaXMpOwotICAgIH0KLSAgfSwKLQotICAvKioKLSAgICBU
aGlzIHJlbW92ZXMgYWxsIGhlbHBlcnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCwgYW5kIHJl
c2V0cyBhbmQgZnVuY3Rpb25zCi0gICAgdGhhdCB3ZXJlIG92ZXJyaWRkZW4gYnkgdGhlIGhlbHBl
cnMuCi0KLSAgICBFeGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAgIEFwcC5yZW1vdmVU
ZXN0SGVscGVycygpOwotICAgIGBgYAotCi0gICAgQHB1YmxpYwotICAgIEBtZXRob2QgcmVtb3Zl
VGVzdEhlbHBlcnMKLSAgKi8KLSAgcmVtb3ZlVGVzdEhlbHBlcnM6IGZ1bmN0aW9uKCkgewotICAg
IGZvciAodmFyIG5hbWUgaW4gaGVscGVycykgewotICAgICAgdGhpcy5oZWxwZXJDb250YWluZXJb
bmFtZV0gPSB0aGlzLm9yaWdpbmFsTWV0aG9kc1tuYW1lXTsKLSAgICAgIGRlbGV0ZSB0aGlzLnRl
c3RIZWxwZXJzW25hbWVdOwotICAgICAgZGVsZXRlIHRoaXMub3JpZ2luYWxNZXRob2RzW25hbWVd
OwotICAgIH0KLSAgfQotfSk7Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBuZWVkZWQK
LS8vIEJ1dCBzdGlsbCBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotLy8gb2YgaGVs
cGVyIGNoYWluaW5nCi1mdW5jdGlvbiBwcm90b1dyYXAocHJvdG8sIG5hbWUsIGNhbGxiYWNrLCBp
c0FzeW5jKSB7Ci0gIHByb3RvW25hbWVdID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGFyZ3MgPSBh
cmd1bWVudHM7Ci0gICAgaWYgKGlzQXN5bmMpIHsKLSAgICAgIHJldHVybiBjYWxsYmFjay5hcHBs
eSh0aGlzLCBhcmdzKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOwotICAg
ICAgfSk7Ci0gICAgfQotICB9OwotfQotCi1FbWJlci5UZXN0LlByb21pc2UgPSBmdW5jdGlvbigp
IHsKLSAgRW1iZXIuUlNWUC5Qcm9taXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Ci0gIEVtYmVy
LlRlc3QubGFzdFByb21pc2UgPSB0aGlzOwotfTsKLQotRW1iZXIuVGVzdC5Qcm9taXNlLnByb3Rv
dHlwZSA9IEVtYmVyLmNyZWF0ZShFbWJlci5SU1ZQLlByb21pc2UucHJvdG90eXBlKTsKLUVtYmVy
LlRlc3QuUHJvbWlzZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbWJlci5UZXN0LlByb21pc2U7
Ci0KLS8vIFBhdGNoIGB0aGVuYCB0byBpc29sYXRlIGFzeW5jIG1ldGhvZHMKLS8vIHNwZWNpZmlj
YWxseSBgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZWAKLXZhciBvcmlnaW5hbFRoZW4gPSBFbWJlci5S
U1ZQLlByb21pc2UucHJvdG90eXBlLnRoZW47Ci1FbWJlci5UZXN0LlByb21pc2UucHJvdG90eXBl
LnRoZW4gPSBmdW5jdGlvbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewotICByZXR1cm4gb3JpZ2lu
YWxUaGVuLmNhbGwodGhpcywgZnVuY3Rpb24odmFsKSB7Ci0gICAgcmV0dXJuIGlzb2xhdGUob25T
dWNjZXNzLCB2YWwpOwotICB9LCBvbkZhaWx1cmUpOwotfTsKLQotLy8gVGhpcyBtZXRob2QgaXNv
bGF0ZXMgbmVzdGVkIGFzeW5jIG1ldGhvZHMKLS8vIHNvIHRoYXQgdGhleSBkb24ndCBjb25mbGlj
dCB3aXRoIG90aGVyIGxhc3QgcHJvbWlzZXMuCi0vLwotLy8gMS4gU2V0IGBFbWJlci5UZXN0Lmxh
c3RQcm9taXNlYCB0byBudWxsCi0vLyAyLiBJbnZva2UgbWV0aG9kCi0vLyAzLiBSZXR1cm4gdGhl
IGxhc3QgcHJvbWlzZSBjcmVhdGVkIGR1cmluZyBtZXRob2QKLS8vIDQuIFJlc3RvcmUgYEVtYmVy
LlRlc3QubGFzdFByb21pc2VgIHRvIG9yaWdpbmFsIHZhbHVlCi1mdW5jdGlvbiBpc29sYXRlKGZu
LCB2YWwpIHsKLSAgdmFyIHZhbHVlLCBsYXN0UHJvbWlzZTsKLQotICAvLyBSZXNldCBsYXN0UHJv
bWlzZSBmb3IgbmVzdGVkIGhlbHBlcnMKLSAgRW1iZXIuVGVzdC5sYXN0UHJvbWlzZSA9IG51bGw7
Ci0KLSAgdmFsdWUgPSBmbi5jYWxsKG51bGwsIHZhbCk7Ci0KLSAgbGFzdFByb21pc2UgPSBFbWJl
ci5UZXN0Lmxhc3RQcm9taXNlOwotCi0gIC8vIElmIHRoZSBtZXRob2QgcmV0dXJuZWQgYSBwcm9t
aXNlCi0gIC8vIHJldHVybiB0aGF0IHByb21pc2UuIElmIG5vdCwKLSAgLy8gcmV0dXJuIHRoZSBs
YXN0IGFzeW5jIGhlbHBlcidzIHByb21pc2UKLSAgaWYgKCh2YWx1ZSAmJiAodmFsdWUgaW5zdGFu
Y2VvZiBFbWJlci5UZXN0LlByb21pc2UpKSB8fCAhbGFzdFByb21pc2UpIHsKLSAgICByZXR1cm4g
dmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgcnVuKGZ1bmN0aW9uKCkgewotICAgICAgbGFzdFByb21p
c2UgPSBFbWJlci5UZXN0LnJlc29sdmUobGFzdFByb21pc2UpLnRoZW4oZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0pOwotICAgIH0pOwotICAgIHJldHVybiBsYXN0
UHJvbWlzZTsKLSAgfQotfQotCi19KSgpOwotCi0KLQotKGZ1bmN0aW9uKCkgewotRW1iZXIub25M
b2FkKCdFbWJlci5BcHBsaWNhdGlvbicsIGZ1bmN0aW9uKEFwcGxpY2F0aW9uKSB7Ci0gIEFwcGxp
Y2F0aW9uLmluaXRpYWxpemVyKHsKLSAgICBuYW1lOiAnZGVmZXJSZWFkaW5lc3MgaW4gYHRlc3Rp
bmdgIG1vZGUnLAotCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNh
dGlvbil7Ci0gICAgICBpZiAoYXBwbGljYXRpb24udGVzdGluZykgewotICAgICAgICBhcHBsaWNh
dGlvbi5kZWZlclJlYWRpbmVzcygpOwotICAgICAgfQotICAgIH0KLSAgfSk7Ci0KLSAgfSk7Ci0K
LX0pKCk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0vKioKLSAgQG1vZHVsZSBlbWJlcgotICBAc3Vi
bW9kdWxlIGVtYmVyLXRlc3RpbmcKLSAqLwotCi12YXIgJCA9IEVtYmVyLiQ7Ci0KLS8qKgotICBU
aGlzIG1ldGhvZCBjcmVhdGVzIGEgY2hlY2tib3ggYW5kIHRyaWdnZXJzIHRoZSBjbGljayBldmVu
dCB0byBmaXJlIHRoZQotICBwYXNzZWQgaW4gaGFuZGxlci4gSXQgaXMgdXNlZCB0byBjb3JyZWN0
IGZvciBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucwotICBvZiBqUXVlcnkgKGUuZyAxLjguMykuCi0K
LSAgQHByaXZhdGUKLSAgQG1ldGhvZCB0ZXN0Q2hlY2tib3hDbGljawotKi8KLWZ1bmN0aW9uIHRl
c3RDaGVja2JveENsaWNrKGhhbmRsZXIpIHsKLSAgJCgnPGlucHV0IHR5cGU9ImNoZWNrYm94Ij4n
KQotICAgIC5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgbGVmdDogJy0xMDAwcHgnLCB0b3A6
ICctMTAwMHB4JyB9KQotICAgIC5hcHBlbmRUbygnYm9keScpCi0gICAgLm9uKCdjbGljaycsIGhh
bmRsZXIpCi0gICAgLnRyaWdnZXIoJ2NsaWNrJykKLSAgICAucmVtb3ZlKCk7Ci19Ci0KLSQoZnVu
Y3Rpb24oKSB7Ci0gIC8qCi0gICAgRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGVja2JveCBjaGVja2Vk
IHVzaW5nIGpRdWVyeSdzICJjbGljayIgbWV0aG9kIHdpbGwgaGF2ZQotICAgIHRoZSBjb3JyZWN0
IHZhbHVlIGZvciBpdHMgY2hlY2tlZCBwcm9wZXJ0eS4KLQotICAgIElmIHdlIGRldGVybWluZSB0
aGF0IHRoZSBjdXJyZW50IGpRdWVyeSB2ZXJzaW9uIGV4aGliaXRzIHRoaXMgYmVoYXZpb3IsCi0g
ICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkgYXMgaW4gdGhlIGNvbW1pdCBmb3IgdGhlIGFj
dHVhbCBmaXg6Ci0gICAgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvY29tbWl0LzFm
YjJmOTIuCi0gICovCi0gIHRlc3RDaGVja2JveENsaWNrKGZ1bmN0aW9uKCkgewotICAgIGlmICgh
dGhpcy5jaGVja2VkICYmICEkLmV2ZW50LnNwZWNpYWwuY2xpY2spIHsKLSAgICAgICQuZXZlbnQu
c3BlY2lhbC5jbGljayA9IHsKLSAgICAgICAgLy8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBl
dmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKLSAgICAgICAgdHJpZ2dlcjogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgaWYgKCQubm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSAmJiB0
aGlzLnR5cGUgPT09ICJjaGVja2JveCIgJiYgdGhpcy5jbGljaykgewotICAgICAgICAgICAgdGhp
cy5jbGljaygpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgfTsKLSAgICB9Ci0gIH0pOwotCi0gIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkg
dGhhdCB0aGUgcGF0Y2ggdG9vayBlZmZlY3Qgb3IgYmxvdyB1cC4KLSAgdGVzdENoZWNrYm94Q2xp
Y2soZnVuY3Rpb24oKSB7Ci0gICAgRW1iZXIud2FybigiY2xpY2tlZCBjaGVja2JveGVzIHNob3Vs
ZCBiZSBjaGVja2VkISB0aGUgalF1ZXJ5IHBhdGNoIGRpZG4ndCB3b3JrIiwgdGhpcy5jaGVja2Vk
KTsKLSAgfSk7Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgotIEBtb2R1
bGUgZW1iZXIKLSBAc3VibW9kdWxlIGVtYmVyLXRlc3RpbmcKLSovCi0KLXZhciBUZXN0ID0gRW1i
ZXIuVGVzdDsKLQotLyoqCi0gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0
byBjcmVhdGUgaG9va3MgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQKLSAgYnkgYW4gYWRhcHRlciBm
b3IgdmFyaW91cyB0ZXN0IGZyYW1ld29ya3MuCi0KLSAgQGNsYXNzIEFkYXB0ZXIKLSAgQG5hbWVz
cGFjZSBFbWJlci5UZXN0Ci0qLwotVGVzdC5BZGFwdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7
Ci0gIC8qKgotICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gYXN5
bmMgb3BlcmF0aW9uIGlzIGFib3V0IHRvIHN0YXJ0LgotCi0gICAgT3ZlcnJpZGUgdGhpcyB0byBj
YWxsIHlvdXIgZnJhbWV3b3JrJ3MgbWV0aG9kcyB0aGF0IGhhbmRsZSBhc3luYwotICAgIG9wZXJh
dGlvbnMuCi0KLSAgICBAcHVibGljCi0gICAgQG1ldGhvZCBhc3luY1N0YXJ0Ci0gICovCi0gIGFz
eW5jU3RhcnQ6IEVtYmVyLkssCi0KLSAgLyoqCi0gICAgVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNh
bGxlZCB3aGVuZXZlciBhbiBhc3luYyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KLQotICAgIEBw
dWJsaWMKLSAgICBAbWV0aG9kIGFzeW5jRW5kCi0gICovCi0gIGFzeW5jRW5kOiBFbWJlci5LLAot
Ci0gIC8qKgotICAgIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1l
d29yaydzIGZhbHNlIGFzc2VydGlvbi4KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVu
ZXZlciBhbiBleGNlcHRpb24gb2NjdXJzIGNhdXNpbmcgdGhlIHRlc3RpbmcKLSAgICBwcm9taXNl
IHRvIGZhaWwuCi0KLSAgICBRVW5pdCBleGFtcGxlOgotCi0gICAgYGBgamF2YXNjcmlwdAotICAg
ICAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikgewotICAgICAgICBvayhmYWxzZSwgZXJyb3Ip
OwotICAgICAgfTsKLSAgICBgYGAKLQotICAgIEBwdWJsaWMKLSAgICBAbWV0aG9kIGV4Y2VwdGlv
bgotICAgIEBwYXJhbSB7U3RyaW5nfSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4K
LSAgKi8KLSAgZXhjZXB0aW9uOiBmdW5jdGlvbihlcnJvcikgewotICAgIHRocm93IGVycm9yOwot
ICB9Ci19KTsKLQotLyoqCi0gIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBkZWZp
bmVkIGJ5IEVtYmVyLlRlc3QuQWRhcHRlciBmb3IgdGhlCi0gIFFVbml0IHRlc3RpbmcgZnJhbWV3
b3JrLgotCi0gIEBjbGFzcyBRVW5pdEFkYXB0ZXIKLSAgQG5hbWVzcGFjZSBFbWJlci5UZXN0Ci0g
IEBleHRlbmRzIEVtYmVyLlRlc3QuQWRhcHRlcgotKi8KLVRlc3QuUVVuaXRBZGFwdGVyID0gVGVz
dC5BZGFwdGVyLmV4dGVuZCh7Ci0gIGFzeW5jU3RhcnQ6IGZ1bmN0aW9uKCkgewotICAgIHN0b3Ao
KTsKLSAgfSwKLSAgYXN5bmNFbmQ6IGZ1bmN0aW9uKCkgewotICAgIHN0YXJ0KCk7Ci0gIH0sCi0g
IGV4Y2VwdGlvbjogZnVuY3Rpb24oZXJyb3IpIHsKLSAgICBvayhmYWxzZSwgRW1iZXIuaW5zcGVj
dChlcnJvcikpOwotICB9Ci19KTsKLQotfSkoKTsKLQotCi0KLShmdW5jdGlvbigpIHsKLS8qKgot
KiBAbW9kdWxlIGVtYmVyCi0qIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZwotKi8KLQotdmFyIGdl
dCA9IEVtYmVyLmdldCwKLSAgICBUZXN0ID0gRW1iZXIuVGVzdCwKLSAgICBoZWxwZXIgPSBUZXN0
LnJlZ2lzdGVySGVscGVyLAotICAgIGFzeW5jSGVscGVyID0gVGVzdC5yZWdpc3RlckFzeW5jSGVs
cGVyLAotICAgIGNvdW50QXN5bmMgPSAwOwotCi1UZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSAw
OwotCi1UZXN0Lm9uSW5qZWN0SGVscGVycyhmdW5jdGlvbigpIHsKLSAgRW1iZXIuJChkb2N1bWVu
dCkuYWpheFN0YXJ0KGZ1bmN0aW9uKCkgewotICAgIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cysr
OwotICB9KTsKLQotICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RvcChmdW5jdGlvbigpIHsKLSAg
ICBFbWJlci5hc3NlcnQoIkFuIGFqYXhTdG9wIGV2ZW50IHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBu
dW1iZXIgb2YgcGVuZGluZyBBSkFYICIgKwotICAgICAgICAgICAgICAgICAicmVxdWVzdHMgdG8g
YmUgbmVnYXRpdmUgaGFzIGJlZW4gdHJpZ2dlcmVkLiBUaGlzIGlzIG1vc3QgbGlrZWx5ICIgKwot
ICAgICAgICAgICAgICAgICAiY2F1c2VkIGJ5IEFKQVggZXZlbnRzIHRoYXQgd2VyZSBzdGFydGVk
IGJlZm9yZSBjYWxsaW5nICIgKwotICAgICAgICAgICAgICAgICAiYGluamVjdFRlc3RIZWxwZXJz
KClgLiIsIFRlc3QucGVuZGluZ0FqYXhSZXF1ZXN0cyAhPT0gMCk7Ci0gICAgVGVzdC5wZW5kaW5n
QWpheFJlcXVlc3RzLS07Ci0gIH0pOwotfSk7Ci0KLWZ1bmN0aW9uIGN1cnJlbnRSb3V0ZU5hbWUo
YXBwKXsKLSAgdmFyIGFwcENvbnRyb2xsZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ2Nv
bnRyb2xsZXI6YXBwbGljYXRpb24nKTsKLQotICByZXR1cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdj
dXJyZW50Um91dGVOYW1lJyk7Ci19Ci0KLWZ1bmN0aW9uIGN1cnJlbnRQYXRoKGFwcCl7Ci0gIHZh
ciBhcHBDb250cm9sbGVyID0gYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdjb250cm9sbGVyOmFw
cGxpY2F0aW9uJyk7Ci0KLSAgcmV0dXJuIGdldChhcHBDb250cm9sbGVyLCAnY3VycmVudFBhdGgn
KTsKLX0KLQotZnVuY3Rpb24gY3VycmVudFVSTChhcHApewotICB2YXIgcm91dGVyID0gYXBwLl9f
Y29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6bWFpbicpOwotCi0gIHJldHVybiBnZXQocm91dGVy
LCAnbG9jYXRpb24nKS5nZXRVUkwoKTsKLX0KLQotZnVuY3Rpb24gdmlzaXQoYXBwLCB1cmwpIHsK
LSAgRW1iZXIucnVuKGFwcCwgJ2FkdmFuY2VSZWFkaW5lc3MnKTsKLQotICBhcHAuX19jb250YWlu
ZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJykubG9jYXRpb24uc2V0VVJMKHVybCk7Ci0gIEVtYmVy
LnJ1bihhcHAsIGFwcC5oYW5kbGVVUkwsIHVybCk7Ci0gIHJldHVybiB3YWl0KGFwcCk7Ci19Ci0K
LWZ1bmN0aW9uIGNsaWNrKGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpIHsKLSAgdmFyICRlbCA9IGZp
bmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpOwotICBFbWJlci5ydW4oJGVsLCAn
bW91c2Vkb3duJyk7Ci0KLSAgaWYgKCRlbC5pcygnOmlucHV0JykpIHsKLSAgICB2YXIgdHlwZSA9
ICRlbC5wcm9wKCd0eXBlJyk7Ci0gICAgaWYgKHR5cGUgIT09ICdjaGVja2JveCcgJiYgdHlwZSAh
PT0gJ3JhZGlvJyAmJiB0eXBlICE9PSAnaGlkZGVuJykgewotICAgICAgRW1iZXIucnVuKCRlbCwg
ZnVuY3Rpb24oKXsKLSAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBgZm9j
dXNpbmAgZXZlbnQgaWYgdGhlIHdpbmRvdwotICAgICAgICAvLyBkb2VzIG5vdCBoYXZlIGZvY3Vz
LiBJZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBoYXZlIGZvY3VzIGp1c3QKLSAgICAgICAgLy8gdXNl
IHRyaWdnZXIoJ2ZvY3VzaW4nKSBpbnN0ZWFkLgotICAgICAgICBpZiAoIWRvY3VtZW50Lmhhc0Zv
Y3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICB0aGlzLmZvY3VzKCk7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhpcy50cmlnZ2VyKCdmb2N1c2luJyk7Ci0gICAg
ICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIEVtYmVyLnJ1bigkZWwsICdtb3VzZXVw
Jyk7Ci0gIEVtYmVyLnJ1bigkZWwsICdjbGljaycpOwotCi0gIHJldHVybiB3YWl0KGFwcCk7Ci19
Ci0KLWZ1bmN0aW9uIHRyaWdnZXJFdmVudChhcHAsIHNlbGVjdG9yLCBjb250ZXh0LCBldmVudCl7
Ci0gIGlmICh0eXBlb2YgbWV0aG9kID09PSAndW5kZWZpbmVkJykgewotICAgIGV2ZW50ID0gY29u
dGV4dDsKLSAgICBjb250ZXh0ID0gbnVsbDsKLSAgfQotCi0gIHZhciAkZWwgPSBmaW5kV2l0aEFz
c2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLQotICBFbWJlci5ydW4oJGVsLCAndHJpZ2dl
cicsIGV2ZW50KTsKLQotICByZXR1cm4gd2FpdChhcHApOwotfQotCi1mdW5jdGlvbiBrZXlFdmVu
dChhcHAsIHNlbGVjdG9yLCBjb250ZXh0LCB0eXBlLCBrZXlDb2RlKSB7Ci0gIHZhciAkZWw7Ci0g
IGlmICh0eXBlb2Yga2V5Q29kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKLSAgICBrZXlDb2RlID0gdHlw
ZTsKLSAgICB0eXBlID0gY29udGV4dDsKLSAgICBjb250ZXh0ID0gbnVsbDsKLSAgfQotICAkZWwg
PSBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLSAgdmFyIGV2ZW50ID0g
RW1iZXIuJC5FdmVudCh0eXBlLCB7IGtleUNvZGU6IGtleUNvZGUgfSk7Ci0gIEVtYmVyLnJ1bigk
ZWwsICd0cmlnZ2VyJywgZXZlbnQpOwotICByZXR1cm4gd2FpdChhcHApOwotfQotCi1mdW5jdGlv
biBmaWxsSW4oYXBwLCBzZWxlY3RvciwgY29udGV4dCwgdGV4dCkgewotICB2YXIgJGVsOwotICBp
ZiAodHlwZW9mIHRleHQgPT09ICd1bmRlZmluZWQnKSB7Ci0gICAgdGV4dCA9IGNvbnRleHQ7Ci0g
ICAgY29udGV4dCA9IG51bGw7Ci0gIH0KLSAgJGVsID0gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxl
Y3RvciwgY29udGV4dCk7Ci0gIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKLSAgICAkZWwudmFsKHRl
eHQpLmNoYW5nZSgpOwotICB9KTsKLSAgcmV0dXJuIHdhaXQoYXBwKTsKLX0KLQotZnVuY3Rpb24g
ZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3RvciwgY29udGV4dCkgewotICB2YXIgJGVsID0gZmlu
ZChhcHAsIHNlbGVjdG9yLCBjb250ZXh0KTsKLSAgaWYgKCRlbC5sZW5ndGggPT09IDApIHsKLSAg
ICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVsZW1lbnQgIiArIHNlbGVjdG9yICsgIiBub3QgZm91
bmQuIik7Ci0gIH0KLSAgcmV0dXJuICRlbDsKLX0KLQotZnVuY3Rpb24gZmluZChhcHAsIHNlbGVj
dG9yLCBjb250ZXh0KSB7Ci0gIHZhciAkZWw7Ci0gIGNvbnRleHQgPSBjb250ZXh0IHx8IGdldChh
cHAsICdyb290RWxlbWVudCcpOwotICAkZWwgPSBhcHAuJChzZWxlY3RvciwgY29udGV4dCk7Ci0K
LSAgcmV0dXJuICRlbDsKLX0KLQotZnVuY3Rpb24gYW5kVGhlbihhcHAsIGNhbGxiYWNrKSB7Ci0g
IHJldHVybiB3YWl0KGFwcCwgY2FsbGJhY2soYXBwKSk7Ci19Ci0KLWZ1bmN0aW9uIHdhaXQoYXBw
LCB2YWx1ZSkgewotICByZXR1cm4gVGVzdC5wcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKLSAg
ICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhc3luYyBwcm9taXNlLCBraWNrIG9mZiB0aGUgYXN5
bmMgdGVzdAotICAgIGlmICgrK2NvdW50QXN5bmMgPT09IDEpIHsKLSAgICAgIFRlc3QuYWRhcHRl
ci5hc3luY1N0YXJ0KCk7Ci0gICAgfQotCi0gICAgLy8gRXZlcnkgMTBtcywgcG9sbCBmb3IgdGhl
IGFzeW5jIHRoaW5nIHRvIGhhdmUgZmluaXNoZWQKLSAgICB2YXIgd2F0Y2hlciA9IHNldEludGVy
dmFsKGZ1bmN0aW9uKCkgewotICAgICAgLy8gMS4gSWYgdGhlIHJvdXRlciBpcyBsb2FkaW5nLCBr
ZWVwIHBvbGxpbmcKLSAgICAgIHZhciByb3V0ZXJJc0xvYWRpbmcgPSBhcHAuX19jb250YWluZXJf
Xy5sb29rdXAoJ3JvdXRlcjptYWluJykucm91dGVyLmlzTG9hZGluZzsKLSAgICAgIGlmIChyb3V0
ZXJJc0xvYWRpbmcpIHsgcmV0dXJuOyB9Ci0KLSAgICAgIC8vIDIuIElmIHRoZXJlIGFyZSBwZW5k
aW5nIEFqYXggcmVxdWVzdHMsIGtlZXAgcG9sbGluZwotICAgICAgaWYgKFRlc3QucGVuZGluZ0Fq
YXhSZXF1ZXN0cykgeyByZXR1cm47IH0KLQotICAgICAgLy8gMy4gSWYgdGhlcmUgYXJlIHNjaGVk
dWxlZCB0aW1lcnMgb3Igd2UgYXJlIGluc2lkZSBvZiBhIHJ1biBsb29wLCBrZWVwIHBvbGxpbmcK
LSAgICAgIGlmIChFbWJlci5ydW4uaGFzU2NoZWR1bGVkVGltZXJzKCkgfHwgRW1iZXIucnVuLmN1
cnJlbnRSdW5Mb29wKSB7IHJldHVybjsgfQotICAgICAgaWYgKFRlc3Qud2FpdGVycyAmJiBUZXN0
LndhaXRlcnMuYW55KGZ1bmN0aW9uKHdhaXRlcikgewotICAgICAgICB2YXIgY29udGV4dCA9IHdh
aXRlclswXTsKLSAgICAgICAgdmFyIGNhbGxiYWNrID0gd2FpdGVyWzFdOwotICAgICAgICByZXR1
cm4gIWNhbGxiYWNrLmNhbGwoY29udGV4dCk7Ci0gICAgICB9KSkgeyByZXR1cm47IH0KLSAgICAg
IC8vIFN0b3AgcG9sbGluZwotICAgICAgY2xlYXJJbnRlcnZhbCh3YXRjaGVyKTsKLQotICAgICAg
Ly8gSWYgdGhpcyBpcyB0aGUgbGFzdCBhc3luYyBwcm9taXNlLCBlbmQgdGhlIGFzeW5jIHRlc3QK
LSAgICAgIGlmICgtLWNvdW50QXN5bmMgPT09IDApIHsKLSAgICAgICAgVGVzdC5hZGFwdGVyLmFz
eW5jRW5kKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN5bmNocm9ub3VzbHkgcmVzb2x2ZSB0aGUg
cHJvbWlzZQotICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIHZhbHVlKTsKLSAgICB9LCAx
MCk7Ci0gIH0pOwotCi19Ci0KLQotLyoqCi0qIExvYWRzIGEgcm91dGUsIHNldHMgdXAgYW55IGNv
bnRyb2xsZXJzLCBhbmQgcmVuZGVycyBhbnkgdGVtcGxhdGVzIGFzc29jaWF0ZWQKLSogd2l0aCB0
aGUgcm91dGUgYXMgdGhvdWdoIGEgcmVhbCB1c2VyIGhhZCB0cmlnZ2VyZWQgdGhlIHJvdXRlIGNo
YW5nZSB3aGlsZQotKiB1c2luZyB5b3VyIGFwcC4KLSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2
YXNjcmlwdAotKiB2aXNpdCgncG9zdHMvaW5kZXgnKS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8v
IGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIHZpc2l0Ci0qIEBw
YXJhbSB7U3RyaW5nfSB1cmwgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCi0qIEByZXR1cm4ge1JTVlAu
UHJvbWlzZX0KLSovCi1hc3luY0hlbHBlcigndmlzaXQnLCB2aXNpdCk7Ci0KLS8qKgotKiBDbGlj
a3MgYW4gZWxlbWVudCBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgdHJpZ2dlcmVkIGJ5IHRoZSBl
bGVtZW50J3MgYGNsaWNrYAotKiBldmVudC4KLSoKLSogRXhhbXBsZToKLSoKLSogYGBgamF2YXNj
cmlwdAotKiBjbGljaygnLnNvbWUtalF1ZXJ5LXNlbGVjdG9yJykudGhlbihmdW5jdGlvbigpIHsK
LSogIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGNsaWNr
Ci0qIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcg
ZWxlbWVudCBvbiB0aGUgRE9NCi0qIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hl
bHBlcignY2xpY2snLCBjbGljayk7Ci0KLS8qKgotKiBTaW11bGF0ZXMgYSBrZXkgZXZlbnQsIGUu
Zy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBga2V5dXBgIHdpdGggdGhlIGRlc2lyZWQga2V5Q29k
ZQotKgotKiBFeGFtcGxlOgotKgotKiBgYGBqYXZhc2NyaXB0Ci0qIGtleUV2ZW50KCcuc29tZS1q
UXVlcnktc2VsZWN0b3InLCAna2V5cHJlc3MnLCAxMykudGhlbihmdW5jdGlvbigpIHsKLSogIC8v
IGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGtleUV2ZW50Ci0q
IEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0b3IgZm9yIGZpbmRpbmcgZWxl
bWVudCBvbiB0aGUgRE9NCi0qIEBwYXJhbSB7U3RyaW5nfSB0aGUgdHlwZSBvZiBrZXkgZXZlbnQs
IGUuZy4gYGtleXByZXNzYCwgYGtleWRvd25gLCBga2V5dXBgCi0qIEBwYXJhbSB7TnVtYmVyfSB0
aGUga2V5Q29kZSBvZiB0aGUgc2ltdWxhdGVkIGtleSBldmVudAotKiBAcmV0dXJuIHtSU1ZQLlBy
b21pc2V9Ci0qLwotYXN5bmNIZWxwZXIoJ2tleUV2ZW50Jywga2V5RXZlbnQpOwotCi0vKioKLSog
RmlsbHMgaW4gYW4gaW5wdXQgZWxlbWVudCB3aXRoIHNvbWUgdGV4dC4KLSoKLSogRXhhbXBsZToK
LSoKLSogYGBgamF2YXNjcmlwdAotKiBmaWxsSW4oJyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20n
KS50aGVuKGZ1bmN0aW9uKCkgewotKiAgIC8vIGFzc2VydCBzb21ldGhpbmcKLSogfSk7Ci0qIGBg
YAotKgotKiBAbWV0aG9kIGZpbGxJbgotKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5
IHNlbGVjdG9yIGZpbmRpbmcgYW4gaW5wdXQgZWxlbWVudCBvbiB0aGUgRE9NCi0qIHRvIGZpbGwg
dGV4dCB3aXRoCi0qIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRleHQgdG8gcGxhY2UgaW5zaWRlIHRo
ZSBpbnB1dCBlbGVtZW50Ci0qIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KLSovCi1hc3luY0hlbHBl
cignZmlsbEluJywgZmlsbEluKTsKLQotLyoqCi0qIEZpbmRzIGFuIGVsZW1lbnQgaW4gdGhlIGNv
bnRleHQgb2YgdGhlIGFwcCdzIGNvbnRhaW5lciBlbGVtZW50LiBBIHNpbXBsZSBhbGlhcwotKiBm
b3IgYGFwcC4kKHNlbGVjdG9yKWAuCi0qCi0qIEV4YW1wbGU6Ci0qCi0qIGBgYGphdmFzY3JpcHQK
LSogdmFyICRlbCA9IGZpbmQoJy5teS1zZWxlY3Rvcik7Ci0qIGBgYAotKgotKiBAbWV0aG9kIGZp
bmQKLSogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzdHJpbmcgc2VsZWN0b3IgZm9y
IGVsZW1lbnQgbG9va3VwCi0qIEByZXR1cm4ge09iamVjdH0galF1ZXJ5IG9iamVjdCByZXByZXNl
bnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0qLwotaGVscGVyKCdmaW5kJywgZmluZCk7
Ci0KLS8qKgotKiBMaWtlIGBmaW5kYCwgYnV0IHRocm93cyBhbiBlcnJvciBpZiB0aGUgZWxlbWVu
dCBzZWxlY3RvciByZXR1cm5zIG5vIHJlc3VsdHMuCi0qCi0qIEV4YW1wbGU6Ci0qCi0qIGBgYGph
dmFzY3JpcHQKLSogdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KCcuZG9lc250LWV4aXN0Jyk7IC8v
IHRocm93cyBlcnJvcgotKiBgYGAKLSoKLSogQG1ldGhvZCBmaW5kV2l0aEFzc2VydAotKiBAcGFy
YW0ge1N0cmluZ30gc2VsZWN0b3IgalF1ZXJ5IHNlbGVjdG9yIHN0cmluZyBmb3IgZmluZGluZyBh
biBlbGVtZW50IHdpdGhpbgotKiB0aGUgRE9NCi0qIEByZXR1cm4ge09iamVjdH0galF1ZXJ5IG9i
amVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0qIEB0aHJvd3Mge0Vy
cm9yfSB0aHJvd3MgZXJyb3IgaWYgalF1ZXJ5IG9iamVjdCByZXR1cm5lZCBoYXMgYSBsZW5ndGgg
b2YgMAotKi8KLWhlbHBlcignZmluZFdpdGhBc3NlcnQnLCBmaW5kV2l0aEFzc2VydCk7Ci0KLS8q
KgotICBDYXVzZXMgdGhlIHJ1biBsb29wIHRvIHByb2Nlc3MgYW55IHBlbmRpbmcgZXZlbnRzLiBU
aGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLSAgYW55IGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBv
dGhlciBoZWxwZXJzIChvciB5b3VyIGFzc2VydGlvbnMpIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0K
LSAgVGhpcyBpcyBtb3N0IG9mdGVuIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGhl
bHBlciBmdW5jdGlvbnMgKHNlZSAnY2xpY2snLAotICAnZmlsbEluJywndmlzaXQnLGV0YykuCi0K
LSAgRXhhbXBsZToKLQotICBgYGBqYXZhc2NyaXB0Ci0gIEVtYmVyLlRlc3QucmVnaXN0ZXJBc3lu
Y0hlbHBlcignbG9naW5Vc2VyJywgZnVuY3Rpb24oYXBwLCB1c2VybmFtZSwgcGFzc3dvcmQpIHsK
LSAgICB2aXNpdCgnc2VjdXJlZC9wYXRoL2hlcmUnKQotICAgIC5maWxsSW4oJyN1c2VybmFtZScs
IHVzZXJuYW1lKQotICAgIC5maWxsSW4oJyNwYXNzd29yZCcsIHVzZXJuYW1lKQotICAgIC5jbGlj
aygnLnN1Ym1pdCcpCi0KLSAgICByZXR1cm4gd2FpdCgpOwotICB9KTsKLQotICBAbWV0aG9kIHdh
aXQKLSAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KLSAg
QHJldHVybiB7UlNWUC5Qcm9taXNlfQotKi8KLWFzeW5jSGVscGVyKCd3YWl0Jywgd2FpdCk7Ci1h
c3luY0hlbHBlcignYW5kVGhlbicsIGFuZFRoZW4pOwotCi0KLQotCi19KSgpOwotCi0KLQotKGZ1
bmN0aW9uKCkgewotLyoqCi0gIEVtYmVyIFRlc3RpbmcKLQotICBAbW9kdWxlIGVtYmVyCi0gIEBz
dWJtb2R1bGUgZW1iZXItdGVzdGluZwotICBAcmVxdWlyZXMgZW1iZXItYXBwbGljYXRpb24KLSov
Ci0KLX0pKCk7Ci0KLShmdW5jdGlvbigpIHsKLS8qKgotRW1iZXIKLQotQG1vZHVsZSBlbWJlcgot
Ki8KLQotZnVuY3Rpb24gdGhyb3dXaXRoTWVzc2FnZShtc2cpIHsKLSAgcmV0dXJuIGZ1bmN0aW9u
KCkgewotICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihtc2cpOwotICB9OwotfQotCi1mdW5jdGlv
biBnZW5lcmF0ZVJlbW92ZWRDbGFzcyhjbGFzc05hbWUpIHsKLSAgdmFyIG1zZyA9ICIgaGFzIGJl
ZW4gbW92ZWQgaW50byBhIHBsdWdpbjogaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvZW1iZXIt
c3RhdGVzIjsKLQotICByZXR1cm4gewotICAgIGV4dGVuZDogdGhyb3dXaXRoTWVzc2FnZShjbGFz
c05hbWUgKyBtc2cpLAotICAgIGNyZWF0ZTogdGhyb3dXaXRoTWVzc2FnZShjbGFzc05hbWUgKyBt
c2cpCi0gIH07Ci19Ci0KLUVtYmVyLlN0YXRlTWFuYWdlciA9IGdlbmVyYXRlUmVtb3ZlZENsYXNz
KCJFbWJlci5TdGF0ZU1hbmFnZXIiKTsKLQotLyoqCi0gIFRoaXMgd2FzIGV4cG9ydGVkIHRvIGVt
YmVyLXN0YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAgcmVsZWFzZS4gU2VlOiBodHRwczovL2dpdGh1
Yi5jb20vZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAgCi0gIEBjbGFzcyBTdGF0ZU1hbmFnZXIKLSAg
QG5hbWVzcGFjZSBFbWJlcgotKi8KLQotRW1iZXIuU3RhdGUgPSBnZW5lcmF0ZVJlbW92ZWRDbGFz
cygiRW1iZXIuU3RhdGUiKTsKLQotLyoqCi0gIFRoaXMgd2FzIGV4cG9ydGVkIHRvIGVtYmVyLXN0
YXRlcyBwbHVnaW4gZm9yIHYgMS4wLjAgcmVsZWFzZS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20v
ZW1iZXJqcy9lbWJlci1zdGF0ZXMKLSAgCi0gIEBjbGFzcyBTdGF0ZQotICBAbmFtZXNwYWNlIEVt
YmVyCi0qLwotCi19KSgpOwotCi0KLX0pKCk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcwpkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMjUxMDMzYjRjZGYzNTMwYjM4ZTdjZjhkZDg4
OTEwNzRkMjIzNi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGVi
YXJzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjc0NiArMCwwIEBACi0vKiEKLQotIGhhbmRsZWJh
cnMgdjEuMy4wCi0KLUNvcHlyaWdodCAoQykgMjAxMSBieSBZZWh1ZGEgS2F0egotCi1QZXJtaXNz
aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh
aW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRp
b24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhv
dXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwot
dG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNl
bnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw
ZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl
Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5v
dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotYWxs
IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBT
T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E
LCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9S
UyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBP
UiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S
VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ
VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLVRIRSBTT0ZU
V0FSRS4KLQotQGxpY2Vuc2UKLSovCi0vKiBleHBvcnRlZCBIYW5kbGViYXJzICovCi12YXIgSGFu
ZGxlYmFycyA9IChmdW5jdGlvbigpIHsKLS8vIGhhbmRsZWJhcnMvc2FmZS1zdHJpbmcuanMKLXZh
ciBfX21vZHVsZTRfXyA9IChmdW5jdGlvbigpIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19l
eHBvcnRzX187Ci0gIC8vIEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlCi0gIGZ1
bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7Ci0gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0g
IH0KLQotICBTYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICAg
IHJldHVybiAiIiArIHRoaXMuc3RyaW5nOwotICB9OwotCi0gIF9fZXhwb3J0c19fID0gU2FmZVN0
cmluZzsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoKTsKLQotLy8gaGFuZGxlYmFycy91dGls
cy5qcwotdmFyIF9fbW9kdWxlM19fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAi
dXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNfXyA9IHt9OwotICAvKmpzaGludCAtVzAwNCAq
LwotICB2YXIgU2FmZVN0cmluZyA9IF9fZGVwZW5kZW5jeTFfXzsKLQotICB2YXIgZXNjYXBlID0g
ewotICAgICImIjogIiZhbXA7IiwKLSAgICAiPCI6ICImbHQ7IiwKLSAgICAiPiI6ICImZ3Q7IiwK
LSAgICAnIic6ICImcXVvdDsiLAotICAgICInIjogIiYjeDI3OyIsCi0gICAgImAiOiAiJiN4NjA7
IgotICB9OwotCi0gIHZhciBiYWRDaGFycyA9IC9bJjw+IidgXS9nOwotICB2YXIgcG9zc2libGUg
PSAvWyY8PiInYF0vOwotCi0gIGZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7Ci0gICAgcmV0dXJu
IGVzY2FwZVtjaHJdIHx8ICImYW1wOyI7Ci0gIH0KLQotICBmdW5jdGlvbiBleHRlbmQob2JqLCB2
YWx1ZSkgewotICAgIGZvcih2YXIga2V5IGluIHZhbHVlKSB7Ci0gICAgICBpZihPYmplY3QucHJv
dG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHsKLSAgICAgICAgb2JqW2tl
eV0gPSB2YWx1ZVtrZXldOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIF9fZXhwb3J0c19fLmV4
dGVuZCA9IGV4dGVuZDt2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwot
ICBfX2V4cG9ydHNfXy50b1N0cmluZyA9IHRvU3RyaW5nOwotICAvLyBTb3VyY2VkIGZyb20gbG9k
YXNoCi0gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9sb2Rhc2gvYmxvYi9tYXN0ZXIv
TElDRU5TRS50eHQKLSAgdmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkgewotICAgIHJl
dHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7Ci0gIH07Ci0gIC8vIGZhbGxiYWNrIGZv
ciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaQotICBpZiAoaXNGdW5jdGlvbigv
eC8pKSB7Ci0gICAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICByZXR1cm4g
dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAn
W29iamVjdCBGdW5jdGlvbl0nOwotICAgIH07Ci0gIH0KLSAgdmFyIGlzRnVuY3Rpb247Ci0gIF9f
ZXhwb3J0c19fLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uOwotICB2YXIgaXNBcnJheSA9IEFycmF5
LmlzQXJyYXkgfHwgZnVuY3Rpb24odmFsdWUpIHsKLSAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVv
ZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0
IEFycmF5XScgOiBmYWxzZTsKLSAgfTsKLSAgX19leHBvcnRzX18uaXNBcnJheSA9IGlzQXJyYXk7
Ci0KLSAgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHsKLSAgICAvLyBkb24ndCBl
c2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBzYWZlCi0gICAgaWYgKHN0
cmluZyBpbnN0YW5jZW9mIFNhZmVTdHJpbmcpIHsKLSAgICAgIHJldHVybiBzdHJpbmcudG9TdHJp
bmcoKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJpbmcgJiYgc3RyaW5nICE9PSAwKSB7Ci0gICAgICBy
ZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0
aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kCi0gICAgLy8gdGhl
IHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMs
IGNhdXNpbmcgaXNzdWVzIGlmCi0gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2Nh
cGVkIGNoYXJhY3RlcnMgaW4gaXQuCi0gICAgc3RyaW5nID0gIiIgKyBzdHJpbmc7Ci0KLSAgICBp
ZighcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH0KLSAgICByZXR1cm4g
c3RyaW5nLnJlcGxhY2UoYmFkQ2hhcnMsIGVzY2FwZUNoYXIpOwotICB9Ci0KLSAgX19leHBvcnRz
X18uZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJlc3Npb247ZnVuY3Rpb24gaXNFbXB0eSh2
YWx1ZSkgewotICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHsKLSAgICAgIHJldHVybiB0
cnVlOwotICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAw
KSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgfQotCi0gIF9fZXhwb3J0c19fLmlzRW1wdHkgPSBpc0VtcHR5OwotICByZXR1
cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTRfXyk7Ci0KLS8vIGhhbmRsZWJhcnMvZXhjZXB0
aW9uLmpzCi12YXIgX19tb2R1bGU1X18gPSAoZnVuY3Rpb24oKSB7Ci0gICJ1c2Ugc3RyaWN0IjsK
LSAgdmFyIF9fZXhwb3J0c19fOwotCi0gIHZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbics
ICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAn
c3RhY2snXTsKLQotICBmdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkgewotICAgIHZh
ciBsaW5lOwotICAgIGlmIChub2RlICYmIG5vZGUuZmlyc3RMaW5lKSB7Ci0gICAgICBsaW5lID0g
bm9kZS5maXJzdExpbmU7Ci0KLSAgICAgIG1lc3NhZ2UgKz0gJyAtICcgKyBsaW5lICsgJzonICsg
bm9kZS5maXJzdENvbHVtbjsKLSAgICB9Ci0KLSAgICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBl
LmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7Ci0KLSAgICAvLyBVbmZvcnR1bmF0ZWx5
IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3Ig
cHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay4KLSAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBl
cnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHsKLSAgICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9
IHRtcFtlcnJvclByb3BzW2lkeF1dOwotICAgIH0KLQotICAgIGlmIChsaW5lKSB7Ci0gICAgICB0
aGlzLmxpbmVOdW1iZXIgPSBsaW5lOwotICAgICAgdGhpcy5jb2x1bW4gPSBub2RlLmZpcnN0Q29s
dW1uOwotICAgIH0KLSAgfQotCi0gIEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsK
LQotICBfX2V4cG9ydHNfXyA9IEV4Y2VwdGlvbjsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSko
KTsKLQotLy8gaGFuZGxlYmFycy9iYXNlLmpzCi12YXIgX19tb2R1bGUyX18gPSAoZnVuY3Rpb24o
X19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2
YXIgX19leHBvcnRzX18gPSB7fTsKLSAgdmFyIFV0aWxzID0gX19kZXBlbmRlbmN5MV9fOwotICB2
YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5Ml9fOwotCi0gIHZhciBWRVJTSU9OID0gIjEuMy4w
IjsKLSAgX19leHBvcnRzX18uVkVSU0lPTiA9IFZFUlNJT047dmFyIENPTVBJTEVSX1JFVklTSU9O
ID0gNDsKLSAgX19leHBvcnRzX18uQ09NUElMRVJfUkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lP
TjsKLSAgdmFyIFJFVklTSU9OX0NIQU5HRVMgPSB7Ci0gICAgMTogJzw9IDEuMC5yYy4yJywgLy8g
MS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXQKLSAgICAyOiAn
PT0gMS4wLjAtcmMuMycsCi0gICAgMzogJz09IDEuMC4wLXJjLjQnLAotICAgIDQ6ICc+PSAxLjAu
MCcKLSAgfTsKLSAgX19leHBvcnRzX18uUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5H
RVM7Ci0gIHZhciBpc0FycmF5ID0gVXRpbHMuaXNBcnJheSwKLSAgICAgIGlzRnVuY3Rpb24gPSBV
dGlscy5pc0Z1bmN0aW9uLAotICAgICAgdG9TdHJpbmcgPSBVdGlscy50b1N0cmluZywKLSAgICAg
IG9iamVjdFR5cGUgPSAnW29iamVjdCBPYmplY3RdJzsKLQotICBmdW5jdGlvbiBIYW5kbGViYXJz
RW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMpIHsKLSAgICB0aGlzLmhlbHBlcnMgPSBoZWxw
ZXJzIHx8IHt9OwotICAgIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTsKLQotICAgIHJl
Z2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5IYW5kbGVi
YXJzRW52aXJvbm1lbnQgPSBIYW5kbGViYXJzRW52aXJvbm1lbnQ7SGFuZGxlYmFyc0Vudmlyb25t
ZW50LnByb3RvdHlwZSA9IHsKLSAgICBjb25zdHJ1Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50
LAotCi0gICAgbG9nZ2VyOiBsb2dnZXIsCi0gICAgbG9nOiBsb2csCi0KLSAgICByZWdpc3Rlckhl
bHBlcjogZnVuY3Rpb24obmFtZSwgZm4sIGludmVyc2UpIHsKLSAgICAgIGlmICh0b1N0cmluZy5j
YWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7Ci0gICAgICAgIGlmIChpbnZlcnNlIHx8IGZuKSB7
IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVs
cGVycycpOyB9Ci0gICAgICAgIFV0aWxzLmV4dGVuZCh0aGlzLmhlbHBlcnMsIG5hbWUpOwotICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGludmVyc2UpIHsgZm4ubm90ID0gaW52ZXJzZTsgfQot
ICAgICAgICB0aGlzLmhlbHBlcnNbbmFtZV0gPSBmbjsKLSAgICAgIH0KLSAgICB9LAotCi0gICAg
cmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lLCBzdHIpIHsKLSAgICAgIGlmICh0b1N0cmlu
Zy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7Ci0gICAgICAgIFV0aWxzLmV4dGVuZCh0aGlz
LnBhcnRpYWxzLCAgbmFtZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLnBhcnRpYWxz
W25hbWVdID0gc3RyOwotICAgICAgfQotICAgIH0KLSAgfTsKLQotICBmdW5jdGlvbiByZWdpc3Rl
ckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIo
J2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihhcmcpIHsKLSAgICAgIGlmKGFyZ3VtZW50cy5sZW5n
dGggPT09IDIpIHsKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk1pc3NpbmcgaGVscGVyOiAnIiArIGFyZyArICIn
Iik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxv
Y2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgdmFy
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UgfHwgZnVuY3Rpb24oKSB7fSwgZm4gPSBvcHRpb25z
LmZuOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4
dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmKGNvbnRleHQgPT09IHRydWUpIHsKLSAgICAgICAg
cmV0dXJuIGZuKHRoaXMpOwotICAgICAgfSBlbHNlIGlmKGNvbnRleHQgPT09IGZhbHNlIHx8IGNv
bnRleHQgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTsKLSAgICAgIH0g
ZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkgewotICAgICAgICBpZihjb250ZXh0Lmxlbmd0aCA+
IDApIHsKLSAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9w
dGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMp
OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZm4oY29udGV4dCk7
Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcs
IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIHZhciBmbiA9IG9wdGlvbnMuZm4s
IGludmVyc2UgPSBvcHRpb25zLmludmVyc2U7Ci0gICAgICB2YXIgaSA9IDAsIHJldCA9ICIiLCBk
YXRhOwotCi0gICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4
dC5jYWxsKHRoaXMpOyB9Ci0KLSAgICAgIGlmIChvcHRpb25zLmRhdGEpIHsKLSAgICAgICAgZGF0
YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGNvbnRl
eHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7Ci0gICAgICAgIGlmIChpc0FycmF5
KGNvbnRleHQpKSB7Ci0gICAgICAgICAgZm9yKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGk8ajsg
aSsrKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgICBkYXRhLmluZGV4
ID0gaTsKLSAgICAgICAgICAgICAgZGF0YS5maXJzdCA9IChpID09PSAwKTsKLSAgICAgICAgICAg
ICAgZGF0YS5sYXN0ICA9IChpID09PSAoY29udGV4dC5sZW5ndGgtMSkpOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtpXSwgeyBkYXRhOiBkYXRhIH0p
OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IodmFyIGtleSBp
biBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZihjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkp
IHsKLSAgICAgICAgICAgICAgaWYoZGF0YSkgeyAKLSAgICAgICAgICAgICAgICBkYXRhLmtleSA9
IGtleTsgCi0gICAgICAgICAgICAgICAgZGF0YS5pbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAg
ZGF0YS5maXJzdCA9IChpID09PSAwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBy
ZXQgPSByZXQgKyBmbihjb250ZXh0W2tleV0sIHtkYXRhOiBkYXRhfSk7Ci0gICAgICAgICAgICAg
IGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQot
ICAgICAgaWYoaSA9PT0gMCl7Ci0gICAgICAgIHJldCA9IGludmVyc2UodGhpcyk7Ci0gICAgICB9
Ci0KLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3Rlckhl
bHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykgewotICAgICAgaWYgKGlz
RnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7IGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWwuY2FsbCh0
aGlzKTsgfQotCi0gICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9z
aXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuCi0gICAgICAv
LyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRp
b25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZQotICAgICAgLy8gYmVoYXZpb3Ig
b2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBi
eSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS4KLSAgICAgIGlmICgoIW9wdGlvbnMuaGFz
aC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwpIHx8IFV0aWxzLmlzRW1wdHkoY29uZGl0aW9u
YWwpKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTsKLSAgICAgIH0KLSAgICB9KTsK
LQotICAgIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbihjb25kaXRp
b25hbCwgb3B0aW9ucykgewotICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2Fs
bCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlv
bnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pOwotICAgIH0pOwotCi0gICAgaW5zdGFuY2UucmVn
aXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBp
ZiAoaXNGdW5jdGlvbihjb250ZXh0KSkgeyBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpOyB9
Ci0KLSAgICAgIGlmICghVXRpbHMuaXNFbXB0eShjb250ZXh0KSkgcmV0dXJuIG9wdGlvbnMuZm4o
Y29udGV4dCk7Ci0gICAgfSk7Ci0KLSAgICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywg
ZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgdmFyIGxldmVsID0gb3B0aW9ucy5k
YXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsID8gcGFyc2VJbnQob3B0aW9ucy5kYXRh
LmxldmVsLCAxMCkgOiAxOwotICAgICAgaW5zdGFuY2UubG9nKGxldmVsLCBjb250ZXh0KTsKLSAg
ICB9KTsKLSAgfQotCi0gIHZhciBsb2dnZXIgPSB7Ci0gICAgbWV0aG9kTWFwOiB7IDA6ICdkZWJ1
ZycsIDE6ICdpbmZvJywgMjogJ3dhcm4nLCAzOiAnZXJyb3InIH0sCi0KLSAgICAvLyBTdGF0ZSBl
bnVtCi0gICAgREVCVUc6IDAsCi0gICAgSU5GTzogMSwKLSAgICBXQVJOOiAyLAotICAgIEVSUk9S
OiAzLAotICAgIGxldmVsOiAzLAotCi0gICAgLy8gY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhv
c3QgZW52aXJvbm1lbnQKLSAgICBsb2c6IGZ1bmN0aW9uKGxldmVsLCBvYmopIHsKLSAgICAgIGlm
IChsb2dnZXIubGV2ZWwgPD0gbGV2ZWwpIHsKLSAgICAgICAgdmFyIG1ldGhvZCA9IGxvZ2dlci5t
ZXRob2RNYXBbbGV2ZWxdOwotICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmlu
ZWQnICYmIGNvbnNvbGVbbWV0aG9kXSkgewotICAgICAgICAgIGNvbnNvbGVbbWV0aG9kXS5jYWxs
KGNvbnNvbGUsIG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIF9fZXhw
b3J0c19fLmxvZ2dlciA9IGxvZ2dlcjsKLSAgZnVuY3Rpb24gbG9nKGxldmVsLCBvYmopIHsgbG9n
Z2VyLmxvZyhsZXZlbCwgb2JqKTsgfQotCi0gIF9fZXhwb3J0c19fLmxvZyA9IGxvZzt2YXIgY3Jl
YXRlRnJhbWUgPSBmdW5jdGlvbihvYmplY3QpIHsKLSAgICB2YXIgb2JqID0ge307Ci0gICAgVXRp
bHMuZXh0ZW5kKG9iaiwgb2JqZWN0KTsKLSAgICByZXR1cm4gb2JqOwotICB9OwotICBfX2V4cG9y
dHNfXy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lOwotICByZXR1cm4gX19leHBvcnRzX187Ci19
KShfX21vZHVsZTNfXywgX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzL3J1bnRpbWUuanMK
LXZhciBfX21vZHVsZTZfXyA9IChmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5j
eTJfXywgX19kZXBlbmRlbmN5M19fKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0
c19fID0ge307Ci0gIHZhciBVdGlscyA9IF9fZGVwZW5kZW5jeTFfXzsKLSAgdmFyIEV4Y2VwdGlv
biA9IF9fZGVwZW5kZW5jeTJfXzsKLSAgdmFyIENPTVBJTEVSX1JFVklTSU9OID0gX19kZXBlbmRl
bmN5M19fLkNPTVBJTEVSX1JFVklTSU9OOwotICB2YXIgUkVWSVNJT05fQ0hBTkdFUyA9IF9fZGVw
ZW5kZW5jeTNfXy5SRVZJU0lPTl9DSEFOR0VTOwotCi0gIGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24o
Y29tcGlsZXJJbmZvKSB7Ci0gICAgdmFyIGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8g
JiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsCi0gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJ
TEVSX1JFVklTSU9OOwotCi0gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZp
c2lvbikgewotICAgICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHsK
LSAgICAgICAgdmFyIHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJl
dmlzaW9uXSwKLSAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VT
W2NvbXBpbGVyUmV2aXNpb25dOwotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUZW1wbGF0
ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhh
biB0aGUgY3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5
b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIitydW50aW1lVmVyc2lvbnMrIikg
b3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgiK2NvbXBpbGVy
VmVyc2lvbnMrIikuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBVc2UgdGhlIGVtYmVk
ZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhp
cyByZXZpc2lvbiB5ZXQKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVtcGxhdGUgd2Fz
IHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUg
Y3VycmVudCBydW50aW1lLiAiKwotICAgICAgICAgICAgICAiUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1
bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgiK2NvbXBpbGVySW5mb1sxXSsiKS4iKTsKLSAgICAg
IH0KLSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZp
c2lvbjsvLyBUT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFuZCBicmVhayB1cCBjb21waWxlUGFydGlh
bAotCi0gIGZ1bmN0aW9uIHRlbXBsYXRlKHRlbXBsYXRlU3BlYywgZW52KSB7Ci0gICAgaWYgKCFl
bnYpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGVudmlyb25tZW50IHBhc3NlZCB0
byB0ZW1wbGF0ZSIpOwotICAgIH0KLQotICAgIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVu
Y2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0
aW9uIHRvIGFsbG93Ci0gICAgLy8gZm9yIGV4dGVybmFsIHVzZXJzIHRvIG92ZXJyaWRlIHRoZXNl
IGFzIHBzZXVkby1zdXBwb3J0ZWQgQVBJcy4KLSAgICB2YXIgaW52b2tlUGFydGlhbFdyYXBwZXIg
PSBmdW5jdGlvbihwYXJ0aWFsLCBuYW1lLCBjb250ZXh0LCBoZWxwZXJzLCBwYXJ0aWFscywgZGF0
YSkgewotICAgICAgdmFyIHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsgcmV0dXJuIHJlc3VsdDsg
fQotCi0gICAgICBpZiAoZW52LmNvbXBpbGUpIHsKLSAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGhl
bHBlcnM6IGhlbHBlcnMsIHBhcnRpYWxzOiBwYXJ0aWFscywgZGF0YTogZGF0YSB9OwotICAgICAg
ICBwYXJ0aWFsc1tuYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHsgZGF0YTogZGF0YSAhPT0g
dW5kZWZpbmVkIH0sIGVudik7Ci0gICAgICAgIHJldHVybiBwYXJ0aWFsc1tuYW1lXShjb250ZXh0
LCBvcHRpb25zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24o
IlRoZSBwYXJ0aWFsICIgKyBuYW1lICsgIiBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5u
aW5nIGluIHJ1bnRpbWUtb25seSBtb2RlIik7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIC8vIEp1
c3QgYWRkIHdhdGVyCi0gICAgdmFyIGNvbnRhaW5lciA9IHsKLSAgICAgIGVzY2FwZUV4cHJlc3Np
b246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sCi0gICAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQ
YXJ0aWFsV3JhcHBlciwKLSAgICAgIHByb2dyYW1zOiBbXSwKLSAgICAgIHByb2dyYW06IGZ1bmN0
aW9uKGksIGZuLCBkYXRhKSB7Ci0gICAgICAgIHZhciBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJv
Z3JhbXNbaV07Ci0gICAgICAgIGlmKGRhdGEpIHsKLSAgICAgICAgICBwcm9ncmFtV3JhcHBlciA9
IHByb2dyYW0oaSwgZm4sIGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBl
cikgewotICAgICAgICAgIHByb2dyYW1XcmFwcGVyID0gdGhpcy5wcm9ncmFtc1tpXSA9IHByb2dy
YW0oaSwgZm4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9ncmFtV3JhcHBlcjsKLSAg
ICAgIH0sCi0gICAgICBtZXJnZTogZnVuY3Rpb24ocGFyYW0sIGNvbW1vbikgewotICAgICAgICB2
YXIgcmV0ID0gcGFyYW0gfHwgY29tbW9uOwotCi0gICAgICAgIGlmIChwYXJhbSAmJiBjb21tb24g
JiYgKHBhcmFtICE9PSBjb21tb24pKSB7Ci0gICAgICAgICAgcmV0ID0ge307Ci0gICAgICAgICAg
VXRpbHMuZXh0ZW5kKHJldCwgY29tbW9uKTsKLSAgICAgICAgICBVdGlscy5leHRlbmQocmV0LCBw
YXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0sCi0gICAgICBw
cm9ncmFtV2l0aERlcHRoOiBlbnYuVk0ucHJvZ3JhbVdpdGhEZXB0aCwKLSAgICAgIG5vb3A6IGVu
di5WTS5ub29wLAotICAgICAgY29tcGlsZXJJbmZvOiBudWxsCi0gICAgfTsKLQotICAgIHJldHVy
biBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7Ci0gICAgICBvcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKLSAgICAgIHZhciBuYW1lc3BhY2UgPSBvcHRpb25zLnBhcnRpYWwgPyBvcHRpb25zIDog
ZW52LAotICAgICAgICAgIGhlbHBlcnMsCi0gICAgICAgICAgcGFydGlhbHM7Ci0KLSAgICAgIGlm
ICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAgIGhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7
Ci0gICAgICAgIHBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFsczsKLSAgICAgIH0KLSAgICAgIHZh
ciByZXN1bHQgPSB0ZW1wbGF0ZVNwZWMuY2FsbCgKLSAgICAgICAgICAgIGNvbnRhaW5lciwKLSAg
ICAgICAgICAgIG5hbWVzcGFjZSwgY29udGV4dCwKLSAgICAgICAgICAgIGhlbHBlcnMsCi0gICAg
ICAgICAgICBwYXJ0aWFscywKLSAgICAgICAgICAgIG9wdGlvbnMuZGF0YSk7Ci0KLSAgICAgIGlm
ICghb3B0aW9ucy5wYXJ0aWFsKSB7Ci0gICAgICAgIGVudi5WTS5jaGVja1JldmlzaW9uKGNvbnRh
aW5lci5jb21waWxlckluZm8pOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAg
IH07Ci0gIH0KLQotICBfX2V4cG9ydHNfXy50ZW1wbGF0ZSA9IHRlbXBsYXRlO2Z1bmN0aW9uIHBy
b2dyYW1XaXRoRGVwdGgoaSwgZm4sIGRhdGEgLyosICRkZXB0aCAqLykgewotICAgIHZhciBhcmdz
ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTsKLQotICAgIHZhciBw
cm9nID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykgewotICAgICAgb3B0aW9ucyA9IG9wdGlv
bnMgfHwge307Ci0KLSAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBbY29udGV4dCwgb3B0aW9u
cy5kYXRhIHx8IGRhdGFdLmNvbmNhdChhcmdzKSk7Ci0gICAgfTsKLSAgICBwcm9nLnByb2dyYW0g
PSBpOwotICAgIHByb2cuZGVwdGggPSBhcmdzLmxlbmd0aDsKLSAgICByZXR1cm4gcHJvZzsKLSAg
fQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW1XaXRoRGVwdGggPSBwcm9ncmFtV2l0aERlcHRoO2Z1
bmN0aW9uIHByb2dyYW0oaSwgZm4sIGRhdGEpIHsKLSAgICB2YXIgcHJvZyA9IGZ1bmN0aW9uKGNv
bnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotCi0gICAg
ICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucy5kYXRhIHx8IGRhdGEpOwotICAgIH07Ci0gICAg
cHJvZy5wcm9ncmFtID0gaTsKLSAgICBwcm9nLmRlcHRoID0gMDsKLSAgICByZXR1cm4gcHJvZzsK
LSAgfQotCi0gIF9fZXhwb3J0c19fLnByb2dyYW0gPSBwcm9ncmFtO2Z1bmN0aW9uIGludm9rZVBh
cnRpYWwocGFydGlhbCwgbmFtZSwgY29udGV4dCwgaGVscGVycywgcGFydGlhbHMsIGRhdGEpIHsK
LSAgICB2YXIgb3B0aW9ucyA9IHsgcGFydGlhbDogdHJ1ZSwgaGVscGVyczogaGVscGVycywgcGFy
dGlhbHM6IHBhcnRpYWxzLCBkYXRhOiBkYXRhIH07Ci0KLSAgICBpZihwYXJ0aWFsID09PSB1bmRl
ZmluZWQpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBwYXJ0aWFsICIgKyBuYW1l
ICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsKLSAgICB9IGVsc2UgaWYocGFydGlhbCBpbnN0YW5j
ZW9mIEZ1bmN0aW9uKSB7Ci0gICAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTsK
LSAgICB9Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlh
bDtmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gIiI7IH0KLQotICBfX2V4cG9ydHNfXy5ub29wID0g
bm9vcDsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoX19tb2R1bGUzX18sIF9fbW9kdWxlNV9f
LCBfX21vZHVsZTJfXyk7Ci0KLS8vIGhhbmRsZWJhcnMucnVudGltZS5qcwotdmFyIF9fbW9kdWxl
MV9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVu
ZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fKSB7Ci0gICJ1c2Ugc3Ry
aWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fOwotICAvKmdsb2JhbHMgSGFuZGxlYmFyczogdHJ1ZSAq
LwotICB2YXIgYmFzZSA9IF9fZGVwZW5kZW5jeTFfXzsKLQotICAvLyBFYWNoIG9mIHRoZXNlIGF1
Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuCi0gIC8v
IChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJlIGNvZGUgYmV0d2VlbiBjb21tb25qcyBhbmQg
YnJvd3NlIGVudnMpCi0gIHZhciBTYWZlU3RyaW5nID0gX19kZXBlbmRlbmN5Ml9fOwotICB2YXIg
RXhjZXB0aW9uID0gX19kZXBlbmRlbmN5M19fOwotICB2YXIgVXRpbHMgPSBfX2RlcGVuZGVuY3k0
X187Ci0gIHZhciBydW50aW1lID0gX19kZXBlbmRlbmN5NV9fOwotCi0gIC8vIEZvciBjb21wYXRp
YmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5k
bGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZQotICB2YXIgY3JlYXRlID0gZnVuY3Rpb24oKSB7Ci0g
ICAgdmFyIGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7Ci0KLSAgICBVdGls
cy5leHRlbmQoaGIsIGJhc2UpOwotICAgIGhiLlNhZmVTdHJpbmcgPSBTYWZlU3RyaW5nOwotICAg
IGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjsKLSAgICBoYi5VdGlscyA9IFV0aWxzOwotCi0gICAg
aGIuVk0gPSBydW50aW1lOwotICAgIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykgewotICAg
ICAgcmV0dXJuIHJ1bnRpbWUudGVtcGxhdGUoc3BlYywgaGIpOwotICAgIH07Ci0KLSAgICByZXR1
cm4gaGI7Ci0gIH07Ci0KLSAgdmFyIEhhbmRsZWJhcnMgPSBjcmVhdGUoKTsKLSAgSGFuZGxlYmFy
cy5jcmVhdGUgPSBjcmVhdGU7Ci0KLSAgX19leHBvcnRzX18gPSBIYW5kbGViYXJzOwotICByZXR1
cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTJfXywgX19tb2R1bGU0X18sIF9fbW9kdWxlNV9f
LCBfX21vZHVsZTNfXywgX19tb2R1bGU2X18pOwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2Fz
dC5qcwotdmFyIF9fbW9kdWxlN19fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAi
dXNlIHN0cmljdCI7Ci0gIHZhciBfX2V4cG9ydHNfXzsKLSAgdmFyIEV4Y2VwdGlvbiA9IF9fZGVw
ZW5kZW5jeTFfXzsKLQotICBmdW5jdGlvbiBMb2NhdGlvbkluZm8obG9jSW5mbyl7Ci0gICAgbG9j
SW5mbyA9IGxvY0luZm8gfHwge307Ci0gICAgdGhpcy5maXJzdExpbmUgICA9IGxvY0luZm8uZmly
c3RfbGluZTsKLSAgICB0aGlzLmZpcnN0Q29sdW1uID0gbG9jSW5mby5maXJzdF9jb2x1bW47Ci0g
ICAgdGhpcy5sYXN0Q29sdW1uICA9IGxvY0luZm8ubGFzdF9jb2x1bW47Ci0gICAgdGhpcy5sYXN0
TGluZSAgICA9IGxvY0luZm8ubGFzdF9saW5lOwotICB9Ci0KLSAgdmFyIEFTVCA9IHsKLSAgICBQ
cm9ncmFtTm9kZTogZnVuY3Rpb24oc3RhdGVtZW50cywgaW52ZXJzZVN0cmlwLCBpbnZlcnNlLCBs
b2NJbmZvKSB7Ci0gICAgICB2YXIgaW52ZXJzZUxvY2F0aW9uSW5mbywgZmlyc3RJbnZlcnNlTm9k
ZTsKLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7Ci0gICAgICAgIGxvY0luZm8g
PSBpbnZlcnNlOwotICAgICAgICBpbnZlcnNlID0gbnVsbDsKLSAgICAgIH0gZWxzZSBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMikgewotICAgICAgICBsb2NJbmZvID0gaW52ZXJzZVN0cmlwOwot
ICAgICAgICBpbnZlcnNlU3RyaXAgPSBudWxsOwotICAgICAgfQotCi0gICAgICBMb2NhdGlvbklu
Zm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAgIHRoaXMudHlwZSA9ICJwcm9ncmFtIjsKLSAg
ICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7Ci0gICAgICB0aGlzLnN0cmlwID0ge307
Ci0KLSAgICAgIGlmKGludmVyc2UpIHsKLSAgICAgICAgZmlyc3RJbnZlcnNlTm9kZSA9IGludmVy
c2VbMF07Ci0gICAgICAgIGlmIChmaXJzdEludmVyc2VOb2RlKSB7Ci0gICAgICAgICAgaW52ZXJz
ZUxvY2F0aW9uSW5mbyA9IHsKLSAgICAgICAgICAgIGZpcnN0X2xpbmU6IGZpcnN0SW52ZXJzZU5v
ZGUuZmlyc3RMaW5lLAotICAgICAgICAgICAgbGFzdF9saW5lOiBmaXJzdEludmVyc2VOb2RlLmxh
c3RMaW5lLAotICAgICAgICAgICAgbGFzdF9jb2x1bW46IGZpcnN0SW52ZXJzZU5vZGUubGFzdENv
bHVtbiwKLSAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogZmlyc3RJbnZlcnNlTm9kZS5maXJzdENv
bHVtbgotICAgICAgICAgIH07Ci0gICAgICAgICAgdGhpcy5pbnZlcnNlID0gbmV3IEFTVC5Qcm9n
cmFtTm9kZShpbnZlcnNlLCBpbnZlcnNlU3RyaXAsIGludmVyc2VMb2NhdGlvbkluZm8pOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMuaW52ZXJzZSA9IG5ldyBBU1QuUHJvZ3JhbU5v
ZGUoaW52ZXJzZSwgaW52ZXJzZVN0cmlwKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnN0cmlw
LnJpZ2h0ID0gaW52ZXJzZVN0cmlwLmxlZnQ7Ci0gICAgICB9IGVsc2UgaWYgKGludmVyc2VTdHJp
cCkgewotICAgICAgICB0aGlzLnN0cmlwLmxlZnQgPSBpbnZlcnNlU3RyaXAucmlnaHQ7Ci0gICAg
ICB9Ci0gICAgfSwKLQotICAgIE11c3RhY2hlTm9kZTogZnVuY3Rpb24ocmF3UGFyYW1zLCBoYXNo
LCBvcGVuLCBzdHJpcCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywg
bG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAibXVzdGFjaGUiOwotICAgICAgdGhpcy5zdHJp
cCA9IHN0cmlwOwotCi0gICAgICAvLyBPcGVuIG1heSBiZSBhIHN0cmluZyBwYXJzZWQgZnJvbSB0
aGUgcGFyc2VyIG9yIGEgcGFzc2VkIGJvb2xlYW4gZmxhZwotICAgICAgaWYgKG9wZW4gIT0gbnVs
bCAmJiBvcGVuLmNoYXJBdCkgewotICAgICAgICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9y
dCBJRSBwcmUtMTAKLSAgICAgICAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBv
cGVuLmNoYXJBdCgyKTsKLSAgICAgICAgdGhpcy5lc2NhcGVkID0gZXNjYXBlRmxhZyAhPT0gJ3sn
ICYmIGVzY2FwZUZsYWcgIT09ICcmJzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuZXNj
YXBlZCA9ICEhb3BlbjsKLSAgICAgIH0KLQotICAgICAgaWYgKHJhd1BhcmFtcyBpbnN0YW5jZW9m
IEFTVC5TZXhwck5vZGUpIHsKLSAgICAgICAgdGhpcy5zZXhwciA9IHJhd1BhcmFtczsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIC8vIFN1cHBvcnQgb2xkIEFTVCBBUEkKLSAgICAgICAgdGhpcy5z
ZXhwciA9IG5ldyBBU1QuU2V4cHJOb2RlKHJhd1BhcmFtcywgaGFzaCk7Ci0gICAgICB9Ci0KLSAg
ICAgIHRoaXMuc2V4cHIuaXNSb290ID0gdHJ1ZTsKLQotICAgICAgLy8gU3VwcG9ydCBvbGQgQVNU
IEFQSSB0aGF0IHN0b3JlZCB0aGlzIGluZm8gaW4gTXVzdGFjaGVOb2RlCi0gICAgICB0aGlzLmlk
ID0gdGhpcy5zZXhwci5pZDsKLSAgICAgIHRoaXMucGFyYW1zID0gdGhpcy5zZXhwci5wYXJhbXM7
Ci0gICAgICB0aGlzLmhhc2ggPSB0aGlzLnNleHByLmhhc2g7Ci0gICAgICB0aGlzLmVsaWdpYmxl
SGVscGVyID0gdGhpcy5zZXhwci5lbGlnaWJsZUhlbHBlcjsKLSAgICAgIHRoaXMuaXNIZWxwZXIg
PSB0aGlzLnNleHByLmlzSGVscGVyOwotICAgIH0sCi0KLSAgICBTZXhwck5vZGU6IGZ1bmN0aW9u
KHJhd1BhcmFtcywgaGFzaCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhp
cywgbG9jSW5mbyk7Ci0KLSAgICAgIHRoaXMudHlwZSA9ICJzZXhwciI7Ci0gICAgICB0aGlzLmhh
c2ggPSBoYXNoOwotCi0gICAgICB2YXIgaWQgPSB0aGlzLmlkID0gcmF3UGFyYW1zWzBdOwotICAg
ICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyYW1zID0gcmF3UGFyYW1zLnNsaWNlKDEpOwotCi0gICAg
ICAvLyBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBpZjoKLSAgICAgIC8vICogaXRz
IGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKQotICAgICAg
dmFyIGVsaWdpYmxlSGVscGVyID0gdGhpcy5lbGlnaWJsZUhlbHBlciA9IGlkLmlzU2ltcGxlOwot
Ci0gICAgICAvLyBhIG11c3RhY2hlIGlzIGRlZmluaXRlbHkgYSBoZWxwZXIgaWY6Ci0gICAgICAv
LyAqIGl0IGlzIGFuIGVsaWdpYmxlIGhlbHBlciwgYW5kCi0gICAgICAvLyAqIGl0IGhhcyBhdCBs
ZWFzdCBvbmUgcGFyYW1ldGVyIG9yIGhhc2ggc2VnbWVudAotICAgICAgdGhpcy5pc0hlbHBlciA9
IGVsaWdpYmxlSGVscGVyICYmIChwYXJhbXMubGVuZ3RoIHx8IGhhc2gpOwotCi0gICAgICAvLyBp
ZiBhIG11c3RhY2hlIGlzIGFuIGVsaWdpYmxlIGhlbHBlciBidXQgbm90IGEgZGVmaW5pdGUKLSAg
ICAgIC8vIGhlbHBlciwgaXQgaXMgYW1iaWd1b3VzLCBhbmQgd2lsbCBiZSByZXNvbHZlZCBpbiBh
IGxhdGVyCi0gICAgICAvLyBwYXNzIG9yIGF0IHJ1bnRpbWUuCi0gICAgfSwKLQotICAgIFBhcnRp
YWxOb2RlOiBmdW5jdGlvbihwYXJ0aWFsTmFtZSwgY29udGV4dCwgc3RyaXAsIGxvY0luZm8pIHsK
LSAgICAgIExvY2F0aW9uSW5mby5jYWxsKHRoaXMsIGxvY0luZm8pOwotICAgICAgdGhpcy50eXBl
ICAgICAgICAgPSAicGFydGlhbCI7Ci0gICAgICB0aGlzLnBhcnRpYWxOYW1lICA9IHBhcnRpYWxO
YW1lOwotICAgICAgdGhpcy5jb250ZXh0ICAgICAgPSBjb250ZXh0OwotICAgICAgdGhpcy5zdHJp
cCA9IHN0cmlwOwotICAgIH0sCi0KLSAgICBCbG9ja05vZGU6IGZ1bmN0aW9uKG11c3RhY2hlLCBw
cm9ncmFtLCBpbnZlcnNlLCBjbG9zZSwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNh
bGwodGhpcywgbG9jSW5mbyk7Ci0KLSAgICAgIGlmKG11c3RhY2hlLnNleHByLmlkLm9yaWdpbmFs
ICE9PSBjbG9zZS5wYXRoLm9yaWdpbmFsKSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24o
bXVzdGFjaGUuc2V4cHIuaWQub3JpZ2luYWwgKyAiIGRvZXNuJ3QgbWF0Y2ggIiArIGNsb3NlLnBh
dGgub3JpZ2luYWwsIHRoaXMpOwotICAgICAgfQotCi0gICAgICB0aGlzLnR5cGUgPSAnYmxvY2sn
OwotICAgICAgdGhpcy5tdXN0YWNoZSA9IG11c3RhY2hlOwotICAgICAgdGhpcy5wcm9ncmFtICA9
IHByb2dyYW07Ci0gICAgICB0aGlzLmludmVyc2UgID0gaW52ZXJzZTsKLQotICAgICAgdGhpcy5z
dHJpcCA9IHsKLSAgICAgICAgbGVmdDogbXVzdGFjaGUuc3RyaXAubGVmdCwKLSAgICAgICAgcmln
aHQ6IGNsb3NlLnN0cmlwLnJpZ2h0Ci0gICAgICB9OwotCi0gICAgICAocHJvZ3JhbSB8fCBpbnZl
cnNlKS5zdHJpcC5sZWZ0ID0gbXVzdGFjaGUuc3RyaXAucmlnaHQ7Ci0gICAgICAoaW52ZXJzZSB8
fCBwcm9ncmFtKS5zdHJpcC5yaWdodCA9IGNsb3NlLnN0cmlwLmxlZnQ7Ci0KLSAgICAgIGlmIChp
bnZlcnNlICYmICFwcm9ncmFtKSB7Ci0gICAgICAgIHRoaXMuaXNJbnZlcnNlID0gdHJ1ZTsKLSAg
ICAgIH0KLSAgICB9LAotCi0gICAgQ29udGVudE5vZGU6IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5m
bykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlz
LnR5cGUgPSAiY29udGVudCI7Ci0gICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKLSAgICB9LAot
Ci0gICAgSGFzaE5vZGU6IGZ1bmN0aW9uKHBhaXJzLCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlv
bkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsKLSAgICAgIHRoaXMudHlwZSA9ICJoYXNoIjsKLSAg
ICAgIHRoaXMucGFpcnMgPSBwYWlyczsKLSAgICB9LAotCi0gICAgSWROb2RlOiBmdW5jdGlvbihw
YXJ0cywgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7
Ci0gICAgICB0aGlzLnR5cGUgPSAiSUQiOwotCi0gICAgICB2YXIgb3JpZ2luYWwgPSAiIiwKLSAg
ICAgICAgICBkaWcgPSBbXSwKLSAgICAgICAgICBkZXB0aCA9IDA7Ci0KLSAgICAgIGZvcih2YXIg
aT0wLGw9cGFydHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAgICAgICB2YXIgcGFydCA9IHBhcnRz
W2ldLnBhcnQ7Ci0gICAgICAgIG9yaWdpbmFsICs9IChwYXJ0c1tpXS5zZXBhcmF0b3IgfHwgJycp
ICsgcGFydDsKLQotICAgICAgICBpZiAocGFydCA9PT0gIi4uIiB8fCBwYXJ0ID09PSAiLiIgfHwg
cGFydCA9PT0gInRoaXMiKSB7Ci0gICAgICAgICAgaWYgKGRpZy5sZW5ndGggPiAwKSB7Ci0gICAg
ICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHBhdGg6ICIgKyBvcmlnaW5hbCwg
dGhpcyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAiLi4iKSB7Ci0gICAgICAgICAg
ICBkZXB0aCsrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmlzU2NvcGVk
ID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGlnLnB1
c2gocGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdGhpcy5vcmlnaW5hbCA9IG9y
aWdpbmFsOwotICAgICAgdGhpcy5wYXJ0cyAgICA9IGRpZzsKLSAgICAgIHRoaXMuc3RyaW5nICAg
PSBkaWcuam9pbignLicpOwotICAgICAgdGhpcy5kZXB0aCAgICA9IGRlcHRoOwotCi0gICAgICAv
LyBhbiBJRCBpcyBzaW1wbGUgaWYgaXQgb25seSBoYXMgb25lIHBhcnQsIGFuZCB0aGF0IHBhcnQg
aXMgbm90Ci0gICAgICAvLyBgLi5gIG9yIGB0aGlzYC4KLSAgICAgIHRoaXMuaXNTaW1wbGUgPSBw
YXJ0cy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNTY29wZWQgJiYgZGVwdGggPT09IDA7Ci0KLSAg
ICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gdGhpcy5zdHJpbmc7Ci0gICAgfSwKLQotICAgIFBh
cnRpYWxOYW1lTm9kZTogZnVuY3Rpb24obmFtZSwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25J
bmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiUEFSVElBTF9OQU1F
IjsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWUub3JpZ2luYWw7Ci0gICAgfSwKLQotICAgIERhdGFO
b2RlOiBmdW5jdGlvbihpZCwgbG9jSW5mbykgewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhp
cywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiREFUQSI7Ci0gICAgICB0aGlzLmlkID0g
aWQ7Ci0gICAgfSwKLQotICAgIFN0cmluZ05vZGU6IGZ1bmN0aW9uKHN0cmluZywgbG9jSW5mbykg
ewotICAgICAgTG9jYXRpb25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5
cGUgPSAiU1RSSU5HIjsKLSAgICAgIHRoaXMub3JpZ2luYWwgPQotICAgICAgICB0aGlzLnN0cmlu
ZyA9Ci0gICAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gc3RyaW5nOwotICAgIH0sCi0KLSAg
ICBJbnRlZ2VyTm9kZTogZnVuY3Rpb24oaW50ZWdlciwgbG9jSW5mbykgewotICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiSU5URUdFUiI7
Ci0gICAgICB0aGlzLm9yaWdpbmFsID0KLSAgICAgICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsK
LSAgICAgIHRoaXMuc3RyaW5nTW9kZVZhbHVlID0gTnVtYmVyKGludGVnZXIpOwotICAgIH0sCi0K
LSAgICBCb29sZWFuTm9kZTogZnVuY3Rpb24oYm9vbCwgbG9jSW5mbykgewotICAgICAgTG9jYXRp
b25JbmZvLmNhbGwodGhpcywgbG9jSW5mbyk7Ci0gICAgICB0aGlzLnR5cGUgPSAiQk9PTEVBTiI7
Ci0gICAgICB0aGlzLmJvb2wgPSBib29sOwotICAgICAgdGhpcy5zdHJpbmdNb2RlVmFsdWUgPSBi
b29sID09PSAidHJ1ZSI7Ci0gICAgfSwKLQotICAgIENvbW1lbnROb2RlOiBmdW5jdGlvbihjb21t
ZW50LCBsb2NJbmZvKSB7Ci0gICAgICBMb2NhdGlvbkluZm8uY2FsbCh0aGlzLCBsb2NJbmZvKTsK
LSAgICAgIHRoaXMudHlwZSA9ICJjb21tZW50IjsKLSAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1l
bnQ7Ci0gICAgfQotICB9OwotCi0gIC8vIE11c3QgYmUgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHJh
dGhlciB0aGFuIHRoZSByb290IG9mIHRoZSBtb2R1bGUgYXMgdGhlIGppc29uIGxleGVyCi0gIC8v
IG1vc3QgbW9kaWZ5IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBwcm9wZXJseS4KLSAgX19leHBvcnRz
X18gPSBBU1Q7Ci0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKF9fbW9kdWxlNV9fKTsKLQotLy8g
aGFuZGxlYmFycy9jb21waWxlci9wYXJzZXIuanMKLXZhciBfX21vZHVsZTlfXyA9IChmdW5jdGlv
bigpIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIC8qIGpzaGludCBp
Z25vcmU6c3RhcnQgKi8KLSAgLyogSmlzb24gZ2VuZXJhdGVkIHBhcnNlciAqLwotICB2YXIgaGFu
ZGxlYmFycyA9IChmdW5jdGlvbigpewotICB2YXIgcGFyc2VyID0ge3RyYWNlOiBmdW5jdGlvbiB0
cmFjZSgpIHsgfSwKLSAgeXk6IHt9LAotICBzeW1ib2xzXzogeyJlcnJvciI6Miwicm9vdCI6Mywi
c3RhdGVtZW50cyI6NCwiRU9GIjo1LCJwcm9ncmFtIjo2LCJzaW1wbGVJbnZlcnNlIjo3LCJzdGF0
ZW1lbnQiOjgsIm9wZW5JbnZlcnNlIjo5LCJjbG9zZUJsb2NrIjoxMCwib3BlbkJsb2NrIjoxMSwi
bXVzdGFjaGUiOjEyLCJwYXJ0aWFsIjoxMywiQ09OVEVOVCI6MTQsIkNPTU1FTlQiOjE1LCJPUEVO
X0JMT0NLIjoxNiwic2V4cHIiOjE3LCJDTE9TRSI6MTgsIk9QRU5fSU5WRVJTRSI6MTksIk9QRU5f
RU5EQkxPQ0siOjIwLCJwYXRoIjoyMSwiT1BFTiI6MjIsIk9QRU5fVU5FU0NBUEVEIjoyMywiQ0xP
U0VfVU5FU0NBUEVEIjoyNCwiT1BFTl9QQVJUSUFMIjoyNSwicGFydGlhbE5hbWUiOjI2LCJwYXJ0
aWFsX29wdGlvbjAiOjI3LCJzZXhwcl9yZXBldGl0aW9uMCI6MjgsInNleHByX29wdGlvbjAiOjI5
LCJkYXRhTmFtZSI6MzAsInBhcmFtIjozMSwiU1RSSU5HIjozMiwiSU5URUdFUiI6MzMsIkJPT0xF
QU4iOjM0LCJPUEVOX1NFWFBSIjozNSwiQ0xPU0VfU0VYUFIiOjM2LCJoYXNoIjozNywiaGFzaF9y
ZXBldGl0aW9uX3BsdXMwIjozOCwiaGFzaFNlZ21lbnQiOjM5LCJJRCI6NDAsIkVRVUFMUyI6NDEs
IkRBVEEiOjQyLCJwYXRoU2VnbWVudHMiOjQzLCJTRVAiOjQ0LCIkYWNjZXB0IjowLCIkZW5kIjox
fSwKLSAgdGVybWluYWxzXzogezI6ImVycm9yIiw1OiJFT0YiLDE0OiJDT05URU5UIiwxNToiQ09N
TUVOVCIsMTY6Ik9QRU5fQkxPQ0siLDE4OiJDTE9TRSIsMTk6Ik9QRU5fSU5WRVJTRSIsMjA6Ik9Q
RU5fRU5EQkxPQ0siLDIyOiJPUEVOIiwyMzoiT1BFTl9VTkVTQ0FQRUQiLDI0OiJDTE9TRV9VTkVT
Q0FQRUQiLDI1OiJPUEVOX1BBUlRJQUwiLDMyOiJTVFJJTkciLDMzOiJJTlRFR0VSIiwzNDoiQk9P
TEVBTiIsMzU6Ik9QRU5fU0VYUFIiLDM2OiJDTE9TRV9TRVhQUiIsNDA6IklEIiw0MToiRVFVQUxT
Iiw0MjoiREFUQSIsNDQ6IlNFUCJ9LAotICBwcm9kdWN0aW9uc186IFswLFszLDJdLFszLDFdLFs2
LDJdLFs2LDNdLFs2LDJdLFs2LDFdLFs2LDFdLFs2LDBdLFs0LDFdLFs0LDJdLFs4LDNdLFs4LDNd
LFs4LDFdLFs4LDFdLFs4LDFdLFs4LDFdLFsxMSwzXSxbOSwzXSxbMTAsM10sWzEyLDNdLFsxMiwz
XSxbMTMsNF0sWzcsMl0sWzE3LDNdLFsxNywxXSxbMzEsMV0sWzMxLDFdLFszMSwxXSxbMzEsMV0s
WzMxLDFdLFszMSwzXSxbMzcsMV0sWzM5LDNdLFsyNiwxXSxbMjYsMV0sWzI2LDFdLFszMCwyXSxb
MjEsMV0sWzQzLDNdLFs0MywxXSxbMjcsMF0sWzI3LDFdLFsyOCwwXSxbMjgsMl0sWzI5LDBdLFsy
OSwxXSxbMzgsMV0sWzM4LDJdXSwKLSAgcGVyZm9ybUFjdGlvbjogZnVuY3Rpb24gYW5vbnltb3Vz
KHl5dGV4dCx5eWxlbmcseXlsaW5lbm8seXkseXlzdGF0ZSwkJCxfJCkgewotCi0gIHZhciAkMCA9
ICQkLmxlbmd0aCAtIDE7Ci0gIHN3aXRjaCAoeXlzdGF0ZSkgewotICBjYXNlIDE6IHJldHVybiBu
ZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMV0sIHRoaXMuXyQpOyAKLSAgYnJlYWs7Ci0gIGNhc2Ug
MjogcmV0dXJuIG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgdGhpcy5fJCk7IAotICBicmVhazsKLSAg
Y2FzZSAzOnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZShbXSwgJCRbJDAtMV0sICQkWyQwXSwg
dGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDQ6dGhpcy4kID0gbmV3IHl5LlByb2dyYW1Ob2Rl
KCQkWyQwLTJdLCAkJFskMC0xXSwgJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2Ug
NTp0aGlzLiQgPSBuZXcgeXkuUHJvZ3JhbU5vZGUoJCRbJDAtMV0sICQkWyQwXSwgW10sIHRoaXMu
XyQpOwotICBicmVhazsKLSAgY2FzZSA2OnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFtTm9kZSgkJFsk
MF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSA3OnRoaXMuJCA9IG5ldyB5eS5Qcm9ncmFt
Tm9kZShbXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDg6dGhpcy4kID0gbmV3IHl5LlBy
b2dyYW1Ob2RlKFtdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgOTp0aGlzLiQgPSBbJCRb
JDBdXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTA6ICQkWyQwLTFdLnB1c2goJCRbJDBdKTsgdGhpcy4k
ID0gJCRbJDAtMV07IAotICBicmVhazsKLSAgY2FzZSAxMTp0aGlzLiQgPSBuZXcgeXkuQmxvY2tO
b2RlKCQkWyQwLTJdLCAkJFskMC0xXS5pbnZlcnNlLCAkJFskMC0xXSwgJCRbJDBdLCB0aGlzLl8k
KTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTI6dGhpcy4kID0gbmV3IHl5LkJsb2NrTm9kZSgkJFskMC0y
XSwgJCRbJDAtMV0sICQkWyQwLTFdLmludmVyc2UsICQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFr
OwotICBjYXNlIDEzOnRoaXMuJCA9ICQkWyQwXTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTQ6dGhpcy4k
ID0gJCRbJDBdOwotICBicmVhazsKLSAgY2FzZSAxNTp0aGlzLiQgPSBuZXcgeXkuQ29udGVudE5v
ZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTY6dGhpcy4kID0gbmV3IHl5
LkNvbW1lbnROb2RlKCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDE3OnRoaXMu
JCA9IG5ldyB5eS5NdXN0YWNoZU5vZGUoJCRbJDAtMV0sIG51bGwsICQkWyQwLTJdLCBzdHJpcEZs
YWdzKCQkWyQwLTJdLCAkJFskMF0pLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTg6dGhp
cy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgkJFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlw
RmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAxOTp0
aGlzLiQgPSB7cGF0aDogJCRbJDAtMV0sIHN0cmlwOiBzdHJpcEZsYWdzKCQkWyQwLTJdLCAkJFsk
MF0pfTsKLSAgYnJlYWs7Ci0gIGNhc2UgMjA6dGhpcy4kID0gbmV3IHl5Lk11c3RhY2hlTm9kZSgk
JFskMC0xXSwgbnVsbCwgJCRbJDAtMl0sIHN0cmlwRmxhZ3MoJCRbJDAtMl0sICQkWyQwXSksIHRo
aXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAyMTp0aGlzLiQgPSBuZXcgeXkuTXVzdGFjaGVOb2Rl
KCQkWyQwLTFdLCBudWxsLCAkJFskMC0yXSwgc3RyaXBGbGFncygkJFskMC0yXSwgJCRbJDBdKSwg
dGhpcy5fJCk7Ci0gIGJyZWFrOwotICBjYXNlIDIyOnRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTm9k
ZSgkJFskMC0yXSwgJCRbJDAtMV0sIHN0cmlwRmxhZ3MoJCRbJDAtM10sICQkWyQwXSksIHRoaXMu
XyQpOwotICBicmVhazsKLSAgY2FzZSAyMzp0aGlzLiQgPSBzdHJpcEZsYWdzKCQkWyQwLTFdLCAk
JFskMF0pOwotICBicmVhazsKLSAgY2FzZSAyNDp0aGlzLiQgPSBuZXcgeXkuU2V4cHJOb2RlKFsk
JFskMC0yXV0uY29uY2F0KCQkWyQwLTFdKSwgJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0g
IGNhc2UgMjU6dGhpcy4kID0gbmV3IHl5LlNleHByTm9kZShbJCRbJDBdXSwgbnVsbCwgdGhpcy5f
JCk7Ci0gIGJyZWFrOwotICBjYXNlIDI2OnRoaXMuJCA9ICQkWyQwXTsKLSAgYnJlYWs7Ci0gIGNh
c2UgMjc6dGhpcy4kID0gbmV3IHl5LlN0cmluZ05vZGUoJCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJl
YWs7Ci0gIGNhc2UgMjg6dGhpcy4kID0gbmV3IHl5LkludGVnZXJOb2RlKCQkWyQwXSwgdGhpcy5f
JCk7Ci0gIGJyZWFrOwotICBjYXNlIDI5OnRoaXMuJCA9IG5ldyB5eS5Cb29sZWFuTm9kZSgkJFsk
MF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAzMDp0aGlzLiQgPSAkJFskMF07Ci0gIGJy
ZWFrOwotICBjYXNlIDMxOiQkWyQwLTFdLmlzSGVscGVyID0gdHJ1ZTsgdGhpcy4kID0gJCRbJDAt
MV07Ci0gIGJyZWFrOwotICBjYXNlIDMyOnRoaXMuJCA9IG5ldyB5eS5IYXNoTm9kZSgkJFskMF0s
IHRoaXMuXyQpOwotICBicmVhazsKLSAgY2FzZSAzMzp0aGlzLiQgPSBbJCRbJDAtMl0sICQkWyQw
XV07Ci0gIGJyZWFrOwotICBjYXNlIDM0OnRoaXMuJCA9IG5ldyB5eS5QYXJ0aWFsTmFtZU5vZGUo
JCRbJDBdLCB0aGlzLl8kKTsKLSAgYnJlYWs7Ci0gIGNhc2UgMzU6dGhpcy4kID0gbmV3IHl5LlBh
cnRpYWxOYW1lTm9kZShuZXcgeXkuU3RyaW5nTm9kZSgkJFskMF0sIHRoaXMuXyQpLCB0aGlzLl8k
KTsKLSAgYnJlYWs7Ci0gIGNhc2UgMzY6dGhpcy4kID0gbmV3IHl5LlBhcnRpYWxOYW1lTm9kZShu
ZXcgeXkuSW50ZWdlck5vZGUoJCRbJDBdLCB0aGlzLl8kKSk7Ci0gIGJyZWFrOwotICBjYXNlIDM3
OnRoaXMuJCA9IG5ldyB5eS5EYXRhTm9kZSgkJFskMF0sIHRoaXMuXyQpOwotICBicmVhazsKLSAg
Y2FzZSAzODp0aGlzLiQgPSBuZXcgeXkuSWROb2RlKCQkWyQwXSwgdGhpcy5fJCk7Ci0gIGJyZWFr
OwotICBjYXNlIDM5OiAkJFskMC0yXS5wdXNoKHtwYXJ0OiAkJFskMF0sIHNlcGFyYXRvcjogJCRb
JDAtMV19KTsgdGhpcy4kID0gJCRbJDAtMl07IAotICBicmVhazsKLSAgY2FzZSA0MDp0aGlzLiQg
PSBbe3BhcnQ6ICQkWyQwXX1dOwotICBicmVhazsKLSAgY2FzZSA0Mzp0aGlzLiQgPSBbXTsKLSAg
YnJlYWs7Ci0gIGNhc2UgNDQ6JCRbJDAtMV0ucHVzaCgkJFskMF0pOwotICBicmVhazsKLSAgY2Fz
ZSA0Nzp0aGlzLiQgPSBbJCRbJDBdXTsKLSAgYnJlYWs7Ci0gIGNhc2UgNDg6JCRbJDAtMV0ucHVz
aCgkJFskMF0pOwotICBicmVhazsKLSAgfQotICB9LAotICB0YWJsZTogW3szOjEsNDoyLDU6WzEs
M10sODo0LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5
OlsxLDExXSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1OlsxLDE1XX0sezE6WzNdfSx7NTpbMSwxNl0s
ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpb
MSwxMV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxOlsyLDJdfSx7NTpbMiw5XSwx
NDpbMiw5XSwxNTpbMiw5XSwxNjpbMiw5XSwxOTpbMiw5XSwyMDpbMiw5XSwyMjpbMiw5XSwyMzpb
Miw5XSwyNTpbMiw5XX0sezQ6MjAsNjoxOCw3OjE5LDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6
WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwyMV0sMjA6WzIsOF0sMjI6WzEsMTNdLDIz
OlsxLDE0XSwyNTpbMSwxNV19LHs0OjIwLDY6MjIsNzoxOSw4OjQsOTo1LDExOjYsMTI6NywxMzo4
LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0sMTk6WzEsMjFdLDIwOlsyLDhdLDIyOlsxLDEz
XSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NTpbMiwxM10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxNjpb
MiwxM10sMTk6WzIsMTNdLDIwOlsyLDEzXSwyMjpbMiwxM10sMjM6WzIsMTNdLDI1OlsyLDEzXX0s
ezU6WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwxNF0sMTY6WzIsMTRdLDE5OlsyLDE0XSwyMDpbMiwx
NF0sMjI6WzIsMTRdLDIzOlsyLDE0XSwyNTpbMiwxNF19LHs1OlsyLDE1XSwxNDpbMiwxNV0sMTU6
WzIsMTVdLDE2OlsyLDE1XSwxOTpbMiwxNV0sMjA6WzIsMTVdLDIyOlsyLDE1XSwyMzpbMiwxNV0s
MjU6WzIsMTVdfSx7NTpbMiwxNl0sMTQ6WzIsMTZdLDE1OlsyLDE2XSwxNjpbMiwxNl0sMTk6WzIs
MTZdLDIwOlsyLDE2XSwyMjpbMiwxNl0sMjM6WzIsMTZdLDI1OlsyLDE2XX0sezE3OjIzLDIxOjI0
LDMwOjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9LHsxNzoyOSwyMToyNCwzMDoyNSw0MDpb
MSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTc6MzAsMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQyOlsx
LDI3XSw0MzoyNn0sezE3OjMxLDIxOjI0LDMwOjI1LDQwOlsxLDI4XSw0MjpbMSwyN10sNDM6MjZ9
LHsyMTozMywyNjozMiwzMjpbMSwzNF0sMzM6WzEsMzVdLDQwOlsxLDI4XSw0MzoyNn0sezE6WzIs
MV19LHs1OlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIsMTBdLDE2OlsyLDEwXSwxOTpbMiwxMF0sMjA6
WzIsMTBdLDIyOlsyLDEwXSwyMzpbMiwxMF0sMjU6WzIsMTBdfSx7MTA6MzYsMjA6WzEsMzddfSx7
NDozOCw4OjQsOTo1LDExOjYsMTI6NywxMzo4LDE0OlsxLDldLDE1OlsxLDEwXSwxNjpbMSwxMl0s
MTk6WzEsMTFdLDIwOlsyLDddLDIyOlsxLDEzXSwyMzpbMSwxNF0sMjU6WzEsMTVdfSx7NzozOSw4
OjE3LDk6NSwxMTo2LDEyOjcsMTM6OCwxNDpbMSw5XSwxNTpbMSwxMF0sMTY6WzEsMTJdLDE5Olsx
LDIxXSwyMDpbMiw2XSwyMjpbMSwxM10sMjM6WzEsMTRdLDI1OlsxLDE1XX0sezE3OjIzLDE4Olsx
LDQwXSwyMToyNCwzMDoyNSw0MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTA6NDEsMjA6WzEs
MzddfSx7MTg6WzEsNDJdfSx7MTg6WzIsNDNdLDI0OlsyLDQzXSwyODo0MywzMjpbMiw0M10sMzM6
WzIsNDNdLDM0OlsyLDQzXSwzNTpbMiw0M10sMzY6WzIsNDNdLDQwOlsyLDQzXSw0MjpbMiw0M119
LHsxODpbMiwyNV0sMjQ6WzIsMjVdLDM2OlsyLDI1XX0sezE4OlsyLDM4XSwyNDpbMiwzOF0sMzI6
WzIsMzhdLDMzOlsyLDM4XSwzNDpbMiwzOF0sMzU6WzIsMzhdLDM2OlsyLDM4XSw0MDpbMiwzOF0s
NDI6WzIsMzhdLDQ0OlsxLDQ0XX0sezIxOjQ1LDQwOlsxLDI4XSw0MzoyNn0sezE4OlsyLDQwXSwy
NDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQwXSwzNDpbMiw0MF0sMzU6WzIsNDBdLDM2OlsyLDQw
XSw0MDpbMiw0MF0sNDI6WzIsNDBdLDQ0OlsyLDQwXX0sezE4OlsxLDQ2XX0sezE4OlsxLDQ3XX0s
ezI0OlsxLDQ4XX0sezE4OlsyLDQxXSwyMTo1MCwyNzo0OSw0MDpbMSwyOF0sNDM6MjZ9LHsxODpb
MiwzNF0sNDA6WzIsMzRdfSx7MTg6WzIsMzVdLDQwOlsyLDM1XX0sezE4OlsyLDM2XSw0MDpbMiwz
Nl19LHs1OlsyLDExXSwxNDpbMiwxMV0sMTU6WzIsMTFdLDE2OlsyLDExXSwxOTpbMiwxMV0sMjA6
WzIsMTFdLDIyOlsyLDExXSwyMzpbMiwxMV0sMjU6WzIsMTFdfSx7MjE6NTEsNDA6WzEsMjhdLDQz
OjI2fSx7ODoxNyw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEy
XSwxOTpbMSwxMV0sMjA6WzIsM10sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHs0OjUy
LDg6NCw5OjUsMTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpb
MSwxMV0sMjA6WzIsNV0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxNDpbMiwyM10s
MTU6WzIsMjNdLDE2OlsyLDIzXSwxOTpbMiwyM10sMjA6WzIsMjNdLDIyOlsyLDIzXSwyMzpbMiwy
M10sMjU6WzIsMjNdfSx7NTpbMiwxMl0sMTQ6WzIsMTJdLDE1OlsyLDEyXSwxNjpbMiwxMl0sMTk6
WzIsMTJdLDIwOlsyLDEyXSwyMjpbMiwxMl0sMjM6WzIsMTJdLDI1OlsyLDEyXX0sezE0OlsyLDE4
XSwxNTpbMiwxOF0sMTY6WzIsMThdLDE5OlsyLDE4XSwyMDpbMiwxOF0sMjI6WzIsMThdLDIzOlsy
LDE4XSwyNTpbMiwxOF19LHsxODpbMiw0NV0sMjE6NTYsMjQ6WzIsNDVdLDI5OjUzLDMwOjYwLDMx
OjU0LDMyOlsxLDU3XSwzMzpbMSw1OF0sMzQ6WzEsNTldLDM1OlsxLDYxXSwzNjpbMiw0NV0sMzc6
NTUsMzg6NjIsMzk6NjMsNDA6WzEsNjRdLDQyOlsxLDI3XSw0MzoyNn0sezQwOlsxLDY1XX0sezE4
OlsyLDM3XSwyNDpbMiwzN10sMzI6WzIsMzddLDMzOlsyLDM3XSwzNDpbMiwzN10sMzU6WzIsMzdd
LDM2OlsyLDM3XSw0MDpbMiwzN10sNDI6WzIsMzddfSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxNjpb
MiwxN10sMTk6WzIsMTddLDIwOlsyLDE3XSwyMjpbMiwxN10sMjM6WzIsMTddLDI1OlsyLDE3XX0s
ezU6WzIsMjBdLDE0OlsyLDIwXSwxNTpbMiwyMF0sMTY6WzIsMjBdLDE5OlsyLDIwXSwyMDpbMiwy
MF0sMjI6WzIsMjBdLDIzOlsyLDIwXSwyNTpbMiwyMF19LHs1OlsyLDIxXSwxNDpbMiwyMV0sMTU6
WzIsMjFdLDE2OlsyLDIxXSwxOTpbMiwyMV0sMjA6WzIsMjFdLDIyOlsyLDIxXSwyMzpbMiwyMV0s
MjU6WzIsMjFdfSx7MTg6WzEsNjZdfSx7MTg6WzIsNDJdfSx7MTg6WzEsNjddfSx7ODoxNyw5OjUs
MTE6NiwxMjo3LDEzOjgsMTQ6WzEsOV0sMTU6WzEsMTBdLDE2OlsxLDEyXSwxOTpbMSwxMV0sMjA6
WzIsNF0sMjI6WzEsMTNdLDIzOlsxLDE0XSwyNTpbMSwxNV19LHsxODpbMiwyNF0sMjQ6WzIsMjRd
LDM2OlsyLDI0XX0sezE4OlsyLDQ0XSwyNDpbMiw0NF0sMzI6WzIsNDRdLDMzOlsyLDQ0XSwzNDpb
Miw0NF0sMzU6WzIsNDRdLDM2OlsyLDQ0XSw0MDpbMiw0NF0sNDI6WzIsNDRdfSx7MTg6WzIsNDZd
LDI0OlsyLDQ2XSwzNjpbMiw0Nl19LHsxODpbMiwyNl0sMjQ6WzIsMjZdLDMyOlsyLDI2XSwzMzpb
MiwyNl0sMzQ6WzIsMjZdLDM1OlsyLDI2XSwzNjpbMiwyNl0sNDA6WzIsMjZdLDQyOlsyLDI2XX0s
ezE4OlsyLDI3XSwyNDpbMiwyN10sMzI6WzIsMjddLDMzOlsyLDI3XSwzNDpbMiwyN10sMzU6WzIs
MjddLDM2OlsyLDI3XSw0MDpbMiwyN10sNDI6WzIsMjddfSx7MTg6WzIsMjhdLDI0OlsyLDI4XSwz
MjpbMiwyOF0sMzM6WzIsMjhdLDM0OlsyLDI4XSwzNTpbMiwyOF0sMzY6WzIsMjhdLDQwOlsyLDI4
XSw0MjpbMiwyOF19LHsxODpbMiwyOV0sMjQ6WzIsMjldLDMyOlsyLDI5XSwzMzpbMiwyOV0sMzQ6
WzIsMjldLDM1OlsyLDI5XSwzNjpbMiwyOV0sNDA6WzIsMjldLDQyOlsyLDI5XX0sezE4OlsyLDMw
XSwyNDpbMiwzMF0sMzI6WzIsMzBdLDMzOlsyLDMwXSwzNDpbMiwzMF0sMzU6WzIsMzBdLDM2Olsy
LDMwXSw0MDpbMiwzMF0sNDI6WzIsMzBdfSx7MTc6NjgsMjE6MjQsMzA6MjUsNDA6WzEsMjhdLDQy
OlsxLDI3XSw0MzoyNn0sezE4OlsyLDMyXSwyNDpbMiwzMl0sMzY6WzIsMzJdLDM5OjY5LDQwOlsx
LDcwXX0sezE4OlsyLDQ3XSwyNDpbMiw0N10sMzY6WzIsNDddLDQwOlsyLDQ3XX0sezE4OlsyLDQw
XSwyNDpbMiw0MF0sMzI6WzIsNDBdLDMzOlsyLDQwXSwzNDpbMiw0MF0sMzU6WzIsNDBdLDM2Olsy
LDQwXSw0MDpbMiw0MF0sNDE6WzEsNzFdLDQyOlsyLDQwXSw0NDpbMiw0MF19LHsxODpbMiwzOV0s
MjQ6WzIsMzldLDMyOlsyLDM5XSwzMzpbMiwzOV0sMzQ6WzIsMzldLDM1OlsyLDM5XSwzNjpbMiwz
OV0sNDA6WzIsMzldLDQyOlsyLDM5XSw0NDpbMiwzOV19LHs1OlsyLDIyXSwxNDpbMiwyMl0sMTU6
WzIsMjJdLDE2OlsyLDIyXSwxOTpbMiwyMl0sMjA6WzIsMjJdLDIyOlsyLDIyXSwyMzpbMiwyMl0s
MjU6WzIsMjJdfSx7NTpbMiwxOV0sMTQ6WzIsMTldLDE1OlsyLDE5XSwxNjpbMiwxOV0sMTk6WzIs
MTldLDIwOlsyLDE5XSwyMjpbMiwxOV0sMjM6WzIsMTldLDI1OlsyLDE5XX0sezM2OlsxLDcyXX0s
ezE4OlsyLDQ4XSwyNDpbMiw0OF0sMzY6WzIsNDhdLDQwOlsyLDQ4XX0sezQxOlsxLDcxXX0sezIx
OjU2LDMwOjYwLDMxOjczLDMyOlsxLDU3XSwzMzpbMSw1OF0sMzQ6WzEsNTldLDM1OlsxLDYxXSw0
MDpbMSwyOF0sNDI6WzEsMjddLDQzOjI2fSx7MTg6WzIsMzFdLDI0OlsyLDMxXSwzMjpbMiwzMV0s
MzM6WzIsMzFdLDM0OlsyLDMxXSwzNTpbMiwzMV0sMzY6WzIsMzFdLDQwOlsyLDMxXSw0MjpbMiwz
MV19LHsxODpbMiwzM10sMjQ6WzIsMzNdLDM2OlsyLDMzXSw0MDpbMiwzM119XSwKLSAgZGVmYXVs
dEFjdGlvbnM6IHszOlsyLDJdLDE2OlsyLDFdLDUwOlsyLDQyXX0sCi0gIHBhcnNlRXJyb3I6IGZ1
bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3Ioc3Ry
KTsKLSAgfSwKLSAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7Ci0gICAgICB2YXIgc2Vs
ZiA9IHRoaXMsIHN0YWNrID0gWzBdLCB2c3RhY2sgPSBbbnVsbF0sIGxzdGFjayA9IFtdLCB0YWJs
ZSA9IHRoaXMudGFibGUsIHl5dGV4dCA9ICIiLCB5eWxpbmVubyA9IDAsIHl5bGVuZyA9IDAsIHJl
Y292ZXJpbmcgPSAwLCBURVJST1IgPSAyLCBFT0YgPSAxOwotICAgICAgdGhpcy5sZXhlci5zZXRJ
bnB1dChpbnB1dCk7Ci0gICAgICB0aGlzLmxleGVyLnl5ID0gdGhpcy55eTsKLSAgICAgIHRoaXMu
eXkubGV4ZXIgPSB0aGlzLmxleGVyOwotICAgICAgdGhpcy55eS5wYXJzZXIgPSB0aGlzOwotICAg
ICAgaWYgKHR5cGVvZiB0aGlzLmxleGVyLnl5bGxvYyA9PSAidW5kZWZpbmVkIikKLSAgICAgICAg
ICB0aGlzLmxleGVyLnl5bGxvYyA9IHt9OwotICAgICAgdmFyIHl5bG9jID0gdGhpcy5sZXhlci55
eWxsb2M7Ci0gICAgICBsc3RhY2sucHVzaCh5eWxvYyk7Ci0gICAgICB2YXIgcmFuZ2VzID0gdGhp
cy5sZXhlci5vcHRpb25zICYmIHRoaXMubGV4ZXIub3B0aW9ucy5yYW5nZXM7Ci0gICAgICBpZiAo
dHlwZW9mIHRoaXMueXkucGFyc2VFcnJvciA9PT0gImZ1bmN0aW9uIikKLSAgICAgICAgICB0aGlz
LnBhcnNlRXJyb3IgPSB0aGlzLnl5LnBhcnNlRXJyb3I7Ci0gICAgICBmdW5jdGlvbiBwb3BTdGFj
ayhuKSB7Ci0gICAgICAgICAgc3RhY2subGVuZ3RoID0gc3RhY2subGVuZ3RoIC0gMiAqIG47Ci0g
ICAgICAgICAgdnN0YWNrLmxlbmd0aCA9IHZzdGFjay5sZW5ndGggLSBuOwotICAgICAgICAgIGxz
dGFjay5sZW5ndGggPSBsc3RhY2subGVuZ3RoIC0gbjsKLSAgICAgIH0KLSAgICAgIGZ1bmN0aW9u
IGxleCgpIHsKLSAgICAgICAgICB2YXIgdG9rZW47Ci0gICAgICAgICAgdG9rZW4gPSBzZWxmLmxl
eGVyLmxleCgpIHx8IDE7Ci0gICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gIm51bWJlciIp
IHsKLSAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjsK
LSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgfQotICAgICAgdmFy
IHN5bWJvbCwgcHJlRXJyb3JTeW1ib2wsIHN0YXRlLCBhY3Rpb24sIGEsIHIsIHl5dmFsID0ge30s
IHAsIGxlbiwgbmV3U3RhdGUsIGV4cGVjdGVkOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwotICAgICAgICAgIGlmICh0aGlz
LmRlZmF1bHRBY3Rpb25zW3N0YXRlXSkgewotICAgICAgICAgICAgICBhY3Rpb24gPSB0aGlzLmRl
ZmF1bHRBY3Rpb25zW3N0YXRlXTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBp
ZiAoc3ltYm9sID09PSBudWxsIHx8IHR5cGVvZiBzeW1ib2wgPT0gInVuZGVmaW5lZCIpIHsKLSAg
ICAgICAgICAgICAgICAgIHN5bWJvbCA9IGxleCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgIGFjdGlvbiA9IHRhYmxlW3N0YXRlXSAmJiB0YWJsZVtzdGF0ZV1bc3ltYm9sXTsKLSAg
ICAgICAgICB9Ci0gICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICJ1bmRlZmluZWQiIHx8
ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0pIHsKLSAgICAgICAgICAgICAgdmFyIGVyclN0
ciA9ICIiOwotICAgICAgICAgICAgICBpZiAoIXJlY292ZXJpbmcpIHsKLSAgICAgICAgICAgICAg
ICAgIGV4cGVjdGVkID0gW107Ci0gICAgICAgICAgICAgICAgICBmb3IgKHAgaW4gdGFibGVbc3Rh
dGVdKQotICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+
IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaCgiJyIgKyB0aGlz
LnRlcm1pbmFsc19bcF0gKyAiJyIpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgIGlmICh0aGlzLmxleGVyLnNob3dQb3NpdGlvbikgewotICAgICAgICAgICAgICAg
ICAgICAgIGVyclN0ciA9ICJQYXJzZSBlcnJvciBvbiBsaW5lICIgKyAoeXlsaW5lbm8gKyAxKSAr
ICI6XG4iICsgdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKSArICJcbkV4cGVjdGluZyAiICsgZXhw
ZWN0ZWQuam9pbigiLCAiKSArICIsIGdvdCAnIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8
fCBzeW1ib2wpICsgIiciOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgICBlcnJTdHIgPSAiUGFyc2UgZXJyb3Igb24gbGluZSAiICsgKHl5bGluZW5vICsg
MSkgKyAiOiBVbmV4cGVjdGVkICIgKyAoc3ltYm9sID09IDE/ImVuZCBvZiBpbnB1dCI6IiciICsg
KHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyAiJyIpOwotICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwge3RleHQ6
IHRoaXMubGV4ZXIubWF0Y2gsIHRva2VuOiB0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1i
b2wsIGxpbmU6IHRoaXMubGV4ZXIueXlsaW5lbm8sIGxvYzogeXlsb2MsIGV4cGVjdGVkOiBleHBl
Y3RlZH0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhY3Rp
b25bMF0gaW5zdGFuY2VvZiBBcnJheSAmJiBhY3Rpb24ubGVuZ3RoID4gMSkgewotICAgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3Np
YmxlIGF0IHN0YXRlOiAiICsgc3RhdGUgKyAiLCB0b2tlbjogIiArIHN5bWJvbCk7Ci0gICAgICAg
ICAgfQotICAgICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7Ci0gICAgICAgICAgY2FzZSAxOgot
ICAgICAgICAgICAgICBzdGFjay5wdXNoKHN5bWJvbCk7Ci0gICAgICAgICAgICAgIHZzdGFjay5w
dXNoKHRoaXMubGV4ZXIueXl0ZXh0KTsKLSAgICAgICAgICAgICAgbHN0YWNrLnB1c2godGhpcy5s
ZXhlci55eWxsb2MpOwotICAgICAgICAgICAgICBzdGFjay5wdXNoKGFjdGlvblsxXSk7Ci0gICAg
ICAgICAgICAgIHN5bWJvbCA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmICghcHJlRXJyb3JTeW1i
b2wpIHsKLSAgICAgICAgICAgICAgICAgIHl5bGVuZyA9IHRoaXMubGV4ZXIueXlsZW5nOwotICAg
ICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7Ci0gICAgICAgICAgICAg
ICAgICB5eWxpbmVubyA9IHRoaXMubGV4ZXIueXlsaW5lbm87Ci0gICAgICAgICAgICAgICAgICB5
eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jOwotICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJp
bmcgPiAwKQotICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXJpbmctLTsKLSAgICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sOwot
ICAgICAgICAgICAgICAgICAgcHJlRXJyb3JTeW1ib2wgPSBudWxsOwotICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAg
bGVuID0gdGhpcy5wcm9kdWN0aW9uc19bYWN0aW9uWzFdXVsxXTsKLSAgICAgICAgICAgICAgeXl2
YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTsKLSAgICAgICAgICAgICAgeXl2YWwu
XyQgPSB7Zmlyc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJz
dF9saW5lLCBsYXN0X2xpbmU6IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gMV0ubGFzdF9saW5lLCBm
aXJzdF9jb2x1bW46IGxzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0uZmlyc3RfY29s
dW1uLCBsYXN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2NvbHVtbn07
Ci0gICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKLSAgICAgICAgICAgICAgICAgIHl5dmFsLl8k
LnJhbmdlID0gW2xzdGFja1tsc3RhY2subGVuZ3RoIC0gKGxlbiB8fCAxKV0ucmFuZ2VbMF0sIGxz
dGFja1tsc3RhY2subGVuZ3RoIC0gMV0ucmFuZ2VbMV1dOwotICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgIHIgPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh5eXZhbCwgeXl0ZXh0LCB5eWxl
bmcsIHl5bGluZW5vLCB0aGlzLnl5LCBhY3Rpb25bMV0sIHZzdGFjaywgbHN0YWNrKTsKLSAgICAg
ICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAidW5kZWZpbmVkIikgewotICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGxlbikgewot
ICAgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5zbGljZSgwLCAtMSAqIGxlbiAqIDIpOwot
ICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTsKLSAg
ICAgICAgICAgICAgICAgIGxzdGFjayA9IGxzdGFjay5zbGljZSgwLCAtMSAqIGxlbik7Ci0gICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1th
Y3Rpb25bMV1dWzBdKTsKLSAgICAgICAgICAgICAgdnN0YWNrLnB1c2goeXl2YWwuJCk7Ci0gICAg
ICAgICAgICAgIGxzdGFjay5wdXNoKHl5dmFsLl8kKTsKLSAgICAgICAgICAgICAgbmV3U3RhdGUg
PSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1d
OwotICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB9OwotCi0KLSAgZnVu
Y3Rpb24gc3RyaXBGbGFncyhvcGVuLCBjbG9zZSkgewotICAgIHJldHVybiB7Ci0gICAgICBsZWZ0
OiBvcGVuLmNoYXJBdCgyKSA9PT0gJ34nLAotICAgICAgcmlnaHQ6IGNsb3NlLmNoYXJBdCgwKSA9
PT0gJ34nIHx8IGNsb3NlLmNoYXJBdCgxKSA9PT0gJ34nCi0gICAgfTsKLSAgfQotCi0gIC8qIEpp
c29uIGdlbmVyYXRlZCBsZXhlciAqLwotICB2YXIgbGV4ZXIgPSAoZnVuY3Rpb24oKXsKLSAgdmFy
IGxleGVyID0gKHtFT0Y6MSwKLSAgcGFyc2VFcnJvcjpmdW5jdGlvbiBwYXJzZUVycm9yKHN0ciwg
aGFzaCkgewotICAgICAgICAgIGlmICh0aGlzLnl5LnBhcnNlcikgewotICAgICAgICAgICAgICB0
aGlzLnl5LnBhcnNlci5wYXJzZUVycm9yKHN0ciwgaGFzaCk7Ci0gICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0cik7Ci0gICAgICAgICAgfQotICAgICAg
fSwKLSAgc2V0SW5wdXQ6ZnVuY3Rpb24gKGlucHV0KSB7Ci0gICAgICAgICAgdGhpcy5faW5wdXQg
PSBpbnB1dDsKLSAgICAgICAgICB0aGlzLl9tb3JlID0gdGhpcy5fbGVzcyA9IHRoaXMuZG9uZSA9
IGZhbHNlOwotICAgICAgICAgIHRoaXMueXlsaW5lbm8gPSB0aGlzLnl5bGVuZyA9IDA7Ci0gICAg
ICAgICAgdGhpcy55eXRleHQgPSB0aGlzLm1hdGNoZWQgPSB0aGlzLm1hdGNoID0gJyc7Ci0gICAg
ICAgICAgdGhpcy5jb25kaXRpb25TdGFjayA9IFsnSU5JVElBTCddOwotICAgICAgICAgIHRoaXMu
eXlsbG9jID0ge2ZpcnN0X2xpbmU6MSxmaXJzdF9jb2x1bW46MCxsYXN0X2xpbmU6MSxsYXN0X2Nv
bHVtbjowfTsKLSAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2Mu
cmFuZ2UgPSBbMCwwXTsKLSAgICAgICAgICB0aGlzLm9mZnNldCA9IDA7Ci0gICAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgICB9LAotICBpbnB1dDpmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgdmFy
IGNoID0gdGhpcy5faW5wdXRbMF07Ci0gICAgICAgICAgdGhpcy55eXRleHQgKz0gY2g7Ci0gICAg
ICAgICAgdGhpcy55eWxlbmcrKzsKLSAgICAgICAgICB0aGlzLm9mZnNldCsrOwotICAgICAgICAg
IHRoaXMubWF0Y2ggKz0gY2g7Ci0gICAgICAgICAgdGhpcy5tYXRjaGVkICs9IGNoOwotICAgICAg
ICAgIHZhciBsaW5lcyA9IGNoLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKLSAgICAgICAgICBp
ZiAobGluZXMpIHsKLSAgICAgICAgICAgICAgdGhpcy55eWxpbmVubysrOwotICAgICAgICAgICAg
ICB0aGlzLnl5bGxvYy5sYXN0X2xpbmUrKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBp
ZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2VbMV0rKzsKLQotICAgICAg
ICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UoMSk7Ci0gICAgICAgICAgcmV0dXJu
IGNoOwotICAgICAgfSwKLSAgdW5wdXQ6ZnVuY3Rpb24gKGNoKSB7Ci0gICAgICAgICAgdmFyIGxl
biA9IGNoLmxlbmd0aDsKLSAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XHJcbj98
XG4pL2cpOwotCi0gICAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0OwotICAg
ICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxl
bmd0aC1sZW4tMSk7Ci0gICAgICAgICAgLy90aGlzLnl5bGVuZyAtPSBsZW47Ci0gICAgICAgICAg
dGhpcy5vZmZzZXQgLT0gbGVuOwotICAgICAgICAgIHZhciBvbGRMaW5lcyA9IHRoaXMubWF0Y2gu
c3BsaXQoLyg/OlxyXG4/fFxuKS9nKTsKLSAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy5tYXRj
aC5zdWJzdHIoMCwgdGhpcy5tYXRjaC5sZW5ndGgtMSk7Ci0gICAgICAgICAgdGhpcy5tYXRjaGVk
ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoLTEpOwotCi0gICAg
ICAgICAgaWYgKGxpbmVzLmxlbmd0aC0xKSB0aGlzLnl5bGluZW5vIC09IGxpbmVzLmxlbmd0aC0x
OwotICAgICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7Ci0KLSAgICAgICAgICB0aGlz
Lnl5bGxvYyA9IHtmaXJzdF9saW5lOiB0aGlzLnl5bGxvYy5maXJzdF9saW5lLAotICAgICAgICAg
ICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vKzEsCi0gICAgICAgICAgICBmaXJzdF9jb2x1bW46
IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiwKLSAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5l
cyA/Ci0gICAgICAgICAgICAgICAgKGxpbmVzLmxlbmd0aCA9PT0gb2xkTGluZXMubGVuZ3RoID8g
dGhpcy55eWxsb2MuZmlyc3RfY29sdW1uIDogMCkgKyBvbGRMaW5lc1tvbGRMaW5lcy5sZW5ndGgg
LSBsaW5lcy5sZW5ndGhdLmxlbmd0aCAtIGxpbmVzWzBdLmxlbmd0aDoKLSAgICAgICAgICAgICAg
ICB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW4KLSAgICAgICAgICAgIH07Ci0KLSAgICAg
ICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgewotICAgICAgICAgICAgICB0aGlzLnl5bGxv
Yy5yYW5nZSA9IFtyWzBdLCByWzBdICsgdGhpcy55eWxlbmcgLSBsZW5dOwotICAgICAgICAgIH0K
LSAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0sCi0gIG1vcmU6ZnVuY3Rpb24gKCkgewot
ICAgICAgICAgIHRoaXMuX21vcmUgPSB0cnVlOwotICAgICAgICAgIHJldHVybiB0aGlzOwotICAg
ICAgfSwKLSAgbGVzczpmdW5jdGlvbiAobikgewotICAgICAgICAgIHRoaXMudW5wdXQodGhpcy5t
YXRjaC5zbGljZShuKSk7Ci0gICAgICB9LAotICBwYXN0SW5wdXQ6ZnVuY3Rpb24gKCkgewotICAg
ICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVu
Z3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpOwotICAgICAgICAgIHJldHVybiAocGFzdC5sZW5ndGgg
PiAyMCA/ICcuLi4nOicnKSArIHBhc3Quc3Vic3RyKC0yMCkucmVwbGFjZSgvXG4vZywgIiIpOwot
ICAgICAgfSwKLSAgdXBjb21pbmdJbnB1dDpmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgdmFyIG5l
eHQgPSB0aGlzLm1hdGNoOwotICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7Ci0gICAg
ICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQuc3Vic3RyKDAsIDIwLW5leHQubGVuZ3RoKTsK
LSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIChuZXh0LnN1YnN0cigwLDIwKSsobmV4dC5s
ZW5ndGggPiAyMCA/ICcuLi4nOicnKSkucmVwbGFjZSgvXG4vZywgIiIpOwotICAgICAgfSwKLSAg
c2hvd1Bvc2l0aW9uOmZ1bmN0aW9uICgpIHsKLSAgICAgICAgICB2YXIgcHJlID0gdGhpcy5wYXN0
SW5wdXQoKTsKLSAgICAgICAgICB2YXIgYyA9IG5ldyBBcnJheShwcmUubGVuZ3RoICsgMSkuam9p
bigiLSIpOwotICAgICAgICAgIHJldHVybiBwcmUgKyB0aGlzLnVwY29taW5nSW5wdXQoKSArICJc
biIgKyBjKyJeIjsKLSAgICAgIH0sCi0gIG5leHQ6ZnVuY3Rpb24gKCkgewotICAgICAgICAgIGlm
ICh0aGlzLmRvbmUpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAgICAg
IH0KLSAgICAgICAgICBpZiAoIXRoaXMuX2lucHV0KSB0aGlzLmRvbmUgPSB0cnVlOwotCi0gICAg
ICAgICAgdmFyIHRva2VuLAotICAgICAgICAgICAgICBtYXRjaCwKLSAgICAgICAgICAgICAgdGVt
cE1hdGNoLAotICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgY29sLAotICAgICAg
ICAgICAgICBsaW5lczsKLSAgICAgICAgICBpZiAoIXRoaXMuX21vcmUpIHsKLSAgICAgICAgICAg
ICAgdGhpcy55eXRleHQgPSAnJzsKLSAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9ICcnOwotICAg
ICAgICAgIH0KLSAgICAgICAgICB2YXIgcnVsZXMgPSB0aGlzLl9jdXJyZW50UnVsZXMoKTsKLSAg
ICAgICAgICBmb3IgKHZhciBpPTA7aSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAg
ICAgIHRlbXBNYXRjaCA9IHRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbcnVsZXNbaV1dKTsK
LSAgICAgICAgICAgICAgaWYgKHRlbXBNYXRjaCAmJiAoIW1hdGNoIHx8IHRlbXBNYXRjaFswXS5s
ZW5ndGggPiBtYXRjaFswXS5sZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgICBtYXRjaCA9IHRl
bXBNYXRjaDsKLSAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAg
IGlmICghdGhpcy5vcHRpb25zLmZsZXgpIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgfQotICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICBsaW5lcyA9IG1hdGNo
WzBdLm1hdGNoKC8oPzpcclxuP3xcbikuKi9nKTsKLSAgICAgICAgICAgICAgaWYgKGxpbmVzKSB0
aGlzLnl5bGluZW5vICs9IGxpbmVzLmxlbmd0aDsKLSAgICAgICAgICAgICAgdGhpcy55eWxsb2Mg
PSB7Zmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBsYXN0X2xpbmU6IHRoaXMueXlsaW5lbm8rMSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9jb2x1bW46IGxpbmVzID8gbGluZXNbbGluZXMu
bGVuZ3RoLTFdLmxlbmd0aC1saW5lc1tsaW5lcy5sZW5ndGgtMV0ubWF0Y2goL1xyP1xuPy8pWzBd
Lmxlbmd0aCA6IHRoaXMueXlsbG9jLmxhc3RfY29sdW1uICsgbWF0Y2hbMF0ubGVuZ3RofTsKLSAg
ICAgICAgICAgICAgdGhpcy55eXRleHQgKz0gbWF0Y2hbMF07Ci0gICAgICAgICAgICAgIHRoaXMu
bWF0Y2ggKz0gbWF0Y2hbMF07Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG1hdGNoOwot
ICAgICAgICAgICAgICB0aGlzLnl5bGVuZyA9IHRoaXMueXl0ZXh0Lmxlbmd0aDsKLSAgICAgICAg
ICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHsKLSAgICAgICAgICAgICAgICAgIHRoaXMu
eXlsbG9jLnJhbmdlID0gW3RoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArPSB0aGlzLnl5bGVuZ107
Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGhpcy5fbW9yZSA9IGZhbHNlOwotICAg
ICAgICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2lucHV0LnNsaWNlKG1hdGNoWzBdLmxlbmd0
aCk7Ci0gICAgICAgICAgICAgIHRoaXMubWF0Y2hlZCArPSBtYXRjaFswXTsKLSAgICAgICAgICAg
ICAgdG9rZW4gPSB0aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLCB0aGlzLnl5LCB0aGlzLCBy
dWxlc1tpbmRleF0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0
aC0xXSk7Ci0gICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgdGhpcy5faW5wdXQpIHRoaXMu
ZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAodG9rZW4pIHJldHVybiB0b2tlbjsKLSAg
ICAgICAgICAgICAgZWxzZSByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh0aGlz
Ll9pbnB1dCA9PT0gIiIpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRU9GOwotICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXJyb3IoJ0xleGlj
YWwgZXJyb3Igb24gbGluZSAnKyh0aGlzLnl5bGluZW5vKzEpKycuIFVucmVjb2duaXplZCB0ZXh0
LlxuJyt0aGlzLnNob3dQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgIHt0ZXh0OiAi
IiwgdG9rZW46IG51bGwsIGxpbmU6IHRoaXMueXlsaW5lbm99KTsKLSAgICAgICAgICB9Ci0gICAg
ICB9LAotICBsZXg6ZnVuY3Rpb24gbGV4KCkgewotICAgICAgICAgIHZhciByID0gdGhpcy5uZXh0
KCk7Ci0gICAgICAgICAgaWYgKHR5cGVvZiByICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAg
ICAgICByZXR1cm4gcjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4g
dGhpcy5sZXgoKTsKLSAgICAgICAgICB9Ci0gICAgICB9LAotICBiZWdpbjpmdW5jdGlvbiBiZWdp
bihjb25kaXRpb24pIHsKLSAgICAgICAgICB0aGlzLmNvbmRpdGlvblN0YWNrLnB1c2goY29uZGl0
aW9uKTsKLSAgICAgIH0sCi0gIHBvcFN0YXRlOmZ1bmN0aW9uIHBvcFN0YXRlKCkgewotICAgICAg
ICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblN0YWNrLnBvcCgpOwotICAgICAgfSwKLSAgX2N1cnJl
bnRSdWxlczpmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkgewotICAgICAgICAgIHJldHVybiB0aGlz
LmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0
aC0xXV0ucnVsZXM7Ci0gICAgICB9LAotICB0b3BTdGF0ZTpmdW5jdGlvbiAoKSB7Ci0gICAgICAg
ICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgt
Ml07Ci0gICAgICB9LAotICBwdXNoU3RhdGU6ZnVuY3Rpb24gYmVnaW4oY29uZGl0aW9uKSB7Ci0g
ICAgICAgICAgdGhpcy5iZWdpbihjb25kaXRpb24pOwotICAgICAgfX0pOwotICBsZXhlci5vcHRp
b25zID0ge307Ci0gIGxleGVyLnBlcmZvcm1BY3Rpb24gPSBmdW5jdGlvbiBhbm9ueW1vdXMoeXks
eXlfLCRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsWVlfU1RBUlQpIHsKLQotCi0gIGZ1bmN0aW9u
IHN0cmlwKHN0YXJ0LCBlbmQpIHsKLSAgICByZXR1cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQu
c3Vic3RyKHN0YXJ0LCB5eV8ueXlsZW5nLWVuZCk7Ci0gIH0KLQotCi0gIHZhciBZWVNUQVRFPVlZ
X1NUQVJUCi0gIHN3aXRjaCgkYXZvaWRpbmdfbmFtZV9jb2xsaXNpb25zKSB7Ci0gIGNhc2UgMDoK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih5eV8ueXl0ZXh0LnNsaWNl
KC0yKSA9PT0gIlxcXFwiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdHJpcCgwLDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhp
cy5iZWdpbigibXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgaWYoeXlfLnl5dGV4dC5zbGljZSgtMSkgPT09ICJcXCIpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKCJlbXUiKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGhpcy5iZWdpbigibXUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeXlfLnl5
dGV4dCkgcmV0dXJuIDE0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAg
YnJlYWs7Ci0gIGNhc2UgMTpyZXR1cm4gMTQ7Ci0gIGJyZWFrOwotICBjYXNlIDI6Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCi0gIGJyZWFrOwotICBjYXNlIDM6c3RyaXAoMCw0KTsgdGhpcy5w
b3BTdGF0ZSgpOyByZXR1cm4gMTU7Ci0gIGJyZWFrOwotICBjYXNlIDQ6cmV0dXJuIDM1OwotICBi
cmVhazsKLSAgY2FzZSA1OnJldHVybiAzNjsKLSAgYnJlYWs7Ci0gIGNhc2UgNjpyZXR1cm4gMjU7
Ci0gIGJyZWFrOwotICBjYXNlIDc6cmV0dXJuIDE2OwotICBicmVhazsKLSAgY2FzZSA4OnJldHVy
biAyMDsKLSAgYnJlYWs7Ci0gIGNhc2UgOTpyZXR1cm4gMTk7Ci0gIGJyZWFrOwotICBjYXNlIDEw
OnJldHVybiAxOTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTE6cmV0dXJuIDIzOwotICBicmVhazsKLSAg
Y2FzZSAxMjpyZXR1cm4gMjI7Ci0gIGJyZWFrOwotICBjYXNlIDEzOnRoaXMucG9wU3RhdGUoKTsg
dGhpcy5iZWdpbignY29tJyk7Ci0gIGJyZWFrOwotICBjYXNlIDE0OnN0cmlwKDMsNSk7IHRoaXMu
cG9wU3RhdGUoKTsgcmV0dXJuIDE1OwotICBicmVhazsKLSAgY2FzZSAxNTpyZXR1cm4gMjI7Ci0g
IGJyZWFrOwotICBjYXNlIDE2OnJldHVybiA0MTsKLSAgYnJlYWs7Ci0gIGNhc2UgMTc6cmV0dXJu
IDQwOwotICBicmVhazsKLSAgY2FzZSAxODpyZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDE5
OnJldHVybiA0NDsKLSAgYnJlYWs7Ci0gIGNhc2UgMjA6Ly8gaWdub3JlIHdoaXRlc3BhY2UKLSAg
YnJlYWs7Ci0gIGNhc2UgMjE6dGhpcy5wb3BTdGF0ZSgpOyByZXR1cm4gMjQ7Ci0gIGJyZWFrOwot
ICBjYXNlIDIyOnRoaXMucG9wU3RhdGUoKTsgcmV0dXJuIDE4OwotICBicmVhazsKLSAgY2FzZSAy
Mzp5eV8ueXl0ZXh0ID0gc3RyaXAoMSwyKS5yZXBsYWNlKC9cXCIvZywnIicpOyByZXR1cm4gMzI7
Ci0gIGJyZWFrOwotICBjYXNlIDI0Onl5Xy55eXRleHQgPSBzdHJpcCgxLDIpLnJlcGxhY2UoL1xc
Jy9nLCInIik7IHJldHVybiAzMjsKLSAgYnJlYWs7Ci0gIGNhc2UgMjU6cmV0dXJuIDQyOwotICBi
cmVhazsKLSAgY2FzZSAyNjpyZXR1cm4gMzQ7Ci0gIGJyZWFrOwotICBjYXNlIDI3OnJldHVybiAz
NDsKLSAgYnJlYWs7Ci0gIGNhc2UgMjg6cmV0dXJuIDMzOwotICBicmVhazsKLSAgY2FzZSAyOTpy
ZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMwOnl5Xy55eXRleHQgPSBzdHJpcCgxLDIpOyBy
ZXR1cm4gNDA7Ci0gIGJyZWFrOwotICBjYXNlIDMxOnJldHVybiAnSU5WQUxJRCc7Ci0gIGJyZWFr
OwotICBjYXNlIDMyOnJldHVybiA1OwotICBicmVhazsKLSAgfQotICB9OwotICBsZXhlci5ydWxl
cyA9IFsvXig/OlteXHgwMF0qPyg/PShce1x7KSkpLywvXig/OlteXHgwMF0rKS8sL14oPzpbXlx4
MDBdezIsfT8oPz0oXHtce3xcXFx7XHt8XFxcXFx7XHt8JCkpKS8sL14oPzpbXHNcU10qPy0tXH1c
fSkvLC9eKD86XCgpLywvXig/OlwpKS8sL14oPzpce1x7KH4pPz4pLywvXig/Olx7XHsofik/Iykv
LC9eKD86XHtceyh+KT9cLykvLC9eKD86XHtceyh+KT9cXikvLC9eKD86XHtceyh+KT9ccyplbHNl
XGIpLywvXig/Olx7XHsofik/XHspLywvXig/Olx7XHsofik/JikvLC9eKD86XHtceyEtLSkvLC9e
KD86XHtceyFbXHNcU10qP1x9XH0pLywvXig/Olx7XHsofik/KS8sL14oPzo9KS8sL14oPzpcLlwu
KS8sL14oPzpcLig/PShbPX59XHNcLy4pXSkpKS8sL14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14o
PzpcfSh+KT9cfVx9KS8sL14oPzoofik/XH1cfSkvLC9eKD86IihcXFsiXXxbXiJdKSoiKS8sL14o
PzonKFxcWyddfFteJ10pKicpLywvXig/OkApLywvXig/OnRydWUoPz0oW359XHMpXSkpKS8sL14o
PzpmYWxzZSg/PShbfn1ccyldKSkpLywvXig/Oi0/WzAtOV0rKD89KFt+fVxzKV0pKSkvLC9eKD86
KFteXHMhIiMlLSxcLlwvOy0+QFxbLVxeYFx7LX5dKyg/PShbPX59XHNcLy4pXSkpKSkvLC9eKD86
XFtbXlxdXSpcXSkvLC9eKD86LikvLC9eKD86JCkvXTsKLSAgbGV4ZXIuY29uZGl0aW9ucyA9IHsi
bXUiOnsicnVsZXMiOls0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwy
MCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMl0sImluY2x1c2l2ZSI6ZmFsc2V9
LCJlbXUiOnsicnVsZXMiOlsyXSwiaW5jbHVzaXZlIjpmYWxzZX0sImNvbSI6eyJydWxlcyI6WzNd
LCJpbmNsdXNpdmUiOmZhbHNlfSwiSU5JVElBTCI6eyJydWxlcyI6WzAsMSwzMl0sImluY2x1c2l2
ZSI6dHJ1ZX19OwotICByZXR1cm4gbGV4ZXI7fSkoKQotICBwYXJzZXIubGV4ZXIgPSBsZXhlcjsK
LSAgZnVuY3Rpb24gUGFyc2VyICgpIHsgdGhpcy55eSA9IHt9OyB9UGFyc2VyLnByb3RvdHlwZSA9
IHBhcnNlcjtwYXJzZXIuUGFyc2VyID0gUGFyc2VyOwotICByZXR1cm4gbmV3IFBhcnNlcjsKLSAg
fSkoKTtfX2V4cG9ydHNfXyA9IGhhbmRsZWJhcnM7Ci0gIC8qIGpzaGludCBpZ25vcmU6ZW5kICov
Ci0gIHJldHVybiBfX2V4cG9ydHNfXzsKLX0pKCk7Ci0KLS8vIGhhbmRsZWJhcnMvY29tcGlsZXIv
YmFzZS5qcwotdmFyIF9fbW9kdWxlOF9fID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19k
ZXBlbmRlbmN5Ml9fKSB7Ci0gICJ1c2Ugc3RyaWN0IjsKLSAgdmFyIF9fZXhwb3J0c19fID0ge307
Ci0gIHZhciBwYXJzZXIgPSBfX2RlcGVuZGVuY3kxX187Ci0gIHZhciBBU1QgPSBfX2RlcGVuZGVu
Y3kyX187Ci0KLSAgX19leHBvcnRzX18ucGFyc2VyID0gcGFyc2VyOwotCi0gIGZ1bmN0aW9uIHBh
cnNlKGlucHV0KSB7Ci0gICAgLy8gSnVzdCByZXR1cm4gaWYgYW4gYWxyZWFkeS1jb21waWxlIEFT
VCB3YXMgcGFzc2VkIGluLgotICAgIGlmKGlucHV0LmNvbnN0cnVjdG9yID09PSBBU1QuUHJvZ3Jh
bU5vZGUpIHsgcmV0dXJuIGlucHV0OyB9Ci0KLSAgICBwYXJzZXIueXkgPSBBU1Q7Ci0gICAgcmV0
dXJuIHBhcnNlci5wYXJzZShpbnB1dCk7Ci0gIH0KLQotICBfX2V4cG9ydHNfXy5wYXJzZSA9IHBh
cnNlOwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTlfXywgX19tb2R1bGU3X18p
OwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2NvbXBpbGVyLmpzCi12YXIgX19tb2R1bGUxMF9f
ID0gKGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXykgewotICAidXNlIHN0cmljdCI7Ci0gIHZhciBf
X2V4cG9ydHNfXyA9IHt9OwotICB2YXIgRXhjZXB0aW9uID0gX19kZXBlbmRlbmN5MV9fOwotCi0g
IGZ1bmN0aW9uIENvbXBpbGVyKCkge30KLQotICBfX2V4cG9ydHNfXy5Db21waWxlciA9IENvbXBp
bGVyOy8vIHRoZSBmb3VuZEhlbHBlciByZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIg
bG9va3VwIGZyb20gZmluZGluZyBhCi0gIC8vIGZ1bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBp
cyBuZWNlc3NhcnkgZm9yIG11c3RhY2hlIGNvbXBhdGliaWxpdHksIHdoaWNoCi0gIC8vIHJlcXVp
cmVzIHRoYXQgY29udGV4dCBmdW5jdGlvbnMgaW4gYmxvY2tzIGFyZSBldmFsdWF0ZWQgYnkgYmxv
Y2tIZWxwZXJNaXNzaW5nLAotICAvLyBhbmQgdGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRp
bmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJsb2NrSGVscGVyTWlzc2luZy4KLQotICBDb21waWxl
ci5wcm90b3R5cGUgPSB7Ci0gICAgY29tcGlsZXI6IENvbXBpbGVyLAotCi0gICAgZGlzYXNzZW1i
bGU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG9wY29kZXMgPSB0aGlzLm9wY29kZXMsIG9wY29k
ZSwgb3V0ID0gW10sIHBhcmFtcywgcGFyYW07Ci0KLSAgICAgIGZvciAodmFyIGk9MCwgbD1vcGNv
ZGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1tpXTsKLQot
ICAgICAgICBpZiAob3Bjb2RlLm9wY29kZSA9PT0gJ0RFQ0xBUkUnKSB7Ci0gICAgICAgICAgb3V0
LnB1c2goIkRFQ0xBUkUgIiArIG9wY29kZS5uYW1lICsgIj0iICsgb3Bjb2RlLnZhbHVlKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwYXJhbXMgPSBbXTsKLSAgICAgICAgICBmb3IgKHZh
ciBqPTA7IGo8b3Bjb2RlLmFyZ3MubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIHBhcmFtID0g
b3Bjb2RlLmFyZ3Nbal07Ci0gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAic3RyaW5n
IikgewotICAgICAgICAgICAgICBwYXJhbSA9ICJcIiIgKyBwYXJhbS5yZXBsYWNlKCJcbiIsICJc
XG4iKSArICJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbXMucHVzaChwYXJh
bSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5wdXNoKG9wY29kZS5vcGNvZGUgKyAiICIg
KyBwYXJhbXMuam9pbigiICIpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4g
b3V0LmpvaW4oIlxuIik7Ci0gICAgfSwKLQotICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHsK
LSAgICAgIHZhciBsZW4gPSB0aGlzLm9wY29kZXMubGVuZ3RoOwotICAgICAgaWYgKG90aGVyLm9w
Y29kZXMubGVuZ3RoICE9PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQot
Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHZhciBvcGNv
ZGUgPSB0aGlzLm9wY29kZXNbaV0sCi0gICAgICAgICAgICBvdGhlck9wY29kZSA9IG90aGVyLm9w
Y29kZXNbaV07Ci0gICAgICAgIGlmIChvcGNvZGUub3Bjb2RlICE9PSBvdGhlck9wY29kZS5vcGNv
ZGUgfHwgb3Bjb2RlLmFyZ3MubGVuZ3RoICE9PSBvdGhlck9wY29kZS5hcmdzLmxlbmd0aCkgewot
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHZhciBqID0g
MDsgaiA8IG9wY29kZS5hcmdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgaWYgKG9wY29kZS5h
cmdzW2pdICE9PSBvdGhlck9wY29kZS5hcmdzW2pdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGxlbiA9IHRoaXMu
Y2hpbGRyZW4ubGVuZ3RoOwotICAgICAgaWYgKG90aGVyLmNoaWxkcmVuLmxlbmd0aCAhPT0gbGVu
KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkg
PCBsZW47IGkrKykgewotICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW5baV0uZXF1YWxzKG90aGVy
LmNoaWxkcmVuW2ldKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
ICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9LAotCi0gICAgZ3VpZDogMCwKLQotICAg
IGNvbXBpbGU6IGZ1bmN0aW9uKHByb2dyYW0sIG9wdGlvbnMpIHsKLSAgICAgIHRoaXMub3Bjb2Rl
cyA9IFtdOwotICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwotICAgICAgdGhpcy5kZXB0aHMgPSB7
bGlzdDogW119OwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQotICAgICAgLy8gVGhl
c2UgY2hhbmdlcyB3aWxsIHByb3BhZ2F0ZSB0byB0aGUgb3RoZXIgY29tcGlsZXIgY29tcG9uZW50
cwotICAgICAgdmFyIGtub3duSGVscGVycyA9IHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnM7Ci0g
ICAgICB0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzID0gewotICAgICAgICAnaGVscGVyTWlzc2lu
Zyc6IHRydWUsCi0gICAgICAgICdibG9ja0hlbHBlck1pc3NpbmcnOiB0cnVlLAotICAgICAgICAn
ZWFjaCc6IHRydWUsCi0gICAgICAgICdpZic6IHRydWUsCi0gICAgICAgICd1bmxlc3MnOiB0cnVl
LAotICAgICAgICAnd2l0aCc6IHRydWUsCi0gICAgICAgICdsb2cnOiB0cnVlCi0gICAgICB9Owot
ICAgICAgaWYgKGtub3duSGVscGVycykgewotICAgICAgICBmb3IgKHZhciBuYW1lIGluIGtub3du
SGVscGVycykgewotICAgICAgICAgIHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0gPSBr
bm93bkhlbHBlcnNbbmFtZV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRo
aXMuYWNjZXB0KHByb2dyYW0pOwotICAgIH0sCi0KLSAgICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUp
IHsKLSAgICAgIHZhciBzdHJpcCA9IG5vZGUuc3RyaXAgfHwge30sCi0gICAgICAgICAgcmV0Owot
ICAgICAgaWYgKHN0cmlwLmxlZnQpIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3N0cmlwJyk7Ci0g
ICAgICB9Ci0KLSAgICAgIHJldCA9IHRoaXNbbm9kZS50eXBlXShub2RlKTsKLQotICAgICAgaWYg
KHN0cmlwLnJpZ2h0KSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdzdHJpcCcpOwotICAgICAgfQot
Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0sCi0KLSAgICBwcm9ncmFtOiBmdW5jdGlvbihwcm9n
cmFtKSB7Ci0gICAgICB2YXIgc3RhdGVtZW50cyA9IHByb2dyYW0uc3RhdGVtZW50czsKLQotICAg
ICAgZm9yKHZhciBpPTAsIGw9c3RhdGVtZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAg
IHRoaXMuYWNjZXB0KHN0YXRlbWVudHNbaV0pOwotICAgICAgfQotICAgICAgdGhpcy5pc1NpbXBs
ZSA9IGwgPT09IDE7Ci0KLSAgICAgIHRoaXMuZGVwdGhzLmxpc3QgPSB0aGlzLmRlcHRocy5saXN0
LnNvcnQoZnVuY3Rpb24oYSwgYikgewotICAgICAgICByZXR1cm4gYSAtIGI7Ci0gICAgICB9KTsK
LQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIGNvbXBpbGVQcm9ncmFtOiBmdW5j
dGlvbihwcm9ncmFtKSB7Ci0gICAgICB2YXIgcmVzdWx0ID0gbmV3IHRoaXMuY29tcGlsZXIoKS5j
b21waWxlKHByb2dyYW0sIHRoaXMub3B0aW9ucyk7Ci0gICAgICB2YXIgZ3VpZCA9IHRoaXMuZ3Vp
ZCsrLCBkZXB0aDsKLQotICAgICAgdGhpcy51c2VQYXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8
IHJlc3VsdC51c2VQYXJ0aWFsOwotCi0gICAgICB0aGlzLmNoaWxkcmVuW2d1aWRdID0gcmVzdWx0
OwotCi0gICAgICBmb3IodmFyIGk9MCwgbD1yZXN1bHQuZGVwdGhzLmxpc3QubGVuZ3RoOyBpPGw7
IGkrKykgewotICAgICAgICBkZXB0aCA9IHJlc3VsdC5kZXB0aHMubGlzdFtpXTsKLQotICAgICAg
ICBpZihkZXB0aCA8IDIpIHsgY29udGludWU7IH0KLSAgICAgICAgZWxzZSB7IHRoaXMuYWRkRGVw
dGgoZGVwdGggLSAxKTsgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gZ3VpZDsKLSAgICB9LAot
Ci0gICAgYmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7Ci0gICAgICB2YXIgbXVzdGFjaGUgPSBibG9j
ay5tdXN0YWNoZSwKLSAgICAgICAgICBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSwKLSAgICAgICAg
ICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTsKLQotICAgICAgaWYgKHByb2dyYW0pIHsKLSAgICAg
ICAgcHJvZ3JhbSA9IHRoaXMuY29tcGlsZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAg
ICAgIGlmIChpbnZlcnNlKSB7Ci0gICAgICAgIGludmVyc2UgPSB0aGlzLmNvbXBpbGVQcm9ncmFt
KGludmVyc2UpOwotICAgICAgfQotCi0gICAgICB2YXIgc2V4cHIgPSBtdXN0YWNoZS5zZXhwcjsK
LSAgICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKHNleHByKTsKLQotICAgICAgaWYg
KHR5cGUgPT09ICJoZWxwZXIiKSB7Ci0gICAgICAgIHRoaXMuaGVscGVyU2V4cHIoc2V4cHIsIHBy
b2dyYW0sIGludmVyc2UpOwotICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAic2ltcGxlIikgewot
ICAgICAgICB0aGlzLnNpbXBsZVNleHByKHNleHByKTsKLQotICAgICAgICAvLyBub3cgdGhhdCB0
aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvCi0gICAgICAgIC8vIGV2
YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYAotICAgICAgICB0aGlz
Lm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1
c2hQcm9ncmFtJywgaW52ZXJzZSk7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTsK
LSAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIsIHByb2dyYW0sIGludmVyc2UpOwotCi0gICAg
ICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQg
dG8KLSAgICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3Np
bmdgCi0gICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pOwotICAgICAg
ICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKLSAgICAgICAgdGhpcy5vcGNv
ZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3VzQmxvY2tWYWx1
ZScpOwotICAgICAgfQotCi0gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7Ci0gICAgfSwKLQot
ICAgIGhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKLSAgICAgIHZhciBwYWlycyA9IGhhc2gucGFpcnMs
IHBhaXIsIHZhbDsKLQotICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7Ci0KLSAgICAgIGZv
cih2YXIgaT0wLCBsPXBhaXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgcGFpciA9IHBh
aXJzW2ldOwotICAgICAgICB2YWwgID0gcGFpclsxXTsKLQotICAgICAgICBpZiAodGhpcy5vcHRp
b25zLnN0cmluZ1BhcmFtcykgewotICAgICAgICAgIGlmKHZhbC5kZXB0aCkgewotICAgICAgICAg
ICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aGlz
Lm9wY29kZSgnZ2V0Q29udGV4dCcsIHZhbC5kZXB0aCB8fCAwKTsKLSAgICAgICAgICB0aGlzLm9w
Y29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsLnN0cmluZ01vZGVWYWx1ZSwgdmFsLnR5cGUpOwot
Ci0gICAgICAgICAgaWYgKHZhbC50eXBlID09PSAnc2V4cHInKSB7Ci0gICAgICAgICAgICAvLyBT
dWJleHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KLSAgICAgICAgICAgIC8v
IGluIHN0cmluZyBwYXJhbXMgbW9kZS4KLSAgICAgICAgICAgIHRoaXMuc2V4cHIodmFsKTsKLSAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhpcy5hY2NlcHQodmFsKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyWzBd
KTsKLSAgICAgIH0KLSAgICAgIHRoaXMub3Bjb2RlKCdwb3BIYXNoJyk7Ci0gICAgfSwKLQotICAg
IHBhcnRpYWw6IGZ1bmN0aW9uKHBhcnRpYWwpIHsKLSAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IHBh
cnRpYWwucGFydGlhbE5hbWU7Ci0gICAgICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlOwotCi0gICAg
ICBpZihwYXJ0aWFsLmNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5JRChwYXJ0aWFsLmNvbnRleHQp
OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2gnLCAnZGVwdGgwJyk7
Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VQYXJ0aWFsJywgcGFydGlhbE5h
bWUubmFtZSk7Ci0gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7Ci0gICAgfSwKLQotICAgIGNv
bnRlbnQ6IGZ1bmN0aW9uKGNvbnRlbnQpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdhcHBlbmRDb250
ZW50JywgY29udGVudC5zdHJpbmcpOwotICAgIH0sCi0KLSAgICBtdXN0YWNoZTogZnVuY3Rpb24o
bXVzdGFjaGUpIHsKLSAgICAgIHRoaXMuc2V4cHIobXVzdGFjaGUuc2V4cHIpOwotCi0gICAgICBp
ZihtdXN0YWNoZS5lc2NhcGVkICYmICF0aGlzLm9wdGlvbnMubm9Fc2NhcGUpIHsKLSAgICAgICAg
dGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRo
aXMub3Bjb2RlKCdhcHBlbmQnKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgYW1iaWd1b3VzU2V4
cHI6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7Ci0gICAgICB2YXIgaWQgPSBz
ZXhwci5pZCwKLSAgICAgICAgICBuYW1lID0gaWQucGFydHNbMF0sCi0gICAgICAgICAgaXNCbG9j
ayA9IHByb2dyYW0gIT0gbnVsbCB8fCBpbnZlcnNlICE9IG51bGw7Ci0KLSAgICAgIHRoaXMub3Bj
b2RlKCdnZXRDb250ZXh0JywgaWQuZGVwdGgpOwotCi0gICAgICB0aGlzLm9wY29kZSgncHVzaFBy
b2dyYW0nLCBwcm9ncmFtKTsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVy
c2UpOwotCi0gICAgICB0aGlzLm9wY29kZSgnaW52b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9j
ayk7Ci0gICAgfSwKLQotICAgIHNpbXBsZVNleHByOiBmdW5jdGlvbihzZXhwcikgewotICAgICAg
dmFyIGlkID0gc2V4cHIuaWQ7Ci0KLSAgICAgIGlmIChpZC50eXBlID09PSAnREFUQScpIHsKLSAg
ICAgICAgdGhpcy5EQVRBKGlkKTsKLSAgICAgIH0gZWxzZSBpZiAoaWQucGFydHMubGVuZ3RoKSB7
Ci0gICAgICAgIHRoaXMuSUQoaWQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU2ltcGxp
ZmllZCBJRCBmb3IgYHRoaXNgCi0gICAgICAgIHRoaXMuYWRkRGVwdGgoaWQuZGVwdGgpOwotICAg
ICAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIGlkLmRlcHRoKTsKLSAgICAgICAgdGhpcy5v
cGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMub3Bjb2RlKCdyZXNv
bHZlUG9zc2libGVMYW1iZGEnKTsKLSAgICB9LAotCi0gICAgaGVscGVyU2V4cHI6IGZ1bmN0aW9u
KHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7Ci0gICAgICB2YXIgcGFyYW1zID0gdGhpcy5zZXR1
cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSksCi0gICAgICAgICAg
bmFtZSA9IHNleHByLmlkLnBhcnRzWzBdOwotCi0gICAgICBpZiAodGhpcy5vcHRpb25zLmtub3du
SGVscGVyc1tuYW1lXSkgewotICAgICAgICB0aGlzLm9wY29kZSgnaW52b2tlS25vd25IZWxwZXIn
LCBwYXJhbXMubGVuZ3RoLCBuYW1lKTsKLSAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtu
b3duSGVscGVyc09ubHkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiWW91IHNwZWNp
ZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgIiArIG5h
bWUsIHNleHByKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VI
ZWxwZXInLCBwYXJhbXMubGVuZ3RoLCBuYW1lLCBzZXhwci5pc1Jvb3QpOwotICAgICAgfQotICAg
IH0sCi0KLSAgICBzZXhwcjogZnVuY3Rpb24oc2V4cHIpIHsKLSAgICAgIHZhciB0eXBlID0gdGhp
cy5jbGFzc2lmeVNleHByKHNleHByKTsKLQotICAgICAgaWYgKHR5cGUgPT09ICJzaW1wbGUiKSB7
Ci0gICAgICAgIHRoaXMuc2ltcGxlU2V4cHIoc2V4cHIpOwotICAgICAgfSBlbHNlIGlmICh0eXBl
ID09PSAiaGVscGVyIikgewotICAgICAgICB0aGlzLmhlbHBlclNleHByKHNleHByKTsKLSAgICAg
IH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpOwotICAgICAgfQot
ICAgIH0sCi0KLSAgICBJRDogZnVuY3Rpb24oaWQpIHsKLSAgICAgIHRoaXMuYWRkRGVwdGgoaWQu
ZGVwdGgpOwotICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBpZC5kZXB0aCk7Ci0KLSAg
ICAgIHZhciBuYW1lID0gaWQucGFydHNbMF07Ci0gICAgICBpZiAoIW5hbWUpIHsKLSAgICAgICAg
dGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlz
Lm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgaWQucGFydHNbMF0pOwotICAgICAgfQotCi0gICAg
ICBmb3IodmFyIGk9MSwgbD1pZC5wYXJ0cy5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHRo
aXMub3Bjb2RlKCdsb29rdXAnLCBpZC5wYXJ0c1tpXSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAg
IERBVEE6IGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gdHJ1ZTsK
LSAgICAgIGlmIChkYXRhLmlkLmlzU2NvcGVkIHx8IGRhdGEuaWQuZGVwdGgpIHsKLSAgICAgICAg
dGhyb3cgbmV3IEV4Y2VwdGlvbignU2NvcGVkIGRhdGEgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBv
cnRlZDogJyArIGRhdGEub3JpZ2luYWwsIGRhdGEpOwotICAgICAgfQotCi0gICAgICB0aGlzLm9w
Y29kZSgnbG9va3VwRGF0YScpOwotICAgICAgdmFyIHBhcnRzID0gZGF0YS5pZC5wYXJ0czsKLSAg
ICAgIGZvcih2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsgaTxsOyBpKyspIHsKLSAgICAgICAgdGhp
cy5vcGNvZGUoJ2xvb2t1cCcsIHBhcnRzW2ldKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgU1RS
SU5HOiBmdW5jdGlvbihzdHJpbmcpIHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5nJywg
c3RyaW5nLnN0cmluZyk7Ci0gICAgfSwKLQotICAgIElOVEVHRVI6IGZ1bmN0aW9uKGludGVnZXIp
IHsKLSAgICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsIGludGVnZXIuaW50ZWdlcik7Ci0g
ICAgfSwKLQotICAgIEJPT0xFQU46IGZ1bmN0aW9uKGJvb2wpIHsKLSAgICAgIHRoaXMub3Bjb2Rl
KCdwdXNoTGl0ZXJhbCcsIGJvb2wuYm9vbCk7Ci0gICAgfSwKLQotICAgIGNvbW1lbnQ6IGZ1bmN0
aW9uKCkge30sCi0KLSAgICAvLyBIRUxQRVJTCi0gICAgb3Bjb2RlOiBmdW5jdGlvbihuYW1lKSB7
Ci0gICAgICB0aGlzLm9wY29kZXMucHVzaCh7IG9wY29kZTogbmFtZSwgYXJnczogW10uc2xpY2Uu
Y2FsbChhcmd1bWVudHMsIDEpIH0pOwotICAgIH0sCi0KLSAgICBkZWNsYXJlOiBmdW5jdGlvbihu
YW1lLCB2YWx1ZSkgewotICAgICAgdGhpcy5vcGNvZGVzLnB1c2goeyBvcGNvZGU6ICdERUNMQVJF
JywgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwotICAgIH0sCi0KLSAgICBhZGREZXB0aDog
ZnVuY3Rpb24oZGVwdGgpIHsKLSAgICAgIGlmKGRlcHRoID09PSAwKSB7IHJldHVybjsgfQotCi0g
ICAgICBpZighdGhpcy5kZXB0aHNbZGVwdGhdKSB7Ci0gICAgICAgIHRoaXMuZGVwdGhzW2RlcHRo
XSA9IHRydWU7Ci0gICAgICAgIHRoaXMuZGVwdGhzLmxpc3QucHVzaChkZXB0aCk7Ci0gICAgICB9
Ci0gICAgfSwKLQotICAgIGNsYXNzaWZ5U2V4cHI6IGZ1bmN0aW9uKHNleHByKSB7Ci0gICAgICB2
YXIgaXNIZWxwZXIgICA9IHNleHByLmlzSGVscGVyOwotICAgICAgdmFyIGlzRWxpZ2libGUgPSBz
ZXhwci5lbGlnaWJsZUhlbHBlcjsKLSAgICAgIHZhciBvcHRpb25zICAgID0gdGhpcy5vcHRpb25z
OwotCi0gICAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNhbiBwb3NzaWJseSByZXNvbHZlIHRoZSBh
bWJpZ3VpdHkgbm93Ci0gICAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHsKLSAgICAg
ICAgdmFyIG5hbWUgPSBzZXhwci5pZC5wYXJ0c1swXTsKLQotICAgICAgICBpZiAob3B0aW9ucy5r
bm93bkhlbHBlcnNbbmFtZV0pIHsKLSAgICAgICAgICBpc0hlbHBlciA9IHRydWU7Ci0gICAgICAg
IH0gZWxzZSBpZiAob3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KSB7Ci0gICAgICAgICAgaXNFbGln
aWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0hlbHBlcikg
eyByZXR1cm4gImhlbHBlciI7IH0KLSAgICAgIGVsc2UgaWYgKGlzRWxpZ2libGUpIHsgcmV0dXJu
ICJhbWJpZ3VvdXMiOyB9Ci0gICAgICBlbHNlIHsgcmV0dXJuICJzaW1wbGUiOyB9Ci0gICAgfSwK
LQotICAgIHB1c2hQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtcykgewotICAgICAgdmFyIGkgPSBwYXJh
bXMubGVuZ3RoLCBwYXJhbTsKLQotICAgICAgd2hpbGUoaS0tKSB7Ci0gICAgICAgIHBhcmFtID0g
cGFyYW1zW2ldOwotCi0gICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAg
ICAgICAgICBpZihwYXJhbS5kZXB0aCkgewotICAgICAgICAgICAgdGhpcy5hZGREZXB0aChwYXJh
bS5kZXB0aCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRl
eHQnLCBwYXJhbS5kZXB0aCB8fCAwKTsKLSAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmlu
Z1BhcmFtJywgcGFyYW0uc3RyaW5nTW9kZVZhbHVlLCBwYXJhbS50eXBlKTsKLQotICAgICAgICAg
IGlmIChwYXJhbS50eXBlID09PSAnc2V4cHInKSB7Ci0gICAgICAgICAgICAvLyBTdWJleHByZXNz
aW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW4KLSAgICAgICAgICAgIC8vIGluIHN0cmlu
ZyBwYXJhbXMgbW9kZS4KLSAgICAgICAgICAgIHRoaXMuc2V4cHIocGFyYW0pOwotICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aGlzW3BhcmFtLnR5cGVdKHBhcmFtKTsK
LSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0KLSAgICBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFt
czogZnVuY3Rpb24oc2V4cHIsIHByb2dyYW0sIGludmVyc2UpIHsKLSAgICAgIHZhciBwYXJhbXMg
PSBzZXhwci5wYXJhbXM7Ci0gICAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTsKLQotICAgICAg
dGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7Ci0gICAgICB0aGlzLm9wY29kZSgn
cHVzaFByb2dyYW0nLCBpbnZlcnNlKTsKLQotICAgICAgaWYgKHNleHByLmhhc2gpIHsKLSAgICAg
ICAgdGhpcy5oYXNoKHNleHByLmhhc2gpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5v
cGNvZGUoJ2VtcHR5SGFzaCcpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcGFyYW1zOwotICAg
IH0KLSAgfTsKLQotICBmdW5jdGlvbiBwcmVjb21waWxlKGlucHV0LCBvcHRpb25zLCBlbnYpIHsK
LSAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBp
bnB1dC5jb25zdHJ1Y3RvciAhPT0gZW52LkFTVC5Qcm9ncmFtTm9kZSkpIHsKLSAgICAgIHRocm93
IG5ldyBFeGNlcHRpb24oIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1Qg
dG8gSGFuZGxlYmFycy5wcmVjb21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1dCk7Ci0gICAgfQot
Ci0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gICAgaWYgKCEoJ2RhdGEnIGluIG9wdGlv
bnMpKSB7Ci0gICAgICBvcHRpb25zLmRhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIHZhciBhc3Qg
PSBlbnYucGFyc2UoaW5wdXQpOwotICAgIHZhciBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGls
ZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7Ci0gICAgcmV0dXJuIG5ldyBlbnYuSmF2YVNjcmlw
dENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucyk7Ci0gIH0KLQotICBfX2V4
cG9ydHNfXy5wcmVjb21waWxlID0gcHJlY29tcGlsZTtmdW5jdGlvbiBjb21waWxlKGlucHV0LCBv
cHRpb25zLCBlbnYpIHsKLSAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCAodHlwZW9mIGlucHV0ICE9
PSAnc3RyaW5nJyAmJiBpbnB1dC5jb25zdHJ1Y3RvciAhPT0gZW52LkFTVC5Qcm9ncmFtTm9kZSkp
IHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3Ig
SGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5jb21waWxlLiBZb3UgcGFzc2VkICIgKyBpbnB1
dCk7Ci0gICAgfQotCi0gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICBpZiAoISgn
ZGF0YScgaW4gb3B0aW9ucykpIHsKLSAgICAgIG9wdGlvbnMuZGF0YSA9IHRydWU7Ci0gICAgfQot
Ci0gICAgdmFyIGNvbXBpbGVkOwotCi0gICAgZnVuY3Rpb24gY29tcGlsZUlucHV0KCkgewotICAg
ICAgdmFyIGFzdCA9IGVudi5wYXJzZShpbnB1dCk7Ci0gICAgICB2YXIgZW52aXJvbm1lbnQgPSBu
ZXcgZW52LkNvbXBpbGVyKCkuY29tcGlsZShhc3QsIG9wdGlvbnMpOwotICAgICAgdmFyIHRlbXBs
YXRlU3BlYyA9IG5ldyBlbnYuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVu
dCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTsKLSAgICAgIHJldHVybiBlbnYudGVtcGxhdGUo
dGVtcGxhdGVTcGVjKTsKLSAgICB9Ci0KLSAgICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVk
IG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuCi0gICAgcmV0dXJuIGZ1
bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKLSAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAg
ICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjb21w
aWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMpOwotICAgIH07Ci0gIH0KLQotICBfX2V4
cG9ydHNfXy5jb21waWxlID0gY29tcGlsZTsKLSAgcmV0dXJuIF9fZXhwb3J0c19fOwotfSkoX19t
b2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIu
anMKLXZhciBfX21vZHVsZTExX18gPSAoZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVu
ZGVuY3kyX18pIHsKLSAgInVzZSBzdHJpY3QiOwotICB2YXIgX19leHBvcnRzX187Ci0gIHZhciBD
T01QSUxFUl9SRVZJU0lPTiA9IF9fZGVwZW5kZW5jeTFfXy5DT01QSUxFUl9SRVZJU0lPTjsKLSAg
dmFyIFJFVklTSU9OX0NIQU5HRVMgPSBfX2RlcGVuZGVuY3kxX18uUkVWSVNJT05fQ0hBTkdFUzsK
LSAgdmFyIGxvZyA9IF9fZGVwZW5kZW5jeTFfXy5sb2c7Ci0gIHZhciBFeGNlcHRpb24gPSBfX2Rl
cGVuZGVuY3kyX187Ci0KLSAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSkgewotICAgIHRoaXMudmFs
dWUgPSB2YWx1ZTsKLSAgfQotCi0gIGZ1bmN0aW9uIEphdmFTY3JpcHRDb21waWxlcigpIHt9Ci0K
LSAgSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHsKLSAgICAvLyBQVUJMSUMgQVBJOiBZ
b3UgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgaW4gYSBzdWJjbGFzcyB0byBwcm92aWRlCi0g
ICAgLy8gYWx0ZXJuYXRpdmUgY29tcGlsZWQgZm9ybXMgZm9yIG5hbWUgbG9va3VwIGFuZCBidWZm
ZXJpbmcgc2VtYW50aWNzCi0gICAgbmFtZUxvb2t1cDogZnVuY3Rpb24ocGFyZW50LCBuYW1lIC8q
ICwgdHlwZSovKSB7Ci0gICAgICB2YXIgd3JhcCwKLSAgICAgICAgICByZXQ7Ci0gICAgICBpZiAo
cGFyZW50LmluZGV4T2YoJ2RlcHRoJykgPT09IDApIHsKLSAgICAgICAgd3JhcCA9IHRydWU7Ci0g
ICAgICB9Ci0KLSAgICAgIGlmICgvXlswLTldKyQvLnRlc3QobmFtZSkpIHsKLSAgICAgICAgcmV0
ID0gcGFyZW50ICsgIlsiICsgbmFtZSArICJdIjsKLSAgICAgIH0gZWxzZSBpZiAoSmF2YVNjcmlw
dENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lKG5hbWUpKSB7Ci0gICAgICAg
IHJldCA9IHBhcmVudCArICIuIiArIG5hbWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAg
ICAgcmV0ID0gcGFyZW50ICsgIlsnIiArIG5hbWUgKyAiJ10iOwotICAgICAgfQotCi0gICAgICBp
ZiAod3JhcCkgewotICAgICAgICByZXR1cm4gJygnICsgcGFyZW50ICsgJyAmJiAnICsgcmV0ICsg
JyknOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICB9
LAotCi0gICAgY29tcGlsZXJJbmZvOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciByZXZpc2lvbiA9
IENPTVBJTEVSX1JFVklTSU9OLAotICAgICAgICAgIHZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdF
U1tyZXZpc2lvbl07Ci0gICAgICByZXR1cm4gInRoaXMuY29tcGlsZXJJbmZvID0gWyIrcmV2aXNp
b24rIiwnIit2ZXJzaW9ucysiJ107XG4iOwotICAgIH0sCi0KLSAgICBhcHBlbmRUb0J1ZmZlcjog
ZnVuY3Rpb24oc3RyaW5nKSB7Ci0gICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkg
ewotICAgICAgICByZXR1cm4gInJldHVybiAiICsgc3RyaW5nICsgIjsiOwotICAgICAgfSBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICBhcHBlbmRUb0J1ZmZlcjogdHJ1ZSwKLSAg
ICAgICAgICBjb250ZW50OiBzdHJpbmcsCi0gICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkg
eyByZXR1cm4gImJ1ZmZlciArPSAiICsgc3RyaW5nICsgIjsiOyB9Ci0gICAgICAgIH07Ci0gICAg
ICB9Ci0gICAgfSwKLQotICAgIGluaXRpYWxpemVCdWZmZXI6IGZ1bmN0aW9uKCkgewotICAgICAg
cmV0dXJuIHRoaXMucXVvdGVkU3RyaW5nKCIiKTsKLSAgICB9LAotCi0gICAgbmFtZXNwYWNlOiAi
SGFuZGxlYmFycyIsCi0gICAgLy8gRU5EIFBVQkxJQyBBUEkKLQotICAgIGNvbXBpbGU6IGZ1bmN0
aW9uKGVudmlyb25tZW50LCBvcHRpb25zLCBjb250ZXh0LCBhc09iamVjdCkgewotICAgICAgdGhp
cy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwotICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9u
cyB8fCB7fTsKLQotICAgICAgbG9nKCdkZWJ1ZycsIHRoaXMuZW52aXJvbm1lbnQuZGlzYXNzZW1i
bGUoKSArICJcblxuIik7Ci0KLSAgICAgIHRoaXMubmFtZSA9IHRoaXMuZW52aXJvbm1lbnQubmFt
ZTsKLSAgICAgIHRoaXMuaXNDaGlsZCA9ICEhY29udGV4dDsKLSAgICAgIHRoaXMuY29udGV4dCA9
IGNvbnRleHQgfHwgewotICAgICAgICBwcm9ncmFtczogW10sCi0gICAgICAgIGVudmlyb25tZW50
czogW10sCi0gICAgICAgIGFsaWFzZXM6IHsgfQotICAgICAgfTsKLQotICAgICAgdGhpcy5wcmVh
bWJsZSgpOwotCi0gICAgICB0aGlzLnN0YWNrU2xvdCA9IDA7Ci0gICAgICB0aGlzLnN0YWNrVmFy
cyA9IFtdOwotICAgICAgdGhpcy5yZWdpc3RlcnMgPSB7IGxpc3Q6IFtdIH07Ci0gICAgICB0aGlz
Lmhhc2hlcyA9IFtdOwotICAgICAgdGhpcy5jb21waWxlU3RhY2sgPSBbXTsKLSAgICAgIHRoaXMu
aW5saW5lU3RhY2sgPSBbXTsKLQotICAgICAgdGhpcy5jb21waWxlQ2hpbGRyZW4oZW52aXJvbm1l
bnQsIG9wdGlvbnMpOwotCi0gICAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMs
IG9wY29kZTsKLQotICAgICAgdGhpcy5pID0gMDsKLQotICAgICAgZm9yKHZhciBsPW9wY29kZXMu
bGVuZ3RoOyB0aGlzLmk8bDsgdGhpcy5pKyspIHsKLSAgICAgICAgb3Bjb2RlID0gb3Bjb2Rlc1t0
aGlzLmldOwotCi0gICAgICAgIGlmKG9wY29kZS5vcGNvZGUgPT09ICdERUNMQVJFJykgewotICAg
ICAgICAgIHRoaXNbb3Bjb2RlLm5hbWVdID0gb3Bjb2RlLnZhbHVlOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgIHRoaXNbb3Bjb2RlLm9wY29kZV0uYXBwbHkodGhpcywgb3Bjb2RlLmFyZ3Mp
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgdGhlIHN0cmlwTmV4dCBmbGFnIGlmIGl0
IHdhcyBub3Qgc2V0IGJ5IHRoaXMgb3BlcmF0aW9uLgotICAgICAgICBpZiAob3Bjb2RlLm9wY29k
ZSAhPT0gdGhpcy5zdHJpcE5leHQpIHsKLSAgICAgICAgICB0aGlzLnN0cmlwTmV4dCA9IGZhbHNl
OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZsdXNoIGFueSB0cmFpbGluZyBjb250
ZW50IHRoYXQgbWlnaHQgYmUgcGVuZGluZy4KLSAgICAgIHRoaXMucHVzaFNvdXJjZSgnJyk7Ci0K
LSAgICAgIGlmICh0aGlzLnN0YWNrU2xvdCB8fCB0aGlzLmlubGluZVN0YWNrLmxlbmd0aCB8fCB0
aGlzLmNvbXBpbGVTdGFjay5sZW5ndGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbign
Q29tcGlsZSBjb21wbGV0ZWQgd2l0aCBjb250ZW50IGxlZnQgb24gc3RhY2snKTsKLSAgICAgIH0K
LQotICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVuY3Rpb25Db250ZXh0KGFzT2JqZWN0KTsKLSAg
ICB9LAotCi0gICAgcHJlYW1ibGU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG91dCA9IFtdOwot
Ci0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkgewotICAgICAgICB2YXIgbmFtZXNwYWNlID0gdGhp
cy5uYW1lc3BhY2U7Ci0KLSAgICAgICAgdmFyIGNvcGllcyA9ICJoZWxwZXJzID0gdGhpcy5tZXJn
ZShoZWxwZXJzLCAiICsgbmFtZXNwYWNlICsgIi5oZWxwZXJzKTsiOwotICAgICAgICBpZiAodGhp
cy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsKSB7IGNvcGllcyA9IGNvcGllcyArICIgcGFydGlhbHMg
PSB0aGlzLm1lcmdlKHBhcnRpYWxzLCAiICsgbmFtZXNwYWNlICsgIi5wYXJ0aWFscyk7IjsgfQot
ICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHsgY29waWVzID0gY29waWVzICsgIiBkYXRh
ID0gZGF0YSB8fCB7fTsiOyB9Ci0gICAgICAgIG91dC5wdXNoKGNvcGllcyk7Ci0gICAgICB9IGVs
c2UgewotICAgICAgICBvdXQucHVzaCgnJyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghdGhpcy5l
bnZpcm9ubWVudC5pc1NpbXBsZSkgewotICAgICAgICBvdXQucHVzaCgiLCBidWZmZXIgPSAiICsg
dGhpcy5pbml0aWFsaXplQnVmZmVyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0LnB1
c2goIiIpOwotICAgICAgfQotCi0gICAgICAvLyB0cmFjayB0aGUgbGFzdCBjb250ZXh0IHB1c2hl
ZCBpbnRvIHBsYWNlIHRvIGFsbG93IHNraXBwaW5nIHRoZQotICAgICAgLy8gZ2V0Q29udGV4dCBv
cGNvZGUgd2hlbiBpdCB3b3VsZCBiZSBhIG5vb3AKLSAgICAgIHRoaXMubGFzdENvbnRleHQgPSAw
OwotICAgICAgdGhpcy5zb3VyY2UgPSBvdXQ7Ci0gICAgfSwKLQotICAgIGNyZWF0ZUZ1bmN0aW9u
Q29udGV4dDogZnVuY3Rpb24oYXNPYmplY3QpIHsKLSAgICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0
YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7Ci0KLSAgICAgIGlmKGxvY2Fscy5s
ZW5ndGggPiAwKSB7Ci0gICAgICAgIHRoaXMuc291cmNlWzFdID0gdGhpcy5zb3VyY2VbMV0gKyAi
LCAiICsgbG9jYWxzLmpvaW4oIiwgIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdlbmVyYXRlIG1p
bmltaXplciBhbGlhcyBtYXBwaW5ncwotICAgICAgaWYgKCF0aGlzLmlzQ2hpbGQpIHsKLSAgICAg
ICAgZm9yICh2YXIgYWxpYXMgaW4gdGhpcy5jb250ZXh0LmFsaWFzZXMpIHsKLSAgICAgICAgICBp
ZiAodGhpcy5jb250ZXh0LmFsaWFzZXMuaGFzT3duUHJvcGVydHkoYWxpYXMpKSB7Ci0gICAgICAg
ICAgICB0aGlzLnNvdXJjZVsxXSA9IHRoaXMuc291cmNlWzFdICsgJywgJyArIGFsaWFzICsgJz0n
ICsgdGhpcy5jb250ZXh0LmFsaWFzZXNbYWxpYXNdOwotICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgfQotCi0gICAgICBpZiAodGhpcy5zb3VyY2VbMV0pIHsKLSAgICAgICAgdGhpcy5zb3Vy
Y2VbMV0gPSAidmFyICIgKyB0aGlzLnNvdXJjZVsxXS5zdWJzdHJpbmcoMikgKyAiOyI7Ci0gICAg
ICB9Ci0KLSAgICAgIC8vIE1lcmdlIGNoaWxkcmVuCi0gICAgICBpZiAoIXRoaXMuaXNDaGlsZCkg
ewotICAgICAgICB0aGlzLnNvdXJjZVsxXSArPSAnXG4nICsgdGhpcy5jb250ZXh0LnByb2dyYW1z
LmpvaW4oJ1xuJykgKyAnXG4nOwotICAgICAgfQotCi0gICAgICBpZiAoIXRoaXMuZW52aXJvbm1l
bnQuaXNTaW1wbGUpIHsKLSAgICAgICAgdGhpcy5wdXNoU291cmNlKCJyZXR1cm4gYnVmZmVyOyIp
OwotICAgICAgfQotCi0gICAgICB2YXIgcGFyYW1zID0gdGhpcy5pc0NoaWxkID8gWyJkZXB0aDAi
LCAiZGF0YSJdIDogWyJIYW5kbGViYXJzIiwgImRlcHRoMCIsICJoZWxwZXJzIiwgInBhcnRpYWxz
IiwgImRhdGEiXTsKLQotICAgICAgZm9yKHZhciBpPTAsIGw9dGhpcy5lbnZpcm9ubWVudC5kZXB0
aHMubGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIHBhcmFtcy5wdXNoKCJkZXB0aCIg
KyB0aGlzLmVudmlyb25tZW50LmRlcHRocy5saXN0W2ldKTsKLSAgICAgIH0KLQotICAgICAgLy8g
UGVyZm9ybSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCB0byBtZXJnZSBjb250ZW50IHdo
ZW4gcG9zc2libGUKLSAgICAgIHZhciBzb3VyY2UgPSB0aGlzLm1lcmdlU291cmNlKCk7Ci0KLSAg
ICAgIGlmICghdGhpcy5pc0NoaWxkKSB7Ci0gICAgICAgIHNvdXJjZSA9IHRoaXMuY29tcGlsZXJJ
bmZvKCkrc291cmNlOwotICAgICAgfQotCi0gICAgICBpZiAoYXNPYmplY3QpIHsKLSAgICAgICAg
cGFyYW1zLnB1c2goc291cmNlKTsKLQotICAgICAgICByZXR1cm4gRnVuY3Rpb24uYXBwbHkodGhp
cywgcGFyYW1zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhciBmdW5jdGlvblNvdXJjZSA9
ICdmdW5jdGlvbiAnICsgKHRoaXMubmFtZSB8fCAnJykgKyAnKCcgKyBwYXJhbXMuam9pbignLCcp
ICsgJykge1xuICAnICsgc291cmNlICsgJ30nOwotICAgICAgICBsb2coJ2RlYnVnJywgZnVuY3Rp
b25Tb3VyY2UgKyAiXG5cbiIpOwotICAgICAgICByZXR1cm4gZnVuY3Rpb25Tb3VyY2U7Ci0gICAg
ICB9Ci0gICAgfSwKLSAgICBtZXJnZVNvdXJjZTogZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBXQVJO
OiBXZSBhcmUgbm90IGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBzdGlsbCBwb3B1
bGF0ZWQgYXMgdGhlIHNvdXJjZSBzaG91bGQKLSAgICAgIC8vIG5vdCBoYXZlIGJ1ZmZlciBhcHBl
bmQgb3BlcmF0aW9ucyBhcyB0aGVpciBmaW5hbCBhY3Rpb24uCi0gICAgICB2YXIgc291cmNlID0g
JycsCi0gICAgICAgICAgYnVmZmVyOwotICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMu
c291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHZhciBsaW5lID0gdGhpcy5z
b3VyY2VbaV07Ci0gICAgICAgIGlmIChsaW5lLmFwcGVuZFRvQnVmZmVyKSB7Ci0gICAgICAgICAg
aWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyICsgJ1xuICAgICsgJyAr
IGxpbmUuY29udGVudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyID0g
bGluZS5jb250ZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBp
ZiAoYnVmZmVyKSB7Ci0gICAgICAgICAgICBzb3VyY2UgKz0gJ2J1ZmZlciArPSAnICsgYnVmZmVy
ICsgJztcbiAgJzsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsKLSAgICAgICAgICB9
Ci0gICAgICAgICAgc291cmNlICs9IGxpbmUgKyAnXG4gICc7Ci0gICAgICAgIH0KLSAgICAgIH0K
LSAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfSwKLQotICAgIC8vIFtibG9ja1ZhbHVlXQotICAg
IC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFs
dWUKLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJldHVybiB2YWx1ZSBvZiBibG9ja0hlbHBlck1p
c3NpbmcKLSAgICAvLwotICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3Bjb2RlIGlzIHRvIHRh
a2UgYSBibG9jayBvZiB0aGUgZm9ybQotICAgIC8vIGB7eyNmb299fS4uLnt7L2Zvb319YCwgcmVz
b2x2ZSB0aGUgdmFsdWUgb2YgYGZvb2AsIGFuZAotICAgIC8vIHJlcGxhY2UgaXQgb24gdGhlIHN0
YWNrIHdpdGggdGhlIHJlc3VsdCBvZiBwcm9wZXJseQotICAgIC8vIGludm9raW5nIGJsb2NrSGVs
cGVyTWlzc2luZy4KLSAgICBibG9ja1ZhbHVlOiBmdW5jdGlvbigpIHsKLSAgICAgIHRoaXMuY29u
dGV4dC5hbGlhc2VzLmJsb2NrSGVscGVyTWlzc2luZyA9ICdoZWxwZXJzLmJsb2NrSGVscGVyTWlz
c2luZyc7Ci0KLSAgICAgIHZhciBwYXJhbXMgPSBbImRlcHRoMCJdOwotICAgICAgdGhpcy5zZXR1
cFBhcmFtcygwLCBwYXJhbXMpOwotCi0gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbihj
dXJyZW50KSB7Ci0gICAgICAgIHBhcmFtcy5zcGxpY2UoMSwgMCwgY3VycmVudCk7Ci0gICAgICAg
IHJldHVybiAiYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoIiArIHBhcmFtcy5qb2luKCIsICIpICsg
IikiOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIFthbWJpZ3VvdXNCbG9ja1ZhbHVlXQot
ICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwg
dmFsdWUKLSAgICAvLyBDb21waWxlciB2YWx1ZSwgYmVmb3JlOiBsYXN0SGVscGVyPXZhbHVlIG9m
IGxhc3QgZm91bmQgaGVscGVyLCBpZiBhbnkKLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXIsIGlmIG5v
IGxhc3RIZWxwZXI6IHNhbWUgYXMgW2Jsb2NrVmFsdWVdCi0gICAgLy8gT24gc3RhY2ssIGFmdGVy
LCBpZiBsYXN0SGVscGVyOiB2YWx1ZQotICAgIGFtYmlndW91c0Jsb2NrVmFsdWU6IGZ1bmN0aW9u
KCkgewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuYmxvY2tIZWxwZXJNaXNzaW5nID0gJ2hl
bHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJzsKLQotICAgICAgdmFyIHBhcmFtcyA9IFsiZGVwdGgw
Il07Ci0gICAgICB0aGlzLnNldHVwUGFyYW1zKDAsIHBhcmFtcyk7Ci0KLSAgICAgIHZhciBjdXJy
ZW50ID0gdGhpcy50b3BTdGFjaygpOwotICAgICAgcGFyYW1zLnNwbGljZSgxLCAwLCBjdXJyZW50
KTsKLQotICAgICAgdGhpcy5wdXNoU291cmNlKCJpZiAoISIgKyB0aGlzLmxhc3RIZWxwZXIgKyAi
KSB7ICIgKyBjdXJyZW50ICsgIiA9IGJsb2NrSGVscGVyTWlzc2luZy5jYWxsKCIgKyBwYXJhbXMu
am9pbigiLCAiKSArICIpOyB9Iik7Ci0gICAgfSwKLQotICAgIC8vIFthcHBlbmRDb250ZW50XQot
ICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFm
dGVyOiAuLi4KLSAgICAvLwotICAgIC8vIEFwcGVuZHMgdGhlIHN0cmluZyB2YWx1ZSBvZiBgY29u
dGVudGAgdG8gdGhlIGN1cnJlbnQgYnVmZmVyCi0gICAgYXBwZW5kQ29udGVudDogZnVuY3Rpb24o
Y29udGVudCkgewotICAgICAgaWYgKHRoaXMucGVuZGluZ0NvbnRlbnQpIHsKLSAgICAgICAgY29u
dGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQgKyBjb250ZW50OwotICAgICAgfQotICAgICAgaWYg
KHRoaXMuc3RyaXBOZXh0KSB7Ci0gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15c
cysvLCAnJyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMucGVuZGluZ0NvbnRlbnQgPSBjb250ZW50
OwotICAgIH0sCi0KLSAgICAvLyBbc3RyaXBdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVm
b3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gUmVt
b3ZlcyBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBwcmlvciBjb250ZW50IG5vZGUg
YW5kIGZsYWdzCi0gICAgLy8gdGhlIG5leHQgb3BlcmF0aW9uIGZvciBzdHJpcHBpbmcgaWYgaXQg
aXMgYSBjb250ZW50IG5vZGUuCi0gICAgc3RyaXA6IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKHRo
aXMucGVuZGluZ0NvbnRlbnQpIHsKLSAgICAgICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IHRoaXMu
cGVuZGluZ0NvbnRlbnQucmVwbGFjZSgvXHMrJC8sICcnKTsKLSAgICAgIH0KLSAgICAgIHRoaXMu
c3RyaXBOZXh0ID0gJ3N0cmlwJzsKLSAgICB9LAotCi0gICAgLy8gW2FwcGVuZF0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0
ZXI6IC4uLgotICAgIC8vCi0gICAgLy8gQ29lcmNlcyBgdmFsdWVgIHRvIGEgU3RyaW5nIGFuZCBh
cHBlbmRzIGl0IHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAvLwotICAgIC8vIElmIGB2YWx1
ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJpbmcgYW5kIGFwcGVu
ZGVkCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGFwcGVuZGVkCi0gICAg
YXBwZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgIC8vIEZvcmNlIGFueXRoaW5nIHRoYXQgaXMgaW5s
aW5lZCBvbnRvIHRoZSBzdGFjayBzbyB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0aW9uCi0gICAgICAv
LyB3aGVuIHdlIGV4YW1pbmUgbG9jYWwKLSAgICAgIHRoaXMuZmx1c2hJbmxpbmUoKTsKLSAgICAg
IHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgIHRoaXMucHVzaFNvdXJjZSgiaWYo
IiArIGxvY2FsICsgIiB8fCAiICsgbG9jYWwgKyAiID09PSAwKSB7ICIgKyB0aGlzLmFwcGVuZFRv
QnVmZmVyKGxvY2FsKSArICIgfSIpOwotICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuaXNTaW1w
bGUpIHsKLSAgICAgICAgdGhpcy5wdXNoU291cmNlKCJlbHNlIHsgIiArIHRoaXMuYXBwZW5kVG9C
dWZmZXIoIicnIikgKyAiIH0iKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gW2FwcGVuZEVz
Y2FwZWRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uCi0gICAg
Ly8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAvLwotICAgIC8vIEVzY2FwZSBgdmFsdWVgIGFu
ZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlcgotICAgIGFwcGVuZEVzY2FwZWQ6IGZ1bmN0aW9uKCkg
ewotICAgICAgdGhpcy5jb250ZXh0LmFsaWFzZXMuZXNjYXBlRXhwcmVzc2lvbiA9ICd0aGlzLmVz
Y2FwZUV4cHJlc3Npb24nOwotCi0gICAgICB0aGlzLnB1c2hTb3VyY2UodGhpcy5hcHBlbmRUb0J1
ZmZlcigiZXNjYXBlRXhwcmVzc2lvbigiICsgdGhpcy5wb3BTdGFjaygpICsgIikiKSk7Ci0gICAg
fSwKLQotICAgIC8vIFtnZXRDb250ZXh0XQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9y
ZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiAuLi4KLSAgICAvLyBDb21waWxlciB2YWx1
ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoCi0gICAgLy8KLSAgICAvLyBTZXQgdGhlIHZhbHVl
IG9mIHRoZSBgbGFzdENvbnRleHRgIGNvbXBpbGVyIHZhbHVlIHRvIHRoZSBkZXB0aAotICAgIGdl
dENvbnRleHQ6IGZ1bmN0aW9uKGRlcHRoKSB7Ci0gICAgICBpZih0aGlzLmxhc3RDb250ZXh0ICE9
PSBkZXB0aCkgewotICAgICAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVwdGg7Ci0gICAgICB9Ci0g
ICAgfSwKLQotICAgIC8vIFtsb29rdXBPbkNvbnRleHRdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFj
aywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IGN1cnJlbnRDb250ZXh0W25h
bWVdLCAuLi4KLSAgICAvLwotICAgIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgbmFtZWAgb24g
dGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzCi0gICAgLy8gaXQgb250byB0aGUgc3RhY2su
Ci0gICAgbG9va3VwT25Db250ZXh0OiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICB0aGlzLnB1c2go
dGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0LCBuYW1lLCAnY29udGV4
dCcpKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hDb250ZXh0XQotICAgIC8vCi0gICAgLy8gT24g
c3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4
dCwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNv
bnRleHQgb250byB0aGUgc3RhY2suCi0gICAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uKCkgewotICAg
ICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0KTsKLSAg
ICB9LAotCi0gICAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV0KLSAgICAvLwotICAgIC8vIE9u
IHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc29s
dmVkIHZhbHVlLCAuLi4KLSAgICAvLwotICAgIC8vIElmIHRoZSBgdmFsdWVgIGlzIGEgbGFtYmRh
LCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBieQotICAgIC8vIHRoZSByZXR1cm4gdmFsdWUgb2Yg
dGhlIGxhbWJkYQotICAgIHJlc29sdmVQb3NzaWJsZUxhbWJkYTogZnVuY3Rpb24oKSB7Ci0gICAg
ICB0aGlzLmNvbnRleHQuYWxpYXNlcy5mdW5jdGlvblR5cGUgPSAnImZ1bmN0aW9uIic7Ci0KLSAg
ICAgIHRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGN1cnJlbnQpIHsKLSAgICAgICAgcmV0dXJu
ICJ0eXBlb2YgIiArIGN1cnJlbnQgKyAiID09PSBmdW5jdGlvblR5cGUgPyAiICsgY3VycmVudCAr
ICIuYXBwbHkoZGVwdGgwKSA6ICIgKyBjdXJyZW50OwotICAgICAgfSk7Ci0gICAgfSwKLQotICAg
IC8vIFtsb29rdXBdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4u
Ci0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiB2YWx1ZVtuYW1lXSwgLi4uCi0gICAgLy8KLSAgICAv
LyBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sgd2l0aCB0aGUgcmVzdWx0IG9mIGxvb2tp
bmcKLSAgICAvLyB1cCBgbmFtZWAgb24gYHZhbHVlYAotICAgIGxvb2t1cDogZnVuY3Rpb24obmFt
ZSkgewotICAgICAgdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24oY3VycmVudCkgewotICAgICAg
ICByZXR1cm4gY3VycmVudCArICIgPT0gbnVsbCB8fCAiICsgY3VycmVudCArICIgPT09IGZhbHNl
ID8gIiArIGN1cnJlbnQgKyAiIDogIiArIHRoaXMubmFtZUxvb2t1cChjdXJyZW50LCBuYW1lLCAn
Y29udGV4dCcpOwotICAgICAgfSk7Ci0gICAgfSwKLQotICAgIC8vIFtsb29rdXBEYXRhXQotICAg
IC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVy
OiBkYXRhLCAuLi4KLSAgICAvLwotICAgIC8vIFB1c2ggdGhlIGRhdGEgbG9va3VwIG9wZXJhdG9y
Ci0gICAgbG9va3VwRGF0YTogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xpdGVy
YWwoJ2RhdGEnKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hTdHJpbmdQYXJhbV0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjogc3Ry
aW5nLCBjdXJyZW50Q29udGV4dCwgLi4uCi0gICAgLy8KLSAgICAvLyBUaGlzIG9wY29kZSBpcyBk
ZXNpZ25lZCBmb3IgdXNlIGluIHN0cmluZyBtb2RlLCB3aGljaAotICAgIC8vIHByb3ZpZGVzIHRo
ZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHMKLSAgICAvLyBkZXB0
aCByYXRoZXIgdGhhbiByZXNvbHZpbmcgaXQgaW1tZWRpYXRlbHkuCi0gICAgcHVzaFN0cmluZ1Bh
cmFtOiBmdW5jdGlvbihzdHJpbmcsIHR5cGUpIHsKLSAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJh
bCgnZGVwdGgnICsgdGhpcy5sYXN0Q29udGV4dCk7Ci0KLSAgICAgIHRoaXMucHVzaFN0cmluZyh0
eXBlKTsKLQotICAgICAgLy8gSWYgaXQncyBhIHN1YmV4cHJlc3Npb24sIHRoZSBzdHJpbmcgcmVz
dWx0Ci0gICAgICAvLyB3aWxsIGJlIHB1c2hlZCBhZnRlciB0aGlzIG9wY29kZS4KLSAgICAgIGlm
ICh0eXBlICE9PSAnc2V4cHInKSB7Ci0gICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3Ry
aW5nJykgewotICAgICAgICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChzdHJpbmcpOwotICAgICAgICB9
Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIGVtcHR5SGFzaDogZnVuY3Rpb24oKSB7Ci0gICAgICB0
aGlzLnB1c2hTdGFja0xpdGVyYWwoJ3t9Jyk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3Ry
aW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFzaENvbnRleHRzCi0g
ICAgICAgIHRoaXMucHVzaCgne30nKTsgLy8gaGFzaFR5cGVzCi0gICAgICB9Ci0gICAgfSwKLSAg
ICBwdXNoSGFzaDogZnVuY3Rpb24oKSB7Ci0gICAgICBpZiAodGhpcy5oYXNoKSB7Ci0gICAgICAg
IHRoaXMuaGFzaGVzLnB1c2godGhpcy5oYXNoKTsKLSAgICAgIH0KLSAgICAgIHRoaXMuaGFzaCA9
IHt2YWx1ZXM6IFtdLCB0eXBlczogW10sIGNvbnRleHRzOiBbXX07Ci0gICAgfSwKLSAgICBwb3BI
YXNoOiBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBoYXNoID0gdGhpcy5oYXNoOwotICAgICAgdGhp
cy5oYXNoID0gdGhpcy5oYXNoZXMucG9wKCk7Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3Ry
aW5nUGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLmNvbnRleHRzLmpvaW4o
JywnKSArICd9Jyk7Ci0gICAgICAgIHRoaXMucHVzaCgneycgKyBoYXNoLnR5cGVzLmpvaW4oJywn
KSArICd9Jyk7Ci0gICAgICB9Ci0KLSAgICAgIHRoaXMucHVzaCgne1xuICAgICcgKyBoYXNoLnZh
bHVlcy5qb2luKCcsXG4gICAgJykgKyAnXG4gIH0nKTsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hT
dHJpbmddCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBz
dGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi4KLSAgICAvLwotICAgIC8vIFB1
c2ggYSBxdW90ZWQgdmVyc2lvbiBvZiBgc3RyaW5nYCBvbnRvIHRoZSBzdGFjawotICAgIHB1c2hT
dHJpbmc6IGZ1bmN0aW9uKHN0cmluZykgewotICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRo
aXMucXVvdGVkU3RyaW5nKHN0cmluZykpOwotICAgIH0sCi0KLSAgICAvLyBbcHVzaF0KLSAgICAv
LwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLgotICAgIC8vIE9uIHN0YWNrLCBhZnRlcjog
ZXhwciwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoIGFuIGV4cHJlc3Npb24gb250byB0aGUgc3Rh
Y2sKLSAgICBwdXNoOiBmdW5jdGlvbihleHByKSB7Ci0gICAgICB0aGlzLmlubGluZVN0YWNrLnB1
c2goZXhwcik7Ci0gICAgICByZXR1cm4gZXhwcjsKLSAgICB9LAotCi0gICAgLy8gW3B1c2hMaXRl
cmFsXQotICAgIC8vCi0gICAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uCi0gICAgLy8gT24gc3Rh
Y2ssIGFmdGVyOiB2YWx1ZSwgLi4uCi0gICAgLy8KLSAgICAvLyBQdXNoZXMgYSB2YWx1ZSBvbnRv
IHRoZSBzdGFjay4gVGhpcyBvcGVyYXRpb24gcHJldmVudHMKLSAgICAvLyB0aGUgY29tcGlsZXIg
ZnJvbSBjcmVhdGluZyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBob2xkCi0gICAgLy8gaXQuCi0g
ICAgcHVzaExpdGVyYWw6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICB0aGlzLnB1c2hTdGFja0xp
dGVyYWwodmFsdWUpOwotICAgIH0sCi0KLSAgICAvLyBbcHVzaFByb2dyYW1dCi0gICAgLy8KLSAg
ICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi4KLSAgICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHByb2dy
YW0oZ3VpZCksIC4uLgotICAgIC8vCi0gICAgLy8gUHVzaCBhIHByb2dyYW0gZXhwcmVzc2lvbiBv
bnRvIHRoZSBzdGFjay4gVGhpcyB0YWtlcwotICAgIC8vIGEgY29tcGlsZS10aW1lIGd1aWQgYW5k
IGNvbnZlcnRzIGl0IGludG8gYSBydW50aW1lLWFjY2Vzc2libGUKLSAgICAvLyBleHByZXNzaW9u
LgotICAgIHB1c2hQcm9ncmFtOiBmdW5jdGlvbihndWlkKSB7Ci0gICAgICBpZiAoZ3VpZCAhPSBu
dWxsKSB7Ci0gICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnByb2dyYW1FeHByZXNz
aW9uKGd1aWQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJh
bChudWxsKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gW2ludm9rZUhlbHBlcl0KLSAgICAv
LwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFt
cy4uLiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9j
YXRpb24KLSAgICAvLwotICAgIC8vIFBvcHMgb2ZmIHRoZSBoZWxwZXIncyBwYXJhbWV0ZXJzLCBp
bnZva2VzIHRoZSBoZWxwZXIsCi0gICAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJu
IHZhbHVlIG9udG8gdGhlIHN0YWNrLgotICAgIC8vCi0gICAgLy8gSWYgdGhlIGhlbHBlciBpcyBu
b3QgZm91bmQsIGBoZWxwZXJNaXNzaW5nYCBpcyBjYWxsZWQuCi0gICAgaW52b2tlSGVscGVyOiBm
dW5jdGlvbihwYXJhbVNpemUsIG5hbWUsIGlzUm9vdCkgewotICAgICAgdGhpcy5jb250ZXh0LmFs
aWFzZXMuaGVscGVyTWlzc2luZyA9ICdoZWxwZXJzLmhlbHBlck1pc3NpbmcnOwotICAgICAgdGhp
cy51c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAgICAgIHZhciBoZWxwZXIgPSB0aGlzLmxhc3RI
ZWxwZXIgPSB0aGlzLnNldHVwSGVscGVyKHBhcmFtU2l6ZSwgbmFtZSwgdHJ1ZSk7Ci0gICAgICB2
YXIgbm9uSGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdkZXB0aCcgKyB0aGlzLmxhc3RDb250ZXh0
LCBuYW1lLCAnY29udGV4dCcpOwotCi0gICAgICB2YXIgbG9va3VwID0gJ2hlbHBlciA9ICcgKyBo
ZWxwZXIubmFtZSArICcgfHwgJyArIG5vbkhlbHBlcjsKLSAgICAgIGlmIChoZWxwZXIucGFyYW1z
SW5pdCkgewotICAgICAgICBsb29rdXAgKz0gJywnICsgaGVscGVyLnBhcmFtc0luaXQ7Ci0gICAg
ICB9Ci0KLSAgICAgIHRoaXMucHVzaCgKLSAgICAgICAgJygnCi0gICAgICAgICAgKyBsb29rdXAK
LSAgICAgICAgICArICcsaGVscGVyICcKLSAgICAgICAgICAgICsgJz8gaGVscGVyLmNhbGwoJyAr
IGhlbHBlci5jYWxsUGFyYW1zICsgJykgJwotICAgICAgICAgICAgKyAnOiBoZWxwZXJNaXNzaW5n
LmNhbGwoJyArIGhlbHBlci5oZWxwZXJNaXNzaW5nUGFyYW1zICsgJykpJyk7Ci0KLSAgICAgIC8v
IEFsd2F5cyBmbHVzaCBzdWJleHByZXNzaW9ucy4gVGhpcyBpcyBib3RoIHRvIHByZXZlbnQgdGhl
IGNvbXBvdW5kaW5nIHNpemUgaXNzdWUgdGhhdAotICAgICAgLy8gb2NjdXJzIHdoZW4gdGhlIGNv
ZGUgaGFzIHRvIGJlIGR1cGxpY2F0ZWQgZm9yIGlubGluaW5nIGFuZCBhbHNvIHRvIHByZXZlbnQg
ZXJyb3JzCi0gICAgICAvLyBkdWUgdG8gdGhlIGluY29ycmVjdCBvcHRpb25zIG9iamVjdCBiZWlu
ZyBwYXNzZWQgZHVlIHRvIHRoZSBzaGFyZWQgcmVnaXN0ZXIuCi0gICAgICBpZiAoIWlzUm9vdCkg
ewotICAgICAgICB0aGlzLmZsdXNoSW5saW5lKCk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8v
IFtpbnZva2VLbm93bkhlbHBlcl0KLSAgICAvLwotICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhh
c2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uCi0gICAgLy8gT24gc3RhY2ssIGFm
dGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb24KLSAgICAvLwotICAgIC8vIFRoaXMgb3Bl
cmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LAotICAgIC8v
IHNvIGEgYGhlbHBlck1pc3NpbmdgIGZhbGxiYWNrIGlzIG5vdCByZXF1aXJlZC4KLSAgICBpbnZv
a2VLbm93bkhlbHBlcjogZnVuY3Rpb24ocGFyYW1TaXplLCBuYW1lKSB7Ci0gICAgICB2YXIgaGVs
cGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpOwotICAgICAgdGhpcy5wdXNo
KGhlbHBlci5uYW1lICsgIi5jYWxsKCIgKyBoZWxwZXIuY2FsbFBhcmFtcyArICIpIik7Ci0gICAg
fSwKLQotICAgIC8vIFtpbnZva2VBbWJpZ3VvdXNdCi0gICAgLy8KLSAgICAvLyBPbiBzdGFjaywg
YmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLgotICAgIC8vIE9u
IHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGRpc2FtYmlndWF0aW9uCi0gICAgLy8KLSAgICAvLyBU
aGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gYW4gZXhwcmVzc2lvbiBsaWtlIGB7e2Zvb319YAot
ICAgIC8vIGlzIHByb3ZpZGVkLCBidXQgd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgd2hl
dGhlciBpdAotICAgIC8vIGlzIGEgaGVscGVyIG9yIGEgcGF0aC4KLSAgICAvLwotICAgIC8vIFRo
aXMgb3BlcmF0aW9uIGVtaXRzIG1vcmUgY29kZSB0aGFuIHRoZSBvdGhlciBvcHRpb25zLAotICAg
IC8vIGFuZCBjYW4gYmUgYXZvaWRlZCBieSBwYXNzaW5nIHRoZSBga25vd25IZWxwZXJzYCBhbmQK
LSAgICAvLyBga25vd25IZWxwZXJzT25seWAgZmxhZ3MgYXQgY29tcGlsZS10aW1lLgotICAgIGlu
dm9rZUFtYmlndW91czogZnVuY3Rpb24obmFtZSwgaGVscGVyQ2FsbCkgewotICAgICAgdGhpcy5j
b250ZXh0LmFsaWFzZXMuZnVuY3Rpb25UeXBlID0gJyJmdW5jdGlvbiInOwotICAgICAgdGhpcy51
c2VSZWdpc3RlcignaGVscGVyJyk7Ci0KLSAgICAgIHRoaXMuZW1wdHlIYXNoKCk7Ci0gICAgICB2
YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTsKLQotICAg
ICAgdmFyIGhlbHBlck5hbWUgPSB0aGlzLmxhc3RIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAoJ2hl
bHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0KLSAgICAgIHZhciBub25IZWxwZXIgPSB0aGlzLm5h
bWVMb29rdXAoJ2RlcHRoJyArIHRoaXMubGFzdENvbnRleHQsIG5hbWUsICdjb250ZXh0Jyk7Ci0g
ICAgICB2YXIgbmV4dFN0YWNrID0gdGhpcy5uZXh0U3RhY2soKTsKLQotICAgICAgaWYgKGhlbHBl
ci5wYXJhbXNJbml0KSB7Ci0gICAgICAgIHRoaXMucHVzaFNvdXJjZShoZWxwZXIucGFyYW1zSW5p
dCk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnB1c2hTb3VyY2UoJ2lmIChoZWxwZXIgPSAnICsgaGVs
cGVyTmFtZSArICcpIHsgJyArIG5leHRTdGFjayArICcgPSBoZWxwZXIuY2FsbCgnICsgaGVscGVy
LmNhbGxQYXJhbXMgKyAnKTsgfScpOwotICAgICAgdGhpcy5wdXNoU291cmNlKCdlbHNlIHsgaGVs
cGVyID0gJyArIG5vbkhlbHBlciArICc7ICcgKyBuZXh0U3RhY2sgKyAnID0gdHlwZW9mIGhlbHBl
ciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoJyArIGhlbHBlci5jYWxsUGFyYW1zICsg
JykgOiBoZWxwZXI7IH0nKTsKLSAgICB9LAotCi0gICAgLy8gW2ludm9rZVBhcnRpYWxdCi0gICAg
Ly8KLSAgICAvLyBPbiBzdGFjaywgYmVmb3JlOiBjb250ZXh0LCAuLi4KLSAgICAvLyBPbiBzdGFj
ayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvbgotICAgIC8vCi0gICAgLy8gVGhp
cyBvcGVyYXRpb24gcG9wcyBvZmYgYSBjb250ZXh0LCBpbnZva2VzIGEgcGFydGlhbCB3aXRoIHRo
YXQgY29udGV4dCwKLSAgICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRp
b24gYmFjay4KLSAgICBpbnZva2VQYXJ0aWFsOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICB2YXIg
cGFyYW1zID0gW3RoaXMubmFtZUxvb2t1cCgncGFydGlhbHMnLCBuYW1lLCAncGFydGlhbCcpLCAi
JyIgKyBuYW1lICsgIiciLCB0aGlzLnBvcFN0YWNrKCksICJoZWxwZXJzIiwgInBhcnRpYWxzIl07
Ci0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkgewotICAgICAgICBwYXJhbXMucHVzaCgi
ZGF0YSIpOwotICAgICAgfQotCi0gICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRo
aXMiOwotICAgICAgdGhpcy5wdXNoKCJzZWxmLmludm9rZVBhcnRpYWwoIiArIHBhcmFtcy5qb2lu
KCIsICIpICsgIikiKTsKLSAgICB9LAotCi0gICAgLy8gW2Fzc2lnblRvSGFzaF0KLSAgICAvLwot
ICAgIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCBoYXNoLCAuLi4KLSAgICAvLyBPbiBzdGFj
aywgYWZ0ZXI6IGhhc2gsIC4uLgotICAgIC8vCi0gICAgLy8gUG9wcyBhIHZhbHVlIGFuZCBoYXNo
IG9mZiB0aGUgc3RhY2ssIGFzc2lnbnMgYGhhc2hba2V5XSA9IHZhbHVlYAotICAgIC8vIGFuZCBw
dXNoZXMgdGhlIGhhc2ggYmFjayBvbnRvIHRoZSBzdGFjay4KLSAgICBhc3NpZ25Ub0hhc2g6IGZ1
bmN0aW9uKGtleSkgewotICAgICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLAotICAgICAg
ICAgIGNvbnRleHQsCi0gICAgICAgICAgdHlwZTsKLQotICAgICAgaWYgKHRoaXMub3B0aW9ucy5z
dHJpbmdQYXJhbXMpIHsKLSAgICAgICAgdHlwZSA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgICAg
Y29udGV4dCA9IHRoaXMucG9wU3RhY2soKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGhhc2ggPSB0
aGlzLmhhc2g7Ci0gICAgICBpZiAoY29udGV4dCkgewotICAgICAgICBoYXNoLmNvbnRleHRzLnB1
c2goIiciICsga2V5ICsgIic6ICIgKyBjb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBl
KSB7Ci0gICAgICAgIGhhc2gudHlwZXMucHVzaCgiJyIgKyBrZXkgKyAiJzogIiArIHR5cGUpOwot
ICAgICAgfQotICAgICAgaGFzaC52YWx1ZXMucHVzaCgiJyIgKyBrZXkgKyAiJzogKCIgKyB2YWx1
ZSArICIpIik7Ci0gICAgfSwKLQotICAgIC8vIEhFTFBFUlMKLQotICAgIGNvbXBpbGVyOiBKYXZh
U2NyaXB0Q29tcGlsZXIsCi0KLSAgICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uKGVudmlyb25t
ZW50LCBvcHRpb25zKSB7Ci0gICAgICB2YXIgY2hpbGRyZW4gPSBlbnZpcm9ubWVudC5jaGlsZHJl
biwgY2hpbGQsIGNvbXBpbGVyOwotCi0gICAgICBmb3IodmFyIGk9MCwgbD1jaGlsZHJlbi5sZW5n
dGg7IGk8bDsgaSsrKSB7Ci0gICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGNv
bXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKTsKLQotICAgICAgICB2YXIgaW5kZXggPSB0aGlz
Lm1hdGNoRXhpc3RpbmdQcm9ncmFtKGNoaWxkKTsKLQotICAgICAgICBpZiAoaW5kZXggPT0gbnVs
bCkgewotICAgICAgICAgIHRoaXMuY29udGV4dC5wcm9ncmFtcy5wdXNoKCcnKTsgICAgIC8vIFBs
YWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlbgot
ICAgICAgICAgIGluZGV4ID0gdGhpcy5jb250ZXh0LnByb2dyYW1zLmxlbmd0aDsKLSAgICAgICAg
ICBjaGlsZC5pbmRleCA9IGluZGV4OwotICAgICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScg
KyBpbmRleDsKLSAgICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXNbaW5kZXhdID0gY29tcGls
ZXIuY29tcGlsZShjaGlsZCwgb3B0aW9ucywgdGhpcy5jb250ZXh0KTsKLSAgICAgICAgICB0aGlz
LmNvbnRleHQuZW52aXJvbm1lbnRzW2luZGV4XSA9IGNoaWxkOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgY2hpbGQubmFtZSA9ICdw
cm9ncmFtJyArIGluZGV4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSwKLSAgICBtYXRjaEV4
aXN0aW5nUHJvZ3JhbTogZnVuY3Rpb24oY2hpbGQpIHsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBs
ZW4gPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0g
ICAgICAgIHZhciBlbnZpcm9ubWVudCA9IHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaV07Ci0g
ICAgICAgIGlmIChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5lcXVhbHMoY2hpbGQpKSB7Ci0g
ICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9LAotCi0gICAgcHJv
Z3JhbUV4cHJlc3Npb246IGZ1bmN0aW9uKGd1aWQpIHsKLSAgICAgIHRoaXMuY29udGV4dC5hbGlh
c2VzLnNlbGYgPSAidGhpcyI7Ci0KLSAgICAgIGlmKGd1aWQgPT0gbnVsbCkgewotICAgICAgICBy
ZXR1cm4gInNlbGYubm9vcCI7Ci0gICAgICB9Ci0KLSAgICAgIHZhciBjaGlsZCA9IHRoaXMuZW52
aXJvbm1lbnQuY2hpbGRyZW5bZ3VpZF0sCi0gICAgICAgICAgZGVwdGhzID0gY2hpbGQuZGVwdGhz
Lmxpc3QsIGRlcHRoOwotCi0gICAgICB2YXIgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwg
Y2hpbGQubmFtZSwgImRhdGEiXTsKLQotICAgICAgZm9yKHZhciBpPTAsIGwgPSBkZXB0aHMubGVu
Z3RoOyBpPGw7IGkrKykgewotICAgICAgICBkZXB0aCA9IGRlcHRoc1tpXTsKLQotICAgICAgICBp
ZihkZXB0aCA9PT0gMSkgeyBwcm9ncmFtUGFyYW1zLnB1c2goImRlcHRoMCIpOyB9Ci0gICAgICAg
IGVsc2UgeyBwcm9ncmFtUGFyYW1zLnB1c2goImRlcHRoIiArIChkZXB0aCAtIDEpKTsgfQotICAg
ICAgfQotCi0gICAgICByZXR1cm4gKGRlcHRocy5sZW5ndGggPT09IDAgPyAic2VsZi5wcm9ncmFt
KCIgOiAic2VsZi5wcm9ncmFtV2l0aERlcHRoKCIpICsgcHJvZ3JhbVBhcmFtcy5qb2luKCIsICIp
ICsgIikiOwotICAgIH0sCi0KLSAgICByZWdpc3RlcjogZnVuY3Rpb24obmFtZSwgdmFsKSB7Ci0g
ICAgICB0aGlzLnVzZVJlZ2lzdGVyKG5hbWUpOwotICAgICAgdGhpcy5wdXNoU291cmNlKG5hbWUg
KyAiID0gIiArIHZhbCArICI7Iik7Ci0gICAgfSwKLQotICAgIHVzZVJlZ2lzdGVyOiBmdW5jdGlv
bihuYW1lKSB7Ci0gICAgICBpZighdGhpcy5yZWdpc3RlcnNbbmFtZV0pIHsKLSAgICAgICAgdGhp
cy5yZWdpc3RlcnNbbmFtZV0gPSB0cnVlOwotICAgICAgICB0aGlzLnJlZ2lzdGVycy5saXN0LnB1
c2gobmFtZSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIHB1c2hTdGFja0xpdGVyYWw6IGZ1bmN0
aW9uKGl0ZW0pIHsKLSAgICAgIHJldHVybiB0aGlzLnB1c2gobmV3IExpdGVyYWwoaXRlbSkpOwot
ICAgIH0sCi0KLSAgICBwdXNoU291cmNlOiBmdW5jdGlvbihzb3VyY2UpIHsKLSAgICAgIGlmICh0
aGlzLnBlbmRpbmdDb250ZW50KSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBl
bmRUb0J1ZmZlcih0aGlzLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSkpOwotICAg
ICAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gdW5kZWZpbmVkOwotICAgICAgfQotCi0gICAgICBp
ZiAoc291cmNlKSB7Ci0gICAgICAgIHRoaXMuc291cmNlLnB1c2goc291cmNlKTsKLSAgICAgIH0K
LSAgICB9LAotCi0gICAgcHVzaFN0YWNrOiBmdW5jdGlvbihpdGVtKSB7Ci0gICAgICB0aGlzLmZs
dXNoSW5saW5lKCk7Ci0KLSAgICAgIHZhciBzdGFjayA9IHRoaXMuaW5jclN0YWNrKCk7Ci0gICAg
ICBpZiAoaXRlbSkgewotICAgICAgICB0aGlzLnB1c2hTb3VyY2Uoc3RhY2sgKyAiID0gIiArIGl0
ZW0gKyAiOyIpOwotICAgICAgfQotICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChzdGFjayk7
Ci0gICAgICByZXR1cm4gc3RhY2s7Ci0gICAgfSwKLQotICAgIHJlcGxhY2VTdGFjazogZnVuY3Rp
b24oY2FsbGJhY2spIHsKLSAgICAgIHZhciBwcmVmaXggPSAnJywKLSAgICAgICAgICBpbmxpbmUg
PSB0aGlzLmlzSW5saW5lKCksCi0gICAgICAgICAgc3RhY2ssCi0gICAgICAgICAgY3JlYXRlZFN0
YWNrLAotICAgICAgICAgIHVzZWRMaXRlcmFsOwotCi0gICAgICAvLyBJZiB3ZSBhcmUgY3VycmVu
dGx5IGlubGluZSB0aGVuIHdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50
byB0aGUKLSAgICAgIC8vIHJlcGxhY2VtZW50IHN0YXRlbWVudCB2aWEgJywnCi0gICAgICBpZiAo
aW5saW5lKSB7Ci0gICAgICAgIHZhciB0b3AgPSB0aGlzLnBvcFN0YWNrKHRydWUpOwotCi0gICAg
ICAgIGlmICh0b3AgaW5zdGFuY2VvZiBMaXRlcmFsKSB7Ci0gICAgICAgICAgLy8gTGl0ZXJhbHMg
ZG8gbm90IG5lZWQgdG8gYmUgaW5saW5lZAotICAgICAgICAgIHN0YWNrID0gdG9wLnZhbHVlOwot
ICAgICAgICAgIHVzZWRMaXRlcmFsID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUg
aW5saW5lCi0gICAgICAgICAgY3JlYXRlZFN0YWNrID0gIXRoaXMuc3RhY2tTbG90OwotICAgICAg
ICAgIHZhciBuYW1lID0gIWNyZWF0ZWRTdGFjayA/IHRoaXMudG9wU3RhY2tOYW1lKCkgOiB0aGlz
LmluY3JTdGFjaygpOwotCi0gICAgICAgICAgcHJlZml4ID0gJygnICsgdGhpcy5wdXNoKG5hbWUp
ICsgJyA9ICcgKyB0b3AgKyAnKSwnOwotICAgICAgICAgIHN0YWNrID0gdGhpcy50b3BTdGFjaygp
OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGFjayA9IHRoaXMudG9wU3Rh
Y2soKTsKLSAgICAgIH0KLQotICAgICAgdmFyIGl0ZW0gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0
YWNrKTsKLQotICAgICAgaWYgKGlubGluZSkgewotICAgICAgICBpZiAoIXVzZWRMaXRlcmFsKSB7
Ci0gICAgICAgICAgdGhpcy5wb3BTdGFjaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjcmVh
dGVkU3RhY2spIHsKLSAgICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwotICAgICAgICB9Ci0gICAg
ICAgIHRoaXMucHVzaCgnKCcgKyBwcmVmaXggKyBpdGVtICsgJyknKTsKLSAgICAgIH0gZWxzZSB7
Ci0gICAgICAgIC8vIFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IGRlcHRoIHZh
cmlhYmxlLiBUaHJvdWdoIHJlcGxhY2VTdGFjawotICAgICAgICBpZiAoIS9ec3RhY2svLnRlc3Qo
c3RhY2spKSB7Ci0gICAgICAgICAgc3RhY2sgPSB0aGlzLm5leHRTdGFjaygpOwotICAgICAgICB9
Ci0KLSAgICAgICAgdGhpcy5wdXNoU291cmNlKHN0YWNrICsgIiA9ICgiICsgcHJlZml4ICsgaXRl
bSArICIpOyIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN0YWNrOwotICAgIH0sCi0KLSAgICBu
ZXh0U3RhY2s6IGZ1bmN0aW9uKCkgewotICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCk7Ci0g
ICAgfSwKLQotICAgIGluY3JTdGFjazogZnVuY3Rpb24oKSB7Ci0gICAgICB0aGlzLnN0YWNrU2xv
dCsrOwotICAgICAgaWYodGhpcy5zdGFja1Nsb3QgPiB0aGlzLnN0YWNrVmFycy5sZW5ndGgpIHsg
dGhpcy5zdGFja1ZhcnMucHVzaCgic3RhY2siICsgdGhpcy5zdGFja1Nsb3QpOyB9Ci0gICAgICBy
ZXR1cm4gdGhpcy50b3BTdGFja05hbWUoKTsKLSAgICB9LAotICAgIHRvcFN0YWNrTmFtZTogZnVu
Y3Rpb24oKSB7Ci0gICAgICByZXR1cm4gInN0YWNrIiArIHRoaXMuc3RhY2tTbG90OwotICAgIH0s
Ci0gICAgZmx1c2hJbmxpbmU6IGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGlubGluZVN0YWNrID0g
dGhpcy5pbmxpbmVTdGFjazsKLSAgICAgIGlmIChpbmxpbmVTdGFjay5sZW5ndGgpIHsKLSAgICAg
ICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdOwotICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0g
aW5saW5lU3RhY2subGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICB2YXIgZW50cnkg
PSBpbmxpbmVTdGFja1tpXTsKLSAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBMaXRlcmFs
KSB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBpbGVTdGFjay5wdXNoKGVudHJ5KTsKLSAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wdXNoU3RhY2soZW50cnkpOwotICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0gICAgaXNJbmxpbmU6IGZ1bmN0aW9uKCkg
ewotICAgICAgcmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RoOwotICAgIH0sCi0KLSAgICBw
b3BTdGFjazogZnVuY3Rpb24od3JhcHBlZCkgewotICAgICAgdmFyIGlubGluZSA9IHRoaXMuaXNJ
bmxpbmUoKSwKLSAgICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0
aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7Ci0KLSAgICAgIGlmICghd3JhcHBlZCAmJiAoaXRlbSBp
bnN0YW5jZW9mIExpdGVyYWwpKSB7Ci0gICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwotICAgICAg
fSBlbHNlIHsKLSAgICAgICAgaWYgKCFpbmxpbmUpIHsKLSAgICAgICAgICBpZiAoIXRoaXMuc3Rh
Y2tTbG90KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdJbnZhbGlkIHN0YWNr
IHBvcCcpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aGlzLnN0YWNrU2xvdC0tOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgICAgfQotICAgIH0sCi0KLSAgICB0b3BTdGFj
azogZnVuY3Rpb24od3JhcHBlZCkgewotICAgICAgdmFyIHN0YWNrID0gKHRoaXMuaXNJbmxpbmUo
KSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjayksCi0gICAgICAgICAgaXRl
bSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwotCi0gICAgICBpZiAoIXdyYXBwZWQgJiYgKGl0
ZW0gaW5zdGFuY2VvZiBMaXRlcmFsKSkgewotICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKLSAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgICAgfQotICAgIH0sCi0KLSAg
ICBxdW90ZWRTdHJpbmc6IGZ1bmN0aW9uKHN0cikgewotICAgICAgcmV0dXJuICciJyArIHN0cgot
ICAgICAgICAucmVwbGFjZSgvXFwvZywgJ1xcXFwnKQotICAgICAgICAucmVwbGFjZSgvIi9nLCAn
XFwiJykKLSAgICAgICAgLnJlcGxhY2UoL1xuL2csICdcXG4nKQotICAgICAgICAucmVwbGFjZSgv
XHIvZywgJ1xccicpCi0gICAgICAgIC5yZXBsYWNlKC9cdTIwMjgvZywgJ1xcdTIwMjgnKSAgIC8v
IFBlciBFY21hLTI2MiA3LjMgKyA3LjguNAotICAgICAgICAucmVwbGFjZSgvXHUyMDI5L2csICdc
XHUyMDI5JykgKyAnIic7Ci0gICAgfSwKLQotICAgIHNldHVwSGVscGVyOiBmdW5jdGlvbihwYXJh
bVNpemUsIG5hbWUsIG1pc3NpbmdQYXJhbXMpIHsKLSAgICAgIHZhciBwYXJhbXMgPSBbXSwKLSAg
ICAgICAgICBwYXJhbXNJbml0ID0gdGhpcy5zZXR1cFBhcmFtcyhwYXJhbVNpemUsIHBhcmFtcywg
bWlzc2luZ1BhcmFtcyk7Ci0gICAgICB2YXIgZm91bmRIZWxwZXIgPSB0aGlzLm5hbWVMb29rdXAo
J2hlbHBlcnMnLCBuYW1lLCAnaGVscGVyJyk7Ci0KLSAgICAgIHJldHVybiB7Ci0gICAgICAgIHBh
cmFtczogcGFyYW1zLAotICAgICAgICBwYXJhbXNJbml0OiBwYXJhbXNJbml0LAotICAgICAgICBu
YW1lOiBmb3VuZEhlbHBlciwKLSAgICAgICAgY2FsbFBhcmFtczogWyJkZXB0aDAiXS5jb25jYXQo
cGFyYW1zKS5qb2luKCIsICIpLAotICAgICAgICBoZWxwZXJNaXNzaW5nUGFyYW1zOiBtaXNzaW5n
UGFyYW1zICYmIFsiZGVwdGgwIiwgdGhpcy5xdW90ZWRTdHJpbmcobmFtZSldLmNvbmNhdChwYXJh
bXMpLmpvaW4oIiwgIikKLSAgICAgIH07Ci0gICAgfSwKLQotICAgIHNldHVwT3B0aW9uczogZnVu
Y3Rpb24ocGFyYW1TaXplLCBwYXJhbXMpIHsKLSAgICAgIHZhciBvcHRpb25zID0gW10sIGNvbnRl
eHRzID0gW10sIHR5cGVzID0gW10sIHBhcmFtLCBpbnZlcnNlLCBwcm9ncmFtOwotCi0gICAgICBv
cHRpb25zLnB1c2goImhhc2g6IiArIHRoaXMucG9wU3RhY2soKSk7Ci0KLSAgICAgIGlmICh0aGlz
Lm9wdGlvbnMuc3RyaW5nUGFyYW1zKSB7Ci0gICAgICAgIG9wdGlvbnMucHVzaCgiaGFzaFR5cGVz
OiIgKyB0aGlzLnBvcFN0YWNrKCkpOwotICAgICAgICBvcHRpb25zLnB1c2goImhhc2hDb250ZXh0
czoiICsgdGhpcy5wb3BTdGFjaygpKTsKLSAgICAgIH0KLQotICAgICAgaW52ZXJzZSA9IHRoaXMu
cG9wU3RhY2soKTsKLSAgICAgIHByb2dyYW0gPSB0aGlzLnBvcFN0YWNrKCk7Ci0KLSAgICAgIC8v
IEF2b2lkIHNldHRpbmcgZm4gYW5kIGludmVyc2UgaWYgbmVpdGhlciBhcmUgc2V0LiBUaGlzIGFs
bG93cwotICAgICAgLy8gaGVscGVycyB0byBkbyBhIGNoZWNrIGZvciBgaWYgKG9wdGlvbnMuZm4p
YAotICAgICAgaWYgKHByb2dyYW0gfHwgaW52ZXJzZSkgewotICAgICAgICBpZiAoIXByb2dyYW0p
IHsKLSAgICAgICAgICB0aGlzLmNvbnRleHQuYWxpYXNlcy5zZWxmID0gInRoaXMiOwotICAgICAg
ICAgIHByb2dyYW0gPSAic2VsZi5ub29wIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW52
ZXJzZSkgewotICAgICAgICAgIHRoaXMuY29udGV4dC5hbGlhc2VzLnNlbGYgPSAidGhpcyI7Ci0g
ICAgICAgICAgaW52ZXJzZSA9ICJzZWxmLm5vb3AiOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0
aW9ucy5wdXNoKCJpbnZlcnNlOiIgKyBpbnZlcnNlKTsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJm
bjoiICsgcHJvZ3JhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvcih2YXIgaT0wOyBpPHBhcmFtU2l6
ZTsgaSsrKSB7Ci0gICAgICAgIHBhcmFtID0gdGhpcy5wb3BTdGFjaygpOwotICAgICAgICBwYXJh
bXMucHVzaChwYXJhbSk7Ci0KLSAgICAgICAgaWYodGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcykg
ewotICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5wb3BTdGFjaygpKTsKLSAgICAgICAgICBjb250
ZXh0cy5wdXNoKHRoaXMucG9wU3RhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAg
aWYgKHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMpIHsKLSAgICAgICAgb3B0aW9ucy5wdXNoKCJj
b250ZXh0czpbIiArIGNvbnRleHRzLmpvaW4oIiwiKSArICJdIik7Ci0gICAgICAgIG9wdGlvbnMu
cHVzaCgidHlwZXM6WyIgKyB0eXBlcy5qb2luKCIsIikgKyAiXSIpOwotICAgICAgfQotCi0gICAg
ICBpZih0aGlzLm9wdGlvbnMuZGF0YSkgewotICAgICAgICBvcHRpb25zLnB1c2goImRhdGE6ZGF0
YSIpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9LAotCi0gICAgLy8g
dGhlIHBhcmFtcyBhbmQgY29udGV4dHMgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gYXJyYXlzCi0g
ICAgLy8gdG8gZmlsbCBpbgotICAgIHNldHVwUGFyYW1zOiBmdW5jdGlvbihwYXJhbVNpemUsIHBh
cmFtcywgdXNlUmVnaXN0ZXIpIHsKLSAgICAgIHZhciBvcHRpb25zID0gJ3snICsgdGhpcy5zZXR1
cE9wdGlvbnMocGFyYW1TaXplLCBwYXJhbXMpLmpvaW4oJywnKSArICd9JzsKLQotICAgICAgaWYg
KHVzZVJlZ2lzdGVyKSB7Ci0gICAgICAgIHRoaXMudXNlUmVnaXN0ZXIoJ29wdGlvbnMnKTsKLSAg
ICAgICAgcGFyYW1zLnB1c2goJ29wdGlvbnMnKTsKLSAgICAgICAgcmV0dXJuICdvcHRpb25zPScg
KyBvcHRpb25zOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1zLnB1c2gob3B0aW9ucyk7
Ci0gICAgICAgIHJldHVybiAnJzsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0KLSAgdmFyIHJlc2Vy
dmVkV29yZHMgPSAoCi0gICAgImJyZWFrIGVsc2UgbmV3IHZhciIgKwotICAgICIgY2FzZSBmaW5h
bGx5IHJldHVybiB2b2lkIiArCi0gICAgIiBjYXRjaCBmb3Igc3dpdGNoIHdoaWxlIiArCi0gICAg
IiBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGgiICsKLSAgICAiIGRlZmF1bHQgaWYgdGhyb3ci
ICsKLSAgICAiIGRlbGV0ZSBpbiB0cnkiICsKLSAgICAiIGRvIGluc3RhbmNlb2YgdHlwZW9mIiAr
Ci0gICAgIiBhYnN0cmFjdCBlbnVtIGludCBzaG9ydCIgKwotICAgICIgYm9vbGVhbiBleHBvcnQg
aW50ZXJmYWNlIHN0YXRpYyIgKwotICAgICIgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXIiICsKLSAg
ICAiIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9uaXplZCIgKwotICAgICIgY2xhc3MgZmxvYXQg
cGFja2FnZSB0aHJvd3MiICsKLSAgICAiIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQiICsK
LSAgICAiIGRlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlIiArCi0gICAgIiBk
b3VibGUgaW1wb3J0IHB1YmxpYyBsZXQgeWllbGQiCi0gICkuc3BsaXQoIiAiKTsKLQotICB2YXIg
Y29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9Owot
Ci0gIGZvcih2YXIgaT0wLCBsPXJlc2VydmVkV29yZHMubGVuZ3RoOyBpPGw7IGkrKykgewotICAg
IGNvbXBpbGVyV29yZHNbcmVzZXJ2ZWRXb3Jkc1tpXV0gPSB0cnVlOwotICB9Ci0KLSAgSmF2YVNj
cmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24obmFt
ZSkgewotICAgIGlmKCFKYXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYg
L15bYS16QS1aXyRdWzAtOWEtekEtWl8kXSokLy50ZXN0KG5hbWUpKSB7Ci0gICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9OwotCi0gIF9fZXhwb3J0c19fID0g
SmF2YVNjcmlwdENvbXBpbGVyOwotICByZXR1cm4gX19leHBvcnRzX187Ci19KShfX21vZHVsZTJf
XywgX19tb2R1bGU1X18pOwotCi0vLyBoYW5kbGViYXJzLmpzCi12YXIgX19tb2R1bGUwX18gPSAo
ZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNf
XywgX19kZXBlbmRlbmN5NF9fLCBfX2RlcGVuZGVuY3k1X18pIHsKLSAgInVzZSBzdHJpY3QiOwot
ICB2YXIgX19leHBvcnRzX187Ci0gIC8qZ2xvYmFscyBIYW5kbGViYXJzOiB0cnVlICovCi0gIHZh
ciBIYW5kbGViYXJzID0gX19kZXBlbmRlbmN5MV9fOwotCi0gIC8vIENvbXBpbGVyIGltcG9ydHMK
LSAgdmFyIEFTVCA9IF9fZGVwZW5kZW5jeTJfXzsKLSAgdmFyIFBhcnNlciA9IF9fZGVwZW5kZW5j
eTNfXy5wYXJzZXI7Ci0gIHZhciBwYXJzZSA9IF9fZGVwZW5kZW5jeTNfXy5wYXJzZTsKLSAgdmFy
IENvbXBpbGVyID0gX19kZXBlbmRlbmN5NF9fLkNvbXBpbGVyOwotICB2YXIgY29tcGlsZSA9IF9f
ZGVwZW5kZW5jeTRfXy5jb21waWxlOwotICB2YXIgcHJlY29tcGlsZSA9IF9fZGVwZW5kZW5jeTRf
Xy5wcmVjb21waWxlOwotICB2YXIgSmF2YVNjcmlwdENvbXBpbGVyID0gX19kZXBlbmRlbmN5NV9f
OwotCi0gIHZhciBfY3JlYXRlID0gSGFuZGxlYmFycy5jcmVhdGU7Ci0gIHZhciBjcmVhdGUgPSBm
dW5jdGlvbigpIHsKLSAgICB2YXIgaGIgPSBfY3JlYXRlKCk7Ci0KLSAgICBoYi5jb21waWxlID0g
ZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHsKLSAgICAgIHJldHVybiBjb21waWxlKGlucHV0LCBv
cHRpb25zLCBoYik7Ci0gICAgfTsKLSAgICBoYi5wcmVjb21waWxlID0gZnVuY3Rpb24gKGlucHV0
LCBvcHRpb25zKSB7Ci0gICAgICByZXR1cm4gcHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgaGIp
OwotICAgIH07Ci0KLSAgICBoYi5BU1QgPSBBU1Q7Ci0gICAgaGIuQ29tcGlsZXIgPSBDb21waWxl
cjsKLSAgICBoYi5KYXZhU2NyaXB0Q29tcGlsZXIgPSBKYXZhU2NyaXB0Q29tcGlsZXI7Ci0gICAg
aGIuUGFyc2VyID0gUGFyc2VyOwotICAgIGhiLnBhcnNlID0gcGFyc2U7Ci0KLSAgICByZXR1cm4g
aGI7Ci0gIH07Ci0KLSAgSGFuZGxlYmFycyA9IGNyZWF0ZSgpOwotICBIYW5kbGViYXJzLmNyZWF0
ZSA9IGNyZWF0ZTsKLQotICBfX2V4cG9ydHNfXyA9IEhhbmRsZWJhcnM7Ci0gIHJldHVybiBfX2V4
cG9ydHNfXzsKLX0pKF9fbW9kdWxlMV9fLCBfX21vZHVsZTdfXywgX19tb2R1bGU4X18sIF9fbW9k
dWxlMTBfXywgX19tb2R1bGUxMV9fKTsKLQotICByZXR1cm4gX19tb2R1bGUwX187Ci19KSgpOwpk
aWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212
Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9q
cXVlcnkuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2px
dWVyeS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkY2E4Y2E0MjU3ZGMzYjdl
YzAwYmU0MjlkZTZhZTE1NmQzNjc5OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5
L2pxdWVyeS5qcworKysgL2Rldi9udWxsCkBAIC0xLDkxMTEgKzAsMCBAQAotLyohCi0gKiBqUXVl
cnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjEuMAotICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgot
ICogSW5jbHVkZXMgU2l6emxlLmpzCi0gKiBodHRwOi8vc2l6emxlanMuY29tLwotICoKLSAqIENv
cHlyaWdodCAyMDA1LCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250
cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQotICogaHR0cDovL2px
dWVyeS5vcmcvbGljZW5zZQotICoKLSAqIERhdGU6IDIwMTQtMDEtMjNUMjE6MTBaCi0gKi8KLQot
KGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7Ci0KLSAgICBpZiAoIHR5cGVvZiBtb2R1bGUg
PT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7Ci0g
ICAgICAgIC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hl
cmUgYSBwcm9wZXIgd2luZG93IGlzIHByZXNlbnQsCi0gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGZh
Y3RvcnkgYW5kIGdldCBqUXVlcnkKLSAgICAgICAgLy8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRv
IG5vdCBpbmhlcmVudGx5IHBvc3NlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQKLSAgICAgICAg
Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGpRdWVyeS1tYWtpbmcgZmFjdG9yeSBhcyBt
b2R1bGUuZXhwb3J0cwotICAgICAgICAvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0
aGUgY3JlYXRpb24gb2YgYSByZWFsIHdpbmRvdwotICAgICAgICAvLyBlLmcuIHZhciBqUXVlcnkg
PSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwotICAgICAgICAvLyBTZWUgdGlja2V0ICMxNDU0
OSBmb3IgbW9yZSBpbmZvCi0gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50
ID8KLSAgICAgICAgICAgIGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDoKLSAgICAgICAgICAgIGZ1
bmN0aW9uKCB3ICkgewotICAgICAgICAgICAgICAgIGlmICggIXcuZG9jdW1lbnQgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggImpRdWVyeSByZXF1aXJlcyBhIHdpbmRv
dyB3aXRoIGEgZG9jdW1lbnQiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWN0b3J5KCB3ICk7Ci0gICAgICAgICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGZhY3RvcnkoIGdsb2JhbCApOwotICAgIH0KLQotLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBp
cyBub3QgZGVmaW5lZCB5ZXQKLX0odHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5k
b3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHsKLQotLy8gQ2FuJ3QgZG8g
dGhpcyBiZWNhdXNlIHNldmVyYWwgYXBwcyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZQotLy8gdGhl
IHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCi0v
LyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggInVzZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEz
MzM1KQotLy8gU3VwcG9ydDogRmlyZWZveCAxOCsKLS8vCi0KLXZhciBhcnIgPSBbXTsKLQotdmFy
IHNsaWNlID0gYXJyLnNsaWNlOwotCi12YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKLQotdmFyIHB1
c2ggPSBhcnIucHVzaDsKLQotdmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjsKLQotdmFyIGNsYXNz
MnR5cGUgPSB7fTsKLQotdmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZzsKLQotdmFy
IGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7Ci0KLXZhciB0cmltID0gIiIudHJp
bTsKLQotdmFyIHN1cHBvcnQgPSB7fTsKLQotCi0KLXZhcgotICAgIC8vIFVzZSB0aGUgY29ycmVj
dCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKLSAg
ICBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKLQotICAgIHZlcnNpb24gPSAiMi4xLjAiLAot
Ci0gICAgLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKLSAgICBqUXVlcnkgPSBmdW5j
dGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7Ci0gICAgICAgIC8vIFRoZSBqUXVlcnkgb2JqZWN0
IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwotICAgICAg
ICAvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBi
ZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKQotICAgICAgICByZXR1cm4gbmV3IGpRdWVyeS5mbi5p
bml0KCBzZWxlY3RvciwgY29udGV4dCApOwotICAgIH0sCi0KLSAgICAvLyBNYXRjaGVzIGRhc2hl
ZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKLSAgICBybXNQcmVmaXggPSAvXi1tcy0vLAotICAgIHJk
YXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwKLQotICAgIC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVs
Q2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKLSAgICBmY2FtZWxDYXNlID0gZnVuY3Rpb24o
IGFsbCwgbGV0dGVyICkgewotICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Ci0g
ICAgfTsKLQotalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKLSAgICAvLyBUaGUgY3Vy
cmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCi0gICAganF1ZXJ5OiB2ZXJzaW9uLAot
Ci0gICAgY29uc3RydWN0b3I6IGpRdWVyeSwKLQotICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkg
c2VsZWN0b3IKLSAgICBzZWxlY3RvcjogIiIsCi0KLSAgICAvLyBUaGUgZGVmYXVsdCBsZW5ndGgg
b2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKLSAgICBsZW5ndGg6IDAsCi0KLSAgICB0b0FycmF5OiBm
dW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAot
Ci0gICAgLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBP
UgotICAgIC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFy
cmF5Ci0gICAgZ2V0OiBmdW5jdGlvbiggbnVtICkgewotICAgICAgICByZXR1cm4gbnVtICE9IG51
bGwgPwotCi0gICAgICAgICAgICAvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5Ci0gICAgICAgICAg
ICAoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6
Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKLSAgICAgICAgICAgIHNs
aWNlLmNhbGwoIHRoaXMgKTsKLSAgICB9LAotCi0gICAgLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVt
ZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjawotICAgIC8vIChyZXR1cm5pbmcgdGhlIG5l
dyBtYXRjaGVkIGVsZW1lbnQgc2V0KQotICAgIHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkg
ewotCi0gICAgICAgIC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0Ci0g
ICAgICAgIHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMg
KTsKLQotICAgICAgICAvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEg
cmVmZXJlbmNlKQotICAgICAgICByZXQucHJldk9iamVjdCA9IHRoaXM7Ci0gICAgICAgIHJldC5j
b250ZXh0ID0gdGhpcy5jb250ZXh0OwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgbmV3bHktZm9y
bWVkIGVsZW1lbnQgc2V0Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwKLQotICAgIC8vIEV4
ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCi0g
ICAgLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4gYXJyYXkgb2YgYXJncywg
YnV0IHRoaXMgaXMKLSAgICAvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCi0gICAgZWFjaDogZnVu
Y3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewotICAgICAgICByZXR1cm4galF1ZXJ5LmVhY2goIHRo
aXMsIGNhbGxiYWNrLCBhcmdzICk7Ci0gICAgfSwKLQotICAgIG1hcDogZnVuY3Rpb24oIGNhbGxi
YWNrICkgewotICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywg
ZnVuY3Rpb24oIGVsZW0sIGkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCgg
ZWxlbSwgaSwgZWxlbSApOwotICAgICAgICB9KSk7Ci0gICAgfSwKLQotICAgIHNsaWNlOiBmdW5j
dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhp
cywgYXJndW1lbnRzICkgKTsKLSAgICB9LAotCi0gICAgZmlyc3Q6IGZ1bmN0aW9uKCkgewotICAg
ICAgICByZXR1cm4gdGhpcy5lcSggMCApOwotICAgIH0sCi0KLSAgICBsYXN0OiBmdW5jdGlvbigp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXEoIC0xICk7Ci0gICAgfSwKLQotICAgIGVxOiBmdW5j
dGlvbiggaSApIHsKLSAgICAgICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLAotICAgICAgICAgICAg
aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTsKLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0
YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKLSAgICB9LAotCi0g
ICAgZW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0
aGlzLmNvbnN0cnVjdG9yKG51bGwpOwotICAgIH0sCi0KLSAgICAvLyBGb3IgaW50ZXJuYWwgdXNl
IG9ubHkuCi0gICAgLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBh
IGpRdWVyeSBtZXRob2QuCi0gICAgcHVzaDogcHVzaCwKLSAgICBzb3J0OiBhcnIuc29ydCwKLSAg
ICBzcGxpY2U6IGFyci5zcGxpY2UKLX07Ci0KLWpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0
ZW5kID0gZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29w
eUlzQXJyYXksIGNsb25lLAotICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCi0g
ICAgICAgIGkgPSAxLAotICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAotICAgICAg
ICBkZWVwID0gZmFsc2U7Ci0KLSAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCi0g
ICAgaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7Ci0gICAgICAgIGRlZXAgPSB0
YXJnZXQ7Ci0KLSAgICAgICAgLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAotICAg
ICAgICB0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTsKLSAgICAgICAgaSsrOwotICAgIH0K
LQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGlu
ZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQotICAgIGlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9i
amVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7Ci0gICAgICAgIHRhcmdldCA9
IHt9OwotICAgIH0KLQotICAgIC8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFy
Z3VtZW50IGlzIHBhc3NlZAotICAgIGlmICggaSA9PT0gbGVuZ3RoICkgewotICAgICAgICB0YXJn
ZXQgPSB0aGlzOwotICAgICAgICBpLS07Ci0gICAgfQotCi0gICAgZm9yICggOyBpIDwgbGVuZ3Ro
OyBpKysgKSB7Ci0gICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2
YWx1ZXMKLSAgICAgICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkg
ewotICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAotICAgICAgICAgICAgZm9y
ICggbmFtZSBpbiBvcHRpb25zICkgewotICAgICAgICAgICAgICAgIHNyYyA9IHRhcmdldFsgbmFt
ZSBdOwotICAgICAgICAgICAgICAgIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07Ci0KLSAgICAgICAg
ICAgICAgICAvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCi0gICAgICAgICAgICAgICAgaWYg
KCB0YXJnZXQgPT09IGNvcHkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVy
Z2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5cwotICAgICAgICAgICAgICAgIGlmICggZGVlcCAm
JiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0g
alF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggY29w
eUlzQXJyYXkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNl
OwotICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXko
c3JjKSA/IHNyYyA6IFtdOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMp
ID8gc3JjIDoge307Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAg
ICAvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KLSAgICAgICAgICAg
ICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29w
eSApOwotCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVl
cwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiB0aGUg
bW9kaWZpZWQgb2JqZWN0Ci0gICAgcmV0dXJuIHRhcmdldDsKLX07Ci0KLWpRdWVyeS5leHRlbmQo
ewotICAgIC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQotICAg
IGV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2Uo
IC9cRC9nLCAiIiApLAotCi0gICAgLy8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRo
ZSByZWFkeSBtb2R1bGUKLSAgICBpc1JlYWR5OiB0cnVlLAotCi0gICAgZXJyb3I6IGZ1bmN0aW9u
KCBtc2cgKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvciggbXNnICk7Ci0gICAgfSwKLQotICAg
IG5vb3A6IGZ1bmN0aW9uKCkge30sCi0KLSAgICAvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9y
IGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgotICAgIC8vIFNpbmNlIHZlcnNpb24gMS4z
LCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKLSAgICAvLyBhcmVuJ3Qgc3Vw
cG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLgotICAgIGlzRnVuY3Rpb246
IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAi
ZnVuY3Rpb24iOwotICAgIH0sCi0KLSAgICBpc0FycmF5OiBBcnJheS5pc0FycmF5LAotCi0gICAg
aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAm
JiBvYmogPT09IG9iai53aW5kb3c7Ci0gICAgfSwKLQotICAgIGlzTnVtZXJpYzogZnVuY3Rpb24o
IG9iaiApIHsKLSAgICAgICAgLy8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBw
b3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXwiIikKLSAgICAgICAgLy8gLi4uYnV0IG1pc2ludGVy
cHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAo
IjB4Li4uIikKLSAgICAgICAgLy8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFO
Ci0gICAgICAgIHJldHVybiBvYmogLSBwYXJzZUZsb2F0KCBvYmogKSA+PSAwOwotICAgIH0sCi0K
LSAgICBpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewotICAgICAgICAvLyBOb3QgcGxh
aW4gb2JqZWN0czoKLSAgICAgICAgLy8gLSBBbnkgb2JqZWN0IG9yIHZhbHVlIHdob3NlIGludGVy
bmFsIFtbQ2xhc3NdXSBwcm9wZXJ0eSBpcyBub3QgIltvYmplY3QgT2JqZWN0XSIKLSAgICAgICAg
Ly8gLSBET00gbm9kZXMKLSAgICAgICAgLy8gLSB3aW5kb3cKLSAgICAgICAgaWYgKCBqUXVlcnku
dHlwZSggb2JqICkgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5k
b3coIG9iaiApICkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gU3VwcG9ydDogRmlyZWZveCA8MjAKLSAgICAgICAgLy8gVGhlIHRyeS9jYXRjaCBz
dXBwcmVzc2VzIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MKLSAg
ICAgICAgLy8gdGhlICJjb25zdHJ1Y3RvciIgcHJvcGVydHkgb2YgY2VydGFpbiBob3N0IG9iamVj
dHMsIGllLiB8d2luZG93LmxvY2F0aW9ufAotICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1v
emlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04MTQ2MjIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAg
ICAgIGlmICggb2JqLmNvbnN0cnVjdG9yICYmCi0gICAgICAgICAgICAgICAgICAgICFoYXNPd24u
Y2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiICkgKSB7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNh
dGNoICggZSApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIElmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgcmV0dXJuZWQgYWxyZWFkeSwgd2UncmUgY29u
ZmlkZW50IHRoYXQKLSAgICAgICAgLy8gfG9ianwgaXMgYSBwbGFpbiBvYmplY3QsIGNyZWF0ZWQg
Ynkge30gb3IgY29uc3RydWN0ZWQgd2l0aCBuZXcgT2JqZWN0Ci0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIH0sCi0KLSAgICBpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewotICAgICAg
ICB2YXIgbmFtZTsKLSAgICAgICAgZm9yICggbmFtZSBpbiBvYmogKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQot
ICAgIHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgIGlmICggb2JqID09IG51bGwgKSB7
Ci0gICAgICAgICAgICByZXR1cm4gb2JqICsgIiI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3Vw
cG9ydDogQW5kcm9pZCA8IDQuMCwgaU9TIDwgNiAoZnVuY3Rpb25pc2ggUmVnRXhwKQotICAgICAg
ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0
aW9uIiA/Ci0gICAgICAgICAgICBjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKG9iaikgXSB8fCAi
b2JqZWN0IiA6Ci0gICAgICAgICAgICB0eXBlb2Ygb2JqOwotICAgIH0sCi0KLSAgICAvLyBFdmFs
dWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAotICAgIGdsb2JhbEV2YWw6IGZ1bmN0
aW9uKCBjb2RlICkgewotICAgICAgICB2YXIgc2NyaXB0LAotICAgICAgICAgICAgaW5kaXJlY3Qg
PSBldmFsOwotCi0gICAgICAgIGNvZGUgPSBqUXVlcnkudHJpbSggY29kZSApOwotCi0gICAgICAg
IGlmICggY29kZSApIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFs
aWQsIHByb2xvZ3VlIHBvc2l0aW9uCi0gICAgICAgICAgICAvLyBzdHJpY3QgbW9kZSBwcmFnbWEs
IGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYQotICAgICAgICAgICAgLy8gc2NyaXB0IHRhZyBp
bnRvIHRoZSBkb2N1bWVudC4KLSAgICAgICAgICAgIGlmICggY29kZS5pbmRleE9mKCJ1c2Ugc3Ry
aWN0IikgPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgic2NyaXB0Iik7Ci0gICAgICAgICAgICAgICAgc2NyaXB0LnRleHQgPSBjb2RlOwot
ICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVu
dE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIC8vIE90aGVyd2lzZSwgYXZvaWQgdGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRp
b24KLSAgICAgICAgICAgIC8vIGFuZCByZW1vdmFsIGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2Jh
bCBldmFsCi0gICAgICAgICAgICAgICAgaW5kaXJlY3QoIGNvZGUgKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7
IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCi0gICAgLy8gTWljcm9zb2Z0IGZvcmdv
dCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQotICAgIGNhbWVsQ2FzZTogZnVu
Y3Rpb24oIHN0cmluZyApIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVm
aXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwotICAgIH0sCi0K
LSAgICBub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgICAgIHJldHVybiBl
bGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xv
d2VyQ2FzZSgpOwotICAgIH0sCi0KLSAgICAvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBv
bmx5Ci0gICAgZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7Ci0gICAgICAg
IHZhciB2YWx1ZSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbGVuZ3RoID0gb2Jq
Lmxlbmd0aCwKLSAgICAgICAgICAgIGlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7Ci0KLSAg
ICAgICAgaWYgKCBhcmdzICkgewotICAgICAgICAgICAgaWYgKCBpc0FycmF5ICkgewotICAgICAg
ICAgICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAg
ICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOwotCi0gICAgICAgICAg
ICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoIGkgaW4gb2JqICkgewotICAg
ICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyAp
OwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgLy8gQSBzcGVjaWFsLCBmYXN0LCBj
YXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGlmICggaXNBcnJheSApIHsKLSAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBs
ZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjYWxsYmFjay5jYWxs
KCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHZh
bHVlID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICBmb3IgKCBpIGluIG9iaiApIHsKLSAgICAgICAgICAgICAgICAgICAg
dmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotICAgICAg
ICAgICAgICAgICAgICBpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9LAot
Ci0gICAgdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0ID09IG51
bGwgPyAiIiA6IHRyaW0uY2FsbCggdGV4dCApOwotICAgIH0sCi0KLSAgICAvLyByZXN1bHRzIGlz
IGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0gICAgbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCBy
ZXN1bHRzICkgewotICAgICAgICB2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKLQotICAgICAgICBp
ZiAoIGFyciAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKCBpc0FycmF5bGlrZSggT2JqZWN0
KGFycikgKSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkubWVyZ2UoIHJldCwKLSAgICAgICAg
ICAgICAgICAgICAgdHlwZW9mIGFyciA9PT0gInN0cmluZyIgPwotICAgICAgICAgICAgICAgICAg
ICBbIGFyciBdIDogYXJyCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgcHVzaC5jYWxsKCByZXQsIGFyciApOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9LAotCi0gICAgaW5BcnJheTog
ZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKLSAgICAgICAgcmV0dXJuIGFyciA9PSBudWxsID8g
LTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApOwotICAgIH0sCi0KLSAgICBtZXJnZTog
ZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7Ci0gICAgICAgIHZhciBsZW4gPSArc2Vjb25kLmxl
bmd0aCwKLSAgICAgICAgICAgIGogPSAwLAotICAgICAgICAgICAgaSA9IGZpcnN0Lmxlbmd0aDsK
LQotICAgICAgICBmb3IgKCA7IGogPCBsZW47IGorKyApIHsKLSAgICAgICAgICAgIGZpcnN0WyBp
KysgXSA9IHNlY29uZFsgaiBdOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyc3QubGVuZ3RoID0g
aTsKLQotICAgICAgICByZXR1cm4gZmlyc3Q7Ci0gICAgfSwKLQotICAgIGdyZXA6IGZ1bmN0aW9u
KCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrSW52ZXJz
ZSwKLSAgICAgICAgICAgIG1hdGNoZXMgPSBbXSwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAg
ICAgICAgbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAotICAgICAgICAgICAgY2FsbGJhY2tFeHBlY3Qg
PSAhaW52ZXJ0OwotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmlu
ZyB0aGUgaXRlbXMKLSAgICAgICAgLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24K
LSAgICAgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBjYWxsYmFj
a0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKLSAgICAgICAgICAgIGlmICgg
Y2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKLSAgICAgICAgICAgICAgICBt
YXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0sCi0KLSAgICAvLyBhcmcgaXMgZm9yIGludGVy
bmFsIHVzYWdlIG9ubHkKLSAgICBtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyAp
IHsKLSAgICAgICAgdmFyIHZhbHVlLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAgICBs
ZW5ndGggPSBlbGVtcy5sZW5ndGgsCi0gICAgICAgICAgICBpc0FycmF5ID0gaXNBcnJheWxpa2Uo
IGVsZW1zICksCi0gICAgICAgICAgICByZXQgPSBbXTsKLQotICAgICAgICAvLyBHbyB0aHJvdWdo
IHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZh
bHVlcwotICAgICAgICBpZiAoIGlzQXJyYXkgKSB7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBs
ZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sg
aSBdLCBpLCBhcmcgKTsKLQotICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCApIHsK
LSAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRo
ZSBvYmplY3QsCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKCBpIGluIGVsZW1z
ICkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFy
ZyApOwotCi0gICAgICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBudWxsICkgewotICAgICAgICAg
ICAgICAgICAgICByZXQucHVzaCggdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlz
Ci0gICAgICAgIHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKLSAgICB9LAotCi0gICAg
Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCi0gICAgZ3VpZDogMSwKLQotICAg
IC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFw
cGx5aW5nIGFueQotICAgIC8vIGFyZ3VtZW50cy4KLSAgICBwcm94eTogZnVuY3Rpb24oIGZuLCBj
b250ZXh0ICkgewotICAgICAgICB2YXIgdG1wLCBhcmdzLCBwcm94eTsKLQotICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0ID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHRtcCA9IGZuWyBj
b250ZXh0IF07Ci0gICAgICAgICAgICBjb250ZXh0ID0gZm47Ci0gICAgICAgICAgICBmbiA9IHRt
cDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0
YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCi0gICAgICAgIC8vIHRoaXMgdGhyb3dzIGEg
VHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCi0gICAgICAgIGlm
ICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVm
aW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNpbXVsYXRlZCBiaW5kCi0gICAgICAgIGFy
Z3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKLSAgICAgICAgcHJveHkgPSBmdW5jdGlv
bigpIHsKLSAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdz
LmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApOwotICAgICAgICB9OwotCi0gICAg
ICAgIC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmln
aW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAotICAgICAgICBwcm94eS5ndWlkID0g
Zm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKLQotICAgICAgICByZXR1cm4gcHJv
eHk7Ci0gICAgfSwKLQotICAgIG5vdzogRGF0ZS5ub3csCi0KLSAgICAvLyBqUXVlcnkuc3VwcG9y
dCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXIKLSAg
ICAvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgotICAgIHN1cHBvcnQ6
IHN1cHBvcnQKLX0pOwotCi0vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXAKLWpRdWVyeS5l
YWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2Jq
ZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7Ci0gICAgY2xhc3MydHlw
ZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLX0pOwot
Ci1mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgewotICAgIHZhciBsZW5ndGggPSBvYmoubGVu
Z3RoLAotICAgICAgICB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApOwotCi0gICAgaWYgKCB0eXBl
ID09PSAiZnVuY3Rpb24iIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5n
dGggKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiB0eXBlID09
PSAiYXJyYXkiIHx8IGxlbmd0aCA9PT0gMCB8fAotICAgICAgICB0eXBlb2YgbGVuZ3RoID09PSAi
bnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKLX0KLXZhciBT
aXp6bGUgPQotLyohCi0gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2MS4xMC4xNgotICog
aHR0cDovL3NpenpsZWpzLmNvbS8KLSAqCi0gKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRh
dGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUg
TUlUIGxpY2Vuc2UKLSAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKLSAqCi0gKiBEYXRlOiAy
MDE0LTAxLTEzCi0gKi8KLShmdW5jdGlvbiggd2luZG93ICkgewotCi12YXIgaSwKLSAgICBzdXBw
b3J0LAotICAgIEV4cHIsCi0gICAgZ2V0VGV4dCwKLSAgICBpc1hNTCwKLSAgICBjb21waWxlLAot
ICAgIG91dGVybW9zdENvbnRleHQsCi0gICAgc29ydElucHV0LAotICAgIGhhc0R1cGxpY2F0ZSwK
LQotICAgIC8vIExvY2FsIGRvY3VtZW50IHZhcnMKLSAgICBzZXREb2N1bWVudCwKLSAgICBkb2N1
bWVudCwKLSAgICBkb2NFbGVtLAotICAgIGRvY3VtZW50SXNIVE1MLAotICAgIHJidWdneVFTQSwK
LSAgICByYnVnZ3lNYXRjaGVzLAotICAgIG1hdGNoZXMsCi0gICAgY29udGFpbnMsCi0KLSAgICAv
LyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCi0gICAgZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcg
RGF0ZSgpKSwKLSAgICBwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsCi0gICAgZGlycnVu
cyA9IDAsCi0gICAgZG9uZSA9IDAsCi0gICAgY2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0g
ICAgdG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksCi0gICAgY29tcGlsZXJDYWNoZSA9IGNyZWF0
ZUNhY2hlKCksCi0gICAgc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIGlm
ICggYSA9PT0gYiApIHsKLSAgICAgICAgICAgIGhhc0R1cGxpY2F0ZSA9IHRydWU7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSwKLQotICAgIC8vIEdlbmVyYWwtcHVycG9zZSBj
b25zdGFudHMKLSAgICBzdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAotICAgIE1BWF9O
RUdBVElWRSA9IDEgPDwgMzEsCi0KLSAgICAvLyBJbnN0YW5jZSBtZXRob2RzCi0gICAgaGFzT3du
ID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKLSAgICBhcnIgPSBbXSwKLSAgICBwb3AgPSBhcnIucG9w
LAotICAgIHB1c2hfbmF0aXZlID0gYXJyLnB1c2gsCi0gICAgcHVzaCA9IGFyci5wdXNoLAotICAg
IHNsaWNlID0gYXJyLnNsaWNlLAotICAgIC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBp
ZiB3ZSBjYW4ndCB1c2UgYSBuYXRpdmUgb25lCi0gICAgaW5kZXhPZiA9IGFyci5pbmRleE9mIHx8
IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICB2YXIgaSA9IDAsCi0gICAgICAgICAgICBsZW4g
PSB0aGlzLmxlbmd0aDsKLSAgICAgICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAg
ICAgICBpZiAoIHRoaXNbaV0gPT09IGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0sCi0K
LSAgICBib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxh
eXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVu
fHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCi0KLSAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25z
Ci0KLSAgICAvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3Nz
My1zZWxlY3RvcnMvI3doaXRlc3BhY2UKLSAgICB3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxc
blxcZl0iLAotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0
ZXJzCi0gICAgY2hhcmFjdGVyRW5jb2RpbmcgPSAiKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4
YTBdKSsiLAotCi0gICAgLy8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJh
Y3RlcnMKLSAgICAvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmll
ciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9y
cwotICAgIC8vIFByb3BlciBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRh
dGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgotICAgIGlkZW50aWZpZXIgPSBjaGFyYWN0ZXJF
bmNvZGluZy5yZXBsYWNlKCAidyIsICJ3IyIgKSwKLQotICAgIC8vIEFjY2VwdGFibGUgb3BlcmF0
b3JzIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwot
ICAgIGF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5j
b2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsKLSAgICAgICAgIiooPzooWypeJHwhfl0/PSkiICsg
d2hpdGVzcGFjZSArICIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlk
ZW50aWZpZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFjZSArICIqXFxdIiwKLQotICAgIC8vIFByZWZl
ciBhcmd1bWVudHMgcXVvdGVkLAotICAgIC8vICAgdGhlbiBub3QgY29udGFpbmluZyBwc2V1ZG9z
L2JyYWNrZXRzLAotICAgIC8vICAgdGhlbiBhdHRyaWJ1dGUgc2VsZWN0b3JzL25vbi1wYXJlbnRo
ZXRpY2FsIGV4cHJlc3Npb25zLAotICAgIC8vICAgdGhlbiBhbnl0aGluZyBlbHNlCi0gICAgLy8g
VGhlc2UgcHJlZmVyZW5jZXMgYXJlIGhlcmUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0
b3JzCi0gICAgLy8gICBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBQU0VVRE8gcHJlRmlsdGVyCi0g
ICAgcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKChbJ1wiXSko
KD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJp
YnV0ZXMucmVwbGFjZSggMywgOCApICsgIikqKXwuKilcXCl8KSIsCi0KLSAgICAvLyBMZWFkaW5n
IGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24t
d2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyCi0gICAgcnRyaW0gPSBu
ZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikq
KSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICksCi0KLSAgICByY29tbWEgPSBuZXcgUmVnRXhw
KCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwKLSAgICByY29t
YmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooWz4rfl18IiArIHdo
aXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCi0KLSAgICByYXR0cmlidXRlUXVv
dGVzID0gbmV3IFJlZ0V4cCggIj0iICsgd2hpdGVzcGFjZSArICIqKFteXFxdJ1wiXSo/KSIgKyB3
aGl0ZXNwYWNlICsgIipcXF0iLCAiZyIgKSwKLQotICAgIHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBw
c2V1ZG9zICksCi0gICAgcmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCAiXiIgKyBpZGVudGlmaWVy
ICsgIiQiICksCi0KLSAgICBtYXRjaEV4cHIgPSB7Ci0gICAgICAgICJJRCI6IG5ldyBSZWdFeHAo
ICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKLSAgICAgICAgIkNMQVNTIjogbmV3
IFJlZ0V4cCggIl5cXC4oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCi0gICAgICAgICJU
QUciOiBuZXcgUmVnRXhwKCAiXigiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAi
dyoiICkgKyAiKSIgKSwKLSAgICAgICAgIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1
dGVzICksCi0gICAgICAgICJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCi0g
ICAgICAgICJDSElMRCI6IG5ldyBSZWdFeHAoICJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1s
YXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsgd2hpdGVzcGFjZSArCi0gICAgICAgICAgICAi
KihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwp
IiArIHdoaXRlc3BhY2UgKwotICAgICAgICAgICAgIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSAr
ICIqXFwpfCkiLCAiaSIgKSwKLSAgICAgICAgImJvb2wiOiBuZXcgUmVnRXhwKCAiXig/OiIgKyBi
b29sZWFucyArICIpJCIsICJpIiApLAotICAgICAgICAvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBp
bXBsZW1lbnRpbmcgLmlzKCkKLSAgICAgICAgLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGlu
ZyBpbiBgc2VsZWN0YAotICAgICAgICAibmVlZHNDb250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsg
d2hpdGVzcGFjZSArICIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCko
PzpcXCgiICsKLSAgICAgICAgICAgIHdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3
aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQotICAgIH0sCi0KLSAgICByaW5w
dXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKLSAgICByaGVhZGVy
ID0gL15oXGQkL2ksCi0KLSAgICBybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAot
Ci0gICAgLy8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mg
c2VsZWN0b3JzCi0gICAgcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1d
KykpJC8sCi0KLSAgICByc2libGluZyA9IC9bK35dLywKLSAgICByZXNjYXBlID0gLyd8XFwvZywK
LQotICAgIC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEu
aHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKLSAgICBydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxc
XChbXFxkYS1mXXsxLDZ9IiArIHdoaXRlc3BhY2UgKyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwu
KSIsICJpZyIgKSwKLSAgICBmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBl
ZFdoaXRlc3BhY2UgKSB7Ci0gICAgICAgIHZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEw
MDAwOwotICAgICAgICAvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAotICAgICAgICAvLyBTdXBw
b3J0OiBGaXJlZm94Ci0gICAgICAgIC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50
ZXJwcmV0YXRpb24gb2YgKyIweCIKLSAgICAgICAgcmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNj
YXBlZFdoaXRlc3BhY2UgPwotICAgICAgICAgICAgZXNjYXBlZCA6Ci0gICAgICAgICAgICBoaWdo
IDwgMCA/Ci0gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGVwb2ludAotICAgICAgICAgICAgICAg
IFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOgotICAgICAgICAgICAgICAg
IC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQotICAgICAg
ICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2gg
JiAweDNGRiB8IDB4REMwMCApOwotICAgIH07Ci0KLS8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5
KCBfLCBOb2RlTGlzdCApCi10cnkgewotICAgIHB1c2guYXBwbHkoCi0gICAgICAgIChhcnIgPSBz
bGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSwKLSAgICAgICAgcHJlZmVycmVk
RG9jLmNoaWxkTm9kZXMKLSAgICApOwotICAgIC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wCi0gICAg
Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseQotICAgIGFyclsgcHJlZmVycmVk
RG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Ci19IGNhdGNoICggZSApIHsKLSAgICBw
dXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/Ci0KLSAgICAgICAgLy8gTGV2ZXJhZ2Ugc2xpY2Ug
aWYgcG9zc2libGUKLSAgICAgICAgZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewotICAgICAgICAg
ICAgcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7Ci0gICAgICAg
IH0gOgotCi0gICAgICAgIC8vIFN1cHBvcnQ6IElFPDkKLSAgICAgICAgLy8gT3RoZXJ3aXNlIGFw
cGVuZCBkaXJlY3RseQotICAgICAgICBmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7Ci0gICAgICAg
ICAgICB2YXIgaiA9IHRhcmdldC5sZW5ndGgsCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAg
ICAgICAgICAvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgKLSAgICAgICAgICAgIHdoaWxl
ICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KLSAgICAgICAgICAgIHRhcmdldC5sZW5n
dGggPSBqIC0gMTsKLSAgICAgICAgfQotICAgIH07Ci19Ci0KLWZ1bmN0aW9uIFNpenpsZSggc2Vs
ZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFyIG1hdGNoLCBlbGVtLCBt
LCBub2RlVHlwZSwKLSAgICAgICAgLy8gUVNBIHZhcnMKLSAgICAgICAgaSwgZ3JvdXBzLCBvbGQs
IG5pZCwgbmV3Q29udGV4dCwgbmV3U2VsZWN0b3I7Ci0KLSAgICBpZiAoICggY29udGV4dCA/IGNv
bnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3Vt
ZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCggY29udGV4dCApOwotICAgIH0KLQotICAgIGNv
bnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwotICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IFtd
OwotCi0gICAgaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiAp
IHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgaWYgKCAobm9kZVR5cGUg
PSBjb250ZXh0Lm5vZGVUeXBlKSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsKLSAgICAgICAg
cmV0dXJuIFtdOwotICAgIH0KLQotICAgIGlmICggZG9jdW1lbnRJc0hUTUwgJiYgIXNlZWQgKSB7
Ci0KLSAgICAgICAgLy8gU2hvcnRjdXRzCi0gICAgICAgIGlmICggKG1hdGNoID0gcnF1aWNrRXhw
ci5leGVjKCBzZWxlY3RvciApKSApIHsKLSAgICAgICAgICAgIC8vIFNwZWVkLXVwOiBTaXp6bGUo
IiNJRCIpCi0gICAgICAgICAgICBpZiAoIChtID0gbWF0Y2hbMV0pICkgewotICAgICAgICAgICAg
ICAgIGlmICggbm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBj
b250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNr
IHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCi0gICAgICAg
ICAgICAgICAgICAgIC8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQg
KGpRdWVyeSAjNjk2MykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbGVtICYmIGVsZW0ucGFy
ZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3
aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggZWxlbS5pZCA9PT0gbSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1
bHRzLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICBpZiAo
IGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCggbSApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMo
IGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gcmVzdWx0czsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIG1hdGNoWzJdICkgewotICAgICAgICAgICAgICAgIHB1c2guYXBwbHkoIHJlc3VsdHMs
IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICAgICAgLy8gU3BlZWQtdXA6IFNpenpsZSgi
LkNMQVNTIikKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBv
cnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUgKSB7Ci0gICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFFTQSBwYXRoCi0gICAg
ICAgIGlmICggc3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBz
ZWxlY3RvciApKSApIHsKLSAgICAgICAgICAgIG5pZCA9IG9sZCA9IGV4cGFuZG87Ci0gICAgICAg
ICAgICBuZXdDb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIG5ld1NlbGVjdG9yID0gbm9k
ZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIC8vIHFTQSB3b3JrcyBzdHJh
bmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllcwotICAgICAgICAgICAgLy8gV2UgY2FuIHdv
cmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdAotICAg
ICAgICAgICAgLy8gYW5kIHdvcmtpbmcgdXAgZnJvbSB0aGVyZSAoVGhhbmtzIHRvIEFuZHJldyBE
dXBvbnQgZm9yIHRoZSB0ZWNobmlxdWUpCi0gICAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgd29y
ayBvbiBvYmplY3QgZWxlbWVudHMKLSAgICAgICAgICAgIGlmICggbm9kZVR5cGUgPT09IDEgJiYg
Y29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKLSAgICAgICAg
ICAgICAgICBncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKLQotICAgICAgICAgICAgICAg
IGlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJpZCIpKSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgbmlkID0gb2xkLnJlcGxhY2UoIHJlc2NhcGUsICJcXCQmIiApOwotICAgICAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRl
KCAiaWQiLCBuaWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmlkID0g
IltpZD0nIiArIG5pZCArICInXSAiOwotCi0gICAgICAgICAgICAgICAgaSA9IGdyb3Vwcy5sZW5n
dGg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0
b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dDsKLSAg
ICAgICAgICAgICAgICBuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIsIik7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICggbmV3U2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICAgICAg
dHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3Ig
KQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0czsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKHFzYUVycm9yKSB7Ci0gICAgICAgICAgICAg
ICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAhb2xkICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImlkIik7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgb3RoZXJzCi0gICAgcmV0dXJuIHNlbGVjdCggc2VsZWN0
b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwotfQot
Ci0vKioKLSAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQotICogQHJl
dHVybnMge0Z1bmN0aW9uKHN0cmluZywgT2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEg
YWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aAotICogIHByb3BlcnR5IG5hbWUgdGhlIChz
cGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4
cHIuY2FjaGVMZW5ndGgpCi0gKiAgZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQotICovCi1mdW5j
dGlvbiBjcmVhdGVDYWNoZSgpIHsKLSAgICB2YXIga2V5cyA9IFtdOwotCi0gICAgZnVuY3Rpb24g
Y2FjaGUoIGtleSwgdmFsdWUgKSB7Ci0gICAgICAgIC8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9p
ZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAj
MTU3KQotICAgICAgICBpZiAoIGtleXMucHVzaCgga2V5ICsgIiAiICkgPiBFeHByLmNhY2hlTGVu
Z3RoICkgewotICAgICAgICAgICAgLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVz
Ci0gICAgICAgICAgICBkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFsdWUpOwotICAgIH0KLSAgICBy
ZXR1cm4gY2FjaGU7Ci19Ci0KLS8qKgotICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVz
ZSBieSBTaXp6bGUKLSAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJr
Ci0gKi8KLWZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7Ci0gICAgZm5bIGV4cGFuZG8gXSA9
IHRydWU7Ci0gICAgcmV0dXJuIGZuOwotfQotCi0vKioKLSAqIFN1cHBvcnQgdGVzdGluZyB1c2lu
ZyBhbiBlbGVtZW50Ci0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQg
ZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHQKLSAqLwotZnVuY3Rpb24gYXNzZXJ0KCBm
biApIHsKLSAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0KLSAg
ICB0cnkgewotICAgICAgICByZXR1cm4gISFmbiggZGl2ICk7Ci0gICAgfSBjYXRjaCAoZSkgewot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgLy8gUmVtb3Zl
IGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0Ci0gICAgICAgIGlmICggZGl2LnBhcmVudE5vZGUg
KSB7Ci0gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7Ci0gICAg
ICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKLSAgICAgICAgZGl2ID0gbnVs
bDsKLSAgICB9Ci19Ci0KLS8qKgotICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2Yg
dGhlIHNwZWNpZmllZCBhdHRycwotICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJh
dGVkIGxpc3Qgb2YgYXR0cmlidXRlcwotICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUg
bWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi0gKi8KLWZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0
cnMsIGhhbmRsZXIgKSB7Ci0gICAgdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCi0gICAgICAg
IGkgPSBhdHRycy5sZW5ndGg7Ci0KLSAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgRXhwci5h
dHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7Ci0gICAgfQotfQotCi0vKioKLSAqIENoZWNr
cyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKLSAqIEBwYXJhbSB7RWxlbWVudH0gYQot
ICogQHBhcmFtIHtFbGVtZW50fSBiCi0gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3Mg
dGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKLSAq
LwotZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkgewotICAgIHZhciBjdXIgPSBiICYmIGEs
Ci0gICAgICAgIGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09
PSAxICYmCi0gICAgICAgICAgICAoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC0K
LSAgICAgICAgICAgICggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7Ci0KLSAgICAv
LyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKLSAgICBpZiAo
IGRpZmYgKSB7Ci0gICAgICAgIHJldHVybiBkaWZmOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlm
IGIgZm9sbG93cyBhCi0gICAgaWYgKCBjdXIgKSB7Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1
ci5uZXh0U2libGluZykgKSB7Ci0gICAgICAgICAgICBpZiAoIGN1ciA9PT0gYiApIHsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICByZXR1cm4gYSA/IDEgOiAtMTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24g
dG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzCi0gKiBAcGFyYW0ge1N0cmluZ30gdHlw
ZQotICovCi1mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4g
ZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xv
d2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUg
PT09IHR5cGU7Ci0gICAgfTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNl
IGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKLSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCi0gKi8KLWZ1
bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKLSAgICByZXR1cm4gZnVuY3Rpb24o
IGVsZW0gKSB7Ci0gICAgICAgIHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp
OwotICAgICAgICByZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIp
ICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKLSAgICB9OwotfQotCi0vKioKLSAqIFJldHVybnMgYSBm
dW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHMKLSAqIEBwYXJhbSB7RnVu
Y3Rpb259IGZuCi0gKi8KLWZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkgewot
ICAgIHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewotICAgICAgICBh
cmd1bWVudCA9ICthcmd1bWVudDsKLSAgICAgICAgcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlv
biggc2VlZCwgbWF0Y2hlcyApIHsKLSAgICAgICAgICAgIHZhciBqLAotICAgICAgICAgICAgICAg
IG1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksCi0gICAgICAg
ICAgICAgICAgaSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIE1hdGNo
IGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlcwotICAgICAgICAgICAgd2hp
bGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhl
c1tpXSkgXSApIHsKLSAgICAgICAgICAgICAgICAgICAgc2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9
IHNlZWRbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7
Ci0gICAgfSk7Ci19Ci0KLS8qKgotICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBT
aXp6bGUgY29udGV4dAotICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHQKLSAqIEBy
ZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRh
YmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZQotICovCi1mdW5jdGlvbiB0ZXN0Q29udGV4dCgg
Y29udGV4dCApIHsKLSAgICByZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVt
ZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmIGNvbnRleHQ7Ci19Ci0KLS8vIEV4cG9z
ZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCi1zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQg
PSB7fTsKLQotLyoqCi0gKiBEZXRlY3RzIFhNTCBub2RlcwotICogQHBhcmFtIHtFbGVtZW50fE9i
amVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnQKLSAqIEByZXR1cm5zIHtCb29sZWFu
fSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKLSAqLwotaXNYTUwgPSBTaXp6
bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBkb2N1bWVudEVsZW1lbnQgaXMg
dmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0Ci0gICAgLy8gKHN1
Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpCi0gICAgdmFyIGRvY3VtZW50RWxl
bWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1l
bnQ7Ci0gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFt
ZSAhPT0gIkhUTUwiIDogZmFsc2U7Ci19OwotCi0vKioKLSAqIFNldHMgZG9jdW1lbnQtcmVsYXRl
ZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogQHBhcmFt
IHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8g
dXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKLSAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhl
IGN1cnJlbnQgZG9jdW1lbnQKLSAqLwotc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQg
PSBmdW5jdGlvbiggbm9kZSApIHsKLSAgICB2YXIgaGFzQ29tcGFyZSwKLSAgICAgICAgZG9jID0g
bm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jLAotICAgICAg
ICBwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7Ci0KLSAgICAvLyBJZiBubyBkb2N1bWVudCBhbmQg
ZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuCi0gICAgaWYgKCBkb2MgPT09IGRv
Y3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsK
LSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIC8vIFNldCBvdXIgZG9jdW1l
bnQKLSAgICBkb2N1bWVudCA9IGRvYzsKLSAgICBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVu
dDsKLQotICAgIC8vIFN1cHBvcnQgdGVzdHMKLSAgICBkb2N1bWVudElzSFRNTCA9ICFpc1hNTCgg
ZG9jICk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRT44Ci0gICAgLy8gSWYgaWZyYW1lIGRvY3VtZW50
IGlzIGFzc2lnbmVkIHRvICJkb2N1bWVudCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVl
biByZWxvYWRlZCwKLSAgICAvLyBJRSB3aWxsIHRocm93ICJwZXJtaXNzaW9uIGRlbmllZCIgZXJy
b3Igd2hlbiBhY2Nlc3NpbmcgImRvY3VtZW50IiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzYK
LSAgICAvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28g
cGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkCi0gICAgaWYgKCBwYXJlbnQgJiYgcGFyZW50ICE9PSBw
YXJlbnQudG9wICkgewotICAgICAgICAvLyBJRTExIGRvZXMgbm90IGhhdmUgYXR0YWNoRXZlbnQs
IHNvIGFsbCBtdXN0IHN1ZmZlcgotICAgICAgICBpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVy
ICkgewotICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoICJ1bmxvYWQiLCBmdW5j
dGlvbigpIHsKLSAgICAgICAgICAgICAgICBzZXREb2N1bWVudCgpOwotICAgICAgICAgICAgfSwg
ZmFsc2UgKTsKLSAgICAgICAgfSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkgewotICAg
ICAgICAgICAgcGFyZW50LmF0dGFjaEV2ZW50KCAib251bmxvYWQiLCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgICAgICBzZXREb2N1bWVudCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICAvKiBBdHRyaWJ1dGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAg
Ly8gU3VwcG9ydDogSUU8OAotICAgIC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkg
cmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcyAoZXhjZXB0aW5nIElFOCBib29s
ZWFucykKLSAgICBzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsK
LSAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICJpIjsKLSAgICAgICAgcmV0dXJuICFkaXYuZ2V0QXR0
cmlidXRlKCJjbGFzc05hbWUiKTsKLSAgICB9KTsKLQotICAgIC8qIGdldEVsZW1lbnQocylCeSoK
LSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFn
TmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cwotICAgIHN1cHBvcnQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAgZGl2LmFwcGVuZENo
aWxkKCBkb2MuY3JlYXRlQ29tbWVudCgiIikgKTsKLSAgICAgICAgcmV0dXJuICFkaXYuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Ci0gICAgfSk7Ci0KLSAgICAvLyBDaGVjayBpZiBn
ZXRFbGVtZW50c0J5Q2xhc3NOYW1lIGNhbiBiZSB0cnVzdGVkCi0gICAgc3VwcG9ydC5nZXRFbGVt
ZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2MuZ2V0RWxlbWVudHNCeUNsYXNzTmFt
ZSApICYmIGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotICAgICAgICBkaXYuaW5uZXJIVE1MID0g
IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IjsKLQotICAgICAg
ICAvLyBTdXBwb3J0OiBTYWZhcmk8NAotICAgICAgICAvLyBDYXRjaCBjbGFzcyBvdmVyLWNhY2hp
bmcKLSAgICAgICAgZGl2LmZpcnN0Q2hpbGQuY2xhc3NOYW1lID0gImkiOwotICAgICAgICAvLyBT
dXBwb3J0OiBPcGVyYTwxMAotICAgICAgICAvLyBDYXRjaCBnRUJDTiBmYWlsdXJlIHRvIGZpbmQg
bm9uLWxlYWRpbmcgY2xhc3NlcwotICAgICAgICByZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFz
c05hbWUoImkiKS5sZW5ndGggPT09IDI7Ci0gICAgfSk7Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTwx
MAotICAgIC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFt
ZQotICAgIC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVw
IHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsCi0gICAgLy8gc28gdXNlIGEgcm91bmRhYm91dCBn
ZXRFbGVtZW50c0J5TmFtZSB0ZXN0Ci0gICAgc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0
aW9uKCBkaXYgKSB7Ci0gICAgICAgIGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhw
YW5kbzsKLSAgICAgICAgcmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRF
bGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKLSAgICB9KTsKLQotICAgIC8vIElEIGZp
bmQgYW5kIGZpbHRlcgotICAgIGlmICggc3VwcG9ydC5nZXRCeUlkICkgewotICAgICAgICBFeHBy
LmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7Ci0gICAgICAgICAgICBpZiAo
IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgZG9jdW1l
bnRJc0hUTUwgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRC
eUlkKCBpZCApOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2gg
d2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCi0gICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhh
dCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MwotICAgICAgICAgICAgICAgIHJl
dHVybiBtICYmIG0ucGFyZW50Tm9kZSA/IFttXSA6IFtdOwotICAgICAgICAgICAgfQotICAgICAg
ICB9OwotICAgICAgICBFeHByLmZpbHRlclsiSUQiXSA9IGZ1bmN0aW9uKCBpZCApIHsKLSAgICAg
ICAgICAgIHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwot
ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHJl
dHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gYXR0cklkOwotICAgICAgICAgICAgfTsK
LSAgICAgICAgfTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBTdXBwb3J0OiBJRTYvNwotICAg
ICAgICAvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0
Ci0gICAgICAgIGRlbGV0ZSBFeHByLmZpbmRbIklEIl07Ci0KLSAgICAgICAgRXhwci5maWx0ZXJb
IklEIl0gPSAgZnVuY3Rpb24oIGlkICkgewotICAgICAgICAgICAgdmFyIGF0dHJJZCA9IGlkLnJl
cGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRB
dHRyaWJ1dGVOb2RlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJp
ZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJ
ZDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLy8gVGFnCi0gICAg
RXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwotICAgICAg
ICBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewotICAgICAgICAgICAgaWYgKCB0eXBlb2YgY29u
dGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgewotICAgICAgICAg
ICAgICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSA6Ci0gICAgICAgIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7
Ci0gICAgICAgICAgICB2YXIgZWxlbSwKLSAgICAgICAgICAgICAgICB0bXAgPSBbXSwKLSAgICAg
ICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gY29udGV4dC5nZXRF
bGVtZW50c0J5VGFnTmFtZSggdGFnICk7Ci0KLSAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgcG9z
c2libGUgY29tbWVudHMKLSAgICAgICAgICAgIGlmICggdGFnID09PSAiKiIgKSB7Ci0gICAgICAg
ICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRtcC5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgIH07Ci0KLSAgICAvLyBDbGFzcwotICAg
IEV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBm
dW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewotICAgICAgICBpZiAoIHR5cGVvZiBjb250
ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IHN0cnVuZGVmaW5lZCAmJiBkb2N1bWVudElz
SFRNTCApIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05h
bWUoIGNsYXNzTmFtZSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qIFFTQS9tYXRjaGVz
U2VsZWN0b3IKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAvLyBRU0EgYW5kIG1hdGNoZXNT
ZWxlY3RvciBzdXBwb3J0Ci0KLSAgICAvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0
cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQotICAgIHJidWdneU1hdGNoZXMgPSBb
XTsKLQotICAgIC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUg
MjEpCi0gICAgLy8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQg
dGhyb3dzIGFuIGVycm9yCi0gICAgLy8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRg
IGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQotICAgIC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8g
cGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCi0gICAg
Ly8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4Ci0gICAgcmJ1Z2d5UVNB
ID0gW107Ci0KLSAgICBpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jLnF1ZXJ5
U2VsZWN0b3JBbGwgKSkgKSB7Ci0gICAgICAgIC8vIEJ1aWxkIFFTQSByZWdleAotICAgICAgICAv
LyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCi0gICAgICAgIGFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgewotICAgICAgICAgICAgLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0
eSBzdHJpbmcgb24gcHVycG9zZQotICAgICAgICAgICAgLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3Mg
dHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIGEgYm9v
bGVhbiBjb250ZW50IGF0dHJpYnV0ZSwKLSAgICAgICAgICAgIC8vIHNpbmNlIGl0cyBwcmVzZW5j
ZSBzaG91bGQgYmUgZW5vdWdoCi0gICAgICAgICAgICAvLyBodHRwOi8vYnVncy5qcXVlcnkuY29t
L3RpY2tldC8xMjM1OQotICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0IHQ9Jyc+
PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iOwotCi0gICAgICAgICAgICAv
LyBTdXBwb3J0OiBJRTgsIE9wZXJhIDEwLTEyCi0gICAgICAgICAgICAvLyBOb3RoaW5nIHNob3Vs
ZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9Ci0g
ICAgICAgICAgICBpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbdF49JyddIikubGVuZ3RoICkg
ewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2Ug
KyAiKig/OicnfFwiXCIpIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdXBw
b3J0OiBJRTgKLSAgICAgICAgICAgIC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgInZhbHVlIiBh
cmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICBpZiAoICFkaXYucXVlcnlTZWxl
Y3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICByYnVnZ3lR
U0EucHVzaCggIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooPzp2YWx1ZXwiICsgYm9vbGVhbnMgKyAi
KSIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Via2l0L09wZXJhIC0gOmNo
ZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKLSAgICAgICAgICAg
IC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5
LyNjaGVja2VkCi0gICAgICAgICAgICAvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwg
bm90IHNlZSBsYXRlciB0ZXN0cwotICAgICAgICAgICAgaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JB
bGwoIjpjaGVja2VkIikubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNo
KCI6Y2hlY2tlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3Nl
cnQoZnVuY3Rpb24oIGRpdiApIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBO
YXRpdmUgQXBwcwotICAgICAgICAgICAgLy8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBh
cmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50Ci0gICAgICAgICAgICB2
YXIgaW5wdXQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgICAgICAgIGlucHV0
LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVuIiApOwotICAgICAgICAgICAgZGl2LmFwcGVu
ZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggIm5hbWUiLCAiRCIgKTsKLQotICAgICAgICAg
ICAgLy8gU3VwcG9ydDogSUU4Ci0gICAgICAgICAgICAvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZp
dHkgb2YgbmFtZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JB
bGwoIltuYW1lPWRdIikubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIHJidWdneVFTQS5wdXNo
KCAibmFtZSIgKyB3aGl0ZXNwYWNlICsgIipbKl4kfCF+XT89IiApOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBl
bGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQotICAgICAgICAgICAg
Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKLSAg
ICAgICAgICAgIGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCAp
IHsKLSAgICAgICAgICAgICAgICByYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxl
ZCIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3BlcmEgMTAtMTEgZG9lcyBu
b3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3MKLSAgICAgICAgICAgIGRpdi5x
dWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7Ci0gICAgICAgICAgICByYnVnZ3lRU0EucHVzaCgiLC4q
OiIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxl
Y3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxl
Y3RvciB8fAotICAgICAgICBkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fAotICAgICAgICBk
b2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHwKLSAgICAgICAgZG9jRWxlbS5tc01hdGNoZXNTZWxl
Y3RvcikgKSkgKSB7Ci0KLSAgICAgICAgYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0gICAgICAg
ICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0
b3IKLSAgICAgICAgICAgIC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpCi0gICAgICAg
ICAgICBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsICJkaXYi
ICk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24K
LSAgICAgICAgICAgIC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3Rl
YWQKLSAgICAgICAgICAgIG1hdGNoZXMuY2FsbCggZGl2LCAiW3MhPScnXTp4IiApOwotICAgICAg
ICAgICAgcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7Ci0gICAgICAgIH0pOwot
ICAgIH0KLQotICAgIHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCgg
cmJ1Z2d5UVNBLmpvaW4oInwiKSApOwotICAgIHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVz
Lmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOwotCi0gICAg
LyogQ29udGFpbnMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgaGFzQ29tcGFyZSA9IHJuYXRp
dmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwotCi0gICAgLy8gRWxl
bWVudCBjb250YWlucyBhbm90aGVyCi0gICAgLy8gUHVycG9zZWZ1bGx5IGRvZXMgbm90IGltcGxl
bWVudCBpbmNsdXNpdmUgZGVzY2VuZGVudAotICAgIC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMg
bm90IGNvbnRhaW4gaXRzZWxmCi0gICAgY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUu
dGVzdCggZG9jRWxlbS5jb250YWlucyApID8KLSAgICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7Ci0g
ICAgICAgICAgICB2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1l
bnQgOiBhLAotICAgICAgICAgICAgICAgIGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwotICAgICAg
ICAgICAgcmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAm
JiAoCi0gICAgICAgICAgICAgICAgYWRvd24uY29udGFpbnMgPwotICAgICAgICAgICAgICAgICAg
ICBhZG93bi5jb250YWlucyggYnVwICkgOgotICAgICAgICAgICAgICAgICAgICBhLmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTYK
LSAgICAgICAgICAgICkpOwotICAgICAgICB9IDoKLSAgICAgICAgZnVuY3Rpb24oIGEsIGIgKSB7
Ci0gICAgICAgICAgICBpZiAoIGIgKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAoYiA9IGIu
cGFyZW50Tm9kZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggYiA9PT0gYSApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9OwotCi0gICAgLyogU29ydGluZwotICAgIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
LQotICAgIC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKLSAgICBzb3J0T3JkZXIgPSBoYXNDb21w
YXJlID8KLSAgICBmdW5jdGlvbiggYSwgYiApIHsKLQotICAgICAgICAvLyBGbGFnIGZvciBkdXBs
aWNhdGUgcmVtb3ZhbAotICAgICAgICBpZiAoIGEgPT09IGIgKSB7Ci0gICAgICAgICAgICBoYXNE
dXBsaWNhdGUgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNv
bXBhcmVEb2N1bWVudFBvc2l0aW9uCi0gICAgICAgIHZhciBjb21wYXJlID0gIWEuY29tcGFyZURv
Y3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjsKLSAgICAgICAgaWYg
KCBjb21wYXJlICkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmU7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRo
ZSBzYW1lIGRvY3VtZW50Ci0gICAgICAgIGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBh
ICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/Ci0gICAgICAgICAgICBhLmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uKCBiICkgOgotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Uga25v
dyB0aGV5IGFyZSBkaXNjb25uZWN0ZWQKLSAgICAgICAgICAgIDE7Ci0KLSAgICAgICAgLy8gRGlz
Y29ubmVjdGVkIG5vZGVzCi0gICAgICAgIGlmICggY29tcGFyZSAmIDEgfHwKLSAgICAgICAgICAg
ICghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSAp
ID09PSBjb21wYXJlKSApIHsKLQotICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVt
ZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50Ci0gICAgICAgICAg
ICBpZiAoIGEgPT09IGRvYyB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBj
b250YWlucyhwcmVmZXJyZWREb2MsIGEpICkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggYiA9PT0gZG9jIHx8IGIub3duZXJEb2N1
bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IE1haW50YWluIG9yaWdpbmFsIG9yZGVyCi0gICAgICAgICAgICByZXR1cm4gc29ydElucHV0ID8K
LSAgICAgICAgICAgICAgICAoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9m
LmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOgotICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgIH0K
LQotICAgICAgICByZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7Ci0gICAgfSA6Ci0gICAgZnVu
Y3Rpb24oIGEsIGIgKSB7Ci0gICAgICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBp
ZGVudGljYWwKLSAgICAgICAgaWYgKCBhID09PSBiICkgewotICAgICAgICAgICAgaGFzRHVwbGlj
YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAg
dmFyIGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgYXVwID0gYS5wYXJlbnRO
b2RlLAotICAgICAgICAgICAgYnVwID0gYi5wYXJlbnROb2RlLAotICAgICAgICAgICAgYXAgPSBb
IGEgXSwKLSAgICAgICAgICAgIGJwID0gWyBiIF07Ci0KLSAgICAgICAgLy8gUGFyZW50bGVzcyBu
b2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKLSAgICAgICAgaWYgKCAh
YXVwIHx8ICFidXAgKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA9PT0gZG9jID8gLTEgOgotICAg
ICAgICAgICAgICAgIGIgPT09IGRvYyA/IDEgOgotICAgICAgICAgICAgICAgIGF1cCA/IC0xIDoK
LSAgICAgICAgICAgICAgICBidXAgPyAxIDoKLSAgICAgICAgICAgICAgICBzb3J0SW5wdXQgPwot
ICAgICAgICAgICAgICAgICggaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2Yu
Y2FsbCggc29ydElucHV0LCBiICkgKSA6Ci0gICAgICAgICAgICAgICAgMDsKLQotICAgICAgICAv
LyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVjawotICAg
ICAgICB9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHsKLSAgICAgICAgICAgIHJldHVybiBzaWJs
aW5nQ2hlY2soIGEsIGIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSB3ZSBu
ZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCi0gICAgICAg
IGN1ciA9IGE7Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAg
ICAgICAgICAgIGFwLnVuc2hpZnQoIGN1ciApOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGI7
Ci0gICAgICAgIHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKLSAgICAgICAgICAg
IGJwLnVuc2hpZnQoIGN1ciApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayBkb3duIHRo
ZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKLSAgICAgICAgd2hpbGUgKCBhcFtpXSA9
PT0gYnBbaV0gKSB7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gaSA/Ci0gICAgICAgICAgICAvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhh
dmUgYSBjb21tb24gYW5jZXN0b3IKLSAgICAgICAgICAgIHNpYmxpbmdDaGVjayggYXBbaV0sIGJw
W2ldICkgOgotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50
IHNvcnQgZmlyc3QKLSAgICAgICAgICAgIGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6Ci0g
ICAgICAgICAgICBicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6Ci0gICAgICAgICAgICAwOwot
ICAgIH07Ci0KLSAgICByZXR1cm4gZG9jOwotfTsKLQotU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlv
biggZXhwciwgZWxlbWVudHMgKSB7Ci0gICAgcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVs
bCwgZWxlbWVudHMgKTsKLX07Ci0KLVNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbigg
ZWxlbSwgZXhwciApIHsKLSAgICAvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKLSAgICBp
ZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7Ci0gICAg
ICAgIHNldERvY3VtZW50KCBlbGVtICk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQg
YXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCi0gICAgZXhwciA9IGV4cHIucmVwbGFjZSgg
cmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKLQotICAgIGlmICggc3VwcG9ydC5tYXRjaGVz
U2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKLSAgICAgICAgKCAhcmJ1Z2d5TWF0Y2hlcyB8
fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgotICAgICAgICAoICFyYnVnZ3lRU0Eg
ICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAg
ICAgICAgICAgIHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTsKLQotICAgICAg
ICAgICAgLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5l
Y3RlZCBub2RlcwotICAgICAgICAgICAgaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRN
YXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9k
ZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICAvLyBm
cmFnbWVudCBpbiBJRSA5Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0uZG9jdW1lbnQgJiYgZWxl
bS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJl
dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChlKSB7fQotICAgIH0KLQotICAgIHJl
dHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbZWxlbV0gKS5sZW5ndGggPiAwOwot
fTsKLQotU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7Ci0gICAg
Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0gICAgaWYgKCAoIGNvbnRleHQub3duZXJE
b2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewotICAgICAgICBzZXREb2N1bWVu
dCggY29udGV4dCApOwotICAgIH0KLSAgICByZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0g
KTsKLX07Ci0KLVNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0gICAgLy8g
U2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0gICAgaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVu
dCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewotICAgICAgICBzZXREb2N1bWVudCggZWxlbSAp
OwotICAgIH0KLQotICAgIHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2Fz
ZSgpIF0sCi0gICAgICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBw
cm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KQotICAgICAgICB2YWwgPSBmbiAmJiBoYXNPd24uY2Fs
bCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/Ci0gICAgICAgICAgICBm
biggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgotICAgICAgICAgICAgdW5kZWZpbmVk
OwotCi0gICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KLSAgICAgICAgdmFsIDoKLSAgICAg
ICAgc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/Ci0gICAgICAgICAgICBl
bGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKLSAgICAgICAgICAgICh2YWwgPSBlbGVtLmdldEF0
dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgPwotICAgICAgICAgICAgICAgIHZh
bC52YWx1ZSA6Ci0gICAgICAgICAgICAgICAgbnVsbDsKLX07Ci0KLVNpenpsZS5lcnJvciA9IGZ1
bmN0aW9uKCBtc2cgKSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJl
Y29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOwotfTsKLQotLyoqCi0gKiBEb2N1bWVudCBz
b3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCi0gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVz
dWx0cwotICovCi1TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewotICAg
IHZhciBlbGVtLAotICAgICAgICBkdXBsaWNhdGVzID0gW10sCi0gICAgICAgIGogPSAwLAotICAg
ICAgICBpID0gMDsKLQotICAgIC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBs
aWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKLSAgICBoYXNEdXBsaWNhdGUgPSAhc3VwcG9y
dC5kZXRlY3REdXBsaWNhdGVzOwotICAgIHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUg
JiYgcmVzdWx0cy5zbGljZSggMCApOwotICAgIHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7Ci0K
LSAgICBpZiAoIGhhc0R1cGxpY2F0ZSApIHsKLSAgICAgICAgd2hpbGUgKCAoZWxlbSA9IHJlc3Vs
dHNbaSsrXSkgKSB7Ci0gICAgICAgICAgICBpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsK
LSAgICAgICAgICAgICAgICBqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCBqLS0gKSB7Ci0gICAgICAgICAgICByZXN1bHRz
LnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0cwotICAgIC8vIFNl
ZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNQotICAgIHNvcnRJbnB1
dCA9IG51bGw7Ci0KLSAgICByZXR1cm4gcmVzdWx0czsKLX07Ci0KLS8qKgotICogVXRpbGl0eSBm
dW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00g
bm9kZXMKLSAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbQotICovCi1nZXRUZXh0ID0gU2l6
emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICB2YXIgbm9kZSwKLSAgICAgICAg
cmV0ID0gIiIsCi0gICAgICAgIGkgPSAwLAotICAgICAgICBub2RlVHlwZSA9IGVsZW0ubm9kZVR5
cGU7Ci0KLSAgICBpZiAoICFub2RlVHlwZSApIHsKLSAgICAgICAgLy8gSWYgbm8gbm9kZVR5cGUs
IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkKLSAgICAgICAgd2hpbGUgKCAobm9kZSA9
IGVsZW1baSsrXSkgKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBu
b2RlcwotICAgICAgICAgICAgcmV0ICs9IGdldFRleHQoIG5vZGUgKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBl
ID09PSAxMSApIHsKLSAgICAgICAgLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cwotICAg
ICAgICAvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxp
bmVzIChqUXVlcnkgIzExMTUzKQotICAgICAgICBpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50
ID09PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtLnRleHRDb250ZW50Owot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCi0g
ICAgICAgICAgICBmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxl
bS5uZXh0U2libGluZyApIHsKLSAgICAgICAgICAgICAgICByZXQgKz0gZ2V0VGV4dCggZWxlbSAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICggbm9kZVR5cGUgPT09
IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7Ci0gICAgICAgIHJldHVybiBlbGVtLm5vZGVWYWx1ZTsK
LSAgICB9Ci0gICAgLy8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3Ry
dWN0aW9uIG5vZGVzCi0KLSAgICByZXR1cm4gcmV0OwotfTsKLQotRXhwciA9IFNpenpsZS5zZWxl
Y3RvcnMgPSB7Ci0KLSAgICAvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKLSAgICBjYWNo
ZUxlbmd0aDogNTAsCi0KLSAgICBjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKLQotICAgIG1h
dGNoOiBtYXRjaEV4cHIsCi0KLSAgICBhdHRySGFuZGxlOiB7fSwKLQotICAgIGZpbmQ6IHt9LAot
Ci0gICAgcmVsYXRpdmU6IHsKLSAgICAgICAgIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJz
dDogdHJ1ZSB9LAotICAgICAgICAiICI6IHsgZGlyOiAicGFyZW50Tm9kZSIgfSwKLSAgICAgICAg
IisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCi0gICAgICAgICJ+
IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KLSAgICB9LAotCi0gICAgcHJlRmlsdGVyOiB7
Ci0gICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG1hdGNoICkgewotICAgICAgICAgICAgbWF0Y2hb
MV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwotCi0gICAgICAg
ICAgICAvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBv
ciB1bnF1b3RlZAotICAgICAgICAgICAgbWF0Y2hbM10gPSAoIG1hdGNoWzRdIHx8IG1hdGNoWzVd
IHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKLQotICAgICAgICAgICAg
aWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKLSAgICAgICAgICAgICAgICBtYXRjaFszXSA9ICIg
IiArIG1hdGNoWzNdICsgIiAiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4g
bWF0Y2guc2xpY2UoIDAsIDQgKTsKLSAgICAgICAgfSwKLQotICAgICAgICAiQ0hJTEQiOiBmdW5j
dGlvbiggbWF0Y2ggKSB7Ci0gICAgICAgICAgICAvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJD
SElMRCJdCi0gICAgICAgICAgICAgICAgMSB0eXBlIChvbmx5fG50aHwuLi4pCi0gICAgICAgICAg
ICAgICAgMiB3aGF0IChjaGlsZHxvZi10eXBlKQotICAgICAgICAgICAgICAgIDMgYXJndW1lbnQg
KGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCi0gICAgICAgICAgICAgICAgNCB4bi1j
b21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpufCkKLSAgICAgICAgICAgICAgICA1
IHNpZ24gb2YgeG4tY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgNiB4IG9mIHhuLWNvbXBvbmVu
dAotICAgICAgICAgICAgICAgIDcgc2lnbiBvZiB5LWNvbXBvbmVudAotICAgICAgICAgICAgICAg
IDggeSBvZiB5LWNvbXBvbmVudAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1hdGNoWzFd
ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKLQotICAgICAgICAgICAgaWYgKCBtYXRjaFsxXS5z
bGljZSggMCwgMyApID09PSAibnRoIiApIHsKLSAgICAgICAgICAgICAgICAvLyBudGgtKiByZXF1
aXJlcyBhcmd1bWVudAotICAgICAgICAgICAgICAgIGlmICggIW1hdGNoWzNdICkgewotICAgICAg
ICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4
cHIuZmlsdGVyLkNISUxECi0gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90
cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQotICAgICAgICAgICAgICAgIG1hdGNoWzRdID0g
KyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNd
ID09PSAiZXZlbiIgfHwgbWF0Y2hbM10gPT09ICJvZGQiICkgKTsKLSAgICAgICAgICAgICAgICBt
YXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2Rk
IiApOwotCi0gICAgICAgICAgICAvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKLSAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewotICAgICAgICAgICAgICAgIFNpenps
ZS5lcnJvciggbWF0Y2hbMF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJu
IG1hdGNoOwotICAgICAgICB9LAotCi0gICAgICAgICJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2gg
KSB7Ci0gICAgICAgICAgICB2YXIgZXhjZXNzLAotICAgICAgICAgICAgICAgIHVucXVvdGVkID0g
IW1hdGNoWzVdICYmIG1hdGNoWzJdOwotCi0gICAgICAgICAgICBpZiAoIG1hdGNoRXhwclsiQ0hJ
TEQiXS50ZXN0KCBtYXRjaFswXSApICkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBh
cy1pcwotICAgICAgICAgICAgaWYgKCBtYXRjaFszXSAmJiBtYXRjaFs0XSAhPT0gdW5kZWZpbmVk
ICkgewotICAgICAgICAgICAgICAgIG1hdGNoWzJdID0gbWF0Y2hbNF07Ci0KLSAgICAgICAgICAg
IC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCi0gICAg
ICAgICAgICB9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkg
JiYKLSAgICAgICAgICAgICAgICAvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2
ZWx5KQotICAgICAgICAgICAgICAgIChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUg
KSkgJiYKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFy
ZW50aGVzaXMKLSAgICAgICAgICAgICAgICAoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggIiki
LCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAotICAgICAgICAgICAg
ICAgIG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOwotICAgICAgICAgICAg
ICAgIG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBz
ZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKLSAgICAgICAgICAgIHJldHVy
biBtYXRjaC5zbGljZSggMCwgMyApOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZpbHRlcjog
ewotCi0gICAgICAgICJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHsKLSAgICAg
ICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBl
LCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1l
U2VsZWN0b3IgPT09ICIqIiA/Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0
cnVlOyB9IDoKLSAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2Fz
ZSgpID09PSBub2RlTmFtZTsKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICB9LAotCi0gICAg
ICAgICJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7Ci0gICAgICAgICAgICB2YXIgcGF0
dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArICIgIiBdOwotCi0gICAgICAgICAgICByZXR1
cm4gcGF0dGVybiB8fAotICAgICAgICAgICAgICAgIChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggIihe
fCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8
JCkiICkpICYmCi0gICAgICAgICAgICAgICAgY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlv
biggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCggdHlw
ZW9mIGVsZW0uY2xhc3NOYW1lID09PSAic3RyaW5nIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBl
b2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0
ZSgiY2xhc3MiKSB8fCAiIiApOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9LAotCi0g
ICAgICAgICJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKLSAgICAg
ICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICB2YXIgcmVz
dWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsKLQotICAgICAgICAgICAgICAgIGlmICgg
cmVzdWx0ID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvciA9
PT0gIiE9IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCAhb3BlcmF0
b3IgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiIjsKLQotICAgICAgICAgICAgICAgIHJl
dHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0ID09PSBjaGVjayA6Ci0gICAgICAgICAgICAg
ICAgICAgIG9wZXJhdG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6Ci0gICAgICAgICAg
ICAgICAgICAgIG9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNo
ZWNrICkgPT09IDAgOgotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gIio9IiA/IGNo
ZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOgotICAgICAgICAgICAgICAgICAg
ICBvcGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0
aCApID09PSBjaGVjayA6Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID09PSAifj0iID8g
KCAiICIgKyByZXN1bHQgKyAiICIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOgotICAgICAgICAg
ICAgICAgICAgICBvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0
LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKLSAgICAgICAg
ICAgICAgICAgICAgZmFsc2U7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9LAotCi0gICAgICAg
ICJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7
Ci0gICAgICAgICAgICB2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwK
LSAgICAgICAgICAgICAgICBmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gImxhc3QiLAot
ICAgICAgICAgICAgICAgIG9mVHlwZSA9IHdoYXQgPT09ICJvZi10eXBlIjsKLQotICAgICAgICAg
ICAgcmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgPwotCi0gICAgICAgICAgICAgICAg
Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7Ci0gICAg
ICAgICAgICAgICAgfSA6Ci0KLSAgICAgICAgICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgewotICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5v
ZGUsIGRpZmYsIG5vZGVJbmRleCwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXIg
PSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIs
Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsCi0gICAg
ICAgICAgICAgICAgICAgICAgICBuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dl
ckNhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZU
eXBlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggcGFyZW50ICkgewotCi0gICAgICAgICAg
ICAgICAgICAgICAgICAvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIHNpbXBsZSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3aGlsZSAoIGRpciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IGVsZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKG5v
ZGUgPSBub2RlWyBkaXIgXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6IG5v
ZGUubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZl
bid0IHlldCBkb25lIHNvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9
IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFz
dENoaWxkIF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi14bWwgOm50aC1jaGls
ZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgCi0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDYWNoZSA9IHBhcmVudFsgZXhwYW5kbyBdIHx8
IChwYXJlbnRbIGV4cGFuZG8gXSA9IHt9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YWNoZSA9IG91dGVyQ2FjaGVbIHR5cGUgXSB8fCBbXTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub2RlSW5kZXggPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsxXTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2Fj
aGVbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVJbmRleCAmJiBw
YXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8
fAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNlZWtp
bmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewotCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBh
cmVudGAgYW5kIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbm9k
ZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVu
cywgbm9kZUluZGV4LCBkaWZmIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHByZXZp
b3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKCB1c2VDYWNoZSAmJiAoY2FjaGUgPSAoZWxlbVsgZXhwYW5kbyBd
IHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0pICYmIGNhY2hlWzBdID09PSBkaXJy
dW5zICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBjYWNoZVsxXTsKLQot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8geG1sIDpudGgtY2hpbGQoLi4uKSBvciA6bnRoLWxh
c3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pCi0gICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0
aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5v
ZGUgJiYgbm9kZVsgZGlyIF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRp
ZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7Ci0KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCAoIG9mVHlwZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gbmFtZSA6IG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJiArK2RpZmYgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFj
aCBlbmNvdW50ZXJlZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIHVzZUNhY2hlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KSlbIHR5cGUgXSA9
IFsgZGlycnVucywgZGlmZiBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG5vZGUgPT09IGVs
ZW0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY29ycG9yYXRl
IHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplCi0gICAgICAgICAgICAg
ICAgICAgICAgICBkaWZmIC09IGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49
IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewot
ICAgICAgICAgICAgLy8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCi0g
ICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFz
c2VzCi0gICAgICAgICAgICAvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2Fz
ZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwotICAgICAg
ICAgICAgLy8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvcwot
ICAgICAgICAgICAgdmFyIGFyZ3MsCi0gICAgICAgICAgICAgICAgZm4gPSBFeHByLnBzZXVkb3Nb
IHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAot
ICAgICAgICAgICAgICAgICAgICBTaXp6bGUuZXJyb3IoICJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIg
KyBwc2V1ZG8gKTsKLQotICAgICAgICAgICAgLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1
ZG8gdG8gaW5kaWNhdGUgdGhhdAotICAgICAgICAgICAgLy8gYXJndW1lbnRzIGFyZSBuZWVkZWQg
dG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAgICAgICAgICAgIC8vIGp1c3QgYXMgU2l6
emxlIGRvZXMKLSAgICAgICAgICAgIGlmICggZm5bIGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZm4oIGFyZ3VtZW50ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlcwotICAgICAgICAgICAg
aWYgKCBmbi5sZW5ndGggPiAxICkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBbIHBzZXVkbywg
cHNldWRvLCAiIiwgYXJndW1lbnQgXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhwci5zZXRG
aWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID8KLSAgICAgICAg
ICAgICAgICAgICAgbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaSA9IG1hdGNoZWQubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUg
KCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaW5kZXhPZi5jYWxs
KCBzZWVkLCBtYXRjaGVkW2ldICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFsg
aWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAgICAgICAg
ICBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbigg
ZWxlbSwgMCwgYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICByZXR1cm4gZm47Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgcHNldWRv
czogewotICAgICAgICAvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3MKLSAgICAgICAgIm5v
dCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICAvLyBU
cmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQotICAgICAgICAgICAgLy8gdG8gYXZv
aWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcKLSAgICAgICAgICAgIC8vIHNwYWNlcyBh
cyBjb21iaW5hdG9ycwotICAgICAgICAgICAgdmFyIGlucHV0ID0gW10sCi0gICAgICAgICAgICAg
ICAgcmVzdWx0cyA9IFtdLAotICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBjb21waWxlKCBzZWxl
Y3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXRj
aGVyWyBleHBhbmRvIF0gPwotICAgICAgICAgICAgICAgIG1hcmtGdW5jdGlvbihmdW5jdGlvbigg
c2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgICAgICAgICB2YXIg
ZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQs
IG51bGwsIHhtbCwgW10gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzZWVkLmxlbmd0
aDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkg
YG1hdGNoZXJgCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pOwotICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfSkgOgotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0WzBdID0gZWxlbTsKLSAgICAgICAgICAgICAgICAg
ICAgbWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gIXJlc3VsdHMucG9wKCk7Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAg
fSksCi0KLSAgICAgICAgImhhcyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7
Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwotICAgICAgICAgICAg
fTsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImNvbnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0
aW9uKCB0ZXh0ICkgewotICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotICAg
ICAgICAgICAgICAgIHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQg
fHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7Ci0gICAgICAgICAgICB9
OwotICAgICAgICB9KSwKLQotICAgICAgICAvLyAiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJl
c2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvcgotICAgICAgICAvLyBpcyBiYXNlZCBzb2xlbHkg
b24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZQotICAgICAgICAvLyBiZWluZyBlcXVhbCB0
byB0aGUgaWRlbnRpZmllciBDLAotICAgICAgICAvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRl
bnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICItIi4KLSAgICAgICAgLy8gVGhlIG1h
dGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZv
cm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuCi0gICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIEMgZG9l
cyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgotICAgICAgICAvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvCi0gICAgICAgICJsYW5nIjog
bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHsKLSAgICAgICAgICAgIC8vIGxhbmcgdmFs
dWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKLSAgICAgICAgICAgIGlmICggIXJpZGVudGlm
aWVyLnRlc3QobGFuZyB8fCAiIikgKSB7Ci0gICAgICAgICAgICAgICAgU2l6emxlLmVycm9yKCAi
dW5zdXBwb3J0ZWQgbGFuZzogIiArIGxhbmcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2Uo
KTsKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgICAg
ICB2YXIgZWxlbUxhbmc7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAg
ICBpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID8KLSAgICAgICAgICAgICAgICAgICAg
ICAgIGVsZW0ubGFuZyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmdldEF0dHJpYnV0
ZSgieG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgibGFuZyIpKSApIHsKLQotICAgICAg
ICAgICAgICAgICAgICAgICAgZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5n
LmluZGV4T2YoIGxhbmcgKyAiLSIgKSA9PT0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5u
b2RlVHlwZSA9PT0gMSApOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIH07Ci0gICAgICAgIH0pLAotCi0gICAgICAgIC8vIE1pc2NlbGxhbmVvdXMKLSAgICAgICAg
InRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgdmFyIGhhc2ggPSB3aW5k
b3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7Ci0gICAgICAgICAgICByZXR1cm4g
aGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7Ci0gICAgICAgIH0sCi0KLSAgICAg
ICAgInJvb3QiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtID09
PSBkb2NFbGVtOwotICAgICAgICB9LAotCi0gICAgICAgICJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQg
JiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVt
LnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsKLSAgICAgICAgfSwKLQotICAg
ICAgICAvLyBCb29sZWFuIHByb3BlcnRpZXMKLSAgICAgICAgImVuYWJsZWQiOiBmdW5jdGlvbigg
ZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTsKLSAg
ICAgICAgfSwKLQotICAgICAgICAiZGlzYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAg
ICAgICAgIHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwotICAgICAgICB9LAotCi0gICAg
ICAgICJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBJbiBDU1Mz
LCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVu
dHMKLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2Vs
ZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCi0gICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVt
Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09
PSAiaW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYm
ICEhZWxlbS5zZWxlY3RlZCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgInNlbGVjdGVkIjogZnVu
Y3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBt
YWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0Ci0gICAgICAgICAgICAvLyBvcHRpb25zIGluIFNhZmFy
aSB3b3JrIHByb3Blcmx5Ci0gICAgICAgICAgICBpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKLSAg
ICAgICAgICAgICAgICBlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgLy8gQ29udGVudHMKLSAgICAgICAgImVtcHR5IjogZnVuY3Rpb24oIGVs
ZW0gKSB7Ci0gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2Vt
cHR5LXBzZXVkbwotICAgICAgICAgICAgLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAo
MSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAot
ICAgICAgICAgICAgLy8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2lu
ZyBpbnN0cnVjdGlvbjogNzsgZXRjLikKLSAgICAgICAgICAgIC8vIG5vZGVUeXBlIDwgNiB3b3Jr
cyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW4KLSAgICAg
ICAgICAgIGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5l
eHRTaWJsaW5nICkgewotICAgICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSwKLQotICAg
ICAgICAicGFyZW50IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICByZXR1cm4gIUV4
cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEVs
ZW1lbnQvaW5wdXQgdHlwZXMKLSAgICAgICAgImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOwotICAgICAg
ICB9LAotCi0gICAgICAgICJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAg
cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwotICAgICAgICB9LAotCi0gICAg
ICAgICJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIHZhciBuYW1lID0g
ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09
ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSAiYnV0dG9uIiB8fCBuYW1lID09PSAiYnV0dG9uIjsK
LSAgICAgICAgfSwKLQotICAgICAgICAidGV4dCI6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAg
ICAgICAgdmFyIGF0dHI7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2Vy
Q2FzZSgpID09PSAiaW5wdXQiICYmCi0gICAgICAgICAgICAgICAgZWxlbS50eXBlID09PSAidGV4
dCIgJiYKLQotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IElFPDgKLSAgICAgICAgICAgICAg
ICAvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgInNlYXJjaCIpIGFwcGVhciB3
aXRoIGVsZW0udHlwZSA9PT0gInRleHQiCi0gICAgICAgICAgICAgICAgKCAoYXR0ciA9IGVsZW0u
Z2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAi
dGV4dCIgKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9u
Ci0gICAgICAgICJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gWyAwIF07Ci0gICAgICAgIH0pLAotCi0gICAgICAgICJsYXN0Ijog
Y3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7
Ci0gICAgICAgICAgICByZXR1cm4gWyBsZW5ndGggLSAxIF07Ci0gICAgICAgIH0pLAotCi0gICAg
ICAgICJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywg
bGVuZ3RoLCBhcmd1bWVudCApIHsKLSAgICAgICAgICAgIHJldHVybiBbIGFyZ3VtZW50IDwgMCA/
IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKLSAgICAgICAgfSksCi0KLSAgICAgICAg
ImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxl
bmd0aCApIHsKLSAgICAgICAgICAgIHZhciBpID0gMDsKLSAgICAgICAgICAgIGZvciAoIDsgaSA8
IGxlbmd0aDsgaSArPSAyICkgewotICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcy5wdXNoKCBp
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hJbmRleGVzOwotICAg
ICAgICB9KSwKLQotICAgICAgICAib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlv
biggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7Ci0gICAgICAgICAgICB2YXIgaSA9IDE7Ci0gICAg
ICAgICAgICBmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKLSAgICAgICAgICAgICAgICBt
YXRjaEluZGV4ZXMucHVzaCggaSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu
IG1hdGNoSW5kZXhlczsKLSAgICAgICAgfSksCi0KLSAgICAgICAgImx0IjogY3JlYXRlUG9zaXRp
b25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewot
ICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFy
Z3VtZW50OwotICAgICAgICAgICAgZm9yICggOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAg
ICAgbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJl
dHVybiBtYXRjaEluZGV4ZXM7Ci0gICAgICAgIH0pLAotCi0gICAgICAgICJndCI6IGNyZWF0ZVBv
c2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCAp
IHsKLSAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGgg
OiBhcmd1bWVudDsKLSAgICAgICAgICAgIGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKLSAgICAg
ICAgICAgICAgICBtYXRjaEluZGV4ZXMucHVzaCggaSApOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgcmV0dXJuIG1hdGNoSW5kZXhlczsKLSAgICAgICAgfSkKLSAgICB9Ci19OwotCi1FeHBy
LnBzZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJlcSJdOwotCi0vLyBBZGQgYnV0dG9uL2lu
cHV0IHR5cGUgcHNldWRvcwotZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1
ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7Ci0gICAgRXhw
ci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwotfQotZm9yICggaSBpbiB7
IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHsKLSAgICBFeHByLnBzZXVkb3NbIGkgXSA9
IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwotfQotCi0vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcg
bmV3IHNldEZpbHRlcnMKLWZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQotc2V0RmlsdGVycy5wcm90
b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7Ci1FeHByLnNldEZpbHRlcnMgPSBu
ZXcgc2V0RmlsdGVycygpOwotCi1mdW5jdGlvbiB0b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25s
eSApIHsKLSAgICB2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSwKLSAgICAgICAgc29G
YXIsIGdyb3VwcywgcHJlRmlsdGVycywKLSAgICAgICAgY2FjaGVkID0gdG9rZW5DYWNoZVsgc2Vs
ZWN0b3IgKyAiICIgXTsKLQotICAgIGlmICggY2FjaGVkICkgewotICAgICAgICByZXR1cm4gcGFy
c2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwotICAgIH0KLQotICAgIHNvRmFyID0gc2Vs
ZWN0b3I7Ci0gICAgZ3JvdXBzID0gW107Ci0gICAgcHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVy
OwotCi0gICAgd2hpbGUgKCBzb0ZhciApIHsKLQotICAgICAgICAvLyBDb21tYSBhbmQgZmlyc3Qg
cnVuCi0gICAgICAgIGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFy
ICkpICkgewotICAgICAgICAgICAgaWYgKCBtYXRjaCApIHsKLSAgICAgICAgICAgICAgICAvLyBE
b24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAotICAgICAgICAgICAgICAgIHNv
RmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKLSAgICAgICAg
fQotCi0gICAgICAgIG1hdGNoZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBDb21iaW5hdG9ycwot
ICAgICAgICBpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKLSAg
ICAgICAgICAgIG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgICAgICAgICAgdG9rZW5zLnB1
c2goewotICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVkLAotICAgICAgICAgICAgICAgIC8v
IENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZQotICAgICAgICAgICAgICAgIHR5
cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCAiICIgKQotICAgICAgICAgICAgfSk7Ci0gICAg
ICAgICAgICBzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gRmlsdGVycwotICAgICAgICBmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVy
ICkgewotICAgICAgICAgICAgaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBz
b0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAotICAgICAgICAgICAgICAgIChtYXRj
aCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewotICAgICAgICAgICAgICAgIG1h
dGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsKLSAg
ICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoZWQsCi0gICAgICAgICAgICAgICAgICAgIHR5
cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoCi0gICAgICAgICAg
ICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5s
ZW5ndGggKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIW1hdGNo
ZWQgKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJl
dHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2VzcwotICAgIC8vIGlmIHdlJ3JlIGp1
c3QgcGFyc2luZwotICAgIC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRv
a2VucwotICAgIHJldHVybiBwYXJzZU9ubHkgPwotICAgICAgICBzb0Zhci5sZW5ndGggOgotICAg
ICAgICBzb0ZhciA/Ci0gICAgICAgICAgICBTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOgotICAg
ICAgICAgICAgLy8gQ2FjaGUgdGhlIHRva2VucwotICAgICAgICAgICAgdG9rZW5DYWNoZSggc2Vs
ZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Ci19Ci0KLWZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRv
a2VucyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGxlbiA9IHRva2Vucy5sZW5ndGgsCi0g
ICAgICAgIHNlbGVjdG9yID0gIiI7Ci0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAg
ICAgIHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVj
dG9yOwotfQotCi1mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBi
YXNlICkgewotICAgIHZhciBkaXIgPSBjb21iaW5hdG9yLmRpciwKLSAgICAgICAgY2hlY2tOb25F
bGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFyZW50Tm9kZSIsCi0gICAgICAgIGRvbmVOYW1l
ID0gZG9uZSsrOwotCi0gICAgcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPwotICAgICAgICAvLyBD
aGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnQKLSAgICAgICAg
ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKLSAgICAgICAgICAgIHdoaWxlICggKGVs
ZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBl
ID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gOgotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGFu
Y2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwotICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29udGV4
dCwgeG1sICkgewotICAgICAgICAgICAgdmFyIG9sZENhY2hlLCBvdXRlckNhY2hlLAotICAgICAg
ICAgICAgICAgIG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdOwotCi0gICAgICAgICAg
ICAvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRv
bid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZwotICAgICAgICAgICAgaWYgKCB4bWwgKSB7Ci0g
ICAgICAgICAgICAgICAgd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQs
IHhtbCApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIChl
bGVtID0gZWxlbVsgZGlyIF0pICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG9sZENhY2hlID0gb3V0ZXJDYWNoZVsg
ZGlyIF0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2FjaGVbIDAgXSA9PT0g
ZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHsKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJv
cGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIChuZXdDYWNoZVsgMiBdID0gb2xkQ2FjaGVbIDIgXSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIG5l
d2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckNhY2hlWyBkaXIgXSA9IG5ld0NhY2hlOwot
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25l
OyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQs
IHhtbCApKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9OwotfQotCi1mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7
Ci0gICAgcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPwotICAgICAgICBmdW5jdGlvbiggZWxl
bSwgY29udGV4dCwgeG1sICkgewotICAgICAgICAgICAgdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7
Ci0gICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFtYXRj
aGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSA6Ci0gICAgICAgIG1hdGNoZXJzWzBdOwotfQotCi1m
dW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkg
ewotICAgIHZhciBlbGVtLAotICAgICAgICBuZXdVbm1hdGNoZWQgPSBbXSwKLSAgICAgICAgaSA9
IDAsCi0gICAgICAgIGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCi0gICAgICAgIG1hcHBlZCA9IG1h
cCAhPSBudWxsOwotCi0gICAgZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgICAgIGlmICgg
KGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotICAgICAgICAgICAgaWYgKCAhZmlsdGVyIHx8IGZp
bHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAgICAgICAgICAgICAgbmV3VW5tYXRj
aGVkLnB1c2goIGVsZW0gKTsKLSAgICAgICAgICAgICAgICBpZiAoIG1hcHBlZCApIHsKLSAgICAg
ICAgICAgICAgICAgICAgbWFwLnB1c2goIGkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VW5tYXRjaGVkOwotfQot
Ci1mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0
RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7Ci0gICAgaWYgKCBwb3N0RmlsdGVy
ICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7Ci0gICAgICAgIHBvc3RGaWx0ZXIgPSBzZXRN
YXRjaGVyKCBwb3N0RmlsdGVyICk7Ci0gICAgfQotICAgIGlmICggcG9zdEZpbmRlciAmJiAhcG9z
dEZpbmRlclsgZXhwYW5kbyBdICkgewotICAgICAgICBwb3N0RmluZGVyID0gc2V0TWF0Y2hlcigg
cG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7Ci0gICAgfQotICAgIHJldHVybiBtYXJrRnVuY3Rp
b24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKLSAgICAgICAgdmFy
IHRlbXAsIGksIGVsZW0sCi0gICAgICAgICAgICBwcmVNYXAgPSBbXSwKLSAgICAgICAgICAgIHBv
c3RNYXAgPSBbXSwKLSAgICAgICAgICAgIHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCi0K
LSAgICAgICAgICAgIC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0
Ci0gICAgICAgICAgICBlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3Ig
fHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAot
Ci0gICAgICAgICAgICAvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZp
bmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KLSAgICAgICAgICAgIG1h
dGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwotICAgICAgICAg
ICAgICAgIGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCAp
IDoKLSAgICAgICAgICAgICAgICBlbGVtcywKLQotICAgICAgICAgICAgbWF0Y2hlck91dCA9IG1h
dGNoZXIgPwotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBm
aWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3Vs
dHMsCi0gICAgICAgICAgICAgICAgcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBw
cmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPwotCi0gICAgICAgICAgICAgICAgICAgIC8vIC4u
LmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAg
ICBbXSA6Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRz
IGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgOgotICAgICAgICAgICAgICAg
IG1hdGNoZXJJbjsKLQotICAgICAgICAvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcwotICAgICAgICBp
ZiAoIG1hdGNoZXIgKSB7Ci0gICAgICAgICAgICBtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJP
dXQsIGNvbnRleHQsIHhtbCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwbHkgcG9zdEZp
bHRlcgotICAgICAgICBpZiAoIHBvc3RGaWx0ZXIgKSB7Ci0gICAgICAgICAgICB0ZW1wID0gY29u
ZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsKLSAgICAgICAgICAgIHBvc3RGaWx0ZXIoIHRl
bXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKLQotICAgICAgICAgICAgLy8gVW4tbWF0Y2ggZmFpbGlu
ZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJbgotICAgICAgICAgICAg
aSA9IHRlbXAubGVuZ3RoOwotICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgewotICAgICAgICAgICAgICAgICAgICBtYXRj
aGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCBzZWVkICkgewotICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciAp
IHsKLSAgICAgICAgICAgICAgICBpZiAoIHBvc3RGaW5kZXIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJt
ZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0cwotICAgICAgICAgICAgICAgICAgICB0ZW1w
ID0gW107Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAgICAg
ICAgICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0
Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goIChtYXRjaGVySW5baV0g
PSBlbGVtKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0g
W10pLCB0ZW1wLCB4bWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAv
LyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVt
IHN5bmNocm9uaXplZAotICAgICAgICAgICAgICAgIGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLSAg
ICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAo
ZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodGVtcCA9
IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAt
MSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0
ZW1wXSA9IGVsZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJv
dWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
bWF0Y2hlck91dCA9IGNvbmRlbnNlKAotICAgICAgICAgICAgICAgIG1hdGNoZXJPdXQgPT09IHJl
c3VsdHMgPwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3Rp
bmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyT3V0
Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgaWYgKCBwb3N0RmluZGVyICkgewotICAgICAg
ICAgICAgICAgIHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOwot
ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwdXNoLmFwcGx5KCByZXN1bHRz
LCBtYXRjaGVyT3V0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9KTsKLX0KLQot
ZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKLSAgICB2YXIgY2hlY2tDb250
ZXh0LCBtYXRjaGVyLCBqLAotICAgICAgICBsZW4gPSB0b2tlbnMubGVuZ3RoLAotICAgICAgICBs
ZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAotICAgICAg
ICBpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAi
XSwKLSAgICAgICAgaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAotCi0gICAgICAgIC8vIFRo
ZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJs
ZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCi0gICAgICAgIG1hdGNoQ29udGV4dCA9IGFkZENv
bWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09
IGNoZWNrQ29udGV4dDsKLSAgICAgICAgfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAotICAg
ICAgICBtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4g
LTE7Ci0gICAgICAgIH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKLSAgICAgICAgbWF0Y2hl
cnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7Ci0gICAgICAgICAgICByZXR1
cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENv
bnRleHQgKSApIHx8ICgKLSAgICAgICAgICAgICAgICAoY2hlY2tDb250ZXh0ID0gY29udGV4dCku
bm9kZVR5cGUgPwotICAgICAgICAgICAgICAgICAgICBtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRl
eHQsIHhtbCApIDoKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBj
b250ZXh0LCB4bWwgKSApOwotICAgICAgICB9IF07Ci0KLSAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKLSAgICAgICAgaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50
eXBlIF0pICkgewotICAgICAgICAgICAgbWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoZWxlbWVu
dE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIpIF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51
bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBzcGVjaWFs
IHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyCi0gICAgICAgICAgICBpZiAoIG1hdGNo
ZXJbIGV4cGFuZG8gXSApIHsKLSAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHJlbGF0
aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmcKLSAgICAgICAgICAgICAg
ICBqID0gKytpOwotICAgICAgICAgICAgICAgIGZvciAoIDsgaiA8IGxlbjsgaisrICkgewotICAg
ICAgICAgICAgICAgICAgICBpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0TWF0Y2hlcigKLSAg
ICAgICAgICAgICAgICAgICAgaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCi0g
ICAgICAgICAgICAgICAgICAgIGkgPiAxICYmIHRvU2VsZWN0b3IoCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmlu
YXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYAotICAgICAgICAgICAgICAg
ICAgICAgICAgdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNb
IGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKLSAgICAgICAgICAgICAgICAgICAg
KS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyLAot
ICAgICAgICAgICAgICAgICAgICBpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNs
aWNlKCBpLCBqICkgKSwKLSAgICAgICAgICAgICAgICAgICAgaiA8IGxlbiAmJiBtYXRjaGVyRnJv
bVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLAotICAgICAgICAgICAgICAg
ICAgICBqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApCi0gICAgICAgICAgICAgICAgKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsK
LX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMs
IHNldE1hdGNoZXJzICkgewotICAgIHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAs
Ci0gICAgICAgIGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLAotICAgICAg
ICBzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBv
dXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSwgaiwgbWF0Y2hlciwKLSAgICAgICAg
ICAgICAgICBtYXRjaGVkQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGkgPSAiMCIsCi0gICAg
ICAgICAgICAgICAgdW5tYXRjaGVkID0gc2VlZCAmJiBbXSwKLSAgICAgICAgICAgICAgICBzZXRN
YXRjaGVkID0gW10sCi0gICAgICAgICAgICAgICAgY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENv
bnRleHQsCi0gICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2Vl
ZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dAotICAgICAgICAgICAgICAgIGVsZW1zID0g
c2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kWyJUQUciXSggIioiLCBvdXRlcm1vc3QgKSwK
LSAgICAgICAgICAgICAgICAvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBv
dXRlcm1vc3QgbWF0Y2hlcgotICAgICAgICAgICAgICAgIGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVu
cyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLAot
ICAgICAgICAgICAgICAgIGxlbiA9IGVsZW1zLmxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKCBv
dXRlcm1vc3QgKSB7Ci0gICAgICAgICAgICAgICAgb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQg
IT09IGRvY3VtZW50ICYmIGNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRz
Ci0gICAgICAgICAgICAvLyBLZWVwIGBpYCBhIHN0cmluZyBpZiB0aGVyZSBhcmUgbm8gZWxlbWVu
dHMgc28gYG1hdGNoZWRDb3VudGAgd2lsbCBiZSAiMDAiIGJlbG93Ci0gICAgICAgICAgICAvLyBT
dXBwb3J0OiBJRTw5LCBTYWZhcmkKLSAgICAgICAgICAgIC8vIFRvbGVyYXRlIE5vZGVMaXN0IHBy
b3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVu
dHMgYnkgaWQKLSAgICAgICAgICAgIGZvciAoIDsgaSAhPT0gbGVuICYmIChlbGVtID0gZWxlbXNb
aV0pICE9IG51bGw7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGJ5RWxlbWVudCAmJiBl
bGVtICkgewotICAgICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBvdXRlcm1vc3QgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8v
IFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKLSAgICAgICAgICAgICAg
ICBpZiAoIGJ5U2V0ICkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGV5IHdpbGwgaGF2ZSBn
b25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzCi0gICAgICAgICAgICAgICAgICAgIGlm
ICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1hdGNoZWRDb3VudC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg
ICAgICAgLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9y
IG5vdAotICAgICAgICAgICAgICAgICAgICBpZiAoIHNlZWQgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB1bm1hdGNoZWQucHVzaCggZWxlbSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcHBseSBz
ZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVudHMKLSAgICAgICAgICAgIG1hdGNoZWRDb3Vu
dCArPSBpOwotICAgICAgICAgICAgaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7
Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAobWF0Y2hl
ciA9IHNldE1hdGNoZXJzW2orK10pICkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyKCB1
bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApOwotICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgIGlmICggc2VlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
UmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29y
dGluZwotICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3Vs
dHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBE
aXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hl
cwotICAgICAgICAgICAgICAgICAgICBzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQg
KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgbWF0Y2hlcyB0
byByZXN1bHRzCi0gICAgICAgICAgICAgICAgcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hl
ZCApOwotCi0gICAgICAgICAgICAgICAgLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGlu
ZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nCi0gICAgICAg
ICAgICAgICAgaWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAw
ICYmCi0gICAgICAgICAgICAgICAgICAgICggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVu
Z3RoICkgPiAxICkgewotCi0gICAgICAgICAgICAgICAgICAgIFNpenpsZS51bmlxdWVTb3J0KCBy
ZXN1bHRzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICAvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMK
LSAgICAgICAgICAgIGlmICggb3V0ZXJtb3N0ICkgewotICAgICAgICAgICAgICAgIGRpcnJ1bnMg
PSBkaXJydW5zVW5pcXVlOwotICAgICAgICAgICAgICAgIG91dGVybW9zdENvbnRleHQgPSBjb250
ZXh0QmFja3VwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdW5tYXRjaGVk
OwotICAgICAgICB9OwotCi0gICAgcmV0dXJuIGJ5U2V0ID8KLSAgICAgICAgbWFya0Z1bmN0aW9u
KCBzdXBlck1hdGNoZXIgKSA6Ci0gICAgICAgIHN1cGVyTWF0Y2hlcjsKLX0KLQotY29tcGlsZSA9
IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBncm91cCAvKiBJbnRlcm5hbCBV
c2UgT25seSAqLyApIHsKLSAgICB2YXIgaSwKLSAgICAgICAgc2V0TWF0Y2hlcnMgPSBbXSwKLSAg
ICAgICAgZWxlbWVudE1hdGNoZXJzID0gW10sCi0gICAgICAgIGNhY2hlZCA9IGNvbXBpbGVyQ2Fj
aGVbIHNlbGVjdG9yICsgIiAiIF07Ci0KLSAgICBpZiAoICFjYWNoZWQgKSB7Ci0gICAgICAgIC8v
IEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1
c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAotICAgICAgICBpZiAoICFncm91cCApIHsKLSAgICAg
ICAgICAgIGdyb3VwID0gdG9rZW5pemUoIHNlbGVjdG9yICk7Ci0gICAgICAgIH0KLSAgICAgICAg
aSA9IGdyb3VwLmxlbmd0aDsKLSAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAgICAgICAgICBj
YWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggZ3JvdXBbaV0gKTsKLSAgICAgICAgICAgIGlmICgg
Y2FjaGVkWyBleHBhbmRvIF0gKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWF0Y2hlcnMucHVzaCgg
Y2FjaGVkICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVsZW1lbnRN
YXRjaGVycy5wdXNoKCBjYWNoZWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvbgotICAgICAgICBjYWNoZWQgPSBjb21w
aWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0
Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZDsKLX07Ci0K
LWZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyAp
IHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGxlbiA9IGNvbnRleHRzLmxlbmd0aDsKLSAgICBm
b3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAgU2l6emxlKCBzZWxlY3RvciwgY29udGV4
dHNbaV0sIHJlc3VsdHMgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLWZ1bmN0
aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Ci0gICAgdmFy
IGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCi0gICAgICAgIG1hdGNoID0gdG9rZW5pemUo
IHNlbGVjdG9yICk7Ci0KLSAgICBpZiAoICFzZWVkICkgewotICAgICAgICAvLyBUcnkgdG8gbWlu
aW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cAotICAgICAgICBpZiAo
IG1hdGNoLmxlbmd0aCA9PT0gMSApIHsKLQotICAgICAgICAgICAgLy8gVGFrZSBhIHNob3J0Y3V0
IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKLSAgICAg
ICAgICAgIHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKLSAgICAgICAg
ICAgIGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09
PSAiSUQiICYmCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0
Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmCi0gICAgICAgICAgICAgICAgICAg
IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7Ci0KLSAgICAgICAgICAgICAgICBj
b250ZXh0ID0gKCBFeHByLmZpbmRbIklEIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5l
c2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdOwotICAgICAgICAgICAgICAg
IGlmICggIWNvbnRleHQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNs
aWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwot
ICAgICAgICAgICAgaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3Ig
KSA/IDAgOiB0b2tlbnMubGVuZ3RoOwotICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7Ci0gICAg
ICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBBYm9y
dCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCi0gICAgICAgICAgICAgICAgaWYgKCBFeHByLnJlbGF0
aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIChmaW5kID0gRXhwci5m
aW5kWyB0eXBlIF0pICkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2gsIGV4cGFuZGlu
ZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnMKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCAoc2VlZCA9IGZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5t
YXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksCi0gICAgICAgICAgICAg
ICAgICAgICAgICByc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0
KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICkp
ICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5v
IHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRva2Vucy5zcGxpY2UoIGksIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVj
dG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoICFzZWxlY3RvciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ29tcGls
ZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbgotICAgIC8vIFByb3ZpZGUgYG1hdGNo
YCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJv
dmUKLSAgICBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSgKLSAgICAgICAgc2VlZCwKLSAgICAg
ICAgY29udGV4dCwKLSAgICAgICAgIWRvY3VtZW50SXNIVE1MLAotICAgICAgICByZXN1bHRzLAot
ICAgICAgICByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0
LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0Ci0gICAgKTsKLSAgICByZXR1cm4gcmVzdWx0czsKLX0K
LQotLy8gT25lLXRpbWUgYXNzaWdubWVudHMKLQotLy8gU29ydCBzdGFiaWxpdHkKLXN1cHBvcnQu
c29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIiIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIiIp
ID09PSBleHBhbmRvOwotCi0vLyBTdXBwb3J0OiBDaHJvbWU8MTQKLS8vIEFsd2F5cyBhc3N1bWUg
ZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rp
b24KLXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlOwotCi0vLyBJbml0
aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKLXNldERvY3VtZW50KCk7Ci0KLS8v
IFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBp
biBDaHJvbWUgMjcpCi0vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFj
aCBvdGhlcioKLXN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkg
ewotICAgIC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKQotICAg
IHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJkaXYiKSApICYgMTsKLX0pOwotCi0vLyBTdXBwb3J0OiBJRTw4Ci0vLyBQcmV2ZW50IGF0
dHJpYnV0ZS9wcm9wZXJ0eSAiaW50ZXJwb2xhdGlvbiIKLS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29m
dC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHgKLWlmICggIWFzc2Vy
dChmdW5jdGlvbiggZGl2ICkgewotICAgIGRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9h
PiI7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAi
IyIgOwotfSkgKSB7Ci0gICAgYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1
bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLSAgICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNh
c2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi0vLyBT
dXBwb3J0OiBJRTw5Ci0vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0
ZSgidmFsdWUiKQotaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24o
IGRpdiApIHsKLSAgICBkaXYuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKLSAgICBkaXYuZmlyc3RD
aGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIiICk7Ci0gICAgcmV0dXJuIGRpdi5maXJzdENo
aWxkLmdldEF0dHJpYnV0ZSggInZhbHVlIiApID09PSAiIjsKLX0pICkgewotICAgIGFkZEhhbmRs
ZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewotICAgICAgICBpZiAo
ICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gZWxlbS5kZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICB9KTsK
LX0KLQotLy8gU3VwcG9ydDogSUU8OQotLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2gg
Ym9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllcwotaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBk
aXYgKSB7Ci0gICAgcmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsK
LX0pICkgewotICAgIGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBp
c1hNTCApIHsKLSAgICAgICAgdmFyIHZhbDsKLSAgICAgICAgaWYgKCAhaXNYTUwgKSB7Ci0gICAg
ICAgICAgICByZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgp
IDoKLSAgICAgICAgICAgICAgICAgICAgKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFt
ZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KLSAgICAgICAgICAgICAgICAgICAgdmFsLnZhbHVlIDoK
LSAgICAgICAgICAgICAgICBudWxsOwotICAgICAgICB9Ci0gICAgfSk7Ci19Ci0KLXJldHVybiBT
aXp6bGU7Ci0KLX0pKCB3aW5kb3cgKTsKLQotCi0KLWpRdWVyeS5maW5kID0gU2l6emxlOwotalF1
ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwotalF1ZXJ5LmV4cHJbIjoiXSA9IGpRdWVyeS5l
eHByLnBzZXVkb3M7Ci1qUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7Ci1qUXVlcnku
dGV4dCA9IFNpenpsZS5nZXRUZXh0OwotalF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MOwot
alF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwotCi0KLQotdmFyIHJuZWVkc0NvbnRl
eHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7Ci0KLXZhciByc2luZ2xlVGFnID0g
KC9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8pOwotCi0KLQotdmFyIHJpc1NpbXBsZSA9IC9e
LlteOiNcW1wuLF0qJC87Ci0KLS8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxp
dHkgZm9yIGZpbHRlciBhbmQgbm90Ci1mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZp
ZXIsIG5vdCApIHsKLSAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsK
LSAgICAgICAgcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkg
KSB7Ci0gICAgICAgICAgICAvKiBqc2hpbnQgLVcwMTggKi8KLSAgICAgICAgICAgIHJldHVybiAh
IXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDsKLSAgICAgICAgfSk7Ci0K
LSAgICB9Ci0KLSAgICBpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHsKLSAgICAgICAgcmV0dXJu
IGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90OwotICAgICAgICB9KTsKLQotICAg
IH0KLQotICAgIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAg
IGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkgewotICAgICAgICAgICAgcmV0dXJu
IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwotICAgICAgICB9Ci0K
LSAgICAgICAgcXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyAp
OwotICAgIH0KLQotICAgIHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBl
bGVtICkgewotICAgICAgICByZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSAp
ID49IDAgKSAhPT0gbm90OwotICAgIH0pOwotfQotCi1qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24o
IGV4cHIsIGVsZW1zLCBub3QgKSB7Ci0gICAgdmFyIGVsZW0gPSBlbGVtc1sgMCBdOwotCi0gICAg
aWYgKCBub3QgKSB7Ci0gICAgICAgIGV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKLSAgICB9
Ci0KLSAgICByZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEg
PwotICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsg
ZWxlbSBdIDogW10gOgotICAgICAgICBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnku
Z3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW0u
bm9kZVR5cGUgPT09IDE7Ci0gICAgICAgIH0pKTsKLX07Ci0KLWpRdWVyeS5mbi5leHRlbmQoewot
ICAgIGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgdmFyIGksCi0gICAgICAg
ICAgICBsZW4gPSB0aGlzLmxlbmd0aCwKLSAgICAgICAgICAgIHJldCA9IFtdLAotICAgICAgICAg
ICAgc2VsZiA9IHRoaXM7Ci0KLSAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVj
dG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBp
IDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmNvbnRhaW5z
KCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfSkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysg
KSB7Ci0gICAgICAgICAgICBqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29u
dGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICkKLSAgICAgICAgcmV0
ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCAp
OwotICAgICAgICByZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gdGhpcy5zZWxlY3RvciAr
ICIgIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwK
LSAgICBmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
cHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlKSApOwotICAgIH0s
Ci0gICAgbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnB1
c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlKSApOwotICAgIH0sCi0g
ICAgaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLSAgICAgICAgcmV0dXJuICEhd2lubm93KAot
ICAgICAgICAgICAgdGhpcywKLQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHBvc2l0aW9u
YWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNl
dAotICAgICAgICAgICAgLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1
cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgotICAgICAgICAgICAgdHlwZW9mIHNlbGVj
dG9yID09PSAic3RyaW5nIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPwotICAg
ICAgICAgICAgICAgIGpRdWVyeSggc2VsZWN0b3IgKSA6Ci0gICAgICAgICAgICAgICAgc2VsZWN0
b3IgfHwgW10sCi0gICAgICAgICAgICBmYWxzZQotICAgICAgICApLmxlbmd0aDsKLSAgICB9Ci19
KTsKLQotCi0vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAotCi0KLS8vIEEgY2VudHJhbCBy
ZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQotdmFyIHJvb3RqUXVlcnksCi0K
LSAgICAvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwotICAgIC8vIFBy
aW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgj
OTUyMSkKLSAgICAvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0
IHdpdGggPCkKLSAgICBycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3
LV0qKSkkLywKLQotICAgIGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3Rv
ciwgY29udGV4dCApIHsKLSAgICAgICAgdmFyIG1hdGNoLCBlbGVtOwotCi0gICAgICAgIC8vIEhB
TkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKLSAgICAgICAgaWYg
KCAhc2VsZWN0b3IgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKLSAgICAgICAgaWYgKCB0eXBlb2Ygc2VsZWN0
b3IgPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgaWYgKCBzZWxlY3RvclswXSA9PT0gIjwi
ICYmIHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09ICI+IiAmJiBzZWxlY3Rvci5s
ZW5ndGggPj0gMyApIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRo
YXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVj
awotICAgICAgICAgICAgICAgIG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdOwotCi0g
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hdGNoID0gcnF1aWNrRXhwci5l
eGVjKCBzZWxlY3RvciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYXRjaCBo
dG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkCi0gICAgICAg
ICAgICBpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7Ci0KLSAgICAgICAg
ICAgICAgICAvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKLSAgICAgICAgICAgICAgICBp
ZiAoIG1hdGNoWzFdICkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCBp
bnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwotCi0gICAgICAgICAgICAg
ICAgICAgIC8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKLSAgICAgICAgICAgICAg
ICAgICAgLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhU
TUwgaXMgbm90IHByZXNlbnQKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCB0aGlz
LCBqUXVlcnkucGFyc2VIVE1MKAotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250
ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LAotICAgICAgICAgICAgICAg
ICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgICAgICAgICApICk7Ci0KLSAgICAgICAgICAgICAg
ICAgICAgLy8gSEFORExFOiAkKGh0bWwsIHByb3BzKQotICAgICAgICAgICAgICAgICAgICBpZiAo
IHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29u
dGV4dCApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggbWF0Y2ggaW4gY29udGV4
dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIG9mIGNvbnRl
eHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRj
aCBdICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgb3RoZXJ3aXNl
IHNldCBhcyBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4
dFsgbWF0Y2ggXSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzOwotCi0gICAgICAgICAgICAgICAgLy8gSEFORExFOiAkKCNpZCkKLSAg
ICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbGVtID0gZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8g
Q2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKLSAg
ICAgICAgICAgICAgICAgICAgLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1
bWVudCAjNjk2MwotICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnRO
b2RlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRp
cmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRo
aXMubGVuZ3RoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbMF0gPSBlbGVtOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0
ID0gZG9jdW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rv
cjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQotICAgICAgICAgICAgfSBl
bHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKLQotICAg
ICAgICAgICAgLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCi0gICAgICAgICAgICAvLyAod2hp
Y2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNv
bnRleHQgKS5maW5kKCBzZWxlY3RvciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIEhB
TkRMRTogJChET01FbGVtZW50KQotICAgICAgICB9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlw
ZSApIHsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKLSAg
ICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotCi0g
ICAgICAgIC8vIEhBTkRMRTogJChmdW5jdGlvbikKLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIGRv
Y3VtZW50IHJlYWR5Ci0gICAgICAgIH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxl
Y3RvciApICkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiByb290alF1ZXJ5LnJlYWR5ICE9
PSAidW5kZWZpbmVkIiA/Ci0gICAgICAgICAgICAgICAgcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0
b3IgKSA6Ci0gICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBp
cyBub3QgcHJlc2VudAotICAgICAgICAgICAgICAgIHNlbGVjdG9yKCBqUXVlcnkgKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHsK
LSAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKLSAgICAgICAg
ICAgIHRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAg
ICByZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKLSAgICB9OwotCi0v
LyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBp
bnN0YW50aWF0aW9uCi1pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKLQotLy8gSW5pdGlhbGl6
ZSBjZW50cmFsIHJlZmVyZW5jZQotcm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTsKLQot
Ci12YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCi0g
ICAgLy8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3Rh
cnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQKLSAgICBndWFyYW50ZWVkVW5pcXVlID0gewotICAgICAg
ICBjaGlsZHJlbjogdHJ1ZSwKLSAgICAgICAgY29udGVudHM6IHRydWUsCi0gICAgICAgIG5leHQ6
IHRydWUsCi0gICAgICAgIHByZXY6IHRydWUKLSAgICB9OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAg
ICBkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewotICAgICAgICB2YXIgbWF0Y2hl
ZCA9IFtdLAotICAgICAgICAgICAgdHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkOwotCi0g
ICAgICAgIHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgJiYgZWxlbS5ub2RlVHlwZSAhPT0g
OSApIHsKLSAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgbWF0Y2hlZC5wdXNoKCBlbGVtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIG1hdGNoZWQ7Ci0gICAgfSwKLQotICAgIHNpYmxpbmc6IGZ1bmN0aW9uKCBu
LCBlbGVtICkgewotICAgICAgICB2YXIgbWF0Y2hlZCA9IFtdOwotCi0gICAgICAgIGZvciAoIDsg
bjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7Ci0gICAgICAgICAgICBpZiAoIG4ubm9kZVR5cGUgPT09
IDEgJiYgbiAhPT0gZWxlbSApIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVkLnB1c2goIG4gKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaGVkOwotICAg
IH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAgICBoYXM6IGZ1bmN0aW9uKCB0YXJnZXQg
KSB7Ci0gICAgICAgIHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKLSAgICAg
ICAgICAgIGwgPSB0YXJnZXRzLmxlbmd0aDsKLQotICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIo
ZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKCA7
IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuY29udGFpbnMoIHRo
aXMsIHRhcmdldHNbaV0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotCi0g
ICAgY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHsKLSAgICAgICAgdmFy
IGN1ciwKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAot
ICAgICAgICAgICAgbWF0Y2hlZCA9IFtdLAotICAgICAgICAgICAgcG9zID0gcm5lZWRzQ29udGV4
dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5nIiA/Ci0g
ICAgICAgICAgICAgICAgalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0
ICkgOgotICAgICAgICAgICAgICAgIDA7Ci0KLSAgICAgICAgZm9yICggOyBpIDwgbDsgaSsrICkg
ewotICAgICAgICAgICAgZm9yICggY3VyID0gdGhpc1tpXTsgY3VyICYmIGN1ciAhPT0gY29udGV4
dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHNr
aXAgZG9jdW1lbnQgZnJhZ21lbnRzCi0gICAgICAgICAgICAgICAgaWYgKCBjdXIubm9kZVR5cGUg
PCAxMSAmJiAocG9zID8KLSAgICAgICAgICAgICAgICAgICAgcG9zLmluZGV4KGN1cikgPiAtMSA6
Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6
emxlCi0gICAgICAgICAgICAgICAgICAgIGN1ci5ub2RlVHlwZSA9PT0gMSAmJgotICAgICAgICAg
ICAgICAgICAgICAgICAgalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3Jz
KSkgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKCBjdXIgKTsKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0
aCA+IDEgPyBqUXVlcnkudW5pcXVlKCBtYXRjaGVkICkgOiBtYXRjaGVkICk7Ci0gICAgfSwKLQot
ICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KLSAgICAv
LyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKLSAgICBpbmRleDogZnVuY3Rpb24oIGVsZW0g
KSB7Ci0KLSAgICAgICAgLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKLSAg
ICAgICAgaWYgKCAhZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiAoIHRoaXNbIDAgXSAmJiB0
aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAt
MTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluZGV4IGluIHNlbGVjdG9yCi0gICAgICAgIGlm
ICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4
T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50Ci0gICAgICAg
IHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsCi0KLSAgICAgICAgICAgIC8vIElmIGl0IHJlY2Vp
dmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAotICAgICAgICAg
ICAgZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtCi0gICAgICAgICk7Ci0gICAgfSwKLQot
ICAgIGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewotICAgICAgICByZXR1cm4g
dGhpcy5wdXNoU3RhY2soCi0gICAgICAgICAgICBqUXVlcnkudW5pcXVlKAotICAgICAgICAgICAg
ICAgIGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCAp
ICkKLSAgICAgICAgICAgICkKLSAgICAgICAgKTsKLSAgICB9LAotCi0gICAgYWRkQmFjazogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgewotICAgICAgICByZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09
IG51bGwgPwotICAgICAgICAgICAgdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZp
bHRlcihzZWxlY3RvcikKLSAgICAgICAgKTsKLSAgICB9Ci19KTsKLQotZnVuY3Rpb24gc2libGlu
ZyggY3VyLCBkaXIgKSB7Ci0gICAgd2hpbGUgKCAoY3VyID0gY3VyW2Rpcl0pICYmIGN1ci5ub2Rl
VHlwZSAhPT0gMSApIHt9Ci0gICAgcmV0dXJuIGN1cjsKLX0KLQotalF1ZXJ5LmVhY2goewotICAg
IHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHZhciBwYXJlbnQgPSBlbGVtLnBh
cmVudE5vZGU7Ci0gICAgICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAx
MSA/IHBhcmVudCA6IG51bGw7Ci0gICAgfSwKLSAgICBwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSAp
IHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwotICAg
IH0sCi0gICAgcGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7Ci0gICAg
ICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGlsICk7Ci0gICAg
fSwKLSAgICBuZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIHNpYmxpbmco
IGVsZW0sICJuZXh0U2libGluZyIgKTsKLSAgICB9LAotICAgIHByZXY6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICByZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsK
LSAgICB9LAotICAgIG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4g
alF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiApOwotICAgIH0sCi0gICAgcHJldkFsbDog
ZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJl
dmlvdXNTaWJsaW5nIiApOwotICAgIH0sCi0gICAgbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwg
aSwgdW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxp
bmciLCB1bnRpbCApOwotICAgIH0sCi0gICAgcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwg
dW50aWwgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJs
aW5nIiwgdW50aWwgKTsKLSAgICB9LAotICAgIHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsK
LSAgICAgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSAp
LmZpcnN0Q2hpbGQsIGVsZW0gKTsKLSAgICB9LAotICAgIGNoaWxkcmVuOiBmdW5jdGlvbiggZWxl
bSApIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsK
LSAgICB9LAotICAgIGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJu
IGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2Rl
cyApOwotICAgIH0KLX0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKLSAgICBqUXVlcnkuZm5bIG5h
bWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBtYXRjaGVk
ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7Ci0KLSAgICAgICAgaWYgKCBuYW1lLnNs
aWNlKCAtNSApICE9PSAiVW50aWwiICkgewotICAgICAgICAgICAgc2VsZWN0b3IgPSB1bnRpbDsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09
PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxl
Y3RvciwgbWF0Y2hlZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0aGlzLmxlbmd0aCA+
IDEgKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgZHVwbGljYXRlcwotICAgICAgICAgICAgaWYg
KCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS51
bmlxdWUoIG1hdGNoZWQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV2ZXJz
ZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXMKLSAgICAgICAgICAgIGlm
ICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVk
LnJldmVyc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0
aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApOwotICAgIH07Ci19KTsKLXZhciBybm90d2hpdGUgPSAo
L1xTKy9nKTsKLQotCi0KLS8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUK
LXZhciBvcHRpb25zQ2FjaGUgPSB7fTsKLQotLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9w
dGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCi1mdW5j
dGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgewotICAgIHZhciBvYmplY3QgPSBvcHRpb25z
Q2FjaGVbIG9wdGlvbnMgXSA9IHt9OwotICAgIGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBy
bm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7Ci0gICAgICAgIG9iamVjdFsg
ZmxhZyBdID0gdHJ1ZTsKLSAgICB9KTsKLSAgICByZXR1cm4gb2JqZWN0OwotfQotCi0vKgotICog
Q3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0g
KgotICogIG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlv
bnMgdGhhdCB3aWxsIGNoYW5nZSBob3cKLSAqICAgICAgICAgICB0aGUgY2FsbGJhY2sgbGlzdCBi
ZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0Ci0gKgotICogQnkgZGVm
YXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0
IGFuZCBjYW4gYmUKLSAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCi0gKgotICogUG9zc2libGUg
b3B0aW9uczoKLSAqCi0gKiAgb25jZTogICAgICAgICAgIHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFj
ayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKLSAqCi0gKiAg
bWVtb3J5OiAgICAgICAgIHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdp
bGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhl
IGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgIm1lbW9yaXpl
ZCIKLSAqICAgICAgICAgICAgICAgICAgdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCi0gKgotICog
IHVuaXF1ZTogICAgICAgICB3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVk
IG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKLSAqCi0gKiAgc3RvcE9uRmFsc2U6ICAg
IGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQotICoKLSAq
LwotalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewotCi0gICAgLy8gQ29u
dmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlm
IG5lZWRlZAotICAgIC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKLSAgICBvcHRpb25zID0g
dHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8KLSAgICAgICAgKCBvcHRpb25zQ2FjaGVbIG9w
dGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6Ci0gICAgICAgIGpRdWVyeS5l
eHRlbmQoIHt9LCBvcHRpb25zICk7Ci0KLSAgICB2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Ig
bm9uLWZvcmdldHRhYmxlIGxpc3RzKQotICAgICAgICBtZW1vcnksCi0gICAgICAgIC8vIEZsYWcg
dG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCi0gICAgICAgIGZpcmVkLAotICAgICAg
ICAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nCi0gICAgICAgIGZp
cmluZywKLSAgICAgICAgLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5
IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCi0gICAgICAgIGZpcmluZ1N0YXJ0LAotICAgICAgICAvLyBF
bmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmcKLSAgICAgICAgZmlyaW5nTGVuZ3RoLAotICAgICAg
ICAvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSByZW1v
dmUgaWYgbmVlZGVkKQotICAgICAgICBmaXJpbmdJbmRleCwKLSAgICAgICAgLy8gQWN0dWFsIGNh
bGxiYWNrIGxpc3QKLSAgICAgICAgbGlzdCA9IFtdLAotICAgICAgICAvLyBTdGFjayBvZiBmaXJl
IGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzCi0gICAgICAgIHN0YWNrID0gIW9wdGlvbnMub25j
ZSAmJiBbXSwKLSAgICAgICAgLy8gRmlyZSBjYWxsYmFja3MKLSAgICAgICAgZmlyZSA9IGZ1bmN0
aW9uKCBkYXRhICkgewotICAgICAgICAgICAgbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0
YTsKLSAgICAgICAgICAgIGZpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGZpcmluZ0luZGV4ID0g
ZmlyaW5nU3RhcnQgfHwgMDsKLSAgICAgICAgICAgIGZpcmluZ1N0YXJ0ID0gMDsKLSAgICAgICAg
ICAgIGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwotICAgICAgICAgICAgZmlyaW5nID0gdHJ1
ZTsKLSAgICAgICAgICAgIGZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0
aDsgZmlyaW5nSW5kZXgrKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxpc3RbIGZpcmluZ0lu
ZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBdICkgPT09IGZhbHNlICYmIG9wdGlvbnMu
c3RvcE9uRmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeSA9IGZhbHNlOyAvLyBU
byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkCi0gICAgICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcmlu
ZyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCBsaXN0ICkgewotICAgICAgICAgICAgICAgIGlm
ICggc3RhY2sgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3RhY2subGVuZ3RoICkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSggc3RhY2suc2hpZnQoKSApOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWVtb3J5ICkgewotICAg
ICAgICAgICAgICAgICAgICBsaXN0ID0gW107Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICAvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVj
dAotICAgICAgICBzZWxmID0gewotICAgICAgICAgICAgLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBj
b2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdAotICAgICAgICAgICAgYWRkOiBmdW5j
dGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxpc3QgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aAotICAgICAgICAgICAgICAg
ICAgICB2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgKGZ1bmN0
aW9uIGFkZCggYXJncyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5lYWNoKCBh
cmdzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCggYXJnICk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zcGVjdCByZWN1cnNpdmVseQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoIGFyZyApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
ICAgICAgICB9KSggYXJndW1lbnRzICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIG5l
ZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGN1
cnJlbnQgZmlyaW5nIGJhdGNoPwotICAgICAgICAgICAgICAgICAgICBpZiAoIGZpcmluZyApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwotICAg
ICAgICAgICAgICAgICAgICAvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90IGZpcmluZyB0aGVu
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXkKLSAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWVtb3J5ICkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgZmlyaW5nU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcmUo
IG1lbW9yeSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8v
IFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgIHJlbW92ZTogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBsaXN0ICkgewotICAgICAgICAgICAgICAg
ICAgICBqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hp
bGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoIGluZGV4LCAxICk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBmaXJpbmcgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nTGVuZ3RoLS07Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpcmluZ0luZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBDaGVj
ayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgotICAgICAgICAgICAgLy8gSWYg
bm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxs
YmFja3MgYXR0YWNoZWQuCi0gICAgICAgICAgICBoYXM6IGZ1bmN0aW9uKCBmbiApIHsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDog
ISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAv
LyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICBlbXB0eTog
ZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IFtdOwotICAgICAgICAgICAgICAg
IGZpcmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAg
ICAgICB9LAotICAgICAgICAgICAgLy8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUK
LSAgICAgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGxpc3Qg
PSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhp
czsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBJcyBpdCBkaXNhYmxlZD8KLSAgICAg
ICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWxp
c3Q7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gTG9jayB0aGUgbGlzdCBpbiBpdHMg
Y3VycmVudCBzdGF0ZQotICAgICAgICAgICAgbG9jazogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAg
ICAgICAgc3RhY2sgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKCAhbWVtb3J5ICkg
ewotICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc2FibGUoKTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9LAotICAgICAgICAg
ICAgLy8gSXMgaXQgbG9ja2VkPwotICAgICAgICAgICAgbG9ja2VkOiBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gIXN0YWNrOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAg
IC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVu
dHMKLSAgICAgICAgICAgIGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXJncyA9IGFyZ3MgfHwgW107Ci0gICAgICAgICAgICAgICAgICAgIGFy
Z3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICggZmlyaW5nICkgewotICAgICAgICAgICAgICAgICAgICAgICAg
c3RhY2sucHVzaCggYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAgICAgZmlyZSggYXJncyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAg
ICAgfSwKLSAgICAgICAgICAgIC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2
ZW4gYXJndW1lbnRzCi0gICAgICAgICAgICBmaXJlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAg
ICAgICBzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBUbyBrbm93IGlmIHRo
ZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKLSAgICAg
ICAgICAgIGZpcmVkOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISFmaXJl
ZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIHJldHVybiBzZWxmOwotfTsKLQot
Ci1qUXVlcnkuZXh0ZW5kKHsKLQotICAgIERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKLSAg
ICAgICAgdmFyIHR1cGxlcyA9IFsKLSAgICAgICAgICAgICAgICAvLyBhY3Rpb24sIGFkZCBsaXN0
ZW5lciwgbGlzdGVuZXIgbGlzdCwgZmluYWwgc3RhdGUKLSAgICAgICAgICAgICAgICBbICJyZXNv
bHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQi
IF0sCi0gICAgICAgICAgICAgICAgWyAicmVqZWN0IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJhY2tz
KCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQiIF0sCi0gICAgICAgICAgICAgICAgWyAibm90aWZ5
IiwgInByb2dyZXNzIiwgalF1ZXJ5LkNhbGxiYWNrcygibWVtb3J5IikgXQotICAgICAgICAgICAg
XSwKLSAgICAgICAgICAgIHN0YXRlID0gInBlbmRpbmciLAotICAgICAgICAgICAgcHJvbWlzZSA9
IHsKLSAgICAgICAgICAgICAgICBzdGF0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGFs
d2F5czogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLmRvbmUoIGFy
Z3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dGhpczsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIHRoZW46IGZ1bmN0aW9u
KCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHsKLSAgICAgICAgICAgICAgICAg
ICAgdmFyIGZucyA9IGFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVy
eS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkg
JiYgZm5zWyBpIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXJyZWRbIGRv
bmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVy
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRbIHR1cGxlWzFdIF0oZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZCA9IGZu
ICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJv
bWlzZSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQu
cHJvbWlzZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbmUo
IG5ld0RlZmVyLnJlc29sdmUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBuZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBwcm9taXNl
ID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcywgZm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVu
dHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBmbnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9KS5wcm9taXNl
KCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAvLyBHZXQgYSBwcm9taXNl
IGZvciB0aGlzIGRlZmVycmVkCi0gICAgICAgICAgICAgICAgLy8gSWYgb2JqIGlzIHByb3ZpZGVk
LCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdAotICAgICAgICAgICAg
ICAgIHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgZGVmZXJyZWQg
PSB7fTsKLQotICAgICAgICAvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0Ci0gICAgICAgIHBy
b21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKLQotICAgICAgICAvLyBBZGQgbGlzdC1zcGVjaWZp
YyBtZXRob2RzCi0gICAgICAgIGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBs
ZSApIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gdHVwbGVbIDIgXSwKLSAgICAgICAgICAgICAg
ICBzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07Ci0KLSAgICAgICAgICAgIC8vIHByb21pc2VbIGRv
bmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkCi0gICAgICAgICAgICBwcm9taXNlWyB0
dXBsZVsxXSBdID0gbGlzdC5hZGQ7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSBzdGF0ZQotICAg
ICAgICAgICAgaWYgKCBzdGF0ZVN0cmluZyApIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChm
dW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgPSBbIHJlc29sdmVkIHwg
cmVqZWN0ZWQgXQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RyaW5nOwotCi0g
ICAgICAgICAgICAgICAgLy8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7
IHByb2dyZXNzX2xpc3QubG9jawotICAgICAgICAgICAgICAgIH0sIHR1cGxlc1sgaSBeIDEgXVsg
MiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICAvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdCi0gICAg
ICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAg
ICAgIGRlZmVycmVkWyB0dXBsZVswXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHBy
b21pc2UgOiB0aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsK
LSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIg
XSA9IGxpc3QuZmlyZVdpdGg7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGRl
ZmVycmVkIGEgcHJvbWlzZQotICAgICAgICBwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7Ci0K
LSAgICAgICAgLy8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueQotICAgICAgICBpZiAoIGZ1bmMgKSB7
Ci0gICAgICAgICAgICBmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gQWxsIGRvbmUhCi0gICAgICAgIHJldHVybiBkZWZlcnJlZDsKLSAgICB9
LAotCi0gICAgLy8gRGVmZXJyZWQgaGVscGVyCi0gICAgd2hlbjogZnVuY3Rpb24oIHN1Ym9yZGlu
YXRlIC8qICwgLi4uLCBzdWJvcmRpbmF0ZU4gKi8gKSB7Ci0gICAgICAgIHZhciBpID0gMCwKLSAg
ICAgICAgICAgIHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAg
ICAgICAgIGxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLAotCi0gICAgICAgICAgICAvLyB0
aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCi0gICAgICAgICAgICByZW1haW5p
bmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbigg
c3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLAotCi0gICAgICAgICAgICAvLyB0
aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNp
bmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC4KLSAgICAgICAgICAgIGRlZmVycmVkID0gcmVt
YWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKLQotICAgICAg
ICAgICAgLy8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZh
bHVlcwotICAgICAgICAgICAgdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFs
dWVzICkgewotICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRleHRzWyBpIF0gPSB0aGlzOwotICAgICAgICAgICAgICAgICAg
ICB2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1l
bnRzICkgOiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZXMgPT09IHByb2dy
ZXNzVmFsdWVzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5V2l0
aCggY29udGV4dHMsIHZhbHVlcyApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAh
KCAtLXJlbWFpbmluZyApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVz
b2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9LAotCi0gICAgICAgICAgICBwcm9ncmVzc1Zh
bHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzOwotCi0gICAgICAgIC8vIGFk
ZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVz
b2x2ZWQKLSAgICAgICAgaWYgKCBsZW5ndGggPiAxICkgewotICAgICAgICAgICAgcHJvZ3Jlc3NW
YWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwotICAgICAgICAgICAgcHJvZ3Jlc3NDb250ZXh0
cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7Ci0gICAgICAgICAgICByZXNvbHZlQ29udGV4dHMgPSBu
ZXcgQXJyYXkoIGxlbmd0aCApOwotICAgICAgICAgICAgZm9yICggOyBpIDwgbGVuZ3RoOyBpKysg
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5Lmlz
RnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKCkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMg
KSApCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3ND
b250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIG9u
IGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXIKLSAgICAgICAgaWYgKCAhcmVtYWluaW5nICkg
ewotICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVz
b2x2ZVZhbHVlcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21p
c2UoKTsKLSAgICB9Ci19KTsKLQotCi0vLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHkK
LXZhciByZWFkeUxpc3Q7Ci0KLWpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHsKLSAg
ICAvLyBBZGQgdGhlIGNhbGxiYWNrCi0gICAgalF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBm
biApOwotCi0gICAgcmV0dXJuIHRoaXM7Ci19OwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICAvLyBJ
cyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgot
ICAgIGlzUmVhZHk6IGZhbHNlLAotCi0gICAgLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55
IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQotICAgIC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4g
U2VlICM2NzgxCi0gICAgcmVhZHlXYWl0OiAxLAotCi0gICAgLy8gSG9sZCAob3IgcmVsZWFzZSkg
dGhlIHJlYWR5IGV2ZW50Ci0gICAgaG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHsKLSAgICAg
ICAgaWYgKCBob2xkICkgewotICAgICAgICAgICAgalF1ZXJ5LnJlYWR5V2FpdCsrOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgalF1ZXJ5LnJlYWR5KCB0cnVlICk7Ci0gICAgICAgIH0K
LSAgICB9LAotCi0gICAgLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQotICAgIHJlYWR5
OiBmdW5jdGlvbiggd2FpdCApIHsKLQotICAgICAgICAvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVu
ZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5Ci0gICAgICAgIGlmICggd2FpdCA9PT0g
dHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkgewotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtZW1iZXIgdGhhdCB0aGUgRE9N
IGlzIHJlYWR5Ci0gICAgICAgIGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKLQotICAgICAgICAvLyBJ
ZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYg
bmVlZCBiZQotICAgICAgICBpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0
ID4gMCApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElm
IHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGUKLSAgICAgICAgcmVhZHlMaXN0
LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOwotCi0gICAgICAgIC8vIFRyaWdn
ZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50cwotICAgICAgICBpZiAoIGpRdWVyeS5mbi50cmlnZ2Vy
ICkgewotICAgICAgICAgICAgalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoInJlYWR5Iikub2Zm
KCJyZWFkeSIpOwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLS8qKgotICogVGhlIHJlYWR5IGV2
ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2QKLSAqLwotZnVuY3Rpb24gY29tcGxl
dGVkKCkgewotICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9h
ZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwotICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVy
KCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKLSAgICBqUXVlcnkucmVhZHkoKTsKLX0KLQot
alF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkgewotICAgIGlmICggIXJlYWR5
TGlzdCApIHsKLQotICAgICAgICByZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTsKLQotICAg
ICAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBh
ZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLSAgICAgICAgLy8g
d2Ugb25jZSB0cmllZCB0byB1c2UgcmVhZHlTdGF0ZSAiaW50ZXJhY3RpdmUiIGhlcmUsIGJ1dCBp
dCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZQotICAgICAgICAvLyBkaXNjb3ZlcmVkIGJ5IENo
cmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjI4MiNjb21tZW50OjE1
Ci0gICAgICAgIGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKLSAg
ICAgICAgICAgIC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRo
ZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQotICAgICAgICAgICAgc2V0VGltZW91dCggalF1
ZXJ5LnJlYWR5ICk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gVXNlIHRo
ZSBoYW5keSBldmVudCBjYWxsYmFjawotICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0
ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7Ci0KLSAgICAgICAg
ICAgIC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3Jr
Ci0gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQs
IGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNl
KCBvYmogKTsKLX07Ci0KLS8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0
aGUgdXNlciBkb2VzIG5vdAotalF1ZXJ5LnJlYWR5LnByb21pc2UoKTsKLQotCi0KLQotLy8gTXVs
dGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9u
Ci0vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVu
Y3Rpb24KLXZhciBhY2Nlc3MgPSBqUXVlcnkuYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwg
a2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewotICAgIHZhciBpID0gMCwK
LSAgICAgICAgbGVuID0gZWxlbXMubGVuZ3RoLAotICAgICAgICBidWxrID0ga2V5ID09IG51bGw7
Ci0KLSAgICAvLyBTZXRzIG1hbnkgdmFsdWVzCi0gICAgaWYgKCBqUXVlcnkudHlwZSgga2V5ICkg
PT09ICJvYmplY3QiICkgewotICAgICAgICBjaGFpbmFibGUgPSB0cnVlOwotICAgICAgICBmb3Ig
KCBpIGluIGtleSApIHsKLSAgICAgICAgICAgIGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwg
a2V5W2ldLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7Ci0gICAgICAgIH0KLQotICAgIC8vIFNldHMg
b25lIHZhbHVlCi0gICAgfSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKLSAgICAg
ICAgY2hhaW5hYmxlID0gdHJ1ZTsKLQotICAgICAgICBpZiAoICFqUXVlcnkuaXNGdW5jdGlvbigg
dmFsdWUgKSApIHsKLSAgICAgICAgICAgIHJhdyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoIGJ1bGsgKSB7Ci0gICAgICAgICAgICAvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWlu
c3QgdGhlIGVudGlyZSBzZXQKLSAgICAgICAgICAgIGlmICggcmF3ICkgewotICAgICAgICAgICAg
ICAgIGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwotICAgICAgICAgICAgICAgIGZuID0gbnVsbDsK
LQotICAgICAgICAgICAgLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVl
cwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWxrID0gZm47Ci0gICAg
ICAgICAgICAgICAgZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7Ci0g
ICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICggZm4gKSB7Ci0gICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLSAgICAgICAg
ICAgICAgICBmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVt
c1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hhaW5hYmxlID8KLSAgICAgICAgZWxlbXMgOgotCi0g
ICAgICAgIC8vIEdldHMKLSAgICAgICAgYnVsayA/Ci0gICAgICAgICAgICBmbi5jYWxsKCBlbGVt
cyApIDoKLSAgICAgICAgICAgIGxlbiA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDsK
LX07Ci0KLQotLyoqCi0gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IGNhbiBoYXZlIGRh
dGEKLSAqLwotalF1ZXJ5LmFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7Ci0gICAgLy8g
QWNjZXB0cyBvbmx5OgotICAgIC8vICAtIE5vZGUKLSAgICAvLyAgICAtIE5vZGUuRUxFTUVOVF9O
T0RFCi0gICAgLy8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREUKLSAgICAvLyAgLSBPYmplY3QKLSAg
ICAvLyAgICAtIEFueQotICAgIC8qIGpzaGludCAtVzAxOCAqLwotICAgIHJldHVybiBvd25lci5u
b2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5
cGUgKTsKLX07Ci0KLQotZnVuY3Rpb24gRGF0YSgpIHsKLSAgICAvLyBTdXBwb3J0OiBBbmRyb2lk
IDwgNCwKLSAgICAvLyBPbGQgV2ViS2l0IGRvZXMgbm90IGhhdmUgT2JqZWN0LnByZXZlbnRFeHRl
bnNpb25zL2ZyZWV6ZSBtZXRob2QsCi0gICAgLy8gcmV0dXJuIG5ldyBlbXB0eSBvYmplY3QgaW5z
dGVhZCB3aXRoIG5vIFtbc2V0XV0gYWNjZXNzb3IKLSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHko
IHRoaXMuY2FjaGUgPSB7fSwgMCwgewotICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewotICAgICAg
ICAgICAgcmV0dXJuIHt9OwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0aGlzLmV4cGFuZG8g
PSBqUXVlcnkuZXhwYW5kbyArIE1hdGgucmFuZG9tKCk7Ci19Ci0KLURhdGEudWlkID0gMTsKLURh
dGEuYWNjZXB0cyA9IGpRdWVyeS5hY2NlcHREYXRhOwotCi1EYXRhLnByb3RvdHlwZSA9IHsKLSAg
ICBrZXk6IGZ1bmN0aW9uKCBvd25lciApIHsKLSAgICAgICAgLy8gV2UgY2FuIGFjY2VwdCBkYXRh
IGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCi0gICAgICAgIC8vIGJ1
dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCi0gICAgICAgIC8vIEFsd2F5cyByZXR1cm4gdGhl
IGtleSBmb3IgYSBmcm96ZW4gb2JqZWN0LgotICAgICAgICBpZiAoICFEYXRhLmFjY2VwdHMoIG93
bmVyICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZh
ciBkZXNjcmlwdG9yID0ge30sCi0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3duZXIgb2Jq
ZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUga2V5Ci0gICAgICAgICAgICB1bmxvY2sgPSBvd25lclsg
dGhpcy5leHBhbmRvIF07Ci0KLSAgICAgICAgLy8gSWYgbm90LCBjcmVhdGUgb25lCi0gICAgICAg
IGlmICggIXVubG9jayApIHsKLSAgICAgICAgICAgIHVubG9jayA9IERhdGEudWlkKys7Ci0KLSAg
ICAgICAgICAgIC8vIFNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlLCBub24td3JpdGFibGUg
cHJvcGVydHkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvclsg
dGhpcy5leHBhbmRvIF0gPSB7IHZhbHVlOiB1bmxvY2sgfTsKLSAgICAgICAgICAgICAgICBPYmpl
Y3QuZGVmaW5lUHJvcGVydGllcyggb3duZXIsIGRlc2NyaXB0b3IgKTsKLQotICAgICAgICAgICAg
Ly8gU3VwcG9ydDogQW5kcm9pZCA8IDQKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGEgbGVz
cyBzZWN1cmUgZGVmaW5pdGlvbgotICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7Ci0gICAgICAg
ICAgICAgICAgZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7Ci0gICAgICAgICAg
ICAgICAgalF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuc3VyZSB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAg
IGlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkgewotICAgICAgICAgICAgdGhpcy5jYWNoZVsg
dW5sb2NrIF0gPSB7fTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1bmxvY2s7Ci0gICAg
fSwKLSAgICBzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7Ci0gICAgICAgIHZh
ciBwcm9wLAotICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0
byB0aGlzIG5vZGUsCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhp
cyAib3duZXIiLCBjcmVhdGUgb25lIGlubGluZQotICAgICAgICAgICAgLy8gYW5kIHNldCB0aGUg
dW5sb2NrIGFzIHRob3VnaCBhbiBvd25lciBlbnRyeSBoYWQgYWx3YXlzIGV4aXN0ZWQKLSAgICAg
ICAgICAgIHVubG9jayA9IHRoaXMua2V5KCBvd25lciApLAotICAgICAgICAgICAgY2FjaGUgPSB0
aGlzLmNhY2hlWyB1bmxvY2sgXTsKLQotICAgICAgICAvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwg
dmFsdWUgXSBhcmdzCi0gICAgICAgIGlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewot
ICAgICAgICAgICAgY2FjaGVbIGRhdGEgXSA9IHZhbHVlOwotCi0gICAgICAgIC8vIEhhbmRsZTog
WyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkCi0g
ICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkgewotICAgICAg
ICAgICAgICAgIGpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7Ci0g
ICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0
byB0aGUgY2FjaGUgb2JqZWN0Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IGZvciAoIHByb3AgaW4gZGF0YSApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVbIHByb3Ag
XSA9IGRhdGFbIHByb3AgXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlOwotICAgIH0sCi0gICAgZ2V0OiBmdW5jdGlvbigg
b3duZXIsIGtleSApIHsKLSAgICAgICAgLy8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQs
IG9yIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0
ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsCi0gICAgICAgIC8vIGFsbG93aW5nIGRpcmVjdCBh
Y2Nlc3MgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgICAgLy8gZW1wdHkgZGF0YSBvYmplY3Qu
IEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuCi0gICAgICAgIHZhciBjYWNo
ZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07Ci0KLSAgICAgICAgcmV0dXJuIGtl
eSA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgIGNhY2hlIDogY2FjaGVbIGtleSBdOwotICAg
IH0sCi0gICAgYWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7Ci0gICAgICAg
IHZhciBzdG9yZWQ7Ci0gICAgICAgIC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjoKLSAgICAgICAg
Ly8KLSAgICAgICAgLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAotICAgICAgICAvLyAgIDIu
IEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWQKLSAgICAg
ICAgLy8KLSAgICAgICAgLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQg
bWV0aG9kIHRvIGRldGVybWluZQotICAgICAgICAvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJl
c3BlY3RpdmVseSBlaXRoZXI6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vICAgMS4gVGhlIGVudGly
ZSBjYWNoZSBvYmplY3QKLSAgICAgICAgLy8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtl
eQotICAgICAgICAvLwotICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8Ci0gICAgICAg
ICAgICAgICAgKChrZXkgJiYgdHlwZW9mIGtleSA9PT0gInN0cmluZyIpICYmIHZhbHVlID09PSB1
bmRlZmluZWQpICkgewotCi0gICAgICAgICAgICBzdG9yZWQgPSB0aGlzLmdldCggb3duZXIsIGtl
eSApOwotCi0gICAgICAgICAgICByZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQgPwotICAgICAg
ICAgICAgICAgIHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkp
ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3Ry
aW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQotICAgICAgICAvLyBhcmUgc3BlY2lmaWVkLCBz
ZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjoKLSAgICAgICAgLy8K
LSAgICAgICAgLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwotICAgICAgICAvLyAgIDIu
IEEga2V5IGFuZCB2YWx1ZQotICAgICAgICAvLwotICAgICAgICB0aGlzLnNldCggb3duZXIsIGtl
eSwgdmFsdWUgKTsKLQotICAgICAgICAvLyBTaW5jZSB0aGUgInNldCIgcGF0aCBjYW4gaGF2ZSB0
d28gcG9zc2libGUgZW50cnkgcG9pbnRzCi0gICAgICAgIC8vIHJldHVybiB0aGUgZXhwZWN0ZWQg
ZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQotICAgICAgICByZXR1cm4gdmFs
dWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5OwotICAgIH0sCi0gICAgcmVtb3ZlOiBmdW5j
dGlvbiggb3duZXIsIGtleSApIHsKLSAgICAgICAgdmFyIGksIG5hbWUsIGNhbWVsLAotICAgICAg
ICAgICAgdW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksCi0gICAgICAgICAgICBjYWNoZSA9IHRo
aXMuY2FjaGVbIHVubG9jayBdOwotCi0gICAgICAgIGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICB0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9OwotCi0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJp
bmcgb2Yga2V5cwotICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMuLi4KLSAgICAg
ICAgICAgICAgICAvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIs
ICJ2YWwiKSBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgLy8ga2V5cyB3aWxsIGJlIGNvbnZl
cnRlZCB0byBjYW1lbENhc2UuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8g
d2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKLSAgICAgICAgICAgICAg
ICAvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2Ci0gICAgICAgICAg
ICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGgu
Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1l
bENhc2UgKSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYW1lbCA9
IGpRdWVyeS5jYW1lbENhc2UoIGtleSApOwotICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgc3Ry
aW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYg
KCBrZXkgaW4gY2FjaGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBbIGtleSwgY2Ft
ZWwgXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuCi0gICAgICAgICAgICAgICAg
ICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNw
YWNlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjYW1lbDsKLSAgICAgICAgICAgICAgICAg
ICAgbmFtZSA9IG5hbWUgaW4gY2FjaGUgPwotICAgICAgICAgICAgICAgICAgICAgICAgWyBuYW1l
IF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpID0gbmFtZS5sZW5ndGg7Ci0gICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbIG5hbWVb
IGkgXSBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICBoYXNEYXRhOiBm
dW5jdGlvbiggb3duZXIgKSB7Ci0gICAgICAgIHJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3Qo
Ci0gICAgICAgICAgICB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fQot
ICAgICAgICApOwotICAgIH0sCi0gICAgZGlzY2FyZDogZnVuY3Rpb24oIG93bmVyICkgewotICAg
ICAgICBpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0
aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTsKLSAgICAgICAgfQotICAgIH0KLX07
Ci12YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTsKLQotdmFyIGRhdGFfdXNlciA9IG5ldyBEYXRh
KCk7Ci0KLQotCi0vKgotICAgIEltcGxlbWVudGF0aW9uIFN1bW1hcnkKLQotICAgIDEuIEVuZm9y
Y2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFu
Y2gKLSAgICAyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNp
bmcgdGhlIHN0b3JhZ2UKLSAgICAgICAgcGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLgotICAg
IDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgInByaXZhdGUiIGFu
ZCAidXNlciIgZGF0YS4KLSAgICA0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1
c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQotICAgIDUuIEF2b2lkIGV4
cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5k
byBwcm9wZXJ0aWVzKQotICAgIDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRh
dGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNAotKi8KLXZhciByYnJhY2UgPSAvXig/Olx7
W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAotICAgIHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOwot
Ci1mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewotICAgIHZhciBuYW1lOwot
Ci0gICAgLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFu
eQotICAgIC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQotICAgIGlmICgg
ZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0gICAgICAgIG5h
bWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNh
c2UoKTsKLSAgICAgICAgZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7Ci0KLSAgICAg
ICAgaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICB0cnkgewot
ICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKLSAgICAgICAg
ICAgICAgICAgICAgZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAg
ICAgZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkg
Y29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCi0gICAg
ICAgICAgICAgICAgICAgICtkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6Ci0gICAgICAgICAg
ICAgICAgICAgIHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkg
OgotICAgICAgICAgICAgICAgICAgICBkYXRhOwotICAgICAgICAgICAgfSBjYXRjaCggZSApIHt9
Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3Qg
Y2hhbmdlZCBsYXRlcgotICAgICAgICAgICAgZGF0YV91c2VyLnNldCggZWxlbSwga2V5LCBkYXRh
ICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhID0gdW5kZWZpbmVkOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotfQotCi1qUXVlcnkuZXh0ZW5kKHsKLSAg
ICBoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgcmV0dXJuIGRhdGFfdXNlci5o
YXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKTsKLSAgICB9LAotCi0g
ICAgZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7Ci0gICAgICAgIHJldHVybiBk
YXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7Ci0gICAgfSwKLQotICAgIHJlbW92
ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotICAgICAgICBkYXRhX3VzZXIucmVtb3Zl
KCBlbGVtLCBuYW1lICk7Ci0gICAgfSwKLQotICAgIC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxs
cyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkCi0gICAgLy8gd2l0
aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNh
dGVkLgotICAgIF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKLSAgICAgICAg
cmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKLSAgICB9LAotCi0g
ICAgX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotICAgICAgICBkYXRhX3By
aXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5mbi5leHRlbmQo
ewotICAgIGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewotICAgICAgICB2YXIgaSwgbmFt
ZSwgZGF0YSwKLSAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCi0gICAgICAgICAgICBhdHRy
cyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzOwotCi0gICAgICAgIC8vIEdldHMgYWxsIHZhbHVl
cwotICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgaWYgKCB0
aGlzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV91c2VyLmdldCggZWxl
bSApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRh
X3ByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiApICkgewotICAgICAgICAgICAgICAgICAg
ICBpID0gYXR0cnMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGktLSApIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5h
bWUuc2xpY2UoNSkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQXR0ciggZWxl
bSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LnNldCggZWxl
bSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8g
U2V0cyBtdWx0aXBsZSB2YWx1ZXMKLSAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0
IiApIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgZGF0YV91c2VyLnNldCggdGhpcywga2V5ICk7Ci0gICAgICAgICAgICB9KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSAp
IHsKLSAgICAgICAgICAgIHZhciBkYXRhLAotICAgICAgICAgICAgICAgIGNhbWVsS2V5ID0galF1
ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjYWxsaW5nIGpRdWVy
eSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5Ci0gICAgICAgICAgICAvLyAo
YW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRo
ZQotICAgICAgICAgICAgLy8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFu
IGVtcHR5IGpRdWVyeSBvYmplY3QKLSAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIGB1bmRl
ZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKLSAgICAgICAgICAgIC8vIHRo
cm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1h
ZGUuCi0gICAgICAgICAgICBpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKLSAg
ICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlCi0gICAg
ICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGFzLWlzCi0gICAgICAgICAgICAgICAgZGF0YSA9
IGRhdGFfdXNlci5nZXQoIGVsZW0sIGtleSApOwotICAgICAgICAgICAgICAgIGlmICggZGF0YSAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAg
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZy
b20gdGhlIGNhY2hlCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUga2V5IGNhbWVsaXplZAot
ICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApOwot
ICAgICAgICAgICAgICAgIGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg
ICAvLyBBdHRlbXB0IHRvICJkaXNjb3ZlciIgdGhlIGRhdGEgaW4KLSAgICAgICAgICAgICAgICAv
LyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFB
dHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBk
YXRhICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwot
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHJlYWxseSBo
YXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC4KLSAgICAgICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgZGF0YS4uLgotICAgICAg
ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBh
dHRlbXB0IHRvIHN0b3JlIGEgY29weSBvciByZWZlcmVuY2Ugb2YgYW55Ci0gICAgICAgICAgICAg
ICAgLy8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJlZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5
LgotICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YV91c2VyLmdldCggdGhpcywgY2FtZWxL
ZXkgKTsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGlu
dGVyb3AsIHdlIGhhdmUgdG8KLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBwcm9wZXJ0eSBuYW1l
cyB3aXRoIGRhc2hlcyBpbiBhIGNhbWVsQ2FzZSBmb3JtLgotICAgICAgICAgICAgICAgIC8vIFRo
aXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKgotICAgICAgICAgICAgICAg
IGRhdGFfdXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApOwotCi0gICAgICAgICAgICAg
ICAgLy8gKi4uLiBJbiB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5
XwotICAgICAgICAgICAgICAgIC8vIGhhdmUgZGFzaGVzLCB3ZSBuZWVkIHRvIGFsc28gc3RvcmUg
YSBjb3B5IG9mIHRoYXQKLSAgICAgICAgICAgICAgICAvLyB1bmNoYW5nZWQgcHJvcGVydHkuCi0g
ICAgICAgICAgICAgICAgaWYgKCBrZXkuaW5kZXhPZigiLSIpICE9PSAtMSAmJiBkYXRhICE9PSB1
bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFfdXNlci5zZXQoIHRoaXMsIGtl
eSwgdmFsdWUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAg
fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7Ci0gICAg
fSwKLQotICAgIHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7Ci0gICAgICAgIHJldHVybiB0
aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBkYXRhX3VzZXIucmVtb3ZlKCB0aGlz
LCBrZXkgKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0g
ICAgcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewotICAgICAgICB2YXIgcXVl
dWU7Ci0KLSAgICAgICAgaWYgKCBlbGVtICkgewotICAgICAgICAgICAgdHlwZSA9ICggdHlwZSB8
fCAiZngiICkgKyAicXVldWUiOwotICAgICAgICAgICAgcXVldWUgPSBkYXRhX3ByaXYuZ2V0KCBl
bGVtLCB0eXBlICk7Ci0KLSAgICAgICAgICAgIC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGlu
ZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKLSAgICAgICAgICAgIGlmICgg
ZGF0YSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSgg
ZGF0YSApICkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZSA9IGRhdGFfcHJpdi5hY2Nlc3Mo
IGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsKLSAgICAgICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKCBkYXRhICk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHF1ZXVlIHx8IFtd
OwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBl
ICkgewotICAgICAgICB0eXBlID0gdHlwZSB8fCAiZngiOwotCi0gICAgICAgIHZhciBxdWV1ZSA9
IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAotICAgICAgICAgICAgc3RhcnRMZW5ndGggPSBx
dWV1ZS5sZW5ndGgsCi0gICAgICAgICAgICBmbiA9IHF1ZXVlLnNoaWZ0KCksCi0gICAgICAgICAg
ICBob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLAotICAgICAgICAgICAg
bmV4dCA9IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5kZXF1ZXVlKCBlbGVt
LCB0eXBlICk7Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIC8vIElmIHRoZSBmeCBxdWV1ZSBp
cyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKLSAgICAgICAg
aWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgewotICAgICAgICAgICAgZm4gPSBxdWV1ZS5zaGlm
dCgpOwotICAgICAgICAgICAgc3RhcnRMZW5ndGgtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICggZm4gKSB7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHBy
ZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcKLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2Fs
bHkgZGVxdWV1ZWQKLSAgICAgICAgICAgIGlmICggdHlwZSA9PT0gImZ4IiApIHsKLSAgICAgICAg
ICAgICAgICBxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gY2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvbgotICAg
ICAgICAgICAgZGVsZXRlIGhvb2tzLnN0b3A7Ci0gICAgICAgICAgICBmbi5jYWxsKCBlbGVtLCBu
ZXh0LCBob29rcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhc3RhcnRMZW5ndGggJiYg
aG9va3MgKSB7Ci0gICAgICAgICAgICBob29rcy5lbXB0eS5maXJlKCk7Ci0gICAgICAgIH0KLSAg
ICB9LAotCi0gICAgLy8gbm90IGludGVuZGVkIGZvciBwdWJsaWMgY29uc3VtcHRpb24gLSBnZW5l
cmF0ZXMgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJucyB0aGUgY3VycmVudCBvbmUKLSAg
ICBfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7Ci0gICAgICAgIHZhciBrZXkg
PSB0eXBlICsgInF1ZXVlSG9va3MiOwotICAgICAgICByZXR1cm4gZGF0YV9wcml2LmdldCggZWxl
bSwga2V5ICkgfHwgZGF0YV9wcml2LmFjY2VzcyggZWxlbSwga2V5LCB7Ci0gICAgICAgICAgICBl
bXB0eTogalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKSB7Ci0g
ICAgICAgICAgICAgICAgZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgInF1ZXVlIiwg
a2V5IF0gKTsKLSAgICAgICAgICAgIH0pCi0gICAgICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVl
cnkuZm4uZXh0ZW5kKHsKLSAgICBxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0gICAg
ICAgIHZhciBzZXR0ZXIgPSAyOwotCi0gICAgICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgZGF0YSA9IHR5cGU7Ci0gICAgICAgICAgICB0eXBlID0gImZ4
IjsKLSAgICAgICAgICAgIHNldHRlci0tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBhcmd1
bWVudHMubGVuZ3RoIDwgc2V0dGVyICkgewotICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS5xdWV1
ZSggdGhpc1swXSwgdHlwZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGEgPT09
IHVuZGVmaW5lZCA/Ci0gICAgICAgICAgICB0aGlzIDoKLSAgICAgICAgICAgIHRoaXMuZWFjaChm
dW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRo
aXMsIHR5cGUsIGRhdGEgKTsKLQotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBhIGhvb2tzIGZv
ciB0aGlzIHF1ZXVlCi0gICAgICAgICAgICAgICAgalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0
eXBlICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0g
IT09ICJpbnByb2dyZXNzIiApIHsKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUo
IHRoaXMsIHR5cGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICB9
LAotICAgIGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewotICAgICAgICByZXR1cm4gdGhpcy5l
YWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUg
KTsKLSAgICAgICAgfSk7Ci0gICAgfSwKLSAgICBjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSAp
IHsKLSAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKLSAgICB9
LAotICAgIC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWlu
IHR5cGUKLSAgICAvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKLSAg
ICBwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkgewotICAgICAgICB2YXIgdG1wLAotICAg
ICAgICAgICAgY291bnQgPSAxLAotICAgICAgICAgICAgZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQo
KSwKLSAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcywKLSAgICAgICAgICAgIGkgPSB0aGlzLmxl
bmd0aCwKLSAgICAgICAgICAgIHJlc29sdmUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoICEoIC0tY291bnQgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2
ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9OwotCi0gICAgICAgIGlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewot
ICAgICAgICAgICAgb2JqID0gdHlwZTsKLSAgICAgICAgICAgIHR5cGUgPSB1bmRlZmluZWQ7Ci0g
ICAgICAgIH0KLSAgICAgICAgdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQotICAgICAgICB3aGlsZSAo
IGktLSApIHsKLSAgICAgICAgICAgIHRtcCA9IGRhdGFfcHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0s
IHR5cGUgKyAicXVldWVIb29rcyIgKTsKLSAgICAgICAgICAgIGlmICggdG1wICYmIHRtcC5lbXB0
eSApIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIHRtcC5lbXB0
eS5hZGQoIHJlc29sdmUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXNv
bHZlKCk7Ci0gICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTsKLSAgICB9Ci19KTsK
LXZhciBwbnVtID0gKC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8pLnNvdXJj
ZTsKLQotdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIg
XTsKLQotdmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkgewotICAgICAgICAvLyBp
c0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwotICAg
ICAgICAvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnQKLSAg
ICAgICAgZWxlbSA9IGVsIHx8IGVsZW07Ci0gICAgICAgIHJldHVybiBqUXVlcnkuY3NzKCBlbGVt
LCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJE
b2N1bWVudCwgZWxlbSApOwotICAgIH07Ci0KLXZhciByY2hlY2thYmxlVHlwZSA9ICgvXig/OmNo
ZWNrYm94fHJhZGlvKSQvaSk7Ci0KLQotCi0oZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGZyYWdtZW50
ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAotICAgICAgICBkaXYgPSBmcmFn
bWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApOwotCi0g
ICAgLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIg
dGhlIGNoZWNrZWQgYXR0cmlidXRlCi0gICAgZGl2LmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0n
cmFkaW8nIGNoZWNrZWQ9J2NoZWNrZWQnIG5hbWU9J3QnLz4iOwotCi0gICAgLy8gU3VwcG9ydDog
U2FmYXJpIDUuMSwgaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCi0gICAgLy8gb2xk
IFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50
cwotICAgIHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5v
ZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDsKLQotICAgIC8vIE1ha2Ugc3VyZSB0ZXh0YXJl
YSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkCi0gICAgLy8g
U3VwcG9ydDogSUU5LUlFMTErCi0gICAgZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4
dGFyZWE+IjsKLSAgICBzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0
cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTsKLX0pKCk7Ci12YXIgc3RydW5kZWZpbmVkID0g
dHlwZW9mIHVuZGVmaW5lZDsKLQotCi0KLXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgPSAib25mb2N1
c2luIiBpbiB3aW5kb3c7Ci0KLQotdmFyCi0gICAgcmtleUV2ZW50ID0gL15rZXkvLAotICAgIHJt
b3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLAotICAgIHJmb2N1c01v
cnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAotICAgIHJ0eXBlbmFtZXNw
YWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsKLQotZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHsKLSAgICB0cnkg
ewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKLSAgICB9IGNhdGNoICgg
ZXJyICkgeyB9Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVu
dHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuCi0gKiBQcm9wcyB0byBEZWFu
IEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgotICovCi1q
UXVlcnkuZXZlbnQgPSB7Ci0KLSAgICBnbG9iYWw6IHt9LAotCi0gICAgYWRkOiBmdW5jdGlvbigg
ZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewotCi0gICAgICAgIHZhciBo
YW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCwKLSAgICAgICAgICAgIGV2ZW50cywgdCwgaGFu
ZGxlT2JqLAotICAgICAgICAgICAgc3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMs
IG9yaWdUeXBlLAotICAgICAgICAgICAgZWxlbURhdGEgPSBkYXRhX3ByaXYuZ2V0KCBlbGVtICk7
Ci0KLSAgICAgICAgLy8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21t
ZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cykKLSAgICAgICAgaWYgKCAhZWxlbURh
dGEgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxs
ZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhh
bmRsZXIKLSAgICAgICAgaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7Ci0gICAgICAgICAgICBoYW5k
bGVPYmpJbiA9IGhhbmRsZXI7Ci0gICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFu
ZGxlcjsKLSAgICAgICAgICAgIHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlx
dWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKLSAgICAgICAgaWYgKCAhaGFuZGxl
ci5ndWlkICkgewotICAgICAgICAgICAgaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUg
YW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3QKLSAgICAgICAgaWYgKCAhKGV2
ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0gICAgICAgICAgICBldmVudHMgPSBlbGVtRGF0
YS5ldmVudHMgPSB7fTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICEoZXZlbnRIYW5kbGUgPSBl
bGVtRGF0YS5oYW5kbGUpICkgewotICAgICAgICAgICAgZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5o
YW5kbGUgPSBmdW5jdGlvbiggZSApIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIHRoZSBz
ZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAotICAgICAgICAgICAg
ICAgIC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQK
LSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5kZWZpbmVkICYm
IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/Ci0gICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmlu
ZWQ7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG11bHRp
cGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQotICAgICAgICB0eXBlcyA9ICggdHlwZXMg
fHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwotICAgICAgICB0ID0gdHlwZXMu
bGVuZ3RoOwotICAgICAgICB3aGlsZSAoIHQtLSApIHsKLSAgICAgICAgICAgIHRtcCA9IHJ0eXBl
bmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107Ci0gICAgICAgICAgICB0eXBlID0gb3Jp
Z1R5cGUgPSB0bXBbMV07Ci0gICAgICAgICAgICBuYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIg
KS5zcGxpdCggIi4iICkuc29ydCgpOwotCi0gICAgICAgICAgICAvLyBUaGVyZSAqbXVzdCogYmUg
YSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnMKLSAgICAgICAgICAg
IGlmICggIXR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3Bl
Y2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZQotICAgICAgICAgICAgc3Bl
Y2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0KLSAgICAgICAgICAg
IC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBl
LCBvdGhlcndpc2UgZ2l2ZW4gdHlwZQotICAgICAgICAgICAgdHlwZSA9ICggc2VsZWN0b3IgPyBz
cGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwotCi0gICAg
ICAgICAgICAvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlCi0gICAg
ICAgICAgICBzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQot
ICAgICAgICAgICAgLy8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMK
LSAgICAgICAgICAgIGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoewotICAgICAgICAgICAgICAg
IHR5cGU6IHR5cGUsCi0gICAgICAgICAgICAgICAgb3JpZ1R5cGU6IG9yaWdUeXBlLAotICAgICAg
ICAgICAgICAgIGRhdGE6IGRhdGEsCi0gICAgICAgICAgICAgICAgaGFuZGxlcjogaGFuZGxlciwK
LSAgICAgICAgICAgICAgICBndWlkOiBoYW5kbGVyLmd1aWQsCi0gICAgICAgICAgICAgICAgc2Vs
ZWN0b3I6IHNlbGVjdG9yLAotICAgICAgICAgICAgICAgIG5lZWRzQ29udGV4dDogc2VsZWN0b3Ig
JiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksCi0gICAg
ICAgICAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIi4iKQotICAgICAgICAgICAg
fSwgaGFuZGxlT2JqSW4gKTsKLQotICAgICAgICAgICAgLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxl
ciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKLSAgICAgICAgICAgIGlmICggIShoYW5kbGVycyA9
IGV2ZW50c1sgdHlwZSBdKSApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sg
dHlwZSBdID0gW107Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7
Ci0KLSAgICAgICAgICAgICAgICAvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBz
cGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKLSAgICAgICAgICAgICAgICBpZiAo
ICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNw
YWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxl
bS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSwgZmFsc2UgKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgaWYgKCBzcGVjaWFsLmFkZCApIHsKLSAgICAgICAgICAgICAgICBzcGVjaWFsLmFkZC5j
YWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLQotICAgICAgICAgICAgICAgIGlmICggIWhhbmRsZU9i
ai5oYW5kbGVyLmd1aWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9iai5oYW5kbGVy
Lmd1aWQgPSBoYW5kbGVyLmd1aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVn
YXRlcyBpbiBmcm9udAotICAgICAgICAgICAgaWYgKCBzZWxlY3RvciApIHsKLSAgICAgICAgICAg
ICAgICBoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxl
T2JqICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1
c2goIGhhbmRsZU9iaiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBLZWVwIHRy
YWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1p
emF0aW9uCi0gICAgICAgICAgICBqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwot
ICAgICAgICB9Ci0KLSAgICB9LAotCi0gICAgLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBl
dmVudHMgZnJvbSBhbiBlbGVtZW50Ci0gICAgcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMs
IGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHsKLQotICAgICAgICB2YXIgaiwgb3Jp
Z0NvdW50LCB0bXAsCi0gICAgICAgICAgICBldmVudHMsIHQsIGhhbmRsZU9iaiwKLSAgICAgICAg
ICAgIHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKLSAgICAg
ICAgICAgIGVsZW1EYXRhID0gZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhX3ByaXYu
Z2V0KCBlbGVtICk7Ci0KLSAgICAgICAgaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVt
RGF0YS5ldmVudHMpICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUg
b21pdHRlZAotICAgICAgICB0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRl
ICkgfHwgWyAiIiBdOwotICAgICAgICB0ID0gdHlwZXMubGVuZ3RoOwotICAgICAgICB3aGlsZSAo
IHQtLSApIHsKLSAgICAgICAgICAgIHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3Rd
ICkgfHwgW107Ci0gICAgICAgICAgICB0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07Ci0gICAgICAg
ICAgICBuYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwot
Ci0gICAgICAgICAgICAvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlm
IHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgIGlmICggIXR5cGUgKSB7Ci0g
ICAgICAgICAgICAgICAgZm9yICggdHlwZSBpbiBldmVudHMgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVy
LCBzZWxlY3RvciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3BlY2lhbCA9IGpRdWVyeS5l
dmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0gICAgICAgICAgICB0eXBlID0gKCBzZWxlY3Rv
ciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7Ci0g
ICAgICAgICAgICBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwotICAgICAgICAgICAg
dG1wID0gdG1wWzJdICYmIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigi
XFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBt
YXRjaGluZyBldmVudHMKLSAgICAgICAgICAgIG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5n
dGg7Ci0gICAgICAgICAgICB3aGlsZSAoIGotLSApIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVP
YmogPSBoYW5kbGVyc1sgaiBdOwotCi0gICAgICAgICAgICAgICAgaWYgKCAoIG1hcHBlZFR5cGVz
IHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgotICAgICAgICAgICAgICAg
ICAgICAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgot
ICAgICAgICAgICAgICAgICAgICAoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3Bh
Y2UgKSApICYmCi0gICAgICAgICAgICAgICAgICAgICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09
PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNl
bGVjdG9yICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZSggaiwgMSAp
OwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICggc3BlY2lhbC5yZW1vdmUgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5k
bGVPYmogKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBp
ZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAotICAgICAg
ICAgICAgLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyBy
ZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCi0gICAgICAgICAgICBpZiAoIG9yaWdD
b3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIGlmICggIXNwZWNp
YWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBl
bGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVy
eS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7Ci0gICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0
J3Mgbm8gbG9uZ2VyIHVzZWQKLSAgICAgICAgaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZl
bnRzICkgKSB7Ci0gICAgICAgICAgICBkZWxldGUgZWxlbURhdGEuaGFuZGxlOwotICAgICAgICAg
ICAgZGF0YV9wcml2LnJlbW92ZSggZWxlbSwgImV2ZW50cyIgKTsKLSAgICAgICAgfQotICAgIH0s
Ci0KLSAgICB0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVy
cyApIHsKLQotICAgICAgICB2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFu
ZGxlLCBzcGVjaWFsLAotICAgICAgICAgICAgZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50
IF0sCi0gICAgICAgICAgICB0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2
ZW50LnR5cGUgOiBldmVudCwKLSAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCgg
ZXZlbnQsICJuYW1lc3BhY2UiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIi4iKSA6IFtdOwot
Ci0gICAgICAgIGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwotCi0gICAgICAg
IC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCi0gICAgICAgIGlm
ICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9jdXMvYmx1ciBtb3JwaHMg
dG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93Ci0g
ICAgICAgIGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2Vy
ZWQgKSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgg
dHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKLSAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgdHJp
Z2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKCkKLSAg
ICAgICAgICAgIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7Ci0gICAgICAgICAgICB0eXBl
ID0gbmFtZXNwYWNlcy5zaGlmdCgpOwotICAgICAgICAgICAgbmFtZXNwYWNlcy5zb3J0KCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwICYmICJvbiIg
KyB0eXBlOwotCi0gICAgICAgIC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBv
YmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZwotICAgICAgICBldmVu
dCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KLSAgICAgICAgICAgIGV2ZW50IDoKLSAgICAg
ICAgICAgIG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIg
JiYgZXZlbnQgKTsKLQotICAgICAgICAvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZl
IGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCi0gICAgICAgIGV2ZW50Lmlz
VHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzOwotICAgICAgICBldmVudC5uYW1lc3BhY2Ug
PSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKLSAgICAgICAgZXZlbnQubmFtZXNwYWNlX3JlID0gZXZl
bnQubmFtZXNwYWNlID8KLSAgICAgICAgICAgIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVz
cGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICkgOgotICAgICAgICAgICAg
bnVsbDsKLQotICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWlu
ZyByZXVzZWQKLSAgICAgICAgZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwotICAgICAgICBpZiAo
ICFldmVudC50YXJnZXQgKSB7Ci0gICAgICAgICAgICBldmVudC50YXJnZXQgPSBlbGVtOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQg
dGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAotICAgICAgICBkYXRhID0g
ZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgIFsgZXZlbnQgXSA6Ci0gICAgICAgICAgICBqUXVl
cnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTsKLQotICAgICAgICAvLyBBbGxvdyBzcGVj
aWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzCi0gICAgICAgIHNwZWNpYWwgPSBq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwotICAgICAgICBpZiAoICFvbmx5SGFu
ZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwg
ZGF0YSApID09PSBmYWxzZSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBl
ciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKQotICAgICAgICAvLyBCdWJibGUgdXAgdG8gZG9jdW1l
bnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIg
KCM5NzI0KQotICAgICAgICBpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUg
JiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewotCi0gICAgICAgICAgICBidWJibGVUeXBl
ID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKLSAgICAgICAgICAgIGlmICggIXJmb2N1
c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7Ci0gICAgICAgICAgICAgICAgY3Vy
ID0gY3VyLnBhcmVudE5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKCA7IGN1
cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnRQYXRoLnB1
c2goIGN1ciApOwotICAgICAgICAgICAgICAgIHRtcCA9IGN1cjsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5n
Liwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCi0gICAgICAgICAgICBpZiAoIHRtcCA9
PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7Ci0gICAgICAgICAgICAgICAg
ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdp
bmRvdyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlyZSBoYW5k
bGVycyBvbiB0aGUgZXZlbnQgcGF0aAotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCAo
Y3VyID0gZXZlbnRQYXRoW2krK10pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkg
ewotCi0gICAgICAgICAgICBldmVudC50eXBlID0gaSA+IDEgPwotICAgICAgICAgICAgICAgIGJ1
YmJsZVR5cGUgOgotICAgICAgICAgICAgICAgIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKLQot
ICAgICAgICAgICAgLy8galF1ZXJ5IGhhbmRsZXIKLSAgICAgICAgICAgIGhhbmRsZSA9ICggZGF0
YV9wcml2LmdldCggY3VyLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBkYXRh
X3ByaXYuZ2V0KCBjdXIsICJoYW5kbGUiICk7Ci0gICAgICAgICAgICBpZiAoIGhhbmRsZSApIHsK
LSAgICAgICAgICAgICAgICBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAvLyBOYXRpdmUgaGFuZGxlcgotICAgICAgICAgICAgaGFuZGxlID0g
b250eXBlICYmIGN1clsgb250eXBlIF07Ci0gICAgICAgICAgICBpZiAoIGhhbmRsZSAmJiBoYW5k
bGUuYXBwbHkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICkgewotICAgICAgICAgICAgICAg
IGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkgewotICAgICAgICAgICAgICAgICAgICBl
dmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBldmVudC50eXBlID0gdHlwZTsKLQotICAgICAgICAvLyBJZiBu
b2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93Ci0gICAgICAgIGlm
ICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7Ci0KLSAg
ICAgICAgICAgIGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBw
bHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiYKLSAgICAgICAgICAgICAg
ICBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewotCi0gICAgICAgICAgICAgICAgLy8gQ2Fs
bCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5h
bWUgYXMgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGRlZmF1bHQgYWN0
aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MCkK
LSAgICAgICAgICAgICAgICBpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsg
dHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewotCi0gICAgICAgICAgICAg
ICAgICAgIC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0
cyBGT08oKSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gZWxlbVsgb250eXBlIF07
Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBlbGVtWyBvbnR5cGUgXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZl
bnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQotICAgICAgICAgICAgICAgICAg
ICBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgZWxl
bVsgdHlwZSBdKCk7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQg
PSB1bmRlZmluZWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBlbGVtWyBvbnR5cGUgXSA9IHRtcDsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBldmVudC5yZXN1bHQ7Ci0gICAgfSwKLQotICAgIGRpc3BhdGNoOiBmdW5jdGlv
biggZXZlbnQgKSB7Ci0KLSAgICAgICAgLy8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBm
cm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0Ci0gICAgICAgIGV2ZW50ID0galF1ZXJ5LmV2ZW50
LmZpeCggZXZlbnQgKTsKLQotICAgICAgICB2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVP
YmosCi0gICAgICAgICAgICBoYW5kbGVyUXVldWUgPSBbXSwKLSAgICAgICAgICAgIGFyZ3MgPSBz
bGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLSAgICAgICAgICAgIGhhbmRsZXJzID0gKCBkYXRhX3By
aXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKLSAg
ICAgICAgICAgIHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8
IHt9OwotCi0gICAgICAgIC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhh
biB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50Ci0gICAgICAgIGFyZ3NbMF0gPSBldmVudDsK
LSAgICAgICAgZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOwotCi0gICAgICAgIC8vIENhbGwg
dGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWls
IGlmIGRlc2lyZWQKLSAgICAgICAgaWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwu
cHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgaGFuZGxlcnMKLSAg
ICAgICAgaGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2
ZW50LCBoYW5kbGVycyApOwotCi0gICAgICAgIC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkg
bWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCi0gICAgICAgIGkgPSAwOwot
ICAgICAgICB3aGlsZSAoIChtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSkgJiYgIWV2ZW50
LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7Ci0gICAgICAgICAgICBldmVudC5jdXJyZW50VGFy
Z2V0ID0gbWF0Y2hlZC5lbGVtOwotCi0gICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIHdo
aWxlICggKGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdKSAmJiAhZXZlbnQuaXNJ
bW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKLQotICAgICAgICAgICAgICAgIC8vIFRy
aWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IKLSAgICAg
ICAgICAgICAgICAvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0
aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS4KLSAg
ICAgICAgICAgICAgICBpZiAoICFldmVudC5uYW1lc3BhY2VfcmUgfHwgZXZlbnQubmFtZXNwYWNl
X3JlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKLQotICAgICAgICAgICAgICAgICAg
ICBldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50
LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICByZXQgPSAoIChq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8
fCBoYW5kbGVPYmouaGFuZGxlciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5
KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoZXZlbnQucmVz
dWx0ID0gcmV0KSA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZl
bnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5z
dG9wUHJvcGFnYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5
cGUKLSAgICAgICAgaWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHsKLSAgICAgICAgICAgIHNw
ZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7Ci0gICAgICAgIH0KLQotICAg
ICAgICByZXR1cm4gZXZlbnQucmVzdWx0OwotICAgIH0sCi0KLSAgICBoYW5kbGVyczogZnVuY3Rp
b24oIGV2ZW50LCBoYW5kbGVycyApIHsKLSAgICAgICAgdmFyIGksIG1hdGNoZXMsIHNlbCwgaGFu
ZGxlT2JqLAotICAgICAgICAgICAgaGFuZGxlclF1ZXVlID0gW10sCi0gICAgICAgICAgICBkZWxl
Z2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKLSAgICAgICAgICAgIGN1ciA9IGV2
ZW50LnRhcmdldDsKLQotICAgICAgICAvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzCi0gICAgICAg
IC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICgjMTMxODApCi0gICAgICAg
IC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKQotICAg
ICAgICBpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICghZXZlbnQuYnV0dG9u
IHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgewotCi0gICAgICAgICAgICBmb3IgKCA7IGN1
ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKLQotICAgICAgICAg
ICAgICAgIC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkx
MSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQotICAgICAgICAgICAgICAgIGlmICggY3VyLmRpc2Fi
bGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIG1hdGNoZXMgPSBbXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkg
PCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVP
YmogPSBoYW5kbGVyc1sgaSBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBj
b25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKQotICAgICAg
ICAgICAgICAgICAgICAgICAgc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwotCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmou
bmVlZHNDb250ZXh0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCBz
ZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPj0gMCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1h
dGNoZXNbIHNlbCBdICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVz
aCggaGFuZGxlT2JqICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBtYXRjaGVzLmxlbmd0aCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5k
bGVyczogbWF0Y2hlcyB9KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgcmVtYWlu
aW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKLSAgICAgICAgaWYgKCBkZWxlZ2F0ZUNvdW50
IDwgaGFuZGxlcnMubGVuZ3RoICkgewotICAgICAgICAgICAgaGFuZGxlclF1ZXVlLnB1c2goeyBl
bGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsK
LSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYW5kbGVyUXVldWU7Ci0gICAgfSwKLQotICAg
IC8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3Vz
ZUV2ZW50Ci0gICAgcHJvcHM6ICJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3Vy
cmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJn
ZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksCi0KLSAgICBmaXhIb29rczoge30s
Ci0KLSAgICBrZXlIb29rczogewotICAgICAgICBwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtl
eUNvZGUiLnNwbGl0KCIgIiksCi0gICAgICAgIGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmln
aW5hbCApIHsKLQotICAgICAgICAgICAgLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCi0gICAg
ICAgICAgICBpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgZXZl
bnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUg
OiBvcmlnaW5hbC5rZXlDb2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4g
ZXZlbnQ7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgbW91c2VIb29rczogewotICAgICAgICBw
cm9wczogImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFn
ZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSwKLSAgICAgICAg
ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgewotICAgICAgICAgICAgdmFyIGV2
ZW50RG9jLCBkb2MsIGJvZHksCi0gICAgICAgICAgICAgICAgYnV0dG9uID0gb3JpZ2luYWwuYnV0
dG9uOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBj
bGllbnRYL1kgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwg
JiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGV2ZW50RG9j
ID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7Ci0gICAgICAgICAgICAg
ICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OwotICAgICAgICAgICAgICAgIGJvZHkg
PSBldmVudERvYy5ib2R5OwotCi0gICAgICAgICAgICAgICAgZXZlbnQucGFnZVggPSBvcmlnaW5h
bC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9s
bExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNs
aWVudExlZnQgfHwgMCApOwotICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwu
Y2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxU
b3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGll
bnRUb3AgIHx8IDAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHdoaWNo
IGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodAotICAgICAg
ICAgICAgLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQK
LSAgICAgICAgICAgIGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkg
ewotICAgICAgICAgICAgICAgIGV2ZW50LndoaWNoID0gKCBidXR0b24gJiAxID8gMSA6ICggYnV0
dG9uICYgMiA/IDMgOiAoIGJ1dHRvbiAmIDQgPyAyIDogMCApICkgKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGZp
eDogZnVuY3Rpb24oIGV2ZW50ICkgewotICAgICAgICBpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5k
byBdICkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxp
emUgc29tZSBwcm9wZXJ0aWVzCi0gICAgICAgIHZhciBpLCBwcm9wLCBjb3B5LAotICAgICAgICAg
ICAgdHlwZSA9IGV2ZW50LnR5cGUsCi0gICAgICAgICAgICBvcmlnaW5hbEV2ZW50ID0gZXZlbnQs
Ci0gICAgICAgICAgICBmaXhIb29rID0gdGhpcy5maXhIb29rc1sgdHlwZSBdOwotCi0gICAgICAg
IGlmICggIWZpeEhvb2sgKSB7Ci0gICAgICAgICAgICB0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBm
aXhIb29rID0KLSAgICAgICAgICAgICAgICBybW91c2VFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlz
Lm1vdXNlSG9va3MgOgotICAgICAgICAgICAgICAgIHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0
aGlzLmtleUhvb2tzIDoKLSAgICAgICAgICAgICAgICB7fTsKLSAgICAgICAgfQotICAgICAgICBj
b3B5ID0gZml4SG9vay5wcm9wcyA/IHRoaXMucHJvcHMuY29uY2F0KCBmaXhIb29rLnByb3BzICkg
OiB0aGlzLnByb3BzOwotCi0gICAgICAgIGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2lu
YWxFdmVudCApOwotCi0gICAgICAgIGkgPSBjb3B5Lmxlbmd0aDsKLSAgICAgICAgd2hpbGUgKCBp
LS0gKSB7Ci0gICAgICAgICAgICBwcm9wID0gY29weVsgaSBdOwotICAgICAgICAgICAgZXZlbnRb
IHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpCi0gICAgICAgIC8vIEFsbCBl
dmVudHMgc2hvdWxkIGhhdmUgYSB0YXJnZXQ7IENvcmRvdmEgZGV2aWNlcmVhZHkgZG9lc24ndAot
ICAgICAgICBpZiAoICFldmVudC50YXJnZXQgKSB7Ci0gICAgICAgICAgICBldmVudC50YXJnZXQg
PSBkb2N1bWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjAr
LCBDaHJvbWUgPCAyOAotICAgICAgICAvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9k
ZSAoIzUwNCwgIzEzMTQzKQotICAgICAgICBpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0g
MyApIHsKLSAgICAgICAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2Rl
OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5m
aWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKLSAgICB9LAotCi0gICAgc3Bl
Y2lhbDogewotICAgICAgICBsb2FkOiB7Ci0gICAgICAgICAgICAvLyBQcmV2ZW50IHRyaWdnZXJl
ZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkCi0gICAgICAg
ICAgICBub0J1YmJsZTogdHJ1ZQotICAgICAgICB9LAotICAgICAgICBmb2N1czogewotICAgICAg
ICAgICAgLy8gRmlyZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1
ZW5jZSBpcyBjb3JyZWN0Ci0gICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1
cyApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAg
ICAgICAgICAgIGRlbGVnYXRlVHlwZTogImZvY3VzaW4iCi0gICAgICAgIH0sCi0gICAgICAgIGJs
dXI6IHsKLSAgICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAg
IGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHRoaXMuYmx1cigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGRl
bGVnYXRlVHlwZTogImZvY3Vzb3V0IgotICAgICAgICB9LAotICAgICAgICBjbGljazogewotICAg
ICAgICAgICAgLy8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0
YXRlIHdpbGwgYmUgcmlnaHQKLSAgICAgICAgICAgIHRyaWdnZXI6IGZ1bmN0aW9uKCkgewotICAg
ICAgICAgICAgICAgIGlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sg
JiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQiICkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHRoaXMuY2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0KLSAgICAgICAgICAgIC8vIEZvciBjcm9z
cy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5r
cwotICAgICAgICAgICAgX2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsICJhIiApOwotICAgICAg
ICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIGJlZm9yZXVubG9hZDogewotICAgICAgICAg
ICAgcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0KLSAgICAgICAgICAgICAgICAv
LyBTdXBwb3J0OiBGaXJlZm94IDIwKwotICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lc24n
dCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KLSAgICAgICAgICAg
ICAgICBpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAg
ICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0KLSAgICBz
aW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7Ci0gICAgICAg
IC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9u
ZS4KLSAgICAgICAgLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFBy
b3BhZ2F0aW9uLCBidXQgaWYgdGhlCi0gICAgICAgIC8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50
cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgotICAgICAgICB2YXIg
ZSA9IGpRdWVyeS5leHRlbmQoCi0gICAgICAgICAgICBuZXcgalF1ZXJ5LkV2ZW50KCksCi0gICAg
ICAgICAgICBldmVudCwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlOiB0eXBl
LAotICAgICAgICAgICAgICAgIGlzU2ltdWxhdGVkOiB0cnVlLAotICAgICAgICAgICAgICAgIG9y
aWdpbmFsRXZlbnQ6IHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmICgg
YnViYmxlICkgewotICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVs
ZW0gKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpRdWVyeS5ldmVudC5kaXNwYXRj
aC5jYWxsKCBlbGVtLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBlLmlzRGVmYXVsdFBy
ZXZlbnRlZCgpICkgewotICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAg
ICAgfQotICAgIH0KLX07Ci0KLWpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0
eXBlLCBoYW5kbGUgKSB7Ci0gICAgaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7Ci0g
ICAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApOwot
ICAgIH0KLX07Ci0KLWpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewotICAg
IC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAotICAgIGlm
ICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKLSAgICAgICAgcmV0dXJuIG5l
dyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBFdmVudCBvYmpl
Y3QKLSAgICBpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKLSAgICAgICAgdGhpcy5vcmlnaW5hbEV2
ZW50ID0gc3JjOwotICAgICAgICB0aGlzLnR5cGUgPSBzcmMudHlwZTsKLQotICAgICAgICAvLyBF
dmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHBy
ZXZlbnRlZAotICAgICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVm
bGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KLSAgICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQg
PSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fAotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IEFu
ZHJvaWQgPCA0LjAKLSAgICAgICAgICAgICAgICBzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5k
ZWZpbmVkICYmCi0gICAgICAgICAgICAgICAgc3JjLmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5n
ZXRQcmV2ZW50RGVmYXVsdCgpID8KLSAgICAgICAgICAgIHJldHVyblRydWUgOgotICAgICAgICAg
ICAgcmV0dXJuRmFsc2U7Ci0KLSAgICAvLyBFdmVudCB0eXBlCi0gICAgfSBlbHNlIHsKLSAgICAg
ICAgdGhpcy50eXBlID0gc3JjOwotICAgIH0KLQotICAgIC8vIFB1dCBleHBsaWNpdGx5IHByb3Zp
ZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0Ci0gICAgaWYgKCBwcm9wcyApIHsK
LSAgICAgICAgalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKLSAgICB9Ci0KLSAgICAvLyBD
cmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQotICAg
IHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwot
Ci0gICAgLy8gTWFyayBpdCBhcyBmaXhlZAotICAgIHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0
cnVlOwotfTsKLQotLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNw
ZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi0vLyBodHRwOi8vd3d3
LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlw
dC1iaW5kaW5nLmh0bWwKLWpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Ci0gICAgaXNEZWZhdWx0
UHJldmVudGVkOiByZXR1cm5GYWxzZSwKLSAgICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJu
RmFsc2UsCi0gICAgaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAot
Ci0gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgZSA9IHRoaXMu
b3JpZ2luYWxFdmVudDsKLQotICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVy
blRydWU7Ci0KLSAgICAgICAgaWYgKCBlICYmIGUucHJldmVudERlZmF1bHQgKSB7Ci0gICAgICAg
ICAgICBlLnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHN0b3BQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50
OwotCi0gICAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwotCi0g
ICAgICAgIGlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHsKLSAgICAgICAgICAgIGUuc3Rv
cFByb3BhZ2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHN0b3BJbW1lZGlhdGVQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlv
blN0b3BwZWQgPSByZXR1cm5UcnVlOwotICAgICAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwot
ICAgIH0KLX07Ci0KLS8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3Vz
ZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwotLy8gU3VwcG9ydDogQ2hyb21lIDE1Kwot
alF1ZXJ5LmVhY2goewotICAgIG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAotICAgIG1vdXNlbGVh
dmU6ICJtb3VzZW91dCIKLX0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7Ci0gICAgalF1ZXJ5LmV2
ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKLSAgICAgICAgZGVsZWdhdGVUeXBlOiBmaXgsCi0gICAg
ICAgIGJpbmRUeXBlOiBmaXgsCi0KLSAgICAgICAgaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7
Ci0gICAgICAgICAgICB2YXIgcmV0LAotICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMsCi0g
ICAgICAgICAgICAgICAgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCi0gICAgICAgICAg
ICAgICAgaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwotCi0gICAgICAgICAgICAvLyBGb3Ig
bW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRo
ZSB0YXJnZXQuCi0gICAgICAgICAgICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91
c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdwotICAgICAgICAgICAgaWYgKCAhcmVs
YXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwg
cmVsYXRlZCApKSApIHsKLSAgICAgICAgICAgICAgICBldmVudC50eXBlID0gaGFuZGxlT2JqLm9y
aWdUeXBlOwotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0
aGlzLCBhcmd1bWVudHMgKTsKLSAgICAgICAgICAgICAgICBldmVudC50eXBlID0gZml4OwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH07Ci19
KTsKLQotLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCi0vLyBTdXBw
b3J0OiBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaQotaWYgKCAhc3VwcG9ydC5mb2N1c2luQnViYmxl
cyApIHsKLSAgICBqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291
dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKLQotICAgICAgICAvLyBBdHRhY2ggYSBzaW5n
bGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMg
Zm9jdXNpbi9mb2N1c291dAotICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCAp
IHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFy
Z2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7Ci0gICAgICAgICAgICB9Owot
Ci0gICAgICAgIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKLSAgICAgICAgICAgIHNl
dHVwOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICB2YXIgZG9jID0gdGhpcy5vd25lckRv
Y3VtZW50IHx8IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaGVzID0gZGF0YV9wcml2
LmFjY2VzcyggZG9jLCBmaXggKTsKLQotICAgICAgICAgICAgICAgIGlmICggIWF0dGFjaGVzICkg
ewotICAgICAgICAgICAgICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxl
ciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYXRhX3ByaXYu
YWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7Ci0gICAgICAgICAgICB9
LAotICAgICAgICAgICAgdGVhcmRvd246IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIHZh
ciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAg
YXR0YWNoZXMgPSBkYXRhX3ByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTsKLQotICAgICAgICAg
ICAgICAgIGlmICggIWF0dGFjaGVzICkgewotICAgICAgICAgICAgICAgICAgICBkb2MucmVtb3Zl
RXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwotICAgICAgICAgICAgICAgICAg
ICBkYXRhX3ByaXYucmVtb3ZlKCBkb2MsIGZpeCApOwotCi0gICAgICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFj
aGVzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAg
IH0pOwotfQotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLQotICAgIG9uOiBmdW5jdGlvbiggdHlwZXMs
IHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKLSAgICAgICAgdmFyIG9y
aWdGbiwgdHlwZTsKLQotICAgICAgICAvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFu
ZGxlcnMKLSAgICAgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewotICAgICAg
ICAgICAgLy8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkKLSAgICAgICAgICAgIGlm
ICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgICAgICAvLyAo
IHR5cGVzLU9iamVjdCwgZGF0YSApCi0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgfHwgc2Vs
ZWN0b3I7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBmb3IgKCB0eXBlIGluIHR5cGVzICkgewotICAgICAgICAgICAgICAg
IHRoaXMub24oIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHsKLSAgICAgICAgICAgIC8vICgg
dHlwZXMsIGZuICkKLSAgICAgICAgICAgIGZuID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICBkYXRh
ID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGZuID09IG51bGwg
KSB7Ci0gICAgICAgICAgICBpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKLSAgICAgICAgICAgICAg
ICBmbiA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDsKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gKCB0eXBlcywgZGF0YSwgZm4gKQotICAg
ICAgICAgICAgICAgIGZuID0gZGF0YTsKLSAgICAgICAgICAgICAgICBkYXRhID0gc2VsZWN0b3I7
Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICBmbiA9
IHJldHVybkZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCAhZm4gKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb25lID09PSAxICkgewotICAg
ICAgICAgICAgb3JpZ0ZuID0gZm47Ci0gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKCBldmVudCAp
IHsKLSAgICAgICAgICAgICAgICAvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQg
Y29udGFpbnMgdGhlIGluZm8KLSAgICAgICAgICAgICAgICBqUXVlcnkoKS5vZmYoIGV2ZW50ICk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7
Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIg
Y2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KLSAgICAgICAgICAgIGZuLmd1aWQgPSBvcmlnRm4uZ3Vp
ZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOwotICAgICAgICB9Ci0gICAgICAg
IHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgalF1ZXJ5LmV2ZW50
LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOwotICAgICAgICB9KTsKLSAg
ICB9LAotICAgIG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7Ci0g
ICAgICAgIHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Ci0g
ICAgfSwKLSAgICBvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgewotICAgICAg
ICB2YXIgaGFuZGxlT2JqLCB0eXBlOwotICAgICAgICBpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZl
bnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHsKLSAgICAgICAgICAgIC8vICggZXZlbnQg
KSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnQKLSAgICAgICAgICAgIGhhbmRsZU9iaiA9IHR5cGVz
LmhhbmRsZU9iajsKLSAgICAgICAgICAgIGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5v
ZmYoCi0gICAgICAgICAgICAgICAgaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmln
VHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUsCi0g
ICAgICAgICAgICAgICAgaGFuZGxlT2JqLnNlbGVjdG9yLAotICAgICAgICAgICAgICAgIGhhbmRs
ZU9iai5oYW5kbGVyCi0gICAgICAgICAgICApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewotICAg
ICAgICAgICAgLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKLSAgICAgICAgICAgIGZv
ciAoIHR5cGUgaW4gdHlwZXMgKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vZmYoIHR5cGUsIHNl
bGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0
eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7Ci0gICAgICAgICAgICAvLyAoIHR5cGVz
IFssIGZuXSApCi0gICAgICAgICAgICBmbiA9IHNlbGVjdG9yOwotICAgICAgICAgICAgc2VsZWN0
b3IgPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBmbiA9PT0gZmFsc2UgKSB7
Ci0gICAgICAgICAgICBmbiA9IHJldHVybkZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBqUXVlcnkuZXZlbnQucmVtb3Zl
KCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7Ci0gICAgICAgIH0pOwotICAgIH0sCi0KLSAg
ICB0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBl
LCBkYXRhLCB0aGlzICk7Ci0gICAgICAgIH0pOwotICAgIH0sCi0gICAgdHJpZ2dlckhhbmRsZXI6
IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewotICAgICAgICB2YXIgZWxlbSA9IHRoaXNbMF07Ci0g
ICAgICAgIGlmICggZWxlbSApIHsKLSAgICAgICAgICAgIHJldHVybiBqUXVlcnkuZXZlbnQudHJp
Z2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApOwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0K
LQotdmFyCi0gICAgcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5w
dXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKLSAgICBydGFnTmFtZSA9
IC88KFtcdzpdKykvLAotICAgIHJodG1sID0gLzx8JiM/XHcrOy8sCi0gICAgcm5vSW5uZXJodG1s
ID0gLzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSwKLSAgICAvLyBjaGVja2VkPSJjaGVja2VkIiBv
ciBjaGVja2VkCi0gICAgcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2Vk
LikvaSwKLSAgICByc2NyaXB0VHlwZSA9IC9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwKLSAg
ICByc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVwvKC4qKS8sCi0gICAgcmNsZWFuU2NyaXB0ID0g
L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLAotCi0gICAgLy8gV2Ug
aGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMCkKLSAgICB3
cmFwTWFwID0gewotCi0gICAgICAgIC8vIFN1cHBvcnQ6IElFIDkKLSAgICAgICAgb3B0aW9uOiBb
IDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKLQotICAg
ICAgICB0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKLSAgICAgICAgY29sOiBb
IDIsICI8dGFibGU+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAotICAgICAg
ICB0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKLSAgICAg
ICAgdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4i
IF0sCi0KLSAgICAgICAgX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0KLSAgICB9OwotCi0vLyBTdXBw
b3J0OiBJRSA5Ci13cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Ci0KLXdyYXBNYXAu
dGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlv
biA9IHdyYXBNYXAudGhlYWQ7Ci13cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKLQotLy8gU3VwcG9y
dDogMS54IGNvbXBhdGliaWxpdHkKLS8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0
Ym9keQotZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkgewotICAg
IHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJ0YWJsZSIgKSAmJgotICAgICAgICBqUXVl
cnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQu
Zmlyc3RDaGlsZCwgInRyIiApID8KLQotICAgICAgICBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJ0Ym9keSIpWzBdIHx8Ci0gICAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVy
RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSApIDoKLSAgICAgICAgZWxlbTsKLX0KLQot
Ly8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMg
Zm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgotZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSAp
IHsKLSAgICBlbGVtLnR5cGUgPSAoZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSAhPT0gbnVsbCkg
KyAiLyIgKyBlbGVtLnR5cGU7Ci0gICAgcmV0dXJuIGVsZW07Ci19Ci1mdW5jdGlvbiByZXN0b3Jl
U2NyaXB0KCBlbGVtICkgewotICAgIHZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMo
IGVsZW0udHlwZSApOwotCi0gICAgaWYgKCBtYXRjaCApIHsKLSAgICAgICAgZWxlbS50eXBlID0g
bWF0Y2hbIDEgXTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSgi
dHlwZSIpOwotICAgIH0KLQotICAgIHJldHVybiBlbGVtOwotfQotCi0vLyBNYXJrIHNjcmlwdHMg
YXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQKLWZ1bmN0aW9uIHNldEdsb2JhbEV2YWwo
IGVsZW1zLCByZWZFbGVtZW50cyApIHsKLSAgICB2YXIgaSA9IDAsCi0gICAgICAgIGwgPSBlbGVt
cy5sZW5ndGg7Ci0KLSAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgIGRhdGFfcHJp
di5zZXQoCi0gICAgICAgICAgICBlbGVtc1sgaSBdLCAiZ2xvYmFsRXZhbCIsICFyZWZFbGVtZW50
cyB8fCBkYXRhX3ByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCAiZ2xvYmFsRXZhbCIgKQotICAg
ICAgICApOwotICAgIH0KLX0KLQotZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCAp
IHsKLSAgICB2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRh
dGFDdXIsIGV2ZW50czsKLQotICAgIGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMs
IGhhbmRsZXJzLCBldGMuCi0gICAgaWYgKCBkYXRhX3ByaXYuaGFzRGF0YSggc3JjICkgKSB7Ci0g
ICAgICAgIHBkYXRhT2xkID0gZGF0YV9wcml2LmFjY2Vzcyggc3JjICk7Ci0gICAgICAgIHBkYXRh
Q3VyID0gZGF0YV9wcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTsKLSAgICAgICAgZXZlbnRzID0g
cGRhdGFPbGQuZXZlbnRzOwotCi0gICAgICAgIGlmICggZXZlbnRzICkgewotICAgICAgICAgICAg
ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKLSAgICAgICAgICAgIHBkYXRhQ3VyLmV2ZW50cyA9IHt9
OwotCi0gICAgICAgICAgICBmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKLSAgICAgICAgICAgICAg
ICBmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsK
LSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRz
WyB0eXBlIF1bIGkgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIC8vIDIuIENvcHkgdXNlciBkYXRhCi0gICAgaWYgKCBkYXRhX3Vz
ZXIuaGFzRGF0YSggc3JjICkgKSB7Ci0gICAgICAgIHVkYXRhT2xkID0gZGF0YV91c2VyLmFjY2Vz
cyggc3JjICk7Ci0gICAgICAgIHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xk
ICk7Ci0KLSAgICAgICAgZGF0YV91c2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTsKLSAgICB9Ci19
Ci0KLWZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkgewotICAgIHZhciByZXQgPSBjb250
ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgg
dGFnIHx8ICIqIiApIDoKLSAgICAgICAgICAgIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCA/IGNv
bnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoKLSAgICAgICAgICAgIFtdOwot
Ci0gICAgcmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUo
IGNvbnRleHQsIHRhZyApID8KLSAgICAgICAgalF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0
ICkgOgotICAgICAgICByZXQ7Ci19Ci0KLS8vIFN1cHBvcnQ6IElFID49IDkKLWZ1bmN0aW9uIGZp
eElucHV0KCBzcmMsIGRlc3QgKSB7Ci0gICAgdmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50
b0xvd2VyQ2FzZSgpOwotCi0gICAgLy8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0
ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uCi0gICAgaWYgKCBub2RlTmFt
ZSA9PT0gImlucHV0IiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgewotICAg
ICAgICBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKLQotICAgIC8vIEZhaWxzIHRvIHJldHVy
biB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4g
Y2xvbmluZyBvcHRpb25zCi0gICAgfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwg
bm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7Ci0gICAgICAgIGRlc3QuZGVmYXVsdFZhbHVlID0g
c3JjLmRlZmF1bHRWYWx1ZTsKLSAgICB9Ci19Ci0KLWpRdWVyeS5leHRlbmQoewotICAgIGNsb25l
OiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0g
ICAgICAgIHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLAotICAgICAgICAgICAg
Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAotICAgICAgICAgICAgaW5QYWdlID0galF1
ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKLQotICAgICAgICAvLyBT
dXBwb3J0OiBJRSA+PSA5Ci0gICAgICAgIC8vIEZpeCBDbG9uaW5nIGlzc3VlcwotICAgICAgICBp
ZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBl
bGVtLm5vZGVUeXBlID09PSAxMSApICYmCi0gICAgICAgICAgICAgICAgIWpRdWVyeS5pc1hNTERv
YyggZWxlbSApICkgewotCi0gICAgICAgICAgICAvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9y
IHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUv
MgotICAgICAgICAgICAgZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwotICAgICAgICAg
ICAgc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKLQotICAgICAgICAgICAgZm9yICggaSA9
IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgZml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0
aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCi0gICAgICAgIGlmICggZGF0YUFuZEV2ZW50cyApIHsK
LSAgICAgICAgICAgIGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgICAgICAgICAg
c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTsKLSAgICAgICAgICAg
ICAgICBkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwotCi0g
ICAgICAgICAgICAgICAgZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50
c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25l
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmVzZXJ2ZSBzY3Jp
cHQgZXZhbHVhdGlvbiBoaXN0b3J5Ci0gICAgICAgIGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xv
bmUsICJzY3JpcHQiICk7Ci0gICAgICAgIGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7
Ci0gICAgICAgICAgICBzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0
QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0sCi0KLSAgICBidWls
ZEZyYWdtZW50OiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiAp
IHsKLSAgICAgICAgdmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaiwKLSAgICAg
ICAgICAgIGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCi0gICAg
ICAgICAgICBub2RlcyA9IFtdLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAgICBsID0g
ZWxlbXMubGVuZ3RoOwotCi0gICAgICAgIGZvciAoIDsgaSA8IGw7IGkrKyApIHsKLSAgICAgICAg
ICAgIGVsZW0gPSBlbGVtc1sgaSBdOwotCi0gICAgICAgICAgICBpZiAoIGVsZW0gfHwgZWxlbSA9
PT0gMCApIHsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCBub2RlcyBkaXJlY3RseQotICAgICAg
ICAgICAgICAgIGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gIm9iamVjdCIgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAgICAgICAgICAgICAg
IC8vIGpRdWVyeS5tZXJnZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MK
LSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/
IFsgZWxlbSBdIDogZWxlbSApOwotCi0gICAgICAgICAgICAgICAgLy8gQ29udmVydCBub24taHRt
bCBpbnRvIGEgdGV4dCBub2RlCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIXJodG1sLnRl
c3QoIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaCggY29udGV4dC5j
cmVhdGVUZXh0Tm9kZSggZWxlbSApICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGh0
bWwgaW50byBET00gbm9kZXMKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgICAgICB0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRl
RWxlbWVudCgiZGl2IikgKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBEZXNlcmlhbGl6ZSBh
IHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRhZyA9ICggcnRh
Z05hbWUuZXhlYyggZWxlbSApIHx8IFsgIiIsICIiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZh
dWx0OwotICAgICAgICAgICAgICAgICAgICB0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgZWxl
bS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICkgKyB3cmFwWyAyIF07Ci0KLSAgICAg
ICAgICAgICAgICAgICAgLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBj
b250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGogPSB3cmFwWyAwIF07Ci0gICAgICAgICAgICAg
ICAgICAgIHdoaWxlICggai0tICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1w
Lmxhc3RDaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAg
IC8vIFN1cHBvcnQ6IFF0V2ViS2l0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGpRdWVyeS5tZXJn
ZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKLSAgICAgICAgICAgICAg
ICAgICAgalF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcgotICAgICAgICAg
ICAgICAgICAgICB0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOwotCi0gICAgICAgICAgICAgICAg
ICAgIC8vIEZpeGVzICMxMjM0NgotICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0OiBXZWJr
aXQsIElFCi0gICAgICAgICAgICAgICAgICAgIHRtcC50ZXh0Q29udGVudCA9ICIiOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92
ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnQKLSAgICAgICAgZnJhZ21lbnQudGV4dENvbnRlbnQgPSAi
IjsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKCAoZWxlbSA9IG5vZGVzWyBpKysg
XSkgKSB7Ci0KLSAgICAgICAgICAgIC8vICM0MDg3IC0gSWYgb3JpZ2luIGFuZCBkZXN0aW5hdGlv
biBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGFuZCB0aGlzIGlzCi0gICAgICAgICAgICAvLyB0aGF0
IGVsZW1lbnQsIGRvIG5vdCBkbyBhbnl0aGluZwotICAgICAgICAgICAgaWYgKCBzZWxlY3Rpb24g
JiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9PSAtMSApIHsKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGFpbnMg
PSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwotCi0gICAgICAg
ICAgICAvLyBBcHBlbmQgdG8gZnJhZ21lbnQKLSAgICAgICAgICAgIHRtcCA9IGdldEFsbCggZnJh
Z21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgInNjcmlwdCIgKTsKLQotICAgICAgICAgICAgLy8g
UHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeQotICAgICAgICAgICAgaWYgKCBjb250
YWlucyApIHsKLSAgICAgICAgICAgICAgICBzZXRHbG9iYWxFdmFsKCB0bXAgKTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FwdHVyZSBleGVjdXRhYmxlcwotICAgICAgICAgICAg
aWYgKCBzY3JpcHRzICkgewotICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAg
IHdoaWxlICggKGVsZW0gPSB0bXBbIGorKyBdKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgIiIgKSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHNjcmlwdHMucHVzaCggZWxlbSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIGZyYWdtZW50OwotICAgIH0sCi0KLSAgICBjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyAp
IHsKLSAgICAgICAgdmFyIGRhdGEsIGVsZW0sIGV2ZW50cywgdHlwZSwga2V5LCBqLAotICAgICAg
ICAgICAgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAotICAgICAgICAgICAgaSA9IDA7
Ci0KLSAgICAgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkr
KyApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKLSAg
ICAgICAgICAgICAgICBrZXkgPSBlbGVtWyBkYXRhX3ByaXYuZXhwYW5kbyBdOwotCi0gICAgICAg
ICAgICAgICAgaWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHsK
LSAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gT2JqZWN0LmtleXMoIGRhdGEuZXZlbnRzIHx8
IHt9ICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZXZlbnRzLmxlbmd0aCApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyAodHlwZSA9IGV2ZW50c1tqXSkgIT09IHVu
ZGVmaW5lZDsgaisrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3BlY2lh
bFsgdHlwZSBdICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZl
bnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJo
ZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhh
bmRsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAo
IGRhdGFfcHJpdi5jYWNoZVsga2V5IF0gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBE
aXNjYXJkIGFueSByZW1haW5pbmcgYHByaXZhdGVgIGRhdGEKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGRlbGV0ZSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRGlzY2Fy
ZCBhbnkgcmVtYWluaW5nIGB1c2VyYCBkYXRhCi0gICAgICAgICAgICBkZWxldGUgZGF0YV91c2Vy
LmNhY2hlWyBlbGVtWyBkYXRhX3VzZXIuZXhwYW5kbyBdIF07Ci0gICAgICAgIH0KLSAgICB9Ci19
KTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgdGV4dDogZnVuY3Rpb24oIHZhbHVlICkgewot
ICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7Ci0gICAgICAg
ICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5
LnRleHQoIHRoaXMgKSA6Ci0gICAgICAgICAgICAgICAgdGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0
aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1
bWVudHMubGVuZ3RoICk7Ci0gICAgfSwKLQotICAgIGFwcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAg
ICAgIHJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewot
ICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09
IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdl
dCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApOwotICAgICAgICAgICAgICAgIHRh
cmdldC5hcHBlbmRDaGlsZCggZWxlbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAg
ICB9LAotCi0gICAgcHJlcGVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRv
bU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgaWYgKCB0
aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5
cGUgPT09IDkgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRh
cmdldCggdGhpcywgZWxlbSApOwotICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUo
IGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwot
ICAgIH0sCi0KLSAgICBiZWZvcmU6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5k
b21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAgICAgICAgIGlmICgg
dGhpcy5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNl
cnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAg
fSwKLQotICAgIGFmdGVyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZG9tTWFu
aXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXMu
cGFyZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0p
OwotICAgIH0sCi0KLSAgICByZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgLyog
SW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Ci0gICAgICAgIHZhciBlbGVtLAotICAgICAgICAgICAg
ZWxlbXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkgOiB0aGlz
LAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9yICggOyAoZWxlbSA9IGVsZW1zW2ld
KSAhPSBudWxsOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5v
ZGVUeXBlID09PSAxICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoIGdldEFs
bCggZWxlbSApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggZWxlbS5wYXJl
bnROb2RlICkgewotICAgICAgICAgICAgICAgIGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRh
aW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAg
c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAg
fSwKLQotICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIGVsZW0sCi0gICAgICAg
ICAgICBpID0gMDsKLQotICAgICAgICBmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsg
aSsrICkgewotICAgICAgICAgICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCi0gICAg
ICAgICAgICAgICAgLy8gUHJldmVudCBtZW1vcnkgbGVha3MKLSAgICAgICAgICAgICAgICBqUXVl
cnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsKLQotICAgICAgICAgICAgICAg
IC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCi0gICAgICAgICAgICAgICAgZWxlbS50ZXh0
Q29udGVudCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJu
IHRoaXM7Ci0gICAgfSwKLQotICAgIGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVl
cERhdGFBbmRFdmVudHMgKSB7Ci0gICAgICAgIGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRz
ID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7Ci0gICAgICAgIGRlZXBEYXRhQW5kRXZl
bnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0
YUFuZEV2ZW50czsKLQotICAgICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgICByZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0
YUFuZEV2ZW50cyApOwotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgaHRtbDogZnVuY3Rpb24o
IHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUg
KSB7Ci0gICAgICAgICAgICB2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSwKLSAgICAgICAgICAg
ICAgICBpID0gMCwKLSAgICAgICAgICAgICAgICBsID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAgICAg
ICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewot
ICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmlubmVySFRNTDsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNl
IGlubmVySFRNTAotICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYm
ICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJgotICAgICAgICAgICAgICAgICF3cmFwTWFw
WyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNh
c2UoKSBdICkgewotCi0gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0
bWxUYWcsICI8JDE+PC8kMj4iICk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAg
ICAgICAgICAgICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBlbGVtID0gdGhpc1sgaSBdIHx8IHt9OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBS
ZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlubmVySFRNTCA9IHZhbHVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgZWxlbSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB1c2luZyBpbm5l
ckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKLSAgICAg
ICAgICAgICAgICB9IGNhdGNoKCBlICkge30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVl
ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVu
Z3RoICk7Ci0gICAgfSwKLQotICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
dmFyIGFyZyA9IGFyZ3VtZW50c1sgMCBdOwotCi0gICAgICAgIC8vIE1ha2UgdGhlIGNoYW5nZXMs
IHJlcGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudAotICAg
ICAgICB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAg
ICAgICAgYXJnID0gdGhpcy5wYXJlbnROb2RlOwotCi0gICAgICAgICAgICBqUXVlcnkuY2xlYW5E
YXRhKCBnZXRBbGwoIHRoaXMgKSApOwotCi0gICAgICAgICAgICBpZiAoIGFyZyApIHsKLSAgICAg
ICAgICAgICAgICBhcmcucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIEZvcmNlIHJlbW92YWwgaWYgdGhlcmUgd2FzIG5v
IG5ldyBjb250ZW50IChlLmcuLCBmcm9tIGVtcHR5IGFyZ3VtZW50cykKLSAgICAgICAgcmV0dXJu
IGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBhcmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3Zl
KCk7Ci0gICAgfSwKLQotICAgIGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotICAgICAg
ICByZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7Ci0gICAgfSwKLQotICAgIGRv
bU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2sgKSB7Ci0KLSAgICAgICAgLy8gRmxhdHRl
biBhbnkgbmVzdGVkIGFycmF5cwotICAgICAgICBhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJn
cyApOwotCi0gICAgICAgIHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMs
IG5vZGUsIGRvYywKLSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVu
Z3RoLAotICAgICAgICAgICAgc2V0ID0gdGhpcywKLSAgICAgICAgICAgIGlOb0Nsb25lID0gbCAt
IDEsCi0gICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbIDAgXSwKLSAgICAgICAgICAgIGlzRnVuY3Rp
b24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKLQotICAgICAgICAvLyBXZSBjYW4ndCBj
bG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKLSAgICAg
ICAgaWYgKCBpc0Z1bmN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgKCBsID4gMSAmJiB0eXBlb2Yg
dmFsdWUgPT09ICJzdHJpbmciICYmCi0gICAgICAgICAgICAgICAgICAgICFzdXBwb3J0LmNoZWNr
Q2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkgewotICAgICAgICAgICAgcmV0dXJu
IHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHNlbGYg
PSBzZXQuZXEoIGluZGV4ICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9uICkgewot
ICAgICAgICAgICAgICAgICAgICBhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwg
c2VsZi5odG1sKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VsZi5k
b21NYW5pcCggYXJncywgY2FsbGJhY2sgKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCBsICkgewotICAgICAgICAgICAgZnJhZ21lbnQgPSBqUXVlcnkuYnVpbGRG
cmFnbWVudCggYXJncywgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCB0aGlzICk7Ci0g
ICAgICAgICAgICBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0KLSAgICAgICAgICAgIGlm
ICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7Ci0gICAgICAgICAgICAgICAg
ZnJhZ21lbnQgPSBmaXJzdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBmaXJz
dCApIHsKLSAgICAgICAgICAgICAgICBzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFn
bWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOwotICAgICAgICAgICAgICAgIGhhc1Nj
cmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsKLQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgb3Jp
Z2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVj
YXVzZSBpdCBjYW4gZW5kIHVwCi0gICAgICAgICAgICAgICAgLy8gYmVpbmcgZW1wdGllZCBpbmNv
cnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KLSAgICAgICAgICAgICAgICBm
b3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmcmFnbWVu
dDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIGkgIT09IGlOb0Nsb25lICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSAp
OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVk
IHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIGhhc1NjcmlwdHMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VwcG9y
dDogUXRXZWJLaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqUXVlcnkubWVyZ2Ug
YmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQi
ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIHRoaXNbIGkgXSwgbm9kZSwgaSAp
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggaGFzU2NyaXB0cyAp
IHsKLSAgICAgICAgICAgICAgICAgICAgZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAx
IF0ub3duZXJEb2N1bWVudDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBSZWVuYWJsZSBzY3Jp
cHRzCi0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3Jp
cHQgKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlw
dHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZvciAo
IGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAg
bm9kZSA9IHNjcmlwdHNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcnNjcmlw
dFR5cGUudGVzdCggbm9kZS50eXBlIHx8ICIiICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAhZGF0YV9wcml2LmFjY2Vzcyggbm9kZSwgImdsb2JhbEV2YWwiICkgJiYgalF1ZXJ5LmNv
bnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggbm9kZS5zcmMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wdGlv
bmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5Ll9ldmFsVXJsICkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5Ll9ldmFsVXJsKCBu
b2RlLnNyYyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2Ny
aXB0LCAiIiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQot
fSk7Ci0KLWpRdWVyeS5lYWNoKHsKLSAgICBhcHBlbmRUbzogImFwcGVuZCIsCi0gICAgcHJlcGVu
ZFRvOiAicHJlcGVuZCIsCi0gICAgaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKLSAgICBpbnNlcnRB
ZnRlcjogImFmdGVyIiwKLSAgICByZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCi19LCBmdW5jdGlv
biggbmFtZSwgb3JpZ2luYWwgKSB7Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigg
c2VsZWN0b3IgKSB7Ci0gICAgICAgIHZhciBlbGVtcywKLSAgICAgICAgICAgIHJldCA9IFtdLAot
ICAgICAgICAgICAgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAotICAgICAgICAgICAgbGFz
dCA9IGluc2VydC5sZW5ndGggLSAxLAotICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZm9y
ICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKLSAgICAgICAgICAgIGVsZW1zID0gaSA9PT0gbGFzdCA/
IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7Ci0gICAgICAgICAgICBqUXVlcnkoIGluc2VydFsg
aSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7Ci0KLSAgICAgICAgICAgIC8vIFN1cHBvcnQ6IFF0
V2ViS2l0Ci0gICAgICAgICAgICAvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5
bGlrZSkgdGhyb3dzCi0gICAgICAgICAgICBwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApOwotICAg
IH07Ci19KTsKLQotCi12YXIgaWZyYW1lLAotICAgIGVsZW1kaXNwbGF5ID0ge307Ci0KLS8qKgot
ICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudAotICogQHBhcmFtIHtT
dHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnQKLSAqIEBwYXJhbSB7T2JqZWN0fSBk
b2MgRG9jdW1lbnQgb2JqZWN0Ci0gKi8KLS8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1
bHREaXNwbGF5Ci1mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7Ci0gICAgdmFy
IGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9j
LmJvZHkgKSwKLQotICAgICAgICAvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSBy
ZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudAotICAgICAgICBkaXNwbGF5ID0g
d2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlID8KLQotICAgICAgICAgICAgLy8gVXNlIG9m
IHRoaXMgbWV0aG9kIGlzIGEgdGVtcG9yYXJ5IGZpeCAobW9yZSBsaWtlIG9wdG1pemF0aW9uKSB1
bnRpbCBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLAotICAgICAgICAgICAgLy8gc2luY2Ug
aXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVjaWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBG
RgotICAgICAgICAgICAgd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0g
KS5kaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCAiZGlzcGxheSIgKTsKLQotICAgIC8v
IFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LAotICAgIC8vIHNv
IHVzZSAiZGV0YWNoIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVu
dAotICAgIGVsZW0uZGV0YWNoKCk7Ci0KLSAgICByZXR1cm4gZGlzcGxheTsKLX0KLQotLyoqCi0g
KiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVu
dAotICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lCi0gKi8KLWZ1bmN0aW9uIGRlZmF1bHREaXNw
bGF5KCBub2RlTmFtZSApIHsKLSAgICB2YXIgZG9jID0gZG9jdW1lbnQsCi0gICAgICAgIGRpc3Bs
YXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsKLQotICAgIGlmICggIWRpc3BsYXkgKSB7Ci0g
ICAgICAgIGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7Ci0KLSAgICAg
ICAgLy8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1l
Ci0gICAgICAgIGlmICggZGlzcGxheSA9PT0gIm5vbmUiIHx8ICFkaXNwbGF5ICkgewotCi0gICAg
ICAgICAgICAvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGUKLSAg
ICAgICAgICAgIGlmcmFtZSA9IChpZnJhbWUgfHwgalF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRl
cj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVs
ZW1lbnQgKTsKLQotICAgICAgICAgICAgLy8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0
b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlCi0gICAgICAgICAg
ICBkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7Ci0KLSAgICAgICAgICAgIC8vIFN1
cHBvcnQ6IElFCi0gICAgICAgICAgICBkb2Mud3JpdGUoKTsKLSAgICAgICAgICAgIGRvYy5jbG9z
ZSgpOwotCi0gICAgICAgICAgICBkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRv
YyApOwotICAgICAgICAgICAgaWZyYW1lLmRldGFjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5Ci0gICAgICAgIGVsZW1kaXNwbGF5
WyBub2RlTmFtZSBdID0gZGlzcGxheTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGlzcGxheTsKLX0K
LXZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7Ci0KLXZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhw
KCAiXigiICsgcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKTsKLQotdmFyIGdldFN0eWxl
cyA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICByZXR1cm4gZWxlbS5vd25lckRvY3VtZW50
LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKLSAgICB9OwotCi0K
LQotZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHsKLSAgICB2YXIgd2lk
dGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAotICAgICAgICBzdHlsZSA9IGVsZW0uc3R5bGU7
Ci0KLSAgICBjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApOwotCi0gICAg
Ly8gU3VwcG9ydDogSUU5Ci0gICAgLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBm
b3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUgIzEyNTM3Ci0gICAgaWYgKCBjb21wdXRlZCAp
IHsKLSAgICAgICAgcmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNv
bXB1dGVkWyBuYW1lIF07Ci0gICAgfQotCi0gICAgaWYgKCBjb21wdXRlZCApIHsKLQotICAgICAg
ICBpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50
LCBlbGVtICkgKSB7Ci0gICAgICAgICAgICByZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUg
KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1cHBvcnQ6IGlPUyA8IDYKLSAgICAgICAgLy8g
QSB0cmlidXRlIHRvIHRoZSAiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcyIKLSAgICAgICAg
Ly8gaU9TIDwgNiAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0
IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscwotICAgICAg
ICAvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMu
b3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKLSAgICAgICAgaWYgKCBybnVtbm9ucHgu
dGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7Ci0KLSAgICAgICAgICAgIC8v
IFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHdpZHRoID0gc3R5bGUu
d2lkdGg7Ci0gICAgICAgICAgICBtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoOwotICAgICAgICAg
ICAgbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsKLQotICAgICAgICAgICAgLy8gUHV0IGluIHRo
ZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAotICAgICAgICAgICAgc3R5
bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0OwotICAgICAg
ICAgICAgcmV0ID0gY29tcHV0ZWQud2lkdGg7Ci0KLSAgICAgICAgICAgIC8vIFJldmVydCB0aGUg
Y2hhbmdlZCB2YWx1ZXMKLSAgICAgICAgICAgIHN0eWxlLndpZHRoID0gd2lkdGg7Ci0gICAgICAg
ICAgICBzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOwotICAgICAgICAgICAgc3R5bGUubWF4V2lk
dGggPSBtYXhXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQgIT09IHVu
ZGVmaW5lZCA/Ci0gICAgICAgIC8vIFN1cHBvcnQ6IElFCi0gICAgICAgIC8vIElFIHJldHVybnMg
ekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuCi0gICAgICAgIHJldCArICIiIDoKLSAgICAgICAg
cmV0OwotfQotCi0KLWZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiAp
IHsKLSAgICAvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4g
aWYgaXQncyByZWFsbHkgbmVlZGVkLgotICAgIHJldHVybiB7Ci0gICAgICAgIGdldDogZnVuY3Rp
b24oKSB7Ci0gICAgICAgICAgICBpZiAoIGNvbmRpdGlvbkZuKCkgKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVl
IHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0Lgot
ICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBob29rcyBmb3IgbWFy
Z2luUmlnaHQsIHJlbW92ZSB0aGUgd2hvbGUgb2JqZWN0LgotICAgICAgICAgICAgICAgIGRlbGV0
ZSB0aGlzLmdldDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0
IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLgotCi0gICAgICAgICAgICByZXR1cm4gKHRoaXMu
Z2V0ID0gaG9va0ZuKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Ci0gICAgICAgIH0KLSAgICB9
OwotfQotCi0KLShmdW5jdGlvbigpIHsKLSAgICB2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6
aW5nUmVsaWFibGVWYWwsCi0gICAgICAgIC8vIFN1cHBvcnQ6IEZpcmVmb3gsIEFuZHJvaWQgMi4z
IChQcmVmaXhlZCBib3gtc2l6aW5nIHZlcnNpb25zKS4KLSAgICAgICAgZGl2UmVzZXQgPSAicGFk
ZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gtc2l6aW5n
OmNvbnRlbnQtYm94OyIgKwotICAgICAgICAgICAgIi1tb3otYm94LXNpemluZzpjb250ZW50LWJv
eDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IiwKLSAgICAgICAgZG9jRWxlbSA9IGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudCwKLSAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggImRpdiIgKSwKLSAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIg
KTsKLQotICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7Ci0gICAg
ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gIiI7Ci0gICAgc3Vw
cG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250
ZW50LWJveCI7Ci0KLSAgICBjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9ICJib3JkZXI6MDt3aWR0
aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDsiICsKLSAg
ICAgICAgIm1hcmdpbi10b3A6MXB4IjsKLSAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiAp
OwotCi0gICAgLy8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlh
YmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0Ci0gICAgLy8gc28gdGhleSdyZSBleGVj
dXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi4KLSAg
ICBmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkgewot
ICAgICAgICAvLyBTdXBwb3J0OiBGaXJlZm94LCBBbmRyb2lkIDIuMyAoUHJlZml4ZWQgYm94LXNp
emluZyB2ZXJzaW9ucykuCi0gICAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gIi13ZWJraXQtYm94
LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94OyIgKwotICAgICAg
ICAgICAgImJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3Bs
YXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7IiArCi0gICAgICAgICAgICAicG9zaXRp
b246YWJzb2x1dGU7dG9wOjElIjsKLSAgICAgICAgZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFp
bmVyICk7Ci0KLSAgICAgICAgdmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUo
IGRpdiwgbnVsbCApOwotICAgICAgICBwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9
PSAiMSUiOwotICAgICAgICBib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09
PSAiNHB4IjsKLQotICAgICAgICBkb2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLSAg
ICB9Ci0KLSAgICAvLyBVc2Ugd2luZG93LmdldENvbXB1dGVkU3R5bGUgYmVjYXVzZSBqc2RvbSBv
biBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KLSAgICBpZiAoIHdpbmRvdy5nZXRDb21w
dXRlZFN0eWxlICkgewotICAgICAgICBqUXVlcnkuZXh0ZW5kKHN1cHBvcnQsIHsKLSAgICAgICAg
ICAgIHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMg
dGVzdCBpcyBleGVjdXRlZCBvbmx5IG9uY2UgYnV0IHdlIHN0aWxsIGRvIG1lbW9pemluZwotICAg
ICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHBy
ZS1jb21wdXRpbmcuCi0gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUg
dGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC4KLSAgICAgICAgICAgICAgICBjb21w
dXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYm94
U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggYm94U2l6
aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVBp
eGVsUG9zaXRpb25BbmRCb3hTaXppbmdSZWxpYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICByZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7Ci0gICAgICAgICAgICB9
LAotICAgICAgICAgICAgcmVsaWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKLSAgICAgICAgICAgICAgICAvLyBDaGVj
ayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVj
dGx5Ci0gICAgICAgICAgICAgICAgLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQg
b24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpCi0gICAgICAgICAgICAgICAgLy8gV2ViS2l0
IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFy
Z2luLXJpZ2h0Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9u
bHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLgotICAgICAgICAgICAg
ICAgIHZhciByZXQsCi0gICAgICAgICAgICAgICAgICAgIG1hcmdpbkRpdiA9IGRpdi5hcHBlbmRD
aGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApOwotICAgICAgICAgICAgICAg
IG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDsK
LSAgICAgICAgICAgICAgICBtYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSBtYXJnaW5EaXYu
c3R5bGUud2lkdGggPSAiMCI7Ci0gICAgICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gIjFw
eCI7Ci0gICAgICAgICAgICAgICAgZG9jRWxlbS5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7Ci0K
LSAgICAgICAgICAgICAgICByZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5
bGUoIG1hcmdpbkRpdiwgbnVsbCApLm1hcmdpblJpZ2h0ICk7Ci0KLSAgICAgICAgICAgICAgICBk
b2NFbGVtLnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLQotICAgICAgICAgICAgICAgIC8vIENs
ZWFuIHVwIHRoZSBkaXYgZm9yIG90aGVyIHN1cHBvcnQgdGVzdHMuCi0gICAgICAgICAgICAgICAg
ZGl2LmlubmVySFRNTCA9ICIiOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfSkoKTsKLQotCi0vLyBBIG1ldGhvZCBmb3Ig
cXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2Fs
Y3VsYXRpb25zLgotalF1ZXJ5LnN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJh
Y2ssIGFyZ3MgKSB7Ci0gICAgdmFyIHJldCwgbmFtZSwKLSAgICAgICAgb2xkID0ge307Ci0KLSAg
ICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKLSAg
ICBmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0gICAgICAgIG9sZFsgbmFtZSBdID0gZWxlbS5z
dHlsZVsgbmFtZSBdOwotICAgICAgICBlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1l
IF07Ci0gICAgfQotCi0gICAgcmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10g
KTsKLQotICAgIC8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwotICAgIGZvciAoIG5hbWUgaW4gb3B0
aW9ucyApIHsKLSAgICAgICAgZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07Ci0gICAg
fQotCi0gICAgcmV0dXJuIHJldDsKLX07Ci0KLQotdmFyCi0gICAgLy8gc3dhcHBhYmxlIGlmIGRp
c3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxl
LWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKLSAgICAvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2
YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3Bs
YXkKLSAgICByZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCi0gICAg
cm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSguKikkIiwgImkiICksCi0g
ICAgcnJlbE51bSA9IG5ldyBSZWdFeHAoICJeKFsrLV0pPSgiICsgcG51bSArICIpIiwgImkiICks
Ci0KLSAgICBjc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhp
ZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKLSAgICBjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7Ci0g
ICAgICAgIGxldHRlclNwYWNpbmc6IDAsCi0gICAgICAgIGZvbnRXZWlnaHQ6IDQwMAotICAgIH0s
Ci0KLSAgICBjc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJPIiwgIk1veiIsICJtcyIgXTsKLQot
Ly8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBw
cmVmaXhlZCBwcm9wZXJ0eQotZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkg
ewotCi0gICAgLy8gc2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4
ZWQKLSAgICBpZiAoIG5hbWUgaW4gc3R5bGUgKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAg
IH0KLQotICAgIC8vIGNoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXMKLSAgICB2YXIgY2Fw
TmFtZSA9IG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksCi0gICAgICAgIG9y
aWdOYW1lID0gbmFtZSwKLSAgICAgICAgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKLQotICAgIHdo
aWxlICggaS0tICkgewotICAgICAgICBuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7
Ci0gICAgICAgIGlmICggbmFtZSBpbiBzdHlsZSApIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1l
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG9yaWdOYW1lOwotfQotCi1mdW5jdGlv
biBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewotICAgIHZhciBt
YXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7Ci0gICAgcmV0dXJuIG1hdGNoZXMgPwot
ICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCAic3VidHJhY3QiLCBlLmcuLCB3aGVu
IHVzZWQgYXMgaW4gY3NzSG9va3MKLSAgICAgICAgTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAt
ICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgotICAgICAg
ICB2YWx1ZTsKLX0KLQotZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUs
IGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkgewotICAgIHZhciBpID0gZXh0cmEgPT09ICgg
aXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApID8KLSAgICAgICAgLy8gSWYgd2Ug
YWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uCi0g
ICAgICAgIDQgOgotICAgICAgICAvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRh
bCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCi0gICAgICAgIG5hbWUgPT09ICJ3aWR0aCIgPyAxIDog
MCwKLQotICAgICAgICB2YWwgPSAwOwotCi0gICAgZm9yICggOyBpIDwgNDsgaSArPSAyICkgewot
ICAgICAgICAvLyBib3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3
ZSB3YW50IGl0Ci0gICAgICAgIGlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewotICAgICAgICAg
ICAgdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUs
IHN0eWxlcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpc0JvcmRlckJveCApIHsKLSAg
ICAgICAgICAgIC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlm
IHdlIHdhbnQgY29udGVudAotICAgICAgICAgICAgaWYgKCBleHRyYSA9PT0gImNvbnRlbnQiICkg
ewotICAgICAgICAgICAgICAgIHZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBj
c3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyBy
ZW1vdmUgYm9yZGVyCi0gICAgICAgICAgICBpZiAoIGV4dHJhICE9PSAibWFyZ2luIiApIHsKLSAg
ICAgICAgICAgICAgICB2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBh
bmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29u
dGVudCwgc28gYWRkIHBhZGRpbmcKLSAgICAgICAgICAgIHZhbCArPSBqUXVlcnkuY3NzKCBlbGVt
LCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0KLSAgICAgICAg
ICAgIC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNv
IGFkZCBib3JkZXIKLSAgICAgICAgICAgIGlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKLSAg
ICAgICAgICAgICAgICB2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBh
bmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotZnVuY3Rpb24gZ2V0V2lkdGhPckhl
aWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7Ci0KLSAgICAvLyBTdGFydCB3aXRoIG9mZnNldCBw
cm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQotICAg
IHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKLSAgICAgICAgdmFsID0gbmFtZSA9PT0gIndp
ZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKLSAgICAgICAgc3R5
bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCi0gICAgICAgIGlzQm9yZGVyQm94ID0galF1ZXJ5LmNz
cyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3giOwot
Ci0gICAgLy8gc29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZz
ZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkCi0gICAgLy8gc3ZnIC0gaHR0cHM6
Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1Ci0gICAgLy8gTWF0
aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4
Ci0gICAgaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgLy8gRmFsbCBi
YWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5Ci0gICAgICAg
IHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7Ci0gICAgICAgIGlmICggdmFsIDwg
MCB8fCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUg
XTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4g
U3RvcCBoZXJlIGFuZCByZXR1cm4uCi0gICAgICAgIGlmICggcm51bW5vbnB4LnRlc3QodmFsKSAp
IHsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBu
ZWVkIHRoZSBjaGVjayBmb3Igc3R5bGUgaW4gY2FzZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1
bnJlbGlhYmxlIHZhbHVlcwotICAgICAgICAvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRs
eSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCi0gICAgICAgIHZhbHVlSXNC
b3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJgotICAgICAgICAgICAgKCBzdXBwb3J0LmJveFNpemlu
Z1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKLQotICAgICAgICAv
LyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQotICAgICAgICB2YWwg
PSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwOwotICAgIH0KLQotICAgIC8vIHVzZSB0aGUgYWN0aXZl
IGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzCi0gICAg
cmV0dXJuICggdmFsICsKLSAgICAgICAgYXVnbWVudFdpZHRoT3JIZWlnaHQoCi0gICAgICAgICAg
ICBlbGVtLAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIGV4dHJhIHx8ICggaXNCb3Jk
ZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAotICAgICAgICAgICAgdmFsdWVJc0JvcmRl
ckJveCwKLSAgICAgICAgICAgIHN0eWxlcwotICAgICAgICApCi0gICAgKSArICJweCI7Ci19Ci0K
LWZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHsKLSAgICB2YXIgZGlzcGxheSwg
ZWxlbSwgaGlkZGVuLAotICAgICAgICB2YWx1ZXMgPSBbXSwKLSAgICAgICAgaW5kZXggPSAwLAot
ICAgICAgICBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7Ci0KLSAgICBmb3IgKCA7IGluZGV4IDwg
bGVuZ3RoOyBpbmRleCsrICkgewotICAgICAgICBlbGVtID0gZWxlbWVudHNbIGluZGV4IF07Ci0g
ICAgICAgIGlmICggIWVsZW0uc3R5bGUgKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHZhbHVlc1sgaW5kZXggXSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sICJv
bGRkaXNwbGF5IiApOwotICAgICAgICBkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwotICAg
ICAgICBpZiAoIHNob3cgKSB7Ci0gICAgICAgICAgICAvLyBSZXNldCB0aGUgaW5saW5lIGRpc3Bs
YXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCi0gICAgICAgICAgICAvLyBiZWlu
ZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90Ci0gICAgICAgICAgICBpZiAoICF2YWx1
ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewotICAgICAgICAgICAgICAgIGVs
ZW0uc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBT
ZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25l
Ci0gICAgICAgICAgICAvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQg
YnJvd3NlciBzdHlsZSBpcwotICAgICAgICAgICAgLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAotICAg
ICAgICAgICAgaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVt
ICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmFjY2Vz
cyggZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBpZiAoICF2YWx1
ZXNbIGluZGV4IF0gKSB7Ci0gICAgICAgICAgICAgICAgaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0g
KTsKLQotICAgICAgICAgICAgICAgIGlmICggZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIg
fHwgIWhpZGRlbiApIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9wcml2LnNldCggZWxlbSwg
Im9sZGRpc3BsYXkiLCBoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyhlbGVtLCAiZGlzcGxh
eSIpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotCi0gICAgLy8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEg
c2Vjb25kIGxvb3AKLSAgICAvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93Ci0gICAgZm9y
ICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKLSAgICAgICAgZWxlbSA9
IGVsZW1lbnRzWyBpbmRleCBdOwotICAgICAgICBpZiAoICFlbGVtLnN0eWxlICkgewotICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhc2hvdyB8fCBlbGVtLnN0
eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgewot
ICAgICAgICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8
fCAiIiA6ICJub25lIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlbGVtZW50czsK
LX0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tz
IGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0Ci0gICAgLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBh
bmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5Ci0gICAgY3NzSG9va3M6IHsKLSAgICAgICAgb3Bh
Y2l0eTogewotICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKCBjb21wdXRlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
V2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKLSAgICAgICAg
ICAgICAgICAgICAgdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgIm9wYWNpdHkiICk7Ci0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBEb24ndCBh
dXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRp
ZXMKLSAgICBjc3NOdW1iZXI6IHsKLSAgICAgICAgImNvbHVtbkNvdW50IjogdHJ1ZSwKLSAgICAg
ICAgImZpbGxPcGFjaXR5IjogdHJ1ZSwKLSAgICAgICAgImZvbnRXZWlnaHQiOiB0cnVlLAotICAg
ICAgICAibGluZUhlaWdodCI6IHRydWUsCi0gICAgICAgICJvcGFjaXR5IjogdHJ1ZSwKLSAgICAg
ICAgIm9yZGVyIjogdHJ1ZSwKLSAgICAgICAgIm9ycGhhbnMiOiB0cnVlLAotICAgICAgICAid2lk
b3dzIjogdHJ1ZSwKLSAgICAgICAgInpJbmRleCI6IHRydWUsCi0gICAgICAgICJ6b29tIjogdHJ1
ZQotICAgIH0sCi0KLSAgICAvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lz
aCB0byBmaXggYmVmb3JlCi0gICAgLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQotICAg
IGNzc1Byb3BzOiB7Ci0gICAgICAgIC8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKLSAg
ICAgICAgImZsb2F0IjogImNzc0Zsb2F0IgotICAgIH0sCi0KLSAgICAvLyBHZXQgYW5kIHNldCB0
aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQotICAgIHN0eWxlOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgewotICAgICAgICAvLyBEb24ndCBzZXQgc3R5bGVzIG9u
IHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKLSAgICAgICAgaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVU
eXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3
ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKLSAgICAgICAgdmFyIHJldCwgdHlwZSwg
aG9va3MsCi0gICAgICAgICAgICBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwK
LSAgICAgICAgICAgIHN0eWxlID0gZWxlbS5zdHlsZTsKLQotICAgICAgICBuYW1lID0galF1ZXJ5
LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0g
dmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7Ci0KLSAgICAgICAgLy8gZ2V0cyBo
b29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgotICAgICAgICAvLyBmb2xsb3dlZCBieSB0aGUg
dW5wcmVmaXhlZCB2ZXJzaW9uCi0gICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1l
IF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOwotCi0gICAgICAgIC8vIENoZWNrIGlm
IHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQotICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQg
KSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZW9mIHZhbHVlOwotCi0gICAgICAgICAgICAvLyBj
b252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVt
YmVycy4gIzczNDUKLSAgICAgICAgICAgIGlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKHJldCA9
IHJyZWxOdW0uZXhlYyggdmFsdWUgKSkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoIHJl
dFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUg
KSApOwotICAgICAgICAgICAgICAgIC8vIEZpeGVzIGJ1ZyAjOTIzNwotICAgICAgICAgICAgICAg
IHR5cGUgPSAibnVtYmVyIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWFrZSBz
dXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2Ci0gICAg
ICAgICAgICBpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgewotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgYSBu
dW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4g
Q1NTIHByb3BlcnRpZXMpCi0gICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJudW1iZXIiICYmICFq
UXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgewotICAgICAgICAgICAgICAgIHZhbHVlICs9
ICJweCI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpeGVzICM4OTA4LCBpdCBj
YW4gYmUgZG9uZSBtb3JlIGNvcnJlY3RseSBieSBzcGVjaWZ5aW5nIHNldHRlcnMgaW4gY3NzSG9v
a3MsCi0gICAgICAgICAgICAvLyBidXQgaXQgd291bGQgbWVhbiB0byBkZWZpbmUgZWlnaHQgKGZv
ciBldmVyeSBwcm9ibGVtYXRpYyBwcm9wZXJ0eSkgaWRlbnRpY2FsIGZ1bmN0aW9ucwotICAgICAg
ICAgICAgaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5h
bWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7Ci0gICAgICAgICAgICAgICAgc3R5
bGVbIG5hbWUgXSA9ICJpbmhlcml0IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8g
SWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNl
dCB0aGUgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAgICAgICBpZiAoICFob29rcyB8fCAhKCJzZXQi
IGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAh
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSwgU2Fm
YXJpCi0gICAgICAgICAgICAgICAgLy8gU2V0dGluZyBzdHlsZSB0byBibGFuayBzdHJpbmcgcmVx
dWlyZWQgdG8gZGVsZXRlICJzdHlsZTogeCAhaW1wb3J0YW50OyIKLSAgICAgICAgICAgICAgICBz
dHlsZVsgbmFtZSBdID0gIiI7Ci0gICAgICAgICAgICAgICAgc3R5bGVbIG5hbWUgXSA9IHZhbHVl
OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiBh
IGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUK
LSAgICAgICAgICAgIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tz
LmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3
aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKLSAgICAgICAgICAg
IHJldHVybiBzdHlsZVsgbmFtZSBdOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIGNzczogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7Ci0gICAgICAgIHZhciB2YWwsIG51
bSwgaG9va3MsCi0gICAgICAgICAgICBvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUg
KTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJp
Z2h0IG5hbWUKLSAgICAgICAgbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAo
IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxl
LCBvcmlnTmFtZSApICk7Ci0KLSAgICAgICAgLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQg
dmVyc2lvbgotICAgICAgICAvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCi0g
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tz
WyBvcmlnTmFtZSBdOwotCi0gICAgICAgIC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRo
ZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCi0gICAgICAgIGlmICggaG9va3MgJiYgImdldCIg
aW4gaG9va3MgKSB7Ci0gICAgICAgICAgICB2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4
dHJhICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdl
dCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdAotICAgICAgICBpZiAoIHZhbCA9
PT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBz
dHlsZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY29udmVydCAibm9ybWFsIiB0byBjb21w
dXRlZCB2YWx1ZQotICAgICAgICBpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NO
b3JtYWxUcmFuc2Zvcm0gKSB7Ci0gICAgICAgICAgICB2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1b
IG5hbWUgXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiwgY29udmVydGluZyB0byBu
dW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tz
IG51bWVyaWMKLSAgICAgICAgaWYgKCBleHRyYSA9PT0gIiIgfHwgZXh0cmEgKSB7Ci0gICAgICAg
ICAgICBudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsKLSAgICAgICAgICAgIHJldHVybiBleHRyYSA9
PT0gdHJ1ZSB8fCBqUXVlcnkuaXNOdW1lcmljKCBudW0gKSA/IG51bSB8fCAwIDogdmFsOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKFsg
ImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Ci0gICAgalF1ZXJ5LmNz
c0hvb2tzWyBuYW1lIF0gPSB7Ci0gICAgICAgIGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVk
LCBleHRyYSApIHsKLSAgICAgICAgICAgIGlmICggY29tcHV0ZWQgKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZp
c2libHkgc2hvdyB0aGVtCi0gICAgICAgICAgICAgICAgLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZl
IGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXMKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3
YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKSA/Ci0gICAgICAgICAgICAg
ICAgICAgIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRy
YSApOwotICAgICAgICAgICAgICAgICAgICB9KSA6Ci0gICAgICAgICAgICAgICAgICAgIGdldFdp
ZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0sCi0KLSAgICAgICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewotICAg
ICAgICAgICAgdmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApOwotICAgICAg
ICAgICAgcmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgPwotICAg
ICAgICAgICAgICAgIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KAotICAgICAgICAgICAgICAgICAgICBl
bGVtLAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBleHRy
YSwKLSAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZh
bHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3giLAotICAgICAgICAgICAgICAgICAgICBzdHls
ZXMKLSAgICAgICAgICAgICAgICApIDogMAotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAg
IH07Ci19KTsKLQotLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKLWpRdWVyeS5jc3NIb29rcy5tYXJn
aW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LAotICAg
IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKLSAgICAgICAgaWYgKCBjb21wdXRlZCApIHsK
LSAgICAgICAgICAgIC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVy
bnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAotICAgICAgICAgICAgLy8gV29yayBhcm91
bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2Nr
Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5s
aW5lLWJsb2NrIiB9LAotICAgICAgICAgICAgICAgIGN1ckNTUywgWyBlbGVtLCAibWFyZ2luUmln
aHQiIF0gKTsKLSAgICAgICAgfQotICAgIH0KLSk7Ci0KLS8vIFRoZXNlIGhvb2tzIGFyZSB1c2Vk
IGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMKLWpRdWVyeS5lYWNoKHsKLSAgICBtYXJn
aW46ICIiLAotICAgIHBhZGRpbmc6ICIiLAotICAgIGJvcmRlcjogIldpZHRoIgotfSwgZnVuY3Rp
b24oIHByZWZpeCwgc3VmZml4ICkgewotICAgIGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3Vm
Zml4IF0gPSB7Ci0gICAgICAgIGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkgewotICAgICAgICAg
ICAgdmFyIGkgPSAwLAotICAgICAgICAgICAgICAgIGV4cGFuZGVkID0ge30sCi0KLSAgICAgICAg
ICAgICAgICAvLyBhc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKLSAgICAg
ICAgICAgICAgICBwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgPyB2YWx1ZS5zcGxp
dCgiICIpIDogWyB2YWx1ZSBdOwotCi0gICAgICAgICAgICBmb3IgKCA7IGkgPCA0OyBpKysgKSB7
Ci0gICAgICAgICAgICAgICAgZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3Vm
Zml4IF0gPQotICAgICAgICAgICAgICAgICAgICBwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBd
IHx8IHBhcnRzWyAwIF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBleHBh
bmRlZDsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBpZiAoICFybWFyZ2luLnRlc3QoIHByZWZp
eCApICkgewotICAgICAgICBqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9
IHNldFBvc2l0aXZlTnVtYmVyOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLSAg
ICBjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICAgICAgcmV0dXJuIGFjY2Vzcygg
dGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewotICAgICAgICAgICAgdmFyIHN0
eWxlcywgbGVuLAotICAgICAgICAgICAgICAgIG1hcCA9IHt9LAotICAgICAgICAgICAgICAgIGkg
PSAwOwotCi0gICAgICAgICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Ci0gICAg
ICAgICAgICAgICAgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7Ci0gICAgICAgICAgICAgICAg
bGVuID0gbmFtZS5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPCBsZW47IGkr
KyApIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3Mo
IGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwotICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICBqUXVlcnkuc3R5
bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgotICAgICAgICAgICAgICAgIGpRdWVyeS5jc3MoIGVs
ZW0sIG5hbWUgKTsKLSAgICAgICAgfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAx
ICk7Ci0gICAgfSwKLSAgICBzaG93OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNob3dI
aWRlKCB0aGlzLCB0cnVlICk7Ci0gICAgfSwKLSAgICBoaWRlOiBmdW5jdGlvbigpIHsKLSAgICAg
ICAgcmV0dXJuIHNob3dIaWRlKCB0aGlzICk7Ci0gICAgfSwKLSAgICB0b2dnbGU6IGZ1bmN0aW9u
KCBzdGF0ZSApIHsKLSAgICAgICAgaWYgKCB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiApIHsK
LSAgICAgICAgICAgIHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7Ci0g
ICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAg
ICAgICAgaWYgKCBpc0hpZGRlbiggdGhpcyApICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSgg
dGhpcyApLnNob3coKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgalF1
ZXJ5KCB0aGlzICkuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19
KTsKLQotCi1mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcg
KSB7Ci0gICAgcmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywg
cHJvcCwgZW5kLCBlYXNpbmcgKTsKLX0KLWpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwotCi1Ud2Vlbi5w
cm90b3R5cGUgPSB7Ci0gICAgY29uc3RydWN0b3I6IFR3ZWVuLAotICAgIGluaXQ6IGZ1bmN0aW9u
KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHsKLSAgICAgICAgdGhp
cy5lbGVtID0gZWxlbTsKLSAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKLSAgICAgICAgdGhpcy5l
YXNpbmcgPSBlYXNpbmcgfHwgInN3aW5nIjsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9u
czsKLSAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKLSAgICAgICAg
dGhpcy5lbmQgPSBlbmQ7Ci0gICAgICAgIHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3Nz
TnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKLSAgICB9LAotICAgIGN1cjogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07Ci0K
LSAgICAgICAgcmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/Ci0gICAgICAgICAgICBob29rcy5n
ZXQoIHRoaXMgKSA6Ci0gICAgICAgICAgICBUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0
aGlzICk7Ci0gICAgfSwKLSAgICBydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkgewotICAgICAgICB2
YXIgZWFzZWQsCi0gICAgICAgICAgICBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9w
IF07Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7Ci0gICAgICAgICAg
ICB0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgKLSAgICAg
ICAgICAgICAgICBwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAx
LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICB0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDsKLSAgICAgICAgfQotICAg
ICAgICB0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMu
c3RhcnQ7Ci0KLSAgICAgICAgaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKLSAgICAgICAgICAg
IHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgewotICAgICAgICAg
ICAgaG9va3Muc2V0KCB0aGlzICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUd2Vl
bi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgfQotfTsKLQotVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0g
VHdlZW4ucHJvdG90eXBlOwotCi1Ud2Vlbi5wcm9wSG9va3MgPSB7Ci0gICAgX2RlZmF1bHQ6IHsK
LSAgICAgICAgZ2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0
OwotCi0gICAgICAgICAgICBpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYm
Ci0gICAgICAgICAgICAgICAgKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVb
IHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHdlZW4u
ZWxlbVsgdHdlZW4ucHJvcCBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXNz
aW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9t
YXRpY2FsbHkKLSAgICAgICAgICAgIC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFj
ayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMKLSAgICAgICAgICAgIC8vIHNvLCBzaW1w
bGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQuCi0gICAgICAgICAg
ICAvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzICJyb3RhdGUoMXJhZCkiIGFyZSByZXR1cm5lZCBh
cyBpcy4KLSAgICAgICAgICAgIHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVu
LnByb3AsICIiICk7Ci0gICAgICAgICAgICAvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmlu
ZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAuCi0gICAgICAgICAgICByZXR1cm4gIXJl
c3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7Ci0gICAgICAgIH0sCi0gICAg
ICAgIHNldDogZnVuY3Rpb24oIHR3ZWVuICkgewotICAgICAgICAgICAgLy8gdXNlIHN0ZXAgaG9v
ayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxl
IGlmIGl0cwotICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGll
cyB3aGVyZSBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVu
LnByb3AgXSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBd
KCB0d2VlbiApOwotICAgICAgICAgICAgfSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAo
IHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVs
bCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgewotICAgICAgICAgICAgICAg
IGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4u
dW5pdCApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0d2Vlbi5lbGVt
WyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci19OwotCi0vLyBTdXBwb3J0OiBJRTkKLS8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNl
dHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwotCi1Ud2Vlbi5wcm9wSG9va3Muc2Ny
b2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7Ci0gICAgc2V0OiBmdW5jdGlv
biggdHdlZW4gKSB7Ci0gICAgICAgIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5l
bGVtLnBhcmVudE5vZGUgKSB7Ci0gICAgICAgICAgICB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0g
PSB0d2Vlbi5ub3c7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1qUXVlcnkuZWFzaW5nID0gewot
ICAgIGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0sCi0g
ICAgc3dpbmc6IGZ1bmN0aW9uKCBwICkgewotICAgICAgICByZXR1cm4gMC41IC0gTWF0aC5jb3Mo
IHAgKiBNYXRoLlBJICkgLyAyOwotICAgIH0KLX07Ci0KLWpRdWVyeS5meCA9IFR3ZWVuLnByb3Rv
dHlwZS5pbml0OwotCi0vLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludAotalF1ZXJ5
LmZ4LnN0ZXAgPSB7fTsKLQotCi0KLQotdmFyCi0gICAgZnhOb3csIHRpbWVySWQsCi0gICAgcmZ4
dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCi0gICAgcmZ4bnVtID0gbmV3IFJlZ0V4
cCggIl4oPzooWystXSk9fCkoIiArIHBudW0gKyAiKShbYS16JV0qKSQiLCAiaSIgKSwKLSAgICBy
cnVuID0gL3F1ZXVlSG9va3MkLywKLSAgICBhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0
UHJlZmlsdGVyIF0sCi0gICAgdHdlZW5lcnMgPSB7Ci0gICAgICAgICIqIjogWyBmdW5jdGlvbigg
cHJvcCwgdmFsdWUgKSB7Ci0gICAgICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVu
KCBwcm9wLCB2YWx1ZSApLAotICAgICAgICAgICAgICAgIHRhcmdldCA9IHR3ZWVuLmN1cigpLAot
ICAgICAgICAgICAgICAgIHBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbHVlICksCi0gICAgICAgICAg
ICAgICAgdW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBw
cm9wIF0gPyAiIiA6ICJweCIgKSwKLQotICAgICAgICAgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVl
IGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCi0g
ICAgICAgICAgICAgICAgc3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0
ICE9PSAicHgiICYmICt0YXJnZXQgKSAmJgotICAgICAgICAgICAgICAgICAgICByZnhudW0uZXhl
YyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksCi0gICAgICAgICAgICAgICAgc2Nh
bGUgPSAxLAotICAgICAgICAgICAgICAgIG1heEl0ZXJhdGlvbnMgPSAyMDsKLQotICAgICAgICAg
ICAgaWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkgewotICAgICAgICAgICAgICAg
IC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3MKLSAgICAgICAgICAgICAgICB1
bml0ID0gdW5pdCB8fCBzdGFydFsgMyBdOwotCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJl
IHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgotICAgICAgICAgICAgICAg
IHBhcnRzID0gcGFydHMgfHwgW107Ci0KLSAgICAgICAgICAgICAgICAvLyBJdGVyYXRpdmVseSBh
cHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAotICAgICAgICAgICAgICAg
IHN0YXJ0ID0gK3RhcmdldCB8fCAxOwotCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAg
ICAgICAgICAgICAvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVu
dGlsIHdlIGdldCAqc29tZXRoaW5nKgotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYSBzdHJp
bmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxl
IGFzIHVuY2hhbmdlZCBiZWxvdwotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHNjYWxlIHx8
ICIuNSI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGFuZCBhcHBseQotICAgICAg
ICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IC8gc2NhbGU7Ci0gICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0
d2Vlbi5jdXIoKQotICAgICAgICAgICAgICAgIC8vIEFuZCBicmVha2luZyB0aGUgbG9vcCBpZiBz
Y2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdo
Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIo
KSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzCi0gICAgICAg
ICAgICBpZiAoIHBhcnRzICkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHdlZW4uc3RhcnQg
PSArc3RhcnQgfHwgK3RhcmdldCB8fCAwOwotICAgICAgICAgICAgICAgIHR3ZWVuLnVuaXQgPSB1
bml0OwotICAgICAgICAgICAgICAgIC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3
ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIHR3ZWVuLmVu
ZCA9IHBhcnRzWyAxIF0gPwotICAgICAgICAgICAgICAgICAgICBzdGFydCArICggcGFydHNbIDEg
XSArIDEgKSAqIHBhcnRzWyAyIF0gOgotICAgICAgICAgICAgICAgICAgICArcGFydHNbIDIgXTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICB9IF0K
LSAgICB9OwotCi0vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBz
eW5jaHJvbm91c2x5Ci1mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKLSAgICBzZXRUaW1lb3V0KGZ1
bmN0aW9uKCkgewotICAgICAgICBmeE5vdyA9IHVuZGVmaW5lZDsKLSAgICB9KTsKLSAgICByZXR1
cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwotfQotCi0vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJz
IHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgotZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGlu
Y2x1ZGVXaWR0aCApIHsKLSAgICB2YXIgd2hpY2gsCi0gICAgICAgIGkgPSAwLAotICAgICAgICBh
dHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07Ci0KLSAgICAvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBz
dGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCi0gICAgLy8gaWYgd2Ug
ZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFu
ZCBSaWdodAotICAgIGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwOwotICAgIGZv
ciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7Ci0gICAgICAgIHdoaWNoID0g
Y3NzRXhwYW5kWyBpIF07Ci0gICAgICAgIGF0dHJzWyAibWFyZ2luIiArIHdoaWNoIF0gPSBhdHRy
c1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7Ci0gICAgfQotCi0gICAgaWYgKCBpbmNsdWRl
V2lkdGggKSB7Ci0gICAgICAgIGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGF0dHJzOwotfQotCi1mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFs
dWUsIHByb3AsIGFuaW1hdGlvbiApIHsKLSAgICB2YXIgdHdlZW4sCi0gICAgICAgIGNvbGxlY3Rp
b24gPSAoIHR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIHR3ZWVuZXJzWyAiKiIgXSAp
LAotICAgICAgICBpbmRleCA9IDAsCi0gICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3Ro
OwotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7Ci0gICAgICAgIGlmICgg
KHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVl
ICkpICkgewotCi0gICAgICAgICAgICAvLyB3ZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQot
ICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1mdW5jdGlv
biBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHsKLSAgICAvKiBqc2hpbnQg
dmFsaWR0aGlzOiB0cnVlICovCi0gICAgdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBo
b29rcywgb2xkZmlyZSwgZGlzcGxheSwKLSAgICAgICAgYW5pbSA9IHRoaXMsCi0gICAgICAgIG9y
aWcgPSB7fSwKLSAgICAgICAgc3R5bGUgPSBlbGVtLnN0eWxlLAotICAgICAgICBoaWRkZW4gPSBl
bGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCi0gICAgICAgIGRhdGFTaG93ID0gZGF0
YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKLQotICAgIC8vIGhhbmRsZSBxdWV1ZTogZmFs
c2UgcHJvbWlzZXMKLSAgICBpZiAoICFvcHRzLnF1ZXVlICkgewotICAgICAgICBob29rcyA9IGpR
dWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOwotICAgICAgICBpZiAoIGhvb2tzLnVucXVl
dWVkID09IG51bGwgKSB7Ci0gICAgICAgICAgICBob29rcy51bnF1ZXVlZCA9IDA7Ci0gICAgICAg
ICAgICBvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKLSAgICAgICAgICAgIGhvb2tzLmVtcHR5
LmZpcmUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICBpZiAoICFob29rcy51bnF1ZXVl
ZCApIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkZmlyZSgpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgaG9va3MudW5xdWV1ZWQrKzsKLQot
ICAgICAgICBhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIC8vIGRvaW5nIHRo
aXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCi0g
ICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyBjb21wbGV0ZXMKLSAgICAgICAgICAgIGFuaW0uYWx3
YXlzKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGhvb2tzLnVucXVldWVkLS07Ci0gICAg
ICAgICAgICAgICAgaWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCAiZngiICkubGVuZ3RoICkgewot
ICAgICAgICAgICAgICAgICAgICBob29rcy5lbXB0eS5maXJlKCk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIGhlaWdodC93
aWR0aCBvdmVyZmxvdyBwYXNzCi0gICAgaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggImhl
aWdodCIgaW4gcHJvcHMgfHwgIndpZHRoIiBpbiBwcm9wcyApICkgewotICAgICAgICAvLyBNYWtl
IHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKLSAgICAgICAgLy8gUmVjb3JkIGFsbCAzIG92
ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90Ci0gICAgICAgIC8vIGNoYW5n
ZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAotICAgICAgICAvLyBv
dmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQotICAgICAgICBvcHRzLm92ZXJmbG93
ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsK
LQotICAgICAgICAvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhl
aWdodC93aWR0aAotICAgICAgICAvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0
IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkCi0gICAgICAgIGRpc3BsYXkgPSBqUXVl
cnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKLSAgICAgICAgLy8gR2V0IGRlZmF1bHQgZGlzcGxh
eSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSAibm9uZSIKLSAgICAgICAgaWYgKCBkaXNwbGF5ID09
PSAibm9uZSIgKSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXkoIGVsZW0u
bm9kZU5hbWUgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRpc3BsYXkgPT09ICJpbmxpbmUi
ICYmCi0gICAgICAgICAgICAgICAgalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9u
ZSIgKSB7Ci0KLSAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGlmICggb3B0cy5vdmVyZmxvdyApIHsKLSAgICAgICAgc3R5
bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKLSAgICAgICAgYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKLSAgICAg
ICAgICAgIHN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKLSAgICAgICAgICAg
IHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKLSAgICAgICAgfSk7Ci0gICAg
fQotCi0gICAgLy8gc2hvdy9oaWRlIHBhc3MKLSAgICBmb3IgKCBwcm9wIGluIHByb3BzICkgewot
ICAgICAgICB2YWx1ZSA9IHByb3BzWyBwcm9wIF07Ci0gICAgICAgIGlmICggcmZ4dHlwZXMuZXhl
YyggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgcHJvcCBdOwotICAgICAg
ICAgICAgdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKLSAgICAgICAgICAg
IGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ciICkgKSB7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3Bw
ZWQgaGlkZSBvciBzaG93IGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdl
IHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlbgotICAgICAgICAgICAgICAgIGlmICggdmFsdWUg
PT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQg
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYg
ZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7Ci0g
ICAgICAgIGlmICggZGF0YVNob3cgKSB7Ci0gICAgICAgICAgICBpZiAoICJoaWRkZW4iIGluIGRh
dGFTaG93ICkgewotICAgICAgICAgICAgICAgIGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFTaG93ID0gZGF0
YV9wcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHt9ICk7Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyBzdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgp
IHRvICJyZXZlcnNlIgotICAgICAgICBpZiAoIHRvZ2dsZSApIHsKLSAgICAgICAgICAgIGRhdGFT
aG93LmhpZGRlbiA9ICFoaWRkZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBoaWRkZW4gKSB7
Ci0gICAgICAgICAgICBqUXVlcnkoIGVsZW0gKS5zaG93KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBhbmltLmRvbmUoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5
KCBlbGVtICkuaGlkZSgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5p
bS5kb25lKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgdmFyIHByb3A7Ci0KLSAgICAgICAgICAg
IGRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7Ci0gICAgICAgICAgICBmb3IgKCBw
cm9wIGluIG9yaWcgKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9w
LCBvcmlnWyBwcm9wIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZv
ciAoIHByb3AgaW4gb3JpZyApIHsKLSAgICAgICAgICAgIHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhp
ZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7Ci0KLSAgICAgICAgICAg
IGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkgewotICAgICAgICAgICAgICAgIGRhdGFTaG93
WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKLSAgICAgICAgICAgICAgICBpZiAoIGhpZGRlbiApIHsK
LSAgICAgICAgICAgICAgICAgICAgdHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7Ci0gICAgICAgICAg
ICAgICAgICAgIHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVp
Z2h0IiA/IDEgOiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLX0KLQotZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcg
KSB7Ci0gICAgdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKLQotICAgIC8v
IGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzcwotICAgIGZv
ciAoIGluZGV4IGluIHByb3BzICkgewotICAgICAgICBuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSgg
aW5kZXggKTsKLSAgICAgICAgZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwotICAgICAg
ICB2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwotICAgICAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCB2
YWx1ZSApICkgewotICAgICAgICAgICAgZWFzaW5nID0gdmFsdWVbIDEgXTsKLSAgICAgICAgICAg
IHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKLSAgICAgICAgICAgIHByb3BzWyBuYW1lIF0gPSB2
YWx1ZTsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgaW5kZXggXTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07Ci0gICAgICAgIGlmICggaG9v
a3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGhvb2tzLmV4
cGFuZCggdmFsdWUgKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1sgbmFtZSBdOwotCi0gICAg
ICAgICAgICAvLyBub3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29udCBvdmVyd3JpdGUga2V5cyBh
bHJlYWR5IHByZXNlbnQuCi0gICAgICAgICAgICAvLyBhbHNvIC0gcmV1c2luZyAnaW5kZXgnIGZy
b20gYWJvdmUgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgotICAgICAgICAgICAg
Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhKCBpbmRleCBp
biBwcm9wcyApICkgewotICAgICAgICAgICAgICAgICAgICBwcm9wc1sgaW5kZXggXSA9IHZhbHVl
WyBpbmRleCBdOwotICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0g
ZWFzaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKLSAgICAgICAg
fQotICAgIH0KLX0KLQotZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRp
b25zICkgewotICAgIHZhciByZXN1bHQsCi0gICAgICAgIHN0b3BwZWQsCi0gICAgICAgIGluZGV4
ID0gMCwKLSAgICAgICAgbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCi0gICAg
ICAgIGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKLSAg
ICAgICAgICAgIC8vIGRvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3Rvcgot
ICAgICAgICAgICAgZGVsZXRlIHRpY2suZWxlbTsKLSAgICAgICAgfSksCi0gICAgICAgIHRpY2sg
PSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlmICggc3RvcHBlZCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgY3VycmVu
dFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAotICAgICAgICAgICAgICAgIHJlbWFpbmlu
ZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9u
IC0gY3VycmVudFRpbWUgKSwKLSAgICAgICAgICAgICAgICAvLyBhcmNoYWljIGNyYXNoIGJ1ZyB3
b24ndCBhbGxvdyB1cyB0byB1c2UgMSAtICggMC41IHx8IDAgKSAoIzEyNDk3KQotICAgICAgICAg
ICAgICAgIHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKLSAgICAg
ICAgICAgICAgICBwZXJjZW50ID0gMSAtIHRlbXAsCi0gICAgICAgICAgICAgICAgaW5kZXggPSAw
LAotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwotCi0g
ICAgICAgICAgICBmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLSAgICAgICAg
ICAgICAgICBhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1h
dGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pOwotCi0gICAgICAgICAgICBpZiAoIHBlcmNlbnQg
PCAxICYmIGxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlV2l0aCgg
ZWxlbSwgWyBhbmltYXRpb24gXSApOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgYW5pbWF0aW9uID0gZGVmZXJyZWQucHJv
bWlzZSh7Ci0gICAgICAgICAgICBlbGVtOiBlbGVtLAotICAgICAgICAgICAgcHJvcHM6IGpRdWVy
eS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCi0gICAgICAgICAgICBvcHRzOiBqUXVlcnkuZXh0
ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9IH0sIG9wdGlvbnMgKSwKLSAgICAgICAgICAg
IG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcywKLSAgICAgICAgICAgIG9yaWdpbmFsT3B0
aW9uczogb3B0aW9ucywKLSAgICAgICAgICAgIHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhO
b3coKSwKLSAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLAotICAgICAgICAg
ICAgdHdlZW5zOiBbXSwKLSAgICAgICAgICAgIGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwg
ZW5kICkgewotICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwg
YW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1h
dGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcg
KTsKLSAgICAgICAgICAgICAgICBhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIHR3ZWVuOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHN0
b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewotICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDAs
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3
YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVucwotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndp
c2Ugd2Ugc2tpcCB0aGlzIHBhcnQKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gZ290b0Vu
ZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKLSAgICAgICAgICAgICAgICBpZiAoIHN0
b3BwZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBm
b3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLSAgICAgICAgICAgICAgICAgICAg
YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgICAgICAvLyByZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1l
Ci0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZWplY3QKLSAgICAgICAgICAgICAgICBp
ZiAoIGdvdG9FbmQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRo
KCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmlt
YXRpb24sIGdvdG9FbmQgXSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSksCi0gICAgICAgIHByb3BzID0g
YW5pbWF0aW9uLnByb3BzOwotCi0gICAgcHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRz
LnNwZWNpYWxFYXNpbmcgKTsKLQotICAgIGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsr
ICkgewotICAgICAgICByZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwo
IGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7Ci0gICAgICAgIGlmICgg
cmVzdWx0ICkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7Ci0KLSAg
ICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewotICAg
ICAgICBhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKLSAgICB9
Ci0KLSAgICBqUXVlcnkuZngudGltZXIoCi0gICAgICAgIGpRdWVyeS5leHRlbmQoIHRpY2ssIHsK
LSAgICAgICAgICAgIGVsZW06IGVsZW0sCi0gICAgICAgICAgICBhbmltOiBhbmltYXRpb24sCi0g
ICAgICAgICAgICBxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWUKLSAgICAgICAgfSkKLSAgICAp
OwotCi0gICAgLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKLSAgICByZXR1cm4gYW5p
bWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCi0gICAgICAgIC5kb25l
KCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApCi0gICAgICAg
IC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKLSAgICAgICAgLmFsd2F5cyggYW5pbWF0aW9u
Lm9wdHMuYWx3YXlzICk7Ci19Ci0KLWpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBB
bmltYXRpb24sIHsKLQotICAgIHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7
Ci0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7Ci0gICAgICAgICAg
ICBjYWxsYmFjayA9IHByb3BzOwotICAgICAgICAgICAgcHJvcHMgPSBbICIqIiBdOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcHMgPSBwcm9wcy5zcGxpdCgiICIpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdmFyIHByb3AsCi0gICAgICAgICAgICBpbmRleCA9IDAsCi0gICAgICAg
ICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7Ci0KLSAgICAgICAgZm9yICggOyBpbmRleCA8IGxl
bmd0aCA7IGluZGV4KysgKSB7Ci0gICAgICAgICAgICBwcm9wID0gcHJvcHNbIGluZGV4IF07Ci0g
ICAgICAgICAgICB0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKLSAg
ICAgICAgICAgIHR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKLSAgICAgICAg
fQotICAgIH0sCi0KLSAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCAp
IHsKLSAgICAgICAgaWYgKCBwcmVwZW5kICkgewotICAgICAgICAgICAgYW5pbWF0aW9uUHJlZmls
dGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
YW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApOwotICAgICAgICB9Ci0gICAgfQot
fSk7Ci0KLWpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKLSAg
ICB2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5l
eHRlbmQoIHt9LCBzcGVlZCApIDogewotICAgICAgICBjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVh
c2luZyB8fAotICAgICAgICAgICAgalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQs
Ci0gICAgICAgIGR1cmF0aW9uOiBzcGVlZCwKLSAgICAgICAgZWFzaW5nOiBmbiAmJiBlYXNpbmcg
fHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCi0gICAg
fTsKLQotICAgIG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5k
dXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgotICAgICAgICBvcHQuZHVyYXRp
b24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBd
IDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKLQotICAgIC8vIG5vcm1hbGl6ZSBvcHQucXVl
dWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKLSAgICBpZiAoIG9wdC5xdWV1ZSA9PSBu
dWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKLSAgICAgICAgb3B0LnF1ZXVlID0gImZ4IjsK
LSAgICB9Ci0KLSAgICAvLyBRdWV1ZWluZwotICAgIG9wdC5vbGQgPSBvcHQuY29tcGxldGU7Ci0K
LSAgICBvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgaWYgKCBqUXVlcnkuaXNG
dW5jdGlvbiggb3B0Lm9sZCApICkgewotICAgICAgICAgICAgb3B0Lm9sZC5jYWxsKCB0aGlzICk7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9wdC5xdWV1ZSApIHsKLSAgICAgICAgICAgIGpR
dWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAg
ICByZXR1cm4gb3B0OwotfTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgZmFkZVRvOiBmdW5j
dGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewotCi0gICAgICAgIC8vIHNob3cg
YW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMAotICAgICAgICBy
ZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkK
LQotICAgICAgICAgICAgLy8gYW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCi0gICAgICAg
ICAgICAuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxi
YWNrICk7Ci0gICAgfSwKLSAgICBhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2lu
ZywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0
KCBwcm9wICksCi0gICAgICAgICAgICBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNp
bmcsIGNhbGxiYWNrICksCi0gICAgICAgICAgICBkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewot
ICAgICAgICAgICAgICAgIC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3Bl
cnR5IGVhc2luZyB3b24ndCBiZSBsb3N0Ci0gICAgICAgICAgICAgICAgdmFyIGFuaW0gPSBBbmlt
YXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwotCi0gICAg
ICAgICAgICAgICAgLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGlt
bWVkaWF0ZWx5Ci0gICAgICAgICAgICAgICAgaWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0
aGlzLCAiZmluaXNoIiApICkgewotICAgICAgICAgICAgICAgICAgICBhbmltLnN0b3AoIHRydWUg
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZG9Bbmlt
YXRpb24uZmluaXNoID0gZG9BbmltYXRpb247Ci0KLSAgICAgICAgcmV0dXJuIGVtcHR5IHx8IG9w
dGFsbC5xdWV1ZSA9PT0gZmFsc2UgPwotICAgICAgICAgICAgdGhpcy5lYWNoKCBkb0FuaW1hdGlv
biApIDoKLSAgICAgICAgICAgIHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24g
KTsKLSAgICB9LAotICAgIHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5k
ICkgewotICAgICAgICB2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgewotICAgICAg
ICAgICAgdmFyIHN0b3AgPSBob29rcy5zdG9wOwotICAgICAgICAgICAgZGVsZXRlIGhvb2tzLnN0
b3A7Ci0gICAgICAgICAgICBzdG9wKCBnb3RvRW5kICk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAg
aWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICBnb3RvRW5kID0g
Y2xlYXJRdWV1ZTsKLSAgICAgICAgICAgIGNsZWFyUXVldWUgPSB0eXBlOwotICAgICAgICAgICAg
dHlwZSA9IHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGNsZWFyUXVldWUgJiYg
dHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIs
IFtdICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkg
ewotICAgICAgICAgICAgdmFyIGRlcXVldWUgPSB0cnVlLAotICAgICAgICAgICAgICAgIGluZGV4
ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsCi0gICAgICAgICAgICAgICAg
dGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9wcml2
LmdldCggdGhpcyApOwotCi0gICAgICAgICAgICBpZiAoIGluZGV4ICkgewotICAgICAgICAgICAg
ICAgIGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW5kZXggaW4g
ZGF0YSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFb
IGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yICgg
aW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKLSAgICAgICAgICAgICAgICBpZiAo
IHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJz
WyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZXJz
WyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApOwotICAgICAgICAgICAgICAgICAgICBkZXF1
ZXVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVycy5zcGxpY2UoIGluZGV4LCAx
ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBz
dGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2Vk
Ci0gICAgICAgICAgICAvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0
ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQotICAgICAgICAgICAgLy8gYnV0IG9ubHkg
aWYgdGhleSB3ZXJlIGdvdG9FbmQKLSAgICAgICAgICAgIGlmICggZGVxdWV1ZSB8fCAhZ290b0Vu
ZCApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotICAgIGZpbmlzaDogZnVuY3Rpb24oIHR5
cGUgKSB7Ci0gICAgICAgIGlmICggdHlwZSAhPT0gZmFsc2UgKSB7Ci0gICAgICAgICAgICB0eXBl
ID0gdHlwZSB8fCAiZngiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgaW5kZXgsCi0gICAgICAgICAgICAgICAgZGF0YSA9
IGRhdGFfcHJpdi5nZXQoIHRoaXMgKSwKLSAgICAgICAgICAgICAgICBxdWV1ZSA9IGRhdGFbIHR5
cGUgKyAicXVldWUiIF0sCi0gICAgICAgICAgICAgICAgaG9va3MgPSBkYXRhWyB0eXBlICsgInF1
ZXVlSG9va3MiIF0sCi0gICAgICAgICAgICAgICAgdGltZXJzID0galF1ZXJ5LnRpbWVycywKLSAg
ICAgICAgICAgICAgICBsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7Ci0KLSAgICAg
ICAgICAgIC8vIGVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKLSAgICAgICAg
ICAgIGRhdGEuZmluaXNoID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gZW1wdHkgdGhlIHF1ZXVl
IGZpcnN0Ci0gICAgICAgICAgICBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7Ci0KLSAg
ICAgICAgICAgIGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKLSAgICAgICAgICAgICAgICBo
b29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgLy8gbG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW0KLSAg
ICAgICAgICAgIGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNb
IGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVyc1sg
aW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXJzLnNw
bGljZSggaW5kZXgsIDEgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5k
IGZpbmlzaCB0aGVtCi0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3Ro
OyBpbmRleCsrICkgewotICAgICAgICAgICAgICAgIGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVl
dWVbIGluZGV4IF0uZmluaXNoICkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZVsgaW5kZXgg
XS5maW5pc2guY2FsbCggdGhpcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgLy8gdHVybiBvZmYgZmluaXNoaW5nIGZsYWcKLSAgICAgICAgICAgIGRl
bGV0ZSBkYXRhLmZpbmlzaDsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNo
KFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAg
IHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdOwotICAgIGpRdWVyeS5mblsgbmFtZSBdID0g
ZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewotICAgICAgICByZXR1cm4gc3Bl
ZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/Ci0gICAgICAgICAgICBj
c3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgotICAgICAgICAgICAgdGhpcy5hbmltYXRl
KCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwotICAgIH07
Ci19KTsKLQotLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwotalF1
ZXJ5LmVhY2goewotICAgIHNsaWRlRG93bjogZ2VuRngoInNob3ciKSwKLSAgICBzbGlkZVVwOiBn
ZW5GeCgiaGlkZSIpLAotICAgIHNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiksCi0gICAgZmFk
ZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAotICAgIGZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUi
IH0sCi0gICAgZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Ci19LCBmdW5jdGlvbigg
bmFtZSwgcHJvcHMgKSB7Ci0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQs
IGVhc2luZywgY2FsbGJhY2sgKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3Bz
LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwotICAgIH07Ci19KTsKLQotalF1ZXJ5LnRpbWVy
cyA9IFtdOwotalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGltZXIsCi0g
ICAgICAgIGkgPSAwLAotICAgICAgICB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwotCi0gICAgZnhO
b3cgPSBqUXVlcnkubm93KCk7Ci0KLSAgICBmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysg
KSB7Ci0gICAgICAgIHRpbWVyID0gdGltZXJzWyBpIF07Ci0gICAgICAgIC8vIENoZWNrcyB0aGUg
dGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZAotICAgICAgICBpZiAoICF0aW1lcigp
ICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHsKLSAgICAgICAgICAgIHRpbWVycy5zcGxpY2Uo
IGktLSwgMSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhdGltZXJzLmxlbmd0aCAp
IHsKLSAgICAgICAgalF1ZXJ5LmZ4LnN0b3AoKTsKLSAgICB9Ci0gICAgZnhOb3cgPSB1bmRlZmlu
ZWQ7Ci19OwotCi1qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7Ci0gICAgalF1
ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApOwotICAgIGlmICggdGltZXIoKSApIHsKLSAgICAgICAg
alF1ZXJ5LmZ4LnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgalF1ZXJ5LnRpbWVycy5w
b3AoKTsKLSAgICB9Ci19OwotCi1qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKLQotalF1ZXJ5LmZ4
LnN0YXJ0ID0gZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCAhdGltZXJJZCApIHsKLSAgICAgICAgdGlt
ZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7
Ci0gICAgfQotfTsKLQotalF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHsKLSAgICBjbGVhcklu
dGVydmFsKCB0aW1lcklkICk7Ci0gICAgdGltZXJJZCA9IG51bGw7Ci19OwotCi1qUXVlcnkuZngu
c3BlZWRzID0gewotICAgIHNsb3c6IDYwMCwKLSAgICBmYXN0OiAyMDAsCi0gICAgLy8gRGVmYXVs
dCBzcGVlZAotICAgIF9kZWZhdWx0OiA0MDAKLX07Ci0KLQotLy8gQmFzZWQgb2ZmIG9mIHRoZSBw
bHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgotLy8gaHR0cDovL2JsaW5k
c2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwotalF1ZXJ5LmZuLmRl
bGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7Ci0gICAgdGltZSA9IGpRdWVyeS5meCA/IGpR
dWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKLSAgICB0eXBlID0gdHlwZSB8
fCAiZngiOwotCi0gICAgcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBo
b29rcyApIHsKLSAgICAgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7
Ci0gICAgICAgIGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGNsZWFyVGlt
ZW91dCggdGltZW91dCApOwotICAgICAgICB9OwotICAgIH0pOwotfTsKLQotCi0oZnVuY3Rpb24o
KSB7Ci0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAot
ICAgICAgICBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic2VsZWN0IiApLAotICAg
ICAgICBvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJv
cHRpb24iICkgKTsKLQotICAgIGlucHV0LnR5cGUgPSAiY2hlY2tib3giOwotCi0gICAgLy8gU3Vw
cG9ydDogaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zCi0gICAgLy8gQ2hlY2sgdGhl
IGRlZmF1bHQgY2hlY2tib3gvcmFkaW8gdmFsdWUgKCIiIG9uIG9sZCBXZWJLaXQ7ICJvbiIgZWxz
ZXdoZXJlKQotICAgIHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSAiIjsKLQotICAg
IC8vIE11c3QgYWNjZXNzIHRoZSBwYXJlbnQgdG8gbWFrZSBhbiBvcHRpb24gc2VsZWN0IHByb3Bl
cmx5Ci0gICAgLy8gU3VwcG9ydDogSUU5LCBJRTEwCi0gICAgc3VwcG9ydC5vcHRTZWxlY3RlZCA9
IG9wdC5zZWxlY3RlZDsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lk
ZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKLSAgICAvLyAoV2Vi
S2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCi0gICAgc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsK
LSAgICBzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKLQotICAgIC8vIENoZWNr
IGlmIGFuIGlucHV0IG1haW50YWlucyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpbwot
ICAgIC8vIFN1cHBvcnQ6IElFOSwgSUUxMAotICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCggImlucHV0IiApOwotICAgIGlucHV0LnZhbHVlID0gInQiOwotICAgIGlucHV0LnR5cGUg
PSAicmFkaW8iOwotICAgIHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7
Ci19KSgpOwotCi0KLXZhciBub2RlSG9vaywgYm9vbEhvb2ssCi0gICAgYXR0ckhhbmRsZSA9IGpR
dWVyeS5leHByLmF0dHJIYW5kbGU7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotICAgIGF0dHI6IGZ1
bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhpcywgalF1
ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwotICAgIH0sCi0K
LSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBu
YW1lICk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0pOwotCi1qUXVlcnkuZXh0ZW5kKHsKLSAgICBh
dHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBob29rcywg
cmV0LAotICAgICAgICAgICAgblR5cGUgPSBlbGVtLm5vZGVUeXBlOwotCi0gICAgICAgIC8vIGRv
bid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9k
ZXMKLSAgICAgICAgaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBu
VHlwZSA9PT0gMiApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCi0g
ICAgICAgIGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7
Ci0gICAgICAgICAgICByZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlCi0gICAg
ICAgIC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKLSAgICAgICAgaWYg
KCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7Ci0gICAgICAgICAg
ICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgaG9va3MgPSBqUXVlcnku
YXR0ckhvb2tzWyBuYW1lIF0gfHwKLSAgICAgICAgICAgICAgICAoIGpRdWVyeS5leHByLm1hdGNo
LmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewotCi0gICAgICAgICAgICBpZiAo
IHZhbHVlID09PSBudWxsICkgewotICAgICAgICAgICAgICAgIGpRdWVyeS5yZW1vdmVBdHRyKCBl
bGVtLCBuYW1lICk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIGhvb2tzICYmICJzZXQiIGlu
IGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRl
ZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAi
IiApOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICB9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Mu
Z2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsK
LQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0galF1ZXJ5LmZpbmQuYXR0cigg
ZWxlbSwgbmFtZSApOwotCi0gICAgICAgICAgICAvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyBy
ZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAotICAgICAgICAgICAgcmV0dXJu
IHJldCA9PSBudWxsID8KLSAgICAgICAgICAgICAgICB1bmRlZmluZWQgOgotICAgICAgICAgICAg
ICAgIHJldDsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICByZW1vdmVBdHRyOiBmdW5jdGlvbigg
ZWxlbSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciBuYW1lLCBwcm9wTmFtZSwKLSAgICAgICAgICAg
IGkgPSAwLAotICAgICAgICAgICAgYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJu
b3R3aGl0ZSApOwotCi0gICAgICAgIGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09
IDEgKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIChuYW1lID0gYXR0ck5hbWVzW2krK10pICkgewot
ICAgICAgICAgICAgICAgIHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1l
OwotCi0gICAgICAgICAgICAgICAgLy8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRy
ZWF0bWVudCAoIzEwODcwKQotICAgICAgICAgICAgICAgIGlmICggalF1ZXJ5LmV4cHIubWF0Y2gu
Ym9vbC50ZXN0KCBuYW1lICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNldCBjb3JyZXNw
b25kaW5nIHByb3BlcnR5IHRvIGZhbHNlCi0gICAgICAgICAgICAgICAgICAgIGVsZW1bIHByb3BO
YW1lIF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVt
LnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fSwKLQotICAgIGF0dHJIb29rczogewotICAgICAgICB0eXBlOiB7Ci0gICAgICAgICAgICBzZXQ6
IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFzdXBwb3J0
LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKLSAgICAgICAgICAgICAgICAgICAg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7Ci0gICAgICAgICAgICAgICAgICAg
IC8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJl
c2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdmFs
dWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlIGR1cmluZyBjcmVh
dGlvbgotICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gZWxlbS52YWx1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgdmFsdWUgKTsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCB2YWwgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnZh
bHVlID0gdmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci19KTsKLQotLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwotYm9vbEhvb2sg
PSB7Ci0gICAgc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Ci0gICAgICAgIGlm
ICggdmFsdWUgPT09IGZhbHNlICkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGJvb2xlYW4gYXR0
cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQotICAgICAgICAgICAgalF1ZXJ5LnJlbW92ZUF0dHIo
IGVsZW0sIG5hbWUgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uc2V0QXR0
cmlidXRlKCBuYW1lLCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0g
ICAgfQotfTsKLWpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRj
aCggL1x3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotICAgIHZhciBnZXR0ZXIgPSBhdHRy
SGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjsKLQotICAgIGF0dHJIYW5kbGVbIG5h
bWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLSAgICAgICAgdmFyIHJldCwg
aGFuZGxlOwotICAgICAgICBpZiAoICFpc1hNTCApIHsKLSAgICAgICAgICAgIC8vIEF2b2lkIGFu
IGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9t
IHRoZSBnZXR0ZXIKLSAgICAgICAgICAgIGhhbmRsZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTsKLSAg
ICAgICAgICAgIGF0dHJIYW5kbGVbIG5hbWUgXSA9IHJldDsKLSAgICAgICAgICAgIHJldCA9IGdl
dHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBuYW1l
LnRvTG93ZXJDYXNlKCkgOgotICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgICAgICBhdHRy
SGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsK
LSAgICB9OwotfSk7Ci0KLQotCi0KLXZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8
dGV4dGFyZWF8YnV0dG9uKSQvaTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgcHJvcDogZnVu
Y3Rpb24oIG5hbWUsIHZhbHVlICkgewotICAgICAgICByZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVl
cnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Ci0gICAgfSwKLQot
ICAgIHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewotICAgICAgICByZXR1cm4gdGhpcy5l
YWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4
WyBuYW1lIF0gfHwgbmFtZSBdOwotICAgICAgICB9KTsKLSAgICB9Ci19KTsKLQotalF1ZXJ5LmV4
dGVuZCh7Ci0gICAgcHJvcEZpeDogewotICAgICAgICAiZm9yIjogImh0bWxGb3IiLAotICAgICAg
ICAiY2xhc3MiOiAiY2xhc3NOYW1lIgotICAgIH0sCi0KLSAgICBwcm9wOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSwgdmFsdWUgKSB7Ci0gICAgICAgIHZhciByZXQsIGhvb2tzLCBub3R4bWwsCi0gICAg
ICAgICAgICBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7Ci0KLSAgICAgICAgLy8gZG9uJ3QgZ2V0L3Nl
dCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwotICAgICAg
ICBpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAy
ICkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbm90eG1sID0g
blR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwotCi0gICAgICAgIGlmICgg
bm90eG1sICkgewotICAgICAgICAgICAgLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwotICAg
ICAgICAgICAgbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKLSAgICAgICAg
ICAgIGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewotICAgICAgICAgICAgcmV0dXJuIGhvb2tz
ICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1l
ICkpICE9PSB1bmRlZmluZWQgPwotICAgICAgICAgICAgICAgIHJldCA6Ci0gICAgICAgICAgICAg
ICAgKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICByZXR1cm4gaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCgg
ZWxlbSwgbmFtZSApKSAhPT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgcmV0IDoKLSAgICAgICAg
ICAgICAgICBlbGVtWyBuYW1lIF07Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgcHJvcEhvb2tz
OiB7Ci0gICAgICAgIHRhYkluZGV4OiB7Ci0gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVt
ICkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmhhc0F0dHJpYnV0ZSggInRhYmluZGV4
IiApIHx8IHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0uaHJlZiA/Ci0g
ICAgICAgICAgICAgICAgICAgIGVsZW0udGFiSW5kZXggOgotICAgICAgICAgICAgICAgICAgICAt
MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0pOwotCi0vLyBTdXBwb3J0OiBJ
RTkrCi0vLyBTZWxlY3RlZG5lc3MgZm9yIGFuIG9wdGlvbiBpbiBhbiBvcHRncm91cCBjYW4gYmUg
aW5hY2N1cmF0ZQotaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKLSAgICBqUXVlcnkucHJv
cEhvb2tzLnNlbGVjdGVkID0gewotICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAg
ICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKLSAgICAgICAgICAgIGlmICgg
cGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewotICAgICAgICAgICAgICAgIHBhcmVudC5w
YXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH07Ci19Ci0KLWpRdWVyeS5lYWNoKFsKLSAgICAidGFi
SW5kZXgiLAotICAgICJyZWFkT25seSIsCi0gICAgIm1heExlbmd0aCIsCi0gICAgImNlbGxTcGFj
aW5nIiwKLSAgICAiY2VsbFBhZGRpbmciLAotICAgICJyb3dTcGFuIiwKLSAgICAiY29sU3BhbiIs
Ci0gICAgInVzZU1hcCIsCi0gICAgImZyYW1lQm9yZGVyIiwKLSAgICAiY29udGVudEVkaXRhYmxl
IgotXSwgZnVuY3Rpb24oKSB7Ci0gICAgalF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2Uo
KSBdID0gdGhpczsKLX0pOwotCi0KLQotCi12YXIgcmNsYXNzID0gL1tcdFxyXG5cZl0vZzsKLQot
alF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAg
ICAgICAgdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsCi0gICAg
ICAgICAgICBwcm9jZWVkID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiB2YWx1ZSwKLSAg
ICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7Ci0KLSAgICAg
ICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLSAgICAgICAgICAgIHJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0aGlz
ICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKLSAg
ICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwcm9jZWVkICkgewotICAg
ICAgICAgICAgLy8gVGhlIGRpc2p1bmN0aW9uIGhlcmUgaXMgZm9yIGJldHRlciBjb21wcmVzc2li
aWxpdHkgKHNlZSByZW1vdmVDbGFzcykKLSAgICAgICAgICAgIGNsYXNzZXMgPSAoIHZhbHVlIHx8
ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdOwotCi0gICAgICAgICAgICBmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKLSAgICAgICAgICAgICAgICBlbGVtID0gdGhpc1sgaSBdOwotICAgICAg
ICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/
Ci0gICAgICAgICAgICAgICAgICAgICggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBs
YWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAgICAgICAgICAgICAgICAgIiAiCi0gICAgICAgICAg
ICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlmICggY3VyICkgewotICAgICAgICAgICAgICAg
ICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCAoY2xhenogPSBjbGFzc2Vz
W2orK10pICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjdXIuaW5kZXhPZiggIiAi
ICsgY2xhenogKyAiICIgKSA8IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vy
ICs9IGNsYXp6ICsgIiAiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBhc3NpZ24gaWYgZGlmZmVy
ZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgZmlu
YWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBl
bGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVy
biB0aGlzOwotICAgIH0sCi0KLSAgICByZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgewot
ICAgICAgICB2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwKLSAg
ICAgICAgICAgIHByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1
ZSA9PT0gInN0cmluZyIgJiYgdmFsdWUsCi0gICAgICAgICAgICBpID0gMCwKLSAgICAgICAgICAg
IGxlbiA9IHRoaXMubGVuZ3RoOwotCi0gICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZh
bHVlICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewot
ICAgICAgICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0
aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAoIHByb2NlZWQgKSB7Ci0gICAgICAgICAgICBjbGFzc2VzID0gKCB2YWx1ZSB8
fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKLQotICAgICAgICAgICAgZm9yICggOyBp
IDwgbGVuOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgZWxlbSA9IHRoaXNbIGkgXTsKLSAgICAg
ICAgICAgICAgICAvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVyIGNvbXByZXNz
aWJpbGl0eSAoc2VlIGFkZENsYXNzKQotICAgICAgICAgICAgICAgIGN1ciA9IGVsZW0ubm9kZVR5
cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICggIiAi
ICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoKLSAgICAg
ICAgICAgICAgICAgICAgIiIKLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAg
aWYgKCBjdXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAg
ICAgICB3aGlsZSAoIChjbGF6eiA9IGNsYXNzZXNbaisrXSkgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoIGN1ci5pbmRleE9mKCAiICIgKyBjbGF6eiArICIgIiApID49IDAgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLnJlcGxhY2UoICIgIiArIGNsYXp6ICsg
IiAiLCAiICIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0
byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsVmFs
dWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6ICIiOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoIGVsZW0uY2xhc3NOYW1lICE9PSBmaW5hbFZhbHVlICkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgZWxlbS5jbGFzc05hbWUgPSBmaW5hbFZhbHVlOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAg
ICAgcmV0dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFs
dWUsIHN0YXRlVmFsICkgewotICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKLQotICAg
ICAgICBpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iICYmIHR5cGUgPT09ICJzdHJp
bmciICkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRlVmFsID8gdGhpcy5hZGRDbGFzcyggdmFs
dWUgKSA6IHRoaXMucmVtb3ZlQ2xhc3MoIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewotICAgICAgICAgICAgcmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbiggaSApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnkoIHRoaXMgKS50
b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwp
LCBzdGF0ZVZhbCApOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgaWYgKCB0eXBlID09PSAic3Ry
aW5nIiApIHsKLSAgICAgICAgICAgICAgICAvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1l
cwotICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIGkg
PSAwLAotICAgICAgICAgICAgICAgICAgICBzZWxmID0galF1ZXJ5KCB0aGlzICksCi0gICAgICAg
ICAgICAgICAgICAgIGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107
Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysg
XSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVu
LCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoIHNlbGYuaGFz
Q2xhc3MoIGNsYXNzTmFtZSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1v
dmVDbGFzcyggY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVG9nZ2xl
IHdob2xlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT09IHN0cnVu
ZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCB0
aGlzLmNsYXNzTmFtZSApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgY2xhc3NOYW1l
IGlmIHNldAotICAgICAgICAgICAgICAgICAgICBkYXRhX3ByaXYuc2V0KCB0aGlzLCAiX19jbGFz
c05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBw
YXNzZWQgImZhbHNlIiwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUg
Y2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLgotICAgICAg
ICAgICAgICAgIC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5
IHNhdmVkIChpZiBhbnl0aGluZyksCi0gICAgICAgICAgICAgICAgLy8gZmFsbGluZyBiYWNrIHRv
IHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgotICAgICAgICAgICAgICAg
IHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIg
OiBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSwKLQotICAgIGhhc0NsYXNzOiBmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7Ci0gICAgICAgIHZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwK
LSAgICAgICAgICAgIGkgPSAwLAotICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoOwotICAgICAg
ICBmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiAoIHRoaXNbaV0ubm9kZVR5
cGUgPT09IDEgJiYgKCIgIiArIHRoaXNbaV0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFz
cywgIiAiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkgewotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLX0pOwotCi0KLQotCi12YXIgcnJldHVybiA9IC9cci9nOwotCi1qUXVlcnku
Zm4uZXh0ZW5kKHsKLSAgICB2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLSAgICAgICAgdmFyIGhv
b2tzLCByZXQsIGlzRnVuY3Rpb24sCi0gICAgICAgICAgICBlbGVtID0gdGhpc1swXTsKLQotICAg
ICAgICBpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewotICAgICAgICAgICAgaWYgKCBlbGVtICkg
ewotICAgICAgICAgICAgICAgIGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8
fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0gICAg
ICAgICAgICAgICAgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Mu
Z2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0
ID0gZWxlbS52YWx1ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcmV0ID09PSAi
c3RyaW5nIiA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJp
bmcgY2FzZXMKLSAgICAgICAgICAgICAgICAgICAgcmV0LnJlcGxhY2UocnJldHVybiwgIiIpIDoK
LSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwv
dW5kZWYgb3IgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIHJldCA9PSBudWxsID8gIiIgOiBy
ZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKLQotICAgICAg
ICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAgICAgdmFyIHZhbDsK
LQotICAgICAgICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgewotICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBpc0Z1bmN0aW9u
ICkgewotICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSgg
dGhpcyApLnZhbCgpICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZh
bCA9IHZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUcmVhdCBudWxsL3Vu
ZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZwotICAgICAgICAgICAgaWYg
KCB2YWwgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICB2YWwgPSAiIjsKLQotICAgICAgICAg
ICAgfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7Ci0gICAgICAgICAgICAg
ICAgdmFsICs9ICIiOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCBqUXVlcnkuaXNBcnJheSgg
dmFsICkgKSB7Ci0gICAgICAgICAgICAgICAgdmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlv
biggdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8g
IiIgOiB2YWx1ZSArICIiOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5
LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKLQotICAgICAgICAgICAg
Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcK
LSAgICAgICAgICAgIGlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNl
dCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICAg
ICB0aGlzLnZhbHVlID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19
KTsKLQotalF1ZXJ5LmV4dGVuZCh7Ci0gICAgdmFsSG9va3M6IHsKLSAgICAgICAgc2VsZWN0OiB7
Ci0gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewotICAgICAgICAgICAgICAgIHZh
ciB2YWx1ZSwgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZWxlbS5vcHRp
b25zLAotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKLSAg
ICAgICAgICAgICAgICAgICAgb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5k
ZXggPCAwLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCi0g
ICAgICAgICAgICAgICAgICAgIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3Ro
LAotICAgICAgICAgICAgICAgICAgICBpID0gaW5kZXggPCAwID8KLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1heCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbmUgPyBpbmRleCA6IDA7Ci0K
LSAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25z
Ci0gICAgICAgICAgICAgICAgZm9yICggOyBpIDwgbWF4OyBpKysgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJ
RTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSkKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCAp
ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMg
dGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQg
OiBvcHRpb24uZ2V0QXR0cmlidXRlKCAiZGlzYWJsZWQiICkgPT09IG51bGwgKSAmJgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFq
UXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKLQot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhl
IG9wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiAp
LnZhbCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIGFuIGFy
cmF5IGZvciBvbmUgc2VsZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbmUgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNdWx0aS1TZWxlY3Rz
IHJldHVybiBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goIHZh
bHVlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAg
c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIG9wdGlv
blNldCwgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZWxlbS5vcHRpb25z
LAotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSAp
LAotICAgICAgICAgICAgICAgICAgICBpID0gb3B0aW9ucy5sZW5ndGg7Ci0KLSAgICAgICAgICAg
ICAgICB3aGlsZSAoIGktLSApIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9u
c1sgaSBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoIChvcHRpb24uc2VsZWN0ZWQgPSBqUXVl
cnkuaW5BcnJheSggalF1ZXJ5KG9wdGlvbikudmFsKCksIHZhbHVlcyApID49IDApICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgb3B0aW9uU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZvcmNlIGJyb3dz
ZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0
Ci0gICAgICAgICAgICAgICAgaWYgKCAhb3B0aW9uU2V0ICkgewotICAgICAgICAgICAgICAgICAg
ICBlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0p
OwotCi0vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgotalF1ZXJ5LmVhY2go
WyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewotICAgIGpRdWVyeS52YWxIb29r
c1sgdGhpcyBdID0gewotICAgICAgICBzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLSAg
ICAgICAgICAgIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52
YWwoKSwgdmFsdWUgKSA+PSAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Owot
ICAgIGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHsKLSAgICAgICAgalF1ZXJ5LnZhbEhvb2tzWyB0
aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0OiBX
ZWJraXQKLSAgICAgICAgICAgIC8vICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBh
IHZhbHVlIGlzbid0IHNwZWNpZmllZAotICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmli
dXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7Ci0gICAgICAgIH07Ci0g
ICAgfQotfSk7Ci0KLQotCi0KLS8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBp
bmNsdXNpb24KLQotCi1qUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQg
bG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKLSAgICAibW91c2Vk
b3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNl
bGVhdmUgIiArCi0gICAgImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5
dXAgZXJyb3IgY29udGV4dG1lbnUiKS5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsK
LQotICAgIC8vIEhhbmRsZSBldmVudCBiaW5kaW5nCi0gICAgalF1ZXJ5LmZuWyBuYW1lIF0gPSBm
dW5jdGlvbiggZGF0YSwgZm4gKSB7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4g
MCA/Ci0gICAgICAgICAgICB0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDoKLSAgICAg
ICAgICAgIHRoaXMudHJpZ2dlciggbmFtZSApOwotICAgIH07Ci19KTsKLQotalF1ZXJ5LmZuLmV4
dGVuZCh7Ci0gICAgaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewotICAgICAgICBy
ZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92
ZXIgKTsKLSAgICB9LAotCi0gICAgYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsK
LSAgICAgICAgcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOwotICAgIH0s
Ci0gICAgdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewotICAgICAgICByZXR1cm4gdGhp
cy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOwotICAgIH0sCi0KLSAgICBkZWxlZ2F0ZTogZnVuY3Rp
b24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9u
KCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7Ci0gICAgfSwKLSAgICB1bmRlbGVnYXRlOiBm
dW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHsKLSAgICAgICAgLy8gKCBuYW1lc3BhY2Ug
KSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQotICAgICAgICByZXR1cm4gYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5
cGVzLCBzZWxlY3RvciB8fCAiKioiLCBmbiApOwotICAgIH0KLX0pOwotCi0KLXZhciBub25jZSA9
IGpRdWVyeS5ub3coKTsKLQotdmFyIHJxdWVyeSA9ICgvXD8vKTsKLQotCi0KLS8vIFN1cHBvcnQ6
IEFuZHJvaWQgMi4zCi0vLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBp
bnB1dAotalF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgewotICAgIHJldHVybiBK
U09OLnBhcnNlKCBkYXRhICsgIiIgKTsKLX07Ci0KLQotLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFy
c2luZwotalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7Ci0gICAgdmFyIHhtbCwg
dG1wOwotICAgIGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewotICAg
ICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBTdXBwb3J0OiBJRTkKLSAgICB0cnkg
ewotICAgICAgICB0bXAgPSBuZXcgRE9NUGFyc2VyKCk7Ci0gICAgICAgIHhtbCA9IHRtcC5wYXJz
ZUZyb21TdHJpbmcoIGRhdGEsICJ0ZXh0L3htbCIgKTsKLSAgICB9IGNhdGNoICggZSApIHsKLSAg
ICAgICAgeG1sID0gdW5kZWZpbmVkOwotICAgIH0KLQotICAgIGlmICggIXhtbCB8fCB4bWwuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7Ci0gICAgICAgIGpR
dWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwotICAgIH0KLSAgICByZXR1cm4g
eG1sOwotfTsKLQotCi12YXIKLSAgICAvLyBEb2N1bWVudCBsb2NhdGlvbgotICAgIGFqYXhMb2NQ
YXJ0cywKLSAgICBhamF4TG9jYXRpb24sCi0KLSAgICByaGFzaCA9IC8jLiokLywKLSAgICBydHMg
PSAvKFs/Jl0pXz1bXiZdKi8sCi0gICAgcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5d
KikkL21nLAotICAgIC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVj
dGlvbgotICAgIHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8List
ZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCi0gICAgcm5vQ29udGVudCA9IC9eKD86R0VU
fEhFQUQpJC8sCi0gICAgcnByb3RvY29sID0gL15cL1wvLywKLSAgICBydXJsID0gL14oW1x3List
XSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sCi0KLSAg
ICAvKiBQcmVmaWx0ZXJzCi0gICAgICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBj
dXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKLSAgICAg
KiAyKSBUaGVzZSBhcmUgY2FsbGVkOgotICAgICAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0
cmFuc3BvcnQKLSAgICAgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBp
cyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCi0gICAgICogMykga2V5IGlzIHRo
ZSBkYXRhVHlwZQotICAgICAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2Vk
Ci0gICAgICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUg
YW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCi0gICAgICovCi0gICAgcHJl
ZmlsdGVycyA9IHt9LAotCi0gICAgLyogVHJhbnNwb3J0cyBiaW5kaW5ncwotICAgICAqIDEpIGtl
eSBpcyB0aGUgZGF0YVR5cGUKLSAgICAgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4g
YmUgdXNlZAotICAgICAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRh
dGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKLSAgICAgKi8KLSAgICB0cmFuc3Bv
cnRzID0ge30sCi0KLSAgICAvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgj
MTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KLSAgICBhbGxU
eXBlcyA9ICIqLyIuY29uY2F0KCIqIik7Ci0KLS8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhj
ZXB0aW9uIHdoZW4gYWNjZXNzaW5nCi0vLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlm
IGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKLXRyeSB7Ci0gICAgYWpheExvY2F0aW9uID0g
bG9jYXRpb24uaHJlZjsKLX0gY2F0Y2goIGUgKSB7Ci0gICAgLy8gVXNlIHRoZSBocmVmIGF0dHJp
YnV0ZSBvZiBhbiBBIGVsZW1lbnQKLSAgICAvLyBzaW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZl
biBkb2N1bWVudC5sb2NhdGlvbgotICAgIGFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJhIiApOwotICAgIGFqYXhMb2NhdGlvbi5ocmVmID0gIiI7Ci0gICAgYWpheExvY2F0
aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Ci19Ci0KLS8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBw
YXJ0cwotYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2Uo
KSApIHx8IFtdOwotCi0vLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmls
dGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAotZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JU
cmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7Ci0KLSAgICAvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMg
b3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgotICAgIHJldHVybiBmdW5jdGlvbiggZGF0YVR5
cGVFeHByZXNzaW9uLCBmdW5jICkgewotCi0gICAgICAgIGlmICggdHlwZW9mIGRhdGFUeXBlRXhw
cmVzc2lvbiAhPT0gInN0cmluZyIgKSB7Ci0gICAgICAgICAgICBmdW5jID0gZGF0YVR5cGVFeHBy
ZXNzaW9uOwotICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOwotICAgICAgICB9
Ci0KLSAgICAgICAgdmFyIGRhdGFUeXBlLAotICAgICAgICAgICAgaSA9IDAsCi0gICAgICAgICAg
ICBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5v
dHdoaXRlICkgfHwgW107Ci0KLSAgICAgICAgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyAp
ICkgewotICAgICAgICAgICAgLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhw
cmVzc2lvbgotICAgICAgICAgICAgd2hpbGUgKCAoZGF0YVR5cGUgPSBkYXRhVHlwZXNbaSsrXSkg
KSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgICAg
ICAgICBpZiAoIGRhdGFUeXBlWzBdID09PSAiKyIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRh
dGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCAiKiI7Ci0gICAgICAgICAgICAgICAgICAg
IChzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVu
c2hpZnQoIGZ1bmMgKTsKLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhcHBlbmQKLSAg
ICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAoc3RydWN0dXJlWyBk
YXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdKS5wdXNoKCBmdW5jICk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLX0KLQot
Ly8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRz
Ci1mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRp
b25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkgewotCi0gICAgdmFyIGluc3BlY3RlZCA9IHt9
LAotICAgICAgICBzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMg
KTsKLQotICAgIGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkgewotICAgICAgICB2YXIgc2Vs
ZWN0ZWQ7Ci0gICAgICAgIGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7Ci0gICAgICAgIGpR
dWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVm
aWx0ZXJPckZhY3RvcnkgKSB7Ci0gICAgICAgICAgICB2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9
IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApOwot
ICAgICAgICAgICAgaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIg
JiYgIXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBd
ICkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBl
T3JUcmFuc3BvcnQgKTsKLSAgICAgICAgICAgICAgICBpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNw
b3J0ICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNl
IGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISggc2Vs
ZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0p
OwotICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGluc3BlY3Qo
IG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyAiKiIgXSAmJiBpbnNwZWN0
KCAiKiIgKTsKLX0KLQotLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zCi0vLyB0
aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLS8vIEZp
eGVzICM5ODg3Ci1mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHsKLSAgICB2YXIg
a2V5LCBkZWVwLAotICAgICAgICBmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxh
dE9wdGlvbnMgfHwge307Ci0KLSAgICBmb3IgKCBrZXkgaW4gc3JjICkgewotICAgICAgICBpZiAo
IHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgICAgICggZmxhdE9wdGlvbnNb
IGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChkZWVwID0ge30pICkgKVsga2V5IF0gPSBzcmNb
IGtleSBdOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICggZGVlcCApIHsKLSAgICAgICAgalF1
ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRh
cmdldDsKLX0KLQotLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgotICog
LSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBl
IGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKLSAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBy
ZXNwb25zZQotICovCi1mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVz
cG9uc2VzICkgewotCi0gICAgdmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFU
eXBlLAotICAgICAgICBjb250ZW50cyA9IHMuY29udGVudHMsCi0gICAgICAgIGRhdGFUeXBlcyA9
IHMuZGF0YVR5cGVzOwotCi0gICAgLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250
ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3MKLSAgICB3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAi
KiIgKSB7Ci0gICAgICAgIGRhdGFUeXBlcy5zaGlmdCgpOwotICAgICAgICBpZiAoIGN0ID09PSB1
bmRlZmluZWQgKSB7Ci0gICAgICAgICAgICBjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVz
cG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8g
Q2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlCi0gICAgaWYg
KCBjdCApIHsKLSAgICAgICAgZm9yICggdHlwZSBpbiBjb250ZW50cyApIHsKLSAgICAgICAgICAg
IGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7
Ci0gICAgICAgICAgICAgICAgZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENo
ZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlw
ZQotICAgIGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkgewotICAgICAgICBmaW5h
bERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVHJ5
IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwotICAgICAgICBmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyAp
IHsKLSAgICAgICAgICAgIGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlw
ZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewotICAgICAgICAgICAgICAgIGZpbmFsRGF0YVR5
cGUgPSB0eXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKLSAgICAgICAgICAgICAgICBmaXJzdERhdGFU
eXBlID0gdHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBPciBqdXN0
IHVzZSBmaXJzdCBvbmUKLSAgICAgICAgZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwg
Zmlyc3REYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCi0g
ICAgLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKLSAgICAvLyBh
bmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCi0gICAgaWYgKCBmaW5hbERhdGFU
eXBlICkgewotICAgICAgICBpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkg
ewotICAgICAgICAgICAgZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Ci0gICAgfQot
fQotCi0vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdp
bmFsIHJlc3BvbnNlCi0gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUg
anFYSFIgaW5zdGFuY2UKLSAqLwotZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBq
cVhIUiwgaXNTdWNjZXNzICkgewotICAgIHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBw
cmV2LAotICAgICAgICBjb252ZXJ0ZXJzID0ge30sCi0gICAgICAgIC8vIFdvcmsgd2l0aCBhIGNv
cHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNp
b24KLSAgICAgICAgZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTsKLQotICAgIC8vIENy
ZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwotICAgIGlmICggZGF0YVR5
cGVzWyAxIF0gKSB7Ci0gICAgICAgIGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkgewotICAg
ICAgICAgICAgY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNb
IGNvbnYgXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hp
ZnQoKTsKLQotICAgIC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCi0gICAg
d2hpbGUgKCBjdXJyZW50ICkgewotCi0gICAgICAgIGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3Vy
cmVudCBdICkgewotICAgICAgICAgICAganFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQg
XSBdID0gcmVzcG9uc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcHBseSB0aGUgZGF0YUZp
bHRlciBpZiBwcm92aWRlZAotICAgICAgICBpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRh
dGFGaWx0ZXIgKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9u
c2UsIHMuZGF0YVR5cGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXYgPSBjdXJyZW50Owot
ICAgICAgICBjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7Ci0KLSAgICAgICAgaWYgKCBjdXJy
ZW50ICkgewotCi0gICAgICAgIC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQg
ZGF0YVR5cGUgaXMgbm9uLWF1dG8KLSAgICAgICAgICAgIGlmICggY3VycmVudCA9PT0gIioiICkg
ewotCi0gICAgICAgICAgICAgICAgY3VycmVudCA9IHByZXY7Ci0KLSAgICAgICAgICAgIC8vIENv
bnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBm
cm9tIGN1cnJlbnQKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2
ICE9PSBjdXJyZW50ICkgewotCi0gICAgICAgICAgICAgICAgLy8gU2VlayBhIGRpcmVjdCBjb252
ZXJ0ZXIKLSAgICAgICAgICAgICAgICBjb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1
cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOwotCi0gICAgICAgICAgICAg
ICAgLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKLSAgICAgICAgICAgICAgICBpZiAoICFj
b252ICkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkg
ewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQK
LSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGNvbnYyLnNwbGl0KCAiICIgKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNj
ZXB0ZWQgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ID0gY29udmVydGVy
c1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBdIF07Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBjb252ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggY29udiA9PT0gdHJ1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOwotCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUg
ZGF0YVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY29u
dmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGN1cnJlbnQgPSB0bXBbIDAgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKQotICAgICAg
ICAgICAgICAgIGlmICggY29udiAhPT0gdHJ1ZSApIHsKLQotICAgICAgICAgICAgICAgICAgICAv
LyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0
aGVtCi0gICAgICAgICAgICAgICAgICAgIGlmICggY29udiAmJiBzWyAidGhyb3dzIiBdICkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwotICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogInBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYg
PyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgcHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVy
biB7IHN0YXRlOiAic3VjY2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07Ci19Ci0KLWpRdWVyeS5leHRl
bmQoewotCi0gICAgLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBx
dWVyaWVzCi0gICAgYWN0aXZlOiAwLAotCi0gICAgLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2Fj
aGUgZm9yIG5leHQgcmVxdWVzdAotICAgIGxhc3RNb2RpZmllZDoge30sCi0gICAgZXRhZzoge30s
Ci0KLSAgICBhamF4U2V0dGluZ3M6IHsKLSAgICAgICAgdXJsOiBhamF4TG9jYXRpb24sCi0gICAg
ICAgIHR5cGU6ICJHRVQiLAotICAgICAgICBpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBh
amF4TG9jUGFydHNbIDEgXSApLAotICAgICAgICBnbG9iYWw6IHRydWUsCi0gICAgICAgIHByb2Nl
c3NEYXRhOiB0cnVlLAotICAgICAgICBhc3luYzogdHJ1ZSwKLSAgICAgICAgY29udGVudFR5cGU6
ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAotICAg
ICAgICAvKgotICAgICAgICB0aW1lb3V0OiAwLAotICAgICAgICBkYXRhOiBudWxsLAotICAgICAg
ICBkYXRhVHlwZTogbnVsbCwKLSAgICAgICAgdXNlcm5hbWU6IG51bGwsCi0gICAgICAgIHBhc3N3
b3JkOiBudWxsLAotICAgICAgICBjYWNoZTogbnVsbCwKLSAgICAgICAgdGhyb3dzOiBmYWxzZSwK
LSAgICAgICAgdHJhZGl0aW9uYWw6IGZhbHNlLAotICAgICAgICBoZWFkZXJzOiB7fSwKLSAgICAg
ICAgKi8KLQotICAgICAgICBhY2NlcHRzOiB7Ci0gICAgICAgICAgICAiKiI6IGFsbFR5cGVzLAot
ICAgICAgICAgICAgdGV4dDogInRleHQvcGxhaW4iLAotICAgICAgICAgICAgaHRtbDogInRleHQv
aHRtbCIsCi0gICAgICAgICAgICB4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKLSAg
ICAgICAgICAgIGpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCi0gICAg
ICAgIH0sCi0KLSAgICAgICAgY29udGVudHM6IHsKLSAgICAgICAgICAgIHhtbDogL3htbC8sCi0g
ICAgICAgICAgICBodG1sOiAvaHRtbC8sCi0gICAgICAgICAgICBqc29uOiAvanNvbi8KLSAgICAg
ICAgfSwKLQotICAgICAgICByZXNwb25zZUZpZWxkczogewotICAgICAgICAgICAgeG1sOiAicmVz
cG9uc2VYTUwiLAotICAgICAgICAgICAgdGV4dDogInJlc3BvbnNlVGV4dCIsCi0gICAgICAgICAg
ICBqc29uOiAicmVzcG9uc2VKU09OIgotICAgICAgICB9LAotCi0gICAgICAgIC8vIERhdGEgY29u
dmVydGVycwotICAgICAgICAvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioi
KSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQotICAgICAgICBjb252
ZXJ0ZXJzOiB7Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAotICAg
ICAgICAgICAgIiogdGV4dCI6IFN0cmluZywKLQotICAgICAgICAgICAgLy8gVGV4dCB0byBodG1s
ICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCi0gICAgICAgICAgICAidGV4dCBodG1sIjogdHJ1
ZSwKLQotICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgot
ICAgICAgICAgICAgInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCi0KLSAgICAgICAgICAg
IC8vIFBhcnNlIHRleHQgYXMgeG1sCi0gICAgICAgICAgICAidGV4dCB4bWwiOiBqUXVlcnkucGFy
c2VYTUwKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4n
dCBiZSBkZWVwIGV4dGVuZGVkOgotICAgICAgICAvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0
b20gb3B0aW9ucyBoZXJlIGlmCi0gICAgICAgIC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRo
YXQgc2hvdWxkbid0IGJlCi0gICAgICAgIC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5k
KQotICAgICAgICBmbGF0T3B0aW9uczogewotICAgICAgICAgICAgdXJsOiB0cnVlLAotICAgICAg
ICAgICAgY29udGV4dDogdHJ1ZQotICAgICAgICB9Ci0gICAgfSwKLQotICAgIC8vIENyZWF0ZXMg
YSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0Ci0gICAgLy8gd2l0aCBi
b3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgotICAgIC8vIElmIHRhcmdldCBp
cyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCi0gICAgYWpheFNldHVwOiBmdW5j
dGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsKLSAgICAgICAgcmV0dXJuIHNldHRpbmdzID8KLQot
ICAgICAgICAgICAgLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKLSAgICAgICAgICAgIGFq
YXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0
aW5ncyApIDoKLQotICAgICAgICAgICAgLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncwotICAgICAg
ICAgICAgYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Ci0gICAgfSwK
LQotICAgIGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmls
dGVycyApLAotICAgIGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cygg
dHJhbnNwb3J0cyApLAotCi0gICAgLy8gTWFpbiBtZXRob2QKLSAgICBhamF4OiBmdW5jdGlvbigg
dXJsLCBvcHRpb25zICkgewotCi0gICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVs
YXRlIHByZS0xLjUgc2lnbmF0dXJlCi0gICAgICAgIGlmICggdHlwZW9mIHVybCA9PT0gIm9iamVj
dCIgKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0gdXJsOwotICAgICAgICAgICAgdXJsID0gdW5k
ZWZpbmVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBv
YmplY3QKLSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLSAgICAgICAgdmFyIHRy
YW5zcG9ydCwKLSAgICAgICAgICAgIC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KLSAg
ICAgICAgICAgIGNhY2hlVVJMLAotICAgICAgICAgICAgLy8gUmVzcG9uc2UgaGVhZGVycwotICAg
ICAgICAgICAgcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAotICAgICAgICAgICAgcmVzcG9uc2VIZWFk
ZXJzLAotICAgICAgICAgICAgLy8gdGltZW91dCBoYW5kbGUKLSAgICAgICAgICAgIHRpbWVvdXRU
aW1lciwKLSAgICAgICAgICAgIC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFycwotICAgICAg
ICAgICAgcGFydHMsCi0gICAgICAgICAgICAvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJl
IHRvIGJlIGRpc3BhdGNoZWQKLSAgICAgICAgICAgIGZpcmVHbG9iYWxzLAotICAgICAgICAgICAg
Ly8gTG9vcCB2YXJpYWJsZQotICAgICAgICAgICAgaSwKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0
aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKLSAgICAgICAgICAgIHMgPSBqUXVlcnkuYWpheFNldHVw
KCB7fSwgb3B0aW9ucyApLAotICAgICAgICAgICAgLy8gQ2FsbGJhY2tzIGNvbnRleHQKLSAgICAg
ICAgICAgIGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAotICAgICAgICAgICAgLy8g
Q29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBE
T00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgotICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250
ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNr
Q29udGV4dC5qcXVlcnkgKSA/Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCBjYWxsYmFja0NvbnRl
eHQgKSA6Ci0gICAgICAgICAgICAgICAgalF1ZXJ5LmV2ZW50LAotICAgICAgICAgICAgLy8gRGVm
ZXJyZWRzCi0gICAgICAgICAgICBkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLAotICAgICAg
ICAgICAgY29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
Ci0gICAgICAgICAgICAvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwotICAgICAgICAgICAg
c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSwKLSAgICAgICAgICAgIC8vIEhlYWRlcnMg
KHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCi0gICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9
IHt9LAotICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAotICAgICAgICAgICAg
Ly8gVGhlIGpxWEhSIHN0YXRlCi0gICAgICAgICAgICBzdGF0ZSA9IDAsCi0gICAgICAgICAgICAv
LyBEZWZhdWx0IGFib3J0IG1lc3NhZ2UKLSAgICAgICAgICAgIHN0ckFib3J0ID0gImNhbmNlbGVk
IiwKLSAgICAgICAgICAgIC8vIEZha2UgeGhyCi0gICAgICAgICAgICBqcVhIUiA9IHsKLSAgICAg
ICAgICAgICAgICByZWFkeVN0YXRlOiAwLAotCi0gICAgICAgICAgICAgICAgLy8gQnVpbGRzIGhl
YWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVh
ZGVyOiBmdW5jdGlvbigga2V5ICkgewotICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2g7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUgPT09IDIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVzcG9uc2VIZWFkZXJzID0ge307Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKCAobWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSkg
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1sgbWF0
Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggPT0gbnVs
bCA/IG51bGwgOiBtYXRjaDsKLSAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAg
Ly8gUmF3IHN0cmluZwotICAgICAgICAgICAgICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVu
Y3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3Bv
bnNlSGVhZGVyc1N0cmluZyA6IG51bGw7Ci0gICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAg
ICAgICAgIC8vIENhY2hlcyB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgc2V0UmVxdWVzdEhl
YWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewotICAgICAgICAgICAgICAgICAgICB2YXIg
bG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggIXN0
YXRlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFt
ZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAg
ICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlcyByZXNwb25zZSBj
b250ZW50LXR5cGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVu
Y3Rpb24oIHR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggIXN0YXRlICkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgcy5taW1lVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICAgICAg
fSwKLQotICAgICAgICAgICAgICAgIC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0gICAg
ICAgICAgICAgICAgc3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHsKLSAgICAgICAgICAgICAg
ICAgICAgdmFyIGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggbWFwICkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSA8IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZm9yICggY29kZSBpbiBtYXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2
ZXMgb2xkIG9uZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZVsg
Y29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxs
YmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5hbHdheXMoIG1hcFsganFY
SFIuc3RhdHVzIF0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgICAg
ICB9LAotCi0gICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0Ci0gICAgICAgICAg
ICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgewotICAgICAgICAgICAgICAgICAg
ICB2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCB0cmFuc3BvcnQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3Bv
cnQuYWJvcnQoIGZpbmFsVGV4dCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIGRvbmUoIDAsIGZpbmFsVGV4dCApOwotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdGhpczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgIC8v
IEF0dGFjaCBkZWZlcnJlZHMKLSAgICAgICAgZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21w
bGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOwotICAgICAgICBqcVhIUi5zdWNjZXNzID0ganFY
SFIuZG9uZTsKLSAgICAgICAganFYSFIuZXJyb3IgPSBqcVhIUi5mYWlsOwotCi0gICAgICAgIC8v
IFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQotICAg
ICAgICAvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4
cGVjdCBpdCkKLSAgICAgICAgLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2Jq
ZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKLSAgICAgICAgLy8g
V2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCi0gICAgICAgIHMudXJs
ID0gKCAoIHVybCB8fCBzLnVybCB8fCBhamF4TG9jYXRpb24gKSArICIiICkucmVwbGFjZSggcmhh
c2gsICIiICkKLSAgICAgICAgICAgIC5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sg
MSBdICsgIi8vIiApOwotCi0gICAgICAgIC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBh
cyBwZXIgdGlja2V0ICMxMjAwNAotICAgICAgICBzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBv
cHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlOwotCi0gICAgICAgIC8vIEV4dHJhY3Qg
ZGF0YVR5cGVzIGxpc3QKLSAgICAgICAgcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRh
VHlwZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07
Ci0KLSAgICAgICAgLy8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdl
IGhhdmUgYSBwcm90b2NvbDpob3N0OnBvcnQgbWlzbWF0Y2gKLSAgICAgICAgaWYgKCBzLmNyb3Nz
RG9tYWluID09IG51bGwgKSB7Ci0gICAgICAgICAgICBwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwu
dG9Mb3dlckNhc2UoKSApOwotICAgICAgICAgICAgcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAm
JgotICAgICAgICAgICAgICAgICggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwg
cGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwKLSAgICAgICAgICAgICAgICAgICAg
KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/ICI4MCIgOiAiNDQzIiAp
ICkgIT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICgg
YWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyAiODAiIDogIjQ0MyIgKSApICkKLSAgICAg
ICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFs
cmVhZHkgYSBzdHJpbmcKLSAgICAgICAgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0
eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKLSAgICAgICAgICAgIHMuZGF0YSA9IGpRdWVy
eS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBBcHBseSBwcmVmaWx0ZXJzCi0gICAgICAgIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRz
KCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwotCi0gICAgICAgIC8vIElmIHJlcXVl
c3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlCi0gICAgICAgIGlm
ICggc3RhdGUgPT09IDIgKSB7Ci0gICAgICAgICAgICByZXR1cm4ganFYSFI7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tl
ZCB0bwotICAgICAgICBmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOwotCi0gICAgICAgIC8vIFdhdGNo
IGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKLSAgICAgICAgaWYgKCBmaXJlR2xvYmFscyAmJiBq
UXVlcnkuYWN0aXZlKysgPT09IDAgKSB7Ci0gICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dl
cigiYWpheFN0YXJ0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcHBlcmNhc2UgdGhlIHR5
cGUKLSAgICAgICAgcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7Ci0KLSAgICAgICAgLy8g
RGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKLSAgICAgICAgcy5oYXNDb250ZW50ID0g
IXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgVVJMIGlu
IGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCi0gICAgICAgIC8v
IGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgotICAgICAgICBjYWNoZVVSTCA9
IHMudXJsOwotCi0gICAgICAgIC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMg
d2l0aCBubyBjb250ZW50Ci0gICAgICAgIGlmICggIXMuaGFzQ29udGVudCApIHsKLQotICAgICAg
ICAgICAgLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybAotICAgICAg
ICAgICAgaWYgKCBzLmRhdGEgKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVVUkwgPSAoIHMudXJs
ICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOwot
ICAgICAgICAgICAgICAgIC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVz
ZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKLSAgICAgICAgICAgICAgICBkZWxldGUgcy5kYXRhOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYg
bmVlZGVkCi0gICAgICAgICAgICBpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgewotICAgICAgICAg
ICAgICAgIHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPwotCi0gICAgICAgICAgICAgICAg
ICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVl
Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgbm9u
Y2UrKyApIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0
aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlVVJMICsgKCBycXVlcnkudGVzdCggY2Fj
aGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIG5vbmNlKys7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJ
Zi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgotICAgICAgICBpZiAo
IHMuaWZNb2RpZmllZCApIHsKLSAgICAgICAgICAgIGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsg
Y2FjaGVVUkwgXSApIHsKLSAgICAgICAgICAgICAgICBqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAi
SWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkg
ewotICAgICAgICAgICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNo
IiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2Vu
dAotICAgICAgICBpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAh
PT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKLSAgICAgICAgICAgIGpxWEhSLnNl
dFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlICk7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBk
ZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCi0gICAgICAgIGpxWEhSLnNldFJlcXVlc3RIZWFkZXIo
Ci0gICAgICAgICAgICAiQWNjZXB0IiwKLSAgICAgICAgICAgIHMuZGF0YVR5cGVzWyAwIF0gJiYg
cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KLSAgICAgICAgICAgICAgICBzLmFjY2VwdHNb
IHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBh
bGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoKLSAgICAgICAgICAgICAgICBzLmFjY2VwdHNb
ICIqIiBdCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9u
Ci0gICAgICAgIGZvciAoIGkgaW4gcy5oZWFkZXJzICkgewotICAgICAgICAgICAganFYSFIuc2V0
UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKLSAgICAg
ICAgaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250
ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkgewotICAgICAgICAg
ICAgLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCi0gICAgICAgICAgICBy
ZXR1cm4ganFYSFIuYWJvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFib3J0aW5nIGlz
IG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgotICAgICAgICBzdHJBYm9ydCA9ICJhYm9ydCI7Ci0K
LSAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCi0gICAgICAgIGZvciAo
IGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKLSAgICAgICAg
ICAgIGpxWEhSWyBpIF0oIHNbIGkgXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRy
YW5zcG9ydAotICAgICAgICB0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0
cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKLQotICAgICAgICAvLyBJZiBubyB0
cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKLSAgICAgICAgaWYgKCAhdHJhbnNwb3J0ICkgewotICAg
ICAgICAgICAgZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBqcVhIUi5yZWFkeVN0YXRlID0gMTsKLQotICAgICAgICAgICAgLy8gU2VuZCBn
bG9iYWwgZXZlbnQKLSAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAg
ICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIsIHMg
XSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGltZW91dAotICAgICAgICAgICAg
aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgdGltZW91
dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAganFY
SFIuYWJvcnQoInRpbWVvdXQiKTsKLSAgICAgICAgICAgICAgICB9LCBzLnRpbWVvdXQgKTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdGF0ZSA9
IDE7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25l
ICk7Ci0gICAgICAgICAgICB9IGNhdGNoICggZSApIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9w
YWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCi0gICAgICAgICAgICAgICAgaWYg
KCBzdGF0ZSA8IDIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUoIC0xLCBlICk7Ci0gICAg
ICAgICAgICAgICAgLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWxsYmFjayBmb3Igd2hl
biBldmVyeXRoaW5nIGlzIGRvbmUKLSAgICAgICAgZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRp
dmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7Ci0gICAgICAgICAgICB2YXIgaXNT
dWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAotICAgICAgICAgICAg
ICAgIHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OwotCi0gICAgICAgICAgICAvLyBDYWxs
ZWQgb25jZQotICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PT0gMiApIHsKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN0YXRlIGlzICJkb25l
IiBub3cKLSAgICAgICAgICAgIHN0YXRlID0gMjsKLQotICAgICAgICAgICAgLy8gQ2xlYXIgdGlt
ZW91dCBpZiBpdCBleGlzdHMKLSAgICAgICAgICAgIGlmICggdGltZW91dFRpbWVyICkgewotICAg
ICAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFn
ZSBjb2xsZWN0aW9uCi0gICAgICAgICAgICAvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhI
UiBvYmplY3Qgd2lsbCBiZSB1c2VkKQotICAgICAgICAgICAgdHJhbnNwb3J0ID0gdW5kZWZpbmVk
OwotCi0gICAgICAgICAgICAvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzCi0gICAgICAgICAgICBy
ZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwotCi0gICAgICAgICAgICAvLyBT
ZXQgcmVhZHlTdGF0ZQotICAgICAgICAgICAganFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAg
PyA0IDogMDsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWwKLSAgICAg
ICAgICAgIGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1
cyA9PT0gMzA0OwotCi0gICAgICAgICAgICAvLyBHZXQgcmVzcG9uc2UgZGF0YQotICAgICAgICAg
ICAgaWYgKCByZXNwb25zZXMgKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhamF4SGFu
ZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhY
IGZpZWxkcyBhcmUgYWx3YXlzIHNldCkKLSAgICAgICAgICAgIHJlc3BvbnNlID0gYWpheENvbnZl
cnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7Ci0KLSAgICAgICAgICAgIC8vIElm
IHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCi0gICAgICAgICAgICBpZiAoIGlzU3Vj
Y2VzcyApIHsKLQotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2Ug
YW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCi0gICAg
ICAgICAgICAgICAgaWYgKCBzLmlmTW9kaWZpZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1v
ZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKCBtb2RpZmllZCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGpxWEhSLmdldFJlc3Bv
bnNlSGVhZGVyKCJldGFnIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlm
aWVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gaWYgbm8gY29udGVudAotICAgICAgICAgICAgICAgIGlmICggc3RhdHVzID09
PSAyMDQgfHwgcy50eXBlID09PSAiSEVBRCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1
c1RleHQgPSAibm9jb250ZW50IjsKLQotICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBtb2RpZmll
ZAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkgewotICAgICAg
ICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKLQotICAgICAgICAgICAg
ICAgIC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0
ZTsKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7Ci0gICAgICAg
ICAgICAgICAgICAgIGVycm9yID0gcmVzcG9uc2UuZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAg
IGlzU3VjY2VzcyA9ICFlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0
Ci0gICAgICAgICAgICAgICAgLy8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVz
IGZvciBub24tYWJvcnRzCi0gICAgICAgICAgICAgICAgZXJyb3IgPSBzdGF0dXNUZXh0OwotICAg
ICAgICAgICAgICAgIGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewotICAgICAgICAgICAg
ICAgICAgICBzdGF0dXNUZXh0ID0gImVycm9yIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBz
dGF0dXMgPCAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3QKLSAgICAgICAgICAg
IGpxWEhSLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgICAgIGpxWEhSLnN0YXR1c1RleHQgPSAo
IG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgIiI7Ci0KLSAgICAgICAgICAgIC8v
IFN1Y2Nlc3MvRXJyb3IKLSAgICAgICAgICAgIGlmICggaXNTdWNjZXNzICkgewotICAgICAgICAg
ICAgICAgIGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywg
c3RhdHVzVGV4dCwganFYSFIgXSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1
c1RleHQsIGVycm9yIF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3RhdHVz
LWRlcGVuZGVudCBjYWxsYmFja3MKLSAgICAgICAgICAgIGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1
c0NvZGUgKTsKLSAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7Ci0KLSAgICAgICAg
ICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250
ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKLSAg
ICAgICAgICAgICAgICAgICAgWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9y
IF0gKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29tcGxldGUKLSAgICAgICAg
ICAgIGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwg
c3RhdHVzVGV4dCBdICk7Ci0KLSAgICAgICAgICAgIGlmICggZmlyZUdsb2JhbHMgKSB7Ci0gICAg
ICAgICAgICAgICAgZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBb
IGpxWEhSLCBzIF0gKTsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFY
IGNvdW50ZXIKLSAgICAgICAgICAgICAgICBpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewot
ICAgICAgICAgICAgICAgICAgICBqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1
cm4ganFYSFI7Ci0gICAgfSwKLQotICAgIGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNh
bGxiYWNrICkgewotICAgICAgICByZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFj
aywgImpzb24iICk7Ci0gICAgfSwKLQotICAgIGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2Fs
bGJhY2sgKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2Fs
bGJhY2ssICJzY3JpcHQiICk7Ci0gICAgfQotfSk7Ci0KLWpRdWVyeS5lYWNoKCBbICJnZXQiLCAi
cG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKLSAgICBqUXVlcnlbIG1ldGhvZCBdID0g
ZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7Ci0gICAgICAgIC8vIHNoaWZ0
IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCi0gICAgICAgIGlmICggalF1
ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlIHx8IGNh
bGxiYWNrOwotICAgICAgICAgICAgY2FsbGJhY2sgPSBkYXRhOwotICAgICAgICAgICAgZGF0YSA9
IHVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqUXVlcnkuYWpheCh7Ci0g
ICAgICAgICAgICB1cmw6IHVybCwKLSAgICAgICAgICAgIHR5cGU6IG1ldGhvZCwKLSAgICAgICAg
ICAgIGRhdGFUeXBlOiB0eXBlLAotICAgICAgICAgICAgZGF0YTogZGF0YSwKLSAgICAgICAgICAg
IHN1Y2Nlc3M6IGNhbGxiYWNrCi0gICAgICAgIH0pOwotICAgIH07Ci19KTsKLQotLy8gQXR0YWNo
IGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKLWpR
dWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWpheFN0b3AiLCAiYWpheENvbXBsZXRlIiwgImFq
YXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4U2VuZCIgXSwgZnVuY3Rpb24oIGksIHR5cGUg
KSB7Ci0gICAgalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLm9uKCB0eXBlLCBmbiApOwotICAgIH07Ci19KTsKLQotCi1qUXVlcnkuX2V2YWxV
cmwgPSBmdW5jdGlvbiggdXJsICkgewotICAgIHJldHVybiBqUXVlcnkuYWpheCh7Ci0gICAgICAg
IHVybDogdXJsLAotICAgICAgICB0eXBlOiAiR0VUIiwKLSAgICAgICAgZGF0YVR5cGU6ICJzY3Jp
cHQiLAotICAgICAgICBhc3luYzogZmFsc2UsCi0gICAgICAgIGdsb2JhbDogZmFsc2UsCi0gICAg
ICAgICJ0aHJvd3MiOiB0cnVlCi0gICAgfSk7Ci19OwotCi0KLWpRdWVyeS5mbi5leHRlbmQoewot
ICAgIHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewotICAgICAgICB2YXIgd3JhcDsKLQotICAg
ICAgICBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7Ci0gICAgICAgICAgICByZXR1
cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAgICAgICAgIGpRdWVyeSggdGhp
cyApLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApOwotICAgICAgICAgICAgfSk7Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoIHRoaXNbIDAgXSApIHsKLQotICAgICAgICAgICAgLy8gVGhl
IGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKLSAgICAgICAgICAgIHdyYXAgPSBq
UXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1
ZSApOwotCi0gICAgICAgICAgICBpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewotICAgICAg
ICAgICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgd3JhcC5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgdmFy
IGVsZW0gPSB0aGlzOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVu
dENoaWxkICkgewotICAgICAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRD
aGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsK
LSAgICAgICAgICAgIH0pLmFwcGVuZCggdGhpcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIHRoaXM7Ci0gICAgfSwKLQotICAgIHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7Ci0g
ICAgICAgIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKLSAgICAgICAgICAgIHJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAgICAgICAgICAgICAgalF1ZXJ5KCB0
aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKLSAgICAgICAgICAgIH0pOwot
ICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLSAgICAg
ICAgICAgIHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksCi0gICAgICAgICAgICAgICAgY29udGVu
dHMgPSBzZWxmLmNvbnRlbnRzKCk7Ci0KLSAgICAgICAgICAgIGlmICggY29udGVudHMubGVuZ3Ro
ICkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKLQotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZCggaHRtbCApOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9LAotCi0gICAgd3JhcDogZnVuY3Rpb24oIGh0
bWwgKSB7Ci0gICAgICAgIHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwg
KTsKLQotICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotICAgICAgICAg
ICAgalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBp
KSA6IGh0bWwgKTsKLSAgICAgICAgfSk7Ci0gICAgfSwKLQotICAgIHVud3JhcDogZnVuY3Rpb24o
KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7Ci0gICAg
ICAgICAgICBpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewotICAgICAg
ICAgICAgICAgIGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSkuZW5kKCk7Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5
LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHsKLSAgICAvLyBTdXBwb3J0
OiBPcGVyYSA8PSAxMi4xMgotICAgIC8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBv
ZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKLSAgICByZXR1cm4g
ZWxlbS5vZmZzZXRXaWR0aCA8PSAwICYmIGVsZW0ub2Zmc2V0SGVpZ2h0IDw9IDA7Ci19OwotalF1
ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0gICAgcmV0dXJu
ICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOwotfTsKLQotCi0KLQotdmFyIHIy
MCA9IC8lMjAvZywKLSAgICByYnJhY2tldCA9IC9cW1xdJC8sCi0gICAgckNSTEYgPSAvXHI/XG4v
ZywKLSAgICByc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8
ZmlsZSkkL2ksCi0gICAgcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8
a2V5Z2VuKS9pOwotCi1mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlv
bmFsLCBhZGQgKSB7Ci0gICAgdmFyIG5hbWU7Ci0KLSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBv
YmogKSApIHsKLSAgICAgICAgLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCi0gICAgICAgIGpRdWVy
eS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewotICAgICAgICAgICAgaWYgKCB0cmFkaXRp
b25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsKLSAgICAgICAgICAgICAgICAvLyBU
cmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuCi0gICAgICAgICAgICAgICAgYWRkKCBw
cmVmaXgsIHYgKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJ
dGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBp
bmRleC4KLSAgICAgICAgICAgICAgICBidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBl
b2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0gZWxzZSBpZiAoICF0cmFkaXRp
b25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09ICJvYmplY3QiICkgewotICAgICAgICAvLyBT
ZXJpYWxpemUgb2JqZWN0IGl0ZW0uCi0gICAgICAgIGZvciAoIG5hbWUgaW4gb2JqICkgewotICAg
ICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFt
ZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KLSAgICAgICAgYWRkKCBwcmVmaXgsIG9iaiAp
OwotICAgIH0KLX0KLQotLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3Ig
YSBzZXQgb2YKLS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwotalF1ZXJ5LnBhcmFt
ID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkgewotICAgIHZhciBwcmVmaXgsCi0gICAgICAg
IHMgPSBbXSwKLSAgICAgICAgYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7Ci0gICAgICAg
ICAgICAvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMg
dmFsdWUKLSAgICAgICAgICAgIHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2
YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOwotICAgICAgICAgICAgc1sg
cy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBlbmNvZGVVUklD
b21wb25lbnQoIHZhbHVlICk7Ci0gICAgICAgIH07Ci0KLSAgICAvLyBTZXQgdHJhZGl0aW9uYWwg
dG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLgotICAgIGlmICggdHJhZGl0aW9u
YWwgPT09IHVuZGVmaW5lZCApIHsKLSAgICAgICAgdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNl
dHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7Ci0gICAgfQotCi0gICAg
Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkg
b2YgZm9ybSBlbGVtZW50cy4KLSAgICBpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpx
dWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkgewotICAgICAgICAvLyBTZXJp
YWxpemUgdGhlIGZvcm0gZWxlbWVudHMKLSAgICAgICAgalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9u
KCkgewotICAgICAgICAgICAgYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKLSAgICAgICAg
fSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRo
ZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKLSAgICAgICAgLy8gZGlkIGl0KSwg
b3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCi0gICAgICAgIGZvciAoIHByZWZp
eCBpbiBhICkgewotICAgICAgICAgICAgYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0s
IHRyYWRpdGlvbmFsLCBhZGQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiB0
aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KLSAgICByZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBs
YWNlKCByMjAsICIrIiApOwotfTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0gICAgc2VyaWFsaXpl
OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxp
emVBcnJheSgpICk7Ci0gICAgfSwKLSAgICBzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7Ci0g
ICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIC8vIENhbiBh
ZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRz
Ci0gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRz
IiApOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxl
bWVudHMgKSA6IHRoaXM7Ci0gICAgICAgIH0pCi0gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMudHlwZTsKLQotICAgICAgICAgICAgLy8gVXNl
IC5pcyggIjpkaXNhYmxlZCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3JrcwotICAg
ICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJs
ZWQiICkgJiYKLSAgICAgICAgICAgICAgICByc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFt
ZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmCi0gICAgICAgICAgICAgICAg
KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApOwotICAgICAg
ICB9KQotICAgICAgICAubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkgewotICAgICAgICAgICAgdmFy
IHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwotCi0gICAgICAgICAgICByZXR1cm4gdmFsID09
IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOgotICAgICAgICAgICAgICAgIGpRdWVyeS5p
c0FycmF5KCB2YWwgKSA/Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5tYXAoIHZhbCwgZnVu
Y3Rpb24oIHZhbCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGVs
ZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLSAgICAgICAg
ICAgICAgICAgICAgfSkgOgotICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IGVsZW0ubmFtZSwg
dmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLSAgICAgICAgfSkuZ2V0KCk7
Ci0gICAgfQotfSk7Ci0KLQotalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHsK
LSAgICB0cnkgewotICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7Ci0gICAgfSBj
YXRjaCggZSApIHt9Ci19OwotCi12YXIgeGhySWQgPSAwLAotICAgIHhockNhbGxiYWNrcyA9IHt9
LAotICAgIHhoclN1Y2Nlc3NTdGF0dXMgPSB7Ci0gICAgICAgIC8vIGZpbGUgcHJvdG9jb2wgYWx3
YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCi0gICAgICAgIDA6IDIwMCwKLSAg
ICAgICAgLy8gU3VwcG9ydDogSUU5Ci0gICAgICAgIC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0
dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAotICAgICAgICAxMjIzOiAyMDQKLSAgICB9
LAotICAgIHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7Ci0KLS8vIFN1
cHBvcnQ6IElFOQotLy8gT3BlbiByZXF1ZXN0cyBtdXN0IGJlIG1hbnVhbGx5IGFib3J0ZWQgb24g
dW5sb2FkICgjNTI4MCkKLWlmICggd2luZG93LkFjdGl2ZVhPYmplY3QgKSB7Ci0gICAgalF1ZXJ5
KCB3aW5kb3cgKS5vbiggInVubG9hZCIsIGZ1bmN0aW9uKCkgewotICAgICAgICBmb3IgKCB2YXIg
a2V5IGluIHhockNhbGxiYWNrcyApIHsKLSAgICAgICAgICAgIHhockNhbGxiYWNrc1sga2V5IF0o
KTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi1zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRl
ZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwotc3VwcG9ydC5hamF4
ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7Ci0KLWpRdWVyeS5hamF4VHJhbnNwb3J0
KGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgIHZhciBjYWxsYmFjazsKLQotICAgIC8vIENyb3Nz
IGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3QK
LSAgICBpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NE
b21haW4gKSB7Ci0gICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICBzZW5kOiBmdW5jdGlvbigg
aGVhZGVycywgY29tcGxldGUgKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGksCi0gICAgICAgICAg
ICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyKCksCi0gICAgICAgICAgICAgICAgICAgIGlkID0g
Kyt4aHJJZDsKLQotICAgICAgICAgICAgICAgIHhoci5vcGVuKCBvcHRpb25zLnR5cGUsIG9wdGlv
bnMudXJsLCBvcHRpb25zLmFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3Jk
ICk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVk
Ci0gICAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKLSAgICAgICAgICAg
ICAgICAgICAgZm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE92ZXJy
aWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBpZiAoIG9wdGlvbnMubWlt
ZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHho
ci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgLy8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXIKLSAgICAgICAg
ICAgICAgICAvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9u
cyBmb3IgYSBwcmVmbGlnaHQgYXJlCi0gICAgICAgICAgICAgICAgLy8gYWtpbiB0byBhIGppZ3Nh
dyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS4KLSAgICAgICAgICAg
ICAgICAvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBl
dmVuIHVzaW5nIGFqYXhTZXR1cCkKLSAgICAgICAgICAgICAgICAvLyBGb3Igc2FtZS1kb21haW4g
cmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KLSAgICAg
ICAgICAgICAgICBpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyJYLVJlcXVl
c3RlZC1XaXRoIl0gKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbIlgtUmVxdWVzdGVk
LVdpdGgiXSA9ICJYTUxIdHRwUmVxdWVzdCI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgLy8gU2V0IGhlYWRlcnMKLSAgICAgICAgICAgICAgICBmb3IgKCBpIGluIGhlYWRl
cnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFk
ZXJzWyBpIF0gKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDYWxs
YmFjawotICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggY2FsbGJhY2sgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRl
IHhockNhbGxiYWNrc1sgaWQgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFj
ayA9IHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHR5cGUgPT09ICJhYm9ydCIgKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHhoci5hYm9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbXBsZXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
ZmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDcK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBd
IHx8IHhoci5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIu
c3RhdHVzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBv
cnQ6IElFOQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXNzaW5n
IGJpbmFyeS1kYXRhIHJlc3BvbnNlVGV4dCB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoIzExNDI2KQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciID8g
ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHhoci5yZXNw
b25zZVRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmlu
ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0QWxsUmVzcG9u
c2VIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIC8v
IExpc3RlbiB0byBldmVudHMKLSAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gY2FsbGJhY2so
KTsKLSAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IGNhbGxiYWNrKCJlcnJvciIpOwotCi0g
ICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFjawotICAgICAgICAgICAg
ICAgIGNhbGxiYWNrID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2soImFib3J0Iik7Ci0K
LSAgICAgICAgICAgICAgICAvLyBEbyBzZW5kIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAg
Ly8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5Ci0gICAgICAg
ICAgICAgICAgLy8gaGFuZGxlZCBpbiBqUXVlcnkuYWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUp
Ci0gICAgICAgICAgICAgICAgeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25z
LmRhdGEgfHwgbnVsbCApOwotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgYWJvcnQ6IGZ1
bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIGlmICggY2FsbGJhY2sgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGNhbGxiYWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9OwotICAgIH0KLX0pOwotCi0KLQotCi0vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlw
ZQotalF1ZXJ5LmFqYXhTZXR1cCh7Ci0gICAgYWNjZXB0czogewotICAgICAgICBzY3JpcHQ6ICJ0
ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFz
Y3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKLSAgICB9LAotICAgIGNvbnRlbnRzOiB7
Ci0gICAgICAgIHNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvCi0gICAgfSwKLSAgICBjb252
ZXJ0ZXJzOiB7Ci0gICAgICAgICJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgewotICAg
ICAgICAgICAgalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKLSAgICAgICAgICAgIHJldHVybiB0
ZXh0OwotICAgICAgICB9Ci0gICAgfQotfSk7Ci0KLS8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwg
Y2FzZSBhbmQgY3Jvc3NEb21haW4KLWpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVu
Y3Rpb24oIHMgKSB7Ci0gICAgaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7Ci0gICAgICAg
IHMuY2FjaGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCBzLmNyb3NzRG9tYWluICkgewotICAg
ICAgICBzLnR5cGUgPSAiR0VUIjsKLSAgICB9Ci19KTsKLQotLy8gQmluZCBzY3JpcHQgdGFnIGhh
Y2sgdHJhbnNwb3J0Ci1qUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKCBz
ICkgewotICAgIC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4g
cmVxdWVzdHMKLSAgICBpZiAoIHMuY3Jvc3NEb21haW4gKSB7Ci0gICAgICAgIHZhciBzY3JpcHQs
IGNhbGxiYWNrOwotICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24o
IF8sIGNvbXBsZXRlICkgewotICAgICAgICAgICAgICAgIHNjcmlwdCA9IGpRdWVyeSgiPHNjcmlw
dD4iKS5wcm9wKHsKLSAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsCi0gICAgICAgICAg
ICAgICAgICAgIGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAg
c3JjOiBzLnVybAotICAgICAgICAgICAgICAgIH0pLm9uKAotICAgICAgICAgICAgICAgICAgICAi
bG9hZCBlcnJvciIsCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2
dCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmICggZXZ0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCBldnQu
dHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0g
ICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTsK
LSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBhYm9ydDogZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKCBjYWxsYmFjayApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2so
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQot
fSk7Ci0KLQotCi0KLXZhciBvbGRDYWxsYmFja3MgPSBbXSwKLSAgICByanNvbnAgPSAvKD0pXD8o
Pz0mfCQpfFw/XD8vOwotCi0vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCi1qUXVlcnkuYWpheFNl
dHVwKHsKLSAgICBqc29ucDogImNhbGxiYWNrIiwKLSAgICBqc29ucENhbGxiYWNrOiBmdW5jdGlv
bigpIHsKLSAgICAgICAgdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1
ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwotICAgICAgICB0aGlzWyBjYWxsYmFj
ayBdID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrOwotICAgIH0KLX0pOwotCi0vLyBE
ZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAg
cmVxdWVzdHMKLWpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBz
LCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKLQotICAgIHZhciBjYWxsYmFja05hbWUsIG92
ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKLSAgICAgICAganNvblByb3AgPSBzLmpzb25w
ICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KLSAgICAgICAgICAgICJ1cmwi
IDoKLSAgICAgICAgICAgIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICYmICEoIHMuY29udGVu
dFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQi
KSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYgImRhdGEiCi0gICAgICAgICk7Ci0KLSAgICAv
LyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZl
IGEgcGFyYW1ldGVyIHRvIHNldAotICAgIGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAg
XSA9PT0gImpzb25wIiApIHsKLQotICAgICAgICAvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1i
ZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgIGNhbGxi
YWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2Fs
bGJhY2sgKSA/Ci0gICAgICAgICAgICBzLmpzb25wQ2FsbGJhY2soKSA6Ci0gICAgICAgICAgICBz
Lmpzb25wQ2FsbGJhY2s7Ci0KLSAgICAgICAgLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9y
IGZvcm0gZGF0YQotICAgICAgICBpZiAoIGpzb25Qcm9wICkgewotICAgICAgICAgICAgc1sganNv
blByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tO
YW1lICk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkgewotICAgICAg
ICAgICAgcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5q
c29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSBk
YXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KLSAg
ICAgICAgcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7Ci0gICAgICAg
ICAgICBpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKLSAgICAgICAgICAgICAgICBqUXVlcnku
ZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKLSAgICAgICAgfTsK
LQotICAgICAgICAvLyBmb3JjZSBqc29uIGRhdGFUeXBlCi0gICAgICAgIHMuZGF0YVR5cGVzWyAw
IF0gPSAianNvbiI7Ci0KLSAgICAgICAgLy8gSW5zdGFsbCBjYWxsYmFjawotICAgICAgICBvdmVy
d3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07Ci0gICAgICAgIHdpbmRvd1sgY2FsbGJh
Y2tOYW1lIF0gPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlQ29udGFpbmVyID0g
YXJndW1lbnRzOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIENsZWFuLXVwIGZ1bmN0aW9uIChm
aXJlcyBhZnRlciBjb252ZXJ0ZXJzKQotICAgICAgICBqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7
Ci0gICAgICAgICAgICAvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCi0gICAgICAgICAgICB3
aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47Ci0KLSAgICAgICAgICAgIC8vIFNh
dmUgYmFjayBhcyBmcmVlCi0gICAgICAgICAgICBpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewot
ICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRv
ZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAotICAgICAgICAgICAgICAgIHMuanNvbnBDYWxsYmFj
ayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKLQotICAgICAgICAgICAgICAgIC8v
IHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICBv
bGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25z
ZQotICAgICAgICAgICAgaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlv
biggb3ZlcndyaXR0ZW4gKSApIHsKLSAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiggcmVzcG9u
c2VDb250YWluZXJbIDAgXSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25z
ZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOwotICAgICAgICB9KTsKLQotICAg
ICAgICAvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKLSAgICAgICAgcmV0dXJuICJzY3JpcHQiOwotICAg
IH0KLX0pOwotCi0KLQotCi0vLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAotLy8gY29udGV4dCAob3B0
aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhp
cyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAotLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFs
KTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmlu
ZwotalF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0
cyApIHsKLSAgICBpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKLSAg
ICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGlmICggdHlwZW9mIGNvbnRleHQgPT09ICJi
b29sZWFuIiApIHsKLSAgICAgICAga2VlcFNjcmlwdHMgPSBjb250ZXh0OwotICAgICAgICBjb250
ZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Owot
Ci0gICAgdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAotICAgICAgICBzY3Jp
cHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwotCi0gICAgLy8gU2luZ2xlIHRhZwotICAgIGlmICgg
cGFyc2VkICkgewotICAgICAgICByZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNl
ZFsxXSApIF07Ci0gICAgfQotCi0gICAgcGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsg
ZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7Ci0KLSAgICBpZiAoIHNjcmlwdHMgJiYgc2NyaXB0
cy5sZW5ndGggKSB7Ci0gICAgICAgIGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwotICAgIH0K
LQotICAgIHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwotfTsK
LQotCi0vLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCi12YXIgX2xvYWQgPSBq
UXVlcnkuZm4ubG9hZDsKLQotLyoqCi0gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCi0gKi8KLWpR
dWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKLSAgICBp
ZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgewotICAgICAgICByZXR1cm4g
X2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotICAgIH0KLQotICAgIHZhciBzZWxlY3Rv
ciwgdHlwZSwgcmVzcG9uc2UsCi0gICAgICAgIHNlbGYgPSB0aGlzLAotICAgICAgICBvZmYgPSB1
cmwuaW5kZXhPZigiICIpOwotCi0gICAgaWYgKCBvZmYgPj0gMCApIHsKLSAgICAgICAgc2VsZWN0
b3IgPSB1cmwuc2xpY2UoIG9mZiApOwotICAgICAgICB1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiAp
OwotICAgIH0KLQotICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbgotICAgIGlmICggalF1ZXJ5Lmlz
RnVuY3Rpb24oIHBhcmFtcyApICkgewotCi0gICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGl0J3Mg
dGhlIGNhbGxiYWNrCi0gICAgICAgIGNhbGxiYWNrID0gcGFyYW1zOwotICAgICAgICBwYXJhbXMg
PSB1bmRlZmluZWQ7Ci0KLSAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCi0g
ICAgfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewot
ICAgICAgICB0eXBlID0gIlBPU1QiOwotICAgIH0KLQotICAgIC8vIElmIHdlIGhhdmUgZWxlbWVu
dHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0Ci0gICAgaWYgKCBzZWxmLmxlbmd0aCA+IDAg
KSB7Ci0gICAgICAgIGpRdWVyeS5hamF4KHsKLSAgICAgICAgICAgIHVybDogdXJsLAotCi0gICAg
ICAgICAgICAvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1l
dGhvZCB3aWxsIGJlIHVzZWQKLSAgICAgICAgICAgIHR5cGU6IHR5cGUsCi0gICAgICAgICAgICBk
YXRhVHlwZTogImh0bWwiLAotICAgICAgICAgICAgZGF0YTogcGFyYW1zCi0gICAgICAgIH0pLmRv
bmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsKLQotICAgICAgICAgICAgLy8gU2F2ZSByZXNw
b25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrCi0gICAgICAgICAgICByZXNwb25zZSA9
IGFyZ3VtZW50czsKLQotICAgICAgICAgICAgc2VsZi5odG1sKCBzZWxlY3RvciA/Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmln
aHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKLSAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIHNj
cmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKLSAgICAgICAgICAg
ICAgICBqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRl
eHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgotCi0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNl
IHVzZSB0aGUgZnVsbCByZXN1bHQKLSAgICAgICAgICAgICAgICByZXNwb25zZVRleHQgKTsKLQot
ICAgICAgICB9KS5jb21wbGV0ZSggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMg
KSB7Ci0gICAgICAgICAgICBzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhS
LnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7Ci0gICAgICAgIH0pOwotICAgIH0KLQot
ICAgIHJldHVybiB0aGlzOwotfTsKLQotCi0KLQotalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRl
ZCA9IGZ1bmN0aW9uKCBlbGVtICkgewotICAgIHJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGlt
ZXJzLCBmdW5jdGlvbiggZm4gKSB7Ci0gICAgICAgIHJldHVybiBlbGVtID09PSBmbi5lbGVtOwot
ICAgIH0pLmxlbmd0aDsKLX07Ci0KLQotCi0KLXZhciBkb2NFbGVtID0gd2luZG93LmRvY3VtZW50
LmRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBHZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVu
dAotICovCi1mdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7Ci0gICAgcmV0dXJuIGpRdWVyeS5p
c1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZh
dWx0VmlldzsKLX0KLQotalF1ZXJ5Lm9mZnNldCA9IHsKLSAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9u
KCBlbGVtLCBvcHRpb25zLCBpICkgewotICAgICAgICB2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQs
IGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0
aW9uLAotICAgICAgICAgICAgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24i
ICksCi0gICAgICAgICAgICBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksCi0gICAgICAgICAgICBw
cm9wcyA9IHt9OwotCi0gICAgICAgIC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3Av
bGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KLSAgICAgICAgaWYgKCBwb3NpdGlvbiA9
PT0gInN0YXRpYyIgKSB7Ci0gICAgICAgICAgICBlbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0
aXZlIjsKLSAgICAgICAgfQotCi0gICAgICAgIGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7
Ci0gICAgICAgIGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICk7Ci0gICAgICAg
IGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKLSAgICAgICAgY2FsY3Vs
YXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAi
Zml4ZWQiICkgJiYKLSAgICAgICAgICAgICggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4
T2YoImF1dG8iKSA+IC0xOwotCi0gICAgICAgIC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxh
dGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlz
IGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAotICAgICAgICBpZiAoIGNhbGN1bGF0ZVBvc2l0aW9u
ICkgewotICAgICAgICAgICAgY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7Ci0gICAg
ICAgICAgICBjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7Ci0gICAgICAgICAgICBjdXJMZWZ0ID0g
Y3VyUG9zaXRpb24ubGVmdDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3VyVG9w
ID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsKLSAgICAgICAgICAgIGN1ckxlZnQgPSBw
YXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgg
alF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBv
cHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewotICAgICAgICAgICAgcHJvcHMudG9wID0gKCBv
cHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgewotICAgICAgICAgICAgcHJvcHMubGVmdCA9
ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKLSAgICAgICAgICAgIG9wdGlv
bnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgY3VyRWxlbS5jc3MoIHByb3BzICk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1qUXVl
cnkuZm4uZXh0ZW5kKHsKLSAgICBvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewotICAgICAg
ICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3B0aW9ucyA9
PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICB0aGlzIDoKLSAgICAgICAgICAgICAgICB0
aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5vZmZz
ZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0g
ICAgICAgIH0KLQotICAgICAgICB2YXIgZG9jRWxlbSwgd2luLAotICAgICAgICAgICAgZWxlbSA9
IHRoaXNbIDAgXSwKLSAgICAgICAgICAgIGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sCi0gICAg
ICAgICAgICBkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDsKLQotICAgICAgICBpZiAo
ICFkb2MgKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBkb2NF
bGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBu
b3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKLSAgICAgICAgaWYgKCAhalF1ZXJ5LmNvbnRhaW5z
KCBkb2NFbGVtLCBlbGVtICkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gYm94OwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVy
IHRoYW4gZXJyb3IKLSAgICAgICAgLy8gQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBo
b25lKQotICAgICAgICBpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0g
c3RydW5kZWZpbmVkICkgewotICAgICAgICAgICAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVu
dFJlY3QoKTsKLSAgICAgICAgfQotICAgICAgICB3aW4gPSBnZXRXaW5kb3coIGRvYyApOwotICAg
ICAgICByZXR1cm4gewotICAgICAgICAgICAgdG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0
IC0gZG9jRWxlbS5jbGllbnRUb3AsCi0gICAgICAgICAgICBsZWZ0OiBib3gubGVmdCArIHdpbi5w
YWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdAotICAgICAgICB9OwotICAgIH0sCi0KLSAg
ICBwb3NpdGlvbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmICggIXRoaXNbIDAgXSApIHsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBvZmZzZXRQYXJlbnQs
IG9mZnNldCwKLSAgICAgICAgICAgIGVsZW0gPSB0aGlzWyAwIF0sCi0gICAgICAgICAgICBwYXJl
bnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9OwotCi0gICAgICAgIC8vIEZpeGVkIGVsZW1l
bnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDog
MH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudAotICAgICAgICBpZiAoIGpR
dWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKLSAgICAgICAgICAg
IC8vIFdlIGFzc3VtZSB0aGF0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpcyBhdmFpbGFibGUgd2hl
biBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZAotICAgICAgICAgICAgb2Zmc2V0ID0gZWxlbS5n
ZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKLSAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IHRo
aXMub2Zmc2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBjb3JyZWN0IG9mZnNldHMK
LSAgICAgICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAoICFq
UXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIgKSApIHsKLSAgICAgICAg
ICAgICAgICBwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwotICAgICAgICAg
ICAgcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJv
cmRlclRvcFdpZHRoIiwgdHJ1ZSApOwotICAgICAgICAgICAgcGFyZW50T2Zmc2V0LmxlZnQgKz0g
alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJMZWZ0V2lkdGgiLCB0cnVlICk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxl
bWVudCBtYXJnaW5zCi0gICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICB0b3A6IG9mZnNldC50
b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRy
dWUgKSwKLSAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQg
LSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUgKQotICAgICAgICB9OwotICAg
IH0sCi0KLSAgICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhp
cy5tYXAoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICB2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5v
ZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKLQotICAgICAgICAgICAgd2hpbGUgKCBvZmZzZXRQYXJl
bnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnQsICJodG1sIiApICYmIGpRdWVy
eS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9uIiApID09PSAic3RhdGljIiApICkgewotICAg
ICAgICAgICAgICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxl
bTsKLSAgICAgICAgfSk7Ci0gICAgfQotfSk7Ci0KLS8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBz
Y3JvbGxUb3AgbWV0aG9kcwotalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0
Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7
Ci0gICAgdmFyIHRvcCA9ICJwYWdlWU9mZnNldCIgPT09IHByb3A7Ci0KLSAgICBqUXVlcnkuZm5b
IG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKLSAgICAgICAgcmV0dXJuIGFjY2VzcyggdGhp
cywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgewotICAgICAgICAgICAgdmFyIHdpbiA9
IGdldFdpbmRvdyggZWxlbSApOwotCi0gICAgICAgICAgICBpZiAoIHZhbCA9PT0gdW5kZWZpbmVk
ICkgewotICAgICAgICAgICAgICAgIHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1l
dGhvZCBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHdpbiApIHsKLSAgICAg
ICAgICAgICAgICB3aW4uc2Nyb2xsVG8oCi0gICAgICAgICAgICAgICAgICAgICF0b3AgPyB2YWwg
OiB3aW5kb3cucGFnZVhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHRvcCA/IHZhbCA6IHdp
bmRvdy5wYWdlWU9mZnNldAotICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgZWxlbVsgbWV0aG9kIF0gPSB2YWw7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBudWxsICk7Ci0gICAg
fTsKLX0pOwotCi0vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5w
b3NpdGlvbgotLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTI5MDg0Ci0vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNw
ZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0Ci0vLyByYXRoZXIgdGhhbiBtYWtlIHRo
ZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBm
b3IgaXQgaGVyZQotalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwg
cHJvcCApIHsKLSAgICBqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IGFkZEdldEhvb2tJZiggc3Vw
cG9ydC5waXhlbFBvc2l0aW9uLAotICAgICAgICBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7
Ci0gICAgICAgICAgICBpZiAoIGNvbXB1dGVkICkgewotICAgICAgICAgICAgICAgIGNvbXB1dGVk
ID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgY3VyQ1NTIHJl
dHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID8KLSAgICAgICAgICAgICAgICAgICAgalF1
ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6Ci0gICAgICAgICAgICAgICAg
ICAgIGNvbXB1dGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgKTsKLX0pOwotCi0K
LS8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJI
ZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwotalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVp
Z2h0IiwgV2lkdGg6ICJ3aWR0aCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7Ci0gICAgalF1
ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAi
b3V0ZXIiICsgbmFtZSB9LCBmdW5jdGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKLSAg
ICAgICAgLy8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoCi0gICAg
ICAgIGpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJnaW4sIHZhbHVlICkgewot
ICAgICAgICAgICAgdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0
RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCi0gICAgICAgICAgICAgICAg
ZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRy
dWUgPyAibWFyZ2luIiA6ICJib3JkZXIiICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBhY2Nlc3Mo
IHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgICB2
YXIgZG9jOwotCi0gICAgICAgICAgICAgICAgaWYgKCBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSAp
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxk
IGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKLSAgICAgICAg
ICAgICAgICAgICAgLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1
ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBo
dHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NAotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFt
ZSBdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEdldCBkb2N1bWVu
dCB3aWR0aCBvciBoZWlnaHQKLSAgICAgICAgICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09
IDkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50Owot
Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBv
ZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwKLSAgICAgICAgICAg
ICAgICAgICAgLy8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYm9keVsgInNjcm9s
bCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCi0gICAgICAgICAgICAgICAgICAg
ICAgICBlbGVtLmJvZHlbICJvZmZzZXQiICsgbmFtZSBdLCBkb2NbICJvZmZzZXQiICsgbmFtZSBd
LAotICAgICAgICAgICAgICAgICAgICAgICAgZG9jWyAiY2xpZW50IiArIG5hbWUgXQotICAgICAg
ICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJl
dHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHdp
ZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcg
cGFyc2VGbG9hdAotICAgICAgICAgICAgICAgICAgICBqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBl
eHRyYSApIDoKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9u
IHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIGpRdWVyeS5zdHlsZSggZWxlbSwgdHlw
ZSwgdmFsdWUsIGV4dHJhICk7Ci0gICAgICAgICAgICB9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJn
aW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApOwotICAgICAgICB9OwotICAgIH0pOwot
fSk7Ci0KLQotLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNo
ZWQgZWxlbWVudCBzZXQKLWpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJu
IHRoaXMubGVuZ3RoOwotfTsKLQotalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFj
azsKLQotCi0KLQotLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVl
cnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyCi0vLyBmaWxlcyB0aGF0IG1heSB1c2Ug
ZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci0v
LyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVz
dCBhbmQgbW9zdCByb2J1c3QKLS8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBp
cyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUKLS8vIGRlcml2ZWQgZnJvbSBmaWxl
IG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQot
Ly8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBp
ZiBhbiBBTUQgbW9kdWxlIHdhbnRzCi0vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlz
IHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCi1pZiAoIHR5cGVvZiBkZWZpbmUgPT09
ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKLSAgICBkZWZpbmUoICJqcXVlcnkiLCBbXSwg
ZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBqUXVlcnk7Ci0gICAgfSk7Ci19Ci0KLQotCi0K
LXZhcgotICAgIC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQotICAgIF9q
UXVlcnkgPSB3aW5kb3cualF1ZXJ5LAotCi0gICAgLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBv
ZiBvdmVyd3JpdGUKLSAgICBfJCA9IHdpbmRvdy4kOwotCi1qUXVlcnkubm9Db25mbGljdCA9IGZ1
bmN0aW9uKCBkZWVwICkgewotICAgIGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKLSAgICAg
ICAgd2luZG93LiQgPSBfJDsKLSAgICB9Ci0KLSAgICBpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVy
eSA9PT0galF1ZXJ5ICkgewotICAgICAgICB3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKLSAgICB9
Ci0KLSAgICByZXR1cm4galF1ZXJ5OwotfTsKLQotLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVu
dGlmaWVycywgZXZlbiBpbgotLy8gQU1EICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1
Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLS8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3Nl
ciBlbXVsYXRvcnMgKCMxMzU2NikKLWlmICggdHlwZW9mIG5vR2xvYmFsID09PSBzdHJ1bmRlZmlu
ZWQgKSB7Ci0gICAgd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5OwotfQotCi0KLQot
Ci1yZXR1cm4galF1ZXJ5OwotCi19KSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MgYi9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2Jvd2VyX2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5jc3MKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWJlZjgzMTg5YzkxNWVlNzhlY2E4NDdmOTA4YzZkMDJk
NThhNDAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9ib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3Nz
CisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLWh0bWwsCi1ib2R5IHsKLSAgICBtYXJn
aW46IDA7Ci0gICAgcGFkZGluZzogMDsKLX0KLQotYnV0dG9uIHsKLSAgICBtYXJnaW46IDA7Ci0g
ICAgcGFkZGluZzogMDsKLSAgICBib3JkZXI6IDA7Ci0gICAgYmFja2dyb3VuZDogbm9uZTsKLSAg
ICBmb250LXNpemU6IDEwMCU7Ci0gICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgIGZv
bnQtZmFtaWx5OiBpbmhlcml0OwotICAgIGNvbG9yOiBpbmhlcml0OwotICAgIC13ZWJraXQtYXBw
ZWFyYW5jZTogbm9uZTsKLSAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTsKLSAgICAtby1hcHBlYXJh
bmNlOiBub25lOwotICAgIGFwcGVhcmFuY2U6IG5vbmU7Ci19Ci0KLWJvZHkgewotICAgIGZvbnQ6
IDE0cHggJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKLSAg
ICBsaW5lLWhlaWdodDogMS40ZW07Ci0gICAgYmFja2dyb3VuZDogI2VhZWFlYSB1cmwoJ2JnLnBu
ZycpOwotICAgIGNvbG9yOiAjNGQ0ZDRkOwotICAgIHdpZHRoOiA1NTBweDsKLSAgICBtYXJnaW46
IDAgYXV0bzsKLSAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAt
bW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbXMtZm9udC1zbW9vdGhpbmc6
IGFudGlhbGlhc2VkOwotICAgIC1vLWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICBm
b250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Ci19Ci0KLWJ1dHRvbiwKLWlucHV0W3R5cGU9ImNo
ZWNrYm94Il0gewotICBvdXRsaW5lOiBub25lOwotfQotCi0jdG9kb2FwcCB7Ci0gICAgYmFja2dy
b3VuZDogI2ZmZjsKLSAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Ci0g
ICAgbWFyZ2luOiAxMzBweCAwIDQwcHggMDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwot
ICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7
Ci0gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKLSAgICBib3gtc2hhZG93OiAwIDJw
eCA2cHggMCByZ2JhKDAsIDAsIDAsIDAuMiksCi0gICAgICAgICAgICAgICAgMCAyNXB4IDUwcHgg
MCByZ2JhKDAsIDAsIDAsIDAuMTUpOwotfQotCi0jdG9kb2FwcDpiZWZvcmUgewotICAgIGNvbnRl
bnQ6ICcnOwotICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y1ZDZkNjsKLSAgICBib3JkZXIt
cmlnaHQ6IDFweCBzb2xpZCAjZjVkNmQ2OwotICAgIHdpZHRoOiAycHg7Ci0gICAgcG9zaXRpb246
IGFic29sdXRlOwotICAgIHRvcDogMDsKLSAgICBsZWZ0OiA0MHB4OwotICAgIGhlaWdodDogMTAw
JTsKLX0KLQotI3RvZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewotICAg
IGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotI3RvZG9hcHAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xk
ZXIgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgICBjb2xvcjogI2E5YTlhOTsKLX0KLQot
I3RvZG9hcHAgaDEgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0xMjBweDsK
LSAgICB3aWR0aDogMTAwJTsKLSAgICBmb250LXNpemU6IDcwcHg7Ci0gICAgZm9udC13ZWlnaHQ6
IGJvbGQ7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIGNvbG9yOiAjYjNiM2IzOwotICAg
IGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Ci0gICAgdGV4dC1zaGFkb3c6IC0xcHgg
LTFweCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0
aW1pemVMZWdpYmlsaXR5OwotICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJp
bGl0eTsKLSAgICAtbXMtdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKLSAgICAt
by10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwotICAgIHRleHQtcmVuZGVyaW5n
OiBvcHRpbWl6ZUxlZ2liaWxpdHk7Ci19Ci0KLSNoZWFkZXIgewotICAgIHBhZGRpbmctdG9wOiAx
NXB4OwotICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7Ci19Ci0KLSNoZWFkZXI6YmVmb3JlIHsK
LSAgICBjb250ZW50OiAnJzsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgdG9wOiAwOwot
ICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6IDA7Ci0gICAgaGVpZ2h0OiAxNXB4OwotICAgIHotaW5k
ZXg6IDI7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2YzYxNWM7Ci0gICAgYmFja2dy
b3VuZDogIzhkN2Q3NzsKLSAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwg
bGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKHJnYmEoMTMyLCAxMTAsIDEwMCwgMC44KSksdG8o
cmdiYSgxMDEsIDg0LCA3NiwgMC44KSkpOwotICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFy
LWdyYWRpZW50KHRvcCwgcmdiYSgxMzIsIDExMCwgMTAwLCAwLjgpLCByZ2JhKDEwMSwgODQsIDc2
LCAwLjgpKTsKLSAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDEzMiwg
MTEwLCAxMDAsIDAuOCksIHJnYmEoMTAxLCA4NCwgNzYsIDAuOCkpOwotICAgIGJvcmRlci10b3At
bGVmdC1yYWRpdXM6IDFweDsKLSAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4OwotfQot
Ci0jbmV3LXRvZG8sCi0uZWRpdCB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIG1hcmdp
bjogMDsKLSAgICB3aWR0aDogMTAwJTsKLSAgICBmb250LXNpemU6IDI0cHg7Ci0gICAgZm9udC1m
YW1pbHk6IGluaGVyaXQ7Ci0gICAgbGluZS1oZWlnaHQ6IDEuNGVtOwotICAgIGJvcmRlcjogMDsK
LSAgICBvdXRsaW5lOiBub25lOwotICAgIGNvbG9yOiBpbmhlcml0OwotICAgIHBhZGRpbmc6IDZw
eDsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwotICAgIGJveC1zaGFkb3c6IGluc2V0IDAg
LTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gICAgLW1vei1ib3gtc2l6aW5nOiBib3Jk
ZXItYm94OwotICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIC1vLWJveC1zaXpp
bmc6IGJvcmRlci1ib3g7Ci0gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICAtd2Via2l0
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBh
bnRpYWxpYXNlZDsKLSAgICAtbXMtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwotICAgIC1v
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgICBmb250LXNtb290aGluZzogYW50aWFs
aWFzZWQ7Ci19Ci0KLSNuZXctdG9kbyB7Ci0gICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggNjBw
eDsKLSAgICBib3JkZXI6IG5vbmU7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAy
KTsKLSAgICB6LWluZGV4OiAyOwotICAgIGJveC1zaGFkb3c6IG5vbmU7Ci19Ci0KLSNtYWluIHsK
LSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgei1pbmRleDogMjsKLSAgICBib3JkZXItdG9w
OiAxcHggZG90dGVkICNhZGFkYWQ7Ci19Ci0KLWxhYmVsW2Zvcj0ndG9nZ2xlLWFsbCddIHsKLSAg
ICBkaXNwbGF5OiBub25lOwotfQotCi0jdG9nZ2xlLWFsbCB7Ci0gICAgcG9zaXRpb246IGFic29s
dXRlOwotICAgIHRvcDogLTQycHg7Ci0gICAgbGVmdDogLTRweDsKLSAgICB3aWR0aDogNDBweDsK
LSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgLyogTW9iaWxlIFNhZmFyaSAqLwotICAgIGJv
cmRlcjogbm9uZTsKLX0KLQotI3RvZ2dsZS1hbGw6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnwrsn
OwotICAgIGZvbnQtc2l6ZTogMjhweDsKLSAgICBjb2xvcjogI2Q5ZDlkOTsKLSAgICBwYWRkaW5n
OiAwIDI1cHggN3B4OwotfQotCi0jdG9nZ2xlLWFsbDpjaGVja2VkOmJlZm9yZSB7Ci0gICAgY29s
b3I6ICM3MzczNzM7Ci19Ci0KLSN0b2RvLWxpc3QgewotICAgIG1hcmdpbjogMDsKLSAgICBwYWRk
aW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgewotICAg
IHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBmb250LXNpemU6IDI0cHg7Ci0gICAgYm9yZGVyLWJv
dHRvbTogMXB4IGRvdHRlZCAjY2NjOwotfQotCi0jdG9kby1saXN0IGxpOmxhc3QtY2hpbGQgewot
ICAgIGJvcmRlci1ib3R0b206IG5vbmU7Ci19Ci0KLSN0b2RvLWxpc3QgbGkuZWRpdGluZyB7Ci0g
ICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKLSAgICBwYWRkaW5nOiAwOwotfQotCi0jdG9kby1saXN0
IGxpLmVkaXRpbmcgLmVkaXQgewotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHdpZHRoOiA1MDZw
eDsKLSAgICBwYWRkaW5nOiAxM3B4IDE3cHggMTJweCAxN3B4OwotICAgIG1hcmdpbjogMCAwIDAg
NDNweDsKLX0KLQotI3RvZG8tbGlzdCBsaS5lZGl0aW5nIC52aWV3IHsKLSAgICBkaXNwbGF5OiBu
b25lOwotfQotCi0jdG9kby1saXN0IGxpIC50b2dnbGUgewotICAgIHRleHQtYWxpZ246IGNlbnRl
cjsKLSAgICB3aWR0aDogNDBweDsKLSAgICAvKiBhdXRvLCBzaW5jZSBub24tV2ViS2l0IGJyb3dz
ZXJzIGRvZXNuJ3Qgc3VwcG9ydCBpbnB1dCBzdHlsaW5nICovCi0gICAgaGVpZ2h0OiBhdXRvOwot
ICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IDA7Ci0gICAgYm90dG9tOiAwOwotICAg
IG1hcmdpbjogYXV0byAwOwotICAgIC8qIE1vYmlsZSBTYWZhcmkgKi8KLSAgICBib3JkZXI6IG5v
bmU7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICAgIC1tcy1hcHBlYXJhbmNlOiBu
b25lOwotICAgIC1vLWFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgYXBwZWFyYW5jZTogbm9uZTsKLX0K
LQotI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmFmdGVyIHsKLSAgICBjb250ZW50OiAn4pyUJzsKLSAg
ICAvKiA0MCArIGEgY291cGxlIG9mIHBpeGVscyB2aXN1YWwgYWRqdXN0bWVudCAqLwotICAgIGxp
bmUtaGVpZ2h0OiA0M3B4OwotICAgIGZvbnQtc2l6ZTogMjBweDsKLSAgICBjb2xvcjogI2Q5ZDlk
OTsKLSAgICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgI2JmYmZiZjsKLX0KLQotI3RvZG8tbGlzdCBs
aSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgewotICAgIGNvbG9yOiAjODVhZGE3OwotICAgIHRleHQt
c2hhZG93OiAwIDFweCAwICM2Njk5OTE7Ci0gICAgYm90dG9tOiAxcHg7Ci0gICAgcG9zaXRpb246
IHJlbGF0aXZlOwotfQotCi0jdG9kby1saXN0IGxpIGxhYmVsIHsKLSAgICB3aGl0ZS1zcGFjZTog
cHJlOwotICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ci0gICAgcGFkZGluZzogMTVweCA2MHB4
IDE1cHggMTVweDsKLSAgICBtYXJnaW4tbGVmdDogNDVweDsKLSAgICBkaXNwbGF5OiBibG9jazsK
LSAgICBsaW5lLWhlaWdodDogMS4yOwotICAgIC13ZWJraXQtdHJhbnNpdGlvbjogY29sb3IgMC40
czsKLSAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjRzOwotfQotCi0jdG9kby1saXN0IGxpLmNvbXBs
ZXRlZCBsYWJlbCB7Ci0gICAgY29sb3I6ICNhOWE5YTk7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBs
aW5lLXRocm91Z2g7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgLmRlc3Ryb3kgewotICAgIGRpc3BsYXk6
IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHRvcDogMDsKLSAgICByaWdodDog
MTBweDsKLSAgICBib3R0b206IDA7Ci0gICAgd2lkdGg6IDQwcHg7Ci0gICAgaGVpZ2h0OiA0MHB4
OwotICAgIG1hcmdpbjogYXV0byAwOwotICAgIGZvbnQtc2l6ZTogMjJweDsKLSAgICBjb2xvcjog
I2E4OGE4YTsKLSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjJzOwotICAgIHRyYW5zaXRp
b246IGFsbCAwLjJzOwotfQotCi0jdG9kby1saXN0IGxpIC5kZXN0cm95OmhvdmVyIHsKLSAgICB0
ZXh0LXNoYWRvdzogMCAwIDFweCAjMDAwLAotICAgICAgICAgICAgICAgICAwIDAgMTBweCByZ2Jh
KDE5OSwgMTA3LCAxMDcsIDAuOCk7Ci0gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7
Ci0gICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4zKTsKLSAgICB0cmFuc2Zvcm06IHNjYWxlKDEu
Myk7Ci19Ci0KLSN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfi
nJYnOwotfQotCi0jdG9kby1saXN0IGxpOmhvdmVyIC5kZXN0cm95IHsKLSAgICBkaXNwbGF5OiBi
bG9jazsKLX0KLQotI3RvZG8tbGlzdCBsaSAuZWRpdCB7Ci0gICAgZGlzcGxheTogbm9uZTsKLX0K
LQotI3RvZG8tbGlzdCBsaS5lZGl0aW5nOmxhc3QtY2hpbGQgewotICAgIG1hcmdpbi1ib3R0b206
IC0xcHg7Ci19Ci0KLSNmb290ZXIgewotICAgIGNvbG9yOiAjNzc3OwotICAgIHBhZGRpbmc6IDAg
MTVweDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgcmlnaHQ6IDA7Ci0gICAgYm90dG9t
OiAtMzFweDsKLSAgICBsZWZ0OiAwOwotICAgIGhlaWdodDogMjBweDsKLSAgICB6LWluZGV4OiAx
OwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotI2Zvb3RlcjpiZWZvcmUgewotICAgIGNv
bnRlbnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICByaWdodDogMDsKLSAgICBi
b3R0b206IDMxcHg7Ci0gICAgbGVmdDogMDsKLSAgICBoZWlnaHQ6IDUwcHg7Ci0gICAgei1pbmRl
eDogLTE7Ci0gICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4zKSwKLSAg
ICAgICAgICAgICAgICAwIDZweCAwIC0zcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpLAotICAg
ICAgICAgICAgICAgIDAgN3B4IDFweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwKLSAgICAgICAg
ICAgICAgICAwIDQzcHggMCAtNnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSwKLSAgICAgICAg
ICAgICAgICAwIDQ0cHggMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpOwotfQotCi0jdG9kby1j
b3VudCB7Ci0gICAgZmxvYXQ6IGxlZnQ7Ci0gICAgdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotI2Zp
bHRlcnMgewotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotICAgIGxpc3Qtc3R5bGU6
IG5vbmU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHJpZ2h0OiAwOwotICAgIGxlZnQ6
IDA7Ci19Ci0KLSNmaWx0ZXJzIGxpIHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci19Ci0KLSNmaWx0
ZXJzIGxpIGEgewotICAgIGNvbG9yOiAjODM3NTZmOwotICAgIG1hcmdpbjogMnB4OwotICAgIHRl
eHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI2ZpbHRlcnMgbGkgYS5zZWxlY3RlZCB7Ci0gICAg
Zm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLSNjbGVhci1jb21wbGV0ZWQgewotICAgIGZsb2F0OiBy
aWdodDsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0g
ICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwg
MC4xKTsKLSAgICBmb250LXNpemU6IDExcHg7Ci0gICAgcGFkZGluZzogMCAxMHB4OwotICAgIGJv
cmRlci1yYWRpdXM6IDNweDsKLSAgICBib3gtc2hhZG93OiAwIC0xcHggMCAwIHJnYmEoMCwgMCwg
MCwgMC4yKTsKLX0KLQotI2NsZWFyLWNvbXBsZXRlZDpob3ZlciB7Ci0gICAgYmFja2dyb3VuZDog
cmdiYSgwLCAwLCAwLCAwLjE1KTsKLSAgICBib3gtc2hhZG93OiAwIC0xcHggMCAwIHJnYmEoMCwg
MCwgMCwgMC4zKTsKLX0KLQotI2luZm8gewotICAgIG1hcmdpbjogNjVweCBhdXRvIDA7Ci0gICAg
Y29sb3I6ICNhNmE2YTY7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotICAgIHRleHQtc2hhZG93OiAw
IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7
Ci19Ci0KLSNpbmZvIGEgewotICAgIGNvbG9yOiBpbmhlcml0OwotfQotCi0vKgotICAgIEhhY2sg
dG8gcmVtb3ZlIGJhY2tncm91bmQgZnJvbSBNb2JpbGUgU2FmYXJpLgotICAgIENhbid0IHVzZSBp
dCBnbG9iYWxseSBzaW5jZSBpdCBkZXN0cm95cyBjaGVja2JveGVzIGluIEZpcmVmb3ggYW5kIE9w
ZXJhCi0qLwotCi1AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJh
dGlvOjApIHsKLSAgICAjdG9nZ2xlLWFsbCwKLSAgICAjdG9kby1saXN0IGxpIC50b2dnbGUgewot
ICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwotICAgIH0KLQotICAgICN0b2RvLWxpc3QgbGkgLnRv
Z2dsZSB7Ci0gICAgICAgIGhlaWdodDogNDBweDsKLSAgICB9Ci0KLSAgICAjdG9nZ2xlLWFsbCB7
Ci0gICAgICAgIHRvcDogLTU2cHg7Ci0gICAgICAgIGxlZnQ6IC0xNXB4OwotICAgICAgICB3aWR0
aDogNjVweDsKLSAgICAgICAgaGVpZ2h0OiA0MXB4OwotICAgICAgICAtd2Via2l0LXRyYW5zZm9y
bTogcm90YXRlKDkwZGVnKTsKLSAgICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsK
LSAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwotICAgICAgICAtd2Via2l0LWFwcGVh
cmFuY2U6IG5vbmU7Ci0gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7Ci0gICAgfQotfQotCi0uaGlk
ZGVuIHsKLSAgICBkaXNwbGF5OiBub25lOwotfQotCi1ociB7Ci0gICAgbWFyZ2luOiAyMHB4IDA7
Ci0gICAgYm9yZGVyOiAwOwotICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI0M1QzVDNTsKLSAg
ICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkICNGN0Y3Rjc7Ci19Ci0KLS5sZWFybiBhIHsKLSAg
ICBmb250LXdlaWdodDogbm9ybWFsOwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBj
b2xvcjogI2I4M2Y0NTsKLX0KLQotLmxlYXJuIGE6aG92ZXIgewotICAgIHRleHQtZGVjb3JhdGlv
bjogdW5kZXJsaW5lOwotICAgIGNvbG9yOiAjNzg3ZTdlOwotfQotCi0ubGVhcm4gaDMsCi0ubGVh
cm4gaDQsCi0ubGVhcm4gaDUgewotICAgIG1hcmdpbjogMTBweCAwOwotICAgIGZvbnQtd2VpZ2h0
OiA1MDA7Ci0gICAgbGluZS1oZWlnaHQ6IDEuMjsKLSAgICBjb2xvcjogIzAwMDsKLX0KLQotLmxl
YXJuIGgzIHsKLSAgICBmb250LXNpemU6IDI0cHg7Ci19Ci0KLS5sZWFybiBoNCB7Ci0gICAgZm9u
dC1zaXplOiAxOHB4OwotfQotCi0ubGVhcm4gaDUgewotICAgIG1hcmdpbi1ib3R0b206IDA7Ci0g
ICAgZm9udC1zaXplOiAxNHB4OwotfQotCi0ubGVhcm4gdWwgewotICAgIHBhZGRpbmc6IDA7Ci0g
ICAgbWFyZ2luOiAwIDAgMzBweCAyNXB4OwotfQotCi0ubGVhcm4gbGkgewotICAgIGxpbmUtaGVp
Z2h0OiAyMHB4OwotfQotCi0ubGVhcm4gcCB7Ci0gICAgZm9udC1zaXplOiAxNXB4OwotICAgIGZv
bnQtd2VpZ2h0OiAzMDA7Ci0gICAgbGluZS1oZWlnaHQ6IDEuMzsKLSAgICBtYXJnaW4tdG9wOiAw
OwotICAgIG1hcmdpbi1ib3R0b206IDA7Ci19Ci0KLS5xdW90ZSB7Ci0gICAgYm9yZGVyOiBub25l
OwotICAgIG1hcmdpbjogMjBweCAwIDYwcHggMDsKLX0KLQotLnF1b3RlIHAgewotICAgIGZvbnQt
c3R5bGU6IGl0YWxpYzsKLX0KLQotLnF1b3RlIHA6YmVmb3JlIHsKLSAgICBjb250ZW50OiAn4oCc
JzsKLSAgICBmb250LXNpemU6IDUwcHg7Ci0gICAgb3BhY2l0eTogLjE1OwotICAgIHBvc2l0aW9u
OiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0yMHB4OwotICAgIGxlZnQ6IDNweDsKLX0KLQotLnF1b3Rl
IHA6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICfigJ0nOwotICAgIGZvbnQtc2l6ZTogNTBweDsKLSAg
ICBvcGFjaXR5OiAuMTU7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQy
cHg7Ci0gICAgcmlnaHQ6IDNweDsKLX0KLQotLnF1b3RlIGZvb3RlciB7Ci0gICAgcG9zaXRpb246
IGFic29sdXRlOwotICAgIGJvdHRvbTogLTQwcHg7Ci0gICAgcmlnaHQ6IDA7Ci19Ci0KLS5xdW90
ZSBmb290ZXIgaW1nIHsKLSAgICBib3JkZXItcmFkaXVzOiAzcHg7Ci19Ci0KLS5xdW90ZSBmb290
ZXIgYSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDVweDsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxl
OwotfQotCi0uc3BlZWNoLWJ1YmJsZSB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIHBh
ZGRpbmc6IDEwcHg7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMDQpOwotICAgIGJv
cmRlci1yYWRpdXM6IDVweDsKLX0KLQotLnNwZWVjaC1idWJibGU6YWZ0ZXIgewotICAgIGNvbnRl
bnQ6ICcnOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IDEwMCU7Ci0gICAgcmln
aHQ6IDMwcHg7Ci0gICAgYm9yZGVyOiAxM3B4IHNvbGlkIHRyYW5zcGFyZW50OwotICAgIGJvcmRl
ci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjA0KTsKLX0KLQotLmxlYXJuLWJhciA+IC5sZWFy
biB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIHdpZHRoOiAyNzJweDsKLSAgICB0b3A6
IDhweDsKLSAgICBsZWZ0OiAtMzAwcHg7Ci0gICAgcGFkZGluZzogMTBweDsKLSAgICBib3JkZXIt
cmFkaXVzOiA1cHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAu
Nik7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBsZWZ0OwotICAgIHRyYW5zaXRp
b24tcHJvcGVydHk6IGxlZnQ7Ci0gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBt
czsKLSAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA1MDBtczsKLX0KLQotQG1lZGlhIChtaW4td2lk
dGg6IDg5OXB4KSB7Ci0gICAgLmxlYXJuLWJhciB7Ci0gICAgICAgIHdpZHRoOiBhdXRvOwotICAg
ICAgICBtYXJnaW46IDAgMCAwIDMwMHB4OwotICAgIH0KLQotICAgIC5sZWFybi1iYXIgPiAubGVh
cm4gewotICAgICAgICBsZWZ0OiA4cHg7Ci0gICAgfQotCi0gICAgLmxlYXJuLWJhciAjdG9kb2Fw
cCB7Ci0gICAgICAgIHdpZHRoOiA1NTBweDsKLSAgICAgICAgbWFyZ2luOiAxMzBweCBhdXRvIDQw
cHggYXV0bzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2Vy
X2NvbXBvbmVudHMvdG9kb212Yy1jb21tb24vYmFzZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
Ym93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAzNjhlNWVhMDNhNjFhZDM2Njc5YzE1ZWEwYWY2NDg5MTM3MWRiOWVhLi4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvYm93ZXJfY29tcG9uZW50cy90b2RvbXZjLWNvbW1vbi9iYXNlLmpzCisrKyAvZGV2
L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLShmdW5jdGlvbiAoKSB7Ci0gICAgJ3VzZSBzdHJpY3Qn
OwotCi0gICAgLy8gVW5kZXJzY29yZSdzIFRlbXBsYXRlIE1vZHVsZQotICAgIC8vIENvdXJ0ZXN5
IG9mIHVuZGVyc2NvcmVqcy5vcmcKLSAgICB2YXIgXyA9IChmdW5jdGlvbiAoXykgewotICAgICAg
ICBfLmRlZmF1bHRzID0gZnVuY3Rpb24gKG9iamVjdCkgewotICAgICAgICAgICAgaWYgKCFvYmpl
Y3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgZm9yICh2YXIgYXJnc0luZGV4ID0gMSwgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5s
ZW5ndGg7IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGg7IGFyZ3NJbmRleCsrKSB7Ci0gICAgICAgICAg
ICAgICAgdmFyIGl0ZXJhYmxlID0gYXJndW1lbnRzW2FyZ3NJbmRleF07Ci0gICAgICAgICAgICAg
ICAgaWYgKGl0ZXJhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBp
dGVyYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldID09IG51
bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IGl0ZXJhYmxl
W2tleV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2Jq
ZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2Vz
IEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCi0gICAgICAgIC8vIGZv
bGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4K
LSAgICAgICAgXy50ZW1wbGF0ZVNldHRpbmdzID0gewotICAgICAgICAgICAgZXZhbHVhdGUgICAg
OiAvPCUoW1xzXFNdKz8pJT4vZywKLSAgICAgICAgICAgIGludGVycG9sYXRlIDogLzwlPShbXHNc
U10rPyklPi9nLAotICAgICAgICAgICAgZXNjYXBlICAgICAgOiAvPCUtKFtcc1xTXSs/KSU+L2cK
LSAgICAgICAgfTsKLQotICAgICAgICAvLyBXaGVuIGN1c3RvbWl6aW5nIGB0ZW1wbGF0ZVNldHRp
bmdzYCwgaWYgeW91IGRvbid0IHdhbnQgdG8gZGVmaW5lIGFuCi0gICAgICAgIC8vIGludGVycG9s
YXRpb24sIGV2YWx1YXRpb24gb3IgZXNjYXBpbmcgcmVnZXgsIHdlIG5lZWQgb25lIHRoYXQgaXMK
LSAgICAgICAgLy8gZ3VhcmFudGVlZCBub3QgdG8gbWF0Y2guCi0gICAgICAgIHZhciBub01hdGNo
ID0gLyguKV4vOwotCi0gICAgICAgIC8vIENlcnRhaW4gY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVz
Y2FwZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBwdXQgaW50byBhCi0gICAgICAgIC8vIHN0cmluZyBs
aXRlcmFsLgotICAgICAgICB2YXIgZXNjYXBlcyA9IHsKLSAgICAgICAgICAgICInIjogICAgICAi
JyIsCi0gICAgICAgICAgICAnXFwnOiAgICAgJ1xcJywKLSAgICAgICAgICAgICdccic6ICAgICAn
cicsCi0gICAgICAgICAgICAnXG4nOiAgICAgJ24nLAotICAgICAgICAgICAgJ1x0JzogICAgICd0
JywKLSAgICAgICAgICAgICdcdTIwMjgnOiAndTIwMjgnLAotICAgICAgICAgICAgJ1x1MjAyOSc6
ICd1MjAyOScKLSAgICAgICAgfTsKLQotICAgICAgICB2YXIgZXNjYXBlciA9IC9cXHwnfFxyfFxu
fFx0fFx1MjAyOHxcdTIwMjkvZzsKLQotICAgICAgICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBs
YXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLgotICAgICAgICAv
LyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJl
c2VydmVzIHdoaXRlc3BhY2UsCi0gICAgICAgIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90
ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLgotICAgICAgICBfLnRlbXBsYXRlID0gZnVuY3Rp
b24odGV4dCwgZGF0YSwgc2V0dGluZ3MpIHsKLSAgICAgICAgICAgIHZhciByZW5kZXI7Ci0gICAg
ICAgICAgICBzZXR0aW5ncyA9IF8uZGVmYXVsdHMoe30sIHNldHRpbmdzLCBfLnRlbXBsYXRlU2V0
dGluZ3MpOwotCi0gICAgICAgICAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVn
dWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi4KLSAgICAgICAgICAgIHZhciBtYXRjaGVy
ID0gbmV3IFJlZ0V4cChbCi0gICAgICAgICAgICAgICAgKHNldHRpbmdzLmVzY2FwZSB8fCBub01h
dGNoKS5zb3VyY2UsCi0gICAgICAgICAgICAgICAgKHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5v
TWF0Y2gpLnNvdXJjZSwKLSAgICAgICAgICAgICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9N
YXRjaCkuc291cmNlCi0gICAgICAgICAgICBdLmpvaW4oJ3wnKSArICd8JCcsICdnJyk7Ci0KLSAg
ICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHRlbXBsYXRlIHNvdXJjZSwgZXNjYXBpbmcgc3RyaW5n
IGxpdGVyYWxzIGFwcHJvcHJpYXRlbHkuCi0gICAgICAgICAgICB2YXIgaW5kZXggPSAwOwotICAg
ICAgICAgICAgdmFyIHNvdXJjZSA9ICJfX3ArPSciOwotICAgICAgICAgICAgdGV4dC5yZXBsYWNl
KG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwg
b2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9m
ZnNldCkKLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoZXNjYXBlciwgZnVuY3Rpb24obWF0
Y2gpIHsgcmV0dXJuICdcXCcgKyBlc2NhcGVzW21hdGNoXTsgfSk7Ci0KLSAgICAgICAgICAgICAg
ICBpZiAoZXNjYXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJytcbigoX190
PSgiICsgZXNjYXBlICsgIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZSkgewotICAgICAgICAg
ICAgICAgICAgICBzb3VyY2UgKz0gIicrXG4oKF9fdD0oIiArIGludGVycG9sYXRlICsgIikpPT1u
dWxsPycnOl9fdCkrXG4nIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYg
KGV2YWx1YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSArPSAiJztcbiIgKyBldmFs
dWF0ZSArICJcbl9fcCs9JyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlu
ZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoOwotICAgICAgICAgICAgICAgIHJldHVybiBtYXRj
aDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgc291cmNlICs9ICInO1xuIjsKLQotICAg
ICAgICAgICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZh
bHVlcyBpbiBsb2NhbCBzY29wZS4KLSAgICAgICAgICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUp
IHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xuJyArIHNvdXJjZSArICd9XG4nOwotCi0gICAgICAg
ICAgICBzb3VyY2UgPSAidmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLCIg
KwotICAgICAgICAgICAgICAgICJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1l
bnRzLCcnKTt9O1xuIiArCi0gICAgICAgICAgICAgICAgc291cmNlICsgInJldHVybiBfX3A7XG4i
OwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlbmRlciA9IG5ldyBGdW5j
dGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpOwotICAgICAgICAg
ICAgfSBjYXRjaCAoZSkgewotICAgICAgICAgICAgICAgIGUuc291cmNlID0gc291cmNlOwotICAg
ICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChk
YXRhKSByZXR1cm4gcmVuZGVyKGRhdGEsIF8pOwotICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0g
ZnVuY3Rpb24oZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIuY2FsbCh0aGlz
LCBkYXRhLCBfKTsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhl
IGNvbXBpbGVkIGZ1bmN0aW9uIHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxh
dGlvbi4KLSAgICAgICAgICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgKHNldHRp
bmdzLnZhcmlhYmxlIHx8ICdvYmonKSArICcpe1xuJyArIHNvdXJjZSArICd9JzsKLQotICAgICAg
ICAgICAgcmV0dXJuIHRlbXBsYXRlOwotICAgICAgICB9OwotCi0gICAgICAgIHJldHVybiBfOwot
ICAgIH0pKHt9KTsKLQotICAgIGlmIChsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ3RvZG9tdmMuY29t
JykgewotICAgICAgICB3aW5kb3cuX2dhcSA9IFtbJ19zZXRBY2NvdW50JywnVUEtMzEwODEwNjIt
MSddLFsnX3RyYWNrUGFnZXZpZXcnXV07KGZ1bmN0aW9uKGQsdCl7dmFyIGc9ZC5jcmVhdGVFbGVt
ZW50KHQpLHM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXTtnLnNyYz0nLy93d3cuZ29vZ2xl
LWFuYWx5dGljcy5jb20vZ2EuanMnO3MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxzKX0oZG9j
dW1lbnQsJ3NjcmlwdCcpKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWRpcmVjdCgpIHsKLSAg
ICAgICAgaWYgKGxvY2F0aW9uLmhvc3RuYW1lID09PSAndGFzdGVqcy5naXRodWIuaW8nKSB7Ci0g
ICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKCd0YXN0ZWpz
LmdpdGh1Yi5pby90b2RvbXZjJywgJ3RvZG9tdmMuY29tJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBmdW5jdGlvbiBmaW5kUm9vdCgpIHsKLSAgICAgICAgdmFyIGJhc2U7Ci0KLSAgICAgICAg
Wy9sYWJzLywgL1x3Ki1leGFtcGxlcy9dLmZvckVhY2goZnVuY3Rpb24gKGhyZWYpIHsKLSAgICAg
ICAgICAgIHZhciBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goaHJlZik7Ci0KLSAgICAgICAg
ICAgIGlmICghYmFzZSAmJiBtYXRjaCkgewotICAgICAgICAgICAgICAgIGJhc2UgPSBsb2NhdGlv
bi5ocmVmLmluZGV4T2YobWF0Y2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAg
ICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5zdWJzdHIoMCwgYmFzZSk7Ci0gICAgfQotCi0gICAg
ZnVuY3Rpb24gZ2V0RmlsZShmaWxlLCBjYWxsYmFjaykgewotICAgICAgICBpZiAoIWxvY2F0aW9u
Lmhvc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmluZm8oJ01pc3MgdGhlIGluZm8g
YmFyPyBSdW4gVG9kb01WQyBmcm9tIGEgc2VydmVyIHRvIGF2b2lkIGEgY3Jvc3Mtb3JpZ2luIGVy
cm9yLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVz
dCgpOwotCi0gICAgICAgIHhoci5vcGVuKCdHRVQnLCBmaW5kUm9vdCgpICsgZmlsZSwgdHJ1ZSk7
Ci0gICAgICAgIHhoci5zZW5kKCk7Ci0KLSAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgp
IHsKLSAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgY2FsbGJhY2spIHsKLSAg
ICAgICAgICAgICAgICBjYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBMZWFybihsZWFybkpTT04sIGNvbmZp
ZykgewotICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGVhcm4pKSB7Ci0gICAgICAgICAg
ICByZXR1cm4gbmV3IExlYXJuKGxlYXJuSlNPTiwgY29uZmlnKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIHZhciB0ZW1wbGF0ZSwgZnJhbWV3b3JrOwotCi0gICAgICAgIGlmICh0eXBlb2YgbGVhcm5K
U09OICE9PSAnb2JqZWN0JykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBs
ZWFybkpTT04gPSBKU09OLnBhcnNlKGxlYXJuSlNPTik7Ci0gICAgICAgICAgICB9IGNhdGNoIChl
KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGNvbmZpZykgewotICAgICAgICAgICAgdGVtcGxhdGUgPSBjb25maWcudGVt
cGxhdGU7Ci0gICAgICAgICAgICBmcmFtZXdvcmsgPSBjb25maWcuZnJhbWV3b3JrOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCF0ZW1wbGF0ZSAmJiBsZWFybkpTT04udGVtcGxhdGVzKSB7Ci0g
ICAgICAgICAgICB0ZW1wbGF0ZSA9IGxlYXJuSlNPTi50ZW1wbGF0ZXMudG9kb212YzsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICghZnJhbWV3b3JrICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Io
J1tkYXRhLWZyYW1ld29ya10nKSkgewotICAgICAgICAgICAgZnJhbWV3b3JrID0gZG9jdW1lbnQu
cXVlcnlTZWxlY3RvcignW2RhdGEtZnJhbWV3b3JrXScpLmdldEF0dHJpYnV0ZSgnZGF0YS1mcmFt
ZXdvcmsnKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKHRlbXBsYXRlICYmIGxlYXJuSlNP
TltmcmFtZXdvcmtdKSB7Ci0gICAgICAgICAgICB0aGlzLmZyYW1ld29ya0pTT04gPSBsZWFybkpT
T05bZnJhbWV3b3JrXTsKLSAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLQot
ICAgICAgICAgICAgdGhpcy5hcHBlbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExlYXJu
LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciBhc2lkZSA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FzaWRlJyk7Ci0gICAgICAgIGFzaWRlLmlubmVySFRNTCA9
IF8udGVtcGxhdGUodGhpcy50ZW1wbGF0ZSwgdGhpcy5mcmFtZXdvcmtKU09OKTsKLSAgICAgICAg
YXNpZGUuY2xhc3NOYW1lID0gJ2xlYXJuJzsKLQotICAgICAgICAvLyBMb2NhbGl6ZSBkZW1vIGxp
bmtzCi0gICAgICAgIHZhciBkZW1vTGlua3MgPSBhc2lkZS5xdWVyeVNlbGVjdG9yQWxsKCcuZGVt
by1saW5rJyk7Ci0gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZGVtb0xpbmtz
LCBmdW5jdGlvbiAoZGVtb0xpbmspIHsKLSAgICAgICAgICAgIGRlbW9MaW5rLnNldEF0dHJpYnV0
ZSgnaHJlZicsIGZpbmRSb290KCkgKyBkZW1vTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7Ci0g
ICAgICAgIH0pOwotCi0gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lID0gKGRvY3VtZW50
LmJvZHkuY2xhc3NOYW1lICsgJyBsZWFybi1iYXInKS50cmltKCk7Ci0gICAgICAgIGRvY3VtZW50
LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlckJlZ2luJywgYXNpZGUub3V0ZXJIVE1MKTsK
LSAgICB9OwotCi0gICAgcmVkaXJlY3QoKTsKLSAgICBnZXRGaWxlKCdsZWFybi5qc29uJywgTGVh
cm4pOwotfSkoKTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYm93ZXJfY29tcG9u
ZW50cy90b2RvbXZjLWNvbW1vbi9iZy5wbmcgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Jvd2VyX2Nv
bXBvbmVudHMvdG9kb212Yy1jb21tb24vYmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBiMmE3NjAwODI1ZWUxMWYyMTg0OWVkNDc1NDk5YzdkMWVjYmNjODcwLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCkdJVCBiaW5hcnkgcGF0Y2gKbGl0ZXJhbCAw
CkhjbVY/ZDAwMDAxCgpsaXRlcmFsIDIxMjYKemNtVi1VMihrQnhQKTxoOzNLfExrMDAwZTFOSkxU
cTAwM2tGMDAza0gwe3tSMzRVQiFxMDAwMENQKXQtcz8oWGpFCno+Kzl5YD1ISzdudD1+M3QwMDBP
NU5rbDxaY3dUanUoUTR2fjdLV0VXI1ltP2xLX3Y7VG18IUZjKUBOd0VubXRzaAp6eCFPfno4MUpU
M3BGc20+bT0wNGhWYV9sWGxfYm09K007PWVJPCUkck8ydGFgc3VoKlNyI1BPdyo/YWRxIU8hQ1YK
eiowJmIpcmtDQ0VWKTFuSXVpTEJudFVILU1KSTsmcVlnenxkQE5obm5fYWJpMmdgcHU0TkFNVmlk
M2hTJT9xdXp+CnpqbEpmKHg4Y2o8UEdjam4qSitheyZINXAqbjUkNWUzPzxLQ2M/bzA2bUFzTlNi
Z1BXTz9QeiNDem48IT17PntWUwp6VVZFUDFtc2c5YF5PRlVoU081cnRYSGhSbHlVMmk+NiRCVD1n
bEdge0psY3RHSHJ3UkltKTZCdXU2NWpMUW5eSDgKenZsOWxacVVCQSslcXZNNVhDK3lZQG1mQShZ
Qn5YUD1lfDY8eyUkXmVVOG5ySz92MmNjYkBKb201Q0c+cktBTDdKCnpwbEhFSWF2VnB8MHAxJm0h
R2BUaT88N2laO31ARzcjWil9S20lMiFGSG5RMComP1BMUilHIUhBYUhnVSNjfCRkegp6cGojMEht
ZWFkSWU+YCMpPUpqa2J7Qj1GS25VM3BjLSZZQGpfajYoaDRZfitVcTxQVTM2Qzs1Yj1NXkZgPXAx
ZEkKems8Q1FPUE5hNz4hXko9TEh1bngxeGk0UVhLLVl7Jk1vVDhreTZWYjljfFdobk93Rn5jPTN6
T3k4YWdrdGxpUzYjCnpgIzhGYDlIKUQ9Ym1rOUI1TW5XJl9yIylmJGMrOyRMU3ItQF5BbjhkaGN+
SXF1dXY+ak9LN3B3N0xKOyZYMGkxQwp6R01zSGRQMU9zQG55JCRqIT5YQWlpJTdicDVrPmBweU5B
IX5lcGIpKClwOXpSNFlsNno9VX17Q0lkaDF6KEZwQW8KelFJVyE7MHpwQ3lDNCo3WUxrWkNPQGN1
bDBSXyZ6Z2hzQThFayl6JTwhcC1idnNzcGxZWTJ9UDshdjRDWWo5a21GCnpiMGJOX200VipmXlla
TW9iMihqM3BLan43diNadGtzPUlvK3tzdSVXaXVrZEpIJGI/ZlpraUE9UFlfM09oREJrbwp6KExU
UUhZJkZeXjJoRy1ZYCpaOTN2Yn5jPyooSmNoRGpUZkNzP3pSbSpgKk4qVi0kPT9RcXRoblNyKj9P
UzNzaksKem88X1VeZnt+YWc2MHVsPmpOcEthOTJ7QE5IK1NzdFglQH14QipKayFsfVBaMWNDbElu
c359NV4hUm5jVWsqcm1BCnolU0lWZ3Q1OEVReExKK09pRnE8eXU0ZU9EfDlMdDNkTnNlZnhPdXEp
RCYkXyVqMERncUN5MWd6Y3x0VEQzKm1lZQp6ez0lfDxgYH1fSHlwaE91ezspeGtSZytRbkhDQzNU
Zitrc3BxVjYqfFFLLVJjcUR9ND5La0J1d3F1eVpMVXB8Z3IKelBVYlViRmJCclBkMXhPYF5DKnIt
aTNwOSpGIyhPQmghNFd5QGFDJiohfE98R1hjakRBJlloRns7Y0Q3Km8oR1NeCnpAcFFTRTcpeF84
MT1ReWplNipMUSNUWHUtNyhvO1M4dTN0cERBPFNnY0tjS09wbUE7PUhCWlNAT0ZUQF9YT3Z4cQp6
Kk58M0tMeXRnekg2R1UmJlVvYzRaems0bHVtM1B7OT9mcEk0K1FHUEordjZgMWxmUnEzTGNTKihN
KldLK3xiJU8KemUkej4wX2RkaiVobUNzcGVYZGhZUn0taTlBPUNgRW9DaFVZdUh+XnghOSt8JihQ
Z2IqPkNrPD05anwpKkB4eWZUCnpwUCMrS3Q8fTM5YnwzV2w0ZnhUKCtHP2FIPmdHXmRATUVhVU9K
UmZ5NTVUdEZJN15ZKVZ1TVU9N1BwMHk1NWpTfgp6K1RKKWlnTXlycWtYO3dVOGo2OGlJRHRxSllo
U19EM19PZW0tQGc2bWVfUmZpUX11VF9LLUEtOXFHJX1nazNFOWMKeiE4YEtnc01OWG0pYmVsb1Bm
TXFsKnwmJE0+MXFgaSFjWSlSRlluak5ZdSpnU3ZAOFhlYlY3JX14WUw+NilHSlBKCnpKcEE3SzMx
bGNKdUlGS1N3LXt4NEZYMEsyQXopflhnPGBzT3UkNHxePE1DN0AreGJ3eHNHZ1R2SklBTGpQezY4
TAp6OEFZdVNHUzBHVWdrNldgdjRXO1J5KnVvRVRudWxQaXw1NzMlbHYqWnh3I3Y2eVVRXk1PZmNw
VCNWOFJJRFYjI04KekQxYCtBZW1zT2gpd2JXREV4VmNmcEt6KWp5Vj08fiZaWFBnNmN8WkRFN1U0
Yms8RF4+LSheWEpYNFl6b2lOUnZMCnp5dVk3fjI2dy1QXlp3JTZGfXNoQndWMiQwMmM4UnNTVXk2
ZE05MmRpQ0F4aVgzSVVxc3E1aWc2PlVfIVZ5KnE1JAp6am19MTZ0SnIrUVomVD9Ia2twZUl3Vlgt
cjFFST1AJVpsdDs2PHR3SDg2SUQ+ZyptaiZFIUEpKSVnWEo9eDZ1I2wKemNLRVA+Yng0cnFWKmtg
QkJyWiRNcWp0e1RzSGN4VUg+OylpQUt9QihLaWxhJlZEJWI/Nm0mXjBXSzReJkVaTkFJCno4QU1Z
c18lJEQlfE0rQCtjUXFMLWhpNHlHPmgqandkaWkhVzF7fXA+Wmh3Rll0XzRTdTFralk5PGJBWmp6
fjllawp6X0RpYXIrQWZKRlBfOUB5bVVvJEtXPjwtNWAhJFZOT0kxeShFRFNINFdwQ2lqRV8+YWwh
TnQ9XmVWRVIjdUoxPWIKejtCV0YySWd5RjVMZXhWK3llYyRLaW47QWlAbXlvO0c+ekomanJkVyNl
Y1hoSVpwaDVPWXF3X1BFZmNGNTY8TzE5CnpMKThyIUtNKClpZjBgQD9XNChKZGMpN1dvUEdeJj0k
PHpVc00rSENXYWtDXjN0WnhrK1BqUUd9Qj5aNTxaNlZ4dwp6QkBIclYkJmx+QFRhajcwcGNle2lT
dVJMc1VjekRZXzVUbkRxOFB5X1Ezd2hgRDghNGpLO3ZGZFJQK1EwPXpKeSoKenp1V2QlIWFpQER7
fCpKPEk7T0QmaSVse0pwLTgqUHUzVkdMV2l5azZ2I1htUXF3YC0rJWUkfENKdypAYDV6YjM8CnpF
fXojO2tSaEwmcTVQREc2QG1tKiQ+WnVfWlpFI3EzTWMrTiYxT143aG9oOVFSN2ArTCRjQlA1cHFH
PWZxQTB1aAp6VUJ1a2F4VEZtSCk8fFhidnAyYz1IU2JOa3BYdzczYTVsdjdWJGpiOTIjeVoxNDFA
JFg/Rn1KdDhnSVU3V202bTkKej9lXzs7enNubTZgTFplUD5UPSQpS3I+Wj9rcipVbUZxUjd6eDBD
Nl5ibWNzY0AxQUd0d19yTkg+LVhtJGQqfFE8CnpuJjFMbjB1Nz1sJklMcz4lQ2tKcGBEaUc5RjE4
eDROZStsZzwjaT9lN2pMJXg7NFpuUmtOXk14MDcqcW9NNk48JApFZig+ME4hMmtkTgoKZGlmZiAt
LWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvY3Jvc3Nkb21haW4ueG1sIGIvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9jcm9zc2RvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGMxNmE3YTA3YjM3ZTVkNWY3ZTBl
NTZjODI5ZjcyMDA2NzQ1ODQwMwotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvY3Jvc3Nkb21haW4ueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/
PgorPCFET0NUWVBFIGNyb3NzLWRvbWFpbi1wb2xpY3kgU1lTVEVNICJodHRwOi8vd3d3LmFkb2Jl
LmNvbS94bWwvZHRkcy9jcm9zcy1kb21haW4tcG9saWN5LmR0ZCI+Cis8Y3Jvc3MtZG9tYWluLXBv
bGljeT4KKyAgPCEtLSBSZWFkIHRoaXM6IHd3dy5hZG9iZS5jb20vZGV2bmV0L2FydGljbGVzL2Ny
b3NzZG9tYWluX3BvbGljeV9maWxlX3NwZWMuaHRtbCAtLT4KKworICA8IS0tIE1vc3QgcmVzdHJp
Y3RpdmUgcG9saWN5OiAtLT4KKyAgPHNpdGUtY29udHJvbCBwZXJtaXR0ZWQtY3Jvc3MtZG9tYWlu
LXBvbGljaWVzPSJub25lIi8+CisKKyAgPCEtLSBMZWFzdCByZXN0cmljdGl2ZSBwb2xpY3k6IC0t
PgorICA8IS0tCisgIDxzaXRlLWNvbnRyb2wgcGVybWl0dGVkLWNyb3NzLWRvbWFpbi1wb2xpY2ll
cz0iYWxsIi8+CisgIDxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49IioiIHRvLXBvcnRzPSIqIiBz
ZWN1cmU9ImZhbHNlIi8+CisgIDxhbGxvdy1odHRwLXJlcXVlc3QtaGVhZGVycy1mcm9tIGRvbWFp
bj0iKiIgaGVhZGVycz0iKiIgc2VjdXJlPSJmYWxzZSIvPgorICAtLT4KKzwvY3Jvc3MtZG9tYWlu
LXBvbGljeT4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbCBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvaW5kZXguaHRtbAppbmRleCAxNTkwOTc0ZWY5NjEzYTI4Nzk1NzM5
MGIxYWE4YTRkYTQ2Yzg5MDNhLi43ZTQ4YzE5OTI3ZDUxY2U0OGU4MzFhN2VlNWYwMTQzZjY2NjUw
NjRhIDEwMDY0NAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2luZGV4Lmh0bWwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9pbmRleC5odG1sCkBAIC0xLDc4ICsxLDI2IEBACi08IWRvY3R5cGUg
aHRtbD4KLTxodG1sIGxhbmc9ImVuIiBkYXRhLWZyYW1ld29yaz0iZW1iZXJqcyI+Ci0gICAgPGhl
YWQ+Ci0gICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KLSAgICAgICAgPHRpdGxlPmVtYmVy
LmpzIOKAoiBUb2RvTVZDPC90aXRsZT4KLSAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSJib3dlcl9jb21wb25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuY3NzIj4KLSAgICA8L2hl
YWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC94LWhhbmRsZWJhcnMi
IGRhdGEtdGVtcGxhdGUtbmFtZT0idG9kb3MiPgotICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InRv
ZG9hcHAiPgotICAgICAgICAgICAgICAgIDxoZWFkZXIgaWQ9ImhlYWRlciI+Ci0gICAgICAgICAg
ICAgICAgICAgIDxoMT50b2RvczwvaDE+Ci0gICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgaWQ9
Im5ldy10b2RvIiB0eXBlPSJ0ZXh0IiB2YWx1ZT1uZXdUaXRsZSBhY3Rpb249ImNyZWF0ZVRvZG8i
IHBsYWNlaG9sZGVyPSJXaGF0IG5lZWRzIHRvIGJlIGRvbmU/In19Ci0gICAgICAgICAgICAgICAg
PC9oZWFkZXI+Ci0gICAgICAgICAgICAgICAge3sjaWYgbGVuZ3RofX0KLSAgICAgICAgICAgICAg
ICAgICAgPHNlY3Rpb24gaWQ9Im1haW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlk
PSJ0b2RvLWxpc3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7I2VhY2ggZmlsdGVy
ZWRUb2RvcyBpdGVtQ29udHJvbGxlcj0idG9kbyJ9fQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA8bGkge3tiaW5kLWF0dHIgY2xhc3M9ImlzQ29tcGxldGVkOmNvbXBsZXRlZCBpc0Vk
aXRpbmc6ZWRpdGluZyJ9fT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7
I2lmIGlzRWRpdGluZ319Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
e3tlZGl0LXRvZG8gY2xhc3M9ImVkaXQiIHZhbHVlPWJ1ZmZlcmVkVGl0bGUgZm9jdXMtb3V0PSJk
b25lRWRpdGluZyIgaW5zZXJ0LW5ld2xpbmU9ImRvbmVFZGl0aW5nIiBlc2NhcGUtcHJlc3M9ImNh
bmNlbEVkaXRpbmcifX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxz
ZX19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbnB1dCB0eXBl
PSJjaGVja2JveCIgY2xhc3M9InRvZ2dsZSIgY2hlY2tlZD1pc0NvbXBsZXRlZH19Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHt7YWN0aW9uICJlZGl0VG9k
byIgb249ImRvdWJsZUNsaWNrIn19Pnt7dGl0bGV9fTwvbGFiZWw+Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB7e2FjdGlvbiAicmVtb3ZlVG9kbyJ9fSBj
bGFzcz0iZGVzdHJveSI+PC9idXR0b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB7ey9pZn19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7L2VhY2h9fQotICAgICAgICAgICAgICAgICAg
ICAgICAgPC91bD4KLSAgICAgICAgICAgICAgICAgICAgICAgIHt7aW5wdXQgdHlwZT0iY2hlY2ti
b3giIGlkPSJ0b2dnbGUtYWxsIiBjaGVja2VkPWFsbEFyZURvbmV9fQotICAgICAgICAgICAgICAg
ICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmb290ZXIgaWQ9ImZvb3RlciI+
Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57
e3JlbWFpbmluZy5sZW5ndGh9fTwvc3Ryb25nPiB7e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5n
Lmxlbmd0aH19IGxlZnQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dWwgaWQ9ImZp
bHRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAge3sjbGluay10byAidG9kb3MuaW5kZXgiIGFjdGl2ZUNsYXNzPSJz
ZWxlY3RlZCJ9fUFsbHt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwv
bGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rvcy5hY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxl
Y3RlZCJ9fUFjdGl2ZXt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwv
bGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB7eyNsaW5rLXRvICJ0b2Rvcy5jb21wbGV0ZWQiIGFjdGl2ZUNsYXNzPSJz
ZWxlY3RlZCJ9fUNvbXBsZXRlZHt7L2xpbmstdG99fQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAg
ICAgICAgICAge3sjaWYgY29tcGxldGVkLmxlbmd0aH19Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgPGJ1dHRvbiBpZD0iY2xlYXItY29tcGxldGVkIiB7e2FjdGlvbiAiY2xlYXJDb21wbGV0
ZWQifX0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsZWFyIGNvbXBsZXRlZCAo
e3tjb21wbGV0ZWQubGVuZ3RofX0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0
b24+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7ey9pZn19Ci0gICAgICAgICAgICAgICAgICAg
IDwvZm9vdGVyPgotICAgICAgICAgICAgICAgIHt7L2lmfX0KLSAgICAgICAgICAgIDwvc2VjdGlv
bj4KLSAgICAgICAgICAgIDxmb290ZXIgaWQ9ImluZm8iPgotICAgICAgICAgICAgICAgIDxwPkRv
dWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAg
ICAgICAgICAgICAgICAgQ3JlYXRlZCBieQotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJo
dHRwOi8vZ2l0aHViLmNvbS90b21kYWxlIj5Ub20gRGFsZTwvYT4sCi0gICAgICAgICAgICAgICAg
ICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5pPC9h
PgotICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICA8cD5QYXJ0IG9mIDxhIGhy
ZWY9Imh0dHA6Ly90b2RvbXZjLmNvbSI+VG9kb01WQzwvYT48L3A+Ci0gICAgICAgICAgICA8L2Zv
b3Rlcj4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgc3JjPSJib3dlcl9jb21w
b25lbnRzL3RvZG9tdmMtY29tbW9uL2Jhc2UuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0
IHNyYz0iYm93ZXJfY29tcG9uZW50cy9qcXVlcnkvanF1ZXJ5LmpzIj48L3NjcmlwdD4KLSAgICAg
ICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvaGFuZGxlYmFycy9oYW5kbGViYXJzLmpz
Ij48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvZW1iZXIv
ZW1iZXIuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50
cy9lbWJlci1kYXRhL2VtYmVyLWRhdGEuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNy
Yz0iYm93ZXJfY29tcG9uZW50cy9lbWJlci1sb2NhbHN0b3JhZ2UtYWRhcHRlci9sb2NhbHN0b3Jh
Z2VfYWRhcHRlci5qcyI+PC9zY3JpcHQ+Ci0gICAgICAgIDxzY3JpcHQgc3JjPSJqcy9hcHAuanMi
Pjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvcm91dGVyLmpzIj48L3NjcmlwdD4K
LSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL21vZGVscy90b2RvLmpzIj48L3NjcmlwdD4KLSAgICAg
ICAgPHNjcmlwdCBzcmM9ImpzL2NvbnRyb2xsZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMiPjwvc2Ny
aXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvY29udHJvbGxlcnMvdG9kb19jb250cm9sbGVy
LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL2VkaXRfdG9kb192
aWV3LmpzIj48L3NjcmlwdD4KLSAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3ZpZXdzL3RvZG9zX3Zp
ZXcuanMiPjwvc2NyaXB0PgotICAgICAgICA8c2NyaXB0IHNyYz0ianMvaGVscGVycy9wbHVyYWxp
emUuanMiPjwvc2NyaXB0PgotICAgIDwvYm9keT4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cisg
IDxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICA8bWV0YSBodHRwLWVxdWl2
PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgorICAgIDx0aXRsZT5Ub2RvbXZj
PC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKyAgICA8
bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFs
LXNjYWxlPTEiPgorICAgIDxiYXNlIGhyZWY9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzIiAvPgorICAg
IAorPG1ldGEgbmFtZT0idG9kb212Yy9jb25maWcvZW52aXJvbm1lbnQiIGNvbnRlbnQ9IiU3QiUy
Mm1vZHVsZVByZWZpeCUyMiUzQSUyMnRvZG9tdmMlMjIlMkMlMjJlbnZpcm9ubWVudCUyMiUzQSUy
MmRldmVsb3BtZW50JTIyJTJDJTIyYmFzZVVSTCUyMiUzQW51bGwlMkMlMjJsb2NhdGlvblR5cGUl
MjIlM0ElMjJhdXRvJTIyJTJDJTIyRW1iZXJFTlYlMjIlM0ElN0IlMjJGRUFUVVJFUyUyMiUzQSU3
QiU3RCU3RCUyQyUyMkFQUCUyMiUzQSU3QiUyMm5hbWUlMjIlM0ElMjJ0b2RvbXZjJTIyJTJDJTIy
dmVyc2lvbiUyMiUzQSUyMjAuMC4wKzVkYmM1ZmI5JTIyJTdEJTJDJTIyZXhwb3J0QXBwbGljYXRp
b25HbG9iYWwlMjIlM0F0cnVlJTdEIiAvPgorCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmNzcyI+CisgICAgPGxpbmsg
cmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9hc3NldHMvdG9kb212
Yy5jc3MiPgorCisgICAgCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgCisKKyAgICA8c2NyaXB0
IHNyYz0iL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJj
aGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3ZlbmRvci5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmpzIj48
L3NjcmlwdD4KKworICAgIAorICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL2pzL2FwcC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvYXBwLmpzCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBmODFmNTY0ZGNlMjQ1NzM3YTgyYzI1ODY5
MjcwZjE2MjUxZGM1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvYXBwLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNiAr
MCwwIEBACi0vKmdsb2JhbCBFbWJlciwgRFMsIFRvZG9zOnRydWUgKi8KLXdpbmRvdy5Ub2RvcyA9
IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwotCi1Ub2Rvcy5BcHBsaWNhdGlvbkFkYXB0ZXIg
PSBEUy5MU0FkYXB0ZXIuZXh0ZW5kKHsKLSAgICBuYW1lc3BhY2U6ICd0b2Rvcy1lbWJlcmpzJwot
fSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xsZXJzL3RvZG9f
Y29udHJvbGxlci5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9kb19j
b250cm9sbGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZlODEwMmVkZGVh
YmFjYjBmNDY1YWMzYjViNTMyNzNjMTQ5YTVmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvY29udHJvbGxlcnMvdG9k
b19jb250cm9sbGVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLypnbG9iYWwg
VG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9Db250cm9sbGVyID0g
RW1iZXIuT2JqZWN0Q29udHJvbGxlci5leHRlbmQoewotICAgIGlzRWRpdGluZzogZmFsc2UsCi0K
LSAgICAvLyBXZSB1c2UgdGhlIGJ1ZmZlcmVkVGl0bGUgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHZh
bHVlIG9mCi0gICAgLy8gdGhlIG1vZGVsJ3MgdGl0bGUgc28gdGhhdCB3ZSBjYW4gcm9sbCBpdCBi
YWNrIGxhdGVyIGluIHRoZQotICAgIC8vIGBjYW5jZWxFZGl0aW5nYCBhY3Rpb24uCi0gICAgYnVm
ZmVyZWRUaXRsZTogRW1iZXIuY29tcHV0ZWQub25lV2F5KCd0aXRsZScpLAotCi0gICAgYWN0aW9u
czogewotICAgICAgICBlZGl0VG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdGhpcy5z
ZXQoJ2lzRWRpdGluZycsIHRydWUpOwotICAgICAgICB9LAotCi0gICAgICAgIGRvbmVFZGl0aW5n
OiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICB2YXIgYnVmZmVyZWRUaXRsZSA9IHRoaXMuZ2V0
KCdidWZmZXJlZFRpdGxlJykudHJpbSgpOwotCi0gICAgICAgICAgICBpZiAoRW1iZXIuaXNFbXB0
eShidWZmZXJlZFRpdGxlKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBgZG9uZUVkaXRpbmdg
IGFjdGlvbiBnZXRzIHNlbnQgdHdpY2Ugd2hlbiB0aGUgdXNlciBoaXRzCi0gICAgICAgICAgICAg
ICAgLy8gZW50ZXIgKG9uY2UgdmlhICdpbnNlcnQtbmV3bGluZScgYW5kIG9uY2UgdmlhICdmb2N1
cy1vdXQnKS4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFdlIGRlYm91
bmNlIG91ciBjYWxsIHRvICdyZW1vdmVUb2RvJyBzbyB0aGF0IGl0IG9ubHkgZ2V0cwotICAgICAg
ICAgICAgICAgIC8vIG1hZGUgb25jZS4KLSAgICAgICAgICAgICAgICBFbWJlci5ydW4uZGVib3Vu
Y2UodGhpcywgJ3JlbW92ZVRvZG8nLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgdmFyIHRvZG8gPSB0aGlzLmdldCgnbW9kZWwnKTsKLSAgICAgICAgICAgICAgICB0
b2RvLnNldCgndGl0bGUnLCBidWZmZXJlZFRpdGxlKTsKLSAgICAgICAgICAgICAgICB0b2RvLnNh
dmUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmUtc2V0IG91ciBuZXdseSBl
ZGl0ZWQgdGl0bGUgdG8gcGVyc2lzdCBpdHMgdHJpbW1lZCB2ZXJzaW9uCi0gICAgICAgICAgICB0
aGlzLnNldCgnYnVmZmVyZWRUaXRsZScsIGJ1ZmZlcmVkVGl0bGUpOwotICAgICAgICAgICAgdGhp
cy5zZXQoJ2lzRWRpdGluZycsIGZhbHNlKTsKLSAgICAgICAgfSwKLQotICAgICAgICBjYW5jZWxF
ZGl0aW5nOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICB0aGlzLnNldCgnYnVmZmVyZWRUaXRs
ZScsIHRoaXMuZ2V0KCd0aXRsZScpKTsKLSAgICAgICAgICAgIHRoaXMuc2V0KCdpc0VkaXRpbmcn
LCBmYWxzZSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgcmVtb3ZlVG9kbzogZnVuY3Rpb24gKCkg
ewotICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2RvKCk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0g
ICAgcmVtb3ZlVG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICB2YXIgdG9kbyA9IHRoaXMuZ2V0
KCdtb2RlbCcpOwotCi0gICAgICAgIHRvZG8uZGVsZXRlUmVjb3JkKCk7Ci0gICAgICAgIHRvZG8u
c2F2ZSgpOwotICAgIH0sCi0KLSAgICBzYXZlV2hlbkNvbXBsZXRlZDogZnVuY3Rpb24gKCkgewot
ICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5zYXZlKCk7Ci0gICAgfS5vYnNlcnZlcygnaXNDb21w
bGV0ZWQnKQotfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xs
ZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL2NvbnRyb2xs
ZXJzL3RvZG9zX2NvbnRyb2xsZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIz
OGRlNGMxNDYwNjBjOWEzNGQxNDU1MzExMTMzN2E3ZDhmMDRmNWQuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9jb250
cm9sbGVycy90b2Rvc19jb250cm9sbGVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBA
QAotLypnbG9iYWwgVG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9z
Q29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewotICAgIGFjdGlvbnM6
IHsKLSAgICAgICAgY3JlYXRlVG9kbzogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdmFyIHRp
dGxlLCB0b2RvOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHRvZG8gdGl0bGUgc2V0IGJ5IHRo
ZSAiTmV3IFRvZG8iIHRleHQgZmllbGQKLSAgICAgICAgICAgIHRpdGxlID0gdGhpcy5nZXQoJ25l
d1RpdGxlJykudHJpbSgpOwotICAgICAgICAgICAgaWYgKCF0aXRsZSkgewotICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBu
ZXcgVG9kbyBtb2RlbAotICAgICAgICAgICAgdG9kbyA9IHRoaXMuc3RvcmUuY3JlYXRlUmVjb3Jk
KCd0b2RvJywgewotICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSwKLSAgICAgICAgICAgICAg
ICBpc0NvbXBsZXRlZDogZmFsc2UKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdG9kby5z
YXZlKCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFyIHRoZSAiTmV3IFRvZG8iIHRleHQgZmllbGQK
LSAgICAgICAgICAgIHRoaXMuc2V0KCduZXdUaXRsZScsICcnKTsKLSAgICAgICAgfSwKLQotICAg
ICAgICBjbGVhckNvbXBsZXRlZDogZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgdmFyIGNvbXBs
ZXRlZCA9IHRoaXMuZ2V0KCdjb21wbGV0ZWQnKTsKLSAgICAgICAgICAgIGNvbXBsZXRlZC5pbnZv
a2UoJ2RlbGV0ZVJlY29yZCcpOwotICAgICAgICAgICAgY29tcGxldGVkLmludm9rZSgnc2F2ZScp
OwotICAgICAgICB9LAotICAgIH0sCi0KLSAgICAvKiBwcm9wZXJ0aWVzICovCi0KLSAgICByZW1h
aW5pbmc6IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5KCdjb250ZW50JywgJ2lzQ29tcGxldGVkJywg
ZmFsc2UpLAotICAgIGNvbXBsZXRlZDogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ2NvbnRlbnQn
LCAnaXNDb21wbGV0ZWQnLCB0cnVlKSwKLQotICAgIGFsbEFyZURvbmU6IGZ1bmN0aW9uIChrZXks
IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAg
ICB0aGlzLnNldEVhY2goJ2lzQ29tcGxldGVkJywgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJu
IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMu
Z2V0KCdsZW5ndGgnKTsKLSAgICAgICAgICAgIHZhciBjb21wbGV0ZWRMZW5ndGggPSB0aGlzLmdl
dCgnY29tcGxldGVkLmxlbmd0aCcpOwotCi0gICAgICAgICAgICByZXR1cm4gbGVuZ3RoID4gMCAm
JiBsZW5ndGggPT09IGNvbXBsZXRlZExlbmd0aDsKLSAgICAgICAgfQotICAgIH0ucHJvcGVydHko
J2xlbmd0aCcsICdjb21wbGV0ZWQubGVuZ3RoJykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9qcy9oZWxwZXJzL3BsdXJhbGl6ZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
anMvaGVscGVycy9wbHVyYWxpemUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDli
NjI0NGM5NTM4N2RiYzZlYTk4M2M5MjE3MDAyZWY3OTBmNGI5MDcuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9oZWxw
ZXJzL3BsdXJhbGl6ZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLypnbG9iYWwg
VG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLUVtYmVyLkhhbmRsZWJhcnMuaGVscGVy
KCdwbHVyYWxpemUnLCBmdW5jdGlvbiAoc2luZ3VsYXIsIGNvdW50KSB7Ci0gICAgLyogRnJvbSBF
bWJlci1EYXRhICovCi0gICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IoRW1i
ZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7Ci0KLSAgICByZXR1cm4gY291bnQgPT09IDEgPyBz
aW5ndWxhciA6IGluZmxlY3Rvci5wbHVyYWxpemUoc2luZ3VsYXIpOwotfSk7CmRpZmYgLS1naXQg
YS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVj
dHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVscy90b2RvLmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy9tb2RlbHMvdG9kby5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5
MTIwMmQxMDBmN2FlM2FhNWVmYjQxMDRmNmVkZjM3YWI2NWNmMC4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL21vZGVs
cy90b2RvLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vKmdsb2JhbCBUb2Rvcywg
RFMgKi8KLSd1c2Ugc3RyaWN0JzsKLQotVG9kb3MuVG9kbyA9IERTLk1vZGVsLmV4dGVuZCh7Ci0g
ICAgdGl0bGU6IERTLmF0dHIoJ3N0cmluZycpLAotICAgIGlzQ29tcGxldGVkOiBEUy5hdHRyKCdi
b29sZWFuJykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9qcy9yb3V0ZXIu
anMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3JvdXRlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMjAzZjYyOWIwNDUxMzllMTFjOTRkYTA4YmQ0MmNiMjJjYTM1ZTYwMC4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL2pzL3JvdXRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qZ2xv
YmFsIEVtYmVyLCBUb2RvcyAqLwotJ3VzZSBzdHJpY3QnOwotCi1Ub2Rvcy5Sb3V0ZXIubWFwKGZ1
bmN0aW9uICgpIHsKLSAgICB0aGlzLnJlc291cmNlKCd0b2RvcycsIHsgcGF0aDogJy8nIH0sIGZ1
bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5yb3V0ZSgnYWN0aXZlJyk7Ci0gICAgICAgIHRoaXMu
cm91dGUoJ2NvbXBsZXRlZCcpOwotICAgIH0pOwotfSk7Ci0KLVRvZG9zLlRvZG9zUm91dGUgPSBF
bWJlci5Sb3V0ZS5leHRlbmQoewotICAgIG1vZGVsOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHJl
dHVybiB0aGlzLnN0b3JlLmZpbmQoJ3RvZG8nKTsKLSAgICB9Ci19KTsKLQotVG9kb3MuVG9kb3NJ
bmRleFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICBzZXR1cENvbnRyb2xsZXI6IGZ1
bmN0aW9uICgpIHsKLSAgICAgICAgdGhpcy5jb250cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmls
dGVyZWRUb2RvcycsIHRoaXMubW9kZWxGb3IoJ3RvZG9zJykpOwotICAgIH0KLX0pOwotCi1Ub2Rv
cy5Ub2Rvc0FjdGl2ZVJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKLSAgICBzZXR1cENvbnRy
b2xsZXI6IGZ1bmN0aW9uICgpIHsKLSAgICAgICAgdmFyIHRvZG9zID0gdGhpcy5zdG9yZS5maWx0
ZXIoJ3RvZG8nLCBmdW5jdGlvbiAodG9kbykgewotICAgICAgICAgICAgcmV0dXJuICF0b2RvLmdl
dCgnaXNDb21wbGV0ZWQnKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5jb250cm9sbGVy
Rm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKLSAgICB9Ci19KTsKLQot
VG9kb3MuVG9kb3NDb21wbGV0ZWRSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7Ci0gICAgc2V0
dXBDb250cm9sbGVyOiBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciB0b2RvcyA9IHRoaXMuc3Rv
cmUuZmlsdGVyKCd0b2RvJywgZnVuY3Rpb24gKHRvZG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0
b2RvLmdldCgnaXNDb21wbGV0ZWQnKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5jb250
cm9sbGVyRm9yKCd0b2RvcycpLnNldCgnZmlsdGVyZWRUb2RvcycsIHRvZG9zKTsKLSAgICB9Ci19
KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3Zp
ZXcuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2pzL3ZpZXdzL2VkaXRfdG9kb192aWV3LmpzCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWVlMzA4MDZhMGM0MzM2YTJhOTgxODlkYmYw
YTkyODIxMWFmNWQwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMvdmlld3MvZWRpdF90b2RvX3ZpZXcuanMKKysrIC9k
ZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKmdsb2JhbCBUb2RvcywgRW1iZXIgKi8KLSd1c2Ug
c3RyaWN0JzsKLQotVG9kb3MuRWRpdFRvZG9WaWV3ID0gRW1iZXIuVGV4dEZpZWxkLmV4dGVuZCh7
Ci0gICAgZm9jdXNPbkluc2VydDogZnVuY3Rpb24gKCkgewotICAgICAgICAvLyBSZS1zZXQgaW5w
dXQgdmFsdWUgdG8gZ2V0IHJpZCBvZiBhIHJlZHVudGFudCB0ZXh0IHNlbGVjdGlvbgotICAgICAg
ICB0aGlzLiQoKS52YWwodGhpcy4kKCkudmFsKCkpOwotICAgICAgICB0aGlzLiQoKS5mb2N1cygp
OwotICAgIH0ub24oJ2RpZEluc2VydEVsZW1lbnQnKQotfSk7Ci0KLUVtYmVyLkhhbmRsZWJhcnMu
aGVscGVyKCdlZGl0LXRvZG8nLCBUb2Rvcy5FZGl0VG9kb1ZpZXcpOwpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9qcy92aWV3cy90b2Rvc192aWV3LmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9qcy92aWV3cy90b2Rvc192aWV3LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCA2NmEwYjcxZTFiZWYyZDkwMDBjYjRjZTAxNjdkZjk2M2I1YjNkYjQ0Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvanMv
dmlld3MvdG9kb3Nfdmlldy5qcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLypnbG9i
YWwgVG9kb3MsIEVtYmVyICovCi0ndXNlIHN0cmljdCc7Ci0KLVRvZG9zLlRvZG9zVmlldyA9IEVt
YmVyLlZpZXcuZXh0ZW5kKHsKLSAgICBmb2N1c0lucHV0OiBmdW5jdGlvbiAoKSB7Ci0gICAgICAg
IHRoaXMuJCgnI25ldy10b2RvJykuZm9jdXMoKTsKLSAgICB9Lm9uKCdkaWRJbnNlcnRFbGVtZW50
JykKLX0pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9yZWFkbWUubWQgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3JlYWRtZS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
ZmU0YmQyNGVlNzA5MGQ2Zjk4NGRmNTY3YTE0NjRjZWMzNWY5YTA3Yy4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JlYWRt
ZS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgRW1iZXIuanMgVG9kb01WQyBF
eGFtcGxlCi0KLT4gQSBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIGFtYml0aW91cyB3ZWIgYXBwbGlj
YXRpb25zLgotCi0+IF9bRW1iZXIuanMgLSBlbWJlcmpzLmNvbV0oaHR0cDovL2VtYmVyanMuY29t
KV8KLQotCi0jIyBMZWFybmluZyBFbWJlci5qcwotCi1UaGUgW0VtYmVyLmpzIHdlYnNpdGVdKGh0
dHA6Ly9lbWJlcmpzLmNvbSkgaXMgYSBncmVhdCByZXNvdXJjZSBmb3IgZ2V0dGluZyBzdGFydGVk
LgotCi1IZXJlIGFyZSBzb21lIGxpbmtzIHlvdSBtYXkgZmluZCBoZWxwZnVsOgotCi0qIFtHdWlk
ZXNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMpCi0qIFtBUEkgUmVmZXJlbmNlXShodHRwOi8v
ZW1iZXJqcy5jb20vYXBpKQotKiBbU2NyZWVuY2FzdCAtIEJ1aWxkaW5nIGFuIEFwcCB3aXRoIEVt
YmVyLmpzXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUdhOTloTWk3d2ZZKQotKiBb
QXBwbGljYXRpb25zIGJ1aWx0IHdpdGggRW1iZXIuanNdKGh0dHA6Ly9lbWJlcmpzLmNvbS9lbWJl
ci11c2VycykKLSogW0Jsb2ddKGh0dHA6Ly9lbWJlcmpzLmNvbS9ibG9nKQotCi1BcnRpY2xlcyBh
bmQgZ3VpZGVzIGZyb20gdGhlIGNvbW11bml0eToKLQotKiBbR2V0dGluZyBJbnRvIEVtYmVyLmpz
XShodHRwOi8vbmV0LnR1dHNwbHVzLmNvbS90dXRvcmlhbHMvamF2YXNjcmlwdC1hamF4L2dldHRp
bmctaW50by1lbWJlci1qcykKLSogW0VtYmVyV2F0Y2hdKGh0dHA6Ly9lbWJlcndhdGNoLmNvbSkK
LSogW0NvZGVTY2hvb2wgY291cnNlIFdhcm1pbmcgVXAgV2l0aCBFbWJlci5qc10oaHR0cHM6Ly93
d3cuY29kZXNjaG9vbC5jb20vY291cnNlcy93YXJtaW5nLXVwLXdpdGgtZW1iZXJqcykKLQotR2V0
IGhlbHAgZnJvbSBvdGhlciBFbWJlci5qcyB1c2VyczoKLQotKiBbRW1iZXIuanMgb24gU3RhY2tP
dmVyZmxvd10oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy90YWdnZWQvZW1iZXIu
anMpCi0qIFtFbWJlci5qcyBvbiBUd2l0dGVyXShodHRwOi8vdHdpdHRlci5jb20vZW1iZXJqcykK
LSogW0VtYmVyLmpzIG9uIEdvb2dsZSArXShodHRwczovL3BsdXMuZ29vZ2xlLmNvbS9jb21tdW5p
dGllcy8xMDYzODcwNDk3OTAzODc0NzEyMDUpCi0KLV9JZiB5b3UgaGF2ZSBvdGhlciBoZWxwZnVs
IGxpbmtzIHRvIHNoYXJlLCBvciBmaW5kIGFueSBvZiB0aGUgbGlua3MgYWJvdmUgbm8gbG9uZ2Vy
IHdvcmssIHBsZWFzZSBbbGV0IHVzIGtub3ddKGh0dHBzOi8vZ2l0aHViLmNvbS90YXN0ZWpzL3Rv
ZG9tdmMvaXNzdWVzKS5fCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JvYm90cy50
eHQgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3JvYm90cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjU5MTY0NTJl
NWZmNmM4YjQzZDZkN2M3M2QwMDE1M2QzNGFjMzVkZQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvcm9ib3RzLnR4dApAQCAtMCwwICsxLDMgQEAKKyMgaHR0cDovL3d3dy5y
b2JvdHN0eHQub3JnCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzoKZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlLy5ib3dlcnJjIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmJvd2VycmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTU5ZTE2OTZlN2IyYzk3MDAwNWMzNWVjOGEwZjk0YWVh
NWRmMzZhYwotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5i
b3dlcnJjCkBAIC0wLDAgKzEsNCBAQAoreworICAiZGlyZWN0b3J5IjogImJvd2VyX2NvbXBvbmVu
dHMiLAorICAiYW5hbHl0aWNzIjogZmFsc2UKK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlLy5lZGl0b3Jjb25maWcgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
ZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ3YzU0Mzg0MDNjYTg3NWYxNzBkYjJhYTA3ZDFiZmEz
Njg5NDA2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
ZWRpdG9yY29uZmlnCkBAIC0wLDAgKzEsMzQgQEAKKyMgRWRpdG9yQ29uZmlnIGhlbHBzIGRldmVs
b3BlcnMgZGVmaW5lIGFuZCBtYWludGFpbiBjb25zaXN0ZW50CisjIGNvZGluZyBzdHlsZXMgYmV0
d2VlbiBkaWZmZXJlbnQgZWRpdG9ycyBhbmQgSURFcworIyBlZGl0b3Jjb25maWcub3JnCisKK3Jv
b3QgPSB0cnVlCisKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3Ry
aW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1
ZQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCitbKi5qc10KK2luZGVu
dF9zdHlsZSA9IHNwYWNlCitpbmRlbnRfc2l6ZSA9IDIKKworWyouaGJzXQoraW5zZXJ0X2ZpbmFs
X25ld2xpbmUgPSBmYWxzZQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgor
CitbKi5jc3NdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKK1sqLmh0
bWxdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKK1sqLntkaWZmLG1k
fV0KK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlCmRpZmYgLS1naXQgYS9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS8uZW1iZXItY2xpIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3Vy
Y2UvLmVtYmVyLWNsaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZTY0Y2ZlZDJhODkwNWRjMjM1MDZhZjEwNjBlYzgw
Y2Y4ODc1ODJkCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
LmVtYmVyLWNsaQpAQCAtMCwwICsxLDkgQEAKK3sKKyAgLyoqCisgICAgRW1iZXIgQ0xJIHNlbmRz
IGFuYWx5dGljcyBpbmZvcm1hdGlvbiBieSBkZWZhdWx0LiBUaGUgZGF0YSBpcyBjb21wbGV0ZWx5
CisgICAgYW5vbnltb3VzLCBidXQgdGhlcmUgYXJlIHRpbWVzIHdoZW4geW91IG1pZ2h0IHdhbnQg
dG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLgorCisgICAgU2V0dGluZyBgZGlzYWJsZUFuYWx5dGlj
c2AgdG8gdHJ1ZSB3aWxsIHByZXZlbnQgYW55IGRhdGEgZnJvbSBiZWluZyBzZW50LgorICAqLwor
ICAiZGlzYWJsZUFuYWx5dGljcyI6IGZhbHNlCit9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRl
c3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9l
bWJlcmpzL3NvdXJjZS8uZ2l0aWdub3JlIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmdp
dGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5iZTA5ZTAzOGI3NWVjMmE3MjU4MDg5MzZhOGM2YjMyYzZhMmY2
MzJiCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLmdpdGln
bm9yZQpAQCAtMCwwICsxLDE3IEBACisjIFNlZSBodHRwOi8vaGVscC5naXRodWIuY29tL2lnbm9y
ZS1maWxlcy8gZm9yIG1vcmUgYWJvdXQgaWdub3JpbmcgZmlsZXMuCisKKyMgY29tcGlsZWQgb3V0
cHV0CisjIC9kaXN0CisvdG1wCisKKyMgZGVwZW5kZW5jaWVzCisvbm9kZV9tb2R1bGVzCisvYm93
ZXJfY29tcG9uZW50cworCisjIG1pc2MKKy8uc2Fzcy1jYWNoZQorL2Nvbm5lY3QubG9jaworL2Nv
dmVyYWdlLyoKKy9saWJwZWVyY29ubmVjdGlvbi5sb2cKK25wbS1kZWJ1Zy5sb2cKK3Rlc3RlbS5s
b2cKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3Rv
ZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy5qc2hpbnRyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wODA5NmVmZmFh
YjM3NDk5NGFkY2IzNTc4ZTk4ODY3NWE0YmVmYTgyCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvLmpzaGludHJjCkBAIC0wLDAgKzEsMzIgQEAKK3sKKyAgInBy
ZWRlZiI6IFsKKyAgICAiZG9jdW1lbnQiLAorICAgICJ3aW5kb3ciLAorICAgICItUHJvbWlzZSIK
KyAgXSwKKyAgImJyb3dzZXIiOiB0cnVlLAorICAiYm9zcyI6IHRydWUsCisgICJjdXJseSI6IHRy
dWUsCisgICJkZWJ1ZyI6IGZhbHNlLAorICAiZGV2ZWwiOiB0cnVlLAorICAiZXFlcWVxIjogdHJ1
ZSwKKyAgImV2aWwiOiB0cnVlLAorICAiZm9yaW4iOiBmYWxzZSwKKyAgImltbWVkIjogZmFsc2Us
CisgICJsYXhicmVhayI6IGZhbHNlLAorICAibmV3Y2FwIjogdHJ1ZSwKKyAgIm5vYXJnIjogdHJ1
ZSwKKyAgIm5vZW1wdHkiOiBmYWxzZSwKKyAgIm5vbmV3IjogZmFsc2UsCisgICJub21lbiI6IGZh
bHNlLAorICAib25ldmFyIjogZmFsc2UsCisgICJwbHVzcGx1cyI6IGZhbHNlLAorICAicmVnZXhw
IjogZmFsc2UsCisgICJ1bmRlZiI6IHRydWUsCisgICJzdWIiOiB0cnVlLAorICAic3RyaWN0Ijog
ZmFsc2UsCisgICJ3aGl0ZSI6IGZhbHNlLAorICAiZXFudWxsIjogdHJ1ZSwKKyAgImVzbmV4dCI6
IHRydWUsCisgICJ1bnVzZWQiOiB0cnVlCit9CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS8udHJhdmlzLnltbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlLy50cmF2
aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjY0NTMzYmVhODliY2MwZjAwOWFmMGNkMjNmZGUwZTRkMDZiOTQ5
MWEKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8udHJhdmlz
LnltbApAQCAtMCwwICsxLDIyIEBACistLS0KK2xhbmd1YWdlOiBub2RlX2pzCitub2RlX2pzOgor
ICAtICI0IgorCitzdWRvOiBmYWxzZQorCitjYWNoZToKKyAgZGlyZWN0b3JpZXM6CisgICAgLSBu
b2RlX21vZHVsZXMKKworYmVmb3JlX2luc3RhbGw6CisgIC0gbnBtIGNvbmZpZyBzZXQgc3BpbiBm
YWxzZQorICAtIG5wbSBpbnN0YWxsIC1nIGJvd2VyCisgIC0gbnBtIGluc3RhbGwgcGhhbnRvbWpz
LXByZWJ1aWx0CisKK2luc3RhbGw6CisgIC0gbnBtIGluc3RhbGwKKyAgLSBib3dlciBpbnN0YWxs
CisKK3NjcmlwdDoKKyAgLSBucG0gdGVzdApkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvLndhdGNobWFuY29uZmlnIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvLndh
dGNobWFuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU3ODM0ZTNlNGYzOWMxYTc0NTk0MmRmZTkwODkxNzA4
NTkzZTBlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS8u
d2F0Y2htYW5jb25maWcKQEAgLTAsMCArMSwzIEBACit7CisgICJpZ25vcmVfZGlycyI6IFsidG1w
IiwgImRpc3QiXQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVB
RE1FLm1kIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjViZDhhODNkYmUxNWMzNTg3ODRiNWUxOWU4OGVhZWZmY2M2YTQzNjQKLS0tIC9kZXYvbnVsbAor
KysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9SRUFETUUubWQKQEAgLTAsMCArMSwxNSBA
QAorIyBFbWJlci5qcyBUb2RvTVZDIEV4YW1wbGUgdXNpbmcgRW1iZXIgQ0xJCisKKz4gQSBmcmFt
ZXdvcmsgZm9yIGNyZWF0aW5nIGFtYml0aW91cyB3ZWIgYXBwbGljYXRpb25zLgorCis+IF9bRW1i
ZXIuanMgLSBlbWJlcmpzLmNvbV0oaHR0cDovL2VtYmVyanMuY29tKV8KKz4gX1tFbWJlciBDTEkg
LSBlbWJlci1jbGkuY29tXShodHRwOi8vZW1iZXItY2xpLmNvbSlfCisKKyMjIE5vdGUgZm9yIHBl
b3BsZSB1cGRhdGluZyB0aGlzIGFwcC4KKworVGhlIGBpbmRleC5odG1sYCBhbmQgdGhlIGBhc3Nl
dHNgIGZvbGRlciBpbiB0aGUgcGFyZW50IGZvbGRlciBhcyBzaW1saW5rcyBpbnRvIHRoZSBpdGVt
cyB3aXRoIHRoZQorc2FtZSBuYW1lcyBpbnNpZGUgYGRpc3RgLiBUaGUgYGRpc3RgIGZvbGRlciBo
YXMgdG8gYmUgY2hlY2tlZCBpbiBnaXQgYW5kIGJ1aWx0IGZvciBwcm9kdWN0aW9uLgorCitUbyB3
b3JrIG9uIHRoaXMgY29tbWVudCBgPGJhc2UgaHJlZj0iL2V4YW1wbGVzL2VtYmVyLWNsaS9pbmRl
eC5odG1sIiAvPmAgaW4gdGhlIGBhcHAvaW5kZXguaHRtbGAKK2FuZCB1bmNvbW1lbnRlZCBpdCBi
YWNrIGJlZm9yZSBkb2luZyB0aGUgcHJvZHVjdGlvbiBidWlsZC4KKwpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2FwcC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3Bl
ZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMv
c291cmNlL2FwcC9hcHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjI2MGM0YzcwNmQwYWUzNzVjZmZjNjk2OWRm
ZTQzNGI1OWQyOTliNQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9hcHAuanMKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IEVtYmVyIGZyb20gJ2VtYmVy
JzsKK2ltcG9ydCBSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVyJzsKK2ltcG9ydCBsb2FkSW5pdGlh
bGl6ZXJzIGZyb20gJ2VtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzJzsKK2ltcG9ydCBjb25maWcgZnJv
bSAnLi9jb25maWcvZW52aXJvbm1lbnQnOworCitsZXQgQXBwOworCitFbWJlci5NT0RFTF9GQUNU
T1JZX0lOSkVDVElPTlMgPSB0cnVlOworCitBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5leHRlbmQo
eworICAgIG1vZHVsZVByZWZpeDogY29uZmlnLm1vZHVsZVByZWZpeCwKKyAgICBwb2RNb2R1bGVQ
cmVmaXg6IGNvbmZpZy5wb2RNb2R1bGVQcmVmaXgsCisgICAgUmVzb2x2ZXIKK30pOworCitsb2Fk
SW5pdGlhbGl6ZXJzKEFwcCwgY29uZmlnLm1vZHVsZVByZWZpeCk7CisKK2V4cG9ydCBkZWZhdWx0
IEFwcDsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25l
bnRzLy5naXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVudHMv
LmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhj
NTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVu
dHMvdG9kby1pdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbXBvbmVu
dHMvdG9kby1pdGVtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBkZTdmYmYxMTY1YjI2MTQ1NDFhNTZhMzkwZDFj
MzM4YzQ5OGUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21l
dGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJj
ZS9hcHAvY29tcG9uZW50cy90b2RvLWl0ZW0uanMKQEAgLTAsMCArMSw0OSBAQAoraW1wb3J0IEVt
YmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29tcG9uZW50LmV4dGVu
ZCh7CisgICAgcmVwbzogRW1iZXIuaW5qZWN0LnNlcnZpY2UoKSwKKyAgICB0YWdOYW1lOiAnbGkn
LAorICAgIGVkaXRpbmc6IGZhbHNlLAorICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3RvZG8uY29t
cGxldGVkJywgJ2VkaXRpbmcnXSwKKworICAgIGFjdGlvbnM6IHsKKyAgICAgICAgc3RhcnRFZGl0
aW5nKCkgeworICAgICAgICAgICAgdGhpcy5nZXQoJ29uU3RhcnRFZGl0JykoKTsKKyAgICAgICAg
ICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgdHJ1ZSk7CisgICAgICAgICAgICBFbWJlci5ydW4uc2No
ZWR1bGVPbmNlKCdhZnRlclJlbmRlcicsIHRoaXMsICdmb2N1c0lucHV0Jyk7CisgICAgICAgIH0s
CisKKyAgICAgICAgZG9uZUVkaXRpbmcodG9kb1RpdGxlKSB7CisgICAgICAgICAgICBpZiAoIXRo
aXMuZ2V0KCdlZGl0aW5nJykpIHsgcmV0dXJuOyB9CisgICAgICAgICAgICBpZiAoRW1iZXIuaXNC
bGFuayh0b2RvVGl0bGUpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kKCdyZW1vdmVUb2Rv
Jyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0KCd0b2Rv
LnRpdGxlJywgdG9kb1RpdGxlLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2Vk
aXRpbmcnLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhpcy5nZXQoJ29uRW5kRWRpdCcpKCk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgaGFuZGxlS2V5ZG93bihlKSB7
CisgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgICAgICAgICAgIGUu
dGFyZ2V0LmJsdXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykg
eworICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdlZGl0aW5nJywgZmFsc2UpOworICAgICAgICAg
ICAgfQorICAgICAgICB9LAorCisgICAgICAgIHRvZ2dsZUNvbXBsZXRlZChlKSB7CisgICAgICAg
ICAgICBsZXQgdG9kbyA9IHRoaXMuZ2V0KCd0b2RvJyk7CisgICAgICAgICAgICBFbWJlci5zZXQo
dG9kbywgJ2NvbXBsZXRlZCcsIGUudGFyZ2V0LmNoZWNrZWQpOworICAgICAgICAgICAgdGhpcy5n
ZXQoJ3JlcG8nKS5wZXJzaXN0KCk7CisgICAgICAgIH0sCisKKyAgICAgICAgcmVtb3ZlVG9kbygp
IHsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykuZGVsZXRlKHRoaXMuZ2V0KCd0b2RvJykp
OworICAgICAgICB9CisgICAgfSwKKworICAgIGZvY3VzSW5wdXQoKSB7CisgICAgICAgIHRoaXMu
ZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dC5lZGl0JykuZm9jdXMoKTsKKyAgICB9Cit9KTsK
ZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3Rv
ZG8tbGlzdC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb21wb25lbnRzL3Rv
ZG8tbGlzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kODRlMGUzYTFmZTI5N2ZmNWQ4YWRiMTQxNjMyY2FlOTQy
NjhkMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L2NvbXBvbmVudHMvdG9kby1saXN0LmpzCkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9ydCBFbWJlciBm
cm9tICdlbWJlcic7CisKK2V4cG9ydCBkZWZhdWx0IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoewor
ICAgIHJlcG86IEVtYmVyLmluamVjdC5zZXJ2aWNlKCksCisgICAgdGFnTmFtZTogJ3NlY3Rpb24n
LAorICAgIGVsZW1lbnRJZDogJ21haW4nLAorICAgIGNhblRvZ2dsZTogdHJ1ZSwKKyAgICBhbGxD
b21wbGV0ZWQ6IEVtYmVyLmNvbXB1dGVkKCd0b2Rvcy5AZWFjaC5jb21wbGV0ZWQnLCBmdW5jdGlv
biAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldCgndG9kb3MnKS5pc0V2ZXJ5KCdjb21wbGV0
ZWQnKTsKKyAgICB9KSwKKworICAgIGFjdGlvbnM6IHsKKyAgICAgICAgZW5hYmxlVG9nZ2xlKCkg
eworICAgICAgICAgICAgdGhpcy5zZXQoJ2NhblRvZ2dsZScsIHRydWUpOworICAgICAgICB9LAor
CisgICAgICAgIGRpc2FibGVUb2dnbGUoKSB7CisgICAgICAgICAgICB0aGlzLnNldCgnY2FuVG9n
Z2xlJywgZmFsc2UpOworICAgICAgICB9LAorCisgICAgICAgIHRvZ2dsZUFsbCgpIHsKKyAgICAg
ICAgICAgIGxldCBhbGxDb21wbGV0ZWQgPSB0aGlzLmdldCgnYWxsQ29tcGxldGVkJyk7CisgICAg
ICAgICAgICB0aGlzLmdldCgndG9kb3MnKS5mb3JFYWNoKHRvZG8gPT4gRW1iZXIuc2V0KHRvZG8s
ICdjb21wbGV0ZWQnLCAhYWxsQ29tcGxldGVkKSk7CisgICAgICAgICAgICB0aGlzLmdldCgncmVw
bycpLnBlcnNpc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FjdGl2ZS5qcyBiL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hY3RpdmUuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZGYwM2Q0MDc5MDM4ODlhMTQxMzc3MWEzMWRmYzE0YmE0ODkzNWIyNQotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9jb250cm9sbGVycy9hY3RpdmUuanMK
QEAgLTAsMCArMSw1IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworCitleHBvcnQgZGVm
YXVsdCBFbWJlci5Db250cm9sbGVyLmV4dGVuZCh7CisgICAgdG9kb3M6IEVtYmVyLmNvbXB1dGVk
LmZpbHRlckJ5KCdtb2RlbCcsICdjb21wbGV0ZWQnLCBmYWxzZSkKK30pOwpkaWZmIC0tZ2l0IGEv
UGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1
cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9uLmpz
IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRl
Y3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2FwcGxpY2F0aW9u
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmM4MTRlNWZhNzNjZDllODFjNjM1N2ZkNzExZTVlNjg3YzA5YmNhZmYK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvY29udHJv
bGxlcnMvYXBwbGljYXRpb24uanMKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IEVtYmVyIGZyb20g
J2VtYmVyJzsKKworZXhwb3J0IGRlZmF1bHQgRW1iZXIuQ29udHJvbGxlci5leHRlbmQoeworICAg
IHJlcG86IEVtYmVyLmluamVjdC5zZXJ2aWNlKCksCisgICAgcmVtYWluaW5nOiBFbWJlci5jb21w
dXRlZC5maWx0ZXJCeSgnbW9kZWwnLCAnY29tcGxldGVkJywgZmFsc2UpLAorICAgIGNvbXBsZXRl
ZDogRW1iZXIuY29tcHV0ZWQuZmlsdGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcpLAorICAgIGFj
dGlvbnM6IHsKKyAgICAgICAgY3JlYXRlVG9kbyhlKSB7CisgICAgICAgICAgICBpZiAoZS5rZXlD
b2RlID09PSAxMyAmJiAhRW1iZXIuaXNCbGFuayhlLnRhcmdldC52YWx1ZSkpIHsKKyAgICAgICAg
ICAgICAgICB0aGlzLmdldCgncmVwbycpLmFkZCh7IHRpdGxlOiBlLnRhcmdldC52YWx1ZS50cmlt
KCksIGNvbXBsZXRlZDogZmFsc2UgfSk7CisgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUg
PSAnJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBjbGVhckNvbXBsZXRl
ZCgpIHsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnJlbW92ZU9iamVjdHModGhpcy5n
ZXQoJ2NvbXBsZXRlZCcpKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0KCdyZXBvJykucGVyc2lzdCgp
OworICAgICAgICB9CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS9hcHAvY29udHJvbGxlcnMvY29tcGxldGVkLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2NvbXBsZXRlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MzRkMDBh
ZmVmNzgwOWE3M2Q0MTkxNTFiOGYwMmVjNWUwNTY3ZjViCi0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2NvbnRyb2xsZXJzL2NvbXBsZXRlZC5qcwpAQCAt
MCwwICsxLDUgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CisKK2V4cG9ydCBkZWZhdWx0
IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKKyAgICB0b2RvczogRW1iZXIuY29tcHV0ZWQuZmls
dGVyQnkoJ21vZGVsJywgJ2NvbXBsZXRlZCcsIHRydWUpCit9KTsKZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9oZWxwZXJzL2d0LmpzIGIvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvYXBwL2hlbHBlcnMvZ3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjM3MDY5NWEyZjk0NTY1
OWQ5ZjU4NDdkYjEzNzY0ZWFmNjYxMTBlYgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2FwcC9oZWxwZXJzL2d0LmpzCkBAIC0wLDAgKzEsNyBAQAoraW1wb3J0
IEVtYmVyIGZyb20gJ2VtYmVyJzsKKworZXhwb3J0IGZ1bmN0aW9uIGd0KFtuMSwgbjJdLyosIGhh
c2gqLykgeworICAgIHJldHVybiBuMSA+IG4yOworfQorCitleHBvcnQgZGVmYXVsdCBFbWJlci5I
ZWxwZXIuaGVscGVyKGd0KTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L2FwcC9oZWxwZXJzL3BsdXJhbGl6ZS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2Fw
cC9oZWxwZXJzL3BsdXJhbGl6ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMWYxYTJhY2M4Zjg1NjE3ODBkMGI5
NWRmZjczY2E5NjMzYjY4OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2hlbHBlcnMvcGx1cmFsaXplLmpzCkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0
IEVtYmVyIGZyb20gJ2VtYmVyJzsKK2ltcG9ydCB7IHBsdXJhbGl6ZSB9IGZyb20gJ2VtYmVyLWlu
ZmxlY3Rvcic7CisKK2V4cG9ydCBmdW5jdGlvbiBwbHVyYWxpemVIZWxwZXIoW3Npbmd1bGFyLCBj
b3VudF0vKiwgaGFzaCovKSB7CisgICAgcmV0dXJuIGNvdW50ID09PSAxID8gc2luZ3VsYXIgOiBw
bHVyYWxpemUoc2luZ3VsYXIpOworfQorCitleHBvcnQgZGVmYXVsdCBFbWJlci5IZWxwZXIuaGVs
cGVyKHBsdXJhbGl6ZUhlbHBlcik7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS9hcHAvaW5kZXguaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9pbmRl
eC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmJhNmY2NDYzZTA0NmRkMzdlMDlkYzc3NGQ1OTcwNjY3YTMwMTEx
NTkKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5k
ZXguaHRtbApAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICA8aGVh
ZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1V
QS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KKyAgICA8dGl0bGU+VG9kb212YzwvdGl0
bGU+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+CisgICAgPG1ldGEg
bmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2Fs
ZT0xIj4KKyAgICA8YmFzZSBocmVmPSIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcyIgLz4KKyAgICB7e2Nv
bnRlbnQtZm9yICJoZWFkIn19CisKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy92ZW5kb3IuY3NzIj4KKyAgICA8bGluayByZWw9InN0
eWxlc2hlZXQiIGhyZWY9Ii9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL2Fzc2V0cy90b2RvbXZjLmNzcyI+
CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFkLWZvb3RlciJ9fQorICA8L2hlYWQ+CisgIDxib2R5
PgorICAgIHt7Y29udGVudC1mb3IgImJvZHkifX0KKworICAgIDxzY3JpcHQgc3JjPSIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9hc3NldHMvdmVuZG9yLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0iL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvYXNzZXRzL3RvZG9tdmMuanMiPjwvc2NyaXB0PgorCisg
ICAge3tjb250ZW50LWZvciAiYm9keS1mb290ZXIifX0KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL2luc3RhbmNlLWluaXRpYWxp
emVycy9nbG9iYWwuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvaW5zdGFuY2Ut
aW5pdGlhbGl6ZXJzL2dsb2JhbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zNGM5YTlkYWRlN2IxMDM1OTFiNThm
ZDZjNDYwYTg4NmM5NzJhMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvYXBwL2luc3RhbmNlLWluaXRpYWxpemVycy9nbG9iYWwuanMKQEAgLTAsMCArMSwx
MCBAQAorLy8gYXBwL2luc3RhbmNlLWluaXRpYWxpemVycy9nbG9iYWwuanMKKworZXhwb3J0IGZ1
bmN0aW9uIGluaXRpYWxpemUoYXBwbGljYXRpb24pIHsKKyAgd2luZG93LkFwcCA9IGFwcGxpY2F0
aW9uOyAgLy8gb3Igd2luZG93LldoYXRldmVyCit9CisKK2V4cG9ydCBkZWZhdWx0IHsKKyAgbmFt
ZTogJ2dsb2JhbCcsCisgIGluaXRpYWxpemU6IGluaXRpYWxpemUKK307ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L21vZGVscy8uZ2l0a2VlcCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2Vz
L3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9tb2RlbHMv
LmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhj
NTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29sdmVy
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Jlc29sdmVyLmpzCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjJmYjU2M2Q2YzA0ODhmNDFiZWM0NTRmZTFmYTdjMjI5OTc1YTU4ZGYKLS0tIC9kZXYvbnVs
bAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcmVzb2x2ZXIuanMKQEAgLTAs
MCArMSwzIEBACitpbXBvcnQgUmVzb2x2ZXIgZnJvbSAnZW1iZXItcmVzb2x2ZXInOworCitleHBv
cnQgZGVmYXVsdCBSZXNvbHZlcjsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL2FwcC9yb3V0ZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVy
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjRjNjBiZjkzZmM4N2I2N2Y2MDIzZmRjOTQzOTZjNDE0N2I1YTNkNmMK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVy
LmpzCkBAIC0wLDAgKzEsMTMgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQg
Y29uZmlnIGZyb20gJy4vY29uZmlnL2Vudmlyb25tZW50JzsKKworY29uc3QgUm91dGVyID0gRW1i
ZXIuUm91dGVyLmV4dGVuZCh7CisgICAgbG9jYXRpb246IGNvbmZpZy5sb2NhdGlvblR5cGUKK30p
OworCitSb3V0ZXIubWFwKGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLnJvdXRlKCdhY3RpdmUnKTsK
KyAgICB0aGlzLnJvdXRlKCdjb21wbGV0ZWQnKTsKK30pOworCitleHBvcnQgZGVmYXVsdCBSb3V0
ZXI7CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzLy5n
aXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy8uZ2l0a2VlcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5lNjlkZTI5YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvcm91dGVzL2FwcGxpY2F0aW9u
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy9hcHBsaWNhdGlvbi5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4yOTZhMzc1YmEyYTY1MGNiYTExOTY5Nzk1MTc4NDdmOWVmNjdmODEzCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3JvdXRlcy9h
cHBsaWNhdGlvbi5qcwpAQCAtMCwwICsxLDggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7
CisKK2V4cG9ydCBkZWZhdWx0IEVtYmVyLlJvdXRlLmV4dGVuZCh7CisgICAgcmVwbzogRW1iZXIu
aW5qZWN0LnNlcnZpY2UoKSwKKyAgICBtb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0
KCdyZXBvJykuZmluZEFsbCgpOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL21lbW9yeS5qcyBiL1BlcmZvcm1hbmNlVGVzdHMv
U3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVy
anMvc291cmNlL2FwcC9zZXJ2aWNlcy9tZW1vcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNGI5ZDVhZjlkNmQx
ZDhkNTljMGNkYjI2ODhiZmVjMmFkYTgyZjNjMgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9tZW1vcnkuanMKQEAgLTAsMCArMSw4MiBA
QAorKGZ1bmN0aW9uKHJvb3QpIHsKKyAgdmFyIGxvY2FsU3RvcmFnZU1lbW9yeSA9IHt9OworICB2
YXIgY2FjaGUgPSB7fTsKKworICAvKioKKyAgICogbnVtYmVyIG9mIHN0b3JlZCBpdGVtcy4KKyAg
ICovCisgIGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGggPSAwOworCisgIC8qKgorICAgKiByZXR1
cm5zIGl0ZW0gZm9yIHBhc3NlZCBrZXksIG9yIG51bGwKKyAgICoKKyAgICogQHBhcmEge1N0cmlu
Z30ga2V5CisgICAqICAgICAgIG5hbWUgb2YgaXRlbSB0byBiZSByZXR1cm5lZAorICAgKiBAcmV0
dXJucyB7U3RyaW5nfG51bGx9CisgICAqLworICBsb2NhbFN0b3JhZ2VNZW1vcnkuZ2V0SXRlbSA9
IGZ1bmN0aW9uKGtleSkgeworICAgIHJldHVybiBjYWNoZVtrZXldIHx8IG51bGw7CisgIH07CisK
KyAgLyoqCisgICAqIHNldHMgaXRlbSBmb3Iga2V5IHRvIHBhc3NlZCB2YWx1ZSwgYXMgU3RyaW5n
CisgICAqCisgICAqIEBwYXJhIHtTdHJpbmd9IGtleQorICAgKiAgICAgICBuYW1lIG9mIGl0ZW0g
dG8gYmUgc2V0CisgICAqIEBwYXJhIHtTdHJpbmd9IHZhbHVlCisgICAqICAgICAgIHZhbHVlLCB3
aWxsIGFsd2F5cyBiZSB0dXJuZWQgaW50byBhIFN0cmluZworICAgKiBAcmV0dXJucyB7dW5kZWZp
bmVkfQorICAgKi8KKyAgbG9jYWxTdG9yYWdlTWVtb3J5LnNldEl0ZW0gPSBmdW5jdGlvbihrZXks
IHZhbHVlKSB7CisgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAg
IGxvY2FsU3RvcmFnZU1lbW9yeS5yZW1vdmVJdGVtKGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAg
IGlmICghKGNhY2hlLmhhc093blByb3BlcnR5KGtleSkpKSB7CisgICAgICAgIGxvY2FsU3RvcmFn
ZU1lbW9yeS5sZW5ndGgrKzsKKyAgICAgIH0KKworICAgICAgY2FjaGVba2V5XSA9ICcnICsgdmFs
dWU7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiByZW1vdmVzIGl0ZW0gZm9yIHBhc3NlZCBr
ZXkKKyAgICoKKyAgICogQHBhcmEge1N0cmluZ30ga2V5CisgICAqICAgICAgIG5hbWUgb2YgaXRl
bSB0byBiZSByZW1vdmVkCisgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CisgICAqLworICBsb2Nh
bFN0b3JhZ2VNZW1vcnkucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uKGtleSkgeworICAgIGlmIChjYWNo
ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICBkZWxldGUgY2FjaGVba2V5XTsKKyAgICAg
IGxvY2FsU3RvcmFnZU1lbW9yeS5sZW5ndGgtLTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAq
IHJldHVybnMgbmFtZSBvZiBrZXkgYXQgcGFzc2VkIGluZGV4CisgICAqCisgICAqIEBwYXJhIHtO
dW1iZXJ9IGluZGV4CisgICAqICAgICAgIFBvc2l0aW9uIGZvciBrZXkgdG8gYmUgcmV0dXJuZWQg
KHN0YXJ0cyBhdCAwKQorICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9CisgICAqLworICBsb2Nh
bFN0b3JhZ2VNZW1vcnkua2V5ID0gZnVuY3Rpb24oaW5kZXgpIHsKKyAgICByZXR1cm4gT2JqZWN0
LmtleXMoY2FjaGUpW2luZGV4XSB8fCBudWxsOworICB9OworCisgIC8qKgorICAgKiByZW1vdmVz
IGFsbCBzdG9yZWQgaXRlbXMgYW5kIHNldHMgbGVuZ3RoIHRvIDAKKyAgICoKKyAgICogQHJldHVy
bnMge3VuZGVmaW5lZH0KKyAgICovCisgIGxvY2FsU3RvcmFnZU1lbW9yeS5jbGVhciA9IGZ1bmN0
aW9uKCkgeworICAgIGNhY2hlID0ge307CisgICAgbG9jYWxTdG9yYWdlTWVtb3J5Lmxlbmd0aCA9
IDA7CisgIH07CisKKyAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgeworICAgIG1v
ZHVsZS5leHBvcnRzID0gbG9jYWxTdG9yYWdlTWVtb3J5OworICB9IGVsc2UgeworICAgIHJvb3Qu
bG9jYWxTdG9yYWdlTWVtb3J5ID0gbG9jYWxTdG9yYWdlTWVtb3J5OworICB9Cit9KSh0aGlzKTsK
ZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9yZXBv
LmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3NlcnZpY2VzL3JlcG8uanMKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uMDE0N2ZmM2VmYzdlOGFhZWYyN2I3MTAwNTA1YzAxYWQxMWY5YWNkMQotLS0gL2Rl
di9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC9zZXJ2aWNlcy9yZXBv
LmpzCkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQg
KiBhcyBsb2NhbFN0b3JhZ2VNZW1vcnkgZnJvbSAnLi9tZW1vcnknOworCitleHBvcnQgZGVmYXVs
dCBFbWJlci5TZXJ2aWNlLmV4dGVuZCh7CisgICAgbGFzdElkOiAwLAorICAgIGRhdGE6IG51bGws
CisgICAgZmluZEFsbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdkYXRhJykgfHwKKyAg
ICAgICAgICAgIHRoaXMuc2V0KCdkYXRhJywgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VNZW1vcnku
Z2V0SXRlbSgndG9kb3MnKSB8fCAnW10nKSk7CisgICAgfSwKKworICAgIGFkZChhdHRycykgewor
ICAgICAgICBsZXQgdG9kbyA9IE9iamVjdC5hc3NpZ24oeyBpZDogdGhpcy5pbmNyZW1lbnRQcm9w
ZXJ0eSgnbGFzdElkJykgfSwgYXR0cnMpOworICAgICAgICB0aGlzLmdldCgnZGF0YScpLnB1c2hP
YmplY3QodG9kbyk7CisgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgICAgICByZXR1cm4gdG9k
bzsKKyAgICB9LAorCisgICAgZGVsZXRlKHRvZG8pIHsKKyAgICAgICAgdGhpcy5nZXQoJ2RhdGEn
KS5yZW1vdmVPYmplY3QodG9kbyk7CisgICAgICAgIHRoaXMucGVyc2lzdCgpOworICAgIH0sCisK
KyAgICBwZXJzaXN0KCkgeworICAgICAgICBsb2NhbFN0b3JhZ2VNZW1vcnkuc2V0SXRlbSgndG9k
b3MnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmdldCgnZGF0YScpKSk7CisgICAgfQorfSk7CmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvc3R5bGVzL2FwcC5jc3MgYi9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvc3R5bGVzL2FwcC5jc3MKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hY3RpdmUuaGJzIGIvUGVyZm9y
bWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhh
bXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9hY3RpdmUuaGJzCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmRlMjQ0ZjQ4N2QyMzgzNDQ4YTQyYTU5ZGYwYmY0MjU2NGUyMWY1NzMKLS0tIC9kZXYvbnVsbAor
KysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2FjdGl2ZS5oYnMK
QEAgLTAsMCArMSBAQAore3t0b2RvLWxpc3QgdG9kb3M9dG9kb3N9fQpcIE5vIG5ld2xpbmUgYXQg
ZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90
ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L3RlbXBsYXRlcy9hcHBsaWNhdGlvbi5oYnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTE5YjYyMGNkNjMwMThmNjcz
ZWFhOWE3YjkwOGQ1ODk4YTkyMTU4ZgotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvYXBwbGljYXRpb24uaGJzCkBAIC0wLDAgKzEsMjkg
QEAKKzxzZWN0aW9uIGlkPSJ0b2RvYXBwIj4KKyAgPGhlYWRlciBpZD0iaGVhZGVyIj4KKyAgICA8
aDE+dG9kb3M8L2gxPgorICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibmV3LXRvZG8iIG9ua2V5
ZG93bj17e2FjdGlvbiAnY3JlYXRlVG9kbyd9fSBwbGFjZWhvbGRlcj0iV2hhdCBuZWVkcyB0byBi
ZSBkb25lPyIgYXV0b2ZvY3VzPgorICA8L2hlYWRlcj4KKyAgICB7e291dGxldH19CisgICAge3sj
aWYgKGd0IG1vZGVsLmxlbmd0aCAwKX19CisgICAgICA8Zm9vdGVyIGlkPSJmb290ZXIiPgorICAg
ICAgICA8c3BhbiBpZD0idG9kby1jb3VudCI+PHN0cm9uZz57e3JlbWFpbmluZy5sZW5ndGh9fTwv
c3Ryb25nPiB7e3BsdXJhbGl6ZSAnaXRlbScgcmVtYWluaW5nLmxlbmd0aH19IGxlZnQ8L3NwYW4+
CisgICAgICAgIDx1bCBpZD0iZmlsdGVycyI+CisgICAgICAgICAgPGxpPnt7I2xpbmstdG8gImlu
ZGV4IiBhY3RpdmVDbGFzcz0ic2VsZWN0ZWQifX1BbGx7ey9saW5rLXRvfX08L2xpPgorICAgICAg
ICAgIDxsaT57eyNsaW5rLXRvICJhY3RpdmUiIGFjdGl2ZUNsYXNzPSJzZWxlY3RlZCJ9fUFjdGl2
ZXt7L2xpbmstdG99fTwvbGk+CisgICAgICAgICAgPGxpPnt7I2xpbmstdG8gImNvbXBsZXRlZCIg
YWN0aXZlQ2xhc3M9InNlbGVjdGVkIn19Q29tcGxldGVke3svbGluay10b319PC9saT4KKyAgICAg
ICAgPC91bD4KKyAgICAgICAge3sjaWYgY29tcGxldGVkLmxlbmd0aH19CisgICAgICAgICAgPGJ1
dHRvbiBpZD0iY2xlYXItY29tcGxldGVkIiBvbmNsaWNrPXt7YWN0aW9uICdjbGVhckNvbXBsZXRl
ZCd9fT5DbGVhciBjb21wbGV0ZWQ8L2J1dHRvbj4KKyAgICAgICAge3svaWZ9fQorICAgICAgPC9m
b290ZXI+CisgICAge3svaWZ9fQorPC9zZWN0aW9uPgorPGZvb3RlciBpZD0iaW5mbyI+CisgIDxw
PkRvdWJsZS1jbGljayB0byBlZGl0IGEgdG9kbzwvcD4KKyAgPHA+CisgICAgQ3JlYXRlZCBieQor
ICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2NpYmVybm94Ij5NaWd1ZWwgQ2FtYmE8L2E+
LAorICAgIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2FkZHlvc21hbmkiPkFkZHkgT3NtYW5p
PC9hPgorICA8L3A+CisgIDxwPlBhcnQgb2YgPGEgaHJlZj0iaHR0cDovL3RvZG9tdmMuY29tIj5U
b2RvTVZDPC9hPjwvcD4KKzwvZm9vdGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm
ZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcGxl
dGVkLmhicyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2FwcC90ZW1wbGF0ZXMvY29tcGxl
dGVkLmhicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5kZTI0NGY0ODdkMjM4MzQ0OGE0MmE1OWRmMGJmNDI1NjRlMjFm
NTczCi0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3Rl
bXBsYXRlcy9jb21wbGV0ZWQuaGJzCkBAIC0wLDAgKzEgQEAKK3t7dG9kby1saXN0IHRvZG9zPXRv
ZG9zfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvLmdpdGtlZXAgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvLmdpdGtlZXAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFlNzc1YWQ4YzJlNDhjNTM5MQpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25l
bnRzL3RvZG8taXRlbS5oYnMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxh
dGVzL2NvbXBvbmVudHMvdG9kby1pdGVtLmhicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jMDY5NzVlODY1ZTdiOWEw
NDI3ODVlOGIzODk3N2YzNGFhZDNkYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VU
ZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMv
ZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8taXRlbS5oYnMKQEAg
LTAsMCArMSw2IEBACis8ZGl2IGNsYXNzPSJ2aWV3Ij4KKyAgPGlucHV0IHR5cGU9ImNoZWNrYm94
IiBjbGFzcz0idG9nZ2xlIiBjaGVja2VkPXt7dG9kby5jb21wbGV0ZWR9fSBvbmNoYW5nZT17e2Fj
dGlvbiAndG9nZ2xlQ29tcGxldGVkJ319PgorICA8bGFiZWwgb25kYmxjbGljaz17e2FjdGlvbiAn
c3RhcnRFZGl0aW5nJ319Pnt7dG9kby50aXRsZX19PC9sYWJlbD4KKyAgPGJ1dHRvbiBvbmNsaWNr
PXt7YWN0aW9uICdyZW1vdmVUb2RvJ319IGNsYXNzPSJkZXN0cm95Ij48L2J1dHRvbj4KKzwvZGl2
PgorPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJlZGl0IiB2YWx1ZT17e3RvZG8udGl0bGV9fSBv
bmJsdXI9e3thY3Rpb24gJ2RvbmVFZGl0aW5nJyB2YWx1ZT0ndGFyZ2V0LnZhbHVlJ319IG9ua2V5
ZG93bj17e2FjdGlvbiAnaGFuZGxlS2V5ZG93bid9fSBhdXRvZm9jdXM+ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9y
ZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBw
L3RlbXBsYXRlcy9jb21wb25lbnRzL3RvZG8tbGlzdC5oYnMgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS9hcHAvdGVtcGxhdGVzL2NvbXBvbmVudHMvdG9kby1saXN0LmhicwpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4zMDlkMDdhMWY0MTdjZjFjMTg4OTMwYzVjYmZiMzNhNzA1MWM3ODY2Ci0tLSAvZGV2L251bGwK
KysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNo
aXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9jb21wb25lbnRz
L3RvZG8tbGlzdC5oYnMKQEAgLTAsMCArMSwxMCBAQAore3sjaWYgdG9kb3MubGVuZ3RofX0KKyAg
e3sjaWYgY2FuVG9nZ2xlfX0KKyAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUt
YWxsIiBjaGVja2VkPXt7YWxsQ29tcGxldGVkfX0gb25jaGFuZ2U9e3thY3Rpb24gJ3RvZ2dsZUFs
bCd9fT4KKyAge3svaWZ9fQorICA8dWwgaWQ9InRvZG8tbGlzdCIgY2xhc3M9InRvZG8tbGlzdCI+
CisgICAge3sjZWFjaCB0b2RvcyBhcyB8dG9kb3x9fQorICAgICAge3t0b2RvLWl0ZW0gdG9kbz10
b2RvIG9uU3RhcnRFZGl0PShhY3Rpb24gJ2Rpc2FibGVUb2dnbGUnKSBvbkVuZEVkaXQ9KGFjdGlv
biAnZW5hYmxlVG9nZ2xlJyl9fQorICAgIHt7L2VhY2h9fQorICA8L3VsPgore3svaWZ9fQpkaWZm
IC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9h
cmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9pbmRleC5o
YnMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hp
dGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9hcHAvdGVtcGxhdGVzL2luZGV4Lmhicwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi43ZDU1NjVjMzZhYjM3ZGVhOWExYzQxOWRkZWE3NTNiZjE5NThjZDZmCi0tLSAv
ZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9k
b212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYXBwL3RlbXBsYXRlcy9p
bmRleC5oYnMKQEAgLTAsMCArMSwzIEBACit7eyNpZiBtb2RlbC5sZW5ndGh9fQorICB7e3RvZG8t
bGlzdCB0b2Rvcz1tb2RlbH19Cit7ey9pZn19CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3Rz
L1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJl
cmpzL3NvdXJjZS9ib3dlci5qc29uIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYm93ZXIu
anNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi4yMjBhMDAxNGEyZGYyY2VjN2I2NjViNjNiMDM0ZTNiOTU4ODllMjgz
Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvYm93ZXIuanNv
bgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgIm5hbWUiOiAidG9kb212YyIsCisgICJkZXBlbmRlbmNp
ZXMiOiB7CisgICAgImVtYmVyIjogIn4yLjYuMCIsCisgICAgImVtYmVyLWNsaS1zaGltcyI6ICIw
LjEuMSIsCisgICAgImVtYmVyLWNsaS10ZXN0LWxvYWRlciI6ICIwLjIuMiIsCisgICAgImVtYmVy
LXF1bml0LW5vdGlmaWNhdGlvbnMiOiAiMC4xLjAiCisgIH0KK30KZGlmZiAtLWdpdCBhL1BlcmZv
cm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4
YW1wbGVzL2VtYmVyanMvc291cmNlL2NvbmZpZy9lbnZpcm9ubWVudC5qcyBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvc291cmNlL2NvbmZpZy9lbnZpcm9ubWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41OTc0NGIz
ZGVjOWVkN2E4ZmM1NDQ5MGE1ZTlhNGZjYjQxOGFkNTZiCi0tLSAvZGV2L251bGwKKysrIGIvUGVy
Zm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUt
ZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvY29uZmlnL2Vudmlyb25tZW50LmpzCkBAIC0wLDAgKzEs
NDcgQEAKKy8qIGpzaGludCBub2RlOiB0cnVlICovCisKK21vZHVsZS5leHBvcnRzID0gZnVuY3Rp
b24gKGVudmlyb25tZW50KSB7CisgICAgdmFyIEVOViA9IHsKKyAgICAgICAgbW9kdWxlUHJlZml4
OiAndG9kb212YycsCisgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCwKKyAgICAgICAg
YmFzZVVSTDogbnVsbCwKKyAgICAgICAgbG9jYXRpb25UeXBlOiAnYXV0bycsCisgICAgICAgIEVt
YmVyRU5WOiB7CisgICAgICAgICAgICBGRUFUVVJFUzogeworICAgICAgICAgICAgICAgIC8vIEhl
cmUgeW91IGNhbiBlbmFibGUgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG9uIGFuIGVtYmVyIGNhbmFy
eSBidWlsZAorICAgICAgICAgICAgICAgIC8vIGUuZy4gJ3dpdGgtY29udHJvbGxlcic6IHRydWUK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBBUFA6IHsKKyAgICAgICAgICAg
IC8vIEhlcmUgeW91IGNhbiBwYXNzIGZsYWdzL29wdGlvbnMgdG8geW91ciBhcHBsaWNhdGlvbiBp
bnN0YW5jZQorICAgICAgICAgICAgLy8gd2hlbiBpdCBpcyBjcmVhdGVkCisgICAgICAgIH0KKyAg
ICB9OworCisgICAgLy8gaWYgKGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnKSB7CisgICAg
Ly8gIEVOVi5BUFAuTE9HX1JFU09MVkVSID0gdHJ1ZTsKKyAgICAvLyAgRU5WLkFQUC5MT0dfQUNU
SVZFX0dFTkVSQVRJT04gPSB0cnVlOworICAgIC8vICBFTlYuQVBQLkxPR19UUkFOU0lUSU9OUyA9
IHRydWU7CisgICAgLy8gIEVOVi5BUFAuTE9HX1RSQU5TSVRJT05TX0lOVEVSTkFMID0gdHJ1ZTsK
KyAgICAvLyAgRU5WLkFQUC5MT0dfVklFV19MT09LVVBTID0gdHJ1ZTsKKyAgICAvLyB9CisKKyAg
ICBpZiAoZW52aXJvbm1lbnQgPT09ICd0ZXN0JykgeworICAgICAgICAvLyBUZXN0ZW0gcHJlZmVy
cyB0aGlzLi4uCisgICAgICAgIEVOVi5iYXNlVVJMID0gJy8nOworICAgICAgICBFTlYubG9jYXRp
b25UeXBlID0gJ25vbmUnOworCisgICAgICAgIC8vIGtlZXAgdGVzdCBjb25zb2xlIG91dHB1dCBx
dWlldGVyCisgICAgICAgIEVOVi5BUFAuTE9HX0FDVElWRV9HRU5FUkFUSU9OID0gZmFsc2U7Cisg
ICAgICAgIEVOVi5BUFAuTE9HX1ZJRVdfTE9PS1VQUyA9IGZhbHNlOworCisgICAgICAgIEVOVi5B
UFAucm9vdEVsZW1lbnQgPSAnI2VtYmVyLXRlc3RpbmcnOworICAgIH0KKworICAgIC8vIGlmIChl
bnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nKSB7CisKKyAgICAvLyB9CisKKyAgICByZXR1cm4g
RU5WOworfTsKZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2VtYmVyLWNs
aS1idWlsZC5qcyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9t
dmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL2VtYmVyLWNsaS1idWlsZC5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5iMWRiZjU5MThjYjgxMDk4YzgzMGJmMzg1YjFiYzVkOTQ0Y2UwOTVjCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvZW1iZXItY2xpLWJ1
aWxkLmpzCkBAIC0wLDAgKzEsMjYgQEAKKy8qanNoaW50IG5vZGU6dHJ1ZSovCisvKiBnbG9iYWwg
cmVxdWlyZSwgbW9kdWxlICovCit2YXIgRW1iZXJBcHAgPSByZXF1aXJlKCdlbWJlci1jbGkvbGli
L2Jyb2Njb2xpL2VtYmVyLWFwcCcpOworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkZWZh
dWx0cykgeworICAgIHZhciBhcHAgPSBuZXcgRW1iZXJBcHAoZGVmYXVsdHMsIHsKKyAgICAgICAg
Ly8gQWRkIG9wdGlvbnMgaGVyZQorICAgIH0pOworCisgICAgYXBwLmltcG9ydCgndmVuZG9yL2Jh
c2UuY3NzJyk7CisgICAgYXBwLmltcG9ydCgndmVuZG9yL2luZGV4LmNzcycpOworICAgIC8vIFVz
ZSBgYXBwLmltcG9ydGAgdG8gYWRkIGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIHRoZSBnZW5lcmF0
ZWQKKyAgICAvLyBvdXRwdXQgZmlsZXMuCisgICAgLy8KKyAgICAvLyBJZiB5b3UgbmVlZCB0byB1
c2UgZGlmZmVyZW50IGFzc2V0cyBpbiBkaWZmZXJlbnQKKyAgICAvLyBlbnZpcm9ubWVudHMsIHNw
ZWNpZnkgYW4gb2JqZWN0IGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIFRoYXQKKyAgICAvLyBvYmpl
Y3QncyBrZXlzIHNob3VsZCBiZSB0aGUgZW52aXJvbm1lbnQgbmFtZSBhbmQgdGhlIHZhbHVlcwor
ICAgIC8vIHNob3VsZCBiZSB0aGUgYXNzZXQgdG8gdXNlIGluIHRoYXQgZW52aXJvbm1lbnQuCisg
ICAgLy8KKyAgICAvLyBJZiB0aGUgbGlicmFyeSB0aGF0IHlvdSBhcmUgaW5jbHVkaW5nIGNvbnRh
aW5zIEFNRCBvciBFUzYKKyAgICAvLyBtb2R1bGVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaW1w
b3J0IGludG8geW91ciBhcHBsaWNhdGlvbgorICAgIC8vIHBsZWFzZSBzcGVjaWZ5IGFuIG9iamVj
dCB3aXRoIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMga2V5cworICAgIC8vIGFsb25nIHdpdGggdGhl
IGV4cG9ydHMgb2YgZWFjaCBtb2R1bGUgYXMgaXRzIHZhbHVlLgorCisgICAgcmV0dXJuIGFwcC50
b1RyZWUoKTsKK307CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wYWNr
YWdlLmpzb24gYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZj
L2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wYWNrYWdlLmpzb24KbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uNWJlNjU3MzIwZjIxZDQ2MzdiNGRkYWY3OTc3NGI2OWI2M2FhZDAzMQotLS0gL2Rldi9u
dWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMv
YXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3BhY2thZ2UuanNvbgpAQCAtMCww
ICsxLDQyIEBACit7CisgICJuYW1lIjogInRvZG9tdmMiLAorICAidmVyc2lvbiI6ICIwLjAuMCIs
CisgICJkZXNjcmlwdGlvbiI6ICJTbWFsbCBkZXNjcmlwdGlvbiBmb3IgdG9kb212YyBnb2VzIGhl
cmUiLAorICAicHJpdmF0ZSI6IHRydWUsCisgICJkaXJlY3RvcmllcyI6IHsKKyAgICAiZG9jIjog
ImRvYyIsCisgICAgInRlc3QiOiAidGVzdHMiCisgIH0sCisgICJzY3JpcHRzIjogeworICAgICJi
dWlsZCI6ICJlbWJlciBidWlsZCIsCisgICAgInN0YXJ0IjogImVtYmVyIHNlcnZlciIsCisgICAg
InRlc3QiOiAiZW1iZXIgdGVzdCIKKyAgfSwKKyAgInJlcG9zaXRvcnkiOiAiIiwKKyAgImVuZ2lu
ZXMiOiB7CisgICAgIm5vZGUiOiAiPj0gMC4xMC4wIgorICB9LAorICAiYXV0aG9yIjogIiIsCisg
ICJsaWNlbnNlIjogIk1JVCIsCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImJyb2Njb2xp
LWFzc2V0LXJldiI6ICJeMi40LjIiLAorICAgICJlbWJlci1hamF4IjogIjAuNy4xIiwKKyAgICAi
ZW1iZXItY2xpIjogIjIuNS4wIiwKKyAgICAiZW1iZXItY2xpLWFwcC12ZXJzaW9uIjogIl4xLjAu
MCIsCisgICAgImVtYmVyLWNsaS1iYWJlbCI6ICJeNS4xLjYiLAorICAgICJlbWJlci1jbGktZGVw
ZW5kZW5jeS1jaGVja2VyIjogIl4xLjIuMCIsCisgICAgImVtYmVyLWNsaS1odG1sYmFycyI6ICJe
MS4wLjMiLAorICAgICJlbWJlci1jbGktaHRtbGJhcnMtaW5saW5lLXByZWNvbXBpbGUiOiAiXjAu
My4xIiwKKyAgICAiZW1iZXItY2xpLWluamVjdC1saXZlLXJlbG9hZCI6ICJeMS40LjAiLAorICAg
ICJlbWJlci1jbGktanNoaW50IjogIl4xLjAuMCIsCisgICAgImVtYmVyLWNsaS1xdW5pdCI6ICJe
MS40LjAiLAorICAgICJlbWJlci1jbGktcmVsZWFzZSI6ICIwLjIuOCIsCisgICAgImVtYmVyLWNs
aS1zcmkiOiAiXjIuMS4wIiwKKyAgICAiZW1iZXItY2xpLXVnbGlmeSI6ICJeMS4yLjAiLAorICAg
ICJlbWJlci1leHBvcnQtYXBwbGljYXRpb24tZ2xvYmFsIjogIl4xLjAuNSIsCisgICAgImVtYmVy
LWluZmxlY3RvciI6ICIxLjkuNCIsCisgICAgImVtYmVyLWxvYWQtaW5pdGlhbGl6ZXJzIjogIl4w
LjUuMSIsCisgICAgImVtYmVyLXJlc29sdmVyIjogIl4yLjAuMyIsCisgICAgImxvYWRlci5qcyI6
ICJeNC4wLjEiCisgIH0KK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3B1YmxpYy9jcm9zc2RvbWFpbi54bWwgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS9wdWJs
aWMvY3Jvc3Nkb21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBjMTZhN2EwN2IzN2U1ZDVmN2UwZTU2Yzgy
OWY3MjAwNjc0NTg0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS9wdWJsaWMvY3Jvc3Nkb21haW4ueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNp
b249IjEuMCI/PgorPCFET0NUWVBFIGNyb3NzLWRvbWFpbi1wb2xpY3kgU1lTVEVNICJodHRwOi8v
d3d3LmFkb2JlLmNvbS94bWwvZHRkcy9jcm9zcy1kb21haW4tcG9saWN5LmR0ZCI+Cis8Y3Jvc3Mt
ZG9tYWluLXBvbGljeT4KKyAgPCEtLSBSZWFkIHRoaXM6IHd3dy5hZG9iZS5jb20vZGV2bmV0L2Fy
dGljbGVzL2Nyb3NzZG9tYWluX3BvbGljeV9maWxlX3NwZWMuaHRtbCAtLT4KKworICA8IS0tIE1v
c3QgcmVzdHJpY3RpdmUgcG9saWN5OiAtLT4KKyAgPHNpdGUtY29udHJvbCBwZXJtaXR0ZWQtY3Jv
c3MtZG9tYWluLXBvbGljaWVzPSJub25lIi8+CisKKyAgPCEtLSBMZWFzdCByZXN0cmljdGl2ZSBw
b2xpY3k6IC0tPgorICA8IS0tCisgIDxzaXRlLWNvbnRyb2wgcGVybWl0dGVkLWNyb3NzLWRvbWFp
bi1wb2xpY2llcz0iYWxsIi8+CisgIDxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49IioiIHRvLXBv
cnRzPSIqIiBzZWN1cmU9ImZhbHNlIi8+CisgIDxhbGxvdy1odHRwLXJlcXVlc3QtaGVhZGVycy1m
cm9tIGRvbWFpbj0iKiIgaGVhZGVycz0iKiIgc2VjdXJlPSJmYWxzZSIvPgorICAtLT4KKzwvY3Jv
c3MtZG9tYWluLXBvbGljeT4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3B1YmxpYy9yb2JvdHMudHh0IGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvcHVibGljL3Jv
Ym90cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZjU5MTY0NTJlNWZmNmM4YjQzZDZkN2M3M2QwMDE1M2QzNGFj
MzVkZQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3B1Ymxp
Yy9yb2JvdHMudHh0CkBAIC0wLDAgKzEsMyBAQAorIyBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcK
K1VzZXItYWdlbnQ6ICoKK0Rpc2FsbG93OgpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJj
ZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdGVtLmpz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmRlMTQyZWUxMDRmZTZjNjFhNmQyYWI5YTc1NTQwNTM3NGQwODIyYjUKLS0t
IC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90
b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0ZW0uanMKQEAg
LTAsMCArMSwxMyBAQAorLypqc2hpbnQgbm9kZTp0cnVlKi8KK21vZHVsZS5leHBvcnRzID0gewor
ICAgIGZyYW1ld29yazogJ3F1bml0JywKKyAgICB0ZXN0X3BhZ2U6ICd0ZXN0cy9pbmRleC5odG1s
P2hpZGVwYXNzZWQnLAorICAgIGRpc2FibGVfd2F0Y2hpbmc6IHRydWUsCisgICAgbGF1bmNoX2lu
X2NpOiBbCisgICAgICAgICdQaGFudG9tSlMnCisgICAgXSwKKyAgICBsYXVuY2hfaW5fZGV2OiBb
CisgICAgICAgICdQaGFudG9tSlMnLAorICAgICAgICAnQ2hyb21lJworICAgIF0KK307CmRpZmYg
LS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2Fy
Y2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy8uanNoaW50cmMgYi9QZXJm
b3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1l
eGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy8uanNoaW50cmMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmVjMGI3
YzE1NGIwOTMzNzI5MWM1ZDczNmU5OWQ1OTI4ZDU2MDU0OQotLS0gL2Rldi9udWxsCisrKyBiL1Bl
cmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJl
LWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzLy5qc2hpbnRyYwpAQCAtMCwwICsxLDUyIEBA
Cit7CisgICJwcmVkZWYiOiBbCisgICAgImRvY3VtZW50IiwKKyAgICAid2luZG93IiwKKyAgICAi
bG9jYXRpb24iLAorICAgICJzZXRUaW1lb3V0IiwKKyAgICAiJCIsCisgICAgIi1Qcm9taXNlIiwK
KyAgICAiZGVmaW5lIiwKKyAgICAiY29uc29sZSIsCisgICAgInZpc2l0IiwKKyAgICAiZXhpc3Rz
IiwKKyAgICAiZmlsbEluIiwKKyAgICAiY2xpY2siLAorICAgICJrZXlFdmVudCIsCisgICAgInRy
aWdnZXJFdmVudCIsCisgICAgImZpbmQiLAorICAgICJmaW5kV2l0aEFzc2VydCIsCisgICAgIndh
aXQiLAorICAgICJEUyIsCisgICAgImFuZFRoZW4iLAorICAgICJjdXJyZW50VVJMIiwKKyAgICAi
Y3VycmVudFBhdGgiLAorICAgICJjdXJyZW50Um91dGVOYW1lIgorICBdLAorICAibm9kZSI6IGZh
bHNlLAorICAiYnJvd3NlciI6IGZhbHNlLAorICAiYm9zcyI6IHRydWUsCisgICJjdXJseSI6IHRy
dWUsCisgICJkZWJ1ZyI6IGZhbHNlLAorICAiZGV2ZWwiOiBmYWxzZSwKKyAgImVxZXFlcSI6IHRy
dWUsCisgICJldmlsIjogdHJ1ZSwKKyAgImZvcmluIjogZmFsc2UsCisgICJpbW1lZCI6IGZhbHNl
LAorICAibGF4YnJlYWsiOiBmYWxzZSwKKyAgIm5ld2NhcCI6IHRydWUsCisgICJub2FyZyI6IHRy
dWUsCisgICJub2VtcHR5IjogZmFsc2UsCisgICJub25ldyI6IGZhbHNlLAorICAibm9tZW4iOiBm
YWxzZSwKKyAgIm9uZXZhciI6IGZhbHNlLAorICAicGx1c3BsdXMiOiBmYWxzZSwKKyAgInJlZ2V4
cCI6IGZhbHNlLAorICAidW5kZWYiOiB0cnVlLAorICAic3ViIjogdHJ1ZSwKKyAgInN0cmljdCI6
IGZhbHNlLAorICAid2hpdGUiOiBmYWxzZSwKKyAgImVxbnVsbCI6IHRydWUsCisgICJlc25leHQi
OiB0cnVlLAorICAidW51c2VkIjogdHJ1ZQorfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9kZXN0cm95LWFwcC5qcyBiL1BlcmZvcm1hbmNlVGVz
dHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2Vt
YmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvZGVzdHJveS1hcHAuanMKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTNk
NDk4OTUwMTJkOTZhMjljYTVhYzdjNjFkYWRhZmFhOWIzY2E0NQotLS0gL2Rldi9udWxsCisrKyBi
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvZGVzdHJveS1hcHAuanMK
QEAgLTAsMCArMSw1IEBACitpbXBvcnQgRW1iZXIgZnJvbSAnZW1iZXInOworCitleHBvcnQgZGVm
YXVsdCBmdW5jdGlvbiBkZXN0cm95QXBwKGFwcGxpY2F0aW9uKSB7CisgICAgRW1iZXIucnVuKGFw
cGxpY2F0aW9uLCAnZGVzdHJveScpOworfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9T
cGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJq
cy9zb3VyY2UvdGVzdHMvaGVscGVycy9tb2R1bGUtZm9yLWFjY2VwdGFuY2UuanMgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy9oZWxwZXJzL21vZHVsZS1mb3ItYWNjZXB0YW5jZS5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kYmQ4MGZjMDQyYzY4MmNhYTIwZWYwZDBlNjg0NWU0NzQ1ZTFhYjBlCi0t
LSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVy
cy9tb2R1bGUtZm9yLWFjY2VwdGFuY2UuanMKQEAgLTAsMCArMSwyMiBAQAoraW1wb3J0IHsgbW9k
dWxlIH0gZnJvbSAncXVuaXQnOworaW1wb3J0IHN0YXJ0QXBwIGZyb20gJy4uL2hlbHBlcnMvc3Rh
cnQtYXBwJzsKK2ltcG9ydCBkZXN0cm95QXBwIGZyb20gJy4uL2hlbHBlcnMvZGVzdHJveS1hcHAn
OworCitleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucyA9IHt9KSB7CisgICAg
bW9kdWxlKG5hbWUsIHsKKyAgICAgICAgYmVmb3JlRWFjaCgpIHsKKyAgICAgICAgICAgIHRoaXMu
YXBwbGljYXRpb24gPSBzdGFydEFwcCgpOworCisgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZv
cmVFYWNoKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5iZWZvcmVFYWNoLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgYWZ0ZXJF
YWNoKCkgeworICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXJFYWNoKSB7CisgICAgICAgICAg
ICAgICAgb3B0aW9ucy5hZnRlckVhY2guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGRlc3Ryb3lBcHAodGhpcy5hcHBsaWNhdGlvbik7CisgICAgICAg
IH0KKyAgICB9KTsKK30KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIv
cmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rl
c3RzL2hlbHBlcnMvcmVzb2x2ZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jl
c291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0
cy9oZWxwZXJzL3Jlc29sdmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUwZTkxNzlmNTQ2MzUwMjVmOTUwNGEz
NDllNDIzMDJhODAwNWZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1Nw
ZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpz
L3NvdXJjZS90ZXN0cy9oZWxwZXJzL3Jlc29sdmVyLmpzCkBAIC0wLDAgKzEsMTEgQEAKK2ltcG9y
dCBSZXNvbHZlciBmcm9tICcuLi8uLi9yZXNvbHZlcic7CitpbXBvcnQgY29uZmlnIGZyb20gJy4u
Ly4uL2NvbmZpZy9lbnZpcm9ubWVudCc7CisKK2NvbnN0IHJlc29sdmVyID0gUmVzb2x2ZXIuY3Jl
YXRlKCk7CisKK3Jlc29sdmVyLm5hbWVzcGFjZSA9IHsKKyAgICBtb2R1bGVQcmVmaXg6IGNvbmZp
Zy5tb2R1bGVQcmVmaXgsCisgICAgcG9kTW9kdWxlUHJlZml4OiBjb25maWcucG9kTW9kdWxlUHJl
Zml4Cit9OworCitleHBvcnQgZGVmYXVsdCByZXNvbHZlcjsKZGlmZiAtLWdpdCBhL1BlcmZvcm1h
bmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1w
bGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvc3RhcnQtYXBwLmpzIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvaGVscGVycy9zdGFydC1hcHAuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZWYxYjZiNTVlZThlNzk2OTc4MzcxZDI3YjBhMzNmY2Y3NDE5NjlkZQotLS0gL2Rldi9udWxsCisr
KyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0
ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3RzL2hlbHBlcnMvc3RhcnQtYXBwLmpz
CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBFbWJlciBmcm9tICdlbWJlcic7CitpbXBvcnQgQXBw
bGljYXRpb24gZnJvbSAnLi4vLi4vYXBwJzsKK2ltcG9ydCBjb25maWcgZnJvbSAnLi4vLi4vY29u
ZmlnL2Vudmlyb25tZW50JzsKKworZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRBcHAoYXR0
cnMpIHsKKyAgICBsZXQgYXBwbGljYXRpb247CisKKyAgICBsZXQgYXR0cmlidXRlcyA9IEVtYmVy
Lm1lcmdlKHt9LCBjb25maWcuQVBQKTsKKyAgICBhdHRyaWJ1dGVzID0gRW1iZXIubWVyZ2UoYXR0
cmlidXRlcywgYXR0cnMpOyAvLyB1c2UgZGVmYXVsdHMsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlOwor
CisgICAgRW1iZXIucnVuKCgpID0+IHsKKyAgICAgICAgYXBwbGljYXRpb24gPSBBcHBsaWNhdGlv
bi5jcmVhdGUoYXR0cmlidXRlcyk7CisgICAgICAgIGFwcGxpY2F0aW9uLnNldHVwRm9yVGVzdGlu
ZygpOworICAgICAgICBhcHBsaWNhdGlvbi5pbmplY3RUZXN0SGVscGVycygpOworICAgIH0pOwor
CisgICAgcmV0dXJuIGFwcGxpY2F0aW9uOworfQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy9zb3VyY2UvdGVzdHMvaW5kZXguaHRtbCBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0
ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNl
L3Rlc3RzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2Y0NDIwODMzMjlhN2IwMWM1MGFjODgxNTk1
NGQ3NmM0OWE4ZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291
cmNlL3Rlc3RzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCFET0NUWVBFIGh0bWw+Cis8
aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0
dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxl
PlRvZG9tdmMgVGVzdHM8L3RpdGxlPgorICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250
ZW50PSIiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Ut
d2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFkIn19Cisg
ICAge3tjb250ZW50LWZvciAidGVzdC1oZWFkIn19CisKKyAgICA8bGluayByZWw9InN0eWxlc2hl
ZXQiIGhyZWY9ImFzc2V0cy92ZW5kb3IuY3NzIj4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9ImFzc2V0cy90b2RvbXZjLmNzcyI+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSJhc3NldHMvdGVzdC1zdXBwb3J0LmNzcyI+CisKKyAgICB7e2NvbnRlbnQtZm9yICJoZWFk
LWZvb3RlciJ9fQorICAgIHt7Y29udGVudC1mb3IgInRlc3QtaGVhZC1mb290ZXIifX0KKyAgPC9o
ZWFkPgorICA8Ym9keT4KKyAgICB7e2NvbnRlbnQtZm9yICJib2R5In19CisgICAge3tjb250ZW50
LWZvciAidGVzdC1ib2R5In19CisKKyAgICA8c2NyaXB0IHNyYz0idGVzdGVtLmpzIiBpbnRlZ3Jp
dHk9IiI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy92ZW5kb3IuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSJhc3NldHMvdGVzdC1zdXBwb3J0LmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iYXNzZXRzL3RvZG9tdmMuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSJhc3NldHMvdGVzdHMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJhc3Nl
dHMvdGVzdC1sb2FkZXIuanMiPjwvc2NyaXB0PgorCisgICAge3tjb250ZW50LWZvciAiYm9keS1m
b290ZXIifX0KKyAgICB7e2NvbnRlbnQtZm9yICJ0ZXN0LWJvZHktZm9vdGVyIn19CisgIDwvYm9k
eT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3Rlc3Rz
L2ludGVncmF0aW9uLy5naXRrZWVwIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMv
aW50ZWdyYXRpb24vLmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFl
Nzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dGVzdHMvdGVzdC1oZWxwZXIuanMgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291
cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy90
ZXN0LWhlbHBlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzk5NjFmZDU2YTEyYjdlZTJiMmQ4YzE3NTIwZWZk
YTNkNmEwZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dGVzdHMvdGVzdC1oZWxwZXIuanMKQEAgLTAsMCArMSw2IEBACitpbXBvcnQgcmVzb2x2ZXIgZnJv
bSAnLi9oZWxwZXJzL3Jlc29sdmVyJzsKK2ltcG9ydCB7CisgICAgc2V0UmVzb2x2ZXIKK30gZnJv
bSAnZW1iZXItcXVuaXQnOworCitzZXRSZXNvbHZlcihyZXNvbHZlcik7CmRpZmYgLS1naXQgYS9Q
ZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVy
ZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS90ZXN0cy91bml0Ly5naXRrZWVwIGIvUGVyZm9ybWFu
Y2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBs
ZXMvZW1iZXJqcy9zb3VyY2UvdGVzdHMvdW5pdC8uZ2l0a2VlcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lNjlkZTI5
YmIyZDFkNjQzNGI4YjI5YWU3NzVhZDhjMmU0OGM1MzkxCmRpZmYgLS1naXQgYS9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvLmdpdGtlZXAgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVk
b21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Nv
dXJjZS92ZW5kb3IvLmdpdGtlZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTY5ZGUyOWJiMmQxZDY0MzRiOGIyOWFl
Nzc1YWQ4YzJlNDhjNTM5MQpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRl
ci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2Uv
dmVuZG9yL2Jhc2UuY3NzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMv
dG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy9zb3VyY2UvdmVuZG9yL2Jhc2Uu
Y3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjRkMjVkM2M4NGFjNmM2YWVmMjZiOTY4M2EyYmMxMGM2MWY5NjBjOGYK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvYmFz
ZS5jc3MKQEAgLTAsMCArMSwxNDEgQEAKK2hyIHsKKyAgICBtYXJnaW46IDIwcHggMDsKKyAgICBi
b3JkZXI6IDA7CisgICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjYzVjNWM1OworICAgIGJvcmRl
ci1ib3R0b206IDFweCBkYXNoZWQgI2Y3ZjdmNzsKK30KKworLmxlYXJuIGEgeworICAgIGZvbnQt
d2VpZ2h0OiBub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiAj
YjgzZjQ1OworfQorCisubGVhcm4gYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRl
cmxpbmU7CisgICAgY29sb3I6ICM3ODdlN2U7Cit9CisKKy5sZWFybiBoMywKKy5sZWFybiBoNCwK
Ky5sZWFybiBoNSB7CisgICAgbWFyZ2luOiAxMHB4IDA7CisgICAgZm9udC13ZWlnaHQ6IDUwMDsK
KyAgICBsaW5lLWhlaWdodDogMS4yOworICAgIGNvbG9yOiAjMDAwOworfQorCisubGVhcm4gaDMg
eworICAgIGZvbnQtc2l6ZTogMjRweDsKK30KKworLmxlYXJuIGg0IHsKKyAgICBmb250LXNpemU6
IDE4cHg7Cit9CisKKy5sZWFybiBoNSB7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICBmb250
LXNpemU6IDE0cHg7Cit9CisKKy5sZWFybiB1bCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJn
aW46IDAgMCAzMHB4IDI1cHg7Cit9CisKKy5sZWFybiBsaSB7CisgICAgbGluZS1oZWlnaHQ6IDIw
cHg7Cit9CisKKy5sZWFybiBwIHsKKyAgICBmb250LXNpemU6IDE1cHg7CisgICAgZm9udC13ZWln
aHQ6IDMwMDsKKyAgICBsaW5lLWhlaWdodDogMS4zOworICAgIG1hcmdpbi10b3A6IDA7CisgICAg
bWFyZ2luLWJvdHRvbTogMDsKK30KKworI2lzc3VlLWNvdW50IHsKKyAgICBkaXNwbGF5OiBub25l
OworfQorCisucXVvdGUgeworICAgIGJvcmRlcjogbm9uZTsKKyAgICBtYXJnaW46IDIwcHggMCA2
MHB4IDA7Cit9CisKKy5xdW90ZSBwIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKy5x
dW90ZSBwOmJlZm9yZSB7CisgICAgY29udGVudDogJ+KAnCc7CisgICAgZm9udC1zaXplOiA1MHB4
OworICAgIG9wYWNpdHk6IC4xNTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAt
MjBweDsKKyAgICBsZWZ0OiAzcHg7Cit9CisKKy5xdW90ZSBwOmFmdGVyIHsKKyAgICBjb250ZW50
OiAn4oCdJzsKKyAgICBmb250LXNpemU6IDUwcHg7CisgICAgb3BhY2l0eTogLjE1OworICAgIHBv
c2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206IC00MnB4OworICAgIHJpZ2h0OiAzcHg7Cit9
CisKKy5xdW90ZSBmb290ZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBib3R0b206
IC00MHB4OworICAgIHJpZ2h0OiAwOworfQorCisucXVvdGUgZm9vdGVyIGltZyB7CisgICAgYm9y
ZGVyLXJhZGl1czogM3B4OworfQorCisucXVvdGUgZm9vdGVyIGEgeworICAgIG1hcmdpbi1sZWZ0
OiA1cHg7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLnNwZWVjaC1idWJibGUg
eworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBwYWRkaW5nOiAxMHB4OworICAgIGJhY2tn
cm91bmQ6IHJnYmEoMCwgMCwgMCwgLjA0KTsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7Cit9CisK
Ky5zcGVlY2gtYnViYmxlOmFmdGVyIHsKKyAgICBjb250ZW50OiAnJzsKKyAgICBwb3NpdGlvbjog
YWJzb2x1dGU7CisgICAgdG9wOiAxMDAlOworICAgIHJpZ2h0OiAzMHB4OworICAgIGJvcmRlcjog
MTNweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAs
IDAsIC4wNCk7Cit9CisKKy5sZWFybi1iYXIgPiAubGVhcm4geworICAgIHBvc2l0aW9uOiBhYnNv
bHV0ZTsKKyAgICB3aWR0aDogMjcycHg7CisgICAgdG9wOiA4cHg7CisgICAgbGVmdDogLTMwMHB4
OworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogNXB4OworICAgIGJhY2tn
cm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjYpOworICAgIHRyYW5zaXRpb24tcHJv
cGVydHk6IGxlZnQ7CisgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNTAwbXM7Cit9CisKK0BtZWRp
YSAobWluLXdpZHRoOiA4OTlweCkgeworICAgIC5sZWFybi1iYXIgeworICAgICAgICB3aWR0aDog
YXV0bzsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAzMDBweDsKKyAgICB9CisKKyAgICAubGVhcm4t
YmFyID4gLmxlYXJuIHsKKyAgICAgICAgbGVmdDogOHB4OworICAgIH0KK30KZGlmZiAtLWdpdCBh
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvc291cmNlL3ZlbmRvci9pbmRleC5jc3MgYi9QZXJmb3JtYW5j
ZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxl
cy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvaW5kZXguY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE3ZWExODAxNjEy
MTI2ZjFkYjY1Y2UwNTY4ZjJhMDIzNzNiOTNiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3Jt
YW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFt
cGxlcy9lbWJlcmpzL3NvdXJjZS92ZW5kb3IvaW5kZXguY3NzCkBAIC0wLDAgKzEsMzc4IEBACito
dG1sLAorYm9keSB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CisKK2J1dHRv
biB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgYm9yZGVyOiAwOworICAg
IGJhY2tncm91bmQ6IG5vbmU7CisgICAgZm9udC1zaXplOiAxMDAlOworICAgIHZlcnRpY2FsLWFs
aWduOiBiYXNlbGluZTsKKyAgICBmb250LWZhbWlseTogaW5oZXJpdDsKKyAgICBmb250LXdlaWdo
dDogaW5oZXJpdDsKKyAgICBjb2xvcjogaW5oZXJpdDsKKyAgICAtd2Via2l0LWFwcGVhcmFuY2U6
IG5vbmU7CisgICAgYXBwZWFyYW5jZTogbm9uZTsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5n
OiBhbnRpYWxpYXNlZDsKKyAgICAtbW96LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAg
ICBmb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Cit9CisKK2JvZHkgeworICAgIGZvbnQ6IDE0
cHggJ0hlbHZldGljYSBOZXVlJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgICBs
aW5lLWhlaWdodDogMS40ZW07CisgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKKyAgICBjb2xvcjog
IzRkNGQ0ZDsKKyAgICBtaW4td2lkdGg6IDIzMHB4OworICAgIG1heC13aWR0aDogNTUwcHg7Cisg
ICAgbWFyZ2luOiAwIGF1dG87CisgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFz
ZWQ7CisgICAgLW1vei1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CisgICAgZm9udC1zbW9v
dGhpbmc6IGFudGlhbGlhc2VkOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7Cit9CisKK2J1dHRvbiwK
K2lucHV0W3R5cGU9ImNoZWNrYm94Il0geworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy5oaWRk
ZW4geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyN0b2RvYXBwIHsKKyAgICBiYWNrZ3JvdW5k
OiAjZmZmOworICAgIG1hcmdpbjogMTMwcHggMCA0MHB4IDA7CisgICAgcG9zaXRpb246IHJlbGF0
aXZlOworICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSwKKyAg
ICAgICAgICAgICAgICAwIDI1cHggNTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTsKK30KKworI3Rv
ZG9hcHAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeworICAgIGZvbnQtc3R5bGU6
IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogMzAwOworICAgIGNvbG9yOiAjZTZlNmU2OworfQor
CisjdG9kb2FwcCBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHlsZTogaXRh
bGljOworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9CisKKyN0
b2RvYXBwIGlucHV0OjppbnB1dC1wbGFjZWhvbGRlciB7CisgICAgZm9udC1zdHlsZTogaXRhbGlj
OworICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgY29sb3I6ICNlNmU2ZTY7Cit9CisKKyN0b2Rv
YXBwIGgxIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAtMTU1cHg7CisgICAg
d2lkdGg6IDEwMCU7CisgICAgZm9udC1zaXplOiAxMDBweDsKKyAgICBmb250LXdlaWdodDogMTAw
OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBjb2xvcjogcmdiYSgxNzUsIDQ3LCA0Nywg
MC4xNSk7CisgICAgLXdlYmtpdC10ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5Owor
ICAgIC1tb3otdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKKyAgICB0ZXh0LXJl
bmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OworfQorCisjbmV3LXRvZG8sCisuZWRpdCB7Cisg
ICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbjogMDsKKyAgICB3aWR0aDogMTAwJTsK
KyAgICBmb250LXNpemU6IDI0cHg7CisgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CisgICAgZm9u
dC13ZWlnaHQ6IGluaGVyaXQ7CisgICAgbGluZS1oZWlnaHQ6IDEuNGVtOworICAgIGJvcmRlcjog
MDsKKyAgICBvdXRsaW5lOiBub25lOworICAgIGNvbG9yOiBpbmhlcml0OworICAgIHBhZGRpbmc6
IDZweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgIGJveC1zaGFkb3c6IGluc2V0
IDAgLTFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMik7CisgICAgYm94LXNpemluZzogYm9yZGVy
LWJveDsKKyAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICAtbW96
LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKKyAgICBmb250LXNtb290aGluZzogYW50aWFs
aWFzZWQ7Cit9CisKKyNuZXctdG9kbyB7CisgICAgcGFkZGluZzogMTZweCAxNnB4IDE2cHggNjBw
eDsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAw
Myk7CisgICAgYm94LXNoYWRvdzogaW5zZXQgMCAtMnB4IDFweCByZ2JhKDAsMCwwLDAuMDMpOwor
fQorCisjbWFpbiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHotaW5kZXg6IDI7Cisg
ICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7Cit9CisKK2xhYmVsW2Zvcj0ndG9nZ2xl
LWFsbCddIHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9nZ2xlLWFsbCB7CisgICAgcG9z
aXRpb246IGFic29sdXRlOworICAgIHRvcDogLTU1cHg7CisgICAgbGVmdDogLTEycHg7CisgICAg
d2lkdGg6IDYwcHg7CisgICAgaGVpZ2h0OiAzNHB4OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsK
KyAgICBib3JkZXI6IG5vbmU7IC8qIE1vYmlsZSBTYWZhcmkgKi8KK30KKworI3RvZ2dsZS1hbGw6
YmVmb3JlIHsKKyAgICBjb250ZW50OiAn4p2vJzsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAg
Y29sb3I6ICNlNmU2ZTY7CisgICAgcGFkZGluZzogMTBweCAyN3B4IDEwcHggMjdweDsKK30KKwor
I3RvZ2dsZS1hbGw6Y2hlY2tlZDpiZWZvcmUgeworICAgIGNvbG9yOiAjNzM3MzczOworfQorCisj
dG9kby1saXN0IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBsaXN0LXN0
eWxlOiBub25lOworfQorCisjdG9kby1saXN0IGxpIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7
CisgICAgZm9udC1zaXplOiAyNHB4OworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWRl
ZGVkOworfQorCisjdG9kby1saXN0IGxpOmxhc3QtY2hpbGQgeworICAgIGJvcmRlci1ib3R0b206
IG5vbmU7Cit9CisKKyN0b2RvLWxpc3QgbGkuZWRpdGluZyB7CisgICAgYm9yZGVyLWJvdHRvbTog
bm9uZTsKKyAgICBwYWRkaW5nOiAwOworfQorCisjdG9kby1saXN0IGxpLmVkaXRpbmcgLmVkaXQg
eworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHdpZHRoOiA1MDZweDsKKyAgICBwYWRkaW5nOiAx
M3B4IDE3cHggMTJweCAxN3B4OworICAgIG1hcmdpbjogMCAwIDAgNDNweDsKK30KKworI3RvZG8t
bGlzdCBsaS5lZGl0aW5nIC52aWV3IHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisjdG9kby1s
aXN0IGxpIC50b2dnbGUgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICB3aWR0aDogNDBw
eDsKKyAgICAvKiBhdXRvLCBzaW5jZSBub24tV2ViS2l0IGJyb3dzZXJzIGRvZXNuJ3Qgc3VwcG9y
dCBpbnB1dCBzdHlsaW5nICovCisgICAgaGVpZ2h0OiBhdXRvOworICAgIHBvc2l0aW9uOiBhYnNv
bHV0ZTsKKyAgICB0b3A6IDA7CisgICAgYm90dG9tOiAwOworICAgIG1hcmdpbjogYXV0byAwOwor
ICAgIGJvcmRlcjogbm9uZTsgLyogTW9iaWxlIFNhZmFyaSAqLworICAgIC13ZWJraXQtYXBwZWFy
YW5jZTogbm9uZTsKKyAgICBhcHBlYXJhbmNlOiBub25lOworfQorCisjdG9kby1saXN0IGxpIC50
b2dnbGU6YWZ0ZXIgeworICAgIGNvbnRlbnQ6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0Zjgs
PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0
PSI0MCIgdmlld0JveD0iLTEwIC0xOCAxMDAgMTM1Ij48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiBy
PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWRlZGVkIiBzdHJva2Utd2lkdGg9IjMiLz48L3N2
Zz4nKTsKK30KKworI3RvZG8tbGlzdCBsaSAudG9nZ2xlOmNoZWNrZWQ6YWZ0ZXIgeworICAgIGNv
bnRlbnQ6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0iaHR0cDovL3d3
dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iLTEwIC0x
OCAxMDAgMTM1Ij48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0ibm9uZSIgc3Ry
b2tlPSIjYmRkYWQ1IiBzdHJva2Utd2lkdGg9IjMiLz48cGF0aCBmaWxsPSIjNWRjMmFmIiBkPSJN
NzIgMjVMNDIgNzEgMjcgNTZsLTQgNCAyMCAyMCAzNC01MnoiLz48L3N2Zz4nKTsKK30KKworI3Rv
ZG8tbGlzdCBsaSBsYWJlbCB7CisgICAgd2hpdGUtc3BhY2U6IHByZTsKKyAgICB3b3JkLWJyZWFr
OiBicmVhay13b3JkOworICAgIHBhZGRpbmc6IDE1cHggNjBweCAxNXB4IDE1cHg7CisgICAgbWFy
Z2luLWxlZnQ6IDQ1cHg7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbGluZS1oZWlnaHQ6IDEu
MjsKKyAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjRzOworfQorCisjdG9kby1saXN0IGxpLmNvbXBs
ZXRlZCBsYWJlbCB7CisgICAgY29sb3I6ICNkOWQ5ZDk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBs
aW5lLXRocm91Z2g7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3kgeworICAgIGRpc3BsYXk6
IG5vbmU7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICByaWdodDog
MTBweDsKKyAgICBib3R0b206IDA7CisgICAgd2lkdGg6IDQwcHg7CisgICAgaGVpZ2h0OiA0MHB4
OworICAgIG1hcmdpbjogYXV0byAwOworICAgIGZvbnQtc2l6ZTogMzBweDsKKyAgICBjb2xvcjog
I2NjOWE5YTsKKyAgICBtYXJnaW4tYm90dG9tOiAxMXB4OworICAgIHRyYW5zaXRpb246IGNvbG9y
IDAuMnMgZWFzZS1vdXQ7Cit9CisKKyN0b2RvLWxpc3QgbGkgLmRlc3Ryb3k6aG92ZXIgeworICAg
IGNvbG9yOiAjYWY1YjVlOworfQorCisjdG9kby1saXN0IGxpIC5kZXN0cm95OmFmdGVyIHsKKyAg
ICBjb250ZW50OiAnw5cnOworfQorCisjdG9kby1saXN0IGxpOmhvdmVyIC5kZXN0cm95IHsKKyAg
ICBkaXNwbGF5OiBibG9jazsKK30KKworI3RvZG8tbGlzdCBsaSAuZWRpdCB7CisgICAgZGlzcGxh
eTogbm9uZTsKK30KKworI3RvZG8tbGlzdCBsaS5lZGl0aW5nOmxhc3QtY2hpbGQgeworICAgIG1h
cmdpbi1ib3R0b206IC0xcHg7Cit9CisKKyNmb290ZXIgeworICAgIGNvbG9yOiAjNzc3OworICAg
IHBhZGRpbmc6IDEwcHggMTVweDsKKyAgICBoZWlnaHQ6IDIwcHg7CisgICAgdGV4dC1hbGlnbjog
Y2VudGVyOworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTZlNmU2OworfQorCisjZm9vdGVy
OmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAg
IHJpZ2h0OiAwOworICAgIGJvdHRvbTogMDsKKyAgICBsZWZ0OiAwOworICAgIGhlaWdodDogNTBw
eDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2Jh
KDAsIDAsIDAsIDAuMiksCisgICAgICAgICAgICAgICAgMCA4cHggMCAtM3B4ICNmNmY2ZjYsCisg
ICAgICAgICAgICAgICAgMCA5cHggMXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLAorICAgICAg
ICAgICAgICAgIDAgMTZweCAwIC02cHggI2Y2ZjZmNiwKKyAgICAgICAgICAgICAgICAwIDE3cHgg
MnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpOworfQorCisjdG9kby1jb3VudCB7CisgICAgZmxv
YXQ6IGxlZnQ7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworI3RvZG8tY291bnQgc3Ryb25n
IHsKKyAgICBmb250LXdlaWdodDogMzAwOworfQorCisjZmlsdGVycyB7CisgICAgbWFyZ2luOiAw
OworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwb3NpdGlvbjog
YWJzb2x1dGU7CisgICAgcmlnaHQ6IDA7CisgICAgbGVmdDogMDsKK30KKworI2ZpbHRlcnMgbGkg
eworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2ZpbHRlcnMgbGkgYSB7CisgICAgY29sb3I6
IGluaGVyaXQ7CisgICAgbWFyZ2luOiAzcHg7CisgICAgcGFkZGluZzogM3B4IDdweDsKKyAgICB0
ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7
CisgICAgYm9yZGVyLXJhZGl1czogM3B4OworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkLAor
I2ZpbHRlcnMgbGkgYTpob3ZlciB7CisgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE3NSwgNDcsIDQ3
LCAwLjEpOworfQorCisjZmlsdGVycyBsaSBhLnNlbGVjdGVkIHsKKyAgICBib3JkZXItY29sb3I6
IHJnYmEoMTc1LCA0NywgNDcsIDAuMik7Cit9CisKKyNjbGVhci1jb21wbGV0ZWQsCitodG1sICNj
bGVhci1jb21wbGV0ZWQ6YWN0aXZlIHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgcG9zaXRpb246
IHJlbGF0aXZlOworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgIHRleHQtZGVjb3JhdGlvbjog
bm9uZTsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQor
CisjY2xlYXItY29tcGxldGVkOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGlu
ZTsKK30KKworI2luZm8geworICAgIG1hcmdpbjogNjVweCBhdXRvIDA7CisgICAgY29sb3I6ICNi
ZmJmYmY7CisgICAgZm9udC1zaXplOiAxMHB4OworICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJn
YmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKyNp
bmZvIHAgeworICAgIGxpbmUtaGVpZ2h0OiAxOworfQorCisjaW5mbyBhIHsKKyAgICBjb2xvcjog
aW5oZXJpdDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZm9udC13ZWlnaHQ6IDQw
MDsKK30KKworI2luZm8gYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7
Cit9CisKKy8qCisgICAgSGFjayB0byByZW1vdmUgYmFja2dyb3VuZCBmcm9tIE1vYmlsZSBTYWZh
cmkuCisgICAgQ2FuJ3QgdXNlIGl0IGdsb2JhbGx5IHNpbmNlIGl0IGRlc3Ryb3lzIGNoZWNrYm94
ZXMgaW4gRmlyZWZveAorKi8KK0BtZWRpYSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2Ut
cGl4ZWwtcmF0aW86MCkgeworICAgICN0b2dnbGUtYWxsLAorICAgICN0b2RvLWxpc3QgbGkgLnRv
Z2dsZSB7CisgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgfQorCisgICAgI3RvZG8tbGlz
dCBsaSAudG9nZ2xlIHsKKyAgICAgICAgaGVpZ2h0OiA0MHB4OworICAgIH0KKworICAgICN0b2dn
bGUtYWxsIHsKKyAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CisgICAg
ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKKyAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNl
OiBub25lOworICAgICAgICBhcHBlYXJhbmNlOiBub25lOworICAgIH0KK30KKworQG1lZGlhICht
YXgtd2lkdGg6IDQzMHB4KSB7CisgICAgI2Zvb3RlciB7CisgICAgICAgIGhlaWdodDogNTBweDsK
KyAgICB9CisKKyAgICAjZmlsdGVycyB7CisgICAgICAgIGJvdHRvbTogMTBweDsKKyAgICB9Cit9
CmRpZmYgLS1naXQgYS9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNlcy90b2Rv
bXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Rlc3QuaHRtbCBiL1BlcmZvcm1hbmNl
VGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVz
L2VtYmVyanMvdGVzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMxYWRk
MmU5MzY2OWU4YWJlNWQ0OWRjYzMwNzQ3ZDg3OGE2MmY1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdC5odG1sCisr
KyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbD4KLTxo
ZWFkPgotPHRpdGxlPk5hY3UgRE9NIEJlbmNoIC0gTm90IEFub3RoZXIgQ29tcGxldGVseSBVbnJl
YWxpc3RpYyBET00gQmVuY2htYXJrPC90aXRsZT4KLTxzY3JpcHQgc3JjPSIuLi8uLi9iZW5jaG1h
cmsuanMiPjwvc2NyaXB0PgotPHNjcmlwdD4KLQotQmVuY2htYXJrUnVubmVyLnN1aXRlKHsKLSAg
ICB0aXRsZTogJ1NpbXBsZUVtYmVySlMnLAotICAgIHVybDogJ2luZGV4Lmh0bWwnLAotICAgIHBy
ZXBhcmU6IGZ1bmN0aW9uIChjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKLSAgICAg
ICAgY29udGVudFdpbmRvdy5Ub2Rvcy5TdG9yZSA9IGNvbnRlbnRXaW5kb3cuRFMuU3RvcmUuZXh0
ZW5kKHsKLSAgICAgICAgICAgIHJldmlzaW9uOiAxMiwKLSAgICAgICAgICAgIGFkYXB0ZXI6ICdU
b2Rvcy5MU0FkYXB0ZXInLAotICAgICAgICAgICAgY29tbWl0OiBmdW5jdGlvbiAoKSB7IH0KLSAg
ICAgICAgfSk7Ci0KLSAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgU2ltcGxlUHJvbWlzZTsKLQot
ICAgICAgICBmdW5jdGlvbiByZXNvbHZlSWZSZWFkeSgpIHsKLSAgICAgICAgICAgIGlmIChjb250
ZW50RG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25ldy10b2RvJykpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHByb21pc2UucmVzb2x2ZSgpOwotICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZl
SWZSZWFkeSwgMTApOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdmVJZlJlYWR5KCk7Ci0KLSAg
ICAgICAgcmV0dXJuIHByb21pc2U7Ci0gICAgfSwKLSAgICB0ZXN0U3RlcHM6IGZ1bmN0aW9uIChj
b250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpIHsKLSAgICAgICAgY29udGVudERvY3VtZW50
LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdG9kbycpLmZvY3VzKCk7Ci0gICAgICAgIHZhciB2aWV3cyA9
IGNvbnRlbnRXaW5kb3cuRW1iZXIuVmlldy52aWV3czsKLSAgICAgICAgdmFyIGVtYmVyUnVuID0g
Y29udGVudFdpbmRvdy5FbWJlci5ydW47Ci0gICAgICAgIHZhciBudW1iZXJPZkl0ZW1zVG9BZGQg
PSAxMDA7Ci0gICAgICAgIHJldHVybiBbCi0gICAgICAgICAgICBbJ0FkZGluZycgKyBudW1iZXJP
Zkl0ZW1zVG9BZGQgKyAnSXRlbXMnLCBmdW5jdGlvbiAoKSB7Ci0gICAgICAgICAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkl0ZW1zVG9BZGQ7IGkrKykgewotICAgICAgICAgICAg
ICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLnNldCgndmFs
dWUnLCAnU29tZXRoaW5nIHRvIGRvJyk7IH0pOwotICAgICAgICAgICAgICAgICAgICBlbWJlclJ1
bihmdW5jdGlvbiAoKSB7IHZpZXdzWyJuZXctdG9kbyJdLmluc2VydE5ld2xpbmUoZG9jdW1lbnQu
Y3JlYXRlRXZlbnQoJ0V2ZW50JykpOyB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9XSwKLSAgICAgICAgICAgIFsnQ29tcGxldGluZ0FsbEl0ZW1zJywgZnVuY3Rpb24gKCkgewot
ICAgICAgICAgICAgICAgIHZhciBjaGVja2JveGVzID0gY29udGVudERvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3JBbGwoJy5lbWJlci1jaGVja2JveCcpOwotICAgICAgICAgICAgICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgY2hlY2tib3hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB2
YXIgdmlldyA9IHZpZXdzW2NoZWNrYm94ZXNbaV0uaWRdOwotICAgICAgICAgICAgICAgICAgICBl
bWJlclJ1bihmdW5jdGlvbiAoKSB7IHZpZXcuc2V0KCdjaGVja2VkJywgdHJ1ZSk7IH0pOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1dLAotICAgICAgICAgICAgWydEZWxldGluZ0l0
ZW1zJywgZnVuY3Rpb24gKCkgewotICAgICAgICAgICAgICAgIHZhciBkZWxldGVCdXR0b25zID0g
Y29udGVudERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXN0cm95Jyk7Ci0gICAgICAgICAg
ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGVCdXR0b25zLmxlbmd0aDsgaSsrKQotICAg
ICAgICAgICAgICAgICAgICBlbWJlclJ1bihmdW5jdGlvbiAoKSB7IGRlbGV0ZUJ1dHRvbnNbaV0u
Y2xpY2soKTsgfSk7Ci0gICAgICAgICAgICB9XSwKLSAgICAgICAgXTsKLSAgICB9Ci19KTsKLQot
PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBh
L1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3VyY2VzL3RvZG9tdmMvYXJjaGl0ZWN0
dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdGVtLmpzIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0
ZW0uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMWZlMDg0YzY4Mzg4Y2NmYzJhYTczNDQ1ZDFkNGM1N2MzNmNlYzZm
OQotLS0gL2Rldi9udWxsCisrKyBiL1BlcmZvcm1hbmNlVGVzdHMvU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL3RvZG9tdmMvYXJjaGl0ZWN0dXJlLWV4YW1wbGVzL2VtYmVyanMvdGVzdGVtLmpzCkBAIC0w
LDAgKzEsMTkgQEAKKy8qKgorICogVGhpcyBpcyBkdW1teSBmaWxlIHRoYXQgZXhpc3RzIGZvciB0
aGUgc29sZSBwdXJwb3NlCisgKiBvZiBhbGxvd2luZyB0ZXN0cyB0byBydW4gZGlyZWN0bHkgaW4g
dGhlIGJyb3dzZXIgYXMKKyAqIHdlbGwgYXMgYnkgVGVzdGVtLgorICoKKyAqIFRlc3RlbSBpcyBj
b25maWd1cmVkIHRvIHJ1biB0ZXN0cyBkaXJlY3RseSBhZ2FpbnN0CisgKiB0aGUgdGVzdCBidWls
ZCBvZiBpbmRleC5odG1sLCB3aGljaCByZXF1aXJlcyBhCisgKiBzbmlwcGV0IHRvIGxvYWQgdGhl
IHRlc3RlbS5qcyBmaWxlOgorICogICA8c2NyaXB0IHNyYz0iL3Rlc3RlbS5qcyI+PC9zY3JpcHQ+
CisgKiBUaGlzIGhhcyB0byBnbyBiZWZvcmUgdGhlIHF1bml0IGZyYW1ld29yayBhbmQgYXBwCisg
KiB0ZXN0cyBhcmUgbG9hZGVkLgorICoKKyAqIFRlc3RlbSBpbnRlcm5hbGx5IHN1cHBsaWVzIHRo
aXMgZmlsZS4gSG93ZXZlciwgaWYgeW91CisgKiBydW4gdGhlIHRlc3RzIGRpcmVjdGx5IGluIHRo
ZSBicm93c2VyIChsb2NhbGhvc3Q6ODAwMC90ZXN0cyksCisgKiB0aGlzIGZpbGUgZG9lcyBub3Qg
ZXhpc3QuCisgKgorICogSGVuY2UgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmYWtlIGZpbGUuIFRoaXMg
ZmlsZSBpcyBzZXJ2ZWQKKyAqIGRpcmVjdGx5IGZyb20gdGhlIGV4cHJlc3Mgc2VydmVyIHRvIHNh
dGlzaWZ5IHRoZSBzY3JpcHQgbG9hZC4KKyAqLwpkaWZmIC0tZ2l0IGEvUGVyZm9ybWFuY2VUZXN0
cy9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1i
ZXJqcy90ZXN0cy9pbmRleC5odG1sIGIvUGVyZm9ybWFuY2VUZXN0cy9TcGVlZG9tZXRlci9yZXNv
dXJjZXMvdG9kb212Yy9hcmNoaXRlY3R1cmUtZXhhbXBsZXMvZW1iZXJqcy90ZXN0cy9pbmRleC5o
dG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmUyYTI3YzE0OWI2ZGUwN2M2OTMzMTA5ODQyNWZkZDhkNWQ3YTJhMGUK
LS0tIC9kZXYvbnVsbAorKysgYi9QZXJmb3JtYW5jZVRlc3RzL1NwZWVkb21ldGVyL3Jlc291cmNl
cy90b2RvbXZjL2FyY2hpdGVjdHVyZS1leGFtcGxlcy9lbWJlcmpzL3Rlc3RzL2luZGV4Lmh0bWwK
QEAgLTAsMCArMSw0MSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAg
PG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0
aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPHRpdGxlPlRvZG9tdmMgVGVzdHM8L3RpdGxl
PgorICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgorICAgIDxtZXRhIG5h
bWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9
MSI+CisKKyAgICA8YmFzZSBocmVmPSIvIiAvPgorPG1ldGEgbmFtZT0idG9kb212Yy9jb25maWcv
ZW52aXJvbm1lbnQiIGNvbnRlbnQ9IiU3QiUyMm1vZHVsZVByZWZpeCUyMiUzQSUyMnRvZG9tdmMl
MjIlMkMlMjJlbnZpcm9ubWVudCUyMiUzQSUyMnRlc3QlMjIlMkMlMjJiYXNlVVJMJTIyJTNBJTIy
LyUyMiUyQyUyMmxvY2F0aW9uVHlwZSUyMiUzQSUyMm5vbmUlMjIlMkMlMjJFbWJlckVOViUyMiUz
QSU3QiUyMkZFQVRVUkVTJTIyJTNBJTdCJTdEJTdEJTJDJTIyQVBQJTIyJTNBJTdCJTIyTE9HX0FD
VElWRV9HRU5FUkFUSU9OJTIyJTNBZmFsc2UlMkMlMjJMT0dfVklFV19MT09LVVBTJTIyJTNBZmFs
c2UlMkMlMjJyb290RWxlbWVudCUyMiUzQSUyMiUyM2VtYmVyLXRlc3RpbmclMjIlMkMlMjJuYW1l
JTIyJTNBJTIydG9kb212YyUyMiUyQyUyMnZlcnNpb24lMjIlM0ElMjIwLjAuMCs1ZGJjNWZiOSUy
MiU3RCUyQyUyMmV4cG9ydEFwcGxpY2F0aW9uR2xvYmFsJTIyJTNBdHJ1ZSU3RCIgLz4KKyAgICAK
KworICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXNzZXRzL3ZlbmRvci5jc3MiPgor
ICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXNzZXRzL3RvZG9tdmMuY3NzIj4KKyAg
ICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImFzc2V0cy90ZXN0LXN1cHBvcnQuY3NzIj4K
KworICAgIAorICAgIAorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIAorICAgIDxkaXYgaWQ9InF1
bml0Ij48L2Rpdj4KKzxkaXYgaWQ9InF1bml0LWZpeHR1cmUiPjwvZGl2PgorCis8ZGl2IGlkPSJl
bWJlci10ZXN0aW5nLWNvbnRhaW5lciI+CisgIDxkaXYgaWQ9ImVtYmVyLXRlc3RpbmciPjwvZGl2
PgorPC9kaXY+CisKKworICAgIDxzY3JpcHQgc3JjPSJ0ZXN0ZW0uanMiIGludGVncml0eT0iIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iYXNzZXRzL3ZlbmRvci5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9ImFzc2V0cy90ZXN0LXN1cHBvcnQuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgc3JjPSJhc3NldHMvdG9kb212Yy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
ImFzc2V0cy90ZXN0cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImFzc2V0cy90ZXN0
LWxvYWRlci5qcyI+PC9zY3JpcHQ+CisKKyAgICAKKyAgICA8c2NyaXB0PkVtYmVyLmFzc2VydCgn
VGhlIHRlc3RzIGZpbGUgd2FzIG5vdCBsb2FkZWQuIE1ha2Ugc3VyZSB5b3VyIHRlc3RzIGluZGV4
Lmh0bWwgaW5jbHVkZXMgImFzc2V0cy90ZXN0cy5qcyIuJywgRW1iZXJFTlYuVEVTVFNfRklMRV9M
T0FERUQpOzwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>